ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDlkYWNkZTAuLjU3YWYwN2MgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtNDYsNiArNDYsMTEgQEAKIC9Nb2R1bGUuc3ltdmVycwogCiAjCisjIERlYmlhbiBkaXJlY3RvcnkgKG1ha2UgZGViLXBrZykKKyMKKy9kZWJpYW4vCisKKyMKICMgZ2l0IGZpbGVzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBpZ25vcmUgZXZlbiBpdCB0aGV5IGFyZSBkb3QtZmlsZXMKICMKICEuZ2l0aWdub3JlCmRpZmYgLS1naXQgYS8ubWFpbG1hcCBiLy5tYWlsbWFwCmluZGV4IDM1M2FkNTYuLmE0ODA2ZjAgMTAwNjQ0Ci0tLSBhLy5tYWlsbWFwCisrKyBiLy5tYWlsbWFwCkBAIC03Myw4ICs3Myw3IEBACiBNYXJrIEJyb3duIDxicm9vbmllQHNpcmVuYS5vcmcudWs+CiBNYXR0aGlldSBDQVNURVQgPGNhc3RldC5tYXR0aGlldUBmcmVlLmZyPgogTWF5dXJlc2ggSmFub3JrYXIgPG1heXVyQHRpLmNvbT4KLU1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+Ci1NaWNoYWVsIEJ1ZXNjaCA8bWJ1ZXNjaEBmcmVlbmV0LmRlPgorTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KIE1pY2hlbCBEw6RuemVyIDxtaWNoZWxAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CiBNaXRlc2ggc2hhaCA8bXNoYWhAdGVqYS5jb20+CiBNb3J0ZW4gV2VsaW5kZXIgPHRlcnJhQGdub21lLm9yZz4KZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IGE3ZWE4ZTMuLjFkZWIzMzEgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtNTE4LDYgKzUxOCwxNCBAQAogRTogemFiQHphYmJvLm5ldAogRDogbWFlc3RybyBwY2kgc291bmQKIAorTjogRGF2aWQgQnJvd25lbGwKK0Q6IEtlcm5lbCBlbmdpbmVlciwgbWVudG9yLCBhbmQgZnJpZW5kLiAgTWFpbnRhaW5lZCBVU0IgRUhDSSBhbmQKK0Q6IGdhZGdldCBsYXllcnMsIFNQSSBzdWJzeXN0ZW0sIEdQSU8gc3Vic3lzdGVtLCBhbmQgbW9yZSB0aGFuIGEgZmV3CitEOiBkZXZpY2UgZHJpdmVycy4gIEhpcyBlbmNvdXJhZ2VtZW50IGFsc28gaGVscGVkIG1hbnkgZW5naW5lZXJzIGdldAorRDogc3RhcnRlZCB3b3JraW5nIG9uIHRoZSBMaW51eCBrZXJuZWwuICBEYXZpZCBwYXNzZWQgYXdheSBpbiBlYXJseQorRDogMjAxMSwgYW5kIHdpbGwgYmUgZ3JlYXRseSBtaXNzZWQuCitXOiBodHRwczovL2xrbWwub3JnL2xrbWwvMjAxMS80LzUvMzYKKwogTjogR2FyeSBCcnViYWtlcgogRTogeGF2eWVyQGl4Lm5ldGNvbS5jb20KIEQ6IFVTQiBTZXJpYWwgRW1wZWcgRW1wZWctY2FyIE1hcmsgSS9JSSBEcml2ZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL29ic29sZXRlL3Byb2MtcGlkLW9vbV9hZGogYi9Eb2N1bWVudGF0aW9uL0FCSS9vYnNvbGV0ZS9wcm9jLXBpZC1vb21fYWRqCmluZGV4IGNmNjNmMjYuLjlhM2NiODggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL29ic29sZXRlL3Byb2MtcGlkLW9vbV9hZGoKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvb2Jzb2xldGUvcHJvYy1waWQtb29tX2FkagpAQCAtMTQsNyArMTQsNyBAQAogCiAJQSBtdWNoIG1vcmUgcG93ZXJmdWwgaW50ZXJmYWNlLCAvcHJvYy88cGlkPi9vb21fc2NvcmVfYWRqLCB3YXMKIAlpbnRyb2R1Y2VkIHdpdGggdGhlIG9vbSBraWxsZXIgcmV3cml0ZSB0aGF0IGFsbG93cyB1c2VycyB0byBpbmNyZWFzZSBvcgotCWRlY3JlYXNlIHRoZSBiYWRuZXNzKCkgc2NvcmUgbGluZWFybHkuICBUaGlzIGludGVyZmFjZSB3aWxsIHJlcGxhY2UKKwlkZWNyZWFzZSB0aGUgYmFkbmVzcyBzY29yZSBsaW5lYXJseS4gIFRoaXMgaW50ZXJmYWNlIHdpbGwgcmVwbGFjZQogCS9wcm9jLzxwaWQ+L29vbV9hZGouCiAKIAlBIHdhcm5pbmcgd2lsbCBiZSBlbWl0dGVkIHRvIHRoZSBrZXJuZWwgbG9nIGlmIGFuIGFwcGxpY2F0aW9uIHVzZXMgdGhpcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL2ZpcmV3aXJlLWNkZXYgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvZmlyZXdpcmUtY2RldgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmQwMzA4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL2ZpcmV3aXJlLWNkZXYKQEAgLTAsMCArMSwxMDMgQEAKK1doYXQ6CQkvZGV2L2Z3WzAtOV0rCitEYXRlOgkJTWF5IDIwMDcKK0tlcm5lbFZlcnNpb246CTIuNi4yMgorQ29udGFjdDoJbGludXgxMzk0LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorRGVzY3JpcHRpb246CisJCVRoZSBjaGFyYWN0ZXIgZGV2aWNlIGZpbGVzIC9kZXYvZncqIGFyZSB0aGUgaW50ZXJmYWNlIGJldHdlZW4KKwkJZmlyZXdpcmUtY29yZSBhbmQgSUVFRSAxMzk0IGRldmljZSBkcml2ZXJzIGltcGxlbWVudGVkIGluCisJCXVzZXJzcGFjZS4gIFRoZSBpb2N0bCgyKS0gYW5kIHJlYWQoMiktYmFzZWQgQUJJIGlzIGRlZmluZWQgYW5kCisJCWRvY3VtZW50ZWQgaW4gPGxpbnV4L2ZpcmV3aXJlLWNkZXYuaD4uCisKKwkJVGhpcyBBQkkgb2ZmZXJzIG1vc3Qgb2YgdGhlIGZlYXR1cmVzIHdoaWNoIGZpcmV3aXJlLWNvcmUgYWxzbworCQlleHBvc2VzIHRvIGtlcm5lbHNwYWNlIElFRUUgMTM5NCBkcml2ZXJzLgorCisJCUVhY2ggL2Rldi9mdyogaXMgYXNzb2NpYXRlZCB3aXRoIG9uZSBJRUVFIDEzOTQgbm9kZSwgd2hpY2ggY2FuCisJCWJlIHJlbW90ZSBvciBsb2NhbCBub2Rlcy4gIE9wZXJhdGlvbnMgb24gYSAvZGV2L2Z3KiBmaWxlIGhhdmUKKwkJZGlmZmVyZW50IHNjb3BlOgorCQkgIC0gVGhlIDEzOTQgbm9kZSB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGU6CisJCQkgIC0gQXN5bmNocm9ub3VzIHJlcXVlc3QgdHJhbnNtaXNzaW9uCisJCQkgIC0gR2V0IHRoZSBDb25maWd1cmF0aW9uIFJPTQorCQkJICAtIFF1ZXJ5IG5vZGUgSUQKKwkJCSAgLSBRdWVyeSBtYXhpbXVtIHNwZWVkIG9mIHRoZSBwYXRoIGJldHdlZW4gdGhpcyBub2RlCisJCQkgICAgYW5kIGxvY2FsIG5vZGUKKwkJICAtIFRoZSAxMzk0IGJ1cyAoaS5lLiAiY2FyZCIpIHRvIHdoaWNoIHRoZSBub2RlIGlzIGF0dGFjaGVkIHRvOgorCQkJICAtIElzb2Nocm9ub3VzIHN0cmVhbSB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbgorCQkJICAtIEFzeW5jaHJvbm91cyBzdHJlYW0gdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24KKwkJCSAgLSBBc3luY2hyb25vdXMgYnJvYWRjYXN0IHJlcXVlc3QgdHJhbnNtaXNzaW9uCisJCQkgIC0gUEhZIHBhY2tldCB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbgorCQkJICAtIEFsbG9jYXRlLCByZWFsbG9jYXRlLCBkZWFsbG9jYXRlIGlzb2Nocm9ub3VzCisJCQkgICAgcmVzb3VyY2VzIChjaGFubmVscywgYmFuZHdpZHRoKSBhdCB0aGUgYnVzJ3MgSVJNCisJCQkgIC0gUXVlcnkgbm9kZSBJRHMgb2YgbG9jYWwgbm9kZSwgcm9vdCBub2RlLCBJUk0sIGJ1cworCQkJICAgIG1hbmFnZXIKKwkJCSAgLSBRdWVyeSBjeWNsZSB0aW1lCisJCQkgIC0gQnVzIHJlc2V0IGluaXRpYXRpb24sIGJ1cyByZXNldCBldmVudCByZWNlcHRpb24KKwkJICAtIEFsbCAxMzk0IGJ1c2VzOgorCQkJICAtIEFsbG9jYXRpb24gb2YgSUVFRSAxMjEyIGFkZHJlc3MgcmFuZ2VzIG9uIHRoZSBsb2NhbAorCQkJICAgIGxpbmsgbGF5ZXJzLCByZWNlcHRpb24gb2YgaW5ib3VuZCByZXF1ZXN0cyB0byBzdWNoCisJCQkgICAgYW4gYWRkcmVzcyByYW5nZSwgYXN5bmNocm9ub3VzIHJlc3BvbnNlIHRyYW5zbWlzc2lvbgorCQkJICAgIHRvIGluYm91bmQgcmVxdWVzdHMKKwkJCSAgLSBBZGRpdGlvbiBvZiBkZXNjcmlwdG9ycyBvciBkaXJlY3RvcmllcyB0byB0aGUgbG9jYWwKKwkJCSAgICBub2RlcycgQ29uZmlndXJhdGlvbiBST00KKworCQlEdWUgdG8gdGhlIGRpZmZlcmVudCBzY29wZSBvZiBvcGVyYXRpb25zIGFuZCBpbiBvcmRlciB0byBsZXQKKwkJdXNlcmxhbmQgaW1wbGVtZW50IGRpZmZlcmVudCBhY2Nlc3MgcGVybWlzc2lvbiBtb2RlbHMsIHNvbWUKKwkJb3BlcmF0aW9ucyBhcmUgcmVzdHJpY3RlZCB0byAvZGV2L2Z3KiBmaWxlcyB0aGF0IGFyZSBhc3NvY2lhdGVkCisJCXdpdGggYSBsb2NhbCBub2RlOgorCQkJICAtIEFkZGl0aW9uIG9mIGRlc2NyaXB0b3JzIG9yIGRpcmVjdG9yaWVzIHRvIHRoZSBsb2NhbAorCQkJICAgIG5vZGVzJyBDb25maWd1cmF0aW9uIFJPTQorCQkJICAtIFBIWSBwYWNrZXQgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24KKworCQlBIC9kZXYvZncqIGZpbGUgcmVtYWlucyBhc3NvY2lhdGVkIHdpdGggb25lIHBhcnRpY3VsYXIgbm9kZQorCQlkdXJpbmcgaXRzIGVudGlyZSBsaWZlIHRpbWUuICBCdXMgdG9wb2xvZ3kgY2hhbmdlcywgYW5kIGhlbmNlCisJCW5vZGUgSUQgY2hhbmdlcywgYXJlIHRyYWNrZWQgYnkgZmlyZXdpcmUtY29yZS4gIEFCSSB1c2VycyBkbyBub3QKKwkJbmVlZCB0byBiZSBhd2FyZSBvZiB0b3BvbG9neS4KKworCQlUaGUgZm9sbG93aW5nIGZpbGUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkOgorCisJCW9wZW4oMikKKwkJQ3VycmVudGx5IHRoZSBvbmx5IHVzZWZ1bCBmbGFncyBhcmUgT19SRFdSLgorCisJCWlvY3RsKDIpCisJCUluaXRpYXRlIHZhcmlvdXMgYWN0aW9ucy4gIFNvbWUgdGFrZSBpbW1lZGlhdGUgZWZmZWN0LCBvdGhlcnMKKwkJYXJlIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseSB3aGlsZSBvciBhZnRlciB0aGUgaW9jdGwgcmV0dXJucy4KKwkJU2VlIHRoZSBpbmxpbmUgZG9jdW1lbnRhdGlvbiBpbiA8bGludXgvZmlyZXdpcmUtY2Rldi5oPiBmb3IKKwkJZGVzY3JpcHRpb25zIG9mIGFsbCBpb2N0bHMuCisKKwkJcG9sbCgyKSwgc2VsZWN0KDIpLCBlcG9sbF93YWl0KDIpIGV0Yy4KKwkJV2F0Y2ggZm9yIGV2ZW50cyB0byBiZWNvbWUgYXZhaWxhYmxlIHRvIGJlIHJlYWQuCisKKwkJcmVhZCgyKQorCQlSZWNlaXZlIHZhcmlvdXMgZXZlbnRzLiAgVGhlcmUgYXJlIHNvbGljaXRlZCBldmVudHMgbGlrZQorCQlvdXRib3VuZCBhc3luY2hyb25vdXMgdHJhbnNhY3Rpb24gY29tcGxldGlvbiBvciBpc29jaHJvbm91cworCQlidWZmZXIgY29tcGxldGlvbiwgYW5kIHVuc29saWNpdGVkIGV2ZW50cyBzdWNoIGFzIGJ1cyByZXNldHMsCisJCXJlcXVlc3QgcmVjZXB0aW9uLCBvciBQSFkgcGFja2V0IHJlY2VwdGlvbi4gIEFsd2F5cyB1c2UgYSByZWFkCisJCWJ1ZmZlciB3aGljaCBpcyBsYXJnZSBlbm91Z2ggdG8gcmVjZWl2ZSB0aGUgbGFyZ2VzdCBldmVudCB0aGF0CisJCWNvdWxkIGV2ZXIgYXJyaXZlLiAgU2VlIDxsaW51eC9maXJld2lyZS1jZGV2Lmg+IGZvciBkZXNjcmlwdGlvbnMKKwkJb2YgYWxsIGV2ZW50IHR5cGVzIGFuZCBmb3Igd2hpY2ggaW9jdGxzIGFmZmVjdCByZWNlcHRpb24gb2YKKwkJZXZlbnRzLgorCisJCW1tYXAoMikKKwkJQWxsb2NhdGUgYSBETUEgYnVmZmVyIGZvciBpc29jaHJvbm91cyByZWNlcHRpb24gb3IgdHJhbnNtaXNzaW9uCisJCWFuZCBtYXAgaXQgaW50byB0aGUgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLiAgVGhlIGFyZ3VtZW50cyBzaG91bGQKKwkJYmUgdXNlZCBhcyBmb2xsb3dzOiAgYWRkciA9IE5VTEwsIGxlbmd0aCA9IHRoZSBkZXNpcmVkIGJ1ZmZlcgorCQlzaXplLCBpLmUuIG51bWJlciBvZiBwYWNrZXRzIHRpbWVzIHNpemUgb2YgbGFyZ2VzdCBwYWNrZXQsCisJCXByb3QgPSBhdCBsZWFzdCBQUk9UX1JFQUQgZm9yIHJlY2VwdGlvbiBhbmQgYXQgbGVhc3QgUFJPVF9XUklURQorCQlmb3IgdHJhbnNtaXNzaW9uLCBmbGFncyA9IE1BUF9TSEFSRUQsIGZkID0gdGhlIGhhbmRsZSB0byB0aGUKKwkJL2Rldi9mdyosIG9mZnNldCA9IDAuCisKKwkJSXNvY2hyb25vdXMgcmVjZXB0aW9uIHdvcmtzIGluIHBhY2tldC1wZXItYnVmZmVyIGZhc2hpb24gZXhjZXB0CisJCWZvciBtdWx0aWNoYW5uZWwgcmVjZXB0aW9uIHdoaWNoIHdvcmtzIGluIGJ1ZmZlci1maWxsIG1vZGUuCisKKwkJbXVubWFwKDIpCisJCVVubWFwIHRoZSBpc29jaHJvbm91cyBJL08gYnVmZmVyIGZyb20gdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4KKworCQljbG9zZSgyKQorCQlCZXNpZGVzIHN0b3BwaW5nIGFuZCBmcmVlaW5nIEkvTyBjb250ZXh0cyB0aGF0IHdlcmUgYXNzb2NpYXRlZAorCQl3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IsIGJhY2sgb3V0IGFueSBjaGFuZ2VzIHRvIHRoZSBsb2NhbAorCQlub2RlcycgQ29uZmlndXJhdGlvbiBST00uICBEZWFsbG9jYXRlIGlzb2Nocm9ub3VzIGNoYW5uZWxzIGFuZAorCQliYW5kd2lkdGggYXQgdGhlIElSTSB0aGF0IHdlcmUgbWFya2VkIGZvciBrZXJuZWwtYXNzaXN0ZWQKKwkJcmUtIGFuZCBkZWFsbG9jYXRpb24uCisKK1VzZXJzOgkJbGlicmF3MTM5NAorCQlsaWJkYzEzOTQKKwkJdG9vbHMgbGlrZSBqdWp1dXRpbHMsIGZ3aGFjaywgLi4uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtYnVzLWZpcmV3aXJlIGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWJ1cy1maXJld2lyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQ4NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWJ1cy1maXJld2lyZQpAQCAtMCwwICsxLDEyMiBAQAorV2hhdDoJCS9zeXMvYnVzL2ZpcmV3aXJlL2RldmljZXMvZndbMC05XSsvCitEYXRlOgkJTWF5IDIwMDcKK0tlcm5lbFZlcnNpb246CTIuNi4yMgorQ29udGFjdDoJbGludXgxMzk0LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorRGVzY3JpcHRpb246CisJCUlFRUUgMTM5NCBub2RlIGRldmljZSBhdHRyaWJ1dGVzLgorCQlSZWFkLW9ubHkuICBNdXRhYmxlIGR1cmluZyB0aGUgbm9kZSBkZXZpY2UncyBsaWZldGltZS4KKwkJU2VlIElFRUUgMTIxMiBmb3Igc2VtYW50aWMgZGVmaW5pdGlvbnMuCisKKwkJY29uZmlnX3JvbQorCQkJQ29udGVudHMgb2YgdGhlIENvbmZpZ3VyYXRpb24gUk9NIHJlZ2lzdGVyLgorCQkJQmluYXJ5IGF0dHJpYnV0ZTsgYW4gYXJyYXkgb2YgaG9zdC1lbmRpYW4gdTMyLgorCisJCWd1aWQKKwkJCVRoZSBub2RlJ3MgRVVJLTY0IGluIHRoZSBidXMgaW5mb3JtYXRpb24gYmxvY2sgb2YKKwkJCUNvbmZpZ3VyYXRpb24gUk9NLgorCQkJSGV4YWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIHU2NC4KKworCitXaGF0OgkJL3N5cy9idXMvZmlyZXdpcmUvZGV2aWNlcy9md1swLTldKy91bml0cworRGF0ZToJCUp1bmUgMjAwOQorS2VybmVsVmVyc2lvbjoJMi42LjMxCitDb250YWN0OglsaW51eDEzOTQtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitEZXNjcmlwdGlvbjoKKwkJSUVFRSAxMzk0IG5vZGUgZGV2aWNlIGF0dHJpYnV0ZS4KKwkJUmVhZC1vbmx5LiAgTXV0YWJsZSBkdXJpbmcgdGhlIG5vZGUgZGV2aWNlJ3MgbGlmZXRpbWUuCisJCVNlZSBJRUVFIDEyMTIgZm9yIHNlbWFudGljIGRlZmluaXRpb25zLgorCisJCXVuaXRzCisJCQlTdW1tYXJ5IG9mIGFsbCB1bml0cyBwcmVzZW50IGluIGFuIElFRUUgMTM5NCBub2RlLgorCQkJQ29udGFpbnMgc3BhY2Utc2VwYXJhdGVkIHR1cGxlcyBvZiBzcGVjaWZpZXJfaWQgYW5kCisJCQl2ZXJzaW9uIG9mIGVhY2ggdW5pdCBwcmVzZW50IGluIHRoZSBub2RlLiAgU3BlY2lmaWVyX2lkCisJCQlhbmQgdmVyc2lvbiBhcmUgaGV4YWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZgorCQkJdTI0IG9mIHRoZSByZXNwZWN0aXZlIHVuaXQgZGlyZWN0b3J5IGVudHJpZXMuCisJCQlTcGVjaWZpZXJfaWQgYW5kIHZlcnNpb24gd2l0aGluIGVhY2ggdHVwbGUgYXJlIHNlcGFyYXRlZAorCQkJYnkgYSBjb2xvbi4KKworVXNlcnM6CQl1ZGV2IHJ1bGVzIHRvIHNldCBvd25lcnNoaXAgYW5kIGFjY2VzcyBwZXJtaXNzaW9ucyBvciBBQ0xzIG9mCisJCS9kZXYvZndbMC05XSsgY2hhcmFjdGVyIGRldmljZSBmaWxlcworCisKK1doYXQ6CQkvc3lzL2J1cy9maXJld2lyZS9kZXZpY2VzL2Z3WzAtOV0rWy5dWzAtOV0rLworRGF0ZToJCU1heSAyMDA3CitLZXJuZWxWZXJzaW9uOgkyLjYuMjIKK0NvbnRhY3Q6CWxpbnV4MTM5NC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK0Rlc2NyaXB0aW9uOgorCQlJRUVFIDEzOTQgdW5pdCBkZXZpY2UgYXR0cmlidXRlcy4KKwkJUmVhZC1vbmx5LiAgSW1tdXRhYmxlIGR1cmluZyB0aGUgdW5pdCBkZXZpY2UncyBsaWZldGltZS4KKwkJU2VlIElFRUUgMTIxMiBmb3Igc2VtYW50aWMgZGVmaW5pdGlvbnMuCisKKwkJbW9kYWxpYXMKKwkJCVNhbWUgYXMgTU9EQUxJQVMgaW4gdGhlIHVldmVudCBhdCBkZXZpY2UgY3JlYXRpb24uCisKKwkJcm9tX2luZGV4CisJCQlPZmZzZXQgb2YgdGhlIHVuaXQgZGlyZWN0b3J5IHdpdGhpbiB0aGUgcGFyZW50IGRldmljZSdzCisJCQkobm9kZSBkZXZpY2UncykgQ29uZmlndXJhdGlvbiBST00sIGluIHF1YWRsZXRzLgorCQkJRGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisKKworV2hhdDoJCS9zeXMvYnVzL2ZpcmV3aXJlL2RldmljZXMvKi8KK0RhdGU6CQlNYXkgMjAwNworS2VybmVsVmVyc2lvbjoJMi42LjIyCitDb250YWN0OglsaW51eDEzOTQtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitEZXNjcmlwdGlvbjoKKwkJQXR0cmlidXRlcyBjb21tb24gdG8gSUVFRSAxMzk0IG5vZGUgZGV2aWNlcyBhbmQgdW5pdCBkZXZpY2VzLgorCQlSZWFkLW9ubHkuICBNdXRhYmxlIGR1cmluZyB0aGUgbm9kZSBkZXZpY2UncyBsaWZldGltZS4KKwkJSW1tdXRhYmxlIGR1cmluZyB0aGUgdW5pdCBkZXZpY2UncyBsaWZldGltZS4KKwkJU2VlIElFRUUgMTIxMiBmb3Igc2VtYW50aWMgZGVmaW5pdGlvbnMuCisKKwkJVGhlc2UgYXR0cmlidXRlcyBhcmUgb25seSBjcmVhdGVkIGlmIHRoZSByb290IGRpcmVjdG9yeSBvZiBhbgorCQlJRUVFIDEzOTQgbm9kZSBvciB0aGUgdW5pdCBkaXJlY3Rvcnkgb2YgYW4gSUVFRSAxMzk0IHVuaXQKKwkJYWN0dWFsbHkgY29udGFpbnMgYWNjb3JkaW5nIGVudHJpZXMuCisKKwkJaGFyZHdhcmVfdmVyc2lvbgorCQkJSGV4YWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIHUyNC4KKworCQloYXJkd2FyZV92ZXJzaW9uX25hbWUKKwkJCUNvbnRlbnRzIG9mIGEgcmVzcGVjdGl2ZSB0ZXh0dWFsIGRlc2NyaXB0b3IgbGVhZi4KKworCQltb2RlbAorCQkJSGV4YWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIHUyNC4KKworCQltb2RlbF9uYW1lCisJCQlDb250ZW50cyBvZiBhIHJlc3BlY3RpdmUgdGV4dHVhbCBkZXNjcmlwdG9yIGxlYWYuCisKKwkJc3BlY2lmaWVyX2lkCisJCQlIZXhhZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gdTI0LgorCQkJTWFuZGF0b3J5IGluIHVuaXQgZGlyZWN0b3JpZXMgYWNjb3JkaW5nIHRvIElFRUUgMTIxMi4KKworCQl2ZW5kb3IKKwkJCUhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiB1MjQuCisJCQlNYW5kYXRvcnkgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGFjY29yZGluZyB0byBJRUVFIDEyMTIuCisKKwkJdmVuZG9yX25hbWUKKwkJCUNvbnRlbnRzIG9mIGEgcmVzcGVjdGl2ZSB0ZXh0dWFsIGRlc2NyaXB0b3IgbGVhZi4KKworCQl2ZXJzaW9uCisJCQlIZXhhZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gdTI0LgorCQkJTWFuZGF0b3J5IGluIHVuaXQgZGlyZWN0b3JpZXMgYWNjb3JkaW5nIHRvIElFRUUgMTIxMi4KKworCitXaGF0OgkJL3N5cy9idXMvZmlyZXdpcmUvZHJpdmVycy9zYnAyL2Z3Ki9ob3N0Ki90YXJnZXQqLyo6KjoqOiovaWVlZTEzOTRfaWQKKwkJZm9ybWVybHkKKwkJL3N5cy9idXMvaWVlZTEzOTQvZHJpdmVycy9zYnAyL2Z3Ki9ob3N0Ki90YXJnZXQqLyo6KjoqOiovaWVlZTEzOTRfaWQKK0RhdGU6CQlGZWIgMjAwNAorS2VybmVsVmVyc2lvbjoJMi42LjQKK0NvbnRhY3Q6CWxpbnV4MTM5NC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK0Rlc2NyaXB0aW9uOgorCQlTQ1NJIHRhcmdldCBwb3J0IGlkZW50aWZpZXIgYW5kIGxvZ2ljYWwgdW5pdCBpZGVudGlmaWVyIG9mIGEKKwkJbG9naWNhbCB1bml0IG9mIGFuIFNCUC0yIHRhcmdldC4gIFRoZSBpZGVudGlmaWVycyBhcmUgc3BlY2lmaWVkCisJCWluIFNBTS0yLi4uU0FNLTQgYW5uZXggQS4gIFRoZXkgYXJlIHBlcnNpc3RlbnQgYW5kIHdvcmxkLXdpZGUKKwkJdW5pcXVlIHByb3BlcnRpZXMgdGhlIFNCUC0yIGF0dGFjaGVkIHRhcmdldC4KKworCQlSZWFkLW9ubHkgYXR0cmlidXRlLCBpbW11dGFibGUgZHVyaW5nIHRoZSB0YXJnZXQncyBsaWZldGltZS4KKwkJRm9ybWF0LCBhcyBleHBvc2VkIGJ5IGZpcmV3aXJlLXNicDIgc2luY2UgMi42LjIyLCBNYXkgMjAwNzoKKwkJQ29sb24tc2VwYXJhdGVkIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YKKwkJCXU2NCBFVUktNjQgOiB1MjQgZGlyZWN0b3J5X0lEIDogdTE2IExVTgorCQl3aXRob3V0IDB4IHByZWZpeGVzLCB3aXRob3V0IHdoaXRlc3BhY2UuICBUaGUgZm9ybWVyIHNicDIgZHJpdmVyCisJCShyZW1vdmVkIGluIDIuNi4zNyBhZnRlciBiZWluZyBzdXBlcnNlZGVkIGJ5IGZpcmV3aXJlLXNicDIpIHVzZWQKKwkJYSBzb21ld2hhdCBzaG9ydGVyIGZvcm1hdCB3aGljaCB3YXMgbm90IGFzIGNsb3NlIHRvIFNBTS4KKworVXNlcnM6CQl1ZGV2IHJ1bGVzIHRvIGNyZWF0ZSAvZGV2L2Rpc2svYnktaWQvIHN5bWxpbmtzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvdmRzbyBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS92ZHNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMWNiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvdmRzbwpAQCAtMCwwICsxLDI3IEBACitPbiBzb21lIGFyY2hpdGVjdHVyZXMsIHdoZW4gdGhlIGtlcm5lbCBsb2FkcyBhbnkgdXNlcnNwYWNlIHByb2dyYW0gaXQKK21hcHMgYW4gRUxGIERTTyBpbnRvIHRoYXQgcHJvZ3JhbSdzIGFkZHJlc3Mgc3BhY2UuICBUaGlzIERTTyBpcyBjYWxsZWQKK3RoZSB2RFNPIGFuZCBpdCBvZnRlbiBjb250YWlucyB1c2VmdWwgYW5kIGhpZ2hseS1vcHRpbWl6ZWQgYWx0ZXJuYXRpdmVzCit0byByZWFsIHN5c2NhbGxzLgorCitUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBqdXN0IGxpa2Ugb3JkaW5hcnkgQyBmdW5jdGlvbiBhY2NvcmRpbmcgdG8KK3lvdXIgcGxhdGZvcm0ncyBBQkkuICBDYWxsIHRoZW0gZnJvbSBhIHNlbnNpYmxlIGNvbnRleHQuICAoRm9yIGV4YW1wbGUsCitpZiB5b3Ugc2V0IENTIG9uIHg4NiB0byBzb21ldGhpbmcgc3RyYW5nZSwgdGhlIHZEU08gZnVuY3Rpb25zIGFyZQord2l0aGluIHRoZWlyIHJpZ2h0cyB0byBjcmFzaC4pICBJbiBhZGRpdGlvbiwgaWYgeW91IHBhc3MgYSBiYWQKK3BvaW50ZXIgdG8gYSB2RFNPIGZ1bmN0aW9uLCB5b3UgbWlnaHQgZ2V0IFNJR1NFR1YgaW5zdGVhZCBvZiAtRUZBVUxULgorCitUbyBmaW5kIHRoZSBEU08sIHBhcnNlIHRoZSBhdXhpbGlhcnkgdmVjdG9yIHBhc3NlZCB0byB0aGUgcHJvZ3JhbSdzCitlbnRyeSBwb2ludC4gIFRoZSBBVF9TWVNJTkZPX0VIRFIgZW50cnkgd2lsbCBwb2ludCB0byB0aGUgdkRTTy4KKworVGhlIHZEU08gdXNlcyBzeW1ib2wgdmVyc2lvbmluZzsgd2hlbmV2ZXIgeW91IHJlcXVlc3QgYSBzeW1ib2wgZnJvbSB0aGUKK3ZEU08sIHNwZWNpZnkgdGhlIHZlcnNpb24geW91IGFyZSBleHBlY3RpbmcuCisKK1Byb2dyYW1zIHRoYXQgZHluYW1pY2FsbHkgbGluayB0byBnbGliYyB3aWxsIHVzZSB0aGUgdkRTTyBhdXRvbWF0aWNhbGx5LgorT3RoZXJ3aXNlLCB5b3UgY2FuIHVzZSB0aGUgcmVmZXJlbmNlIHBhcnNlciBpbiBEb2N1bWVudGF0aW9uL3ZEU08vcGFyc2VfdmRzby5jLgorCitVbmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLCB0aGUgc2V0IG9mIHN5bWJvbHMgd2l0aCBhbnkgZ2l2ZW4gdmVyc2lvbiBhbmQgdGhlCitBQkkgb2YgdGhvc2Ugc3ltYm9scyBpcyBjb25zaWRlcmVkIHN0YWJsZS4gIEl0IG1heSB2YXJ5IGFjcm9zcyBhcmNoaXRlY3R1cmVzLAordGhvdWdoLgorCisoQXMgb2YgdGhpcyB3cml0aW5nLCB0aGlzIEFCSSBkb2N1bWVudGF0aW9uIGFzIGJlZW4gY29uZmlybWVkIGZvciB4ODZfNjQuCisgVGhlIG1haW50YWluZXJzIG9mIHRoZSBvdGhlciB2RFNPLXVzaW5nIGFyY2hpdGVjdHVyZXMgc2hvdWxkIGNvbmZpcm0KKyB0aGF0IGl0IGlzIGNvcnJlY3QgZm9yIHRoZWlyIGFyY2hpdGVjdHVyZS4pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtaTJjLWRldmljZXMtZnNhOTQ4MCBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWkyYy1kZXZpY2VzLWZzYTk0ODAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlMjY5YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWkyYy1kZXZpY2VzLWZzYTk0ODAKQEAgLTAsMCArMSwyMSBAQAorV2hhdDoJCS9zeXMvYnVzL2kyYy9kZXZpY2VzLy4uLi9kZXZpY2UKK0RhdGU6CQlGZWJydWFyeSAyMDExCitDb250YWN0OglNaW5reXUgS2FuZyA8bWs3LmthbmdAc2Ftc3VuZy5jb20+CitEZXNjcmlwdGlvbjoKKwkJc2hvdyB3aGF0IGRldmljZSBpcyBhdHRhY2hlZAorCQlOT05FIC0gbm8gZGV2aWNlCisJCVVTQiAtIFVTQiBkZXZpY2UgaXMgYXR0YWNoZWQKKwkJVUFSVCAtIFVBUlQgaXMgYXR0YWNoZWQKKwkJQ0hBUkdFUiAtIENoYXJnZXIgaXMgYXR0YWNlZAorCQlKSUcgLSBKSUcgaXMgYXR0YWNoZWQKKworV2hhdDoJCS9zeXMvYnVzL2kyYy9kZXZpY2VzLy4uLi9zd2l0Y2gKK0RhdGU6CQlGZWJydWFyeSAyMDExCitDb250YWN0OglNaW5reXUgS2FuZyA8bWs3LmthbmdAc2Ftc3VuZy5jb20+CitEZXNjcmlwdGlvbjoKKwkJc2hvdyBvciBzZXQgdGhlIHN0YXRlIG9mIG1hbnVhbCBzd2l0Y2gKKwkJVkFVRElPIC0gc3dpdGNoIHRvIFZBVURJTyBwYXRoCisJCVVBUlQgLSBzd2l0Y2ggdG8gVUFSVCBwYXRoCisJCUFVRElPIC0gc3dpdGNoIHRvIEFVRElPIHBhdGgKKwkJREhPU1QgLSBzd2l0Y2ggdG8gREhPU1QgcGF0aAorCQlBVVRPIC0gc3dpdGNoIGF1dG9tYXRpY2FsbHkgYnkgZGV2aWNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWJhY2tsaWdodC1kcml2ZXItYWRwODg3MCBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtYmFja2xpZ2h0LWRyaXZlci1hZHA4ODcwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMTFkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWJhY2tsaWdodC1kcml2ZXItYWRwODg3MApAQCAtMCwwICsxLDU2IEBACitXaGF0OgkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vPGFtYmllbnQgbGlnaHQgem9uZT5fbWF4CitXaGF0OgkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vbDFfZGF5bGlnaHRfbWF4CitXaGF0OgkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vbDJfYnJpZ2h0X21heAorV2hhdDoJCS9zeXMvY2xhc3MvYmFja2xpZ2h0LzxiYWNrbGlnaHQ+L2wzX29mZmljZV9tYXgKK1doYXQ6CQkvc3lzL2NsYXNzL2JhY2tsaWdodC88YmFja2xpZ2h0Pi9sNF9pbmRvb3JfbWF4CitXaGF0OgkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vbDVfZGFya19tYXgKK0RhdGU6CQlNYWkgMjAxMQorS2VybmVsVmVyc2lvbjoJMi42LjQwCitDb250YWN0OglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZworRGVzY3JpcHRpb246CisJCUNvbnRyb2wgdGhlIG1heGltdW0gYnJpZ2h0bmVzcyBmb3IgPGFtYmllbnQgbGlnaHQgem9uZT4KKwkJb24gdGhpcyA8YmFja2xpZ2h0Pi4gVmFsdWVzIGFyZSBiZXR3ZWVuIDAgYW5kIDEyNy4gVGhpcyBmaWxlCisJCXdpbGwgYWxzbyBzaG93IHRoZSBicmlnaHRuZXNzIGxldmVsIHN0b3JlZCBmb3IgdGhpcworCQk8YW1iaWVudCBsaWdodCB6b25lPi4KKworV2hhdDoJCS9zeXMvY2xhc3MvYmFja2xpZ2h0LzxiYWNrbGlnaHQ+LzxhbWJpZW50IGxpZ2h0IHpvbmU+X2RpbQorV2hhdDoJCS9zeXMvY2xhc3MvYmFja2xpZ2h0LzxiYWNrbGlnaHQ+L2wyX2JyaWdodF9kaW0KK1doYXQ6CQkvc3lzL2NsYXNzL2JhY2tsaWdodC88YmFja2xpZ2h0Pi9sM19vZmZpY2VfZGltCitXaGF0OgkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vbDRfaW5kb29yX2RpbQorV2hhdDoJCS9zeXMvY2xhc3MvYmFja2xpZ2h0LzxiYWNrbGlnaHQ+L2w1X2RhcmtfZGltCitEYXRlOgkJTWFpIDIwMTEKK0tlcm5lbFZlcnNpb246CTIuNi40MAorQ29udGFjdDoJZGV2aWNlLWRyaXZlcnMtZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlDb250cm9sIHRoZSBkaW0gYnJpZ2h0bmVzcyBmb3IgPGFtYmllbnQgbGlnaHQgem9uZT4KKwkJb24gdGhpcyA8YmFja2xpZ2h0Pi4gVmFsdWVzIGFyZSBiZXR3ZWVuIDAgYW5kIDEyNywgdHlwaWNhbGx5CisJCXNldCB0byAwLiBGdWxsIG9mZiB3aGVuIHRoZSBiYWNrbGlnaHQgaXMgZGlzYWJsZWQuCisJCVRoaXMgZmlsZSB3aWxsIGFsc28gc2hvdyB0aGUgZGltIGJyaWdodG5lc3MgbGV2ZWwgc3RvcmVkIGZvcgorCQl0aGlzIDxhbWJpZW50IGxpZ2h0IHpvbmU+LgorCitXaGF0OgkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vYW1iaWVudF9saWdodF9sZXZlbAorRGF0ZToJCU1haSAyMDExCitLZXJuZWxWZXJzaW9uOgkyLjYuNDAKK0NvbnRhY3Q6CWRldmljZS1kcml2ZXJzLWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCitEZXNjcmlwdGlvbjoKKwkJR2V0IGNvbnZlcnNpb24gdmFsdWUgb2YgdGhlIGxpZ2h0IHNlbnNvci4KKwkJVGhpcyB2YWx1ZSBpcyB1cGRhdGVkIGV2ZXJ5IDgwIG1zICh3aGVuIHRoZSBsaWdodCBzZW5zb3IKKwkJaXMgZW5hYmxlZCkuIFJldHVybnMgaW50ZWdlciBiZXR3ZWVuIDAgKGRhcmspIGFuZAorCQk4MDAwIChtYXggYW1iaWVudCBicmlnaHRuZXNzKQorCitXaGF0OgkJL3N5cy9jbGFzcy9iYWNrbGlnaHQvPGJhY2tsaWdodD4vYW1iaWVudF9saWdodF96b25lCitEYXRlOgkJTWFpIDIwMTEKK0tlcm5lbFZlcnNpb246CTIuNi40MAorQ29udGFjdDoJZGV2aWNlLWRyaXZlcnMtZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlHZXQvU2V0IGN1cnJlbnQgYW1iaWVudCBsaWdodCB6b25lLiBSZWFkaW5nIHJldHVybnMKKwkJaW50ZWdlciBiZXR3ZWVuIDEuLjUgKDEgPSBkYXlsaWdodCwgMiA9IGJyaWdodCwgLi4uLCA1ID0gZGFyaykuCisJCVdyaXRpbmcgYSB2YWx1ZSBiZXR3ZWVuIDEuLjUgZm9yY2VzIHRoZSBiYWNrbGlnaHQgY29udHJvbGxlcgorCQl0byBlbnRlciB0aGUgY29ycmVzcG9uZGluZyBhbWJpZW50IGxpZ2h0IHpvbmUuCisJCVdyaXRpbmcgMCByZXR1cm5zIHRvIG5vcm1hbC9hdXRvbWF0aWMgYW1iaWVudCBsaWdodCBsZXZlbAorCQlvcGVyYXRpb24uIFRoZSBhbWJpZW50IGxpZ2h0IHNlbnNpbmcgZmVhdHVyZSBvbiB0aGVzZSBkZXZpY2VzCisJCWlzIGFuIGV4dGVuc2lvbiB0byB0aGUgQVBJIGRvY3VtZW50ZWQgaW4KKwkJRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWNsYXNzLWJhY2tsaWdodC4KKwkJSXQgY2FuIGJlIGVuYWJsZWQgYnkgd3JpdGluZyB0aGUgdmFsdWUgc3RvcmVkIGluCisJCS9zeXMvY2xhc3MvYmFja2xpZ2h0LzxiYWNrbGlnaHQ+L21heF9icmlnaHRuZXNzIHRvCisJCS9zeXMvY2xhc3MvYmFja2xpZ2h0LzxiYWNrbGlnaHQ+L2JyaWdodG5lc3MuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lcGx1cyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1yb2NjYXQta29uZXBsdXMKaW5kZXggYzFiNTNiOC4uNjVlNmU1ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lcGx1cworKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LWtvbmVwbHVzCkBAIC05Miw2ICs5MiwxNCBAQAogCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgogVXNlcnM6CQlodHRwOi8vcm9jY2F0LnNvdXJjZWZvcmdlLm5ldAogCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi90YWxrCitEYXRlOgkJTWF5IDIwMTEKK0NvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitEZXNjcmlwdGlvbjoJVXNlZCB0byBhY3RpdmUgc29tZSBlYXN5KiBmdW5jdGlvbnMgb2YgdGhlIG1vdXNlIGZyb20gb3V0c2lkZS4KKwkJVGhlIGRhdGEgaGFzIHRvIGJlIDE2IGJ5dGVzIGxvbmcuCisJCVRoaXMgZmlsZSBpcyB3cml0ZW9ubHkuCitVc2VyczoJCWh0dHA6Ly9yb2NjYXQuc291cmNlZm9yZ2UubmV0CisKIFdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3RjdQogRGF0ZToJCU9jdG9iZXIgMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC13aWltb3RlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXdpaW1vdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1YTE2ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC13aWltb3RlCkBAIC0wLDAgKzEsMTAgQEAKK1doYXQ6CQkvc3lzL2J1cy9oaWQvZHJpdmVycy93aWltb3RlLzxkZXY+L2xlZDEKK1doYXQ6CQkvc3lzL2J1cy9oaWQvZHJpdmVycy93aWltb3RlLzxkZXY+L2xlZDIKK1doYXQ6CQkvc3lzL2J1cy9oaWQvZHJpdmVycy93aWltb3RlLzxkZXY+L2xlZDMKK1doYXQ6CQkvc3lzL2J1cy9oaWQvZHJpdmVycy93aWltb3RlLzxkZXY+L2xlZDQKK0RhdGU6CQlKdWx5IDIwMTEKK0tlcm5lbFZlcnNpb246CTMuMQorQ29udGFjdDoJRGF2aWQgSGVycm1hbm4gPGRoLmhlcnJtYW5uQGdvb2dsZW1haWwuY29tPgorRGVzY3JpcHRpb246CU1ha2UgaXQgcG9zc2libGUgdG8gc2V0L2dldCBjdXJyZW50IGxlZCBzdGF0ZS4gUmVhZGluZyBmcm9tIGl0CisJCXJldHVybnMgMCBpZiBsZWQgaXMgb2ZmIGFuZCAxIGlmIGl0IGlzIG9uLiBXcml0aW5nIDAgdG8gaXQKKwkJZGlzYWJsZXMgdGhlIGxlZCwgd3JpdGluZyAxIGVuYWJsZXMgaXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLW1vZHVsZSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtbW9kdWxlCmluZGV4IGNmY2VjM2IuLjk0ODllYTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtbW9kdWxlCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtbW9kdWxlCkBAIC0xMCwzICsxMCwyNiBAQAogQ29udGFjdDoJbWFzYS1rb3JnQGRzbi5va2lzZW1pLmNvbQogRGVzY3JpcHRpb246CVdyaXRlL3JlYWQgT3B0aW9uIFJPTSBkYXRhLgogCisKK1doYXQ6CQkvc3lzL21vZHVsZS9laGNpX2hjZC9kcml2ZXJzLy4uLi91ZnJhbWVfcGVyaW9kaWNfbWF4CitEYXRlOgkJSnVseSAyMDExCitLZXJuZWxWZXJzaW9uOgkzLjEKK0NvbnRhY3Q6CUtpcmlsbCBTbWVsa292IDxraXJyQG1ucy5zcGIucnU+CitEZXNjcmlwdGlvbjoJTWF4aW11bSB0aW1lIGFsbG93ZWQgZm9yIHBlcmlvZGljIHRyYW5zZmVycyBwZXIgbWljcm9mcmFtZSAozrxzKQorCisJCVsgVVNCIDIuMCBzZXRzIG1heGltdW0gYWxsb3dlZCB0aW1lIGZvciBwZXJpb2RpYyB0cmFuc2ZlcnMgcGVyCisJCSAgbWljcm9mcmFtZSB0byBiZSA4MCUsIHRoYXQgaXMgMTAwIG1pY3Jvc2Vjb25kcyBvdXQgb2YgMTI1CisJCSAgbWljcm9zZWNvbmRzIChmdWxsIG1pY3JvZnJhbWUpLgorCisJCSAgSG93ZXZlciB0aGVyZSBhcmUgY2FzZXMsIHdoZW4gODAlIG1heCBpc29jaHJvbm91cyBiYW5kd2lkdGggaXMKKwkJICB0b28gbGltaXRpbmcuIEZvciBleGFtcGxlIHR3byB2aWRlbyBzdHJlYW1zIGNvdWxkIHJlcXVpcmUgMTEwCisJCSAgbWljcm9zZWNvbmRzIG9mIGlzb2Nocm9ub3VzIGJhbmR3aWR0aCBwZXIgbWljcm9mcmFtZSB0byB3b3JrCisJCSAgdG9nZXRoZXIuIF0KKworCQlUaHJvdWdoIHRoaXMgc2V0dGluZyBpdCBpcyBwb3NzaWJsZSB0byByYWlzZSB0aGUgbGltaXQgc28gdGhhdAorCQl0aGUgaG9zdCBjb250cm9sbGVyIHdvdWxkIGFsbG93IGFsbG9jYXRpbmcgbW9yZSB0aGFuIDEwMAorCQltaWNyb3NlY29uZHMgb2YgcGVyaW9kaWMgYmFuZHdpZHRoIHBlciBtaWNyb2ZyYW1lLgorCisJCUJld2FyZSwgbm9uLXN0YW5kYXJkIG1vZGVzIGFyZSB1c3VhbGx5IG5vdCB0aG9yb3VnaGx5IHRlc3RlZCBieQorCQloYXJkd2FyZSBkZXNpZ25lcnMsIGFuZCB0aGUgaGFyZHdhcmUgY2FuIG1hbGZ1bmN0aW9uIHdoZW4gdGhpcworCQlzZXR0aW5nIGRpZmZlciBmcm9tIGRlZmF1bHQgMTAwLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzIGIvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCmluZGV4IDVmNDgyOGEwLi5iMTc1ODA4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCkBAIC0yLDEzICsyLDcgQEAKID09PT09CiAKIFRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgdGhlIG1pbmltdW0gbGV2ZWxzIG9mCi1zb2Z0d2FyZSBuZWNlc3NhcnkgdG8gcnVuIHRoZSAyLjYga2VybmVscywgYXMgd2VsbCBhcyBwcm92aWRlIGJyaWVmCi1pbnN0cnVjdGlvbnMgcmVnYXJkaW5nIGFueSBvdGhlciAiR290Y2hhcyIgdXNlcnMgbWF5IGVuY291bnRlciB3aGVuCi10cnlpbmcgbGlmZSBvbiB0aGUgQmxlZWRpbmcgRWRnZS4gIElmIHVwZ3JhZGluZyBmcm9tIGEgcHJlLTIuNC54Ci1rZXJuZWwsIHBsZWFzZSBjb25zdWx0IHRoZSBDaGFuZ2VzIGZpbGUgaW5jbHVkZWQgd2l0aCAyLjQueCBrZXJuZWxzIGZvcgotYWRkaXRpb25hbCBpbmZvcm1hdGlvbjsgbW9zdCBvZiB0aGF0IGluZm9ybWF0aW9uIHdpbGwgbm90IGJlIHJlcGVhdGVkCi1oZXJlLiAgQmFzaWNhbGx5LCB0aGlzIGRvY3VtZW50IGFzc3VtZXMgdGhhdCB5b3VyIHN5c3RlbSBpcyBhbHJlYWR5Ci1mdW5jdGlvbmFsIGFuZCBydW5uaW5nIGF0IGxlYXN0IDIuNC54IGtlcm5lbHMuCitzb2Z0d2FyZSBuZWNlc3NhcnkgdG8gcnVuIHRoZSAzLjAga2VybmVscy4KIAogVGhpcyBkb2N1bWVudCBpcyBvcmlnaW5hbGx5IGJhc2VkIG9uIG15ICJDaGFuZ2VzIiBmaWxlIGZvciAyLjAueCBrZXJuZWxzCiBhbmQgdGhlcmVmb3JlIG93ZXMgY3JlZGl0IHRvIHRoZSBzYW1lIHBlb3BsZSBhcyB0aGF0IGZpbGUgKEphcmVkIE1hdWNoLApAQCAtMjIsMTEgKzE2LDEwIEBACiBlbmNvdW50ZXJlZCBhIGJ1ZyEgIElmIHlvdSdyZSB1bnN1cmUgd2hhdCB2ZXJzaW9uIHlvdSdyZSBjdXJyZW50bHkKIHJ1bm5pbmcsIHRoZSBzdWdnZXN0ZWQgY29tbWFuZCBzaG91bGQgdGVsbCB5b3UuCiAKLUFnYWluLCBrZWVwIGluIG1pbmQgdGhhdCB0aGlzIGxpc3QgYXNzdW1lcyB5b3UgYXJlIGFscmVhZHkKLWZ1bmN0aW9uYWxseSBydW5uaW5nIGEgTGludXggMi40IGtlcm5lbC4gIEFsc28sIG5vdCBhbGwgdG9vbHMgYXJlCi1uZWNlc3Nhcnkgb24gYWxsIHN5c3RlbXM7IG9idmlvdXNseSwgaWYgeW91IGRvbid0IGhhdmUgYW55IElTRE4KLWhhcmR3YXJlLCBmb3IgZXhhbXBsZSwgeW91IHByb2JhYmx5IG5lZWRuJ3QgY29uY2VybiB5b3Vyc2VsZiB3aXRoCi1pc2RuNGstdXRpbHMuCitBZ2Fpbiwga2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBsaXN0IGFzc3VtZXMgeW91IGFyZSBhbHJlYWR5IGZ1bmN0aW9uYWxseQorcnVubmluZyBhIExpbnV4IGtlcm5lbC4gIEFsc28sIG5vdCBhbGwgdG9vbHMgYXJlIG5lY2Vzc2FyeSBvbiBhbGwKK3N5c3RlbXM7IG9idmlvdXNseSwgaWYgeW91IGRvbid0IGhhdmUgYW55IElTRE4gaGFyZHdhcmUsIGZvciBleGFtcGxlLAoreW91IHByb2JhYmx5IG5lZWRuJ3QgY29uY2VybiB5b3Vyc2VsZiB3aXRoIGlzZG40ay11dGlscy4KIAogbyAgR251IEMgICAgICAgICAgICAgICAgICAzLjIgICAgICAgICAgICAgICAgICAgICAjIGdjYyAtLXZlcnNpb24KIG8gIEdudSBtYWtlICAgICAgICAgICAgICAgMy44MCAgICAgICAgICAgICAgICAgICAgIyBtYWtlIC0tdmVyc2lvbgpAQCAtMTE0LDEyICsxMDcsMTIgQEAKIAogSWYgdGhlIHVudGhpbmthYmxlIGhhcHBlbnMgYW5kIHlvdXIga2VybmVsIG9vcHNlcywgeW91IG1heSBuZWVkIHRoZQoga3N5bW9vcHMgdG9vbCB0byBkZWNvZGUgaXQsIGJ1dCBpbiBtb3N0IGNhc2VzIHlvdSBkb24ndC4KLUluIHRoZSAyLjYga2VybmVsIGl0IGlzIGdlbmVyYWxseSBwcmVmZXJyZWQgdG8gYnVpbGQgdGhlIGtlcm5lbCB3aXRoCi1DT05GSUdfS0FMTFNZTVMgc28gdGhhdCBpdCBwcm9kdWNlcyByZWFkYWJsZSBkdW1wcyB0aGF0IGNhbiBiZSB1c2VkIGFzLWlzCi0odGhpcyBhbHNvIHByb2R1Y2VzIGJldHRlciBvdXRwdXQgdGhhbiBrc3ltb29wcykuCi1JZiBmb3Igc29tZSByZWFzb24geW91ciBrZXJuZWwgaXMgbm90IGJ1aWxkIHdpdGggQ09ORklHX0tBTExTWU1TIGFuZAoteW91IGhhdmUgbm8gd2F5IHRvIHJlYnVpbGQgYW5kIHJlcHJvZHVjZSB0aGUgT29wcyB3aXRoIHRoYXQgb3B0aW9uLCB0aGVuCi15b3UgY2FuIHN0aWxsIGRlY29kZSB0aGF0IE9vcHMgd2l0aCBrc3ltb29wcy4KK0l0IGlzIGdlbmVyYWxseSBwcmVmZXJyZWQgdG8gYnVpbGQgdGhlIGtlcm5lbCB3aXRoIENPTkZJR19LQUxMU1lNUyBzbwordGhhdCBpdCBwcm9kdWNlcyByZWFkYWJsZSBkdW1wcyB0aGF0IGNhbiBiZSB1c2VkIGFzLWlzICh0aGlzIGFsc28KK3Byb2R1Y2VzIGJldHRlciBvdXRwdXQgdGhhbiBrc3ltb29wcykuICBJZiBmb3Igc29tZSByZWFzb24geW91ciBrZXJuZWwKK2lzIG5vdCBidWlsZCB3aXRoIENPTkZJR19LQUxMU1lNUyBhbmQgeW91IGhhdmUgbm8gd2F5IHRvIHJlYnVpbGQgYW5kCityZXByb2R1Y2UgdGhlIE9vcHMgd2l0aCB0aGF0IG9wdGlvbiwgdGhlbiB5b3UgY2FuIHN0aWxsIGRlY29kZSB0aGF0IE9vcHMKK3dpdGgga3N5bW9vcHMuCiAKIE1vZHVsZS1Jbml0LVRvb2xzCiAtLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjYxLDggKzI1NCw4IEBACiBORlMtdXRpbHMKIC0tLS0tLS0tLQogCi1JbiAyLjQgYW5kIGVhcmxpZXIga2VybmVscywgdGhlIG5mcyBzZXJ2ZXIgbmVlZGVkIHRvIGtub3cgYWJvdXQgYW55Ci1jbGllbnQgdGhhdCBleHBlY3RlZCB0byBiZSBhYmxlIHRvIGFjY2VzcyBmaWxlcyB2aWEgTkZTLiAgVGhpcworSW4gYW5jaWVudCAoMi40IGFuZCBlYXJsaWVyKSBrZXJuZWxzLCB0aGUgbmZzIHNlcnZlciBuZWVkZWQgdG8ga25vdworYWJvdXQgYW55IGNsaWVudCB0aGF0IGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gYWNjZXNzIGZpbGVzIHZpYSBORlMuICBUaGlzCiBpbmZvcm1hdGlvbiB3b3VsZCBiZSBnaXZlbiB0byB0aGUga2VybmVsIGJ5ICJtb3VudGQiIHdoZW4gdGhlIGNsaWVudAogbW91bnRlZCB0aGUgZmlsZXN5c3RlbSwgb3IgYnkgImV4cG9ydGZzIiBhdCBzeXN0ZW0gc3RhcnR1cC4gIGV4cG9ydGZzCiB3b3VsZCB0YWtlIGluZm9ybWF0aW9uIGFib3V0IGFjdGl2ZSBjbGllbnRzIGZyb20gL3Zhci9saWIvbmZzL3JtdGFiLgpAQCAtMjcyLDExICsyNjUsMTEgQEAKIGZhaWwtb3Zlci4gIEV2ZW4gd2hlbiB0aGUgc3lzdGVtIGlzIHdvcmtpbmcgd2VsbCwgcm10YWIgc3VmZmVycyBmcm9tCiBnZXR0aW5nIGxvdHMgb2Ygb2xkIGVudHJpZXMgdGhhdCBuZXZlciBnZXQgcmVtb3ZlZC4KIAotV2l0aCAyLjYgd2UgaGF2ZSB0aGUgb3B0aW9uIG9mIGhhdmluZyB0aGUga2VybmVsIHRlbGwgbW91bnRkIHdoZW4gaXQKLWdldHMgYSByZXF1ZXN0IGZyb20gYW4gdW5rbm93biBob3N0LCBhbmQgbW91bnRkIGNhbiBnaXZlIGFwcHJvcHJpYXRlCi1leHBvcnQgaW5mb3JtYXRpb24gdG8gdGhlIGtlcm5lbC4gIFRoaXMgcmVtb3ZlcyB0aGUgZGVwZW5kZW5jeSBvbgotcm10YWIgYW5kIG1lYW5zIHRoYXQgdGhlIGtlcm5lbCBvbmx5IG5lZWRzIHRvIGtub3cgYWJvdXQgY3VycmVudGx5Ci1hY3RpdmUgY2xpZW50cy4KK1dpdGggbW9kZXJuIGtlcm5lbHMgd2UgaGF2ZSB0aGUgb3B0aW9uIG9mIGhhdmluZyB0aGUga2VybmVsIHRlbGwgbW91bnRkCit3aGVuIGl0IGdldHMgYSByZXF1ZXN0IGZyb20gYW4gdW5rbm93biBob3N0LCBhbmQgbW91bnRkIGNhbiBnaXZlCithcHByb3ByaWF0ZSBleHBvcnQgaW5mb3JtYXRpb24gdG8gdGhlIGtlcm5lbC4gIFRoaXMgcmVtb3ZlcyB0aGUKK2RlcGVuZGVuY3kgb24gcm10YWIgYW5kIG1lYW5zIHRoYXQgdGhlIGtlcm5lbCBvbmx5IG5lZWRzIHRvIGtub3cgYWJvdXQKK2N1cnJlbnRseSBhY3RpdmUgY2xpZW50cy4KIAogVG8gZW5hYmxlIHRoaXMgbmV3IGZ1bmN0aW9uYWxpdHksIHlvdSBuZWVkIHRvOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQppbmRleCA1OGIwYmY5Li5mYTZlMjViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisrKyBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKQEAgLTY4MCw4ICs2ODAsOCBAQAogCQlDaGFwdGVyIDE0OiBBbGxvY2F0aW5nIG1lbW9yeQogCiBUaGUga2VybmVsIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbCBwdXJwb3NlIG1lbW9yeSBhbGxvY2F0b3JzOgota21hbGxvYygpLCBremFsbG9jKCksIGtjYWxsb2MoKSwgYW5kIHZtYWxsb2MoKS4gIFBsZWFzZSByZWZlciB0byB0aGUgQVBJCi1kb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZW0uCitrbWFsbG9jKCksIGt6YWxsb2MoKSwga2NhbGxvYygpLCB2bWFsbG9jKCksIGFuZCB2emFsbG9jKCkuICBQbGVhc2UgcmVmZXIgdG8KK3RoZSBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGVtLgogCiBUaGUgcHJlZmVycmVkIGZvcm0gZm9yIHBhc3NpbmcgYSBzaXplIG9mIGEgc3RydWN0IGlzIHRoZSBmb2xsb3dpbmc6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay84MDIxMS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rLzgwMjExLnRtcGwKaW5kZXggODkwNjY0OC4uNDQ1Mjg5YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rLzgwMjExLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rLzgwMjExLnRtcGwKQEAgLTQwMiw4ICs0MDIsOSBAQAogIUZpbmNsdWRlL25ldC9tYWM4MDIxMS5oIHNldF9rZXlfY21kCiAhRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX2tleV9jb25mCiAhRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX2tleV9mbGFncwotIUZpbmNsdWRlL25ldC9tYWM4MDIxMS5oIGllZWU4MDIxMV90a2lwX2tleV90eXBlCi0hRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX2dldF90a2lwX2tleQorIUZpbmNsdWRlL25ldC9tYWM4MDIxMS5oIGllZWU4MDIxMV9nZXRfdGtpcF9wMWsKKyFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBpZWVlODAyMTFfZ2V0X3RraXBfcDFrX2l2CishRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX2dldF90a2lwX3AyawogIUZpbmNsdWRlL25ldC9tYWM4MDIxMS5oIGllZWU4MDIxMV9rZXlfcmVtb3ZlZAogICAgICAgPC9jaGFwdGVyPgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtaGFja2luZy50bXBsCmluZGV4IDdiM2Y0OTMuLjA3YTljNDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtaGFja2luZy50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtaGFja2luZy50bXBsCkBAIC00MDksNyArNDA5LDcgQEAKIAogICA8cGFyYT4KICAgIFlvdSBzaG91bGQgYWx3YXlzIGNvbXBpbGUgeW91ciBrZXJuZWwKLSAgIDxzeW1ib2w+Q09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQPC9zeW1ib2w+IG9uLCBhbmQgaXQgd2lsbCB3YXJuCisgICA8c3ltYm9sPkNPTkZJR19ERUJVR19BVE9NSUNfU0xFRVA8L3N5bWJvbD4gb24sIGFuZCBpdCB3aWxsIHdhcm4KICAgIHlvdSBpZiB5b3UgYnJlYWsgdGhlc2UgcnVsZXMuICBJZiB5b3UgPGVtcGhhc2lzPmRvPC9lbXBoYXNpcz4gYnJlYWsKICAgIHRoZSBydWxlcywgeW91IHdpbGwgZXZlbnR1YWxseSBsb2NrIHVwIHlvdXIgYm94LgogICA8L3BhcmE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2lvLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvaW8ueG1sCmluZGV4IDIyN2U3YWMuLmM1N2QxZWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvaW8ueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvaW8ueG1sCkBAIC0yMTAsNyArMjEwLDcgQEAKICAgICAgIDxwcm9ncmFtbGlzdGluZz4KICZ2NGwyLXJlcXVlc3RidWZmZXJzOyByZXFidWY7CiAvKiBPdXIgY3VycmVudCBmb3JtYXQgdXNlcyAzIHBsYW5lcyBwZXIgYnVmZmVyICovCi0jZGVmaW5lIEZNVF9OVU1fUExBTkVTID0gMzsKKyNkZWZpbmUgRk1UX05VTV9QTEFORVMgPSAzCiAKIHN0cnVjdCB7CiAJdm9pZCAqc3RhcnRbRk1UX05VTV9QTEFORVNdOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKaW5kZXggNThjZWQyMy4uNTk4YzIyZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCkBAIC0xMTY0LDcgKzExNjQsNyBAQAogICAgICAgICAgIH0KICAgICAgICAgICBjaGlwLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAgICAgICAgICAgaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfbXljaGlwX2ludGVycnVwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSVJRRl9TSEFSRUQsICJNeSBDaGlwIiwgY2hpcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZ3JhYiBpcnEgJWRcbiIsIHBjaS0+aXJxKTsKICAgICAgICAgICAgICAgICAgIHNuZF9teWNoaXBfZnJlZShjaGlwKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CkBAIC0xMTk3LDcgKzExOTcsNyBAQAogCiAgIC8qIHBjaV9kcml2ZXIgZGVmaW5pdGlvbiAqLwogICBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotICAgICAgICAgIC5uYW1lID0gIk15IE93biBDaGlwIiwKKyAgICAgICAgICAubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogICAgICAgICAgIC5pZF90YWJsZSA9IHNuZF9teWNoaXBfaWRzLAogICAgICAgICAgIC5wcm9iZSA9IHNuZF9teWNoaXBfcHJvYmUsCiAgICAgICAgICAgLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9teWNoaXBfcmVtb3ZlKSwKQEAgLTEzNDAsNyArMTM0MCw3IEBACiAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgogPCFbQ0RBVEFbCiAgIGlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX215Y2hpcF9pbnRlcnJ1cHQsCi0gICAgICAgICAgICAgICAgICBJUlFGX1NIQVJFRCwgIk15IENoaXAiLCBjaGlwKSkgeworICAgICAgICAgICAgICAgICAgSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CiAgICAgICAgICAgc25kX215Y2hpcF9mcmVlKGNoaXApOwogICAgICAgICAgIHJldHVybiAtRUJVU1k7CkBAIC0xNjE2LDcgKzE2MTYsNyBAQAogICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KIDwhW0NEQVRBWwogICBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotICAgICAgICAgIC5uYW1lID0gIk15IE93biBDaGlwIiwKKyAgICAgICAgICAubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogICAgICAgICAgIC5pZF90YWJsZSA9IHNuZF9teWNoaXBfaWRzLAogICAgICAgICAgIC5wcm9iZSA9IHNuZF9teWNoaXBfcHJvYmUsCiAgICAgICAgICAgLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9teWNoaXBfcmVtb3ZlKSwKQEAgLTU4MTYsNyArNTgxNiw3IEBACiAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KIDwhW0NEQVRBWwogICBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotICAgICAgICAgIC5uYW1lID0gIk15IENoaXAiLAorICAgICAgICAgIC5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAgICAgICAgICAgLmlkX3RhYmxlID0gc25kX215X2lkcywKICAgICAgICAgICAucHJvYmUgPSBzbmRfbXlfcHJvYmUsCiAgICAgICAgICAgLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9teV9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvTk1JLVJDVS50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS9OTUktUkNVLnR4dAppbmRleCBhODUzNmNiLi5iZjgyODUxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9OTUktUkNVLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS9OTUktUkNVLnR4dApAQCAtNSw4ICs1LDggQEAKIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBSQ1UgdG8gcHJvdmlkZSBkeW5hbWljIG5vbi1tYXNrYWJsZSBpbnRlcnJ1cHQKIGhhbmRsZXJzLCBhcyB3ZWxsIGFzIGR5bmFtaWMgaXJxIGhhbmRsZXJzLiAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMKIGhvdyB0byBkbyB0aGlzLCBkcmF3aW5nIGxvb3NlbHkgZnJvbSBad2FuZSBNd2Fpa2FtYm8ncyBOTUktdGltZXIKLXdvcmsgaW4gImFyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMiIGFuZCBpbgotImFyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYyIuCit3b3JrIGluICJhcmNoL3g4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMiIGFuZCBpbgorImFyY2gveDg2L2tlcm5lbC90cmFwcy5jIi4KIAogVGhlIHJlbGV2YW50IHBpZWNlcyBvZiBjb2RlIGFyZSBsaXN0ZWQgYmVsb3csIGVhY2ggZm9sbG93ZWQgYnkgYQogYnJpZWYgZXhwbGFuYXRpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdCBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CmluZGV4IGRhMDM4MmQuLmRjMGUzMzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CkBAIC01Myw4ICs1Myw4IEBACiAKIDEyOiBIYXMgYmVlbiB0ZXN0ZWQgd2l0aCBDT05GSUdfUFJFRU1QVCwgQ09ORklHX0RFQlVHX1BSRUVNUFQsCiAgICAgQ09ORklHX0RFQlVHX1NMQUIsIENPTkZJR19ERUJVR19QQUdFQUxMT0MsIENPTkZJR19ERUJVR19NVVRFWEVTLAotICAgIENPTkZJR19ERUJVR19TUElOTE9DSywgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGFsbCBzaW11bHRhbmVvdXNseQotICAgIGVuYWJsZWQuCisgICAgQ09ORklHX0RFQlVHX1NQSU5MT0NLLCBDT05GSUdfREVCVUdfQVRPTUlDX1NMRUVQLCBDT05GSUdfUFJPVkVfUkNVCisgICAgYW5kIENPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFEIGFsbCBzaW11bHRhbmVvdXNseSBlbmFibGVkLgogCiAxMzogSGFzIGJlZW4gYnVpbGQtIGFuZCBydW50aW1lIHRlc3RlZCB3aXRoIGFuZCB3aXRob3V0IENPTkZJR19TTVAgYW5kCiAgICAgQ09ORklHX1BSRUVNUFQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvY2dyb3Vwc3RhdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2Nncm91cHN0YXRzLnR4dAppbmRleCBlZGE0MGZkLi5kMTZhOTg0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvY2dyb3Vwc3RhdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy9jZ3JvdXBzdGF0cy50eHQKQEAgLTIxLDcgKzIxLDcgQEAKIFRvIGV4dHJhY3QgY2dyb3VwIHN0YXRpc3RpY3MgYSB1dGlsaXR5IHZlcnkgc2ltaWxhciB0byBnZXRkZWxheXMuYwogaGFzIGJlZW4gZGV2ZWxvcGVkLCB0aGUgc2FtcGxlIG91dHB1dCBvZiB0aGUgdXRpbGl0eSBpcyBzaG93biBiZWxvdwogCi1+L2JhbGJpci9jZ3JvdXBzdGF0cyAjIC4vZ2V0ZGVsYXlzICAtQyAiL2Nncm91cC9hIgorfi9iYWxiaXIvY2dyb3Vwc3RhdHMgIyAuL2dldGRlbGF5cyAgLUMgIi9zeXMvZnMvY2dyb3VwL2EiCiBzbGVlcGluZyAxLCBibG9ja2VkIDAsIHJ1bm5pbmcgMSwgc3RvcHBlZCAwLCB1bmludGVycnVwdGlibGUgMAotfi9iYWxiaXIvY2dyb3Vwc3RhdHMgIyAuL2dldGRlbGF5cyAgLUMgIi9jZ3JvdXAiCit+L2JhbGJpci9jZ3JvdXBzdGF0cyAjIC4vZ2V0ZGVsYXlzICAtQyAiL3N5cy9mcy9jZ3JvdXAiCiBzbGVlcGluZyAxNTUsIGJsb2NrZWQgMCwgcnVubmluZyAxLCBzdG9wcGVkIDAsIHVuaW50ZXJydXB0aWJsZSAyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS9Cb290aW5nIGIvRG9jdW1lbnRhdGlvbi9hcm0vQm9vdGluZwppbmRleCA0ZTY4NmEyLi5hMzQxZDg3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FybS9Cb290aW5nCisrKyBiL0RvY3VtZW50YXRpb24vYXJtL0Jvb3RpbmcKQEAgLTE2NCwzICsxNjQsOCBAQAogLSBUaGUgYm9vdCBsb2FkZXIgaXMgZXhwZWN0ZWQgdG8gY2FsbCB0aGUga2VybmVsIGltYWdlIGJ5IGp1bXBpbmcKICAgZGlyZWN0bHkgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIG9mIHRoZSBrZXJuZWwgaW1hZ2UuCiAKKyAgT24gQ1BVcyBzdXBwb3J0aW5nIHRoZSBBUk0gaW5zdHJ1Y3Rpb24gc2V0LCB0aGUgZW50cnkgbXVzdCBiZQorICBtYWRlIGluIEFSTSBzdGF0ZSwgZXZlbiBmb3IgYSBUaHVtYi0yIGtlcm5lbC4KKworICBPbiBDUFVzIHN1cHBvcnRpbmcgb25seSB0aGUgVGh1bWIgaW5zdHJ1Y3Rpb24gc2V0IHN1Y2ggYXMKKyAgQ29ydGV4LU0gY2xhc3MgQ1BVcywgdGhlIGVudHJ5IG11c3QgYmUgbWFkZSBpbiBUaHVtYiBzdGF0ZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXJtL1NILU1vYmlsZS96Ym9vdC1yb20tc2RoaS50eHQgYi9Eb2N1bWVudGF0aW9uL2FybS9TSC1Nb2JpbGUvemJvb3Qtcm9tLXNkaGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTk1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TSC1Nb2JpbGUvemJvb3Qtcm9tLXNkaGkudHh0CkBAIC0wLDAgKzEsNDIgQEAKK1JPTS1hYmxlIHpJbWFnZSBib290IGZyb20gZVNECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbiBST00tYWJsZSB6SW1hZ2UgY29tcGlsZWQgd2l0aCBaQk9PVF9ST01fU0RISSBtYXkgYmUgd3JpdHRlbiB0byBlU0QgYW5kCitTdXBlckggTW9iaWxlIEFSTSB3aWxsIHRvIGJvb3QgZGlyZWN0bHkgZnJvbSB0aGUgU0RISSBoYXJkd2FyZSBibG9jay4KKworVGhpcyBpcyBhY2hpZXZlZCBieSB0aGUgbWFzayBST00gbG9hZGluZyB0aGUgZmlyc3QgcG9ydGlvbiBvZiB0aGUgaW1hZ2UgaW50bworTUVSQU0gYW5kIHRoZW4ganVtcGluZyB0byBpdC4gVGhpcyBwb3J0aW9uIGNvbnRhaW5zIGxvYWRlciBjb2RlIHdoaWNoCitjb3BpZXMgdGhlIGVudGlyZSBpbWFnZSB0byBTRFJBTSBhbmQganVtcHMgdG8gaXQuIEZyb20gdGhlcmUgdGhlIHpJbWFnZQorYm9vdCBjb2RlIHByb2NlZWRzIGFzIG5vcm1hbCwgdW5jb21wcmVzc2luZyB0aGUgaW1hZ2UgaW50byBpdHMgZmluYWwKK2xvY2F0aW9uIGFuZCB0aGVuIGp1bXBpbmcgdG8gaXQuCisKK1RoaXMgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgb24gYW4gbWFja2VyZWwgYm9hcmQgdXNpbmcgdGhlIGRldmVsb3BlciAxQSBlU0QKK2Jvb3QgbW9kZSB3aGljaCBpcyBjb25maWd1cmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcganVtcGVyIHNldHRpbmdzLgorCisgICA4IDcgNiA1IDQgMyAyIDEKKyAgIHh8eHx4fHh8IHx4fHh8CitTNCAtKy0rLSstKy0rLSstKy0KKyAgICB8IHwgfCB8eHwgfCB8eCBvbgorCitUaGUgZVNEIGNhcmQgbmVlZHMgdG8gYmUgcHJlc2VudCBpbiBTREhJIHNsb3QgMSAoQ043KS4KK0FzIHN1Y2ggUzEgYW5kIFMzMyBhbHNvIG5lZWQgdG8gYmUgY29uZmlndXJlZCBhcyBwZXIKK3RoZSBub3RlcyBpbiBhcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMuCisKK0EgcGFydGlhbCB6SW1hZ2UgbXVzdCBiZSB3cml0dGVuIHRvIHBoeXNpY2FsIHBhcnRpdGlvbiAjMSAoYm9vdCkKK29mIHRoZSBlU0QgYXQgc2VjdG9yIDAgaW4gdnJsNCBmb3JtYXQuIEEgdXRpbGl0eSB2cmw0IGlzIHN1cHBsaWVkIHRvCithY2NvbXBsaXNoIHRoaXMuCisKK2UuZy4KKwl2cmw0IDwgekltYWdlIHwgZGQgb2Y9L2Rldi9zZFggYnM9NTEyIGNvdW50PTE3CisKK0EgZnVsbCBjb3B5IG9mIF90aGUgc2FtZV8gekltYWdlIHNob3VsZCBiZSB3cml0dGVuIHRvIHBoeXNpY2FsIHBhcnRpdGlvbiAjMQorKGJvb3QpIG9mIHRoZSBlU0QgYXQgc2VjdG9yIDAuIFRoaXMgc2hvdWxkIF9ub3RfIGJlIGluIHZybDQgZm9ybWF0LgorCisJdnJsNCA8IHpJbWFnZSB8IGRkIG9mPS9kZXYvc2RYIGJzPTUxMgorCitOb3RlOiBUaGUgY29tbWFuZHMgYWJvdmUgYXNzdW1lIHRoYXQgdGhlIHBoeXNpY2FsIHBhcnRpdGlvbiBoYXMgYmVlbgorc3dpdGNoZWQuIE5vIHN1Y2ggZmFjaWxpdHkgY3VycmVudGx5IGV4aXN0cyBpbiB0aGUgTGludXggS2VybmVsLgorCitQaHlzaWNhbCBwYXJ0aXRpb25zIGFyZSBkZXNjcmliZWQgaW4gdGhlIGVTRCBzcGVjaWZpY2F0aW9uLiAgQXQgdGhlIHRpbWUgb2YKK3dyaXRpbmcgdGhleSBhcmUgbm90IHRoZSBzYW1lIGFzIHBhcnRpdGlvbnMgdGhhdCBhcmUgdHlwaWNhbGx5IGNvbmZpZ3VyZWQKK3VzaW5nIGZkaXNrIGFuZCB2aXNpYmxlIHRocm91Z2ggL3Byb2MvcGFydGl0aW9ucwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm0vU2Ftc3VuZy1TM0MyNFhYL092ZXJ2aWV3LnR4dCBiL0RvY3VtZW50YXRpb24vYXJtL1NhbXN1bmctUzNDMjRYWC9PdmVydmlldy50eHQKaW5kZXggYzEyYmZjMS4uMzU5NTg3YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm0vU2Ftc3VuZy1TM0MyNFhYL092ZXJ2aWV3LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9TYW1zdW5nLVMzQzI0WFgvT3ZlcnZpZXcudHh0CkBAIC04LDEwICs4LDEzIEBACiAKICAgVGhlIFNhbXN1bmcgUzNDMjRYWCByYW5nZSBvZiBBUk05IFN5c3RlbS1vbi1DaGlwIENQVXMgYXJlIHN1cHBvcnRlZAogICBieSB0aGUgJ3MzYzI0MTAnIGFyY2hpdGVjdHVyZSBvZiBBUk0gTGludXguIEN1cnJlbnRseSB0aGUgUzNDMjQxMCwKLSAgUzNDMjQxMiwgUzNDMjQxMywgUzNDMjQxNiBTM0MyNDQwLCBTM0MyNDQyLCBTM0MyNDQzIGFuZCBTM0MyNDUwIGRldmljZXMKKyAgUzNDMjQxMiwgUzNDMjQxMywgUzNDMjQxNiwgUzNDMjQ0MCwgUzNDMjQ0MiwgUzNDMjQ0MyBhbmQgUzNDMjQ1MCBkZXZpY2VzCiAgIGFyZSBzdXBwb3J0ZWQuCiAKLSAgU3VwcG9ydCBmb3IgdGhlIFMzQzI0MDAgYW5kIFMzQzI0QTAgc2VyaWVzIGFyZSBpbiBwcm9ncmVzcy4KKyAgU3VwcG9ydCBmb3IgdGhlIFMzQzI0MDAgYW5kIFMzQzI0QTAgc2VyaWVzIHdhcyBuZXZlciBjb21wbGV0ZWQgYW5kIHRoZQorICBjb3JyZXNwb25kaW5nIGNvZGUgaGFzIGJlZW4gcmVtb3ZlZCBhZnRlciBhIHdoaWxlLiAgSWYgc29tZW9uZSB3aXNoZXMgdG8KKyAgcmV2aXZlIHRoaXMgZWZmb3J0LCBwYXJ0aWFsIHN1cHBvcnQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGVhcmxpZXIgTGludXgKKyAgdmVyc2lvbnMuCiAKICAgVGhlIFMzQzI0MTYgYW5kIFMzQzI0NTAgZGV2aWNlcyBhcmUgdmVyeSBzaW1pbGFyIGFuZCBTM0MyNDUwIHN1cHBvcnQgaXMKICAgaW5jbHVkZWQgdW5kZXIgdGhlIGFyY2gvYXJtL21hY2gtczNjMjQxNiBkaXJlY3RvcnkuIE5vdGUsIHdoaWxzdCBjb3JlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS9rZXJuZWxfdXNlcl9oZWxwZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vYXJtL2tlcm5lbF91c2VyX2hlbHBlcnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2RmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2FybS9rZXJuZWxfdXNlcl9oZWxwZXJzLnR4dApAQCAtMCwwICsxLDI2NyBAQAorS2VybmVsLXByb3ZpZGVkIFVzZXIgSGVscGVycworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVzZSBhcmUgc2VnbWVudCBvZiBrZXJuZWwgcHJvdmlkZWQgdXNlciBjb2RlIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UKK2F0IGEgZml4ZWQgYWRkcmVzcyBpbiBrZXJuZWwgbWVtb3J5LiAgVGhpcyBpcyB1c2VkIHRvIHByb3ZpZGUgdXNlciBzcGFjZQord2l0aCBzb21lIG9wZXJhdGlvbnMgd2hpY2ggcmVxdWlyZSBrZXJuZWwgaGVscCBiZWNhdXNlIG9mIHVuaW1wbGVtZW50ZWQKK25hdGl2ZSBmZWF0dXJlIGFuZC9vciBpbnN0cnVjdGlvbnMgaW4gbWFueSBBUk0gQ1BVcy4gVGhlIGlkZWEgaXMgZm9yIHRoaXMKK2NvZGUgdG8gYmUgZXhlY3V0ZWQgZGlyZWN0bHkgaW4gdXNlciBtb2RlIGZvciBiZXN0IGVmZmljaWVuY3kgYnV0IHdoaWNoIGlzCit0b28gaW50aW1hdGUgd2l0aCB0aGUga2VybmVsIGNvdW50ZXIgcGFydCB0byBiZSBsZWZ0IHRvIHVzZXIgbGlicmFyaWVzLgorSW4gZmFjdCB0aGlzIGNvZGUgbWlnaHQgZXZlbiBkaWZmZXIgZnJvbSBvbmUgQ1BVIHRvIGFub3RoZXIgZGVwZW5kaW5nIG9uCit0aGUgYXZhaWxhYmxlIGluc3RydWN0aW9uIHNldCwgb3Igd2hldGhlciBpdCBpcyBhIFNNUCBzeXN0ZW1zLiBJbiBvdGhlcgord29yZHMsIHRoZSBrZXJuZWwgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIGNoYW5nZSB0aGlzIGNvZGUgYXMgbmVlZGVkIHdpdGhvdXQKK3dhcm5pbmcuIE9ubHkgdGhlIGVudHJ5IHBvaW50cyBhbmQgdGhlaXIgcmVzdWx0cyBhcyBkb2N1bWVudGVkIGhlcmUgYXJlCitndWFyYW50ZWVkIHRvIGJlIHN0YWJsZS4KKworVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSAoYnV0IGRvZXNuJ3QgcHJlY2x1ZGUpIGEgZnVsbCBibG93biBWRFNPCitpbXBsZW1lbnRhdGlvbiwgaG93ZXZlciBhIFZEU08gd291bGQgcHJldmVudCBzb21lIGFzc2VtYmx5IHRyaWNrcyB3aXRoCitjb25zdGFudHMgdGhhdCBhbGxvd3MgZm9yIGVmZmljaWVudCBicmFuY2hpbmcgdG8gdGhvc2UgY29kZSBzZWdtZW50cy4gQW5kCitzaW5jZSB0aG9zZSBjb2RlIHNlZ21lbnRzIG9ubHkgdXNlIGEgZmV3IGN5Y2xlcyBiZWZvcmUgcmV0dXJuaW5nIHRvIHVzZXIKK2NvZGUsIHRoZSBvdmVyaGVhZCBvZiBhIFZEU08gaW5kaXJlY3QgZmFyIGNhbGwgd291bGQgYWRkIGEgbWVhc3VyYWJsZQorb3ZlcmhlYWQgdG8gc3VjaCBtaW5pbWFsaXN0aWMgb3BlcmF0aW9ucy4KKworVXNlciBzcGFjZSBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhvc2UgaGVscGVycyBhbmQgaW1wbGVtZW50IHRob3NlIHRoaW5ncworaW5saW5lIChlaXRoZXIgaW4gdGhlIGNvZGUgZW1pdHRlZCBkaXJlY3RseSBieSB0aGUgY29tcGlsZXIsIG9yIHBhcnQgb2YKK3RoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGxpYnJhcnkgY2FsbCkgd2hlbiBvcHRpbWl6aW5nIGZvciBhIHJlY2VudCBlbm91Z2gKK3Byb2Nlc3NvciB0aGF0IGhhcyB0aGUgbmVjZXNzYXJ5IG5hdGl2ZSBzdXBwb3J0LCBidXQgb25seSBpZiByZXN1bHRpbmcKK2JpbmFyaWVzIGFyZSBhbHJlYWR5IHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgQVJNIHByb2Nlc3NvcnMgZHVlIHRvCit1c2VhZ2Ugb2Ygc2ltaWxhciBuYXRpdmUgaW5zdHJ1Y3Rpb25zIGZvciBvdGhlciB0aGluZ3MuICBJbiBvdGhlciB3b3JkcworZG9uJ3QgbWFrZSBiaW5hcmllcyB1bmFibGUgdG8gcnVuIG9uIGVhcmxpZXIgcHJvY2Vzc29ycyBqdXN0IGZvciB0aGUgc2FrZQorb2Ygbm90IHVzaW5nIHRoZXNlIGtlcm5lbCBoZWxwZXJzIGlmIHlvdXIgY29tcGlsZWQgY29kZSBpcyBub3QgZ29pbmcgdG8KK3VzZSBuZXcgaW5zdHJ1Y3Rpb25zIGZvciBvdGhlciBwdXJwb3NlLgorCitOZXcgaGVscGVycyBtYXkgYmUgYWRkZWQgb3ZlciB0aW1lLCBzbyBhbiBvbGRlciBrZXJuZWwgbWF5IGJlIG1pc3Npbmcgc29tZQoraGVscGVycyBwcmVzZW50IGluIGEgbmV3ZXIga2VybmVsLiAgRm9yIHRoaXMgcmVhc29uLCBwcm9ncmFtcyBtdXN0IGNoZWNrCit0aGUgdmFsdWUgb2YgX19rdXNlcl9oZWxwZXJfdmVyc2lvbiAoc2VlIGJlbG93KSBiZWZvcmUgYXNzdW1pbmcgdGhhdCBpdCBpcworc2FmZSB0byBjYWxsIGFueSBwYXJ0aWN1bGFyIGhlbHBlci4gIFRoaXMgY2hlY2sgc2hvdWxkIGlkZWFsbHkgYmUKK3BlcmZvcm1lZCBvbmx5IG9uY2UgYXQgcHJvY2VzcyBzdGFydHVwIHRpbWUsIGFuZCBleGVjdXRpb24gYWJvcnRlZCBlYXJseQoraWYgdGhlIHJlcXVpcmVkIGhlbHBlcnMgYXJlIG5vdCBwcm92aWRlZCBieSB0aGUga2VybmVsIHZlcnNpb24gdGhhdAorcHJvY2VzcyBpcyBydW5uaW5nIG9uLgorCitrdXNlcl9oZWxwZXJfdmVyc2lvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTG9jYXRpb246CTB4ZmZmZjBmZmMKKworUmVmZXJlbmNlIGRlY2xhcmF0aW9uOgorCisgIGV4dGVybiBpbnQzMl90IF9fa3VzZXJfaGVscGVyX3ZlcnNpb247CisKK0RlZmluaXRpb246CisKKyAgVGhpcyBmaWVsZCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGhlbHBlcnMgYmVpbmcgaW1wbGVtZW50ZWQgYnkgdGhlCisgIHJ1bm5pbmcga2VybmVsLiAgVXNlciBzcGFjZSBtYXkgcmVhZCB0aGlzIHRvIGRldGVybWluZSB0aGUgYXZhaWxhYmlsaXR5CisgIG9mIGEgcGFydGljdWxhciBoZWxwZXIuCisKK1VzYWdlIGV4YW1wbGU6CisKKyNkZWZpbmUgX19rdXNlcl9oZWxwZXJfdmVyc2lvbiAoKihpbnQzMl90ICopMHhmZmZmMGZmYykKKwordm9pZCBjaGVja19rdXNlcl92ZXJzaW9uKHZvaWQpCit7CisJaWYgKF9fa3VzZXJfaGVscGVyX3ZlcnNpb24gPCAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY2FuJ3QgZG8gYXRvbWljIG9wZXJhdGlvbnMsIGtlcm5lbCB0b28gb2xkXG4iKTsKKwkJYWJvcnQoKTsKKwl9Cit9CisKK05vdGVzOgorCisgIFVzZXIgc3BhY2UgbWF5IGFzc3VtZSB0aGF0IHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIG5ldmVyIGNoYW5nZXMKKyAgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbnkgc2luZ2xlIHByb2Nlc3MuICBUaGlzIG1lYW5zIHRoYXQgdGhpcworICBmaWVsZCBjYW4gYmUgcmVhZCBvbmNlIGR1cmluZyB0aGUgaW5pdGlhbGlzYXRpb24gb2YgYSBsaWJyYXJ5IG9yCisgIHN0YXJ0dXAgcGhhc2Ugb2YgYSBwcm9ncmFtLgorCitrdXNlcl9nZXRfdGxzCistLS0tLS0tLS0tLS0tCisKK0xvY2F0aW9uOgkweGZmZmYwZmUwCisKK1JlZmVyZW5jZSBwcm90b3R5cGU6CisKKyAgdm9pZCAqIF9fa3VzZXJfZ2V0X3Rscyh2b2lkKTsKKworSW5wdXQ6CisKKyAgbHIgPSByZXR1cm4gYWRkcmVzcworCitPdXRwdXQ6CisKKyAgcjAgPSBUTFMgdmFsdWUKKworQ2xvYmJlcmVkIHJlZ2lzdGVyczoKKworICBub25lCisKK0RlZmluaXRpb246CisKKyAgR2V0IHRoZSBUTFMgdmFsdWUgYXMgcHJldmlvdXNseSBzZXQgdmlhIHRoZSBfX0FSTV9OUl9zZXRfdGxzIHN5c2NhbGwuCisKK1VzYWdlIGV4YW1wbGU6CisKK3R5cGVkZWYgdm9pZCAqIChfX2t1c2VyX2dldF90bHNfdCkodm9pZCk7CisjZGVmaW5lIF9fa3VzZXJfZ2V0X3RscyAoKihfX2t1c2VyX2dldF90bHNfdCAqKTB4ZmZmZjBmZTApCisKK3ZvaWQgZm9vKCkKK3sKKwl2b2lkICp0bHMgPSBfX2t1c2VyX2dldF90bHMoKTsKKwlwcmludGYoIlRMUyA9ICVwXG4iLCB0bHMpOworfQorCitOb3RlczoKKworICAtIFZhbGlkIG9ubHkgaWYgX19rdXNlcl9oZWxwZXJfdmVyc2lvbiA+PSAxIChmcm9tIGtlcm5lbCB2ZXJzaW9uIDIuNi4xMikuCisKK2t1c2VyX2NtcHhjaGcKKy0tLS0tLS0tLS0tLS0KKworTG9jYXRpb246CTB4ZmZmZjBmYzAKKworUmVmZXJlbmNlIHByb3RvdHlwZToKKworICBpbnQgX19rdXNlcl9jbXB4Y2hnKGludDMyX3Qgb2xkdmFsLCBpbnQzMl90IG5ld3ZhbCwgdm9sYXRpbGUgaW50MzJfdCAqcHRyKTsKKworSW5wdXQ6CisKKyAgcjAgPSBvbGR2YWwKKyAgcjEgPSBuZXd2YWwKKyAgcjIgPSBwdHIKKyAgbHIgPSByZXR1cm4gYWRkcmVzcworCitPdXRwdXQ6CisKKyAgcjAgPSBzdWNjZXNzIGNvZGUgKHplcm8gb3Igbm9uLXplcm8pCisgIEMgZmxhZyA9IHNldCBpZiByMCA9PSAwLCBjbGVhciBpZiByMCAhPSAwCisKK0Nsb2JiZXJlZCByZWdpc3RlcnM6CisKKyAgcjMsIGlwLCBmbGFncworCitEZWZpbml0aW9uOgorCisgIEF0b21pY2FsbHkgc3RvcmUgbmV3dmFsIGluICpwdHIgb25seSBpZiAqcHRyIGlzIGVxdWFsIHRvIG9sZHZhbC4KKyAgUmV0dXJuIHplcm8gaWYgKnB0ciB3YXMgY2hhbmdlZCBvciBub24temVybyBpZiBubyBleGNoYW5nZSBoYXBwZW5lZC4KKyAgVGhlIEMgZmxhZyBpcyBhbHNvIHNldCBpZiAqcHRyIHdhcyBjaGFuZ2VkIHRvIGFsbG93IGZvciBhc3NlbWJseQorICBvcHRpbWl6YXRpb24gaW4gdGhlIGNhbGxpbmcgY29kZS4KKworVXNhZ2UgZXhhbXBsZToKKwordHlwZWRlZiBpbnQgKF9fa3VzZXJfY21weGNoZ190KShpbnQgb2xkdmFsLCBpbnQgbmV3dmFsLCB2b2xhdGlsZSBpbnQgKnB0cik7CisjZGVmaW5lIF9fa3VzZXJfY21weGNoZyAoKihfX2t1c2VyX2NtcHhjaGdfdCAqKTB4ZmZmZjBmYzApCisKK2ludCBhdG9taWNfYWRkKHZvbGF0aWxlIGludCAqcHRyLCBpbnQgdmFsKQoreworCWludCBvbGQsIG5ldzsKKworCWRvIHsKKwkJb2xkID0gKnB0cjsKKwkJbmV3ID0gb2xkICsgdmFsOworCX0gd2hpbGUoX19rdXNlcl9jbXB4Y2hnKG9sZCwgbmV3LCBwdHIpKTsKKworCXJldHVybiBuZXc7Cit9CisKK05vdGVzOgorCisgIC0gVGhpcyByb3V0aW5lIGFscmVhZHkgaW5jbHVkZXMgbWVtb3J5IGJhcnJpZXJzIGFzIG5lZWRlZC4KKworICAtIFZhbGlkIG9ubHkgaWYgX19rdXNlcl9oZWxwZXJfdmVyc2lvbiA+PSAyIChmcm9tIGtlcm5lbCB2ZXJzaW9uIDIuNi4xMikuCisKK2t1c2VyX21lbW9yeV9iYXJyaWVyCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMb2NhdGlvbjoJMHhmZmZmMGZhMAorCitSZWZlcmVuY2UgcHJvdG90eXBlOgorCisgIHZvaWQgX19rdXNlcl9tZW1vcnlfYmFycmllcih2b2lkKTsKKworSW5wdXQ6CisKKyAgbHIgPSByZXR1cm4gYWRkcmVzcworCitPdXRwdXQ6CisKKyAgbm9uZQorCitDbG9iYmVyZWQgcmVnaXN0ZXJzOgorCisgIG5vbmUKKworRGVmaW5pdGlvbjoKKworICBBcHBseSBhbnkgbmVlZGVkIG1lbW9yeSBiYXJyaWVyIHRvIHByZXNlcnZlIGNvbnNpc3RlbmN5IHdpdGggZGF0YSBtb2RpZmllZAorICBtYW51YWxseSBhbmQgX19rdXNlcl9jbXB4Y2hnIHVzYWdlLgorCitVc2FnZSBleGFtcGxlOgorCit0eXBlZGVmIHZvaWQgKF9fa3VzZXJfZG1iX3QpKHZvaWQpOworI2RlZmluZSBfX2t1c2VyX2RtYiAoKihfX2t1c2VyX2RtYl90ICopMHhmZmZmMGZhMCkKKworTm90ZXM6CisKKyAgLSBWYWxpZCBvbmx5IGlmIF9fa3VzZXJfaGVscGVyX3ZlcnNpb24gPj0gMyAoZnJvbSBrZXJuZWwgdmVyc2lvbiAyLjYuMTUpLgorCitrdXNlcl9jbXB4Y2hnNjQKKy0tLS0tLS0tLS0tLS0tLQorCitMb2NhdGlvbjoJMHhmZmZmMGY2MAorCitSZWZlcmVuY2UgcHJvdG90eXBlOgorCisgIGludCBfX2t1c2VyX2NtcHhjaGc2NChjb25zdCBpbnQ2NF90ICpvbGR2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90ICpuZXd2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBpbnQ2NF90ICpwdHIpOworCitJbnB1dDoKKworICByMCA9IHBvaW50ZXIgdG8gb2xkdmFsCisgIHIxID0gcG9pbnRlciB0byBuZXd2YWwKKyAgcjIgPSBwb2ludGVyIHRvIHRhcmdldCB2YWx1ZQorICBsciA9IHJldHVybiBhZGRyZXNzCisKK091dHB1dDoKKworICByMCA9IHN1Y2Nlc3MgY29kZSAoemVybyBvciBub24temVybykKKyAgQyBmbGFnID0gc2V0IGlmIHIwID09IDAsIGNsZWFyIGlmIHIwICE9IDAKKworQ2xvYmJlcmVkIHJlZ2lzdGVyczoKKworICByMywgbHIsIGZsYWdzCisKK0RlZmluaXRpb246CisKKyAgQXRvbWljYWxseSBzdG9yZSB0aGUgNjQtYml0IHZhbHVlIHBvaW50ZWQgYnkgKm5ld3ZhbCBpbiAqcHRyIG9ubHkgaWYgKnB0cgorICBpcyBlcXVhbCB0byB0aGUgNjQtYml0IHZhbHVlIHBvaW50ZWQgYnkgKm9sZHZhbC4gIFJldHVybiB6ZXJvIGlmICpwdHIgd2FzCisgIGNoYW5nZWQgb3Igbm9uLXplcm8gaWYgbm8gZXhjaGFuZ2UgaGFwcGVuZWQuCisKKyAgVGhlIEMgZmxhZyBpcyBhbHNvIHNldCBpZiAqcHRyIHdhcyBjaGFuZ2VkIHRvIGFsbG93IGZvciBhc3NlbWJseQorICBvcHRpbWl6YXRpb24gaW4gdGhlIGNhbGxpbmcgY29kZS4KKworVXNhZ2UgZXhhbXBsZToKKwordHlwZWRlZiBpbnQgKF9fa3VzZXJfY21weGNoZzY0X3QpKGNvbnN0IGludDY0X3QgKm9sZHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90ICpuZXd2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaW50NjRfdCAqcHRyKTsKKyNkZWZpbmUgX19rdXNlcl9jbXB4Y2hnNjQgKCooX19rdXNlcl9jbXB4Y2hnNjRfdCAqKTB4ZmZmZjBmNjApCisKK2ludDY0X3QgYXRvbWljX2FkZDY0KHZvbGF0aWxlIGludDY0X3QgKnB0ciwgaW50NjRfdCB2YWwpCit7CisJaW50NjRfdCBvbGQsIG5ldzsKKworCWRvIHsKKwkJb2xkID0gKnB0cjsKKwkJbmV3ID0gb2xkICsgdmFsOworCX0gd2hpbGUoX19rdXNlcl9jbXB4Y2hnNjQoJm9sZCwgJm5ldywgcHRyKSk7CisKKwlyZXR1cm4gbmV3OworfQorCitOb3RlczoKKworICAtIFRoaXMgcm91dGluZSBhbHJlYWR5IGluY2x1ZGVzIG1lbW9yeSBiYXJyaWVycyBhcyBuZWVkZWQuCisKKyAgLSBEdWUgdG8gdGhlIGxlbmd0aCBvZiB0aGlzIHNlcXVlbmNlLCB0aGlzIHNwYW5zIDIgY29udmVudGlvbmFsIGt1c2VyCisgICAgInNsb3RzIiwgdGhlcmVmb3JlIDB4ZmZmZjBmODAgaXMgbm90IHVzZWQgYXMgYSB2YWxpZCBlbnRyeSBwb2ludC4KKworICAtIFZhbGlkIG9ubHkgaWYgX19rdXNlcl9oZWxwZXJfdmVyc2lvbiA+PSA1IChmcm9tIGtlcm5lbCB2ZXJzaW9uIDMuMSkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2JsYWNrZmluL2JmaW4tc3BpLW5vdGVzLnR4dCBiL0RvY3VtZW50YXRpb24vYmxhY2tmaW4vYmZpbi1zcGktbm90ZXMudHh0CmluZGV4IDU1NmZhODcuLmVhZTZlYWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmxhY2tmaW4vYmZpbi1zcGktbm90ZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vYmxhY2tmaW4vYmZpbi1zcGktbm90ZXMudHh0CkBAIC05LDYgKzksOCBAQAogSW4gbW9zdCBjYXNlcyB5b3UgY2FuIHV0aWxpemUgU1BJIE1PREVfMyBpbnN0ZWFkIG9mIE1PREVfMCB0byB3b3JrLWFyb3VuZCB0aGlzCiBiZWhhdmlvci4gSWYgeW91ciBTUEkgc2xhdmUgZGV2aWNlIGluIHF1ZXN0aW9uIHJlcXVpcmVzIFNQSSBNT0RFXzAgb3IgTU9ERV8yCiB0aW1pbmcsIHlvdSBjYW4gdXRpbGl6ZSB0aGUgR1BJTyBjb250cm9sbGVkIFNQSSBTbGF2ZSBTZWxlY3Qgb3B0aW9uIGluc3RlYWQuCitJbiB0aGlzIGNhc2UsIHlvdSBzaG91bGQgdXNlIEdQSU8gYmFzZWQgQ1MgZm9yIGFsbCBvZiB5b3VyIHNsYXZlcyBhbmQgbm90IGp1c3QKK3RoZSBvbmVzIHVzaW5nIG1vZGUgMCBvciAyIGluIG9yZGVyIHRvIGd1YXJhbnRlZSBjb3JyZWN0IENTIHRvZ2dsaW5nIGJlaGF2aW9yLgogCiBZb3UgY2FuIGV2ZW4gdXNlIHRoZSBzYW1lIHBpbiB3aG9zZSBwZXJpcGhlcmFsIHJvbGUgaXMgYSBTU0VMLAogYnV0IHVzZSBpdCBhcyBhIEdQSU8gaW5zdGVhZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxvY2svcXVldWUtc3lzZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9ibG9jay9xdWV1ZS1zeXNmcy50eHQKaW5kZXggZjY1Mjc0MC4uZDgxNDdiMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ibG9jay9xdWV1ZS1zeXNmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ibG9jay9xdWV1ZS1zeXNmcy50eHQKQEAgLTQ1LDkgKzQ1LDEzIEBACiAKIHJxX2FmZmluaXR5IChSVykKIC0tLS0tLS0tLS0tLS0tLS0KLUlmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoZSBibG9jayBsYXllciB3aWxsIG1pZ3JhdGUgcmVxdWVzdCBjb21wbGV0aW9ucwotdG8gdGhlIENQVSB0aGF0IG9yaWdpbmFsbHkgc3VibWl0dGVkIHRoZSByZXF1ZXN0LiBGb3Igc29tZSB3b3JrbG9hZHMKLXRoaXMgcHJvdmlkZXMgYSBzaWduaWZpY2FudCByZWR1Y3Rpb24gaW4gQ1BVIGN5Y2xlcyBkdWUgdG8gY2FjaGluZyBlZmZlY3RzLgorSWYgdGhpcyBvcHRpb24gaXMgJzEnLCB0aGUgYmxvY2sgbGF5ZXIgd2lsbCBtaWdyYXRlIHJlcXVlc3QgY29tcGxldGlvbnMgdG8gdGhlCitjcHUgImdyb3VwIiB0aGF0IG9yaWdpbmFsbHkgc3VibWl0dGVkIHRoZSByZXF1ZXN0LiBGb3Igc29tZSB3b3JrbG9hZHMgdGhpcworcHJvdmlkZXMgYSBzaWduaWZpY2FudCByZWR1Y3Rpb24gaW4gQ1BVIGN5Y2xlcyBkdWUgdG8gY2FjaGluZyBlZmZlY3RzLgorCitGb3Igc3RvcmFnZSBjb25maWd1cmF0aW9ucyB0aGF0IG5lZWQgdG8gbWF4aW1pemUgZGlzdHJpYnV0aW9uIG9mIGNvbXBsZXRpb24KK3Byb2Nlc3Npbmcgc2V0dGluZyB0aGlzIG9wdGlvbiB0byAnMicgZm9yY2VzIHRoZSBjb21wbGV0aW9uIHRvIHJ1biBvbiB0aGUKK3JlcXVlc3RpbmcgY3B1IChieXBhc3NpbmcgdGhlICJncm91cCIgYWdncmVnYXRpb24gbG9naWMpLgogCiBzY2hlZHVsZXIgKFJXKQogLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxvY2tkZXYvUkVBRE1FLkRBQzk2MCBiL0RvY3VtZW50YXRpb24vYmxvY2tkZXYvUkVBRE1FLkRBQzk2MAppbmRleCAwZThmNjE4Li5iZDg1ZmI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L1JFQURNRS5EQUM5NjAKKysrIGIvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi9SRUFETUUuREFDOTYwCkBAIC0yMTQsNyArMjE0LDcgQEAKICAgbWFrZSBjb25maWcKICAgbWFrZSBiekltYWdlIChvciB6SW1hZ2UpCiAKLVRoZW4gaW5zdGFsbCAiYXJjaC9pMzg2L2Jvb3QvYnpJbWFnZSIgb3IgImFyY2gvaTM4Ni9ib290L3pJbWFnZSIgYXMgeW91cgorVGhlbiBpbnN0YWxsICJhcmNoL3g4Ni9ib290L2J6SW1hZ2UiIG9yICJhcmNoL3g4Ni9ib290L3pJbWFnZSIgYXMgeW91cgogc3RhbmRhcmQga2VybmVsLCBydW4gbGlsbyBpZiBhcHByb3ByaWF0ZSwgYW5kIHJlYm9vdC4KIAogVG8gY3JlYXRlIHRoZSBuZWNlc3NhcnkgZGV2aWNlcyBpbiAvZGV2LCB0aGUgIm1ha2VfcmQiIHNjcmlwdCBpbmNsdWRlZCBpbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi9yYW1kaXNrLnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2tkZXYvcmFtZGlzay50eHQKaW5kZXggNmM4MjBiYS4uZmE3MmU5NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi9yYW1kaXNrLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L3JhbWRpc2sudHh0CkBAIC02NCw5ICs2NCw5IEBACiBpcyBub3QgcmVxdWlyZWQuIEJpdHMgMTEgdG8gMTMgYXJlIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgbWF5IGFzIHdlbGwgYmUgemVyby4KIFRoZXNlIG51bWJlcnMgYXJlIG5vIG1hZ2ljYWwgc2VjcmV0cywgYXMgc2VlbiBiZWxvdzoKIAotLi9hcmNoL2kzODYva2VybmVsL3NldHVwLmM6I2RlZmluZSBSQU1ESVNLX0lNQUdFX1NUQVJUX01BU0sgICAgIDB4MDdGRgotLi9hcmNoL2kzODYva2VybmVsL3NldHVwLmM6I2RlZmluZSBSQU1ESVNLX1BST01QVF9GTEFHICAgICAgICAgIDB4ODAwMAotLi9hcmNoL2kzODYva2VybmVsL3NldHVwLmM6I2RlZmluZSBSQU1ESVNLX0xPQURfRkxBRyAgICAgICAgICAgIDB4NDAwMAorLi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYzojZGVmaW5lIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSyAgICAgMHgwN0ZGCisuL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jOiNkZWZpbmUgUkFNRElTS19QUk9NUFRfRkxBRyAgICAgICAgICAweDgwMDAKKy4vYXJjaC94ODYva2VybmVsL3NldHVwLmM6I2RlZmluZSBSQU1ESVNLX0xPQURfRkxBRyAgICAgICAgICAgIDB4NDAwMAogCiBDb25zaWRlciBhIHR5cGljYWwgdHdvIGZsb3BweSBkaXNrIHNldHVwLCB3aGVyZSB5b3Ugd2lsbCBoYXZlIHRoZQoga2VybmVsIG9uIGRpc2sgb25lLCBhbmQgaGF2ZSBhbHJlYWR5IHB1dCBhIFJBTSBkaXNrIGltYWdlIG9udG8gZGlzayAjMi4KQEAgLTg1LDcgKzg1LDcgQEAKIFB1dHRpbmcgdGhhdCB0b2dldGhlciBnaXZlcyAyXjE1ICsgMl4xNCArIDAgPSA0OTE1MiBmb3IgYW4gcmRldiB3b3JkLgogU28gdG8gY3JlYXRlIGRpc2sgb25lIG9mIHRoZSBzZXQsIHlvdSB3b3VsZCBkbzoKIAotCS91c3Ivc3JjL2xpbnV4IyBjYXQgYXJjaC9pMzg2L2Jvb3QvekltYWdlID4gL2Rldi9mZDAKKwkvdXNyL3NyYy9saW51eCMgY2F0IGFyY2gveDg2L2Jvb3QvekltYWdlID4gL2Rldi9mZDAKIAkvdXNyL3NyYy9saW51eCMgcmRldiAvZGV2L2ZkMCAvZGV2L2ZkMAogCS91c3Ivc3JjL2xpbnV4IyByZGV2IC1yIC9kZXYvZmQwIDQ5MTUyCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9ibGtpby1jb250cm9sbGVyLnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9ibGtpby1jb250cm9sbGVyLnR4dAppbmRleCA0NjUzNTFkLi44NGYwYTE1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvYmxraW8tY29udHJvbGxlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Jsa2lvLWNvbnRyb2xsZXIudHh0CkBAIC0yOCwxNiArMjgsMTkgQEAKIC0gRW5hYmxlIGdyb3VwIHNjaGVkdWxpbmcgaW4gQ0ZRCiAJQ09ORklHX0NGUV9HUk9VUF9JT1NDSEVEPXkKIAotLSBDb21waWxlIGFuZCBib290IGludG8ga2VybmVsIGFuZCBtb3VudCBJTyBjb250cm9sbGVyIChibGtpbykuCistIENvbXBpbGUgYW5kIGJvb3QgaW50byBrZXJuZWwgYW5kIG1vdW50IElPIGNvbnRyb2xsZXIgKGJsa2lvKTsgc2VlCisgIGNncm91cHMudHh0LCBXaHkgYXJlIGNncm91cHMgbmVlZGVkPy4KIAotCW1vdW50IC10IGNncm91cCAtbyBibGtpbyBub25lIC9jZ3JvdXAKKwltb3VudCAtdCB0bXBmcyBjZ3JvdXBfcm9vdCAvc3lzL2ZzL2Nncm91cAorCW1rZGlyIC9zeXMvZnMvY2dyb3VwL2Jsa2lvCisJbW91bnQgLXQgY2dyb3VwIC1vIGJsa2lvIG5vbmUgL3N5cy9mcy9jZ3JvdXAvYmxraW8KIAogLSBDcmVhdGUgdHdvIGNncm91cHMKLQlta2RpciAtcCAvY2dyb3VwL3Rlc3QxLyAvY2dyb3VwL3Rlc3QyCisJbWtkaXIgLXAgL3N5cy9mcy9jZ3JvdXAvYmxraW8vdGVzdDEvIC9zeXMvZnMvY2dyb3VwL2Jsa2lvL3Rlc3QyCiAKIC0gU2V0IHdlaWdodHMgb2YgZ3JvdXAgdGVzdDEgYW5kIHRlc3QyCi0JZWNobyAxMDAwID4gL2Nncm91cC90ZXN0MS9ibGtpby53ZWlnaHQKLQllY2hvIDUwMCA+IC9jZ3JvdXAvdGVzdDIvYmxraW8ud2VpZ2h0CisJZWNobyAxMDAwID4gL3N5cy9mcy9jZ3JvdXAvYmxraW8vdGVzdDEvYmxraW8ud2VpZ2h0CisJZWNobyA1MDAgPiAvc3lzL2ZzL2Nncm91cC9ibGtpby90ZXN0Mi9ibGtpby53ZWlnaHQKIAogLSBDcmVhdGUgdHdvIHNhbWUgc2l6ZSBmaWxlcyAoc2F5IDUxMk1CIGVhY2gpIG9uIHNhbWUgZGlzayAoZmlsZTEsIGZpbGUyKSBhbmQKICAgbGF1bmNoIHR3byBkZCB0aHJlYWRzIGluIGRpZmZlcmVudCBjZ3JvdXAgdG8gcmVhZCB0aG9zZSBmaWxlcy4KQEAgLTQ2LDEyICs0OSwxMiBAQAogCWVjaG8gMyA+IC9wcm9jL3N5cy92bS9kcm9wX2NhY2hlcwogCiAJZGQgaWY9L21udC9zZGIvemVyb2ZpbGUxIG9mPS9kZXYvbnVsbCAmCi0JZWNobyAkISA+IC9jZ3JvdXAvdGVzdDEvdGFza3MKLQljYXQgL2Nncm91cC90ZXN0MS90YXNrcworCWVjaG8gJCEgPiAvc3lzL2ZzL2Nncm91cC9ibGtpby90ZXN0MS90YXNrcworCWNhdCAvc3lzL2ZzL2Nncm91cC9ibGtpby90ZXN0MS90YXNrcwogCiAJZGQgaWY9L21udC9zZGIvemVyb2ZpbGUyIG9mPS9kZXYvbnVsbCAmCi0JZWNobyAkISA+IC9jZ3JvdXAvdGVzdDIvdGFza3MKLQljYXQgL2Nncm91cC90ZXN0Mi90YXNrcworCWVjaG8gJCEgPiAvc3lzL2ZzL2Nncm91cC9ibGtpby90ZXN0Mi90YXNrcworCWNhdCAvc3lzL2ZzL2Nncm91cC9ibGtpby90ZXN0Mi90YXNrcwogCiAtIEF0IG1hY3JvIGxldmVsLCBmaXJzdCBkZCBzaG91bGQgZmluaXNoIGZpcnN0LiBUbyBnZXQgbW9yZSBwcmVjaXNlIGRhdGEsIGtlZXAKICAgb24gbG9va2luZyBhdCAod2l0aCB0aGUgaGVscCBvZiBzY3JpcHQpLCBhdCBibGtpby5kaXNrX3RpbWUgYW5kCkBAIC02OCwxMyArNzEsMTMgQEAKIC0gRW5hYmxlIHRocm90dGxpbmcgaW4gYmxvY2sgbGF5ZXIKIAlDT05GSUdfQkxLX0RFVl9USFJPVFRMSU5HPXkKIAotLSBNb3VudCBibGtpbyBjb250cm9sbGVyCi0gICAgICAgIG1vdW50IC10IGNncm91cCAtbyBibGtpbyBub25lIC9jZ3JvdXAvYmxraW8KKy0gTW91bnQgYmxraW8gY29udHJvbGxlciAoc2VlIGNncm91cHMudHh0LCBXaHkgYXJlIGNncm91cHMgbmVlZGVkPykKKyAgICAgICAgbW91bnQgLXQgY2dyb3VwIC1vIGJsa2lvIG5vbmUgL3N5cy9mcy9jZ3JvdXAvYmxraW8KIAogLSBTcGVjaWZ5IGEgYmFuZHdpZHRoIHJhdGUgb24gcGFydGljdWxhciBkZXZpY2UgZm9yIHJvb3QgZ3JvdXAuIFRoZSBmb3JtYXQKICAgZm9yIHBvbGljeSBpcyAiPG1ham9yPjo8bWlub3I+ICA8Ynllc19wZXJfc2Vjb25kPiIuCiAKLSAgICAgICAgZWNobyAiODoxNiAgMTA0ODU3NiIgPiAvY2dyb3VwL2Jsa2lvL2Jsa2lvLnJlYWRfYnBzX2RldmljZQorICAgICAgICBlY2hvICI4OjE2ICAxMDQ4NTc2IiA+IC9zeXMvZnMvY2dyb3VwL2Jsa2lvL2Jsa2lvLnRocm90dGxlLnJlYWRfYnBzX2RldmljZQogCiAgIEFib3ZlIHdpbGwgcHV0IGEgbGltaXQgb2YgMU1CL3NlY29uZCBvbiByZWFkcyBoYXBwZW5pbmcgZm9yIHJvb3QgZ3JvdXAKICAgb24gZGV2aWNlIGhhdmluZyBtYWpvci9taW5vciBudW1iZXIgODoxNi4KQEAgLTg3LDcgKzkwLDcgQEAKICAgICAgICAgMTAyNCswIHJlY29yZHMgb3V0CiAgICAgICAgIDQxOTQzMDQgYnl0ZXMgKDQuMiBNQikgY29waWVkLCA0LjAwMDEgcywgMS4wIE1CL3MKIAotIExpbWl0cyBmb3Igd3JpdGVzIGNhbiBiZSBwdXQgdXNpbmcgYmxraW8ud3JpdGVfYnBzX2RldmljZSBmaWxlLgorIExpbWl0cyBmb3Igd3JpdGVzIGNhbiBiZSBwdXQgdXNpbmcgYmxraW8udGhyb3R0bGUud3JpdGVfYnBzX2RldmljZSBmaWxlLgogCiBIaWVyYXJjaGljYWwgQ2dyb3VwcwogPT09PT09PT09PT09PT09PT09PT0KQEAgLTEwOCw3ICsxMTEsNyBAQAogICBDRlEgYW5kIHRocm90dGxpbmcgd2lsbCBwcmFjdGljYWxseSB0cmVhdCBhbGwgZ3JvdXBzIGF0IHNhbWUgbGV2ZWwuCiAKIAkJCQlwaXZvdAotCQkJICAgICAvICB8ICAgXCAgXAorCQkJICAgICAvICAvICAgXCAgXAogCQkJcm9vdCAgdGVzdDEgdGVzdDIgIHRlc3QzCiAKICAgRG93biB0aGUgbGluZSB3ZSBjYW4gaW1wbGVtZW50IGhpZXJhcmNoaWNhbCBhY2NvdW50aW5nL2NvbnRyb2wgc3VwcG9ydApAQCAtMTQ5LDcgKzE1Miw3IEBACiAKIAkgIEZvbGxvd2luZyBpcyB0aGUgZm9ybWF0LgogCi0JICAjZWNobyBkZXZfbWFqOmRldl9taW5vciB3ZWlnaHQgPiAvcGF0aC90by9jZ3JvdXAvYmxraW8ud2VpZ2h0X2RldmljZQorCSAgIyBlY2hvIGRldl9tYWo6ZGV2X21pbm9yIHdlaWdodCA+IGJsa2lvLndlaWdodF9kZXZpY2UKIAkgIENvbmZpZ3VyZSB3ZWlnaHQ9MzAwIG9uIC9kZXYvc2RiICg4OjE2KSBpbiB0aGlzIGNncm91cAogCSAgIyBlY2hvIDg6MTYgMzAwID4gYmxraW8ud2VpZ2h0X2RldmljZQogCSAgIyBjYXQgYmxraW8ud2VpZ2h0X2RldmljZQpAQCAtMjgzLDI4ICsyODYsMjggQEAKIAkgIHNwZWNpZmllZCBpbiBieXRlcyBwZXIgc2Vjb25kLiBSdWxlcyBhcmUgcGVyIGRlaXZjZS4gRm9sbG93aW5nIGlzCiAJICB0aGUgZm9ybWF0LgogCi0gIGVjaG8gIjxtYWpvcj46PG1pbm9yPiAgPHJhdGVfYnl0ZXNfcGVyX3NlY29uZD4iID4gL2NncnAvYmxraW8ucmVhZF9icHNfZGV2aWNlCisgIGVjaG8gIjxtYWpvcj46PG1pbm9yPiAgPHJhdGVfYnl0ZXNfcGVyX3NlY29uZD4iID4gL2NncnAvYmxraW8udGhyb3R0bGUucmVhZF9icHNfZGV2aWNlCiAKIC0gYmxraW8udGhyb3R0bGUud3JpdGVfYnBzX2RldmljZQogCS0gU3BlY2lmaWVzIHVwcGVyIGxpbWl0IG9uIFdSSVRFIHJhdGUgdG8gdGhlIGRldmljZS4gSU8gcmF0ZSBpcwogCSAgc3BlY2lmaWVkIGluIGJ5dGVzIHBlciBzZWNvbmQuIFJ1bGVzIGFyZSBwZXIgZGVpdmNlLiBGb2xsb3dpbmcgaXMKIAkgIHRoZSBmb3JtYXQuCiAKLSAgZWNobyAiPG1ham9yPjo8bWlub3I+ICA8cmF0ZV9ieXRlc19wZXJfc2Vjb25kPiIgPiAvY2dycC9ibGtpby53cml0ZV9icHNfZGV2aWNlCisgIGVjaG8gIjxtYWpvcj46PG1pbm9yPiAgPHJhdGVfYnl0ZXNfcGVyX3NlY29uZD4iID4gL2NncnAvYmxraW8udGhyb3R0bGUud3JpdGVfYnBzX2RldmljZQogCiAtIGJsa2lvLnRocm90dGxlLnJlYWRfaW9wc19kZXZpY2UKIAktIFNwZWNpZmllcyB1cHBlciBsaW1pdCBvbiBSRUFEIHJhdGUgZnJvbSB0aGUgZGV2aWNlLiBJTyByYXRlIGlzCiAJICBzcGVjaWZpZWQgaW4gSU8gcGVyIHNlY29uZC4gUnVsZXMgYXJlIHBlciBkZWl2Y2UuIEZvbGxvd2luZyBpcwogCSAgdGhlIGZvcm1hdC4KIAotICBlY2hvICI8bWFqb3I+OjxtaW5vcj4gIDxyYXRlX2lvX3Blcl9zZWNvbmQ+IiA+IC9jZ3JwL2Jsa2lvLnJlYWRfaW9wc19kZXZpY2UKKyAgZWNobyAiPG1ham9yPjo8bWlub3I+ICA8cmF0ZV9pb19wZXJfc2Vjb25kPiIgPiAvY2dycC9ibGtpby50aHJvdHRsZS5yZWFkX2lvcHNfZGV2aWNlCiAKIC0gYmxraW8udGhyb3R0bGUud3JpdGVfaW9wc19kZXZpY2UKIAktIFNwZWNpZmllcyB1cHBlciBsaW1pdCBvbiBXUklURSByYXRlIHRvIHRoZSBkZXZpY2UuIElPIHJhdGUgaXMKIAkgIHNwZWNpZmllZCBpbiBpbyBwZXIgc2Vjb25kLiBSdWxlcyBhcmUgcGVyIGRlaXZjZS4gRm9sbG93aW5nIGlzCiAJICB0aGUgZm9ybWF0LgogCi0gIGVjaG8gIjxtYWpvcj46PG1pbm9yPiAgPHJhdGVfaW9fcGVyX3NlY29uZD4iID4gL2NncnAvYmxraW8ud3JpdGVfaW9wc19kZXZpY2UKKyAgZWNobyAiPG1ham9yPjo8bWlub3I+ICA8cmF0ZV9pb19wZXJfc2Vjb25kPiIgPiAvY2dycC9ibGtpby50aHJvdHRsZS53cml0ZV9pb3BzX2RldmljZQogCiBOb3RlOiBJZiBib3RoIEJXIGFuZCBJT1BTIHJ1bGVzIGFyZSBzcGVjaWZpZWQgZm9yIGEgZGV2aWNlLCB0aGVuIElPIGlzCiAgICAgICBzdWJqZWN0ZCB0byBib3RoIHRoZSBjb25zdHJhaW50cy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dAppbmRleCAwZWQ5OWYwLi5jZDY3ZTkwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0CkBAIC0xMzgsMTEgKzEzOCwxMSBAQAogdGhlIGFkbWluIGNhbiBlYXNpbHkgc2V0IHVwIGEgc2NyaXB0IHdoaWNoIHJlY2VpdmVzIGV4ZWMgbm90aWZpY2F0aW9ucwogYW5kIGRlcGVuZGluZyBvbiB3aG8gaXMgbGF1bmNoaW5nIHRoZSBicm93c2VyIGhlIGNhbgogCi0gICAgICAgIyBlY2hvIGJyb3dzZXJfcGlkID4gL21udC88cmVzdHlwZT4vPHVzZXJjbGFzcz4vdGFza3MKKyAgICAjIGVjaG8gYnJvd3Nlcl9waWQgPiAvc3lzL2ZzL2Nncm91cC88cmVzdHlwZT4vPHVzZXJjbGFzcz4vdGFza3MKIAogV2l0aCBvbmx5IGEgc2luZ2xlIGhpZXJhcmNoeSwgaGUgbm93IHdvdWxkIHBvdGVudGlhbGx5IGhhdmUgdG8gY3JlYXRlCiBhIHNlcGFyYXRlIGNncm91cCBmb3IgZXZlcnkgYnJvd3NlciBsYXVuY2hlZCBhbmQgYXNzb2NpYXRlIGl0IHdpdGgKLWFwcHJvcCBuZXR3b3JrIGFuZCBvdGhlciByZXNvdXJjZSBjbGFzcy4gIFRoaXMgbWF5IGxlYWQgdG8KK2FwcHJvcHJpYXRlIG5ldHdvcmsgYW5kIG90aGVyIHJlc291cmNlIGNsYXNzLiAgVGhpcyBtYXkgbGVhZCB0bwogcHJvbGlmZXJhdGlvbiBvZiBzdWNoIGNncm91cHMuCiAKIEFsc28gbGV0cyBzYXkgdGhhdCB0aGUgYWRtaW5pc3RyYXRvciB3b3VsZCBsaWtlIHRvIGdpdmUgZW5oYW5jZWQgbmV0d29yawpAQCAtMTUzLDkgKzE1Myw5IEBACiBXaXRoIGFiaWxpdHkgdG8gd3JpdGUgcGlkcyBkaXJlY3RseSB0byByZXNvdXJjZSBjbGFzc2VzLCBpdCdzIGp1c3QgYQogbWF0dGVyIG9mIDoKIAotICAgICAgICMgZWNobyBwaWQgPiAvbW50L25ldHdvcmsvPG5ld19jbGFzcz4vdGFza3MKKyAgICAgICAjIGVjaG8gcGlkID4gL3N5cy9mcy9jZ3JvdXAvbmV0d29yay88bmV3X2NsYXNzPi90YXNrcwogICAgICAgIChhZnRlciBzb21lIHRpbWUpCi0gICAgICAgIyBlY2hvIHBpZCA+IC9tbnQvbmV0d29yay88b3JpZ19jbGFzcz4vdGFza3MKKyAgICAgICAjIGVjaG8gcGlkID4gL3N5cy9mcy9jZ3JvdXAvbmV0d29yay88b3JpZ19jbGFzcz4vdGFza3MKIAogV2l0aG91dCB0aGlzIGFiaWxpdHksIGhlIHdvdWxkIGhhdmUgdG8gc3BsaXQgdGhlIGNncm91cCBpbnRvCiBtdWx0aXBsZSBzZXBhcmF0ZSBvbmVzIGFuZCB0aGVuIGFzc29jaWF0ZSB0aGUgbmV3IGNncm91cHMgd2l0aCB0aGUKQEAgLTMxMCwyMSArMzEwLDI0IEBACiBUbyBzdGFydCBhIG5ldyBqb2IgdGhhdCBpcyB0byBiZSBjb250YWluZWQgd2l0aGluIGEgY2dyb3VwLCB1c2luZwogdGhlICJjcHVzZXQiIGNncm91cCBzdWJzeXN0ZW0sIHRoZSBzdGVwcyBhcmUgc29tZXRoaW5nIGxpa2U6CiAKLSAxKSBta2RpciAvZGV2L2Nncm91cAotIDIpIG1vdW50IC10IGNncm91cCAtb2NwdXNldCBjcHVzZXQgL2Rldi9jZ3JvdXAKLSAzKSBDcmVhdGUgdGhlIG5ldyBjZ3JvdXAgYnkgZG9pbmcgbWtkaXIncyBhbmQgd3JpdGUncyAob3IgZWNobydzKSBpbgotICAgIHRoZSAvZGV2L2Nncm91cCB2aXJ0dWFsIGZpbGUgc3lzdGVtLgotIDQpIFN0YXJ0IGEgdGFzayB0aGF0IHdpbGwgYmUgdGhlICJmb3VuZGluZyBmYXRoZXIiIG9mIHRoZSBuZXcgam9iLgotIDUpIEF0dGFjaCB0aGF0IHRhc2sgdG8gdGhlIG5ldyBjZ3JvdXAgYnkgd3JpdGluZyBpdHMgcGlkIHRvIHRoZQotICAgIC9kZXYvY2dyb3VwIHRhc2tzIGZpbGUgZm9yIHRoYXQgY2dyb3VwLgotIDYpIGZvcmssIGV4ZWMgb3IgY2xvbmUgdGhlIGpvYiB0YXNrcyBmcm9tIHRoaXMgZm91bmRpbmcgZmF0aGVyIHRhc2suCisgMSkgbW91bnQgLXQgdG1wZnMgY2dyb3VwX3Jvb3QgL3N5cy9mcy9jZ3JvdXAKKyAyKSBta2RpciAvc3lzL2ZzL2Nncm91cC9jcHVzZXQKKyAzKSBtb3VudCAtdCBjZ3JvdXAgLW9jcHVzZXQgY3B1c2V0IC9zeXMvZnMvY2dyb3VwL2NwdXNldAorIDQpIENyZWF0ZSB0aGUgbmV3IGNncm91cCBieSBkb2luZyBta2RpcidzIGFuZCB3cml0ZSdzIChvciBlY2hvJ3MpIGluCisgICAgdGhlIC9zeXMvZnMvY2dyb3VwIHZpcnR1YWwgZmlsZSBzeXN0ZW0uCisgNSkgU3RhcnQgYSB0YXNrIHRoYXQgd2lsbCBiZSB0aGUgImZvdW5kaW5nIGZhdGhlciIgb2YgdGhlIG5ldyBqb2IuCisgNikgQXR0YWNoIHRoYXQgdGFzayB0byB0aGUgbmV3IGNncm91cCBieSB3cml0aW5nIGl0cyBwaWQgdG8gdGhlCisgICAgL3N5cy9mcy9jZ3JvdXAvY3B1c2V0L3Rhc2tzIGZpbGUgZm9yIHRoYXQgY2dyb3VwLgorIDcpIGZvcmssIGV4ZWMgb3IgY2xvbmUgdGhlIGpvYiB0YXNrcyBmcm9tIHRoaXMgZm91bmRpbmcgZmF0aGVyIHRhc2suCiAKIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIG9mIGNvbW1hbmRzIHdpbGwgc2V0dXAgYSBjZ3JvdXAKIG5hbWVkICJDaGFybGllIiwgY29udGFpbmluZyBqdXN0IENQVXMgMiBhbmQgMywgYW5kIE1lbW9yeSBOb2RlIDEsCiBhbmQgdGhlbiBzdGFydCBhIHN1YnNoZWxsICdzaCcgaW4gdGhhdCBjZ3JvdXA6CiAKLSAgbW91bnQgLXQgY2dyb3VwIGNwdXNldCAtb2NwdXNldCAvZGV2L2Nncm91cAotICBjZCAvZGV2L2Nncm91cAorICBtb3VudCAtdCB0bXBmcyBjZ3JvdXBfcm9vdCAvc3lzL2ZzL2Nncm91cAorICBta2RpciAvc3lzL2ZzL2Nncm91cC9jcHVzZXQKKyAgbW91bnQgLXQgY2dyb3VwIGNwdXNldCAtb2NwdXNldCAvc3lzL2ZzL2Nncm91cC9jcHVzZXQKKyAgY2QgL3N5cy9mcy9jZ3JvdXAvY3B1c2V0CiAgIG1rZGlyIENoYXJsaWUKICAgY2QgQ2hhcmxpZQogICAvYmluL2VjaG8gMi0zID4gY3B1c2V0LmNwdXMKQEAgLTM0NSw3ICszNDgsNyBAQAogdmlydHVhbCBmaWxlc3lzdGVtLgogCiBUbyBtb3VudCBhIGNncm91cCBoaWVyYXJjaHkgd2l0aCBhbGwgYXZhaWxhYmxlIHN1YnN5c3RlbXMsIHR5cGU6Ci0jIG1vdW50IC10IGNncm91cCB4eHggL2Rldi9jZ3JvdXAKKyMgbW91bnQgLXQgY2dyb3VwIHh4eCAvc3lzL2ZzL2Nncm91cAogCiBUaGUgInh4eCIgaXMgbm90IGludGVycHJldGVkIGJ5IHRoZSBjZ3JvdXAgY29kZSwgYnV0IHdpbGwgYXBwZWFyIGluCiAvcHJvYy9tb3VudHMgc28gbWF5IGJlIGFueSB1c2VmdWwgaWRlbnRpZnlpbmcgc3RyaW5nIHRoYXQgeW91IGxpa2UuCkBAIC0zNTQsMjMgKzM1NywzMiBAQAogaWYgY3B1c2V0cyBhcmUgZW5hYmxlZCB0aGUgdXNlciB3aWxsIGhhdmUgdG8gcG9wdWxhdGUgdGhlIGNwdXMgYW5kIG1lbXMgZmlsZXMKIGZvciBlYWNoIG5ldyBjZ3JvdXAgY3JlYXRlZCBiZWZvcmUgdGhhdCBncm91cCBjYW4gYmUgdXNlZC4KIAorQXMgZXhwbGFpbmVkIGluIHNlY3Rpb24gYDEuMiBXaHkgYXJlIGNncm91cHMgbmVlZGVkPycgeW91IHNob3VsZCBjcmVhdGUKK2RpZmZlcmVudCBoaWVyYXJjaGllcyBvZiBjZ3JvdXBzIGZvciBlYWNoIHNpbmdsZSByZXNvdXJjZSBvciBncm91cCBvZgorcmVzb3VyY2VzIHlvdSB3YW50IHRvIGNvbnRyb2wuIFRoZXJlZm9yZSwgeW91IHNob3VsZCBtb3VudCBhIHRtcGZzIG9uCisvc3lzL2ZzL2Nncm91cCBhbmQgY3JlYXRlIGRpcmVjdG9yaWVzIGZvciBlYWNoIGNncm91cCByZXNvdXJjZSBvciByZXNvdXJjZQorZ3JvdXAuCisKKyMgbW91bnQgLXQgdG1wZnMgY2dyb3VwX3Jvb3QgL3N5cy9mcy9jZ3JvdXAKKyMgbWtkaXIgL3N5cy9mcy9jZ3JvdXAvcmcxCisKIFRvIG1vdW50IGEgY2dyb3VwIGhpZXJhcmNoeSB3aXRoIGp1c3QgdGhlIGNwdXNldCBhbmQgbWVtb3J5CiBzdWJzeXN0ZW1zLCB0eXBlOgotIyBtb3VudCAtdCBjZ3JvdXAgLW8gY3B1c2V0LG1lbW9yeSBoaWVyMSAvZGV2L2Nncm91cAorIyBtb3VudCAtdCBjZ3JvdXAgLW8gY3B1c2V0LG1lbW9yeSBoaWVyMSAvc3lzL2ZzL2Nncm91cC9yZzEKIAogVG8gY2hhbmdlIHRoZSBzZXQgb2Ygc3Vic3lzdGVtcyBib3VuZCB0byBhIG1vdW50ZWQgaGllcmFyY2h5LCBqdXN0CiByZW1vdW50IHdpdGggZGlmZmVyZW50IG9wdGlvbnM6Ci0jIG1vdW50IC1vIHJlbW91bnQsY3B1c2V0LGJsa2lvIGhpZXIxIC9kZXYvY2dyb3VwCisjIG1vdW50IC1vIHJlbW91bnQsY3B1c2V0LGJsa2lvIGhpZXIxIC9zeXMvZnMvY2dyb3VwL3JnMQogCiBOb3cgbWVtb3J5IGlzIHJlbW92ZWQgZnJvbSB0aGUgaGllcmFyY2h5IGFuZCBibGtpbyBpcyBhZGRlZC4KIAogTm90ZSB0aGlzIHdpbGwgYWRkIGJsa2lvIHRvIHRoZSBoaWVyYXJjaHkgYnV0IHdvbid0IHJlbW92ZSBtZW1vcnkgb3IKIGNwdXNldCwgYmVjYXVzZSB0aGUgbmV3IG9wdGlvbnMgYXJlIGFwcGVuZGVkIHRvIHRoZSBvbGQgb25lczoKLSMgbW91bnQgLW8gcmVtb3VudCxibGtpbyAvZGV2L2Nncm91cAorIyBtb3VudCAtbyByZW1vdW50LGJsa2lvIC9zeXMvZnMvY2dyb3VwL3JnMQogCiBUbyBTcGVjaWZ5IGEgaGllcmFyY2h5J3MgcmVsZWFzZV9hZ2VudDoKICMgbW91bnQgLXQgY2dyb3VwIC1vIGNwdXNldCxyZWxlYXNlX2FnZW50PSIvc2Jpbi9jcHVzZXRfcmVsZWFzZV9hZ2VudCIgXAotICB4eHggL2Rldi9jZ3JvdXAKKyAgeHh4IC9zeXMvZnMvY2dyb3VwL3JnMQogCiBOb3RlIHRoYXQgc3BlY2lmeWluZyAncmVsZWFzZV9hZ2VudCcgbW9yZSB0aGFuIG9uY2Ugd2lsbCByZXR1cm4gZmFpbHVyZS4KIApAQCAtMzc5LDE3ICszOTEsMTcgQEAKIHRoZSBhYmlsaXR5IHRvIGFyYml0cmFyaWx5IGJpbmQvdW5iaW5kIHN1YnN5c3RlbXMgZnJvbSBhbiBleGlzdGluZwogY2dyb3VwIGhpZXJhcmNoeSBpcyBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgZnV0dXJlLgogCi1UaGVuIHVuZGVyIC9kZXYvY2dyb3VwIHlvdSBjYW4gZmluZCBhIHRyZWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKLXRyZWUgb2YgdGhlIGNncm91cHMgaW4gdGhlIHN5c3RlbS4gRm9yIGluc3RhbmNlLCAvZGV2L2Nncm91cAorVGhlbiB1bmRlciAvc3lzL2ZzL2Nncm91cC9yZzEgeW91IGNhbiBmaW5kIGEgdHJlZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQordHJlZSBvZiB0aGUgY2dyb3VwcyBpbiB0aGUgc3lzdGVtLiBGb3IgaW5zdGFuY2UsIC9zeXMvZnMvY2dyb3VwL3JnMQogaXMgdGhlIGNncm91cCB0aGF0IGhvbGRzIHRoZSB3aG9sZSBzeXN0ZW0uCiAKIElmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgcmVsZWFzZV9hZ2VudDoKLSMgZWNobyAiL3NiaW4vbmV3X3JlbGVhc2VfYWdlbnQiID4gL2Rldi9jZ3JvdXAvcmVsZWFzZV9hZ2VudAorIyBlY2hvICIvc2Jpbi9uZXdfcmVsZWFzZV9hZ2VudCIgPiAvc3lzL2ZzL2Nncm91cC9yZzEvcmVsZWFzZV9hZ2VudAogCiBJdCBjYW4gYWxzbyBiZSBjaGFuZ2VkIHZpYSByZW1vdW50LgogCi1JZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgY2dyb3VwIHVuZGVyIC9kZXYvY2dyb3VwOgotIyBjZCAvZGV2L2Nncm91cAorSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGNncm91cCB1bmRlciAvc3lzL2ZzL2Nncm91cC9yZzE6CisjIGNkIC9zeXMvZnMvY2dyb3VwL3JnMQogIyBta2RpciBteV9jZ3JvdXAKIAogTm93IHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyB3aXRoIHRoaXMgY2dyb3VwLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdWFjY3QudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdWFjY3QudHh0CmluZGV4IDhiOTMwOTQuLjlkNzNjYzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jcHVhY2N0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1YWNjdC50eHQKQEAgLTEwLDI2ICsxMCwyNSBAQAogCiBBY2NvdW50aW5nIGdyb3VwcyBjYW4gYmUgY3JlYXRlZCBieSBmaXJzdCBtb3VudGluZyB0aGUgY2dyb3VwIGZpbGVzeXN0ZW0uCiAKLSMgbWtkaXIgL2Nncm91cHMKLSMgbW91bnQgLXQgY2dyb3VwIC1vY3B1YWNjdCBub25lIC9jZ3JvdXBzCisjIG1vdW50IC10IGNncm91cCAtb2NwdWFjY3Qgbm9uZSAvc3lzL2ZzL2Nncm91cAogCi1XaXRoIHRoZSBhYm92ZSBzdGVwLCB0aGUgaW5pdGlhbCBvciB0aGUgcGFyZW50IGFjY291bnRpbmcgZ3JvdXAKLWJlY29tZXMgdmlzaWJsZSBhdCAvY2dyb3Vwcy4gQXQgYm9vdHVwLCB0aGlzIGdyb3VwIGluY2x1ZGVzIGFsbCB0aGUKLXRhc2tzIGluIHRoZSBzeXN0ZW0uIC9jZ3JvdXBzL3Rhc2tzIGxpc3RzIHRoZSB0YXNrcyBpbiB0aGlzIGNncm91cC4KLS9jZ3JvdXBzL2NwdWFjY3QudXNhZ2UgZ2l2ZXMgdGhlIENQVSB0aW1lIChpbiBuYW5vc2Vjb25kcykgb2J0YWluZWQgYnkKLXRoaXMgZ3JvdXAgd2hpY2ggaXMgZXNzZW50aWFsbHkgdGhlIENQVSB0aW1lIG9idGFpbmVkIGJ5IGFsbCB0aGUgdGFza3MKK1dpdGggdGhlIGFib3ZlIHN0ZXAsIHRoZSBpbml0aWFsIG9yIHRoZSBwYXJlbnQgYWNjb3VudGluZyBncm91cCBiZWNvbWVzCit2aXNpYmxlIGF0IC9zeXMvZnMvY2dyb3VwLiBBdCBib290dXAsIHRoaXMgZ3JvdXAgaW5jbHVkZXMgYWxsIHRoZSB0YXNrcyBpbgordGhlIHN5c3RlbS4gL3N5cy9mcy9jZ3JvdXAvdGFza3MgbGlzdHMgdGhlIHRhc2tzIGluIHRoaXMgY2dyb3VwLgorL3N5cy9mcy9jZ3JvdXAvY3B1YWNjdC51c2FnZSBnaXZlcyB0aGUgQ1BVIHRpbWUgKGluIG5hbm9zZWNvbmRzKSBvYnRhaW5lZAorYnkgdGhpcyBncm91cCB3aGljaCBpcyBlc3NlbnRpYWxseSB0aGUgQ1BVIHRpbWUgb2J0YWluZWQgYnkgYWxsIHRoZSB0YXNrcwogaW4gdGhlIHN5c3RlbS4KIAotTmV3IGFjY291bnRpbmcgZ3JvdXBzIGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoZSBwYXJlbnQgZ3JvdXAgL2Nncm91cHMuCitOZXcgYWNjb3VudGluZyBncm91cHMgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhlIHBhcmVudCBncm91cCAvc3lzL2ZzL2Nncm91cC4KIAotIyBjZCAvY2dyb3VwcworIyBjZCAvc3lzL2ZzL2Nncm91cAogIyBta2RpciBnMQotIyBlY2hvICQkID4gZzEKKyMgZWNobyAkJCA+IGcxL3Rhc2tzCiAKIFRoZSBhYm92ZSBzdGVwcyBjcmVhdGUgYSBuZXcgZ3JvdXAgZzEgYW5kIG1vdmUgdGhlIGN1cnJlbnQgc2hlbGwKIHByb2Nlc3MgKGJhc2gpIGludG8gaXQuIENQVSB0aW1lIGNvbnN1bWVkIGJ5IHRoaXMgYmFzaCBhbmQgaXRzIGNoaWxkcmVuCiBjYW4gYmUgb2J0YWluZWQgZnJvbSBnMS9jcHVhY2N0LnVzYWdlIGFuZCB0aGUgc2FtZSBpcyBhY2N1bXVsYXRlZCBpbgotL2Nncm91cHMvY3B1YWNjdC51c2FnZSBhbHNvLgorL3N5cy9mcy9jZ3JvdXAvY3B1YWNjdC51c2FnZSBhbHNvLgogCiBjcHVhY2N0LnN0YXQgZmlsZSBsaXN0cyBhIGZldyBzdGF0aXN0aWNzIHdoaWNoIGZ1cnRoZXIgZGl2aWRlIHRoZQogQ1BVIHRpbWUgb2J0YWluZWQgYnkgdGhlIGNncm91cCBpbnRvIHVzZXIgYW5kIHN5c3RlbSB0aW1lcy4gQ3VycmVudGx5CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1c2V0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1c2V0cy50eHQKaW5kZXggOThhMzA4Mi4uNWM1MWVkNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdXNldHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jcHVzZXRzLnR4dApAQCAtMTgwLDcgKzE4MCw3IEBACiAgLSBjcHVzZXQuc2NoZWRfbG9hZF9iYWxhbmNlIGZsYWc6IGlmIHNldCwgbG9hZCBiYWxhbmNlIHdpdGhpbiBDUFVzIG9uIHRoYXQgY3B1c2V0CiAgLSBjcHVzZXQuc2NoZWRfcmVsYXhfZG9tYWluX2xldmVsOiB0aGUgc2VhcmNoaW5nIHJhbmdlIHdoZW4gbWlncmF0aW5nIHRhc2tzCiAKLUluIGFkZGl0aW9uLCB0aGUgcm9vdCBjcHVzZXQgb25seSBoYXMgdGhlIGZvbGxvd2luZyBmaWxlOgorSW4gYWRkaXRpb24sIG9ubHkgdGhlIHJvb3QgY3B1c2V0IGhhcyB0aGUgZm9sbG93aW5nIGZpbGU6CiAgLSBjcHVzZXQubWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQgZmxhZzogY29tcHV0ZSBtZW1vcnlfcHJlc3N1cmU/CiAKIE5ldyBjcHVzZXRzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZSBta2RpciBzeXN0ZW0gY2FsbCBvciBzaGVsbApAQCAtNjYxLDIxICs2NjEsMjEgQEAKIAogVG8gc3RhcnQgYSBuZXcgam9iIHRoYXQgaXMgdG8gYmUgY29udGFpbmVkIHdpdGhpbiBhIGNwdXNldCwgdGhlIHN0ZXBzIGFyZToKIAotIDEpIG1rZGlyIC9kZXYvY3B1c2V0Ci0gMikgbW91bnQgLXQgY2dyb3VwIC1vY3B1c2V0IGNwdXNldCAvZGV2L2NwdXNldAorIDEpIG1rZGlyIC9zeXMvZnMvY2dyb3VwL2NwdXNldAorIDIpIG1vdW50IC10IGNncm91cCAtb2NwdXNldCBjcHVzZXQgL3N5cy9mcy9jZ3JvdXAvY3B1c2V0CiAgMykgQ3JlYXRlIHRoZSBuZXcgY3B1c2V0IGJ5IGRvaW5nIG1rZGlyJ3MgYW5kIHdyaXRlJ3MgKG9yIGVjaG8ncykgaW4KLSAgICB0aGUgL2Rldi9jcHVzZXQgdmlydHVhbCBmaWxlIHN5c3RlbS4KKyAgICB0aGUgL3N5cy9mcy9jZ3JvdXAvY3B1c2V0IHZpcnR1YWwgZmlsZSBzeXN0ZW0uCiAgNCkgU3RhcnQgYSB0YXNrIHRoYXQgd2lsbCBiZSB0aGUgImZvdW5kaW5nIGZhdGhlciIgb2YgdGhlIG5ldyBqb2IuCiAgNSkgQXR0YWNoIHRoYXQgdGFzayB0byB0aGUgbmV3IGNwdXNldCBieSB3cml0aW5nIGl0cyBwaWQgdG8gdGhlCi0gICAgL2Rldi9jcHVzZXQgdGFza3MgZmlsZSBmb3IgdGhhdCBjcHVzZXQuCisgICAgL3N5cy9mcy9jZ3JvdXAvY3B1c2V0IHRhc2tzIGZpbGUgZm9yIHRoYXQgY3B1c2V0LgogIDYpIGZvcmssIGV4ZWMgb3IgY2xvbmUgdGhlIGpvYiB0YXNrcyBmcm9tIHRoaXMgZm91bmRpbmcgZmF0aGVyIHRhc2suCiAKIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIG9mIGNvbW1hbmRzIHdpbGwgc2V0dXAgYSBjcHVzZXQKIG5hbWVkICJDaGFybGllIiwgY29udGFpbmluZyBqdXN0IENQVXMgMiBhbmQgMywgYW5kIE1lbW9yeSBOb2RlIDEsCiBhbmQgdGhlbiBzdGFydCBhIHN1YnNoZWxsICdzaCcgaW4gdGhhdCBjcHVzZXQ6CiAKLSAgbW91bnQgLXQgY2dyb3VwIC1vY3B1c2V0IGNwdXNldCAvZGV2L2NwdXNldAotICBjZCAvZGV2L2NwdXNldAorICBtb3VudCAtdCBjZ3JvdXAgLW9jcHVzZXQgY3B1c2V0IC9zeXMvZnMvY2dyb3VwL2NwdXNldAorICBjZCAvc3lzL2ZzL2Nncm91cC9jcHVzZXQKICAgbWtkaXIgQ2hhcmxpZQogICBjZCBDaGFybGllCiAgIC9iaW4vZWNobyAyLTMgPiBjcHVzZXQuY3B1cwpAQCAtNzEwLDE0ICs3MTAsMTQgQEAKIHZpcnR1YWwgZmlsZXN5c3RlbS4KIAogVG8gbW91bnQgaXQsIHR5cGU6Ci0jIG1vdW50IC10IGNncm91cCAtbyBjcHVzZXQgY3B1c2V0IC9kZXYvY3B1c2V0CisjIG1vdW50IC10IGNncm91cCAtbyBjcHVzZXQgY3B1c2V0IC9zeXMvZnMvY2dyb3VwL2NwdXNldAogCi1UaGVuIHVuZGVyIC9kZXYvY3B1c2V0IHlvdSBjYW4gZmluZCBhIHRyZWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKLXRyZWUgb2YgdGhlIGNwdXNldHMgaW4gdGhlIHN5c3RlbS4gRm9yIGluc3RhbmNlLCAvZGV2L2NwdXNldAorVGhlbiB1bmRlciAvc3lzL2ZzL2Nncm91cC9jcHVzZXQgeW91IGNhbiBmaW5kIGEgdHJlZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQordHJlZSBvZiB0aGUgY3B1c2V0cyBpbiB0aGUgc3lzdGVtLiBGb3IgaW5zdGFuY2UsIC9zeXMvZnMvY2dyb3VwL2NwdXNldAogaXMgdGhlIGNwdXNldCB0aGF0IGhvbGRzIHRoZSB3aG9sZSBzeXN0ZW0uCiAKLUlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBjcHVzZXQgdW5kZXIgL2Rldi9jcHVzZXQ6Ci0jIGNkIC9kZXYvY3B1c2V0CitJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgY3B1c2V0IHVuZGVyIC9zeXMvZnMvY2dyb3VwL2NwdXNldDoKKyMgY2QgL3N5cy9mcy9jZ3JvdXAvY3B1c2V0CiAjIG1rZGlyIG15X2NwdXNldAogCiBOb3cgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIHdpdGggdGhpcyBjcHVzZXQuCkBAIC03NjUsMTIgKzc2NSwxMiBAQAogCiBUaGUgY29tbWFuZAogCi1tb3VudCAtdCBjcHVzZXQgWCAvZGV2L2NwdXNldAorbW91bnQgLXQgY3B1c2V0IFggL3N5cy9mcy9jZ3JvdXAvY3B1c2V0CiAKIGlzIGVxdWl2YWxlbnQgdG8KIAotbW91bnQgLXQgY2dyb3VwIC1vY3B1c2V0LG5vcHJlZml4IFggL2Rldi9jcHVzZXQKLWVjaG8gIi9zYmluL2NwdXNldF9yZWxlYXNlX2FnZW50IiA+IC9kZXYvY3B1c2V0L3JlbGVhc2VfYWdlbnQKK21vdW50IC10IGNncm91cCAtb2NwdXNldCxub3ByZWZpeCBYIC9zeXMvZnMvY2dyb3VwL2NwdXNldAorZWNobyAiL3NiaW4vY3B1c2V0X3JlbGVhc2VfYWdlbnQiID4gL3N5cy9mcy9jZ3JvdXAvY3B1c2V0L3JlbGVhc2VfYWdlbnQKIAogMi4yIEFkZGluZy9yZW1vdmluZyBjcHVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9kZXZpY2VzLnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9kZXZpY2VzLnR4dAppbmRleCA1N2NhNGM4Li4xNjYyNGE3ZjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9kZXZpY2VzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvZGV2aWNlcy50eHQKQEAgLTIyLDE2ICsyMiwxNiBAQAogQW4gZW50cnkgaXMgYWRkZWQgdXNpbmcgZGV2aWNlcy5hbGxvdywgYW5kIHJlbW92ZWQgdXNpbmcKIGRldmljZXMuZGVueS4gIEZvciBpbnN0YW5jZQogCi0JZWNobyAnYyAxOjMgbXInID4gL2Nncm91cHMvMS9kZXZpY2VzLmFsbG93CisJZWNobyAnYyAxOjMgbXInID4gL3N5cy9mcy9jZ3JvdXAvMS9kZXZpY2VzLmFsbG93CiAKIGFsbG93cyBjZ3JvdXAgMSB0byByZWFkIGFuZCBta25vZCB0aGUgZGV2aWNlIHVzdWFsbHkga25vd24gYXMKIC9kZXYvbnVsbC4gIERvaW5nCiAKLQllY2hvIGEgPiAvY2dyb3Vwcy8xL2RldmljZXMuZGVueQorCWVjaG8gYSA+IC9zeXMvZnMvY2dyb3VwLzEvZGV2aWNlcy5kZW55CiAKIHdpbGwgcmVtb3ZlIHRoZSBkZWZhdWx0ICdhICo6KiByd20nIGVudHJ5LiBEb2luZwogCi0JZWNobyBhID4gL2Nncm91cHMvMS9kZXZpY2VzLmFsbG93CisJZWNobyBhID4gL3N5cy9mcy9jZ3JvdXAvMS9kZXZpY2VzLmFsbG93CiAKIHdpbGwgYWRkIHRoZSAnYSAqOiogcndtJyBlbnRyeSB0byB0aGUgd2hpdGVsaXN0LgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvZnJlZXplci1zdWJzeXN0ZW0udHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2ZyZWV6ZXItc3Vic3lzdGVtLnR4dAppbmRleCA0MWYzN2ZlLi5jMjFkNzc3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvZnJlZXplci1zdWJzeXN0ZW0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9mcmVlemVyLXN1YnN5c3RlbS50eHQKQEAgLTU5LDI4ICs1OSwyOCBAQAogCiAqIEV4YW1wbGVzIG9mIHVzYWdlIDoKIAotICAgIyBta2RpciAvY29udGFpbmVycwotICAgIyBtb3VudCAtdCBjZ3JvdXAgLW9mcmVlemVyIGZyZWV6ZXIgIC9jb250YWluZXJzCi0gICAjIG1rZGlyIC9jb250YWluZXJzLzAKLSAgICMgZWNobyAkc29tZV9waWQgPiAvY29udGFpbmVycy8wL3Rhc2tzCisgICAjIG1rZGlyIC9zeXMvZnMvY2dyb3VwL2ZyZWV6ZXIKKyAgICMgbW91bnQgLXQgY2dyb3VwIC1vZnJlZXplciBmcmVlemVyIC9zeXMvZnMvY2dyb3VwL2ZyZWV6ZXIKKyAgICMgbWtkaXIgL3N5cy9mcy9jZ3JvdXAvZnJlZXplci8wCisgICAjIGVjaG8gJHNvbWVfcGlkID4gL3N5cy9mcy9jZ3JvdXAvZnJlZXplci8wL3Rhc2tzCiAKIHRvIGdldCBzdGF0dXMgb2YgdGhlIGZyZWV6ZXIgc3Vic3lzdGVtIDoKIAotICAgIyBjYXQgL2NvbnRhaW5lcnMvMC9mcmVlemVyLnN0YXRlCisgICAjIGNhdCAvc3lzL2ZzL2Nncm91cC9mcmVlemVyLzAvZnJlZXplci5zdGF0ZQogICAgVEhBV0VECiAKIHRvIGZyZWV6ZSBhbGwgdGFza3MgaW4gdGhlIGNvbnRhaW5lciA6CiAKLSAgICMgZWNobyBGUk9aRU4gPiAvY29udGFpbmVycy8wL2ZyZWV6ZXIuc3RhdGUKLSAgICMgY2F0IC9jb250YWluZXJzLzAvZnJlZXplci5zdGF0ZQorICAgIyBlY2hvIEZST1pFTiA+IC9zeXMvZnMvY2dyb3VwL2ZyZWV6ZXIvMC9mcmVlemVyLnN0YXRlCisgICAjIGNhdCAvc3lzL2ZzL2Nncm91cC9mcmVlemVyLzAvZnJlZXplci5zdGF0ZQogICAgRlJFRVpJTkcKLSAgICMgY2F0IC9jb250YWluZXJzLzAvZnJlZXplci5zdGF0ZQorICAgIyBjYXQgL3N5cy9mcy9jZ3JvdXAvZnJlZXplci8wL2ZyZWV6ZXIuc3RhdGUKICAgIEZST1pFTgogCiB0byB1bmZyZWV6ZSBhbGwgdGFza3MgaW4gdGhlIGNvbnRhaW5lciA6CiAKLSAgICMgZWNobyBUSEFXRUQgPiAvY29udGFpbmVycy8wL2ZyZWV6ZXIuc3RhdGUKLSAgICMgY2F0IC9jb250YWluZXJzLzAvZnJlZXplci5zdGF0ZQorICAgIyBlY2hvIFRIQVdFRCA+IC9zeXMvZnMvY2dyb3VwL2ZyZWV6ZXIvMC9mcmVlemVyLnN0YXRlCisgICAjIGNhdCAvc3lzL2ZzL2Nncm91cC9mcmVlemVyLzAvZnJlZXplci5zdGF0ZQogICAgVEhBV0VECiAKIFRoaXMgaXMgdGhlIGJhc2ljIG1lY2hhbmlzbSB3aGljaCBzaG91bGQgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciB1c2VyIHNwYWNlIHRhc2sKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL21lbW9yeS50eHQKaW5kZXggN2MxNjM0Ny4uMDZlYjZkOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL21lbW9yeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL21lbW9yeS50eHQKQEAgLTEsOCArMSw4IEBACiBNZW1vcnkgUmVzb3VyY2UgQ29udHJvbGxlcgogCi1OT1RFOiBUaGUgTWVtb3J5IFJlc291cmNlIENvbnRyb2xsZXIgaGFzIGJlZW4gZ2VuZXJpY2FsbHkgYmVlbiByZWZlcnJlZAotICAgICAgdG8gYXMgdGhlIG1lbW9yeSBjb250cm9sbGVyIGluIHRoaXMgZG9jdW1lbnQuIERvIG5vdCBjb25mdXNlIG1lbW9yeQotICAgICAgY29udHJvbGxlciB1c2VkIGhlcmUgd2l0aCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgdGhhdCBpcyB1c2VkIGluIGhhcmR3YXJlLgorTk9URTogVGhlIE1lbW9yeSBSZXNvdXJjZSBDb250cm9sbGVyIGhhcyBnZW5lcmljYWxseSBiZWVuIHJlZmVycmVkIHRvIGFzIHRoZQorICAgICAgbWVtb3J5IGNvbnRyb2xsZXIgaW4gdGhpcyBkb2N1bWVudC4gRG8gbm90IGNvbmZ1c2UgbWVtb3J5IGNvbnRyb2xsZXIKKyAgICAgIHVzZWQgaGVyZSB3aXRoIHRoZSBtZW1vcnkgY29udHJvbGxlciB0aGF0IGlzIHVzZWQgaW4gaGFyZHdhcmUuCiAKIChGb3IgZWRpdG9ycykKIEluIHRoaXMgZG9jdW1lbnQ6CkBAIC03MCw2ICs3MCw3IEBACiAJCQkJIChTZWUgc3lzY3RsJ3Mgdm0uc3dhcHBpbmVzcykKICBtZW1vcnkubW92ZV9jaGFyZ2VfYXRfaW1taWdyYXRlICMgc2V0L3Nob3cgY29udHJvbHMgb2YgbW92aW5nIGNoYXJnZXMKICBtZW1vcnkub29tX2NvbnRyb2wJCSAjIHNldC9zaG93IG9vbSBjb250cm9scy4KKyBtZW1vcnkubnVtYV9zdGF0CQkgIyBzaG93IHRoZSBudW1iZXIgb2YgbWVtb3J5IHVzYWdlIHBlciBudW1hIG5vZGUKIAogMS4gSGlzdG9yeQogCkBAIC0xODEsNyArMTgyLDcgQEAKIHBhZ2Ugd2lsbCBldmVudHVhbGx5IGdldCBjaGFyZ2VkIGZvciBpdCAob25jZSBpdCBpcyB1bmNoYXJnZWQgZnJvbQogdGhlIGNncm91cCB0aGF0IGJyb3VnaHQgaXQgaW4gLS0gdGhpcyB3aWxsIGhhcHBlbiBvbiBtZW1vcnkgcHJlc3N1cmUpLgogCi1FeGNlcHRpb246IElmIENPTkZJR19DR1JPVVBfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQIGlzIG5vdCB1c2VkLi4KK0V4Y2VwdGlvbjogSWYgQ09ORklHX0NHUk9VUF9DR1JPVVBfTUVNX1JFU19DVExSX1NXQVAgaXMgbm90IHVzZWQuCiBXaGVuIHlvdSBkbyBzd2Fwb2ZmIGFuZCBtYWtlIHN3YXBwZWQtb3V0IHBhZ2VzIG9mIHNobWVtKHRtcGZzKSB0bwogYmUgYmFja2VkIGludG8gbWVtb3J5IGluIGZvcmNlLCBjaGFyZ2VzIGZvciBwYWdlcyBhcmUgYWNjb3VudGVkIGFnYWluc3QgdGhlCiBjYWxsZXIgb2Ygc3dhcG9mZiByYXRoZXIgdGhhbiB0aGUgdXNlcnMgb2Ygc2htZW0uCkBAIC0yMTMsNyArMjE0LDcgQEAKIE9TIHBvaW50IG9mIHZpZXcuCiAKICogV2hhdCBoYXBwZW5zIHdoZW4gYSBjZ3JvdXAgaGl0cyBtZW1vcnkubWVtc3cubGltaXRfaW5fYnl0ZXMKLVdoZW4gYSBjZ3JvdXAgaGlzIG1lbW9yeS5tZW1zdy5saW1pdF9pbl9ieXRlcywgaXQncyB1c2VsZXNzIHRvIGRvIHN3YXAtb3V0CitXaGVuIGEgY2dyb3VwIGhpdHMgbWVtb3J5Lm1lbXN3LmxpbWl0X2luX2J5dGVzLCBpdCdzIHVzZWxlc3MgdG8gZG8gc3dhcC1vdXQKIGluIHRoaXMgY2dyb3VwLiBUaGVuLCBzd2FwLW91dCB3aWxsIG5vdCBiZSBkb25lIGJ5IGNncm91cCByb3V0aW5lIGFuZCBmaWxlCiBjYWNoZXMgYXJlIGRyb3BwZWQuIEJ1dCBhcyBtZW50aW9uZWQgYWJvdmUsIGdsb2JhbCBMUlUgY2FuIGRvIHN3YXBvdXQgbWVtb3J5CiBmcm9tIGl0IGZvciBzYW5pdHkgb2YgdGhlIHN5c3RlbSdzIG1lbW9yeSBtYW5hZ2VtZW50IHN0YXRlLiBZb3UgY2FuJ3QgZm9yYmlkCkBAIC0yNjMsMTYgKzI2NCwxNyBAQAogYy4gRW5hYmxlIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCiBkLiBFbmFibGUgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUCAodG8gdXNlIHN3YXAgZXh0ZW5zaW9uKQogCi0xLiBQcmVwYXJlIHRoZSBjZ3JvdXBzCi0jIG1rZGlyIC1wIC9jZ3JvdXBzCi0jIG1vdW50IC10IGNncm91cCBub25lIC9jZ3JvdXBzIC1vIG1lbW9yeQorMS4gUHJlcGFyZSB0aGUgY2dyb3VwcyAoc2VlIGNncm91cHMudHh0LCBXaHkgYXJlIGNncm91cHMgbmVlZGVkPykKKyMgbW91bnQgLXQgdG1wZnMgbm9uZSAvc3lzL2ZzL2Nncm91cAorIyBta2RpciAvc3lzL2ZzL2Nncm91cC9tZW1vcnkKKyMgbW91bnQgLXQgY2dyb3VwIG5vbmUgL3N5cy9mcy9jZ3JvdXAvbWVtb3J5IC1vIG1lbW9yeQogCiAyLiBNYWtlIHRoZSBuZXcgZ3JvdXAgYW5kIG1vdmUgYmFzaCBpbnRvIGl0Ci0jIG1rZGlyIC9jZ3JvdXBzLzAKLSMgZWNobyAkJCA+IC9jZ3JvdXBzLzAvdGFza3MKKyMgbWtkaXIgL3N5cy9mcy9jZ3JvdXAvbWVtb3J5LzAKKyMgZWNobyAkJCA+IC9zeXMvZnMvY2dyb3VwL21lbW9yeS8wL3Rhc2tzCiAKIFNpbmNlIG5vdyB3ZSdyZSBpbiB0aGUgMCBjZ3JvdXAsIHdlIGNhbiBhbHRlciB0aGUgbWVtb3J5IGxpbWl0OgotIyBlY2hvIDRNID4gL2Nncm91cHMvMC9tZW1vcnkubGltaXRfaW5fYnl0ZXMKKyMgZWNobyA0TSA+IC9zeXMvZnMvY2dyb3VwL21lbW9yeS8wL21lbW9yeS5saW1pdF9pbl9ieXRlcwogCiBOT1RFOiBXZSBjYW4gdXNlIGEgc3VmZml4IChrLCBLLCBtLCBNLCBnIG9yIEcpIHRvIGluZGljYXRlIHZhbHVlcyBpbiBraWxvLAogbWVnYSBvciBnaWdhYnl0ZXMuIChIZXJlLCBLaWxvLCBNZWdhLCBHaWdhIGFyZSBLaWJpYnl0ZXMsIE1lYmlieXRlcywgR2liaWJ5dGVzLikKQEAgLTI4MCwxMSArMjgyLDExIEBACiBOT1RFOiBXZSBjYW4gd3JpdGUgIi0xIiB0byByZXNldCB0aGUgKi5saW1pdF9pbl9ieXRlcyh1bmxpbWl0ZWQpLgogTk9URTogV2UgY2Fubm90IHNldCBsaW1pdHMgb24gdGhlIHJvb3QgY2dyb3VwIGFueSBtb3JlLgogCi0jIGNhdCAvY2dyb3Vwcy8wL21lbW9yeS5saW1pdF9pbl9ieXRlcworIyBjYXQgL3N5cy9mcy9jZ3JvdXAvbWVtb3J5LzAvbWVtb3J5LmxpbWl0X2luX2J5dGVzCiA0MTk0MzA0CiAKIFdlIGNhbiBjaGVjayB0aGUgdXNhZ2U6Ci0jIGNhdCAvY2dyb3Vwcy8wL21lbW9yeS51c2FnZV9pbl9ieXRlcworIyBjYXQgL3N5cy9mcy9jZ3JvdXAvbWVtb3J5LzAvbWVtb3J5LnVzYWdlX2luX2J5dGVzCiAxMjE2NTEyCiAKIEEgc3VjY2Vzc2Z1bCB3cml0ZSB0byB0aGlzIGZpbGUgZG9lcyBub3QgZ3VhcmFudGVlIGEgc3VjY2Vzc2Z1bCBzZXQgb2YKQEAgLTQ2NCw2ICs0NjYsMjQgQEAKIElmIHlvdSB3YW50IHRvIGtub3cgbW9yZSBleGFjdCBtZW1vcnkgdXNhZ2UsIHlvdSBzaG91bGQgdXNlIFJTUytDQUNIRSgrU1dBUCkKIHZhbHVlIGluIG1lbW9yeS5zdGF0KHNlZSA1LjIpLgogCis1LjYgbnVtYV9zdGF0CisKK1RoaXMgaXMgc2ltaWxhciB0byBudW1hX21hcHMgYnV0IG9wZXJhdGVzIG9uIGEgcGVyLW1lbWNnIGJhc2lzLiAgVGhpcyBpcwordXNlZnVsIGZvciBwcm92aWRpbmcgdmlzaWJpbGl0eSBpbnRvIHRoZSBudW1hIGxvY2FsaXR5IGluZm9ybWF0aW9uIHdpdGhpbgorYW4gbWVtY2cgc2luY2UgdGhlIHBhZ2VzIGFyZSBhbGxvd2VkIHRvIGJlIGFsbG9jYXRlZCBmcm9tIGFueSBwaHlzaWNhbAorbm9kZS4gIE9uZSBvZiB0aGUgdXNlY2FzZXMgaXMgZXZhbHVhdGluZyBhcHBsaWNhdGlvbiBwZXJmb3JtYW5jZSBieQorY29tYmluaW5nIHRoaXMgaW5mb3JtYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24ncyBjcHUgYWxsb2NhdGlvbi4KKworV2UgZXhwb3J0ICJ0b3RhbCIsICJmaWxlIiwgImFub24iIGFuZCAidW5ldmljdGFibGUiIHBhZ2VzIHBlci1ub2RlIGZvcgorZWFjaCBtZW1jZy4gIFRoZSBvdXB1dCBmb3JtYXQgb2YgbWVtb3J5Lm51bWFfc3RhdCBpczoKKwordG90YWw9PHRvdGFsIHBhZ2VzPiBOMD08bm9kZSAwIHBhZ2VzPiBOMT08bm9kZSAxIHBhZ2VzPiAuLi4KK2ZpbGU9PHRvdGFsIGZpbGUgcGFnZXM+IE4wPTxub2RlIDAgcGFnZXM+IE4xPTxub2RlIDEgcGFnZXM+IC4uLgorYW5vbj08dG90YWwgYW5vbiBwYWdlcz4gTjA9PG5vZGUgMCBwYWdlcz4gTjE9PG5vZGUgMSBwYWdlcz4gLi4uCit1bmV2aWN0YWJsZT08dG90YWwgYW5vbiBwYWdlcz4gTjA9PG5vZGUgMCBwYWdlcz4gTjE9PG5vZGUgMSBwYWdlcz4gLi4uCisKK0FuZCB3ZSBoYXZlIHRvdGFsID0gZmlsZSArIGFub24gKyB1bmV2aWN0YWJsZS4KKwogNi4gSGllcmFyY2h5IHN1cHBvcnQKIAogVGhlIG1lbW9yeSBjb250cm9sbGVyIHN1cHBvcnRzIGEgZGVlcCBoaWVyYXJjaHkgYW5kIGhpZXJhcmNoaWNhbCBhY2NvdW50aW5nLgpAQCAtNDcxLDEzICs0OTEsMTMgQEAKIGNncm91cCBmaWxlc3lzdGVtLiBDb25zaWRlciBmb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjZ3JvdXAgZmlsZXN5c3RlbQogaGllcmFyY2h5CiAKLQkJcm9vdAorCSAgICAgICByb290CiAJICAgICAvICB8ICAgXAotICAgICAgICAgICAvCXwgICAgXAotCSAgYQliCWMKLQkJCXwgXAotCQkJfCAgXAotCQkJZCAgIGUKKyAgICAgICAgICAgIC8JfCAgICBcCisJICAgYQliICAgICBjCisJCSAgICAgIHwgXAorCQkgICAgICB8ICBcCisJCSAgICAgIGQgICBlCiAKIEluIHRoZSBkaWFncmFtIGFib3ZlLCB3aXRoIGhpZXJhcmNoaWNhbCBhY2NvdW50aW5nIGVuYWJsZWQsIGFsbCBtZW1vcnkKIHVzYWdlIG9mIGUsIGlzIGFjY291bnRlZCB0byBpdHMgYW5jZXN0b3JzIHVwIHVudGlsIHRoZSByb290IChpLmUsIGMgYW5kIHJvb3QpLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHUtZHJpdmVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dAppbmRleCA2YzMwZTkzLi5jNDM2MDk2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dApAQCAtMTY4LDcgKzE2OCw3IEBACiB0byBwb2xpY3ktPm1heCwgYW5kIC1pZiBzdXBwb3J0ZWQtIHNlbGVjdCBhIHBlcmZvcm1hbmNlLW9yaWVudGVkCiBzZXR0aW5nIHdoZW4gcG9saWN5LT5wb2xpY3kgaXMgQ1BVRlJFUV9QT0xJQ1lfUEVSRk9STUFOQ0UsIGFuZCBhCiBwb3dlcnNhdmluZy1vcmllbnRlZCBzZXR0aW5nIHdoZW4gQ1BVRlJFUV9QT0xJQ1lfUE9XRVJTQVZFLiBBbHNvIGNoZWNrCi10aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGluIGFyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ3J1bi5jCit0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGluIGRyaXZlcnMvY3B1ZnJlcS9sb25ncnVuLmMKIAogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZwppbmRleCBmM2YxYTQ2Li44M2Y1ZjViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nCkBAIC0yNDQsNyArMjQ0LDcgQEAKICAtIERFQlVHX1NMQUIgY2FuIGZpbmQgYSB2YXJpZXR5IG9mIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB1c2UgZXJyb3JzOyBpdAogICAgc2hvdWxkIGJlIHVzZWQgb24gbW9zdCBkZXZlbG9wbWVudCBrZXJuZWxzLgogCi0gLSBERUJVR19TUElOTE9DSywgREVCVUdfU1BJTkxPQ0tfU0xFRVAsIGFuZCBERUJVR19NVVRFWEVTIHdpbGwgZmluZCBhCisgLSBERUJVR19TUElOTE9DSywgREVCVUdfQVRPTUlDX1NMRUVQLCBhbmQgREVCVUdfTVVURVhFUyB3aWxsIGZpbmQgYQogICAgbnVtYmVyIG9mIGNvbW1vbiBsb2NraW5nIGVycm9ycy4KIAogVGhlcmUgYXJlIHF1aXRlIGEgZmV3IG90aGVyIGRlYnVnZ2luZyBvcHRpb25zLCBzb21lIG9mIHdoaWNoIHdpbGwgYmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vcG11LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vcG11LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzA0NGViCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9wbXUudHh0CkBAIC0wLDAgKzEsMjEgQEAKKyogQVJNIFBlcmZvcm1hbmNlIE1vbml0b3IgVW5pdHMKKworQVJNIGNvcmVzIG9mdGVuIGhhdmUgYSBQTVUgZm9yIGNvdW50aW5nIGNwdSBhbmQgY2FjaGUgZXZlbnRzIGxpa2UgY2FjaGUgbWlzc2VzCithbmQgaGl0cy4gVGhlIGludGVyZmFjZSB0byB0aGUgUE1VIGlzIHBhcnQgb2YgdGhlIEFSTSBBUk0uIFRoZSBBUk0gUE1VCityZXByZXNlbnRhdGlvbiBpbiB0aGUgZGV2aWNlIHRyZWUgc2hvdWxkIGJlIGRvbmUgYXMgdW5kZXI6LQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgb25lIG9mCisJImFybSxjb3J0ZXgtYTktcG11IgorCSJhcm0sY29ydGV4LWE4LXBtdSIKKwkiYXJtLGFybTExNzYtcG11IgorCSJhcm0sYXJtMTEzNi1wbXUiCistIGludGVycnVwdHMgOiAxIGNvbWJpbmVkIGludGVycnVwdCBvciAxIHBlciBjb3JlLgorCitFeGFtcGxlOgorCitwbXUgeworICAgICAgICBjb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTktcG11IjsKKyAgICAgICAgaW50ZXJydXB0cyA9IDwxMDAgMTAxPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3ByaW1lY2VsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3ByaW1lY2VsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1ZDdhOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vcHJpbWVjZWxsLnR4dApAQCAtMCwwICsxLDIxIEBACisqIEFSTSBQcmltZWNlbGwgUGVyaXBoZXJhbHMKKworQVJNLCBMdGQuIFByaW1lY2VsbCBwZXJpcGhlcmFscyBoYXZlIGEgc3RhbmRhcmQgaWQgcmVnaXN0ZXIgdGhhdCBjYW4gYmUgdXNlZCB0bworaWRlbnRpZnkgdGhlIHBlcmlwaGVyYWwgdHlwZSwgdmVuZG9yLCBhbmQgcmV2aXNpb24uIFRoaXMgdmFsdWUgY2FuIGJlIHVzZWQgZm9yCitkcml2ZXIgbWF0Y2hpbmcuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBhIHNwZWNpZmljIHZhbHVlIGZvciBwZXJpcGhlcmFsIGFuZCAiYXJtLHByaW1lY2VsbCIKKworT3B0aW9uYWwgcHJvcGVydGllczoKKworLSBhcm0scHJpbWVjZWxsLXBlcmlwaGlkIDogVmFsdWUgdG8gb3ZlcnJpZGUgdGhlIGgvdyB2YWx1ZSB3aXRoCisKK0V4YW1wbGU6CisKK3NlcmlhbEBmZmYzNjAwMCB7CisJY29tcGF0aWJsZSA9ICJhcm0scGwwMTEiLCAiYXJtLHByaW1lY2VsbCI7CisJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMzQxMDExPjsKK307CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jcnlwdG8vZnNsLXNlYzIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2NyeXB0by9mc2wtc2VjMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5ODhlZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jcnlwdG8vZnNsLXNlYzIudHh0CkBAIC0wLDAgKzEsNjggQEAKK0ZyZWVzY2FsZSBTb0MgU0VDIFNlY3VyaXR5IEVuZ2luZXMgdmVyc2lvbnMgMi54LTMueAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUgOiBTaG91bGQgY29udGFpbiBlbnRyaWVzIGZvciB0aGlzIGFuZCBiYWNrd2FyZCBjb21wYXRpYmxlCisgIFNFQyB2ZXJzaW9ucywgaGlnaCB0byBsb3csIGUuZy4sICJmc2wsc2VjMi4xIiwgImZzbCxzZWMyLjAiCistIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKKy0gaW50ZXJydXB0cyA6IHRoZSBTRUMncyBpbnRlcnJ1cHQgbnVtYmVyCistIGZzbCxudW0tY2hhbm5lbHMgOiBBbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgIGF2YWlsYWJsZS4KKy0gZnNsLGNoYW5uZWwtZmlmby1sZW4gOiBBbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mCisgIGRlc2NyaXB0b3IgcG9pbnRlcnMgZWFjaCBjaGFubmVsIGZldGNoIGZpZm8gY2FuIGhvbGQuCistIGZzbCxleGVjLXVuaXRzLW1hc2sgOiBUaGUgYml0bWFzayByZXByZXNlbnRpbmcgd2hhdCBleGVjdXRpb24gdW5pdHMKKyAgKEVVcykgYXJlIGF2YWlsYWJsZS4gSXQncyBhIHNpbmdsZSAzMi1iaXQgY2VsbC4gRVUgaW5mb3JtYXRpb24KKyAgc2hvdWxkIGJlIGVuY29kZWQgZm9sbG93aW5nIHRoZSBTRUMncyBEZXNjcmlwdG9yIEhlYWRlciBEd29yZAorICBFVV9TRUwwIGZpZWxkIGRvY3VtZW50YXRpb24sIGkuZS4gYXMgZm9sbG93czoKKworCWJpdCAwICA9IHJlc2VydmVkIC0gc2hvdWxkIGJlIDAKKwliaXQgMSAgPSBzZXQgaWYgU0VDIGhhcyB0aGUgQVJDNCBFVSAoQUZFVSkKKwliaXQgMiAgPSBzZXQgaWYgU0VDIGhhcyB0aGUgREVTLzNERVMgRVUgKERFVSkKKwliaXQgMyAgPSBzZXQgaWYgU0VDIGhhcyB0aGUgbWVzc2FnZSBkaWdlc3QgRVUgKE1ERVUvTURFVS1BKQorCWJpdCA0ICA9IHNldCBpZiBTRUMgaGFzIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBFVSAoUk5HKQorCWJpdCA1ICA9IHNldCBpZiBTRUMgaGFzIHRoZSBwdWJsaWMga2V5IEVVIChQS0VVKQorCWJpdCA2ICA9IHNldCBpZiBTRUMgaGFzIHRoZSBBRVMgRVUgKEFFU1UpCisJYml0IDcgID0gc2V0IGlmIFNFQyBoYXMgdGhlIEthc3VtaSBFVSAoS0VVKQorCWJpdCA4ICA9IHNldCBpZiBTRUMgaGFzIHRoZSBDUkMgRVUgKENSQ1UpCisJYml0IDExID0gc2V0IGlmIFNFQyBoYXMgdGhlIG1lc3NhZ2UgZGlnZXN0IEVVIGV4dGVuZGVkIGFsZyBzZXQgKE1ERVUtQikKKworcmVtYWluaW5nIGJpdHMgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgU0VDIEVVcy4KKworLSBmc2wsZGVzY3JpcHRvci10eXBlcy1tYXNrIDogVGhlIGJpdG1hc2sgcmVwcmVzZW50aW5nIHdoYXQgZGVzY3JpcHRvcnMKKyAgYXJlIGF2YWlsYWJsZS4gSXQncyBhIHNpbmdsZSAzMi1iaXQgY2VsbC4gRGVzY3JpcHRvciB0eXBlIGluZm9ybWF0aW9uCisgIHNob3VsZCBiZSBlbmNvZGVkIGZvbGxvd2luZyB0aGUgU0VDJ3MgRGVzY3JpcHRvciBIZWFkZXIgRHdvcmQgREVTQ19UWVBFCisgIGZpZWxkIGRvY3VtZW50YXRpb24sIGkuZS4gYXMgZm9sbG93czoKKworCWJpdCAwICA9IHNldCBpZiBTRUMgc3VwcG9ydHMgdGhlIGFlc3VfY3RyX25vbnNub29wIGRlc2MuIHR5cGUKKwliaXQgMSAgPSBzZXQgaWYgU0VDIHN1cHBvcnRzIHRoZSBpcHNlY19lc3AgZGVzY3JpcHRvciB0eXBlCisJYml0IDIgID0gc2V0IGlmIFNFQyBzdXBwb3J0cyB0aGUgY29tbW9uX25vbnNub29wIGRlc2MuIHR5cGUKKwliaXQgMyAgPSBzZXQgaWYgU0VDIHN1cHBvcnRzIHRoZSA4MDIuMTFpIEFFUyBjY21wIGRlc2MuIHR5cGUKKwliaXQgNCAgPSBzZXQgaWYgU0VDIHN1cHBvcnRzIHRoZSBobWFjX3Nub29wX25vX2FmZXUgZGVzYy4gdHlwZQorCWJpdCA1ICA9IHNldCBpZiBTRUMgc3VwcG9ydHMgdGhlIHNydHAgZGVzY3JpcHRvciB0eXBlCisJYml0IDYgID0gc2V0IGlmIFNFQyBzdXBwb3J0cyB0aGUgbm9uX2htYWNfc25vb3Bfbm9fYWZldSBkZXNjLnR5cGUKKwliaXQgNyAgPSBzZXQgaWYgU0VDIHN1cHBvcnRzIHRoZSBwa2V1X2Fzc2VtYmxlIGRlc2NyaXB0b3IgdHlwZQorCWJpdCA4ICA9IHNldCBpZiBTRUMgc3VwcG9ydHMgdGhlIGFlc3Vfa2V5X2V4cGFuZF9vdXRwdXQgZGVzYy50eXBlCisJYml0IDkgID0gc2V0IGlmIFNFQyBzdXBwb3J0cyB0aGUgcGtldV9wdG11bCBkZXNjcmlwdG9yIHR5cGUKKwliaXQgMTAgPSBzZXQgaWYgU0VDIHN1cHBvcnRzIHRoZSBjb21tb25fbm9uc25vb3BfYWZldSBkZXNjLiB0eXBlCisJYml0IDExID0gc2V0IGlmIFNFQyBzdXBwb3J0cyB0aGUgcGtldV9wdGFkZF9kYmwgZGVzY3JpcHRvciB0eXBlCisKKyAgLi5hbmQgc28gb24gYW5kIHNvIGZvcnRoLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCistIGludGVycnVwdC1wYXJlbnQgOiB0aGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyIHRoYXQKKyAgc2VydmljZXMgaW50ZXJydXB0cyBmb3IgdGhpcyBkZXZpY2UuCisKK0V4YW1wbGU6CisKKwkvKiBNUEM4NTQ4RSAqLworCWNyeXB0b0AzMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNlYzIuMSIsICJmc2wsc2VjMi4wIjsKKwkJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47CisJCWludGVycnVwdHMgPSA8MjkgMj47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlmc2wsbnVtLWNoYW5uZWxzID0gPDQ+OworCQlmc2wsY2hhbm5lbC1maWZvLWxlbiA9IDwyND47CisJCWZzbCxleGVjLXVuaXRzLW1hc2sgPSA8MHhmZT47CisJCWZzbCxkZXNjcmlwdG9yLXR5cGVzLW1hc2sgPSA8MHgxMmIwZWJmPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZnNsLWlteC1ncGlvLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2ZzbC1pbXgtZ3Bpby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2M2FlNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2ZzbC1pbXgtZ3Bpby50eHQKQEAgLTAsMCArMSwyMiBAQAorKiBGcmVlc2NhbGUgaS5NWC9NWEMgR1BJTyBjb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgImZzbCw8c29jPi1ncGlvIgorLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQorLSBpbnRlcnJ1cHRzIDogU2hvdWxkIGJlIHRoZSBwb3J0IGludGVycnVwdCBzaGFyZWQgYnkgYWxsIDMyIHBpbnMsIGlmCisgIG9uZSBudW1iZXIuICBJZiB0d28gbnVtYmVycywgdGhlIGZpcnN0IG9uZSBpcyB0aGUgaW50ZXJydXB0IHNoYXJlZAorICBieSBsb3cgMTYgcGlucyBhbmQgdGhlIHNlY29uZCBvbmUgaXMgZm9yIGhpZ2ggMTYgcGlucy4KKy0gZ3Bpby1jb250cm9sbGVyIDogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgZ3BpbyBjb250cm9sbGVyLgorLSAjZ3Bpby1jZWxscyA6IFNob3VsZCBiZSB0d28uICBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlciBhbmQKKyAgdGhlIHNlY29uZCBjZWxsIGlzIHVzZWQgdG8gc3BlY2lmeSBvcHRpb25hbCBwYXJhbWV0ZXJzIChjdXJyZW50bHkKKyAgdW51c2VkKS4KKworRXhhbXBsZToKKworZ3BpbzA6IGdwaW9ANzNmODQwMDAgeworCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWdwaW8iLCAiZnNsLGlteDMxLWdwaW8iOworCXJlZyA9IDwweDczZjg0MDAwIDB4NDAwMD47CisJaW50ZXJydXB0cyA9IDw1MCA1MT47CisJZ3Bpby1jb250cm9sbGVyOworCSNncGlvLWNlbGxzID0gPDI+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby50eHQKaW5kZXggZWRhYTg0ZC4uNGUxNmJhNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby50eHQKQEAgLTQsMTcgKzQsNDUgQEAKIDEpIGdwaW9zIHByb3BlcnR5CiAtLS0tLS0tLS0tLS0tLS0tLQogCi1Ob2RlcyB0aGF0IG1ha2VzIHVzZSBvZiBHUElPcyBzaG91bGQgZGVmaW5lIHRoZW0gdXNpbmcgYGdwaW9zJyBwcm9wZXJ0eSwKLWZvcm1hdCBvZiB3aGljaCBpczogPCZncGlvLWNvbnRyb2xsZXIxLXBoYW5kbGUgZ3BpbzEtc3BlY2lmaWVyCi0JCSAgICAgJmdwaW8tY29udHJvbGxlcjItcGhhbmRsZSBncGlvMi1zcGVjaWZpZXIKLQkJICAgICAwIC8qIGhvbGVzIGFyZSBwZXJtaXR0ZWQsIG1lYW5zIG5vIEdQSU8gMyAqLwotCQkgICAgICZncGlvLWNvbnRyb2xsZXI0LXBoYW5kbGUgZ3BpbzQtc3BlY2lmaWVyCi0JCSAgICAgLi4uPjsKK05vZGVzIHRoYXQgbWFrZXMgdXNlIG9mIEdQSU9zIHNob3VsZCBzcGVjaWZ5IHRoZW0gdXNpbmcgb25lIG9yIG1vcmUKK3Byb3BlcnRpZXMsIGVhY2ggY29udGFpbmluZyBhICdncGlvLWxpc3QnOgogCi1Ob3RlIHRoYXQgZ3Bpby1zcGVjaWZpZXIgbGVuZ3RoIGlzIGNvbnRyb2xsZXIgZGVwZW5kZW50LgorCWdwaW8tbGlzdCA6Oj0gPHNpbmdsZS1ncGlvPiBbZ3Bpby1saXN0XQorCXNpbmdsZS1ncGlvIDo6PSA8Z3Bpby1waGFuZGxlPiA8Z3Bpby1zcGVjaWZpZXI+CisJZ3Bpby1waGFuZGxlIDogcGhhbmRsZSB0byBncGlvIGNvbnRyb2xsZXIgbm9kZQorCWdwaW8tc3BlY2lmaWVyIDogQXJyYXkgb2YgI2dwaW8tY2VsbHMgc3BlY2lmeWluZyBzcGVjaWZpYyBncGlvCisJCQkgKGNvbnRyb2xsZXIgc3BlY2lmaWMpCisKK0dQSU8gcHJvcGVydGllcyBzaG91bGQgYmUgbmFtZWQgIls8bmFtZT4tXWdwaW9zIi4gIEV4YWN0CittZWFuaW5nIG9mIGVhY2ggZ3Bpb3MgcHJvcGVydHkgbXVzdCBiZSBkb2N1bWVudGVkIGluIHRoZSBkZXZpY2UgdHJlZQorYmluZGluZyBmb3IgZWFjaCBkZXZpY2UuCisKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvdWxkIGJlIHVzZWQgdG8gZGVzY3JpYmUgZ3Bpb3MgcGlucyB0byB1c2UKK2FzIGNoaXAgc2VsZWN0IGxpbmVzOyB3aXRoIGNoaXAgc2VsZWN0cyAwLCAxIGFuZCAzIHBvcHVsYXRlZCwgYW5kIGNoaXAKK3NlbGVjdCAyIGxlZnQgZW1wdHk6CisKKwlncGlvMTogZ3BpbzEgeworCQlncGlvLWNvbnRyb2xsZXIKKwkJICNncGlvLWNlbGxzID0gPDI+OworCX07CisJZ3BpbzI6IGdwaW8yIHsKKwkJZ3Bpby1jb250cm9sbGVyCisJCSAjZ3Bpby1jZWxscyA9IDwxPjsKKwl9OworCVsuLi5dCisJIGNoaXBzZWwtZ3Bpb3MgPSA8JmdwaW8xIDEyIDA+LAorCQkJIDwmZ3BpbzEgMTMgMD4sCisJCQkgPDA+LCAvKiBob2xlcyBhcmUgcGVybWl0dGVkLCBtZWFucyBubyBHUElPIDIgKi8KKwkJCSA8JmdwaW8yIDI+OworCitOb3RlIHRoYXQgZ3Bpby1zcGVjaWZpZXIgbGVuZ3RoIGlzIGNvbnRyb2xsZXIgZGVwZW5kZW50LiAgSW4gdGhlCithYm92ZSBleGFtcGxlLCAmZ3BpbzEgdXNlcyAyIGNlbGxzIHRvIHNwZWNpZnkgYSBncGlvLCB3aGlsZSAmZ3BpbzIKK29ubHkgdXNlcyBvbmUuCiAKIGdwaW8tc3BlY2lmaWVyIG1heSBlbmNvZGU6IGJhbmssIHBpbiBwb3NpdGlvbiBpbnNpZGUgdGhlIGJhbmssCiB3aGV0aGVyIHBpbiBpcyBvcGVuLWRyYWluIGFuZCB3aGV0aGVyIHBpbiBpcyBsb2dpY2FsbHkgaW52ZXJ0ZWQuCitFeGFjdCBtZWFuaW5nIG9mIGVhY2ggc3BlY2lmaWVyIGNlbGwgaXMgY29udHJvbGxlciBzcGVjaWZpYywgYW5kIG11c3QKK2JlIGRvY3VtZW50ZWQgaW4gdGhlIGRldmljZSB0cmVlIGJpbmRpbmcgZm9yIHRoZSBkZXZpY2UuCiAKIEV4YW1wbGUgb2YgdGhlIG5vZGUgdXNpbmcgR1BJT3M6CiAKQEAgLTI4LDggKzU2LDggQEAKIDIpIGdwaW8tY29udHJvbGxlciBub2RlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUV2ZXJ5IEdQSU8gY29udHJvbGxlciBub2RlIG11c3QgaGF2ZSAjZ3Bpby1jZWxscyBwcm9wZXJ0eSBkZWZpbmVkLAotdGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgdG8gdHJhbnNsYXRlIGdwaW8tc3BlY2lmaWVycy4KK0V2ZXJ5IEdQSU8gY29udHJvbGxlciBub2RlIG11c3QgYm90aCBhbiBlbXB0eSAiZ3Bpby1jb250cm9sbGVyIgorcHJvcGVydHksIGFuZCBoYXZlICNncGlvLWNlbGxzIGNvbnRhaW4gdGhlIHNpemUgb2YgdGhlIGdwaW8tc3BlY2lmaWVyLgogCiBFeGFtcGxlIG9mIHR3byBTT0MgR1BJTyBiYW5rcyBkZWZpbmVkIGFzIGdwaW8tY29udHJvbGxlciBub2RlczoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpb19udmlkaWEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpb19udmlkaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNGI1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvX252aWRpYS50eHQKQEAgLTAsMCArMSw4IEBACitOVklESUEgVGVncmEgMiBHUElPIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJudmlkaWEsdGVncmEyMC1ncGlvIgorLSAjZ3Bpby1jZWxscyA6IFNob3VsZCBiZSB0d28uIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBwaW4gbnVtYmVyIGFuZCB0aGUKKyAgc2Vjb25kIGNlbGwgaXMgdXNlZCB0byBzcGVjaWZ5IG9wdGlvbmFsIHBhcmFtZXRlcnM6CisgIC0gYml0IDAgc3BlY2lmaWVzIHBvbGFyaXR5ICgwIGZvciBub3JtYWwsIDEgZm9yIGludmVydGVkKQorLSBncGlvLWNvbnRyb2xsZXIgOiBNYXJrcyB0aGUgZGV2aWNlIG5vZGUgYXMgYSBHUElPIGNvbnRyb2xsZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2Nhbi9mc2wtZmxleGNhbi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2Nhbi9mc2wtZmxleGNhbi50eHQKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL3NlYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvc2VjLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2ZjJkNC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvc2VjLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLUZyZWVzY2FsZSBTb0MgU0VDIFNlY3VyaXR5IEVuZ2luZXMKLQotUmVxdWlyZWQgcHJvcGVydGllczoKLQotLSBjb21wYXRpYmxlIDogU2hvdWxkIGNvbnRhaW4gZW50cmllcyBmb3IgdGhpcyBhbmQgYmFja3dhcmQgY29tcGF0aWJsZQotICBTRUMgdmVyc2lvbnMsIGhpZ2ggdG8gbG93LCBlLmcuLCAiZnNsLHNlYzIuMSIsICJmc2wsc2VjMi4wIgotLSByZWcgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCi0tIGludGVycnVwdHMgOiB0aGUgU0VDJ3MgaW50ZXJydXB0IG51bWJlcgotLSBmc2wsbnVtLWNoYW5uZWxzIDogQW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBjaGFubmVscwotICBhdmFpbGFibGUuCi0tIGZzbCxjaGFubmVsLWZpZm8tbGVuIDogQW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZgotICBkZXNjcmlwdG9yIHBvaW50ZXJzIGVhY2ggY2hhbm5lbCBmZXRjaCBmaWZvIGNhbiBob2xkLgotLSBmc2wsZXhlYy11bml0cy1tYXNrIDogVGhlIGJpdG1hc2sgcmVwcmVzZW50aW5nIHdoYXQgZXhlY3V0aW9uIHVuaXRzCi0gIChFVXMpIGFyZSBhdmFpbGFibGUuIEl0J3MgYSBzaW5nbGUgMzItYml0IGNlbGwuIEVVIGluZm9ybWF0aW9uCi0gIHNob3VsZCBiZSBlbmNvZGVkIGZvbGxvd2luZyB0aGUgU0VDJ3MgRGVzY3JpcHRvciBIZWFkZXIgRHdvcmQKLSAgRVVfU0VMMCBmaWVsZCBkb2N1bWVudGF0aW9uLCBpLmUuIGFzIGZvbGxvd3M6Ci0KLQliaXQgMCAgPSByZXNlcnZlZCAtIHNob3VsZCBiZSAwCi0JYml0IDEgID0gc2V0IGlmIFNFQyBoYXMgdGhlIEFSQzQgRVUgKEFGRVUpCi0JYml0IDIgID0gc2V0IGlmIFNFQyBoYXMgdGhlIERFUy8zREVTIEVVIChERVUpCi0JYml0IDMgID0gc2V0IGlmIFNFQyBoYXMgdGhlIG1lc3NhZ2UgZGlnZXN0IEVVIChNREVVL01ERVUtQSkKLQliaXQgNCAgPSBzZXQgaWYgU0VDIGhhcyB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgRVUgKFJORykKLQliaXQgNSAgPSBzZXQgaWYgU0VDIGhhcyB0aGUgcHVibGljIGtleSBFVSAoUEtFVSkKLQliaXQgNiAgPSBzZXQgaWYgU0VDIGhhcyB0aGUgQUVTIEVVIChBRVNVKQotCWJpdCA3ICA9IHNldCBpZiBTRUMgaGFzIHRoZSBLYXN1bWkgRVUgKEtFVSkKLQliaXQgOCAgPSBzZXQgaWYgU0VDIGhhcyB0aGUgQ1JDIEVVIChDUkNVKQotCWJpdCAxMSA9IHNldCBpZiBTRUMgaGFzIHRoZSBtZXNzYWdlIGRpZ2VzdCBFVSBleHRlbmRlZCBhbGcgc2V0IChNREVVLUIpCi0KLXJlbWFpbmluZyBiaXRzIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIFNFQyBFVXMuCi0KLS0gZnNsLGRlc2NyaXB0b3ItdHlwZXMtbWFzayA6IFRoZSBiaXRtYXNrIHJlcHJlc2VudGluZyB3aGF0IGRlc2NyaXB0b3JzCi0gIGFyZSBhdmFpbGFibGUuIEl0J3MgYSBzaW5nbGUgMzItYml0IGNlbGwuIERlc2NyaXB0b3IgdHlwZSBpbmZvcm1hdGlvbgotICBzaG91bGQgYmUgZW5jb2RlZCBmb2xsb3dpbmcgdGhlIFNFQydzIERlc2NyaXB0b3IgSGVhZGVyIER3b3JkIERFU0NfVFlQRQotICBmaWVsZCBkb2N1bWVudGF0aW9uLCBpLmUuIGFzIGZvbGxvd3M6Ci0KLQliaXQgMCAgPSBzZXQgaWYgU0VDIHN1cHBvcnRzIHRoZSBhZXN1X2N0cl9ub25zbm9vcCBkZXNjLiB0eXBlCi0JYml0IDEgID0gc2V0IGlmIFNFQyBzdXBwb3J0cyB0aGUgaXBzZWNfZXNwIGRlc2NyaXB0b3IgdHlwZQotCWJpdCAyICA9IHNldCBpZiBTRUMgc3VwcG9ydHMgdGhlIGNvbW1vbl9ub25zbm9vcCBkZXNjLiB0eXBlCi0JYml0IDMgID0gc2V0IGlmIFNFQyBzdXBwb3J0cyB0aGUgODAyLjExaSBBRVMgY2NtcCBkZXNjLiB0eXBlCi0JYml0IDQgID0gc2V0IGlmIFNFQyBzdXBwb3J0cyB0aGUgaG1hY19zbm9vcF9ub19hZmV1IGRlc2MuIHR5cGUKLQliaXQgNSAgPSBzZXQgaWYgU0VDIHN1cHBvcnRzIHRoZSBzcnRwIGRlc2NyaXB0b3IgdHlwZQotCWJpdCA2ICA9IHNldCBpZiBTRUMgc3VwcG9ydHMgdGhlIG5vbl9obWFjX3Nub29wX25vX2FmZXUgZGVzYy50eXBlCi0JYml0IDcgID0gc2V0IGlmIFNFQyBzdXBwb3J0cyB0aGUgcGtldV9hc3NlbWJsZSBkZXNjcmlwdG9yIHR5cGUKLQliaXQgOCAgPSBzZXQgaWYgU0VDIHN1cHBvcnRzIHRoZSBhZXN1X2tleV9leHBhbmRfb3V0cHV0IGRlc2MudHlwZQotCWJpdCA5ICA9IHNldCBpZiBTRUMgc3VwcG9ydHMgdGhlIHBrZXVfcHRtdWwgZGVzY3JpcHRvciB0eXBlCi0JYml0IDEwID0gc2V0IGlmIFNFQyBzdXBwb3J0cyB0aGUgY29tbW9uX25vbnNub29wX2FmZXUgZGVzYy4gdHlwZQotCWJpdCAxMSA9IHNldCBpZiBTRUMgc3VwcG9ydHMgdGhlIHBrZXVfcHRhZGRfZGJsIGRlc2NyaXB0b3IgdHlwZQotCi0gIC4uYW5kIHNvIG9uIGFuZCBzbyBmb3J0aC4KLQotT3B0aW9uYWwgcHJvcGVydGllczoKLQotLSBpbnRlcnJ1cHQtcGFyZW50IDogdGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0aGF0Ci0gIHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlLgotCi1FeGFtcGxlOgotCi0JLyogTVBDODU0OEUgKi8KLQljcnlwdG9AMzAwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxzZWMyLjEiLCAiZnNsLHNlYzIuMCI7Ci0JCXJlZyA9IDwweDMwMDAwIDB4MTAwMDA+OwotCQlpbnRlcnJ1cHRzID0gPDI5IDI+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJZnNsLG51bS1jaGFubmVscyA9IDw0PjsKLQkJZnNsLGNoYW5uZWwtZmlmby1sZW4gPSA8MjQ+OwotCQlmc2wsZXhlYy11bml0cy1tYXNrID0gPDB4ZmU+OwotCQlmc2wsZGVzY3JpcHRvci10eXBlcy1tYXNrID0gPDB4MTJiMGViZj47Ci0JfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvZnNsLWlteC1jc3BpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvZnNsLWlteC1jc3BpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQxMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9mc2wtaW14LWNzcGkudHh0CkBAIC0wLDAgKzEsMjIgQEAKKyogRnJlZXNjYWxlIChFbmhhbmNlZCkgQ29uZmlndXJhYmxlIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZQorICAoQ1NQSS9lQ1NQSSkgZm9yIGkuTVgKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiZnNsLDxzb2M+LWNzcGkiIG9yICJmc2wsPHNvYz4tZWNzcGkiCistIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKKy0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIENTUEkvZUNTUEkgaW50ZXJydXB0CistIGZzbCxzcGktbnVtLWNoaXBzZWxlY3RzIDogQ29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUgY2hpcHNlbGVjdAorLSBjcy1ncGlvcyA6IFNwZWNpZmllcyB0aGUgZ3BpbyBwaW5zIHRvIGJlIHVzZWQgZm9yIGNoaXBzZWxlY3RzLgorCitFeGFtcGxlOgorCitlY3NwaUA3MDAxMDAwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZWNzcGkiOworCXJlZyA9IDwweDcwMDEwMDAwIDB4NDAwMD47CisJaW50ZXJydXB0cyA9IDwzNj47CisJZnNsLHNwaS1udW0tY2hpcHNlbGVjdHMgPSA8Mj47CisJY3MtZ3Bpb3MgPSA8JmdwaW8zIDI0IDA+LCAvKiBHUElPNF8yNCAqLworCQkgICA8JmdwaW8zIDI1IDA+OyAvKiBHUElPNF8yNSAqLworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpX252aWRpYS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaV9udmlkaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOWU1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaV9udmlkaWEudHh0CkBAIC0wLDAgKzEsNSBAQAorTlZJRElBIFRlZ3JhIDIgU1BJIGRldmljZQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJudmlkaWEsdGVncmEyMC1zcGkiLgorLSBncGlvcyA6IHNob3VsZCBzcGVjaWZ5IEdQSU9zIHVzZWQgZm9yIGNoaXBzZWxlY3QuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdHR5L3NlcmlhbC9vZi1zZXJpYWwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3R0eS9zZXJpYWwvb2Ytc2VyaWFsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGIyN2IwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3R0eS9zZXJpYWwvb2Ytc2VyaWFsLnR4dApAQCAtMCwwICsxLDM2IEBACisqIFVBUlQgKFVuaXZlcnNhbCBBc3luY2hyb25vdXMgUmVjZWl2ZXIvVHJhbnNtaXR0ZXIpCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBvbmUgb2Y6CisJLSAibnM4MjUwIgorCS0gIm5zMTY0NTAiCisJLSAibnMxNjU1MGEiCisJLSAibnMxNjU1MCIKKwktICJuczE2NzUwIgorCS0gIm5zMTY4NTAiCisJLSAibnZpZGlhLHRlZ3JhMjAtdWFydCIKKwktICJpYm0scXBhY2UtbndwLXNlcmlhbCIKKwktICJzZXJpYWwiIGlmIHRoZSBwb3J0IHR5cGUgaXMgdW5rbm93bi4KKy0gcmVnIDogb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4KKy0gaW50ZXJydXB0cyA6IHNob3VsZCBjb250YWluIHVhcnQgaW50ZXJydXB0LgorLSBjbG9jay1mcmVxdWVuY3kgOiB0aGUgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IGZvciB0aGUgVUFSVC4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gY3VycmVudC1zcGVlZCA6IHRoZSBjdXJyZW50IGFjdGl2ZSBzcGVlZCBvZiB0aGUgVUFSVC4KKy0gcmVnLW9mZnNldCA6IG9mZnNldCB0byBhcHBseSB0byB0aGUgbWFwYmFzZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcmVnaXN0ZXJzLgorLSByZWctc2hpZnQgOiBxdWFudGl0eSB0byBzaGlmdCB0aGUgcmVnaXN0ZXIgb2Zmc2V0cyBieS4KKy0gcmVnLWlvLXdpZHRoIDogdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgSU8gYWNjZXNzZXMgdGhhdCBzaG91bGQgYmUKKyAgcGVyZm9ybWVkIG9uIHRoZSBkZXZpY2UuICBUaGVyZSBhcmUgc29tZSBzeXN0ZW1zIHRoYXQgcmVxdWlyZSAzMi1iaXQKKyAgYWNjZXNzZXMgdG8gdGhlIFVBUlQgKGUuZy4gVEkgZGF2aW5jaSkuCistIHVzZWQtYnktcnRhcyA6IHNldCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwb3J0IGlzIGluIHVzZSBieSB0aGUgT3BlbkZpcm13YXJlCisgIFJUQVMgYW5kIHNob3VsZCBub3QgYmUgcmVnaXN0ZXJlZC4KKworRXhhbXBsZToKKworCXVhcnRAODAyMzAwMDAgeworCQljb21wYXRpYmxlID0gIm5zODI1MCI7CisJCXJlZyA9IDwweDgwMjMwMDAwIDB4MTAwPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDM2ODY0MDA+OworCQlpbnRlcnJ1cHRzID0gPDEwPjsKKwkJcmVnLXNoaWZ0ID0gPDI+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZpY2UudHh0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZGV2aWNlLnR4dAppbmRleCBiMmZmNDI2Li5iZGVmZTcyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZpY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldmljZS50eHQKQEAgLTEwNCw0ICsxMDQsNCBAQAogCiBBbmQgYXNzdW1pbmcgJ2RldicgaXMgdGhlIHN0cnVjdCBkZXZpY2UgcGFzc2VkIGludG8gdGhlIHByb2JlIGhvb2ssIHRoZSBkcml2ZXIKIHByb2JlIGZ1bmN0aW9uIHdvdWxkIGRvIHNvbWV0aGluZyBsaWtlOgotCWNyZWF0ZV9kZXZpY2UoJm15ZHJpdmVyX2NsYXNzLCBkZXYsIGNocmRldiwgJnByaXZhdGVfZGF0YSwgIm15X25hbWUiKTsKKwlkZXZpY2VfY3JlYXRlKCZteWRyaXZlcl9jbGFzcywgZGV2LCBjaHJkZXYsICZwcml2YXRlX2RhdGEsICJteV9uYW1lIik7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9vdmVydmlldy50eHQgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9vdmVydmlldy50eHQKaW5kZXggMDcyMzZlZC4uNmE4ZjlhOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvb3ZlcnZpZXcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL292ZXJ2aWV3LnR4dApAQCAtMzAsNyArMzAsNyBAQAogTWljcm9zb2Z0IChuYW1lbHkgQUNQSSkgZW5zdXJlcyB0aGF0IGFsbW9zdCBldmVyeSBkZXZpY2Ugb24gYWxtb3N0IGFueSBidXMKIG9uIGFuIHg4Ni1jb21wYXRpYmxlIHN5c3RlbSBjYW4gd29yayB3aXRoaW4gdGhpcyBwYXJhZGlnbS4gIE9mIGNvdXJzZSwKIG5vdCBldmVyeSBidXMgaXMgYWJsZSB0byBzdXBwb3J0IGFsbCBzdWNoIG9wZXJhdGlvbnMsIGFsdGhvdWdoIG1vc3QKLWJ1c2VzIHN1cHBvcnQgYSBtb3N0IG9mIHRob3NlIG9wZXJhdGlvbnMuCitidXNlcyBzdXBwb3J0IG1vc3Qgb2YgdGhvc2Ugb3BlcmF0aW9ucy4KIAogCiBEb3duc3RyZWFtIEFjY2VzcwpAQCAtNDYsMjUgKzQ2LDI5IEBACiBzdHJ1Y3QgcGNpX2RldiB7CiAJLi4uCiAKLQlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsgICAgIC8qIEdlbmVyaWMgZGV2aWNlIGludGVyZmFjZSAqLworCS4uLgogfTsKIAotTm90ZSBmaXJzdCB0aGF0IGl0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLiBUaGlzIG1lYW5zIG9ubHkgb25lIGFsbG9jYXRpb24gb24KLWRldmljZSBkaXNjb3ZlcnkuIE5vdGUgYWxzbyB0aGF0IGl0IGlzIGF0IHRoZSBfZW5kXyBvZiBzdHJ1Y3QgcGNpX2Rldi4gVGhpcyBpcwotdG8gbWFrZSBwZW9wbGUgdGhpbmsgYWJvdXQgd2hhdCB0aGV5J3JlIGRvaW5nIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gdGhlIGJ1cwotZHJpdmVyIGFuZCB0aGUgZ2xvYmFsIGRyaXZlcjsgYW5kIHRvIHByZXZlbnQgYWdhaW5zdCBtaW5kbGVzcyBjYXN0cyBiZXR3ZWVuCi10aGUgdHdvLgorTm90ZSBmaXJzdCB0aGF0IHRoZSBzdHJ1Y3QgZGV2aWNlIGRldiB3aXRoaW4gdGhlIHN0cnVjdCBwY2lfZGV2IGlzCitzdGF0aWNhbGx5IGFsbG9jYXRlZC4gVGhpcyBtZWFucyBvbmx5IG9uZSBhbGxvY2F0aW9uIG9uIGRldmljZSBkaXNjb3ZlcnkuCisKK05vdGUgYWxzbyB0aGF0IHRoYXQgc3RydWN0IGRldmljZSBkZXYgaXMgbm90IG5lY2Vzc2FyaWx5IGRlZmluZWQgYXQgdGhlCitmcm9udCBvZiB0aGUgcGNpX2RldiBzdHJ1Y3R1cmUuICBUaGlzIGlzIHRvIG1ha2UgcGVvcGxlIHRoaW5rIGFib3V0IHdoYXQKK3RoZXkncmUgZG9pbmcgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiB0aGUgYnVzIGRyaXZlciBhbmQgdGhlIGdsb2JhbCBkcml2ZXIsCithbmQgdG8gZGlzY291cmFnZSBtZWFuaW5nbGVzcyBhbmQgaW5jb3JyZWN0IGNhc3RzIGJldHdlZW4gdGhlIHR3by4KIAogVGhlIFBDSSBidXMgbGF5ZXIgZnJlZWx5IGFjY2Vzc2VzIHRoZSBmaWVsZHMgb2Ygc3RydWN0IGRldmljZS4gSXQga25vd3MgYWJvdXQKIHRoZSBzdHJ1Y3R1cmUgb2Ygc3RydWN0IHBjaV9kZXYsIGFuZCBpdCBzaG91bGQga25vdyB0aGUgc3RydWN0dXJlIG9mIHN0cnVjdAogZGV2aWNlLiBJbmRpdmlkdWFsIFBDSSBkZXZpY2UgZHJpdmVycyB0aGF0IGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gdGhlIGN1cnJlbnQKIGRyaXZlciBtb2RlbCBnZW5lcmFsbHkgZG8gbm90IGFuZCBzaG91bGQgbm90IHRvdWNoIHRoZSBmaWVsZHMgb2Ygc3RydWN0IGRldmljZSwKLXVubGVzcyB0aGVyZSBpcyBhIHN0cm9uZyBjb21wZWxsaW5nIHJlYXNvbiB0byBkbyBzby4KK3VubGVzcyB0aGVyZSBpcyBhIGNvbXBlbGxpbmcgcmVhc29uIHRvIGRvIHNvLgogCi1UaGlzIGFic3RyYWN0aW9uIGlzIHByZXZlbnRpb24gb2YgdW5uZWNlc3NhcnkgcGFpbiBkdXJpbmcgdHJhbnNpdGlvbmFsIHBoYXNlcy4KLUlmIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBjaGFuZ2VzIG9yIGlzIHJlbW92ZWQsIHRoZW4gZXZlcnkgZG93bnN0cmVhbSBkcml2ZXIKLXdpbGwgYnJlYWsuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBvbmx5IHRoZSBidXMgbGF5ZXIgKGFuZCBub3QgdGhlIGRldmljZQotbGF5ZXIpIGFjY2Vzc2VzIHN0cnVjdCBkZXZpY2UsIGl0IGlzIG9ubHkgdGhhdCBsYXllciB0aGF0IG5lZWRzIHRvIGNoYW5nZS4KK1RoZSBhYm92ZSBhYnN0cmFjdGlvbiBwcmV2ZW50cyB1bm5lY2Vzc2FyeSBwYWluIGR1cmluZyB0cmFuc2l0aW9uYWwgcGhhc2VzLgorSWYgaXQgd2VyZSBub3QgZG9uZSB0aGlzIHdheSwgdGhlbiB3aGVuIGEgZmllbGQgd2FzIHJlbmFtZWQgb3IgcmVtb3ZlZCwgZXZlcnkKK2Rvd25zdHJlYW0gZHJpdmVyIHdvdWxkIGJyZWFrLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIG9ubHkgdGhlIGJ1cyBsYXllcgorKGFuZCBub3QgdGhlIGRldmljZSBsYXllcikgYWNjZXNzZXMgdGhlIHN0cnVjdCBkZXZpY2UsIGl0IGlzIG9ubHkgdGhlIGJ1cworbGF5ZXIgdGhhdCBuZWVkcyB0byBjaGFuZ2UuCiAKIAogVXNlciBJbnRlcmZhY2UKQEAgLTczLDE1ICs3NywyNyBAQAogQnkgdmlydHVlIG9mIGhhdmluZyBhIGNvbXBsZXRlIGhpZXJhcmNoaWNhbCB2aWV3IG9mIGFsbCB0aGUgZGV2aWNlcyBpbiB0aGUKIHN5c3RlbSwgZXhwb3J0aW5nIGEgY29tcGxldGUgaGllcmFyY2hpY2FsIHZpZXcgdG8gdXNlcnNwYWNlIGJlY29tZXMgcmVsYXRpdmVseQogZWFzeS4gVGhpcyBoYXMgYmVlbiBhY2NvbXBsaXNoZWQgYnkgaW1wbGVtZW50aW5nIGEgc3BlY2lhbCBwdXJwb3NlIHZpcnR1YWwKLWZpbGUgc3lzdGVtIG5hbWVkIHN5c2ZzLiBJdCBpcyBoZW5jZSBwb3NzaWJsZSBmb3IgdGhlIHVzZXIgdG8gbW91bnQgdGhlCi13aG9sZSBzeXNmcyBmaWxlc3lzdGVtIGFueXdoZXJlIGluIHVzZXJzcGFjZS4KK2ZpbGUgc3lzdGVtIG5hbWVkIHN5c2ZzLgogCi1UaGlzIGNhbiBiZSBkb25lIHBlcm1hbmVudGx5IGJ5IHByb3ZpZGluZyB0aGUgZm9sbG93aW5nIGVudHJ5IGludG8gdGhlCi0vZXRjL2ZzdGFiICh1bmRlciB0aGUgcHJvdmlzaW9uIHRoYXQgdGhlIG1vdW50IHBvaW50IGRvZXMgZXhpc3QsIG9mIGNvdXJzZSk6CitBbG1vc3QgYWxsIG1haW5zdHJlYW0gTGludXggZGlzdHJvcyBtb3VudCB0aGlzIGZpbGVzeXN0ZW0gYXV0b21hdGljYWxseTsgeW91CitjYW4gc2VlIHNvbWUgdmFyaWF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgaW4gdGhlIG91dHB1dCBvZiB0aGUgIm1vdW50IiBjb21tYW5kOgogCi1ub25lICAgICAJL3N5cwlzeXNmcyAgICBkZWZhdWx0cwkJMAkwCiskIG1vdW50CisuLi4KK25vbmUgb24gL3N5cyB0eXBlIHN5c2ZzIChydyxub2V4ZWMsbm9zdWlkLG5vZGV2KQorLi4uCiskCiAKLU9yIGJ5IGhhbmQgb24gdGhlIGNvbW1hbmQgbGluZToKK1RoZSBhdXRvLW1vdW50aW5nIG9mIHN5c2ZzIGlzIHR5cGljYWxseSBhY2NvbXBsaXNoZWQgYnkgYW4gZW50cnkgc2ltaWxhciB0bwordGhlIGZvbGxvd2luZyBpbiB0aGUgL2V0Yy9mc3RhYiBmaWxlOgorCitub25lICAgICAJL3N5cwlzeXNmcyAgICBkZWZhdWx0cwkgIAkwIDAKKworb3Igc29tZXRoaW5nIHNpbWlsYXIgaW4gdGhlIC9saWIvaW5pdC9mc3RhYiBmaWxlIG9uIERlYmlhbi1iYXNlZCBzeXN0ZW1zOgorCitub25lICAgICAgICAgICAgL3N5cyAgICBzeXNmcyAgICBub2Rldixub2V4ZWMsbm9zdWlkICAgIDAgMAorCitJZiBzeXNmcyBpcyBub3QgYXV0b21hdGljYWxseSBtb3VudGVkLCB5b3UgY2FuIGFsd2F5cyBkbyBpdCBtYW51YWxseSB3aXRoOgogCiAjIG1vdW50IC10IHN5c2ZzIHN5c2ZzIC9zeXMKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IDFhOTQ0NmIuLjliZWNjNWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAJQSBtdWNoIG1vcmUgcG93ZXJmdWwgaW50ZXJmYWNlLCAvcHJvYy88cGlkPi9vb21fc2NvcmVfYWRqLCB3YXMKIAlpbnRyb2R1Y2VkIHdpdGggdGhlIG9vbSBraWxsZXIgcmV3cml0ZSB0aGF0IGFsbG93cyB1c2VycyB0byBpbmNyZWFzZSBvcgotCWRlY3JlYXNlIHRoZSBiYWRuZXNzKCkgc2NvcmUgbGluZWFybHkuICBUaGlzIGludGVyZmFjZSB3aWxsIHJlcGxhY2UKKwlkZWNyZWFzZSB0aGUgYmFkbmVzcyBzY29yZSBsaW5lYXJseS4gIFRoaXMgaW50ZXJmYWNlIHdpbGwgcmVwbGFjZQogCS9wcm9jLzxwaWQ+L29vbV9hZGouCiAKIAlBIHdhcm5pbmcgd2lsbCBiZSBlbWl0dGVkIHRvIHRoZSBrZXJuZWwgbG9nIGlmIGFuIGFwcGxpY2F0aW9uIHVzZXMgdGhpcwpAQCAtMTk5LDcgKzE5OSw3IEBACiBDaGVjazoJZHJpdmVycy9zdGFnaW5nL2NzNTUzNV9ncGlvL2NzNTUzNV9ncGlvLmMKIFdoeToJQSBuZXdlciBkcml2ZXIgcmVwbGFjZXMgdGhpczsgaXQgaXMgZHJpdmVycy9ncGlvL2NzNTUzNS1ncGlvLmMsIGFuZAogCWludGVncmF0ZXMgd2l0aCB0aGUgTGludXggR1BJTyBzdWJzeXN0ZW0uICBUaGUgb2xkIGRyaXZlciBoYXMgYmVlbgotCW1vdmVkIHRvIHN0YWdpbmcsIGFuZCB3aWxsIGJlIHJlbW92ZWQgYWx0b2dldGhlciBhcm91bmQgMi42LjQwLgorCW1vdmVkIHRvIHN0YWdpbmcsIGFuZCB3aWxsIGJlIHJlbW92ZWQgYWx0b2dldGhlciBhcm91bmQgMy4wLgogCVBsZWFzZSB0ZXN0IHRoZSBuZXcgZHJpdmVyLCBhbmQgZW5zdXJlIHRoYXQgdGhlIGZ1bmN0aW9uYWxpdHkgeW91CiAJbmVlZCBhbmQgYW55IGJ1Z2ZpeGVzIGZyb20gdGhlIG9sZCBkcml2ZXIgYXJlIGF2YWlsYWJsZSBpbiB0aGUgbmV3CiAJb25lLgpAQCAtMjk0LDcgKzI5NCw3IEBACiBXaHk6CVRoZSBzdXBwb3J0IGNvZGUgZm9yIHRoZSBvbGQgZmlybXdhcmUgaHVydHMgY29kZSByZWFkYWJpbGl0eS9tYWludGFpbmFiaWxpdHkKIAlhbmQgc2xpZ2h0bHkgaHVydHMgcnVudGltZSBwZXJmb3JtYW5jZS4gQnVnZml4ZXMgZm9yIHRoZSBvbGQgZmlybXdhcmUKIAlhcmUgbm90IHByb3ZpZGVkIGJ5IEJyb2FkY29tIGFueW1vcmUuCi1XaG86CU1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CitXaG86CU1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00MzAsNyArNDMwLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogV2hhdDoJaXdsd2lmaSA1MFhYIG1vZHVsZSBwYXJhbWV0ZXJzCi1XaGVuOgkyLjYuNDAKK1doZW46CTMuMAogV2h5OglUaGUgIi4uNTAiIG1vZHVsZXMgcGFyYW1ldGVycyB3ZXJlIHVzZWQgdG8gY29uZmlndXJlIDUwMDAgc2VyaWVzIGFuZAogCXVwIGRldmljZXM7IGRpZmZlcmVudCBzZXQgb2YgbW9kdWxlIHBhcmFtZXRlcnMgYWxzbyBhdmFpbGFibGUgZm9yIDQ5NjUKIAl3aXRoIHNhbWUgZnVuY3Rpb25hbGl0aWVzLiBDb25zb2xpZGF0ZSBib3RoIHNldCBpbnRvIHNpbmdsZSBwbGFjZQpAQCAtNDQxLDcgKzQ0MSw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFdoYXQ6CWl3bDQ5NjUgYWxpYXMgc3VwcG9ydAotV2hlbjoJMi42LjQwCitXaGVuOgkzLjAKIFdoeToJSW50ZXJuYWwgYWxpYXMgc3VwcG9ydCBoYXMgYmVlbiBwcmVzZW50IGluIG1vZHVsZS1pbml0LXRvb2xzIGZvciBzb21lCiAJdGltZSwgdGhlIE1PRFVMRV9BTElBUygiaXdsNDk2NSIpIGJvaWxlcnBsYXRlIGFsaWFzZXMgY2FuIGJlIHJlbW92ZWQKIAl3aXRoIG5vIGltcGFjdC4KQEAgLTQ4MSwyNSArNDgxLDggQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OiAgIG5hbWVzcGFjZSBjZ3JvdXAgKG5zX2Nncm91cCkKLVdoZW46ICAgMi42LjM4Ci1XaHk6ICAgIFRoZSBuc19jZ3JvdXAgbGVhZHMgdG8gc29tZSBwcm9ibGVtczoKLQkqIGNncm91cCBjcmVhdGlvbiBpcyBvdXQtb2YtY29udHJvbAotCSogY2dyb3VwIG5hbWUgY2FuIGNvbmZsaWN0IHdoZW4gcGlkcyBhcmUgbG9vcGluZwotCSogaXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgYSBzaW5nbGUgcHJvY2VzcyBoYW5kbGluZwotCWEgbG90IG9mIG5hbWVzcGFjZXMgd2l0aG91dCBmYWxsaW5nIGluIGEgZXhwb25lbnRpYWwgY3JlYXRpb24gdGltZQotCSogd2UgbWF5IHdhbnQgdG8gY3JlYXRlIGEgbmFtZXNwYWNlIHdpdGhvdXQgY3JlYXRpbmcgYSBjZ3JvdXAKLQotCVRoZSBuc19jZ3JvdXAgaXMgcmVwbGFjZWQgYnkgYSBjb21wYXRpYmlsaXR5IGZsYWcgJ2Nsb25lX2NoaWxkcmVuJywKLQl3aGVyZSBhIG5ld2x5IGNyZWF0ZWQgY2dyb3VwIHdpbGwgY29weSB0aGUgcGFyZW50IGNncm91cCB2YWx1ZXMuCi0JVGhlIHVzZXJzcGFjZSBoYXMgdG8gbWFudWFsbHkgY3JlYXRlIGEgY2dyb3VwIGFuZCBhZGQgYSB0YXNrIHRvCi0JdGhlICd0YXNrcycgZmlsZS4KLVdobzogICAgRGFuaWVsIExlemNhbm8gPGRhbmllbC5sZXpjYW5vQGZyZWUuZnI+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJaXdsd2lmaSBkaXNhYmxlX2h3X3NjYW4gbW9kdWxlIHBhcmFtZXRlcnMKLVdoZW46CTIuNi40MAorV2hlbjoJMy4wCiBXaHk6CUhhcmV3YXJlIHNjYW4gaXMgdGhlIHByZWZlciBtZXRob2QgZm9yIGl3bHdpZmkgZGV2aWNlcyBmb3IKIAlzY2FubmluZyBvcGVyYXRpb24uIFJlbW92ZSBzb2Z0d2FyZSBzY2FuIHN1cHBvcnQgZm9yIGFsbCB0aGUKIAlpd2x3aWZpIGRldmljZXMuCkBAIC01MDgsMjYgKzQ5MSw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDogICBhY2Nlc3MgdG8gbmZzZCBhdXRoIGNhY2hlIHRocm91Z2ggc3lzX25mc3NlcnZjdGwgb3IgJy4nIGZpbGVzCi0gICAgICAgIGluIHRoZSAnbmZzZCcgZmlsZXN5c3RlbS4KLVdoZW46ICAgMi42LjQwCi1XaHk6ICAgIFRoaXMgaXMgYSBsZWdhY3kgaW50ZXJmYWNlIHdoaWNoIGhhdmUgYmVlbiByZXBsYWNlZCBieSBhIG1vcmUKLSAgICAgICAgZHluYW1pYyBjYWNoZS4gIENvbnRpbnVpbmcgdG8gbWFpbnRhaW4gdGhpcyBpbnRlcmZhY2UgaXMgYW4KLSAgICAgICAgdW5uZWNlc3NhcnkgYnVyZGVuLgotV2hvOiAgICBOZWlsQnJvd24gPG5laWxiQHN1c2UuZGU+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotV2hhdDoJY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29ya1txdWV1ZV0oKQotV2hlbjoJMi42LjM5Ci0KLVdoeToJVGhlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gc3VwZXJjZWRlZCBieSBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoKQotCXF1aXRlIHNvbWUgdGltZSBhZ28uICBUaGUgY29udmVyc2lvbiBpcyB0cml2aWFsIGFuZCB0aGVyZSBpcyBubwotCWluLWtlcm5lbCB1c2VyIGxlZnQuCi1XaG86CVRlanVuIEhlbyA8dGpAa2VybmVsLm9yZz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglMZWdhY3ksIG5vbi1zdGFuZGFyZCBjaGFzc2lzIGludHJ1c2lvbiBkZXRlY3Rpb24gaW50ZXJmYWNlLgogV2hlbjoJSnVuZSAyMDExCiBXaHk6CVRoZSBhZG05MjQwLCB3ODM3OTJkIGFuZCB3ODM3OTMgaGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXJzIGhhdmUKQEAgLTU0NSwyMiArNTA4LDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0Oglub3N3YXBhY2NvdW50IGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVyCi1XaGVuOgkyLjYuNDAKLVdoeToJVGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIG9mIG1lbXN3IGZlYXR1cmUgZW5hYmxlZCBieQotCUNPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVAgY291bGQgYmUgZGlzYWJsZWQgYnkgdGhlIG5vc3dhcGFjY291bnQKLQlrZXJuZWwgcGFyYW1ldGVyIChpbnRyb2R1Y2VkIGluIDIuNi4yOS1yYzEpLiBMYXRlciBvbiwgdGhpcyBkZWNpc2lvbgotCXR1cm5lZCBvdXQgdG8gYmUgbm90IGlkZWFsIGJlY2F1c2Ugd2UgY2Fubm90IGhhdmUgdGhlIGZlYXR1cmUgY29tcGlsZWQKLQlpbiBhbmQgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgbGV0IG9ubHkgaW50ZXJlc3RlZCB0byBlbmFibGUgaXQKLQkoZS5nLiBnZW5lcmFsIGRpc3RyaWJ1dGlvbiBrZXJuZWxzIG1pZ2h0IG5lZWQgaXQpLiBUaGVyZWZvcmUgd2UgaGF2ZQotCWFkZGVkIHN3YXBhY2NvdW50Wz0wfDFdIHBhcmFtZXRlciAoaW50cm9kdWNlZCBpbiAyLjYuMzcpIHdoaWNoIHByb3ZpZGVzCi0JdGhlIGJvdGggcG9zc2liaWxpdGllcy4gSWYgd2UgcmVtb3ZlIG5vc3dhcGFjY291bnQgd2Ugd2lsbCBoYXZlCi0JbGVzcyBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyB3aXRoIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYW5kIHdlCi0JY2FuIGFsc28gY2xlYW51cCB0aGUgcGFyYW1ldGVyIGhhbmRsaW5nIGEgYml0ICgpLgotV2hvOglNaWNoYWwgSG9ja28gPG1ob2Nrb0BzdXNlLmN6PgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIFdoYXQ6CWlwdF9hZGRydHlwZSBtYXRjaCBpbmNsdWRlIGZpbGUKIFdoZW46CTIwMTIKIFdoeToJc3VwZXJzZWRlZCBieSB4dF9hZGRydHlwZQpAQCAtNTc5LDcgKzUyNiw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFdoYXQ6CVN1cHBvcnQgZm9yIFVWQ0lPQ19DVFJMX0FERCBpbiB0aGUgdXZjdmlkZW8gZHJpdmVyCi1XaGVuOgkyLjYuNDIKK1doZW46CTMuMgogV2h5OglUaGUgaW5mb3JtYXRpb24gcGFzc2VkIHRvIHRoZSBkcml2ZXIgYnkgdGhpcyBpb2N0bCBpcyBub3cgcXVlcmllZAogCWR5bmFtaWNhbGx5IGZyb20gdGhlIGRldmljZS4KIFdobzoJTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tPgpAQCAtNTg3LDcgKzUzNCw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFdoYXQ6CVN1cHBvcnQgZm9yIFVWQ0lPQ19DVFJMX01BUF9PTEQgaW4gdGhlIHV2Y3ZpZGVvIGRyaXZlcgotV2hlbjoJMi42LjQyCitXaGVuOgkzLjIKIFdoeToJVXNlZCBvbmx5IGJ5IGFwcGxpY2F0aW9ucyBjb21waWxlZCBhZ2FpbnN0IG9sZGVyIGRyaXZlciB2ZXJzaW9ucy4KIAlTdXBlcnNlZGVkIGJ5IFVWQ0lPQ19DVFJMX01BUCB3aGljaCBzdXBwb3J0cyBWNEwyIG1lbnUgY29udHJvbHMuCiBXaG86CUxhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbT4KQEAgLTU5NSw4ICs1NDIsMzcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogV2hhdDoJU3VwcG9ydCBmb3IgVVZDSU9DX0NUUkxfR0VUIGFuZCBVVkNJT0NfQ1RSTF9TRVQgaW4gdGhlIHV2Y3ZpZGVvIGRyaXZlcgotV2hlbjoJMi42LjQyCitXaGVuOgkzLjIKIFdoeToJU3VwZXJzZWRlZCBieSB0aGUgVVZDSU9DX0NUUkxfUVVFUlkgaW9jdGwuCiBXaG86CUxhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbT4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0OglGb3IgVklESU9DX1NfRlJFUVVFTkNZIHRoZSB0eXBlIGZpZWxkIG11c3QgbWF0Y2ggdGhlIGRldmljZSBub2RlJ3MgdHlwZS4KKwlJZiBub3QsIHJldHVybiAtRUlOVkFMLgorV2hlbjoJMy4yCitXaHk6CUl0IG1ha2VzIG5vIHNlbnNlIHRvIHN3aXRjaCB0aGUgdHVuZXIgdG8gcmFkaW8gbW9kZSBieSBjYWxsaW5nCisJVklESU9DX1NfRlJFUVVFTkNZIG9uIGEgdmlkZW8gbm9kZSwgb3IgdG8gc3dpdGNoIHRoZSB0dW5lciB0byB0diBtb2RlIGJ5CisJY2FsbGluZyBWSURJT0NfU19GUkVRVUVOQ1kgb24gYSByYWRpbyBub2RlLiBUaGlzIGlzIHRoZSBmaXJzdCBzdGVwIG9mIGEKKwltb3ZlIHRvIG1vcmUgY29uc2lzdGVudCBoYW5kbGluZyBvZiB0diBhbmQgcmFkaW8gdHVuZXJzLgorV2hvOglIYW5zIFZlcmt1aWwgPGhhbnMudmVya3VpbEBjaXNjby5jb20+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJT3BlbmluZyBhIHJhZGlvIGRldmljZSBub2RlIHdpbGwgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgc3dpdGNoIHRoZQorCXR1bmVyIG1vZGUgZnJvbSB0diB0byByYWRpby4KK1doZW46CTMuMworV2h5OglKdXN0IG9wZW5pbmcgYSBWNEwgZGV2aWNlIHNob3VsZCBub3QgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgaGFyZHdhcmUKKwlsaWtlIHRoYXQuIEl0J3MgdmVyeSB1bmV4cGVjdGVkIGFuZCBhZ2FpbnN0IHRoZSBWNEwgc3BlYy4gSW5zdGVhZCwgeW91CisJc3dpdGNoIHRvIHJhZGlvIG1vZGUgYnkgY2FsbGluZyBWSURJT0NfU19GUkVRVUVOQ1kuIFRoaXMgaXMgdGhlIHNlY29uZAorCWFuZCBsYXN0IHN0ZXAgb2YgdGhlIG1vdmUgdG8gY29uc2lzdGVudCBoYW5kbGluZyBvZiB0diBhbmQgcmFkaW8gdHVuZXJzLgorV2hvOglIYW5zIFZlcmt1aWwgPGhhbnMudmVya3VpbEBjaXNjby5jb20+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJZ19maWxlX3N0b3JhZ2UgZHJpdmVyCitXaGVuOgkzLjgKK1doeToJVGhpcyBkcml2ZXIgaGFzIGJlZW4gc3VwZXJzZWRlZCBieSBnX21hc3Nfc3RvcmFnZS4KK1dobzoJQWxhbiBTdGVybiA8c3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVkdT4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCmluZGV4IDU3ZDgyN2QuLjY1MzM4MDcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZworKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKQEAgLTUyLDcgKzUyLDcgQEAKIAl2b2lkICgqcHV0X2xpbmspIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKiwgdm9pZCAqKTsKIAl2b2lkICgqdHJ1bmNhdGUpIChzdHJ1Y3QgaW5vZGUgKik7CiAJaW50ICgqcGVybWlzc2lvbikgKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHVuc2lnbmVkIGludCk7Ci0JaW50ICgqY2hlY2tfYWNsKShzdHJ1Y3QgaW5vZGUgKiwgaW50LCB1bnNpZ25lZCBpbnQpOworCWludCAoKmdldF9hY2wpKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogCWludCAoKnNldGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKIAlpbnQgKCpnZXRhdHRyKSAoc3RydWN0IHZmc21vdW50ICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ICopOwogCWludCAoKnNldHhhdHRyKSAoc3RydWN0IGRlbnRyeSAqLCBjb25zdCBjaGFyICosY29uc3Qgdm9pZCAqLHNpemVfdCxpbnQpOwpAQCAtODAsNyArODAsNyBAQAogdHJ1bmNhdGU6CXllcwkJKHNlZSBiZWxvdykKIHNldGF0dHI6CXllcwogcGVybWlzc2lvbjoJbm8gKG1heSBub3QgYmxvY2sgaWYgY2FsbGVkIGluIHJjdS13YWxrIG1vZGUpCi1jaGVja19hY2w6CW5vCitnZXRfYWNsOglubwogZ2V0YXR0cjoJbm8KIHNldHhhdHRyOgl5ZXMKIGdldHhhdHRyOglubwpAQCAtMzM4LDIxICszMzgsMjEgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbG9ja19tYW5hZ2VyX29wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBwcm90b3R5cGVzOgotCWludCAoKmZsX2NvbXBhcmVfb3duZXIpKHN0cnVjdCBmaWxlX2xvY2sgKiwgc3RydWN0IGZpbGVfbG9jayAqKTsKLQl2b2lkICgqZmxfbm90aWZ5KShzdHJ1Y3QgZmlsZV9sb2NrICopOyAgLyogdW5ibG9jayBjYWxsYmFjayAqLwotCWludCAoKmZsX2dyYW50KShzdHJ1Y3QgZmlsZV9sb2NrICosIHN0cnVjdCBmaWxlX2xvY2sgKiwgaW50KTsKLQl2b2lkICgqZmxfcmVsZWFzZV9wcml2YXRlKShzdHJ1Y3QgZmlsZV9sb2NrICopOwotCXZvaWQgKCpmbF9icmVhaykoc3RydWN0IGZpbGVfbG9jayAqKTsgLyogYnJlYWtfbGVhc2UgY2FsbGJhY2sgKi8KLQlpbnQgKCpmbF9jaGFuZ2UpKHN0cnVjdCBmaWxlX2xvY2sgKiosIGludCk7CisJaW50ICgqbG1fY29tcGFyZV9vd25lcikoc3RydWN0IGZpbGVfbG9jayAqLCBzdHJ1Y3QgZmlsZV9sb2NrICopOworCXZvaWQgKCpsbV9ub3RpZnkpKHN0cnVjdCBmaWxlX2xvY2sgKik7ICAvKiB1bmJsb2NrIGNhbGxiYWNrICovCisJaW50ICgqbG1fZ3JhbnQpKHN0cnVjdCBmaWxlX2xvY2sgKiwgc3RydWN0IGZpbGVfbG9jayAqLCBpbnQpOworCXZvaWQgKCpsbV9yZWxlYXNlX3ByaXZhdGUpKHN0cnVjdCBmaWxlX2xvY2sgKik7CisJdm9pZCAoKmxtX2JyZWFrKShzdHJ1Y3QgZmlsZV9sb2NrICopOyAvKiBicmVha19sZWFzZSBjYWxsYmFjayAqLworCWludCAoKmxtX2NoYW5nZSkoc3RydWN0IGZpbGVfbG9jayAqKiwgaW50KTsKIAogbG9ja2luZyBydWxlczoKIAkJCWZpbGVfbG9ja19sb2NrCW1heSBibG9jawotZmxfY29tcGFyZV9vd25lcjoJeWVzCQlubwotZmxfbm90aWZ5OgkJeWVzCQlubwotZmxfZ3JhbnQ6CQlubwkJbm8KLWZsX3JlbGVhc2VfcHJpdmF0ZToJbWF5YmUJCW5vCi1mbF9icmVhazoJCXllcwkJbm8KLWZsX2NoYW5nZQkJeWVzCQlubworbG1fY29tcGFyZV9vd25lcjoJeWVzCQlubworbG1fbm90aWZ5OgkJeWVzCQlubworbG1fZ3JhbnQ6CQlubwkJbm8KK2xtX3JlbGVhc2VfcHJpdmF0ZToJbWF5YmUJCW5vCitsbV9icmVhazoJCXllcwkJbm8KK2xtX2NoYW5nZQkJeWVzCQlubwogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYnVmZmVyX2hlYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHByb3RvdHlwZXM6CkBAIC00MTIsNyArNDEyLDcgQEAKIAlpbnQgKCpvcGVuKSAoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogCWludCAoKmZsdXNoKSAoc3RydWN0IGZpbGUgKik7CiAJaW50ICgqcmVsZWFzZSkgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKLQlpbnQgKCpmc3luYykgKHN0cnVjdCBmaWxlICosIGludCBkYXRhc3luYyk7CisJaW50ICgqZnN5bmMpIChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYyk7CiAJaW50ICgqYWlvX2ZzeW5jKSAoc3RydWN0IGtpb2NiICosIGludCBkYXRhc3luYyk7CiAJaW50ICgqZmFzeW5jKSAoaW50LCBzdHJ1Y3QgZmlsZSAqLCBpbnQpOwogCWludCAoKmxvY2spIChzdHJ1Y3QgZmlsZSAqLCBpbnQsIHN0cnVjdCBmaWxlX2xvY2sgKik7CkBAIC00MzgsOSArNDM4LDcgQEAKIAogbG9ja2luZyBydWxlczoKIAlBbGwgbWF5IGJsb2NrIGV4Y2VwdCBmb3IgLT5zZXRsZWFzZS4KLQlObyBWRlMgbG9ja3MgaGVsZCBvbiBlbnRyeSBleGNlcHQgZm9yIC0+ZnN5bmMgYW5kIC0+c2V0bGVhc2UuCi0KLS0+ZnN5bmMoKSBoYXMgaV9tdXRleCBvbiBpbm9kZS4KKwlObyBWRlMgbG9ja3MgaGVsZCBvbiBlbnRyeSBleGNlcHQgZm9yIC0+c2V0bGVhc2UuCiAKIC0+c2V0bGVhc2UgaGFzIHRoZSBmaWxlX2xpc3RfbG9jayBoZWxkIGFuZCBtdXN0IG5vdCBzbGVlcC4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9jYWNoaW5nL25ldGZzLWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NhY2hpbmcvbmV0ZnMtYXBpLnR4dAppbmRleCBhMTY3YWI4Li43Y2M2YmYyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NhY2hpbmcvbmV0ZnMtYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NhY2hpbmcvbmV0ZnMtYXBpLnR4dApAQCAtNjczLDYgKzY3MywyMiBAQAogaW4gd2hpY2ggY2FzZSB0aGUgcGFnZSB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIGNhY2hlIHRoaXMgdGltZS4KIAogCitCVUxLIElOT0RFIFBBR0UgVU5DQUNIRQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBjb252ZW5pZW5jZSByb3V0aW5lIGlzIHByb3ZpZGVkIHRvIHBlcmZvcm0gYW4gdW5jYWNoZSBvbiBhbGwgdGhlIHBhZ2VzCithdHRhY2hlZCB0byBhbiBpbm9kZS4gIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBwYWdlcyBvbiB0aGUgaW5vZGUgY29ycmVzcG9uZCBvbiBhCisxOjEgYmFzaXMgd2l0aCB0aGUgcGFnZXMgaW4gdGhlIGNhY2hlLgorCisJdm9pZCBmc2NhY2hlX3VuY2FjaGVfYWxsX2lub2RlX3BhZ2VzKHN0cnVjdCBmc2NhY2hlX2Nvb2tpZSAqY29va2llLAorCQkJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCitUaGlzIHRha2VzIHRoZSBuZXRmcyBjb29raWUgdGhhdCB0aGUgcGFnZXMgd2VyZSBjYWNoZWQgd2l0aCBhbmQgdGhlIGlub2RlIHRoYXQKK3RoZSBwYWdlcyBhcmUgYXR0YWNoZWQgdG8uICBUaGlzIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgcGFnZXMgdG8gZmluaXNoIGJlaW5nCit3cml0dGVuIHRvIHRoZSBjYWNoZSBhbmQgZm9yIHRoZSBjYWNoZSB0byBmaW5pc2ggd2l0aCB0aGUgcGFnZSBnZW5lcmFsbHkuICBObworZXJyb3IgaXMgcmV0dXJuZWQuCisKKwogPT09PT09PT09PT09PT09PT09PT09PT09PT0KIElOREVYIEFORCBEQVRBIEZJTEUgVVBEQVRFCiA9PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kZWJ1Z2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGVidWdmcy50eHQKaW5kZXggZWQ1MmFmNi4uNzQyY2MwNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kZWJ1Z2ZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RlYnVnZnMudHh0CkBAIC03Myw4ICs3Myw4IEBACiAJCQkJICAgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1MTYgKnZhbHVlKTsKICAgICBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV94MzIoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCiAJCQkJICAgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1MzIgKnZhbHVlKTsKLQotTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGRlYnVnZnNfY3JlYXRlX3g2NCgpLgorICAgIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX3g2NChjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHU2NCAqdmFsdWUpOwogCiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWZ1bCBhcyBsb25nIGFzIHRoZSBkZXZlbG9wZXIga25vd3MgdGhlIHNpemUgb2YgdGhlCiB2YWx1ZSB0byBiZSBleHBvcnRlZC4gIFNvbWUgdHlwZXMgY2FuIGhhdmUgZGlmZmVyZW50IHdpZHRocyBvbiBkaWZmZXJlbnQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmZzL25mczQxLXNlcnZlci50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25mcy9uZnM0MS1zZXJ2ZXIudHh0CmluZGV4IDA0ODg0OTEuLjA5MmZhZDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmZzL25mczQxLXNlcnZlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uZnMvbmZzNDEtc2VydmVyLnR4dApAQCAtMzksMjcgKzM5LDE3IEBACiAJICBmcm9tIGEgbGludXggY2xpZW50IGFyZSBwb3NzaWJsZSwgYnV0IHdlIGFyZW4ndCByZWFsbHkKIAkgIGNvbmZvcm1hbnQgd2l0aCB0aGUgc3BlYyAoZm9yIGV4YW1wbGUsIHdlIGRvbid0IHVzZSBrZXJiZXJvcwogCSAgb24gdGhlIGJhY2tjaGFubmVsIGNvcnJlY3RseSkuCi0JLSBubyB0cnVua2luZyBzdXBwb3J0OiBubyBjbGllbnRzIGN1cnJlbnRseSB0YWtlIGFkdmFudGFnZSBvZgotCSAgdHJ1bmtpbmcsIGJ1dCB0aGlzIGlzIGEgbWFuZGF0b3J5IGZlYXR1cmUsIGFuZCBpdHMgdXNlIGlzCi0JICByZWNvbW1lbmRlZCB0byBjbGllbnRzIGluIGEgbnVtYmVyIG9mIHBsYWNlcy4gIChFLmcuIHRvIGVuc3VyZQotCSAgdGltZWx5IHJlbmV3YWwgaW4gY2FzZSBhbiBleGlzdGluZyBjb25uZWN0aW9uJ3MgcmV0cnkgdGltZW91dHMKLQkgIGhhdmUgZ290dGVuIHRvbyBsb25nOyBzZWUgc2VjdGlvbiA4LjMgb2YgdGhlIFJGQy4pCi0JICBUaGVyZWZvcmUsIGxhY2sgb2YgdGhpcyBmZWF0dXJlIG1heSBjYXVzZSBmdXR1cmUgY2xpZW50cyB0bwotCSAgZmFpbC4KIAktIEluY29tcGxldGUgYmFja2NoYW5uZWwgc3VwcG9ydDogaW5jb21wbGV0ZSBiYWNrY2hhbm5lbCBnc3MKIAkgIHN1cHBvcnQgYW5kIG5vIHN1cHBvcnQgZm9yIEJBQ0tDSEFOTkVMX0NUTCBtZWFuIHRoYXQKIAkgIGNhbGxiYWNrcyAoaGVuY2UgZGVsZWdhdGlvbnMgYW5kIGxheW91dHMpIG1heSBub3QgYmUKIAkgIGF2YWlsYWJsZSBhbmQgY2xpZW50cyBjb25mdXNlZCBieSB0aGUgaW5jb21wbGV0ZQogCSAgaW1wbGVtZW50YXRpb24gbWF5IGZhaWwuCi0JLSBTZXJ2ZXIgcmVib290IHJlY292ZXJ5IGlzIHVuc3VwcG9ydGVkOyBpZiB0aGUgc2VydmVyIHJlYm9vdHMsCi0JICBjbGllbnRzIG1heSBmYWlsLgogCS0gV2UgZG8gbm90IHN1cHBvcnQgU1NWLCB3aGljaCBwcm92aWRlcyBzZWN1cml0eSBmb3Igc2hhcmVkCiAJICBjbGllbnQtc2VydmVyIHN0YXRlICh0aHVzIHByZXZlbnRpbmcgdW5hdXRob3JpemVkIHRhbXBlcmluZwogCSAgd2l0aCBsb2NrcyBhbmQgb3BlbnMsIGZvciBleGFtcGxlKS4gIEl0IGlzIG1hbmRhdG9yeSBmb3IKIAkgIHNlcnZlcnMgdG8gc3VwcG9ydCB0aGlzLCB0aG91Z2ggbm8gY2xpZW50cyB1c2UgaXQgeWV0LgogCS0gTWFuZGF0b3J5IG9wZXJhdGlvbnMgd2hpY2ggd2UgZG8gbm90IHN1cHBvcnQsIHN1Y2ggYXMKLQkgIERFU1RST1lfQ0xJRU5USUQsIEZSRUVfU1RBVEVJRCwgU0VDSU5GT19OT19OQU1FLCBhbmQKLQkgIFRFU1RfU1RBVEVJRCwgYXJlIG5vdCBjdXJyZW50bHkgdXNlZCBieSBjbGllbnRzLCBidXQgd2lsbCBiZQorCSAgREVTVFJPWV9DTElFTlRJRCwgYXJlIG5vdCBjdXJyZW50bHkgdXNlZCBieSBjbGllbnRzLCBidXQgd2lsbCBiZQogCSAgKGFuZCB0aGUgc3BlYyByZWNvbW1lbmRzIHRoZWlyIHVzZXMgaW4gY29tbW9uIGNhc2VzKSwgYW5kCiAJICBjbGllbnRzIHNob3VsZCBub3QgYmUgZXhwZWN0ZWQgdG8ga25vdyBob3cgdG8gcmVjb3ZlciBmcm9tIHRoZQogCSAgY2FzZSB3aGVyZSB0aGV5IGFyZSBub3Qgc3VwcG9ydGVkLiAgVGhpcyB3aWxsIGV2ZW50dWFsbHkgY2F1c2UKQEAgLTY5LDggKzU5LDkgQEAKIGltcGxlbWVudGF0aW9uOgogCiAJLSBJbmNvbXBsZXRlIGRlbGVnYXRpb24gZW5mb3JjZW1lbnQ6IGlmIGEgZmlsZSBpcyByZW5hbWVkIG9yCi0JICB1bmxpbmtlZCwgYSBjbGllbnQgaG9sZGluZyBhIGRlbGVnYXRpb24gbWF5IGNvbnRpbnVlIHRvCi0JICBpbmRlZmluaXRlbHkgYWxsb3cgb3BlbnMgb2YgdGhlIGZpbGUgdW5kZXIgdGhlIG9sZCBuYW1lLgorCSAgdW5saW5rZWQgYnkgYSBsb2NhbCBwcm9jZXNzLCBhIGNsaWVudCBob2xkaW5nIGEgZGVsZWdhdGlvbiBtYXkKKwkgIGNvbnRpbnVlIHRvIGluZGVmaW5pdGVseSBhbGxvdyBvcGVucyBvZiB0aGUgZmlsZSB1bmRlciB0aGUgb2xkCisJICBuYW1lLgogCiBUaGUgdGFibGUgYmVsb3csIHRha2VuIGZyb20gdGhlIE5GU3Y0LjEgZG9jdW1lbnQsIGxpc3RzCiB0aGUgb3BlcmF0aW9ucyB0aGF0IGFyZSBtYW5kYXRvcnkgdG8gaW1wbGVtZW50IChSRVEpLCBvcHRpb25hbApAQCAtOTksNyArOTAsNyBAQAogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCiAgICB8IEFDQ0VTUyAgICAgICAgICAgICAgIHwgUkVRICAgICAgICB8ICAgICAgICAgICAgICB8IFNlY3Rpb24gMTguMSAgIHwKIE5TIHwgQkFDS0NIQU5ORUxfQ1RMICAgICAgfCBSRVEgICAgICAgIHwgICAgICAgICAgICAgIHwgU2VjdGlvbiAxOC4zMyAgfAotTlMgfCBCSU5EX0NPTk5fVE9fU0VTU0lPTiB8IFJFUSAgICAgICAgfCAgICAgICAgICAgICAgfCBTZWN0aW9uIDE4LjM0ICB8CitJICB8IEJJTkRfQ09OTl9UT19TRVNTSU9OIHwgUkVRICAgICAgICB8ICAgICAgICAgICAgICB8IFNlY3Rpb24gMTguMzQgIHwKICAgIHwgQ0xPU0UgICAgICAgICAgICAgICAgfCBSRVEgICAgICAgIHwgICAgICAgICAgICAgIHwgU2VjdGlvbiAxOC4yICAgfAogICAgfCBDT01NSVQgICAgICAgICAgICAgICB8IFJFUSAgICAgICAgfCAgICAgICAgICAgICAgfCBTZWN0aW9uIDE4LjMgICB8CiAgICB8IENSRUFURSAgICAgICAgICAgICAgIHwgUkVRICAgICAgICB8ICAgICAgICAgICAgICB8IFNlY3Rpb24gMTguNCAgIHwKQEAgLTExMSw3ICsxMDIsNyBAQAogTlMgfCBERVNUUk9ZX0NMSUVOVElEICAgICB8IFJFUSAgICAgICAgfCAgICAgICAgICAgICAgfCBTZWN0aW9uIDE4LjUwICB8CiBJICB8IERFU1RST1lfU0VTU0lPTiAgICAgIHwgUkVRICAgICAgICB8ICAgICAgICAgICAgICB8IFNlY3Rpb24gMTguMzcgIHwKIEkgIHwgRVhDSEFOR0VfSUQgICAgICAgICAgfCBSRVEgICAgICAgIHwgICAgICAgICAgICAgIHwgU2VjdGlvbiAxOC4zNSAgfAotTlMgfCBGUkVFX1NUQVRFSUQgICAgICAgICB8IFJFUSAgICAgICAgfCAgICAgICAgICAgICAgfCBTZWN0aW9uIDE4LjM4ICB8CitJICB8IEZSRUVfU1RBVEVJRCAgICAgICAgIHwgUkVRICAgICAgICB8ICAgICAgICAgICAgICB8IFNlY3Rpb24gMTguMzggIHwKICAgIHwgR0VUQVRUUiAgICAgICAgICAgICAgfCBSRVEgICAgICAgIHwgICAgICAgICAgICAgIHwgU2VjdGlvbiAxOC43ICAgfAogUCAgfCBHRVRERVZJQ0VJTkZPICAgICAgICB8IE9QVCAgICAgICAgfCBwTkZTIChSRVEpICAgfCBTZWN0aW9uIDE4LjQwICB8CiBQICB8IEdFVERFVklDRUxJU1QgICAgICAgIHwgT1BUICAgICAgICB8IHBORlMgKE9QVCkgICB8IFNlY3Rpb24gMTguNDEgIHwKQEAgLTE0NSwxNCArMTM2LDE0IEBACiAgICB8IFJFU1RPUkVGSCAgICAgICAgICAgIHwgUkVRICAgICAgICB8ICAgICAgICAgICAgICB8IFNlY3Rpb24gMTguMjcgIHwKICAgIHwgU0FWRUZIICAgICAgICAgICAgICAgfCBSRVEgICAgICAgIHwgICAgICAgICAgICAgIHwgU2VjdGlvbiAxOC4yOCAgfAogICAgfCBTRUNJTkZPICAgICAgICAgICAgICB8IFJFUSAgICAgICAgfCAgICAgICAgICAgICAgfCBTZWN0aW9uIDE4LjI5ICB8Ci1OUyB8IFNFQ0lORk9fTk9fTkFNRSAgICAgIHwgUkVDICAgICAgICB8IHBORlMgZmlsZXMgICB8IFNlY3Rpb24gMTguNDUsIHwKK0kgIHwgU0VDSU5GT19OT19OQU1FICAgICAgfCBSRUMgICAgICAgIHwgcE5GUyBmaWxlcyAgIHwgU2VjdGlvbiAxOC40NSwgfAogICAgfCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCBsYXlvdXQgKFJFUSkgfCBTZWN0aW9uIDEzLjEyICB8CiBJICB8IFNFUVVFTkNFICAgICAgICAgICAgIHwgUkVRICAgICAgICB8ICAgICAgICAgICAgICB8IFNlY3Rpb24gMTguNDYgIHwKICAgIHwgU0VUQVRUUiAgICAgICAgICAgICAgfCBSRVEgICAgICAgIHwgICAgICAgICAgICAgIHwgU2VjdGlvbiAxOC4zMCAgfAogICAgfCBTRVRDTElFTlRJRCAgICAgICAgICB8IE1OSSAgICAgICAgfCAgICAgICAgICAgICAgfCBOL0EgICAgICAgICAgICB8CiAgICB8IFNFVENMSUVOVElEX0NPTkZJUk0gIHwgTU5JICAgICAgICB8ICAgICAgICAgICAgICB8IE4vQSAgICAgICAgICAgIHwKIE5TIHwgU0VUX1NTViAgICAgICAgICAgICAgfCBSRVEgICAgICAgIHwgICAgICAgICAgICAgIHwgU2VjdGlvbiAxOC40NyAgfAotTlMgfCBURVNUX1NUQVRFSUQgICAgICAgICB8IFJFUSAgICAgICAgfCAgICAgICAgICAgICAgfCBTZWN0aW9uIDE4LjQ4ICB8CitJICB8IFRFU1RfU1RBVEVJRCAgICAgICAgIHwgUkVRICAgICAgICB8ICAgICAgICAgICAgICB8IFNlY3Rpb24gMTguNDggIHwKICAgIHwgVkVSSUZZICAgICAgICAgICAgICAgfCBSRVEgICAgICAgIHwgICAgICAgICAgICAgIHwgU2VjdGlvbiAxOC4zMSAgfAogTlMqfCBXQU5UX0RFTEVHQVRJT04gICAgICB8IE9QVCAgICAgICAgfCBGREVMRyAoT1BUKSAgfCBTZWN0aW9uIDE4LjQ5ICB8CiAgICB8IFdSSVRFICAgICAgICAgICAgICAgIHwgUkVRICAgICAgICB8ICAgICAgICAgICAgICB8IFNlY3Rpb24gMTguMzIgIHwKQEAgLTIwNiwxMiArMTk3LDYgQEAKIFNFUVVFTkNFOgogKiBubyBzdXBwb3J0IGZvciBkeW5hbWljIHNsb3QgdGFibGUgcmVuZWdvdGlhdGlvbiAob3B0aW9uYWwpCiAKLW5mc3Y0LjEgQ09NUE9VTkQgcnVsZXM6Ci1UaGUgZm9sbG93aW5nIGNhc2VzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0OgotKiBFbmZvcmNpbmcgb2YgTkZTNEVSUl9OT1RfT05MWV9PUCBmb3I6IEJJTkRfQ09OTl9UT19TRVNTSU9OLCBDUkVBVEVfU0VTU0lPTiwKLSAgREVTVFJPWV9DTElFTlRJRCwgREVTVFJPWV9TRVNTSU9OLCBFWENIQU5HRV9JRC4KLSogREVTVFJPWV9TRVNTSU9OIE1VU1QgYmUgdGhlIGZpbmFsIG9wZXJhdGlvbiBpbiB0aGUgQ09NUE9VTkQgcmVxdWVzdC4KLQogTm9uc3RhbmRhcmQgY29tcG91bmQgbGltaXRhdGlvbnM6CiAqIE5vIHN1cHBvcnQgZm9yIGEgc2Vzc2lvbnMgZm9yZSBjaGFubmVsIFJQQyBjb21wb3VuZCB0aGF0IHJlcXVpcmVzIGJvdGggYQogICBjYV9tYXhyZXF1ZXN0c2l6ZSByZXF1ZXN0IGFuZCBhIGNhX21heHJlc3BvbnNlc2l6ZSByZXBseSwgc28gd2UgbWF5CkBAIC0yMTksMyArMjA0LDUgQEAKICAgbmVnb3RpYXRpb24uCiAqIE5vIG1vcmUgdGhhbiBvbmUgSU8gb3BlcmF0aW9uIChyZWFkLCB3cml0ZSwgcmVhZGRpcikgYWxsb3dlZCBwZXIKICAgY29tcG91bmQuCisKK1NlZSBhbHNvIGh0dHA6Ly93aWtpLmxpbnV4LW5mcy5vcmcvd2lraS9pbmRleC5waHAvU2VydmVyXzQuMF9hbmRfNC4xX2lzc3Vlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmZzL25mc3Jvb3QudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uZnMvbmZzcm9vdC50eHQKaW5kZXggOTBjNzFjNi4uZmZkZDlkOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uZnMvbmZzcm9vdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uZnMvbmZzcm9vdC50eHQKQEAgLTIyNiw3ICsyMjYsNyBAQAogICAgICAJY2RyZWNvcmQuCiAKIAllLmcuCi0JICBjZHJlY29yZCBkZXY9QVRBUEk6MSwwLDAgYXJjaC9pMzg2L2Jvb3QvaW1hZ2UuaXNvCisJICBjZHJlY29yZCBkZXY9QVRBUEk6MSwwLDAgYXJjaC94ODYvYm9vdC9pbWFnZS5pc28KIAogICAgICAJRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaXNvbGludXgsIGluY2x1ZGluZyBob3cgdG8gY3JlYXRlIGJvb3RkaXNrcwogICAgICAJZm9yIHByZWJ1aWx0IGtlcm5lbHMsIHNlZSBodHRwOi8vc3lzbGludXguenl0b3IuY29tLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uaWxmczIudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uaWxmczIudHh0CmluZGV4IGQ1YzBjZWYuLjg3M2EyYWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmlsZnMyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25pbGZzMi50eHQKQEAgLTQwLDcgKzQwLDYgQEAKIAktIFBPU0lYIEFDTHMKIAktIHF1b3RhcwogCS0gZnNjawotCS0gcmVzaXplCiAJLSBkZWZyYWdtZW50YXRpb24KIAogTW91bnQgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wb3J0aW5nIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wb3J0aW5nCmluZGV4IDZlMjk5NTQuLmI0YTNkNzYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcG9ydGluZworKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3BvcnRpbmcKQEAgLTQwMCwxMCArNDAwLDMyIEBACiAKIC0tCiBbbWFuZGF0b3J5XQotCi0tLQotW21hbmRhdG9yeV0KIAktPmdldF9zYigpIGlzIGdvbmUuICBTd2l0Y2ggdG8gdXNlIG9mIC0+bW91bnQoKS4gIFR5cGljYWxseSBpdCdzIGp1c3QKIGEgbWF0dGVyIG9mIHN3aXRjaGluZyBmcm9tIGNhbGxpbmcgZ2V0X3NiXy4uLiB0byBtb3VudF8uLi4gYW5kIGNoYW5naW5nIHRoZQogZnVuY3Rpb24gdHlwZS4gIElmIHlvdSB3ZXJlIGRvaW5nIGl0IG1hbnVhbGx5LCBqdXN0IHN3aXRjaCBmcm9tIHNldHRpbmcgLT5tbnRfcm9vdAogdG8gc29tZSBwb2ludGVyIHRvIHJldHVybmluZyB0aGF0IHBvaW50ZXIuICBPbiBlcnJvcnMgcmV0dXJuIEVSUl9QVFIoLi4uKS4KKworLS0KK1ttYW5kYXRvcnldCisJLT5wZXJtaXNzaW9uKCkgYW5kIGdlbmVyaWNfcGVybWlzc2lvbigpaGF2ZSBsb3N0IGZsYWdzCithcmd1bWVudDsgaW5zdGVhZCBvZiBwYXNzaW5nIElQRVJNX0ZMQUdfUkNVIHdlIGFkZCBNQVlfTk9UX0JMT0NLIGludG8gbWFzay4KKwlnZW5lcmljX3Blcm1pc3Npb24oKSBoYXMgYWxzbyBsb3N0IHRoZSBjaGVja19hY2wgYXJndW1lbnQ7IEFDTCBjaGVja2luZworaGFzIGJlZW4gdGFrZW4gdG8gVkZTIGFuZCBmaWxlc3lzdGVtcyBuZWVkIHRvIHByb3ZpZGUgYSBub24tTlVMTCAtPmlfb3AtPmdldF9hY2wKK3RvIHJlYWQgYW4gQUNMIGZyb20gZGlzay4KKworLS0KK1ttYW5kYXRvcnldCisJSWYgeW91IGltcGxlbWVudCB5b3VyIG93biAtPmxsc2VlaygpIHlvdSBtdXN0IGhhbmRsZSBTRUVLX0hPTEUgYW5kCitTRUVLX0RBVEEuICBZb3UgY2FuIGhhbmxlIHRoaXMgYnkgcmV0dXJuaW5nIC1FSU5WQUwsIGJ1dCBpdCB3b3VsZCBiZSBuaWNlciB0bworc3VwcG9ydCBpdCBpbiBzb21lIHdheS4gIFRoZSBnZW5lcmljIGhhbmRsZXIgYXNzdW1lcyB0aGF0IHRoZSBlbnRpcmUgZmlsZSBpcworZGF0YSBhbmQgdGhlcmUgaXMgYSB2aXJ0dWFsIGhvbGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIFNvIGlmIHRoZSBwcm92aWRlZAorb2Zmc2V0IGlzIGxlc3MgdGhhbiBpX3NpemUgYW5kIFNFRUtfREFUQSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgc2FtZSBvZmZzZXQuCitJZiB0aGUgYWJvdmUgaXMgdHJ1ZSBmb3IgdGhlIG9mZnNldCBhbmQgeW91IGFyZSBnaXZlbiBTRUVLX0hPTEUsIHJldHVybiB0aGUgZW5kCitvZiB0aGUgZmlsZS4gIElmIHRoZSBvZmZzZXQgaXMgaV9zaXplIG9yIGdyZWF0ZXIgcmV0dXJuIC1FTlhJTyBpbiBlaXRoZXIgY2FzZS4KKworW21hbmRhdG9yeV0KKwlJZiB5b3UgaGF2ZSB5b3VyIG93biAtPmZzeW5jKCkgeW91IG11c3QgbWFrZSBzdXJlIHRvIGNhbGwKK2ZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoKSBzbyB0aGF0IGFsbCBkaXJ0eSBwYWdlcyBhcmUgc3luY2VkIG91dCBwcm9wZXJseS4KK1lvdSBtdXN0IGFsc28ga2VlcCBpbiBtaW5kIHRoYXQgLT5mc3luYygpIGlzIG5vdCBjYWxsZWQgd2l0aCBpX211dGV4IGhlbGQKK2FueW1vcmUsIHNvIGlmIHlvdSByZXF1aXJlIGlfbXV0ZXggbG9ja2luZyB5b3UgbXVzdCBtYWtlIHN1cmUgdG8gdGFrZSBpdCBhbmQKK3JlbGVhc2UgaXQgeW91cnNlbGYuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAppbmRleCBmNDgxNzgwLi5kYjNiMWFiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKQEAgLTg0Myw2ICs4NDMsNyBAQAogIFRBU0tMRVQ6ICAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAwICAgICAgICAyOTAKICAgIFNDSEVEOiAgICAgIDI3MDM1ICAgICAgMjY5ODMgICAgICAyNjk3MSAgICAgIDI2NzQ2CiAgSFJUSU1FUjogICAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgMAorICAgICBSQ1U6ICAgICAgIDE2NzggICAgICAgMTc2OSAgICAgICAyMTc4ICAgICAgIDIyNTAKIAogCiAxLjMgSURFIGRldmljZXMgaW4gL3Byb2MvaWRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3NxdWFzaGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3F1YXNoZnMudHh0CmluZGV4IGQ0ZDQxNDYuLjdkYjNlYmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3F1YXNoZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3F1YXNoZnMudHh0CkBAIC0yLDcgKzIsNyBAQAogPT09PT09PT09PT09PT09PT09PT09PT0KIAogU3F1YXNoZnMgaXMgYSBjb21wcmVzc2VkIHJlYWQtb25seSBmaWxlc3lzdGVtIGZvciBMaW51eC4KLUl0IHVzZXMgemxpYi9sem8gY29tcHJlc3Npb24gdG8gY29tcHJlc3MgZmlsZXMsIGlub2RlcyBhbmQgZGlyZWN0b3JpZXMuCitJdCB1c2VzIHpsaWIvbHpvL3h6IGNvbXByZXNzaW9uIHRvIGNvbXByZXNzIGZpbGVzLCBpbm9kZXMgYW5kIGRpcmVjdG9yaWVzLgogSW5vZGVzIGluIHRoZSBzeXN0ZW0gYXJlIHZlcnkgc21hbGwgYW5kIGFsbCBibG9ja3MgYXJlIHBhY2tlZCB0byBtaW5pbWlzZQogZGF0YSBvdmVyaGVhZC4gQmxvY2sgc2l6ZXMgZ3JlYXRlciB0aGFuIDRLIGFyZSBzdXBwb3J0ZWQgdXAgdG8gYSBtYXhpbXVtCiBvZiAxTWJ5dGVzIChkZWZhdWx0IGJsb2NrIHNpemUgMTI4SykuCkBAIC01NSw2ICs1NSw4IEBACiBjYW4gYmUgb2J0YWluZWQgZnJvbSBodHRwOi8vd3d3LnNxdWFzaGZzLm9yZy4gIFVzYWdlIGluc3RydWN0aW9ucyBjYW4gYmUKIG9idGFpbmVkIGZyb20gdGhpcyBzaXRlIGFsc28uCiAKK1RoZSBzcXVhc2hmcy10b29scyBkZXZlbG9wbWVudCB0cmVlIGlzIG5vdyBsb2NhdGVkIG9uIGtlcm5lbC5vcmcKKwlnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2ZzL3NxdWFzaGZzL3NxdWFzaGZzLXRvb2xzLmdpdAogCiAzLiBTUVVBU0hGUyBGSUxFU1lTVEVNIERFU0lHTgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdWJpZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy91Ymlmcy50eHQKaW5kZXggOGU0ZmFiNi4uYTBhNjFkMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy91Ymlmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy91Ymlmcy50eHQKQEAgLTExMSwzNCArMTExLDYgQEAKIHRvIFVCSSBhbmQgbW91bnQgdm9sdW1lICJyb290ZnMiOgogdWJpLm10ZD0wIHJvb3Q9dWJpMDpyb290ZnMgcm9vdGZzdHlwZT11YmlmcwogCi0KLU1vZHVsZSBQYXJhbWV0ZXJzIGZvciBEZWJ1Z2dpbmcKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotV2hlbiBVQklGUyBoYXMgYmVlbiBjb21waWxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLCB0aGVyZSBhcmUgMiBtb2R1bGUKLXBhcmFtZXRlcnMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIGNvbnRyb2wgYXNwZWN0cyBvZiB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuCi0KLWRlYnVnX2Noa3MJU2VsZWN0cyBleHRyYSBjaGVja3MgdGhhdCBVQklGUyBjYW4gZG8gd2hpbGUgcnVubmluZzoKLQotCQlDaGVjawkJCQkJRmxhZyB2YWx1ZQotCi0JCUdlbmVyYWwgY2hlY2tzCQkJCTEKLQkJQ2hlY2sgVHJlZSBOb2RlIENhY2hlIChUTkMpCQkyCi0JCUNoZWNrIGluZGV4aW5nIHRyZWUgc2l6ZQkJNAotCQlDaGVjayBvcnBoYW4gYXJlYQkJCTgKLQkJQ2hlY2sgb2xkIGluZGV4aW5nIHRyZWUJCQkxNgotCQlDaGVjayBMRUIgcHJvcGVydGllcyAobHByb3BzKQkJMzIKLQkJQ2hlY2sgbGVhZiBub2RlcyBhbmQgaW5vZGVzCQk2NAotCi1kZWJ1Z190c3RzCVNlbGVjdHMgYSBtb2RlIG9mIHRlc3RpbmcsIGFzIGZvbGxvd3M6Ci0KLQkJVGVzdCBtb2RlCQkJCUZsYWcgdmFsdWUKLQotCQlGYWlsdXJlIG1vZGUgZm9yIHJlY292ZXJ5IHRlc3RpbmcJNAotCi1Gb3IgZXhhbXBsZSwgc2V0IGRlYnVnX2Noa3MgdG8gMyB0byBlbmFibGUgZ2VuZXJhbCBhbmQgVE5DIGNoZWNrcy4KLQotCiBSZWZlcmVuY2VzCiA9PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAppbmRleCA4OGI5ZjU1Li41MmQ4ZmI4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CkBAIC0yMjksNiArMjI5LDggQEAKIAogICAgICAgICBzc2l6ZV90ICgqcXVvdGFfcmVhZCkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CiAgICAgICAgIHNzaXplX3QgKCpxdW90YV93cml0ZSkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY29uc3QgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CisJaW50ICgqbnJfY2FjaGVkX29iamVjdHMpKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKwl2b2lkICgqZnJlZV9jYWNoZWRfb2JqZWN0cykoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCk7CiB9OwogCiBBbGwgbWV0aG9kcyBhcmUgY2FsbGVkIHdpdGhvdXQgYW55IGxvY2tzIGJlaW5nIGhlbGQsIHVubGVzcyBvdGhlcndpc2UKQEAgLTMwMSw2ICszMDMsMjYgQEAKIAogICBxdW90YV93cml0ZTogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gd3JpdGUgdG8gZmlsZXN5c3RlbSBxdW90YSBmaWxlLgogCisgIG5yX2NhY2hlZF9vYmplY3RzOiBjYWxsZWQgYnkgdGhlIHNiIGNhY2hlIHNocmlua2luZyBmdW5jdGlvbiBmb3IgdGhlCisJZmlsZXN5c3RlbSB0byByZXR1cm4gdGhlIG51bWJlciBvZiBmcmVlYWJsZSBjYWNoZWQgb2JqZWN0cyBpdCBjb250YWlucy4KKwlPcHRpb25hbC4KKworICBmcmVlX2NhY2hlX29iamVjdHM6IGNhbGxlZCBieSB0aGUgc2IgY2FjaGUgc2hyaW5raW5nIGZ1bmN0aW9uIGZvciB0aGUKKwlmaWxlc3lzdGVtIHRvIHNjYW4gdGhlIG51bWJlciBvZiBvYmplY3RzIGluZGljYXRlZCB0byB0cnkgdG8gZnJlZSB0aGVtLgorCU9wdGlvbmFsLCBidXQgYW55IGZpbGVzeXN0ZW0gaW1wbGVtZW50aW5nIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGFsc28KKwlpbXBsZW1lbnQgLT5ucl9jYWNoZWRfb2JqZWN0cyBmb3IgaXQgdG8gYmUgY2FsbGVkIGNvcnJlY3RseS4KKworCVdlIGNhbid0IGRvIGFueXRoaW5nIHdpdGggYW55IGVycm9ycyB0aGF0IHRoZSBmaWxlc3lzdGVtIG1pZ2h0CisJZW5jb3VudGVyZWQsIGhlbmNlIHRoZSB2b2lkIHJldHVybiB0eXBlLiBUaGlzIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIGlmCisJdGhlIFZNIGlzIHRyeWluZyB0byByZWNsYWltIHVuZGVyIEdGUF9OT0ZTIGNvbmRpdGlvbnMsIGhlbmNlIHRoaXMKKwltZXRob2QgZG9lcyBub3QgbmVlZCB0byBoYW5kbGUgdGhhdCBzaXR1YXRpb24gaXRzZWxmLgorCisJSW1wbGVtZW50YXRpb25zIG11c3QgaW5jbHVkZSBjb25kaXRpb25hbCByZXNjaGVkdWxlIGNhbGxzIGluc2lkZSBhbnkKKwlzY2FubmluZyBsb29wIHRoYXQgaXMgZG9uZS4gVGhpcyBhbGxvd3MgdGhlIFZGUyB0byBkZXRlcm1pbmUKKwlhcHByb3ByaWF0ZSBzY2FuIGJhdGNoIHNpemVzIHdpdGhvdXQgaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHdoZXRoZXIKKwlpbXBsZW1lbnRhdGlvbnMgd2lsbCBjYXVzZSBob2xkb2ZmIHByb2JsZW1zIGR1ZSB0byBsYXJnZSBzY2FuIGJhdGNoCisJc2l6ZXMuCisKIFdob2V2ZXIgc2V0cyB1cCB0aGUgaW5vZGUgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgaW4gdGhlICJpX29wIiBmaWVsZC4gVGhpcwogaXMgYSBwb2ludGVyIHRvIGEgInN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIiB3aGljaCBkZXNjcmliZXMgdGhlIG1ldGhvZHMgdGhhdAogY2FuIGJlIHBlcmZvcm1lZCBvbiBpbmRpdmlkdWFsIGlub2Rlcy4KQEAgLTMzMyw4ICszNTUsOCBAQAogICAgICAgICB2b2lkICogKCpmb2xsb3dfbGluaykgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKICAgICAgICAgdm9pZCAoKnB1dF9saW5rKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICosIHZvaWQgKik7CiAJdm9pZCAoKnRydW5jYXRlKSAoc3RydWN0IGlub2RlICopOwotCWludCAoKnBlcm1pc3Npb24pIChzdHJ1Y3QgaW5vZGUgKiwgaW50LCB1bnNpZ25lZCBpbnQpOwotCWludCAoKmNoZWNrX2FjbCkoc3RydWN0IGlub2RlICosIGludCwgdW5zaWduZWQgaW50KTsKKwlpbnQgKCpwZXJtaXNzaW9uKSAoc3RydWN0IGlub2RlICosIGludCk7CisJaW50ICgqZ2V0X2FjbCkoc3RydWN0IGlub2RlICosIGludCk7CiAJaW50ICgqc2V0YXR0cikgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwogCWludCAoKmdldGF0dHIpIChzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXQgKik7CiAJaW50ICgqc2V0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKixjb25zdCB2b2lkICosc2l6ZV90LGludCk7CkBAIC00MjMsNyArNDQ1LDcgQEAKICAgcGVybWlzc2lvbjogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gY2hlY2sgZm9yIGFjY2VzcyByaWdodHMgb24gYSBQT1NJWC1saWtlCiAgIAlmaWxlc3lzdGVtLgogCi0JTWF5IGJlIGNhbGxlZCBpbiByY3Utd2FsayBtb2RlIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKS4gSWYgaW4gcmN1LXdhbGsKKwlNYXkgYmUgY2FsbGVkIGluIHJjdS13YWxrIG1vZGUgKG1hc2sgJiBNQVlfTk9UX0JMT0NLKS4gSWYgaW4gcmN1LXdhbGsKICAgICAgICAgbW9kZSwgdGhlIGZpbGVzeXN0ZW0gbXVzdCBjaGVjayB0aGUgcGVybWlzc2lvbiB3aXRob3V0IGJsb2NraW5nIG9yCiAJc3RvcmluZyB0byB0aGUgaW5vZGUuCiAKQEAgLTc1NSw3ICs3NzcsNyBAQAogCWludCAoKm9wZW4pIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiAJaW50ICgqZmx1c2gpIChzdHJ1Y3QgZmlsZSAqKTsKIAlpbnQgKCpyZWxlYXNlKSAoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwotCWludCAoKmZzeW5jKSAoc3RydWN0IGZpbGUgKiwgaW50IGRhdGFzeW5jKTsKKwlpbnQgKCpmc3luYykgKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgbG9mZl90LCBpbnQgZGF0YXN5bmMpOwogCWludCAoKmFpb19mc3luYykgKHN0cnVjdCBraW9jYiAqLCBpbnQgZGF0YXN5bmMpOwogCWludCAoKmZhc3luYykgKGludCwgc3RydWN0IGZpbGUgKiwgaW50KTsKIAlpbnQgKCpsb2NrKSAoc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9mNzE4ODJmZyBiL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODgyZmcKaW5kZXggODRkMjYyMy4uZGU5MWMwZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9mNzE4ODJmZworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTg4MmZnCkBAIC0yMiw2ICsyMiwxMCBAQAogICAgIFByZWZpeDogJ2Y3MTg2OScKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogbm9uZSwgYWRkcmVzcyByZWFkIGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZQogICAgIERhdGFzaGVldDogQXZhaWxhYmxlIGZyb20gdGhlIEZpbnRlayB3ZWJzaXRlCisgICogRmludGVrIEY3MTg2OUEKKyAgICBQcmVmaXg6ICdmNzE4NjlhJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCisgICAgRGF0YXNoZWV0OiBOb3QgcHVibGljCiAgICogRmludGVrIEY3MTg4MkZHIGFuZCBGNzE4ODNGRwogICAgIFByZWZpeDogJ2Y3MTg4MmZnJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcKaW5kZXggMzg0MjVmMC4uNmY0OTZhNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NwpAQCAtNzYsNyArNzYsOCBAQAogVGhlc2UgY2hpcHMgYXJlICdTdXBlciBJL08gY2hpcHMnLCBzdXBwb3J0aW5nIGZsb3BweSBkaXNrcywgaW5mcmFyZWQgcG9ydHMsCiBqb3lzdGlja3MgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMgc3R1ZmYuIEZvciBoYXJkd2FyZSBtb25pdG9yaW5nLCB0aGV5CiBpbmNsdWRlIGFuICdlbnZpcm9ubWVudCBjb250cm9sbGVyJyB3aXRoIDMgdGVtcGVyYXR1cmUgc2Vuc29ycywgMyBmYW4KLXJvdGF0aW9uIHNwZWVkIHNlbnNvcnMsIDggdm9sdGFnZSBzZW5zb3JzLCBhbmQgYXNzb2NpYXRlZCBhbGFybXMuCityb3RhdGlvbiBzcGVlZCBzZW5zb3JzLCA4IHZvbHRhZ2Ugc2Vuc29ycywgYXNzb2NpYXRlZCBhbGFybXMsIGFuZCBjaGFzc2lzCitpbnRydXNpb24gZGV0ZWN0aW9uLgogCiBUaGUgSVQ4NzEyRiBhbmQgSVQ4NzE2RiBhZGRpdGlvbmFsbHkgZmVhdHVyZSBWSUQgaW5wdXRzLCB1c2VkIHRvIHJlcG9ydAogdGhlIFZjb3JlIHZvbHRhZ2Ugb2YgdGhlIHByb2Nlc3Nvci4gVGhlIGVhcmx5IElUODcxMkYgaGF2ZSA1IFZJRCBwaW5zLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9rMTB0ZW1wIGIvRG9jdW1lbnRhdGlvbi9od21vbi9rMTB0ZW1wCmluZGV4IDAzOTNjODkuLmExMGY3MzYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vazEwdGVtcAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2sxMHRlbXAKQEAgLTksOCArOSw4IEBACiAgIFNvY2tldCBTMUczOiBBdGhsb24gSUksIFNlbXByb24sIFR1cmlvbiBJSQogKiBBTUQgRmFtaWx5IDExaCBwcm9jZXNzb3JzOgogICBTb2NrZXQgUzFHMjogQXRobG9uIChYMiksIFNlbXByb24gKFgyKSwgVHVyaW9uIFgyIChVbHRyYSkKLSogQU1EIEZhbWlseSAxMmggcHJvY2Vzc29yczogIkxsYW5vIgotKiBBTUQgRmFtaWx5IDE0aCBwcm9jZXNzb3JzOiAiQnJhem9zIiAoQy9FL0ctU2VyaWVzKQorKiBBTUQgRmFtaWx5IDEyaCBwcm9jZXNzb3JzOiAiTGxhbm8iIChFMi9BNC9BNi9BOC1TZXJpZXMpCisqIEFNRCBGYW1pbHkgMTRoIHByb2Nlc3NvcnM6ICJCcmF6b3MiIChDL0UvRy9aLVNlcmllcykKICogQU1EIEZhbWlseSAxNWggcHJvY2Vzc29yczogIkJ1bGxkb3plciIKIAogICBQcmVmaXg6ICdrMTB0ZW1wJwpAQCAtMjAsMTIgKzIwLDE2IEBACiAgICAgaHR0cDovL3N1cHBvcnQuYW1kLmNvbS91cy9Qcm9jZXNzb3JfVGVjaERvY3MvMzExMTYucGRmCiAgIEJJT1MgYW5kIEtlcm5lbCBEZXZlbG9wZXIncyBHdWlkZSAoQktERykgZm9yIEFNRCBGYW1pbHkgMTFoIFByb2Nlc3NvcnM6CiAgICAgaHR0cDovL3N1cHBvcnQuYW1kLmNvbS91cy9Qcm9jZXNzb3JfVGVjaERvY3MvNDEyNTYucGRmCisgIEJJT1MgYW5kIEtlcm5lbCBEZXZlbG9wZXIncyBHdWlkZSAoQktERykgZm9yIEFNRCBGYW1pbHkgMTJoIFByb2Nlc3NvcnM6CisgICAgaHR0cDovL3N1cHBvcnQuYW1kLmNvbS91cy9Qcm9jZXNzb3JfVGVjaERvY3MvNDExMzEucGRmCiAgIEJJT1MgYW5kIEtlcm5lbCBEZXZlbG9wZXIncyBHdWlkZSAoQktERykgZm9yIEFNRCBGYW1pbHkgMTRoIE1vZGVscyAwMGgtMEZoIFByb2Nlc3NvcnM6CiAgICAgaHR0cDovL3N1cHBvcnQuYW1kLmNvbS91cy9Qcm9jZXNzb3JfVGVjaERvY3MvNDMxNzAucGRmCiAgIFJldmlzaW9uIEd1aWRlIGZvciBBTUQgRmFtaWx5IDEwaCBQcm9jZXNzb3JzOgogICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzQxMzIyLnBkZgogICBSZXZpc2lvbiBHdWlkZSBmb3IgQU1EIEZhbWlseSAxMWggUHJvY2Vzc29yczoKICAgICBodHRwOi8vc3VwcG9ydC5hbWQuY29tL3VzL1Byb2Nlc3Nvcl9UZWNoRG9jcy80MTc4OC5wZGYKKyAgUmV2aXNpb24gR3VpZGUgZm9yIEFNRCBGYW1pbHkgMTJoIFByb2Nlc3NvcnM6CisgICAgaHR0cDovL3N1cHBvcnQuYW1kLmNvbS91cy9Qcm9jZXNzb3JfVGVjaERvY3MvNDQ3MzkucGRmCiAgIFJldmlzaW9uIEd1aWRlIGZvciBBTUQgRmFtaWx5IDE0aCBNb2RlbHMgMDBoLTBGaCBQcm9jZXNzb3JzOgogICAgIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzQ3NTM0LnBkZgogICBBTUQgRmFtaWx5IDExaCBQcm9jZXNzb3IgUG93ZXIgYW5kIFRoZXJtYWwgRGF0YSBTaGVldCBmb3IgTm90ZWJvb2tzOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTc4IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTc4CmluZGV4IDYwOTMyZTIuLjJiZGM4ODEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vbG03OAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzgKQEAgLTEzLDcgKzEzLDggQEAKICAgICBEYXRhc2hlZXQ6IFB1YmxpY2x5IGF2YWlsYWJsZSBhdCB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciB3ZWJzaXRlCiAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS8KIAotQXV0aG9yOiBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CitBdXRob3JzOiBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisgICAgICAgICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KIAogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3NjaDU2MzYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3NjaDU2MzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzYmQxYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vc2NoNTYzNgpAQCAtMCwwICsxLDMxIEBACitLZXJuZWwgZHJpdmVyIHNjaDU2MzYKKz09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogU01TQyBTQ0g1NjM2CisgICAgUHJlZml4OiAnc2NoNTYzNicKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogbm9uZSwgYWRkcmVzcyByZWFkIGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZQorCitBdXRob3I6IEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1NNU0MgU0NINTYzNiBTdXBlciBJL08gY2hpcHMgaW5jbHVkZSBhbiBlbWJlZGRlZCBtaWNyb2NvbnRyb2xsZXIgZm9yCitoYXJkd2FyZSBtb25pdG9yaW5nIHNvbHV0aW9ucywgYWxsb3dpbmcgbW90aGVyYm9hcmQgbWFudWZhY3R1cmVycyB0byBjcmVhdGUKK3RoZWlyIG93biBjdXN0b20gaHdtb24gc29sdXRpb24gYmFzZWQgdXBvbiB0aGUgU0NINTYzNi4KKworQ3VycmVudGx5IHRoZSBzY2g1NjM2IGRyaXZlciBvbmx5IHN1cHBvcnRzIHRoZSBGdWppdHN1IFRoZXNldXMgU0NINTYzNiBiYXNlZAoraHdtb24gc29sdXRpb24uIFRoZSBzY2g1NjM2IGRyaXZlciBydW5zIGEgc2FuaXR5IGNoZWNrIG9uIGxvYWRpbmcgdG8gZW5zdXJlCitpdCBpcyBkZWFsaW5nIHdpdGggYSBGdWppdHN1IFRoZXNldXMgYW5kIG5vdCB3aXRoIGFub3RoZXIgY3VzdG9tIFNDSDU2MzYgYmFzZWQKK2h3bW9uIHNvbHV0aW9uLgorCitUaGUgRnVqaXRzdSBUaGVzZXVzIGNhbiBtb25pdG9yIHVwIHRvIDUgdm9sdGFnZXMsIDggZmFucyBhbmQgMTYKK3RlbXBlcmF0dXJlcy4gTm90ZSB0aGF0IHRoZSBkcml2ZXIgZGV0ZWN0cyBob3cgbWFueSBmYW4gaGVhZGVycyAvCit0ZW1wZXJhdHVyZSBzZW5zb3JzIGFyZSBhY3R1YWxseSBpbXBsZW1lbnRlZCBvbiB0aGUgbW90aGVyYm9hcmQsIHNvIHlvdSB3aWxsCitsaWtlbHkgc2VlIGZld2VyIHRlbXBlcmF0dXJlIGFuZCBmYW4gaW5wdXRzLgorCitBbiBhcHBsaWNhdGlvbiBub3RlIGRlc2NyaWJpbmcgdGhlIFRoZXNldXMnIHJlZ2lzdGVycywgYXMgd2VsbCBhcyBhbgorYXBwbGljYXRpb24gbm90ZSBkZXNjcmliaW5nIHRoZSBwcm90b2NvbCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZQorbWljcm9jb250cm9sbGVyIGlzIGF2YWlsYWJsZSB1cG9uIHJlcXVlc3QuIFBsZWFzZSBtYWlsIG1lIGlmIHlvdSB3YW50IGEgY29weS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJvL2lvY3RsIGIvRG9jdW1lbnRhdGlvbi9pMm8vaW9jdGwKaW5kZXggMWU3N2ZhYy4uMjJjYTUzYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMm8vaW9jdGwKKysrIGIvRG9jdW1lbnRhdGlvbi9pMm8vaW9jdGwKQEAgLTExMCw3ICsxMTAsNyBAQAogICAgICAgRU5PQlVGUyAgICAgQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2guICBJZiB0aGlzIG9jY3VycywgdGhlIHJlcXVpcmVkCiAgICAgICAgICAgICAgICAgICBidWZmZXIgbGVuZ3RoIGlzIHdyaXR0ZW4gaW50byAqKGxjdC0+cmVzbGVuKQogCi1WSS4gU2V0dHRpbmcgUGFyYW1ldGVycworVkkuIFNldHRpbmcgUGFyYW1ldGVycwogCiAgICBTWU5PUFNJUwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQgYi9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQKaW5kZXggM2E0NmUzNi4uNzJiYThkNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dApAQCAtMzAxLDYgKzMwMSw3IEBACiAJCQkJCTxtYWlsdG86cnVzdHlAcnVzdGNvcnAuY29tLmF1PgogMHhBRQlhbGwJbGludXgva3ZtLmgJCUtlcm5lbC1iYXNlZCBWaXJ0dWFsIE1hY2hpbmUKIAkJCQkJPG1haWx0bzprdm1Admdlci5rZXJuZWwub3JnPgorMHhBRgkwMC0xRglsaW51eC9mc2xfaHlwZXJ2aXNvci5oCUZyZWVzY2FsZSBoeXBlcnZpc29yCiAweEIwCWFsbAlSQVRJTyBkZXZpY2VzCQlpbiBkZXZlbG9wbWVudDoKIAkJCQkJPG1haWx0bzp2Z29AcmF0aW8uZGU+CiAweEIxCTAwLTFGCVBQUG9YCQkJPG1haWx0bzptb3N0cm93c0BzdHl4LnV3YXRlcmxvby5jYT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaXNkbi9SRUFETUUuSGlTYXggYi9Eb2N1bWVudGF0aW9uL2lzZG4vUkVBRE1FLkhpU2F4CmluZGV4IDk5ZTg3YTYuLmIxYTU3M2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaXNkbi9SRUFETUUuSGlTYXgKKysrIGIvRG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRS5IaVNheApAQCAtNTA2LDcgKzUwNiw3IEBACiAgICAgIDxJU0ROIHN1YnN5c3RlbSAtIElTRE4gc3VwcG9ydCAtLSBIaVNheD4KICAgICAgbWFrZSBjbGVhbjsgbWFrZSB6SW1hZ2U7IG1ha2UgbW9kdWxlczsgbWFrZSBtb2R1bGVzX2luc3RhbGwKIDIuIEluc3RhbGwgdGhlIG5ldyBrZXJuZWwKLSAgICAgY3AgL3Vzci9zcmMvbGludXgvYXJjaC9pMzg2L2Jvb3QvekltYWdlIC9ldGMva2VybmVsL2xpbnV4LmlzZG4KKyAgICAgY3AgL3Vzci9zcmMvbGludXgvYXJjaC94ODYvYm9vdC96SW1hZ2UgL2V0Yy9rZXJuZWwvbGludXguaXNkbgogICAgICB2aSAvZXRjL2xpbG8uY29uZgogICAgICA8YWRkIG5ldyBrZXJuZWwgaW4gdGhlIGJvb3RhYmxlIGltYWdlIHNlY3Rpb24+CiAgICAgIGxpbG8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vamFfSlAvU3VibWl0Q2hlY2tsaXN0IGIvRG9jdW1lbnRhdGlvbi9qYV9KUC9TdWJtaXRDaGVja2xpc3QKaW5kZXggMmRmNDU3Ni4uY2I1NTA3YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9qYV9KUC9TdWJtaXRDaGVja2xpc3QKKysrIGIvRG9jdW1lbnRhdGlvbi9qYV9KUC9TdWJtaXRDaGVja2xpc3QKQEAgLTY4LDcgKzY4LDcgQEAKIAogMTI6IENPTkZJR19QUkVFTVBULCBDT05GSUdfREVCVUdfUFJFRU1QVCwgQ09ORklHX0RFQlVHX1NMQUIsCiAgICAgQ09ORklHX0RFQlVHX1BBR0VBTExPQywgQ09ORklHX0RFQlVHX01VVEVYRVMsIENPTkZJR19ERUJVR19TUElOTE9DSywKLSAgICBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAg44GT44KM44KJ5YWo44Gm44KS5ZCM5pmC44Gr5pyJ5Yq544Gr44GX44Gm5YuV5L2c56K66KqN44KSCisgICAgQ09ORklHX0RFQlVHX0FUT01JQ19TTEVFUCDjgZPjgozjgonlhajjgabjgpLlkIzmmYLjgavmnInlirnjgavjgZfjgabli5XkvZznorroqo3jgpIKICAgICDooYzjgaPjgabjgY/jgaDjgZXjgYTjgIIKIAogMTM6IENPTkZJR19TTVAsIENPTkZJR19QUkVFTVBUIOOCkuacieWKueOBq+OBl+OBn+WgtOWQiOOBqOeEoeWKueOBq+OBl+OBn+WgtOWQiOOBruS4oeaWueOBpwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9qYV9KUC9TdWJtaXR0aW5nUGF0Y2hlcyBiL0RvY3VtZW50YXRpb24vamFfSlAvU3VibWl0dGluZ1BhdGNoZXMKaW5kZXggZjEwN2M4My4uOTdmNzhkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9qYV9KUC9TdWJtaXR0aW5nUGF0Y2hlcworKysgYi9Eb2N1bWVudGF0aW9uL2phX0pQL1N1Ym1pdHRpbmdQYXRjaGVzCkBAIC0xMSwxNiArMTEsMTggQEAKIGZvcmsuIFNvIGlmIHlvdSBoYXZlIGFueSBjb21tZW50cyBvciB1cGRhdGVzIG9mIHRoaXMgZmlsZSwgcGxlYXNlIHRyeQogdG8gdXBkYXRlIHRoZSBvcmlnaW5hbCBFbmdsaXNoIGZpbGUgZmlyc3QuCiAKLUxhc3QgVXBkYXRlZDogMjAwNy8xMC8yNAorTGFzdCBVcGRhdGVkOiAyMDExLzA2LzA5CisKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIOOBk+OCjOOBr+OAgQotbGludXgtMi42LjIzL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMg44Gu5ZKM6KizCitsaW51eC0yLjYuMzkvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyDjga7lkozoqLMKIOOBp+OBmeOAggog57+76Kiz5Zuj5L2T77yaIEpGIOODl+ODreOCuOOCp+OCr+ODiCA8IGh0dHA6Ly93d3cubGludXgub3IuanAvSkYvID4KLee/u+ios+aXpe+8miAyMDA3LzEwLzE3Civnv7voqLPml6XvvJogMjAxMS8wNi8wOQog57+76Kiz6ICF77yaIEtlaWljaGkgS2lpIDxrLWtlaWljaGkgYXQgYnggZG90IGpwIGRvdCBuZWMgZG90IGNvbT4KIOagoeato+iAhe+8miBNYXNhbmFyaSBLb2JheWFzaGkg44GV44KTIDx6YXAwMzIxNiBhdCBuaWZ0eSBkb3QgbmUgZG90IGpwPgogICAgICAgICAgTWF0c3VrdXJhIOOBleOCkyA8bmJoLS1tYXRzIGF0IG5pZnR5IGRvdCBjb20+CisgICAgICAgICBUYWtlc2hpIEhhbWFzYWtpIOOBleOCkyA8aG1hdHJqcCBhdCB1c2VycyBkb3Qgc291cmNlZm9yZ2UgZG90IGpwPgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAgICAgICAgIExpbnV4IOOCq+ODvOODjeODq+OBq+WkieabtOOCkuWKoOOBiOOCi+OBn+OCgeOBriBIb3d0bwpAQCAtOTcsNyArOTksNyBAQAogaHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvcHJvamVjdHMvcXVpbHQKIAogQW5kcmV3IE1vcnRvbidzIHBhdGNoIHNjcmlwdHM6Ci1odHRwOi8vdXNlcndlYi5rZXJuZWwub3JnL35ha3BtL3N0dWZmL3RwcC50eHQKK2h0dHA6Ly91c2Vyd2ViLmtlcm5lbC5vcmcvfmFrcG0vc3R1ZmYvcGF0Y2gtc2NyaXB0cy50YXIuZ3oKIOOBk+OBruODquODs+OCr+OBruWFiOOBruOCueOCr+ODquODl+ODiOOBruS7o+OCj+OCiuOBqOOBl+OBpuOAgXF1aWx0IOOBjOODkeODg+ODgeODnuODjeOCuOODoeODs+ODiAog44OE44O844Or44Go44GX44Gm5o6o5aWo44GV44KM44Gm44GE44G+44GZKOS4iuOBruODquODs+OCr+OCkuimi+OBpuOBj+OBoOOBleOBhCnjgIIKIApAQCAtMTA5LDkgKzExMSwyNSBAQAog44CM44OJ44Op44Kk44OQ44O8IFgg44Gr5a++44GZ44KL44OQ44Kw44OV44Kj44OD44Kv44K544CN44GC44KL44GE44Gv44CM44GT44Gu44OR44OD44OB44Gv44K144OW44K344K5CiDjg4bjg6AgWCDjgavlr77jgZnjgovmm7TmlrDjgpLlkKvjgpPjgafjgYTjgb7jgZnjgILjganjgYbjgYvlj5bjgorlhaXjgozjgabjgY/jgaDjgZXjgYTjgILjgI3jgarjganjgafjgZnjgIIKIAor44OR44OD44OB44Gu6Kqs5piO44KSIExpbnV4IOOCq+ODvOODjeODq+OBruOCveODvOOCueOCs+ODvOODieODnuODjeOCuOODoeODs+ODiOOCt+OCueODhuODoOOAjCBnaXQg44CN44GuCivjgrPjg5/jg4Pjg4jjg63jgrDjgajjgZfjgabnsKHljZjjgavlvJXnlKjjgafjgY3jgovlvaLjgafmm7jjgZHjgbDjgIHjg6Hjg7Pjg4bjg4rjgYvjgonmhJ/orJ3jgZXjgozjgovjgafjgZfjgofjgYbjgIIKK+S7peS4i+OBriAjMTUg44KS6KaL44Gm44GP44Gg44GV44GE44CCCisKIOiqrOaYjuOBjOmVt+OBj+OBquOCiuOBoOOBl+OBn+OBruOBp+OBguOCjOOBsOOAgeOBiuOBneOCieOBj+OBneOCjOOBr+ODkeODg+ODgeOCkuWIhuOBkeOCi+W/heimgeOBjOOBguOCiwog44Go44GE44GG5YWG5YCZ44Gn44GZ44CC5qyh44GuICMzIOOCkuimi+OBpuOBj+OBoOOBleOBhOOAggogCivjg5Hjg4Pjg4Eo44K344Oq44O844K6KeOCkijlho0p5oqV56i/44GZ44KL5pmC44CB5Y2B5YiG44Gq44OR44OD44OB44Gu6Kqs5piO44Go44Gd44Gu44OR44OD44OB44GM5b+F6KaB44Gq55CG55Sx44KSCivjg5Hjg4Pjg4HjgavlkKvjgoHjgabjgY/jgaDjgZXjgYTjgILjgZ/jgaDjgIzjgZPjgozjga/jg5Hjg4Pjg4Eo44K344Oq44O844K6KeOBruODkOODvOOCuOODp+ODsyBO44CN44Go44Gg44GRCivmm7jjgYvjgarjgYTjgafjgY/jgaDjgZXjgYTjgILjgZ3jgZfjgabjgIHjg5Hjg4Pjg4HjgpLjg57jg7zjgrjjgZnjgovkurrjgavjg5Hjg4Pjg4Hjga7oqqzmmI7jgpLmjqLjgZXjgZvjgZ3jgozjgpIKK+ODkeODg+ODgeOBq+i/veiomOOBleOBm+OCi+OBn+OCgeOAgemBjuWOu+OBruODkOODvOOCuOODp+ODs+OBruODkeODg+ODgeOChOOBneOBruODkeODg+ODgeOBriBVUkwg44KS5Y+C54Wn44GZ44KLCivmiYvplpPjgpLjgYvjgZHjgZXjgZvjgarjgYTjgafjgY/jgaDjgZXjgYTjgIIKK+OBpOOBvuOCiuOAgeODkeODg+ODgeOCt+ODquODvOOCuuOBqOOBneOBruiqrOaYjuOBr+S4gOe3kuOBq+OBguOCi+OBueOBjeOBp+OBmeOAguOBk+OCjOOBr+ODkeODg+ODgeOCkuODnuODvOOCuOOBmeOCiwor5Lq644CB44Os44OT44Ol44O844GZ44KL5Lq644CB44Gp44Gh44KJ44Gu44Gf44KB44Gr44KC44Gq44KK44G+44GZ44CC44Os44OT44Ol44O844GZ44KL5Lq644Gu5Lit44Gr44Gv44CB44GK44Gd44KJ44GPCivpgY7ljrvjga7jg5Djg7zjgrjjg6fjg7Pjga7jg5Hjg4Pjg4HjgpLlj5fjgZHlj5bjgaPjgabjgoLjgYTjgarjgYTkurrjgYzjgYTjgb7jgZnjgIIKKwor55m76Yyy5riI44G/44Gu44OQ44Kw44Ko44Oz44OI44Oq44KS5L+u5q2j44GZ44KL44OR44OD44OB44Gn44GC44KM44Gw44CB44Gd44Gu44OQ44Kw44Ko44Oz44OI44Oq44KS56S644GZ44OQ44KwIElECivjgoQgVVJMIOOCkuaYjuiomOOBl+OBpuOBj+OBoOOBleOBhOOAggorCiAzKSDjg5Hjg4Pjg4Hjga7liIblibIKIAog5oSP5ZGz44Gu44GC44KL44Gy44Go44G+44Go44G+44KK44GU44Go44Gr5aSJ5pu044KS5YCL44CF44Gu44OR44OD44OB44OV44Kh44Kk44Or44Gr5YiG44GR44Gm44GP44Gg44GV44GE44CCCkBAIC0xNDEsNyArMTU5LDcgQEAKIOaLkuWQpuOBleOCjOOCi+OBp+OBl+OCh+OBhuOAggogCiDjgYLjgarjgZ/jga/jg5Hjg4Pjg4HjgpLmipXnqL/jgZnjgovliY3jgavmnIDkvY7pmZDjg5Hjg4Pjg4Hjgrnjgr/jgqTjg6vjg4Hjgqfjg4Pjgqvjg7wKLSggc2NyaXB0cy9wYXRjaGNoZWNrLnBsICnjgpLliKnnlKjjgZfjgabjg5Hjg4Pjg4HjgpLjg4Hjgqfjg4Pjgq/jgZnjgbnjgY3jgafjgZnjgIIKKyggc2NyaXB0cy9jaGVja3BhdGNoLnBsICnjgpLliKnnlKjjgZfjgabjg5Hjg4Pjg4HjgpLjg4Hjgqfjg4Pjgq/jgZnjgbnjgY3jgafjgZnjgIIKIOOCguOBl+ODkeODg+ODgeOBq+mBleWPjeOBjOOBruOBk+OBo+OBpuOBhOOCi+OBquOCieOBsOOAgeOBneOCjOOCieOBruWFqOOBpuOBq+OBpOOBhOOBpuOBguOBquOBn+OBr+ato+W9k+OBqgog55CG55Sx44KS56S644Gb44KL44KI44GG44Gr44GX44Gm44GK44GP5b+F6KaB44GM44GC44KK44G+44GZ44CCCiAKQEAgLTE5MiwxMyArMjEwLDEzIEBACiDmg4XloLHjgYzjg57jg4vjg6XjgqLjg6vjg5rjg7zjgrjjga7kuK3jgavlhaXjgaPjgabjgY/jgovjgojjgYbjgavjgIHlpInmm7TjgYzotbfjgY3jgZ/jgajjgYTjgYYKIOmAmuefpeOCkumAgeOBo+OBpuOBj+OBoOOBleOBhOOAggogCi3jgZ/jgajjgYjjgIHjg6Hjg7Pjg4bjg4rjgYwgIzQg44Gn5Y+N5b+c44GM44Gq44GL44Gj44Gf44Go44GX44Gm44KC44CB44Oh44Oz44OG44OK44Gu44Kz44O844OJ44Gr5aSJ5pu044KSCivjgZ/jgajjgYjjgIHjg6Hjg7Pjg4bjg4rjgYwgIzUg44Gn5Y+N5b+c44GM44Gq44GL44Gj44Gf44Go44GX44Gm44KC44CB44Oh44Oz44OG44OK44Gu44Kz44O844OJ44Gr5aSJ5pu044KSCiDliqDjgYjjgZ/jgajjgY3jgavjga/jgIHjgYTjgaTjgoLjg6Hjg7Pjg4bjg4rjgasgQ0Mg44GZ44KL44Gu44KS5b+Y44KM44Gq44GE44KI44GG44Gr44GX44Gm44GP44Gg44GV44GE44CCCiAKLeWwj+OBleOBquODkeODg+ODgeOBp+OBguOCjOOBsOOAgUFkcmlhbiBCdW5rIOOBjOeuoeeQhuOBl+OBpuOBhOOCiyBUcml2aWFsIFBhdGNoIE1vbmtleQotKOOBoeOCh+OBo+OBqOOBl+OBn+ODkeODg+ODgeOCkumbhuOCgeOBpuOBhOOCiyk8dHJpdmlhbEBrZXJuZWwub3JnPuOBqyBDQyDjgZfjgabjgoLjgYTjgYQKLeOBp+OBmeOAguOBoeOCh+OBo+OBqOOBl+OBn+ODkeODg+ODgeOBqOOBr+S7peS4i+OBruODq+ODvOODq+OBruOBqeOCjOOBizHjgaTjgpLmuoDjgZ/jgZfjgabjgYTjgarjgZEKLeOCjOOBsOOBquOCiuOBvuOBm+OCk+OAggor5bCP44GV44Gq44OR44OD44OB44Gn44GC44KM44Gw44CBVHJpdmlhbCBQYXRjaCBNb25rZXko44Gh44KH44Gj44Go44GX44Gf44OR44OD44OB44KS6ZuG44KB44Gm44GE44KLKQorPHRyaXZpYWxAa2VybmVsLm9yZz7jgasgQ0Mg44GX44Gm44KC44GE44GE44Gn44GZ44CC44Gd44Gu54++566h55CG6ICF44Gr44Gk44GE44Gm44GvIE1BSU5UQUlORVJTCivjg5XjgqHjgqTjg6vjgpLopovjgabjgY/jgaDjgZXjgYTjgILjgaHjgofjgaPjgajjgZfjgZ/jg5Hjg4Pjg4Hjgajjga/ku6XkuIvjga7jg6vjg7zjg6vjga7jganjgozjgYsx44Gk44KS5rqA44Gf44GX44GmCivjgYTjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgIIKICDjg7vjg4njgq3jg6Xjg6Hjg7Pjg4jjga7jgrnjg5rjg6vjg5/jgrnjga7kv67mraMKICDjg7tncmVwKDEpIOOCs+ODnuODs+ODieOBq+OCiOOCi+aknOe0ouOCkuWbsOmbo+OBq+OBl+OBpuOBhOOCi+OCueODmuODq+OBruS/ruatowogIOODu+OCs+ODs+ODkeOCpOODq+aZguOBruitpuWRiuOBruS/ruatoyjnhKHpp4TjgarorablkYrjgYzmlaPkubHjgZnjgovjgZPjgajjga/lpb3jgb7jgZfjgY/jgarjgYTjgZ8KQEAgLTIxMCw3ICsyMjgsNiBAQAogIOODu+enu+akjeaAp+OBruOBquOBhOOCs+ODvOODieOBi+OCieenu+akjeaAp+OBruOBguOCi+OCs+ODvOODieOBuOOBrue9ruOBjeaPm+OBiCjlsI/jgZXjgYTnr4Tlm7LjgacKICAgIOOBguOCjOOBsOOCouODvOOCreODhuOCr+ODgeODo+eJueacieOBruOBk+OBqOOBp+OCguS7luOBruS6uuOBjOOCs+ODlOODvOOBp+OBjeOBvuOBmSkKICDjg7vkvZzogIXjgoTjg6Hjg7Pjg4bjg4rjgavjgojjgovkv67mraMo44GZ44Gq44KP44GhIHBhdGNoIG1vbmtleSDjga7lho3ou6LpgIHjg6Ljg7zjg4kpCi1FTUFJTDogPHRyaXZpYWxAa2VybmVsLm9yZz4KIAogNykgTUlNRSDjgoTjg6rjg7Pjgq/jgoTlnKfnuK7jg5XjgqHjgqTjg6vjgoTmt7vku5jjg5XjgqHjgqTjg6vjgafjga/jgarjgY/jg5fjg6zjgqTjg7Pjg4bjgq3jgrnjg4jjga7jgb8KIApAQCAtMjMzLDI2ICsyNTAsMTUgQEAKIOS+i+Wklu+8muOBiuS9v+OBhOOBrumbu+WtkOODoeODvOODq+OCr+ODqeOCpOOCouODs+ODiOOBjOODkeODg+ODgeOCkuOCgeOBoeOCg+OBj+OBoeOCg+OBq+OBmeOCi+OBruOBpwog44GC44KM44Gw44CB6Kqw44GL44GMIE1JTUUg5b2i5byP44Gu44OR44OD44OB44KS5YaN6YCB44GZ44KL44KI44GG5rGC44KB44KL44GL44KC44GX44KM44G+44Gb44KT44CCCiAKLeitpuWRiu+8miBNb3ppbGxhIOOBruOCiOOBhuOBqueJueWumuOBrumbu+WtkOODoeODvOODq+OCr+ODqeOCpOOCouODs+ODiOOBr+mbu+WtkOODoeODvOODq+OBrgot44OY44OD44OA44Gr5Lul5LiL44Gu44KC44Gu44KS5LuY5Yqg44GX44Gm6YCB44KK44G+44GZ44CCCi0tLS0tIG1lc3NhZ2UgaGVhZGVyIC0tLS0KLUNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaTsgZm9ybWF0PWZsb3dlZAotLS0tLSBtZXNzYWdlIGhlYWRlciAtLS0tCi3llY/poYzjga/jgIHjgIwgZm9ybWF0PWZsb3dlZCDjgI3jgYzku5jjgYTjgZ/pm7vlrZDjg6Hjg7zjg6vjgpLnibnlrprjga7lj5fkv6HlgbTjga7pm7vlrZDjg6Hjg7zjg6sKLeOCr+ODqeOCpOOCouODs+ODiOOBjOOCv+ODluOCkuOCueODmuODvOOCueOBq+e9ruOBjeaPm+OBiOOCi+OBqOOBhOOBhuOCiOOBhuOBquWkieabtOOCkuOBmeOCi+OBk+OBqOOBp+OBmeOAggot44GX44Gf44GM44Gj44Gm6YCB44KJ44KM44Gm44GN44Gf44OR44OD44OB44Gv5aOK44KM44Gm44GE44KL44KI44GG44Gr6KaL44GI44KL44Gn44GX44KH44GG44CCCi0KLeOBk+OCjOOCkuS/ruato+OBmeOCi+OBq+OBr+OAgW1vemlsbGEg44GuIGRlZmF1bHRzL3ByZWYvbWFpbG5ld3MuanMg44OV44Kh44Kk44Or44KSCi3ku6XkuIvjga7jgojjgYbjgavkv67mraPjgZfjgb7jgZnjgIIKLXByZWYoIm1haWxuZXdzLnNlbmRfcGxhaW50ZXh0X2Zsb3dlZCIsIGZhbHNlKTsgLy8gUkZDIDI2NDY9PT09PT09Ci1wcmVmKCJtYWlsbmV3cy5kaXNwbGF5LmRpc2FibGVfZm9ybWF0X2Zsb3dlZF9zdXBwb3J0IiwgdHJ1ZSk7CivkvZnoqIjjgarlpInmm7TjgpLliqDjgYjjgZrjgavjgYLjgarjgZ/jga7jg5Hjg4Pjg4HjgpLpgIHkv6HjgZnjgovjgZ/jgoHjga7pm7vlrZDjg6Hjg7zjg6vjgq/jg6njgqTjgqLjg7Pjg4jjga7oqK3lrpoKK+OBruODkuODs+ODiOOBq+OBpOOBhOOBpuOBryBEb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0IOOCkuWPgueFp+OBl+OBpuOBj+OBoOOBleOBhOOAggogCiA4KSDpm7vlrZDjg6Hjg7zjg6vjga7jgrXjgqTjgroKIAog44OR44OD44OB44KSIExpbnVzIOOBuOmAgeOCi+OBqOOBjeOBr+W4uOOBqyAjNyDjga7miYvpoIbjgavlvpPjgaPjgabjgY/jgaDjgZXjgYTjgIIKIAog5aSn44GN44Gq44OR44OD44OB44Gv44Oh44O844Oq44Oz44Kw44Oq44K544OI44KE44Oh44Oz44OG44OK44Gr44Go44Gj44Gm5LiN6Kaq5YiH44Gn44GZ44CC44OR44OD44OB44GMCi3mnKrlnKfnuK7jgacgNDBLQiDjgpLotoXjgYjjgovjgojjgYbjgafjgYLjgovjgarjgonjgIHjgqTjg7Pjgr/jg7zjg43jg4Pjg4jkuIrjga7jgqLjgq/jgrvjgrnlj6/og73jgaoKK+acquWcp+e4ruOBpyAzMDBLQiDjgpLotoXjgYjjgovjgojjgYbjgafjgYLjgovjgarjgonjgIHjgqTjg7Pjgr/jg7zjg43jg4Pjg4jkuIrjga7jgqLjgq/jgrvjgrnlj6/og73jgaoKIOOCteODvOODkOOBq+S/neWtmOOBl+OAgeS/neWtmOWgtOaJgOOCkuekuuOBmSBVUkwg44KS5Lyd44GI44KL44G744GG44GM6YGp5YiH44Gn44GZ44CCCiAKIDkpIOOCq+ODvOODjeODq+ODkOODvOOCuOODp+ODs+OBruaYjuiomApAQCAtMzI0LDcgKzMzMCw3IEBACiAgICAgICAgIChjKSDmnKzlr4TkuI7jga8oYSnjgIEoYinjgIEoYynjgpLoqLzmmI7jgZnjgovnrKwz6ICF44GL44KJ56eB44G455u05o6l5o+Q5L6b44GV44KM44GfCiAgICAgICAgICAgICDjgoLjga7jgafjgYLjgorjgIHnp4Hjga/jgZ3jgozjgavlpInmm7TjgpLliqDjgYjjgabjgYTjgarjgYTjgIIKIAotCShkKSDnp4Hjga/jgZPjga7jg5fjg63jgrjjgqfjgq/jg4jjgajmnKzlr4TkuI7jgYzlhazjga7jgoLjga7jgafjgYLjgovjgZPjgajjgavnkIbop6Plj4rjgbPlkIzmhI/jgZkKKyAgICAgICAgKGQpIOengeOBr+OBk+OBruODl+ODreOCuOOCp+OCr+ODiOOBqOacrOWvhOS4juOBjOWFrOOBruOCguOBruOBp+OBguOCi+OBk+OBqOOBq+eQhuino+WPiuOBs+WQjOaEj+OBmQogICAgICAgICAgICAg44KL44CC5ZCM5pmC44Gr44CB6Zai5LiO44GX44Gf6KiY6YyyKOaKleeov+OBrumam+OBruWFqOOBpuOBruWAi+S6uuaDheWgseOBqCBzaWduLW9mZiDjgpIKICAgICAgICAgICAgIOWQq+OCgCnjgYznhKHmnJ/pmZDjgavkv53lhajjgZXjgozjgovjgZPjgajjgajjgIHlvZPoqbLjg5fjg63jgrjjgqfjgq/jg4jlj4jjga/plqLpgKPjgZnjgosKICAgICAgICAgICAgIOOCquODvOODl+ODs+OCveODvOOCueODqeOCpOOCu+ODs+OCueOBq+ayv+OBo+OBn+W9ouOBp+WGjemFjeW4g+OBleOCjOOCi+OBk+OBqOOBq+eQhuino+WPiuOBswpAQCAtMzQwLDcgKzM0Niw1MSBAQAog54Sh6KaW44GV44KM44G+44GZ44GM44CB44GC44Gq44Gf44Gv44Gd44Gu44K/44Kw44KS56S+5YaF44Gu5omL57aa44GN44Gr5Yip55So44GX44Gf44KK44CBc2lnbi1vZmYg44Gr54m55YilCiDjgarmg4XloLHjgpLnpLrjgZfjgZ/jgorjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKIAotMTMpIOOBhOOBpCBBY2tlZC1ieTog44KS5L2/44GG44Gu44GLCivjgYLjgarjgZ/jgYzjgrXjg5bjgrfjgrnjg4bjg6Djgb7jgZ/jga/jg5bjg6njg7Pjg4Hjga7jg6Hjg7Pjg4bjg4rjgafjgYLjgozjgbDjgIHlj5fjgZHlj5bjgaPjgZ/jg5Hjg4Pjg4HjgpLoh6rouqvjga4KK+ODhOODquODvOOBq+ODnuODvOOCuOOBmeOCi+OBn+OCgeOBq+OAgeOCj+OBmuOBi+OBq+WkieabtOOBjOW/heimgeOBqOOBquOCi+WgtOWQiOOBjOOBguOCiuOBvuOBmeOAguOBquOBnOOBquOCiQor44GC44Gq44Gf44Gu44OE44Oq44O844Gu5Lit44Gu44Kz44O844OJ44Go5oqV56i/6ICF44Gu44OE44Oq44O844Gu5Lit44Gu44Kz44O844OJ44Gv5ZCM5LiA44Gn44Gv44Gq44GE44Gf44KB44Gn44GZ44CCCivjgoLjgZfjgIHjgYLjgarjgZ/jgYzljrPlr4bjgavkuIroqJjjg6vjg7zjg6soYynjgavjgZPjgaDjgo/jgovjga7jgafjgYLjgozjgbDjgIHmipXnqL/ogIXjgavlho3luqblt67liIbjgpIKK+OBqOOCi+OCiOOBhuS+nemgvOOBmeOBueOBjeOBp+OBmeOAguOBl+OBi+OBl+OAgeOBk+OCjOOBr+aZgumWk+OBqOOCqOODjeODq+OCruODvOOCkumdnueUn+eUo+eahOOBq+a1quiyu+OBmeOCiwor44GT44Go44Gr44Gq44KK44G+44GZ44CC44Or44O844OrKGIp44Gv44GC44Gq44Gf44Gr44Kz44O844OJ44KS5L+u5q2j44GZ44KL5qip5Yip44KS5LiO44GI44Gm44GP44KM44G+44GZ44CCCivjgZfjgYvjgZfjgIHmipXnqL/ogIXjga7jgrPjg7zjg4njgpLkv67mraPjgZfjgIHjgZ3jga7kv67mraPjgavjgojjgovjg5DjgrDjgpLmipXnqL/ogIXjgavmirzjgZfku5jjgZHjgabjgZfjgb7jgYYKK+OBk+OBqOOBr+OBqOOBpuOCguWkseekvOOBquOBk+OBqOOBp+OBmeOAguOBk+OBruWVj+mhjOOCkuino+axuuOBmeOCi+OBn+OCgeOBq+OAgeacq+WwvuOBruaKleeov+iAheOBrgorU2lnbmVkLW9mZi1ieSDjgajjgYLjgarjgZ/jgYzjgZ3jga7mnKvlsL7jgavov73liqDjgZnjgosgU2lnbmVkLW9mZi1ieSDjga7plpPjgavjgIHkv67mraPjgpIKK+WKoOOBiOOBn+OBk+OBqOOCkuekuuOBmTHooYzjgpLov73liqDjgZnjgovjgZPjgajjgYzmjqjlpajjgZXjgozjgabjgYTjgb7jgZnjgIIKKyjjgZ3jga4x6KGM44Gu5pu444GN5pa544GrKeaxuuOBvuOCiuOBr+OBguOCiuOBvuOBm+OCk+OBjOOAgeWkp+aLrOW8p+OBruS4reOBq+mbu+WtkOODoeODvOODq+OCouODieODrOOCueOChOawj+WQjQor44Go5L+u5q2j5YaF5a6544KS6KiY6LyJ44GZ44KL44KE44KK5pa544Gv55uu44Gr44Gk44GN44KE44GZ44GP44CB5pyA57WC5q616ZqO44Gn44Gu5aSJ5pu044Gu6LKs5Lu744GM44GC44Gq44Gf44GrCivjgYLjgovjgZPjgajjgpLmmI7norrjgavjgZnjgovjga7jgavljYHliIbjgarmlrnms5Xjga7jgojjgYbjgafjgZnjgILkvovjgYjjgbDjgIEKKworCVNpZ25lZC1vZmYtYnk6IFJhbmRvbSBKIERldmVsb3BlciA8cmFuZG9tQGRldmVsb3Blci5leGFtcGxlLm9yZz4KKwlbbHVja3lAbWFpbnRhaW5lci5leGFtcGxlLm9yZzogc3RydWN0IGZvbyBtb3ZlZCBmcm9tIGZvby5jIHRvIGZvby5oXQorCVNpZ25lZC1vZmYtYnk6IEx1Y2t5IEsgTWFpbnRhaW5lciA8bHVja3lAbWFpbnRhaW5lci5leGFtcGxlLm9yZz4KKwor44GC44Gq44Gf44GM5a6J5a6a54mI44Gu44OW44Op44Oz44OB44KS566h55CG44GX44Gm44GK44KK44CB5L2c5oiQ6ICF44Gu44Kv44Os44K444OD44OI44CB5aSJ5pu044Gu6L+96Leh44CBCivkv67mraPjga7jg57jg7zjgrjjgIHjgajlkIzmmYLjgavoi6bmg4XjgYvjgonjga7mipXnqL/ogIXjga7kv53orbfjgpLooYzjgYTjgZ/jgYTloLTlkIjjgIHjgZPjga7mhaPnv5Ljga/nibnjgasKK+acieeUqOOBqOOBquOCiuOBvuOBmeOAguOBhOOBi+OBquOCi+S6i+aDheOBjOOBguOBo+OBpuOCguODgeOCp+ODs+OCuOODreOCsOOBq+WHuuOBpuOBj+OCi+S9nOaIkOiAheOBrgor44Ki44Kk44OH44Oz44OG44Kj44OG44Kj5oOF5aCxKEZyb20g44OY44OD44OAKeOBr+WkieabtOOBp+OBjeOBquOBhOOBk+OBqOOBq+azqOaEj+OBl+OBpuOBj+OBoOOBleOBhOOAggorCivjg5Djg4Pjgq/jg53jg7zjg4jjgZnjgovkurrjga7jgZ/jgoHjga7nibnliKXjgarms6jmhI/kuovpoIXjgILov73ot6HjgpLlrrnmmJPjgavooYzjgYbjgZ/jgoHjgavjgIHjgrPjg5/jg4Pjg4gKK+ODoeODg+OCu+ODvOOCuOOBruODiOODg+ODlyjjgrXjg5bjgrjjgqfjgq/jg4jooYzjga7jgZnjgZDlvowp44Gr44OR44OD44OB44Gu6LW35rqQ44KS56S644GZ5oOF5aCx44KS6KiY6L+w44GZ44KLCivjgZPjgajjga/kuIDoiKznmoTjgafmnInnlKjjgarmhaPnv5LjgafjgZnjgILkvovjgYjjgbDjgIHjgZPjgozjga8gMi42LXN0YWJsZSDjg4Tjg6rjg7zjgafjga7kuIDkvovjgafjgZnjgIIgICAgCisKKyAgICBEYXRlOiAgIFR1ZSBNYXkgMTMgMTk6MTA6MzAgMjAwOCArMDAwMAorCisgICAgICAgIFNDU0k6IGxpYmlzY3NpIHJlZ3Jlc3Npb24gaW4gMi42LjI1OiBmaXggbm9wIHRpbWVyIGhhbmRsaW5nCisKKyAgICAgICAgY29tbWl0IDRjZjEwNDM1OTNkYjZhMzM3ZjEwZTAwNmMyM2M2OWU1ZmM5M2U3MjIgdXBzdHJlYW0KKwor44Gd44GX44Gm44CB44GT44KM44GvIDIuNCDjg4Tjg6rjg7zjgafjga7kuIDkvovjgafjgZnjgIIKKworICAgIERhdGU6ICAgVHVlIE1heSAxMyAyMjoxMjoyNyAyMDA4ICswMjAwCisKKyAgICAgICAgd2lyZWxlc3MsIGFpcm86IHdhaXRidXN5KCkgd29uJ3QgZGVsYXkKKworICAgICAgICBbYmFja3BvcnQgb2YgMi42IGNvbW1pdCBiN2FjYmRmYmQxZjI3N2MxZWIyM2YzNDRmODk5Y2ZhNGNkMGJmMzZhXQorCivjganjgpPjgarlvaLlvI/jgafjgYLjgozjgIHjgZPjga7mg4XloLHjga/jgYLjgarjgZ/jga7jg4Tjg6rjg7zjgpLov73ot6HjgZnjgovkurrjgoTjgYLjgarjgZ/jga7jg4Tjg6rjg7zjga7jg5DjgrDjgpIKK+ino+axuuOBl+OCiOOBhuOBqOOBl+OBpuOBhOOCi+S6uuOBq+OBqOOBo+OBpuS+oeWApOOBruOBguOCi+aUr+aPtOOBqOOBquOCiuOBvuOBmeOAggorCisxMykg44GE44GkIEFja2VkLWJ5OiDjgaggQ2M6IOOCkuS9v+OBhuOBruOBiwogCiDjgIwgU2lnbmVkLW9mZi1ieTog44CN44K/44Kw44Gv44Gd44Gu572y5ZCN6ICF44GM44OR44OD44OB44Gu6ZaL55m644Gr6Zai44KP44Gj44Gm44GE44Gf44GT44Go44KE44OR44OD44OBCiDjga7kvJ3mkq3jg5HjgrnjgavjgYTjgZ/jgZPjgajjgpLnpLrjgZfjgabjgYTjgb7jgZnjgIIKQEAgLTM1NCw3ICs0MDQsNyBAQAogCiBBY2tlZC1ieTog44GvIFNpZ25lZC1vZmYtYnk6IOOBruOCiOOBhuOBq+WFrOW8j+OBquOCv+OCsOOBp+OBr+OBguOCiuOBvuOBm+OCk+OAguOBneOCjOOBr+ODoeODs+ODhuODiuOBjAog5bCR44Gq44GP44Go44KC44OR44OD44OB44KS44Os44OT44Ol44O844GX44CB5ZCM5oSP44KS56S644GX44Gm44GE44KL44Go44GE44GG6KiY6Yyy44Gn44GZ44CC44Gd44Gu44KI44GG44GqCi3jgZPjgajjgYvjgonjg5Hjg4Pjg4Hjga7ntbHlkIjogIXjgYzjg6Hjg7Pjg4bjg4rjga7jgIzjgYbjgpPjgIHoia/jgYTjgajmgJ3jgYbjgojjgI3jgajjgYTjgYbnmbroqIDjgpIKK+OBk+OBqOOBi+OCieODkeODg+ODgeOCkuODnuODvOOCuOOBmeOCi+S6uuOBjOODoeODs+ODhuODiuOBruOAjOOBhuOCk+OAgeiJr+OBhOOBqOaAneOBhuOCiOOAjeOBqOOBhOOBhueZuuiogOOCkgogQWNrZWQtYnk6IOOBuOe9ruOBjeaPm+OBiOOCi+OBk+OBqOOBjOOBguOCiuOBvuOBmeOAggogCiBBY2tlZC1ieTog44GM5b+F44Ga44GX44KC44OR44OD44OB5YWo5L2T44Gu5om/6KqN44KS56S644GX44Gm44GE44KL44KP44GR44Gn44Gv44GC44KK44G+44Gb44KT44CC5L6L44GI44Gw44CBCkBAIC0zNjQsNyArNDE0LDYyIEBACiDjgZPjga7ngrnjga/jgIHjgZToh6rliIbjgafliKTmlq3jgZfjgabjgY/jgaDjgZXjgYTjgIIo44Gd44GuIEFja2VkLWJ5OiDjgYwp55aR44KP44GX44GE5aC05ZCI44Gv44CBCiDjg6Hjg7zjg6rjg7PjgrDjg6rjgrnjg4jjgqLjg7zjgqvjgqTjg5bjga7kuK3jga7lpKflhYPjga7orbDoq5bjgpLlj4LnhafjgZnjgbnjgY3jgafjgZnjgIIKIAotMTQpIOaomea6lueahOOBquODkeODg+ODgeOBruODleOCqeODvOODnuODg+ODiAor44OR44OD44OB44Gr44Kz44Oh44Oz44OI44GZ44KL5qmf5Lya44KS5oyB44Gj44Gm44GE44Gf44GM44CB44Gd44Gu5pmC44Gr44Kz44Oh44Oz44OI44GX44Gq44GL44Gj44Gf5Lq644GM44GE44KM44Gw44CBCivjgZ3jga7kurrjgpLmjIfjgZnjgIxDYzrjgI3jgr/jgrDjgpLku7vmhI/jgafov73liqDjgZfjgabjgoLjgYvjgb7jgYTjgb7jgZvjgpPjgILjgZPjgozjga/mjIflrprjgZXjgozjgZ/kurrjgYvjgonjga4KK+aYjueiuuOBquOCouOCr+OCt+ODp+ODs+OBquOBl+OBq+S7mOS4juOBp+OBjeOCi+WUr+S4gOOBruOCv+OCsOOBp+OBmeOAggor44GT44Gu44K/44Kw44Gv44OR44OD44OB44Gr6Zai5b+D44GM44GC44KL44Go5oCd44KP44KM44KL5Lq66YGU44GM44Gd44Gu44OR44OD44OB44Gu6K2w6KuW44Gr5ZCr44G+44KM44Gm44GE44Gf44GT44GoCivjgpLmmI7mlofljJbjgZfjgb7jgZnjgIIKKworMTQpIFJlcG9ydGVkLWJ5IOOBqCBUZXN0ZWQtYnk6IOOBqCBSZXZpZXdlZC1ieTog44Gu5Yip55SoCisKK+S7luOBruiqsOOBi+OBq+OCiOOBo+OBpuWgseWRiuOBleOCjOOBn+WVj+mhjOOCkuS/ruato+OBmeOCi+ODkeODg+ODgeOBp+OBguOCjOOBsOOAgeWVj+mhjOWgseWRiuiAheOBqOOBhOOBhuWvhOS4juOCkgor44Kv44Os44K444OD44OI44GZ44KL44Gf44KB44Gr44CBUmVwb3J0ZWQtYnk6IOOCv+OCsOOCkui/veWKoOOBmeOCi+OBk+OBqOOCkuaknOiojuOBl+OBpuOBj+OBoOOBleOBhOOAggor44GT44G+44KB44Gr44OQ44Kw5aCx5ZGK6ICF44KS44Kv44Os44K444OD44OI44GX44Gm44GE44GP44GT44Go44Gn44CB44GG44G+44GP44GE44GR44Gw44Gd44Gu5Lq644Gf44Gh44GM5bCG5p2l5YaN44GzCivjgrPjg5/jg6Xjg4vjg4bjgqPjga7lipvjgajjgarjgaPjgabjgY/jgozjgovjgafjgZfjgofjgYbjgIIKK+OBn+OBoOOBl+OAgeWgseWRiuiAheOBruioseWPr+eEoeOBj+OBk+OBruOCv+OCsOOCkui/veWKoOOBl+OBquOBhOOCiOOBhuOBq+azqOaEj+OBl+OBpuOBj+OBoOOBleOBhOOAgueJueOBq+OAgQor5ZWP6aGM44GM5YWs44Gu5aC044Gn5aCx5ZGK44GV44KM44Gm44GE44Gq44GL44Gj44Gf44Gu44Gn44GC44KM44Gw44CCCisKK1Rlc3RlZC1ieTog44K/44Kw44Gv44K/44Kw44Gn5oyH5a6a44GV44KM44Gf5Lq644Gr44KI44Gj44GmKOOBguOCi+eSsOWig+S4i+OBpynjg5Hjg4Pjg4Hjga7jg4bjgrnjg4jjgavmiJDlip8KK+OBl+OBpuOBhOOCi+OBk+OBqOOCkuekuuOBl+OBvuOBmeOAguOBk+OBruOCv+OCsOOBr+ODoeODs+ODhuODiuOBq+ODhuOCueODiOOBjOWun+aWvea4iOOBv+OBp+OBguOCi+OBk+OBqOOCkgor55+l44KJ44Gb44CB5bCG5p2l44Gu6Zai6YCj44OR44OD44OB44Gu44OG44K544OI5Y2U5Yqb6ICF44KS6KaL44Gk44GR44KL5pa55rOV44KS5o+Q5L6b44GX44CB44OG44K544OI5a6f5pa96ICF44GrCivlr77jgZnjgovjgq/jg6zjgrjjg4Pjg4jjgpLkv53oqLzjgZfjgb7jgZnjgIIKKworUmV2aWV3ZWQtYnk6IOOCv+OCsOOBr+OAgeOBneOCjOOBqOOBr+eVsOOBquOCiuOAgeS4i+iomOOBruODrOODk+ODpeODvOOCouWuo+iogOOBruS4i+OBq+ODrOODk+ODpeODvOOBleOCjOOAgQor5Y+X44GR5YWl44KM5Y+v6IO944Go44G/44Gq44GV44KM44Gf44OR44OD44OB44Gn44GC44KL44GT44Go44KS56S644GX44G+44GZ44CCCisKKyAgICAgICAg44Os44OT44Ol44O844Ki44Gr44KI44KL55uj552j5a6j6KiACisKKyAgICAgICAg56eB44GvIFJldmlld2VkLWJ5OiDjgr/jgrDjgpLmj5DnpLrjgZnjgovjgZPjgajjgavjgojjgaPjgabjgIHku6XkuIvjga7jgZPjgajjgpLmmI7oqIDjgZnjgovjgIIKKworICAgICAgICAoYSkg56eB44Gv44Oh44Kk44Oz44Op44Kk44Oz44Kr44O844ON44Or44G444Gu57Wx5ZCI44Gr5ZCR44GR44CB44Gd44Gu5aal5b2T5oCn5Y+K44Gz44CM5Y2z5b+c5oCnCisgICAgICAgICAgICAo6Kiz5rOoKeOAjeOCkuaknOiovOOBl+OAgeaKgOihk+eahOWBtOmdouOBi+OCieODkeODg+ODgeOCkuODrOODk+ODpeODvOa4iOOBv+OBp+OBguOCi+OAggorCisgICAgICAgIOios+azqDoKKyAgICAgICAg44CM5Y2z5b+c5oCn44CN44Gu5Y6f5paH44GvICJyZWFkaW5lc3Mi44CCCisgICAgICAgIOODkeODg+ODgeOBjOWNgeWIhuOBquWTgeizquOCkuaMgeOBo+OBpuOBiuOCiuOAgeODoeOCpOODs+ODqeOCpOODs+OCq+ODvOODjeODq+OBuOOBrue1seWQiOOCkuWNs+W6p+OBqworICAgICAgICDooYzjgYbjgZPjgajjgYzjgafjgY3jgovnirbmhYvjgafjgYLjgovjgYvjganjgYbjgYvjgpIgInJlYWRpbmVzcyIg44Go44GE44GG5Y2Y6Kqe44Gn6KGo54++CisgICAgICAgIOOBl+OBpuOBhOOCi+OAggorCisgICAgICAgIChiKSDjg5Hjg4Pjg4HjgavplqLjgZnjgovjgYLjgonjgobjgovllY/poYzjgIHmh7jlv7XjgIHjgYLjgovjgYTjga/jgIHnlpHllY/jga/mipXnqL/ogIXjgbjkvJ3pgZTmuIjjgb8KKyAgICAgICAgICAgIOOBp+OBguOCi+OAguengeOBr+OBneOCjOOCieOBruOCs+ODoeODs+ODiOOBq+WvvuOBmeOCi+aKleeov+iAheOBrui/lOetlOOBq+a6gOi2s+OBl+OBpuOBhOOCi+OAggorCisgICAgICAgIChjKSDmipXnqL/jgavkvLTjgYTmlLnoia/jgZXjgozjgovjgrPjg7zjg4njgYzjgYLjgovkuIDmlrnjgafjgIHnj77mmYLngrnjgafjgIHnp4Hjga8oMSnjgZ3jgozjgYwKKyAgICAgICAgICAgIOOCq+ODvOODjeODq+OBq+OBqOOBo+OBpuS+oeWApOOBruOBguOCi+WkieabtOOBp+OBguOCi+OBk+OBqOOAgeOBneOBl+OBpuOAgSgyKee1seWQiOOBq+mam+OBl+OBpgorICAgICAgICAgICAg6K2w6KuW44Gr44Gq44KK5b6X44KL44KI44GG44Gq5ZWP6aGM44Gv44Gq44GE44KC44Gu44Go56K65L+h44GX44Gm44GE44KL44CCCisKKyAgICAgICAgKGQpIOengeOBr+ODkeODg+ODgeOCkuODrOODk+ODpeODvOOBl+mBqeWIh+OBp+OBguOCi+OBqOeiuuS/oeOBl+OBpuOBhOOCi+S4gOaWueOBp+OAgeOBguOCieOChuOCiworICAgICAgICAgICAg54q25rOB44Gr44GK44GE44Gm44Gd44Gu5a6j6KiA44GX44Gf55uu55qE44KE5qmf6IO944GM5q2j44GX44GP5a6f54++44GZ44KL44GT44Go44Gr6Zai44GX44Gm44CBCisgICAgICAgICAgICDjgYTjgYvjgarjgovkv53oqLzjgoLjgZfjgarjgYQo54m544Gr44Gp44GT44GL44Gn5piO56S644GX44Gq44GE6ZmQ44KKKeOAggorCitSZXZpZXdkLWJ5IOOCv+OCsOOBr+OBneOBruODkeODg+ODgeOBjOOCq+ODvOODjeODq+OBq+WvvuOBl+OBpumBqeWIh+OBquS/ruato+OBp+OBguOBo+OBpuOAgea3seWIu+OBquaKgOihk+eahAor5ZWP6aGM44KS5q6L44GX44Gm44GE44Gq44GE44Go44GE44GG5oSP6KaL44Gu5a6j6KiA44Gn44GZ44CC6IiI5ZGz44Gu44GC44KL44Os44OT44Ol44O844Ki44Gv6Kqw44Gn44KCKOODrOODk+ODpeODvAor5L2c5qWt44KS57WC44GI44Gf44KJKeODkeODg+ODgeOBq+WvvuOBl+OBpiBSZXZpZXdlZC1ieSDjgr/jgrDjgpLmj5DnpLrjgafjgY3jgb7jgZnjgILjgZPjga7jgr/jgrDjga8KK+ODrOODk+ODpeODvOOCouOBruWvhOS4juOCkuOCr+ODrOOCuOODg+ODiOOBmeOCi+WDjeOBjeOAgeODrOODk+ODpeODvOOBrumAsuaNl+OBruW6puWQiOOBhOOCkuODoeODs+ODhuODiuOBqwor55+l44KJ44Gb44KL5YON44GN44KS5oyB44Gh44G+44GZ44CC44Gd44Gu44OR44OD44OB44Gu6aCY5Z+f44Gr6Kmz44GX44GP44CB44Gd44GX44Gm44CB44GX44Gj44GL44KK44Go44GX44GfCivjg6zjg5Pjg6Xjg7zjgpLlrp/mlr3jgZfjgZ/jg6zjg5Pjg6Xjg7zjgqLjgavjgojjgaPjgabmj5DkvpvjgZXjgozjgovmmYLjgIFSZXZpZXdlZC1ieTog44K/44Kw44GM44GC44Gq44Gf44GuCivjg5Hjg4Pjg4HjgpLjgqvjg7zjg43jg6vjgavjg57jg7zjgrjjgZnjgovlj6/og73mgKfjgpLpq5jjgoHjgovjgafjgZfjgofjgYbjgIIKKworMTUpIOaomea6lueahOOBquODkeODg+ODgeOBruODleOCqeODvOODnuODg+ODiAogCiDmqJnmupbnmoTjgarjg5Hjg4Pjg4Hjga7jgrXjg5bjgrjjgqfjgq/jg4jjga/ku6XkuIvjga7jgajjgYrjgorjgafjgZnjgIIKIApAQCAtMzk2LDE4ICs1MDEsMzcgQEAKIOmbu+WtkOODoeODvOODq+OBruOCteODluOCuOOCp+OCr+ODiOWGheOBruOCteODluOCt+OCueODhuODoOihqOiomOOBr+OAgeODkeODg+ODgeOBjOmBqeeUqOOBleOCjOOCiwog5YiG6YeO44G+44Gf44Gv44K144OW44K344K544OG44Og44KS6K2Y5Yil44Gn44GN44KL44KI44GG44Gr44GZ44G544GN44Gn44GZ44CCCiAKLembu+WtkOODoeODvOODq+OBruOCteODluOCuOOCp+OCr+ODiOOBruOAjOamguimgeOBruiogOOBhOWbnuOBl+OAjeOBr+OBneOBruODkeODg+ODgeOBruamguimgeOCkuato+eiugot44Gr6KGo54++44GX44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KT44CC44CM5qaC6KaB44Gu6KiA44GE5Zue44GX44CN44KS44OV44Kh44Kk44Or5ZCN44Gr44GX44Gm44Gv44GECi3jgZHjgb7jgZvjgpPjgILkuIDpgKPjga7jg5Hjg4Pjg4HkuK3jgafjgZ3jgozjgZ7jgozjga7jg5Hjg4Pjg4Hjga/lkIzjgZjjgIzmpoLopoHjga7oqIDjgYTlm57jgZfjgI3jgpIKLeS9v+OBo+OBpuOBr+OBhOOBkeOBvuOBm+OCkyjjgIzkuIDpgKPjga7jg5Hjg4Pjg4HjgI3jgajjga/poIbluo/ku5jjgZHjgonjgozjgZ/plqLpgKPjga7jgYLjgovopIfmlbDjga4KK+mbu+WtkOODoeODvOODq+OBruOCteODluOCuOOCp+OCr+ODiOOBruOAjHN1bW1hcnkgcGhyYXNl44CN44Gv44Gd44Gu44OR44OD44OB44Gu5qaC6KaB44KS5q2j56K6Civjgavooajnj77jgZfjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgILjgIxzdW1tYXJ5IHBocmFzZeOAjeOCkuODleOCoeOCpOODq+WQjeOBq+OBl+OBpuOBr+OBhAor44GR44G+44Gb44KT44CC44OR44OD44OB44K344Oq44O844K65Lit44Gn44Gd44KM44Ge44KM44Gu44OR44OD44OB44Gv5ZCM44GY44CMc3VtbWFyeSBwaHJhc2XjgI3jgpIKK+S9v+OBo+OBpuOBr+OBhOOBkeOBvuOBm+OCkyjjgIzjg5Hjg4Pjg4Hjgrfjg6rjg7zjgrrjgI3jgajjga/poIbluo/ku5jjgZHjgonjgozjgZ/plqLpgKPjga7jgYLjgovopIfmlbDjga4KIOODkeODg+ODgee+pOOBp+OBmSnjgIIKIAot44GC44Gq44Gf44Gu6Zu75a2Q44Oh44O844Or44Gu44CM5qaC6KaB44Gu6KiA44GE5Zue44GX44CN44GM44Gd44Gu44OR44OD44OB44Gr44Go44Gj44Gm5LiW55WM44Gn5ZSvCi3kuIDjga7orZjliKXlrZDjgavjgarjgovjgojjgYbjgavlv4PjgYzjgZHjgabjgY/jgaDjgZXjgYTjgILjgIzmpoLopoHjga7oqIDjgYTlm57jgZfjgI3jga8gZ2l0IOOBrgot44OB44Kn44Oz44K444Ot44Kw44Gu5Lit44G444Ga44Gj44Go5Lyd5pKt44GX44Gm44GE44GN44G+44GZ44CC44CM5qaC6KaB44Gu6KiA44GE5Zue44GX44CN44Gv44CB6ZaLCi3nmbrogIXjgYzlvozjgafjg5Hjg4Pjg4HjgpLlj4LnhafjgZnjgovjgZ/jgoHjgavorbDoq5bjga7kuK3jgafliKnnlKjjgZnjgovjgYvjgoLjgZfjgozjgb7jgZvjgpPjgIIKLeS6uuOAheOBr+OBneOBruODkeODg+ODgeOBq+mWoumAo+OBl+OBn+itsOirluOCkuiqreOCgOOBn+OCgeOBq+OAjOamguimgeOBruiogOOBhOWbnuOBl+OAjeOCkuS9v+OBo+OBpgotZ29vZ2xlIOOBp+aknOe0ouOBl+OBn+OBjOOCi+OBp+OBl+OCh+OBhuOAggor44GC44Gq44Gf44Gu6Zu75a2Q44Oh44O844Or44Gu44CMc3VtbWFyeSBwaHJhc2XjgI3jgYzjgZ3jga7jg5Hjg4Pjg4HjgavjgajjgaPjgabkuJbnlYzjgafllK/kuIDjga7orZjliKXlrZDjgasKK+OBquOCi+OCiOOBhuOBq+W/g+OBjOOBkeOBpuOBj+OBoOOBleOBhOOAguOAjHN1bW1hcnkgcGhyYXNl44CN44GvIGdpdCDjga7jg4Hjgqfjg7Pjgrjjg63jgrDjga7kuK3jgbgKK+OBmuOBo+OBqOS8neaSreOBl+OBpuOBhOOBjeOBvuOBmeOAguOAjHN1bW1hcnkgcGhyYXNl44CN44Gv44CB6ZaL55m66ICF44GM5b6M44Gn44OR44OD44OB44KS5Y+C54Wn44GZ44KLCivjgZ/jgoHjgavorbDoq5bjga7kuK3jgafliKnnlKjjgZnjgovjgYvjgoLjgZfjgozjgb7jgZvjgpPjgIIKK+S6uuOAheOBr+OBneOBruODkeODg+ODgeOBq+mWoumAo+OBl+OBn+itsOirluOCkuiqreOCgOOBn+OCgeOBq+OAjHN1bW1hcnkgcGhyYXNl44CN44KS5L2/44Gj44GmIGdvb2dsZSDjgacKK+aknOe0ouOBl+OBn+OBjOOCi+OBp+OBl+OCh+OBhuOAguOBneOCjOOBr+OBvuOBnzLjgIEz44O25pyI44GC44Go44Gn44CB5Lq644CF44GM44CMZ2l0a+OAjeOChAor44CMZ2l0IGxvZyAtLW9uZWxpbmXjgI3jga7jgojjgYbjgarjg4Tjg7zjg6vjgpLkvb/nlKjjgZfjgabkvZXljYPjgoLjga7jg5Hjg4Pjg4Hjgavnm67jgpLpgJrjgZnmmYLjgIEKK+WUr+S4gOebruOBq+OBqOOBvuOCi+aDheWgseOBqOOBquOCi+OBp+OBl+OCh+OBhuOAggorCivjgZPjgozjgonjga7nkIbnlLHjga7jgZ/jgoHjgIHjgIxzdW1tYXJ5IHBocmFzZeOAjeOBr+OBquOBnOODkeODg+ODgeOBjOW/heimgeOBp+OBguOCi+OBi+OAgeODkeODg+ODgeOBjOS9leOCkgor5aSJ5pu044GZ44KL44GL44GuMuOBpOOBruaDheWgseOCkuOBm+OBhOOBnOOBhDcw44CcNzXmloflrZfjgafooajnj77jgZfjgabjgYTjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgIIKK+OAjHN1bW1hcnkgcGhyYXNl44CN44Gv57Ch5r2U44Gn44GC44KK6Kqs5piO55qE44Gn44GC44KL6KGo54++44KS55uu5oyH44GX44Gk44Gk44CB44GG44G+44GPCivjgb7jgajjgoHjgonjgozjgabjgYTjgovmpoLopoHjgajjgarjgovjgbnjgY3jgafjgZnjgIIKKwor44CMc3VtbWFyeSBwaHJhc2XjgI3jga/jgIxTdWJqZWN0OiBbUEFUQ0ggdGFnXSA8c3VtbWFyeSBwaHJhc2U+44CN44Gu44KI44GG44Gr44CBCivlpKfmi6zlvKfjgafplonjgZjjgonjgozjgZ/jgr/jgrDjgpLmjqXpoK3ovp7jgajjgZfjgabku5jliqDjgZfjgabjgoLjgYvjgb7jgYTjgb7jgZvjgpPjgILjgZPjga7jgr/jgrDjga8KK+OAjHN1bW1hcnkgcGhyYXNl44CN44Gu5LiA6YOo44Go44Gv6ICD44GI44G+44Gb44KT44GM44CB44OR44OD44OB44KS44Gp44Gu44KI44GG44Gr5Y+W44KK5omx44GG44G544GN44GL44KSCivooajnj77jgZfjgb7jgZnjgIIKK+S4gOiIrOeahOOBq+OBr+OAjHYxLCB2MiwgdjPjgI3jga7jgojjgYbjgarjg5Djg7zjgrjjg6fjg7Pmg4XloLHjgpLooajjgZnjgr/jgrAo6YGO5Y6744Gu44OR44OD44OB44Gr5a++44GZ44KLCivjgrPjg6Hjg7Pjg4jjgpLlj43mmKDjgZnjgovjgZ/jgoHjgavopIfmlbDjga7jg5Djg7zjgrjjg6fjg7Pjga7jg5Hjg4Pjg4HjgYzmipXnqL/jgZXjgozjgabjgYTjgovjga7jgafjgYLjgozjgbAp44CBCivjgIxSRkPjgI3jga7jgojjgYbjgarjgrPjg6Hjg7Pjg4jjgpLopoHmsYLjgZnjgovjgr/jgrDjgYzmjJnjgZLjgonjgozjgb7jgZnjgILjg5Hjg4Pjg4Hjgrfjg6rjg7zjgrrjgajjgZfjgaY044Gk44GuCivjg5Hjg4Pjg4HjgYzjgYLjgozjgbDjgIHlgIvjgIXjga7jg5Hjg4Pjg4HjgavjgIwxLzQsIDIvNCwgMy80LCA0LzTjgI3jga7jgojjgYbjgavnlarlj7fjgpLku5jjgZHjgabjgoIKK+OBi+OBvuOBhOOBvuOBm+OCk+OAguOBk+OCjOOBr+mWi+eZuuiAheOBjOODkeODg+ODgeOCkumBqeeUqOOBmeOCi+mghueVquOCkueiuuWun+OBq+aKiuaPoeOBmeOCi+OBn+OCgeOBp+OBmeOAggor44Gd44GX44Gm44CB6ZaL55m66ICF44GM44OR44OD44OB44K344Oq44O844K644Gu5Lit44Gu44GZ44G544Gm44Gu44OR44OD44OB44KS44KC44KJ44GV44Ga44Os44OT44Ol44O85oiW44GE44GvCivpgannlKjjgZnjgovjga7jgpLkv53oqLzjgZnjgovjgZ/jgoHjgafjgZnjgIIKIAog44K144OW44K444Kn44Kv44OI44Gu5L6L44KS5LqM44GkCiAKQEAgLTQyNiw3ICs1NTAsMTIgQEAKIAog6Kqs5piO5pys5L2T44Gv54Sh5pyf6ZmQ44Gu44K944O844K544Gu44OB44Kn44Oz44K444Ot44Kw44Gr44Kz44Of44OD44OI44GV44KM44G+44GZ44CC44Gq44Gu44Gn44CB6Kqs5piOCiDmnKzkvZPjga/jgZ3jga7jg5Hjg4Pjg4Hjgavoh7PjgaPjgZ/orbDoq5bjga7oqbPntLDjgpLlv5jjgozjgabjgYTjgovjgYLjgovnqIvluqbjga7mioDph4/jgpLmjIHjgaPjgabjgYTjgovkuroKLeOBjOOBneOBruips+e0sOOCkuaAneOBhOWHuuOBmeOBk+OBqOOBjOOBp+OBjeOCi+OCguOBruOBp+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCk+OAggor44GM44Gd44Gu6Kmz57Sw44KS5oCd44GE5Ye644GZ44GT44Go44GM44Gn44GN44KL44KC44Gu44Gn44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KT44CC44OR44OD44OB44GM5a++5Yem44GZ44KLCivpmpzlrrPjga7nl4fnirYo44Kr44O844ON44Or44Ot44Kw44Oh44OD44K744O844K444KEIG9vcHMg44Oh44OD44K744O844K4562JKeOCkuiomOi8ieOBmeOCi+OBk+OBqOOBr+WVj+mhjOOBqwor5a++5Yem5Y+v6IO944Gq44OR44OD44OB44KS5rGC44KB44Gm44Kz44Of44OD44OI44Ot44Kw44KS5qSc57Si44GZ44KL5Lq644CF44Gr44Go44Gj44Gm54m544Gr5pyJ55So44Gn44GZ44CCCivjg5Hjg4Pjg4HjgYzjgrPjg7Pjg5HjgqTjg6vllY/poYzjgpLop6PmsbrjgZnjgovjga7jgafjgYLjgozjgbDjgIHjgZ3jga7jg5Hjg4Pjg4HjgpLmjqLjgZfjgabjgYTjgovkurrjgYzopovjgaTjgZHjgosKK+OBk+OBqOOBjOOBp+OBjeOCi+aDheWgseOBoOOBkeOBp+WNgeWIhuOBp+OBguOCiuOAgeOCs+ODs+ODkeOCpOODq+aZguOBruWFqOOBpuOBruOCqOODqeODvOOCkuWQq+OCgeOCi+W/heimgeOBrwor44GC44KK44G+44Gb44KT44CC44CMc3VtbWFyeSBwaHJhc2XjgI3jgajlkIzmp5jjgavjgIHnsKHmvZTjgafjgYLjgoroqqzmmI7nmoTjgafjgYLjgovjgZPjgajjgYzph43opoHjgafjgZnjgIIKIAog44CMIC0tLSDjgI3jg57jg7zjgqvjg7zooYzjga/jg5Hjg4Pjg4Hlh6bnkIbjg4Tjg7zjg6vjgavlr77jgZfjgabjgIHjg4Hjgqfjg7Pjgrjjg63jgrDjg6Hjg4Pjgrvjg7zjgrjjga7ntYLnq68KIOmDqOWIhuOCkuiqjeitmOOBleOBm+OCi+OBqOOBhOOBhumHjeimgeOBquW9ueebruOCkuaenOOBn+OBl+OBvuOBmeOAggpAQCAtNDM2LDE0ICs1NjUsNDYgQEAKIOi/veWKoOOBleOCjOS9leihjOa2iOOBleOCjOOBn+OBi+OCkuekuuOBmeOCguOBruOBp+OBmeOAgmRpZmZzdGF0IOOCs+ODnuODs+ODieOBr+eJueOBq+Wkp+OBjeOBquODkeODg+ODgeOBqwog44GK44GE44Gm5b2556uL44Gh44G+44GZ44CC44Gd44Gu5pmC54K544Gn44Gg44GR5Y+I44Gv44Oh44Oz44OG44OK44Gr44Go44Gj44Gm44Gu44G/6Zai5L+C44Gu44GC44KL44Kz44Oh44Oz44OICiDjga/nhKHmnJ/pmZDjgavkv53lrZjjgZXjgozjgovjg4Hjgqfjg7Pjgrjjg63jgrDjgavjgajjgaPjgabpganliIfjgafjga/jgYLjgorjgb7jgZvjgpPjgILjgZ3jga7jgZ/jgoHjgIHjgZPjga4KLeOCiOOBhuOBquOCs+ODoeODs+ODiOOCguODnuODvOOCq+ODvOihjOOBruW+jOOBq+abuOOBi+OCjOOCi+OBueOBjeOBp+OBmeOAguODleOCoeOCpOODq+WQjeOBr+OCq+ODvOODjeODq+OCveODvAot44K544OE44Oq44O844Gu44OI44OD44OX44OH44Kj44Os44Kv44OI44Oq44GL44KJ44Gu6KGo6KiY44Gn44Oq44K544OI44GV44KM44KL44Gf44KB44CB5qiq5pa55ZCR44Gu44K544Oa44O844K5Ci3jgpLjgajjgorpgY7jgY7jgarjgYTjgojjgYbjgavjgIFkaWZmc3RhdCDjgrPjg57jg7Pjg4njgavjgqrjg5fjgrfjg6fjg7PjgIwgIC1wIDEgLXcgNzAg44CN44KS5oyH5a6a44GXCi3jgabjgY/jgaDjgZXjgYQo44Kk44Oz44OH44Oz44OI44KS5ZCr44KB44Gm44Gh44KH44GG44GpODDliJfjgavlkIjjgYbjgafjgZfjgofjgYYp44CCCivjgojjgYbjgarjgrPjg6Hjg7Pjg4jjgoLjg57jg7zjgqvjg7zooYzjga7lvozjgavmm7jjgYvjgozjgovjgbnjgY3jgafjgZnjgIIKK+OBk+OBruOCiOOBhuOBquOCs+ODoeODs+ODiOOBruiJr+OBhOS+i+OBqOOBl+OBpuOAgXYxIOOBqCB2MiDjga7jg5Djg7zjgrjjg6fjg7PplpPjgafkvZXjgYzlpInmm7TjgZXjgozjgZ/jgYvjgpIKK+ihqOOBmeOAjOODkeODg+ODgeOBruWkieabtOWxpeattOOAjeOBjOaMmeOBkuOCieOCjOOBvuOBmeOAggorCivjgIwgLS0tIOOAjeODnuODvOOCq+ODvOihjOOBruW+jOOBqyBkaWZmc3RhdCDjgrPjg57jg7Pjg4njga7ntZDmnpzjgpLlkKvjgoHjgovjga7jgafjgYLjgozjgbDjgIHjg5XjgqHjgqTjg6sKK+WQjeOBr+OCq+ODvOODjeODq+OCveODvOOCueODhOODquODvOOBruODiOODg+ODl+ODh+OCo+ODrOOCr+ODiOODquOBi+OCieOBruihqOiomOOBp+WIl+iomOOBleOCjOOCi+OBn+OCgeOAgeaoquaWueWQkQor44Gu44K544Oa44O844K544KS44Go44KK6YGO44GO44Gq44GE44KI44GG44Gr44CBZGlmZnN0YXQg44Kz44Oe44Oz44OJ44Gr44Kq44OX44K344On44Oz44CMIC1wIDEgLXcgNzAg44CNCivjgpLmjIflrprjgZfjgabjgY/jgaDjgZXjgYQo44Kk44Oz44OH44Oz44OI44KS5ZCr44KB44Gm44Gh44KH44GG44GpODDliJfjgavlkIjjgYbjgafjgZfjgofjgYYp44CCCiAKIOmBqeWIh+OBquODkeODg+ODgeOBruODleOCqeODvOODnuODg+ODiOOBruips+e0sOOBq+OBpOOBhOOBpuOBr+OCu+OCr+OCt+ODp+ODszPjga7lj4LogIPmlofnjK7jgpLlj4LnhafjgZfjgaYKIOOBj+OBoOOBleOBhOOAggogCisxNikg44CMZ2l0IHB1bGzjgI3opoHmsYLjga7pgIHjgormlrkoTGludXMg44Gu6Zu75a2Q44Oh44O844Or44GL44KJKQorCivplpPpgZXjgaPjgZ/jg5bjg6njg7Pjg4HjgYvjgonlvJXjgaPlvLXjgovjga7jgpLpmLLjgZDjgZ/jgoHjgavjgIFnaXQg44Oq44Od44K444OI44Oq44Gu44Ki44OJ44Os44K544GoCivjg5bjg6njg7Pjg4HlkI3jgpLlkIzjgZjooYzjgasx6KGM44Gn6KiY6LyJ44GX44Gm44GP44Gg44GV44GE44CC44Gd44GG44GZ44KL44GT44Go44Gn44CBM+WbnuOBrumAo+e2muOCr+ODquODg+OCrwor44Gn5YWo44Gm6YG45oqe44Gn44GN44G+44GZ44CCCisKK+ato+OBl+OBhOW9ouW8j+OBr+S4i+iomOOBrumAmuOCiuOBp+OBmeOAggorCisJIlBsZWFzZSBwdWxsIGZyb20KKworCQlnaXQ6Ly9qZGVsdmFyZS5wY2submVyaW0ubmV0L2pkZWx2YXJlLTIuNiBpMmMtZm9yLWxpbnVzCisKKwkgdG8gZ2V0IHRoZXNlIGNoYW5nZXM6IgorCivjgZ3jga7ntZDmnpzjgIHjgqLjg4njg6zjgrnjgpLoh6rliIboh6rouqvjgafjgr/jgqTjg5Tjg7PjgrDjgZfjgabplpPpgZXjgYjjgovjgZPjgajjga/jgarjgY/jgarjgorjgb7jgZko5a6f6Zqb44Gr44CBCivkvZXluqbjgYvplpPpgZXjgaPjgZ/jg5bjg6njg7Pjg4HjgYvjgonlvJXjgaPlvLXjgaPjgabjgY3jgabjgZfjgb7jgYTjgIHjgZ3jga7mmYLjgasgZGlmZnN0YXQg44Gu57WQ5p6c44KSCivmpJzoqLzjgZfjgabplpPpgZXjgaPjgabjgYTjgovjgZPjgajjgavmsJfjgaXjgYTjgZ/jgZPjgajjgYzjgYLjgorjgb7jgZnjgILjganjgZPjgYvjgonkvZXjgpLlvJXjgaPlvLXjgovjgbnjgY3jgYvjgpIKK+OAjOaOouOBl+OBn+OCiuOAjeOAgeato+OBl+OBhOODluODqeODs+ODgeWQjeOBi+OBqeOBhuOBi+OCkumHjeOBreOBpuODgeOCp+ODg+OCr+OBl+OBn+OCiuOBmeOCi+W/heimgeOBjAor44Gq44GP44Gq44KM44Gw44KI44KK5b+r6YGp44Gr44Gq44KL44Gn44GX44KH44GGKeOAggorCitkaWZmc3RhdCDjga7ntZDmnpzjgpLnlJ/miJDjgZnjgovjgZ/jgoHjgavjgIwgZ2l0IGRpZmYgLU0gLS1zdGF0IC0tc3VtbWFyeSDjgI3jgpLkvb/jgaPjgaYKK+OBj+OBoOOBleOBhOOAgi1NIOOCquODl+OCt+ODp+ODs+OBr+ODleOCoeOCpOODq+WQjeOBruWkieabtOOCkuaknOefpeOBp+OBjeOAgS0tc3VtbWFyeSDjgqrjg5fjgrfjg6fjg7Pjga8KK+aWsOimj+ODleOCoeOCpOODq+OAgeWJiumZpOOBleOCjOOBn+ODleOCoeOCpOODq+OAgeWQjeWJjeOBjOWkieabtOOBleOCjOOBn+ODleOCoeOCpOODq+OBruamguimgeOCkueUn+aIkOOBl+OBvuOBmeOAggorCistTSDjgqrjg5fjgrfjg6fjg7Mo44OV44Kh44Kk44Or5ZCN44Gu5aSJ5pu05qSc55+lKeOCkuaMh+WumuOBmeOCi+OBqOOAgWRpZmZzdGF0IOOBrue1kOaenOOBr+OBi+OBquOCigor55Ww44Gq44Gj44Gm44GN44G+44GZ44CCZ2l0IOOBr+Wkp+imj+aooeOBquWkieabtCjov73liqDjgajliYrpmaTjga7jg5rjgqIp44KS44OV44Kh44Kk44Or5ZCN44Gu5aSJ5pu044GoCivliKTmlq3jgZnjgovjgZ/jgoHjgafjgZnjgIIKKwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiDjgrvjgq/jgrfjg6fjg7MyIC0g44OS44Oz44OI44GoVElQU+OBqOWwj+aKgAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NTksNyArNjIwLDcgQEAKIOOCgumAuOiEseOBl+OBpuOBhOOCi+OBqOOAgeODrOODk+ODpeODvOOChOOCs+ODoeODs+ODiOOBquOBl+OBq+WPl+OBkeWPluOBo+OBpuOCguOCieOBiOOBquOBhOOBi+OCguOBlwog44KM44G+44Gb44KT44CCCiAKLeWUr+S4gOOBrueJueethuOBmeOBueOBjeS+i+WkluOBr+OAgeOCs+ODvOODieOCkuOBguOCi+ODleOCoeOCpOODq+OBi+OCieWIpeOBruODleOCoeOCpOODq+OBq+enu+WLlQor54m5562G44GZ44G544GN5L6L5aSW44Gv44CB44Kz44O844OJ44KS44GC44KL44OV44Kh44Kk44Or44GL44KJ5Yil44Gu44OV44Kh44Kk44Or44Gr56e75YuVCiDjgZnjgovjgajjgY3jgafjgZnjgILjgZPjga7loLTlkIjjgIHjgrPjg7zjg4njgpLnp7vli5XjgZnjgovjg5Hjg4Pjg4Hjgafjga/jgIHnp7vli5XjgZXjgozjgovjgrPjg7zjg4kKIOOBq+mWouOBl+OBpuenu+WLleS7peWkluOBruWkieabtOOCkuS4gOWIh+WKoOOBiOOCi+OBueOBjeOBp+OBr+OBguOCiuOBvuOBm+OCk+OAguOBk+OCjOOBq+OCiOOCiuOAgQog44Kz44O844OJ44Gu56e75YuV44Go44GC44Gq44Gf44GM6KGM44Gj44Gf44Kz44O844OJ44Gu5L+u5q2j44KS5piO56K644Gr5Yy65Yil44Gn44GN44KL44KI44GG44Gr44GqCkBAIC01NTMsNCArNzE0LDExIEBACiAKIExpbnVzIFRvcnZhbGRzJ3MgbWFpbCBvbiB0aGUgY2Fub25pY2FsIHBhdGNoIGZvcm1hdDoKICAgPGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDUvNC83LzE4Mz4KKworQW5kaSBLbGVlbiwgIk9uIHN1Ym1pdHRpbmcga2VybmVsIHBhdGNoZXMiCisgIFNvbWUgc3RyYXRlZ2llcyB0byBnZXQgZGlmZmljdWx0IG9yIGNvbnRyb3ZlcnNpYWwgY2hhbmdlcyBpbi4KKyAgaHR0cDovL2hhbG9iYXRlcy5kZS9vbi1zdWJtaXR0aW5nLXBhdGNoZXMucGRmCisKIC0tCisKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dCBiL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKaW5kZXggNDc0MzVlNS4uZjQ3Y2RlZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CkBAIC00NDEsNyArNDQxLDcgQEAKIAlzcGVjaWZpZWQgaWYgZmlyc3Qgb3B0aW9uIGFyZSBub3Qgc3VwcG9ydGVkLgogCiAJRXhhbXBsZToKLQkJI2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKKwkJI2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQogCQl2c3lzY2FsbC1mbGFncyArPSAkKGNhbGwgY2MtbGRvcHRpb24sIC1XbCQoY29tbWEpLS1oYXNoLXN0eWxlPXN5c3YpCiAKIAlJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdnN5c2NhbGwtZmxhZ3Mgd2lsbCBiZSBhc3NpZ25lZCB0aGUgb3B0aW9uCkBAIC00NjAsNyArNDYwLDcgQEAKIAlzdXBwb3J0ZWQgdG8gdXNlIGFuIG9wdGlvbmFsIHNlY29uZCBvcHRpb24uCiAKIAlFeGFtcGxlOgotCQkjYXJjaC9pMzg2L01ha2VmaWxlCisJCSNhcmNoL3g4Ni9NYWtlZmlsZQogCQljZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1wZW50aXVtLW1teCwtbWFyY2g9aTU4NikKIAogCUluIHRoZSBhYm92ZSBleGFtcGxlLCBjZmxhZ3MteSB3aWxsIGJlIGFzc2lnbmVkIHRoZSBvcHRpb24KQEAgLTUyMiw3ICs1MjIsNyBAQAogCWV2ZW4gdGhvdWdoIHRoZSBvcHRpb24gd2FzIGFjY2VwdGVkIGJ5IGdjYy4KIAogCUV4YW1wbGU6Ci0JCSNhcmNoL2kzODYvTWFrZWZpbGUKKwkJI2FyY2gveDg2L01ha2VmaWxlCiAJCWNmbGFncy15ICs9ICQoc2hlbGwgXAogCQlpZiBbICQoY2FsbCBjYy12ZXJzaW9uKSAtZ2UgMDMwMCBdIDsgdGhlbiBcCiAJCQllY2hvICItbXJlZ3Bhcm09MyI7IGZpIDspCkBAIC04MDIsNyArODAyLDcgQEAKIGlzIG5vdCBzdWZmaWNpZW50IHRoaXMgc29tZXRpbWVzIG5lZWRzIHRvIGJlIGV4cGxpY2l0LgogCiAJRXhhbXBsZToKLQkJI2FyY2gvaTM4Ni9ib290L01ha2VmaWxlCisJCSNhcmNoL3g4Ni9ib290L01ha2VmaWxlCiAJCXN1YmRpci0gOj0gY29tcHJlc3NlZC8KIAogVGhlIGFib3ZlIGFzc2lnbm1lbnQgaW5zdHJ1Y3RzIGtidWlsZCB0byBkZXNjZW5kIGRvd24gaW4gdGhlCkBAIC04MTIsMTIgKzgxMiwxMiBAQAogZmluYWwgYm9vdGltYWdlIHRoZXJlIGlzIGFuIG9wdGlvbmFsIHRhcmdldCBuYW1lZCBhcmNoY2xlYW46CiAKIAlFeGFtcGxlOgotCQkjYXJjaC9pMzg2L01ha2VmaWxlCisJCSNhcmNoL3g4Ni9NYWtlZmlsZQogCQlhcmNoY2xlYW46Ci0JCQkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL2kzODYvYm9vdAorCQkJJChRKSQoTUFLRSkgJChjbGVhbik9YXJjaC94ODYvYm9vdAogCi1XaGVuICJtYWtlIGNsZWFuIiBpcyBleGVjdXRlZCwgbWFrZSB3aWxsIGRlc2NlbmQgZG93biBpbiBhcmNoL2kzODYvYm9vdCwKLWFuZCBjbGVhbiBhcyB1c3VhbC4gVGhlIE1ha2VmaWxlIGxvY2F0ZWQgaW4gYXJjaC9pMzg2L2Jvb3QvIG1heSB1c2UKK1doZW4gIm1ha2UgY2xlYW4iIGlzIGV4ZWN1dGVkLCBtYWtlIHdpbGwgZGVzY2VuZCBkb3duIGluIGFyY2gveDg2L2Jvb3QsCithbmQgY2xlYW4gYXMgdXN1YWwuIFRoZSBNYWtlZmlsZSBsb2NhdGVkIGluIGFyY2gveDg2L2Jvb3QvIG1heSB1c2UKIHRoZSBzdWJkaXItIHRyaWNrIHRvIGRlc2NlbmQgZnVydGhlciBkb3duLgogCiBOb3RlIDE6IGFyY2gvJChBUkNIKS9NYWtlZmlsZSBjYW5ub3QgdXNlICJzdWJkaXItIiwgYmVjYXVzZSB0aGF0IGZpbGUgaXMKQEAgLTg4Miw3ICs4ODIsNyBAQAogCUxERkxBR1Nfdm1saW51eCB1c2VzIHRoZSBMREZMQUdTXyRAIHN1cHBvcnQuCiAKIAlFeGFtcGxlOgotCQkjYXJjaC9pMzg2L01ha2VmaWxlCisJCSNhcmNoL3g4Ni9NYWtlZmlsZQogCQlMREZMQUdTX3ZtbGludXggOj0gLWUgc3RleHQKIAogICAgIE9CSkNPUFlGTEFHUwlvYmpjb3B5IGZsYWdzCkBAIC05MjAsMTQgKzkyMCwxNCBAQAogCU9mdGVuLCB0aGUgS0JVSUxEX0NGTEFHUyB2YXJpYWJsZSBkZXBlbmRzIG9uIHRoZSBjb25maWd1cmF0aW9uLgogCiAJRXhhbXBsZToKLQkJI2FyY2gvaTM4Ni9NYWtlZmlsZQorCQkjYXJjaC94ODYvTWFrZWZpbGUKIAkJY2ZsYWdzLSQoQ09ORklHX00zODYpICs9IC1tYXJjaD1pMzg2CiAJCUtCVUlMRF9DRkxBR1MgKz0gJChjZmxhZ3MteSkKIAogCU1hbnkgYXJjaCBNYWtlZmlsZXMgZHluYW1pY2FsbHkgcnVuIHRoZSB0YXJnZXQgQyBjb21waWxlciB0bwogCXByb2JlIHN1cHBvcnRlZCBvcHRpb25zOgogCi0JCSNhcmNoL2kzODYvTWFrZWZpbGUKKwkJI2FyY2gveDg2L01ha2VmaWxlCiAKIAkJLi4uCiAJCWNmbGFncy0kKENPTkZJR19NUEVOVElVTUlJKSAgICAgKz0gJChjYWxsIGNjLW9wdGlvbixcCkBAIC0xMDM4LDggKzEwMzgsOCBAQAogCWludG8gdGhlIGFyY2gvJChBUkNIKS9ib290L01ha2VmaWxlLgogCiAJRXhhbXBsZToKLQkJI2FyY2gvaTM4Ni9NYWtlZmlsZQotCQlib290IDo9IGFyY2gvaTM4Ni9ib290CisJCSNhcmNoL3g4Ni9NYWtlZmlsZQorCQlib290IDo9IGFyY2gveDg2L2Jvb3QKIAkJYnpJbWFnZTogdm1saW51eAogCQkJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkKGJvb3QpLyRACiAKQEAgLTEwNTEsNyArMTA1MSw3IEBACiAJVG8gc3VwcG9ydCB0aGlzLCAkKGFyY2hoZWxwKSBtdXN0IGJlIGRlZmluZWQuCiAKIAlFeGFtcGxlOgotCQkjYXJjaC9pMzg2L01ha2VmaWxlCisJCSNhcmNoL3g4Ni9NYWtlZmlsZQogCQlkZWZpbmUgYXJjaGhlbHAKIAkJICBlY2hvICAnKiBiekltYWdlICAgICAgLSBJbWFnZSAoYXJjaC8kKEFSQ0gpL2Jvb3QvYnpJbWFnZSknCiAJCWVuZGlmCkBAIC0xMDY1LDcgKzEwNjUsNyBAQAogCWZyb20gdm1saW51eC4KIAogCUV4YW1wbGU6Ci0JCSNhcmNoL2kzODYvTWFrZWZpbGUKKwkJI2FyY2gveDg2L01ha2VmaWxlCiAJCWFsbDogYnpJbWFnZQogCiAJV2hlbiAibWFrZSIgaXMgZXhlY3V0ZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ6SW1hZ2Ugd2lsbCBiZSBidWlsdC4KQEAgLTEwODMsNyArMTA4Myw3IEBACiAJMikga2J1aWxkIGtub3dzIHdoYXQgZmlsZXMgdG8gZGVsZXRlIGR1cmluZyAibWFrZSBjbGVhbiIKIAogCUV4YW1wbGU6Ci0JCSNhcmNoL2kzODYva2VybmVsL01ha2VmaWxlCisJCSNhcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKIAkJZXh0cmEteSA6PSBoZWFkLm8gaW5pdF90YXNrLm8KIAogCUluIHRoaXMgZXhhbXBsZSwgZXh0cmEteSBpcyB1c2VkIHRvIGxpc3Qgb2JqZWN0IGZpbGVzIHRoYXQKQEAgLTExMzMsNyArMTEzMyw3IEBACiAJQ29tcHJlc3MgdGFyZ2V0LiBVc2UgbWF4aW11bSBjb21wcmVzc2lvbiB0byBjb21wcmVzcyB0YXJnZXQuCiAKIAlFeGFtcGxlOgotCQkjYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUKKwkJI2FyY2gveDg2L2Jvb3QvTWFrZWZpbGUKIAkJTERGTEFHU19ib290c2VjdCA6PSAtVHRleHQgMHgwIC1zIC0tb2Zvcm1hdCBiaW5hcnkKIAkJTERGTEFHU19zZXR1cCAgICA6PSAtVHRleHQgMHgwIC1zIC0tb2Zvcm1hdCBiaW5hcnkgLWUgYmVndGV4dAogCkBAIC0xMTkzLDcgKzExOTMsNyBAQAogCiAJV2hlbiB1cGRhdGluZyB0aGUgJChvYmopL2J6SW1hZ2UgdGFyZ2V0LCB0aGUgbGluZQogCi0JQlVJTEQgICAgYXJjaC9pMzg2L2Jvb3QvYnpJbWFnZQorCUJVSUxEICAgIGFyY2gveDg2L2Jvb3QvYnpJbWFnZQogCiAJd2lsbCBiZSBkaXNwbGF5ZWQgd2l0aCAibWFrZSBLQlVJTERfVkVSQk9TRT0wIi4KIApAQCAtMTIwNyw3ICsxMjA3LDcgQEAKIAlrYnVpbGQga25vd3MgLmxkcyBmaWxlcyBhbmQgaW5jbHVkZXMgYSBydWxlICpsZHMuUyAtPiAqbGRzLgogCiAJRXhhbXBsZToKLQkJI2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKKwkJI2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQogCQlhbHdheXMgOj0gdm1saW51eC5sZHMKIAogCQkjTWFrZWZpbGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggZDlhMjAzYi4uYTcwZTQzZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTExNTksMTAgKzExNTksNiBAQAogCQkJZm9yIGFsbCBndWVzdHMuCiAJCQlEZWZhdWx0IGlzIDEgKGVuYWJsZWQpIGlmIGluIDY0Yml0IG9yIDMyYml0LVBBRSBtb2RlCiAKLQlrdm0taW50ZWwuYnlwYXNzX2d1ZXN0X3BmPQotCQkJW0tWTSxJbnRlbF0gRGlzYWJsZXMgYnlwYXNzaW5nIG9mIGd1ZXN0IHBhZ2UgZmF1bHRzCi0JCQlvbiBJbnRlbCBjaGlwcy4gRGVmYXVsdCBpcyAxIChlbmFibGVkKQotCiAJa3ZtLWludGVsLmVwdD0JW0tWTSxJbnRlbF0gRGlzYWJsZSBleHRlbmRlZCBwYWdlIHRhYmxlcwogCQkJKHZpcnR1YWxpemVkIE1NVSkgc3VwcG9ydCBvbiBjYXBhYmxlIEludGVsIGNoaXBzLgogCQkJRGVmYXVsdCBpcyAxIChlbmFibGVkKQpAQCAtMTczNyw2ICsxNzMzLDEwIEBACiAJbm8ta3ZtYXBmCVtYODYsS1ZNXSBEaXNhYmxlIHBhcmF2aXJ0dWFsaXplZCBhc3luY2hyb25vdXMgcGFnZQogCQkJZmF1bHQgaGFuZGxpbmcuCiAKKwluby1zdGVhbC1hY2MgICAgW1g4NixLVk1dIERpc2FibGUgcGFyYXZpcnR1YWxpemVkIHN0ZWFsIHRpbWUgYWNjb3VudGluZy4KKwkJCXN0ZWFsIHRpbWUgaXMgY29tcHV0ZWQsIGJ1dCB3b24ndCBpbmZsdWVuY2Ugc2NoZWR1bGVyCisJCQliZWhhdmlvdXIKKwogCW5vbGFwaWMJCVtYODYtMzIsQVBJQ10gRG8gbm90IGVuYWJsZSBvciB1c2UgdGhlIGxvY2FsIEFQSUMuCiAKIAlub2xhcGljX3RpbWVyCVtYODYtMzIsQVBJQ10gRG8gbm90IHVzZSB0aGUgbG9jYWwgQVBJQyB0aW1lci4KQEAgLTIwMTUsNiArMjAxNSw4IEBACiAJCQkJdGhlIGRlZmF1bHQuCiAJCQkJb2ZmOiBUdXJuIEVDUkMgb2ZmCiAJCQkJb246IFR1cm4gRUNSQyBvbi4KKwkJcmVhbGxvYwkJcmVhbGxvY2F0ZSBQQ0kgcmVzb3VyY2VzIGlmIGFsbG9jYXRpb25zIGRvbmUgYnkgQklPUworCQkJCWFyZSBlcnJvbmVvdXMuCiAKIAlwY2llX2FzcG09CVtQQ0lFXSBGb3JjaWJseSBlbmFibGUgb3IgZGlzYWJsZSBQQ0llIEFjdGl2ZSBTdGF0ZSBQb3dlcgogCQkJTWFuYWdlbWVudC4KQEAgLTI1MjQsNiArMjUyNiwxMSBAQAogCQkJPHBvcnQjPiw8anMxPiw8anMyPiw8anMzPiw8anM0Piw8anM1Piw8anM2Piw8anM3PgogCQkJU2VlIGFsc28gRG9jdW1lbnRhdGlvbi9pbnB1dC9qb3lzdGljay1wYXJwb3J0LnR4dAogCisJdWRiZy1pbW1vcnRhbAlbUFBDXSBXaGVuIGRlYnVnZ2luZyBlYXJseSBrZXJuZWwgY3Jhc2hlcyB0aGF0CisJCQloYXBwZW4gYWZ0ZXIgY29uc29sZV9pbml0KCkgYW5kIGJlZm9yZSBhIHByb3BlciAKKwkJCWNvbnNvbGUgZHJpdmVyIHRha2VzIG92ZXIsIHRoaXMgYm9vdCBvcHRpb25zIG1pZ2h0CisJCQloZWxwICJzZWVpbmciIHdoYXQncyBnb2luZyBvbi4KKwogCXVoYXNoX2VudHJpZXM9CVtLTkwsTkVUXQogCQkJU2V0IG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgZm9yIFVEUC9VRFAtTGl0ZSBjb25uZWN0aW9ucwogCkBAIC0yNTM4LDYgKzI1NDUsMTEgQEAKIAl1bmtub3duX25taV9wYW5pYwogCQkJW1g4Nl0gQ2F1c2UgcGFuaWMgb24gdW5rbm93biBOTUkuCiAKKwl1c2Jjb3JlLmF1dGhvcml6ZWRfZGVmYXVsdD0KKwkJCVtVU0JdIERlZmF1bHQgVVNCIGRldmljZSBhdXRob3JpemF0aW9uOgorCQkJKGRlZmF1bHQgLTEgPSBhdXRob3JpemVkIGV4Y2VwdCBmb3Igd2lyZWxlc3MgVVNCLAorCQkJMCA9IG5vdCBhdXRob3JpemVkLCAxID0gYXV0aG9yaXplZCkKKwogCXVzYmNvcmUuYXV0b3N1c3BlbmQ9CiAJCQlbVVNCXSBUaGUgYXV0b3N1c3BlbmQgdGltZSBkZWxheSAoaW4gc2Vjb25kcykgdXNlZAogCQkJZm9yIG5ld2x5LWRldGVjdGVkIFVTQiBkZXZpY2VzIChkZWZhdWx0IDIpLiAgVGhpcwpAQCAtMjU5OCw2ICsyNjEwLDggQEAKIAkJCQkJdW5sb2NrIGVqZWN0YWJsZSBtZWRpYSk7CiAJCQkJbSA9IE1BWF9TRUNUT1JTXzY0IChkb24ndCB0cmFuc2ZlciBtb3JlCiAJCQkJCXRoYW4gNjQgc2VjdG9ycyA9IDMyIEtCIGF0IGEgdGltZSk7CisJCQkJbiA9IElOSVRJQUxfUkVBRDEwIChmb3JjZSBhIHJldHJ5IG9mIHRoZQorCQkJCQlpbml0aWFsIFJFQUQoMTApIGNvbW1hbmQpOwogCQkJCW8gPSBDQVBBQ0lUWV9PSyAoYWNjZXB0IHRoZSBjYXBhY2l0eQogCQkJCQlyZXBvcnRlZCBieSB0aGUgZGV2aWNlKTsKIAkJCQlyID0gSUdOT1JFX1JFU0lEVUUgKHRoZSBkZXZpY2UgcmVwb3J0cwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rbWVtbGVhay50eHQgYi9Eb2N1bWVudGF0aW9uL2ttZW1sZWFrLnR4dAppbmRleCAwOTBlNmVlLi41MTA2M2U2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ttZW1sZWFrLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ttZW1sZWFrLnR4dApAQCAtMTEsNyArMTEsOSBAQAogcmVwb3J0ZWQgdmlhIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrLiBBIHNpbWlsYXIgbWV0aG9kIGlzIHVzZWQgYnkgdGhlCiBWYWxncmluZCB0b29sIChtZW1jaGVjayAtLWxlYWstY2hlY2spIHRvIGRldGVjdCB0aGUgbWVtb3J5IGxlYWtzIGluCiB1c2VyLXNwYWNlIGFwcGxpY2F0aW9ucy4KLUttZW1sZWFrIGlzIHN1cHBvcnRlZCBvbiB4ODYsIGFybSwgcG93ZXJwYywgc3BhcmMsIHNoLCBtaWNyb2JsYXplIGFuZCB0aWxlLgorCitQbGVhc2UgY2hlY2sgREVCVUdfS01FTUxFQUsgZGVwZW5kZW5jaWVzIGluIGxpYi9LY29uZmlnLmRlYnVnIGZvciBzdXBwb3J0ZWQKK2FyY2hpdGVjdHVyZXMuCiAKIFVzYWdlCiAtLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0CmluZGV4IDE1NjVlZWYuLjYxODE1NDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQKQEAgLTUzNCw2ICs1MzQsOCBAQAogMHgyNDA0CQlTeXN0ZW0gaXMgd2FraW5nIHVwIGZyb20gaGliZXJuYXRpb24gdG8gdW5kb2NrCiAweDI0MDUJCVN5c3RlbSBpcyB3YWtpbmcgdXAgZnJvbSBoaWJlcm5hdGlvbiB0byBlamVjdCBiYXkKIDB4NTAxMAkJQnJpZ2h0bmVzcyBsZXZlbCBjaGFuZ2VkL2NvbnRyb2wgZXZlbnQKKzB4NjAwMAkJS0VZQk9BUkQ6IE51bWxvY2sga2V5IHByZXNzZWQKKzB4NjAwNQkJS0VZQk9BUkQ6IEZuIGtleSBwcmVzc2VkIChUTyBCRSBWRVJJRklFRCkKIAogRXZlbnRzIHRoYXQgYXJlIHByb3BhZ2F0ZWQgYnkgdGhlIGRyaXZlciB0byB1c2Vyc3BhY2U6CiAKQEAgLTU0NSw2ICs1NDcsOCBAQAogMHgzMDA2CQlCYXkgaG90cGx1ZyByZXF1ZXN0IChoaW50IHRvIHBvd2VyIHVwIFNBVEEgbGluayB3aGVuCiAJCXRoZSBvcHRpY2FsIGRyaXZlIHRyYXkgaXMgZWplY3RlZCkKIDB4NDAwMwkJVW5kb2NrZWQgKHNlZSAweDJ4MDQpLCBjYW4gc2xlZXAgYWdhaW4KKzB4NDAxMAkJRG9ja2VkIGludG8gaG90cGx1ZyBwb3J0IHJlcGxpY2F0b3IgKG5vbi1BQ1BJIGRvY2spCisweDQwMTEJCVVuZG9ja2VkIGZyb20gaG90cGx1ZyBwb3J0IHJlcGxpY2F0b3IgKG5vbi1BQ1BJIGRvY2spCiAweDUwMEIJCVRhYmxldCBwZW4gaW5zZXJ0ZWQgaW50byBpdHMgc3RvcmFnZSBiYXkKIDB4NTAwQwkJVGFibGV0IHBlbiByZW1vdmVkIGZyb20gaXRzIHN0b3JhZ2UgYmF5CiAweDYwMTEJCUFMQVJNOiBiYXR0ZXJ5IGlzIHRvbyBob3QKQEAgLTU1Miw2ICs1NTYsNyBAQAogMHg2MDIxCQlBTEFSTTogYSBzZW5zb3IgaXMgdG9vIGhvdAogMHg2MDIyCQlBTEFSTTogYSBzZW5zb3IgaXMgZXh0cmVtZWx5IGhvdAogMHg2MDMwCQlTeXN0ZW0gdGhlcm1hbCB0YWJsZSBjaGFuZ2VkCisweDYwNDAJCU52aWRpYSBPcHRpbXVzL0FDIGFkYXB0ZXIgcmVsYXRlZCAoVE8gQkUgVkVSSUZJRUQpCiAKIEJhdHRlcnkgbmVhcmx5IGVtcHR5IGFsYXJtcyBhcmUgYSBsYXN0IHJlc29ydCBhdHRlbXB0IHRvIGdldCB0aGUKIG9wZXJhdGluZyBzeXN0ZW0gdG8gaGliZXJuYXRlIG9yIHNodXRkb3duIGNsZWFubHkgKDB4MjMxMyksIG9yIHNodXRkb3duCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21hZ2ljLW51bWJlci50eHQgYi9Eb2N1bWVudGF0aW9uL21hZ2ljLW51bWJlci50eHQKaW5kZXggNGIxMmFiYy4uYWJmNDgxZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tYWdpYy1udW1iZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWFnaWMtbnVtYmVyLnR4dApAQCAtNjYsNyArNjYsNyBAQAogUklTQ09NOF9NQUdJQyAgICAgICAgIDB4MDkwNyAgICAgIHJpc2NvbV9wb3J0ICAgICAgIGRyaXZlcnMvY2hhci9yaXNjb204LmgKIFNQRUNJQUxJWF9NQUdJQyAgICAgICAweDA5MDcgICAgICBzcGVjaWFsaXhfcG9ydCAgICBkcml2ZXJzL2NoYXIvc3BlY2lhbGl4X2lvOC5oCiBIRExDX01BR0lDICAgICAgICAgICAgMHgyMzllICAgICAgbl9oZGxjICAgICAgICAgICAgZHJpdmVycy9jaGFyL25faGRsYy5jCi1BUE1fQklPU19NQUdJQyAgICAgICAgMHg0MTAxICAgICAgYXBtX3VzZXIgICAgICAgICAgYXJjaC9pMzg2L2tlcm5lbC9hcG0uYworQVBNX0JJT1NfTUFHSUMgICAgICAgIDB4NDEwMSAgICAgIGFwbV91c2VyICAgICAgICAgIGFyY2gveDg2L2tlcm5lbC9hcG1fMzIuYwogQ1lDTEFERVNfTUFHSUMgICAgICAgIDB4NDM1OSAgICAgIGN5Y2xhZGVzX3BvcnQgICAgIGluY2x1ZGUvbGludXgvY3ljbGFkZXMuaAogREJfTUFHSUMgICAgICAgICAgICAgIDB4NDQ0MiAgICAgIGZjX2luZm8gICAgICAgICAgIGRyaXZlcnMvbmV0L2lwaDU1MjZfbm92cmFtLmMKIERMX01BR0lDICAgICAgICAgICAgICAweDQ0NGQgICAgICBmY19pbmZvICAgICAgICAgICBkcml2ZXJzL25ldC9pcGg1NTI2X25vdnJhbS5jCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21jYS50eHQgYi9Eb2N1bWVudGF0aW9uL21jYS50eHQKaW5kZXggNTEwMzc1ZC4uZGZkMTMwYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tY2EudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWNhLnR4dApAQCAtMTEsNyArMTEsNyBAQAogCiBUaGUgaWRlYWwgTUNBIGFkYXB0ZXIgZGV0ZWN0aW9uIGlzIGRvbmUgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZQogUHJvZ3JhbW1hYmxlIE9wdGlvbiBTZWxlY3QgcmVnaXN0ZXJzLiAgR2VuZXJpYyBmdW5jdGlvbnMgZm9yIGRvaW5nCi10aGlzIGhhdmUgYmVlbiBhZGRlZCBpbiBpbmNsdWRlL2xpbnV4L21jYS5oIGFuZCBhcmNoL2kzODYva2VybmVsL21jYS5jLgordGhpcyBoYXZlIGJlZW4gYWRkZWQgaW4gaW5jbHVkZS9saW51eC9tY2EuaCBhbmQgYXJjaC94ODYva2VybmVsL21jYV8zMi5jLgogRXZlcnl0aGluZyBuZWVkZWQgdG8gZGV0ZWN0IGFkYXB0ZXJzIGFuZCByZWFkIChhbmQgd3JpdGUpIGNvbmZpZ3VyYXRpb24KIGluZm9ybWF0aW9uIGlzIHRoZXJlLiAgQSBudW1iZXIgb2YgTUNBLXNwZWNpZmljIGRyaXZlcnMgYWxyZWFkeSB1c2UKIHRoaXMuICBUaGUgdHlwaWNhbCBwcm9iZSBjb2RlIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZzoKQEAgLTgxLDcgKzgxLDcgQEAKIEluIGdlbmVyYWwsIGFuIGludGVycnVwdCBtdXN0IGJlIGFja25vd2xlZGdlZCBub3Qgb25seSBhdCB0aGUgSUNVICh3aGljaAogaXMgZG9uZSBhdXRvbWFnaWNhbGx5IGJ5IHRoZSBrZXJuZWwpLCBidXQgYXQgdGhlIGRldmljZSBsZXZlbC4gIEluCiBwYXJ0aWN1bGFyLCBJUlEgMCBtdXN0IGJlIHJlc2V0IGFmdGVyIGEgdGltZXIgaW50ZXJydXB0IChub3cgZG9uZSBpbgotYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMpIG9yIHRoZSBmaXJzdCB0aW1lciBpbnRlcnJ1cHQgaGFuZ3MgdGhlIHN5c3RlbS4KK2FyY2gveDg2L2tlcm5lbC90aW1lLmMpIG9yIHRoZSBmaXJzdCB0aW1lciBpbnRlcnJ1cHQgaGFuZ3MgdGhlIHN5c3RlbS4KIFRoZXJlIHdlcmUgYWxzbyBwcm9ibGVtcyB3aXRoIHRoZSAxLjMueCBmbG9wcHkgZHJpdmVycywgYnV0IHRoYXQgc2VlbXMKIHRvIGhhdmUgYmVlbiBmaXhlZC4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZC50eHQgYi9Eb2N1bWVudGF0aW9uL21kLnR4dAppbmRleCAyMzY2YjFjLi5mMGVlZTgzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21kLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL21kLnR4dApAQCAtNTU1LDcgKzU1NSw3IEBACiAgICBzeW5jX21pbgogICAgc3luY19tYXgKICAgICAgVGhlIHR3byB2YWx1ZXMsIGdpdmVuIGFzIG51bWJlcnMgb2Ygc2VjdG9ycywgaW5kaWNhdGUgYSByYW5nZQotICAgICB3aXRoaW5nIHRoZSBhcnJheSB3aGVyZSAnY2hlY2snLydyZXBhaXInIHdpbGwgb3BlcmF0ZS4gTXVzdCBiZQorICAgICB3aXRoaW4gdGhlIGFycmF5IHdoZXJlICdjaGVjaycvJ3JlcGFpcicgd2lsbCBvcGVyYXRlLiBNdXN0IGJlCiAgICAgIGEgbXVsdGlwbGUgb2YgY2h1bmtfc2l6ZS4gV2hlbiBpdCByZWFjaGVzICJzeW5jX21heCIgaXQgd2lsbAogICAgICBwYXVzZSwgcmF0aGVyIHRoYW4gY29tcGxldGUuCiAgICAgIFlvdSBjYW4gdXNlICdzZWxlY3QnIG9yICdwb2xsJyBvbiAic3luY19jb21wbGV0ZWQiIHRvIHdhaXQgZm9yCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21tYy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vbW1jLzAwLUlOREVYCmluZGV4IDkzZGQ3YTcuLmE5YmE2NzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbW1jLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vbW1jLzAwLUlOREVYCkBAIC00LDMgKzQsNSBAQAogICAgICAgICAtIGluZm8gb24gU0QgYW5kIE1NQyBkZXZpY2UgYXR0cmlidXRlcwogbW1jLWRldi1wYXJ0cy50eHQKICAgICAgICAgLSBpbmZvIG9uIFNEIGFuZCBNTUMgZGV2aWNlIHBhcnRpdGlvbnMKK21tYy1hc3luYy1yZXEudHh0CisgICAgICAgIC0gaW5mbyBvbiBtbWMgYXN5bmNocm9ub3VzIHJlcXVlc3RzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21tYy9tbWMtYXN5bmMtcmVxLnR4dCBiL0RvY3VtZW50YXRpb24vbW1jL21tYy1hc3luYy1yZXEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMTkwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL21tYy9tbWMtYXN5bmMtcmVxLnR4dApAQCAtMCwwICsxLDg3IEBACitSYXRpb25hbGUKKz09PT09PT09PQorCitIb3cgc2lnbmlmaWNhbnQgaXMgdGhlIGNhY2hlIG1haW50ZW5hbmNlIG92ZXJoZWFkPworSXQgZGVwZW5kcy4gRmFzdCBlTU1DIGFuZCBtdWx0aXBsZSBjYWNoZSBsZXZlbHMgd2l0aCBzcGVjdWxhdGl2ZSBjYWNoZQorcHJlLWZldGNoIG1ha2VzIHRoZSBjYWNoZSBvdmVyaGVhZCByZWxhdGl2ZWx5IHNpZ25pZmljYW50LiBJZiB0aGUgRE1BCitwcmVwYXJhdGlvbnMgZm9yIHRoZSBuZXh0IHJlcXVlc3QgYXJlIGRvbmUgaW4gcGFyYWxsZWwgd2l0aCB0aGUgY3VycmVudAordHJhbnNmZXIsIHRoZSBETUEgcHJlcGFyYXRpb24gb3ZlcmhlYWQgd291bGQgbm90IGFmZmVjdCB0aGUgTU1DIHBlcmZvcm1hbmNlLgorVGhlIGludGVudGlvbiBvZiBub24tYmxvY2tpbmcgKGFzeW5jaHJvbm91cykgTU1DIHJlcXVlc3RzIGlzIHRvIG1pbmltaXplIHRoZQordGltZSBiZXR3ZWVuIHdoZW4gYW4gTU1DIHJlcXVlc3QgZW5kcyBhbmQgYW5vdGhlciBNTUMgcmVxdWVzdCBiZWdpbnMuCitVc2luZyBtbWNfd2FpdF9mb3JfcmVxKCksIHRoZSBNTUMgY29udHJvbGxlciBpcyBpZGxlIHdoaWxlIGRtYV9tYXBfc2cgYW5kCitkbWFfdW5tYXBfc2cgYXJlIHByb2Nlc3NpbmcuIFVzaW5nIG5vbi1ibG9ja2luZyBNTUMgcmVxdWVzdHMgbWFrZXMgaXQKK3Bvc3NpYmxlIHRvIHByZXBhcmUgdGhlIGNhY2hlcyBmb3IgbmV4dCBqb2IgaW4gcGFyYWxsZWwgd2l0aCBhbiBhY3RpdmUKK01NQyByZXF1ZXN0LgorCitNTUMgYmxvY2sgZHJpdmVyCis9PT09PT09PT09PT09PT09CisKK1RoZSBtbWNfYmxrX2lzc3VlX3J3X3JxKCkgaW4gdGhlIE1NQyBibG9jayBkcml2ZXIgaXMgbWFkZSBub24tYmxvY2tpbmcuCitUaGUgaW5jcmVhc2UgaW4gdGhyb3VnaHB1dCBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIHRpbWUgaXQgdGFrZXMgdG8KK3ByZXBhcmUgKG1ham9yIHBhcnQgb2YgcHJlcGFyYXRpb25zIGFyZSBkbWFfbWFwX3NnKCkgYW5kIGRtYV91bm1hcF9zZygpKQorYSByZXF1ZXN0IGFuZCBob3cgZmFzdCB0aGUgbWVtb3J5IGlzLiBUaGUgZmFzdGVyIHRoZSBNTUMvU0QgaXMgdGhlCittb3JlIHNpZ25pZmljYW50IHRoZSBwcmVwYXJlIHJlcXVlc3QgdGltZSBiZWNvbWVzLiBSb3VnaGx5IHRoZSBleHBlY3RlZAorcGVyZm9ybWFuY2UgZ2FpbiBpcyA1JSBmb3IgbGFyZ2Ugd3JpdGVzIGFuZCAxMCUgb24gbGFyZ2UgcmVhZHMgb24gYSBMMiBjYWNoZQorcGxhdGZvcm0uIEluIHBvd2VyIHNhdmUgbW9kZSwgd2hlbiBjbG9ja3MgcnVuIG9uIGEgbG93ZXIgZnJlcXVlbmN5LCB0aGUgRE1BCitwcmVwYXJhdGlvbiBtYXkgY29zdCBldmVuIG1vcmUuIEFzIGxvbmcgYXMgdGhlc2Ugc2xvd2VyIHByZXBhcmF0aW9ucyBhcmUgcnVuCitpbiBwYXJhbGxlbCB3aXRoIHRoZSB0cmFuc2ZlciBwZXJmb3JtYW5jZSB3b24ndCBiZSBhZmZlY3RlZC4KKworRGV0YWlscyBvbiBtZWFzdXJlbWVudHMgZnJvbSBJT1pvbmUgYW5kIG1tY190ZXN0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaHR0cHM6Ly93aWtpLmxpbmFyby5vcmcvV29ya2luZ0dyb3Vwcy9LZXJuZWwvU3BlY3MvU3RvcmFnZVBlcmZNTUMtYXN5bmMtcmVxCisKK01NQyBjb3JlIEFQSSBleHRlbnNpb24KKz09PT09PT09PT09PT09PT09PT09PT0KKworVGhlcmUgaXMgb25lIG5ldyBwdWJsaWMgZnVuY3Rpb24gbW1jX3N0YXJ0X3JlcSgpLgorSXQgc3RhcnRzIGEgbmV3IE1NQyBjb21tYW5kIHJlcXVlc3QgZm9yIGEgaG9zdC4gVGhlIGZ1bmN0aW9uIGlzbid0Cit0cnVseSBub24tYmxvY2tpbmcuIElmIHRoZXJlIGlzIGFuIG9uZ29pbmcgYXN5bmMgcmVxdWVzdCBpdCB3YWl0cworZm9yIGNvbXBsZXRpb24gb2YgdGhhdCByZXF1ZXN0IGFuZCBzdGFydHMgdGhlIG5ldyBvbmUgYW5kIHJldHVybnMuIEl0Citkb2Vzbid0IHdhaXQgZm9yIHRoZSBuZXcgcmVxdWVzdCB0byBjb21wbGV0ZS4gSWYgdGhlcmUgaXMgbm8gb25nb2luZworcmVxdWVzdCBpdCBzdGFydHMgdGhlIG5ldyByZXF1ZXN0IGFuZCByZXR1cm5zIGltbWVkaWF0ZWx5LgorCitNTUMgaG9zdCBleHRlbnNpb25zCis9PT09PT09PT09PT09PT09PT09CisKK1RoZXJlIGFyZSB0d28gb3B0aW9uYWwgbWVtYmVycyBpbiB0aGUgbW1jX2hvc3Rfb3BzIC0tIHByZV9yZXEoKSBhbmQKK3Bvc3RfcmVxKCkgLS0gdGhhdCB0aGUgaG9zdCBkcml2ZXIgbWF5IGltcGxlbWVudCBpbiBvcmRlciB0byBtb3ZlIHdvcmsKK3RvIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGFjdHVhbCBtbWNfaG9zdF9vcHMucmVxdWVzdCgpIGZ1bmN0aW9uIGlzIGNhbGxlZC4KK0luIHRoZSBETUEgY2FzZSBwcmVfcmVxKCkgbWF5IGRvIGRtYV9tYXBfc2coKSBhbmQgcHJlcGFyZSB0aGUgRE1BCitkZXNjcmlwdG9yLCBhbmQgcG9zdF9yZXEoKSBydW5zIHRoZSBkbWFfdW5tYXBfc2coKS4KKworT3B0aW1pemUgZm9yIHRoZSBmaXJzdCByZXF1ZXN0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGZpcnN0IHJlcXVlc3QgaW4gYSBzZXJpZXMgb2YgcmVxdWVzdHMgY2FuJ3QgYmUgcHJlcGFyZWQgaW4gcGFyYWxsZWwKK3dpdGggdGhlIHByZXZpb3VzIHRyYW5zZmVyLCBzaW5jZSB0aGVyZSBpcyBubyBwcmV2aW91cyByZXF1ZXN0LgorVGhlIGFyZ3VtZW50IGlzX2ZpcnN0X3JlcSBpbiBwcmVfcmVxKCkgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gcHJldmlvdXMKK3JlcXVlc3QuIFRoZSBob3N0IGRyaXZlciBtYXkgb3B0aW1pemUgZm9yIHRoaXMgc2NlbmFyaW8gdG8gbWluaW1pemUKK3RoZSBwZXJmb3JtYW5jZSBsb3NzLiBBIHdheSB0byBvcHRpbWl6ZSBmb3IgdGhpcyBpcyB0byBzcGxpdCB0aGUgY3VycmVudAorcmVxdWVzdCBpbiB0d28gY2h1bmtzLCBwcmVwYXJlIHRoZSBmaXJzdCBjaHVuayBhbmQgc3RhcnQgdGhlIHJlcXVlc3QsCithbmQgZmluYWxseSBwcmVwYXJlIHRoZSBzZWNvbmQgY2h1bmsgYW5kIHN0YXJ0IHRoZSB0cmFuc2Zlci4KKworUHNldWRvY29kZSB0byBoYW5kbGUgaXNfZmlyc3RfcmVxIHNjZW5hcmlvIHdpdGggbWluaW1hbCBwcmVwYXJlIG92ZXJoZWFkOgorCitpZiAoaXNfZmlyc3RfcmVxICYmIHJlcS0+c2l6ZSA+IHRocmVzaG9sZCkKKyAgIC8qIHN0YXJ0IE1NQyB0cmFuc2ZlciBmb3IgdGhlIGNvbXBsZXRlIHRyYW5zZmVyIHNpemUgKi8KKyAgIG1tY19zdGFydF9jb21tYW5kKE1NQ19DTURfVFJBTlNGRVJfRlVMTF9TSVpFKTsKKworICAgLyoKKyAgICAqIEJlZ2luIHRvIHByZXBhcmUgRE1BIHdoaWxlIGNtZCBpcyBiZWluZyBwcm9jZXNzZWQgYnkgTU1DLgorICAgICogVGhlIGZpcnN0IGNodW5rIG9mIHRoZSByZXF1ZXN0IHNob3VsZCB0YWtlIHRoZSBzYW1lIHRpbWUKKyAgICAqIHRvIHByZXBhcmUgYXMgdGhlICJNTUMgcHJvY2VzcyBjb21tYW5kIHRpbWUiLgorICAgICogSWYgcHJlcGFyZSB0aW1lIGV4Y2VlZHMgTU1DIGNtZCB0aW1lCisgICAgKiB0aGUgdHJhbnNmZXIgaXMgZGVsYXllZCwgZ3Vlc3N0aW1hdGUgbWF4IDRrIGFzIGZpcnN0IGNodW5rIHNpemUuCisgICAgKi8KKyAgICBwcmVwYXJlXzFzdF9jaHVua19mb3JfZG1hKHJlcSk7CisgICAgLyogZmx1c2ggcGVuZGluZyBkZXNjIHRvIHRoZSBETUFDIChkbWFlbmdpbmUuaCkgKi8KKyAgICBkbWFfaXNzdWVfcGVuZGluZyhyZXEtPmRtYV9kZXNjKTsKKworICAgIHByZXBhcmVfMm5kX2NodW5rX2Zvcl9kbWEocmVxKTsKKyAgICAvKgorICAgICAqIFRoZSBzZWNvbmQgaXNzdWVfcGVuZGluZyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBNTUMgcnVucyBvdXQKKyAgICAgKiBvZiB0aGUgZmlyc3QgY2h1bmsuIElmIHRoZSBNTUMgcnVucyBvdXQgb2YgdGhlIGZpcnN0IGRhdGEgY2h1bmsKKyAgICAgKiBiZWZvcmUgdGhpcyBjYWxsLCB0aGUgdHJhbnNmZXIgaXMgZGVsYXllZC4KKyAgICAgKi8KKyAgICBkbWFfaXNzdWVfcGVuZGluZyhyZXEtPmRtYV9kZXNjKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pZmVuc2xhdmUuYyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pZmVuc2xhdmUuYwppbmRleCAyYmFjOTYxLi42NTk2OGZiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaWZlbnNsYXZlLmMKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lmZW5zbGF2ZS5jCkBAIC0yNjAsNyArMjYwLDcgQEAKIAkJY2FzZSAnVic6IG9wdF9WKys7IGV4Y2x1c2l2ZSsrOyBicmVhazsKIAogCQljYXNlICc/JzoKLQkJCWZwcmludGYoc3RkZXJyLCB1c2FnZV9tc2cpOworCQkJZnByaW50ZihzdGRlcnIsICIlcyIsIHVzYWdlX21zZyk7CiAJCQlyZXMgPSAyOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTI2OCwxMyArMjY4LDEzIEBACiAKIAkvKiBvcHRpb25zIGNoZWNrICovCiAJaWYgKGV4Y2x1c2l2ZSA+IDEpIHsKLQkJZnByaW50ZihzdGRlcnIsIHVzYWdlX21zZyk7CisJCWZwcmludGYoc3RkZXJyLCAiJXMiLCB1c2FnZV9tc2cpOwogCQlyZXMgPSAyOwogCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAob3B0X3YgfHwgb3B0X1YpIHsKLQkJcHJpbnRmKHZlcnNpb24pOworCQlwcmludGYoIiVzIiwgdmVyc2lvbik7CiAJCWlmIChvcHRfVikgewogCQkJcmVzID0gMDsKIAkJCWdvdG8gb3V0OwpAQCAtMjgyLDE0ICsyODIsMTQgQEAKIAl9CiAKIAlpZiAob3B0X3UpIHsKLQkJcHJpbnRmKHVzYWdlX21zZyk7CisJCXByaW50ZigiJXMiLCB1c2FnZV9tc2cpOwogCQlyZXMgPSAwOwogCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAob3B0X2gpIHsKLQkJcHJpbnRmKHVzYWdlX21zZyk7Ci0JCXByaW50ZihoZWxwX21zZyk7CisJCXByaW50ZigiJXMiLCB1c2FnZV9tc2cpOworCQlwcmludGYoIiVzIiwgaGVscF9tc2cpOwogCQlyZXMgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zMDksNyArMzA5LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9IGVsc2UgewogCQkJLyogSnVzdCBzaG93IHVzYWdlICovCi0JCQlmcHJpbnRmKHN0ZGVyciwgdXNhZ2VfbXNnKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCB1c2FnZV9tc2cpOwogCQkJcmVzID0gMjsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0zMjAsNyArMzIwLDcgQEAKIAltYXN0ZXJfaWZuYW1lID0gKnNwcCsrOwogCiAJaWYgKG1hc3Rlcl9pZm5hbWUgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgdXNhZ2VfbXNnKTsKKwkJZnByaW50ZihzdGRlcnIsICIlcyIsIHVzYWdlX21zZyk7CiAJCXJlcyA9IDI7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTMzOSw3ICszMzksNyBAQAogCiAJaWYgKHNsYXZlX2lmbmFtZSA9PSBOVUxMKSB7CiAJCWlmIChvcHRfZCB8fCBvcHRfYykgewotCQkJZnByaW50ZihzdGRlcnIsIHVzYWdlX21zZyk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgdXNhZ2VfbXNnKTsKIAkJCXJlcyA9IDI7CiAJCQlnb3RvIG91dDsKIAkJfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAppbmRleCBkM2Q2NTNhLi5kYjJhNDA2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dApAQCAtMTA2LDE2ICsxMDYsNiBAQAogCXdoZW4gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwb29sIGlzIHZlcnkgc21hbGwpLgogCU1lYXN1cmVkIGluIHNlY29uZHMuCiAKLWluZXRfcGVlcl9nY19taW50aW1lIC0gSU5URUdFUgotCU1pbmltdW0gaW50ZXJ2YWwgYmV0d2VlbiBnYXJiYWdlIGNvbGxlY3Rpb24gcGFzc2VzLiAgVGhpcyBpbnRlcnZhbCBpcwotCWluIGVmZmVjdCB1bmRlciBoaWdoIG1lbW9yeSBwcmVzc3VyZSBvbiB0aGUgcG9vbC4KLQlNZWFzdXJlZCBpbiBzZWNvbmRzLgotCi1pbmV0X3BlZXJfZ2NfbWF4dGltZSAtIElOVEVHRVIKLQlNaW5pbXVtIGludGVydmFsIGJldHdlZW4gZ2FyYmFnZSBjb2xsZWN0aW9uIHBhc3Nlcy4gIFRoaXMgaW50ZXJ2YWwgaXMKLQlpbiBlZmZlY3QgdW5kZXIgbG93IChvciBhYnNlbnQpIG1lbW9yeSBwcmVzc3VyZSBvbiB0aGUgcG9vbC4KLQlNZWFzdXJlZCBpbiBzZWNvbmRzLgotCiBUQ1AgdmFyaWFibGVzOgogCiBzb21heGNvbm4gLSBJTlRFR0VSCkBAIC0zNDYsNyArMzM2LDcgQEAKIAl3aGVuIFJUTyByZXRyYW5zbWlzc2lvbnMgcmVtYWluIHVuYWNrbm93bGVkZ2VkLgogCVNlZSB0Y3BfcmV0cmllczIgZm9yIG1vcmUgZGV0YWlscy4KIAotCVRoZSBkZWZhdWx0IHZhbHVlIGlzIDcuCisJVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4KIAlJZiB5b3VyIG1hY2hpbmUgaXMgYSBsb2FkZWQgV0VCIHNlcnZlciwKIAl5b3Ugc2hvdWxkIHRoaW5rIGFib3V0IGxvd2VyaW5nIHRoaXMgdmFsdWUsIHN1Y2ggc29ja2V0cwogCW1heSBjb25zdW1lIHNpZ25pZmljYW50IHJlc291cmNlcy4gQ2YuIHRjcF9tYXhfb3JwaGFucy4KQEAgLTM5NCw3ICszODQsNyBAQAogCW1pbjogTWluaW1hbCBzaXplIG9mIHJlY2VpdmUgYnVmZmVyIHVzZWQgYnkgVENQIHNvY2tldHMuCiAJSXQgaXMgZ3VhcmFudGVlZCB0byBlYWNoIFRDUCBzb2NrZXQsIGV2ZW4gdW5kZXIgbW9kZXJhdGUgbWVtb3J5CiAJcHJlc3N1cmUuCi0JRGVmYXVsdDogOEsKKwlEZWZhdWx0OiAxIHBhZ2UKIAogCWRlZmF1bHQ6IGluaXRpYWwgc2l6ZSBvZiByZWNlaXZlIGJ1ZmZlciB1c2VkIGJ5IFRDUCBzb2NrZXRzLgogCVRoaXMgdmFsdWUgb3ZlcnJpZGVzIG5ldC5jb3JlLnJtZW1fZGVmYXVsdCB1c2VkIGJ5IG90aGVyIHByb3RvY29scy4KQEAgLTQ4Myw3ICs0NzMsNyBAQAogdGNwX3dtZW0gLSB2ZWN0b3Igb2YgMyBJTlRFR0VSczogbWluLCBkZWZhdWx0LCBtYXgKIAltaW46IEFtb3VudCBvZiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIHNlbmQgYnVmZmVycyBmb3IgVENQIHNvY2tldHMuCiAJRWFjaCBUQ1Agc29ja2V0IGhhcyByaWdodHMgdG8gdXNlIGl0IGR1ZSB0byBmYWN0IG9mIGl0cyBiaXJ0aC4KLQlEZWZhdWx0OiA0SworCURlZmF1bHQ6IDEgcGFnZQogCiAJZGVmYXVsdDogaW5pdGlhbCBzaXplIG9mIHNlbmQgYnVmZmVyIHVzZWQgYnkgVENQIHNvY2tldHMuICBUaGlzCiAJdmFsdWUgb3ZlcnJpZGVzIG5ldC5jb3JlLndtZW1fZGVmYXVsdCB1c2VkIGJ5IG90aGVyIHByb3RvY29scy4KQEAgLTU1MywxMyArNTQzLDEzIEBACiAJTWluaW1hbCBzaXplIG9mIHJlY2VpdmUgYnVmZmVyIHVzZWQgYnkgVURQIHNvY2tldHMgaW4gbW9kZXJhdGlvbi4KIAlFYWNoIFVEUCBzb2NrZXQgaXMgYWJsZSB0byB1c2UgdGhlIHNpemUgZm9yIHJlY2VpdmluZyBkYXRhLCBldmVuIGlmCiAJdG90YWwgcGFnZXMgb2YgVURQIHNvY2tldHMgZXhjZWVkIHVkcF9tZW0gcHJlc3N1cmUuIFRoZSB1bml0IGlzIGJ5dGUuCi0JRGVmYXVsdDogNDA5NgorCURlZmF1bHQ6IDEgcGFnZQogCiB1ZHBfd21lbV9taW4gLSBJTlRFR0VSCiAJTWluaW1hbCBzaXplIG9mIHNlbmQgYnVmZmVyIHVzZWQgYnkgVURQIHNvY2tldHMgaW4gbW9kZXJhdGlvbi4KIAlFYWNoIFVEUCBzb2NrZXQgaXMgYWJsZSB0byB1c2UgdGhlIHNpemUgZm9yIHNlbmRpbmcgZGF0YSwgZXZlbiBpZgogCXRvdGFsIHBhZ2VzIG9mIFVEUCBzb2NrZXRzIGV4Y2VlZCB1ZHBfbWVtIHByZXNzdXJlLiBUaGUgdW5pdCBpcyBieXRlLgotCURlZmF1bHQ6IDQwOTYKKwlEZWZhdWx0OiAxIHBhZ2UKIAogQ0lQU092NCBWYXJpYWJsZXM6CiAKQEAgLTE0NjUsMTAgKzE0NTUsMTcgQEAKIAlEZWZhdWx0IGlzIGNhbGN1bGF0ZWQgYXQgYm9vdCB0aW1lIGZyb20gYW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnkuCiAKIHNjdHBfcm1lbSAtIHZlY3RvciBvZiAzIElOVEVHRVJzOiBtaW4sIGRlZmF1bHQsIG1heAotCVNlZSB0Y3Bfcm1lbSBmb3IgYSBkZXNjcmlwdGlvbi4KKwlPbmx5IHRoZSBmaXJzdCB2YWx1ZSAoIm1pbiIpIGlzIHVzZWQsICJkZWZhdWx0IiBhbmQgIm1heCIgYXJlCisJaWdub3JlZC4KKworCW1pbjogTWluaW1hbCBzaXplIG9mIHJlY2VpdmUgYnVmZmVyIHVzZWQgYnkgU0NUUCBzb2NrZXQuCisJSXQgaXMgZ3VhcmFudGVlZCB0byBlYWNoIFNDVFAgc29ja2V0IChidXQgbm90IGFzc29jaWF0aW9uKSBldmVuCisJdW5kZXIgbW9kZXJhdGUgbWVtb3J5IHByZXNzdXJlLgorCisJRGVmYXVsdDogMSBwYWdlCiAKIHNjdHBfd21lbSAgLSB2ZWN0b3Igb2YgMyBJTlRFR0VSczogbWluLCBkZWZhdWx0LCBtYXgKLQlTZWUgdGNwX3dtZW0gZm9yIGEgZGVzY3JpcHRpb24uCisJQ3VycmVudGx5IHRoaXMgdHVuYWJsZSBoYXMgbm8gZWZmZWN0LgogCiBhZGRyX3Njb3BlX3BvbGljeSAtIElOVEVHRVIKIAlDb250cm9sIElQdjQgYWRkcmVzcyBzY29waW5nIC0gZHJhZnQtc3Rld2FydC10c3Z3Zy1zY3RwLWlwdjQtMDAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXRkZXYtZmVhdHVyZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldGRldi1mZWF0dXJlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxYzBkYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXRkZXYtZmVhdHVyZXMudHh0CkBAIC0wLDAgKzEsMTU0IEBACitOZXRkZXYgZmVhdHVyZXMgbWVzcyBhbmQgaG93IHRvIGdldCBvdXQgZnJvbSBpdCBhbGl2ZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQXV0aG9yOgorCU1pY2hhxYIgTWlyb3PFgmF3IDxtaXJxLWxpbnV4QHJlcmUucW1xbS5wbD4KKworCisKKyBQYXJ0IEk6IEZlYXR1cmUgc2V0cworPT09PT09PT09PT09PT09PT09PT09PQorCitMb25nIGdvbmUgYXJlIHRoZSBkYXlzIHdoZW4gYSBuZXR3b3JrIGNhcmQgd291bGQganVzdCB0YWtlIGFuZCBnaXZlIHBhY2tldHMKK3ZlcmJhdGltLiAgVG9kYXkncyBkZXZpY2VzIGFkZCBtdWx0aXBsZSBmZWF0dXJlcyBhbmQgYnVncyAocmVhZDogb2ZmbG9hZHMpCit0aGF0IHJlbGlldmUgYW4gT1Mgb2YgdmFyaW91cyB0YXNrcyBsaWtlIGdlbmVyYXRpbmcgYW5kIGNoZWNraW5nIGNoZWNrc3VtcywKK3NwbGl0dGluZyBwYWNrZXRzLCBjbGFzc2lmeWluZyB0aGVtLiAgVGhvc2UgY2FwYWJpbGl0aWVzIGFuZCB0aGVpciBzdGF0ZQorYXJlIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIG5ldGRldiBmZWF0dXJlcyBpbiBMaW51eCBrZXJuZWwgd29ybGQuCisKK1RoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgc2V0cyBvZiBmZWF0dXJlcyByZWxldmFudCB0byB0aGUgZHJpdmVyLCBhbmQKK29uZSB1c2VkIGludGVybmFsbHkgYnkgbmV0d29yayBjb3JlOgorCisgMS4gbmV0ZGV2LT5od19mZWF0dXJlcyBzZXQgY29udGFpbnMgZmVhdHVyZXMgd2hvc2Ugc3RhdGUgbWF5IHBvc3NpYmx5CisgICAgYmUgY2hhbmdlZCAoZW5hYmxlZCBvciBkaXNhYmxlZCkgZm9yIGEgcGFydGljdWxhciBkZXZpY2UgYnkgdXNlcidzCisgICAgcmVxdWVzdC4gIFRoaXMgc2V0IHNob3VsZCBiZSBpbml0aWFsaXplZCBpbiBuZG9faW5pdCBjYWxsYmFjayBhbmQgbm90CisgICAgY2hhbmdlZCBsYXRlci4KKworIDIuIG5ldGRldi0+ZmVhdHVyZXMgc2V0IGNvbnRhaW5zIGZlYXR1cmVzIHdoaWNoIGFyZSBjdXJyZW50bHkgZW5hYmxlZAorICAgIGZvciBhIGRldmljZS4gIFRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgb25seSBieSBuZXR3b3JrIGNvcmUgb3IgaW4KKyAgICBlcnJvciBwYXRocyBvZiBuZG9fc2V0X2ZlYXR1cmVzIGNhbGxiYWNrLgorCisgMy4gbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHNldCBjb250YWlucyBmZWF0dXJlcyB3aG9zZSBzdGF0ZSBpcyBpbmhlcml0ZWQKKyAgICBieSBjaGlsZCBWTEFOIGRldmljZXMgKGxpbWl0cyBuZXRkZXYtPmZlYXR1cmVzIHNldCkuICBUaGlzIGlzIGN1cnJlbnRseQorICAgIHVzZWQgZm9yIGFsbCBWTEFOIGRldmljZXMgd2hldGhlciB0YWdzIGFyZSBzdHJpcHBlZCBvciBpbnNlcnRlZCBpbgorICAgIGhhcmR3YXJlIG9yIHNvZnR3YXJlLgorCisgNC4gbmV0ZGV2LT53YW50ZWRfZmVhdHVyZXMgc2V0IGNvbnRhaW5zIGZlYXR1cmUgc2V0IHJlcXVlc3RlZCBieSB1c2VyLgorICAgIFRoaXMgc2V0IGlzIGZpbHRlcmVkIGJ5IG5kb19maXhfZmVhdHVyZXMgY2FsbGJhY2sgd2hlbmV2ZXIgaXQgb3IKKyAgICBzb21lIGRldmljZS1zcGVjaWZpYyBjb25kaXRpb25zIGNoYW5nZS4gVGhpcyBzZXQgaXMgaW50ZXJuYWwgdG8KKyAgICBuZXR3b3JraW5nIGNvcmUgYW5kIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBpbiBkcml2ZXJzLgorCisKKworIFBhcnQgSUk6IENvbnRyb2xsaW5nIGVuYWJsZWQgZmVhdHVyZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXaGVuIGN1cnJlbnQgZmVhdHVyZSBzZXQgKG5ldGRldi0+ZmVhdHVyZXMpIGlzIHRvIGJlIGNoYW5nZWQsIG5ldyBzZXQKK2lzIGNhbGN1bGF0ZWQgYW5kIGZpbHRlcmVkIGJ5IGNhbGxpbmcgbmRvX2ZpeF9mZWF0dXJlcyBjYWxsYmFjaworYW5kIG5ldGRldl9maXhfZmVhdHVyZXMoKS4gSWYgdGhlIHJlc3VsdGluZyBzZXQgZGlmZmVycyBmcm9tIGN1cnJlbnQKK3NldCwgaXQgaXMgcGFzc2VkIHRvIG5kb19zZXRfZmVhdHVyZXMgY2FsbGJhY2sgYW5kIChpZiB0aGUgY2FsbGJhY2sKK3JldHVybnMgc3VjY2VzcykgcmVwbGFjZXMgdmFsdWUgc3RvcmVkIGluIG5ldGRldi0+ZmVhdHVyZXMuCitORVRERVZfRkVBVF9DSEFOR0Ugbm90aWZpY2F0aW9uIGlzIGlzc3VlZCBhZnRlciB0aGF0IHdoZW5ldmVyIGN1cnJlbnQKK3NldCBtaWdodCBoYXZlIGNoYW5nZWQuCisKK1RoZSBmb2xsb3dpbmcgZXZlbnRzIHRyaWdnZXIgcmVjYWxjdWxhdGlvbjoKKyAxLiBkZXZpY2UncyByZWdpc3RyYXRpb24sIGFmdGVyIG5kb19pbml0IHJldHVybmVkIHN1Y2Nlc3MKKyAyLiB1c2VyIHJlcXVlc3RlZCBjaGFuZ2VzIGluIGZlYXR1cmVzIHN0YXRlCisgMy4gbmV0ZGV2X3VwZGF0ZV9mZWF0dXJlcygpIGlzIGNhbGxlZAorCituZG9fKl9mZWF0dXJlcyBjYWxsYmFja3MgYXJlIGNhbGxlZCB3aXRoIHJ0bmxfbG9jayBoZWxkLiBNaXNzaW5nIGNhbGxiYWNrcworYXJlIHRyZWF0ZWQgYXMgYWx3YXlzIHJldHVybmluZyBzdWNjZXNzLgorCitBIGRyaXZlciB0aGF0IHdhbnRzIHRvIHRyaWdnZXIgcmVjYWxjdWxhdGlvbiBtdXN0IGRvIHNvIGJ5IGNhbGxpbmcKK25ldGRldl91cGRhdGVfZmVhdHVyZXMoKSB3aGlsZSBob2xkaW5nIHJ0bmxfbG9jay4gVGhpcyBzaG91bGQgbm90IGJlIGRvbmUKK2Zyb20gbmRvXypfZmVhdHVyZXMgY2FsbGJhY2tzLiBuZXRkZXYtPmZlYXR1cmVzIHNob3VsZCBub3QgYmUgbW9kaWZpZWQgYnkKK2RyaXZlciBleGNlcHQgYnkgbWVhbnMgb2YgbmRvX2ZpeF9mZWF0dXJlcyBjYWxsYmFjay4KKworCisKKyBQYXJ0IElJSTogSW1wbGVtZW50YXRpb24gaGludHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAqIG5kb19maXhfZmVhdHVyZXM6CisKK0FsbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBmZWF0dXJlcyBzaG91bGQgYmUgcmVzb2x2ZWQgaGVyZS4gVGhlIHJlc3VsdGluZworc2V0IGNhbiBiZSByZWR1Y2VkIGZ1cnRoZXIgYnkgbmV0d29ya2luZyBjb3JlIGltcG9zZWQgbGltaXRhdGlvbnMgKGFzIGNvZGVkCitpbiBuZXRkZXZfZml4X2ZlYXR1cmVzKCkpLiBGb3IgdGhpcyByZWFzb24gaXQgaXMgc2FmZXIgdG8gZGlzYWJsZSBhIGZlYXR1cmUKK3doZW4gaXRzIGRlcGVuZGVuY2llcyBhcmUgbm90IG1ldCBpbnN0ZWFkIG9mIGZvcmNpbmcgdGhlIGRlcGVuZGVuY3kgb24uCisKK1RoaXMgY2FsbGJhY2sgc2hvdWxkIG5vdCBtb2RpZnkgaGFyZHdhcmUgbm9yIGRyaXZlciBzdGF0ZSAoc2hvdWxkIGJlCitzdGF0ZWxlc3MpLiAgSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBiZXR3ZWVuIHN1Y2Nlc3NpdmUKK25kb19zZXRfZmVhdHVyZXMgY2FsbHMuCisKK0NhbGxiYWNrIG11c3Qgbm90IGFsdGVyIGZlYXR1cmVzIGNvbnRhaW5lZCBpbiBORVRJRl9GX1NPRlRfRkVBVFVSRVMgb3IKK05FVElGX0ZfTkVWRVJfQ0hBTkdFIHNldHMuIFRoZSBleGNlcHRpb24gaXMgTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQgYnV0CitjYXJlIG11c3QgYmUgdGFrZW4gYXMgdGhlIGNoYW5nZSB3b24ndCBhZmZlY3QgYWxyZWFkeSBjb25maWd1cmVkIFZMQU5zLgorCisgKiBuZG9fc2V0X2ZlYXR1cmVzOgorCitIYXJkd2FyZSBzaG91bGQgYmUgcmVjb25maWd1cmVkIHRvIG1hdGNoIHBhc3NlZCBmZWF0dXJlIHNldC4gVGhlIHNldAorc2hvdWxkIG5vdCBiZSBhbHRlcmVkIHVubGVzcyBzb21lIGVycm9yIGNvbmRpdGlvbiBoYXBwZW5zIHRoYXQgY2FuJ3QKK2JlIHJlbGlhYmx5IGRldGVjdGVkIGluIG5kb19maXhfZmVhdHVyZXMuIEluIHRoaXMgY2FzZSwgdGhlIGNhbGxiYWNrCitzaG91bGQgdXBkYXRlIG5ldGRldi0+ZmVhdHVyZXMgdG8gbWF0Y2ggcmVzdWx0aW5nIGhhcmR3YXJlIHN0YXRlLgorRXJyb3JzIHJldHVybmVkIGFyZSBub3QgKGFuZCBjYW5ub3QgYmUpIHByb3BhZ2F0ZWQgYW55d2hlcmUgZXhjZXB0IGRtZXNnLgorKE5vdGU6IHN1Y2Nlc3NmdWwgcmV0dXJuIGlzIHplcm8sID4wIG1lYW5zIHNpbGVudCBlcnJvci4pCisKKworCisgUGFydCBJVjogRmVhdHVyZXMKKz09PT09PT09PT09PT09PT09PT0KKworRm9yIGN1cnJlbnQgbGlzdCBvZiBmZWF0dXJlcywgc2VlIGluY2x1ZGUvbGludXgvbmV0ZGV2X2ZlYXR1cmVzLmguCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNlbWFudGljcyBvZiBzb21lIG9mIHRoZW0uCisKKyAqIFRyYW5zbWl0IGNoZWNrc3VtbWluZworCitGb3IgY29tcGxldGUgZGVzY3JpcHRpb24sIHNlZSBjb21tZW50cyBuZWFyIHRoZSB0b3Agb2YgaW5jbHVkZS9saW51eC9za2J1ZmYuaC4KKworTm90ZTogTkVUSUZfRl9IV19DU1VNIGlzIGEgc3VwZXJzZXQgb2YgTkVUSUZfRl9JUF9DU1VNICsgTkVUSUZfRl9JUFY2X0NTVU0uCitJdCBtZWFucyB0aGF0IGRldmljZSBjYW4gZmlsbCBUQ1AvVURQLWxpa2UgY2hlY2tzdW0gYW55d2hlcmUgaW4gdGhlIHBhY2tldHMKK3doYXRldmVyIGhlYWRlcnMgdGhlcmUgbWlnaHQgYmUuCisKKyAqIFRyYW5zbWl0IFRDUCBzZWdtZW50YXRpb24gb2ZmbG9hZAorCitORVRJRl9GX1RTT19FQ04gbWVhbnMgdGhhdCBoYXJkd2FyZSBjYW4gcHJvcGVybHkgc3BsaXQgcGFja2V0cyB3aXRoIENXUiBiaXQKK3NldCwgYmUgaXQgVENQdjQgKHdoZW4gTkVUSUZfRl9UU08gaXMgZW5hYmxlZCkgb3IgVENQdjYgKE5FVElGX0ZfVFNPNikuCisKKyAqIFRyYW5zbWl0IERNQSBmcm9tIGhpZ2ggbWVtb3J5CisKK09uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIHJlbGV2YW50LCBORVRJRl9GX0hJR0hETUEgc2lnbmFscyB0aGF0CituZG9fc3RhcnRfeG1pdCBjYW4gaGFuZGxlIHNrYnMgd2l0aCBmcmFncyBpbiBoaWdoIG1lbW9yeS4KKworICogVHJhbnNtaXQgc2NhdHRlci1nYXRoZXIKKworVGhvc2UgZmVhdHVyZXMgc2F5IHRoYXQgbmRvX3N0YXJ0X3htaXQgY2FuIGhhbmRsZSBmcmFnbWVudGVkIHNrYnM6CitORVRJRl9GX1NHIC0tLSBwYWdlZCBza2JzIChza2Jfc2hpbmZvKCktPmZyYWdzKSwgTkVUSUZfRl9GUkFHTElTVCAtLS0KK2NoYWluZWQgc2ticyAoc2tiLT5uZXh0L3ByZXYgbGlzdCkuCisKKyAqIFNvZnR3YXJlIGZlYXR1cmVzCisKK0ZlYXR1cmVzIGNvbnRhaW5lZCBpbiBORVRJRl9GX1NPRlRfRkVBVFVSRVMgYXJlIGZlYXR1cmVzIG9mIG5ldHdvcmtpbmcKK3N0YWNrLiBEcml2ZXIgc2hvdWxkIG5vdCBjaGFuZ2UgYmVoYXZpb3VyIGJhc2VkIG9uIHRoZW0uCisKKyAqIExMVFggZHJpdmVyIChkZXByZWNhdGVkIGZvciBoYXJkd2FyZSBkcml2ZXJzKQorCitORVRJRl9GX0xMVFggc2hvdWxkIGJlIHNldCBpbiBkcml2ZXJzIHRoYXQgaW1wbGVtZW50IHRoZWlyIG93biBsb2NraW5nIGluCit0cmFuc21pdCBwYXRoIG9yIGRvbid0IG5lZWQgbG9ja2luZyBhdCBhbGwgKGUuZy4gc29mdHdhcmUgdHVubmVscykuCitJbiBuZG9fc3RhcnRfeG1pdCwgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGEgdHJ5X2xvY2sgYW5kIHJldHVybgorTkVUREVWX1RYX0xPQ0tFRCB3aGVuIHRoZSBzcGluIGxvY2sgZmFpbHMuICBUaGUgbG9ja2luZyBzaG91bGQgYWxzbyBwcm9wZXJseQorcHJvdGVjdCBhZ2FpbnN0IG90aGVyIGNhbGxiYWNrcyAodGhlIHJ1bGVzIHlvdSBuZWVkIHRvIGZpbmQgb3V0KS4KKworRG9uJ3QgdXNlIGl0IGZvciBuZXcgZHJpdmVycy4KKworICogbmV0bnMtbG9jYWwgZGV2aWNlCisKK05FVElGX0ZfTkVUTlNfTE9DQUwgaXMgc2V0IGZvciBkZXZpY2VzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHRvIG1vdmUgYmV0d2VlbgorbmV0d29yayBuYW1lc3BhY2VzIChlLmcuIGxvb3BiYWNrKS4KKworRG9uJ3QgdXNlIGl0IGluIGRyaXZlcnMuCisKKyAqIFZMQU4gY2hhbGxlbmdlZAorCitORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRCBzaG91bGQgYmUgc2V0IGZvciBkZXZpY2VzIHdoaWNoIGNhbid0IGNvcGUgd2l0aCBWTEFOCitoZWFkZXJzLiBTb21lIGRyaXZlcnMgc2V0IHRoaXMgYmVjYXVzZSB0aGUgY2FyZHMgY2FuJ3QgaGFuZGxlIHRoZSBiaWdnZXIgTVRVLgorW0ZJWE1FOiBUaG9zZSBjYXNlcyBjb3VsZCBiZSBmaXhlZCBpbiBWTEFOIGNvZGUgYnkgYWxsb3dpbmcgb25seSByZWR1Y2VkLU1UVQorVkxBTnMuIFRoaXMgbWF5IGJlIG5vdCB1c2VmdWwsIHRob3VnaC5dCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmZjLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGMyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmZjLnR4dApAQCAtMCwwICsxLDEyOCBAQAorTGludXggTkZDIHN1YnN5c3RlbQorPT09PT09PT09PT09PT09PT09PQorCitUaGUgTmVhciBGaWVsZCBDb21tdW5pY2F0aW9uIChORkMpIHN1YnN5c3RlbSBpcyByZXF1aXJlZCB0byBzdGFuZGFyZGl6ZSB0aGUKK05GQyBkZXZpY2UgZHJpdmVycyBkZXZlbG9wbWVudCBhbmQgdG8gY3JlYXRlIGFuIHVuaWZpZWQgdXNlcnNwYWNlIGludGVyZmFjZS4KKworVGhpcyBkb2N1bWVudCBjb3ZlcnMgdGhlIGFyY2hpdGVjdHVyZSBvdmVydmlldywgdGhlIGRldmljZSBkcml2ZXIgaW50ZXJmYWNlCitkZXNjcmlwdGlvbiBhbmQgdGhlIHVzZXJzcGFjZSBpbnRlcmZhY2UgZGVzY3JpcHRpb24uCisKK0FyY2hpdGVjdHVyZSBvdmVydmlldworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBORkMgc3Vic3lzdGVtIGlzIHJlc3BvbnNpYmxlIGZvcjoKKyAgICAgIC0gTkZDIGFkYXB0ZXJzIG1hbmFnZW1lbnQ7CisgICAgICAtIFBvbGxpbmcgZm9yIHRhcmdldHM7CisgICAgICAtIExvdy1sZXZlbCBkYXRhIGV4Y2hhbmdlOworCitUaGUgc3Vic3lzdGVtIGlzIGRpdmlkZWQgaW4gc29tZSBwYXJ0cy4gVGhlICdjb3JlJyBpcyByZXNwb25zaWJsZSBmb3IKK3Byb3ZpZGluZyB0aGUgZGV2aWNlIGRyaXZlciBpbnRlcmZhY2UuIE9uIHRoZSBvdGhlciBzaWRlLCBpdCBpcyBhbHNvCityZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGFuIGludGVyZmFjZSB0byBjb250cm9sIG9wZXJhdGlvbnMgYW5kIGxvdy1sZXZlbAorZGF0YSBleGNoYW5nZS4KKworVGhlIGNvbnRyb2wgb3BlcmF0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIHVzZXJzcGFjZSB2aWEgZ2VuZXJpYyBuZXRsaW5rLgorCitUaGUgbG93LWxldmVsIGRhdGEgZXhjaGFuZ2UgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IHRoZSBuZXcgc29ja2V0IGZhbWlseQorUEZfTkZDLiBUaGUgTkZDX1NPQ0tQUk9UT19SQVcgcGVyZm9ybXMgcmF3IGNvbW11bmljYXRpb24gd2l0aCBORkMgdGFyZ2V0cy4KKworCisgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgIHwgICAgICAgICAgICAgIFVTRVIgU1BBQ0UgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgfCBsb3ctbGV2ZWwgICAgICAgICAgICAgfCBjb250cm9sCisgICAgICAgICAgICAgICAgIHwgZGF0YSBleGNoYW5nZSAgICAgICAgIHwgb3BlcmF0aW9ucworICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHYKKyAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgfCBBRl9ORkMgICAgICAgICAgIHwgIG5ldGxpbmsgIHwKKyAgICAgICAgICAgICAgICAgfCBzb2NrZXQgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgfCByYXcgICAgICAgICAgICAgICAgICAgXgorICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgIHYKKyAgICAgICAgICAgICArLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICB8IHJhd3NvY2sgfCA8LS0tLS0tLS0+IHwgICBjb3JlICAgIHwKKyAgICAgICAgICAgICArLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIGRyaXZlciAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKworRGV2aWNlIERyaXZlciBJbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gcmVnaXN0ZXJpbmcgb24gdGhlIE5GQyBzdWJzeXN0ZW0sIHRoZSBkZXZpY2UgZHJpdmVyIG11c3QgaW5mb3JtIHRoZSBjb3JlCitvZiB0aGUgc2V0IG9mIHN1cHBvcnRlZCBORkMgcHJvdG9jb2xzIGFuZCB0aGUgc2V0IG9mIG9wcyBjYWxsYmFja3MuIFRoZSBvcHMKK2NhbGxiYWNrcyB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYXJlIHRoZSBmb2xsb3dpbmc6CisKKyogc3RhcnRfcG9sbCAtIHNldHVwIHRoZSBkZXZpY2UgdG8gcG9sbCBmb3IgdGFyZ2V0cworKiBzdG9wX3BvbGwgLSBzdG9wIG9uIHByb2dyZXNzIHBvbGxpbmcgb3BlcmF0aW9uCisqIGFjdGl2YXRlX3RhcmdldCAtIHNlbGVjdCBhbmQgaW5pdGlhbGl6ZSBvbmUgb2YgdGhlIHRhcmdldHMgZm91bmQKKyogZGVhY3RpdmF0ZV90YXJnZXQgLSBkZXNlbGVjdCBhbmQgZGVpbml0aWFsaXplIHRoZSBzZWxlY3RlZCB0YXJnZXQKKyogZGF0YV9leGNoYW5nZSAtIHNlbmQgZGF0YSBhbmQgcmVjZWl2ZSB0aGUgcmVzcG9uc2UgKHRyYW5zY2VpdmUgb3BlcmF0aW9uKQorCitVc2Vyc3BhY2UgaW50ZXJmYWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgdXNlcnNwYWNlIGludGVyZmFjZSBpcyBkaXZpZGVkIGluIGNvbnRyb2wgb3BlcmF0aW9ucyBhbmQgbG93LWxldmVsIGRhdGEKK2V4Y2hhbmdlIG9wZXJhdGlvbi4KKworQ09OVFJPTCBPUEVSQVRJT05TOgorCitHZW5lcmljIG5ldGxpbmsgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSB0byB0aGUgY29udHJvbCBvcGVyYXRpb25zLgorVGhlIG9wZXJhdGlvbnMgYXJlIGNvbXBvc2VkIGJ5IGNvbW1hbmRzIGFuZCBldmVudHMsIGFsbCBsaXN0ZWQgYmVsb3c6CisKKyogTkZDX0NNRF9HRVRfREVWSUNFIC0gZ2V0IHNwZWNpZmljIGRldmljZSBpbmZvIG9yIGR1bXAgdGhlIGRldmljZSBsaXN0CisqIE5GQ19DTURfU1RBUlRfUE9MTCAtIHNldHVwIGEgc3BlY2lmaWMgZGV2aWNlIHRvIHBvbGxpbmcgZm9yIHRhcmdldHMKKyogTkZDX0NNRF9TVE9QX1BPTEwgLSBzdG9wIHRoZSBwb2xsaW5nIG9wZXJhdGlvbiBpbiBhIHNwZWNpZmljIGRldmljZQorKiBORkNfQ01EX0dFVF9UQVJHRVQgLSBkdW1wIHRoZSBsaXN0IG9mIHRhcmdldHMgZm91bmQgYnkgYSBzcGVjaWZpYyBkZXZpY2UKKworKiBORkNfRVZFTlRfREVWSUNFX0FEREVEIC0gcmVwb3J0cyBhbiBORkMgZGV2aWNlIGFkZGl0aW9uCisqIE5GQ19FVkVOVF9ERVZJQ0VfUkVNT1ZFRCAtIHJlcG9ydHMgYW4gTkZDIGRldmljZSByZW1vdmFsCisqIE5GQ19FVkVOVF9UQVJHRVRTX0ZPVU5EIC0gcmVwb3J0cyBTVEFSVF9QT0xMIHJlc3VsdHMgd2hlbiAxIG9yIG1vcmUgdGFyZ2V0cworYXJlIGZvdW5kCisKK1RoZSB1c2VyIG11c3QgY2FsbCBTVEFSVF9QT0xMIHRvIHBvbGwgZm9yIE5GQyB0YXJnZXRzLCBwYXNzaW5nIHRoZSBkZXNpcmVkIE5GQworcHJvdG9jb2xzIHRocm91Z2ggTkZDX0FUVFJfUFJPVE9DT0xTIGF0dHJpYnV0ZS4gVGhlIGRldmljZSByZW1haW5zIGluIHBvbGxpbmcKK3N0YXRlIHVudGlsIGl0IGZpbmRzIGFueSB0YXJnZXQuIEhvd2V2ZXIsIHRoZSB1c2VyIGNhbiBzdG9wIHRoZSBwb2xsaW5nCitvcGVyYXRpb24gYnkgY2FsbGluZyBTVE9QX1BPTEwgY29tbWFuZC4gSW4gdGhpcyBjYXNlLCBpdCB3aWxsIGJlIGNoZWNrZWQgaWYKK3RoZSByZXF1ZXN0ZXIgb2YgU1RPUF9QT0xMIGlzIHRoZSBzYW1lIG9mIFNUQVJUX1BPTEwuCisKK0lmIHRoZSBwb2xsaW5nIG9wZXJhdGlvbiBmaW5kcyBvbmUgb3IgbW9yZSB0YXJnZXRzLCB0aGUgZXZlbnQgVEFSR0VUU19GT1VORCBpcworc2VudCAoaW5jbHVkaW5nIHRoZSBkZXZpY2UgaWQpLiBUaGUgdXNlciBtdXN0IGNhbGwgR0VUX1RBUkdFVCB0byBnZXQgdGhlIGxpc3Qgb2YKK2FsbCB0YXJnZXRzIGZvdW5kIGJ5IHN1Y2ggZGV2aWNlLiBFYWNoIHJlcGx5IG1lc3NhZ2UgaGFzIHRhcmdldCBhdHRyaWJ1dGVzIHdpdGgKK3JlbGV2YW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN1cHBvcnRlZCBORkMgcHJvdG9jb2xzLgorCitBbGwgcG9sbGluZyBvcGVyYXRpb25zIHJlcXVlc3RlZCB0aHJvdWdoIG9uZSBuZXRsaW5rIHNvY2tldCBhcmUgc3RvcHBlZCB3aGVuCitpdCdzIGNsb3NlZC4KKworTE9XLUxFVkVMIERBVEEgRVhDSEFOR0U6CisKK1RoZSB1c2Vyc3BhY2UgbXVzdCB1c2UgUEZfTkZDIHNvY2tldHMgdG8gcGVyZm9ybSBhbnkgZGF0YSBjb21tdW5pY2F0aW9uIHdpdGgKK3RhcmdldHMuIEFsbCBORkMgc29ja2V0cyB1c2UgQUZfTkZDOgorCitzdHJ1Y3Qgc29ja2FkZHJfbmZjIHsKKyAgICAgICBzYV9mYW1pbHlfdCBzYV9mYW1pbHk7CisgICAgICAgX191MzIgZGV2X2lkeDsKKyAgICAgICBfX3UzMiB0YXJnZXRfaWR4OworICAgICAgIF9fdTMyIG5mY19wcm90b2NvbDsKK307CisKK1RvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gd2l0aCBvbmUgdGFyZ2V0LCB0aGUgdXNlciBtdXN0IGNyZWF0ZSBhbgorTkZDX1NPQ0tQUk9UT19SQVcgc29ja2V0IGFuZCBjYWxsIHRoZSAnY29ubmVjdCcgc3lzY2FsbCB3aXRoIHRoZSBzb2NrYWRkcl9uZmMKK3N0cnVjdCBjb3JyZWN0bHkgZmlsbGVkLiBBbGwgaW5mb3JtYXRpb24gY29tZXMgZnJvbSBORkNfRVZFTlRfVEFSR0VUU19GT1VORAorbmV0bGluayBldmVudC4gQXMgYSB0YXJnZXQgY2FuIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBORkMgcHJvdG9jb2wsIHRoZSB1c2VyCittdXN0IGluZm9ybSB3aGljaCBwcm90b2NvbCBpdCB3YW50cyB0byB1c2UuCisKK0ludGVybmFsbHksICdjb25uZWN0JyB3aWxsIHJlc3VsdCBpbiBhbiBhY3RpdmF0ZV90YXJnZXQgY2FsbCB0byB0aGUgZHJpdmVyLgorV2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZCwgdGhlIHRhcmdldCBpcyBkZWFjdGl2YXRlZC4KKworVGhlIGRhdGEgZm9ybWF0IGV4Y2hhbmdlZCB0aHJvdWdoIHRoZSBzb2NrZXRzIGlzIE5GQyBwcm90b2NvbCBkZXBlbmRlbnQuIEZvcgoraW5zdGFuY2UsIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIE1JRkFSRSB0YWdzLCB0aGUgZGF0YSBleGNoYW5nZWQgYXJlIE1JRkFSRQorY29tbWFuZHMgYW5kIHRoZWlyIHJlc3BvbnNlcy4KKworVGhlIGZpcnN0IHJlY2VpdmVkIHBhY2thZ2UgaXMgdGhlIHJlc3BvbnNlIHRvIHRoZSBmaXJzdCBzZW50IHBhY2thZ2UgYW5kIHNvCitvbi4gSW4gb3JkZXIgdG8gYWxsb3cgdmFsaWQgImVtcHR5IiByZXNwb25zZXMsIGV2ZXJ5IGRhdGEgcmVjZWl2ZWQgaGFzIGEgTlVMTAoraGVhZGVyIG9mIDEgYnl0ZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zdG1tYWMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3N0bW1hYy50eHQKaW5kZXggODBhN2EzNC4uNTdhMjQxMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3N0bW1hYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3N0bW1hYy50eHQKQEAgLTcsNyArNyw3IEBACiAoU3lub3BzeXMgSVAgYmxvY2tzKTsgaXQgaGFzIGJlZW4gZnVsbHkgdGVzdGVkIG9uIFNUTGludXggcGxhdGZvcm1zLgogCiBDdXJyZW50bHkgdGhpcyBuZXR3b3JrIGRldmljZSBkcml2ZXIgaXMgZm9yIGFsbCBTVE0gZW1iZWRkZWQgTUFDL0dNQUMKLSg3eHh4IFNvQ3MpLiBPdGhlciBwbGF0Zm9ybXMgc3RhcnQgdXNpbmcgaXQgaS5lLiBBUk0gU1BFQXIuCisoaS5lLiA3eHh4LzV4eHggU29DcykgYW5kIGl0J3Mga25vd24gd29ya2luZyBvbiBvdGhlciBwbGF0Zm9ybXMgaS5lLiBBUk0gU1BFQXIuCiAKIERXQyBFdGhlciBNQUMgMTAvMTAwLzEwMDAgVW5pdmVyc2FsIHZlcnNpb24gMy40MWEgYW5kIERXQyBFdGhlciBNQUMgMTAvMTAwCiBVbml2ZXJzYWwgdmVyc2lvbiA0LjAgaGF2ZSBiZWVuIHVzZWQgZm9yIGRldmVsb3BpbmcgdGhlIGZpcnN0IGNvZGUKQEAgLTcxLDcgKzcxLDcgQEAKIHRoZSBDUFUgd2hpbGUgaGF2aW5nIHRoZSBtYXhpbXVtIHRocm91Z2hwdXQuCiAKIDQuNCkgV09MCi1XYWtlIHVwIG9uIExhbiBmZWF0dXJlIHRocm91Z2ggTWFnaWMgRnJhbWUgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHRoZSBHTUFDCitXYWtlIHVwIG9uIExhbiBmZWF0dXJlIHRocm91Z2ggTWFnaWMgYW5kIFVuaWNhc3QgZnJhbWVzIGFyZSBzdXBwb3J0ZWQgZm9yIHRoZSBHTUFDCiBjb3JlLgogCiA0LjUpIERNQSBkZXNjcmlwdG9ycwpAQCAtOTEsMTEgKzkxLDE1IEBACiBUaGUgZHJpdmVyIGlzIGNvbXBhdGlibGUgd2l0aCBQQUwgdG8gd29yayB3aXRoIFBIWSBhbmQgR1BIWSBkZXZpY2VzLgogCiA0LjkpIFBsYXRmb3JtIGluZm9ybWF0aW9uCi1TZXZlcmFsIGluZm9ybWF0aW9uIGNhbWUgZnJvbSB0aGUgcGxhdGZvcm07IHBsZWFzZSByZWZlciB0byB0aGUKLWRyaXZlcidzIEhlYWRlciBmaWxlIGluIGluY2x1ZGUvbGludXggZGlyZWN0b3J5LgorU2V2ZXJhbCBkcml2ZXIncyBpbmZvcm1hdGlvbiBjYW4gYmUgcGFzc2VkIHRocm91Z2ggdGhlIHBsYXRmb3JtCitUaGVzZSBhcmUgaW5jbHVkZWQgaW4gdGhlIGluY2x1ZGUvbGludXgvc3RtbWFjLmggaGVhZGVyIGZpbGUKK2FuZCBkZXRhaWxlZCBiZWxvdyBhcyB3ZWxsOgogCi1zdHJ1Y3QgcGxhdF9zdG1tYWNlbmV0X2RhdGEgeworIHN0cnVjdCBwbGF0X3N0bW1hY2VuZXRfZGF0YSB7CiAJaW50IGJ1c19pZDsKKwlpbnQgcGh5X2FkZHI7CisJaW50IGludGVyZmFjZTsKKwlzdHJ1Y3Qgc3RtbWFjX21kaW9fYnVzX2RhdGEgKm1kaW9fYnVzX2RhdGE7CiAJaW50IHBibDsKIAlpbnQgY2xrX2NzcjsKIAlpbnQgaGFzX2dtYWM7CkBAIC0xMDMsNjcgKzEwNywxMzUgQEAKIAlpbnQgdHhfY29lOwogCWludCBidWdnZWRfanVtYm87CiAJaW50IHBtdDsKLSAgICAgICAgdm9pZCAoKmZpeF9tYWNfc3BlZWQpKHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBzcGVlZCk7Ci0gICAgICAgIHZvaWQgKCpidXNfc2V0dXApKHVuc2lnbmVkIGxvbmcgaW9hZGRyKTsKLSNpZmRlZiBDT05GSUdfU1RNX0RSSVZFUlMKLSAgICAgICAgc3RydWN0IHN0bV9wYWRfY29uZmlnICpwYWRfY29uZmlnOwotI2VuZGlmCi0gICAgICAgIHZvaWQgKmJzcF9wcml2OwotfTsKKwlpbnQgZm9yY2Vfc2ZfZG1hX21vZGU7CisJdm9pZCAoKmZpeF9tYWNfc3BlZWQpKHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBzcGVlZCk7CisJdm9pZCAoKmJ1c19zZXR1cCkodm9pZCBfX2lvbWVtICppb2FkZHIpOworCWludCAoKmluaXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCXZvaWQgKCpleGl0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwl2b2lkICpic3BfcHJpdjsKKyB9OwogCiBXaGVyZToKLS0gcGJsIChQcm9ncmFtbWFibGUgQnVyc3QgTGVuZ3RoKSBpcyBtYXhpbXVtIG51bWJlciBvZgotICBiZWF0cyB0byBiZSB0cmFuc2ZlcnJlZCBpbiBvbmUgRE1BIHRyYW5zYWN0aW9uLgotICBHTUFDIGFsc28gZW5hYmxlcyB0aGUgNHhQQkwgYnkgZGVmYXVsdC4KLS0gZml4X21hY19zcGVlZCBhbmQgYnVzX3NldHVwIGFyZSB1c2VkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCB0YXJnZXQKLSAgcmVnaXN0ZXJzIChvbiBTVE0gcGxhdGZvcm1zKTsKLS0gaGFzX2dtYWM6IEdNQUMgY29yZSBpcyBvbiBib2FyZCAoZ2V0IGl0IGF0IHJ1bi10aW1lIGluIHRoZSBuZXh0IHN0ZXApOwotLSBidXNfaWQ6IGJ1cyBpZGVudGlmaWVyLgotLSB0eF9jb2U6IGNvcmUgaXMgYWJsZSB0byBwZXJmb3JtIHRoZSB0eCBjc3VtIGluIEhXLgotLSBlbmhfZGVzYzogaWYgc2V0cyB0aGUgTUFDIHdpbGwgdXNlIHRoZSBlbmhhbmNlZCBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KLS0gY2xrX2NzcjogQ1NSIENsb2NrIHJhbmdlIHNlbGVjdGlvbi4KLS0gYnVnZ2VkX2p1bWJvOiBzb21lIEhXcyBhcmUgbm90IGFibGUgdG8gcGVyZm9ybSB0aGUgY3N1bSBpbiBIVyBmb3IKLSAgb3Zlci1zaXplZCBmcmFtZXMgZHVlIHRvIGxpbWl0ZWQgYnVmZmVyIHNpemVzLiBTZXR0aW5nIHRoaXMKLSAgZmxhZyB0aGUgY3N1bSB3aWxsIGJlIGRvbmUgaW4gU1cgb24gSlVNQk8gZnJhbWVzLgorIG8gYnVzX2lkOiBidXMgaWRlbnRpZmllci4KKyBvIHBoeV9hZGRyOiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBjYW4gYmUgcGFzc2VkIGZyb20gdGhlIHBsYXRmb3JtLgorCSAgICBJZiBpdCBpcyBzZXQgdG8gLTEgdGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkKKwkgICAgZGV0ZWN0IGl0IGF0IHJ1bi10aW1lIGJ5IHByb2JpbmcgYWxsIHRoZSAzMiBhZGRyZXNzZXMuCisgbyBpbnRlcmZhY2U6IFBIWSBkZXZpY2UncyBpbnRlcmZhY2UuCisgbyBtZGlvX2J1c19kYXRhOiBzcGVjaWZpYyBwbGF0Zm9ybSBmaWVsZHMgZm9yIHRoZSBNRElPIGJ1cy4KKyBvIHBibDogdGhlIFByb2dyYW1tYWJsZSBCdXJzdCBMZW5ndGggaXMgbWF4aW11bSBudW1iZXIgb2YgYmVhdHMgdG8KKyAgICAgICBiZSB0cmFuc2ZlcnJlZCBpbiBvbmUgRE1BIHRyYW5zYWN0aW9uLgorICAgICAgIEdNQUMgYWxzbyBlbmFibGVzIHRoZSA0eFBCTCBieSBkZWZhdWx0LgorIG8gY2xrX2NzcjogQ1NSIENsb2NrIHJhbmdlIHNlbGVjdGlvbi4KKyBvIGhhc19nbWFjOiB1c2VzIHRoZSBHTUFDIGNvcmUuCisgbyBlbmhfZGVzYzogaWYgc2V0cyB0aGUgTUFDIHdpbGwgdXNlIHRoZSBlbmhhbmNlZCBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KKyBvIHR4X2NvZTogY29yZSBpcyBhYmxlIHRvIHBlcmZvcm0gdGhlIHR4IGNzdW0gaW4gSFcuCisgbyBidWdnZWRfanVtYm86IHNvbWUgSFdzIGFyZSBub3QgYWJsZSB0byBwZXJmb3JtIHRoZSBjc3VtIGluIEhXIGZvcgorCQlvdmVyLXNpemVkIGZyYW1lcyBkdWUgdG8gbGltaXRlZCBidWZmZXIgc2l6ZXMuCisJCVNldHRpbmcgdGhpcyBmbGFnIHRoZSBjc3VtIHdpbGwgYmUgZG9uZSBpbiBTVyBvbgorCQlKVU1CTyBmcmFtZXMuCisgbyBwbXQ6IGNvcmUgaGFzIHRoZSBlbWJlZGRlZCBwb3dlciBtb2R1bGUgKG9wdGlvbmFsKS4KKyBvIGZvcmNlX3NmX2RtYV9tb2RlOiBmb3JjZSBETUEgdG8gdXNlIHRoZSBTdG9yZSBhbmQgRm9yd2FyZCBtb2RlCisJCSAgICAgaW5zdGVhZCBvZiB0aGUgVGhyZXNob2xkLgorIG8gZml4X21hY19zcGVlZDogdGhpcyBjYWxsYmFjayBpcyB1c2VkIGZvciBtb2RpZnlpbmcgc29tZSBzeXNjZmcgcmVnaXN0ZXJzCisJCSAob24gU1QgU29DcykgYWNjb3JkaW5nIHRvIHRoZSBsaW5rIHNwZWVkIG5lZ290aWF0ZWQgYnkgdGhlCisJCSBwaHlzaWNhbCBsYXllciAuCisgbyBidXNfc2V0dXA6IHBlcmZvcm0gSFcgc2V0dXAgb2YgdGhlIGJ1cy4gRm9yIGV4YW1wbGUsIG9uIHNvbWUgU1QgcGxhdGZvcm1zCisJICAgICB0aGlzIGZpZWxkIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBBTUJBICBicmlkZ2UgdG8gZ2VuZXJhdGUgbW9yZQorCSAgICAgZWZmaWNpZW50IFNUQnVzIHRyYWZmaWMuCisgbyBpbml0L2V4aXQ6IGNhbGxiYWNrcyB1c2VkIGZvciBjYWxsaW5nIGEgY3VzdG9tIGluaXRpYWxpc2F0aW9uOworCSAgICAgdGhpcyBpcyBzb21ldGltZSBuZWNlc3Nhcnkgb24gc29tZSBwbGF0Zm9ybXMgKGUuZy4gU1QgYm94ZXMpCisJICAgICB3aGVyZSB0aGUgSFcgbmVlZHMgdG8gaGF2ZSBzZXQgc29tZSBQSU8gbGluZXMgb3Igc3lzdGVtIGNmZworCSAgICAgcmVnaXN0ZXJzLgorIG8gY3VzdG9tX2NmZzogdGhpcyBpcyBhIGN1c3RvbSBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlIHBhc3NlZCB3aGlsZQorCSAgICAgIGluaXRpYWxpc2luZyB0aGUgcmVzb3VyY2VzLgogCi1zdHJ1Y3QgcGxhdF9zdG1tYWNwaHlfZGF0YSB7Ci0gICAgICAgIGludCBidXNfaWQ7Ci0gICAgICAgIGludCBwaHlfYWRkcjsKLSAgICAgICAgdW5zaWduZWQgaW50IHBoeV9tYXNrOwotICAgICAgICBpbnQgaW50ZXJmYWNlOwotICAgICAgICBpbnQgKCpwaHlfcmVzZXQpKHZvaWQgKnByaXYpOwotICAgICAgICB2b2lkICpwcml2OwotfTsKK1RoZSB3ZSBoYXZlOgorCisgc3RydWN0IHN0bW1hY19tZGlvX2J1c19kYXRhIHsKKwlpbnQgYnVzX2lkOworCWludCAoKnBoeV9yZXNldCkodm9pZCAqcHJpdik7CisJdW5zaWduZWQgaW50IHBoeV9tYXNrOworCWludCAqaXJxczsKKwlpbnQgcHJvYmVkX3BoeV9pcnE7CisgfTsKIAogV2hlcmU6Ci0tIGJ1c19pZDogYnVzIGlkZW50aWZpZXI7Ci0tIHBoeV9hZGRyOiBwaHlzaWNhbCBhZGRyZXNzIHVzZWQgZm9yIHRoZSBhdHRhY2hlZCBwaHkgZGV2aWNlOwotICAgICAgICAgICAgc2V0IGl0IHRvIC0xIHRvIGdldCBpdCBhdCBydW4tdGltZTsKLS0gaW50ZXJmYWNlOiBwaHlzaWNhbCBNSUkgaW50ZXJmYWNlIG1vZGU7Ci0tIHBoeV9yZXNldDogaG9vayB0byByZXNldCBIVyBmdW5jdGlvbi4KKyBvIGJ1c19pZDogYnVzIGlkZW50aWZpZXI7CisgbyBwaHlfcmVzZXQ6IGhvb2sgdG8gcmVzZXQgdGhlIHBoeSBkZXZpY2UgYXR0YWNoZWQgdG8gdGhlIGJ1cy4KKyBvIHBoeV9tYXNrOiBwaHkgbWFzayBwYXNzZWQgd2hlbiByZWdpc3RlciB0aGUgTURJTyBidXMgd2l0aGluIHRoZSBkcml2ZXIuCisgbyBpcnFzOiBsaXN0IG9mIElSUXMsIG9uZSBwZXIgUEhZLgorIG8gcHJvYmVkX3BoeV9pcnE6IGlmIGlycXMgaXMgTlVMTCwgdXNlIHRoaXMgZm9yIHByb2JlZCBQSFkuCiAKLVNPVVJDRVM6Ci0tIEtjb25maWcKLS0gTWFrZWZpbGUKLS0gc3RtbWFjX21haW4uYzogbWFpbiBuZXR3b3JrIGRldmljZSBkcml2ZXI7Ci0tIHN0bW1hY19tZGlvLmM6IG1kaW8gZnVuY3Rpb25zOwotLSBzdG1tYWNfZXRodG9vbC5jOiBldGh0b29sIHN1cHBvcnQ7Ci0tIHN0bW1hY190aW1lci5bY2hdOiB0aW1lciBjb2RlIHVzZWQgZm9yIG1pdGlnYXRpbmcgdGhlIGRyaXZlciBkbWEgaW50ZXJydXB0cwotICBPbmx5IHRlc3RlZCBvbiBTVDQwIHBsYXRmb3JtcyBiYXNlZC4KLS0gc3RtbWFjLmg6IHByaXZhdGUgZHJpdmVyIHN0cnVjdHVyZTsKLS0gY29tbW9uLmg6IGNvbW1vbiBkZWZpbml0aW9ucyBhbmQgVkZUczsKLS0gZGVzY3MuaDogZGVzY3JpcHRvciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnM7Ci0tIGR3bWFjMTAwMF9jb3JlLmM6IEdNQUMgY29yZSBmdW5jdGlvbnM7Ci0tIGR3bWFjMTAwMF9kbWEuYzogIGRtYSBmdW5jdGlvbnMgZm9yIHRoZSBHTUFDIGNoaXA7Ci0tIGR3bWFjMTAwMC5oOiBzcGVjaWZpYyBoZWFkZXIgZmlsZSBmb3IgdGhlIEdNQUM7Ci0tIGR3bWFjMTAwX2NvcmU6IE1BQyAxMDAgY29yZSBhbmQgZG1hIGNvZGU7Ci0tIGR3bWFjMTAwX2RtYS5jOiBkbWEgZnVudGlvbnMgZm9yIHRoZSBNQUMgY2hpcDsKLS0gZHdtYWMxMDAwLmg6IHNwZWNpZmljIGhlYWRlciBmaWxlIGZvciB0aGUgTUFDOwotLSBkd21hY19saWIuYzogZ2VuZXJpYyBETUEgZnVuY3Rpb25zIHNoYXJlZCBhbW9uZyBjaGlwcwotLSBlbmhfZGVzYy5jOiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGVuaGFuY2VkIGRlc2NyaXB0b3JzCi0tIG5vcm1fZGVzYy5jOiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIG5vcm1hbCBkZXNjcmlwdG9ycworQmVsb3cgYW4gZXhhbXBsZSBob3cgdGhlIHN0cnVjdHVyZXMgYWJvdmUgYXJlIHVzaW5nIG9uIFNUIHBsYXRmb3Jtcy4KIAotVE9ETzoKLS0gWEdNQUMgY29udHJvbGxlciBpcyBub3Qgc3VwcG9ydGVkLgotLSBSZXZpZXcgdGhlIHRpbWVyIG9wdGltaXNhdGlvbiBjb2RlIHRvIHVzZSBhbiBlbWJlZGRlZCBkZXZpY2UgdGhhdCBzZWVtcyB0byBiZQorIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zdG1tYWNlbmV0X2RhdGEgc3R4WVlZX2V0aGVybmV0X3BsYXRmb3JtX2RhdGEgPSB7CisJLnBibCA9IDMyLAorCS5oYXNfZ21hYyA9IDAsCisJLmVuaF9kZXNjID0gMCwKKwkuZml4X21hY19zcGVlZCA9IHN0eFlZWV9ldGhlcm5ldF9maXhfbWFjX3NwZWVkLAorCQkJCXwKKwkJCQl8LT4gdG8gd3JpdGUgYW4gaW50ZXJuYWwgc3lzY2ZnCisJCQkJfCAgIG9uIHRoaXMgcGxhdGZvcm0gd2hlbiB0aGUKKwkJCQl8ICAgbGluayBzcGVlZCBjaGFuZ2VzIGZyb20gMTAgdG8KKwkJCQl8ICAgMTAwIGFuZCB2aWNldmVyc2EKKwkuaW5pdCA9ICZzdG1tYWNfY2xhaW1fcmVzb3VyY2UsCisJCQkJfAorCQkJCXwtPiBPbiBTVCBTb0MgdGhpcyBjYWxscyBvd24gIlBBRCIKKwkJCQl8ICAgbWFuYWdlciBmcmFtZXdvcmsgdG8gY2xhaW0KKwkJCQl8ICAgYWxsIHRoZSByZXNvdXJjZXMgbmVjZXNzYXJ5CisJCQkJfCAgIChHUElPIC4uLikuIFRoZSAuY3VzdG9tX2NmZyBmaWVsZAorCQkJCXwgICBpcyB1c2VkIHRvIHBhc3MgYSBjdXN0b20gY29uZmlnLgorfTsKKworQmVsb3cgdGhlIHVzYWdlIG9mIHRoZSBzdG1tYWNfbWRpb19idXNfZGF0YTogb24gdGhpcyBTb0MsIGluIGZhY3QsCit0aGVyZSBhcmUgdHdvIE1BQyBjb3Jlczogb25lIE1BQyBpcyBmb3IgTURJTyBCdXMvUEhZIGVtdWxhdGlvbgord2l0aCBmaXhlZF9saW5rIHN1cHBvcnQuCisKK3N0YXRpYyBzdHJ1Y3Qgc3RtbWFjX21kaW9fYnVzX2RhdGEgc3RtbWFjMV9tZGlvX2J1cyA9IHsKKwkuYnVzX2lkID0gMSwKKwkJfAorCQl8LT4gcGh5IGRldmljZSBvbiB0aGUgYnVzX2lkIDEKKwkucGh5X3Jlc2V0ID0gcGh5X3Jlc2V0OworCQl8CisJCXwtPiBmdW5jdGlvbiB0byBwcm92aWRlIHRoZSBwaHlfcmVzZXQgb24gdGhpcyBib2FyZAorCS5waHlfbWFzayA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IGZpeGVkX3BoeV9zdGF0dXMgc3RtbWFjMF9maXhlZF9waHlfc3RhdHVzID0geworCS5saW5rID0gMSwKKwkuc3BlZWQgPSAxMDAsCisJLmR1cGxleCA9IDEsCit9OworCitEdXJpbmcgdGhlIGJvYXJkJ3MgZGV2aWNlX2luaXQgd2UgY2FuIGNvbmZpZ3VyZSB0aGUgZmlyc3QKK01BQyBmb3IgZml4ZWRfbGluayBieSBjYWxsaW5nOgorICBmaXhlZF9waHlfYWRkKFBIWV9QT0xMLCAxLCAmc3RtbWFjMF9maXhlZF9waHlfc3RhdHVzKSk7KQorYW5kIHRoZSBzZWNvbmQgb25lLCB3aXRoIGEgcmVhbCBQSFkgZGV2aWNlIGF0dGFjaGVkIHRvIHRoZSBidXMsCitieSB1c2luZyB0aGUgc3RtbWFjX21kaW9fYnVzX2RhdGEgc3RydWN0dXJlICh0byBwcm92aWRlIHRoZSBpZCwgdGhlCityZXNldCBwcm9jZWR1cmUgZXRjKS4KKworNC4xMCkgTGlzdCBvZiBzb3VyY2UgZmlsZXM6CisgbyBLY29uZmlnCisgbyBNYWtlZmlsZQorIG8gc3RtbWFjX21haW4uYzogbWFpbiBuZXR3b3JrIGRldmljZSBkcml2ZXI7CisgbyBzdG1tYWNfbWRpby5jOiBtZGlvIGZ1bmN0aW9uczsKKyBvIHN0bW1hY19ldGh0b29sLmM6IGV0aHRvb2wgc3VwcG9ydDsKKyBvIHN0bW1hY190aW1lci5bY2hdOiB0aW1lciBjb2RlIHVzZWQgZm9yIG1pdGlnYXRpbmcgdGhlIGRyaXZlciBkbWEgaW50ZXJydXB0cworCQkgICAgICBPbmx5IHRlc3RlZCBvbiBTVDQwIHBsYXRmb3JtcyBiYXNlZC4KKyBvIHN0bW1hYy5oOiBwcml2YXRlIGRyaXZlciBzdHJ1Y3R1cmU7CisgbyBjb21tb24uaDogY29tbW9uIGRlZmluaXRpb25zIGFuZCBWRlRzOworIG8gZGVzY3MuaDogZGVzY3JpcHRvciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnM7CisgbyBkd21hYzEwMDBfY29yZS5jOiBHTUFDIGNvcmUgZnVuY3Rpb25zOworIG8gZHdtYWMxMDAwX2RtYS5jOiAgZG1hIGZ1bmN0aW9ucyBmb3IgdGhlIEdNQUMgY2hpcDsKKyBvIGR3bWFjMTAwMC5oOiBzcGVjaWZpYyBoZWFkZXIgZmlsZSBmb3IgdGhlIEdNQUM7CisgbyBkd21hYzEwMF9jb3JlOiBNQUMgMTAwIGNvcmUgYW5kIGRtYSBjb2RlOworIG8gZHdtYWMxMDBfZG1hLmM6IGRtYSBmdW50aW9ucyBmb3IgdGhlIE1BQyBjaGlwOworIG8gZHdtYWMxMDAwLmg6IHNwZWNpZmljIGhlYWRlciBmaWxlIGZvciB0aGUgTUFDOworIG8gZHdtYWNfbGliLmM6IGdlbmVyaWMgRE1BIGZ1bmN0aW9ucyBzaGFyZWQgYW1vbmcgY2hpcHMKKyBvIGVuaF9kZXNjLmM6IGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgZW5oYW5jZWQgZGVzY3JpcHRvcnMKKyBvIG5vcm1fZGVzYy5jOiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIG5vcm1hbCBkZXNjcmlwdG9ycworCis1KSBUT0RPOgorIG8gWEdNQUMgaXMgbm90IHN1cHBvcnRlZC4KKyBvIFJldmlldyB0aGUgdGltZXIgb3B0aW1pc2F0aW9uIGNvZGUgdG8gdXNlIGFuIGVtYmVkZGVkIGRldmljZSB0aGF0IHdpbGwgYmUKICAgYXZhaWxhYmxlIGluIG5ldyBjaGlwIGdlbmVyYXRpb25zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9kZXZpY2VzLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvZGV2aWNlcy50eHQKaW5kZXggODg4ODA4My4uMzM4NGQ1OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9kZXZpY2VzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2RldmljZXMudHh0CkBAIC01MDYsOCArNTA2LDggQEAKIHNpdHVhdGlvbiB3aGVyZSBpdCBhY3R1YWxseSBtYXR0ZXJzLgogCiAKLURldmljZSBQb3dlciBEb21haW5zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRGV2aWNlIFBvd2VyIE1hbmFnZW1lbnQgRG9tYWlucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29tZXRpbWVzIGRldmljZXMgc2hhcmUgcmVmZXJlbmNlIGNsb2NrcyBvciBvdGhlciBwb3dlciByZXNvdXJjZXMuICBJbiB0aG9zZQogY2FzZXMgaXQgZ2VuZXJhbGx5IGlzIG5vdCBwb3NzaWJsZSB0byBwdXQgZGV2aWNlcyBpbnRvIGxvdy1wb3dlciBzdGF0ZXMKIGluZGl2aWR1YWxseS4gIEluc3RlYWQsIGEgc2V0IG9mIGRldmljZXMgc2hhcmluZyBhIHBvd2VyIHJlc291cmNlIGNhbiBiZSBwdXQKQEAgLTUxNiw2MyArNTE2LDI0IEBACiB0b2dldGhlciwgYnkgdHVybmluZyB0aGUgc2hhcmVkIHBvd2VyIHJlc291cmNlIG9uLiAgQSBzZXQgb2YgZGV2aWNlcyB3aXRoIHRoaXMKIHByb3BlcnR5IGlzIG9mdGVuIHJlZmVycmVkIHRvIGFzIGEgcG93ZXIgZG9tYWluLgogCi1TdXBwb3J0IGZvciBwb3dlciBkb21haW5zIGlzIHByb3ZpZGVkIHRocm91Z2ggdGhlIHB3cl9kb21haW4gZmllbGQgb2Ygc3RydWN0Ci1kZXZpY2UuICBUaGlzIGZpZWxkIGlzIGEgcG9pbnRlciB0byBhbiBvYmplY3Qgb2YgdHlwZSBzdHJ1Y3QgZGV2X3Bvd2VyX2RvbWFpbiwKK1N1cHBvcnQgZm9yIHBvd2VyIGRvbWFpbnMgaXMgcHJvdmlkZWQgdGhyb3VnaCB0aGUgcG1fZG9tYWluIGZpZWxkIG9mIHN0cnVjdAorZGV2aWNlLiAgVGhpcyBmaWVsZCBpcyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0IG9mIHR5cGUgc3RydWN0IGRldl9wbV9kb21haW4sCiBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvcG0uaCwgcHJvdmlkaW5nIGEgc2V0IG9mIHBvd2VyIG1hbmFnZW1lbnQgY2FsbGJhY2tzCiBhbmFsb2dvdXMgdG8gdGhlIHN1YnN5c3RlbS1sZXZlbCBhbmQgZGV2aWNlIGRyaXZlciBjYWxsYmFja3MgdGhhdCBhcmUgZXhlY3V0ZWQKLWZvciB0aGUgZ2l2ZW4gZGV2aWNlIGR1cmluZyBhbGwgcG93ZXIgdHJhbnNpdGlvbnMsIGluIGFkZGl0aW9uIHRvIHRoZSByZXNwZWN0aXZlCi1zdWJzeXN0ZW0tbGV2ZWwgY2FsbGJhY2tzLiAgU3BlY2lmaWNhbGx5LCB0aGUgcG93ZXIgZG9tYWluICJzdXNwZW5kIiBjYWxsYmFja3MKLShpLmUuIC0+cnVudGltZV9zdXNwZW5kKCksIC0+c3VzcGVuZCgpLCAtPmZyZWV6ZSgpLCAtPnBvd2Vyb2ZmKCksIGV0Yy4pIGFyZQotZXhlY3V0ZWQgYWZ0ZXIgdGhlIGFuYWxvZ291cyBzdWJzeXN0ZW0tbGV2ZWwgY2FsbGJhY2tzLCB3aGlsZSB0aGUgcG93ZXIgZG9tYWluCi0icmVzdW1lIiBjYWxsYmFja3MgKGkuZS4gLT5ydW50aW1lX3Jlc3VtZSgpLCAtPnJlc3VtZSgpLCAtPnRoYXcoKSwgLT5yZXN0b3JlLAotZXRjLikgYXJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgYW5hbG9nb3VzIHN1YnN5c3RlbS1sZXZlbCBjYWxsYmFja3MuICBFcnJvciBjb2RlcwotcmV0dXJuZWQgYnkgdGhlICJzdXNwZW5kIiBhbmQgInJlc3VtZSIgcG93ZXIgZG9tYWluIGNhbGxiYWNrcyBhcmUgaWdub3JlZC4KK2ZvciB0aGUgZ2l2ZW4gZGV2aWNlIGR1cmluZyBhbGwgcG93ZXIgdHJhbnNpdGlvbnMsIGluc3RlYWQgb2YgdGhlIHJlc3BlY3RpdmUKK3N1YnN5c3RlbS1sZXZlbCBjYWxsYmFja3MuICBTcGVjaWZpY2FsbHksIGlmIGEgZGV2aWNlJ3MgcG1fZG9tYWluIHBvaW50ZXIgaXMKK25vdCBOVUxMLCB0aGUgLT5zdXNwZW5kKCkgY2FsbGJhY2sgZnJvbSB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgaXQgd2lsbCBiZQorZXhlY3V0ZWQgaW5zdGVhZCBvZiBpdHMgc3Vic3lzdGVtJ3MgKGUuZy4gYnVzIHR5cGUncykgLT5zdXNwZW5kKCkgY2FsbGJhY2sgYW5kCithbmxvZ291c2x5IGZvciBhbGwgb2YgdGhlIHJlbWFpbmluZyBjYWxsYmFja3MuICBJbiBvdGhlciB3b3JkcywgcG93ZXIgbWFuYWdlbWVudAorZG9tYWluIGNhbGxiYWNrcywgaWYgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIGRldmljZSwgYWx3YXlzIHRha2UgcHJlY2VkZW5jZSBvdmVyCit0aGUgY2FsbGJhY2tzIHByb3ZpZGVkIGJ5IHRoZSBkZXZpY2UncyBzdWJzeXN0ZW0gKGUuZy4gYnVzIHR5cGUpLgogCi1Qb3dlciBkb21haW4gLT5ydW50aW1lX2lkbGUoKSBjYWxsYmFjayBpcyBleGVjdXRlZCBiZWZvcmUgdGhlIHN1YnN5c3RlbS1sZXZlbAotLT5ydW50aW1lX2lkbGUoKSBjYWxsYmFjayBhbmQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSBpdCBpcyBub3QgaWdub3JlZC4gIE5hbWVseSwKLWlmIGl0IHJldHVybnMgZXJyb3IgY29kZSwgdGhlIHN1YnN5c3RlbS1sZXZlbCAtPnJ1bnRpbWVfaWRsZSgpIGNhbGxiYWNrIHdpbGwgbm90Ci1iZSBjYWxsZWQgYW5kIHRoZSBoZWxwZXIgZnVuY3Rpb24gcnBtX2lkbGUoKSBleGVjdXRpbmcgaXQgd2lsbCByZXR1cm4gZXJyb3IKLWNvZGUuICBUaGlzIG1lY2hhbmlzbSBpcyBpbnRlbmRlZCB0byBoZWxwIHBsYXRmb3JtcyB3aGVyZSBzYXZpbmcgZGV2aWNlIHN0YXRlCi1pcyBhIHRpbWUgY29uc3VtaW5nIG9wZXJhdGlvbiBhbmQgc2hvdWxkIG9ubHkgYmUgY2FycmllZCBvdXQgaWYgYWxsIGRldmljZXMKLWluIHRoZSBwb3dlciBkb21haW4gYXJlIGlkbGUsIGJlZm9yZSB0dXJuaW5nIG9mZiB0aGUgc2hhcmVkIHBvd2VyIHJlc291cmNlKHMpLgotTmFtZWx5LCB0aGUgcG93ZXIgZG9tYWluIC0+cnVudGltZV9pZGxlKCkgY2FsbGJhY2sgbWF5IHJldHVybiBlcnJvciBjb2RlIHVudGlsCi10aGUgcG1fcnVudGltZV9pZGxlKCkgaGVscGVyIChvciBpdHMgYXN5Y2hyb25vdXMgdmVyc2lvbikgaGFzIGJlZW4gY2FsbGVkIGZvcgotYWxsIGRldmljZXMgaW4gdGhlIHBvd2VyIGRvbWFpbiAoaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgcmV0dXJuZWQgZXJyb3IgY29kZQotYmUgLUVCVVNZIGluIHRob3NlIGNhc2VzKSwgcHJldmVudGluZyB0aGUgc3Vic3lzdGVtLWxldmVsIC0+cnVudGltZV9pZGxlKCkKLWNhbGxiYWNrIGZyb20gYmVpbmcgcnVuIHByZW1hdHVyZWx5LgotCi1UaGUgc3VwcG9ydCBmb3IgZGV2aWNlIHBvd2VyIGRvbWFpbnMgaXMgb25seSByZWxldmFudCB0byBwbGF0Zm9ybXMgbmVlZGluZyB0bwotdXNlIHRoZSBzYW1lIHN1YnN5c3RlbS1sZXZlbCAoZS5nLiBwbGF0Zm9ybSBidXMgdHlwZSkgYW5kIGRldmljZSBkcml2ZXIgcG93ZXIKLW1hbmFnZW1lbnQgY2FsbGJhY2tzIGluIG1hbnkgZGlmZmVyZW50IHBvd2VyIGRvbWFpbiBjb25maWd1cmF0aW9ucyBhbmQgd2FudGluZwotdG8gYXZvaWQgaW5jb3Jwb3JhdGluZyB0aGUgc3VwcG9ydCBmb3IgcG93ZXIgZG9tYWlucyBpbnRvIHRoZSBzdWJzeXN0ZW0tbGV2ZWwKLWNhbGxiYWNrcy4gIFRoZSBvdGhlciBwbGF0Zm9ybXMgbmVlZCBub3QgaW1wbGVtZW50IGl0IG9yIHRha2UgaXQgaW50byBhY2NvdW50Ci1pbiBhbnkgd2F5LgotCi0KLVN5c3RlbSBEZXZpY2VzCi0tLS0tLS0tLS0tLS0tLQotU3lzdGVtIGRldmljZXMgKHN5c2RldnMpIGZvbGxvdyBhIHNsaWdodGx5IGRpZmZlcmVudCBBUEksIHdoaWNoIGNhbiBiZSBmb3VuZCBpbgotCi0JaW5jbHVkZS9saW51eC9zeXNkZXYuaAotCWRyaXZlcnMvYmFzZS9zeXMuYwotCi1TeXN0ZW0gZGV2aWNlcyB3aWxsIGJlIHN1c3BlbmRlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIGFuZCBhZnRlciBhbGwgb3RoZXIKLWRldmljZXMgaGF2ZSBiZWVuIHN1c3BlbmRlZC4gIE9uIHJlc3VtZSwgdGhleSB3aWxsIGJlIHJlc3VtZWQgYmVmb3JlIGFueSBvdGhlcgotZGV2aWNlcywgYW5kIGFsc28gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLiAgVGhlc2UgdGhpbmdzIG9jY3VyIGluIHNwZWNpYWwKLSJzeXNkZXZfZHJpdmVyIiBwaGFzZXMsIHdoaWNoIGFmZmVjdCBvbmx5IHN5c3RlbSBkZXZpY2VzLgotCi1UaHVzLCBhZnRlciB0aGUgc3VzcGVuZF9ub2lycSAob3IgZnJlZXplX25vaXJxIG9yIHBvd2Vyb2ZmX25vaXJxKSBwaGFzZSwgd2hlbgotdGhlIG5vbi1ib290IENQVXMgYXJlIGFsbCBvZmZsaW5lIGFuZCBJUlFzIGFyZSBkaXNhYmxlZCBvbiB0aGUgcmVtYWluaW5nIG9ubGluZQotQ1BVLCB0aGVuIGEgc3lzZGV2X2RyaXZlci5zdXNwZW5kIHBoYXNlIGlzIGNhcnJpZWQgb3V0LCBhbmQgdGhlIHN5c3RlbSBlbnRlcnMgYQotc2xlZXAgc3RhdGUgKG9yIGEgc3lzdGVtIGltYWdlIGlzIGNyZWF0ZWQpLiAgRHVyaW5nIHJlc3VtZSAob3IgYWZ0ZXIgdGhlIGltYWdlCi1oYXMgYmVlbiBjcmVhdGVkIG9yIGxvYWRlZCkgYSBzeXNkZXZfZHJpdmVyLnJlc3VtZSBwaGFzZSBpcyBjYXJyaWVkIG91dCwgSVJRcwotYXJlIGVuYWJsZWQgb24gdGhlIG9ubHkgb25saW5lIENQVSwgdGhlIG5vbi1ib290IENQVXMgYXJlIGVuYWJsZWQsIGFuZCB0aGUKLXJlc3VtZV9ub2lycSAob3IgdGhhd19ub2lycSBvciByZXN0b3JlX25vaXJxKSBwaGFzZSBiZWdpbnMuCi0KLUNvZGUgdG8gYWN0dWFsbHkgZW50ZXIgYW5kIGV4aXQgdGhlIHN5c3RlbS13aWRlIGxvdyBwb3dlciBzdGF0ZSBzb21ldGltZXMKLWludm9sdmVzIGhhcmR3YXJlIGRldGFpbHMgdGhhdCBhcmUgb25seSBrbm93biB0byB0aGUgYm9vdCBmaXJtd2FyZSwgYW5kCi1tYXkgbGVhdmUgYSBDUFUgcnVubmluZyBzb2Z0d2FyZSAoZnJvbSBTUkFNIG9yIGZsYXNoIG1lbW9yeSkgdGhhdCBtb25pdG9ycwotdGhlIHN5c3RlbSBhbmQgbWFuYWdlcyBpdHMgd2FrZXVwIHNlcXVlbmNlLgorVGhlIHN1cHBvcnQgZm9yIGRldmljZSBwb3dlciBtYW5hZ2VtZW50IGRvbWFpbnMgaXMgb25seSByZWxldmFudCB0byBwbGF0Zm9ybXMKK25lZWRpbmcgdG8gdXNlIHRoZSBzYW1lIGRldmljZSBkcml2ZXIgcG93ZXIgbWFuYWdlbWVudCBjYWxsYmFja3MgaW4gbWFueQorZGlmZmVyZW50IHBvd2VyIGRvbWFpbiBjb25maWd1cmF0aW9ucyBhbmQgd2FudGluZyB0byBhdm9pZCBpbmNvcnBvcmF0aW5nIHRoZQorc3VwcG9ydCBmb3IgcG93ZXIgZG9tYWlucyBpbnRvIHN1YnN5c3RlbS1sZXZlbCBjYWxsYmFja3MsIGZvciBleGFtcGxlIGJ5Cittb2RpZnlpbmcgdGhlIHBsYXRmb3JtIGJ1cyB0eXBlLiAgT3RoZXIgcGxhdGZvcm1zIG5lZWQgbm90IGltcGxlbWVudCBpdCBvciB0YWtlCitpdCBpbnRvIGFjY291bnQgaW4gYW55IHdheS4KIAogCiBEZXZpY2UgTG93IFBvd2VyIChzdXNwZW5kKSBTdGF0ZXMKQEAgLTY0Myw3ICs2MDQsNyBAQAogZGlzYWJsZWQuICBUaGlzIGFsbCBkZXBlbmRzIG9uIHRoZSBoYXJkd2FyZSBhbmQgdGhlIGRlc2lnbiBvZiB0aGUgc3Vic3lzdGVtIGFuZAogZGV2aWNlIGRyaXZlciBpbiBxdWVzdGlvbi4KIAotRHVyaW5nIHN5c3RlbS13aWRlIHJlc3VtZSBmcm9tIGEgc2xlZXAgc3RhdGUgaXQncyBiZXN0IHRvIHB1dCBkZXZpY2VzIGludG8gdGhlCi1mdWxsLXBvd2VyIHN0YXRlLCBhcyBleHBsYWluZWQgaW4gRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dC4gIFJlZmVyIHRvCi10aGF0IGRvY3VtZW50IGZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIHBhcnRpY3VsYXIgaXNzdWUgYXMgd2VsbCBhcworRHVyaW5nIHN5c3RlbS13aWRlIHJlc3VtZSBmcm9tIGEgc2xlZXAgc3RhdGUgaXQncyBlYXNpZXN0IHRvIHB1dCBkZXZpY2VzIGludG8KK3RoZSBmdWxsLXBvd2VyIHN0YXRlLCBhcyBleHBsYWluZWQgaW4gRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dC4gIFJlZmVyCit0byB0aGF0IGRvY3VtZW50IGZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIHBhcnRpY3VsYXIgaXNzdWUgYXMgd2VsbCBhcwogZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBkZXZpY2UgcnVudGltZSBwb3dlciBtYW5hZ2VtZW50IGZyYW1ld29yayBpbiBnZW5lcmFsLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9vcHAudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9vcHAudHh0CmluZGV4IDVhZTcwYTEyLi4zMDM1ZDAwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL29wcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9vcHAudHh0CkBAIC0zMjEsNiArMzIxLDggQEAKIAlhZGRpdGlvbiB0byBDT05GSUdfUE0gYXMgcG93ZXIgbWFuYWdlbWVudCBmZWF0dXJlIGlzIHJlcXVpcmVkIHRvCiAJZHluYW1pY2FsbHkgc2NhbGUgdm9sdGFnZSBhbmQgZnJlcXVlbmN5IGluIGEgc3lzdGVtLgogCitvcHBfZnJlZV9jcHVmcmVxX3RhYmxlIC0gRnJlZSB1cCB0aGUgdGFibGUgYWxsb2NhdGVkIGJ5IG9wcF9pbml0X2NwdWZyZXFfdGFibGUKKwogNy4gRGF0YSBTdHJ1Y3R1cmVzCiA9PT09PT09PT09PT09PT09PT0KIFR5cGljYWxseSBhbiBTb0MgY29udGFpbnMgbXVsdGlwbGUgdm9sdGFnZSBkb21haW5zIHdoaWNoIGFyZSB2YXJpYWJsZS4gRWFjaApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvcnVudGltZV9wbS50eHQKaW5kZXggNjU0MDk3Yi4uMTRkZDNjNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0CkBAIC0xLDM5ICsxLDM5IEBACi1SdW4tdGltZSBQb3dlciBNYW5hZ2VtZW50IEZyYW1ld29yayBmb3IgSS9PIERldmljZXMKK1J1bnRpbWUgUG93ZXIgTWFuYWdlbWVudCBGcmFtZXdvcmsgZm9yIEkvTyBEZXZpY2VzCiAKIChDKSAyMDA5LTIwMTEgUmFmYWVsIEouIFd5c29ja2kgPHJqd0BzaXNrLnBsPiwgTm92ZWxsIEluYy4KIChDKSAyMDEwIEFsYW4gU3Rlcm4gPHN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHU+CiAKIDEuIEludHJvZHVjdGlvbgogCi1TdXBwb3J0IGZvciBydW4tdGltZSBwb3dlciBtYW5hZ2VtZW50IChydW4tdGltZSBQTSkgb2YgSS9PIGRldmljZXMgaXMgcHJvdmlkZWQKK1N1cHBvcnQgZm9yIHJ1bnRpbWUgcG93ZXIgbWFuYWdlbWVudCAocnVudGltZSBQTSkgb2YgSS9PIGRldmljZXMgaXMgcHJvdmlkZWQKIGF0IHRoZSBwb3dlciBtYW5hZ2VtZW50IGNvcmUgKFBNIGNvcmUpIGxldmVsIGJ5IG1lYW5zIG9mOgogCiAqIFRoZSBwb3dlciBtYW5hZ2VtZW50IHdvcmtxdWV1ZSBwbV93cSBpbiB3aGljaCBidXMgdHlwZXMgYW5kIGRldmljZSBkcml2ZXJzIGNhbgogICBwdXQgdGhlaXIgUE0tcmVsYXRlZCB3b3JrIGl0ZW1zLiAgSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCBwbV93cSBiZQotICB1c2VkIGZvciBxdWV1aW5nIGFsbCB3b3JrIGl0ZW1zIHJlbGF0ZWQgdG8gcnVuLXRpbWUgUE0sIGJlY2F1c2UgdGhpcyBhbGxvd3MKKyAgdXNlZCBmb3IgcXVldWluZyBhbGwgd29yayBpdGVtcyByZWxhdGVkIHRvIHJ1bnRpbWUgUE0sIGJlY2F1c2UgdGhpcyBhbGxvd3MKICAgdGhlbSB0byBiZSBzeW5jaHJvbml6ZWQgd2l0aCBzeXN0ZW0td2lkZSBwb3dlciB0cmFuc2l0aW9ucyAoc3VzcGVuZCB0byBSQU0sCiAgIGhpYmVybmF0aW9uIGFuZCByZXN1bWUgZnJvbSBzeXN0ZW0gc2xlZXAgc3RhdGVzKS4gIHBtX3dxIGlzIGRlY2xhcmVkIGluCiAgIGluY2x1ZGUvbGludXgvcG1fcnVudGltZS5oIGFuZCBkZWZpbmVkIGluIGtlcm5lbC9wb3dlci9tYWluLmMuCiAKLSogQSBudW1iZXIgb2YgcnVuLXRpbWUgUE0gZmllbGRzIGluIHRoZSAncG93ZXInIG1lbWJlciBvZiAnc3RydWN0IGRldmljZScgKHdoaWNoCisqIEEgbnVtYmVyIG9mIHJ1bnRpbWUgUE0gZmllbGRzIGluIHRoZSAncG93ZXInIG1lbWJlciBvZiAnc3RydWN0IGRldmljZScgKHdoaWNoCiAgIGlzIG9mIHRoZSB0eXBlICdzdHJ1Y3QgZGV2X3BtX2luZm8nLCBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvcG0uaCkgdGhhdCBjYW4KLSAgYmUgdXNlZCBmb3Igc3luY2hyb25pemluZyBydW4tdGltZSBQTSBvcGVyYXRpb25zIHdpdGggb25lIGFub3RoZXIuCisgIGJlIHVzZWQgZm9yIHN5bmNocm9uaXppbmcgcnVudGltZSBQTSBvcGVyYXRpb25zIHdpdGggb25lIGFub3RoZXIuCiAKLSogVGhyZWUgZGV2aWNlIHJ1bi10aW1lIFBNIGNhbGxiYWNrcyBpbiAnc3RydWN0IGRldl9wbV9vcHMnIChkZWZpbmVkIGluCisqIFRocmVlIGRldmljZSBydW50aW1lIFBNIGNhbGxiYWNrcyBpbiAnc3RydWN0IGRldl9wbV9vcHMnIChkZWZpbmVkIGluCiAgIGluY2x1ZGUvbGludXgvcG0uaCkuCiAKICogQSBzZXQgb2YgaGVscGVyIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGRyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMgdGhhdCBjYW4gYmUKLSAgdXNlZCBmb3IgY2Fycnlpbmcgb3V0IHJ1bi10aW1lIFBNIG9wZXJhdGlvbnMgaW4gc3VjaCBhIHdheSB0aGF0IHRoZQorICB1c2VkIGZvciBjYXJyeWluZyBvdXQgcnVudGltZSBQTSBvcGVyYXRpb25zIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUKICAgc3luY2hyb25pemF0aW9uIGJldHdlZW4gdGhlbSBpcyB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBQTSBjb3JlLiAgQnVzIHR5cGVzIGFuZAogICBkZXZpY2UgZHJpdmVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlc2UgZnVuY3Rpb25zLgogCi1UaGUgcnVuLXRpbWUgUE0gY2FsbGJhY2tzIHByZXNlbnQgaW4gJ3N0cnVjdCBkZXZfcG1fb3BzJywgdGhlIGRldmljZSBydW4tdGltZSBQTQorVGhlIHJ1bnRpbWUgUE0gY2FsbGJhY2tzIHByZXNlbnQgaW4gJ3N0cnVjdCBkZXZfcG1fb3BzJywgdGhlIGRldmljZSBydW50aW1lIFBNCiBmaWVsZHMgb2YgJ3N0cnVjdCBkZXZfcG1faW5mbycgYW5kIHRoZSBjb3JlIGhlbHBlciBmdW5jdGlvbnMgcHJvdmlkZWQgZm9yCi1ydW4tdGltZSBQTSBhcmUgZGVzY3JpYmVkIGJlbG93LgorcnVudGltZSBQTSBhcmUgZGVzY3JpYmVkIGJlbG93LgogCi0yLiBEZXZpY2UgUnVuLXRpbWUgUE0gQ2FsbGJhY2tzCisyLiBEZXZpY2UgUnVudGltZSBQTSBDYWxsYmFja3MKIAotVGhlcmUgYXJlIHRocmVlIGRldmljZSBydW4tdGltZSBQTSBjYWxsYmFja3MgZGVmaW5lZCBpbiAnc3RydWN0IGRldl9wbV9vcHMnOgorVGhlcmUgYXJlIHRocmVlIGRldmljZSBydW50aW1lIFBNIGNhbGxiYWNrcyBkZWZpbmVkIGluICdzdHJ1Y3QgZGV2X3BtX29wcyc6CiAKIHN0cnVjdCBkZXZfcG1fb3BzIHsKIAkuLi4KQEAgLTcyLDExICs3MiwxMSBAQAogICAgIG5vdCBtZWFuIHRoYXQgdGhlIGRldmljZSBoYXMgYmVlbiBwdXQgaW50byBhIGxvdyBwb3dlciBzdGF0ZS4gIEl0IGlzCiAgICAgc3VwcG9zZWQgdG8gbWVhbiwgaG93ZXZlciwgdGhhdCB0aGUgZGV2aWNlIHdpbGwgbm90IHByb2Nlc3MgZGF0YSBhbmQgd2lsbAogICAgIG5vdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBDUFUocykgYW5kIFJBTSB1bnRpbCB0aGUgc3Vic3lzdGVtLWxldmVsIHJlc3VtZQotICAgIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGZvciBpdC4gIFRoZSBydW4tdGltZSBQTSBzdGF0dXMgb2YgYSBkZXZpY2UgYWZ0ZXIKKyAgICBjYWxsYmFjayBpcyBleGVjdXRlZCBmb3IgaXQuICBUaGUgcnVudGltZSBQTSBzdGF0dXMgb2YgYSBkZXZpY2UgYWZ0ZXIKICAgICBzdWNjZXNzZnVsIGV4ZWN1dGlvbiBvZiB0aGUgc3Vic3lzdGVtLWxldmVsIHN1c3BlbmQgY2FsbGJhY2sgaXMgJ3N1c3BlbmRlZCcuCiAKICAgKiBJZiB0aGUgc3Vic3lzdGVtLWxldmVsIHN1c3BlbmQgY2FsbGJhY2sgcmV0dXJucyAtRUJVU1kgb3IgLUVBR0FJTiwKLSAgICB0aGUgZGV2aWNlJ3MgcnVuLXRpbWUgUE0gc3RhdHVzIGlzICdhY3RpdmUnLCB3aGljaCBtZWFucyB0aGF0IHRoZSBkZXZpY2UKKyAgICB0aGUgZGV2aWNlJ3MgcnVudGltZSBQTSBzdGF0dXMgaXMgJ2FjdGl2ZScsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGRldmljZQogICAgIF9tdXN0XyBiZSBmdWxseSBvcGVyYXRpb25hbCBhZnRlcndhcmRzLgogCiAgICogSWYgdGhlIHN1YnN5c3RlbS1sZXZlbCBzdXNwZW5kIGNhbGxiYWNrIHJldHVybnMgYW4gZXJyb3IgY29kZSBkaWZmZXJlbnQKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiAgICogT25jZSB0aGUgc3Vic3lzdGVtLWxldmVsIHJlc3VtZSBjYWxsYmFjayBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgdGhlIFBNCiAgICAgY29yZSByZWdhcmRzIHRoZSBkZXZpY2UgYXMgZnVsbHkgb3BlcmF0aW9uYWwsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGRldmljZQotICAgIF9tdXN0XyBiZSBhYmxlIHRvIGNvbXBsZXRlIEkvTyBvcGVyYXRpb25zIGFzIG5lZWRlZC4gIFRoZSBydW4tdGltZSBQTSBzdGF0dXMKKyAgICBfbXVzdF8gYmUgYWJsZSB0byBjb21wbGV0ZSBJL08gb3BlcmF0aW9ucyBhcyBuZWVkZWQuICBUaGUgcnVudGltZSBQTSBzdGF0dXMKICAgICBvZiB0aGUgZGV2aWNlIGlzIHRoZW4gJ2FjdGl2ZScuCiAKICAgKiBJZiB0aGUgc3Vic3lzdGVtLWxldmVsIHJlc3VtZSBjYWxsYmFjayByZXR1cm5zIGFuIGVycm9yIGNvZGUsIHRoZSBQTSBjb3JlCkBAIC0xMzAsNyArMTMwLDcgQEAKIGNvcmUuCiAKIFRoZSBoZWxwZXIgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZSBQTSBjb3JlLCBkZXNjcmliZWQgaW4gU2VjdGlvbiA0LCBndWFyYW50ZWUKLXRoYXQgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50cyBhcmUgbWV0IHdpdGggcmVzcGVjdCB0byB0aGUgYnVzIHR5cGUncyBydW4tdGltZQordGhhdCB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIGFyZSBtZXQgd2l0aCByZXNwZWN0IHRvIHRoZSBidXMgdHlwZSdzIHJ1bnRpbWUKIFBNIGNhbGxiYWNrczoKIAogKDEpIFRoZSBjYWxsYmFja3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAoZS5nLiBpdCBpcyBmb3JiaWRkZW4gdG8gZXhlY3V0ZQpAQCAtMTQyLDcgKzE0Miw3IEBACiAKICgyKSAtPnJ1bnRpbWVfaWRsZSgpIGFuZCAtPnJ1bnRpbWVfc3VzcGVuZCgpIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIGZvciAnYWN0aXZlJwogICAgIGRldmljZXMgKGkuZS4gdGhlIFBNIGNvcmUgd2lsbCBvbmx5IGV4ZWN1dGUgLT5ydW50aW1lX2lkbGUoKSBvcgotICAgIC0+cnVudGltZV9zdXNwZW5kKCkgZm9yIHRoZSBkZXZpY2VzIHRoZSBydW4tdGltZSBQTSBzdGF0dXMgb2Ygd2hpY2ggaXMKKyAgICAtPnJ1bnRpbWVfc3VzcGVuZCgpIGZvciB0aGUgZGV2aWNlcyB0aGUgcnVudGltZSBQTSBzdGF0dXMgb2Ygd2hpY2ggaXMKICAgICAnYWN0aXZlJykuCiAKICgzKSAtPnJ1bnRpbWVfaWRsZSgpIGFuZCAtPnJ1bnRpbWVfc3VzcGVuZCgpIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIGZvciBhIGRldmljZQpAQCAtMTUxLDcgKzE1MSw3IEBACiAgICAgZmxhZyBvZiB3aGljaCBpcyBzZXQuCiAKICg0KSAtPnJ1bnRpbWVfcmVzdW1lKCkgY2FuIG9ubHkgYmUgZXhlY3V0ZWQgZm9yICdzdXNwZW5kZWQnIGRldmljZXMgIChpLmUuIHRoZQotICAgIFBNIGNvcmUgd2lsbCBvbmx5IGV4ZWN1dGUgLT5ydW50aW1lX3Jlc3VtZSgpIGZvciB0aGUgZGV2aWNlcyB0aGUgcnVuLXRpbWUKKyAgICBQTSBjb3JlIHdpbGwgb25seSBleGVjdXRlIC0+cnVudGltZV9yZXN1bWUoKSBmb3IgdGhlIGRldmljZXMgdGhlIHJ1bnRpbWUKICAgICBQTSBzdGF0dXMgb2Ygd2hpY2ggaXMgJ3N1c3BlbmRlZCcpLgogCiBBZGRpdGlvbmFsbHksIHRoZSBoZWxwZXIgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZSBQTSBjb3JlIG9iZXkgdGhlIGZvbGxvd2luZwpAQCAtMTcxLDkgKzE3MSw5IEBACiAgICAgc2NoZWR1bGVkIHJlcXVlc3RzIHRvIGV4ZWN1dGUgdGhlIG90aGVyIGNhbGxiYWNrcyBmb3IgdGhlIHNhbWUgZGV2aWNlLAogICAgIGV4Y2VwdCBmb3Igc2NoZWR1bGVkIGF1dG9zdXNwZW5kcy4KIAotMy4gUnVuLXRpbWUgUE0gRGV2aWNlIEZpZWxkcworMy4gUnVudGltZSBQTSBEZXZpY2UgRmllbGRzCiAKLVRoZSBmb2xsb3dpbmcgZGV2aWNlIHJ1bi10aW1lIFBNIGZpZWxkcyBhcmUgcHJlc2VudCBpbiAnc3RydWN0IGRldl9wbV9pbmZvJywgYXMKK1RoZSBmb2xsb3dpbmcgZGV2aWNlIHJ1bnRpbWUgUE0gZmllbGRzIGFyZSBwcmVzZW50IGluICdzdHJ1Y3QgZGV2X3BtX2luZm8nLCBhcwogZGVmaW5lZCBpbiBpbmNsdWRlL2xpbnV4L3BtLmg6CiAKICAgc3RydWN0IHRpbWVyX2xpc3Qgc3VzcGVuZF90aW1lcjsKQEAgLTIwNSw3ICsyMDUsNyBAQAogCiAgIHVuc2lnbmVkIGludCBkaXNhYmxlX2RlcHRoOwogICAgIC0gdXNlZCBmb3IgZGlzYWJsaW5nIHRoZSBoZWxwZXIgZnVuY2lvbnMgKHRoZXkgd29yayBub3JtYWxseSBpZiB0aGlzIGlzCi0gICAgICBlcXVhbCB0byB6ZXJvKTsgdGhlIGluaXRpYWwgdmFsdWUgb2YgaXQgaXMgMSAoaS5lLiBydW4tdGltZSBQTSBpcworICAgICAgZXF1YWwgdG8gemVybyk7IHRoZSBpbml0aWFsIHZhbHVlIG9mIGl0IGlzIDEgKGkuZS4gcnVudGltZSBQTSBpcwogICAgICAgaW5pdGlhbGx5IGRpc2FibGVkIGZvciBhbGwgZGV2aWNlcykKIAogICB1bnNpZ25lZCBpbnQgcnVudGltZV9lcnJvcjsKQEAgLTIyOSwxMCArMjI5LDEwIEBACiAgICAgICBzdXNwZW5kIHRvIGNvbXBsZXRlOyBtZWFucyAic3RhcnQgYSByZXN1bWUgYXMgc29vbiBhcyB5b3UndmUgc3VzcGVuZGVkIgogCiAgIHVuc2lnbmVkIGludCBydW5fd2FrZTsKLSAgICAtIHNldCBpZiB0aGUgZGV2aWNlIGlzIGNhcGFibGUgb2YgZ2VuZXJhdGluZyBydW4tdGltZSB3YWtlLXVwIGV2ZW50cworICAgIC0gc2V0IGlmIHRoZSBkZXZpY2UgaXMgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIHJ1bnRpbWUgd2FrZS11cCBldmVudHMKIAogICBlbnVtIHJwbV9zdGF0dXMgcnVudGltZV9zdGF0dXM7Ci0gICAgLSB0aGUgcnVuLXRpbWUgUE0gc3RhdHVzIG9mIHRoZSBkZXZpY2U7IHRoaXMgZmllbGQncyBpbml0aWFsIHZhbHVlIGlzCisgICAgLSB0aGUgcnVudGltZSBQTSBzdGF0dXMgb2YgdGhlIGRldmljZTsgdGhpcyBmaWVsZCdzIGluaXRpYWwgdmFsdWUgaXMKICAgICAgIFJQTV9TVVNQRU5ERUQsIHdoaWNoIG1lYW5zIHRoYXQgZWFjaCBkZXZpY2UgaXMgaW5pdGlhbGx5IHJlZ2FyZGVkIGJ5IHRoZQogICAgICAgUE0gY29yZSBhcyAnc3VzcGVuZGVkJywgcmVnYXJkbGVzcyBvZiBpdHMgcmVhbCBoYXJkd2FyZSBzdGF0dXMKIApAQCAtMjQzLDcgKzI0Myw3IEBACiAgICAgICBhbmQgcG1fcnVudGltZV9mb3JiaWQoKSBoZWxwZXIgZnVuY3Rpb25zCiAKICAgdW5zaWduZWQgaW50IG5vX2NhbGxiYWNrczsKLSAgICAtIGluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgZG9lcyBub3QgdXNlIHRoZSBydW4tdGltZSBQTSBjYWxsYmFja3MgKHNlZQorICAgIC0gaW5kaWNhdGVzIHRoYXQgdGhlIGRldmljZSBkb2VzIG5vdCB1c2UgdGhlIHJ1bnRpbWUgUE0gY2FsbGJhY2tzIChzZWUKICAgICAgIFNlY3Rpb24gOCk7IGl0IG1heSBiZSBtb2RpZmllZCBvbmx5IGJ5IHRoZSBwbV9ydW50aW1lX25vX2NhbGxiYWNrcygpCiAgICAgICBoZWxwZXIgZnVuY3Rpb24KIApAQCAtMjcwLDE2ICsyNzAsMTYgQEAKIAogQWxsIG9mIHRoZSBhYm92ZSBmaWVsZHMgYXJlIG1lbWJlcnMgb2YgdGhlICdwb3dlcicgbWVtYmVyIG9mICdzdHJ1Y3QgZGV2aWNlJy4KIAotNC4gUnVuLXRpbWUgUE0gRGV2aWNlIEhlbHBlciBGdW5jdGlvbnMKKzQuIFJ1bnRpbWUgUE0gRGV2aWNlIEhlbHBlciBGdW5jdGlvbnMKIAotVGhlIGZvbGxvd2luZyBydW4tdGltZSBQTSBoZWxwZXIgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluCitUaGUgZm9sbG93aW5nIHJ1bnRpbWUgUE0gaGVscGVyIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbgogZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYyBhbmQgaW5jbHVkZS9saW51eC9wbV9ydW50aW1lLmg6CiAKICAgdm9pZCBwbV9ydW50aW1lX2luaXQoc3RydWN0IGRldmljZSAqZGV2KTsKLSAgICAtIGluaXRpYWxpemUgdGhlIGRldmljZSBydW4tdGltZSBQTSBmaWVsZHMgaW4gJ3N0cnVjdCBkZXZfcG1faW5mbycKKyAgICAtIGluaXRpYWxpemUgdGhlIGRldmljZSBydW50aW1lIFBNIGZpZWxkcyBpbiAnc3RydWN0IGRldl9wbV9pbmZvJwogCiAgIHZvaWQgcG1fcnVudGltZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKLSAgICAtIG1ha2Ugc3VyZSB0aGF0IHRoZSBydW4tdGltZSBQTSBvZiB0aGUgZGV2aWNlIHdpbGwgYmUgZGlzYWJsZWQgYWZ0ZXIKKyAgICAtIG1ha2Ugc3VyZSB0aGF0IHRoZSBydW50aW1lIFBNIG9mIHRoZSBkZXZpY2Ugd2lsbCBiZSBkaXNhYmxlZCBhZnRlcgogICAgICAgcmVtb3ZpbmcgdGhlIGRldmljZSBmcm9tIGRldmljZSBoaWVyYXJjaHkKIAogICBpbnQgcG1fcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldik7CkBAIC0yODksOSArMjg5LDEwIEBACiAKICAgaW50IHBtX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogICAgIC0gZXhlY3V0ZSB0aGUgc3Vic3lzdGVtLWxldmVsIHN1c3BlbmQgY2FsbGJhY2sgZm9yIHRoZSBkZXZpY2U7IHJldHVybnMgMCBvbgotICAgICAgc3VjY2VzcywgMSBpZiB0aGUgZGV2aWNlJ3MgcnVuLXRpbWUgUE0gc3RhdHVzIHdhcyBhbHJlYWR5ICdzdXNwZW5kZWQnLCBvcgorICAgICAgc3VjY2VzcywgMSBpZiB0aGUgZGV2aWNlJ3MgcnVudGltZSBQTSBzdGF0dXMgd2FzIGFscmVhZHkgJ3N1c3BlbmRlZCcsIG9yCiAgICAgICBlcnJvciBjb2RlIG9uIGZhaWx1cmUsIHdoZXJlIC1FQUdBSU4gb3IgLUVCVVNZIG1lYW5zIGl0IGlzIHNhZmUgdG8gYXR0ZW1wdAotICAgICAgdG8gc3VzcGVuZCB0aGUgZGV2aWNlIGFnYWluIGluIGZ1dHVyZQorICAgICAgdG8gc3VzcGVuZCB0aGUgZGV2aWNlIGFnYWluIGluIGZ1dHVyZSBhbmQgLUVBQ0NFUyBtZWFucyB0aGF0CisgICAgICAncG93ZXIuZGlzYWJsZV9kZXB0aCcgaXMgZGlmZmVyZW50IGZyb20gMAogCiAgIGludCBwbV9ydW50aW1lX2F1dG9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CiAgICAgLSBzYW1lIGFzIHBtX3J1bnRpbWVfc3VzcGVuZCgpIGV4Y2VwdCB0aGF0IHRoZSBhdXRvc3VzcGVuZCBkZWxheSBpcyB0YWtlbgpAQCAtMzAxLDEwICszMDIsMTEgQEAKIAogICBpbnQgcG1fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKICAgICAtIGV4ZWN1dGUgdGhlIHN1YnN5c3RlbS1sZXZlbCByZXN1bWUgY2FsbGJhY2sgZm9yIHRoZSBkZXZpY2U7IHJldHVybnMgMCBvbgotICAgICAgc3VjY2VzcywgMSBpZiB0aGUgZGV2aWNlJ3MgcnVuLXRpbWUgUE0gc3RhdHVzIHdhcyBhbHJlYWR5ICdhY3RpdmUnIG9yCisgICAgICBzdWNjZXNzLCAxIGlmIHRoZSBkZXZpY2UncyBydW50aW1lIFBNIHN0YXR1cyB3YXMgYWxyZWFkeSAnYWN0aXZlJyBvcgogICAgICAgZXJyb3IgY29kZSBvbiBmYWlsdXJlLCB3aGVyZSAtRUFHQUlOIG1lYW5zIGl0IG1heSBiZSBzYWZlIHRvIGF0dGVtcHQgdG8KICAgICAgIHJlc3VtZSB0aGUgZGV2aWNlIGFnYWluIGluIGZ1dHVyZSwgYnV0ICdwb3dlci5ydW50aW1lX2Vycm9yJyBzaG91bGQgYmUKLSAgICAgIGNoZWNrZWQgYWRkaXRpb25hbGx5CisgICAgICBjaGVja2VkIGFkZGl0aW9uYWxseSwgYW5kIC1FQUNDRVMgbWVhbnMgdGhhdCAncG93ZXIuZGlzYWJsZV9kZXB0aCcgaXMKKyAgICAgIGRpZmZlcmVudCBmcm9tIDAKIAogICBpbnQgcG1fcmVxdWVzdF9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldik7CiAgICAgLSBzdWJtaXQgYSByZXF1ZXN0IHRvIGV4ZWN1dGUgdGhlIHN1YnN5c3RlbS1sZXZlbCBpZGxlIGNhbGxiYWNrIGZvciB0aGUKQEAgLTMyMSw3ICszMjMsNyBAQAogICAgICAgZGV2aWNlIGluIGZ1dHVyZSwgd2hlcmUgJ2RlbGF5JyBpcyB0aGUgdGltZSB0byB3YWl0IGJlZm9yZSBxdWV1aW5nIHVwIGEKICAgICAgIHN1c3BlbmQgd29yayBpdGVtIGluIHBtX3dxLCBpbiBtaWxsaXNlY29uZHMgKGlmICdkZWxheScgaXMgemVybywgdGhlIHdvcmsKICAgICAgIGl0ZW0gaXMgcXVldWVkIHVwIGltbWVkaWF0ZWx5KTsgcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDEgaWYgdGhlIGRldmljZSdzIFBNCi0gICAgICBydW4tdGltZSBzdGF0dXMgd2FzIGFscmVhZHkgJ3N1c3BlbmRlZCcsIG9yIGVycm9yIGNvZGUgaWYgdGhlIHJlcXVlc3QKKyAgICAgIHJ1bnRpbWUgc3RhdHVzIHdhcyBhbHJlYWR5ICdzdXNwZW5kZWQnLCBvciBlcnJvciBjb2RlIGlmIHRoZSByZXF1ZXN0CiAgICAgICBoYXNuJ3QgYmVlbiBzY2hlZHVsZWQgKG9yIHF1ZXVlZCB1cCBpZiAnZGVsYXknIGlzIDApOyBpZiB0aGUgZXhlY3V0aW9uIG9mCiAgICAgICAtPnJ1bnRpbWVfc3VzcGVuZCgpIGlzIGFscmVhZHkgc2NoZWR1bGVkIGFuZCBub3QgeWV0IGV4cGlyZWQsIHRoZSBuZXcKICAgICAgIHZhbHVlIG9mICdkZWxheScgd2lsbCBiZSB1c2VkIGFzIHRoZSB0aW1lIHRvIHdhaXQKQEAgLTMyOSw3ICszMzEsNyBAQAogICBpbnQgcG1fcmVxdWVzdF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKICAgICAtIHN1Ym1pdCBhIHJlcXVlc3QgdG8gZXhlY3V0ZSB0aGUgc3Vic3lzdGVtLWxldmVsIHJlc3VtZSBjYWxsYmFjayBmb3IgdGhlCiAgICAgICBkZXZpY2UgKHRoZSByZXF1ZXN0IGlzIHJlcHJlc2VudGVkIGJ5IGEgd29yayBpdGVtIGluIHBtX3dxKTsgcmV0dXJucyAwIG9uCi0gICAgICBzdWNjZXNzLCAxIGlmIHRoZSBkZXZpY2UncyBydW4tdGltZSBQTSBzdGF0dXMgd2FzIGFscmVhZHkgJ2FjdGl2ZScsIG9yCisgICAgICBzdWNjZXNzLCAxIGlmIHRoZSBkZXZpY2UncyBydW50aW1lIFBNIHN0YXR1cyB3YXMgYWxyZWFkeSAnYWN0aXZlJywgb3IKICAgICAgIGVycm9yIGNvZGUgaWYgdGhlIHJlcXVlc3QgaGFzbid0IGJlZW4gcXVldWVkIHVwCiAKICAgdm9pZCBwbV9ydW50aW1lX2dldF9ub3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpAQCAtMzY3LDIyICszNjksMzIgQEAKICAgICAgIHBtX3J1bnRpbWVfYXV0b3N1c3BlbmQoZGV2KSBhbmQgcmV0dXJuIGl0cyByZXN1bHQKIAogICB2b2lkIHBtX3J1bnRpbWVfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0gICAgLSBlbmFibGUgdGhlIHJ1bi10aW1lIFBNIGhlbHBlciBmdW5jdGlvbnMgdG8gcnVuIHRoZSBkZXZpY2UgYnVzIHR5cGUncwotICAgICAgcnVuLXRpbWUgUE0gY2FsbGJhY2tzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDIKKyAgICAtIGRlY3JlbWVudCB0aGUgZGV2aWNlJ3MgJ3Bvd2VyLmRpc2FibGVfZGVwdGgnIGZpZWxkOyBpZiB0aGF0IGZpZWxkIGlzIGVxdWFsCisgICAgICB0byB6ZXJvLCB0aGUgcnVudGltZSBQTSBoZWxwZXIgZnVuY3Rpb25zIGNhbiBleGVjdXRlIHN1YnN5c3RlbS1sZXZlbAorICAgICAgY2FsbGJhY2tzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDIgZm9yIHRoZSBkZXZpY2UKIAogICBpbnQgcG1fcnVudGltZV9kaXNhYmxlKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0gICAgLSBwcmV2ZW50IHRoZSBydW4tdGltZSBQTSBoZWxwZXIgZnVuY3Rpb25zIGZyb20gcnVubmluZyBzdWJzeXN0ZW0tbGV2ZWwKLSAgICAgIHJ1bi10aW1lIFBNIGNhbGxiYWNrcyBmb3IgdGhlIGRldmljZSwgbWFrZSBzdXJlIHRoYXQgYWxsIG9mIHRoZSBwZW5kaW5nCi0gICAgICBydW4tdGltZSBQTSBvcGVyYXRpb25zIG9uIHRoZSBkZXZpY2UgYXJlIGVpdGhlciBjb21wbGV0ZWQgb3IgY2FuY2VsZWQ7CisgICAgLSBpbmNyZW1lbnQgdGhlIGRldmljZSdzICdwb3dlci5kaXNhYmxlX2RlcHRoJyBmaWVsZCAoaWYgdGhlIHZhbHVlIG9mIHRoYXQKKyAgICAgIGZpZWxkIHdhcyBwcmV2aW91c2x5IHplcm8sIHRoaXMgcHJldmVudHMgc3Vic3lzdGVtLWxldmVsIHJ1bnRpbWUgUE0KKyAgICAgIGNhbGxiYWNrcyBmcm9tIGJlaW5nIHJ1biBmb3IgdGhlIGRldmljZSksIG1ha2Ugc3VyZSB0aGF0IGFsbCBvZiB0aGUgcGVuZGluZworICAgICAgcnVudGltZSBQTSBvcGVyYXRpb25zIG9uIHRoZSBkZXZpY2UgYXJlIGVpdGhlciBjb21wbGV0ZWQgb3IgY2FuY2VsZWQ7CiAgICAgICByZXR1cm5zIDEgaWYgdGhlcmUgd2FzIGEgcmVzdW1lIHJlcXVlc3QgcGVuZGluZyBhbmQgaXQgd2FzIG5lY2Vzc2FyeSB0bwogICAgICAgZXhlY3V0ZSB0aGUgc3Vic3lzdGVtLWxldmVsIHJlc3VtZSBjYWxsYmFjayBmb3IgdGhlIGRldmljZSB0byBzYXRpc2Z5IHRoYXQKICAgICAgIHJlcXVlc3QsIG90aGVyd2lzZSAwIGlzIHJldHVybmVkCiAKKyAgaW50IHBtX3J1bnRpbWVfYmFycmllcihzdHJ1Y3QgZGV2aWNlICpkZXYpOworICAgIC0gY2hlY2sgaWYgdGhlcmUncyBhIHJlc3VtZSByZXF1ZXN0IHBlbmRpbmcgZm9yIHRoZSBkZXZpY2UgYW5kIHJlc3VtZSBpdAorICAgICAgKHN5bmNocm9ub3VzbHkpIGluIHRoYXQgY2FzZSwgY2FuY2VsIGFueSBvdGhlciBwZW5kaW5nIHJ1bnRpbWUgUE0gcmVxdWVzdHMKKyAgICAgIHJlZ2FyZGluZyBpdCBhbmQgd2FpdCBmb3IgYWxsIHJ1bnRpbWUgUE0gb3BlcmF0aW9ucyBvbiBpdCBpbiBwcm9ncmVzcyB0bworICAgICAgY29tcGxldGU7IHJldHVybnMgMSBpZiB0aGVyZSB3YXMgYSByZXN1bWUgcmVxdWVzdCBwZW5kaW5nIGFuZCBpdCB3YXMKKyAgICAgIG5lY2Vzc2FyeSB0byBleGVjdXRlIHRoZSBzdWJzeXN0ZW0tbGV2ZWwgcmVzdW1lIGNhbGxiYWNrIGZvciB0aGUgZGV2aWNlIHRvCisgICAgICBzYXRpc2Z5IHRoYXQgcmVxdWVzdCwgb3RoZXJ3aXNlIDAgaXMgcmV0dXJuZWQKKwogICB2b2lkIHBtX3N1c3BlbmRfaWdub3JlX2NoaWxkcmVuKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpOwogICAgIC0gc2V0L3Vuc2V0IHRoZSBwb3dlci5pZ25vcmVfY2hpbGRyZW4gZmxhZyBvZiB0aGUgZGV2aWNlCiAKICAgaW50IHBtX3J1bnRpbWVfc2V0X2FjdGl2ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotICAgIC0gY2xlYXIgdGhlIGRldmljZSdzICdwb3dlci5ydW50aW1lX2Vycm9yJyBmbGFnLCBzZXQgdGhlIGRldmljZSdzIHJ1bi10aW1lCisgICAgLSBjbGVhciB0aGUgZGV2aWNlJ3MgJ3Bvd2VyLnJ1bnRpbWVfZXJyb3InIGZsYWcsIHNldCB0aGUgZGV2aWNlJ3MgcnVudGltZQogICAgICAgUE0gc3RhdHVzIHRvICdhY3RpdmUnIGFuZCB1cGRhdGUgaXRzIHBhcmVudCdzIGNvdW50ZXIgb2YgJ2FjdGl2ZScKICAgICAgIGNoaWxkcmVuIGFzIGFwcHJvcHJpYXRlIChpdCBpcyBvbmx5IHZhbGlkIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGlmCiAgICAgICAncG93ZXIucnVudGltZV9lcnJvcicgaXMgc2V0IG9yICdwb3dlci5kaXNhYmxlX2RlcHRoJyBpcyBncmVhdGVyIHRoYW4KQEAgLTM5MCw3ICs0MDIsNyBAQAogICAgICAgd2hpY2ggaXMgbm90IGFjdGl2ZSBhbmQgdGhlICdwb3dlci5pZ25vcmVfY2hpbGRyZW4nIGZsYWcgb2Ygd2hpY2ggaXMgdW5zZXQKIAogICB2b2lkIHBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChzdHJ1Y3QgZGV2aWNlICpkZXYpOwotICAgIC0gY2xlYXIgdGhlIGRldmljZSdzICdwb3dlci5ydW50aW1lX2Vycm9yJyBmbGFnLCBzZXQgdGhlIGRldmljZSdzIHJ1bi10aW1lCisgICAgLSBjbGVhciB0aGUgZGV2aWNlJ3MgJ3Bvd2VyLnJ1bnRpbWVfZXJyb3InIGZsYWcsIHNldCB0aGUgZGV2aWNlJ3MgcnVudGltZQogICAgICAgUE0gc3RhdHVzIHRvICdzdXNwZW5kZWQnIGFuZCB1cGRhdGUgaXRzIHBhcmVudCdzIGNvdW50ZXIgb2YgJ2FjdGl2ZScKICAgICAgIGNoaWxkcmVuIGFzIGFwcHJvcHJpYXRlIChpdCBpcyBvbmx5IHZhbGlkIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGlmCiAgICAgICAncG93ZXIucnVudGltZV9lcnJvcicgaXMgc2V0IG9yICdwb3dlci5kaXNhYmxlX2RlcHRoJyBpcyBncmVhdGVyIHRoYW4KQEAgLTQwMCw2ICs0MTIsOSBAQAogICAgIC0gcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSdzIHJ1bnRpbWUgUE0gc3RhdHVzIGlzICdzdXNwZW5kZWQnIGFuZCBpdHMKICAgICAgICdwb3dlci5kaXNhYmxlX2RlcHRoJyBmaWVsZCBpcyBlcXVhbCB0byB6ZXJvLCBvciBmYWxzZSBvdGhlcndpc2UKIAorICBib29sIHBtX3J1bnRpbWVfc3RhdHVzX3N1c3BlbmRlZChzdHJ1Y3QgZGV2aWNlICpkZXYpOworICAgIC0gcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSdzIHJ1bnRpbWUgUE0gc3RhdHVzIGlzICdzdXNwZW5kZWQnCisKICAgdm9pZCBwbV9ydW50aW1lX2FsbG93KHN0cnVjdCBkZXZpY2UgKmRldik7CiAgICAgLSBzZXQgdGhlIHBvd2VyLnJ1bnRpbWVfYXV0byBmbGFnIGZvciB0aGUgZGV2aWNlIGFuZCBkZWNyZWFzZSBpdHMgdXNhZ2UKICAgICAgIGNvdW50ZXIgKHVzZWQgYnkgdGhlIC9zeXMvZGV2aWNlcy8uLi4vcG93ZXIvY29udHJvbCBpbnRlcmZhY2UgdG8KQEAgLTQxMSw3ICs0MjYsNyBAQAogICAgICAgZWZmZWN0aXZlbHkgcHJldmVudCB0aGUgZGV2aWNlIGZyb20gYmVpbmcgcG93ZXIgbWFuYWdlZCBhdCBydW4gdGltZSkKIAogICB2b2lkIHBtX3J1bnRpbWVfbm9fY2FsbGJhY2tzKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0gICAgLSBzZXQgdGhlIHBvd2VyLm5vX2NhbGxiYWNrcyBmbGFnIGZvciB0aGUgZGV2aWNlIGFuZCByZW1vdmUgdGhlIHJ1bi10aW1lCisgICAgLSBzZXQgdGhlIHBvd2VyLm5vX2NhbGxiYWNrcyBmbGFnIGZvciB0aGUgZGV2aWNlIGFuZCByZW1vdmUgdGhlIHJ1bnRpbWUKICAgICAgIFBNIGF0dHJpYnV0ZXMgZnJvbSAvc3lzL2RldmljZXMvLi4uL3Bvd2VyIChvciBwcmV2ZW50IHRoZW0gZnJvbSBiZWluZwogICAgICAgYWRkZWQgd2hlbiB0aGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQpCiAKQEAgLTQzMSw3ICs0NDYsNyBAQAogCiAgIHZvaWQgcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZGVsYXkpOwogICAgIC0gc2V0IHRoZSBwb3dlci5hdXRvc3VzcGVuZF9kZWxheSB2YWx1ZSB0byAnZGVsYXknIChleHByZXNzZWQgaW4KLSAgICAgIG1pbGxpc2Vjb25kcyk7IGlmICdkZWxheScgaXMgbmVnYXRpdmUgdGhlbiBydW4tdGltZSBzdXNwZW5kcyBhcmUKKyAgICAgIG1pbGxpc2Vjb25kcyk7IGlmICdkZWxheScgaXMgbmVnYXRpdmUgdGhlbiBydW50aW1lIHN1c3BlbmRzIGFyZQogICAgICAgcHJldmVudGVkCiAKICAgdW5zaWduZWQgbG9uZyBwbV9ydW50aW1lX2F1dG9zdXNwZW5kX2V4cGlyYXRpb24oc3RydWN0IGRldmljZSAqZGV2KTsKQEAgLTQ3MCw3NiArNDg1LDkyIEBACiBwbV9ydW50aW1lX2dldF9zeW5jKCkKIHBtX3J1bnRpbWVfcHV0X3N5bmNfc3VzcGVuZCgpCiAKLTUuIFJ1bi10aW1lIFBNIEluaXRpYWxpemF0aW9uLCBEZXZpY2UgUHJvYmluZyBhbmQgUmVtb3ZhbAorNS4gUnVudGltZSBQTSBJbml0aWFsaXphdGlvbiwgRGV2aWNlIFByb2JpbmcgYW5kIFJlbW92YWwKIAotSW5pdGlhbGx5LCB0aGUgcnVuLXRpbWUgUE0gaXMgZGlzYWJsZWQgZm9yIGFsbCBkZXZpY2VzLCB3aGljaCBtZWFucyB0aGF0IHRoZQotbWFqb3JpdHkgb2YgdGhlIHJ1bi10aW1lIFBNIGhlbHBlciBmdW50aW9ucyBkZXNjcmliZWQgaW4gU2VjdGlvbiA0IHdpbGwgcmV0dXJuCitJbml0aWFsbHksIHRoZSBydW50aW1lIFBNIGlzIGRpc2FibGVkIGZvciBhbGwgZGV2aWNlcywgd2hpY2ggbWVhbnMgdGhhdCB0aGUKK21ham9yaXR5IG9mIHRoZSBydW50aW1lIFBNIGhlbHBlciBmdW50aW9ucyBkZXNjcmliZWQgaW4gU2VjdGlvbiA0IHdpbGwgcmV0dXJuCiAtRUFHQUlOIHVudGlsIHBtX3J1bnRpbWVfZW5hYmxlKCkgaXMgY2FsbGVkIGZvciB0aGUgZGV2aWNlLgogCi1JbiBhZGRpdGlvbiB0byB0aGF0LCB0aGUgaW5pdGlhbCBydW4tdGltZSBQTSBzdGF0dXMgb2YgYWxsIGRldmljZXMgaXMKK0luIGFkZGl0aW9uIHRvIHRoYXQsIHRoZSBpbml0aWFsIHJ1bnRpbWUgUE0gc3RhdHVzIG9mIGFsbCBkZXZpY2VzIGlzCiAnc3VzcGVuZGVkJywgYnV0IGl0IG5lZWQgbm90IHJlZmxlY3QgdGhlIGFjdHVhbCBwaHlzaWNhbCBzdGF0ZSBvZiB0aGUgZGV2aWNlLgogVGh1cywgaWYgdGhlIGRldmljZSBpcyBpbml0aWFsbHkgYWN0aXZlIChpLmUuIGl0IGlzIGFibGUgdG8gcHJvY2VzcyBJL08pLCBpdHMKLXJ1bi10aW1lIFBNIHN0YXR1cyBtdXN0IGJlIGNoYW5nZWQgdG8gJ2FjdGl2ZScsIHdpdGggdGhlIGhlbHAgb2YKK3J1bnRpbWUgUE0gc3RhdHVzIG11c3QgYmUgY2hhbmdlZCB0byAnYWN0aXZlJywgd2l0aCB0aGUgaGVscCBvZgogcG1fcnVudGltZV9zZXRfYWN0aXZlKCksIGJlZm9yZSBwbV9ydW50aW1lX2VuYWJsZSgpIGlzIGNhbGxlZCBmb3IgdGhlIGRldmljZS4KIAotSG93ZXZlciwgaWYgdGhlIGRldmljZSBoYXMgYSBwYXJlbnQgYW5kIHRoZSBwYXJlbnQncyBydW4tdGltZSBQTSBpcyBlbmFibGVkLAorSG93ZXZlciwgaWYgdGhlIGRldmljZSBoYXMgYSBwYXJlbnQgYW5kIHRoZSBwYXJlbnQncyBydW50aW1lIFBNIGlzIGVuYWJsZWQsCiBjYWxsaW5nIHBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgpIGZvciB0aGUgZGV2aWNlIHdpbGwgYWZmZWN0IHRoZSBwYXJlbnQsIHVubGVzcwogdGhlIHBhcmVudCdzICdwb3dlci5pZ25vcmVfY2hpbGRyZW4nIGZsYWcgaXMgc2V0LiAgTmFtZWx5LCBpbiB0aGF0IGNhc2UgdGhlCiBwYXJlbnQgd29uJ3QgYmUgYWJsZSB0byBzdXNwZW5kIGF0IHJ1biB0aW1lLCB1c2luZyB0aGUgUE0gY29yZSdzIGhlbHBlcgogZnVuY3Rpb25zLCBhcyBsb25nIGFzIHRoZSBjaGlsZCdzIHN0YXR1cyBpcyAnYWN0aXZlJywgZXZlbiBpZiB0aGUgY2hpbGQncwotcnVuLXRpbWUgUE0gaXMgc3RpbGwgZGlzYWJsZWQgKGkuZS4gcG1fcnVudGltZV9lbmFibGUoKSBoYXNuJ3QgYmVlbiBjYWxsZWQgZm9yCitydW50aW1lIFBNIGlzIHN0aWxsIGRpc2FibGVkIChpLmUuIHBtX3J1bnRpbWVfZW5hYmxlKCkgaGFzbid0IGJlZW4gY2FsbGVkIGZvcgogdGhlIGNoaWxkIHlldCBvciBwbV9ydW50aW1lX2Rpc2FibGUoKSBoYXMgYmVlbiBjYWxsZWQgZm9yIGl0KS4gIEZvciB0aGlzIHJlYXNvbiwKIG9uY2UgcG1fcnVudGltZV9zZXRfYWN0aXZlKCkgaGFzIGJlZW4gY2FsbGVkIGZvciB0aGUgZGV2aWNlLCBwbV9ydW50aW1lX2VuYWJsZSgpCi1zaG91bGQgYmUgY2FsbGVkIGZvciBpdCB0b28gYXMgc29vbiBhcyByZWFzb25hYmx5IHBvc3NpYmxlIG9yIGl0cyBydW4tdGltZSBQTQorc2hvdWxkIGJlIGNhbGxlZCBmb3IgaXQgdG9vIGFzIHNvb24gYXMgcmVhc29uYWJseSBwb3NzaWJsZSBvciBpdHMgcnVudGltZSBQTQogc3RhdHVzIHNob3VsZCBiZSBjaGFuZ2VkIGJhY2sgdG8gJ3N1c3BlbmRlZCcgd2l0aCB0aGUgaGVscCBvZgogcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKCkuCiAKLUlmIHRoZSBkZWZhdWx0IGluaXRpYWwgcnVuLXRpbWUgUE0gc3RhdHVzIG9mIHRoZSBkZXZpY2UgKGkuZS4gJ3N1c3BlbmRlZCcpCitJZiB0aGUgZGVmYXVsdCBpbml0aWFsIHJ1bnRpbWUgUE0gc3RhdHVzIG9mIHRoZSBkZXZpY2UgKGkuZS4gJ3N1c3BlbmRlZCcpCiByZWZsZWN0cyB0aGUgYWN0dWFsIHN0YXRlIG9mIHRoZSBkZXZpY2UsIGl0cyBidXMgdHlwZSdzIG9yIGl0cyBkcml2ZXIncwogLT5wcm9iZSgpIGNhbGxiYWNrIHdpbGwgbGlrZWx5IG5lZWQgdG8gd2FrZSBpdCB1cCB1c2luZyBvbmUgb2YgdGhlIFBNIGNvcmUncwogaGVscGVyIGZ1bmN0aW9ucyBkZXNjcmliZWQgaW4gU2VjdGlvbiA0LiAgSW4gdGhhdCBjYXNlLCBwbV9ydW50aW1lX3Jlc3VtZSgpCi1zaG91bGQgYmUgdXNlZC4gIE9mIGNvdXJzZSwgZm9yIHRoaXMgcHVycG9zZSB0aGUgZGV2aWNlJ3MgcnVuLXRpbWUgUE0gaGFzIHRvIGJlCitzaG91bGQgYmUgdXNlZC4gIE9mIGNvdXJzZSwgZm9yIHRoaXMgcHVycG9zZSB0aGUgZGV2aWNlJ3MgcnVudGltZSBQTSBoYXMgdG8gYmUKIGVuYWJsZWQgZWFybGllciBieSBjYWxsaW5nIHBtX3J1bnRpbWVfZW5hYmxlKCkuCiAKLUlmIHRoZSBkZXZpY2UgYnVzIHR5cGUncyBvciBkcml2ZXIncyAtPnByb2JlKCkgb3IgLT5yZW1vdmUoKSBjYWxsYmFjayBydW5zCitJZiB0aGUgZGV2aWNlIGJ1cyB0eXBlJ3Mgb3IgZHJpdmVyJ3MgLT5wcm9iZSgpIGNhbGxiYWNrIHJ1bnMKIHBtX3J1bnRpbWVfc3VzcGVuZCgpIG9yIHBtX3J1bnRpbWVfaWRsZSgpIG9yIHRoZWlyIGFzeW5jaHJvbm91cyBjb3VudGVycGFydHMsCiB0aGV5IHdpbGwgZmFpbCByZXR1cm5pbmcgLUVBR0FJTiwgYmVjYXVzZSB0aGUgZGV2aWNlJ3MgdXNhZ2UgY291bnRlciBpcwotaW5jcmVtZW50ZWQgYnkgdGhlIGNvcmUgYmVmb3JlIGV4ZWN1dGluZyAtPnByb2JlKCkgYW5kIC0+cmVtb3ZlKCkuICBTdGlsbCwgaXQKLW1heSBiZSBkZXNpcmFibGUgdG8gc3VzcGVuZCB0aGUgZGV2aWNlIGFzIHNvb24gYXMgLT5wcm9iZSgpIG9yIC0+cmVtb3ZlKCkgaGFzCi1maW5pc2hlZCwgc28gdGhlIFBNIGNvcmUgdXNlcyBwbV9ydW50aW1lX2lkbGVfc3luYygpIHRvIGludm9rZSB0aGUKLXN1YnN5c3RlbS1sZXZlbCBpZGxlIGNhbGxiYWNrIGZvciB0aGUgZGV2aWNlIGF0IHRoYXQgdGltZS4KK2luY3JlbWVudGVkIGJ5IHRoZSBkcml2ZXIgY29yZSBiZWZvcmUgZXhlY3V0aW5nIC0+cHJvYmUoKS4gIFN0aWxsLCBpdCBtYXkgYmUKK2Rlc2lyYWJsZSB0byBzdXNwZW5kIHRoZSBkZXZpY2UgYXMgc29vbiBhcyAtPnByb2JlKCkgaGFzIGZpbmlzaGVkLCBzbyB0aGUgZHJpdmVyCitjb3JlIHVzZXMgcG1fcnVudGltZV9wdXRfc3luYygpIHRvIGludm9rZSB0aGUgc3Vic3lzdGVtLWxldmVsIGlkbGUgY2FsbGJhY2sgZm9yCit0aGUgZGV2aWNlIGF0IHRoYXQgdGltZS4KKworTW9yZW92ZXIsIHRoZSBkcml2ZXIgY29yZSBwcmV2ZW50cyBydW50aW1lIFBNIGNhbGxiYWNrcyBmcm9tIHJhY2luZyB3aXRoIHRoZSBidXMKK25vdGlmaWVyIGNhbGxiYWNrIGluIF9fZGV2aWNlX3JlbGVhc2VfZHJpdmVyKCksIHdoaWNoIGlzIG5lY2Vzc2FyeSwgYmVjYXVzZSB0aGUKK25vdGlmaWVyIGlzIHVzZWQgYnkgc29tZSBzdWJzeXN0ZW1zIHRvIGNhcnJ5IG91dCBvcGVyYXRpb25zIGFmZmVjdGluZyB0aGUKK3J1bnRpbWUgUE0gZnVuY3Rpb25hbGl0eS4gIEl0IGRvZXMgc28gYnkgY2FsbGluZyBwbV9ydW50aW1lX2dldF9zeW5jKCkgYmVmb3JlCitkcml2ZXJfc3lzZnNfcmVtb3ZlKCkgYW5kIHRoZSBCVVNfTk9USUZZX1VOQklORF9EUklWRVIgbm90aWZpY2F0aW9ucy4gIFRoaXMKK3Jlc3VtZXMgdGhlIGRldmljZSBpZiBpdCdzIGluIHRoZSBzdXNwZW5kZWQgc3RhdGUgYW5kIHByZXZlbnRzIGl0IGZyb20KK2JlaW5nIHN1c3BlbmRlZCBhZ2FpbiB3aGlsZSB0aG9zZSByb3V0aW5lcyBhcmUgYmVpbmcgZXhlY3V0ZWQuCisKK1RvIGFsbG93IGJ1cyB0eXBlcyBhbmQgZHJpdmVycyB0byBwdXQgZGV2aWNlcyBpbnRvIHRoZSBzdXNwZW5kZWQgc3RhdGUgYnkKK2NhbGxpbmcgcG1fcnVudGltZV9zdXNwZW5kKCkgZnJvbSB0aGVpciAtPnJlbW92ZSgpIHJvdXRpbmVzLCB0aGUgZHJpdmVyIGNvcmUKK2V4ZWN1dGVzIHBtX3J1bnRpbWVfcHV0X3N5bmMoKSBhZnRlciBydW5uaW5nIHRoZSBCVVNfTk9USUZZX1VOQklORF9EUklWRVIKK25vdGlmaWNhdGlvbnMgaW4gX19kZXZpY2VfcmVsZWFzZV9kcml2ZXIoKS4gIFRoaXMgcmVxdWlyZXMgYnVzIHR5cGVzIGFuZAorZHJpdmVycyB0byBtYWtlIHRoZWlyIC0+cmVtb3ZlKCkgY2FsbGJhY2tzIGF2b2lkIHJhY2VzIHdpdGggcnVudGltZSBQTSBkaXJlY3RseSwKK2J1dCBhbHNvIGl0IGFsbG93cyBvZiBtb3JlIGZsZXhpYmlsaXR5IGluIHRoZSBoYW5kbGluZyBvZiBkZXZpY2VzIGR1cmluZyB0aGUKK3JlbW92YWwgb2YgdGhlaXIgZHJpdmVycy4KIAogVGhlIHVzZXIgc3BhY2UgY2FuIGVmZmVjdGl2ZWx5IGRpc2FsbG93IHRoZSBkcml2ZXIgb2YgdGhlIGRldmljZSB0byBwb3dlciBtYW5hZ2UKIGl0IGF0IHJ1biB0aW1lIGJ5IGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBpdHMgL3N5cy9kZXZpY2VzLy4uLi9wb3dlci9jb250cm9sCiBhdHRyaWJ1dGUgdG8gIm9uIiwgd2hpY2ggY2F1c2VzIHBtX3J1bnRpbWVfZm9yYmlkKCkgdG8gYmUgY2FsbGVkLiAgSW4gcHJpbmNpcGxlLAogdGhpcyBtZWNoYW5pc20gbWF5IGFsc28gYmUgdXNlZCBieSB0aGUgZHJpdmVyIHRvIGVmZmVjdGl2ZWx5IHR1cm4gb2ZmIHRoZQotcnVuLXRpbWUgcG93ZXIgbWFuYWdlbWVudCBvZiB0aGUgZGV2aWNlIHVudGlsIHRoZSB1c2VyIHNwYWNlIHR1cm5zIGl0IG9uLgotTmFtZWx5LCBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIHRoZSBkcml2ZXIgY2FuIG1ha2Ugc3VyZSB0aGF0IHRoZSBydW4tdGltZSBQTQorcnVudGltZSBwb3dlciBtYW5hZ2VtZW50IG9mIHRoZSBkZXZpY2UgdW50aWwgdGhlIHVzZXIgc3BhY2UgdHVybnMgaXQgb24uCitOYW1lbHksIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gdGhlIGRyaXZlciBjYW4gbWFrZSBzdXJlIHRoYXQgdGhlIHJ1bnRpbWUgUE0KIHN0YXR1cyBvZiB0aGUgZGV2aWNlIGlzICdhY3RpdmUnIGFuZCBjYWxsIHBtX3J1bnRpbWVfZm9yYmlkKCkuICBJdCBzaG91bGQgYmUKIG5vdGVkLCBob3dldmVyLCB0aGF0IGlmIHRoZSB1c2VyIHNwYWNlIGhhcyBhbHJlYWR5IGludGVudGlvbmFsbHkgY2hhbmdlZCB0aGUKIHZhbHVlIG9mIC9zeXMvZGV2aWNlcy8uLi4vcG93ZXIvY29udHJvbCB0byAiYXV0byIgdG8gYWxsb3cgdGhlIGRyaXZlciB0byBwb3dlcgogbWFuYWdlIHRoZSBkZXZpY2UgYXQgcnVuIHRpbWUsIHRoZSBkcml2ZXIgbWF5IGNvbmZ1c2UgaXQgYnkgdXNpbmcKIHBtX3J1bnRpbWVfZm9yYmlkKCkgdGhpcyB3YXkuCiAKLTYuIFJ1bi10aW1lIFBNIGFuZCBTeXN0ZW0gU2xlZXAKKzYuIFJ1bnRpbWUgUE0gYW5kIFN5c3RlbSBTbGVlcAogCi1SdW4tdGltZSBQTSBhbmQgc3lzdGVtIHNsZWVwIChpLmUuLCBzeXN0ZW0gc3VzcGVuZCBhbmQgaGliZXJuYXRpb24sIGFsc28ga25vd24KK1J1bnRpbWUgUE0gYW5kIHN5c3RlbSBzbGVlcCAoaS5lLiwgc3lzdGVtIHN1c3BlbmQgYW5kIGhpYmVybmF0aW9uLCBhbHNvIGtub3duCiBhcyBzdXNwZW5kLXRvLVJBTSBhbmQgc3VzcGVuZC10by1kaXNrKSBpbnRlcmFjdCB3aXRoIGVhY2ggb3RoZXIgaW4gYSBjb3VwbGUgb2YKIHdheXMuICBJZiBhIGRldmljZSBpcyBhY3RpdmUgd2hlbiBhIHN5c3RlbSBzbGVlcCBzdGFydHMsIGV2ZXJ5dGhpbmcgaXMKIHN0cmFpZ2h0Zm9yd2FyZC4gIEJ1dCB3aGF0IHNob3VsZCBoYXBwZW4gaWYgdGhlIGRldmljZSBpcyBhbHJlYWR5IHN1c3BlbmRlZD8KIAotVGhlIGRldmljZSBtYXkgaGF2ZSBkaWZmZXJlbnQgd2FrZS11cCBzZXR0aW5ncyBmb3IgcnVuLXRpbWUgUE0gYW5kIHN5c3RlbSBzbGVlcC4KLUZvciBleGFtcGxlLCByZW1vdGUgd2FrZS11cCBtYXkgYmUgZW5hYmxlZCBmb3IgcnVuLXRpbWUgc3VzcGVuZCBidXQgZGlzYWxsb3dlZAorVGhlIGRldmljZSBtYXkgaGF2ZSBkaWZmZXJlbnQgd2FrZS11cCBzZXR0aW5ncyBmb3IgcnVudGltZSBQTSBhbmQgc3lzdGVtIHNsZWVwLgorRm9yIGV4YW1wbGUsIHJlbW90ZSB3YWtlLXVwIG1heSBiZSBlbmFibGVkIGZvciBydW50aW1lIHN1c3BlbmQgYnV0IGRpc2FsbG93ZWQKIGZvciBzeXN0ZW0gc2xlZXAgKGRldmljZV9tYXlfd2FrZXVwKGRldikgcmV0dXJucyAnZmFsc2UnKS4gIFdoZW4gdGhpcyBoYXBwZW5zLAogdGhlIHN1YnN5c3RlbS1sZXZlbCBzeXN0ZW0gc3VzcGVuZCBjYWxsYmFjayBpcyByZXNwb25zaWJsZSBmb3IgY2hhbmdpbmcgdGhlCiBkZXZpY2UncyB3YWtlLXVwIHNldHRpbmcgKGl0IG1heSBsZWF2ZSB0aGF0IHRvIHRoZSBkZXZpY2UgZHJpdmVyJ3Mgc3lzdGVtCiBzdXNwZW5kIHJvdXRpbmUpLiAgSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byByZXN1bWUgdGhlIGRldmljZSBhbmQgc3VzcGVuZCBpdCBhZ2FpbgogaW4gb3JkZXIgdG8gZG8gc28uICBUaGUgc2FtZSBpcyB0cnVlIGlmIHRoZSBkcml2ZXIgdXNlcyBkaWZmZXJlbnQgcG93ZXIgbGV2ZWxzCi1vciBvdGhlciBzZXR0aW5ncyBmb3IgcnVuLXRpbWUgc3VzcGVuZCBhbmQgc3lzdGVtIHNsZWVwLgorb3Igb3RoZXIgc2V0dGluZ3MgZm9yIHJ1bnRpbWUgc3VzcGVuZCBhbmQgc3lzdGVtIHNsZWVwLgogCi1EdXJpbmcgc3lzdGVtIHJlc3VtZSwgZGV2aWNlcyBnZW5lcmFsbHkgc2hvdWxkIGJlIGJyb3VnaHQgYmFjayB0byBmdWxsIHBvd2VyLAotZXZlbiBpZiB0aGV5IHdlcmUgc3VzcGVuZGVkIGJlZm9yZSB0aGUgc3lzdGVtIHNsZWVwIGJlZ2FuLiAgVGhlcmUgYXJlIHNldmVyYWwKLXJlYXNvbnMgZm9yIHRoaXMsIGluY2x1ZGluZzoKK0R1cmluZyBzeXN0ZW0gcmVzdW1lLCB0aGUgc2ltcGxlc3QgYXBwcm9hY2ggaXMgdG8gYnJpbmcgYWxsIGRldmljZXMgYmFjayB0byBmdWxsCitwb3dlciwgZXZlbiBpZiB0aGV5IGhhZCBiZWVuIHN1c3BlbmRlZCBiZWZvcmUgdGhlIHN5c3RlbSBzdXNwZW5kIGJlZ2FuLiAgVGhlcmUKK2FyZSBzZXZlcmFsIHJlYXNvbnMgZm9yIHRoaXMsIGluY2x1ZGluZzoKIAogICAqIFRoZSBkZXZpY2UgbWlnaHQgbmVlZCB0byBzd2l0Y2ggcG93ZXIgbGV2ZWxzLCB3YWtlLXVwIHNldHRpbmdzLCBldGMuCiAKQEAgLTU1NCwyMiArNTg1LDQ5IEBACiAgICogVGhlIGRldmljZSBtaWdodCBuZWVkIHRvIGJlIHJlc2V0LgogCiAgICogRXZlbiB0aG91Z2ggdGhlIGRldmljZSB3YXMgc3VzcGVuZGVkLCBpZiBpdHMgdXNhZ2UgY291bnRlciB3YXMgPiAwIHRoZW4gbW9zdAotICAgIGxpa2VseSBpdCB3b3VsZCBuZWVkIGEgcnVuLXRpbWUgcmVzdW1lIGluIHRoZSBuZWFyIGZ1dHVyZSBhbnl3YXkuCisgICAgbGlrZWx5IGl0IHdvdWxkIG5lZWQgYSBydW50aW1lIHJlc3VtZSBpbiB0aGUgbmVhciBmdXR1cmUgYW55d2F5LgogCi0gICogQWx3YXlzIGdvaW5nIGJhY2sgdG8gZnVsbCBwb3dlciBpcyBzaW1wbGVzdC4KLQotSWYgdGhlIGRldmljZSB3YXMgc3VzcGVuZGVkIGJlZm9yZSB0aGUgc2xlZXAgYmVnYW4sIHRoZW4gaXRzIHJ1bi10aW1lIFBNIHN0YXR1cwotd2lsbCBoYXZlIHRvIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgYWN0dWFsIHBvc3Qtc3lzdGVtIHNsZWVwIHN0YXR1cy4gIFRoZSB3YXkKLXRvIGRvIHRoaXMgaXM6CitJZiB0aGUgZGV2aWNlIGhhZCBiZWVuIHN1c3BlbmRlZCBiZWZvcmUgdGhlIHN5c3RlbSBzdXNwZW5kIGJlZ2FuIGFuZCBpdCdzCiticm91Z2h0IGJhY2sgdG8gZnVsbCBwb3dlciBkdXJpbmcgcmVzdW1lLCB0aGVuIGl0cyBydW50aW1lIFBNIHN0YXR1cyB3aWxsIGhhdmUKK3RvIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgYWN0dWFsIHBvc3Qtc3lzdGVtIHNsZWVwIHN0YXR1cy4gIFRoZSB3YXkgdG8gZG8KK3RoaXMgaXM6CiAKIAlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKIAlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKIAlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwogCi1UaGUgUE0gY29yZSBhbHdheXMgaW5jcmVtZW50cyB0aGUgcnVuLXRpbWUgdXNhZ2UgY291bnRlciBiZWZvcmUgY2FsbGluZyB0aGUKLS0+cHJlcGFyZSgpIGNhbGxiYWNrIGFuZCBkZWNyZW1lbnRzIGl0IGFmdGVyIGNhbGxpbmcgdGhlIC0+Y29tcGxldGUoKSBjYWxsYmFjay4KLUhlbmNlIGRpc2FibGluZyBydW4tdGltZSBQTSB0ZW1wb3JhcmlseSBsaWtlIHRoaXMgd2lsbCBub3QgY2F1c2UgYW55IHJ1bi10aW1lCi1zdXNwZW5kIGNhbGxiYWNrcyB0byBiZSBsb3N0LgorVGhlIFBNIGNvcmUgYWx3YXlzIGluY3JlbWVudHMgdGhlIHJ1bnRpbWUgdXNhZ2UgY291bnRlciBiZWZvcmUgY2FsbGluZyB0aGUKKy0+c3VzcGVuZCgpIGNhbGxiYWNrIGFuZCBkZWNyZW1lbnRzIGl0IGFmdGVyIGNhbGxpbmcgdGhlIC0+cmVzdW1lKCkgY2FsbGJhY2suCitIZW5jZSBkaXNhYmxpbmcgcnVudGltZSBQTSB0ZW1wb3JhcmlseSBsaWtlIHRoaXMgd2lsbCBub3QgY2F1c2UgYW55IHJ1bnRpbWUKK3N1c3BlbmQgYXR0ZW1wdHMgdG8gYmUgcGVybWFuZW50bHkgbG9zdC4gIElmIHRoZSB1c2FnZSBjb3VudCBnb2VzIHRvIHplcm8KK2ZvbGxvd2luZyB0aGUgcmV0dXJuIG9mIHRoZSAtPnJlc3VtZSgpIGNhbGxiYWNrLCB0aGUgLT5ydW50aW1lX2lkbGUoKSBjYWxsYmFjaword2lsbCBiZSBpbnZva2VkIGFzIHVzdWFsLgorCitPbiBzb21lIHN5c3RlbXMsIGhvd2V2ZXIsIHN5c3RlbSBzbGVlcCBpcyBub3QgZW50ZXJlZCB0aHJvdWdoIGEgZ2xvYmFsIGZpcm13YXJlCitvciBoYXJkd2FyZSBvcGVyYXRpb24uICBJbnN0ZWFkLCBhbGwgaGFyZHdhcmUgY29tcG9uZW50cyBhcmUgcHV0IGludG8gbG93LXBvd2VyCitzdGF0ZXMgZGlyZWN0bHkgYnkgdGhlIGtlcm5lbCBpbiBhIGNvb3JkaW5hdGVkIHdheS4gIFRoZW4sIHRoZSBzeXN0ZW0gc2xlZXAKK3N0YXRlIGVmZmVjdGl2ZWx5IGZvbGxvd3MgZnJvbSB0aGUgc3RhdGVzIHRoZSBoYXJkd2FyZSBjb21wb25lbnRzIGVuZCB1cCBpbgorYW5kIHRoZSBzeXN0ZW0gaXMgd29rZW4gdXAgZnJvbSB0aGF0IHN0YXRlIGJ5IGEgaGFyZHdhcmUgaW50ZXJydXB0IG9yIGEgc2ltaWxhcgorbWVjaGFuaXNtIGVudGlyZWx5IHVuZGVyIHRoZSBrZXJuZWwncyBjb250cm9sLiAgQXMgYSByZXN1bHQsIHRoZSBrZXJuZWwgbmV2ZXIKK2dpdmVzIGNvbnRyb2wgYXdheSBhbmQgdGhlIHN0YXRlcyBvZiBhbGwgZGV2aWNlcyBkdXJpbmcgcmVzdW1lIGFyZSBwcmVjaXNlbHkKK2tub3duIHRvIGl0LiAgSWYgdGhhdCBpcyB0aGUgY2FzZSBhbmQgbm9uZSBvZiB0aGUgc2l0dWF0aW9ucyBsaXN0ZWQgYWJvdmUgdGFrZXMKK3BsYWNlIChpbiBwYXJ0aWN1bGFyLCBpZiB0aGUgc3lzdGVtIGlzIG5vdCB3YWtpbmcgdXAgZnJvbSBoaWJlcm5hdGlvbiksIGl0IG1heQorYmUgbW9yZSBlZmZpY2llbnQgdG8gbGVhdmUgdGhlIGRldmljZXMgdGhhdCBoYWQgYmVlbiBzdXNwZW5kZWQgYmVmb3JlIHRoZSBzeXN0ZW0KK3N1c3BlbmQgYmVnYW4gaW4gdGhlIHN1c3BlbmRlZCBzdGF0ZS4KKworVGhlIFBNIGNvcmUgZG9lcyBpdHMgYmVzdCB0byByZWR1Y2UgdGhlIHByb2JhYmlsaXR5IG9mIHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuCit0aGUgcnVudGltZSBQTSBhbmQgc3lzdGVtIHN1c3BlbmQvcmVzdW1lIChhbmQgaGliZXJuYXRpb24pIGNhbGxiYWNrcyBieSBjYXJyeWluZworb3V0IHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uczoKKworICAqIER1cmluZyBzeXN0ZW0gc3VzcGVuZCBpdCBjYWxscyBwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgpIGFuZAorICAgIHBtX3J1bnRpbWVfYmFycmllcigpIGZvciBldmVyeSBkZXZpY2UgcmlnaHQgYmVmb3JlIGV4ZWN1dGluZyB0aGUKKyAgICBzdWJzeXN0ZW0tbGV2ZWwgLnN1c3BlbmQoKSBjYWxsYmFjayBmb3IgaXQuICBJbiBhZGRpdGlvbiB0byB0aGF0IGl0IGNhbGxzCisgICAgcG1fcnVudGltZV9kaXNhYmxlKCkgZm9yIGV2ZXJ5IGRldmljZSByaWdodCBhZnRlciBleGVjdXRpbmcgdGhlCisgICAgc3Vic3lzdGVtLWxldmVsIC5zdXNwZW5kKCkgY2FsbGJhY2sgZm9yIGl0LgorCisgICogRHVyaW5nIHN5c3RlbSByZXN1bWUgaXQgY2FsbHMgcG1fcnVudGltZV9lbmFibGUoKSBhbmQgcG1fcnVudGltZV9wdXRfc3luYygpCisgICAgZm9yIGV2ZXJ5IGRldmljZSByaWdodCBiZWZvcmUgYW5kIHJpZ2h0IGFmdGVyIGV4ZWN1dGluZyB0aGUgc3Vic3lzdGVtLWxldmVsCisgICAgLnJlc3VtZSgpIGNhbGxiYWNrIGZvciBpdCwgcmVzcGVjdGl2ZWx5LgogCiA3LiBHZW5lcmljIHN1YnN5c3RlbSBjYWxsYmFja3MKIApAQCAtNTk1LDQwICs2NTMsNjggQEAKICAgICAgIGNhbGxiYWNrIHByb3ZpZGVkIGJ5IGl0cyBkcml2ZXIgYW5kIHJldHVybiBpdHMgcmVzdWx0LCBvciByZXR1cm4gMCBpZiBub3QKICAgICAgIGRlZmluZWQKIAorICBpbnQgcG1fZ2VuZXJpY19zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldik7CisgICAgLSBpZiBwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpIHJldHVybnMgImZhbHNlIiwgaW52b2tlIHRoZSAtPnN1c3BlbmRfbm9pcnEoKQorICAgICAgY2FsbGJhY2sgcHJvdmlkZWQgYnkgdGhlIGRldmljZSdzIGRyaXZlciBhbmQgcmV0dXJuIGl0cyByZXN1bHQsIG9yIHJldHVybgorICAgICAgMCBpZiBub3QgZGVmaW5lZAorCiAgIGludCBwbV9nZW5lcmljX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogICAgIC0gaW52b2tlIHRoZSAtPnJlc3VtZSgpIGNhbGxiYWNrIHByb3ZpZGVkIGJ5IHRoZSBkcml2ZXIgb2YgdGhpcyBkZXZpY2UgYW5kLAogICAgICAgaWYgc3VjY2Vzc2Z1bCwgY2hhbmdlIHRoZSBkZXZpY2UncyBydW50aW1lIFBNIHN0YXR1cyB0byAnYWN0aXZlJwogCisgIGludCBwbV9nZW5lcmljX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpOworICAgIC0gaW52b2tlIHRoZSAtPnJlc3VtZV9ub2lycSgpIGNhbGxiYWNrIHByb3ZpZGVkIGJ5IHRoZSBkcml2ZXIgb2YgdGhpcyBkZXZpY2UKKwogICBpbnQgcG1fZ2VuZXJpY19mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KTsKICAgICAtIGlmIHRoZSBkZXZpY2UgaGFzIG5vdCBiZWVuIHN1c3BlbmRlZCBhdCBydW4gdGltZSwgaW52b2tlIHRoZSAtPmZyZWV6ZSgpCiAgICAgICBjYWxsYmFjayBwcm92aWRlZCBieSBpdHMgZHJpdmVyIGFuZCByZXR1cm4gaXRzIHJlc3VsdCwgb3IgcmV0dXJuIDAgaWYgbm90CiAgICAgICBkZWZpbmVkCiAKKyAgaW50IHBtX2dlbmVyaWNfZnJlZXplX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldik7CisgICAgLSBpZiBwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpIHJldHVybnMgImZhbHNlIiwgaW52b2tlIHRoZSAtPmZyZWV6ZV9ub2lycSgpCisgICAgICBjYWxsYmFjayBwcm92aWRlZCBieSB0aGUgZGV2aWNlJ3MgZHJpdmVyIGFuZCByZXR1cm4gaXRzIHJlc3VsdCwgb3IgcmV0dXJuCisgICAgICAwIGlmIG5vdCBkZWZpbmVkCisKICAgaW50IHBtX2dlbmVyaWNfdGhhdyhzdHJ1Y3QgZGV2aWNlICpkZXYpOwogICAgIC0gaWYgdGhlIGRldmljZSBoYXMgbm90IGJlZW4gc3VzcGVuZGVkIGF0IHJ1biB0aW1lLCBpbnZva2UgdGhlIC0+dGhhdygpCiAgICAgICBjYWxsYmFjayBwcm92aWRlZCBieSBpdHMgZHJpdmVyIGFuZCByZXR1cm4gaXRzIHJlc3VsdCwgb3IgcmV0dXJuIDAgaWYgbm90CiAgICAgICBkZWZpbmVkCiAKKyAgaW50IHBtX2dlbmVyaWNfdGhhd19ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpOworICAgIC0gaWYgcG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSByZXR1cm5zICJmYWxzZSIsIGludm9rZSB0aGUgLT50aGF3X25vaXJxKCkKKyAgICAgIGNhbGxiYWNrIHByb3ZpZGVkIGJ5IHRoZSBkZXZpY2UncyBkcml2ZXIgYW5kIHJldHVybiBpdHMgcmVzdWx0LCBvciByZXR1cm4KKyAgICAgIDAgaWYgbm90IGRlZmluZWQKKwogICBpbnQgcG1fZ2VuZXJpY19wb3dlcm9mZihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogICAgIC0gaWYgdGhlIGRldmljZSBoYXMgbm90IGJlZW4gc3VzcGVuZGVkIGF0IHJ1biB0aW1lLCBpbnZva2UgdGhlIC0+cG93ZXJvZmYoKQogICAgICAgY2FsbGJhY2sgcHJvdmlkZWQgYnkgaXRzIGRyaXZlciBhbmQgcmV0dXJuIGl0cyByZXN1bHQsIG9yIHJldHVybiAwIGlmIG5vdAogICAgICAgZGVmaW5lZAogCisgIGludCBwbV9nZW5lcmljX3Bvd2Vyb2ZmX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldik7CisgICAgLSBpZiBwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpIHJldHVybnMgImZhbHNlIiwgcnVuIHRoZSAtPnBvd2Vyb2ZmX25vaXJxKCkKKyAgICAgIGNhbGxiYWNrIHByb3ZpZGVkIGJ5IHRoZSBkZXZpY2UncyBkcml2ZXIgYW5kIHJldHVybiBpdHMgcmVzdWx0LCBvciByZXR1cm4KKyAgICAgIDAgaWYgbm90IGRlZmluZWQKKwogICBpbnQgcG1fZ2VuZXJpY19yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldik7CiAgICAgLSBpbnZva2UgdGhlIC0+cmVzdG9yZSgpIGNhbGxiYWNrIHByb3ZpZGVkIGJ5IHRoZSBkcml2ZXIgb2YgdGhpcyBkZXZpY2UgYW5kLAogICAgICAgaWYgc3VjY2Vzc2Z1bCwgY2hhbmdlIHRoZSBkZXZpY2UncyBydW50aW1lIFBNIHN0YXR1cyB0byAnYWN0aXZlJwogCisgIGludCBwbV9nZW5lcmljX3Jlc3RvcmVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KTsKKyAgICAtIGludm9rZSB0aGUgLT5yZXN0b3JlX25vaXJxKCkgY2FsbGJhY2sgcHJvdmlkZWQgYnkgdGhlIGRldmljZSdzIGRyaXZlcgorCiBUaGVzZSBmdW5jdGlvbnMgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSAtPnJ1bnRpbWVfaWRsZSgpLCAtPnJ1bnRpbWVfc3VzcGVuZCgpLAotLT5ydW50aW1lX3Jlc3VtZSgpLCAtPnN1c3BlbmQoKSwgLT5yZXN1bWUoKSwgLT5mcmVlemUoKSwgLT50aGF3KCksIC0+cG93ZXJvZmYoKSwKLW9yIC0+cmVzdG9yZSgpIGNhbGxiYWNrIHBvaW50ZXJzIGluIHRoZSBzdWJzeXN0ZW0tbGV2ZWwgZGV2X3BtX29wcyBzdHJ1Y3R1cmVzLgorLT5ydW50aW1lX3Jlc3VtZSgpLCAtPnN1c3BlbmQoKSwgLT5zdXNwZW5kX25vaXJxKCksIC0+cmVzdW1lKCksCistPnJlc3VtZV9ub2lycSgpLCAtPmZyZWV6ZSgpLCAtPmZyZWV6ZV9ub2lycSgpLCAtPnRoYXcoKSwgLT50aGF3X25vaXJxKCksCistPnBvd2Vyb2ZmKCksIC0+cG93ZXJvZmZfbm9pcnEoKSwgLT5yZXN0b3JlKCksIC0+cmVzdG9yZV9ub2lycSgpIGNhbGxiYWNrCitwb2ludGVycyBpbiB0aGUgc3Vic3lzdGVtLWxldmVsIGRldl9wbV9vcHMgc3RydWN0dXJlcy4KIAogSWYgYSBzdWJzeXN0ZW0gd2lzaGVzIHRvIHVzZSBhbGwgb2YgdGhlbSBhdCB0aGUgc2FtZSB0aW1lLCBpdCBjYW4gc2ltcGx5IGFzc2lnbgogdGhlIEdFTkVSSUNfU1VCU1lTX1BNX09QUyBtYWNybywgZGVmaW5lZCBpbiBpbmNsdWRlL2xpbnV4L3BtLmgsIHRvIGl0cwogZGV2X3BtX29wcyBzdHJ1Y3R1cmUgcG9pbnRlci4KIAogRGV2aWNlIGRyaXZlcnMgdGhhdCB3aXNoIHRvIHVzZSB0aGUgc2FtZSBmdW5jdGlvbiBhcyBhIHN5c3RlbSBzdXNwZW5kLCBmcmVlemUsCi1wb3dlcm9mZiBhbmQgcnVuLXRpbWUgc3VzcGVuZCBjYWxsYmFjaywgYW5kIHNpbWlsYXJseSBmb3Igc3lzdGVtIHJlc3VtZSwgdGhhdywKLXJlc3RvcmUsIGFuZCBydW4tdGltZSByZXN1bWUsIGNhbiBhY2hpZXZlIHRoaXMgd2l0aCB0aGUgaGVscCBvZiB0aGUKK3Bvd2Vyb2ZmIGFuZCBydW50aW1lIHN1c3BlbmQgY2FsbGJhY2ssIGFuZCBzaW1pbGFybHkgZm9yIHN5c3RlbSByZXN1bWUsIHRoYXcsCityZXN0b3JlLCBhbmQgcnVudGltZSByZXN1bWUsIGNhbiBhY2hpZXZlIHRoaXMgd2l0aCB0aGUgaGVscCBvZiB0aGUKIFVOSVZFUlNBTF9ERVZfUE1fT1BTIG1hY3JvIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9wbS5oIChwb3NzaWJseSBzZXR0aW5nIGl0cwogbGFzdCBhcmd1bWVudCB0byBOVUxMKS4KIApAQCAtNjM4LDcgKzcyNCw3IEBACiBwb3dlci1tYW5hZ2VkIG9uIHRoZWlyIG93bi4gIChUaGUgcHJvdG90eXBlIGV4YW1wbGUgaXMgYSBVU0IgaW50ZXJmYWNlLiAgRW50aXJlCiBVU0IgZGV2aWNlcyBjYW4gZ28gaW50byBsb3ctcG93ZXIgbW9kZSBvciBzZW5kIHdha2UtdXAgcmVxdWVzdHMsIGJ1dCBuZWl0aGVyIGlzCiBwb3NzaWJsZSBmb3IgaW5kaXZpZHVhbCBpbnRlcmZhY2VzLikgIFRoZSBkcml2ZXJzIGZvciB0aGVzZSBkZXZpY2VzIGhhdmUgbm8KLW5lZWQgb2YgcnVuLXRpbWUgUE0gY2FsbGJhY2tzOyBpZiB0aGUgY2FsbGJhY2tzIGRpZCBleGlzdCwgLT5ydW50aW1lX3N1c3BlbmQoKQorbmVlZCBvZiBydW50aW1lIFBNIGNhbGxiYWNrczsgaWYgdGhlIGNhbGxiYWNrcyBkaWQgZXhpc3QsIC0+cnVudGltZV9zdXNwZW5kKCkKIGFuZCAtPnJ1bnRpbWVfcmVzdW1lKCkgd291bGQgYWx3YXlzIHJldHVybiAwIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcgZWxzZSBhbmQKIC0+cnVudGltZV9pZGxlKCkgd291bGQgYWx3YXlzIGNhbGwgcG1fcnVudGltZV9zdXNwZW5kKCkuCiAKQEAgLTY0Niw3ICs3MzIsNyBAQAogcG1fcnVudGltZV9ub19jYWxsYmFja3MoKS4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgdGhlIGRldmljZSBzdHJ1Y3R1cmUgaXMKIGluaXRpYWxpemVkIGFuZCBiZWZvcmUgaXQgaXMgcmVnaXN0ZXJlZCAoYWx0aG91Z2ggYWZ0ZXIgZGV2aWNlIHJlZ2lzdHJhdGlvbiBpcwogYWxzbyBva2F5KS4gIFRoZSByb3V0aW5lIHdpbGwgc2V0IHRoZSBkZXZpY2UncyBwb3dlci5ub19jYWxsYmFja3MgZmxhZyBhbmQKLXByZXZlbnQgdGhlIG5vbi1kZWJ1Z2dpbmcgcnVuLXRpbWUgUE0gc3lzZnMgYXR0cmlidXRlcyBmcm9tIGJlaW5nIGNyZWF0ZWQuCitwcmV2ZW50IHRoZSBub24tZGVidWdnaW5nIHJ1bnRpbWUgUE0gc3lzZnMgYXR0cmlidXRlcyBmcm9tIGJlaW5nIGNyZWF0ZWQuCiAKIFdoZW4gcG93ZXIubm9fY2FsbGJhY2tzIGlzIHNldCwgdGhlIFBNIGNvcmUgd2lsbCBub3QgaW52b2tlIHRoZQogLT5ydW50aW1lX2lkbGUoKSwgLT5ydW50aW1lX3N1c3BlbmQoKSwgb3IgLT5ydW50aW1lX3Jlc3VtZSgpIGNhbGxiYWNrcy4KQEAgLTY1NCw3ICs3NDAsNyBAQAogZGV2aWNlcyBzaG91bGQgYmUgc3VzcGVuZGVkLgogCiBBcyBhIGNvbnNlcXVlbmNlLCB0aGUgUE0gY29yZSB3aWxsIG5ldmVyIGRpcmVjdGx5IGluZm9ybSB0aGUgZGV2aWNlJ3Mgc3Vic3lzdGVtCi1vciBkcml2ZXIgYWJvdXQgcnVuLXRpbWUgcG93ZXIgY2hhbmdlcy4gIEluc3RlYWQsIHRoZSBkcml2ZXIgZm9yIHRoZSBkZXZpY2Uncworb3IgZHJpdmVyIGFib3V0IHJ1bnRpbWUgcG93ZXIgY2hhbmdlcy4gIEluc3RlYWQsIHRoZSBkcml2ZXIgZm9yIHRoZSBkZXZpY2UncwogcGFyZW50IG11c3QgdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgdGVsbGluZyB0aGUgZGV2aWNlJ3MgZHJpdmVyIHdoZW4gdGhlCiBwYXJlbnQncyBwb3dlciBzdGF0ZSBjaGFuZ2VzLgogCkBAIC02NjUsMTMgKzc1MSwxMyBAQAogdGhpbmsgaXQgd2lsbCByZW1haW4gaW4gdGhhdCBzdGF0ZSBmb3IgYSBzdWJzdGFudGlhbCB0aW1lLiAgQSBjb21tb24gaGV1cmlzdGljCiBzYXlzIHRoYXQgYSBkZXZpY2Ugd2hpY2ggaGFzbid0IGJlZW4gdXNlZCBmb3IgYSB3aGlsZSBpcyBsaWFibGUgdG8gcmVtYWluCiB1bnVzZWQ7IGZvbGxvd2luZyB0aGlzIGFkdmljZSwgZHJpdmVycyBzaG91bGQgbm90IGFsbG93IGRldmljZXMgdG8gYmUgc3VzcGVuZGVkCi1hdCBydW4tdGltZSB1bnRpbCB0aGV5IGhhdmUgYmVlbiBpbmFjdGl2ZSBmb3Igc29tZSBtaW5pbXVtIHBlcmlvZC4gIEV2ZW4gd2hlbgorYXQgcnVudGltZSB1bnRpbCB0aGV5IGhhdmUgYmVlbiBpbmFjdGl2ZSBmb3Igc29tZSBtaW5pbXVtIHBlcmlvZC4gIEV2ZW4gd2hlbgogdGhlIGhldXJpc3RpYyBlbmRzIHVwIGJlaW5nIG5vbi1vcHRpbWFsLCBpdCB3aWxsIHN0aWxsIHByZXZlbnQgZGV2aWNlcyBmcm9tCiAiYm91bmNpbmciIHRvbyByYXBpZGx5IGJldHdlZW4gbG93LXBvd2VyIGFuZCBmdWxsLXBvd2VyIHN0YXRlcy4KIAogVGhlIHRlcm0gImF1dG9zdXNwZW5kIiBpcyBhbiBoaXN0b3JpY2FsIHJlbW5hbnQuICBJdCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUKIGRldmljZSBpcyBhdXRvbWF0aWNhbGx5IHN1c3BlbmRlZCAodGhlIHN1YnN5c3RlbSBvciBkcml2ZXIgc3RpbGwgaGFzIHRvIGNhbGwKLXRoZSBhcHByb3ByaWF0ZSBQTSByb3V0aW5lcyk7IHJhdGhlciBpdCBtZWFucyB0aGF0IHJ1bi10aW1lIHN1c3BlbmRzIHdpbGwKK3RoZSBhcHByb3ByaWF0ZSBQTSByb3V0aW5lcyk7IHJhdGhlciBpdCBtZWFucyB0aGF0IHJ1bnRpbWUgc3VzcGVuZHMgd2lsbAogYXV0b21hdGljYWxseSBiZSBkZWxheWVkIHVudGlsIHRoZSBkZXNpcmVkIHBlcmlvZCBvZiBpbmFjdGl2aXR5IGhhcyBlbGFwc2VkLgogCiBJbmFjdGl2aXR5IGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIHBvd2VyLmxhc3RfYnVzeSBmaWVsZC4gIERyaXZlcnMgc2hvdWxkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ByaW50ay1mb3JtYXRzLnR4dCBiL0RvY3VtZW50YXRpb24vcHJpbnRrLWZvcm1hdHMudHh0CmluZGV4IDFiNWE1ZGQuLjVkZjE3NmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcHJpbnRrLWZvcm1hdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcHJpbnRrLWZvcm1hdHMudHh0CkBAIC05LDcgKzksMTIxIEBACiAJCXNpemVfdAkJCSV6dSBvciAlengKIAkJc3NpemVfdAkJCSV6ZCBvciAlengKIAotUmF3IHBvaW50ZXIgdmFsdWUgU0hPVUxEIGJlIHByaW50ZWQgd2l0aCAlcC4KK1JhdyBwb2ludGVyIHZhbHVlIFNIT1VMRCBiZSBwcmludGVkIHdpdGggJXAuIFRoZSBrZXJuZWwgc3VwcG9ydHMKK3RoZSBmb2xsb3dpbmcgZXh0ZW5kZWQgZm9ybWF0IHNwZWNpZmllcnMgZm9yIHBvaW50ZXIgdHlwZXM6CisKK1N5bWJvbHMvRnVuY3Rpb24gUG9pbnRlcnM6CisKKwklcEYJdmVyc2F0aWxlX2luaXQrMHgwLzB4MTEwCisJJXBmCXZlcnNhdGlsZV9pbml0CisJJXBTCXZlcnNhdGlsZV9pbml0KzB4MC8weDExMAorCSVwcwl2ZXJzYXRpbGVfaW5pdAorCSVwQglwcmV2X2ZuX29mX3ZlcnNhdGlsZV9pbml0KzB4ODgvMHg4OAorCisJRm9yIHByaW50aW5nIHN5bWJvbHMgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzLiBUaGUgJ1MnIGFuZCAncycgc3BlY2lmaWVycworCXJlc3VsdCBpbiB0aGUgc3ltYm9sIG5hbWUgd2l0aCAoJ1MnKSBvciB3aXRob3V0ICgncycpIG9mZnNldHMuIFdoZXJlCisJdGhpcyBpcyB1c2VkIG9uIGEga2VybmVsIHdpdGhvdXQgS0FMTFNZTVMgLSB0aGUgc3ltYm9sIGFkZHJlc3MgaXMKKwlwcmludGVkIGluc3RlYWQuCisKKwlUaGUgJ0InIHNwZWNpZmllciByZXN1bHRzIGluIHRoZSBzeW1ib2wgbmFtZSB3aXRoIG9mZnNldHMgYW5kIHNob3VsZCBiZQorCXVzZWQgd2hlbiBwcmludGluZyBzdGFjayBiYWNrdHJhY2VzLiBUaGUgc3BlY2lmaWVyIHRha2VzIGludG8KKwljb25zaWRlcmF0aW9uIHRoZSBlZmZlY3Qgb2YgY29tcGlsZXIgb3B0aW1pc2F0aW9ucyB3aGljaCBtYXkgb2NjdXIKKwl3aGVuIHRhaWwtY2FsbCdzIGFyZSB1c2VkIGFuZCBtYXJrZWQgd2l0aCB0aGUgbm9yZXR1cm4gR0NDIGF0dHJpYnV0ZS4KKworCU9uIGlhNjQsIHBwYzY0IGFuZCBwYXJpc2M2NCBhcmNoaXRlY3R1cmVzIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZQorCWFjdHVhbGx5IGZ1bmN0aW9uIGRlc2NyaXB0b3JzIHdoaWNoIG11c3QgZmlyc3QgYmUgcmVzb2x2ZWQuIFRoZSAnRicgYW5kCisJJ2YnIHNwZWNpZmllcnMgcGVyZm9ybSB0aGlzIHJlc29sdXRpb24gYW5kIHRoZW4gcHJvdmlkZSB0aGUgc2FtZQorCWZ1bmN0aW9uYWxpdHkgYXMgdGhlICdTJyBhbmQgJ3MnIHNwZWNpZmllcnMuCisKK0tlcm5lbCBQb2ludGVyczoKKworCSVwSwkweDAxMjM0NTY3IG9yIDB4MDEyMzQ1Njc4OWFiY2RlZgorCisJRm9yIHByaW50aW5nIGtlcm5lbCBwb2ludGVycyB3aGljaCBzaG91bGQgYmUgaGlkZGVuIGZyb20gdW5wcml2aWxlZ2VkCisJdXNlcnMuIFRoZSBiZWhhdmlvdXIgb2YgJXBLIGRlcGVuZHMgb24gdGhlIGtwdHJfcmVzdHJpY3Qgc3lzY3RsIC0gc2VlCisJRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorCitTdHJ1Y3QgUmVzb3VyY2VzOgorCisJJXByCVttZW0gMHg2MDAwMDAwMC0weDZmZmZmZmZmIGZsYWdzIDB4MjIwMF0gb3IKKwkJW21lbSAweDAwMDAwMDAwNjAwMDAwMDAtMHgwMDAwMDAwMDZmZmZmZmZmIGZsYWdzIDB4MjIwMF0KKwklcFIJW21lbSAweDYwMDAwMDAwLTB4NmZmZmZmZmYgcHJlZl0gb3IKKwkJW21lbSAweDAwMDAwMDAwNjAwMDAwMDAtMHgwMDAwMDAwMDZmZmZmZmZmIHByZWZdCisKKwlGb3IgcHJpbnRpbmcgc3RydWN0IHJlc291cmNlcy4gVGhlICdSJyBhbmQgJ3InIHNwZWNpZmllcnMgcmVzdWx0IGluIGEKKwlwcmludGVkIHJlc291cmNlIHdpdGggKCdSJykgb3Igd2l0aG91dCAoJ3InKSBhIGRlY29kZWQgZmxhZ3MgbWVtYmVyLgorCitNQUMvRkRESSBhZGRyZXNzZXM6CisKKwklcE0JMDA6MDE6MDI6MDM6MDQ6MDUKKwklcE1GCTAwLTAxLTAyLTAzLTA0LTA1CisJJXBtCTAwMDEwMjAzMDQwNQorCisJRm9yIHByaW50aW5nIDYtYnl0ZSBNQUMvRkRESSBhZGRyZXNzZXMgaW4gaGV4IG5vdGF0aW9uLiBUaGUgJ00nIGFuZCAnbScKKwlzcGVjaWZpZXJzIHJlc3VsdCBpbiBhIHByaW50ZWQgYWRkcmVzcyB3aXRoICgnTScpIG9yIHdpdGhvdXQgKCdtJykgYnl0ZQorCXNlcGFyYXRvcnMuIFRoZSBkZWZhdWx0IGJ5dGUgc2VwYXJhdG9yIGlzIHRoZSBjb2xvbiAoJzonKS4KKworCVdoZXJlIEZEREkgYWRkcmVzc2VzIGFyZSBjb25jZXJuZWQgdGhlICdGJyBzcGVjaWZpZXIgY2FuIGJlIHVzZWQgYWZ0ZXIKKwl0aGUgJ00nIHNwZWNpZmllciB0byB1c2UgZGFzaCAoJy0nKSBzZXBhcmF0b3JzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKKwlzZXBhcmF0b3IuCisKK0lQdjQgYWRkcmVzc2VzOgorCisJJXBJNAkxLjIuMy40CisJJXBpNAkwMDEuMDAyLjAwMy4wMDQKKwklcFtJaV1baG5ibF0KKworCUZvciBwcmludGluZyBJUHY0IGRvdC1zZXBhcmF0ZWQgZGVjaW1hbCBhZGRyZXNzZXMuIFRoZSAnSTQnIGFuZCAnaTQnCisJc3BlY2lmaWVycyByZXN1bHQgaW4gYSBwcmludGVkIGFkZHJlc3Mgd2l0aCAoJ2k0Jykgb3Igd2l0aG91dCAoJ0k0JykKKwlsZWFkaW5nIHplcm9zLgorCisJVGhlIGFkZGl0aW9uYWwgJ2gnLCAnbicsICdiJywgYW5kICdsJyBzcGVjaWZpZXJzIGFyZSB1c2VkIHRvIHNwZWNpZnkKKwlob3N0LCBuZXR3b3JrLCBiaWcgb3IgbGl0dGxlIGVuZGlhbiBvcmRlciBhZGRyZXNzZXMgcmVzcGVjdGl2ZWx5LiBXaGVyZQorCW5vIHNwZWNpZmllciBpcyBwcm92aWRlZCB0aGUgZGVmYXVsdCBuZXR3b3JrL2JpZyBlbmRpYW4gb3JkZXIgaXMgdXNlZC4KKworSVB2NiBhZGRyZXNzZXM6CisKKwklcEk2CTAwMDE6MDAwMjowMDAzOjAwMDQ6MDAwNTowMDA2OjAwMDc6MDAwOAorCSVwaTYJMDAwMTAwMDIwMDAzMDAwNDAwMDUwMDA2MDAwNzAwMDgKKwklcEk2YwkxOjI6Mzo0OjU6Njo3OjgKKworCUZvciBwcmludGluZyBJUHY2IG5ldHdvcmstb3JkZXIgMTYtYml0IGhleCBhZGRyZXNzZXMuIFRoZSAnSTYnIGFuZCAnaTYnCisJc3BlY2lmaWVycyByZXN1bHQgaW4gYSBwcmludGVkIGFkZHJlc3Mgd2l0aCAoJ0k2Jykgb3Igd2l0aG91dCAoJ2k2JykKKwljb2xvbi1zZXBhcmF0b3JzLiBMZWFkaW5nIHplcm9zIGFyZSBhbHdheXMgdXNlZC4KKworCVRoZSBhZGRpdGlvbmFsICdjJyBzcGVjaWZpZXIgY2FuIGJlIHVzZWQgd2l0aCB0aGUgJ0knIHNwZWNpZmllciB0bworCXByaW50IGEgY29tcHJlc3NlZCBJUHY2IGFkZHJlc3MgYXMgZGVzY3JpYmVkIGJ5CisJaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTk1MgorCitVVUlEL0dVSUQgYWRkcmVzc2VzOgorCisJJXBVYgkwMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGYKKwklcFVCCTAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBBMEIwQzBEMEUwRgorCSVwVWwJMDMwMjAxMDAtMDUwNC0wNzA2LTA4MDktMGEwYjBjMGUwZTBmCisJJXBVTAkwMzAyMDEwMC0wNTA0LTA3MDYtMDgwOS0wQTBCMEMwRTBFMEYKKworCUZvciBwcmludGluZyAxNi1ieXRlIFVVSUQvR1VJRHMgYWRkcmVzc2VzLiBUaGUgYWRkaXRpb25hbCAnbCcsICdMJywKKwknYicgYW5kICdCJyBzcGVjaWZpZXJzIGFyZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXR0bGUgZW5kaWFuIG9yZGVyIGluCisJbG93ZXIgKCdsJykgb3IgdXBwZXIgY2FzZSAoJ0wnKSBoZXggY2hhcmFjdGVycyAtIGFuZCBiaWcgZW5kaWFuIG9yZGVyCisJaW4gbG93ZXIgKCdiJykgb3IgdXBwZXIgY2FzZSAoJ0InKSBoZXggY2hhcmFjdGVycy4KKworCVdoZXJlIG5vIGFkZGl0aW9uYWwgc3BlY2lmaWVycyBhcmUgdXNlZCB0aGUgZGVmYXVsdCBsaXR0bGUgZW5kaWFuCisJb3JkZXIgd2l0aCBsb3dlciBjYXNlIGhleCBjaGFyYWN0ZXJzIHdpbGwgYmUgcHJpbnRlZC4KKworc3RydWN0IHZhX2Zvcm1hdDoKKworCSVwVgorCisJRm9yIHByaW50aW5nIHN0cnVjdCB2YV9mb3JtYXQgc3RydWN0dXJlcy4gVGhlc2UgY29udGFpbiBhIGZvcm1hdCBzdHJpbmcKKwlhbmQgdmFfbGlzdCBhcyBmb2xsb3dzOgorCisJc3RydWN0IHZhX2Zvcm1hdCB7CisJCWNvbnN0IGNoYXIgKmZtdDsKKwkJdmFfbGlzdCAqdmE7CisJfTsKKworCURvIG5vdCB1c2UgdGhpcyBmZWF0dXJlIHdpdGhvdXQgc29tZSBtZWNoYW5pc20gdG8gdmVyaWZ5IHRoZQorCWNvcnJlY3RuZXNzIG9mIHRoZSBmb3JtYXQgc3RyaW5nIGFuZCB2YV9saXN0IGFyZ3VtZW50cy4KIAogdTY0IFNIT1VMRCBiZSBwcmludGVkIHdpdGggJWxsdS8lbGx4LCAodW5zaWduZWQgbG9uZyBsb25nKToKIApAQCAtMzIsNCArMTQ2LDUgQEAKIFRoYW5rIHlvdSBmb3IgeW91ciBjb29wZXJhdGlvbiBhbmQgYXR0ZW50aW9uLgogCiAKLUJ5IFJhbmR5IER1bmxhcCA8cmR1bmxhcEB4ZW5vdGltZS5uZXQ+CitCeSBSYW5keSBEdW5sYXAgPHJkdW5sYXBAeGVub3RpbWUubmV0PiBhbmQKK0FuZHJldyBNdXJyYXkgPGFtdXJyYXlAbXBjLWRhdGEuY28udWs+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3JidHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL3JidHJlZS50eHQKaW5kZXggMTlmODI3OC4uOGQzMmQ4NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9yYnRyZWUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcmJ0cmVlLnR4dApAQCAtMTk2LDE1ICsxOTYsMjAgQEAKIEF1Z21lbnRlZCByYnRyZWUgaXMgYW4gcmJ0cmVlIHdpdGggInNvbWUiIGFkZGl0aW9uYWwgZGF0YSBzdG9yZWQgaW4gZWFjaCBub2RlLgogVGhpcyBkYXRhIGNhbiBiZSB1c2VkIHRvIGF1Z21lbnQgc29tZSBuZXcgZnVuY3Rpb25hbGl0eSB0byByYnRyZWUuCiBBdWdtZW50ZWQgcmJ0cmVlIGlzIGFuIG9wdGlvbmFsIGZlYXR1cmUgYnVpbHQgb24gdG9wIG9mIGJhc2ljIHJidHJlZQotaW5mcmFzdHJ1Y3R1cmUuIHJidHJlZSB1c2VyIHdobyB3YW50cyB0aGlzIGZlYXR1cmUgd2lsbCBoYXZlIGFuIGF1Z21lbnQKLWNhbGxiYWNrIGZ1bmN0aW9uIGluIHJiX3Jvb3QgaW5pdGlhbGl6ZWQuCitpbmZyYXN0cnVjdHVyZS4gQW4gcmJ0cmVlIHVzZXIgd2hvIHdhbnRzIHRoaXMgZmVhdHVyZSB3aWxsIGhhdmUgdG8gY2FsbCB0aGUKK2F1Z21lbnRhdGlvbiBmdW5jdGlvbnMgd2l0aCB0aGUgdXNlciBwcm92aWRlZCBhdWdtZW50YXRpb24gY2FsbGJhY2sKK3doZW4gaW5zZXJ0aW5nIGFuZCBlcmFzaW5nIG5vZGVzLgogCi1UaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZyb20gcmJ0cmVlIGNvcmUgcm91dGluZXMgd2hlbmV2ZXIKLWEgbm9kZSBoYXMgYSBjaGFuZ2UgaW4gb25lIG9yIGJvdGggb2YgaXRzIGNoaWxkcmVuLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkKLW9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byByZWNhbGN1bGF0ZSB0aGUgYWRkaXRpb25hbCBkYXRhIHRoYXQgaXMgaW4gdGhlCi1yYiBub2RlIHVzaW5nIG5ldyBjaGlsZHJlbiBpbmZvcm1hdGlvbi4gTm90ZSB0aGF0IGlmIHRoaXMgbmV3IGFkZGl0aW9uYWwKLWRhdGEgYWZmZWN0cyB0aGUgcGFyZW50IG5vZGUncyBhZGRpdGlvbmFsIGRhdGEsIHRoZW4gY2FsbGJhY2sgZnVuY3Rpb24gaGFzCi10byBoYW5kbGUgaXQgYW5kIGRvIHRoZSByZWN1cnNpdmUgdXBkYXRlcy4KK09uIGluc2VydGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIHJiX2F1Z21lbnRfaW5zZXJ0KCkgb25jZSB0aGUgbmV3IG5vZGUgaXMgaW4KK3BsYWNlLiBUaGlzIHdpbGwgY2F1c2UgdGhlIGF1Z21lbnRhdGlvbiBmdW5jdGlvbiBjYWxsYmFjayB0byBiZSBjYWxsZWQgZm9yCitlYWNoIG5vZGUgYmV0d2VlbiB0aGUgbmV3IG5vZGUgYW5kIHRoZSByb290IHdoaWNoIGhhcyBiZWVuIGFmZmVjdGVkIGJ5IHRoZQoraW5zZXJ0aW9uLgorCitXaGVuIGVyYXNpbmcgYSBub2RlLCB0aGUgdXNlciBtdXN0IGNhbGwgcmJfYXVnbWVudF9lcmFzZV9iZWdpbigpIGZpcnN0IHRvCityZXRyaWV2ZSB0aGUgZGVlcGVzdCBub2RlIG9uIHRoZSByZWJhbGFuY2UgcGF0aC4gVGhlbiwgYWZ0ZXIgZXJhc2luZyB0aGUKK29yaWdpbmFsIG5vZGUsIHRoZSB1c2VyIG11c3QgY2FsbCByYl9hdWdtZW50X2VyYXNlX2VuZCgpIHdpdGggdGhlIGRlZXBlc3QKK25vZGUgZm91bmQgZWFybGllci4gVGhpcyB3aWxsIGNhdXNlIHRoZSBhdWdtZW50YXRpb24gZnVuY3Rpb24gdG8gYmUgY2FsbGVkCitmb3IgZWFjaCBhZmZlY3RlZCBub2RlIGJldHdlZW4gdGhlIGRlZXBlc3Qgbm9kZSBhbmQgdGhlIHJvb3QuCiAKIAogSW50ZXJ2YWwgdHJlZSBpcyBhbiBleGFtcGxlIG9mIGF1Z21lbnRlZCByYiB0cmVlLiBSZWZlcmVuY2UgLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL1RBUEUgYi9Eb2N1bWVudGF0aW9uL3MzOTAvVEFQRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzOWFhNS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvVEFQRQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi1DaGFubmVsIGF0dGFjaGVkIFRhcGUgZGV2aWNlIGRyaXZlciAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1XQVJOSU5HLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoaXMgZHJpdmVyIGlzIGNvbnNpZGVyZWQgdG8gYmUgRVhQRVJJTUVOVEFMLiBEbyBOT1QgdXNlIGl0IGluIAotcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuIEZlZWwgZnJlZSB0byB0ZXN0IGl0IGFuZCByZXBvcnQgcHJvYmxlbXMgYmFjayB0byB1cy4gCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgTElOVVggZm9yIHpTZXJpZXMgdGFwZSBkZXZpY2UgZHJpdmVyIG1hbmFnZXMgY2hhbm5lbCBhdHRhY2hlZCB0YXBlIGRyaXZlcyAKLXdoaWNoIGFyZSBjb21wYXRpYmxlIHRvIElCTSAzNDgwIG9yIElCTSAzNDkwIG1hZ25ldGljIHRhcGUgc3Vic3lzdGVtcy4gVGhpcyAKLWluY2x1ZGVzIHZhcmlvdXMgbW9kZWxzIG9mIHRoZXNlIGRldmljZXMgKGZvciBleGFtcGxlIHRoZSAzNDkwRSkuIAotCi0KLVRhcGUgZHJpdmVyIGZlYXR1cmVzIAotCi1UaGUgZGV2aWNlIGRyaXZlciBzdXBwb3J0cyBhIG1heGltdW0gb2YgMTI4IHRhcGUgZGV2aWNlcy4gCi1ObyBvZmZpY2lhbCBMSU5VWCBkZXZpY2UgbWFqb3IgbnVtYmVyIGlzIGFzc2lnbmVkIHRvIHRoZSB6U2VyaWVzIHRhcGUgZGV2aWNlIAotZHJpdmVyLiBJdCBhbGxvY2F0ZXMgbWFqb3IgbnVtYmVycyBkeW5hbWljYWxseSBhbmQgcmVwb3J0cyB0aGVtIG9uIHN5c3RlbSAKLXN0YXJ0dXAuIAotVHlwaWNhbGx5IGl0IHdpbGwgZ2V0IG1ham9yIG51bWJlciAyNTQgZm9yIGJvdGggdGhlIGNoYXJhY3RlciBkZXZpY2UgZnJvbnQtZW5kIAotYW5kIHRoZSBibG9jayBkZXZpY2UgZnJvbnQtZW5kLiAKLQotVGhlIHRhcGUgZGV2aWNlIGRyaXZlciBuZWVkcyBubyBrZXJuZWwgcGFyYW1ldGVycy4gQWxsIHN1cHBvcnRlZCBkZXZpY2VzIAotcHJlc2VudCBhcmUgZGV0ZWN0ZWQgb24gZHJpdmVyIGluaXRpYWxpemF0aW9uIGF0IHN5c3RlbSBzdGFydHVwIG9yIG1vZHVsZSBsb2FkLgotVGhlIGRldmljZXMgZGV0ZWN0ZWQgYXJlIG9yZGVyZWQgYnkgdGhlaXIgc3ViY2hhbm5lbCBudW1iZXJzLiBUaGUgZGV2aWNlIHdpdGggCi10aGUgbG93ZXN0IHN1YmNoYW5uZWwgbnVtYmVyIGJlY29tZXMgZGV2aWNlIDAsIHRoZSBuZXh0IG9uZSB3aWxsIGJlIGRldmljZSAxIAotYW5kIHNvIG9uLiAKLQotCi1UYXBlIGNoYXJhY3RlciBkZXZpY2UgZnJvbnQtZW5kIAotCi1UaGUgdXN1YWwgd2F5IHRvIHJlYWQgb3Igd3JpdGUgdG8gdGhlIHRhcGUgZGV2aWNlIGlzIHRocm91Z2ggdGhlIGNoYXJhY3RlciAKLWRldmljZSBmcm9udC1lbmQuIFRoZSB6U2VyaWVzIHRhcGUgZGV2aWNlIGRyaXZlciBwcm92aWRlcyB0d28gY2hhcmFjdGVyIGRldmljZXMKLWZvciBlYWNoIHBoeXNpY2FsIGRldmljZSAtLSB0aGUgZmlyc3Qgb2YgdGhlc2Ugd2lsbCByZXdpbmQgYXV0b21hdGljYWxseSB3aGVuIAotaXQgaXMgY2xvc2VkLCB0aGUgc2Vjb25kIHdpbGwgbm90IHJld2luZCBhdXRvbWF0aWNhbGx5LiAKLQotVGhlIGNoYXJhY3RlciBkZXZpY2Ugbm9kZXMgYXJlIG5hbWVkIC9kZXYvcnRpYm0wIChyZXdpbmRpbmcpIGFuZCAvZGV2L250aWJtMCAKLShub24tcmV3aW5kaW5nKSBmb3IgdGhlIGZpcnN0IGRldmljZSwgL2Rldi9ydGlibTEgYW5kIC9kZXYvbnRpYm0xIGZvciB0aGUgCi1zZWNvbmQsIGFuZCBzbyBvbi4gCi0KLVRoZSBjaGFyYWN0ZXIgZGV2aWNlIGZyb250LWVuZCBjYW4gYmUgdXNlZCBhcyBhbnkgb3RoZXIgTElOVVggdGFwZSBkZXZpY2UuIFlvdSAKLWNhbiB3cml0ZSB0byBpdCBhbmQgcmVhZCBmcm9tIGl0IHVzaW5nIExJTlVYIGZhY2lsaXRpZXMgc3VjaCBhcyBHTlUgdGFyLiBUaGUgCi10b29sIG10IGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gY29udHJvbCBvcGVyYXRpb25zLCBzdWNoIGFzIHJld2luZGluZyB0aGUgdGFwZSAKLW9yIHNraXBwaW5nIGEgZmlsZS4gCi0KLU1vc3QgTElOVVggdGFwZSBzb2Z0d2FyZSBzaG91bGQgd29yayB3aXRoIGVpdGhlciB0YXBlIGNoYXJhY3RlciBkZXZpY2UuIAotCi0KLVRhcGUgYmxvY2sgZGV2aWNlIGZyb250LWVuZCAKLQotVGhlIHRhcGUgZGV2aWNlIG1heSBhbHNvIGJlIGFjY2Vzc2VkIGFzIGEgYmxvY2sgZGV2aWNlIGluIHJlYWQtb25seSBtb2RlLiAKLVRoaXMgY291bGQgYmUgdXNlZCBmb3Igc29mdHdhcmUgaW5zdGFsbGF0aW9uIGluIHRoZSBzYW1lIHdheSBhcyBpdCBpcyB1c2VkIHdpdGggCi1vdGhlciBvcGVyYXRpb24gc3lzdGVtcyBvbiB0aGUgelNlcmllcyBwbGF0Zm9ybSAoYW5kIG1vc3QgTElOVVggCi1kaXN0cmlidXRpb25zIGFyZSBzaGlwcGVkIG9uIGNvbXBhY3QgZGlzayB1c2luZyBJU085NjYwIGZpbGVzeXN0ZW1zKS4gCi0KLU9uZSBibG9jayBkZXZpY2Ugbm9kZSBpcyBwcm92aWRlZCBmb3IgZWFjaCBwaHlzaWNhbCBkZXZpY2UuIFRoZXNlIGFyZSBuYW1lZCAKLS9kZXYvYnRpYm0wIGZvciB0aGUgZmlyc3QgZGV2aWNlLCAvZGV2L2J0aWJtMSBmb3IgdGhlIHNlY29uZCBhbmQgc28gb24uIAotWW91IHNob3VsZCBvbmx5IHVzZSB0aGUgSVNPOTY2MCBmaWxlc3lzdGVtIG9uIExJTlVYIGZvciB6U2VyaWVzIHRhcGVzIGJlY2F1c2UgCi10aGUgcGh5c2ljYWwgdGFwZSBkZXZpY2VzIGNhbm5vdCBwZXJmb3JtIGZhc3Qgc2Vla3MgYW5kIHRoZSBJU085NjYwIHN5c3RlbSBpcyAKLW9wdGltaXplZCBmb3IgdGhpcyBzaXR1YXRpb24uIAotCi0KLVRhcGUgYmxvY2sgZGV2aWNlIGV4YW1wbGUgCi0KLUluIHRoaXMgZXhhbXBsZSBhIHRhcGUgd2l0aCBhbiBJU085NjYwIGZpbGVzeXN0ZW0gaXMgY3JlYXRlZCB1c2luZyB0aGUgZmlyc3QgCi10YXBlIGRldmljZS4gSVNPOTY2MCBmaWxlc3lzdGVtIHN1cHBvcnQgbXVzdCBiZSBidWlsdCBpbnRvIHlvdXIgc3lzdGVtIGtlcm5lbAotZm9yIHRoaXMuIAotVGhlIG10IGNvbW1hbmQgaXMgdXNlZCB0byBpc3N1ZSB0YXBlIGNvbW1hbmRzIGFuZCB0aGUgbWtpc29mcyBjb21tYW5kIHRvIAotY3JlYXRlIGFuIElTTzk2NjAgZmlsZXN5c3RlbTogCi0KLS0gY3JlYXRlIGEgTElOVVggZGlyZWN0b3J5IChzb21lZGlyKSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZXN5c3RlbSAKLSAgICAgbWtkaXIgc29tZWRpcgotICAgICBjcCBjb250ZW50cyBzb21lZGlyIAotCi0tIGluc2VydCBhIHRhcGUgCi0KLS0gZW5zdXJlIHRoZSB0YXBlIGlzIGF0IHRoZSBiZWdpbm5pbmcgCi0gICAgIG10IC1mIC9kZXYvbnRpYm0wIHJld2luZCAKLQotLSBzZXQgdGhlIGJsb2Nrc2l6ZSBvZiB0aGUgY2hhcmFjdGVyIGRyaXZlci4gVGhlIGJsb2Nrc2l6ZSAyMDQ4IGJ5dGVzCi0gIGlzIGNvbW1vbmx5IHVzZWQgb24gSVNPOTY2MCBDRC1Sb21zCi0gICAgIG10IC1mIC9kZXYvbnRpYm0wIHNldGJsayAyMDQ4IAotCi0tIHdyaXRlIHRoZSBmaWxlc3lzdGVtIHRvIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGRyaXZlciAKLSAgICAgbWtpc29mcyAtbyAvZGV2L250aWJtMCBzb21lZGlyIAotCi0tIHJld2luZCB0aGUgdGFwZSBhZ2FpbiAKLSAgICAgbXQgLWYgL2Rldi9udGlibTAgcmV3aW5kIAotCi0tIE5vdyB5b3UgY2FuIG1vdW50IHlvdXIgbmV3IGZpbGVzeXN0ZW0gYXMgYSBibG9jayBkZXZpY2U6IAotICAgICBtb3VudCAtdCBpc285NjYwIC1vIHJvLGJsb2NrPTIwNDggL2Rldi9idGlibTAgL21udCAKLQotVE9ETyBMaXN0IAotCi0gICAtIERyaXZlciBoYXMgdG8gYmUgc3RhYmlsaXplZCBzdGlsbAotCi1CVUdTIAotCi1UaGlzIGRyaXZlciBpcyBjb25zaWRlcmVkIEJFVEEsIHdoaWNoIG1lYW5zIHNvbWUgd2Vha25lc3NlcyBtYXkgc3RpbGwKLWJlIGluIGl0LgotSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWNoIGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHRoZSBjb2RlIHlvdSB3aWxsIGdldCBhIAotc2Vuc2UtZGF0YSBkdW1wLkluIHRoYXQgY2FzZSBwbGVhc2UgZG8gdGhlIGZvbGxvd2luZzogCi0KLTEuIHNldCB0aGUgdGFwZSBkcml2ZXIgZGVidWcgbGV2ZWwgdG8gbWF4aW11bTogCi0gICAgIGVjaG8gNiA+L3Byb2MvczM5MGRiZi90YXBlL2xldmVsIAotCi0yLiByZS1wZXJmb3JtIHRoZSBhY3Rpb25zIHdoaWNoIHByb2R1Y2VkIHRoZSBidWcuIChIb3BlZnVsbHkgdGhlIGJ1ZyB3aWxsIAotICAgcmVhcHBlYXIuKSAKLQotMy4gZ2V0IGEgc25hcHNob3QgZnJvbSB0aGUgZGVidWctZmVhdHVyZTogCi0gICAgIGNhdCAvcHJvYy9zMzkwZGJmL3RhcGUvaGV4X2FzY2lpID5zb21lZmlsZSAKLQotNC4gTm93IHB1dCB0aGUgc25hcHNob3QgdG9nZXRoZXIgd2l0aCBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBzaXR1YXRpb24gCi0gICB0aGF0IGxlZCB0byB0aGUgYnVnOiAKLSAtIFdoaWNoIHRvb2wgZGlkIHlvdSB1c2U/IAotIC0gV2hpY2ggaGFyZHdhcmUgZG8geW91IGhhdmU/IAotIC0gV2FzIHlvdXIgdGFwZSB1bml0IG9ubGluZT8gCi0gLSBJcyBpdCBhIHNoYXJlZCB0YXBlIHVuaXQ/IAotCi01LiBTZW5kIGFuIGVtYWlsIHdpdGggeW91ciBidWcgcmVwb3J0IHRvOiAKLSAgICAgbWFpbHRvOkxpbnV4MzkwQGRlLmlibS5jb20gCi0KLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtYXJjaC50eHQgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1hcmNoLnR4dAppbmRleCBkNDNkYmNiLi4yOGFhMTA3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1hcmNoLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1hcmNoLnR4dApAQCAtNjYsNyArNjYsNyBAQAogCSAgICBiYXJyaWVyIGlzc3VlZCAoZm9sbG93ZWQgYnkgYSB0ZXN0IG9mIG5lZWRfcmVzY2hlZCB3aXRoCiAJICAgIGludGVycnVwdHMgZGlzYWJsZWQsIGFzIGV4cGxhaW5lZCBpbiAzKS4KIAotYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMgaGFzIGV4YW1wbGVzIG9mIGJvdGggcG9sbGluZyBhbmQKK2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMgaGFzIGV4YW1wbGVzIG9mIGJvdGggcG9sbGluZyBhbmQKIHNsZWVwaW5nIGlkbGUgZnVuY3Rpb25zLgogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWRlc2lnbi1DRlMudHh0IGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVzaWduLUNGUy50eHQKaW5kZXggOTk5NjE5OS4uOTFlY2ZmMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVzaWduLUNGUy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVzaWduLUNGUy50eHQKQEAgLTIyMyw5ICsyMjMsMTAgQEAKIGdyb3VwIGNyZWF0ZWQgdXNpbmcgdGhlIHBzZXVkbyBmaWxlc3lzdGVtLiAgU2VlIGV4YW1wbGUgc3RlcHMgYmVsb3cgdG8gY3JlYXRlCiB0YXNrIGdyb3VwcyBhbmQgbW9kaWZ5IHRoZWlyIENQVSBzaGFyZSB1c2luZyB0aGUgImNncm91cHMiIHBzZXVkbyBmaWxlc3lzdGVtLgogCi0JIyBta2RpciAvZGV2L2NwdWN0bAotCSMgbW91bnQgLXQgY2dyb3VwIC1vY3B1IG5vbmUgL2Rldi9jcHVjdGwKLQkjIGNkIC9kZXYvY3B1Y3RsCisJIyBtb3VudCAtdCB0bXBmcyBjZ3JvdXBfcm9vdCAvc3lzL2ZzL2Nncm91cAorCSMgbWtkaXIgL3N5cy9mcy9jZ3JvdXAvY3B1CisJIyBtb3VudCAtdCBjZ3JvdXAgLW9jcHUgbm9uZSAvc3lzL2ZzL2Nncm91cC9jcHUKKwkjIGNkIC9zeXMvZnMvY2dyb3VwL2NwdQogCiAJIyBta2RpciBtdWx0aW1lZGlhCSMgY3JlYXRlICJtdWx0aW1lZGlhIiBncm91cCBvZiB0YXNrcwogCSMgbWtkaXIgYnJvd3NlcgkJIyBjcmVhdGUgImJyb3dzZXIiIGdyb3VwIG9mIHRhc2tzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1ydC1ncm91cC50eHQgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1ydC1ncm91cC50eHQKaW5kZXggNjA1YjBkNC4uNzFiNTRkNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtcnQtZ3JvdXAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLXJ0LWdyb3VwLnR4dApAQCAtMTI5LDkgKzEyOSw4IEBACiBFbmFibGluZyBDT05GSUdfUlRfR1JPVVBfU0NIRUQgbGV0cyB5b3UgZXhwbGljaXRseSBhbGxvY2F0ZSByZWFsCiBDUFUgYmFuZHdpZHRoIHRvIHRhc2sgZ3JvdXBzLgogCi1UaGlzIHVzZXMgdGhlIC9jZ3JvdXAgdmlydHVhbCBmaWxlIHN5c3RlbSBhbmQKLSIvY2dyb3VwLzxjZ3JvdXA+L2NwdS5ydF9ydW50aW1lX3VzIiB0byBjb250cm9sIHRoZSBDUFUgdGltZSByZXNlcnZlZCBmb3IgZWFjaAotY29udHJvbCBncm91cC4KK1RoaXMgdXNlcyB0aGUgY2dyb3VwIHZpcnR1YWwgZmlsZSBzeXN0ZW0gYW5kICI8Y2dyb3VwPi9jcHUucnRfcnVudGltZV91cyIKK3RvIGNvbnRyb2wgdGhlIENQVSB0aW1lIHJlc2VydmVkIGZvciBlYWNoIGNvbnRyb2wgZ3JvdXAuCiAKIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHdvcmtpbmcgd2l0aCBjb250cm9sIGdyb3VwcywgeW91IHNob3VsZCByZWFkCiBEb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQgYXMgd2VsbC4KQEAgLTE1MCw3ICsxNDksNyBAQAogPT09PT09PT09PT09PT09CiAKIFRoZXJlIGlzIHdvcmsgaW4gcHJvZ3Jlc3MgdG8gbWFrZSB0aGUgc2NoZWR1bGluZyBwZXJpb2QgZm9yIGVhY2ggZ3JvdXAKLSgiL2Nncm91cC88Y2dyb3VwPi9jcHUucnRfcGVyaW9kX3VzIikgY29uZmlndXJhYmxlIGFzIHdlbGwuCisoIjxjZ3JvdXA+L2NwdS5ydF9wZXJpb2RfdXMiKSBjb25maWd1cmFibGUgYXMgd2VsbC4KIAogVGhlIGNvbnN0cmFpbnQgb24gdGhlIHBlcmlvZCBpcyB0aGF0IGEgc3ViZ3JvdXAgbXVzdCBoYXZlIGEgc21hbGxlciBvcgogZXF1YWwgcGVyaW9kIHRvIGl0cyBwYXJlbnQuIEJ1dCByZWFsaXN0aWNhbGx5IGl0cyBub3QgdmVyeSB1c2VmdWwgX3lldF8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9CdXNMb2dpYy50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvQnVzTG9naWMudHh0CmluZGV4IGQ3ZmJjOTQuLjQ4ZTk4MmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9CdXNMb2dpYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0J1c0xvZ2ljLnR4dApAQCAtNTUzLDcgKzU1Myw3IEBACiAgIG1ha2UgY29uZmlnCiAgIG1ha2UgekltYWdlCiAKLVRoZW4gaW5zdGFsbCAiYXJjaC9pMzg2L2Jvb3QvekltYWdlIiBhcyB5b3VyIHN0YW5kYXJkIGtlcm5lbCwgcnVuIGxpbG8gaWYKK1RoZW4gaW5zdGFsbCAiYXJjaC94ODYvYm9vdC96SW1hZ2UiIGFzIHlvdXIgc3RhbmRhcmQga2VybmVsLCBydW4gbGlsbyBpZgogYXBwcm9wcmlhdGUsIGFuZCByZWJvb3QuCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zZXJpYWwvY29tcHV0b25lLnR4dCBiL0RvY3VtZW50YXRpb24vc2VyaWFsL2NvbXB1dG9uZS50eHQKaW5kZXggYzU3ZWE0Ny4uNjBhNmY2NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zZXJpYWwvY29tcHV0b25lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NlcmlhbC9jb21wdXRvbmUudHh0CkBAIC04Nyw3ICs4Nyw3IEBACiAJICAgZWRpdCAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2NoYXIvaXAyLmMgIAogICAgICAgICAgICAoT3B0aW9uYWwgLSBtYXkgYmUgc3BlY2lmaWVkIG9uIGtlcm5lbCBjb21tYW5kIGxpbmUgbm93KQogZCkgUnVuICJtYWtlIHpJbWFnZSIgb3Igd2hhdGV2ZXIgdGFyZ2V0IHlvdSBwcmVmZXIuCi1lKSBtdiAvdXNyL3NyYy9saW51eC9hcmNoL2kzODYvYm9vdC96SW1hZ2UgdG8gL2Jvb3QuCitlKSBtdiAvdXNyL3NyYy9saW51eC9hcmNoL3g4Ni9ib290L3pJbWFnZSB0byAvYm9vdC4KIGYpIEFkZCBuZXcgY29uZmlnIGZvciB0aGlzIGtlcm5lbCBpbnRvIC9ldGMvbGlsby5jb25mLCBydW4gImxpbG8iCiAJb3IgY29weSB0byBhIGZsb3BweSBkaXNrIGFuZCBib290IGZyb20gdGhhdCBmbG9wcHkgZGlzay4KIGcpIFJlYm9vdCB1c2luZyB0aGlzIGtlcm5lbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLUNvbnRyb2xzLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Db250cm9scy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ4MjAzNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Db250cm9scy50eHQKQEAgLTAsMCArMSwxMDAgQEAKK1RoaXMgZmlsZSBleHBsYWlucyB0aGUgY29kZWMtc3BlY2lmaWMgbWl4ZXIgY29udHJvbHMuCisKK1JlYWx0ZWsgY29kZWNzCistLS0tLS0tLS0tLS0tLQorCisqIENoYW5uZWwgTW9kZQorICBUaGlzIGlzIGFuIGVudW0gY29udHJvbCB0byBjaGFuZ2UgdGhlIHN1cnJvdW5kLWNoYW5uZWwgc2V0dXAsCisgIGFwcGVhcnMgb25seSB3aGVuIHRoZSBzdXJyb3VuZCBjaGFubmVscyBhcmUgYXZhaWxhYmxlLgorICBJdCBnaXZlcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIGJlIHVzZWQsICIyY2giLCAiNGNoIiwgIjZjaCIsCisgIGFuZCAiOGNoIi4gIEFjY29yZGluZyB0byB0aGUgY29uZmlndXJhdGlvbiwgdGhpcyBhbHNvIGNvbnRyb2xzIHRoZQorICBqYWNrLXJldGFza2luZyBvZiBtdWx0aS1JL08gamFja3MuCisKKyogQXV0by1NdXRlIE1vZGUKKyAgVGhpcyBpcyBhbiBlbnVtIGNvbnRyb2wgdG8gY2hhbmdlIHRoZSBhdXRvLW11dGUgYmVoYXZpb3Igb2YgdGhlCisgIGhlYWRwaG9uZSBhbmQgbGluZS1vdXQgamFja3MuICBJZiBidWlsdC1pbiBzcGVha2VycyBhbmQgaGVhZHBob25lCisgIGFuZC9vciBsaW5lLW91dCBqYWNrcyBhcmUgYXZhaWxhYmxlIG9uIGEgbWFjaGluZSwgdGhpcyBjb250cm9scworICBhcHBlYXJzLgorICBXaGVuIHRoZXJlIGFyZSBvbmx5IGVpdGhlciBoZWFkcGhvbmVzIG9yIGxpbmUtb3V0IGphY2tzLCBpdCBnaXZlcworICAiRGlzYWJsZWQiIGFuZCAiRW5hYmxlZCIgc3RhdGUuICBXaGVuIGVuYWJsZWQsIHRoZSBzcGVha2VyIGlzIG11dGVkCisgIGF1dG9tYXRpY2FsbHkgd2hlbiBhIGphY2sgaXMgcGx1Z2dlZC4KKworICBXaGVuIGJvdGggaGVhZHBob25lIGFuZCBsaW5lLW91dCBqYWNrcyBhcmUgcHJlc2VudCwgaXQgZ2l2ZXMKKyAgIkRpc2FibGVkIiwgIlNwZWFrZXIgT25seSIgYW5kICJMaW5lLU91dCtTcGVha2VyIi4gIFdoZW4KKyAgc3BlYWtlci1vbmx5IGlzIGNob3NlbiwgcGx1Z2dpbmcgaW50byBhIGhlYWRwaG9uZSBvciBhIGxpbmUtb3V0IGphY2sKKyAgbXV0ZXMgdGhlIHNwZWFrZXJzLCBidXQgbm90IGxpbmUtb3V0cy4gIFdoZW4gbGluZS1vdXQrc3BlYWtlciBpcworICBzZWxlY3RlZCwgcGx1Z2dpbmcgdG8gYSBoZWFkcGhvbmUgamFjayBtdXRlcyBib3RoIHNwZWFrZXJzIGFuZAorICBsaW5lLW91dHMuCisKKworSURUL1NpZ21hdGVsIGNvZGVjcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIEFuYWxvZyBMb29wYmFjaworICBUaGlzIGNvbnRyb2wgZW5hYmxlcy9kaXNhYmxlcyB0aGUgYW5hbG9nLWxvb3BiYWNrIGNpcmN1aXQuICBUaGlzCisgIGFwcGVhcnMgb25seSB3aGVuICJsb29wYmFjayIgaXMgc2V0IHRvIHRydWUgaW4gYSBjb2RlYyBoaW50CisgIChzZWUgSEQtQXVkaW8udHh0KS4gIE5vdGUgdGhhdCBvbiBzb21lIGNvZGVjcyB0aGUgYW5hbG9nLWxvb3BiYWNrCisgIGFuZCB0aGUgbm9ybWFsIFBDTSBwbGF5YmFjayBhcmUgZXhjbHVzaXZlLCBpLmUuIHdoZW4gdGhpcyBpcyBvbiwgeW91CisgIHdvbid0IGhlYXIgYW55IFBDTSBzdHJlYW0uCisKKyogU3dhcCBDZW50ZXIvTEZFCisgIFN3YXBzIHRoZSBjZW50ZXIgYW5kIExGRSBjaGFubmVsIG9yZGVyLiAgTm9ybWFsbHksIHRoZSBsZWZ0CisgIGNvcnJlc3BvbmRzIHRvIHRoZSBjZW50ZXIgYW5kIHRoZSByaWdodCB0byB0aGUgTEZFLiAgV2hlbiB0aGlzIGlzCisgIE9OLCB0aGUgbGVmdCB0byB0aGUgTEZFIGFuZCB0aGUgcmlnaHQgdG8gdGhlIGNlbnRlci4KKworKiBIZWFkcGhvbmUgYXMgTGluZSBPdXQKKyAgV2hlbiB0aGlzIGNvbnRyb2wgaXMgT04sIHRyZWF0IHRoZSBoZWFkcGhvbmUgamFja3MgYXMgbGluZS1vdXQKKyAgamFja3MuICBUaGF0IGlzLCB0aGUgaGVhZHBob25lIHdvbid0IGF1dG8tbXV0ZSB0aGUgb3RoZXIgbGluZS1vdXRzLAorICBhbmQgbm8gSFAtYW1wIGlzIHNldCB0byB0aGUgcGlucy4KKworKiBNaWMgSmFjayBNb2RlLCBMaW5lIEphY2sgTW9kZSwgZXRjCisgIFRoZXNlIGVudW0gY29udHJvbHMgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIGJpYXMgb2YgdGhlIGlucHV0IGphY2sKKyAgcGlucy4gIERlcGVuZGluZyBvbiB0aGUgamFjayB0eXBlLCBpdCBjYW4gc2V0IGFzICJNaWMgSW4iIGFuZCAiTGluZSAKKyAgSW4iLCBmb3IgZGV0ZXJtaW5pbmcgdGhlIGlucHV0IGJpYXMsIG9yIGl0IGNhbiBiZSBzZXQgdG8gIkxpbmUgT3V0IgorICB3aGVuIHRoZSBwaW4gaXMgYSBtdWx0aS1JL08gamFjayBmb3Igc3Vycm91bmQgY2hhbm5lbHMuCisKKworVklBIGNvZGVjcworLS0tLS0tLS0tLQorCisqIFNtYXJ0IDUuMQorICBBbiBlbnVtIGNvbnRyb2wgdG8gcmUtdGFzayB0aGUgbXVsdGktSS9PIGphY2tzIGZvciBzdXJyb3VuZCBvdXRwdXRzLgorICBXaGVuIGl0J3MgT04sIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGphY2tzICh1c3VhbGx5IGEgbGluZS1pbiBhbmQgYQorICBtaWMtaW4pIGFyZSBzd2l0Y2hlZCBhcyB0aGUgc3Vycm91bmQgYW5kIHRoZSBDTEZFIG91dHB1dCBqYWNrcy4KKworKiBJbmRlcGVuZGVudCBIUAorICBXaGVuIHRoaXMgZW51bSBjb250cm9sIGlzIGVuYWJsZWQsIHRoZSBoZWFkcGhvbmUgb3V0cHV0IGlzIHJvdXRlZAorICBmcm9tIGFuIGluZGl2aWR1YWwgc3RyZWFtICh0aGUgdGhpcmQgUENNIHN1Y2ggYXMgaHc6MCwyKSBpbnN0ZWFkIG9mCisgIHRoZSBwcmltYXJ5IHN0cmVhbS4gIEluIHRoZSBjYXNlIHRoZSBoZWFkcGhvbmUgREFDIGlzIHNoYXJlZCB3aXRoIGEKKyAgc2lkZSBvciBhIENMRkUtY2hhbm5lbCBEQUMsIHRoZSBEQUMgaXMgc3dpdGNoZWQgdG8gdGhlIGhlYWRwaG9uZQorICBhdXRvbWF0aWNhbGx5LgorCisqIExvb3BiYWNrIE1peGluZworICBBbiBlbnVtIGNvbnRyb2wgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFuYWxvZy1sb29wYmFjayByb3V0ZSBpcworICBlbmFibGVkIG9yIG5vdC4gIFdoZW4gaXQncyBlbmFibGVkLCB0aGUgYW5hbG9nLWxvb3BiYWNrIGlzIG1peGVkIHRvCisgIHRoZSBmcm9udC1jaGFubmVsLiAgQWxzbywgdGhlIHNhbWUgcm91dGUgaXMgdXNlZCBmb3IgdGhlIGhlYWRwaG9uZQorICBhbmQgc3BlYWtlciBvdXRwdXRzLiAgQXMgYSBzaWRlLWVmZmVjdCwgd2hlbiB0aGlzIG1vZGUgaXMgc2V0LCB0aGUKKyAgaW5kaXZpZHVhbCB2b2x1bWUgY29udHJvbHMgd2lsbCBiZSBubyBsb25nZXIgYXZhaWxhYmxlIGZvcgorICBoZWFkcGhvbmVzIGFuZCBzcGVha2VycyBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIERBQyBjb25uZWN0ZWQgdG8gYQorICBtaXhlciB3aWRnZXQuCisKKyogRHluYW1pYyBQb3dlci1Db250cm9sCisgIFRoaXMgY29udHJvbCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGR5bmFtaWMgcG93ZXItY29udHJvbCBwZXIgamFjaworICBkZXRlY3Rpb24gaXMgZW5hYmxlZCBvciBub3QuICBXaGVuIGVuYWJsZWQsIHRoZSB3aWRnZXRzIHBvd2VyIHN0YXRlCisgIChEMC9EMykgYXJlIGNoYW5nZWQgZHluYW1pY2FsbHkgZGVwZW5kaW5nIG9uIHRoZSBqYWNrIHBsdWdnaW5nCisgIHN0YXRlIGZvciBzYXZpbmcgcG93ZXIgY29uc3VtcHRpb25zLiAgSG93ZXZlciwgaWYgeW91ciBzeXN0ZW0KKyAgZG9lc24ndCBwcm92aWRlIGEgcHJvcGVyIGphY2stZGV0ZWN0aW9uLCB0aGlzIHdvbid0IHdvcms7IGluIHN1Y2ggYQorICBjYXNlLCB0dXJuIHRoaXMgY29udHJvbCBPRkYuCisKKyogSmFjayBEZXRlY3QKKyAgVGhpcyBjb250cm9sIGlzIHByb3ZpZGVkIG9ubHkgZm9yIFZUMTcwOCBjb2RlYyB3aGljaCBnaXZlcyBubyBwcm9wZXIKKyAgdW5zb2xpY2l0ZWQgZXZlbnQgcGVyIGphY2sgcGx1Zy4gIFdoZW4gdGhpcyBpcyBvbiwgdGhlIGRyaXZlciBwb2xscworICB0aGUgamFjayBkZXRlY3Rpb24gc28gdGhhdCB0aGUgaGVhZHBob25lIGF1dG8tbXV0ZSBjYW4gd29yaywgd2hpbGUgCisgIHR1cm5pbmcgdGhpcyBvZmYgd291bGQgcmVkdWNlIHRoZSBwb3dlciBjb25zdW1wdGlvbi4KKworCitDb25leGFudCBjb2RlY3MKKy0tLS0tLS0tLS0tLS0tLQorCisqIEF1dG8tTXV0ZSBNb2RlCisgIFNlZSBSZWF0ZWsgY29kZWNzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGkvZXA5M3h4X3NwaSBiL0RvY3VtZW50YXRpb24vc3BpL2VwOTN4eF9zcGkKaW5kZXggNjMyNWY1Yi4uZDhlYjAxYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGkvZXA5M3h4X3NwaQorKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9lcDkzeHhfc3BpCkBAIC04OCw2ICs4OCwxNiBAQAogCQkJICAgIEFSUkFZX1NJWkUodHM3Mnh4X3NwaV9kZXZpY2VzKSk7CiB9CiAKK1RoZSBkcml2ZXIgY2FuIHVzZSBETUEgZm9yIHRoZSB0cmFuc2ZlcnMgYWxzby4gSW4gdGhpcyBjYXNlIHRzNzJ4eF9zcGlfaW5mbworYmVjb21lczoKKworc3RhdGljIHN0cnVjdCBlcDkzeHhfc3BpX2luZm8gdHM3Mnh4X3NwaV9pbmZvID0geworCS5udW1fY2hpcHNlbGVjdAk9IEFSUkFZX1NJWkUodHM3Mnh4X3NwaV9kZXZpY2VzKSwKKwkudXNlX2RtYQk9IHRydWU7Cit9OworCitOb3RlIHRoYXQgQ09ORklHX0VQOTNYWF9ETUEgc2hvdWxkIGJlIGVuYWJsZWQgYXMgd2VsbC4KKwogVGhhbmtzIHRvCiA9PT09PT09PT0KIE1hcnRpbiBHdXksIEguIEhhcnRsZXkgU3dlZXRlbiBhbmQgb3RoZXJzIHdobyBoZWxwZWQgbWUgZHVyaW5nIGRldmVsb3BtZW50IG9mCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaS9weGEyeHggYi9Eb2N1bWVudGF0aW9uL3NwaS9weGEyeHgKaW5kZXggNDkzZGFkYS4uMDA1MTFlMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGkvcHhhMnh4CisrKyBiL0RvY3VtZW50YXRpb24vc3BpL3B4YTJ4eApAQCAtMjIsMTUgKzIyLDExIEBACiBmb3VuZCBpbiBpbmNsdWRlL2xpbnV4L3NwaS9weGEyeHhfc3BpLmg6CiAKIHN0cnVjdCBweGEyeHhfc3BpX21hc3RlciB7Ci0JZW51bSBweGFfc3NwX3R5cGUgc3NwX3R5cGU7CiAJdTMyIGNsb2NrX2VuYWJsZTsKIAl1MTYgbnVtX2NoaXBzZWxlY3Q7CiAJdTggZW5hYmxlX2RtYTsKIH07CiAKLVRoZSAicHhhMnh4X3NwaV9tYXN0ZXIuc3NwX3R5cGUiIGZpZWxkIG11c3QgaGF2ZSBhIHZhbHVlIGJldHdlZW4gMSBhbmQgMyBhbmQKLWluZm9ybXMgdGhlIGRyaXZlciB3aGljaCBmZWF0dXJlcyBhIHBhcnRpY3VsYXIgU1NQIHN1cHBvcnRzLgotCiBUaGUgInB4YTJ4eF9zcGlfbWFzdGVyLmNsb2NrX2VuYWJsZSIgZmllbGQgaXMgdXNlZCB0byBlbmFibGUvZGlzYWJsZSB0aGUKIGNvcnJlc3BvbmRpbmcgU1NQIHBlcmlwaGVyYWwgYmxvY2sgaW4gdGhlICJDbG9jayBFbmFibGUgUmVnaXN0ZXIgKENLRU4iKS4gU2VlCiB0aGUgIlBYQTJ4eCBEZXZlbG9wZXIgTWFudWFsIiBzZWN0aW9uICJDbG9ja3MgYW5kIFBvd2VyIE1hbmFnZW1lbnQiLgpAQCAtNjEsNyArNTcsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX21hc3RlciBweGFfbnNzcF9tYXN0ZXJfaW5mbyA9IHsKLQkuc3NwX3R5cGUgPSBQWEEyNXhfTlNTUCwgLyogVHlwZSBvZiBTU1AgKi8KIAkuY2xvY2tfZW5hYmxlID0gQ0tFTl9OU1NQLCAvKiBOU1NQIFBlcmlwaGVyYWwgY2xvY2sgKi8KIAkubnVtX2NoaXBzZWxlY3QgPSAxLCAvKiBNYXRjaGVzIHRoZSBudW1iZXIgb2YgY2hpcHMgYXR0YWNoZWQgdG8gTlNTUCAqLwogCS5lbmFibGVfZG1hID0gMSwgLyogRW5hYmxlcyBOU1NQIERNQSAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0IGIvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0CmluZGV4IDJlM2M2NGIuLjlkYmU4ODUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpbmxvY2tzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaW5sb2Nrcy50eHQKQEAgLTEzLDE4ICsxMyw4IEBACiBUaGUgYWJvdmUgaXMgYWx3YXlzIHNhZmUuIEl0IHdpbGwgZGlzYWJsZSBpbnRlcnJ1cHRzIF9sb2NhbGx5XywgYnV0IHRoZQogc3BpbmxvY2sgaXRzZWxmIHdpbGwgZ3VhcmFudGVlIHRoZSBnbG9iYWwgbG9jaywgc28gaXQgd2lsbCBndWFyYW50ZWUgdGhhdAogdGhlcmUgaXMgb25seSBvbmUgdGhyZWFkLW9mLWNvbnRyb2wgd2l0aGluIHRoZSByZWdpb24ocykgcHJvdGVjdGVkIGJ5IHRoYXQKLWxvY2suIFRoaXMgd29ya3Mgd2VsbCBldmVuIHVuZGVyIFVQLiBUaGUgYWJvdmUgc2VxdWVuY2UgdW5kZXIgVVAKLWVzc2VudGlhbGx5IGlzIGp1c3QgdGhlIHNhbWUgYXMgZG9pbmcKLQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7Ci0JIC4uLiBjcml0aWNhbCBzZWN0aW9uIC4uLgotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCi1zbyB0aGUgY29kZSBkb2VzIF9ub3RfIG5lZWQgdG8gd29ycnkgYWJvdXQgVVAgdnMgU01QIGlzc3VlczogdGhlIHNwaW5sb2Nrcwotd29yayBjb3JyZWN0bHkgdW5kZXIgYm90aCAoYW5kIHNwaW5sb2NrcyBhcmUgYWN0dWFsbHkgbW9yZSBlZmZpY2llbnQgb24KLWFyY2hpdGVjdHVyZXMgdGhhdCBhbGxvdyBkb2luZyB0aGUgInNhdmVfZmxhZ3MgKyBjbGkiIGluIG9uZSBvcGVyYXRpb24pLgorbG9jay4gVGhpcyB3b3JrcyB3ZWxsIGV2ZW4gdW5kZXIgVVAgYWxzbywgc28gdGhlIGNvZGUgZG9lcyBfbm90XyBuZWVkIHRvCit3b3JyeSBhYm91dCBVUCB2cyBTTVAgaXNzdWVzOiB0aGUgc3BpbmxvY2tzIHdvcmsgY29ycmVjdGx5IHVuZGVyIGJvdGguCiAKICAgIE5PVEUhIEltcGxpY2F0aW9ucyBvZiBzcGluX2xvY2tzIGZvciBtZW1vcnkgYXJlIGZ1cnRoZXIgZGVzY3JpYmVkIGluOgogCkBAIC0zNiwyNyArMjYsNyBAQAogc3BpbmxvY2sgZm9yIG1vc3QgdGhpbmdzIC0gdXNpbmcgbW9yZSB0aGFuIG9uZSBzcGlubG9jayBjYW4gbWFrZSB0aGluZ3MgYQogbG90IG1vcmUgY29tcGxleCBhbmQgZXZlbiBzbG93ZXIgYW5kIGlzIHVzdWFsbHkgd29ydGggaXQgb25seSBmb3IKIHNlcXVlbmNlcyB0aGF0IHlvdSBfa25vd18gbmVlZCB0byBiZSBzcGxpdCB1cDogYXZvaWQgaXQgYXQgYWxsIGNvc3QgaWYgeW91Ci1hcmVuJ3Qgc3VyZSkuIEhPV0VWRVIsIGl0IF9kb2VzXyBtZWFuIHRoYXQgaWYgeW91IGhhdmUgc29tZSBjb2RlIHRoYXQgZG9lcwotCi0JY2xpKCk7Ci0JLi4gY3JpdGljYWwgc2VjdGlvbiAuLgotCXN0aSgpOwotCi1hbmQgYW5vdGhlciBzZXF1ZW5jZSB0aGF0IGRvZXMKLQotCXNwaW5fbG9ja19pcnFzYXZlKGZsYWdzKTsKLQkuLiBjcml0aWNhbCBzZWN0aW9uIC4uCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShmbGFncyk7Ci0KLXRoZW4gdGhleSBhcmUgTk9UIG11dHVhbGx5IGV4Y2x1c2l2ZSwgYW5kIHRoZSBjcml0aWNhbCByZWdpb25zIGNhbiBoYXBwZW4KLWF0IHRoZSBzYW1lIHRpbWUgb24gdHdvIGRpZmZlcmVudCBDUFUncy4gVGhhdCdzIGZpbmUgcGVyIHNlLCBidXQgdGhlCi1jcml0aWNhbCByZWdpb25zIGhhZCBiZXR0ZXIgYmUgY3JpdGljYWwgZm9yIGRpZmZlcmVudCB0aGluZ3MgKGllIHRoZXkKLWNhbid0IHN0b21wIG9uIGVhY2ggb3RoZXIpLgotCi1UaGUgYWJvdmUgaXMgYSBwcm9ibGVtIG1haW5seSBpZiB5b3UgZW5kIHVwIG1peGluZyBjb2RlIC0gZm9yIGV4YW1wbGUgdGhlCi1yb3V0aW5lcyBpbiBsbF9yd19ibG9jaygpIHRlbmQgdG8gdXNlIGNsaS9zdGkgdG8gcHJvdGVjdCB0aGUgYXRvbWljaXR5IG9mCi10aGVpciBhY3Rpb25zLCBhbmQgaWYgYSBkcml2ZXIgdXNlcyBzcGlubG9ja3MgaW5zdGVhZCB0aGVuIHlvdSBzaG91bGQKLXRoaW5rIGFib3V0IGlzc3VlcyBsaWtlIHRoZSBhYm92ZS4KK2FyZW4ndCBzdXJlKS4KIAogVGhpcyBpcyByZWFsbHkgdGhlIG9ubHkgcmVhbGx5IGhhcmQgcGFydCBhYm91dCBzcGlubG9ja3M6IG9uY2UgeW91IHN0YXJ0CiB1c2luZyBzcGlubG9ja3MgdGhleSB0ZW5kIHRvIGV4cGFuZCB0byBhcmVhcyB5b3UgbWlnaHQgbm90IGhhdmUgbm90aWNlZApAQCAtMTIwLDExICs5MCwxMCBAQAogCiBUaGUgc2luZ2xlIHNwaW4tbG9jayBwcmltaXRpdmVzIGFib3ZlIGFyZSBieSBubyBtZWFucyB0aGUgb25seSBvbmVzLiBUaGV5CiBhcmUgdGhlIG1vc3Qgc2FmZSBvbmVzLCBhbmQgdGhlIG9uZXMgdGhhdCB3b3JrIHVuZGVyIGFsbCBjaXJjdW1zdGFuY2VzLAotYnV0IHBhcnRseSBfYmVjYXVzZV8gdGhleSBhcmUgc2FmZSB0aGV5IGFyZSBhbHNvIGZhaXJseSBzbG93LiBUaGV5IGFyZQotbXVjaCBmYXN0ZXIgdGhhbiBhIGdlbmVyaWMgZ2xvYmFsIGNsaS9zdGkgcGFpciwgYnV0IHNsb3dlciB0aGFuIHRoZXknZAotbmVlZCB0byBiZSwgYmVjYXVzZSB0aGV5IGRvIGhhdmUgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzICh3aGljaCBpcyBqdXN0IGEKLXNpbmdsZSBpbnN0cnVjdGlvbiBvbiBhIHg4NiwgYnV0IGl0J3MgYW4gZXhwZW5zaXZlIG9uZSAtIGFuZCBvbiBvdGhlcgotYXJjaGl0ZWN0dXJlcyBpdCBjYW4gYmUgd29yc2UpLgorYnV0IHBhcnRseSBfYmVjYXVzZV8gdGhleSBhcmUgc2FmZSB0aGV5IGFyZSBhbHNvIGZhaXJseSBzbG93LiBUaGV5IGFyZSBzbG93ZXIKK3RoYW4gdGhleSdkIG5lZWQgdG8gYmUsIGJlY2F1c2UgdGhleSBkbyBoYXZlIHRvIGRpc2FibGUgaW50ZXJydXB0cworKHdoaWNoIGlzIGp1c3QgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gb24gYSB4ODYsIGJ1dCBpdCdzIGFuIGV4cGVuc2l2ZSBvbmUgLQorYW5kIG9uIG90aGVyIGFyY2hpdGVjdHVyZXMgaXQgY2FuIGJlIHdvcnNlKS4KIAogSWYgeW91IGhhdmUgYSBjYXNlIHdoZXJlIHlvdSBoYXZlIHRvIHByb3RlY3QgYSBkYXRhIHN0cnVjdHVyZSBhY3Jvc3MKIHNldmVyYWwgQ1BVJ3MgYW5kIHlvdSB3YW50IHRvIHVzZSBzcGlubG9ja3MgeW91IGNhbiBwb3RlbnRpYWxseSB1c2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CmluZGV4IDVlN2NiMzkuLjFjN2ZiMGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dApAQCAtMTcsMjMgKzE3LDIxIEBACiAKIEN1cnJlbnRseSwgdGhlc2UgZmlsZXMgbWlnaHQgKGRlcGVuZGluZyBvbiB5b3VyIGNvbmZpZ3VyYXRpb24pCiBzaG93IHVwIGluIC9wcm9jL3N5cy9rZXJuZWw6Ci0tIGFjcGlfdmlkZW9fZmxhZ3MKKwogLSBhY2N0CistIGFjcGlfdmlkZW9fZmxhZ3MKKy0gYXV0b19tc2dtbmkKIC0gYm9vdGxvYWRlcl90eXBlCSAgICAgWyBYODYgb25seSBdCiAtIGJvb3Rsb2FkZXJfdmVyc2lvbgkgICAgIFsgWDg2IG9ubHkgXQogLSBjYWxsaG9tZQkJICAgICBbIFMzOTAgb25seSBdCi0tIGF1dG9fbXNnbW5pCiAtIGNvcmVfcGF0dGVybgogLSBjb3JlX3BpcGVfbGltaXQKIC0gY29yZV91c2VzX3BpZAogLSBjdHJsLWFsdC1kZWwKLS0gZGVudHJ5LXN0YXRlCiAtIGRtZXNnX3Jlc3RyaWN0CiAtIGRvbWFpbm5hbWUKIC0gaG9zdG5hbWUKIC0gaG90cGx1ZwotLSBqYXZhLWFwcGxldHZpZXdlciAgICAgICAgICAgWyBiaW5mbXRfamF2YSwgb2Jzb2xldGUgXQotLSBqYXZhLWludGVycHJldGVyICAgICAgICAgICAgWyBiaW5mbXRfamF2YSwgb2Jzb2xldGUgXQogLSBrcHRyX3Jlc3RyaWN0CiAtIGtzdGFja19kZXB0aF90b19wcmludCAgICAgICBbIFg4NiBvbmx5IF0KIC0gbDJjciAgICAgICAgICAgICAgICAgICAgICAgIFsgUFBDIG9ubHkgXQpAQCAtNDgsMTAgKzQ2LDE0IEBACiAtIG92ZXJmbG93Z2lkCiAtIG92ZXJmbG93dWlkCiAtIHBhbmljCistIHBhbmljX29uX29vcHMKKy0gcGFuaWNfb25fdW5yZWNvdmVyZWRfbm1pCiAtIHBpZF9tYXgKIC0gcG93ZXJzYXZlLW5hcCAgICAgICAgICAgICAgIFsgUFBDIG9ubHkgXQotLSBwYW5pY19vbl91bnJlY292ZXJlZF9ubWkKIC0gcHJpbnRrCistIHByaW50a19kZWxheQorLSBwcmludGtfcmF0ZWxpbWl0CistIHByaW50a19yYXRlbGltaXRfYnVyc3QKIC0gcmFuZG9taXplX3ZhX3NwYWNlCiAtIHJlYWwtcm9vdC1kZXYgICAgICAgICAgICAgICA9PT4gRG9jdW1lbnRhdGlvbi9pbml0cmQudHh0CiAtIHJlYm9vdC1jbWQgICAgICAgICAgICAgICAgICBbIFNQQVJDIG9ubHkgXQpAQCAtNjIsNiArNjQsNyBAQAogLSBzaG1hbGwKIC0gc2htbWF4ICAgICAgICAgICAgICAgICAgICAgIFsgc3lzdiBpcGMgXQogLSBzaG1tbmkKKy0gc29mdGxvY2t1cF90aHJlc2gKIC0gc3RvcC1hICAgICAgICAgICAgICAgICAgICAgIFsgU1BBUkMgb25seSBdCiAtIHN5c3JxICAgICAgICAgICAgICAgICAgICAgICA9PT4gRG9jdW1lbnRhdGlvbi9zeXNycS50eHQKIC0gdGFpbnRlZApAQCAtNzEsMTUgKzc0LDYgQEAKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotYWNwaV92aWRlb19mbGFnczoKLQotZmxhZ3MKLQotU2VlIERvYyova2VybmVsL3Bvd2VyL3ZpZGVvLnR4dCwgaXQgYWxsb3dzIG1vZGUgb2YgdmlkZW8gYm9vdCB0byBiZQotc2V0IGR1cmluZyBydW4gdGltZS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQogYWNjdDoKIAogaGlnaHdhdGVyIGxvd3dhdGVyIGZyZXF1ZW5jeQpAQCAtOTcsNiArOTEsMjUgQEAKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorYWNwaV92aWRlb19mbGFnczoKKworZmxhZ3MKKworU2VlIERvYyova2VybmVsL3Bvd2VyL3ZpZGVvLnR4dCwgaXQgYWxsb3dzIG1vZGUgb2YgdmlkZW8gYm9vdCB0byBiZQorc2V0IGR1cmluZyBydW4gdGltZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYXV0b19tc2dtbmk6CisKK0VuYWJsZXMvRGlzYWJsZXMgYXV0b21hdGljIHJlY29tcHV0aW5nIG9mIG1zZ21uaSB1cG9uIG1lbW9yeSBhZGQvcmVtb3ZlCitvciB1cG9uIGlwYyBuYW1lc3BhY2UgY3JlYXRpb24vcmVtb3ZhbCAoc2VlIHRoZSBtc2dtbmkgZGVzY3JpcHRpb24KK2Fib3ZlKS4gRWNob2luZyAiMSIgaW50byB0aGlzIGZpbGUgZW5hYmxlcyBtc2dtbmkgYXV0b21hdGljIHJlY29tcHV0aW5nLgorRWNob2luZyAiMCIgdHVybnMgaXQgb2ZmLiBhdXRvX21zZ21uaSBkZWZhdWx0IHZhbHVlIGlzIDEuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwogYm9vdGxvYWRlcl90eXBlOgogCiB4ODYgYm9vdGxvYWRlciBpZGVudGlmaWNhdGlvbgpAQCAtMTcyLDIyICsxODUsMjQgQEAKIAogY29yZV9waXBlX2xpbWl0OgogCi1UaGlzIHN5c2N0bCBpcyBvbmx5IGFwcGxpY2FibGUgd2hlbiBjb3JlX3BhdHRlcm4gaXMgY29uZmlndXJlZCB0byBwaXBlIGNvcmUKLWZpbGVzIHRvIGEgdXNlciBzcGFjZSBoZWxwZXIgKHdoZW4gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBjb3JlX3BhdHRlcm4gaXMgYSAnfCcsCi1zZWUgYWJvdmUpLiAgV2hlbiBjb2xsZWN0aW5nIGNvcmVzIHZpYSBhIHBpcGUgdG8gYW4gYXBwbGljYXRpb24sIGl0IGlzCi1vY2Nhc2lvbmFsbHkgdXNlZnVsIGZvciB0aGUgY29sbGVjdGluZyBhcHBsaWNhdGlvbiB0byBnYXRoZXIgZGF0YSBhYm91dCB0aGUKLWNyYXNoaW5nIHByb2Nlc3MgZnJvbSBpdHMgL3Byb2MvcGlkIGRpcmVjdG9yeS4gIEluIG9yZGVyIHRvIGRvIHRoaXMgc2FmZWx5LCB0aGUKLWtlcm5lbCBtdXN0IHdhaXQgZm9yIHRoZSBjb2xsZWN0aW5nIHByb2Nlc3MgdG8gZXhpdCwgc28gYXMgbm90IHRvIHJlbW92ZSB0aGUKLWNyYXNoaW5nIHByb2Nlc3NlcyBwcm9jIGZpbGVzIHByZW1hdHVyZWx5LiAgVGhpcyBpbiB0dXJuIGNyZWF0ZXMgdGhlIHBvc3NpYmlsaXR5Ci10aGF0IGEgbWlzYmVoYXZpbmcgdXNlcnNwYWNlIGNvbGxlY3RpbmcgcHJvY2VzcyBjYW4gYmxvY2sgdGhlIHJlYXBpbmcgb2YgYQotY3Jhc2hlZCBwcm9jZXNzIHNpbXBseSBieSBuZXZlciBleGl0aW5nLiAgVGhpcyBzeXNjdGwgZGVmZW5kcyBhZ2FpbnN0IHRoYXQuICBJdAotZGVmaW5lcyBob3cgbWFueSBjb25jdXJyZW50IGNyYXNoaW5nIHByb2Nlc3NlcyBtYXkgYmUgcGlwZWQgdG8gdXNlciBzcGFjZQotYXBwbGljYXRpb25zIGluIHBhcmFsbGVsLiAgSWYgdGhpcyB2YWx1ZSBpcyBleGNlZWRlZCwgdGhlbiB0aG9zZSBjcmFzaGluZwotcHJvY2Vzc2VzIGFib3ZlIHRoYXQgdmFsdWUgYXJlIG5vdGVkIHZpYSB0aGUga2VybmVsIGxvZyBhbmQgdGhlaXIgY29yZXMgYXJlCi1za2lwcGVkLiAgMCBpcyBhIHNwZWNpYWwgdmFsdWUsIGluZGljYXRpbmcgdGhhdCB1bmxpbWl0ZWQgcHJvY2Vzc2VzIG1heSBiZQotY2FwdHVyZWQgaW4gcGFyYWxsZWwsIGJ1dCB0aGF0IG5vIHdhaXRpbmcgd2lsbCB0YWtlIHBsYWNlIChpLmUuIHRoZSBjb2xsZWN0aW5nCi1wcm9jZXNzIGlzIG5vdCBndWFyYW50ZWVkIGFjY2VzcyB0byAvcHJvYy88Y3Jhc2hpbmcgcGlkPi8pLiAgVGhpcyB2YWx1ZSBkZWZhdWx0cwotdG8gMC4KK1RoaXMgc3lzY3RsIGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuIGNvcmVfcGF0dGVybiBpcyBjb25maWd1cmVkIHRvIHBpcGUKK2NvcmUgZmlsZXMgdG8gYSB1c2VyIHNwYWNlIGhlbHBlciAod2hlbiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mCitjb3JlX3BhdHRlcm4gaXMgYSAnfCcsIHNlZSBhYm92ZSkuICBXaGVuIGNvbGxlY3RpbmcgY29yZXMgdmlhIGEgcGlwZQordG8gYW4gYXBwbGljYXRpb24sIGl0IGlzIG9jY2FzaW9uYWxseSB1c2VmdWwgZm9yIHRoZSBjb2xsZWN0aW5nCithcHBsaWNhdGlvbiB0byBnYXRoZXIgZGF0YSBhYm91dCB0aGUgY3Jhc2hpbmcgcHJvY2VzcyBmcm9tIGl0cworL3Byb2MvcGlkIGRpcmVjdG9yeS4gIEluIG9yZGVyIHRvIGRvIHRoaXMgc2FmZWx5LCB0aGUga2VybmVsIG11c3Qgd2FpdAorZm9yIHRoZSBjb2xsZWN0aW5nIHByb2Nlc3MgdG8gZXhpdCwgc28gYXMgbm90IHRvIHJlbW92ZSB0aGUgY3Jhc2hpbmcKK3Byb2Nlc3NlcyBwcm9jIGZpbGVzIHByZW1hdHVyZWx5LiAgVGhpcyBpbiB0dXJuIGNyZWF0ZXMgdGhlCitwb3NzaWJpbGl0eSB0aGF0IGEgbWlzYmVoYXZpbmcgdXNlcnNwYWNlIGNvbGxlY3RpbmcgcHJvY2VzcyBjYW4gYmxvY2sKK3RoZSByZWFwaW5nIG9mIGEgY3Jhc2hlZCBwcm9jZXNzIHNpbXBseSBieSBuZXZlciBleGl0aW5nLiAgVGhpcyBzeXNjdGwKK2RlZmVuZHMgYWdhaW5zdCB0aGF0LiAgSXQgZGVmaW5lcyBob3cgbWFueSBjb25jdXJyZW50IGNyYXNoaW5nCitwcm9jZXNzZXMgbWF5IGJlIHBpcGVkIHRvIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIGluIHBhcmFsbGVsLiAgSWYKK3RoaXMgdmFsdWUgaXMgZXhjZWVkZWQsIHRoZW4gdGhvc2UgY3Jhc2hpbmcgcHJvY2Vzc2VzIGFib3ZlIHRoYXQgdmFsdWUKK2FyZSBub3RlZCB2aWEgdGhlIGtlcm5lbCBsb2cgYW5kIHRoZWlyIGNvcmVzIGFyZSBza2lwcGVkLiAgMCBpcyBhCitzcGVjaWFsIHZhbHVlLCBpbmRpY2F0aW5nIHRoYXQgdW5saW1pdGVkIHByb2Nlc3NlcyBtYXkgYmUgY2FwdHVyZWQgaW4KK3BhcmFsbGVsLCBidXQgdGhhdCBubyB3YWl0aW5nIHdpbGwgdGFrZSBwbGFjZSAoaS5lLiB0aGUgY29sbGVjdGluZworcHJvY2VzcyBpcyBub3QgZ3VhcmFudGVlZCBhY2Nlc3MgdG8gL3Byb2MvPGNyYXNoaW5nIHBpZD4vKS4gIFRoaXMKK3ZhbHVlIGRlZmF1bHRzIHRvIDAuCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTIxOCwxNCArMjMzLDE0IEBACiAKIGRtZXNnX3Jlc3RyaWN0OgogCi1UaGlzIHRvZ2dsZSBpbmRpY2F0ZXMgd2hldGhlciB1bnByaXZpbGVnZWQgdXNlcnMgYXJlIHByZXZlbnRlZCBmcm9tIHVzaW5nCi1kbWVzZyg4KSB0byB2aWV3IG1lc3NhZ2VzIGZyb20gdGhlIGtlcm5lbCdzIGxvZyBidWZmZXIuICBXaGVuCi1kbWVzZ19yZXN0cmljdCBpcyBzZXQgdG8gKDApIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMuICBXaGVuCitUaGlzIHRvZ2dsZSBpbmRpY2F0ZXMgd2hldGhlciB1bnByaXZpbGVnZWQgdXNlcnMgYXJlIHByZXZlbnRlZAorZnJvbSB1c2luZyBkbWVzZyg4KSB0byB2aWV3IG1lc3NhZ2VzIGZyb20gdGhlIGtlcm5lbCdzIGxvZyBidWZmZXIuCitXaGVuIGRtZXNnX3Jlc3RyaWN0IGlzIHNldCB0byAoMCkgdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucy4gV2hlbgogZG1lc2dfcmVzdHJpY3QgaXMgc2V0IHNldCB0byAoMSksIHVzZXJzIG11c3QgaGF2ZSBDQVBfU1lTTE9HIHRvIHVzZQogZG1lc2coOCkuCiAKLVRoZSBrZXJuZWwgY29uZmlnIG9wdGlvbiBDT05GSUdfU0VDVVJJVFlfRE1FU0dfUkVTVFJJQ1Qgc2V0cyB0aGUgZGVmYXVsdAotdmFsdWUgb2YgZG1lc2dfcmVzdHJpY3QuCitUaGUga2VybmVsIGNvbmZpZyBvcHRpb24gQ09ORklHX1NFQ1VSSVRZX0RNRVNHX1JFU1RSSUNUIHNldHMgdGhlCitkZWZhdWx0IHZhbHVlIG9mIGRtZXNnX3Jlc3RyaWN0LgogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0yNTYsMTMgKzI3MSw2IEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLWwyY3I6IChQUEMgb25seSkKLQotVGhpcyBmbGFnIGNvbnRyb2xzIHRoZSBMMiBjYWNoZSBvZiBHMyBwcm9jZXNzb3IgYm9hcmRzLiBJZgotMCwgdGhlIGNhY2hlIGlzIGRpc2FibGVkLiBFbmFibGVkIGlmIG5vbnplcm8uCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KIGtwdHJfcmVzdHJpY3Q6CiAKIFRoaXMgdG9nZ2xlIGluZGljYXRlcyB3aGV0aGVyIHJlc3RyaWN0aW9ucyBhcmUgcGxhY2VkIG9uCkBAIC0yODMsNiArMjkxLDEzIEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKK2wyY3I6IChQUEMgb25seSkKKworVGhpcyBmbGFnIGNvbnRyb2xzIHRoZSBMMiBjYWNoZSBvZiBHMyBwcm9jZXNzb3IgYm9hcmRzLiBJZgorMCwgdGhlIGNhY2hlIGlzIGRpc2FibGVkLiBFbmFibGVkIGlmIG5vbnplcm8uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKIG1vZHVsZXNfZGlzYWJsZWQ6CiAKIEEgdG9nZ2xlIHZhbHVlIGluZGljYXRpbmcgaWYgbW9kdWxlcyBhcmUgYWxsb3dlZCB0byBiZSBsb2FkZWQKQEAgLTI5Myw2ICszMDgsMjEgQEAKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorbm1pX3dhdGNoZG9nOgorCitFbmFibGVzL0Rpc2FibGVzIHRoZSBOTUkgd2F0Y2hkb2cgb24geDg2IHN5c3RlbXMuIFdoZW4gdGhlIHZhbHVlIGlzCitub24temVybyB0aGUgTk1JIHdhdGNoZG9nIGlzIGVuYWJsZWQgYW5kIHdpbGwgY29udGludW91c2x5IHRlc3QgYWxsCitvbmxpbmUgY3B1cyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhleSBhcmUgc3RpbGwgZnVuY3Rpb25pbmcKK3Byb3Blcmx5LiBDdXJyZW50bHksIHBhc3NpbmcgIm5taV93YXRjaGRvZz0iIHBhcmFtZXRlciBhdCBib290IHRpbWUgaXMKK3JlcXVpcmVkIGZvciB0aGlzIGZ1bmN0aW9uIHRvIHdvcmsuCisKK0lmIExBUElDIE5NSSB3YXRjaGRvZyBtZXRob2QgaXMgaW4gdXNlIChubWlfd2F0Y2hkb2c9MiBrZXJuZWwKK3BhcmFtZXRlciksIHRoZSBOTUkgd2F0Y2hkb2cgc2hhcmVzIHJlZ2lzdGVycyB3aXRoIG9wcm9maWxlLiBCeQorZGlzYWJsaW5nIHRoZSBOTUkgd2F0Y2hkb2csIG9wcm9maWxlIG1heSBoYXZlIG1vcmUgcmVnaXN0ZXJzIHRvCit1dGlsaXplLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiBvc3JlbGVhc2UsIG9zdHlwZSAmIHZlcnNpb246CiAKICMgY2F0IG9zcmVsZWFzZQpAQCAtMzEyLDEwICszNDIsMTAgQEAKIAogb3ZlcmZsb3dnaWQgJiBvdmVyZmxvd3VpZDoKIAotaWYgeW91ciBhcmNoaXRlY3R1cmUgZGlkIG5vdCBhbHdheXMgc3VwcG9ydCAzMi1iaXQgVUlEcyAoaS5lLiBhcm0sIGkzODYsCi1tNjhrLCBzaCwgYW5kIHNwYXJjMzIpLCBhIGZpeGVkIFVJRCBhbmQgR0lEIHdpbGwgYmUgcmV0dXJuZWQgdG8KLWFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgb2xkIDE2LWJpdCBVSUQvR0lEIHN5c3RlbSBjYWxscywgaWYgdGhlIGFjdHVhbAotVUlEIG9yIEdJRCB3b3VsZCBleGNlZWQgNjU1MzUuCitpZiB5b3VyIGFyY2hpdGVjdHVyZSBkaWQgbm90IGFsd2F5cyBzdXBwb3J0IDMyLWJpdCBVSURzIChpLmUuIGFybSwKK2kzODYsIG02OGssIHNoLCBhbmQgc3BhcmMzMiksIGEgZml4ZWQgVUlEIGFuZCBHSUQgd2lsbCBiZSByZXR1cm5lZCB0bworYXBwbGljYXRpb25zIHRoYXQgdXNlIHRoZSBvbGQgMTYtYml0IFVJRC9HSUQgc3lzdGVtIGNhbGxzLCBpZiB0aGUKK2FjdHVhbCBVSUQgb3IgR0lEIHdvdWxkIGV4Y2VlZCA2NTUzNS4KIAogVGhlc2Ugc3lzY3RscyBhbGxvdyB5b3UgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgZml4ZWQgVUlEIGFuZCBHSUQuCiBUaGUgZGVmYXVsdCBpcyA2NTUzNC4KQEAgLTMyNCw5ICszNTQsMjIgQEAKIAogcGFuaWM6CiAKLVRoZSB2YWx1ZSBpbiB0aGlzIGZpbGUgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdGhlCi1rZXJuZWwgd2FpdHMgYmVmb3JlIHJlYm9vdGluZyBvbiBhIHBhbmljLiBXaGVuIHlvdSB1c2UgdGhlCi1zb2Z0d2FyZSB3YXRjaGRvZywgdGhlIHJlY29tbWVuZGVkIHNldHRpbmcgaXMgNjAuCitUaGUgdmFsdWUgaW4gdGhpcyBmaWxlIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRoZSBrZXJuZWwKK3dhaXRzIGJlZm9yZSByZWJvb3Rpbmcgb24gYSBwYW5pYy4gV2hlbiB5b3UgdXNlIHRoZSBzb2Z0d2FyZSB3YXRjaGRvZywKK3RoZSByZWNvbW1lbmRlZCBzZXR0aW5nIGlzIDYwLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwYW5pY19vbl91bnJlY292ZXJlZF9ubWk6CisKK1RoZSBkZWZhdWx0IExpbnV4IGJlaGF2aW91ciBvbiBhbiBOTUkgb2YgZWl0aGVyIG1lbW9yeSBvciB1bmtub3duIGlzCit0byBjb250aW51ZSBvcGVyYXRpb24uIEZvciBtYW55IGVudmlyb25tZW50cyBzdWNoIGFzIHNjaWVudGlmaWMKK2NvbXB1dGluZyBpdCBpcyBwcmVmZXJhYmxlIHRoYXQgdGhlIGJveCBpcyB0YWtlbiBvdXQgYW5kIHRoZSBlcnJvcgorZGVhbHQgd2l0aCB0aGFuIGFuIHVuY29ycmVjdGVkIHBhcml0eS9FQ0MgZXJyb3IgZ2V0IHByb3BhZ2F0ZWQuCisKK0Egc21hbGwgbnVtYmVyIG9mIHN5c3RlbXMgZG8gZ2VuZXJhdGUgTk1JJ3MgZm9yIGJpemFycmUgcmFuZG9tIHJlYXNvbnMKK3N1Y2ggYXMgcG93ZXIgbWFuYWdlbWVudCBzbyB0aGUgZGVmYXVsdCBpcyBvZmYuIFRoYXQgc3lzY3RsIHdvcmtzIGxpa2UKK3RoZSBleGlzdGluZyBwYW5pYyBjb250cm9scyBhbHJlYWR5IGluIHRoYXQgZGlyZWN0b3J5LgogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0zNzYsNiArNDE5LDE0IEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKK3ByaW50a19kZWxheToKKworRGVsYXkgZWFjaCBwcmludGsgbWVzc2FnZSBpbiBwcmludGtfZGVsYXkgbWlsbGlzZWNvbmRzCisKK1ZhbHVlIGZyb20gMCAtIDEwMDAwIGlzIGFsbG93ZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKIHByaW50a19yYXRlbGltaXQ6CiAKIFNvbWUgd2FybmluZyBtZXNzYWdlcyBhcmUgcmF0ZSBsaW1pdGVkLiBwcmludGtfcmF0ZWxpbWl0IHNwZWNpZmllcwpAQCAtMzk1LDE1ICs0NDYsNyBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1wcmludGtfZGVsYXk6Ci0KLURlbGF5IGVhY2ggcHJpbnRrIG1lc3NhZ2UgaW4gcHJpbnRrX2RlbGF5IG1pbGxpc2Vjb25kcwotCi1WYWx1ZSBmcm9tIDAgLSAxMDAwMCBpcyBhbGxvd2VkLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1yYW5kb21pemUtdmEtc3BhY2U6CityYW5kb21pemVfdmFfc3BhY2U6CiAKIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgdHlwZSBvZiBwcm9jZXNzIGFkZHJlc3MKIHNwYWNlIHJhbmRvbWl6YXRpb24gdGhhdCBpcyB1c2VkIGluIHRoZSBzeXN0ZW0sIGZvciBhcmNoaXRlY3R1cmVzCkBAIC00NjYsMTEgKzUwOSwxMSBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1zaG1tYXg6IAorc2htbWF4OgogCiBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IGFuZCBzZXQgdGhlIHJ1biB0aW1lIGxpbWl0CiBvbiB0aGUgbWF4aW11bSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgc2l6ZSB0aGF0IGNhbiBiZSBjcmVhdGVkLgotU2hhcmVkIG1lbW9yeSBzZWdtZW50cyB1cCB0byAxR2IgYXJlIG5vdyBzdXBwb3J0ZWQgaW4gdGhlIAorU2hhcmVkIG1lbW9yeSBzZWdtZW50cyB1cCB0byAxR2IgYXJlIG5vdyBzdXBwb3J0ZWQgaW4gdGhlCiBrZXJuZWwuICBUaGlzIHZhbHVlIGRlZmF1bHRzIHRvIFNITU1BWC4KIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTQ4NCw3ICs1MjcsNyBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi10YWludGVkOiAKK3RhaW50ZWQ6CiAKIE5vbi16ZXJvIGlmIHRoZSBrZXJuZWwgaGFzIGJlZW4gdGFpbnRlZC4gIE51bWVyaWMgdmFsdWVzLCB3aGljaAogY2FuIGJlIE9SZWQgdG9nZXRoZXI6CkBAIC01MDksNDkgKzU1MiwxMSBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1hdXRvX21zZ21uaToKLQotRW5hYmxlcy9EaXNhYmxlcyBhdXRvbWF0aWMgcmVjb21wdXRpbmcgb2YgbXNnbW5pIHVwb24gbWVtb3J5IGFkZC9yZW1vdmUgb3IKLXVwb24gaXBjIG5hbWVzcGFjZSBjcmVhdGlvbi9yZW1vdmFsIChzZWUgdGhlIG1zZ21uaSBkZXNjcmlwdGlvbiBhYm92ZSkuCi1FY2hvaW5nICIxIiBpbnRvIHRoaXMgZmlsZSBlbmFibGVzIG1zZ21uaSBhdXRvbWF0aWMgcmVjb21wdXRpbmcuCi1FY2hvaW5nICIwIiB0dXJucyBpdCBvZmYuCi1hdXRvX21zZ21uaSBkZWZhdWx0IHZhbHVlIGlzIDEuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLW5taV93YXRjaGRvZzoKLQotRW5hYmxlcy9EaXNhYmxlcyB0aGUgTk1JIHdhdGNoZG9nIG9uIHg4NiBzeXN0ZW1zLiAgV2hlbiB0aGUgdmFsdWUgaXMgbm9uLXplcm8KLXRoZSBOTUkgd2F0Y2hkb2cgaXMgZW5hYmxlZCBhbmQgd2lsbCBjb250aW51b3VzbHkgdGVzdCBhbGwgb25saW5lIGNwdXMgdG8KLWRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBzdGlsbCBmdW5jdGlvbmluZyBwcm9wZXJseS4gQ3VycmVudGx5LAotcGFzc2luZyAibm1pX3dhdGNoZG9nPSIgcGFyYW1ldGVyIGF0IGJvb3QgdGltZSBpcyByZXF1aXJlZCBmb3IgdGhpcyBmdW5jdGlvbgotdG8gd29yay4KLQotSWYgTEFQSUMgTk1JIHdhdGNoZG9nIG1ldGhvZCBpcyBpbiB1c2UgKG5taV93YXRjaGRvZz0yIGtlcm5lbCBwYXJhbWV0ZXIpLCB0aGUKLU5NSSB3YXRjaGRvZyBzaGFyZXMgcmVnaXN0ZXJzIHdpdGggb3Byb2ZpbGUuIEJ5IGRpc2FibGluZyB0aGUgTk1JIHdhdGNoZG9nLAotb3Byb2ZpbGUgbWF5IGhhdmUgbW9yZSByZWdpc3RlcnMgdG8gdXRpbGl6ZS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQogdW5rbm93bl9ubWlfcGFuaWM6CiAKLVRoZSB2YWx1ZSBpbiB0aGlzIGZpbGUgYWZmZWN0cyBiZWhhdmlvciBvZiBoYW5kbGluZyBOTUkuIFdoZW4gdGhlIHZhbHVlIGlzCi1ub24temVybywgdW5rbm93biBOTUkgaXMgdHJhcHBlZCBhbmQgdGhlbiBwYW5pYyBvY2N1cnMuIEF0IHRoYXQgdGltZSwga2VybmVsCi1kZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgZGlzcGxheWVkIG9uIGNvbnNvbGUuCitUaGUgdmFsdWUgaW4gdGhpcyBmaWxlIGFmZmVjdHMgYmVoYXZpb3Igb2YgaGFuZGxpbmcgTk1JLiBXaGVuIHRoZQordmFsdWUgaXMgbm9uLXplcm8sIHVua25vd24gTk1JIGlzIHRyYXBwZWQgYW5kIHRoZW4gcGFuaWMgb2NjdXJzLiBBdAordGhhdCB0aW1lLCBrZXJuZWwgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIGRpc3BsYXllZCBvbiBjb25zb2xlLgogCi1OTUkgc3dpdGNoIHRoYXQgbW9zdCBJQTMyIHNlcnZlcnMgaGF2ZSBmaXJlcyB1bmtub3duIE5NSSB1cCwgZm9yIGV4YW1wbGUuCi1JZiBhIHN5c3RlbSBoYW5ncyB1cCwgdHJ5IHByZXNzaW5nIHRoZSBOTUkgc3dpdGNoLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wYW5pY19vbl91bnJlY292ZXJlZF9ubWk6Ci0KLVRoZSBkZWZhdWx0IExpbnV4IGJlaGF2aW91ciBvbiBhbiBOTUkgb2YgZWl0aGVyIG1lbW9yeSBvciB1bmtub3duIGlzIHRvIGNvbnRpbnVlCi1vcGVyYXRpb24uIEZvciBtYW55IGVudmlyb25tZW50cyBzdWNoIGFzIHNjaWVudGlmaWMgY29tcHV0aW5nIGl0IGlzIHByZWZlcmFibGUKLXRoYXQgdGhlIGJveCBpcyB0YWtlbiBvdXQgYW5kIHRoZSBlcnJvciBkZWFsdCB3aXRoIHRoYW4gYW4gdW5jb3JyZWN0ZWQKLXBhcml0eS9FQ0MgZXJyb3IgZ2V0IHByb3BvZ2F0ZWQuCi0KLUEgc21hbGwgbnVtYmVyIG9mIHN5c3RlbXMgZG8gZ2VuZXJhdGUgTk1JJ3MgZm9yIGJpemFycmUgcmFuZG9tIHJlYXNvbnMgc3VjaCBhcwotcG93ZXIgbWFuYWdlbWVudCBzbyB0aGUgZGVmYXVsdCBpcyBvZmYuIFRoYXQgc3lzY3RsIHdvcmtzIGxpa2UgdGhlIGV4aXN0aW5nCi1wYW5pYyBjb250cm9scyBhbHJlYWR5IGluIHRoYXQgZGlyZWN0b3J5LgotCitOTUkgc3dpdGNoIHRoYXQgbW9zdCBJQTMyIHNlcnZlcnMgaGF2ZSBmaXJlcyB1bmtub3duIE5NSSB1cCwgZm9yCitleGFtcGxlLiAgSWYgYSBzeXN0ZW0gaGFuZ3MgdXAsIHRyeSBwcmVzc2luZyB0aGUgTk1JIHN3aXRjaC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2Uva3Byb2JldHJhY2UudHh0IGIvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQKaW5kZXggYzgzYmQ2Yi4uZDBkMGJiOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQKQEAgLTIyLDE0ICsyMiwxNSBAQAogCiBTeW5vcHNpcyBvZiBrcHJvYmVfZXZlbnRzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHBbOltHUlAvXUVWRU5UXSBTWU1CT0xbK29mZnNdfE1FTUFERFIgW0ZFVENIQVJHU10JOiBTZXQgYSBwcm9iZQotICByWzpbR1JQL11FVkVOVF0gU1lNQk9MWyswXSBbRkVUQ0hBUkdTXQkJOiBTZXQgYSByZXR1cm4gcHJvYmUKKyAgcFs6W0dSUC9dRVZFTlRdIFtNT0Q6XVNZTVsrb2Zmc118TUVNQUREUiBbRkVUQ0hBUkdTXQk6IFNldCBhIHByb2JlCisgIHJbOltHUlAvXUVWRU5UXSBbTU9EOl1TWU1bKzBdIFtGRVRDSEFSR1NdCQk6IFNldCBhIHJldHVybiBwcm9iZQogICAtOltHUlAvXUVWRU5UCQkJCQkJOiBDbGVhciBhIHByb2JlCiAKICBHUlAJCTogR3JvdXAgbmFtZS4gSWYgb21pdHRlZCwgdXNlICJrcHJvYmVzIiBmb3IgaXQuCiAgRVZFTlQJCTogRXZlbnQgbmFtZS4gSWYgb21pdHRlZCwgdGhlIGV2ZW50IG5hbWUgaXMgZ2VuZXJhdGVkCi0JCSAgYmFzZWQgb24gU1lNQk9MK29mZnMgb3IgTUVNQUREUi4KLSBTWU1CT0xbK29mZnNdCTogU3ltYm9sK29mZnNldCB3aGVyZSB0aGUgcHJvYmUgaXMgaW5zZXJ0ZWQuCisJCSAgYmFzZWQgb24gU1lNK29mZnMgb3IgTUVNQUREUi4KKyBNT0QJCTogTW9kdWxlIG5hbWUgd2hpY2ggaGFzIGdpdmVuIFNZTS4KKyBTWU1bK29mZnNdCTogU3ltYm9sK29mZnNldCB3aGVyZSB0aGUgcHJvYmUgaXMgaW5zZXJ0ZWQuCiAgTUVNQUREUgk6IEFkZHJlc3Mgd2hlcmUgdGhlIHByb2JlIGlzIGluc2VydGVkLgogCiAgRkVUQ0hBUkdTCTogQXJndW1lbnRzLiBFYWNoIHByb2JlIGNhbiBoYXZlIHVwIHRvIDEyOCBhcmdzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvZWhjaS50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi9laGNpLnR4dAppbmRleCA5ZGNhZmE3Li4xNjBiZDZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi9laGNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9laGNpLnR4dApAQCAtMjEwLDMgKzIxMCw1IEBACiB0cmFuc2ZlcnMgYXJlIGZ1bGx5IHNjaGVkdWxlZCwgc28gdGhlIG1haW4gaXNzdWUgaXMgbGlrZWx5IHRvIGJlIGhvdwogdG8gdHJpZ2dlciAiaGlnaCBiYW5kd2lkdGgiIG1vZGVzLgogCitUQkQ6ICBNb3JlIHRoYW4gc3RhbmRhcmQgODAlIHBlcmlvZGljIGJhbmR3aWR0aCBhbGxvY2F0aW9uIGlzIHBvc3NpYmxlCit0aHJvdWdoIHN5c2ZzIHVmcmFtZV9wZXJpb2RpY19tYXggcGFyYW1ldGVyLiBEZXNjcmliZSB0aGF0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvZXJyb3ItY29kZXMudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvZXJyb3ItY29kZXMudHh0CmluZGV4IGQ4MzcwM2UuLmIzZjYwNmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL2Vycm9yLWNvZGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9lcnJvci1jb2Rlcy50eHQKQEAgLTc2LDYgKzc2LDEzIEBACiByZXBvcnRlZC4gIFRoYXQncyBiZWNhdXNlIHRyYW5zZmVycyBvZnRlbiBpbnZvbHZlIHNldmVyYWwgcGFja2V0cywgc28gdGhhdAogb25lIG9yIG1vcmUgcGFja2V0cyBjb3VsZCBmaW5pc2ggYmVmb3JlIGFuIGVycm9yIHN0b3BzIGZ1cnRoZXIgZW5kcG9pbnQgSS9PLgogCitGb3IgaXNvY2hyb25vdXMgVVJCcywgdGhlIHVyYiBzdGF0dXMgdmFsdWUgaXMgbm9uLXplcm8gb25seSBpZiB0aGUgVVJCIGlzCit1bmxpbmtlZCwgdGhlIGRldmljZSBpcyByZW1vdmVkLCB0aGUgaG9zdCBjb250cm9sbGVyIGlzIGRpc2FibGVkLCBvciB0aGUgdG90YWwKK3RyYW5zZmVycmVkIGxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBsZW5ndGggYW5kIHRoZSBVUkJfU0hPUlRfTk9UX09LCitmbGFnIGlzIHNldC4gIENvbXBsZXRpb24gaGFuZGxlcnMgZm9yIGlzb2Nocm9ub3VzIFVSQnMgc2hvdWxkIG9ubHkgc2VlCit1cmItPnN0YXR1cyBzZXQgdG8gemVybywgLUVOT0VOVCwgLUVDT05OUkVTRVQsIC1FU0hVVERPV04sIG9yIC1FUkVNT1RFSU8uCitJbmRpdmlkdWFsIGZyYW1lIGRlc2NyaXB0b3Igc3RhdHVzIGZpZWxkcyBtYXkgcmVwb3J0IG1vcmUgc3RhdHVzIGNvZGVzLgorCiAKIDAJCQlUcmFuc2ZlciBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CiAKQEAgLTEzMiw3ICsxMzksNyBAQAogCQkJZGV2aWNlIHJlbW92YWwgZXZlbnRzIGltbWVkaWF0ZWx5LgogCiAtRVhERVYJCQlJU08gdHJhbnNmZXIgb25seSBwYXJ0aWFsbHkgY29tcGxldGVkCi0JCQlsb29rIGF0IGluZGl2aWR1YWwgZnJhbWUgc3RhdHVzIGZvciBkZXRhaWxzCisJCQkob25seSBzZXQgaW4gaXNvX2ZyYW1lX2Rlc2Nbbl0uc3RhdHVzLCBub3QgdXJiLT5zdGF0dXMpCiAKIC1FSU5WQUwJCQlJU08gbWFkbmVzcywgaWYgdGhpcyBoYXBwZW5zOiBMb2cgb2ZmIGFuZCBnbyBob21lCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL2dhZGdldF9oaWQudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvZ2FkZ2V0X2hpZC50eHQKaW5kZXggZjRhNTFmNS4uMTI2OTZjMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvZ2FkZ2V0X2hpZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvZ2FkZ2V0X2hpZC50eHQKQEAgLTgxLDggKzgxLDggQEAKIAl0byBkbyB0aGlzLgogCiAJaGlkX2dhZGdldF90ZXN0IGlzIGEgc21hbGwgaW50ZXJhY3RpdmUgcHJvZ3JhbSB0byB0ZXN0IHRoZSBISUQKLSAJZ2FkZ2V0IGRyaXZlci4gVG8gdXNlLCBwb2ludCBpdCBhdCBhIGhpZGcgZGV2aWNlIGFuZCBzZXQgdGhlCi0gCWRldmljZSB0eXBlIChrZXlib2FyZCAvIG1vdXNlIC8gam95c3RpY2spIC0gRS5HLjoKKwlnYWRnZXQgZHJpdmVyLiBUbyB1c2UsIHBvaW50IGl0IGF0IGEgaGlkZyBkZXZpY2UgYW5kIHNldCB0aGUKKwlkZXZpY2UgdHlwZSAoa2V5Ym9hcmQgLyBtb3VzZSAvIGpveXN0aWNrKSAtIEUuRy46CiAKIAkJIyBoaWRfZ2FkZ2V0X3Rlc3QgL2Rldi9oaWRnMCBrZXlib2FyZAogCkBAIC05Nyw3ICs5Nyw3IEBACiAJSElEIGdhZGdldC4KIAogCUFub3RoZXIgaW50ZXJlc3RpbmcgZXhhbXBsZSBpcyB0aGUgY2FwcyBsb2NrIHRlc3QuIFR5cGUKLQkt4oCTY2Fwcy1sb2NrIGFuZCBoaXQgcmV0dXJuLiBBIHJlcG9ydCBpcyB0aGVuIHNlbnQgYnkgdGhlCisJLS1jYXBzLWxvY2sgYW5kIGhpdCByZXR1cm4uIEEgcmVwb3J0IGlzIHRoZW4gc2VudCBieSB0aGUKIAlnYWRnZXQgYW5kIHlvdSBzaG91bGQgcmVjZWl2ZSB0aGUgaG9zdCBhbnN3ZXIsIGNvcnJlc3BvbmRpbmcKIAl0byB0aGUgY2FwcyBsb2NrIExFRCBzdGF0dXMuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdkRTTy9wYXJzZV92ZHNvLmMgYi9Eb2N1bWVudGF0aW9uL3ZEU08vcGFyc2VfdmRzby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODcwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZEU08vcGFyc2VfdmRzby5jCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogcGFyc2VfdmRzby5jOiBMaW51eCByZWZlcmVuY2UgdkRTTyBwYXJzZXIKKyAqIFdyaXR0ZW4gYnkgQW5kcmV3IEx1dG9taXJza2ksIDIwMTEuCisgKgorICogVGhpcyBjb2RlIGlzIG1lYW50IHRvIGJlIGxpbmtlZCBpbiB0byB2YXJpb3VzIHByb2dyYW1zIHRoYXQgcnVuIG9uIExpbnV4LgorICogQXMgc3VjaCwgaXQgaXMgYXZhaWxhYmxlIHdpdGggYXMgZmV3IHJlc3RyaWN0aW9ucyBhcyBwb3NzaWJsZS4gIFRoaXMgZmlsZQorICogaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgWmVybyBMaWNlbnNlLCB2ZXJzaW9uIDEuMCwKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvbGVnYWxjb2RlCisgKgorICogVGhlIHZEU08gaXMgYSByZWd1bGFyIEVMRiBEU08gdGhhdCB0aGUga2VybmVsIG1hcHMgaW50byB1c2VyIHNwYWNlIHdoZW4KKyAqIGl0IHN0YXJ0cyBhIHByb2dyYW0uICBJdCB3b3JrcyBlcXVhbGx5IHdlbGwgaW4gc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkKKyAqIGxpbmtlZCBiaW5hcmllcy4KKyAqCisgKiBUaGlzIGNvZGUgaXMgdGVzdGVkIG9uIHg4Nl82NC4gIEluIHByaW5jaXBsZSBpdCBzaG91bGQgd29yayBvbiBhbnkgNjQtYml0CisgKiBhcmNoaXRlY3R1cmUgdGhhdCBoYXMgYSB2RFNPLgorICovCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZWxmLmg+CisKKy8qCisgKiBUbyB1c2UgdGhpcyB2RFNPIHBhcnNlciwgZmlyc3QgY2FsbCBvbmUgb2YgdGhlIHZkc29faW5pdF8qIGZ1bmN0aW9ucy4KKyAqIElmIHlvdSd2ZSBhbHJlYWR5IHBhcnNlZCBhdXh2LCB0aGVuIHBhc3MgdGhlIHZhbHVlIG9mIEFUX1NZU0lORk9fRUhEUgorICogdG8gdmRzb19pbml0X2Zyb21fc3lzaW5mb19laGRyLiAgT3RoZXJ3aXNlIHBhc3MgYXV4diB0byB2ZHNvX2luaXRfZnJvbV9hdXh2LgorICogVGhlbiBjYWxsIHZkc29fc3ltIGZvciBlYWNoIHN5bWJvbCB5b3Ugd2FudC4gIEZvciBleGFtcGxlLCB0byBsb29rIHVwCisgKiBnZXR0aW1lb2ZkYXkgb24geDg2XzY0LCB1c2U6CisgKgorICogICAgIDxzb21lIHBvaW50ZXI+ID0gdmRzb19zeW0oIkxJTlVYXzIuNiIsICJnZXR0aW1lb2ZkYXkiKTsKKyAqIG9yCisgKiAgICAgPHNvbWUgcG9pbnRlcj4gPSB2ZHNvX3N5bSgiTElOVVhfMi42IiwgIl9fdmRzb19nZXR0aW1lb2ZkYXkiKTsKKyAqCisgKiB2ZHNvX3N5bSB3aWxsIHJldHVybiAwIGlmIHRoZSBzeW1ib2wgZG9lc24ndCBleGlzdCBvciBpZiB0aGUgaW5pdCBmdW5jdGlvbgorICogZmFpbGVkIG9yIHdhcyBub3QgY2FsbGVkLiAgdmRzb19zeW0gaXMgYSBsaXR0bGUgc2xvdywgc28gaXRzIHJldHVybiB2YWx1ZQorICogc2hvdWxkIGJlIGNhY2hlZC4KKyAqCisgKiB2ZHNvX3N5bSBpcyB0aHJlYWRzYWZlOyB0aGUgaW5pdCBmdW5jdGlvbnMgYXJlIG5vdC4KKyAqCisgKiBUaGVzZSBhcmUgdGhlIHByb3RvdHlwZXM6CisgKi8KK2V4dGVybiB2b2lkIHZkc29faW5pdF9mcm9tX2F1eHYodm9pZCAqYXV4dik7CitleHRlcm4gdm9pZCB2ZHNvX2luaXRfZnJvbV9zeXNpbmZvX2VoZHIodWludHB0cl90IGJhc2UpOworZXh0ZXJuIHZvaWQgKnZkc29fc3ltKGNvbnN0IGNoYXIgKnZlcnNpb24sIGNvbnN0IGNoYXIgKm5hbWUpOworCisKKy8qIEFuZCBoZXJlJ3MgdGhlIGNvZGUuICovCisKKyNpZm5kZWYgX194ODZfNjRfXworIyBlcnJvciBOb3QgeWV0IHBvcnRlZCB0byBub24teDg2XzY0IGFyY2hpdGVjdHVyZXMKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHZkc29faW5mbworeworCWJvb2wgdmFsaWQ7CisKKwkvKiBMb2FkIGluZm9ybWF0aW9uICovCisJdWludHB0cl90IGxvYWRfYWRkcjsKKwl1aW50cHRyX3QgbG9hZF9vZmZzZXQ7ICAvKiBsb2FkX2FkZHIgLSByZWNvcmRlZCB2YWRkciAqLworCisJLyogU3ltYm9sIHRhYmxlICovCisJRWxmNjRfU3ltICpzeW10YWI7CisJY29uc3QgY2hhciAqc3ltc3RyaW5nczsKKwlFbGY2NF9Xb3JkICpidWNrZXQsICpjaGFpbjsKKwlFbGY2NF9Xb3JkIG5idWNrZXQsIG5jaGFpbjsKKworCS8qIFZlcnNpb24gdGFibGUgKi8KKwlFbGY2NF9WZXJzeW0gKnZlcnN5bTsKKwlFbGY2NF9WZXJkZWYgKnZlcmRlZjsKK30gdmRzb19pbmZvOworCisvKiBTdHJhaWdodCBmcm9tIHRoZSBFTEYgc3BlY2lmaWNhdGlvbi4gKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVsZl9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBoID0gMCwgZzsKKwl3aGlsZSAoKm5hbWUpCisJeworCQloID0gKGggPDwgNCkgKyAqbmFtZSsrOworCQlpZiAoZyA9IGggJiAweGYwMDAwMDAwKQorCQkJaCBePSBnID4+IDI0OworCQloICY9IH5nOworCX0KKwlyZXR1cm4gaDsKK30KKwordm9pZCB2ZHNvX2luaXRfZnJvbV9zeXNpbmZvX2VoZHIodWludHB0cl90IGJhc2UpCit7CisJc2l6ZV90IGk7CisJYm9vbCBmb3VuZF92YWRkciA9IGZhbHNlOworCisJdmRzb19pbmZvLnZhbGlkID0gZmFsc2U7CisKKwl2ZHNvX2luZm8ubG9hZF9hZGRyID0gYmFzZTsKKworCUVsZjY0X0VoZHIgKmhkciA9IChFbGY2NF9FaGRyKiliYXNlOworCUVsZjY0X1BoZHIgKnB0ID0gKEVsZjY0X1BoZHIqKSh2ZHNvX2luZm8ubG9hZF9hZGRyICsgaGRyLT5lX3Bob2ZmKTsKKwlFbGY2NF9EeW4gKmR5biA9IDA7CisKKwkvKgorCSAqIFdlIG5lZWQgdHdvIHRoaW5ncyBmcm9tIHRoZSBzZWdtZW50IHRhYmxlOiB0aGUgbG9hZCBvZmZzZXQKKwkgKiBhbmQgdGhlIGR5bmFtaWMgdGFibGUuCisJICovCisJZm9yIChpID0gMDsgaSA8IGhkci0+ZV9waG51bTsgaSsrKQorCXsKKwkJaWYgKHB0W2ldLnBfdHlwZSA9PSBQVF9MT0FEICYmICFmb3VuZF92YWRkcikgeworCQkJZm91bmRfdmFkZHIgPSB0cnVlOworCQkJdmRzb19pbmZvLmxvYWRfb2Zmc2V0ID0JYmFzZQorCQkJCSsgKHVpbnRwdHJfdClwdFtpXS5wX29mZnNldAorCQkJCS0gKHVpbnRwdHJfdClwdFtpXS5wX3ZhZGRyOworCQl9IGVsc2UgaWYgKHB0W2ldLnBfdHlwZSA9PSBQVF9EWU5BTUlDKSB7CisJCQlkeW4gPSAoRWxmNjRfRHluKikoYmFzZSArIHB0W2ldLnBfb2Zmc2V0KTsKKwkJfQorCX0KKworCWlmICghZm91bmRfdmFkZHIgfHwgIWR5bikKKwkJcmV0dXJuOyAgLyogRmFpbGVkICovCisKKwkvKgorCSAqIEZpc2ggb3V0IHRoZSB1c2VmdWwgYml0cyBvZiB0aGUgZHluYW1pYyB0YWJsZS4KKwkgKi8KKwlFbGY2NF9Xb3JkICpoYXNoID0gMDsKKwl2ZHNvX2luZm8uc3ltc3RyaW5ncyA9IDA7CisJdmRzb19pbmZvLnN5bXRhYiA9IDA7CisJdmRzb19pbmZvLnZlcnN5bSA9IDA7CisJdmRzb19pbmZvLnZlcmRlZiA9IDA7CisJZm9yIChpID0gMDsgZHluW2ldLmRfdGFnICE9IERUX05VTEw7IGkrKykgeworCQlzd2l0Y2ggKGR5bltpXS5kX3RhZykgeworCQljYXNlIERUX1NUUlRBQjoKKwkJCXZkc29faW5mby5zeW1zdHJpbmdzID0gKGNvbnN0IGNoYXIgKikKKwkJCQkoKHVpbnRwdHJfdClkeW5baV0uZF91bi5kX3B0cgorCQkJCSArIHZkc29faW5mby5sb2FkX29mZnNldCk7CisJCQlicmVhazsKKwkJY2FzZSBEVF9TWU1UQUI6CisJCQl2ZHNvX2luZm8uc3ltdGFiID0gKEVsZjY0X1N5bSAqKQorCQkJCSgodWludHB0cl90KWR5bltpXS5kX3VuLmRfcHRyCisJCQkJICsgdmRzb19pbmZvLmxvYWRfb2Zmc2V0KTsKKwkJCWJyZWFrOworCQljYXNlIERUX0hBU0g6CisJCQloYXNoID0gKEVsZjY0X1dvcmQgKikKKwkJCQkoKHVpbnRwdHJfdClkeW5baV0uZF91bi5kX3B0cgorCQkJCSArIHZkc29faW5mby5sb2FkX29mZnNldCk7CisJCQlicmVhazsKKwkJY2FzZSBEVF9WRVJTWU06CisJCQl2ZHNvX2luZm8udmVyc3ltID0gKEVsZjY0X1ZlcnN5bSAqKQorCQkJCSgodWludHB0cl90KWR5bltpXS5kX3VuLmRfcHRyCisJCQkJICsgdmRzb19pbmZvLmxvYWRfb2Zmc2V0KTsKKwkJCWJyZWFrOworCQljYXNlIERUX1ZFUkRFRjoKKwkJCXZkc29faW5mby52ZXJkZWYgPSAoRWxmNjRfVmVyZGVmICopCisJCQkJKCh1aW50cHRyX3QpZHluW2ldLmRfdW4uZF9wdHIKKwkJCQkgKyB2ZHNvX2luZm8ubG9hZF9vZmZzZXQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCF2ZHNvX2luZm8uc3ltc3RyaW5ncyB8fCAhdmRzb19pbmZvLnN5bXRhYiB8fCAhaGFzaCkKKwkJcmV0dXJuOyAgLyogRmFpbGVkICovCisKKwlpZiAoIXZkc29faW5mby52ZXJkZWYpCisJCXZkc29faW5mby52ZXJzeW0gPSAwOworCisJLyogUGFyc2UgdGhlIGhhc2ggdGFibGUgaGVhZGVyLiAqLworCXZkc29faW5mby5uYnVja2V0ID0gaGFzaFswXTsKKwl2ZHNvX2luZm8ubmNoYWluID0gaGFzaFsxXTsKKwl2ZHNvX2luZm8uYnVja2V0ID0gJmhhc2hbMl07CisJdmRzb19pbmZvLmNoYWluID0gJmhhc2hbdmRzb19pbmZvLm5idWNrZXQgKyAyXTsKKworCS8qIFRoYXQncyBhbGwgd2UgbmVlZC4gKi8KKwl2ZHNvX2luZm8udmFsaWQgPSB0cnVlOworfQorCitzdGF0aWMgYm9vbCB2ZHNvX21hdGNoX3ZlcnNpb24oRWxmNjRfVmVyc3ltIHZlciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBFbGY2NF9Xb3JkIGhhc2gpCit7CisJLyoKKwkgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSB2ZXJzaW9uIGluZGV4ZWQgYnkKKwkgKiB2ZXIgbWF0Y2hlcyBuYW1lICh3aGljaCBoYXNoZXMgdG8gaGFzaCkuCisJICoKKwkgKiBUaGUgdmVyc2lvbiBkZWZpbml0aW9uIHRhYmxlIGlzIGEgbWVzcywgYW5kIEkgZG9uJ3Qga25vdyBob3cKKwkgKiB0byBkbyB0aGlzIGluIGJldHRlciB0aGFuIGxpbmVhciB0aW1lIHdpdGhvdXQgYWxsb2NhdGluZyBtZW1vcnkKKwkgKiB0byBidWlsZCBhbiBpbmRleC4gIEkgYWxzbyBkb24ndCBrbm93IHdoeSB0aGUgdGFibGUgaGFzCisJICogdmFyaWFibGUgc2l6ZSBlbnRyaWVzIGluIHRoZSBmaXJzdCBwbGFjZS4KKwkgKgorCSAqIEZvciBhZGRlZCBmdW4sIEkgY2FuJ3QgZmluZCBhIGNvbXByZWhlbnNpYmxlIHNwZWNpZmljYXRpb24gb2YgaG93CisJICogdG8gcGFyc2UgYWxsIHRoZSB3ZWlyZCBmbGFncyBpbiB0aGUgdGFibGUuCisJICoKKwkgKiBTbyBJIGp1c3QgcGFyc2UgdGhlIHdob2xlIHRhYmxlIGV2ZXJ5IHRpbWUuCisJICovCisKKwkvKiBGaXJzdCBzdGVwOiBmaW5kIHRoZSB2ZXJzaW9uIGRlZmluaXRpb24gKi8KKwl2ZXIgJj0gMHg3ZmZmOyAgLyogQXBwYXJlbnRseSBiaXQgMTUgbWVhbnMgImhpZGRlbiIgKi8KKwlFbGY2NF9WZXJkZWYgKmRlZiA9IHZkc29faW5mby52ZXJkZWY7CisJd2hpbGUodHJ1ZSkgeworCQlpZiAoKGRlZi0+dmRfZmxhZ3MgJiBWRVJfRkxHX0JBU0UpID09IDAKKwkJICAgICYmIChkZWYtPnZkX25keCAmIDB4N2ZmZikgPT0gdmVyKQorCQkJYnJlYWs7CisKKwkJaWYgKGRlZi0+dmRfbmV4dCA9PSAwKQorCQkJcmV0dXJuIGZhbHNlOyAgLyogTm8gZGVmaW5pdGlvbi4gKi8KKworCQlkZWYgPSAoRWxmNjRfVmVyZGVmICopKChjaGFyICopZGVmICsgZGVmLT52ZF9uZXh0KTsKKwl9CisKKwkvKiBOb3cgZmlndXJlIG91dCB3aGV0aGVyIGl0IG1hdGNoZXMuICovCisJRWxmNjRfVmVyZGF1eCAqYXV4ID0gKEVsZjY0X1ZlcmRhdXgqKSgoY2hhciAqKWRlZiArIGRlZi0+dmRfYXV4KTsKKwlyZXR1cm4gZGVmLT52ZF9oYXNoID09IGhhc2gKKwkJJiYgIXN0cmNtcChuYW1lLCB2ZHNvX2luZm8uc3ltc3RyaW5ncyArIGF1eC0+dmRhX25hbWUpOworfQorCit2b2lkICp2ZHNvX3N5bShjb25zdCBjaGFyICp2ZXJzaW9uLCBjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgdmVyX2hhc2g7CisJaWYgKCF2ZHNvX2luZm8udmFsaWQpCisJCXJldHVybiAwOworCisJdmVyX2hhc2ggPSBlbGZfaGFzaCh2ZXJzaW9uKTsKKwlFbGY2NF9Xb3JkIGNoYWluID0gdmRzb19pbmZvLmJ1Y2tldFtlbGZfaGFzaChuYW1lKSAlIHZkc29faW5mby5uYnVja2V0XTsKKworCWZvciAoOyBjaGFpbiAhPSBTVE5fVU5ERUY7IGNoYWluID0gdmRzb19pbmZvLmNoYWluW2NoYWluXSkgeworCQlFbGY2NF9TeW0gKnN5bSA9ICZ2ZHNvX2luZm8uc3ltdGFiW2NoYWluXTsKKworCQkvKiBDaGVjayBmb3IgYSBkZWZpbmVkIGdsb2JhbCBvciB3ZWFrIGZ1bmN0aW9uIHcvIHJpZ2h0IG5hbWUuICovCisJCWlmIChFTEY2NF9TVF9UWVBFKHN5bS0+c3RfaW5mbykgIT0gU1RUX0ZVTkMpCisJCQljb250aW51ZTsKKwkJaWYgKEVMRjY0X1NUX0JJTkQoc3ltLT5zdF9pbmZvKSAhPSBTVEJfR0xPQkFMICYmCisJCSAgICBFTEY2NF9TVF9CSU5EKHN5bS0+c3RfaW5mbykgIT0gU1RCX1dFQUspCisJCQljb250aW51ZTsKKwkJaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAobmFtZSwgdmRzb19pbmZvLnN5bXN0cmluZ3MgKyBzeW0tPnN0X25hbWUpKQorCQkJY29udGludWU7CisKKwkJLyogQ2hlY2sgc3ltYm9sIHZlcnNpb24uICovCisJCWlmICh2ZHNvX2luZm8udmVyc3ltCisJCSAgICAmJiAhdmRzb19tYXRjaF92ZXJzaW9uKHZkc29faW5mby52ZXJzeW1bY2hhaW5dLAorCQkJCQkgICB2ZXJzaW9uLCB2ZXJfaGFzaCkpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gKHZvaWQgKikodmRzb19pbmZvLmxvYWRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdmRzb19pbml0X2Zyb21fYXV4dih2b2lkICphdXh2KQoreworCUVsZjY0X2F1eHZfdCAqZWxmX2F1eHYgPSBhdXh2OworCWZvciAoaW50IGkgPSAwOyBlbGZfYXV4dltpXS5hX3R5cGUgIT0gQVRfTlVMTDsgaSsrKQorCXsKKwkJaWYgKGVsZl9hdXh2W2ldLmFfdHlwZSA9PSBBVF9TWVNJTkZPX0VIRFIpIHsKKwkJCXZkc29faW5pdF9mcm9tX3N5c2luZm9fZWhkcihlbGZfYXV4dltpXS5hX3VuLmFfdmFsKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXZkc29faW5mby52YWxpZCA9IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92RFNPL3Zkc29fdGVzdC5jIGIvRG9jdW1lbnRhdGlvbi92RFNPL3Zkc29fdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZjYzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZEU08vdmRzb190ZXN0LmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiB2ZHNvX3Rlc3QuYzogU2FtcGxlIGNvZGUgdG8gdGVzdCBwYXJzZV92ZHNvLmMgb24geDg2XzY0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQW5keSBMdXRvbWlyc2tpCisgKiBTdWJqZWN0IHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyCisgKgorICogWW91IGNhbiBhbXVzZSB5b3Vyc2VsZiBieSBjb21waWxpbmcgd2l0aDoKKyAqIGdjYyAtc3RkPWdudTk5IC1ub3N0ZGxpYgorICogICAgIC1PcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1mbHRvCisgKiAgICAgIHZkc29fdGVzdC5jIHBhcnNlX3Zkc28uYyAtbyB2ZHNvX3Rlc3QKKyAqIHRvIGdlbmVyYXRlIGEgc21hbGwgYmluYXJ5IHdpdGggbm8gZGVwZW5kZW5jaWVzIGF0IGFsbC4KKyAqLworCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitleHRlcm4gdm9pZCAqdmRzb19zeW0oY29uc3QgY2hhciAqdmVyc2lvbiwgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCB2ZHNvX2luaXRfZnJvbV9zeXNpbmZvX2VoZHIodWludHB0cl90IGJhc2UpOworZXh0ZXJuIHZvaWQgdmRzb19pbml0X2Zyb21fYXV4dih2b2lkICphdXh2KTsKKworLyogV2UgbmVlZCBhIGxpYmMgZnVuY3Rpb25zLi4uICovCitpbnQgc3RyY21wKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCit7CisJLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBidWdneTogaXQgbmV2ZXIgcmV0dXJucyAtMS4gKi8KKwl3aGlsZSAoKmEgfHwgKmIpIHsKKwkJaWYgKCphICE9ICpiKQorCQkJcmV0dXJuIDE7CisJCWlmICgqYSA9PSAwIHx8ICpiID09IDApCisJCQlyZXR1cm4gMTsKKwkJYSsrOworCQliKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIC4uLmFuZCB0d28gc3lzY2FsbHMuICBUaGlzIGlzIHg4Nl82NC1zcGVjaWZpYy4gKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBsaW51eF93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisKKwlsb25nIHJldDsKKwlhc20gdm9sYXRpbGUgKCJzeXNjYWxsIiA6ICI9YSIgKHJldCkgOiAiYSIgKF9fTlJfd3JpdGUpLAorCQkgICAgICAiRCIgKGZkKSwgIlMiIChkYXRhKSwgImQiIChsZW4pIDoKKwkJICAgICAgImNjIiwgIm1lbW9yeSIsICJyY3giLAorCQkgICAgICAicjgiLCAicjkiLCAicjEwIiwgInIxMSIgKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGludXhfZXhpdChpbnQgY29kZSkKK3sKKwlhc20gdm9sYXRpbGUgKCJzeXNjYWxsIiA6IDogImEiIChfX05SX2V4aXQpLCAiRCIgKGNvZGUpKTsKK30KKwordm9pZCB0b19iYXNlMTAoY2hhciAqbGFzdGRpZywgdWludDY0X3QgbikKK3sKKwl3aGlsZSAobikgeworCQkqbGFzdGRpZyA9IChuICUgMTApICsgJzAnOworCQluIC89IDEwOworCQlsYXN0ZGlnLS07CisJfQorfQorCitfX2F0dHJpYnV0ZV9fKChleHRlcm5hbGx5X3Zpc2libGUpKSB2b2lkIGNfbWFpbih2b2lkICoqc3RhY2spCit7CisJLyogUGFyc2UgdGhlIHN0YWNrICovCisJbG9uZyBhcmdjID0gKGxvbmcpKnN0YWNrOworCXN0YWNrICs9IGFyZ2MgKyAyOworCisJLyogTm93IHdlJ3JlIHBvaW50aW5nIGF0IHRoZSBlbnZpcm9ubWVudC4gIFNraXAgaXQuICovCisJd2hpbGUoKnN0YWNrKQorCQlzdGFjaysrOworCXN0YWNrKys7CisKKwkvKiBOb3cgd2UncmUgcG9pbnRpbmcgYXQgYXV4di4gIEluaXRpYWxpemUgdGhlIHZEU08gcGFyc2VyLiAqLworCXZkc29faW5pdF9mcm9tX2F1eHYoKHZvaWQgKilzdGFjayk7CisKKwkvKiBGaW5kIGdldHRpbWVvZmRheS4gKi8KKwl0eXBlZGVmIGxvbmcgKCpndG9kX3QpKHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IHRpbWV6b25lICp0eik7CisJZ3RvZF90IGd0b2QgPSAoZ3RvZF90KXZkc29fc3ltKCJMSU5VWF8yLjYiLCAiX192ZHNvX2dldHRpbWVvZmRheSIpOworCisJaWYgKCFndG9kKQorCQlsaW51eF9leGl0KDEpOworCisJc3RydWN0IHRpbWV2YWwgdHY7CisJbG9uZyByZXQgPSBndG9kKCZ0diwgMCk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJY2hhciBidWZbXSA9ICJUaGUgdGltZSBpcyAgICAgICAgICAgICAgICAgICAgIC4wMDAwMDBcbiI7CisJCXRvX2Jhc2UxMChidWYgKyAzMSwgdHYudHZfc2VjKTsKKwkJdG9fYmFzZTEwKGJ1ZiArIDM4LCB0di50dl91c2VjKTsKKwkJbGludXhfd3JpdGUoMSwgYnVmLCBzaXplb2YoYnVmKSAtIDEpOworCX0gZWxzZSB7CisJCWxpbnV4X2V4aXQocmV0KTsKKwl9CisKKwlsaW51eF9leGl0KDApOworfQorCisvKgorICogVGhpcyBpcyB0aGUgcmVhbCBlbnRyeSBwb2ludC4gIEl0IHBhc3NlcyB0aGUgaW5pdGlhbCBzdGFjayBpbnRvCisgKiB0aGUgQyBlbnRyeSBwb2ludC4KKyAqLworYXNtICgKKwkiLnRleHRcbiIKKwkiLmdsb2JhbCBfc3RhcnRcbiIKKyAgICAgICAgIi50eXBlIF9zdGFydCxAZnVuY3Rpb25cbiIKKyAgICAgICAgIl9zdGFydDpcblx0IgorICAgICAgICAibW92ICVyc3AsJXJkaVxuXHQiCisgICAgICAgICJqbXAgY19tYWluIgorCSk7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2FwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2FwaS50eHQKaW5kZXggNDI1NDJlYi4uYjBlNGI5YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9hcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dApAQCAtMTgwLDYgKzE4MCwxOSBAQAogSWYgdGhlIEtWTV9DQVBfTlJfVkNQVVMgZG9lcyBub3QgZXhpc3QsIHlvdSBzaG91bGQgYXNzdW1lIHRoYXQgbWF4X3ZjcHVzIGlzIDQKIGNwdXMgbWF4LgogCitPbiBwb3dlcnBjIHVzaW5nIGJvb2szc19odiBtb2RlLCB0aGUgdmNwdXMgYXJlIG1hcHBlZCBvbnRvIHZpcnR1YWwKK3RocmVhZHMgaW4gb25lIG9yIG1vcmUgdmlydHVhbCBDUFUgY29yZXMuICAoVGhpcyBpcyBiZWNhdXNlIHRoZQoraGFyZHdhcmUgcmVxdWlyZXMgYWxsIHRoZSBoYXJkd2FyZSB0aHJlYWRzIGluIGEgQ1BVIGNvcmUgdG8gYmUgaW4gdGhlCitzYW1lIHBhcnRpdGlvbi4pICBUaGUgS1ZNX0NBUF9QUENfU01UIGNhcGFiaWxpdHkgaW5kaWNhdGVzIHRoZSBudW1iZXIKK29mIHZjcHVzIHBlciB2aXJ0dWFsIGNvcmUgKHZjb3JlKS4gIFRoZSB2Y29yZSBpZCBpcyBvYnRhaW5lZCBieQorZGl2aWRpbmcgdGhlIHZjcHUgaWQgYnkgdGhlIG51bWJlciBvZiB2Y3B1cyBwZXIgdmNvcmUuICBUaGUgdmNwdXMgaW4gYQorZ2l2ZW4gdmNvcmUgd2lsbCBhbHdheXMgYmUgaW4gdGhlIHNhbWUgcGh5c2ljYWwgY29yZSBhcyBlYWNoIG90aGVyCisodGhvdWdoIHRoYXQgbWlnaHQgYmUgYSBkaWZmZXJlbnQgcGh5c2ljYWwgY29yZSBmcm9tIHRpbWUgdG8gdGltZSkuCitVc2Vyc3BhY2UgY2FuIGNvbnRyb2wgdGhlIHRocmVhZGluZyAoU01UKSBtb2RlIG9mIHRoZSBndWVzdCBieSBpdHMKK2FsbG9jYXRpb24gb2YgdmNwdSBpZHMuICBGb3IgZXhhbXBsZSwgaWYgdXNlcnNwYWNlIHdhbnRzCitzaW5nbGUtdGhyZWFkZWQgZ3Vlc3QgdmNwdXMsIGl0IHNob3VsZCBtYWtlIGFsbCB2Y3B1IGlkcyBiZSBhIG11bHRpcGxlCitvZiB0aGUgbnVtYmVyIG9mIHZjcHVzIHBlciB2Y29yZS4KKwogNC44IEtWTV9HRVRfRElSVFlfTE9HICh2bSBpb2N0bCkKIAogQ2FwYWJpbGl0eTogYmFzaWMKQEAgLTExNDMsMTUgKzExNTYsMTAgQEAKIAogc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEgewogCV9fdTMyIGFzc2lnbmVkX2Rldl9pZDsKLQlfX3UzMiBob3N0X2lycTsKKwlfX3UzMiBob3N0X2lycTsgLyogaWdub3JlZCAobGVnYWN5IGZpZWxkKSAqLwogCV9fdTMyIGd1ZXN0X2lycTsKIAlfX3UzMiBmbGFnczsKIAl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX3UzMiBhZGRyX2xvOwotCQkJX191MzIgYWRkcl9oaTsKLQkJCV9fdTMyIGRhdGE7Ci0JCX0gZ3Vlc3RfbXNpOwogCQlfX3UzMiByZXNlcnZlZFsxMl07CiAJfTsKIH07CkBAIC0xMjM5LDggKzEyNDcsMTAgQEAKIFBhcmFtZXRlcnM6IHN0cnVjdCBrdm1fYXNzaWduZWRfbXNpeF9uciAoaW4pCiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCiAKLVNldCB0aGUgbnVtYmVyIG9mIE1TSS1YIGludGVycnVwdHMgZm9yIGFuIGFzc2lnbmVkIGRldmljZS4gVGhpcyBzZXJ2aWNlIGNhbgotb25seSBiZSBjYWxsZWQgb25jZSBpbiB0aGUgbGlmZXRpbWUgb2YgYW4gYXNzaWduZWQgZGV2aWNlLgorU2V0IHRoZSBudW1iZXIgb2YgTVNJLVggaW50ZXJydXB0cyBmb3IgYW4gYXNzaWduZWQgZGV2aWNlLiBUaGUgbnVtYmVyIGlzCityZXNldCBhZ2FpbiBieSB0ZXJtaW5hdGluZyB0aGUgTVNJLVggYXNzaWdubWVudCBvZiB0aGUgZGV2aWNlIHZpYQorS1ZNX0RFQVNTSUdOX0RFVl9JUlEuIENhbGxpbmcgdGhpcyBzZXJ2aWNlIG1vcmUgdGhhbiBvbmNlIGF0IGFueSBlYXJsaWVyCitwb2ludCB3aWxsIGZhaWwuCiAKIHN0cnVjdCBrdm1fYXNzaWduZWRfbXNpeF9uciB7CiAJX191MzIgYXNzaWduZWRfZGV2X2lkOwpAQCAtMTI5MSw2ICsxMzAxLDEzNSBAQAogS0h6LiBJZiB0aGUgaG9zdCBoYXMgdW5zdGFibGUgdHNjIHRoaXMgaW9jdGwgcmV0dXJucyAtRUlPIGluc3RlYWQgYXMgYW4KIGVycm9yLgogCis0LjU2IEtWTV9HRVRfTEFQSUMKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9JUlFDSElQCitBcmNoaXRlY3R1cmVzOiB4ODYKK1R5cGU6IHZjcHUgaW9jdGwKK1BhcmFtZXRlcnM6IHN0cnVjdCBrdm1fbGFwaWNfc3RhdGUgKG91dCkKK1JldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKworI2RlZmluZSBLVk1fQVBJQ19SRUdfU0laRSAweDQwMAorc3RydWN0IGt2bV9sYXBpY19zdGF0ZSB7CisJY2hhciByZWdzW0tWTV9BUElDX1JFR19TSVpFXTsKK307CisKK1JlYWRzIHRoZSBMb2NhbCBBUElDIHJlZ2lzdGVycyBhbmQgY29waWVzIHRoZW0gaW50byB0aGUgaW5wdXQgYXJndW1lbnQuICBUaGUKK2RhdGEgZm9ybWF0IGFuZCBsYXlvdXQgYXJlIHRoZSBzYW1lIGFzIGRvY3VtZW50ZWQgaW4gdGhlIGFyY2hpdGVjdHVyZSBtYW51YWwuCisKKzQuNTcgS1ZNX1NFVF9MQVBJQworCitDYXBhYmlsaXR5OiBLVk1fQ0FQX0lSUUNISVAKK0FyY2hpdGVjdHVyZXM6IHg4NgorVHlwZTogdmNwdSBpb2N0bAorUGFyYW1ldGVyczogc3RydWN0IGt2bV9sYXBpY19zdGF0ZSAoaW4pCitSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisKKyNkZWZpbmUgS1ZNX0FQSUNfUkVHX1NJWkUgMHg0MDAKK3N0cnVjdCBrdm1fbGFwaWNfc3RhdGUgeworCWNoYXIgcmVnc1tLVk1fQVBJQ19SRUdfU0laRV07Cit9OworCitDb3BpZXMgdGhlIGlucHV0IGFyZ3VtZW50IGludG8gdGhlIHRoZSBMb2NhbCBBUElDIHJlZ2lzdGVycy4gIFRoZSBkYXRhIGZvcm1hdAorYW5kIGxheW91dCBhcmUgdGhlIHNhbWUgYXMgZG9jdW1lbnRlZCBpbiB0aGUgYXJjaGl0ZWN0dXJlIG1hbnVhbC4KKworNC41OCBLVk1fSU9FVkVOVEZECisKK0NhcGFiaWxpdHk6IEtWTV9DQVBfSU9FVkVOVEZECitBcmNoaXRlY3R1cmVzOiBhbGwKK1R5cGU6IHZtIGlvY3RsCitQYXJhbWV0ZXJzOiBzdHJ1Y3Qga3ZtX2lvZXZlbnRmZCAoaW4pCitSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsICEwIG9uIGVycm9yCisKK1RoaXMgaW9jdGwgYXR0YWNoZXMgb3IgZGV0YWNoZXMgYW4gaW9ldmVudGZkIHRvIGEgbGVnYWwgcGlvL21taW8gYWRkcmVzcword2l0aGluIHRoZSBndWVzdC4gIEEgZ3Vlc3Qgd3JpdGUgaW4gdGhlIHJlZ2lzdGVyZWQgYWRkcmVzcyB3aWxsIHNpZ25hbCB0aGUKK3Byb3ZpZGVkIGV2ZW50IGluc3RlYWQgb2YgdHJpZ2dlcmluZyBhbiBleGl0LgorCitzdHJ1Y3Qga3ZtX2lvZXZlbnRmZCB7CisJX191NjQgZGF0YW1hdGNoOworCV9fdTY0IGFkZHI7ICAgICAgICAvKiBsZWdhbCBwaW8vbW1pbyBhZGRyZXNzICovCisJX191MzIgbGVuOyAgICAgICAgIC8qIDEsIDIsIDQsIG9yIDggYnl0ZXMgICAgKi8KKwlfX3MzMiBmZDsKKwlfX3UzMiBmbGFnczsKKwlfX3U4ICBwYWRbMzZdOworfTsKKworVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgZGVmaW5lZDoKKworI2RlZmluZSBLVk1fSU9FVkVOVEZEX0ZMQUdfREFUQU1BVENIICgxIDw8IGt2bV9pb2V2ZW50ZmRfZmxhZ19ucl9kYXRhbWF0Y2gpCisjZGVmaW5lIEtWTV9JT0VWRU5URkRfRkxBR19QSU8gICAgICAgKDEgPDwga3ZtX2lvZXZlbnRmZF9mbGFnX25yX3BpbykKKyNkZWZpbmUgS1ZNX0lPRVZFTlRGRF9GTEFHX0RFQVNTSUdOICAoMSA8PCBrdm1faW9ldmVudGZkX2ZsYWdfbnJfZGVhc3NpZ24pCisKK0lmIGRhdGFtYXRjaCBmbGFnIGlzIHNldCwgdGhlIGV2ZW50IHdpbGwgYmUgc2lnbmFsZWQgb25seSBpZiB0aGUgd3JpdHRlbiB2YWx1ZQordG8gdGhlIHJlZ2lzdGVyZWQgYWRkcmVzcyBpcyBlcXVhbCB0byBkYXRhbWF0Y2ggaW4gc3RydWN0IGt2bV9pb2V2ZW50ZmQuCisKKzQuNjIgS1ZNX0NSRUFURV9TUEFQUl9UQ0UKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9TUEFQUl9UQ0UKK0FyY2hpdGVjdHVyZXM6IHBvd2VycGMKK1R5cGU6IHZtIGlvY3RsCitQYXJhbWV0ZXJzOiBzdHJ1Y3Qga3ZtX2NyZWF0ZV9zcGFwcl90Y2UgKGluKQorUmV0dXJuczogZmlsZSBkZXNjcmlwdG9yIGZvciBtYW5pcHVsYXRpbmcgdGhlIGNyZWF0ZWQgVENFIHRhYmxlCisKK1RoaXMgY3JlYXRlcyBhIHZpcnR1YWwgVENFICh0cmFuc2xhdGlvbiBjb250cm9sIGVudHJ5KSB0YWJsZSwgd2hpY2gKK2lzIGFuIElPTU1VIGZvciBQQVBSLXN0eWxlIHZpcnR1YWwgSS9PLiAgSXQgaXMgdXNlZCB0byB0cmFuc2xhdGUKK2xvZ2ljYWwgYWRkcmVzc2VzIHVzZWQgaW4gdmlydHVhbCBJL08gaW50byBndWVzdCBwaHlzaWNhbCBhZGRyZXNzZXMsCithbmQgcHJvdmlkZXMgYSBzY2F0dGVyL2dhdGhlciBjYXBhYmlsaXR5IGZvciBQQVBSIHZpcnR1YWwgSS9PLgorCisvKiBmb3IgS1ZNX0NBUF9TUEFQUl9UQ0UgKi8KK3N0cnVjdCBrdm1fY3JlYXRlX3NwYXByX3RjZSB7CisJX191NjQgbGlvYm47CisJX191MzIgd2luZG93X3NpemU7Cit9OworCitUaGUgbGlvYm4gZmllbGQgZ2l2ZXMgdGhlIGxvZ2ljYWwgSU8gYnVzIG51bWJlciBmb3Igd2hpY2ggdG8gY3JlYXRlIGEKK1RDRSB0YWJsZS4gIFRoZSB3aW5kb3dfc2l6ZSBmaWVsZCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIERNQSB3aW5kb3cKK3doaWNoIHRoaXMgVENFIHRhYmxlIHdpbGwgdHJhbnNsYXRlIC0gdGhlIHRhYmxlIHdpbGwgY29udGFpbiBvbmUgNjQKK2JpdCBUQ0UgZW50cnkgZm9yIGV2ZXJ5IDRraUIgb2YgdGhlIERNQSB3aW5kb3cuCisKK1doZW4gdGhlIGd1ZXN0IGlzc3VlcyBhbiBIX1BVVF9UQ0UgaGNhbGwgb24gYSBsaW9ibiBmb3Igd2hpY2ggYSBUQ0UKK3RhYmxlIGhhcyBiZWVuIGNyZWF0ZWQgdXNpbmcgdGhpcyBpb2N0bCgpLCB0aGUga2VybmVsIHdpbGwgaGFuZGxlIGl0CitpbiByZWFsIG1vZGUsIHVwZGF0aW5nIHRoZSBUQ0UgdGFibGUuICBIX1BVVF9UQ0UgY2FsbHMgZm9yIG90aGVyCitsaW9ibnMgd2lsbCBjYXVzZSBhIHZtIGV4aXQgYW5kIG11c3QgYmUgaGFuZGxlZCBieSB1c2Vyc3BhY2UuCisKK1RoZSByZXR1cm4gdmFsdWUgaXMgYSBmaWxlIGRlc2NyaXB0b3Igd2hpY2ggY2FuIGJlIHBhc3NlZCB0byBtbWFwKDIpCit0byBtYXAgdGhlIGNyZWF0ZWQgVENFIHRhYmxlIGludG8gdXNlcnNwYWNlLiAgVGhpcyBsZXRzIHVzZXJzcGFjZSByZWFkCit0aGUgZW50cmllcyB3cml0dGVuIGJ5IGtlcm5lbC1oYW5kbGVkIEhfUFVUX1RDRSBjYWxscywgYW5kIGFsc28gbGV0cwordXNlcnNwYWNlIHVwZGF0ZSB0aGUgVENFIHRhYmxlIGRpcmVjdGx5IHdoaWNoIGlzIHVzZWZ1bCBpbiBzb21lCitjaXJjdW1zdGFuY2VzLgorCis0LjYzIEtWTV9BTExPQ0FURV9STUEKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9QUENfUk1BCitBcmNoaXRlY3R1cmVzOiBwb3dlcnBjCitUeXBlOiB2bSBpb2N0bAorUGFyYW1ldGVyczogc3RydWN0IGt2bV9hbGxvY2F0ZV9ybWEgKG91dCkKK1JldHVybnM6IGZpbGUgZGVzY3JpcHRvciBmb3IgbWFwcGluZyB0aGUgYWxsb2NhdGVkIFJNQQorCitUaGlzIGFsbG9jYXRlcyBhIFJlYWwgTW9kZSBBcmVhIChSTUEpIGZyb20gdGhlIHBvb2wgYWxsb2NhdGVkIGF0IGJvb3QKK3RpbWUgYnkgdGhlIGtlcm5lbC4gIEFuIFJNQSBpcyBhIHBoeXNpY2FsbHktY29udGlndW91cywgYWxpZ25lZCByZWdpb24KK29mIG1lbW9yeSB1c2VkIG9uIG9sZGVyIFBPV0VSIHByb2Nlc3NvcnMgdG8gcHJvdmlkZSB0aGUgbWVtb3J5IHdoaWNoCit3aWxsIGJlIGFjY2Vzc2VkIGJ5IHJlYWwtbW9kZSAoTU1VIG9mZikgYWNjZXNzZXMgaW4gYSBLVk0gZ3Vlc3QuCitQT1dFUiBwcm9jZXNzb3JzIHN1cHBvcnQgYSBzZXQgb2Ygc2l6ZXMgZm9yIHRoZSBSTUEgdGhhdCB1c3VhbGx5CitpbmNsdWRlcyA2NE1CLCAxMjhNQiwgMjU2TUIgYW5kIHNvbWUgbGFyZ2VyIHBvd2VycyBvZiB0d28uCisKKy8qIGZvciBLVk1fQUxMT0NBVEVfUk1BICovCitzdHJ1Y3Qga3ZtX2FsbG9jYXRlX3JtYSB7CisJX191NjQgcm1hX3NpemU7Cit9OworCitUaGUgcmV0dXJuIHZhbHVlIGlzIGEgZmlsZSBkZXNjcmlwdG9yIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8gbW1hcCgyKQordG8gbWFwIHRoZSBhbGxvY2F0ZWQgUk1BIGludG8gdXNlcnNwYWNlLiAgVGhlIG1hcHBlZCBhcmVhIGNhbiB0aGVuIGJlCitwYXNzZWQgdG8gdGhlIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OIGlvY3RsIHRvIGVzdGFibGlzaCBpdCBhcyB0aGUKK1JNQSBmb3IgYSB2aXJ0dWFsIG1hY2hpbmUuICBUaGUgc2l6ZSBvZiB0aGUgUk1BIGluIGJ5dGVzICh3aGljaCBpcworZml4ZWQgYXQgaG9zdCBrZXJuZWwgYm9vdCB0aW1lKSBpcyByZXR1cm5lZCBpbiB0aGUgcm1hX3NpemUgZmllbGQgb2YKK3RoZSBhcmd1bWVudCBzdHJ1Y3R1cmUuCisKK1RoZSBLVk1fQ0FQX1BQQ19STUEgY2FwYWJpbGl0eSBpcyAxIG9yIDIgaWYgdGhlIEtWTV9BTExPQ0FURV9STUEgaW9jdGwKK2lzIHN1cHBvcnRlZDsgMiBpZiB0aGUgcHJvY2Vzc29yIHJlcXVpcmVzIGFsbCB2aXJ0dWFsIG1hY2hpbmVzIHRvIGhhdmUKK2FuIFJNQSwgb3IgMSBpZiB0aGUgcHJvY2Vzc29yIGNhbiB1c2UgYW4gUk1BIGJ1dCBkb2Vzbid0IHJlcXVpcmUgaXQsCitiZWNhdXNlIGl0IHN1cHBvcnRzIHRoZSBWaXJ0dWFsIFJNQSAoVlJNQSkgZmFjaWxpdHkuCisKIDUuIFRoZSBrdm1fcnVuIHN0cnVjdHVyZQogCiBBcHBsaWNhdGlvbiBjb2RlIG9idGFpbnMgYSBwb2ludGVyIHRvIHRoZSBrdm1fcnVuIHN0cnVjdHVyZSBieQpAQCAtMTQ3Myw2ICsxNjEyLDIzIEBACiBuZWNlc3NhcnkuIFVwb24gZ3Vlc3QgZW50cnkgYWxsIGd1ZXN0IEdQUnMgd2lsbCB0aGVuIGJlIHJlcGxhY2VkIGJ5IHRoZSB2YWx1ZXMKIGluIHRoaXMgc3RydWN0LgogCisJCS8qIEtWTV9FWElUX1BBUFJfSENBTEwgKi8KKwkJc3RydWN0IHsKKwkJCV9fdTY0IG5yOworCQkJX191NjQgcmV0OworCQkJX191NjQgYXJnc1s5XTsKKwkJfSBwYXByX2hjYWxsOworCitUaGlzIGlzIHVzZWQgb24gNjQtYml0IFBvd2VyUEMgd2hlbiBlbXVsYXRpbmcgYSBwU2VyaWVzIHBhcnRpdGlvbiwKK2UuZy4gd2l0aCB0aGUgJ3BzZXJpZXMnIG1hY2hpbmUgdHlwZSBpbiBxZW11LiAgSXQgb2NjdXJzIHdoZW4gdGhlCitndWVzdCBkb2VzIGEgaHlwZXJjYWxsIHVzaW5nIHRoZSAnc2MgMScgaW5zdHJ1Y3Rpb24uICBUaGUgJ25yJyBmaWVsZAorY29udGFpbnMgdGhlIGh5cGVyY2FsbCBudW1iZXIgKGZyb20gdGhlIGd1ZXN0IFIzKSwgYW5kICdhcmdzJyBjb250YWlucwordGhlIGFyZ3VtZW50cyAoZnJvbSB0aGUgZ3Vlc3QgUjQgLSBSMTIpLiAgVXNlcnNwYWNlIHNob3VsZCBwdXQgdGhlCityZXR1cm4gY29kZSBpbiAncmV0JyBhbmQgYW55IGV4dHJhIHJldHVybmVkIHZhbHVlcyBpbiBhcmdzW10uCitUaGUgcG9zc2libGUgaHlwZXJjYWxscyBhcmUgZGVmaW5lZCBpbiB0aGUgUG93ZXIgQXJjaGl0ZWN0dXJlIFBsYXRmb3JtCitSZXF1aXJlbWVudHMgKFBBUFIpIGRvY3VtZW50IGF2YWlsYWJsZSBmcm9tIHd3dy5wb3dlci5vcmcgKGZyZWUKK2RldmVsb3BlciByZWdpc3RyYXRpb24gcmVxdWlyZWQgdG8gYWNjZXNzIGl0KS4KKwogCQkvKiBGaXggdGhlIHNpemUgb2YgdGhlIHVuaW9uLiAqLwogCQljaGFyIHBhZGRpbmdbMjU2XTsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9tbXUudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9tbXUudHh0CmluZGV4IGY0NmFhNTguLjVkYzk3MmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vbW11LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL21tdS50eHQKQEAgLTE2NSw2ICsxNjUsMTAgQEAKICAgICBDb250YWlucyB0aGUgdmFsdWUgb2YgZWZlci5ueGUgZm9yIHdoaWNoIHRoZSBwYWdlIGlzIHZhbGlkLgogICByb2xlLmNyMF93cDoKICAgICBDb250YWlucyB0aGUgdmFsdWUgb2YgY3IwLndwIGZvciB3aGljaCB0aGUgcGFnZSBpcyB2YWxpZC4KKyAgcm9sZS5zbWVwX2FuZG5vdF93cDoKKyAgICBDb250YWlucyB0aGUgdmFsdWUgb2YgY3I0LnNtZXAgJiYgIWNyMC53cCBmb3Igd2hpY2ggdGhlIHBhZ2UgaXMgdmFsaWQKKyAgICAocGFnZXMgZm9yIHdoaWNoIHRoaXMgaXMgdHJ1ZSBhcmUgZGlmZmVyZW50IGZyb20gb3RoZXIgcGFnZXM7IHNlZSB0aGUKKyAgICB0cmVhdG1lbnQgb2YgY3IwLndwPTAgYmVsb3cpLgogICBnZm46CiAgICAgRWl0aGVyIHRoZSBndWVzdCBwYWdlIHRhYmxlIGNvbnRhaW5pbmcgdGhlIHRyYW5zbGF0aW9ucyBzaGFkb3dlZCBieSB0aGlzCiAgICAgcGFnZSwgb3IgdGhlIGJhc2UgcGFnZSBmcmFtZSBmb3IgbGluZWFyIHRyYW5zbGF0aW9ucy4gIFNlZSByb2xlLmRpcmVjdC4KQEAgLTMxNyw2ICszMjEsMjAgQEAKIAogKHVzZXIgd3JpdGUgZmF1bHRzIGdlbmVyYXRlIGEgI1BGKQogCitJbiB0aGUgZmlyc3QgY2FzZSB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbiBpZiBDUjQuU01FUCBpcworZW5hYmxlZDogc2luY2Ugd2UndmUgdHVybmVkIHRoZSBwYWdlIGludG8gYSBrZXJuZWwgcGFnZSwgdGhlIGtlcm5lbCBtYXkgbm93CitleGVjdXRlIGl0LiAgV2UgaGFuZGxlIHRoaXMgYnkgYWxzbyBzZXR0aW5nIHNwdGUubnguICBJZiB3ZSBnZXQgYSB1c2VyCitmZXRjaCBvciByZWFkIGZhdWx0LCB3ZSdsbCBjaGFuZ2Ugc3B0ZS51PTEgYW5kIHNwdGUubng9Z3B0ZS5ueCBiYWNrLgorCitUbyBwcmV2ZW50IGFuIHNwdGUgdGhhdCB3YXMgY29udmVydGVkIGludG8gYSBrZXJuZWwgcGFnZSB3aXRoIGNyMC53cD0wCitmcm9tIGJlaW5nIHdyaXR0ZW4gYnkgdGhlIGtlcm5lbCBhZnRlciBjcjAud3AgaGFzIGNoYW5nZWQgdG8gMSwgd2UgbWFrZQordGhlIHZhbHVlIG9mIGNyMC53cCBwYXJ0IG9mIHRoZSBwYWdlIHJvbGUuICBUaGlzIG1lYW5zIHRoYXQgYW4gc3B0ZSBjcmVhdGVkCit3aXRoIG9uZSB2YWx1ZSBvZiBjcjAud3AgY2Fubm90IGJlIHVzZWQgd2hlbiBjcjAud3AgaGFzIGEgZGlmZmVyZW50IHZhbHVlIC0KK2l0IHdpbGwgc2ltcGx5IGJlIG1pc3NlZCBieSB0aGUgc2hhZG93IHBhZ2UgbG9va3VwIGNvZGUuICBBIHNpbWlsYXIgaXNzdWUKK2V4aXN0cyB3aGVuIGFuIHNwdGUgY3JlYXRlZCB3aXRoIGNyMC53cD0wIGFuZCBjcjQuc21lcD0wIGlzIHVzZWQgYWZ0ZXIKK2NoYW5naW5nIGNyNC5zbWVwIHRvIDEuICBUbyBhdm9pZCB0aGlzLCB0aGUgdmFsdWUgb2YgIWNyMC53cCAmJiBjcjQuc21lcAoraXMgYWxzbyBtYWRlIGEgcGFydCBvZiB0aGUgcGFnZSByb2xlLgorCiBMYXJnZSBwYWdlcwogPT09PT09PT09PT0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9tc3IudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9tc3IudHh0CmluZGV4IGQwNzlhZWQuLjUwMzE3ODAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vbXNyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL21zci50eHQKQEAgLTE4NSwzICsxODUsMzcgQEAKIAogCUN1cnJlbnRseSB0eXBlIDIgQVBGIHdpbGwgYmUgYWx3YXlzIGRlbGl2ZXJlZCBvbiB0aGUgc2FtZSB2Y3B1IGFzCiAJdHlwZSAxIHdhcywgYnV0IGd1ZXN0IHNob3VsZCBub3QgcmVseSBvbiB0aGF0LgorCitNU1JfS1ZNX1NURUFMX1RJTUU6IDB4NGI1NjRkMDMKKworCWRhdGE6IDY0LWJ5dGUgYWxpZ25tZW50IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBtZW1vcnkgYXJlYSB3aGljaCBtdXN0IGJlCisJaW4gZ3Vlc3QgUkFNLCBwbHVzIGFuIGVuYWJsZSBiaXQgaW4gYml0IDAuIFRoaXMgbWVtb3J5IGlzIGV4cGVjdGVkIHRvCisJaG9sZCBhIGNvcHkgb2YgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKKwlzdHJ1Y3Qga3ZtX3N0ZWFsX3RpbWUgeworCQlfX3U2NCBzdGVhbDsKKwkJX191MzIgdmVyc2lvbjsKKwkJX191MzIgZmxhZ3M7CisJCV9fdTMyIHBhZFsxMl07CisJfQorCisJd2hvc2UgZGF0YSB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGUgaHlwZXJ2aXNvciBwZXJpb2RpY2FsbHkuIE9ubHkgb25lCisJd3JpdGUsIG9yIHJlZ2lzdHJhdGlvbiwgaXMgbmVlZGVkIGZvciBlYWNoIFZDUFUuIFRoZSBpbnRlcnZhbCBiZXR3ZWVuCisJdXBkYXRlcyBvZiB0aGlzIHN0cnVjdHVyZSBpcyBhcmJpdHJhcnkgYW5kIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4KKwlUaGUgaHlwZXJ2aXNvciBtYXkgdXBkYXRlIHRoaXMgc3RydWN0dXJlIGF0IGFueSB0aW1lIGl0IHNlZXMgZml0IHVudGlsCisJYW55dGhpbmcgd2l0aCBiaXQwID09IDAgaXMgd3JpdHRlbiB0byBpdC4gR3Vlc3QgaXMgcmVxdWlyZWQgdG8gbWFrZSBzdXJlCisJdGhpcyBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQgdG8gemVyby4KKworCUZpZWxkcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6CisKKwkJdmVyc2lvbjogYSBzZXF1ZW5jZSBjb3VudGVyLiBJbiBvdGhlciB3b3JkcywgZ3Vlc3QgaGFzIHRvIGNoZWNrCisJCXRoaXMgZmllbGQgYmVmb3JlIGFuZCBhZnRlciBncmFiYmluZyB0aW1lIGluZm9ybWF0aW9uIGFuZCBtYWtlCisJCXN1cmUgdGhleSBhcmUgYm90aCBlcXVhbCBhbmQgZXZlbi4gQW4gb2RkIHZlcnNpb24gaW5kaWNhdGVzIGFuCisJCWluLXByb2dyZXNzIHVwZGF0ZS4KKworCQlmbGFnczogQXQgdGhpcyBwb2ludCwgYWx3YXlzIHplcm8uIE1heSBiZSB1c2VkIHRvIGluZGljYXRlCisJCWNoYW5nZXMgaW4gdGhpcyBzdHJ1Y3R1cmUgaW4gdGhlIGZ1dHVyZS4KKworCQlzdGVhbDogdGhlIGFtb3VudCBvZiB0aW1lIGluIHdoaWNoIHRoaXMgdkNQVSBkaWQgbm90IHJ1biwgaW4KKwkJbmFub3NlY29uZHMuIFRpbWUgZHVyaW5nIHdoaWNoIHRoZSB2Y3B1IGlzIGlkbGUsIHdpbGwgbm90IGJlCisJCXJlcG9ydGVkIGFzIHN0ZWFsIHRpbWUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL25lc3RlZC12bXgudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9uZXN0ZWQtdm14LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQ5MzdkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9uZXN0ZWQtdm14LnR4dApAQCAtMCwwICsxLDI1MSBAQAorTmVzdGVkIFZNWAorPT09PT09PT09PQorCitPdmVydmlldworLS0tLS0tLS0tCisKK09uIEludGVsIHByb2Nlc3NvcnMsIEtWTSB1c2VzIEludGVsJ3MgVk1YIChWaXJ0dWFsLU1hY2hpbmUgZVh0ZW5zaW9ucykKK3RvIGVhc2lseSBhbmQgZWZmaWNpZW50bHkgcnVuIGd1ZXN0IG9wZXJhdGluZyBzeXN0ZW1zLiBOb3JtYWxseSwgdGhlc2UgZ3Vlc3RzCisqY2Fubm90KiB0aGVtc2VsdmVzIGJlIGh5cGVydmlzb3JzIHJ1bm5pbmcgdGhlaXIgb3duIGd1ZXN0cywgYmVjYXVzZSBpbiBWTVgsCitndWVzdHMgY2Fubm90IHVzZSBWTVggaW5zdHJ1Y3Rpb25zLgorCitUaGUgIk5lc3RlZCBWTVgiIGZlYXR1cmUgYWRkcyB0aGlzIG1pc3NpbmcgY2FwYWJpbGl0eSAtIG9mIHJ1bm5pbmcgZ3Vlc3QKK2h5cGVydmlzb3JzICh3aGljaCB1c2UgVk1YKSB3aXRoIHRoZWlyIG93biBuZXN0ZWQgZ3Vlc3RzLiBJdCBkb2VzIHNvIGJ5CithbGxvd2luZyBhIGd1ZXN0IHRvIHVzZSBWTVggaW5zdHJ1Y3Rpb25zLCBhbmQgY29ycmVjdGx5IGFuZCBlZmZpY2llbnRseQorZW11bGF0aW5nIHRoZW0gdXNpbmcgdGhlIHNpbmdsZSBsZXZlbCBvZiBWTVggYXZhaWxhYmxlIGluIHRoZSBoYXJkd2FyZS4KKworV2UgZGVzY3JpYmUgaW4gbXVjaCBncmVhdGVyIGRldGFpbCB0aGUgdGhlb3J5IGJlaGluZCB0aGUgbmVzdGVkIFZNWCBmZWF0dXJlLAoraXRzIGltcGxlbWVudGF0aW9uIGFuZCBpdHMgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzLCBpbiB0aGUgT1NESSAyMDEwIHBhcGVyCisiVGhlIFR1cnRsZXMgUHJvamVjdDogRGVzaWduIGFuZCBJbXBsZW1lbnRhdGlvbiBvZiBOZXN0ZWQgVmlydHVhbGl6YXRpb24iLAorYXZhaWxhYmxlIGF0OgorCisJaHR0cDovL3d3dy51c2VuaXgub3JnL2V2ZW50cy9vc2RpMTAvdGVjaC9mdWxsX3BhcGVycy9CZW4tWWVodWRhLnBkZgorCisKK1Rlcm1pbm9sb2d5CistLS0tLS0tLS0tLQorCitTaW5nbGUtbGV2ZWwgdmlydHVhbGl6YXRpb24gaGFzIHR3byBsZXZlbHMgLSB0aGUgaG9zdCAoS1ZNKSBhbmQgdGhlIGd1ZXN0cy4KK0luIG5lc3RlZCB2aXJ0dWFsaXphdGlvbiwgd2UgaGF2ZSB0aHJlZSBsZXZlbHM6IFRoZSBob3N0IChLVk0pLCB3aGljaCB3ZSBjYWxsCitMMCwgdGhlIGd1ZXN0IGh5cGVydmlzb3IsIHdoaWNoIHdlIGNhbGwgTDEsIGFuZCBpdHMgbmVzdGVkIGd1ZXN0LCB3aGljaCB3ZQorY2FsbCBMMi4KKworCitLbm93biBsaW1pdGF0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGN1cnJlbnQgY29kZSBzdXBwb3J0cyBydW5uaW5nIExpbnV4IGd1ZXN0cyB1bmRlciBLVk0gZ3Vlc3RzLgorT25seSA2NC1iaXQgZ3Vlc3QgaHlwZXJ2aXNvcnMgYXJlIHN1cHBvcnRlZC4KKworQWRkaXRpb25hbCBwYXRjaGVzIGZvciBydW5uaW5nIFdpbmRvd3MgdW5kZXIgZ3Vlc3QgS1ZNLCBhbmQgTGludXggdW5kZXIKK2d1ZXN0IFZNd2FyZSBzZXJ2ZXIsIGFuZCBzdXBwb3J0IGZvciBuZXN0ZWQgRVBULCBhcmUgY3VycmVudGx5IHJ1bm5pbmcgaW4KK3RoZSBsYWIsIGFuZCB3aWxsIGJlIHNlbnQgYXMgZm9sbG93LW9uIHBhdGNoc2V0cy4KKworCitSdW5uaW5nIG5lc3RlZCBWTVgKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbmVzdGVkIFZNWCBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuIEl0IGNhbiBiZSBlbmFibGVkIGJ5IGdpdmluZwordGhlICJuZXN0ZWQ9MSIgb3B0aW9uIHRvIHRoZSBrdm0taW50ZWwgbW9kdWxlLgorCitObyBtb2RpZmljYXRpb25zIGFyZSByZXF1aXJlZCB0byB1c2VyIHNwYWNlIChxZW11KS4gSG93ZXZlciwgcWVtdSdzIGRlZmF1bHQKK2VtdWxhdGVkIENQVSB0eXBlIChxZW11NjQpIGRvZXMgbm90IGxpc3QgdGhlICJWTVgiIENQVSBmZWF0dXJlLCBzbyBpdCBtdXN0IGJlCitleHBsaWNpdGx5IGVuYWJsZWQsIGJ5IGdpdmluZyBxZW11IG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKKyAgICAgLWNwdSBob3N0ICAgICAgICAgICAgICAoZW11bGF0ZWQgQ1BVIGhhcyBhbGwgZmVhdHVyZXMgb2YgdGhlIHJlYWwgQ1BVKQorCisgICAgIC1jcHUgcWVtdTY0LCt2bXggICAgICAgKGFkZCBqdXN0IHRoZSB2bXggZmVhdHVyZSB0byBhIG5hbWVkIENQVSB0eXBlKQorCisKK0FCSXMKKy0tLS0KKworTmVzdGVkIFZNWCBhaW1zIHRvIHByZXNlbnQgYSBzdGFuZGFyZCBhbmQgKGV2ZW50dWFsbHkpIGZ1bGx5LWZ1bmN0aW9uYWwgVk1YCitpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGEgZ3Vlc3QgaHlwZXJ2aXNvciB0byB1c2UuIEFzIHN1Y2gsIHRoZSBvZmZpY2lhbAorc3BlY2lmaWNhdGlvbiBvZiB0aGUgQUJJIHRoYXQgaXQgcHJvdmlkZXMgaXMgSW50ZWwncyBWTVggc3BlY2lmaWNhdGlvbiwKK25hbWVseSB2b2x1bWUgM0Igb2YgdGhlaXIgIkludGVsIDY0IGFuZCBJQS0zMiBBcmNoaXRlY3R1cmVzIFNvZnR3YXJlCitEZXZlbG9wZXIncyBNYW51YWwiLiBOb3QgYWxsIG9mIFZNWCdzIGZlYXR1cmVzIGFyZSBjdXJyZW50bHkgZnVsbHkgc3VwcG9ydGVkLAorYnV0IHRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgc3VwcG9ydCB0aGVtIGFsbCwgc3RhcnRpbmcgd2l0aCB0aGUgVk1YIGZlYXR1cmVzCit3aGljaCBhcmUgdXNlZCBpbiBwcmFjdGljZSBieSBwb3B1bGFyIGh5cGVydmlzb3JzIChLVk0gYW5kIG90aGVycykuCisKK0FzIGEgVk1YIGltcGxlbWVudGF0aW9uLCBuZXN0ZWQgVk1YIHByZXNlbnRzIGEgVk1DUyBzdHJ1Y3R1cmUgdG8gTDEuCitBcyBtYW5kYXRlZCBieSB0aGUgc3BlYywgb3RoZXIgdGhhbiB0aGUgdHdvIGZpZWxkcyByZXZpc2lvbl9pZCBhbmQgYWJvcnQsCit0aGlzIHN0cnVjdHVyZSBpcyAqb3BhcXVlKiB0byBpdHMgdXNlciwgd2hvIGlzIG5vdCBzdXBwb3NlZCB0byBrbm93IG9yIGNhcmUKK2Fib3V0IGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUuIFJhdGhlciwgdGhlIHN0cnVjdHVyZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZQorVk1SRUFEIGFuZCBWTVdSSVRFIGluc3RydWN0aW9ucy4KK1N0aWxsLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBLVk0gZGV2ZWxvcGVycyBtaWdodCBiZSBpbnRlcmVzdGVkIHRvIGtub3cgdGhlCitpbnRlcm5hbHMgb2YgdGhpcyBzdHJ1Y3R1cmU7IFRoaXMgaXMgc3RydWN0IHZtY3MxMiBmcm9tIGFyY2gveDg2L2t2bS92bXguYy4KKworVGhlIG5hbWUgInZtY3MxMiIgcmVmZXJzIHRvIHRoZSBWTUNTIHRoYXQgTDEgYnVpbGRzIGZvciBMMi4gSW4gdGhlIGNvZGUgd2UKK2Fsc28gaGF2ZSAidm1jczAxIiwgdGhlIFZNQ1MgdGhhdCBMMCBidWlsdCBmb3IgTDEsIGFuZCAidm1jczAyIiBpcyB0aGUgVk1DUword2hpY2ggTDAgYnVpbGRzIHRvIGFjdHVhbGx5IHJ1biBMMiAtIGhvdyB0aGlzIGlzIGRvbmUgaXMgZXhwbGFpbmVkIGluIHRoZQorYWZvcmVtZW50aW9uZWQgcGFwZXIuCisKK0ZvciBjb252ZW5pZW5jZSwgd2UgcmVwZWF0IHRoZSBjb250ZW50IG9mIHN0cnVjdCB2bWNzMTIgaGVyZS4gSWYgdGhlIGludGVybmFscworb2YgdGhpcyBzdHJ1Y3R1cmUgY2hhbmdlcywgdGhpcyBjYW4gYnJlYWsgbGl2ZSBtaWdyYXRpb24gYWNyb3NzIEtWTSB2ZXJzaW9ucy4KK1ZNQ1MxMl9SRVZJU0lPTiAoZnJvbSB2bXguYykgc2hvdWxkIGJlIGNoYW5nZWQgaWYgc3RydWN0IHZtY3MxMiBvciBpdHMgaW5uZXIKK3N0cnVjdCBzaGFkb3dfdm1jcyBpcyBldmVyIGNoYW5nZWQuCisKKwl0eXBlZGVmIHU2NCBuYXR1cmFsX3dpZHRoOworCXN0cnVjdCBfX3BhY2tlZCB2bWNzMTIgeworCQkvKiBBY2NvcmRpbmcgdG8gdGhlIEludGVsIHNwZWMsIGEgVk1DUyByZWdpb24gbXVzdCBzdGFydCB3aXRoCisJCSAqIHRoZXNlIHR3byB1c2VyLXZpc2libGUgZmllbGRzICovCisJCXUzMiByZXZpc2lvbl9pZDsKKwkJdTMyIGFib3J0OworCisJCXUzMiBsYXVuY2hfc3RhdGU7IC8qIHNldCB0byAwIGJ5IFZNQ0xFQVIsIHRvIDEgYnkgVk1MQVVOQ0ggKi8KKwkJdTMyIHBhZGRpbmdbN107IC8qIHJvb20gZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKworCQl1NjQgaW9fYml0bWFwX2E7CisJCXU2NCBpb19iaXRtYXBfYjsKKwkJdTY0IG1zcl9iaXRtYXA7CisJCXU2NCB2bV9leGl0X21zcl9zdG9yZV9hZGRyOworCQl1NjQgdm1fZXhpdF9tc3JfbG9hZF9hZGRyOworCQl1NjQgdm1fZW50cnlfbXNyX2xvYWRfYWRkcjsKKwkJdTY0IHRzY19vZmZzZXQ7CisJCXU2NCB2aXJ0dWFsX2FwaWNfcGFnZV9hZGRyOworCQl1NjQgYXBpY19hY2Nlc3NfYWRkcjsKKwkJdTY0IGVwdF9wb2ludGVyOworCQl1NjQgZ3Vlc3RfcGh5c2ljYWxfYWRkcmVzczsKKwkJdTY0IHZtY3NfbGlua19wb2ludGVyOworCQl1NjQgZ3Vlc3RfaWEzMl9kZWJ1Z2N0bDsKKwkJdTY0IGd1ZXN0X2lhMzJfcGF0OworCQl1NjQgZ3Vlc3RfaWEzMl9lZmVyOworCQl1NjQgZ3Vlc3RfcGRwdHIwOworCQl1NjQgZ3Vlc3RfcGRwdHIxOworCQl1NjQgZ3Vlc3RfcGRwdHIyOworCQl1NjQgZ3Vlc3RfcGRwdHIzOworCQl1NjQgaG9zdF9pYTMyX3BhdDsKKwkJdTY0IGhvc3RfaWEzMl9lZmVyOworCQl1NjQgcGFkZGluZzY0WzhdOyAvKiByb29tIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisJCW5hdHVyYWxfd2lkdGggY3IwX2d1ZXN0X2hvc3RfbWFzazsKKwkJbmF0dXJhbF93aWR0aCBjcjRfZ3Vlc3RfaG9zdF9tYXNrOworCQluYXR1cmFsX3dpZHRoIGNyMF9yZWFkX3NoYWRvdzsKKwkJbmF0dXJhbF93aWR0aCBjcjRfcmVhZF9zaGFkb3c7CisJCW5hdHVyYWxfd2lkdGggY3IzX3RhcmdldF92YWx1ZTA7CisJCW5hdHVyYWxfd2lkdGggY3IzX3RhcmdldF92YWx1ZTE7CisJCW5hdHVyYWxfd2lkdGggY3IzX3RhcmdldF92YWx1ZTI7CisJCW5hdHVyYWxfd2lkdGggY3IzX3RhcmdldF92YWx1ZTM7CisJCW5hdHVyYWxfd2lkdGggZXhpdF9xdWFsaWZpY2F0aW9uOworCQluYXR1cmFsX3dpZHRoIGd1ZXN0X2xpbmVhcl9hZGRyZXNzOworCQluYXR1cmFsX3dpZHRoIGd1ZXN0X2NyMDsKKwkJbmF0dXJhbF93aWR0aCBndWVzdF9jcjM7CisJCW5hdHVyYWxfd2lkdGggZ3Vlc3RfY3I0OworCQluYXR1cmFsX3dpZHRoIGd1ZXN0X2VzX2Jhc2U7CisJCW5hdHVyYWxfd2lkdGggZ3Vlc3RfY3NfYmFzZTsKKwkJbmF0dXJhbF93aWR0aCBndWVzdF9zc19iYXNlOworCQluYXR1cmFsX3dpZHRoIGd1ZXN0X2RzX2Jhc2U7CisJCW5hdHVyYWxfd2lkdGggZ3Vlc3RfZnNfYmFzZTsKKwkJbmF0dXJhbF93aWR0aCBndWVzdF9nc19iYXNlOworCQluYXR1cmFsX3dpZHRoIGd1ZXN0X2xkdHJfYmFzZTsKKwkJbmF0dXJhbF93aWR0aCBndWVzdF90cl9iYXNlOworCQluYXR1cmFsX3dpZHRoIGd1ZXN0X2dkdHJfYmFzZTsKKwkJbmF0dXJhbF93aWR0aCBndWVzdF9pZHRyX2Jhc2U7CisJCW5hdHVyYWxfd2lkdGggZ3Vlc3RfZHI3OworCQluYXR1cmFsX3dpZHRoIGd1ZXN0X3JzcDsKKwkJbmF0dXJhbF93aWR0aCBndWVzdF9yaXA7CisJCW5hdHVyYWxfd2lkdGggZ3Vlc3RfcmZsYWdzOworCQluYXR1cmFsX3dpZHRoIGd1ZXN0X3BlbmRpbmdfZGJnX2V4Y2VwdGlvbnM7CisJCW5hdHVyYWxfd2lkdGggZ3Vlc3Rfc3lzZW50ZXJfZXNwOworCQluYXR1cmFsX3dpZHRoIGd1ZXN0X3N5c2VudGVyX2VpcDsKKwkJbmF0dXJhbF93aWR0aCBob3N0X2NyMDsKKwkJbmF0dXJhbF93aWR0aCBob3N0X2NyMzsKKwkJbmF0dXJhbF93aWR0aCBob3N0X2NyNDsKKwkJbmF0dXJhbF93aWR0aCBob3N0X2ZzX2Jhc2U7CisJCW5hdHVyYWxfd2lkdGggaG9zdF9nc19iYXNlOworCQluYXR1cmFsX3dpZHRoIGhvc3RfdHJfYmFzZTsKKwkJbmF0dXJhbF93aWR0aCBob3N0X2dkdHJfYmFzZTsKKwkJbmF0dXJhbF93aWR0aCBob3N0X2lkdHJfYmFzZTsKKwkJbmF0dXJhbF93aWR0aCBob3N0X2lhMzJfc3lzZW50ZXJfZXNwOworCQluYXR1cmFsX3dpZHRoIGhvc3RfaWEzMl9zeXNlbnRlcl9laXA7CisJCW5hdHVyYWxfd2lkdGggaG9zdF9yc3A7CisJCW5hdHVyYWxfd2lkdGggaG9zdF9yaXA7CisJCW5hdHVyYWxfd2lkdGggcGFkZGluZ2xbOF07IC8qIHJvb20gZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKwkJdTMyIHBpbl9iYXNlZF92bV9leGVjX2NvbnRyb2w7CisJCXUzMiBjcHVfYmFzZWRfdm1fZXhlY19jb250cm9sOworCQl1MzIgZXhjZXB0aW9uX2JpdG1hcDsKKwkJdTMyIHBhZ2VfZmF1bHRfZXJyb3JfY29kZV9tYXNrOworCQl1MzIgcGFnZV9mYXVsdF9lcnJvcl9jb2RlX21hdGNoOworCQl1MzIgY3IzX3RhcmdldF9jb3VudDsKKwkJdTMyIHZtX2V4aXRfY29udHJvbHM7CisJCXUzMiB2bV9leGl0X21zcl9zdG9yZV9jb3VudDsKKwkJdTMyIHZtX2V4aXRfbXNyX2xvYWRfY291bnQ7CisJCXUzMiB2bV9lbnRyeV9jb250cm9sczsKKwkJdTMyIHZtX2VudHJ5X21zcl9sb2FkX2NvdW50OworCQl1MzIgdm1fZW50cnlfaW50cl9pbmZvX2ZpZWxkOworCQl1MzIgdm1fZW50cnlfZXhjZXB0aW9uX2Vycm9yX2NvZGU7CisJCXUzMiB2bV9lbnRyeV9pbnN0cnVjdGlvbl9sZW47CisJCXUzMiB0cHJfdGhyZXNob2xkOworCQl1MzIgc2Vjb25kYXJ5X3ZtX2V4ZWNfY29udHJvbDsKKwkJdTMyIHZtX2luc3RydWN0aW9uX2Vycm9yOworCQl1MzIgdm1fZXhpdF9yZWFzb247CisJCXUzMiB2bV9leGl0X2ludHJfaW5mbzsKKwkJdTMyIHZtX2V4aXRfaW50cl9lcnJvcl9jb2RlOworCQl1MzIgaWR0X3ZlY3RvcmluZ19pbmZvX2ZpZWxkOworCQl1MzIgaWR0X3ZlY3RvcmluZ19lcnJvcl9jb2RlOworCQl1MzIgdm1fZXhpdF9pbnN0cnVjdGlvbl9sZW47CisJCXUzMiB2bXhfaW5zdHJ1Y3Rpb25faW5mbzsKKwkJdTMyIGd1ZXN0X2VzX2xpbWl0OworCQl1MzIgZ3Vlc3RfY3NfbGltaXQ7CisJCXUzMiBndWVzdF9zc19saW1pdDsKKwkJdTMyIGd1ZXN0X2RzX2xpbWl0OworCQl1MzIgZ3Vlc3RfZnNfbGltaXQ7CisJCXUzMiBndWVzdF9nc19saW1pdDsKKwkJdTMyIGd1ZXN0X2xkdHJfbGltaXQ7CisJCXUzMiBndWVzdF90cl9saW1pdDsKKwkJdTMyIGd1ZXN0X2dkdHJfbGltaXQ7CisJCXUzMiBndWVzdF9pZHRyX2xpbWl0OworCQl1MzIgZ3Vlc3RfZXNfYXJfYnl0ZXM7CisJCXUzMiBndWVzdF9jc19hcl9ieXRlczsKKwkJdTMyIGd1ZXN0X3NzX2FyX2J5dGVzOworCQl1MzIgZ3Vlc3RfZHNfYXJfYnl0ZXM7CisJCXUzMiBndWVzdF9mc19hcl9ieXRlczsKKwkJdTMyIGd1ZXN0X2dzX2FyX2J5dGVzOworCQl1MzIgZ3Vlc3RfbGR0cl9hcl9ieXRlczsKKwkJdTMyIGd1ZXN0X3RyX2FyX2J5dGVzOworCQl1MzIgZ3Vlc3RfaW50ZXJydXB0aWJpbGl0eV9pbmZvOworCQl1MzIgZ3Vlc3RfYWN0aXZpdHlfc3RhdGU7CisJCXUzMiBndWVzdF9zeXNlbnRlcl9jczsKKwkJdTMyIGhvc3RfaWEzMl9zeXNlbnRlcl9jczsKKwkJdTMyIHBhZGRpbmczMls4XTsgLyogcm9vbSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworCQl1MTYgdmlydHVhbF9wcm9jZXNzb3JfaWQ7CisJCXUxNiBndWVzdF9lc19zZWxlY3RvcjsKKwkJdTE2IGd1ZXN0X2NzX3NlbGVjdG9yOworCQl1MTYgZ3Vlc3Rfc3Nfc2VsZWN0b3I7CisJCXUxNiBndWVzdF9kc19zZWxlY3RvcjsKKwkJdTE2IGd1ZXN0X2ZzX3NlbGVjdG9yOworCQl1MTYgZ3Vlc3RfZ3Nfc2VsZWN0b3I7CisJCXUxNiBndWVzdF9sZHRyX3NlbGVjdG9yOworCQl1MTYgZ3Vlc3RfdHJfc2VsZWN0b3I7CisJCXUxNiBob3N0X2VzX3NlbGVjdG9yOworCQl1MTYgaG9zdF9jc19zZWxlY3RvcjsKKwkJdTE2IGhvc3Rfc3Nfc2VsZWN0b3I7CisJCXUxNiBob3N0X2RzX3NlbGVjdG9yOworCQl1MTYgaG9zdF9mc19zZWxlY3RvcjsKKwkJdTE2IGhvc3RfZ3Nfc2VsZWN0b3I7CisJCXUxNiBob3N0X3RyX3NlbGVjdG9yOworCX07CisKKworQXV0aG9ycworLS0tLS0tLQorCitUaGVzZSBwYXRjaGVzIHdlcmUgd3JpdHRlbiBieToKKyAgICAgQWJlbCBHb3Jkb24sIGFiZWxnIDxhdD4gaWwuaWJtLmNvbQorICAgICBOYWRhdiBIYXInRWwsIG55aCA8YXQ+IGlsLmlibS5jb20KKyAgICAgT3JpdCBXYXNzZXJtYW4sIG9yaXR3IDxhdD4gaWwuaWJtLmNvbQorICAgICBCZW4tQW1pIFlhc3NvciwgYmVuYW1pIDxhdD4gaWwuaWJtLmNvbQorICAgICBNdWxpIEJlbi1ZZWh1ZGEsIG11bGkgPGF0PiBpbC5pYm0uY29tCisKK1dpdGggY29udHJpYnV0aW9ucyBieToKKyAgICAgQW50aG9ueSBMaWd1b3JpLCBhbGlndW9yaSA8YXQ+IHVzLmlibS5jb20KKyAgICAgTWlrZSBEYXksIG1kZGF5IDxhdD4gdXMuaWJtLmNvbQorICAgICBNaWNoYWVsIEZhY3RvciwgZmFjdG9yIDxhdD4gaWwuaWJtLmNvbQorICAgICBadmkgRHViaXR6a3ksIGR1YmkgPGF0PiBpbC5pYm0uY29tCisKK0FuZCB2YWx1YWJsZSByZXZpZXdzIGJ5OgorICAgICBBdmkgS2l2aXR5LCBhdmkgPGF0PiByZWRoYXQuY29tCisgICAgIEdsZWIgTmF0YXBvdiwgZ2xlYiA8YXQ+IHJlZGhhdC5jb20KKyAgICAgTWFyY2VsbyBUb3NhdHRpLCBtdG9zYXR0aSA8YXQ+IHJlZGhhdC5jb20KKyAgICAgS2V2aW4gVGlhbiwga2V2aW4udGlhbiA8YXQ+IGludGVsLmNvbQorICAgICBhbmQgb3RoZXJzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9wcGMtcHYudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9wcGMtcHYudHh0CmluZGV4IDNhYjk2OWMuLjJiN2NlMTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vcHBjLXB2LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL3BwYy1wdi50eHQKQEAgLTY4LDkgKzY4LDExIEBACiBtYXAgdGhpcyBzaGFyZWQgcGFnZSB1c2luZyB0aGUgS1ZNIGh5cGVyY2FsbCBLVk1fSENfUFBDX01BUF9NQUdJQ19QQUdFLgogCiBXaXRoIHRoaXMgaHlwZXJjYWxsIGlzc3VlZCB0aGUgZ3Vlc3QgYWx3YXlzIGdldHMgdGhlIG1hZ2ljIHBhZ2UgbWFwcGVkIGF0IHRoZQotZGVzaXJlZCBsb2NhdGlvbiBpbiBlZmZlY3RpdmUgYW5kIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UuIEZvciBub3csIHdlIGFsd2F5cwotbWFwIHRoZSBwYWdlIHRvIC00MDk2LiBUaGlzIHdheSB3ZSBjYW4gYWNjZXNzIGl0IHVzaW5nIGFic29sdXRlIGxvYWQgYW5kIHN0b3JlCi1mdW5jdGlvbnMuIFRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gcmVhZHMgdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSBtYWdpYyBwYWdlOgorZGVzaXJlZCBsb2NhdGlvbi4gVGhlIGZpcnN0IHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGVmZmVjdGl2ZSBhZGRyZXNzIHdoZW4gdGhlCitNTVUgaXMgZW5hYmxlZC4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBhZGRyZXNzIGluIHJlYWwgbW9kZSwgaWYKK2FwcGxpY2FibGUgdG8gdGhlIHRhcmdldC4gRm9yIG5vdywgd2UgYWx3YXlzIG1hcCB0aGUgcGFnZSB0byAtNDA5Ni4gVGhpcyB3YXkgd2UKK2NhbiBhY2Nlc3MgaXQgdXNpbmcgYWJzb2x1dGUgbG9hZCBhbmQgc3RvcmUgZnVuY3Rpb25zLiBUaGUgZm9sbG93aW5nCitpbnN0cnVjdGlvbiByZWFkcyB0aGUgZmlyc3QgZmllbGQgb2YgdGhlIG1hZ2ljIHBhZ2U6CiAKIAlsZAlyWCwgLTQwOTYoMCkKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC9sZ3Vlc3QuYyBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9sZ3Vlc3QvbGd1ZXN0LmMKaW5kZXggY2Q5ZDZhZi4uMDQzYmQ3ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2xndWVzdC9sZ3Vlc3QuYworKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvbGd1ZXN0L2xndWVzdC5jCkBAIC01MSw3ICs1MSw3IEBACiAjaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgogI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvbGludXgvbGd1ZXN0X2xhdW5jaGVyLmgiCiAvKkw6MTEwCi0gKiBXZSBjYW4gaWdub3JlIHRoZSA0MiBpbmNsdWRlIGZpbGVzIHdlIG5lZWQgZm9yIHRoaXMgcHJvZ3JhbSwgYnV0IEkgZG8gd2FudAorICogV2UgY2FuIGlnbm9yZSB0aGUgNDMgaW5jbHVkZSBmaWxlcyB3ZSBuZWVkIGZvciB0aGlzIHByb2dyYW0sIGJ1dCBJIGRvIHdhbnQKICAqIHRvIGRyYXcgYXR0ZW50aW9uIHRvIHRoZSB1c2Ugb2Yga2VybmVsLXN0eWxlIHR5cGVzLgogICoKICAqIEFzIExpbnVzIHNhaWQsICJDIGlzIGEgU3BhcnRhbiBsYW5ndWFnZSwgYW5kIHNvIHNob3VsZCB5b3VyIG5hbWluZyBiZS4iICBJCkBAIC02NSw3ICs2NSw2IEBACiB0eXBlZGVmIHVpbnQ4X3QgdTg7CiAvKjoqLwogCi0jZGVmaW5lIFBBR0VfUFJFU0VOVCAweDcgCS8qIFByZXNlbnQsIFJXLCBFeGVjdXRlICovCiAjZGVmaW5lIEJSSURHRV9QRlggImJyaWRnZToiCiAjaWZuZGVmIFNJT0NCUkFERElGCiAjZGVmaW5lIFNJT0NCUkFERElGCTB4ODlhMgkJLyogYWRkIGludGVyZmFjZSB0byBicmlkZ2UgICAgICAqLwpAQCAtODYxLDggKzg2MCwxMCBAQAogCS8qIHdyaXRldiBjYW4gcmV0dXJuIGEgcGFydGlhbCB3cml0ZSwgc28gd2UgbG9vcCBoZXJlLiAqLwogCXdoaWxlICghaW92X2VtcHR5KGlvdiwgb3V0KSkgewogCQlpbnQgbGVuID0gd3JpdGV2KFNURE9VVF9GSUxFTk8sIGlvdiwgb3V0KTsKLQkJaWYgKGxlbiA8PSAwKQotCQkJZXJyKDEsICJXcml0ZSB0byBzdGRvdXQgZ2F2ZSAlaSIsIGxlbik7CisJCWlmIChsZW4gPD0gMCkgeworCQkJd2FybigiV3JpdGUgdG8gc3Rkb3V0IGdhdmUgJWkgKCVkKSIsIGxlbiwgZXJybm8pOworCQkJYnJlYWs7CisJCX0KIAkJaW92X2NvbnN1bWUoaW92LCBvdXQsIGxlbik7CiAJfQogCkBAIC04OTgsNyArODk5LDcgQEAKIAkgKiBzYW1lIGZvcm1hdDogd2hhdCBhIGNvaW5jaWRlbmNlIQogCSAqLwogCWlmICh3cml0ZXYobmV0X2luZm8tPnR1bmZkLCBpb3YsIG91dCkgPCAwKQotCQllcnJ4KDEsICJXcml0ZSB0byB0dW4gZmFpbGVkPyIpOworCQl3YXJueCgiV3JpdGUgdG8gdHVuIGZhaWxlZCAoJWQpPyIsIGVycm5vKTsKIAogCS8qCiAJICogRG9uZSB3aXRoIHRoYXQgb25lOyB3YWl0X2Zvcl92cV9kZXNjKCkgd2lsbCBzZW5kIHRoZSBpbnRlcnJ1cHQgaWYKQEAgLTk1NSw3ICs5NTYsNyBAQAogCSAqLwogCWxlbiA9IHJlYWR2KG5ldF9pbmZvLT50dW5mZCwgaW92LCBpbik7CiAJaWYgKGxlbiA8PSAwKQotCQllcnIoMSwgIkZhaWxlZCB0byByZWFkIGZyb20gdHVuLiIpOworCQl3YXJuKCJGYWlsZWQgdG8gcmVhZCBmcm9tIHR1biAoJWQpLiIsIGVycm5vKTsKIAogCS8qCiAJICogTWFyayB0aGF0IHBhY2tldCBidWZmZXIgYXMgdXNlZCwgYnV0IGRvbid0IGludGVycnVwdCBoZXJlLiAgV2Ugd2FudApAQCAtMTA5Myw5ICsxMDk0LDEwIEBACiAJCXdhcm54KCJEZXZpY2UgJXMgY29uZmlndXJhdGlvbiBGQUlMRUQiLCBkZXYtPm5hbWUpOwogCQlpZiAoZGV2LT5ydW5uaW5nKQogCQkJcmVzZXRfZGV2aWNlKGRldik7Ci0JfSBlbHNlIGlmIChkZXYtPmRlc2MtPnN0YXR1cyAmIFZJUlRJT19DT05GSUdfU19EUklWRVJfT0spIHsKLQkJaWYgKCFkZXYtPnJ1bm5pbmcpCi0JCQlzdGFydF9kZXZpY2UoZGV2KTsKKwl9IGVsc2UgeworCQlpZiAoZGV2LT5ydW5uaW5nKQorCQkJZXJyKDEsICJEZXZpY2UgJXMgZmVhdHVyZXMgZmluYWxpemVkIHR3aWNlIiwgZGV2LT5uYW1lKTsKKwkJc3RhcnRfZGV2aWNlKGRldik7CiAJfQogfQogCkBAIC0xMTIwLDI1ICsxMTIyLDExIEBACiAJCQlyZXR1cm47CiAJCX0KIAotCQkvKgotCQkgKiBEZXZpY2VzICpjYW4qIGJlIHVzZWQgYmVmb3JlIHN0YXR1cyBpcyBzZXQgdG8gRFJJVkVSX09LLgotCQkgKiBUaGUgb3JpZ2luYWwgcGxhbiB3YXMgdGhhdCB0aGV5IHdvdWxkIG5ldmVyIGRvIHRoaXM6IHRoZXkKLQkJICogd291bGQgYWx3YXlzIGZpbmlzaCBzZXR0aW5nIHVwIHRoZWlyIHN0YXR1cyBiaXRzIGJlZm9yZQotCQkgKiBhY3R1YWxseSB0b3VjaGluZyB0aGUgdmlydHF1ZXVlcy4gIEluIHByYWN0aWNlLCB3ZSBhbGxvd2VkCi0JCSAqIHRoZW0gdG8sIGFuZCB0aGV5IGRvIChlZy4gdGhlIGRpc2sgcHJvYmVzIGZvciBwYXJ0aXRpb24KLQkJICogdGFibGVzIGFzIHBhcnQgb2YgaW5pdGlhbGl6YXRpb24pLgotCQkgKgotCQkgKiBJZiB3ZSBzZWUgdGhpcywgd2Ugc3RhcnQgdGhlIGRldmljZTogb25jZSBpdCdzIHJ1bm5pbmcsIHdlCi0JCSAqIGV4cGVjdCB0aGUgZGV2aWNlIHRvIGNhdGNoIGFsbCB0aGUgbm90aWZpY2F0aW9ucy4KLQkJICovCisJCS8qIERldmljZXMgc2hvdWxkIG5vdCBiZSB1c2VkIGJlZm9yZSBmZWF0dXJlcyBhcmUgZmluYWxpemVkLiAqLwogCQlmb3IgKHZxID0gaS0+dnE7IHZxOyB2cSA9IHZxLT5uZXh0KSB7CiAJCQlpZiAoYWRkciAhPSB2cS0+Y29uZmlnLnBmbipnZXRwYWdlc2l6ZSgpKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKGktPnJ1bm5pbmcpCi0JCQkJZXJyeCgxLCAiTm90aWZpY2F0aW9uIG9uIHJ1bm5pbmcgJXMiLCBpLT5uYW1lKTsKLQkJCS8qIFRoaXMganVzdCBjYWxscyBjcmVhdGVfdGhyZWFkKCkgZm9yIGVhY2ggdmlydHF1ZXVlICovCi0JCQlzdGFydF9kZXZpY2UoaSk7Ci0JCQlyZXR1cm47CisJCQllcnJ4KDEsICJOb3RpZmljYXRpb24gb24gJXMgYmVmb3JlIHNldHVwISIsIGktPm5hbWUpOwogCQl9CiAJfQogCkBAIC0xMzcwLDcgKzEzNTgsNyBAQAogICogLS1zaGFyZW5ldD08bmFtZT4gb3B0aW9uIHdoaWNoIG9wZW5zIG9yIGNyZWF0ZXMgYSBuYW1lZCBwaXBlLiAgVGhpcyBjYW4gYmUKICAqIHVzZWQgdG8gc2VuZCBwYWNrZXRzIHRvIGFub3RoZXIgZ3Vlc3QgaW4gYSAxOjEgbWFubmVyLgogICoKLSAqIE1vcmUgc29waXN0aWNhdGVkIGlzIHRvIHVzZSBvbmUgb2YgdGhlIHRvb2xzIGRldmVsb3BlZCBmb3IgcHJvamVjdCBsaWtlIFVNTAorICogTW9yZSBzb3BoaXN0aWNhdGVkIGlzIHRvIHVzZSBvbmUgb2YgdGhlIHRvb2xzIGRldmVsb3BlZCBmb3IgcHJvamVjdCBsaWtlIFVNTAogICogdG8gZG8gbmV0d29ya2luZy4KICAqCiAgKiBGYXN0ZXIgaXMgdG8gZG8gdmlydGlvIGJvbmRpbmcgaW4ga2VybmVsLiAgRG9pbmcgdGhpcyAxOjEgd291bGQgYmUKQEAgLTEzODAsNyArMTM2OCw3IEBACiAgKiBtdWx0aXBsZSBpbnRlci1ndWVzdCBjaGFubmVscyBiZWhpbmQgb25lIGludGVyZmFjZSwgYWx0aG91Z2ggaXQgd291bGQKICAqIHJlcXVpcmUgc29tZSBtYW5uZXIgb2YgaG90cGx1Z2dpbmcgbmV3IHZpcnRpbyBjaGFubmVscy4KICAqCi0gKiBGaW5hbGx5LCB3ZSBjb3VsZCBpbXBsZW1lbnQgYSB2aXJ0aW8gbmV0d29yayBzd2l0Y2ggaW4gdGhlIGtlcm5lbC4KKyAqIEZpbmFsbHksIHdlIGNvdWxkIHVzZSBhIHZpcnRpbyBuZXR3b3JrIHN3aXRjaCBpbiB0aGUga2VybmVsLCBpZS4gdmhvc3QuCiA6Ki8KIAogc3RhdGljIHUzMiBzdHIyaXAoY29uc3QgY2hhciAqaXBhZGRyKQpAQCAtMjAxNywxMCArMjAwNSw3IEBACiAJLyogVGVsbCB0aGUgZW50cnkgcGF0aCBub3QgdG8gdHJ5IHRvIHJlbG9hZCBzZWdtZW50IHJlZ2lzdGVycy4gKi8KIAlib290LT5oZHIubG9hZGZsYWdzIHw9IEtFRVBfU0VHTUVOVFM7CiAKLQkvKgotCSAqIFdlIHRlbGwgdGhlIGtlcm5lbCB0byBpbml0aWFsaXplIHRoZSBHdWVzdDogdGhpcyByZXR1cm5zIHRoZSBvcGVuCi0JICogL2Rldi9sZ3Vlc3QgZmlsZSBkZXNjcmlwdG9yLgotCSAqLworCS8qIFdlIHRlbGwgdGhlIGtlcm5lbCB0byBpbml0aWFsaXplIHRoZSBHdWVzdC4gKi8KIAl0ZWxsX2tlcm5lbChzdGFydCk7CiAKIAkvKiBFbnN1cmUgdGhhdCB3ZSB0ZXJtaW5hdGUgaWYgYSBkZXZpY2Utc2VydmljaW5nIGNoaWxkIGRpZXMuICovCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtL2h3cG9pc29uLnR4dCBiL0RvY3VtZW50YXRpb24vdm0vaHdwb2lzb24udHh0CmluZGV4IDEyZjliYTIuLjU1MDA2ODQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0vaHdwb2lzb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vdm0vaHdwb2lzb24udHh0CkBAIC0xMjksMTIgKzEyOSwxMiBAQAogb2YgdGhlIG1lbWNnLgogCiBFeGFtcGxlOgotICAgICAgICBta2RpciAvY2dyb3VwL2h3cG9pc29uCisgICAgICAgIG1rZGlyIC9zeXMvZnMvY2dyb3VwL21lbS9od3BvaXNvbgogCiAgICAgICAgIHVzZW1lbSAtbSAxMDAgLXMgMTAwMCAmCi0gICAgICAgIGVjaG8gYGpvYnMgLXBgID4gL2Nncm91cC9od3BvaXNvbi90YXNrcworICAgICAgICBlY2hvIGBqb2JzIC1wYCA+IC9zeXMvZnMvY2dyb3VwL21lbS9od3BvaXNvbi90YXNrcwogCi0gICAgICAgIG1lbWNnX2lubz0kKGxzIC1pZCAvY2dyb3VwL2h3cG9pc29uIHwgY3V0IC1mMSAtZCcgJykKKyAgICAgICAgbWVtY2dfaW5vPSQobHMgLWlkIC9zeXMvZnMvY2dyb3VwL21lbS9od3BvaXNvbiB8IGN1dCAtZjEgLWQnICcpCiAgICAgICAgIGVjaG8gJG1lbWNnX2lubyA+IC9kZWJ1Zy9od3BvaXNvbi9jb3JydXB0LWZpbHRlci1tZW1jZwogCiAgICAgICAgIHBhZ2UtdHlwZXMgLXAgYHBpZG9mIGluaXRgICAgLS1od3BvaXNvbiAgIyBzaGFsbCBkbyBub3RoaW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dCBiL0RvY3VtZW50YXRpb24veDg2L2Jvb3QudHh0CmluZGV4IDliNzIyMWEuLjdjM2E4ODAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24veDg2L2Jvb3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24veDg2L2Jvb3QudHh0CkBAIC02NzQsNyArNjc0LDcgQEAKIAogRmllbGQgbmFtZToJaW5pdF9zaXplCiBUeXBlOgkJcmVhZAotT2Zmc2V0L3NpemU6CTB4MjVjLzQKK09mZnNldC9zaXplOgkweDI2MC80CiAKICAgVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBsaW5lYXIgY29udGlndW91cyBtZW1vcnkgc3RhcnRpbmcKICAgYXQgdGhlIGtlcm5lbCBydW50aW1lIHN0YXJ0IGFkZHJlc3MgdGhhdCB0aGUga2VybmVsIG5lZWRzIGJlZm9yZSBpdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvZW50cnlfNjQudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYvZW50cnlfNjQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NjlmMTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni9lbnRyeV82NC50eHQKQEAgLTAsMCArMSw5OCBAQAorVGhpcyBmaWxlIGRvY3VtZW50cyBzb21lIG9mIHRoZSBrZXJuZWwgZW50cmllcyBpbgorYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMuICBBIGxvdCBvZiB0aGlzIGV4cGxhbmF0aW9uIGlzIGFkYXB0ZWQgZnJvbQorYW4gZW1haWwgZnJvbSBJbmdvIE1vbG5hcjoKKworaHR0cDovL2xrbWwua2VybmVsLm9yZy9yLzwyMDExMDUyOTE5MTA1NS5HQzk4MzUlNDBlbHRlLmh1PgorCitUaGUgeDg2IGFyY2hpdGVjdHVyZSBoYXMgcXVpdGUgYSBmZXcgZGlmZmVyZW50IHdheXMgdG8ganVtcCBpbnRvCitrZXJuZWwgY29kZS4gIE1vc3Qgb2YgdGhlc2UgZW50cnkgcG9pbnRzIGFyZSByZWdpc3RlcmVkIGluCithcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYyBhbmQgaW1wbGVtZW50ZWQgaW4gYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKK2FuZCBhcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TLgorCitUaGUgSURUIHZlY3RvciBhc3NpZ25tZW50cyBhcmUgbGlzdGVkIGluIGFyY2gveDg2L2luY2x1ZGUvaXJxX3ZlY3RvcnMuaC4KKworU29tZSBvZiB0aGVzZSBlbnRyaWVzIGFyZToKKworIC0gc3lzdGVtX2NhbGw6IHN5c2NhbGwgaW5zdHJ1Y3Rpb24gZnJvbSA2NC1iaXQgY29kZS4KKworIC0gaWEzMl9zeXNjYWxsOiBpbnQgMHg4MCBmcm9tIDMyLWJpdCBvciA2NC1iaXQgY29kZTsgY29tcGF0IHN5c2NhbGwKKyAgIGVpdGhlciB3YXkuCisKKyAtIGlhMzJfc3lzY2FsbCwgaWEzMl9zeXNlbnRlcjogc3lzY2FsbCBhbmQgc3lzZW50ZXIgZnJvbSAzMi1iaXQKKyAgIGNvZGUKKworIC0gaW50ZXJydXB0OiBBbiBhcnJheSBvZiBlbnRyaWVzLiAgRXZlcnkgSURUIHZlY3RvciB0aGF0IGRvZXNuJ3QKKyAgIGV4cGxpY2l0bHkgcG9pbnQgc29tZXdoZXJlIGVsc2UgZ2V0cyBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgIHZhbHVlIGluIGludGVycnVwdHMuICBUaGVzZSBwb2ludCB0byBhIHdob2xlIGFycmF5IG9mCisgICBtYWdpY2FsbHktZ2VuZXJhdGVkIGZ1bmN0aW9ucyB0aGF0IG1ha2UgdGhlaXIgd2F5IHRvIGRvX0lSUSB3aXRoCisgICB0aGUgaW50ZXJydXB0IG51bWJlciBhcyBhIHBhcmFtZXRlci4KKworIC0gZW11bGF0ZV92c3lzY2FsbDogaW50IDB4Y2MsIGEgc3BlY2lhbCBub24tQUJJIGVudHJ5IHVzZWQgYnkKKyAgIHZzeXNjYWxsIGVtdWxhdGlvbi4KKworIC0gQVBJQyBpbnRlcnJ1cHRzOiBWYXJpb3VzIHNwZWNpYWwtcHVycG9zZSBpbnRlcnJ1cHRzIGZvciB0aGluZ3MKKyAgIGxpa2UgVExCIHNob290ZG93bi4KKworIC0gQXJjaGl0ZWN0dXJhbGx5LWRlZmluZWQgZXhjZXB0aW9ucyBsaWtlIGRpdmlkZV9lcnJvci4KKworVGhlcmUgYXJlIGEgZmV3IGNvbXBsZXhpdGllcyBoZXJlLiAgVGhlIGRpZmZlcmVudCB4ODYtNjQgZW50cmllcworaGF2ZSBkaWZmZXJlbnQgY2FsbGluZyBjb252ZW50aW9ucy4gIFRoZSBzeXNjYWxsIGFuZCBzeXNlbnRlcgoraW5zdHJ1Y3Rpb25zIGhhdmUgdGhlaXIgb3duIHBlY3VsaWFyIGNhbGxpbmcgY29udmVudGlvbnMuICBTb21lIG9mCit0aGUgSURUIGVudHJpZXMgcHVzaCBhbiBlcnJvciBjb2RlIG9udG8gdGhlIHN0YWNrOyBvdGhlcnMgZG9uJ3QuCitJRFQgZW50cmllcyB1c2luZyB0aGUgSVNUIGFsdGVybmF0aXZlIHN0YWNrIG1lY2hhbmlzbSBuZWVkIHRoZWlyIG93bgorbWFnaWMgdG8gZ2V0IHRoZSBzdGFjayBmcmFtZXMgcmlnaHQuICAoWW91IGNhbiBmaW5kIHNvbWUKK2RvY3VtZW50YXRpb24gaW4gdGhlIEFNRCBBUE0sIFZvbHVtZSAyLCBDaGFwdGVyIDggYW5kIHRoZSBJbnRlbCBTRE0sCitWb2x1bWUgMywgQ2hhcHRlciA2LikKKworRGVhbGluZyB3aXRoIHRoZSBzd2FwZ3MgaW5zdHJ1Y3Rpb24gaXMgZXNwZWNpYWxseSB0cmlja3kuICBTd2FwZ3MKK3RvZ2dsZXMgd2hldGhlciBncyBpcyB0aGUga2VybmVsIGdzIG9yIHRoZSB1c2VyIGdzLiAgVGhlIHN3YXBncworaW5zdHJ1Y3Rpb24gaXMgcmF0aGVyIGZyYWdpbGU6IGl0IG11c3QgbmVzdCBwZXJmZWN0bHkgYW5kIG9ubHkgaW4KK3NpbmdsZSBkZXB0aCwgaXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiBlbnRlcmluZyBmcm9tIHVzZXIgbW9kZSB0bwora2VybmVsIG1vZGUgYW5kIHRoZW4gd2hlbiByZXR1cm5pbmcgdG8gdXNlci1zcGFjZSwgYW5kIHByZWNpc2VseQorc28uIElmIHdlIG1lc3MgdGhhdCB1cCBldmVuIHNsaWdodGx5LCB3ZSBjcmFzaC4KKworU28gd2hlbiB3ZSBoYXZlIGEgc2Vjb25kYXJ5IGVudHJ5LCBhbHJlYWR5IGluIGtlcm5lbCBtb2RlLCB3ZSAqbXVzdAorbm90KiB1c2UgU1dBUEdTIGJsaW5kbHkgLSBub3IgbXVzdCB3ZSBmb3JnZXQgZG9pbmcgYSBTV0FQR1Mgd2hlbiBpdCdzCitub3Qgc3dpdGNoZWQvc3dhcHBlZCB5ZXQuCisKK05vdywgdGhlcmUncyBhIHNlY29uZGFyeSBjb21wbGljYXRpb246IHRoZXJlJ3MgYSBjaGVhcCB3YXkgdG8gdGVzdAord2hpY2ggbW9kZSB0aGUgQ1BVIGlzIGluIGFuZCBhbiBleHBlbnNpdmUgd2F5LgorCitUaGUgY2hlYXAgd2F5IGlzIHRvIHBpY2sgdGhpcyBpbmZvIG9mZiB0aGUgZW50cnkgZnJhbWUgb24gdGhlIGtlcm5lbAorc3RhY2ssIGZyb20gdGhlIENTIG9mIHRoZSBwdHJlZ3MgYXJlYSBvZiB0aGUga2VybmVsIHN0YWNrOgorCisJeG9ybCAlZWJ4LCVlYngKKwl0ZXN0bCAkMyxDUys4KCVyc3ApCisJamUgZXJyb3Jfa2VybmVsc3BhY2UKKwlTV0FQR1MKKworVGhlIGV4cGVuc2l2ZSAocGFyYW5vaWQpIHdheSBpcyB0byByZWFkIGJhY2sgdGhlIE1TUl9HU19CQVNFIHZhbHVlCisod2hpY2ggaXMgd2hhdCBTV0FQR1MgbW9kaWZpZXMpOgorCisJbW92bCAkMSwlZWJ4CisJbW92bCAkTVNSX0dTX0JBU0UsJWVjeAorCXJkbXNyCisJdGVzdGwgJWVkeCwlZWR4CisJanMgMWYgICAvKiBuZWdhdGl2ZSAtPiBpbiBrZXJuZWwgKi8KKwlTV0FQR1MKKwl4b3JsICVlYngsJWVieAorMToJcmV0CisKK2FuZCB0aGUgd2hvbGUgcGFyYW5vaWQgbm9uLXBhcmFub2lkIG1hY3JvIGNvbXBsZXhpdHkgaXMgYWJvdXQgd2hldGhlcgordG8gc3VmZmVyIHRoYXQgUkRNU1IgY29zdC4KKworSWYgd2UgYXJlIGF0IGFuIGludGVycnVwdCBvciB1c2VyLXRyYXAvZ2F0ZS1hbGlrZSBib3VuZGFyeSB0aGVuIHdlIGNhbgordXNlIHRoZSBmYXN0ZXIgY2hlY2s6IHRoZSBzdGFjayB3aWxsIGJlIGEgcmVsaWFibGUgaW5kaWNhdG9yIG9mCit3aGV0aGVyIFNXQVBHUyB3YXMgYWxyZWFkeSBkb25lOiBpZiB3ZSBzZWUgdGhhdCB3ZSBhcmUgYSBzZWNvbmRhcnkKK2VudHJ5IGludGVycnVwdGluZyBrZXJuZWwgbW9kZSBleGVjdXRpb24sIHRoZW4gd2Uga25vdyB0aGF0IHRoZSBHUworYmFzZSBoYXMgYWxyZWFkeSBiZWVuIHN3aXRjaGVkLiBJZiBpdCBzYXlzIHRoYXQgd2UgaW50ZXJydXB0ZWQKK3VzZXItc3BhY2UgZXhlY3V0aW9uIHRoZW4gd2UgbXVzdCBkbyB0aGUgU1dBUEdTLgorCitCdXQgaWYgd2UgYXJlIGluIGFuIE5NSS9NQ0UvREVCVUcvd2hhdGV2ZXIgc3VwZXItYXRvbWljIGVudHJ5IGNvbnRleHQsCit3aGljaCBtaWdodCBoYXZlIHRyaWdnZXJlZCByaWdodCBhZnRlciBhIG5vcm1hbCBlbnRyeSB3cm90ZSBDUyB0byB0aGUKK3N0YWNrIGJ1dCBiZWZvcmUgd2UgZXhlY3V0ZWQgU1dBUEdTLCB0aGVuIHRoZSBvbmx5IHNhZmUgd2F5IHRvIGNoZWNrCitmb3IgR1MgaXMgdGhlIHNsb3dlciBtZXRob2Q6IHRoZSBSRE1TUi4KKworU28gd2UgdHJ5IG9ubHkgdG8gbWFyayB0aG9zZSBlbnRyeSBtZXRob2RzICdwYXJhbm9pZCcgdGhhdCBhYnNvbHV0ZWx5CituZWVkIHRoZSBtb3JlIGV4cGVuc2l2ZSBjaGVjayBmb3IgdGhlIEdTIGJhc2UgLSBhbmQgd2UgZ2VuZXJhdGUgYWxsCisnbm9ybWFsJyBlbnRyeSBwb2ludHMgd2l0aCB0aGUgcmVndWxhciAoZmFzdGVyKSBlbnRyeSBtYWNyb3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3poX0NOL1N1Ym1pdENoZWNrbGlzdCBiL0RvY3VtZW50YXRpb24vemhfQ04vU3VibWl0Q2hlY2tsaXN0CmluZGV4IDk1MTQxNWIuLjRjNzQxZDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vemhfQ04vU3VibWl0Q2hlY2tsaXN0CisrKyBiL0RvY3VtZW50YXRpb24vemhfQ04vU3VibWl0Q2hlY2tsaXN0CkBAIC02Nyw3ICs2Nyw3IEBACiAKIDEyo7rS0b6tzai5/UNPTkZJR19QUkVFTVBULCBDT05GSUdfREVCVUdfUFJFRU1QVCwKICAgICBDT05GSUdfREVCVUdfU0xBQiwgQ09ORklHX0RFQlVHX1BBR0VBTExPQywgQ09ORklHX0RFQlVHX01VVEVYRVMsCi0gICAgQ09ORklHX0RFQlVHX1NQSU5MT0NLLCBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVCy4srUo6yyosfSzazKsba8CisgICAgQ09ORklHX0RFQlVHX1NQSU5MT0NLLCBDT05GSUdfREVCVUdfQVRPTUlDX1NMRUVQsuLK1KOssqLH0s2syrG2vAogICAgIMq5xNyhowogCiAxM6O60tG+rba8ubm9qLKix9LKudPDu/LV37K7yrnTwyBDT05GSUdfU01QILrNIENPTkZJR19QUkVFTVBUsuLK1Na00NDKsbzkoaMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vemhfQ04vZW1haWwtY2xpZW50cy50eHQgYi9Eb2N1bWVudGF0aW9uL3poX0NOL2VtYWlsLWNsaWVudHMudHh0CmluZGV4IDVkNjVlMzIuLmI5YTFhM2UgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vemhfQ04vZW1haWwtY2xpZW50cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi96aF9DTi9lbWFpbC1jbGllbnRzLnR4dApAQCAtMSw0ICsxLDQgQEAKLemUmD9DaGluZXNlIHRyYW5zbGF0ZWQgdmVyc2lvbiBvZiBEb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0Civvu79DaGluZXNlIHRyYW5zbGF0ZWQgdmVyc2lvbiBvZiBEb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0CiAKIElmIHlvdSBoYXZlIGFueSBjb21tZW50IG9yIHVwZGF0ZSB0byB0aGUgY29udGVudCwgcGxlYXNlIGNvbnRhY3QgdGhlCiBvcmlnaW5hbCBkb2N1bWVudCBtYWludGFpbmVyIGRpcmVjdGx5LiAgSG93ZXZlciwgaWYgeW91IGhhdmUgYSBwcm9ibGVtCkBAIC04LDIwMyArOCwyMDMgQEAKIAogQ2hpbmVzZSBtYWludGFpbmVyOiBIYXJyeSBXZWkgPGhhcnJ5eGl5b3VAZ21haWwuY29tPgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Eb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0ID8/P+a2kz8/Pz/nvIjmmI8/PworRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCDnmoTkuK3mlofnv7vor5EKIAot5r+hPz8/Pz8/5a6gPz/nkoHng5g/Pz8/5a2YP+eJiD8/Pz8/Pz8/Pz8/54C555m4Pz/nkofpo44/5a2YP+ODqD8/57uv6K+yPz8/Pz/lppfvvYc/P+e8geWtmD/jgog/Pz8/P+a/oT8/Pz/mtaM/5rWj6LeoP+OEqD/ovqg/Pwot5rWc44KGPz8/Pz8/P+S8tD/liac/P+eShz/plJs/5raUPz8/P+a1oOODpT8/5raTPz8/Pz8/P+e8geWtmD/jgog/P+WnuT8/P+KUvz8/5r+hPz8/Pz8/P+e8iOaYjz8/Pz/lrZg/6aKBPz8/Pz8/P+iItT8/Pz8/57yIPwot55KHP+eAmz8/P+OEqT8/5qOwP+mUmz/nkofnlq8/P+e7r+ius+iFkT8/Pz8/P+e8geWtmD/jgog/Pz8/Pwor5aaC5p6c5oOz6K+E6K665oiW5pu05paw5pys5paH55qE5YaF5a6577yM6K+355u05o6l6IGU57O75Y6f5paH5qGj55qE57u05oqk6ICF44CC5aaC5p6c5L2g5L2/55So6Iux5paHCivkuqTmtYHmnInlm7Dpmr7nmoTor53vvIzkuZ/lj6/ku6XlkJHkuK3mlofniYjnu7TmiqTogIXmsYLliqnjgILlpoLmnpzmnKznv7vor5Hmm7TmlrDkuI3lj4rml7bmiJbogIXnv7sKK+ivkeWtmOWcqOmXrumimO+8jOivt+iBlOezu+S4reaWh+eJiOe7tOaKpOiAheOAggogCi3mtpM/Pz8/Pz8/57yB5a2YP+OCiD8/6ZSbPyDnkpDmg6c/P+a/nj8gIEhhcnJ5IFdlaSA8aGFycnl4aXlvdUBnbWFpbC5jb20+Ci3mtpM/Pz8/Pz8/57yI5piPPz8/Pz/plJs/IOeSkOaDpz8/5r+ePyAgSGFycnkgV2VpIDxoYXJyeXhpeW91QGdtYWlsLmNvbT4KLea2kz8/Pz8/Pz8/P8KkPz8/Pz/plJs/IFlpbmdsaW4gTHVhbiA8c3lubXl0aEBnbWFpbC5jb20+CivkuK3mlofniYjnu7TmiqTogIXvvJog6LS+5aiB5aiBICBIYXJyeSBXZWkgPGhhcnJ5eGl5b3VAZ21haWwuY29tPgor5Lit5paH54mI57+76K+R6ICF77yaIOi0vuWogeWogSAgSGFycnkgV2VpIDxoYXJyeXhpeW91QGdtYWlsLmNvbT4KK+S4reaWh+eJiOagoeivkeiAhe+8miBZaW5nbGluIEx1YW4gPHN5bm15dGhAZ21haWwuY29tPgogCQlYaWFvY2hlbiBXYW5nIDx3YW5neGlhb2NoZW4wQGdtYWlsLmNvbT4KIAkJeWF4aW5zbiA8eWF4aW5zbkAxNjMuY29tPgogCi3mtaDjg6Q/P+a2k+eDmD/vvYY/Pwor5Lul5LiL5Li65q2j5paHCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotTGludXg/Pz/mtaDot7o/44ihP+mjjj8/Pz8/57yDP+a3h+KEgz8/CitMaW51eOmCruS7tuWuouaIt+err+mFjee9ruS/oeaBrwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0/Pz8/Pz8/Pz/nvIM/Civmma7pgJrphY3nva4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUxpbnV4Pz8/Pz/mrYzLiea2kz8/Pz8/Pz/mnak/Pz8/5rWg5oOwPz8/Pz/mtZzjgoc/P+mUmz8/Pz/mv4LoiqU/P+eQm+ODpD8/5rWjP+a2k+a0qj8/5rWg5py1Pz8/Pz8/Pz/lrpM/Pz8/Pz8/Pz8/Pz8/5rWcP+e8geWtmD/jgog/PwotPz/jg6Y/5aCVPz/mtaDorrk/P+a1oz8/Pz8/Pz/mtaDliYE/Pz8/P+eAueinhD/nhY4/P+aQtD/nkofjg6Y/PyJ0ZXh0L3BsYWluIj8/Pz8/5oOwPz/plJs/Pz8/5rWg5py1Pz8/Pz8/Pz/mtpM/55KnPz8/Pz8/P+mUmz8KLT8/P+a2k+m4vz8/5rW8P+a1o+iDr8uJ5raTPz8/P+Wvrj8/P+OEqT/jhKU/Pz8/44SoPz/nkoHpuL8/P+e7iz/mtpM/Pz8/Pz8/5a+wPz8/5Ly0P+S/sT8/CitMaW51eOWGheaguOihpeS4geaYr+mAmui/h+mCruS7tuiiq+aPkOS6pOeahO+8jOacgOWlveaKiuihpeS4geS9nOS4uumCruS7tuS9k+eahOWGheW1jOaWh+acrOOAguacieS6m+e7tOaKpOiAhQor5o6l5pS26ZmE5Lu277yM5L2G5piv6ZmE5Lu255qE5YaF5a655qC85byP5bqU6K+l5pivInRleHQvcGxhaW4i44CC54S26ICM77yM6ZmE5Lu25LiA6Iis5piv5LiN6LWe5oiQ55qE77yMCivlm6DkuLrov5nkvJrkvb/ooaXkuIHnmoTlvJXnlKjpg6jliIblnKjor4Torrrov4fnqIvkuK3lj5jnmoTlvojlm7Dpmr7jgIIKIAotPz/jhKY/44OlPz8/Pz9MaW51eD8/Pz8/5q2My4nmtpM/Pz8/Pz8/5rWg6Le6P+OIoT/po44/Pz8/44SlPz8/Pz/nkJvjg6Q/Pz8/6Le6Pz/nkofjg6U/P+a1nD8/Pz8/Pz8/Pz8/Pz/mv64/Pz/oiLU/Pz8/P+a4mj/mv6E/6ZSbPwot5rWgP+a1oD/mtpM/Pz/oiqU/55GwPz8/Pz8/Pz8/Pz8/P+OChT/mg7DjgIPnu5c/Pz8/Pz8/57uM54OYP+ehtz8/Pz8/Pz/omas/Pz8/44SmPz/mtpM/55CbPz8/P+Wvrj/mvrblrZg/Pz8/P+e8gT/ngY/kv7E/Pwor55So5p2l5Y+R6YCBTGludXjlhoXmoLjooaXkuIHnmoTpgq7ku7blrqLmiLfnq6/lnKjlj5HpgIHooaXkuIHml7blupTor6XlpITkuo7mlofmnKznmoTljp/lp4vnirbmgIHjgILkvovlpoLvvIwKK+S7luS7rOS4jeiDveaUueWPmOaIluiAheWIoOmZpOWItuihqOespuaIluiAheepuuagvO+8jOeUmuiHs+aYr+WcqOavj+S4gOihjOeahOW8gOWktOaIluiAhee7k+WwvuOAggogCi3mtpM/55GVPz8/P+adqT8iZm9ybWF0PWZsb3dlZCLlpq/igLM/Pz8/Pz8/P+eQm+ODpD8/Pz8/5p2pPz8/6JyCPz/lr64/55Kn6JyCPz8/Pz/mo7A/Pz8/5rWg44OlPz8/Pz/ngLnltIc/Pz8/P+eQmz8/Pz8KK+S4jeimgemAmui/hyJmb3JtYXQ9Zmxvd2VkIuaooeW8j+WPkemAgeihpeS4geOAgui/meagt+S8muW8lei1t+S4jeWPr+mihOacn+S7peWPiuacieWus+eahOaWreihjOOAggogCi3mtpM/55GVP+eSgeKVgD8/Pz8/Pz8/5rWg6Le6P+OIoT/po44/P+adqT/nkJs/Pz8/Pz/jhKY/44ijPz8/Pz/mnak/Pz/onII/P+a1vD8/P+adkT8/5rWjPz8/P+eQm+ODpD8/Pz8/CivkuI3opoHorqnkvaDnmoTpgq7ku7blrqLmiLfnq6/ov5vooYzoh6rliqjmjaLooYzjgILov5nmoLfkuZ/kvJrnoLTlnY/kvaDnmoTooaXkuIHjgIIKIAotPz8/5rWg6Le6P+OIoT/po44/P+a2kz8/P+iKpT/nkbA/Pz8/Pz8/Pz8/P+eAmz/nu5c/Pz8/57yCPz8/Pz8/55GwPz8/Pz/nkZU/Pz8/Pz8/Pz8/55Cb44OkPz8/Pz8/P+iKpT8/QVNDSUk/Pz8/Pz9VVEYtOOe8gj8/Pz8/P+eRsD8/6ZSbPwot5r+hPz8/P+a1oz/mtaPot6g/P1VURi0457yCPz8/Pz8/55GwPz8/Pz8/Pz8/Pz/mtaDorrk/Pz8/772EPz/mtaM/54GPP+a1vD8/P+Werj8/5raTP+a1nD8/Pz8/P+iXiT8/Pz8/Pz8/54CbP+e7lz8/Pz8/Pz/mo7A/Pz8/Civpgq7ku7blrqLmiLfnq6/kuI3og73mlLnlj5jmlofmnKznmoTlrZfnrKbpm4bnvJbnoIHmlrnlvI/jgILopoHlj5HpgIHnmoTooaXkuIHlj6rog73mmK9BU0NJSeaIluiAhVVURi0457yW56CB5pa55byP77yMCivlpoLmnpzkvaDkvb/nlKhVVEYtOOe8lueggeaWueW8j+WPkemAgemCruS7tu+8jOmCo+S5iOS9oOWwhuS8mumBv+WFjeS4gOS6m+WPr+iDveWPkeeUn+eahOWtl+espumbhumXrumimOOAggogCi0/Pz/mtaDot7o/44ihP+mjjj8/5pC0P+eSh+ODpeiIsD8/P+mqnuactT8/5reHPz8/PyBSZWZlcmVuY2VzOiA/Pz8/Pz8gSW4tUmVwbHktVG86ID8/P+ajsD/plJs/Pz/vvYQ/PwotPz8/5rWg5oOwPz/mo7A/54GP5Y+YPz/mtbw/5raTPz8/Pz8/Pwor6YKu5Lu25a6i5oi356uv5bqU6K+l5b2i5oiQ5bm25LiU5L+d5oyBIFJlZmVyZW5jZXM6IOaIluiAhSBJbi1SZXBseS1Ubzog5qCH6aKY77yM6YKj5LmICivpgq7ku7bor53popjlsLHkuI3kvJrkuK3mlq3jgIIKIAot5r62Pz8/5YmBPz/nlK8/KD8/Pz8/Pz8/P+eSkOWvuD8/55SvPyk/Pz/nlK/plZA/Pz8/55WMP+OEpD8/55Cb44OkPz/plJs/Pz8/5raT5ZOEP+aDsOOAg+e7lz/mtbw/5p2ePz8/P+a2k+iZueKUlj8/56y6Pz/mtaPot6g/P3hjbGlwYm9hcmQsIHhjbGlwCi0/Pz8/Pz94Y3V0c2Vs5raUP+eSgeeovz8/5rWg44OvPz/mtaM/Pz8/Pz8/5r+C6IqlPz/nkoc/5raTP+a2kz8/Pz8/Pz8/P+Werj8/5rWj6LeoP+OEpT8/Pz/liYE/P+eUrz8/Pz8KK+WkjeWItueymOW4lijmiJbogIXliarotLTnspjluJYp6YCa5bi45LiN6IO955So5LqO6KGl5LiB77yM5Zug5Li65Yi26KGo56ym5Lya6L2s5o2i5Li656m65qC844CC5L2/55SoeGNsaXBib2FyZCwgeGNsaXAKK+aIluiAhXhjdXRzZWzkuZ/orrjlj6/ku6XvvIzkvYbmmK/mnIDlpb3mtYvor5XkuIDkuIvmiJbogIXpgb/lhY3kvb/nlKjlpI3liLbnspjluJbjgIIKIAot5raTP+eRlT8/P+OEpOWohz8/P1BHUC9HUEfnvIPmj5I/Pz8/Pz8/P+a1oOacteiFkT8/Pz8/P+eQm+ODpD8/Pz8/5p2pPz8/6JyCPz/mtaPlnq4/P+WvsD/mvrY/Pz8/Pz8/5raTPz8/5YCfP+ivsj8/Pz8/Pz8/Pz/jhKQ/P+a1oz8/Pz/nkJvjg6Q/Pz8/Pwot6ZSbP+adqT/mtpM/Pz8/5qOwP+aQtD/nkofjg6Y/Pz8/P+a1oOODpOaFqOa+tj8/Pz/plJs/CivkuI3opoHlnKjkvb/nlKhQR1AvR1BH572y5ZCN55qE6YKu5Lu25Lit5YyF5ZCr6KGl5LiB44CC6L+Z5qC35Lya5L2/5b6X5b6I5aSa6ISa5pys5LiN6IO96K+75Y+W5ZKM6YCC55So5LqO5L2g55qE6KGl5LiB44CCCivvvIjov5nkuKrpl67popjlupTor6XmmK/lj6/ku6Xkv67lpI3nmoTvvIkKIAotPz/jhKc/Pz8/Pz8/5pCBPz/mtaDot7o/P+eQm+OEpT8/Pz8/55Cb44OkPz/mtpQ/Pz8/6ZSbP+e8gT8/Pz/lrrjljZ4/Pz8/P+a2kz/mtpM/55Cb44OkPz8/Pz/mtpM/5raTPz8/Pz8/P+a2k+e7mD8/6ZSbP+a3hz/ngJs/Pz/jg6Y/6Le6P+aJrj8/Ci0/Pz/mtaDorrk/P+eBjz/nkJvjg6Q/Pz8/PydwYXRjaCc/P+aIkuaKpD8/P+a2kz/plJs/5r+hPz8/Pz8/Pz8/P+a1nD/plJs/Pz8/57yBPz8/Pz8/5pCBPz/mtaDot7o/P+eQm+OEpT8/Pz8/Pz8/CivlnKjnu5nlhoXmoLjpgq7ku7bliJfooajlj5HpgIHooaXkuIHkuYvliY3vvIznu5noh6rlt7Hlj5HpgIHkuIDkuKrooaXkuIHmmK/kuKrkuI3plJnnmoTkuLvmhI/vvIzkv53lrZjmjqXmlLbliLDnmoQKK+mCruS7tu+8jOWwhuihpeS4geeUqCdwYXRjaCflkb3ku6TmiZPkuIrvvIzlpoLmnpzmiJDlip/kuobvvIzlho3nu5nlhoXmoLjpgq7ku7bliJfooajlj5HpgIHjgIIKIAogCi3mtpM/5rWcPz8/P+a1oOi3uj/jiKE/6aOOPz8/Pz/nu4A/CivkuIDkupvpgq7ku7blrqLmiLfnq6/mj5DnpLoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLeadqT8/Pz/nvIE/Pz/ovbA/P+a1nD/nkoc/57yBPz8/P01VQT8/P+e8gz8/Pz/nu4DnjLQ/Pz8/P+a1oOODpz/jhKQ/P+e8gT9MaW51eD8/Pz8/56i/Pz8/Pz/nkJvjg6Q/Pz8/P+adqT/mtZw/6aqe5py1Pz8/Pz8/P+iZqz8/Ci0/Pz8/Pz8/Pz/mnZ4/5rWg6Le6Pz8/Pz/nvIM/Pz/ojaQ/Pz8/Pwor6L+Z6YeM57uZ5Ye65LiA5Lqb6K+m57uG55qETVVB6YWN572u5o+Q56S677yM5Y+v5Lul55So5LqO57uZTGludXjlhoXmoLjlj5HpgIHooaXkuIHjgILov5nkupvlubbkuI3mhI/lkbPmmK8KK+aJgOacieeahOi9r+S7tuWMhemFjee9ruaAu+e7k+OAggogCi3nkoflrZg/P+mUmz8KLVRVSSA9IOa1oOODpj8/Pz8/5raT5ZOEP+iZuT8/Pz8/Pz/jhKY/6ZSLP+ODpT8/Ci1HVUkgPSA/P+aDp+iIsD8/Pz8/44iiP+OEpj/plIs/44OlPz8KK+ivtOaYju+8mgorVFVJID0g5Lul5paH5pys5Li65Z+656GA55qE55So5oi35o6l5Y+jCitHVUkgPSDlm77lvaLnlYzpnaLnlKjmiLfmjqXlj6MKIAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIEFscGluZSAoVFVJKQogCi0/Pz/nvIM/Pz8/5qSk55m4Pz8KLT8/PyJTZW5kaW5nIFByZWZlcmVuY2VzIj8/44SlPz/plJs/CivphY3nva7pgInpobnvvJoKK+WcqCJTZW5kaW5nIFByZWZlcmVuY2VzIumDqOWIhu+8mgogCi0tICJEbyBOb3QgU2VuZCBGbG93ZWQgVGV4dCLouYc/5qSk6K+yPz8/Pz8KLS0gIlN0cmlwIFdoaXRlc3BhY2UgQmVmb3JlIFNlbmRpbmci6LmHP+akpOivsj/mir0/PworLSAiRG8gTm90IFNlbmQgRmxvd2VkIFRleHQi5b+F6aG75byA5ZCvCistICJTdHJpcCBXaGl0ZXNwYWNlIEJlZm9yZSBTZW5kaW5nIuW/hemhu+WFs+mXrQogCi3opLA/Pz8/Pz8/5rWg6Ii1P+iuuT8/Pz8/Pz8/5pC0P+eSh+ODpj/mg6c/44Soy4nmtpM/5rW8Pz8/6Jm5P+aJrj8/Pz/niYg/55m4Pz8/P+i3uj8/Pz8/5raTP0NUUkwtUue8gT8/Pz8/Pz/plJs/5rWj5oyOPz/ngLk/Pz8/Ci3nkJvjg6Q/Pz8/P+a1oOi3uj8/Pz/jg6U/5Ly0Pz/mtaDmnLXohZE/Pz8KK+W9k+WGmemCruS7tuaXtu+8jOWFieagh+W6lOivpeaUvuWcqOihpeS4geS8muWHuueOsOeahOWcsOaWue+8jOeEtuWQjuaMieS4i0NUUkwtUue7hOWQiOmUru+8jOS9v+aMh+WumueahAor6KGl5LiB5paH5Lu25bWM5YWl5Yiw6YKu5Lu25Lit44CCCiAKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBFdm9sdXRpb24gKEdVSSkKIAot5raTP+a1nD/lr64/Pz8/Pz8/Pz8/Pz8/Pz8/5rWj6LeoP+OEpT8/Pz8/Pz8/55Cb44OkPz8KK+S4gOS6m+W8gOWPkeiAheaIkOWKn+eahOS9v+eUqOWug+WPkemAgeihpeS4gQogCi3opLA/Pz8/Pz/ilYU/P+a1oOWglT8/5qSk55m4Pz9QcmVmb3JtYXQKLSAg5rWgP0Zvcm1hdC0+SGVhZGluZy0+UHJlZm9ybWF0dGVkIChDdHJsLTcpPz8/Pz8/5a6444OlP+mUiz8/CivlvZPpgInmi6npgq7ku7bpgInpobnvvJpQcmVmb3JtYXQKKyAg5LuORm9ybWF0LT5IZWFkaW5nLT5QcmVmb3JtYXR0ZWQgKEN0cmwtNynmiJbogIXlt6XlhbfmoI8KIAotPz/ot7o/P+a1o+i3qD8/6ZSbPwotICBJbnNlcnQtPlRleHQgRmlsZS4uLiAoQWx0LW4geCk/Pz8/P+ODqMuJ5raTPz8/P+a1oOi6sj8/CivnhLblkI7kvb/nlKjvvJoKKyAgSW5zZXJ0LT5UZXh0IEZpbGUuLi4gKEFsdC1uIHgp5o+S5YWl6KGl5LiB5paH5Lu244CCCiAKLea1oz/mnak/Pz8/5rWgPyJkaWZmIC1OcnUgb2xkLmMgbmV3LmMgfCB4Y2xpcCLplJs/Pz8/Pz8/UHJlZm9ybWF06ZSbPz8/6Le6Pz/mtaPot6g/44Sk6IWRPz/mkq4/P+adqT/nkJs/57uuP+eUrz8/Pz8KK+S9oOi/mOWPr+S7pSJkaWZmIC1OcnUgb2xkLmMgbmV3LmMgfCB4Y2xpcCLvvIzpgInmi6lQcmVmb3JtYXTvvIznhLblkI7kvb/nlKjkuK3pl7TplK7ov5vooYznspjluJbjgIIKIAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIEttYWlsIChHVUkpCiAKLea2kz/mtZw/5a+uPz8/Pz8/Pz8/Pz8/Pz8/P+a1o+i3qD/jhKU/Pz8/Pz8/P+eQm+ODpD8/Pz8/CivkuIDkupvlvIDlj5HogIXmiJDlip/nmoTkvb/nlKjlroPlj5HpgIHooaXkuIHjgIIKIAot5qabP+eSgeOCiD/liafnlobmtpM/5raTP0hUTUw/P+eFjj8/Pz8/Pz8/Pz8/Pz8/6ZSbP+a2kz/nkZU/Pz8/Pz/jhKU/Pz8/Pwor6buY6K6k6K6+572u5LiN5Li6SFRNTOagvOW8j+aYr+WQiOmAgueahO+8m+S4jeimgeWQr+eUqOWug+OAggogCi3opLA/5raUPz8/P+a2kz/ngY8/Pz8/5rWg5YmBPz8/P+i3uj8/6ZSbPz8/44SpPz/mpKTpgJs/Pz8/P+a2kz/nkZU/Pz8/Pz/ilYQ/Pz8/44SmP+OIoz8/Pz8/Pz8/5raTPz8/P+e8guiZuT/nkbDmsKg/Pz/mtaM/Pz/jhKk/P+a1oOacteiFkeadiD8/P+ODpz8/5rWg6K6zPz8/Pz8/Pz8KLT8/5oiSPz/mtbw/55CaPz8/Pz8/44SmP+OIoz8/6ZSbPz8/P+WnneOChD8/6LmHP+akpOivsj/jhKU/Pz8/P+eQm+ODpD8/5raUPz8/Pz8/Pz8/44SmP+OIoz8/Pz8/Pz8/57ugPz8/Pz8/Pz8/6KeEPz/ngY/ovqg/Pz8/Pz8/44SoPz8/P+OEpj/jiKM/Pz8/44Ok5YqfPz8/Pz8/5rWg6K65Pz8KLT8/6Le6Pz8/Pz/ngLk/5reHP+eAmz/mtpPpuL8/P+e7i+ijpD8/5raTPz8/P+a1oz8/P+OEqD8/57uL5aS46IWRPz8/5aiG4oSDPz/lr64/54C5P+mUmz/ngLk/5a646IysPz8/P+OEqT/jhKg/Pz8/44SmP+OIoz8/5rWcP+mUmz8/P++9hD8/5rWjPz8/Pz8/P+a1oOaDsD/nlYw/6Ii155eFPz8/Ci0/Pz8/P+KVhD8/Pz/jhKY/44ijPz/plJs/5rWjPz8/P+adqT/mtpM/5rW8P+a+tuWNnj/or7Llh6E/Pz8/Pz8/Pz8/P+OEpj/jiKM/Pz8/Pwor5b2T5Lmm5YaZ5LiA5bCB6YKu5Lu255qE5pe25YCZ77yM5Zyo6YCJ6aG55LiL6Z2i5LiN6KaB6YCJ5oup6Ieq5Yqo5o2i6KGM44CC5ZSv5LiA55qE57y654K55bCx5piv5L2g5Zyo6YKu5Lu25Lit6L6T5YWl55qE5Lu75L2V5paH5pysCivpg73kuI3kvJrooqvoh6rliqjmjaLooYzvvIzlm6DmraTkvaDlv4XpobvlnKjlj5HpgIHooaXkuIHkuYvliY3miYvliqjmjaLooYzjgILmnIDnroDljZXnmoTmlrnms5XlsLHmmK/lkK/nlKjoh6rliqjmjaLooYzmnaXkuablhpnpgq7ku7bvvIwKK+eEtuWQjuaKiuWug+S/neWtmOS4uuiNieeov+OAguS4gOaXpuS9oOWcqOiNieeov+S4reWGjeasoeaJk+W8gOWug++8jOWug+W3sue7j+WFqOmDqOiHquWKqOaNouihjOS6hu+8jOmCo+S5iOS9oOeahOmCruS7tuiZveeEtuayoeaciQor6YCJ5oup6Ieq5Yqo5o2i6KGM77yM5L2G5piv6L+Y5LiN5Lya5aSx5Y675bey5pyJ55qE6Ieq5Yqo5o2i6KGM44CCCiAKLT8/44SpPz/mtaDliYE/P+aQtD8/Pz/plJs/Pz8/Pz/jg6jLiea2kz/mtpQ/Pz8/6ZSbPz8/5Y+lPz/nlK/lk6U/44SnPz/nkJvjg6Q/P+eAuT8/Pz/nu5c/6ZSbP+a2kz/mtpM/5p2pP+eAmz8/Pz8oLS0tKT8/Pwor5Zyo6YKu5Lu255qE5bqV6YOo77yM5o+S5YWl6KGl5LiB5LmL5YmN77yM5pS+5LiK5bi455So55qE6KGl5LiB5a6a55WM56ym77ya5LiJ5Liq6L+e5a2X5Y+3KC0tLSnjgIIKIAotPz/ot7o/Pz8/PyJNZXNzYWdlIj8/Pz8/Pz8/77yEPz/plJs/Pz8/Pz/ilYI/Pz8/44OmPz/mtaDorrk/Pz8/44OnPz8/Pz8/Pz/mtaM/Pz8/55Cb44OkPz8/Pz/mtaDourI/P+adqT8/Pz/mtpM/5raTP+ajsD/mvrY/Pz8/Pz8/5qSk55m4Pz/mtaM/Pz8/5rWgPwotPz8/5p2pP+eAuT8/Pz/nvIM/5rWjPz8/Pz8/P+a1oOi3uue8k+e7lD/lrrjjg6U/6ZSLPz8/Pz8/Pz/plJs/5p2pPz8/P+a1oOODpeeUq+a2kz8iaW5zZXJ0IGZpbGUiPz/ngqw/Pz8/Pwor54S25ZCO5ZyoIk1lc3NhZ2Ui6I+c5Y2V5p2h55uu77yM6YCJ5oup5o+S5YWl5paH5Lu277yM5o6l552A6YCJ5Y+W5L2g55qE6KGl5LiB5paH5Lu244CC6L+Y5pyJ5LiA5Liq6aKd5aSW55qE6YCJ6aG577yM5L2g5Y+v5LulCivpgJrov4flroPphY3nva7kvaDnmoTpgq7ku7blu7rnq4vlt6XlhbfmoI/oj5zljZXvvIzov5jlj6/ku6XluKbkuIoiaW5zZXJ0IGZpbGUi5Zu+5qCH44CCCiAKLea1oz8/Pz/mtaDjg6U/Pz8/44SlP+S8tD8/5p2pP0dQRz8/P+eSgeS8tD8/5rWg6K65Pz/mtaM/Pz8/Pz8/5a6TP+eQm+ODpD8/Pz8/5r+C5oiSPz/nkZU/5rWj6LeoPz9HUEc/Pz/nkoHmnb8/P+a1oD8/Pz/mtaM/5raT5ZOEPz/lrpM/Pz8/Pz8/Pz8/57ub5oOnPz/nkJvjg6Q/P+mUmz8KLeiksD/mtaA/R1BH5raTPz8/Pz8/PzfmtaM/57yCPz8/Pz8/5py1Pz/mtaPlpLg/P+a1oD8/Pz8/Pz8/P+adkT8/5r62Pz8/Pz8/Pwor5L2g5Y+v5Lul5a6J5YWo5Zyw6YCa6L+HR1BH5qCH6K6w6ZmE5Lu277yM5L2G5piv5YaF5bWM6KGl5LiB5pyA5aW95LiN6KaB5L2/55SoR1BH5qCH6K6w5a6D5Lus44CC5L2c5Li65YaF5bWM5paH5pys55qE562+5Y+R6KGl5LiB77yMCivlvZPku45HUEfkuK3mj5Dlj5Y35L2N57yW56CB5pe25Lya5L2/5LuW5Lus5Y+Y55qE5pu05Yqg5aSN5p2C44CCCiAKLea/oT8/Pz/mtaM/Pz8/55GVP+a1oOODqT8/5rWg5YmBPz/opLDjiKA/Pz8/Pz8/P+eQm+ODpD8/6ZSbPz8/772EPz/ngY/ljZ4/5oq9Pz8/P+eRsD/lqZo/P+a1oOiuuT8/Pz/ot7o/Pz8/P+a2kz/ngZ4/Pz/RjT8/57uQPz8/PyJTdWdnZXN0IGF1dG9tYXRpYwotZGlzcGxheSLplJs/5p2pPz8/5bOwPz/lrpM/Pz8/5rWg6Ii1P+adkT/op4Q/P+eSgeKVhD/mmI8/Pz8/Pz8/6IisPz8KK+WmguaenOS9oOmdnuimgeS7pemZhOS7tueahOW9ouW8j+WPkemAgeihpeS4ge+8jOmCo+S5iOWwseWPs+mUrueCueWHu+mZhOS7tu+8jOeEtuWQjumAieS4reWxnuaAp++8jOeqgeWHuiJTdWdnZXN0IGF1dG9tYXRpYworZGlzcGxheSLvvIzov5nmoLflhoXltYzpmYTku7bmm7TlrrnmmJPorqnor7vogIXnnIvliLDjgIIKIAot6KSwP+a1oz/nkZU/5reHP+eAmz/ngY8/55GVPz8/Pz8/Pz8/Pz8/P+Wukz8/Pz8/Pz/nkJvjg6Q/P+mUmz/mtaM/Pz8/5rWg44OkPz/lqJE/Pz8/Pz8/55Cb44SnPz8/P+WluD8/Pz/ilYE/Pz8/P+eQm+ODpD8/Pz8/Pz8/5rWg6K65Pz8/P+i3uj8/Pz/lhrI/5amaPz8/Pz8KLSJzYXZlIGFzIj8/P+a1oz8/Pz/mtaDjg6TlqIc/P+OEpD8/5raTP+WojOKEgz8/Pz/lrZg/5ZytPz8/Pz8/Pz/nkJvjg6Q/Pz8/Pz8/P+a1oOiuuT8/5r+hPz8/P+eAuT8/Pz/mtaDjg6Y/772H4oCYPz8/6KSw44igPz/nvIE/Pz8/Pz8/6KSwP+a1oz/lp53vvYc/Pz8/44SlPz8KLT8/P+WuuOi+qT8/57uQPz8/772EPz/mtpM/54C1Pz8/P+mUmz8/P++9hj/oiLXnl4U/Pz8/Pz/mpKTnkbA/P+a1oOODpD8/54CbPz8/P+a1oD8tLeWuuOiMrD8/Pz8/5raTP+a2kz/mnak/Pz/po44/P2J1Z+eQmj/lp7k/Pz/jg6U/6aKBPz9rbWFpbD8/P2J1Z3ppbGxhCi3pqp7mnLU/P+eUrz8/Pz/mnak/54GPP+a1vD/nkJo/5r62Pz8/Pz8/Pz8/P+a1oOiItT8/5rWg44OlPz8/Pz/ngLXop4Q/P+a2kz8/P+OEpj/ls7A/P+eSh+ivsj8/Pz8/Pz8/Pz8/55CaP+a3hz/ngJs/Pz8/6ZSbPz8/P+a1oOODpT8/Pz8/5rWjPz8/6JmrPz8/Pz/mtaDot7o/Pz8/6Le6P+advz/mnLU/Pz8/54mIP+eZuD8/Ci3mtaM/5raTP+WvsD/mtpM/Pz8/5rWgP+a1oD8/Pz8/Pz8/Pz8/P+mAm+i0n+e8gT8/Pz8/Pz8/P+e/oD8/Pz8/55KH5rGHPz8KK+W9k+S9oOimgeS/neWtmOWwhuimgeWPkemAgeeahOWGheW1jOaWh+acrOihpeS4ge+8jOS9oOWPr+S7peS7jua2iOaBr+WIl+ihqOeql+agvOmAieaLqeWMheWQq+ihpeS4geeahOmCruS7tu+8jOeEtuWQjuWPs+WHu+mAieaLqQorInNhdmUgYXMi44CC5L2g5Y+v5Lul5L2/55So5LiA5Liq5rKh5pyJ5pu05pS555qE5YyF5ZCr6KGl5LiB55qE6YKu5Lu277yM5aaC5p6c5a6D5piv5Lul5q2j56Gu55qE5b2i5byP57uE5oiQ44CC5b2T5L2g5q2j55yf5Zyo5a6DCivoh6rlt7HnmoTnqpflj6PkuYvkuIvlr5/nnIvvvIzpgqPml7bmsqHmnInpgInpobnlj6/ku6Xkv53lrZjpgq7ku7YtLeW3sue7j+acieS4gOS4qui/meagt+eahGJ1Z+iiq+axh+aKpeWIsOS6hmttYWls55qEYnVnemlsbGEKK+W5tuS4lOW4jOacm+i/meWwhuS8muiiq+WkhOeQhuOAgumCruS7tuaYr+S7peWPqumSiOWvueafkOS4queUqOaIt+WPr+ivu+WGmeeahOadg+mZkOiiq+S/neWtmOeahO+8jOaJgOS7peWmguaenOS9oOaDs+aKiumCruS7tuWkjeWItuWIsOWFtuS7luWcsOaWue+8jAor5L2g5LiN5b6X5LiN5oqK5LuW5Lus55qE5p2D6ZmQ5pS55Li657uE5oiW6ICF5pW05L2T5Y+v6K+744CCCiAKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBMb3R1cyBOb3RlcyAoR1VJKQogCi3mtpM/55GVP+a1o+i3qD/jhKU/Pz8/Pwor5LiN6KaB5L2/55So5a6D44CCCiAKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBNdXR0IChUVUkpCiAKLeWvsD/mvrY/TGludXjlr64/Pz8/5rWc5ZOEPz/mtaPot6g/P211dHTngLnjiKE/6aOOPz/plJs/Pz8/5rWg44OoPz8/Pz/ngLk/Pz8/54C5P+WuuOODpD8/Pz8/Pz8/55Sv5ZGKPz/mtZw/Pz8/CivlvojlpJpMaW51eOW8gOWPkeS6uuWRmOS9v+eUqG11dHTlrqLmiLfnq6/vvIzmiYDku6Xor4HmmI7lroPogq/lrprlt6XkvZznmoTpnZ7luLjmvILkuq7jgIIKIAotTXV0dOa2kz8/Pz/nlK8/57yCP+adiD8/Pz/plJs/Pz8/5rWg44OkPz/nu6DigLI/P+a1o+i3qD/jhKQ/P+a2lD/nvII/5p2IPz8/44SpP+aIkj8/5pC0P+eSh+ODpeeUqz8/Pz8/Pz8/44SmPz/nkJs/Pz8/5r620YM/Pz8/5omuPz/mnYg/Pz/jhKk/6JeJ55SrPz8/Ci3mtpM/5raTPyJpbnNlcnQgZmlsZSI/Pz/mpKTnmbg/P+eAuT8/Pz/mtaDjg6k/P+adqT/mtpM/Pz/nkbA/Pz8/P+a1oOi3uj8/54C55ZytPz8/P+eRsD8/Pz8/Pz/jg6Y/P+a1oOi6sj8/CitNdXR05LiN6Ieq5bim57yW6L6R5Zmo77yM5omA5Lul5LiN566h5L2g5L2/55So5LuA5LmI57yW6L6R5Zmo6YO95LiN5bqU6K+l5bim5pyJ6Ieq5Yqo5pat6KGM44CC5aSn5aSa5pWw57yW6L6R5Zmo6YO95bim5pyJCivkuIDkuKoiaW5zZXJ0IGZpbGUi6YCJ6aG577yM5a6D5Y+v5Lul6YCa6L+H5LiN5pS55Y+Y5paH5Lu25YaF5a6555qE5pa55byP5o+S5YWl5paH5Lu244CCCiAKLSd2aW0n5rWjP+a2kz9tdXR0Pz8/57yCP+adiD8/Pz/plJs/CisndmltJ+S9nOS4um11dHTnmoTnvJbovpHlmajvvJoKICAgc2V0IGVkaXRvcj0idmkiCiAKLSAg5r+hPz8/P+a1o+i3qD8/eGNsaXDplJs/Pz/mj5I/44Ok5LqS5raTPz8/5oiS5oqkCisgIOWmguaenOS9v+eUqHhjbGlw77yM5pWy5YWl5Lul5LiL5ZG95LukCiAgIDpzZXQgcGFzdGUKLSAgPz8/5raTPz8/P+a2lD8/Pz8/Pz8/Pz9zaGlmdC1pbnNlcnQ/Pz8/Pz/mtaPot6g/PworICDmjInkuK3plK7kuYvliY3miJbogIVzaGlmdC1pbnNlcnTmiJbogIXkvb/nlKgKICAgOnIgZmlsZW5hbWUKIAot5r+hPz8/Pz8/5a6gPz8/Pz/nkJvjg6Q/P+a1oz/mtpPlk4Q/P+Wukz8/Pz8/Pz8/Pz8KLShhKXR0YWNo5a6444OkPz8/Pz/lr7A/5r+C5pakPz/mtpM/55SvPz8/PyJzZXQgcGFzdGUiPz8/CivlpoLmnpzmg7PopoHmiorooaXkuIHkvZzkuLrlhoXltYzmlofmnKzjgIIKKyhhKXR0YWNo5bel5L2c55qE5b6I5aW977yM5LiN5bim5pyJInNldCBwYXN0ZSLjgIIKIAotPz8/57yDPz8/P+akpOeZuD8/Ci3ngLk/5pC0P+eSh+ODpOS6kuammz/nkoHjgog/5Ymn55aGPz8/6KSw44igPz/lrrjjg6Q/Pz8/PwotPz/mg7A/P+mUmz8/Pz8ic2VuZF9jaGFyc2V0IueSgeWJp+eWhua2kz8idXMtYXNjaWk6OnV0Zi04Iua2lD8/Pz/mtpM/5raTP+a2kz8/Pz8/Pz/mtpPnu5g/Pz8/Pwor6YWN572u6YCJ6aG577yaCivlroPlupTor6Xku6Xpu5jorqTorr7nva7nmoTlvaLlvI/lt6XkvZzjgIIKK+eEtuiAjO+8jOaKiiJzZW5kX2NoYXJzZXQi6K6+572u5Li6InVzLWFzY2lpOjp1dGYtOCLkuZ/mmK/kuIDkuKrkuI3plJnnmoTkuLvmhI/jgIIKIAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFBpbmUgKFRVSSkKIAotUGluZeadqT8/P+e7mD8/5raTP+a1nD/nu4zng5g/54WOPz8/Pz8/Pz/mo7A/6ZSbP+a1oz8/Pz/mnak/5rWcPz8/5p2/P+OEpT8/55KH44OpP+WAnz8/5reHP+a+tj/mtZw/Pz8/CitQaW5l6L+H5Y675pyJ5LiA5Lqb56m65qC85Yig5YeP6Zeu6aKY77yM5L2G5piv6L+Z5Lqb546w5Zyo5bqU6K+l6YO96KKr5L+u5aSN5LqG44CCCiAKLea/oT8/Pz8/Pz/mtaDjg68/P+eSh+icguWohz8/P2FscGluZShwaW5lPz8/57yB0YQ/6IOvPz8pCivlpoLmnpzlj6/ku6XvvIzor7fkvb/nlKhhbHBpbmUocGluZeeahOe7p+aJv+iAhSkKIAotPz8/57yDPz8/P+akpOeZuD8/Ci0tID8/P+adqT8/Pz8/Pz8/Pz8/Pz/nkZU/5aiRPz8/44KGPz/nu4s/Pz8/Pz8/Ci0tICJuby1zdHJpcC13aGl0ZXNwYWNlLWJlZm9yZS1zZW5kIj8/P+akpOmAmz8/Pz8/Pz8/55GVPz8/Pz8/Pwor6YWN572u6YCJ6aG577yaCistIOacgOi/keeahOeJiOacrOmcgOimgea2iOmZpOa1geeoi+aWh+acrAorLSAibm8tc3RyaXAtd2hpdGVzcGFjZS1iZWZvcmUtc2VuZCLpgInpobnkuZ/mmK/pnIDopoHnmoTjgIIKIAogCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogU3lscGhlZWQgKEdVSSkKIAotLSA/Pz/lrpM/Pz8/Pz8/Pz8/5rWg44OlPz/mv4LnlYw/P+WuuOODpD8/6ZSbPz8/Pz8/P+a1o+i3qD/jhKk/P+a1oOiuuT8/Pz8/Ci0tID8/P+eSgemVkOWohz8/44SlPz8/P+OEpz8/57yCP+adiD8/P+OEoz8/Ci0tIOeAtemAmz8/Pz8/6KSwP+adiD/mvrY/Pz/loJU/P+eUr+WRij8/Pz8/Ci0tIOa/oT8/Pz8/Pz/mnak/bm9uLVNTTOadqT8/P+ODrz8/Pz8/5aiJP+a1o+i3qD8/VExTIFNNVFA/Pz8/Pz8/Pz8KLS0gPz/jhKc/Pz8/P+e7kD8/P++9hOiFkT8/P+a2kz/mtpM/5a+wPz8/Pz8/44SnPz9ydWxlciBiYXI/Pz8KLS0g57yBPz8/5p2/Pz8/Pz/mtpM/5aij6K+yPz8/P+advz8/54GP5Y+YPz/mtbw/5aed772H4oCYPz8/5rWcP+eRme+9hj/liafjgZo/Pz8/Pz8KKy0g5YaF5bWM5paH5pys5Y+v5Lul5b6I5aW955qE5bel5L2c77yI5oiW6ICF5L2/55So6ZmE5Lu277yJ44CCCistIOWFgeiuuOS9v+eUqOWklumDqOeahOe8lui+keWZqOOAggorLSDlr7nkuo7nm67lvZXovoPlpJrml7bpnZ7luLjmhaLjgIIKKy0g5aaC5p6c6YCa6L+Hbm9uLVNTTOi/nuaOpe+8jOaXoOazleS9v+eUqFRMUyBTTVRQ5o6I5p2D44CCCistIOWcqOe7hOaIkOeql+WPo+S4reacieS4gOS4quW+iOacieeUqOeahHJ1bGVyIGJhcuOAggorLSDnu5nlnLDlnYDmnKzkuK3mt7vliqDlnLDlnYDlsLHkuI3kvJrmraPnoa7nmoTkuobop6PmmL7npLrlkI3jgIIKIAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFRodW5kZXJiaXJkIChHVUkpCiAKLeammz/nkoHjgoY/Pz8/5YW4Pz/plJs/dGh1bmRlcmJpcmTlr7A/54C56KeEPz8/Pz8/Pz8/Pz8/Pz/plJs/5rWjPz8/P+adqT8/Pz/mtpM/5rWcPz8/6KeEPz8/Pz/mtaDjg6Xlt7E/P+i3uj8/Pz8/5a+wPz8/5p2R44K9Pz8/Civpu5jorqTmg4XlhrXkuIvvvIx0aHVuZGVyYmlyZOW+iOWuueaYk+aNn+Wdj+aWh+acrO+8jOS9huaYr+i/mOacieS4gOS6m+aWueazleWPr+S7peW8uuWItuWug+WPmOW+l+abtOWlveOAggogCi0tID8/44SnP+OEpj/ls7A/Pz8/55avP+WJp+eWhj8/P+mUmz/nvIE/Pz8/Pz8/54C16K+yPz/plJs/5raTP+eRlT8/Pz8/Pz8iQ29tcG9zZSBtZXNzYWdlcyBpbiBIVE1MIGZvcm1hdCI/Pz8KKy0g5Zyo55So5oi35biQ5Y+36K6+572u6YeM77yM57uE5oiQ5ZKM5a+75Z2A77yM5LiN6KaB6YCJ5oupIkNvbXBvc2UgbWVzc2FnZXMgaW4gSFRNTCBmb3JtYXQi44CCCiAKLS0g57yCP+adiD/mtaM/Pz8/VGh1bmRlcmJpcmQ/Pz/nvIM/55KB5Ymn55aGPz/jg6TlqIfngLk/5raTP+eRlT8/Pz/nkJs/5rWj6LeoPz/plJs/dXNlcl9wcmVmKCJtYWlsbmV3cy53cmFwbGVuZ3RoIiwgMCk7CistIOe8lui+keS9oOeahFRodW5kZXJiaXJk6YWN572u6K6+572u5p2l5L2/5a6D5LiN6KaB5ouG6KGM5L2/55So77yadXNlcl9wcmVmKCJtYWlsbmV3cy53cmFwbGVuZ3RoIiwgMCk7CiAKLS0g57yCP+adiD/mtaM/Pz8/VGh1bmRlcmJpcmQ/Pz/nvIM/55KB5Ymn55aG6ZSbP+a1o+Werj8/5raTP+eRlT/mtaPot6g/PyJmb3JtYXQ9Zmxvd2VkIj8/54WOPz/plJs/dXNlcl9wcmVmKCJtYWlsbmV3cy4KKy0g57yW6L6R5L2g55qEVGh1bmRlcmJpcmTphY3nva7orr7nva7vvIzkvb/lroPkuI3opoHkvb/nlKgiZm9ybWF0PWZsb3dlZCLmoLzlvI/vvJp1c2VyX3ByZWYoIm1haWxuZXdzLgogICBzZW5kX3BsYWludGV4dF9mbG93ZWQiLCBmYWxzZSk7CiAKLS0g5rWjPz8/P+eRlT/mtaM/VGh1bmRlcmJpcmQ/Pz/mtpPmtKo/Pz8/Pz8/54WOPz8/P+eRsD8/6ZSbPwotICDmv6E/Pz8/5qabP+eSgeOChj8/Pz/lhbg/P+a1oz/mtpQ/Pz8/Pz8/Pz8/SFRNTD8/54WOPz/plJs/Pz/vvYQ/Pz8/P+WvsD8/P+S/sT8/5rWgP+a1oD/mtaA/Pz8/5qOwPz8/Pz8/P+a2kz8/Pz/lppc/5raTPz8/Pz8/PyJQcmVmb3JtYXQiPz/nhY4/Pz8/PwotICDmv6E/Pz8/5qabP+eSgeOChj8/Pz/lhbg/P+a1oz/mtpQ/Pz8/Pz8/Pz8/Pz8/Pz8/Pz/nhY4/P+mUmz/mtaM/5raTP+WvsD8/Pz/ngLk/Pz/pgJvotJ9IVE1MPz/nhY4/P+mUmz/mtaA/5rWgP+a1oz/mtpPovbA/P+WohuKEgz/RhT8/6ZSbPz8/44Ok5YqfPz8/Pz/mia4/P+WokT8/Pz/plJs/Ci0gID8/6Le6Pz/lr67lk4Q/5py15aiH54C5Pz8/Pz8/54mIPz8/Pz8/P+eFjj8/6ZSbPz8/Pz8/P+eAuT/ngY/lj5g/Pz8/P+eQmz8/Pz/nkZU/54C5Pz8/5p2/Pz/plJs/Pz/jhKU/P+a3h++8hD8/Pz/ngqw/P+a2kz/mtaPot6g/P3NoaWZ0Pz8/Pz/jg6TlqIfngLk/Pz8/5raTP0hUTUwKLSAgPz/nhY4/P+mUmz8/P+i3uj8/Pz8/5qOwPz8/Pz8/P+a2kz8/Pz/lppc/5raTPz8/Pz8/PyJQcmVmb3JtYXQiPz/nhY4/Pz8/PworLSDkvaDpnIDopoHkvb9UaHVuZGVyYmlyZOWPmOS4uumihOWFiOagvOW8j+aWueW8j++8mgorICDlpoLmnpzpu5jorqTmg4XlhrXkuIvkvaDkuablhpnnmoTmmK9IVE1M5qC85byP77yM6YKj5LiN5piv5b6I6Zq+44CC5LuF5LuF5LuO5qCH6aKY5qCP55qE5LiL5ouJ5qGG5Lit6YCJ5oupIlByZWZvcm1hdCLmoLzlvI/jgIIKKyAg5aaC5p6c6buY6K6k5oOF5Ya15LiL5L2g5Lmm5YaZ55qE5piv5paH5pys5qC85byP77yM5L2g5LiN5b6X5oqK5a6D5pS55Li6SFRNTOagvOW8j++8iOS7heS7heS9nOS4uuS4gOasoeaAp+eahO+8ieadpeS5puWGmeaWsOeahOa2iOaBr++8jAorICDnhLblkI7lvLrliLbkvb/lroPlm57liLDmlofmnKzmoLzlvI/vvIzlkKbliJnlroPlsLHkvJrmi4booYzjgILopoHlrp7njrDlroPvvIzlnKjlhpnkv6HnmoTlm77moIfkuIrkvb/nlKhzaGlmdOmUruadpeS9v+Wug+WPmOS4ukhUTUwKKyAg5qC85byP77yM54S25ZCO5qCH6aKY5qCP55qE5LiL5ouJ5qGG5Lit6YCJ5oupIlByZWZvcm1hdCLmoLzlvI/jgIIKIAotLSA/Pz/nkoHplZDlqIc/P+OEpT8/Pz/jhKc/P+e8gj/mnYg/Pz8/6ZSbPwotICA/Pz/ngLU/VGh1bmRlcmJpcmQ/Pz/nkJvjg6Q/Pz8/P+e7oD8/Pz8/Pz8/P+inhD8/54GP6L6oPz/mtaPot6g/44SkPz/mtpM/ImV4dGVybmFsIGVkaXRvciI/P+KVgT8/6ZSbPz8/6Le6Pz/mtaPot6g/44SkPz8/Pz8/Pz/lqIbjiKI/PwotICAkRURJVE9SPz/jg6g/6K+yPz8/Pz8/Pz8/Pz/pqp7mg7DLiea2kz8/P+eJiD8/Pz8/5raTPz8/P+eRlT/ngLk/Pz/mnb8/P+mUmz8/Pz/mtaDjg6Q/P+adnuiXieiLn+a2kz/ngLk/55GBP+adqT/mtpM/Pz/ilYE/P+mUmz8/P+i3uj8/5aij6K+yPz/mtpM/5raTP+a1o+i3qD/jhKU/Pz8/PwotICA/Pz8/Pz9WaWV3LT5Ub29sYmFycy0+Q3VzdG9taXplLi4uPz8/Pz8/6KSwP+a1oz/mtpQ/Pz8/5reH4oSDPz8/Pz8/P+i3uj8/5rWgP+a1oD8/P+eRsD/or7I/P+eBj+WNnj8/5rWg44OkPz8/Pz8KKy0g5YWB6K645L2/55So5aSW6YOo55qE57yW6L6R5Zmo77yaCisgIOmSiOWvuVRodW5kZXJiaXJk5omT6KGl5LiB5pyA566A5Y2V55qE5pa55rOV5bCx5piv5L2/55So5LiA5LiqImV4dGVybmFsIGVkaXRvciLmianlsZXvvIznhLblkI7kvb/nlKjkvaDmnIDllpzmrKLnmoQKKyAgJEVESVRPUuadpeivu+WPluaIluiAheWQiOW5tuihpeS4geWIsOaWh+acrOS4reOAguimgeWunueOsOWug++8jOWPr+S7peS4i+i9veW5tuS4lOWuieijhei/meS4quaJqeWxle+8jOeEtuWQjua3u+WKoOS4gOS4quS9v+eUqOWug+eahAorICDmjInplK5WaWV3LT5Ub29sYmFycy0+Q3VzdG9taXplLi4u5pyA5ZCO5b2T5L2g5Lmm5YaZ5L+h5oGv55qE5pe25YCZ5LuF5LuF54K55Ye75a6D5bCx5Y+v5Lul5LqG44CCCiAKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBUa1JhdCAoR1VJKQogCi0/Pz/mtaDjg6TlqIc/P+OEpT8/Pz8/5rWj6LeoPz8iSW5zZXJ0IGZpbGUuLi4iPz8/Pz8/5r62Pz8/44SnPz/nvII/5p2IPz8/44SjPz8KK+WPr+S7peS9v+eUqOWug+OAguS9v+eUqCJJbnNlcnQgZmlsZS4uLiLmiJbogIXlpJbpg6jnmoTnvJbovpHlmajjgIIKIAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIEdtYWlsIChXZWIgR1VJKQogCi3mtpM/55GVP+a1o+i3qD/jhKU/Pz8/Pz8/P+eQm+ODpD8/Pz8/CivkuI3opoHkvb/nlKjlroPlj5HpgIHooaXkuIHjgIIKIAotR21haWznvIM/5qSk6Z2bP+OIoT/po44/Pz8/Pz8/44SlP+eJiD8/Pz/mg7DjgIPnu5c/5p2ePz8/P+a2k+iZueKUlj8/56y6Pz8KK0dtYWls572R6aG15a6i5oi356uv6Ieq5Yqo5Zyw5oqK5Yi26KGo56ym6L2s5o2i5Li656m65qC844CCCiAKLT8/55WMP+i3uj/mg7DjgIPnu5c/5p2ePz8/P+a2k+iZueKUlj8/5aW4Pz/mo7A/Pz8/5rWg44OoPz/mvrY/Pz/jhKc/P+adiD8/P+OEqNCSPz/nrbk/Pz8/Pz8/6Le6Pz/mnak/5rW8P+a1o+i3qD/jhKU/P+adnj8/P+OIoz8/Pz8/5aejP+eQmz8/Pz8/Pz/mtpM/NzjmtpM/54CbP+e7lz8/Pz8KK+iZveeEtuWItuihqOespui9rOaNouS4uuepuuagvOmXrumimOWPr+S7peiiq+WklumDqOe8lui+keWZqOino+WGs++8jOWQjOaXtuWug+i/mOS8muS9v+eUqOWbnui9puaNouihjOaKiuavj+ihjOaLhuWIhuS4ujc45Liq5a2X56ym44CCCiAKLT8/P+a2kz/mtpM/Pz8/5qOwPz8/P0dtYWls5p2pP+a1vD8/Pz/mtaDorrM/P+a2kz8/Pz9BU0NJST8/P+eAmz/nu5c/Pz8/5reH4oSDPz8/P+mAm+i0n2Jhc2U2NOe8gj8/Pz8/Pz/ngLk/Pz8/5raTP+eRl+Werj8/Pz8/Pz8/5aiG0YTluormtZzombk/Pz8/P+eAmz8/Pz8KK+WPpuS4gOS4qumXrumimOaYr0dtYWls6L+Y5Lya5oqK5Lu75L2V5LiN5pivQVNDSUnnmoTlrZfnrKbnmoTkv6Hmga/mlLnkuLpiYXNlNjTnvJbnoIHjgILlroPmiorkuJzopb/lj5jnmoTlg4/mrKfmtLLkurrnmoTlkI3lrZfjgIIKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vemhfQ04vbWFnaWMtbnVtYmVyLnR4dCBiL0RvY3VtZW50YXRpb24vemhfQ04vbWFnaWMtbnVtYmVyLnR4dAppbmRleCA0YzRjZTg1Li5jMjc4ZjQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3poX0NOL21hZ2ljLW51bWJlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi96aF9DTi9tYWdpYy1udW1iZXIudHh0CkBAIC02Niw3ICs2Niw3IEBACiBSSVNDT004X01BR0lDICAgICAgICAgMHgwOTA3ICAgICAgcmlzY29tX3BvcnQgICAgICAgZHJpdmVycy9jaGFyL3Jpc2NvbTguaAogU1BFQ0lBTElYX01BR0lDICAgICAgIDB4MDkwNyAgICAgIHNwZWNpYWxpeF9wb3J0ICAgIGRyaXZlcnMvY2hhci9zcGVjaWFsaXhfaW84LmgKIEhETENfTUFHSUMgICAgICAgICAgICAweDIzOWUgICAgICBuX2hkbGMgICAgICAgICAgICBkcml2ZXJzL2NoYXIvbl9oZGxjLmMKLUFQTV9CSU9TX01BR0lDICAgICAgICAweDQxMDEgICAgICBhcG1fdXNlciAgICAgICAgICBhcmNoL2kzODYva2VybmVsL2FwbS5jCitBUE1fQklPU19NQUdJQyAgICAgICAgMHg0MTAxICAgICAgYXBtX3VzZXIgICAgICAgICAgYXJjaC94ODYva2VybmVsL2FwbV8zMi5jCiBDWUNMQURFU19NQUdJQyAgICAgICAgMHg0MzU5ICAgICAgY3ljbGFkZXNfcG9ydCAgICAgaW5jbHVkZS9saW51eC9jeWNsYWRlcy5oCiBEQl9NQUdJQyAgICAgICAgICAgICAgMHg0NDQyICAgICAgZmNfaW5mbyAgICAgICAgICAgZHJpdmVycy9uZXQvaXBoNTUyNl9ub3ZyYW0uYwogRExfTUFHSUMgICAgICAgICAgICAgIDB4NDQ0ZCAgICAgIGZjX2luZm8gICAgICAgICAgIGRyaXZlcnMvbmV0L2lwaDU1MjZfbm92cmFtLmMKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMjk4MDFmNy4uZjU0NzQzMDQgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0xLDQgKzEsNSBAQAogCisKIAlMaXN0IG9mIG1haW50YWluZXJzIGFuZCBob3cgdG8gc3VibWl0IGtlcm5lbCBjaGFuZ2VzCiAKIFBsZWFzZSB0cnkgdG8gZm9sbG93IHRoZSBndWlkZWxpbmVzIGJlbG93LiAgVGhpcyB3aWxsIG1ha2UgdGhpbmdzCkBAIC01MzMsNiArNTM0LDggQEAKIEw6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBXOglodHRwOi8vd2lraS5hbmFsb2cuY29tLwogUzoJU3VwcG9ydGVkCitGOglzb3VuZC9zb2MvY29kZWNzL2FkYXUqCitGOglzb3VuZC9zb2MvY29kZWNzL2FkYXYqCiBGOglzb3VuZC9zb2MvY29kZWNzL2FkMSoKIEY6CXNvdW5kL3NvYy9jb2RlY3Mvc3NtKgogCkBAIC01OTQsNiArNTk3LDE2IEBACiBGOglhcmNoL2FybS9saWIvZmxvcHB5ZG1hLlMKIEY6CWFyY2gvYXJtL2luY2x1ZGUvYXNtL2Zsb3BweS5oCiAKK0FSTSBQTVUgUFJPRklMSU5HIEFORCBERUJVR0dJTkcKK006CVdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgorUzoJTWFpbnRhaW5lZAorRjoJYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQqCitGOglhcmNoL2FybS9vcHJvZmlsZS9jb21tb24uYworRjoJYXJjaC9hcm0va2VybmVsL3BtdS5jCitGOglhcmNoL2FybS9pbmNsdWRlL2FzbS9wbXUuaAorRjoJYXJjaC9hcm0va2VybmVsL2h3X2JyZWFrcG9pbnQuYworRjoJYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCisKIEFSTSBQT1JUCiBNOglSdXNzZWxsIEtpbmcgPGxpbnV4QGFybS5saW51eC5vcmcudWs+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQpAQCAtNjgzLDcgKzY5Niw3IEBACiAKIEFSTS9DSVJSVVMgTE9HSUMgRVA5M1hYIEFSTSBBUkNISVRFQ1RVUkUKIE06CUhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4KLU06CVJ5YW4gTWFsbG9uIDxyeWFuQGJsdWV3YXRlcnN5cy5jb20+CitNOglSeWFuIE1hbGxvbiA8cm1hbGxvbkBnbWFpbC5jb20+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogUzoJTWFpbnRhaW5lZAogRjoJYXJjaC9hcm0vbWFjaC1lcDkzeHgvCkBAIC0xMzQ1LDE2ICsxMzU4LDE4IEBACiBGOglpbmNsdWRlL2xpbnV4L2NmYWcxMjg2NGIuaAogCiBBVlIzMiBBUkNISVRFQ1RVUkUKLU06CUhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGhhbnMtY2hyaXN0aWFuLmVndHZlZHRAYXRtZWwuY29tPgorTToJSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBnbWFpbC5jb20+CitNOglIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxlZ3R2ZWR0QHNhbWZ1bmRldC5ubz4KIFc6CWh0dHA6Ly93d3cuYXRtZWwuY29tL3Byb2R1Y3RzL0FWUjMyLwogVzoJaHR0cDovL2F2cjMybGludXgub3JnLwogVzoJaHR0cDovL2F2cmZyZWFrcy5uZXQvCi1TOglTdXBwb3J0ZWQKK1M6CU1haW50YWluZWQKIEY6CWFyY2gvYXZyMzIvCiAKIEFWUjMyL0FUMzJBUCBNQUNISU5FIFNVUFBPUlQKLU06CUhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGhhbnMtY2hyaXN0aWFuLmVndHZlZHRAYXRtZWwuY29tPgotUzoJU3VwcG9ydGVkCitNOglIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGdtYWlsLmNvbT4KK006CUhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGVndHZlZHRAc2FtZnVuZGV0Lm5vPgorUzoJTWFpbnRhaW5lZAogRjoJYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC8KIAogQVguMjUgTkVUV09SSyBMQVlFUgpAQCAtMTM5MCw3ICsxNDA1LDYgQEAKIEJBVE1BTiBBRFZBTkNFRAogTToJTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KIE06CVNpbW9uIFd1bmRlcmxpY2ggPHNpd3VAaHJ6LnR1LWNoZW1uaXR6LmRlPgotTToJU3ZlbiBFY2tlbG1hbm4gPHN2ZW5AbmFyZmF0aW9uLm9yZz4KIEw6CWIuYS50Lm0uYS5uQGxpc3RzLm9wZW4tbWVzaC5vcmcKIFc6CWh0dHA6Ly93d3cub3Blbi1tZXNoLm9yZy8KIFM6CU1haW50YWluZWQKQEAgLTE0MjMsNyArMTQzNyw2IEBACiBGOglhcmNoL2JsYWNrZmluLwogCiBCTEFDS0ZJTiBFTUFDIERSSVZFUgotTToJTWljaGFlbCBIZW5uZXJpY2ggPG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20+CiBMOgl1Y2xpbnV4LWRpc3QtZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKIFc6CWh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZwogUzoJU3VwcG9ydGVkCkBAIC0xNTQwLDYgKzE1NTMsMTIgQEAKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS8KIAorQlJPQURDT00gQk5YMkZDIDEwIEdJR0FCSVQgRkNPRSBEUklWRVIKK006CUJoYW51IFByYWthc2ggR29sbGFwdWRpIDxicHJha2FzaEBicm9hZGNvbS5jb20+CitMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL3Njc2kvYm54MmZjLworCiBCUk9DQURFIEJGQSBGQyBTQ1NJIERSSVZFUgogTToJSmluZyBIdWFuZyA8aHVhbmdqQGJyb2NhZGUuY29tPgogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKQEAgLTE1NjksNyArMTU4OCw3IEBACiBGOglzb3VuZC9wY2kvYnQ4N3guYwogCiBCVDhYWEdQSU8gRFJJVkVSCi1NOglNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorTToJTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KIFc6CWh0dHA6Ly9idTNzY2guZGUvYnRncGlvLnBocAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9ncGlvL2J0OHh4Z3Bpby5jCkBAIC0xNjM5LDcgKzE2NTgsNyBAQAogTToJT2xpdmVyIEhhcnRrb3BwIDxzb2NrZXRjYW5AaGFydGtvcHAubmV0PgogTToJT2xpdmVyIEhhcnRrb3BwIDxvbGl2ZXIuaGFydGtvcHBAdm9sa3N3YWdlbi5kZT4KIE06CVVycyBUaHVlcm1hbm4gPHVycy50aHVlcm1hbm5Adm9sa3N3YWdlbi5kZT4KLUw6CXNvY2tldGNhbi1jb3JlQGxpc3RzLmJlcmxpb3MuZGUKK0w6CXNvY2tldGNhbi1jb3JlQGxpc3RzLmJlcmxpb3MuZGUgKHN1YnNjcmliZXJzLW9ubHkpCiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vZGV2ZWxvcGVyLmJlcmxpb3MuZGUvcHJvamVjdHMvc29ja2V0Y2FuLwogUzoJTWFpbnRhaW5lZApAQCAtMTY1MSw3ICsxNjcwLDcgQEAKIAogQ0FOIE5FVFdPUksgRFJJVkVSUwogTToJV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+Ci1MOglzb2NrZXRjYW4tY29yZUBsaXN0cy5iZXJsaW9zLmRlCitMOglzb2NrZXRjYW4tY29yZUBsaXN0cy5iZXJsaW9zLmRlIChzdWJzY3JpYmVycy1vbmx5KQogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL2RldmVsb3Blci5iZXJsaW9zLmRlL3Byb2plY3RzL3NvY2tldGNhbi8KIFM6CU1haW50YWluZWQKQEAgLTE3MzksNyArMTc1OCw3IEBACiBGOglkcml2ZXJzL25ldC9lbmljLwogCiBDSVJSVVMgTE9HSUMgRVA5M1hYIEVUSEVSTkVUIERSSVZFUgotTToJTGVubmVydCBCdXl0ZW5oZWsgPGtlcm5lbEB3YW50c3RvZmx5Lm9yZz4KK006CUhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMKQEAgLTE3NjIsNyArMTc4MSw4IEBACiAKIENJU0NPIEZDT0UgSEJBIERSSVZFUgogTToJQWJoaWplZXQgSm9nbGVrYXIgPGFiam9nbGVrQGNpc2NvLmNvbT4KLU06CUpvZSBFeWtob2x0IDxqZXlraG9sdEBjaXNjby5jb20+CitNOglWZW5rYXRhIFNpdmEgVmlqYXllbmRyYSBCaGFtaWRpcGF0aSA8dmJoYW1pZGlAY2lzY28uY29tPgorTToJQnJpYW4gVWNoaW5vIDxidWNoaW5vQGNpc2NvLmNvbT4KIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvc2NzaS9mbmljLwpAQCAtMTg4OSw3ICsxOTA5LDYgQEAKIFc6CWh0dHA6Ly93d3cuY29kZW1vbmtleS5vcmcudWsvcHJvamVjdHMvY3B1ZnJlcS8KIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvZGF2ZWovY3B1ZnJlcS5naXQKIFM6CU1haW50YWluZWQKLUY6CWFyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS8KIEY6CWRyaXZlcnMvY3B1ZnJlcS8KIEY6CWluY2x1ZGUvbGludXgvY3B1ZnJlcS5oCiAKQEAgLTIxOTgsNyArMjIxNyw3IEBACiBET0NVTUVOVEFUSU9OCiBNOglSYW5keSBEdW5sYXAgPHJkdW5sYXBAeGVub3RpbWUubmV0PgogTDoJbGludXgtZG9jQHZnZXIua2VybmVsLm9yZwotVDoJcXVpbHQgb3NzLm9yYWNsZS5jb20vfnJkdW5sYXAva2VybmVsLWRvYy1wYXRjaGVzL2N1cnJlbnQvCitUOglxdWlsdCBodHRwOi8vdXNlcndlYi5rZXJuZWwub3JnL35yZHVubGFwL2tlcm5lbC1kb2MtcGF0Y2hlcy9jdXJyZW50LwogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi8KIApAQCAtMjI5Miw4ICsyMzExLDcgQEAKIAogRUJUQUJMRVMKIE06CUJhcnQgRGUgU2NodXltZXIgPGJhcnQuZGUuc2NodXltZXJAcGFuZG9yYS5iZT4KLUw6CWVidGFibGVzLXVzZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci1MOgllYnRhYmxlcy1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK0w6CW5ldGZpbHRlci1kZXZlbEB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9lYnRhYmxlcy5zb3VyY2Vmb3JnZS5uZXQvCiBTOglNYWludGFpbmVkCiBGOglpbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XyouaApAQCAtMjk5NCw3ICszMDEyLDcgQEAKIEY6CWtlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKIEY6CWtlcm5lbC90aW1lL3RpY2sqLioKIEY6CWtlcm5lbC90aW1lL3RpbWVyXyouYwotRjoJaW5jbHVkZS9saW51eC9jbG9ja2V2ZW50cy5oCitGOglpbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaAogRjoJaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKIAogSElHSC1TUEVFRCBTQ0MgRFJJVkVSIEZPUiBBWC4yNQpAQCAtMzQxNywxMCArMzQzNSw5IEBACiBGOglkcml2ZXJzL25ldC9pcGcuKgogCiBJUEFUSCBEUklWRVIKLU06CVJhbHBoIENhbXBiZWxsIDxpbmZpbmlwYXRoQHFsb2dpYy5jb20+CitNOglNaWtlIE1hcmNpbmlzenluIDxpbmZpbmlwYXRoQHFsb2dpYy5jb20+CiBMOglsaW51eC1yZG1hQHZnZXIua2VybmVsLm9yZwotVDoJZ2l0IGdpdDovL2dpdC5xbG9naWMuY29tL2lwYXRoLWxpbnV4LTIuNgotUzoJU3VwcG9ydGVkCitTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvCiAKIElQTUkgU1VCU1lTVEVNCkBAIC0zODIwLDYgKzM4MzcsMTIgQEAKIEY6CWRyaXZlcnMvbGVkcy8KIEY6CWluY2x1ZGUvbGludXgvbGVkcy5oCiAKK0xFR0FDWSBFRVBST00gRFJJVkVSCitNOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK1M6CU1haW50YWluZWQKK0Y6CURvY3VtZW50YXRpb24vbWlzYy1kZXZpY2VzL2VlcHJvbQorRjoJZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb20uYworCiBMRUdPIFVTQiBUb3dlciBkcml2ZXIKIE06CUp1ZXJnZW4gU3R1YmVyIDxzdGFyYmx1ZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBMOglsZWdvdXNiLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldApAQCAtMzg3Miw3ICszODk1LDcgQEAKIEY6CWFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC8KIAogTElOVVggRk9SIFBPV0VSUEMgRU1CRURERUQgUFBDNFhYCi1NOglKb3NoIEJveWVyIDxqd2JveWVyQGxpbnV4LnZuZXQuaWJtLmNvbT4KK006CUpvc2ggQm95ZXIgPGp3Ym95ZXJAZ21haWwuY29tPgogTToJTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KIFc6CWh0dHA6Ly93d3cucGVuZ3VpbnBwYy5vcmcvCiBMOglsaW51eHBwYy1kZXZAbGlzdHMub3psYWJzLm9yZwpAQCAtMzkwNCw2ICszOTI3LDcgQEAKIEw6CWxpbnV4cHBjLWRldkBsaXN0cy5vemxhYnMub3JnCiBTOglNYWludGFpbmVkCiBGOglhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvCitGOglhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvCiAKIExJTlVYIEZPUiBQT1dFUlBDIFBBIFNFTUkgUFdSRklDSUVOVAogTToJT2xvZiBKb2hhbnNzb24gPG9sb2ZAbGl4b20ubmV0PgpAQCAtMzkzNyw2ICszOTYxLDEzIEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2h3bW9uL2xtNzMuYwogCitMTTc4IEhBUkRXQVJFIE1PTklUT1IgRFJJVkVSCitNOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KK0w6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKK1M6CU1haW50YWluZWQKK0Y6CURvY3VtZW50YXRpb24vaHdtb24vbG03OAorRjoJZHJpdmVycy9od21vbi9sbTc4LmMKKwogTE04MyBIQVJEV0FSRSBNT05JVE9SIERSSVZFUgogTToJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CiBMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCkBAIC00MDgzLDYgKzQxMTQsMTIgQEAKIEY6CWRyaXZlcnMvbmV0L212NjQzeHhfZXRoLioKIEY6CWluY2x1ZGUvbGludXgvbXY2NDN4eC5oCiAKK01BUlZFTEwgTVdJRklFWCBXSVJFTEVTUyBEUklWRVIKK006CUJpbmcgWmhhbyA8YnpoYW9AbWFydmVsbC5jb20+CitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvCisKIE1BUlZFTEwgTVdMOEsgV0lSRUxFU1MgRFJJVkVSCiBNOglMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4KIEw6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwpAQCAtNDE0NSw3ICs0MTgyLDcgQEAKIEY6CW1tLwogCiBNRU1PUlkgUkVTT1VSQ0UgQ09OVFJPTExFUgotTToJQmFsYmlyIFNpbmdoIDxiYWxiaXJAbGludXgudm5ldC5pYm0uY29tPgorTToJQmFsYmlyIFNpbmdoIDxic2luZ2hhcm9yYUBnbWFpbC5jb20+CiBNOglEYWlzdWtlIE5pc2hpbXVyYSA8bmlzaGltdXJhQG14cC5uZXMubmVjLmNvLmpwPgogTToJS0FNRVpBV0EgSGlyb3l1a2kgPGthbWV6YXdhLmhpcm95dUBqcC5mdWppdHN1LmNvbT4KIEw6CWxpbnV4LW1tQGt2YWNrLm9yZwpAQCAtNDI1Miw4ICs0Mjg5LDcgQEAKIEY6CWluY2x1ZGUvbGludXgvbW1jLwogCiBNVUxUSU1FRElBIENBUkQgKE1NQykgRVRDLiBPVkVSIFNQSQotTToJRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci1TOglPZGQgRml4ZXMKK1M6CU9ycGhhbgogRjoJZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMKIEY6CWluY2x1ZGUvbGludXgvc3BpL21tY19zcGkuaAogCkBAIC00Mjc2LDggKzQzMTIsOCBAQAogRjoJZHJpdmVycy91c2IvbXVzYi8KIAogTVlSSUNPTSBNWVJJLTEwRyAxMEdiRSBEUklWRVIgKE1ZUkkxMEdFKQorTToJSm9uIE1hc29uIDxtYXNvbkBteXJpLmNvbT4KIE06CUFuZHJldyBHYWxsYXRpbiA8Z2FsbGF0aW5AbXlyaS5jb20+Ci1NOglCcmljZSBHb2dsaW4gPGJyaWNlQG15cmkuY29tPgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3d3dy5teXJpLmNvbS9zY3MvZG93bmxvYWQtTXlyaTEwR0UuaHRtbAogUzoJU3VwcG9ydGVkCkBAIC00NTcxLDkgKzQ2MDcsOCBAQAogRjoJZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMKIAogT01BUCBIUyBNTUMgU1VQUE9SVAotTToJTWFkaHVzdWRoYW4gQ2hpa2thdHVyZSA8bWFkaHUuY3JAdGkuY29tPgogTDoJbGludXgtb21hcEB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKK1M6CU9ycGhhbgogRjoJZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKIAogT01BUCBSQU5ET00gTlVNQkVSIEdFTkVSQVRPUiBTVVBQT1JUCkBAIC00NjAzLDcgKzQ2MzgsNiBAQAogCiBPTUFQIFVTQiBTVVBQT1JUCiBNOglGZWxpcGUgQmFsYmkgPGJhbGJpQHRpLmNvbT4KLU06CURhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogTDoJbGludXgtb21hcEB2Z2VyLmtlcm5lbC5vcmcKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYmFsYmkvdXNiLmdpdApAQCAtNDY2OCw2ICs0NzAyLDE0IEBACiBGOglpbmNsdWRlL2xpbnV4L29mKi5oCiBLOglvZl9nZXRfcHJvcGVydHkKIAorT1BFTlJJU0MgQVJDSElURUNUVVJFCitNOglKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CitXOglodHRwOi8vb3BlbnJpc2MubmV0CitMOglsaW51eEBsaXN0cy5vcGVucmlzYy5uZXQKK1M6CU1haW50YWluZWQKK1Q6CWdpdCBnaXQ6Ly9vcGVucmlzYy5uZXQvfmpvbmFzL2xpbnV4CitGOglhcmNoL29wZW5yaXNjCisKIE9QTDQgRFJJVkVSCiBNOglDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KIEw6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCkBAIC00ODkyLDcgKzQ5MzQsNyBAQAogRjoJYXJjaC8qL2luY2x1ZGUvYXNtL3BlcmNwdS5oCiAKIFBFUi1UQVNLIERFTEFZIEFDQ09VTlRJTkcKLU06CUJhbGJpciBTaW5naCA8YmFsYmlyQGxpbnV4LnZuZXQuaWJtLmNvbT4KK006CUJhbGJpciBTaW5naCA8YnNpbmdoYXJvcmFAZ21haWwuY29tPgogUzoJTWFpbnRhaW5lZAogRjoJaW5jbHVkZS9saW51eC9kZWxheWFjY3QuaAogRjoJa2VybmVsL2RlbGF5YWNjdC5jCkBAIC00OTQ3LDYgKzQ5ODksNyBAQAogRjoJZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi11bmljb3JlMzJpby5oCiBGOglkcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB1djMuYwogRjoJZHJpdmVycy92aWRlby9mYi1wdXYzLmMKK0Y6CWRyaXZlcnMvcnRjL3J0Yy1wdXYzLmMKIAogUE1DIFNJRVJSQSBNYXhSQUlEIERSSVZFUgogTToJQW5pbCBSYXZpbmRyYW5hdGggPGFuaWxfcmF2aW5kcmFuYXRoQHBtYy1zaWVycmEuY29tPgpAQCAtNDk3OSw3ICs1MDIyLDcgQEAKIAogUE5QIFNVUFBPUlQKIE06CUFkYW0gQmVsYXkgPGFiZWxheUBtaXQuZWR1PgotTToJQmpvcm4gSGVsZ2FhcyA8Ympvcm4uaGVsZ2Fhc0BocC5jb20+CitNOglCam9ybiBIZWxnYWFzIDxiaGVsZ2Fhc0Bnb29nbGUuY29tPgogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9wbnAvCiAKQEAgLTUxMzksNiArNTE4MiwxMiBAQAogTDoJcnRjLWxpbnV4QGdvb2dsZWdyb3Vwcy5jb20KIFM6CU1haW50YWluZWQKIAorUUlCIERSSVZFUgorTToJTWlrZSBNYXJjaW5pc3p5biA8aW5maW5pcGF0aEBxbG9naWMuY29tPgorTDoJbGludXgtcmRtYUB2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi8KKwogUUxPR0lDIFFMQTEyODAgU0NTSSBEUklWRVIKIE06CU1pY2hhZWwgUmVlZCA8bWRyQHNnaS5jb20+CiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwpAQCAtNTE3OCw2ICs1MjI3LDcgQEAKIEY6CWRyaXZlcnMvbmV0L3FsY25pYy8KIAogUUxPR0lDIFFMR0UgMTBHYiBFVEhFUk5FVCBEUklWRVIKK006CUppdGVuZHJhIEthbHNhcmlhIDxqaXRlbmRyYS5rYWxzYXJpYUBxbG9naWMuY29tPgogTToJUm9uIE1lcmNlciA8cm9uLm1lcmNlckBxbG9naWMuY29tPgogTToJbGludXgtZHJpdmVyQHFsb2dpYy5jb20KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKQEAgLTUyOTksNiArNTM0OSwxMyBAQAogUzoJU3VwcG9ydGVkCiBGOglmcy9yZWlzZXJmcy8KIAorUkVHSVNURVIgTUFQIEFCU1RSQUNUSU9OCitNOglNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK1Q6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYnJvb25pZS9yZWdtYXAuZ2l0CitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvYmFzZS9yZWdtYXAvCitGOglpbmNsdWRlL2xpbnV4L3JlZ21hcC5oCisKIFJGS0lMTAogTToJSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KIEw6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwpAQCAtNTg2MSw3ICs1OTE4LDcgQEAKIEY6CWRyaXZlcnMvbmV0L3NvbmljLioKIAogU09OSUNTIFNJTElDT04gQkFDS1BMQU5FIERSSVZFUiAoU1NCKQotTToJTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KK006CU1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3NzYi8KQEAgLTU5ODQsNyArNjA0MSw2IEBACiBGOglkcml2ZXJzL3N0YWdpbmcvdHR5L3NwZWNpYWxpeCoKIAogU1BJIFNVQlNZU1RFTQotTToJRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBNOglHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CiBMOglzcGktZGV2ZWwtZ2VuZXJhbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFE6CWh0dHA6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wcm9qZWN0L3NwaS1kZXZlbC1nZW5lcmFsL2xpc3QvCkBAIC02MTAwLDcgKzYxNTYsNyBAQAogRjoJRG9jdW1lbnRhdGlvbi90YXJnZXQvCiAKIFRBU0tTVEFUUyBTVEFUSVNUSUNTIElOVEVSRkFDRQotTToJQmFsYmlyIFNpbmdoIDxiYWxiaXJAbGludXgudm5ldC5pYm0uY29tPgorTToJQmFsYmlyIFNpbmdoIDxic2luZ2hhcm9yYUBnbWFpbC5jb20+CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzKgogRjoJaW5jbHVkZS9saW51eC90YXNrc3RhdHMqCkBAIC02MjI5LDkgKzYyODUsMTQgQEAKIEY6CWluY2x1ZGUvbGludXgvdG9zaGliYS5oCiAKIFRNSU8gTU1DIERSSVZFUgorTToJR3Vlbm5hZGkgTGlha2hvdmV0c2tpIDxnLmxpYWtob3ZldHNraUBnbXguZGU+CiBNOglJYW4gTW9sdG9uIDxpYW5AbW5lbWVudGguY28udWs+CitMOglsaW51eC1tbWNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCi1GOglkcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLioKK0Y6CWRyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMqCitGOglkcml2ZXJzL21tYy9ob3N0L3NoX21vYmlsZV9zZGhpLmMKK0Y6CWluY2x1ZGUvbGludXgvbW1jL3RtaW8uaAorRjoJaW5jbHVkZS9saW51eC9tbWMvc2hfbW9iaWxlX3NkaGkuaAogCiBUTVBGUyAoU0hNRU0gRklMRVNZU1RFTSkKIE06CUh1Z2ggRGlja2lucyA8aHVnaGRAZ29vZ2xlLmNvbT4KQEAgLTYzMDgsNyArNjM2OSw3IEBACiAKIFVCSSBGSUxFIFNZU1RFTSAoVUJJRlMpCiBNOglBcnRlbSBCaXR5dXRza2l5IDxkZWRla2luZDFAZ21haWwuY29tPgotTToJQWRyaWFuIEh1bnRlciA8YWRyaWFuLmh1bnRlckBub2tpYS5jb20+CitNOglBZHJpYW4gSHVudGVyIDxhZHJpYW4uaHVudGVyQGludGVsLmNvbT4KIEw6CWxpbnV4LW10ZEBsaXN0cy5pbmZyYWRlYWQub3JnCiBUOglnaXQgZ2l0Oi8vZ2l0LmluZnJhZGVhZC5vcmcvdWJpZnMtMi42LmdpdAogVzoJaHR0cDovL3d3dy5saW51eC1tdGQuaW5mcmFkZWFkLm9yZy9kb2MvdWJpZnMuaHRtbApAQCAtNjQzMiw5ICs2NDkzLDkgQEAKIEY6CWRyaXZlcnMvdXNiL21pc2MvcmlvNTAwKgogCiBVU0IgRUhDSSBEUklWRVIKLU06CURhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorTToJQWxhbiBTdGVybiA8c3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVkdT4KIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKLVM6CU9kZCBGaXhlcworUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi91c2IvZWhjaS50eHQKIEY6CWRyaXZlcnMvdXNiL2hvc3QvZWhjaSoKIApAQCAtNjQ0OCw5ICs2NTA5LDEwIEBACiBGOglkcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxLwogCiBVU0IgR0FER0VUL1BFUklQSEVSQUwgU1VCU1lTVEVNCi1NOglEYXZpZCBCcm93bmVsbCA8ZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK006CUZlbGlwZSBCYWxiaSA8YmFsYmlAdGkuY29tPgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3d3dy5saW51eC11c2Iub3JnL2dhZGdldAorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9iYWxiaS91c2IuZ2l0CiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3VzYi9nYWRnZXQvCiBGOglpbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQqCkBAIC02NDYwLDkgKzY1MjIsMTUgQEAKIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamlrb3MvaGlkLmdpdAogUzoJTWFpbnRhaW5lZAotRjoJRG9jdW1lbnRhdGlvbi91c2IvaGlkZGV2LnR4dAorRjoJRG9jdW1lbnRhdGlvbi9oaWQvaGlkZGV2LnR4dAogRjoJZHJpdmVycy9oaWQvdXNiaGlkLwogCitVU0IvSVAgRFJJVkVSUworTToJTWF0dCBNb29uZXkgPG1mbUBtdXRlZGRpc2suY29tPgorTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL3VzYmlwLworCiBVU0IgSVNQMTE2WCBEUklWRVIKIE06CU9sYXYgS29uZ2FzIDxva0BhcnRlY2Rlc2lnbi5lZT4KIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKQEAgLTY0OTIsOSArNjU2MCw5IEBACiBGOglzb3VuZC91c2IvbWlkaS4qCiAKIFVTQiBPSENJIERSSVZFUgotTToJRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitNOglBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1PgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwotUzoJT2RkIEZpeGVzCitTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL3VzYi9vaGNpLnR4dAogRjoJZHJpdmVycy91c2IvaG9zdC9vaGNpKgogCkBAIC02NzIwLDYgKzY3ODgsMTUgQEAKIEY6CURvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZhdC50eHQKIEY6CWZzL2ZhdC8KIAorVklERU9CVUYyIEZSQU1FV09SSworTToJUGF3ZWwgT3NjaWFrIDxwYXdlbEBvc2NpYWsuY29tPgorTToJTWFyZWsgU3p5cHJvd3NraSA8bS5zenlwcm93c2tpQHNhbXN1bmcuY29tPgorTToJS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItKgorRjoJaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItKgorCiBWSVJUSU8gQ09OU09MRSBEUklWRVIKIE06CUFtaXQgU2hhaCA8YW1pdC5zaGFoQHJlZGhhdC5jb20+CiBMOgl2aXJ0dWFsaXphdGlvbkBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwpAQCAtNjkwOSw5ICs2OTg2LDkgQEAKIEY6CWRyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYwogCiBXTDEyNTEgV0lSRUxFU1MgRFJJVkVSCi1NOglLYWxsZSBWYWxvIDxrdmFsb0BhZHVyb20uY29tPgorTToJTHVjaWFubyBDb2VsaG8gPGNvZWxob0B0aS5jb20+CiBMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly93aXJlbGVzcy5rZXJuZWwub3JnCitXOglodHRwOi8vd2lyZWxlc3Mua2VybmVsLm9yZy9lbi91c2Vycy9Ecml2ZXJzL3dsMTI1MQogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9saW52aWxsZS93aXJlbGVzcy10ZXN0aW5nLmdpdAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMjUxLyoKQEAgLTY5OTcsNiArNzA3NCwxMyBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9wbGF0Zm9ybS94ODYKIAorWDg2IE1DRSBJTkZSQVNUUlVDVFVSRQorTToJVG9ueSBMdWNrIDx0b255Lmx1Y2tAaW50ZWwuY29tPgorTToJQm9yaXNsYXYgUGV0a292IDxicEBhbWQ2NC5vcmc+CitMOglsaW51eC1lZGFjQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svKgorCiBYRU4gSFlQRVJWSVNPUiBJTlRFUkZBQ0UKIE06CUplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteS5maXR6aGFyZGluZ2VAY2l0cml4LmNvbT4KIE06CUtvbnJhZCBSemVzenV0ZWsgV2lsayA8a29ucmFkLndpbGtAb3JhY2xlLmNvbT4KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggMGYxZGI4ZC4uZDAxODk1NiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiBWRVJTSU9OID0gMwogUEFUQ0hMRVZFTCA9IDAKIFNVQkxFVkVMID0gMAotRVhUUkFWRVJTSU9OID0gLXJjMgorRVhUUkFWRVJTSU9OID0KIE5BTUUgPSBTbmVha3kgV2Vhc2VsCiAKICMgKkRPQ1VNRU5UQVRJT04qCkBAIC0zNzgsNyArMzc4LDcgQEAKIAogIyBSZWFkIEtFUk5FTFJFTEVBU0UgZnJvbSBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSAoaWYgaXQgZXhpc3RzKQogS0VSTkVMUkVMRUFTRSA9ICQoc2hlbGwgY2F0IGluY2x1ZGUvY29uZmlnL2tlcm5lbC5yZWxlYXNlIDI+IC9kZXYvbnVsbCkKLUtFUk5FTFZFUlNJT04gPSAkKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikKK0tFUk5FTFZFUlNJT04gPSAkKFZFUlNJT04pJChpZiAkKFBBVENITEVWRUwpLC4kKFBBVENITEVWRUwpJChpZiAkKFNVQkxFVkVMKSwuJChTVUJMRVZFTCkpKSQoRVhUUkFWRVJTSU9OKQogCiBleHBvcnQgVkVSU0lPTiBQQVRDSExFVkVMIFNVQkxFVkVMIEtFUk5FTFJFTEVBU0UgS0VSTkVMVkVSU0lPTgogZXhwb3J0IEFSQ0ggU1JDQVJDSCBDT05GSUdfU0hFTEwgSE9TVENDIEhPU1RDRkxBR1MgQ1JPU1NfQ09NUElMRSBBUyBMRCBDQwpAQCAtMTAwNSw3ICsxMDA1LDcgQEAKIAogZGVmaW5lIGZpbGVjaGtfdmVyc2lvbi5oCiAJKGVjaG8gXCNkZWZpbmUgTElOVVhfVkVSU0lPTl9DT0RFICQoc2hlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlleHByICQoVkVSU0lPTikgXCogNjU1MzYgKyAkKFBBVENITEVWRUwpIFwqIDI1NiArICQoU1VCTEVWRUwpKTsgICAgIFwKKwlleHByICQoVkVSU0lPTikgXCogNjU1MzYgKyAwJChQQVRDSExFVkVMKSBcKiAyNTYgKyAwJChTVUJMRVZFTCkpOyAgICBcCiAJZWNobyAnI2RlZmluZSBLRVJORUxfVkVSU0lPTihhLGIsYykgKCgoYSkgPDwgMTYpICsgKChiKSA8PCA4KSArIChjKSknOykKIGVuZGVmCiAKQEAgLTExMTAsMTEgKzExMTAsNiBAQAogCiBQSE9OWSArPSBfbW9kaW5zdF8KIF9tb2RpbnN0XzoKLQlAaWYgWyAteiAiYCQoREVQTU9EKSAtViAyPi9kZXYvbnVsbCB8IGdyZXAgbW9kdWxlLWluaXQtdG9vbHNgIiBdOyB0aGVuIFwKLQkJZWNobyAiV2FybmluZzogeW91IG1heSBuZWVkIHRvIGluc3RhbGwgbW9kdWxlLWluaXQtdG9vbHMiOyBcCi0JCWVjaG8gIlNlZSBodHRwOi8vd3d3LmNvZGVtb25rZXkub3JnLnVrL2RvY3MvcG9zdC1oYWxsb3dlZW4tMi42LnR4dCI7XAotCQlzbGVlcCAxOyBcCi0JZmkKIAlAcm0gLXJmICQoTU9ETElCKS9rZXJuZWwKIAlAcm0gLWYgJChNT0RMSUIpL3NvdXJjZQogCUBta2RpciAtcCAkKE1PRExJQikva2VybmVsCkBAIC0xMjk1LDYgKzEyOTAsNyBAQAogCUBlY2hvICAnICBtYWtlIE89ZGlyIFt0YXJnZXRzXSBMb2NhdGUgYWxsIG91dHB1dCBmaWxlcyBpbiAiZGlyIiwgaW5jbHVkaW5nIC5jb25maWcnCiAJQGVjaG8gICcgIG1ha2UgQz0xICAgW3RhcmdldHNdIENoZWNrIGFsbCBjIHNvdXJjZSB3aXRoICQkQ0hFQ0sgKHNwYXJzZSBieSBkZWZhdWx0KScKIAlAZWNobyAgJyAgbWFrZSBDPTIgICBbdGFyZ2V0c10gRm9yY2UgY2hlY2sgb2YgYWxsIGMgc291cmNlIHdpdGggJCRDSEVDSycKKwlAZWNobyAgJyAgbWFrZSBSRUNPUkRNQ09VTlRfV0FSTj0xIFt0YXJnZXRzXSBXYXJuIGFib3V0IGlnbm9yZWQgbWNvdW50IHNlY3Rpb25zJwogCUBlY2hvICAnICBtYWtlIFc9biAgIFt0YXJnZXRzXSBFbmFibGUgZXh0cmEgZ2NjIGNoZWNrcywgbj0xLDIsMyB3aGVyZScKIAlAZWNobyAgJwkJMTogd2FybmluZ3Mgd2hpY2ggbWF5IGJlIHJlbGV2YW50IGFuZCBkbyBub3Qgb2NjdXIgdG9vIG9mdGVuJwogCUBlY2hvICAnCQkyOiB3YXJuaW5ncyB3aGljaCBvY2N1ciBxdWl0ZSBvZnRlbiBidXQgbWF5IHN0aWxsIGJlIHJlbGV2YW50JwpAQCAtMTUzMSwxMiArMTUyNyw4IEBACiAKICMgUnVuIGRlcG1vZCBvbmx5IGlmIHdlIGhhdmUgU3lzdGVtLm1hcCBhbmQgZGVwbW9kIGlzIGV4ZWN1dGFibGUKIHF1aWV0X2NtZF9kZXBtb2QgPSBERVBNT0QgICQoS0VSTkVMUkVMRUFTRSkKLSAgICAgIGNtZF9kZXBtb2QgPSBcCi0JaWYgWyAtciBTeXN0ZW0ubWFwIC1hIC14ICQoREVQTU9EKSBdOyB0aGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkkKERFUE1PRCkgLWFlIC1GIFN5c3RlbS5tYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkkKGlmICQoc3RyaXAgJChJTlNUQUxMX01PRF9QQVRIKSksIC1iICQoSU5TVEFMTF9NT0RfUEFUSCkgKSAgICAgXAotCQkkKEtFUk5FTFJFTEVBU0UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWZpCisgICAgICBjbWRfZGVwbW9kID0gJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9kZXBtb2Quc2ggJChERVBNT0QpIFwKKyAgICAgICAgICAgICAgICAgICAkKEtFUk5FTFJFTEVBU0UpCiAKICMgQ3JlYXRlIHRlbXBvcmFyeSBkaXIgZm9yIG1vZHVsZSBzdXBwb3J0IGZpbGVzCiAjIGNsZWFuIGl0IHVwIG9ubHkgd2hlbiBidWlsZGluZyBhbGwgbW9kdWxlcwpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IDg1MTAwMTcuLjBkNWE3ZGQgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTEsNiArMSw2IEBACi0JTGludXgga2VybmVsIHJlbGVhc2UgMi42Lnh4IDxodHRwOi8va2VybmVsLm9yZy8+CisJTGludXgga2VybmVsIHJlbGVhc2UgMy54IDxodHRwOi8va2VybmVsLm9yZy8+CiAKLVRoZXNlIGFyZSB0aGUgcmVsZWFzZSBub3RlcyBmb3IgTGludXggdmVyc2lvbiAyLjYuICBSZWFkIHRoZW0gY2FyZWZ1bGx5LAorVGhlc2UgYXJlIHRoZSByZWxlYXNlIG5vdGVzIGZvciBMaW51eCB2ZXJzaW9uIDMuICBSZWFkIHRoZW0gY2FyZWZ1bGx5LAogYXMgdGhleSB0ZWxsIHlvdSB3aGF0IHRoaXMgaXMgYWxsIGFib3V0LCBleHBsYWluIGhvdyB0byBpbnN0YWxsIHRoZQoga2VybmVsLCBhbmQgd2hhdCB0byBkbyBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4gCiAKQEAgLTYyLDEwICs2MiwxMCBAQAogICAgZGlyZWN0b3J5IHdoZXJlIHlvdSBoYXZlIHBlcm1pc3Npb25zIChlZy4geW91ciBob21lIGRpcmVjdG9yeSkgYW5kCiAgICB1bnBhY2sgaXQ6CiAKLQkJZ3ppcCAtY2QgbGludXgtMi42LlhYLnRhci5neiB8IHRhciB4dmYgLQorCQlnemlwIC1jZCBsaW51eC0zLlgudGFyLmd6IHwgdGFyIHh2ZiAtCiAKICAgIG9yCi0JCWJ6aXAyIC1kYyBsaW51eC0yLjYuWFgudGFyLmJ6MiB8IHRhciB4dmYgLQorCQliemlwMiAtZGMgbGludXgtMy5YLnRhci5iejIgfCB0YXIgeHZmIC0KIAogCiAgICBSZXBsYWNlICJYWCIgd2l0aCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxhdGVzdCBrZXJuZWwuCkBAIC03NSwxNSArNzUsMTUgQEAKICAgIGZpbGVzLiAgVGhleSBzaG91bGQgbWF0Y2ggdGhlIGxpYnJhcnksIGFuZCBub3QgZ2V0IG1lc3NlZCB1cCBieQogICAgd2hhdGV2ZXIgdGhlIGtlcm5lbC1kdS1qb3VyIGhhcHBlbnMgdG8gYmUuCiAKLSAtIFlvdSBjYW4gYWxzbyB1cGdyYWRlIGJldHdlZW4gMi42Lnh4IHJlbGVhc2VzIGJ5IHBhdGNoaW5nLiAgUGF0Y2hlcyBhcmUKKyAtIFlvdSBjYW4gYWxzbyB1cGdyYWRlIGJldHdlZW4gMy54IHJlbGVhc2VzIGJ5IHBhdGNoaW5nLiAgUGF0Y2hlcyBhcmUKICAgIGRpc3RyaWJ1dGVkIGluIHRoZSB0cmFkaXRpb25hbCBnemlwIGFuZCB0aGUgbmV3ZXIgYnppcDIgZm9ybWF0LiAgVG8KICAgIGluc3RhbGwgYnkgcGF0Y2hpbmcsIGdldCBhbGwgdGhlIG5ld2VyIHBhdGNoIGZpbGVzLCBlbnRlciB0aGUKLSAgIHRvcCBsZXZlbCBkaXJlY3Rvcnkgb2YgdGhlIGtlcm5lbCBzb3VyY2UgKGxpbnV4LTIuNi54eCkgYW5kIGV4ZWN1dGU6CisgICB0b3AgbGV2ZWwgZGlyZWN0b3J5IG9mIHRoZSBrZXJuZWwgc291cmNlIChsaW51eC0zLngpIGFuZCBleGVjdXRlOgogCi0JCWd6aXAgLWNkIC4uL3BhdGNoLTIuNi54eC5neiB8IHBhdGNoIC1wMQorCQlnemlwIC1jZCAuLi9wYXRjaC0zLnguZ3ogfCBwYXRjaCAtcDEKIAogICAgb3IKLQkJYnppcDIgLWRjIC4uL3BhdGNoLTIuNi54eC5iejIgfCBwYXRjaCAtcDEKKwkJYnppcDIgLWRjIC4uL3BhdGNoLTMueC5iejIgfCBwYXRjaCAtcDEKIAogICAgKHJlcGVhdCB4eCBmb3IgYWxsIHZlcnNpb25zIGJpZ2dlciB0aGFuIHRoZSB2ZXJzaW9uIG9mIHlvdXIgY3VycmVudAogICAgc291cmNlIHRyZWUsIF9pbl9vcmRlcl8pIGFuZCB5b3Ugc2hvdWxkIGJlIG9rLiAgWW91IG1heSB3YW50IHRvIHJlbW92ZQpAQCAtOTEsOSArOTEsOSBAQAogICAgZmFpbGVkIHBhdGNoZXMgKHh4eCMgb3IgeHh4LnJlaikuIElmIHRoZXJlIGFyZSwgZWl0aGVyIHlvdSBvciBtZSBoYXMKICAgIG1hZGUgYSBtaXN0YWtlLgogCi0gICBVbmxpa2UgcGF0Y2hlcyBmb3IgdGhlIDIuNi54IGtlcm5lbHMsIHBhdGNoZXMgZm9yIHRoZSAyLjYueC55IGtlcm5lbHMKKyAgIFVubGlrZSBwYXRjaGVzIGZvciB0aGUgMy54IGtlcm5lbHMsIHBhdGNoZXMgZm9yIHRoZSAzLngueSBrZXJuZWxzCiAgICAoYWxzbyBrbm93biBhcyB0aGUgLXN0YWJsZSBrZXJuZWxzKSBhcmUgbm90IGluY3JlbWVudGFsIGJ1dCBpbnN0ZWFkIGFwcGx5Ci0gICBkaXJlY3RseSB0byB0aGUgYmFzZSAyLjYueCBrZXJuZWwuICBQbGVhc2UgcmVhZAorICAgZGlyZWN0bHkgdG8gdGhlIGJhc2UgMy54IGtlcm5lbC4gIFBsZWFzZSByZWFkCiAgICBEb2N1bWVudGF0aW9uL2FwcGx5aW5nLXBhdGNoZXMudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCiAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgc2NyaXB0IHBhdGNoLWtlcm5lbCBjYW4gYmUgdXNlZCB0byBhdXRvbWF0ZSB0aGlzCkBAIC0xMDcsMTQgKzEwNywxNCBAQAogICAgYW4gYWx0ZXJuYXRpdmUgZGlyZWN0b3J5IGNhbiBiZSBzcGVjaWZpZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4KIAogIC0gSWYgeW91IGFyZSB1cGdyYWRpbmcgYmV0d2VlbiByZWxlYXNlcyB1c2luZyB0aGUgc3RhYmxlIHNlcmllcyBwYXRjaGVzCi0gICAoZm9yIGV4YW1wbGUsIHBhdGNoLTIuNi54eC55KSwgbm90ZSB0aGF0IHRoZXNlICJkb3QtcmVsZWFzZXMiIGFyZQotICAgbm90IGluY3JlbWVudGFsIGFuZCBtdXN0IGJlIGFwcGxpZWQgdG8gdGhlIDIuNi54eCBiYXNlIHRyZWUuIEZvcgotICAgZXhhbXBsZSwgaWYgeW91ciBiYXNlIGtlcm5lbCBpcyAyLjYuMTIgYW5kIHlvdSB3YW50IHRvIGFwcGx5IHRoZQotICAgMi42LjEyLjMgcGF0Y2gsIHlvdSBkbyBub3QgYW5kIGluZGVlZCBtdXN0IG5vdCBmaXJzdCBhcHBseSB0aGUKLSAgIDIuNi4xMi4xIGFuZCAyLjYuMTIuMiBwYXRjaGVzLiBTaW1pbGFybHksIGlmIHlvdSBhcmUgcnVubmluZyBrZXJuZWwKLSAgIHZlcnNpb24gMi42LjEyLjIgYW5kIHdhbnQgdG8ganVtcCB0byAyLjYuMTIuMywgeW91IG11c3QgZmlyc3QKLSAgIHJldmVyc2UgdGhlIDIuNi4xMi4yIHBhdGNoICh0aGF0IGlzLCBwYXRjaCAtUikgX2JlZm9yZV8gYXBwbHlpbmcKLSAgIHRoZSAyLjYuMTIuMyBwYXRjaC4KKyAgIChmb3IgZXhhbXBsZSwgcGF0Y2gtMy54LnkpLCBub3RlIHRoYXQgdGhlc2UgImRvdC1yZWxlYXNlcyIgYXJlCisgICBub3QgaW5jcmVtZW50YWwgYW5kIG11c3QgYmUgYXBwbGllZCB0byB0aGUgMy54IGJhc2UgdHJlZS4gRm9yCisgICBleGFtcGxlLCBpZiB5b3VyIGJhc2Uga2VybmVsIGlzIDMuMCBhbmQgeW91IHdhbnQgdG8gYXBwbHkgdGhlCisgICAzLjAuMyBwYXRjaCwgeW91IGRvIG5vdCBhbmQgaW5kZWVkIG11c3Qgbm90IGZpcnN0IGFwcGx5IHRoZQorICAgMy4wLjEgYW5kIDMuMC4yIHBhdGNoZXMuIFNpbWlsYXJseSwgaWYgeW91IGFyZSBydW5uaW5nIGtlcm5lbAorICAgdmVyc2lvbiAzLjAuMiBhbmQgd2FudCB0byBqdW1wIHRvIDMuMC4zLCB5b3UgbXVzdCBmaXJzdAorICAgcmV2ZXJzZSB0aGUgMy4wLjIgcGF0Y2ggKHRoYXQgaXMsIHBhdGNoIC1SKSBfYmVmb3JlXyBhcHBseWluZworICAgdGhlIDMuMC4zIHBhdGNoLgogICAgWW91IGNhbiByZWFkIG1vcmUgb24gdGhpcyBpbiBEb2N1bWVudGF0aW9uL2FwcGx5aW5nLXBhdGNoZXMudHh0CiAKICAtIE1ha2Ugc3VyZSB5b3UgaGF2ZSBubyBzdGFsZSAubyBmaWxlcyBhbmQgZGVwZW5kZW5jaWVzIGx5aW5nIGFyb3VuZDoKQEAgLTEyNiw3ICsxMjYsNyBAQAogCiBTT0ZUV0FSRSBSRVFVSVJFTUVOVFMKIAotICAgQ29tcGlsaW5nIGFuZCBydW5uaW5nIHRoZSAyLjYueHgga2VybmVscyByZXF1aXJlcyB1cC10by1kYXRlCisgICBDb21waWxpbmcgYW5kIHJ1bm5pbmcgdGhlIDMueCBrZXJuZWxzIHJlcXVpcmVzIHVwLXRvLWRhdGUKICAgIHZlcnNpb25zIG9mIHZhcmlvdXMgc29mdHdhcmUgcGFja2FnZXMuICBDb25zdWx0CiAgICBEb2N1bWVudGF0aW9uL0NoYW5nZXMgZm9yIHRoZSBtaW5pbXVtIHZlcnNpb24gbnVtYmVycyByZXF1aXJlZAogICAgYW5kIGhvdyB0byBnZXQgdXBkYXRlcyBmb3IgdGhlc2UgcGFja2FnZXMuICBCZXdhcmUgdGhhdCB1c2luZwpAQCAtMTQyLDExICsxNDIsMTEgQEAKICAgIFVzaW5nIHRoZSBvcHRpb24gIm1ha2UgTz1vdXRwdXQvZGlyIiBhbGxvdyB5b3UgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUKICAgIHBsYWNlIGZvciB0aGUgb3V0cHV0IGZpbGVzIChpbmNsdWRpbmcgLmNvbmZpZykuCiAgICBFeGFtcGxlOgotICAgICBrZXJuZWwgc291cmNlIGNvZGU6CS91c3Ivc3JjL2xpbnV4LTIuNi5OCisgICAgIGtlcm5lbCBzb3VyY2UgY29kZToJL3Vzci9zcmMvbGludXgtMy5OCiAgICAgIGJ1aWxkIGRpcmVjdG9yeToJCS9ob21lL25hbWUvYnVpbGQva2VybmVsCiAKICAgIFRvIGNvbmZpZ3VyZSBhbmQgYnVpbGQgdGhlIGtlcm5lbCB1c2U6Ci0gICBjZCAvdXNyL3NyYy9saW51eC0yLjYuTgorICAgY2QgL3Vzci9zcmMvbGludXgtMy5OCiAgICBtYWtlIE89L2hvbWUvbmFtZS9idWlsZC9rZXJuZWwgbWVudWNvbmZpZwogICAgbWFrZSBPPS9ob21lL25hbWUvYnVpbGQva2VybmVsCiAgICBzdWRvIG1ha2UgTz0vaG9tZS9uYW1lL2J1aWxkL2tlcm5lbCBtb2R1bGVzX2luc3RhbGwgaW5zdGFsbApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9LY29uZmlnIGIvYXJjaC9hbHBoYS9LY29uZmlnCmluZGV4IDYwMjE5YmYuLmNhMmRhOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvS2NvbmZpZworKysgYi9hcmNoL2FscGhhL0tjb25maWcKQEAgLTYsNiArNiw3IEBACiAJc2VsZWN0IEhBVkVfT1BST0ZJTEUKIAlzZWxlY3QgSEFWRV9TWVNDQUxMX1dSQVBQRVJTCiAJc2VsZWN0IEhBVkVfSVJRX1dPUksKKwlzZWxlY3QgSEFWRV9QQ1NQS1JfUExBVEZPUk0KIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUwogCXNlbGVjdCBIQVZFX0RNQV9BVFRSUwogCXNlbGVjdCBIQVZFX0dFTkVSSUNfSEFSRElSUVMKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vODI1M3BpdC5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS84MjUzcGl0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MWM5YzEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS84MjUzcGl0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qCi0gKiA4MjUzLzgyNTQgUHJvZ3JhbW1hYmxlIEludGVydmFsIFRpbWVyCi0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vZmxvcHB5LmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2Zsb3BweS5oCmluZGV4IDBiZTUwNDEuLjQ2Y2VmYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vZmxvcHB5LmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9mbG9wcHkuaApAQCAtMjcsNyArMjcsNyBAQAogI2RlZmluZSBmZF9jYWNoZWZsdXNoKGFkZHIsc2l6ZSkgLyogbm90aGluZyAqLwogI2RlZmluZSBmZF9yZXF1ZXN0X2lycSgpICAgICAgICByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaW50ZXJydXB0LFwKIAkJCQkJICAgIElSUUZfRElTQUJMRUQsICJmbG9wcHkiLCBOVUxMKQotI2RlZmluZSBmZF9mcmVlX2lycSgpICAgICAgICAgICBmcmVlX2lycShGTE9QUFlfSVJRLCBOVUxMKTsKKyNkZWZpbmUgZmRfZnJlZV9pcnEoKSAgICAgICAgICAgZnJlZV9pcnEoRkxPUFBZX0lSUSwgTlVMTCkKIAogI2lmZGVmIENPTkZJR19QQ0kKIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9tbXpvbmUuaCBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vbW16b25lLmgKaW5kZXggOGFmNTZjZS4uNDQ1ZGM0MiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9tbXpvbmUuaAorKysgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL21tem9uZS5oCkBAIC01Niw3ICs1Niw2IEBACiAgKiBHaXZlbiBhIGtlcm5lbCBhZGRyZXNzLCBmaW5kIHRoZSBob21lIG5vZGUgb2YgdGhlIHVuZGVybHlpbmcgbWVtb3J5LgogICovCiAjZGVmaW5lIGt2YWRkcl90b19uaWQoa2FkZHIpCXBhX3RvX25pZChfX3BhKGthZGRyKSkKLSNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQogCiAvKgogICogR2l2ZW4gYSBrYWRkciwgTE9DQUxfQkFTRV9BRERSIGZpbmRzIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvYWxwaGEva2VybmVsL21vZHVsZS5jCmluZGV4IGViYzNjODkuLjJmZDAwYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL21vZHVsZS5jCkBAIC0yOSwyMCArMjksNiBAQAogI2RlZmluZSBERUJVR1AoZm10Li4uKQogI2VuZGlmCiAKLXZvaWQgKgotbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpZiAoc2l6ZSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdm1hbGxvYyhzaXplKTsKLX0KLQotdm9pZAotbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKQotewotCXZmcmVlKG1vZHVsZV9yZWdpb24pOwotfQotCiAvKiBBbGxvY2F0ZSB0aGUgR09UIGF0IHRoZSBlbmQgb2YgdGhlIGNvcmUgc2VjdGlvbnMuICAqLwogCiBzdHJ1Y3QgZ290X2VudHJ5IHsKQEAgLTE1NiwxNCArMTQyLDYgQEAKIH0KIAogaW50Ci1hcHBseV9yZWxvY2F0ZShFbGY2NF9TaGRyICpzZWNoZHJzLCBjb25zdCBjaGFyICpzdHJ0YWIsIHVuc2lnbmVkIGludCBzeW1pbmRleCwKLQkgICAgICAgdW5zaWduZWQgaW50IHJlbHNlYywgc3RydWN0IG1vZHVsZSAqbWUpCi17Ci0JcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFJFTCByZWxvY2F0aW9uIHVuc3VwcG9ydGVkXG4iLCBtZS0+bmFtZSk7Ci0JcmV0dXJuIC1FTk9FWEVDOwotfQotCi1pbnQKIGFwcGx5X3JlbG9jYXRlX2FkZChFbGY2NF9TaGRyICpzZWNoZHJzLCBjb25zdCBjaGFyICpzdHJ0YWIsCiAJCSAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwgdW5zaWduZWQgaW50IHJlbHNlYywKIAkJICAgc3RydWN0IG1vZHVsZSAqbWUpCkBAIC0zMDIsMTUgKzI4MCwzIEBACiAKIAlyZXR1cm4gMDsKIH0KLQotaW50Ci1tb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCXN0cnVjdCBtb2R1bGUgKm1lKQotewotCXJldHVybiAwOwotfQotCi12b2lkCi1tb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYyBiL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYwppbmRleCAzNzZmMjIxLi4zMjZmMGEyIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jCkBAIC00MDksNyArNDA5LDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlsZW4gPSBuYW1lbGVuOwotCWlmIChuYW1lbGVuID4gMzIpCisJaWYgKGxlbiA+IDMyKQogCQlsZW4gPSAzMjsKIAogCWRvd25fcmVhZCgmdXRzX3NlbSk7CkBAIC01OTQsNyArNTk0LDcgQEAKIAlkb3duX3JlYWQoJnV0c19zZW0pOwogCXJlcyA9IHN5c2luZm9fdGFibGVbb2Zmc2V0XTsKIAlsZW4gPSBzdHJsZW4ocmVzKSsxOwotCWlmIChsZW4gPiBjb3VudCkKKwlpZiAoKHVuc2lnbmVkIGxvbmcpbGVuID4gKHVuc2lnbmVkIGxvbmcpY291bnQpCiAJCWxlbiA9IGNvdW50OwogCWlmIChjb3B5X3RvX3VzZXIoYnVmLCByZXMsIGxlbikpCiAJCWVyciA9IC1FRkFVTFQ7CkBAIC02NDksNyArNjQ5LDcgQEAKIAkJcmV0dXJuIDE7CiAKIAljYXNlIEdTSV9HRVRfSFdSUEI6Ci0JCWlmIChuYnl0ZXMgPCBzaXplb2YoKmh3cnBiKSkKKwkJaWYgKG5ieXRlcyA+IHNpemVvZigqaHdycGIpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBod3JwYiwgbmJ5dGVzKSAhPSAwKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xMDA4LDYgKzEwMDgsNyBAQAogewogCXN0cnVjdCBydXNhZ2UgcjsKIAlsb25nIHJldCwgZXJyOworCXVuc2lnbmVkIGludCBzdGF0dXMgPSAwOwogCW1tX3NlZ21lbnRfdCBvbGRfZnM7CiAKIAlpZiAoIXVyKQpAQCAtMTAxNiwxMyArMTAxNywxNSBAQAogCW9sZF9mcyA9IGdldF9mcygpOwogCQkKIAlzZXRfZnMgKEtFUk5FTF9EUyk7Ci0JcmV0ID0gc3lzX3dhaXQ0KHBpZCwgdXN0YXR1cywgb3B0aW9ucywgKHN0cnVjdCBydXNhZ2UgX191c2VyICopICZyKTsKKwlyZXQgPSBzeXNfd2FpdDQocGlkLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSAmc3RhdHVzLCBvcHRpb25zLAorCQkJKHN0cnVjdCBydXNhZ2UgX191c2VyICopICZyKTsKIAlzZXRfZnMgKG9sZF9mcyk7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVyLCBzaXplb2YoKnVyKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJZXJyID0gMDsKKwllcnIgfD0gcHV0X3VzZXIoc3RhdHVzLCB1c3RhdHVzKTsKIAllcnIgfD0gX19wdXRfdXNlcihyLnJ1X3V0aW1lLnR2X3NlYywgJnVyLT5ydV91dGltZS50dl9zZWMpOwogCWVyciB8PSBfX3B1dF91c2VyKHIucnVfdXRpbWUudHZfdXNlYywgJnVyLT5ydV91dGltZS50dl91c2VjKTsKIAllcnIgfD0gX19wdXRfdXNlcihyLnJ1X3N0aW1lLnR2X3NlYywgJnVyLT5ydV9zdGltZS50dl9zZWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvcGVyZl9ldmVudC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDkwNTYxYzQuLjhlNDc3MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3BlcmZfZXZlbnQuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCWRhdGEucGVyaW9kID0gZXZlbnQtPmh3Lmxhc3RfcGVyaW9kOwogCiAJaWYgKGFscGhhX3BlcmZfZXZlbnRfc2V0X3BlcmlvZChldmVudCwgaHdjLCBpZHgpKSB7Ci0JCWlmIChwZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCAxLCAmZGF0YSwgcmVncykpIHsKKwkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsICZkYXRhLCByZWdzKSkgewogCQkJLyogSW50ZXJydXB0cyBjb21pbmcgdG9vIHF1aWNrbHk7ICJ0aHJvdHRsZSIgdGhlCiAJCQkgKiBjb3VudGVyLCBpLmUuLCBkaXNhYmxlIGl0IGZvciBhIGxpdHRsZSB3aGlsZS4KIAkJCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDgzOGVhYzEuLjg5YmJlNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIwMCw3ICsyMDAsNiBAQAogdm9pZAogc3RhcnRfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICogcmVncywgdW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBzcCkKIHsKLQlzZXRfZnMoVVNFUl9EUyk7CiAJcmVncy0+cGMgPSBwYzsKIAlyZWdzLT5wcyA9IDg7CiAJd3J1c3Aoc3ApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19ydWZmaWFuLmMKaW5kZXggOGRlMTA0Ni4uZjMzNjQ4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcnVmZmlhbi5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vY29yZV9jaWEuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vODI1M3BpdC5oPgogCiAjaW5jbHVkZSAicHJvdG8uaCIKICNpbmNsdWRlICJpcnFfaW1wbC5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jCmluZGV4IDgxOGU3NGUuLmUzMzY2OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9od3JwYi5oPgotI2luY2x1ZGUgPGFzbS84MjUzcGl0Lmg+CiAjaW5jbHVkZSA8YXNtL3J0Yy5oPgogCiAjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KQEAgLTkxLDcgKzkwLDcgQEAKICNkZWZpbmUgdGVzdF9pcnFfd29ya19wZW5kaW5nKCkgICAgICBfX2dldF9jcHVfdmFyKGlycV93b3JrX3BlbmRpbmcpCiAjZGVmaW5lIGNsZWFyX2lycV93b3JrX3BlbmRpbmcoKSAgICAgX19nZXRfY3B1X3ZhcihpcnFfd29ya19wZW5kaW5nKSA9IDAKIAotdm9pZCBzZXRfaXJxX3dvcmtfcGVuZGluZyh2b2lkKQordm9pZCBhcmNoX2lycV93b3JrX3JhaXNlKHZvaWQpCiB7CiAJc2V0X2lycV93b3JrX3BlbmRpbmdfZmxhZygpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggOWFkYzI3OC4uOWNiMWY0YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC0xMCw3ICsxMCw3IEBACiAJc2VsZWN0IEdFTkVSSUNfQVRPTUlDNjQgaWYgKENQVV9WNiB8fCAhQ1BVXzMydjZLIHx8ICFBRUFCSSkKIAlzZWxlY3QgSEFWRV9PUFJPRklMRSBpZiAoSEFWRV9QRVJGX0VWRU5UUykKIAlzZWxlY3QgSEFWRV9BUkNIX0tHREIKLQlzZWxlY3QgSEFWRV9LUFJPQkVTIGlmICghWElQX0tFUk5FTCAmJiAhVEhVTUIyX0tFUk5FTCkKKwlzZWxlY3QgSEFWRV9LUFJPQkVTIGlmICFYSVBfS0VSTkVMCiAJc2VsZWN0IEhBVkVfS1JFVFBST0JFUyBpZiAoSEFWRV9LUFJPQkVTKQogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUiBpZiAoIVhJUF9LRVJORUwpCiAJc2VsZWN0IEhBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQgaWYgKCFYSVBfS0VSTkVMKQpAQCAtMzcsNiArMzcsOSBAQAogCSAgRXVyb3BlLiAgVGhlcmUgaXMgYW4gQVJNIExpbnV4IHByb2plY3Qgd2l0aCBhIHdlYiBwYWdlIGF0CiAJICA8aHR0cDovL3d3dy5hcm0ubGludXgub3JnLnVrLz4uCiAKK2NvbmZpZyBBUk1fSEFTX1NHX0NIQUlOCisJYm9vbAorCiBjb25maWcgSEFWRV9QV00KIAlib29sCiAKQEAgLTQ5MCwxNCArNDkzLDYgQEAKIAkgIFN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmcgTWFydmVsbCBLaXJrd29vZCBzZXJpZXMgU29DczoKIAkgIDg4RjYxODAsIDg4RjYxOTIgYW5kIDg4RjYyODEuCiAKLWNvbmZpZyBBUkNIX0xPS0kKLQlib29sICJNYXJ2ZWxsIExva2kgKDg4UkM4NDgwKSIKLQlzZWxlY3QgQ1BVX0ZFUk9DRU9OCi0Jc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKLQlzZWxlY3QgUExBVF9PUklPTgotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIHRoZSBNYXJ2ZWxsIExva2kgKDg4UkM4NDgwKSBTb0MuCi0KIGNvbmZpZyBBUkNIX0xQQzMyWFgKIAlib29sICJOWFAgTFBDMzJYWCIKIAlzZWxlY3QgQ0xLU1JDX01NSU8KQEAgLTY0Miw2ICs2MzcsNyBAQAogCXNlbGVjdCBOT19JT1BPUlQKIAlzZWxlY3QgU1BBUlNFX0lSUQogCXNlbGVjdCBNVUxUSV9JUlFfSEFORExFUgorCXNlbGVjdCBQTV9HRU5FUklDX0RPTUFJTlMgaWYgUE0KIAloZWxwCiAJICBTdXBwb3J0IGZvciBSZW5lc2FzJ3MgU0gtTW9iaWxlIGFuZCBSLU1vYmlsZSBBUk0gcGxhdGZvcm1zLgogCkBAIC02ODIsNiArNjc4LDcgQEAKIAlzZWxlY3QgR0VORVJJQ19HUElPCiAJc2VsZWN0IEFSQ0hfSEFTX0NQVUZSRVEKIAlzZWxlY3QgSEFWRV9DTEsKKwlzZWxlY3QgQ0xLREVWX0xPT0tVUAogCXNlbGVjdCBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVAogCXNlbGVjdCBIQVZFX1MzQzI0MTBfSTJDIGlmIEkyQwogCWhlbHAKQEAgLTY5OSw2ICs2OTYsNyBAQAogCXNlbGVjdCBDUFVfVjYKIAlzZWxlY3QgQVJNX1ZJQwogCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBDTEtERVZfTE9PS1VQCiAJc2VsZWN0IE5PX0lPUE9SVAogCXNlbGVjdCBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVAogCXNlbGVjdCBBUkNIX0hBU19DUFVGUkVRCkBAIC03MjMsNiArNzIxLDggQEAKIAlzZWxlY3QgQ1BVX1Y2CiAJc2VsZWN0IEdFTkVSSUNfR1BJTwogCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBDTEtERVZfTE9PS1VQCisJc2VsZWN0IENMS1NSQ19NTUlPCiAJc2VsZWN0IEhBVkVfUzNDMjQxMF9XQVRDSERPRyBpZiBXQVRDSERPRwogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfU0NIRURfQ0xPQ0sKQEAgLTczNiw2ICs3MzYsNyBAQAogCWJvb2wgIlNhbXN1bmcgUzVQQzEwMCIKIAlzZWxlY3QgR0VORVJJQ19HUElPCiAJc2VsZWN0IEhBVkVfQ0xLCisJc2VsZWN0IENMS0RFVl9MT09LVVAKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IEFSTV9MMV9DQUNIRV9TSElGVF82CiAJc2VsZWN0IEFSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCkBAIC03NTEsNiArNzUyLDggQEAKIAlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCiAJc2VsZWN0IEdFTkVSSUNfR1BJTwogCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBDTEtERVZfTE9PS1VQCisJc2VsZWN0IENMS1NSQ19NTUlPCiAJc2VsZWN0IEFSTV9MMV9DQUNIRV9TSElGVF82CiAJc2VsZWN0IEFSQ0hfSEFTX0NQVUZSRVEKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwpAQCAtNzY3LDYgKzc3MCw3IEBACiAJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgSEFWRV9DTEsKKwlzZWxlY3QgQ0xLREVWX0xPT0tVUAogCXNlbGVjdCBBUkNIX0hBU19DUFVGUkVRCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlzZWxlY3QgSEFWRV9TM0NfUlRDIGlmIFJUQ19DTEFTUwpAQCAtODUyLDYgKzg1Niw3IEBACiAJc2VsZWN0IEhBVkVfQ0xLCiAJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJc2VsZWN0IEFSQ0hfSEFTX0NQVUZSRVEKKwlzZWxlY3QgQ0xLU1JDX01NSU8KIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCXNlbGVjdCBIQVZFX1NDSEVEX0NMT0NLCiAJc2VsZWN0IEFSQ0hfSEFTX0hPTEVTX01FTU9SWU1PREVMCkBAIC05MjQsOCArOTI5LDYgQEAKIAogc291cmNlICJhcmNoL2FybS9tYWNoLWtzODY5NS9LY29uZmlnIgogCi1zb3VyY2UgImFyY2gvYXJtL21hY2gtbG9raS9LY29uZmlnIgotCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtbHBjMzJ4eC9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtbXNtL0tjb25maWciCkBAIC05NjksNyArOTcyLDYgQEAKIHNvdXJjZSAiYXJjaC9hcm0vcGxhdC10Y2MvS2NvbmZpZyIKIAogaWYgQVJDSF9TM0MyNDEwCi1zb3VyY2UgImFyY2gvYXJtL21hY2gtczNjMjQwMC9LY29uZmlnIgogc291cmNlICJhcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWciCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtczNjMjQxNi9LY29uZmlnIgpAQCAtMTM0Niw3ICsxMzQ4LDYgQEAKIAogY29uZmlnIEhBVkVfQVJNX1NDVQogCWJvb2wKLQlkZXBlbmRzIG9uIFNNUAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBzeXN0ZW0gY29oZXJlbmN5IHVuaXQKIApAQCAtMTcxNSwxNyArMTcxNiwzNCBAQAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGV4ZWN1dGUgeW91ciBjb21wcmVzc2VkIGtlcm5lbCBpbWFnZQogCSAgKHpJbWFnZSkgZGlyZWN0bHkgZnJvbSBST00gb3IgZmxhc2guICBJZiB1bnN1cmUsIHNheSBOLgogCitjaG9pY2UKKwlwcm9tcHQgIkluY2x1ZGUgU0QvTU1DIGxvYWRlciBpbiB6SW1hZ2UgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBaQk9PVF9ST00gJiYgQVJDSF9TSDczNzIgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBaQk9PVF9ST01fTk9ORQorCWhlbHAKKwkgIEluY2x1ZGUgZXhwZXJpbWVudGFsIFNEL01NQyBsb2FkaW5nIGNvZGUgaW4gdGhlIFJPTS1hYmxlIHpJbWFnZS4KKwkgIFdpdGggdGhpcyBlbmFibGVkIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIHRoZSB0aGUgUk9NLWFibGUgekltYWdlCisJICBrZXJuZWwgaW1hZ2UgdG8gYW4gTU1DIG9yIFNEIGNhcmQgYW5kIGJvb3QgdGhlIGtlcm5lbCBzdHJhaWdodAorCSAgZnJvbSB0aGUgcmVzZXQgdmVjdG9yLiBBdCByZXNldCB0aGUgcHJvY2Vzc29yIE1hc2sgUk9NIHdpbGwgbG9hZAorCSAgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHRoZSBST00tYWJsZSB6SW1hZ2Ugd2hpY2ggaW4gdHVybiBsb2FkcyB0aGUKKwkgIHJlc3QgdGhlIGtlcm5lbCBpbWFnZSB0byBSQU0uCisKK2NvbmZpZyBaQk9PVF9ST01fTk9ORQorCWJvb2wgIk5vIFNEL01NQyBsb2FkZXIgaW4gekltYWdlIChFWFBFUklNRU5UQUwpIgorCWhlbHAKKwkgIERvIG5vdCBsb2FkIGltYWdlIGZyb20gU0Qgb3IgTU1DCisKIGNvbmZpZyBaQk9PVF9ST01fTU1DSUYKIAlib29sICJJbmNsdWRlIE1NQ0lGIGxvYWRlciBpbiB6SW1hZ2UgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBaQk9PVF9ST00gJiYgQVJDSF9TSDczNzIgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAotCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIGV4cGVyaW1lbnRhbCBNTUNJRiBsb2FkaW5nIGNvZGUgaW4gdGhlCi0JICBST00tYWJsZSB6SW1hZ2UuIFdpdGggdGhpcyBlbmFibGVkIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIHRoZQotCSAgdGhlIFJPTS1hYmxlIHpJbWFnZSBrZXJuZWwgaW1hZ2UgdG8gYW4gTU1DIGNhcmQgYW5kIGJvb3QgdGhlCi0JICBrZXJuZWwgc3RyYWlnaHQgZnJvbSB0aGUgcmVzZXQgdmVjdG9yLiBBdCByZXNldCB0aGUgcHJvY2Vzc29yCi0JICBNYXNrIFJPTSB3aWxsIGxvYWQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHRoZSBST00tYWJsZSB6SW1hZ2UKLQkgIHdoaWNoIGluIHR1cm4gbG9hZHMgdGhlIHJlc3QgdGhlIGtlcm5lbCBpbWFnZSB0byBSQU0gdXNpbmcgdGhlCi0JICBNTUNJRiBoYXJkd2FyZSBibG9jay4KKwkgIExvYWQgaW1hZ2UgZnJvbSBNTUNJRiBoYXJkd2FyZSBibG9jay4KKworY29uZmlnIFpCT09UX1JPTV9TSF9NT0JJTEVfU0RISQorCWJvb2wgIkluY2x1ZGUgU3VwZXJIIE1vYmlsZSBTREhJIGxvYWRlciBpbiB6SW1hZ2UgKEVYUEVSSU1FTlRBTCkiCisJaGVscAorCSAgTG9hZCBpbWFnZSBmcm9tIFNESEkgaGFyZHdhcmUgYmxvY2sKKworZW5kY2hvaWNlCiAKIGNvbmZpZyBDTURMSU5FCiAJc3RyaW5nICJEZWZhdWx0IGtlcm5lbCBjb21tYW5kIHN0cmluZyIKQEAgLTE4NzUsMTAgKzE4OTMsNiBAQAogCWRlZmF1bHQgeQogCXNlbGVjdCBDUFVfRlJFUV9ERUZBVUxUX0dPVl9VU0VSU1BBQ0UKIAotY29uZmlnIENQVV9GUkVRX1MzQzY0WFgKLQlib29sICJDUFVmcmVxIHN1cHBvcnQgZm9yIFNhbXN1bmcgUzNDNjRYWCBDUFVzIgotCWRlcGVuZHMgb24gQ1BVX0ZSRVEgJiYgQ1BVX1MzQzY0MTAKLQogY29uZmlnIENQVV9GUkVRX1MzQwogCWJvb2wKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IGY1YjJiMzkuLjIwNmMzNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC0xNTAsNyArMTUwLDYgQEAKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9JWFA0WFgpCQk6PSBpeHA0eHgKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9LSVJLV09PRCkJCTo9IGtpcmt3b29kCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfS1M4Njk1KQkJOj0ga3M4Njk1Ci1tYWNoaW5lLSQoQ09ORklHX0FSQ0hfTE9LSSkgCQk6PSBsb2tpCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTFBDMzJYWCkJCTo9IGxwYzMyeHgKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9NTVApCQk6PSBtbXAKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9NU00pCQk6PSBtc20KQEAgLTE3Miw4ICsxNzEsNyBAQAogbWFjaGluZS0kKENPTkZJR19BUkNIX1BYQSkJCTo9IHB4YQogbWFjaGluZS0kKENPTkZJR19BUkNIX1JFQUxWSUVXKQkJOj0gcmVhbHZpZXcKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9SUEMpCQk6PSBycGMKLW1hY2hpbmUtJChDT05GSUdfQVJDSF9TM0MyNDEwKQkJOj0gczNjMjQxMCBzM2MyNDAwIHMzYzI0MTIgczNjMjQxNiBzM2MyNDQwIHMzYzI0NDMKLW1hY2hpbmUtJChDT05GSUdfQVJDSF9TM0MyNEEwKQkJOj0gczNjMjRhMAorbWFjaGluZS0kKENPTkZJR19BUkNIX1MzQzI0MTApCQk6PSBzM2MyNDEwIHMzYzI0MTIgczNjMjQxNiBzM2MyNDQwIHMzYzI0NDMKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9TM0M2NFhYKQkJOj0gczNjNjR4eAogbWFjaGluZS0kKENPTkZJR19BUkNIX1M1UDY0WDApCQk6PSBzNXA2NHgwCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfUzVQQzEwMCkJCTo9IHM1cGMxMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQppbmRleCAyM2FhZDA3Li4wYzc0YTZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC02LDEzICs2LDE5IEBACiAKIE9CSlMJCT0KIAotIyBFbnN1cmUgdGhhdCBtbWNpZiBsb2FkZXIgY29kZSBhcHBlYXJzIGVhcmx5IGluIHRoZSBpbWFnZQorIyBFbnN1cmUgdGhhdCBNTUNJRiBsb2FkZXIgY29kZSBhcHBlYXJzIGVhcmx5IGluIHRoZSBpbWFnZQogIyB0byBtaW5pbWlzZSB0aGF0IG51bWJlciBvZiBib2NrcyB0aGF0IGhhdmUgdG8gYmUgcmVhZCBpbgogIyBvcmRlciB0byBsb2FkIGl0LgogaWZlcSAoJChDT05GSUdfWkJPT1RfUk9NX01NQ0lGKSx5KQotaWZlcSAoJChDT05GSUdfQVJDSF9TSDczNzIpLHkpCiBPQkpTCQkrPSBtbWNpZi1zaDczNzIubwogZW5kaWYKKworIyBFbnN1cmUgdGhhdCBTREhJIGxvYWRlciBjb2RlIGFwcGVhcnMgZWFybHkgaW4gdGhlIGltYWdlCisjIHRvIG1pbmltaXNlIHRoYXQgbnVtYmVyIG9mIGJvY2tzIHRoYXQgaGF2ZSB0byBiZSByZWFkIGluCisjIG9yZGVyIHRvIGxvYWQgaXQuCitpZmVxICgkKENPTkZJR19aQk9PVF9ST01fU0hfTU9CSUxFX1NESEkpLHkpCitPQkpTCQkrPSBzZGhpLXNobW9iaWxlLm8KK09CSlMJCSs9IHNkaGktc2g3MzcyLm8KIGVuZGlmCiAKIEFGTEFHU19oZWFkLm8gKz0gLURURVhUX09GRlNFVD0kKFRFWFRfT0ZGU0VUKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtc2htb2JpbGUuUyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLXNobW9iaWxlLlMKaW5kZXggYzk0M2QyZS4uZmUzNzE5YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtc2htb2JpbGUuUworKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1zaG1vYmlsZS5TCkBAIC0yNSwxNCArMjUsMTQgQEAKIAkvKiBsb2FkIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGNvZGUgKi8KICNpbmNsdWRlIDxtYWNoL3pib290Lmg+CiAKLSNpZmRlZiBDT05GSUdfWkJPT1RfUk9NX01NQ0lGCi0JLyogTG9hZCBpbWFnZSBmcm9tIE1NQyAqLwotCWFkcglzcCwgX190bXBfc3RhY2sgKyAxMjgKKyNpZiBkZWZpbmVkKENPTkZJR19aQk9PVF9ST01fTU1DSUYpIHx8IGRlZmluZWQoQ09ORklHX1pCT09UX1JPTV9TSF9NT0JJTEVfU0RISSkKKwkvKiBMb2FkIGltYWdlIGZyb20gTU1DL1NEICovCisJYWRyCXNwLCBfX3RtcF9zdGFjayArIDI1NgogCWxkcglyMCwgX19pbWFnZV9zdGFydAogCWxkcglyMSwgX19pbWFnZV9lbmQKIAlzdWJzCXIxLCByMSwgcjAKIAlsZHIJcjAsIF9fbG9hZF9iYXNlCi0JYmwJbW1jaWZfbG9hZGVyCisJYmwJbW1jX2xvYWRlcgogCiAJLyogSnVtcCB0byBsb2FkZWQgY29kZSAqLwogCWxkcglyMCwgX19sb2FkZWQKQEAgLTUxLDkgKzUxLDkgQEAKIAkubG9uZwlfX2NvbnRpbnVlCiAJLmFsaWduCiBfX3RtcF9zdGFjazoKLQkuc3BhY2UJMTI4CisJLnNwYWNlCTI1NgogX19jb250aW51ZToKLSNlbmRpZiAvKiBDT05GSUdfWkJPT1RfUk9NX01NQ0lGICovCisjZW5kaWYgLyogQ09ORklHX1pCT09UX1JPTV9NTUMgfHwgQ09ORklHX1pCT09UX1JPTV9TSF9NT0JJTEVfU0RISSAqLwogCiAJYgkxZgogX19hdGFnczpAIHRhZyAjMQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKaW5kZXggZjlkYTQxOS4uZTk1YTU5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUworKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCkBAIC0zNTMsNyArMzUzLDggQEAKIAkJbW92CXIwLCAjMAkJCUAgbXVzdCBiZSB6ZXJvCiAJCW1vdglyMSwgcjcJCQlAIHJlc3RvcmUgYXJjaGl0ZWN0dXJlIG51bWJlcgogCQltb3YJcjIsIHI4CQkJQCByZXN0b3JlIGF0YWdzIHBvaW50ZXIKLQkJbW92CXBjLCByNAkJCUAgY2FsbCBrZXJuZWwKKyBBUk0oCQltb3YJcGMsIHI0CSkJCUAgY2FsbCBrZXJuZWwKKyBUSFVNQigJCWJ4CXI0CSkJCUAgZW50cnkgcG9pbnQgaXMgYWx3YXlzIEFSTQogCiAJCS5hbGlnbgkyCiAJCS50eXBlCUxDMCwgI29iamVjdApAQCAtNTk3LDYgKzU5OCw4IEBACiAJCXN1YglwYywgbHIsIHIwLCBsc3IgIzMyCUAgcHJvcGVybHkgZmx1c2ggcGlwZWxpbmUKICNlbmRpZgogCisjZGVmaW5lIFBST0NfRU5UUllfU0laRSAoNCo1KQorCiAvKgogICogSGVyZSBmb2xsb3cgdGhlIHJlbG9jYXRhYmxlIGNhY2hlIHN1cHBvcnQgZnVuY3Rpb25zIGZvciB0aGUKICAqIHZhcmlvdXMgcHJvY2Vzc29ycy4gIFRoaXMgaXMgYSBnZW5lcmljIGhvb2sgZm9yIGxvY2F0aW5nIGFuCkBAIC02MjQsNyArNjI3LDcgQEAKICBBUk0oCQlhZGRlcQlwYywgcjEyLCByMwkJKSBAIGNhbGwgY2FjaGUgZnVuY3Rpb24KICBUSFVNQigJCWFkZGVxCXIxMiwgcjMJCQkpCiAgVEhVTUIoCQltb3ZlcQlwYywgcjEyCQkJKSBAIGNhbGwgY2FjaGUgZnVuY3Rpb24KLQkJYWRkCXIxMiwgcjEyLCAjNCo1CisJCWFkZAlyMTIsIHIxMiwgI1BST0NfRU5UUllfU0laRQogCQliCTFiCiAKIC8qCkBAIC02OTEsOSArNjk0LDkgQEAKIAogCQkud29yZAkweDQxMDY5MjYwCQlAIEFSTTkyNkVKLVMgKHY1VEVKKQogCQkud29yZAkweGZmMGZmZmYwCi0JCWIJX19hcm05MjZlanNfbW11X2NhY2hlX29uCi0JCWIJX19hcm12NF9tbXVfY2FjaGVfb2ZmCi0JCWIJX19hcm12NXRlal9tbXVfY2FjaGVfZmx1c2gKKwkJVyhiKQlfX2FybTkyNmVqc19tbXVfY2FjaGVfb24KKwkJVyhiKQlfX2FybXY0X21tdV9jYWNoZV9vZmYKKwkJVyhiKQlfX2FybXY1dGVqX21tdV9jYWNoZV9mbHVzaAogCiAJCS53b3JkCTB4MDAwMDcwMDAJCUAgQVJNNyBJRHMKIAkJLndvcmQJMHgwMDAwZjAwMApAQCAtNzk0LDYgKzc5NywxNiBAQAogCiAJCS5zaXplCXByb2NfdHlwZXMsIC4gLSBwcm9jX3R5cGVzCiAKKwkJLyoKKwkJICogSWYgeW91IGdldCBhICJub24tY29uc3RhbnQgZXhwcmVzc2lvbiBpbiAiLmlmIiBzdGF0ZW1lbnQiCisJCSAqIGVycm9yIGZyb20gdGhlIGFzc2VtYmxlciBvbiB0aGlzIGxpbmUsIGNoZWNrIHRoYXQgeW91IGhhdmUKKwkJICogbm90IGFjY2lkZW50YWxseSB3cml0dGVuIGEgImIiIGluc3RydWN0aW9uIHdoZXJlIHlvdSBzaG91bGQKKwkJICogaGF2ZSB3cml0dGVuIFcoYikuCisJCSAqLworCQkuaWYgKC4gLSBwcm9jX3R5cGVzKSAlIFBST0NfRU5UUllfU0laRSAhPSAwCisJCS5lcnJvciAiVGhlIHNpemUgb2Ygb25lIG9yIG1vcmUgcHJvY190eXBlcyBlbnRyaWVzIGlzIHdyb25nLiIKKwkJLmVuZGlmCisKIC8qCiAgKiBUdXJuIG9mZiB0aGUgQ2FjaGUgYW5kIE1NVS4gIEFSTXYzIGRvZXMgbm90IHN1cHBvcnQKICAqIHJlYWRpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIsIGJ1dCBBUk12NCBkb2VzLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL21tY2lmLXNoNzM3Mi5jIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL21tY2lmLXNoNzM3Mi5jCmluZGV4IDc0NTNjODMuLmI2ZjYxZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9tbWNpZi1zaDczNzIuYworKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvbW1jaWYtc2g3MzcyLmMKQEAgLTQwLDcgKzQwLDcgQEAKICAqIHRvIGFuIE1NQyBjYXJkCiAgKiAjIGRkIGlmPXZybDQub3V0IG9mPS9kZXYvc2R4IGJzPTUxMiBzZWVrPTEKICAqLwotYXNtbGlua2FnZSB2b2lkIG1tY2lmX2xvYWRlcih1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQorYXNtbGlua2FnZSB2b2lkIG1tY19sb2FkZXIodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAltbWNfaW5pdF9wcm9ncmVzcygpOwogCW1tY191cGRhdGVfcHJvZ3Jlc3MoTU1DX1BST0dSRVNTX0VOVEVSKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9zZGhpLXNoNzM3Mi5jIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3NkaGktc2g3MzcyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwM2E4YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9zZGhpLXNoNzM3Mi5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBTdXBlckggTW9iaWxlIFNESEkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTWFnbnVzIERhbW0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBLdW5pbm9yaSBNb3JpbW90bworICogQ29weXJpZ2h0IChDKSAyMDEwIFNpbW9uIEhvcm1hbgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFBhcnRzIGluc3BpcmVkIGJ5IHUtYm9vdAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPG1hY2gvbW1jLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2Jvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvdG1pby5oPgorCisjaW5jbHVkZSAic2RoaS1zaG1vYmlsZS5oIgorCisjZGVmaW5lIFBPUlQxNzlDUiAgICAgICAweGU2MDUyMGIzCisjZGVmaW5lIFBPUlQxODBDUiAgICAgICAweGU2MDUyMGI0CisjZGVmaW5lIFBPUlQxODFDUiAgICAgICAweGU2MDUyMGI1CisjZGVmaW5lIFBPUlQxODJDUiAgICAgICAweGU2MDUyMGI2CisjZGVmaW5lIFBPUlQxODNDUiAgICAgICAweGU2MDUyMGI3CisjZGVmaW5lIFBPUlQxODRDUiAgICAgICAweGU2MDUyMGI4CisKKyNkZWZpbmUgU01TVFBDUjMgICAgICAgIDB4ZTYxNTAxM2MKKworI2RlZmluZSBDUl9JTlBVVF9FTkFCTEUgMHgxMAorI2RlZmluZSBDUl9GVU5DVElPTjEgICAgMHgwMQorCisjZGVmaW5lIFNESEkxX0JBU0UJKHZvaWQgX19pb21lbSAqKTB4ZTY4NjAwMDAKKyNkZWZpbmUgU0RISV9CQVNFCVNESEkxX0JBU0UKKworLyogIFN1cGVySCBNb2JpbGUgU0RISSBsb2FkZXIKKyAqCisgKiBsb2FkcyB0aGUgekltYWdlIGZyb20gYW4gU0QgY2FyZCBzdGFydGluZyBmcm9tIGJsb2NrIDAKKyAqIG9uIHBoeXNpY2FsIHBhcnRpdGlvbiAxCisgKgorICogVGhlIGltYWdlIG11c3QgYmUgc3RhcnQgd2l0aCBhIHZybDQgaGVhZGVyIGFuZAorICogdGhlIHpJbWFnZSBtdXN0IHN0YXJ0IGF0IG9mZnNldCA1MTIgb2YgdGhlIGltYWdlLiBUaGF0IGlzLAorICogYXQgYmxvY2sgMSAoPWJ5dGUgNTEyKSBvZiBwaHlzaWNhbCBwYXJ0aXRpb24gMQorICoKKyAqIFVzZSB0aGUgZm9sbG93aW5nIGxpbmUgdG8gd3JpdGUgdGhlIHZybDQgZm9ybWF0ZWQgekltYWdlCisgKiB0byBhbiBTRCBjYXJkCisgKiAjIGRkIGlmPXZybDQub3V0IG9mPS9kZXYvc2R4IGJzPTUxMgorICovCithc21saW5rYWdlIHZvaWQgbW1jX2xvYWRlcih1bnNpZ25lZCBzaG9ydCAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlpbnQgaGlnaF9jYXBhY2l0eTsKKworCW1tY19pbml0X3Byb2dyZXNzKCk7CisKKwltbWNfdXBkYXRlX3Byb2dyZXNzKE1NQ19QUk9HUkVTU19FTlRFUik7CisgICAgICAgIC8qIEluaXRpYWxpc2UgU0RISTEgKi8KKyAgICAgICAgLyogUE9SVDE4NENSOiBHUElPX0ZOX1NESElDTUQxIENvbnRyb2wgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKENSX0ZVTkNUSU9OMSwgUE9SVDE4NENSKTsKKyAgICAgICAgLyogUE9SVDE3OUNSOiBHUElPX0ZOX1NESElDTEsxIENvbnRyb2wgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKENSX0lOUFVUX0VOQUJMRXxDUl9GVU5DVElPTjEsIFBPUlQxNzlDUik7CisgICAgICAgIC8qIFBPUlQxODFDUjogR1BJT19GTl9TREhJRDFfMyBDb250cm9sICovCisgICAgICAgIF9fcmF3X3dyaXRlYihDUl9GVU5DVElPTjEsIFBPUlQxODNDUik7CisgICAgICAgIC8qIFBPUlQxODJDUjogR1BJT19GTl9TREhJRDFfMiBDb250cm9sICovCisgICAgICAgIF9fcmF3X3dyaXRlYihDUl9GVU5DVElPTjEsIFBPUlQxODJDUik7CisgICAgICAgIC8qIFBPUlQxODNDUjogR1BJT19GTl9TREhJRDFfMSBDb250cm9sICovCisgICAgICAgIF9fcmF3X3dyaXRlYihDUl9GVU5DVElPTjEsIFBPUlQxODFDUik7CisgICAgICAgIC8qIFBPUlQxODBDUjogR1BJT19GTl9TREhJRDFfMCBDb250cm9sICovCisgICAgICAgIF9fcmF3X3dyaXRlYihDUl9GVU5DVElPTjEsIFBPUlQxODBDUik7CisKKyAgICAgICAgLyogRW5hYmxlIGNsb2NrIHRvIFNESEkxIGhhcmR3YXJlIGJsb2NrICovCisgICAgICAgIF9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChTTVNUUENSMykgJiB+KDEgPDwgMTMpLCBTTVNUUENSMyk7CisKKwkvKiBzZXR1cCBTREhJIGhhcmR3YXJlICovCisJbW1jX3VwZGF0ZV9wcm9ncmVzcyhNTUNfUFJPR1JFU1NfSU5JVCk7CisJaGlnaF9jYXBhY2l0eSA9IHNkaGlfYm9vdF9pbml0KFNESElfQkFTRSk7CisJaWYgKGhpZ2hfY2FwYWNpdHkgPCAwKQorCQlnb3RvIGVycjsKKworCW1tY191cGRhdGVfcHJvZ3Jlc3MoTU1DX1BST0dSRVNTX0xPQUQpOworCS8qIGxvYWQga2VybmVsICovCisJaWYgKHNkaGlfYm9vdF9kb19yZWFkKFNESElfQkFTRSwgaGlnaF9jYXBhY2l0eSwKKwkJCSAgICAgIDAsIC8qIEtlcm5lbCBpcyBhdCBibG9jayAxICovCisJCQkgICAgICAobGVuICsgVE1JT19CQlMgLSAxKSAvIFRNSU9fQkJTLCBidWYpKQorCQlnb3RvIGVycjsKKworICAgICAgICAvKiBEaXNhYmxlIGNsb2NrIHRvIFNESEkxIGhhcmR3YXJlIGJsb2NrICovCisgICAgICAgIF9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChTTVNUUENSMykgJiAoMSA8PCAxMyksIFNNU1RQQ1IzKTsKKworCW1tY191cGRhdGVfcHJvZ3Jlc3MoTU1DX1BST0dSRVNTX0RPTkUpOworCisJcmV0dXJuOworZXJyOgorCWZvcig7Oyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvc2RoaS1zaG1vYmlsZS5jIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3NkaGktc2htb2JpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDNkNDY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3NkaGktc2htb2JpbGUuYwpAQCAtMCwwICsxLDQ0OSBAQAorLyoKKyAqIFN1cGVySCBNb2JpbGUgU0RISQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBNYWdudXMgRGFtbQorICogQ29weXJpZ2h0IChDKSAyMDEwIEt1bmlub3JpIE1vcmltb3RvCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2ltb24gSG9ybWFuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogUGFydHMgaW5zcGlyZWQgYnkgdS1ib290CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9tbWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvdG1pby5oPgorI2luY2x1ZGUgPG1hY2gvc2RoaS5oPgorCisjZGVmaW5lIE9DUl9GQVNUQk9PVAkJKDE8PDI5KQorI2RlZmluZSBPQ1JfSENTCQkJKDE8PDMwKQorI2RlZmluZSBPQ1JfQlVTWQkJKDE8PDMxKQorCisjZGVmaW5lIFJFU1BfQ01EMTIJCTB4MDAwMDAwMzAKKworc3RhdGljIGlubGluZSB1MTYgc2RfY3RybF9yZWFkMTYodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgYWRkcikKK3sKKyAgICAgICAgcmV0dXJuIF9fcmF3X3JlYWR3KGJhc2UgKyBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgc2RfY3RybF9yZWFkMzIodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgYWRkcikKK3sKKwlyZXR1cm4gX19yYXdfcmVhZHcoYmFzZSArIGFkZHIpIHwKKwkgICAgICAgX19yYXdfcmVhZHcoYmFzZSArIGFkZHIgKyAyKSA8PCAxNjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNkX2N0cmxfd3JpdGUxNih2b2lkIF9faW9tZW0gKmJhc2UsIGludCBhZGRyLCB1MTYgdmFsKQoreworCV9fcmF3X3dyaXRldyh2YWwsIGJhc2UgKyBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNkX2N0cmxfd3JpdGUzMih2b2lkIF9faW9tZW0gKmJhc2UsIGludCBhZGRyLCB1MzIgdmFsKQoreworCV9fcmF3X3dyaXRldyh2YWwsIGJhc2UgKyBhZGRyKTsKKwlfX3Jhd193cml0ZXcodmFsID4+IDE2LCBiYXNlICsgYWRkciArIDIpOworfQorCisjZGVmaW5lIEFMTF9FUlJPUiAoVE1JT19TVEFUX0NNRF9JRFhfRVJSIHwgVE1JT19TVEFUX0NSQ0ZBSUwgfAkJXAorCQkgICBUTUlPX1NUQVRfU1RPUEJJVF9FUlIgfCBUTUlPX1NUQVRfREFUQVRJTUVPVVQgfAlcCisJCSAgIFRNSU9fU1RBVF9SWE9WRVJGTE9XIHwgVE1JT19TVEFUX1RYVU5ERVJSVU4gfAlcCisJCSAgIFRNSU9fU1RBVF9DTURUSU1FT1VUIHwgVE1JT19TVEFUX0lMTF9BQ0NFU1MgfAlcCisJCSAgIFRNSU9fU1RBVF9JTExfRlVOQykKKworc3RhdGljIGludCBzZGhpX2ludHIodm9pZCBfX2lvbWVtICpiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgc3RhdGUgPSBzZF9jdHJsX3JlYWQzMihiYXNlLCBDVExfU1RBVFVTKTsKKworCWlmIChzdGF0ZSAmIEFMTF9FUlJPUikgeworCQlzZF9jdHJsX3dyaXRlMzIoYmFzZSwgQ1RMX1NUQVRVUywgfkFMTF9FUlJPUik7CisJCXNkX2N0cmxfd3JpdGUzMihiYXNlLCBDVExfSVJRX01BU0ssCisJCQkJQUxMX0VSUk9SIHwKKwkJCQlzZF9jdHJsX3JlYWQzMihiYXNlLCBDVExfSVJRX01BU0spKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChzdGF0ZSAmIFRNSU9fU1RBVF9DTURSRVNQRU5EKSB7CisJCXNkX2N0cmxfd3JpdGUzMihiYXNlLCBDVExfU1RBVFVTLCB+VE1JT19TVEFUX0NNRFJFU1BFTkQpOworCQlzZF9jdHJsX3dyaXRlMzIoYmFzZSwgQ1RMX0lSUV9NQVNLLAorCQkJCVRNSU9fU1RBVF9DTURSRVNQRU5EIHwKKwkJCQlzZF9jdHJsX3JlYWQzMihiYXNlLCBDVExfSVJRX01BU0spKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzdGF0ZSAmIFRNSU9fU1RBVF9SWFJEWSkgeworCQlzZF9jdHJsX3dyaXRlMzIoYmFzZSwgQ1RMX1NUQVRVUywgflRNSU9fU1RBVF9SWFJEWSk7CisJCXNkX2N0cmxfd3JpdGUzMihiYXNlLCBDVExfSVJRX01BU0ssCisJCQkJVE1JT19TVEFUX1JYUkRZIHwgVE1JT19TVEFUX1RYVU5ERVJSVU4gfAorCQkJCXNkX2N0cmxfcmVhZDMyKGJhc2UsIENUTF9JUlFfTUFTSykpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0YXRlICYgVE1JT19TVEFUX0RBVEFFTkQpIHsKKwkJc2RfY3RybF93cml0ZTMyKGJhc2UsIENUTF9TVEFUVVMsIH5UTUlPX1NUQVRfREFUQUVORCk7CisJCXNkX2N0cmxfd3JpdGUzMihiYXNlLCBDVExfSVJRX01BU0ssCisJCQkJVE1JT19TVEFUX0RBVEFFTkQgfAorCQkJCXNkX2N0cmxfcmVhZDMyKGJhc2UsIENUTF9JUlFfTUFTSykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIGludCBzZGhpX2Jvb3Rfd2FpdF9yZXNwX2VuZCh2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJaW50IGVyciA9IC1FQUdBSU4sIHRpbWVvdXQgPSAxMDAwMDAwMDsKKworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJZXJyID0gc2RoaV9pbnRyKGJhc2UpOworCQlpZiAoZXJyICE9IC1FQUdBSU4pCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIFNESElfQ0xLX0NUUkwgKi8KKyNkZWZpbmUgQ0xLX01NQ19FTkFCTEUgICAgICAgICAgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIENMS19NTUNfSU5JVCAgICAgICAgICAgICAgICAgICAoMSA8PCA2KSAgICAgICAgLyogY2xrIC8gMjU2ICovCisKK3N0YXRpYyB2b2lkIHNkaGlfYm9vdF9tbWNfY2xrX3N0b3Aodm9pZCBfX2lvbWVtICpiYXNlKQoreworCXNkX2N0cmxfd3JpdGUxNihiYXNlLCBDVExfQ0xLX0FORF9XQUlUX0NUTCwgMHgwMDAwKTsKKwltc2xlZXAoMTApOworCXNkX2N0cmxfd3JpdGUxNihiYXNlLCBDVExfU0RfQ0FSRF9DTEtfQ1RMLCB+Q0xLX01NQ19FTkFCTEUgJgorCQlzZF9jdHJsX3JlYWQxNihiYXNlLCBDVExfU0RfQ0FSRF9DTEtfQ1RMKSk7CisJbXNsZWVwKDEwKTsKK30KKworc3RhdGljIHZvaWQgc2RoaV9ib290X21tY19jbGtfc3RhcnQodm9pZCBfX2lvbWVtICpiYXNlKQoreworCXNkX2N0cmxfd3JpdGUxNihiYXNlLCBDVExfU0RfQ0FSRF9DTEtfQ1RMLCBDTEtfTU1DX0VOQUJMRSB8CisJCXNkX2N0cmxfcmVhZDE2KGJhc2UsIENUTF9TRF9DQVJEX0NMS19DVEwpKTsKKwltc2xlZXAoMTApOworCXNkX2N0cmxfd3JpdGUxNihiYXNlLCBDVExfQ0xLX0FORF9XQUlUX0NUTCwgQ0xLX01NQ19FTkFCTEUpOworCW1zbGVlcCgxMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNkaGlfYm9vdF9yZXNldCh2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJc2RfY3RybF93cml0ZTE2KGJhc2UsIENUTF9SRVNFVF9TRCwgMHgwMDAwKTsKKwltc2xlZXAoMTApOworCXNkX2N0cmxfd3JpdGUxNihiYXNlLCBDVExfUkVTRVRfU0QsIDB4MDAwMSk7CisJbXNsZWVwKDEwKTsKK30KKworLyogU2V0IE1NQyBjbG9jayAvIHBvd2VyLgorICogTm90ZTogVGhpcyBjb250cm9sbGVyIHVzZXMgYSBzaW1wbGUgZGl2aWRlciBzY2hlbWUgdGhlcmVmb3JlIGl0IGNhbm5vdAorICogcnVuIGEgTU1DIGNhcmQgYXQgZnVsbCBzcGVlZCAoMjBNSHopLiBUaGUgbWF4IGNsb2NrIGlzIDI0TUh6IG9uIFNELCBidXQgYXMKKyAqIE1NQyB3b250IHJ1biB0aGF0IGZhc3QsIGl0IGhhcyB0byBiZSBjbG9ja2VkIGF0IDEyTUh6IHdoaWNoIGlzIHRoZSBuZXh0CisgKiBzbG93ZXN0IHNldHRpbmcuCisgKi8KK3N0YXRpYyBpbnQgc2RoaV9ib290X21tY19zZXRfaW9zKHZvaWQgX19pb21lbSAqYmFzZSwgc3RydWN0IG1tY19pb3MgKmlvcykKK3sKKwlpZiAoc2RfY3RybF9yZWFkMzIoYmFzZSwgQ1RMX1NUQVRVUykgJiBUTUlPX1NUQVRfQ01EX0JVU1kpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoaW9zLT5jbG9jaykKKwkJc2RfY3RybF93cml0ZTE2KGJhc2UsIENUTF9TRF9DQVJEX0NMS19DVEwsCisJCQkJaW9zLT5jbG9jayB8IENMS19NTUNfRU5BQkxFKTsKKworCS8qIFBvd2VyIHNlcXVlbmNlIC0gT0ZGIC0+IE9OIC0+IFVQICovCisJc3dpdGNoIChpb3MtPnBvd2VyX21vZGUpIHsKKwljYXNlIE1NQ19QT1dFUl9PRkY6IC8qIHBvd2VyIGRvd24gU0QgYnVzICovCisJCXNkaGlfYm9vdF9tbWNfY2xrX3N0b3AoYmFzZSk7CisJCWJyZWFrOworCWNhc2UgTU1DX1BPV0VSX09OOiAvKiBwb3dlciB1cCBTRCBidXMgKi8KKwkJYnJlYWs7CisJY2FzZSBNTUNfUE9XRVJfVVA6IC8qIHN0YXJ0IGJ1cyBjbG9jayAqLworCQlzZGhpX2Jvb3RfbW1jX2Nsa19zdGFydChiYXNlKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChpb3MtPmJ1c193aWR0aCkgeworCWNhc2UgTU1DX0JVU19XSURUSF8xOgorCQlzZF9jdHJsX3dyaXRlMTYoYmFzZSwgQ1RMX1NEX01FTV9DQVJEX09QVCwgMHg4MGUwKTsKKwlicmVhazsKKwljYXNlIE1NQ19CVVNfV0lEVEhfNDoKKwkJc2RfY3RybF93cml0ZTE2KGJhc2UsIENUTF9TRF9NRU1fQ0FSRF9PUFQsIDB4MDBlMCk7CisJYnJlYWs7CisJfQorCisJLyogTGV0IHRoaW5ncyBzZXR0bGUuIGRlbGF5IHRha2VuIGZyb20gd2luQ0UgZHJpdmVyICovCisJdWRlbGF5KDE0MCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlc2UgYXJlIHRoZSBiaXRtYXNrcyB0aGUgdG1pbyBjaGlwIHJlcXVpcmVzIHRvIGltcGxlbWVudCB0aGUgTU1DIHJlc3BvbnNlCisgKiB0eXBlcy4gTm90ZSB0aGF0IFIxIGFuZCBSNiBhcmUgdGhlIHNhbWUgaW4gdGhpcyBzY2hlbWUuICovCisjZGVmaW5lIFJFU1BfTk9ORSAgICAgIDB4MDMwMAorI2RlZmluZSBSRVNQX1IxICAgICAgICAweDA0MDAKKyNkZWZpbmUgUkVTUF9SMUIgICAgICAgMHgwNTAwCisjZGVmaW5lIFJFU1BfUjIgICAgICAgIDB4MDYwMAorI2RlZmluZSBSRVNQX1IzICAgICAgICAweDA3MDAKKyNkZWZpbmUgREFUQV9QUkVTRU5UICAgMHgwODAwCisjZGVmaW5lIFRSQU5TRkVSX1JFQUQgIDB4MTAwMAorCitzdGF0aWMgaW50IHNkaGlfYm9vdF9yZXF1ZXN0KHZvaWQgX19pb21lbSAqYmFzZSwgc3RydWN0IG1tY19jb21tYW5kICpjbWQpCit7CisJaW50IGVyciwgYyA9IGNtZC0+b3Bjb2RlOworCisJc3dpdGNoIChtbWNfcmVzcF90eXBlKGNtZCkpIHsKKwljYXNlIE1NQ19SU1BfTk9ORTogYyB8PSBSRVNQX05PTkU7IGJyZWFrOworCWNhc2UgTU1DX1JTUF9SMTogICBjIHw9IFJFU1BfUjE7ICAgYnJlYWs7CisJY2FzZSBNTUNfUlNQX1IxQjogIGMgfD0gUkVTUF9SMUI7ICBicmVhazsKKwljYXNlIE1NQ19SU1BfUjI6ICAgYyB8PSBSRVNQX1IyOyAgIGJyZWFrOworCWNhc2UgTU1DX1JTUF9SMzogICBjIHw9IFJFU1BfUjM7ICAgYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogTm8gaW50ZXJydXB0cyBzbyB0aGlzIG1heSBub3QgYmUgY2xlYXJlZCAqLworCXNkX2N0cmxfd3JpdGUzMihiYXNlLCBDVExfU1RBVFVTLCB+VE1JT19TVEFUX0NNRFJFU1BFTkQpOworCisJc2RfY3RybF93cml0ZTMyKGJhc2UsIENUTF9JUlFfTUFTSywgVE1JT19TVEFUX0NNRFJFU1BFTkQgfAorCQkJc2RfY3RybF9yZWFkMzIoYmFzZSwgQ1RMX0lSUV9NQVNLKSk7CisJc2RfY3RybF93cml0ZTMyKGJhc2UsIENUTF9BUkdfUkVHLCBjbWQtPmFyZyk7CisJc2RfY3RybF93cml0ZTE2KGJhc2UsIENUTF9TRF9DTUQsIGMpOworCisKKwlzZF9jdHJsX3dyaXRlMzIoYmFzZSwgQ1RMX0lSUV9NQVNLLAorCQkJfihUTUlPX1NUQVRfQ01EUkVTUEVORCB8IEFMTF9FUlJPUikgJgorCQkJc2RfY3RybF9yZWFkMzIoYmFzZSwgQ1RMX0lSUV9NQVNLKSk7CisKKwllcnIgPSBzZGhpX2Jvb3Rfd2FpdF9yZXNwX2VuZChiYXNlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJY21kLT5yZXNwWzBdID0gc2RfY3RybF9yZWFkMzIoYmFzZSwgQ1RMX1JFU1BPTlNFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkaGlfYm9vdF9kb19yZWFkX3NpbmdsZSh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBoaWdoX2NhcGFjaXR5LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGJsb2NrLCB1bnNpZ25lZCBzaG9ydCAqYnVmKQoreworCWludCBlcnIsIGk7CisKKwkvKiBDTUQxNyAtIFJlYWQgKi8KKwl7CisJCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisKKwkJY21kLm9wY29kZSA9IE1NQ19SRUFEX1NJTkdMRV9CTE9DSyB8IFwKKwkJCSAgICAgVFJBTlNGRVJfUkVBRCB8IERBVEFfUFJFU0VOVDsKKwkJaWYgKGhpZ2hfY2FwYWNpdHkpCisJCQljbWQuYXJnID0gYmxvY2s7CisJCWVsc2UKKwkJCWNtZC5hcmcgPSBibG9jayAqIFRNSU9fQkJTOworCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxOworCQllcnIgPSBzZGhpX2Jvb3RfcmVxdWVzdChiYXNlLCAmY21kKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJc2RfY3RybF93cml0ZTMyKGJhc2UsIENUTF9JUlFfTUFTSywKKwkJCX4oVE1JT19TVEFUX0RBVEFFTkQgfCBUTUlPX1NUQVRfUlhSRFkgfAorCQkJICBUTUlPX1NUQVRfVFhVTkRFUlJVTikgJgorCQkJc2RfY3RybF9yZWFkMzIoYmFzZSwgQ1RMX0lSUV9NQVNLKSk7CisJZXJyID0gc2RoaV9ib290X3dhaXRfcmVzcF9lbmQoYmFzZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNkX2N0cmxfd3JpdGUxNihiYXNlLCBDVExfU0RfWEZFUl9MRU4sIFRNSU9fQkJTKTsKKwlmb3IgKGkgPSAwOyBpIDwgVE1JT19CQlMgLyBzaXplb2YoKmJ1Zik7IGkrKykKKwkJKmJ1ZisrID0gc2RfY3RybF9yZWFkMTYoYmFzZSwgUkVTUF9DTUQxMik7CisKKwllcnIgPSBzZGhpX2Jvb3Rfd2FpdF9yZXNwX2VuZChiYXNlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzZGhpX2Jvb3RfZG9fcmVhZCh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBoaWdoX2NhcGFjaXR5LAorCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgc2hvcnQgY291bnQsCisJCSAgICAgIHVuc2lnbmVkIHNob3J0ICpidWYpCit7CisJdW5zaWduZWQgbG9uZyBpOworCWludCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZXJyID0gc2RoaV9ib290X2RvX3JlYWRfc2luZ2xlKGJhc2UsIGhpZ2hfY2FwYWNpdHksIG9mZnNldCArIGksCisJCQkJCSAgICAgICBidWYgKyAoaSAqIFRNSU9fQkJTIC8KKwkJCQkJCSAgICAgIHNpemVvZigqYnVmKSkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBWT0xUQUdFUyAoTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQpCisKK2ludCBzZGhpX2Jvb3RfaW5pdCh2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJYm9vbCBzZF92MiA9IGZhbHNlLCBzZF92MV8wID0gZmFsc2U7CisJdW5zaWduZWQgc2hvcnQgY2lkOworCWludCBlcnIsIGhpZ2hfY2FwYWNpdHkgPSAwOworCisJc2RoaV9ib290X21tY19jbGtfc3RvcChiYXNlKTsKKwlzZGhpX2Jvb3RfcmVzZXQoYmFzZSk7CisKKwkvKiBtbWMwOiBjbG9jayA0MDAwMDBIeiBidXNtb2RlIDEgcG93ZXJtb2RlIDIgY3MgMCBWZGQgMjEgd2lkdGggMCB0aW1pbmcgMCAqLworCXsKKwkJc3RydWN0IG1tY19pb3MgaW9zOworCQlpb3MucG93ZXJfbW9kZSA9IE1NQ19QT1dFUl9PTjsKKwkJaW9zLmJ1c193aWR0aCA9IE1NQ19CVVNfV0lEVEhfMTsKKwkJaW9zLmNsb2NrID0gQ0xLX01NQ19JTklUOworCQllcnIgPSBzZGhpX2Jvb3RfbW1jX3NldF9pb3MoYmFzZSwgJmlvcyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIENNRDAgKi8KKwl7CisJCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisJCW1zbGVlcCgxKTsKKwkJY21kLm9wY29kZSA9IE1NQ19HT19JRExFX1NUQVRFOworCQljbWQuYXJnID0gMDsKKwkJY21kLmZsYWdzID0gTU1DX1JTUF9OT05FOworCQllcnIgPSBzZGhpX2Jvb3RfcmVxdWVzdChiYXNlLCAmY21kKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCW1zbGVlcCgyKTsKKwl9CisKKwkvKiBDTUQ4IC0gVGVzdCBmb3IgU0QgdmVyc2lvbiAyICovCisJeworCQlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOworCQljbWQub3Bjb2RlID0gU0RfU0VORF9JRl9DT05EOworCQljbWQuYXJnID0gKFZPTFRBR0VTICE9IDApIDw8IDggfCAweGFhOworCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxOworCQllcnIgPSBzZGhpX2Jvb3RfcmVxdWVzdChiYXNlLCAmY21kKTsgLyogSWdub3JlIGVycm9yICovCisJCWlmICgoY21kLnJlc3BbMF0gJiAweGZmKSA9PSAweGFhKQorCQkJc2RfdjIgPSB0cnVlOworCX0KKworCS8qIENNRDU1IC0gR2V0IE9DUiAoU0QpICovCisJeworCQlpbnQgdGltZW91dCA9IDEwMDA7CisJCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisKKwkJY21kLmFyZyA9IDA7CisKKwkJZG8geworCQkJY21kLm9wY29kZSA9IE1NQ19BUFBfQ01EOworCQkJY21kLmZsYWdzID0gTU1DX1JTUF9SMTsKKwkJCWNtZC5hcmcgPSAwOworCQkJZXJyID0gc2RoaV9ib290X3JlcXVlc3QoYmFzZSwgJmNtZCk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCisJCQljbWQub3Bjb2RlID0gU0RfQVBQX09QX0NPTkQ7CisJCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IzOworCQkJY21kLmFyZyA9IChWT0xUQUdFUyAmIDB4ZmY4MDAwKTsKKwkJCWlmIChzZF92MikKKwkJCQljbWQuYXJnIHw9IE9DUl9IQ1M7CisJCQljbWQuYXJnIHw9IE9DUl9GQVNUQk9PVDsKKwkJCWVyciA9IHNkaGlfYm9vdF9yZXF1ZXN0KGJhc2UsICZjbWQpOworCQkJaWYgKGVycikKKwkJCQlicmVhazsKKworCQkJbXNsZWVwKDEpOworCQl9IHdoaWxlKCghKGNtZC5yZXNwWzBdICYgT0NSX0JVU1kpKSAmJiAtLXRpbWVvdXQpOworCisJCWlmICghZXJyICYmIHRpbWVvdXQpIHsKKwkJCWlmICghc2RfdjIpCisJCQkJc2RfdjFfMCA9IHRydWU7CisJCQloaWdoX2NhcGFjaXR5ID0gKGNtZC5yZXNwWzBdICYgT0NSX0hDUykgPT0gT0NSX0hDUzsKKwkJfQorCX0KKworCS8qIENNRDEgLSBHZXQgT0NSIChNTUMpICovCisJaWYgKCFzZF92MiAmJiAhc2RfdjFfMCkgeworCQlpbnQgdGltZW91dCA9IDEwMDA7CisJCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisKKwkJZG8geworCQkJY21kLm9wY29kZSA9IE1NQ19TRU5EX09QX0NPTkQ7CisJCQljbWQuYXJnID0gVk9MVEFHRVMgfCBPQ1JfSENTOworCQkJY21kLmZsYWdzID0gTU1DX1JTUF9SMzsKKwkJCWVyciA9IHNkaGlfYm9vdF9yZXF1ZXN0KGJhc2UsICZjbWQpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCisJCQltc2xlZXAoMSk7CisJCX0gd2hpbGUoKCEoY21kLnJlc3BbMF0gJiBPQ1JfQlVTWSkpICYmIC0tdGltZW91dCk7CisKKwkJaWYgKCF0aW1lb3V0KQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJaGlnaF9jYXBhY2l0eSA9IChjbWQucmVzcFswXSAmIE9DUl9IQ1MpID09IE9DUl9IQ1M7CisJfQorCisJLyogQ01EMiAtIEdldCBDSUQgKi8KKwl7CisJCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisJCWNtZC5vcGNvZGUgPSBNTUNfQUxMX1NFTkRfQ0lEOworCQljbWQuYXJnID0gMDsKKwkJY21kLmZsYWdzID0gTU1DX1JTUF9SMjsKKwkJZXJyID0gc2RoaV9ib290X3JlcXVlc3QoYmFzZSwgJmNtZCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIENNRDMKKwkgKiBNTUM6IFNldCB0aGUgcmVsYXRpdmUgYWRkcmVzcworCSAqIFNEOiAgR2V0IHRoZSByZWxhdGl2ZSBhZGRyZXNzCisJICogQWxzbyBwdXRzIHRoZSBjYXJkIGludG8gdGhlIHN0YW5kYnkgc3RhdGUKKwkgKi8KKwl7CisJCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisJCWNtZC5vcGNvZGUgPSBNTUNfU0VUX1JFTEFUSVZFX0FERFI7CisJCWNtZC5hcmcgPSAwOworCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxOworCQllcnIgPSBzZGhpX2Jvb3RfcmVxdWVzdChiYXNlLCAmY21kKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWNpZCA9IGNtZC5yZXNwWzBdID4+IDE2OworCX0KKworCS8qIENNRDkgLSBHZXQgQ1NEICovCisJeworCQlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOworCQljbWQub3Bjb2RlID0gTU1DX1NFTkRfQ1NEOworCQljbWQuYXJnID0gY2lkIDw8IDE2OworCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IyOworCQllcnIgPSBzZGhpX2Jvb3RfcmVxdWVzdChiYXNlLCAmY21kKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogQ01ENyAtIFNlbGVjdCB0aGUgY2FyZCAqLworCXsKKwkJc3RydWN0IG1tY19jb21tYW5kIGNtZDsKKwkJY21kLm9wY29kZSA9IE1NQ19TRUxFQ1RfQ0FSRDsKKwkJLy9jbWQuYXJnID0gcmNhIDw8IDE2OworCQljbWQuYXJnID0gY2lkIDw8IDE2OworCQkvL2NtZC5mbGFncyA9IE1NQ19SU1BfUjFCOworCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxOworCQllcnIgPSBzZGhpX2Jvb3RfcmVxdWVzdChiYXNlLCAmY21kKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogQ01EMTYgLSBTZXQgdGhlIGJsb2NrIHNpemUgKi8KKwl7CisJCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisJCWNtZC5vcGNvZGUgPSBNTUNfU0VUX0JMT0NLTEVOOworCQljbWQuYXJnID0gVE1JT19CQlM7CisJCWNtZC5mbGFncyA9IE1NQ19SU1BfUjE7CisJCWVyciA9IHNkaGlfYm9vdF9yZXF1ZXN0KGJhc2UsICZjbWQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gaGlnaF9jYXBhY2l0eTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9zZGhpLXNobW9iaWxlLmggYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvc2RoaS1zaG1vYmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWFhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvc2RoaS1zaG1vYmlsZS5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgU0RISV9NT0JJTEVfSAorI2RlZmluZSBTREhJX01PQklMRV9ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCitpbnQgc2RoaV9ib290X2RvX3JlYWQodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgaGlnaF9jYXBhY2l0eSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIHNob3J0IGNvdW50LAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCAqYnVmKTsKK2ludCBzZGhpX2Jvb3RfaW5pdCh2b2lkIF9faW9tZW0gKmJhc2UpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4Lmxkcy5pbiBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4Lmxkcy5pbgppbmRleCBlYTgwYWJlLi40ZTcyODgzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMuaW4KKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLmluCkBAIC0zMywyMCArMzMsMjQgQEAKICAgICAqKC50ZXh0LiopCiAgICAgKiguZml4dXApCiAgICAgKiguZ251Lndhcm5pbmcpCisgICAgKiguZ2x1ZV83dCkKKyAgICAqKC5nbHVlXzcpCisgIH0KKyAgLnJvZGF0YSA6IHsKICAgICAqKC5yb2RhdGEpCiAgICAgKigucm9kYXRhLiopCi0gICAgKiguZ2x1ZV83KQotICAgICooLmdsdWVfN3QpCisgIH0KKyAgLnBpZ2d5ZGF0YSA6IHsKICAgICAqKC5waWdneWRhdGEpCi0gICAgLiA9IEFMSUdOKDQpOwogICB9CiAKKyAgLiA9IEFMSUdOKDQpOwogICBfZXRleHQgPSAuOwogCisgIC5nb3QucGx0CQk6IHsgKiguZ290LnBsdCkgfQogICBfZ290X3N0YXJ0ID0gLjsKICAgLmdvdAkJCTogeyAqKC5nb3QpIH0KICAgX2dvdF9lbmQgPSAuOwotICAuZ290LnBsdAkJOiB7ICooLmdvdC5wbHQpIH0KICAgX2VkYXRhID0gLjsKIAogICAuID0gQlNTX1NUQVJUOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jIGIvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jCmluZGV4IGU1NjgxNjMuLjU5NWVjZDI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vZG1hYm91bmNlLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jCkBAIC03OSw2ICs3OSw4IEBACiAJc3RydWN0IGRtYWJvdW5jZV9wb29sCWxhcmdlOwogCiAJcndsb2NrX3QgbG9jazsKKworCWludCAoKm5lZWRzX2JvdW5jZSkoc3RydWN0IGRldmljZSAqLCBkbWFfYWRkcl90LCBzaXplX3QpOwogfTsKIAogI2lmZGVmIFNUQVRTCkBAIC0yMTAsMTE0ICsyMTIsOTEgQEAKIAlpZiAoIWRldiB8fCAhZGV2LT5hcmNoZGF0YS5kbWFib3VuY2UpCiAJCXJldHVybiBOVUxMOwogCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGRtYV9hZGRyKSkgewotCQlpZiAoZGV2KQotCQkJZGV2X2VycihkZXYsICJUcnlpbmcgdG8gJXMgaW52YWxpZCBtYXBwaW5nXG4iLCB3aGVyZSk7Ci0JCWVsc2UKLQkJCXByX2VycigidW5rbm93biBkZXZpY2U6IFRyeWluZyB0byAlcyBpbnZhbGlkIG1hcHBpbmdcbiIsIHdoZXJlKTsKKwkJZGV2X2VycihkZXYsICJUcnlpbmcgdG8gJXMgaW52YWxpZCBtYXBwaW5nXG4iLCB3aGVyZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gZmluZF9zYWZlX2J1ZmZlcihkZXYtPmFyY2hkYXRhLmRtYWJvdW5jZSwgZG1hX2FkZHIpOwogfQogCitzdGF0aWMgaW50IG5lZWRzX2JvdW5jZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplKQoreworCWlmICghZGV2IHx8ICFkZXYtPmFyY2hkYXRhLmRtYWJvdW5jZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGV2LT5kbWFfbWFzaykgeworCQl1bnNpZ25lZCBsb25nIGxpbWl0LCBtYXNrID0gKmRldi0+ZG1hX21hc2s7CisKKwkJbGltaXQgPSAobWFzayArIDEpICYgfm1hc2s7CisJCWlmIChsaW1pdCAmJiBzaXplID4gbGltaXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiRE1BIG1hcHBpbmcgdG9vIGJpZyAocmVxdWVzdGVkICUjeCAiCisJCQkJIm1hc2sgJSNMeClcbiIsIHNpemUsICpkZXYtPmRtYV9tYXNrKTsKKwkJCXJldHVybiAtRTJCSUc7CisJCX0KKworCQkvKiBGaWd1cmUgb3V0IGlmIHdlIG5lZWQgdG8gYm91bmNlIGZyb20gdGhlIERNQSBtYXNrLiAqLworCQlpZiAoKGRtYV9hZGRyIHwgKGRtYV9hZGRyICsgc2l6ZSAtIDEpKSAmIH5tYXNrKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuICEhZGV2LT5hcmNoZGF0YS5kbWFib3VuY2UtPm5lZWRzX2JvdW5jZShkZXYsIGRtYV9hZGRyLCBzaXplKTsKK30KKwogc3RhdGljIGlubGluZSBkbWFfYWRkcl90IG1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAogCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJc3RydWN0IGRtYWJvdW5jZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm8gPSBkZXYtPmFyY2hkYXRhLmRtYWJvdW5jZTsKLQlkbWFfYWRkcl90IGRtYV9hZGRyOwotCWludCBuZWVkc19ib3VuY2UgPSAwOworCXN0cnVjdCBzYWZlX2J1ZmZlciAqYnVmOwogCiAJaWYgKGRldmljZV9pbmZvKQogCQlET19TVEFUUyAoIGRldmljZV9pbmZvLT5tYXBfb3BfY291bnQrKyApOwogCi0JZG1hX2FkZHIgPSB2aXJ0X3RvX2RtYShkZXYsIHB0cik7Ci0KLQlpZiAoZGV2LT5kbWFfbWFzaykgewotCQl1bnNpZ25lZCBsb25nIG1hc2sgPSAqZGV2LT5kbWFfbWFzazsKLQkJdW5zaWduZWQgbG9uZyBsaW1pdDsKLQotCQlsaW1pdCA9IChtYXNrICsgMSkgJiB+bWFzazsKLQkJaWYgKGxpbWl0ICYmIHNpemUgPiBsaW1pdCkgewotCQkJZGV2X2VycihkZXYsICJETUEgbWFwcGluZyB0b28gYmlnIChyZXF1ZXN0ZWQgJSN4ICIKLQkJCQkibWFzayAlI0x4KVxuIiwgc2l6ZSwgKmRldi0+ZG1hX21hc2spOwotCQkJcmV0dXJuIH4wOwotCQl9Ci0KLQkJLyoKLQkJICogRmlndXJlIG91dCBpZiB3ZSBuZWVkIHRvIGJvdW5jZSBmcm9tIHRoZSBETUEgbWFzay4KLQkJICovCi0JCW5lZWRzX2JvdW5jZSA9IChkbWFfYWRkciB8IChkbWFfYWRkciArIHNpemUgLSAxKSkgJiB+bWFzazsKKwlidWYgPSBhbGxvY19zYWZlX2J1ZmZlcihkZXZpY2VfaW5mbywgcHRyLCBzaXplLCBkaXIpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIiVzOiB1bmFibGUgdG8gbWFwIHVuc2FmZSBidWZmZXIgJXAhXG4iLAorCQkgICAgICAgX19mdW5jX18sIHB0cik7CisJCXJldHVybiB+MDsKIAl9CiAKLQlpZiAoZGV2aWNlX2luZm8gJiYgKG5lZWRzX2JvdW5jZSB8fCBkbWFfbmVlZHNfYm91bmNlKGRldiwgZG1hX2FkZHIsIHNpemUpKSkgewotCQlzdHJ1Y3Qgc2FmZV9idWZmZXIgKmJ1ZjsKKwlkZXZfZGJnKGRldiwgIiVzOiB1bnNhZmUgYnVmZmVyICVwIChkbWE9JSN4KSBtYXBwZWQgdG8gJXAgKGRtYT0lI3gpXG4iLAorCQlfX2Z1bmNfXywgYnVmLT5wdHIsIHZpcnRfdG9fZG1hKGRldiwgYnVmLT5wdHIpLAorCQlidWYtPnNhZmUsIGJ1Zi0+c2FmZV9kbWFfYWRkcik7CiAKLQkJYnVmID0gYWxsb2Nfc2FmZV9idWZmZXIoZGV2aWNlX2luZm8sIHB0ciwgc2l6ZSwgZGlyKTsKLQkJaWYgKGJ1ZiA9PSAwKSB7Ci0JCQlkZXZfZXJyKGRldiwgIiVzOiB1bmFibGUgdG8gbWFwIHVuc2FmZSBidWZmZXIgJXAhXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBwdHIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlkZXZfZGJnKGRldiwKLQkJCSIlczogdW5zYWZlIGJ1ZmZlciAlcCAoZG1hPSUjeCkgbWFwcGVkIHRvICVwIChkbWE9JSN4KVxuIiwKLQkJCV9fZnVuY19fLCBidWYtPnB0ciwgdmlydF90b19kbWEoZGV2LCBidWYtPnB0ciksCi0JCQlidWYtPnNhZmUsIGJ1Zi0+c2FmZV9kbWFfYWRkcik7Ci0KLQkJaWYgKChkaXIgPT0gRE1BX1RPX0RFVklDRSkgfHwKLQkJICAgIChkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpKSB7Ci0JCQlkZXZfZGJnKGRldiwgIiVzOiBjb3B5IHVuc2FmZSAlcCB0byBzYWZlICVwLCBzaXplICVkXG4iLAotCQkJCV9fZnVuY19fLCBwdHIsIGJ1Zi0+c2FmZSwgc2l6ZSk7Ci0JCQltZW1jcHkoYnVmLT5zYWZlLCBwdHIsIHNpemUpOwotCQl9Ci0JCXB0ciA9IGJ1Zi0+c2FmZTsKLQotCQlkbWFfYWRkciA9IGJ1Zi0+c2FmZV9kbWFfYWRkcjsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBXZSBkb24ndCBuZWVkIHRvIHN5bmMgdGhlIERNQSBidWZmZXIgc2luY2UKLQkJICogaXQgd2FzIGFsbG9jYXRlZCB2aWEgdGhlIGNvaGVyZW50IGFsbG9jYXRvcnMuCi0JCSAqLwotCQlfX2RtYV9zaW5nbGVfY3B1X3RvX2RldihwdHIsIHNpemUsIGRpcik7CisJaWYgKGRpciA9PSBETUFfVE9fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkgeworCQlkZXZfZGJnKGRldiwgIiVzOiBjb3B5IHVuc2FmZSAlcCB0byBzYWZlICVwLCBzaXplICVkXG4iLAorCQkJX19mdW5jX18sIHB0ciwgYnVmLT5zYWZlLCBzaXplKTsKKwkJbWVtY3B5KGJ1Zi0+c2FmZSwgcHRyLCBzaXplKTsKIAl9CiAKLQlyZXR1cm4gZG1hX2FkZHI7CisJcmV0dXJuIGJ1Zi0+c2FmZV9kbWFfYWRkcjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHVubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCitzdGF0aWMgaW5saW5lIHZvaWQgdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNhZmVfYnVmZmVyICpidWYsCiAJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7Ci0Jc3RydWN0IHNhZmVfYnVmZmVyICpidWYgPSBmaW5kX3NhZmVfYnVmZmVyX2RldihkZXYsIGRtYV9hZGRyLCAidW5tYXAiKTsKKwlCVUdfT04oYnVmLT5zaXplICE9IHNpemUpOworCUJVR19PTihidWYtPmRpcmVjdGlvbiAhPSBkaXIpOwogCi0JaWYgKGJ1ZikgewotCQlCVUdfT04oYnVmLT5zaXplICE9IHNpemUpOwotCQlCVUdfT04oYnVmLT5kaXJlY3Rpb24gIT0gZGlyKTsKKwlkZXZfZGJnKGRldiwgIiVzOiB1bnNhZmUgYnVmZmVyICVwIChkbWE9JSN4KSBtYXBwZWQgdG8gJXAgKGRtYT0lI3gpXG4iLAorCQlfX2Z1bmNfXywgYnVmLT5wdHIsIHZpcnRfdG9fZG1hKGRldiwgYnVmLT5wdHIpLAorCQlidWYtPnNhZmUsIGJ1Zi0+c2FmZV9kbWFfYWRkcik7CiAKLQkJZGV2X2RiZyhkZXYsCi0JCQkiJXM6IHVuc2FmZSBidWZmZXIgJXAgKGRtYT0lI3gpIG1hcHBlZCB0byAlcCAoZG1hPSUjeClcbiIsCi0JCQlfX2Z1bmNfXywgYnVmLT5wdHIsIHZpcnRfdG9fZG1hKGRldiwgYnVmLT5wdHIpLAotCQkJYnVmLT5zYWZlLCBidWYtPnNhZmVfZG1hX2FkZHIpOworCURPX1NUQVRTKGRldi0+YXJjaGRhdGEuZG1hYm91bmNlLT5ib3VuY2VfY291bnQrKyk7CiAKLQkJRE9fU1RBVFMoZGV2LT5hcmNoZGF0YS5kbWFib3VuY2UtPmJvdW5jZV9jb3VudCsrKTsKKwlpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpIHsKKwkJdm9pZCAqcHRyID0gYnVmLT5wdHI7CiAKLQkJaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFMKSB7Ci0JCQl2b2lkICpwdHIgPSBidWYtPnB0cjsKKwkJZGV2X2RiZyhkZXYsICIlczogY29weSBiYWNrIHNhZmUgJXAgdG8gdW5zYWZlICVwIHNpemUgJWRcbiIsCisJCQlfX2Z1bmNfXywgYnVmLT5zYWZlLCBwdHIsIHNpemUpOworCQltZW1jcHkocHRyLCBidWYtPnNhZmUsIHNpemUpOwogCi0JCQlkZXZfZGJnKGRldiwKLQkJCQkiJXM6IGNvcHkgYmFjayBzYWZlICVwIHRvIHVuc2FmZSAlcCBzaXplICVkXG4iLAotCQkJCV9fZnVuY19fLCBidWYtPnNhZmUsIHB0ciwgc2l6ZSk7Ci0JCQltZW1jcHkocHRyLCBidWYtPnNhZmUsIHNpemUpOwotCi0JCQkvKgotCQkJICogU2luY2Ugd2UgbWF5IGhhdmUgd3JpdHRlbiB0byBhIHBhZ2UgY2FjaGUgcGFnZSwKLQkJCSAqIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgd2lsbCBiZSBjb2hlcmVudAotCQkJICogd2l0aCB1c2VyIG1hcHBpbmdzLgotCQkJICovCi0JCQlfX2NwdWNfZmx1c2hfZGNhY2hlX2FyZWEocHRyLCBzaXplKTsKLQkJfQotCQlmcmVlX3NhZmVfYnVmZmVyKGRldi0+YXJjaGRhdGEuZG1hYm91bmNlLCBidWYpOwotCX0gZWxzZSB7Ci0JCV9fZG1hX3NpbmdsZV9kZXZfdG9fY3B1KGRtYV90b192aXJ0KGRldiwgZG1hX2FkZHIpLCBzaXplLCBkaXIpOworCQkvKgorCQkgKiBTaW5jZSB3ZSBtYXkgaGF2ZSB3cml0dGVuIHRvIGEgcGFnZSBjYWNoZSBwYWdlLAorCQkgKiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhIHdpbGwgYmUgY29oZXJlbnQKKwkJICogd2l0aCB1c2VyIG1hcHBpbmdzLgorCQkgKi8KKwkJX19jcHVjX2ZsdXNoX2RjYWNoZV9hcmVhKHB0ciwgc2l6ZSk7CiAJfQorCWZyZWVfc2FmZV9idWZmZXIoZGV2LT5hcmNoZGF0YS5kbWFib3VuY2UsIGJ1Zik7CiB9CiAKIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCkBAIC0zMjgsNDUgKzMwNywyOCBAQAogICogc3Vic3RpdHV0ZSB0aGUgc2FmZSBidWZmZXIgZm9yIHRoZSB1bnNhZmUgb25lLgogICogKGJhc2ljYWxseSBtb3ZlIHRoZSBidWZmZXIgZnJvbSBhbiB1bnNhZmUgYXJlYSB0byBhIHNhZmUgb25lKQogICovCi1kbWFfYWRkcl90IF9fZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JZGV2X2RiZyhkZXYsICIlcyhwdHI9JXAsc2l6ZT0lZCxkaXI9JXgpXG4iLAotCQlfX2Z1bmNfXywgcHRyLCBzaXplLCBkaXIpOwotCi0JQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcikpOwotCi0JcmV0dXJuIG1hcF9zaW5nbGUoZGV2LCBwdHIsIHNpemUsIGRpcik7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fZG1hX21hcF9zaW5nbGUpOwotCi0vKgotICogc2VlIGlmIGEgbWFwcGVkIGFkZHJlc3Mgd2FzIHJlYWxseSBhICJzYWZlIiBidWZmZXIgYW5kIGlmIHNvLCBjb3B5Ci0gKiB0aGUgZGF0YSBmcm9tIHRoZSBzYWZlIGJ1ZmZlciBiYWNrIHRvIHRoZSB1bnNhZmUgYnVmZmVyIGFuZCBmcmVlIHVwCi0gKiB0aGUgc2FmZSBidWZmZXIuICAoYmFzaWNhbGx5IHJldHVybiB0aGluZ3MgYmFjayB0byB0aGUgd2F5IHRoZXkKLSAqIHNob3VsZCBiZSkKLSAqLwotdm9pZCBfX2RtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKLQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCWRldl9kYmcoZGV2LCAiJXMocHRyPSVwLHNpemU9JWQsZGlyPSV4KVxuIiwKLQkJX19mdW5jX18sICh2b2lkICopIGRtYV9hZGRyLCBzaXplLCBkaXIpOwotCi0JdW5tYXBfc2luZ2xlKGRldiwgZG1hX2FkZHIsIHNpemUsIGRpcik7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fZG1hX3VubWFwX3NpbmdsZSk7Ci0KIGRtYV9hZGRyX3QgX19kbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlpbnQgcmV0OworCiAJZGV2X2RiZyhkZXYsICIlcyhwYWdlPSVwLG9mZj0lI2x4LHNpemU9JXp4LGRpcj0leClcbiIsCiAJCV9fZnVuY19fLCBwYWdlLCBvZmZzZXQsIHNpemUsIGRpcik7CiAKLQlCVUdfT04oIXZhbGlkX2RtYV9kaXJlY3Rpb24oZGlyKSk7CisJZG1hX2FkZHIgPSBwZm5fdG9fZG1hKGRldiwgcGFnZV90b19wZm4ocGFnZSkpICsgb2Zmc2V0OworCisJcmV0ID0gbmVlZHNfYm91bmNlKGRldiwgZG1hX2FkZHIsIHNpemUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gfjA7CisKKwlpZiAocmV0ID09IDApIHsKKwkJX19kbWFfcGFnZV9jcHVfdG9fZGV2KHBhZ2UsIG9mZnNldCwgc2l6ZSwgZGlyKTsKKwkJcmV0dXJuIGRtYV9hZGRyOworCX0KIAogCWlmIChQYWdlSGlnaE1lbShwYWdlKSkgewotCQlkZXZfZXJyKGRldiwgIkRNQSBidWZmZXIgYm91bmNpbmcgb2YgSElHSE1FTSBwYWdlcyAiCi0JCQkgICAgICJpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJZGV2X2VycihkZXYsICJETUEgYnVmZmVyIGJvdW5jaW5nIG9mIEhJR0hNRU0gcGFnZXMgaXMgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiB+MDsKIAl9CiAKQEAgLTM4MywxMCArMzQ1LDE5IEBACiB2b2lkIF9fZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKIAkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewotCWRldl9kYmcoZGV2LCAiJXMocHRyPSVwLHNpemU9JWQsZGlyPSV4KVxuIiwKLQkJX19mdW5jX18sICh2b2lkICopIGRtYV9hZGRyLCBzaXplLCBkaXIpOworCXN0cnVjdCBzYWZlX2J1ZmZlciAqYnVmOwogCi0JdW5tYXBfc2luZ2xlKGRldiwgZG1hX2FkZHIsIHNpemUsIGRpcik7CisJZGV2X2RiZyhkZXYsICIlcyhkbWE9JSN4LHNpemU9JWQsZGlyPSV4KVxuIiwKKwkJX19mdW5jX18sIGRtYV9hZGRyLCBzaXplLCBkaXIpOworCisJYnVmID0gZmluZF9zYWZlX2J1ZmZlcl9kZXYoZGV2LCBkbWFfYWRkciwgX19mdW5jX18pOworCWlmICghYnVmKSB7CisJCV9fZG1hX3BhZ2VfZGV2X3RvX2NwdShwZm5fdG9fcGFnZShkbWFfdG9fcGZuKGRldiwgZG1hX2FkZHIpKSwKKwkJCWRtYV9hZGRyICYgflBBR0VfTUFTSywgc2l6ZSwgZGlyKTsKKwkJcmV0dXJuOworCX0KKworCXVubWFwX3NpbmdsZShkZXYsIGJ1Ziwgc2l6ZSwgZGlyKTsKIH0KIEVYUE9SVF9TWU1CT0woX19kbWFfdW5tYXBfcGFnZSk7CiAKQEAgLTQ2MSw3ICs0MzIsOCBAQAogfQogCiBpbnQgZG1hYm91bmNlX3JlZ2lzdGVyX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc21hbGxfYnVmZmVyX3NpemUsCi0JCXVuc2lnbmVkIGxvbmcgbGFyZ2VfYnVmZmVyX3NpemUpCisJCXVuc2lnbmVkIGxvbmcgbGFyZ2VfYnVmZmVyX3NpemUsCisJCWludCAoKm5lZWRzX2JvdW5jZV9mbikoc3RydWN0IGRldmljZSAqLCBkbWFfYWRkcl90LCBzaXplX3QpKQogewogCXN0cnVjdCBkbWFib3VuY2VfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvOwogCWludCByZXQ7CkBAIC00OTcsNiArNDY5LDcgQEAKIAlkZXZpY2VfaW5mby0+ZGV2ID0gZGV2OwogCUlOSVRfTElTVF9IRUFEKCZkZXZpY2VfaW5mby0+c2FmZV9idWZmZXJzKTsKIAlyd2xvY2tfaW5pdCgmZGV2aWNlX2luZm8tPmxvY2spOworCWRldmljZV9pbmZvLT5uZWVkc19ib3VuY2UgPSBuZWVkc19ib3VuY2VfZm47CiAKICNpZmRlZiBTVEFUUwogCWRldmljZV9pbmZvLT50b3RhbF9hbGxvY3MgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2dpYy5jIGIvYXJjaC9hcm0vY29tbW9uL2dpYy5jCmluZGV4IDRkZGQwYTYuLjdiZGQ5MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9naWMuYworKysgYi9hcmNoL2FybS9jb21tb24vZ2ljLmMKQEAgLTE3OSwyMiArMTc5LDIxIEBACiB7CiAJdm9pZCBfX2lvbWVtICpyZWcgPSBnaWNfZGlzdF9iYXNlKGQpICsgR0lDX0RJU1RfVEFSR0VUICsgKGdpY19pcnEoZCkgJiB+Myk7CiAJdW5zaWduZWQgaW50IHNoaWZ0ID0gKGQtPmlycSAlIDQpICogODsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gY3B1bWFza19maXJzdChtYXNrX3ZhbCk7CisJdW5zaWduZWQgaW50IGNwdSA9IGNwdW1hc2tfYW55X2FuZChtYXNrX3ZhbCwgY3B1X29ubGluZV9tYXNrKTsKIAl1MzIgdmFsLCBtYXNrLCBiaXQ7CiAKLQlpZiAoY3B1ID49IDgpCisJaWYgKGNwdSA+PSA4IHx8IGNwdSA+PSBucl9jcHVfaWRzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1hc2sgPSAweGZmIDw8IHNoaWZ0OwogCWJpdCA9IDEgPDwgKGNwdSArIHNoaWZ0KTsKIAogCXNwaW5fbG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7Ci0JZC0+bm9kZSA9IGNwdTsKIAl2YWwgPSByZWFkbF9yZWxheGVkKHJlZykgJiB+bWFzazsKIAl3cml0ZWxfcmVsYXhlZCh2YWwgfCBiaXQsIHJlZyk7CiAJc3Bpbl91bmxvY2soJmlycV9jb250cm9sbGVyX2xvY2spOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIElSUV9TRVRfTUFTS19PSzsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vaXQ4MTUyLmMgYi9hcmNoL2FybS9jb21tb24vaXQ4MTUyLmMKaW5kZXggN2EyMTkyNy4uMTRhZDYyZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2l0ODE1Mi5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYwpAQCAtMjQzLDYgKzI0MywxMiBAQAogICogSVRFODE1MiBjaGlwIGNhbiBhZGRyZXNzIHVwIHRvIDY0TUJ5dGUsIHNvIGFsbCB0aGUgZGV2aWNlcwogICogY29ubmVjdGVkIHRvIElURTgxNTIgKFBDSSBhbmQgVVNCKSBzaG91bGQgaGF2ZSBsaW1pdGVkIERNQSB3aW5kb3cKICAqLworc3RhdGljIGludCBpdDgxNTJfbmVlZHNfYm91bmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUpCit7CisJZGV2X2RiZyhkZXYsICIlczogZG1hX2FkZHIgJTA4eCwgc2l6ZSAlMDh4XG4iLAorCQlfX2Z1bmNfXywgZG1hX2FkZHIsIHNpemUpOworCXJldHVybiAoZG1hX2FkZHIgKyBzaXplIC0gUEhZU19PRkZTRVQpID49IFNaXzY0TTsKK30KIAogLyoKICAqIFNldHVwIERNQSBtYXNrIHRvIDY0TUIgb24gZGV2aWNlcyBjb25uZWN0ZWQgdG8gSVRFODE1Mi4gSWdub3JlIGFsbApAQCAtMjU0LDcgKzI2MCw3IEBACiAJCWlmIChkZXYtPmRtYV9tYXNrKQogCQkJKmRldi0+ZG1hX21hc2sgPSAoU1pfNjRNIC0gMSkgfCBQSFlTX09GRlNFVDsKIAkJZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IChTWl82NE0gLSAxKSB8IFBIWVNfT0ZGU0VUOwotCQlkbWFib3VuY2VfcmVnaXN0ZXJfZGV2KGRldiwgMjA0OCwgNDA5Nik7CisJCWRtYWJvdW5jZV9yZWdpc3Rlcl9kZXYoZGV2LCAyMDQ4LCA0MDk2LCBpdDgxNTJfbmVlZHNfYm91bmNlKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNjcsMTQgKzI3Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkbWFfbmVlZHNfYm91bmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUpCi17Ci0JZGV2X2RiZyhkZXYsICIlczogZG1hX2FkZHIgJTA4eCwgc2l6ZSAlMDh4XG4iLAotCQlfX2Z1bmNfXywgZG1hX2FkZHIsIHNpemUpOwotCXJldHVybiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkgJiYKLQkJKChkbWFfYWRkciArIHNpemUgLSBQSFlTX09GRlNFVCkgPj0gU1pfNjRNKTsKLX0KLQogaW50IGRtYV9zZXRfY29oZXJlbnRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQogewogCWlmIChtYXNrID49IFBIWVNfT0ZGU0VUICsgU1pfNjRNIC0gMSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYyBiL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYwppbmRleCA5YzQ5YTQ2Li4wNTY5ZGU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCkBAIC01NzksNyArNTc5LDM2IEBACiAKIAlzYWNoaXAtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgJj0gc2ExMTExX2RtYV9tYXNrW2RyYWMgPj4gMl07CiB9CisjZW5kaWYKIAorI2lmZGVmIENPTkZJR19ETUFCT1VOQ0UKKy8qCisgKiBBY2NvcmRpbmcgdG8gdGhlICJJbnRlbCBTdHJvbmdBUk0gU0EtMTExMSBNaWNyb3Byb2Nlc3NvciBDb21wYW5pb24KKyAqIENoaXAgU3BlY2lmaWNhdGlvbiBVcGRhdGUiIChKdW5lIDIwMDApLCBlcnJhdHVtICM3LCB0aGVyZSBpcyBhCisgKiBzaWduaWZpY2FudCBidWcgaW4gdGhlIFNBMTExMSBTRFJBTSBzaGFyZWQgbWVtb3J5IGNvbnRyb2xsZXIuICBJZgorICogYW4gYWNjZXNzIHRvIGEgcmVnaW9uIG9mIG1lbW9yeSBhYm92ZSAxTUIgcmVsYXRpdmUgdG8gdGhlIGJhbmsgYmFzZSwKKyAqIGl0IGlzIGltcG9ydGFudCB0aGF0IGFkZHJlc3MgYml0IDEwIF9OT1RfIGJlIGFzc2VydGVkLiBEZXBlbmRpbmcKKyAqIG9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBSQU0sIGJpdCAxMCBtYXkgY29ycmVzcG9uZCB0byBvbmUKKyAqIG9mIHNldmVyYWwgZGlmZmVyZW50IChwcm9jZXNzb3ItcmVsYXRpdmUpIGFkZHJlc3MgYml0cy4KKyAqCisgKiBUaGlzIHJvdXRpbmUgb25seSBpZGVudGlmaWVzIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gRE1BIGFkZHJlc3MKKyAqIGlzIHN1c2NlcHRpYmxlIHRvIHRoZSBidWcuCisgKgorICogVGhpcyBzaG91bGQgb25seSBnZXQgY2FsbGVkIGZvciBzYTExMTFfZGV2aWNlIHR5cGVzIGR1ZSB0byB0aGUKKyAqIHdheSB3ZSBjb25maWd1cmUgb3VyIGRldmljZSBkbWFfbWFza3MuCisgKi8KK3N0YXRpYyBpbnQgc2ExMTExX25lZWRzX2JvdW5jZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwgc2l6ZV90IHNpemUpCit7CisJLyoKKwkgKiBTZWN0aW9uIDQuNiBvZiB0aGUgIkludGVsIFN0cm9uZ0FSTSBTQS0xMTExIERldmVsb3BtZW50IE1vZHVsZQorCSAqIFVzZXIncyBHdWlkZSIgbWVudGlvbnMgdGhhdCBqdW1wZXJzIFI1MSBhbmQgUjUyIGNvbnRyb2wgdGhlCisJICogdGFyZ2V0IG9mIFNBLTExMTEgRE1BIChlaXRoZXIgU0RSQU0gYmFuayAwIG9uIEFzc2FiZXQsIG9yCisJICogU0RSQU0gYmFuayAxIG9uIE5lcG9uc2V0KS4gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzZWxlY3RzCisJICogQXNzYWJldCwgc28gYW55IGFkZHJlc3MgaW4gYmFuayAxIGlzIG5lY2Vzc2FyaWx5IGludmFsaWQuCisJICovCisJcmV0dXJuIChtYWNoaW5lX2lzX2Fzc2FiZXQoKSB8fCBtYWNoaW5lX2lzX3BmczE2OCgpKSAmJgorCQkoYWRkciA+PSAweGM4MDAwMDAwIHx8IChhZGRyICsgc2l6ZSkgPj0gMHhjODAwMDAwMCk7Cit9CiAjZW5kaWYKIAogc3RhdGljIHZvaWQgc2ExMTExX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCkBAIC02NDQsNyArNjczLDggQEAKIAkJZGV2LT5kZXYuZG1hX21hc2sgPSAmZGV2LT5kbWFfbWFzazsKIAogCQlpZiAoZGV2LT5kbWFfbWFzayAhPSAweGZmZmZmZmZmVUwpIHsKLQkJCXJldCA9IGRtYWJvdW5jZV9yZWdpc3Rlcl9kZXYoJmRldi0+ZGV2LCAxMDI0LCA0MDk2KTsKKwkJCXJldCA9IGRtYWJvdW5jZV9yZWdpc3Rlcl9kZXYoJmRldi0+ZGV2LCAxMDI0LCA0MDk2LAorCQkJCQlzYTExMTFfbmVlZHNfYm91bmNlKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIlNBMTExMTogRmFpbGVkIHRvIHJlZ2lzdGVyIgogCQkJCQkiIHdpdGggZG1hYm91bmNlXG4iKTsKQEAgLTgxOCwzNCArODQ4LDYgQEAKIAlrZnJlZShzYWNoaXApOwogfQogCi0vKgotICogQWNjb3JkaW5nIHRvIHRoZSAiSW50ZWwgU3Ryb25nQVJNIFNBLTExMTEgTWljcm9wcm9jZXNzb3IgQ29tcGFuaW9uCi0gKiBDaGlwIFNwZWNpZmljYXRpb24gVXBkYXRlIiAoSnVuZSAyMDAwKSwgZXJyYXR1bSAjNywgdGhlcmUgaXMgYQotICogc2lnbmlmaWNhbnQgYnVnIGluIHRoZSBTQTExMTEgU0RSQU0gc2hhcmVkIG1lbW9yeSBjb250cm9sbGVyLiAgSWYKLSAqIGFuIGFjY2VzcyB0byBhIHJlZ2lvbiBvZiBtZW1vcnkgYWJvdmUgMU1CIHJlbGF0aXZlIHRvIHRoZSBiYW5rIGJhc2UsCi0gKiBpdCBpcyBpbXBvcnRhbnQgdGhhdCBhZGRyZXNzIGJpdCAxMCBfTk9UXyBiZSBhc3NlcnRlZC4gRGVwZW5kaW5nCi0gKiBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgUkFNLCBiaXQgMTAgbWF5IGNvcnJlc3BvbmQgdG8gb25lCi0gKiBvZiBzZXZlcmFsIGRpZmZlcmVudCAocHJvY2Vzc29yLXJlbGF0aXZlKSBhZGRyZXNzIGJpdHMuCi0gKgotICogVGhpcyByb3V0aW5lIG9ubHkgaWRlbnRpZmllcyB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIERNQSBhZGRyZXNzCi0gKiBpcyBzdXNjZXB0aWJsZSB0byB0aGUgYnVnLgotICoKLSAqIFRoaXMgc2hvdWxkIG9ubHkgZ2V0IGNhbGxlZCBmb3Igc2ExMTExX2RldmljZSB0eXBlcyBkdWUgdG8gdGhlCi0gKiB3YXkgd2UgY29uZmlndXJlIG91ciBkZXZpY2UgZG1hX21hc2tzLgotICovCi1pbnQgZG1hX25lZWRzX2JvdW5jZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwgc2l6ZV90IHNpemUpCi17Ci0JLyoKLQkgKiBTZWN0aW9uIDQuNiBvZiB0aGUgIkludGVsIFN0cm9uZ0FSTSBTQS0xMTExIERldmVsb3BtZW50IE1vZHVsZQotCSAqIFVzZXIncyBHdWlkZSIgbWVudGlvbnMgdGhhdCBqdW1wZXJzIFI1MSBhbmQgUjUyIGNvbnRyb2wgdGhlCi0JICogdGFyZ2V0IG9mIFNBLTExMTEgRE1BIChlaXRoZXIgU0RSQU0gYmFuayAwIG9uIEFzc2FiZXQsIG9yCi0JICogU0RSQU0gYmFuayAxIG9uIE5lcG9uc2V0KS4gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzZWxlY3RzCi0JICogQXNzYWJldCwgc28gYW55IGFkZHJlc3MgaW4gYmFuayAxIGlzIG5lY2Vzc2FyaWx5IGludmFsaWQuCi0JICovCi0JcmV0dXJuICgobWFjaGluZV9pc19hc3NhYmV0KCkgfHwgbWFjaGluZV9pc19wZnMxNjgoKSkgJiYKLQkJKGFkZHIgPj0gMHhjODAwMDAwMCB8fCAoYWRkciArIHNpemUpID49IDB4YzgwMDAwMDApKTsKLX0KLQogc3RydWN0IHNhMTExMV9zYXZlX2RhdGEgewogCXVuc2lnbmVkIGludAlza2NyOwogCXVuc2lnbmVkIGludAlza3BjcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zY29vcC5jIGIvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKaW5kZXggYzExYWYxZS4uYTA3YjBlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCXNwaW5fbG9ja19pbml0KCZkZXZwdHItPnNjb29wX2xvY2spOwogCiAJaW5mID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JZGV2cHRyLT5iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCBtZW0tPmVuZCAtIG1lbS0+c3RhcnQgKyAxKTsKKwlkZXZwdHItPmJhc2UgPSBpb3JlbWFwKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CiAKIAlpZiAoIWRldnB0ci0+YmFzZSkgewogCQlyZXQgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jbV94MzAwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY21feDMwMF9kZWZjb25maWcKaW5kZXggOTIxZTU2YS4uZjRiNzY3MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9jbV94MzAwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2NtX3gzMDBfZGVmY29uZmlnCkBAIC01LDcgKzUsNiBAQAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE4Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX01PRFVMRVM9eQpAQCAtMTMsNiArMTIsNyBAQAogQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfUFhBPXkKK0NPTkZJR19HUElPX1BDQTk1M1g9eQogQ09ORklHX01BQ0hfQ01fWDMwMD15CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0FFQUJJPXkKQEAgLTIzLDcgKzIzLDYgQEAKIENPTkZJR19DUFVfRlJFUT15CiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CiBDT05GSUdfRlBFX05XRlBFPXkKLUNPTkZJR19QTT15CiBDT05GSUdfQVBNX0VNVUxBVElPTj15CiBDT05GSUdfTkVUPXkKIENPTkZJR19QQUNLRVQ9eQpAQCAtNDAsOCArMzksOCBAQAogIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX0JUPW0KLUNPTkZJR19CVF9MMkNBUD1tCi1DT05GSUdfQlRfU0NPPW0KK0NPTkZJR19CVF9MMkNBUD15CitDT05GSUdfQlRfU0NPPXkKIENPTkZJR19CVF9SRkNPTU09bQogQ09ORklHX0JUX1JGQ09NTV9UVFk9eQogQ09ORklHX0JUX0JORVA9bQpAQCAtNjAsNyArNTksNiBAQAogQ09ORklHX01URF9VQkk9eQogQ09ORklHX0JMS19ERVZfTE9PUD15CiBDT05GSUdfQkxLX0RFVl9SQU09eQotIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJPXkKIENPTkZJR19CTEtfREVWX1NEPXkKIENPTkZJR19ORVRERVZJQ0VTPXkKQEAgLTgxLDE2ICs3OSwxNSBAQAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1dNOTcxMyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSUFMX1BYQT15CiBDT05GSUdfU0VSSUFMX1BYQV9DT05TT0xFPXkKLSMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfUFhBPXkKIENPTkZJR19TUEk9eQogQ09ORklHX1NQSV9HUElPPXkKIENPTkZJR19HUElPX1NZU0ZTPXkKLUNPTkZJR19HUElPX1BDQTk1M1g9eQogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1BNSUNfREE5MDNYPXkKIENPTkZJR19SRUdVTEFUT1I9eQpAQCAtMTAyLDcgKzk5LDYgQEAKIENPTkZJR19MQ0RfVERPMjRNPXkKICMgQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDIGlzIG5vdCBzZXQKIENPTkZJR19CQUNLTElHSFRfREE5MDNYPW0KLSMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZPXkKIENPTkZJR19GT05UUz15CkBAIC0xMzEsNyArMTI3LDYgQEAKIENPTkZJR19ISURfU01BUlRKT1lQTFVTPXkKIENPTkZJR19ISURfVE9QU0VFRD15CiBDT05GSUdfSElEX1RIUlVTVE1BU1RFUj15Ci1DT05GSUdfSElEX1dBQ09NPW0KIENPTkZJR19ISURfWkVST1BMVVM9eQogQ09ORklHX1VTQj15CiBDT05GSUdfVVNCX0RFVklDRUZTPXkKQEAgLTE1Miw3ICsxNDcsNiBAQAogQ09ORklHX0VYVDJfRlM9eQogQ09ORklHX0VYVDNfRlM9eQogIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0Ci1DT05GSUdfSU5PVElGWT15CiBDT05GSUdfTVNET1NfRlM9bQogQ09ORklHX1ZGQVRfRlM9bQogQ09ORklHX1RNUEZTPXkKQEAgLTE2NCw3ICsxNTgsNiBAQAogQ09ORklHX05GU19WM19BQ0w9eQogQ09ORklHX05GU19WND15CiBDT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX1NNQl9GUz1tCiBDT05GSUdfQ0lGUz1tCiBDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0g9eQogQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CkBAIC0xNzIsOSArMTY1LDcgQEAKIENPTkZJR19OTFNfSVNPODg1OV8xPW0KIENPTkZJR19ERUJVR19GUz15CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKICMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfVVNFUj15CkBAIC0xODIsNyArMTczLDYgQEAKIENPTkZJR19DUllQVE9fRUNCPW0KIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9bQogQ09ORklHX0NSWVBUT19BRVM9bQotQ09ORklHX0NSWVBUT19BUkM0PW0KICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDX1QxMERJRj15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZGF2aW5jaV9hbGxfZGVmY29uZmlnCmluZGV4IDg4OTkyMmEuLjY3YjVhYmI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2RhdmluY2lfYWxsX2RlZmNvbmZpZwpAQCAtMTU3LDcgKzE1Nyw3IEBACiBDT05GSUdfTEVEU19UUklHR0VSUz15CiBDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPW0KIENPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUM19GUz15CiBDT05GSUdfWEZTX0ZTPW0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbG9raV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2xva2lfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmE3NTJiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbG9raV9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX0VYUEVSVD15Ci1DT05GSUdfU0xBQj15Ci1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9MT0tJPXkKLUNPTkZJR19NQUNIX0xCODhSQzg0ODA9eQotIyBDT05GSUdfQ1BVX0ZFUk9DRU9OX09MRF9JRCBpcyBub3Qgc2V0Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfUFJFRU1QVD15Ci1DT05GSUdfQUVBQkk9eQotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCi1DT05GSUdfTkVUPXkKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1VOSVg9eQotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotQ09ORklHX05FVF9QS1RHRU49bQotQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKLUNPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKLUNPTkZJR19NVERfQ01ETElORV9QQVJUUz15Ci1DT05GSUdfTVREX0NIQVI9eQotQ09ORklHX01URF9CTE9DSz15Ci1DT05GSUdfRlRMPXkKLUNPTkZJR19ORlRMPXkKLUNPTkZJR19NVERfQ0ZJPXkKLUNPTkZJR19NVERfSkVERUNQUk9CRT15Ci1DT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15Ci1DT05GSUdfTVREX0NGSV9HRU9NRVRSWT15Ci1DT05GSUdfTVREX0NGSV9JND15Ci1DT05GSUdfTVREX0NGSV9JTlRFTEVYVD15Ci1DT05GSUdfTVREX0NGSV9BTURTVEQ9eQotQ09ORklHX01URF9DRklfU1RBQT15Ci1DT05GSUdfTVREX1BIWVNNQVA9eQotQ09ORklHX01URF9NMjVQODA9eQotQ09ORklHX01URF9OQU5EPXkKLUNPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEU9eQotQ09ORklHX01URF9OQU5EX09SSU9OPXkKLUNPTkZJR19CTEtfREVWX0xPT1A9eQotIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfQkxLX0RFVl9TUj1tCi1DT05GSUdfQ0hSX0RFVl9TRz1tCi1DT05GSUdfQVRBPXkKLUNPTkZJR19TQVRBX01WPXkKLUNPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklHX01JST15Ci1DT05GSUdfTVY2NDNYWF9FVEg9eQotIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz0yCi1DT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0xNgotQ09ORklHX0kyQz15Ci1DT05GSUdfSTJDX0NIQVJERVY9eQotQ09ORklHX0kyQ19NVjY0WFhYPXkKLUNPTkZJR19TUEk9eQotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAotQ09ORklHX1VTQj15Ci1DT05GSUdfVVNCX0RFVklDRUZTPXkKLUNPTkZJR19VU0JfUFJJTlRFUj15Ci1DT05GSUdfVVNCX1NUT1JBR0U9eQotQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUI9eQotQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT009eQotQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOT15Ci1DT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1PXkKLUNPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVD15Ci1DT05GSUdfTkVXX0xFRFM9eQotQ09ORklHX0VYVDJfRlM9eQotQ09ORklHX0VYVDNfRlM9eQotIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0Ci1DT05GSUdfWEZTX0ZTPXkKLUNPTkZJR19JTk9USUZZPXkKLUNPTkZJR19JU085NjYwX0ZTPXkKLUNPTkZJR19VREZfRlM9bQotQ09ORklHX01TRE9TX0ZTPXkKLUNPTkZJR19WRkFUX0ZTPXkKLUNPTkZJR19UTVBGUz15Ci1DT05GSUdfSkZGUzJfRlM9eQotQ09ORklHX0NSQU1GUz15Ci1DT05GSUdfTkZTX0ZTPXkKLUNPTkZJR19ORlNfVjM9eQotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQotQ09ORklHX0JTRF9ESVNLTEFCRUw9eQotQ09ORklHX01JTklYX1NVQlBBUlRJVElPTj15Ci1DT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OPXkKLUNPTkZJR19VTklYV0FSRV9ESVNLTEFCRUw9eQotQ09ORklHX0xETV9QQVJUSVRJT049eQotQ09ORklHX0xETV9ERUJVRz15Ci1DT05GSUdfU1VOX1BBUlRJVElPTj15Ci1DT05GSUdfTkxTX0NPREVQQUdFXzQzNz15Ci1DT05GSUdfTkxTX0NPREVQQUdFXzg1MD15Ci1DT05GSUdfTkxTX0lTTzg4NTlfMT15Ci1DT05GSUdfTkxTX0lTTzg4NTlfMj15Ci1DT05GSUdfTUFHSUNfU1lTUlE9eQotQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKLUNPTkZJR19ERUJVR19VU0VSPXkKLUNPTkZJR19DUllQVE9fQ0JDPW0KLUNPTkZJR19DUllQVE9fRUNCPW0KLUNPTkZJR19DUllQVE9fUENCQz1tCi1DT05GSUdfQ1JDX0NDSVRUPXkKLUNPTkZJR19DUkMxNj15Ci1DT05GSUdfTElCQ1JDMzJDPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbW1wMl9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL21tcDJfZGVmY29uZmlnCmluZGV4IDQ3YWQzYjEuLjVhNTg0NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbW1wMl9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9tbXAyX2RlZmNvbmZpZwpAQCAtOCw2ICs4LDcgQEAKIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX01NUD15CitDT05GSUdfTUFDSF9CUk9XTlNUT05FPXkKIENPTkZJR19NQUNIX0ZMSU5UPXkKIENPTkZJR19NQUNIX01BUlZFTExfSkFTUEVSPXkKIENPTkZJR19ISUdIX1JFU19USU1FUlM9eQpAQCAtNjMsMTAgKzY0LDE2IEBACiAjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfRFJWX01BWDg5MjU9eQorQ09ORklHX01NQz15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19UTVBGUz15CiBDT05GSUdfVE1QRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQ0X0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CiBDT05GSUdfSkZGUzJfRlM9eQogQ09ORklHX0NSQU1GUz15CiBDT05GSUdfTkZTX0ZTPXkKQEAgLTgxLDcgKzg4LDcgQEAKICMgQ09ORklHX0RFQlVHX1BSRUVNUFQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0lORk89eQogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0Ci1DT05GSUdfRFlOQU1JQ19ERUJVRz15CisjIENPTkZJR19EWU5BTUlDX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19VU0VSPXkKIENPTkZJR19ERUJVR19FUlJPUlM9eQogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9teDUxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXg1MV9kZWZjb25maWcKaW5kZXggMGFjZTE2Yy4uODhjNTgwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9teDUxX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL214NTFfZGVmY29uZmlnCkBAIC0xMDYsNiArMTA2LDcgQEAKIENPTkZJR19VU0I9eQogQ09ORklHX1VTQl9FSENJX0hDRD15CiBDT05GSUdfVVNCX0VIQ0lfTVhDPXkKK0NPTkZJR19VU0JfU1RPUkFHRT15CiBDT05GSUdfTU1DPXkKIENPTkZJR19NTUNfQkxPQ0s9bQogQ09ORklHX01NQ19TREhDST1tCkBAIC0xNDUsNyArMTQ2LDcgQEAKIENPTkZJR19OTFNfREVGQVVMVD0iY3A0MzciCiBDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CiBDT05GSUdfTkxTX0FTQ0lJPXkKLUNPTkZJR19OTFNfSVNPODg1OV8xPW0KK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKIENPTkZJR19OTFNfSVNPODg1OV8xNT1tCiBDT05GSUdfTkxTX1VURjg9eQogQ09ORklHX01BR0lDX1NZU1JRPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXhzX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXhzX2RlZmNvbmZpZwppbmRleCAyYmYyMjQzLi41YTZmZjdjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL214c19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9teHNfZGVmY29uZmlnCkBAIC04OSw3ICs4OSw3IEBACiAjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfTU1DPXkKIENPTkZJR19NTUNfTVhTPXkKLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9EUzEzMDc9bQogQ09ORklHX0RNQURFVklDRVM9eQogQ09ORklHX01YU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9uZXR4X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbmV0eF9kZWZjb25maWcKaW5kZXggMzE2YWY1NC4uOWMwYWQ3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9uZXR4X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL25ldHhfZGVmY29uZmlnCkBAIC02MCw3ICs2MCw3IEBACiAjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CiBDT05GSUdfTE9HTz15Ci1DT05GSUdfUlRDX0NMQVNTPW0KK0NPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX1RNUEZTPXkKIENPTkZJR19KRkZTMl9GUz15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3ZpcGVyX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvdmlwZXJfZGVmY29uZmlnCmluZGV4IDhiMGM3MTcuLjFkMDFkZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvdmlwZXJfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvdmlwZXJfZGVmY29uZmlnCkBAIC0xNDIsNyArMTQyLDcgQEAKIENPTkZJR19VU0JfRklMRV9TVE9SQUdFPW0KIENPTkZJR19VU0JfR19TRVJJQUw9bQogQ09ORklHX1VTQl9HX1BSSU5URVI9bQotQ09ORklHX1JUQ19DTEFTUz1tCitDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfRFJWX0RTMTMwNz1tCiBDT05GSUdfUlRDX0RSVl9TQTExMDA9bQogQ09ORklHX0VYVDJfRlM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy94Y2VwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MveGNlcF9kZWZjb25maWcKaW5kZXggNWI1NTA0MS4uNzIxODMyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy94Y2VwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3hjZXBfZGVmY29uZmlnCkBAIC03Myw3ICs3Myw3IEBACiAjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfUlRDX0NMQVNTPW0KK0NPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19EUlZfU0ExMTAwPW0KIENPTkZJR19ETUFERVZJQ0VTPXkKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy96ZXVzX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvemV1c19kZWZjb25maWcKaW5kZXggOTYwZjY1NS4uNTk1NzdhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy96ZXVzX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3pldXNfZGVmY29uZmlnCkBAIC0xNTgsNyArMTU4LDcgQEAKIENPTkZJR19MRURTX1RSSUdHRVJfQkFDS0xJR0hUPW0KIENPTkZJR19MRURTX1RSSUdHRVJfR1BJTz1tCiBDT05GSUdfTEVEU19UUklHR0VSX0RFRkFVTFRfT049bQotQ09ORklHX1JUQ19DTEFTUz1tCitDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfRFJWX0lTTDEyMDg9bQogQ09ORklHX1JUQ19EUlZfUFhBPW0KIENPTkZJR19FWFQyX0ZTPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKaW5kZXggYmMyZDJkNy4uMjkwMzVlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKQEAgLTEzLDYgKzEzLDkgQEAKICAqICBEbyBub3QgaW5jbHVkZSBhbnkgQyBkZWNsYXJhdGlvbnMgaW4gdGhpcyBmaWxlIC0gaXQgaXMgaW5jbHVkZWQgYnkKICAqICBhc3NlbWJsZXIgc291cmNlLgogICovCisjaWZuZGVmIF9fQVNNX0FTU0VNQkxFUl9IX18KKyNkZWZpbmUgX19BU01fQVNTRU1CTEVSX0hfXworCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2Vycm9yICJPbmx5IGluY2x1ZGUgdGhpcyBmcm9tIGFzc2VtYmx5IGNvZGUiCiAjZW5kaWYKQEAgLTI5MCwzICsyOTMsMTMgQEAKIAkubWFjcm8JbGRydXNyLCByZWcsIHB0ciwgaW5jLCBjb25kPWFsLCByZXB0PTEsIGFib3J0PTkwMDFmCiAJdXNyYWNjCWxkciwgXHJlZywgXHB0ciwgXGluYywgXGNvbmQsIFxyZXB0LCBcYWJvcnQKIAkuZW5kbQorCisvKiBVdGlsaXR5IG1hY3JvIGZvciBkZWNsYXJpbmcgc3RyaW5nIGxpdGVyYWxzICovCisJLm1hY3JvCXN0cmluZyBuYW1lOnJlcSwgc3RyaW5nCisJLnR5cGUgXG5hbWUgLCAjb2JqZWN0CitcbmFtZToKKwkuYXNjaXogIlxzdHJpbmciCisJLnNpemUgXG5hbWUgLCAuIC0gXG5hbWUKKwkuZW5kbQorCisjZW5kaWYgLyogX19BU01fQVNTRU1CTEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYml0b3BzLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9iaXRvcHMuaAppbmRleCBiNDg5MmEwLi5mNDI4MDU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9iaXRvcHMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9iaXRvcHMuaApAQCAtMjYsOCArMjYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCW1iKCkKLSNkZWZpbmUgc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKQltYigpCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCXNtcF9tYigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCkJc21wX21iKCkKIAogLyoKICAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdGhlIGJhc2lzIG9mIG91ciBiaXQgb3BzLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKaW5kZXggNGZmZjgzNy4uN2EyMWQwYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCkBAIC0xMTUsMzkgKzExNSw4IEBACiAJCV9fX2RtYV9wYWdlX2Rldl90b19jcHUocGFnZSwgb2ZmLCBzaXplLCBkaXIpOwogfQogCi0vKgotICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGRldmljZSBETUEgYWRkcmVzcyBtYXNrIGNhbiBiZSBzdXBwb3J0ZWQKLSAqIHByb3Blcmx5LiAgRm9yIGV4YW1wbGUsIGlmIHlvdXIgZGV2aWNlIGNhbiBvbmx5IGRyaXZlIHRoZSBsb3cgMjQtYml0cwotICogZHVyaW5nIGJ1cyBtYXN0ZXJpbmcsIHRoZW4geW91IHdvdWxkIHBhc3MgMHgwMGZmZmZmZiBhcyB0aGUgbWFzawotICogdG8gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBGSVhNRTogVGhpcyBzaG91bGQgcmVhbGx5IGJlIGEgcGxhdGZvcm0gc3BlY2lmaWMgaXNzdWUgLSB3ZSBzaG91bGQKLSAqIHJldHVybiBmYWxzZSBpZiBHRlBfRE1BIGFsbG9jYXRpb25zIG1heSBub3Qgc2F0aXNmeSB0aGUgc3VwcGxpZWQgJ21hc2snLgotICovCi1zdGF0aWMgaW5saW5lIGludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCi17Ci0JaWYgKG1hc2sgPCBJU0FfRE1BX1RIUkVTSE9MRCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBkbWFfbWFzaykKLXsKLSNpZmRlZiBDT05GSUdfRE1BQk9VTkNFCi0JaWYgKGRldi0+YXJjaGRhdGEuZG1hYm91bmNlKSB7Ci0JCWlmIChkbWFfbWFzayA+PSBJU0FfRE1BX1RIUkVTSE9MRCkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTzsKLQl9Ci0jZW5kaWYKLQlpZiAoIWRldi0+ZG1hX21hc2sgfHwgIWRtYV9zdXBwb3J0ZWQoZGV2LCBkbWFfbWFzaykpCi0JCXJldHVybiAtRUlPOwotCi0JKmRldi0+ZG1hX21hc2sgPSBkbWFfbWFzazsKLQotCXJldHVybiAwOwotfQorZXh0ZXJuIGludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKiwgdTY0KTsKK2V4dGVybiBpbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKiwgdTY0KTsKIAogLyoKICAqIERNQSBlcnJvcnMgYXJlIGRlZmluZWQgYnkgYWxsLWJpdHMtc2V0IGluIHRoZSBETUEgYWRkcmVzcy4KQEAgLTI1NiwxNCArMjI1LDE0IEBACiAgKiBAZGV2OiB2YWxpZCBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIKICAqIEBzbWFsbF9idWZfc2l6ZTogc2l6ZSBvZiBidWZmZXJzIHRvIHVzZSB3aXRoIHNtYWxsIGJ1ZmZlciBwb29sCiAgKiBAbGFyZ2VfYnVmX3NpemU6IHNpemUgb2YgYnVmZmVycyB0byB1c2Ugd2l0aCBsYXJnZSBidWZmZXIgcG9vbCAoY2FuIGJlIDApCisgKiBAbmVlZHNfYm91bmNlX2ZuOiBjYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYnVmZmVyIG5lZWRzIGJvdW5jaW5nCiAgKgogICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IGxvdy1sZXZlbCBwbGF0Zm9ybSBjb2RlIHRvIHJlZ2lzdGVyCiAgKiBhIGRldmljZSBhcyByZXF1aXJlaW5nIERNQSBidWZmZXIgYm91bmNpbmcuIFRoZSBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlCiAgKiBhcHByb3ByaWF0ZSBETUEgcG9vbHMgZm9yIHRoZSBkZXZpY2UuCi0gKgogICovCiBleHRlcm4gaW50IGRtYWJvdW5jZV9yZWdpc3Rlcl9kZXYoc3RydWN0IGRldmljZSAqLCB1bnNpZ25lZCBsb25nLAotCQl1bnNpZ25lZCBsb25nKTsKKwkJdW5zaWduZWQgbG9uZywgaW50ICgqKShzdHJ1Y3QgZGV2aWNlICosIGRtYV9hZGRyX3QsIHNpemVfdCkpOwogCiAvKioKICAqIGRtYWJvdW5jZV91bnJlZ2lzdGVyX2RldgpAQCAtMjc3LDMxICsyNDYsOSBAQAogICovCiBleHRlcm4gdm9pZCBkbWFib3VuY2VfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGRldmljZSAqKTsKIAotLyoqCi0gKiBkbWFfbmVlZHNfYm91bmNlCi0gKgotICogQGRldjogdmFsaWQgc3RydWN0IGRldmljZSBwb2ludGVyCi0gKiBAZG1hX2hhbmRsZTogZG1hX2hhbmRsZSBvZiB1bmJvdW5jZWQgYnVmZmVyCi0gKiBAc2l6ZTogc2l6ZSBvZiByZWdpb24gYmVpbmcgbWFwcGVkCi0gKgotICogUGxhdGZvcm1zIHRoYXQgdXRpbGl6ZSB0aGUgZG1hYm91bmNlIG1lY2hhbmlzbSBtdXN0IGltcGxlbWVudAotICogdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBUaGUgZG1hYm91bmNlIHJvdXRpbmVzIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuZXZlciBhIGRtYS1tYXBwaW5nCi0gKiBpcyByZXF1ZXN0ZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBidWZmZXIgbmVlZHMgdG8gYmUgYm91bmNlZAotICogb3Igbm90LiBUaGUgZnVuY3Rpb24gbXVzdCByZXR1cm4gMCBpZiB0aGUgYnVmZmVyIGlzIE9LIGZvcgotICogRE1BIGFjY2VzcyBhbmQgMSBpZiB0aGUgYnVmZmVyIG5lZWRzIHRvIGJlIGJvdW5jZWQuCi0gKgotICovCi1leHRlcm4gaW50IGRtYV9uZWVkc19ib3VuY2Uoc3RydWN0IGRldmljZSosIGRtYV9hZGRyX3QsIHNpemVfdCk7Ci0KIC8qCiAgKiBUaGUgRE1BIEFQSSwgaW1wbGVtZW50ZWQgYnkgZG1hYm91bmNlLmMuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucy4KICAqLwotZXh0ZXJuIGRtYV9hZGRyX3QgX19kbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKiwgc2l6ZV90LAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7Ci1leHRlcm4gdm9pZCBfX2RtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqLCBkbWFfYWRkcl90LCBzaXplX3QsCi0JCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKTsKIGV4dGVybiBkbWFfYWRkcl90IF9fZG1hX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHBhZ2UgKiwKIAkJdW5zaWduZWQgbG9uZywgc2l6ZV90LCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7CiBleHRlcm4gdm9pZCBfX2RtYV91bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKiwgZG1hX2FkZHJfdCwgc2l6ZV90LApAQCAtMzI4LDEzICsyNzUsNiBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBfX2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqY3B1X2FkZHIsCi0JCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JX19kbWFfc2luZ2xlX2NwdV90b19kZXYoY3B1X2FkZHIsIHNpemUsIGRpcik7Ci0JcmV0dXJuIHZpcnRfdG9fZG1hKGRldiwgY3B1X2FkZHIpOwotfQotCiBzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgX19kbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewpAQCAtMzQyLDEyICsyODIsNiBAQAogCXJldHVybiBwZm5fdG9fZG1hKGRldiwgcGFnZV90b19wZm4ocGFnZSkpICsgb2Zmc2V0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19kbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBoYW5kbGUsCi0JCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JX19kbWFfc2luZ2xlX2Rldl90b19jcHUoZG1hX3RvX3ZpcnQoZGV2LCBoYW5kbGUpLCBzaXplLCBkaXIpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgX19kbWFfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlLAogCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewpAQCAtMzczLDE0ICszMDcsMTggQEAKIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBkbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmNwdV9hZGRyLAogCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogeworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBwYWdlICpwYWdlOwogCWRtYV9hZGRyX3QgYWRkcjsKIAorCUJVR19PTighdmlydF9hZGRyX3ZhbGlkKGNwdV9hZGRyKSk7CisJQlVHX09OKCF2aXJ0X2FkZHJfdmFsaWQoY3B1X2FkZHIgKyBzaXplIC0gMSkpOwogCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXIpKTsKIAotCWFkZHIgPSBfX2RtYV9tYXBfc2luZ2xlKGRldiwgY3B1X2FkZHIsIHNpemUsIGRpcik7Ci0JZGVidWdfZG1hX21hcF9wYWdlKGRldiwgdmlydF90b19wYWdlKGNwdV9hZGRyKSwKLQkJCSh1bnNpZ25lZCBsb25nKWNwdV9hZGRyICYgflBBR0VfTUFTSywgc2l6ZSwKLQkJCWRpciwgYWRkciwgdHJ1ZSk7CisJcGFnZSA9IHZpcnRfdG9fcGFnZShjcHVfYWRkcik7CisJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpY3B1X2FkZHIgJiB+UEFHRV9NQVNLOworCWFkZHIgPSBfX2RtYV9tYXBfcGFnZShkZXYsIHBhZ2UsIG9mZnNldCwgc2l6ZSwgZGlyKTsKKwlkZWJ1Z19kbWFfbWFwX3BhZ2UoZGV2LCBwYWdlLCBvZmZzZXQsIHNpemUsIGRpciwgYWRkciwgdHJ1ZSk7CiAKIAlyZXR1cm4gYWRkcjsKIH0KQEAgLTQzMCw3ICszNjgsNyBAQAogCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewogCWRlYnVnX2RtYV91bm1hcF9wYWdlKGRldiwgaGFuZGxlLCBzaXplLCBkaXIsIHRydWUpOwotCV9fZG1hX3VubWFwX3NpbmdsZShkZXYsIGhhbmRsZSwgc2l6ZSwgZGlyKTsKKwlfX2RtYV91bm1hcF9wYWdlKGRldiwgaGFuZGxlLCBzaXplLCBkaXIpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLmgKaW5kZXggNDIwMDU1NC4uNjI4NjcwZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLmgKQEAgLTEsMTUgKzEsMTYgQEAKICNpZm5kZWYgX19BU01fQVJNX0RNQV9ICiAjZGVmaW5lIF9fQVNNX0FSTV9ETUFfSAogCi0jaW5jbHVkZSA8YXNtL21lbW9yeS5oPgotCiAvKgogICogVGhpcyBpcyB0aGUgbWF4aW11bSB2aXJ0dWFsIGFkZHJlc3Mgd2hpY2ggY2FuIGJlIERNQSdkIGZyb20uCiAgKi8KLSNpZm5kZWYgQVJNX0RNQV9aT05FX1NJWkUKLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCTB4ZmZmZmZmZmYKKyNpZm5kZWYgQ09ORklHX1pPTkVfRE1BCisjZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkweGZmZmZmZmZmVUwKICNlbHNlCi0jZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkoUEFHRV9PRkZTRVQgKyBBUk1fRE1BX1pPTkVfU0laRSkKKyNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCSh7IFwKKwlleHRlcm4gdW5zaWduZWQgbG9uZyBhcm1fZG1hX3pvbmVfc2l6ZTsgXAorCWFybV9kbWFfem9uZV9zaXplID8gXAorCQkoUEFHRV9PRkZTRVQgKyBhcm1fZG1hX3pvbmVfc2l6ZSkgOiAweGZmZmZmZmZmVUw7IH0pCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19JU0FfRE1BX0FQSQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZW50cnktbWFjcm8tbXVsdGkuUyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VudHJ5LW1hY3JvLW11bHRpLlMKaW5kZXggZWMwYmJmNy4uMmYxZTIwOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZW50cnktbWFjcm8tbXVsdGkuUworKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbnRyeS1tYWNyby1tdWx0aS5TCkBAIC0xLDkgKzEsMTEgQEAKKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisKIC8qCiAgKiBJbnRlcnJ1cHQgaGFuZGxpbmcuICBQcmVzZXJ2ZXMgcjcsIHI4LCByOQogICovCiAJLm1hY3JvCWFyY2hfaXJxX2hhbmRsZXJfZGVmYXVsdAotCWdldF9pcnFucl9wcmVhbWJsZSByNSwgbHIKLTE6CWdldF9pcnFucl9hbmRfYmFzZSByMCwgcjYsIHI1LCBscgorCWdldF9pcnFucl9wcmVhbWJsZSByNiwgbHIKKzE6CWdldF9pcnFucl9hbmRfYmFzZSByMCwgcjIsIHI2LCBscgogCW1vdm5lCXIxLCBzcAogCUAKIAlAIHJvdXRpbmUgY2FsbGVkIHdpdGggcjAgPSBpcnEgbnVtYmVyLCByMSA9IHN0cnVjdCBwdF9yZWdzICoKQEAgLTE1LDE3ICsxNywxNyBAQAogCS8qCiAJICogWFhYCiAJICoKLQkgKiB0aGlzIG1hY3JvIGFzc3VtZXMgdGhhdCBpcnFzdGF0IChyNikgYW5kIGJhc2UgKHI1KSBhcmUKKwkgKiB0aGlzIG1hY3JvIGFzc3VtZXMgdGhhdCBpcnFzdGF0IChyMikgYW5kIGJhc2UgKHI2KSBhcmUKIAkgKiBwcmVzZXJ2ZWQgZnJvbSBnZXRfaXJxbnJfYW5kX2Jhc2UgYWJvdmUKIAkgKi8KLQlBTFRfU01QKHRlc3RfZm9yX2lwaSByMCwgcjYsIHI1LCBscikKKwlBTFRfU01QKHRlc3RfZm9yX2lwaSByMCwgcjIsIHI2LCBscikKIAlBTFRfVVBfQig5OTk3ZikKIAltb3ZuZQlyMSwgc3AKIAlhZHJuZQlsciwgQlNZTSgxYikKIAlibmUJZG9fSVBJCiAKICNpZmRlZiBDT05GSUdfTE9DQUxfVElNRVJTCi0JdGVzdF9mb3JfbHRpcnEgcjAsIHI2LCByNSwgbHIKKwl0ZXN0X2Zvcl9sdGlycSByMCwgcjIsIHI2LCBscgogCW1vdm5lCXIwLCBzcAogCWFkcm5lCWxyLCBCU1lNKDFiKQogCWJuZQlkb19sb2NhbF90aW1lcgpAQCAtMzgsNyArNDAsNyBAQAogCS5hbGlnbgk1CiAJLmdsb2JhbCBcc3ltYm9sX25hbWUKIFxzeW1ib2xfbmFtZToKLQltb3YJcjQsIGxyCisJbW92CXI4LCBscgogCWFyY2hfaXJxX2hhbmRsZXJfZGVmYXVsdAotCW1vdiAgICAgcGMsIHI0CisJbW92ICAgICBwYywgcjgKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvc2Nvb3AuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL3Njb29wLmgKaW5kZXggZWJiM2NlYS4uNThjZGY1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvc2Nvb3AuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9zY29vcC5oCkBAIC02MSw3ICs2MSw2IEBACiBzdHJ1Y3Qgc2Nvb3BfcGNtY2lhX2NvbmZpZyB7CiAJc3RydWN0IHNjb29wX3BjbWNpYV9kZXYgKmRldnM7CiAJaW50IG51bV9kZXZzOwotCXZvaWQgKCpwY21jaWFfaW5pdCkodm9pZCk7CiAJdm9pZCAoKnBvd2VyX2N0cmwpKHN0cnVjdCBkZXZpY2UgKnNjb29wLCB1bnNpZ25lZCBzaG9ydCBjcHIsIGludCBucik7CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9od2NhcC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdjYXAuaAppbmRleCBjMTA2MmMzLi5jOTNhMjJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9od2NhcC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2h3Y2FwLmgKQEAgLTQsMjIgKzQsMjYgQEAKIC8qCiAgKiBIV0NBUCBmbGFncyAtIGZvciBlbGZfaHdjYXAgKGluIGtlcm5lbCkgYW5kIEFUX0hXQ0FQCiAgKi8KLSNkZWZpbmUgSFdDQVBfU1dQCTEKLSNkZWZpbmUgSFdDQVBfSEFMRgkyCi0jZGVmaW5lIEhXQ0FQX1RIVU1CCTQKLSNkZWZpbmUgSFdDQVBfMjZCSVQJOAkvKiBQbGF5IGl0IHNhZmUgKi8KLSNkZWZpbmUgSFdDQVBfRkFTVF9NVUxUCTE2Ci0jZGVmaW5lIEhXQ0FQX0ZQQQkzMgotI2RlZmluZSBIV0NBUF9WRlAJNjQKLSNkZWZpbmUgSFdDQVBfRURTUAkxMjgKLSNkZWZpbmUgSFdDQVBfSkFWQQkyNTYKLSNkZWZpbmUgSFdDQVBfSVdNTVhUCTUxMgotI2RlZmluZSBIV0NBUF9DUlVOQ0gJMTAyNAotI2RlZmluZSBIV0NBUF9USFVNQkVFCTIwNDgKLSNkZWZpbmUgSFdDQVBfTkVPTgk0MDk2Ci0jZGVmaW5lIEhXQ0FQX1ZGUHYzCTgxOTIKLSNkZWZpbmUgSFdDQVBfVkZQdjNEMTYJMTYzODQKLSNkZWZpbmUgSFdDQVBfVExTCTMyNzY4CisjZGVmaW5lIEhXQ0FQX1NXUAkoMSA8PCAwKQorI2RlZmluZSBIV0NBUF9IQUxGCSgxIDw8IDEpCisjZGVmaW5lIEhXQ0FQX1RIVU1CCSgxIDw8IDIpCisjZGVmaW5lIEhXQ0FQXzI2QklUCSgxIDw8IDMpCS8qIFBsYXkgaXQgc2FmZSAqLworI2RlZmluZSBIV0NBUF9GQVNUX01VTFQJKDEgPDwgNCkKKyNkZWZpbmUgSFdDQVBfRlBBCSgxIDw8IDUpCisjZGVmaW5lIEhXQ0FQX1ZGUAkoMSA8PCA2KQorI2RlZmluZSBIV0NBUF9FRFNQCSgxIDw8IDcpCisjZGVmaW5lIEhXQ0FQX0pBVkEJKDEgPDwgOCkKKyNkZWZpbmUgSFdDQVBfSVdNTVhUCSgxIDw8IDkpCisjZGVmaW5lIEhXQ0FQX0NSVU5DSAkoMSA8PCAxMCkKKyNkZWZpbmUgSFdDQVBfVEhVTUJFRQkoMSA8PCAxMSkKKyNkZWZpbmUgSFdDQVBfTkVPTgkoMSA8PCAxMikKKyNkZWZpbmUgSFdDQVBfVkZQdjMJKDEgPDwgMTMpCisjZGVmaW5lIEhXQ0FQX1ZGUHYzRDE2CSgxIDw8IDE0KQorI2RlZmluZSBIV0NBUF9UTFMJKDEgPDwgMTUpCisjZGVmaW5lIEhXQ0FQX1ZGUHY0CSgxIDw8IDE2KQorI2RlZmluZSBIV0NBUF9JRElWQQkoMSA8PCAxNykKKyNkZWZpbmUgSFdDQVBfSURJVlQJKDEgPDwgMTgpCisjZGVmaW5lIEhXQ0FQX0lESVYJKEhXQ0FQX0lESVZBIHwgSFdDQVBfSURJVlQpCiAKICNpZiBkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9pODI1My5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaTgyNTMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2NTZiNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9pODI1My5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI2lmbmRlZiBfX0FTTUFSTV9JODI1M19ICi0jZGVmaW5lIF9fQVNNQVJNX0k4MjUzX0gKLQotLyogaTgyNTNBIFBJVCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUElUX01PREUJMHg0MwotI2RlZmluZSBQSVRfQ0gwCQkweDQwCi0KLSNkZWZpbmUgUElUX0xBVENICSgoUElUX1RJQ0tfUkFURSArIEhaIC8gMikgLyBIWikKLQotZXh0ZXJuIHJhd19zcGlubG9ja190IGk4MjUzX2xvY2s7Ci0KLSNkZWZpbmUgb3V0Yl9waXQJb3V0Yl9wCi0jZGVmaW5lIGluYl9waXQJCWluYl9wCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3Byb2Jlcy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20va3Byb2Jlcy5oCmluZGV4IGU0NmJkZDAuLmZlZWM4NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2twcm9iZXMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rcHJvYmVzLmgKQEAgLTI0LDEyICsyNCw2IEBACiAjZGVmaW5lIE1BWF9JTlNOX1NJWkUJCQkyCiAjZGVmaW5lIE1BWF9TVEFDS19TSVpFCQkJNjQJLyogMzIgd291bGQgcHJvYmFibHkgYmUgT0sgKi8KIAotLyoKLSAqIFRoaXMgdW5kZWZpbmVkIGluc3RydWN0aW9uIG11c3QgYmUgdW5pcXVlIGFuZAotICogcmVzZXJ2ZWQgc29sZWx5IGZvciBrcHJvYmVzJyB1c2UuCi0gKi8KLSNkZWZpbmUgS1BST0JFX0JSRUFLUE9JTlRfSU5TVFJVQ1RJT04JMHhlN2YwMDFmOAotCiAjZGVmaW5lIHJlZ3NfcmV0dXJuX3ZhbHVlKHJlZ3MpCQkoKHJlZ3MpLT5BUk1fcjApCiAjZGVmaW5lIGZsdXNoX2luc25fc2xvdChwKQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBrcmV0cHJvYmVfYmxhY2tsaXN0X3NpemUJMApAQCAtMzgsMTQgKzMyLDE3IEBACiAKIHN0cnVjdCBrcHJvYmU7CiB0eXBlZGVmIHZvaWQgKGtwcm9iZV9pbnNuX2hhbmRsZXJfdCkoc3RydWN0IGtwcm9iZSAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKLQogdHlwZWRlZiB1bnNpZ25lZCBsb25nIChrcHJvYmVfY2hlY2tfY2MpKHVuc2lnbmVkIGxvbmcpOwordHlwZWRlZiB2b2lkIChrcHJvYmVfaW5zbl9zaW5nbGVzdGVwX3QpKHN0cnVjdCBrcHJvYmUgKiwgc3RydWN0IHB0X3JlZ3MgKik7Cit0eXBlZGVmIHZvaWQgKGtwcm9iZV9pbnNuX2ZuX3QpKHZvaWQpOwogCiAvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29weSBvZiBvcmlnaW5hbCBpbnN0cnVjdGlvbi4gKi8KIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gewotCWtwcm9iZV9vcGNvZGVfdAkJKmluc247Ci0Ja3Byb2JlX2luc25faGFuZGxlcl90CSppbnNuX2hhbmRsZXI7Ci0Ja3Byb2JlX2NoZWNrX2NjCQkqaW5zbl9jaGVja19jYzsKKwlrcHJvYmVfb3Bjb2RlX3QJCQkqaW5zbjsKKwlrcHJvYmVfaW5zbl9oYW5kbGVyX3QJCSppbnNuX2hhbmRsZXI7CisJa3Byb2JlX2NoZWNrX2NjCQkJKmluc25fY2hlY2tfY2M7CisJa3Byb2JlX2luc25fc2luZ2xlc3RlcF90CSppbnNuX3NpbmdsZXN0ZXA7CisJa3Byb2JlX2luc25fZm5fdAkJKmluc25fZm47CiB9OwogCiBzdHJ1Y3QgcHJldl9rcHJvYmUgewpAQCAtNjIsMjAgKzU5LDkgQEAKIH07CiAKIHZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKik7Ci12b2lkIGtyZXRwcm9iZV90cmFtcG9saW5lKHZvaWQpOwotCiBpbnQga3Byb2JlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBmc3IpOwogaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKTsKIAotZW51bSBrcHJvYmVfaW5zbiB7Ci0JSU5TTl9SRUpFQ1RFRCwKLQlJTlNOX0dPT0QsCi0JSU5TTl9HT09EX05PX1NMT1QKLX07Ci0KLWVudW0ga3Byb2JlX2luc24gYXJtX2twcm9iZV9kZWNvZGVfaW5zbihrcHJvYmVfb3Bjb2RlX3QsCi0JCQkJCXN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKik7Ci12b2lkIF9faW5pdCBhcm1fa3Byb2JlX2RlY29kZV9pbml0KHZvaWQpOwogCiAjZW5kaWYgLyogX0FSTV9LUFJPQkVTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvYXJjaC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9hcmNoLmgKaW5kZXggOTQ2ZjRkNy4uMzI4MWZiNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9hcmNoLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9hcmNoLmgKQEAgLTIzLDYgKzIzLDEwIEBACiAKIAl1bnNpZ25lZCBpbnQJCW5yX2lycXM7CS8qIG51bWJlciBvZiBJUlFzICovCiAKKyNpZmRlZiBDT05GSUdfWk9ORV9ETUEKKwl1bnNpZ25lZCBsb25nCQlkbWFfem9uZV9zaXplOwkvKiBzaXplIG9mIERNQS1hYmxlIGFyZWEgKi8KKyNlbmRpZgorCiAJdW5zaWduZWQgaW50CQl2aWRlb19zdGFydDsJLyogc3RhcnQgb2YgdmlkZW8gUkFNCSovCiAJdW5zaWduZWQgaW50CQl2aWRlb19lbmQ7CS8qIGVuZCBvZiB2aWRlbyBSQU0JKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaAppbmRleCBhZjQ0YThmLi5iOGRlNTE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaApAQCAtMjA0LDE4ICsyMDQsNiBAQAogI2VuZGlmCiAKIC8qCi0gKiBUaGUgRE1BIG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgbWF4aW11bSBidXMgYWRkcmVzcyBhbGxvY2F0YWJsZQotICogdXNpbmcgR0ZQX0RNQS4gIFRoZSBkZWZhdWx0IGhlcmUgcGxhY2VzIG5vIHJlc3RyaWN0aW9uIG9uIERNQQotICogYWxsb2NhdGlvbnMuICBUaGlzIG11c3QgYmUgdGhlIHNtYWxsZXN0IERNQSBtYXNrIGluIHRoZSBzeXN0ZW0sCi0gKiBzbyBhIHN1Y2Nlc3NmdWwgR0ZQX0RNQSBhbGxvY2F0aW9uIHdpbGwgYWx3YXlzIHNhdGlzZnkgdGhpcy4KLSAqLwotI2lmbmRlZiBBUk1fRE1BX1pPTkVfU0laRQotI2RlZmluZSBJU0FfRE1BX1RIUkVTSE9MRAkoMHhmZmZmZmZmZlVMTCkKLSNlbHNlCi0jZGVmaW5lIElTQV9ETUFfVEhSRVNIT0xECShQSFlTX09GRlNFVCArIEFSTV9ETUFfWk9ORV9TSVpFIC0gMSkKLSNlbmRpZgotCi0vKgogICogUEZOcyBhcmUgdXNlZCB0byBkZXNjcmliZSBhbnkgcGh5c2ljYWwgcGFnZTsgdGhpcyBtZWFucwogICogUEZOIDAgPT0gcGh5c2ljYWwgYWRkcmVzcyAwLgogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaAppbmRleCBjNGFhNGU4Li4wZjhlMzgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCkBAIC0yNCw2ICsyNCw4IEBACiAJQVJNX1BFUkZfUE1VX0lEX1Y2TVAsCiAJQVJNX1BFUkZfUE1VX0lEX0NBOCwKIAlBUk1fUEVSRl9QTVVfSURfQ0E5LAorCUFSTV9QRVJGX1BNVV9JRF9DQTUsCisJQVJNX1BFUkZfUE1VX0lEX0NBMTUsCiAJQVJNX05VTV9QTVVfSURTLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcG11LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wbXUuaAppbmRleCA3NTQ0Y2U2Li42N2M3MGEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wbXUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wbXUuaApAQCAtNTIsNyArNTIsNyBAQAogICogYSBjb29raWUuCiAgKi8KIGV4dGVybiBpbnQKLXJlbGVhc2VfcG11KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworcmVsZWFzZV9wbXUoZW51bSBhcm1fcG11X3R5cGUgdHlwZSk7CiAKIC8qKgogICogaW5pdF9wbXUoKSAtIEluaXRpYWxpc2UgdGhlIFBNVS4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Byb2MtZm5zLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wcm9jLWZucy5oCmluZGV4IDhlYzUzNWUuLjYzM2QxY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Byb2MtZm5zLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvYy1mbnMuaApAQCAtODIsMTMgKzgyLDEzIEBACiBleHRlcm4gdm9pZCBjcHVfc2V0X3B0ZV9leHQocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGV4dCk7CiBleHRlcm4gdm9pZCBjcHVfcmVzZXQodW5zaWduZWQgbG9uZyBhZGRyKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwogI2Vsc2UKLSNkZWZpbmUgY3B1X3Byb2NfaW5pdCgpCQkJcHJvY2Vzc29yLl9wcm9jX2luaXQoKQotI2RlZmluZSBjcHVfcHJvY19maW4oKQkJCXByb2Nlc3Nvci5fcHJvY19maW4oKQotI2RlZmluZSBjcHVfcmVzZXQoYWRkcikJCQlwcm9jZXNzb3IucmVzZXQoYWRkcikKLSNkZWZpbmUgY3B1X2RvX2lkbGUoKQkJCXByb2Nlc3Nvci5fZG9faWRsZSgpCi0jZGVmaW5lIGNwdV9kY2FjaGVfY2xlYW5fYXJlYShhZGRyLHN6KQlwcm9jZXNzb3IuZGNhY2hlX2NsZWFuX2FyZWEoYWRkcixzeikKLSNkZWZpbmUgY3B1X3NldF9wdGVfZXh0KHB0ZXAscHRlLGV4dCkJcHJvY2Vzc29yLnNldF9wdGVfZXh0KHB0ZXAscHRlLGV4dCkKLSNkZWZpbmUgY3B1X2RvX3N3aXRjaF9tbShwZ2QsbW0pCXByb2Nlc3Nvci5zd2l0Y2hfbW0ocGdkLG1tKQorI2RlZmluZSBjcHVfcHJvY19pbml0CQkJcHJvY2Vzc29yLl9wcm9jX2luaXQKKyNkZWZpbmUgY3B1X3Byb2NfZmluCQkJcHJvY2Vzc29yLl9wcm9jX2ZpbgorI2RlZmluZSBjcHVfcmVzZXQJCQlwcm9jZXNzb3IucmVzZXQKKyNkZWZpbmUgY3B1X2RvX2lkbGUJCQlwcm9jZXNzb3IuX2RvX2lkbGUKKyNkZWZpbmUgY3B1X2RjYWNoZV9jbGVhbl9hcmVhCQlwcm9jZXNzb3IuZGNhY2hlX2NsZWFuX2FyZWEKKyNkZWZpbmUgY3B1X3NldF9wdGVfZXh0CQkJcHJvY2Vzc29yLnNldF9wdGVfZXh0CisjZGVmaW5lIGNwdV9kb19zd2l0Y2hfbW0JCXByb2Nlc3Nvci5zd2l0Y2hfbW0KICNlbmRpZgogCiBleHRlcm4gdm9pZCBjcHVfcmVzdW1lKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wdHJhY2UuaAppbmRleCAzMTJkMTA4Li45NjE4N2ZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtNjksOCArNjksOSBAQAogI2RlZmluZSBQU1JfYwkJMHgwMDAwMDBmZgkvKiBDb250cm9sCQkqLwogCiAvKgotICogQVJNdjcgZ3JvdXBzIG9mIEFQU1IgYml0cworICogQVJNdjcgZ3JvdXBzIG9mIFBTUiBiaXRzCiAgKi8KKyNkZWZpbmUgQVBTUl9NQVNLCTB4ZjgwZjAwMDAJLyogTiwgWiwgQywgViwgUSBhbmQgR0UgZmxhZ3MgKi8KICNkZWZpbmUgUFNSX0lTRVRfTUFTSwkweDAxMDAwMDEwCS8qIElTQSBzdGF0ZSAoSiwgVCkgbWFzayAqLwogI2RlZmluZSBQU1JfSVRfTUFTSwkweDA2MDBmYzAwCS8qIElmLVRoZW4gZXhlY3V0aW9uIHN0YXRlIG1hc2sgKi8KICNkZWZpbmUgUFNSX0VORElBTl9NQVNLCTB4MDAwMDAyMDAJLyogRW5kaWFubmVzcyBzdGF0ZSBtYXNrICovCkBAIC0yMDAsNiArMjAxLDE0IEBACiAjZGVmaW5lIFBSRURJQ0FURV9BTFdBWVMJMHhlMDAwMDAwMAogCiAvKgorICogVHJ1ZSBpZiBpbnN0ciBpcyBhIDMyLWJpdCB0aHVtYiBpbnN0cnVjdGlvbi4gVGhpcyB3b3JrcyBpZiBpbnN0cgorICogaXMgdGhlIGZpcnN0IG9yIG9ubHkgaGFsZi13b3JkIG9mIGEgdGh1bWIgaW5zdHJ1Y3Rpb24uIEl0IGFsc28gd29ya3MKKyAqIHdoZW4gaW5zdHIgaG9sZHMgYWxsIDMyLWJpdHMgb2YgYSB3aWRlIHRodW1iIGluc3RydWN0aW9uIGlmIHN0b3JlZAorICogaW4gdGhlIGZvcm0gKGZpcnN0X2hhbGY8PDE2KXwoc2Vjb25kX2hhbGYpCisgKi8KKyNkZWZpbmUgaXNfd2lkZV9pbnN0cnVjdGlvbihpbnN0cikJKCh1bnNpZ25lZCkoaW5zdHIpID49IDB4ZTgwMCkKKworLyoKICAqIGtwcm9iZS1iYXNlZCBldmVudCB0cmFjZXIgc3VwcG9ydAogICovCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc2NhdHRlcmxpc3QuaAppbmRleCAyZjg3ODcwLi5jZWZkYjhmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0LmgKQEAgLTEsNiArMSwxMCBAQAogI2lmbmRlZiBfQVNNQVJNX1NDQVRURVJMSVNUX0gKICNkZWZpbmUgX0FTTUFSTV9TQ0FUVEVSTElTVF9ICiAKKyNpZmRlZiBDT05GSUdfQVJNX0hBU19TR19DSEFJTgorI2RlZmluZSBBUkNIX0hBU19TR19DSEFJTgorI2VuZGlmCisKICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2NhdHRlcmxpc3QuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IGVlMmFkOGEuLjkxNTY5NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NldHVwLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMTg3LDEyICsxODcsMTYgQEAKIAogI2RlZmluZSBfX3RhZyBfX3VzZWQgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi50YWdsaXN0LmluaXQiKSkpCiAjZGVmaW5lIF9fdGFndGFibGUodGFnLCBmbikgXAotc3RhdGljIHN0cnVjdCB0YWd0YWJsZSBfX3RhZ3RhYmxlXyMjZm4gX190YWcgPSB7IHRhZywgZm4gfQorc3RhdGljIGNvbnN0IHN0cnVjdCB0YWd0YWJsZSBfX3RhZ3RhYmxlXyMjZm4gX190YWcgPSB7IHRhZywgZm4gfQogCiAvKgogICogTWVtb3J5IG1hcCBkZXNjcmlwdGlvbgogICovCi0jZGVmaW5lIE5SX0JBTktTIDgKKyNpZmRlZiBDT05GSUdfQVJDSF9FUDkzWFgKKyMgZGVmaW5lIE5SX0JBTktTIDE2CisjZWxzZQorIyBkZWZpbmUgTlJfQkFOS1MgOAorI2VuZGlmCiAKIHN0cnVjdCBtZW1iYW5rIHsKIAlwaHlzX2FkZHJfdCBzdGFydDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N1c3BlbmQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N1c3BlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGU0ZTFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3VzcGVuZC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX19BU01fQVJNX1NVU1BFTkRfSAorI2RlZmluZSBfX0FTTV9BUk1fU1VTUEVORF9ICisKKyNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKK2V4dGVybiB2b2lkIGNwdV9yZXN1bWUodm9pZCk7CisKKy8qCisgKiBIaWRlIHRoZSBmaXJzdCB0d28gYXJndW1lbnRzIHRvIF9fY3B1X3N1c3BlbmQgLSB0aGVzZSBhcmUgYW4gaW1wbGVtZW50YXRpb24KKyAqIGRldGFpbCB3aGljaCBwbGF0Zm9ybSBjb2RlIHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9zdXNwZW5kKHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgKCpmbikodW5zaWduZWQgbG9uZykpCit7CisJZXh0ZXJuIGludCBfX2NwdV9zdXNwZW5kKGludCwgbG9uZywgdW5zaWduZWQgbG9uZywKKwkJCQkgaW50ICgqKSh1bnNpZ25lZCBsb25nKSk7CisJaW50IHJldCA9IF9fY3B1X3N1c3BlbmQoMCwgUEhZU19PRkZTRVQgLSBQQUdFX09GRlNFVCwgYXJnLCBmbik7CisJZmx1c2hfdGxiX2FsbCgpOworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGNtLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS90Y20uaAppbmRleCA1OTI5ZWY1Li44NTc4ZDcyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS90Y20uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS90Y20uaApAQCAtMjcsNSArMjcsNyBAQAogCiB2b2lkICp0Y21fYWxsb2Moc2l6ZV90IGxlbik7CiB2b2lkIHRjbV9mcmVlKHZvaWQgKmFkZHIsIHNpemVfdCBsZW4pOworYm9vbCB0Y21fZHRjbV9wcmVzZW50KHZvaWQpOworYm9vbCB0Y21faXRjbV9wcmVzZW50KHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCmluZGV4IGQyMDA1ZGUuLjgwNzcxNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGxiZmx1c2guaApAQCAtMzQsMTYgKzM0LDEyIEBACiAjZGVmaW5lIFRMQl9WNl9EX0FTSUQJKDEgPDwgMTcpCiAjZGVmaW5lIFRMQl9WNl9JX0FTSUQJKDEgPDwgMTgpCiAKLSNkZWZpbmUgVExCX0JUQgkJKDEgPDwgMjgpCi0KIC8qIFVuaWZpZWQgSW5uZXIgU2hhcmVhYmxlIFRMQiBvcGVyYXRpb25zIChBUk12NyBNUCBleHRlbnNpb25zKSAqLwogI2RlZmluZSBUTEJfVjdfVUlTX1BBR0UJKDEgPDwgMTkpCiAjZGVmaW5lIFRMQl9WN19VSVNfRlVMTCAoMSA8PCAyMCkKICNkZWZpbmUgVExCX1Y3X1VJU19BU0lEICgxIDw8IDIxKQogCi0vKiBJbm5lciBTaGFyZWFibGUgQlRCIG9wZXJhdGlvbiAoQVJNdjcgTVAgZXh0ZW5zaW9ucykgKi8KLSNkZWZpbmUgVExCX1Y3X0lTX0JUQgkoMSA8PCAyMikKLQorI2RlZmluZSBUTEJfQkFSUklFUgkoMSA8PCAyOCkKICNkZWZpbmUgVExCX0wyQ0xFQU5fRlIJKDEgPDwgMjkpCQkvKiBGZXJvY2VvbiAqLwogI2RlZmluZSBUTEJfRENMRUFOCSgxIDw8IDMwKQogI2RlZmluZSBUTEJfV0IJCSgxIDw8IDMxKQpAQCAtNTgsNyArNTQsNyBAQAogICoJICB2NHdiICAtIEFSTXY0IHdpdGggd3JpdGUgYnVmZmVyIHdpdGhvdXQgSSBUTEIgZmx1c2ggZW50cnkgaW5zdHJ1Y3Rpb24KICAqCSAgdjR3YmkgLSBBUk12NCB3aXRoIHdyaXRlIGJ1ZmZlciB3aXRoIEkgVExCIGZsdXNoIGVudHJ5IGluc3RydWN0aW9uCiAgKgkgIGZyICAgIC0gRmVyb2Nlb24gKHY0d2JpIHdpdGggbm9uLW91dGVyLWNhY2hlYWJsZSBwYWdlIHRhYmxlIHdhbGtzKQotICoJICBmYSAgICAtIEZhcmFkYXkgKHY0IHdpdGggd3JpdGUgYnVmZmVyIHdpdGggVVRMQiBhbmQgYnJhbmNoIHRhcmdldCBidWZmZXIgKEJUQikpCisgKgkgIGZhICAgIC0gRmFyYWRheSAodjQgd2l0aCB3cml0ZSBidWZmZXIgd2l0aCBVVExCKQogICoJICB2NndiaSAtIEFSTXY2IHdpdGggd3JpdGUgYnVmZmVyIHdpdGggSSBUTEIgZmx1c2ggZW50cnkgaW5zdHJ1Y3Rpb24KICAqCSAgdjd3YmkgLSBpZGVudGljYWwgdG8gdjZ3YmkKICAqLwpAQCAtOTksNyArOTUsNyBAQAogIyBkZWZpbmUgdjRfYWx3YXlzX2ZsYWdzCSgtMVVMKQogI2VuZGlmCiAKLSNkZWZpbmUgZmFfdGxiX2ZsYWdzCShUTEJfV0IgfCBUTEJfQlRCIHwgVExCX0RDTEVBTiB8IFwKKyNkZWZpbmUgZmFfdGxiX2ZsYWdzCShUTEJfV0IgfCBUTEJfRENMRUFOIHwgVExCX0JBUlJJRVIgfCBcCiAJCQkgVExCX1Y0X1VfRlVMTCB8IFRMQl9WNF9VX1BBR0UpCiAKICNpZmRlZiBDT05GSUdfQ1BVX1RMQl9GQQpAQCAtMTY2LDcgKzE2Miw3IEBACiAjIGRlZmluZSB2NHdiX2Fsd2F5c19mbGFncwkoLTFVTCkKICNlbmRpZgogCi0jZGVmaW5lIHY2d2JpX3RsYl9mbGFncyAoVExCX1dCIHwgVExCX0RDTEVBTiB8IFRMQl9CVEIgfCBcCisjZGVmaW5lIHY2d2JpX3RsYl9mbGFncyAoVExCX1dCIHwgVExCX0RDTEVBTiB8IFRMQl9CQVJSSUVSIHwgXAogCQkJIFRMQl9WNl9JX0ZVTEwgfCBUTEJfVjZfRF9GVUxMIHwgXAogCQkJIFRMQl9WNl9JX1BBR0UgfCBUTEJfVjZfRF9QQUdFIHwgXAogCQkJIFRMQl9WNl9JX0FTSUQgfCBUTEJfVjZfRF9BU0lEKQpAQCAtMTg0LDkgKzE4MCw5IEBACiAjIGRlZmluZSB2NndiaV9hbHdheXNfZmxhZ3MJKC0xVUwpCiAjZW5kaWYKIAotI2RlZmluZSB2N3diaV90bGJfZmxhZ3Nfc21wCShUTEJfV0IgfCBUTEJfRENMRUFOIHwgVExCX1Y3X0lTX0JUQiB8IFwKKyNkZWZpbmUgdjd3YmlfdGxiX2ZsYWdzX3NtcAkoVExCX1dCIHwgVExCX0RDTEVBTiB8IFRMQl9CQVJSSUVSIHwgXAogCQkJIFRMQl9WN19VSVNfRlVMTCB8IFRMQl9WN19VSVNfUEFHRSB8IFRMQl9WN19VSVNfQVNJRCkKLSNkZWZpbmUgdjd3YmlfdGxiX2ZsYWdzX3VwCShUTEJfV0IgfCBUTEJfRENMRUFOIHwgVExCX0JUQiB8IFwKKyNkZWZpbmUgdjd3YmlfdGxiX2ZsYWdzX3VwCShUTEJfV0IgfCBUTEJfRENMRUFOIHwgVExCX0JBUlJJRVIgfCBcCiAJCQkgVExCX1Y2X1VfRlVMTCB8IFRMQl9WNl9VX1BBR0UgfCBUTEJfVjZfVV9BU0lEKQogCiAjaWZkZWYgQ09ORklHX0NQVV9UTEJfVjcKQEAgLTM0MSwxNSArMzM3LDcgQEAKIAlpZiAodGxiX2ZsYWcoVExCX1Y3X1VJU19GVUxMKSkKIAkJYXNtKCJtY3IgcDE1LCAwLCAlMCwgYzgsIGMzLCAwIiA6IDogInIiICh6ZXJvKSA6ICJjYyIpOwogCi0JaWYgKHRsYl9mbGFnKFRMQl9CVEIpKSB7Ci0JCS8qIGZsdXNoIHRoZSBicmFuY2ggdGFyZ2V0IGNhY2hlICovCi0JCWFzbSgibWNyIHAxNSwgMCwgJTAsIGM3LCBjNSwgNiIgOiA6ICJyIiAoemVybykgOiAiY2MiKTsKLQkJZHNiKCk7Ci0JCWlzYigpOwotCX0KLQlpZiAodGxiX2ZsYWcoVExCX1Y3X0lTX0JUQikpIHsKLQkJLyogZmx1c2ggdGhlIGJyYW5jaCB0YXJnZXQgY2FjaGUgKi8KLQkJYXNtKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGMxLCA2IiA6IDogInIiICh6ZXJvKSA6ICJjYyIpOworCWlmICh0bGJfZmxhZyhUTEJfQkFSUklFUikpIHsKIAkJZHNiKCk7CiAJCWlzYigpOwogCX0KQEAgLTM4OSwxNyArMzc3LDggQEAKIAkJYXNtKCJtY3IgcDE1LCAwLCAlMCwgYzgsIGMzLCAyIiA6IDogInIiIChhc2lkKSA6ICJjYyIpOwogI2VuZGlmCiAKLQlpZiAodGxiX2ZsYWcoVExCX0JUQikpIHsKLQkJLyogZmx1c2ggdGhlIGJyYW5jaCB0YXJnZXQgY2FjaGUgKi8KLQkJYXNtKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGM1LCA2IiA6IDogInIiICh6ZXJvKSA6ICJjYyIpOworCWlmICh0bGJfZmxhZyhUTEJfQkFSUklFUikpCiAJCWRzYigpOwotCX0KLQlpZiAodGxiX2ZsYWcoVExCX1Y3X0lTX0JUQikpIHsKLQkJLyogZmx1c2ggdGhlIGJyYW5jaCB0YXJnZXQgY2FjaGUgKi8KLQkJYXNtKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGMxLCA2IiA6IDogInIiICh6ZXJvKSA6ICJjYyIpOwotCQlkc2IoKTsKLQkJaXNiKCk7Ci0JfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTQzOSwxNyArNDE4LDggQEAKIAkJYXNtKCJtY3IgcDE1LCAwLCAlMCwgYzgsIGMzLCAxIiA6IDogInIiICh1YWRkcikgOiAiY2MiKTsKICNlbmRpZgogCi0JaWYgKHRsYl9mbGFnKFRMQl9CVEIpKSB7Ci0JCS8qIGZsdXNoIHRoZSBicmFuY2ggdGFyZ2V0IGNhY2hlICovCi0JCWFzbSgibWNyIHAxNSwgMCwgJTAsIGM3LCBjNSwgNiIgOiA6ICJyIiAoemVybykgOiAiY2MiKTsKKwlpZiAodGxiX2ZsYWcoVExCX0JBUlJJRVIpKQogCQlkc2IoKTsKLQl9Ci0JaWYgKHRsYl9mbGFnKFRMQl9WN19JU19CVEIpKSB7Ci0JCS8qIGZsdXNoIHRoZSBicmFuY2ggdGFyZ2V0IGNhY2hlICovCi0JCWFzbSgibWNyIHAxNSwgMCwgJTAsIGM3LCBjMSwgNiIgOiA6ICJyIiAoemVybykgOiAiY2MiKTsKLQkJZHNiKCk7Ci0JCWlzYigpOwotCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9rZXJuZWxfcGFnZSh1bnNpZ25lZCBsb25nIGthZGRyKQpAQCAtNDgyLDE1ICs0NTIsNyBAQAogCWlmICh0bGJfZmxhZyhUTEJfVjdfVUlTX1BBR0UpKQogCQlhc20oIm1jciBwMTUsIDAsICUwLCBjOCwgYzMsIDEiIDogOiAiciIgKGthZGRyKSA6ICJjYyIpOwogCi0JaWYgKHRsYl9mbGFnKFRMQl9CVEIpKSB7Ci0JCS8qIGZsdXNoIHRoZSBicmFuY2ggdGFyZ2V0IGNhY2hlICovCi0JCWFzbSgibWNyIHAxNSwgMCwgJTAsIGM3LCBjNSwgNiIgOiA6ICJyIiAoemVybykgOiAiY2MiKTsKLQkJZHNiKCk7Ci0JCWlzYigpOwotCX0KLQlpZiAodGxiX2ZsYWcoVExCX1Y3X0lTX0JUQikpIHsKLQkJLyogZmx1c2ggdGhlIGJyYW5jaCB0YXJnZXQgY2FjaGUgKi8KLQkJYXNtKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGMxLCA2IiA6IDogInIiICh6ZXJvKSA6ICJjYyIpOworCWlmICh0bGJfZmxhZyhUTEJfQkFSUklFUikpIHsKIAkJZHNiKCk7CiAJCWlzYigpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RyYXBzLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS90cmFwcy5oCmluZGV4IGY5MDc1NmQuLjViMjlhNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RyYXBzLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdHJhcHMuaApAQCAtMyw2ICszLDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAorc3RydWN0IHB0X3JlZ3M7CitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CisKIHN0cnVjdCB1bmRlZl9ob29rIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiAJdTMyIGluc3RyX21hc2s7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUKaW5kZXggYTViMzFhZi4uZjc4ODdkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZQpAQCAtMzcsNyArMzcsMTIgQEAKIG9iai0kKENPTkZJR19EWU5BTUlDX0ZUUkFDRSkJKz0gZnRyYWNlLm8KIG9iai0kKENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIpCSs9IGZ0cmFjZS5vCiBvYmotJChDT05GSUdfS0VYRUMpCQkrPSBtYWNoaW5lX2tleGVjLm8gcmVsb2NhdGVfa2VybmVsLm8KLW9iai0kKENPTkZJR19LUFJPQkVTKQkJKz0ga3Byb2Jlcy5vIGtwcm9iZXMtZGVjb2RlLm8KK29iai0kKENPTkZJR19LUFJPQkVTKQkJKz0ga3Byb2Jlcy5vIGtwcm9iZXMtY29tbW9uLm8KK2lmZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCitvYmotJChDT05GSUdfS1BST0JFUykJCSs9IGtwcm9iZXMtdGh1bWIubworZWxzZQorb2JqLSQoQ09ORklHX0tQUk9CRVMpCQkrPSBrcHJvYmVzLWFybS5vCitlbmRpZgogb2JqLSQoQ09ORklHX0FUQUdTX1BST0MpCSs9IGF0YWdzLm8KIG9iai0kKENPTkZJR19PQUJJX0NPTVBBVCkJKz0gc3lzX29hYmktY29tcGF0Lm8KIG9iai0kKENPTkZJR19BUk1fVEhVTUJFRSkJKz0gdGh1bWJlZS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvYXJtL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDkyNzUyMmMuLjE2YmFiYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC01OSw2ICs1OSw5IEBACiAgIERFRklORShUSV9UUF9WQUxVRSwJCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdHBfdmFsdWUpKTsKICAgREVGSU5FKFRJX0ZQU1RBVEUsCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGZwc3RhdGUpKTsKICAgREVGSU5FKFRJX1ZGUFNUQVRFLAkJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCB2ZnBzdGF0ZSkpOworI2lmZGVmIENPTkZJR19TTVAKKyAgREVGSU5FKFZGUF9DUFUsCQlvZmZzZXRvZih1bmlvbiB2ZnBfc3RhdGUsIGhhcmQuY3B1KSk7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfQVJNX1RIVU1CRUUKICAgREVGSU5FKFRJX1RIVU1CRUVfU1RBVEUsCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdGh1bWJlZV9zdGF0ZSkpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jIGIvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYwppbmRleCBhNzAxZTQyLi4wY2RkN2I0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMKQEAgLTc2LDYgKzc2LDkgQEAKIAl1bnNpZ25lZCBsb25nIGR0X3Jvb3Q7CiAJY29uc3QgY2hhciAqbW9kZWw7CiAKKwlpZiAoIWR0X3BoeXMpCisJCXJldHVybiBOVUxMOworCiAJZGV2dHJlZSA9IHBoeXNfdG9fdmlydChkdF9waHlzKTsKIAogCS8qIGNoZWNrIGRldmljZSB0cmVlIHZhbGlkaXR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwppbmRleCBlOGQ4ODU2Li5hODdjYmY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKQEAgLTI5LDIxICsyOSw1MyBAQAogI2luY2x1ZGUgPGFzbS9lbnRyeS1tYWNyby1tdWx0aS5TPgogCiAvKgotICogSW50ZXJydXB0IGhhbmRsaW5nLiAgUHJlc2VydmVzIHI3LCByOCwgcjkKKyAqIEludGVycnVwdCBoYW5kbGluZy4KICAqLwogCS5tYWNybwlpcnFfaGFuZGxlcgogI2lmZGVmIENPTkZJR19NVUxUSV9JUlFfSEFORExFUgotCWxkcglyNSwgPWhhbmRsZV9hcmNoX2lycQorCWxkcglyMSwgPWhhbmRsZV9hcmNoX2lycQogCW1vdglyMCwgc3AKLQlsZHIJcjUsIFtyNV0KKwlsZHIJcjEsIFtyMV0KIAlhZHIJbHIsIEJTWU0oOTk5N2YpCi0JdGVxCXI1LCAjMAotCW1vdm5lCXBjLCByNQorCXRlcQlyMSwgIzAKKwltb3ZuZQlwYywgcjEKICNlbmRpZgogCWFyY2hfaXJxX2hhbmRsZXJfZGVmYXVsdAogOTk5NzoKIAkuZW5kbQogCisJLm1hY3JvCXBhYnRfaGVscGVyCisJQCBQQUJPUlQgaGFuZGxlciB0YWtlcyBwdF9yZWdzIGluIHIyLCBmYXVsdCBhZGRyZXNzIGluIHI0IGFuZCBwc3IgaW4gcjUKKyNpZmRlZiBNVUxUSV9QQUJPUlQKKwlsZHIJaXAsIC5MQ3Byb2NmbnMKKwltb3YJbHIsIHBjCisJbGRyCXBjLCBbaXAsICNQUk9DRVNTT1JfUEFCVF9GVU5DXQorI2Vsc2UKKwlibAlDUFVfUEFCT1JUX0hBTkRMRVIKKyNlbmRpZgorCS5lbmRtCisKKwkubWFjcm8JZGFidF9oZWxwZXIKKworCUAKKwlAIENhbGwgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBhYm9ydCBoYW5kbGVyOgorCUAKKwlAICByMiAtIHB0X3JlZ3MKKwlAICByNCAtIGFib3J0ZWQgY29udGV4dCBwYworCUAgIHI1IC0gYWJvcnRlZCBjb250ZXh0IHBzcgorCUAKKwlAIFRoZSBhYm9ydCBoYW5kbGVyIG11c3QgcmV0dXJuIHRoZSBhYm9ydGVkIGFkZHJlc3MgaW4gcjAsIGFuZAorCUAgdGhlIGZhdWx0IHN0YXR1cyByZWdpc3RlciBpbiByMS4gIHI5IG11c3QgYmUgcHJlc2VydmVkLgorCUAKKyNpZmRlZiBNVUxUSV9EQUJPUlQKKwlsZHIJaXAsIC5MQ3Byb2NmbnMKKwltb3YJbHIsIHBjCisJbGRyCXBjLCBbaXAsICNQUk9DRVNTT1JfREFCVF9GVU5DXQorI2Vsc2UKKwlibAlDUFVfREFCT1JUX0hBTkRMRVIKKyNlbmRpZgorCS5lbmRtCisKICNpZmRlZiBDT05GSUdfS1BST0JFUwogCS5zZWN0aW9uCS5rcHJvYmVzLnRleHQsImF4IiwlcHJvZ2JpdHMKICNlbHNlCkBAIC0xMjYsMTA2ICsxNTgsNzQgQEAKICBTUEZJWCgJc3ViZXEJc3AsIHNwLCAjNAkpCiAJc3RtaWEJc3AsIHtyMSAtIHIxMn0KIAotCWxkbWlhCXIwLCB7cjEgLSByM30KLQlhZGQJcjUsIHNwLCAjU19TUCAtIDQJQCBoZXJlIGZvciBpbnRlcmxvY2sgYXZvaWRhbmNlCi0JbW92CXI0LCAjLTEJCQlAICAiIiAgIiIgICAgICAiIiAgICAgICAiIgotCWFkZAlyMCwgc3AsICMoU19GUkFNRV9TSVpFICsgXHN0YWNrX2hvbGUgLSA0KQotIFNQRklYKAlhZGRlcQlyMCwgcjAsICM0CSkKLQlzdHIJcjEsIFtzcCwgIy00XSEJCUAgc2F2ZSB0aGUgInJlYWwiIHIwIGNvcGllZAorCWxkbWlhCXIwLCB7cjMgLSByNX0KKwlhZGQJcjcsIHNwLCAjU19TUCAtIDQJQCBoZXJlIGZvciBpbnRlcmxvY2sgYXZvaWRhbmNlCisJbW92CXI2LCAjLTEJCQlAICAiIiAgIiIgICAgICAiIiAgICAgICAiIgorCWFkZAlyMiwgc3AsICMoU19GUkFNRV9TSVpFICsgXHN0YWNrX2hvbGUgLSA0KQorIFNQRklYKAlhZGRlcQlyMiwgcjIsICM0CSkKKwlzdHIJcjMsIFtzcCwgIy00XSEJCUAgc2F2ZSB0aGUgInJlYWwiIHIwIGNvcGllZAogCQkJCQlAIGZyb20gdGhlIGV4Y2VwdGlvbiBzdGFjawogCi0JbW92CXIxLCBscgorCW1vdglyMywgbHIKIAogCUAKIAlAIFdlIGFyZSBub3cgcmVhZHkgdG8gZmlsbCBpbiB0aGUgcmVtYWluaW5nIGJsYW5rcyBvbiB0aGUgc3RhY2s6CiAJQAotCUAgIHIwIC0gc3Bfc3ZjCi0JQCAgcjEgLSBscl9zdmMKLQlAICByMiAtIGxyXzxleGNlcHRpb24+LCBhbHJlYWR5IGZpeGVkIHVwIGZvciBjb3JyZWN0IHJldHVybi9yZXN0YXJ0Ci0JQCAgcjMgLSBzcHNyXzxleGNlcHRpb24+Ci0JQCAgcjQgLSBvcmlnX3IwIChzZWUgcHRfcmVncyBkZWZpbml0aW9uIGluIHB0cmFjZS5oKQorCUAgIHIyIC0gc3Bfc3ZjCisJQCAgcjMgLSBscl9zdmMKKwlAICByNCAtIGxyXzxleGNlcHRpb24+LCBhbHJlYWR5IGZpeGVkIHVwIGZvciBjb3JyZWN0IHJldHVybi9yZXN0YXJ0CisJQCAgcjUgLSBzcHNyXzxleGNlcHRpb24+CisJQCAgcjYgLSBvcmlnX3IwIChzZWUgcHRfcmVncyBkZWZpbml0aW9uIGluIHB0cmFjZS5oKQogCUAKLQlzdG1pYQlyNSwge3IwIC0gcjR9CisJc3RtaWEJcjcsIHtyMiAtIHI2fQorCisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCisJYmwJdHJhY2VfaGFyZGlycXNfb2ZmCisjZW5kaWYKIAkuZW5kbQogCiAJLmFsaWduCTUKIF9fZGFidF9zdmM6CiAJc3ZjX2VudHJ5Ci0KLQlACi0JQCBnZXQgcmVhZHkgdG8gcmUtZW5hYmxlIGludGVycnVwdHMgaWYgYXBwcm9wcmlhdGUKLQlACi0JbXJzCXI5LCBjcHNyCi0JdHN0CXIzLCAjUFNSX0lfQklUCi0JYmljZXEJcjksIHI5LCAjUFNSX0lfQklUCi0KLQlACi0JQCBDYWxsIHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgYWJvcnQgaGFuZGxlcjoKLQlACi0JQCAgcjIgLSBhYm9ydGVkIGNvbnRleHQgcGMKLQlAICByMyAtIGFib3J0ZWQgY29udGV4dCBjcHNyCi0JQAotCUAgVGhlIGFib3J0IGhhbmRsZXIgbXVzdCByZXR1cm4gdGhlIGFib3J0ZWQgYWRkcmVzcyBpbiByMCwgYW5kCi0JQCB0aGUgZmF1bHQgc3RhdHVzIHJlZ2lzdGVyIGluIHIxLiAgcjkgbXVzdCBiZSBwcmVzZXJ2ZWQuCi0JQAotI2lmZGVmIE1VTFRJX0RBQk9SVAotCWxkcglyNCwgLkxDcHJvY2ZucwotCW1vdglsciwgcGMKLQlsZHIJcGMsIFtyNCwgI1BST0NFU1NPUl9EQUJUX0ZVTkNdCi0jZWxzZQotCWJsCUNQVV9EQUJPUlRfSEFORExFUgotI2VuZGlmCi0KLQlACi0JQCBzZXQgZGVzaXJlZCBJUlEgc3RhdGUsIHRoZW4gY2FsbCBtYWluIGhhbmRsZXIKLQlACi0JZGVidWdfZW50cnkgcjEKLQltc3IJY3Bzcl9jLCByOQogCW1vdglyMiwgc3AKLQlibAlkb19EYXRhQWJvcnQKKwlkYWJ0X2hlbHBlcgogCiAJQAogCUAgSVJRcyBvZmYgYWdhaW4gYmVmb3JlIHB1bGxpbmcgcHJlc2VydmVkIGRhdGEgb2ZmIHRoZSBzdGFjawogCUAKIAlkaXNhYmxlX2lycV9ub3RyYWNlCiAKLQlACi0JQCByZXN0b3JlIFNQU1IgYW5kIHJlc3RhcnQgdGhlIGluc3RydWN0aW9uCi0JQAotCWxkcglyMiwgW3NwLCAjU19QU1JdCi0Jc3ZjX2V4aXQgcjIJCQkJQCByZXR1cm4gZnJvbSBleGNlcHRpb24KKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwl0c3QJcjUsICNQU1JfSV9CSVQKKwlibGVxCXRyYWNlX2hhcmRpcnFzX29uCisJdHN0CXI1LCAjUFNSX0lfQklUCisJYmxuZQl0cmFjZV9oYXJkaXJxc19vZmYKKyNlbmRpZgorCXN2Y19leGl0IHI1CQkJCUAgcmV0dXJuIGZyb20gZXhjZXB0aW9uCiAgVU5XSU5EKC5mbmVuZAkJKQogRU5EUFJPQyhfX2RhYnRfc3ZjKQogCiAJLmFsaWduCTUKIF9faXJxX3N2YzoKIAlzdmNfZW50cnkKKwlpcnFfaGFuZGxlcgogCi0jaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCi0JYmwJdHJhY2VfaGFyZGlycXNfb2ZmCi0jZW5kaWYKICNpZmRlZiBDT05GSUdfUFJFRU1QVAogCWdldF90aHJlYWRfaW5mbyB0c2sKIAlsZHIJcjgsIFt0c2ssICNUSV9QUkVFTVBUXQkJQCBnZXQgcHJlZW1wdCBjb3VudAotCWFkZAlyNywgcjgsICMxCQkJQCBpbmNyZW1lbnQgaXQKLQlzdHIJcjcsIFt0c2ssICNUSV9QUkVFTVBUXQotI2VuZGlmCi0KLQlpcnFfaGFuZGxlcgotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0Jc3RyCXI4LCBbdHNrLCAjVElfUFJFRU1QVF0JCUAgcmVzdG9yZSBwcmVlbXB0IGNvdW50CiAJbGRyCXIwLCBbdHNrLCAjVElfRkxBR1NdCQlAIGdldCBmbGFncwogCXRlcQlyOCwgIzAJCQkJQCBpZiBwcmVlbXB0IGNvdW50ICE9IDAKIAltb3ZuZQlyMCwgIzAJCQkJQCBmb3JjZSBmbGFncyB0byAwCiAJdHN0CXIwLCAjX1RJRl9ORUVEX1JFU0NIRUQKIAlibG5lCXN2Y19wcmVlbXB0CiAjZW5kaWYKLQlsZHIJcjQsIFtzcCwgI1NfUFNSXQkJQCBpcnFzIGFyZSBhbHJlYWR5IGRpc2FibGVkCisKICNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKLQl0c3QJcjQsICNQU1JfSV9CSVQKLQlibGVxCXRyYWNlX2hhcmRpcnFzX29uCisJQCBUaGUgcGFyZW50IGNvbnRleHQgSVJRcyBtdXN0IGhhdmUgYmVlbiBlbmFibGVkIHRvIGdldCBoZXJlIGluCisJQCB0aGUgZmlyc3QgcGxhY2UsIHNvIHRoZXJlJ3Mgbm8gcG9pbnQgY2hlY2tpbmcgdGhlIFBTUiBJIGJpdC4KKwlibAl0cmFjZV9oYXJkaXJxc19vbgogI2VuZGlmCi0Jc3ZjX2V4aXQgcjQJCQkJQCByZXR1cm4gZnJvbSBleGNlcHRpb24KKwlzdmNfZXhpdCByNQkJCQlAIHJldHVybiBmcm9tIGV4Y2VwdGlvbgogIFVOV0lORCguZm5lbmQJCSkKIEVORFBST0MoX19pcnFfc3ZjKQogCkBAIC0yNTEsNyArMjUxLDYgQEAKICNlbHNlCiAJc3ZjX2VudHJ5CiAjZW5kaWYKLQogCUAKIAlAIGNhbGwgZW11bGF0aW9uIGNvZGUsIHdoaWNoIHJldHVybnMgdXNpbmcgcjkgaWYgaXQgaGFzIGVtdWxhdGVkCiAJQCB0aGUgaW5zdHJ1Y3Rpb24sIG9yIHRoZSBtb3JlIGNvbnZlbnRpb25hbCBsciBpZiB3ZSBhcmUgdG8gdHJlYXQKQEAgLTI2MCwxNSArMjU5LDE2IEBACiAJQCAgcjAgLSBpbnN0cnVjdGlvbgogCUAKICNpZm5kZWYJQ09ORklHX1RIVU1CMl9LRVJORUwKLQlsZHIJcjAsIFtyMiwgIy00XQorCWxkcglyMCwgW3I0LCAjLTRdCiAjZWxzZQotCWxkcmgJcjAsIFtyMiwgIy0yXQkJCUAgVGh1bWIgaW5zdHJ1Y3Rpb24gYXQgTFIgLSAyCisJbGRyaAlyMCwgW3I0LCAjLTJdCQkJQCBUaHVtYiBpbnN0cnVjdGlvbiBhdCBMUiAtIDIKIAlhbmQJcjksIHIwLCAjMHhmODAwCiAJY21wCXI5LCAjMHhlODAwCQkJQCAzMi1iaXQgaW5zdHJ1Y3Rpb24gaWYgeHggPj0gMAotCWxkcmhocwlyOSwgW3IyXQkJCUAgYm90dG9tIDE2IGJpdHMKKwlsZHJoaHMJcjksIFtyNF0JCQlAIGJvdHRvbSAxNiBiaXRzCiAJb3JyaHMJcjAsIHI5LCByMCwgbHNsICMxNgogI2VuZGlmCiAJYWRyCXI5LCBCU1lNKDFmKQorCW1vdglyMiwgcjQKIAlibAljYWxsX2ZwZQogCiAJbW92CXIwLCBzcAkJCQlAIHN0cnVjdCBwdF9yZWdzICpyZWdzCkBAIC0yODIsNDUgKzI4MiwzNSBAQAogCUAKIAlAIHJlc3RvcmUgU1BTUiBhbmQgcmVzdGFydCB0aGUgaW5zdHJ1Y3Rpb24KIAlACi0JbGRyCXIyLCBbc3AsICNTX1BTUl0JCUAgR2V0IFNWQyBjcHNyCi0Jc3ZjX2V4aXQgcjIJCQkJQCByZXR1cm4gZnJvbSBleGNlcHRpb24KKwlsZHIJcjUsIFtzcCwgI1NfUFNSXQkJQCBHZXQgU1ZDIGNwc3IKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwl0c3QJcjUsICNQU1JfSV9CSVQKKwlibGVxCXRyYWNlX2hhcmRpcnFzX29uCisJdHN0CXI1LCAjUFNSX0lfQklUCisJYmxuZQl0cmFjZV9oYXJkaXJxc19vZmYKKyNlbmRpZgorCXN2Y19leGl0IHI1CQkJCUAgcmV0dXJuIGZyb20gZXhjZXB0aW9uCiAgVU5XSU5EKC5mbmVuZAkJKQogRU5EUFJPQyhfX3VuZF9zdmMpCiAKIAkuYWxpZ24JNQogX19wYWJ0X3N2YzoKIAlzdmNfZW50cnkKLQotCUAKLQlAIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGlmIGFwcHJvcHJpYXRlCi0JQAotCW1ycwlyOSwgY3BzcgotCXRzdAlyMywgI1BTUl9JX0JJVAotCWJpY2VxCXI5LCByOSwgI1BTUl9JX0JJVAotCi0JbW92CXIwLCByMgkJCUAgcGFzcyBhZGRyZXNzIG9mIGFib3J0ZWQgaW5zdHJ1Y3Rpb24uCi0jaWZkZWYgTVVMVElfUEFCT1JUCi0JbGRyCXI0LCAuTENwcm9jZm5zCi0JbW92CWxyLCBwYwotCWxkcglwYywgW3I0LCAjUFJPQ0VTU09SX1BBQlRfRlVOQ10KLSNlbHNlCi0JYmwJQ1BVX1BBQk9SVF9IQU5ETEVSCi0jZW5kaWYKLQlkZWJ1Z19lbnRyeSByMQotCW1zcgljcHNyX2MsIHI5CQkJQCBNYXliZSBlbmFibGUgaW50ZXJydXB0cwogCW1vdglyMiwgc3AJCQkJQCByZWdzCi0JYmwJZG9fUHJlZmV0Y2hBYm9ydAkJQCBjYWxsIGFib3J0IGhhbmRsZXIKKwlwYWJ0X2hlbHBlcgogCiAJQAogCUAgSVJRcyBvZmYgYWdhaW4gYmVmb3JlIHB1bGxpbmcgcHJlc2VydmVkIGRhdGEgb2ZmIHRoZSBzdGFjawogCUAKIAlkaXNhYmxlX2lycV9ub3RyYWNlCiAKLQlACi0JQCByZXN0b3JlIFNQU1IgYW5kIHJlc3RhcnQgdGhlIGluc3RydWN0aW9uCi0JQAotCWxkcglyMiwgW3NwLCAjU19QU1JdCi0Jc3ZjX2V4aXQgcjIJCQkJQCByZXR1cm4gZnJvbSBleGNlcHRpb24KKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwl0c3QJcjUsICNQU1JfSV9CSVQKKwlibGVxCXRyYWNlX2hhcmRpcnFzX29uCisJdHN0CXI1LCAjUFNSX0lfQklUCisJYmxuZQl0cmFjZV9oYXJkaXJxc19vZmYKKyNlbmRpZgorCXN2Y19leGl0IHI1CQkJCUAgcmV0dXJuIGZyb20gZXhjZXB0aW9uCiAgVU5XSU5EKC5mbmVuZAkJKQogRU5EUFJPQyhfX3BhYnRfc3ZjKQogCkBAIC0zNTEsMjMgKzM0MSwyMyBAQAogIEFSTSgJc3RtaWIJc3AsIHtyMSAtIHIxMn0JKQogIFRIVU1CKAlzdG1pYQlzcCwge3IwIC0gcjEyfQkpCiAKLQlsZG1pYQlyMCwge3IxIC0gcjN9CisJbGRtaWEJcjAsIHtyMyAtIHI1fQogCWFkZAlyMCwgc3AsICNTX1BDCQlAIGhlcmUgZm9yIGludGVybG9jayBhdm9pZGFuY2UKLQltb3YJcjQsICMtMQkJCUAgICIiICAiIiAgICAgIiIgICAgICAgICIiCisJbW92CXI2LCAjLTEJCQlAICAiIiAgIiIgICAgICIiICAgICAgICAiIgogCi0Jc3RyCXIxLCBbc3BdCQlAIHNhdmUgdGhlICJyZWFsIiByMCBjb3BpZWQKKwlzdHIJcjMsIFtzcF0JCUAgc2F2ZSB0aGUgInJlYWwiIHIwIGNvcGllZAogCQkJCQlAIGZyb20gdGhlIGV4Y2VwdGlvbiBzdGFjawogCiAJQAogCUAgV2UgYXJlIG5vdyByZWFkeSB0byBmaWxsIGluIHRoZSByZW1haW5pbmcgYmxhbmtzIG9uIHRoZSBzdGFjazoKIAlACi0JQCAgcjIgLSBscl88ZXhjZXB0aW9uPiwgYWxyZWFkeSBmaXhlZCB1cCBmb3IgY29ycmVjdCByZXR1cm4vcmVzdGFydAotCUAgIHIzIC0gc3Bzcl88ZXhjZXB0aW9uPgotCUAgIHI0IC0gb3JpZ19yMCAoc2VlIHB0X3JlZ3MgZGVmaW5pdGlvbiBpbiBwdHJhY2UuaCkKKwlAICByNCAtIGxyXzxleGNlcHRpb24+LCBhbHJlYWR5IGZpeGVkIHVwIGZvciBjb3JyZWN0IHJldHVybi9yZXN0YXJ0CisJQCAgcjUgLSBzcHNyXzxleGNlcHRpb24+CisJQCAgcjYgLSBvcmlnX3IwIChzZWUgcHRfcmVncyBkZWZpbml0aW9uIGluIHB0cmFjZS5oKQogCUAKIAlAIEFsc28sIHNlcGFyYXRlbHkgc2F2ZSBzcF91c3IgYW5kIGxyX3VzcgogCUAKLQlzdG1pYQlyMCwge3IyIC0gcjR9CisJc3RtaWEJcjAsIHtyNCAtIHI2fQogIEFSTSgJc3RtZGIJcjAsIHtzcCwgbHJ9XgkJCSkKICBUSFVNQigJc3RvcmVfdXNlcl9zcF9sciByMCwgcjEsIFNfU1AgLSBTX1BDCSkKIApAQCAtMzgwLDEwICszNzAsMTQgQEAKIAlAIENsZWFyIEZQIHRvIG1hcmsgdGhlIGZpcnN0IHN0YWNrIGZyYW1lCiAJQAogCXplcm9fZnAKKworI2lmZGVmIENPTkZJR19JUlFTT0ZGX1RSQUNFUgorCWJsCXRyYWNlX2hhcmRpcnFzX29mZgorI2VuZGlmCiAJLmVuZG0KIAogCS5tYWNybwlrdXNlcl9jbXB4Y2hnX2NoZWNrCi0jaWYgX19MSU5VWF9BUk1fQVJDSF9fIDwgNiAmJiAhZGVmaW5lZChDT05GSUdfTkVFRFNfU1lTQ0FMTF9GT1JfQ01QWENIRykKKyNpZiAhZGVmaW5lZChDT05GSUdfQ1BVXzMydjZLKSAmJiAhZGVmaW5lZChDT05GSUdfTkVFRFNfU1lTQ0FMTF9GT1JfQ01QWENIRykKICNpZm5kZWYgQ09ORklHX01NVQogI3dhcm5pbmcgIk5QVEwgb24gbm9uIE1NVSBuZWVkcyBmaXhpbmciCiAjZWxzZQpAQCAtMzkxLDggKzM4NSw4IEBACiAJQCBpZiBpdCB3YXMgaW50ZXJydXB0ZWQgaW4gYSBjcml0aWNhbCByZWdpb24uICBIZXJlIHdlCiAJQCBwZXJmb3JtIGEgcXVpY2sgdGVzdCBpbmxpbmUgc2luY2UgaXQgc2hvdWxkIGJlIGZhbHNlCiAJQCA5OS45OTk5JSBvZiB0aGUgdGltZS4gIFRoZSByZXN0IGlzIGRvbmUgb3V0IG9mIGxpbmUuCi0JY21wCXIyLCAjVEFTS19TSVpFCi0JYmxocwlrdXNlcl9jbXB4Y2hnX2ZpeHVwCisJY21wCXI0LCAjVEFTS19TSVpFCisJYmxocwlrdXNlcl9jbXB4Y2hnNjRfZml4dXAKICNlbmRpZgogI2VuZGlmCiAJLmVuZG0KQEAgLTQwMSwzMiArMzk1LDkgQEAKIF9fZGFidF91c3I6CiAJdXNyX2VudHJ5CiAJa3VzZXJfY21weGNoZ19jaGVjawotCi0JQAotCUAgQ2FsbCB0aGUgcHJvY2Vzc29yLXNwZWNpZmljIGFib3J0IGhhbmRsZXI6Ci0JQAotCUAgIHIyIC0gYWJvcnRlZCBjb250ZXh0IHBjCi0JQCAgcjMgLSBhYm9ydGVkIGNvbnRleHQgY3BzcgotCUAKLQlAIFRoZSBhYm9ydCBoYW5kbGVyIG11c3QgcmV0dXJuIHRoZSBhYm9ydGVkIGFkZHJlc3MgaW4gcjAsIGFuZAotCUAgdGhlIGZhdWx0IHN0YXR1cyByZWdpc3RlciBpbiByMS4KLQlACi0jaWZkZWYgTVVMVElfREFCT1JUCi0JbGRyCXI0LCAuTENwcm9jZm5zCi0JbW92CWxyLCBwYwotCWxkcglwYywgW3I0LCAjUFJPQ0VTU09SX0RBQlRfRlVOQ10KLSNlbHNlCi0JYmwJQ1BVX0RBQk9SVF9IQU5ETEVSCi0jZW5kaWYKLQotCUAKLQlAIElSUXMgb24sIHRoZW4gY2FsbCB0aGUgbWFpbiBoYW5kbGVyCi0JQAotCWRlYnVnX2VudHJ5IHIxCi0JZW5hYmxlX2lycQogCW1vdglyMiwgc3AKLQlhZHIJbHIsIEJTWU0ocmV0X2Zyb21fZXhjZXB0aW9uKQotCWIJZG9fRGF0YUFib3J0CisJZGFidF9oZWxwZXIKKwliCXJldF9mcm9tX2V4Y2VwdGlvbgogIFVOV0lORCguZm5lbmQJCSkKIEVORFBST0MoX19kYWJ0X3VzcikKIApAQCAtNDM0LDI2ICs0MDUsMTAgQEAKIF9faXJxX3VzcjoKIAl1c3JfZW50cnkKIAlrdXNlcl9jbXB4Y2hnX2NoZWNrCi0KLQlnZXRfdGhyZWFkX2luZm8gdHNrCi0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQlsZHIJcjgsIFt0c2ssICNUSV9QUkVFTVBUXQkJQCBnZXQgcHJlZW1wdCBjb3VudAotCWFkZAlyNywgcjgsICMxCQkJQCBpbmNyZW1lbnQgaXQKLQlzdHIJcjcsIFt0c2ssICNUSV9QUkVFTVBUXQotI2VuZGlmCi0KIAlpcnFfaGFuZGxlcgotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JbGRyCXIwLCBbdHNrLCAjVElfUFJFRU1QVF0KLQlzdHIJcjgsIFt0c2ssICNUSV9QUkVFTVBUXQotCXRlcQlyMCwgcjcKLSBBUk0oCXN0cm5lCXIwLCBbcjAsIC1yMF0JKQotIFRIVU1CKAltb3ZuZQlyMCwgIzAJCSkKLSBUSFVNQigJc3RybmUJcjAsIFtyMF0JKQotI2VuZGlmCi0KKwlnZXRfdGhyZWFkX2luZm8gdHNrCiAJbW92CXdoeSwgIzAKLQliCXJldF90b191c2VyCisJYglyZXRfdG9fdXNlcl9mcm9tX2lycQogIFVOV0lORCguZm5lbmQJCSkKIEVORFBST0MoX19pcnFfdXNyKQogCkBAIC00NjMsNiArNDE4LDkgQEAKIF9fdW5kX3VzcjoKIAl1c3JfZW50cnkKIAorCW1vdglyMiwgcjQKKwltb3YJcjMsIHI1CisKIAlACiAJQCBmYWxsIHRocm91Z2ggdG8gdGhlIGVtdWxhdGlvbiBjb2RlLCB3aGljaCByZXR1cm5zIHVzaW5nIHI5IGlmCiAJQCBpdCBoYXMgZW11bGF0ZWQgdGhlIGluc3RydWN0aW9uLCBvciB0aGUgbW9yZSBjb252ZW50aW9uYWwgbHIKQEAgLTY3OCwxOSArNjM2LDggQEAKIAkuYWxpZ24JNQogX19wYWJ0X3VzcjoKIAl1c3JfZW50cnkKLQotCW1vdglyMCwgcjIJCQlAIHBhc3MgYWRkcmVzcyBvZiBhYm9ydGVkIGluc3RydWN0aW9uLgotI2lmZGVmIE1VTFRJX1BBQk9SVAotCWxkcglyNCwgLkxDcHJvY2ZucwotCW1vdglsciwgcGMKLQlsZHIJcGMsIFtyNCwgI1BST0NFU1NPUl9QQUJUX0ZVTkNdCi0jZWxzZQotCWJsCUNQVV9QQUJPUlRfSEFORExFUgotI2VuZGlmCi0JZGVidWdfZW50cnkgcjEKLQllbmFibGVfaXJxCQkJCUAgRW5hYmxlIGludGVycnVwdHMKIAltb3YJcjIsIHNwCQkJCUAgcmVncwotCWJsCWRvX1ByZWZldGNoQWJvcnQJCUAgY2FsbCBhYm9ydCBoYW5kbGVyCisJcGFidF9oZWxwZXIKICBVTldJTkQoLmZuZW5kCQkpCiAJLyogZmFsbCB0aHJvdWdoICovCiAvKgpAQCAtNzU0LDMxICs3MDEsMTIgQEAKIC8qCiAgKiBVc2VyIGhlbHBlcnMuCiAgKgotICogVGhlc2UgYXJlIHNlZ21lbnQgb2Yga2VybmVsIHByb3ZpZGVkIHVzZXIgY29kZSByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlCi0gKiBhdCBhIGZpeGVkIGFkZHJlc3MgaW4ga2VybmVsIG1lbW9yeS4gIFRoaXMgaXMgdXNlZCB0byBwcm92aWRlIHVzZXIgc3BhY2UKLSAqIHdpdGggc29tZSBvcGVyYXRpb25zIHdoaWNoIHJlcXVpcmUga2VybmVsIGhlbHAgYmVjYXVzZSBvZiB1bmltcGxlbWVudGVkCi0gKiBuYXRpdmUgZmVhdHVyZSBhbmQvb3IgaW5zdHJ1Y3Rpb25zIGluIG1hbnkgQVJNIENQVXMuIFRoZSBpZGVhIGlzIGZvcgotICogdGhpcyBjb2RlIHRvIGJlIGV4ZWN1dGVkIGRpcmVjdGx5IGluIHVzZXIgbW9kZSBmb3IgYmVzdCBlZmZpY2llbmN5IGJ1dAotICogd2hpY2ggaXMgdG9vIGludGltYXRlIHdpdGggdGhlIGtlcm5lbCBjb3VudGVyIHBhcnQgdG8gYmUgbGVmdCB0byB1c2VyCi0gKiBsaWJyYXJpZXMuICBJbiBmYWN0IHRoaXMgY29kZSBtaWdodCBldmVuIGRpZmZlciBmcm9tIG9uZSBDUFUgdG8gYW5vdGhlcgotICogZGVwZW5kaW5nIG9uIHRoZSBhdmFpbGFibGUgIGluc3RydWN0aW9uIHNldCBhbmQgcmVzdHJpY3Rpb25zIGxpa2Ugb24KLSAqIFNNUCBzeXN0ZW1zLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBrZXJuZWwgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIGNoYW5nZQotICogdGhpcyBjb2RlIGFzIG5lZWRlZCB3aXRob3V0IHdhcm5pbmcuIE9ubHkgdGhlIGVudHJ5IHBvaW50cyBhbmQgdGhlaXIKLSAqIHJlc3VsdHMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3RhYmxlLgotICoKICAqIEVhY2ggc2VnbWVudCBpcyAzMi1ieXRlIGFsaWduZWQgYW5kIHdpbGwgYmUgbW92ZWQgdG8gdGhlIHRvcCBvZiB0aGUgaGlnaAogICogdmVjdG9yIHBhZ2UuICBOZXcgc2VnbWVudHMgKGlmIGV2ZXIgbmVlZGVkKSBtdXN0IGJlIGFkZGVkIGluIGZyb250IG9mCiAgKiBleGlzdGluZyBvbmVzLiAgVGhpcyBtZWNoYW5pc20gc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgdGhpbmdzIHRoYXQgYXJlCiAgKiByZWFsbHkgc21hbGwgYW5kIGp1c3RpZmllZCwgYW5kIG5vdCBiZSBhYnVzZWQgZnJlZWx5LgogICoKLSAqIFVzZXIgc3BhY2UgaXMgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IHRob3NlIHRoaW5ncyBpbmxpbmUgd2hlbiBvcHRpbWl6aW5nCi0gKiBmb3IgYSBwcm9jZXNzb3IgdGhhdCBoYXMgdGhlIG5lY2Vzc2FyeSBuYXRpdmUgc3VwcG9ydCwgYnV0IG9ubHkgaWYgc3VjaAotICogcmVzdWx0aW5nIGJpbmFyaWVzIGFyZSBhbHJlYWR5IHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgQVJNCi0gKiBwcm9jZXNzb3JzIGR1ZSB0byB0aGUgdXNlIG9mIHVuc3VwcG9ydGVkIGluc3RydWN0aW9ucyBvdGhlciB0aGFuIHdoYXQKLSAqIGlzIHByb3ZpZGVkIGhlcmUuICBJbiBvdGhlciB3b3JkcyBkb24ndCBtYWtlIGJpbmFyaWVzIHVuYWJsZSB0byBydW4gb24KLSAqIGVhcmxpZXIgcHJvY2Vzc29ycyBqdXN0IGZvciB0aGUgc2FrZSBvZiBub3QgdXNpbmcgdGhlc2Uga2VybmVsIGhlbHBlcnMKLSAqIGlmIHlvdXIgY29tcGlsZWQgY29kZSBpcyBub3QgZ29pbmcgdG8gdXNlIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zIGZvciBvdGhlcgotICogcHVycG9zZS4KKyAqIFNlZSBEb2N1bWVudGF0aW9uL2FybS9rZXJuZWxfdXNlcl9oZWxwZXJzLnR4dCBmb3IgZm9ybWFsIGRlZmluaXRpb25zLgogICovCiAgVEhVTUIoCS5hcm0JKQogCkBAIC03OTUsOTcgKzcyMywxMDQgQEAKIF9fa3VzZXJfaGVscGVyX3N0YXJ0OgogCiAvKgotICogUmVmZXJlbmNlIHByb3RvdHlwZToKLSAqCi0gKgl2b2lkIF9fa2VybmVsX21lbW9yeV9iYXJyaWVyKHZvaWQpCi0gKgotICogSW5wdXQ6Ci0gKgotICoJbHIgPSByZXR1cm4gYWRkcmVzcwotICoKLSAqIE91dHB1dDoKLSAqCi0gKglub25lCi0gKgotICogQ2xvYmJlcmVkOgotICoKLSAqCW5vbmUKLSAqCi0gKiBEZWZpbml0aW9uIGFuZCB1c2VyIHNwYWNlIHVzYWdlIGV4YW1wbGU6Ci0gKgotICoJdHlwZWRlZiB2b2lkIChfX2tlcm5lbF9kbWJfdCkodm9pZCk7Ci0gKgkjZGVmaW5lIF9fa2VybmVsX2RtYiAoKihfX2tlcm5lbF9kbWJfdCAqKTB4ZmZmZjBmYTApCi0gKgotICogQXBwbHkgYW55IG5lZWRlZCBtZW1vcnkgYmFycmllciB0byBwcmVzZXJ2ZSBjb25zaXN0ZW5jeSB3aXRoIGRhdGEgbW9kaWZpZWQKLSAqIG1hbnVhbGx5IGFuZCBfX2t1c2VyX2NtcHhjaGcgdXNhZ2UuCi0gKgotICogVGhpcyBjb3VsZCBiZSB1c2VkIGFzIGZvbGxvd3M6Ci0gKgotICogI2RlZmluZSBfX2tlcm5lbF9kbWIoKSBcCi0gKiAgICAgICAgIGFzbSB2b2xhdGlsZSAoICJtb3YgcjAsICMweGZmZmYwZmZmOyBtb3YgbHIsIHBjOyBzdWIgcGMsIHIwLCAjOTUiIFwKLSAqCSAgICAgICAgOiA6IDogInIwIiwgImxyIiwiY2MiICkKKyAqIER1ZSB0byB0aGUgbGVuZ3RoIG9mIHNvbWUgc2VxdWVuY2VzLCBfX2t1c2VyX2NtcHhjaGc2NCBzcGFucyAyIHJlZ3VsYXIKKyAqIGt1c2VyICJzbG90cyIsIHRoZXJlZm9yZSAweGZmZmYwZjgwIGlzIG5vdCB1c2VkIGFzIGEgdmFsaWQgZW50cnkgcG9pbnQuCiAgKi8KIAorX19rdXNlcl9jbXB4Y2hnNjQ6CQkJCUAgMHhmZmZmMGY2MAorCisjaWYgZGVmaW5lZChDT05GSUdfTkVFRFNfU1lTQ0FMTF9GT1JfQ01QWENIRykKKworCS8qCisJICogUG9vciB5b3UuICBObyBmYXN0IHNvbHV0aW9uIHBvc3NpYmxlLi4uCisJICogVGhlIGtlcm5lbCBpdHNlbGYgbXVzdCBwZXJmb3JtIHRoZSBvcGVyYXRpb24uCisJICogQSBzcGVjaWFsIGdob3N0IHN5c2NhbGwgaXMgdXNlZCBmb3IgdGhhdCAoc2VlIHRyYXBzLmMpLgorCSAqLworCXN0bWZkCXNwISwge3I3LCBscn0KKwlsZHIJcjcsIDFmCQkJQCBpdCdzIDIwIGJpdHMKKwlzd2kJX19BUk1fTlJfY21weGNoZzY0CisJbGRtZmQJc3AhLCB7cjcsIHBjfQorMToJLndvcmQJX19BUk1fTlJfY21weGNoZzY0CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV8zMnY2SykKKworCXN0bWZkCXNwISwge3I0LCByNSwgcjYsIHI3fQorCWxkcmQJcjQsIHI1LCBbcjBdCQkJQCBsb2FkIG9sZCB2YWwKKwlsZHJkCXI2LCByNywgW3IxXQkJCUAgbG9hZCBuZXcgdmFsCisJc21wX2RtYglhcm0KKzE6CWxkcmV4ZAlyMCwgcjEsIFtyMl0JCQlAIGxvYWQgY3VycmVudCB2YWwKKwllb3JzCXIzLCByMCwgcjQJCQlAIGNvbXBhcmUgd2l0aCBvbGR2YWwgKDEpCisJZW9yZXFzCXIzLCByMSwgcjUJCQlAIGNvbXBhcmUgd2l0aCBvbGR2YWwgKDIpCisJc3RyZXhkZXEgcjMsIHI2LCByNywgW3IyXQkJQCBzdG9yZSBuZXd2YWwgaWYgZXEKKwl0ZXFlcQlyMywgIzEJCQkJQCBzdWNjZXNzPworCWJlcQkxYgkJCQlAIGlmIG5vIHRoZW4gcmV0cnkKKwlzbXBfZG1iCWFybQorCXJzYnMJcjAsIHIzLCAjMAkJCUAgc2V0IHJldHVybmVkIHZhbCBhbmQgQyBmbGFnCisJbGRtZmQJc3AhLCB7cjQsIHI1LCByNiwgcjd9CisJYngJbHIKKworI2VsaWYgIWRlZmluZWQoQ09ORklHX1NNUCkKKworI2lmZGVmIENPTkZJR19NTVUKKworCS8qCisJICogVGhlIG9ubHkgdGhpbmcgdGhhdCBjYW4gYnJlYWsgYXRvbWljaXR5IGluIHRoaXMgY21weGNoZzY0CisJICogaW1wbGVtZW50YXRpb24gaXMgZWl0aGVyIGFuIElSUSBvciBhIGRhdGEgYWJvcnQgZXhjZXB0aW9uCisJICogY2F1c2luZyBhbm90aGVyIHByb2Nlc3MvdGhyZWFkIHRvIGJlIHNjaGVkdWxlZCBpbiB0aGUgbWlkZGxlIG9mCisJICogdGhlIGNyaXRpY2FsIHNlcXVlbmNlLiAgVGhlIHNhbWUgc3RyYXRlZ3kgYXMgZm9yIGNtcHhjaGcgaXMgdXNlZC4KKwkgKi8KKwlzdG1mZAlzcCEsIHtyNCwgcjUsIHI2LCBscn0KKwlsZG1pYQlyMCwge3I0LCByNX0JCQlAIGxvYWQgb2xkIHZhbAorCWxkbWlhCXIxLCB7cjYsIGxyfQkJCUAgbG9hZCBuZXcgdmFsCisxOglsZG1pYQlyMiwge3IwLCByMX0JCQlAIGxvYWQgY3VycmVudCB2YWwKKwllb3JzCXIzLCByMCwgcjQJCQlAIGNvbXBhcmUgd2l0aCBvbGR2YWwgKDEpCisJZW9yZXFzCXIzLCByMSwgcjUJCQlAIGNvbXBhcmUgd2l0aCBvbGR2YWwgKDIpCisyOglzdG1lcWlhCXIyLCB7cjYsIGxyfQkJCUAgc3RvcmUgbmV3dmFsIGlmIGVxCisJcnNicwlyMCwgcjMsICMwCQkJQCBzZXQgcmV0dXJuIHZhbCBhbmQgQyBmbGFnCisJbGRtZmQJc3AhLCB7cjQsIHI1LCByNiwgcGN9CisKKwkudGV4dAora3VzZXJfY21weGNoZzY0X2ZpeHVwOgorCUAgQ2FsbGVkIGZyb20ga3VzZXJfY21weGNoZ19maXh1cC4KKwlAIHI0ID0gYWRkcmVzcyBvZiBpbnRlcnJ1cHRlZCBpbnNuIChtdXN0IGJlIHByZXNlcnZlZCkuCisJQCBzcCA9IHNhdmVkIHJlZ3MuIHI3IGFuZCByOCBhcmUgY2xvYmJlcmVkLgorCUAgMWIgPSBmaXJzdCBjcml0aWNhbCBpbnNuLCAyYiA9IGxhc3QgY3JpdGljYWwgaW5zbi4KKwlAIElmIHI0ID49IDFiIGFuZCByNCA8PSAyYiB0aGVuIHNhdmVkIHBjX3VzciBpcyBzZXQgdG8gMWIuCisJbW92CXI3LCAjMHhmZmZmMGZmZgorCXN1YglyNywgcjcsICMoMHhmZmZmMGZmZiAtICgweGZmZmYwZjYwICsgKDFiIC0gX19rdXNlcl9jbXB4Y2hnNjQpKSkKKwlzdWJzCXI4LCByNCwgcjcKKwlyc2Jjc3MJcjgsIHI4LCAjKDJiIC0gMWIpCisJc3RyY3MJcjcsIFtzcCwgI1NfUENdCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fIDwgNgorCWJjYwlrdXNlcl9jbXB4Y2hnMzJfZml4dXAKKyNlbmRpZgorCW1vdglwYywgbHIKKwkucHJldmlvdXMKKworI2Vsc2UKKyN3YXJuaW5nICJOUFRMIG9uIG5vbiBNTVUgbmVlZHMgZml4aW5nIgorCW1vdglyMCwgIy0xCisJYWRkcwlyMCwgcjAsICMwCisJdXNyX3JldAlscgorI2VuZGlmCisKKyNlbHNlCisjZXJyb3IgImluY29oZXJlbnQga2VybmVsIGNvbmZpZ3VyYXRpb24iCisjZW5kaWYKKworCS8qIHBhZCB0byBuZXh0IHNsb3QgKi8KKwkucmVwdAkoMTYgLSAoLiAtIF9fa3VzZXJfY21weGNoZzY0KS80KQorCS53b3JkCTAKKwkuZW5kcgorCisJLmFsaWduCTUKKwogX19rdXNlcl9tZW1vcnlfYmFycmllcjoJCQkJQCAweGZmZmYwZmEwCiAJc21wX2RtYglhcm0KIAl1c3JfcmV0CWxyCiAKIAkuYWxpZ24JNQogCi0vKgotICogUmVmZXJlbmNlIHByb3RvdHlwZToKLSAqCi0gKglpbnQgX19rZXJuZWxfY21weGNoZyhpbnQgb2xkdmFsLCBpbnQgbmV3dmFsLCBpbnQgKnB0cikKLSAqCi0gKiBJbnB1dDoKLSAqCi0gKglyMCA9IG9sZHZhbAotICoJcjEgPSBuZXd2YWwKLSAqCXIyID0gcHRyCi0gKglsciA9IHJldHVybiBhZGRyZXNzCi0gKgotICogT3V0cHV0OgotICoKLSAqCXIwID0gcmV0dXJuZWQgdmFsdWUgKHplcm8gb3Igbm9uLXplcm8pCi0gKglDIGZsYWcgPSBzZXQgaWYgcjAgPT0gMCwgY2xlYXIgaWYgcjAgIT0gMAotICoKLSAqIENsb2JiZXJlZDoKLSAqCi0gKglyMywgaXAsIGZsYWdzCi0gKgotICogRGVmaW5pdGlvbiBhbmQgdXNlciBzcGFjZSB1c2FnZSBleGFtcGxlOgotICoKLSAqCXR5cGVkZWYgaW50IChfX2tlcm5lbF9jbXB4Y2hnX3QpKGludCBvbGR2YWwsIGludCBuZXd2YWwsIGludCAqcHRyKTsKLSAqCSNkZWZpbmUgX19rZXJuZWxfY21weGNoZyAoKihfX2tlcm5lbF9jbXB4Y2hnX3QgKikweGZmZmYwZmMwKQotICoKLSAqIEF0b21pY2FsbHkgc3RvcmUgbmV3dmFsIGluICpwdHIgaWYgKnB0ciBpcyBlcXVhbCB0byBvbGR2YWwgZm9yIHVzZXIgc3BhY2UuCi0gKiBSZXR1cm4gemVybyBpZiAqcHRyIHdhcyBjaGFuZ2VkIG9yIG5vbi16ZXJvIGlmIG5vIGV4Y2hhbmdlIGhhcHBlbmVkLgotICogVGhlIEMgZmxhZyBpcyBhbHNvIHNldCBpZiAqcHRyIHdhcyBjaGFuZ2VkIHRvIGFsbG93IGZvciBhc3NlbWJseQotICogb3B0aW1pemF0aW9uIGluIHRoZSBjYWxsaW5nIGNvZGUuCi0gKgotICogTm90ZXM6Ci0gKgotICogICAgLSBUaGlzIHJvdXRpbmUgYWxyZWFkeSBpbmNsdWRlcyBtZW1vcnkgYmFycmllcnMgYXMgbmVlZGVkLgotICoKLSAqIEZvciBleGFtcGxlLCBhIHVzZXIgc3BhY2UgYXRvbWljX2FkZCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBsb29rIGxpa2UgdGhpczoKLSAqCi0gKiAjZGVmaW5lIGF0b21pY19hZGQocHRyLCB2YWwpIFwKLSAqCSh7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCAqX19wdHIgYXNtKCJyMiIpID0gKHB0cik7IFwKLSAqCSAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBfX3Jlc3VsdCBhc20oInIxIik7IFwKLSAqCSAgIGFzbSB2b2xhdGlsZSAoIFwKLSAqCSAgICAgICAiMTogQCBhdG9taWNfYWRkXG5cdCIgXAotICoJICAgICAgICJsZHIJcjAsIFtyMl1cblx0IiBcCi0gKgkgICAgICAgIm1vdglyMywgIzB4ZmZmZjBmZmZcblx0IiBcCi0gKgkgICAgICAgImFkZAlsciwgcGMsICM0XG5cdCIgXAotICoJICAgICAgICJhZGQJcjEsIHIwLCAlMlxuXHQiIFwKLSAqCSAgICAgICAiYWRkCXBjLCByMywgIygweGZmZmYwZmMwIC0gMHhmZmZmMGZmZilcblx0IiBcCi0gKgkgICAgICAgImJjYwkxYiIgXAotICoJICAgICAgIDogIj0mciIgKF9fcmVzdWx0KSBcCi0gKgkgICAgICAgOiAiciIgKF9fcHRyKSwgInJJTCIgKHZhbCkgXAotICoJICAgICAgIDogInIwIiwicjMiLCJpcCIsImxyIiwiY2MiLCJtZW1vcnkiICk7IFwKLSAqCSAgIF9fcmVzdWx0OyB9KQotICovCi0KIF9fa3VzZXJfY21weGNoZzoJCQkJQCAweGZmZmYwZmMwCiAKICNpZiBkZWZpbmVkKENPTkZJR19ORUVEU19TWVNDQUxMX0ZPUl9DTVBYQ0hHKQpAQCAtOTIxLDE1ICs4NTYsMTUgQEAKIAl1c3JfcmV0CWxyCiAKIAkudGV4dAota3VzZXJfY21weGNoZ19maXh1cDoKK2t1c2VyX2NtcHhjaGczMl9maXh1cDoKIAlAIENhbGxlZCBmcm9tIGt1c2VyX2NtcHhjaGdfY2hlY2sgbWFjcm8uCi0JQCByMiA9IGFkZHJlc3Mgb2YgaW50ZXJydXB0ZWQgaW5zbiAobXVzdCBiZSBwcmVzZXJ2ZWQpLgorCUAgcjQgPSBhZGRyZXNzIG9mIGludGVycnVwdGVkIGluc24gKG11c3QgYmUgcHJlc2VydmVkKS4KIAlAIHNwID0gc2F2ZWQgcmVncy4gcjcgYW5kIHI4IGFyZSBjbG9iYmVyZWQuCiAJQCAxYiA9IGZpcnN0IGNyaXRpY2FsIGluc24sIDJiID0gbGFzdCBjcml0aWNhbCBpbnNuLgotCUAgSWYgcjIgPj0gMWIgYW5kIHIyIDw9IDJiIHRoZW4gc2F2ZWQgcGNfdXNyIGlzIHNldCB0byAxYi4KKwlAIElmIHI0ID49IDFiIGFuZCByNCA8PSAyYiB0aGVuIHNhdmVkIHBjX3VzciBpcyBzZXQgdG8gMWIuCiAJbW92CXI3LCAjMHhmZmZmMGZmZgogCXN1YglyNywgcjcsICMoMHhmZmZmMGZmZiAtICgweGZmZmYwZmMwICsgKDFiIC0gX19rdXNlcl9jbXB4Y2hnKSkpCi0Jc3VicwlyOCwgcjIsIHI3CisJc3VicwlyOCwgcjQsIHI3CiAJcnNiY3NzCXI4LCByOCwgIygyYiAtIDFiKQogCXN0cmNzCXI3LCBbc3AsICNTX1BDXQogCW1vdglwYywgbHIKQEAgLTk1OSwzOSArODk0LDYgQEAKIAogCS5hbGlnbgk1CiAKLS8qCi0gKiBSZWZlcmVuY2UgcHJvdG90eXBlOgotICoKLSAqCWludCBfX2tlcm5lbF9nZXRfdGxzKHZvaWQpCi0gKgotICogSW5wdXQ6Ci0gKgotICoJbHIgPSByZXR1cm4gYWRkcmVzcwotICoKLSAqIE91dHB1dDoKLSAqCi0gKglyMCA9IFRMUyB2YWx1ZQotICoKLSAqIENsb2JiZXJlZDoKLSAqCi0gKglub25lCi0gKgotICogRGVmaW5pdGlvbiBhbmQgdXNlciBzcGFjZSB1c2FnZSBleGFtcGxlOgotICoKLSAqCXR5cGVkZWYgaW50IChfX2tlcm5lbF9nZXRfdGxzX3QpKHZvaWQpOwotICoJI2RlZmluZSBfX2tlcm5lbF9nZXRfdGxzICgqKF9fa2VybmVsX2dldF90bHNfdCAqKTB4ZmZmZjBmZTApCi0gKgotICogR2V0IHRoZSBUTFMgdmFsdWUgYXMgcHJldmlvdXNseSBzZXQgdmlhIHRoZSBfX0FSTV9OUl9zZXRfdGxzIHN5c2NhbGwuCi0gKgotICogVGhpcyBjb3VsZCBiZSB1c2VkIGFzIGZvbGxvd3M6Ci0gKgotICogI2RlZmluZSBfX2tlcm5lbF9nZXRfdGxzKCkgXAotICoJKHsgcmVnaXN0ZXIgdW5zaWduZWQgaW50IF9fdmFsIGFzbSgicjAiKTsgXAotICogICAgICAgICBhc20oICJtb3YgcjAsICMweGZmZmYwZmZmOyBtb3YgbHIsIHBjOyBzdWIgcGMsIHIwLCAjMzEiIFwKLSAqCSAgICAgICAgOiAiPXIiIChfX3ZhbCkgOiA6ICJsciIsImNjIiApOyBcCi0gKgkgICBfX3ZhbDsgfSkKLSAqLwotCiBfX2t1c2VyX2dldF90bHM6CQkJCUAgMHhmZmZmMGZlMAogCWxkcglyMCwgW3BjLCAjKDE2IC0gOCldCUAgcmVhZCBUTFMsIHNldCBpbiBrdXNlcl9nZXRfdGxzX2luaXQKIAl1c3JfcmV0CWxyCkBAIC0xMDAwLDE5ICs5MDIsNiBAQAogCS53b3JkCTAJCQlAIDB4ZmZmZjBmZjAgc29mdHdhcmUgVExTIHZhbHVlLCB0aGVuCiAJLmVuZHIJCQkJQCBwYWQgdXAgdG8gX19rdXNlcl9oZWxwZXJfdmVyc2lvbgogCi0vKgotICogUmVmZXJlbmNlIGRlY2xhcmF0aW9uOgotICoKLSAqCWV4dGVybiB1bnNpZ25lZCBpbnQgX19rZXJuZWxfaGVscGVyX3ZlcnNpb247Ci0gKgotICogRGVmaW5pdGlvbiBhbmQgdXNlciBzcGFjZSB1c2FnZSBleGFtcGxlOgotICoKLSAqCSNkZWZpbmUgX19rZXJuZWxfaGVscGVyX3ZlcnNpb24gKCoodW5zaWduZWQgaW50ICopMHhmZmZmMGZmYykKLSAqCi0gKiBVc2VyIHNwYWNlIG1heSByZWFkIHRoaXMgdG8gZGV0ZXJtaW5lIHRoZSBjdXJlbnQgbnVtYmVyIG9mIGhlbHBlcnMKLSAqIGF2YWlsYWJsZS4KLSAqLwotCiBfX2t1c2VyX2hlbHBlcl92ZXJzaW9uOgkJCQlAIDB4ZmZmZjBmZmMKIAkud29yZAkoKF9fa3VzZXJfaGVscGVyX2VuZCAtIF9fa3VzZXJfaGVscGVyX3N0YXJ0KSA+PiA1KQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKaW5kZXggMWU3YjA0YS4uYjJhMjdiNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUwpAQCAtNjQsNiArNjQsNyBAQAogRU5UUlkocmV0X3RvX3VzZXIpCiByZXRfc2xvd19zeXNjYWxsOgogCWRpc2FibGVfaXJxCQkJCUAgZGlzYWJsZSBpbnRlcnJ1cHRzCitFTlRSWShyZXRfdG9fdXNlcl9mcm9tX2lycSkKIAlsZHIJcjEsIFt0c2ssICNUSV9GTEFHU10KIAl0c3QJcjEsICNfVElGX1dPUktfTUFTSwogCWJuZQl3b3JrX3BlbmRpbmcKQEAgLTc1LDYgKzc2LDcgQEAKIAlhcmNoX3JldF90b191c2VyIHIxLCBscgogCiAJcmVzdG9yZV91c2VyX3JlZ3MgZmFzdCA9IDAsIG9mZnNldCA9IDAKK0VORFBST0MocmV0X3RvX3VzZXJfZnJvbV9pcnEpCiBFTkRQUk9DKHJldF90b191c2VyKQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWhlYWRlci5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWhlYWRlci5TCmluZGV4IDA1MTE2NmMuLjlhODUzMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1oZWFkZXIuUworKysgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktaGVhZGVyLlMKQEAgLTEyMSwxNSArMTIxLDEzIEBACiAJLmVuZG0KICNlbHNlCS8qIENPTkZJR19USFVNQjJfS0VSTkVMICovCiAJLm1hY3JvCXN2Y19leGl0LCBycHNyCisJbGRyCWxyLCBbc3AsICNTX1NQXQkJCUAgdG9wIG9mIHRoZSBzdGFjaworCWxkcmQJcjAsIHIxLCBbc3AsICNTX0xSXQkJQCBjYWxsaW5nIGxyIGFuZCBwYwogCWNscmV4CQkJCQlAIGNsZWFyIHRoZSBleGNsdXNpdmUgbW9uaXRvcgotCWxkcglyMCwgW3NwLCAjU19TUF0JCQlAIHRvcCBvZiB0aGUgc3RhY2sKLQlsZHIJcjEsIFtzcCwgI1NfUENdCQkJQCByZXR1cm4gYWRkcmVzcwotCXRzdAlyMCwgIzQJCQkJQCBvcmlnIHN0YWNrIDgtYnl0ZSBhbGlnbmVkPwotCXN0bWRiCXIwLCB7cjEsIFxycHNyfQkJCUAgcmZlIGNvbnRleHQKKwlzdG1kYglsciEsIHtyMCwgcjEsIFxycHNyfQkJQCBjYWxsaW5nIGxyIGFuZCByZmUgY29udGV4dAogCWxkbWlhCXNwLCB7cjAgLSByMTJ9Ci0JbGRyCWxyLCBbc3AsICNTX0xSXQotCWFkZGVxCXNwLCBzcCwgI1NfRlJBTUVfU0laRSAtIDgJQCBhbGlnbmVkCi0JYWRkbmUJc3AsIHNwLCAjU19GUkFNRV9TSVpFIC0gNAlAIG5vdCBhbGlnbmVkCisJbW92CXNwLCBscgorCWxkcglsciwgW3NwXSwgIzQKIAlyZmVpYQlzcCEKIAkuZW5kbQogCkBAIC0xNjUsMjUgKzE2Myw2IEBACiAJLmVuZG0KICNlbmRpZgkvKiAhQ09ORklHX1RIVU1CMl9LRVJORUwgKi8KIAotCUAKLQlAIERlYnVnIGV4Y2VwdGlvbnMgYXJlIHRha2VuIGFzIHByZWZldGNoIG9yIGRhdGEgYWJvcnRzLgotCUAgV2UgbXVzdCBkaXNhYmxlIHByZWVtcHRpb24gZHVyaW5nIHRoZSBoYW5kbGVyIHNvIHRoYXQKLQlAIHdlIGNhbiBhY2Nlc3MgdGhlIGRlYnVnIHJlZ2lzdGVycyBzYWZlbHkuCi0JQAotCS5tYWNybwlkZWJ1Z19lbnRyeSwgZnNyCi0jaWYgZGVmaW5lZChDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UKSAmJiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQotCWxkcglyNCwgPTB4NDBmCQlAIG1hc2sgb3V0IGZzci5mcwotCWFuZAlyNSwgcjQsIFxmc3IKLQljbXAJcjUsICMyCQkJQCBkZWJ1ZyBleGNlcHRpb24KLQlibmUJMWYKLQlnZXRfdGhyZWFkX2luZm8gcjEwCi0JbGRyCXI2LCBbcjEwLCAjVElfUFJFRU1QVF0JQCBnZXQgcHJlZW1wdCBjb3VudAotCWFkZAlyMTEsIHI2LCAjMQkJQCBpbmNyZW1lbnQgaXQKLQlzdHIJcjExLCBbcjEwLCAjVElfUFJFRU1QVF0KLTE6Ci0jZW5kaWYKLQkuZW5kbQotCiAvKgogICogVGhlc2UgYXJlIHRoZSByZWdpc3RlcnMgdXNlZCBpbiB0aGUgc3lzY2FsbCBoYW5kbGVyLCBhbmQgYWxsb3cgdXMgdG8KICAqIGhhdmUgaW4gdGhlb3J5IHVwIHRvIDcgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24gLSByMCB0byByNi4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLW5vbW11LlMgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC1ub21tdS5TCmluZGV4IDZiMWUwYWQuLmQ0NmYyNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLW5vbW11LlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2hlYWQtbm9tbXUuUwpAQCAtMzIsOCArMzIsMTYgQEAKICAqIG51bWJlcnMgZm9yIHIxLgogICoKICAqLworCS5hcm0KKwogCV9fSEVBRAogRU5UUlkoc3RleHQpCisKKyBUSFVNQigJYWRyCXI5LCBCU1lNKDFmKQkpCUAgS2VybmVsIGlzIGFsd2F5cyBlbnRlcmVkIGluIEFSTS4KKyBUSFVNQigJYngJcjkJCSkJQCBJZiB0aGlzIGlzIGEgVGh1bWItMiBrZXJuZWwsCisgVEhVTUIoCS50aHVtYgkJCSkJQCBzd2l0Y2ggdG8gVGh1bWIgbm93LgorIFRIVU1CKDE6CQkJKQorCiAJc2V0bW9kZQlQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERSwgcjkgQCBlbnN1cmUgc3ZjIG1vZGUKIAkJCQkJCUAgYW5kIGlycXMgZGlzYWJsZWQKICNpZm5kZWYgQ09ORklHX0NQVV9DUDE1CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaGVhZC5TIGIvYXJjaC9hcm0va2VybmVsL2hlYWQuUwppbmRleCAyNzhjMWIwLi43NDJiNjEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKQEAgLTcxLDggKzcxLDE2IEBACiAgKiBjcmFwIGhlcmUgLSB0aGF0J3Mgd2hhdCB0aGUgYm9vdCBsb2FkZXIgKG9yIGluIGV4dHJlbWUsIHdlbGwganVzdGlmaWVkCiAgKiBjaXJjdW1zdGFuY2VzLCB6SW1hZ2UpIGlzIGZvci4KICAqLworCS5hcm0KKwogCV9fSEVBRAogRU5UUlkoc3RleHQpCisKKyBUSFVNQigJYWRyCXI5LCBCU1lNKDFmKQkpCUAgS2VybmVsIGlzIGFsd2F5cyBlbnRlcmVkIGluIEFSTS4KKyBUSFVNQigJYngJcjkJCSkJQCBJZiB0aGlzIGlzIGEgVGh1bWItMiBrZXJuZWwsCisgVEhVTUIoCS50aHVtYgkJCSkJQCBzd2l0Y2ggdG8gVGh1bWIgbm93LgorIFRIVU1CKDE6CQkJKQorCiAJc2V0bW9kZQlQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERSwgcjkgQCBlbnN1cmUgc3ZjIG1vZGUKIAkJCQkJCUAgYW5kIGlycXMgZGlzYWJsZWQKIAltcmMJcDE1LCAwLCByOSwgYzAsIGMwCQlAIGdldCBwcm9jZXNzb3IgaWQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9od19icmVha3BvaW50LmMgYi9hcmNoL2FybS9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCmluZGV4IDg3YWNjMjUuLmE5MjdjYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9od19icmVha3BvaW50LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2h3X2JyZWFrcG9pbnQuYwpAQCAtNzk2LDcgKzc5Niw3IEBACiAKIC8qCiAgKiBDYWxsZWQgZnJvbSBlaXRoZXIgdGhlIERhdGEgQWJvcnQgSGFuZGxlciBbd2F0Y2hwb2ludF0gb3IgdGhlCi0gKiBQcmVmZXRjaCBBYm9ydCBIYW5kbGVyIFticmVha3BvaW50XSB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQuCisgKiBQcmVmZXRjaCBBYm9ydCBIYW5kbGVyIFticmVha3BvaW50XSB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCiAgKi8KIHN0YXRpYyBpbnQgaHdfYnJlYWtwb2ludF9wZW5kaW5nKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IGZzciwKIAkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC04MDQsOCArODA0LDEwIEBACiAJaW50IHJldCA9IDA7CiAJdTMyIGRzY3I7CiAKLQkvKiBXZSBtdXN0IGJlIGNhbGxlZCB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQuICovCi0JV0FSTl9PTihwcmVlbXB0aWJsZSgpKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCWlmIChpbnRlcnJ1cHRzX2VuYWJsZWQocmVncykpCisJCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCS8qIFdlIG9ubHkgaGFuZGxlIHdhdGNocG9pbnRzIGFuZCBoYXJkd2FyZSBicmVha3BvaW50cy4gKi8KIAlBUk1fREJHX1JFQUQoYzEsIDAsIGRzY3IpOwpAQCAtODI0LDEwICs4MjYsNiBAQAogCQlyZXQgPSAxOyAvKiBVbmhhbmRsZWQgZmF1bHQuICovCiAJfQogCi0JLyoKLQkgKiBSZS1lbmFibGUgcHJlZW1wdGlvbiBhZnRlciBpdCB3YXMgZGlzYWJsZWQgaW4gdGhlCi0JICogbG93LWxldmVsIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlLgotCSAqLwogCXByZWVtcHRfZW5hYmxlKCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2lycS5jIGIvYXJjaC9hcm0va2VybmVsL2lycS5jCmluZGV4IDgzYmJhZDAuLjBmOTI4YTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2FybS9rZXJuZWwvaXJxLmMKQEAgLTEzMSw1NCArMTMxLDYzIEBACiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAotc3RhdGljIGJvb2wgbWlncmF0ZV9vbmVfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3N0YXRpYyBib29sIG1pZ3JhdGVfb25lX2lycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9IGNwdW1hc2tfYW55X2FuZChkLT5hZmZpbml0eSwgY3B1X29ubGluZV9tYXNrKTsKKwlzdHJ1Y3QgaXJxX2RhdGEgKmQgPSBpcnFfZGVzY19nZXRfaXJxX2RhdGEoZGVzYyk7CisJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5ID0gZC0+YWZmaW5pdHk7CisJc3RydWN0IGlycV9jaGlwICpjOwogCWJvb2wgcmV0ID0gZmFsc2U7CiAKLQlpZiAoY3B1ID49IG5yX2NwdV9pZHMpIHsKLQkJY3B1ID0gY3B1bWFza19hbnkoY3B1X29ubGluZV9tYXNrKTsKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBwZXItQ1BVIGludGVycnVwdCwgb3IgdGhlIGFmZmluaXR5IGRvZXMgbm90CisJICogaW5jbHVkZSB0aGlzIENQVSwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uCisJICovCisJaWYgKGlycWRfaXNfcGVyX2NwdShkKSB8fCAhY3B1bWFza190ZXN0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIGFmZmluaXR5KSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGNwdW1hc2tfYW55X2FuZChhZmZpbml0eSwgY3B1X29ubGluZV9tYXNrKSA+PSBucl9jcHVfaWRzKSB7CisJCWFmZmluaXR5ID0gY3B1X29ubGluZV9tYXNrOwogCQlyZXQgPSB0cnVlOwogCX0KIAotCXByX2RlYnVnKCJJUlEldTogbW92aW5nIGZyb20gY3B1JXUgdG8gY3B1JXVcbiIsIGQtPmlycSwgZC0+bm9kZSwgY3B1KTsKLQotCWQtPmNoaXAtPmlycV9zZXRfYWZmaW5pdHkoZCwgY3B1bWFza19vZihjcHUpLCB0cnVlKTsKKwljID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwKGQpOworCWlmIChjLT5pcnFfc2V0X2FmZmluaXR5KQorCQljLT5pcnFfc2V0X2FmZmluaXR5KGQsIGFmZmluaXR5LCB0cnVlKTsKKwllbHNlCisJCXByX2RlYnVnKCJJUlEldTogdW5hYmxlIHRvIHNldCBhZmZpbml0eVxuIiwgZC0+aXJxKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBUaGUgQ1BVIGhhcyBiZWVuIG1hcmtlZCBvZmZsaW5lLiAgTWlncmF0ZSBJUlFzIG9mZiB0aGlzIENQVS4gIElmCi0gKiB0aGUgYWZmaW5pdHkgc2V0dGluZ3MgZG8gbm90IGFsbG93IG90aGVyIENQVXMsIGZvcmNlIHRoZW0gb250byBhbnkKKyAqIFRoZSBjdXJyZW50IENQVSBoYXMgYmVlbiBtYXJrZWQgb2ZmbGluZS4gIE1pZ3JhdGUgSVJRcyBvZmYgdGhpcyBDUFUuCisgKiBJZiB0aGUgYWZmaW5pdHkgc2V0dGluZ3MgZG8gbm90IGFsbG93IG90aGVyIENQVXMsIGZvcmNlIHRoZW0gb250byBhbnkKICAqIGF2YWlsYWJsZSBDUFUuCisgKgorICogTm90ZTogd2UgbXVzdCBpdGVyYXRlIG92ZXIgYWxsIElSUXMsIHdoZXRoZXIgdGhleSBoYXZlIGFuIGF0dGFjaGVkCisgKiBhY3Rpb24gc3RydWN0dXJlIG9yIG5vdCwgYXMgd2UgbmVlZCB0byBnZXQgY2hhaW5lZCBpbnRlcnJ1cHRzIHRvby4KICAqLwogdm9pZCBtaWdyYXRlX2lycXModm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgaSwgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXVuc2lnbmVkIGludCBpOwogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAJZm9yX2VhY2hfaXJxX2Rlc2MoaSwgZGVzYykgewotCQlzdHJ1Y3QgaXJxX2RhdGEgKmQgPSAmZGVzYy0+aXJxX2RhdGE7CiAJCWJvb2wgYWZmaW5pdHlfYnJva2VuID0gZmFsc2U7CiAKKwkJaWYgKCFkZXNjKQorCQkJY29udGludWU7CisKIAkJcmF3X3NwaW5fbG9jaygmZGVzYy0+bG9jayk7Ci0JCWRvIHsKLQkJCWlmIChkZXNjLT5hY3Rpb24gPT0gTlVMTCkKLQkJCQlicmVhazsKLQotCQkJaWYgKGQtPm5vZGUgIT0gY3B1KQotCQkJCWJyZWFrOwotCi0JCQlhZmZpbml0eV9icm9rZW4gPSBtaWdyYXRlX29uZV9pcnEoZCk7Ci0JCX0gd2hpbGUgKDApOworCQlhZmZpbml0eV9icm9rZW4gPSBtaWdyYXRlX29uZV9pcnEoZGVzYyk7CiAJCXJhd19zcGluX3VubG9jaygmZGVzYy0+bG9jayk7CiAKIAkJaWYgKGFmZmluaXR5X2Jyb2tlbiAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcl93YXJuaW5nKCJJUlEldSBubyBsb25nZXIgYWZmaW5lIHRvIENQVSV1XG4iLCBpLCBjcHUpOworCQkJcHJfd2FybmluZygiSVJRJXUgbm8gbG9uZ2VyIGFmZmluZSB0byBDUFUldVxuIiwgaSwKKwkJCQlzbXBfcHJvY2Vzc29yX2lkKCkpOwogCX0KIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLWFybS5jIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyMDNlZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLWFybS5jCkBAIC0wLDAgKzEsOTk5IEBACisvKgorICogYXJjaC9hcm0va2VybmVsL2twcm9iZXMtZGVjb2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgTW90b3JvbGEgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKgorICogV2UgZG8gbm90IGhhdmUgaGFyZHdhcmUgc2luZ2xlLXN0ZXBwaW5nIG9uIEFSTSwgVGhpcworICogZWZmb3J0IGlzIGZ1cnRoZXIgY29tcGxpY2F0ZWQgYnkgdGhlIEFSTSBub3QgaGF2aW5nIGEKKyAqICJuZXh0IFBDIiByZWdpc3Rlci4gIEluc3RydWN0aW9ucyB0aGF0IGNoYW5nZSB0aGUgUEMKKyAqIGNhbid0IGJlIHNhZmVseSBzaW5nbGUtc3RlcHBlZCBpbiBhIE1QIGVudmlyb25tZW50LCBzbworICogd2UgaGF2ZSBhIGxvdCBvZiB3b3JrIHRvIGRvOgorICoKKyAqIEluIHRoZSBwcmVwYXJlIHBoYXNlOgorICogICAqKSBJZiBpdCBpcyBhbiBpbnN0cnVjdGlvbiB0aGF0IGRvZXMgYW55dGhpbmcKKyAqICAgICAgd2l0aCB0aGUgQ1BVIG1vZGUsIHdlIHJlamVjdCBpdCBmb3IgYSBrcHJvYmUuCisgKiAgICAgIChUaGlzIGlzIG91dCBvZiBsYXppbmVzcyByYXRoZXIgdGhhbiBuZWVkLiAgVGhlCisgKiAgICAgIGluc3RydWN0aW9ucyBjb3VsZCBiZSBzaW11bGF0ZWQuKQorICoKKyAqICAgKikgT3RoZXJ3aXNlLCBkZWNvZGUgdGhlIGluc3RydWN0aW9uIHJld3JpdGluZyBpdHMKKyAqICAgICAgcmVnaXN0ZXJzIHRvIHRha2UgZml4ZWQsIG9yZGVyZWQgcmVnaXN0ZXJzIGFuZAorICogICAgICBzZXR0aW5nIGEgaGFuZGxlciBmb3IgaXQgdG8gcnVuIHRoZSBpbnN0cnVjdGlvbi4KKyAqCisgKiBJbiB0aGUgZXhlY3V0aW9uIHBoYXNlIGJ5IGFuIGluc3RydWN0aW9uJ3MgaGFuZGxlcjoKKyAqCisgKiAgICopIElmIHRoZSBQQyBpcyB3cml0dGVuIHRvIGJ5IHRoZSBpbnN0cnVjdGlvbiwgdGhlCisgKiAgICAgIGluc3RydWN0aW9uIG11c3QgYmUgZnVsbHkgc2ltdWxhdGVkIGluIHNvZnR3YXJlLgorICoKKyAqICAgKikgT3RoZXJ3aXNlLCBhIG1vZGlmaWVkIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uIGlzCisgKiAgICAgIGRpcmVjdGx5IGV4ZWN1dGVkLiAgSXRzIGhhbmRsZXIgY2FsbHMgdGhlCisgKiAgICAgIGluc3RydWN0aW9uIGluIGluc25bMF0uICBJbiBpbnNuWzFdIGlzIGEKKyAqICAgICAgIm1vdiBwYywgbHIiIHRvIHJldHVybi4KKyAqCisgKiAgICAgIEJlZm9yZSBjYWxsaW5nLCBsb2FkIHVwIHRoZSByZW9yZGVyZWQgcmVnaXN0ZXJzCisgKiAgICAgIGZyb20gdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uJ3MgcmVnaXN0ZXJzLiAgSWYgb25lCisgKiAgICAgIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCByZWdpc3RlcnMgaXMgdGhlIFBDLCBjb21wdXRlCisgKiAgICAgIGFuZCBhZGp1c3QgdGhlIGFwcHJvcHJpYXRlIGlucHV0IHJlZ2lzdGVyLgorICoKKyAqCUFmdGVyIGNhbGwgY29tcGxldGVzLCBjb3B5IHRoZSBvdXRwdXQgcmVnaXN0ZXJzIHRvCisgKiAgICAgIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbidzIG9yaWdpbmFsIHJlZ2lzdGVycy4KKyAqCisgKiBXZSBkb24ndCB1c2UgYSByZWFsIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gc2luY2UgdGhhdAorICogd291bGQgaGF2ZSB1cyBpbiB0aGUga2VybmVsIGdvIGZyb20gU1ZDIG1vZGUgdG8gU1ZDCisgKiBtb2RlIGxvc2luZyB0aGUgbGluayByZWdpc3Rlci4gIEluc3RlYWQgd2UgdXNlIGFuCisgKiB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24uICBUbyBzaW1wbGlmeSBwcm9jZXNzaW5nLCB0aGUKKyAqIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiB1c2VkIGZvciBrcHJvYmVzIG11c3QgYmUgcmVzZXJ2ZWQKKyAqIGV4Y2x1c2l2ZWx5IGZvciBrcHJvYmVzIHVzZS4KKyAqCisgKiBUT0RPOiBpZmRlZiBvdXQgc29tZSBpbnN0cnVjdGlvbiBkZWNvZGluZyBiYXNlZCBvbiBhcmNoaXRlY3R1cmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKworI2luY2x1ZGUgImtwcm9iZXMuaCIKKworI2RlZmluZSBzaWduX2V4dGVuZCh4LCBzaWduYml0KSAoKHgpIHwgKDAgLSAoKHgpICYgKDEgPDwgKHNpZ25iaXQpKSkpKQorCisjZGVmaW5lIGJyYW5jaF9kaXNwbGFjZW1lbnQoaW5zbikgc2lnbl9leHRlbmQoKChpbnNuKSAmIDB4ZmZmZmZmKSA8PCAyLCAyNSkKKworI2lmICBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgorI2RlZmluZSBCTFgocmVnKQkiYmx4CSJyZWciCQlcblx0IgorI2Vsc2UKKyNkZWZpbmUgQkxYKHJlZykJIm1vdglsciwgcGMJCVxuXHQiCVwKKwkJCSJtb3YJcGMsICJyZWciCVxuXHQiCisjZW5kaWYKKworLyoKKyAqIFRvIGF2b2lkIHRoZSBjb21wbGljYXRpb25zIG9mIG1pbWljaW5nIHNpbmdsZS1zdGVwcGluZyBvbiBhCisgKiBwcm9jZXNzb3Igd2l0aG91dCBhIE5leHQtUEMgb3IgYSBzaW5nbGUtc3RlcCBtb2RlLCBhbmQgdG8KKyAqIGF2b2lkIGhhdmluZyB0byBkZWFsIHdpdGggdGhlIHNpZGUtZWZmZWN0cyBvZiBib29zdGluZywgd2UKKyAqIHNpbXVsYXRlIG9yIGVtdWxhdGUgKGFsbW9zdCkgYWxsIEFSTSBpbnN0cnVjdGlvbnMuCisgKgorICogIlNpbXVsYXRpb24iIGlzIHdoZXJlIHRoZSBpbnN0cnVjdGlvbidzIGJlaGF2aW9yIGlzIGR1cGxpY2F0ZWQgaW4KKyAqIEMgY29kZS4gICJFbXVsYXRpb24iIGlzIHdoZXJlIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiBpcyByZXdyaXR0ZW4KKyAqIGFuZCBleGVjdXRlZCwgb2Z0ZW4gYnkgYWx0ZXJpbmcgaXRzIHJlZ2lzdGVycy4KKyAqCisgKiBCeSBoYXZpbmcgYWxsIGJlaGF2aW9yIG9mIHRoZSBrcHJvYmUnZCBpbnN0cnVjdGlvbiBjb21wbGV0ZWQgYmVmb3JlCisgKiByZXR1cm5pbmcgZnJvbSB0aGUga3Byb2JlX2hhbmRsZXIoKSwgYWxsIGxvY2tzIChzY2hlZHVsZXIgYW5kCisgKiBpbnRlcnJ1cHQpIGNhbiBzYWZlbHkgYmUgcmVsZWFzZWQuICBUaGVyZSBpcyBubyBuZWVkIGZvciBzZWNvbmRhcnkKKyAqIGJyZWFrcG9pbnRzLCBubyByYWNlIHdpdGggTVAgb3IgcHJlZW1wdGFibGUga2VybmVscywgbm9yIGhhdmluZyB0bworICogY2xlYW4gdXAgcmVzb3VyY2VzIGNvdW50cyBhdCBhIGxhdGVyIHRpbWUgaW1wYWN0aW5nIG92ZXJhbGwgc3lzdGVtCisgKiBwZXJmb3JtYW5jZS4gIEJ5IHJld3JpdGluZyB0aGUgaW5zdHJ1Y3Rpb24sIG9ubHkgdGhlIG1pbmltdW0gcmVnaXN0ZXJzCisgKiBuZWVkIHRvIGJlIGxvYWRlZCBhbmQgc2F2ZWQgYmFjayBvcHRpbWl6aW5nIHBlcmZvcm1hbmNlLgorICoKKyAqIENhbGxpbmcgdGhlIGluc25zbG90XypfcndmbGFncyB2ZXJzaW9uIG9mIGEgZnVuY3Rpb24gZG9lc24ndCBodXJ0CisgKiBhbnl0aGluZyBldmVuIHdoZW4gdGhlIENQU1IgZmxhZ3MgYXJlbid0IHVwZGF0ZWQgYnkgdGhlCisgKiBpbnN0cnVjdGlvbi4gIEl0J3MganVzdCBhIGxpdHRsZSBzbG93ZXIgaW4gcmV0dXJuIGZvciBzYXZpbmcKKyAqIGEgbGl0dGxlIHNwYWNlIGJ5IG5vdCBoYXZpbmcgYSBkdXBsaWNhdGUgZnVuY3Rpb24gdGhhdCBkb2Vzbid0CisgKiB1cGRhdGUgdGhlIGZsYWdzLiAgKFRoZSBzYW1lIG9wdGltaXphdGlvbiBjYW4gYmUgc2FpZCBmb3IKKyAqIGluc3RydWN0aW9ucyB0aGF0IGRvIG9yIGRvbid0IHBlcmZvcm0gcmVnaXN0ZXIgd3JpdGViYWNrKQorICogQWxzbywgaW5zdHJ1Y3Rpb25zIGNhbiBlaXRoZXIgcmVhZCB0aGUgZmxhZ3MsIG9ubHkgd3JpdGUgdGhlCisgKiBmbGFncywgb3IgcmVhZCBhbmQgd3JpdGUgdGhlIGZsYWdzLiAgVG8gc2F2ZSBjb21iaW5hdGlvbnMKKyAqIHJhdGhlciB0aGFuIGZvciBzaGVlciBwZXJmb3JtYW5jZSwgZmxhZyBmdW5jdGlvbnMganVzdCBhc3N1bWUKKyAqIHJlYWQgYW5kIHdyaXRlIG9mIGZsYWdzLgorICovCisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBzaW11bGF0ZV9iYmwoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJa3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7CisJbG9uZyBpYWRkciA9IChsb25nKXAtPmFkZHI7CisJaW50IGRpc3AgID0gYnJhbmNoX2Rpc3BsYWNlbWVudChpbnNuKTsKKworCWlmIChpbnNuICYgKDEgPDwgMjQpKQorCQlyZWdzLT5BUk1fbHIgPSBpYWRkciArIDQ7CisKKwlyZWdzLT5BUk1fcGMgPSBpYWRkciArIDggKyBkaXNwOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgc2ltdWxhdGVfYmx4MShzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwlsb25nIGlhZGRyID0gKGxvbmcpcC0+YWRkcjsKKwlpbnQgZGlzcCA9IGJyYW5jaF9kaXNwbGFjZW1lbnQoaW5zbik7CisKKwlyZWdzLT5BUk1fbHIgPSBpYWRkciArIDQ7CisJcmVncy0+QVJNX3BjID0gaWFkZHIgKyA4ICsgZGlzcCArICgoaW5zbiA+PiAyMykgJiAweDIpOworCXJlZ3MtPkFSTV9jcHNyIHw9IFBTUl9UX0JJVDsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzIHNpbXVsYXRlX2JseDJieChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwlpbnQgcm0gPSBpbnNuICYgMHhmOworCWxvbmcgcm12ID0gcmVncy0+dXJlZ3Nbcm1dOworCisJaWYgKGluc24gJiAoMSA8PCA1KSkKKwkJcmVncy0+QVJNX2xyID0gKGxvbmcpcC0+YWRkciArIDQ7CisKKwlyZWdzLT5BUk1fcGMgPSBybXYgJiB+MHgxOworCXJlZ3MtPkFSTV9jcHNyICY9IH5QU1JfVF9CSVQ7CisJaWYgKHJtdiAmIDB4MSkKKwkJcmVncy0+QVJNX2Nwc3IgfD0gUFNSX1RfQklUOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgc2ltdWxhdGVfbXJzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCWludCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSAweGY4ZmYwM2RmOyAvKiBNYXNrIG91dCBleGVjdXRpb24gc3RhdGUgKi8KKwlyZWdzLT51cmVnc1tyZF0gPSByZWdzLT5BUk1fY3BzciAmIG1hc2s7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBzaW11bGF0ZV9tb3ZfaXBzcChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZWdzLT51cmVnc1sxMl0gPSByZWdzLT51cmVnc1sxM107Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcworZW11bGF0ZV9sZHJkc3RyZChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwl1bnNpZ25lZCBsb25nIHBjID0gKHVuc2lnbmVkIGxvbmcpcC0+YWRkciArIDg7CisJaW50IHJ0ID0gKGluc24gPj4gMTIpICYgMHhmOworCWludCBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKwlpbnQgcm0gPSBpbnNuICYgMHhmOworCisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBydHYgYXNtKCJyMCIpID0gcmVncy0+dXJlZ3NbcnRdOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcnQydiBhc20oInIxIikgPSByZWdzLT51cmVnc1tydCsxXTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJudiBhc20oInIyIikgPSAocm4gPT0gMTUpID8gcGMKKwkJCQkJCQkgIDogcmVncy0+dXJlZ3Nbcm5dOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcm12IGFzbSgicjMiKSA9IHJlZ3MtPnVyZWdzW3JtXTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJQkxYKCIlW2ZuXSIpCisJCTogIj1yIiAocnR2KSwgIj1yIiAocnQydiksICI9ciIgKHJudikKKwkJOiAiMCIgKHJ0diksICIxIiAocnQydiksICIyIiAocm52KSwgInIiIChybXYpLAorCQkgIFtmbl0gInIiIChwLT5haW5zbi5pbnNuX2ZuKQorCQk6ICJsciIsICJtZW1vcnkiLCAiY2MiCisJKTsKKworCXJlZ3MtPnVyZWdzW3J0XSA9IHJ0djsKKwlyZWdzLT51cmVnc1tydCsxXSA9IHJ0MnY7CisJaWYgKGlzX3dyaXRlYmFjayhpbnNuKSkKKwkJcmVncy0+dXJlZ3Nbcm5dID0gcm52OworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK2VtdWxhdGVfbGRyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCXVuc2lnbmVkIGxvbmcgcGMgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyICsgODsKKwlpbnQgcnQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisJaW50IHJuID0gKGluc24gPj4gMTYpICYgMHhmOworCWludCBybSA9IGluc24gJiAweGY7CisKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJ0diBhc20oInIwIik7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBybnYgYXNtKCJyMiIpID0gKHJuID09IDE1KSA/IHBjCisJCQkJCQkJICA6IHJlZ3MtPnVyZWdzW3JuXTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJtdiBhc20oInIzIikgPSByZWdzLT51cmVnc1tybV07CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCUJMWCgiJVtmbl0iKQorCQk6ICI9ciIgKHJ0diksICI9ciIgKHJudikKKwkJOiAiMSIgKHJudiksICJyIiAocm12KSwgW2ZuXSAiciIgKHAtPmFpbnNuLmluc25fZm4pCisJCTogImxyIiwgIm1lbW9yeSIsICJjYyIKKwkpOworCisJaWYgKHJ0ID09IDE1KQorCQlsb2FkX3dyaXRlX3BjKHJ0diwgcmVncyk7CisJZWxzZQorCQlyZWdzLT51cmVnc1tydF0gPSBydHY7CisKKwlpZiAoaXNfd3JpdGViYWNrKGluc24pKQorCQlyZWdzLT51cmVnc1tybl0gPSBybnY7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcworZW11bGF0ZV9zdHIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJa3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7CisJdW5zaWduZWQgbG9uZyBydHBjID0gKHVuc2lnbmVkIGxvbmcpcC0+YWRkciArIHN0cl9wY19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBybnBjID0gKHVuc2lnbmVkIGxvbmcpcC0+YWRkciArIDg7CisJaW50IHJ0ID0gKGluc24gPj4gMTIpICYgMHhmOworCWludCBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKwlpbnQgcm0gPSBpbnNuICYgMHhmOworCisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBydHYgYXNtKCJyMCIpID0gKHJ0ID09IDE1KSA/IHJ0cGMKKwkJCQkJCQkgIDogcmVncy0+dXJlZ3NbcnRdOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcm52IGFzbSgicjIiKSA9IChybiA9PSAxNSkgPyBybnBjCisJCQkJCQkJICA6IHJlZ3MtPnVyZWdzW3JuXTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJtdiBhc20oInIzIikgPSByZWdzLT51cmVnc1tybV07CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCUJMWCgiJVtmbl0iKQorCQk6ICI9ciIgKHJudikKKwkJOiAiciIgKHJ0diksICIwIiAocm52KSwgInIiIChybXYpLCBbZm5dICJyIiAocC0+YWluc24uaW5zbl9mbikKKwkJOiAibHIiLCAibWVtb3J5IiwgImNjIgorCSk7CisKKwlpZiAoaXNfd3JpdGViYWNrKGluc24pKQorCQlyZWdzLT51cmVnc1tybl0gPSBybnY7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcworZW11bGF0ZV9yZDEycm4xNnJtMHJzOF9yd2ZsYWdzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCXVuc2lnbmVkIGxvbmcgcGMgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyICsgODsKKwlpbnQgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisJaW50IHJuID0gKGluc24gPj4gMTYpICYgMHhmOworCWludCBybSA9IGluc24gJiAweGY7CisJaW50IHJzID0gKGluc24gPj4gOCkgJiAweGY7CisKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJkdiBhc20oInIwIikgPSByZWdzLT51cmVnc1tyZF07CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBybnYgYXNtKCJyMiIpID0gKHJuID09IDE1KSA/IHBjCisJCQkJCQkJICA6IHJlZ3MtPnVyZWdzW3JuXTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJtdiBhc20oInIzIikgPSAocm0gPT0gMTUpID8gcGMKKwkJCQkJCQkgIDogcmVncy0+dXJlZ3Nbcm1dOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcnN2IGFzbSgicjEiKSA9IHJlZ3MtPnVyZWdzW3JzXTsKKwl1bnNpZ25lZCBsb25nIGNwc3IgPSByZWdzLT5BUk1fY3BzcjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIm1zcgljcHNyX2ZzLCAlW2Nwc3JdCVxuXHQiCisJCUJMWCgiJVtmbl0iKQorCQkibXJzCSVbY3Bzcl0sIGNwc3IJCVxuXHQiCisJCTogIj1yIiAocmR2KSwgW2Nwc3JdICI9ciIgKGNwc3IpCisJCTogIjAiIChyZHYpLCAiciIgKHJudiksICJyIiAocm12KSwgInIiIChyc3YpLAorCQkgICIxIiAoY3BzciksIFtmbl0gInIiIChwLT5haW5zbi5pbnNuX2ZuKQorCQk6ICJsciIsICJtZW1vcnkiLCAiY2MiCisJKTsKKworCWlmIChyZCA9PSAxNSkKKwkJYWx1X3dyaXRlX3BjKHJkdiwgcmVncyk7CisJZWxzZQorCQlyZWdzLT51cmVnc1tyZF0gPSByZHY7CisJcmVncy0+QVJNX2Nwc3IgPSAocmVncy0+QVJNX2Nwc3IgJiB+QVBTUl9NQVNLKSB8IChjcHNyICYgQVBTUl9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCitlbXVsYXRlX3JkMTJybjE2cm0wX3J3ZmxhZ3Nfbm9wYyhzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwlpbnQgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisJaW50IHJuID0gKGluc24gPj4gMTYpICYgMHhmOworCWludCBybSA9IGluc24gJiAweGY7CisKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJkdiBhc20oInIwIikgPSByZWdzLT51cmVnc1tyZF07CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBybnYgYXNtKCJyMiIpID0gcmVncy0+dXJlZ3Nbcm5dOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcm12IGFzbSgicjMiKSA9IHJlZ3MtPnVyZWdzW3JtXTsKKwl1bnNpZ25lZCBsb25nIGNwc3IgPSByZWdzLT5BUk1fY3BzcjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIm1zcgljcHNyX2ZzLCAlW2Nwc3JdCVxuXHQiCisJCUJMWCgiJVtmbl0iKQorCQkibXJzCSVbY3Bzcl0sIGNwc3IJCVxuXHQiCisJCTogIj1yIiAocmR2KSwgW2Nwc3JdICI9ciIgKGNwc3IpCisJCTogIjAiIChyZHYpLCAiciIgKHJudiksICJyIiAocm12KSwKKwkJICAiMSIgKGNwc3IpLCBbZm5dICJyIiAocC0+YWluc24uaW5zbl9mbikKKwkJOiAibHIiLCAibWVtb3J5IiwgImNjIgorCSk7CisKKwlyZWdzLT51cmVnc1tyZF0gPSByZHY7CisJcmVncy0+QVJNX2Nwc3IgPSAocmVncy0+QVJNX2Nwc3IgJiB+QVBTUl9NQVNLKSB8IChjcHNyICYgQVBTUl9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCitlbXVsYXRlX3JkMTZybjEycm0wcnM4X3J3ZmxhZ3Nfbm9wYyhzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwlpbnQgcmQgPSAoaW5zbiA+PiAxNikgJiAweGY7CisJaW50IHJuID0gKGluc24gPj4gMTIpICYgMHhmOworCWludCBybSA9IGluc24gJiAweGY7CisJaW50IHJzID0gKGluc24gPj4gOCkgJiAweGY7CisKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJkdiBhc20oInIyIikgPSByZWdzLT51cmVnc1tyZF07CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBybnYgYXNtKCJyMCIpID0gcmVncy0+dXJlZ3Nbcm5dOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcm12IGFzbSgicjMiKSA9IHJlZ3MtPnVyZWdzW3JtXTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJzdiBhc20oInIxIikgPSByZWdzLT51cmVnc1tyc107CisJdW5zaWduZWQgbG9uZyBjcHNyID0gcmVncy0+QVJNX2Nwc3I7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJtc3IJY3Bzcl9mcywgJVtjcHNyXQlcblx0IgorCQlCTFgoIiVbZm5dIikKKwkJIm1ycwklW2Nwc3JdLCBjcHNyCQlcblx0IgorCQk6ICI9ciIgKHJkdiksIFtjcHNyXSAiPXIiIChjcHNyKQorCQk6ICIwIiAocmR2KSwgInIiIChybnYpLCAiciIgKHJtdiksICJyIiAocnN2KSwKKwkJICAiMSIgKGNwc3IpLCBbZm5dICJyIiAocC0+YWluc24uaW5zbl9mbikKKwkJOiAibHIiLCAibWVtb3J5IiwgImNjIgorCSk7CisKKwlyZWdzLT51cmVnc1tyZF0gPSByZHY7CisJcmVncy0+QVJNX2Nwc3IgPSAocmVncy0+QVJNX2Nwc3IgJiB+QVBTUl9NQVNLKSB8IChjcHNyICYgQVBTUl9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCitlbXVsYXRlX3JkMTJybTBfbm9mbGFnc19ub3BjKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCWludCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKwlpbnQgcm0gPSBpbnNuICYgMHhmOworCisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZHYgYXNtKCJyMCIpID0gcmVncy0+dXJlZ3NbcmRdOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcm12IGFzbSgicjMiKSA9IHJlZ3MtPnVyZWdzW3JtXTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJQkxYKCIlW2ZuXSIpCisJCTogIj1yIiAocmR2KQorCQk6ICIwIiAocmR2KSwgInIiIChybXYpLCBbZm5dICJyIiAocC0+YWluc24uaW5zbl9mbikKKwkJOiAibHIiLCAibWVtb3J5IiwgImNjIgorCSk7CisKKwlyZWdzLT51cmVnc1tyZF0gPSByZHY7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcworZW11bGF0ZV9yZGxvMTJyZGhpMTZybjBybThfcndmbGFnc19ub3BjKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCWludCByZGxvID0gKGluc24gPj4gMTIpICYgMHhmOworCWludCByZGhpID0gKGluc24gPj4gMTYpICYgMHhmOworCWludCBybiA9IGluc24gJiAweGY7CisJaW50IHJtID0gKGluc24gPj4gOCkgJiAweGY7CisKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJkbG92IGFzbSgicjAiKSA9IHJlZ3MtPnVyZWdzW3JkbG9dOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmRoaXYgYXNtKCJyMiIpID0gcmVncy0+dXJlZ3NbcmRoaV07CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBybnYgYXNtKCJyMyIpID0gcmVncy0+dXJlZ3Nbcm5dOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcm12IGFzbSgicjEiKSA9IHJlZ3MtPnVyZWdzW3JtXTsKKwl1bnNpZ25lZCBsb25nIGNwc3IgPSByZWdzLT5BUk1fY3BzcjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIm1zcgljcHNyX2ZzLCAlW2Nwc3JdCVxuXHQiCisJCUJMWCgiJVtmbl0iKQorCQkibXJzCSVbY3Bzcl0sIGNwc3IJCVxuXHQiCisJCTogIj1yIiAocmRsb3YpLCAiPXIiIChyZGhpdiksIFtjcHNyXSAiPXIiIChjcHNyKQorCQk6ICIwIiAocmRsb3YpLCAiMSIgKHJkaGl2KSwgInIiIChybnYpLCAiciIgKHJtdiksCisJCSAgIjIiIChjcHNyKSwgW2ZuXSAiciIgKHAtPmFpbnNuLmluc25fZm4pCisJCTogImxyIiwgIm1lbW9yeSIsICJjYyIKKwkpOworCisJcmVncy0+dXJlZ3NbcmRsb10gPSByZGxvdjsKKwlyZWdzLT51cmVnc1tyZGhpXSA9IHJkaGl2OworCXJlZ3MtPkFSTV9jcHNyID0gKHJlZ3MtPkFSTV9jcHNyICYgfkFQU1JfTUFTSykgfCAoY3BzciAmIEFQU1JfTUFTSyk7Cit9CisKKy8qCisgKiBGb3IgdGhlIGluc3RydWN0aW9uIG1hc2tpbmcgYW5kIGNvbXBhcmlzb25zIGluIGFsbCB0aGUgInNwYWNlXyoiCisgKiBmdW5jdGlvbnMgYmVsb3csIERvIF9ub3RfIHJlYXJyYW5nZSB0aGUgb3JkZXIgb2YgdGVzdHMgdW5sZXNzCisgKiB5b3UncmUgdmVyeSwgdmVyeSBzdXJlIG9mIHdoYXQgeW91IGFyZSBkb2luZy4gIEZvciB0aGUgc2FrZSBvZgorICogZWZmaWNpZW5jeSwgdGhlIG1hc2tzIGZvciBzb21lIHRlc3RzIHNvbWV0aW1lcyBhc3N1bWUgb3RoZXIgdGVzdAorICogaGF2ZSBiZWVuIGRvbmUgcHJpb3IgdG8gdGhlbSBzbyB0aGUgbnVtYmVyIG9mIHBhdHRlcm5zIHRvIHRlc3QKKyAqIGZvciBhbiBpbnN0cnVjdGlvbiBzZXQgY2FuIGJlIGFzIGJyb2FkIGFzIHBvc3NpYmxlIHRvIHJlZHVjZSB0aGUKKyAqIG51bWJlciBvZiB0ZXN0cyBuZWVkZWQuCisgKi8KKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIGFybV8xMTExX3RhYmxlW10gPSB7CisJLyogVW5jb25kaXRpb25hbCBpbnN0cnVjdGlvbnMJCQkJCSovCisKKwkvKiBtZW1vcnkgaGludAkJMTExMSAwMTAwIHgwMDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogUExESSAoaW1tZWRpYXRlKQkxMTExIDAxMDAgeDEwMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBQTERXIChpbW1lZGlhdGUpCTExMTEgMDEwMSB4MDAxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIFBMRCAoaW1tZWRpYXRlKQkxMTExIDAxMDEgeDEwMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfU0lNVUxBVEUJKDB4ZmUzMDAwMDAsIDB4ZjQxMDAwMDAsIGtwcm9iZV9zaW11bGF0ZV9ub3ApLAorCisJLyogbWVtb3J5IGhpbnQJCTExMTEgMDExMCB4MDAxIHh4eHggeHh4eCB4eHh4IHh4eDAgeHh4eCAqLworCS8qIFBMREkgKHJlZ2lzdGVyKQkxMTExIDAxMTAgeDEwMSB4eHh4IHh4eHggeHh4eCB4eHgwIHh4eHggKi8KKwkvKiBQTERXIChyZWdpc3RlcikJMTExMSAwMTExIHgwMDEgeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogUExEIChyZWdpc3RlcikJMTExMSAwMTExIHgxMDEgeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJREVDT0RFX1NJTVVMQVRFCSgweGZlMzAwMDEwLCAweGY2MTAwMDAwLCBrcHJvYmVfc2ltdWxhdGVfbm9wKSwKKworCS8qIEJMWCAoaW1tZWRpYXRlKQkxMTExIDEwMXggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfU0lNVUxBVEUJKDB4ZmUwMDAwMDAsIDB4ZmEwMDAwMDAsIHNpbXVsYXRlX2JseDEpLAorCisJLyogQ1BTCQkJMTExMSAwMDAxIDAwMDAgeHh4MCB4eHh4IHh4eHggeHgweCB4eHh4ICovCisJLyogU0VURU5ECQkxMTExIDAwMDEgMDAwMCAwMDAxIHh4eHggeHh4eCAwMDAwIHh4eHggKi8KKwkvKiBTUlMJCQkxMTExIDEwMHggeDF4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBSRkUJCQkxMTExIDEwMHggeDB4MSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKworCS8qIENvcHJvY2Vzc29yIGluc3RydWN0aW9ucy4uLiAqLworCS8qIE1DUlIyCQkxMTExIDExMDAgMDEwMCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBNUlJDMgkJMTExMSAxMTAwIDAxMDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogTERDMgkJCTExMTEgMTEweCB4eHgxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIFNUQzIJCQkxMTExIDExMHggeHh4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBDRFAyCQkJMTExMSAxMTEwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogTUNSMgkJCTExMTEgMTExMCB4eHgwIHh4eHggeHh4eCB4eHh4IHh4eDEgeHh4eCAqLworCS8qIE1SQzIJCQkxMTExIDExMTAgeHh4MSB4eHh4IHh4eHggeHh4eCB4eHgxIHh4eHggKi8KKworCS8qIE90aGVyIHVuYWxsb2NhdGVkIGluc3RydWN0aW9ucy4uLgkJCQkqLworCURFQ09ERV9FTkQKK307CisKK3N0YXRpYyBjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSBhcm1fY2NjY18wMDAxXzB4eDBfX19fMHh4eF90YWJsZVtdID0geworCS8qIE1pc2NlbGxhbmVvdXMgaW5zdHJ1Y3Rpb25zCQkJCQkqLworCisJLyogTVJTIGNwc3IJCWNjY2MgMDAwMSAwMDAwIHh4eHggeHh4eCB4eHh4IDAwMDAgeHh4eCAqLworCURFQ09ERV9TSU1VTEFURVgoMHgwZmYwMDBmMCwgMHgwMTAwMDAwMCwgc2ltdWxhdGVfbXJzLAorCQkJCQkJIFJFR1MoMCwgTk9QQywgMCwgMCwgMCkpLAorCisJLyogQlgJCQljY2NjIDAwMDEgMDAxMCB4eHh4IHh4eHggeHh4eCAwMDAxIHh4eHggKi8KKwlERUNPREVfU0lNVUxBVEUJKDB4MGZmMDAwZjAsIDB4MDEyMDAwMTAsIHNpbXVsYXRlX2JseDJieCksCisKKwkvKiBCTFggKHJlZ2lzdGVyKQljY2NjIDAwMDEgMDAxMCB4eHh4IHh4eHggeHh4eCAwMDExIHh4eHggKi8KKwlERUNPREVfU0lNVUxBVEVYKDB4MGZmMDAwZjAsIDB4MDEyMDAwMzAsIHNpbXVsYXRlX2JseDJieCwKKwkJCQkJCSBSRUdTKDAsIDAsIDAsIDAsIE5PUEMpKSwKKworCS8qIENMWgkJCWNjY2MgMDAwMSAwMTEwIHh4eHggeHh4eCB4eHh4IDAwMDEgeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHgwZmYwMDBmMCwgMHgwMTYwMDAxMCwgZW11bGF0ZV9yZDEycm0wX25vZmxhZ3Nfbm9wYywKKwkJCQkJCSBSRUdTKDAsIE5PUEMsIDAsIDAsIE5PUEMpKSwKKworCS8qIFFBREQJCQljY2NjIDAwMDEgMDAwMCB4eHh4IHh4eHggeHh4eCAwMTAxIHh4eHggKi8KKwkvKiBRU1VCCQkJY2NjYyAwMDAxIDAwMTAgeHh4eCB4eHh4IHh4eHggMDEwMSB4eHh4ICovCisJLyogUURBREQJCWNjY2MgMDAwMSAwMTAwIHh4eHggeHh4eCB4eHh4IDAxMDEgeHh4eCAqLworCS8qIFFEU1VCCQljY2NjIDAwMDEgMDExMCB4eHh4IHh4eHggeHh4eCAwMTAxIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGY5MDAwZjAsIDB4MDEwMDAwNTAsIGVtdWxhdGVfcmQxMnJuMTZybTBfcndmbGFnc19ub3BjLAorCQkJCQkJIFJFR1MoTk9QQywgTk9QQywgMCwgMCwgTk9QQykpLAorCisJLyogQlhKCQkJY2NjYyAwMDAxIDAwMTAgeHh4eCB4eHh4IHh4eHggMDAxMCB4eHh4ICovCisJLyogTVNSCQkJY2NjYyAwMDAxIDB4MTAgeHh4eCB4eHh4IHh4eHggMDAwMCB4eHh4ICovCisJLyogTVJTIHNwc3IJCWNjY2MgMDAwMSAwMTAwIHh4eHggeHh4eCB4eHh4IDAwMDAgeHh4eCAqLworCS8qIEJLUFQJCQkxMTEwIDAwMDEgMDAxMCB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggKi8KKwkvKiBTTUMJCQljY2NjIDAwMDEgMDExMCB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggKi8KKwkvKiBBbmQgdW5hbGxvY2F0ZWQgaW5zdHJ1Y3Rpb25zLi4uCQkJCSovCisJREVDT0RFX0VORAorfTsKKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIGFybV9jY2NjXzAwMDFfMHh4MF9fX18xeHgwX3RhYmxlW10gPSB7CisJLyogSGFsZndvcmQgbXVsdGlwbHkgYW5kIG11bHRpcGx5LWFjY3VtdWxhdGUJCQkqLworCisJLyogU01MQUx4eQkJY2NjYyAwMDAxIDAxMDAgeHh4eCB4eHh4IHh4eHggMXh4MCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBmZjAwMDkwLCAweDAxNDAwMDgwLCBlbXVsYXRlX3JkbG8xMnJkaGkxNnJuMHJtOF9yd2ZsYWdzX25vcGMsCisJCQkJCQkgUkVHUyhOT1BDLCBOT1BDLCBOT1BDLCAwLCBOT1BDKSksCisKKwkvKiBTTVVMV3kJCWNjY2MgMDAwMSAwMDEwIHh4eHggeHh4eCB4eHh4IDF4MTAgeHh4eCAqLworCURFQ09ERV9PUgkoMHgwZmYwMDBiMCwgMHgwMTIwMDBhMCksCisJLyogU01VTHh5CQljY2NjIDAwMDEgMDExMCB4eHh4IHh4eHggeHh4eCAxeHgwIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZmMDAwOTAsIDB4MDE2MDAwODAsIGVtdWxhdGVfcmQxNnJuMTJybTByczhfcndmbGFnc19ub3BjLAorCQkJCQkJIFJFR1MoTk9QQywgMCwgTk9QQywgMCwgTk9QQykpLAorCisJLyogU01MQXh5CQljY2NjIDAwMDEgMDAwMCB4eHh4IHh4eHggeHh4eCAxeHgwIHh4eHggKi8KKwlERUNPREVfT1IJKDB4MGZmMDAwOTAsIDB4MDEwMDAwODApLAorCS8qIFNNTEFXeQkJY2NjYyAwMDAxIDAwMTAgeHh4eCB4eHh4IHh4eHggMXgwMCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBmZjAwMGIwLCAweDAxMjAwMDgwLCBlbXVsYXRlX3JkMTZybjEycm0wcnM4X3J3ZmxhZ3Nfbm9wYywKKwkJCQkJCSBSRUdTKE5PUEMsIE5PUEMsIE5PUEMsIDAsIE5PUEMpKSwKKworCURFQ09ERV9FTkQKK307CisKK3N0YXRpYyBjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSBhcm1fY2NjY18wMDAwX19fX18xMDAxX3RhYmxlW10gPSB7CisJLyogTXVsdGlwbHkgYW5kIG11bHRpcGx5LWFjY3VtdWxhdGUJCQkJKi8KKworCS8qIE1VTAkJCWNjY2MgMDAwMCAwMDAwIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCAqLworCS8qIE1VTFMJCQljY2NjIDAwMDAgMDAwMSB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZlMDAwZjAsIDB4MDAwMDAwOTAsIGVtdWxhdGVfcmQxNnJuMTJybTByczhfcndmbGFnc19ub3BjLAorCQkJCQkJIFJFR1MoTk9QQywgMCwgTk9QQywgMCwgTk9QQykpLAorCisJLyogTUxBCQkJY2NjYyAwMDAwIDAwMTAgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4ICovCisJLyogTUxBUwkJCWNjY2MgMDAwMCAwMDExIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCAqLworCURFQ09ERV9PUgkoMHgwZmUwMDBmMCwgMHgwMDIwMDA5MCksCisJLyogTUxTCQkJY2NjYyAwMDAwIDAxMTAgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBmZjAwMGYwLCAweDAwNjAwMDkwLCBlbXVsYXRlX3JkMTZybjEycm0wcnM4X3J3ZmxhZ3Nfbm9wYywKKwkJCQkJCSBSRUdTKE5PUEMsIE5PUEMsIE5PUEMsIDAsIE5PUEMpKSwKKworCS8qIFVNQUFMCQljY2NjIDAwMDAgMDEwMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KKwlERUNPREVfT1IJKDB4MGZmMDAwZjAsIDB4MDA0MDAwOTApLAorCS8qIFVNVUxMCQljY2NjIDAwMDAgMTAwMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KKwkvKiBVTVVMTFMJCWNjY2MgMDAwMCAxMDAxIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCAqLworCS8qIFVNTEFMCQljY2NjIDAwMDAgMTAxMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KKwkvKiBVTUxBTFMJCWNjY2MgMDAwMCAxMDExIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCAqLworCS8qIFNNVUxMCQljY2NjIDAwMDAgMTEwMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KKwkvKiBTTVVMTFMJCWNjY2MgMDAwMCAxMTAxIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCAqLworCS8qIFNNTEFMCQljY2NjIDAwMDAgMTExMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KKwkvKiBTTUxBTFMJCWNjY2MgMDAwMCAxMTExIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHgwZjgwMDBmMCwgMHgwMDgwMDA5MCwgZW11bGF0ZV9yZGxvMTJyZGhpMTZybjBybThfcndmbGFnc19ub3BjLAorCQkJCQkJIFJFR1MoTk9QQywgTk9QQywgTk9QQywgMCwgTk9QQykpLAorCisJREVDT0RFX0VORAorfTsKKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIGFybV9jY2NjXzAwMDFfX19fXzEwMDFfdGFibGVbXSA9IHsKKwkvKiBTeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcwkJCQkJKi8KKworCS8qIFNNUC9TV1BCCQljY2NjIDAwMDEgMHgwMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZiMDAwZjAsIDB4MDEwMDAwOTAsIGVtdWxhdGVfcmQxMnJuMTZybTBfcndmbGFnc19ub3BjLAorCQkJCQkJIFJFR1MoTk9QQywgTk9QQywgMCwgMCwgTk9QQykpLAorCisJLyogTERSRVgvU1RSRVh7LEQsQixIfQljY2NjIDAwMDEgMXh4eCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KKwkvKiBBbmQgdW5hbGxvY2F0ZWQgaW5zdHJ1Y3Rpb25zLi4uCQkJCSovCisJREVDT0RFX0VORAorfTsKKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIGFybV9jY2NjXzAwMHhfX19fXzF4eDFfdGFibGVbXSA9IHsKKwkvKiBFeHRyYSBsb2FkL3N0b3JlIGluc3RydWN0aW9ucwkJCQkqLworCisJLyogU1RSSFQJCWNjY2MgMDAwMCB4eDEwIHh4eHggeHh4eCB4eHh4IDEwMTEgeHh4eCAqLworCS8qID8/PwkJCWNjY2MgMDAwMCB4eDEwIHh4eHggeHh4eCB4eHh4IDExeDEgeHh4eCAqLworCS8qIExEUkhUCQljY2NjIDAwMDAgeHgxMSB4eHh4IHh4eHggeHh4eCAxMDExIHh4eHggKi8KKwkvKiBMRFJTQlQJCWNjY2MgMDAwMCB4eDExIHh4eHggeHh4eCB4eHh4IDExMDEgeHh4eCAqLworCS8qIExEUlNIVAkJY2NjYyAwMDAwIHh4MTEgeHh4eCB4eHh4IHh4eHggMTExMSB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHgwZjIwMDA5MCwgMHgwMDIwMDA5MCksCisKKwkvKiBMRFJEL1NUUkQgbHIscGMsey4uLgljY2NjIDAwMHggeDB4MCB4eHh4IDExMXggeHh4eCAxMTAxIHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweDBlMTBlMGQwLCAweDAwMDBlMGQwKSwKKworCS8qIExEUkQgKHJlZ2lzdGVyKQljY2NjIDAwMHggeDB4MCB4eHh4IHh4eHggeHh4eCAxMTAxIHh4eHggKi8KKwkvKiBTVFJEIChyZWdpc3RlcikJY2NjYyAwMDB4IHgweDAgeHh4eCB4eHh4IHh4eHggMTExMSB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBlNTAwMGQwLCAweDAwMDAwMGQwLCBlbXVsYXRlX2xkcmRzdHJkLAorCQkJCQkJIFJFR1MoTk9QQ1dCLCBOT1BDWCwgMCwgMCwgTk9QQykpLAorCisJLyogTERSRCAoaW1tZWRpYXRlKQljY2NjIDAwMHggeDF4MCB4eHh4IHh4eHggeHh4eCAxMTAxIHh4eHggKi8KKwkvKiBTVFJEIChpbW1lZGlhdGUpCWNjY2MgMDAweCB4MXgwIHh4eHggeHh4eCB4eHh4IDExMTEgeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHgwZTUwMDBkMCwgMHgwMDQwMDBkMCwgZW11bGF0ZV9sZHJkc3RyZCwKKwkJCQkJCSBSRUdTKE5PUENXQiwgTk9QQ1gsIDAsIDAsIDApKSwKKworCS8qIFNUUkggKHJlZ2lzdGVyKQljY2NjIDAwMHggeDB4MCB4eHh4IHh4eHggeHh4eCAxMDExIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGU1MDAwZjAsIDB4MDAwMDAwYjAsIGVtdWxhdGVfc3RyLAorCQkJCQkJIFJFR1MoTk9QQ1dCLCBOT1BDLCAwLCAwLCBOT1BDKSksCisKKwkvKiBMRFJIIChyZWdpc3RlcikJY2NjYyAwMDB4IHgweDEgeHh4eCB4eHh4IHh4eHggMTAxMSB4eHh4ICovCisJLyogTERSU0IgKHJlZ2lzdGVyKQljY2NjIDAwMHggeDB4MSB4eHh4IHh4eHggeHh4eCAxMTAxIHh4eHggKi8KKwkvKiBMRFJTSCAocmVnaXN0ZXIpCWNjY2MgMDAweCB4MHgxIHh4eHggeHh4eCB4eHh4IDExMTEgeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHgwZTUwMDA5MCwgMHgwMDEwMDA5MCwgZW11bGF0ZV9sZHIsCisJCQkJCQkgUkVHUyhOT1BDV0IsIE5PUEMsIDAsIDAsIE5PUEMpKSwKKworCS8qIFNUUkggKGltbWVkaWF0ZSkJY2NjYyAwMDB4IHgxeDAgeHh4eCB4eHh4IHh4eHggMTAxMSB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBlNTAwMGYwLCAweDAwNDAwMGIwLCBlbXVsYXRlX3N0ciwKKwkJCQkJCSBSRUdTKE5PUENXQiwgTk9QQywgMCwgMCwgMCkpLAorCisJLyogTERSSCAoaW1tZWRpYXRlKQljY2NjIDAwMHggeDF4MSB4eHh4IHh4eHggeHh4eCAxMDExIHh4eHggKi8KKwkvKiBMRFJTQiAoaW1tZWRpYXRlKQljY2NjIDAwMHggeDF4MSB4eHh4IHh4eHggeHh4eCAxMTAxIHh4eHggKi8KKwkvKiBMRFJTSCAoaW1tZWRpYXRlKQljY2NjIDAwMHggeDF4MSB4eHh4IHh4eHggeHh4eCAxMTExIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGU1MDAwOTAsIDB4MDA1MDAwOTAsIGVtdWxhdGVfbGRyLAorCQkJCQkJIFJFR1MoTk9QQ1dCLCBOT1BDLCAwLCAwLCAwKSksCisKKwlERUNPREVfRU5ECit9OworCitzdGF0aWMgY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gYXJtX2NjY2NfMDAweF90YWJsZVtdID0geworCS8qIERhdGEtcHJvY2Vzc2luZyAocmVnaXN0ZXIpCQkJCQkqLworCisJLyogPG9wPlMgUEMsIC4uLgljY2NjIDAwMHggeHh4MSB4eHh4IDExMTEgeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweDBlMTBmMDAwLCAweDAwMTBmMDAwKSwKKworCS8qIE1PViBJUCwgU1AJCTExMTAgMDAwMSAxMDEwIDAwMDAgMTEwMCAwMDAwIDAwMDAgMTEwMSAqLworCURFQ09ERV9TSU1VTEFURQkoMHhmZmZmZmZmZiwgMHhlMWEwYzAwZCwgc2ltdWxhdGVfbW92X2lwc3ApLAorCisJLyogVFNUIChyZWdpc3RlcikJY2NjYyAwMDAxIDAwMDEgeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogVEVRIChyZWdpc3RlcikJY2NjYyAwMDAxIDAwMTEgeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogQ01QIChyZWdpc3RlcikJY2NjYyAwMDAxIDAxMDEgeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogQ01OIChyZWdpc3RlcikJY2NjYyAwMDAxIDAxMTEgeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBmOTAwMDEwLCAweDAxMTAwMDAwLCBlbXVsYXRlX3JkMTJybjE2cm0wcnM4X3J3ZmxhZ3MsCisJCQkJCQkgUkVHUyhBTlksIDAsIDAsIDAsIEFOWSkpLAorCisJLyogTU9WIChyZWdpc3RlcikJY2NjYyAwMDAxIDEwMXggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogTVZOIChyZWdpc3RlcikJY2NjYyAwMDAxIDExMXggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBmYTAwMDEwLCAweDAxYTAwMDAwLCBlbXVsYXRlX3JkMTJybjE2cm0wcnM4X3J3ZmxhZ3MsCisJCQkJCQkgUkVHUygwLCBBTlksIDAsIDAsIEFOWSkpLAorCisJLyogQU5EIChyZWdpc3RlcikJY2NjYyAwMDAwIDAwMHggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogRU9SIChyZWdpc3RlcikJY2NjYyAwMDAwIDAwMXggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogU1VCIChyZWdpc3RlcikJY2NjYyAwMDAwIDAxMHggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogUlNCIChyZWdpc3RlcikJY2NjYyAwMDAwIDAxMXggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogQUREIChyZWdpc3RlcikJY2NjYyAwMDAwIDEwMHggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogQURDIChyZWdpc3RlcikJY2NjYyAwMDAwIDEwMXggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogU0JDIChyZWdpc3RlcikJY2NjYyAwMDAwIDExMHggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogUlNDIChyZWdpc3RlcikJY2NjYyAwMDAwIDExMXggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogT1JSIChyZWdpc3RlcikJY2NjYyAwMDAxIDEwMHggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJLyogQklDIChyZWdpc3RlcikJY2NjYyAwMDAxIDExMHggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBlMDAwMDEwLCAweDAwMDAwMDAwLCBlbXVsYXRlX3JkMTJybjE2cm0wcnM4X3J3ZmxhZ3MsCisJCQkJCQkgUkVHUyhBTlksIEFOWSwgMCwgMCwgQU5ZKSksCisKKwkvKiBUU1QgKHJlZy1zaGlmdCByZWcpCWNjY2MgMDAwMSAwMDAxIHh4eHggeHh4eCB4eHh4IDB4eDEgeHh4eCAqLworCS8qIFRFUSAocmVnLXNoaWZ0IHJlZykJY2NjYyAwMDAxIDAwMTEgeHh4eCB4eHh4IHh4eHggMHh4MSB4eHh4ICovCisJLyogQ01QIChyZWctc2hpZnQgcmVnKQljY2NjIDAwMDEgMDEwMSB4eHh4IHh4eHggeHh4eCAweHgxIHh4eHggKi8KKwkvKiBDTU4gKHJlZy1zaGlmdCByZWcpCWNjY2MgMDAwMSAwMTExIHh4eHggeHh4eCB4eHh4IDB4eDEgeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHgwZjkwMDA5MCwgMHgwMTEwMDAxMCwgZW11bGF0ZV9yZDEycm4xNnJtMHJzOF9yd2ZsYWdzLAorCQkJCQkJIFJFR1MoQU5ZLCAwLCBOT1BDLCAwLCBBTlkpKSwKKworCS8qIE1PViAocmVnLXNoaWZ0IHJlZykJY2NjYyAwMDAxIDEwMXggeHh4eCB4eHh4IHh4eHggMHh4MSB4eHh4ICovCisJLyogTVZOIChyZWctc2hpZnQgcmVnKQljY2NjIDAwMDEgMTExeCB4eHh4IHh4eHggeHh4eCAweHgxIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZhMDAwOTAsIDB4MDFhMDAwMTAsIGVtdWxhdGVfcmQxMnJuMTZybTByczhfcndmbGFncywKKwkJCQkJCSBSRUdTKDAsIEFOWSwgTk9QQywgMCwgQU5ZKSksCisKKwkvKiBBTkQgKHJlZy1zaGlmdCByZWcpCWNjY2MgMDAwMCAwMDB4IHh4eHggeHh4eCB4eHh4IDB4eDEgeHh4eCAqLworCS8qIEVPUiAocmVnLXNoaWZ0IHJlZykJY2NjYyAwMDAwIDAwMXggeHh4eCB4eHh4IHh4eHggMHh4MSB4eHh4ICovCisJLyogU1VCIChyZWctc2hpZnQgcmVnKQljY2NjIDAwMDAgMDEweCB4eHh4IHh4eHggeHh4eCAweHgxIHh4eHggKi8KKwkvKiBSU0IgKHJlZy1zaGlmdCByZWcpCWNjY2MgMDAwMCAwMTF4IHh4eHggeHh4eCB4eHh4IDB4eDEgeHh4eCAqLworCS8qIEFERCAocmVnLXNoaWZ0IHJlZykJY2NjYyAwMDAwIDEwMHggeHh4eCB4eHh4IHh4eHggMHh4MSB4eHh4ICovCisJLyogQURDIChyZWctc2hpZnQgcmVnKQljY2NjIDAwMDAgMTAxeCB4eHh4IHh4eHggeHh4eCAweHgxIHh4eHggKi8KKwkvKiBTQkMgKHJlZy1zaGlmdCByZWcpCWNjY2MgMDAwMCAxMTB4IHh4eHggeHh4eCB4eHh4IDB4eDEgeHh4eCAqLworCS8qIFJTQyAocmVnLXNoaWZ0IHJlZykJY2NjYyAwMDAwIDExMXggeHh4eCB4eHh4IHh4eHggMHh4MSB4eHh4ICovCisJLyogT1JSIChyZWctc2hpZnQgcmVnKQljY2NjIDAwMDEgMTAweCB4eHh4IHh4eHggeHh4eCAweHgxIHh4eHggKi8KKwkvKiBCSUMgKHJlZy1zaGlmdCByZWcpCWNjY2MgMDAwMSAxMTB4IHh4eHggeHh4eCB4eHh4IDB4eDEgeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHgwZTAwMDA5MCwgMHgwMDAwMDAxMCwgZW11bGF0ZV9yZDEycm4xNnJtMHJzOF9yd2ZsYWdzLAorCQkJCQkJIFJFR1MoQU5ZLCBBTlksIE5PUEMsIDAsIEFOWSkpLAorCisJREVDT0RFX0VORAorfTsKKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIGFybV9jY2NjXzAwMXhfdGFibGVbXSA9IHsKKwkvKiBEYXRhLXByb2Nlc3NpbmcgKGltbWVkaWF0ZSkJCQkJCSovCisKKwkvKiBNT1ZXCQkJY2NjYyAwMDExIDAwMDAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogTU9WVAkJCWNjY2MgMDAxMSAwMTAwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHgwZmIwMDAwMCwgMHgwMzAwMDAwMCwgZW11bGF0ZV9yZDEycm0wX25vZmxhZ3Nfbm9wYywKKwkJCQkJCSBSRUdTKDAsIE5PUEMsIDAsIDAsIDApKSwKKworCS8qIFlJRUxECQljY2NjIDAwMTEgMDAxMCAwMDAwIHh4eHggeHh4eCAwMDAwIDAwMDEgKi8KKwlERUNPREVfT1IJKDB4MGZmZjAwZmYsIDB4MDMyMDAwMDEpLAorCS8qIFNFVgkJCWNjY2MgMDAxMSAwMDEwIDAwMDAgeHh4eCB4eHh4IDAwMDAgMDEwMCAqLworCURFQ09ERV9FTVVMQVRFCSgweDBmZmYwMGZmLCAweDAzMjAwMDA0LCBrcHJvYmVfZW11bGF0ZV9ub25lKSwKKwkvKiBOT1AJCQljY2NjIDAwMTEgMDAxMCAwMDAwIHh4eHggeHh4eCAwMDAwIDAwMDAgKi8KKwkvKiBXRkUJCQljY2NjIDAwMTEgMDAxMCAwMDAwIHh4eHggeHh4eCAwMDAwIDAwMTAgKi8KKwkvKiBXRkkJCQljY2NjIDAwMTEgMDAxMCAwMDAwIHh4eHggeHh4eCAwMDAwIDAwMTEgKi8KKwlERUNPREVfU0lNVUxBVEUJKDB4MGZmZjAwZmMsIDB4MDMyMDAwMDAsIGtwcm9iZV9zaW11bGF0ZV9ub3ApLAorCS8qIERCRwkJCWNjY2MgMDAxMSAwMDEwIDAwMDAgeHh4eCB4eHh4IGZmZmYgeHh4eCAqLworCS8qIHVuYWxsb2NhdGVkIGhpbnRzCWNjY2MgMDAxMSAwMDEwIDAwMDAgeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIE1TUiAoaW1tZWRpYXRlKQljY2NjIDAwMTEgMHgxMCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweDBmYjAwMDAwLCAweDAzMjAwMDAwKSwKKworCS8qIDxvcD5TIFBDLCAuLi4JY2NjYyAwMDF4IHh4eDEgeHh4eCAxMTExIHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHgwZTEwZjAwMCwgMHgwMjEwZjAwMCksCisKKwkvKiBUU1QgKGltbWVkaWF0ZSkJY2NjYyAwMDExIDAwMDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogVEVRIChpbW1lZGlhdGUpCWNjY2MgMDAxMSAwMDExIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIENNUCAoaW1tZWRpYXRlKQljY2NjIDAwMTEgMDEwMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBDTU4gKGltbWVkaWF0ZSkJY2NjYyAwMDExIDAxMTEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBmOTAwMDAwLCAweDAzMTAwMDAwLCBlbXVsYXRlX3JkMTJybjE2cm0wcnM4X3J3ZmxhZ3MsCisJCQkJCQkgUkVHUyhBTlksIDAsIDAsIDAsIDApKSwKKworCS8qIE1PViAoaW1tZWRpYXRlKQljY2NjIDAwMTEgMTAxeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBNVk4gKGltbWVkaWF0ZSkJY2NjYyAwMDExIDExMXggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBmYTAwMDAwLCAweDAzYTAwMDAwLCBlbXVsYXRlX3JkMTJybjE2cm0wcnM4X3J3ZmxhZ3MsCisJCQkJCQkgUkVHUygwLCBBTlksIDAsIDAsIDApKSwKKworCS8qIEFORCAoaW1tZWRpYXRlKQljY2NjIDAwMTAgMDAweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBFT1IgKGltbWVkaWF0ZSkJY2NjYyAwMDEwIDAwMXggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogU1VCIChpbW1lZGlhdGUpCWNjY2MgMDAxMCAwMTB4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIFJTQiAoaW1tZWRpYXRlKQljY2NjIDAwMTAgMDExeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBBREQgKGltbWVkaWF0ZSkJY2NjYyAwMDEwIDEwMHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogQURDIChpbW1lZGlhdGUpCWNjY2MgMDAxMCAxMDF4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIFNCQyAoaW1tZWRpYXRlKQljY2NjIDAwMTAgMTEweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBSU0MgKGltbWVkaWF0ZSkJY2NjYyAwMDEwIDExMXggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogT1JSIChpbW1lZGlhdGUpCWNjY2MgMDAxMSAxMDB4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIEJJQyAoaW1tZWRpYXRlKQljY2NjIDAwMTEgMTEweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGUwMDAwMDAsIDB4MDIwMDAwMDAsIGVtdWxhdGVfcmQxMnJuMTZybTByczhfcndmbGFncywKKwkJCQkJCSBSRUdTKEFOWSwgQU5ZLCAwLCAwLCAwKSksCisKKwlERUNPREVfRU5ECit9OworCitzdGF0aWMgY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gYXJtX2NjY2NfMDExMF9fX19feHh4MV90YWJsZVtdID0geworCS8qIE1lZGlhIGluc3RydWN0aW9ucwkJCQkJCSovCisKKwkvKiBTRUwJCQljY2NjIDAxMTAgMTAwMCB4eHh4IHh4eHggeHh4eCAxMDExIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZmMDAwZjAsIDB4MDY4MDAwYjAsIGVtdWxhdGVfcmQxMnJuMTZybTBfcndmbGFnc19ub3BjLAorCQkJCQkJIFJFR1MoTk9QQywgTk9QQywgMCwgMCwgTk9QQykpLAorCisJLyogU1NBVAkJCWNjY2MgMDExMCAxMDF4IHh4eHggeHh4eCB4eHh4IHh4MDEgeHh4eCAqLworCS8qIFVTQVQJCQljY2NjIDAxMTAgMTExeCB4eHh4IHh4eHggeHh4eCB4eDAxIHh4eHggKi8KKwlERUNPREVfT1IoMHgwZmEwMDAzMCwgMHgwNmEwMDAxMCksCisJLyogU1NBVDE2CQljY2NjIDAxMTAgMTAxMCB4eHh4IHh4eHggeHh4eCAwMDExIHh4eHggKi8KKwkvKiBVU0FUMTYJCWNjY2MgMDExMCAxMTEwIHh4eHggeHh4eCB4eHh4IDAwMTEgeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHgwZmIwMDBmMCwgMHgwNmEwMDAzMCwgZW11bGF0ZV9yZDEycm4xNnJtMF9yd2ZsYWdzX25vcGMsCisJCQkJCQkgUkVHUygwLCBOT1BDLCAwLCAwLCBOT1BDKSksCisKKwkvKiBSRVYJCQljY2NjIDAxMTAgMTAxMSB4eHh4IHh4eHggeHh4eCAwMDExIHh4eHggKi8KKwkvKiBSRVYxNgkJY2NjYyAwMTEwIDEwMTEgeHh4eCB4eHh4IHh4eHggMTAxMSB4eHh4ICovCisJLyogUkJJVAkJCWNjY2MgMDExMCAxMTExIHh4eHggeHh4eCB4eHh4IDAwMTEgeHh4eCAqLworCS8qIFJFVlNICQljY2NjIDAxMTAgMTExMSB4eHh4IHh4eHggeHh4eCAxMDExIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZiMDAwNzAsIDB4MDZiMDAwMzAsIGVtdWxhdGVfcmQxMnJtMF9ub2ZsYWdzX25vcGMsCisJCQkJCQkgUkVHUygwLCBOT1BDLCAwLCAwLCBOT1BDKSksCisKKwkvKiA/Pz8JCQljY2NjIDAxMTAgMHgwMCB4eHh4IHh4eHggeHh4eCB4eHgxIHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweDBmYjAwMDEwLCAweDA2MDAwMDEwKSwKKwkvKiA/Pz8JCQljY2NjIDAxMTAgMHh4eCB4eHh4IHh4eHggeHh4eCAxMDExIHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweDBmODAwMGYwLCAweDA2MDAwMGIwKSwKKwkvKiA/Pz8JCQljY2NjIDAxMTAgMHh4eCB4eHh4IHh4eHggeHh4eCAxMTAxIHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweDBmODAwMGYwLCAweDA2MDAwMGQwKSwKKwkvKiBTQUREMTYJCWNjY2MgMDExMCAwMDAxIHh4eHggeHh4eCB4eHh4IDAwMDEgeHh4eCAqLworCS8qIFNBRERTVUJYCQljY2NjIDAxMTAgMDAwMSB4eHh4IHh4eHggeHh4eCAwMDExIHh4eHggKi8KKwkvKiBTU1VCQUREWAkJY2NjYyAwMTEwIDAwMDEgeHh4eCB4eHh4IHh4eHggMDEwMSB4eHh4ICovCisJLyogU1NVQjE2CQljY2NjIDAxMTAgMDAwMSB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggKi8KKwkvKiBTQUREOAkJY2NjYyAwMTEwIDAwMDEgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4ICovCisJLyogU1NVQjgJCWNjY2MgMDExMCAwMDAxIHh4eHggeHh4eCB4eHh4IDExMTEgeHh4eCAqLworCS8qIFFBREQxNgkJY2NjYyAwMTEwIDAwMTAgeHh4eCB4eHh4IHh4eHggMDAwMSB4eHh4ICovCisJLyogUUFERFNVQlgJCWNjY2MgMDExMCAwMDEwIHh4eHggeHh4eCB4eHh4IDAwMTEgeHh4eCAqLworCS8qIFFTVUJBRERYCQljY2NjIDAxMTAgMDAxMCB4eHh4IHh4eHggeHh4eCAwMTAxIHh4eHggKi8KKwkvKiBRU1VCMTYJCWNjY2MgMDExMCAwMDEwIHh4eHggeHh4eCB4eHh4IDAxMTEgeHh4eCAqLworCS8qIFFBREQ4CQljY2NjIDAxMTAgMDAxMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KKwkvKiBRU1VCOAkJY2NjYyAwMTEwIDAwMTAgeHh4eCB4eHh4IHh4eHggMTExMSB4eHh4ICovCisJLyogU0hBREQxNgkJY2NjYyAwMTEwIDAwMTEgeHh4eCB4eHh4IHh4eHggMDAwMSB4eHh4ICovCisJLyogU0hBRERTVUJYCQljY2NjIDAxMTAgMDAxMSB4eHh4IHh4eHggeHh4eCAwMDExIHh4eHggKi8KKwkvKiBTSFNVQkFERFgJCWNjY2MgMDExMCAwMDExIHh4eHggeHh4eCB4eHh4IDAxMDEgeHh4eCAqLworCS8qIFNIU1VCMTYJCWNjY2MgMDExMCAwMDExIHh4eHggeHh4eCB4eHh4IDAxMTEgeHh4eCAqLworCS8qIFNIQUREOAkJY2NjYyAwMTEwIDAwMTEgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4ICovCisJLyogU0hTVUI4CQljY2NjIDAxMTAgMDAxMSB4eHh4IHh4eHggeHh4eCAxMTExIHh4eHggKi8KKwkvKiBVQUREMTYJCWNjY2MgMDExMCAwMTAxIHh4eHggeHh4eCB4eHh4IDAwMDEgeHh4eCAqLworCS8qIFVBRERTVUJYCQljY2NjIDAxMTAgMDEwMSB4eHh4IHh4eHggeHh4eCAwMDExIHh4eHggKi8KKwkvKiBVU1VCQUREWAkJY2NjYyAwMTEwIDAxMDEgeHh4eCB4eHh4IHh4eHggMDEwMSB4eHh4ICovCisJLyogVVNVQjE2CQljY2NjIDAxMTAgMDEwMSB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggKi8KKwkvKiBVQUREOAkJY2NjYyAwMTEwIDAxMDEgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4ICovCisJLyogVVNVQjgJCWNjY2MgMDExMCAwMTAxIHh4eHggeHh4eCB4eHh4IDExMTEgeHh4eCAqLworCS8qIFVRQUREMTYJCWNjY2MgMDExMCAwMTEwIHh4eHggeHh4eCB4eHh4IDAwMDEgeHh4eCAqLworCS8qIFVRQUREU1VCWAkJY2NjYyAwMTEwIDAxMTAgeHh4eCB4eHh4IHh4eHggMDAxMSB4eHh4ICovCisJLyogVVFTVUJBRERYCQljY2NjIDAxMTAgMDExMCB4eHh4IHh4eHggeHh4eCAwMTAxIHh4eHggKi8KKwkvKiBVUVNVQjE2CQljY2NjIDAxMTAgMDExMCB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggKi8KKwkvKiBVUUFERDgJCWNjY2MgMDExMCAwMTEwIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCAqLworCS8qIFVRU1VCOAkJY2NjYyAwMTEwIDAxMTAgeHh4eCB4eHh4IHh4eHggMTExMSB4eHh4ICovCisJLyogVUhBREQxNgkJY2NjYyAwMTEwIDAxMTEgeHh4eCB4eHh4IHh4eHggMDAwMSB4eHh4ICovCisJLyogVUhBRERTVUJYCQljY2NjIDAxMTAgMDExMSB4eHh4IHh4eHggeHh4eCAwMDExIHh4eHggKi8KKwkvKiBVSFNVQkFERFgJCWNjY2MgMDExMCAwMTExIHh4eHggeHh4eCB4eHh4IDAxMDEgeHh4eCAqLworCS8qIFVIU1VCMTYJCWNjY2MgMDExMCAwMTExIHh4eHggeHh4eCB4eHh4IDAxMTEgeHh4eCAqLworCS8qIFVIQUREOAkJY2NjYyAwMTEwIDAxMTEgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4ICovCisJLyogVUhTVUI4CQljY2NjIDAxMTAgMDExMSB4eHh4IHh4eHggeHh4eCAxMTExIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGY4MDAwMTAsIDB4MDYwMDAwMTAsIGVtdWxhdGVfcmQxMnJuMTZybTBfcndmbGFnc19ub3BjLAorCQkJCQkJIFJFR1MoTk9QQywgTk9QQywgMCwgMCwgTk9QQykpLAorCisJLyogUEtIQlQJCWNjY2MgMDExMCAxMDAwIHh4eHggeHh4eCB4eHh4IHgwMDEgeHh4eCAqLworCS8qIFBLSFRCCQljY2NjIDAxMTAgMTAwMCB4eHh4IHh4eHggeHh4eCB4MTAxIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZmMDAwMzAsIDB4MDY4MDAwMTAsIGVtdWxhdGVfcmQxMnJuMTZybTBfcndmbGFnc19ub3BjLAorCQkJCQkJIFJFR1MoTk9QQywgTk9QQywgMCwgMCwgTk9QQykpLAorCisJLyogPz8/CQkJY2NjYyAwMTEwIDEwMDEgeHh4eCB4eHh4IHh4eHggMDExMSB4eHh4ICovCisJLyogPz8/CQkJY2NjYyAwMTEwIDExMDEgeHh4eCB4eHh4IHh4eHggMDExMSB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHgwZmIwMDBmMCwgMHgwNjkwMDA3MCksCisKKwkvKiBTWFRCMTYJCWNjY2MgMDExMCAxMDAwIDExMTEgeHh4eCB4eHh4IDAxMTEgeHh4eCAqLworCS8qIFNYVEIJCQljY2NjIDAxMTAgMTAxMCAxMTExIHh4eHggeHh4eCAwMTExIHh4eHggKi8KKwkvKiBTWFRICQkJY2NjYyAwMTEwIDEwMTEgMTExMSB4eHh4IHh4eHggMDExMSB4eHh4ICovCisJLyogVVhUQjE2CQljY2NjIDAxMTAgMTEwMCAxMTExIHh4eHggeHh4eCAwMTExIHh4eHggKi8KKwkvKiBVWFRCCQkJY2NjYyAwMTEwIDExMTAgMTExMSB4eHh4IHh4eHggMDExMSB4eHh4ICovCisJLyogVVhUSAkJCWNjY2MgMDExMCAxMTExIDExMTEgeHh4eCB4eHh4IDAxMTEgeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHgwZjhmMDBmMCwgMHgwNjhmMDA3MCwgZW11bGF0ZV9yZDEycm0wX25vZmxhZ3Nfbm9wYywKKwkJCQkJCSBSRUdTKDAsIE5PUEMsIDAsIDAsIE5PUEMpKSwKKworCS8qIFNYVEFCMTYJCWNjY2MgMDExMCAxMDAwIHh4eHggeHh4eCB4eHh4IDAxMTEgeHh4eCAqLworCS8qIFNYVEFCCQljY2NjIDAxMTAgMTAxMCB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggKi8KKwkvKiBTWFRBSAkJY2NjYyAwMTEwIDEwMTEgeHh4eCB4eHh4IHh4eHggMDExMSB4eHh4ICovCisJLyogVVhUQUIxNgkJY2NjYyAwMTEwIDExMDAgeHh4eCB4eHh4IHh4eHggMDExMSB4eHh4ICovCisJLyogVVhUQUIJCWNjY2MgMDExMCAxMTEwIHh4eHggeHh4eCB4eHh4IDAxMTEgeHh4eCAqLworCS8qIFVYVEFICQljY2NjIDAxMTAgMTExMSB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGY4MDAwZjAsIDB4MDY4MDAwNzAsIGVtdWxhdGVfcmQxMnJuMTZybTBfcndmbGFnc19ub3BjLAorCQkJCQkJIFJFR1MoTk9QQ1gsIE5PUEMsIDAsIDAsIE5PUEMpKSwKKworCURFQ09ERV9FTkQKK307CisKK3N0YXRpYyBjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSBhcm1fY2NjY18wMTExX19fX194eHgxX3RhYmxlW10gPSB7CisJLyogTWVkaWEgaW5zdHJ1Y3Rpb25zCQkJCQkJKi8KKworCS8qIFVOREVGSU5FRAkJY2NjYyAwMTExIDExMTEgeHh4eCB4eHh4IHh4eHggMTExMSB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHgwZmYwMDBmMCwgMHgwN2YwMDBmMCksCisKKwkvKiBTTUxBTEQJCWNjY2MgMDExMSAwMTAwIHh4eHggeHh4eCB4eHh4IDAweDEgeHh4eCAqLworCS8qIFNNTFNMRAkJY2NjYyAwMTExIDAxMDAgeHh4eCB4eHh4IHh4eHggMDF4MSB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBmZjAwMDkwLCAweDA3NDAwMDEwLCBlbXVsYXRlX3JkbG8xMnJkaGkxNnJuMHJtOF9yd2ZsYWdzX25vcGMsCisJCQkJCQkgUkVHUyhOT1BDLCBOT1BDLCBOT1BDLCAwLCBOT1BDKSksCisKKwkvKiBTTVVBRAkJY2NjYyAwMTExIDAwMDAgeHh4eCAxMTExIHh4eHggMDB4MSB4eHh4ICovCisJLyogU01VU0QJCWNjY2MgMDExMSAwMDAwIHh4eHggMTExMSB4eHh4IDAxeDEgeHh4eCAqLworCURFQ09ERV9PUgkoMHgwZmYwZjA5MCwgMHgwNzAwZjAxMCksCisJLyogU01NVUwJCWNjY2MgMDExMSAwMTAxIHh4eHggMTExMSB4eHh4IDAweDEgeHh4eCAqLworCURFQ09ERV9PUgkoMHgwZmYwZjBkMCwgMHgwNzUwZjAxMCksCisJLyogVVNBRDgJCWNjY2MgMDExMSAxMDAwIHh4eHggMTExMSB4eHh4IDAwMDEgeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHgwZmYwZjBmMCwgMHgwNzgwZjAxMCwgZW11bGF0ZV9yZDE2cm4xMnJtMHJzOF9yd2ZsYWdzX25vcGMsCisJCQkJCQkgUkVHUyhOT1BDLCAwLCBOT1BDLCAwLCBOT1BDKSksCisKKwkvKiBTTUxBRAkJY2NjYyAwMTExIDAwMDAgeHh4eCB4eHh4IHh4eHggMDB4MSB4eHh4ICovCisJLyogU01MU0QJCWNjY2MgMDExMSAwMDAwIHh4eHggeHh4eCB4eHh4IDAxeDEgeHh4eCAqLworCURFQ09ERV9PUgkoMHgwZmYwMDA5MCwgMHgwNzAwMDAxMCksCisJLyogU01NTEEJCWNjY2MgMDExMSAwMTAxIHh4eHggeHh4eCB4eHh4IDAweDEgeHh4eCAqLworCURFQ09ERV9PUgkoMHgwZmYwMDBkMCwgMHgwNzUwMDAxMCksCisJLyogVVNBREE4CQljY2NjIDAxMTEgMTAwMCB4eHh4IHh4eHggeHh4eCAwMDAxIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZmMDAwZjAsIDB4MDc4MDAwMTAsIGVtdWxhdGVfcmQxNnJuMTJybTByczhfcndmbGFnc19ub3BjLAorCQkJCQkJIFJFR1MoTk9QQywgTk9QQ1gsIE5PUEMsIDAsIE5PUEMpKSwKKworCS8qIFNNTUxTCQljY2NjIDAxMTEgMDEwMSB4eHh4IHh4eHggeHh4eCAxMXgxIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZmMDAwZDAsIDB4MDc1MDAwZDAsIGVtdWxhdGVfcmQxNnJuMTJybTByczhfcndmbGFnc19ub3BjLAorCQkJCQkJIFJFR1MoTk9QQywgTk9QQywgTk9QQywgMCwgTk9QQykpLAorCisJLyogU0JGWAkJCWNjY2MgMDExMSAxMDF4IHh4eHggeHh4eCB4eHh4IHgxMDEgeHh4eCAqLworCS8qIFVCRlgJCQljY2NjIDAxMTEgMTExeCB4eHh4IHh4eHggeHh4eCB4MTAxIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZhMDAwNzAsIDB4MDdhMDAwNTAsIGVtdWxhdGVfcmQxMnJtMF9ub2ZsYWdzX25vcGMsCisJCQkJCQkgUkVHUygwLCBOT1BDLCAwLCAwLCBOT1BDKSksCisKKwkvKiBCRkMJCQljY2NjIDAxMTEgMTEweCB4eHh4IHh4eHggeHh4eCB4MDAxIDExMTEgKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZlMDAwN2YsIDB4MDdjMDAwMWYsIGVtdWxhdGVfcmQxMnJtMF9ub2ZsYWdzX25vcGMsCisJCQkJCQkgUkVHUygwLCBOT1BDLCAwLCAwLCAwKSksCisKKwkvKiBCRkkJCQljY2NjIDAxMTEgMTEweCB4eHh4IHh4eHggeHh4eCB4MDAxIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4MGZlMDAwNzAsIDB4MDdjMDAwMTAsIGVtdWxhdGVfcmQxMnJtMF9ub2ZsYWdzX25vcGMsCisJCQkJCQkgUkVHUygwLCBOT1BDLCAwLCAwLCBOT1BDWCkpLAorCisJREVDT0RFX0VORAorfTsKKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIGFybV9jY2NjXzAxeHhfdGFibGVbXSA9IHsKKwkvKiBMb2FkL3N0b3JlIHdvcmQgYW5kIHVuc2lnbmVkIGJ5dGUJCQkJKi8KKworCS8qIExEUkIvU1RSQiBwYyxbLi4uXQljY2NjIDAxeHggeDB4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweDBjNDBmMDAwLCAweDA0NDBmMDAwKSwKKworCS8qIFNUUlQJCQljY2NjIDAxeDAgeDAxMCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRFJUCQkJY2NjYyAwMXgwIHgwMTEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogU1RSQlQJCWNjY2MgMDF4MCB4MTEwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIExEUkJUCQljY2NjIDAxeDAgeDExMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweDBkMjAwMDAwLCAweDA0MjAwMDAwKSwKKworCS8qIFNUUiAoaW1tZWRpYXRlKQljY2NjIDAxMHggeDB4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBTVFJCIChpbW1lZGlhdGUpCWNjY2MgMDEweCB4MXgwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHgwZTEwMDAwMCwgMHgwNDAwMDAwMCwgZW11bGF0ZV9zdHIsCisJCQkJCQkgUkVHUyhOT1BDV0IsIEFOWSwgMCwgMCwgMCkpLAorCisJLyogTERSIChpbW1lZGlhdGUpCWNjY2MgMDEweCB4MHgxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIExEUkIgKGltbWVkaWF0ZSkJY2NjYyAwMTB4IHgxeDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBlMTAwMDAwLCAweDA0MTAwMDAwLCBlbXVsYXRlX2xkciwKKwkJCQkJCSBSRUdTKE5PUENXQiwgQU5ZLCAwLCAwLCAwKSksCisKKwkvKiBTVFIgKHJlZ2lzdGVyKQljY2NjIDAxMXggeDB4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBTVFJCIChyZWdpc3RlcikJY2NjYyAwMTF4IHgxeDAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBlMTAwMDAwLCAweDA2MDAwMDAwLCBlbXVsYXRlX3N0ciwKKwkJCQkJCSBSRUdTKE5PUENXQiwgQU5ZLCAwLCAwLCBOT1BDKSksCisKKwkvKiBMRFIgKHJlZ2lzdGVyKQljY2NjIDAxMXggeDB4MSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRFJCIChyZWdpc3RlcikJY2NjYyAwMTF4IHgxeDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweDBlMTAwMDAwLCAweDA2MTAwMDAwLCBlbXVsYXRlX2xkciwKKwkJCQkJCSBSRUdTKE5PUENXQiwgQU5ZLCAwLCAwLCBOT1BDKSksCisKKwlERUNPREVfRU5ECit9OworCitzdGF0aWMgY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gYXJtX2NjY2NfMTAweF90YWJsZVtdID0geworCS8qIEJsb2NrIGRhdGEgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25zCQkJCSovCisKKwkvKiBMRE0JCQljY2NjIDEwMHggeDB4MSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBTVE0JCQljY2NjIDEwMHggeDB4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfQ1VTVE9NCSgweDBlNDAwMDAwLCAweDA4MDAwMDAwLCBrcHJvYmVfZGVjb2RlX2xkbXN0bSksCisKKwkvKiBTVE0gKHVzZXIgcmVnaXN0ZXJzKQljY2NjIDEwMHggeDF4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRE0gKHVzZXIgcmVnaXN0ZXJzKQljY2NjIDEwMHggeDF4MSB4eHh4IDB4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRE0gKGV4Y2VwdGlvbiByZXQpCWNjY2MgMTAweCB4MXgxIHh4eHggMXh4eCB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9FTkQKK307CisKK2NvbnN0IHVuaW9uIGRlY29kZV9pdGVtIGtwcm9iZV9kZWNvZGVfYXJtX3RhYmxlW10gPSB7CisJLyoKKwkgKiBVbmNvbmRpdGlvbmFsIGluc3RydWN0aW9ucworCSAqCQkJMTExMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4CisJICovCisJREVDT0RFX1RBQkxFCSgweGYwMDAwMDAwLCAweGYwMDAwMDAwLCBhcm1fMTExMV90YWJsZSksCisKKwkvKgorCSAqIE1pc2NlbGxhbmVvdXMgaW5zdHJ1Y3Rpb25zCisJICoJCQljY2NjIDAwMDEgMHh4MCB4eHh4IHh4eHggeHh4eCAweHh4IHh4eHgKKwkgKi8KKwlERUNPREVfVEFCTEUJKDB4MGY5MDAwODAsIDB4MDEwMDAwMDAsIGFybV9jY2NjXzAwMDFfMHh4MF9fX18weHh4X3RhYmxlKSwKKworCS8qCisJICogSGFsZndvcmQgbXVsdGlwbHkgYW5kIG11bHRpcGx5LWFjY3VtdWxhdGUKKwkgKgkJCWNjY2MgMDAwMSAweHgwIHh4eHggeHh4eCB4eHh4IDF4eDAgeHh4eAorCSAqLworCURFQ09ERV9UQUJMRQkoMHgwZjkwMDA5MCwgMHgwMTAwMDA4MCwgYXJtX2NjY2NfMDAwMV8weHgwX19fXzF4eDBfdGFibGUpLAorCisJLyoKKwkgKiBNdWx0aXBseSBhbmQgbXVsdGlwbHktYWNjdW11bGF0ZQorCSAqCQkJY2NjYyAwMDAwIHh4eHggeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4CisJICovCisJREVDT0RFX1RBQkxFCSgweDBmMDAwMGYwLCAweDAwMDAwMDkwLCBhcm1fY2NjY18wMDAwX19fX18xMDAxX3RhYmxlKSwKKworCS8qCisJICogU3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMKKwkgKgkJCWNjY2MgMDAwMSB4eHh4IHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eAorCSAqLworCURFQ09ERV9UQUJMRQkoMHgwZjAwMDBmMCwgMHgwMTAwMDA5MCwgYXJtX2NjY2NfMDAwMV9fX19fMTAwMV90YWJsZSksCisKKwkvKgorCSAqIEV4dHJhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zCisJICoJCQljY2NjIDAwMHggeHh4eCB4eHh4IHh4eHggeHh4eCAxeHgxIHh4eHgKKwkgKi8KKwlERUNPREVfVEFCTEUJKDB4MGUwMDAwOTAsIDB4MDAwMDAwOTAsIGFybV9jY2NjXzAwMHhfX19fXzF4eDFfdGFibGUpLAorCisJLyoKKwkgKiBEYXRhLXByb2Nlc3NpbmcgKHJlZ2lzdGVyKQorCSAqCQkJY2NjYyAwMDB4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4MCB4eHh4CisJICogRGF0YS1wcm9jZXNzaW5nIChyZWdpc3Rlci1zaGlmdGVkIHJlZ2lzdGVyKQorCSAqCQkJY2NjYyAwMDB4IHh4eHggeHh4eCB4eHh4IHh4eHggMHh4MSB4eHh4CisJICovCisJREVDT0RFX1RBQkxFCSgweDBlMDAwMDAwLCAweDAwMDAwMDAwLCBhcm1fY2NjY18wMDB4X3RhYmxlKSwKKworCS8qCisJICogRGF0YS1wcm9jZXNzaW5nIChpbW1lZGlhdGUpCisJICoJCQljY2NjIDAwMXggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgKKwkgKi8KKwlERUNPREVfVEFCTEUJKDB4MGUwMDAwMDAsIDB4MDIwMDAwMDAsIGFybV9jY2NjXzAwMXhfdGFibGUpLAorCisJLyoKKwkgKiBNZWRpYSBpbnN0cnVjdGlvbnMKKwkgKgkJCWNjY2MgMDExeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eDEgeHh4eAorCSAqLworCURFQ09ERV9UQUJMRQkoMHgwZjAwMDAxMCwgMHgwNjAwMDAxMCwgYXJtX2NjY2NfMDExMF9fX19feHh4MV90YWJsZSksCisJREVDT0RFX1RBQkxFCSgweDBmMDAwMDEwLCAweDA3MDAwMDEwLCBhcm1fY2NjY18wMTExX19fX194eHgxX3RhYmxlKSwKKworCS8qCisJICogTG9hZC9zdG9yZSB3b3JkIGFuZCB1bnNpZ25lZCBieXRlCisJICoJCQljY2NjIDAxeHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgKKwkgKi8KKwlERUNPREVfVEFCTEUJKDB4MGMwMDAwMDAsIDB4MDQwMDAwMDAsIGFybV9jY2NjXzAxeHhfdGFibGUpLAorCisJLyoKKwkgKiBCbG9jayBkYXRhIHRyYW5zZmVyIGluc3RydWN0aW9ucworCSAqCQkJY2NjYyAxMDB4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4CisJICovCisJREVDT0RFX1RBQkxFCSgweDBlMDAwMDAwLCAweDA4MDAwMDAwLCBhcm1fY2NjY18xMDB4X3RhYmxlKSwKKworCS8qIEIJCQljY2NjIDEwMTAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBCTAkJCWNjY2MgMTAxMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9TSU1VTEFURQkoMHgwZTAwMDAwMCwgMHgwYTAwMDAwMCwgc2ltdWxhdGVfYmJsKSwKKworCS8qCisJICogU3VwZXJ2aXNvciBDYWxsLCBhbmQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zCisJICovCisKKwkvKiBNQ1JSCQkJY2NjYyAxMTAwIDAxMDAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogTVJSQwkJCWNjY2MgMTEwMCAwMTAxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIExEQwkJCWNjY2MgMTEweCB4eHgxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIFNUQwkJCWNjY2MgMTEweCB4eHgwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIENEUAkJCWNjY2MgMTExMCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eDAgeHh4eCAqLworCS8qIE1DUgkJCWNjY2MgMTExMCB4eHgwIHh4eHggeHh4eCB4eHh4IHh4eDEgeHh4eCAqLworCS8qIE1SQwkJCWNjY2MgMTExMCB4eHgxIHh4eHggeHh4eCB4eHh4IHh4eDEgeHh4eCAqLworCS8qIFNWQwkJCWNjY2MgMTExMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9SRUpFQ1QJKDB4MGMwMDAwMDAsIDB4MGMwMDAwMDApLAorCisJREVDT0RFX0VORAorfTsKKworc3RhdGljIHZvaWQgX19rcHJvYmVzIGFybV9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJlZ3MtPkFSTV9wYyArPSA0OworCXAtPmFpbnNuLmluc25faGFuZGxlcihwLCByZWdzKTsKK30KKworLyogUmV0dXJuOgorICogICBJTlNOX1JFSkVDVEVEICAgICBJZiBpbnN0cnVjdGlvbiBpcyBvbmUgbm90IGFsbG93ZWQgdG8ga3Byb2JlLAorICogICBJTlNOX0dPT0QgICAgICAgICBJZiBpbnN0cnVjdGlvbiBpcyBzdXBwb3J0ZWQgYW5kIHVzZXMgaW5zdHJ1Y3Rpb24gc2xvdCwKKyAqICAgSU5TTl9HT09EX05PX1NMT1QgSWYgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9ydGVkIGJ1dCBkb2Vzbid0IHVzZSBpdHMgc2xvdC4KKyAqCisgKiBGb3IgaW5zdHJ1Y3Rpb25zIHdlIGRvbid0IHdhbnQgdG8ga3Byb2JlIChJTlNOX1JFSkVDVEVEIHJldHVybiByZXN1bHQpOgorICogICBUaGVzZSBhcmUgZ2VuZXJhbGx5IG9uZXMgdGhhdCBtb2RpZnkgdGhlIHByb2Nlc3NvciBzdGF0ZSBtYWtpbmcKKyAqICAgdGhlbSAiaGFyZCIgdG8gc2ltdWxhdGUgc3VjaCBhcyBzd2l0Y2hlcyBwcm9jZXNzb3IgbW9kZXMgb3IKKyAqICAgbWFrZSBhY2Nlc3NlcyBpbiBhbHRlcm5hdGUgbW9kZXMuICBBbnkgb2YgdGhlc2UgY291bGQgYmUgc2ltdWxhdGVkCisgKiAgIGlmIHRoZSB3b3JrIHdhcyBwdXQgaW50byBpdCwgYnV0IGxvdyByZXR1cm4gY29uc2lkZXJpbmcgdGhleQorICogICBzaG91bGQgYWxzbyBiZSB2ZXJ5IHJhcmUuCisgKi8KK2VudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCithcm1fa3Byb2JlX2RlY29kZV9pbnNuKGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCit7CisJYXNpLT5pbnNuX3NpbmdsZXN0ZXAgPSBhcm1fc2luZ2xlc3RlcDsKKwlhc2ktPmluc25fY2hlY2tfY2MgPSBrcHJvYmVfY29uZGl0aW9uX2NoZWNrc1tpbnNuPj4yOF07CisJcmV0dXJuIGtwcm9iZV9kZWNvZGVfaW5zbihpbnNuLCBhc2ksIGtwcm9iZV9kZWNvZGVfYXJtX3RhYmxlLCBmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy1jb21tb24uYyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Mzk0ZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtY29tbW9uLmMKQEAgLTAsMCArMSw1NzcgQEAKKy8qCisgKiBhcmNoL2FybS9rZXJuZWwva3Byb2Jlcy1jb21tb24uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBKb24gTWVkaHVyc3QgPHRpeHlAeXhpdC5jby51az4uCisgKgorICogU29tZSBjb250ZW50cyBtb3ZlZCBoZXJlIGZyb20gYXJjaC9hcm0vaW5jbHVkZS9hc20va3Byb2Jlcy1hcm0uYyB3aGljaCBpcworICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IE1vdG9yb2xhIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisKKyNpbmNsdWRlICJrcHJvYmVzLmgiCisKKworI2lmbmRlZiBmaW5kX3N0cl9wY19vZmZzZXQKKworLyoKKyAqIEZvciBTVFIgYW5kIFNUTSBpbnN0cnVjdGlvbnMsIGFuIEFSTSBjb3JlIG1heSBjaG9vc2UgdG8gdXNlIGVpdGhlcgorICogYSArOCBvciBhICsxMiBkaXNwbGFjZW1lbnQgZnJvbSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbidzIGFkZHJlc3MuCisgKiBXaGljaGV2ZXIgdmFsdWUgaXMgY2hvc2VuIGZvciBhIGdpdmVuIGNvcmUsIGl0IG11c3QgYmUgdGhlIHNhbWUgZm9yCisgKiBib3RoIGluc3RydWN0aW9ucyBhbmQgbWF5IG5vdCBjaGFuZ2UuICBUaGlzIGZ1bmN0aW9uIG1lYXN1cmVzIGl0LgorICovCisKK2ludCBzdHJfcGNfb2Zmc2V0OworCit2b2lkIF9faW5pdCBmaW5kX3N0cl9wY19vZmZzZXQodm9pZCkKK3sKKwlpbnQgYWRkciwgc2NyYXRjaCwgcmV0OworCisJX19hc21fXyAoCisJCSJzdWIJJVtyZXRdLCBwYywgIzQJCVxuXHQiCisJCSJzdHIJcGMsICVbYWRkcl0JCVxuXHQiCisJCSJsZHIJJVtzY3JdLCAlW2FkZHJdCQlcblx0IgorCQkic3ViCSVbcmV0XSwgJVtzY3JdLCAlW3JldF0JXG5cdCIKKwkJOiBbcmV0XSAiPXIiIChyZXQpLCBbc2NyXSAiPXIiIChzY3JhdGNoKSwgW2FkZHJdICIrbSIgKGFkZHIpKTsKKworCXN0cl9wY19vZmZzZXQgPSByZXQ7Cit9CisKKyNlbmRpZiAvKiAhZmluZF9zdHJfcGNfb2Zmc2V0ICovCisKKworI2lmbmRlZiB0ZXN0X2xvYWRfd3JpdGVfcGNfaW50ZXJ3b3JraW5nCisKK2Jvb2wgbG9hZF93cml0ZV9wY19pbnRlcndvcmtzOworCit2b2lkIF9faW5pdCB0ZXN0X2xvYWRfd3JpdGVfcGNfaW50ZXJ3b3JraW5nKHZvaWQpCit7CisJaW50IGFyY2ggPSBjcHVfYXJjaGl0ZWN0dXJlKCk7CisJQlVHX09OKGFyY2ggPT0gQ1BVX0FSQ0hfVU5LTk9XTik7CisJbG9hZF93cml0ZV9wY19pbnRlcndvcmtzID0gYXJjaCA+PSBDUFVfQVJDSF9BUk12NVQ7Cit9CisKKyNlbmRpZiAvKiAhdGVzdF9sb2FkX3dyaXRlX3BjX2ludGVyd29ya2luZyAqLworCisKKyNpZm5kZWYgdGVzdF9hbHVfd3JpdGVfcGNfaW50ZXJ3b3JraW5nCisKK2Jvb2wgYWx1X3dyaXRlX3BjX2ludGVyd29ya3M7CisKK3ZvaWQgX19pbml0IHRlc3RfYWx1X3dyaXRlX3BjX2ludGVyd29ya2luZyh2b2lkKQoreworCWludCBhcmNoID0gY3B1X2FyY2hpdGVjdHVyZSgpOworCUJVR19PTihhcmNoID09IENQVV9BUkNIX1VOS05PV04pOworCWFsdV93cml0ZV9wY19pbnRlcndvcmtzID0gYXJjaCA+PSBDUFVfQVJDSF9BUk12NzsKK30KKworI2VuZGlmIC8qICF0ZXN0X2FsdV93cml0ZV9wY19pbnRlcndvcmtpbmcgKi8KKworCit2b2lkIF9faW5pdCBhcm1fa3Byb2JlX2RlY29kZV9pbml0KHZvaWQpCit7CisJZmluZF9zdHJfcGNfb2Zmc2V0KCk7CisJdGVzdF9sb2FkX3dyaXRlX3BjX2ludGVyd29ya2luZygpOworCXRlc3RfYWx1X3dyaXRlX3BjX2ludGVyd29ya2luZygpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fa3Byb2JlcyBfX2NoZWNrX2VxKHVuc2lnbmVkIGxvbmcgY3BzcikKK3sKKwlyZXR1cm4gY3BzciAmIFBTUl9aX0JJVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfbmUodW5zaWduZWQgbG9uZyBjcHNyKQoreworCXJldHVybiAofmNwc3IpICYgUFNSX1pfQklUOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2twcm9iZXMgX19jaGVja19jcyh1bnNpZ25lZCBsb25nIGNwc3IpCit7CisJcmV0dXJuIGNwc3IgJiBQU1JfQ19CSVQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fa3Byb2JlcyBfX2NoZWNrX2NjKHVuc2lnbmVkIGxvbmcgY3BzcikKK3sKKwlyZXR1cm4gKH5jcHNyKSAmIFBTUl9DX0JJVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfbWkodW5zaWduZWQgbG9uZyBjcHNyKQoreworCXJldHVybiBjcHNyICYgUFNSX05fQklUOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2twcm9iZXMgX19jaGVja19wbCh1bnNpZ25lZCBsb25nIGNwc3IpCit7CisJcmV0dXJuICh+Y3BzcikgJiBQU1JfTl9CSVQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fa3Byb2JlcyBfX2NoZWNrX3ZzKHVuc2lnbmVkIGxvbmcgY3BzcikKK3sKKwlyZXR1cm4gY3BzciAmIFBTUl9WX0JJVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfdmModW5zaWduZWQgbG9uZyBjcHNyKQoreworCXJldHVybiAofmNwc3IpICYgUFNSX1ZfQklUOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2twcm9iZXMgX19jaGVja19oaSh1bnNpZ25lZCBsb25nIGNwc3IpCit7CisJY3BzciAmPSB+KGNwc3IgPj4gMSk7IC8qIFBTUl9DX0JJVCAmPSB+UFNSX1pfQklUICovCisJcmV0dXJuIGNwc3IgJiBQU1JfQ19CSVQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fa3Byb2JlcyBfX2NoZWNrX2xzKHVuc2lnbmVkIGxvbmcgY3BzcikKK3sKKwljcHNyICY9IH4oY3BzciA+PiAxKTsgLyogUFNSX0NfQklUICY9IH5QU1JfWl9CSVQgKi8KKwlyZXR1cm4gKH5jcHNyKSAmIFBTUl9DX0JJVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfZ2UodW5zaWduZWQgbG9uZyBjcHNyKQoreworCWNwc3IgXj0gKGNwc3IgPDwgMyk7IC8qIFBTUl9OX0JJVCBePSBQU1JfVl9CSVQgKi8KKwlyZXR1cm4gKH5jcHNyKSAmIFBTUl9OX0JJVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfbHQodW5zaWduZWQgbG9uZyBjcHNyKQoreworCWNwc3IgXj0gKGNwc3IgPDwgMyk7IC8qIFBTUl9OX0JJVCBePSBQU1JfVl9CSVQgKi8KKwlyZXR1cm4gY3BzciAmIFBTUl9OX0JJVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfZ3QodW5zaWduZWQgbG9uZyBjcHNyKQoreworCXVuc2lnbmVkIGxvbmcgdGVtcCA9IGNwc3IgXiAoY3BzciA8PCAzKTsgLyogUFNSX05fQklUIF49IFBTUl9WX0JJVCAqLworCXRlbXAgfD0gKGNwc3IgPDwgMSk7CQkJIC8qIFBTUl9OX0JJVCB8PSBQU1JfWl9CSVQgKi8KKwlyZXR1cm4gKH50ZW1wKSAmIFBTUl9OX0JJVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfbGUodW5zaWduZWQgbG9uZyBjcHNyKQoreworCXVuc2lnbmVkIGxvbmcgdGVtcCA9IGNwc3IgXiAoY3BzciA8PCAzKTsgLyogUFNSX05fQklUIF49IFBTUl9WX0JJVCAqLworCXRlbXAgfD0gKGNwc3IgPDwgMSk7CQkJIC8qIFBTUl9OX0JJVCB8PSBQU1JfWl9CSVQgKi8KKwlyZXR1cm4gdGVtcCAmIFBTUl9OX0JJVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfYWwodW5zaWduZWQgbG9uZyBjcHNyKQoreworCXJldHVybiB0cnVlOworfQorCitrcHJvYmVfY2hlY2tfY2MgKiBjb25zdCBrcHJvYmVfY29uZGl0aW9uX2NoZWNrc1sxNl0gPSB7CisJJl9fY2hlY2tfZXEsICZfX2NoZWNrX25lLCAmX19jaGVja19jcywgJl9fY2hlY2tfY2MsCisJJl9fY2hlY2tfbWksICZfX2NoZWNrX3BsLCAmX19jaGVja192cywgJl9fY2hlY2tfdmMsCisJJl9fY2hlY2tfaGksICZfX2NoZWNrX2xzLCAmX19jaGVja19nZSwgJl9fY2hlY2tfbHQsCisJJl9fY2hlY2tfZ3QsICZfX2NoZWNrX2xlLCAmX19jaGVja19hbCwgJl9fY2hlY2tfYWwKK307CisKKwordm9pZCBfX2twcm9iZXMga3Byb2JlX3NpbXVsYXRlX25vcChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKK30KKwordm9pZCBfX2twcm9iZXMga3Byb2JlX2VtdWxhdGVfbm9uZShzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwLT5haW5zbi5pbnNuX2ZuKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBzaW11bGF0ZV9sZG0xc3RtMShzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwlpbnQgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CisJaW50IGxiaXQgPSBpbnNuICYgKDEgPDwgMjApOworCWludCB3Yml0ID0gaW5zbiAmICgxIDw8IDIxKTsKKwlpbnQgdWJpdCA9IGluc24gJiAoMSA8PCAyMyk7CisJaW50IHBiaXQgPSBpbnNuICYgKDEgPDwgMjQpOworCWxvbmcgKmFkZHIgPSAobG9uZyAqKXJlZ3MtPnVyZWdzW3JuXTsKKwlpbnQgcmVnX2JpdF92ZWN0b3I7CisJaW50IHJlZ19jb3VudDsKKworCXJlZ19jb3VudCA9IDA7CisJcmVnX2JpdF92ZWN0b3IgPSBpbnNuICYgMHhmZmZmOworCXdoaWxlIChyZWdfYml0X3ZlY3RvcikgeworCQlyZWdfYml0X3ZlY3RvciAmPSAocmVnX2JpdF92ZWN0b3IgLSAxKTsKKwkJKytyZWdfY291bnQ7CisJfQorCisJaWYgKCF1Yml0KQorCQlhZGRyIC09IHJlZ19jb3VudDsKKwlhZGRyICs9ICghcGJpdCA9PSAhdWJpdCk7CisKKwlyZWdfYml0X3ZlY3RvciA9IGluc24gJiAweGZmZmY7CisJd2hpbGUgKHJlZ19iaXRfdmVjdG9yKSB7CisJCWludCByZWcgPSBfX2ZmcyhyZWdfYml0X3ZlY3Rvcik7CisJCXJlZ19iaXRfdmVjdG9yICY9IChyZWdfYml0X3ZlY3RvciAtIDEpOworCQlpZiAobGJpdCkKKwkJCXJlZ3MtPnVyZWdzW3JlZ10gPSAqYWRkcisrOworCQllbHNlCisJCQkqYWRkcisrID0gcmVncy0+dXJlZ3NbcmVnXTsKKwl9CisKKwlpZiAod2JpdCkgeworCQlpZiAoIXViaXQpCisJCQlhZGRyIC09IHJlZ19jb3VudDsKKwkJYWRkciAtPSAoIXBiaXQgPT0gIXViaXQpOworCQlyZWdzLT51cmVnc1tybl0gPSAobG9uZylhZGRyOworCX0KK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzIHNpbXVsYXRlX3N0bTFfcGMoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmVncy0+QVJNX3BjID0gKGxvbmcpcC0+YWRkciArIHN0cl9wY19vZmZzZXQ7CisJc2ltdWxhdGVfbGRtMXN0bTEocCwgcmVncyk7CisJcmVncy0+QVJNX3BjID0gKGxvbmcpcC0+YWRkciArIDQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBzaW11bGF0ZV9sZG0xX3BjKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNpbXVsYXRlX2xkbTFzdG0xKHAsIHJlZ3MpOworCWxvYWRfd3JpdGVfcGMocmVncy0+QVJNX3BjLCByZWdzKTsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCitlbXVsYXRlX2dlbmVyaWNfcjBfMTJfbm9mbGFncyhzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZWdpc3RlciB2b2lkICpycmVncyBhc20oInIxIikgPSByZWdzOworCXJlZ2lzdGVyIHZvaWQgKnJmbiBhc20oImxyIikgPSBwLT5haW5zbi5pbnNuX2ZuOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkic3RtZGIJc3AhLCB7JVtyZWdzXSwgcjExfQlcblx0IgorCQkibGRtaWEJJVtyZWdzXSwge3IwLXIxMn0JXG5cdCIKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgorCQkiYmx4CSVbZm5dCQkJXG5cdCIKKyNlbHNlCisJCSJzdHIJJVtmbl0sIFtzcCwgIy00XSEJXG5cdCIKKwkJImFkcglsciwgMWYJCQlcblx0IgorCQkibGRyCXBjLCBbc3BdLCAjNAkJXG5cdCIKKwkJIjE6CQkJCVxuXHQiCisjZW5kaWYKKwkJImxkcglsciwgW3NwXSwgIzQJCVxuXHQiIC8qIGxyID0gcmVncyAqLworCQkic3RtaWEJbHIsIHtyMC1yMTJ9CQlcblx0IgorCQkibGRyCXIxMSwgW3NwXSwgIzQJCVxuXHQiCisJCTogW3JlZ3NdICI9ciIgKHJyZWdzKSwgW2ZuXSAiPXIiIChyZm4pCisJCTogIjAiIChycmVncyksICIxIiAocmZuKQorCQk6ICJyMCIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCisJCSAgInI4IiwgInI5IiwgInIxMCIsICJyMTIiLCAibWVtb3J5IiwgImNjIgorCQkpOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK2VtdWxhdGVfZ2VuZXJpY19yMl8xNF9ub2ZsYWdzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWVtdWxhdGVfZ2VuZXJpY19yMF8xMl9ub2ZsYWdzKHAsIChzdHJ1Y3QgcHRfcmVncyAqKShyZWdzLT51cmVncysyKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcworZW11bGF0ZV9sZG1fcjNfMTUoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZW11bGF0ZV9nZW5lcmljX3IwXzEyX25vZmxhZ3MocCwgKHN0cnVjdCBwdF9yZWdzICopKHJlZ3MtPnVyZWdzKzMpKTsKKwlsb2FkX3dyaXRlX3BjKHJlZ3MtPkFSTV9wYywgcmVncyk7Cit9CisKK2VudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCitrcHJvYmVfZGVjb2RlX2xkbXN0bShrcHJvYmVfb3Bjb2RlX3QgaW5zbiwgc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiAqYXNpKQoreworCWtwcm9iZV9pbnNuX2hhbmRsZXJfdCAqaGFuZGxlciA9IDA7CisJdW5zaWduZWQgcmVnbGlzdCA9IGluc24gJiAweGZmZmY7CisJaW50IGlzX2xkbSA9IGluc24gJiAweDEwMDAwMDsKKwlpbnQgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CisKKwlpZiAocm4gPD0gMTIgJiYgKHJlZ2xpc3QgJiAweGUwMDApID09IDApIHsKKwkJLyogSW5zdHJ1Y3Rpb24gb25seSB1c2VzIHJlZ2lzdGVycyBpbiB0aGUgcmFuZ2UgUjAuLlIxMiAqLworCQloYW5kbGVyID0gZW11bGF0ZV9nZW5lcmljX3IwXzEyX25vZmxhZ3M7CisKKwl9IGVsc2UgaWYgKHJuID49IDIgJiYgKHJlZ2xpc3QgJiAweDgwMDMpID09IDApIHsKKwkJLyogSW5zdHJ1Y3Rpb24gb25seSB1c2VzIHJlZ2lzdGVycyBpbiB0aGUgcmFuZ2UgUjIuLlIxNCAqLworCQlybiAtPSAyOworCQlyZWdsaXN0ID4+PSAyOworCQloYW5kbGVyID0gZW11bGF0ZV9nZW5lcmljX3IyXzE0X25vZmxhZ3M7CisKKwl9IGVsc2UgaWYgKHJuID49IDMgJiYgKHJlZ2xpc3QgJiAweDAwMDcpID09IDApIHsKKwkJLyogSW5zdHJ1Y3Rpb24gb25seSB1c2VzIHJlZ2lzdGVycyBpbiB0aGUgcmFuZ2UgUjMuLlIxNSAqLworCQlpZiAoaXNfbGRtICYmIChyZWdsaXN0ICYgMHg4MDAwKSkgeworCQkJcm4gLT0gMzsKKwkJCXJlZ2xpc3QgPj49IDM7CisJCQloYW5kbGVyID0gZW11bGF0ZV9sZG1fcjNfMTU7CisJCX0KKwl9CisKKwlpZiAoaGFuZGxlcikgeworCQkvKiBXZSBjYW4gZW11bGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gaW4gKHBvc3NpYmx5KSBtb2RpZmllZCBmb3JtICovCisJCWFzaS0+aW5zblswXSA9IChpbnNuICYgMHhmZmYwMDAwMCkgfCAocm4gPDwgMTYpIHwgcmVnbGlzdDsKKwkJYXNpLT5pbnNuX2hhbmRsZXIgPSBoYW5kbGVyOworCQlyZXR1cm4gSU5TTl9HT09EOworCX0KKworCS8qIEZhbGxiYWNrIHRvIHNsb3dlciBzaW11bGF0aW9uLi4uICovCisJaWYgKHJlZ2xpc3QgJiAweDgwMDApCisJCWhhbmRsZXIgPSBpc19sZG0gPyBzaW11bGF0ZV9sZG0xX3BjIDogc2ltdWxhdGVfc3RtMV9wYzsKKwllbHNlCisJCWhhbmRsZXIgPSBzaW11bGF0ZV9sZG0xc3RtMTsKKwlhc2ktPmluc25faGFuZGxlciA9IGhhbmRsZXI7CisJcmV0dXJuIElOU05fR09PRF9OT19TTE9UOworfQorCisKKy8qCisgKiBQcmVwYXJlIGFuIGluc3RydWN0aW9uIHNsb3QgdG8gcmVjZWl2ZSBhbiBpbnN0cnVjdGlvbiBmb3IgZW11bGF0aW5nLgorICogVGhpcyBpcyBkb25lIGJ5IHBsYWNpbmcgYSBzdWJyb3V0aW5lIHJldHVybiBhZnRlciB0aGUgbG9jYXRpb24gd2hlcmUgdGhlCisgKiBpbnN0cnVjdGlvbiB3aWxsIGJlIHBsYWNlZC4gV2UgYWxzbyBtb2RpZnkgQVJNIGluc3RydWN0aW9ucyB0byBiZQorICogdW5jb25kaXRpb25hbCBhcyB0aGUgY29uZGl0aW9uIGNvZGUgd2lsbCBhbHJlYWR5IGJlIGNoZWNrZWQgYmVmb3JlIGFueQorICogZW11bGF0aW9uIGhhbmRsZXIgaXMgY2FsbGVkLgorICovCitzdGF0aWMga3Byb2JlX29wY29kZV90IF9fa3Byb2JlcworcHJlcGFyZV9lbXVsYXRlZF9pbnNuKGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2ksCisJCQkJCQkJCWJvb2wgdGh1bWIpCit7CisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwlpZiAodGh1bWIpIHsKKwkJdTE2ICp0aHVtYl9pbnNuID0gKHUxNiAqKWFzaS0+aW5zbjsKKwkJdGh1bWJfaW5zblsxXSA9IDB4NDc3MDsgLyogVGh1bWIgYnggbHIgKi8KKwkJdGh1bWJfaW5zblsyXSA9IDB4NDc3MDsgLyogVGh1bWIgYnggbHIgKi8KKwkJcmV0dXJuIGluc247CisJfQorCWFzaS0+aW5zblsxXSA9IDB4ZTEyZmZmMWU7IC8qIEFSTSBieCBsciAqLworI2Vsc2UKKwlhc2ktPmluc25bMV0gPSAweGUxYTBmMDBlOyAvKiBtb3YgcGMsIGxyICovCisjZW5kaWYKKwkvKiBNYWtlIGFuIEFSTSBpbnN0cnVjdGlvbiB1bmNvbmRpdGlvbmFsICovCisJaWYgKGluc24gPCAweGUwMDAwMDAwKQorCQlpbnNuID0gKGluc24gfCAweGUwMDAwMDAwKSAmIH4weDEwMDAwMDAwOworCXJldHVybiBpbnNuOworfQorCisvKgorICogV3JpdGUgYSAocHJvYmFibHkgbW9kaWZpZWQpIGluc3RydWN0aW9uIGludG8gdGhlIHNsb3QgcHJldmlvdXNseSBwcmVwYXJlZCBieQorICogcHJlcGFyZV9lbXVsYXRlZF9pbnNuCisgKi8KK3N0YXRpYyB2b2lkICBfX2twcm9iZXMKK3NldF9lbXVsYXRlZF9pbnNuKGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2ksCisJCQkJCQkJCWJvb2wgdGh1bWIpCit7CisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwlpZiAodGh1bWIpIHsKKwkJdTE2ICppcCA9ICh1MTYgKilhc2ktPmluc247CisJCWlmIChpc193aWRlX2luc3RydWN0aW9uKGluc24pKQorCQkJKmlwKysgPSBpbnNuID4+IDE2OworCQkqaXArKyA9IGluc247CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlhc2ktPmluc25bMF0gPSBpbnNuOworfQorCisvKgorICogV2hlbiB3ZSBtb2RpZnkgdGhlIHJlZ2lzdGVyIG51bWJlcnMgZW5jb2RlZCBpbiBhbiBpbnN0cnVjdGlvbiB0byBiZSBlbXVsYXRlZCwKKyAqIHRoZSBuZXcgdmFsdWVzIGNvbWUgZnJvbSB0aGlzIGRlZmluZS4gRm9yIEFSTSBhbmQgMzItYml0IFRodW1iIGluc3RydWN0aW9ucworICogdGhpcyBnaXZlcy4uLgorICoKKyAqCWJpdCBwb3NpdGlvbgkgIDE2ICAxMiAgIDggICA0ICAgMAorICoJLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisgKglyZWdpc3RlcgkgcjIgIHIwICByMSAgLS0gIHIzCisgKi8KKyNkZWZpbmUgSU5TTl9ORVdfQklUUwkJMHgwMDAyMDEwMworCisvKiBFYWNoIG5pYmJsZSBoYXMgc2FtZSB2YWx1ZSBhcyB0aGF0IGF0IElOU05fTkVXX0JJVFMgYml0IDE2ICovCisjZGVmaW5lIElOU05fU0FNRUFTMTZfQklUUwkweDIyMjIyMjIyCisKKy8qCisgKiBWYWxpZGF0ZSBhbmQgbW9kaWZ5IGVhY2ggb2YgdGhlIHJlZ2lzdGVycyBlbmNvZGVkIGluIGFuIGluc3RydWN0aW9uLgorICoKKyAqIEVhY2ggbmliYmxlIGluIHJlZ3MgY29udGFpbnMgYSB2YWx1ZSBmcm9tIGVudW0gZGVjb2RlX3JlZ190eXBlLiBGb3IgZWFjaAorICogbm9uLXplcm8gdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nIG5pYmJsZSBpbiBwaW5zbiBpcyB2YWxpZGF0ZWQgYW5kIG1vZGlmaWVkCisgKiBhY2NvcmRpbmcgdG8gdGhlIHR5cGUuCisgKi8KK3N0YXRpYyBib29sIF9fa3Byb2JlcyBkZWNvZGVfcmVncyhrcHJvYmVfb3Bjb2RlX3QqIHBpbnNuLCB1MzIgcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9ICpwaW5zbjsKKwlrcHJvYmVfb3Bjb2RlX3QgbWFzayA9IDB4ZjsgLyogU3RhcnQgYXQgbGVhc3Qgc2lnbmlmaWNhbnQgbmliYmxlICovCisKKwlmb3IgKDsgcmVncyAhPSAwOyByZWdzID4+PSA0LCBtYXNrIDw8PSA0KSB7CisKKwkJa3Byb2JlX29wY29kZV90IG5ld19iaXRzID0gSU5TTl9ORVdfQklUUzsKKworCQlzd2l0Y2ggKHJlZ3MgJiAweGYpIHsKKworCQljYXNlIFJFR19UWVBFX05PTkU6CisJCQkvKiBOaWJibGUgbm90IGEgcmVnaXN0ZXIsIHNraXAgdG8gbmV4dCAqLworCQkJY29udGludWU7CisKKwkJY2FzZSBSRUdfVFlQRV9BTlk6CisJCQkvKiBBbnkgcmVnaXN0ZXIgaXMgYWxsb3dlZCAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBSRUdfVFlQRV9TQU1FQVMxNjoKKwkJCS8qIFJlcGxhY2UgcmVnaXN0ZXIgd2l0aCBzYW1lIGFzIGF0IGJpdCBwb3NpdGlvbiAxNiAqLworCQkJbmV3X2JpdHMgPSBJTlNOX1NBTUVBUzE2X0JJVFM7CisJCQlicmVhazsKKworCQljYXNlIFJFR19UWVBFX1NQOgorCQkJLyogT25seSBhbGxvdyBTUCAoUjEzKSAqLworCQkJaWYgKChpbnNuIF4gMHhkZGRkZGRkZCkgJiBtYXNrKQorCQkJCWdvdG8gcmVqZWN0OworCQkJYnJlYWs7CisKKwkJY2FzZSBSRUdfVFlQRV9QQzoKKwkJCS8qIE9ubHkgYWxsb3cgUEMgKFIxNSkgKi8KKwkJCWlmICgoaW5zbiBeIDB4ZmZmZmZmZmYpICYgbWFzaykKKwkJCQlnb3RvIHJlamVjdDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVHX1RZUEVfTk9TUDoKKwkJCS8qIFJlamVjdCBTUCAoUjEzKSAqLworCQkJaWYgKCgoaW5zbiBeIDB4ZGRkZGRkZGQpICYgbWFzaykgPT0gMCkKKwkJCQlnb3RvIHJlamVjdDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVHX1RZUEVfTk9TUFBDOgorCQljYXNlIFJFR19UWVBFX05PU1BQQ1g6CisJCQkvKiBSZWplY3QgU1AgYW5kIFBDIChSMTMgYW5kIFIxNSkgKi8KKwkJCWlmICgoKGluc24gXiAweGRkZGRkZGRkKSAmIDB4ZGRkZGRkZGQgJiBtYXNrKSA9PSAwKQorCQkJCWdvdG8gcmVqZWN0OworCQkJYnJlYWs7CisKKwkJY2FzZSBSRUdfVFlQRV9OT1BDV0I6CisJCQlpZiAoIWlzX3dyaXRlYmFjayhpbnNuKSkKKwkJCQlicmVhazsgLyogTm8gd3JpdGViYWNrLCBzbyBhbnkgcmVnaXN0ZXIgaXMgT0sgKi8KKwkJCS8qIGZhbGwgdGhyb3VnaC4uLiAqLworCQljYXNlIFJFR19UWVBFX05PUEM6CisJCWNhc2UgUkVHX1RZUEVfTk9QQ1g6CisJCQkvKiBSZWplY3QgUEMgKFIxNSkgKi8KKwkJCWlmICgoKGluc24gXiAweGZmZmZmZmZmKSAmIG1hc2spID09IDApCisJCQkJZ290byByZWplY3Q7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFJlcGxhY2UgdmFsdWUgb2YgbmliYmxlIHdpdGggbmV3IHJlZ2lzdGVyIG51bWJlci4uLiAqLworCQlpbnNuICY9IH5tYXNrOworCQlpbnNuIHw9IG5ld19iaXRzICYgbWFzazsKKwl9CisKKwkqcGluc24gPSBpbnNuOworCXJldHVybiB0cnVlOworCityZWplY3Q6CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgY29uc3QgaW50IGRlY29kZV9zdHJ1Y3Rfc2l6ZXNbTlVNX0RFQ09ERV9UWVBFU10gPSB7CisJW0RFQ09ERV9UWVBFX1RBQkxFXQk9IHNpemVvZihzdHJ1Y3QgZGVjb2RlX3RhYmxlKSwKKwlbREVDT0RFX1RZUEVfQ1VTVE9NXQk9IHNpemVvZihzdHJ1Y3QgZGVjb2RlX2N1c3RvbSksCisJW0RFQ09ERV9UWVBFX1NJTVVMQVRFXQk9IHNpemVvZihzdHJ1Y3QgZGVjb2RlX3NpbXVsYXRlKSwKKwlbREVDT0RFX1RZUEVfRU1VTEFURV0JPSBzaXplb2Yoc3RydWN0IGRlY29kZV9lbXVsYXRlKSwKKwlbREVDT0RFX1RZUEVfT1JdCT0gc2l6ZW9mKHN0cnVjdCBkZWNvZGVfb3IpLAorCVtERUNPREVfVFlQRV9SRUpFQ1RdCT0gc2l6ZW9mKHN0cnVjdCBkZWNvZGVfcmVqZWN0KQorfTsKKworLyoKKyAqIGtwcm9iZV9kZWNvZGVfaW5zbiBvcGVyYXRlcyBvbiBkYXRhIHRhYmxlcyBpbiBvcmRlciB0byBkZWNvZGUgYW4gQVJNCisgKiBhcmNoaXRlY3R1cmUgaW5zdHJ1Y3Rpb24gb250byB3aGljaCBhIGtwcm9iZSBoYXMgYmVlbiBwbGFjZWQuCisgKgorICogVGhlc2UgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgdGFibGVzIGFyZSBhIGNvbmNhdGVuYXRpb24gb2YgZW50cmllcyBlYWNoCisgKiBvZiB3aGljaCBjb25zaXN0IG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0cnVjdHM6CisgKgorICoJZGVjb2RlX3RhYmxlCisgKglkZWNvZGVfY3VzdG9tCisgKglkZWNvZGVfc2ltdWxhdGUKKyAqCWRlY29kZV9lbXVsYXRlCisgKglkZWNvZGVfb3IKKyAqCWRlY29kZV9yZWplY3QKKyAqCisgKiBFYWNoIG9mIHRoZXNlIHN0YXJ0cyB3aXRoIGEgc3RydWN0IGRlY29kZV9oZWFkZXIgd2hpY2ggaGFzIHRoZSBmb2xsb3dpbmcKKyAqIGZpZWxkczoKKyAqCisgKgl0eXBlX3JlZ3MKKyAqCW1hc2sKKyAqCXZhbHVlCisgKgorICogVGhlIGxlYXN0IHNpZ25pZmljYW50IERFQ09ERV9UWVBFX0JJVFMgb2YgdHlwZV9yZWdzIGNvbnRhaW5zIGEgdmFsdWUKKyAqIGZyb20gZW51bSBkZWNvZGVfdHlwZSwgdGhpcyBpbmRpY2F0ZXMgd2hpY2ggb2YgdGhlIGRlY29kZV8qIHN0cnVjdHMKKyAqIHRoZSBlbnRyeSBjb250YWlucy4gVGhlIHZhbHVlIERFQ09ERV9UWVBFX0VORCBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUKKyAqIHRhYmxlLgorICoKKyAqIFdoZW4gdGhlIHRhYmxlIGlzIHBhcnNlZCwgZWFjaCBlbnRyeSBpcyBjaGVja2VkIGluIHR1cm4gdG8gc2VlIGlmIGl0CisgKiBtYXRjaGVzIHRoZSBpbnN0cnVjdGlvbiB0byBiZSBkZWNvZGVkIHVzaW5nIHRoZSB0ZXN0OgorICoKKyAqCShpbnNuICYgbWFzaykgPT0gdmFsdWUKKyAqCisgKiBJZiBubyBtYXRjaCBpcyBmb3VuZCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgdGFibGUgaXMgcmVhY2hlZCB0aGVuIGRlY29kaW5nCisgKiBmYWlscyB3aXRoIElOU05fUkVKRUNURUQuCisgKgorICogV2hlbiBhIG1hdGNoIGlzIGZvdW5kLCBkZWNvZGVfcmVncygpIGlzIGNhbGxlZCB0byB2YWxpZGF0ZSBhbmQgbW9kaWZ5IGVhY2gKKyAqIG9mIHRoZSByZWdpc3RlcnMgZW5jb2RlZCBpbiB0aGUgaW5zdHJ1Y3Rpb247IHRoZSBkYXRhIGl0IHVzZXMgdG8gZG8gdGhpcworICogaXMgKHR5cGVfcmVncyA+PiBERUNPREVfVFlQRV9CSVRTKS4gQSB2YWxpZGF0aW9uIGZhaWx1cmUgd2lsbCBjYXVzZSBkZWNvZGluZworICogdG8gZmFpbCB3aXRoIElOU05fUkVKRUNURUQuCisgKgorICogT25jZSB0aGUgaW5zdHJ1Y3Rpb24gaGFzIHBhc3NlZCB0aGUgYWJvdmUgdGVzdHMsIGZ1cnRoZXIgcHJvY2Vzc2luZworICogZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUgdGFibGUgZW50cnkncyBkZWNvZGUgc3RydWN0LgorICoKKyAqLworaW50IF9fa3Byb2Jlcwora3Byb2JlX2RlY29kZV9pbnNuKGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2ksCisJCQkJY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gKnRhYmxlLCBib29sIHRodW1iKQoreworCWNvbnN0IHN0cnVjdCBkZWNvZGVfaGVhZGVyICpoID0gKHN0cnVjdCBkZWNvZGVfaGVhZGVyICopdGFibGU7CisJY29uc3Qgc3RydWN0IGRlY29kZV9oZWFkZXIgKm5leHQ7CisJYm9vbCBtYXRjaGVkID0gZmFsc2U7CisKKwlpbnNuID0gcHJlcGFyZV9lbXVsYXRlZF9pbnNuKGluc24sIGFzaSwgdGh1bWIpOworCisJZm9yICg7OyBoID0gbmV4dCkgeworCQllbnVtIGRlY29kZV90eXBlIHR5cGUgPSBoLT50eXBlX3JlZ3MuYml0cyAmIERFQ09ERV9UWVBFX01BU0s7CisJCXUzMiByZWdzID0gaC0+dHlwZV9yZWdzLmJpdHMgPj4gREVDT0RFX1RZUEVfQklUUzsKKworCQlpZiAodHlwZSA9PSBERUNPREVfVFlQRV9FTkQpCisJCQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsKKworCQluZXh0ID0gKHN0cnVjdCBkZWNvZGVfaGVhZGVyICopCisJCQkJKCh1aW50cHRyX3QpaCArIGRlY29kZV9zdHJ1Y3Rfc2l6ZXNbdHlwZV0pOworCisJCWlmICghbWF0Y2hlZCAmJiAoaW5zbiAmIGgtPm1hc2suYml0cykgIT0gaC0+dmFsdWUuYml0cykKKwkJCWNvbnRpbnVlOworCisJCWlmICghZGVjb2RlX3JlZ3MoJmluc24sIHJlZ3MpKQorCQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CisKKwkJc3dpdGNoICh0eXBlKSB7CisKKwkJY2FzZSBERUNPREVfVFlQRV9UQUJMRTogeworCQkJc3RydWN0IGRlY29kZV90YWJsZSAqZCA9IChzdHJ1Y3QgZGVjb2RlX3RhYmxlICopaDsKKwkJCW5leHQgPSAoc3RydWN0IGRlY29kZV9oZWFkZXIgKilkLT50YWJsZS50YWJsZTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBERUNPREVfVFlQRV9DVVNUT006IHsKKwkJCXN0cnVjdCBkZWNvZGVfY3VzdG9tICpkID0gKHN0cnVjdCBkZWNvZGVfY3VzdG9tICopaDsKKwkJCXJldHVybiAoKmQtPmRlY29kZXIuZGVjb2RlcikoaW5zbiwgYXNpKTsKKwkJfQorCisJCWNhc2UgREVDT0RFX1RZUEVfU0lNVUxBVEU6IHsKKwkJCXN0cnVjdCBkZWNvZGVfc2ltdWxhdGUgKmQgPSAoc3RydWN0IGRlY29kZV9zaW11bGF0ZSAqKWg7CisJCQlhc2ktPmluc25faGFuZGxlciA9IGQtPmhhbmRsZXIuaGFuZGxlcjsKKwkJCXJldHVybiBJTlNOX0dPT0RfTk9fU0xPVDsKKwkJfQorCisJCWNhc2UgREVDT0RFX1RZUEVfRU1VTEFURTogeworCQkJc3RydWN0IGRlY29kZV9lbXVsYXRlICpkID0gKHN0cnVjdCBkZWNvZGVfZW11bGF0ZSAqKWg7CisJCQlhc2ktPmluc25faGFuZGxlciA9IGQtPmhhbmRsZXIuaGFuZGxlcjsKKwkJCXNldF9lbXVsYXRlZF9pbnNuKGluc24sIGFzaSwgdGh1bWIpOworCQkJcmV0dXJuIElOU05fR09PRDsKKwkJfQorCisJCWNhc2UgREVDT0RFX1RZUEVfT1I6CisJCQltYXRjaGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgREVDT0RFX1RZUEVfUkVKRUNUOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CisJCX0KKwkJfQorCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLWRlY29kZS5jIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtZGVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZWVmZjYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtZGVjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcwICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9rZXJuZWwva3Byb2Jlcy1kZWNvZGUuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBNb3Rvcm9sYSBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLS8qCi0gKiBXZSBkbyBub3QgaGF2ZSBoYXJkd2FyZSBzaW5nbGUtc3RlcHBpbmcgb24gQVJNLCBUaGlzCi0gKiBlZmZvcnQgaXMgZnVydGhlciBjb21wbGljYXRlZCBieSB0aGUgQVJNIG5vdCBoYXZpbmcgYQotICogIm5leHQgUEMiIHJlZ2lzdGVyLiAgSW5zdHJ1Y3Rpb25zIHRoYXQgY2hhbmdlIHRoZSBQQwotICogY2FuJ3QgYmUgc2FmZWx5IHNpbmdsZS1zdGVwcGVkIGluIGEgTVAgZW52aXJvbm1lbnQsIHNvCi0gKiB3ZSBoYXZlIGEgbG90IG9mIHdvcmsgdG8gZG86Ci0gKgotICogSW4gdGhlIHByZXBhcmUgcGhhc2U6Ci0gKiAgICopIElmIGl0IGlzIGFuIGluc3RydWN0aW9uIHRoYXQgZG9lcyBhbnl0aGluZwotICogICAgICB3aXRoIHRoZSBDUFUgbW9kZSwgd2UgcmVqZWN0IGl0IGZvciBhIGtwcm9iZS4KLSAqICAgICAgKFRoaXMgaXMgb3V0IG9mIGxhemluZXNzIHJhdGhlciB0aGFuIG5lZWQuICBUaGUKLSAqICAgICAgaW5zdHJ1Y3Rpb25zIGNvdWxkIGJlIHNpbXVsYXRlZC4pCi0gKgotICogICAqKSBPdGhlcndpc2UsIGRlY29kZSB0aGUgaW5zdHJ1Y3Rpb24gcmV3cml0aW5nIGl0cwotICogICAgICByZWdpc3RlcnMgdG8gdGFrZSBmaXhlZCwgb3JkZXJlZCByZWdpc3RlcnMgYW5kCi0gKiAgICAgIHNldHRpbmcgYSBoYW5kbGVyIGZvciBpdCB0byBydW4gdGhlIGluc3RydWN0aW9uLgotICoKLSAqIEluIHRoZSBleGVjdXRpb24gcGhhc2UgYnkgYW4gaW5zdHJ1Y3Rpb24ncyBoYW5kbGVyOgotICoKLSAqICAgKikgSWYgdGhlIFBDIGlzIHdyaXR0ZW4gdG8gYnkgdGhlIGluc3RydWN0aW9uLCB0aGUKLSAqICAgICAgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBmdWxseSBzaW11bGF0ZWQgaW4gc29mdHdhcmUuCi0gKgotICogICAqKSBPdGhlcndpc2UsIGEgbW9kaWZpZWQgZm9ybSBvZiB0aGUgaW5zdHJ1Y3Rpb24gaXMKLSAqICAgICAgZGlyZWN0bHkgZXhlY3V0ZWQuICBJdHMgaGFuZGxlciBjYWxscyB0aGUKLSAqICAgICAgaW5zdHJ1Y3Rpb24gaW4gaW5zblswXS4gIEluIGluc25bMV0gaXMgYQotICogICAgICAibW92IHBjLCBsciIgdG8gcmV0dXJuLgotICoKLSAqICAgICAgQmVmb3JlIGNhbGxpbmcsIGxvYWQgdXAgdGhlIHJlb3JkZXJlZCByZWdpc3RlcnMKLSAqICAgICAgZnJvbSB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24ncyByZWdpc3RlcnMuICBJZiBvbmUKLSAqICAgICAgb2YgdGhlIG9yaWdpbmFsIGlucHV0IHJlZ2lzdGVycyBpcyB0aGUgUEMsIGNvbXB1dGUKLSAqICAgICAgYW5kIGFkanVzdCB0aGUgYXBwcm9wcmlhdGUgaW5wdXQgcmVnaXN0ZXIuCi0gKgotICoJQWZ0ZXIgY2FsbCBjb21wbGV0ZXMsIGNvcHkgdGhlIG91dHB1dCByZWdpc3RlcnMgdG8KLSAqICAgICAgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uJ3Mgb3JpZ2luYWwgcmVnaXN0ZXJzLgotICoKLSAqIFdlIGRvbid0IHVzZSBhIHJlYWwgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiBzaW5jZSB0aGF0Ci0gKiB3b3VsZCBoYXZlIHVzIGluIHRoZSBrZXJuZWwgZ28gZnJvbSBTVkMgbW9kZSB0byBTVkMKLSAqIG1vZGUgbG9zaW5nIHRoZSBsaW5rIHJlZ2lzdGVyLiAgSW5zdGVhZCB3ZSB1c2UgYW4KLSAqIHVuZGVmaW5lZCBpbnN0cnVjdGlvbi4gIFRvIHNpbXBsaWZ5IHByb2Nlc3NpbmcsIHRoZQotICogdW5kZWZpbmVkIGluc3RydWN0aW9uIHVzZWQgZm9yIGtwcm9iZXMgbXVzdCBiZSByZXNlcnZlZAotICogZXhjbHVzaXZlbHkgZm9yIGtwcm9iZXMgdXNlLgotICoKLSAqIFRPRE86IGlmZGVmIG91dCBzb21lIGluc3RydWN0aW9uIGRlY29kaW5nIGJhc2VkIG9uIGFyY2hpdGVjdHVyZS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgotCi0jZGVmaW5lIHNpZ25fZXh0ZW5kKHgsIHNpZ25iaXQpICgoeCkgfCAoMCAtICgoeCkgJiAoMSA8PCAoc2lnbmJpdCkpKSkpCi0KLSNkZWZpbmUgYnJhbmNoX2Rpc3BsYWNlbWVudChpbnNuKSBzaWduX2V4dGVuZCgoKGluc24pICYgMHhmZmZmZmYpIDw8IDIsIDI1KQotCi0jZGVmaW5lIGlzX3IxNShpbnNuLCBiaXRwb3MpICgoKGluc24pICYgKDB4ZiA8PCBiaXRwb3MpKSA9PSAoMHhmIDw8IGJpdHBvcykpCi0KLS8qCi0gKiBUZXN0IGlmIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zIHdyaXRlYmFjayB0aGUgYWRkcmVzcyByZWdpc3Rlci4KLSAqIGlmIFAgKGJpdCAyNCkgPT0gMCBvciBXIChiaXQgMjEpID09IDEKLSAqLwotI2RlZmluZSBpc193cml0ZWJhY2soaW5zbikgKChpbnNuIF4gMHgwMTAwMDAwMCkgJiAweDAxMjAwMDAwKQotCi0jZGVmaW5lIFBTUl9mcwkoUFNSX2Z8UFNSX3MpCi0KLSNkZWZpbmUgS1BST0JFX1JFVFVSTl9JTlNUUlVDVElPTgkweGUxYTBmMDBlCS8qIG1vdiBwYywgbHIgKi8KLQotdHlwZWRlZiBsb25nIChpbnNuXzBhcmdfZm5fdCkodm9pZCk7Ci10eXBlZGVmIGxvbmcgKGluc25fMWFyZ19mbl90KShsb25nKTsKLXR5cGVkZWYgbG9uZyAoaW5zbl8yYXJnX2ZuX3QpKGxvbmcsIGxvbmcpOwotdHlwZWRlZiBsb25nIChpbnNuXzNhcmdfZm5fdCkobG9uZywgbG9uZywgbG9uZyk7Ci10eXBlZGVmIGxvbmcgKGluc25fNGFyZ19mbl90KShsb25nLCBsb25nLCBsb25nLCBsb25nKTsKLXR5cGVkZWYgbG9uZyBsb25nIChpbnNuX2xscmV0XzBhcmdfZm5fdCkodm9pZCk7Ci10eXBlZGVmIGxvbmcgbG9uZyAoaW5zbl9sbHJldF8zYXJnX2ZuX3QpKGxvbmcsIGxvbmcsIGxvbmcpOwotdHlwZWRlZiBsb25nIGxvbmcgKGluc25fbGxyZXRfNGFyZ19mbl90KShsb25nLCBsb25nLCBsb25nLCBsb25nKTsKLQotdW5pb24gcmVnX3BhaXIgewotCWxvbmcgbG9uZwlkcjsKLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQlzdHJ1Y3QgeyBsb25nCXIwLCByMTsgfTsKLSNlbHNlCi0Jc3RydWN0IHsgbG9uZwlyMSwgcjA7IH07Ci0jZW5kaWYKLX07Ci0KLS8qCi0gKiBGb3IgU1RSIGFuZCBTVE0gaW5zdHJ1Y3Rpb25zLCBhbiBBUk0gY29yZSBtYXkgY2hvb3NlIHRvIHVzZSBlaXRoZXIKLSAqIGEgKzggb3IgYSArMTIgZGlzcGxhY2VtZW50IGZyb20gdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24ncyBhZGRyZXNzLgotICogV2hpY2hldmVyIHZhbHVlIGlzIGNob3NlbiBmb3IgYSBnaXZlbiBjb3JlLCBpdCBtdXN0IGJlIHRoZSBzYW1lIGZvcgotICogYm90aCBpbnN0cnVjdGlvbnMgYW5kIG1heSBub3QgY2hhbmdlLiAgVGhpcyBmdW5jdGlvbiBtZWFzdXJlcyBpdC4KLSAqLwotCi1zdGF0aWMgaW50IHN0cl9wY19vZmZzZXQ7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBmaW5kX3N0cl9wY19vZmZzZXQodm9pZCkKLXsKLQlpbnQgYWRkciwgc2NyYXRjaCwgcmV0OwotCi0JX19hc21fXyAoCi0JCSJzdWIJJVtyZXRdLCBwYywgIzQJCVxuXHQiCi0JCSJzdHIJcGMsICVbYWRkcl0JCVxuXHQiCi0JCSJsZHIJJVtzY3JdLCAlW2FkZHJdCQlcblx0IgotCQkic3ViCSVbcmV0XSwgJVtzY3JdLCAlW3JldF0JXG5cdCIKLQkJOiBbcmV0XSAiPXIiIChyZXQpLCBbc2NyXSAiPXIiIChzY3JhdGNoKSwgW2FkZHJdICIrbSIgKGFkZHIpKTsKLQotCXN0cl9wY19vZmZzZXQgPSByZXQ7Ci19Ci0KLS8qCi0gKiBUaGUgaW5zbnNsb3RfP2FyZ19yW3ddZmxhZ3MoKSBmdW5jdGlvbnMgYmVsb3cgYXJlIHRvIGtlZXAgdGhlCi0gKiBtc3IgLT4gKmZuIC0+IG1ycyBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMgaW5kaXZpc2libGUgc28gdGhhdAotICogdGhlIHN0YXRlIG9mIHRoZSBDUFNSIGZsYWdzIGFyZW4ndCBpbmFkdmVydGVudGx5IG1vZGlmaWVkCi0gKiBqdXN0IGJlZm9yZSBvciBqdXN0IGFmdGVyIHRoZSBjYWxsLgotICovCi0KLXN0YXRpYyBpbmxpbmUgbG9uZyBfX2twcm9iZXMKLWluc25zbG90XzBhcmdfcmZsYWdzKGxvbmcgY3BzciwgaW5zbl8wYXJnX2ZuX3QgKmZuKQotewotCXJlZ2lzdGVyIGxvbmcgcmV0IGFzbSgicjAiKTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIm1zcgljcHNyX2ZzLCAlW2Nwc3JdCVxuXHQiCi0JCSJtb3YJbHIsIHBjCQkJXG5cdCIKLQkJIm1vdglwYywgJVtmbl0JCVxuXHQiCi0JCTogIj1yIiAocmV0KQotCQk6IFtjcHNyXSAiciIgKGNwc3IpLCBbZm5dICJyIiAoZm4pCi0JCTogImxyIiwgImNjIgotCSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIGxvbmcgX19rcHJvYmVzCi1pbnNuc2xvdF9sbHJldF8wYXJnX3JmbGFncyhsb25nIGNwc3IsIGluc25fbGxyZXRfMGFyZ19mbl90ICpmbikKLXsKLQlyZWdpc3RlciBsb25nIHJldDAgYXNtKCJyMCIpOwotCXJlZ2lzdGVyIGxvbmcgcmV0MSBhc20oInIxIik7Ci0JdW5pb24gcmVnX3BhaXIgZm5yOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkibXNyCWNwc3JfZnMsICVbY3Bzcl0JXG5cdCIKLQkJIm1vdglsciwgcGMJCQlcblx0IgotCQkibW92CXBjLCAlW2ZuXQkJXG5cdCIKLQkJOiAiPXIiIChyZXQwKSwgIj1yIiAocmV0MSkKLQkJOiBbY3Bzcl0gInIiIChjcHNyKSwgW2ZuXSAiciIgKGZuKQotCQk6ICJsciIsICJjYyIKLQkpOwotCWZuci5yMCA9IHJldDA7Ci0JZm5yLnIxID0gcmV0MTsKLQlyZXR1cm4gZm5yLmRyOwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgX19rcHJvYmVzCi1pbnNuc2xvdF8xYXJnX3JmbGFncyhsb25nIHIwLCBsb25nIGNwc3IsIGluc25fMWFyZ19mbl90ICpmbikKLXsKLQlyZWdpc3RlciBsb25nIHJyMCBhc20oInIwIikgPSByMDsKLQlyZWdpc3RlciBsb25nIHJldCBhc20oInIwIik7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSJtc3IJY3Bzcl9mcywgJVtjcHNyXQlcblx0IgotCQkibW92CWxyLCBwYwkJCVxuXHQiCi0JCSJtb3YJcGMsICVbZm5dCQlcblx0IgotCQk6ICI9ciIgKHJldCkKLQkJOiAiMCIgKHJyMCksIFtjcHNyXSAiciIgKGNwc3IpLCBbZm5dICJyIiAoZm4pCi0JCTogImxyIiwgImNjIgotCSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIF9fa3Byb2JlcwotaW5zbnNsb3RfMmFyZ19yZmxhZ3MobG9uZyByMCwgbG9uZyByMSwgbG9uZyBjcHNyLCBpbnNuXzJhcmdfZm5fdCAqZm4pCi17Ci0JcmVnaXN0ZXIgbG9uZyBycjAgYXNtKCJyMCIpID0gcjA7Ci0JcmVnaXN0ZXIgbG9uZyBycjEgYXNtKCJyMSIpID0gcjE7Ci0JcmVnaXN0ZXIgbG9uZyByZXQgYXNtKCJyMCIpOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkibXNyCWNwc3JfZnMsICVbY3Bzcl0JXG5cdCIKLQkJIm1vdglsciwgcGMJCQlcblx0IgotCQkibW92CXBjLCAlW2ZuXQkJXG5cdCIKLQkJOiAiPXIiIChyZXQpCi0JCTogIjAiIChycjApLCAiciIgKHJyMSksCi0JCSAgW2Nwc3JdICJyIiAoY3BzciksIFtmbl0gInIiIChmbikKLQkJOiAibHIiLCAiY2MiCi0JKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgX19rcHJvYmVzCi1pbnNuc2xvdF8zYXJnX3JmbGFncyhsb25nIHIwLCBsb25nIHIxLCBsb25nIHIyLCBsb25nIGNwc3IsIGluc25fM2FyZ19mbl90ICpmbikKLXsKLQlyZWdpc3RlciBsb25nIHJyMCBhc20oInIwIikgPSByMDsKLQlyZWdpc3RlciBsb25nIHJyMSBhc20oInIxIikgPSByMTsKLQlyZWdpc3RlciBsb25nIHJyMiBhc20oInIyIikgPSByMjsKLQlyZWdpc3RlciBsb25nIHJldCBhc20oInIwIik7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSJtc3IJY3Bzcl9mcywgJVtjcHNyXQlcblx0IgotCQkibW92CWxyLCBwYwkJCVxuXHQiCi0JCSJtb3YJcGMsICVbZm5dCQlcblx0IgotCQk6ICI9ciIgKHJldCkKLQkJOiAiMCIgKHJyMCksICJyIiAocnIxKSwgInIiIChycjIpLAotCQkgIFtjcHNyXSAiciIgKGNwc3IpLCBbZm5dICJyIiAoZm4pCi0JCTogImxyIiwgImNjIgotCSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIGxvbmcgX19rcHJvYmVzCi1pbnNuc2xvdF9sbHJldF8zYXJnX3JmbGFncyhsb25nIHIwLCBsb25nIHIxLCBsb25nIHIyLCBsb25nIGNwc3IsCi0JCQkgICBpbnNuX2xscmV0XzNhcmdfZm5fdCAqZm4pCi17Ci0JcmVnaXN0ZXIgbG9uZyBycjAgYXNtKCJyMCIpID0gcjA7Ci0JcmVnaXN0ZXIgbG9uZyBycjEgYXNtKCJyMSIpID0gcjE7Ci0JcmVnaXN0ZXIgbG9uZyBycjIgYXNtKCJyMiIpID0gcjI7Ci0JcmVnaXN0ZXIgbG9uZyByZXQwIGFzbSgicjAiKTsKLQlyZWdpc3RlciBsb25nIHJldDEgYXNtKCJyMSIpOwotCXVuaW9uIHJlZ19wYWlyIGZucjsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIm1zcgljcHNyX2ZzLCAlW2Nwc3JdCVxuXHQiCi0JCSJtb3YJbHIsIHBjCQkJXG5cdCIKLQkJIm1vdglwYywgJVtmbl0JCVxuXHQiCi0JCTogIj1yIiAocmV0MCksICI9ciIgKHJldDEpCi0JCTogIjAiIChycjApLCAiciIgKHJyMSksICJyIiAocnIyKSwKLQkJICBbY3Bzcl0gInIiIChjcHNyKSwgW2ZuXSAiciIgKGZuKQotCQk6ICJsciIsICJjYyIKLQkpOwotCWZuci5yMCA9IHJldDA7Ci0JZm5yLnIxID0gcmV0MTsKLQlyZXR1cm4gZm5yLmRyOwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgX19rcHJvYmVzCi1pbnNuc2xvdF80YXJnX3JmbGFncyhsb25nIHIwLCBsb25nIHIxLCBsb25nIHIyLCBsb25nIHIzLCBsb25nIGNwc3IsCi0JCSAgICAgaW5zbl80YXJnX2ZuX3QgKmZuKQotewotCXJlZ2lzdGVyIGxvbmcgcnIwIGFzbSgicjAiKSA9IHIwOwotCXJlZ2lzdGVyIGxvbmcgcnIxIGFzbSgicjEiKSA9IHIxOwotCXJlZ2lzdGVyIGxvbmcgcnIyIGFzbSgicjIiKSA9IHIyOwotCXJlZ2lzdGVyIGxvbmcgcnIzIGFzbSgicjMiKSA9IHIzOwotCXJlZ2lzdGVyIGxvbmcgcmV0IGFzbSgicjAiKTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIm1zcgljcHNyX2ZzLCAlW2Nwc3JdCVxuXHQiCi0JCSJtb3YJbHIsIHBjCQkJXG5cdCIKLQkJIm1vdglwYywgJVtmbl0JCVxuXHQiCi0JCTogIj1yIiAocmV0KQotCQk6ICIwIiAocnIwKSwgInIiIChycjEpLCAiciIgKHJyMiksICJyIiAocnIzKSwKLQkJICBbY3Bzcl0gInIiIChjcHNyKSwgW2ZuXSAiciIgKGZuKQotCQk6ICJsciIsICJjYyIKLQkpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBfX2twcm9iZXMKLWluc25zbG90XzFhcmdfcndmbGFncyhsb25nIHIwLCBsb25nICpjcHNyLCBpbnNuXzFhcmdfZm5fdCAqZm4pCi17Ci0JcmVnaXN0ZXIgbG9uZyBycjAgYXNtKCJyMCIpID0gcjA7Ci0JcmVnaXN0ZXIgbG9uZyByZXQgYXNtKCJyMCIpOwotCWxvbmcgb2xkY3BzciA9ICpjcHNyOwotCWxvbmcgbmV3Y3BzcjsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIm1zcgljcHNyX2ZzLCAlW29sZGNwc3JdCVxuXHQiCi0JCSJtb3YJbHIsIHBjCQkJXG5cdCIKLQkJIm1vdglwYywgJVtmbl0JCVxuXHQiCi0JCSJtcnMJJVtuZXdjcHNyXSwgY3Bzcglcblx0IgotCQk6ICI9ciIgKHJldCksIFtuZXdjcHNyXSAiPXIiIChuZXdjcHNyKQotCQk6ICIwIiAocnIwKSwgW29sZGNwc3JdICJyIiAob2xkY3BzciksIFtmbl0gInIiIChmbikKLQkJOiAibHIiLCAiY2MiCi0JKTsKLQkqY3BzciA9IChvbGRjcHNyICYgflBTUl9mcykgfCAobmV3Y3BzciAmIFBTUl9mcyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIF9fa3Byb2JlcwotaW5zbnNsb3RfMmFyZ19yd2ZsYWdzKGxvbmcgcjAsIGxvbmcgcjEsIGxvbmcgKmNwc3IsIGluc25fMmFyZ19mbl90ICpmbikKLXsKLQlyZWdpc3RlciBsb25nIHJyMCBhc20oInIwIikgPSByMDsKLQlyZWdpc3RlciBsb25nIHJyMSBhc20oInIxIikgPSByMTsKLQlyZWdpc3RlciBsb25nIHJldCBhc20oInIwIik7Ci0JbG9uZyBvbGRjcHNyID0gKmNwc3I7Ci0JbG9uZyBuZXdjcHNyOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkibXNyCWNwc3JfZnMsICVbb2xkY3Bzcl0JXG5cdCIKLQkJIm1vdglsciwgcGMJCQlcblx0IgotCQkibW92CXBjLCAlW2ZuXQkJXG5cdCIKLQkJIm1ycwklW25ld2Nwc3JdLCBjcHNyCVxuXHQiCi0JCTogIj1yIiAocmV0KSwgW25ld2Nwc3JdICI9ciIgKG5ld2Nwc3IpCi0JCTogIjAiIChycjApLCAiciIgKHJyMSksIFtvbGRjcHNyXSAiciIgKG9sZGNwc3IpLCBbZm5dICJyIiAoZm4pCi0JCTogImxyIiwgImNjIgotCSk7Ci0JKmNwc3IgPSAob2xkY3BzciAmIH5QU1JfZnMpIHwgKG5ld2Nwc3IgJiBQU1JfZnMpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBfX2twcm9iZXMKLWluc25zbG90XzNhcmdfcndmbGFncyhsb25nIHIwLCBsb25nIHIxLCBsb25nIHIyLCBsb25nICpjcHNyLAotCQkgICAgICBpbnNuXzNhcmdfZm5fdCAqZm4pCi17Ci0JcmVnaXN0ZXIgbG9uZyBycjAgYXNtKCJyMCIpID0gcjA7Ci0JcmVnaXN0ZXIgbG9uZyBycjEgYXNtKCJyMSIpID0gcjE7Ci0JcmVnaXN0ZXIgbG9uZyBycjIgYXNtKCJyMiIpID0gcjI7Ci0JcmVnaXN0ZXIgbG9uZyByZXQgYXNtKCJyMCIpOwotCWxvbmcgb2xkY3BzciA9ICpjcHNyOwotCWxvbmcgbmV3Y3BzcjsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIm1zcgljcHNyX2ZzLCAlW29sZGNwc3JdCVxuXHQiCi0JCSJtb3YJbHIsIHBjCQkJXG5cdCIKLQkJIm1vdglwYywgJVtmbl0JCVxuXHQiCi0JCSJtcnMJJVtuZXdjcHNyXSwgY3Bzcglcblx0IgotCQk6ICI9ciIgKHJldCksIFtuZXdjcHNyXSAiPXIiIChuZXdjcHNyKQotCQk6ICIwIiAocnIwKSwgInIiIChycjEpLCAiciIgKHJyMiksCi0JCSAgW29sZGNwc3JdICJyIiAob2xkY3BzciksIFtmbl0gInIiIChmbikKLQkJOiAibHIiLCAiY2MiCi0JKTsKLQkqY3BzciA9IChvbGRjcHNyICYgflBTUl9mcykgfCAobmV3Y3BzciAmIFBTUl9mcyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIF9fa3Byb2JlcwotaW5zbnNsb3RfNGFyZ19yd2ZsYWdzKGxvbmcgcjAsIGxvbmcgcjEsIGxvbmcgcjIsIGxvbmcgcjMsIGxvbmcgKmNwc3IsCi0JCSAgICAgIGluc25fNGFyZ19mbl90ICpmbikKLXsKLQlyZWdpc3RlciBsb25nIHJyMCBhc20oInIwIikgPSByMDsKLQlyZWdpc3RlciBsb25nIHJyMSBhc20oInIxIikgPSByMTsKLQlyZWdpc3RlciBsb25nIHJyMiBhc20oInIyIikgPSByMjsKLQlyZWdpc3RlciBsb25nIHJyMyBhc20oInIzIikgPSByMzsKLQlyZWdpc3RlciBsb25nIHJldCBhc20oInIwIik7Ci0JbG9uZyBvbGRjcHNyID0gKmNwc3I7Ci0JbG9uZyBuZXdjcHNyOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkibXNyCWNwc3JfZnMsICVbb2xkY3Bzcl0JXG5cdCIKLQkJIm1vdglsciwgcGMJCQlcblx0IgotCQkibW92CXBjLCAlW2ZuXQkJXG5cdCIKLQkJIm1ycwklW25ld2Nwc3JdLCBjcHNyCVxuXHQiCi0JCTogIj1yIiAocmV0KSwgW25ld2Nwc3JdICI9ciIgKG5ld2Nwc3IpCi0JCTogIjAiIChycjApLCAiciIgKHJyMSksICJyIiAocnIyKSwgInIiIChycjMpLAotCQkgIFtvbGRjcHNyXSAiciIgKG9sZGNwc3IpLCBbZm5dICJyIiAoZm4pCi0JCTogImxyIiwgImNjIgotCSk7Ci0JKmNwc3IgPSAob2xkY3BzciAmIH5QU1JfZnMpIHwgKG5ld2Nwc3IgJiBQU1JfZnMpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBsb25nIF9fa3Byb2JlcwotaW5zbnNsb3RfbGxyZXRfNGFyZ19yd2ZsYWdzKGxvbmcgcjAsIGxvbmcgcjEsIGxvbmcgcjIsIGxvbmcgcjMsIGxvbmcgKmNwc3IsCi0JCQkgICAgaW5zbl9sbHJldF80YXJnX2ZuX3QgKmZuKQotewotCXJlZ2lzdGVyIGxvbmcgcnIwIGFzbSgicjAiKSA9IHIwOwotCXJlZ2lzdGVyIGxvbmcgcnIxIGFzbSgicjEiKSA9IHIxOwotCXJlZ2lzdGVyIGxvbmcgcnIyIGFzbSgicjIiKSA9IHIyOwotCXJlZ2lzdGVyIGxvbmcgcnIzIGFzbSgicjMiKSA9IHIzOwotCXJlZ2lzdGVyIGxvbmcgcmV0MCBhc20oInIwIik7Ci0JcmVnaXN0ZXIgbG9uZyByZXQxIGFzbSgicjEiKTsKLQlsb25nIG9sZGNwc3IgPSAqY3BzcjsKLQlsb25nIG5ld2Nwc3I7Ci0JdW5pb24gcmVnX3BhaXIgZm5yOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkibXNyCWNwc3JfZnMsICVbb2xkY3Bzcl0JXG5cdCIKLQkJIm1vdglsciwgcGMJCQlcblx0IgotCQkibW92CXBjLCAlW2ZuXQkJXG5cdCIKLQkJIm1ycwklW25ld2Nwc3JdLCBjcHNyCVxuXHQiCi0JCTogIj1yIiAocmV0MCksICI9ciIgKHJldDEpLCBbbmV3Y3Bzcl0gIj1yIiAobmV3Y3BzcikKLQkJOiAiMCIgKHJyMCksICJyIiAocnIxKSwgInIiIChycjIpLCAiciIgKHJyMyksCi0JCSAgW29sZGNwc3JdICJyIiAob2xkY3BzciksIFtmbl0gInIiIChmbikKLQkJOiAibHIiLCAiY2MiCi0JKTsKLQkqY3BzciA9IChvbGRjcHNyICYgflBTUl9mcykgfCAobmV3Y3BzciAmIFBTUl9mcyk7Ci0JZm5yLnIwID0gcmV0MDsKLQlmbnIucjEgPSByZXQxOwotCXJldHVybiBmbnIuZHI7Ci19Ci0KLS8qCi0gKiBUbyBhdm9pZCB0aGUgY29tcGxpY2F0aW9ucyBvZiBtaW1pY2luZyBzaW5nbGUtc3RlcHBpbmcgb24gYQotICogcHJvY2Vzc29yIHdpdGhvdXQgYSBOZXh0LVBDIG9yIGEgc2luZ2xlLXN0ZXAgbW9kZSwgYW5kIHRvCi0gKiBhdm9pZCBoYXZpbmcgdG8gZGVhbCB3aXRoIHRoZSBzaWRlLWVmZmVjdHMgb2YgYm9vc3RpbmcsIHdlCi0gKiBzaW11bGF0ZSBvciBlbXVsYXRlIChhbG1vc3QpIGFsbCBBUk0gaW5zdHJ1Y3Rpb25zLgotICoKLSAqICJTaW11bGF0aW9uIiBpcyB3aGVyZSB0aGUgaW5zdHJ1Y3Rpb24ncyBiZWhhdmlvciBpcyBkdXBsaWNhdGVkIGluCi0gKiBDIGNvZGUuICAiRW11bGF0aW9uIiBpcyB3aGVyZSB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gaXMgcmV3cml0dGVuCi0gKiBhbmQgZXhlY3V0ZWQsIG9mdGVuIGJ5IGFsdGVyaW5nIGl0cyByZWdpc3RlcnMuCi0gKgotICogQnkgaGF2aW5nIGFsbCBiZWhhdmlvciBvZiB0aGUga3Byb2JlJ2QgaW5zdHJ1Y3Rpb24gY29tcGxldGVkIGJlZm9yZQotICogcmV0dXJuaW5nIGZyb20gdGhlIGtwcm9iZV9oYW5kbGVyKCksIGFsbCBsb2NrcyAoc2NoZWR1bGVyIGFuZAotICogaW50ZXJydXB0KSBjYW4gc2FmZWx5IGJlIHJlbGVhc2VkLiAgVGhlcmUgaXMgbm8gbmVlZCBmb3Igc2Vjb25kYXJ5Ci0gKiBicmVha3BvaW50cywgbm8gcmFjZSB3aXRoIE1QIG9yIHByZWVtcHRhYmxlIGtlcm5lbHMsIG5vciBoYXZpbmcgdG8KLSAqIGNsZWFuIHVwIHJlc291cmNlcyBjb3VudHMgYXQgYSBsYXRlciB0aW1lIGltcGFjdGluZyBvdmVyYWxsIHN5c3RlbQotICogcGVyZm9ybWFuY2UuICBCeSByZXdyaXRpbmcgdGhlIGluc3RydWN0aW9uLCBvbmx5IHRoZSBtaW5pbXVtIHJlZ2lzdGVycwotICogbmVlZCB0byBiZSBsb2FkZWQgYW5kIHNhdmVkIGJhY2sgb3B0aW1pemluZyBwZXJmb3JtYW5jZS4KLSAqCi0gKiBDYWxsaW5nIHRoZSBpbnNuc2xvdF8qX3J3ZmxhZ3MgdmVyc2lvbiBvZiBhIGZ1bmN0aW9uIGRvZXNuJ3QgaHVydAotICogYW55dGhpbmcgZXZlbiB3aGVuIHRoZSBDUFNSIGZsYWdzIGFyZW4ndCB1cGRhdGVkIGJ5IHRoZQotICogaW5zdHJ1Y3Rpb24uICBJdCdzIGp1c3QgYSBsaXR0bGUgc2xvd2VyIGluIHJldHVybiBmb3Igc2F2aW5nCi0gKiBhIGxpdHRsZSBzcGFjZSBieSBub3QgaGF2aW5nIGEgZHVwbGljYXRlIGZ1bmN0aW9uIHRoYXQgZG9lc24ndAotICogdXBkYXRlIHRoZSBmbGFncy4gIChUaGUgc2FtZSBvcHRpbWl6YXRpb24gY2FuIGJlIHNhaWQgZm9yCi0gKiBpbnN0cnVjdGlvbnMgdGhhdCBkbyBvciBkb24ndCBwZXJmb3JtIHJlZ2lzdGVyIHdyaXRlYmFjaykKLSAqIEFsc28sIGluc3RydWN0aW9ucyBjYW4gZWl0aGVyIHJlYWQgdGhlIGZsYWdzLCBvbmx5IHdyaXRlIHRoZQotICogZmxhZ3MsIG9yIHJlYWQgYW5kIHdyaXRlIHRoZSBmbGFncy4gIFRvIHNhdmUgY29tYmluYXRpb25zCi0gKiByYXRoZXIgdGhhbiBmb3Igc2hlZXIgcGVyZm9ybWFuY2UsIGZsYWcgZnVuY3Rpb25zIGp1c3QgYXNzdW1lCi0gKiByZWFkIGFuZCB3cml0ZSBvZiBmbGFncy4KLSAqLwotCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgc2ltdWxhdGVfYmJsKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOwotCWxvbmcgaWFkZHIgPSAobG9uZylwLT5hZGRyOwotCWludCBkaXNwICA9IGJyYW5jaF9kaXNwbGFjZW1lbnQoaW5zbik7Ci0KLQlpZiAoaW5zbiAmICgxIDw8IDI0KSkKLQkJcmVncy0+QVJNX2xyID0gaWFkZHIgKyA0OwotCi0JcmVncy0+QVJNX3BjID0gaWFkZHIgKyA4ICsgZGlzcDsKLX0KLQotc3RhdGljIHZvaWQgX19rcHJvYmVzIHNpbXVsYXRlX2JseDEoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Ja3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7Ci0JbG9uZyBpYWRkciA9IChsb25nKXAtPmFkZHI7Ci0JaW50IGRpc3AgPSBicmFuY2hfZGlzcGxhY2VtZW50KGluc24pOwotCi0JcmVncy0+QVJNX2xyID0gaWFkZHIgKyA0OwotCXJlZ3MtPkFSTV9wYyA9IGlhZGRyICsgOCArIGRpc3AgKyAoKGluc24gPj4gMjMpICYgMHgyKTsKLQlyZWdzLT5BUk1fY3BzciB8PSBQU1JfVF9CSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBzaW11bGF0ZV9ibHgyYngoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Ja3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7Ci0JaW50IHJtID0gaW5zbiAmIDB4ZjsKLQlsb25nIHJtdiA9IHJlZ3MtPnVyZWdzW3JtXTsKLQotCWlmIChpbnNuICYgKDEgPDwgNSkpCi0JCXJlZ3MtPkFSTV9sciA9IChsb25nKXAtPmFkZHIgKyA0OwotCi0JcmVncy0+QVJNX3BjID0gcm12ICYgfjB4MTsKLQlyZWdzLT5BUk1fY3BzciAmPSB+UFNSX1RfQklUOwotCWlmIChybXYgJiAweDEpCi0JCXJlZ3MtPkFSTV9jcHNyIHw9IFBTUl9UX0JJVDsKLX0KLQotc3RhdGljIHZvaWQgX19rcHJvYmVzIHNpbXVsYXRlX21ycyhzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKLQlpbnQgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7Ci0JdW5zaWduZWQgbG9uZyBtYXNrID0gMHhmOGZmMDNkZjsgLyogTWFzayBvdXQgZXhlY3V0aW9uIHN0YXRlICovCi0JcmVncy0+dXJlZ3NbcmRdID0gcmVncy0+QVJNX2Nwc3IgJiBtYXNrOwotfQotCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgc2ltdWxhdGVfbGRtMXN0bTEoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Ja3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7Ci0JaW50IHJuID0gKGluc24gPj4gMTYpICYgMHhmOwotCWludCBsYml0ID0gaW5zbiAmICgxIDw8IDIwKTsKLQlpbnQgd2JpdCA9IGluc24gJiAoMSA8PCAyMSk7Ci0JaW50IHViaXQgPSBpbnNuICYgKDEgPDwgMjMpOwotCWludCBwYml0ID0gaW5zbiAmICgxIDw8IDI0KTsKLQlsb25nICphZGRyID0gKGxvbmcgKilyZWdzLT51cmVnc1tybl07Ci0JaW50IHJlZ19iaXRfdmVjdG9yOwotCWludCByZWdfY291bnQ7Ci0KLQlyZWdfY291bnQgPSAwOwotCXJlZ19iaXRfdmVjdG9yID0gaW5zbiAmIDB4ZmZmZjsKLQl3aGlsZSAocmVnX2JpdF92ZWN0b3IpIHsKLQkJcmVnX2JpdF92ZWN0b3IgJj0gKHJlZ19iaXRfdmVjdG9yIC0gMSk7Ci0JCSsrcmVnX2NvdW50OwotCX0KLQotCWlmICghdWJpdCkKLQkJYWRkciAtPSByZWdfY291bnQ7Ci0JYWRkciArPSAoIXBiaXQgPT0gIXViaXQpOwotCi0JcmVnX2JpdF92ZWN0b3IgPSBpbnNuICYgMHhmZmZmOwotCXdoaWxlIChyZWdfYml0X3ZlY3RvcikgewotCQlpbnQgcmVnID0gX19mZnMocmVnX2JpdF92ZWN0b3IpOwotCQlyZWdfYml0X3ZlY3RvciAmPSAocmVnX2JpdF92ZWN0b3IgLSAxKTsKLQkJaWYgKGxiaXQpCi0JCQlyZWdzLT51cmVnc1tyZWddID0gKmFkZHIrKzsKLQkJZWxzZQotCQkJKmFkZHIrKyA9IHJlZ3MtPnVyZWdzW3JlZ107Ci0JfQotCi0JaWYgKHdiaXQpIHsKLQkJaWYgKCF1Yml0KQotCQkJYWRkciAtPSByZWdfY291bnQ7Ci0JCWFkZHIgLT0gKCFwYml0ID09ICF1Yml0KTsKLQkJcmVncy0+dXJlZ3Nbcm5dID0gKGxvbmcpYWRkcjsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBzaW11bGF0ZV9zdG0xX3BjKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJlZ3MtPkFSTV9wYyA9IChsb25nKXAtPmFkZHIgKyBzdHJfcGNfb2Zmc2V0OwotCXNpbXVsYXRlX2xkbTFzdG0xKHAsIHJlZ3MpOwotCXJlZ3MtPkFSTV9wYyA9IChsb25nKXAtPmFkZHIgKyA0OwotfQotCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgc2ltdWxhdGVfbW92X2lwc3Aoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmVncy0+dXJlZ3NbMTJdID0gcmVncy0+dXJlZ3NbMTNdOwotfQotCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgZW11bGF0ZV9sZHJkKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWluc25fMmFyZ19mbl90ICppX2ZuID0gKGluc25fMmFyZ19mbl90ICopJnAtPmFpbnNuLmluc25bMF07Ci0Ja3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7Ci0JbG9uZyBwcGMgPSAobG9uZylwLT5hZGRyICsgODsKLQlpbnQgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7Ci0JaW50IHJuID0gKGluc24gPj4gMTYpICYgMHhmOwotCWludCBybSA9IGluc24gJiAweGY7ICAvKiBybSBtYXkgYmUgaW52YWxpZCwgZG9uJ3QgY2FyZS4gKi8KLQlsb25nIHJtdiA9IChybSA9PSAxNSkgPyBwcGMgOiByZWdzLT51cmVnc1tybV07Ci0JbG9uZyBybnYgPSAocm4gPT0gMTUpID8gcHBjIDogcmVncy0+dXJlZ3Nbcm5dOwotCi0JLyogTm90IGZvbGxvd2luZyB0aGUgQyBjYWxsaW5nIGNvbnZlbnRpb24gaGVyZSwgc28gbmVlZCBhc20oKS4gKi8KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSJsZHIJcjAsICVbcm5dCVxuXHQiCi0JCSJsZHIJcjEsICVbcm1dCVxuXHQiCi0JCSJtc3IJY3Bzcl9mcywgJVtjcHNyXVxuXHQiCi0JCSJtb3YJbHIsIHBjCQlcblx0IgotCQkibW92CXBjLCAlW2lfZm5dCVxuXHQiCi0JCSJzdHIJcjAsICVbcm5dCVxuXHQiCS8qIGluIGNhc2Ugb2Ygd3JpdGViYWNrICovCi0JCSJzdHIJcjIsICVbcmQwXQlcblx0IgotCQkic3RyCXIzLCAlW3JkMV0JXG5cdCIKLQkJOiBbcm5dICAiK20iIChybnYpLAotCQkgIFtyZDBdICI9bSIgKHJlZ3MtPnVyZWdzW3JkXSksCi0JCSAgW3JkMV0gIj1tIiAocmVncy0+dXJlZ3NbcmQrMV0pCi0JCTogW3JtXSAgICJtIiAocm12KSwKLQkJICBbY3Bzcl0gInIiIChyZWdzLT5BUk1fY3BzciksCi0JCSAgW2lfZm5dICJyIiAoaV9mbikKLQkJOiAicjAiLCAicjEiLCAicjIiLCAicjMiLCAibHIiLCAiY2MiCi0JKTsKLQlpZiAoaXNfd3JpdGViYWNrKGluc24pKQotCQlyZWdzLT51cmVnc1tybl0gPSBybnY7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBlbXVsYXRlX3N0cmQoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW5zbl80YXJnX2ZuX3QgKmlfZm4gPSAoaW5zbl80YXJnX2ZuX3QgKikmcC0+YWluc24uaW5zblswXTsKLQlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKLQlsb25nIHBwYyA9IChsb25nKXAtPmFkZHIgKyA4OwotCWludCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKLQlpbnQgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7Ci0JaW50IHJtICA9IGluc24gJiAweGY7Ci0JbG9uZyBybnYgPSAocm4gPT0gMTUpID8gcHBjIDogcmVncy0+dXJlZ3Nbcm5dOwotCS8qIHJtL3JtdiBtYXkgYmUgaW52YWxpZCwgZG9uJ3QgY2FyZS4gKi8KLQlsb25nIHJtdiA9IChybSA9PSAxNSkgPyBwcGMgOiByZWdzLT51cmVnc1tybV07Ci0JbG9uZyBybnZfd2I7Ci0KLQlybnZfd2IgPSBpbnNuc2xvdF80YXJnX3JmbGFncyhybnYsIHJtdiwgcmVncy0+dXJlZ3NbcmRdLAotCQkJCQkgICAgICAgcmVncy0+dXJlZ3NbcmQrMV0sCi0JCQkJCSAgICAgICByZWdzLT5BUk1fY3BzciwgaV9mbik7Ci0JaWYgKGlzX3dyaXRlYmFjayhpbnNuKSkKLQkJcmVncy0+dXJlZ3Nbcm5dID0gcm52X3diOwotfQotCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgZW11bGF0ZV9sZHIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW5zbl9sbHJldF8zYXJnX2ZuX3QgKmlfZm4gPSAoaW5zbl9sbHJldF8zYXJnX2ZuX3QgKikmcC0+YWluc24uaW5zblswXTsKLQlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKLQlsb25nIHBwYyA9IChsb25nKXAtPmFkZHIgKyA4OwotCXVuaW9uIHJlZ19wYWlyIGZucjsKLQlpbnQgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7Ci0JaW50IHJuID0gKGluc24gPj4gMTYpICYgMHhmOwotCWludCBybSA9IGluc24gJiAweGY7Ci0JbG9uZyByZHY7Ci0JbG9uZyBybnYgPSAocm4gPT0gMTUpID8gcHBjIDogcmVncy0+dXJlZ3Nbcm5dOwotCWxvbmcgcm12ID0gKHJtID09IDE1KSA/IHBwYyA6IHJlZ3MtPnVyZWdzW3JtXTsKLQlsb25nIGNwc3IgPSByZWdzLT5BUk1fY3BzcjsKLQotCWZuci5kciA9IGluc25zbG90X2xscmV0XzNhcmdfcmZsYWdzKHJudiwgMCwgcm12LCBjcHNyLCBpX2ZuKTsKLQlpZiAocm4gIT0gMTUpCi0JCXJlZ3MtPnVyZWdzW3JuXSA9IGZuci5yMDsgIC8qIFNhdmUgUm4gaW4gY2FzZSBvZiB3cml0ZWJhY2suICovCi0JcmR2ID0gZm5yLnIxOwotCi0JaWYgKHJkID09IDE1KSB7Ci0jaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDUKLQkJY3BzciAmPSB+UFNSX1RfQklUOwotCQlpZiAocmR2ICYgMHgxKQotCQkJY3BzciB8PSBQU1JfVF9CSVQ7Ci0JCXJlZ3MtPkFSTV9jcHNyID0gY3BzcjsKLQkJcmR2ICY9IH4weDE7Ci0jZWxzZQotCQlyZHYgJj0gfjB4MjsKLSNlbmRpZgotCX0KLQlyZWdzLT51cmVnc1tyZF0gPSByZHY7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBlbXVsYXRlX3N0cihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnNuXzNhcmdfZm5fdCAqaV9mbiA9IChpbnNuXzNhcmdfZm5fdCAqKSZwLT5haW5zbi5pbnNuWzBdOwotCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOwotCWxvbmcgaWFkZHIgPSAobG9uZylwLT5hZGRyOwotCWludCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKLQlpbnQgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7Ci0JaW50IHJtID0gaW5zbiAmIDB4ZjsKLQlsb25nIHJkdiA9IChyZCA9PSAxNSkgPyBpYWRkciArIHN0cl9wY19vZmZzZXQgOiByZWdzLT51cmVnc1tyZF07Ci0JbG9uZyBybnYgPSAocm4gPT0gMTUpID8gaWFkZHIgKyAgOCA6IHJlZ3MtPnVyZWdzW3JuXTsKLQlsb25nIHJtdiA9IHJlZ3MtPnVyZWdzW3JtXTsgIC8qIHJtL3JtdiBtYXkgYmUgaW52YWxpZCwgZG9uJ3QgY2FyZS4gKi8KLQlsb25nIHJudl93YjsKLQotCXJudl93YiA9IGluc25zbG90XzNhcmdfcmZsYWdzKHJudiwgcmR2LCBybXYsIHJlZ3MtPkFSTV9jcHNyLCBpX2ZuKTsKLQlpZiAocm4gIT0gMTUpCi0JCXJlZ3MtPnVyZWdzW3JuXSA9IHJudl93YjsgIC8qIFNhdmUgUm4gaW4gY2FzZSBvZiB3cml0ZWJhY2suICovCi19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBlbXVsYXRlX3NhdChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnNuXzFhcmdfZm5fdCAqaV9mbiA9IChpbnNuXzFhcmdfZm5fdCAqKSZwLT5haW5zbi5pbnNuWzBdOwotCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOwotCWludCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKLQlpbnQgcm0gPSBpbnNuICYgMHhmOwotCWxvbmcgcm12ID0gcmVncy0+dXJlZ3Nbcm1dOwotCi0JLyogV3JpdGVzIFEgZmxhZyAqLwotCXJlZ3MtPnVyZWdzW3JkXSA9IGluc25zbG90XzFhcmdfcndmbGFncyhybXYsICZyZWdzLT5BUk1fY3BzciwgaV9mbik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBlbXVsYXRlX3NlbChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnNuXzJhcmdfZm5fdCAqaV9mbiA9IChpbnNuXzJhcmdfZm5fdCAqKSZwLT5haW5zbi5pbnNuWzBdOwotCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOwotCWludCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKLQlpbnQgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7Ci0JaW50IHJtID0gaW5zbiAmIDB4ZjsKLQlsb25nIHJudiA9IHJlZ3MtPnVyZWdzW3JuXTsKLQlsb25nIHJtdiA9IHJlZ3MtPnVyZWdzW3JtXTsKLQotCS8qIFJlYWRzIEdFIGJpdHMgKi8KLQlyZWdzLT51cmVnc1tyZF0gPSBpbnNuc2xvdF8yYXJnX3JmbGFncyhybnYsIHJtdiwgcmVncy0+QVJNX2Nwc3IsIGlfZm4pOwotfQotCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMgZW11bGF0ZV9ub25lKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWluc25fMGFyZ19mbl90ICppX2ZuID0gKGluc25fMGFyZ19mbl90ICopJnAtPmFpbnNuLmluc25bMF07Ci0KLQlpbnNuc2xvdF8wYXJnX3JmbGFncyhyZWdzLT5BUk1fY3BzciwgaV9mbik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBlbXVsYXRlX25vcChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLX0KLQotc3RhdGljIHZvaWQgX19rcHJvYmVzCi1lbXVsYXRlX3JkMTJfbW9kaWZ5KHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWluc25fMWFyZ19mbl90ICppX2ZuID0gKGluc25fMWFyZ19mbl90ICopJnAtPmFpbnNuLmluc25bMF07Ci0Ja3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7Ci0JaW50IHJkID0gKGluc24gPj4gMTIpICYgMHhmOwotCWxvbmcgcmR2ID0gcmVncy0+dXJlZ3NbcmRdOwotCi0JcmVncy0+dXJlZ3NbcmRdID0gaW5zbnNsb3RfMWFyZ19yZmxhZ3MocmR2LCByZWdzLT5BUk1fY3BzciwgaV9mbik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcwotZW11bGF0ZV9yZDEycm4wX21vZGlmeShzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnNuXzJhcmdfZm5fdCAqaV9mbiA9IChpbnNuXzJhcmdfZm5fdCAqKSZwLT5haW5zbi5pbnNuWzBdOwotCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOwotCWludCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKLQlpbnQgcm4gPSBpbnNuICYgMHhmOwotCWxvbmcgcmR2ID0gcmVncy0+dXJlZ3NbcmRdOwotCWxvbmcgcm52ID0gcmVncy0+dXJlZ3Nbcm5dOwotCi0JcmVncy0+dXJlZ3NbcmRdID0gaW5zbnNsb3RfMmFyZ19yZmxhZ3MocmR2LCBybnYsIHJlZ3MtPkFSTV9jcHNyLCBpX2ZuKTsKLX0KLQotc3RhdGljIHZvaWQgX19rcHJvYmVzIGVtdWxhdGVfcmQxMnJtMChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnNuXzFhcmdfZm5fdCAqaV9mbiA9IChpbnNuXzFhcmdfZm5fdCAqKSZwLT5haW5zbi5pbnNuWzBdOwotCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOwotCWludCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKLQlpbnQgcm0gPSBpbnNuICYgMHhmOwotCWxvbmcgcm12ID0gcmVncy0+dXJlZ3Nbcm1dOwotCi0JcmVncy0+dXJlZ3NbcmRdID0gaW5zbnNsb3RfMWFyZ19yZmxhZ3Mocm12LCByZWdzLT5BUk1fY3BzciwgaV9mbik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcwotZW11bGF0ZV9yZDEycm4xNnJtMF9yd2ZsYWdzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWluc25fMmFyZ19mbl90ICppX2ZuID0gKGluc25fMmFyZ19mbl90ICopJnAtPmFpbnNuLmluc25bMF07Ci0Ja3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7Ci0JaW50IHJkID0gKGluc24gPj4gMTIpICYgMHhmOwotCWludCBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKLQlpbnQgcm0gPSBpbnNuICYgMHhmOwotCWxvbmcgcm52ID0gcmVncy0+dXJlZ3Nbcm5dOwotCWxvbmcgcm12ID0gcmVncy0+dXJlZ3Nbcm1dOwotCi0JcmVncy0+dXJlZ3NbcmRdID0KLQkJaW5zbnNsb3RfMmFyZ19yd2ZsYWdzKHJudiwgcm12LCAmcmVncy0+QVJNX2Nwc3IsIGlfZm4pOwotfQotCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMKLWVtdWxhdGVfcmQxNnJuMTJyczhybTBfcndmbGFncyhzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnNuXzNhcmdfZm5fdCAqaV9mbiA9IChpbnNuXzNhcmdfZm5fdCAqKSZwLT5haW5zbi5pbnNuWzBdOwotCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOwotCWludCByZCA9IChpbnNuID4+IDE2KSAmIDB4ZjsKLQlpbnQgcm4gPSAoaW5zbiA+PiAxMikgJiAweGY7Ci0JaW50IHJzID0gKGluc24gPj4gOCkgJiAweGY7Ci0JaW50IHJtID0gaW5zbiAmIDB4ZjsKLQlsb25nIHJudiA9IHJlZ3MtPnVyZWdzW3JuXTsKLQlsb25nIHJzdiA9IHJlZ3MtPnVyZWdzW3JzXTsKLQlsb25nIHJtdiA9IHJlZ3MtPnVyZWdzW3JtXTsKLQotCXJlZ3MtPnVyZWdzW3JkXSA9Ci0JCWluc25zbG90XzNhcmdfcndmbGFncyhybnYsIHJzdiwgcm12LCAmcmVncy0+QVJNX2Nwc3IsIGlfZm4pOwotfQotCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMKLWVtdWxhdGVfcmQxNnJzOHJtMF9yd2ZsYWdzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWluc25fMmFyZ19mbl90ICppX2ZuID0gKGluc25fMmFyZ19mbl90ICopJnAtPmFpbnNuLmluc25bMF07Ci0Ja3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7Ci0JaW50IHJkID0gKGluc24gPj4gMTYpICYgMHhmOwotCWludCBycyA9IChpbnNuID4+IDgpICYgMHhmOwotCWludCBybSA9IGluc24gJiAweGY7Ci0JbG9uZyByc3YgPSByZWdzLT51cmVnc1tyc107Ci0JbG9uZyBybXYgPSByZWdzLT51cmVnc1tybV07Ci0KLQlyZWdzLT51cmVnc1tyZF0gPQotCQlpbnNuc2xvdF8yYXJnX3J3ZmxhZ3MocnN2LCBybXYsICZyZWdzLT5BUk1fY3BzciwgaV9mbik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcwotZW11bGF0ZV9yZGhpMTZyZGxvMTJyczhybTBfcndmbGFncyhzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnNuX2xscmV0XzRhcmdfZm5fdCAqaV9mbiA9IChpbnNuX2xscmV0XzRhcmdfZm5fdCAqKSZwLT5haW5zbi5pbnNuWzBdOwotCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOwotCXVuaW9uIHJlZ19wYWlyIGZucjsKLQlpbnQgcmRoaSA9IChpbnNuID4+IDE2KSAmIDB4ZjsKLQlpbnQgcmRsbyA9IChpbnNuID4+IDEyKSAmIDB4ZjsKLQlpbnQgcnMgICA9IChpbnNuID4+IDgpICYgMHhmOwotCWludCBybSAgID0gaW5zbiAmIDB4ZjsKLQlsb25nIHJzdiA9IHJlZ3MtPnVyZWdzW3JzXTsKLQlsb25nIHJtdiA9IHJlZ3MtPnVyZWdzW3JtXTsKLQotCWZuci5kciA9IGluc25zbG90X2xscmV0XzRhcmdfcndmbGFncyhyZWdzLT51cmVnc1tyZGhpXSwKLQkJCQkJICAgICByZWdzLT51cmVnc1tyZGxvXSwgcnN2LCBybXYsCi0JCQkJCSAgICAgJnJlZ3MtPkFSTV9jcHNyLCBpX2ZuKTsKLQlyZWdzLT51cmVnc1tyZGhpXSA9IGZuci5yMDsKLQlyZWdzLT51cmVnc1tyZGxvXSA9IGZuci5yMTsKLX0KLQotc3RhdGljIHZvaWQgX19rcHJvYmVzCi1lbXVsYXRlX2FsdV9pbW1fcmZsYWdzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWluc25fMWFyZ19mbl90ICppX2ZuID0gKGluc25fMWFyZ19mbl90ICopJnAtPmFpbnNuLmluc25bMF07Ci0Ja3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7Ci0JaW50IHJkID0gKGluc24gPj4gMTIpICYgMHhmOwotCWludCBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKLQlsb25nIHJudiA9IChybiA9PSAxNSkgPyAobG9uZylwLT5hZGRyICsgOCA6IHJlZ3MtPnVyZWdzW3JuXTsKLQotCXJlZ3MtPnVyZWdzW3JkXSA9IGluc25zbG90XzFhcmdfcmZsYWdzKHJudiwgcmVncy0+QVJNX2Nwc3IsIGlfZm4pOwotfQotCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMKLWVtdWxhdGVfYWx1X2ltbV9yd2ZsYWdzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWluc25fMWFyZ19mbl90ICppX2ZuID0gKGluc25fMWFyZ19mbl90ICopJnAtPmFpbnNuLmluc25bMF07Ci0Ja3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7Ci0JaW50IHJkID0gKGluc24gPj4gMTIpICYgMHhmOwotCWludCBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKLQlsb25nIHJudiA9IChybiA9PSAxNSkgPyAobG9uZylwLT5hZGRyICsgOCA6IHJlZ3MtPnVyZWdzW3JuXTsKLQotCXJlZ3MtPnVyZWdzW3JkXSA9IGluc25zbG90XzFhcmdfcndmbGFncyhybnYsICZyZWdzLT5BUk1fY3BzciwgaV9mbik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcwotZW11bGF0ZV9hbHVfdGVzdHNfaW1tKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWluc25fMWFyZ19mbl90ICppX2ZuID0gKGluc25fMWFyZ19mbl90ICopJnAtPmFpbnNuLmluc25bMF07Ci0Ja3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7Ci0JaW50IHJuID0gKGluc24gPj4gMTYpICYgMHhmOwotCWxvbmcgcm52ID0gKHJuID09IDE1KSA/IChsb25nKXAtPmFkZHIgKyA4IDogcmVncy0+dXJlZ3Nbcm5dOwotCi0JaW5zbnNsb3RfMWFyZ19yd2ZsYWdzKHJudiwgJnJlZ3MtPkFSTV9jcHNyLCBpX2ZuKTsKLX0KLQotc3RhdGljIHZvaWQgX19rcHJvYmVzCi1lbXVsYXRlX2FsdV9yZmxhZ3Moc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW5zbl8zYXJnX2ZuX3QgKmlfZm4gPSAoaW5zbl8zYXJnX2ZuX3QgKikmcC0+YWluc24uaW5zblswXTsKLQlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKLQlsb25nIHBwYyA9IChsb25nKXAtPmFkZHIgKyA4OwotCWludCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKLQlpbnQgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CS8qIHJuL3Judi9ycy9yc3YgbWF5IGJlICovCi0JaW50IHJzID0gKGluc24gPj4gOCkgJiAweGY7CS8qIGludmFsaWQsIGRvbid0IGNhcmUuICovCi0JaW50IHJtID0gaW5zbiAmIDB4ZjsKLQlsb25nIHJudiA9IChybiA9PSAxNSkgPyBwcGMgOiByZWdzLT51cmVnc1tybl07Ci0JbG9uZyBybXYgPSAocm0gPT0gMTUpID8gcHBjIDogcmVncy0+dXJlZ3Nbcm1dOwotCWxvbmcgcnN2ID0gcmVncy0+dXJlZ3NbcnNdOwotCi0JcmVncy0+dXJlZ3NbcmRdID0KLQkJaW5zbnNsb3RfM2FyZ19yZmxhZ3Mocm52LCBybXYsIHJzdiwgcmVncy0+QVJNX2Nwc3IsIGlfZm4pOwotfQotCi1zdGF0aWMgdm9pZCBfX2twcm9iZXMKLWVtdWxhdGVfYWx1X3J3ZmxhZ3Moc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW5zbl8zYXJnX2ZuX3QgKmlfZm4gPSAoaW5zbl8zYXJnX2ZuX3QgKikmcC0+YWluc24uaW5zblswXTsKLQlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKLQlsb25nIHBwYyA9IChsb25nKXAtPmFkZHIgKyA4OwotCWludCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKLQlpbnQgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CS8qIHJuL3Judi9ycy9yc3YgbWF5IGJlICovCi0JaW50IHJzID0gKGluc24gPj4gOCkgJiAweGY7CS8qIGludmFsaWQsIGRvbid0IGNhcmUuICovCi0JaW50IHJtID0gaW5zbiAmIDB4ZjsKLQlsb25nIHJudiA9IChybiA9PSAxNSkgPyBwcGMgOiByZWdzLT51cmVnc1tybl07Ci0JbG9uZyBybXYgPSAocm0gPT0gMTUpID8gcHBjIDogcmVncy0+dXJlZ3Nbcm1dOwotCWxvbmcgcnN2ID0gcmVncy0+dXJlZ3NbcnNdOwotCi0JcmVncy0+dXJlZ3NbcmRdID0KLQkJaW5zbnNsb3RfM2FyZ19yd2ZsYWdzKHJudiwgcm12LCByc3YsICZyZWdzLT5BUk1fY3BzciwgaV9mbik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcwotZW11bGF0ZV9hbHVfdGVzdHMoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW5zbl8zYXJnX2ZuX3QgKmlfZm4gPSAoaW5zbl8zYXJnX2ZuX3QgKikmcC0+YWluc24uaW5zblswXTsKLQlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKLQlsb25nIHBwYyA9IChsb25nKXAtPmFkZHIgKyA4OwotCWludCBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKLQlpbnQgcnMgPSAoaW5zbiA+PiA4KSAmIDB4ZjsJLyogcnMvcnN2IG1heSBiZSBpbnZhbGlkLCBkb24ndCBjYXJlLiAqLwotCWludCBybSA9IGluc24gJiAweGY7Ci0JbG9uZyBybnYgPSAocm4gPT0gMTUpID8gcHBjIDogcmVncy0+dXJlZ3Nbcm5dOwotCWxvbmcgcm12ID0gKHJtID09IDE1KSA/IHBwYyA6IHJlZ3MtPnVyZWdzW3JtXTsKLQlsb25nIHJzdiA9IHJlZ3MtPnVyZWdzW3JzXTsKLQotCWluc25zbG90XzNhcmdfcndmbGFncyhybnYsIHJtdiwgcnN2LCAmcmVncy0+QVJNX2Nwc3IsIGlfZm4pOwotfQotCi1zdGF0aWMgZW51bSBrcHJvYmVfaW5zbiBfX2twcm9iZXMKLXByZXBfZW11bGF0ZV9sZHJfc3RyKGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCi17Ci0JaW50IG5vdF9pbW0gPSAoaW5zbiAmICgxIDw8IDI2KSkgPyAoaW5zbiAmICgxIDw8IDI1KSkKLQkJCQkJIDogKH5pbnNuICYgKDEgPDwgMjIpKTsKLQotCWlmIChpc193cml0ZWJhY2soaW5zbikgJiYgaXNfcjE1KGluc24sIDE2KSkKLQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CS8qIFdyaXRlYmFjayB0byBQQyAqLwotCi0JaW5zbiAmPSAweGZmZjAwZmZmOwotCWluc24gfD0gMHgwMDAwMTAwMDsJLyogUm4gPSByMCwgUmQgPSByMSAqLwotCWlmIChub3RfaW1tKSB7Ci0JCWluc24gJj0gfjB4ZjsKLQkJaW5zbiB8PSAyOwkvKiBSbSA9IHIyICovCi0JfQotCWFzaS0+aW5zblswXSA9IGluc247Ci0JYXNpLT5pbnNuX2hhbmRsZXIgPSAoaW5zbiAmICgxIDw8IDIwKSkgPyBlbXVsYXRlX2xkciA6IGVtdWxhdGVfc3RyOwotCXJldHVybiBJTlNOX0dPT0Q7Ci19Ci0KLXN0YXRpYyBlbnVtIGtwcm9iZV9pbnNuIF9fa3Byb2JlcwotcHJlcF9lbXVsYXRlX3JkMTJfbW9kaWZ5KGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCi17Ci0JaWYgKGlzX3IxNShpbnNuLCAxMikpCi0JCXJldHVybiBJTlNOX1JFSkVDVEVEOwkvKiBSZCBpcyBQQyAqLwotCi0JaW5zbiAmPSAweGZmZmYwZmZmOwkvKiBSZCA9IHIwICovCi0JYXNpLT5pbnNuWzBdID0gaW5zbjsKLQlhc2ktPmluc25faGFuZGxlciA9IGVtdWxhdGVfcmQxMl9tb2RpZnk7Ci0JcmV0dXJuIElOU05fR09PRDsKLX0KLQotc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCi1wcmVwX2VtdWxhdGVfcmQxMnJuMF9tb2RpZnkoa3Byb2JlX29wY29kZV90IGluc24sCi0JCQkgICAgc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiAqYXNpKQotewotCWlmIChpc19yMTUoaW5zbiwgMTIpKQotCQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsJLyogUmQgaXMgUEMgKi8KLQotCWluc24gJj0gMHhmZmZmMGZmMDsJLyogUmQgPSByMCAqLwotCWluc24gfD0gMHgwMDAwMDAwMTsJLyogUm4gPSByMSAqLwotCWFzaS0+aW5zblswXSA9IGluc247Ci0JYXNpLT5pbnNuX2hhbmRsZXIgPSBlbXVsYXRlX3JkMTJybjBfbW9kaWZ5OwotCXJldHVybiBJTlNOX0dPT0Q7Ci19Ci0KLXN0YXRpYyBlbnVtIGtwcm9iZV9pbnNuIF9fa3Byb2JlcwotcHJlcF9lbXVsYXRlX3JkMTJybTAoa3Byb2JlX29wY29kZV90IGluc24sIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKmFzaSkKLXsKLQlpZiAoaXNfcjE1KGluc24sIDEyKSkKLQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CS8qIFJkIGlzIFBDICovCi0KLQlpbnNuICY9IDB4ZmZmZjBmZjA7CS8qIFJkID0gcjAsIFJtID0gcjAgKi8KLQlhc2ktPmluc25bMF0gPSBpbnNuOwotCWFzaS0+aW5zbl9oYW5kbGVyID0gZW11bGF0ZV9yZDEycm0wOwotCXJldHVybiBJTlNOX0dPT0Q7Ci19Ci0KLXN0YXRpYyBlbnVtIGtwcm9iZV9pbnNuIF9fa3Byb2JlcwotcHJlcF9lbXVsYXRlX3JkMTJybjE2cm0wX3dmbGFncyhrcHJvYmVfb3Bjb2RlX3QgaW5zbiwKLQkJCQlzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCi17Ci0JaWYgKGlzX3IxNShpbnNuLCAxMikpCi0JCXJldHVybiBJTlNOX1JFSkVDVEVEOwkvKiBSZCBpcyBQQyAqLwotCi0JaW5zbiAmPSAweGZmZjAwZmYwOwkvKiBSZCA9IHIwLCBSbiA9IHIwICovCi0JaW5zbiB8PSAweDAwMDAwMDAxOwkvKiBSbSA9IHIxICovCi0JYXNpLT5pbnNuWzBdID0gaW5zbjsKLQlhc2ktPmluc25faGFuZGxlciA9IGVtdWxhdGVfcmQxMnJuMTZybTBfcndmbGFnczsKLQlyZXR1cm4gSU5TTl9HT09EOwotfQotCi1zdGF0aWMgZW51bSBrcHJvYmVfaW5zbiBfX2twcm9iZXMKLXByZXBfZW11bGF0ZV9yZDE2cnM4cm0wX3dmbGFncyhrcHJvYmVfb3Bjb2RlX3QgaW5zbiwKLQkJCSAgICAgICBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCi17Ci0JaWYgKGlzX3IxNShpbnNuLCAxNikpCi0JCXJldHVybiBJTlNOX1JFSkVDVEVEOwkvKiBSZCBpcyBQQyAqLwotCi0JaW5zbiAmPSAweGZmZjBmMGYwOwkvKiBSZCA9IHIwLCBScyA9IHIwICovCi0JaW5zbiB8PSAweDAwMDAwMDAxOwkvKiBSbSA9IHIxICAgICAgICAgICovCi0JYXNpLT5pbnNuWzBdID0gaW5zbjsKLQlhc2ktPmluc25faGFuZGxlciA9IGVtdWxhdGVfcmQxNnJzOHJtMF9yd2ZsYWdzOwotCXJldHVybiBJTlNOX0dPT0Q7Ci19Ci0KLXN0YXRpYyBlbnVtIGtwcm9iZV9pbnNuIF9fa3Byb2JlcwotcHJlcF9lbXVsYXRlX3JkMTZybjEycnM4cm0wX3dmbGFncyhrcHJvYmVfb3Bjb2RlX3QgaW5zbiwKLQkJCQkgICBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCi17Ci0JaWYgKGlzX3IxNShpbnNuLCAxNikpCi0JCXJldHVybiBJTlNOX1JFSkVDVEVEOwkvKiBSZCBpcyBQQyAqLwotCi0JaW5zbiAmPSAweGZmZjAwMGYwOwkvKiBSZCA9IHIwLCBSbiA9IHIwICovCi0JaW5zbiB8PSAweDAwMDAwMTAyOwkvKiBScyA9IHIxLCBSbSA9IHIyICovCi0JYXNpLT5pbnNuWzBdID0gaW5zbjsKLQlhc2ktPmluc25faGFuZGxlciA9IGVtdWxhdGVfcmQxNnJuMTJyczhybTBfcndmbGFnczsKLQlyZXR1cm4gSU5TTl9HT09EOwotfQotCi1zdGF0aWMgZW51bSBrcHJvYmVfaW5zbiBfX2twcm9iZXMKLXByZXBfZW11bGF0ZV9yZGhpMTZyZGxvMTJyczhybTBfd2ZsYWdzKGtwcm9iZV9vcGNvZGVfdCBpbnNuLAotCQkJCSAgICAgICBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCi17Ci0JaWYgKGlzX3IxNShpbnNuLCAxNikgfHwgaXNfcjE1KGluc24sIDEyKSkKLQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CS8qIFJkSGkgb3IgUmRMbyBpcyBQQyAqLwotCi0JaW5zbiAmPSAweGZmZjAwMGYwOwkvKiBSZEhpID0gcjAsIFJkTG8gPSByMSAqLwotCWluc24gfD0gMHgwMDAwMTIwMzsJLyogUnMgPSByMiwgUm0gPSByMyAqLwotCWFzaS0+aW5zblswXSA9IGluc247Ci0JYXNpLT5pbnNuX2hhbmRsZXIgPSBlbXVsYXRlX3JkaGkxNnJkbG8xMnJzOHJtMF9yd2ZsYWdzOwotCXJldHVybiBJTlNOX0dPT0Q7Ci19Ci0KLS8qCi0gKiBGb3IgdGhlIGluc3RydWN0aW9uIG1hc2tpbmcgYW5kIGNvbXBhcmlzb25zIGluIGFsbCB0aGUgInNwYWNlXyoiCi0gKiBmdW5jdGlvbnMgYmVsb3csIERvIF9ub3RfIHJlYXJyYW5nZSB0aGUgb3JkZXIgb2YgdGVzdHMgdW5sZXNzCi0gKiB5b3UncmUgdmVyeSwgdmVyeSBzdXJlIG9mIHdoYXQgeW91IGFyZSBkb2luZy4gIEZvciB0aGUgc2FrZSBvZgotICogZWZmaWNpZW5jeSwgdGhlIG1hc2tzIGZvciBzb21lIHRlc3RzIHNvbWV0aW1lcyBhc3N1bWUgb3RoZXIgdGVzdAotICogaGF2ZSBiZWVuIGRvbmUgcHJpb3IgdG8gdGhlbSBzbyB0aGUgbnVtYmVyIG9mIHBhdHRlcm5zIHRvIHRlc3QKLSAqIGZvciBhbiBpbnN0cnVjdGlvbiBzZXQgY2FuIGJlIGFzIGJyb2FkIGFzIHBvc3NpYmxlIHRvIHJlZHVjZSB0aGUKLSAqIG51bWJlciBvZiB0ZXN0cyBuZWVkZWQuCi0gKi8KLQotc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCi1zcGFjZV8xMTExKGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCi17Ci0JLyogbWVtb3J5IGhpbnQgOiAxMTExIDAxMDAgeDAwMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggOiAqLwotCS8qIFBMREkgICAgICAgIDogMTExMSAwMTAwIHgxMDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IDogKi8KLQkvKiBQTERXICAgICAgICA6IDExMTEgMDEwMSB4MDAxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCA6ICovCi0JLyogUExEICAgICAgICAgOiAxMTExIDAxMDEgeDEwMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggOiAqLwotCWlmICgoaW5zbiAmIDB4ZmUzMDAwMDApID09IDB4ZjQxMDAwMDApIHsKLQkJYXNpLT5pbnNuX2hhbmRsZXIgPSBlbXVsYXRlX25vcDsKLQkJcmV0dXJuIElOU05fR09PRF9OT19TTE9UOwotCX0KLQotCS8qIEJMWCgxKSA6IDExMTEgMTAxeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCA6ICovCi0JaWYgKChpbnNuICYgMHhmZTAwMDAwMCkgPT0gMHhmYTAwMDAwMCkgewotCQlhc2ktPmluc25faGFuZGxlciA9IHNpbXVsYXRlX2JseDE7Ci0JCXJldHVybiBJTlNOX0dPT0RfTk9fU0xPVDsKLQl9Ci0KLQkvKiBDUFMgICA6IDExMTEgMDAwMSAwMDAwIHh4eDAgeHh4eCB4eHh4IHh4MHggeHh4eCAqLwotCS8qIFNFVEVORDogMTExMSAwMDAxIDAwMDAgMDAwMSB4eHh4IHh4eHggMDAwMCB4eHh4ICovCi0KLQkvKiBTUlMgICA6IDExMTEgMTAweCB4MXgwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCS8qIFJGRSAgIDogMTExMSAxMDB4IHgweDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCi0KLQkvKiBDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuLi4gKi8KLQkvKiBNQ1JSMiA6IDExMTEgMTEwMCAwMTAwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCA6IChSZCAhPSBSbikgKi8KLQkvKiBNUlJDMiA6IDExMTEgMTEwMCAwMTAxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCA6IChSZCAhPSBSbikgKi8KLQkvKiBMREMyICA6IDExMTEgMTEweCB4eHgxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCS8qIFNUQzIgIDogMTExMSAxMTB4IHh4eDAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCi0JLyogQ0RQMiAgOiAxMTExIDExMTAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHgwIHh4eHggKi8KLQkvKiBNQ1IyICA6IDExMTEgMTExMCB4eHgwIHh4eHggeHh4eCB4eHh4IHh4eDEgeHh4eCAqLwotCS8qIE1SQzIgIDogMTExMSAxMTEwIHh4eDEgeHh4eCB4eHh4IHh4eHggeHh4MSB4eHh4ICovCi0KLQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsKLX0KLQotc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCi1zcGFjZV9jY2NjXzAwMHgoa3Byb2JlX29wY29kZV90IGluc24sIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKmFzaSkKLXsKLQkvKiBjY2NjIDAwMDEgMHh4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eDAgeHh4eCAqLwotCWlmICgoaW5zbiAmIDB4MGY5MDAwMTApID09IDB4MDEwMDAwMDApIHsKLQotCQkvKiBNUlMgY3BzciA6IGNjY2MgMDAwMSAwMDAwIHh4eHggeHh4eCB4eHh4IDAwMDAgeHh4eCAqLwotCQlpZiAoKGluc24gJiAweDBmZjAwMGYwKSA9PSAweDAxMDAwMDAwKSB7Ci0JCQlpZiAoaXNfcjE1KGluc24sIDEyKSkKLQkJCQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsJLyogUmQgaXMgUEMgKi8KLQkJCWFzaS0+aW5zbl9oYW5kbGVyID0gc2ltdWxhdGVfbXJzOwotCQkJcmV0dXJuIElOU05fR09PRF9OT19TTE9UOwotCQl9Ci0KLQkJLyogU01MQUx4eSA6IGNjY2MgMDAwMSAwMTAwIHh4eHggeHh4eCB4eHh4IDF4eDAgeHh4eCAqLwotCQlpZiAoKGluc24gJiAweDBmZjAwMDkwKSA9PSAweDAxNDAwMDgwKQotCQkJcmV0dXJuIHByZXBfZW11bGF0ZV9yZGhpMTZyZGxvMTJyczhybTBfd2ZsYWdzKGluc24sCi0JCQkJCQkJCQlhc2kpOwotCi0JCS8qIFNNVUxXeSA6IGNjY2MgMDAwMSAwMDEwIHh4eHggeHh4eCB4eHh4IDF4MTAgeHh4eCAqLwotCQkvKiBTTVVMeHkgOiBjY2NjIDAwMDEgMDExMCB4eHh4IHh4eHggeHh4eCAxeHgwIHh4eHggKi8KLQkJaWYgKChpbnNuICYgMHgwZmYwMDBiMCkgPT0gMHgwMTIwMDBhMCB8fAotCQkgICAgKGluc24gJiAweDBmZjAwMDkwKSA9PSAweDAxNjAwMDgwKQotCQkJcmV0dXJuIHByZXBfZW11bGF0ZV9yZDE2cnM4cm0wX3dmbGFncyhpbnNuLCBhc2kpOwotCi0JCS8qIFNNTEF4eSA6IGNjY2MgMDAwMSAwMDAwIHh4eHggeHh4eCB4eHh4IDF4eDAgeHh4eCA6IFEgKi8KLQkJLyogU01MQVd5IDogY2NjYyAwMDAxIDAwMTAgeHh4eCB4eHh4IHh4eHggMXgwMCB4eHh4IDogUSAqLwotCQlpZiAoKGluc24gJiAweDBmZjAwMDkwKSA9PSAweDAxMDAwMDgwIHx8Ci0JCSAgICAoaW5zbiAmIDB4MGZmMDAwYjApID09IDB4MDEyMDAwODApCi0JCQlyZXR1cm4gcHJlcF9lbXVsYXRlX3JkMTZybjEycnM4cm0wX3dmbGFncyhpbnNuLCBhc2kpOwotCi0JCS8qIEJYSiAgICAgIDogY2NjYyAwMDAxIDAwMTAgeHh4eCB4eHh4IHh4eHggMDAxMCB4eHh4ICovCi0JCS8qIE1TUiAgICAgIDogY2NjYyAwMDAxIDB4MTAgeHh4eCB4eHh4IHh4eHggMDAwMCB4eHh4ICovCi0JCS8qIE1SUyBzcHNyIDogY2NjYyAwMDAxIDAxMDAgeHh4eCB4eHh4IHh4eHggMDAwMCB4eHh4ICovCi0KLQkJLyogT3RoZXIgaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzIGFyZW4ndCB5ZXQgZGVmaW5lZCAqLwotCQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsKLQl9Ci0KLQkvKiBjY2NjIDAwMDEgMHh4MCB4eHh4IHh4eHggeHh4eCB4eHh4IDB4eDEgeHh4eCAqLwotCWVsc2UgaWYgKChpbnNuICYgMHgwZjkwMDA5MCkgPT0gMHgwMTAwMDAxMCkgewotCi0JCS8qIEJMWCgyKSA6IGNjY2MgMDAwMSAwMDEwIHh4eHggeHh4eCB4eHh4IDAwMTEgeHh4eCAqLwotCQkvKiBCWCAgICAgOiBjY2NjIDAwMDEgMDAxMCB4eHh4IHh4eHggeHh4eCAwMDAxIHh4eHggKi8KLQkJaWYgKChpbnNuICYgMHgwZmYwMDBkMCkgPT0gMHgwMTIwMDAxMCkgewotCQkJaWYgKChpbnNuICYgMHgwZmYwMDBmZikgPT0gMHgwMTIwMDAzZikKLQkJCQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsgLyogQkxYIHBjICovCi0JCQlhc2ktPmluc25faGFuZGxlciA9IHNpbXVsYXRlX2JseDJieDsKLQkJCXJldHVybiBJTlNOX0dPT0RfTk9fU0xPVDsKLQkJfQotCi0JCS8qIENMWiA6IGNjY2MgMDAwMSAwMTEwIHh4eHggeHh4eCB4eHh4IDAwMDEgeHh4eCAqLwotCQlpZiAoKGluc24gJiAweDBmZjAwMGYwKSA9PSAweDAxNjAwMDEwKQotCQkJcmV0dXJuIHByZXBfZW11bGF0ZV9yZDEycm0wKGluc24sIGFzaSk7Ci0KLQkJLyogUUFERCAgICA6IGNjY2MgMDAwMSAwMDAwIHh4eHggeHh4eCB4eHh4IDAxMDEgeHh4eCA6USAqLwotCQkvKiBRU1VCICAgIDogY2NjYyAwMDAxIDAwMTAgeHh4eCB4eHh4IHh4eHggMDEwMSB4eHh4IDpRICovCi0JCS8qIFFEQUREICAgOiBjY2NjIDAwMDEgMDEwMCB4eHh4IHh4eHggeHh4eCAwMTAxIHh4eHggOlEgKi8KLQkJLyogUURTVUIgICA6IGNjY2MgMDAwMSAwMTEwIHh4eHggeHh4eCB4eHh4IDAxMDEgeHh4eCA6USAqLwotCQlpZiAoKGluc24gJiAweDBmOTAwMGYwKSA9PSAweDAxMDAwMDUwKQotCQkJcmV0dXJuIHByZXBfZW11bGF0ZV9yZDEycm4xNnJtMF93ZmxhZ3MoaW5zbiwgYXNpKTsKLQotCQkvKiBCS1BUIDogMTExMCAwMDAxIDAwMTAgeHh4eCB4eHh4IHh4eHggMDExMSB4eHh4ICovCi0JCS8qIFNNQyAgOiBjY2NjIDAwMDEgMDExMCB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggKi8KLQotCQkvKiBPdGhlciBpbnN0cnVjdGlvbiBlbmNvZGluZ3MgYXJlbid0IHlldCBkZWZpbmVkICovCi0JCXJldHVybiBJTlNOX1JFSkVDVEVEOwotCX0KLQotCS8qIGNjY2MgMDAwMCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4ICovCi0JZWxzZSBpZiAoKGluc24gJiAweDBmMDAwMGYwKSA9PSAweDAwMDAwMDkwKSB7Ci0KLQkJLyogTVVMICAgIDogY2NjYyAwMDAwIDAwMDAgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4IDogICAqLwotCQkvKiBNVUxTICAgOiBjY2NjIDAwMDAgMDAwMSB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggOmNjICovCi0JCS8qIE1MQSAgICA6IGNjY2MgMDAwMCAwMDEwIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCA6ICAgKi8KLQkJLyogTUxBUyAgIDogY2NjYyAwMDAwIDAwMTEgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4IDpjYyAqLwotCQkvKiBVTUFBTCAgOiBjY2NjIDAwMDAgMDEwMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggOiAgICovCi0JCS8qIHVuZGVmICA6IGNjY2MgMDAwMCAwMTAxIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCA6ICAgKi8KLQkJLyogTUxTICAgIDogY2NjYyAwMDAwIDAxMTAgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4IDogICAqLwotCQkvKiB1bmRlZiAgOiBjY2NjIDAwMDAgMDExMSB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggOiAgICovCi0JCS8qIFVNVUxMICA6IGNjY2MgMDAwMCAxMDAwIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCA6ICAgKi8KLQkJLyogVU1VTExTIDogY2NjYyAwMDAwIDEwMDEgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4IDpjYyAqLwotCQkvKiBVTUxBTCAgOiBjY2NjIDAwMDAgMTAxMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggOiAgICovCi0JCS8qIFVNTEFMUyA6IGNjY2MgMDAwMCAxMDExIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCA6Y2MgKi8KLQkJLyogU01VTEwgIDogY2NjYyAwMDAwIDExMDAgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4IDogICAqLwotCQkvKiBTTVVMTFMgOiBjY2NjIDAwMDAgMTEwMSB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggOmNjICovCi0JCS8qIFNNTEFMICA6IGNjY2MgMDAwMCAxMTEwIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCA6ICAgKi8KLQkJLyogU01MQUxTIDogY2NjYyAwMDAwIDExMTEgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4IDpjYyAqLwotCQlpZiAoKGluc24gJiAweDAwZDAwMDAwKSA9PSAweDAwNTAwMDAwKQotCQkJcmV0dXJuIElOU05fUkVKRUNURUQ7Ci0JCWVsc2UgaWYgKChpbnNuICYgMHgwMGUwMDAwMCkgPT0gMHgwMDAwMDAwMCkKLQkJCXJldHVybiBwcmVwX2VtdWxhdGVfcmQxNnJzOHJtMF93ZmxhZ3MoaW5zbiwgYXNpKTsKLQkJZWxzZSBpZiAoKGluc24gJiAweDAwYTAwMDAwKSA9PSAweDAwMjAwMDAwKQotCQkJcmV0dXJuIHByZXBfZW11bGF0ZV9yZDE2cm4xMnJzOHJtMF93ZmxhZ3MoaW5zbiwgYXNpKTsKLQkJZWxzZQotCQkJcmV0dXJuIHByZXBfZW11bGF0ZV9yZGhpMTZyZGxvMTJyczhybTBfd2ZsYWdzKGluc24sCi0JCQkJCQkJCQlhc2kpOwotCX0KLQotCS8qIGNjY2MgMDAweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggMXh4MSB4eHh4ICovCi0JZWxzZSBpZiAoKGluc24gJiAweDBlMDAwMDkwKSA9PSAweDAwMDAwMDkwKSB7Ci0KLQkJLyogU1dQICAgOiBjY2NjIDAwMDEgMDAwMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogU1dQQiAgOiBjY2NjIDAwMDEgMDEwMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogPz8/ICAgOiBjY2NjIDAwMDEgMHgwMSB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogPz8/ICAgOiBjY2NjIDAwMDEgMHgxMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogPz8/ICAgOiBjY2NjIDAwMDEgMHgxMSB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogU1RSRVggOiBjY2NjIDAwMDEgMTAwMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogTERSRVggOiBjY2NjIDAwMDEgMTAwMSB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogU1RSRVhEOiBjY2NjIDAwMDEgMTAxMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogTERSRVhEOiBjY2NjIDAwMDEgMTAxMSB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogU1RSRVhCOiBjY2NjIDAwMDEgMTEwMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogTERSRVhCOiBjY2NjIDAwMDEgMTEwMSB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogU1RSRVhIOiBjY2NjIDAwMDEgMTExMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQkJLyogTERSRVhIOiBjY2NjIDAwMDEgMTExMSB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggKi8KLQotCQkvKiBMRFJEICA6IGNjY2MgMDAweCB4eHgwIHh4eHggeHh4eCB4eHh4IDExMDEgeHh4eCAqLwotCQkvKiBTVFJEICA6IGNjY2MgMDAweCB4eHgwIHh4eHggeHh4eCB4eHh4IDExMTEgeHh4eCAqLwotCQkvKiBMRFJIICA6IGNjY2MgMDAweCB4eHgxIHh4eHggeHh4eCB4eHh4IDEwMTEgeHh4eCAqLwotCQkvKiBTVFJIICA6IGNjY2MgMDAweCB4eHgwIHh4eHggeHh4eCB4eHh4IDEwMTEgeHh4eCAqLwotCQkvKiBMRFJTQiA6IGNjY2MgMDAweCB4eHgxIHh4eHggeHh4eCB4eHh4IDExMDEgeHh4eCAqLwotCQkvKiBMRFJTSCA6IGNjY2MgMDAweCB4eHgxIHh4eHggeHh4eCB4eHh4IDExMTEgeHh4eCAqLwotCQlpZiAoKGluc24gJiAweDBmMDAwMGYwKSA9PSAweDAxMDAwMDkwKSB7Ci0JCQlpZiAoKGluc24gJiAweDBmYjAwMGYwKSA9PSAweDAxMDAwMDkwKSB7Ci0JCQkJLyogU1dQL1NXUEIgKi8KLQkJCQlyZXR1cm4gcHJlcF9lbXVsYXRlX3JkMTJybjE2cm0wX3dmbGFncyhpbnNuLAotCQkJCQkJCQkJYXNpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogU1RSRVgvTERSRVggdmFyaWFudHMgYW5kIHVuYWxsb2NhZWQgc3BhY2UgKi8KLQkJCQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKChpbnNuICYgMHgwZTEwMDBkMCkgPT0gMHgwMDAwMGQwKSB7Ci0JCQkvKiBTVFJEL0xEUkQgKi8KLQkJCWlmICgoaW5zbiAmIDB4MDAwMGUwMDApID09IDB4MDAwMGUwMDApCi0JCQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CS8qIFJkIGlzIExSIG9yIFBDICovCi0JCQlpZiAoaXNfd3JpdGViYWNrKGluc24pICYmIGlzX3IxNShpbnNuLCAxNikpCi0JCQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CS8qIFdyaXRlYmFjayB0byBQQyAqLwotCi0JCQlpbnNuICY9IDB4ZmZmMDBmZmY7Ci0JCQlpbnNuIHw9IDB4MDAwMDIwMDA7CS8qIFJuID0gcjAsIFJkID0gcjIgKi8KLQkJCWlmICghKGluc24gJiAoMSA8PCAyMikpKSB7Ci0JCQkJLyogUmVnaXN0ZXIgaW5kZXggKi8KLQkJCQlpbnNuICY9IH4weGY7Ci0JCQkJaW5zbiB8PSAxOwkvKiBSbSA9IHIxICovCi0JCQl9Ci0JCQlhc2ktPmluc25bMF0gPSBpbnNuOwotCQkJYXNpLT5pbnNuX2hhbmRsZXIgPQotCQkJCShpbnNuICYgKDEgPDwgNSkpID8gZW11bGF0ZV9zdHJkIDogZW11bGF0ZV9sZHJkOwotCQkJcmV0dXJuIElOU05fR09PRDsKLQkJfQotCi0JCS8qIExEUkgvU1RSSC9MRFJTQi9MRFJTSCAqLwotCQlpZiAoaXNfcjE1KGluc24sIDEyKSkKLQkJCXJldHVybiBJTlNOX1JFSkVDVEVEOwkvKiBSZCBpcyBQQyAqLwotCQlyZXR1cm4gcHJlcF9lbXVsYXRlX2xkcl9zdHIoaW5zbiwgYXNpKTsKLQl9Ci0KLQkvKiBjY2NjIDAwMHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCi0JLyoKLQkgKiBBTFUgb3Agd2l0aCBTIGJpdCBhbmQgUmQgPT0gMTUgOgotCSAqCWNjY2MgMDAweCB4eHgxIHh4eHggMTExMSB4eHh4IHh4eHggeHh4eAotCSAqLwotCWlmICgoaW5zbiAmIDB4MGUxMGYwMDApID09IDB4MDAxMGYwMDApCi0JCXJldHVybiBJTlNOX1JFSkVDVEVEOwotCi0JLyoKLQkgKiAibW92IGlwLCBzcCIgaXMgdGhlIG1vc3QgY29tbW9uIGtwcm9iZSdkIGluc3RydWN0aW9uIGJ5IGZhci4KLQkgKiBDaGVjayBhbmQgb3B0aW1pemUgZm9yIGl0IGV4cGxpY2l0bHkuCi0JICovCi0JaWYgKGluc24gPT0gMHhlMWEwYzAwZCkgewotCQlhc2ktPmluc25faGFuZGxlciA9IHNpbXVsYXRlX21vdl9pcHNwOwotCQlyZXR1cm4gSU5TTl9HT09EX05PX1NMT1Q7Ci0JfQotCi0JLyoKLQkgKiBEYXRhIHByb2Nlc3Npbmc6IEltbWVkaWF0ZS1zaGlmdCAvIFJlZ2lzdGVyLXNoaWZ0Ci0JICogQUxVIG9wIDogY2NjYyAwMDB4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4Ci0JICogQ1BZICAgIDogY2NjYyAwMDAxIDEwMTAgeHh4eCB4eHh4IDAwMDAgMDAwMCB4eHh4Ci0JICogTU9WICAgIDogY2NjYyAwMDAxIDEwMXggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4Ci0JICogKlMgKGJpdCAyMCkgdXBkYXRlcyBjb25kaXRpb24gY29kZXMKLQkgKiBBREMvU0JDL1JTQyByZWFkcyB0aGUgQyBmbGFnCi0JICovCi0JaW5zbiAmPSAweGZmZjAwZmYwOwkvKiBSbiA9IHIwLCBSZCA9IHIwICovCi0JaW5zbiB8PSAweDAwMDAwMDAxOwkvKiBSbSA9IHIxICovCi0JaWYgKGluc24gJiAweDAxMCkgewotCQlpbnNuICY9IDB4ZmZmZmYwZmY7ICAgICAvKiByZWdpc3RlciBzaGlmdCAqLwotCQlpbnNuIHw9IDB4MDAwMDAyMDA7ICAgICAvKiBScyA9IHIyICovCi0JfQotCWFzaS0+aW5zblswXSA9IGluc247Ci0KLQlpZiAoKGluc24gJiAweDBmOTAwMDAwKSA9PSAweDAxMTAwMDAwKSB7Ci0JCS8qCi0JCSAqIFRTVCA6IGNjY2MgMDAwMSAwMDAxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eAotCQkgKiBURVEgOiBjY2NjIDAwMDEgMDAxMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgKLQkJICogQ01QIDogY2NjYyAwMDAxIDAxMDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4Ci0JCSAqIENNTiA6IGNjY2MgMDAwMSAwMTExIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eAotCQkgKi8KLQkJYXNpLT5pbnNuX2hhbmRsZXIgPSBlbXVsYXRlX2FsdV90ZXN0czsKLQl9IGVsc2UgewotCQkvKiBBTFUgb3BzIHdoaWNoIHdyaXRlIHRvIFJkICovCi0JCWFzaS0+aW5zbl9oYW5kbGVyID0gKGluc24gJiAoMSA8PCAyMCkpID8gIC8qIFMtYml0ICovCi0JCQkJZW11bGF0ZV9hbHVfcndmbGFncyA6IGVtdWxhdGVfYWx1X3JmbGFnczsKLQl9Ci0JcmV0dXJuIElOU05fR09PRDsKLX0KLQotc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCi1zcGFjZV9jY2NjXzAwMXgoa3Byb2JlX29wY29kZV90IGluc24sIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKmFzaSkKLXsKLQkvKiBNT1ZXICA6IGNjY2MgMDAxMSAwMDAwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCS8qIE1PVlQgIDogY2NjYyAwMDExIDAxMDAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCi0JaWYgKChpbnNuICYgMHgwZmIwMDAwMCkgPT0gMHgwMzAwMDAwMCkKLQkJcmV0dXJuIHByZXBfZW11bGF0ZV9yZDEyX21vZGlmeShpbnNuLCBhc2kpOwotCi0JLyogaGludHMgOiBjY2NjIDAwMTEgMDAxMCAwMDAwIHh4eHggeHh4eCB4eHh4IHh4eHggKi8KLQlpZiAoKGluc24gJiAweDBmZmYwMDAwKSA9PSAweDAzMjAwMDAwKSB7Ci0JCXVuc2lnbmVkIG9wMiA9IGluc24gJiAweDAwMDAwMGZmOwotCQlpZiAob3AyID09IDB4MDEgfHwgb3AyID09IDB4MDQpIHsKLQkJCS8qIFlJRUxEIDogY2NjYyAwMDExIDAwMTAgMDAwMCB4eHh4IHh4eHggMDAwMCAwMDAxICovCi0JCQkvKiBTRVYgICA6IGNjY2MgMDAxMSAwMDEwIDAwMDAgeHh4eCB4eHh4IDAwMDAgMDEwMCAqLwotCQkJYXNpLT5pbnNuWzBdID0gaW5zbjsKLQkJCWFzaS0+aW5zbl9oYW5kbGVyID0gZW11bGF0ZV9ub25lOwotCQkJcmV0dXJuIElOU05fR09PRDsKLQkJfSBlbHNlIGlmIChvcDIgPD0gMHgwMykgewotCQkJLyogTk9QICAgOiBjY2NjIDAwMTEgMDAxMCAwMDAwIHh4eHggeHh4eCAwMDAwIDAwMDAgKi8KLQkJCS8qIFdGRSAgIDogY2NjYyAwMDExIDAwMTAgMDAwMCB4eHh4IHh4eHggMDAwMCAwMDEwICovCi0JCQkvKiBXRkkgICA6IGNjY2MgMDAxMSAwMDEwIDAwMDAgeHh4eCB4eHh4IDAwMDAgMDAxMSAqLwotCQkJLyoKLQkJCSAqIFdlIG1ha2UgV0ZFIGFuZCBXRkkgdHJ1ZSBOT1BzIHRvIGF2b2lkIHN0YWxscyBkdWUKLQkJCSAqIHRvIG1pc3NpbmcgZXZlbnRzIHdoaWxzdCBwcm9jZXNzaW5nIHRoZSBwcm9iZS4KLQkJCSAqLwotCQkJYXNpLT5pbnNuX2hhbmRsZXIgPSBlbXVsYXRlX25vcDsKLQkJCXJldHVybiBJTlNOX0dPT0RfTk9fU0xPVDsKLQkJfQotCQkvKiBGb3IgREJHIGFuZCB1bmFsbG9jYXRlZCBoaW50cyBpdCdzIHNhZmVzdCB0byByZWplY3QgdGhlbSAqLwotCQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsKLQl9Ci0KLQkvKgotCSAqIE1TUiAgIDogY2NjYyAwMDExIDB4MTAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4Ci0JICogQUxVIG9wIHdpdGggUyBiaXQgYW5kIFJkID09IDE1IDoKLQkgKgkgICBjY2NjIDAwMXggeHh4MSB4eHh4IDExMTEgeHh4eCB4eHh4IHh4eHgKLQkgKi8KLQlpZiAoKGluc24gJiAweDBmYjAwMDAwKSA9PSAweDAzMjAwMDAwIHx8CS8qIE1TUiAqLwotCSAgICAoaW5zbiAmIDB4MGUxMGYwMDApID09IDB4MDIxMGYwMDApCQkvKiBBTFUgcy1iaXQsIFIxNSAgKi8KLQkJcmV0dXJuIElOU05fUkVKRUNURUQ7Ci0KLQkvKgotCSAqIERhdGEgcHJvY2Vzc2luZzogMzItYml0IEltbWVkaWF0ZQotCSAqIEFMVSBvcCA6IGNjY2MgMDAxeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eAotCSAqIE1PViAgICA6IGNjY2MgMDAxMSAxMDF4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eAotCSAqICpTIChiaXQgMjApIHVwZGF0ZXMgY29uZGl0aW9uIGNvZGVzCi0JICogQURDL1NCQy9SU0MgcmVhZHMgdGhlIEMgZmxhZwotCSAqLwotCWluc24gJj0gMHhmZmYwMGZmZjsJLyogUm4gPSByMCBhbmQgUmQgPSByMCAqLwotCWFzaS0+aW5zblswXSA9IGluc247Ci0KLQlpZiAoKGluc24gJiAweDBmOTAwMDAwKSA9PSAweDAzMTAwMDAwKSB7Ci0JCS8qCi0JCSAqIFRTVCA6IGNjY2MgMDAxMSAwMDAxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eAotCQkgKiBURVEgOiBjY2NjIDAwMTEgMDAxMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgKLQkJICogQ01QIDogY2NjYyAwMDExIDAxMDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4Ci0JCSAqIENNTiA6IGNjY2MgMDAxMSAwMTExIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eAotCQkgKi8KLQkJYXNpLT5pbnNuX2hhbmRsZXIgPSBlbXVsYXRlX2FsdV90ZXN0c19pbW07Ci0JfSBlbHNlIHsKLQkJLyogQUxVIG9wcyB3aGljaCB3cml0ZSB0byBSZCAqLwotCQlhc2ktPmluc25faGFuZGxlciA9IChpbnNuICYgKDEgPDwgMjApKSA/ICAvKiBTLWJpdCAqLwotCQkJZW11bGF0ZV9hbHVfaW1tX3J3ZmxhZ3MgOiBlbXVsYXRlX2FsdV9pbW1fcmZsYWdzOwotCX0KLQlyZXR1cm4gSU5TTl9HT09EOwotfQotCi1zdGF0aWMgZW51bSBrcHJvYmVfaW5zbiBfX2twcm9iZXMKLXNwYWNlX2NjY2NfMDExMF9fMShrcHJvYmVfb3Bjb2RlX3QgaW5zbiwgc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiAqYXNpKQotewotCS8qIFNFTCA6IGNjY2MgMDExMCAxMDAwIHh4eHggeHh4eCB4eHh4IDEwMTEgeHh4eCBHRTogISEhICovCi0JaWYgKChpbnNuICYgMHgwZmYwMDBmMCkgPT0gMHgwNjgwMDBiMCkgewotCQlpZiAoaXNfcjE1KGluc24sIDEyKSkKLQkJCXJldHVybiBJTlNOX1JFSkVDVEVEOwkvKiBSZCBpcyBQQyAqLwotCQlpbnNuICY9IDB4ZmZmMDBmZjA7CS8qIFJkID0gcjAsIFJuID0gcjAgKi8KLQkJaW5zbiB8PSAweDAwMDAwMDAxOwkvKiBSbSA9IHIxICovCi0JCWFzaS0+aW5zblswXSA9IGluc247Ci0JCWFzaS0+aW5zbl9oYW5kbGVyID0gZW11bGF0ZV9zZWw7Ci0JCXJldHVybiBJTlNOX0dPT0Q7Ci0JfQotCi0JLyogU1NBVCAgIDogY2NjYyAwMTEwIDEwMXggeHh4eCB4eHh4IHh4eHggeHgwMSB4eHh4IDpRICovCi0JLyogVVNBVCAgIDogY2NjYyAwMTEwIDExMXggeHh4eCB4eHh4IHh4eHggeHgwMSB4eHh4IDpRICovCi0JLyogU1NBVDE2IDogY2NjYyAwMTEwIDEwMTAgeHh4eCB4eHh4IHh4eHggMDAxMSB4eHh4IDpRICovCi0JLyogVVNBVDE2IDogY2NjYyAwMTEwIDExMTAgeHh4eCB4eHh4IHh4eHggMDAxMSB4eHh4IDpRICovCi0JaWYgKChpbnNuICYgMHgwZmEwMDAzMCkgPT0gMHgwNmEwMDAxMCB8fAotCSAgICAoaW5zbiAmIDB4MGZiMDAwZjApID09IDB4MDZhMDAwMzApIHsKLQkJaWYgKGlzX3IxNShpbnNuLCAxMikpCi0JCQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsJLyogUmQgaXMgUEMgKi8KLQkJaW5zbiAmPSAweGZmZmYwZmYwOwkvKiBSZCA9IHIwLCBSbSA9IHIwICovCi0JCWFzaS0+aW5zblswXSA9IGluc247Ci0JCWFzaS0+aW5zbl9oYW5kbGVyID0gZW11bGF0ZV9zYXQ7Ci0JCXJldHVybiBJTlNOX0dPT0Q7Ci0JfQotCi0JLyogUkVWICAgIDogY2NjYyAwMTEwIDEwMTEgeHh4eCB4eHh4IHh4eHggMDAxMSB4eHh4ICovCi0JLyogUkVWMTYgIDogY2NjYyAwMTEwIDEwMTEgeHh4eCB4eHh4IHh4eHggMTAxMSB4eHh4ICovCi0JLyogUkJJVCAgIDogY2NjYyAwMTEwIDExMTEgeHh4eCB4eHh4IHh4eHggMDAxMSB4eHh4ICovCi0JLyogUkVWU0ggIDogY2NjYyAwMTEwIDExMTEgeHh4eCB4eHh4IHh4eHggMTAxMSB4eHh4ICovCi0JaWYgKChpbnNuICYgMHgwZmYwMDA3MCkgPT0gMHgwNmIwMDAzMCB8fAotCSAgICAoaW5zbiAmIDB4MGZmMDAwNzApID09IDB4MDZmMDAwMzApCi0JCXJldHVybiBwcmVwX2VtdWxhdGVfcmQxMnJtMChpbnNuLCBhc2kpOwotCi0JLyogPz8/ICAgICAgIDogY2NjYyAwMTEwIDAwMDAgeHh4eCB4eHh4IHh4eHggeHh4MSB4eHh4IDogICAqLwotCS8qIFNBREQxNiAgICA6IGNjY2MgMDExMCAwMDAxIHh4eHggeHh4eCB4eHh4IDAwMDEgeHh4eCA6R0UgKi8KLQkvKiBTQUREU1VCWCAgOiBjY2NjIDAxMTAgMDAwMSB4eHh4IHh4eHggeHh4eCAwMDExIHh4eHggOkdFICovCi0JLyogU1NVQkFERFggIDogY2NjYyAwMTEwIDAwMDEgeHh4eCB4eHh4IHh4eHggMDEwMSB4eHh4IDpHRSAqLwotCS8qIFNTVUIxNiAgICA6IGNjY2MgMDExMCAwMDAxIHh4eHggeHh4eCB4eHh4IDAxMTEgeHh4eCA6R0UgKi8KLQkvKiBTQUREOCAgICAgOiBjY2NjIDAxMTAgMDAwMSB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggOkdFICovCi0JLyogPz8/ICAgICAgIDogY2NjYyAwMTEwIDAwMDEgeHh4eCB4eHh4IHh4eHggMTAxMSB4eHh4IDogICAqLwotCS8qID8/PyAgICAgICA6IGNjY2MgMDExMCAwMDAxIHh4eHggeHh4eCB4eHh4IDExMDEgeHh4eCA6ICAgKi8KLQkvKiBTU1VCOCAgICAgOiBjY2NjIDAxMTAgMDAwMSB4eHh4IHh4eHggeHh4eCAxMTExIHh4eHggOkdFICovCi0JLyogUUFERDE2ICAgIDogY2NjYyAwMTEwIDAwMTAgeHh4eCB4eHh4IHh4eHggMDAwMSB4eHh4IDogICAqLwotCS8qIFFBRERTVUJYICA6IGNjY2MgMDExMCAwMDEwIHh4eHggeHh4eCB4eHh4IDAwMTEgeHh4eCA6ICAgKi8KLQkvKiBRU1VCQUREWCAgOiBjY2NjIDAxMTAgMDAxMCB4eHh4IHh4eHggeHh4eCAwMTAxIHh4eHggOiAgICovCi0JLyogUVNVQjE2ICAgIDogY2NjYyAwMTEwIDAwMTAgeHh4eCB4eHh4IHh4eHggMDExMSB4eHh4IDogICAqLwotCS8qIFFBREQ4ICAgICA6IGNjY2MgMDExMCAwMDEwIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCA6ICAgKi8KLQkvKiA/Pz8gICAgICAgOiBjY2NjIDAxMTAgMDAxMCB4eHh4IHh4eHggeHh4eCAxMDExIHh4eHggOiAgICovCi0JLyogPz8/ICAgICAgIDogY2NjYyAwMTEwIDAwMTAgeHh4eCB4eHh4IHh4eHggMTEwMSB4eHh4IDogICAqLwotCS8qIFFTVUI4ICAgICA6IGNjY2MgMDExMCAwMDEwIHh4eHggeHh4eCB4eHh4IDExMTEgeHh4eCA6ICAgKi8KLQkvKiBTSEFERDE2ICAgOiBjY2NjIDAxMTAgMDAxMSB4eHh4IHh4eHggeHh4eCAwMDAxIHh4eHggOiAgICovCi0JLyogU0hBRERTVUJYIDogY2NjYyAwMTEwIDAwMTEgeHh4eCB4eHh4IHh4eHggMDAxMSB4eHh4IDogICAqLwotCS8qIFNIU1VCQUREWCA6IGNjY2MgMDExMCAwMDExIHh4eHggeHh4eCB4eHh4IDAxMDEgeHh4eCA6ICAgKi8KLQkvKiBTSFNVQjE2ICAgOiBjY2NjIDAxMTAgMDAxMSB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggOiAgICovCi0JLyogU0hBREQ4ICAgIDogY2NjYyAwMTEwIDAwMTEgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4IDogICAqLwotCS8qID8/PyAgICAgICA6IGNjY2MgMDExMCAwMDExIHh4eHggeHh4eCB4eHh4IDEwMTEgeHh4eCA6ICAgKi8KLQkvKiA/Pz8gICAgICAgOiBjY2NjIDAxMTAgMDAxMSB4eHh4IHh4eHggeHh4eCAxMTAxIHh4eHggOiAgICovCi0JLyogU0hTVUI4ICAgIDogY2NjYyAwMTEwIDAwMTEgeHh4eCB4eHh4IHh4eHggMTExMSB4eHh4IDogICAqLwotCS8qID8/PyAgICAgICA6IGNjY2MgMDExMCAwMTAwIHh4eHggeHh4eCB4eHh4IHh4eDEgeHh4eCA6ICAgKi8KLQkvKiBVQUREMTYgICAgOiBjY2NjIDAxMTAgMDEwMSB4eHh4IHh4eHggeHh4eCAwMDAxIHh4eHggOkdFICovCi0JLyogVUFERFNVQlggIDogY2NjYyAwMTEwIDAxMDEgeHh4eCB4eHh4IHh4eHggMDAxMSB4eHh4IDpHRSAqLwotCS8qIFVTVUJBRERYICA6IGNjY2MgMDExMCAwMTAxIHh4eHggeHh4eCB4eHh4IDAxMDEgeHh4eCA6R0UgKi8KLQkvKiBVU1VCMTYgICAgOiBjY2NjIDAxMTAgMDEwMSB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggOkdFICovCi0JLyogVUFERDggICAgIDogY2NjYyAwMTEwIDAxMDEgeHh4eCB4eHh4IHh4eHggMTAwMSB4eHh4IDpHRSAqLwotCS8qID8/PyAgICAgICA6IGNjY2MgMDExMCAwMTAxIHh4eHggeHh4eCB4eHh4IDEwMTEgeHh4eCA6ICAgKi8KLQkvKiA/Pz8gICAgICAgOiBjY2NjIDAxMTAgMDEwMSB4eHh4IHh4eHggeHh4eCAxMTAxIHh4eHggOiAgICovCi0JLyogVVNVQjggICAgIDogY2NjYyAwMTEwIDAxMDEgeHh4eCB4eHh4IHh4eHggMTExMSB4eHh4IDpHRSAqLwotCS8qIFVRQUREMTYgICA6IGNjY2MgMDExMCAwMTEwIHh4eHggeHh4eCB4eHh4IDAwMDEgeHh4eCA6ICAgKi8KLQkvKiBVUUFERFNVQlggOiBjY2NjIDAxMTAgMDExMCB4eHh4IHh4eHggeHh4eCAwMDExIHh4eHggOiAgICovCi0JLyogVVFTVUJBRERYIDogY2NjYyAwMTEwIDAxMTAgeHh4eCB4eHh4IHh4eHggMDEwMSB4eHh4IDogICAqLwotCS8qIFVRU1VCMTYgICA6IGNjY2MgMDExMCAwMTEwIHh4eHggeHh4eCB4eHh4IDAxMTEgeHh4eCA6ICAgKi8KLQkvKiBVUUFERDggICAgOiBjY2NjIDAxMTAgMDExMCB4eHh4IHh4eHggeHh4eCAxMDAxIHh4eHggOiAgICovCi0JLyogPz8/ICAgICAgIDogY2NjYyAwMTEwIDAxMTAgeHh4eCB4eHh4IHh4eHggMTAxMSB4eHh4IDogICAqLwotCS8qID8/PyAgICAgICA6IGNjY2MgMDExMCAwMTEwIHh4eHggeHh4eCB4eHh4IDExMDEgeHh4eCA6ICAgKi8KLQkvKiBVUVNVQjggICAgOiBjY2NjIDAxMTAgMDExMCB4eHh4IHh4eHggeHh4eCAxMTExIHh4eHggOiAgICovCi0JLyogVUhBREQxNiAgIDogY2NjYyAwMTEwIDAxMTEgeHh4eCB4eHh4IHh4eHggMDAwMSB4eHh4IDogICAqLwotCS8qIFVIQUREU1VCWCA6IGNjY2MgMDExMCAwMTExIHh4eHggeHh4eCB4eHh4IDAwMTEgeHh4eCA6ICAgKi8KLQkvKiBVSFNVQkFERFggOiBjY2NjIDAxMTAgMDExMSB4eHh4IHh4eHggeHh4eCAwMTAxIHh4eHggOiAgICovCi0JLyogVUhTVUIxNiAgIDogY2NjYyAwMTEwIDAxMTEgeHh4eCB4eHh4IHh4eHggMDExMSB4eHh4IDogICAqLwotCS8qIFVIQUREOCAgICA6IGNjY2MgMDExMCAwMTExIHh4eHggeHh4eCB4eHh4IDEwMDEgeHh4eCA6ICAgKi8KLQkvKiA/Pz8gICAgICAgOiBjY2NjIDAxMTAgMDExMSB4eHh4IHh4eHggeHh4eCAxMDExIHh4eHggOiAgICovCi0JLyogPz8/ICAgICAgIDogY2NjYyAwMTEwIDAxMTEgeHh4eCB4eHh4IHh4eHggMTEwMSB4eHh4IDogICAqLwotCS8qIFVIU1VCOCAgICA6IGNjY2MgMDExMCAwMTExIHh4eHggeHh4eCB4eHh4IDExMTEgeHh4eCA6ICAgKi8KLQlpZiAoKGluc24gJiAweDBmODAwMDEwKSA9PSAweDA2MDAwMDEwKSB7Ci0JCWlmICgoaW5zbiAmIDB4MDAzMDAwMDApID09IDB4MDAwMDAwMDAgfHwKLQkJICAgIChpbnNuICYgMHgwMDAwMDBlMCkgPT0gMHgwMDAwMDBhMCB8fAotCQkgICAgKGluc24gJiAweDAwMDAwMGUwKSA9PSAweDAwMDAwMGMwKQotCQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CS8qIFVuYWxsb2NhdGVkIHNwYWNlICovCi0JCXJldHVybiBwcmVwX2VtdWxhdGVfcmQxMnJuMTZybTBfd2ZsYWdzKGluc24sIGFzaSk7Ci0JfQotCi0JLyogUEtIQlQgICAgIDogY2NjYyAwMTEwIDEwMDAgeHh4eCB4eHh4IHh4eHggeDAwMSB4eHh4IDogICAqLwotCS8qIFBLSFRCICAgICA6IGNjY2MgMDExMCAxMDAwIHh4eHggeHh4eCB4eHh4IHgxMDEgeHh4eCA6ICAgKi8KLQlpZiAoKGluc24gJiAweDBmZjAwMDMwKSA9PSAweDA2ODAwMDEwKQotCQlyZXR1cm4gcHJlcF9lbXVsYXRlX3JkMTJybjE2cm0wX3dmbGFncyhpbnNuLCBhc2kpOwotCi0JLyogU1hUQUIxNiAgIDogY2NjYyAwMTEwIDEwMDAgeHh4eCB4eHh4IHh4eHggMDExMSB4eHh4IDogICAqLwotCS8qIFNYVEIxNiAgICA6IGNjY2MgMDExMCAxMDAwIDExMTEgeHh4eCB4eHh4IDAxMTEgeHh4eCA6ICAgKi8KLQkvKiA/Pz8gICAgICAgOiBjY2NjIDAxMTAgMTAwMSB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggOiAgICovCi0JLyogU1hUQUIgICAgIDogY2NjYyAwMTEwIDEwMTAgeHh4eCB4eHh4IHh4eHggMDExMSB4eHh4IDogICAqLwotCS8qIFNYVEIgICAgICA6IGNjY2MgMDExMCAxMDEwIDExMTEgeHh4eCB4eHh4IDAxMTEgeHh4eCA6ICAgKi8KLQkvKiBTWFRBSCAgICAgOiBjY2NjIDAxMTAgMTAxMSB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggOiAgICovCi0JLyogU1hUSCAgICAgIDogY2NjYyAwMTEwIDEwMTEgMTExMSB4eHh4IHh4eHggMDExMSB4eHh4IDogICAqLwotCS8qIFVYVEFCMTYgICA6IGNjY2MgMDExMCAxMTAwIHh4eHggeHh4eCB4eHh4IDAxMTEgeHh4eCA6ICAgKi8KLQkvKiBVWFRCMTYgICAgOiBjY2NjIDAxMTAgMTEwMCAxMTExIHh4eHggeHh4eCAwMTExIHh4eHggOiAgICovCi0JLyogPz8/ICAgICAgIDogY2NjYyAwMTEwIDExMDEgeHh4eCB4eHh4IHh4eHggMDExMSB4eHh4IDogICAqLwotCS8qIFVYVEFCICAgICA6IGNjY2MgMDExMCAxMTEwIHh4eHggeHh4eCB4eHh4IDAxMTEgeHh4eCA6ICAgKi8KLQkvKiBVWFRCICAgICAgOiBjY2NjIDAxMTAgMTExMCAxMTExIHh4eHggeHh4eCAwMTExIHh4eHggOiAgICovCi0JLyogVVhUQUggICAgIDogY2NjYyAwMTEwIDExMTEgeHh4eCB4eHh4IHh4eHggMDExMSB4eHh4IDogICAqLwotCS8qIFVYVEggICAgICA6IGNjY2MgMDExMCAxMTExIDExMTEgeHh4eCB4eHh4IDAxMTEgeHh4eCA6ICAgKi8KLQlpZiAoKGluc24gJiAweDBmODAwMGYwKSA9PSAweDA2ODAwMDcwKSB7Ci0JCWlmICgoaW5zbiAmIDB4MDAzMDAwMDApID09IDB4MDAxMDAwMDApCi0JCQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsJLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KLQotCQlpZiAoKGluc24gJiAweDAwMGYwMDAwKSA9PSAweDAwMGYwMDAwKQotCQkJcmV0dXJuIHByZXBfZW11bGF0ZV9yZDEycm0wKGluc24sIGFzaSk7Ci0JCWVsc2UKLQkJCXJldHVybiBwcmVwX2VtdWxhdGVfcmQxMnJuMTZybTBfd2ZsYWdzKGluc24sIGFzaSk7Ci0JfQotCi0JLyogT3RoZXIgaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzIGFyZW4ndCB5ZXQgZGVmaW5lZCAqLwotCXJldHVybiBJTlNOX1JFSkVDVEVEOwotfQotCi1zdGF0aWMgZW51bSBrcHJvYmVfaW5zbiBfX2twcm9iZXMKLXNwYWNlX2NjY2NfMDExMV9fMShrcHJvYmVfb3Bjb2RlX3QgaW5zbiwgc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiAqYXNpKQotewotCS8qIFVuZGVmIDogY2NjYyAwMTExIDExMTEgeHh4eCB4eHh4IHh4eHggMTExMSB4eHh4ICovCi0JaWYgKChpbnNuICYgMHgwZmYwMDBmMCkgPT0gMHgwM2YwMDBmMCkKLQkJcmV0dXJuIElOU05fUkVKRUNURUQ7Ci0KLQkvKiBTTUxBTEQgOiBjY2NjIDAxMTEgMDEwMCB4eHh4IHh4eHggeHh4eCAwMHgxIHh4eHggKi8KLQkvKiBTTUxTTEQgOiBjY2NjIDAxMTEgMDEwMCB4eHh4IHh4eHggeHh4eCAwMXgxIHh4eHggKi8KLQlpZiAoKGluc24gJiAweDBmZjAwMDkwKSA9PSAweDA3NDAwMDEwKQotCQlyZXR1cm4gcHJlcF9lbXVsYXRlX3JkaGkxNnJkbG8xMnJzOHJtMF93ZmxhZ3MoaW5zbiwgYXNpKTsKLQotCS8qIFNNTEFEICA6IGNjY2MgMDExMSAwMDAwIHh4eHggeHh4eCB4eHh4IDAweDEgeHh4eCA6USAqLwotCS8qIFNNVUFEICA6IGNjY2MgMDExMSAwMDAwIHh4eHggMTExMSB4eHh4IDAweDEgeHh4eCA6USAqLwotCS8qIFNNTFNEICA6IGNjY2MgMDExMSAwMDAwIHh4eHggeHh4eCB4eHh4IDAxeDEgeHh4eCA6USAqLwotCS8qIFNNVVNEICA6IGNjY2MgMDExMSAwMDAwIHh4eHggMTExMSB4eHh4IDAxeDEgeHh4eCA6ICAqLwotCS8qIFNNTUxBICA6IGNjY2MgMDExMSAwMTAxIHh4eHggeHh4eCB4eHh4IDAweDEgeHh4eCA6ICAqLwotCS8qIFNNTVVMICA6IGNjY2MgMDExMSAwMTAxIHh4eHggMTExMSB4eHh4IDAweDEgeHh4eCA6ICAqLwotCS8qIFVTQURBOCA6IGNjY2MgMDExMSAxMDAwIHh4eHggeHh4eCB4eHh4IDAwMDEgeHh4eCA6ICAqLwotCS8qIFVTQUQ4ICA6IGNjY2MgMDExMSAxMDAwIHh4eHggMTExMSB4eHh4IDAwMDEgeHh4eCA6ICAqLwotCWlmICgoaW5zbiAmIDB4MGZmMDAwOTApID09IDB4MDcwMDAwMTAgfHwKLQkgICAgKGluc24gJiAweDBmZjAwMGQwKSA9PSAweDA3NTAwMDEwIHx8Ci0JICAgIChpbnNuICYgMHgwZmYwMDBmMCkgPT0gMHgwNzgwMDAxMCkgewotCi0JCWlmICgoaW5zbiAmIDB4MDAwMGYwMDApID09IDB4MDAwMGYwMDApCi0JCQlyZXR1cm4gcHJlcF9lbXVsYXRlX3JkMTZyczhybTBfd2ZsYWdzKGluc24sIGFzaSk7Ci0JCWVsc2UKLQkJCXJldHVybiBwcmVwX2VtdWxhdGVfcmQxNnJuMTJyczhybTBfd2ZsYWdzKGluc24sIGFzaSk7Ci0JfQotCi0JLyogU01NTFMgIDogY2NjYyAwMTExIDAxMDEgeHh4eCB4eHh4IHh4eHggMTF4MSB4eHh4IDogICovCi0JaWYgKChpbnNuICYgMHgwZmYwMDBkMCkgPT0gMHgwNzUwMDBkMCkKLQkJcmV0dXJuIHByZXBfZW11bGF0ZV9yZDE2cm4xMnJzOHJtMF93ZmxhZ3MoaW5zbiwgYXNpKTsKLQotCS8qIFNCRlggICA6IGNjY2MgMDExMSAxMDF4IHh4eHggeHh4eCB4eHh4IHgxMDEgeHh4eCA6ICAqLwotCS8qIFVCRlggICA6IGNjY2MgMDExMSAxMTF4IHh4eHggeHh4eCB4eHh4IHgxMDEgeHh4eCA6ICAqLwotCWlmICgoaW5zbiAmIDB4MGZhMDAwNzApID09IDB4MDdhMDAwNTApCi0JCXJldHVybiBwcmVwX2VtdWxhdGVfcmQxMnJtMChpbnNuLCBhc2kpOwotCi0JLyogQkZJICAgIDogY2NjYyAwMTExIDExMHggeHh4eCB4eHh4IHh4eHggeDAwMSB4eHh4IDogICovCi0JLyogQkZDICAgIDogY2NjYyAwMTExIDExMHggeHh4eCB4eHh4IHh4eHggeDAwMSAxMTExIDogICovCi0JaWYgKChpbnNuICYgMHgwZmUwMDA3MCkgPT0gMHgwN2MwMDAxMCkgewotCi0JCWlmICgoaW5zbiAmIDB4MDAwMDAwMGYpID09IDB4MDAwMDAwMGYpCi0JCQlyZXR1cm4gcHJlcF9lbXVsYXRlX3JkMTJfbW9kaWZ5KGluc24sIGFzaSk7Ci0JCWVsc2UKLQkJCXJldHVybiBwcmVwX2VtdWxhdGVfcmQxMnJuMF9tb2RpZnkoaW5zbiwgYXNpKTsKLQl9Ci0KLQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsKLX0KLQotc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCi1zcGFjZV9jY2NjXzAxeHgoa3Byb2JlX29wY29kZV90IGluc24sIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKmFzaSkKLXsKLQkvKiBMRFIgICA6IGNjY2MgMDF4eCB4MHgxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCS8qIExEUkIgIDogY2NjYyAwMXh4IHgxeDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCi0JLyogTERSQlQgOiBjY2NjIDAxeDAgeDExMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KLQkvKiBMRFJUICA6IGNjY2MgMDF4MCB4MDExIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCS8qIFNUUiAgIDogY2NjYyAwMXh4IHgweDAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCi0JLyogU1RSQiAgOiBjY2NjIDAxeHggeDF4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KLQkvKiBTVFJCVCA6IGNjY2MgMDF4MCB4MTEwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCS8qIFNUUlQgIDogY2NjYyAwMXgwIHgwMTAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCi0KLQlpZiAoKGluc24gJiAweDAwNTAwMDAwKSA9PSAweDAwNTAwMDAwICYmIGlzX3IxNShpbnNuLCAxMikpCi0JCXJldHVybiBJTlNOX1JFSkVDVEVEOwkvKiBMRFJCIGludG8gUEMgKi8KLQotCXJldHVybiBwcmVwX2VtdWxhdGVfbGRyX3N0cihpbnNuLCBhc2kpOwotfQotCi1zdGF0aWMgZW51bSBrcHJvYmVfaW5zbiBfX2twcm9iZXMKLXNwYWNlX2NjY2NfMTAweChrcHJvYmVfb3Bjb2RlX3QgaW5zbiwgc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiAqYXNpKQotewotCS8qIExETSgyKSA6IGNjY2MgMTAweCB4MTAxIHh4eHggMHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCS8qIExETSgzKSA6IGNjY2MgMTAweCB4MXgxIHh4eHggMXh4eCB4eHh4IHh4eHggeHh4eCAqLwotCWlmICgoaW5zbiAmIDB4MGU3MDgwMDApID09IDB4ODUwMDAwMDAgfHwKLQkgICAgKGluc24gJiAweDBlNTA4MDAwKSA9PSAweDg1MDEwMDAwKQotCQlyZXR1cm4gSU5TTl9SRUpFQ1RFRDsKLQotCS8qIExETSgxKSA6IGNjY2MgMTAweCB4MHgxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCS8qIFNUTSgxKSA6IGNjY2MgMTAweCB4MHgwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCWFzaS0+aW5zbl9oYW5kbGVyID0gKChpbnNuICYgMHgxMDgwMDApID09IDB4MDA4MDAwKSA/IC8qIFNUTSAmIFIxNSAqLwotCQkJCXNpbXVsYXRlX3N0bTFfcGMgOiBzaW11bGF0ZV9sZG0xc3RtMTsKLQlyZXR1cm4gSU5TTl9HT09EX05PX1NMT1Q7Ci19Ci0KLXN0YXRpYyBlbnVtIGtwcm9iZV9pbnNuIF9fa3Byb2Jlcwotc3BhY2VfY2NjY18xMDF4KGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCi17Ci0JLyogQiAgOiBjY2NjIDEwMTAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KLQkvKiBCTCA6IGNjY2MgMTAxMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCWFzaS0+aW5zbl9oYW5kbGVyID0gc2ltdWxhdGVfYmJsOwotCXJldHVybiBJTlNOX0dPT0RfTk9fU0xPVDsKLX0KLQotc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCi1zcGFjZV9jY2NjXzExeHgoa3Byb2JlX29wY29kZV90IGluc24sIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKmFzaSkKLXsKLQkvKiBDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuLi4gKi8KLQkvKiBNQ1JSIDogY2NjYyAxMTAwIDAxMDAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IDogKFJkIT1SbikgKi8KLQkvKiBNUlJDIDogY2NjYyAxMTAwIDAxMDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IDogKFJkIT1SbikgKi8KLQkvKiBMREMgIDogY2NjYyAxMTB4IHh4eDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCi0JLyogU1RDICA6IGNjY2MgMTEweCB4eHgwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCS8qIENEUCAgOiBjY2NjIDExMTAgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHgwIHh4eHggKi8KLQkvKiBNQ1IgIDogY2NjYyAxMTEwIHh4eDAgeHh4eCB4eHh4IHh4eHggeHh4MSB4eHh4ICovCi0JLyogTVJDICA6IGNjY2MgMTExMCB4eHgxIHh4eHggeHh4eCB4eHh4IHh4eDEgeHh4eCAqLwotCi0JLyogU1ZDICA6IGNjY2MgMTExMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLwotCi0JcmV0dXJuIElOU05fUkVKRUNURUQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9fa3Byb2JlcyBfX2NoZWNrX2VxKHVuc2lnbmVkIGxvbmcgY3BzcikKLXsKLQlyZXR1cm4gY3BzciAmIFBTUl9aX0JJVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfbmUodW5zaWduZWQgbG9uZyBjcHNyKQotewotCXJldHVybiAofmNwc3IpICYgUFNSX1pfQklUOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2twcm9iZXMgX19jaGVja19jcyh1bnNpZ25lZCBsb25nIGNwc3IpCi17Ci0JcmV0dXJuIGNwc3IgJiBQU1JfQ19CSVQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9fa3Byb2JlcyBfX2NoZWNrX2NjKHVuc2lnbmVkIGxvbmcgY3BzcikKLXsKLQlyZXR1cm4gKH5jcHNyKSAmIFBTUl9DX0JJVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfbWkodW5zaWduZWQgbG9uZyBjcHNyKQotewotCXJldHVybiBjcHNyICYgUFNSX05fQklUOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2twcm9iZXMgX19jaGVja19wbCh1bnNpZ25lZCBsb25nIGNwc3IpCi17Ci0JcmV0dXJuICh+Y3BzcikgJiBQU1JfTl9CSVQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9fa3Byb2JlcyBfX2NoZWNrX3ZzKHVuc2lnbmVkIGxvbmcgY3BzcikKLXsKLQlyZXR1cm4gY3BzciAmIFBTUl9WX0JJVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfdmModW5zaWduZWQgbG9uZyBjcHNyKQotewotCXJldHVybiAofmNwc3IpICYgUFNSX1ZfQklUOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2twcm9iZXMgX19jaGVja19oaSh1bnNpZ25lZCBsb25nIGNwc3IpCi17Ci0JY3BzciAmPSB+KGNwc3IgPj4gMSk7IC8qIFBTUl9DX0JJVCAmPSB+UFNSX1pfQklUICovCi0JcmV0dXJuIGNwc3IgJiBQU1JfQ19CSVQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9fa3Byb2JlcyBfX2NoZWNrX2xzKHVuc2lnbmVkIGxvbmcgY3BzcikKLXsKLQljcHNyICY9IH4oY3BzciA+PiAxKTsgLyogUFNSX0NfQklUICY9IH5QU1JfWl9CSVQgKi8KLQlyZXR1cm4gKH5jcHNyKSAmIFBTUl9DX0JJVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfZ2UodW5zaWduZWQgbG9uZyBjcHNyKQotewotCWNwc3IgXj0gKGNwc3IgPDwgMyk7IC8qIFBTUl9OX0JJVCBePSBQU1JfVl9CSVQgKi8KLQlyZXR1cm4gKH5jcHNyKSAmIFBTUl9OX0JJVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfbHQodW5zaWduZWQgbG9uZyBjcHNyKQotewotCWNwc3IgXj0gKGNwc3IgPDwgMyk7IC8qIFBTUl9OX0JJVCBePSBQU1JfVl9CSVQgKi8KLQlyZXR1cm4gY3BzciAmIFBTUl9OX0JJVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfZ3QodW5zaWduZWQgbG9uZyBjcHNyKQotewotCXVuc2lnbmVkIGxvbmcgdGVtcCA9IGNwc3IgXiAoY3BzciA8PCAzKTsgLyogUFNSX05fQklUIF49IFBTUl9WX0JJVCAqLwotCXRlbXAgfD0gKGNwc3IgPDwgMSk7CQkJIC8qIFBTUl9OX0JJVCB8PSBQU1JfWl9CSVQgKi8KLQlyZXR1cm4gKH50ZW1wKSAmIFBTUl9OX0JJVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfbGUodW5zaWduZWQgbG9uZyBjcHNyKQotewotCXVuc2lnbmVkIGxvbmcgdGVtcCA9IGNwc3IgXiAoY3BzciA8PCAzKTsgLyogUFNSX05fQklUIF49IFBTUl9WX0JJVCAqLwotCXRlbXAgfD0gKGNwc3IgPDwgMSk7CQkJIC8qIFBTUl9OX0JJVCB8PSBQU1JfWl9CSVQgKi8KLQlyZXR1cm4gdGVtcCAmIFBTUl9OX0JJVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIF9fY2hlY2tfYWwodW5zaWduZWQgbG9uZyBjcHNyKQotewotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMga3Byb2JlX2NoZWNrX2NjICogY29uc3QgY29uZGl0aW9uX2NoZWNrc1sxNl0gPSB7Ci0JJl9fY2hlY2tfZXEsICZfX2NoZWNrX25lLCAmX19jaGVja19jcywgJl9fY2hlY2tfY2MsCi0JJl9fY2hlY2tfbWksICZfX2NoZWNrX3BsLCAmX19jaGVja192cywgJl9fY2hlY2tfdmMsCi0JJl9fY2hlY2tfaGksICZfX2NoZWNrX2xzLCAmX19jaGVja19nZSwgJl9fY2hlY2tfbHQsCi0JJl9fY2hlY2tfZ3QsICZfX2NoZWNrX2xlLCAmX19jaGVja19hbCwgJl9fY2hlY2tfYWwKLX07Ci0KLS8qIFJldHVybjoKLSAqICAgSU5TTl9SRUpFQ1RFRCAgICAgSWYgaW5zdHJ1Y3Rpb24gaXMgb25lIG5vdCBhbGxvd2VkIHRvIGtwcm9iZSwKLSAqICAgSU5TTl9HT09EICAgICAgICAgSWYgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9ydGVkIGFuZCB1c2VzIGluc3RydWN0aW9uIHNsb3QsCi0gKiAgIElOU05fR09PRF9OT19TTE9UIElmIGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCBidXQgZG9lc24ndCB1c2UgaXRzIHNsb3QuCi0gKgotICogRm9yIGluc3RydWN0aW9ucyB3ZSBkb24ndCB3YW50IHRvIGtwcm9iZSAoSU5TTl9SRUpFQ1RFRCByZXR1cm4gcmVzdWx0KToKLSAqICAgVGhlc2UgYXJlIGdlbmVyYWxseSBvbmVzIHRoYXQgbW9kaWZ5IHRoZSBwcm9jZXNzb3Igc3RhdGUgbWFraW5nCi0gKiAgIHRoZW0gImhhcmQiIHRvIHNpbXVsYXRlIHN1Y2ggYXMgc3dpdGNoZXMgcHJvY2Vzc29yIG1vZGVzIG9yCi0gKiAgIG1ha2UgYWNjZXNzZXMgaW4gYWx0ZXJuYXRlIG1vZGVzLiAgQW55IG9mIHRoZXNlIGNvdWxkIGJlIHNpbXVsYXRlZAotICogICBpZiB0aGUgd29yayB3YXMgcHV0IGludG8gaXQsIGJ1dCBsb3cgcmV0dXJuIGNvbnNpZGVyaW5nIHRoZXkKLSAqICAgc2hvdWxkIGFsc28gYmUgdmVyeSByYXJlLgotICovCi1lbnVtIGtwcm9iZV9pbnNuIF9fa3Byb2JlcwotYXJtX2twcm9iZV9kZWNvZGVfaW5zbihrcHJvYmVfb3Bjb2RlX3QgaW5zbiwgc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiAqYXNpKQotewotCWFzaS0+aW5zbl9jaGVja19jYyA9IGNvbmRpdGlvbl9jaGVja3NbaW5zbj4+MjhdOwotCWFzaS0+aW5zblsxXSA9IEtQUk9CRV9SRVRVUk5fSU5TVFJVQ1RJT047Ci0KLQlpZiAoKGluc24gJiAweGYwMDAwMDAwKSA9PSAweGYwMDAwMDAwKQotCi0JCXJldHVybiBzcGFjZV8xMTExKGluc24sIGFzaSk7Ci0KLQllbHNlIGlmICgoaW5zbiAmIDB4MGUwMDAwMDApID09IDB4MDAwMDAwMDApCi0KLQkJcmV0dXJuIHNwYWNlX2NjY2NfMDAweChpbnNuLCBhc2kpOwotCi0JZWxzZSBpZiAoKGluc24gJiAweDBlMDAwMDAwKSA9PSAweDAyMDAwMDAwKQotCi0JCXJldHVybiBzcGFjZV9jY2NjXzAwMXgoaW5zbiwgYXNpKTsKLQotCWVsc2UgaWYgKChpbnNuICYgMHgwZjAwMDAxMCkgPT0gMHgwNjAwMDAxMCkKLQotCQlyZXR1cm4gc3BhY2VfY2NjY18wMTEwX18xKGluc24sIGFzaSk7Ci0KLQllbHNlIGlmICgoaW5zbiAmIDB4MGYwMDAwMTApID09IDB4MDcwMDAwMTApCi0KLQkJcmV0dXJuIHNwYWNlX2NjY2NfMDExMV9fMShpbnNuLCBhc2kpOwotCi0JZWxzZSBpZiAoKGluc24gJiAweDBjMDAwMDAwKSA9PSAweDA0MDAwMDAwKQotCi0JCXJldHVybiBzcGFjZV9jY2NjXzAxeHgoaW5zbiwgYXNpKTsKLQotCWVsc2UgaWYgKChpbnNuICYgMHgwZTAwMDAwMCkgPT0gMHgwODAwMDAwMCkKLQotCQlyZXR1cm4gc3BhY2VfY2NjY18xMDB4KGluc24sIGFzaSk7Ci0KLQllbHNlIGlmICgoaW5zbiAmIDB4MGUwMDAwMDApID09IDB4MGEwMDAwMDApCi0KLQkJcmV0dXJuIHNwYWNlX2NjY2NfMTAxeChpbnNuLCBhc2kpOwotCi0JcmV0dXJuIHNwYWNlX2NjY2NfMTF4eChpbnNuLCBhc2kpOwotfQotCi12b2lkIF9faW5pdCBhcm1fa3Byb2JlX2RlY29kZV9pbml0KHZvaWQpCi17Ci0JZmluZF9zdHJfcGNfb2Zmc2V0KCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10aHVtYi5jIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtdGh1bWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDJjYTU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtdGh1bWIuYwpAQCAtMCwwICsxLDE0NjIgQEAKKy8qCisgKiBhcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10aHVtYi5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEpvbiBNZWRodXJzdCA8dGl4eUB5eGl0LmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisKKyNpbmNsdWRlICJrcHJvYmVzLmgiCisKKworLyoKKyAqIFRydWUgaWYgY3VycmVudCBpbnN0cnVjdGlvbiBpcyBpbiBhbiBJVCBibG9jay4KKyAqLworI2RlZmluZSBpbl9pdF9ibG9jayhjcHNyKQkoKGNwc3IgJiAweDA2MDAwYzAwKSAhPSAweDAwMDAwMDAwKQorCisvKgorICogUmV0dXJuIHRoZSBjb25kaXRpb24gY29kZSB0byBjaGVjayBmb3IgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaW5zdHJ1Y3Rpb24uCisgKiBUaGlzIGlzIGluIElUU1RBVEU8Nzo0PiB3aGljaCBpcyBpbiBDUFNSPDE1OjEyPiBidXQgaXMgb25seSB2YWxpZCBpZgorICogaW5faXRfYmxvY2sgcmV0dXJucyB0cnVlLgorICovCisjZGVmaW5lIGN1cnJlbnRfY29uZChjcHNyKQkoKGNwc3IgPj4gMTIpICYgMHhmKQorCisvKgorICogUmV0dXJuIHRoZSBQQyB2YWx1ZSBmb3IgYSBwcm9iZSBpbiB0aHVtYiBjb2RlLgorICogVGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvYmVkIGluc3RydWN0aW9uIHBsdXMgNC4KKyAqIFdlIHN1YnRyYWN0IG9uZSBiZWNhdXNlIHRoZSBhZGRyZXNzIHdpbGwgaGF2ZSBiaXQgemVybyBzZXQgdG8gaW5kaWNhdGUKKyAqIGEgcG9pbnRlciB0byB0aHVtYiBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIHRodW1iX3Byb2JlX3BjKHN0cnVjdCBrcHJvYmUgKnApCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKXAtPmFkZHIgLSAxICsgNDsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCit0MzJfc2ltdWxhdGVfdGFibGVfYnJhbmNoKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCXVuc2lnbmVkIGxvbmcgcGMgPSB0aHVtYl9wcm9iZV9wYyhwKTsKKwlpbnQgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CisJaW50IHJtID0gaW5zbiAmIDB4ZjsKKworCXVuc2lnbmVkIGxvbmcgcm52ID0gKHJuID09IDE1KSA/IHBjIDogcmVncy0+dXJlZ3Nbcm5dOworCXVuc2lnbmVkIGxvbmcgcm12ID0gcmVncy0+dXJlZ3Nbcm1dOworCXVuc2lnbmVkIGludCBoYWxmd29yZHM7CisKKwlpZiAoaW5zbiAmIDB4MTApIC8qIFRCSCAqLworCQloYWxmd29yZHMgPSAoKHUxNiAqKXJudilbcm12XTsKKwllbHNlIC8qIFRCQiAqLworCQloYWxmd29yZHMgPSAoKHU4ICopcm52KVtybXZdOworCisJcmVncy0+QVJNX3BjID0gcGMgKyAyICogaGFsZndvcmRzOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK3QzMl9zaW11bGF0ZV9tcnMoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJa3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7CisJaW50IHJkID0gKGluc24gPj4gOCkgJiAweGY7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gMHhmOGZmMDNkZjsgLyogTWFzayBvdXQgZXhlY3V0aW9uIHN0YXRlICovCisJcmVncy0+dXJlZ3NbcmRdID0gcmVncy0+QVJNX2Nwc3IgJiBtYXNrOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK3QzMl9zaW11bGF0ZV9jb25kX2JyYW5jaChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwl1bnNpZ25lZCBsb25nIHBjID0gdGh1bWJfcHJvYmVfcGMocCk7CisKKwlsb25nIG9mZnNldCA9IGluc24gJiAweDdmZjsJCS8qIGltbTExICovCisJb2Zmc2V0ICs9IChpbnNuICYgMHgwMDNmMDAwMCkgPj4gNTsJLyogaW1tNiAqLworCW9mZnNldCArPSAoaW5zbiAmIDB4MDAwMDIwMDApIDw8IDQ7CS8qIEoxICovCisJb2Zmc2V0ICs9IChpbnNuICYgMHgwMDAwMDgwMCkgPDwgNzsJLyogSjIgKi8KKwlvZmZzZXQgLT0gKGluc24gJiAweDA0MDAwMDAwKSA+PiA3OwkvKiBBcHBseSBzaWduIGJpdCAqLworCisJcmVncy0+QVJNX3BjID0gcGMgKyAob2Zmc2V0ICogMik7Cit9CisKK3N0YXRpYyBlbnVtIGtwcm9iZV9pbnNuIF9fa3Byb2JlcwordDMyX2RlY29kZV9jb25kX2JyYW5jaChrcHJvYmVfb3Bjb2RlX3QgaW5zbiwgc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiAqYXNpKQoreworCWludCBjYyA9IChpbnNuID4+IDIyKSAmIDB4ZjsKKwlhc2ktPmluc25fY2hlY2tfY2MgPSBrcHJvYmVfY29uZGl0aW9uX2NoZWNrc1tjY107CisJYXNpLT5pbnNuX2hhbmRsZXIgPSB0MzJfc2ltdWxhdGVfY29uZF9icmFuY2g7CisJcmV0dXJuIElOU05fR09PRF9OT19TTE9UOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK3QzMl9zaW11bGF0ZV9icmFuY2goc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJa3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7CisJdW5zaWduZWQgbG9uZyBwYyA9IHRodW1iX3Byb2JlX3BjKHApOworCisJbG9uZyBvZmZzZXQgPSBpbnNuICYgMHg3ZmY7CQkvKiBpbW0xMSAqLworCW9mZnNldCArPSAoaW5zbiAmIDB4MDNmZjAwMDApID4+IDU7CS8qIGltbTEwICovCisJb2Zmc2V0ICs9IChpbnNuICYgMHgwMDAwMjAwMCkgPDwgOTsJLyogSjEgKi8KKwlvZmZzZXQgKz0gKGluc24gJiAweDAwMDAwODAwKSA8PCAxMDsJLyogSjIgKi8KKwlpZiAoaW5zbiAmIDB4MDQwMDAwMDApCisJCW9mZnNldCAtPSAweDAwODAwMDAwOyAvKiBBcHBseSBzaWduIGJpdCAqLworCWVsc2UKKwkJb2Zmc2V0IF49IDB4MDA2MDAwMDA7IC8qIEludmVydCBKMSBhbmQgSjIgKi8KKworCWlmIChpbnNuICYgKDEgPDwgMTQpKSB7CisJCS8qIEJMIG9yIEJMWCAqLworCQlyZWdzLT5BUk1fbHIgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyICsgNDsKKwkJaWYgKCEoaW5zbiAmICgxIDw8IDEyKSkpIHsKKwkJCS8qIEJMWCBzbyBzd2l0Y2ggdG8gQVJNIG1vZGUgKi8KKwkJCXJlZ3MtPkFSTV9jcHNyICY9IH5QU1JfVF9CSVQ7CisJCQlwYyAmPSB+MzsKKwkJfQorCX0KKworCXJlZ3MtPkFSTV9wYyA9IHBjICsgKG9mZnNldCAqIDIpOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK3QzMl9zaW11bGF0ZV9sZHJfbGl0ZXJhbChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSB0aHVtYl9wcm9iZV9wYyhwKSAmIH4zOworCWludCBydCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKwl1bnNpZ25lZCBsb25nIHJ0djsKKworCWxvbmcgb2Zmc2V0ID0gaW5zbiAmIDB4ZmZmOworCWlmIChpbnNuICYgMHgwMDgwMDAwMCkKKwkJYWRkciArPSBvZmZzZXQ7CisJZWxzZQorCQlhZGRyIC09IG9mZnNldDsKKworCWlmIChpbnNuICYgMHgwMDQwMDAwMCkgeworCQkvKiBMRFIgKi8KKwkJcnR2ID0gKih1bnNpZ25lZCBsb25nICopYWRkcjsKKwkJaWYgKHJ0ID09IDE1KSB7CisJCQlieF93cml0ZV9wYyhydHYsIHJlZ3MpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIGlmIChpbnNuICYgMHgwMDIwMDAwMCkgeworCQkvKiBMRFJIICovCisJCWlmIChpbnNuICYgMHgwMTAwMDAwMCkKKwkJCXJ0diA9ICooczE2ICopYWRkcjsKKwkJZWxzZQorCQkJcnR2ID0gKih1MTYgKilhZGRyOworCX0gZWxzZSB7CisJCS8qIExEUkIgKi8KKwkJaWYgKGluc24gJiAweDAxMDAwMDAwKQorCQkJcnR2ID0gKihzOCAqKWFkZHI7CisJCWVsc2UKKwkJCXJ0diA9ICoodTggKilhZGRyOworCX0KKworCXJlZ3MtPnVyZWdzW3J0XSA9IHJ0djsKK30KKworc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCit0MzJfZGVjb2RlX2xkbXN0bShrcHJvYmVfb3Bjb2RlX3QgaW5zbiwgc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiAqYXNpKQoreworCWVudW0ga3Byb2JlX2luc24gcmV0ID0ga3Byb2JlX2RlY29kZV9sZG1zdG0oaW5zbiwgYXNpKTsKKworCS8qIEZpeHVwIG1vZGlmaWVkIGluc3RydWN0aW9uIHRvIGhhdmUgaGFsZndvcmRzIGluIGNvcnJlY3Qgb3JkZXIuLi4qLworCWluc24gPSBhc2ktPmluc25bMF07CisJKCh1MTYgKilhc2ktPmluc24pWzBdID0gaW5zbiA+PiAxNjsKKwkoKHUxNiAqKWFzaS0+aW5zbilbMV0gPSBpbnNuICYgMHhmZmZmOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCit0MzJfZW11bGF0ZV9sZHJkc3RyZChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwl1bnNpZ25lZCBsb25nIHBjID0gdGh1bWJfcHJvYmVfcGMocCkgJiB+MzsKKwlpbnQgcnQxID0gKGluc24gPj4gMTIpICYgMHhmOworCWludCBydDIgPSAoaW5zbiA+PiA4KSAmIDB4ZjsKKwlpbnQgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CisKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJ0MXYgYXNtKCJyMCIpID0gcmVncy0+dXJlZ3NbcnQxXTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJ0MnYgYXNtKCJyMSIpID0gcmVncy0+dXJlZ3NbcnQyXTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJudiBhc20oInIyIikgPSAocm4gPT0gMTUpID8gcGMKKwkJCQkJCQkgIDogcmVncy0+dXJlZ3Nbcm5dOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiYmx4ICAgICVbZm5dIgorCQk6ICI9ciIgKHJ0MXYpLCAiPXIiIChydDJ2KSwgIj1yIiAocm52KQorCQk6ICIwIiAocnQxdiksICIxIiAocnQydiksICIyIiAocm52KSwgW2ZuXSAiciIgKHAtPmFpbnNuLmluc25fZm4pCisJCTogImxyIiwgIm1lbW9yeSIsICJjYyIKKwkpOworCisJaWYgKHJuICE9IDE1KQorCQlyZWdzLT51cmVnc1tybl0gPSBybnY7IC8qIFdyaXRlYmFjayBiYXNlIHJlZ2lzdGVyICovCisJcmVncy0+dXJlZ3NbcnQxXSA9IHJ0MXY7CisJcmVncy0+dXJlZ3NbcnQyXSA9IHJ0MnY7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcwordDMyX2VtdWxhdGVfbGRyc3RyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCWludCBydCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKwlpbnQgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CisJaW50IHJtID0gaW5zbiAmIDB4ZjsKKworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcnR2IGFzbSgicjAiKSA9IHJlZ3MtPnVyZWdzW3J0XTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJudiBhc20oInIyIikgPSByZWdzLT51cmVnc1tybl07CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBybXYgYXNtKCJyMyIpID0gcmVncy0+dXJlZ3Nbcm1dOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiYmx4ICAgICVbZm5dIgorCQk6ICI9ciIgKHJ0diksICI9ciIgKHJudikKKwkJOiAiMCIgKHJ0diksICIxIiAocm52KSwgInIiIChybXYpLCBbZm5dICJyIiAocC0+YWluc24uaW5zbl9mbikKKwkJOiAibHIiLCAibWVtb3J5IiwgImNjIgorCSk7CisKKwlyZWdzLT51cmVnc1tybl0gPSBybnY7IC8qIFdyaXRlYmFjayBiYXNlIHJlZ2lzdGVyICovCisJaWYgKHJ0ID09IDE1KSAvKiBDYW4ndCBiZSB0cnVlIGZvciBhIFNUUiBhcyB0aGV5IGFyZW4ndCBhbGxvd2VkICovCisJCWJ4X3dyaXRlX3BjKHJ0diwgcmVncyk7CisJZWxzZQorCQlyZWdzLT51cmVnc1tydF0gPSBydHY7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcwordDMyX2VtdWxhdGVfcmQ4cm4xNnJtMF9yd2ZsYWdzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCWludCByZCA9IChpbnNuID4+IDgpICYgMHhmOworCWludCBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKwlpbnQgcm0gPSBpbnNuICYgMHhmOworCisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZHYgYXNtKCJyMSIpID0gcmVncy0+dXJlZ3NbcmRdOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcm52IGFzbSgicjIiKSA9IHJlZ3MtPnVyZWdzW3JuXTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJtdiBhc20oInIzIikgPSByZWdzLT51cmVnc1tybV07CisJdW5zaWduZWQgbG9uZyBjcHNyID0gcmVncy0+QVJNX2Nwc3I7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJtc3IJY3Bzcl9mcywgJVtjcHNyXQlcblx0IgorCQkiYmx4ICAgICVbZm5dCQkJXG5cdCIKKwkJIm1ycwklW2Nwc3JdLCBjcHNyCQlcblx0IgorCQk6ICI9ciIgKHJkdiksIFtjcHNyXSAiPXIiIChjcHNyKQorCQk6ICIwIiAocmR2KSwgInIiIChybnYpLCAiciIgKHJtdiksCisJCSAgIjEiIChjcHNyKSwgW2ZuXSAiciIgKHAtPmFpbnNuLmluc25fZm4pCisJCTogImxyIiwgIm1lbW9yeSIsICJjYyIKKwkpOworCisJcmVncy0+dXJlZ3NbcmRdID0gcmR2OworCXJlZ3MtPkFSTV9jcHNyID0gKHJlZ3MtPkFSTV9jcHNyICYgfkFQU1JfTUFTSykgfCAoY3BzciAmIEFQU1JfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcwordDMyX2VtdWxhdGVfcmQ4cGMxNl9ub2ZsYWdzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCXVuc2lnbmVkIGxvbmcgcGMgPSB0aHVtYl9wcm9iZV9wYyhwKTsKKwlpbnQgcmQgPSAoaW5zbiA+PiA4KSAmIDB4ZjsKKworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmR2IGFzbSgicjEiKSA9IHJlZ3MtPnVyZWdzW3JkXTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJudiBhc20oInIyIikgPSBwYyAmIH4zOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiYmx4ICAgICVbZm5dIgorCQk6ICI9ciIgKHJkdikKKwkJOiAiMCIgKHJkdiksICJyIiAocm52KSwgW2ZuXSAiciIgKHAtPmFpbnNuLmluc25fZm4pCisJCTogImxyIiwgIm1lbW9yeSIsICJjYyIKKwkpOworCisJcmVncy0+dXJlZ3NbcmRdID0gcmR2OworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK3QzMl9lbXVsYXRlX3JkOHJuMTZfbm9mbGFncyhzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwlpbnQgcmQgPSAoaW5zbiA+PiA4KSAmIDB4ZjsKKwlpbnQgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CisKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJkdiBhc20oInIxIikgPSByZWdzLT51cmVnc1tyZF07CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBybnYgYXNtKCJyMiIpID0gcmVncy0+dXJlZ3Nbcm5dOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiYmx4ICAgICVbZm5dIgorCQk6ICI9ciIgKHJkdikKKwkJOiAiMCIgKHJkdiksICJyIiAocm52KSwgW2ZuXSAiciIgKHAtPmFpbnNuLmluc25fZm4pCisJCTogImxyIiwgIm1lbW9yeSIsICJjYyIKKwkpOworCisJcmVncy0+dXJlZ3NbcmRdID0gcmR2OworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK3QzMl9lbXVsYXRlX3JkbG8xMnJkaGk4cm4xNnJtMF9ub2ZsYWdzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCWludCByZGxvID0gKGluc24gPj4gMTIpICYgMHhmOworCWludCByZGhpID0gKGluc24gPj4gOCkgJiAweGY7CisJaW50IHJuID0gKGluc24gPj4gMTYpICYgMHhmOworCWludCBybSA9IGluc24gJiAweGY7CisKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJkbG92IGFzbSgicjAiKSA9IHJlZ3MtPnVyZWdzW3JkbG9dOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmRoaXYgYXNtKCJyMSIpID0gcmVncy0+dXJlZ3NbcmRoaV07CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBybnYgYXNtKCJyMiIpID0gcmVncy0+dXJlZ3Nbcm5dOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcm12IGFzbSgicjMiKSA9IHJlZ3MtPnVyZWdzW3JtXTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJImJseCAgICAlW2ZuXSIKKwkJOiAiPXIiIChyZGxvdiksICI9ciIgKHJkaGl2KQorCQk6ICIwIiAocmRsb3YpLCAiMSIgKHJkaGl2KSwgInIiIChybnYpLCAiciIgKHJtdiksCisJCSAgW2ZuXSAiciIgKHAtPmFpbnNuLmluc25fZm4pCisJCTogImxyIiwgIm1lbW9yeSIsICJjYyIKKwkpOworCisJcmVncy0+dXJlZ3NbcmRsb10gPSByZGxvdjsKKwlyZWdzLT51cmVnc1tyZGhpXSA9IHJkaGl2OworfQorCisvKiBUaGVzZSBlbXVsYXRpb24gZW5jb2RpbmdzIGFyZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudC4uLiAqLworI2RlZmluZSB0MzJfZW11bGF0ZV9yZDhybjE2cm0wcmExMl9ub2ZsYWdzIFwKKwkJdDMyX2VtdWxhdGVfcmRsbzEycmRoaThybjE2cm0wX25vZmxhZ3MKKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIHQzMl90YWJsZV8xMTEwXzEwMHhfeDB4eFtdID0geworCS8qIExvYWQvc3RvcmUgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zICovCisKKwkvKiBSbiBpcyBQQwkJMTExMCAxMDB4IHgweHggMTExMSB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmZTRmMDAwMCwgMHhlODBmMDAwMCksCisKKwkvKiBTUlMJCQkxMTEwIDEwMDAgMDB4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBSRkUJCQkxMTEwIDEwMDAgMDB4MSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZmYzAwMDAwLCAweGU4MDAwMDAwKSwKKwkvKiBTUlMJCQkxMTEwIDEwMDEgMTB4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBSRkUJCQkxMTEwIDEwMDEgMTB4MSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZmYzAwMDAwLCAweGU5ODAwMDAwKSwKKworCS8qIFNUTSBSbiwgey4uLnBjfQkxMTEwIDEwMHggeDB4MCB4eHh4IDF4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZlNTA4MDAwLCAweGU4MDA4MDAwKSwKKwkvKiBMRE0gUm4sIHsuLi5scixwY30JMTExMCAxMDB4IHgweDEgeHh4eCAxMXh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmZTUwYzAwMCwgMHhlODEwYzAwMCksCisJLyogTERNL1NUTSBSbiwgey4uLnNwfQkxMTEwIDEwMHggeDB4eCB4eHh4IHh4MXggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZlNDAyMDAwLCAweGU4MDAyMDAwKSwKKworCS8qIFNUTUlBCQkxMTEwIDEwMDAgMTB4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRE1JQQkJMTExMCAxMDAwIDEweDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogU1RNREIJCTExMTAgMTAwMSAwMHgwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIExETURCCQkxMTEwIDEwMDEgMDB4MSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfQ1VTVE9NCSgweGZlNDAwMDAwLCAweGU4MDAwMDAwLCB0MzJfZGVjb2RlX2xkbXN0bSksCisKKwlERUNPREVfRU5ECit9OworCitzdGF0aWMgY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gdDMyX3RhYmxlXzExMTBfMTAweF94MXh4W10gPSB7CisJLyogTG9hZC9zdG9yZSBkdWFsLCBsb2FkL3N0b3JlIGV4Y2x1c2l2ZSwgdGFibGUgYnJhbmNoICovCisKKwkvKiBTVFJEIChpbW1lZGlhdGUpCTExMTAgMTAwMCB4MTEwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIExEUkQgKGltbWVkaWF0ZSkJMTExMCAxMDAwIHgxMTEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX09SCSgweGZmNjAwMDAwLCAweGU4NjAwMDAwKSwKKwkvKiBTVFJEIChpbW1lZGlhdGUpCTExMTAgMTAwMSB4MXgwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIExEUkQgKGltbWVkaWF0ZSkJMTExMCAxMDAxIHgxeDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweGZmNDAwMDAwLCAweGU5NDAwMDAwLCB0MzJfZW11bGF0ZV9sZHJkc3RyZCwKKwkJCQkJCSBSRUdTKE5PUENXQiwgTk9TUFBDLCBOT1NQUEMsIDAsIDApKSwKKworCS8qIFRCQgkJCTExMTAgMTAwMCAxMTAxIHh4eHggeHh4eCB4eHh4IDAwMDAgeHh4eCAqLworCS8qIFRCSAkJCTExMTAgMTAwMCAxMTAxIHh4eHggeHh4eCB4eHh4IDAwMDEgeHh4eCAqLworCURFQ09ERV9TSU1VTEFURVgoMHhmZmYwMDBlMCwgMHhlOGQwMDAwMCwgdDMyX3NpbXVsYXRlX3RhYmxlX2JyYW5jaCwKKwkJCQkJCSBSRUdTKE5PU1AsIDAsIDAsIDAsIE5PU1BQQykpLAorCisJLyogU1RSRVgJCTExMTAgMTAwMCAwMTAwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIExEUkVYCQkxMTEwIDEwMDAgMDEwMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBTVFJFWEIJCTExMTAgMTAwMCAxMTAwIHh4eHggeHh4eCB4eHh4IDAxMDAgeHh4eCAqLworCS8qIFNUUkVYSAkJMTExMCAxMDAwIDExMDAgeHh4eCB4eHh4IHh4eHggMDEwMSB4eHh4ICovCisJLyogU1RSRVhECQkxMTEwIDEwMDAgMTEwMCB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggKi8KKwkvKiBMRFJFWEIJCTExMTAgMTAwMCAxMTAxIHh4eHggeHh4eCB4eHh4IDAxMDAgeHh4eCAqLworCS8qIExEUkVYSAkJMTExMCAxMDAwIDExMDEgeHh4eCB4eHh4IHh4eHggMDEwMSB4eHh4ICovCisJLyogTERSRVhECQkxMTEwIDEwMDAgMTEwMSB4eHh4IHh4eHggeHh4eCAwMTExIHh4eHggKi8KKwkvKiBBbmQgdW5hbGxvY2F0ZWQgaW5zdHJ1Y3Rpb25zLi4uCQkJCSovCisJREVDT0RFX0VORAorfTsKKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIHQzMl90YWJsZV8xMTEwXzEwMXhbXSA9IHsKKwkvKiBEYXRhLXByb2Nlc3NpbmcgKHNoaWZ0ZWQgcmVnaXN0ZXIpCQkJCSovCisKKwkvKiBUU1QJCQkxMTEwIDEwMTAgMDAwMSB4eHh4IHh4eHggMTExMSB4eHh4IHh4eHggKi8KKwkvKiBURVEJCQkxMTEwIDEwMTAgMTAwMSB4eHh4IHh4eHggMTExMSB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmY3MDBmMDAsIDB4ZWExMDBmMDAsIHQzMl9lbXVsYXRlX3JkOHJuMTZybTBfcndmbGFncywKKwkJCQkJCSBSRUdTKE5PU1BQQywgMCwgMCwgMCwgTk9TUFBDKSksCisKKwkvKiBDTU4JCQkxMTEwIDEwMTEgMDAwMSB4eHh4IHh4eHggMTExMSB4eHh4IHh4eHggKi8KKwlERUNPREVfT1IJKDB4ZmZmMDBmMDAsIDB4ZWIxMDBmMDApLAorCS8qIENNUAkJCTExMTAgMTAxMSAxMDExIHh4eHggeHh4eCAxMTExIHh4eHggeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHhmZmYwMGYwMCwgMHhlYmIwMGYwMCwgdDMyX2VtdWxhdGVfcmQ4cm4xNnJtMF9yd2ZsYWdzLAorCQkJCQkJIFJFR1MoTk9QQywgMCwgMCwgMCwgTk9TUFBDKSksCisKKwkvKiBNT1YJCQkxMTEwIDEwMTAgMDEweCAxMTExIHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBNVk4JCQkxMTEwIDEwMTAgMDExeCAxMTExIHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmZjZjAwMDAsIDB4ZWE0ZjAwMDAsIHQzMl9lbXVsYXRlX3JkOHJuMTZybTBfcndmbGFncywKKwkJCQkJCSBSRUdTKDAsIDAsIE5PU1BQQywgMCwgTk9TUFBDKSksCisKKwkvKiA/Pz8JCQkxMTEwIDEwMTAgMTAxeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiA/Pz8JCQkxMTEwIDEwMTAgMTExeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZmYTAwMDAwLCAweGVhYTAwMDAwKSwKKwkvKiA/Pz8JCQkxMTEwIDEwMTEgMDAxeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZmZTAwMDAwLCAweGViMjAwMDAwKSwKKwkvKiA/Pz8JCQkxMTEwIDEwMTEgMTAweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZmZTAwMDAwLCAweGViODAwMDAwKSwKKwkvKiA/Pz8JCQkxMTEwIDEwMTEgMTExeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZmZTAwMDAwLCAweGViZTAwMDAwKSwKKworCS8qIEFERC9TVUIgU1AsIFNQLCBSbSwgTFNMICMwLi4zCQkJCSovCisJLyoJCQkxMTEwIDEwMTEgeDB4eCAxMTAxIHgwMDAgMTEwMSB4eDAwIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmY0ZjdmMzAsIDB4ZWIwZDBkMDAsIHQzMl9lbXVsYXRlX3JkOHJuMTZybTBfcndmbGFncywKKwkJCQkJCSBSRUdTKFNQLCAwLCBTUCwgMCwgTk9TUFBDKSksCisKKwkvKiBBREQvU1VCIFNQLCBTUCwgUm0sIHNoaWZ0CQkJCQkqLworCS8qCQkJMTExMCAxMDExIHgweHggMTEwMSB4eHh4IDExMDEgeHh4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmZjRmMGYwMCwgMHhlYjBkMGQwMCksCisKKwkvKiBBREQvU1VCIFJkLCBTUCwgUm0sIHNoaWZ0CQkJCQkqLworCS8qCQkJMTExMCAxMDExIHgweHggMTEwMSB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweGZmNGYwMDAwLCAweGViMGQwMDAwLCB0MzJfZW11bGF0ZV9yZDhybjE2cm0wX3J3ZmxhZ3MsCisJCQkJCQkgUkVHUyhTUCwgMCwgTk9QQywgMCwgTk9TUFBDKSksCisKKwkvKiBBTkQJCQkxMTEwIDEwMTAgMDAweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBCSUMJCQkxMTEwIDEwMTAgMDAxeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBPUlIJCQkxMTEwIDEwMTAgMDEweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBPUk4JCQkxMTEwIDEwMTAgMDExeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBFT1IJCQkxMTEwIDEwMTAgMTAweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBQS0gJCQkxMTEwIDEwMTAgMTEweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBBREQJCQkxMTEwIDEwMTEgMDAweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBBREMJCQkxMTEwIDEwMTEgMDEweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBTQkMJCQkxMTEwIDEwMTEgMDExeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBTVUIJCQkxMTEwIDEwMTEgMTAxeCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBSU0IJCQkxMTEwIDEwMTEgMTEweCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmUwMDAwMDAsIDB4ZWEwMDAwMDAsIHQzMl9lbXVsYXRlX3JkOHJuMTZybTBfcndmbGFncywKKwkJCQkJCSBSRUdTKE5PU1BQQywgMCwgTk9TUFBDLCAwLCBOT1NQUEMpKSwKKworCURFQ09ERV9FTkQKK307CisKK3N0YXRpYyBjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSB0MzJfdGFibGVfMTExMV8weDB4X19fMFtdID0geworCS8qIERhdGEtcHJvY2Vzc2luZyAobW9kaWZpZWQgaW1tZWRpYXRlKQkJCQkqLworCisJLyogVFNUCQkJMTExMSAweDAwIDAwMDEgeHh4eCAweHh4IDExMTEgeHh4eCB4eHh4ICovCisJLyogVEVRCQkJMTExMSAweDAwIDEwMDEgeHh4eCAweHh4IDExMTEgeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweGZiNzA4ZjAwLCAweGYwMTAwZjAwLCB0MzJfZW11bGF0ZV9yZDhybjE2cm0wX3J3ZmxhZ3MsCisJCQkJCQkgUkVHUyhOT1NQUEMsIDAsIDAsIDAsIDApKSwKKworCS8qIENNTgkJCTExMTEgMHgwMSAwMDAxIHh4eHggMHh4eCAxMTExIHh4eHggeHh4eCAqLworCURFQ09ERV9PUgkoMHhmYmYwOGYwMCwgMHhmMTEwMGYwMCksCisJLyogQ01QCQkJMTExMSAweDAxIDEwMTEgeHh4eCAweHh4IDExMTEgeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweGZiZjA4ZjAwLCAweGYxYjAwZjAwLCB0MzJfZW11bGF0ZV9yZDhybjE2cm0wX3J3ZmxhZ3MsCisJCQkJCQkgUkVHUyhOT1BDLCAwLCAwLCAwLCAwKSksCisKKwkvKiBNT1YJCQkxMTExIDB4MDAgMDEweCAxMTExIDB4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBNVk4JCQkxMTExIDB4MDAgMDExeCAxMTExIDB4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmJjZjgwMDAsIDB4ZjA0ZjAwMDAsIHQzMl9lbXVsYXRlX3JkOHJuMTZybTBfcndmbGFncywKKwkJCQkJCSBSRUdTKDAsIDAsIE5PU1BQQywgMCwgMCkpLAorCisJLyogPz8/CQkJMTExMSAweDAwIDEwMXggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmYmUwODAwMCwgMHhmMGEwMDAwMCksCisJLyogPz8/CQkJMTExMSAweDAwIDExMHggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogPz8/CQkJMTExMSAweDAwIDExMXggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmYmMwODAwMCwgMHhmMGMwMDAwMCksCisJLyogPz8/CQkJMTExMSAweDAxIDAwMXggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmYmUwODAwMCwgMHhmMTIwMDAwMCksCisJLyogPz8/CQkJMTExMSAweDAxIDEwMHggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmYmUwODAwMCwgMHhmMTgwMDAwMCksCisJLyogPz8/CQkJMTExMSAweDAxIDExMXggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmYmUwODAwMCwgMHhmMWUwMDAwMCksCisKKwkvKiBBREQgUmQsIFNQLCAjaW1tCTExMTEgMHgwMSAwMDB4IDExMDEgMHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIFNVQiBSZCwgU1AsICNpbW0JMTExMSAweDAxIDEwMXggMTEwMSAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweGZiNGY4MDAwLCAweGYxMGQwMDAwLCB0MzJfZW11bGF0ZV9yZDhybjE2cm0wX3J3ZmxhZ3MsCisJCQkJCQkgUkVHUyhTUCwgMCwgTk9QQywgMCwgMCkpLAorCisJLyogQU5ECQkJMTExMSAweDAwIDAwMHggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogQklDCQkJMTExMSAweDAwIDAwMXggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogT1JSCQkJMTExMSAweDAwIDAxMHggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogT1JOCQkJMTExMSAweDAwIDAxMXggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogRU9SCQkJMTExMSAweDAwIDEwMHggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogQURECQkJMTExMSAweDAxIDAwMHggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogQURDCQkJMTExMSAweDAxIDAxMHggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogU0JDCQkJMTExMSAweDAxIDAxMXggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogU1VCCQkJMTExMSAweDAxIDEwMXggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogUlNCCQkJMTExMSAweDAxIDExMHggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweGZhMDA4MDAwLCAweGYwMDAwMDAwLCB0MzJfZW11bGF0ZV9yZDhybjE2cm0wX3J3ZmxhZ3MsCisJCQkJCQkgUkVHUyhOT1NQUEMsIDAsIE5PU1BQQywgMCwgMCkpLAorCisJREVDT0RFX0VORAorfTsKKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIHQzMl90YWJsZV8xMTExXzB4MXhfX18wW10gPSB7CisJLyogRGF0YS1wcm9jZXNzaW5nIChwbGFpbiBiaW5hcnkgaW1tZWRpYXRlKQkJCSovCisKKwkvKiBBRERXIFJkLCBQQywgI2ltbQkxMTExIDB4MTAgMDAwMCAxMTExIDB4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfT1IJKDB4ZmJmZjgwMDAsIDB4ZjIwZjAwMDApLAorCS8qIFNVQlcJUmQsIFBDLCAjaW1tCTExMTEgMHgxMCAxMDEwIDExMTEgMHh4eCB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHhmYmZmODAwMCwgMHhmMmFmMDAwMCwgdDMyX2VtdWxhdGVfcmQ4cGMxNl9ub2ZsYWdzLAorCQkJCQkJIFJFR1MoUEMsIDAsIE5PU1BQQywgMCwgMCkpLAorCisJLyogQUREVyBTUCwgU1AsICNpbW0JMTExMSAweDEwIDAwMDAgMTEwMSAweHh4IDExMDEgeHh4eCB4eHh4ICovCisJREVDT0RFX09SCSgweGZiZmY4ZjAwLCAweGYyMGQwZDAwKSwKKwkvKiBTVUJXCVNQLCBTUCwgI2ltbQkxMTExIDB4MTAgMTAxMCAxMTAxIDB4eHggMTEwMSB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmJmZjhmMDAsIDB4ZjJhZDBkMDAsIHQzMl9lbXVsYXRlX3JkOHJuMTZfbm9mbGFncywKKwkJCQkJCSBSRUdTKFNQLCAwLCBTUCwgMCwgMCkpLAorCisJLyogQUREVwkJCTExMTEgMHgxMCAwMDAwIHh4eHggMHh4eCB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9PUgkoMHhmYmYwODAwMCwgMHhmMjAwMDAwMCksCisJLyogU1VCVwkJCTExMTEgMHgxMCAxMDEwIHh4eHggMHh4eCB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHhmYmYwODAwMCwgMHhmMmEwMDAwMCwgdDMyX2VtdWxhdGVfcmQ4cm4xNl9ub2ZsYWdzLAorCQkJCQkJIFJFR1MoTk9QQ1gsIDAsIE5PU1BQQywgMCwgMCkpLAorCisJLyogTU9WVwkJCTExMTEgMHgxMCAwMTAwIHh4eHggMHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIE1PVlQJCQkxMTExIDB4MTAgMTEwMCB4eHh4IDB4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmI3MDgwMDAsIDB4ZjI0MDAwMDAsIHQzMl9lbXVsYXRlX3JkOHJuMTZfbm9mbGFncywKKwkJCQkJCSBSRUdTKDAsIDAsIE5PU1BQQywgMCwgMCkpLAorCisJLyogU1NBVDE2CQkxMTExIDB4MTEgMDAxMCB4eHh4IDAwMDAgeHh4eCAwMHh4IHh4eHggKi8KKwkvKiBTU0FUCQkJMTExMSAweDExIDAweDAgeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogVVNBVDE2CQkxMTExIDB4MTEgMTAxMCB4eHh4IDAwMDAgeHh4eCAwMHh4IHh4eHggKi8KKwkvKiBVU0FUCQkJMTExMSAweDExIDEweDAgeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweGZiNTA4MDAwLCAweGYzMDAwMDAwLCB0MzJfZW11bGF0ZV9yZDhybjE2cm0wX3J3ZmxhZ3MsCisJCQkJCQkgUkVHUyhOT1NQUEMsIDAsIE5PU1BQQywgMCwgMCkpLAorCisJLyogU0ZCWAkJCTExMTEgMHgxMSAwMTAwIHh4eHggMHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIFVGQlgJCQkxMTExIDB4MTEgMTEwMCB4eHh4IDB4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmI3MDgwMDAsIDB4ZjM0MDAwMDAsIHQzMl9lbXVsYXRlX3JkOHJuMTZfbm9mbGFncywKKwkJCQkJCSBSRUdTKE5PU1BQQywgMCwgTk9TUFBDLCAwLCAwKSksCisKKwkvKiBCRkMJCQkxMTExIDB4MTEgMDExMCAxMTExIDB4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmJmZjgwMDAsIDB4ZjM2ZjAwMDAsIHQzMl9lbXVsYXRlX3JkOHJuMTZfbm9mbGFncywKKwkJCQkJCSBSRUdTKDAsIDAsIE5PU1BQQywgMCwgMCkpLAorCisJLyogQkZJCQkJMTExMSAweDExIDAxMTAgeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweGZiZjA4MDAwLCAweGYzNjAwMDAwLCB0MzJfZW11bGF0ZV9yZDhybjE2X25vZmxhZ3MsCisJCQkJCQkgUkVHUyhOT1NQUENYLCAwLCBOT1NQUEMsIDAsIDApKSwKKworCURFQ09ERV9FTkQKK307CisKK3N0YXRpYyBjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSB0MzJfdGFibGVfMTExMV8weHh4X19fMVtdID0geworCS8qIEJyYW5jaGVzIGFuZCBtaXNjZWxsYW5lb3VzIGNvbnRyb2wJCQkJKi8KKworCS8qIFlJRUxECQkxMTExIDAwMTEgMTAxMCB4eHh4IDEweDAgeDAwMCAwMDAwIDAwMDEgKi8KKwlERUNPREVfT1IJKDB4ZmZmMGQ3ZmYsIDB4ZjNhMDgwMDEpLAorCS8qIFNFVgkJCTExMTEgMDAxMSAxMDEwIHh4eHggMTB4MCB4MDAwIDAwMDAgMDEwMCAqLworCURFQ09ERV9FTVVMQVRFCSgweGZmZjBkN2ZmLCAweGYzYTA4MDA0LCBrcHJvYmVfZW11bGF0ZV9ub25lKSwKKwkvKiBOT1AJCQkxMTExIDAwMTEgMTAxMCB4eHh4IDEweDAgeDAwMCAwMDAwIDAwMDAgKi8KKwkvKiBXRkUJCQkxMTExIDAwMTEgMTAxMCB4eHh4IDEweDAgeDAwMCAwMDAwIDAwMTAgKi8KKwkvKiBXRkkJCQkxMTExIDAwMTEgMTAxMCB4eHh4IDEweDAgeDAwMCAwMDAwIDAwMTEgKi8KKwlERUNPREVfU0lNVUxBVEUJKDB4ZmZmMGQ3ZmMsIDB4ZjNhMDgwMDAsIGtwcm9iZV9zaW11bGF0ZV9ub3ApLAorCisJLyogTVJTIFJkLCBDUFNSCQkxMTExIDAwMTEgMTExMCB4eHh4IDEweDAgeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfU0lNVUxBVEVYKDB4ZmZmMGQwMDAsIDB4ZjNlMDgwMDAsIHQzMl9zaW11bGF0ZV9tcnMsCisJCQkJCQkgUkVHUygwLCAwLCBOT1NQUEMsIDAsIDApKSwKKworCS8qCisJICogVW5zdXBwb3J0ZWQgaW5zdHJ1Y3Rpb25zCisJICoJCQkxMTExIDB4MTEgMXh4eCB4eHh4IDEweDAgeHh4eCB4eHh4IHh4eHgKKwkgKgorCSAqIE1TUgkJCTExMTEgMDAxMSAxMDB4IHh4eHggMTB4MCB4eHh4IHh4eHggeHh4eAorCSAqIERCRyBoaW50CQkxMTExIDAwMTEgMTAxMCB4eHh4IDEweDAgeDAwMCAxMTExIHh4eHgKKwkgKiBVbmFsbG9jYXRlZCBoaW50cwkxMTExIDAwMTEgMTAxMCB4eHh4IDEweDAgeDAwMCB4eHh4IHh4eHgKKwkgKiBDUFMJCQkxMTExIDAwMTEgMTAxMCB4eHh4IDEweDAgeHh4eCB4eHh4IHh4eHgKKwkgKiBDTFJFWC9EU0IvRE1CL0lTQgkxMTExIDAwMTEgMTAxMSB4eHh4IDEweDAgeHh4eCB4eHh4IHh4eHgKKwkgKiBCWEoJCQkxMTExIDAwMTEgMTEwMCB4eHh4IDEweDAgeHh4eCB4eHh4IHh4eHgKKwkgKiBTVUJTIFBDLExSLCM8aW1tOD4JMTExMSAwMDExIDExMDEgeHh4eCAxMHgwIHh4eHggeHh4eCB4eHh4CisJICogTVJTIFJkLCBTUFNSCQkxMTExIDAwMTEgMTExMSB4eHh4IDEweDAgeHh4eCB4eHh4IHh4eHgKKwkgKiBTTUMJCQkxMTExIDAxMTEgMTExMSB4eHh4IDEwMDAgeHh4eCB4eHh4IHh4eHgKKwkgKiBVTkRFRklORUQJCTExMTEgMDExMSAxMTExIHh4eHggMTAxMCB4eHh4IHh4eHggeHh4eAorCSAqID8/PwkJCTExMTEgMDExMSAxeHh4IHh4eHggMTAxMCB4eHh4IHh4eHggeHh4eAorCSAqLworCURFQ09ERV9SRUpFQ1QJKDB4ZmI4MGQwMDAsIDB4ZjM4MDgwMDApLAorCisJLyogQmNjCQkJMTExMSAweHh4IHh4eHggeHh4eCAxMHgwIHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0NVU1RPTQkoMHhmODAwZDAwMCwgMHhmMDAwODAwMCwgdDMyX2RlY29kZV9jb25kX2JyYW5jaCksCisKKwkvKiBCTFgJCQkxMTExIDB4eHggeHh4eCB4eHh4IDExeDAgeHh4eCB4eHh4IHh4eDAgKi8KKwlERUNPREVfT1IJKDB4ZjgwMGQwMDEsIDB4ZjAwMGMwMDApLAorCS8qIEIJCQkxMTExIDB4eHggeHh4eCB4eHh4IDEweDEgeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBCTAkJCTExMTEgMHh4eCB4eHh4IHh4eHggMTF4MSB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9TSU1VTEFURQkoMHhmODAwOTAwMCwgMHhmMDAwOTAwMCwgdDMyX3NpbXVsYXRlX2JyYW5jaCksCisKKwlERUNPREVfRU5ECit9OworCitzdGF0aWMgY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gdDMyX3RhYmxlXzExMTFfMTAweF94MHgxX18xMTExW10gPSB7CisJLyogTWVtb3J5IGhpbnRzCQkJCQkJCSovCisKKwkvKiBQTEQgKGxpdGVyYWwpCTExMTEgMTAwMCB4MDAxIDExMTEgMTExMSB4eHh4IHh4eHggeHh4eCAqLworCS8qIFBMSSAobGl0ZXJhbCkJMTExMSAxMDAxIHgwMDEgMTExMSAxMTExIHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX1NJTVVMQVRFCSgweGZlN2ZmMDAwLCAweGY4MWZmMDAwLCBrcHJvYmVfc2ltdWxhdGVfbm9wKSwKKworCS8qIFBMRHtXfSAoaW1tZWRpYXRlKQkxMTExIDEwMDAgMTB4MSB4eHh4IDExMTEgeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfT1IJKDB4ZmZkMGYwMDAsIDB4Zjg5MGYwMDApLAorCS8qIFBMRHtXfSAoaW1tZWRpYXRlKQkxMTExIDEwMDAgMDB4MSB4eHh4IDExMTEgMTEwMCB4eHh4IHh4eHggKi8KKwlERUNPREVfT1IJKDB4ZmZkMGZmMDAsIDB4ZjgxMGZjMDApLAorCS8qIFBMSSAoaW1tZWRpYXRlKQkxMTExIDEwMDEgMTAwMSB4eHh4IDExMTEgeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfT1IJKDB4ZmZmMGYwMDAsIDB4Zjk5MGYwMDApLAorCS8qIFBMSSAoaW1tZWRpYXRlKQkxMTExIDEwMDEgMDAwMSB4eHh4IDExMTEgMTEwMCB4eHh4IHh4eHggKi8KKwlERUNPREVfU0lNVUxBVEVYKDB4ZmZmMGZmMDAsIDB4ZjkxMGZjMDAsIGtwcm9iZV9zaW11bGF0ZV9ub3AsCisJCQkJCQkgUkVHUyhOT1BDWCwgMCwgMCwgMCwgMCkpLAorCisJLyogUExEe1d9IChyZWdpc3RlcikJMTExMSAxMDAwIDAweDEgeHh4eCAxMTExIDAwMDAgMDB4eCB4eHh4ICovCisJREVDT0RFX09SCSgweGZmZDBmZmMwLCAweGY4MTBmMDAwKSwKKwkvKiBQTEkgKHJlZ2lzdGVyKQkxMTExIDEwMDEgMDAwMSB4eHh4IDExMTEgMDAwMCAwMHh4IHh4eHggKi8KKwlERUNPREVfU0lNVUxBVEVYKDB4ZmZmMGZmYzAsIDB4ZjkxMGYwMDAsIGtwcm9iZV9zaW11bGF0ZV9ub3AsCisJCQkJCQkgUkVHUyhOT1BDWCwgMCwgMCwgMCwgTk9TUFBDKSksCisKKwkvKiBPdGhlciB1bmFsbG9jYXRlZCBpbnN0cnVjdGlvbnMuLi4JCQkJKi8KKwlERUNPREVfRU5ECit9OworCitzdGF0aWMgY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gdDMyX3RhYmxlXzExMTFfMTAweFtdID0geworCS8qIFN0b3JlL0xvYWQgc2luZ2xlIGRhdGEgaXRlbQkJCQkJKi8KKworCS8qID8/PwkJCTExMTEgMTAweCB4MTF4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9SRUpFQ1QJKDB4ZmU2MDAwMDAsIDB4Zjg2MDAwMDApLAorCisJLyogPz8/CQkJMTExMSAxMDAxIDAxMDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmZmYwMDAwMCwgMHhmOTUwMDAwMCksCisKKwkvKiA/Pz8JCQkxMTExIDEwMHggMHh4eCB4eHh4IHh4eHggMTB4MCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZlODAwZDAwLCAweGY4MDAwODAwKSwKKworCS8qIFNUUkJUCQkxMTExIDEwMDAgMDAwMCB4eHh4IHh4eHggMTExMCB4eHh4IHh4eHggKi8KKwkvKiBTVFJIVAkJMTExMSAxMDAwIDAwMTAgeHh4eCB4eHh4IDExMTAgeHh4eCB4eHh4ICovCisJLyogU1RSVAkJCTExMTEgMTAwMCAwMTAwIHh4eHggeHh4eCAxMTEwIHh4eHggeHh4eCAqLworCS8qIExEUkJUCQkxMTExIDEwMDAgMDAwMSB4eHh4IHh4eHggMTExMCB4eHh4IHh4eHggKi8KKwkvKiBMRFJTQlQJCTExMTEgMTAwMSAwMDAxIHh4eHggeHh4eCAxMTEwIHh4eHggeHh4eCAqLworCS8qIExEUkhUCQkxMTExIDEwMDAgMDAxMSB4eHh4IHh4eHggMTExMCB4eHh4IHh4eHggKi8KKwkvKiBMRFJTSFQJCTExMTEgMTAwMSAwMDExIHh4eHggeHh4eCAxMTEwIHh4eHggeHh4eCAqLworCS8qIExEUlQJCQkxMTExIDEwMDAgMDEwMSB4eHh4IHh4eHggMTExMCB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZlODAwZjAwLCAweGY4MDAwZTAwKSwKKworCS8qIFNUUnssQixIfSBSbixbUEMuLi5dCTExMTEgMTAwMCB4eHgwIDExMTEgeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9SRUpFQ1QJKDB4ZmYxZjAwMDAsIDB4ZjgwZjAwMDApLAorCisJLyogU1RSeyxCLEh9IFBDLFtSbi4uLl0JMTExMSAxMDAwIHh4eDAgeHh4eCAxMTExIHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmZjEwZjAwMCwgMHhmODAwZjAwMCksCisKKwkvKiBMRFIgKGxpdGVyYWwpCTExMTEgMTAwMCB4MTAxIDExMTEgeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9TSU1VTEFURVgoMHhmZjdmMDAwMCwgMHhmODVmMDAwMCwgdDMyX3NpbXVsYXRlX2xkcl9saXRlcmFsLAorCQkJCQkJIFJFR1MoUEMsIEFOWSwgMCwgMCwgMCkpLAorCisJLyogU1RSIChpbW1lZGlhdGUpCTExMTEgMTAwMCAwMTAwIHh4eHggeHh4eCAxeHh4IHh4eHggeHh4eCAqLworCS8qIExEUiAoaW1tZWRpYXRlKQkxMTExIDEwMDAgMDEwMSB4eHh4IHh4eHggMXh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfT1IJKDB4ZmZlMDA4MDAsIDB4Zjg0MDA4MDApLAorCS8qIFNUUiAoaW1tZWRpYXRlKQkxMTExIDEwMDAgMTEwMCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRFIgKGltbWVkaWF0ZSkJMTExMSAxMDAwIDExMDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweGZmZTAwMDAwLCAweGY4YzAwMDAwLCB0MzJfZW11bGF0ZV9sZHJzdHIsCisJCQkJCQkgUkVHUyhOT1BDWCwgQU5ZLCAwLCAwLCAwKSksCisKKwkvKiBTVFIgKHJlZ2lzdGVyKQkxMTExIDEwMDAgMDEwMCB4eHh4IHh4eHggMDAwMCAwMHh4IHh4eHggKi8KKwkvKiBMRFIgKHJlZ2lzdGVyKQkxMTExIDEwMDAgMDEwMSB4eHh4IHh4eHggMDAwMCAwMHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmZlMDBmYzAsIDB4Zjg0MDAwMDAsIHQzMl9lbXVsYXRlX2xkcnN0ciwKKwkJCQkJCSBSRUdTKE5PUENYLCBBTlksIDAsIDAsIE5PU1BQQykpLAorCisJLyogTERSQiAobGl0ZXJhbCkJMTExMSAxMDAwIHgwMDEgMTExMSB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogTERSU0IgKGxpdGVyYWwpCTExMTEgMTAwMSB4MDAxIDExMTEgeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIExEUkggKGxpdGVyYWwpCTExMTEgMTAwMCB4MDExIDExMTEgeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIExEUlNIIChsaXRlcmFsKQkxMTExIDEwMDEgeDAxMSAxMTExIHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmU1ZjAwMDAsIDB4ZjgxZjAwMDAsIHQzMl9zaW11bGF0ZV9sZHJfbGl0ZXJhbCwKKwkJCQkJCSBSRUdTKFBDLCBOT1NQUENYLCAwLCAwLCAwKSksCisKKwkvKiBTVFJCIChpbW1lZGlhdGUpCTExMTEgMTAwMCAwMDAwIHh4eHggeHh4eCAxeHh4IHh4eHggeHh4eCAqLworCS8qIFNUUkggKGltbWVkaWF0ZSkJMTExMSAxMDAwIDAwMTAgeHh4eCB4eHh4IDF4eHggeHh4eCB4eHh4ICovCisJLyogTERSQiAoaW1tZWRpYXRlKQkxMTExIDEwMDAgMDAwMSB4eHh4IHh4eHggMXh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRFJTQiAoaW1tZWRpYXRlKQkxMTExIDEwMDEgMDAwMSB4eHh4IHh4eHggMXh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRFJIIChpbW1lZGlhdGUpCTExMTEgMTAwMCAwMDExIHh4eHggeHh4eCAxeHh4IHh4eHggeHh4eCAqLworCS8qIExEUlNIIChpbW1lZGlhdGUpCTExMTEgMTAwMSAwMDExIHh4eHggeHh4eCAxeHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9PUgkoMHhmZWMwMDgwMCwgMHhmODAwMDgwMCksCisJLyogU1RSQiAoaW1tZWRpYXRlKQkxMTExIDEwMDAgMTAwMCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBTVFJIIChpbW1lZGlhdGUpCTExMTEgMTAwMCAxMDEwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCAqLworCS8qIExEUkIgKGltbWVkaWF0ZSkJMTExMSAxMDAwIDEwMDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogTERSU0IgKGltbWVkaWF0ZSkJMTExMSAxMDAxIDEwMDEgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4ICovCisJLyogTERSSCAoaW1tZWRpYXRlKQkxMTExIDEwMDAgMTAxMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRFJTSCAoaW1tZWRpYXRlKQkxMTExIDEwMDEgMTAxMSB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmVjMDAwMDAsIDB4Zjg4MDAwMDAsIHQzMl9lbXVsYXRlX2xkcnN0ciwKKwkJCQkJCSBSRUdTKE5PUENYLCBOT1NQUENYLCAwLCAwLCAwKSksCisKKwkvKiBTVFJCIChyZWdpc3RlcikJMTExMSAxMDAwIDAwMDAgeHh4eCB4eHh4IDAwMDAgMDB4eCB4eHh4ICovCisJLyogU1RSSCAocmVnaXN0ZXIpCTExMTEgMTAwMCAwMDEwIHh4eHggeHh4eCAwMDAwIDAweHggeHh4eCAqLworCS8qIExEUkIgKHJlZ2lzdGVyKQkxMTExIDEwMDAgMDAwMSB4eHh4IHh4eHggMDAwMCAwMHh4IHh4eHggKi8KKwkvKiBMRFJTQiAocmVnaXN0ZXIpCTExMTEgMTAwMSAwMDAxIHh4eHggeHh4eCAwMDAwIDAweHggeHh4eCAqLworCS8qIExEUkggKHJlZ2lzdGVyKQkxMTExIDEwMDAgMDAxMSB4eHh4IHh4eHggMDAwMCAwMHh4IHh4eHggKi8KKwkvKiBMRFJTSCAocmVnaXN0ZXIpCTExMTEgMTAwMSAwMDExIHh4eHggeHh4eCAwMDAwIDAweHggeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHhmZTgwMGZjMCwgMHhmODAwMDAwMCwgdDMyX2VtdWxhdGVfbGRyc3RyLAorCQkJCQkJIFJFR1MoTk9QQ1gsIE5PU1BQQ1gsIDAsIDAsIE5PU1BQQykpLAorCisJLyogT3RoZXIgdW5hbGxvY2F0ZWQgaW5zdHJ1Y3Rpb25zLi4uCQkJCSovCisJREVDT0RFX0VORAorfTsKKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIHQzMl90YWJsZV8xMTExXzEwMTBfX18xMTExW10gPSB7CisJLyogRGF0YS1wcm9jZXNzaW5nIChyZWdpc3RlcikJCQkJCSovCisKKwkvKiA/Pz8JCQkxMTExIDEwMTAgMDExeCB4eHh4IDExMTEgeHh4eCAxeHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZmZTBmMDgwLCAweGZhNjBmMDgwKSwKKworCS8qIFNYVEgJCQkxMTExIDEwMTAgMDAwMCAxMTExIDExMTEgeHh4eCAxeHh4IHh4eHggKi8KKwkvKiBVWFRICQkJMTExMSAxMDEwIDAwMDEgMTExMSAxMTExIHh4eHggMXh4eCB4eHh4ICovCisJLyogU1hUQjE2CQkxMTExIDEwMTAgMDAxMCAxMTExIDExMTEgeHh4eCAxeHh4IHh4eHggKi8KKwkvKiBVWFRCMTYJCTExMTEgMTAxMCAwMDExIDExMTEgMTExMSB4eHh4IDF4eHggeHh4eCAqLworCS8qIFNYVEIJCQkxMTExIDEwMTAgMDEwMCAxMTExIDExMTEgeHh4eCAxeHh4IHh4eHggKi8KKwkvKiBVWFRCCQkJMTExMSAxMDEwIDAxMDEgMTExMSAxMTExIHh4eHggMXh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweGZmOGZmMDgwLCAweGZhMGZmMDgwLCB0MzJfZW11bGF0ZV9yZDhybjE2cm0wX3J3ZmxhZ3MsCisJCQkJCQkgUkVHUygwLCAwLCBOT1NQUEMsIDAsIE5PU1BQQykpLAorCisKKwkvKiA/Pz8JCQkxMTExIDEwMTAgMXh4eCB4eHh4IDExMTEgeHh4eCAweDExIHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZmODBmMGIwLCAweGZhODBmMDMwKSwKKwkvKiA/Pz8JCQkxMTExIDEwMTAgMXgxMSB4eHh4IDExMTEgeHh4eCAweHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZmYjBmMDgwLCAweGZhYjBmMDAwKSwKKworCS8qIFNBREQxNgkJMTExMSAxMDEwIDEwMDEgeHh4eCAxMTExIHh4eHggMDAwMCB4eHh4ICovCisJLyogU0FTWAkJCTExMTEgMTAxMCAxMDEwIHh4eHggMTExMSB4eHh4IDAwMDAgeHh4eCAqLworCS8qIFNTQVgJCQkxMTExIDEwMTAgMTExMCB4eHh4IDExMTEgeHh4eCAwMDAwIHh4eHggKi8KKwkvKiBTU1VCMTYJCTExMTEgMTAxMCAxMTAxIHh4eHggMTExMSB4eHh4IDAwMDAgeHh4eCAqLworCS8qIFNBREQ4CQkxMTExIDEwMTAgMTAwMCB4eHh4IDExMTEgeHh4eCAwMDAwIHh4eHggKi8KKwkvKiBTU1VCOAkJMTExMSAxMDEwIDExMDAgeHh4eCAxMTExIHh4eHggMDAwMCB4eHh4ICovCisKKwkvKiBRQUREMTYJCTExMTEgMTAxMCAxMDAxIHh4eHggMTExMSB4eHh4IDAwMDEgeHh4eCAqLworCS8qIFFBU1gJCQkxMTExIDEwMTAgMTAxMCB4eHh4IDExMTEgeHh4eCAwMDAxIHh4eHggKi8KKwkvKiBRU0FYCQkJMTExMSAxMDEwIDExMTAgeHh4eCAxMTExIHh4eHggMDAwMSB4eHh4ICovCisJLyogUVNVQjE2CQkxMTExIDEwMTAgMTEwMSB4eHh4IDExMTEgeHh4eCAwMDAxIHh4eHggKi8KKwkvKiBRQUREOAkJMTExMSAxMDEwIDEwMDAgeHh4eCAxMTExIHh4eHggMDAwMSB4eHh4ICovCisJLyogUVNVQjgJCTExMTEgMTAxMCAxMTAwIHh4eHggMTExMSB4eHh4IDAwMDEgeHh4eCAqLworCisJLyogU0hBREQxNgkJMTExMSAxMDEwIDEwMDEgeHh4eCAxMTExIHh4eHggMDAxMCB4eHh4ICovCisJLyogU0hBU1gJCTExMTEgMTAxMCAxMDEwIHh4eHggMTExMSB4eHh4IDAwMTAgeHh4eCAqLworCS8qIFNIU0FYCQkxMTExIDEwMTAgMTExMCB4eHh4IDExMTEgeHh4eCAwMDEwIHh4eHggKi8KKwkvKiBTSFNVQjE2CQkxMTExIDEwMTAgMTEwMSB4eHh4IDExMTEgeHh4eCAwMDEwIHh4eHggKi8KKwkvKiBTSEFERDgJCTExMTEgMTAxMCAxMDAwIHh4eHggMTExMSB4eHh4IDAwMTAgeHh4eCAqLworCS8qIFNIU1VCOAkJMTExMSAxMDEwIDExMDAgeHh4eCAxMTExIHh4eHggMDAxMCB4eHh4ICovCisKKwkvKiBVQUREMTYJCTExMTEgMTAxMCAxMDAxIHh4eHggMTExMSB4eHh4IDAxMDAgeHh4eCAqLworCS8qIFVBU1gJCQkxMTExIDEwMTAgMTAxMCB4eHh4IDExMTEgeHh4eCAwMTAwIHh4eHggKi8KKwkvKiBVU0FYCQkJMTExMSAxMDEwIDExMTAgeHh4eCAxMTExIHh4eHggMDEwMCB4eHh4ICovCisJLyogVVNVQjE2CQkxMTExIDEwMTAgMTEwMSB4eHh4IDExMTEgeHh4eCAwMTAwIHh4eHggKi8KKwkvKiBVQUREOAkJMTExMSAxMDEwIDEwMDAgeHh4eCAxMTExIHh4eHggMDEwMCB4eHh4ICovCisJLyogVVNVQjgJCTExMTEgMTAxMCAxMTAwIHh4eHggMTExMSB4eHh4IDAxMDAgeHh4eCAqLworCisJLyogVVFBREQxNgkJMTExMSAxMDEwIDEwMDEgeHh4eCAxMTExIHh4eHggMDEwMSB4eHh4ICovCisJLyogVVFBU1gJCTExMTEgMTAxMCAxMDEwIHh4eHggMTExMSB4eHh4IDAxMDEgeHh4eCAqLworCS8qIFVRU0FYCQkxMTExIDEwMTAgMTExMCB4eHh4IDExMTEgeHh4eCAwMTAxIHh4eHggKi8KKwkvKiBVUVNVQjE2CQkxMTExIDEwMTAgMTEwMSB4eHh4IDExMTEgeHh4eCAwMTAxIHh4eHggKi8KKwkvKiBVUUFERDgJCTExMTEgMTAxMCAxMDAwIHh4eHggMTExMSB4eHh4IDAxMDEgeHh4eCAqLworCS8qIFVRU1VCOAkJMTExMSAxMDEwIDExMDAgeHh4eCAxMTExIHh4eHggMDEwMSB4eHh4ICovCisKKwkvKiBVSEFERDE2CQkxMTExIDEwMTAgMTAwMSB4eHh4IDExMTEgeHh4eCAwMTEwIHh4eHggKi8KKwkvKiBVSEFTWAkJMTExMSAxMDEwIDEwMTAgeHh4eCAxMTExIHh4eHggMDExMCB4eHh4ICovCisJLyogVUhTQVgJCTExMTEgMTAxMCAxMTEwIHh4eHggMTExMSB4eHh4IDAxMTAgeHh4eCAqLworCS8qIFVIU1VCMTYJCTExMTEgMTAxMCAxMTAxIHh4eHggMTExMSB4eHh4IDAxMTAgeHh4eCAqLworCS8qIFVIQUREOAkJMTExMSAxMDEwIDEwMDAgeHh4eCAxMTExIHh4eHggMDExMCB4eHh4ICovCisJLyogVUhTVUI4CQkxMTExIDEwMTAgMTEwMCB4eHh4IDExMTEgeHh4eCAwMTEwIHh4eHggKi8KKwlERUNPREVfT1IJKDB4ZmY4MGYwODAsIDB4ZmE4MGYwMDApLAorCisJLyogU1hUQUgJCTExMTEgMTAxMCAwMDAwIHh4eHggMTExMSB4eHh4IDF4eHggeHh4eCAqLworCS8qIFVYVEFICQkxMTExIDEwMTAgMDAwMSB4eHh4IDExMTEgeHh4eCAxeHh4IHh4eHggKi8KKwkvKiBTWFRBQjE2CQkxMTExIDEwMTAgMDAxMCB4eHh4IDExMTEgeHh4eCAxeHh4IHh4eHggKi8KKwkvKiBVWFRBQjE2CQkxMTExIDEwMTAgMDAxMSB4eHh4IDExMTEgeHh4eCAxeHh4IHh4eHggKi8KKwkvKiBTWFRBQgkJMTExMSAxMDEwIDAxMDAgeHh4eCAxMTExIHh4eHggMXh4eCB4eHh4ICovCisJLyogVVhUQUIJCTExMTEgMTAxMCAwMTAxIHh4eHggMTExMSB4eHh4IDF4eHggeHh4eCAqLworCURFQ09ERV9PUgkoMHhmZjgwZjA4MCwgMHhmYTAwZjA4MCksCisKKwkvKiBRQURECQkJMTExMSAxMDEwIDEwMDAgeHh4eCAxMTExIHh4eHggMTAwMCB4eHh4ICovCisJLyogUURBREQJCTExMTEgMTAxMCAxMDAwIHh4eHggMTExMSB4eHh4IDEwMDEgeHh4eCAqLworCS8qIFFTVUIJCQkxMTExIDEwMTAgMTAwMCB4eHh4IDExMTEgeHh4eCAxMDEwIHh4eHggKi8KKwkvKiBRRFNVQgkJMTExMSAxMDEwIDEwMDAgeHh4eCAxMTExIHh4eHggMTAxMSB4eHh4ICovCisJREVDT0RFX09SCSgweGZmZjBmMGMwLCAweGZhODBmMDgwKSwKKworCS8qIFNFTAkJCTExMTEgMTAxMCAxMDEwIHh4eHggMTExMSB4eHh4IDEwMDAgeHh4eCAqLworCURFQ09ERV9PUgkoMHhmZmYwZjBmMCwgMHhmYWEwZjA4MCksCisKKwkvKiBMU0wJCQkxMTExIDEwMTAgMDAweCB4eHh4IDExMTEgeHh4eCAwMDAwIHh4eHggKi8KKwkvKiBMU1IJCQkxMTExIDEwMTAgMDAxeCB4eHh4IDExMTEgeHh4eCAwMDAwIHh4eHggKi8KKwkvKiBBU1IJCQkxMTExIDEwMTAgMDEweCB4eHh4IDExMTEgeHh4eCAwMDAwIHh4eHggKi8KKwkvKiBST1IJCQkxMTExIDEwMTAgMDExeCB4eHh4IDExMTEgeHh4eCAwMDAwIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmY4MGYwZjAsIDB4ZmEwMGYwMDAsIHQzMl9lbXVsYXRlX3JkOHJuMTZybTBfcndmbGFncywKKwkJCQkJCSBSRUdTKE5PU1BQQywgMCwgTk9TUFBDLCAwLCBOT1NQUEMpKSwKKworCS8qIENMWgkJCTExMTEgMTAxMCAxMDEwIHh4eHggMTExMSB4eHh4IDEwMDAgeHh4eCAqLworCURFQ09ERV9PUgkoMHhmZmYwZjBmMCwgMHhmYWIwZjA4MCksCisKKwkvKiBSRVYJCQkxMTExIDEwMTAgMTAwMSB4eHh4IDExMTEgeHh4eCAxMDAwIHh4eHggKi8KKwkvKiBSRVYxNgkJMTExMSAxMDEwIDEwMDEgeHh4eCAxMTExIHh4eHggMTAwMSB4eHh4ICovCisJLyogUkJJVAkJCTExMTEgMTAxMCAxMDAxIHh4eHggMTExMSB4eHh4IDEwMTAgeHh4eCAqLworCS8qIFJFVlNICQkxMTExIDEwMTAgMTAwMSB4eHh4IDExMTEgeHh4eCAxMDExIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmZmMGYwYzAsIDB4ZmE5MGYwODAsIHQzMl9lbXVsYXRlX3JkOHJuMTZfbm9mbGFncywKKwkJCQkJCSBSRUdTKE5PU1BQQywgMCwgTk9TUFBDLCAwLCBTQU1FQVMxNikpLAorCisJLyogT3RoZXIgdW5hbGxvY2F0ZWQgaW5zdHJ1Y3Rpb25zLi4uCQkJCSovCisJREVDT0RFX0VORAorfTsKKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIHQzMl90YWJsZV8xMTExXzEwMTFfMFtdID0geworCS8qIE11bHRpcGx5LCBtdWx0aXBseSBhY2N1bXVsYXRlLCBhbmQgYWJzb2x1dGUgZGlmZmVyZW5jZQkqLworCisJLyogPz8/CQkJMTExMSAxMDExIDAwMDAgeHh4eCAxMTExIHh4eHggMDAwMSB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmZmYwZjBmMCwgMHhmYjAwZjAxMCksCisJLyogPz8/CQkJMTExMSAxMDExIDAxMTEgeHh4eCAxMTExIHh4eHggMDAwMSB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmZmYwZjBmMCwgMHhmYjcwZjAxMCksCisKKwkvKiBTTVVMeHkJCTExMTEgMTAxMSAwMDAxIHh4eHggMTExMSB4eHh4IDAweHggeHh4eCAqLworCURFQ09ERV9PUgkoMHhmZmYwZjBjMCwgMHhmYjEwZjAwMCksCisJLyogTVVMCQkJMTExMSAxMDExIDAwMDAgeHh4eCAxMTExIHh4eHggMDAwMCB4eHh4ICovCisJLyogU01VQUR7WH0JCTExMTEgMTAxMSAwMDEwIHh4eHggMTExMSB4eHh4IDAwMHggeHh4eCAqLworCS8qIFNNVUxXeQkJMTExMSAxMDExIDAwMTEgeHh4eCAxMTExIHh4eHggMDAweCB4eHh4ICovCisJLyogU01VU0R7WH0JCTExMTEgMTAxMSAwMTAwIHh4eHggMTExMSB4eHh4IDAwMHggeHh4eCAqLworCS8qIFNNTVVMe1J9CQkxMTExIDEwMTEgMDEwMSB4eHh4IDExMTEgeHh4eCAwMDB4IHh4eHggKi8KKwkvKiBVU0FEOAkJMTExMSAxMDExIDAxMTEgeHh4eCAxMTExIHh4eHggMDAwMCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEVYCSgweGZmODBmMGUwLCAweGZiMDBmMDAwLCB0MzJfZW11bGF0ZV9yZDhybjE2cm0wX3J3ZmxhZ3MsCisJCQkJCQkgUkVHUyhOT1NQUEMsIDAsIE5PU1BQQywgMCwgTk9TUFBDKSksCisKKwkvKiA/Pz8JCQkxMTExIDEwMTEgMDExMSB4eHh4IHh4eHggeHh4eCAwMDAxIHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZmZjAwMGYwLCAweGZiNzAwMDEwKSwKKworCS8qIFNNTEF4eQkJMTExMSAxMDExIDAwMDEgeHh4eCB4eHh4IHh4eHggMDB4eCB4eHh4ICovCisJREVDT0RFX09SCSgweGZmZjAwMGMwLCAweGZiMTAwMDAwKSwKKwkvKiBNTEEJCQkxMTExIDEwMTEgMDAwMCB4eHh4IHh4eHggeHh4eCAwMDAwIHh4eHggKi8KKwkvKiBNTFMJCQkxMTExIDEwMTEgMDAwMCB4eHh4IHh4eHggeHh4eCAwMDAxIHh4eHggKi8KKwkvKiBTTUxBRHtYfQkJMTExMSAxMDExIDAwMTAgeHh4eCB4eHh4IHh4eHggMDAweCB4eHh4ICovCisJLyogU01MQVd5CQkxMTExIDEwMTEgMDAxMSB4eHh4IHh4eHggeHh4eCAwMDB4IHh4eHggKi8KKwkvKiBTTUxTRHtYfQkJMTExMSAxMDExIDAxMDAgeHh4eCB4eHh4IHh4eHggMDAweCB4eHh4ICovCisJLyogU01NTEF7Un0JCTExMTEgMTAxMSAwMTAxIHh4eHggeHh4eCB4eHh4IDAwMHggeHh4eCAqLworCS8qIFNNTUxTe1J9CQkxMTExIDEwMTEgMDExMCB4eHh4IHh4eHggeHh4eCAwMDB4IHh4eHggKi8KKwkvKiBVU0FEQTgJCTExMTEgMTAxMSAwMTExIHh4eHggeHh4eCB4eHh4IDAwMDAgeHh4eCAqLworCURFQ09ERV9FTVVMQVRFWAkoMHhmZjgwMDBjMCwgMHhmYjAwMDAwMCwgdDMyX2VtdWxhdGVfcmQ4cm4xNnJtMHJhMTJfbm9mbGFncywKKwkJCQkJCSBSRUdTKE5PU1BQQywgTk9TUFBDWCwgTk9TUFBDLCAwLCBOT1NQUEMpKSwKKworCS8qIE90aGVyIHVuYWxsb2NhdGVkIGluc3RydWN0aW9ucy4uLgkJCQkqLworCURFQ09ERV9FTkQKK307CisKK3N0YXRpYyBjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSB0MzJfdGFibGVfMTExMV8xMDExXzFbXSA9IHsKKwkvKiBMb25nIG11bHRpcGx5LCBsb25nIG11bHRpcGx5IGFjY3VtdWxhdGUsIGFuZCBkaXZpZGUJCSovCisKKwkvKiBVTUFBTAkJMTExMSAxMDExIDExMTAgeHh4eCB4eHh4IHh4eHggMDExMCB4eHh4ICovCisJREVDT0RFX09SCSgweGZmZjAwMGYwLCAweGZiZTAwMDYwKSwKKwkvKiBTTUxBTHh5CQkxMTExIDEwMTEgMTEwMCB4eHh4IHh4eHggeHh4eCAxMHh4IHh4eHggKi8KKwlERUNPREVfT1IJKDB4ZmZmMDAwYzAsIDB4ZmJjMDAwODApLAorCS8qIFNNTEFMRHtYfQkJMTExMSAxMDExIDExMDAgeHh4eCB4eHh4IHh4eHggMTEweCB4eHh4ICovCisJLyogU01MU0xEe1h9CQkxMTExIDEwMTEgMTEwMSB4eHh4IHh4eHggeHh4eCAxMTB4IHh4eHggKi8KKwlERUNPREVfT1IJKDB4ZmZlMDAwZTAsIDB4ZmJjMDAwYzApLAorCS8qIFNNVUxMCQkxMTExIDEwMTEgMTAwMCB4eHh4IHh4eHggeHh4eCAwMDAwIHh4eHggKi8KKwkvKiBVTVVMTAkJMTExMSAxMDExIDEwMTAgeHh4eCB4eHh4IHh4eHggMDAwMCB4eHh4ICovCisJLyogU01MQUwJCTExMTEgMTAxMSAxMTAwIHh4eHggeHh4eCB4eHh4IDAwMDAgeHh4eCAqLworCS8qIFVNTEFMCQkxMTExIDEwMTEgMTExMCB4eHh4IHh4eHggeHh4eCAwMDAwIHh4eHggKi8KKwlERUNPREVfRU1VTEFURVgJKDB4ZmY5MDAwZjAsIDB4ZmI4MDAwMDAsIHQzMl9lbXVsYXRlX3JkbG8xMnJkaGk4cm4xNnJtMF9ub2ZsYWdzLAorCQkJCQkJIFJFR1MoTk9TUFBDLCBOT1NQUEMsIE5PU1BQQywgMCwgTk9TUFBDKSksCisKKwkvKiBTRElWCQkJMTExMSAxMDExIDEwMDEgeHh4eCB4eHh4IHh4eHggMTExMSB4eHh4ICovCisJLyogVURJVgkJCTExMTEgMTAxMSAxMDExIHh4eHggeHh4eCB4eHh4IDExMTEgeHh4eCAqLworCS8qIE90aGVyIHVuYWxsb2NhdGVkIGluc3RydWN0aW9ucy4uLgkJCQkqLworCURFQ09ERV9FTkQKK307CisKK2NvbnN0IHVuaW9uIGRlY29kZV9pdGVtIGtwcm9iZV9kZWNvZGVfdGh1bWIzMl90YWJsZVtdID0geworCisJLyoKKwkgKiBMb2FkL3N0b3JlIG11bHRpcGxlIGluc3RydWN0aW9ucworCSAqCQkJMTExMCAxMDB4IHgweHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4CisJICovCisJREVDT0RFX1RBQkxFCSgweGZlNDAwMDAwLCAweGU4MDAwMDAwLCB0MzJfdGFibGVfMTExMF8xMDB4X3gweHgpLAorCisJLyoKKwkgKiBMb2FkL3N0b3JlIGR1YWwsIGxvYWQvc3RvcmUgZXhjbHVzaXZlLCB0YWJsZSBicmFuY2gKKwkgKgkJCTExMTAgMTAweCB4MXh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eAorCSAqLworCURFQ09ERV9UQUJMRQkoMHhmZTQwMDAwMCwgMHhlODQwMDAwMCwgdDMyX3RhYmxlXzExMTBfMTAweF94MXh4KSwKKworCS8qCisJICogRGF0YS1wcm9jZXNzaW5nIChzaGlmdGVkIHJlZ2lzdGVyKQorCSAqCQkJMTExMCAxMDF4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4CisJICovCisJREVDT0RFX1RBQkxFCSgweGZlMDAwMDAwLCAweGVhMDAwMDAwLCB0MzJfdGFibGVfMTExMF8xMDF4KSwKKworCS8qCisJICogQ29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zCisJICoJCQkxMTEwIDExeHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgKKwkgKi8KKwlERUNPREVfUkVKRUNUCSgweGZjMDAwMDAwLCAweGVjMDAwMDAwKSwKKworCS8qCisJICogRGF0YS1wcm9jZXNzaW5nIChtb2RpZmllZCBpbW1lZGlhdGUpCisJICoJCQkxMTExIDB4MHggeHh4eCB4eHh4IDB4eHggeHh4eCB4eHh4IHh4eHgKKwkgKi8KKwlERUNPREVfVEFCTEUJKDB4ZmEwMDgwMDAsIDB4ZjAwMDAwMDAsIHQzMl90YWJsZV8xMTExXzB4MHhfX18wKSwKKworCS8qCisJICogRGF0YS1wcm9jZXNzaW5nIChwbGFpbiBiaW5hcnkgaW1tZWRpYXRlKQorCSAqCQkJMTExMSAweDF4IHh4eHggeHh4eCAweHh4IHh4eHggeHh4eCB4eHh4CisJICovCisJREVDT0RFX1RBQkxFCSgweGZhMDA4MDAwLCAweGYyMDAwMDAwLCB0MzJfdGFibGVfMTExMV8weDF4X19fMCksCisKKwkvKgorCSAqIEJyYW5jaGVzIGFuZCBtaXNjZWxsYW5lb3VzIGNvbnRyb2wKKwkgKgkJCTExMTEgMHh4eCB4eHh4IHh4eHggMXh4eCB4eHh4IHh4eHggeHh4eAorCSAqLworCURFQ09ERV9UQUJMRQkoMHhmODAwODAwMCwgMHhmMDAwODAwMCwgdDMyX3RhYmxlXzExMTFfMHh4eF9fXzEpLAorCisJLyoKKwkgKiBBZHZhbmNlZCBTSU1EIGVsZW1lbnQgb3Igc3RydWN0dXJlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zCisJICoJCQkxMTExIDEwMDEgeHh4MCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgKKwkgKi8KKwlERUNPREVfUkVKRUNUCSgweGZmMTAwMDAwLCAweGY5MDAwMDAwKSwKKworCS8qCisJICogTWVtb3J5IGhpbnRzCisJICoJCQkxMTExIDEwMHggeDB4MSB4eHh4IDExMTEgeHh4eCB4eHh4IHh4eHgKKwkgKi8KKwlERUNPREVfVEFCTEUJKDB4ZmU1MGYwMDAsIDB4ZjgxMGYwMDAsIHQzMl90YWJsZV8xMTExXzEwMHhfeDB4MV9fMTExMSksCisKKwkvKgorCSAqIFN0b3JlIHNpbmdsZSBkYXRhIGl0ZW0KKwkgKgkJCTExMTEgMTAwMCB4eHgwIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eAorCSAqIExvYWQgc2luZ2xlIGRhdGEgaXRlbXMKKwkgKgkJCTExMTEgMTAweCB4eHgxIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eAorCSAqLworCURFQ09ERV9UQUJMRQkoMHhmZTAwMDAwMCwgMHhmODAwMDAwMCwgdDMyX3RhYmxlXzExMTFfMTAweCksCisKKwkvKgorCSAqIERhdGEtcHJvY2Vzc2luZyAocmVnaXN0ZXIpCisJICoJCQkxMTExIDEwMTAgeHh4eCB4eHh4IDExMTEgeHh4eCB4eHh4IHh4eHgKKwkgKi8KKwlERUNPREVfVEFCTEUJKDB4ZmYwMGYwMDAsIDB4ZmEwMGYwMDAsIHQzMl90YWJsZV8xMTExXzEwMTBfX18xMTExKSwKKworCS8qCisJICogTXVsdGlwbHksIG11bHRpcGx5IGFjY3VtdWxhdGUsIGFuZCBhYnNvbHV0ZSBkaWZmZXJlbmNlCisJICoJCQkxMTExIDEwMTEgMHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHgKKwkgKi8KKwlERUNPREVfVEFCTEUJKDB4ZmY4MDAwMDAsIDB4ZmIwMDAwMDAsIHQzMl90YWJsZV8xMTExXzEwMTFfMCksCisKKwkvKgorCSAqIExvbmcgbXVsdGlwbHksIGxvbmcgbXVsdGlwbHkgYWNjdW11bGF0ZSwgYW5kIGRpdmlkZQorCSAqCQkJMTExMSAxMDExIDF4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4CisJICovCisJREVDT0RFX1RBQkxFCSgweGZmODAwMDAwLCAweGZiODAwMDAwLCB0MzJfdGFibGVfMTExMV8xMDExXzEpLAorCisJLyoKKwkgKiBDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMKKwkgKgkJCTExMTEgMTF4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eAorCSAqLworCURFQ09ERV9FTkQKK307CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcwordDE2X3NpbXVsYXRlX2J4Ymx4KHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCXVuc2lnbmVkIGxvbmcgcGMgPSB0aHVtYl9wcm9iZV9wYyhwKTsKKwlpbnQgcm0gPSAoaW5zbiA+PiAzKSAmIDB4ZjsKKwl1bnNpZ25lZCBsb25nIHJtdiA9IChybSA9PSAxNSkgPyBwYyA6IHJlZ3MtPnVyZWdzW3JtXTsKKworCWlmIChpbnNuICYgKDEgPDwgNykpIC8qIEJMWCA/ICovCisJCXJlZ3MtPkFSTV9sciA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHIgKyAyOworCisJYnhfd3JpdGVfcGMocm12LCByZWdzKTsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCit0MTZfc2ltdWxhdGVfbGRyX2xpdGVyYWwoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJa3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7CisJdW5zaWduZWQgbG9uZyogYmFzZSA9ICh1bnNpZ25lZCBsb25nICopKHRodW1iX3Byb2JlX3BjKHApICYgfjMpOworCWxvbmcgaW5kZXggPSBpbnNuICYgMHhmZjsKKwlpbnQgcnQgPSAoaW5zbiA+PiA4KSAmIDB4NzsKKwlyZWdzLT51cmVnc1tydF0gPSBiYXNlW2luZGV4XTsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCit0MTZfc2ltdWxhdGVfbGRyc3RyX3NwX3JlbGF0aXZlKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCXVuc2lnbmVkIGxvbmcqIGJhc2UgPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPkFSTV9zcDsKKwlsb25nIGluZGV4ID0gaW5zbiAmIDB4ZmY7CisJaW50IHJ0ID0gKGluc24gPj4gOCkgJiAweDc7CisJaWYgKGluc24gJiAweDgwMCkgLyogTERSICovCisJCXJlZ3MtPnVyZWdzW3J0XSA9IGJhc2VbaW5kZXhdOworCWVsc2UgLyogU1RSICovCisJCWJhc2VbaW5kZXhdID0gcmVncy0+dXJlZ3NbcnRdOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK3QxNl9zaW11bGF0ZV9yZWxhZHIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJa3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gKGluc24gJiAweDgwMCkgPyByZWdzLT5BUk1fc3AKKwkJCQkJICAgIDogKHRodW1iX3Byb2JlX3BjKHApICYgfjMpOworCWxvbmcgb2Zmc2V0ID0gaW5zbiAmIDB4ZmY7CisJaW50IHJ0ID0gKGluc24gPj4gOCkgJiAweDc7CisJcmVncy0+dXJlZ3NbcnRdID0gYmFzZSArIG9mZnNldCAqIDQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcwordDE2X3NpbXVsYXRlX2FkZF9zcF9pbW0oc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJa3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7CisJbG9uZyBpbW0gPSBpbnNuICYgMHg3ZjsKKwlpZiAoaW5zbiAmIDB4ODApIC8qIFNVQiAqLworCQlyZWdzLT5BUk1fc3AgLT0gaW1tICogNDsKKwllbHNlIC8qIEFERCAqLworCQlyZWdzLT5BUk1fc3AgKz0gaW1tICogNDsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCit0MTZfc2ltdWxhdGVfY2J6KHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCWludCBybiA9IGluc24gJiAweDc7CisJa3Byb2JlX29wY29kZV90IG5vbnplcm8gPSByZWdzLT51cmVnc1tybl0gPyBpbnNuIDogfmluc247CisJaWYgKG5vbnplcm8gJiAweDgwMCkgeworCQlsb25nIGkgPSBpbnNuICYgMHgyMDA7CisJCWxvbmcgaW1tNSA9IGluc24gJiAweGY4OworCQl1bnNpZ25lZCBsb25nIHBjID0gdGh1bWJfcHJvYmVfcGMocCk7CisJCXJlZ3MtPkFSTV9wYyA9IHBjICsgKGkgPj4gMykgKyAoaW1tNSA+PiAyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcwordDE2X3NpbXVsYXRlX2l0KHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qCisJICogVGhlIDggSVQgc3RhdGUgYml0cyBhcmUgc3BsaXQgaW50byB0d28gcGFydHMgaW4gQ1BTUjoKKwkgKglJVFNUQVRFPDE6MD4gYXJlIGluIENQU1I8MjY6MjU+CisJICoJSVRTVEFURTw3OjI+IGFyZSBpbiBDUFNSPDE1OjEwPgorCSAqIFRoZSBuZXcgSVQgc3RhdGUgaXMgaW4gdGhlIGxvd2VyIGJ5dGUgb2YgaW5zbi4KKwkgKi8KKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwl1bnNpZ25lZCBsb25nIGNwc3IgPSByZWdzLT5BUk1fY3BzcjsKKwljcHNyICY9IH5QU1JfSVRfTUFTSzsKKwljcHNyIHw9IChpbnNuICYgMHhmYykgPDwgODsKKwljcHNyIHw9IChpbnNuICYgMHgwMykgPDwgMjU7CisJcmVncy0+QVJNX2Nwc3IgPSBjcHNyOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK3QxNl9zaW5nbGVzdGVwX2l0KHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJlZ3MtPkFSTV9wYyArPSAyOworCXQxNl9zaW11bGF0ZV9pdChwLCByZWdzKTsKK30KKworc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCit0MTZfZGVjb2RlX2l0KGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCit7CisJYXNpLT5pbnNuX3NpbmdsZXN0ZXAgPSB0MTZfc2luZ2xlc3RlcF9pdDsKKwlyZXR1cm4gSU5TTl9HT09EX05PX1NMT1Q7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcwordDE2X3NpbXVsYXRlX2NvbmRfYnJhbmNoKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCXVuc2lnbmVkIGxvbmcgcGMgPSB0aHVtYl9wcm9iZV9wYyhwKTsKKwlsb25nIG9mZnNldCA9IGluc24gJiAweDdmOworCW9mZnNldCAtPSBpbnNuICYgMHg4MDsgLyogQXBwbHkgc2lnbiBiaXQgKi8KKwlyZWdzLT5BUk1fcGMgPSBwYyArIChvZmZzZXQgKiAyKTsKK30KKworc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCit0MTZfZGVjb2RlX2NvbmRfYnJhbmNoKGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCit7CisJaW50IGNjID0gKGluc24gPj4gOCkgJiAweGY7CisJYXNpLT5pbnNuX2NoZWNrX2NjID0ga3Byb2JlX2NvbmRpdGlvbl9jaGVja3NbY2NdOworCWFzaS0+aW5zbl9oYW5kbGVyID0gdDE2X3NpbXVsYXRlX2NvbmRfYnJhbmNoOworCXJldHVybiBJTlNOX0dPT0RfTk9fU0xPVDsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCit0MTZfc2ltdWxhdGVfYnJhbmNoKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gcC0+b3Bjb2RlOworCXVuc2lnbmVkIGxvbmcgcGMgPSB0aHVtYl9wcm9iZV9wYyhwKTsKKwlsb25nIG9mZnNldCA9IGluc24gJiAweDNmZjsKKwlvZmZzZXQgLT0gaW5zbiAmIDB4NDAwOyAvKiBBcHBseSBzaWduIGJpdCAqLworCXJlZ3MtPkFSTV9wYyA9IHBjICsgKG9mZnNldCAqIDIpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2twcm9iZXMKK3QxNl9lbXVsYXRlX2xvcmVncyhzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIG9sZGNwc3IgPSByZWdzLT5BUk1fY3BzcjsKKwl1bnNpZ25lZCBsb25nIG5ld2Nwc3I7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJtc3IJY3Bzcl9mcywgJVtvbGRjcHNyXQlcblx0IgorCQkibGRtaWEJJVtyZWdzXSwge3IwLXI3fQlcblx0IgorCQkiYmx4CSVbZm5dCQkJXG5cdCIKKwkJInN0bWlhCSVbcmVnc10sIHtyMC1yN30JXG5cdCIKKwkJIm1ycwklW25ld2Nwc3JdLCBjcHNyCVxuXHQiCisJCTogW25ld2Nwc3JdICI9ciIgKG5ld2Nwc3IpCisJCTogW29sZGNwc3JdICJyIiAob2xkY3BzciksIFtyZWdzXSAiciIgKHJlZ3MpLAorCQkgIFtmbl0gInIiIChwLT5haW5zbi5pbnNuX2ZuKQorCQk6ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCisJCSAgImxyIiwgIm1lbW9yeSIsICJjYyIKKwkJKTsKKworCXJldHVybiAob2xkY3BzciAmIH5BUFNSX01BU0spIHwgKG5ld2Nwc3IgJiBBUFNSX01BU0spOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK3QxNl9lbXVsYXRlX2xvcmVnc19yd2ZsYWdzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJlZ3MtPkFSTV9jcHNyID0gdDE2X2VtdWxhdGVfbG9yZWdzKHAsIHJlZ3MpOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK3QxNl9lbXVsYXRlX2xvcmVnc19ub2l0cndmbGFncyhzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGNwc3IgPSB0MTZfZW11bGF0ZV9sb3JlZ3MocCwgcmVncyk7CisJaWYgKCFpbl9pdF9ibG9jayhjcHNyKSkKKwkJcmVncy0+QVJNX2Nwc3IgPSBjcHNyOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK3QxNl9lbXVsYXRlX2hpcmVncyhzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IHAtPm9wY29kZTsKKwl1bnNpZ25lZCBsb25nIHBjID0gdGh1bWJfcHJvYmVfcGMocCk7CisJaW50IHJkbiA9IChpbnNuICYgMHg3KSB8ICgoaW5zbiAmIDB4ODApID4+IDQpOworCWludCBybSA9IChpbnNuID4+IDMpICYgMHhmOworCisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZG52IGFzbSgicjEiKTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJtdiBhc20oInIwIik7CisJdW5zaWduZWQgbG9uZyBjcHNyID0gcmVncy0+QVJNX2Nwc3I7CisKKwlyZG52ID0gKHJkbiA9PSAxNSkgPyBwYyA6IHJlZ3MtPnVyZWdzW3Jkbl07CisJcm12ID0gKHJtID09IDE1KSA/IHBjIDogcmVncy0+dXJlZ3Nbcm1dOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkibXNyCWNwc3JfZnMsICVbY3Bzcl0JXG5cdCIKKwkJImJseCAgICAlW2ZuXQkJCVxuXHQiCisJCSJtcnMJJVtjcHNyXSwgY3BzcgkJXG5cdCIKKwkJOiAiPXIiIChyZG52KSwgW2Nwc3JdICI9ciIgKGNwc3IpCisJCTogIjAiIChyZG52KSwgInIiIChybXYpLCAiMSIgKGNwc3IpLCBbZm5dICJyIiAocC0+YWluc24uaW5zbl9mbikKKwkJOiAibHIiLCAibWVtb3J5IiwgImNjIgorCSk7CisKKwlpZiAocmRuID09IDE1KQorCQlyZG52ICY9IH4xOworCisJcmVncy0+dXJlZ3NbcmRuXSA9IHJkbnY7CisJcmVncy0+QVJNX2Nwc3IgPSAocmVncy0+QVJNX2Nwc3IgJiB+QVBTUl9NQVNLKSB8IChjcHNyICYgQVBTUl9NQVNLKTsKK30KKworc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCit0MTZfZGVjb2RlX2hpcmVncyhrcHJvYmVfb3Bjb2RlX3QgaW5zbiwgc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiAqYXNpKQoreworCWluc24gJj0gfjB4MDBmZjsKKwlpbnNuIHw9IDB4MDAxOyAvKiBTZXQgUmRuID0gUjEgYW5kIFJtID0gUjAgKi8KKwkoKHUxNiAqKWFzaS0+aW5zbilbMF0gPSBpbnNuOworCWFzaS0+aW5zbl9oYW5kbGVyID0gdDE2X2VtdWxhdGVfaGlyZWdzOworCXJldHVybiBJTlNOX0dPT0Q7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcwordDE2X2VtdWxhdGVfcHVzaChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJsZHIJcjksIFslW3JlZ3NdLCAjMTMqNF0JXG5cdCIKKwkJImxkcglyOCwgWyVbcmVnc10sICMxNCo0XQlcblx0IgorCQkibGRtaWEJJVtyZWdzXSwge3IwLXI3fQlcblx0IgorCQkiYmx4CSVbZm5dCQkJXG5cdCIKKwkJInN0cglyOSwgWyVbcmVnc10sICMxMyo0XQlcblx0IgorCQk6CisJCTogW3JlZ3NdICJyIiAocmVncyksIFtmbl0gInIiIChwLT5haW5zbi5pbnNuX2ZuKQorCQk6ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICJyOCIsICJyOSIsCisJCSAgImxyIiwgIm1lbW9yeSIsICJjYyIKKwkJKTsKK30KKworc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCit0MTZfZGVjb2RlX3B1c2goa3Byb2JlX29wY29kZV90IGluc24sIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKmFzaSkKK3sKKwkvKgorCSAqIFRvIHNpbXVsYXRlIGEgUFVTSCB3ZSB1c2UgYSBUaHVtYi0yICJTVE1EQiBSOSEsIHtyZWdpc3RlcnN9IgorCSAqIGFuZCBjYWxsIGl0IHdpdGggUjk9U1AgYW5kIExSIGluIHRoZSByZWdpc3RlciBsaXN0IHJlcHJlc2VudGVkCisJICogYnkgUjguCisJICovCisJKCh1MTYgKilhc2ktPmluc24pWzBdID0gMHhlOTI5OwkJLyogMXN0IGhhbGYgU1RNREIgUjkhLHt9ICovCisJKCh1MTYgKilhc2ktPmluc24pWzFdID0gaW5zbiAmIDB4MWZmOwkvKiAybmQgaGFsZiAocmVnaXN0ZXIgbGlzdCkgKi8KKwlhc2ktPmluc25faGFuZGxlciA9IHQxNl9lbXVsYXRlX3B1c2g7CisJcmV0dXJuIElOU05fR09PRDsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCit0MTZfZW11bGF0ZV9wb3Bfbm9wYyhzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJsZHIJcjksIFslW3JlZ3NdLCAjMTMqNF0JXG5cdCIKKwkJImxkbWlhCSVbcmVnc10sIHtyMC1yN30JXG5cdCIKKwkJImJseAklW2ZuXQkJCVxuXHQiCisJCSJzdG1pYQklW3JlZ3NdLCB7cjAtcjd9CVxuXHQiCisJCSJzdHIJcjksIFslW3JlZ3NdLCAjMTMqNF0JXG5cdCIKKwkJOgorCQk6IFtyZWdzXSAiciIgKHJlZ3MpLCBbZm5dICJyIiAocC0+YWluc24uaW5zbl9mbikKKwkJOiAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCAicjkiLAorCQkgICJsciIsICJtZW1vcnkiLCAiY2MiCisJCSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcwordDE2X2VtdWxhdGVfcG9wX3BjKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcGMgYXNtKCJyOCIpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkibGRyCXI5LCBbJVtyZWdzXSwgIzEzKjRdCVxuXHQiCisJCSJsZG1pYQklW3JlZ3NdLCB7cjAtcjd9CVxuXHQiCisJCSJibHgJJVtmbl0JCQlcblx0IgorCQkic3RtaWEJJVtyZWdzXSwge3IwLXI3fQlcblx0IgorCQkic3RyCXI5LCBbJVtyZWdzXSwgIzEzKjRdCVxuXHQiCisJCTogIj1yIiAocGMpCisJCTogW3JlZ3NdICJyIiAocmVncyksIFtmbl0gInIiIChwLT5haW5zbi5pbnNuX2ZuKQorCQk6ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICJyOSIsCisJCSAgImxyIiwgIm1lbW9yeSIsICJjYyIKKwkJKTsKKworCWJ4X3dyaXRlX3BjKHBjLCByZWdzKTsKK30KKworc3RhdGljIGVudW0ga3Byb2JlX2luc24gX19rcHJvYmVzCit0MTZfZGVjb2RlX3BvcChrcHJvYmVfb3Bjb2RlX3QgaW5zbiwgc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiAqYXNpKQoreworCS8qCisJICogVG8gc2ltdWxhdGUgYSBQT1Agd2UgdXNlIGEgVGh1bWItMiAiTERNREIgUjkhLCB7cmVnaXN0ZXJzfSIKKwkgKiBhbmQgY2FsbCBpdCB3aXRoIFI5PVNQIGFuZCBQQyBpbiB0aGUgcmVnaXN0ZXIgbGlzdCByZXByZXNlbnRlZAorCSAqIGJ5IFI4LgorCSAqLworCSgodTE2ICopYXNpLT5pbnNuKVswXSA9IDB4ZThiOTsJCS8qIDFzdCBoYWxmIExETUlBIFI5ISx7fSAqLworCSgodTE2ICopYXNpLT5pbnNuKVsxXSA9IGluc24gJiAweDFmZjsJLyogMm5kIGhhbGYgKHJlZ2lzdGVyIGxpc3QpICovCisJYXNpLT5pbnNuX2hhbmRsZXIgPSBpbnNuICYgMHgxMDAgPyB0MTZfZW11bGF0ZV9wb3BfcGMKKwkJCQkJIDogdDE2X2VtdWxhdGVfcG9wX25vcGM7CisJcmV0dXJuIElOU05fR09PRDsKK30KKworc3RhdGljIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIHQxNl90YWJsZV8xMDExW10gPSB7CisJLyogTWlzY2VsbGFuZW91cyAxNi1iaXQgaW5zdHJ1Y3Rpb25zCQkgICAgKi8KKworCS8qIEFERCAoU1AgcGx1cyBpbW1lZGlhdGUpCTEwMTEgMDAwMCAweHh4IHh4eHggKi8KKwkvKiBTVUIgKFNQIG1pbnVzIGltbWVkaWF0ZSkJMTAxMSAwMDAwIDF4eHggeHh4eCAqLworCURFQ09ERV9TSU1VTEFURQkoMHhmZjAwLCAweGIwMDAsIHQxNl9zaW11bGF0ZV9hZGRfc3BfaW1tKSwKKworCS8qIENCWgkJCQkxMDExIDAweDEgeHh4eCB4eHh4ICovCisJLyogQ0JOWgkJCQkxMDExIDEweDEgeHh4eCB4eHh4ICovCisJREVDT0RFX1NJTVVMQVRFCSgweGY1MDAsIDB4YjEwMCwgdDE2X3NpbXVsYXRlX2NieiksCisKKwkvKiBTWFRICQkJCTEwMTEgMDAxMCAwMHh4IHh4eHggKi8KKwkvKiBTWFRCCQkJCTEwMTEgMDAxMCAwMXh4IHh4eHggKi8KKwkvKiBVWFRICQkJCTEwMTEgMDAxMCAxMHh4IHh4eHggKi8KKwkvKiBVWFRCCQkJCTEwMTEgMDAxMCAxMXh4IHh4eHggKi8KKwkvKiBSRVYJCQkJMTAxMSAxMDEwIDAweHggeHh4eCAqLworCS8qIFJFVjE2CQkJMTAxMSAxMDEwIDAxeHggeHh4eCAqLworCS8qID8/PwkJCQkxMDExIDEwMTAgMTB4eCB4eHh4ICovCisJLyogUkVWU0gJCQkxMDExIDEwMTAgMTF4eCB4eHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmZmMwLCAweGJhODApLAorCURFQ09ERV9FTVVMQVRFCSgweGY1MDAsIDB4YjAwMCwgdDE2X2VtdWxhdGVfbG9yZWdzX3J3ZmxhZ3MpLAorCisJLyogUFVTSAkJCQkxMDExIDAxMHggeHh4eCB4eHh4ICovCisJREVDT0RFX0NVU1RPTQkoMHhmZTAwLCAweGI0MDAsIHQxNl9kZWNvZGVfcHVzaCksCisJLyogUE9QCQkJCTEwMTEgMTEweCB4eHh4IHh4eHggKi8KKwlERUNPREVfQ1VTVE9NCSgweGZlMDAsIDB4YmMwMCwgdDE2X2RlY29kZV9wb3ApLAorCisJLyoKKwkgKiBJZi1UaGVuLCBhbmQgaGludHMKKwkgKgkJCQkxMDExIDExMTEgeHh4eCB4eHh4CisJICovCisKKwkvKiBZSUVMRAkJCTEwMTEgMTExMSAwMDAxIDAwMDAgKi8KKwlERUNPREVfT1IJKDB4ZmZmZiwgMHhiZjEwKSwKKwkvKiBTRVYJCQkJMTAxMSAxMTExIDAxMDAgMDAwMCAqLworCURFQ09ERV9FTVVMQVRFCSgweGZmZmYsIDB4YmY0MCwga3Byb2JlX2VtdWxhdGVfbm9uZSksCisJLyogTk9QCQkJCTEwMTEgMTExMSAwMDAwIDAwMDAgKi8KKwkvKiBXRkUJCQkJMTAxMSAxMTExIDAwMTAgMDAwMCAqLworCS8qIFdGSQkJCQkxMDExIDExMTEgMDAxMSAwMDAwICovCisJREVDT0RFX1NJTVVMQVRFCSgweGZmY2YsIDB4YmYwMCwga3Byb2JlX3NpbXVsYXRlX25vcCksCisJLyogVW5hc3NpZ25lZCBoaW50cwkJMTAxMSAxMTExIHh4eHggMDAwMCAqLworCURFQ09ERV9SRUpFQ1QJKDB4ZmYwZiwgMHhiZjAwKSwKKwkvKiBJVAkJCQkxMDExIDExMTEgeHh4eCB4eHh4ICovCisJREVDT0RFX0NVU1RPTQkoMHhmZjAwLCAweGJmMDAsIHQxNl9kZWNvZGVfaXQpLAorCisJLyogU0VURU5ECQkJMTAxMSAwMTEwIDAxMHggeHh4eCAqLworCS8qIENQUwkJCQkxMDExIDAxMTAgMDExeCB4eHh4ICovCisJLyogQktQVAkJCQkxMDExIDExMTAgeHh4eCB4eHh4ICovCisJLyogQW5kIHVuYWxsb2NhdGVkIGluc3RydWN0aW9ucy4uLgkJICAgICovCisJREVDT0RFX0VORAorfTsKKworY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0ga3Byb2JlX2RlY29kZV90aHVtYjE2X3RhYmxlW10gPSB7CisKKwkvKgorCSAqIFNoaWZ0IChpbW1lZGlhdGUpLCBhZGQsIHN1YnRyYWN0LCBtb3ZlLCBhbmQgY29tcGFyZQorCSAqCQkJCTAweHggeHh4eCB4eHh4IHh4eHgKKwkgKi8KKworCS8qIENNUCAoaW1tZWRpYXRlKQkJMDAxMCAxeHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9FTVVMQVRFCSgweGY4MDAsIDB4MjgwMCwgdDE2X2VtdWxhdGVfbG9yZWdzX3J3ZmxhZ3MpLAorCisJLyogQUREIChyZWdpc3RlcikJCTAwMDEgMTAweCB4eHh4IHh4eHggKi8KKwkvKiBTVUIgKHJlZ2lzdGVyKQkJMDAwMSAxMDF4IHh4eHggeHh4eCAqLworCS8qIExTTCAoaW1tZWRpYXRlKQkJMDAwMCAweHh4IHh4eHggeHh4eCAqLworCS8qIExTUiAoaW1tZWRpYXRlKQkJMDAwMCAxeHh4IHh4eHggeHh4eCAqLworCS8qIEFTUiAoaW1tZWRpYXRlKQkJMDAwMSAweHh4IHh4eHggeHh4eCAqLworCS8qIEFERCAoaW1tZWRpYXRlLCBUaHVtYikJMDAwMSAxMTB4IHh4eHggeHh4eCAqLworCS8qIFNVQiAoaW1tZWRpYXRlLCBUaHVtYikJMDAwMSAxMTF4IHh4eHggeHh4eCAqLworCS8qIE1PViAoaW1tZWRpYXRlKQkJMDAxMCAweHh4IHh4eHggeHh4eCAqLworCS8qIEFERCAoaW1tZWRpYXRlLCBUaHVtYikJMDAxMSAweHh4IHh4eHggeHh4eCAqLworCS8qIFNVQiAoaW1tZWRpYXRlLCBUaHVtYikJMDAxMSAxeHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9FTVVMQVRFCSgweGMwMDAsIDB4MDAwMCwgdDE2X2VtdWxhdGVfbG9yZWdzX25vaXRyd2ZsYWdzKSwKKworCS8qCisJICogMTYtYml0IFRodW1iIGRhdGEtcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKKwkgKgkJCQkwMTAwIDAweHggeHh4eCB4eHh4CisJICovCisKKwkvKiBUU1QgKHJlZ2lzdGVyKQkJMDEwMCAwMDEwIDAweHggeHh4eCAqLworCURFQ09ERV9FTVVMQVRFCSgweGZmYzAsIDB4NDIwMCwgdDE2X2VtdWxhdGVfbG9yZWdzX3J3ZmxhZ3MpLAorCS8qIENNUCAocmVnaXN0ZXIpCQkwMTAwIDAwMTAgMTB4eCB4eHh4ICovCisJLyogQ01OIChyZWdpc3RlcikJCTAxMDAgMDAxMCAxMXh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURQkoMHhmZjgwLCAweDQyODAsIHQxNl9lbXVsYXRlX2xvcmVnc19yd2ZsYWdzKSwKKwkvKiBBTkQgKHJlZ2lzdGVyKQkJMDEwMCAwMDAwIDAweHggeHh4eCAqLworCS8qIEVPUiAocmVnaXN0ZXIpCQkwMTAwIDAwMDAgMDF4eCB4eHh4ICovCisJLyogTFNMIChyZWdpc3RlcikJCTAxMDAgMDAwMCAxMHh4IHh4eHggKi8KKwkvKiBMU1IgKHJlZ2lzdGVyKQkJMDEwMCAwMDAwIDExeHggeHh4eCAqLworCS8qIEFTUiAocmVnaXN0ZXIpCQkwMTAwIDAwMDEgMDB4eCB4eHh4ICovCisJLyogQURDIChyZWdpc3RlcikJCTAxMDAgMDAwMSAwMXh4IHh4eHggKi8KKwkvKiBTQkMgKHJlZ2lzdGVyKQkJMDEwMCAwMDAxIDEweHggeHh4eCAqLworCS8qIFJPUiAocmVnaXN0ZXIpCQkwMTAwIDAwMDEgMTF4eCB4eHh4ICovCisJLyogUlNCIChpbW1lZGlhdGUpCQkwMTAwIDAwMTAgMDF4eCB4eHh4ICovCisJLyogT1JSIChyZWdpc3RlcikJCTAxMDAgMDAxMSAwMHh4IHh4eHggKi8KKwkvKiBNVUwJCQkJMDEwMCAwMDExIDAweHggeHh4eCAqLworCS8qIEJJQyAocmVnaXN0ZXIpCQkwMTAwIDAwMTEgMTB4eCB4eHh4ICovCisJLyogTVZOIChyZWdpc3RlcikJCTAxMDAgMDAxMSAxMHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURQkoMHhmYzAwLCAweDQwMDAsIHQxNl9lbXVsYXRlX2xvcmVnc19ub2l0cndmbGFncyksCisKKwkvKgorCSAqIFNwZWNpYWwgZGF0YSBpbnN0cnVjdGlvbnMgYW5kIGJyYW5jaCBhbmQgZXhjaGFuZ2UKKwkgKgkJCQkwMTAwIDAxeHggeHh4eCB4eHh4CisJICovCisKKwkvKiBCTFggcGMJCQkwMTAwIDAxMTEgMTExMSAxeHh4ICovCisJREVDT0RFX1JFSkVDVAkoMHhmZmY4LCAweDQ3ZjgpLAorCisJLyogQlggKHJlZ2lzdGVyKQkJMDEwMCAwMTExIDB4eHggeHh4eCAqLworCS8qIEJMWCAocmVnaXN0ZXIpCQkwMTAwIDAxMTEgMXh4eCB4eHh4ICovCisJREVDT0RFX1NJTVVMQVRFICgweGZmMDAsIDB4NDcwMCwgdDE2X3NpbXVsYXRlX2J4Ymx4KSwKKworCS8qIEFERCBwYywgcGMJCQkwMTAwIDAxMDAgMTExMSAxMTExICovCisJREVDT0RFX1JFSkVDVAkoMHhmZmZmLCAweDQ0ZmYpLAorCisJLyogQUREIChyZWdpc3RlcikJCTAxMDAgMDEwMCB4eHh4IHh4eHggKi8KKwkvKiBDTVAgKHJlZ2lzdGVyKQkJMDEwMCAwMTAxIHh4eHggeHh4eCAqLworCS8qIE1PViAocmVnaXN0ZXIpCQkwMTAwIDAxMTAgeHh4eCB4eHh4ICovCisJREVDT0RFX0NVU1RPTQkoMHhmYzAwLCAweDQ0MDAsIHQxNl9kZWNvZGVfaGlyZWdzKSwKKworCS8qCisJICogTG9hZCBmcm9tIExpdGVyYWwgUG9vbAorCSAqIExEUiAobGl0ZXJhbCkJCTAxMDAgMXh4eCB4eHh4IHh4eHgKKwkgKi8KKwlERUNPREVfU0lNVUxBVEUJKDB4ZjgwMCwgMHg0ODAwLCB0MTZfc2ltdWxhdGVfbGRyX2xpdGVyYWwpLAorCisJLyoKKwkgKiAxNi1iaXQgVGh1bWIgTG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMKKwkgKgkJCQkwMTAxIHh4eHggeHh4eCB4eHh4CisJICoJCQkJMDExeCB4eHh4IHh4eHggeHh4eAorCSAqCQkJCTEwMHggeHh4eCB4eHh4IHh4eHgKKwkgKi8KKworCS8qIFNUUiAocmVnaXN0ZXIpCQkwMTAxIDAwMHggeHh4eCB4eHh4ICovCisJLyogU1RSSCAocmVnaXN0ZXIpCQkwMTAxIDAwMXggeHh4eCB4eHh4ICovCisJLyogU1RSQiAocmVnaXN0ZXIpCQkwMTAxIDAxMHggeHh4eCB4eHh4ICovCisJLyogTERSU0IgKHJlZ2lzdGVyKQkJMDEwMSAwMTF4IHh4eHggeHh4eCAqLworCS8qIExEUiAocmVnaXN0ZXIpCQkwMTAxIDEwMHggeHh4eCB4eHh4ICovCisJLyogTERSSCAocmVnaXN0ZXIpCQkwMTAxIDEwMXggeHh4eCB4eHh4ICovCisJLyogTERSQiAocmVnaXN0ZXIpCQkwMTAxIDExMHggeHh4eCB4eHh4ICovCisJLyogTERSU0ggKHJlZ2lzdGVyKQkJMDEwMSAxMTF4IHh4eHggeHh4eCAqLworCS8qIFNUUiAoaW1tZWRpYXRlLCBUaHVtYikJMDExMCAweHh4IHh4eHggeHh4eCAqLworCS8qIExEUiAoaW1tZWRpYXRlLCBUaHVtYikJMDExMCAxeHh4IHh4eHggeHh4eCAqLworCS8qIFNUUkIgKGltbWVkaWF0ZSwgVGh1bWIpCTAxMTEgMHh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRFJCIChpbW1lZGlhdGUsIFRodW1iKQkwMTExIDF4eHggeHh4eCB4eHh4ICovCisJREVDT0RFX0VNVUxBVEUJKDB4YzAwMCwgMHg0MDAwLCB0MTZfZW11bGF0ZV9sb3JlZ3NfcndmbGFncyksCisJLyogU1RSSCAoaW1tZWRpYXRlLCBUaHVtYikJMTAwMCAweHh4IHh4eHggeHh4eCAqLworCS8qIExEUkggKGltbWVkaWF0ZSwgVGh1bWIpCTEwMDAgMXh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfRU1VTEFURQkoMHhmMDAwLCAweDgwMDAsIHQxNl9lbXVsYXRlX2xvcmVnc19yd2ZsYWdzKSwKKwkvKiBTVFIgKGltbWVkaWF0ZSwgVGh1bWIpCTEwMDEgMHh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRFIgKGltbWVkaWF0ZSwgVGh1bWIpCTEwMDEgMXh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfU0lNVUxBVEUJKDB4ZjAwMCwgMHg5MDAwLCB0MTZfc2ltdWxhdGVfbGRyc3RyX3NwX3JlbGF0aXZlKSwKKworCS8qCisJICogR2VuZXJhdGUgUEMtL1NQLXJlbGF0aXZlIGFkZHJlc3MKKwkgKiBBRFIgKGxpdGVyYWwpCQkxMDEwIDB4eHggeHh4eCB4eHh4CisJICogQUREIChTUCBwbHVzIGltbWVkaWF0ZSkJMTAxMCAxeHh4IHh4eHggeHh4eAorCSAqLworCURFQ09ERV9TSU1VTEFURQkoMHhmMDAwLCAweGEwMDAsIHQxNl9zaW11bGF0ZV9yZWxhZHIpLAorCisJLyoKKwkgKiBNaXNjZWxsYW5lb3VzIDE2LWJpdCBpbnN0cnVjdGlvbnMKKwkgKgkJCQkxMDExIHh4eHggeHh4eCB4eHh4CisJICovCisJREVDT0RFX1RBQkxFCSgweGYwMDAsIDB4YjAwMCwgdDE2X3RhYmxlXzEwMTEpLAorCisJLyogU1RNCQkJCTExMDAgMHh4eCB4eHh4IHh4eHggKi8KKwkvKiBMRE0JCQkJMTEwMCAxeHh4IHh4eHggeHh4eCAqLworCURFQ09ERV9FTVVMQVRFCSgweGYwMDAsIDB4YzAwMCwgdDE2X2VtdWxhdGVfbG9yZWdzX3J3ZmxhZ3MpLAorCisJLyoKKwkgKiBDb25kaXRpb25hbCBicmFuY2gsIGFuZCBTdXBlcnZpc29yIENhbGwKKwkgKi8KKworCS8qIFBlcm1hbmVudGx5IFVOREVGSU5FRAkxMTAxIDExMTAgeHh4eCB4eHh4ICovCisJLyogU1ZDCQkJCTExMDEgMTExMSB4eHh4IHh4eHggKi8KKwlERUNPREVfUkVKRUNUCSgweGZlMDAsIDB4ZGUwMCksCisKKwkvKiBDb25kaXRpb25hbCBicmFuY2gJCTExMDEgeHh4eCB4eHh4IHh4eHggKi8KKwlERUNPREVfQ1VTVE9NCSgweGYwMDAsIDB4ZDAwMCwgdDE2X2RlY29kZV9jb25kX2JyYW5jaCksCisKKwkvKgorCSAqIFVuY29uZGl0aW9uYWwgYnJhbmNoCisJICogQgkJCQkxMTEwIDB4eHggeHh4eCB4eHh4CisJICovCisJREVDT0RFX1NJTVVMQVRFCSgweGY4MDAsIDB4ZTAwMCwgdDE2X3NpbXVsYXRlX2JyYW5jaCksCisKKwlERUNPREVfRU5ECit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2twcm9iZXMgdGh1bWJfY2hlY2tfY2ModW5zaWduZWQgbG9uZyBjcHNyKQoreworCWlmICh1bmxpa2VseShpbl9pdF9ibG9jayhjcHNyKSkpCisJCXJldHVybiBrcHJvYmVfY29uZGl0aW9uX2NoZWNrc1tjdXJyZW50X2NvbmQoY3BzcildKGNwc3IpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgdGh1bWIxNl9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJlZ3MtPkFSTV9wYyArPSAyOworCXAtPmFpbnNuLmluc25faGFuZGxlcihwLCByZWdzKTsKKwlyZWdzLT5BUk1fY3BzciA9IGl0X2FkdmFuY2UocmVncy0+QVJNX2Nwc3IpOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgdGh1bWIzMl9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJlZ3MtPkFSTV9wYyArPSA0OworCXAtPmFpbnNuLmluc25faGFuZGxlcihwLCByZWdzKTsKKwlyZWdzLT5BUk1fY3BzciA9IGl0X2FkdmFuY2UocmVncy0+QVJNX2Nwc3IpOworfQorCitlbnVtIGtwcm9iZV9pbnNuIF9fa3Byb2JlcwordGh1bWIxNl9rcHJvYmVfZGVjb2RlX2luc24oa3Byb2JlX29wY29kZV90IGluc24sIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKmFzaSkKK3sKKwlhc2ktPmluc25fc2luZ2xlc3RlcCA9IHRodW1iMTZfc2luZ2xlc3RlcDsKKwlhc2ktPmluc25fY2hlY2tfY2MgPSB0aHVtYl9jaGVja19jYzsKKwlyZXR1cm4ga3Byb2JlX2RlY29kZV9pbnNuKGluc24sIGFzaSwga3Byb2JlX2RlY29kZV90aHVtYjE2X3RhYmxlLCB0cnVlKTsKK30KKworZW51bSBrcHJvYmVfaW5zbiBfX2twcm9iZXMKK3RodW1iMzJfa3Byb2JlX2RlY29kZV9pbnNuKGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2kpCit7CisJYXNpLT5pbnNuX3NpbmdsZXN0ZXAgPSB0aHVtYjMyX3NpbmdsZXN0ZXA7CisJYXNpLT5pbnNuX2NoZWNrX2NjID0gdGh1bWJfY2hlY2tfY2M7CisJcmV0dXJuIGtwcm9iZV9kZWNvZGVfaW5zbihpbnNuLCBhc2ksIGtwcm9iZV9kZWNvZGVfdGh1bWIzMl90YWJsZSwgdHJ1ZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuYwppbmRleCAxNjU2Yzg3Li4xMjljMTE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTI4LDE0ICsyOCwxNiBAQAogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKKyNpbmNsdWRlICJrcHJvYmVzLmgiCisKICNkZWZpbmUgTUlOX1NUQUNLX1NJWkUoYWRkcikgCQkJCVwKIAltaW4oKHVuc2lnbmVkIGxvbmcpTUFYX1NUQUNLX1NJWkUsCQlcCiAJICAgICh1bnNpZ25lZCBsb25nKWN1cnJlbnRfdGhyZWFkX2luZm8oKSArIFRIUkVBRF9TVEFSVF9TUCAtIChhZGRyKSkKIAotI2RlZmluZSBmbHVzaF9pbnNucyhhZGRyLCBjbnQpIAkJCQlcCisjZGVmaW5lIGZsdXNoX2luc25zKGFkZHIsIHNpemUpCQkJCVwKIAlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpKGFkZHIpLAlcCiAJCQkgICAodW5zaWduZWQgbG9uZykoYWRkcikgKwlcCi0JCQkgICBzaXplb2Yoa3Byb2JlX29wY29kZV90KSAqIChjbnQpKQorCQkJICAgKHNpemUpKQogCiAvKiBVc2VkIGFzIGEgbWFya2VyIGluIEFSTV9wYyB0byBub3RlIHdoZW4gd2UncmUgaW4gYSBqcHJvYmUuICovCiAjZGVmaW5lIEpQUk9CRV9NQUdJQ19BRERSCQkweGZmZmZmZmZmCkBAIC00OSwxNiArNTEsMzUgQEAKIAlrcHJvYmVfb3Bjb2RlX3QgaW5zbjsKIAlrcHJvYmVfb3Bjb2RlX3QgdG1wX2luc25bTUFYX0lOU05fU0laRV07CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcC0+YWRkcjsKKwlib29sIHRodW1iOworCWtwcm9iZV9kZWNvZGVfaW5zbl90ICpkZWNvZGVfaW5zbjsKIAlpbnQgaXM7CiAKLQlpZiAoYWRkciAmIDB4MyB8fCBpbl9leGNlcHRpb25fdGV4dChhZGRyKSkKKwlpZiAoaW5fZXhjZXB0aW9uX3RleHQoYWRkcikpCiAJCXJldHVybiAtRUlOVkFMOwogCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwl0aHVtYiA9IHRydWU7CisJYWRkciAmPSB+MTsgLyogQml0IDAgd291bGQgbm9ybWFsbHkgYmUgc2V0IHRvIGluZGljYXRlIFRodW1iIGNvZGUgKi8KKwlpbnNuID0gKCh1MTYgKilhZGRyKVswXTsKKwlpZiAoaXNfd2lkZV9pbnN0cnVjdGlvbihpbnNuKSkgeworCQlpbnNuIDw8PSAxNjsKKwkJaW5zbiB8PSAoKHUxNiAqKWFkZHIpWzFdOworCQlkZWNvZGVfaW5zbiA9IHRodW1iMzJfa3Byb2JlX2RlY29kZV9pbnNuOworCX0gZWxzZQorCQlkZWNvZGVfaW5zbiA9IHRodW1iMTZfa3Byb2JlX2RlY29kZV9pbnNuOworI2Vsc2UgLyogIUNPTkZJR19USFVNQjJfS0VSTkVMICovCisJdGh1bWIgPSBmYWxzZTsKKwlpZiAoYWRkciAmIDB4MykKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaW5zbiA9ICpwLT5hZGRyOworCWRlY29kZV9pbnNuID0gYXJtX2twcm9iZV9kZWNvZGVfaW5zbjsKKyNlbmRpZgorCiAJcC0+b3Bjb2RlID0gaW5zbjsKIAlwLT5haW5zbi5pbnNuID0gdG1wX2luc247CiAKLQlzd2l0Y2ggKGFybV9rcHJvYmVfZGVjb2RlX2luc24oaW5zbiwgJnAtPmFpbnNuKSkgeworCXN3aXRjaCAoKCpkZWNvZGVfaW5zbikoaW5zbiwgJnAtPmFpbnNuKSkgewogCWNhc2UgSU5TTl9SRUpFQ1RFRDoJLyogbm90IHN1cHBvcnRlZCAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNjgsNyArODksMTAgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCQlmb3IgKGlzID0gMDsgaXMgPCBNQVhfSU5TTl9TSVpFOyArK2lzKQogCQkJcC0+YWluc24uaW5zbltpc10gPSB0bXBfaW5zbltpc107Ci0JCWZsdXNoX2luc25zKHAtPmFpbnNuLmluc24sIE1BWF9JTlNOX1NJWkUpOworCQlmbHVzaF9pbnNucyhwLT5haW5zbi5pbnNuLAorCQkJCXNpemVvZihwLT5haW5zbi5pbnNuWzBdKSAqIE1BWF9JTlNOX1NJWkUpOworCQlwLT5haW5zbi5pbnNuX2ZuID0gKGtwcm9iZV9pbnNuX2ZuX3QgKikKKwkJCQkJKCh1aW50cHRyX3QpcC0+YWluc24uaW5zbiB8IHRodW1iKTsKIAkJYnJlYWs7CiAKIAljYXNlIElOU05fR09PRF9OT19TTE9UOgkvKiBpbnN0cnVjdGlvbiBkb2Vzbid0IG5lZWQgaW5zbiBzbG90ICovCkBAIC03OSwyNCArMTAzLDg4IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAorCisvKgorICogRm9yIGEgMzItYml0IFRodW1iIGJyZWFrcG9pbnQgc3Bhbm5pbmcgdHdvIG1lbW9yeSB3b3JkcyB3ZSBuZWVkIHRvIHRha2UKKyAqIHNwZWNpYWwgcHJlY2F1dGlvbnMgdG8gaW5zZXJ0IHRoZSBicmVha3BvaW50IGF0b21pY2FsbHksIGVzcGVjaWFsbHkgb24gU01QCisgKiBzeXN0ZW1zLiBUaGlzIGlzIGFjaGlldmVkIGJ5IGNhbGxpbmcgdGhpcyBhcm1pbmcgZnVuY3Rpb24gdXNpbmcgc3RvcF9tYWNoaW5lLgorICovCitzdGF0aWMgaW50IF9fa3Byb2JlcyBzZXRfdDMyX2JyZWFrcG9pbnQodm9pZCAqYWRkcikKK3sKKwkoKHUxNiAqKWFkZHIpWzBdID0gS1BST0JFX1RIVU1CMzJfQlJFQUtQT0lOVF9JTlNUUlVDVElPTiA+PiAxNjsKKwkoKHUxNiAqKWFkZHIpWzFdID0gS1BST0JFX1RIVU1CMzJfQlJFQUtQT0lOVF9JTlNUUlVDVElPTiAmIDB4ZmZmZjsKKwlmbHVzaF9pbnNucyhhZGRyLCAyKnNpemVvZih1MTYpKTsKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBfX2twcm9iZXMgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7Ci0JKnAtPmFkZHIgPSBLUFJPQkVfQlJFQUtQT0lOVF9JTlNUUlVDVElPTjsKLQlmbHVzaF9pbnNucyhwLT5hZGRyLCAxKTsKKwl1aW50cHRyX3QgYWRkciA9ICh1aW50cHRyX3QpcC0+YWRkciAmIH4xOyAvKiBSZW1vdmUgYW55IFRodW1iIGZsYWcgKi8KKworCWlmICghaXNfd2lkZV9pbnN0cnVjdGlvbihwLT5vcGNvZGUpKSB7CisJCSoodTE2ICopYWRkciA9IEtQUk9CRV9USFVNQjE2X0JSRUFLUE9JTlRfSU5TVFJVQ1RJT047CisJCWZsdXNoX2luc25zKGFkZHIsIHNpemVvZih1MTYpKTsKKwl9IGVsc2UgaWYgKGFkZHIgJiAyKSB7CisJCS8qIEEgMzItYml0IGluc3RydWN0aW9uIHNwYW5uaW5nIHR3byB3b3JkcyBuZWVkcyBzcGVjaWFsIGNhcmUgKi8KKwkJc3RvcF9tYWNoaW5lKHNldF90MzJfYnJlYWtwb2ludCwgKHZvaWQgKilhZGRyLCAmY3B1X29ubGluZV9tYXApOworCX0gZWxzZSB7CisJCS8qIFdvcmQgYWxpZ25lZCAzMi1iaXQgaW5zdHJ1Y3Rpb24gY2FuIGJlIHdyaXR0ZW4gYXRvbWljYWxseSAqLworCQl1MzIgYmtwID0gS1BST0JFX1RIVU1CMzJfQlJFQUtQT0lOVF9JTlNUUlVDVElPTjsKKyNpZm5kZWYgX19BUk1FQl9fIC8qIFN3YXAgaGFsZndvcmRzIGZvciBsaXR0bGUtZW5kaWFuICovCisJCWJrcCA9IChia3AgPj4gMTYpIHwgKGJrcCA8PCAxNik7CisjZW5kaWYKKwkJKih1MzIgKilhZGRyID0gYmtwOworCQlmbHVzaF9pbnNucyhhZGRyLCBzaXplb2YodTMyKSk7CisJfQogfQogCisjZWxzZSAvKiAhQ09ORklHX1RIVU1CMl9LRVJORUwgKi8KKwordm9pZCBfX2twcm9iZXMgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit7CisJa3Byb2JlX29wY29kZV90IGluc24gPSBwLT5vcGNvZGU7CisJa3Byb2JlX29wY29kZV90IGJya3AgPSBLUFJPQkVfQVJNX0JSRUFLUE9JTlRfSU5TVFJVQ1RJT047CisJaWYgKGluc24gPj0gMHhlMDAwMDAwMCkKKwkJYnJrcCB8PSAweGUwMDAwMDAwOyAgLyogVW5jb25kaXRpb25hbCBpbnN0cnVjdGlvbiAqLworCWVsc2UKKwkJYnJrcCB8PSBpbnNuICYgMHhmMDAwMDAwMDsgIC8qIENvcHkgY29uZGl0aW9uIGZyb20gaW5zbiAqLworCSpwLT5hZGRyID0gYnJrcDsKKwlmbHVzaF9pbnNucyhwLT5hZGRyLCBzaXplb2YocC0+YWRkclswXSkpOworfQorCisjZW5kaWYgLyogIUNPTkZJR19USFVNQjJfS0VSTkVMICovCisKIC8qCiAgKiBUaGUgYWN0dWFsIGRpc2FybWluZyBpcyBkb25lIGhlcmUgb24gZWFjaCBDUFUgYW5kIHN5bmNocm9uaXplZCB1c2luZwogICogc3RvcF9tYWNoaW5lLiBUaGlzIHN5bmNocm9uaXphdGlvbiBpcyBuZWNlc3Nhcnkgb24gU01QIHRvIGF2b2lkIHJlbW92aW5nCiAgKiBhIHByb2JlIGJldHdlZW4gdGhlIG1vbWVudCB0aGUgJ1VuZGVmaW5lZCBJbnN0cnVjdGlvbicgZXhjZXB0aW9uIGlzIHJhaXNlZAogICogYW5kIHRoZSBtb21lbnQgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIHJlYWRzIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiBmcm9tCi0gKiBtZW1vcnkuCisgKiBtZW1vcnkuIEl0IGlzIGFsc28gbmVlZGVkIHRvIGF0b21pY2FsbHkgc2V0IHRoZSB0d28gaGFsZi13b3JkcyBvZiBhIDMyLWJpdAorICogVGh1bWIgYnJlYWtwb2ludC4KICAqLwogaW50IF9fa3Byb2JlcyBfX2FyY2hfZGlzYXJtX2twcm9iZSh2b2lkICpwKQogewogCXN0cnVjdCBrcHJvYmUgKmtwID0gcDsKKyNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAorCXUxNiAqYWRkciA9ICh1MTYgKikoKHVpbnRwdHJfdClrcC0+YWRkciAmIH4xKTsKKwlrcHJvYmVfb3Bjb2RlX3QgaW5zbiA9IGtwLT5vcGNvZGU7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWlmIChpc193aWRlX2luc3RydWN0aW9uKGluc24pKSB7CisJCSgodTE2ICopYWRkcilbMF0gPSBpbnNuPj4xNjsKKwkJKCh1MTYgKilhZGRyKVsxXSA9IGluc247CisJCWxlbiA9IDIqc2l6ZW9mKHUxNik7CisJfSBlbHNlIHsKKwkJKCh1MTYgKilhZGRyKVswXSA9IGluc247CisJCWxlbiA9IHNpemVvZih1MTYpOworCX0KKwlmbHVzaF9pbnNucyhhZGRyLCBsZW4pOworCisjZWxzZSAvKiAhQ09ORklHX1RIVU1CMl9LRVJORUwgKi8KIAkqa3AtPmFkZHIgPSBrcC0+b3Bjb2RlOwotCWZsdXNoX2luc25zKGtwLT5hZGRyLCAxKTsKKwlmbHVzaF9pbnNucyhrcC0+YWRkciwgc2l6ZW9mKGtwLT5hZGRyWzBdKSk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMwLDEyICsyMTgsMjQgQEAKIAlfX2dldF9jcHVfdmFyKGN1cnJlbnRfa3Byb2JlKSA9IHA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBzaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJCSBzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQorc3RhdGljIHZvaWQgX19rcHJvYmVzCitzaW5nbGVzdGVwX3NraXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwlyZWdzLT5BUk1fY3BzciA9IGl0X2FkdmFuY2UocmVncy0+QVJNX2Nwc3IpOworCWlmIChpc193aWRlX2luc3RydWN0aW9uKHAtPm9wY29kZSkpCisJCXJlZ3MtPkFSTV9wYyArPSA0OworCWVsc2UKKwkJcmVncy0+QVJNX3BjICs9IDI7CisjZWxzZQogCXJlZ3MtPkFSTV9wYyArPSA0OwotCWlmIChwLT5haW5zbi5pbnNuX2NoZWNrX2NjKHJlZ3MtPkFSTV9jcHNyKSkKLQkJcC0+YWluc24uaW5zbl9oYW5kbGVyKHAsIHJlZ3MpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2twcm9iZXMKK3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IpCit7CisJcC0+YWluc24uaW5zbl9zaW5nbGVzdGVwKHAsIHJlZ3MpOwogfQogCiAvKgpAQCAtMTQ5LDExICsyNDksMjMgQEAKIHsKIAlzdHJ1Y3Qga3Byb2JlICpwLCAqY3VyOwogCXN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2I7Ci0Ja3Byb2JlX29wY29kZV90CSphZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKXJlZ3MtPkFSTV9wYzsKIAogCWtjYiA9IGdldF9rcHJvYmVfY3RsYmxrKCk7CiAJY3VyID0ga3Byb2JlX3J1bm5pbmcoKTsKLQlwID0gZ2V0X2twcm9iZShhZGRyKTsKKworI2lmZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCisJLyoKKwkgKiBGaXJzdCBsb29rIGZvciBhIHByb2JlIHdoaWNoIHdhcyByZWdpc3RlcmVkIHVzaW5nIGFuIGFkZHJlc3Mgd2l0aAorCSAqIGJpdCAwIHNldCwgdGhpcyBpcyB0aGUgdXN1YWwgc2l0dWF0aW9uIGZvciBwb2ludGVycyB0byBUaHVtYiBjb2RlLgorCSAqIElmIG5vdCBmb3VuZCwgZmFsbGJhY2sgdG8gbG9va2luZyBmb3Igb25lIHdpdGggYml0IDAgY2xlYXIuCisJICovCisJcCA9IGdldF9rcHJvYmUoKGtwcm9iZV9vcGNvZGVfdCAqKShyZWdzLT5BUk1fcGMgfCAxKSk7CisJaWYgKCFwKQorCQlwID0gZ2V0X2twcm9iZSgoa3Byb2JlX29wY29kZV90ICopcmVncy0+QVJNX3BjKTsKKworI2Vsc2UgLyogISBDT05GSUdfVEhVTUIyX0tFUk5FTCAqLworCXAgPSBnZXRfa3Byb2JlKChrcHJvYmVfb3Bjb2RlX3QgKilyZWdzLT5BUk1fcGMpOworI2VuZGlmCiAKIAlpZiAocCkgewogCQlpZiAoY3VyKSB7CkBAIC0xNzMsNyArMjg1LDggQEAKIAkJCQkvKiBpbXBvc3NpYmxlIGNhc2VzICovCiAJCQkJQlVHKCk7CiAJCQl9Ci0JCX0gZWxzZSB7CisJCX0gZWxzZSBpZiAocC0+YWluc24uaW5zbl9jaGVja19jYyhyZWdzLT5BUk1fY3BzcikpIHsKKwkJCS8qIFByb2JlIGhpdCBhbmQgY29uZGl0aW9uYWwgZXhlY3V0aW9uIGNoZWNrIG9rLiAqLwogCQkJc2V0X2N1cnJlbnRfa3Byb2JlKHApOwogCQkJa2NiLT5rcHJvYmVfc3RhdHVzID0gS1BST0JFX0hJVF9BQ1RJVkU7CiAKQEAgLTE5Myw2ICszMDYsMTMgQEAKIAkJCQl9CiAJCQkJcmVzZXRfY3VycmVudF9rcHJvYmUoKTsKIAkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBQcm9iZSBoaXQgYnV0IGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBjaGVjayBmYWlsZWQsCisJCQkgKiBzbyBqdXN0IHNraXAgdGhlIGluc3RydWN0aW9uIGFuZCBjb250aW51ZSBhcyBpZgorCQkJICogbm90aGluZyBoYWQgaGFwcGVuZWQuCisJCQkgKi8KKwkJCXNpbmdsZXN0ZXBfc2tpcChwLCByZWdzKTsKIAkJfQogCX0gZWxzZSBpZiAoY3VyKSB7CiAJCS8qIFdlIHByb2JhYmx5IGhpdCBhIGpwcm9iZS4gIENhbGwgaXRzIGJyZWFrIGhhbmRsZXIuICovCkBAIC0zMDAsNyArNDIwLDExIEBACiAJCSJibAl0cmFtcG9saW5lX2hhbmRsZXIJXG5cdCIKIAkJIm1vdglsciwgcjAJCQlcblx0IgogCQkibGRtaWEJc3AhLCB7cjAgLSByMTF9CQlcblx0IgorI2lmZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCisJCSJieAlscgkJCVxuXHQiCisjZWxzZQogCQkibW92CXBjLCBscgkJCVxuXHQiCisjZW5kaWYKIAkJOiA6IDogIm1lbW9yeSIpOwogfQogCkBAIC0zNzgsMTEgKzUwMiwyMiBAQAogCXN0cnVjdCBqcHJvYmUgKmpwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBqcHJvYmUsIGtwKTsKIAlzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiID0gZ2V0X2twcm9iZV9jdGxibGsoKTsKIAlsb25nIHNwX2FkZHIgPSByZWdzLT5BUk1fc3A7CisJbG9uZyBjcHNyOwogCiAJa2NiLT5qcHJvYmVfc2F2ZWRfcmVncyA9ICpyZWdzOwogCW1lbWNweShrY2ItPmpwcm9iZXNfc3RhY2ssICh2b2lkICopc3BfYWRkciwgTUlOX1NUQUNLX1NJWkUoc3BfYWRkcikpOwogCXJlZ3MtPkFSTV9wYyA9IChsb25nKWpwLT5lbnRyeTsKLQlyZWdzLT5BUk1fY3BzciB8PSBQU1JfSV9CSVQ7CisKKwljcHNyID0gcmVncy0+QVJNX2Nwc3IgfCBQU1JfSV9CSVQ7CisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwkvKiBTZXQgY29ycmVjdCBUaHVtYiBzdGF0ZSBpbiBjcHNyICovCisJaWYgKHJlZ3MtPkFSTV9wYyAmIDEpCisJCWNwc3IgfD0gUFNSX1RfQklUOworCWVsc2UKKwkJY3BzciAmPSB+UFNSX1RfQklUOworI2VuZGlmCisJcmVncy0+QVJNX2Nwc3IgPSBjcHNyOworCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJcmV0dXJuIDE7CiB9CkBAIC00MDQsNyArNTM5LDEyIEBACiAJCSAqIFRoaXMgaXMgdG8gcHJldmVudCBhbnkgc2ltdWxhdGVkIGluc3RydWN0aW9uIGZyb20gd3JpdGluZwogCQkgKiBvdmVyIHRoZSByZWdzIHdoZW4gdGhleSBhcmUgYWNjZXNzaW5nIHRoZSBzdGFjay4KIAkJICovCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwkJInN1YiAgICByMCwgJTAsICUxCQlcblx0IgorCQkibW92ICAgIHNwLCByMAkJCVxuXHQiCisjZWxzZQogCQkic3ViICAgIHNwLCAlMCwgJTEJCVxuXHQiCisjZW5kaWYKIAkJImxkciAgICByMCwgPSJfX3N0cmluZ2lmeShKUFJPQkVfTUFHSUNfQUREUikiXG5cdCIKIAkJInN0ciAgICAlMCwgW3NwLCAlMl0JCVxuXHQiCiAJCSJzdHIgICAgcjAsIFtzcCwgJTNdCQlcblx0IgpAQCAtNDE1LDE1ICs1NTUsMjggQEAKIAkJICogUmV0dXJuIHRvIHRoZSBjb250ZXh0IHNhdmVkIGJ5IHNldGptcF9wcmVfaGFuZGxlcgogCQkgKiBhbmQgcmVzdG9yZWQgYnkgbG9uZ2ptcF9icmVha19oYW5kbGVyLgogCQkgKi8KKyNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAorCQkibGRyCWxyLCBbc3AsICUyXQkJXG5cdCIgLyogbHIgPSBzYXZlZCBzcCAqLworCQkibGRyZAlyMCwgcjEsIFtzcCwgJTVdCVxuXHQiIC8qIHIwLHIxID0gc2F2ZWQgbHIscGMgKi8KKwkJImxkcglyMiwgW3NwLCAlNF0JCVxuXHQiIC8qIHIyID0gc2F2ZWQgcHNyICovCisJCSJzdG1kYglsciEsIHtyMCwgcjEsIHIyfQlcblx0IiAvKiBwdXNoIHNhdmVkIGxyIGFuZCAqLworCQkJCQkJICAgICAgLyogcmZlIGNvbnRleHQgKi8KKwkJImxkbWlhCXNwLCB7cjAgLSByMTJ9CQlcblx0IgorCQkibW92CXNwLCBscgkJCVxuXHQiCisJCSJsZHIJbHIsIFtzcF0sICM0CQlcblx0IgorCQkicmZlaWEJc3AhCQkJXG5cdCIKKyNlbHNlCiAJCSJsZHIJcjAsIFtzcCwgJTRdCQlcblx0IgogCQkibXNyCWNwc3JfY3hzZiwgcjAJCVxuXHQiCiAJCSJsZG1pYQlzcCwge3IwIC0gcGN9CQlcblx0IgorI2VuZGlmCiAJCToKIAkJOiAiciIgKGtjYi0+anByb2JlX3NhdmVkX3JlZ3MuQVJNX3NwKSwKIAkJICAiSSIgKHNpemVvZihzdHJ1Y3QgcHRfcmVncykgKiAyKSwKIAkJICAiSiIgKG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBBUk1fc3ApKSwKIAkJICAiSiIgKG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBBUk1fcGMpKSwKLQkJICAiSiIgKG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBBUk1fY3BzcikpCisJCSAgIkoiIChvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgQVJNX2Nwc3IpKSwKKwkJICAiSiIgKG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBBUk1fbHIpKQogCQk6ICJtZW1vcnkiLCAiY2MiKTsKIH0KIApAQCAtNDYwLDE3ICs2MTMsNDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB1bmRlZl9ob29rIGtwcm9iZXNfYnJlYWtfaG9vayA9IHsKLQkuaW5zdHJfbWFzawk9IDB4ZmZmZmZmZmYsCi0JLmluc3RyX3ZhbAk9IEtQUk9CRV9CUkVBS1BPSU5UX0lOU1RSVUNUSU9OLAorI2lmZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCisKK3N0YXRpYyBzdHJ1Y3QgdW5kZWZfaG9vayBrcHJvYmVzX3RodW1iMTZfYnJlYWtfaG9vayA9IHsKKwkuaW5zdHJfbWFzawk9IDB4ZmZmZiwKKwkuaW5zdHJfdmFsCT0gS1BST0JFX1RIVU1CMTZfQlJFQUtQT0lOVF9JTlNUUlVDVElPTiwKIAkuY3Bzcl9tYXNrCT0gTU9ERV9NQVNLLAogCS5jcHNyX3ZhbAk9IFNWQ19NT0RFLAogCS5mbgkJPSBrcHJvYmVfdHJhcF9oYW5kbGVyLAogfTsKIAorc3RhdGljIHN0cnVjdCB1bmRlZl9ob29rIGtwcm9iZXNfdGh1bWIzMl9icmVha19ob29rID0geworCS5pbnN0cl9tYXNrCT0gMHhmZmZmZmZmZiwKKwkuaW5zdHJfdmFsCT0gS1BST0JFX1RIVU1CMzJfQlJFQUtQT0lOVF9JTlNUUlVDVElPTiwKKwkuY3Bzcl9tYXNrCT0gTU9ERV9NQVNLLAorCS5jcHNyX3ZhbAk9IFNWQ19NT0RFLAorCS5mbgkJPSBrcHJvYmVfdHJhcF9oYW5kbGVyLAorfTsKKworI2Vsc2UgIC8qICFDT05GSUdfVEhVTUIyX0tFUk5FTCAqLworCitzdGF0aWMgc3RydWN0IHVuZGVmX2hvb2sga3Byb2Jlc19hcm1fYnJlYWtfaG9vayA9IHsKKwkuaW5zdHJfbWFzawk9IDB4MGZmZmZmZmYsCisJLmluc3RyX3ZhbAk9IEtQUk9CRV9BUk1fQlJFQUtQT0lOVF9JTlNUUlVDVElPTiwKKwkuY3Bzcl9tYXNrCT0gTU9ERV9NQVNLLAorCS5jcHNyX3ZhbAk9IFNWQ19NT0RFLAorCS5mbgkJPSBrcHJvYmVfdHJhcF9oYW5kbGVyLAorfTsKKworI2VuZGlmIC8qICFDT05GSUdfVEhVTUIyX0tFUk5FTCAqLworCiBpbnQgX19pbml0IGFyY2hfaW5pdF9rcHJvYmVzKCkKIHsKIAlhcm1fa3Byb2JlX2RlY29kZV9pbml0KCk7Ci0JcmVnaXN0ZXJfdW5kZWZfaG9vaygma3Byb2Jlc19icmVha19ob29rKTsKKyNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAorCXJlZ2lzdGVyX3VuZGVmX2hvb2soJmtwcm9iZXNfdGh1bWIxNl9icmVha19ob29rKTsKKwlyZWdpc3Rlcl91bmRlZl9ob29rKCZrcHJvYmVzX3RodW1iMzJfYnJlYWtfaG9vayk7CisjZWxzZQorCXJlZ2lzdGVyX3VuZGVmX2hvb2soJmtwcm9iZXNfYXJtX2JyZWFrX2hvb2spOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5oIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmFlZGEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuaApAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqIGFyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSm9uIE1lZGh1cnN0IDx0aXh5QHl4aXQuY28udWs+LgorICoKKyAqIFNvbWUgY29udGVudHMgbW92ZWQgaGVyZSBmcm9tIGFyY2gvYXJtL2luY2x1ZGUvYXNtL2twcm9iZXMuaCB3aGljaCBpcworICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IE1vdG9yb2xhIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfQVJNX0tFUk5FTF9LUFJPQkVTX0gKKyNkZWZpbmUgX0FSTV9LRVJORUxfS1BST0JFU19ICisKKy8qCisgKiBUaGVzZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zIG11c3QgYmUgdW5pcXVlIGFuZAorICogcmVzZXJ2ZWQgc29sZWx5IGZvciBrcHJvYmVzJyB1c2UuCisgKi8KKyNkZWZpbmUgS1BST0JFX0FSTV9CUkVBS1BPSU5UX0lOU1RSVUNUSU9OCTB4MDdmMDAxZjgKKyNkZWZpbmUgS1BST0JFX1RIVU1CMTZfQlJFQUtQT0lOVF9JTlNUUlVDVElPTgkweGRlMTgKKyNkZWZpbmUgS1BST0JFX1RIVU1CMzJfQlJFQUtQT0lOVF9JTlNUUlVDVElPTgkweGY3ZjBhMDE4CisKKworZW51bSBrcHJvYmVfaW5zbiB7CisJSU5TTl9SRUpFQ1RFRCwKKwlJTlNOX0dPT0QsCisJSU5TTl9HT09EX05PX1NMT1QKK307CisKK3R5cGVkZWYgZW51bSBrcHJvYmVfaW5zbiAoa3Byb2JlX2RlY29kZV9pbnNuX3QpKGtwcm9iZV9vcGNvZGVfdCwKKwkJCQkJCXN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKik7CisKKyNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAorCitlbnVtIGtwcm9iZV9pbnNuIHRodW1iMTZfa3Byb2JlX2RlY29kZV9pbnNuKGtwcm9iZV9vcGNvZGVfdCwKKwkJCQkJCXN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKik7CitlbnVtIGtwcm9iZV9pbnNuIHRodW1iMzJfa3Byb2JlX2RlY29kZV9pbnNuKGtwcm9iZV9vcGNvZGVfdCwKKwkJCQkJCXN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKik7CisKKyNlbHNlIC8qICFDT05GSUdfVEhVTUIyX0tFUk5FTCAqLworCitlbnVtIGtwcm9iZV9pbnNuIGFybV9rcHJvYmVfZGVjb2RlX2luc24oa3Byb2JlX29wY29kZV90LAorCQkJCQlzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICopOworI2VuZGlmCisKK3ZvaWQgX19pbml0IGFybV9rcHJvYmVfZGVjb2RlX2luaXQodm9pZCk7CisKK2V4dGVybiBrcHJvYmVfY2hlY2tfY2MgKiBjb25zdCBrcHJvYmVfY29uZGl0aW9uX2NoZWNrc1sxNl07CisKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA3CisKKy8qIHN0cl9wY19vZmZzZXQgaXMgYXJjaGl0ZWN0dXJhbGx5IGRlZmluZWQgZnJvbSBBUk12NyBvbndhcmRzICovCisjZGVmaW5lIHN0cl9wY19vZmZzZXQgOAorI2RlZmluZSBmaW5kX3N0cl9wY19vZmZzZXQoKQorCisjZWxzZSAvKiBfX0xJTlVYX0FSTV9BUkNIX18gPCA3ICovCisKKy8qIFdlIG5lZWQgYSBydW4tdGltZSBjaGVjayB0byBkZXRlcm1pbmUgc3RyX3BjX29mZnNldCAqLworZXh0ZXJuIGludCBzdHJfcGNfb2Zmc2V0Owordm9pZCBfX2luaXQgZmluZF9zdHJfcGNfb2Zmc2V0KHZvaWQpOworCisjZW5kaWYKKworCisvKgorICogVXBkYXRlIElUU1RBVEUgYWZ0ZXIgbm9ybWFsIGV4ZWN1dGlvbiBvZiBhbiBJVCBibG9jayBpbnN0cnVjdGlvbi4KKyAqCisgKiBUaGUgOCBJVCBzdGF0ZSBiaXRzIGFyZSBzcGxpdCBpbnRvIHR3byBwYXJ0cyBpbiBDUFNSOgorICoJSVRTVEFURTwxOjA+IGFyZSBpbiBDUFNSPDI2OjI1PgorICoJSVRTVEFURTw3OjI+IGFyZSBpbiBDUFNSPDE1OjEwPgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaXRfYWR2YW5jZSh1bnNpZ25lZCBsb25nIGNwc3IpCisJeworCWlmICgoY3BzciAmIDB4MDYwMDA0MDApID09IDApIHsKKwkJLyogSVRTVEFURTwyOjA+ID09IDAgbWVhbnMgZW5kIG9mIElUIGJsb2NrLCBzbyBjbGVhciBJVCBzdGF0ZSAqLworCQljcHNyICY9IH5QU1JfSVRfTUFTSzsKKwl9IGVsc2UgeworCQkvKiBXZSBuZWVkIHRvIHNoaWZ0IGxlZnQgSVRTVEFURTw0OjA+ICovCisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWFzayA9IDB4MDYwMDFjMDA7ICAvKiBNYXNrIElUU1RBVEU8NDowPiAqLworCQl1bnNpZ25lZCBsb25nIGl0ID0gY3BzciAmIG1hc2s7CisJCWl0IDw8PSAxOworCQlpdCB8PSBpdCA+PiAoMjcgLSAxMCk7ICAvKiBDYXJyeSBJVFNUQVRFPDI+IHRvIGNvcnJlY3QgcGxhY2UgKi8KKwkJaXQgJj0gbWFzazsKKwkJY3BzciAmPSB+bWFzazsKKwkJY3BzciB8PSBpdDsKKwl9CisJcmV0dXJuIGNwc3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2twcm9iZXMgYnhfd3JpdGVfcGMobG9uZyBwY3YsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWxvbmcgY3BzciA9IHJlZ3MtPkFSTV9jcHNyOworCWlmIChwY3YgJiAweDEpIHsKKwkJY3BzciB8PSBQU1JfVF9CSVQ7CisJCXBjdiAmPSB+MHgxOworCX0gZWxzZSB7CisJCWNwc3IgJj0gflBTUl9UX0JJVDsKKwkJcGN2ICY9IH4weDI7CS8qIEF2b2lkIFVOUFJFRElDVEFCTEUgYWRkcmVzcyBhbGxpZ25tZW50ICovCisJfQorCXJlZ3MtPkFSTV9jcHNyID0gY3BzcjsKKwlyZWdzLT5BUk1fcGMgPSBwY3Y7Cit9CisKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2CisKKy8qIEtlcm5lbHMgYnVpbHQgZm9yID49IEFSTXY2IHNob3VsZCBuZXZlciBydW4gb24gPD0gQVJNdjUgaGFyZHdhcmUsIHNvLi4uICovCisjZGVmaW5lIGxvYWRfd3JpdGVfcGNfaW50ZXJ3b3JrcyB0cnVlCisjZGVmaW5lIHRlc3RfbG9hZF93cml0ZV9wY19pbnRlcndvcmtpbmcoKQorCisjZWxzZSAvKiBfX0xJTlVYX0FSTV9BUkNIX18gPCA2ICovCisKKy8qIFdlIG5lZWQgcnVuLXRpbWUgdGVzdGluZyB0byBkZXRlcm1pbmUgaWYgbG9hZF93cml0ZV9wYygpIHNob3VsZCBpbnRlcndvcmsuICovCitleHRlcm4gYm9vbCBsb2FkX3dyaXRlX3BjX2ludGVyd29ya3M7Cit2b2lkIF9faW5pdCB0ZXN0X2xvYWRfd3JpdGVfcGNfaW50ZXJ3b3JraW5nKHZvaWQpOworCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIF9fa3Byb2JlcyBsb2FkX3dyaXRlX3BjKGxvbmcgcGN2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAobG9hZF93cml0ZV9wY19pbnRlcndvcmtzKQorCQlieF93cml0ZV9wYyhwY3YsIHJlZ3MpOworCWVsc2UKKwkJcmVncy0+QVJNX3BjID0gcGN2OworfQorCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNworCisjZGVmaW5lIGFsdV93cml0ZV9wY19pbnRlcndvcmtzIHRydWUKKyNkZWZpbmUgdGVzdF9hbHVfd3JpdGVfcGNfaW50ZXJ3b3JraW5nKCkKKworI2VsaWYgX19MSU5VWF9BUk1fQVJDSF9fIDw9IDUKKworLyogS2VybmVscyBidWlsdCBmb3IgPD0gQVJNdjUgc2hvdWxkIG5ldmVyIHJ1biBvbiA+PSBBUk12NiBoYXJkd2FyZSwgc28uLi4gKi8KKyNkZWZpbmUgYWx1X3dyaXRlX3BjX2ludGVyd29ya3MgZmFsc2UKKyNkZWZpbmUgdGVzdF9hbHVfd3JpdGVfcGNfaW50ZXJ3b3JraW5nKCkKKworI2Vsc2UgLyogX19MSU5VWF9BUk1fQVJDSF9fID09IDYgKi8KKworLyogV2UgY291bGQgYmUgYW4gQVJNdjYgYmluYXJ5IG9uIEFSTXY3IGhhcmR3YXJlIHNvIHdlIG5lZWQgYSBydW4tdGltZSBjaGVjay4gKi8KK2V4dGVybiBib29sIGFsdV93cml0ZV9wY19pbnRlcndvcmtzOwordm9pZCBfX2luaXQgdGVzdF9hbHVfd3JpdGVfcGNfaW50ZXJ3b3JraW5nKHZvaWQpOworCisjZW5kaWYgLyogX19MSU5VWF9BUk1fQVJDSF9fID09IDYgKi8KKworc3RhdGljIGlubGluZSB2b2lkIF9fa3Byb2JlcyBhbHVfd3JpdGVfcGMobG9uZyBwY3YsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChhbHVfd3JpdGVfcGNfaW50ZXJ3b3JrcykKKwkJYnhfd3JpdGVfcGMocGN2LCByZWdzKTsKKwllbHNlCisJCXJlZ3MtPkFSTV9wYyA9IHBjdjsKK30KKworCit2b2lkIF9fa3Byb2JlcyBrcHJvYmVfc2ltdWxhdGVfbm9wKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3ZvaWQgX19rcHJvYmVzIGtwcm9iZV9lbXVsYXRlX25vbmUoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitlbnVtIGtwcm9iZV9pbnNuIF9fa3Byb2Jlcwora3Byb2JlX2RlY29kZV9sZG1zdG0oa3Byb2JlX29wY29kZV90IGluc24sIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKmFzaSk7CisKKy8qCisgKiBUZXN0IGlmIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zIHdyaXRlYmFjayB0aGUgYWRkcmVzcyByZWdpc3Rlci4KKyAqIGlmIFAgKGJpdCAyNCkgPT0gMCBvciBXIChiaXQgMjEpID09IDEKKyAqLworI2RlZmluZSBpc193cml0ZWJhY2soaW5zbikgKChpbnNuIF4gMHgwMTAwMDAwMCkgJiAweDAxMjAwMDAwKQorCisvKgorICogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIGFyZSB1c2VkIHRvIGJ1aWxkIGluc3RydWN0aW9uCisgKiBkZWNvZGluZyB0YWJsZXMgZm9yIHVzZSBieSBrcHJvYmVfZGVjb2RlX2luc24uCisgKgorICogVGhlc2UgdGFibGVzIGFyZSBhIGNvbmNhdGVuYXRpb24gb2YgZW50cmllcyBlYWNoIG9mIHdoaWNoIGNvbnNpc3Qgb2Ygb25lIG9mCisgKiB0aGUgZGVjb2RlXyogc3RydWN0cy4gQWxsIG9mIHRoZSBmaWVsZHMgaW4gZXZlcnkgdHlwZSBvZiBkZWNvZGUgc3RydWN0dXJlCisgKiBhcmUgb2YgdGhlIHVuaW9uIHR5cGUgZGVjb2RlX2l0ZW0sIHRoZXJlZm9yZSB0aGUgZW50aXJlIGRlY29kZSB0YWJsZSBjYW4gYmUKKyAqIHZpZXdlZCBhcyBhbiBhcnJheSBvZiB0aGVzZSBhbmQgZGVjbGFyZWQgbGlrZToKKyAqCisgKglzdGF0aWMgY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gdGFibGVfbmFtZVtdID0ge307CisgKgorICogSW4gb3JkZXIgdG8gY29uc3RydWN0IGVhY2ggZW50cnkgaW4gdGhlIHRhYmxlLCBtYWNyb3MgYXJlIHVzZWQgdG8KKyAqIGluaXRpYWxpc2UgYSBudW1iZXIgb2Ygc2VxdWVudGlhbCBkZWNvZGVfaXRlbSB2YWx1ZXMgaW4gYSBsYXlvdXQgd2hpY2gKKyAqIG1hdGNoZXMgdGhlIHJlbGV2YW50IHN0cnVjdC4gRS5nLiBERUNPREVfU0lNVUxBVEUgaW5pdGlhbGlzZSBhIHN0cnVjdAorICogZGVjb2RlX3NpbXVsYXRlIGJ5IGluaXRpYWxpc2luZyBmb3VyIGRlY29kZV9pdGVtIG9iamVjdHMgbGlrZSB0aGlzLi4uCisgKgorICoJey5iaXRzID0gX3R5cGV9LAorICoJey5iaXRzID0gX21hc2t9LAorICoJey5iaXRzID0gX3ZhbHVlfSwKKyAqCXsuaGFuZGxlciA9IF9oYW5kbGVyfSwKKyAqCisgKiBJbml0aWFsaXNpbmcgYSBzcGVjaWZpZWQgbWVtYmVyIG9mIHRoZSB1bmlvbiBtZWFucyB0aGF0IHRoZSBjb21waWxlcgorICogd2lsbCBwcm9kdWNlIGEgd2FybmluZyBpZiB0aGUgYXJndW1lbnQgaXMgb2YgYW4gaW5jb3JyZWN0IHR5cGUuCisgKgorICogQmVsb3cgaXMgYSBsaXN0IG9mIGVhY2ggb2YgdGhlIG1hY3JvcyB1c2VkIHRvIGluaXRpYWxpc2UgZW50cmllcyBhbmQgYQorICogZGVzY3JpcHRpb24gb2YgdGhlIGFjdGlvbiBwZXJmb3JtZWQgd2hlbiB0aGF0IGVudHJ5IGlzIG1hdGNoZWQgdG8gYW4KKyAqIGluc3RydWN0aW9uLiBBIG1hdGNoIGlzIGZvdW5kIHdoZW4gKGluc3RydWN0aW9uICYgbWFzaykgPT0gdmFsdWUuCisgKgorICogREVDT0RFX1RBQkxFKG1hc2ssIHZhbHVlLCB0YWJsZSkKKyAqCUluc3RydWN0aW9uIGRlY29kaW5nIGp1bXBzIHRvIHBhcnNpbmcgdGhlIG5ldyBzdWItdGFibGUgJ3RhYmxlJy4KKyAqCisgKiBERUNPREVfQ1VTVE9NKG1hc2ssIHZhbHVlLCBkZWNvZGVyKQorICoJVGhlIGN1c3RvbSBmdW5jdGlvbiAnZGVjb2RlcicgaXMgY2FsbGVkIHRvIHRoZSBjb21wbGV0ZSBkZWNvZGluZworICoJb2YgYW4gaW5zdHJ1Y3Rpb24uCisgKgorICogREVDT0RFX1NJTVVMQVRFKG1hc2ssIHZhbHVlLCBoYW5kbGVyKQorICoJU2V0IHRoZSBwcm9iZXMgaW5zdHJ1Y3Rpb24gaGFuZGxlciB0byAnaGFuZGxlcicsIHRoaXMgd2lsbCBiZSB1c2VkCisgKgl0byBzaW11bGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgcHJvYmUgaXMgaGl0LiBEZWNvZGluZyByZXR1cm5zCisgKgl3aXRoIElOU05fR09PRF9OT19TTE9ULgorICoKKyAqIERFQ09ERV9FTVVMQVRFKG1hc2ssIHZhbHVlLCBoYW5kbGVyKQorICoJU2V0IHRoZSBwcm9iZXMgaW5zdHJ1Y3Rpb24gaGFuZGxlciB0byAnaGFuZGxlcicsIHRoaXMgd2lsbCBiZSB1c2VkCisgKgl0byBlbXVsYXRlIHRoZSBpbnN0cnVjdGlvbiB3aGVuIHRoZSBwcm9iZSBpcyBoaXQuIFRoZSBtb2RpZmllZAorICoJaW5zdHJ1Y3Rpb24gKHNlZSBiZWxvdykgaXMgcGxhY2VkIGluIHRoZSBwcm9iZXMgaW5zdHJ1Y3Rpb24gc2xvdCBzbyBpdAorICoJbWF5IGJlIGNhbGxlZCBieSB0aGUgZW11bGF0aW9uIGNvZGUuIERlY29kaW5nIHJldHVybnMgd2l0aCBJTlNOX0dPT0QuCisgKgorICogREVDT0RFX1JFSkVDVChtYXNrLCB2YWx1ZSkKKyAqCUluc3RydWN0aW9uIGRlY29kaW5nIGZhaWxzIHdpdGggSU5TTl9SRUpFQ1RFRAorICoKKyAqIERFQ09ERV9PUihtYXNrLCB2YWx1ZSkKKyAqCVRoaXMgYWxsb3dzIHRoZSBtYXNrL3ZhbHVlIHRlc3Qgb2YgbXVsdGlwbGUgdGFibGUgZW50cmllcyB0byBiZQorICoJbG9naWNhbGx5IE9SZWQuIE9uY2UgYW4gJ29yJyBlbnRyeSBpcyBtYXRjaGVkIHRoZSBkZWNvZGluZyBhY3Rpb24gdG8KKyAqCWJlIHBlcmZvcm1lZCBpcyB0aGF0IG9mIHRoZSBuZXh0IGVudHJ5IHdoaWNoIGlzbid0IGFuICdvcicuIEUuZy4KKyAqCisgKgkJREVDT0RFX09SCShtYXNrMSwgdmFsdWUxKQorICoJCURFQ09ERV9PUgkobWFzazIsIHZhbHVlMikKKyAqCQlERUNPREVfU0lNVUxBVEUJKG1hc2szLCB2YWx1ZTMsIHNpbXVsYXRpb25faGFuZGxlcikKKyAqCisgKglUaGlzIG1lYW5zIHRoYXQgaWYgYW55IG9mIHRoZSB0aHJlZSBtYXNrL3ZhbHVlIHBhaXJzIG1hdGNoIHRoZQorICoJaW5zdHJ1Y3Rpb24gYmVpbmcgZGVjb2RlZCwgdGhlbiAnc2ltdWxhdGlvbl9oYW5kbGVyJyB3aWxsIGJlIHVzZWQKKyAqCWZvciBpdC4KKyAqCisgKiBCb3RoIHRoZSBTSU1VTEFURSBhbmQgRU1VTEFURSBtYWNyb3MgaGF2ZSBhIHNlY29uZCBmb3JtIHdoaWNoIHRha2UgYW4KKyAqIGFkZGl0aW9uYWwgJ3JlZ3MnIGFyZ3VtZW50LgorICoKKyAqCURFQ09ERV9TSU1VTEFURVgobWFzaywgdmFsdWUsIGhhbmRsZXIsIHJlZ3MpCisgKglERUNPREVfRU1VTEFURVgJKG1hc2ssIHZhbHVlLCBoYW5kbGVyLCByZWdzKQorICoKKyAqIFRoZXNlIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hhdCBraW5kIG9mIENQVSByZWdpc3RlciBpcyBlbmNvZGVkIGluIGVhY2ggb2YgdGhlCisgKiBsZWFzdCBzaWduaWZpY2FudCA1IG5pYmJsZXMgb2YgdGhlIGluc3RydWN0aW9uIGJlaW5nIGRlY29kZWQuIFRoZSByZWdzIHZhbHVlCisgKiBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlIFJFR1MgbWFjcm8sIHRoaXMgdGFrZXMgYW55IG9mIHRoZSBSRUdfVFlQRV8qIHZhbHVlcworICogZnJvbSBlbnVtIGRlY29kZV9yZWdfdHlwZSBhcyBhcmd1bWVudHM7IG9ubHkgdGhlICcqJyBwYXJ0IG9mIHRoZSBuYW1lIGlzCisgKiBnaXZlbi4gRS5nLgorICoKKyAqCVJFR1MoMCwgQU5ZLCBOT1BDLCAwLCBBTlkpCisgKgorICogVGhpcyBpbmRpY2F0ZXMgYW4gaW5zdHJ1Y3Rpb24gaXMgZW5jb2RlZCBsaWtlOgorICoKKyAqCWJpdHMgMTkuLjE2CWlnbm9yZQorICoJYml0cyAxNS4uMTIJYW55IHJlZ2lzdGVyIGFsbG93ZWQgaGVyZQorICoJYml0cyAxMS4uIDgJYW55IHJlZ2lzdGVyIGV4Y2VwdCBQQyBhbGxvd2VkIGhlcmUKKyAqCWJpdHMgIDcuLiA0CWlnbm9yZQorICoJYml0cyAgMy4uIDAJYW55IHJlZ2lzdGVyIGFsbG93ZWQgaGVyZQorICoKKyAqIFRoaXMgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbiBpcyBjaGVja2VkIGFmdGVyIGEgZGVjb2RlIHRhYmxlIGVudHJ5IGlzIGZvdW5kIHRvCisgKiBtYXRjaCBhbiBpbnN0cnVjdGlvbiAodGhyb3VnaCB0aGUgbWFzay92YWx1ZSB0ZXN0KS4gQW55IGludmFsaWQgcmVnaXN0ZXIgdGhlbgorICogZm91bmQgaW4gdGhlIGluc3RydWN0aW9uIHdpbGwgY2F1c2UgZGVjb2RpbmcgdG8gZmFpbCB3aXRoIElOU05fUkVKRUNURUQuIEluCisgKiB0aGUgYWJvdmUgZXhhbXBsZSB0aGlzIHdvdWxkIGhhcHBlbiBpZiBiaXRzIDExLi44IG9mIHRoZSBpbnN0cnVjdGlvbiB3ZXJlCisgKiAxMTExLCBpbmRpY2F0aW5nIFIxNSBvciBQQy4KKyAqCisgKiBBcyB3ZWxsIGFzIGNoZWNraW5nIGZvciBsZWdhbCBjb21iaW5hdGlvbnMgb2YgcmVnaXN0ZXJzLCB0aGlzIGRhdGEgaXMgYWxzbworICogdXNlZCB0byBtb2RpZnkgdGhlIHJlZ2lzdGVycyBlbmNvZGVkIGluIHRoZSBpbnN0cnVjdGlvbnMgc28gdGhhdCBhbgorICogZW11bGF0aW9uIHJvdXRpbmVzIGNhbiB1c2UgaXQuIChTZWUgZGVjb2RlX3JlZ3MoKSBhbmQgSU5TTl9ORVdfQklUUy4pCisgKgorICogSGVyZSBpcyBhIHJlYWwgZXhhbXBsZSB3aGljaCBtYXRjaGVzIEFSTSBpbnN0cnVjdGlvbnMgb2YgdGhlIGZvcm0KKyAqICJBTkQgPFJkPiw8Um4+LDxSbT4sPHNoaWZ0PiA8UnM+IgorICoKKyAqCURFQ09ERV9FTVVMQVRFWAkoMHgwZTAwMDA5MCwgMHgwMDAwMDAxMCwgZW11bGF0ZV9yZDEycm4xNnJtMHJzOF9yd2ZsYWdzLAorICoJCQkJCQkgUkVHUyhBTlksIEFOWSwgTk9QQywgMCwgQU5ZKSksCisgKgkJCQkJCSAgICAgIF4gICAgXiAgICBeICAgICAgICBeCisgKgkJCQkJCSAgICAgIFJuICAgUmQgICBScyAgICAgICBSbQorICoKKyAqIERlY29kaW5nIHRoZSBpbnN0cnVjdGlvbiAiQU5EIFI0LCBSNSwgUjYsIEFTTCBSMTUiIHdpbGwgYmUgcmVqZWN0ZWQgYmVjYXVzZQorICogUnMgPT0gUjE1CisgKgorICogRGVjb2RpbmcgdGhlIGluc3RydWN0aW9uICJBTkQgUjQsIFI1LCBSNiwgQVNMIFI3IiB3aWxsIGJlIGFjY2VwdGVkIGFuZCB0aGUKKyAqIGluc3RydWN0aW9uIHdpbGwgYmUgbW9kaWZpZWQgdG8gIkFORCBSMCwgUjIsIFIzLCBBU0wgUjEiIGFuZCB0aGVuIHBsYWNlZCBpbnRvCisgKiB0aGUga3Byb2JlcyBpbnN0cnVjdGlvbiBzbG90LiBUaGlzIGNhbiB0aGVuIGJlIGNhbGxlZCBsYXRlciBieSB0aGUgaGFuZGxlcgorICogZnVuY3Rpb24gZW11bGF0ZV9yZDEycm4xNnJtMHJzOF9yd2ZsYWdzIGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBpbnN0cnVjdGlvbi4KKyAqLworCitlbnVtIGRlY29kZV90eXBlIHsKKwlERUNPREVfVFlQRV9FTkQsCisJREVDT0RFX1RZUEVfVEFCTEUsCisJREVDT0RFX1RZUEVfQ1VTVE9NLAorCURFQ09ERV9UWVBFX1NJTVVMQVRFLAorCURFQ09ERV9UWVBFX0VNVUxBVEUsCisJREVDT0RFX1RZUEVfT1IsCisJREVDT0RFX1RZUEVfUkVKRUNULAorCU5VTV9ERUNPREVfVFlQRVMgLyogTXVzdCBiZSBsYXN0IGVudW0gKi8KK307CisKKyNkZWZpbmUgREVDT0RFX1RZUEVfQklUUwk0CisjZGVmaW5lIERFQ09ERV9UWVBFX01BU0sJKCgxIDw8IERFQ09ERV9UWVBFX0JJVFMpIC0gMSkKKworZW51bSBkZWNvZGVfcmVnX3R5cGUgeworCVJFR19UWVBFX05PTkUgPSAwLCAvKiBOb3QgYSByZWdpc3RlciwgaWdub3JlICovCisJUkVHX1RZUEVfQU5ZLAkgICAvKiBBbnkgcmVnaXN0ZXIgYWxsb3dlZCAqLworCVJFR19UWVBFX1NBTUVBUzE2LCAvKiBSZWdpc3RlciBzaG91bGQgYmUgc2FtZSBhcyB0aGF0IGF0IGJpdHMgMTkuLjE2ICovCisJUkVHX1RZUEVfU1AsCSAgIC8qIFJlZ2lzdGVyIG11c3QgYmUgU1AgKi8KKwlSRUdfVFlQRV9QQywJICAgLyogUmVnaXN0ZXIgbXVzdCBiZSBQQyAqLworCVJFR19UWVBFX05PU1AsCSAgIC8qIFJlZ2lzdGVyIG11c3Qgbm90IGJlIFNQICovCisJUkVHX1RZUEVfTk9TUFBDLCAgIC8qIFJlZ2lzdGVyIG11c3Qgbm90IGJlIFNQIG9yIFBDICovCisJUkVHX1RZUEVfTk9QQywJICAgLyogUmVnaXN0ZXIgbXVzdCBub3QgYmUgUEMgKi8KKwlSRUdfVFlQRV9OT1BDV0IsICAgLyogTm8gUEMgaWYgbG9hZC9zdG9yZSB3cml0ZS1iYWNrIGZsYWcgYWxzbyBzZXQgKi8KKworCS8qIFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIHVzZWQgd2hlbiB0aGUgZW5jb2RpbmcgZm9yIFBDIGluZGljYXRlcworCSAqIGFub3RoZXIgaW5zdHJ1Y3Rpb24gZm9ybS4gVGhpcyBkaXN0aWN0aW9uIG9ubHkgbWF0dGVycyBmb3IgdGVzdAorCSAqIGNhc2UgY292ZXJhZ2UgY2hlY2tzLgorCSAqLworCVJFR19UWVBFX05PUENYLAkgICAvKiBSZWdpc3RlciBtdXN0IG5vdCBiZSBQQyAqLworCVJFR19UWVBFX05PU1BQQ1gsICAvKiBSZWdpc3RlciBtdXN0IG5vdCBiZSBTUCBvciBQQyAqLworCisJLyogQWxpYXMgdG8gYWxsb3cgJzAnIGFyZyB0byBiZSB1c2VkIGluIFJFR1MgbWFjcm8uICovCisJUkVHX1RZUEVfMCA9IFJFR19UWVBFX05PTkUKK307CisKKyNkZWZpbmUgUkVHUyhyMTYsIHIxMiwgcjgsIHI0LCByMCkJXAorCSgoUkVHX1RZUEVfIyNyMTYpIDw8IDE2KSArCVwKKwkoKFJFR19UWVBFXyMjcjEyKSA8PCAxMikgKwlcCisJKChSRUdfVFlQRV8jI3I4KSA8PCA4KSArCVwKKwkoKFJFR19UWVBFXyMjcjQpIDw8IDQpICsJXAorCShSRUdfVFlQRV8jI3IwKQorCit1bmlvbiBkZWNvZGVfaXRlbSB7CisJdTMyCQkJYml0czsKKwljb25zdCB1bmlvbiBkZWNvZGVfaXRlbQkqdGFibGU7CisJa3Byb2JlX2luc25faGFuZGxlcl90CSpoYW5kbGVyOworCWtwcm9iZV9kZWNvZGVfaW5zbl90CSpkZWNvZGVyOworfTsKKworCisjZGVmaW5lIERFQ09ERV9FTkQJCQlcCisJey5iaXRzID0gREVDT0RFX1RZUEVfRU5EfQorCisKK3N0cnVjdCBkZWNvZGVfaGVhZGVyIHsKKwl1bmlvbiBkZWNvZGVfaXRlbQl0eXBlX3JlZ3M7CisJdW5pb24gZGVjb2RlX2l0ZW0JbWFzazsKKwl1bmlvbiBkZWNvZGVfaXRlbQl2YWx1ZTsKK307CisKKyNkZWZpbmUgREVDT0RFX0hFQURFUihfdHlwZSwgX21hc2ssIF92YWx1ZSwgX3JlZ3MpCQlcCisJey5iaXRzID0gKF90eXBlKSB8ICgoX3JlZ3MpIDw8IERFQ09ERV9UWVBFX0JJVFMpfSwJXAorCXsuYml0cyA9IChfbWFzayl9LAkJCQkJXAorCXsuYml0cyA9IChfdmFsdWUpfQorCisKK3N0cnVjdCBkZWNvZGVfdGFibGUgeworCXN0cnVjdCBkZWNvZGVfaGVhZGVyCWhlYWRlcjsKKwl1bmlvbiBkZWNvZGVfaXRlbQl0YWJsZTsKK307CisKKyNkZWZpbmUgREVDT0RFX1RBQkxFKF9tYXNrLCBfdmFsdWUsIF90YWJsZSkJCQlcCisJREVDT0RFX0hFQURFUihERUNPREVfVFlQRV9UQUJMRSwgX21hc2ssIF92YWx1ZSwgMCksCVwKKwl7LnRhYmxlID0gKF90YWJsZSl9CisKKworc3RydWN0IGRlY29kZV9jdXN0b20geworCXN0cnVjdCBkZWNvZGVfaGVhZGVyCWhlYWRlcjsKKwl1bmlvbiBkZWNvZGVfaXRlbQlkZWNvZGVyOworfTsKKworI2RlZmluZSBERUNPREVfQ1VTVE9NKF9tYXNrLCBfdmFsdWUsIF9kZWNvZGVyKQkJCVwKKwlERUNPREVfSEVBREVSKERFQ09ERV9UWVBFX0NVU1RPTSwgX21hc2ssIF92YWx1ZSwgMCksCVwKKwl7LmRlY29kZXIgPSAoX2RlY29kZXIpfQorCisKK3N0cnVjdCBkZWNvZGVfc2ltdWxhdGUgeworCXN0cnVjdCBkZWNvZGVfaGVhZGVyCWhlYWRlcjsKKwl1bmlvbiBkZWNvZGVfaXRlbQloYW5kbGVyOworfTsKKworI2RlZmluZSBERUNPREVfU0lNVUxBVEVYKF9tYXNrLCBfdmFsdWUsIF9oYW5kbGVyLCBfcmVncykJCVwKKwlERUNPREVfSEVBREVSKERFQ09ERV9UWVBFX1NJTVVMQVRFLCBfbWFzaywgX3ZhbHVlLCBfcmVncyksCVwKKwl7LmhhbmRsZXIgPSAoX2hhbmRsZXIpfQorCisjZGVmaW5lIERFQ09ERV9TSU1VTEFURShfbWFzaywgX3ZhbHVlLCBfaGFuZGxlcikJXAorCURFQ09ERV9TSU1VTEFURVgoX21hc2ssIF92YWx1ZSwgX2hhbmRsZXIsIDApCisKKworc3RydWN0IGRlY29kZV9lbXVsYXRlIHsKKwlzdHJ1Y3QgZGVjb2RlX2hlYWRlcgloZWFkZXI7CisJdW5pb24gZGVjb2RlX2l0ZW0JaGFuZGxlcjsKK307CisKKyNkZWZpbmUgREVDT0RFX0VNVUxBVEVYKF9tYXNrLCBfdmFsdWUsIF9oYW5kbGVyLCBfcmVncykJCQlcCisJREVDT0RFX0hFQURFUihERUNPREVfVFlQRV9FTVVMQVRFLCBfbWFzaywgX3ZhbHVlLCBfcmVncyksCVwKKwl7LmhhbmRsZXIgPSAoX2hhbmRsZXIpfQorCisjZGVmaW5lIERFQ09ERV9FTVVMQVRFKF9tYXNrLCBfdmFsdWUsIF9oYW5kbGVyKQkJXAorCURFQ09ERV9FTVVMQVRFWChfbWFzaywgX3ZhbHVlLCBfaGFuZGxlciwgMCkKKworCitzdHJ1Y3QgZGVjb2RlX29yIHsKKwlzdHJ1Y3QgZGVjb2RlX2hlYWRlcgloZWFkZXI7Cit9OworCisjZGVmaW5lIERFQ09ERV9PUihfbWFzaywgX3ZhbHVlKQkJCQlcCisJREVDT0RFX0hFQURFUihERUNPREVfVFlQRV9PUiwgX21hc2ssIF92YWx1ZSwgMCkKKworCitzdHJ1Y3QgZGVjb2RlX3JlamVjdCB7CisJc3RydWN0IGRlY29kZV9oZWFkZXIJaGVhZGVyOworfTsKKworI2RlZmluZSBERUNPREVfUkVKRUNUKF9tYXNrLCBfdmFsdWUpCQkJCVwKKwlERUNPREVfSEVBREVSKERFQ09ERV9UWVBFX1JFSkVDVCwgX21hc2ssIF92YWx1ZSwgMCkKKworCitpbnQga3Byb2JlX2RlY29kZV9pbnNuKGtwcm9iZV9vcGNvZGVfdCBpbnNuLCBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphc2ksCisJCQljb25zdCB1bmlvbiBkZWNvZGVfaXRlbSAqdGFibGUsIGJvb2wgdGh1bWIxNik7CisKKworI2VuZGlmIC8qIF9BUk1fS0VSTkVMX0tQUk9CRVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jIGIvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jCmluZGV4IGZlZTdjMzYuLjA1YjM3NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMKQEAgLTQzLDI1ICs0Myw3IEBACiAJCQkJR0ZQX0tFUk5FTCwgUEFHRV9LRVJORUxfRVhFQywgLTEsCiAJCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KLSNlbHNlIC8qIENPTkZJR19NTVUgKi8KLXZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIHNpemUgPT0gMCA/IE5VTEwgOiB2bWFsbG9jKHNpemUpOwotfQotI2VuZGlmIC8qICFDT05GSUdfTU1VICovCi0KLXZvaWQgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kdWxlLCB2b2lkICpyZWdpb24pCi17Ci0JdmZyZWUocmVnaW9uKTsKLX0KLQotaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmhkciwKLQkJCSAgICAgIEVsZl9TaGRyICpzZWNoZHJzLAotCQkJICAgICAgY2hhciAqc2Vjc3RyaW5ncywKLQkJCSAgICAgIHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLQlyZXR1cm4gMDsKLX0KKyNlbmRpZgogCiBpbnQKIGFwcGx5X3JlbG9jYXRlKEVsZjMyX1NoZHIgKnNlY2hkcnMsIGNvbnN0IGNoYXIgKnN0cnRhYiwgdW5zaWduZWQgaW50IHN5bWluZGV4LApAQCAtMTkzLDggKzE3NSwxNyBAQAogCQkJCW9mZnNldCAtPSAweDAyMDAwMDAwOwogCQkJb2Zmc2V0ICs9IHN5bS0+c3RfdmFsdWUgLSBsb2M7CiAKLQkJCS8qIG9ubHkgVGh1bWIgYWRkcmVzc2VzIGFsbG93ZWQgKG5vIGludGVyd29ya2luZykgKi8KLQkJCWlmICghKG9mZnNldCAmIDEpIHx8CisJCQkvKgorCQkJICogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIG9ubHkgVGh1bWIgYWRkcmVzc2VzIGFyZQorCQkJICogYWxsb3dlZCAobm8gaW50ZXJ3b3JraW5nKS4KKwkJCSAqCisJCQkgKiBGb3Igbm9uLWZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBkZXN0aW5hdGlvbgorCQkJICogaGFzIG5vIHNwZWNpZmljIEFSTS9UaHVtYiBkaXNwb3NpdGlvbiwgc28KKwkJCSAqIHRoZSBicmFuY2ggaXMgcmVzb2x2ZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24KKwkJCSAqIHRoYXQgaW50ZXJ3b3JraW5nIGlzIG5vdCByZXF1aXJlZC4KKwkJCSAqLworCQkJaWYgKChFTEYzMl9TVF9UWVBFKHN5bS0+c3RfaW5mbykgPT0gU1RUX0ZVTkMgJiYKKwkJCQkhKG9mZnNldCAmIDEpKSB8fAogCQkJICAgIG9mZnNldCA8PSAoczMyKTB4ZmYwMDAwMDAgfHwKIAkJCSAgICBvZmZzZXQgPj0gKHMzMikweDAxMDAwMDAwKSB7CiAJCQkJcHJfZXJyKCIlczogc2VjdGlvbiAldSByZWxvYyAldSBzeW0gJyVzJzogcmVsb2NhdGlvbiAldSBvdXQgb2YgcmFuZ2UgKCUjbHggLT4gJSN4KVxuIiwKQEAgLTI1NiwxNSArMjQ3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50Ci1hcHBseV9yZWxvY2F0ZV9hZGQoRWxmMzJfU2hkciAqc2VjaGRycywgY29uc3QgY2hhciAqc3RydGFiLAotCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsIHVuc2lnbmVkIGludCByZWxzZWMsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKLXsKLQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogQUREIFJFTE9DQVRJT04gdW5zdXBwb3J0ZWRcbiIsCi0JICAgICAgIG1vZHVsZS0+bmFtZSk7Ci0JcmV0dXJuIC1FTk9FWEVDOwotfQotCiBzdHJ1Y3QgbW9kX3Vud2luZF9tYXAgewogCWNvbnN0IEVsZl9TaGRyICp1bndfc2VjOwogCWNvbnN0IEVsZl9TaGRyICp0eHRfc2VjOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggZDUzYzBhYi4uNTNjOWMyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC00MzUsNyArNDM1LDcgQEAKIAkJCWlmIChpcnEgPj0gMCkKIAkJCQlmcmVlX2lycShpcnEsIE5VTEwpOwogCQl9Ci0JCXJlbGVhc2VfcG11KHBtdV9kZXZpY2UpOworCQlyZWxlYXNlX3BtdShBUk1fUE1VX0RFVklDRV9DUFUpOwogCQlwbXVfZGV2aWNlID0gTlVMTDsKIAl9CiAKQEAgLTQ1NCw3ICs0NTQsNyBAQAogCX0KIAlhcm1wbXUtPnN0b3AoKTsKIAotCXJlbGVhc2VfcG11KHBtdV9kZXZpY2UpOworCXJlbGVhc2VfcG11KEFSTV9QTVVfREVWSUNFX0NQVSk7CiAJcG11X2RldmljZSA9IE5VTEw7CiB9CiAKQEAgLTU4Myw3ICs1ODMsNyBAQAogc3RhdGljIHZvaWQgYXJtcG11X2VuYWJsZShzdHJ1Y3QgcG11ICpwbXUpCiB7CiAJLyogRW5hYmxlIGFsbCBvZiB0aGUgcGVyZiBldmVudHMgb24gaGFyZHdhcmUuICovCi0JaW50IGlkeDsKKwlpbnQgaWR4LCBlbmFibGVkID0gMDsKIAlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwogCiAJaWYgKCFhcm1wbXUpCkBAIC01OTYsOSArNTk2LDExIEBACiAJCQljb250aW51ZTsKIAogCQlhcm1wbXUtPmVuYWJsZSgmZXZlbnQtPmh3LCBpZHgpOworCQllbmFibGVkID0gMTsKIAl9CiAKLQlhcm1wbXUtPnN0YXJ0KCk7CisJaWYgKGVuYWJsZWQpCisJCWFybXBtdS0+c3RhcnQoKTsKIH0KIAogc3RhdGljIHZvaWQgYXJtcG11X2Rpc2FibGUoc3RydWN0IHBtdSAqcG11KQpAQCAtNjYwLDYgKzY2MiwxMiBAQAogCQljYXNlIDB4QzA5MDoJLyogQ29ydGV4LUE5ICovCiAJCQlhcm1wbXUgPSBhcm12N19hOV9wbXVfaW5pdCgpOwogCQkJYnJlYWs7CisJCWNhc2UgMHhDMDUwOgkvKiBDb3J0ZXgtQTUgKi8KKwkJCWFybXBtdSA9IGFybXY3X2E1X3BtdV9pbml0KCk7CisJCQlicmVhazsKKwkJY2FzZSAweEMwRjA6CS8qIENvcnRleC1BMTUgKi8KKwkJCWFybXBtdSA9IGFybXY3X2ExNV9wbXVfaW5pdCgpOworCQkJYnJlYWs7CiAJCX0KIAkvKiBJbnRlbCBDUFVzIFt4c2NhbGVdLiAqLwogCX0gZWxzZSBpZiAoMHg2OSA9PSBpbXBsZW1lbnRvcikgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjYuYyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y2LmMKaW5kZXggZjFlOGRkOS4uZGQ3ZjNiOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjYuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ni5jCkBAIC0xNzMsNiArMTczLDIwIEBACiAJCQlbQyhSRVNVTFRfTUlTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCiAJCX0sCiAJfSwKKwlbQyhOT0RFKV0gPSB7CisJCVtDKE9QX1JFQUQpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQl9LAorCQlbQyhPUF9XUklURSldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJfSwKKwl9LAogfTsKIAogZW51bSBhcm12Nm1wY29yZV9wZXJmX3R5cGVzIHsKQEAgLTMxMCw2ICszMjQsMjAgQEAKIAkJCVtDKFJFU1VMVF9NSVNTKV0gICAgPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKIAkJfSwKIAl9LAorCVtDKE5PREUpXSA9IHsKKwkJW0MoT1BfUkVBRCldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldICA9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXSAgICA9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQl9LAorCQlbQyhPUF9XUklURSldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldICA9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXSAgICA9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldICA9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXSAgICA9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQl9LAorCX0sCiB9OwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKQEAgLTQ3OSw3ICs1MDcsNyBAQAogCQlpZiAoIWFybXBtdV9ldmVudF9zZXRfcGVyaW9kKGV2ZW50LCBod2MsIGlkeCkpCiAJCQljb250aW51ZTsKIAotCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgMCwgJmRhdGEsIHJlZ3MpKQorCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgJmRhdGEsIHJlZ3MpKQogCQkJYXJtcG11LT5kaXNhYmxlKGh3YywgaWR4KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y3LmMgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ny5jCmluZGV4IDQ5NjA2ODYuLjRjODUxODMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y3LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjcuYwpAQCAtMTcsMTcgKzE3LDIzIEBACiAgKi8KIAogI2lmZGVmIENPTkZJR19DUFVfVjcKLS8qIENvbW1vbiBBUk12NyBldmVudCB0eXBlcyAqLworLyoKKyAqIENvbW1vbiBBUk12NyBldmVudCB0eXBlcworICoKKyAqIE5vdGU6IEFuIGltcGxlbWVudGF0aW9uIG1heSBub3QgYmUgYWJsZSB0byBjb3VudCBhbGwgb2YgdGhlc2UgZXZlbnRzCisgKiBidXQgdGhlIGVuY29kaW5ncyBhcmUgY29uc2lkZXJlZCB0byBiZSBgcmVzZXJ2ZWQnIGluIHRoZSBjYXNlIHRoYXQKKyAqIHRoZXkgYXJlIG5vdCBhdmFpbGFibGUuCisgKi8KIGVudW0gYXJtdjdfcGVyZl90eXBlcyB7CiAJQVJNVjdfUEVSRkNUUl9QTU5DX1NXX0lOQ1IJCT0gMHgwMCwKIAlBUk1WN19QRVJGQ1RSX0lGRVRDSF9NSVNTCQk9IDB4MDEsCiAJQVJNVjdfUEVSRkNUUl9JVExCX01JU1MJCQk9IDB4MDIsCi0JQVJNVjdfUEVSRkNUUl9EQ0FDSEVfUkVGSUxMCQk9IDB4MDMsCi0JQVJNVjdfUEVSRkNUUl9EQ0FDSEVfQUNDRVNTCQk9IDB4MDQsCisJQVJNVjdfUEVSRkNUUl9EQ0FDSEVfUkVGSUxMCQk9IDB4MDMsCS8qIEwxICovCisJQVJNVjdfUEVSRkNUUl9EQ0FDSEVfQUNDRVNTCQk9IDB4MDQsCS8qIEwxICovCiAJQVJNVjdfUEVSRkNUUl9EVExCX1JFRklMTAkJPSAweDA1LAogCUFSTVY3X1BFUkZDVFJfRFJFQUQJCQk9IDB4MDYsCiAJQVJNVjdfUEVSRkNUUl9EV1JJVEUJCQk9IDB4MDcsCi0KKwlBUk1WN19QRVJGQ1RSX0lOU1RSX0VYRUNVVEVECQk9IDB4MDgsCiAJQVJNVjdfUEVSRkNUUl9FWENfVEFLRU4JCQk9IDB4MDksCiAJQVJNVjdfUEVSRkNUUl9FWENfRVhFQ1VURUQJCT0gMHgwQSwKIAlBUk1WN19QRVJGQ1RSX0NJRF9XUklURQkJCT0gMHgwQiwKQEAgLTM5LDIxICs0NSwzMCBAQAogCSAqLwogCUFSTVY3X1BFUkZDVFJfUENfV1JJVEUJCQk9IDB4MEMsCiAJQVJNVjdfUEVSRkNUUl9QQ19JTU1fQlJBTkNICQk9IDB4MEQsCisJQVJNVjdfUEVSRkNUUl9QQ19QUk9DX1JFVFVSTgkJPSAweDBFLAogCUFSTVY3X1BFUkZDVFJfVU5BTElHTkVEX0FDQ0VTUwkJPSAweDBGLAorCisJLyogVGhlc2UgZXZlbnRzIGFyZSBkZWZpbmVkIGJ5IHRoZSBQTVV2MiBzdXBwbGVtZW50IChBUk0gRERJIDA0NTdBKS4gKi8KIAlBUk1WN19QRVJGQ1RSX1BDX0JSQU5DSF9NSVNfUFJFRAk9IDB4MTAsCiAJQVJNVjdfUEVSRkNUUl9DTE9DS19DWUNMRVMJCT0gMHgxMSwKLQotCUFSTVY3X1BFUkZDVFJfUENfQlJBTkNIX01JU19VU0VECT0gMHgxMiwKKwlBUk1WN19QRVJGQ1RSX1BDX0JSQU5DSF9QUkVECQk9IDB4MTIsCisJQVJNVjdfUEVSRkNUUl9NRU1fQUNDRVNTCQk9IDB4MTMsCisJQVJNVjdfUEVSRkNUUl9MMV9JQ0FDSEVfQUNDRVNTCQk9IDB4MTQsCisJQVJNVjdfUEVSRkNUUl9MMV9EQ0FDSEVfV0IJCT0gMHgxNSwKKwlBUk1WN19QRVJGQ1RSX0wyX0RDQUNIRV9BQ0NFU1MJCT0gMHgxNiwKKwlBUk1WN19QRVJGQ1RSX0wyX0RDQUNIRV9SRUZJTEwJCT0gMHgxNywKKwlBUk1WN19QRVJGQ1RSX0wyX0RDQUNIRV9XQgkJPSAweDE4LAorCUFSTVY3X1BFUkZDVFJfQlVTX0FDQ0VTUwkJPSAweDE5LAorCUFSTVY3X1BFUkZDVFJfTUVNT1JZX0VSUk9SCQk9IDB4MUEsCisJQVJNVjdfUEVSRkNUUl9JTlNUUl9TUEVDCQk9IDB4MUIsCisJQVJNVjdfUEVSRkNUUl9UVEJSX1dSSVRFCQk9IDB4MUMsCisJQVJNVjdfUEVSRkNUUl9CVVNfQ1lDTEVTCQk9IDB4MUQsCiAKIAlBUk1WN19QRVJGQ1RSX0NQVV9DWUNMRVMJCT0gMHhGRgogfTsKIAogLyogQVJNdjcgQ29ydGV4LUE4IHNwZWNpZmljIGV2ZW50IHR5cGVzICovCiBlbnVtIGFybXY3X2E4X3BlcmZfdHlwZXMgewotCUFSTVY3X1BFUkZDVFJfSU5TVFJfRVhFQ1VURUQJCT0gMHgwOCwKLQotCUFSTVY3X1BFUkZDVFJfUENfUFJPQ19SRVRVUk4JCT0gMHgwRSwKLQogCUFSTVY3X1BFUkZDVFJfV1JJVEVfQlVGRkVSX0ZVTEwJCT0gMHg0MCwKIAlBUk1WN19QRVJGQ1RSX0wyX1NUT1JFX01FUkdFRAkJPSAweDQxLAogCUFSTVY3X1BFUkZDVFJfTDJfU1RPUkVfQlVGRgkJPSAweDQyLApAQCAtMTM4LDYgKzE1MywzOSBAQAogCUFSTVY3X1BFUkZDVFJfUExFX1JRU1RfUFJPRwkJPSAweEE1CiB9OwogCisvKiBBUk12NyBDb3J0ZXgtQTUgc3BlY2lmaWMgZXZlbnQgdHlwZXMgKi8KK2VudW0gYXJtdjdfYTVfcGVyZl90eXBlcyB7CisJQVJNVjdfUEVSRkNUUl9JUlFfVEFLRU4JCQk9IDB4ODYsCisJQVJNVjdfUEVSRkNUUl9GSVFfVEFLRU4JCQk9IDB4ODcsCisKKwlBUk1WN19QRVJGQ1RSX0VYVF9NRU1fUlFTVAkJPSAweGMwLAorCUFSTVY3X1BFUkZDVFJfTkNfRVhUX01FTV9SUVNUCQk9IDB4YzEsCisJQVJNVjdfUEVSRkNUUl9QUkVGRVRDSF9MSU5FRklMTAkJPSAweGMyLAorCUFSTVY3X1BFUkZDVFJfUFJFRkVUQ0hfTElORUZJTExfRFJPUAk9IDB4YzMsCisJQVJNVjdfUEVSRkNUUl9FTlRFUl9SRUFEX0FMTE9DCQk9IDB4YzQsCisJQVJNVjdfUEVSRkNUUl9SRUFEX0FMTE9DCQk9IDB4YzUsCisKKwlBUk1WN19QRVJGQ1RSX1NUQUxMX1NCX0ZVTEwJCT0gMHhjOSwKK307CisKKy8qIEFSTXY3IENvcnRleC1BMTUgc3BlY2lmaWMgZXZlbnQgdHlwZXMgKi8KK2VudW0gYXJtdjdfYTE1X3BlcmZfdHlwZXMgeworCUFSTVY3X1BFUkZDVFJfTDFfRENBQ0hFX1JFQURfQUNDRVNTCT0gMHg0MCwKKwlBUk1WN19QRVJGQ1RSX0wxX0RDQUNIRV9XUklURV9BQ0NFU1MJPSAweDQxLAorCUFSTVY3X1BFUkZDVFJfTDFfRENBQ0hFX1JFQURfUkVGSUxMCT0gMHg0MiwKKwlBUk1WN19QRVJGQ1RSX0wxX0RDQUNIRV9XUklURV9SRUZJTEwJPSAweDQzLAorCisJQVJNVjdfUEVSRkNUUl9MMV9EVExCX1JFQURfUkVGSUxMCT0gMHg0QywKKwlBUk1WN19QRVJGQ1RSX0wxX0RUTEJfV1JJVEVfUkVGSUxMCT0gMHg0RCwKKworCUFSTVY3X1BFUkZDVFJfTDJfRENBQ0hFX1JFQURfQUNDRVNTCT0gMHg1MCwKKwlBUk1WN19QRVJGQ1RSX0wyX0RDQUNIRV9XUklURV9BQ0NFU1MJPSAweDUxLAorCUFSTVY3X1BFUkZDVFJfTDJfRENBQ0hFX1JFQURfUkVGSUxMCT0gMHg1MiwKKwlBUk1WN19QRVJGQ1RSX0wyX0RDQUNIRV9XUklURV9SRUZJTEwJPSAweDUzLAorCisJQVJNVjdfUEVSRkNUUl9TUEVDX1BDX1dSSVRFCQk9IDB4NzYsCit9OworCiAvKgogICogQ29ydGV4LUE4IEhXIGV2ZW50cyBtYXBwaW5nCiAgKgpAQCAtMjA3LDExICsyNTUsNiBAQAogCQl9LAogCX0sCiAJW0MoRFRMQildID0gewotCQkvKgotCQkgKiBPbmx5IElUTEIgbWlzc2VzIGFuZCBEVExCIHJlZmlsbHMgYXJlIHN1cHBvcnRlZC4KLQkJICogSWYgdXNlcnMgd2FudCB0aGUgRFRMQiByZWZpbGxzIG1pc3NlcyBhIHJhdyBjb3VudGVyCi0JCSAqIG11c3QgYmUgdXNlZC4KLQkJICovCiAJCVtDKE9QX1JFQUQpXSA9IHsKIAkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAogCQkJW0MoUkVTVUxUX01JU1MpXQk9IEFSTVY3X1BFUkZDVFJfRFRMQl9SRUZJTEwsCkBAIC0yNTUsNiArMjk4LDIwIEBACiAJCQlbQyhSRVNVTFRfTUlTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCiAJCX0sCiAJfSwKKwlbQyhOT0RFKV0gPSB7CisJCVtDKE9QX1JFQUQpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQl9LAorCQlbQyhPUF9XUklURSldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJfSwKKwl9LAogfTsKIAogLyoKQEAgLTMyMywxMSArMzgwLDYgQEAKIAkJfSwKIAl9LAogCVtDKERUTEIpXSA9IHsKLQkJLyoKLQkJICogT25seSBJVExCIG1pc3NlcyBhbmQgRFRMQiByZWZpbGxzIGFyZSBzdXBwb3J0ZWQuCi0JCSAqIElmIHVzZXJzIHdhbnQgdGhlIERUTEIgcmVmaWxscyBtaXNzZXMgYSByYXcgY291bnRlcgotCQkgKiBtdXN0IGJlIHVzZWQuCi0JCSAqLwogCQlbQyhPUF9SRUFEKV0gPSB7CiAJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKIAkJCVtDKFJFU1VMVF9NSVNTKV0JPSBBUk1WN19QRVJGQ1RSX0RUTEJfUkVGSUxMLApAQCAtMzcxLDYgKzQyMywyNTYgQEAKIAkJCVtDKFJFU1VMVF9NSVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKIAkJfSwKIAl9LAorCVtDKE5PREUpXSA9IHsKKwkJW0MoT1BfUkVBRCldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQl9LAorCX0sCit9OworCisvKgorICogQ29ydGV4LUE1IEhXIGV2ZW50cyBtYXBwaW5nCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBhcm12N19hNV9wZXJmX21hcFtQRVJGX0NPVU5UX0hXX01BWF0gPSB7CisJW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10JICAgID0gQVJNVjdfUEVSRkNUUl9DUFVfQ1lDTEVTLAorCVtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JICAgID0gQVJNVjdfUEVSRkNUUl9JTlNUUl9FWEVDVVRFRCwKKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXSAgICA9IEhXX09QX1VOU1VQUE9SVEVELAorCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01JU1NFU10JICAgID0gSFdfT1BfVU5TVVBQT1JURUQsCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OU10gPSBBUk1WN19QRVJGQ1RSX1BDX1dSSVRFLAorCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdCSAgICA9IEFSTVY3X1BFUkZDVFJfUENfQlJBTkNIX01JU19QUkVELAorCVtQRVJGX0NPVU5UX0hXX0JVU19DWUNMRVNdCSAgICA9IEhXX09QX1VOU1VQUE9SVEVELAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGFybXY3X2E1X3BlcmZfY2FjaGVfbWFwW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCisJCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdID0geworCVtDKEwxRCldID0geworCQlbQyhPUF9SRUFEKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0KKwkJCQkJPSBBUk1WN19QRVJGQ1RSX0RDQUNIRV9BQ0NFU1MsCisJCQlbQyhSRVNVTFRfTUlTUyldCisJCQkJCT0gQVJNVjdfUEVSRkNUUl9EQ0FDSEVfUkVGSUxMLAorCQl9LAorCQlbQyhPUF9XUklURSldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCisJCQkJCT0gQVJNVjdfUEVSRkNUUl9EQ0FDSEVfQUNDRVNTLAorCQkJW0MoUkVTVUxUX01JU1MpXQorCQkJCQk9IEFSTVY3X1BFUkZDVFJfRENBQ0hFX1JFRklMTCwKKwkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQorCQkJCQk9IEFSTVY3X1BFUkZDVFJfUFJFRkVUQ0hfTElORUZJTEwsCisJCQlbQyhSRVNVTFRfTUlTUyldCisJCQkJCT0gQVJNVjdfUEVSRkNUUl9QUkVGRVRDSF9MSU5FRklMTF9EUk9QLAorCQl9LAorCX0sCisJW0MoTDFJKV0gPSB7CisJCVtDKE9QX1JFQUQpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY3X1BFUkZDVFJfTDFfSUNBQ0hFX0FDQ0VTUywKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBBUk1WN19QRVJGQ1RSX0lGRVRDSF9NSVNTLAorCQl9LAorCQlbQyhPUF9XUklURSldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQVJNVjdfUEVSRkNUUl9MMV9JQ0FDSEVfQUNDRVNTLAorCQkJW0MoUkVTVUxUX01JU1MpXQk9IEFSTVY3X1BFUkZDVFJfSUZFVENIX01JU1MsCisJCX0sCisJCS8qCisJCSAqIFRoZSBwcmVmZXRjaCBjb3VudGVycyBkb24ndCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIEkKKwkJICogc2lkZSBhbmQgdGhlIEQgc2lkZS4KKwkJICovCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0KKwkJCQkJPSBBUk1WN19QRVJGQ1RSX1BSRUZFVENIX0xJTkVGSUxMLAorCQkJW0MoUkVTVUxUX01JU1MpXQorCQkJCQk9IEFSTVY3X1BFUkZDVFJfUFJFRkVUQ0hfTElORUZJTExfRFJPUCwKKwkJfSwKKwl9LAorCVtDKExMKV0gPSB7CisJCVtDKE9QX1JFQUQpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQl9LAorCQlbQyhPUF9XUklURSldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJfSwKKwl9LAorCVtDKERUTEIpXSA9IHsKKwkJW0MoT1BfUkVBRCldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCT0gQVJNVjdfUEVSRkNUUl9EVExCX1JFRklMTCwKKwkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXQk9IEFSTVY3X1BFUkZDVFJfRFRMQl9SRUZJTEwsCisJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJfSwKKwl9LAorCVtDKElUTEIpXSA9IHsKKwkJW0MoT1BfUkVBRCldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCT0gQVJNVjdfUEVSRkNUUl9JVExCX01JU1MsCisJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBBUk1WN19QRVJGQ1RSX0lUTEJfTUlTUywKKwkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQl9LAorCX0sCisJW0MoQlBVKV0gPSB7CisJCVtDKE9QX1JFQUQpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY3X1BFUkZDVFJfUENfQlJBTkNIX1BSRUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCisJCQkJCT0gQVJNVjdfUEVSRkNUUl9QQ19CUkFOQ0hfTUlTX1BSRUQsCisJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBBUk1WN19QRVJGQ1RSX1BDX0JSQU5DSF9QUkVELAorCQkJW0MoUkVTVUxUX01JU1MpXQorCQkJCQk9IEFSTVY3X1BFUkZDVFJfUENfQlJBTkNIX01JU19QUkVELAorCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCX0sCisJfSwKK307CisKKy8qCisgKiBDb3J0ZXgtQTE1IEhXIGV2ZW50cyBtYXBwaW5nCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBhcm12N19hMTVfcGVyZl9tYXBbUEVSRl9DT1VOVF9IV19NQVhdID0geworCVtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdCSAgICA9IEFSTVY3X1BFUkZDVFJfQ1BVX0NZQ0xFUywKKwlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdCSAgICA9IEFSTVY3X1BFUkZDVFJfSU5TVFJfRVhFQ1VURUQsCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10gICAgPSBIV19PUF9VTlNVUFBPUlRFRCwKKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdCSAgICA9IEhXX09QX1VOU1VQUE9SVEVELAorCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdID0gQVJNVjdfUEVSRkNUUl9TUEVDX1BDX1dSSVRFLAorCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdCSAgICA9IEFSTVY3X1BFUkZDVFJfUENfQlJBTkNIX01JU19QUkVELAorCVtQRVJGX0NPVU5UX0hXX0JVU19DWUNMRVNdCSAgICA9IEFSTVY3X1BFUkZDVFJfQlVTX0NZQ0xFUywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBhcm12N19hMTVfcGVyZl9jYWNoZV9tYXBbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCisJCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWF0KKwkJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF0gPSB7CisJW0MoTDFEKV0gPSB7CisJCVtDKE9QX1JFQUQpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQorCQkJCQk9IEFSTVY3X1BFUkZDVFJfTDFfRENBQ0hFX1JFQURfQUNDRVNTLAorCQkJW0MoUkVTVUxUX01JU1MpXQorCQkJCQk9IEFSTVY3X1BFUkZDVFJfTDFfRENBQ0hFX1JFQURfUkVGSUxMLAorCQl9LAorCQlbQyhPUF9XUklURSldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCisJCQkJCT0gQVJNVjdfUEVSRkNUUl9MMV9EQ0FDSEVfV1JJVEVfQUNDRVNTLAorCQkJW0MoUkVTVUxUX01JU1MpXQorCQkJCQk9IEFSTVY3X1BFUkZDVFJfTDFfRENBQ0hFX1dSSVRFX1JFRklMTCwKKwkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQl9LAorCX0sCisJW0MoTDFJKV0gPSB7CisJCS8qCisJCSAqIE5vdCBhbGwgcGVyZm9ybWFuY2UgY291bnRlcnMgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHJlYWQKKwkJICogYW5kIHdyaXRlIGFjY2Vzc2VzL21pc3NlcyBzbyB3ZSdyZSBub3QgYWx3YXlzIHN0cmljdGx5CisJCSAqIGNvcnJlY3QsIGJ1dCBpdCdzIHRoZSBiZXN0IHdlIGNhbiBkby4gV3JpdGVzIGFuZCByZWFkcyBnZXQKKwkJICogY29tYmluZWQgaW4gdGhlc2UgY2FzZXMuCisJCSAqLworCQlbQyhPUF9SRUFEKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBBUk1WN19QRVJGQ1RSX0wxX0lDQUNIRV9BQ0NFU1MsCisJCQlbQyhSRVNVTFRfTUlTUyldCT0gQVJNVjdfUEVSRkNUUl9JRkVUQ0hfTUlTUywKKwkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY3X1BFUkZDVFJfTDFfSUNBQ0hFX0FDQ0VTUywKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBBUk1WN19QRVJGQ1RSX0lGRVRDSF9NSVNTLAorCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCX0sCisJfSwKKwlbQyhMTCldID0geworCQlbQyhPUF9SRUFEKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0KKwkJCQkJPSBBUk1WN19QRVJGQ1RSX0wyX0RDQUNIRV9SRUFEX0FDQ0VTUywKKwkJCVtDKFJFU1VMVF9NSVNTKV0KKwkJCQkJPSBBUk1WN19QRVJGQ1RSX0wyX0RDQUNIRV9SRUFEX1JFRklMTCwKKwkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQorCQkJCQk9IEFSTVY3X1BFUkZDVFJfTDJfRENBQ0hFX1dSSVRFX0FDQ0VTUywKKwkJCVtDKFJFU1VMVF9NSVNTKV0KKwkJCQkJPSBBUk1WN19QRVJGQ1RSX0wyX0RDQUNIRV9XUklURV9SRUZJTEwsCisJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJfSwKKwl9LAorCVtDKERUTEIpXSA9IHsKKwkJW0MoT1BfUkVBRCldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCisJCQkJCT0gQVJNVjdfUEVSRkNUUl9MMV9EVExCX1JFQURfUkVGSUxMLAorCQl9LAorCQlbQyhPUF9XUklURSldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCisJCQkJCT0gQVJNVjdfUEVSRkNUUl9MMV9EVExCX1dSSVRFX1JFRklMTCwKKwkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQl9LAorCX0sCisJW0MoSVRMQildID0geworCQlbQyhPUF9SRUFEKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBBUk1WN19QRVJGQ1RSX0lUTEJfTUlTUywKKwkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXQk9IEFSTVY3X1BFUkZDVFJfSVRMQl9NSVNTLAorCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCX0sCisJfSwKKwlbQyhCUFUpXSA9IHsKKwkJW0MoT1BfUkVBRCldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQVJNVjdfUEVSRkNUUl9QQ19CUkFOQ0hfUFJFRCwKKwkJCVtDKFJFU1VMVF9NSVNTKV0KKwkJCQkJPSBBUk1WN19QRVJGQ1RSX1BDX0JSQU5DSF9NSVNfUFJFRCwKKwkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY3X1BFUkZDVFJfUENfQlJBTkNIX1BSRUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCisJCQkJCT0gQVJNVjdfUEVSRkNUUl9QQ19CUkFOQ0hfTUlTX1BSRUQsCisJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJfSwKKwl9LAogfTsKIAogLyoKQEAgLTc4Nyw3ICsxMDg5LDcgQEAKIAkJaWYgKCFhcm1wbXVfZXZlbnRfc2V0X3BlcmlvZChldmVudCwgaHdjLCBpZHgpKQogCQkJY29udGludWU7CiAKLQkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsIDAsICZkYXRhLCByZWdzKSkKKwkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsICZkYXRhLCByZWdzKSkKIAkJCWFybXBtdS0+ZGlzYWJsZShod2MsIGlkeCk7CiAJfQogCkBAIC05MDUsNiArMTIwNywyNiBAQAogCWFybXY3cG11Lm51bV9ldmVudHMJPSBhcm12N19yZWFkX251bV9wbW5jX2V2ZW50cygpOwogCXJldHVybiAmYXJtdjdwbXU7CiB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2E1X3BtdV9pbml0KHZvaWQpCit7CisJYXJtdjdwbXUuaWQJCT0gQVJNX1BFUkZfUE1VX0lEX0NBNTsKKwlhcm12N3BtdS5uYW1lCQk9ICJBUk12NyBDb3J0ZXgtQTUiOworCWFybXY3cG11LmNhY2hlX21hcAk9ICZhcm12N19hNV9wZXJmX2NhY2hlX21hcDsKKwlhcm12N3BtdS5ldmVudF9tYXAJPSAmYXJtdjdfYTVfcGVyZl9tYXA7CisJYXJtdjdwbXUubnVtX2V2ZW50cwk9IGFybXY3X3JlYWRfbnVtX3BtbmNfZXZlbnRzKCk7CisJcmV0dXJuICZhcm12N3BtdTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYTE1X3BtdV9pbml0KHZvaWQpCit7CisJYXJtdjdwbXUuaWQJCT0gQVJNX1BFUkZfUE1VX0lEX0NBMTU7CisJYXJtdjdwbXUubmFtZQkJPSAiQVJNdjcgQ29ydGV4LUExNSI7CisJYXJtdjdwbXUuY2FjaGVfbWFwCT0gJmFybXY3X2ExNV9wZXJmX2NhY2hlX21hcDsKKwlhcm12N3BtdS5ldmVudF9tYXAJPSAmYXJtdjdfYTE1X3BlcmZfbWFwOworCWFybXY3cG11Lm51bV9ldmVudHMJPSBhcm12N19yZWFkX251bV9wbW5jX2V2ZW50cygpOworCXJldHVybiAmYXJtdjdwbXU7Cit9CiAjZWxzZQogc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYThfcG11X2luaXQodm9pZCkKIHsKQEAgLTkxNSw0ICsxMjM3LDE0IEBACiB7CiAJcmV0dXJuIE5VTEw7CiB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2E1X3BtdV9pbml0KHZvaWQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2ExNV9wbXVfaW5pdCh2b2lkKQoreworCXJldHVybiBOVUxMOworfQogI2VuZGlmCS8qIENPTkZJR19DUFVfVjcgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3hzY2FsZS5jIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfeHNjYWxlLmMKaW5kZXggMzlhZmZiZS4uM2M0Mzk3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfeHNjYWxlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfeHNjYWxlLmMKQEAgLTE0NCw2ICsxNDQsMjAgQEAKIAkJCVtDKFJFU1VMVF9NSVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKIAkJfSwKIAl9LAorCVtDKE5PREUpXSA9IHsKKwkJW0MoT1BfUkVBRCldID0geworCQkJW0MoUkVTVUxUX0FDQ0VTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCQlbQyhSRVNVTFRfTUlTUyldCT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQsCisJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CisJCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJCVtDKFJFU1VMVF9NSVNTKV0JPSBDQUNIRV9PUF9VTlNVUFBPUlRFRCwKKwkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsKKwkJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQkJW0MoUkVTVUxUX01JU1MpXQk9IENBQ0hFX09QX1VOU1VQUE9SVEVELAorCQl9LAorCX0sCiB9OwogCiAjZGVmaW5lCVhTQ0FMRV9QTVVfRU5BQkxFCTB4MDAxCkBAIC0yNTEsNyArMjY1LDcgQEAKIAkJaWYgKCFhcm1wbXVfZXZlbnRfc2V0X3BlcmlvZChldmVudCwgaHdjLCBpZHgpKQogCQkJY29udGludWU7CiAKLQkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsIDAsICZkYXRhLCByZWdzKSkKKwkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsICZkYXRhLCByZWdzKSkKIAkJCWFybXBtdS0+ZGlzYWJsZShod2MsIGlkeCk7CiAJfQogCkBAIC01ODMsNyArNTk3LDcgQEAKIAkJaWYgKCFhcm1wbXVfZXZlbnRfc2V0X3BlcmlvZChldmVudCwgaHdjLCBpZHgpKQogCQkJY29udGludWU7CiAKLQkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsIDAsICZkYXRhLCByZWdzKSkKKwkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsICZkYXRhLCByZWdzKSkKIAkJCWFybXBtdS0+ZGlzYWJsZShod2MsIGlkeCk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcG11LmMgYi9hcmNoL2FybS9rZXJuZWwvcG11LmMKaW5kZXggMmM3OWVlYy4uMmI3MDcwOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BtdS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wbXUuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BtdS5oPgpAQCAtMjUsMzYgKzI2LDg4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbXVfZGV2aWNlc1tBUk1fTlVNX1BNVV9ERVZJQ0VTXTsKIAotc3RhdGljIGludCBfX2RldmluaXQgcG11X2RldmljZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgcG11X3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJCWVudW0gYXJtX3BtdV90eXBlIHR5cGUpCiB7Ci0KLQlpZiAocGRldi0+aWQgPCAwIHx8IHBkZXYtPmlkID49IEFSTV9OVU1fUE1VX0RFVklDRVMpIHsKKwlpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSBBUk1fTlVNX1BNVV9ERVZJQ0VTKSB7CiAJCXByX3dhcm5pbmcoInJlY2VpdmVkIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciB1bmtub3duICIKLQkJCQkiZGV2aWNlICVkXG4iLCBwZGV2LT5pZCk7CisJCQkJImRldmljZSAlZFxuIiwgdHlwZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChwbXVfZGV2aWNlc1twZGV2LT5pZF0pCi0JCXByX3dhcm5pbmcoInJlZ2lzdGVyaW5nIG5ldyBQTVUgZGV2aWNlIHR5cGUgJWQgb3ZlcndyaXRlcyAiCi0JCQkJInByZXZpb3VzIHJlZ2lzdHJhdGlvbiFcbiIsIHBkZXYtPmlkKTsKLQllbHNlCi0JCXByX2luZm8oInJlZ2lzdGVyZWQgbmV3IFBNVSBkZXZpY2Ugb2YgdHlwZSAlZFxuIiwKLQkJCQlwZGV2LT5pZCk7CisJaWYgKHBtdV9kZXZpY2VzW3R5cGVdKSB7CisJCXByX3dhcm5pbmcoInJlamVjdGluZyBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uIG9mIFBNVSBkZXZpY2UgIgorCQkJInR5cGUgJWQuIiwgdHlwZSk7CisJCXJldHVybiAtRU5PU1BDOworCX0KIAotCXBtdV9kZXZpY2VzW3BkZXYtPmlkXSA9IHBkZXY7CisJcHJfaW5mbygicmVnaXN0ZXJlZCBuZXcgUE1VIGRldmljZSBvZiB0eXBlICVkXG4iLCB0eXBlKTsKKwlwbXVfZGV2aWNlc1t0eXBlXSA9IHBkZXY7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBtdV9kcml2ZXIgPSB7CisjZGVmaW5lIE9GX01BVENIX1BNVShfbmFtZSwgX3R5cGUpIHsJXAorCS5jb21wYXRpYmxlID0gX25hbWUsCQlcCisJLmRhdGEgPSAodm9pZCAqKV90eXBlLAkJXAorfQorCisjZGVmaW5lIE9GX01BVENIX0NQVShuYW1lKQlPRl9NQVRDSF9QTVUobmFtZSwgQVJNX1BNVV9ERVZJQ0VfQ1BVKQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBhcm1wbXVfb2ZfZGV2aWNlX2lkc1tdID0geworCU9GX01BVENIX0NQVSgiYXJtLGNvcnRleC1hOS1wbXUiKSwKKwlPRl9NQVRDSF9DUFUoImFybSxjb3J0ZXgtYTgtcG11IiksCisJT0ZfTUFUQ0hfQ1BVKCJhcm0sYXJtMTEzNi1wbXUiKSwKKwlPRl9NQVRDSF9DUFUoImFybSxhcm0xMTc2LXBtdSIpLAorCXt9LAorfTsKKworI2RlZmluZSBQTEFUX01BVENIX1BNVShfbmFtZSwgX3R5cGUpIHsJXAorCS5uYW1lCQk9IF9uYW1lLAlcCisJLmRyaXZlcl9kYXRhCT0gX3R5cGUsCVwKK30KKworI2RlZmluZSBQTEFUX01BVENIX0NQVShfbmFtZSkJUExBVF9NQVRDSF9QTVUoX25hbWUsIEFSTV9QTVVfREVWSUNFX0NQVSkKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgYXJtcG11X3BsYXRfZGV2aWNlX2lkc1tdID0geworCVBMQVRfTUFUQ0hfQ1BVKCJhcm0tcG11IiksCisJe30sCit9OworCitlbnVtIGFybV9wbXVfdHlwZSBhcm1wbXVfZGV2aWNlX3R5cGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkCSpvZl9pZDsKKwljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICpwZGV2X2lkOworCisJLyogcHJvdmlkZWQgYnkgb2ZfZGV2aWNlX2lkIHRhYmxlICovCisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7CisJCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKGFybXBtdV9vZl9kZXZpY2VfaWRzLCAmcGRldi0+ZGV2KTsKKwkJQlVHX09OKCFvZl9pZCk7CisJCXJldHVybiAoZW51bSBhcm1fcG11X3R5cGUpb2ZfaWQtPmRhdGE7CisJfQorCisJLyogUHJvdmlkZWQgYnkgcGxhdGZvcm1fZGV2aWNlX2lkIHRhYmxlICovCisJcGRldl9pZCA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldik7CisJQlVHX09OKCFwZGV2X2lkKTsKKwlyZXR1cm4gcGRldl9pZC0+ZHJpdmVyX2RhdGE7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFybXBtdV9kZXZpY2VfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gcG11X3JlZ2lzdGVyKHBkZXYsIGFybXBtdV9kZXZpY2VfdHlwZShwZGV2KSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFybXBtdV9kcml2ZXIgPSB7CiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gImFybS1wbXUiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhcm1wbXVfb2ZfZGV2aWNlX2lkcywKIAl9LAotCS5wcm9iZQkJPSBwbXVfZGV2aWNlX3Byb2JlLAorCS5wcm9iZQkJPSBhcm1wbXVfZGV2aWNlX3Byb2JlLAorCS5pZF90YWJsZQk9IGFybXBtdV9wbGF0X2RldmljZV9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9wbXVfZHJpdmVyKHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcG11X2RyaXZlcik7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXJtcG11X2RyaXZlcik7CiB9CiBkZXZpY2VfaW5pdGNhbGwocmVnaXN0ZXJfcG11X2RyaXZlcik7CiAKQEAgLTc3LDExICsxMzAsMTEgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHJlc2VydmVfcG11KTsKIAogaW50Ci1yZWxlYXNlX3BtdShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorcmVsZWFzZV9wbXUoZW51bSBhcm1fcG11X3R5cGUgZGV2aWNlKQogewotCWlmIChXQVJOX09OKHBkZXYgIT0gcG11X2RldmljZXNbcGRldi0+aWRdKSkKKwlpZiAoV0FSTl9PTighcG11X2RldmljZXNbZGV2aWNlXSkpCiAJCXJldHVybiAtRUlOVkFMOwotCWNsZWFyX2JpdF91bmxvY2socGRldi0+aWQsICZwbXVfbG9jayk7CisJY2xlYXJfYml0X3VubG9jayhkZXZpY2UsICZwbXVfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWxlYXNlX3BtdSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKaW5kZXggOTcyNjAwNi4uMjQ5MWYzYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYwpAQCAtMjI4LDM0ICsyMjgsMTIgQEAKIAkuZm4JCT0gYnJlYWtfdHJhcCwKIH07CiAKLXN0YXRpYyBpbnQgdGh1bWIyX2JyZWFrX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnN0cikKLXsKLQl1bnNpZ25lZCBpbnQgaW5zdHIyOwotCXZvaWQgX191c2VyICpwYzsKLQotCS8qIENoZWNrIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCXBjID0gKHZvaWQgX191c2VyICopKGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgKyAyKTsKLQotCWlmIChwcm9jZXNzb3JfbW9kZShyZWdzKSA9PSBTVkNfTU9ERSkgewotCQlpbnN0cjIgPSAqKHUxNiAqKSBwYzsKLQl9IGVsc2UgewotCQlnZXRfdXNlcihpbnN0cjIsICh1MTYgX191c2VyICopcGMpOwotCX0KLQotCWlmIChpbnN0cjIgPT0gMHhhMDAwKSB7Ci0JCXB0cmFjZV9icmVhayhjdXJyZW50LCByZWdzKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDE7Ci0JfQotfQotCiBzdGF0aWMgc3RydWN0IHVuZGVmX2hvb2sgdGh1bWIyX2JyZWFrX2hvb2sgPSB7Ci0JLmluc3RyX21hc2sJPSAweGZmZmYsCi0JLmluc3RyX3ZhbAk9IDB4ZjdmMCwKKwkuaW5zdHJfbWFzawk9IDB4ZmZmZmZmZmYsCisJLmluc3RyX3ZhbAk9IDB4ZjdmMGEwMDAsCiAJLmNwc3JfbWFzawk9IFBTUl9UX0JJVCwKIAkuY3Bzcl92YWwJPSBQU1JfVF9CSVQsCi0JLmZuCQk9IHRodW1iMl9icmVha190cmFwLAorCS5mbgkJPSBicmVha190cmFwLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcHRyYWNlX2JyZWFrX2luaXQodm9pZCkKQEAgLTM5Niw3ICszNzQsNyBAQAogLyoKICAqIEhhbmRsZSBoaXR0aW5nIGEgSFctYnJlYWtwb2ludC4KICAqLwotc3RhdGljIHZvaWQgcHRyYWNlX2hicHRyaWdnZXJlZChzdHJ1Y3QgcGVyZl9ldmVudCAqYnAsIGludCB1bnVzZWQsCitzdGF0aWMgdm9pZCBwdHJhY2VfaGJwdHJpZ2dlcmVkKHN0cnVjdCBwZXJmX2V2ZW50ICpicCwKIAkJCQkgICAgIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLAogCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC00NzksNyArNDU3LDggQEAKIAlhdHRyLmJwX3R5cGUJPSB0eXBlOwogCWF0dHIuZGlzYWJsZWQJPSAxOwogCi0JcmV0dXJuIHJlZ2lzdGVyX3VzZXJfaHdfYnJlYWtwb2ludCgmYXR0ciwgcHRyYWNlX2hicHRyaWdnZXJlZCwgdHNrKTsKKwlyZXR1cm4gcmVnaXN0ZXJfdXNlcl9od19icmVha3BvaW50KCZhdHRyLCBwdHJhY2VfaGJwdHJpZ2dlcmVkLCBOVUxMLAorCQkJCQkgICB0c2spOwogfQogCiBzdGF0aWMgaW50IHB0cmFjZV9nZXRoYnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBsb25nIG51bSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKaW5kZXggZWQxMWZiMC4uNzBiY2E2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKQEAgLTczLDYgKzczLDcgQEAKICNlbmRpZgogCiBleHRlcm4gdm9pZCBwYWdpbmdfaW5pdChzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjKTsKK2V4dGVybiB2b2lkIHNhbml0eV9jaGVja19tZW1pbmZvKHZvaWQpOwogZXh0ZXJuIHZvaWQgcmVib290X3NldHVwKGNoYXIgKnN0cik7CiAKIHVuc2lnbmVkIGludCBwcm9jZXNzb3JfaWQ7CkBAIC0zNDIsNiArMzQzLDU5IEBACiAJCWVsZl9od2NhcCAmPSB+SFdDQVBfVExTOwogfQogCisvKgorICogY3B1X2luaXQgLSBpbml0aWFsaXNlIG9uZSBDUFUuCisgKgorICogY3B1X2luaXQgc2V0cyB1cCB0aGUgcGVyLUNQVSBzdGFja3MuCisgKi8KK3ZvaWQgY3B1X2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBzdGFjayAqc3RrID0gJnN0YWNrc1tjcHVdOworCisJaWYgKGNwdSA+PSBOUl9DUFVTKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIkNQVSV1OiBiYWQgcHJpbWFyeSBDUFUgbnVtYmVyXG4iLCBjcHUpOworCQlCVUcoKTsKKwl9CisKKwljcHVfcHJvY19pbml0KCk7CisKKwkvKgorCSAqIERlZmluZSB0aGUgcGxhY2VtZW50IGNvbnN0cmFpbnQgZm9yIHRoZSBpbmxpbmUgYXNtIGRpcmVjdGl2ZSBiZWxvdy4KKwkgKiBJbiBUaHVtYi0yLCBtc3Igd2l0aCBhbiBpbW1lZGlhdGUgdmFsdWUgaXMgbm90IGFsbG93ZWQuCisJICovCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKyNkZWZpbmUgUExDCSJyIgorI2Vsc2UKKyNkZWZpbmUgUExDCSJJIgorI2VuZGlmCisKKwkvKgorCSAqIHNldHVwIHN0YWNrcyBmb3IgcmUtZW50cmFudCBleGNlcHRpb24gaGFuZGxlcnMKKwkgKi8KKwlfX2FzbV9fICgKKwkibXNyCWNwc3JfYywgJTFcblx0IgorCSJhZGQJcjE0LCAlMCwgJTJcblx0IgorCSJtb3YJc3AsIHIxNFxuXHQiCisJIm1zcgljcHNyX2MsICUzXG5cdCIKKwkiYWRkCXIxNCwgJTAsICU0XG5cdCIKKwkibW92CXNwLCByMTRcblx0IgorCSJtc3IJY3Bzcl9jLCAlNVxuXHQiCisJImFkZAlyMTQsICUwLCAlNlxuXHQiCisJIm1vdglzcCwgcjE0XG5cdCIKKwkibXNyCWNwc3JfYywgJTciCisJICAgIDoKKwkgICAgOiAiciIgKHN0ayksCisJICAgICAgUExDIChQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBJUlFfTU9ERSksCisJICAgICAgIkkiIChvZmZzZXRvZihzdHJ1Y3Qgc3RhY2ssIGlycVswXSkpLAorCSAgICAgIFBMQyAoUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgQUJUX01PREUpLAorCSAgICAgICJJIiAob2Zmc2V0b2Yoc3RydWN0IHN0YWNrLCBhYnRbMF0pKSwKKwkgICAgICBQTEMgKFBTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFVORF9NT0RFKSwKKwkgICAgICAiSSIgKG9mZnNldG9mKHN0cnVjdCBzdGFjaywgdW5kWzBdKSksCisJICAgICAgUExDIChQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERSkKKwkgICAgOiAicjE0Iik7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9wcm9jZXNzb3Iodm9pZCkKIHsKIAlzdHJ1Y3QgcHJvY19pbmZvX2xpc3QgKmxpc3Q7CkBAIC0zODcsNTggKzQ0MSw3IEBACiAJZmVhdF92Nl9maXh1cCgpOwogCiAJY2FjaGVpZF9pbml0KCk7Ci0JY3B1X3Byb2NfaW5pdCgpOwotfQotCi0vKgotICogY3B1X2luaXQgLSBpbml0aWFsaXNlIG9uZSBDUFUuCi0gKgotICogY3B1X2luaXQgc2V0cyB1cCB0aGUgcGVyLUNQVSBzdGFja3MuCi0gKi8KLXZvaWQgY3B1X2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCBzdGFjayAqc3RrID0gJnN0YWNrc1tjcHVdOwotCi0JaWYgKGNwdSA+PSBOUl9DUFVTKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgIkNQVSV1OiBiYWQgcHJpbWFyeSBDUFUgbnVtYmVyXG4iLCBjcHUpOwotCQlCVUcoKTsKLQl9Ci0KLQkvKgotCSAqIERlZmluZSB0aGUgcGxhY2VtZW50IGNvbnN0cmFpbnQgZm9yIHRoZSBpbmxpbmUgYXNtIGRpcmVjdGl2ZSBiZWxvdy4KLQkgKiBJbiBUaHVtYi0yLCBtc3Igd2l0aCBhbiBpbW1lZGlhdGUgdmFsdWUgaXMgbm90IGFsbG93ZWQuCi0JICovCi0jaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKLSNkZWZpbmUgUExDCSJyIgotI2Vsc2UKLSNkZWZpbmUgUExDCSJJIgotI2VuZGlmCi0KLQkvKgotCSAqIHNldHVwIHN0YWNrcyBmb3IgcmUtZW50cmFudCBleGNlcHRpb24gaGFuZGxlcnMKLQkgKi8KLQlfX2FzbV9fICgKLQkibXNyCWNwc3JfYywgJTFcblx0IgotCSJhZGQJcjE0LCAlMCwgJTJcblx0IgotCSJtb3YJc3AsIHIxNFxuXHQiCi0JIm1zcgljcHNyX2MsICUzXG5cdCIKLQkiYWRkCXIxNCwgJTAsICU0XG5cdCIKLQkibW92CXNwLCByMTRcblx0IgotCSJtc3IJY3Bzcl9jLCAlNVxuXHQiCi0JImFkZAlyMTQsICUwLCAlNlxuXHQiCi0JIm1vdglzcCwgcjE0XG5cdCIKLQkibXNyCWNwc3JfYywgJTciCi0JICAgIDoKLQkgICAgOiAiciIgKHN0ayksCi0JICAgICAgUExDIChQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBJUlFfTU9ERSksCi0JICAgICAgIkkiIChvZmZzZXRvZihzdHJ1Y3Qgc3RhY2ssIGlycVswXSkpLAotCSAgICAgIFBMQyAoUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgQUJUX01PREUpLAotCSAgICAgICJJIiAob2Zmc2V0b2Yoc3RydWN0IHN0YWNrLCBhYnRbMF0pKSwKLQkgICAgICBQTEMgKFBTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFVORF9NT0RFKSwKLQkgICAgICAiSSIgKG9mZnNldG9mKHN0cnVjdCBzdGFjaywgdW5kWzBdKSksCi0JICAgICAgUExDIChQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBTVkNfTU9ERSkKLQkgICAgOiAicjE0Iik7CisJY3B1X2luaXQoKTsKIH0KIAogdm9pZCBfX2luaXQgZHVtcF9tYWNoaW5lX3RhYmxlKHZvaWQpCkBAIC05MDAsNiArOTAzLDcgQEAKIAogCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CiAKKwlzYW5pdHlfY2hlY2tfbWVtaW5mbygpOwogCWFybV9tZW1ibG9ja19pbml0KCZtZW1pbmZvLCBtZGVzYyk7CiAKIAlwYWdpbmdfaW5pdChtZGVzYyk7CkBAIC05MTMsOSArOTE3LDE0IEBACiAjZW5kaWYKIAlyZXNlcnZlX2NyYXNoa2VybmVsKCk7CiAKLQljcHVfaW5pdCgpOwogCXRjbV9pbml0KCk7CiAKKyNpZmRlZiBDT05GSUdfWk9ORV9ETUEKKwlpZiAobWRlc2MtPmRtYV96b25lX3NpemUpIHsKKwkJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXJtX2RtYV96b25lX3NpemU7CisJCWFybV9kbWFfem9uZV9zaXplID0gbWRlc2MtPmRtYV96b25lX3NpemU7CisJfQorI2VuZGlmCiAjaWZkZWYgQ09ORklHX01VTFRJX0lSUV9IQU5ETEVSCiAJaGFuZGxlX2FyY2hfaXJxID0gbWRlc2MtPmhhbmRsZV9pcnE7CiAjZW5kaWYKQEAgLTk3Nyw2ICs5ODYsMTAgQEAKIAkibmVvbiIsCiAJInZmcHYzIiwKIAkidmZwdjNkMTYiLAorCSJ0bHMiLAorCSJ2ZnB2NCIsCisJImlkaXZhIiwKKwkiaWRpdnQiLAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbGVlcC5TIGIvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKaW5kZXggNjM5OGVhZC4uZGM5MDJmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKQEAgLTEwLDY0ICsxMCw2MSBAQAogLyoKICAqIFNhdmUgQ1BVIHN0YXRlIGZvciBhIHN1c3BlbmQKICAqICByMSA9IHY6cCBvZmZzZXQKLSAqICByMyA9IHZpcnR1YWwgcmV0dXJuIGZ1bmN0aW9uCi0gKiBOb3RlOiBzcCBpcyBkZWNyZW1lbnRlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgQ1BVIHN0YXRlIG9uIHN0YWNrCi0gKiByMC1yMyxyOSxyMTAsbHIgY29ycnVwdGVkCisgKiAgcjIgPSBzdXNwZW5kIGZ1bmN0aW9uIGFyZzAKKyAqICByMyA9IHN1c3BlbmQgZnVuY3Rpb24KICAqLwotRU5UUlkoY3B1X3N1c3BlbmQpCi0JbW92CXI5LCBscgorRU5UUlkoX19jcHVfc3VzcGVuZCkKKwlzdG1mZAlzcCEsIHtyNCAtIHIxMSwgbHJ9CiAjaWZkZWYgTVVMVElfQ1BVCiAJbGRyCXIxMCwgPXByb2Nlc3NvcgotCW1vdglyMiwgc3AJCQlAIGN1cnJlbnQgdmlydHVhbCBTUAotCWxkcglyMCwgW3IxMCwgI0NQVV9TTEVFUF9TSVpFXSBAIHNpemUgb2YgQ1BVIHNsZWVwIHN0YXRlCisJbGRyCXI1LCBbcjEwLCAjQ1BVX1NMRUVQX1NJWkVdIEAgc2l6ZSBvZiBDUFUgc2xlZXAgc3RhdGUKIAlsZHIJaXAsIFtyMTAsICNDUFVfRE9fUkVTVU1FXSBAIHZpcnR1YWwgcmVzdW1lIGZ1bmN0aW9uCi0Jc3ViCXNwLCBzcCwgcjAJCUAgYWxsb2NhdGUgQ1BVIHN0YXRlIG9uIHN0YWNrCi0JbW92CXIwLCBzcAkJCUAgc2F2ZSBwb2ludGVyCisjZWxzZQorCWxkcglyNSwgPWNwdV9zdXNwZW5kX3NpemUKKwlsZHIJaXAsID1jcHVfZG9fcmVzdW1lCisjZW5kaWYKKwltb3YJcjYsIHNwCQkJQCBjdXJyZW50IHZpcnR1YWwgU1AKKwlzdWIJc3AsIHNwLCByNQkJQCBhbGxvY2F0ZSBDUFUgc3RhdGUgb24gc3RhY2sKKwltb3YJcjAsIHNwCQkJQCBzYXZlIHBvaW50ZXIgdG8gQ1BVIHNhdmUgYmxvY2sKIAlhZGQJaXAsIGlwLCByMQkJQCBjb252ZXJ0IHJlc3VtZSBmbiB0byBwaHlzCi0Jc3RtZmQJc3AhLCB7cjEsIHIyLCByMywgaXB9CUAgc2F2ZSB2OnAsIHZpcnQgU1AsIHJldGZuLCBwaHlzIHJlc3VtZSBmbgotCWxkcglyMywgPXNsZWVwX3NhdmVfc3AKLQlhZGQJcjIsIHNwLCByMQkJQCBjb252ZXJ0IFNQIHRvIHBoeXMKKwlzdG1mZAlzcCEsIHtyMSwgcjYsIGlwfQlAIHNhdmUgdjpwLCB2aXJ0IFNQLCBwaHlzIHJlc3VtZSBmbgorCWxkcglyNSwgPXNsZWVwX3NhdmVfc3AKKwlhZGQJcjYsIHNwLCByMQkJQCBjb252ZXJ0IFNQIHRvIHBoeXMKKwlzdG1mZAlzcCEsIHtyMiwgcjN9CQlAIHNhdmUgc3VzcGVuZCBmdW5jIGFyZyBhbmQgcG9pbnRlcgogI2lmZGVmIENPTkZJR19TTVAKIAlBTFRfU01QKG1yYyBwMTUsIDAsIGxyLCBjMCwgYzAsIDUpCiAJQUxUX1VQKG1vdiBsciwgIzApCiAJYW5kCWxyLCBsciwgIzE1Ci0Jc3RyCXIyLCBbcjMsIGxyLCBsc2wgIzJdCUAgc2F2ZSBwaHlzIFNQCisJc3RyCXI2LCBbcjUsIGxyLCBsc2wgIzJdCUAgc2F2ZSBwaHlzIFNQCiAjZWxzZQotCXN0cglyMiwgW3IzXQkJQCBzYXZlIHBoeXMgU1AKKwlzdHIJcjYsIFtyNV0JCUAgc2F2ZSBwaHlzIFNQCiAjZW5kaWYKKyNpZmRlZiBNVUxUSV9DUFUKIAltb3YJbHIsIHBjCiAJbGRyCXBjLCBbcjEwLCAjQ1BVX0RPX1NVU1BFTkRdIEAgc2F2ZSBDUFUgc3RhdGUKICNlbHNlCi0JbW92CXIyLCBzcAkJCUAgY3VycmVudCB2aXJ0dWFsIFNQCi0JbGRyCXIwLCA9Y3B1X3N1c3BlbmRfc2l6ZQotCXN1YglzcCwgc3AsIHIwCQlAIGFsbG9jYXRlIENQVSBzdGF0ZSBvbiBzdGFjawotCW1vdglyMCwgc3AJCQlAIHNhdmUgcG9pbnRlcgotCXN0bWZkCXNwISwge3IxLCByMiwgcjN9CUAgc2F2ZSB2OnAsIHZpcnQgU1AsIHJldHVybiBmbgotCWxkcglyMywgPXNsZWVwX3NhdmVfc3AKLQlhZGQJcjIsIHNwLCByMQkJQCBjb252ZXJ0IFNQIHRvIHBoeXMKLSNpZmRlZiBDT05GSUdfU01QCi0JQUxUX1NNUChtcmMgcDE1LCAwLCBsciwgYzAsIGMwLCA1KQotCUFMVF9VUChtb3YgbHIsICMwKQotCWFuZAlsciwgbHIsICMxNQotCXN0cglyMiwgW3IzLCBsciwgbHNsICMyXQlAIHNhdmUgcGh5cyBTUAotI2Vsc2UKLQlzdHIJcjIsIFtyM10JCUAgc2F2ZSBwaHlzIFNQCi0jZW5kaWYKIAlibAljcHVfZG9fc3VzcGVuZAogI2VuZGlmCiAKIAlAIGZsdXNoIGRhdGEgY2FjaGUKICNpZmRlZiBNVUxUSV9DQUNIRQogCWxkcglyMTAsID1jcHVfY2FjaGUKLQltb3YJbHIsIHI5CisJbW92CWxyLCBwYwogCWxkcglwYywgW3IxMCwgI0NBQ0hFX0ZMVVNIX0tFUk5fQUxMXQogI2Vsc2UKLQltb3YJbHIsIHI5Ci0JYglfX2NwdWNfZmx1c2hfa2Vybl9hbGwKKwlibAlfX2NwdWNfZmx1c2hfa2Vybl9hbGwKICNlbmRpZgotRU5EUFJPQyhjcHVfc3VzcGVuZCkKKwlhZHIJbHIsIEJTWU0oY3B1X3N1c3BlbmRfYWJvcnQpCisJbGRtZmQJc3AhLCB7cjAsIHBjfQkJQCBjYWxsIHN1c3BlbmQgZm4KK0VORFBST0MoX19jcHVfc3VzcGVuZCkKIAkubHRvcmcKIAorY3B1X3N1c3BlbmRfYWJvcnQ6CisJbGRtaWEJc3AhLCB7cjEgLSByM30JCUAgcG9wIHY6cCwgdmlydCBTUCwgcGh5cyByZXN1bWUgZm4KKwltb3YJc3AsIHIyCisJbGRtZmQJc3AhLCB7cjQgLSByMTEsIHBjfQorRU5EUFJPQyhjcHVfc3VzcGVuZF9hYm9ydCkKKwogLyoKICAqIHIwID0gY29udHJvbCByZWdpc3RlciB2YWx1ZQogICogcjEgPSB2OnAgb2Zmc2V0IChwcmVzZXJ2ZWQgYnkgY3B1X2RvX3Jlc3VtZSkKQEAgLTk3LDcgKzk0LDkgQEAKIGNwdV9yZXN1bWVfYWZ0ZXJfbW11OgogCXN0cglyNSwgW3IyLCByNCwgbHNsICMyXQlAIHJlc3RvcmUgb2xkIG1hcHBpbmcKIAltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCUAgdHVybiBvbiBELWNhY2hlCi0JbW92CXBjLCBscgorCWJsCWNwdV9pbml0CQlAIHJlc3RvcmUgdGhlIHVuZC9hYnQvaXJxIGJhbmtlZCByZWdzCisJbW92CXIwLCAjMAkJCUAgcmV0dXJuIHplcm8gb24gc3VjY2VzcworCWxkbWZkCXNwISwge3I0IC0gcjExLCBwY30KIEVORFBST0MoY3B1X3Jlc3VtZV9hZnRlcl9tbXUpCiAKIC8qCkBAIC0xMjAsMjAgKzExOSwxMSBAQAogCWxkcglyMCwgc2xlZXBfc2F2ZV9zcAlAIHN0YWNrIHBoeXMgYWRkcgogI2VuZGlmCiAJc2V0bW9kZQlQU1JfSV9CSVQgfCBQU1JfRl9CSVQgfCBTVkNfTU9ERSwgcjEgIEAgc2V0IFNWQywgaXJxcyBvZmYKLSNpZmRlZiBNVUxUSV9DUFUKLQlAIGxvYWQgdjpwLCBzdGFjaywgcmV0dXJuIGZuLCByZXN1bWUgZm4KLSAgQVJNKAlsZG1pYQlyMCEsIHtyMSwgc3AsIGxyLCBwY30JKQotVEhVTUIoCWxkbWlhCXIwISwge3IxLCByMiwgcjMsIHI0fQkpCisJQCBsb2FkIHY6cCwgc3RhY2ssIHJlc3VtZSBmbgorICBBUk0oCWxkbWlhCXIwISwge3IxLCBzcCwgcGN9CSkKK1RIVU1CKAlsZG1pYQlyMCEsIHtyMSwgcjIsIHIzfQkpCiBUSFVNQigJbW92CXNwLCByMgkJCSkKLVRIVU1CKAltb3YJbHIsIHIzCQkJKQotVEhVTUIoCWJ4CXI0CQkJKQotI2Vsc2UKLQlAIGxvYWQgdjpwLCBzdGFjaywgcmV0dXJuIGZuCi0gIEFSTSgJbGRtaWEJcjAhLCB7cjEsIHNwLCBscn0JKQotVEhVTUIoCWxkbWlhCXIwISwge3IxLCByMiwgbHJ9CSkKLVRIVU1CKAltb3YJc3AsIHIyCQkJKQotCWIJY3B1X2RvX3Jlc3VtZQotI2VuZGlmCitUSFVNQigJYngJcjMJCQkpCiBFTkRQUk9DKGNwdV9yZXN1bWUpCiAKIHNsZWVwX3NhdmVfc3A6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wLmMgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKaW5kZXggMzQ0ZTUyYi4uMTY3ZTNjYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwpAQCAtMzE4LDkgKzMxOCwxMyBAQAogCXNtcF9zdG9yZV9jcHVfaW5mbyhjcHUpOwogCiAJLyoKLQkgKiBPSywgbm93IGl0J3Mgc2FmZSB0byBsZXQgdGhlIGJvb3QgQ1BVIGNvbnRpbnVlCisJICogT0ssIG5vdyBpdCdzIHNhZmUgdG8gbGV0IHRoZSBib290IENQVSBjb250aW51ZS4gIFdhaXQgZm9yCisJICogdGhlIENQVSBtaWdyYXRpb24gY29kZSB0byBub3RpY2UgdGhhdCB0aGUgQ1BVIGlzIG9ubGluZQorCSAqIGJlZm9yZSB3ZSBjb250aW51ZS4KIAkgKi8KIAlzZXRfY3B1X29ubGluZShjcHUsIHRydWUpOworCXdoaWxlICghY3B1X2FjdGl2ZShjcHUpKQorCQljcHVfcmVsYXgoKTsKIAogCS8qCiAJICogT0ssIGl0J3Mgb2ZmIHRvIHRoZSBpZGxlIHRocmVhZCBmb3IgdXMKQEAgLTM2MSw4ICszNjUsNyBAQAogCSAqLwogCWlmIChtYXhfY3B1cyA+IG5jb3JlcykKIAkJbWF4X2NwdXMgPSBuY29yZXM7Ci0KLQlpZiAobWF4X2NwdXMgPiAxKSB7CisJaWYgKG5jb3JlcyA+IDEgJiYgbWF4X2NwdXMpIHsKIAkJLyoKIAkJICogRW5hYmxlIHRoZSBsb2NhbCB0aW1lciBvciBicm9hZGNhc3QgZGV2aWNlIGZvciB0aGUKIAkJICogYm9vdCBDUFUsIGJ1dCBvbmx5IGlmIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBDUFUuCkBAIC0zNzAsNiArMzczLDE0IEBACiAJCXBlcmNwdV90aW1lcl9zZXR1cCgpOwogCiAJCS8qCisJCSAqIEluaXRpYWxpc2UgdGhlIHByZXNlbnQgbWFwLCB3aGljaCBkZXNjcmliZXMgdGhlIHNldCBvZiBDUFVzCisJCSAqIGFjdHVhbGx5IHBvcHVsYXRlZCBhdCB0aGUgcHJlc2VudCB0aW1lLiBBIHBsYXRmb3JtIHNob3VsZAorCQkgKiByZS1pbml0aWFsaXplIHRoZSBtYXAgaW4gcGxhdGZvcm1fc21wX3ByZXBhcmVfY3B1cygpIGlmCisJCSAqIHByZXNlbnQgIT0gcG9zc2libGUgKGUuZy4gcGh5c2ljYWwgaG90cGx1ZykuCisJCSAqLworCQlpbml0X2NwdV9wcmVzZW50KCZjcHVfcG9zc2libGVfbWFwKTsKKworCQkvKgogCQkgKiBJbml0aWFsaXNlIHRoZSBTQ1UgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgQ1BVCiAJCSAqIGFuZCBsZXQgdGhlbSBrbm93IHdoZXJlIHRvIHN0YXJ0LgogCQkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXBfc2N1LmMgYi9hcmNoL2FybS9rZXJuZWwvc21wX3NjdS5jCmluZGV4IGExZTc1N2MuLjc5ZWQ1ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXBfc2N1LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcF9zY3UuYwpAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBTQ1VfSU5WQUxJREFURQkJMHgwYwogI2RlZmluZSBTQ1VfRlBHQV9SRVZJU0lPTgkweDEwCiAKKyNpZmRlZiBDT05GSUdfU01QCiAvKgogICogR2V0IHRoZSBudW1iZXIgb2YgQ1BVIGNvcmVzIGZyb20gdGhlIFNDVSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTUwLDYgKzUxLDcgQEAKIAkgKi8KIAlmbHVzaF9jYWNoZV9hbGwoKTsKIH0KKyNlbmRpZgogCiAvKgogICogU2V0IHRoZSBleGVjdXRpbmcgQ1BVcyBwb3dlciBtb2RlIGFzIGRlZmluZWQuICBUaGlzIHdpbGwgYmUgaW4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMgYi9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jCmluZGV4IDYwNjM2ZjQuLjJjMjc3ZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcF90d2QuYwpAQCAtMTE1LDcgKzExNSw3IEBACiAJCXR3ZF90aW1lcl9yYXRlID0gKDB4RkZGRkZGRkZVIC0gY291bnQpICogKEhaIC8gNSk7CiAKIAkJcHJpbnRrKCIlbHUuJTAybHVNSHouXG4iLCB0d2RfdGltZXJfcmF0ZSAvIDEwMDAwMDAsCi0JCQkodHdkX3RpbWVyX3JhdGUgLyAxMDAwMDAwKSAlIDEwMCk7CisJCQkodHdkX3RpbWVyX3JhdGUgLyAxMDAwMCkgJSAxMDApOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3N3cF9lbXVsYXRlLmMgYi9hcmNoL2FybS9rZXJuZWwvc3dwX2VtdWxhdGUuYwppbmRleCA0MGVlN2U1Li41ZjQ1MmY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc3dwX2VtdWxhdGUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc3dwX2VtdWxhdGUuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJdW5zaWduZWQgaW50IGFkZHJlc3MsIGRlc3RyZWcsIGRhdGEsIHR5cGU7CiAJdW5zaWduZWQgaW50IHJlcyA9IDA7CiAKLQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfRU1VTEFUSU9OX0ZBVUxUUywgMSwgMCwgcmVncywgcmVncy0+QVJNX3BjKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfRU1VTEFUSU9OX0ZBVUxUUywgMSwgcmVncywgcmVncy0+QVJNX3BjKTsKIAogCWlmIChjdXJyZW50LT5waWQgIT0gcHJldmlvdXNfcGlkKSB7CiAJCXByX2RlYnVnKCJcIiVzXCIgKCVsZCkgdXNlcyBkZXByZWNhdGVkIFNXUHtCfSBpbnN0cnVjdGlvblxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90Y20uYyBiL2FyY2gvYXJtL2tlcm5lbC90Y20uYwppbmRleCBmNWNmNjYwLi4zMGUzMDJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdGNtLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RjbS5jCkBAIC0xOSw2ICsxOSw4IEBACiAjaW5jbHVkZSAidGNtLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgZ2VuX3Bvb2wgKnRjbV9wb29sOworc3RhdGljIGJvb2wgZHRjbV9wcmVzZW50Oworc3RhdGljIGJvb2wgaXRjbV9wcmVzZW50OwogCiAvKiBUQ00gc2VjdGlvbiBkZWZpbml0aW9ucyBmcm9tIHRoZSBsaW5rZXIgKi8KIGV4dGVybiBjaGFyIF9faXRjbV9zdGFydCwgX19zaXRjbV90ZXh0LCBfX2VpdGNtX3RleHQ7CkBAIC05MCw2ICs5MiwxOCBAQAogfQogRVhQT1JUX1NZTUJPTCh0Y21fZnJlZSk7CiAKK2Jvb2wgdGNtX2R0Y21fcHJlc2VudCh2b2lkKQoreworCXJldHVybiBkdGNtX3ByZXNlbnQ7Cit9CitFWFBPUlRfU1lNQk9MKHRjbV9kdGNtX3ByZXNlbnQpOworCitib29sIHRjbV9pdGNtX3ByZXNlbnQodm9pZCkKK3sKKwlyZXR1cm4gaXRjbV9wcmVzZW50OworfQorRVhQT1JUX1NZTUJPTCh0Y21faXRjbV9wcmVzZW50KTsKKwogc3RhdGljIGludCBfX2luaXQgc2V0dXBfdGNtX2JhbmsodTggdHlwZSwgdTggYmFuaywgdTggYmFua3MsCiAJCQkJICB1MzIgKm9mZnNldCkKIHsKQEAgLTEzNCw2ICsxNDgsMTAgQEAKIAkJCSh0Y21fcmVnaW9uICYgMSkgPyAiIiA6ICJub3QgIik7CiAJfQogCisJLyogTm90IG11Y2ggZnVuIHlvdSBjYW4gZG8gd2l0aCBhIHNpemUgMCBiYW5rICovCisJaWYgKHRjbV9zaXplID09IDApCisJCXJldHVybiAwOworCiAJLyogRm9yY2UgbW92ZSB0aGUgVENNIGJhbmsgdG8gd2hlcmUgd2Ugd2FudCBpdCwgZW5hYmxlICovCiAJdGNtX3JlZ2lvbiA9ICpvZmZzZXQgfCAodGNtX3JlZ2lvbiAmIDB4MDAwMDBmZmVVKSB8IDE7CiAKQEAgLTE2NSwxMiArMTgzLDIwIEBACiAJdTMyIHRjbV9zdGF0dXMgPSByZWFkX2NwdWlkX3RjbXN0YXR1cygpOwogCXU4IGR0Y21fYmFua3MgPSAodGNtX3N0YXR1cyA+PiAxNikgJiAweDAzOwogCXU4IGl0Y21fYmFua3MgPSAodGNtX3N0YXR1cyAmIDB4MDMpOworCXNpemVfdCBkdGNtX2NvZGVfc3ogPSAmX19lZHRjbV9kYXRhIC0gJl9fc2R0Y21fZGF0YTsKKwlzaXplX3QgaXRjbV9jb2RlX3N6ID0gJl9fZWl0Y21fdGV4dCAtICZfX3NpdGNtX3RleHQ7CiAJY2hhciAqc3RhcnQ7CiAJY2hhciAqZW5kOwogCWNoYXIgKnJhbTsKIAlpbnQgcmV0OwogCWludCBpOwogCisJLyogVmFsdWVzIGdyZWF0ZXIgdGhhbiAyIGZvciBEL0lUQ00gYmFua3MgYXJlICJyZXNlcnZlZCIgKi8KKwlpZiAoZHRjbV9iYW5rcyA+IDIpCisJCWR0Y21fYmFua3MgPSAwOworCWlmIChpdGNtX2JhbmtzID4gMikKKwkJaXRjbV9iYW5rcyA9IDA7CisKIAkvKiBTZXR1cCBEVENNIGlmIHByZXNlbnQgKi8KIAlpZiAoZHRjbV9iYW5rcyA+IDApIHsKIAkJZm9yIChpID0gMDsgaSA8IGR0Y21fYmFua3M7IGkrKykgewpAQCAtMTc4LDYgKzIwNCwxMyBAQAogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm47CiAJCX0KKwkJLyogVGhpcyBtZWFucyB5b3UgY29tcGlsZWQgbW9yZSBjb2RlIHRoYW4gZml0cyBpbnRvIERUQ00gKi8KKwkJaWYgKGR0Y21fY29kZV9zeiA+IChkdGNtX2VuZCAtIERUQ01fT0ZGU0VUKSkgeworCQkJcHJfaW5mbygiQ1BVIERUQ006ICV1IGJ5dGVzIG9mIGNvZGUgY29tcGlsZWQgdG8gIgorCQkJCSJEVENNIGJ1dCBvbmx5ICVsdSBieXRlcyBvZiBEVENNIHByZXNlbnRcbiIsCisJCQkJZHRjbV9jb2RlX3N6LCAoZHRjbV9lbmQgLSBEVENNX09GRlNFVCkpOworCQkJZ290byBub19kdGNtOworCQl9CiAJCWR0Y21fcmVzLmVuZCA9IGR0Y21fZW5kIC0gMTsKIAkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZkdGNtX3Jlcyk7CiAJCWR0Y21faW9tYXBbMF0ubGVuZ3RoID0gZHRjbV9lbmQgLSBEVENNX09GRlNFVDsKQEAgLTE4NiwxMiArMjE5LDE2IEBACiAJCXN0YXJ0ID0gJl9fc2R0Y21fZGF0YTsKIAkJZW5kICAgPSAmX19lZHRjbV9kYXRhOwogCQlyYW0gICA9ICZfX2R0Y21fc3RhcnQ7Ci0JCS8qIFRoaXMgbWVhbnMgeW91IGNvbXBpbGVkIG1vcmUgY29kZSB0aGFuIGZpdHMgaW50byBEVENNICovCi0JCUJVR19PTigoZW5kIC0gc3RhcnQpID4gKGR0Y21fZW5kIC0gRFRDTV9PRkZTRVQpKTsKLQkJbWVtY3B5KHN0YXJ0LCByYW0sIChlbmQtc3RhcnQpKTsKLQkJcHJfZGVidWcoIkNQVSBEVENNOiBjb3BpZWQgZGF0YSBmcm9tICVwIC0gJXBcbiIsIHN0YXJ0LCBlbmQpOworCQltZW1jcHkoc3RhcnQsIHJhbSwgZHRjbV9jb2RlX3N6KTsKKwkJcHJfZGVidWcoIkNQVSBEVENNOiBjb3BpZWQgZGF0YSBmcm9tICVwIC0gJXBcbiIsCisJCQkgc3RhcnQsIGVuZCk7CisJCWR0Y21fcHJlc2VudCA9IHRydWU7CisJfSBlbHNlIGlmIChkdGNtX2NvZGVfc3opIHsKKwkJcHJfaW5mbygiQ1BVIERUQ006ICV1IGJ5dGVzIG9mIGNvZGUgY29tcGlsZWQgdG8gRFRDTSBidXQgbm8gIgorCQkJIkRUQ00gYmFua3MgcHJlc2VudCBpbiBDUFVcbiIsIGR0Y21fY29kZV9zeik7CiAJfQogCitub19kdGNtOgogCS8qIFNldHVwIElUQ00gaWYgcHJlc2VudCAqLwogCWlmIChpdGNtX2JhbmtzID4gMCkgewogCQlmb3IgKGkgPSAwOyBpIDwgaXRjbV9iYW5rczsgaSsrKSB7CkBAIC0xOTksNiArMjM2LDEzIEBACiAJCQlpZiAocmV0KQogCQkJCXJldHVybjsKIAkJfQorCQkvKiBUaGlzIG1lYW5zIHlvdSBjb21waWxlZCBtb3JlIGNvZGUgdGhhbiBmaXRzIGludG8gSVRDTSAqLworCQlpZiAoaXRjbV9jb2RlX3N6ID4gKGl0Y21fZW5kIC0gSVRDTV9PRkZTRVQpKSB7CisJCQlwcl9pbmZvKCJDUFUgSVRDTTogJXUgYnl0ZXMgb2YgY29kZSBjb21waWxlZCB0byAiCisJCQkJIklUQ00gYnV0IG9ubHkgJWx1IGJ5dGVzIG9mIElUQ00gcHJlc2VudFxuIiwKKwkJCQlpdGNtX2NvZGVfc3osIChpdGNtX2VuZCAtIElUQ01fT0ZGU0VUKSk7CisJCQlyZXR1cm47CisJCX0KIAkJaXRjbV9yZXMuZW5kID0gaXRjbV9lbmQgLSAxOwogCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJml0Y21fcmVzKTsKIAkJaXRjbV9pb21hcFswXS5sZW5ndGggPSBpdGNtX2VuZCAtIElUQ01fT0ZGU0VUOwpAQCAtMjA3LDEwICsyNTEsMTMgQEAKIAkJc3RhcnQgPSAmX19zaXRjbV90ZXh0OwogCQllbmQgICA9ICZfX2VpdGNtX3RleHQ7CiAJCXJhbSAgID0gJl9faXRjbV9zdGFydDsKLQkJLyogVGhpcyBtZWFucyB5b3UgY29tcGlsZWQgbW9yZSBjb2RlIHRoYW4gZml0cyBpbnRvIElUQ00gKi8KLQkJQlVHX09OKChlbmQgLSBzdGFydCkgPiAoaXRjbV9lbmQgLSBJVENNX09GRlNFVCkpOwotCQltZW1jcHkoc3RhcnQsIHJhbSwgKGVuZC1zdGFydCkpOwotCQlwcl9kZWJ1ZygiQ1BVIElUQ006IGNvcGllZCBjb2RlIGZyb20gJXAgLSAlcFxuIiwgc3RhcnQsIGVuZCk7CisJCW1lbWNweShzdGFydCwgcmFtLCBpdGNtX2NvZGVfc3opOworCQlwcl9kZWJ1ZygiQ1BVIElUQ006IGNvcGllZCBjb2RlIGZyb20gJXAgLSAlcFxuIiwKKwkJCSBzdGFydCwgZW5kKTsKKwkJaXRjbV9wcmVzZW50ID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKGl0Y21fY29kZV9zeikgeworCQlwcl9pbmZvKCJDUFUgSVRDTTogJXUgYnl0ZXMgb2YgY29kZSBjb21waWxlZCB0byBJVENNIGJ1dCBubyAiCisJCQkiSVRDTSBiYW5rcyBwcmVzZW50IGluIENQVVxuIiwgaXRjbV9jb2RlX3N6KTsKIAl9CiB9CiAKQEAgLTIyMSw3ICsyNjgsNiBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF90Y21fcG9vbCh2b2lkKQogewotCXUzMiB0Y21fc3RhdHVzID0gcmVhZF9jcHVpZF90Y21zdGF0dXMoKTsKIAl1MzIgZHRjbV9wb29sX3N0YXJ0ID0gKHUzMikgJl9fZWR0Y21fZGF0YTsKIAl1MzIgaXRjbV9wb29sX3N0YXJ0ID0gKHUzMikgJl9fZWl0Y21fdGV4dDsKIAlpbnQgcmV0OwpAQCAtMjM2LDcgKzI4Miw3IEBACiAJcHJfZGVidWcoIlNldHRpbmcgdXAgVENNIG1lbW9yeSBwb29sXG4iKTsKIAogCS8qIEFkZCB0aGUgcmVzdCBvZiBEVENNIHRvIHRoZSBUQ00gcG9vbCAqLwotCWlmICh0Y21fc3RhdHVzICYgKDB4MDMgPDwgMTYpKSB7CisJaWYgKGR0Y21fcHJlc2VudCkgewogCQlpZiAoZHRjbV9wb29sX3N0YXJ0IDwgZHRjbV9lbmQpIHsKIAkJCXJldCA9IGdlbl9wb29sX2FkZCh0Y21fcG9vbCwgZHRjbV9wb29sX3N0YXJ0LAogCQkJCQkgICBkdGNtX2VuZCAtIGR0Y21fcG9vbF9zdGFydCwgLTEpOwpAQCAtMjUzLDcgKzI5OSw3IEBACiAJfQogCiAJLyogQWRkIHRoZSByZXN0IG9mIElUQ00gdG8gdGhlIFRDTSBwb29sICovCi0JaWYgKHRjbV9zdGF0dXMgJiAweDAzKSB7CisJaWYgKGl0Y21fcHJlc2VudCkgewogCQlpZiAoaXRjbV9wb29sX3N0YXJ0IDwgaXRjbV9lbmQpIHsKIAkJCXJldCA9IGdlbl9wb29sX2FkZCh0Y21fcG9vbCwgaXRjbV9wb29sX3N0YXJ0LAogCQkJCQkgICBpdGNtX2VuZCAtIGl0Y21fcG9vbF9zdGFydCwgLTEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYwppbmRleCBkNTJlZWMyLi4yZDM0MzZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJZnMgPSBnZXRfZnMoKTsKIAlzZXRfZnMoS0VSTkVMX0RTKTsKIAotCWZvciAoaSA9IC00OyBpIDwgMTsgaSsrKSB7CisJZm9yIChpID0gLTQ7IGkgPCAxICsgISF0aHVtYjsgaSsrKSB7CiAJCXVuc2lnbmVkIGludCB2YWwsIGJhZDsKIAogCQlpZiAodGh1bWIpCkBAIC0zNTUsOSArMzU1LDI0IEBACiAJcGMgPSAodm9pZCBfX3VzZXIgKilpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOwogCiAJaWYgKHByb2Nlc3Nvcl9tb2RlKHJlZ3MpID09IFNWQ19NT0RFKSB7Ci0JCWluc3RyID0gKih1MzIgKikgcGM7CisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwkJaWYgKHRodW1iX21vZGUocmVncykpIHsKKwkJCWluc3RyID0gKCh1MTYgKilwYylbMF07CisJCQlpZiAoaXNfd2lkZV9pbnN0cnVjdGlvbihpbnN0cikpIHsKKwkJCQlpbnN0ciA8PD0gMTY7CisJCQkJaW5zdHIgfD0gKCh1MTYgKilwYylbMV07CisJCQl9CisJCX0gZWxzZQorI2VuZGlmCisJCQlpbnN0ciA9ICoodTMyICopIHBjOwogCX0gZWxzZSBpZiAodGh1bWJfbW9kZShyZWdzKSkgewogCQlnZXRfdXNlcihpbnN0ciwgKHUxNiBfX3VzZXIgKilwYyk7CisJCWlmIChpc193aWRlX2luc3RydWN0aW9uKGluc3RyKSkgeworCQkJdW5zaWduZWQgaW50IGluc3RyMjsKKwkJCWdldF91c2VyKGluc3RyMiwgKHUxNiBfX3VzZXIgKilwYysxKTsKKwkJCWluc3RyIDw8PSAxNjsKKwkJCWluc3RyIHw9IGluc3RyMjsKKwkJfQogCX0gZWxzZSB7CiAJCWdldF91c2VyKGluc3RyLCAodTMyIF9fdXNlciAqKXBjKTsKIAl9CkBAIC01NjMsNyArNTc4LDcgQEAKIAkJaWYgKCFwbWRfcHJlc2VudCgqcG1kKSkKIAkJCWdvdG8gYmFkX2FjY2VzczsKIAkJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCAmcHRsKTsKLQkJaWYgKCFwdGVfcHJlc2VudCgqcHRlKSB8fCAhcHRlX2RpcnR5KCpwdGUpKSB7CisJCWlmICghcHRlX3ByZXNlbnQoKnB0ZSkgfHwgIXB0ZV93cml0ZSgqcHRlKSB8fCAhcHRlX2RpcnR5KCpwdGUpKSB7CiAJCQlwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTsKIAkJCWdvdG8gYmFkX2FjY2VzczsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBlNTI4N2YyLi5iZjk3N2Y4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMzgsNTcgKzM4LDYgQEAKIAogU0VDVElPTlMKIHsKLSNpZmRlZiBDT05GSUdfWElQX0tFUk5FTAotCS4gPSBYSVBfVklSVF9BRERSKENPTkZJR19YSVBfUEhZU19BRERSKTsKLSNlbHNlCi0JLiA9IFBBR0VfT0ZGU0VUICsgVEVYVF9PRkZTRVQ7Ci0jZW5kaWYKLQotCS5pbml0IDogewkJCS8qIEluaXQgY29kZSBhbmQgZGF0YQkJKi8KLQkJX3N0ZXh0ID0gLjsKLQkJX3Npbml0dGV4dCA9IC47Ci0JCQlIRUFEX1RFWFQKLQkJCUlOSVRfVEVYVAotCQkJQVJNX0VYSVRfS0VFUChFWElUX1RFWFQpCi0JCV9laW5pdHRleHQgPSAuOwotCQlBUk1fQ1BVX0RJU0NBUkQoUFJPQ19JTkZPKQotCQlfX2FyY2hfaW5mb19iZWdpbiA9IC47Ci0JCQkqKC5hcmNoLmluZm8uaW5pdCkKLQkJX19hcmNoX2luZm9fZW5kID0gLjsKLQkJX190YWd0YWJsZV9iZWdpbiA9IC47Ci0JCQkqKC50YWdsaXN0LmluaXQpCi0JCV9fdGFndGFibGVfZW5kID0gLjsKLSNpZmRlZiBDT05GSUdfU01QX09OX1VQCi0JCV9fc21wYWx0X2JlZ2luID0gLjsKLQkJCSooLmFsdC5zbXAuaW5pdCkKLQkJX19zbXBhbHRfZW5kID0gLjsKLSNlbmRpZgotCi0JCV9fcHZfdGFibGVfYmVnaW4gPSAuOwotCQkJKigucHZfdGFibGUpCi0JCV9fcHZfdGFibGVfZW5kID0gLjsKLQotCQlJTklUX1NFVFVQKDE2KQotCi0JCUlOSVRfQ0FMTFMKLQkJQ09OX0lOSVRDQUxMCi0JCVNFQ1VSSVRZX0lOSVRDQUxMCi0JCUlOSVRfUkFNX0ZTCi0KLSNpZm5kZWYgQ09ORklHX1hJUF9LRVJORUwKLQkJX19pbml0X2JlZ2luID0gX3N0ZXh0OwotCQlJTklUX0RBVEEKLQkJQVJNX0VYSVRfS0VFUChFWElUX0RBVEEpCi0jZW5kaWYKLQl9Ci0KLQlQRVJDUFVfU0VDVElPTigzMikKLQotI2lmbmRlZiBDT05GSUdfWElQX0tFUk5FTAotCS4gPSBBTElHTihQQUdFX1NJWkUpOwotCV9faW5pdF9lbmQgPSAuOwotI2VuZGlmCi0KIAkvKgogCSAqIHVud2luZCBleGl0IHNlY3Rpb25zIG11c3QgYmUgZGlzY2FyZGVkIGJlZm9yZSB0aGUgcmVzdCBvZiB0aGUKIAkgKiB1bndpbmQgc2VjdGlvbnMgZ2V0IGluY2x1ZGVkLgpAQCAtMTA2LDEwICs1NSwyMiBAQAogCQkqKC5maXh1cCkKIAkJKihfX2V4X3RhYmxlKQogI2VuZGlmCisjaWZuZGVmIENPTkZJR19TTVBfT05fVVAKKwkJKiguYWx0LnNtcC5pbml0KQorI2VuZGlmCiAJfQogCisjaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKKwkuID0gWElQX1ZJUlRfQUREUihDT05GSUdfWElQX1BIWVNfQUREUik7CisjZWxzZQorCS4gPSBQQUdFX09GRlNFVCArIFRFWFRfT0ZGU0VUOworI2VuZGlmCisJLmhlYWQudGV4dCA6IHsKKwkJX3RleHQgPSAuOworCQlIRUFEX1RFWFQKKwl9CiAJLnRleHQgOiB7CQkJLyogUmVhbCB0ZXh0IHNlZ21lbnQJCSovCi0JCV90ZXh0ID0gLjsJCS8qIFRleHQgYW5kIHJlYWQtb25seSBkYXRhCSovCisJCV9zdGV4dCA9IC47CQkvKiBUZXh0IGFuZCByZWFkLW9ubHkgZGF0YQkqLwogCQkJX19leGNlcHRpb25fdGV4dF9zdGFydCA9IC47CiAJCQkqKC5leGNlcHRpb24udGV4dCkKIAkJCV9fZXhjZXB0aW9uX3RleHRfZW5kID0gLjsKQEAgLTEyMiw4ICs4Myw2IEBACiAJCQkqKC5maXh1cCkKICNlbmRpZgogCQkJKiguZ251Lndhcm5pbmcpCi0JCQkqKC5yb2RhdGEpCi0JCQkqKC5yb2RhdGEuKikKIAkJCSooLmdsdWVfNykKIAkJCSooLmdsdWVfN3QpCiAJCS4gPSBBTElHTig0KTsKQEAgLTE1MiwxMCArMTExLDYzIEBACiAKIAlfZXRleHQgPSAuOwkJCS8qIEVuZCBvZiB0ZXh0IGFuZCByb2RhdGEgc2VjdGlvbiAqLwogCisjaWZuZGVmIENPTkZJR19YSVBfS0VSTkVMCisJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJX19pbml0X2JlZ2luID0gLjsKKyNlbmRpZgorCisJSU5JVF9URVhUX1NFQ1RJT04oOCkKKwkuZXhpdC50ZXh0IDogeworCQlBUk1fRVhJVF9LRUVQKEVYSVRfVEVYVCkKKwl9CisJLmluaXQucHJvYy5pbmZvIDogeworCQlBUk1fQ1BVX0RJU0NBUkQoUFJPQ19JTkZPKQorCX0KKwkuaW5pdC5hcmNoLmluZm8gOiB7CisJCV9fYXJjaF9pbmZvX2JlZ2luID0gLjsKKwkJKiguYXJjaC5pbmZvLmluaXQpCisJCV9fYXJjaF9pbmZvX2VuZCA9IC47CisJfQorCS5pbml0LnRhZ3RhYmxlIDogeworCQlfX3RhZ3RhYmxlX2JlZ2luID0gLjsKKwkJKigudGFnbGlzdC5pbml0KQorCQlfX3RhZ3RhYmxlX2VuZCA9IC47CisJfQorI2lmZGVmIENPTkZJR19TTVBfT05fVVAKKwkuaW5pdC5zbXBhbHQgOiB7CisJCV9fc21wYWx0X2JlZ2luID0gLjsKKwkJKiguYWx0LnNtcC5pbml0KQorCQlfX3NtcGFsdF9lbmQgPSAuOworCX0KKyNlbmRpZgorCS5pbml0LnB2X3RhYmxlIDogeworCQlfX3B2X3RhYmxlX2JlZ2luID0gLjsKKwkJKigucHZfdGFibGUpCisJCV9fcHZfdGFibGVfZW5kID0gLjsKKwl9CisJLmluaXQuZGF0YSA6IHsKKyNpZm5kZWYgQ09ORklHX1hJUF9LRVJORUwKKwkJSU5JVF9EQVRBCisjZW5kaWYKKwkJSU5JVF9TRVRVUCgxNikKKwkJSU5JVF9DQUxMUworCQlDT05fSU5JVENBTEwKKwkJU0VDVVJJVFlfSU5JVENBTEwKKwkJSU5JVF9SQU1fRlMKKwl9CisjaWZuZGVmIENPTkZJR19YSVBfS0VSTkVMCisJLmV4aXQuZGF0YSA6IHsKKwkJQVJNX0VYSVRfS0VFUChFWElUX0RBVEEpCisJfQorI2VuZGlmCisKKwlQRVJDUFVfU0VDVElPTigzMikKKwogI2lmZGVmIENPTkZJR19YSVBfS0VSTkVMCiAJX19kYXRhX2xvYyA9IEFMSUdOKDQpOwkJLyogbG9jYXRpb24gaW4gYmluYXJ5ICovCiAJLiA9IFBBR0VfT0ZGU0VUICsgVEVYVF9PRkZTRVQ7CiAjZWxzZQorCV9faW5pdF9lbmQgPSAuOwogCS4gPSBBTElHTihUSFJFQURfU0laRSk7CiAJX19kYXRhX2xvYyA9IC47CiAjZW5kaWYKQEAgLTI3MCwxMiArMjgyLDYgQEAKIAogCS8qIERlZmF1bHQgZGlzY2FyZHMgKi8KIAlESVNDQVJEUwotCi0jaWZuZGVmIENPTkZJR19TTVBfT05fVVAKLQkvRElTQ0FSRC8gOiB7Ci0JCSooLmFsdC5zbXAuaW5pdCkKLQl9Ci0jZW5kaWYKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKaW5kZXggMTdmYWU0YS4uZjEwMTNkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKQEAgLTIyMywxNSArMjIzLDE1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgcGVyaXBoX2Nsb2Nrc19sb29rdXBzW10gPSB7Ci0JQ0xLREVWX0NPTl9ERVZfSUQoImhjbGsiLCAiYXRtZWxfdXNiYV91ZGMuMCIsICZ1dG1pX2NsayksCi0JQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAiYXRtZWxfdXNiYV91ZGMuMCIsICZ1ZHBoc19jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjIiwgJnV0bWlfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJhdG1lbF91c2JhX3VkYyIsICZ1ZHBoc19jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJtY2lfY2xrIiwgImF0OTFfbWNpLjAiLCAmbW1jMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJtY2lfY2xrIiwgImF0OTFfbWNpLjEiLCAmbW1jMV9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJzcGlfY2xrIiwgImF0bWVsX3NwaS4wIiwgJnNwaTBfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgic3BpX2NsayIsICJhdG1lbF9zcGkuMSIsICZzcGkxX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInQwX2NsayIsICJhdG1lbF90Y2IuMCIsICZ0Y2JfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4wIiwgJnNzYzBfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4xIiwgJnNzYzFfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2MwX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjEiLCAmc3NjMV9jbGspLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHVzYXJ0X2Nsb2Nrc19sb29rdXBzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDlfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5X2RldmljZXMuYwppbmRleCBjZDg1MGVkLi5kYmEwZDhkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDlfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOV9kZXZpY2VzLmMKQEAgLTEyMjAsNyArMTIyMCw3IEBACiB7CiAJaWYgKHBvcnRuciA8IEFUTUVMX01BWF9VQVJUKSB7CiAJCWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UgPSBhdDkxX3VhcnRzW3BvcnRucl07Ci0JCWF0OTFjYXA5X3NldF9jb25zb2xlX2Nsb2NrKHBvcnRucik7CisJCWF0OTFjYXA5X3NldF9jb25zb2xlX2Nsb2NrKGF0OTFfdWFydHNbcG9ydG5yXS0+aWQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMKaW5kZXggYjIyOGNlOS4uODNhMWEzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jCkBAIC0xOTksOSArMTk5LDkgQEAKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4xIiwgJnRjM19jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJ0MV9jbGsiLCAiYXRtZWxfdGNiLjEiLCAmdGM0X2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInQyX2NsayIsICJhdG1lbF90Y2IuMSIsICZ0YzVfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4wIiwgJnNzYzBfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4xIiwgJnNzYzFfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgic3NjIiwgInNzYy4yIiwgJnNzYzJfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2MwX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjEiLCAmc3NjMV9jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgInNzYy4yIiwgJnNzYzJfY2xrKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCB1c2FydF9jbG9ja3NfbG9va3Vwc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfZGV2aWNlcy5jCmluZGV4IGEwYmE0NzUuLjcyMjc3NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwX2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMF9kZXZpY2VzLmMKQEAgLTExMzUsNyArMTEzNSw3IEBACiB7CiAJaWYgKHBvcnRuciA8IEFUTUVMX01BWF9VQVJUKSB7CiAJCWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UgPSBhdDkxX3VhcnRzW3BvcnRucl07Ci0JCWF0OTFybTkyMDBfc2V0X2NvbnNvbGVfY2xvY2socG9ydG5yKTsKKwkJYXQ5MXJtOTIwMF9zZXRfY29uc29sZV9jbG9jayhhdDkxX3VhcnRzW3BvcnRucl0tPmlkKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjBfZGV2aWNlcy5jCmluZGV4IDFmZGViOTAuLjM5ZjgxZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwX2RldmljZXMuYwpAQCAtMTE3Myw3ICsxMTczLDcgQEAKIHsKIAlpZiAocG9ydG5yIDwgQVRNRUxfTUFYX1VBUlQpIHsKIAkJYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZSA9IGF0OTFfdWFydHNbcG9ydG5yXTsKLQkJYXQ5MXNhbTkyNjBfc2V0X2NvbnNvbGVfY2xvY2socG9ydG5yKTsKKwkJYXQ5MXNhbTkyNjBfc2V0X2NvbnNvbGVfY2xvY2soYXQ5MV91YXJ0c1twb3J0bnJdLT5pZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxX2RldmljZXMuYwppbmRleCAzZWI0NTM4Li4wZjkxNzkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MV9kZXZpY2VzLmMKQEAgLTUyNSw3ICs1MjUsNyBAQAogCWlmIChBUlJBWV9TSVpFKGxjZGNfcmVzb3VyY2VzKSA+IDIpIHsKIAkJdm9pZCBfX2lvbWVtICpmYjsKIAkJc3RydWN0IHJlc291cmNlICpmYl9yZXMgPSAmbGNkY19yZXNvdXJjZXNbMl07Ci0JCXNpemVfdCBmYl9sZW4gPSBmYl9yZXMtPmVuZCAtIGZiX3Jlcy0+c3RhcnQgKyAxOworCQlzaXplX3QgZmJfbGVuID0gcmVzb3VyY2Vfc2l6ZShmYl9yZXMpOwogCiAJCWZiID0gaW9yZW1hcChmYl9yZXMtPnN0YXJ0LCBmYl9sZW4pOwogCQlpZiAoZmIpIHsKQEAgLTEwMTMsNyArMTAxMyw3IEBACiB7CiAJaWYgKHBvcnRuciA8IEFUTUVMX01BWF9VQVJUKSB7CiAJCWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UgPSBhdDkxX3VhcnRzW3BvcnRucl07Ci0JCWF0OTFzYW05MjYxX3NldF9jb25zb2xlX2Nsb2NrKHBvcnRucik7CisJCWF0OTFzYW05MjYxX3NldF9jb25zb2xlX2Nsb2NrKGF0OTFfdWFydHNbcG9ydG5yXS0+aWQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2M19kZXZpY2VzLmMKaW5kZXggZmZlMDgxYi4uYTA1MGY0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jCkBAIC0xMzk1LDcgKzEzOTUsNyBAQAogewogCWlmIChwb3J0bnIgPCBBVE1FTF9NQVhfVUFSVCkgewogCQlhdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlID0gYXQ5MV91YXJ0c1twb3J0bnJdOwotCQlhdDkxc2FtOTI2M19zZXRfY29uc29sZV9jbG9jayhwb3J0bnIpOworCQlhdDkxc2FtOTI2M19zZXRfY29uc29sZV9jbG9jayhhdDkxX3VhcnRzW3BvcnRucl0tPmlkKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKaW5kZXggMmJiNmZmOS4uMTFlMjE0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKQEAgLTIxNywxMSArMjE3LDExIEBACiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgcGVyaXBoX2Nsb2Nrc19sb29rdXBzW10gPSB7CiAJLyogT25lIGFkZGl0aW9uYWwgZmFrZSBjbG9jayBmb3Igb2hjaSAqLwogCUNMS0RFVl9DT05fSUQoIm9oY2lfY2xrIiwgJnVocGhzX2NsayksCi0JQ0xLREVWX0NPTl9ERVZfSUQoImVoY2lfY2xrIiwgImF0bWVsLWVoY2kuMCIsICZ1aHBoc19jbGspLAotCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdXRtaV9jbGspLAotCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdWRwaHNfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgibWNpX2NsayIsICJhdDkxX21jaS4wIiwgJm1tYzBfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgibWNpX2NsayIsICJhdDkxX21jaS4xIiwgJm1tYzFfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgiZWhjaV9jbGsiLCAiYXRtZWwtZWhjaSIsICZ1aHBoc19jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjIiwgJnV0bWlfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJhdG1lbF91c2JhX3VkYyIsICZ1ZHBoc19jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJtY2lfY2xrIiwgImF0bWVsX21jaS4wIiwgJm1tYzBfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgibWNpX2NsayIsICJhdG1lbF9tY2kuMSIsICZtbWMxX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInNwaV9jbGsiLCAiYXRtZWxfc3BpLjAiLCAmc3BpMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJzcGlfY2xrIiwgImF0bWVsX3NwaS4xIiwgJnNwaTFfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4wIiwgJnRjYjBfY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDVfZGV2aWNlcy5jCmluZGV4IDA1Njc0ODYuLjYwMGJmZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1X2RldmljZXMuYwpAQCAtMTU1MCw3ICsxNTUwLDcgQEAKIHsKIAlpZiAocG9ydG5yIDwgQVRNRUxfTUFYX1VBUlQpIHsKIAkJYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZSA9IGF0OTFfdWFydHNbcG9ydG5yXTsKLQkJYXQ5MXNhbTlnNDVfc2V0X2NvbnNvbGVfY2xvY2socG9ydG5yKTsKKwkJYXQ5MXNhbTlnNDVfc2V0X2NvbnNvbGVfY2xvY2soYXQ5MV91YXJ0c1twb3J0bnJdLT5pZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYwppbmRleCAxYTQwZjE2Li4yOWRmZjE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsLmMKQEAgLTE5MSw4ICsxOTEsOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHBlcmlwaF9jbG9ja3NfbG9va3Vwc1tdID0gewotCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdXRtaV9jbGspLAotCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgImF0bWVsX3VzYmFfdWRjLjAiLCAmdWRwaHNfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgiaGNsayIsICJhdG1lbF91c2JhX3VkYyIsICZ1dG1pX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAiYXRtZWxfdXNiYV91ZGMiLCAmdWRwaHNfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4wIiwgJnRjMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJ0MV9jbGsiLCAiYXRtZWxfdGNiLjAiLCAmdGMxX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInQyX2NsayIsICJhdG1lbF90Y2IuMCIsICZ0YzJfY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYwppbmRleCBjMjk2MDQ1Li5hYWNiMTlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybF9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmxfZGV2aWNlcy5jCkBAIC0xMTY4LDcgKzExNjgsNyBAQAogewogCWlmIChwb3J0bnIgPCBBVE1FTF9NQVhfVUFSVCkgewogCQlhdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlID0gYXQ5MV91YXJ0c1twb3J0bnJdOwotCQlhdDkxc2FtOXJsX3NldF9jb25zb2xlX2Nsb2NrKHBvcnRucik7CisJCWF0OTFzYW05cmxfc2V0X2NvbnNvbGVfY2xvY2soYXQ5MV91YXJ0c1twb3J0bnJdLT5pZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYwppbmRleCAxOTA0ZmRmLi5jZGI2NWQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCWNzYSA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9NQVRSSVhfRUJJQ1NBKTsKIAlhdDkxX3N5c193cml0ZShBVDkxX01BVFJJWF9FQklDU0EsIGNzYSB8IEFUOTFfTUFUUklYX0VCSV9WRERJT01TRUxfM18zVik7CiAKLQljYXA5YWRrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSAhYm9hcmRfaGF2ZV9uYW5kXzhiaXQoKTsKKwljYXA5YWRrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSBib2FyZF9oYXZlX25hbmRfMTZiaXQoKTsKIAkvKiBzZXR1cCBidXMtd2lkdGggKDggb3IgMTYpICovCiAJaWYgKGNhcDlhZGtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNikKIAkJY2FwOWFka19uYW5kX3NtY19jb25maWcubW9kZSB8PSBBVDkxX1NNQ19EQldfMTY7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMKaW5kZXggZDYwMGRjMS4uNWMyNDA3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKIHsKLQlla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gIWJvYXJkX2hhdmVfbmFuZF84Yml0KCk7CisJZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9IGJvYXJkX2hhdmVfbmFuZF8xNmJpdCgpOwogCS8qIHNldHVwIGJ1cy13aWR0aCAoOCBvciAxNikgKi8KIAlpZiAoZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNikKIAkJZWtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzE2OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jCmluZGV4IGY4OTdmODQuLmI2MGMyMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYxZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCiB7Ci0JZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9ICFib2FyZF9oYXZlX25hbmRfOGJpdCgpOworCWVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSBib2FyZF9oYXZlX25hbmRfMTZiaXQoKTsKIAkvKiBzZXR1cCBidXMtd2lkdGggKDggb3IgMTYpICovCiAJaWYgKGVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYpCiAJCWVrX25hbmRfc21jX2NvbmZpZy5tb2RlIHw9IEFUOTFfU01DX0RCV18xNjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYwppbmRleCA2MDViMjZmLi45YmJkYzkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfbmFuZCh2b2lkKQogewotCWVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSAhYm9hcmRfaGF2ZV9uYW5kXzhiaXQoKTsKKwlla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gYm9hcmRfaGF2ZV9uYW5kXzE2Yml0KCk7CiAJLyogc2V0dXAgYnVzLXdpZHRoICg4IG9yIDE2KSAqLwogCWlmIChla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2KQogCQlla19uYW5kX3NtY19jb25maWcubW9kZSB8PSBBVDkxX1NNQ19EQldfMTY7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMKaW5kZXggNzYyNGNmMC4uMTMyNWE1MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKIHsKLQlla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gIWJvYXJkX2hhdmVfbmFuZF84Yml0KCk7CisJZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9IGJvYXJkX2hhdmVfbmFuZF8xNmJpdCgpOwogCS8qIHNldHVwIGJ1cy13aWR0aCAoOCBvciAxNikgKi8KIAlpZiAoZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNikKIAkJZWtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzE2OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jCmluZGV4IDA2M2M5NWQuLjMzZWFhMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMKQEAgLTE3OCw3ICsxNzgsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCiB7Ci0JZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9ICFib2FyZF9oYXZlX25hbmRfOGJpdCgpOworCWVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYgPSBib2FyZF9oYXZlX25hbmRfMTZiaXQoKTsKIAkvKiBzZXR1cCBidXMtd2lkdGggKDggb3IgMTYpICovCiAJaWYgKGVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYpCiAJCWVrX25hbmRfc21jX2NvbmZpZy5tb2RlIHw9IEFUOTFfU01DX0RCV18xNjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zbmFwcGVyOTI2MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMKaW5kZXggM2ViMGExMS4uNjAxMGNlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMKQEAgLTQsNyArNCw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEJsdWV3YXRlciBTeXN0ZW0gTHRkCiAgKgogICogQXV0aG9yOiBBbmRyZSBSZW5hdWQgPGFuZHJlQGJsdWV3YXRlcnN5cy5jb20+Ci0gKiBBdXRob3I6IFJ5YW4gTWFsbG9uICA8cnlhbkBibHVld2F0ZXJzeXMuY29tPgorICogQXV0aG9yOiBSeWFuIE1hbGxvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX21jaS5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX21jaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjE4MmMxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9tY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX21jaS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IEl2YW4gS29rc2hheXNreQotICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCi0gKgotICogTXVsdGlNZWRpYSBDYXJkIEludGVyZmFjZSAoTUNJKSByZWdpc3RlcnMuCi0gKiBCYXNlZCBvbiBBVDkxUk05MjAwIGRhdGFzaGVldCByZXZpc2lvbiBGLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBBVDkxX01DSV9ICi0jZGVmaW5lIEFUOTFfTUNJX0gKLQotI2RlZmluZSBBVDkxX01DSV9DUgkJMHgwMAkJLyogQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfTUNJRU4JCSgxIDw8ICAwKQkvKiBNdWx0aS1NZWRpYSBJbnRlcmZhY2UgRW5hYmxlICovCi0jZGVmaW5lCQlBVDkxX01DSV9NQ0lESVMJCSgxIDw8ICAxKQkvKiBNdWx0aS1NZWRpYSBJbnRlcmZhY2UgRGlzYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfUFdTRU4JCSgxIDw8ICAyKQkvKiBQb3dlciBTYXZlIE1vZGUgRW5hYmxlICovCi0jZGVmaW5lCQlBVDkxX01DSV9QV1NESVMJCSgxIDw8ICAzKQkvKiBQb3dlciBTYXZlIE1vZGUgRGlzYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfU1dSU1QJCSgxIDw8ICA3KQkvKiBTb2Z0d2FyZSBSZXNldCAqLwotCi0jZGVmaW5lIEFUOTFfTUNJX01SCQkweDA0CQkvKiBNb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX01DSV9DTEtESVYJCSgweGZmICA8PCAgMCkJLyogQ2xvY2sgRGl2aWRlciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfUFdTRElWCQkoNyAgICAgPDwgIDgpCS8qIFBvd2VyIFNhdmluZyBEaXZpZGVyICovCi0jZGVmaW5lCQlBVDkxX01DSV9SRFBST09GCSgxICAgICA8PCAxMSkJLyogUmVhZCBQcm9vZiBFbmFibGUgW1NBTTkyNlswM10gb25seV0gKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1dSUFJPT0YJKDEgICAgIDw8IDEyKQkvKiBXcml0ZSBQcm9vZiBFbmFibGUgW1NBTTkyNlswM10gb25seV0gKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1BEQ0ZCWVRFCSgxICAgICA8PCAxMykJLyogUERDIEZvcmNlIEJ5dGUgVHJhbnNmZXIgW1NBTTkyNlswM10gb25seV0gKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1BEQ1BBRFYJKDEgICAgIDw8IDE0KQkvKiBQREMgUGFkZGluZyBWYWx1ZSAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfUERDTU9ERQkoMSAgICAgPDwgMTUpCS8qIFBEQy1vcmllbnRhdGVkIE1vZGUgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX0JMS0xFTgkJKDB4ZmZmIDw8IDE4KQkvKiBEYXRhIEJsb2NrIExlbmd0aCAqLwotCi0jZGVmaW5lIEFUOTFfTUNJX0RUT1IJCTB4MDgJCS8qIERhdGEgVGltZW91dCBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfRFRPQ1lDCQkoMHhmIDw8IDApCS8qIERhdGEgVGltZW91dCBDeWNsZSBOdW1iZXIgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTAkJKDcgICA8PCA0KQkvKiBEYXRhIFRpbWVvdXQgTXVsdGlwbGllciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfRFRPTVVMXzEJCSgwIDw8ICA0KQotI2RlZmluZQkJQVQ5MV9NQ0lfRFRPTVVMXzE2CQkoMSA8PCAgNCkKLSNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF8xMjgJCSgyIDw8ICA0KQotI2RlZmluZQkJQVQ5MV9NQ0lfRFRPTVVMXzI1NgkJKDMgPDwgIDQpCi0jZGVmaW5lCQlBVDkxX01DSV9EVE9NVUxfMUsJCSg0IDw8ICA0KQotI2RlZmluZQkJQVQ5MV9NQ0lfRFRPTVVMXzRLCQkoNSA8PCAgNCkKLSNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF82NEsJCSg2IDw8ICA0KQotI2RlZmluZQkJQVQ5MV9NQ0lfRFRPTVVMXzFNCQkoNyA8PCAgNCkKLQotI2RlZmluZSBBVDkxX01DSV9TRENSCQkweDBjCQkvKiBTRCBDYXJkIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX01DSV9TRENTRUwJCSgzIDw8IDApCS8qIFNEIENhcmQgU2VsZWN0b3IgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1NEQ0JVUwkJKDEgPDwgNykJLyogMS1iaXQgb3IgNC1iaXQgYnVzICovCi0KLSNkZWZpbmUgQVQ5MV9NQ0lfQVJHUgkJMHgxMAkJLyogQXJndW1lbnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBBVDkxX01DSV9DTURSCQkweDE0CQkvKiBDb21tYW5kIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX01DSV9DTUROQgkJKDB4M2YgPDwgMCkJLyogQ29tbWFuZCBOdW1iZXIgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1JTUFRZUAkJKDMgICAgPDwgNikJLyogUmVzcG9uc2UgVHlwZSAqLwotI2RlZmluZQkJCUFUOTFfTUNJX1JTUFRZUF9OT05FCSgwIDw8ICA2KQotI2RlZmluZQkJCUFUOTFfTUNJX1JTUFRZUF80OAkoMSA8PCAgNikKLSNkZWZpbmUJCQlBVDkxX01DSV9SU1BUWVBfMTM2CSgyIDw8ICA2KQotI2RlZmluZQkJQVQ5MV9NQ0lfU1BDTUQJCSg3ICAgIDw8IDgpCS8qIFNwZWNpYWwgQ29tbWFuZCAqLwotI2RlZmluZQkJCUFUOTFfTUNJX1NQQ01EX05PTkUJKDAgPDwgIDgpCi0jZGVmaW5lCQkJQVQ5MV9NQ0lfU1BDTURfSU5JVAkoMSA8PCAgOCkKLSNkZWZpbmUJCQlBVDkxX01DSV9TUENNRF9TWU5DCSgyIDw8ICA4KQotI2RlZmluZQkJCUFUOTFfTUNJX1NQQ01EX0lDTUQJKDQgPDwgIDgpCi0jZGVmaW5lCQkJQVQ5MV9NQ0lfU1BDTURfSVJFU1AJKDUgPDwgIDgpCi0jZGVmaW5lCQlBVDkxX01DSV9PUERDTUQJCSgxIDw8IDExKQkvKiBPcGVuIERyYWluIENvbW1hbmQgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX01BWExBVAkJKDEgPDwgMTIpCS8qIE1heCBMYXRlbmN5IGZvciBDb21tYW5kIHRvIFJlc3BvbnNlICovCi0jZGVmaW5lCQlBVDkxX01DSV9UUkNNRAkJKDMgPDwgMTYpCS8qIFRyYW5zZmVyIENvbW1hbmQgKi8KLSNkZWZpbmUJCQlBVDkxX01DSV9UUkNNRF9OT05FCSgwIDw8IDE2KQotI2RlZmluZQkJCUFUOTFfTUNJX1RSQ01EX1NUQVJUCSgxIDw8IDE2KQotI2RlZmluZQkJCUFUOTFfTUNJX1RSQ01EX1NUT1AJKDIgPDwgMTYpCi0jZGVmaW5lCQlBVDkxX01DSV9UUkRJUgkJKDEgPDwgMTgpCS8qIFRyYW5zZmVyIERpcmVjdGlvbiAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfVFJUWVAJCSgzIDw8IDE5KQkvKiBUcmFuc2ZlciBUeXBlICovCi0jZGVmaW5lCQkJQVQ5MV9NQ0lfVFJUWVBfQkxPQ0sJKDAgPDwgMTkpCi0jZGVmaW5lCQkJQVQ5MV9NQ0lfVFJUWVBfTVVMVElQTEUJKDEgPDwgMTkpCi0jZGVmaW5lCQkJQVQ5MV9NQ0lfVFJUWVBfU1RSRUFNCSgyIDw8IDE5KQotI2RlZmluZQkJCUFUOTFfTUNJX1RSVFlQX1NESU9fQllURQkoNCA8PCAxOSkKLSNkZWZpbmUJCQlBVDkxX01DSV9UUlRZUF9TRElPX0JMT0NLCSg1IDw8IDE5KQotCi0jZGVmaW5lIEFUOTFfTUNJX0JMS1IJCTB4MTgJCS8qIEJsb2NrIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX01DSV9CTEtSX0JDTlQobikJKCgweGZmZmYgJiAobikpIDw8IDApCS8qIEJsb2NrIGNvdW50ICovCi0jZGVmaW5lCQlBVDkxX01DSV9CTEtSX0JMS0xFTihuKQkoKDB4ZmZmZiAmIChuKSkgPDwgMTYpCS8qIEJsb2NrIGxlbmd0aCAqLwotCi0jZGVmaW5lIEFUOTFfTUNJX1JTUFIobikJKDB4MjAgKyAoKG4pICogNCkpCS8qIFJlc3BvbnNlIFJlZ2lzdGVycyAwLTMgKi8KLSNkZWZpbmUgQVQ5MV9NQ1JfUkRSCQkweDMwCQkvKiBSZWNlaXZlIERhdGEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9NQ1JfVERSCQkweDM0CQkvKiBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgQVQ5MV9NQ0lfU1IJCTB4NDAJCS8qIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfQ01EUkRZCQkoMSA8PCAgMCkJLyogQ29tbWFuZCBSZWFkeSAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfUlhSRFkJCSgxIDw8ICAxKQkvKiBSZWNlaXZlciBSZWFkeSAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfVFhSRFkJCSgxIDw8ICAyKQkvKiBUcmFuc21pdCBSZWFkeSAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfQkxLRQkJKDEgPDwgIDMpCS8qIERhdGEgQmxvY2sgRW5kZWQgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX0RUSVAJCSgxIDw8ICA0KQkvKiBEYXRhIFRyYW5zZmVyIGluIFByb2dyZXNzICovCi0jZGVmaW5lCQlBVDkxX01DSV9OT1RCVVNZCSgxIDw8ICA1KQkvKiBEYXRhIE5vdCBCdXN5ICovCi0jZGVmaW5lCQlBVDkxX01DSV9FTkRSWAkJKDEgPDwgIDYpCS8qIEVuZCBvZiBSWCBCdWZmZXIgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX0VORFRYCQkoMSA8PCAgNykJLyogRW5kIGZvIFRYIEJ1ZmZlciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfU0RJT0lSUUEJKDEgPDwgIDgpCS8qIFNESU8gSW50ZXJydXB0IGZvciBTbG90IEEgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1NESU9JUlFCCSgxIDw8ICA5KQkvKiBTRElPIEludGVycnVwdCBmb3IgU2xvdCBCICovCi0jZGVmaW5lCQlBVDkxX01DSV9SWEJVRkYJCSgxIDw8IDE0KQkvKiBSWCBCdWZmZXIgRnVsbCAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfVFhCVUZFCQkoMSA8PCAxNSkJLyogVFggQnVmZmVyIEVtcHR5ICovCi0jZGVmaW5lCQlBVDkxX01DSV9SSU5ERQkJKDEgPDwgMTYpCS8qIFJlc3BvbnNlIEluZGV4IEVycm9yICovCi0jZGVmaW5lCQlBVDkxX01DSV9SRElSRQkJKDEgPDwgMTcpCS8qIFJlc3BvbnNlIERpcmVjdGlvbiBFcnJvciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfUkNSQ0UJCSgxIDw8IDE4KQkvKiBSZXNwb25zZSBDUkMgRXJyb3IgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1JFTkRFCQkoMSA8PCAxOSkJLyogUmVzcG9uc2UgRW5kIEJpdCBFcnJvciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfUlRPRQkJKDEgPDwgMjApCS8qIFJlc3BvbnNlIFRpbWUtb3V0IEVycm9yICovCi0jZGVmaW5lCQlBVDkxX01DSV9EQ1JDRQkJKDEgPDwgMjEpCS8qIERhdGEgQ1JDIEVycm9yICovCi0jZGVmaW5lCQlBVDkxX01DSV9EVE9FCQkoMSA8PCAyMikJLyogRGF0YSBUaW1lLW91dCBFcnJvciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfT1ZSRQkJKDEgPDwgMzApCS8qIE92ZXJydW4gKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1VOUkUJCSgxIDw8IDMxKQkvKiBVbmRlcnJ1biAqLwotCi0jZGVmaW5lIEFUOTFfTUNJX0lFUgkJMHg0NAkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX01DSV9JRFIJCTB4NDgJCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfTUNJX0lNUgkJMHg0YwkJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL3N5c3RlbV9yZXYuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvc3lzdGVtX3Jldi5oCmluZGV4IGI4NTVlZTcuLjhmNDg2NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvc3lzdGVtX3Jldi5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvc3lzdGVtX3Jldi5oCkBAIC0xMywxMyArMTMsMTMgQEAKICAqIHRoZSAxNi0zMSBiaXQgYXJlIHJlc2VydmVkIGZvciBhdDkxIGdlbmVyaWMgaW5mb3JtYXRpb24KICAqCiAgKiBiaXQgMzE6Ci0gKgkwID0+IG5hbmQgMTYgYml0Ci0gKgkxID0+IG5hbmQgOCBiaXQKKyAqCTAgPT4gbmFuZCA4IGJpdAorICoJMSA9PiBuYW5kIDE2IGJpdAogICovCi0jZGVmaW5lIEJPQVJEX0hBVkVfTkFORF84QklUCSgxIDw8IDMxKQotc3RhdGljIGludCBpbmxpbmUgYm9hcmRfaGF2ZV9uYW5kXzhiaXQodm9pZCkKKyNkZWZpbmUgQk9BUkRfSEFWRV9OQU5EXzE2QklUCSgxIDw8IDMxKQorc3RhdGljIGlubGluZSBpbnQgYm9hcmRfaGF2ZV9uYW5kXzE2Yml0KHZvaWQpCiB7Ci0JcmV0dXJuIHN5c3RlbV9yZXYgJiBCT0FSRF9IQVZFX05BTkRfOEJJVDsKKwlyZXR1cm4gc3lzdGVtX3JldiAmIEJPQVJEX0hBVkVfTkFORF8xNkJJVDsKIH0KIAogI2VuZGlmIC8qIF9fQVJDSF9TWVNURU1fUkVWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2RtYS5jCmluZGV4IGQ4N2FkMzAuLjlmMmE5NDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvZG1hLmMKQEAgLTgzNSw3ICs4MzUsNyBAQAogCiAJLyogQ3JlYXRlIC9wcm9jL2RtYS9jaGFubmVscyBhbmQgL3Byb2MvZG1hL2RldmljZXMgKi8KIAotCWdEbWFEaXIgPSBjcmVhdGVfcHJvY19lbnRyeSgiZG1hIiwgU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPLCBOVUxMKTsKKwlnRG1hRGlyID0gcHJvY19ta2RpcigiZG1hIiwgTlVMTCk7CiAKIAlpZiAoZ0RtYURpciA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYy9kbWFcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCmluZGV4IDdkMzkzY2EuLjk0Yzk1MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKQEAgLTgwLDcgKzgwLDMgQEAKIAogCQkubWFjcm8gIGFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKIAkJLmVuZG0KLQotCQkubWFjcm8JaXJxX3ByaW9fdGFibGUKLQkJLmVuZG0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2luY2x1ZGUvbWFjaC92bWFsbG9jLmggYi9hcmNoL2FybS9tYWNoLWNuczN4eHgvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAppbmRleCA0ZDM4MWVjLi4xZGQyMzFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNuczN4eHgvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAorKysgYi9hcmNoL2FybS9tYWNoLWNuczN4eHgvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaApAQCAtOCw0ICs4LDQgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNkZWZpbmUgVk1BTExPQ19FTkQJCTB4ZDgwMDAwMDAKKyNkZWZpbmUgVk1BTExPQ19FTkQJCTB4ZDgwMDAwMDBVTApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODMwLWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODMwLWV2bS5jCmluZGV4IDhiYzM3MDEuLjg0ZmQ3ODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTgzMC1ldm0uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4MzAtZXZtLmMKQEAgLTY4MSw0ICs2ODEsNSBAQAogCS5pbml0X2lycQk9IGNwX2ludGNfaW5pdCwKIAkudGltZXIJCT0gJmRhdmluY2lfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IGRhODMwX2V2bV9pbml0LAorCS5kbWFfem9uZV9zaXplCT0gU1pfMTI4TSwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4NTAtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4NTAtZXZtLmMKaW5kZXggYTdiNDFiZi4uMjk2NzFlZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODUwLWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTg1MC1ldm0uYwpAQCAtMTI2MSw0ICsxMjYxLDUgQEAKIAkuaW5pdF9pcnEJPSBjcF9pbnRjX2luaXQsCiAJLnRpbWVyCQk9ICZkYXZpbmNpX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBkYTg1MF9ldm1faW5pdCwKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzEyOE0sCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWV2bS5jCmluZGV4IDZlN2NhZDEzLi4yNDFhNmJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWV2bS5jCkBAIC0zNTYsNCArMzU2LDUgQEAKIAkuaW5pdF9pcnEgICAgID0gZGF2aW5jaV9pcnFfaW5pdCwKIAkudGltZXIJICAgICAgPSAmZGF2aW5jaV90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gZG0zNTVfZXZtX2luaXQsCisJLmRtYV96b25lX3NpemUJPSBTWl8xMjhNLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM1NS1sZW9wYXJkLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtbGVvcGFyZC5jCmluZGV4IDU0M2Y5OTEuLmJlZTI4NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM1NS1sZW9wYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWxlb3BhcmQuYwpAQCAtMjc1LDQgKzI3NSw1IEBACiAJLmluaXRfaXJxICAgICA9IGRhdmluY2lfaXJxX2luaXQsCiAJLnRpbWVyCSAgICAgID0gJmRhdmluY2lfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IGRtMzU1X2xlb3BhcmRfaW5pdCwKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzEyOE0sCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzY1LWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzY1LWV2bS5jCmluZGV4IGM2N2Y2ODQuLjk4MThmMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM2NS1ldm0uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMKQEAgLTUyMCw3ICs1MjAsNyBAQAogCSAqLwogCWlmIChoYXZlX2ltYWdlcigpKSB7CiAJCWxhYmVsID0gIkhEIGltYWdlciI7Ci0JCW11eCB8PSAxOworCQltdXggfD0gMjsKIAogCQkvKiBleHRlcm5hbGx5IG11eCBNTUMxL0VORVQvQUlDMzMgdG8gaW1hZ2VyICovCiAJCW11eCB8PSBCSVQoNikgfCBCSVQoNSkgfCBCSVQoMyk7CkBAIC01NDAsNyArNTQwLDcgQEAKIAkJcmVzZXRzICY9IH5CSVQoMSk7CiAKIAkJaWYgKGhhdmVfdHZwNzAwMigpKSB7Ci0JCQltdXggfD0gMjsKKwkJCW11eCB8PSAxOwogCQkJcmVzZXRzICY9IH5CSVQoMik7CiAJCQlsYWJlbCA9ICJ0dnA3MDAyIEhEIjsKIAkJfSBlbHNlIHsKQEAgLTYxNyw1ICs2MTcsNiBAQAogCS5pbml0X2lycQk9IGRhdmluY2lfaXJxX2luaXQsCiAJLnRpbWVyCQk9ICZkYXZpbmNpX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBkbTM2NV9ldm1faW5pdCwKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzEyOE0sCiBNQUNISU5FX0VORAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDR4LWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtNjQ0eC1ldm0uYwppbmRleCA1NTZiYmQ0Li45NTYwN2ExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDR4LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTY0NHgtZXZtLmMKQEAgLTcxNyw0ICs3MTcsNSBAQAogCS5pbml0X2lycSAgICAgPSBkYXZpbmNpX2lycV9pbml0LAogCS50aW1lcgkgICAgICA9ICZkYXZpbmNpX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBkYXZpbmNpX2V2bV9pbml0LAorCS5kbWFfem9uZV9zaXplCT0gU1pfMTI4TSwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDZ4LWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtNjQ2eC1ldm0uYwppbmRleCBmNmFjOWJhLi45OTNhMzE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDZ4LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTY0NngtZXZtLmMKQEAgLTcxOSw5ICs3MTksMTUgQEAKIAl9CiB9CiAKKyNkZWZpbmUgRE02NDY3VF9FVk1fUkVGX0ZSRVEJCTMzMDAwMDAwCisKIHN0YXRpYyB2b2lkIF9faW5pdCBkYXZpbmNpX21hcF9pbyh2b2lkKQogewogCWRtNjQ2eF9pbml0KCk7CisKKwlpZiAobWFjaGluZV9pc19kYXZpbmNpX2RtNjQ2N3Rldm0oKSkKKwkJZGF2aW5jaV9zZXRfcmVmY2xrX3JhdGUoRE02NDY3VF9FVk1fUkVGX0ZSRVEpOworCiAJY2RjZV9jbGtfaW5pdCgpOwogfQogCkBAIC03ODUsMjMgKzc5MSwxMyBAQAogCXNvY19pbmZvLT5lbWFjX3BkYXRhLT5waHlfaWQgPSBETTY0NlhfRVZNX1BIWV9JRDsKIH0KIAotI2RlZmluZSBETTY0NlhfRVZNX1JFRl9GUkVRCQkyNzAwMDAwMAotI2RlZmluZSBETTY0NjdUX0VWTV9SRUZfRlJFUQkJMzMwMDAwMDAKLQotdm9pZCBfX2luaXQgZG02NDZ4X2JvYXJkX3NldHVwX3JlZmNsayhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaWYgKG1hY2hpbmVfaXNfZGF2aW5jaV9kbTY0Njd0ZXZtKCkpCi0JCWNsay0+cmF0ZSA9IERNNjQ2N1RfRVZNX1JFRl9GUkVROwotCWVsc2UKLQkJY2xrLT5yYXRlID0gRE02NDZYX0VWTV9SRUZfRlJFUTsKLX0KLQogTUFDSElORV9TVEFSVChEQVZJTkNJX0RNNjQ2N19FVk0sICJEYVZpbmNpIERNNjQ2eCBFVk0iKQogCS5ib290X3BhcmFtcyAgPSAoMHg4MDAwMDEwMCksCiAJLm1hcF9pbyAgICAgICA9IGRhdmluY2lfbWFwX2lvLAogCS5pbml0X2lycSAgICAgPSBkYXZpbmNpX2lycV9pbml0LAogCS50aW1lciAgICAgICAgPSAmZGF2aW5jaV90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gZXZtX2luaXQsCisJLmRtYV96b25lX3NpemUJPSBTWl8xMjhNLAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChEQVZJTkNJX0RNNjQ2N1RFVk0sICJEYVZpbmNpIERNNjQ2N1QgRVZNIikKQEAgLTgxMCw1ICs4MDYsNiBAQAogCS5pbml0X2lycSAgICAgPSBkYXZpbmNpX2lycV9pbml0LAogCS50aW1lciAgICAgICAgPSAmZGF2aW5jaV90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gZXZtX2luaXQsCisJLmRtYV96b25lX3NpemUJPSBTWl8xMjhNLAogTUFDSElORV9FTkQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW1pdHlvbWFwbDEzOC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW1pdHlvbWFwbDEzOC5jCmluZGV4IDYwNmE2ZjIuLmMyNzgyMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1taXR5b21hcGwxMzguYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtbWl0eW9tYXBsMTM4LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgpAQCAtNTcwLDQgKzU3MSw1IEBACiAJLmluaXRfaXJxCT0gY3BfaW50Y19pbml0LAogCS50aW1lcgkJPSAmZGF2aW5jaV90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gbWl0eW9tYXBsMTM4X2luaXQsCisJLmRtYV96b25lX3NpemUJPSBTWl8xMjhNLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1uZXVyb3Mtb3NkMi5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW5ldXJvcy1vc2QyLmMKaW5kZXggM2U3YmUyZC4uZDYwYTgwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW5ldXJvcy1vc2QyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW5ldXJvcy1vc2QyLmMKQEAgLTI3Nyw0ICsyNzcsNSBAQAogCS5pbml0X2lycQk9IGRhdmluY2lfaXJxX2luaXQsCiAJLnRpbWVyCQk9ICZkYXZpbmNpX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBkYXZpbmNpX250b3NkMl9pbml0LAorCS5kbWFfem9uZV9zaXplCT0gU1pfMTI4TSwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtb21hcGwxMzgtaGF3ay5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW9tYXBsMTM4LWhhd2suYwppbmRleCA2N2MzOGQwLi4yMzczMzJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtb21hcGwxMzgtaGF3ay5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1vbWFwbDEzOC1oYXdrLmMKQEAgLTM0Myw0ICszNDMsNSBAQAogCS5pbml0X2lycQk9IGNwX2ludGNfaW5pdCwKIAkudGltZXIJCT0gJmRhdmluY2lfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBsMTM4X2hhd2tfaW5pdCwKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzEyOE0sCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLXNmZnNkci5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLXNmZnNkci5jCmluZGV4IDYxYWM5NmQuLjVmNDM4NWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1zZmZzZHIuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtc2Zmc2RyLmMKQEAgLTE1Niw0ICsxNTYsNSBAQAogCS5pbml0X2lycSAgICAgPSBkYXZpbmNpX2lycV9pbml0LAogCS50aW1lcgkgICAgICA9ICZkYXZpbmNpX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBkYXZpbmNpX3NmZnNkcl9pbml0LAorCS5kbWFfem9uZV9zaXplCT0gU1pfMTI4TSwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtdG5ldHYxMDd4LWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLXRuZXR2MTA3eC1ldm0uYwppbmRleCAxYTY1NmU4Li43ODI4OTIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtdG5ldHYxMDd4LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC10bmV0djEwN3gtZXZtLmMKQEAgLTI4Miw0ICsyODIsNSBAQAogCS5pbml0X2lycQk9IGNwX2ludGNfaW5pdCwKIAkudGltZXIJCT0gJmRhdmluY2lfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IHRuZXR2MTA3eF9ldm1fYm9hcmRfaW5pdCwKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzEyOE0sCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY2xvY2suYwppbmRleCBlNGUzYWYxLi5hZTY1MzE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY2xvY2suYwpAQCAtMzY4LDYgKzM2OCwxMiBAQAogCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZTsKIH0KIAoraW50IGRhdmluY2lfc2ltcGxlX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCWNsay0+cmF0ZSA9IHJhdGU7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19wbGxjbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAl1MzIgY3RybCwgbXVsdCA9IDEsIHByZWRpdiA9IDEsIHBvc3RkaXYgPSAxOwpAQCAtNTA2LDYgKzUxMiwzOCBAQAogfQogRVhQT1JUX1NZTUJPTChkYXZpbmNpX3NldF9wbGxyYXRlKTsKIAorLyoqCisgKiBkYXZpbmNpX3NldF9yZWZjbGtfcmF0ZSgpIC0gU2V0IHRoZSByZWZlcmVuY2UgY2xvY2sgcmF0ZQorICogQHJhdGU6CVRoZSBuZXcgcmF0ZS4KKyAqCisgKiBTZXRzIHRoZSByZWZlcmVuY2UgY2xvY2sgcmF0ZSB0byBhIGdpdmVuIHZhbHVlLiBUaGlzIHdpbGwgbW9zdCBsaWtlbHkKKyAqIHJlc3VsdCBpbiB0aGUgZW50aXJlIGNsb2NrIHRyZWUgZ2V0dGluZyB1cGRhdGVkLgorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IGJvYXJkcyB3aGljaCB1c2UgYSByZWZlcmVuY2UgY2xvY2sgZGlmZmVyZW50CisgKiB0aGFuIHRoYXQgdXNlZCBieSBkZWZhdWx0IGluIDxzb2M+LmMgZmlsZS4gVGhlIHJlZmVyZW5jZSBjbG9jayByYXRlCisgKiBzaG91bGQgYmUgdXBkYXRlZCBlYXJseSBpbiB0aGUgYm9vdCBwcm9jZXNzOyBpZGVhbGx5IHNvb24gYWZ0ZXIgdGhlCisgKiBjbG9jayB0cmVlIGhhcyBiZWVuIGluaXRpYWxpemVkIG9uY2Ugd2l0aCB0aGUgZGVmYXVsdCByZWZlcmVuY2UgY2xvY2sKKyAqIHJhdGUgKGRhdmluY2lfY29tbW9uX2luaXQoKSkuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm9yIG90aGVyd2lzZS4KKyAqLworaW50IGRhdmluY2lfc2V0X3JlZmNsa19yYXRlKHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlzdHJ1Y3QgY2xrICpyZWZjbGs7CisKKwlyZWZjbGsgPSBjbGtfZ2V0KE5VTEwsICJyZWYiKTsKKwlpZiAoSVNfRVJSKHJlZmNsaykpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCByZWZlcmVuY2UgY2xvY2suXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBQVFJfRVJSKHJlZmNsayk7CisJfQorCisJY2xrX3NldF9yYXRlKHJlZmNsaywgcmF0ZSk7CisKKwljbGtfcHV0KHJlZmNsayk7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IF9faW5pdCBkYXZpbmNpX2Nsa19pbml0KHN0cnVjdCBjbGtfbG9va3VwICpjbG9ja3MpCiAgIHsKIAlzdHJ1Y3QgY2xrX2xvb2t1cCAqYzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2Nsb2NrLmgKaW5kZXggMGRkMjIwMy4uNTBiMjQ4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2Nsb2NrLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2Nsb2NrLmgKQEAgLTEyMyw2ICsxMjMsOCBAQAogaW50IGRhdmluY2lfc2V0X3BsbHJhdGUoc3RydWN0IHBsbF9kYXRhICpwbGwsIHVuc2lnbmVkIGludCBwcmVkaXYsCiAJCQkJdW5zaWduZWQgaW50IG11bHQsIHVuc2lnbmVkIGludCBwb3N0ZGl2KTsKIGludCBkYXZpbmNpX3NldF9zeXNjbGtfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CitpbnQgZGF2aW5jaV9zZXRfcmVmY2xrX3JhdGUodW5zaWduZWQgbG9uZyByYXRlKTsKK2ludCBkYXZpbmNpX3NpbXBsZV9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CiAKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRhdmluY2lfd2R0X2RldmljZTsKIGV4dGVybiB2b2lkIGRhdmluY2lfd2F0Y2hkb2dfcmVzZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLWRhOHh4LmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jCmluZGV4IDRlNjY4ODEuLmZjNGU5OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLWRhOHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMtZGE4eHguYwpAQCAtNDk0LDcgKzQ5NCw3IEBACiAJLnJlc291cmNlCT0gZGE4NTBfbWNhc3BfcmVzb3VyY2VzLAogfTsKIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYXZpbmNpX3BjbV9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYXZpbmNpX3BjbV9kZXZpY2UgPSB7CiAJLm5hbWUJPSAiZGF2aW5jaS1wY20tYXVkaW8iLAogCS5pZAk9IC0xLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy5jCmluZGV4IDhmNGY3MzYuLjgwNmEyZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYwpAQCAtMjk4LDcgKzI5OCw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGF2aW5jaV9wY21fZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGF2aW5jaV9wY21fZGV2aWNlID0gewogCS5uYW1lCQk9ICJkYXZpbmNpLXBjbS1hdWRpbyIsCiAJLmlkCQk9IC0xLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NnguYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NnguYwppbmRleCAxZTBmODA5Li4xODAyZTcxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtNjQ2eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NnguYwpAQCAtOCw2ICs4LDcgQEAKICAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwogICogb3IgaW1wbGllZC4KICAqLworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CkBAIC00Miw2ICs0Myw3IEBACiAvKgogICogRGV2aWNlIHNwZWNpZmljIGNsb2NrcwogICovCisjZGVmaW5lIERNNjQ2WF9SRUZfRlJFUQkJMjcwMDAwMDAKICNkZWZpbmUgRE02NDZYX0FVWF9GUkVRCQkyNDAwMDAwMAogCiBzdGF0aWMgc3RydWN0IHBsbF9kYXRhIHBsbDFfZGF0YSA9IHsKQEAgLTU2LDYgKzU4LDggQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgcmVmX2NsayA9IHsKIAkubmFtZSA9ICJyZWZfY2xrIiwKKwkucmF0ZSA9IERNNjQ2WF9SRUZfRlJFUSwKKwkuc2V0X3JhdGUgPSBkYXZpbmNpX3NpbXBsZV9zZXRfcmF0ZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGF1eF9jbGtpbiA9IHsKQEAgLTkwMSw3ICs5MDUsNiBAQAogCiB2b2lkIF9faW5pdCBkbTY0NnhfaW5pdCh2b2lkKQogewotCWRtNjQ2eF9ib2FyZF9zZXR1cF9yZWZjbGsoJnJlZl9jbGspOwogCWRhdmluY2lfY29tbW9uX2luaXQoJmRhdmluY2lfc29jX2luZm9fZG02NDZ4KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ncGlvLmMKaW5kZXggYTBiODM4OC4uY2FmYmUxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZ3Bpby5jCkBAIC0yNTIsOCArMjUyLDEyIEBACiBzdGF0aWMgdm9pZAogZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKLQlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZyA9IGlycTJyZWdzKGlycSk7CisJc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmc7CiAJdTMyIG1hc2sgPSAweGZmZmY7CisJc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICpkOworCisJZCA9IChzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgKilpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCWcgPSAoc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKilkLT5yZWdzOwogCiAJLyogd2Ugb25seSBjYXJlIGFib3V0IG9uZSBiYW5rICovCiAJaWYgKGlycSAmIDEpCkBAIC0yNzIsMTEgKzI3NiwxNCBAQAogCQlpZiAoIXN0YXR1cykKIAkJCWJyZWFrOwogCQlfX3Jhd193cml0ZWwoc3RhdHVzLCAmZy0+aW50c3RhdCk7Ci0JCWlmIChpcnEgJiAxKQotCQkJc3RhdHVzID4+PSAxNjsKIAogCQkvKiBub3cgZGVtdXggdGhlbSB0byB0aGUgcmlnaHQgbG93bGV2ZWwgaGFuZGxlciAqLwotCQluID0gKGludClpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOworCQluID0gZC0+aXJxX2Jhc2U7CisJCWlmIChpcnEgJiAxKSB7CisJCQluICs9IDE2OworCQkJc3RhdHVzID4+PSAxNjsKKwkJfQorCiAJCXdoaWxlIChzdGF0dXMpIHsKIAkJCXJlcyA9IGZmcyhzdGF0dXMpOwogCQkJbiArPSByZXM7CkBAIC00MjIsOCArNDI5LDEzIEBACiAKIAkJLyogc2V0IHVwIGFsbCBpcnFzIGluIHRoaXMgYmFuayAqLwogCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihiYW5rX2lycSwgZ3Bpb19pcnFfaGFuZGxlcik7Ci0JCWlycV9zZXRfY2hpcF9kYXRhKGJhbmtfaXJxLCAoX19mb3JjZSB2b2lkICopZyk7Ci0JCWlycV9zZXRfaGFuZGxlcl9kYXRhKGJhbmtfaXJxLCAodm9pZCAqKWlycSk7CisKKwkJLyoKKwkJICogRWFjaCBjaGlwIGhhbmRsZXMgMzIgZ3Bpb3MsIGFuZCBlYWNoIGlycSBiYW5rIGNvbnNpc3RzIG9mIDE2CisJCSAqIGdwaW8gaXJxcy4gUGFzcyB0aGUgaXJxIGJhbmsncyBjb3JyZXNwb25kaW5nIGNvbnRyb2xsZXIgdG8KKwkJICogdGhlIGNoYWluZWQgaXJxIGhhbmRsZXIuCisJCSAqLworCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShiYW5rX2lycSwgJmNoaXBzW2dwaW8gLyAzMl0pOwogCiAJCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBncGlvIDwgbmdwaW87IGkrKywgaXJxKyssIGdwaW8rKykgewogCQkJaXJxX3NldF9jaGlwKGlycSwgJmdwaW9faXJxY2hpcCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RtNjQ2eC5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9kbTY0NnguaAppbmRleCA3YTI3ZjNmLi4yYTAwZmU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RtNjQ2eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZG02NDZ4LmgKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxtYWNoL2FzcC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RhdmluY2lfZW1hYy5oPgogCiAjZGVmaW5lIERNNjQ2WF9FTUFDX0JBU0UJCSgweDAxQzgwMDAwKQpAQCAtMzEsNyArMzAsNiBAQAogdm9pZCBfX2luaXQgZG02NDZ4X2luaXQodm9pZCk7CiB2b2lkIF9faW5pdCBkbTY0NnhfaW5pdF9tY2FzcDAoc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CiB2b2lkIF9faW5pdCBkbTY0NnhfaW5pdF9tY2FzcDEoc3RydWN0IHNuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7Ci12b2lkIF9faW5pdCBkbTY0NnhfYm9hcmRfc2V0dXBfcmVmY2xrKHN0cnVjdCBjbGsgKmNsayk7CiBpbnQgX19pbml0IGRtNjQ2eF9pbml0X2VkbWEoc3RydWN0IGVkbWFfcnN2X2luZm8gKnJzdik7CiAKIHZvaWQgZG02NDZ4X3ZpZGVvX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKaW5kZXggZmJkZWJjNy4uZTE0YzBkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtNDYsNiArNDYsMyBAQAogI2VuZGlmCiAxMDAyOgogCQkuZW5kbQotCi0JCS5tYWNybwlpcnFfcHJpb190YWJsZQotCQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggNDkxMjQ5ZS4uNzg3MzE5NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC00MSwxMSArNDEsNCBAQAogICovCiAjZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUgKDE0PDwyMCkKIAotLyoKLSAqIFJlc3RyaWN0IERNQS1hYmxlIHJlZ2lvbiB0byB3b3JrYXJvdW5kIHNpbGljb24gYnVnLiAgVGhlIGJ1ZwotICogcmVzdHJpY3RzIGJ1ZmZlcnMgYXZhaWxhYmxlIGZvciBETUEgdG8gdmlkZW8gaGFyZHdhcmUgdG8gYmUKLSAqIGJlbG93IDEyOE0KLSAqLwotI2RlZmluZSBBUk1fRE1BX1pPTkVfU0laRQlTWl8xMjhNCi0KICNlbmRpZiAvKiBfX0FTTV9BUkNIX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL3BzYy5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9wc2MuaAppbmRleCBhNDdlNmYyLi4xMTEwZmRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL3BzYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvcHNjLmgKQEAgLTMwLDQ3ICszMCw0NyBAQAogI2RlZmluZQlEQVZJTkNJX1BXUl9TTEVFUF9DTlRSTF9CQVNFCTB4MDFDNDEwMDAKIAogLyogUG93ZXIgYW5kIFNsZWVwIENvbnRyb2xsZXIgKFBTQykgRG9tYWlucyAqLwotI2RlZmluZSBEQVZJTkNJX0dQU0NfQVJNRE9NQUlOICAgICAgMAotI2RlZmluZSBEQVZJTkNJX0dQU0NfRFNQRE9NQUlOICAgICAgMQorI2RlZmluZSBEQVZJTkNJX0dQU0NfQVJNRE9NQUlOCQkwCisjZGVmaW5lIERBVklOQ0lfR1BTQ19EU1BET01BSU4JCTEKIAotI2RlZmluZSBEQVZJTkNJX0xQU0NfVlBTU01TVFIgICAgICAgMAotI2RlZmluZSBEQVZJTkNJX0xQU0NfVlBTU1NMViAgICAgICAgMQotI2RlZmluZSBEQVZJTkNJX0xQU0NfVFBDQyAgICAgICAgICAgMgotI2RlZmluZSBEQVZJTkNJX0xQU0NfVFBUQzAgICAgICAgICAgMwotI2RlZmluZSBEQVZJTkNJX0xQU0NfVFBUQzEgICAgICAgICAgNAotI2RlZmluZSBEQVZJTkNJX0xQU0NfRU1BQyAgICAgICAgICAgNQotI2RlZmluZSBEQVZJTkNJX0xQU0NfRU1BQ19XUkFQUEVSICAgNgotI2RlZmluZSBEQVZJTkNJX0xQU0NfVVNCICAgICAgICAgICAgOQotI2RlZmluZSBEQVZJTkNJX0xQU0NfQVRBICAgICAgICAgICAgMTAKLSNkZWZpbmUgREFWSU5DSV9MUFNDX1ZMWU5RICAgICAgICAgIDExCi0jZGVmaW5lIERBVklOQ0lfTFBTQ19VSFBJICAgICAgICAgICAxMgotI2RlZmluZSBEQVZJTkNJX0xQU0NfRERSX0VNSUYgICAgICAgMTMKLSNkZWZpbmUgREFWSU5DSV9MUFNDX0FFTUlGICAgICAgICAgIDE0Ci0jZGVmaW5lIERBVklOQ0lfTFBTQ19NTUNfU0QgICAgICAgICAxNQotI2RlZmluZSBEQVZJTkNJX0xQU0NfTWNCU1AgICAgICAgICAgMTcKLSNkZWZpbmUgREFWSU5DSV9MUFNDX0kyQyAgICAgICAgICAgIDE4Ci0jZGVmaW5lIERBVklOQ0lfTFBTQ19VQVJUMCAgICAgICAgICAxOQotI2RlZmluZSBEQVZJTkNJX0xQU0NfVUFSVDEgICAgICAgICAgMjAKLSNkZWZpbmUgREFWSU5DSV9MUFNDX1VBUlQyICAgICAgICAgIDIxCi0jZGVmaW5lIERBVklOQ0lfTFBTQ19TUEkgICAgICAgICAgICAyMgotI2RlZmluZSBEQVZJTkNJX0xQU0NfUFdNMCAgICAgICAgICAgMjMKLSNkZWZpbmUgREFWSU5DSV9MUFNDX1BXTTEgICAgICAgICAgIDI0Ci0jZGVmaW5lIERBVklOQ0lfTFBTQ19QV00yICAgICAgICAgICAyNQotI2RlZmluZSBEQVZJTkNJX0xQU0NfR1BJTyAgICAgICAgICAgMjYKLSNkZWZpbmUgREFWSU5DSV9MUFNDX1RJTUVSMCAgICAgICAgIDI3Ci0jZGVmaW5lIERBVklOQ0lfTFBTQ19USU1FUjEgICAgICAgICAyOAotI2RlZmluZSBEQVZJTkNJX0xQU0NfVElNRVIyICAgICAgICAgMjkKLSNkZWZpbmUgREFWSU5DSV9MUFNDX1NZU1RFTV9TVUJTWVMgIDMwCi0jZGVmaW5lIERBVklOQ0lfTFBTQ19BUk0gICAgICAgICAgICAzMQotI2RlZmluZSBEQVZJTkNJX0xQU0NfU0NSMiAgICAgICAgICAgMzIKLSNkZWZpbmUgREFWSU5DSV9MUFNDX1NDUjMgICAgICAgICAgIDMzCi0jZGVmaW5lIERBVklOQ0lfTFBTQ19TQ1I0ICAgICAgICAgICAzNAotI2RlZmluZSBEQVZJTkNJX0xQU0NfQ1JPU1NCQVIgICAgICAgMzUKLSNkZWZpbmUgREFWSU5DSV9MUFNDX0NGRzI3ICAgICAgICAgIDM2Ci0jZGVmaW5lIERBVklOQ0lfTFBTQ19DRkczICAgICAgICAgICAzNwotI2RlZmluZSBEQVZJTkNJX0xQU0NfQ0ZHNSAgICAgICAgICAgMzgKLSNkZWZpbmUgREFWSU5DSV9MUFNDX0dFTSAgICAgICAgICAgIDM5Ci0jZGVmaW5lIERBVklOQ0lfTFBTQ19JTUNPUCAgICAgICAgICA0MAorI2RlZmluZSBEQVZJTkNJX0xQU0NfVlBTU01TVFIJCTAKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1ZQU1NTTFYJCTEKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RQQ0MJCTIKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RQVEMwCQkzCisjZGVmaW5lIERBVklOQ0lfTFBTQ19UUFRDMQkJNAorI2RlZmluZSBEQVZJTkNJX0xQU0NfRU1BQwkJNQorI2RlZmluZSBEQVZJTkNJX0xQU0NfRU1BQ19XUkFQUEVSCTYKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1VTQgkJOQorI2RlZmluZSBEQVZJTkNJX0xQU0NfQVRBCQkxMAorI2RlZmluZSBEQVZJTkNJX0xQU0NfVkxZTlEJCTExCisjZGVmaW5lIERBVklOQ0lfTFBTQ19VSFBJCQkxMgorI2RlZmluZSBEQVZJTkNJX0xQU0NfRERSX0VNSUYJCTEzCisjZGVmaW5lIERBVklOQ0lfTFBTQ19BRU1JRgkJMTQKKyNkZWZpbmUgREFWSU5DSV9MUFNDX01NQ19TRAkJMTUKKyNkZWZpbmUgREFWSU5DSV9MUFNDX01jQlNQCQkxNworI2RlZmluZSBEQVZJTkNJX0xQU0NfSTJDCQkxOAorI2RlZmluZSBEQVZJTkNJX0xQU0NfVUFSVDAJCTE5CisjZGVmaW5lIERBVklOQ0lfTFBTQ19VQVJUMQkJMjAKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1VBUlQyCQkyMQorI2RlZmluZSBEQVZJTkNJX0xQU0NfU1BJCQkyMgorI2RlZmluZSBEQVZJTkNJX0xQU0NfUFdNMAkJMjMKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1BXTTEJCTI0CisjZGVmaW5lIERBVklOQ0lfTFBTQ19QV00yCQkyNQorI2RlZmluZSBEQVZJTkNJX0xQU0NfR1BJTwkJMjYKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RJTUVSMAkJMjcKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RJTUVSMQkJMjgKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RJTUVSMgkJMjkKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1NZU1RFTV9TVUJTWVMJMzAKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0FSTQkJMzEKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1NDUjIJCTMyCisjZGVmaW5lIERBVklOQ0lfTFBTQ19TQ1IzCQkzMworI2RlZmluZSBEQVZJTkNJX0xQU0NfU0NSNAkJMzQKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0NST1NTQkFSCQkzNQorI2RlZmluZSBEQVZJTkNJX0xQU0NfQ0ZHMjcJCTM2CisjZGVmaW5lIERBVklOQ0lfTFBTQ19DRkczCQkzNworI2RlZmluZSBEQVZJTkNJX0xQU0NfQ0ZHNQkJMzgKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0dFTQkJMzkKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0lNQ09QCQk0MAogCiAjZGVmaW5lIERNMzU1X0xQU0NfVElNRVIzCQk1CiAjZGVmaW5lIERNMzU1X0xQU0NfU1BJMQkJCTYKQEAgLTEwMiwzOSArMTAyLDM5IEBACiAvKgogICogTFBTQyBBc3NpZ25tZW50cwogICovCi0jZGVmaW5lIERNNjQ2WF9MUFNDX0FSTSAgICAgICAgICAgIDAKLSNkZWZpbmUgRE02NDZYX0xQU0NfQzY0WF9DUFUgICAgICAgMQotI2RlZmluZSBETTY0NlhfTFBTQ19IRFZJQ1AwICAgICAgICAyCi0jZGVmaW5lIERNNjQ2WF9MUFNDX0hEVklDUDEgICAgICAgIDMKLSNkZWZpbmUgRE02NDZYX0xQU0NfVFBDQyAgICAgICAgICAgNAotI2RlZmluZSBETTY0NlhfTFBTQ19UUFRDMCAgICAgICAgICA1Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1RQVEMxICAgICAgICAgIDYKLSNkZWZpbmUgRE02NDZYX0xQU0NfVFBUQzIgICAgICAgICAgNwotI2RlZmluZSBETTY0NlhfTFBTQ19UUFRDMyAgICAgICAgICA4Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1BDSSAgICAgICAgICAgIDEzCi0jZGVmaW5lIERNNjQ2WF9MUFNDX0VNQUMgICAgICAgICAgIDE0Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1ZEQ0UgICAgICAgICAgIDE1Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1ZQU1NNU1RSICAgICAgIDE2Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1ZQU1NTTFYgICAgICAgIDE3Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1RTSUYwICAgICAgICAgIDE4Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1RTSUYxICAgICAgICAgIDE5Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX0REUl9FTUlGICAgICAgIDIwCi0jZGVmaW5lIERNNjQ2WF9MUFNDX0FFTUlGICAgICAgICAgIDIxCi0jZGVmaW5lIERNNjQ2WF9MUFNDX01jQVNQMCAgICAgICAgIDIyCi0jZGVmaW5lIERNNjQ2WF9MUFNDX01jQVNQMSAgICAgICAgIDIzCi0jZGVmaW5lIERNNjQ2WF9MUFNDX0NSR0VOMCAgICAgICAgIDI0Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX0NSR0VOMSAgICAgICAgIDI1Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1VBUlQwICAgICAgICAgIDI2Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1VBUlQxICAgICAgICAgIDI3Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1VBUlQyICAgICAgICAgIDI4Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1BXTTAgICAgICAgICAgIDI5Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1BXTTEgICAgICAgICAgIDMwCi0jZGVmaW5lIERNNjQ2WF9MUFNDX0kyQyAgICAgICAgICAgIDMxCi0jZGVmaW5lIERNNjQ2WF9MUFNDX1NQSSAgICAgICAgICAgIDMyCi0jZGVmaW5lIERNNjQ2WF9MUFNDX0dQSU8gICAgICAgICAgIDMzCi0jZGVmaW5lIERNNjQ2WF9MUFNDX1RJTUVSMCAgICAgICAgIDM0Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX1RJTUVSMSAgICAgICAgIDM1Ci0jZGVmaW5lIERNNjQ2WF9MUFNDX0FSTV9JTlRDICAgICAgIDQ1CisjZGVmaW5lIERNNjQ2WF9MUFNDX0FSTQkJMAorI2RlZmluZSBETTY0NlhfTFBTQ19DNjRYX0NQVQkxCisjZGVmaW5lIERNNjQ2WF9MUFNDX0hEVklDUDAJMgorI2RlZmluZSBETTY0NlhfTFBTQ19IRFZJQ1AxCTMKKyNkZWZpbmUgRE02NDZYX0xQU0NfVFBDQwk0CisjZGVmaW5lIERNNjQ2WF9MUFNDX1RQVEMwCTUKKyNkZWZpbmUgRE02NDZYX0xQU0NfVFBUQzEJNgorI2RlZmluZSBETTY0NlhfTFBTQ19UUFRDMgk3CisjZGVmaW5lIERNNjQ2WF9MUFNDX1RQVEMzCTgKKyNkZWZpbmUgRE02NDZYX0xQU0NfUENJCQkxMworI2RlZmluZSBETTY0NlhfTFBTQ19FTUFDCTE0CisjZGVmaW5lIERNNjQ2WF9MUFNDX1ZEQ0UJMTUKKyNkZWZpbmUgRE02NDZYX0xQU0NfVlBTU01TVFIJMTYKKyNkZWZpbmUgRE02NDZYX0xQU0NfVlBTU1NMVgkxNworI2RlZmluZSBETTY0NlhfTFBTQ19UU0lGMAkxOAorI2RlZmluZSBETTY0NlhfTFBTQ19UU0lGMQkxOQorI2RlZmluZSBETTY0NlhfTFBTQ19ERFJfRU1JRgkyMAorI2RlZmluZSBETTY0NlhfTFBTQ19BRU1JRgkyMQorI2RlZmluZSBETTY0NlhfTFBTQ19NY0FTUDAJMjIKKyNkZWZpbmUgRE02NDZYX0xQU0NfTWNBU1AxCTIzCisjZGVmaW5lIERNNjQ2WF9MUFNDX0NSR0VOMAkyNAorI2RlZmluZSBETTY0NlhfTFBTQ19DUkdFTjEJMjUKKyNkZWZpbmUgRE02NDZYX0xQU0NfVUFSVDAJMjYKKyNkZWZpbmUgRE02NDZYX0xQU0NfVUFSVDEJMjcKKyNkZWZpbmUgRE02NDZYX0xQU0NfVUFSVDIJMjgKKyNkZWZpbmUgRE02NDZYX0xQU0NfUFdNMAkyOQorI2RlZmluZSBETTY0NlhfTFBTQ19QV00xCTMwCisjZGVmaW5lIERNNjQ2WF9MUFNDX0kyQwkJMzEKKyNkZWZpbmUgRE02NDZYX0xQU0NfU1BJCQkzMgorI2RlZmluZSBETTY0NlhfTFBTQ19HUElPCTMzCisjZGVmaW5lIERNNjQ2WF9MUFNDX1RJTUVSMAkzNAorI2RlZmluZSBETTY0NlhfTFBTQ19USU1FUjEJMzUKKyNkZWZpbmUgRE02NDZYX0xQU0NfQVJNX0lOVEMJNDUKIAogLyogUFNDMCBkZWZpbmVzICovCiAjZGVmaW5lIERBOFhYX0xQU0MwX1RQQ0MJCTAKQEAgLTI0Myw3ICsyNDMsNyBAQAogI2RlZmluZSBQU0NfU1RBVEVfRElTQUJMRQkyCiAjZGVmaW5lIFBTQ19TVEFURV9FTkFCTEUJMwogCi0jZGVmaW5lIE1EU1RBVF9TVEFURV9NQVNLIDB4MWYKKyNkZWZpbmUgTURTVEFUX1NUQVRFX01BU0sJMHgxZgogCiAjaWZuZGVmIF9fQVNTRU1CTEVSX18KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2lycS5jCmluZGV4IGJmZTY4ZWMuLjk1MmRjMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaXJxLmMKQEAgLTUyLDggKzUyLDE0IEBACiAJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0OwogCiAJZ2MgPSBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKCJBSU5UQyIsIDEsIGlycV9zdGFydCwgYmFzZSwgaGFuZGxlX2VkZ2VfaXJxKTsKKwlpZiAoIWdjKSB7CisJCXByX2VycigiJXM6IGlycV9hbGxvY19nZW5lcmljX2NoaXAgZm9yIElSUSAldSBmYWlsZWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgaXJxX3N0YXJ0KTsKKwkJcmV0dXJuOworCX0KKwogCWN0ID0gZ2MtPmNoaXBfdHlwZXM7Ci0JY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2s7CisJY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2tfc2V0X2JpdDsKIAljdC0+Y2hpcC5pcnFfbWFzayA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CiAJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlycV9nY19tYXNrX3NldF9iaXQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9wbS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3BtLmMKaW5kZXggMWJkNzNhMC4uMDRjNDlmNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3BtLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2RhOHh4Lmg+CiAjaW5jbHVkZSA8bWFjaC9zcmFtLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWRvdmUvY29tbW9uLmMKaW5kZXggNWVkNTFiOC4uODNkY2U4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kb3ZlL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtZG92ZS9jb21tb24uYwpAQCAtMTMsMTEgKzEzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9tYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvTWFrZWZpbGUKaW5kZXggMzNlZTJjOC4uM2NlZGNmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvTWFrZWZpbGUKQEAgLTEsMTEgKzEsMTMgQEAKICMKICMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCiAjCi1vYmoteQkJCTo9IGNvcmUubyBjbG9jay5vIGRtYS1tMnAubyBncGlvLm8KK29iai15CQkJOj0gY29yZS5vIGNsb2NrLm8KIG9iai1tCQkJOj0KIG9iai1uCQkJOj0KIG9iai0JCQk6PQogCitvYmotJChDT05GSUdfRVA5M1hYX0RNQSkJKz0gZG1hLm8KKwogb2JqLSQoQ09ORklHX01BQ0hfQURTU1BIRVJFKQkrPSBhZHNzcGhlcmUubwogb2JqLSQoQ09ORklHX01BQ0hfRURCOTNYWCkJKz0gZWRiOTN4eC5vCiBvYmotJChDT05GSUdfTUFDSF9HRVNCQzkzMTIpCSs9IGdlc2JjOTMxMi5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKaW5kZXggODIwNzk1NC4uYzYwZjA4MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwpAQCAtMTc0LDE0ICsxNzQsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFUDkzeHggSVJRIGhhbmRsaW5nCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGVwOTN4eF9ncGlvX2luaXRfaXJxKHZvaWQpOwotCiB2b2lkIF9faW5pdCBlcDkzeHhfaW5pdF9pcnEodm9pZCkKIHsKIAl2aWNfaW5pdChFUDkzWFhfVklDMV9CQVNFLCAwLCBFUDkzWFhfVklDMV9WQUxJRF9JUlFfTUFTSywgMCk7CiAJdmljX2luaXQoRVA5M1hYX1ZJQzJfQkFTRSwgMzIsIEVQOTNYWF9WSUMyX1ZBTElEX0lSUV9NQVNLLCAwKTsKLQotCWVwOTN4eF9ncGlvX2luaXRfaXJxKCk7CiB9CiAKIApAQCAtMjQxLDYgKzIzNywyNCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRVA5M3h4IEdQSU8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlcDkzeHhfZ3Bpb19yZXNvdXJjZVtdID0geworCXsKKwkJLnN0YXJ0CQk9IEVQOTNYWF9HUElPX1BIWVNfQkFTRSwKKwkJLmVuZAkJPSBFUDkzWFhfR1BJT19QSFlTX0JBU0UgKyAweGNjIC0gMSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlcDkzeHhfZ3Bpb19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImdwaW8tZXA5M3h4IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGVwOTN4eF9ncGlvX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBlcDkzeHhfZ3Bpb19yZXNvdXJjZSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFUDkzeHggcGVyaXBoZXJhbCBoYW5kbGluZwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIEVQOTNYWF9VQVJUX01DUl9PRkZTRVQJCSgweDAxMDApCkBAIC0yNTEsOSArMjY1LDkgQEAKIAl1bnNpZ25lZCBpbnQgbWNyOwogCiAJbWNyID0gMDsKLQlpZiAoIShtY3RybCAmIFRJT0NNX1JUUykpCisJaWYgKG1jdHJsICYgVElPQ01fUlRTKQogCQltY3IgfD0gMjsKLQlpZiAoIShtY3RybCAmIFRJT0NNX0RUUikpCisJaWYgKG1jdHJsICYgVElPQ01fRFRSKQogCQltY3IgfD0gMTsKIAogCV9fcmF3X3dyaXRlbChtY3IsIGJhc2UgKyBFUDkzWFhfVUFSVF9NQ1JfT0ZGU0VUKTsKQEAgLTQwMiwxMSArNDE2LDE1IEBACiAJfQogfTsKIAorc3RhdGljIHU2NCBlcDkzeHhfZXRoX2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXA5M3h4X2V0aF9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gImVwOTN4eC1ldGgiLAogCS5pZAkJPSAtMSwKIAkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmZXA5M3h4X2V0aF9kYXRhLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmZXA5M3h4X2V0aF9kYXRhLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCQkuZG1hX21hc2sJCT0gJmVwOTN4eF9ldGhfZG1hX21hc2ssCiAJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZXA5M3h4X2V0aF9yZXNvdXJjZSksCiAJLnJlc291cmNlCT0gZXA5M3h4X2V0aF9yZXNvdXJjZSwKQEAgLTQ4OCwxMSArNTA2LDE1IEBACiAJfSwKIH07CiAKK3N0YXRpYyB1NjQgZXA5M3h4X3NwaV9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVwOTN4eF9zcGlfZGV2aWNlID0gewogCS5uYW1lCQk9ICJlcDkzeHgtc3BpIiwKIAkuaWQJCT0gMCwKIAkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmZXA5M3h4X3NwaV9tYXN0ZXJfZGF0YSwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJmVwOTN4eF9zcGlfbWFzdGVyX2RhdGEsCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJCS5kbWFfbWFzawkJPSAmZXA5M3h4X3NwaV9kbWFfbWFzaywKIAl9LAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShlcDkzeHhfc3BpX3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gZXA5M3h4X3NwaV9yZXNvdXJjZXMsCkBAIC04NjYsMTQgKzg4OCwxMyBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZXA5M3h4X3BjbV9kZXZpY2UpOwogfQogCi1leHRlcm4gdm9pZCBlcDkzeHhfZ3Bpb19pbml0KHZvaWQpOwotCiB2b2lkIF9faW5pdCBlcDkzeHhfaW5pdF9kZXZpY2VzKHZvaWQpCiB7CiAJLyogRGlzYWxsb3cgYWNjZXNzIHRvIE1hdmVyaWNrQ3J1bmNoIGluaXRpYWxseSAqLwogCWVwOTN4eF9kZXZjZmdfY2xlYXJfYml0cyhFUDkzWFhfU1lTQ09OX0RFVkNGR19DUEVOQSk7CiAKLQllcDkzeHhfZ3Bpb19pbml0KCk7CisJLyogR2V0IHRoZSBHUElPIHdvcmtpbmcgZWFybHksIG90aGVyIGRldmljZXMgbmVlZCBpdCAqLworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZXA5M3h4X2dwaW9fZGV2aWNlKTsKIAogCWFtYmFfZGV2aWNlX3JlZ2lzdGVyKCZ1YXJ0MV9kZXZpY2UsICZpb21lbV9yZXNvdXJjZSk7CiAJYW1iYV9kZXZpY2VfcmVnaXN0ZXIoJnVhcnQyX2RldmljZSwgJmlvbWVtX3Jlc291cmNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2RtYS1tMnAuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2RtYS1tMnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5NmQzNS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9kbWEtbTJwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtZXA5M3h4L2RtYS1tMnAuYwotICogTTJQIERNQSBoYW5kbGluZyBmb3IgQ2lycnVzIEVQOTN4eCBjaGlwcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGllZCBEYXRhIFN5c3RlbXMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgUnlhbiBNYWxsb24gPHJ5YW5AYmx1ZXdhdGVyc3lzLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLS8qCi0gKiBPbiB0aGUgRVA5M3h4IGNoaXAgdGhlIGZvbGxvd2luZyBwZXJpcGhlcmFscyBteSBiZSBhbGxvY2F0ZWQgdG8gdGhlIDEwCi0gKiBNZW1vcnkgdG8gSW50ZXJuYWwgUGVyaXBoZXJhbCAoTTJQKSBjaGFubmVscyAoNSB0cmFuc21pdCArIDUgcmVjZWl2ZSkuCi0gKgotICoJSTJTCWNvbnRhaW5zIDMgVHggYW5kIDMgUnggRE1BIENoYW5uZWxzCi0gKglBQUMJY29udGFpbnMgMyBUeCBhbmQgMyBSeCBETUEgQ2hhbm5lbHMKLSAqCVVBUlQxCWNvbnRhaW5zIDEgVHggYW5kIDEgUnggRE1BIENoYW5uZWxzCi0gKglVQVJUMgljb250YWlucyAxIFR4IGFuZCAxIFJ4IERNQSBDaGFubmVscwotICoJVUFSVDMJY29udGFpbnMgMSBUeCBhbmQgMSBSeCBETUEgQ2hhbm5lbHMKLSAqCUlyREEJY29udGFpbnMgMSBUeCBhbmQgMSBSeCBETUEgQ2hhbm5lbHMKLSAqCi0gKiBTU1AgYW5kIElERSB1c2UgdGhlIE1lbW9yeSB0byBNZW1vcnkgKE0yTSkgY2hhbm5lbHMgYW5kIGFyZSBub3QgY292ZXJlZAotICogd2l0aCB0aGlzIGltcGxlbWVudGF0aW9uLgotICovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkgImVwOTN4eCAiIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bWFjaC9kbWEuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KLSNkZWZpbmUgTTJQX0NPTlRST0wJCQkweDAwCi0jZGVmaW5lICBNMlBfQ09OVFJPTF9TVEFMTF9JUlFfRU4JKDEgPDwgMCkKLSNkZWZpbmUgIE0yUF9DT05UUk9MX05GQl9JUlFfRU4JCSgxIDw8IDEpCi0jZGVmaW5lICBNMlBfQ09OVFJPTF9FUlJPUl9JUlFfRU4JKDEgPDwgMykKLSNkZWZpbmUgIE0yUF9DT05UUk9MX0VOQUJMRQkJKDEgPDwgNCkKLSNkZWZpbmUgTTJQX0lOVEVSUlVQVAkJCTB4MDQKLSNkZWZpbmUgIE0yUF9JTlRFUlJVUFRfU1RBTEwJCSgxIDw8IDApCi0jZGVmaW5lICBNMlBfSU5URVJSVVBUX05GQgkJKDEgPDwgMSkKLSNkZWZpbmUgIE0yUF9JTlRFUlJVUFRfRVJST1IJCSgxIDw8IDMpCi0jZGVmaW5lIE0yUF9QUEFMTE9DCQkJMHgwOAotI2RlZmluZSBNMlBfU1RBVFVTCQkJMHgwYwotI2RlZmluZSBNMlBfUkVNQUlOCQkJMHgxNAotI2RlZmluZSBNMlBfTUFYQ05UMAkJCTB4MjAKLSNkZWZpbmUgTTJQX0JBU0UwCQkJMHgyNAotI2RlZmluZSBNMlBfTUFYQ05UMQkJCTB4MzAKLSNkZWZpbmUgTTJQX0JBU0UxCQkJMHgzNAotCi0jZGVmaW5lIFNUQVRFX0lETEUJMAkvKiBDaGFubmVsIGlzIGluYWN0aXZlLiAgKi8KLSNkZWZpbmUgU1RBVEVfU1RBTEwJMQkvKiBDaGFubmVsIGlzIGFjdGl2ZSwgbm8gYnVmZmVycyBwZW5kaW5nLiAgKi8KLSNkZWZpbmUgU1RBVEVfT04JMgkvKiBDaGFubmVsIGlzIGFjdGl2ZSwgb25lIGJ1ZmZlciBwZW5kaW5nLiAgKi8KLSNkZWZpbmUgU1RBVEVfTkVYVAkzCS8qIENoYW5uZWwgaXMgYWN0aXZlLCB0d28gYnVmZmVycyBwZW5kaW5nLiAgKi8KLQotc3RydWN0IG0ycF9jaGFubmVsIHsKLQljaGFyCQkJCSpuYW1lOwotCXZvaWQgX19pb21lbQkJCSpiYXNlOwotCWludAkJCQlpcnE7Ci0KLQlzdHJ1Y3QgY2xrCQkJKmNsazsKLQlzcGlubG9ja190CQkJbG9jazsKLQotCXZvaWQJCQkJKmNsaWVudDsKLQl1bnNpZ25lZAkJCW5leHRfc2xvdDoxOwotCXN0cnVjdCBlcDkzeHhfZG1hX2J1ZmZlcgkqYnVmZmVyX3hmZXI7Ci0Jc3RydWN0IGVwOTN4eF9kbWFfYnVmZmVyCSpidWZmZXJfbmV4dDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQlidWZmZXJzX3BlbmRpbmc7Ci19OwotCi1zdGF0aWMgc3RydWN0IG0ycF9jaGFubmVsIG0ycF9yeFtdID0gewotCXsibTJwMSIsIEVQOTNYWF9ETUFfQkFTRSArIDB4MDA0MCwgSVJRX0VQOTNYWF9ETUFNMlAxfSwKLQl7Im0ycDMiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAwYzAsIElSUV9FUDkzWFhfRE1BTTJQM30sCi0JeyJtMnA1IiwgRVA5M1hYX0RNQV9CQVNFICsgMHgwMjAwLCBJUlFfRVA5M1hYX0RNQU0yUDV9LAotCXsibTJwNyIsIEVQOTNYWF9ETUFfQkFTRSArIDB4MDI4MCwgSVJRX0VQOTNYWF9ETUFNMlA3fSwKLQl7Im0ycDkiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAzMDAsIElSUV9FUDkzWFhfRE1BTTJQOX0sCi0Je05VTEx9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtMnBfY2hhbm5lbCBtMnBfdHhbXSA9IHsKLQl7Im0ycDAiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAwMDAsIElSUV9FUDkzWFhfRE1BTTJQMH0sCi0JeyJtMnAyIiwgRVA5M1hYX0RNQV9CQVNFICsgMHgwMDgwLCBJUlFfRVA5M1hYX0RNQU0yUDJ9LAotCXsibTJwNCIsIEVQOTNYWF9ETUFfQkFTRSArIDB4MDI0MCwgSVJRX0VQOTNYWF9ETUFNMlA0fSwKLQl7Im0ycDYiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAyYzAsIElSUV9FUDkzWFhfRE1BTTJQNn0sCi0JeyJtMnA4IiwgRVA5M1hYX0RNQV9CQVNFICsgMHgwMzQwLCBJUlFfRVA5M1hYX0RNQU0yUDh9LAotCXtOVUxMfSwKLX07Ci0KLXN0YXRpYyB2b2lkIGZlZWRfYnVmKHN0cnVjdCBtMnBfY2hhbm5lbCAqY2gsIHN0cnVjdCBlcDkzeHhfZG1hX2J1ZmZlciAqYnVmKQotewotCWlmIChjaC0+bmV4dF9zbG90ID09IDApIHsKLQkJd3JpdGVsKGJ1Zi0+c2l6ZSwgY2gtPmJhc2UgKyBNMlBfTUFYQ05UMCk7Ci0JCXdyaXRlbChidWYtPmJ1c19hZGRyLCBjaC0+YmFzZSArIE0yUF9CQVNFMCk7Ci0JfSBlbHNlIHsKLQkJd3JpdGVsKGJ1Zi0+c2l6ZSwgY2gtPmJhc2UgKyBNMlBfTUFYQ05UMSk7Ci0JCXdyaXRlbChidWYtPmJ1c19hZGRyLCBjaC0+YmFzZSArIE0yUF9CQVNFMSk7Ci0JfQotCWNoLT5uZXh0X3Nsb3QgXj0gMTsKLX0KLQotc3RhdGljIHZvaWQgY2hvb3NlX2J1ZmZlcl94ZmVyKHN0cnVjdCBtMnBfY2hhbm5lbCAqY2gpCi17Ci0Jc3RydWN0IGVwOTN4eF9kbWFfYnVmZmVyICpidWY7Ci0KLQljaC0+YnVmZmVyX3hmZXIgPSBOVUxMOwotCWlmICghbGlzdF9lbXB0eSgmY2gtPmJ1ZmZlcnNfcGVuZGluZykpIHsKLQkJYnVmID0gbGlzdF9lbnRyeShjaC0+YnVmZmVyc19wZW5kaW5nLm5leHQsCi0JCQkJIHN0cnVjdCBlcDkzeHhfZG1hX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWYtPmxpc3QpOwotCQlmZWVkX2J1ZihjaCwgYnVmKTsKLQkJY2gtPmJ1ZmZlcl94ZmVyID0gYnVmOwotCX0KLX0KLQotc3RhdGljIHZvaWQgY2hvb3NlX2J1ZmZlcl9uZXh0KHN0cnVjdCBtMnBfY2hhbm5lbCAqY2gpCi17Ci0Jc3RydWN0IGVwOTN4eF9kbWFfYnVmZmVyICpidWY7Ci0KLQljaC0+YnVmZmVyX25leHQgPSBOVUxMOwotCWlmICghbGlzdF9lbXB0eSgmY2gtPmJ1ZmZlcnNfcGVuZGluZykpIHsKLQkJYnVmID0gbGlzdF9lbnRyeShjaC0+YnVmZmVyc19wZW5kaW5nLm5leHQsCi0JCQkJIHN0cnVjdCBlcDkzeHhfZG1hX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWYtPmxpc3QpOwotCQlmZWVkX2J1ZihjaCwgYnVmKTsKLQkJY2gtPmJ1ZmZlcl9uZXh0ID0gYnVmOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG0ycF9zZXRfY29udHJvbChzdHJ1Y3QgbTJwX2NoYW5uZWwgKmNoLCB1MzIgdikKLXsKLQkvKgotCSAqIFRoZSBjb250cm9sIHJlZ2lzdGVyIG11c3QgYmUgcmVhZCBpbW1lZGlhdGVseSBhZnRlciBiZWluZyB3cml0dGVuIHNvCi0JICogdGhhdCB0aGUgaW50ZXJuYWwgc3RhdGUgbWFjaGluZSBpcyBjb3JyZWN0bHkgdXBkYXRlZC4gU2VlIHRoZSBlcDkzeHgKLQkgKiB1c2VycycgZ3VpZGUgZm9yIGRldGFpbHMuCi0JICovCi0Jd3JpdGVsKHYsIGNoLT5iYXNlICsgTTJQX0NPTlRST0wpOwotCXJlYWRsKGNoLT5iYXNlICsgTTJQX0NPTlRST0wpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtMnBfY2hhbm5lbF9zdGF0ZShzdHJ1Y3QgbTJwX2NoYW5uZWwgKmNoKQotewotCXJldHVybiAocmVhZGwoY2gtPmJhc2UgKyBNMlBfU1RBVFVTKSA+PiA0KSAmIDB4MzsKLX0KLQotc3RhdGljIGlycXJldHVybl90IG0ycF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBtMnBfY2hhbm5lbCAqY2ggPSBkZXZfaWQ7Ci0Jc3RydWN0IGVwOTN4eF9kbWFfbTJwX2NsaWVudCAqY2w7Ci0JdTMyIGlycV9zdGF0dXMsIHY7Ci0JaW50IGVycm9yID0gMDsKLQotCWNsID0gY2gtPmNsaWVudDsKLQotCXNwaW5fbG9jaygmY2gtPmxvY2spOwotCWlycV9zdGF0dXMgPSByZWFkbChjaC0+YmFzZSArIE0yUF9JTlRFUlJVUFQpOwotCi0JaWYgKGlycV9zdGF0dXMgJiBNMlBfSU5URVJSVVBUX0VSUk9SKSB7Ci0JCXdyaXRlbChNMlBfSU5URVJSVVBUX0VSUk9SLCBjaC0+YmFzZSArIE0yUF9JTlRFUlJVUFQpOwotCQllcnJvciA9IDE7Ci0JfQotCi0JaWYgKChpcnFfc3RhdHVzICYgKE0yUF9JTlRFUlJVUFRfU1RBTEwgfCBNMlBfSU5URVJSVVBUX05GQikpID09IDApIHsKLQkJc3Bpbl91bmxvY2soJmNoLT5sb2NrKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCXN3aXRjaCAobTJwX2NoYW5uZWxfc3RhdGUoY2gpKSB7Ci0JY2FzZSBTVEFURV9JRExFOgotCQlwcl9jcml0KCJkbWEgaW50ZXJydXB0IHdpdGhvdXQgYSBkbWEgYnVmZmVyXG4iKTsKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTVEFURV9TVEFMTDoKLQkJY2wtPmJ1ZmZlcl9maW5pc2hlZChjbC0+Y29va2llLCBjaC0+YnVmZmVyX3hmZXIsIDAsIGVycm9yKTsKLQkJaWYgKGNoLT5idWZmZXJfbmV4dCAhPSBOVUxMKSB7Ci0JCQljbC0+YnVmZmVyX2ZpbmlzaGVkKGNsLT5jb29raWUsIGNoLT5idWZmZXJfbmV4dCwKLQkJCQkJICAgIDAsIGVycm9yKTsKLQkJfQotCQljaG9vc2VfYnVmZmVyX3hmZXIoY2gpOwotCQljaG9vc2VfYnVmZmVyX25leHQoY2gpOwotCQlpZiAoY2gtPmJ1ZmZlcl94ZmVyICE9IE5VTEwpCi0JCQljbC0+YnVmZmVyX3N0YXJ0ZWQoY2wtPmNvb2tpZSwgY2gtPmJ1ZmZlcl94ZmVyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNUQVRFX09OOgotCQljbC0+YnVmZmVyX2ZpbmlzaGVkKGNsLT5jb29raWUsIGNoLT5idWZmZXJfeGZlciwgMCwgZXJyb3IpOwotCQljaC0+YnVmZmVyX3hmZXIgPSBjaC0+YnVmZmVyX25leHQ7Ci0JCWNob29zZV9idWZmZXJfbmV4dChjaCk7Ci0JCWNsLT5idWZmZXJfc3RhcnRlZChjbC0+Y29va2llLCBjaC0+YnVmZmVyX3hmZXIpOwotCQlicmVhazsKLQotCWNhc2UgU1RBVEVfTkVYVDoKLQkJcHJfY3JpdCgiZG1hIGludGVycnVwdCB3aGlsZSBuZXh0XG4iKTsKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCX0KLQotCXYgPSByZWFkbChjaC0+YmFzZSArIE0yUF9DT05UUk9MKSAmIH4oTTJQX0NPTlRST0xfU1RBTExfSVJRX0VOIHwKLQkJCQkJICAgICAgTTJQX0NPTlRST0xfTkZCX0lSUV9FTik7Ci0JaWYgKGNoLT5idWZmZXJfeGZlciAhPSBOVUxMKQotCQl2IHw9IE0yUF9DT05UUk9MX1NUQUxMX0lSUV9FTjsKLQlpZiAoY2gtPmJ1ZmZlcl9uZXh0ICE9IE5VTEwpCi0JCXYgfD0gTTJQX0NPTlRST0xfTkZCX0lSUV9FTjsKLQltMnBfc2V0X2NvbnRyb2woY2gsIHYpOwotCi0Jc3Bpbl91bmxvY2soJmNoLT5sb2NrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbTJwX2NoYW5uZWwgKmZpbmRfZnJlZV9jaGFubmVsKHN0cnVjdCBlcDkzeHhfZG1hX20ycF9jbGllbnQgKmNsKQotewotCXN0cnVjdCBtMnBfY2hhbm5lbCAqY2g7Ci0JaW50IGk7Ci0KLQlpZiAoY2wtPmZsYWdzICYgRVA5M1hYX0RNQV9NMlBfUlgpCi0JCWNoID0gbTJwX3J4OwotCWVsc2UKLQkJY2ggPSBtMnBfdHg7Ci0KLQlmb3IgKGkgPSAwOyBjaFtpXS5iYXNlOyBpKyspIHsKLQkJc3RydWN0IGVwOTN4eF9kbWFfbTJwX2NsaWVudCAqY2xpZW50OwotCi0JCWNsaWVudCA9IGNoW2ldLmNsaWVudDsKLQkJaWYgKGNsaWVudCAhPSBOVUxMKSB7Ci0JCQlpbnQgcG9ydDsKLQotCQkJcG9ydCA9IGNsLT5mbGFncyAmIEVQOTNYWF9ETUFfTTJQX1BPUlRfTUFTSzsKLQkJCWlmIChwb3J0ID09IChjbGllbnQtPmZsYWdzICYKLQkJCQkgICAgIEVQOTNYWF9ETUFfTTJQX1BPUlRfTUFTSykpIHsKLQkJCQlwcl93YXJuaW5nKCJETUEgY2hhbm5lbCBhbHJlYWR5IHVzZWQgYnkgJXNcbiIsCi0JCQkJCSAgIGNsLT5uYW1lID8gOiAidW5rbm93biBjbGllbnQiKTsKLQkJCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOwotCQkJfQotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgY2hbaV0uYmFzZTsgaSsrKSB7Ci0JCWlmIChjaFtpXS5jbGllbnQgPT0gTlVMTCkKLQkJCXJldHVybiBjaCArIGk7Ci0JfQotCi0JcHJfd2FybmluZygiTm8gZnJlZSBETUEgY2hhbm5lbCBmb3IgJXNcbiIsCi0JCSAgIGNsLT5uYW1lID8gOiAidW5rbm93biBjbGllbnQiKTsKLQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLX0KLQotc3RhdGljIHZvaWQgY2hhbm5lbF9lbmFibGUoc3RydWN0IG0ycF9jaGFubmVsICpjaCkKLXsKLQlzdHJ1Y3QgZXA5M3h4X2RtYV9tMnBfY2xpZW50ICpjbCA9IGNoLT5jbGllbnQ7Ci0JdTMyIHY7Ci0KLQljbGtfZW5hYmxlKGNoLT5jbGspOwotCi0JdiA9IGNsLT5mbGFncyAmIEVQOTNYWF9ETUFfTTJQX1BPUlRfTUFTSzsKLQl3cml0ZWwodiwgY2gtPmJhc2UgKyBNMlBfUFBBTExPQyk7Ci0KLQl2ID0gY2wtPmZsYWdzICYgRVA5M1hYX0RNQV9NMlBfRVJST1JfTUFTSzsKLQl2IHw9IE0yUF9DT05UUk9MX0VOQUJMRSB8IE0yUF9DT05UUk9MX0VSUk9SX0lSUV9FTjsKLQltMnBfc2V0X2NvbnRyb2woY2gsIHYpOwotfQotCi1zdGF0aWMgdm9pZCBjaGFubmVsX2Rpc2FibGUoc3RydWN0IG0ycF9jaGFubmVsICpjaCkKLXsKLQl1MzIgdjsKLQotCXYgPSByZWFkbChjaC0+YmFzZSArIE0yUF9DT05UUk9MKTsKLQl2ICY9IH4oTTJQX0NPTlRST0xfU1RBTExfSVJRX0VOIHwgTTJQX0NPTlRST0xfTkZCX0lSUV9FTik7Ci0JbTJwX3NldF9jb250cm9sKGNoLCB2KTsKLQotCXdoaWxlIChtMnBfY2hhbm5lbF9zdGF0ZShjaCkgPj0gU1RBVEVfT04pCi0JCWNwdV9yZWxheCgpOwotCi0JbTJwX3NldF9jb250cm9sKGNoLCAweDApOwotCi0Jd2hpbGUgKG0ycF9jaGFubmVsX3N0YXRlKGNoKSA9PSBTVEFURV9TVEFMTCkKLQkJY3B1X3JlbGF4KCk7Ci0KLQljbGtfZGlzYWJsZShjaC0+Y2xrKTsKLX0KLQotaW50IGVwOTN4eF9kbWFfbTJwX2NsaWVudF9yZWdpc3RlcihzdHJ1Y3QgZXA5M3h4X2RtYV9tMnBfY2xpZW50ICpjbCkKLXsKLQlzdHJ1Y3QgbTJwX2NoYW5uZWwgKmNoOwotCWludCBlcnI7Ci0KLQljaCA9IGZpbmRfZnJlZV9jaGFubmVsKGNsKTsKLQlpZiAoSVNfRVJSKGNoKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2gpOwotCi0JZXJyID0gcmVxdWVzdF9pcnEoY2gtPmlycSwgbTJwX2lycSwgMCwgY2wtPm5hbWUgPyA6ICJkbWEtbTJwIiwgY2gpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQljaC0+Y2xpZW50ID0gY2w7Ci0JY2gtPm5leHRfc2xvdCA9IDA7Ci0JY2gtPmJ1ZmZlcl94ZmVyID0gTlVMTDsKLQljaC0+YnVmZmVyX25leHQgPSBOVUxMOwotCUlOSVRfTElTVF9IRUFEKCZjaC0+YnVmZmVyc19wZW5kaW5nKTsKLQotCWNsLT5jaGFubmVsID0gY2g7Ci0KLQljaGFubmVsX2VuYWJsZShjaCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGVwOTN4eF9kbWFfbTJwX2NsaWVudF9yZWdpc3Rlcik7Ci0KLXZvaWQgZXA5M3h4X2RtYV9tMnBfY2xpZW50X3VucmVnaXN0ZXIoc3RydWN0IGVwOTN4eF9kbWFfbTJwX2NsaWVudCAqY2wpCi17Ci0Jc3RydWN0IG0ycF9jaGFubmVsICpjaCA9IGNsLT5jaGFubmVsOwotCi0JY2hhbm5lbF9kaXNhYmxlKGNoKTsKLQlmcmVlX2lycShjaC0+aXJxLCBjaCk7Ci0JY2gtPmNsaWVudCA9IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChlcDkzeHhfZG1hX20ycF9jbGllbnRfdW5yZWdpc3Rlcik7Ci0KLXZvaWQgZXA5M3h4X2RtYV9tMnBfc3VibWl0KHN0cnVjdCBlcDkzeHhfZG1hX20ycF9jbGllbnQgKmNsLAotCQkJICAgc3RydWN0IGVwOTN4eF9kbWFfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IG0ycF9jaGFubmVsICpjaCA9IGNsLT5jaGFubmVsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHY7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmxvY2ssIGZsYWdzKTsKLQl2ID0gcmVhZGwoY2gtPmJhc2UgKyBNMlBfQ09OVFJPTCk7Ci0JaWYgKGNoLT5idWZmZXJfeGZlciA9PSBOVUxMKSB7Ci0JCWNoLT5idWZmZXJfeGZlciA9IGJ1ZjsKLQkJZmVlZF9idWYoY2gsIGJ1Zik7Ci0JCWNsLT5idWZmZXJfc3RhcnRlZChjbC0+Y29va2llLCBidWYpOwotCi0JCXYgfD0gTTJQX0NPTlRST0xfU1RBTExfSVJRX0VOOwotCQltMnBfc2V0X2NvbnRyb2woY2gsIHYpOwotCi0JfSBlbHNlIGlmIChjaC0+YnVmZmVyX25leHQgPT0gTlVMTCkgewotCQljaC0+YnVmZmVyX25leHQgPSBidWY7Ci0JCWZlZWRfYnVmKGNoLCBidWYpOwotCi0JCXYgfD0gTTJQX0NPTlRST0xfTkZCX0lSUV9FTjsKLQkJbTJwX3NldF9jb250cm9sKGNoLCB2KTsKLQl9IGVsc2UgewotCQlsaXN0X2FkZF90YWlsKCZidWYtPmxpc3QsICZjaC0+YnVmZmVyc19wZW5kaW5nKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmxvY2ssIGZsYWdzKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGVwOTN4eF9kbWFfbTJwX3N1Ym1pdCk7Ci0KLXZvaWQgZXA5M3h4X2RtYV9tMnBfc3VibWl0X3JlY3Vyc2l2ZShzdHJ1Y3QgZXA5M3h4X2RtYV9tMnBfY2xpZW50ICpjbCwKLQkJCQkgICAgIHN0cnVjdCBlcDkzeHhfZG1hX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBtMnBfY2hhbm5lbCAqY2ggPSBjbC0+Y2hhbm5lbDsKLQotCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJmNoLT5idWZmZXJzX3BlbmRpbmcpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZXA5M3h4X2RtYV9tMnBfc3VibWl0X3JlY3Vyc2l2ZSk7Ci0KLXZvaWQgZXA5M3h4X2RtYV9tMnBfZmx1c2goc3RydWN0IGVwOTN4eF9kbWFfbTJwX2NsaWVudCAqY2wpCi17Ci0Jc3RydWN0IG0ycF9jaGFubmVsICpjaCA9IGNsLT5jaGFubmVsOwotCi0JY2hhbm5lbF9kaXNhYmxlKGNoKTsKLQljaC0+bmV4dF9zbG90ID0gMDsKLQljaC0+YnVmZmVyX3hmZXIgPSBOVUxMOwotCWNoLT5idWZmZXJfbmV4dCA9IE5VTEw7Ci0JSU5JVF9MSVNUX0hFQUQoJmNoLT5idWZmZXJzX3BlbmRpbmcpOwotCWNoYW5uZWxfZW5hYmxlKGNoKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGVwOTN4eF9kbWFfbTJwX2ZsdXNoKTsKLQotc3RhdGljIGludCBpbml0X2NoYW5uZWwoc3RydWN0IG0ycF9jaGFubmVsICpjaCkKLXsKLQljaC0+Y2xrID0gY2xrX2dldChOVUxMLCBjaC0+bmFtZSk7Ci0JaWYgKElTX0VSUihjaC0+Y2xrKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2gtPmNsayk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmY2gtPmxvY2spOwotCWNoLT5jbGllbnQgPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGVwOTN4eF9kbWFfbTJwX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQlpbnQgcmV0OwotCi0JZm9yIChpID0gMDsgbTJwX3J4W2ldLmJhc2U7IGkrKykgewotCQlyZXQgPSBpbml0X2NoYW5uZWwobTJwX3J4ICsgaSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCWZvciAoaSA9IDA7IG0ycF90eFtpXS5iYXNlOyBpKyspIHsKLQkJcmV0ID0gaW5pdF9jaGFubmVsKG0ycF90eCArIGkpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcl9pbmZvKCJNMlAgRE1BIHN1YnN5c3RlbSBpbml0aWFsaXplZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKGVwOTN4eF9kbWFfbTJwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZG1hLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTI1NzA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZG1hLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWVwOTN4eC9kbWEuYworICoKKyAqIFBsYXRmb3JtIHN1cHBvcnQgY29kZSBmb3IgdGhlIEVQOTN4eCBkbWFlbmdpbmUgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBNaWthIFdlc3RlcmJlcmcKKyAqCisgKiBUaGlzIHdvcmsgaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGRtYS1tMnAgaW1wbGVtZW50YXRpb24gd2l0aAorICogZm9sbG93aW5nIGNvcHlyaWdodHM6CisgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDYgTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+CisgKiAgIENvcHlyaWdodCAoQykgMjAwNiBBcHBsaWVkIERhdGEgU3lzdGVtcworICogICBDb3B5cmlnaHQgKEMpIDIwMDkgUnlhbiBNYWxsb24gPHJtYWxsb25AZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUgRE1BX0NIQU5ORUwoX25hbWUsIF9iYXNlLCBfaXJxKSBcCisJeyAubmFtZSA9IChfbmFtZSksIC5iYXNlID0gKF9iYXNlKSwgLmlycSA9IChfaXJxKSB9CisKKy8qCisgKiBETUEgTTJQIGNoYW5uZWxzLgorICoKKyAqIE9uIHRoZSBFUDkzeHggY2hpcCB0aGUgZm9sbG93aW5nIHBlcmlwaGVyYWxzIG15IGJlIGFsbG9jYXRlZCB0byB0aGUgMTAKKyAqIE1lbW9yeSB0byBJbnRlcm5hbCBQZXJpcGhlcmFsIChNMlApIGNoYW5uZWxzICg1IHRyYW5zbWl0ICsgNSByZWNlaXZlKS4KKyAqCisgKglJMlMJY29udGFpbnMgMyBUeCBhbmQgMyBSeCBETUEgQ2hhbm5lbHMKKyAqCUFBQwljb250YWlucyAzIFR4IGFuZCAzIFJ4IERNQSBDaGFubmVscworICoJVUFSVDEJY29udGFpbnMgMSBUeCBhbmQgMSBSeCBETUEgQ2hhbm5lbHMKKyAqCVVBUlQyCWNvbnRhaW5zIDEgVHggYW5kIDEgUnggRE1BIENoYW5uZWxzCisgKglVQVJUMwljb250YWlucyAxIFR4IGFuZCAxIFJ4IERNQSBDaGFubmVscworICoJSXJEQQljb250YWlucyAxIFR4IGFuZCAxIFJ4IERNQSBDaGFubmVscworICoKKyAqIFJlZ2lzdGVycyBhcmUgbWFwcGVkIHN0YXRpY2FsbHkgaW4gZXA5M3h4X21hcF9pbygpLgorICovCitzdGF0aWMgc3RydWN0IGVwOTN4eF9kbWFfY2hhbl9kYXRhIGVwOTN4eF9kbWFfbTJwX2NoYW5uZWxzW10gPSB7CisJRE1BX0NIQU5ORUwoIm0ycDAiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAwMDAsIElSUV9FUDkzWFhfRE1BTTJQMCksCisJRE1BX0NIQU5ORUwoIm0ycDEiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAwNDAsIElSUV9FUDkzWFhfRE1BTTJQMSksCisJRE1BX0NIQU5ORUwoIm0ycDIiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAwODAsIElSUV9FUDkzWFhfRE1BTTJQMiksCisJRE1BX0NIQU5ORUwoIm0ycDMiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAwYzAsIElSUV9FUDkzWFhfRE1BTTJQMyksCisJRE1BX0NIQU5ORUwoIm0ycDQiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAyNDAsIElSUV9FUDkzWFhfRE1BTTJQNCksCisJRE1BX0NIQU5ORUwoIm0ycDUiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAyMDAsIElSUV9FUDkzWFhfRE1BTTJQNSksCisJRE1BX0NIQU5ORUwoIm0ycDYiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAyYzAsIElSUV9FUDkzWFhfRE1BTTJQNiksCisJRE1BX0NIQU5ORUwoIm0ycDciLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAyODAsIElSUV9FUDkzWFhfRE1BTTJQNyksCisJRE1BX0NIQU5ORUwoIm0ycDgiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAzNDAsIElSUV9FUDkzWFhfRE1BTTJQOCksCisJRE1BX0NIQU5ORUwoIm0ycDkiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAzMDAsIElSUV9FUDkzWFhfRE1BTTJQOSksCit9OworCitzdGF0aWMgc3RydWN0IGVwOTN4eF9kbWFfcGxhdGZvcm1fZGF0YSBlcDkzeHhfZG1hX20ycF9kYXRhID0geworCS5jaGFubmVscwkJPSBlcDkzeHhfZG1hX20ycF9jaGFubmVscywKKwkubnVtX2NoYW5uZWxzCQk9IEFSUkFZX1NJWkUoZXA5M3h4X2RtYV9tMnBfY2hhbm5lbHMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXA5M3h4X2RtYV9tMnBfZGV2aWNlID0geworCS5uYW1lCQkJPSAiZXA5M3h4LWRtYS1tMnAiLAorCS5pZAkJCT0gLTEsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZlcDkzeHhfZG1hX20ycF9kYXRhLAorCX0sCit9OworCisvKgorICogRE1BIE0yTSBjaGFubmVscy4KKyAqCisgKiBUaGVyZSBhcmUgMiBNMk0gY2hhbm5lbHMgd2hpY2ggc3VwcG9ydCBtZW1jcHkvbWVtc2V0IGFuZCBpbiBhZGRpdGlvbiBzaW1wbGUKKyAqIGhhcmR3YXJlIHJlcXVlc3RzIGZyb20vdG8gU1NQIGFuZCBJREUuIFdlIGRvIG5vdCBpbXBsZW1lbnQgYW4gZXh0ZXJuYWwKKyAqIGhhcmR3YXJlIHJlcXVlc3RzLgorICoKKyAqIFJlZ2lzdGVycyBhcmUgbWFwcGVkIHN0YXRpY2FsbHkgaW4gZXA5M3h4X21hcF9pbygpLgorICovCitzdGF0aWMgc3RydWN0IGVwOTN4eF9kbWFfY2hhbl9kYXRhIGVwOTN4eF9kbWFfbTJtX2NoYW5uZWxzW10gPSB7CisJRE1BX0NIQU5ORUwoIm0ybTAiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAxMDAsIElSUV9FUDkzWFhfRE1BTTJNMCksCisJRE1BX0NIQU5ORUwoIm0ybTEiLCBFUDkzWFhfRE1BX0JBU0UgKyAweDAxNDAsIElSUV9FUDkzWFhfRE1BTTJNMSksCit9OworCitzdGF0aWMgc3RydWN0IGVwOTN4eF9kbWFfcGxhdGZvcm1fZGF0YSBlcDkzeHhfZG1hX20ybV9kYXRhID0geworCS5jaGFubmVscwkJPSBlcDkzeHhfZG1hX20ybV9jaGFubmVscywKKwkubnVtX2NoYW5uZWxzCQk9IEFSUkFZX1NJWkUoZXA5M3h4X2RtYV9tMm1fY2hhbm5lbHMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXA5M3h4X2RtYV9tMm1fZGV2aWNlID0geworCS5uYW1lCQkJPSAiZXA5M3h4LWRtYS1tMm0iLAorCS5pZAkJCT0gLTEsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZlcDkzeHhfZG1hX20ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlcDkzeHhfZG1hX2luaXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVwOTN4eF9kbWFfbTJwX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlcDkzeHhfZG1hX20ybV9kZXZpY2UpOworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChlcDkzeHhfZG1hX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTVkY2UzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZ3Bpby5jCi0gKgotICogR2VuZXJpYyBFUDkzeHggR1BJTyBoYW5kbGluZwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBSeWFuIE1hbGxvbiA8cnlhbkBibHVld2F0ZXJzeXMuY29tPgotICoKLSAqIEJhc2VkIG9uIGNvZGUgb3JpZ2luYWxseSBmcm9tOgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSAiZXA5M3h4ICIgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW50ZXJydXB0IGhhbmRsaW5nIGZvciBFUDkzeHggb24tY2hpcCBHUElPcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBncGlvX2ludF91bm1hc2tlZFszXTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGdwaW9faW50X2VuYWJsZWRbM107Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBncGlvX2ludF90eXBlMVszXTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGdwaW9faW50X3R5cGUyWzNdOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3Bpb19pbnRfZGVib3VuY2VbM107Ci0KLS8qIFBvcnQgb3JkZXJpbmcgaXM6IEEgQiBGICovCi1zdGF0aWMgY29uc3QgdTggaW50X3R5cGUxX3JlZ2lzdGVyX29mZnNldFszXQk9IHsgMHg5MCwgMHhhYywgMHg0YyB9Owotc3RhdGljIGNvbnN0IHU4IGludF90eXBlMl9yZWdpc3Rlcl9vZmZzZXRbM10JPSB7IDB4OTQsIDB4YjAsIDB4NTAgfTsKLXN0YXRpYyBjb25zdCB1OCBlb2lfcmVnaXN0ZXJfb2Zmc2V0WzNdCQk9IHsgMHg5OCwgMHhiNCwgMHg1NCB9Owotc3RhdGljIGNvbnN0IHU4IGludF9lbl9yZWdpc3Rlcl9vZmZzZXRbM10JPSB7IDB4OWMsIDB4YjgsIDB4NTggfTsKLXN0YXRpYyBjb25zdCB1OCBpbnRfZGVib3VuY2VfcmVnaXN0ZXJfb2Zmc2V0WzNdCT0geyAweGE4LCAweGM0LCAweDY0IH07Ci0KLXN0YXRpYyB2b2lkIGVwOTN4eF9ncGlvX3VwZGF0ZV9pbnRfcGFyYW1zKHVuc2lnbmVkIHBvcnQpCi17Ci0JQlVHX09OKHBvcnQgPiAyKTsKLQotCV9fcmF3X3dyaXRlYigwLCBFUDkzWFhfR1BJT19SRUcoaW50X2VuX3JlZ2lzdGVyX29mZnNldFtwb3J0XSkpOwotCi0JX19yYXdfd3JpdGViKGdwaW9faW50X3R5cGUyW3BvcnRdLAotCQlFUDkzWFhfR1BJT19SRUcoaW50X3R5cGUyX3JlZ2lzdGVyX29mZnNldFtwb3J0XSkpOwotCi0JX19yYXdfd3JpdGViKGdwaW9faW50X3R5cGUxW3BvcnRdLAotCQlFUDkzWFhfR1BJT19SRUcoaW50X3R5cGUxX3JlZ2lzdGVyX29mZnNldFtwb3J0XSkpOwotCi0JX19yYXdfd3JpdGViKGdwaW9faW50X3VubWFza2VkW3BvcnRdICYgZ3Bpb19pbnRfZW5hYmxlZFtwb3J0XSwKLQkJRVA5M1hYX0dQSU9fUkVHKGludF9lbl9yZWdpc3Rlcl9vZmZzZXRbcG9ydF0pKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGVwOTN4eF9ncGlvX2ludF9tYXNrKHVuc2lnbmVkIGxpbmUpCi17Ci0JZ3Bpb19pbnRfdW5tYXNrZWRbbGluZSA+PiAzXSAmPSB+KDEgPDwgKGxpbmUgJiA3KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVwOTN4eF9ncGlvX2ludF9kZWJvdW5jZSh1bnNpZ25lZCBpbnQgaXJxLCBib29sIGVuYWJsZSkKLXsKLQlpbnQgbGluZSA9IGlycV90b19ncGlvKGlycSk7Ci0JaW50IHBvcnQgPSBsaW5lID4+IDM7Ci0JaW50IHBvcnRfbWFzayA9IDEgPDwgKGxpbmUgJiA3KTsKLQotCWlmIChlbmFibGUpCi0JCWdwaW9faW50X2RlYm91bmNlW3BvcnRdIHw9IHBvcnRfbWFzazsKLQllbHNlCi0JCWdwaW9faW50X2RlYm91bmNlW3BvcnRdICY9IH5wb3J0X21hc2s7Ci0KLQlfX3Jhd193cml0ZWIoZ3Bpb19pbnRfZGVib3VuY2VbcG9ydF0sCi0JCUVQOTNYWF9HUElPX1JFRyhpbnRfZGVib3VuY2VfcmVnaXN0ZXJfb2Zmc2V0W3BvcnRdKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVwOTN4eF9ncGlvX2FiX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKLXsKLQl1bnNpZ25lZCBjaGFyIHN0YXR1czsKLQlpbnQgaTsKLQotCXN0YXR1cyA9IF9fcmF3X3JlYWRiKEVQOTNYWF9HUElPX0FfSU5UX1NUQVRVUyk7Ci0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAoc3RhdHVzICYgKDEgPDwgaSkpIHsKLQkJCWludCBncGlvX2lycSA9IGdwaW9fdG9faXJxKEVQOTNYWF9HUElPX0xJTkVfQSgwKSkgKyBpOwotCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGdwaW9faXJxKTsKLQkJfQotCX0KLQotCXN0YXR1cyA9IF9fcmF3X3JlYWRiKEVQOTNYWF9HUElPX0JfSU5UX1NUQVRVUyk7Ci0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAoc3RhdHVzICYgKDEgPDwgaSkpIHsKLQkJCWludCBncGlvX2lycSA9IGdwaW9fdG9faXJxKEVQOTNYWF9HUElPX0xJTkVfQigwKSkgKyBpOwotCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGdwaW9faXJxKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgZXA5M3h4X2dwaW9fZl9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0JLyoKLQkgKiBtYXAgZGlzY29udGlndW91cyBodyBpcnEgcmFuZ2UgdG8gY29udGludW91cyBzdyBpcnEgcmFuZ2U6Ci0JICoKLQkgKiAgSVJRX0VQOTNYWF9HUElPezAuLjd9TVVYIC0+IGdwaW9fdG9faXJxKEVQOTNYWF9HUElPX0xJTkVfRih7MC4uN30pCi0JICovCi0JaW50IHBvcnRfZl9pZHggPSAoKGlycSArIDEpICYgNykgXiA0OyAvKiB7MTkuLjIyLDQ3Li41MH0gLT4gezAuLjd9ICovCi0JaW50IGdwaW9faXJxID0gZ3Bpb190b19pcnEoRVA5M1hYX0dQSU9fTElORV9GKDApKSArIHBvcnRfZl9pZHg7Ci0KLQlnZW5lcmljX2hhbmRsZV9pcnEoZ3Bpb19pcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlcDkzeHhfZ3Bpb19pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlpbnQgbGluZSA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0JaW50IHBvcnQgPSBsaW5lID4+IDM7Ci0JaW50IHBvcnRfbWFzayA9IDEgPDwgKGxpbmUgJiA3KTsKLQotCWlmIChpcnFkX2dldF90cmlnZ2VyX3R5cGUoZCkgPT0gSVJRX1RZUEVfRURHRV9CT1RIKSB7Ci0JCWdwaW9faW50X3R5cGUyW3BvcnRdIF49IHBvcnRfbWFzazsgLyogc3dpdGNoIGVkZ2UgZGlyZWN0aW9uICovCi0JCWVwOTN4eF9ncGlvX3VwZGF0ZV9pbnRfcGFyYW1zKHBvcnQpOwotCX0KLQotCV9fcmF3X3dyaXRlYihwb3J0X21hc2ssIEVQOTNYWF9HUElPX1JFRyhlb2lfcmVnaXN0ZXJfb2Zmc2V0W3BvcnRdKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVwOTN4eF9ncGlvX2lycV9tYXNrX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JaW50IGxpbmUgPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOwotCWludCBwb3J0ID0gbGluZSA+PiAzOwotCWludCBwb3J0X21hc2sgPSAxIDw8IChsaW5lICYgNyk7Ci0KLQlpZiAoaXJxZF9nZXRfdHJpZ2dlcl90eXBlKGQpID09IElSUV9UWVBFX0VER0VfQk9USCkKLQkJZ3Bpb19pbnRfdHlwZTJbcG9ydF0gXj0gcG9ydF9tYXNrOyAvKiBzd2l0Y2ggZWRnZSBkaXJlY3Rpb24gKi8KLQotCWdwaW9faW50X3VubWFza2VkW3BvcnRdICY9IH5wb3J0X21hc2s7Ci0JZXA5M3h4X2dwaW9fdXBkYXRlX2ludF9wYXJhbXMocG9ydCk7Ci0KLQlfX3Jhd193cml0ZWIocG9ydF9tYXNrLCBFUDkzWFhfR1BJT19SRUcoZW9pX3JlZ2lzdGVyX29mZnNldFtwb3J0XSkpOwotfQotCi1zdGF0aWMgdm9pZCBlcDkzeHhfZ3Bpb19pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JaW50IGxpbmUgPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOwotCWludCBwb3J0ID0gbGluZSA+PiAzOwotCi0JZ3Bpb19pbnRfdW5tYXNrZWRbcG9ydF0gJj0gfigxIDw8IChsaW5lICYgNykpOwotCWVwOTN4eF9ncGlvX3VwZGF0ZV9pbnRfcGFyYW1zKHBvcnQpOwotfQotCi1zdGF0aWMgdm9pZCBlcDkzeHhfZ3Bpb19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlpbnQgbGluZSA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0JaW50IHBvcnQgPSBsaW5lID4+IDM7Ci0KLQlncGlvX2ludF91bm1hc2tlZFtwb3J0XSB8PSAxIDw8IChsaW5lICYgNyk7Ci0JZXA5M3h4X2dwaW9fdXBkYXRlX2ludF9wYXJhbXMocG9ydCk7Ci19Ci0KLS8qCi0gKiBncGlvX2ludF90eXBlMSBjb250cm9scyB3aGV0aGVyIHRoZSBpbnRlcnJ1cHQgaXMgbGV2ZWwgKDApIG9yCi0gKiBlZGdlICgxKSB0cmlnZ2VyZWQsIHdoaWxlIGdwaW9faW50X3R5cGUyIGNvbnRyb2xzIHdoZXRoZXIgaXQKLSAqIHRyaWdnZXJzIG9uIGxvdy9mYWxsaW5nICgwKSBvciBoaWdoL3Jpc2luZyAoMSkuCi0gKi8KLXN0YXRpYyBpbnQgZXA5M3h4X2dwaW9faXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSkKLXsKLQljb25zdCBpbnQgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0JY29uc3QgaW50IHBvcnQgPSBncGlvID4+IDM7Ci0JY29uc3QgaW50IHBvcnRfbWFzayA9IDEgPDwgKGdwaW8gJiA3KTsKLQlpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlcjsKLQotCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKLQkJZ3Bpb19pbnRfdHlwZTFbcG9ydF0gfD0gcG9ydF9tYXNrOwotCQlncGlvX2ludF90eXBlMltwb3J0XSB8PSBwb3J0X21hc2s7Ci0JCWhhbmRsZXIgPSBoYW5kbGVfZWRnZV9pcnE7Ci0JCWJyZWFrOwotCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgotCQlncGlvX2ludF90eXBlMVtwb3J0XSB8PSBwb3J0X21hc2s7Ci0JCWdwaW9faW50X3R5cGUyW3BvcnRdICY9IH5wb3J0X21hc2s7Ci0JCWhhbmRsZXIgPSBoYW5kbGVfZWRnZV9pcnE7Ci0JCWJyZWFrOwotCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKLQkJZ3Bpb19pbnRfdHlwZTFbcG9ydF0gJj0gfnBvcnRfbWFzazsKLQkJZ3Bpb19pbnRfdHlwZTJbcG9ydF0gfD0gcG9ydF9tYXNrOwotCQloYW5kbGVyID0gaGFuZGxlX2xldmVsX2lycTsKLQkJYnJlYWs7Ci0JY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6Ci0JCWdwaW9faW50X3R5cGUxW3BvcnRdICY9IH5wb3J0X21hc2s7Ci0JCWdwaW9faW50X3R5cGUyW3BvcnRdICY9IH5wb3J0X21hc2s7Ci0JCWhhbmRsZXIgPSBoYW5kbGVfbGV2ZWxfaXJxOwotCQlicmVhazsKLQljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKLQkJZ3Bpb19pbnRfdHlwZTFbcG9ydF0gfD0gcG9ydF9tYXNrOwotCQkvKiBzZXQgaW5pdGlhbCBwb2xhcml0eSBiYXNlZCBvbiBjdXJyZW50IGlucHV0IGxldmVsICovCi0JCWlmIChncGlvX2dldF92YWx1ZShncGlvKSkKLQkJCWdwaW9faW50X3R5cGUyW3BvcnRdICY9IH5wb3J0X21hc2s7IC8qIGZhbGxpbmcgKi8KLQkJZWxzZQotCQkJZ3Bpb19pbnRfdHlwZTJbcG9ydF0gfD0gcG9ydF9tYXNrOyAvKiByaXNpbmcgKi8KLQkJaGFuZGxlciA9IGhhbmRsZV9lZGdlX2lycTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCJmYWlsZWQgdG8gc2V0IGlycSB0eXBlICVkIGZvciBncGlvICVkXG4iLCB0eXBlLCBncGlvKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlcik7Ci0KLQlncGlvX2ludF9lbmFibGVkW3BvcnRdIHw9IHBvcnRfbWFzazsKLQotCWVwOTN4eF9ncGlvX3VwZGF0ZV9pbnRfcGFyYW1zKHBvcnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZXA5M3h4X2dwaW9faXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIkdQSU8iLAotCS5pcnFfYWNrCT0gZXA5M3h4X2dwaW9faXJxX2FjaywKLQkuaXJxX21hc2tfYWNrCT0gZXA5M3h4X2dwaW9faXJxX21hc2tfYWNrLAotCS5pcnFfbWFzawk9IGVwOTN4eF9ncGlvX2lycV9tYXNrLAotCS5pcnFfdW5tYXNrCT0gZXA5M3h4X2dwaW9faXJxX3VubWFzaywKLQkuaXJxX3NldF90eXBlCT0gZXA5M3h4X2dwaW9faXJxX3R5cGUsCi19OwotCi12b2lkIF9faW5pdCBlcDkzeHhfZ3Bpb19pbml0X2lycSh2b2lkKQotewotCWludCBncGlvX2lycTsKLQotCWZvciAoZ3Bpb19pcnEgPSBncGlvX3RvX2lycSgwKTsKLQkgICAgIGdwaW9faXJxIDw9IGdwaW9fdG9faXJxKEVQOTNYWF9HUElPX0xJTkVfTUFYX0lSUSk7ICsrZ3Bpb19pcnEpIHsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGdwaW9faXJxLCAmZXA5M3h4X2dwaW9faXJxX2NoaXAsCi0JCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKLQkJc2V0X2lycV9mbGFncyhncGlvX2lycSwgSVJRRl9WQUxJRCk7Ci0JfQotCi0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0VQOTNYWF9HUElPX0FCLAotCQkJCWVwOTN4eF9ncGlvX2FiX2lycV9oYW5kbGVyKTsKLQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfRVA5M1hYX0dQSU8wTVVYLAotCQkJCWVwOTN4eF9ncGlvX2ZfaXJxX2hhbmRsZXIpOwotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9FUDkzWFhfR1BJTzFNVVgsCi0JCQkJZXA5M3h4X2dwaW9fZl9pcnFfaGFuZGxlcik7Ci0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0VQOTNYWF9HUElPMk1VWCwKLQkJCQllcDkzeHhfZ3Bpb19mX2lycV9oYW5kbGVyKTsKLQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfRVA5M1hYX0dQSU8zTVVYLAotCQkJCWVwOTN4eF9ncGlvX2ZfaXJxX2hhbmRsZXIpOwotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9FUDkzWFhfR1BJTzRNVVgsCi0JCQkJZXA5M3h4X2dwaW9fZl9pcnFfaGFuZGxlcik7Ci0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0VQOTNYWF9HUElPNU1VWCwKLQkJCQllcDkzeHhfZ3Bpb19mX2lycV9oYW5kbGVyKTsKLQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfRVA5M1hYX0dQSU82TVVYLAotCQkJCWVwOTN4eF9ncGlvX2ZfaXJxX2hhbmRsZXIpOwotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9FUDkzWFhfR1BJTzdNVVgsCi0JCQkJZXA5M3h4X2dwaW9fZl9pcnFfaGFuZGxlcik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGdwaW9saWIgaW50ZXJmYWNlIGZvciBFUDkzeHggb24tY2hpcCBHUElPcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgZXA5M3h4X2dwaW9fY2hpcCB7Ci0Jc3RydWN0IGdwaW9fY2hpcAljaGlwOwotCi0Jdm9pZCBfX2lvbWVtCQkqZGF0YV9yZWc7Ci0Jdm9pZCBfX2lvbWVtCQkqZGF0YV9kaXJfcmVnOwotfTsKLQotI2RlZmluZSB0b19lcDkzeHhfZ3Bpb19jaGlwKGMpIGNvbnRhaW5lcl9vZihjLCBzdHJ1Y3QgZXA5M3h4X2dwaW9fY2hpcCwgY2hpcCkKLQotc3RhdGljIGludCBlcDkzeHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBlcDkzeHhfZ3Bpb19jaGlwICplcDkzeHhfY2hpcCA9IHRvX2VwOTN4eF9ncGlvX2NoaXAoY2hpcCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCB2OwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXYgPSBfX3Jhd19yZWFkYihlcDkzeHhfY2hpcC0+ZGF0YV9kaXJfcmVnKTsKLQl2ICY9IH4oMSA8PCBvZmZzZXQpOwotCV9fcmF3X3dyaXRlYih2LCBlcDkzeHhfY2hpcC0+ZGF0YV9kaXJfcmVnKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlcDkzeHhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJCXVuc2lnbmVkIG9mZnNldCwgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgZXA5M3h4X2dwaW9fY2hpcCAqZXA5M3h4X2NoaXAgPSB0b19lcDkzeHhfZ3Bpb19jaGlwKGNoaXApOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGxpbmU7Ci0JdTggdjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCS8qIFNldCB0aGUgdmFsdWUgKi8KLQl2ID0gX19yYXdfcmVhZGIoZXA5M3h4X2NoaXAtPmRhdGFfcmVnKTsKLQlpZiAodmFsKQotCQl2IHw9ICgxIDw8IG9mZnNldCk7Ci0JZWxzZQotCQl2ICY9IH4oMSA8PCBvZmZzZXQpOwotCV9fcmF3X3dyaXRlYih2LCBlcDkzeHhfY2hpcC0+ZGF0YV9yZWcpOwotCi0JLyogRHJpdmUgYXMgYW4gb3V0cHV0ICovCi0JbGluZSA9IGNoaXAtPmJhc2UgKyBvZmZzZXQ7Ci0JaWYgKGxpbmUgPD0gRVA5M1hYX0dQSU9fTElORV9NQVhfSVJRKSB7Ci0JCS8qIFBvcnRzIEEvQi9GICovCi0JCWVwOTN4eF9ncGlvX2ludF9tYXNrKGxpbmUpOwotCQllcDkzeHhfZ3Bpb191cGRhdGVfaW50X3BhcmFtcyhsaW5lID4+IDMpOwotCX0KLQotCXYgPSBfX3Jhd19yZWFkYihlcDkzeHhfY2hpcC0+ZGF0YV9kaXJfcmVnKTsKLQl2IHw9ICgxIDw8IG9mZnNldCk7Ci0JX19yYXdfd3JpdGViKHYsIGVwOTN4eF9jaGlwLT5kYXRhX2Rpcl9yZWcpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXA5M3h4X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgZXA5M3h4X2dwaW9fY2hpcCAqZXA5M3h4X2NoaXAgPSB0b19lcDkzeHhfZ3Bpb19jaGlwKGNoaXApOwotCi0JcmV0dXJuICEhKF9fcmF3X3JlYWRiKGVwOTN4eF9jaGlwLT5kYXRhX3JlZykgJiAoMSA8PCBvZmZzZXQpKTsKLX0KLQotc3RhdGljIHZvaWQgZXA5M3h4X2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgZXA5M3h4X2dwaW9fY2hpcCAqZXA5M3h4X2NoaXAgPSB0b19lcDkzeHhfZ3Bpb19jaGlwKGNoaXApOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggdjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2ID0gX19yYXdfcmVhZGIoZXA5M3h4X2NoaXAtPmRhdGFfcmVnKTsKLQlpZiAodmFsKQotCQl2IHw9ICgxIDw8IG9mZnNldCk7Ci0JZWxzZQotCQl2ICY9IH4oMSA8PCBvZmZzZXQpOwotCV9fcmF3X3dyaXRlYih2LCBlcDkzeHhfY2hpcC0+ZGF0YV9yZWcpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBlcDkzeHhfZ3Bpb19zZXRfZGVib3VuY2Uoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBkZWJvdW5jZSkKLXsKLQlpbnQgZ3BpbyA9IGNoaXAtPmJhc2UgKyBvZmZzZXQ7Ci0JaW50IGlycSA9IGdwaW9fdG9faXJxKGdwaW8pOwotCi0JaWYgKGlycSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZXA5M3h4X2dwaW9faW50X2RlYm91bmNlKGlycSwgZGVib3VuY2UgPyB0cnVlIDogZmFsc2UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgRVA5M1hYX0dQSU9fQkFOSyhuYW1lLCBkciwgZGRyLCBiYXNlX2dwaW8pCQkJXAotCXsJCQkJCQkJCVwKLQkJLmNoaXAgPSB7CQkJCQkJXAotCQkJLmxhYmVsCQkgID0gbmFtZSwJCQlcCi0JCQkuZGlyZWN0aW9uX2lucHV0ICA9IGVwOTN4eF9ncGlvX2RpcmVjdGlvbl9pbnB1dCwgXAotCQkJLmRpcmVjdGlvbl9vdXRwdXQgPSBlcDkzeHhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LCBcCi0JCQkuZ2V0CQkgID0gZXA5M3h4X2dwaW9fZ2V0LAkJXAotCQkJLnNldAkJICA9IGVwOTN4eF9ncGlvX3NldCwJCVwKLQkJCS5iYXNlCQkgID0gYmFzZV9ncGlvLAkJCVwKLQkJCS5uZ3BpbwkJICA9IDgsCQkJCVwKLQkJfSwJCQkJCQkJXAotCQkuZGF0YV9yZWcJPSBFUDkzWFhfR1BJT19SRUcoZHIpLAkJCVwKLQkJLmRhdGFfZGlyX3JlZwk9IEVQOTNYWF9HUElPX1JFRyhkZHIpLAkJCVwKLQl9Ci0KLXN0YXRpYyBzdHJ1Y3QgZXA5M3h4X2dwaW9fY2hpcCBlcDkzeHhfZ3Bpb19iYW5rc1tdID0gewotCUVQOTNYWF9HUElPX0JBTksoIkEiLCAweDAwLCAweDEwLCAwKSwKLQlFUDkzWFhfR1BJT19CQU5LKCJCIiwgMHgwNCwgMHgxNCwgOCksCi0JRVA5M1hYX0dQSU9fQkFOSygiQyIsIDB4MDgsIDB4MTgsIDQwKSwKLQlFUDkzWFhfR1BJT19CQU5LKCJEIiwgMHgwYywgMHgxYywgMjQpLAotCUVQOTNYWF9HUElPX0JBTksoIkUiLCAweDIwLCAweDI0LCAzMiksCi0JRVA5M1hYX0dQSU9fQkFOSygiRiIsIDB4MzAsIDB4MzQsIDE2KSwKLQlFUDkzWFhfR1BJT19CQU5LKCJHIiwgMHgzOCwgMHgzYywgNDgpLAotCUVQOTNYWF9HUElPX0JBTksoIkgiLCAweDQwLCAweDQ0LCA1NiksCi19OwotCi12b2lkIF9faW5pdCBlcDkzeHhfZ3Bpb19pbml0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQkvKiBTZXQgUG9ydHMgQywgRCwgRSwgRywgYW5kIEggZm9yIEdQSU8gdXNlICovCi0JZXA5M3h4X2RldmNmZ19zZXRfYml0cyhFUDkzWFhfU1lTQ09OX0RFVkNGR19LRVlTIHwKLQkJCQkgRVA5M1hYX1NZU0NPTl9ERVZDRkdfR09OSyB8Ci0JCQkJIEVQOTNYWF9TWVNDT05fREVWQ0ZHX0VPTklERSB8Ci0JCQkJIEVQOTNYWF9TWVNDT05fREVWQ0ZHX0dPTklERSB8Ci0JCQkJIEVQOTNYWF9TWVNDT05fREVWQ0ZHX0hPTklERSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlcDkzeHhfZ3Bpb19iYW5rcyk7IGkrKykgewotCQlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gJmVwOTN4eF9ncGlvX2JhbmtzW2ldLmNoaXA7Ci0KLQkJLyoKLQkJICogUG9ydHMgQSwgQiwgYW5kIEYgc3VwcG9ydCBpbnB1dCBkZWJvdW5jaW5nIHdoZW4KLQkJICogdXNlZCBhcyBpbnRlcnJ1cHRzLgotCQkgKi8KLQkJaWYgKCFzdHJjbXAoY2hpcC0+bGFiZWwsICJBIikgfHwKLQkJICAgICFzdHJjbXAoY2hpcC0+bGFiZWwsICJCIikgfHwKLQkJICAgICFzdHJjbXAoY2hpcC0+bGFiZWwsICJGIikpCi0JCQljaGlwLT5zZXRfZGVib3VuY2UgPSBlcDkzeHhfZ3Bpb19zZXRfZGVib3VuY2U7Ci0KLQkJZ3Bpb2NoaXBfYWRkKGNoaXApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9kbWEuaAppbmRleCA1ZTMxYjJiLi40NmQ0ZDg3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0xLDE0OSArMSw5MyBAQAotLyoqCi0gKiBET0M6IEVQOTN4eCBETUEgTTJQIG1lbW9yeSB0byBwZXJpcGhlcmFsIGFuZCBwZXJpcGhlcmFsIHRvIG1lbW9yeSBlbmdpbmUKLSAqCi0gKiBUaGUgRVA5M3h4IERNQSBNMlAgc3Vic3lzdGVtIGhhbmRsZXMgRE1BIHRyYW5zZmVycyBiZXR3ZWVuIG1lbW9yeSBhbmQKLSAqIHBlcmlwaGVyYWxzLiBETUEgTTJQIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUgZm9yIGF1ZGlvLCBVQVJUcyBhbmQgSXJEQS4KLSAqIFNlZSBjaGFwdGVyIDEwIG9mIHRoZSBFUDkzeHggdXNlcnMgZ3VpZGUgZm9yIGZ1bGwgZGV0YWlscyBvbiB0aGUgRE1BIE0yUAotICogZW5naW5lLgotICoKLSAqIFNlZSBzb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1wY20uYyBmb3IgYW4gZXhhbXBsZSB1c2Ugb2YgdGhlIERNQSBNMlAgY29kZS4KLSAqCi0gKi8KLQogI2lmbmRlZiBfX0FTTV9BUkNIX0RNQV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfRE1BX0gKIAotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0vKioKLSAqIHN0cnVjdCBlcDkzeHhfZG1hX2J1ZmZlciAtIEluZm9ybWF0aW9uIGFib3V0IGEgYnVmZmVyIHRvIGJlIHRyYW5zZmVycmVkCi0gKiB1c2luZyB0aGUgRE1BIE0yUCBlbmdpbmUKLSAqCi0gKiBAbGlzdDogRW50cnkgaW4gRE1BIGJ1ZmZlciBsaXN0Ci0gKiBAYnVzX2FkZHI6IFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgotICogQHNpemU6IFNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcwotICovCi1zdHJ1Y3QgZXA5M3h4X2RtYV9idWZmZXIgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQl1MzIJCQlidXNfYWRkcjsKLQl1MTYJCQlzaXplOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgZXA5M3h4X2RtYV9tMnBfY2xpZW50IC0gSW5mb3JtYXRpb24gYWJvdXQgYSBETUEgTTJQIGNsaWVudAotICoKLSAqIEBuYW1lOiBVbmlxdWUgbmFtZSBmb3IgdGhpcyBjbGllbnQKLSAqIEBmbGFnczogQ2xpZW50IGZsYWdzCi0gKiBAY29va2llOiBVc2VyIGRhdGEgdG8gcGFzcyB0byBjYWxsYmFjayBmdW5jdGlvbnMKLSAqIEBidWZmZXJfc3RhcnRlZDogTm9uIE5VTEwgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgdHJhbnNmZXIgaXMgc3RhcnRlZC4KLSAqIAkJCVRoZSBhcmd1bWVudHMgYXJlIHRoZSB1c2VyIGRhdGEgY29va2llIGFuZCB0aGUgRE1BCi0gKgkJCWJ1ZmZlciB3aGljaCBpcyBzdGFydGluZy4KLSAqIEBidWZmZXJfZmluaXNoZWQ6IE5vbiBOVUxMIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIHRyYW5zZmVyIGlzIGNvbXBsZXRlZC4KLSAqCQkJVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHVzZXIgZGF0YSBjb29raWUsIHRoZSBETUEgYnVmZmVyCi0gKgkJCXdoaWNoIGhhcyBjb21wbGV0ZWQsIGFuZCBhIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmCi0gKgkJCXRoZSB0cmFuc2ZlciBoYWQgYW4gZXJyb3IuCi0gKi8KLXN0cnVjdCBlcDkzeHhfZG1hX20ycF9jbGllbnQgewotCWNoYXIJCQkqbmFtZTsKLQl1OAkJCWZsYWdzOwotCXZvaWQJCQkqY29va2llOwotCXZvaWQJCQkoKmJ1ZmZlcl9zdGFydGVkKSh2b2lkICpjb29raWUsCi0JCQkJCXN0cnVjdCBlcDkzeHhfZG1hX2J1ZmZlciAqYnVmKTsKLQl2b2lkCQkJKCpidWZmZXJfZmluaXNoZWQpKHZvaWQgKmNvb2tpZSwKLQkJCQkJc3RydWN0IGVwOTN4eF9kbWFfYnVmZmVyICpidWYsCi0JCQkJCWludCBieXRlcywgaW50IGVycm9yKTsKLQotCS8qIHByaXZhdGU6IEludGVybmFsIHVzZSBvbmx5ICovCi0Jdm9pZAkJCSpjaGFubmVsOwotfTsKLQotLyogRE1BIE0yUCBwb3J0cyAqLwotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9QT1JUX0kyUzEJMHgwMAotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9QT1JUX0kyUzIJMHgwMQotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9QT1JUX0FBQzEJMHgwMgotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9QT1JUX0FBQzIJMHgwMwotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9QT1JUX0FBQzMJMHgwNAotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9QT1JUX0kyUzMJMHgwNQotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9QT1JUX1VBUlQxCTB4MDYKLSNkZWZpbmUgRVA5M1hYX0RNQV9NMlBfUE9SVF9VQVJUMgkweDA3Ci0jZGVmaW5lIEVQOTNYWF9ETUFfTTJQX1BPUlRfVUFSVDMJMHgwOAotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9QT1JUX0lSREEJMHgwOQotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9QT1JUX01BU0sJMHgwZgotCi0vKiBETUEgTTJQIGNsaWVudCBmbGFncyAqLwotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9UWAkJMHgwMAkvKiBNZW1vcnkgdG8gcGVyaXBoZXJhbCAqLwotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9SWAkJMHgxMAkvKiBQZXJpcGhlcmFsIHRvIG1lbW9yeSAqLworI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKIC8qCi0gKiBETUEgTTJQIGNsaWVudCBlcnJvciBoYW5kbGluZyBmbGFncy4gU2VlIHRoZSBFUDkzeHggdXNlcnMgZ3VpZGUKLSAqIGRvY3VtZW50YXRpb24gb24gdGhlIERNQSBNMlAgQ09OVFJPTCByZWdpc3RlciBmb3IgbW9yZSBkZXRhaWxzCisgKiBNMlAgY2hhbm5lbHMuCisgKgorICogTm90ZSB0aGF0IHRoZXNlIHZhbHVlcyBhcmUgYWxzbyBkaXJlY3RseSB1c2VkIGZvciBzZXR0aW5nIHRoZSBQUEFMTE9DCisgKiByZWdpc3Rlci4KICAqLwotI2RlZmluZSBFUDkzWFhfRE1BX00yUF9BQk9SVF9PTl9FUlJPUgkweDIwCS8qIEFib3J0IG9uIHBlcmlwaGVyYWwgZXJyb3IgKi8KLSNkZWZpbmUgRVA5M1hYX0RNQV9NMlBfSUdOT1JFX0VSUk9SCTB4NDAJLyogSWdub3JlIHBlcmlwaGVyYWwgZXJyb3JzICovCi0jZGVmaW5lIEVQOTNYWF9ETUFfTTJQX0VSUk9SX01BU0sJMHg2MAkvKiBNYXNrIG9mIGVycm9yIGJpdHMgKi8KKyNkZWZpbmUgRVA5M1hYX0RNQV9JMlMxCQkwCisjZGVmaW5lIEVQOTNYWF9ETUFfSTJTMgkJMQorI2RlZmluZSBFUDkzWFhfRE1BX0FBQzEJCTIKKyNkZWZpbmUgRVA5M1hYX0RNQV9BQUMyCQkzCisjZGVmaW5lIEVQOTNYWF9ETUFfQUFDMwkJNAorI2RlZmluZSBFUDkzWFhfRE1BX0kyUzMJCTUKKyNkZWZpbmUgRVA5M1hYX0RNQV9VQVJUMQk2CisjZGVmaW5lIEVQOTNYWF9ETUFfVUFSVDIJNworI2RlZmluZSBFUDkzWFhfRE1BX1VBUlQzCTgKKyNkZWZpbmUgRVA5M1hYX0RNQV9JUkRBCQk5CisvKiBNMk0gY2hhbm5lbHMgKi8KKyNkZWZpbmUgRVA5M1hYX0RNQV9TU1AJCTEwCisjZGVmaW5lIEVQOTNYWF9ETUFfSURFCQkxMQogCiAvKioKLSAqIGVwOTN4eF9kbWFfbTJwX2NsaWVudF9yZWdpc3RlciAtIFJlZ2lzdGVyIGEgY2xpZW50IHdpdGggdGhlIERNQSBNMlAKLSAqIHN1YnN5c3RlbQorICogc3RydWN0IGVwOTN4eF9kbWFfZGF0YSAtIGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIEVQOTN4eCBkbWFlbmdpbmUKKyAqIEBwb3J0OiBwZXJpcGhlcmFsIHdoaWNoIGlzIHJlcXVlc3RpbmcgdGhlIGNoYW5uZWwKKyAqIEBkaXJlY3Rpb246IFRYL1JYIGNoYW5uZWwKKyAqIEBuYW1lOiBvcHRpb25hbCBuYW1lIGZvciB0aGUgY2hhbm5lbCwgdGhpcyBpcyBkaXNwbGF5ZWQgaW4gL3Byb2MvaW50ZXJydXB0cwogICoKLSAqIEBtMnA6IENsaWVudCBpbmZvcm1hdGlvbiB0byByZWdpc3RlcgotICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MKLSAqCi0gKiBUaGUgRE1BIE0yUCBzdWJzeXN0ZW0gYWxsb2NhdGVzIGEgY2hhbm5lbCBhbmQgYW4gaW50ZXJydXB0IGxpbmUgZm9yIHRoZSBETUEKLSAqIGNsaWVudAorICogVGhpcyBpbmZvcm1hdGlvbiBpcyBwYXNzZWQgYXMgcHJpdmF0ZSBjaGFubmVsIHBhcmFtZXRlciBpbiBhIGZpbHRlcgorICogZnVuY3Rpb24uIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBzbGF2ZS9jeWNsaWMgY2hhbm5lbHMuICBGb3IKKyAqIG1lbWNweSBjaGFubmVscyAlTlVMTCBkYXRhIHNob3VsZCBiZSBwYXNzZWQuCiAgKi8KLWludCBlcDkzeHhfZG1hX20ycF9jbGllbnRfcmVnaXN0ZXIoc3RydWN0IGVwOTN4eF9kbWFfbTJwX2NsaWVudCAqbTJwKTsKK3N0cnVjdCBlcDkzeHhfZG1hX2RhdGEgeworCWludAkJCQlwb3J0OworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uCQlkaXJlY3Rpb247CisJY29uc3QgY2hhcgkJCSpuYW1lOworfTsKIAogLyoqCi0gKiBlcDkzeHhfZG1hX20ycF9jbGllbnRfdW5yZWdpc3RlciAtIFVucmVnaXN0ZXIgYSBjbGllbnQgZnJvbSB0aGUgRE1BIE0yUAotICogc3Vic3lzdGVtCi0gKgotICogQG0ycDogQ2xpZW50IHRvIHVucmVnaXN0ZXIKLSAqCi0gKiBBbnkgdHJhbnNmZXJzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyB3aWxsIGJlIGNvbXBsZXRlZCBpbiBoYXJkd2FyZSwgYnV0Ci0gKiBpZ25vcmVkIGluIHNvZnR3YXJlLgorICogc3RydWN0IGVwOTN4eF9kbWFfY2hhbl9kYXRhIC0gcGxhdGZvcm0gc3BlY2lmaWMgZGF0YSBmb3IgYSBETUEgY2hhbm5lbAorICogQG5hbWU6IG5hbWUgb2YgdGhlIGNoYW5uZWwsIHVzZWQgZm9yIGdldHRpbmcgdGhlIHJpZ2h0IGNsb2NrIGZvciB0aGUgY2hhbm5lbAorICogQGJhc2U6IG1hcHBlZCByZWdpc3RlcnMKKyAqIEBpcnE6IGludGVycnVwdCBudW1iZXIgdXNlZCBieSB0aGlzIGNoYW5uZWwKICAqLwotdm9pZCBlcDkzeHhfZG1hX20ycF9jbGllbnRfdW5yZWdpc3RlcihzdHJ1Y3QgZXA5M3h4X2RtYV9tMnBfY2xpZW50ICptMnApOworc3RydWN0IGVwOTN4eF9kbWFfY2hhbl9kYXRhIHsKKwljb25zdCBjaGFyCQkJKm5hbWU7CisJdm9pZCBfX2lvbWVtCQkJKmJhc2U7CisJaW50CQkJCWlycTsKK307CiAKIC8qKgotICogZXA5M3h4X2RtYV9tMnBfc3VibWl0IC0gU3VibWl0IGEgRE1BIE0yUCB0cmFuc2ZlcgorICogc3RydWN0IGVwOTN4eF9kbWFfcGxhdGZvcm1fZGF0YSAtIHBsYXRmb3JtIGRhdGEgZm9yIHRoZSBkbWFlbmdpbmUgZHJpdmVyCisgKiBAY2hhbm5lbHM6IGFycmF5IG9mIGNoYW5uZWxzIHdoaWNoIGFyZSBwYXNzZWQgdG8gdGhlIGRyaXZlcgorICogQG51bV9jaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBhcnJheQogICoKLSAqIEBtMnA6IERNQSBDbGllbnQgdG8gc3VibWl0IHRoZSB0cmFuc2ZlciBvbgotICogQGJ1ZjogRE1BIEJ1ZmZlciB0byBzdWJtaXQKLSAqCi0gKiBJZiB0aGUgY3VycmVudCBvciBuZXh0IHRyYW5zZmVyIHBvc2l0aW9ucyBhcmUgZnJlZSBvbiB0aGUgTTJQIGNsaWVudCB0aGVuCi0gKiB0aGUgdHJhbnNmZXIgaXMgc3RhcnRlZCBpbW1lZGlhdGVseS4gSWYgbm90LCB0aGUgdHJhbnNmZXIgaXMgYWRkZWQgdG8gdGhlCi0gKiBsaXN0IG9mIHBlbmRpbmcgdHJhbnNmZXJzLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIHRoZQotICogYnVmZmVyX2ZpbmlzaGVkIGNhbGxiYWNrIGZvciBhbiBNMlAgY2hhbm5lbC4KLSAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gdGhlIERNQSBlbmdpbmUgZHJpdmVyIHZpYSBwbGF0Zm9ybSBkYXRhLiBGb3IKKyAqIE0yUCBjaGFubmVscywgY29udHJhY3QgaXMgdGhhdCBldmVuIGNoYW5uZWxzIGFyZSBmb3IgVFggYW5kIG9kZCBmb3IgUlguCisgKiBUaGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3IgdGhlIE0yTSBjaGFubmVscy4KICAqLwotdm9pZCBlcDkzeHhfZG1hX20ycF9zdWJtaXQoc3RydWN0IGVwOTN4eF9kbWFfbTJwX2NsaWVudCAqbTJwLAotCQkJICAgc3RydWN0IGVwOTN4eF9kbWFfYnVmZmVyICpidWYpOworc3RydWN0IGVwOTN4eF9kbWFfcGxhdGZvcm1fZGF0YSB7CisJc3RydWN0IGVwOTN4eF9kbWFfY2hhbl9kYXRhCSpjaGFubmVsczsKKwlzaXplX3QJCQkJbnVtX2NoYW5uZWxzOworfTsKKworc3RhdGljIGlubGluZSBib29sIGVwOTN4eF9kbWFfY2hhbl9pc19tMnAoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXJldHVybiAhc3RyY21wKGRldl9uYW1lKGNoYW4tPmRldmljZS0+ZGV2KSwgImVwOTN4eC1kbWEtbTJwIik7Cit9CiAKIC8qKgotICogZXA5M3h4X2RtYV9tMnBfc3VibWl0X3JlY3Vyc2l2ZSAtIFB1dCBhIERNQSB0cmFuc2ZlciBvbiB0aGUgcGVuZGluZyBsaXN0Ci0gKiBmb3IgYW4gTTJQIGNoYW5uZWwKKyAqIGVwOTN4eF9kbWFfY2hhbl9kaXJlY3Rpb24gLSByZXR1cm5zIGRpcmVjdGlvbiB0aGUgY2hhbm5lbCBjYW4gYmUgdXNlZAorICogQGNoYW46IGNoYW5uZWwKICAqCi0gKiBAbTJwOiBETUEgQ2xpZW50IHRvIHN1Ym1pdCB0aGUgdHJhbnNmZXIgb24KLSAqIEBidWY6IERNQSBCdWZmZXIgdG8gc3VibWl0Ci0gKgotICogVGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIGJ1ZmZlcl9maW5pc2hlZCBjYWxsYmFjayBmb3IgYW4KLSAqIE0yUCBjaGFubmVsLiBJdCBpcyBjb21tb25seSB1c2VkIHRvIGFkZCB0aGUgbmV4dCB0cmFuc2ZlciBpbiBhIGNoYWluZWQgbGlzdAotICogb2YgRE1BIHRyYW5zZmVycy4KKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gZmlsdGVyIGZ1bmN0aW9ucyB0byBmaW5kIG91dCB3aGV0aGVyIHRoZQorICogY2hhbm5lbCBzdXBwb3J0cyBnaXZlbiBETUEgZGlyZWN0aW9uLiBPbmx5IE0yUCBjaGFubmVscyBoYXZlIHN1Y2gKKyAqIGxpbWl0YXRpb24sIGZvciBNMk0gY2hhbm5lbHMgdGhlIGRpcmVjdGlvbiBpcyBjb25maWd1cmFibGUuCiAgKi8KLXZvaWQgZXA5M3h4X2RtYV9tMnBfc3VibWl0X3JlY3Vyc2l2ZShzdHJ1Y3QgZXA5M3h4X2RtYV9tMnBfY2xpZW50ICptMnAsCi0JCQkJICAgICBzdHJ1Y3QgZXA5M3h4X2RtYV9idWZmZXIgKmJ1Zik7CitzdGF0aWMgaW5saW5lIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uCitlcDkzeHhfZG1hX2NoYW5fZGlyZWN0aW9uKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlpZiAoIWVwOTN4eF9kbWFfY2hhbl9pc19tMnAoY2hhbikpCisJCXJldHVybiBETUFfTk9ORTsKIAotLyoqCi0gKiBlcDkzeHhfZG1hX20ycF9mbHVzaCAtIEZsdXNoIGFsbCBwZW5kaW5nIHRyYW5zZmVycyBvbiBhIERNQSBNMlAgY2xpZW50Ci0gKgotICogQG0ycDogRE1BIGNsaWVudCB0byBmbHVzaCB0cmFuc2ZlcnMgb24KLSAqCi0gKiBBbnkgdHJhbnNmZXJzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyB3aWxsIGJlIGNvbXBsZXRlZCBpbiBoYXJkd2FyZSwgYnV0Ci0gKiBpZ25vcmVkIGluIHNvZnR3YXJlLgotICoKLSAqLwotdm9pZCBlcDkzeHhfZG1hX20ycF9mbHVzaChzdHJ1Y3QgZXA5M3h4X2RtYV9tMnBfY2xpZW50ICptMnApOworCS8qIGV2ZW4gY2hhbm5lbHMgYXJlIGZvciBUWCwgb2RkIGZvciBSWCAqLworCXJldHVybiAoY2hhbi0+Y2hhbl9pZCAlIDIgPT0gMCkgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFOworfQogCiAjZW5kaWYgLyogX19BU01fQVJDSF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2VwOTN4eC1yZWdzLmggYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZXA5M3h4LXJlZ3MuaAppbmRleCA5YWM0ZDEwLi5jNGE3Yjg0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZXA5M3h4LXJlZ3MuaAorKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZXA5M3h4LXJlZ3MuaApAQCAtOTgsNiArOTgsNyBAQAogCiAjZGVmaW5lIEVQOTNYWF9TRUNVUklUWV9CQVNFCQlFUDkzWFhfQVBCX0lPTUVNKDB4MDAwMzAwMDApCiAKKyNkZWZpbmUgRVA5M1hYX0dQSU9fUEhZU19CQVNFCQlFUDkzWFhfQVBCX1BIWVMoMHgwMDA0MDAwMCkKICNkZWZpbmUgRVA5M1hYX0dQSU9fQkFTRQkJRVA5M1hYX0FQQl9JT01FTSgweDAwMDQwMDAwKQogI2RlZmluZSBFUDkzWFhfR1BJT19SRUcoeCkJCShFUDkzWFhfR1BJT19CQVNFICsgKHgpKQogI2RlZmluZSBFUDkzWFhfR1BJT19GX0lOVF9TVEFUVVMJRVA5M1hYX0dQSU9fUkVHKDB4NWMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZXA5M3h4X3NwaS5oIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2VwOTN4eF9zcGkuaAppbmRleCAwYTM3OTYxLi45YmI2M2FjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZXA5M3h4X3NwaS5oCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9lcDkzeHhfc3BpLmgKQEAgLTcsOSArNywxMSBAQAogICogc3RydWN0IGVwOTN4eF9zcGlfaW5mbyAtIEVQOTN4eCBzcGVjaWZpYyBTUEkgZGVzY3JpcHRvcgogICogQG51bV9jaGlwc2VsZWN0OiBudW1iZXIgb2YgY2hpcCBzZWxlY3RzIG9uIHRoaXMgYm9hcmQsIG11c3QgYmUKICAqICAgICAgICAgICAgICAgICAgYXQgbGVhc3Qgb25lCisgKiBAdXNlX2RtYTogdXNlIERNQSBmb3IgdGhlIHRyYW5zZmVycwogICovCiBzdHJ1Y3QgZXA5M3h4X3NwaV9pbmZvIHsKIAlpbnQJbnVtX2NoaXBzZWxlY3Q7CisJYm9vbAl1c2VfZG1hOwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9zaW1vbmUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NpbW9uZS5jCmluZGV4IGQ5NmRjMWMuLjgzOTJlOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NpbW9uZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NpbW9uZS5jCkBAIC0yLDcgKzIsNyBAQAogICogYXJjaC9hcm0vbWFjaC1lcDkzeHgvc2ltb25lLmMKICAqIFNpbXBsZW1hY2hpbmVzIFNpbS5PbmUgc3VwcG9ydC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgUnlhbiBNYWxsb24gPHJ5YW5AYmx1ZXdhdGVyc3lzLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBSeWFuIE1hbGxvbgogICoKICAqIEJhc2VkIG9uIHRoZSAyLjYuMjQuNyBzdXBwb3J0OgogICogICBDb3B5cmlnaHQgKEMpIDIwMDkgU2ltcGxlbWFjaGluZXMKQEAgLTY1LDcgKzY1LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChTSU1fT05FLCAiU2ltcGxlbWFjaGluZXMgU2ltLk9uZSBCb2FyZCIpCi0vKiBNYWludGFpbmVyOiBSeWFuIE1hbGxvbiA8cnlhbkBibHVld2F0ZXJzeXMuY29tPiAqLworLyogTWFpbnRhaW5lcjogUnlhbiBNYWxsb24gKi8KIAkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTBfUEhZU19CQVNFICsgMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NuYXBwZXJjbDE1LmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9zbmFwcGVyY2wxNS5jCmluZGV4IGFjNjAxZmUuLjJlOWM2MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NuYXBwZXJjbDE1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvc25hcHBlcmNsMTUuYwpAQCAtMyw3ICszLDcgQEAKICAqIEJsdWV3YXRlciBTeXN0ZW1zIFNuYXBwZXIgQ0wxNSBzeXN0ZW0gbW9kdWxlCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IEJsdWV3YXRlciBTeXN0ZW1zIEx0ZAotICogQXV0aG9yOiBSeWFuIE1hbGxvbiA8cnlhbkBibHVld2F0ZXJzeXMuY29tPgorICogQXV0aG9yOiBSeWFuIE1hbGxvbgogICoKICAqIE5BTkQgY29kZSBhZGFwdGVkIGZyb20gZHJpdmVyIGJ5OgogICogICBBbmRyZSBSZW5hdWQgPGFuZHJlQGJsdWV3YXRlcnN5cy5jb20+CkBAIC0xNjIsNyArMTYyLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChTTkFQUEVSX0NMMTUsICJCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIENMMTUiKQotCS8qIE1haW50YWluZXI6IFJ5YW4gTWFsbG9uIDxyeWFuQGJsdWV3YXRlcnN5cy5jb20+ICovCisJLyogTWFpbnRhaW5lcjogUnlhbiBNYWxsb24gKi8KIAkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTBfUEhZU19CQVNFICsgMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcKaW5kZXggYjkyYzFlNS4uYWU0MzNhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcKQEAgLTkxLDYgKzkxLDExIEBACiAJaGVscAogCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIHRoZSBjYW1lcmEgaW50ZXJmYWNlcy4KIAorY29uZmlnIEVYWU5PUzRfU0VUVVBfVVNCX1BIWQorCWJvb2wKKwloZWxwCisJICBDb21tb24gc2V0dXAgY29kZSBmb3IgVVNCIFBIWSBjb250cm9sbGVyCisKICMgbWFjaGluZSBzdXBwb3J0CiAKIG1lbnUgIkVYWU5PUzQgTWFjaGluZXMiCkBAIC0xMDUsNiArMTEwLDggQEAKIAlzZWxlY3QgUzNDX0RFVl9IU01NQzEKIAlzZWxlY3QgUzNDX0RFVl9IU01NQzIKIAlzZWxlY3QgUzNDX0RFVl9IU01NQzMKKwlzZWxlY3QgU0FNU1VOR19ERVZfUFdNCisJc2VsZWN0IFNBTVNVTkdfREVWX0JBQ0tMSUdIVAogCXNlbGVjdCBFWFlOT1M0X0RFVl9QRAogCXNlbGVjdCBFWFlOT1M0X0RFVl9TWVNNTVUKIAlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMxCkBAIC0xMjIsOCArMTI5LDEwIEBACiAJc2VsZWN0IFMzQ19ERVZfSFNNTUMxCiAJc2VsZWN0IFMzQ19ERVZfSFNNTUMyCiAJc2VsZWN0IFMzQ19ERVZfSFNNTUMzCisJc2VsZWN0IFNBTVNVTkdfREVWX0JBQ0tMSUdIVAogCXNlbGVjdCBTQU1TVU5HX0RFVl9LRVlQQUQKIAlzZWxlY3QgRVhZTk9TNF9ERVZfUEQKKwlzZWxlY3QgU0FNU1VOR19ERVZfUFdNCiAJc2VsZWN0IEVYWU5PUzRfREVWX1NZU01NVQogCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzEKIAlzZWxlY3QgRVhZTk9TNF9TRVRVUF9LRVlQQUQKQEAgLTE3Niw2ICsxODUsNyBAQAogCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzMKIAlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkM1CiAJc2VsZWN0IEVYWU5PUzRfU0VUVVBfU0RIQ0kKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9VU0JfUEhZCiAJc2VsZWN0IFNBTVNVTkdfREVWX1BXTQogCWhlbHAKIAkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgU2Ftc3VuZyBNb2JpbGUgTlVSSSBCb2FyZC4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9NYWtlZmlsZQppbmRleCBhOWJiOTRmLi4xMzY2OTk1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L01ha2VmaWxlCkBAIC0xNSw3ICsxNSw2IEBACiBvYmotJChDT05GSUdfQ1BVX0VYWU5PUzQyMTApCSs9IGNwdS5vIGluaXQubyBjbG9jay5vIGlycS1jb21iaW5lci5vCiBvYmotJChDT05GSUdfQ1BVX0VYWU5PUzQyMTApCSs9IHNldHVwLWkyYzAubyBpcnEtZWludC5vIGRtYS5vCiBvYmotJChDT05GSUdfUE0pCQkrPSBwbS5vIHNsZWVwLm8KLW9iai0kKENPTkZJR19DUFVfRlJFUSkJCSs9IGNwdWZyZXEubwogb2JqLSQoQ09ORklHX0NQVV9JRExFKQkJKz0gY3B1aWRsZS5vCiAKIG9iai0kKENPTkZJR19TTVApCQkrPSBwbGF0c21wLm8gaGVhZHNtcC5vCkBAIC01Niw0ICs1NSw0IEBACiBvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9TREhDSSkJKz0gc2V0dXAtc2RoY2kubwogb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfU0RIQ0lfR1BJTykJKz0gc2V0dXAtc2RoY2ktZ3Bpby5vCiAKLW9iai0kKENPTkZJR19VU0JfU1VQUE9SVCkJCSs9IHVzYi1waHkubworb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfVVNCX1BIWSkJKz0gc2V0dXAtdXNiLXBoeS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jbG9jay5jCmluZGV4IDg3MWY5ZDUuLjY2NDk0ZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jbG9jay5jCkBAIC0yNywyNCArMjcsMjAgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3NjbGtfaGRtaTI3bSA9IHsKIAkubmFtZQkJPSAic2Nsa19oZG1pMjdtIiwKLQkuaWQJCT0gLTEsCiAJLnJhdGUJCT0gMjcwMDAwMDAsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfc2Nsa19oZG1pcGh5ID0gewogCS5uYW1lCQk9ICJzY2xrX2hkbWlwaHkiLAotCS5pZAkJPSAtMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19zY2xrX3VzYnBoeTAgPSB7CiAJLm5hbWUJCT0gInNjbGtfdXNicGh5MCIsCi0JLmlkCQk9IC0xLAogCS5yYXRlCQk9IDI3MDAwMDAwLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3NjbGtfdXNicGh5MSA9IHsKIAkubmFtZQkJPSAic2Nsa191c2JwaHkxIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgaW50IGV4eW5vczRfY2xrc3JjX21hc2tfdG9wX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQpAQCAtMTMyLDcgKzEyOCw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfYXBsbCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAibW91dF9hcGxsIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMJPSAmY2xrX3NyY19hcGxsLAogCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19DUFUsIC5zaGlmdCA9IDAsIC5zaXplID0gMSB9LApAQCAtMTQxLDcgKzEzNiw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfYXBsbCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAic2Nsa19hcGxsIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfbW91dF9hcGxsLmNsaywKIAl9LAogCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9DUFUsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDMgfSwKQEAgLTE1MCw3ICsxNDQsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2VwbGwgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gIm1vdXRfZXBsbCIsCi0JCS5pZAkJPSAtMSwKIAl9LAogCS5zb3VyY2VzCT0gJmNsa19zcmNfZXBsbCwKIAkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCkBAIC0xNTksNyArMTUyLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9tcGxsID0gewogCS5jbGsgPSB7CiAJCS5uYW1lCQk9ICJtb3V0X21wbGwiLAotCQkuaWQJCT0gLTEsCiAJfSwKIAkuc291cmNlcwk9ICZjbGtfc3JjX21wbGwsCiAJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NQVSwgLnNoaWZ0ID0gOCwgLnNpemUgPSAxIH0sCkBAIC0xNzgsNyArMTcwLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dGNvcmUgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gIm1vdXRjb3JlIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMJPSAmY2xrc2V0X21vdXRjb3JlLAogCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19DUFUsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDEgfSwKQEAgLTE4Nyw3ICsxNzgsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19jb3JlY2xrID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJjb3JlX2NsayIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX21vdXRjb3JlLmNsaywKIAl9LAogCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9DUFUsIC5zaGlmdCA9IDAsIC5zaXplID0gMyB9LApAQCAtMTk2LDcgKzE4Niw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FybWNsayA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAiYXJtY2xrIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfY29yZWNsay5jbGssCiAJfSwKIH07CkBAIC0yMDQsNyArMTkzLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa19jb3JlbTAgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImFjbGtfY29yZW0wIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfY29yZWNsay5jbGssCiAJfSwKIAkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ1BVLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDMgfSwKQEAgLTIxMyw3ICsyMDEsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrX2NvcmVzID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJhY2xrX2NvcmVzIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfY29yZWNsay5jbGssCiAJfSwKIAkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ1BVLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDMgfSwKQEAgLTIyMiw3ICsyMDksNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrX2NvcmVtMSA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAiYWNsa19jb3JlbTEiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19jb3JlY2xrLmNsaywKIAl9LAogCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9DUFUsIC5zaGlmdCA9IDgsIC5zaXplID0gMyB9LApAQCAtMjMxLDcgKzIxNyw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3BlcmlwaGNsayA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAicGVyaXBoY2xrIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfY29yZWNsay5jbGssCiAJfSwKIAkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ1BVLCAuc2hpZnQgPSAxMiwgLnNpemUgPSAzIH0sCkBAIC0yNTIsNyArMjM3LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9jb3JlYnVzID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJtb3V0X2NvcmVidXMiLAotCQkuaWQJCT0gLTEsCiAJfSwKIAkuc291cmNlcwk9ICZjbGtzZXRfbW91dF9jb3JlYnVzLAogCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19ETUMsIC5zaGlmdCA9IDQsIC5zaXplID0gMSB9LApAQCAtMjYxLDcgKzI0NSw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfZG1jID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJzY2xrX2RtYyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX21vdXRfY29yZWJ1cy5jbGssCiAJfSwKIAkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfRE1DMCwgLnNoaWZ0ID0gMTIsIC5zaXplID0gMyB9LApAQCAtMjcwLDcgKzI1Myw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfY29yZWQgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImFjbGtfY29yZWQiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19zY2xrX2RtYy5jbGssCiAJfSwKIAkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfRE1DMCwgLnNoaWZ0ID0gMTYsIC5zaXplID0gMyB9LApAQCAtMjc5LDcgKzI2MSw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfY29yZXAgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImFjbGtfY29yZXAiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19hY2xrX2NvcmVkLmNsaywKIAl9LAogCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9ETUMwLCAuc2hpZnQgPSAyMCwgLnNpemUgPSAzIH0sCkBAIC0yODgsNyArMjY5LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa19hY3AgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImFjbGtfYWNwIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfbW91dF9jb3JlYnVzLmNsaywKIAl9LAogCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9ETUMwLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDMgfSwKQEAgLTI5Nyw3ICsyNzcsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19wY2xrX2FjcCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAicGNsa19hY3AiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19hY2xrX2FjcC5jbGssCiAJfSwKIAkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfRE1DMCwgLnNoaWZ0ID0gNCwgLnNpemUgPSAzIH0sCkBAIC0zMTgsNyArMjk3LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa18yMDAgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImFjbGtfMjAwIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMJPSAmY2xrc2V0X2FjbGssCiAJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RPUDAsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDEgfSwKQEAgLTMyOCw3ICszMDYsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrXzEwMCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAiYWNsa18xMDAiLAotCQkuaWQJCT0gLTEsCiAJfSwKIAkuc291cmNlcwk9ICZjbGtzZXRfYWNsaywKIAkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gMTYsIC5zaXplID0gMSB9LApAQCAtMzM4LDcgKzMxNSw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfMTYwID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJhY2xrXzE2MCIsCi0JCS5pZAkJPSAtMSwKIAl9LAogCS5zb3VyY2VzCT0gJmNsa3NldF9hY2xrLAogCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19UT1AwLCAuc2hpZnQgPSAyMCwgLnNpemUgPSAxIH0sCkBAIC0zNDgsNyArMzI0LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa18xMzMgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImFjbGtfMTMzIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMJPSAmY2xrc2V0X2FjbGssCiAJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RPUDAsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDEgfSwKQEAgLTM2OCw3ICszNDMsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa192cGxsc3JjID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJ2cGxsX3NyYyIsCi0JCS5pZAkJPSAtMSwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3RvcF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCX0sCkBAIC0zODksNyArMzYzLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa192cGxsID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJzY2xrX3ZwbGwiLAotCQkuaWQJCT0gLTEsCiAJfSwKIAkuc291cmNlcwk9ICZjbGtzZXRfc2Nsa192cGxsLAogCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19UT1AwLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDEgfSwKQEAgLTM5OCwxNjEgKzM3MSwxNTEgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0gewogCXsKIAkJLm5hbWUJCT0gInRpbWVycyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAogCQkuY3RybGJpdAk9ICgxPDwyNCksCiAJfSwgewogCQkubmFtZQkJPSAiY3NpcyIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzNXAtbWlwaS1jc2lzLjAiLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDQpLAogCX0sIHsKIAkJLm5hbWUJCT0gImNzaXMiLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAiczVwLW1pcGktY3Npcy4xIiwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJmaW1jIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4wIiwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJmaW1jIiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4xIiwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJmaW1jIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4yIiwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJmaW1jIiwKLQkJLmlkCQk9IDMsCisJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4zIiwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJmaW1kIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gImV4eW5vczQtZmIuMCIsCiAJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfbGNkMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCX0sIHsKIAkJLm5hbWUJCT0gImZpbWQiLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAiZXh5bm9zNC1mYi4xIiwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9sY2QxX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMCksCiAJfSwgewogCQkubmFtZQkJPSAic2F0YXBoeSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTMzLmNsaywKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMyksCiAJfSwgewogCQkubmFtZQkJPSAiaHNtbWMiLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjAiLAogCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJoc21tYyIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCiAJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDYpLAogCX0sIHsKIAkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4yIiwKIAkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTMzLmNsaywKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNyksCiAJfSwgewogCQkubmFtZQkJPSAiaHNtbWMiLAotCQkuaWQJCT0gMywKKwkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjMiLAogCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKIAl9LCB7Ci0JCS5uYW1lCQk9ICJoc21tYyIsCi0JCS5pZAkJPSA0LAorCQkubmFtZQkJPSAiZHdtbWMiLAogCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA5KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJzYXRhIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxMCksCiAJfSwgewogCQkubmFtZQkJPSAicGRtYSIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzM2MtcGwzMzAuMCIsCiAJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCX0sIHsKIAkJLm5hbWUJCT0gInBkbWEiLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAiczNjLXBsMzMwLjEiLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJhZGMiLAotCQkuaWQJCT0gLTEsCiAJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxNSksCiAJfSwgewogCQkubmFtZQkJPSAia2V5cGFkIiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlyX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTYpLAogCX0sIHsKIAkJLm5hbWUJCT0gInJ0YyIsCi0JCS5pZAkJPSAtMSwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpcl9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE1KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpcl9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE0KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1c2Job3N0IiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCAsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTIpLAogCX0sIHsKIAkJLm5hbWUJCT0gIm90ZyIsCi0JCS5pZAkJPSAtMSwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTMpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwaSIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4wIiwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE2KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJzcGkiLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMSIsCiAJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxNyksCiAJfSwgewogCQkubmFtZQkJPSAic3BpIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjIiLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTgpLAogCX0sIHsKIAkJLm5hbWUJCT0gImlpcyIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzYW1zdW5nLWkycy4wIiwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE5KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJpaXMiLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAic2Ftc3VuZy1pMnMuMSIsCiAJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyMCksCiAJfSwgewogCQkubmFtZQkJPSAiaWlzIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjIiLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMjEpLAogCX0sIHsKQEAgLTU2MiwxMjUgKzUyNSwxMTAgQEAKIAkJLmN0cmxiaXQJPSAoMSA8PCAyNyksCiAJfSwgewogCQkubmFtZQkJPSAiZmltZzJkIiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ltYWdlX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMCksCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjAiLAogCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNiksCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjEiLAogCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNyksCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjIiLAogCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgOCksCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IDMsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjMiLAogCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgOSksCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IDQsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjQiLAogCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTApLAogCX0sIHsKIAkJLm5hbWUJCT0gImkyYyIsCi0JCS5pZAkJPSA1LAorCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy41IiwKIAkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDExKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJpMmMiLAotCQkuaWQJCT0gNiwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuNiIsCiAJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCiAJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxMiksCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IDcsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjciLAogCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTMpLAogCX0sIHsKIAkJLm5hbWUJCT0gIlNZU01NVV9NRE1BIiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ltYWdlX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNSksCiAJfSwgewogCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUMwIiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDcpLAogCX0sIHsKIAkJLm5hbWUJCT0gIlNZU01NVV9GSU1DMSIsCi0JCS5pZAkJPSAtMSwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJTWVNNTVVfRklNQzIiLAotCQkuaWQJCT0gLTEsCiAJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgOSksCiAJfSwgewogCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUMzIiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEwKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJTWVNNTVVfSlBFRyIsCi0JCS5pZAkJPSAtMSwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxMSksCiAJfSwgewogCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUQwIiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2xjZDBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJTWVNNTVVfRklNRDEiLAotCQkuaWQJCT0gLTEsCiAJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfbGNkMV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDQpLAogCX0sIHsKIAkJLm5hbWUJCT0gIlNZU01NVV9QQ0llIiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxOCksCiAJfSwgewogCQkubmFtZQkJPSAiU1lTTU1VX0cyRCIsCi0JCS5pZAkJPSAtMSwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9pbWFnZV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDMpLAogCX0sIHsKIAkJLm5hbWUJCT0gIlNZU01NVV9ST1RBVE9SIiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ltYWdlX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNCksCiAJfSwgewogCQkubmFtZQkJPSAiU1lTTU1VX1RWIiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3R2X2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNCksCiAJfSwgewogCQkubmFtZQkJPSAiU1lTTU1VX01GQ19MIiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX21mY19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEpLAogCX0sIHsKIAkJLm5hbWUJCT0gIlNZU01NVV9NRkNfUiIsCi0JCS5pZAkJPSAtMSwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9tZmNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyKSwKIAl9CkBAIC02ODksMzIgKzYzNywzMiBAQAogc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3NbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4wIiwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCX0sIHsKIAkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjEiLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMSksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAyLAorCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMiIsCiAJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmlkCQk9IDMsCisJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4zIiwKIAkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDMpLAogCX0sIHsKIAkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gNCwKKwkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjQiLAogCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNCksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSA1LAorCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuNSIsCiAJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKIAl9CkBAIC03NTAsNyArNjk4LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9nMmQwID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJtb3V0X2cyZDAiLAotCQkuaWQJCT0gLTEsCiAJfSwKIAkuc291cmNlcwk9ICZjbGtzZXRfbW91dF9nMmQwLAogCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19JTUFHRSwgLnNoaWZ0ID0gMCwgLnNpemUgPSAxIH0sCkBAIC03NjksNyArNzE2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9nMmQxID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJtb3V0X2cyZDEiLAotCQkuaWQJCT0gLTEsCiAJfSwKIAkuc291cmNlcwk9ICZjbGtzZXRfbW91dF9nMmQxLAogCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19JTUFHRSwgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCkBAIC03ODgsNyArNzM0LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZG91dF9tbWMwID0gewogCS5jbGsJCT0gewogCQkubmFtZQkJPSAiZG91dF9tbWMwIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAogCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKQEAgLTc5OCw3ICs3NDMsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kb3V0X21tYzEgPSB7CiAJLmNsawkJPSB7CiAJCS5uYW1lCQk9ICJkb3V0X21tYzEiLAotCQkuaWQJCT0gLTEsCiAJfSwKIAkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCiAJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0ZTWVMsIC5zaGlmdCA9IDQsIC5zaXplID0gNCB9LApAQCAtODA4LDcgKzc1Miw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2RvdXRfbW1jMiA9IHsKIAkuY2xrCQk9IHsKIAkJLm5hbWUJCT0gImRvdXRfbW1jMiIsCi0JCS5pZAkJPSAtMSwKIAl9LAogCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKIAkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfRlNZUywgLnNoaWZ0ID0gOCwgLnNpemUgPSA0IH0sCkBAIC04MTgsNyArNzYxLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZG91dF9tbWMzID0gewogCS5jbGsJCT0gewogCQkubmFtZQkJPSAiZG91dF9tbWMzIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAogCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSAxMiwgLnNpemUgPSA0IH0sCkBAIC04MjgsNyArNzcwLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZG91dF9tbWM0ID0gewogCS5jbGsJCT0gewogCQkubmFtZQkJPSAiZG91dF9tbWM0IiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAogCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSAxNiwgLnNpemUgPSA0IH0sCkBAIC04MzksNyArNzgwLDcgQEAKIAl7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAidWNsazEiLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMCIsCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwwX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCQl9LApAQCAtODQ5LDcgKzc5MCw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJ1Y2xrMSIsCi0JCQkuaWQJCT0gMSwKKwkJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4xIiwKIAkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDBfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgNCksCiAJCX0sCkBAIC04NTksNyArODAwLDcgQEAKIAl9LCB7CiAJCS5jbGsJCT0gewogCQkJLm5hbWUJCT0gInVjbGsxIiwKLQkJCS5pZAkJPSAyLAorCQkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjIiLAogCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMF9jdHJsLAogCQkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKIAkJfSwKQEAgLTg2OSw3ICs4MTAsNyBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAidWNsazEiLAotCQkJLmlkCQk9IDMsCisJCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMyIsCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwwX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKIAkJfSwKQEAgLTg3OSw3ICs4MjAsNiBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19wd20iLAotCQkJLmlkCQk9IC0xLAogCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMF9jdHJsLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAyNCksCiAJCX0sCkBAIC04ODksNyArODI5LDcgQEAKIAl9LCB7CiAJCS5jbGsJCT0gewogCQkJLm5hbWUJCT0gInNjbGtfY3NpcyIsCi0JCQkuaWQJCT0gMCwKKwkJCS5kZXZuYW1lCT0gInM1cC1taXBpLWNzaXMuMCIsCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDI0KSwKIAkJfSwKQEAgLTg5OSw3ICs4MzksNyBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19jc2lzIiwKLQkJCS5pZAkJPSAxLAorCQkJLmRldm5hbWUJPSAiczVwLW1pcGktY3Npcy4xIiwKIAkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMjgpLAogCQl9LApAQCAtOTA5LDcgKzg0OSw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2NhbSIsCi0JCQkuaWQJCT0gMCwKKwkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4wIiwKIAkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTYpLAogCQl9LApAQCAtOTE5LDcgKzg1OSw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2NhbSIsCi0JCQkuaWQJCT0gMSwKKwkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4xIiwKIAkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMjApLAogCQl9LApAQCAtOTI5LDcgKzg2OSw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMCIsCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCQl9LApAQCAtOTM5LDcgKzg3OSw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAotCQkJLmlkCQk9IDEsCisJCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMSIsCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDQpLAogCQl9LApAQCAtOTQ5LDcgKzg4OSw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAotCQkJLmlkCQk9IDIsCisJCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMiIsCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDgpLAogCQl9LApAQCAtOTU5LDcgKzg5OSw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAotCQkJLmlkCQk9IDMsCisJCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMyIsCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKIAkJfSwKQEAgLTk2OSw3ICs5MDksNyBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19maW1kIiwKLQkJCS5pZAkJPSAwLAorCQkJLmRldm5hbWUJPSAiZXh5bm9zNC1mYi4wIiwKIAkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19sY2QwX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCQl9LApAQCAtOTc5LDcgKzkxOSw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2ZpbWQiLAotCQkJLmlkCQk9IDEsCisJCQkuZGV2bmFtZQk9ICJleHlub3M0LWZiLjEiLAogCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2xjZDFfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMCksCiAJCX0sCkBAIC05ODksNyArOTI5LDYgQEAKIAl9LCB7CiAJCS5jbGsJCT0gewogCQkJLm5hbWUJCT0gInNjbGtfc2F0YSIsCi0JCQkuaWQJCT0gLTEsCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAyNCksCiAJCX0sCkBAIC05OTksNyArOTM4LDcgQEAKIAl9LCB7CiAJCS5jbGsJCT0gewogCQkJLm5hbWUJCT0gInNjbGtfc3BpIiwKLQkJCS5pZAkJPSAwLAorCQkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMCIsCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwxX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDE2KSwKIAkJfSwKQEAgLTEwMDksNyArOTQ4LDcgQEAKIAl9LCB7CiAJCS5jbGsJCT0gewogCQkJLm5hbWUJCT0gInNjbGtfc3BpIiwKLQkJCS5pZAkJPSAxLAorCQkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMSIsCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwxX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDIwKSwKIAkJfSwKQEAgLTEwMTksNyArOTU4LDcgQEAKIAl9LCB7CiAJCS5jbGsJCT0gewogCQkJLm5hbWUJCT0gInNjbGtfc3BpIiwKLQkJCS5pZAkJPSAyLAorCQkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMiIsCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwxX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDI0KSwKIAkJfSwKQEAgLTEwMjksNyArOTY4LDYgQEAKIAl9LCB7CiAJCS5jbGsJCT0gewogCQkJLm5hbWUJCT0gInNjbGtfZmltZzJkIiwKLQkJCS5pZAkJPSAtMSwKIAkJfSwKIAkJLnNvdXJjZXMgPSAmY2xrc2V0X21vdXRfZzJkLAogCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfSU1BR0UsIC5zaGlmdCA9IDgsIC5zaXplID0gMSB9LApAQCAtMTAzNyw3ICs5NzUsNyBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMCIsCiAJCQkucGFyZW50CQk9ICZjbGtfZG91dF9tbWMwLmNsaywKIAkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDApLApAQCAtMTA0Niw3ICs5ODQsNyBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDEsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCQkucGFyZW50ICAgICAgICAgPSAmY2xrX2RvdXRfbW1jMS5jbGssCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsLAogCQkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKQEAgLTEwNTUsNyArOTkzLDcgQEAKIAl9LCB7CiAJCS5jbGsJCT0gewogCQkJLm5hbWUJCT0gInNjbGtfbW1jIiwKLQkJCS5pZAkJPSAyLAorCQkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjIiLAogCQkJLnBhcmVudCAgICAgICAgID0gJmNsa19kb3V0X21tYzIuY2xrLAogCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2ZzeXNfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgOCksCkBAIC0xMDY0LDcgKzEwMDIsNyBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDMsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMyIsCiAJCQkucGFyZW50ICAgICAgICAgPSAmY2xrX2RvdXRfbW1jMy5jbGssCiAJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAxMiksCkBAIC0xMDcyLDggKzEwMTAsNyBAQAogCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzIsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDggfSwKIAl9LCB7CiAJCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfbW1jIiwKLQkJCS5pZAkJPSA0LAorCQkJLm5hbWUJCT0gInNjbGtfZHdtbWMiLAogCQkJLnBhcmVudCAgICAgICAgID0gJmNsa19kb3V0X21tYzQuY2xrLAogCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2ZzeXNfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTYpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdS5jCmluZGV4IDA4ODEzYTYuLmJmZDYyMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jcHUuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvY3B1LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9maW1jLWNvcmUuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy1jb3JlLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+CiAKQEAgLTk4LDcgKzk5LDcgQEAKIAkJLmxlbmd0aAkJPSBTWl80SywKIAkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfVVNCX0hTUEhZLAorCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVMzQ19WQV9VU0JfSFNQSFksCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX0hTUEhZKSwKIAkJLmxlbmd0aAkJPSBTWl80SywKIAkJLnR5cGUJCT0gTVRfREVWSUNFLApAQCAtMTMyLDYgKzEzMywxMSBAQAogCXMzY19maW1jX3NldG5hbWUoMSwgImV4eW5vczQtZmltYyIpOwogCXMzY19maW1jX3NldG5hbWUoMiwgImV4eW5vczQtZmltYyIpOwogCXMzY19maW1jX3NldG5hbWUoMywgImV4eW5vczQtZmltYyIpOworCisJLyogVGhlIEkyQyBidXMgY29udHJvbGxlcnMgYXJlIGRpcmVjdGx5IGNvbXBhdGlibGUgd2l0aCBzM2MyNDQwICovCisJczNjX2kyYzBfc2V0bmFtZSgiczNjMjQ0MC1pMmMiKTsKKwlzM2NfaTJjMV9zZXRuYW1lKCJzM2MyNDQwLWkyYyIpOworCXMzY19pMmMyX3NldG5hbWUoInMzYzI0NDAtaTJjIik7CiB9CiAKIHZvaWQgX19pbml0IGV4eW5vczRfaW5pdF9jbG9ja3MoaW50IHh0YWwpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvY3B1ZnJlcS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdWZyZXEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiZDI1OC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvY3B1ZnJlcS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY5ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jcHVmcmVxLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBFWFlOT1M0IC0gQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtbWVtLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+Ci0jaW5jbHVkZSA8cGxhdC9wbS5oPgotCi1zdGF0aWMgc3RydWN0IGNsayAqY3B1X2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICptb3V0Y29yZTsKLXN0YXRpYyBzdHJ1Y3QgY2xrICptb3V0X21wbGw7Ci1zdGF0aWMgc3RydWN0IGNsayAqbW91dF9hcGxsOwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqYXJtX3JlZ3VsYXRvcjsKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICppbnRfcmVndWxhdG9yOwotCi1zdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG1lbXR5cGU7Ci0KLWVudW0gZXh5bm9zNF9tZW1vcnlfdHlwZSB7Ci0JRERSMiA9IDQsCi0JTFBERFIyLAotCUREUjMsCi19OwotCi1lbnVtIGNwdWZyZXFfbGV2ZWxfaW5kZXggewotCUwwLCBMMSwgTDIsIEwzLCBDUFVGUkVRX0xFVkVMX0VORCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgZXh5bm9zNF9mcmVxX3RhYmxlW10gPSB7Ci0Je0wwLCAxMDAwKjEwMDB9LAotCXtMMSwgODAwKjEwMDB9LAotCXtMMiwgNDAwKjEwMDB9LAotCXtMMywgMTAwKjEwMDB9LAotCXswLCBDUFVGUkVRX1RBQkxFX0VORH0sCi19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNsa2Rpdl9jcHUwW0NQVUZSRVFfTEVWRUxfRU5EXVs3XSA9IHsKLQkvKgotCSAqIENsb2NrIGRpdmlkZXIgdmFsdWUgZm9yIGZvbGxvd2luZwotCSAqIHsgRElWQ09SRSwgRElWQ09SRU0wLCBESVZDT1JFTTEsIERJVlBFUklQSCwKLQkgKgkJRElWQVRCLCBESVZQQ0xLX0RCRywgRElWQVBMTCB9Ci0JICovCi0KLQkvKiBBUk0gTDA6IDEwMDBNSHogKi8KLQl7IDAsIDMsIDcsIDMsIDMsIDAsIDEgfSwKLQotCS8qIEFSTSBMMTogODAwTUh6ICovCi0JeyAwLCAzLCA3LCAzLCAzLCAwLCAxIH0sCi0KLQkvKiBBUk0gTDI6IDQwME1IeiAqLwotCXsgMCwgMSwgMywgMSwgMywgMCwgMSB9LAotCi0JLyogQVJNIEwzOiAxMDBNSHogKi8KLQl7IDAsIDAsIDEsIDAsIDMsIDEsIDEgfSwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2xrZGl2X2NwdTFbQ1BVRlJFUV9MRVZFTF9FTkRdWzJdID0gewotCS8qCi0JICogQ2xvY2sgZGl2aWRlciB2YWx1ZSBmb3IgZm9sbG93aW5nCi0JICogeyBESVZDT1BZLCBESVZIUE0gfQotCSAqLwotCi0JIC8qIEFSTSBMMDogMTAwME1IeiAqLwotCXsgMywgMCB9LAotCi0JLyogQVJNIEwxOiA4MDBNSHogKi8KLQl7IDMsIDAgfSwKLQotCS8qIEFSTSBMMjogNDAwTUh6ICovCi0JeyAzLCAwIH0sCi0KLQkvKiBBUk0gTDM6IDEwME1IeiAqLwotCXsgMywgMCB9LAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBjbGtkaXZfZG1jMFtDUFVGUkVRX0xFVkVMX0VORF1bOF0gPSB7Ci0JLyoKLQkgKiBDbG9jayBkaXZpZGVyIHZhbHVlIGZvciBmb2xsb3dpbmcKLQkgKiB7IERJVkFDUCwgRElWQUNQX1BDTEssIERJVkRQSFksIERJVkRNQywgRElWRE1DRAotCSAqCQlESVZETUNQLCBESVZDT1BZMiwgRElWQ09SRV9USU1FUlMgfQotCSAqLwotCi0JLyogRE1DIEwwOiA0MDBNSHogKi8KLQl7IDMsIDEsIDEsIDEsIDEsIDEsIDMsIDEgfSwKLQotCS8qIERNQyBMMTogNDAwTUh6ICovCi0JeyAzLCAxLCAxLCAxLCAxLCAxLCAzLCAxIH0sCi0KLQkvKiBETUMgTDI6IDI2Ni43TUh6ICovCi0JeyA3LCAxLCAxLCAyLCAxLCAxLCAzLCAxIH0sCi0KLQkvKiBETUMgTDM6IDIwME1IeiAqLwotCXsgNywgMSwgMSwgMywgMSwgMSwgMywgMSB9LAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBjbGtkaXZfdG9wW0NQVUZSRVFfTEVWRUxfRU5EXVs1XSA9IHsKLQkvKgotCSAqIENsb2NrIGRpdmlkZXIgdmFsdWUgZm9yIGZvbGxvd2luZwotCSAqIHsgRElWQUNMSzIwMCwgRElWQUNMSzEwMCwgRElWQUNMSzE2MCwgRElWQUNMSzEzMywgRElWT05FTkFORCB9Ci0JICovCi0KLQkvKiBBQ0xLMjAwIEwwOiAyMDBNSHogKi8KLQl7IDMsIDcsIDQsIDUsIDEgfSwKLQotCS8qIEFDTEsyMDAgTDE6IDIwME1IeiAqLwotCXsgMywgNywgNCwgNSwgMSB9LAotCi0JLyogQUNMSzIwMCBMMjogMTYwTUh6ICovCi0JeyA0LCA3LCA1LCA3LCAxIH0sCi0KLQkvKiBBQ0xLMjAwIEwzOiAxMzMuM01IeiAqLwotCXsgNSwgNywgNywgNywgMSB9LAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBjbGtkaXZfbHJfYnVzW0NQVUZSRVFfTEVWRUxfRU5EXVsyXSA9IHsKLQkvKgotCSAqIENsb2NrIGRpdmlkZXIgdmFsdWUgZm9yIGZvbGxvd2luZwotCSAqIHsgRElWR0RML1IsIERJVkdQTC9SIH0KLQkgKi8KLQotCS8qIEFDTEtfR0RML1IgTDA6IDIwME1IeiAqLwotCXsgMywgMSB9LAotCi0JLyogQUNMS19HREwvUiBMMTogMjAwTUh6ICovCi0JeyAzLCAxIH0sCi0KLQkvKiBBQ0xLX0dETC9SIEwyOiAxNjBNSHogKi8KLQl7IDQsIDEgfSwKLQotCS8qIEFDTEtfR0RML1IgTDM6IDEzMy4zTUh6ICovCi0JeyA1LCAxIH0sCi19OwotCi1zdHJ1Y3QgY3B1ZnJlcV92b2x0YWdlX3RhYmxlIHsKLQl1bnNpZ25lZCBpbnQJaW5kZXg7CQkvKiBhbnkgKi8KLQl1bnNpZ25lZCBpbnQJYXJtX3ZvbHQ7CS8qIHVWICovCi0JdW5zaWduZWQgaW50CWludF92b2x0OwotfTsKLQotc3RhdGljIHN0cnVjdCBjcHVmcmVxX3ZvbHRhZ2VfdGFibGUgZXh5bm9zNF92b2x0X3RhYmxlW0NQVUZSRVFfTEVWRUxfRU5EXSA9IHsKLQl7Ci0JCS5pbmRleAkJPSBMMCwKLQkJLmFybV92b2x0CT0gMTIwMDAwMCwKLQkJLmludF92b2x0CT0gMTEwMDAwMCwKLQl9LCB7Ci0JCS5pbmRleAkJPSBMMSwKLQkJLmFybV92b2x0CT0gMTEwMDAwMCwKLQkJLmludF92b2x0CT0gMTEwMDAwMCwKLQl9LCB7Ci0JCS5pbmRleAkJPSBMMiwKLQkJLmFybV92b2x0CT0gMTAwMDAwMCwKLQkJLmludF92b2x0CT0gMTAwMDAwMCwKLQl9LCB7Ci0JCS5pbmRleAkJPSBMMywKLQkJLmFybV92b2x0CT0gOTAwMDAwLAotCQkuaW50X3ZvbHQJPSAxMDAwMDAwLAotCX0sCi19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGV4eW5vczRfYXBsbF9wbXNfdGFibGVbQ1BVRlJFUV9MRVZFTF9FTkRdID0gewotCS8qIEFQTEwgRk9VVCBMMDogMTAwME1IeiAqLwotCSgoMjUwIDw8IDE2KSB8ICg2IDw8IDgpIHwgMSksCi0KLQkvKiBBUExMIEZPVVQgTDE6IDgwME1IeiAqLwotCSgoMjAwIDw8IDE2KSB8ICg2IDw8IDgpIHwgMSksCi0KLQkvKiBBUExMIEZPVVQgTDIgOiA0MDBNSHogKi8KLQkoKDIwMCA8PCAxNikgfCAoNiA8PCA4KSB8IDIpLAotCi0JLyogQVBMTCBGT1VUIEwzOiAxMDBNSHogKi8KLQkoKDIwMCA8PCAxNikgfCAoNiA8PCA4KSB8IDQpLAotfTsKLQotaW50IGV4eW5vczRfdmVyaWZ5X3NwZWVkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQotewotCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCBleHlub3M0X2ZyZXFfdGFibGUpOwotfQotCi11bnNpZ25lZCBpbnQgZXh5bm9zNF9nZXRzcGVlZCh1bnNpZ25lZCBpbnQgY3B1KQotewotCXJldHVybiBjbGtfZ2V0X3JhdGUoY3B1X2NsaykgLyAxMDAwOwotfQotCi12b2lkIGV4eW5vczRfc2V0X2Nsa2Rpdih1bnNpZ25lZCBpbnQgZGl2X2luZGV4KQotewotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQkvKiBDaGFuZ2UgRGl2aWRlciAtIENQVTAgKi8KLQotCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9DTEtESVZfQ1BVKTsKLQotCXRtcCAmPSB+KFM1UF9DTEtESVZfQ1BVMF9DT1JFX01BU0sgfCBTNVBfQ0xLRElWX0NQVTBfQ09SRU0wX01BU0sgfAotCQlTNVBfQ0xLRElWX0NQVTBfQ09SRU0xX01BU0sgfCBTNVBfQ0xLRElWX0NQVTBfUEVSSVBIX01BU0sgfAotCQlTNVBfQ0xLRElWX0NQVTBfQVRCX01BU0sgfCBTNVBfQ0xLRElWX0NQVTBfUENMS0RCR19NQVNLIHwKLQkJUzVQX0NMS0RJVl9DUFUwX0FQTExfTUFTSyk7Ci0KLQl0bXAgfD0gKChjbGtkaXZfY3B1MFtkaXZfaW5kZXhdWzBdIDw8IFM1UF9DTEtESVZfQ1BVMF9DT1JFX1NISUZUKSB8Ci0JCShjbGtkaXZfY3B1MFtkaXZfaW5kZXhdWzFdIDw8IFM1UF9DTEtESVZfQ1BVMF9DT1JFTTBfU0hJRlQpIHwKLQkJKGNsa2Rpdl9jcHUwW2Rpdl9pbmRleF1bMl0gPDwgUzVQX0NMS0RJVl9DUFUwX0NPUkVNMV9TSElGVCkgfAotCQkoY2xrZGl2X2NwdTBbZGl2X2luZGV4XVszXSA8PCBTNVBfQ0xLRElWX0NQVTBfUEVSSVBIX1NISUZUKSB8Ci0JCShjbGtkaXZfY3B1MFtkaXZfaW5kZXhdWzRdIDw8IFM1UF9DTEtESVZfQ1BVMF9BVEJfU0hJRlQpIHwKLQkJKGNsa2Rpdl9jcHUwW2Rpdl9pbmRleF1bNV0gPDwgUzVQX0NMS0RJVl9DUFUwX1BDTEtEQkdfU0hJRlQpIHwKLQkJKGNsa2Rpdl9jcHUwW2Rpdl9pbmRleF1bNl0gPDwgUzVQX0NMS0RJVl9DUFUwX0FQTExfU0hJRlQpKTsKLQotCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9DTEtESVZfQ1BVKTsKLQotCWRvIHsKLQkJdG1wID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9TVEFUQ1BVKTsKLQl9IHdoaWxlICh0bXAgJiAweDExMTExMTEpOwotCi0JLyogQ2hhbmdlIERpdmlkZXIgLSBDUFUxICovCi0KLQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0xLRElWX0NQVTEpOwotCi0JdG1wICY9IH4oKDB4NyA8PCA0KSB8IDB4Nyk7Ci0KLQl0bXAgfD0gKChjbGtkaXZfY3B1MVtkaXZfaW5kZXhdWzBdIDw8IDQpIHwKLQkJKGNsa2Rpdl9jcHUxW2Rpdl9pbmRleF1bMV0gPDwgMCkpOwotCi0JX19yYXdfd3JpdGVsKHRtcCwgUzVQX0NMS0RJVl9DUFUxKTsKLQotCWRvIHsKLQkJdG1wID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9TVEFUQ1BVMSk7Ci0JfSB3aGlsZSAodG1wICYgMHgxMSk7Ci0KLQkvKiBDaGFuZ2UgRGl2aWRlciAtIERNQzAgKi8KLQotCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9DTEtESVZfRE1DMCk7Ci0KLQl0bXAgJj0gfihTNVBfQ0xLRElWX0RNQzBfQUNQX01BU0sgfCBTNVBfQ0xLRElWX0RNQzBfQUNQUENMS19NQVNLIHwKLQkJUzVQX0NMS0RJVl9ETUMwX0RQSFlfTUFTSyB8IFM1UF9DTEtESVZfRE1DMF9ETUNfTUFTSyB8Ci0JCVM1UF9DTEtESVZfRE1DMF9ETUNEX01BU0sgfCBTNVBfQ0xLRElWX0RNQzBfRE1DUF9NQVNLIHwKLQkJUzVQX0NMS0RJVl9ETUMwX0NPUFkyX01BU0sgfCBTNVBfQ0xLRElWX0RNQzBfQ09SRVRJX01BU0spOwotCi0JdG1wIHw9ICgoY2xrZGl2X2RtYzBbZGl2X2luZGV4XVswXSA8PCBTNVBfQ0xLRElWX0RNQzBfQUNQX1NISUZUKSB8Ci0JCShjbGtkaXZfZG1jMFtkaXZfaW5kZXhdWzFdIDw8IFM1UF9DTEtESVZfRE1DMF9BQ1BQQ0xLX1NISUZUKSB8Ci0JCShjbGtkaXZfZG1jMFtkaXZfaW5kZXhdWzJdIDw8IFM1UF9DTEtESVZfRE1DMF9EUEhZX1NISUZUKSB8Ci0JCShjbGtkaXZfZG1jMFtkaXZfaW5kZXhdWzNdIDw8IFM1UF9DTEtESVZfRE1DMF9ETUNfU0hJRlQpIHwKLQkJKGNsa2Rpdl9kbWMwW2Rpdl9pbmRleF1bNF0gPDwgUzVQX0NMS0RJVl9ETUMwX0RNQ0RfU0hJRlQpIHwKLQkJKGNsa2Rpdl9kbWMwW2Rpdl9pbmRleF1bNV0gPDwgUzVQX0NMS0RJVl9ETUMwX0RNQ1BfU0hJRlQpIHwKLQkJKGNsa2Rpdl9kbWMwW2Rpdl9pbmRleF1bNl0gPDwgUzVQX0NMS0RJVl9ETUMwX0NPUFkyX1NISUZUKSB8Ci0JCShjbGtkaXZfZG1jMFtkaXZfaW5kZXhdWzddIDw8IFM1UF9DTEtESVZfRE1DMF9DT1JFVElfU0hJRlQpKTsKLQotCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9DTEtESVZfRE1DMCk7Ci0KLQlkbyB7Ci0JCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9DTEtESVZfU1RBVF9ETUMwKTsKLQl9IHdoaWxlICh0bXAgJiAweDExMTExMTExKTsKLQotCS8qIENoYW5nZSBEaXZpZGVyIC0gVE9QICovCi0KLQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0xLRElWX1RPUCk7Ci0KLQl0bXAgJj0gfihTNVBfQ0xLRElWX1RPUF9BQ0xLMjAwX01BU0sgfCBTNVBfQ0xLRElWX1RPUF9BQ0xLMTAwX01BU0sgfAotCQlTNVBfQ0xLRElWX1RPUF9BQ0xLMTYwX01BU0sgfCBTNVBfQ0xLRElWX1RPUF9BQ0xLMTMzX01BU0sgfAotCQlTNVBfQ0xLRElWX1RPUF9PTkVOQU5EX01BU0spOwotCi0JdG1wIHw9ICgoY2xrZGl2X3RvcFtkaXZfaW5kZXhdWzBdIDw8IFM1UF9DTEtESVZfVE9QX0FDTEsyMDBfU0hJRlQpIHwKLQkJKGNsa2Rpdl90b3BbZGl2X2luZGV4XVsxXSA8PCBTNVBfQ0xLRElWX1RPUF9BQ0xLMTAwX1NISUZUKSB8Ci0JCShjbGtkaXZfdG9wW2Rpdl9pbmRleF1bMl0gPDwgUzVQX0NMS0RJVl9UT1BfQUNMSzE2MF9TSElGVCkgfAotCQkoY2xrZGl2X3RvcFtkaXZfaW5kZXhdWzNdIDw8IFM1UF9DTEtESVZfVE9QX0FDTEsxMzNfU0hJRlQpIHwKLQkJKGNsa2Rpdl90b3BbZGl2X2luZGV4XVs0XSA8PCBTNVBfQ0xLRElWX1RPUF9PTkVOQU5EX1NISUZUKSk7Ci0KLQlfX3Jhd193cml0ZWwodG1wLCBTNVBfQ0xLRElWX1RPUCk7Ci0KLQlkbyB7Ci0JCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9DTEtESVZfU1RBVF9UT1ApOwotCX0gd2hpbGUgKHRtcCAmIDB4MTExMTEpOwotCi0JLyogQ2hhbmdlIERpdmlkZXIgLSBMRUZUQlVTICovCi0KLQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0xLRElWX0xFRlRCVVMpOwotCi0JdG1wICY9IH4oUzVQX0NMS0RJVl9CVVNfR0RMUl9NQVNLIHwgUzVQX0NMS0RJVl9CVVNfR1BMUl9NQVNLKTsKLQotCXRtcCB8PSAoKGNsa2Rpdl9scl9idXNbZGl2X2luZGV4XVswXSA8PCBTNVBfQ0xLRElWX0JVU19HRExSX1NISUZUKSB8Ci0JCShjbGtkaXZfbHJfYnVzW2Rpdl9pbmRleF1bMV0gPDwgUzVQX0NMS0RJVl9CVVNfR1BMUl9TSElGVCkpOwotCi0JX19yYXdfd3JpdGVsKHRtcCwgUzVQX0NMS0RJVl9MRUZUQlVTKTsKLQotCWRvIHsKLQkJdG1wID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9TVEFUX0xFRlRCVVMpOwotCX0gd2hpbGUgKHRtcCAmIDB4MTEpOwotCi0JLyogQ2hhbmdlIERpdmlkZXIgLSBSSUdIVEJVUyAqLwotCi0JdG1wID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9SSUdIVEJVUyk7Ci0KLQl0bXAgJj0gfihTNVBfQ0xLRElWX0JVU19HRExSX01BU0sgfCBTNVBfQ0xLRElWX0JVU19HUExSX01BU0spOwotCi0JdG1wIHw9ICgoY2xrZGl2X2xyX2J1c1tkaXZfaW5kZXhdWzBdIDw8IFM1UF9DTEtESVZfQlVTX0dETFJfU0hJRlQpIHwKLQkJKGNsa2Rpdl9scl9idXNbZGl2X2luZGV4XVsxXSA8PCBTNVBfQ0xLRElWX0JVU19HUExSX1NISUZUKSk7Ci0KLQlfX3Jhd193cml0ZWwodG1wLCBTNVBfQ0xLRElWX1JJR0hUQlVTKTsKLQotCWRvIHsKLQkJdG1wID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9TVEFUX1JJR0hUQlVTKTsKLQl9IHdoaWxlICh0bXAgJiAweDExKTsKLX0KLQotc3RhdGljIHZvaWQgZXh5bm9zNF9zZXRfYXBsbCh1bnNpZ25lZCBpbnQgaW5kZXgpCi17Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCS8qIDEuIE1VWF9DT1JFX1NFTCA9IE1QTEwsIEFSTUNMSyB1c2VzIE1QTEwgZm9yIGxvY2sgdGltZSAqLwotCWNsa19zZXRfcGFyZW50KG1vdXRjb3JlLCBtb3V0X21wbGwpOwotCi0JZG8gewotCQl0bXAgPSAoX19yYXdfcmVhZGwoUzVQX0NMS01VWF9TVEFUQ1BVKQotCQkJPj4gUzVQX0NMS1NSQ19DUFVfTVVYQ09SRV9TSElGVCk7Ci0JCXRtcCAmPSAweDc7Ci0JfSB3aGlsZSAodG1wICE9IDB4Mik7Ci0KLQkvKiAyLiBTZXQgQVBMTCBMb2NrIHRpbWUgKi8KLQlfX3Jhd193cml0ZWwoUzVQX0FQTExfTE9DS1RJTUUsIFM1UF9BUExMX0xPQ0spOwotCi0JLyogMy4gQ2hhbmdlIFBMTCBQTVMgdmFsdWVzICovCi0JdG1wID0gX19yYXdfcmVhZGwoUzVQX0FQTExfQ09OMCk7Ci0JdG1wICY9IH4oKDB4M2ZmIDw8IDE2KSB8ICgweDNmIDw8IDgpIHwgKDB4NyA8PCAwKSk7Ci0JdG1wIHw9IGV4eW5vczRfYXBsbF9wbXNfdGFibGVbaW5kZXhdOwotCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9BUExMX0NPTjApOwotCi0JLyogNC4gd2FpdF9sb2NrX3RpbWUgKi8KLQlkbyB7Ci0JCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9BUExMX0NPTjApOwotCX0gd2hpbGUgKCEodG1wICYgKDB4MSA8PCBTNVBfQVBMTENPTjBfTE9DS0VEX1NISUZUKSkpOwotCi0JLyogNS4gTVVYX0NPUkVfU0VMID0gQVBMTCAqLwotCWNsa19zZXRfcGFyZW50KG1vdXRjb3JlLCBtb3V0X2FwbGwpOwotCi0JZG8gewotCQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0xLTVVYX1NUQVRDUFUpOwotCQl0bXAgJj0gUzVQX0NMS01VWF9TVEFUQ1BVX01VWENPUkVfTUFTSzsKLQl9IHdoaWxlICh0bXAgIT0gKDB4MSA8PCBTNVBfQ0xLU1JDX0NQVV9NVVhDT1JFX1NISUZUKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGV4eW5vczRfc2V0X2ZyZXF1ZW5jeSh1bnNpZ25lZCBpbnQgb2xkX2luZGV4LCB1bnNpZ25lZCBpbnQgbmV3X2luZGV4KQotewotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlpZiAob2xkX2luZGV4ID4gbmV3X2luZGV4KSB7Ci0JCS8qIFRoZSBmcmVxdWVuY3kgY2hhbmdpbmcgdG8gTDAgbmVlZHMgdG8gY2hhbmdlIGFwbGwgKi8KLQkJaWYgKGZyZXFzLm5ldyA9PSBleHlub3M0X2ZyZXFfdGFibGVbTDBdLmZyZXF1ZW5jeSkgewotCQkJLyogMS4gQ2hhbmdlIHRoZSBzeXN0ZW0gY2xvY2sgZGl2aWRlciB2YWx1ZXMgKi8KLQkJCWV4eW5vczRfc2V0X2Nsa2RpdihuZXdfaW5kZXgpOwotCi0JCQkvKiAyLiBDaGFuZ2UgdGhlIGFwbGwgbSxwLHMgdmFsdWUgKi8KLQkJCWV4eW5vczRfc2V0X2FwbGwobmV3X2luZGV4KTsKLQkJfSBlbHNlIHsKLQkJCS8qIDEuIENoYW5nZSB0aGUgc3lzdGVtIGNsb2NrIGRpdmlkZXIgdmFsdWVzICovCi0JCQlleHlub3M0X3NldF9jbGtkaXYobmV3X2luZGV4KTsKLQotCQkJLyogMi4gQ2hhbmdlIGp1c3QgcyB2YWx1ZSBpbiBhcGxsIG0scCxzIHZhbHVlICovCi0JCQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQVBMTF9DT04wKTsKLQkJCXRtcCAmPSB+KDB4NyA8PCAwKTsKLQkJCXRtcCB8PSAoZXh5bm9zNF9hcGxsX3Btc190YWJsZVtuZXdfaW5kZXhdICYgMHg3KTsKLQkJCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9BUExMX0NPTjApOwotCQl9Ci0JfQotCi0JZWxzZSBpZiAob2xkX2luZGV4IDwgbmV3X2luZGV4KSB7Ci0JCS8qIFRoZSBmcmVxdWVuY3kgY2hhbmdpbmcgZnJvbSBMMCBuZWVkcyB0byBjaGFuZ2UgYXBsbCAqLwotCQlpZiAoZnJlcXMub2xkID09IGV4eW5vczRfZnJlcV90YWJsZVtMMF0uZnJlcXVlbmN5KSB7Ci0JCQkvKiAxLiBDaGFuZ2UgdGhlIGFwbGwgbSxwLHMgdmFsdWUgKi8KLQkJCWV4eW5vczRfc2V0X2FwbGwobmV3X2luZGV4KTsKLQotCQkJLyogMi4gQ2hhbmdlIHRoZSBzeXN0ZW0gY2xvY2sgZGl2aWRlciB2YWx1ZXMgKi8KLQkJCWV4eW5vczRfc2V0X2Nsa2RpdihuZXdfaW5kZXgpOwotCQl9IGVsc2UgewotCQkJLyogMS4gQ2hhbmdlIGp1c3QgcyB2YWx1ZSBpbiBhcGxsIG0scCxzIHZhbHVlICovCi0JCQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQVBMTF9DT04wKTsKLQkJCXRtcCAmPSB+KDB4NyA8PCAwKTsKLQkJCXRtcCB8PSAoZXh5bm9zNF9hcGxsX3Btc190YWJsZVtuZXdfaW5kZXhdICYgMHg3KTsKLQkJCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9BUExMX0NPTjApOwotCi0JCQkvKiAyLiBDaGFuZ2UgdGhlIHN5c3RlbSBjbG9jayBkaXZpZGVyIHZhbHVlcyAqLwotCQkJZXh5bm9zNF9zZXRfY2xrZGl2KG5ld19pbmRleCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCi0JCQkgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKLQkJCSAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQotewotCXVuc2lnbmVkIGludCBpbmRleCwgb2xkX2luZGV4OwotCXVuc2lnbmVkIGludCBhcm1fdm9sdCwgaW50X3ZvbHQ7Ci0KLQlmcmVxcy5vbGQgPSBleHlub3M0X2dldHNwZWVkKHBvbGljeS0+Y3B1KTsKLQotCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBleHlub3M0X2ZyZXFfdGFibGUsCi0JCQkJCSAgIGZyZXFzLm9sZCwgcmVsYXRpb24sICZvbGRfaW5kZXgpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBleHlub3M0X2ZyZXFfdGFibGUsCi0JCQkJCSAgIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJmluZGV4KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmcmVxcy5uZXcgPSBleHlub3M0X2ZyZXFfdGFibGVbaW5kZXhdLmZyZXF1ZW5jeTsKLQlmcmVxcy5jcHUgPSBwb2xpY3ktPmNwdTsKLQotCWlmIChmcmVxcy5uZXcgPT0gZnJlcXMub2xkKQotCQlyZXR1cm4gMDsKLQotCS8qIGdldCB0aGUgdm9sdGFnZSB2YWx1ZSAqLwotCWFybV92b2x0ID0gZXh5bm9zNF92b2x0X3RhYmxlW2luZGV4XS5hcm1fdm9sdDsKLQlpbnRfdm9sdCA9IGV4eW5vczRfdm9sdF90YWJsZVtpbmRleF0uaW50X3ZvbHQ7Ci0KLQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOwotCi0JLyogY29udHJvbCByZWd1bGF0b3IgKi8KLQlpZiAoZnJlcXMubmV3ID4gZnJlcXMub2xkKSB7Ci0JCS8qIFZvbHRhZ2UgdXAgKi8KLQkJcmVndWxhdG9yX3NldF92b2x0YWdlKGFybV9yZWd1bGF0b3IsIGFybV92b2x0LCBhcm1fdm9sdCk7Ci0JCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShpbnRfcmVndWxhdG9yLCBpbnRfdm9sdCwgaW50X3ZvbHQpOwotCX0KLQotCS8qIENsb2NrIENvbmZpZ3VyYXRpb24gUHJvY2VkdXJlICovCi0JZXh5bm9zNF9zZXRfZnJlcXVlbmN5KG9sZF9pbmRleCwgaW5kZXgpOwotCi0JLyogY29udHJvbCByZWd1bGF0b3IgKi8KLQlpZiAoZnJlcXMubmV3IDwgZnJlcXMub2xkKSB7Ci0JCS8qIFZvbHRhZ2UgZG93biAqLwotCQlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UoYXJtX3JlZ3VsYXRvciwgYXJtX3ZvbHQsIGFybV92b2x0KTsKLQkJcmVndWxhdG9yX3NldF92b2x0YWdlKGludF9yZWd1bGF0b3IsIGludF92b2x0LCBpbnRfdm9sdCk7Ci0JfQotCi0JY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBleHlub3M0X2NwdWZyZXFfc3VzcGVuZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2NwdWZyZXFfcmVzdW1lKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQotewotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jcHVmcmVxX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQotewotCXBvbGljeS0+Y3VyID0gcG9saWN5LT5taW4gPSBwb2xpY3ktPm1heCA9IGV4eW5vczRfZ2V0c3BlZWQocG9saWN5LT5jcHUpOwotCi0JY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoZXh5bm9zNF9mcmVxX3RhYmxlLCBwb2xpY3ktPmNwdSk7Ci0KLQkvKiBzZXQgdGhlIHRyYW5zaXRpb24gbGF0ZW5jeSB2YWx1ZSAqLwotCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAxMDAwMDA7Ci0KLQkvKgotCSAqIEVYWU5PUzQgbXVsdGktY29yZSBwcm9jZXNzb3JzIGhhcyAyIGNvcmVzCi0JICogdGhhdCB0aGUgZnJlcXVlbmN5IGNhbm5vdCBiZSBzZXQgaW5kZXBlbmRlbnRseS4KLQkgKiBFYWNoIGNwdSBpcyBib3VuZCB0byB0aGUgc2FtZSBzcGVlZC4KLQkgKiBTbyB0aGUgYWZmZWN0ZWQgY3B1IGlzIGFsbCBvZiB0aGUgY3B1cy4KLQkgKi8KLQljcHVtYXNrX3NldGFsbChwb2xpY3ktPmNwdXMpOwotCi0JcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBleHlub3M0X2ZyZXFfdGFibGUpOwotfQotCi1zdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGV4eW5vczRfZHJpdmVyID0gewotCS5mbGFncwkJPSBDUFVGUkVRX1NUSUNLWSwKLQkudmVyaWZ5CQk9IGV4eW5vczRfdmVyaWZ5X3NwZWVkLAotCS50YXJnZXQJCT0gZXh5bm9zNF90YXJnZXQsCi0JLmdldAkJPSBleHlub3M0X2dldHNwZWVkLAotCS5pbml0CQk9IGV4eW5vczRfY3B1ZnJlcV9jcHVfaW5pdCwKLQkubmFtZQkJPSAiZXh5bm9zNF9jcHVmcmVxIiwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZAk9IGV4eW5vczRfY3B1ZnJlcV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gZXh5bm9zNF9jcHVmcmVxX3Jlc3VtZSwKLSNlbmRpZgotfTsKLQotc3RhdGljIGludCBfX2luaXQgZXh5bm9zNF9jcHVmcmVxX2luaXQodm9pZCkKLXsKLQljcHVfY2xrID0gY2xrX2dldChOVUxMLCAiYXJtY2xrIik7Ci0JaWYgKElTX0VSUihjcHVfY2xrKSkKLQkJcmV0dXJuIFBUUl9FUlIoY3B1X2Nsayk7Ci0KLQltb3V0Y29yZSA9IGNsa19nZXQoTlVMTCwgIm1vdXRjb3JlIik7Ci0JaWYgKElTX0VSUihtb3V0Y29yZSkpCi0JCWdvdG8gb3V0OwotCi0JbW91dF9tcGxsID0gY2xrX2dldChOVUxMLCAibW91dF9tcGxsIik7Ci0JaWYgKElTX0VSUihtb3V0X21wbGwpKQotCQlnb3RvIG91dDsKLQotCW1vdXRfYXBsbCA9IGNsa19nZXQoTlVMTCwgIm1vdXRfYXBsbCIpOwotCWlmIChJU19FUlIobW91dF9hcGxsKSkKLQkJZ290byBvdXQ7Ci0KLQlhcm1fcmVndWxhdG9yID0gcmVndWxhdG9yX2dldChOVUxMLCAidmRkX2FybSIpOwotCWlmIChJU19FUlIoYXJtX3JlZ3VsYXRvcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gZ2V0IHJlc291cmNlICVzXG4iLCAidmRkX2FybSIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpbnRfcmVndWxhdG9yID0gcmVndWxhdG9yX2dldChOVUxMLCAidmRkX2ludCIpOwotCWlmIChJU19FUlIoaW50X3JlZ3VsYXRvcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gZ2V0IHJlc291cmNlICVzXG4iLCAidmRkX2ludCIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIERSQU0gdHlwZS4KLQkgKiBCZWNhdXNlIERWRlMgbGV2ZWwgaXMgZGlmZmVyZW50IGFjY29yZGluZyB0byBEUkFNIHR5cGUuCi0JICovCi0JbWVtdHlwZSA9IF9fcmF3X3JlYWRsKFM1UF9WQV9ETUMwICsgUzVQX0RNQzBfTUVNQ09OX09GRlNFVCk7Ci0JbWVtdHlwZSA9IChtZW10eXBlID4+IFM1UF9ETUMwX01FTVRZUEVfU0hJRlQpOwotCW1lbXR5cGUgJj0gUzVQX0RNQzBfTUVNVFlQRV9NQVNLOwotCi0JaWYgKChtZW10eXBlIDwgRERSMikgJiYgKG1lbXR5cGUgPiBERFIzKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB3cm9uZyBtZW10eXBlPSAweCV4XG4iLCBfX2Z1bmNfXywgbWVtdHlwZSk7Ci0JCWdvdG8gb3V0OwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogbWVtdHlwZT0gMHgleFxuIiwgX19mdW5jX18sIG1lbXR5cGUpOwotCX0KLQotCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmZXh5bm9zNF9kcml2ZXIpOwotCi1vdXQ6Ci0JaWYgKCFJU19FUlIoY3B1X2NsaykpCi0JCWNsa19wdXQoY3B1X2Nsayk7Ci0KLQlpZiAoIUlTX0VSUihtb3V0Y29yZSkpCi0JCWNsa19wdXQobW91dGNvcmUpOwotCi0JaWYgKCFJU19FUlIobW91dF9tcGxsKSkKLQkJY2xrX3B1dChtb3V0X21wbGwpOwotCi0JaWYgKCFJU19FUlIobW91dF9hcGxsKSkKLQkJY2xrX3B1dChtb3V0X2FwbGwpOwotCi0JaWYgKCFJU19FUlIoYXJtX3JlZ3VsYXRvcikpCi0JCXJlZ3VsYXRvcl9wdXQoYXJtX3JlZ3VsYXRvcik7Ci0KLQlpZiAoIUlTX0VSUihpbnRfcmVndWxhdG9yKSkKLQkJcmVndWxhdG9yX3B1dChpbnRfcmVndWxhdG9yKTsKLQotCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCBpbml0aWFsaXphdGlvblxuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci1sYXRlX2luaXRjYWxsKGV4eW5vczRfY3B1ZnJlcV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtYXVkaW8uYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtYXVkaW8uYwppbmRleCAxZWVkNWY5Li45ODMwNjlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LWF1ZGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1hdWRpby5jCkBAIC0zMzAsNyArMzMwLDcgQEAKIAogc3RhdGljIGludCBleHlub3M0X3NwZGlmX2NmZ19ncGlvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JczNjX2dwaW9fY2ZncGluX3JhbmdlKEVYWU5PUzRfR1BDMSgwKSwgMiwgUzNDX0dQSU9fU0ZOKDMpKTsKKwlzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UoRVhZTk9TNF9HUEMxKDApLCAyLCBTM0NfR1BJT19TRk4oNCkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaGVhZHNtcC5TIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2hlYWRzbXAuUwppbmRleCA2YzZjZmM1Li4zY2RlYjM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaGVhZHNtcC5TCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9oZWFkc21wLlMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCi0JX19JTklUCisJX19DUFVJTklUCiAKIC8qCiAgKiBleHlub3M0IHNwZWNpZmljIGVudHJ5IHBvaW50IGZvciBzZWNvbmRhcnkgQ1BVcy4gIFRoaXMgcHJvdmlkZXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmZhODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX01BQ0hfQ0xLREVWX0hfXworI2RlZmluZSBfX01BQ0hfQ0xLREVWX0hfXworCisjZGVmaW5lIF9fY2xrX2dldChjbGspICh7IDE7IH0pCisjZGVmaW5lIF9fY2xrX3B1dChjbGspIGRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy11c2ItcGh5LmggYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtdXNiLXBoeS5oCmluZGV4IDcwMzExOGQuLmMzMzdjZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy11c2ItcGh5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLXVzYi1waHkuaApAQCAtMTEsNyArMTEsNyBAQAogI2lmbmRlZiBfX1BMQVRfUzVQX1JFR1NfVVNCX1BIWV9ICiAjZGVmaW5lIF9fUExBVF9TNVBfUkVHU19VU0JfUEhZX0gKIAotI2RlZmluZSBFWFlOT1M0X0hTT1RHX1BIWVJFRyh4KQkJKCh4KSArIFM1UF9WQV9VU0JfSFNQSFkpCisjZGVmaW5lIEVYWU5PUzRfSFNPVEdfUEhZUkVHKHgpCQkoKHgpICsgUzNDX1ZBX1VTQl9IU1BIWSkKIAogI2RlZmluZSBFWFlOT1M0X1BIWVBXUgkJCUVYWU5PUzRfSFNPVEdfUEhZUkVHKDB4MDApCiAjZGVmaW5lIFBIWTFfSFNJQ19OT1JNQUxfTUFTSwkJKDB4ZiA8PCA5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luaXQuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbml0LmMKaW5kZXggY2Y5MWY1MC4uYThhODNlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luaXQuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5pdC5jCkBAIC0zNSw2ICszNSw3IEBACiAJCQl0Y2ZnLT5jbG9ja3MgPSBleHlub3M0X3NlcmlhbF9jbG9ja3M7CiAJCQl0Y2ZnLT5jbG9ja3Nfc2l6ZSA9IEFSUkFZX1NJWkUoZXh5bm9zNF9zZXJpYWxfY2xvY2tzKTsKIAkJfQorCQl0Y2ZnLT5mbGFncyB8PSBOT19ORUVEX0NIRUNLX0NMS1NSQzsKIAl9CiAKIAlzM2MyNHh4X2luaXRfdWFydGRldnMoInM1cHYyMTAtdWFydCIsIHM1cF91YXJ0X3Jlc291cmNlcywgY2ZnLCBubyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1zbWRrYzIxMC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka2MyMTAuYwppbmRleCBlNjQ1ZjdhLi5mNjA2ZWE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1zbWRrYzIxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGtjMjEwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0yNyw2ICsyOCw4IEBACiAjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgogI2luY2x1ZGUgPHBsYXQvaWljLmg+CiAjaW5jbHVkZSA8cGxhdC9wZC5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L2JhY2tsaWdodC5oPgogCiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KIApAQCAtMTkxLDYgKzE5NCwxNyBAQAogCQkgICAgICgweDEgPDwgUzVQX1NST01fQkNYX19UQUNTX19TSElGVCksIFM1UF9TUk9NX0JDMSk7CiB9CiAKKy8qIExDRCBCYWNrbGlnaHQgZGF0YSAqLworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2JsX2dwaW9faW5mbyBzbWRrYzIxMF9ibF9ncGlvX2luZm8gPSB7CisJLm5vID0gRVhZTk9TNF9HUEQwKDEpLAorCS5mdW5jID0gUzNDX0dQSU9fU0ZOKDIpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEgc21ka2MyMTBfYmxfZGF0YSA9IHsKKwkucHdtX2lkID0gMSwKKwkucHdtX3BlcmlvZF9ucyAgPSAxMDAwLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IHNtZGtjMjEwX21hcF9pbyh2b2lkKQogewogCXM1cF9pbml0X2lvKE5VTEwsIDAsIFM1UF9WQV9DSElQSUQpOwpAQCAtMjEwLDYgKzIyNCw4IEBACiAJczNjX3NkaGNpMl9zZXRfcGxhdGRhdGEoJnNtZGtjMjEwX2hzbW1jMl9wZGF0YSk7CiAJczNjX3NkaGNpM19zZXRfcGxhdGRhdGEoJnNtZGtjMjEwX2hzbW1jM19wZGF0YSk7CiAKKwlzYW1zdW5nX2JsX3NldCgmc21ka2MyMTBfYmxfZ3Bpb19pbmZvLCAmc21ka2MyMTBfYmxfZGF0YSk7CisKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWRrYzIxMF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNtZGtjMjEwX2RldmljZXMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka3YzMTAuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGt2MzEwLmMKaW5kZXggMTUyNjc2NC4uZGYxMTA3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka3YzMTAuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1zbWRrdjMxMC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtMjksNiArMzAsOCBAQAogI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KICNpbmNsdWRlIDxwbGF0L2lpYy5oPgogI2luY2x1ZGUgPHBsYXQvcGQuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CisjaW5jbHVkZSA8cGxhdC9iYWNrbGlnaHQuaD4KIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKQEAgLTc4LDkgKzgxLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGt2MzEwX2hzbW1jMF9wZGF0YSBfX2luaXRkYXRhID0gewotCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9HUElPLAotCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQSzAoMiksCi0JLmV4dF9jZF9ncGlvX2ludmVydAk9IDEsCisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0lOVEVSTkFMLAogCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKICNpZmRlZiBDT05GSUdfRVhZTk9TNF9TREhDSV9DSDBfOEJJVAogCS5tYXhfd2lkdGgJCT0gOCwKQEAgLTk2LDkgKzk3LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGt2MzEwX2hzbW1jMl9wZGF0YSBfX2luaXRkYXRhID0gewotCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9HUElPLAotCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQSzIoMiksCi0JLmV4dF9jZF9ncGlvX2ludmVydAk9IDEsCisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0lOVEVSTkFMLAogCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKICNpZmRlZiBDT05GSUdfRVhZTk9TNF9TREhDSV9DSDJfOEJJVAogCS5tYXhfd2lkdGgJCT0gOCwKQEAgLTIxMyw2ICsyMTIsMTcgQEAKIAkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVEFDU19fU0hJRlQpLCBTNVBfU1JPTV9CQzEpOwogfQogCisvKiBMQ0QgQmFja2xpZ2h0IGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21ka3YzMTBfYmxfZ3Bpb19pbmZvID0geworCS5ubyA9IEVYWU5PUzRfR1BEMCgxKSwKKwkuZnVuYyA9IFMzQ19HUElPX1NGTigyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHNtZGt2MzEwX2JsX2RhdGEgPSB7CisJLnB3bV9pZCA9IDEsCisJLnB3bV9wZXJpb2RfbnMgID0gMTAwMCwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzbWRrdjMxMF9tYXBfaW8odm9pZCkKIHsKIAlzNXBfaW5pdF9pbyhOVUxMLCAwLCBTNVBfVkFfQ0hJUElEKTsKQEAgLTIzNCw2ICsyNDQsOCBAQAogCiAJc2Ftc3VuZ19rZXlwYWRfc2V0X3BsYXRkYXRhKCZzbWRrdjMxMF9rZXlwYWRfZGF0YSk7CiAKKwlzYW1zdW5nX2JsX3NldCgmc21ka3YzMTBfYmxfZ3Bpb19pbmZvLCAmc21ka3YzMTBfYmxfZGF0YSk7CisKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWRrdjMxMF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNtZGt2MzEwX2RldmljZXMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BsYXRzbXAuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbGF0c21wLmMKaW5kZXggYzVlNjVhMC4uYjY4ZDViZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BsYXRzbXAuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvcGxhdHNtcC5jCkBAIC0xNTQsMTQgKzE1NCw2IEBACiAKIHZvaWQgX19pbml0IHBsYXRmb3JtX3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQogewotCWludCBpOwotCi0JLyoKLQkgKiBJbml0aWFsaXNlIHRoZSBwcmVzZW50IG1hcCwgd2hpY2ggZGVzY3JpYmVzIHRoZSBzZXQgb2YgQ1BVcwotCSAqIGFjdHVhbGx5IHBvcHVsYXRlZCBhdCB0aGUgcHJlc2VudCB0aW1lLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBtYXhfY3B1czsgaSsrKQotCQlzZXRfY3B1X3ByZXNlbnQoaSwgdHJ1ZSk7CiAKIAlzY3VfZW5hYmxlKHNjdV9iYXNlX2FkZHIoKSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BtLmMKaW5kZXggODc1NWNhOC4uNTMzYzI4ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BtLmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCVNBVkVfSVRFTShTNVBfVkFfTDJDQyArIEwyWDBfQVVYX0NUUkwpLAogfTsKIAotdm9pZCBleHlub3M0X2NwdV9zdXNwZW5kKHZvaWQpCitzdGF0aWMgaW50IGV4eW5vczRfY3B1X3N1c3BlbmQodW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJdW5zaWduZWQgbG9uZyBtYXNrID0gMHhGRkZGRkZGRjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC91c2ItcGh5LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtdXNiLXBoeS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvdXNiLXBoeS5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtdXNiLXBoeS5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2xlZXAuUyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zbGVlcC5TCmluZGV4IDZiNjI0MjUuLjA5ODQwNzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zbGVlcC5TCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zbGVlcC5TCkBAIC0zMywyOCArMzMsNiBAQAogCS50ZXh0CiAKIAkvKgotCSAqIHMzY19jcHVfc2F2ZQotCSAqCi0JICogZW50cnk6Ci0JICoJcjEgPSB2OnAgb2Zmc2V0Ci0JICovCi0KLUVOVFJZKHMzY19jcHVfc2F2ZSkKLQotCXN0bWZkCXNwISwgeyByMyAtIHIxMiwgbHIgfQotCWxkcglyMywgPXJlc3VtZV93aXRoX21tdQotCWJsCWNwdV9zdXNwZW5kCi0KLQlsZHIJcjAsID1wbV9jcHVfc2xlZXAKLQlsZHIJcjAsIFsgcjAgXQotCW1vdglwYywgcjAKLQotcmVzdW1lX3dpdGhfbW11OgotCWxkbWZkCXNwISwgeyByMyAtIHIxMiwgcGMgfQotCi0JLmx0b3JnCi0KLQkvKgogCSAqIHNsZWVwIG1hZ2ljLCB0byBhbGxvdyB0aGUgYm9vdGxvYWRlciB0byBjaGVjayBmb3IgYW4gdmFsaWQKIAkgKiBpbWFnZSB0byByZXN1bWUgdG8uIE11c3QgYmUgdGhlIGZpcnN0IHdvcmQgYmVmb3JlIHRoZQogCSAqIHMzY19jcHVfcmVzdW1lIGVudHJ5LgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC90aW1lLmMKaW5kZXggODZiOWZhMC4uZWJiOGYzOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvdGltZS5jCkBAIC0yMDYsNiArMjA2LDcgQEAKIAlyZXR1cm4gKGN5Y2xlX3QpIH5fX3Jhd19yZWFkbChTM0NfVElNRVJSRUcoMHg0MCkpOwogfQogCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgdm9pZCBleHlub3M0X3B3bTRfcmVzdW1lKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCiB7CiAJdW5zaWduZWQgbG9uZyBwY2xrOwpAQCAtMjE4LDYgKzIxOSw3IEBACiAJZXh5bm9zNF9wd21faW5pdCg0LCB+MCk7CiAJZXh5bm9zNF9wd21fc3RhcnQoNCwgMSk7CiB9CisjZW5kaWYKIAogc3RydWN0IGNsb2Nrc291cmNlIHB3bV9jbG9ja3NvdXJjZSA9IHsKIAkubmFtZQkJPSAicHdtX3RpbWVyNCIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9LY29uZmlnCmluZGV4IDQ2YWRjYTAuLmRjMjZmZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9LY29uZmlnCkBAIC01LDYgKzUsNyBAQAogY29uZmlnIEFSQ0hfQ0FUUwogCWJvb2wgIkNBVFMiCiAJc2VsZWN0IENMS1NSQ19JODI1MworCXNlbGVjdCBDTEtFVlRfSTgyNTMKIAlzZWxlY3QgRk9PVEJSSURHRV9IT1NUCiAJc2VsZWN0IElTQQogCXNlbGVjdCBJU0FfRE1BCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS10aW1lci5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUtdGltZXIuYwppbmRleCA1ZjFmOTg2Li4xMjFhZDFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS10aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LXRpbWVyLmMKQEAgLTEwMyw2ICsxMDMsNyBAQAogCWNsb2NrZXZlbnRzX2NhbGNfbXVsdF9zaGlmdChjZSwgbWVtX2ZjbGtfMjEyODUsIDUpOwogCWNlLT5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZmZmZmZmLCBjZSk7CiAJY2UtPm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHgwMDAwMDQsIGNlKTsKKwljZS0+Y3B1bWFzayA9IGNwdW1hc2tfb2Yoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAogCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShjZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggMzBiOTcxZC4uMWJlMmVlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWJ1Zy04MjUwLlM+CiAKICNlbHNlCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCS8qIEZvciBFQlNBMjg1IGRlYnVnZ2luZyAqLwogCQkuZXF1CWRjMjEyODVfaGlnaCwgQVJNQ1NSX0JBU0UgJiAweGZmMDAwMDAwCiAJCS5lcXUJZGMyMTI4NV9sb3csICBBUk1DU1JfQkFTRSAmIDB4MDBmZmZmZmYKQEAgLTM2LDggKzM3LDggQEAKIAkJLmVsc2UKIAkJbW92CVxycCwgIzAKIAkJLmVuZGlmCi0JCW9ycglccnYsIFxycCwgIzB4NDIwMDAwMDAKLQkJb3JyCVxycCwgXHJwLCAjZGMyMTI4NV9oaWdoCisJCW9ycglccnYsIFxycCwgI2RjMjEyODVfaGlnaAorCQlvcnIJXHJwLCBccnAsICMweDQyMDAwMDAwCiAJCS5lbmRtCiAKIAkJLm1hY3JvCXNlbmR1YXJ0LHJkLHJ4CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLXRpbWVyLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLXRpbWVyLmMKaW5kZXggNzAyMGYxYS4uYzQwYmI0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS10aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtdGltZXIuYwpAQCAtNSw2NCArNSwxOCBAQAogICogIENvcHlyaWdodCAoQykgMTk5OCBQaGlsIEJsdW5kZWxsCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pODI1My5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaTgyNTMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKICNpbmNsdWRlICJjb21tb24uaCIKIAotREVGSU5FX1JBV19TUElOTE9DSyhpODI1M19sb2NrKTsKLQotc3RhdGljIHZvaWQgcGl0X3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6Ci0JCW91dGJfcCgweDM0LCBQSVRfTU9ERSk7Ci0JCW91dGJfcChQSVRfTEFUQ0ggJiAweGZmLCBQSVRfQ0gwKTsKLQkJb3V0Yl9wKFBJVF9MQVRDSCA+PiA4LCBQSVRfQ0gwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgotCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgotCQlvdXRiX3AoMHgzMCwgUElUX01PREUpOwotCQlvdXRiX3AoMCwgUElUX0NIMCk7Ci0JCW91dGJfcCgwLCBQSVRfQ0gwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENMT0NLX0VWVF9NT0RFX09ORVNIT1Q6Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9SRVNVTUU6Ci0JCWJyZWFrOwotCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgcGl0X3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsCi0Jc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBwaXRfY2UgPSB7Ci0JLm5hbWUJCT0gInBpdCIsCi0JLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMsCi0JLnNldF9tb2RlCT0gcGl0X3NldF9tb2RlLAotCS5zZXRfbmV4dF9ldmVudAk9IHBpdF9zZXRfbmV4dF9ldmVudCwKLQkuc2hpZnQJCT0gMzIsCi19OwotCiBzdGF0aWMgaXJxcmV0dXJuX3QgcGl0X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2UgPSBkZXZfaWQ7CkBAIC03NCwyMCArMjgsMTUgQEAKIAkubmFtZQkJPSAicGl0IiwKIAkuaGFuZGxlcgk9IHBpdF90aW1lcl9pbnRlcnJ1cHQsCiAJLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMLAotCS5kZXZfaWQJCT0gJnBpdF9jZSwKKwkuZGV2X2lkCQk9ICZpODI1M19jbG9ja2V2ZW50LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGlzYV90aW1lcl9pbml0KHZvaWQpCiB7Ci0JcGl0X2NlLmNwdW1hc2sgPSBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JcGl0X2NlLm11bHQgPSBkaXZfc2MoUElUX1RJQ0tfUkFURSwgTlNFQ19QRVJfU0VDLCBwaXRfY2Uuc2hpZnQpOwotCXBpdF9jZS5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4N2ZmZiwgJnBpdF9jZSk7Ci0JcGl0X2NlLm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHgwMDBmLCAmcGl0X2NlKTsKLQogCWNsb2Nrc291cmNlX2k4MjUzX2luaXQoKTsKIAotCXNldHVwX2lycShwaXRfY2UuaXJxLCAmcGl0X3RpbWVyX2lycSk7Ci0JY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZwaXRfY2UpOworCXNldHVwX2lycShpODI1M19jbG9ja2V2ZW50LmlycSwgJnBpdF90aW1lcl9pcnEpOworCWNsb2NrZXZlbnRfaTgyNTNfaW5pdChmYWxzZSk7CiB9CiAKIHN0cnVjdCBzeXNfdGltZXIgaXNhX3RpbWVyID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9LY29uZmlnCmluZGV4IDliNjk4MmUuLmFiZjM1NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L0tjb25maWcKQEAgLTYsMTIgKzYsMTQgQEAKIAlib29sICJnbXMzMGM3MjAxIgogCWRlcGVuZHMgb24gQVJDSF9INzIwWAogCXNlbGVjdCBDUFVfSDcyMDEKKwlzZWxlY3QgWk9ORV9ETUEKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEh5bml4IEdNUzMwQzcyMDEgUmVmZXJlbmNlIEJvYXJkCiAKIGNvbmZpZyBBUkNIX0g3MjAyCiAJYm9vbCAiaG1zMzBjNzIwMiIKIAlzZWxlY3QgQ1BVX0g3MjAyCisJc2VsZWN0IFpPTkVfRE1BCiAJZGVwZW5kcyBvbiBBUkNIX0g3MjBYCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBIeW5peCBITVMzMEM3MjAyIFJlZmVyZW5jZSBCb2FyZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAxLWV2YWwuYwppbmRleCA2Mjk0NTRkLi42NWYxYmVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAxLWV2YWwuYworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAxLWV2YWwuYwpAQCAtMzMsNCArMzMsNSBAQAogCS5tYXBfaW8JCT0gaDcyMHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGg3MjB4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaDcyMDFfdGltZXIsCisJLmRtYV96b25lX3NpemUJPSBTWl8yNTZNLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDItZXZhbC5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKaW5kZXggZTlmNDZiNi4uODg0NTg0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKQEAgLTc2LDQgKzc2LDUgQEAKIAkuaW5pdF9pcnEJPSBoNzIwMl9pbml0X2lycSwKIAkudGltZXIJCT0gJmg3MjAyX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBpbml0X2V2YWxfaDcyMDIsCisJLmRtYV96b25lX3NpemUJPSBTWl8yNTZNLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCmluZGV4IDZkM2I5MTcuLmMzOTQ4ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtNTcsOSArNTcsNiBAQAogCQl0c3QgICAgIFxpcnFzdGF0LCAjMQkJICAgICAgIEAgYml0IDAgc2hvdWxkIGJlIHNldAogCQkuZW5kbQogCi0JCS5tYWNybyAgaXJxX3ByaW9fdGFibGUKLQkJLmVuZG0KLQogI2Vsc2UKICNlcnJvciBoeW5peCBwcm9jZXNzb3Igc2VsZWN0aW9uIG1pc3NtYXRjaAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGIwYjNiYWUuLjk2ZGNmNTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC04LDExICs4LDQgQEAKICNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAogCiAjZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHg0MDAwMDAwMCkKLS8qCi0gKiBUaGlzIGlzIHRoZSBtYXhpbXVtIERNQSBhZGRyZXNzIHRoYXQgY2FuIGJlIERNQWQgdG8uCi0gKiBUaGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAoMHhkMDAwMDAwMCAtIDB4YzAwMDAwMDApCi0gKiBieXRlcyBvZiBSQU0uCi0gKi8KLSNkZWZpbmUgQVJNX0RNQV9aT05FX1NJWkUJU1pfMjU2TQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWlteC9LY29uZmlnCmluZGV4IDU5Yzk3YTMuLmU4ZGQyMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZwpAQCAtMTY3LDYgKzE2Nyw3IEBACiAJYm9vbCAiRXVrcmVhIE1CSU1YU0QgZGV2ZWxvcG1lbnQgYm9hcmQiCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0dQSU9fS0VZUwogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfU1NJCisJc2VsZWN0IExFRFNfR1BJT19SRUdJU1RFUgogCWhlbHAKIAkgIFRoaXMgYWRkcyBib2FyZCBzcGVjaWZpYyBkZXZpY2VzIHRoYXQgY2FuIGJlIGZvdW5kIG9uIEV1a3JlYSdzCiAJICBNQklNWFNEIGV2YWx1YXRpb24gYm9hcmQuCkBAIC0yNjUsNiArMjY2LDcgQEAKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX01NQwogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCisJc2VsZWN0IExFRFNfR1BJT19SRUdJU1RFUgogCWhlbHAKIAkgIFRoaXMgYWRkcyBib2FyZCBzcGVjaWZpYyBkZXZpY2VzIHRoYXQgY2FuIGJlIGZvdW5kIG9uIEV1a3JlYSdzCiAJICBNQklNWDI3IGV2YWx1YXRpb24gYm9hcmQuCkBAIC00MDMsNiArNDA1LDcgQEAKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX05BTkQKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX1JUQwogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCisJc2VsZWN0IExFRFNfR1BJT19SRUdJU1RFUgogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgTVgzMSBMSVRFS0lUIHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzIHNwZWNpZmljCiAJICBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGJvYXJkIGFuZCBpdHMgcGVyaXBoZXJhbHMuCkBAIC00NzEsNiArNDc0LDcgQEAKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX0VIQ0kKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX01NQwogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCisJc2VsZWN0IExFRFNfR1BJT19SRUdJU1RFUgogCXNlbGVjdCBNWENfVUxQSSBpZiBVU0JfVUxQSQogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgbXgzMW1vYm9hcmQgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKQEAgLTU3Nyw2ICs1ODEsNyBAQAogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9HUElPX0tFWVMKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1NTSQogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JUFVfQ09SRQorCXNlbGVjdCBMRURTX0dQSU9fUkVHSVNURVIKIAloZWxwCiAJICBUaGlzIGFkZHMgYm9hcmQgc3BlY2lmaWMgZGV2aWNlcyB0aGF0IGNhbiBiZSBmb3VuZCBvbiBFdWtyZWEncwogCSAgTUJJTVhTRCBldmFsdWF0aW9uIGJvYXJkLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjUuYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI1LmMKaW5kZXggYTY1ODM4Zi4uYWYxYzU4MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNS5jCkBAIC0yODIsOSArMjgyLDEwIEBACiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4yIiwgInVzYiIsIHVzYm90Z19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJmc2wtdXNiMi11ZGMiLCAidXNiIiwgdXNib3RnX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Y19uYW5kLjAiLCBOVUxMLCBuZmNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14MjUtY3NwaS4wIiwgTlVMTCwgY3NwaTFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14MjUtY3NwaS4xIiwgTlVMTCwgY3NwaTJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14MjUtY3NwaS4yIiwgTlVMTCwgY3NwaTNfY2xrKQorCS8qIGkubXgyNSBoYXMgdGhlIGkubXgzNSB0eXBlIGNzcGkgKi8KKwlfUkVHSVNURVJfQ0xPQ0soImlteDM1LWNzcGkuMCIsIE5VTEwsIGNzcGkxX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDM1LWNzcGkuMSIsIE5VTEwsIGNzcGkyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDM1LWNzcGkuMiIsIE5VTEwsIGNzcGkzX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Y19wd20uMCIsIE5VTEwsIHB3bTFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXhjX3B3bS4xIiwgTlVMTCwgcHdtMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGNfcHdtLjIiLCBOVUxMLCBwd20zX2NsaykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2RtYS12MS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvZG1hLXYxLmMKaW5kZXggMjM2ZjE0OS4uNDJhZmMyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvZG1hLXYxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvZG1hLXYxLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgpAQCAtNDc1LDcgKzQ3Niw2IEBACiAJaW14X2RtYXYxX3dyaXRlbChpbXhfZG1hdjFfcmVhZGwoRE1BX0NDUihjaGFubmVsKSkgfCBDQ1JfQ0VOIHwKIAkJQ0NSX0FDUlBULCBETUFfQ0NSKGNoYW5uZWwpKTsKIAotI2lmZGVmIENPTkZJR19BUkNIX01YMgogCWlmICgoY3B1X2lzX214MjEoKSB8fCBjcHVfaXNfbXgyNygpKSAmJgogCQkJaW14ZG1hLT5zZyAmJiBpbXhfZG1hX2h3X2NoYWluKGlteGRtYSkpIHsKIAkJaW14ZG1hLT5zZyA9IHNnX25leHQoaW14ZG1hLT5zZyk7CkBAIC00ODcsNyArNDg3LDYgQEAKIAkJCQlETUFfQ0NSKGNoYW5uZWwpKTsKIAkJfQogCX0KLSNlbmRpZgogCWlteGRtYS0+aW5fdXNlID0gMTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTUxOCw3ICs1MTcsNiBAQAogfQogRVhQT1JUX1NZTUJPTChpbXhfZG1hX2Rpc2FibGUpOwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVgyCiBzdGF0aWMgdm9pZCBpbXhfZG1hX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgY2hubykKIHsKIAlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaG5vXTsKQEAgLTUzMCw3ICs1MjgsNiBAQAogCWlmIChpbXhkbWEtPmVycl9oYW5kbGVyKQogCQlpbXhkbWEtPmVycl9oYW5kbGVyKGNobm8sIGlteGRtYS0+ZGF0YSwgSU1YX0RNQV9FUlJfVElNRU9VVCk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIGlycXJldHVybl90IGRtYV9lcnJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CkBAIC02NTQsMTAgKzY1MSw4IEBACiB7CiAJaW50IGksIGRpc3I7CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9NWDIKIAlpZiAoY3B1X2lzX214MjEoKSB8fCBjcHVfaXNfbXgyNygpKQogCQlkbWFfZXJyX2hhbmRsZXIoaXJxLCBkZXZfaWQpOwotI2VuZGlmCiAKIAlkaXNyID0gaW14X2RtYXYxX3JlYWRsKERNQV9ESVNSKTsKIApAQCAtNzAzLDcgKzY5OCw2IEBACiAJaW14ZG1hLT5uYW1lID0gbmFtZTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IC8qIHJlcXVlc3RfaXJxKCkgY2FuIGJsb2NrICovCiAKLSNpZmRlZiBDT05GSUdfQVJDSF9NWDIKIAlpZiAoY3B1X2lzX214MjEoKSB8fCBjcHVfaXNfbXgyNygpKSB7CiAJCXJldCA9IHJlcXVlc3RfaXJxKE1YMnhfSU5UX0RNQUNIMCArIGNoYW5uZWwsCiAJCQkJZG1hX2lycV9oYW5kbGVyLCAwLCAiRE1BIiwgTlVMTCk7CkBAIC03MTcsNyArNzExLDYgQEAKIAkJaW14ZG1hLT53YXRjaGRvZy5mdW5jdGlvbiA9ICZpbXhfZG1hX3dhdGNoZG9nOwogCQlpbXhkbWEtPndhdGNoZG9nLmRhdGEgPSBjaGFubmVsOwogCX0KLSNlbmRpZgogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTc0NCwxMCArNzM3LDggQEAKIAlpbXhfZG1hX2Rpc2FibGUoY2hhbm5lbCk7CiAJaW14ZG1hLT5uYW1lID0gTlVMTDsKIAotI2lmZGVmIENPTkZJR19BUkNIX01YMgogCWlmIChjcHVfaXNfbXgyMSgpIHx8IGNwdV9pc19teDI3KCkpCiAJCWZyZWVfaXJxKE1YMnhfSU5UX0RNQUNIMCArIGNoYW5uZWwsIE5VTEwpOwotI2VuZGlmCiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CkBAIC04MDMsMjEgKzc5NCwxMyBAQAogCWludCByZXQgPSAwOwogCWludCBpOwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVgxCiAJaWYgKGNwdV9pc19teDEoKSkKIAkJaW14X2RtYXYxX2Jhc2VhZGRyID0gTVgxX0lPX0FERFJFU1MoTVgxX0RNQV9CQVNFX0FERFIpOwotCWVsc2UKLSNlbmRpZgotI2lmZGVmIENPTkZJR19NQUNIX01YMjEKLQlpZiAoY3B1X2lzX214MjEoKSkKKwllbHNlIGlmIChjcHVfaXNfbXgyMSgpKQogCQlpbXhfZG1hdjFfYmFzZWFkZHIgPSBNWDIxX0lPX0FERFJFU1MoTVgyMV9ETUFfQkFTRV9BRERSKTsKLQllbHNlCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTUFDSF9NWDI3Ci0JaWYgKGNwdV9pc19teDI3KCkpCisJZWxzZSBpZiAoY3B1X2lzX214MjcoKSkKIAkJaW14X2RtYXYxX2Jhc2VhZGRyID0gTVgyN19JT19BRERSRVNTKE1YMjdfRE1BX0JBU0VfQUREUik7CiAJZWxzZQotI2VuZGlmCiAJCXJldHVybiAwOwogCiAJZG1hX2NsayA9IGNsa19nZXQoTlVMTCwgImRtYSIpOwpAQCAtODI4LDcgKzgxMSw2IEBACiAJLyogcmVzZXQgRE1BIG1vZHVsZSAqLwogCWlteF9kbWF2MV93cml0ZWwoRENSX0RSU1QsIERNQV9EQ1IpOwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVgxCiAJaWYgKGNwdV9pc19teDEoKSkgewogCQlyZXQgPSByZXF1ZXN0X2lycShNWDFfRE1BX0lOVCwgZG1hX2lycV9oYW5kbGVyLCAwLCAiRE1BIiwgTlVMTCk7CiAJCWlmIChyZXQpIHsKQEAgLTg0Myw3ICs4MjUsNyBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KLSNlbmRpZgorCiAJLyogZW5hYmxlIERNQSBtb2R1bGUgKi8KIAlpbXhfZG1hdjFfd3JpdGVsKERDUl9ERU4sIERNQV9EQ1IpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXgyNy1iYXNlYm9hcmQuYyBiL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteDI3LWJhc2Vib2FyZC5jCmluZGV4IDU5MTEyODEuLjVkYjNlMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteDI3LWJhc2Vib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteDI3LWJhc2Vib2FyZC5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkua2V5bWFwX3NpemUgICAgPSBBUlJBWV9TSVpFKGV1a3JlYV9tYmlteDI3X2tleW1hcCksCiB9OwogCi1zdGF0aWMgc3RydWN0IGdwaW9fbGVkIGdwaW9fbGVkc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZCBldWtyZWFfbWJpbXgyN19ncGlvX2xlZHNbXSBfX2luaXRjb25zdCA9IHsKIAl7CiAJCS5uYW1lCQkJPSAibGVkMSIsCiAJCS5kZWZhdWx0X3RyaWdnZXIJPSAiaGVhcnRiZWF0IiwKQEAgLTEyNywxNyArMTI3LDEwIEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBncGlvX2xlZF9pbmZvID0gewotCS5sZWRzCQk9IGdwaW9fbGVkcywKLQkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKGdwaW9fbGVkcyksCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsZWRzX2dwaW8gPSB7Ci0JLm5hbWUJPSAibGVkcy1ncGlvIiwKLQkuaWQJPSAtMSwKLQkuZGV2CT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZncGlvX2xlZF9pbmZvLAotCX0sCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEKKwkJZXVrcmVhX21iaW14MjdfZ3Bpb19sZWRfaW5mbyBfX2luaXRjb25zdCA9IHsKKwkubGVkcwkJPSBldWtyZWFfbWJpbXgyN19ncGlvX2xlZHMsCisJLm51bV9sZWRzCT0gQVJSQVlfU0laRShldWtyZWFfbWJpbXgyN19ncGlvX2xlZHMpLAogfTsKIAogc3RhdGljIHN0cnVjdCBpbXhfZmJfdmlkZW9tb2RlIGV1a3JlYV9tYmlteDI3X21vZGVzW10gPSB7CkBAIC0yOTMsMTAgKzI4Niw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmbGVkc19ncGlvLAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBpbXhtbWNfcGxhdGZvcm1fZGF0YSBzZGhjX3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5kYXQzX2NhcmRfZGV0ZWN0ID0gMSwKIH07CkBAIC0zNzcsNSArMzY2LDUgQEAKIAogCWlteDI3X2FkZF9pbXhfa2V5cGFkKCZldWtyZWFfbWJpbXgyN19rZXltYXBfZGF0YSk7CiAKLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwbGF0Zm9ybV9kZXZpY2VzLCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpKTsKKwlncGlvX2xlZF9yZWdpc3Rlcl9kZXZpY2UoLTEsICZldWtyZWFfbWJpbXgyN19ncGlvX2xlZF9pbmZvKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteHNkMjUtYmFzZWJvYXJkLmMgYi9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDI1LWJhc2Vib2FyZC5jCmluZGV4IGY5ZWYwNGEuLjAxZWJjYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteHNkMjUtYmFzZWJvYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvZXVrcmVhX21iaW14c2QyNS1iYXNlYm9hcmQuYwpAQCAtMTczLDcgKzE3Myw3IEBACiAJLmRldi5wbGF0Zm9ybV9kYXRhCT0gJmV1a3JlYV9tYmlteHNkX2xjZF9wb3dlcl9kYXRhLAogfTsKIAotc3RhdGljIHN0cnVjdCBncGlvX2xlZCBldWtyZWFfbWJpbXhzZF9sZWRzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkIGV1a3JlYV9tYmlteHNkX2xlZHNbXSBfX2luaXRjb25zdCA9IHsKIAl7CiAJCS5uYW1lCQkJPSAibGVkMSIsCiAJCS5kZWZhdWx0X3RyaWdnZXIJPSAiaGVhcnRiZWF0IiwKQEAgLTE4MiwxOSArMTgyLDEyIEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBldWtyZWFfbWJpbXhzZF9sZWRfaW5mbyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YQorCQlldWtyZWFfbWJpbXhzZF9sZWRfaW5mbyBfX2luaXRjb25zdCA9IHsKIAkubGVkcwkJPSBldWtyZWFfbWJpbXhzZF9sZWRzLAogCS5udW1fbGVkcwk9IEFSUkFZX1NJWkUoZXVrcmVhX21iaW14c2RfbGVkcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBldWtyZWFfbWJpbXhzZF9sZWRzX2dwaW8gPSB7Ci0JLm5hbWUJPSAibGVkcy1ncGlvIiwKLQkuaWQJPSAtMSwKLQkuZGV2CT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZldWtyZWFfbWJpbXhzZF9sZWRfaW5mbywKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGV1a3JlYV9tYmlteHNkX2dwaW9fYnV0dG9uc1tdID0gewogCXsKIAkJLmdwaW8JCT0gR1BJT19TV0lUQ0gxLApAQCAtMjEyLDcgKzIwNSw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJmV1a3JlYV9tYmlteHNkX2xlZHNfZ3BpbywKIAkmZXVrcmVhX21iaW14c2RfbGNkX3Bvd2VyZGV2LAogfTsKIApAQCAtMjg3LDUgKzI3OSw2IEBACiAJCQkJQVJSQVlfU0laRShldWtyZWFfbWJpbXhzZF9pMmNfZGV2aWNlcykpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7CisJZ3Bpb19sZWRfcmVnaXN0ZXJfZGV2aWNlKC0xLCAmZXVrcmVhX21iaW14c2RfbGVkX2luZm8pOwogCWlteF9hZGRfZ3Bpb19rZXlzKCZldWtyZWFfbWJpbXhzZF9idXR0b25fZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDM1LWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvZXVrcmVhX21iaW14c2QzNS1iYXNlYm9hcmQuYwppbmRleCA0OTA5ZWEwLi41NThlYjUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDM1LWJhc2Vib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteHNkMzUtYmFzZWJvYXJkLmMKQEAgLTE5MywxOSArMTkzLDEyIEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBldWtyZWFfbWJpbXhzZF9sZWRfaW5mbyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YQorCQlldWtyZWFfbWJpbXhzZF9sZWRfaW5mbyBfX2luaXRjb25zdCA9IHsKIAkubGVkcwkJPSBldWtyZWFfbWJpbXhzZF9sZWRzLAogCS5udW1fbGVkcwk9IEFSUkFZX1NJWkUoZXVrcmVhX21iaW14c2RfbGVkcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBldWtyZWFfbWJpbXhzZF9sZWRzX2dwaW8gPSB7Ci0JLm5hbWUJPSAibGVkcy1ncGlvIiwKLQkuaWQJPSAtMSwKLQkuZGV2CT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZldWtyZWFfbWJpbXhzZF9sZWRfaW5mbywKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGV1a3JlYV9tYmlteHNkX2dwaW9fYnV0dG9uc1tdID0gewogCXsKIAkJLmdwaW8JCT0gR1BJT19TV0lUQ0gxLApAQCAtMjIzLDcgKzIxNiw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJmV1a3JlYV9tYmlteHNkX2xlZHNfZ3BpbywKIAkmZXVrcmVhX21iaW14c2RfbGNkX3Bvd2VyZGV2LAogfTsKIApAQCAtMjk5LDUgKzI5MSw2IEBACiAJCQkJQVJSQVlfU0laRShldWtyZWFfbWJpbXhzZF9pMmNfZGV2aWNlcykpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7CisJZ3Bpb19sZWRfcmVnaXN0ZXJfZGV2aWNlKC0xLCAmZXVrcmVhX21iaW14c2RfbGVkX2luZm8pOwogCWlteF9hZGRfZ3Bpb19rZXlzKCZldWtyZWFfbWJpbXhzZF9idXR0b25fZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWFwZjkzMjguYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYXBmOTMyOC5jCmluZGV4IDE1ZTQ1YzguLmE0MDRjODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYXBmOTMyOC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYXBmOTMyOC5jCkBAIC05OSwxMSArOTksNiBAQAogCX0KIH07CiAKLS8qIC0tLSBTRVJJQUwgUkVTU09VUkNFIC0tLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydDBfcGRhdGEgX19pbml0Y29uc3QgPSB7Ci0JLmZsYWdzID0gMCwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnQxX3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCiB9OwpAQCAtMTE1LDExICsxMTAsMTMgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGFwZjkzMjhfaW5pdCh2b2lkKQogeworCWlteDFfc29jX2luaXQoKTsKKwogCW14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMoYXBmOTMyOF9waW5zLAogCQkJQVJSQVlfU0laRShhcGY5MzI4X3BpbnMpLAogCQkJIkFQRjkzMjgiKTsKIAotCWlteDFfYWRkX2lteF91YXJ0MCgmdWFydDBfcGRhdGEpOworCWlteDFfYWRkX2lteF91YXJ0MChOVUxMKTsKIAlpbXgxX2FkZF9pbXhfdWFydDEoJnVhcnQxX3BkYXRhKTsKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1hcm1hZGlsbG81eDAuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYXJtYWRpbGxvNXgwLmMKaW5kZXggZmZiNDBmZi4uZWRlMjcxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1hcm1hZGlsbG81eDAuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWFybWFkaWxsbzV4MC5jCkBAIC00OTAsNiArNDkwLDggQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IGFybWFkaWxsbzV4MF9pbml0KHZvaWQpCiB7CisJaW14MzFfc29jX2luaXQoKTsKKwogCW14Y19pb211eF9zZXR1cF9tdWx0aXBsZV9waW5zKGFybWFkaWxsbzV4MF9waW5zLAogCQkJQVJSQVlfU0laRShhcm1hZGlsbG81eDBfcGlucyksICJhcm1hZGlsbG81eDAiKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1idWcuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYnVnLmMKaW5kZXggNDJlNGYwNy4uZjQ5NDcwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1idWcuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWJ1Zy5jCkBAIC00Miw2ICs0Miw4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBidWdfYm9hcmRfaW5pdCh2b2lkKQogeworCWlteDMxX3NvY19pbml0KCk7CisKIAlteGNfaW9tdXhfc2V0dXBfbXVsdGlwbGVfcGlucyhidWdfcGlucywKIAkJCQkgICAgICBBUlJBWV9TSVpFKGJ1Z19waW5zKSwgInVhcnQtNCIpOwogCWlteDMxX2FkZF9pbXhfdWFydDQoJnVhcnRfcGRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1jcHVpbXgyNy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1jcHVpbXgyNy5jCmluZGV4IDQ2YTJlNDEuLjg3ODg3YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtY3B1aW14MjcuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDI3LmMKQEAgLTI1MCw2ICsyNTAsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgZXVrcmVhX2NwdWlteDI3X2luaXQodm9pZCkKIHsKKwlpbXgyN19zb2NfaW5pdCgpOworCiAJbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhldWtyZWFfY3B1aW14MjdfcGlucywKIAkJQVJSQVlfU0laRShldWtyZWFfY3B1aW14MjdfcGlucyksICJDUFVJTVgyNyIpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDM1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDM1LmMKaW5kZXggM2Y4ZWY4Mi4uZjM5YTQ3OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtY3B1aW14MzUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDM1LmMKQEAgLTE1Niw2ICsxNTYsOCBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgZXVrcmVhX2NwdWlteDM1X2luaXQodm9pZCkKIHsKKwlpbXgzNV9zb2NfaW5pdCgpOworCiAJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMoZXVrcmVhX2NwdWlteDM1X3BhZHMsCiAJCQlBUlJBWV9TSVpFKGV1a3JlYV9jcHVpbXgzNV9wYWRzKSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtZXVrcmVhX2NwdWlteDI1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWV1a3JlYV9jcHVpbXgyNS5jCmluZGV4IDE0OGNmZjIuLmRhMzZkYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtZXVrcmVhX2NwdWlteDI1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1ldWtyZWFfY3B1aW14MjUuYwpAQCAtMTI1LDYgKzEyNSw4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBldWtyZWFfY3B1aW14MjVfaW5pdCh2b2lkKQogeworCWlteDI1X3NvY19pbml0KCk7CisKIAlpZiAobXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMoZXVrcmVhX2NwdWlteDI1X3BhZHMsCiAJCQlBUlJBWV9TSVpFKGV1a3JlYV9jcHVpbXgyNV9wYWRzKSkpCiAJCXByaW50ayhLRVJOX0VSUiAiZXJyb3Igc2V0dGluZyBjcHVpbXgyNSBwYWRzICFcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN192aXNzdHJpbV9tMTAuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14Mjdfdmlzc3RyaW1fbTEwLmMKaW5kZXggN2FlNDNiMS4uNjcwN2RlMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14Mjdfdmlzc3RyaW1fbTEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN192aXNzdHJpbV9tMTAuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2lvbXV4Lmg+CisjaW5jbHVkZSA8bWFjaC9pb211eC1teDI3Lmg+CiAKICNpbmNsdWRlICJkZXZpY2VzLWlteDI3LmgiCiAKQEAgLTIzMSw2ICsyMzEsOCBAQAogewogCWludCByZXQ7CiAKKwlpbXgyN19zb2NfaW5pdCgpOworCiAJcmV0ID0gbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyh2aXNzdHJpbV9tMTBfcGlucywKIAkJCUFSUkFZX1NJWkUodmlzc3RyaW1fbTEwX3BpbnMpLCAiVklTU1RSSU1fTTEwIik7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14MjdpcGNhbS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2lwY2FtLmMKaW5kZXggOWJlNmNkNi4uMjcyZjc5MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2lwY2FtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2lwY2FtLmMKQEAgLTUwLDYgKzUwLDggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG14MjdpcGNhbV9pbml0KHZvaWQpCiB7CisJaW14Mjdfc29jX2luaXQoKTsKKwogCW14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXgyN2lwY2FtX3BpbnMsIEFSUkFZX1NJWkUobXgyN2lwY2FtX3BpbnMpLAogCQkibXgyN2lwY2FtIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14MjdsaXRlLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDI3bGl0ZS5jCmluZGV4IDg0MTE0MDUuLmQ4MWE3NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14MjdsaXRlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2xpdGUuYwpAQCAtNTksNiArNTksOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXgyN2xpdGVfaW5pdCh2b2lkKQogeworCWlteDI3X3NvY19pbml0KCk7CisKIAlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14MjdsaXRlX3BpbnMsIEFSUkFZX1NJWkUobXgyN2xpdGVfcGlucyksCiAJCSJpbXgyN2xpdGUiKTsKIAlpbXgyN19hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gta3ptX2FybTExXzAxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWt6bV9hcm0xMV8wMS5jCmluZGV4IDFlY2FlMjAuLmU0NzJhMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gta3ptX2FybTExXzAxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1rem1fYXJtMTFfMDEuYwpAQCAtMjIzLDYgKzIyMyw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBrem1fYm9hcmRfaW5pdCh2b2lkKQogeworCWlteDMxX3NvY19pbml0KCk7CisKIAlteGNfaW9tdXhfc2V0dXBfbXVsdGlwbGVfcGlucyhrem1fcGlucywKIAkJCQkgICAgICBBUlJBWV9TSVpFKGt6bV9waW5zKSwgImt6bSIpOwogCWt6bV9pbml0X2V4dF91YXJ0KCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MWFkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDFhZHMuYwppbmRleCAzOGVjNWNiLi41Y2Q4YmVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MWFkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgxYWRzLmMKQEAgLTExNSw2ICsxMTUsOCBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgbXgxYWRzX2luaXQodm9pZCkKIHsKKwlpbXgxX3NvY19pbml0KCk7CisKIAlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14MWFkc19waW5zLAogCQlBUlJBWV9TSVpFKG14MWFkc19waW5zKSwgIm14MWFkcyIpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjFhZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyMWFkcy5jCmluZGV4IDc0YWM4ODkuLmQzODllY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyMWFkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyMWFkcy5jCkBAIC0yNzksNiArMjc5LDggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG14MjFhZHNfYm9hcmRfaW5pdCh2b2lkKQogeworCWlteDIxX3NvY19pbml0KCk7CisKIAlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14MjFhZHNfcGlucywgQVJSQVlfU0laRShteDIxYWRzX3BpbnMpLAogCQkJIm14MjFhZHMiKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI1XzNkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI1XzNkcy5jCmluZGV4IDU4ZWEzZmQuLjAxNTM0YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyNV8zZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjVfM2RzLmMKQEAgLTIxOSw2ICsyMTksOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXgyNXBka19pbml0KHZvaWQpCiB7CisJaW14MjVfc29jX2luaXQoKTsKKwogCW14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKG14MjVwZGtfcGFkcywKIAkJCUFSUkFZX1NJWkUobXgyNXBka19wYWRzKSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN18zZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN18zZHMuYwppbmRleCA2ZTFhY2NmLi5iMzFkNDEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdfM2RzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI3XzNkcy5jCkBAIC00MiwxMCArNDIsMTIgQEAKIAogI2luY2x1ZGUgImRldmljZXMtaW14MjcuaCIKIAotI2RlZmluZSBTRDFfRU5fR1BJTyAoR1BJT19QT1JUQiArIDI1KQotI2RlZmluZSBPVEdfUEhZX1JFU0VUX0dQSU8gKEdQSU9fUE9SVEIgKyAyMykKLSNkZWZpbmUgU1BJMl9TUzAgKEdQSU9fUE9SVEQgKyAyMSkKLSNkZWZpbmUgRVhQSU9fUEFSRU5UX0lOVAkoTVhDX0lOVEVSTkFMX0lSUVMgKyBHUElPX1BPUlRDICsgMjgpCisjZGVmaW5lIFNEMV9FTl9HUElPCQlJTVhfR1BJT19OUigyLCAyNSkKKyNkZWZpbmUgT1RHX1BIWV9SRVNFVF9HUElPCUlNWF9HUElPX05SKDIsIDIzKQorI2RlZmluZSBTUEkyX1NTMAkJSU1YX0dQSU9fTlIoNCwgMjEpCisjZGVmaW5lIEVYUElPX1BBUkVOVF9JTlQJZ3Bpb190b19pcnEoSU1YX0dQSU9fTlIoMywgMjgpKQorI2RlZmluZSBQTUlDX0lOVAkJSU1YX0dQSU9fTlIoMywgMTQpCisjZGVmaW5lIFNEMV9DRAkJCUlNWF9HUElPX05SKDIsIDI2KQogCiBzdGF0aWMgY29uc3QgaW50IG14MjdwZGtfcGluc1tdIF9faW5pdGNvbnN0ID0gewogCS8qIFVBUlQxICovCkBAIC05OCw5ICsxMDAsMTIgQEAKIAlQRDIyX1BGX0NTUEkyX1NDTEssCiAJUEQyM19QRl9DU1BJMl9NSVNPLAogCVBEMjRfUEZfQ1NQSTJfTU9TSSwKKwlTUEkyX1NTMCB8IEdQSU9fR1BJTyB8IEdQSU9fT1VULAogCS8qIEkyQzEgKi8KIAlQRDE3X1BGX0kyQ19EQVRBLAogCVBEMThfUEZfSTJDX0NMSywKKwkvKiBQTUlDIElOVCAqLworCVBNSUNfSU5UIHwgR1BJT19HUElPIHwgR1BJT19JTiwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgX19pbml0Y29uc3QgPSB7CkBAIC0xMzEsMTMgKzEzNiwxMyBAQAogc3RhdGljIGludCBteDI3XzNkc19zZGhjMV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBkZXRlY3RfaXJxLAogCQkJCXZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIHJlcXVlc3RfaXJxKElSUV9HUElPQigyNiksIGRldGVjdF9pcnEsIElSUUZfVFJJR0dFUl9GQUxMSU5HIHwKLQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsICJzZGhjMS1jYXJkLWRldGVjdCIsIGRhdGEpOworCXJldHVybiByZXF1ZXN0X2lycShncGlvX3RvX2lycShTRDFfQ0QpLCBkZXRlY3RfaXJxLAorCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORywgInNkaGMxLWNhcmQtZGV0ZWN0IiwgZGF0YSk7CiB9CiAKIHN0YXRpYyB2b2lkIG14MjdfM2RzX3NkaGMxX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewotCWZyZWVfaXJxKElSUV9HUElPQigyNiksIGRhdGEpOworCWZyZWVfaXJxKGdwaW9fdG9faXJxKFNEMV9DRCksIGRhdGEpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlteG1tY19wbGF0Zm9ybV9kYXRhIHNkaGMxX3BkYXRhIF9faW5pdGNvbnN0ID0gewpAQCAtMTkzLDYgKzE5OCwxMyBAQAogX19zZXR1cCgib3RnX21vZGU9IiwgbXgyN18zZHNfb3RnX21vZGUpOwogCiAvKiBSZWd1bGF0b3JzICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgZ3BvX2luaXQgPSB7CisJLmNvbnN0cmFpbnRzID0geworCQkuYm9vdF9vbiA9IDEsCisJCS5hbHdheXNfb24gPSAxLAorCX0KK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB2bW1jMV9jb25zdW1lcnNbXSA9IHsKIAlSRUdVTEFUT1JfU1VQUExZKCJsY2RfMnY4IiwgTlVMTCksCiB9OwpAQCAtMjAxLDcgKzIxMyw5IEBACiAJLmNvbnN0cmFpbnRzID0gewogCQkubWluX3VWCT0gMjgwMDAwMCwKIAkJLm1heF91ViA9IDI4MDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSwKKwkJLmFwcGx5X3VWID0gMSwKKwkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKKwkJCQkgIFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCiAJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUodm1tYzFfY29uc3VtZXJzKSwKIAkuY29uc3VtZXJfc3VwcGxpZXMgPSB2bW1jMV9jb25zdW1lcnMsCkBAIC0yMjgsNiArMjQyLDEyIEBACiAJfSwgewogCQkuaWQgPSBNQzEzNzgzX1JFR19WR0VOLAogCQkuaW5pdF9kYXRhID0gJnZnZW5faW5pdCwKKwl9LCB7CisJCS5pZCA9IE1DMTM3ODNfUkVHX0dQTzEsIC8qIFR1cm4gb24gMS44ViAqLworCQkuaW5pdF9kYXRhID0gJmdwb19pbml0LAorCX0sIHsKKwkJLmlkID0gTUMxMzc4M19SRUdfR1BPMywgLyogVHVybiBvbiAzLjNWICovCisJCS5pbml0X2RhdGEgPSAmZ3BvX2luaXQsCiAJfSwKIH07CiAKQEAgLTI0MiwxMSArMjYyLDExIEBACiB9OwogCiAvKiBTUEkgKi8KLXN0YXRpYyBpbnQgc3BpMl9pbnRlcm5hbF9jaGlwc2VsZWN0W10gPSB7U1BJMl9TUzB9Oworc3RhdGljIGludCBzcGkyX2NoaXBzZWxlY3RbXSA9IHtTUEkyX1NTMH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2lteF9tYXN0ZXIgc3BpMl9wZGF0YSBfX2luaXRjb25zdCA9IHsKLQkuY2hpcHNlbGVjdAk9IHNwaTJfaW50ZXJuYWxfY2hpcHNlbGVjdCwKLQkubnVtX2NoaXBzZWxlY3QJPSBBUlJBWV9TSVpFKHNwaTJfaW50ZXJuYWxfY2hpcHNlbGVjdCksCisJLmNoaXBzZWxlY3QJPSBzcGkyX2NoaXBzZWxlY3QsCisJLm51bV9jaGlwc2VsZWN0CT0gQVJSQVlfU0laRShzcGkyX2NoaXBzZWxlY3QpLAogfTsKIAogc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBteDI3XzNkc19zcGlfZGV2c1tdIF9faW5pdGRhdGEgPSB7CkBAIC0yNTYsNyArMjc2LDcgQEAKIAkJLmJ1c19udW0JPSAxLAogCQkuY2hpcF9zZWxlY3QJPSAwLCAvKiBTUzAgKi8KIAkJLnBsYXRmb3JtX2RhdGEJPSAmbWMxMzc4M19wZGF0YSwKLQkJLmlycSA9IElSUV9HUElPQygxNCksCisJCS5pcnEgPSBncGlvX3RvX2lycShQTUlDX0lOVCksCiAJCS5tb2RlID0gU1BJX0NTX0hJR0gsCiAJfSwKIH07CkBAIC0yNjcsNiArMjg3LDggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG14MjdwZGtfaW5pdCh2b2lkKQogeworCWlteDI3X3NvY19pbml0KCk7CisKIAlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14MjdwZGtfcGlucywgQVJSQVlfU0laRShteDI3cGRrX3BpbnMpLAogCQkibXgyN3BkayIpOwogCW14MjdfM2RzX3NkaGMxX2VuYWJsZV9sZXZlbF90cmFuc2xhdG9yKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdhZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN2Fkcy5jCmluZGV4IDFkYjc5NTAuLmZjMjZlZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN2Fkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN2Fkcy5jCkBAIC0yODgsNiArMjg4LDggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG14MjdhZHNfYm9hcmRfaW5pdCh2b2lkKQogeworCWlteDI3X3NvY19pbml0KCk7CisKIAlteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14MjdhZHNfcGlucywgQVJSQVlfU0laRShteDI3YWRzX3BpbnMpLAogCQkJIm14MjdhZHMiKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxXzNkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxXzNkcy5jCmluZGV4IDliOTgyNDQuLmMyMGJlNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMV8zZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFfM2RzLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpAQCAtNTMsMTEgKzU0LDggQEAKIAlNWDMxX1BJTl9SWEQxX19SWEQxLAogCUlPTVVYX01PREUoTVgzMV9QSU5fR1BJTzFfMSwgSU9NVVhfQ09ORklHX0dQSU8pLAogCS8qU1BJMCovCi0JTVgzMV9QSU5fQ1NQSTFfU0NMS19fU0NMSywKLQlNWDMxX1BJTl9DU1BJMV9NT1NJX19NT1NJLAotCU1YMzFfUElOX0NTUEkxX01JU09fX01JU08sCi0JTVgzMV9QSU5fQ1NQSTFfU1BJX1JEWV9fU1BJX1JEWSwKLQlNWDMxX1BJTl9DU1BJMV9TUzJfX1NTMiwgLyogQ1MgZm9yIExDRCAqLworCUlPTVVYX01PREUoTVgzMV9QSU5fRFNSX0RDRTEsIElPTVVYX0NPTkZJR19BTFQxKSwKKwlJT01VWF9NT0RFKE1YMzFfUElOX1JJX0RDRTEsIElPTVVYX0NPTkZJR19BTFQxKSwKIAkvKiBTUEkgMSAqLwogCU1YMzFfUElOX0NTUEkyX1NDTEtfX1NDTEssCiAJTVgzMV9QSU5fQ1NQSTJfTU9TSV9fTU9TSSwKQEAgLTY4OSw2ICs2ODcsMTEgQEAKIHsKIAlpbnQgcmV0OwogCisJaW14MzFfc29jX2luaXQoKTsKKworCS8qIENvbmZpZ3VyZSBTUEkxIElPTVVYICovCisJbXhjX2lvbXV4X3NldF9ncHIoTVVYX1BHUF9DU1BJX0JCLCB0cnVlKTsKKwogCW14Y19pb211eF9zZXR1cF9tdWx0aXBsZV9waW5zKG14MzFfM2RzX3BpbnMsIEFSUkFZX1NJWkUobXgzMV8zZHNfcGlucyksCiAJCQkJICAgICAgIm14MzFfM2RzIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMWFkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxYWRzLmMKaW5kZXggZjRkZWUwMi4uMGNlNDk0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxYWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxYWRzLmMKQEAgLTUxNiw2ICs1MTYsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXgzMWFkc19pbml0KHZvaWQpCiB7CisJaW14MzFfc29jX2luaXQoKTsKKwogCW14Y19pbml0X2V4dHVhcnQoKTsKIAlteGNfaW5pdF9pbXhfdWFydCgpOwogCW14Y19pbml0X2kyYygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbGlsbHkuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMWxpbGx5LmMKaW5kZXggNDEwZTY3Ni4uNzUwMzY4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbGlsbHkuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFsaWxseS5jCkBAIC0yNDMsNiArMjQzLDggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG14MzFsaWxseV9ib2FyZF9pbml0KHZvaWQpCiB7CisJaW14MzFfc29jX2luaXQoKTsKKwogCXN3aXRjaCAobXgzMWxpbGx5X2Jhc2Vib2FyZCkgewogCWNhc2UgTVgzMUxJTExZX05PQk9BUkQ6CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbGl0ZS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbGl0ZS5jCmluZGV4IGFjOWI0Y2EuLjRiNDdmZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMWxpdGUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFsaXRlLmMKQEAgLTIzMCw2ICsyMzAsOCBAQAogewogCWludCByZXQ7CiAKKwlpbXgzMV9zb2NfaW5pdCgpOworCiAJc3dpdGNoIChteDMxbGl0ZV9iYXNlYm9hcmQpIHsKIAljYXNlIE1YMzFMSVRFX05PQk9BUkQ6CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbW9ib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbW9ib2FyZC5jCmluZGV4IGVhYTUxZTQuLmIzNTgzODMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMW1vYm9hcmQuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFtb2JvYXJkLmMKQEAgLTQyNSw3ICs0MjUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fbGVkIG14MzFtb2JvYXJkX2xlZHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQgbXgzMW1vYm9hcmRfbGVkc1tdIF9faW5pdGNvbnN0ID0gewogCXsKIAkJLm5hbWUJPSAiY29yZWJvYXJkLWxlZC0wOnJlZDpydW5uaW5nIiwKIAkJLmRlZmF1bHRfdHJpZ2dlciA9ICJoZWFydGJlYXQiLApAQCAtNDQyLDI2ICs0NDIsMTcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIG14MzFtb2JvYXJkX2xlZF9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBteDMxbW9ib2FyZF9sZWRfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLm51bV9sZWRzCT0gQVJSQVlfU0laRShteDMxbW9ib2FyZF9sZWRzKSwKIAkubGVkcwkJPSBteDMxbW9ib2FyZF9sZWRzLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXgzMW1vYm9hcmRfbGVkc19kZXZpY2UgPSB7Ci0JLm5hbWUJPSAibGVkcy1ncGlvIiwKLQkuaWQJPSAtMSwKLQkuZGV2CT0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZteDMxbW9ib2FyZF9sZWRfcGRhdGEsCi0JfSwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXB1X3BsYXRmb3JtX2RhdGEgbXgzX2lwdV9kYXRhIF9faW5pdGNvbnN0ID0gewogCS5pcnFfYmFzZSA9IE1YQ19JUFVfSVJRX1NUQVJULAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZteDMxbW9ib2FyZF9mbGFzaCwKLQkmbXgzMW1vYm9hcmRfbGVkc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IG14M19jYW1lcmFfcGRhdGEgY2FtZXJhX3BkYXRhIF9faW5pdGRhdGEgPSB7CkBAIC01MDcsMTAgKzQ5OCwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgbXgzMW1vYm9hcmRfaW5pdCh2b2lkKQogeworCWlteDMxX3NvY19pbml0KCk7CisKIAlteGNfaW9tdXhfc2V0dXBfbXVsdGlwbGVfcGlucyhtb2JvYXJkX3BpbnMsIEFSUkFZX1NJWkUobW9ib2FyZF9waW5zKSwKIAkJIm1vYm9hcmQiKTsKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworCWdwaW9fbGVkX3JlZ2lzdGVyX2RldmljZSgtMSwgJm14MzFtb2JvYXJkX2xlZF9wZGF0YSk7CiAKIAlpbXgzMV9hZGRfaW14X3VhcnQwKCZ1YXJ0MF9wZGF0YSk7CiAJaW14MzFfYWRkX2lteF91YXJ0NCgmdWFydDRfcGRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDM1XzNkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDM1XzNkcy5jCmluZGV4IDg4Mjg4MGEuLmIzYjliZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzNV8zZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzVfM2RzLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAogI2luY2x1ZGUgImRldmljZXMtaW14MzUuaCIKIAotI2RlZmluZSBFWFBJT19QQVJFTlRfSU5UCShNWENfSU5URVJOQUxfSVJRUyArIEdQSU9fUE9SVEEgKyAxKQorI2RlZmluZSBFWFBJT19QQVJFTlRfSU5UCWdwaW9fdG9faXJxKElNWF9HUElPX05SKDEsIDEpKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCkBAIC0xNzksNiArMTc5LDggQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IG14MzVfM2RzX2luaXQodm9pZCkKIHsKKwlpbXgzNV9zb2NfaW5pdCgpOworCiAJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXgzNXBka19wYWRzLCBBUlJBWV9TSVpFKG14MzVwZGtfcGFkcykpOwogCiAJaW14MzVfYWRkX2ZlYyhOVUxMKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXh0X3RkNjAuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXh0X3RkNjAuYwppbmRleCAyNzc0NTQxLi5jODU4NzZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14dF90ZDYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teHRfdGQ2MC5jCkBAIC0yMzMsNiArMjMzLDggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG14dF90ZDYwX2JvYXJkX2luaXQodm9pZCkKIHsKKwlpbXgyN19zb2NfaW5pdCgpOworCiAJbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhteHRfdGQ2MF9waW5zLCBBUlJBWV9TSVpFKG14dF90ZDYwX3BpbnMpLAogCQkJIk1YVF9URDYwIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNhMTAwLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjYTEwMC5jCmluZGV4IGJiZGRjNWEuLjcxMDgzYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNhMTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY2ExMDAuYwpAQCAtMzU3LDYgKzM1Nyw4IEBACiB7CiAJaW50IHJldDsKIAorCWlteDI3X3NvY19pbml0KCk7CisKIAkvKiBTU0kgdW5pdCAqLwogCW14Y19hdWRtdXhfdjFfY29uZmlndXJlX3BvcnQoTVgyN19BVURNVVhfSFBDUjFfU1NJMCwKIAkJCQkgIE1YQ19BVURNVVhfVjFfUENSX1NZTiB8IC8qIDR3aXJlIG1vZGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM3LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzNy5jCmluZGV4IDg5YzIxM2IuLmY0NWI3Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wMzcuYwpAQCAtNTc2LDYgKzU3Niw4IEBACiB7CiAJaW50IHJldDsKIAorCWlteDMxX3NvY19pbml0KCk7CisKIAlteGNfaW9tdXhfc2V0X2dwcihNVVhfUEdQX1VIMiwgMSk7CiAKIAlteGNfaW9tdXhfc2V0dXBfbXVsdGlwbGVfcGlucyhwY20wMzdfcGlucywgQVJSQVlfU0laRShwY20wMzdfcGlucyksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzOC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wMzguYwppbmRleCA4NTNiYjg3Li4yZDZhNjRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzOC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM4LmMKQEAgLTI5NSw2ICsyOTUsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgcGNtMDM4X2luaXQodm9pZCkKIHsKKwlpbXgyN19zb2NfaW5pdCgpOworCiAJbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhwY20wMzhfcGlucywgQVJSQVlfU0laRShwY20wMzhfcGlucyksCiAJCQkiUENNMDM4Iik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDQzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTA0My5jCmluZGV4IDAyNjQ0MTYuLjE2M2NjMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDQzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wNDMuYwpAQCAtMzU2LDYgKzM1Niw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBwY20wNDNfaW5pdCh2b2lkKQogeworCWlteDM1X3NvY19pbml0KCk7CisKIAlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhwY20wNDNfcGFkcywgQVJSQVlfU0laRShwY20wNDNfcGFkcykpOwogCiAJbXhjX2F1ZG11eF92Ml9jb25maWd1cmVfcG9ydCgzLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1xb25nLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXFvbmcuYwppbmRleCBjMTYzMjg3Li4zNjI2ZjQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXFvbmcuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXFvbmcuYwpAQCAtMjQ0LDYgKzI0NCw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBxb25nX2luaXQodm9pZCkKIHsKKwlpbXgzMV9zb2NfaW5pdCgpOworCiAJbXhjX2luaXRfaW14X3VhcnQoKTsKIAlxb25nX2luaXRfbm9yX210ZCgpOwogCXFvbmdfaW5pdF9mcGdhKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXNjYjkzMjguYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtc2NiOTMyOC5jCmluZGV4IGRjYWVlMDQuLmRiMmQ2MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtc2NiOTMyOC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtc2NiOTMyOC5jCkBAIC0xMDEsMjEgKzEwMSw3IEBACiAJUEMxMl9QRl9VQVJUMV9SWEQsCiB9OwogCi1zdGF0aWMgaW50IHVhcnQxX214Y19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIG14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXhjX3VhcnQxX3BpbnMsCi0JCQlBUlJBWV9TSVpFKG14Y191YXJ0MV9waW5zKSwgIlVBUlQxIik7Ci19Ci0KLXN0YXRpYyB2b2lkIHVhcnQxX214Y19leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JbXhjX2dwaW9fcmVsZWFzZV9tdWx0aXBsZV9waW5zKG14Y191YXJ0MV9waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDFfcGlucykpOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0gewotCS5pbml0ID0gdWFydDFfbXhjX2luaXQsCi0JLmV4aXQgPSB1YXJ0MV9teGNfZXhpdCwKIAkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAogfTsKIApAQCAtMTI5LDYgKzExNSwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgc2NiOTMyOF9pbml0KHZvaWQpCiB7CisJaW14MV9zb2NfaW5pdCgpOworCisJbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhteGNfdWFydDFfcGlucywKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQxX3BpbnMpLCAiVUFSVDEiKTsKKwogCWlteDFfYWRkX2lteF91YXJ0MCgmdWFydF9wZGF0YSk7CiAKIAlwcmludGsoS0VSTl9JTkZPIlNjYjkzMjg6IEFkZGluZyBkZXZpY2VzXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtdnByMjAwLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXZwcjIwMC5jCmluZGV4IGQ3NGUzNDcuLjdkOGUwMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtdnByMjAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC12cHIyMDAuYwpAQCAtMjY3LDYgKzI2Nyw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCB2cHIyMDBfYm9hcmRfaW5pdCh2b2lkKQogeworCWlteDM1X3NvY19pbml0KCk7CisKIAlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyh2cHIyMDBfcGFkcywgQVJSQVlfU0laRSh2cHIyMDBfcGFkcykpOwogCiAJaW14MzVfYWRkX2ZlYyhOVUxMKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDEuYyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDEuYwppbmRleCAyZTQ4MmJhLi4yYmRlZDU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MS5jCkBAIC0yMyw3ICsyMyw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL2lvbXV4LXYxLmg+CiAKQEAgLTQ0LDE1ICs0MywxOSBAQAogCQkJTVgxX05VTV9HUElPX1BPUlQpOwogfQogCi1zdGF0aWMgc3RydWN0IG14Y19ncGlvX3BvcnQgaW14MV9ncGlvX3BvcnRzW10gPSB7Ci0JREVGSU5FX0lNWF9HUElPX1BPUlRfSVJRKE1YMSwgMCwgMSwgTVgxX0dQSU9fSU5UX1BPUlRBKSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVF9JUlEoTVgxLCAxLCAyLCBNWDFfR1BJT19JTlRfUE9SVEIpLAotCURFRklORV9JTVhfR1BJT19QT1JUX0lSUShNWDEsIDIsIDMsIE1YMV9HUElPX0lOVF9QT1JUQyksCi0JREVGSU5FX0lNWF9HUElPX1BPUlRfSVJRKE1YMSwgMywgNCwgTVgxX0dQSU9fSU5UX1BPUlREKSwKLX07Ci0KIHZvaWQgX19pbml0IG14MV9pbml0X2lycSh2b2lkKQogewogCW14Y19pbml0X2lycShNWDFfSU9fQUREUkVTUyhNWDFfQVZJQ19CQVNFX0FERFIpKTsKLQlteGNfZ3Bpb19pbml0KGlteDFfZ3Bpb19wb3J0cywJQVJSQVlfU0laRShpbXgxX2dwaW9fcG9ydHMpKTsKK30KKwordm9pZCBfX2luaXQgaW14MV9zb2NfaW5pdCh2b2lkKQoreworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgxLWdwaW8iLCAwLCBNWDFfR1BJTzFfQkFTRV9BRERSLCBTWl8yNTYsCisJCQkJCQlNWDFfR1BJT19JTlRfUE9SVEEsIDApOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgxLWdwaW8iLCAxLCBNWDFfR1BJTzJfQkFTRV9BRERSLCBTWl8yNTYsCisJCQkJCQlNWDFfR1BJT19JTlRfUE9SVEIsIDApOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgxLWdwaW8iLCAyLCBNWDFfR1BJTzNfQkFTRV9BRERSLCBTWl8yNTYsCisJCQkJCQlNWDFfR1BJT19JTlRfUE9SVEMsIDApOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgxLWdwaW8iLCAzLCBNWDFfR1BJTzRfQkFTRV9BRERSLCBTWl8yNTYsCisJCQkJCQlNWDFfR1BJT19JTlRfUE9SVEQsIDApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjEuYyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDIxLmMKaW5kZXggN2EwYzUwMC4uNmQ3ZDUxOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgyMS5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtdjEuaD4KIApAQCAtNzAsMTcgKzY5LDE3IEBACiAJCQlNWDIxX05VTV9HUElPX1BPUlQpOwogfQogCi1zdGF0aWMgc3RydWN0IG14Y19ncGlvX3BvcnQgaW14MjFfZ3Bpb19wb3J0c1tdID0gewotCURFRklORV9JTVhfR1BJT19QT1JUX0lSUShNWDIxLCAwLCAxLCBNWDIxX0lOVF9HUElPKSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVChNWDIxLCAxLCAyKSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVChNWDIxLCAyLCAzKSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVChNWDIxLCAzLCA0KSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVChNWDIxLCA0LCA1KSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVChNWDIxLCA1LCA2KSwKLX07Ci0KIHZvaWQgX19pbml0IG14MjFfaW5pdF9pcnEodm9pZCkKIHsKIAlteGNfaW5pdF9pcnEoTVgyMV9JT19BRERSRVNTKE1YMjFfQVZJQ19CQVNFX0FERFIpKTsKLQlteGNfZ3Bpb19pbml0KGlteDIxX2dwaW9fcG9ydHMsCUFSUkFZX1NJWkUoaW14MjFfZ3Bpb19wb3J0cykpOworfQorCit2b2lkIF9faW5pdCBpbXgyMV9zb2NfaW5pdCh2b2lkKQoreworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgyMS1ncGlvIiwgMCwgTVgyMV9HUElPMV9CQVNFX0FERFIsIFNaXzI1NiwgTVgyMV9JTlRfR1BJTywgMCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDIxLWdwaW8iLCAxLCBNWDIxX0dQSU8yX0JBU0VfQUREUiwgU1pfMjU2LCBNWDIxX0lOVF9HUElPLCAwKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MjEtZ3BpbyIsIDIsIE1YMjFfR1BJTzNfQkFTRV9BRERSLCBTWl8yNTYsIE1YMjFfSU5UX0dQSU8sIDApOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgyMS1ncGlvIiwgMywgTVgyMV9HUElPNF9CQVNFX0FERFIsIFNaXzI1NiwgTVgyMV9JTlRfR1BJTywgMCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDIxLWdwaW8iLCA0LCBNWDIxX0dQSU81X0JBU0VfQUREUiwgU1pfMjU2LCBNWDIxX0lOVF9HUElPLCAwKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MjEtZ3BpbyIsIDUsIE1YMjFfR1BJTzZfQkFTRV9BRERSLCBTWl8yNTYsIE1YMjFfSU5UX0dQSU8sIDApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjUuYyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDI1LmMKaW5kZXggMDJmN2I1Yy4uOWExNTkxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgyNS5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbXgyNS5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtdjMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogLyoKQEAgLTU3LDE2ICs1NiwxNiBAQAogCW14Y19hcmNoX3Jlc2V0X2luaXQoTVgyNV9JT19BRERSRVNTKE1YMjVfV0RPR19CQVNFX0FERFIpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBteGNfZ3Bpb19wb3J0IGlteDI1X2dwaW9fcG9ydHNbXSA9IHsKLQlERUZJTkVfSU1YX0dQSU9fUE9SVF9JUlEoTVgyNSwgMCwgMSwgTVgyNV9JTlRfR1BJTzEpLAotCURFRklORV9JTVhfR1BJT19QT1JUX0lSUShNWDI1LCAxLCAyLCBNWDI1X0lOVF9HUElPMiksCi0JREVGSU5FX0lNWF9HUElPX1BPUlRfSVJRKE1YMjUsIDIsIDMsIE1YMjVfSU5UX0dQSU8zKSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVF9JUlEoTVgyNSwgMywgNCwgTVgyNV9JTlRfR1BJTzQpLAotfTsKLQogdm9pZCBfX2luaXQgbXgyNV9pbml0X2lycSh2b2lkKQogewogCW14Y19pbml0X2lycShNWDI1X0lPX0FERFJFU1MoTVgyNV9BVklDX0JBU0VfQUREUikpOwotCW14Y19ncGlvX2luaXQoaW14MjVfZ3Bpb19wb3J0cywJQVJSQVlfU0laRShpbXgyNV9ncGlvX3BvcnRzKSk7CiB9CiAKK3ZvaWQgX19pbml0IGlteDI1X3NvY19pbml0KHZvaWQpCit7CisJLyogaS5teDI1IGhhcyB0aGUgaS5teDMxIHR5cGUgZ3BpbyAqLworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMCwgTVgyNV9HUElPMV9CQVNFX0FERFIsIFNaXzE2SywgTVgyNV9JTlRfR1BJTzEsIDApOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMSwgTVgyNV9HUElPMl9CQVNFX0FERFIsIFNaXzE2SywgTVgyNV9JTlRfR1BJTzIsIDApOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMiwgTVgyNV9HUElPM19CQVNFX0FERFIsIFNaXzE2SywgTVgyNV9JTlRfR1BJTzMsIDApOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMywgTVgyNV9HUElPNF9CQVNFX0FERFIsIFNaXzE2SywgTVgyNV9JTlRfR1BJTzQsIDApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjcuYyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDI3LmMKaW5kZXggYTY3NjFhMy4uMTMzYjMwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjcuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgyNy5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtdjEuaD4KIApAQCAtNzAsMTcgKzY5LDE4IEBACiAJCQlNWDI3X05VTV9HUElPX1BPUlQpOwogfQogCi1zdGF0aWMgc3RydWN0IG14Y19ncGlvX3BvcnQgaW14MjdfZ3Bpb19wb3J0c1tdID0gewotCURFRklORV9JTVhfR1BJT19QT1JUX0lSUShNWDI3LCAwLCAxLCBNWDI3X0lOVF9HUElPKSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVChNWDI3LCAxLCAyKSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVChNWDI3LCAyLCAzKSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVChNWDI3LCAzLCA0KSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVChNWDI3LCA0LCA1KSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVChNWDI3LCA1LCA2KSwKLX07Ci0KIHZvaWQgX19pbml0IG14MjdfaW5pdF9pcnEodm9pZCkKIHsKIAlteGNfaW5pdF9pcnEoTVgyN19JT19BRERSRVNTKE1YMjdfQVZJQ19CQVNFX0FERFIpKTsKLQlteGNfZ3Bpb19pbml0KGlteDI3X2dwaW9fcG9ydHMsCUFSUkFZX1NJWkUoaW14MjdfZ3Bpb19wb3J0cykpOworfQorCit2b2lkIF9faW5pdCBpbXgyN19zb2NfaW5pdCh2b2lkKQoreworCS8qIGkubXgyNyBoYXMgdGhlIGkubXgyMSB0eXBlIGdwaW8gKi8KKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MjEtZ3BpbyIsIDAsIE1YMjdfR1BJTzFfQkFTRV9BRERSLCBTWl8yNTYsIE1YMjdfSU5UX0dQSU8sIDApOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgyMS1ncGlvIiwgMSwgTVgyN19HUElPMl9CQVNFX0FERFIsIFNaXzI1NiwgTVgyN19JTlRfR1BJTywgMCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDIxLWdwaW8iLCAyLCBNWDI3X0dQSU8zX0JBU0VfQUREUiwgU1pfMjU2LCBNWDI3X0lOVF9HUElPLCAwKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MjEtZ3BpbyIsIDMsIE1YMjdfR1BJTzRfQkFTRV9BRERSLCBTWl8yNTYsIE1YMjdfSU5UX0dQSU8sIDApOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgyMS1ncGlvIiwgNCwgTVgyN19HUElPNV9CQVNFX0FERFIsIFNaXzI1NiwgTVgyN19JTlRfR1BJTywgMCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDIxLWdwaW8iLCA1LCBNWDI3X0dQSU82X0JBU0VfQUREUiwgU1pfMjU2LCBNWDI3X0lOVF9HUElPLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzMS5jCmluZGV4IDg2YjliNDUuLjZkMTAzYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzEuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtdjMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDMxX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewpAQCAtNTMsMTQgKzUyLDE0IEBACiAJbXhjX2FyY2hfcmVzZXRfaW5pdChNWDMxX0lPX0FERFJFU1MoTVgzMV9XRE9HX0JBU0VfQUREUikpOwogfQogCi1zdGF0aWMgc3RydWN0IG14Y19ncGlvX3BvcnQgaW14MzFfZ3Bpb19wb3J0c1tdID0gewotCURFRklORV9JTVhfR1BJT19QT1JUX0lSUShNWDMxLCAwLCAxLCBNWDMxX0lOVF9HUElPMSksCi0JREVGSU5FX0lNWF9HUElPX1BPUlRfSVJRKE1YMzEsIDEsIDIsIE1YMzFfSU5UX0dQSU8yKSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVF9JUlEoTVgzMSwgMiwgMywgTVgzMV9JTlRfR1BJTzMpLAotfTsKLQogdm9pZCBfX2luaXQgbXgzMV9pbml0X2lycSh2b2lkKQogewogCW14Y19pbml0X2lycShNWDMxX0lPX0FERFJFU1MoTVgzMV9BVklDX0JBU0VfQUREUikpOwotCW14Y19ncGlvX2luaXQoaW14MzFfZ3Bpb19wb3J0cywJQVJSQVlfU0laRShpbXgzMV9ncGlvX3BvcnRzKSk7Cit9CisKK3ZvaWQgX19pbml0IGlteDMxX3NvY19pbml0KHZvaWQpCit7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAwLCBNWDMxX0dQSU8xX0JBU0VfQUREUiwgU1pfMTZLLCBNWDMxX0lOVF9HUElPMSwgMCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAxLCBNWDMxX0dQSU8yX0JBU0VfQUREUiwgU1pfMTZLLCBNWDMxX0lOVF9HUElPMiwgMCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDMxX0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDMxX0lOVF9HUElPMywgMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzNS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzUuYwppbmRleCBjODgwZTZkLi5iYjA2OGJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDM1LmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lvbXV4LXYzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXgzNV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKQEAgLTUwLDE0ICs0OSwxNSBAQAogCW14Y19hcmNoX3Jlc2V0X2luaXQoTVgzNV9JT19BRERSRVNTKE1YMzVfV0RPR19CQVNFX0FERFIpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBteGNfZ3Bpb19wb3J0IGlteDM1X2dwaW9fcG9ydHNbXSA9IHsKLQlERUZJTkVfSU1YX0dQSU9fUE9SVF9JUlEoTVgzNSwgMCwgMSwgTVgzNV9JTlRfR1BJTzEpLAotCURFRklORV9JTVhfR1BJT19QT1JUX0lSUShNWDM1LCAxLCAyLCBNWDM1X0lOVF9HUElPMiksCi0JREVGSU5FX0lNWF9HUElPX1BPUlRfSVJRKE1YMzUsIDIsIDMsIE1YMzVfSU5UX0dQSU8zKSwKLX07Ci0KIHZvaWQgX19pbml0IG14MzVfaW5pdF9pcnEodm9pZCkKIHsKIAlteGNfaW5pdF9pcnEoTVgzNV9JT19BRERSRVNTKE1YMzVfQVZJQ19CQVNFX0FERFIpKTsKLQlteGNfZ3Bpb19pbml0KGlteDM1X2dwaW9fcG9ydHMsCUFSUkFZX1NJWkUoaW14MzVfZ3Bpb19wb3J0cykpOworfQorCit2b2lkIF9faW5pdCBpbXgzNV9zb2NfaW5pdCh2b2lkKQoreworCS8qIGkubXgzNSBoYXMgdGhlIGkubXgzMSB0eXBlIGdwaW8gKi8KKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDAsIE1YMzVfR1BJTzFfQkFTRV9BRERSLCBTWl8xNkssIE1YMzVfSU5UX0dQSU8xLCAwKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDEsIE1YMzVfR1BJTzJfQkFTRV9BRERSLCBTWl8xNkssIE1YMzVfSU5UX0dQSU8yLCAwKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDIsIE1YMzVfR1BJTzNfQkFTRV9BRERSLCBTWl8xNkssIE1YMzVfSU5UX0dQSU8zLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L214MzFsaXRlLWRiLmMgYi9hcmNoL2FybS9tYWNoLWlteC9teDMxbGl0ZS1kYi5jCmluZGV4IDVhYTA1M2UuLmJmMGZiODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L214MzFsaXRlLWRiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbXgzMWxpdGUtZGIuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiAKIC8qIEdQSU8gTEVEcyAqLwogCi1zdGF0aWMgc3RydWN0IGdwaW9fbGVkIGxpdGVraXRfbGVkc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZCBsaXRla2l0X2xlZHNbXSBfX2luaXRjb25zdCA9IHsKIAl7CiAJCS5uYW1lICAgICAgICAgICA9ICJHUElPMCIsCiAJCS5ncGlvICAgICAgICAgICA9IElPTVVYX1RPX0dQSU8oTVgzMV9QSU5fQ09NUEFSRSksCkBAIC0xNzYsMTkgKzE3NiwxMiBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBsaXRla2l0X2xlZF9wbGF0Zm9ybV9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhCisJCWxpdGVraXRfbGVkX3BsYXRmb3JtX2RhdGEgX19pbml0Y29uc3QgPSB7CiAJLmxlZHMgICAgICAgICAgID0gbGl0ZWtpdF9sZWRzLAogCS5udW1fbGVkcyAgICAgICA9IEFSUkFZX1NJWkUobGl0ZWtpdF9sZWRzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxpdGVraXRfbGVkX2RldmljZSA9IHsKLQkubmFtZSAgID0gImxlZHMtZ3BpbyIsCi0JLmlkICAgICA9IC0xLAotCS5kZXYgICAgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gJmxpdGVraXRfbGVkX3BsYXRmb3JtX2RhdGEsCi0JfSwKLX07Ci0KIHZvaWQgX19pbml0IG14MzFsaXRlX2RiX2luaXQodm9pZCkKIHsKIAlteGNfaW9tdXhfc2V0dXBfbXVsdGlwbGVfcGlucyhsaXRla2l0X2RiX2JvYXJkX3BpbnMsCkBAIC0xOTcsNyArMTkwLDcgQEAKIAlpbXgzMV9hZGRfaW14X3VhcnQwKCZ1YXJ0X3BkYXRhKTsKIAlpbXgzMV9hZGRfbXhjX21tYygwLCAmbW1jX3BkYXRhKTsKIAlpbXgzMV9hZGRfc3BpX2lteDAoJnNwaTBfcGRhdGEpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbGl0ZWtpdF9sZWRfZGV2aWNlKTsKKwlncGlvX2xlZF9yZWdpc3Rlcl9kZXZpY2UoLTEsICZsaXRla2l0X2xlZF9wbGF0Zm9ybV9kYXRhKTsKIAlpbXgzMV9hZGRfaW14Ml93ZHQoTlVMTCk7CiAJaW14MzFfYWRkX214Y19ydGMoTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW5jbHVkZS9tYWNoL2JpdHMuaCBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbmNsdWRlL21hY2gvYml0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWIwMjRlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbmNsdWRlL21hY2gvYml0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotLyogRE8gTk9UIEVESVQhISAtIHRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotICogICAgICAgICAgICAgICAgIGZyb20gLnMgZmlsZSBieSBhd2sgLWYgczJoLmF3awotICovCi0vKiAgQml0IGZpZWxkIGRlZmluaXRpb25zCi0gKiAgQ29weXJpZ2h0IChDKSBBUk0gTGltaXRlZCAxOTk4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICovCi0KLSNpZm5kZWYgX19iaXRzX2gKLSNkZWZpbmUgX19iaXRzX2ggICAgICAgICAgICAgICAgICAgICAgICAxCi0KLSNkZWZpbmUgQklUMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEJJVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBCSVQyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQklUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEJJVDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBCSVQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgQklUNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEJJVDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBCSVQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgQklUOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIEJJVDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBCSVQxMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgQklUMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIEJJVDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBCSVQxNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgQklUMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEJJVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBCSVQxNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgQklUMTggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIEJJVDE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBCSVQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgQklUMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIEJJVDIyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBCSVQyMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgQklUMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIEJJVDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBCSVQyNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgQklUMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0jZGVmaW5lIEJJVDI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBCSVQyOSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgQklUMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEJJVDMxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotCi0jZW5kaWYKLQotLyogICAgICAgICBFTkQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3NldHVwLmMKaW5kZXggNWMxNDdmYi4uYTViOTg5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3NldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3NldHVwLmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2lmZGVmIENPTkZJR19NVERfUEhZU01BUApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2F2aWxhLXNldHVwLmMKaW5kZXggNzM3NDVmZi4uZWUxOWMxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9hdmlsYS1zZXR1cC5jCkBAIC0xNjksNiArMTY5LDkgQEAKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKIAkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCiAJLmluaXRfbWFjaGluZQk9IGF2aWxhX2luaXQsCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLAorI2VuZGlmCiBNQUNISU5FX0VORAogCiAgLyoKQEAgLTE4NCw2ICsxODcsOSBAQAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAogCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gYXZpbGFfaW5pdCwKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLmRtYV96b25lX3NpemUJPSBTWl82NE0sCisjZW5kaWYKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jCmluZGV4IGU5YTU4OTMuLmUyZTk4YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMKQEAgLTMxNiw2ICszMTYsMTEgQEAKIH0KIAogCitzdGF0aWMgaW50IGl4cDR4eF9uZWVkc19ib3VuY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gKGRtYV9hZGRyICsgc2l6ZSkgPj0gU1pfNjRNOworfQorCiAvKgogICogU2V0dXAgRE1BIG1hc2sgdG8gNjRNQiBvbiBQQ0kgZGV2aWNlcy4gSWdub3JlIGFsbCBvdGhlciBkZXZpY2VzLgogICovCkBAIC0zMjQsNyArMzI5LDcgQEAKIAlpZihkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlKSB7CiAJCSpkZXYtPmRtYV9tYXNrID0gIFNaXzY0TSAtIDE7CiAJCWRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBTWl82NE0gLSAxOwotCQlkbWFib3VuY2VfcmVnaXN0ZXJfZGV2KGRldiwgMjA0OCwgNDA5Nik7CisJCWRtYWJvdW5jZV9yZWdpc3Rlcl9kZXYoZGV2LCAyMDQ4LCA0MDk2LCBpeHA0eHhfbmVlZHNfYm91bmNlKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zMzcsMTEgKzM0Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkbWFfbmVlZHNfYm91bmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUpCi17Ci0JcmV0dXJuIChkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlICkgJiYgKChkbWFfYWRkciArIHNpemUpID49IFNaXzY0TSk7Ci19Ci0KIHZvaWQgX19pbml0IGl4cDR4eF9wY2lfcHJlaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgY3B1aWQgPSByZWFkX2NwdWlkX2lkKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCmluZGV4IDc0ZWQ4MWEuLjA3NzcyNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCkBAIC00MTksMTQgKzQxOSwyMCBAQAogLyoKICAqIGNsb2Nrc291cmNlCiAgKi8KKworc3RhdGljIGN5Y2xlX3QgaXhwNHh4X2Nsb2Nrc291cmNlX3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjKQoreworCXJldHVybiAqSVhQNFhYX09TVFM7Cit9CisKIHVuc2lnbmVkIGxvbmcgaXhwNHh4X3RpbWVyX2ZyZXEgPSBJWFA0WFhfVElNRVJfRlJFUTsKIEVYUE9SVF9TWU1CT0woaXhwNHh4X3RpbWVyX2ZyZXEpOwogc3RhdGljIHZvaWQgX19pbml0IGl4cDR4eF9jbG9ja3NvdXJjZV9pbml0KHZvaWQpCiB7CiAJaW5pdF9zY2hlZF9jbG9jaygmY2QsIGl4cDR4eF91cGRhdGVfc2NoZWRfY2xvY2ssIDMyLCBpeHA0eHhfdGltZXJfZnJlcSk7CiAKLQljbG9ja3NvdXJjZV9tbWlvX2luaXQoJklYUDRYWF9PU1RTLCAiT1NUUyIsIGl4cDR4eF90aW1lcl9mcmVxLCAyMDAsIDMyLAotCQkJY2xvY2tzb3VyY2VfbW1pb19yZWFkbF91cCk7CisJY2xvY2tzb3VyY2VfbW1pb19pbml0KE5VTEwsICJPU1RTIiwgaXhwNHh4X3RpbWVyX2ZyZXEsIDIwMCwgMzIsCisJCQlpeHA0eHhfY2xvY2tzb3VyY2VfcmVhZCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jCmluZGV4IDM1NWUzZGUuLmUyNDU2NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jCkBAIC0xMTQsNiArMTE0LDkgQEAKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKIAkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCiAJLmluaXRfbWFjaGluZQk9IGNveW90ZV9pbml0LAorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKKyNlbmRpZgogTUFDSElORV9FTkQKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9kc21nNjAwLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9kc21nNjAwLXNldHVwLmMKaW5kZXggZDM5ODIyOS4uMDNlNTQ1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2RzbWc2MDAtc2V0dXAuYwpAQCAtMjg0LDQgKzI4NCw3IEBACiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lciAgICAgICAgICA9ICZkc21nNjAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBkc21nNjAwX2luaXQsCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLAorI2VuZGlmCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZnNnLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctc2V0dXAuYwppbmRleCA3MjdlZTM5Li4yM2E4YjM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctc2V0dXAuYwpAQCAtMjc1LDUgKzI3NSw4IEBACiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAogCS5pbml0X21hY2hpbmUJPSBmc2dfaW5pdCwKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLmRtYV96b25lX3NpemUJPSBTWl82NE0sCisjZW5kaWYKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dhdGV3YXk3MDAxLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9nYXRld2F5NzAwMS1zZXR1cC5jCmluZGV4IDlkYzBiNGUuLmQ0Zjg1MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dhdGV3YXk3MDAxLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ2F0ZXdheTcwMDEtc2V0dXAuYwpAQCAtMTAxLDUgKzEwMSw4IEBACiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAogCS5pbml0X21hY2hpbmUJPSBnYXRld2F5NzAwMV9pbml0LAorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKKyNlbmRpZgogTUFDSElORV9FTkQKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ29yYW1vX21sci5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ29yYW1vX21sci5jCmluZGV4IDNlOGMwZTMuLjVmMDBhZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dvcmFtb19tbHIuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9nb3JhbW9fbWxyLmMKQEAgLTUwMSw0ICs1MDEsNyBAQAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAogCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZ21scl9pbml0LAorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKKyNlbmRpZgogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jCmluZGV4IDc3YWJlYWQuLjM3OTBkZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYwpAQCAtMTY5LDYgKzE2OSw5IEBACiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAogCS5pbml0X21hY2hpbmUJPSBndHd4NTcxNV9pbml0LAorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKKyNlbmRpZgogTUFDSElORV9FTkQKIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggMzRlNzk0MC4uNGNhZjE3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMTQsOCArMTQsNCBAQAogICovCiAjZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKIAotI2lmZGVmIENPTkZJR19QQ0kKLSNkZWZpbmUgQVJNX0RNQV9aT05FX1NJWkUJU1pfNjRNCi0jZW5kaWYKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKaW5kZXggZGNhNGY3Zi4uNmEyOTI3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYwpAQCAtMjU4LDYgKzI1OCw5IEBACiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAogCS5pbml0X21hY2hpbmUJPSBpeGRwNDI1X2luaXQsCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLAorI2VuZGlmCiBNQUNISU5FX0VORAogI2VuZGlmCiAKQEAgLTI2OSw2ICsyNzIsOSBAQAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAogCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gaXhkcDQyNV9pbml0LAorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKKyNlbmRpZgogTUFDSElORV9FTkQKICNlbmRpZgogCkBAIC0yODAsNiArMjg2LDkgQEAKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKIAkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCiAJLmluaXRfbWFjaGluZQk9IGl4ZHA0MjVfaW5pdCwKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLmRtYV96b25lX3NpemUJPSBTWl82NE0sCisjZW5kaWYKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKIApAQCAtMjkxLDUgKzMwMCw4IEBACiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAogCS5pbml0X21hY2hpbmUJPSBpeGRwNDI1X2luaXQsCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLAorI2VuZGlmCiBNQUNISU5FX0VORAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXNldHVwLmMKaW5kZXggZjE4ZmVlNy4uYWZiNTE4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtc2V0dXAuYwpAQCAtMzE5LDQgKzMxOSw3IEBACiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lciAgICAgICAgICA9ICZpeHA0eHhfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IG5hczEwMGRfaW5pdCwKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLmRtYV96b25lX3NpemUJPSBTWl82NE0sCisjZW5kaWYKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItc2V0dXAuYwppbmRleCBmNzliNjJlLi42OWU0MGYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMKQEAgLTMwNSw0ICszMDUsNyBAQAogCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIgICAgICAgICAgPSAmbnNsdTJfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IG5zbHUyX2luaXQsCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLAorI2VuZGlmCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvdnVsY2FuLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC92dWxjYW4tc2V0dXAuYwppbmRleCA0ZTcyY2ZkLi4wNDUzMzZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC92dWxjYW4tc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC92dWxjYW4tc2V0dXAuYwpAQCAtMjQxLDQgKzI0MSw3IEBACiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAogCS5pbml0X21hY2hpbmUJPSB2dWxjYW5faW5pdCwKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLmRtYV96b25lX3NpemUJPSBTWl82NE0sCisjZW5kaWYKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC93ZzMwMnYyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC93ZzMwMnYyLXNldHVwLmMKaW5kZXggNWQxNDhjNy4uNDBiOWZhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvd2czMDJ2Mi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L3dnMzAydjItc2V0dXAuYwpAQCAtMTAyLDUgKzEwMiw4IEBACiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCiAJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAogCS5pbml0X21hY2hpbmUJPSB3ZzMwMnYyX2luaXQsCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLAorI2VuZGlmCiBNQUNISU5FX0VORAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxva2kvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtbG9raS9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQ1YmRkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotaWYgQVJDSF9MT0tJCi0KLW1lbnUgIk1hcnZlbGwgTG9raSAoODhSQzg0ODApIEltcGxlbWVudGF0aW9ucyIKLQotY29uZmlnIE1BQ0hfTEI4OFJDODQ4MAotCWJvb2wgIk1hcnZlbGwgTEI4OFJDODQ4MCBEZXZlbG9wbWVudCBCb2FyZCIKLQloZWxwCi0JICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUKLQkgIE1hcnZlbGwgTEI4OFJDODQ4MCBEZXZlbG9wbWVudCBCb2FyZC4KLQotZW5kbWVudQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sb2tpL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1sb2tpL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDMyMzNlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb2JqLXkJCQkJKz0gY29tbW9uLm8gYWRkci1tYXAubyBpcnEubwotCi1vYmotJChDT05GSUdfTUFDSF9MQjg4UkM4NDgwKQkrPSBsYjg4cmM4NDgwLXNldHVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbG9raS9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1sb2tpL01ha2VmaWxlLmJvb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDM5YzMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sb2tpL01ha2VmaWxlLmJvb3QKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSAgIHpyZWxhZGRyLXkJOj0gMHgwMDAwODAwMAotcGFyYW1zX3BoeXMteQk6PSAweDAwMDAwMTAwCi1pbml0cmRfcGh5cy15CTo9IDB4MDA4MDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbG9raS9hZGRyLW1hcC5jIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2FkZHItbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NTM3YzkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sb2tpL2FkZHItbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbG9raS9hZGRyLW1hcC5jCi0gKgotICogQWRkcmVzcyBtYXAgZnVuY3Rpb25zIGZvciBNYXJ2ZWxsIExva2kgKDg4UkM4NDgwKSBTb0NzCi0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tYnVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLS8qCi0gKiBHZW5lcmljIEFkZHJlc3MgRGVjb2RlIFdpbmRvd3MgYml0IHNldHRpbmdzCi0gKi8KLSNkZWZpbmUgVEFSR0VUX0REUgkJMAotI2RlZmluZSBUQVJHRVRfREVWX0JVUwkJMQotI2RlZmluZSBUQVJHRVRfUENJRTAJCTMKLSNkZWZpbmUgVEFSR0VUX1BDSUUxCQk0Ci0jZGVmaW5lIEFUVFJfREVWX0JPT1QJCTB4MGYKLSNkZWZpbmUgQVRUUl9ERVZfQ1MyCQkweDFiCi0jZGVmaW5lIEFUVFJfREVWX0NTMQkJMHgxZAotI2RlZmluZSBBVFRSX0RFVl9DUzAJCTB4MWUKLSNkZWZpbmUgQVRUUl9QQ0lFX0lPCQkweDUxCi0jZGVmaW5lIEFUVFJfUENJRV9NRU0JCTB4NTkKLQotLyoKLSAqIEhlbHBlcnMgdG8gZ2V0IEREUiBiYW5rIGluZm8KLSAqLwotI2RlZmluZSBERFJfU0laRV9DUyhuKQkJRERSX1JFRygweDE1MDAgKyAoKG4pIDw8IDMpKQotI2RlZmluZSBERFJfQkFTRV9DUyhuKQkJRERSX1JFRygweDE1MDQgKyAoKG4pIDw8IDMpKQotCi0vKgotICogQ1BVIEFkZHJlc3MgRGVjb2RlIFdpbmRvd3MgcmVnaXN0ZXJzCi0gKi8KLSNkZWZpbmUgQlJJREdFX1JFRyh4KQkJKEJSSURHRV9WSVJUX0JBU0UgfCAoeCkpCi0jZGVmaW5lIENQVV9XSU5fQ1RSTChuKQkJQlJJREdFX1JFRygweDAwMCB8ICgobikgPDwgNCkpCi0jZGVmaW5lIENQVV9XSU5fQkFTRShuKQkJQlJJREdFX1JFRygweDAwNCB8ICgobikgPDwgNCkpCi0jZGVmaW5lIENQVV9XSU5fUkVNQVBfTE8obikJQlJJREdFX1JFRygweDAwOCB8ICgobikgPDwgNCkpCi0jZGVmaW5lIENQVV9XSU5fUkVNQVBfSEkobikJQlJJREdFX1JFRygweDAwYyB8ICgobikgPDwgNCkpCi0KLQotc3RydWN0IG1idXNfZHJhbV90YXJnZXRfaW5mbyBsb2tpX21idXNfZHJhbV9pbmZvOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfY3B1X3dpbihpbnQgd2luLCB1MzIgYmFzZSwgdTMyIHNpemUsCi0JCQkJIHU4IHRhcmdldCwgdTggYXR0ciwgaW50IHJlbWFwKQotewotCXUzMiBjdHJsOwotCi0JYmFzZSAmPSAweGZmZmYwMDAwOwotCWN0cmwgPSAoKHNpemUgLSAxKSAmIDB4ZmZmZjAwMDApIHwgKGF0dHIgPDwgOCkgfCAoMSA8PCA1KSB8IHRhcmdldDsKLQotCXdyaXRlbChiYXNlLCBDUFVfV0lOX0JBU0Uod2luKSk7Ci0Jd3JpdGVsKGN0cmwsIENQVV9XSU5fQ1RSTCh3aW4pKTsKLQlpZiAod2luIDwgMikgewotCQlpZiAocmVtYXAgPCAwKQotCQkJcmVtYXAgPSBiYXNlOwotCi0JCXdyaXRlbChyZW1hcCAmIDB4ZmZmZjAwMDAsIENQVV9XSU5fUkVNQVBfTE8od2luKSk7Ci0JCXdyaXRlbCgwLCBDUFVfV0lOX1JFTUFQX0hJKHdpbikpOwotCX0KLX0KLQotdm9pZCBfX2luaXQgbG9raV9zZXR1cF9jcHVfbWJ1cyh2b2lkKQotewotCWludCBpOwotCWludCBjczsKLQotCS8qCi0JICogRmlyc3QsIGRpc2FibGUgYW5kIGNsZWFyIHdpbmRvd3MuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQl3cml0ZWwoMCwgQ1BVX1dJTl9CQVNFKGkpKTsKLQkJd3JpdGVsKDAsIENQVV9XSU5fQ1RSTChpKSk7Ci0JCWlmIChpIDwgMikgewotCQkJd3JpdGVsKDAsIENQVV9XSU5fUkVNQVBfTE8oaSkpOwotCQkJd3JpdGVsKDAsIENQVV9XSU5fUkVNQVBfSEkoaSkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBTZXR1cCB3aW5kb3dzIGZvciBQQ0llIElPK01FTSBzcGFjZS4KLQkgKi8KLQlzZXR1cF9jcHVfd2luKDIsIExPS0lfUENJRTBfTUVNX1BIWVNfQkFTRSwgTE9LSV9QQ0lFMF9NRU1fU0laRSwKLQkJICAgICAgVEFSR0VUX1BDSUUwLCBBVFRSX1BDSUVfTUVNLCAtMSk7Ci0Jc2V0dXBfY3B1X3dpbigzLCBMT0tJX1BDSUUxX01FTV9QSFlTX0JBU0UsIExPS0lfUENJRTFfTUVNX1NJWkUsCi0JCSAgICAgIFRBUkdFVF9QQ0lFMSwgQVRUUl9QQ0lFX01FTSwgLTEpOwotCi0JLyoKLQkgKiBTZXR1cCBNQlVTIGRyYW0gdGFyZ2V0IGluZm8uCi0JICovCi0JbG9raV9tYnVzX2RyYW1faW5mby5tYnVzX2RyYW1fdGFyZ2V0X2lkID0gVEFSR0VUX0REUjsKLQotCWZvciAoaSA9IDAsIGNzID0gMDsgaSA8IDQ7IGkrKykgewotCQl1MzIgYmFzZSA9IHJlYWRsKEREUl9CQVNFX0NTKGkpKTsKLQkJdTMyIHNpemUgPSByZWFkbChERFJfU0laRV9DUyhpKSk7Ci0KLQkJLyoKLQkJICogQ2hpcCBzZWxlY3QgZW5hYmxlZD8KLQkJICovCi0JCWlmIChzaXplICYgMSkgewotCQkJc3RydWN0IG1idXNfZHJhbV93aW5kb3cgKnc7Ci0KLQkJCXcgPSAmbG9raV9tYnVzX2RyYW1faW5mby5jc1tjcysrXTsKLQkJCXctPmNzX2luZGV4ID0gaTsKLQkJCXctPm1idXNfYXR0ciA9IDB4ZiAmIH4oMSA8PCBpKTsKLQkJCXctPmJhc2UgPSBiYXNlICYgMHhmZmZmMDAwMDsKLQkJCXctPnNpemUgPSAoc2l6ZSB8IDB4MDAwMGZmZmYpICsgMTsKLQkJfQotCX0KLQlsb2tpX21idXNfZHJhbV9pbmZvLm51bV9jcyA9IGNzOwotfQotCi12b2lkIF9faW5pdCBsb2tpX3NldHVwX2Rldl9ib290X3dpbih1MzIgYmFzZSwgdTMyIHNpemUpCi17Ci0Jc2V0dXBfY3B1X3dpbig0LCBiYXNlLCBzaXplLCBUQVJHRVRfREVWX0JVUywgQVRUUl9ERVZfQk9PVCwgLTEpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sb2tpL2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2NvbW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjAyNjY0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9jb21tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1sb2tpL2NvbW1vbi5jCi0gKgotICogQ29yZSBmdW5jdGlvbnMgZm9yIE1hcnZlbGwgTG9raSAoODhSQzg0ODApIFNvQ3MKLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWJ1cy5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vdGltZXguaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0jaW5jbHVkZSA8bWFjaC9icmlkZ2UtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvbG9raS5oPgotI2luY2x1ZGUgPHBsYXQvb3Jpb25fbmFuZC5oPgotI2luY2x1ZGUgPHBsYXQvdGltZS5oPgotI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+Ci0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSS9PIEFkZHJlc3MgTWFwcGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGxva2lfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9IExPS0lfUkVHU19WSVJUX0JBU0UsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihMT0tJX1JFR1NfUEhZU19CQVNFKSwKLQkJLmxlbmd0aAkJPSBMT0tJX1JFR1NfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi19OwotCi12b2lkIF9faW5pdCBsb2tpX21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChsb2tpX2lvX2Rlc2MsIEFSUkFZX1NJWkUobG9raV9pb19kZXNjKSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBHRTAwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX19pbml0IGxva2lfZ2UwX2luaXQoc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgKmV0aF9kYXRhKQotewotCXdyaXRlbCgweDAwMDc5MjIwLCBHRTBfVklSVF9CQVNFICsgMHgyMGIwKTsKLQotCW9yaW9uX2dlMDBfaW5pdChldGhfZGF0YSwgJmxva2lfbWJ1c19kcmFtX2luZm8sCi0JCQlHRTBfUEhZU19CQVNFLCBJUlFfTE9LSV9HQkVfQV9JTlQsCi0JCQkwLCBMT0tJX1RDTEspOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogR0UwMQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9faW5pdCBsb2tpX2dlMV9pbml0KHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhICpldGhfZGF0YSkKLXsKLQl3cml0ZWwoMHgwMDA3OTIyMCwgR0UxX1ZJUlRfQkFTRSArIDB4MjBiMCk7Ci0KLQlvcmlvbl9nZTAxX2luaXQoZXRoX2RhdGEsICZsb2tpX21idXNfZHJhbV9pbmZvLAotCQkJR0UxX1BIWVNfQkFTRSwgSVJRX0xPS0lfR0JFX0JfSU5ULAotCQkJMCwgTE9LSV9UQ0xLKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNBUy9TQVRBCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbG9raV9zYXNfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkubmFtZQk9ICJtdnNhczAgbWVtIiwKLQkJLnN0YXJ0CT0gU0FTMF9QSFlTX0JBU0UsCi0JCS5lbmQJPSBTQVMwX1BIWVNfQkFTRSArIDB4MDFmZiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkubmFtZQk9ICJtdnNhczAgaXJxIiwKLQkJLnN0YXJ0CT0gSVJRX0xPS0lfU0FTX0EsCi0JCS5lbmQJPSBJUlFfTE9LSV9TQVNfQSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwgewotCQkubmFtZQk9ICJtdnNhczEgbWVtIiwKLQkJLnN0YXJ0CT0gU0FTMV9QSFlTX0JBU0UsCi0JCS5lbmQJPSBTQVMxX1BIWVNfQkFTRSArIDB4MDFmZiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkubmFtZQk9ICJtdnNhczEgaXJxIiwKLQkJLnN0YXJ0CT0gSVJRX0xPS0lfU0FTX0IsCi0JCS5lbmQJPSBJUlFfTE9LSV9TQVNfQiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxva2lfc2FzID0gewotCS5uYW1lCQk9ICJtdnNhcyIsCi0JLmlkCQk9IDAsCi0JLmRldgkJPSB7Ci0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobG9raV9zYXNfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBsb2tpX3Nhc19yZXNvdXJjZXMsCi19OwotCi12b2lkIF9faW5pdCBsb2tpX3Nhc19pbml0KHZvaWQpCi17Ci0Jd3JpdGVsKDB4ODMwMGY3MDcsIEREUl9SRUcoMHgxNDI0KSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZsb2tpX3Nhcyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBVQVJUMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9faW5pdCBsb2tpX3VhcnQwX2luaXQodm9pZCkKLXsKLQlvcmlvbl91YXJ0MF9pbml0KFVBUlQwX1ZJUlRfQkFTRSwgVUFSVDBfUEhZU19CQVNFLAotCQkJIElSUV9MT0tJX1VBUlQwLCBMT0tJX1RDTEspOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFVBUlQxCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX19pbml0IGxva2lfdWFydDFfaW5pdCh2b2lkKQotewotCW9yaW9uX3VhcnQxX2luaXQoVUFSVDFfVklSVF9CQVNFLCBVQVJUMV9QSFlTX0JBU0UsCi0JCQkgSVJRX0xPS0lfVUFSVDEsIExPS0lfVENMSyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaW1lIGhhbmRsaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX19pbml0IGxva2lfaW5pdF9lYXJseSh2b2lkKQotewotCW9yaW9uX3RpbWVfc2V0X2Jhc2UoVElNRVJfVklSVF9CQVNFKTsKLX0KLQotc3RhdGljIHZvaWQgbG9raV90aW1lcl9pbml0KHZvaWQpCi17Ci0Jb3Jpb25fdGltZV9pbml0KEJSSURHRV9WSVJUX0JBU0UsIEJSSURHRV9JTlRfVElNRVIxX0NMUiwKLQkJCUlSUV9MT0tJX0JSSURHRSwgTE9LSV9UQ0xLKTsKLX0KLQotc3RydWN0IHN5c190aW1lciBsb2tpX3RpbWVyID0gewotCS5pbml0ID0gbG9raV90aW1lcl9pbml0LAotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEdlbmVyYWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX2luaXQgbG9raV9pbml0KHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiTG9raSBJRDogODhSQzg0ODAuIFRDTEs9JWQuXG4iLCBMT0tJX1RDTEspOwotCi0JbG9raV9zZXR1cF9jcHVfbWJ1cygpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sb2tpL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzE1ZGNmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWxva2kvY29tbW9uLmgKLSAqCi0gKiBDb3JlIGZ1bmN0aW9ucyBmb3IgTWFydmVsbCBMb2tpICg4OFJDODQ4MCkgU29DcwotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpZm5kZWYgX19BUkNIX0xPS0lfQ09NTU9OX0gKLSNkZWZpbmUgX19BUkNIX0xPS0lfQ09NTU9OX0gKLQotc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGE7Ci0KLS8qCi0gKiBCYXNpYyBMb2tpIGluaXQgZnVuY3Rpb25zIHVzZWQgZWFybHkgYnkgbWFjaGluZS1zZXR1cC4KLSAqLwotdm9pZCBsb2tpX21hcF9pbyh2b2lkKTsKLXZvaWQgbG9raV9pbml0KHZvaWQpOwotdm9pZCBsb2tpX2luaXRfZWFybHkodm9pZCk7Ci12b2lkIGxva2lfaW5pdF9pcnEodm9pZCk7Ci0KLWV4dGVybiBzdHJ1Y3QgbWJ1c19kcmFtX3RhcmdldF9pbmZvIGxva2lfbWJ1c19kcmFtX2luZm87Ci12b2lkIGxva2lfc2V0dXBfY3B1X21idXModm9pZCk7Ci12b2lkIGxva2lfc2V0dXBfZGV2X2Jvb3Rfd2luKHUzMiBiYXNlLCB1MzIgc2l6ZSk7Ci0KLXZvaWQgbG9raV9nZTBfaW5pdChzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSAqZXRoX2RhdGEpOwotdm9pZCBsb2tpX2dlMV9pbml0KHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhICpldGhfZGF0YSk7Ci12b2lkIGxva2lfc2FzX2luaXQodm9pZCk7Ci12b2lkIGxva2lfdWFydDBfaW5pdCh2b2lkKTsKLXZvaWQgbG9raV91YXJ0MV9pbml0KHZvaWQpOwotCi1leHRlcm4gc3RydWN0IHN5c190aW1lciBsb2tpX3RpbWVyOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9icmlkZ2UtcmVncy5oIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9icmlkZ2UtcmVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDg3NzMyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvYnJpZGdlLXJlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL2JyaWRnZS1yZWdzLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfQlJJREdFX1JFR1NfSAotI2RlZmluZSBfX0FTTV9BUkNIX0JSSURHRV9SRUdTX0gKLQotI2luY2x1ZGUgPG1hY2gvbG9raS5oPgotCi0jZGVmaW5lIFJTVE9VVG5fTUFTSwkJKEJSSURHRV9WSVJUX0JBU0UgfCAweDAxMDgpCi0jZGVmaW5lIFNPRlRfUkVTRVRfT1VUX0VOCTB4MDAwMDAwMDQKLQotI2RlZmluZSBTWVNURU1fU09GVF9SRVNFVAkoQlJJREdFX1ZJUlRfQkFTRSB8IDB4MDEwYykKLSNkZWZpbmUgU09GVF9SRVNFVAkJMHgwMDAwMDAwMQotCi0jZGVmaW5lIEJSSURHRV9JTlRfVElNRVIxX0NMUgkweDAwMDQKLQotI2RlZmluZSBJUlFfVklSVF9CQVNFCQkoQlJJREdFX1ZJUlRfQkFTRSB8IDB4MDIwMCkKLSNkZWZpbmUgSVJRX0NBVVNFX09GRgkJMHgwMDAwCi0jZGVmaW5lIElSUV9NQVNLX09GRgkJMHgwMDA0Ci0KLSNkZWZpbmUgVElNRVJfVklSVF9CQVNFCQkoQlJJREdFX1ZJUlRfQkFTRSB8IDB4MDMwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTBkOTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bWFjaC9sb2tpLmg+Ci0KLQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgotCWxkcglccnAsID1MT0tJX1JFR1NfUEhZU19CQVNFCi0JbGRyCVxydiwgPUxPS0lfUkVHU19WSVJUX0JBU0UKLQlvcnIJXHJwLCBccnAsICMweDAwMDEyMDAwCi0Jb3JyCVxydiwgXHJ2LCAjMHgwMDAxMjAwMAotCS5lbmRtCi0KLSNkZWZpbmUgVUFSVF9TSElGVAkyCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYnVnLTgyNTAuUz4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5MTdlZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCi0gKgotICogTG93LWxldmVsIElSUSBoZWxwZXIgbWFjcm9zIGZvciBNYXJ2ZWxsIExva2kgKDg4UkM4NDgwKSBwbGF0Zm9ybXMKLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaW5jbHVkZSA8bWFjaC9icmlkZ2UtcmVncy5oPgotCi0JLm1hY3JvICBkaXNhYmxlX2ZpcQotCS5lbmRtCi0KLQkubWFjcm8gIGFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKLQkuZW5kbQotCi0JLm1hY3JvICBnZXRfaXJxbnJfcHJlYW1ibGUsIGJhc2UsIHRtcAotCWxkcglcYmFzZSwgPUlSUV9WSVJUX0JBU0UKLQkuZW5kbQotCi0JLm1hY3JvICBnZXRfaXJxbnJfYW5kX2Jhc2UsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLQlsZHIJXGlycXN0YXQsIFtcYmFzZSwgI0lSUV9DQVVTRV9PRkZdCi0JbGRyCVx0bXAsIFtcYmFzZSwgI0lSUV9NQVNLX09GRl0KLQltb3YJXGlycW5yLCAjMAotCWFuZHMJXGlycXN0YXQsIFxpcnFzdGF0LCBcdG1wCi0JY2x6bmUJXGlycW5yLCBcaXJxc3RhdAotCXJzYm5lCVxpcnFuciwgXGlycW5yLCAjMzEKLQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2JmYzhmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAotCi0jaW5jbHVkZSAibG9raS5oIgotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzczY2Q1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL2lvLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfSU9fSAotI2RlZmluZSBfX0FTTV9BUkNIX0lPX0gKLQotI2luY2x1ZGUgImxva2kuaCIKLQotI2RlZmluZSBJT19TUEFDRV9MSU1JVAkJMHhmZmZmZmZmZgotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqX19pbyh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKikoKGFkZHIgLSBMT0tJX1BDSUUwX0lPX1BIWVNfQkFTRSkKLQkJCQkJKyBMT0tJX1BDSUUwX0lPX1ZJUlRfQkFTRSk7Ci19Ci0KLSNkZWZpbmUgX19pbyhhKQkJCV9faW8oYSkKLSNkZWZpbmUgX19tZW1fcGNpKGEpCQkoYSkKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9pcnFzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYmQzMzIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9pcnFzLmgKLSAqCi0gKiBJUlEgZGVmaW5pdGlvbnMgZm9yIE1hcnZlbGwgTG9raSAoODhSQzg0ODApIFNvQ3MKLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfSVJRU19ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfSVJRU19ICi0KLSNpbmNsdWRlICJsb2tpLmgiCS8qIG5lZWQgR1BJT19NQVggKi8KLQotLyoKLSAqIEludGVycnVwdCBDb250cm9sbGVyCi0gKi8KLSNkZWZpbmUgSVJRX0xPS0lfUENJRV9BX0NQVV9EUkJMCTAKLSNkZWZpbmUgSVJRX0xPS0lfQ1BVX1BDSUVfQV9EUkJMCTEKLSNkZWZpbmUgSVJRX0xPS0lfUENJRV9CX0NQVV9EUkJMCTIKLSNkZWZpbmUgSVJRX0xPS0lfQ1BVX1BDSUVfQl9EUkJMCTMKLSNkZWZpbmUgSVJRX0xPS0lfQ09NX0FfRVJSCQk2Ci0jZGVmaW5lIElSUV9MT0tJX0NPTV9BX0lOCQk3Ci0jZGVmaW5lIElSUV9MT0tJX0NPTV9BX09VVAkJOAotI2RlZmluZSBJUlFfTE9LSV9DT01fQl9FUlIJCTkKLSNkZWZpbmUgSVJRX0xPS0lfQ09NX0JfSU4JCTEwCi0jZGVmaW5lIElSUV9MT0tJX0NPTV9CX09VVAkJMTEKLSNkZWZpbmUgSVJRX0xPS0lfRE1BX0EJCQkxMgotI2RlZmluZSBJUlFfTE9LSV9ETUFfQgkJCTEzCi0jZGVmaW5lIElSUV9MT0tJX1NBU19BCQkJMTQKLSNkZWZpbmUgSVJRX0xPS0lfU0FTX0IJCQkxNQotI2RlZmluZSBJUlFfTE9LSV9ERFIJCQkxNgotI2RlZmluZSBJUlFfTE9LSV9YT1IJCQkxNwotI2RlZmluZSBJUlFfTE9LSV9CUklER0UJCQkxOAotI2RlZmluZSBJUlFfTE9LSV9QQ0lFX0FfRVJSCQkyMAotI2RlZmluZSBJUlFfTE9LSV9QQ0lFX0FfSU5UCQkyMQotI2RlZmluZSBJUlFfTE9LSV9QQ0lFX0JfRVJSCQkyMgotI2RlZmluZSBJUlFfTE9LSV9QQ0lFX0JfSU5UCQkyMwotI2RlZmluZSBJUlFfTE9LSV9HQkVfQV9JTlQJCTI0Ci0jZGVmaW5lIElSUV9MT0tJX0dCRV9CX0lOVAkJMjUKLSNkZWZpbmUgSVJRX0xPS0lfREVWX0VSUgkJMjYKLSNkZWZpbmUgSVJRX0xPS0lfVUFSVDAJCQkyNwotI2RlZmluZSBJUlFfTE9LSV9VQVJUMQkJCTI4Ci0jZGVmaW5lIElSUV9MT0tJX1RXU0kJCQkyOQotI2RlZmluZSBJUlFfTE9LSV9HUElPXzIzXzAJCTMwCi0jZGVmaW5lIElSUV9MT0tJX0dQSU9fMjVfMjQJCTMxCi0KLS8qCi0gKiBMb2tpIEdlbmVyYWwgUHVycG9zZSBQaW5zCi0gKi8KLSNkZWZpbmUgSVJRX0xPS0lfR1BJT19TVEFSVAkzMgotI2RlZmluZSBOUl9HUElPX0lSUVMJCUdQSU9fTUFYCi0KLSNkZWZpbmUgTlJfSVJRUwkJCShJUlFfTE9LSV9HUElPX1NUQVJUICsgTlJfR1BJT19JUlFTKQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9sb2tpLmggYi9hcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL2xva2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjYTdjMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL2xva2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL2xva2kuaAotICoKLSAqIEdlbmVyaWMgZGVmaW5pdGlvbnMgZm9yIE1hcnZlbGwgTG9raSAoODhSQzg0ODApIFNvQyBmbGF2b3JzCi0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX0xPS0lfSAotI2RlZmluZSBfX0FTTV9BUkNIX0xPS0lfSAotCi0vKgotICogTWFydmVsbCBMb2tpICg4OFJDODQ4MCkgYWRkcmVzcyBtYXBzLgotICoKLSAqIHBoeXMKLSAqIGQwMDAwMDAwCW9uLWNoaXAgcGVyaXBoZXJhbCByZWdpc3RlcnMKLSAqIGUwMDAwMDAwCVBDSWUgMCBNZW1vcnkgc3BhY2UKLSAqIGU4MDAwMDAwCVBDSWUgMSBNZW1vcnkgc3BhY2UKLSAqIGYwMDAwMDAwCVBDSWUgMCBJL08gc3BhY2UKLSAqIGYwMTAwMDAwCVBDSWUgMSBJL08gc3BhY2UKLSAqCi0gKiB2aXJ0CQlwaHlzCQlzaXplCi0gKiBmZWQwMDAwMAlkMDAwMDAwMAkxTQlvbi1jaGlwIHBlcmlwaGVyYWwgcmVnaXN0ZXJzCi0gKiBmZWUwMDAwMAlmMDAwMDAwMAk2NEsJUENJZSAwIEkvTyBzcGFjZQotICogZmVmMDAwMDAJZjAxMDAwMDAJNjRLCVBDSWUgMSBJL08gc3BhY2UKLSAqLwotCi0jZGVmaW5lIExPS0lfUkVHU19QSFlTX0JBU0UJCTB4ZDAwMDAwMDAKLSNkZWZpbmUgTE9LSV9SRUdTX1ZJUlRfQkFTRQkJMHhmZWQwMDAwMAotI2RlZmluZSBMT0tJX1JFR1NfU0laRQkJCVNaXzFNCi0KLSNkZWZpbmUgTE9LSV9QQ0lFMF9JT19QSFlTX0JBU0UJCTB4ZjAwMDAwMDAKLSNkZWZpbmUgTE9LSV9QQ0lFMF9JT19WSVJUX0JBU0UJCTB4ZmVlMDAwMDAKLSNkZWZpbmUgTE9LSV9QQ0lFMF9JT19CVVNfQkFTRQkJMHgwMDAwMDAwMAotI2RlZmluZSBMT0tJX1BDSUUwX0lPX1NJWkUJCVNaXzY0SwotCi0jZGVmaW5lIExPS0lfUENJRTFfSU9fUEhZU19CQVNFCQkweGYwMTAwMDAwCi0jZGVmaW5lIExPS0lfUENJRTFfSU9fVklSVF9CQVNFCQkweGZlZjAwMDAwCi0jZGVmaW5lIExPS0lfUENJRTFfSU9fQlVTX0JBU0UJCTB4MDAwMDAwMDAKLSNkZWZpbmUgTE9LSV9QQ0lFMV9JT19TSVpFCQlTWl82NEsKLQotI2RlZmluZSBMT0tJX1BDSUUwX01FTV9QSFlTX0JBU0UJMHhlMDAwMDAwMAotI2RlZmluZSBMT0tJX1BDSUUwX01FTV9TSVpFCQlTWl8xMjhNCi0KLSNkZWZpbmUgTE9LSV9QQ0lFMV9NRU1fUEhZU19CQVNFCTB4ZTgwMDAwMDAKLSNkZWZpbmUgTE9LSV9QQ0lFMV9NRU1fU0laRQkJU1pfMTI4TQotCi0vKgotICogUmVnaXN0ZXIgTWFwCi0gKi8KLSNkZWZpbmUgREVWX0JVU19QSFlTX0JBU0UJKExPS0lfUkVHU19QSFlTX0JBU0UgfCAweDEwMDAwKQotI2RlZmluZSBERVZfQlVTX1ZJUlRfQkFTRQkoTE9LSV9SRUdTX1ZJUlRfQkFTRSB8IDB4MTAwMDApCi0jZGVmaW5lICBVQVJUMF9QSFlTX0JBU0UJKERFVl9CVVNfUEhZU19CQVNFIHwgMHgyMDAwKQotI2RlZmluZSAgVUFSVDBfVklSVF9CQVNFCShERVZfQlVTX1ZJUlRfQkFTRSB8IDB4MjAwMCkKLSNkZWZpbmUgIFVBUlQxX1BIWVNfQkFTRQkoREVWX0JVU19QSFlTX0JBU0UgfCAweDIxMDApCi0jZGVmaW5lICBVQVJUMV9WSVJUX0JBU0UJKERFVl9CVVNfVklSVF9CQVNFIHwgMHgyMTAwKQotCi0jZGVmaW5lIEJSSURHRV9WSVJUX0JBU0UJKExPS0lfUkVHU19WSVJUX0JBU0UgfCAweDIwMDAwKQotCi0jZGVmaW5lIFBDSUUwX1ZJUlRfQkFTRQkJKExPS0lfUkVHU19WSVJUX0JBU0UgfCAweDMwMDAwKQotCi0jZGVmaW5lIFBDSUUxX1ZJUlRfQkFTRQkJKExPS0lfUkVHU19WSVJUX0JBU0UgfCAweDQwMDAwKQotCi0jZGVmaW5lIFNBUzBfUEhZU19CQVNFCQkoTE9LSV9SRUdTX1BIWVNfQkFTRSB8IDB4ODAwMDApCi0KLSNkZWZpbmUgU0FTMV9QSFlTX0JBU0UJCShMT0tJX1JFR1NfUEhZU19CQVNFIHwgMHg5MDAwMCkKLQotI2RlZmluZSBHRTBfUEhZU19CQVNFCQkoTE9LSV9SRUdTX1BIWVNfQkFTRSB8IDB4YTAwMDApCi0jZGVmaW5lIEdFMF9WSVJUX0JBU0UJCShMT0tJX1JFR1NfVklSVF9CQVNFIHwgMHhhMDAwMCkKLQotI2RlZmluZSBHRTFfUEhZU19CQVNFCQkoTE9LSV9SRUdTX1BIWVNfQkFTRSB8IDB4YjAwMDApCi0jZGVmaW5lIEdFMV9WSVJUX0JBU0UJCShMT0tJX1JFR1NfVklSVF9CQVNFIHwgMHhiMDAwMCkKLQotI2RlZmluZSBERFJfVklSVF9CQVNFCQkoTE9LSV9SRUdTX1ZJUlRfQkFTRSB8IDB4ZjAwMDApCi0jZGVmaW5lIEREUl9SRUcoeCkJCShERFJfVklSVF9CQVNFIHwgKHgpKQotCi0KLSNkZWZpbmUgR1BJT19NQVgJCTgKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjM2NjY1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL3N5c3RlbS5oIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4OTUxOS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvc3lzdGVtLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfU1lTVEVNX0gKLSNkZWZpbmUgX19BU01fQVJDSF9TWVNURU1fSAotCi0jaW5jbHVkZSA8bWFjaC9icmlkZ2UtcmVncy5oPgotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9pZGxlKHZvaWQpCi17Ci0JY3B1X2RvX2lkbGUoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfcmVzZXQoY2hhciBtb2RlLCBjb25zdCBjaGFyICpjbWQpCi17Ci0JLyoKLQkgKiBFbmFibGUgc29mdCByZXNldCB0byBhc3NlcnQgUlNUT1VUbi4KLQkgKi8KLQl3cml0ZWwoU09GVF9SRVNFVF9PVVRfRU4sIFJTVE9VVG5fTUFTSyk7Ci0KLQkvKgotCSAqIEFzc2VydCBzb2Z0IHJlc2V0LgotCSAqLwotCXdyaXRlbChTT0ZUX1JFU0VULCBTWVNURU1fU09GVF9SRVNFVCk7Ci0KLQl3aGlsZSAoMSkKLQkJOwotfQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC90aW1leC5oIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC90aW1leC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGYyMTA5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvdGltZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL3RpbWV4LmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJKDEwMCAqIEhaKQotCi0jZGVmaW5lIExPS0lfVENMSwkJMTgwMDAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGIyYTdlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCi0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KLSNpbmNsdWRlIDxtYWNoL2xva2kuaD4KLQotI2RlZmluZSBTRVJJQUxfQkFTRQkoKHVuc2lnbmVkIGNoYXIgKilVQVJUMF9QSFlTX0JBU0UpCi0KLXN0YXRpYyB2b2lkIHB1dGMoY29uc3QgY2hhciBjKQotewotCXVuc2lnbmVkIGNoYXIgKmJhc2UgPSBTRVJJQUxfQkFTRTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAweDEwMDA7IGkrKykgewotCQlpZiAoYmFzZVtVQVJUX0xTUiA8PCAyXSAmIFVBUlRfTFNSX1RIUkUpCi0JCQlicmVhazsKLQkJYmFycmllcigpOwotCX0KLQotCWJhc2VbVUFSVF9UWCA8PCAyXSA9IGM7Ci19Ci0KLXN0YXRpYyB2b2lkIGZsdXNoKHZvaWQpCi17Ci0JdW5zaWduZWQgY2hhciAqYmFzZSA9IFNFUklBTF9CQVNFOwotCXVuc2lnbmVkIGNoYXIgbWFzazsKLQlpbnQgaTsKLQotCW1hc2sgPSBVQVJUX0xTUl9URU1UIHwgVUFSVF9MU1JfVEhSRTsKLQotCWZvciAoaSA9IDA7IGkgPCAweDEwMDA7IGkrKykgewotCQlpZiAoKGJhc2VbVUFSVF9MU1IgPDwgMl0gJiBtYXNrKSA9PSBtYXNrKQotCQkJYnJlYWs7Ci0JCWJhcnJpZXIoKTsKLQl9Ci19Ci0KLS8qCi0gKiBub3RoaW5nIHRvIGRvCi0gKi8KLSNkZWZpbmUgYXJjaF9kZWNvbXBfc2V0dXAoKQotI2RlZmluZSBhcmNoX2RlY29tcF93ZG9nKCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvdm1hbGxvYy5oIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkY2JkODYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAotICovCi0KLSNkZWZpbmUgVk1BTExPQ19FTkQJMHhmZTgwMDAwMFVMCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxva2kvaXJxLmMgYi9hcmNoL2FybS9tYWNoLWxva2kvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YjIxMWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sb2tpL2lycS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbG9raS9pcnEuYwotICoKLSAqIE1hcnZlbGwgTG9raSAoODhSQzg0ODApIElSUSBoYW5kbGluZy4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bWFjaC9icmlkZ2UtcmVncy5oPgotI2luY2x1ZGUgPHBsYXQvaXJxLmg+Ci0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLXZvaWQgX19pbml0IGxva2lfaW5pdF9pcnEodm9pZCkKLXsKLQlvcmlvbl9pcnFfaW5pdCgwLCAodm9pZCBfX2lvbWVtICopKElSUV9WSVJUX0JBU0UgKyBJUlFfTUFTS19PRkYpKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbG9raS9sYjg4cmM4NDgwLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWxva2kvbGI4OHJjODQ4MC1zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVhZTRlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9sYjg4cmM4NDgwLXNldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1sb2tpL2xiODhyYzg0ODAtc2V0dXAuYwotICoKLSAqIE1hcnZlbGwgTEI4OFJDODQ4MCBEZXZlbG9wbWVudCBCb2FyZCBTZXR1cAotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8bGludXgvbXY2NDN4eF9ldGguaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxtYWNoL2xva2kuaD4KLSNpbmNsdWRlICJjb21tb24uaCIKLQotI2RlZmluZSBMQjg4UkM4NDgwX0ZMQVNIX0JPT1RfQ1NfQkFTRQkweGY4MDAwMDAwCi0jZGVmaW5lIExCODhSQzg0ODBfRkxBU0hfQk9PVF9DU19TSVpFCVNaXzEyOE0KLQotI2RlZmluZSBMQjg4UkM4NDgwX05PUl9CT09UX0JBU0UJMHhmZjAwMDAwMAotI2RlZmluZSBMQjg4UkM4NDgwX05PUl9CT09UX1NJWkUJU1pfMTZNCi0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBsYjg4cmM4NDgwX2Jvb3RfZmxhc2hfcGFydHNbXSA9IHsKLQl7Ci0JCS5uYW1lCT0gImtlcm5lbCIsCi0JCS5vZmZzZXQJPSAwLAotCQkuc2l6ZQk9IFNaXzJNLAotCX0sIHsKLQkJLm5hbWUJPSAicm9vdC1mcyIsCi0JCS5vZmZzZXQJPSBTWl8yTSwKLQkJLnNpemUJPSAoU1pfOE0gKyBTWl80TSArIFNaXzFNKSwKLQl9LCB7Ci0JCS5uYW1lCT0gInUtYm9vdCIsCi0JCS5vZmZzZXQJPSAoU1pfOE0gKyBTWl80TSArIFNaXzJNICsgU1pfMU0pLAotCQkuc2l6ZQk9IFNaXzFNLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBsYjg4cmM4NDgwX2Jvb3RfZmxhc2hfZGF0YSA9IHsKLQkucGFydHMJCT0gbGI4OHJjODQ4MF9ib290X2ZsYXNoX3BhcnRzLAotCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUobGI4OHJjODQ4MF9ib290X2ZsYXNoX3BhcnRzKSwKLQkud2lkdGgJCT0gMSwJLyogOCBiaXQgYnVzIHdpZHRoICovCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGxiODhyYzg0ODBfYm9vdF9mbGFzaF9yZXNvdXJjZSA9IHsKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQkuc3RhcnQJPSBMQjg4UkM4NDgwX05PUl9CT09UX0JBU0UsCi0JLmVuZAk9IExCODhSQzg0ODBfTk9SX0JPT1RfQkFTRSArIExCODhSQzg0ODBfTk9SX0JPT1RfU0laRSAtIDEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsYjg4cmM4NDgwX2Jvb3RfZmxhc2ggPSB7Ci0JLm5hbWUJPSAicGh5c21hcC1mbGFzaCIsCi0JLmlkCT0gMCwKLQkuZGV2CT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZsYjg4cmM4NDgwX2Jvb3RfZmxhc2hfZGF0YSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gMSwKLQkucmVzb3VyY2UJPSAmbGI4OHJjODQ4MF9ib290X2ZsYXNoX3Jlc291cmNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIGxiODhyYzg0ODBfZ2UwX2RhdGEgPSB7Ci0JLnBoeV9hZGRyCT0gTVY2NDNYWF9FVEhfUEhZX0FERFIoMSksCi0JLm1hY19hZGRyCT0geyAweDAwLCAweDUwLCAweDQzLCAweDExLCAweDIyLCAweDMzIH0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbGI4OHJjODQ4MF9pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiBCYXNpYyBzZXR1cC4gTmVlZHMgdG8gYmUgY2FsbGVkIGVhcmx5LgotCSAqLwotCWxva2lfaW5pdCgpOwotCi0JbG9raV9nZTBfaW5pdCgmbGI4OHJjODQ4MF9nZTBfZGF0YSk7Ci0JbG9raV9zYXNfaW5pdCgpOwotCWxva2lfdWFydDBfaW5pdCgpOwotCWxva2lfdWFydDFfaW5pdCgpOwotCi0JbG9raV9zZXR1cF9kZXZfYm9vdF93aW4oTEI4OFJDODQ4MF9GTEFTSF9CT09UX0NTX0JBU0UsCi0JCQkJTEI4OFJDODQ4MF9GTEFTSF9CT09UX0NTX1NJWkUpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbGI4OHJjODQ4MF9ib290X2ZsYXNoKTsKLX0KLQotTUFDSElORV9TVEFSVChMQjg4UkM4NDgwLCAiTWFydmVsbCBMQjg4UkM4NDgwIERldmVsb3BtZW50IEJvYXJkIikKLQkvKiBNYWludGFpbmVyOiBLZSBXZWkgPGtld2VpQG1hcnZlbGwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCi0JLmluaXRfbWFjaGluZQk9IGxiODhyYzg0ODBfaW5pdCwKLQkubWFwX2lvCQk9IGxva2lfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gbG9raV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGxva2lfaW5pdF9pcnEsCi0JLnRpbWVyCQk9ICZsb2tpX3RpbWVyLAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwppbmRleCA4NzAyMjdjLi5iNzI1ZjZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCkBAIC00MSw3ICs0MSwzIEBACiAJcnNiCVxpcnFuciwgXGlycW5yLCAjMzEKIAl0ZXEJXGlycXN0YXQsICMwCiAJLmVuZG0KLQotCS5tYWNybwlpcnFfcHJpb190YWJsZQotCS5lbmRtCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKaW5kZXggZDFkOTM2Yy4uNzIwZmE0MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKQEAgLTE5LDYgKzE5LDYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9WTUFMTE9DX0gKICNkZWZpbmUgX19BU01fQVJDSF9WTUFMTE9DX0gKIAotI2RlZmluZSBWTUFMTE9DX0VORAkweEYwMDAwMDAwCisjZGVmaW5lIFZNQUxMT0NfRU5ECTB4RjAwMDAwMDBVTAogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2Jyb3duc3RvbmUuYyBiL2FyY2gvYXJtL21hY2gtbW1wL2Jyb3duc3RvbmUuYwppbmRleCA3YmI3OGZkLi5jNzkxNjJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9icm93bnN0b25lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvYnJvd25zdG9uZS5jCkBAIC0xNzcsOSArMTc3LDE2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNkaGNpX3B4YV9wbGF0ZGF0YSBtbXAyX3NkaF9wbGF0ZGF0YV9tbWMwID0gewotCS5tYXhfc3BlZWQJPSAyNTAwMDAwMCwKKwkuY2xrX2RlbGF5X2N5Y2xlcyA9IDB4MWYsCiB9OwogCitzdGF0aWMgc3RydWN0IHNkaGNpX3B4YV9wbGF0ZGF0YSBtbXAyX3NkaF9wbGF0ZGF0YV9tbWMyID0geworCS5jbGtfZGVsYXlfY3ljbGVzID0gMHgxZiwKKwkuZmxhZ3MgPSBQWEFfRkxBR19DQVJEX1BFUk1BTkVOVAorCQl8IFBYQV9GTEFHX1NEXzhfQklUX0NBUEFCTEVfU0xPVCwKK307CisKKwogc3RhdGljIHZvaWQgX19pbml0IGJyb3duc3RvbmVfaW5pdCh2b2lkKQogewogCW1mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoYnJvd25zdG9uZV9waW5fY29uZmlnKSk7CkBAIC0xODksNiArMTk2LDcgQEAKIAltbXAyX2FkZF91YXJ0KDMpOwogCW1tcDJfYWRkX3R3c2koMSwgTlVMTCwgQVJSQVlfQU5EX1NJWkUoYnJvd25zdG9uZV90d3NpMV9pbmZvKSk7CiAJbW1wMl9hZGRfc2Rob3N0KDAsICZtbXAyX3NkaF9wbGF0ZGF0YV9tbWMwKTsgLyogU0QvTU1DICovCisJbW1wMl9hZGRfc2Rob3N0KDIsICZtbXAyX3NkaF9wbGF0ZGF0YV9tbWMyKTsgLyogZU1NQyAqLwogCiAJLyogZW5hYmxlIDV2IHJlZ3VsYXRvciAqLwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYnJvd25zdG9uZV92XzV2cF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL21tcDIuaCBiL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9tbXAyLmgKaW5kZXggMmNiZjZkZi4uZGU3Yjg4OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL21tcDIuaAorKysgYi9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvbW1wMi5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX0FTTV9NQUNIX01NUDJfSAogI2RlZmluZSBfX0FTTV9NQUNIX01NUDJfSAogCi0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvcHhhX3NkaGNpLmg+CiAKIHN0cnVjdCBzeXNfdGltZXI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2phc3Blci5jIGIvYXJjaC9hcm0vbWFjaC1tbXAvamFzcGVyLmMKaW5kZXggMjQxNzJhMC4uNWQ2NDIxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvamFzcGVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvamFzcGVyLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzZGhjaV9weGFfcGxhdGRhdGEgbW1wMl9zZGhfcGxhdGRhdGFfbW1jMCA9IHsKLQkubWF4X3NwZWVkCT0gMjUwMDAwMDAsCisJLmNsa19kZWxheV9jeWNsZXMgPSAweDFmLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGphc3Blcl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9tbXAyLmMgYi9hcmNoL2FybS9tYWNoLW1tcC9tbXAyLmMKaW5kZXggOGU2YzNhYy4uMDc5YzE4OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvbW1wMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL21tcDIuYwpAQCAtMTY4LDEwICsxNjgsMTAgQEAKIAlJTklUX0NMS1JFRygmY2xrX3R3c2k1LCAicHhhMnh4LWkyYy40IiwgTlVMTCksCiAJSU5JVF9DTEtSRUcoJmNsa190d3NpNiwgInB4YTJ4eC1pMmMuNSIsIE5VTEwpLAogCUlOSVRfQ0xLUkVHKCZjbGtfbmFuZCwgInB4YTN4eC1uYW5kIiwgTlVMTCksCi0JSU5JVF9DTEtSRUcoJmNsa19zZGgwLCAic2RoY2ktcHhhLjAiLCAiUFhBLVNESENMSyIpLAotCUlOSVRfQ0xLUkVHKCZjbGtfc2RoMSwgInNkaGNpLXB4YS4xIiwgIlBYQS1TREhDTEsiKSwKLQlJTklUX0NMS1JFRygmY2xrX3NkaDIsICJzZGhjaS1weGEuMiIsICJQWEEtU0RIQ0xLIiksCi0JSU5JVF9DTEtSRUcoJmNsa19zZGgzLCAic2RoY2ktcHhhLjMiLCAiUFhBLVNESENMSyIpLAorCUlOSVRfQ0xLUkVHKCZjbGtfc2RoMCwgInNkaGNpLXB4YXYzLjAiLCAiUFhBLVNESENMSyIpLAorCUlOSVRfQ0xLUkVHKCZjbGtfc2RoMSwgInNkaGNpLXB4YXYzLjEiLCAiUFhBLVNESENMSyIpLAorCUlOSVRfQ0xLUkVHKCZjbGtfc2RoMiwgInNkaGNpLXB4YXYzLjIiLCAiUFhBLVNESENMSyIpLAorCUlOSVRfQ0xLUkVHKCZjbGtfc2RoMywgInNkaGNpLXB4YXYzLjMiLCAiUFhBLVNESENMSyIpLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgbW1wMl9pbml0KHZvaWQpCkBAIC0yMjIsOCArMjIyLDggQEAKIE1NUDJfREVWSUNFKHR3c2k1LCAicHhhMnh4LWkyYyIsIDQsIFRXU0k1LCAweGQ0MDMzODAwLCAweDcwKTsKIE1NUDJfREVWSUNFKHR3c2k2LCAicHhhMnh4LWkyYyIsIDUsIFRXU0k2LCAweGQ0MDM0MDAwLCAweDcwKTsKIE1NUDJfREVWSUNFKG5hbmQsICJweGEzeHgtbmFuZCIsIC0xLCBOQU5ELCAweGQ0MjgzMDAwLCAweDEwMCwgMjgsIDI5KTsKLU1NUDJfREVWSUNFKHNkaDAsICJzZGhjaS1weGEiLCAwLCBNTUMsIDB4ZDQyODAwMDAsIDB4MTIwKTsKLU1NUDJfREVWSUNFKHNkaDEsICJzZGhjaS1weGEiLCAxLCBNTUMyLCAweGQ0MjgwODAwLCAweDEyMCk7Ci1NTVAyX0RFVklDRShzZGgyLCAic2RoY2ktcHhhIiwgMiwgTU1DMywgMHhkNDI4MTAwMCwgMHgxMjApOwotTU1QMl9ERVZJQ0Uoc2RoMywgInNkaGNpLXB4YSIsIDMsIE1NQzQsIDB4ZDQyODE4MDAsIDB4MTIwKTsKK01NUDJfREVWSUNFKHNkaDAsICJzZGhjaS1weGF2MyIsIDAsIE1NQywgMHhkNDI4MDAwMCwgMHgxMjApOworTU1QMl9ERVZJQ0Uoc2RoMSwgInNkaGNpLXB4YXYzIiwgMSwgTU1DMiwgMHhkNDI4MDgwMCwgMHgxMjApOworTU1QMl9ERVZJQ0Uoc2RoMiwgInNkaGNpLXB4YXYzIiwgMiwgTU1DMywgMHhkNDI4MTAwMCwgMHgxMjApOworTU1QMl9ERVZJQ0Uoc2RoMywgInNkaGNpLXB4YXYzIiwgMywgTU1DNCwgMHhkNDI4MTgwMCwgMHgxMjApOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9weGExNjguYyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTE2OC5jCmluZGV4IDcyYjRlNzYuLmFiOWY5OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL3B4YTE2OC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTE2OC5jCkBAIC03OSw3ICs3OSw3IEBACiBzdGF0aWMgQVBCQ19DTEsoc3NwNSwgUFhBMTY4X1NTUDUsIDQsIDApOwogc3RhdGljIEFQQkNfQ0xLKGtleXBhZCwgUFhBMTY4X0tQQywgMCwgMzIwMDApOwogCi1zdGF0aWMgQVBNVV9DTEsobmFuZCwgTkFORCwgMHgwMWRiLCAyMDgwMDAwMDApOworc3RhdGljIEFQTVVfQ0xLKG5hbmQsIE5BTkQsIDB4MTliLCAxNTYwMDAwMDApOwogc3RhdGljIEFQTVVfQ0xLKGxjZCwgTENELCAweDdmLCAzMTIwMDAwMDApOwogCiAvKiBkZXZpY2UgYW5kIGNsb2NrIGJpbmRpbmdzICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9weGE5MTAuYyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTkxMC5jCmluZGV4IDhmOTJjY2QuLjE0NjQ2MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL3B4YTkxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTkxMC5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIHN0YXRpYyBBUEJDX0NMSyhwd20zLCBQWEE5MTBfUFdNMywgMSwgMTMwMDAwMDApOwogc3RhdGljIEFQQkNfQ0xLKHB3bTQsIFBYQTkxMF9QV000LCAxLCAxMzAwMDAwMCk7CiAKLXN0YXRpYyBBUE1VX0NMSyhuYW5kLCBOQU5ELCAweDAxZGIsIDIwODAwMDAwMCk7CitzdGF0aWMgQVBNVV9DTEsobmFuZCwgTkFORCwgMHgxOWIsIDE1NjAwMDAwMCk7CiBzdGF0aWMgQVBNVV9DTEsodTJvLCBVU0IsIDB4MWIsIDQ4MDAwMDAwMCk7CiAKIC8qIGRldmljZSBhbmQgY2xvY2sgYmluZGluZ3MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnCmluZGV4IDE1MTY4OTYuLjg4OGU5MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vS2NvbmZpZwpAQCAtMTQ4LDIyICsxNDgsNiBAQAogCiBlbmRtZW51CiAKLWNvbmZpZyBNU01fSU9NTVUKLQlib29sICJNU00gSU9NTVUgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfTVNNOFg2MCB8fCBBUkNIX01TTTg5NjAKLQlzZWxlY3QgSU9NTVVfQVBJCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgdGhlIElPTU1VcyBmb3VuZCBvbiBjZXJ0YWluIFF1YWxjb21tIFNPQ3MuCi0JICBUaGVzZSBJT01NVXMgYWxsb3cgdmlydHVhbGl6YXRpb24gb2YgdGhlIGFkZHJlc3Mgc3BhY2UgdXNlZCBieSBtb3N0Ci0JICBjb3JlcyB3aXRoaW4gdGhlIG11bHRpbWVkaWEgc3Vic3lzdGVtLgotCi0JICBJZiB1bnN1cmUsIHNheSBOIGhlcmUuCi0KLWNvbmZpZyBJT01NVV9QR1RBQkxFU19MMgotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIE1TTV9JT01NVSAmJiBNTVUgJiYgU01QICYmIENQVV9EQ0FDSEVfRElTQUJMRT1uCi0KIGNvbmZpZyBNU01fREVCVUdfVUFSVAogCWludAogCWRlZmF1bHQgMSBpZiBNU01fREVCVUdfVUFSVDEKQEAgLTIwNSw5ICsxODksNiBAQAogY29uZmlnIE1TTV9WMl9UTE1NCiAJYm9vbAogCi1jb25maWcgSU9NTVVfQVBJCi0JYm9vbAotCiBjb25maWcgTVNNX1NDTQogCWJvb2wKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCmluZGV4IDk1MTlmZDIuLmI3MDY1OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogb2JqLSQoQ09ORklHX0RFQlVHX0ZTKSArPSBjbG9jay1kZWJ1Zy5vCiAKIG9iai0kKENPTkZJR19NU01fVklDKSArPSBpcnEtdmljLm8KLW9iai0kKENPTkZJR19NU01fSU9NTVUpICs9IGlvbW11Lm8gaW9tbXVfZGV2Lm8gZGV2aWNlcy1pb21tdS5vCitvYmotJChDT05GSUdfTVNNX0lPTU1VKSArPSBkZXZpY2VzLWlvbW11Lm8KIAogb2JqLSQoQ09ORklHX0FSQ0hfTVNNN1gwMEEpICs9IGRtYS5vIGlycS5vIGFjcHVjbG9jay1hcm0xMS5vCiBvYmotJChDT05GSUdfQVJDSF9NU003WDMwKSArPSBkbWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcGxhdHNtcC5jCmluZGV4IDIwMzQwOTguLjFhMWFmOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3BsYXRzbXAuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9wbGF0c21wLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+CkBAIC00MCw2ICs0MSwxMiBAQAogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJvb3RfbG9jayk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9jb3JlX2NvdW50KHZvaWQpCit7CisJLyogMSArIHRoZSBQQVJUWzE6MF0gZmllbGQgb2YgTUlEUiAqLworCXJldHVybiAoKHJlYWRfY3B1aWRfaWQoKSA+PiA0KSAmIDMpICsgMTsKK30KKwogdm9pZCBfX2NwdWluaXQgcGxhdGZvcm1fc2Vjb25kYXJ5X2luaXQodW5zaWduZWQgaW50IGNwdSkKIHsKIAkvKiBDb25maWd1cmUgZWRnZS10cmlnZ2VyZWQgUFBJcyAqLwpAQCAtMTQ3LDkgKzE1NCw5IEBACiAgKi8KIHZvaWQgX19pbml0IHNtcF9pbml0X2NwdXModm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaSwgbmNvcmVzID0gZ2V0X2NvcmVfY291bnQoKTsKIAotCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspCisJZm9yIChpID0gMDsgaSA8IG5jb3JlczsgaSsrKQogCQlzZXRfY3B1X3Bvc3NpYmxlKGksIHRydWUpOwogCiAgICAgICAgIHNldF9zbXBfY3Jvc3NfY2FsbChnaWNfcmFpc2Vfc29mdGlycSk7CkBAIC0xNTcsMTIgKzE2NCw0IEBACiAKIHZvaWQgX19pbml0IHBsYXRmb3JtX3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQogewotCWludCBpOwotCi0JLyoKLQkgKiBJbml0aWFsaXNlIHRoZSBwcmVzZW50IG1hcCwgd2hpY2ggZGVzY3JpYmVzIHRoZSBzZXQgb2YgQ1BVcwotCSAqIGFjdHVhbGx5IHBvcHVsYXRlZCBhdCB0aGUgcHJlc2VudCB0aW1lLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBtYXhfY3B1czsgaSsrKQotCQlzZXRfY3B1X3ByZXNlbnQoaSwgdHJ1ZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS90aW1lci5jIGIvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYwppbmRleCAzOGI5NWU5Li42MzYyMWYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS90aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKwogI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KIApAQCAtNTUsMTAgKzU3LDEyIEBACiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9RU0Q4WDUwKQogI2RlZmluZSBER1RfSFogKDE5MjAwMDAwIC8gNCkgLyogMTkuMiBNSHogLyA0IGJ5IGRlZmF1bHQgKi8KICNkZWZpbmUgTVNNX0RHVF9TSElGVCAoMCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNN1gzMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9NU004WDYwKSB8fCBcCi0JCQkJICAgICAgZGVmaW5lZChDT05GSUdfQVJDSF9NU004OTYwKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDMwKQogI2RlZmluZSBER1RfSFogKDI0NTc2MDAwIC8gNCkgLyogMjQuNTc2IE1IeiAoTFBYTykgLyA0IGJ5IGRlZmF1bHQgKi8KICNkZWZpbmUgTVNNX0RHVF9TSElGVCAoMCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNOFg2MCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9NU004OTYwKQorI2RlZmluZSBER1RfSFogKDI3MDAwMDAwIC8gNCkgLyogMjcgTUh6IChQWE8pIC8gNCBieSBkZWZhdWx0ICovCisjZGVmaW5lIE1TTV9ER1RfU0hJRlQgKDApCiAjZWxzZQogI2RlZmluZSBER1RfSFogMTkyMDAwMDAgLyogMTkuMiBNSHogb3IgNjAwIEtIeiBhZnRlciBzaGlmdCAqLwogI2RlZmluZSBNU01fREdUX1NISUZUICg1KQpAQCAtMTAwLDcgKzEwNCwxMSBAQAogewogCXN0cnVjdCBtc21fY2xvY2sgKmNsayA9IGNvbnRhaW5lcl9vZihjcywgc3RydWN0IG1zbV9jbG9jaywgY2xvY2tzb3VyY2UpOwogCi0JcmV0dXJuIHJlYWRsKGNsay0+Z2xvYmFsX2NvdW50ZXIpOworCS8qCisJICogU2hpZnQgdGltZXIgY291bnQgZG93biBieSBhIGNvbnN0YW50IGR1ZSB0byB1bnJlbGlhYmxlIGxvd2VyIGJpdHMKKwkgKiBvbiBzb21lIHRhcmdldHMuCisJICovCisJcmV0dXJuIHJlYWRsKGNsay0+Z2xvYmFsX2NvdW50ZXIpID4+IGNsay0+c2hpZnQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXNtX2Nsb2NrICpjbG9ja2V2ZW50X3RvX2Nsb2NrKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jCmluZGV4IGE1NjA0MzkuLmYyN2M3ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYwpAQCAtMTI5LDEyICsxMjksMTIgQEAKIAkJc3RydWN0IHBjaWVfcG9ydCAqcHAgPSBwY2llX3BvcnQgKyBpOwogCiAJCW12Nzh4eDBfc2V0dXBfcGNpZV9pb193aW4od2luKyssIHBwLT5yZXNbMF0uc3RhcnQsCi0JCQlwcC0+cmVzWzBdLmVuZCAtIHBwLT5yZXNbMF0uc3RhcnQgKyAxLAotCQkJcHAtPm1haiwgcHAtPm1pbik7CisJCQkJCSAgcmVzb3VyY2Vfc2l6ZSgmcHAtPnJlc1swXSksCisJCQkJCSAgcHAtPm1haiwgcHAtPm1pbik7CiAKIAkJbXY3OHh4MF9zZXR1cF9wY2llX21lbV93aW4od2luKyssIHBwLT5yZXNbMV0uc3RhcnQsCi0JCQlwcC0+cmVzWzFdLmVuZCAtIHBwLT5yZXNbMV0uc3RhcnQgKyAxLAotCQkJcHAtPm1haiwgcHAtPm1pbik7CisJCQkJCSAgIHJlc291cmNlX3NpemUoJnBwLT5yZXNbMV0pLAorCQkJCQkgICBwcC0+bWFqLCBwcC0+bWluKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW14NS9LY29uZmlnCmluZGV4IDc5OWZiYzQuLmYyNWU5ZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvS2NvbmZpZwpAQCAtMTA5LDYgKzEwOSw3IEBACiAJYm9vbAogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfS0VZUEFECiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1NESENJX0VTREhDX0lNWAorCXNlbGVjdCBMRURTX0dQSU9fUkVHSVNURVIKIAloZWxwCiAJICBUaGlzIGFkZHMgYm9hcmQgc3BlY2lmaWMgZGV2aWNlcyB0aGF0IGNhbiBiZSBmb3VuZCBvbiBFdWtyZWEncwogCSAgTUJJTVg1MSBldmFsdWF0aW9uIGJvYXJkLgpAQCAtMTM1LDYgKzEzNiw3IEBACiAJcHJvbXB0ICJFdWtyZWEgTUJJTVhTRCBkZXZlbG9wbWVudCBib2FyZCIKIAlib29sCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1NESENJX0VTREhDX0lNWAorCXNlbGVjdCBMRURTX0dQSU9fUkVHSVNURVIKIAloZWxwCiAJICBUaGlzIGFkZHMgYm9hcmQgc3BlY2lmaWMgZGV2aWNlcyB0aGF0IGNhbiBiZSBmb3VuZCBvbiBFdWtyZWEncwogCSAgTUJJTVhTRCBldmFsdWF0aW9uIGJvYXJkLgpAQCAtMTUxLDYgKzE1Myw3IEBACiAKIGNvbmZpZyBNQUNIX01YNTFfRUZJS0FNWAogCWJvb2wgIlN1cHBvcnQgTVg1MSBHZW5lc2kgRWZpa2EgTVggbmV0dG9wIgorCXNlbGVjdCBMRURTX0dQSU9fUkVHSVNURVIKIAlzZWxlY3QgTVg1MV9FRklLQV9DT01NT04KIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIEdlbmVzaSBFZmlrYSBNWCBuZXR0b3AuIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKQEAgLTE1OCw2ICsxNjEsNyBAQAogCiBjb25maWcgTUFDSF9NWDUxX0VGSUtBU0IKIAlib29sICJTdXBwb3J0IE1YNTEgR2VuZXNpIEVmaWthIFNtYXJ0Ym9vayIKKwlzZWxlY3QgTEVEU19HUElPX1JFR0lTVEVSCiAJc2VsZWN0IE1YNTFfRUZJS0FfQ09NTU9OCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBHZW5lc2kgRWZpa2EgU21hcnRib29rLiBUaGlzIGluY2x1ZGVzIHNwZWNpZmljCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1jcHVpbXg1MS5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtY3B1aW14NTEuYwppbmRleCA0ZWZhMDJlLi43Yzg5M2ZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1jcHVpbXg1MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLWNwdWlteDUxLmMKQEAgLTQzLDEwICs0Myw2IEBACiAjZGVmaW5lIENQVUlNWDUxX1FVQVJUQl9HUElPCUlNWF9HUElPX05SKDMsIDI1KQogI2RlZmluZSBDUFVJTVg1MV9RVUFSVENfR1BJTwlJTVhfR1BJT19OUigzLCAyNikKICNkZWZpbmUgQ1BVSU1YNTFfUVVBUlREX0dQSU8JSU1YX0dQSU9fTlIoMywgMjcpCi0jZGVmaW5lIENQVUlNWDUxX1FVQVJUQV9JUlEJKE1YQ19JTlRFUk5BTF9JUlFTICsgQ1BVSU1YNTFfUVVBUlRBX0dQSU8pCi0jZGVmaW5lIENQVUlNWDUxX1FVQVJUQl9JUlEJKE1YQ19JTlRFUk5BTF9JUlFTICsgQ1BVSU1YNTFfUVVBUlRCX0dQSU8pCi0jZGVmaW5lIENQVUlNWDUxX1FVQVJUQ19JUlEJKE1YQ19JTlRFUk5BTF9JUlFTICsgQ1BVSU1YNTFfUVVBUlRDX0dQSU8pCi0jZGVmaW5lIENQVUlNWDUxX1FVQVJURF9JUlEJKE1YQ19JTlRFUk5BTF9JUlFTICsgQ1BVSU1YNTFfUVVBUlREX0dQSU8pCiAjZGVmaW5lIENQVUlNWDUxX1FVQVJUX1hUQUwJMTQ3NDU2MDAKICNkZWZpbmUgQ1BVSU1YNTFfUVVBUlRfUkVHU0hJRlQJMTcKIApAQCAtNjEsNyArNTcsNyBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBzZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0gewogCXsKIAkJLm1hcGJhc2UgPSAodW5zaWduZWQgbG9uZykoTVg1MV9DUzFfQkFTRV9BRERSICsgMHg0MDAwMDApLAotCQkuaXJxID0gQ1BVSU1YNTFfUVVBUlRBX0lSUSwKKwkJLmlycSA9IGdwaW9fdG9faXJxKENQVUlNWDUxX1FVQVJUQV9HUElPKSwKIAkJLmlycWZsYWdzID0gSVJRRl9UUklHR0VSX0hJR0gsCiAJCS51YXJ0Y2xrID0gQ1BVSU1YNTFfUVVBUlRfWFRBTCwKIAkJLnJlZ3NoaWZ0ID0gQ1BVSU1YNTFfUVVBUlRfUkVHU0hJRlQsCkBAIC02OSw3ICs2NSw3IEBACiAJCS5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQLAogCX0sIHsKIAkJLm1hcGJhc2UgPSAodW5zaWduZWQgbG9uZykoTVg1MV9DUzFfQkFTRV9BRERSICsgMHg4MDAwMDApLAotCQkuaXJxID0gQ1BVSU1YNTFfUVVBUlRCX0lSUSwKKwkJLmlycSA9IGdwaW9fdG9faXJxKENQVUlNWDUxX1FVQVJUQl9HUElPKSwKIAkJLmlycWZsYWdzID0gSVJRRl9UUklHR0VSX0hJR0gsCiAJCS51YXJ0Y2xrID0gQ1BVSU1YNTFfUVVBUlRfWFRBTCwKIAkJLnJlZ3NoaWZ0ID0gQ1BVSU1YNTFfUVVBUlRfUkVHU0hJRlQsCkBAIC03Nyw3ICs3Myw3IEBACiAJCS5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQLAogCX0sIHsKIAkJLm1hcGJhc2UgPSAodW5zaWduZWQgbG9uZykoTVg1MV9DUzFfQkFTRV9BRERSICsgMHgxMDAwMDAwKSwKLQkJLmlycSA9IENQVUlNWDUxX1FVQVJUQ19JUlEsCisJCS5pcnEgPSBncGlvX3RvX2lycShDUFVJTVg1MV9RVUFSVENfR1BJTyksCiAJCS5pcnFmbGFncyA9IElSUUZfVFJJR0dFUl9ISUdILAogCQkudWFydGNsayA9IENQVUlNWDUxX1FVQVJUX1hUQUwsCiAJCS5yZWdzaGlmdCA9IENQVUlNWDUxX1FVQVJUX1JFR1NISUZULApAQCAtODUsNyArODEsNyBAQAogCQkuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QgfCBVUEZfSU9SRU1BUCwKIAl9LCB7CiAJCS5tYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpKE1YNTFfQ1MxX0JBU0VfQUREUiArIDB4MjAwMDAwMCksCi0JCS5pcnEgPSBDUFVJTVg1MV9RVUFSVERfSVJRLAorCQkuaXJxID0gaXJxX3RvX2dwaW8oQ1BVSU1YNTFfUVVBUlREX0dQSU8pLAogCQkuaXJxZmxhZ3MgPSBJUlFGX1RSSUdHRVJfSElHSCwKIAkJLnVhcnRjbGsgPSBDUFVJTVg1MV9RVUFSVF9YVEFMLAogCQkucmVnc2hpZnQgPSBDUFVJTVg1MV9RVUFSVF9SRUdTSElGVCwKQEAgLTI0NSw2ICsyNDEsOCBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgZXVrcmVhX2NwdWlteDUxX2luaXQodm9pZCkKIHsKKwlpbXg1MV9zb2NfaW5pdCgpOworCiAJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMoZXVrcmVhX2NwdWlteDUxX3BhZHMsCiAJCQkJCUFSUkFZX1NJWkUoZXVrcmVhX2NwdWlteDUxX3BhZHMpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtY3B1aW14NTFzZC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtY3B1aW14NTFzZC5jCmluZGV4IDVlZjI1YTUuLmZmMDk2ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLWNwdWlteDUxc2QuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1jcHVpbXg1MXNkLmMKQEAgLTI2NCw2ICsyNjQsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgZXVrcmVhX2NwdWlteDUxc2RfaW5pdCh2b2lkKQogeworCWlteDUxX3NvY19pbml0KCk7CisKIAlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhldWtyZWFfY3B1aW14NTFzZF9wYWRzLAogCQkJCQlBUlJBWV9TSVpFKGV1a3JlYV9jcHVpbXg1MXNkX3BhZHMpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MF9yZHAuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTBfcmRwLmMKaW5kZXggMTEyMTBlMS4uN2RlMjVjNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MF9yZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUwX3JkcC5jCkBAIC0xOTIsNiArMTkyLDggQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IG14NTBfcmRwX2JvYXJkX2luaXQodm9pZCkKIHsKKwlpbXg1MF9zb2NfaW5pdCgpOworCiAJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXg1MF9yZHBfcGFkcywKIAkJCQkJQVJSQVlfU0laRShteDUwX3JkcF9wYWRzKSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfM2RzLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxXzNkcy5jCmluZGV4IDYzZGZiZWEuLjA3YTM4MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfM2RzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV8zZHMuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTI2LDcgKzI3LDcgQEAKICNpbmNsdWRlICJkZXZpY2VzLWlteDUxLmgiCiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogCi0jZGVmaW5lIEVYUElPX1BBUkVOVF9JTlQJKE1YQ19JTlRFUk5BTF9JUlFTICsgR1BJT19QT1JUQSArIDYpCisjZGVmaW5lIEVYUElPX1BBUkVOVF9JTlQJZ3Bpb190b19pcnEoSU1YX0dQSU9fTlIoMSwgNikpCiAjZGVmaW5lIE1YNTFfM0RTX0VDU1BJMl9DUwkoR1BJT19QT1JUQyArIDI4KQogCiBzdGF0aWMgaW9tdXhfdjNfY2ZnX3QgbXg1MV8zZHNfcGFkc1tdID0gewpAQCAtMTM1LDYgKzEzNiw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBteDUxXzNkc19pbml0KHZvaWQpCiB7CisJaW14NTFfc29jX2luaXQoKTsKKwogCW14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKG14NTFfM2RzX3BhZHMsCiAJCQkJCUFSUkFZX1NJWkUobXg1MV8zZHNfcGFkcykpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2JhYmJhZ2UuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCmluZGV4IGM3YjNmYWIuLmU1NGU0YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCkBAIC0zNiw3ICszNiw3IEBACiAKICNkZWZpbmUgQkFCQkFHRV9VU0JfSFVCX1JFU0VUCUlNWF9HUElPX05SKDEsIDcpCiAjZGVmaW5lIEJBQkJBR0VfVVNCSDFfU1RQCUlNWF9HUElPX05SKDEsIDI3KQotI2RlZmluZSBCQUJCQUdFX1BIWV9SRVNFVAlJTVhfR1BJT19OUigyLCA1KQorI2RlZmluZSBCQUJCQUdFX1VTQl9QSFlfUkVTRVQJSU1YX0dQSU9fTlIoMiwgNSkKICNkZWZpbmUgQkFCQkFHRV9GRUNfUEhZX1JFU0VUCUlNWF9HUElPX05SKDIsIDE0KQogI2RlZmluZSBCQUJCQUdFX1BPV0VSX0tFWQlJTVhfR1BJT19OUigyLCAyMSkKICNkZWZpbmUgQkFCQkFHRV9FQ1NQSTFfQ1MwCUlNWF9HUElPX05SKDQsIDI0KQpAQCAtMTEwLDYgKzExMCw5IEBACiAJLyogVVNCIEhVQiByZXNldCBsaW5lKi8KIAlNWDUxX1BBRF9HUElPMV83X19HUElPMV83LAogCisJLyogVVNCIFBIWSByZXNldCBsaW5lICovCisJTVg1MV9QQURfRUlNX0QyMV9fR1BJTzJfNSwKKwogCS8qIEZFQyAqLwogCU1YNTFfUEFEX0VJTV9FQjJfX0ZFQ19NRElPLAogCU1YNTFfUEFEX0VJTV9FQjNfX0ZFQ19SREFUQTEsCkBAIC0xNjksMzQgKzE3MiwzMSBAQAogCS5iaXRyYXRlID0gNDAwMDAwLAogfTsKIAorc3RhdGljIHN0cnVjdCBncGlvIG14NTFfYmFiYmFnZV91c2JoMV9ncGlvc1tdID0geworCXsgQkFCQkFHRV9VU0JIMV9TVFAsIEdQSU9GX09VVF9JTklUX0xPVywgInVzYmgxX3N0cCIgfSwKKwl7IEJBQkJBR0VfVVNCX1BIWV9SRVNFVCwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAidXNiaDFfcGh5X3Jlc2V0IiB9LAorfTsKKwogc3RhdGljIGludCBncGlvX3VzYmgxX2FjdGl2ZSh2b2lkKQogewogCWlvbXV4X3YzX2NmZ190IHVzYmgxc3RwX2dwaW8gPSBNWDUxX1BBRF9VU0JIMV9TVFBfX0dQSU8xXzI3OwotCWlvbXV4X3YzX2NmZ190IHBoeXJlc2V0X2dwaW8gPSBNWDUxX1BBRF9FSU1fRDIxX19HUElPMl81OwogCWludCByZXQ7CiAKIAkvKiBTZXQgVVNCSDFfU1RQIHRvIEdQSU8gYW5kIHRvZ2dsZSBpdCAqLwogCW14Y19pb211eF92M19zZXR1cF9wYWQodXNiaDFzdHBfZ3Bpbyk7Ci0JcmV0ID0gZ3Bpb19yZXF1ZXN0KEJBQkJBR0VfVVNCSDFfU1RQLCAidXNiaDFfc3RwIik7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0X2FycmF5KG14NTFfYmFiYmFnZV91c2JoMV9ncGlvcywKKwkJCQkJQVJSQVlfU0laRShteDUxX2JhYmJhZ2VfdXNiaDFfZ3Bpb3MpKTsKIAogCWlmIChyZXQpIHsKLQkJcHJfZGVidWcoImZhaWxlZCB0byBnZXQgTVg1MV9QQURfVVNCSDFfU1RQX19HUElPXzFfMjc6ICVkXG4iLCByZXQpOworCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIGdldCBVU0JIMSBwaW5zOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEJBQkJBR0VfVVNCSDFfU1RQLCAwKTsKLQlncGlvX3NldF92YWx1ZShCQUJCQUdFX1VTQkgxX1NUUCwgMSk7CisKIAltc2xlZXAoMTAwKTsKLQlncGlvX2ZyZWUoQkFCQkFHRV9VU0JIMV9TVFApOwotCi0JLyogRGUtYXNzZXJ0IFVTQiBQSFkgUkVTRVRCICovCi0JbXhjX2lvbXV4X3YzX3NldHVwX3BhZChwaHlyZXNldF9ncGlvKTsKLQlyZXQgPSBncGlvX3JlcXVlc3QoQkFCQkFHRV9QSFlfUkVTRVQsICJwaHlfcmVzZXQiKTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZGVidWcoImZhaWxlZCB0byBnZXQgTVg1MV9QQURfRUlNX0QyMV9fR1BJT18yXzU6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoQkFCQkFHRV9QSFlfUkVTRVQsIDEpOworCWdwaW9fc2V0X3ZhbHVlKEJBQkJBR0VfVVNCSDFfU1RQLCAxKTsKKwlncGlvX3NldF92YWx1ZShCQUJCQUdFX1VTQl9QSFlfUkVTRVQsIDEpOworCWdwaW9fZnJlZV9hcnJheShteDUxX2JhYmJhZ2VfdXNiaDFfZ3Bpb3MsCisJCQkJCUFSUkFZX1NJWkUobXg1MV9iYWJiYWdlX3VzYmgxX2dwaW9zKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM0MCw2ICszNDAsOCBAQAogCWlvbXV4X3YzX2NmZ190IHBvd2VyX2tleSA9IF9NWDUxX1BBRF9FSU1fQTI3X19HUElPMl8yMSB8CiAJCU1VWF9QQURfQ1RSTChQQURfQ1RMX1NSRV9GQVNUIHwgUEFEX0NUTF9EU0VfSElHSCB8IFBBRF9DVExfUFVTXzEwMEtfVVApOwogCisJaW14NTFfc29jX2luaXQoKTsKKwogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9GUkVRX0lNWCkKIAlnZXRfY3B1X29wID0gbXg1MV9nZXRfY3B1X29wOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2VmaWthbXguYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfZWZpa2FteC5jCmluZGV4IDZlMzYyMzEuLmY3MDcwMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfZWZpa2FteC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfZWZpa2FteC5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgbXg1MV9lZmlrYW14X2xlZHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgbXg1MV9lZmlrYW14X2xlZHNbXSBfX2luaXRkYXRhID0gewogCXsKIAkJLm5hbWUgPSAiZWZpa2FteDpncmVlbiIsCiAJCS5kZWZhdWx0X3RyaWdnZXIgPSAiZGVmYXVsdC1vbiIsCkBAIC0xNTcsMTkgKzE1NywxMiBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgbXg1MV9lZmlrYW14X2xlZHNfZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YQorCQlteDUxX2VmaWthbXhfbGVkc19kYXRhIF9faW5pdGNvbnN0ID0gewogCS5sZWRzID0gbXg1MV9lZmlrYW14X2xlZHMsCiAJLm51bV9sZWRzID0gQVJSQVlfU0laRShteDUxX2VmaWthbXhfbGVkcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBteDUxX2VmaWthbXhfbGVkc19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAibGVkcy1ncGlvIiwKLQkuaWQgPSAtMSwKLQkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZteDUxX2VmaWthbXhfbGVkc19kYXRhLAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gbXg1MV9lZmlrYW14X3Bvd2Vya2V5W10gPSB7CiAJewogCQkuY29kZSA9IEtFWV9QT1dFUiwKQEAgLTIzNiw2ICsyMjksOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXg1MV9lZmlrYW14X2luaXQodm9pZCkKIHsKKwlpbXg1MV9zb2NfaW5pdCgpOworCiAJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXg1MWVmaWthbXhfcGFkcywKIAkJCQkJQVJSQVlfU0laRShteDUxZWZpa2FteF9wYWRzKSk7CiAJZWZpa2FfYm9hcmRfY29tbW9uX2luaXQoKTsKQEAgLTI0OCw3ICsyNDMsNyBAQAogCQlteDUxX2VmaWthbXhfbGVkc1syXS5kZWZhdWx0X3RyaWdnZXIgPSAibW1jMSI7CiAJfQogCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZteDUxX2VmaWthbXhfbGVkc19kZXZpY2UpOworCWdwaW9fbGVkX3JlZ2lzdGVyX2RldmljZSgtMSwgJm14NTFfZWZpa2FteF9sZWRzX2RhdGEpOwogCWlteF9hZGRfZ3Bpb19rZXlzKCZteDUxX2VmaWthbXhfcG93ZXJrZXlfZGF0YSk7CiAKIAlpZiAoc3lzdGVtX3JldiA9PSAweDExKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2VmaWthc2IuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfZWZpa2FzYi5jCmluZGV4IDQ3NGZjNmUuLjJlNGQ5ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfZWZpa2FzYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfZWZpa2FzYi5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIAkJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmgyX2RldmljZSwgJnVzYmgyX2NvbmZpZyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgbXg1MV9lZmlrYXNiX2xlZHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQgbXg1MV9lZmlrYXNiX2xlZHNbXSBfX2luaXRjb25zdCA9IHsKIAl7CiAJCS5uYW1lID0gImVmaWthc2I6Z3JlZW4iLAogCQkuZGVmYXVsdF90cmlnZ2VyID0gImRlZmF1bHQtb24iLApAQCAtMTQ2LDE5ICsxNDYsMTIgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIG14NTFfZWZpa2FzYl9sZWRzX2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEKKwkJbXg1MV9lZmlrYXNiX2xlZHNfZGF0YSBfX2luaXRjb25zdCA9IHsKIAkubGVkcyA9IG14NTFfZWZpa2FzYl9sZWRzLAogCS5udW1fbGVkcyA9IEFSUkFZX1NJWkUobXg1MV9lZmlrYXNiX2xlZHMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXg1MV9lZmlrYXNiX2xlZHNfZGV2aWNlID0gewotCS5uYW1lID0gImxlZHMtZ3BpbyIsCi0JLmlkID0gLTEsCi0JLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmbXg1MV9lZmlrYXNiX2xlZHNfZGF0YSwKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIG14NTFfZWZpa2FzYl9rZXlzW10gPSB7CiAJewogCQkuY29kZSA9IEtFWV9QT1dFUiwKQEAgLTI0OCw2ICsyNDEsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgZWZpa2FzYl9ib2FyZF9pbml0KHZvaWQpCiB7CisJaW14NTFfc29jX2luaXQoKTsKKwogCW14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKG14NTFlZmlrYXNiX3BhZHMsCiAJCQkJCUFSUkFZX1NJWkUobXg1MWVmaWthc2JfcGFkcykpOwogCWVmaWthX2JvYXJkX2NvbW1vbl9pbml0KCk7CkBAIC0yNTYsOSArMjUxLDggQEAKIAlteDUxX2VmaWthc2JfdXNiKCk7CiAJaW14NTFfYWRkX3NkaGNpX2VzZGhjX2lteCgxLCBOVUxMKTsKIAotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbXg1MV9lZmlrYXNiX2xlZHNfZGV2aWNlKTsKKwlncGlvX2xlZF9yZWdpc3Rlcl9kZXZpY2UoLTEsICZteDUxX2VmaWthc2JfbGVkc19kYXRhKTsKIAlpbXhfYWRkX2dwaW9fa2V5cygmbXg1MV9lZmlrYXNiX2tleXNfZGF0YSk7Ci0KIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG14NTFfZWZpa2FzYl90aW1lcl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2V2ay5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19ldmsuYwppbmRleCBmODdkNTcxLi4wZDkyMThhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2V2ay5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfZXZrLmMKQEAgLTExNyw2ICsxMTcsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXg1M19ldmtfYm9hcmRfaW5pdCh2b2lkKQogeworCWlteDUzX3NvY19pbml0KCk7CisKIAlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhteDUzX2V2a19wYWRzLAogCQkJCQlBUlJBWV9TSVpFKG14NTNfZXZrX3BhZHMpKTsKIAlteDUzX2V2a19pbml0X3VhcnQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfbG9jby5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19sb2NvLmMKaW5kZXggMWI5NDdlOC4uMzU5YzNlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19sb2NvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19sb2NvLmMKQEAgLTIyNyw2ICsyMjcsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXg1M19sb2NvX2JvYXJkX2luaXQodm9pZCkKIHsKKwlpbXg1M19zb2NfaW5pdCgpOworCiAJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXg1M19sb2NvX3BhZHMsCiAJCQkJCUFSUkFZX1NJWkUobXg1M19sb2NvX3BhZHMpKTsKIAlpbXg1M19hZGRfaW14X3VhcnQoMCwgTlVMTCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX3NtZC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19zbWQuYwppbmRleCA4MTdjMDg5Li5iYzAyODk0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX3NtZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfc21kLmMKQEAgLTExMyw2ICsxMTMsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXg1M19zbWRfYm9hcmRfaW5pdCh2b2lkKQogeworCWlteDUzX3NvY19pbml0KCk7CisKIAlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhteDUzX3NtZF9wYWRzLAogCQkJCQlBUlJBWV9TSVpFKG14NTNfc21kX3BhZHMpKTsKIAlteDUzX3NtZF9pbml0X3VhcnQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2Nsb2NrLW14NTEtbXg1My5jIGIvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS1teDUzLmMKaW5kZXggNmI4OWMxYi4uMGFkZWVhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS1teDUzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS1teDUzLmMKQEAgLTEyNzQsOSArMTI3NCw5IEBACiAKIC8qIEkyQyAqLwogREVGSU5FX0NMT0NLKGkyYzFfY2xrLCAwLCBNWENfQ0NNX0NDR1IxLCBNWENfQ0NNX0NDR1J4X0NHOV9PRkZTRVQsCi0JTlVMTCwgTlVMTCwgJmlwZ19jbGssIE5VTEwpOworCU5VTEwsIE5VTEwsICZpcGdfcGVyY2xrLCBOVUxMKTsKIERFRklORV9DTE9DSyhpMmMyX2NsaywgMSwgTVhDX0NDTV9DQ0dSMSwgTVhDX0NDTV9DQ0dSeF9DRzEwX09GRlNFVCwKLQlOVUxMLCBOVUxMLCAmaXBnX2NsaywgTlVMTCk7CisJTlVMTCwgTlVMTCwgJmlwZ19wZXJjbGssIE5VTEwpOwogREVGSU5FX0NMT0NLKGhzaTJjX2NsaywgMCwgTVhDX0NDTV9DQ0dSMSwgTVhDX0NDTV9DQ0dSeF9DRzExX09GRlNFVCwKIAlOVUxMLCBOVUxMLCAmaXBnX2NsaywgTlVMTCk7CiAKQEAgLTE0NDIsNyArMTQ0Miw4IEBACiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHRfMzJrIiwgZ3B0XzMya19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXg1MS1lY3NwaS4wIiwgTlVMTCwgZWNzcGkxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDUxLWVjc3BpLjEiLCBOVUxMLCBlY3NwaTJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14NTEtY3NwaS4wIiwgTlVMTCwgY3NwaV9jbGspCisJLyogaS5teDUxIGhhcyB0aGUgaS5teDM1IHR5cGUgY3NwaSAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MzUtY3NwaS4wIiwgTlVMTCwgY3NwaV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXguMCIsIE5VTEwsIGVzZGhjMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXguMSIsIE5VTEwsIGVzZGhjMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXguMiIsIE5VTEwsIGVzZGhjM19jbGspCkBAIC0xNDcxLDkgKzE0NzIsMTEgQEAKIAlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4xIiwgTlVMTCwgZXNkaGMyX214NTNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjIiLCBOVUxMLCBlc2RoYzNfbXg1M19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXguMyIsIE5VTEwsIGVzZGhjNF9teDUzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteDUzLWVjc3BpLjAiLCBOVUxMLCBlY3NwaTFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14NTMtZWNzcGkuMSIsIE5VTEwsIGVjc3BpMl9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXg1My1jc3BpLjAiLCBOVUxMLCBjc3BpX2NsaykKKwkvKiBpLm14NTMgaGFzIHRoZSBpLm14NTEgdHlwZSBlY3NwaSAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14NTEtZWNzcGkuMCIsIE5VTEwsIGVjc3BpMV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXg1MS1lY3NwaS4xIiwgTlVMTCwgZWNzcGkyX2NsaykKKwkvKiBpLm14NTMgaGFzIHRoZSBpLm14MjUgdHlwZSBjc3BpICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgzNS1jc3BpLjAiLCBOVUxMLCBjc3BpX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDItd2R0LjAiLCBOVUxMLCBkdW1teV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgyLXdkdC4xIiwgTlVMTCwgZHVtbXlfY2xrKQogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMuYwppbmRleCAxNTNhZGE1Li4zNzFjYThjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy5jCkBAIC0xMiw3ICsxMiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgpAQCAtMTE5LDY2ICsxMTgsMyBAQAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAogCX0sCiB9OwotCi1zdGF0aWMgc3RydWN0IG14Y19ncGlvX3BvcnQgbXhjX2dwaW9fcG9ydHNbXSA9IHsKLQl7Ci0JCS5jaGlwLmxhYmVsID0gImdwaW8tMCIsCi0JCS5iYXNlID0gTVg1MV9JT19BRERSRVNTKE1YNTFfR1BJTzFfQkFTRV9BRERSKSwKLQkJLmlycSA9IE1YNTFfTVhDX0lOVF9HUElPMV9MT1csCi0JCS5pcnFfaGlnaCA9IE1YNTFfTVhDX0lOVF9HUElPMV9ISUdILAotCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQKLQl9LAotCXsKLQkJLmNoaXAubGFiZWwgPSAiZ3Bpby0xIiwKLQkJLmJhc2UgPSBNWDUxX0lPX0FERFJFU1MoTVg1MV9HUElPMl9CQVNFX0FERFIpLAotCQkuaXJxID0gTVg1MV9NWENfSU5UX0dQSU8yX0xPVywKLQkJLmlycV9oaWdoID0gTVg1MV9NWENfSU5UX0dQSU8yX0hJR0gsCi0JCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVCArIDMyICogMQotCX0sCi0JewotCQkuY2hpcC5sYWJlbCA9ICJncGlvLTIiLAotCQkuYmFzZSA9IE1YNTFfSU9fQUREUkVTUyhNWDUxX0dQSU8zX0JBU0VfQUREUiksCi0JCS5pcnEgPSBNWDUxX01YQ19JTlRfR1BJTzNfTE9XLAotCQkuaXJxX2hpZ2ggPSBNWDUxX01YQ19JTlRfR1BJTzNfSElHSCwKLQkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgMzIgKiAyCi0JfSwKLQl7Ci0JCS5jaGlwLmxhYmVsID0gImdwaW8tMyIsCi0JCS5iYXNlID0gTVg1MV9JT19BRERSRVNTKE1YNTFfR1BJTzRfQkFTRV9BRERSKSwKLQkJLmlycSA9IE1YNTFfTVhDX0lOVF9HUElPNF9MT1csCi0JCS5pcnFfaGlnaCA9IE1YNTFfTVhDX0lOVF9HUElPNF9ISUdILAotCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyAzMiAqIDMKLQl9LAotCXsKLQkJLmNoaXAubGFiZWwgPSAiZ3Bpby00IiwKLQkJLmJhc2UgPSBNWDUzX0lPX0FERFJFU1MoTVg1M19HUElPNV9CQVNFX0FERFIpLAotCQkuaXJxID0gTVg1M19JTlRfR1BJTzVfTE9XLAotCQkuaXJxX2hpZ2ggPSBNWDUzX0lOVF9HUElPNV9ISUdILAotCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyAzMiAqIDQKLQl9LAotCXsKLQkJLmNoaXAubGFiZWwgPSAiZ3Bpby01IiwKLQkJLmJhc2UgPSBNWDUzX0lPX0FERFJFU1MoTVg1M19HUElPNl9CQVNFX0FERFIpLAotCQkuaXJxID0gTVg1M19JTlRfR1BJTzZfTE9XLAotCQkuaXJxX2hpZ2ggPSBNWDUzX0lOVF9HUElPNl9ISUdILAotCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyAzMiAqIDUKLQl9LAotCXsKLQkJLmNoaXAubGFiZWwgPSAiZ3Bpby02IiwKLQkJLmJhc2UgPSBNWDUzX0lPX0FERFJFU1MoTVg1M19HUElPN19CQVNFX0FERFIpLAotCQkuaXJxID0gTVg1M19JTlRfR1BJTzdfTE9XLAotCQkuaXJxX2hpZ2ggPSBNWDUzX0lOVF9HUElPN19ISUdILAotCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyAzMiAqIDYKLQl9LAotfTsKLQotaW50IF9faW5pdCBpbXg1MV9yZWdpc3Rlcl9ncGlvcyh2b2lkKQotewotCXJldHVybiBteGNfZ3Bpb19pbml0KG14Y19ncGlvX3BvcnRzLCA0KTsKLX0KLQotaW50IF9faW5pdCBpbXg1M19yZWdpc3Rlcl9ncGlvcyh2b2lkKQotewotCXJldHVybiBteGNfZ3Bpb19pbml0KG14Y19ncGlvX3BvcnRzLCBBUlJBWV9TSVpFKG14Y19ncGlvX3BvcnRzKSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2V1a3JlYV9tYmlteDUxLWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14NTEtYmFzZWJvYXJkLmMKaW5kZXggOTcyOTJkMi4uYmJmNDU2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14NTEtYmFzZWJvYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14NTEtYmFzZWJvYXJkLmMKQEAgLTMxLDEzICszMSwxMiBAQAogI2luY2x1ZGUgImRldmljZXMuaCIKIAogI2RlZmluZSBNQklNWDUxX1RTQzIwMDdfR1BJTwlJTVhfR1BJT19OUigzLCAzMCkKLSNkZWZpbmUgTUJJTVg1MV9UU0MyMDA3X0lSUQkoTVhDX0lOVEVSTkFMX0lSUVMgKyBNQklNWDUxX1RTQzIwMDdfR1BJTykKICNkZWZpbmUgTUJJTVg1MV9MRUQwCQlJTVhfR1BJT19OUigzLCA1KQogI2RlZmluZSBNQklNWDUxX0xFRDEJCUlNWF9HUElPX05SKDMsIDYpCiAjZGVmaW5lIE1CSU1YNTFfTEVEMgkJSU1YX0dQSU9fTlIoMywgNykKICNkZWZpbmUgTUJJTVg1MV9MRUQzCQlJTVhfR1BJT19OUigzLCA4KQogCi1zdGF0aWMgc3RydWN0IGdwaW9fbGVkIG1iaW14NTFfbGVkc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZCBtYmlteDUxX2xlZHNbXSBfX2luaXRjb25zdCA9IHsKIAl7CiAJCS5uYW1lCQkJPSAibGVkMCIsCiAJCS5kZWZhdWx0X3RyaWdnZXIJPSAiaGVhcnRiZWF0IiwKQEAgLTY0LDIzICs2MywxMSBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgbWJpbXg1MV9sZWRzX2luZm8gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgbWJpbXg1MV9sZWRzX2luZm8gX19pbml0Y29uc3QgPSB7CiAJLmxlZHMJCT0gbWJpbXg1MV9sZWRzLAogCS5udW1fbGVkcwk9IEFSUkFZX1NJWkUobWJpbXg1MV9sZWRzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1iaW14NTFfbGVkc19ncGlvID0gewotCS5uYW1lCT0gImxlZHMtZ3BpbyIsCi0JLmlkCT0gLTEsCi0JLmRldgk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmbWJpbXg1MV9sZWRzX2luZm8sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmbWJpbXg1MV9sZWRzX2dwaW8sCi19OwotCiBzdGF0aWMgaW9tdXhfdjNfY2ZnX3QgbWJpbXg1MV9wYWRzW10gPSB7CiAJLyogVUFSVDIgKi8KIAlNWDUxX1BBRF9VQVJUMl9SWERfX1VBUlQyX1JYRCwKQEAgLTE3Myw3ICsxNjAsNyBAQAogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBtYmlteDUxX2kyY19kZXZpY2VzW10gPSB7CiAJewogCQlJMkNfQk9BUkRfSU5GTygidHNjMjAwNyIsIDB4NDkpLAotCQkuaXJxICA9IE1CSU1YNTFfVFNDMjAwN19JUlEsCisJCS5pcnEgID0gZ3Bpb190b19pcnEoTUJJTVg1MV9UU0MyMDA3X0dQSU8pLAogCQkucGxhdGZvcm1fZGF0YSA9ICZ0c2MyMDA3X2RhdGEsCiAJfSwgewogCQlJMkNfQk9BUkRfSU5GTygidGx2MzIwYWljMjMiLCAweDFhKSwKQEAgLTIwNCwxMyArMTkxLDE0IEBACiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KE1CSU1YNTFfTEVEMywgMSk7CiAJZ3Bpb19mcmVlKE1CSU1YNTFfTEVEMyk7CiAKLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKKwlncGlvX2xlZF9yZWdpc3Rlcl9kZXZpY2UoLTEsICZtYmlteDUxX2xlZHNfaW5mbyk7CiAKIAlpbXg1MV9hZGRfaW14X2tleXBhZCgmbWJpbXg1MV9tYXBfZGF0YSk7CiAKIAlncGlvX3JlcXVlc3QoTUJJTVg1MV9UU0MyMDA3X0dQSU8sICJ0c2MyMDA3X2lycSIpOwogCWdwaW9fZGlyZWN0aW9uX2lucHV0KE1CSU1YNTFfVFNDMjAwN19HUElPKTsKLQlpcnFfc2V0X2lycV90eXBlKE1CSU1YNTFfVFNDMjAwN19JUlEsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKKwlpcnFfc2V0X2lycV90eXBlKGdwaW9fdG9faXJxKE1CSU1YNTFfVFNDMjAwN19HUElPKSwKKwkJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcpOwogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIG1iaW14NTFfaTJjX2RldmljZXMsCiAJCQkJQVJSQVlfU0laRShtYmlteDUxX2kyY19kZXZpY2VzKSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2V1a3JlYV9tYmlteHNkLWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14c2QtYmFzZWJvYXJkLmMKaW5kZXggMzFjODcxZS4uMjYxOTIzOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14c2QtYmFzZWJvYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14c2QtYmFzZWJvYXJkLmMKQEAgLTc0LDcgKzc0LDcgQEAKICNkZWZpbmUgR1BJT19MRUQxCUlNWF9HUElPX05SKDMsIDMwKQogI2RlZmluZSBHUElPX1NXSVRDSDEJSU1YX0dQSU9fTlIoMywgMzEpCiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZXVrcmVhX21iaW14c2RfbGVkc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZCBldWtyZWFfbWJpbXhzZF9sZWRzW10gX19pbml0Y29uc3QgPSB7CiAJewogCQkubmFtZQkJCT0gImxlZDEiLAogCQkuZGVmYXVsdF90cmlnZ2VyCT0gImhlYXJ0YmVhdCIsCkBAIC04MywxOSArODMsMTIgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGV1a3JlYV9tYmlteHNkX2xlZF9pbmZvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhCisJCWV1a3JlYV9tYmlteHNkX2xlZF9pbmZvIF9faW5pdGNvbnN0ID0gewogCS5sZWRzCQk9IGV1a3JlYV9tYmlteHNkX2xlZHMsCiAJLm51bV9sZWRzCT0gQVJSQVlfU0laRShldWtyZWFfbWJpbXhzZF9sZWRzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV1a3JlYV9tYmlteHNkX2xlZHNfZ3BpbyA9IHsKLQkubmFtZQk9ICJsZWRzLWdwaW8iLAotCS5pZAk9IC0xLAotCS5kZXYJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmV1a3JlYV9tYmlteHNkX2xlZF9pbmZvLAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gZXVrcmVhX21iaW14c2RfZ3Bpb19idXR0b25zW10gPSB7CiAJewogCQkuZ3BpbwkJPSBHUElPX1NXSVRDSDEsCkBAIC0xMTIsMTAgKzEwNSw2IEBACiAJLm5idXR0b25zCT0gQVJSQVlfU0laRShldWtyZWFfbWJpbXhzZF9ncGlvX2J1dHRvbnMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZldWtyZWFfbWJpbXhzZF9sZWRzX2dwaW8sCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCiB9OwpAQCAtMTU0LDYgKzE0Myw2IEBACiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgZXVrcmVhX21iaW14c2RfaTJjX2RldmljZXMsCiAJCQkJQVJSQVlfU0laRShldWtyZWFfbWJpbXhzZF9pMmNfZGV2aWNlcykpOwogCi0JcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7CisJZ3Bpb19sZWRfcmVnaXN0ZXJfZGV2aWNlKC0xLCAmZXVrcmVhX21iaW14c2RfbGVkX2luZm8pOwogCWlteF9hZGRfZ3Bpb19rZXlzKCZldWtyZWFfbWJpbXhzZF9idXR0b25fZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9tbS1teDUwLmMgYi9hcmNoL2FybS9tYWNoLW14NS9tbS1teDUwLmMKaW5kZXggYjljMzYzYi4uNzdlMzc0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvbW0tbXg1MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L21tLW14NTAuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtdjMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogLyoKQEAgLTU2LDE3ICs1NSwxOCBAQAogCW14Y19hcmNoX3Jlc2V0X2luaXQoTVg1MF9JT19BRERSRVNTKE1YNTBfV0RPR19CQVNFX0FERFIpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBteGNfZ3Bpb19wb3J0IGlteDUwX2dwaW9fcG9ydHNbXSA9IHsKLQlERUZJTkVfSU1YX0dQSU9fUE9SVF9JUlFfSElHSChNWDUwLCAwLCAxLCBNWDUwX0lOVF9HUElPMV9MT1csIE1YNTBfSU5UX0dQSU8xX0hJR0gpLAotCURFRklORV9JTVhfR1BJT19QT1JUX0lSUV9ISUdIKE1YNTAsIDEsIDIsIE1YNTBfSU5UX0dQSU8yX0xPVywgTVg1MF9JTlRfR1BJTzJfSElHSCksCi0JREVGSU5FX0lNWF9HUElPX1BPUlRfSVJRX0hJR0goTVg1MCwgMiwgMywgTVg1MF9JTlRfR1BJTzNfTE9XLCBNWDUwX0lOVF9HUElPM19ISUdIKSwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVF9JUlFfSElHSChNWDUwLCAzLCA0LCBNWDUwX0lOVF9HUElPM19MT1csIE1YNTBfSU5UX0dQSU8zX0hJR0gpLAotCURFRklORV9JTVhfR1BJT19QT1JUX0lSUV9ISUdIKE1YNTAsIDQsIDUsIE1YNTBfSU5UX0dQSU8zX0xPVywgTVg1MF9JTlRfR1BJTzNfSElHSCksCi0JREVGSU5FX0lNWF9HUElPX1BPUlRfSVJRX0hJR0goTVg1MCwgNSwgNiwgTVg1MF9JTlRfR1BJTzNfTE9XLCBNWDUwX0lOVF9HUElPM19ISUdIKSwKLX07Ci0KIHZvaWQgX19pbml0IG14NTBfaW5pdF9pcnEodm9pZCkKIHsKIAl0emljX2luaXRfaXJxKE1YNTBfSU9fQUREUkVTUyhNWDUwX1RaSUNfQkFTRV9BRERSKSk7Ci0JbXhjX2dwaW9faW5pdChpbXg1MF9ncGlvX3BvcnRzLAlBUlJBWV9TSVpFKGlteDUwX2dwaW9fcG9ydHMpKTsKK30KKwordm9pZCBfX2luaXQgaW14NTBfc29jX2luaXQodm9pZCkKK3sKKwkvKiBpLm14NTAgaGFzIHRoZSBpLm14MzEgdHlwZSBncGlvICovCisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAwLCBNWDUwX0dQSU8xX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUwX0lOVF9HUElPMV9MT1csIE1YNTBfSU5UX0dQSU8xX0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMSwgTVg1MF9HUElPMl9CQVNFX0FERFIsIFNaXzE2SywgTVg1MF9JTlRfR1BJTzJfTE9XLCBNWDUwX0lOVF9HUElPMl9ISUdIKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDIsIE1YNTBfR1BJTzNfQkFTRV9BRERSLCBTWl8xNkssIE1YNTBfSU5UX0dQSU8zX0xPVywgTVg1MF9JTlRfR1BJTzNfSElHSCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAzLCBNWDUwX0dQSU80X0JBU0VfQUREUiwgU1pfMTZLLCBNWDUwX0lOVF9HUElPNF9MT1csIE1YNTBfSU5UX0dQSU80X0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgNCwgTVg1MF9HUElPNV9CQVNFX0FERFIsIFNaXzE2SywgTVg1MF9JTlRfR1BJTzVfTE9XLCBNWDUwX0lOVF9HUElPNV9ISUdIKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDUsIE1YNTBfR1BJTzZfQkFTRV9BRERSLCBTWl8xNkssIE1YNTBfSU5UX0dQSU82X0xPVywgTVg1MF9JTlRfR1BJTzZfSElHSCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9tbS5jIGIvYXJjaC9hcm0vbWFjaC1teDUvbW0uYwppbmRleCBmZjU1NzMwLi42NjU4NDNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9tbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L21tLmMKQEAgLTY5LDggKzY5LDYgQEAKIAlteGNfYXJjaF9yZXNldF9pbml0KE1YNTNfSU9fQUREUkVTUyhNWDUzX1dET0cxX0JBU0VfQUREUikpOwogfQogCi1pbnQgaW14NTFfcmVnaXN0ZXJfZ3Bpb3Modm9pZCk7Ci0KIHZvaWQgX19pbml0IG14NTFfaW5pdF9pcnEodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHR6aWNfYWRkcjsKQEAgLTg2LDExICs4NCw4IEBACiAJCXBhbmljKCJ1bmFibGUgdG8gbWFwIFRaSUMgaW50ZXJydXB0IGNvbnRyb2xsZXJcbiIpOwogCiAJdHppY19pbml0X2lycSh0emljX3ZpcnQpOwotCWlteDUxX3JlZ2lzdGVyX2dwaW9zKCk7CiB9CiAKLWludCBpbXg1M19yZWdpc3Rlcl9ncGlvcyh2b2lkKTsKLQogdm9pZCBfX2luaXQgbXg1M19pbml0X2lycSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgdHppY19hZGRyOwpAQCAtMTAzLDUgKzk4LDI1IEBACiAJCXBhbmljKCJ1bmFibGUgdG8gbWFwIFRaSUMgaW50ZXJydXB0IGNvbnRyb2xsZXJcbiIpOwogCiAJdHppY19pbml0X2lycSh0emljX3ZpcnQpOwotCWlteDUzX3JlZ2lzdGVyX2dwaW9zKCk7Cit9CisKK3ZvaWQgX19pbml0IGlteDUxX3NvY19pbml0KHZvaWQpCit7CisJLyogaS5teDUxIGhhcyB0aGUgaS5teDMxIHR5cGUgZ3BpbyAqLworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMCwgTVg1MV9HUElPMV9CQVNFX0FERFIsIFNaXzE2SywgTVg1MV9NWENfSU5UX0dQSU8xX0xPVywgTVg1MV9NWENfSU5UX0dQSU8xX0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMSwgTVg1MV9HUElPMl9CQVNFX0FERFIsIFNaXzE2SywgTVg1MV9NWENfSU5UX0dQSU8yX0xPVywgTVg1MV9NWENfSU5UX0dQSU8yX0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMiwgTVg1MV9HUElPM19CQVNFX0FERFIsIFNaXzE2SywgTVg1MV9NWENfSU5UX0dQSU8zX0xPVywgTVg1MV9NWENfSU5UX0dQSU8zX0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMywgTVg1MV9HUElPNF9CQVNFX0FERFIsIFNaXzE2SywgTVg1MV9NWENfSU5UX0dQSU80X0xPVywgTVg1MV9NWENfSU5UX0dQSU80X0hJR0gpOworfQorCit2b2lkIF9faW5pdCBpbXg1M19zb2NfaW5pdCh2b2lkKQoreworCS8qIGkubXg1MyBoYXMgdGhlIGkubXgzMSB0eXBlIGdwaW8gKi8KKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDAsIE1YNTNfR1BJTzFfQkFTRV9BRERSLCBTWl8xNkssIE1YNTNfSU5UX0dQSU8xX0xPVywgTVg1M19JTlRfR1BJTzFfSElHSCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAxLCBNWDUzX0dQSU8yX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUzX0lOVF9HUElPMl9MT1csIE1YNTNfSU5UX0dQSU8yX0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMiwgTVg1M19HUElPM19CQVNFX0FERFIsIFNaXzE2SywgTVg1M19JTlRfR1BJTzNfTE9XLCBNWDUzX0lOVF9HUElPM19ISUdIKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDMsIE1YNTNfR1BJTzRfQkFTRV9BRERSLCBTWl8xNkssIE1YNTNfSU5UX0dQSU80X0xPVywgTVg1M19JTlRfR1BJTzRfSElHSCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCA0LCBNWDUzX0dQSU81X0JBU0VfQUREUiwgU1pfMTZLLCBNWDUzX0lOVF9HUElPNV9MT1csIE1YNTNfSU5UX0dQSU81X0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgNSwgTVg1M19HUElPNl9CQVNFX0FERFIsIFNaXzE2SywgTVg1M19JTlRfR1BJTzZfTE9XLCBNWDUzX0lOVF9HUElPNl9ISUdIKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDYsIE1YNTNfR1BJTzdfQkFTRV9BRERSLCBTWl8xNkssIE1YNTNfSU5UX0dQSU83X0xPVywgTVg1M19JTlRfR1BJTzdfSElHSCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1teHMvS2NvbmZpZwppbmRleCBmMTE0OTYwLi4xNjJiMGIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL0tjb25maWcKQEAgLTU1LDYgKzU1LDcgQEAKIGNvbmZpZyBNT0RVTEVfVFgyOAogCWJvb2wKIAlzZWxlY3QgU09DX0lNWDI4CisJc2VsZWN0IExFRFNfR1BJT19SRUdJU1RFUgogCXNlbGVjdCBNWFNfSEFWRV9BTUJBX0RVQVJUCiAJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX0FVQVJUCiAJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX0ZFQwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW14cy9NYWtlZmlsZQppbmRleCA1OGU4OTIzLi42YzM4MjYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW14cy9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKICMgQ29tbW9uIHN1cHBvcnQKLW9iai15IDo9IGNsb2NrLm8gZGV2aWNlcy5vIGdwaW8ubyBpY29sbC5vIGlvbXV4Lm8gc3lzdGVtLm8gdGltZXIubworb2JqLXkgOj0gY2xvY2subyBkZXZpY2VzLm8gaWNvbGwubyBpb211eC5vIHN5c3RlbS5vIHRpbWVyLm8KIAogb2JqLSQoQ09ORklHX01YU19PQ09UUCkgKz0gb2NvdHAubwogb2JqLSQoQ09ORklHX1BNKSArPSBwbS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzLmMKaW5kZXggY2ZkYjZiMi4uZmUzZTg0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMuYwpAQCAtODgsMyArODgsMTQgQEAKIAogCXJldHVybiBhbWJhX2RldmljZV9yZWdpc3RlcihhZGV2LCAmaW9tZW1fcmVzb3VyY2UpOwogfQorCitzdHJ1Y3QgZGV2aWNlIG14c19hcGJoX2J1cyA9IHsKKwkuaW5pdF9uYW1lCT0gIm14c19hcGJoIiwKKwkucGFyZW50ICAgICAgICAgPSAmcGxhdGZvcm1fYnVzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXhzX2RldmljZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGRldmljZV9yZWdpc3RlcigmbXhzX2FwYmhfYnVzKTsKK30KK2NvcmVfaW5pdGNhbGwobXhzX2RldmljZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL01ha2VmaWxlCmluZGV4IDMyNGYyODIuLjM1MTkxNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9NYWtlZmlsZQpAQCAtNiw0ICs2LDUgQEAKIG9iai0kKENPTkZJR19NWFNfSEFWRV9QTEFURk9STV9NWFNfSTJDKSArPSBwbGF0Zm9ybS1teHMtaTJjLm8KIG9iai0kKENPTkZJR19NWFNfSEFWRV9QTEFURk9STV9NWFNfTU1DKSArPSBwbGF0Zm9ybS1teHMtbW1jLm8KIG9iai0kKENPTkZJR19NWFNfSEFWRV9QTEFURk9STV9NWFNfUFdNKSArPSBwbGF0Zm9ybS1teHMtcHdtLm8KK29iai15ICs9IHBsYXRmb3JtLWdwaW8tbXhzLm8KIG9iai0kKENPTkZJR19NWFNfSEFWRV9QTEFURk9STV9NWFNGQikgKz0gcGxhdGZvcm0tbXhzZmIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9wbGF0Zm9ybS1hdWFydC5jIGIvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9wbGF0Zm9ybS1hdWFydC5jCmluZGV4IDc5NjYwNmMuLjI3NjA4ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvcGxhdGZvcm0tYXVhcnQuYworKysgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL3BsYXRmb3JtLWF1YXJ0LmMKQEAgLTYsNiArNiw3IEBACiAgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCiAgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogI2luY2x1ZGUgPG1hY2gvbXgyMy5oPgogI2luY2x1ZGUgPG1hY2gvbXgyOC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9wbGF0Zm9ybS1kbWEuYyBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvcGxhdGZvcm0tZG1hLmMKaW5kZXggMjk1YzQ0Mi4uNmEwMjAyYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9wbGF0Zm9ybS1kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL3BsYXRmb3JtLWRtYS5jCkBAIC02LDYgKzYsNyBAQAogICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9wbGF0Zm9ybS1mZWMuYyBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvcGxhdGZvcm0tZmVjLmMKaW5kZXggOTg1OWNmMi4uYWU5NmE0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9wbGF0Zm9ybS1mZWMuYworKysgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL3BsYXRmb3JtLWZlYy5jCkBAIC02LDYgKzYsNyBAQAogICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQogICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KICNpbmNsdWRlIDxtYWNoL214MjguaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL3BsYXRmb3JtLWdwaW8tbXhzLmMgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL3BsYXRmb3JtLWdwaW8tbXhzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwODg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvcGxhdGZvcm0tZ3Bpby1teHMuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxtYWNoL214MjMuaD4KKyNpbmNsdWRlIDxtYWNoL214MjguaD4KKyNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBteHNfYWRkX2dwaW8oCisJaW50IGlkLCByZXNvdXJjZV9zaXplX3QgaW9iYXNlLCBpbnQgaXJxKQoreworCXN0cnVjdCByZXNvdXJjZSByZXNbXSA9IHsKKwkJeworCQkJLnN0YXJ0ID0gaW9iYXNlLAorCQkJLmVuZCA9IGlvYmFzZSArIFNaXzhLIC0gMSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCQl9LCB7CisJCQkuc3RhcnQgPSBpcnEsCisJCQkuZW5kID0gaXJxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCX0sCisJfTsKKworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfcmVzbmRhdGEoJm14c19hcGJoX2J1cywKKwkJCSJncGlvLW14cyIsIGlkLCByZXMsIEFSUkFZX1NJWkUocmVzKSwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG14c19hZGRfbXhzX2dwaW8odm9pZCkKK3sKKwlpZiAoY3B1X2lzX214MjMoKSkgeworCQlteHNfYWRkX2dwaW8oMCwgTVgyM19QSU5DVFJMX0JBU0VfQUREUiwgTVgyM19JTlRfR1BJTzApOworCQlteHNfYWRkX2dwaW8oMSwgTVgyM19QSU5DVFJMX0JBU0VfQUREUiwgTVgyM19JTlRfR1BJTzEpOworCQlteHNfYWRkX2dwaW8oMiwgTVgyM19QSU5DVFJMX0JBU0VfQUREUiwgTVgyM19JTlRfR1BJTzIpOworCX0KKworCWlmIChjcHVfaXNfbXgyOCgpKSB7CisJCW14c19hZGRfZ3BpbygwLCBNWDI4X1BJTkNUUkxfQkFTRV9BRERSLCBNWDI4X0lOVF9HUElPMCk7CisJCW14c19hZGRfZ3BpbygxLCBNWDI4X1BJTkNUUkxfQkFTRV9BRERSLCBNWDI4X0lOVF9HUElPMSk7CisJCW14c19hZGRfZ3BpbygyLCBNWDI4X1BJTkNUUkxfQkFTRV9BRERSLCBNWDI4X0lOVF9HUElPMik7CisJCW14c19hZGRfZ3BpbygzLCBNWDI4X1BJTkNUUkxfQkFTRV9BRERSLCBNWDI4X0lOVF9HUElPMyk7CisJCW14c19hZGRfZ3Bpbyg0LCBNWDI4X1BJTkNUUkxfQkFTRV9BRERSLCBNWDI4X0lOVF9HUElPNCk7CisJfQorCisJcmV0dXJuIDA7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChteHNfYWRkX214c19ncGlvKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvcGxhdGZvcm0tbXhzZmIuYyBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvcGxhdGZvcm0tbXhzZmIuYwppbmRleCBiZjcyYzliLi41YTc1YjcxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL3BsYXRmb3JtLW14c2ZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9wbGF0Zm9ybS1teHNmYi5jCkBAIC01LDYgKzUsNyBAQAogICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQogICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KICNpbmNsdWRlIDxtYWNoL214MjMuaD4KICNpbmNsdWRlIDxtYWNoL214MjguaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtbXhzL2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5NTBmZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoKLSAqIE1YQyBHUElPIHN1cHBvcnQuIChjKSAyMDA4IERhbmllbCBNYWNrIDxkYW5pZWxAY2FpYXEuZGU+Ci0gKiBDb3B5cmlnaHQgMjAwOCBKdWVyZ2VuIEJlaXNlcnQsIGtlcm5lbEBwZW5ndXRyb25peC5kZQotICoKLSAqIEJhc2VkIG9uIGNvZGUgZnJvbSBGcmVlc2NhbGUsCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAotICogTUEgIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvbXgyMy5oPgotI2luY2x1ZGUgPG1hY2gvbXgyOC5oPgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2J1Zy5oPgotCi0jaW5jbHVkZSAiZ3Bpby5oIgotCi1zdGF0aWMgc3RydWN0IG14c19ncGlvX3BvcnQgKm14c19ncGlvX3BvcnRzOwotc3RhdGljIGludCBncGlvX3RhYmxlX3NpemU7Ci0KLSNkZWZpbmUgUElOQ1RSTF9ET1VUKG4pCQkoKGNwdV9pc19teDIzKCkgPyAweDA1MDAgOiAweDA3MDApICsgKG4pICogMHgxMCkKLSNkZWZpbmUgUElOQ1RSTF9ESU4obikJCSgoY3B1X2lzX214MjMoKSA/IDB4MDYwMCA6IDB4MDkwMCkgKyAobikgKiAweDEwKQotI2RlZmluZSBQSU5DVFJMX0RPRShuKQkJKChjcHVfaXNfbXgyMygpID8gMHgwNzAwIDogMHgwYjAwKSArIChuKSAqIDB4MTApCi0jZGVmaW5lIFBJTkNUUkxfUElOMklSUShuKQkoKGNwdV9pc19teDIzKCkgPyAweDA4MDAgOiAweDEwMDApICsgKG4pICogMHgxMCkKLSNkZWZpbmUgUElOQ1RSTF9JUlFFTihuKQkoKGNwdV9pc19teDIzKCkgPyAweDA5MDAgOiAweDExMDApICsgKG4pICogMHgxMCkKLSNkZWZpbmUgUElOQ1RSTF9JUlFMRVYobikJKChjcHVfaXNfbXgyMygpID8gMHgwYTAwIDogMHgxMjAwKSArIChuKSAqIDB4MTApCi0jZGVmaW5lIFBJTkNUUkxfSVJRUE9MKG4pCSgoY3B1X2lzX214MjMoKSA/IDB4MGIwMCA6IDB4MTMwMCkgKyAobikgKiAweDEwKQotI2RlZmluZSBQSU5DVFJMX0lSUVNUQVQobikJKChjcHVfaXNfbXgyMygpID8gMHgwYzAwIDogMHgxNDAwKSArIChuKSAqIDB4MTApCi0KLSNkZWZpbmUgR1BJT19JTlRfRkFMTF9FREdFCTB4MAotI2RlZmluZSBHUElPX0lOVF9MT1dfTEVWCTB4MQotI2RlZmluZSBHUElPX0lOVF9SSVNFX0VER0UJMHgyCi0jZGVmaW5lIEdQSU9fSU5UX0hJR0hfTEVWCTB4MwotI2RlZmluZSBHUElPX0lOVF9MRVZfTUFTSwkoMSA8PCAwKQotI2RlZmluZSBHUElPX0lOVF9QT0xfTUFTSwkoMSA8PCAxKQotCi0vKiBOb3RlOiBUaGlzIGRyaXZlciBhc3N1bWVzIDMyIEdQSU9zIGFyZSBoYW5kbGVkIGluIG9uZSByZWdpc3RlciAqLwotCi1zdGF0aWMgdm9pZCBjbGVhcl9ncGlvX2lycXN0YXR1cyhzdHJ1Y3QgbXhzX2dwaW9fcG9ydCAqcG9ydCwgdTMyIGluZGV4KQotewotCV9fbXhzX2NscmwoMSA8PCBpbmRleCwgcG9ydC0+YmFzZSArIFBJTkNUUkxfSVJRU1RBVChwb3J0LT5pZCkpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfZ3Bpb19pcnFlbmFibGUoc3RydWN0IG14c19ncGlvX3BvcnQgKnBvcnQsIHUzMiBpbmRleCwKLQkJCQlpbnQgZW5hYmxlKQotewotCWlmIChlbmFibGUpIHsKLQkJX19teHNfc2V0bCgxIDw8IGluZGV4LCBwb3J0LT5iYXNlICsgUElOQ1RSTF9JUlFFTihwb3J0LT5pZCkpOwotCQlfX214c19zZXRsKDEgPDwgaW5kZXgsIHBvcnQtPmJhc2UgKyBQSU5DVFJMX1BJTjJJUlEocG9ydC0+aWQpKTsKLQl9IGVsc2UgewotCQlfX214c19jbHJsKDEgPDwgaW5kZXgsIHBvcnQtPmJhc2UgKyBQSU5DVFJMX0lSUUVOKHBvcnQtPmlkKSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBteHNfZ3Bpb19hY2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQl1MzIgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0JY2xlYXJfZ3Bpb19pcnFzdGF0dXMoJm14c19ncGlvX3BvcnRzW2dwaW8gLyAzMl0sIGdwaW8gJiAweDFmKTsKLX0KLQotc3RhdGljIHZvaWQgbXhzX2dwaW9fbWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQotewotCXUzMiBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKLQlzZXRfZ3Bpb19pcnFlbmFibGUoJm14c19ncGlvX3BvcnRzW2dwaW8gLyAzMl0sIGdwaW8gJiAweDFmLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgbXhzX2dwaW9fdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JdTMyIGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOwotCXNldF9ncGlvX2lycWVuYWJsZSgmbXhzX2dwaW9fcG9ydHNbZ3BpbyAvIDMyXSwgZ3BpbyAmIDB4MWYsIDEpOwotfQotCi1zdGF0aWMgaW50IG14c19ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpOwotCi1zdGF0aWMgaW50IG14c19ncGlvX3NldF9pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQotewotCXUzMiBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKLQl1MzIgcGluX21hc2sgPSAxIDw8IChncGlvICYgMzEpOwotCXN0cnVjdCBteHNfZ3Bpb19wb3J0ICpwb3J0ID0gJm14c19ncGlvX3BvcnRzW2dwaW8gLyAzMl07Ci0Jdm9pZCBfX2lvbWVtICpwaW5fYWRkcjsKLQlpbnQgZWRnZTsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6Ci0JCWVkZ2UgPSBHUElPX0lOVF9SSVNFX0VER0U7Ci0JCWJyZWFrOwotCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgotCQllZGdlID0gR1BJT19JTlRfRkFMTF9FREdFOwotCQlicmVhazsKLQljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKLQkJZWRnZSA9IEdQSU9fSU5UX0xPV19MRVY7Ci0JCWJyZWFrOwotCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKLQkJZWRnZSA9IEdQSU9fSU5UX0hJR0hfTEVWOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBzZXQgbGV2ZWwgb3IgZWRnZSAqLwotCXBpbl9hZGRyID0gcG9ydC0+YmFzZSArIFBJTkNUUkxfSVJRTEVWKHBvcnQtPmlkKTsKLQlpZiAoZWRnZSAmIEdQSU9fSU5UX0xFVl9NQVNLKQotCQlfX214c19zZXRsKHBpbl9tYXNrLCBwaW5fYWRkcik7Ci0JZWxzZQotCQlfX214c19jbHJsKHBpbl9tYXNrLCBwaW5fYWRkcik7Ci0KLQkvKiBzZXQgcG9sYXJpdHkgKi8KLQlwaW5fYWRkciA9IHBvcnQtPmJhc2UgKyBQSU5DVFJMX0lSUVBPTChwb3J0LT5pZCk7Ci0JaWYgKGVkZ2UgJiBHUElPX0lOVF9QT0xfTUFTSykKLQkJX19teHNfc2V0bChwaW5fbWFzaywgcGluX2FkZHIpOwotCWVsc2UKLQkJX19teHNfY2xybChwaW5fbWFzaywgcGluX2FkZHIpOwotCi0JY2xlYXJfZ3Bpb19pcnFzdGF0dXMocG9ydCwgZ3BpbyAmIDB4MWYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIE1YUyBoYXMgb25lIGludGVycnVwdCAqcGVyKiBncGlvIHBvcnQgKi8KLXN0YXRpYyB2b2lkIG14c19ncGlvX2lycV9oYW5kbGVyKHUzMiBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKLXsKLQl1MzIgaXJxX3N0YXQ7Ci0Jc3RydWN0IG14c19ncGlvX3BvcnQgKnBvcnQgPSAoc3RydWN0IG14c19ncGlvX3BvcnQgKilpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOwotCXUzMiBncGlvX2lycV9ub19iYXNlID0gcG9ydC0+dmlydHVhbF9pcnFfc3RhcnQ7Ci0KLQlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfYWNrKCZkZXNjLT5pcnFfZGF0YSk7Ci0KLQlpcnFfc3RhdCA9IF9fcmF3X3JlYWRsKHBvcnQtPmJhc2UgKyBQSU5DVFJMX0lSUVNUQVQocG9ydC0+aWQpKSAmCi0JCQlfX3Jhd19yZWFkbChwb3J0LT5iYXNlICsgUElOQ1RSTF9JUlFFTihwb3J0LT5pZCkpOwotCi0Jd2hpbGUgKGlycV9zdGF0ICE9IDApIHsKLQkJaW50IGlycW9mZnNldCA9IGZscyhpcnFfc3RhdCkgLSAxOwotCQlnZW5lcmljX2hhbmRsZV9pcnEoZ3Bpb19pcnFfbm9fYmFzZSArIGlycW9mZnNldCk7Ci0JCWlycV9zdGF0ICY9IH4oMSA8PCBpcnFvZmZzZXQpOwotCX0KLX0KLQotLyoKLSAqIFNldCBpbnRlcnJ1cHQgbnVtYmVyICJpcnEiIGluIHRoZSBHUElPIGFzIGEgd2FrZS11cCBzb3VyY2UuCi0gKiBXaGlsZSBzeXN0ZW0gaXMgcnVubmluZywgYWxsIHJlZ2lzdGVyZWQgR1BJTyBpbnRlcnJ1cHRzIG5lZWQgdG8gaGF2ZQotICogd2FrZS11cCBlbmFibGVkLiBXaGVuIHN5c3RlbSBpcyBzdXNwZW5kZWQsIG9ubHkgc2VsZWN0ZWQgR1BJTyBpbnRlcnJ1cHRzCi0gKiBuZWVkIHRvIGhhdmUgd2FrZS11cCBlbmFibGVkLgotICogQHBhcmFtICBpcnEgICAgICAgICAgaW50ZXJydXB0IHNvdXJjZSBudW1iZXIKLSAqIEBwYXJhbSAgZW5hYmxlICAgICAgIGVuYWJsZSBhcyB3YWtlLXVwIGlmIGVxdWFsIHRvIG5vbi16ZXJvCi0gKiBAcmV0dXJuICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIG9uIHN1Y2Nlc3MuCi0gKi8KLXN0YXRpYyBpbnQgbXhzX2dwaW9fc2V0X3dha2VfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGVuYWJsZSkKLXsKLQl1MzIgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0JdTMyIGdwaW9faWR4ID0gZ3BpbyAmIDB4MWY7Ci0Jc3RydWN0IG14c19ncGlvX3BvcnQgKnBvcnQgPSAmbXhzX2dwaW9fcG9ydHNbZ3BpbyAvIDMyXTsKLQotCWlmIChlbmFibGUpIHsKLQkJaWYgKHBvcnQtPmlycV9oaWdoICYmIChncGlvX2lkeCA+PSAxNikpCi0JCQllbmFibGVfaXJxX3dha2UocG9ydC0+aXJxX2hpZ2gpOwotCQllbHNlCi0JCQllbmFibGVfaXJxX3dha2UocG9ydC0+aXJxKTsKLQl9IGVsc2UgewotCQlpZiAocG9ydC0+aXJxX2hpZ2ggJiYgKGdwaW9faWR4ID49IDE2KSkKLQkJCWRpc2FibGVfaXJxX3dha2UocG9ydC0+aXJxX2hpZ2gpOwotCQllbHNlCi0JCQlkaXNhYmxlX2lycV93YWtlKHBvcnQtPmlycSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZ3Bpb19pcnFfY2hpcCA9IHsKLQkubmFtZSA9ICJteHMgZ3BpbyIsCi0JLmlycV9hY2sgPSBteHNfZ3Bpb19hY2tfaXJxLAotCS5pcnFfbWFzayA9IG14c19ncGlvX21hc2tfaXJxLAotCS5pcnFfdW5tYXNrID0gbXhzX2dwaW9fdW5tYXNrX2lycSwKLQkuaXJxX3NldF90eXBlID0gbXhzX2dwaW9fc2V0X2lycV90eXBlLAotCS5pcnFfc2V0X3dha2UgPSBteHNfZ3Bpb19zZXRfd2FrZV9pcnEsCi19OwotCi1zdGF0aWMgdm9pZCBteHNfc2V0X2dwaW9fZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKLQkJCQlpbnQgZGlyKQotewotCXN0cnVjdCBteHNfZ3Bpb19wb3J0ICpwb3J0ID0KLQkJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBteHNfZ3Bpb19wb3J0LCBjaGlwKTsKLQl2b2lkIF9faW9tZW0gKnBpbl9hZGRyID0gcG9ydC0+YmFzZSArIFBJTkNUUkxfRE9FKHBvcnQtPmlkKTsKLQotCWlmIChkaXIpCi0JCV9fbXhzX3NldGwoMSA8PCBvZmZzZXQsIHBpbl9hZGRyKTsKLQllbHNlCi0JCV9fbXhzX2NscmwoMSA8PCBvZmZzZXQsIHBpbl9hZGRyKTsKLX0KLQotc3RhdGljIGludCBteHNfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBteHNfZ3Bpb19wb3J0ICpwb3J0ID0KLQkJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBteHNfZ3Bpb19wb3J0LCBjaGlwKTsKLQotCXJldHVybiAoX19yYXdfcmVhZGwocG9ydC0+YmFzZSArIFBJTkNUUkxfRElOKHBvcnQtPmlkKSkgPj4gb2Zmc2V0KSAmIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIG14c19ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbXhzX2dwaW9fcG9ydCAqcG9ydCA9Ci0JCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbXhzX2dwaW9fcG9ydCwgY2hpcCk7Ci0Jdm9pZCBfX2lvbWVtICpwaW5fYWRkciA9IHBvcnQtPmJhc2UgKyBQSU5DVFJMX0RPVVQocG9ydC0+aWQpOwotCi0JaWYgKHZhbHVlKQotCQlfX214c19zZXRsKDEgPDwgb2Zmc2V0LCBwaW5fYWRkcik7Ci0JZWxzZQotCQlfX214c19jbHJsKDEgPDwgb2Zmc2V0LCBwaW5fYWRkcik7Ci19Ci0KLXN0YXRpYyBpbnQgbXhzX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgbXhzX2dwaW9fcG9ydCAqcG9ydCA9Ci0JCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbXhzX2dwaW9fcG9ydCwgY2hpcCk7Ci0KLQlyZXR1cm4gcG9ydC0+dmlydHVhbF9pcnFfc3RhcnQgKyBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXhzX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlteHNfc2V0X2dwaW9fZGlyZWN0aW9uKGNoaXAsIG9mZnNldCwgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXhzX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JbXhzX2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOwotCW14c19zZXRfZ3Bpb19kaXJlY3Rpb24oY2hpcCwgb2Zmc2V0LCAxKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IF9faW5pdCBteHNfZ3Bpb19pbml0KHN0cnVjdCBteHNfZ3Bpb19wb3J0ICpwb3J0LCBpbnQgY250KQotewotCWludCBpLCBqOwotCi0JLyogc2F2ZSBmb3IgbG9jYWwgdXNhZ2UgKi8KLQlteHNfZ3Bpb19wb3J0cyA9IHBvcnQ7Ci0JZ3Bpb190YWJsZV9zaXplID0gY250OwotCi0JcHJfaW5mbygiTVhTIEdQSU8gaGFyZHdhcmVcbiIpOwotCi0JZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7Ci0JCS8qIGRpc2FibGUgdGhlIGludGVycnVwdCBhbmQgY2xlYXIgdGhlIHN0YXR1cyAqLwotCQlfX3Jhd193cml0ZWwoMCwgcG9ydFtpXS5iYXNlICsgUElOQ1RSTF9QSU4ySVJRKGkpKTsKLQkJX19yYXdfd3JpdGVsKDAsIHBvcnRbaV0uYmFzZSArIFBJTkNUUkxfSVJRRU4oaSkpOwotCi0JCS8qIGNsZWFyIGFkZHJlc3MgaGFzIHRvIGJlIHVzZWQgdG8gY2xlYXIgSVJRU1RBVCBiaXRzICovCi0JCV9fbXhzX2NscmwofjBVLCBwb3J0W2ldLmJhc2UgKyBQSU5DVFJMX0lSUVNUQVQoaSkpOwotCi0JCWZvciAoaiA9IHBvcnRbaV0udmlydHVhbF9pcnFfc3RhcnQ7Ci0JCQlqIDwgcG9ydFtpXS52aXJ0dWFsX2lycV9zdGFydCArIDMyOyBqKyspIHsKLQkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihqLCAmZ3Bpb19pcnFfY2hpcCwKLQkJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKLQkJCXNldF9pcnFfZmxhZ3MoaiwgSVJRRl9WQUxJRCk7Ci0JCX0KLQotCQkvKiBzZXR1cCBvbmUgaGFuZGxlciBmb3IgZWFjaCBlbnRyeSAqLwotCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwb3J0W2ldLmlycSwgbXhzX2dwaW9faXJxX2hhbmRsZXIpOwotCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShwb3J0W2ldLmlycSwgJnBvcnRbaV0pOwotCi0JCS8qIHJlZ2lzdGVyIGdwaW8gY2hpcCAqLwotCQlwb3J0W2ldLmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gbXhzX2dwaW9fZGlyZWN0aW9uX2lucHV0OwotCQlwb3J0W2ldLmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IG14c19ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7Ci0JCXBvcnRbaV0uY2hpcC5nZXQgPSBteHNfZ3Bpb19nZXQ7Ci0JCXBvcnRbaV0uY2hpcC5zZXQgPSBteHNfZ3Bpb19zZXQ7Ci0JCXBvcnRbaV0uY2hpcC50b19pcnEgPSBteHNfZ3Bpb190b19pcnE7Ci0JCXBvcnRbaV0uY2hpcC5iYXNlID0gaSAqIDMyOwotCQlwb3J0W2ldLmNoaXAubmdwaW8gPSAzMjsKLQotCQkvKiBpdHMgYSBzZXJpb3VzIGNvbmZpZ3VyYXRpb24gYnVnIHdoZW4gaXQgZmFpbHMgKi8KLQkJQlVHX09OKGdwaW9jaGlwX2FkZCgmcG9ydFtpXS5jaGlwKSA8IDApOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIE1YMjNfR1BJT19CQVNFCU1YMjNfSU9fQUREUkVTUyhNWDIzX1BJTkNUUkxfQkFTRV9BRERSKQotI2RlZmluZSBNWDI4X0dQSU9fQkFTRQlNWDI4X0lPX0FERFJFU1MoTVgyOF9QSU5DVFJMX0JBU0VfQUREUikKLQotI2RlZmluZSBERUZJTkVfTVhTX0dQSU9fUE9SVChfYmFzZSwgX2lycSwgX2lkKQkJCQlcCi0JewkJCQkJCQkJXAotCQkuY2hpcC5sYWJlbCA9ICJncGlvLSIgI19pZCwJCQkJXAotCQkuaWQgPSBfaWQsCQkJCQkJXAotCQkuaXJxID0gX2lycSwJCQkJCQlcCi0JCS5iYXNlID0gX2Jhc2UsCQkJCQkJXAotCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWFNfR1BJT19JUlFfU1RBUlQgKyAoX2lkKSAqIDMyLAlcCi0JfQotCi0jaWZkZWYgQ09ORklHX1NPQ19JTVgyMwotc3RhdGljIHN0cnVjdCBteHNfZ3Bpb19wb3J0IG14MjNfZ3Bpb19wb3J0c1tdID0gewotCURFRklORV9NWFNfR1BJT19QT1JUKE1YMjNfR1BJT19CQVNFLCBNWDIzX0lOVF9HUElPMCwgMCksCi0JREVGSU5FX01YU19HUElPX1BPUlQoTVgyM19HUElPX0JBU0UsIE1YMjNfSU5UX0dQSU8xLCAxKSwKLQlERUZJTkVfTVhTX0dQSU9fUE9SVChNWDIzX0dQSU9fQkFTRSwgTVgyM19JTlRfR1BJTzIsIDIpLAotfTsKLQotaW50IF9faW5pdCBteDIzX3JlZ2lzdGVyX2dwaW9zKHZvaWQpCi17Ci0JcmV0dXJuIG14c19ncGlvX2luaXQobXgyM19ncGlvX3BvcnRzLCBBUlJBWV9TSVpFKG14MjNfZ3Bpb19wb3J0cykpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfU09DX0lNWDI4Ci1zdGF0aWMgc3RydWN0IG14c19ncGlvX3BvcnQgbXgyOF9ncGlvX3BvcnRzW10gPSB7Ci0JREVGSU5FX01YU19HUElPX1BPUlQoTVgyOF9HUElPX0JBU0UsIE1YMjhfSU5UX0dQSU8wLCAwKSwKLQlERUZJTkVfTVhTX0dQSU9fUE9SVChNWDI4X0dQSU9fQkFTRSwgTVgyOF9JTlRfR1BJTzEsIDEpLAotCURFRklORV9NWFNfR1BJT19QT1JUKE1YMjhfR1BJT19CQVNFLCBNWDI4X0lOVF9HUElPMiwgMiksCi0JREVGSU5FX01YU19HUElPX1BPUlQoTVgyOF9HUElPX0JBU0UsIE1YMjhfSU5UX0dQSU8zLCAzKSwKLQlERUZJTkVfTVhTX0dQSU9fUE9SVChNWDI4X0dQSU9fQkFTRSwgTVgyOF9JTlRfR1BJTzQsIDQpLAotfTsKLQotaW50IF9faW5pdCBteDI4X3JlZ2lzdGVyX2dwaW9zKHZvaWQpCi17Ci0JcmV0dXJuIG14c19ncGlvX2luaXQobXgyOF9ncGlvX3BvcnRzLCBBUlJBWV9TSVpFKG14MjhfZ3Bpb19wb3J0cykpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9ncGlvLmggYi9hcmNoL2FybS9tYWNoLW14cy9ncGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNWJiMDYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvZ3Bpby5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgMjAwOCBKdWVyZ2VuIEJlaXNlcnQsIGtlcm5lbEBwZW5ndXRyb25peC5kZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAotICogTUEgIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fTVhTX0dQSU9fSF9fCi0jZGVmaW5lIF9fTVhTX0dQSU9fSF9fCi0KLXN0cnVjdCBteHNfZ3Bpb19wb3J0IHsKLQl2b2lkIF9faW9tZW0gKmJhc2U7Ci0JaW50IGlkOwotCWludCBpcnE7Ci0JaW50IGlycV9oaWdoOwotCWludCB2aXJ0dWFsX2lycV9zdGFydDsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7Ci19OwotCi1pbnQgbXhzX2dwaW9faW5pdChzdHJ1Y3QgbXhzX2dwaW9fcG9ydCosIGludCk7Ci0KLSNlbmRpZiAvKiBfX01YU19HUElPX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaAppbmRleCA3YTM3NDY5Li44MTJkN2E4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaAorKysgYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaApAQCAtMTEsNiArMTEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogCitleHRlcm4gc3RydWN0IGRldmljZSBteHNfYXBiaF9idXM7CisKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm14c19hZGRfcGxhdGZvcm1fZGV2aWNlX2RtYW1hc2soCiAJCWNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCwKIAkJY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGludCBudW1fcmVzb3VyY2VzLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IDdmNGFlZWEuLjIwM2Q3YzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTksNiArOSw4IEBACiAjaWZuZGVmIF9fTUFDSF9NWFNfRE1BX0hfXwogI2RlZmluZSBfX01BQ0hfTVhTX0RNQV9IX18KIAorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorCiBzdHJ1Y3QgbXhzX2RtYV9kYXRhIHsKIAlpbnQgY2hhbl9pcnE7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1teDI4ZXZrLmMgYi9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW14MjhldmsuYwppbmRleCBlYWNkYzZiLi41Njc2N2E1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW14MjhldmsuYworKysgYi9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW14MjhldmsuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyOC5oPgogCiAjaW5jbHVkZSAiZGV2aWNlcy1teDI4LmgiCi0jaW5jbHVkZSAiZ3Bpby5oIgogCiAjZGVmaW5lIE1YMjhFVktfRkxFWENBTl9TV0lUQ0gJTVhTX0dQSU9fTlIoMiwgMTMpCiAjZGVmaW5lIE1YMjhFVktfRkVDX1BIWV9QT1dFUglNWFNfR1BJT19OUigyLCAxNSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtdHgyOC5jIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC10eDI4LmMKaW5kZXggYjY1ZTM3MS4uNjc2NmExMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC10eDI4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC10eDI4LmMKQEAgLTEwMSwxNCArMTAxLDYgQEAKIAkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCiAJTVgyOF9QQURfU1NQMF9EQVRBM19fU1NQMF9EMyB8CiAJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAotCU1YMjhfUEFEX1NTUDBfREFUQTRfX1NTUDBfRDQgfAotCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKLQlNWDI4X1BBRF9TU1AwX0RBVEE1X19TU1AwX0Q1IHwKLQkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCi0JTVgyOF9QQURfU1NQMF9EQVRBNl9fU1NQMF9ENiB8Ci0JCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAotCU1YMjhfUEFEX1NTUDBfREFUQTdfX1NTUDBfRDcgfAotCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKIAlNWDI4X1BBRF9TU1AwX0NNRF9fU1NQMF9DTUQgfAogCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKIAlNWDI4X1BBRF9TU1AwX0RFVEVDVF9fU1NQMF9DQVJEX0RFVEVDVCB8CkBAIC0xMTcsNyArMTA5LDcgQEAKIAkJKE1YU19QQURfMTJNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9OT1BVTEwpLAogfTsKIAotc3RhdGljIHN0cnVjdCBncGlvX2xlZCB0eDI4X3N0azV2M19sZWRzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkIHR4Mjhfc3RrNXYzX2xlZHNbXSBfX2luaXRjb25zdCA9IHsKIAl7CiAJCS5uYW1lID0gIkdQSU8tTEVEIiwKIAkJLmRlZmF1bHRfdHJpZ2dlciA9ICJoZWFydGJlYXQiLApAQCAtMTU5LDggKzE1MSw3IEBACiAJLyogc3BpIHZpYSBzc3Agd2lsbCBiZSBhZGRlZCB3aGVuIGF2YWlsYWJsZSAqLwogCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHR4Mjhfc3BpX2JvYXJkX2luZm8sCiAJCQlBUlJBWV9TSVpFKHR4Mjhfc3BpX2JvYXJkX2luZm8pKTsKLQlteHNfYWRkX3BsYXRmb3JtX2RldmljZSgibGVkcy1ncGlvIiwgMCwgTlVMTCwgMCwKLQkJCSZ0eDI4X3N0azV2M19sZWRfZGF0YSwgc2l6ZW9mKHR4Mjhfc3RrNXYzX2xlZF9kYXRhKSk7CisJZ3Bpb19sZWRfcmVnaXN0ZXJfZGV2aWNlKDAsICZ0eDI4X3N0azV2M19sZWRfZGF0YSk7CiAJbXgyOF9hZGRfbXhzX2kyYygwKTsKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCB0eDI4X3N0azV2M19pMmNfYm9hcmRpbmZvLAogCQkJQVJSQVlfU0laRSh0eDI4X3N0azV2M19pMmNfYm9hcmRpbmZvKSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9tbS1teDIzLmMgYi9hcmNoL2FybS9tYWNoLW14cy9tbS1teDIzLmMKaW5kZXggNTE0OGNkNi4uMWIyMzQ1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvbW0tbXgyMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL21tLW14MjMuYwpAQCAtNDEsNSArNDEsNCBAQAogdm9pZCBfX2luaXQgbXgyM19pbml0X2lycSh2b2lkKQogewogCWljb2xsX2luaXRfaXJxKCk7Ci0JbXgyM19yZWdpc3Rlcl9ncGlvcygpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvbW0tbXgyOC5jIGIvYXJjaC9hcm0vbWFjaC1teHMvbW0tbXgyOC5jCmluZGV4IDdlNGNlYTMuLmI2ZTE4ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL21tLW14MjguYworKysgYi9hcmNoL2FybS9tYWNoLW14cy9tbS1teDI4LmMKQEAgLTQxLDUgKzQxLDQgQEAKIHZvaWQgX19pbml0IG14MjhfaW5pdF9pcnEodm9pZCkKIHsKIAlpY29sbF9pbml0X2lycSgpOwotCW14MjhfcmVnaXN0ZXJfZ3Bpb3MoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL29jb3RwLmMgYi9hcmNoL2FybS9tYWNoLW14cy9vY290cC5jCmluZGV4IDY1MTU3YTMuLjU0YWRkNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL29jb3RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvb2NvdHAuYwpAQCAtMTYsNiArMTYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CS8qIGZvciBjcHVfcmVsYXgoKSAqLworCiAjaW5jbHVkZSA8bWFjaC9teHMuaD4KIAogI2RlZmluZSBPQ09UUF9XT1JEX09GRlNFVAkJMHgyMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKaW5kZXggOThhMjFiOC4uN2QxMWE1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAorKysgYi9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCkBAIC0xOCw2ICsxOCw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfVk1BTExPQ19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfVk1BTExPQ19ICiAKLSNkZWZpbmUgVk1BTExPQ19FTkQJICAoMHhFMDAwMDAwMCkKKyNkZWZpbmUgVk1BTExPQ19FTkQJICAweEUwMDAwMDAwVUwKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfVk1BTExPQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZQppbmRleCBhZjk4MTE3Li41YjExNGQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUKQEAgLTQsMTQgKzQsMTQgQEAKIAogIyBDb21tb24gc3VwcG9ydAogb2JqLXkgOj0gaW8ubyBpZC5vIHNyYW0ubyB0aW1lLm8gaXJxLm8gbXV4Lm8gZmxhc2gubyBzZXJpYWwubyBkZXZpY2VzLm8gZG1hLm8KLW9iai15ICs9IGNsb2NrLm8gY2xvY2tfZGF0YS5vIG9wcF9kYXRhLm8gcmVzZXQubworb2JqLXkgKz0gY2xvY2subyBjbG9ja19kYXRhLm8gb3BwX2RhdGEubyByZXNldC5vIHBtX2J1cy5vCiAKIG9iai0kKENPTkZJR19PTUFQX01DQlNQKSArPSBtY2JzcC5vCiAKIG9iai0kKENPTkZJR19PTUFQXzMyS19USU1FUikJKz0gdGltZXIzMmsubwogCiAjIFBvd2VyIE1hbmFnZW1lbnQKLW9iai0kKENPTkZJR19QTSkgKz0gcG0ubyBzbGVlcC5vIHBtX2J1cy5vCitvYmotJChDT05GSUdfUE0pICs9IHBtLm8gc2xlZXAubwogCiAjIERTUAogb2JqLSQoQ09ORklHX09NQVBfTUJPWF9GV0spCSs9IG1haWxib3hfbWFjaC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWFtcy1kZWx0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1hbXMtZGVsdGEuYwppbmRleCBkZTg4YzkyLi4zMTJlYTZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWFtcy1kZWx0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGFtc19kZWx0YV9pbml0X2lycSh2b2lkKQogewogCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcF9pbml0X2lycSgpOworCW9tYXAxX2luaXRfaXJxKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYW1zX2RlbHRhX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewpAQCAtMjE1LDcgKzIxNSw3IEBACiAJLmRlbGF5CQk9IDksCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbXNfZGVsdGFfa3BfZGV2aWNlIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbXNfZGVsdGFfa3BfZGV2aWNlID0gewogCS5uYW1lCQk9ICJvbWFwLWtleXBhZCIsCiAJLmlkCQk9IC0xLAogCS5kZXYJCT0gewpAQCAtMjI1LDEyICsyMjUsMTIgQEAKIAkucmVzb3VyY2UJPSBhbXNfZGVsdGFfa3BfcmVzb3VyY2VzLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYW1zX2RlbHRhX2xjZF9kZXZpY2UgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFtc19kZWx0YV9sY2RfZGV2aWNlID0gewogCS5uYW1lCT0gImxjZF9hbXNfZGVsdGEiLAogCS5pZAk9IC0xLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYW1zX2RlbHRhX2xlZF9kZXZpY2UgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFtc19kZWx0YV9sZWRfZGV2aWNlID0gewogCS5uYW1lCT0gImFtcy1kZWx0YS1sZWQiLAogCS5pZAk9IC0xCiB9OwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJLnBvd2VyCQk9IGFtc19kZWx0YV9jYW1lcmFfcG93ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbXNfZGVsdGFfY2FtZXJhX2RldmljZSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYW1zX2RlbHRhX2NhbWVyYV9kZXZpY2UgPSB7CiAJLm5hbWUgICA9ICJzb2MtY2FtZXJhLXBkcnYiLAogCS5pZCAgICAgPSAwLAogCS5kZXYgICAgPSB7CkBAIC0zOTEsNyArMzkxLDcgQEAKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBhbXNfZGVsdGFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGFtc19kZWx0YV9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKIAogRVhQT1JUX1NZTUJPTChhbXNfZGVsdGFfbGF0Y2gxX3dyaXRlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZnNhbXBsZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1mc2FtcGxlLmMKaW5kZXggODdmMTczZC4uYTZiMWJlYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1mc2FtcGxlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1mc2FtcGxlLmMKQEAgLTMyOSw3ICszMjksNyBAQAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZnNhbXBsZV9pbml0X2lycSh2b2lkKQogewogCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcF9pbml0X2lycSgpOworCW9tYXAxX2luaXRfaXJxKCk7CiB9CiAKIC8qIE9ubHkgRlBHQSBuZWVkcyB0byBiZSBtYXBwZWQgaGVyZS4gQWxsIG90aGVycyBhcmUgZG9uZSB3aXRoIGlvcmVtYXAgKi8KQEAgLTM5NCw1ICszOTQsNSBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IG9tYXBfZnNhbXBsZV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9mc2FtcGxlX2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYwppbmRleCAyM2Y0YWI5Li4wNGZjMzU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYwpAQCAtMzEsNyArMzEsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19pbml0X2lycSh2b2lkKQogewogCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcF9pbml0X2lycSgpOworCW9tYXAxX2luaXRfaXJxKCk7CiB9CiAKIC8qIGFzc3VtZSBubyBNaW5pLUFCIHBvcnQgKi8KQEAgLTk5LDUgKzk5LDUgQEAKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwX2dlbmVyaWNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfZ2VuZXJpY19pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYwppbmRleCBiYTNiZDA5Li5jYjdmYjFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jCkBAIC0zNzYsNyArMzc2LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBoMl9pbml0X2lycSh2b2lkKQogewogCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcF9pbml0X2lycSgpOworCW9tYXAxX2luaXRfaXJxKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGgyX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKQEAgLTQ2Niw1ICs0NjYsNSBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IGgyX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBoMl9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYwppbmRleCBhYzQ4Njc3Li4zMWYzNDg3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCkBAIC00MzksNyArNDM5LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBoM19pbml0X2lycSh2b2lkKQogewogCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcF9pbml0X2lycSgpOworCW9tYXAxX2luaXRfaXJxKCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBoM19tYXBfaW8odm9pZCkKQEAgLTQ1NCw1ICs0NTQsNSBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IGgzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBoM19pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaHRjaGVyYWxkLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWh0Y2hlcmFsZC5jCmluZGV4IGJhMDVhNTEuLjM2ZTA2ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaHRjaGVyYWxkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1odGNoZXJhbGQuYwpAQCAtNjA1LDcgKzYwNSw3IEBACiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiaHRjaGVyYWxkX2luaXRfaXJxLlxuIik7CiAJb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwX2luaXRfaXJxKCk7CisJb21hcDFfaW5pdF9pcnEoKTsKIH0KIAogTUFDSElORV9TVEFSVChIRVJBTEQsICJIVEMgSGVyYWxkIikKQEAgLTYxNiw1ICs2MTYsNSBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycSAgICAgICA9IGh0Y2hlcmFsZF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lICAgPSBodGNoZXJhbGRfaW5pdCwKLQkudGltZXIgICAgICAgICAgPSAmb21hcF90aW1lciwKKwkudGltZXIgICAgICAgICAgPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKaW5kZXggMmQ5YjhjYi4uMGIxYmE0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCkBAIC0yOTIsNyArMjkyLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbm5vdmF0b3JfaW5pdF9pcnEodm9pZCkKIHsKIAlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXBfaW5pdF9pcnEoKTsKKwlvbWFwMV9pbml0X2lycSgpOwogfQogCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKQEAgLTQ2NCw1ICs0NjQsNSBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IGlubm92YXRvcl9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gaW5ub3ZhdG9yX2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1ub2tpYTc3MC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1ub2tpYTc3MC5jCmluZGV4IGNmZDA4NDkuLjU0NjljZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbm9raWE3NzAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5va2lhNzcwLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAlvbWFwX3dyaXRldygob21hcF9yZWFkdygweGZmZmI1MDA0KSAmIH4yKSwgMHhmZmZiNTAwNCk7CiAKIAlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXBfaW5pdF9pcnEoKTsKKwlvbWFwMV9pbml0X2lycSgpOwogfQogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5va2lhNzcwX2tleW1hcFtdID0gewpAQCAtMjY5LDUgKzI2OSw1IEBACiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gb21hcF9ub2tpYTc3MF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9ub2tpYTc3MF9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCmluZGV4IGU2OGRmZGUuLmIwOGEyMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYwpAQCAtMjgyLDcgKzI4Miw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgb3NrX2luaXRfaXJxKHZvaWQpCiB7CiAJb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwX2luaXRfaXJxKCk7CisJb21hcDFfaW5pdF9pcnEoKTsKIH0KIAogc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgb3NrX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKQEAgLTU4OCw1ICs1ODgsNSBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IG9za19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb3NrX2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdGUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXRlLmMKaW5kZXggYzlkMzhmNC4uNDU5Y2I2YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdGUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10ZS5jCkBAIC02Miw3ICs2Miw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wYWxtdGVfaW5pdF9pcnEodm9pZCkKIHsKIAlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXBfaW5pdF9pcnEoKTsKKwlvbWFwMV9pbml0X2lycSgpOwogfQogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBhbG10ZV9rZXltYXBbXSA9IHsKQEAgLTI4MCw1ICsyODAsNSBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5pbml0X2lycQk9IG9tYXBfcGFsbXRlX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3BhbG10ZV9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXR0LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10dC5jCmluZGV4IGYwNGYyZDMuLmIyMTRmNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXR0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdHQuYwpAQCAtMjY2LDcgKzI2Niw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wYWxtdHRfaW5pdF9pcnEodm9pZCkKIHsKIAlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXBfaW5pdF9pcnEoKTsKKwlvbWFwMV9pbml0X2lycSgpOwogfQogCiBzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBwYWxtdHRfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0gewpAQCAtMzI2LDUgKzMyNiw1IEBACiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gb21hcF9wYWxtdHRfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfcGFsbXR0X2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtejcxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG16NzEuYwppbmRleCA0NWYwMWQyLi45YjBlYTQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG16NzEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG16NzEuYwpAQCAtNjEsNyArNjEsNyBAQAogb21hcF9wYWxtejcxX2luaXRfaXJxKHZvaWQpCiB7CiAJb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwX2luaXRfaXJxKCk7CisJb21hcDFfaW5pdF9pcnEoKTsKIH0KIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwYWxtejcxX2tleW1hcFtdID0gewpAQCAtMzQ2LDUgKzM0Niw1IEBACiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gb21hcF9wYWxtejcxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3BhbG16NzFfaW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwMV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKaW5kZXggM2M4ZWU4NC4uNjdhY2Q0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wZXJzZXVzMl9pbml0X2lycSh2b2lkKQogewogCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcF9pbml0X2lycSgpOworCW9tYXAxX2luaXRfaXJxKCk7CiB9CiAvKiBPbmx5IEZQR0EgbmVlZHMgdG8gYmUgbWFwcGVkIGhlcmUuIEFsbCBvdGhlcnMgYXJlIGRvbmUgd2l0aCBpb3JlbWFwICovCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXBfcGVyc2V1czJfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CkBAIC0zNTUsNSArMzU1LDUgQEAKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwX3BlcnNldXMyX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3BlcnNldXMyX2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLmMKaW5kZXggMGFkNzgxZC4uOWMzYjdjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS5jCkBAIC00MTEsNyArNDExLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3N4MV9pbml0X2lycSh2b2lkKQogewogCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcF9pbml0X2lycSgpOworCW9tYXAxX2luaXRfaXJxKCk7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC00MjYsNSArNDI2LDUgQEAKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBvbWFwX3N4MV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9zeDFfaW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwMV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwppbmRleCA2NWQyNDIwLi4wMzZlZGMwZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCB2b2ljZWJsdWVfaW5pdF9pcnEodm9pZCkKIHsKIAlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXBfaW5pdF9pcnEoKTsKKwlvbWFwMV9pbml0X2lycSgpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgdm9pY2VibHVlX21hcF9pbyh2b2lkKQpAQCAtMzA2LDUgKzMwNiw1IEBACiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gdm9pY2VibHVlX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSB2b2ljZWJsdWVfaW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwMV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9kbWEuYwppbmRleCBkODU1OTM0Li5mNWE1MjIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZG1hLmMKQEAgLTI4NCwxNCArMjg0LDE1IEBACiAJZG1hX2Jhc2UgPSBpb3JlbWFwKHJlc1swXS5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzWzBdKSk7CiAJaWYgKCFkbWFfYmFzZSkgewogCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gaW9yZW1hcFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgcmVzLCBBUlJBWV9TSVpFKHJlcykpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IFVuYWJsZSB0byBhZGQgcmVzb3VyY2VzIGZvciAlcyVkXG4iLAogCQkJX19mdW5jX18sIHBkZXYtPm5hbWUsIHBkZXYtPmlkKTsKLQkJZ290byBleGl0X2RldmljZV9kZWw7CisJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9zeXN0ZW1fZG1hX3BsYXRfaW5mbyksIEdGUF9LRVJORUwpOwpAQCAtMjk5LDcgKzMwMCw3IEBACiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgJ3AnIGZvciAlc1xuIiwKIAkJCV9fZnVuY19fLCBwZGV2LT5uYW1lKTsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBleGl0X2RldmljZV9wdXQ7CisJCWdvdG8gZXhpdF9kZXZpY2VfZGVsOwogCX0KIAogCWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9kbWFfZGV2X2F0dHIpLCBHRlBfS0VSTkVMKTsKQEAgLTM4MCwxMCArMzgxLDEwIEBACiAJa2ZyZWUoZCk7CiBleGl0X3JlbGVhc2VfcDoKIAlrZnJlZShwKTsKLWV4aXRfZGV2aWNlX3B1dDoKLQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOwogZXhpdF9kZXZpY2VfZGVsOgogCXBsYXRmb3JtX2RldmljZV9kZWwocGRldik7CitleGl0X2RldmljZV9wdXQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW8xNXh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW8xNXh4LmMKaW5kZXggMDRjNGIwNC4uMzk5ZGE0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ncGlvMTV4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZ3BpbzE1eHguYwpAQCAtMzQsMTQgKzM0LDI1IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ncGlvX3JlZ19vZmZzIG9tYXAxNXh4X21wdWlvX3JlZ3MgPSB7CisJLnJldmlzaW9uICAgICAgID0gVVNIUlRfTUFYLAorCS5kaXJlY3Rpb24JPSBPTUFQX01QVUlPX0lPX0NOVEwsCisJLmRhdGFpbgkJPSBPTUFQX01QVUlPX0lOUFVUX0xBVENILAorCS5kYXRhb3V0CT0gT01BUF9NUFVJT19PVVRQVVQsCisJLmlycXN0YXR1cwk9IE9NQVBfTVBVSU9fR1BJT19JTlQsCisJLmlycWVuYWJsZQk9IE9NQVBfTVBVSU9fR1BJT19NQVNLSVQsCisJLmlycWVuYWJsZV9pbnYJPSB0cnVlLAorfTsKKwogc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIG9tYXBfZ3Bpb19wbGF0Zm9ybV9kYXRhIG9tYXAxNXh4X21wdV9ncGlvX2NvbmZpZyA9IHsKIAkudmlydHVhbF9pcnFfc3RhcnQJPSBJSF9NUFVJT19CQVNFLAogCS5iYW5rX3R5cGUJCT0gTUVUSE9EX01QVUlPLAogCS5iYW5rX3dpZHRoCQk9IDE2LAogCS5iYW5rX3N0cmlkZQkJPSAxLAorCS5yZWdzCQkJPSAmb21hcDE1eHhfbXB1aW9fcmVncywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE1eHhfbXB1X2dwaW8gPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwMTV4eF9tcHVfZ3BpbyA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSAwLAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTY0LDEzICs3NSwyNCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IG9tYXBfZ3Bpb19yZWdfb2ZmcyBvbWFwMTV4eF9ncGlvX3JlZ3MgPSB7CisJLnJldmlzaW9uCT0gVVNIUlRfTUFYLAorCS5kaXJlY3Rpb24JPSBPTUFQMTUxMF9HUElPX0RJUl9DT05UUk9MLAorCS5kYXRhaW4JCT0gT01BUDE1MTBfR1BJT19EQVRBX0lOUFVULAorCS5kYXRhb3V0CT0gT01BUDE1MTBfR1BJT19EQVRBX09VVFBVVCwKKwkuaXJxc3RhdHVzCT0gT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTLAorCS5pcnFlbmFibGUJPSBPTUFQMTUxMF9HUElPX0lOVF9NQVNLLAorCS5pcnFlbmFibGVfaW52CT0gdHJ1ZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBvbWFwX2dwaW9fcGxhdGZvcm1fZGF0YSBvbWFwMTV4eF9ncGlvX2NvbmZpZyA9IHsKIAkudmlydHVhbF9pcnFfc3RhcnQJPSBJSF9HUElPX0JBU0UsCiAJLmJhbmtfdHlwZQkJPSBNRVRIT0RfR1BJT18xNTEwLAogCS5iYW5rX3dpZHRoCQk9IDE2LAorCS5yZWdzICAgICAgICAgICAgICAgICAgID0gJm9tYXAxNXh4X2dwaW9fcmVncywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE1eHhfZ3BpbyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNXh4X2dwaW8gPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMSwKIAkuZGV2ICAgICAgICAgICAgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW8xNnh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW8xNnh4LmMKaW5kZXggNWRkMGQ0Yy4uMGYzOTliZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ncGlvMTZ4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZ3BpbzE2eHguYwpAQCAtMzcsMTQgKzM3LDI1IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ncGlvX3JlZ19vZmZzIG9tYXAxNnh4X21wdWlvX3JlZ3MgPSB7CisJLnJldmlzaW9uICAgICAgID0gVVNIUlRfTUFYLAorCS5kaXJlY3Rpb24JPSBPTUFQX01QVUlPX0lPX0NOVEwsCisJLmRhdGFpbgkJPSBPTUFQX01QVUlPX0lOUFVUX0xBVENILAorCS5kYXRhb3V0CT0gT01BUF9NUFVJT19PVVRQVVQsCisJLmlycXN0YXR1cwk9IE9NQVBfTVBVSU9fR1BJT19JTlQsCisJLmlycWVuYWJsZQk9IE9NQVBfTVBVSU9fR1BJT19NQVNLSVQsCisJLmlycWVuYWJsZV9pbnYJPSB0cnVlLAorfTsKKwogc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIG9tYXBfZ3Bpb19wbGF0Zm9ybV9kYXRhIG9tYXAxNnh4X21wdV9ncGlvX2NvbmZpZyA9IHsKIAkudmlydHVhbF9pcnFfc3RhcnQJPSBJSF9NUFVJT19CQVNFLAogCS5iYW5rX3R5cGUJCT0gTUVUSE9EX01QVUlPLAogCS5iYW5rX3dpZHRoCQk9IDE2LAogCS5iYW5rX3N0cmlkZQkJPSAxLAorCS5yZWdzICAgICAgICAgICAgICAgICAgID0gJm9tYXAxNnh4X21wdWlvX3JlZ3MsCiB9OwogCi1zdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X21wdV9ncGlvID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE2eHhfbXB1X2dwaW8gPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMCwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC02NywxMyArNzgsMjcgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBvbWFwX2dwaW9fcmVnX29mZnMgb21hcDE2eHhfZ3Bpb19yZWdzID0geworCS5yZXZpc2lvbiAgICAgICA9IE9NQVAxNjEwX0dQSU9fUkVWSVNJT04sCisJLmRpcmVjdGlvbgk9IE9NQVAxNjEwX0dQSU9fRElSRUNUSU9OLAorCS5zZXRfZGF0YW91dAk9IE9NQVAxNjEwX0dQSU9fU0VUX0RBVEFPVVQsCisJLmNscl9kYXRhb3V0CT0gT01BUDE2MTBfR1BJT19DTEVBUl9EQVRBT1VULAorCS5kYXRhaW4JCT0gT01BUDE2MTBfR1BJT19EQVRBSU4sCisJLmRhdGFvdXQJPSBPTUFQMTYxMF9HUElPX0RBVEFPVVQsCisJLmlycXN0YXR1cwk9IE9NQVAxNjEwX0dQSU9fSVJRU1RBVFVTMSwKKwkuaXJxZW5hYmxlCT0gT01BUDE2MTBfR1BJT19JUlFFTkFCTEUxLAorCS5zZXRfaXJxZW5hYmxlCT0gT01BUDE2MTBfR1BJT19TRVRfSVJRRU5BQkxFMSwKKwkuY2xyX2lycWVuYWJsZQk9IE9NQVAxNjEwX0dQSU9fQ0xFQVJfSVJRRU5BQkxFMSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBvbWFwX2dwaW9fcGxhdGZvcm1fZGF0YSBvbWFwMTZ4eF9ncGlvMV9jb25maWcgPSB7CiAJLnZpcnR1YWxfaXJxX3N0YXJ0CT0gSUhfR1BJT19CQVNFLAogCS5iYW5rX3R5cGUJCT0gTUVUSE9EX0dQSU9fMTYxMCwKIAkuYmFua193aWR0aAkJPSAxNiwKKwkucmVncyAgICAgICAgICAgICAgICAgICA9ICZvbWFwMTZ4eF9ncGlvX3JlZ3MsCiB9OwogCi1zdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X2dwaW8xID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE2eHhfZ3BpbzEgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMSwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0xMDAsOSArMTI1LDEwIEBACiAJLnZpcnR1YWxfaXJxX3N0YXJ0CT0gSUhfR1BJT19CQVNFICsgMTYsCiAJLmJhbmtfdHlwZQkJPSBNRVRIT0RfR1BJT18xNjEwLAogCS5iYW5rX3dpZHRoCQk9IDE2LAorCS5yZWdzICAgICAgICAgICAgICAgICAgID0gJm9tYXAxNnh4X2dwaW9fcmVncywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE2eHhfZ3BpbzIgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwMTZ4eF9ncGlvMiA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSAyLAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTEyOSw5ICsxNTUsMTAgQEAKIAkudmlydHVhbF9pcnFfc3RhcnQJPSBJSF9HUElPX0JBU0UgKyAzMiwKIAkuYmFua190eXBlCQk9IE1FVEhPRF9HUElPXzE2MTAsCiAJLmJhbmtfd2lkdGgJCT0gMTYsCisJLnJlZ3MgICAgICAgICAgICAgICAgICAgPSAmb21hcDE2eHhfZ3Bpb19yZWdzLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwMTZ4eF9ncGlvMyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X2dwaW8zID0gewogCS5uYW1lICAgICAgICAgICA9ICJvbWFwX2dwaW8iLAogCS5pZCAgICAgICAgICAgICA9IDMsCiAJLmRldiAgICAgICAgICAgID0gewpAQCAtMTU4LDkgKzE4NSwxMCBAQAogCS52aXJ0dWFsX2lycV9zdGFydAk9IElIX0dQSU9fQkFTRSArIDQ4LAogCS5iYW5rX3R5cGUJCT0gTUVUSE9EX0dQSU9fMTYxMCwKIAkuYmFua193aWR0aAkJPSAxNiwKKwkucmVncyAgICAgICAgICAgICAgICAgICA9ICZvbWFwMTZ4eF9ncGlvX3JlZ3MsCiB9OwogCi1zdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgcGxhdGZvcm1fZGV2aWNlIG9tYXAxNnh4X2dwaW80ID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDE2eHhfZ3BpbzQgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gNCwKIAkuZGV2ICAgICAgICAgICAgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2dwaW83eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZ3Bpbzd4eC5jCmluZGV4IDEyMDRjOGIuLjVhYjYzZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvZ3Bpbzd4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZ3Bpbzd4eC5jCkBAIC0zOSwxNCArMzksMjUgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBvbWFwX2dwaW9fcmVnX29mZnMgb21hcDd4eF9tcHVpb19yZWdzID0geworCS5yZXZpc2lvbgk9IFVTSFJUX01BWCwKKwkuZGlyZWN0aW9uCT0gT01BUF9NUFVJT19JT19DTlRMIC8gMiwKKwkuZGF0YWluCQk9IE9NQVBfTVBVSU9fSU5QVVRfTEFUQ0ggLyAyLAorCS5kYXRhb3V0CT0gT01BUF9NUFVJT19PVVRQVVQgLyAyLAorCS5pcnFzdGF0dXMJPSBPTUFQX01QVUlPX0dQSU9fSU5UIC8gMiwKKwkuaXJxZW5hYmxlCT0gT01BUF9NUFVJT19HUElPX01BU0tJVCAvIDIsCisJLmlycWVuYWJsZV9pbnYJPSB0cnVlLAorfTsKKwogc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIG9tYXBfZ3Bpb19wbGF0Zm9ybV9kYXRhIG9tYXA3eHhfbXB1X2dwaW9fY29uZmlnID0gewogCS52aXJ0dWFsX2lycV9zdGFydAk9IElIX01QVUlPX0JBU0UsCiAJLmJhbmtfdHlwZQkJPSBNRVRIT0RfTVBVSU8sCiAJLmJhbmtfd2lkdGgJCT0gMzIsCiAJLmJhbmtfc3RyaWRlCQk9IDIsCisJLnJlZ3MgICAgICAgICAgICAgICAgICAgPSAmb21hcDd4eF9tcHVpb19yZWdzLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwN3h4X21wdV9ncGlvID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9tcHVfZ3BpbyA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSAwLAogCS5kZXYgICAgICAgICAgICA9IHsKQEAgLTY5LDEzICs4MCwyNCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IG9tYXBfZ3Bpb19yZWdfb2ZmcyBvbWFwN3h4X2dwaW9fcmVncyA9IHsKKwkucmV2aXNpb24JPSBVU0hSVF9NQVgsCisJLmRpcmVjdGlvbgk9IE9NQVA3WFhfR1BJT19ESVJfQ09OVFJPTCwKKwkuZGF0YWluCQk9IE9NQVA3WFhfR1BJT19EQVRBX0lOUFVULAorCS5kYXRhb3V0CT0gT01BUDdYWF9HUElPX0RBVEFfT1VUUFVULAorCS5pcnFzdGF0dXMJPSBPTUFQN1hYX0dQSU9fSU5UX1NUQVRVUywKKwkuaXJxZW5hYmxlCT0gT01BUDdYWF9HUElPX0lOVF9NQVNLLAorCS5pcnFlbmFibGVfaW52CT0gdHJ1ZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBvbWFwX2dwaW9fcGxhdGZvcm1fZGF0YSBvbWFwN3h4X2dwaW8xX2NvbmZpZyA9IHsKIAkudmlydHVhbF9pcnFfc3RhcnQJPSBJSF9HUElPX0JBU0UsCiAJLmJhbmtfdHlwZQkJPSBNRVRIT0RfR1BJT183WFgsCiAJLmJhbmtfd2lkdGgJCT0gMzIsCisJLnJlZ3MJCQk9ICZvbWFwN3h4X2dwaW9fcmVncywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvMSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfZ3BpbzEgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMSwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0xMDIsOSArMTI0LDEwIEBACiAJLnZpcnR1YWxfaXJxX3N0YXJ0CT0gSUhfR1BJT19CQVNFICsgMzIsCiAJLmJhbmtfdHlwZQkJPSBNRVRIT0RfR1BJT183WFgsCiAJLmJhbmtfd2lkdGgJCT0gMzIsCisJLnJlZ3MJCQk9ICZvbWFwN3h4X2dwaW9fcmVncywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvMiA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfZ3BpbzIgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMiwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0xMzEsOSArMTU0LDEwIEBACiAJLnZpcnR1YWxfaXJxX3N0YXJ0CT0gSUhfR1BJT19CQVNFICsgNjQsCiAJLmJhbmtfdHlwZQkJPSBNRVRIT0RfR1BJT183WFgsCiAJLmJhbmtfd2lkdGgJCT0gMzIsCisJLnJlZ3MJCQk9ICZvbWFwN3h4X2dwaW9fcmVncywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvMyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfZ3BpbzMgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gMywKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0xNjAsOSArMTg0LDEwIEBACiAJLnZpcnR1YWxfaXJxX3N0YXJ0CT0gSUhfR1BJT19CQVNFICsgOTYsCiAJLmJhbmtfdHlwZQkJPSBNRVRIT0RfR1BJT183WFgsCiAJLmJhbmtfd2lkdGgJCT0gMzIsCisJLnJlZ3MJCQk9ICZvbWFwN3h4X2dwaW9fcmVncywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvNCA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfZ3BpbzQgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIm9tYXBfZ3BpbyIsCiAJLmlkICAgICAgICAgICAgID0gNCwKIAkuZGV2ICAgICAgICAgICAgPSB7CkBAIC0xODksOSArMjE0LDEwIEBACiAJLnZpcnR1YWxfaXJxX3N0YXJ0CT0gSUhfR1BJT19CQVNFICsgMTI4LAogCS5iYW5rX3R5cGUJCT0gTUVUSE9EX0dQSU9fN1hYLAogCS5iYW5rX3dpZHRoCQk9IDMyLAorCS5yZWdzCQkJPSAmb21hcDd4eF9ncGlvX3JlZ3MsCiB9OwogCi1zdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgcGxhdGZvcm1fZGV2aWNlIG9tYXA3eHhfZ3BpbzUgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwN3h4X2dwaW81ID0gewogCS5uYW1lICAgICAgICAgICA9ICJvbWFwX2dwaW8iLAogCS5pZCAgICAgICAgICAgICA9IDUsCiAJLmRldiAgICAgICAgICAgID0gewpAQCAtMjE4LDkgKzI0NCwxMCBAQAogCS52aXJ0dWFsX2lycV9zdGFydAk9IElIX0dQSU9fQkFTRSArIDE2MCwKIAkuYmFua190eXBlCQk9IE1FVEhPRF9HUElPXzdYWCwKIAkuYmFua193aWR0aAkJPSAzMiwKKwkucmVncwkJCT0gJm9tYXA3eHhfZ3Bpb19yZWdzLAogfTsKIAotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIHBsYXRmb3JtX2RldmljZSBvbWFwN3h4X2dwaW82ID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDd4eF9ncGlvNiA9IHsKIAkubmFtZSAgICAgICAgICAgPSAib21hcF9ncGlvIiwKIAkuaWQgICAgICAgICAgICAgPSA2LAogCS5kZXYgICAgICAgICAgICA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jCmluZGV4IDVkM2RhN2EuLmUyYjljOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYwpAQCAtMTc1LDcgKzE3NSw3IEBACiAJLmlycV9zZXRfd2FrZQk9IG9tYXBfd2FrZV9pcnEsCiB9OwogCi12b2lkIF9faW5pdCBvbWFwX2luaXRfaXJxKHZvaWQpCit2b2lkIF9faW5pdCBvbWFwMV9pbml0X2lycSh2b2lkKQogewogCWludCBpLCBqOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL21jYnNwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL21jYnNwLmMKaW5kZXggZDlhZjk4MS4uYWI3Mzk1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9tY2JzcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbWNic3AuYwpAQCAtMzgsNyArMzgsNyBAQAogCSAqIE9uIDE1MTAsIDE2MTAgYW5kIDE3MTAsIE1jQlNQMSBhbmQgTWNCU1AzCiAJICogYXJlIERTUCBwdWJsaWMgcGVyaXBoZXJhbHMuCiAJICovCi0JaWYgKGlkID09IE9NQVBfTUNCU1AxIHx8IGlkID09IE9NQVBfTUNCU1AzKSB7CisJaWYgKGlkID09IDAgfHwgaWQgPT0gMikgewogCQlpZiAoZHNwX3VzZSsrID09IDApIHsKIAkJCWFwaV9jbGsgPSBjbGtfZ2V0KE5VTEwsICJhcGlfY2siKTsKIAkJCWRzcF9jbGsgPSBjbGtfZ2V0KE5VTEwsICJkc3BfY2siKTsKQEAgLTU5LDcgKzU5LDcgQEAKIAogc3RhdGljIHZvaWQgb21hcDFfbWNic3BfZnJlZSh1bnNpZ25lZCBpbnQgaWQpCiB7Ci0JaWYgKGlkID09IE9NQVBfTUNCU1AxIHx8IGlkID09IE9NQVBfTUNCU1AzKSB7CisJaWYgKGlkID09IDAgfHwgaWQgPT0gMikgewogCQlpZiAoLS1kc3BfdXNlID09IDApIHsKIAkJCWlmICghSVNfRVJSKGFwaV9jbGspKSB7CiAJCQkJY2xrX2Rpc2FibGUoYXBpX2Nsayk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3BtX2J1cy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbV9idXMuYwppbmRleCBmZTMxZDkzLi45NDMwNzJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL3BtX2J1cy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvcG1fYnVzLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gcG1fcnVudGltZV9jbGtfc3VzcGVuZChkZXYpOworCXJldCA9IHBtX2Nsa19zdXNwZW5kKGRldik7CiAJaWYgKHJldCkgewogCQlwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lKGRldik7CiAJCXJldHVybiByZXQ7CkBAIC00NSwyMCArNDUsMjQgQEAKIHsKIAlkZXZfZGJnKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlwbV9ydW50aW1lX2Nsa19yZXN1bWUoZGV2KTsKKwlwbV9jbGtfcmVzdW1lKGRldik7CiAJcmV0dXJuIHBtX2dlbmVyaWNfcnVudGltZV9yZXN1bWUoZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZfcG93ZXJfZG9tYWluIGRlZmF1bHRfcG93ZXJfZG9tYWluID0geworc3RhdGljIHN0cnVjdCBkZXZfcG1fZG9tYWluIGRlZmF1bHRfcG1fZG9tYWluID0gewogCS5vcHMgPSB7CiAJCS5ydW50aW1lX3N1c3BlbmQgPSBvbWFwMV9wbV9ydW50aW1lX3N1c3BlbmQsCiAJCS5ydW50aW1lX3Jlc3VtZSA9IG9tYXAxX3BtX3J1bnRpbWVfcmVzdW1lLAogCQlVU0VfUExBVEZPUk1fUE1fU0xFRVBfT1BTCiAJfSwKIH07CisjZGVmaW5lIE9NQVAxX1BNX0RPTUFJTiAoJmRlZmF1bHRfcG1fZG9tYWluKQorI2Vsc2UKKyNkZWZpbmUgT01BUDFfUE1fRE9NQUlOIE5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUE1fUlVOVElNRSAqLwogCiBzdGF0aWMgc3RydWN0IHBtX2Nsa19ub3RpZmllcl9ibG9jayBwbGF0Zm9ybV9idXNfbm90aWZpZXIgPSB7Ci0JLnB3cl9kb21haW4gPSAmZGVmYXVsdF9wb3dlcl9kb21haW4sCisJLnBtX2RvbWFpbiA9IE9NQVAxX1BNX0RPTUFJTiwKIAkuY29uX2lkcyA9IHsgImljayIsICJmY2siLCBOVUxMLCB9LAogfTsKIApAQCAtNjcsOSArNzEsOSBAQAogCWlmICghY3B1X2NsYXNzX2lzX29tYXAxKCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcG1fcnVudGltZV9jbGtfYWRkX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJnBsYXRmb3JtX2J1c19ub3RpZmllcik7CisJcG1fY2xrX2FkZF9ub3RpZmllcigmcGxhdGZvcm1fYnVzX3R5cGUsICZwbGF0Zm9ybV9idXNfbm90aWZpZXIpOwogCiAJcmV0dXJuIDA7CiB9CiBjb3JlX2luaXRjYWxsKG9tYXAxX3BtX3J1bnRpbWVfaW5pdCk7Ci0jZW5kaWYgLyogQ09ORklHX1BNX1JVTlRJTUUgKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWUuYwppbmRleCAwM2UxZTEwLi5hMTgzNzc3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWUuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAgKiBUaW1lciBpbml0aWFsaXphdGlvbgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3RpbWVyX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwMV90aW1lcl9pbml0KHZvaWQpCiB7CiAJaWYgKG9tYXBfMzJrX3RpbWVyX3VzYWJsZSgpKSB7CiAJCXByZWZlcnJlZF9zY2hlZF9jbG9ja19pbml0KDEpOwpAQCAtMzA3LDYgKzMwNyw2IEBACiAJfQogfQogCi1zdHJ1Y3Qgc3lzX3RpbWVyIG9tYXBfdGltZXIgPSB7Ci0JLmluaXQJCT0gb21hcF90aW1lcl9pbml0LAorc3RydWN0IHN5c190aW1lciBvbWFwMV90aW1lciA9IHsKKwkuaW5pdAkJPSBvbWFwMV90aW1lcl9pbml0LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZXIzMmsuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZXIzMmsuYwppbmRleCAxM2Q3YjhmLi45NjYwNGE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWVyMzJrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lcjMyay5jCkBAIC0xODMsMTAgKzE4Myw2IEBACiBib29sIF9faW5pdCBvbWFwXzMya190aW1lcl9pbml0KHZvaWQpCiB7CiAJb21hcF9pbml0X2Nsb2Nrc291cmNlXzMyaygpOwotCi0jaWZkZWYgQ09ORklHX09NQVBfRE1fVElNRVIKLQlvbWFwX2RtX3RpbWVyX2luaXQoKTsKLSNlbmRpZgogCW9tYXBfaW5pdF8zMmtfdGltZXIoKTsKIAogCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtb21hcDIvTWFrZWZpbGUKaW5kZXggYjE0ODA3Ny4uZjM0MzM2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIwogCiAjIENvbW1vbiBzdXBwb3J0Ci1vYmoteSA6PSBpZC5vIGlvLm8gY29udHJvbC5vIG11eC5vIGRldmljZXMubyBzZXJpYWwubyBncG1jLm8gdGltZXItZ3AubyBwbS5vIFwKK29iai15IDo9IGlkLm8gaW8ubyBjb250cm9sLm8gbXV4Lm8gZGV2aWNlcy5vIHNlcmlhbC5vIGdwbWMubyB0aW1lci5vIHBtLm8gXAogCSBjb21tb24ubyBncGlvLm8gZG1hLm8gd2RfdGltZXIubwogCiBvbWFwLTItMy1jb21tb24JCQkJPSBpcnEubyBzZHJjLm8KQEAgLTE0NSw5ICsxNDUsMTkgQEAKIG9iai0kKENPTkZJR19TT0NfT01BUDI0MzApCQkrPSBvcHAyNDMwX2RhdGEubwogCiAjIGh3bW9kIGRhdGEKLW9iai0kKENPTkZJR19TT0NfT01BUDI0MjApCQkrPSBvbWFwX2h3bW9kXzI0MjBfZGF0YS5vCi1vYmotJChDT05GSUdfU09DX09NQVAyNDMwKQkJKz0gb21hcF9od21vZF8yNDMwX2RhdGEubwotb2JqLSQoQ09ORklHX0FSQ0hfT01BUDMpCQkrPSBvbWFwX2h3bW9kXzN4eHhfZGF0YS5vCitvYmotJChDT05GSUdfU09DX09NQVAyNDIwKQkJKz0gb21hcF9od21vZF8yeHh4X2lwYmxvY2tfZGF0YS5vIFwKKwkJCQkJICAgb21hcF9od21vZF8yeHh4XzN4eHhfaXBibG9ja19kYXRhLm8gXAorCQkJCQkgICBvbWFwX2h3bW9kXzJ4eHhfaW50ZXJjb25uZWN0X2RhdGEubyBcCisJCQkJCSAgIG9tYXBfaHdtb2RfMnh4eF8zeHh4X2ludGVyY29ubmVjdF9kYXRhLm8gXAorCQkJCQkgICBvbWFwX2h3bW9kXzI0MjBfZGF0YS5vCitvYmotJChDT05GSUdfU09DX09NQVAyNDMwKQkJKz0gb21hcF9od21vZF8yeHh4X2lwYmxvY2tfZGF0YS5vIFwKKwkJCQkJICAgb21hcF9od21vZF8yeHh4XzN4eHhfaXBibG9ja19kYXRhLm8gXAorCQkJCQkgICBvbWFwX2h3bW9kXzJ4eHhfaW50ZXJjb25uZWN0X2RhdGEubyBcCisJCQkJCSAgIG9tYXBfaHdtb2RfMnh4eF8zeHh4X2ludGVyY29ubmVjdF9kYXRhLm8gXAorCQkJCQkgICBvbWFwX2h3bW9kXzI0MzBfZGF0YS5vCitvYmotJChDT05GSUdfQVJDSF9PTUFQMykJCSs9IG9tYXBfaHdtb2RfMnh4eF8zeHh4X2lwYmxvY2tfZGF0YS5vIFwKKwkJCQkJICAgb21hcF9od21vZF8yeHh4XzN4eHhfaW50ZXJjb25uZWN0X2RhdGEubyBcCisJCQkJCSAgIG9tYXBfaHdtb2RfM3h4eF9kYXRhLm8KIG9iai0kKENPTkZJR19BUkNIX09NQVA0KQkJKz0gb21hcF9od21vZF80NHh4X2RhdGEubwogCiAjIEVNVSBwZXJpcGhlcmFscwpAQCAtMjY5LDQgKzI3OSw0IEBACiBkaXNwLSQoQ09ORklHX09NQVAyX0RTUykJCTo9IGRpc3BsYXkubwogb2JqLXkJCQkJCSs9ICQoZGlzcC1tKSAkKGRpc3AteSkKIAotb2JqLXkJCQkJCSs9IGNvbW1vbi1ib2FyZC1kZXZpY2VzLm8KK29iai15CQkJCQkrPSBjb21tb24tYm9hcmQtZGV2aWNlcy5vIHR3bC1jb21tb24ubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0yNDMwc2RwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYwppbmRleCBkNTQ5NjliLi4yMDI4NDY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYwpAQCAtMjYsMTMgKzI2LDEzIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KQEAgLTI2MCw3ICsyNjAsNyBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcF8yNDMwc2RwX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9tYXBfMjQzMHNkcF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9tYXBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDJfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfMjQzMHNkcF9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAyX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKaW5kZXggYWUyOTYzYS4uYmQ2MDBjZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKQEAgLTIzMSwyMiArMjMxLDYgQEAKIAlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKGh5YjE4bTUxMjE2MGFmNl9zZHJjX3BhcmFtcywgTlVMTCk7CiB9CiAKLXN0YXRpYyBpbnQgc2RwMzQzMF9iYXR0X3RhYmxlW10gPSB7Ci0vKiAwIEMqLwotMzA4MDAsIDI5NTAwLCAyODMwMCwgMjcxMDAsCi0yNjAwMCwgMjQ5MDAsIDIzOTAwLCAyMjkwMCwgMjIwMDAsIDIxMTAwLCAyMDMwMCwgMTk0MDAsIDE4NzAwLCAxNzkwMCwKLTE3MjAwLCAxNjUwMCwgMTU5MDAsIDE1MzAwLCAxNDcwMCwgMTQxMDAsIDEzNjAwLCAxMzEwMCwgMTI2MDAsIDEyMTAwLAotMTE2MDAsIDExMjAwLCAxMDgwMCwgMTA0MDAsIDEwMDAwLCA5NjMwLCAgIDkyODAsICAgODk1MCwgICA4NjIwLCAgIDgzMTAsCi04MDIwLCAgIDc3MzAsICAgNzQ2MCwgICA3MjAwLCAgIDY5NTAsICAgNjcxMCwgICA2NDcwLCAgIDYyNTAsICAgNjA0MCwgICA1ODMwLAotNTY0MCwgICA1NDUwLCAgIDUyNjAsICAgNTA5MCwgICA0OTIwLCAgIDQ3NjAsICAgNDYwMCwgICA0NDUwLCAgIDQzMTAsICAgNDE3MCwKLTQwNDAsICAgMzkxMCwgICAzNzkwLCAgIDM2NzAsICAgMzU1MAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX2JjaV9wbGF0Zm9ybV9kYXRhIHNkcDM0MzBfYmNpX2RhdGEgPSB7Ci0JLmJhdHRlcnlfdG1wX3RibAk9IHNkcDM0MzBfYmF0dF90YWJsZSwKLQkudGJsc2l6ZQkJPSBBUlJBWV9TSVpFKHNkcDM0MzBfYmF0dF90YWJsZSksCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXAyX2hzbW1jX2luZm8gbW1jW10gPSB7CiAJewogCQkubW1jCQk9IDEsCkBAIC0yOTIsMTQgKzI3Niw2IEBACiAJLnNldHVwCQk9IHNkcDM0MzBfdHdsX2dwaW9fc2V0dXAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfdXNiX2RhdGEgc2RwMzQzMF91c2JfZGF0YSA9IHsKLQkudXNiX21vZGUJPSBUMl9VU0JfTU9ERV9VTFBJLAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX21hZGNfcGxhdGZvcm1fZGF0YSBzZHAzNDMwX21hZGNfZGF0YSA9IHsKLQkuaXJxX2xpbmUJPSAxLAotfTsKLQogLyogcmVndWxhdG9yIGNvbnN1bWVyIG1hcHBpbmdzICovCiAKIC8qIGFkczc4NDYgb24gU1BJICovCkBAIC0zMDcsMTYgKzI4Myw2IEBACiAJUkVHVUxBVE9SX1NVUFBMWSgidmNjIiwgInNwaTEuMCIpLAogfTsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHNkcDM0MzBfdmRkYV9kYWNfc3VwcGxpZXNbXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRhX2RhYyIsICJvbWFwZHNzX3ZlbmMiKSwKLX07Ci0KLS8qIFZQTEwyIGZvciBkaWdpdGFsIHZpZGVvIG91dHB1dHMgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBzZHAzNDMwX3ZwbGwyX3N1cHBsaWVzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzcyIpLAotCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3NfZHNpMSIpLAotfTsKLQogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHNkcDM0MzBfdm1tYzFfc3VwcGxpZXNbXSA9IHsKIAlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgIm9tYXBfaHNtbWMuMCIpLAogfTsKQEAgLTQzMyw1NCArMzk5LDEwIEBACiAJLmNvbnN1bWVyX3N1cHBsaWVzCT0gc2RwMzQzMF92c2ltX3N1cHBsaWVzLAogfTsKIAotLyogVkRBQyBmb3IgRFNTIGRyaXZpbmcgUy1WaWRlbyAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHNkcDM0MzBfdmRhYyA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHNkcDM0MzBfdmRkYV9kYWNfc3VwcGxpZXMpLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IHNkcDM0MzBfdmRkYV9kYWNfc3VwcGxpZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgc2RwMzQzMF92cGxsMiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVkRWSSIsCi0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHNkcDM0MzBfdnBsbDJfc3VwcGxpZXMpLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IHNkcDM0MzBfdnBsbDJfc3VwcGxpZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfYXVkaW9fZGF0YSBzZHAzNDMwX2F1ZGlvOwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfZGF0YSBzZHAzNDMwX2NvZGVjID0gewotCS5hdWRpb19tY2xrID0gMjYwMDAwMDAsCi0JLmF1ZGlvID0gJnNkcDM0MzBfYXVkaW8sCi19OwotCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBzZHAzNDMwX3R3bGRhdGEgPSB7Ci0JLmlycV9iYXNlCT0gVFdMNDAzMF9JUlFfQkFTRSwKLQkuaXJxX2VuZAk9IFRXTDQwMzBfSVJRX0VORCwKLQogCS8qIHBsYXRmb3JtX2RhdGEgZm9yIGNoaWxkcmVuIGdvZXMgaGVyZSAqLwotCS5iY2kJCT0gJnNkcDM0MzBfYmNpX2RhdGEsCiAJLmdwaW8JCT0gJnNkcDM0MzBfZ3Bpb19kYXRhLAotCS5tYWRjCQk9ICZzZHAzNDMwX21hZGNfZGF0YSwKIAkua2V5cGFkCQk9ICZzZHAzNDMwX2twX2RhdGEsCi0JLnVzYgkJPSAmc2RwMzQzMF91c2JfZGF0YSwKLQkuY29kZWMJCT0gJnNkcDM0MzBfY29kZWMsCiAKIAkudmF1eDEJCT0gJnNkcDM0MzBfdmF1eDEsCiAJLnZhdXgyCQk9ICZzZHAzNDMwX3ZhdXgyLApAQCAtNDg5LDE0ICs0MTEsMjEgQEAKIAkudm1tYzEJCT0gJnNkcDM0MzBfdm1tYzEsCiAJLnZtbWMyCQk9ICZzZHAzNDMwX3ZtbWMyLAogCS52c2ltCQk9ICZzZHAzNDMwX3ZzaW0sCi0JLnZkYWMJCT0gJnNkcDM0MzBfdmRhYywKLQkudnBsbDIJCT0gJnNkcDM0MzBfdnBsbDIsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwMzQzMF9pMmNfaW5pdCh2b2lkKQogewogCS8qIGkyYzEgZm9yIFBNSUMgb25seSAqLworCW9tYXAzX3BtaWNfZ2V0X2NvbmZpZygmc2RwMzQzMF90d2xkYXRhLAorCQkJVFdMX0NPTU1PTl9QREFUQV9VU0IgfCBUV0xfQ09NTU9OX1BEQVRBX0JDSSB8CisJCQlUV0xfQ09NTU9OX1BEQVRBX01BREMgfCBUV0xfQ09NTU9OX1BEQVRBX0FVRElPLAorCQkJVFdMX0NPTU1PTl9SRUdVTEFUT1JfVkRBQyB8IFRXTF9DT01NT05fUkVHVUxBVE9SX1ZQTEwyKTsKKwlzZHAzNDMwX3R3bGRhdGEudmRhYy0+Y29uc3RyYWludHMuYXBwbHlfdVYgPSB0cnVlOworCXNkcDM0MzBfdHdsZGF0YS52cGxsMi0+Y29uc3RyYWludHMuYXBwbHlfdVYgPSB0cnVlOworCXNkcDM0MzBfdHdsZGF0YS52cGxsMi0+Y29uc3RyYWludHMubmFtZSA9ICJWRFZJIjsKKwogCW9tYXAzX3BtaWNfaW5pdCgidHdsNDAzMCIsICZzZHAzNDMwX3R3bGRhdGEpOworCiAJLyogaTJjMiBvbiBjYW1lcmEgY29ubmVjdG9yIChmb3Igc2Vuc29yIGNvbnRyb2wpIGFuZCBvcHRpb25hbCBpc3AxMzAxICovCiAJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDIsIDQwMCwgTlVMTCwgMCk7CiAJLyogaTJjMyBvbiBkaXNwbGF5IGNvbm5lY3RvciAoZm9yIERWSSwgdGZwNDEwKSAqLwpAQCAtNjIyLDE5ICs1NTEsMTkgQEAKIAkJCSBPTUFQX01VWF9NT0RFMCksCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWwxX2RhdGEgPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWwxX2RhdGEgX19pbml0ZGF0YSA9IHsKIAkuaWQJCT0gMCwKIAkucGFkcwkJPSBzZXJpYWwxX3BhZHMsCiAJLnBhZHNfY250CT0gQVJSQVlfU0laRShzZXJpYWwxX3BhZHMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsMl9kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsMl9kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkCQk9IDEsCiAJLnBhZHMJCT0gc2VyaWFsMl9wYWRzLAogCS5wYWRzX2NudAk9IEFSUkFZX1NJWkUoc2VyaWFsMl9wYWRzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDNfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDNfZGF0YSBfX2luaXRkYXRhID0gewogCS5pZAkJPSAyLAogCS5wYWRzCQk9IHNlcmlhbDNfcGFkcywKIAkucGFkc19jbnQJPSBBUlJBWV9TSVpFKHNlcmlhbDNfcGFkcyksCkBAIC04MDQsNyArNzMzLDcgQEAKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9tYXBfMzQzMHNkcF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9tYXBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfMzQzMHNkcF9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAzX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzYzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNjMwc2RwLmMKaW5kZXggYTU5MzNjYy4uZTRmMzdiNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNjMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNjMwc2RwLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb21hcF9zZHBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBvbWFwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3NkcF9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAzX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC00NDMwc2RwLmMKaW5kZXggNzNmYTkwYi4uOTMzYjI1YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC00NDMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC00NDMwc2RwLmMKQEAgLTQwLDcgKzQwLDYgQEAKIAogI2luY2x1ZGUgIm11eC5oIgogI2luY2x1ZGUgImhzbW1jLmgiCi0jaW5jbHVkZSAidGltZXItZ3AuaCIKICNpbmNsdWRlICJjb250cm9sLmgiCiAjaW5jbHVkZSAiY29tbW9uLWJvYXJkLWRldmljZXMuaCIKIApAQCAtMjU4LDcgKzI1Nyw3IEBACiAJeyBFVEhfS1M4ODUxX0lSUSwJR1BJT0ZfSU4sCQkiZXRoX2lycSIJfSwKIH07CiAKLXN0YXRpYyBpbnQgb21hcF9ldGhlcm5ldF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2V0aGVybmV0X2luaXQodm9pZCkKIHsKIAlpbnQgc3RhdHVzOwogCkBAIC0yOTUsOSArMjk0LDYgQEAKIHsKIAlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwogCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoTlVMTCwgTlVMTCk7Ci0jaWZkZWYgQ09ORklHX09NQVBfMzJLX1RJTUVSCi0Jb21hcDJfZ3BfY2xvY2tldmVudF9zZXRfZ3B0aW1lcigxKTsKLSNlbmRpZgogfQogCiBzdGF0aWMgc3RydWN0IG9tYXBfbXVzYl9ib2FyZF9kYXRhIG11c2JfYm9hcmRfZGF0YSA9IHsKQEAgLTMwNiwxNCArMzAyLDYgQEAKIAkucG93ZXIJCQk9IDEwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSBvbWFwNF91c2JwaHlfZGF0YSA9IHsKLQkucGh5X2luaXQJPSBvbWFwNDQzMF9waHlfaW5pdCwKLQkucGh5X2V4aXQJPSBvbWFwNDQzMF9waHlfZXhpdCwKLQkucGh5X3Bvd2VyCT0gb21hcDQ0MzBfcGh5X3Bvd2VyLAotCS5waHlfc2V0X2Nsb2NrCT0gb21hcDQ0MzBfcGh5X3NldF9jbGssCi0JLnBoeV9zdXNwZW5kCT0gb21hcDQ0MzBfcGh5X3N1c3BlbmQsCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXAyX2hzbW1jX2luZm8gbW1jW10gPSB7CiAJewogCQkubW1jCQk9IDIsCkBAIC0zMjIsNiArMzEwLDcgQEAKIAkJLmdwaW9fd3AJPSAtRUlOVkFMLAogCQkubm9ucmVtb3ZhYmxlICAgPSB0cnVlLAogCQkub2NyX21hc2sJPSBNTUNfVkREXzI5XzMwLAorCQkubm9fb2ZmX2luaXQJPSB0cnVlLAogCX0sCiAJewogCQkubW1jCQk9IDEsCkBAIC0zMzIsMTYgKzMyMSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgc2RwNDQzMF92YXV4X3N1cHBseVtdID0gewotCXsKLQkJLnN1cHBseSA9ICJ2bW1jIiwKLQkJLmRldl9uYW1lID0gIm9tYXBfaHNtbWMuMSIsCi0JfSwKLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgc2RwNDQzMF92bW1jX3N1cHBseVtdID0gewotCXsKLQkJLnN1cHBseSA9ICJ2bW1jIiwKLQkJLmRldl9uYW1lID0gIm9tYXBfaHNtbWMuMCIsCi0JfSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgIm9tYXBfaHNtbWMuMSIpLAogfTsKIAogc3RhdGljIGludCBvbWFwNF90d2w2MDMwX2hzbW1jX2xhdGVfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0zOTgsNjUgKzM3OCwxMCBAQAogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyAgPSAxLAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgID0gQVJSQVlfU0laRShzZHA0NDMwX3ZhdXhfc3VwcGx5KSwKIAkuY29uc3VtZXJfc3VwcGxpZXMgICAgICA9IHNkcDQ0MzBfdmF1eF9zdXBwbHksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgc2RwNDQzMF92YXV4MiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5taW5fdVYJCQk9IDEyMDAwMDAsCi0JCS5tYXhfdVYJCQk9IDI4MDAwMDAsCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkgPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHNkcDQ0MzBfdmF1eDMgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWCQkJPSAxMDAwMDAwLAotCQkubWF4X3VWCQkJPSAzMDAwMDAwLAotCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJID0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLS8qIFZNTUMxIGZvciBNTUMxIGNhcmQgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBzZHA0NDMwX3ZtbWMgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWCQkJPSAxMjAwMDAwLAotCQkubWF4X3VWCQkJPSAzMDAwMDAwLAotCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJID0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzICA9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzICAgICAgPSBzZHA0NDMwX3ZtbWNfc3VwcGx5LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHNkcDQ0MzBfdnBwID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm1pbl91VgkJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJCT0gMjUwMDAwMCwKLQkJLmFwcGx5X3VWCQk9IHRydWUsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCSA9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgc2RwNDQzMF92dXNpbSA9IHsKIAkuY29uc3RyYWludHMgPSB7CiAJCS5taW5fdVYJCQk9IDEyMDAwMDAsCkBAIC00NzAsNzQgKzM5NSwxMCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgc2RwNDQzMF92YW5hID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm1pbl91VgkJCT0gMjEwMDAwMCwKLQkJLm1heF91VgkJCT0gMjEwMDAwMCwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJID0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBzZHA0NDMwX3ZjeGlvID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm1pbl91VgkJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJCT0gMTgwMDAwMCwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJID0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBzZHA0NDMwX3ZkYWMgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWCQkJPSAxODAwMDAwLAotCQkubWF4X3VWCQkJPSAxODAwMDAwLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkgPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHNkcDQ0MzBfdnVzYiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5taW5fdVYJCQk9IDMzMDAwMDAsCi0JCS5tYXhfdVYJCQk9IDMzMDAwMDAsCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkgPQlSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHNkcDQ0MzBfY2xrMzJrZyA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgc2RwNDQzMF90d2xkYXRhID0gewotCS5pcnFfYmFzZQk9IFRXTDYwMzBfSVJRX0JBU0UsCi0JLmlycV9lbmQJPSBUV0w2MDMwX0lSUV9FTkQsCi0KIAkvKiBSZWd1bGF0b3JzICovCi0JLnZtbWMJCT0gJnNkcDQ0MzBfdm1tYywKLQkudnBwCQk9ICZzZHA0NDMwX3ZwcCwKIAkudnVzaW0JCT0gJnNkcDQ0MzBfdnVzaW0sCi0JLnZhbmEJCT0gJnNkcDQ0MzBfdmFuYSwKLQkudmN4aW8JCT0gJnNkcDQ0MzBfdmN4aW8sCi0JLnZkYWMJCT0gJnNkcDQ0MzBfdmRhYywKLQkudnVzYgkJPSAmc2RwNDQzMF92dXNiLAogCS52YXV4MQkJPSAmc2RwNDQzMF92YXV4MSwKLQkudmF1eDIJCT0gJnNkcDQ0MzBfdmF1eDIsCi0JLnZhdXgzCQk9ICZzZHA0NDMwX3ZhdXgzLAotCS5jbGszMmtnCT0gJnNkcDQ0MzBfY2xrMzJrZywKLQkudXNiCQk9ICZvbWFwNF91c2JwaHlfZGF0YQogfTsKIAogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIHNkcDQ0MzBfaTJjXzNfYm9hcmRpbmZvW10gPSB7CkBAIC01NTUsNiArNDE2LDE2IEBACiB9Owogc3RhdGljIGludCBfX2luaXQgb21hcDRfaTJjX2luaXQodm9pZCkKIHsKKwlvbWFwNF9wbWljX2dldF9jb25maWcoJnNkcDQ0MzBfdHdsZGF0YSwgVFdMX0NPTU1PTl9QREFUQV9VU0IsCisJCQlUV0xfQ09NTU9OX1JFR1VMQVRPUl9WREFDIHwKKwkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZBVVgyIHwKKwkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZBVVgzIHwKKwkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZNTUMgfAorCQkJVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBQIHwKKwkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZBTkEgfAorCQkJVFdMX0NPTU1PTl9SRUdVTEFUT1JfVkNYSU8gfAorCQkJVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlVTQiB8CisJCQlUV0xfQ09NTU9OX1JFR1VMQVRPUl9DTEszMktHKTsKIAlvbWFwNF9wbWljX2luaXQoInR3bDYwMzAiLCAmc2RwNDQzMF90d2xkYXRhKTsKIAlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMiwgNDAwLCBOVUxMLCAwKTsKIAlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMywgNDAwLCBzZHA0NDMwX2kyY18zX2JvYXJkaW5mbywKQEAgLTY4MSwxOSArNTUyLDE5IEBACiAJCQkgT01BUF9QSU5fT1VUUFVUIHwgT01BUF9NVVhfTU9ERTApLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsMl9kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsMl9kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkCQk9IDEsCiAJLnBhZHMJCT0gc2VyaWFsMl9wYWRzLAogCS5wYWRzX2NudAk9IEFSUkFZX1NJWkUoc2VyaWFsMl9wYWRzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDNfZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhIHNlcmlhbDNfZGF0YSBfX2luaXRkYXRhID0gewogCS5pZAkJPSAyLAogCS5wYWRzCQk9IHNlcmlhbDNfcGFkcywKIAkucGFkc19jbnQJPSBBUlJBWV9TSVpFKHNlcmlhbDNfcGFkcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWw0X2RhdGEgPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSBzZXJpYWw0X2RhdGEgX19pbml0ZGF0YSA9IHsKIAkuaWQJCT0gMywKIAkucGFkcwkJPSBzZXJpYWw0X3BhZHMsCiAJLnBhZHNfY250CT0gQVJSQVlfU0laRShzZXJpYWw0X3BhZHMpLApAQCAtNzI5LDcgKzYwMCw3IEBACiAKIAlpZiAob21hcF9yZXYoKSA9PSBPTUFQNDQzMF9SRVZfRVMxXzApCiAJCXBhY2thZ2UgPSBPTUFQX1BBQ0tBR0VfQ0JMOwotCW9tYXA0X211eF9pbml0KGJvYXJkX211eCwgcGFja2FnZSk7CisJb21hcDRfbXV4X2luaXQoYm9hcmRfbXV4LCBOVUxMLCBwYWNrYWdlKTsKIAogCW9tYXBfYm9hcmRfY29uZmlnID0gc2RwNDQzMF9jb25maWc7CiAJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoc2RwNDQzMF9jb25maWcpOwpAQCAtNzcyLDUgKzY0Myw1IEBACiAJLmluaXRfZWFybHkJPSBvbWFwXzQ0MzBzZHBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBnaWNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfNDQzMHNkcF9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXA0X3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3Y3JhbmUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3Y3JhbmUuYwppbmRleCA1ZTQzOGE3Li41ZjJiNTVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFtMzUxN2NyYW5lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hbTM1MTdjcmFuZS5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGFtMzUxN19jcmFuZV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9tYXBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGFtMzUxN19jcmFuZV9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAzX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3ZXZtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFtMzUxN2V2bS5jCmluZGV4IDYzYWY0MTcuLmYzMDA2YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3ZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hbTM1MTdldm0uYwpAQCAtNDk0LDcgKzQ5NCw3IEBACiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBhbTM1MTdfZXZtX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gYW0zNTE3X2V2bV9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAzX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKaW5kZXggZjNiZWI4ZS4uNzAyMTE3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKQEAgLTI3LDEzICsyNywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9sZWQuaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KQEAgLTM1NCw3ICszNTQsNyBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcF9hcG9sbG9uX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9tYXBfYXBvbGxvbl9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9tYXBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDJfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfYXBvbGxvbl9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAyX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNS5jCmluZGV4IGM2MzExNWIuLjM1ODkxZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUuYwpAQCAtNjMsOCArNjMsNiBAQAogI2RlZmluZSBTQl9UMzVfU01TQzkxMVhfQ1MJNAogI2RlZmluZSBTQl9UMzVfU01TQzkxMVhfR1BJTwk2NQogCi0jZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJU1pfMTI4SwotCiAjaWYgZGVmaW5lZChDT05GSUdfU01TQzkxMVgpIHx8IGRlZmluZWQoQ09ORklHX1NNU0M5MTFYX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy1zbXNjOTExeC5oPgpAQCAtMTY0LDkgKzE2Miw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfbmFuZF9wbGF0Zm9ybV9kYXRhIGNtX3QzNV9uYW5kX2RhdGEgPSB7CiAJLnBhcnRzCQkJPSBjbV90MzVfbmFuZF9wYXJ0aXRpb25zLAogCS5ucl9wYXJ0cwkJPSBBUlJBWV9TSVpFKGNtX3QzNV9uYW5kX3BhcnRpdGlvbnMpLAotCS5kbWFfY2hhbm5lbAkJPSAtMSwJLyogZGlzYWJsZSBETUEgaW4gT01BUCBOQU5EIGRyaXZlciAqLwogCS5jcwkJCT0gMCwKLQogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGNtX3QzNV9pbml0X25hbmQodm9pZCkKQEAgLTMzOSwxOSArMzM1LDE3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgY21fdDM1X3ZtbWMxX3N1cHBseSA9IHsKLQkuc3VwcGx5CQkJPSAidm1tYyIsCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgY21fdDM1X3ZtbWMxX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4wIiksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgY21fdDM1X3ZzaW1fc3VwcGx5ID0gewotCS5zdXBwbHkJCQk9ICJ2bW1jX2F1eCIsCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgY21fdDM1X3ZzaW1fc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tY19hdXgiLCAib21hcF9oc21tYy4wIiksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgY21fdDM1X3ZkYWNfc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRhX2RhYyIsICJvbWFwZHNzX3ZlbmMiKTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGNtX3QzNV92ZHZpX3N1cHBseSA9Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmR2aSIsICJvbWFwZHNzIik7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgY21fdDM1X3Zkdmlfc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmR2aSIsICJvbWFwZHNzIiksCit9OwogCiAvKiBWTU1DMSBmb3IgTU1DMSBwaW5zIENNRCwgQ0xLLCBEQVQwLi5EQVQzICgyMCBtQSwgcGx1cyBjYXJkID09IG1heCAyMjAgbUEpICovCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgY21fdDM1X3ZtbWMxID0gewpAQCAtMzY0LDggKzM1OCw4IEBACiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmY21fdDM1X3ZtbWMxX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShjbV90MzVfdm1tYzFfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBjbV90MzVfdm1tYzFfc3VwcGx5LAogfTsKIAogLyogVlNJTSBmb3IgTU1DMSBwaW5zIERBVDQuLkRBVDcgKDIgbUEsIHBsdXMgY2FyZCA9PSBtYXggNTAgbUEpICovCkBAIC0zNzksNDEgKzM3Myw4IEBACiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmY21fdDM1X3ZzaW1fc3VwcGx5LAotfTsKLQotLyogVkRBQyBmb3IgRFNTIGRyaXZpbmcgUy1WaWRlbyAoOCBtQSB1bmxvYWRlZCwgbWF4IDY1IG1BKSAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGNtX3QzNV92ZGFjID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm1pbl91VgkJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJCT0gMTgwMDAwMCwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmY21fdDM1X3ZkYWNfc3VwcGx5LAotfTsKLQotLyogVlBMTDIgZm9yIGRpZ2l0YWwgdmlkZW8gb3V0cHV0cyAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGNtX3QzNV92cGxsMiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVkRWSSIsCi0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJmNtX3QzNV92ZHZpX3N1cHBseSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSBjbV90MzVfdXNiX2RhdGEgPSB7Ci0JLnVzYl9tb2RlCT0gVDJfVVNCX01PREVfVUxQSSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShjbV90MzVfdnNpbV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IGNtX3QzNV92c2ltX3N1cHBseSwKIH07CiAKIHN0YXRpYyB1aW50MzJfdCBjbV90MzVfa2V5bWFwW10gPSB7CkBAIC00ODMsMTAgKzQ0NCw2IEBACiAJbW1jWzBdLmdwaW9fY2QgPSBncGlvICsgMDsKIAlvbWFwMl9oc21tY19pbml0KG1tYyk7CiAKLQkvKiBsaW5rIHJlZ3VsYXRvcnMgdG8gTU1DIGFkYXB0ZXJzICovCi0JY21fdDM1X3ZtbWMxX3N1cHBseS5kZXYgPSBtbWNbMF0uZGV2OwotCWNtX3QzNV92c2ltX3N1cHBseS5kZXYgPSBtbWNbMF0uZGV2OwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ5OCwyMSArNDU1LDIzIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBjbV90MzVfdHdsZGF0YSA9IHsKLQkuaXJxX2Jhc2UJPSBUV0w0MDMwX0lSUV9CQVNFLAotCS5pcnFfZW5kCT0gVFdMNDAzMF9JUlFfRU5ELAotCiAJLyogcGxhdGZvcm1fZGF0YSBmb3IgY2hpbGRyZW4gZ29lcyBoZXJlICovCiAJLmtleXBhZAkJPSAmY21fdDM1X2twX2RhdGEsCi0JLnVzYgkJPSAmY21fdDM1X3VzYl9kYXRhLAogCS5ncGlvCQk9ICZjbV90MzVfZ3Bpb19kYXRhLAogCS52bW1jMQkJPSAmY21fdDM1X3ZtbWMxLAogCS52c2ltCQk9ICZjbV90MzVfdnNpbSwKLQkudmRhYwkJPSAmY21fdDM1X3ZkYWMsCi0JLnZwbGwyCQk9ICZjbV90MzVfdnBsbDIsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgY21fdDM1X2luaXRfaTJjKHZvaWQpCiB7CisJb21hcDNfcG1pY19nZXRfY29uZmlnKCZjbV90MzVfdHdsZGF0YSwgVFdMX0NPTU1PTl9QREFUQV9VU0IsCisJCQlUV0xfQ09NTU9OX1JFR1VMQVRPUl9WREFDIHwgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBMTDIpOworCisJY21fdDM1X3R3bGRhdGEudnBsbDItPmNvbnN0cmFpbnRzLm5hbWUgPSAiVkRWSSI7CisJY21fdDM1X3R3bGRhdGEudnBsbDItPm51bV9jb25zdW1lcl9zdXBwbGllcyA9CisJCQkJCQlBUlJBWV9TSVpFKGNtX3QzNV92ZHZpX3N1cHBseSk7CisJY21fdDM1X3R3bGRhdGEudnBsbDItPmNvbnN1bWVyX3N1cHBsaWVzID0gY21fdDM1X3Zkdmlfc3VwcGx5OworCiAJb21hcDNfcG1pY19pbml0KCJ0cHM2NTkzMCIsICZjbV90MzVfdHdsZGF0YSk7CiB9CiAKQEAgLTY0OCw3ICs2MDcsNyBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gY21fdDM1X2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gY21fdDM1X2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUxNy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUxNy5jCmluZGV4IDA4ZjA4ZTguLjA1YzcyZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1MTcuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNTE3LmMKQEAgLTQ4LDYgKzQ4LDcgQEAKIAogI2luY2x1ZGUgIm11eC5oIgogI2luY2x1ZGUgImNvbnRyb2wuaCIKKyNpbmNsdWRlICJjb21tb24tYm9hcmQtZGV2aWNlcy5oIgogCiAjaWYgZGVmaW5lZChDT05GSUdfTEVEU19HUElPKSB8fCBkZWZpbmVkKENPTkZJR19MRURTX0dQSU9fTU9EVUxFKQogc3RhdGljIHN0cnVjdCBncGlvX2xlZCBjbV90MzUxN19sZWRzW10gPSB7CkBAIC0xNzcsNyArMTc4LDcgQEAKIAkucmVzZXRfZ3Bpb19wb3J0WzJdICA9IC1FSU5WQUwsCiB9OwogCi1zdGF0aWMgaW50IGNtX3QzNTE3X2luaXRfdXNiaCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgY21fdDM1MTdfaW5pdF91c2JoKHZvaWQpCiB7CiAJaW50IGVycjsKIApAQCAtMjAzLDggKzIwNCw2IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMl9NT0RVTEUpCi0jZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJU1pfMTI4SwotCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gY21fdDM1MTdfbmFuZF9wYXJ0aXRpb25zW10gPSB7CiAJewogCQkubmFtZSAgICAgICAgICAgPSAieGxvYWRlciIsCkBAIC0yMzcsNyArMjM2LDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9uYW5kX3BsYXRmb3JtX2RhdGEgY21fdDM1MTdfbmFuZF9kYXRhID0gewogCS5wYXJ0cwkJCT0gY21fdDM1MTdfbmFuZF9wYXJ0aXRpb25zLAogCS5ucl9wYXJ0cwkJPSBBUlJBWV9TSVpFKGNtX3QzNTE3X25hbmRfcGFydGl0aW9ucyksCi0JLmRtYV9jaGFubmVsCQk9IC0xLAkvKiBkaXNhYmxlIERNQSBpbiBPTUFQIE5BTkQgZHJpdmVyICovCiAJLmNzCQkJPSAwLAogfTsKIApAQCAtMzA1LDcgKzMwMyw3IEBACiAJLnJlc2VydmUgICAgICAgID0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gY21fdDM1MTdfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBvbWFwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBjbV90MzUxN19pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAzX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZGV2a2l0ODAwMC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1kZXZraXQ4MDAwLmMKaW5kZXggY2Y1MjBkNy4uYjYwMDJlYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1kZXZraXQ4MDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1kZXZraXQ4MDAwLmMKQEAgLTU4LDExICs1OCw4IEBACiAKICNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJoc21tYy5oIgotI2luY2x1ZGUgInRpbWVyLWdwLmgiCiAjaW5jbHVkZSAiY29tbW9uLWJvYXJkLWRldmljZXMuaCIKIAotI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCVNaXzEyOEsKLQogI2RlZmluZSBPTUFQX0RNOTAwMF9HUElPX0lSUQkyNQogI2RlZmluZSBPTUFQM19ERVZLSVRfVFNfR1BJTwkyNwogCkBAIC0xMzIsMTMgKzEyOSwxNCBAQAogCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkc3NkZXYtPnJlc2V0X2dwaW8sIDApOwogfQogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZGV2a2l0ODAwMF92bW1jMV9zdXBwbHkgPQotCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4wIik7Ci0KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBkZXZraXQ4MDAwX3ZtbWMxX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4wIiksCit9OwogCiAvKiBhZHM3ODQ2IG9uIFNQSSAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGRldmtpdDgwMDBfdmlvX3N1cHBseSA9Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmNjIiwgInNwaTIuMCIpOworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGRldmtpdDgwMDBfdmlvX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZjYyIsICJzcGkyLjAiKSwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBsY2RfcGFuZWwgPSB7CiAJLm5hbWUJCQk9ICJnZW5lcmljIiwKQEAgLTE4OCw5ICsxODYsNiBAQAogCS5kZWZhdWx0X2RldmljZSA9ICZkZXZraXQ4MDAwX2xjZF9kZXZpY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZGV2a2l0ODAwMF92ZGRhX2RhY19zdXBwbHkgPQotCVJFR1VMQVRPUl9TVVBQTFkoInZkZGFfZGFjIiwgIm9tYXBkc3NfdmVuYyIpOwotCiBzdGF0aWMgdWludDMyX3QgYm9hcmRfa2V5bWFwW10gPSB7CiAJS0VZKDAsIDAsIEtFWV8xKSwKIAlLRVkoMSwgMCwgS0VZXzIpLApAQCAtMjg2LDIyICsyODEsOCBAQAogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJmRldmtpdDgwMDBfdm1tYzFfc3VwcGx5LAotfTsKLQotLyogVkRBQyBmb3IgRFNTIGRyaXZpbmcgUy1WaWRlbyAoOCBtQSB1bmxvYWRlZCwgbWF4IDY1IG1BKSAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGRldmtpdDgwMDBfdmRhYyA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJmRldmtpdDgwMDBfdmRkYV9kYWNfc3VwcGx5LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGRldmtpdDgwMDBfdm1tYzFfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBkZXZraXQ4MDAwX3ZtbWMxX3N1cHBseSwKIH07CiAKIC8qIFZQTEwxIGZvciBkaWdpdGFsIHZpZGVvIG91dHB1dHMgKi8KQEAgLTMyOSwzMSArMzEwLDE0IEBACiAJCS52YWxpZF9vcHNfbWFzayAgICAgICAgID0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCiAJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyAgPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcyAgICAgID0gJmRldmtpdDgwMDBfdmlvX3N1cHBseSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSBkZXZraXQ4MDAwX3VzYl9kYXRhID0gewotCS51c2JfbW9kZQk9IFQyX1VTQl9NT0RFX1VMUEksCi19OwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfYXVkaW9fZGF0YSBkZXZraXQ4MDAwX2F1ZGlvX2RhdGE7Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9jb2RlY19kYXRhIGRldmtpdDgwMDBfY29kZWNfZGF0YSA9IHsKLQkuYXVkaW9fbWNsayA9IDI2MDAwMDAwLAotCS5hdWRpbyA9ICZkZXZraXQ4MDAwX2F1ZGlvX2RhdGEsCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyAgPSBBUlJBWV9TSVpFKGRldmtpdDgwMDBfdmlvX3N1cHBseSksCisJLmNvbnN1bWVyX3N1cHBsaWVzICAgICAgPSBkZXZraXQ4MDAwX3Zpb19zdXBwbHksCiB9OwogCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBkZXZraXQ4MDAwX3R3bGRhdGEgPSB7Ci0JLmlycV9iYXNlCT0gVFdMNDAzMF9JUlFfQkFTRSwKLQkuaXJxX2VuZAk9IFRXTDQwMzBfSVJRX0VORCwKLQogCS8qIHBsYXRmb3JtX2RhdGEgZm9yIGNoaWxkcmVuIGdvZXMgaGVyZSAqLwotCS51c2IJCT0gJmRldmtpdDgwMDBfdXNiX2RhdGEsCiAJLmdwaW8JCT0gJmRldmtpdDgwMDBfZ3Bpb19kYXRhLAotCS5jb2RlYwkJPSAmZGV2a2l0ODAwMF9jb2RlY19kYXRhLAogCS52bW1jMQkJPSAmZGV2a2l0ODAwMF92bW1jMSwKLQkudmRhYwkJPSAmZGV2a2l0ODAwMF92ZGFjLAogCS52cGxsMQkJPSAmZGV2a2l0ODAwMF92cGxsMSwKIAkudmlvCQk9ICZkZXZraXQ4MDAwX3ZpbywKIAkua2V5cGFkCQk9ICZkZXZraXQ4MDAwX2twX2RhdGEsCkBAIC0zNjEsNiArMzI1LDkgQEAKIAogc3RhdGljIGludCBfX2luaXQgZGV2a2l0ODAwMF9pMmNfaW5pdCh2b2lkKQogeworCW9tYXAzX3BtaWNfZ2V0X2NvbmZpZygmZGV2a2l0ODAwMF90d2xkYXRhLAorCQkJICBUV0xfQ09NTU9OX1BEQVRBX1VTQiB8IFRXTF9DT01NT05fUERBVEFfQVVESU8sCisJCQkgIFRXTF9DT01NT05fUkVHVUxBVE9SX1ZEQUMpOwogCW9tYXAzX3BtaWNfaW5pdCgidHBzNjU5MzAiLCAmZGV2a2l0ODAwMF90d2xkYXRhKTsKIAkvKiBCdXMgMyBpcyBhdHRhY2hlZCB0byB0aGUgRFZJIHBvcnQgd2hlcmUgZGV2aWNlcyBsaWtlIHRoZSBwaWNvIERMUAogCSAqIHByb2plY3RvciBkb24ndCB3b3JrIHJlbGlhYmx5IHdpdGggNDAwa0h6ICovCkBAIC00NDAsMTAgKzQwNyw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBkZXZraXQ4MDAwX2luaXRfaXJxKHZvaWQpCiB7Ci0Jb21hcF9pbml0X2lycSgpOwotI2lmZGVmIENPTkZJR19PTUFQXzMyS19USU1FUgotCW9tYXAyX2dwX2Nsb2NrZXZlbnRfc2V0X2dwdGltZXIoMTIpOwotI2VuZGlmCisJb21hcDNfaW5pdF9pcnEoKTsKIH0KIAogI2RlZmluZSBPTUFQX0RNOTAwMF9CQVNFCTB4MmMwMDAwMDAKQEAgLTcwOSw1ICs2NzMsNSBAQAogCS5pbml0X2Vhcmx5CT0gZGV2a2l0ODAwMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IGRldmtpdDgwMDBfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGRldmtpdDgwMDBfaW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwM19zZWN1cmVfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1mbGFzaC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1mbGFzaC5jCmluZGV4IDcyOTg5MmYuLmFhMWIwY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZmxhc2guYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWZsYXNoLmMKQEAgLTEzMiwxMSArMTMyLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9uYW5kX3BsYXRmb3JtX2RhdGEgYm9hcmRfbmFuZF9kYXRhID0gewotCS5uYW5kX3NldHVwCT0gTlVMTCwKIAkuZ3BtY190CQk9ICZuYW5kX3RpbWluZ3MsCi0JLmRtYV9jaGFubmVsCT0gLTEsCQkvKiBkaXNhYmxlIERNQSBpbiBPTUFQIE5BTkQgZHJpdmVyICovCi0JLmRldl9yZWFkeQk9IE5VTEwsCi0JLmRldnNpemUJPSAwLAkvKiAnMCcgZm9yIDgtYml0LCAnMScgZm9yIDE2LWJpdCBkZXZpY2UgKi8KIH07CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKaW5kZXggNzNlM2MzMS4uNTRkYjQxYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKQEAgLTcwLDcgKzcwLDcgQEAKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXBfZ2VuZXJpY19tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvbWFwX2dlbmVyaWNfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBvbWFwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAyX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX2dlbmVyaWNfaW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwMl90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMKaW5kZXggYmFjNzkzMy4uNDVkZTJiMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1oNC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYwpAQCAtMjk4LDcgKzI5OCw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2g0X2luaXRfaXJxKHZvaWQpCiB7Ci0Jb21hcF9pbml0X2lycSgpOworCW9tYXAyX2luaXRfaXJxKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYXQyNF9wbGF0Zm9ybV9kYXRhIG0yNGMwMSA9IHsKQEAgLTM4OCw1ICszODgsNSBAQAogCS5pbml0X2Vhcmx5CT0gb21hcF9oNF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXBfaDRfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfaDRfaW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwMl90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWlnZXAwMDIwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWlnZXAwMDIwLmMKaW5kZXggMGMxYmZjYS4uMzViZTc3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1pZ2VwMDAyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaWdlcDAwMjAuYwpAQCAtMjIyLDggKzIyMiw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IGlnZXAyX2luaXRfc21zYzkxMXgodm9pZCkgeyB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGlnZXBfdm1tYzFfc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgIm9tYXBfaHNtbWMuMCIpOworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGlnZXBfdm1tYzFfc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjAiKSwKK307CiAKIC8qIFZNTUMxIGZvciBPTUFQIFZERF9NTUMxIChpL28pIGFuZCBNTUMxIGNhcmQgKi8KIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBpZ2VwX3ZtbWMxID0gewpAQCAtMjM2LDEyICsyMzcsMTMgQEAKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgID0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgICAgICA9ICZpZ2VwX3ZtbWMxX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzICA9IEFSUkFZX1NJWkUoaWdlcF92bW1jMV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcyAgICAgID0gaWdlcF92bW1jMV9zdXBwbHksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgaWdlcF92aW9fc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jX2F1eCIsICJvbWFwX2hzbW1jLjEiKTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBpZ2VwX3Zpb19zdXBwbHlbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jX2F1eCIsICJvbWFwX2hzbW1jLjEiKSwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBpZ2VwX3ZpbyA9IHsKIAkuY29uc3RyYWludHMgPSB7CkBAIC0yNTQsMjAgKzI1NiwyMSBAQAogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyAgPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcyAgICAgID0gJmlnZXBfdmlvX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzICA9IEFSUkFZX1NJWkUoaWdlcF92aW9fc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgICAgICA9IGlnZXBfdmlvX3N1cHBseSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBpZ2VwX3ZtbWMyX3N1cHBseSA9Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjEiKTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBpZ2VwX3ZtbWMyX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4xIiksCit9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgaWdlcF92bW1jMiA9IHsKIAkuY29uc3RyYWludHMJCT0gewogCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTCwKIAkJLmFsd2F5c19vbgkJPSAxLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJmlnZXBfdm1tYzJfc3VwcGx5LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGlnZXBfdm1tYzJfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBpZ2VwX3ZtbWMyX3N1cHBseSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgaWdlcF92d2xhbiA9IHsKQEAgLTQ0MCwxMCArNDQzLDYgQEAKIAkuc2V0dXAJCT0gaWdlcF90d2xfZ3Bpb19zZXR1cCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSBpZ2VwX3VzYl9kYXRhID0gewotCS51c2JfbW9kZQk9IFQyX1VTQl9NT0RFX1VMUEksCi19OwotCiBzdGF0aWMgaW50IGlnZXAyX2VuYWJsZV9kdmkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogewogCWdwaW9fZGlyZWN0aW9uX291dHB1dChJR0VQMl9HUElPX0RWSV9QVVAsIDEpOwpAQCAtNDgwLDI2ICs0NzksNiBAQAogCS5kZWZhdWx0X2RldmljZQk9ICZpZ2VwMl9kdmlfZGV2aWNlLAogfTsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGlnZXAyX3ZwbGwyX3N1cHBsaWVzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzcyIpLAotCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3NfZHNpMSIpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGlnZXAyX3ZwbGwyID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm5hbWUJCQk9ICJWRFZJIiwKLQkJLm1pbl91VgkJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJCT0gMTgwMDAwMCwKLQkJLmFwcGx5X3VWCQk9IHRydWUsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUoaWdlcDJfdnBsbDJfc3VwcGxpZXMpLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IGlnZXAyX3ZwbGwyX3N1cHBsaWVzLAotfTsKLQogc3RhdGljIHZvaWQgX19pbml0IGlnZXAyX2Rpc3BsYXlfaW5pdCh2b2lkKQogewogCWludCBlcnIgPSBncGlvX3JlcXVlc3Rfb25lKElHRVAyX0dQSU9fRFZJX1BVUCwgR1BJT0ZfT1VUX0lOSVRfSElHSCwKQEAgLTUxOSwxMyArNDk4LDYgQEAKIAkJCQkgIG02NWt4eHh4YW1fc2RyY19wYXJhbXMpOwogfQogCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfYXVkaW9fZGF0YSBpZ2VwMl9hdWRpb19kYXRhOwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfZGF0YSBpZ2VwMl9jb2RlY19kYXRhID0gewotCS5hdWRpb19tY2xrID0gMjYwMDAwMDAsCi0JLmF1ZGlvID0gJmlnZXAyX2F1ZGlvX2RhdGEsCi19OwotCiBzdGF0aWMgaW50IGlnZXAyX2tleW1hcFtdID0gewogCUtFWSgwLCAwLCBLRVlfTEVGVCksCiAJS0VZKDAsIDEsIEtFWV9SSUdIVCksCkBAIC01NTgsMTEgKzUzMCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBpZ2VwX3R3bGRhdGEgPSB7Ci0JLmlycV9iYXNlCT0gVFdMNDAzMF9JUlFfQkFTRSwKLQkuaXJxX2VuZAk9IFRXTDQwMzBfSVJRX0VORCwKLQogCS8qIHBsYXRmb3JtX2RhdGEgZm9yIGNoaWxkcmVuIGdvZXMgaGVyZSAqLwotCS51c2IJCT0gJmlnZXBfdXNiX2RhdGEsCiAJLmdwaW8JCT0gJmlnZXBfdHdsNDAzMF9ncGlvX3BkYXRhLAogCS52bW1jMSAgICAgICAgICA9ICZpZ2VwX3ZtbWMxLAogCS52aW8JCT0gJmlnZXBfdmlvLApAQCAtNTc4LDYgKzU0Niw4IEBACiB7CiAJaW50IHJldDsKIAorCW9tYXAzX3BtaWNfZ2V0X2NvbmZpZygmaWdlcF90d2xkYXRhLCBUV0xfQ09NTU9OX1BEQVRBX1VTQiwgMCk7CisKIAlpZiAobWFjaGluZV9pc19pZ2VwMDAyMCgpKSB7CiAJCS8qCiAJCSAqIEJ1cyAzIGlzIGF0dGFjaGVkIHRvIHRoZSBEVkkgcG9ydCB3aGVyZSBkZXZpY2VzIGxpa2UgdGhlCkBAIC01ODgsOSArNTU4LDEyIEBACiAJCWlmIChyZXQpCiAJCQlwcl93YXJuaW5nKCJJR0VQMjogQ291bGQgbm90IHJlZ2lzdGVyIEkyQzMgYnVzICglZClcbiIsIHJldCk7CiAKLQkJaWdlcF90d2xkYXRhLmNvZGVjCT0gJmlnZXAyX2NvZGVjX2RhdGE7CiAJCWlnZXBfdHdsZGF0YS5rZXlwYWQJPSAmaWdlcDJfa2V5cGFkX3BkYXRhOwotCQlpZ2VwX3R3bGRhdGEudnBsbDIJPSAmaWdlcDJfdnBsbDI7CisJCS8qIEdldCBjb21tb24gcG1pYyBkYXRhICovCisJCW9tYXAzX3BtaWNfZ2V0X2NvbmZpZygmaWdlcF90d2xkYXRhLCBUV0xfQ09NTU9OX1BEQVRBX0FVRElPLAorCQkJCSAgICAgIFRXTF9DT01NT05fUkVHVUxBVE9SX1ZQTEwyKTsKKwkJaWdlcF90d2xkYXRhLnZwbGwyLT5jb25zdHJhaW50cy5hcHBseV91ViA9IHRydWU7CisJCWlnZXBfdHdsZGF0YS52cGxsMi0+Y29uc3RyYWludHMubmFtZSA9ICJWRFZJIjsKIAl9CiAKIAlvbWFwM19wbWljX2luaXQoInR3bDQwMzAiLCAmaWdlcF90d2xkYXRhKTsKQEAgLTcwMyw5ICs2NzYsOSBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gaWdlcF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9tYXBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGlnZXBfaW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoSUdFUDAwMzAsICJJR0VQIE9NQVAzIG1vZHVsZSIpCkBAIC03MTMsNyArNjg2LDcgQEAKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGlnZXBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBvbWFwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBpZ2VwX2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1sZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMKaW5kZXggZjdkNjAzOC4uMjE4NzY0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1sZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWxkcC5jCkBAIC0xOTksMjIgKzE5OSwxNCBAQAogCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoTlVMTCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSBsZHBfdXNiX2RhdGEgPSB7Ci0JLnVzYl9tb2RlCT0gVDJfVVNCX01PREVfVUxQSSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9ncGlvX3BsYXRmb3JtX2RhdGEgbGRwX2dwaW9fZGF0YSA9IHsKIAkuZ3Bpb19iYXNlCT0gT01BUF9NQVhfR1BJT19MSU5FUywKIAkuaXJxX2Jhc2UJPSBUV0w0MDMwX0dQSU9fSVJRX0JBU0UsCiAJLmlycV9lbmQJPSBUV0w0MDMwX0dQSU9fSVJRX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9tYWRjX3BsYXRmb3JtX2RhdGEgbGRwX21hZGNfZGF0YSA9IHsKLQkuaXJxX2xpbmUJPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxkcF92bW1jMV9zdXBwbHkgPSB7Ci0JLnN1cHBseQkJCT0gInZtbWMiLAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxkcF92bW1jMV9zdXBwbHlbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgIm9tYXBfaHNtbWMuMCIpLAogfTsKIAogLyogVk1NQzEgZm9yIE1NQzEgcGlucyBDTUQsIENMSywgREFUMC4uREFUMyAoMjAgbUEsIHBsdXMgY2FyZCA9PSBtYXggMjIwIG1BKSAqLwpAQCAtMjI4LDggKzIyMCw4IEBACiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmbGRwX3ZtbWMxX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShsZHBfdm1tYzFfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBsZHBfdm1tYzFfc3VwcGx5LAogfTsKIAogLyogYWRzNzg0NiBvbiBTUEkgKi8KQEAgLTI1MywxMiArMjQ1LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhIGxkcF90d2xkYXRhID0gewotCS5pcnFfYmFzZQk9IFRXTDQwMzBfSVJRX0JBU0UsCi0JLmlycV9lbmQJPSBUV0w0MDMwX0lSUV9FTkQsCi0KIAkvKiBwbGF0Zm9ybV9kYXRhIGZvciBjaGlsZHJlbiBnb2VzIGhlcmUgKi8KLQkubWFkYwkJPSAmbGRwX21hZGNfZGF0YSwKLQkudXNiCQk9ICZsZHBfdXNiX2RhdGEsCiAJLnZtbWMxCQk9ICZsZHBfdm1tYzEsCiAJLnZhdXgxCQk9ICZsZHBfdmF1eDEsCiAJLmdwaW8JCT0gJmxkcF9ncGlvX2RhdGEsCkBAIC0yNjcsNiArMjU0LDggQEAKIAogc3RhdGljIGludCBfX2luaXQgb21hcF9pMmNfaW5pdCh2b2lkKQogeworCW9tYXAzX3BtaWNfZ2V0X2NvbmZpZygmbGRwX3R3bGRhdGEsCisJCQkgIFRXTF9DT01NT05fUERBVEFfVVNCIHwgVFdMX0NPTU1PTl9QREFUQV9NQURDLCAwKTsKIAlvbWFwM19wbWljX2luaXQoInR3bDQwMzAiLCAmbGRwX3R3bGRhdGEpOwogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygyLCA0MDAsIE5VTEwsIDApOwogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygzLCA0MDAsIE5VTEwsIDApOwpAQCAtMzQxLDggKzMzMCw2IEBACiAJCUFSUkFZX1NJWkUobGRwX25hbmRfcGFydGl0aW9ucyksIFpPT01fTkFORF9DUywgMCk7CiAKIAlvbWFwMl9oc21tY19pbml0KG1tYyk7Ci0JLyogbGluayByZWd1bGF0b3JzIHRvIE1NQyBhZGFwdGVycyAqLwotCWxkcF92bW1jMV9zdXBwbHkuZGV2ID0gbW1jWzBdLmRldjsKIH0KIAogTUFDSElORV9TVEFSVChPTUFQX0xEUCwgIk9NQVAgTERQIGJvYXJkIikKQEAgLTM1MCw3ICszMzcsNyBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb21hcF9sZHBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBvbWFwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX2xkcF9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAzX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbjh4MC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1uOHgwLmMKaW5kZXggOGQ3NDMxOC4uZTExZjBjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1uOHgwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1uOHgwLmMKQEAgLTY5OSw5ICs2OTksOSBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gbjh4MF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBuOHgwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwMl9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbjh4MF9pbml0X21hY2hpbmUsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDJfdGltZXIsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKE5PS0lBX044MTAsICJOb2tpYSBOODEwIikKQEAgLTcwOSw5ICs3MDksOSBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gbjh4MF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBuOHgwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwMl9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbjh4MF9pbml0X21hY2hpbmUsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDJfdGltZXIsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKE5PS0lBX044MTBfV0lNQVgsICJOb2tpYSBOODEwIFdpTUFYIikKQEAgLTcxOSw3ICs3MTksNyBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gbjh4MF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBuOHgwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwMl9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbjh4MF9pbml0X21hY2hpbmUsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDJfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jCmluZGV4IGJlNzE0MjYuLjM0Zjg0MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMKQEAgLTUwLDEyICs1MCw5IEBACiAKICNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJoc21tYy5oIgotI2luY2x1ZGUgInRpbWVyLWdwLmgiCiAjaW5jbHVkZSAicG0uaCIKICNpbmNsdWRlICJjb21tb24tYm9hcmQtZGV2aWNlcy5oIgogCi0jZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJU1pfMTI4SwotCiAvKgogICogT01BUDMgQmVhZ2xlIHJldmlzaW9uCiAgKiBSdW4gdGltZSBkZXRlY3Rpb24gb2YgQmVhZ2xlIHJldmlzaW9uIGlzIGRvbmUgYnkgcmVhZGluZyBHUElPLgpAQCAtMTA2LDYgKzEwMyw5IEBACiAJYmVhZ2xlX3JldiA9IGdwaW9fZ2V0X3ZhbHVlKDE3MSkgfCAoZ3Bpb19nZXRfdmFsdWUoMTcyKSA8PCAxKQogCQkJfCAoZ3Bpb19nZXRfdmFsdWUoMTczKSA8PCAyKTsKIAorCWdwaW9fZnJlZV9hcnJheShvbWFwM19iZWFnbGVfcmV2X2dwaW9zLAorCQkJQVJSQVlfU0laRShvbWFwM19iZWFnbGVfcmV2X2dwaW9zKSk7CisKIAlzd2l0Y2ggKGJlYWdsZV9yZXYpIHsKIAljYXNlIDc6CiAJCXByaW50ayhLRVJOX0lORk8gIk9NQVAzIEJlYWdsZSBSZXY6IEF4L0J4XG4iKTsKQEAgLTIwOSwxNCArMjA5LDYgQEAKIAkuZGVmYXVsdF9kZXZpY2UgPSAmYmVhZ2xlX2R2aV9kZXZpY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgYmVhZ2xlX3ZkYWNfc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRhX2RhYyIsICJvbWFwZHNzX3ZlbmMiKTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGJlYWdsZV92ZHZpX3N1cHBsaWVzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzcyIpLAotCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3NfZHNpMSIpLAotfTsKLQogc3RhdGljIHZvaWQgX19pbml0IGJlYWdsZV9kaXNwbGF5X2luaXQodm9pZCkKIHsKIAlpbnQgcjsKQEAgLTIzOCwxMiArMjMwLDEyIEBACiAJe30JLyogVGVybWluYXRvciAqLwogfTsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGJlYWdsZV92bW1jMV9zdXBwbHkgPSB7Ci0JLnN1cHBseQkJCT0gInZtbWMiLAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGJlYWdsZV92bW1jMV9zdXBwbHlbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgIm9tYXBfaHNtbWMuMCIpLAogfTsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGJlYWdsZV92c2ltX3N1cHBseSA9IHsKLQkuc3VwcGx5CQkJPSAidm1tY19hdXgiLAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGJlYWdsZV92c2ltX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWNfYXV4IiwgIm9tYXBfaHNtbWMuMCIpLAogfTsKIAogc3RhdGljIHN0cnVjdCBncGlvX2xlZCBncGlvX2xlZHNbXTsKQEAgLTI2NiwxMCArMjU4LDYgQEAKIAltbWNbMF0uZ3Bpb19jZCA9IGdwaW8gKyAwOwogCW9tYXAyX2hzbW1jX2luaXQobW1jKTsKIAotCS8qIGxpbmsgcmVndWxhdG9ycyB0byBNTUMgYWRhcHRlcnMgKi8KLQliZWFnbGVfdm1tYzFfc3VwcGx5LmRldiA9IG1tY1swXS5kZXY7Ci0JYmVhZ2xlX3ZzaW1fc3VwcGx5LmRldiA9IG1tY1swXS5kZXY7Ci0KIAkvKgogCSAqIFRXTDQwMzBfR1BJT19NQVggKyAwID09IGxlZEEsIEVIQ0kgbkVOX1VTQl9QV1IgKG91dCwgWE0gYWN0aXZlCiAJICogaGlnaCAvIG90aGVycyBhY3RpdmUgbG93KQpAQCAtMzM1LDggKzMyMyw4IEBACiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmYmVhZ2xlX3ZtbWMxX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShiZWFnbGVfdm1tYzFfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBiZWFnbGVfdm1tYzFfc3VwcGx5LAogfTsKIAogLyogVlNJTSBmb3IgTU1DMSBwaW5zIERBVDQuLkRBVDcgKDIgbUEsIHBsdXMgY2FyZCA9PSBtYXggNTAgbUEpICovCkBAIC0zNTAsNjIgKzMzOCwxNSBAQAogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJmJlYWdsZV92c2ltX3N1cHBseSwKLX07Ci0KLS8qIFZEQUMgZm9yIERTUyBkcml2aW5nIFMtVmlkZW8gKDggbUEgdW5sb2FkZWQsIG1heCA2NSBtQSkgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBiZWFnbGVfdmRhYyA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJmJlYWdsZV92ZGFjX3N1cHBseSwKLX07Ci0KLS8qIFZQTEwyIGZvciBkaWdpdGFsIHZpZGVvIG91dHB1dHMgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBiZWFnbGVfdnBsbDIgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubmFtZQkJCT0gIlZEVkkiLAotCQkubWluX3VWCQkJPSAxODAwMDAwLAotCQkubWF4X3VWCQkJPSAxODAwMDAwLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGJlYWdsZV92ZHZpX3N1cHBsaWVzKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBiZWFnbGVfdmR2aV9zdXBwbGllcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSBiZWFnbGVfdXNiX2RhdGEgPSB7Ci0JLnVzYl9tb2RlCT0gVDJfVVNCX01PREVfVUxQSSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9jb2RlY19hdWRpb19kYXRhIGJlYWdsZV9hdWRpb19kYXRhOwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfZGF0YSBiZWFnbGVfY29kZWNfZGF0YSA9IHsKLQkuYXVkaW9fbWNsayA9IDI2MDAwMDAwLAotCS5hdWRpbyA9ICZiZWFnbGVfYXVkaW9fZGF0YSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShiZWFnbGVfdnNpbV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IGJlYWdsZV92c2ltX3N1cHBseSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhIGJlYWdsZV90d2xkYXRhID0gewotCS5pcnFfYmFzZQk9IFRXTDQwMzBfSVJRX0JBU0UsCi0JLmlycV9lbmQJPSBUV0w0MDMwX0lSUV9FTkQsCi0KIAkvKiBwbGF0Zm9ybV9kYXRhIGZvciBjaGlsZHJlbiBnb2VzIGhlcmUgKi8KLQkudXNiCQk9ICZiZWFnbGVfdXNiX2RhdGEsCiAJLmdwaW8JCT0gJmJlYWdsZV9ncGlvX2RhdGEsCi0JLmNvZGVjCQk9ICZiZWFnbGVfY29kZWNfZGF0YSwKIAkudm1tYzEJCT0gJmJlYWdsZV92bW1jMSwKIAkudnNpbQkJPSAmYmVhZ2xlX3ZzaW0sCi0JLnZkYWMJCT0gJmJlYWdsZV92ZGFjLAotCS52cGxsMgkJPSAmYmVhZ2xlX3ZwbGwyLAogfTsKIAogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGJlYWdsZV9pMmNfZWVwcm9tW10gPSB7CkBAIC00MTYsNiArMzU3LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG9tYXAzX2JlYWdsZV9pMmNfaW5pdCh2b2lkKQogeworCW9tYXAzX3BtaWNfZ2V0X2NvbmZpZygmYmVhZ2xlX3R3bGRhdGEsCisJCQlUV0xfQ09NTU9OX1BEQVRBX1VTQiB8IFRXTF9DT01NT05fUERBVEFfQVVESU8sCisJCQlUV0xfQ09NTU9OX1JFR1VMQVRPUl9WREFDIHwgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBMTDIpOworCisJYmVhZ2xlX3R3bGRhdGEudnBsbDItPmNvbnN0cmFpbnRzLm5hbWUgPSAiVkRWSSI7CisKIAlvbWFwM19wbWljX2luaXQoInR3bDQwMzAiLCAmYmVhZ2xlX3R3bGRhdGEpOwogCS8qIEJ1cyAzIGlzIGF0dGFjaGVkIHRvIHRoZSBEVkkgcG9ydCB3aGVyZSBkZXZpY2VzIGxpa2UgdGhlIHBpY28gRExQCiAJICogcHJvamVjdG9yIGRvbid0IHdvcmsgcmVsaWFibHkgd2l0aCA0MDBrSHogKi8KQEAgLTQ4NSwxMCArNDMyLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX2JlYWdsZV9pbml0X2lycSh2b2lkKQogewotCW9tYXBfaW5pdF9pcnEoKTsKLSNpZmRlZiBDT05GSUdfT01BUF8zMktfVElNRVIKLQlvbWFwMl9ncF9jbG9ja2V2ZW50X3NldF9ncHRpbWVyKDEyKTsKLSNlbmRpZgorCW9tYXAzX2luaXRfaXJxKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvbWFwM19iZWFnbGVfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CkBAIC01NzksNiArNTIzLDkgQEAKIAlvbWFwX25hbmRfZmxhc2hfaW5pdChOQU5EX0JVU1dJRFRIXzE2LCBvbWFwM2JlYWdsZV9uYW5kX3BhcnRpdGlvbnMsCiAJCQkgICAgIEFSUkFZX1NJWkUob21hcDNiZWFnbGVfbmFuZF9wYXJ0aXRpb25zKSk7CiAKKwkvKiBFbnN1cmUgbXNlY3VyZSBpcyBtdXgnZCB0byBiZSBhYmxlIHRvIHNldCB0aGUgUlRDLiAqLworCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzeXNfZHJtX21zZWN1cmUiLCBPTUFQX1BJTl9PRkZfT1VUUFVUX0hJR0gpOworCiAJLyogRW5zdXJlIFNEUkMgcGlucyBhcmUgbXV4J2QgZm9yIHNlbGYtcmVmcmVzaCAqLwogCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZHJjX2NrZTAiLCBPTUFQX1BJTl9PVVRQVVQpOwogCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZHJjX2NrZTEiLCBPTUFQX1BJTl9PVVRQVVQpOwpAQCAtNTk1LDUgKzU0Miw1IEBACiAJLmluaXRfZWFybHkJPSBvbWFwM19iZWFnbGVfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19iZWFnbGVfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXAzX2JlYWdsZV9pbml0LAotCS50aW1lcgkJPSAmb21hcF90aW1lciwKKwkudGltZXIJCT0gJm9tYXAzX3NlY3VyZV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzZXZtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzZXZtLmMKaW5kZXggYjRkNDM0Ni4uYzQ1MmIzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2V2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNldm0uYwpAQCAtMjczLDEyICsyNzMsMTIgQEAKIAkuZGVmYXVsdF9kZXZpY2UJPSAmb21hcDNfZXZtX2xjZF9kZXZpY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNldm1fdm1tYzFfc3VwcGx5ID0gewotCS5zdXBwbHkJCQk9ICJ2bW1jIiwKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBvbWFwM2V2bV92bW1jMV9zdXBwbHlbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgIm9tYXBfaHNtbWMuMCIpLAogfTsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG9tYXAzZXZtX3ZzaW1fc3VwcGx5ID0gewotCS5zdXBwbHkJCQk9ICJ2bW1jX2F1eCIsCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNldm1fdnNpbV9zdXBwbHlbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jX2F1eCIsICJvbWFwX2hzbW1jLjAiKSwKIH07CiAKIC8qIFZNTUMxIGZvciBNTUMxIHBpbnMgQ01ELCBDTEssIERBVDAuLkRBVDMgKDIwIG1BLCBwbHVzIGNhcmQgPT0gbWF4IDIyMCBtQSkgKi8KQEAgLTI5Miw4ICsyOTIsOCBAQAogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJm9tYXAzZXZtX3ZtbWMxX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShvbWFwM2V2bV92bW1jMV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG9tYXAzZXZtX3ZtbWMxX3N1cHBseSwKIH07CiAKIC8qIFZTSU0gZm9yIE1NQzEgcGlucyBEQVQ0Li5EQVQ3ICgyIG1BLCBwbHVzIGNhcmQgPT0gbWF4IDUwIG1BKSAqLwpAQCAtMzA3LDggKzMwNyw4IEBACiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmb21hcDNldm1fdnNpbV9zdXBwbHksCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUob21hcDNldm1fdnNpbV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG9tYXAzZXZtX3ZzaW1fc3VwcGx5LAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwMl9oc21tY19pbmZvIG1tY1tdID0gewpAQCAtMzY1LDEwICszNjUsNiBAQAogCW1tY1swXS5ncGlvX2NkID0gZ3BpbyArIDA7CiAJb21hcDJfaHNtbWNfaW5pdChtbWMpOwogCi0JLyogbGluayByZWd1bGF0b3JzIHRvIE1NQyBhZGFwdGVycyAqLwotCW9tYXAzZXZtX3ZtbWMxX3N1cHBseS5kZXYgPSBtbWNbMF0uZGV2OwotCW9tYXAzZXZtX3ZzaW1fc3VwcGx5LmRldiA9IG1tY1swXS5kZXY7Ci0KIAkvKgogCSAqIE1vc3QgR1BJT3MgYXJlIGZvciBVU0IgT1RHLiAgU29tZSBhcmUgbW9zdGx5IHNlbnQgdG8KIAkgKiB0aGUgUDIgY29ubmVjdG9yOyBub3RhYmx5IExFREEgZm9yIHRoZSBMQ0QgYmFja2xpZ2h0LgpAQCAtNDAwLDEwICszOTYsNiBAQAogCS5zZXR1cAkJPSBvbWFwM2V2bV90d2xfZ3Bpb19zZXR1cCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSBvbWFwM2V2bV91c2JfZGF0YSA9IHsKLQkudXNiX21vZGUJPSBUMl9VU0JfTU9ERV9VTFBJLAotfTsKLQogc3RhdGljIHVpbnQzMl90IGJvYXJkX2tleW1hcFtdID0gewogCUtFWSgwLCAwLCBLRVlfTEVGVCksCiAJS0VZKDAsIDEsIEtFWV9ET1dOKSwKQEAgLTQzOCw1OCArNDMwLDEwIEBACiAJLnJlcAkJPSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCB0d2w0MDMwX21hZGNfcGxhdGZvcm1fZGF0YSBvbWFwM2V2bV9tYWRjX2RhdGEgPSB7Ci0JLmlycV9saW5lCT0gMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9jb2RlY19hdWRpb19kYXRhIG9tYXAzZXZtX2F1ZGlvX2RhdGE7Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9jb2RlY19kYXRhIG9tYXAzZXZtX2NvZGVjX2RhdGEgPSB7Ci0JLmF1ZGlvX21jbGsgPSAyNjAwMDAwMCwKLQkuYXVkaW8gPSAmb21hcDNldm1fYXVkaW9fZGF0YSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBvbWFwM19ldm1fdmRkYV9kYWNfc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRhX2RhYyIsICJvbWFwZHNzX3ZlbmMiKTsKLQotLyogVkRBQyBmb3IgRFNTIGRyaXZpbmcgUy1WaWRlbyAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXAzX2V2bV92ZGFjID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm1pbl91VgkJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJCT0gMTgwMDAwMCwKLQkJLmFwcGx5X3VWCQk9IHRydWUsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJm9tYXAzX2V2bV92ZGRhX2RhY19zdXBwbHksCi19OwotCi0vKiBWUExMMiBmb3IgZGlnaXRhbCB2aWRlbyBvdXRwdXRzICovCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNfZXZtX3ZwbGwyX3N1cHBsaWVzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzcyIpLAotCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3NfZHNpMSIpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXAzX2V2bV92cGxsMiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG9tYXAzX2V2bV92cGxsMl9zdXBwbGllcyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gb21hcDNfZXZtX3ZwbGwyX3N1cHBsaWVzLAotfTsKLQogLyogYWRzNzg0NiBvbiBTUEkgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBvbWFwM2V2bV92aW9fc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2Y2MiLCAic3BpMS4wIik7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNldm1fdmlvX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZjYyIsICJzcGkxLjAiKSwKK307CiAKIC8qIFZJTyBmb3IgYWRzNzg0NiAqLwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXAzZXZtX3ZpbyA9IHsKQEAgLTUwMiw4ICs0NDYsOCBAQAogCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmb21hcDNldm1fdmlvX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShvbWFwM2V2bV92aW9fc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBvbWFwM2V2bV92aW9fc3VwcGx5LAogfTsKIAogI2lmZGVmIENPTkZJR19XTDEyWFhfUExBVEZPUk1fREFUQQpAQCAtNTExLDE2ICs0NTUsMTcgQEAKICNkZWZpbmUgT01BUDNFVk1fV0xBTl9QTUVOQV9HUElPCSgxNTApCiAjZGVmaW5lIE9NQVAzRVZNX1dMQU5fSVJRX0dQSU8JCSgxNDkpCiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBvbWFwM2V2bV92bW1jMl9zdXBwbHkgPQotCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4xIik7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNldm1fdm1tYzJfc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjEiKSwKK307CiAKIC8qIFZNTUMyIGZvciBkcml2aW5nIHRoZSBXTDEyeHggbW9kdWxlICovCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDNldm1fdm1tYzIgPSB7CiAJLmNvbnN0cmFpbnRzID0gewogCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcyA9ICZvbWFwM2V2bV92bW1jMl9zdXBwbHksCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUob21hcDNldm1fdm1tYzJfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBvbWFwM2V2bV92bW1jMl9zdXBwbHksCiB9OwogCiBzdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIG9tYXAzZXZtX3Z3bGFuID0gewpAQCAtNTQ4LDE3ICs0OTMsOSBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhIG9tYXAzZXZtX3R3bGRhdGEgPSB7Ci0JLmlycV9iYXNlCT0gVFdMNDAzMF9JUlFfQkFTRSwKLQkuaXJxX2VuZAk9IFRXTDQwMzBfSVJRX0VORCwKLQogCS8qIHBsYXRmb3JtX2RhdGEgZm9yIGNoaWxkcmVuIGdvZXMgaGVyZSAqLwogCS5rZXlwYWQJCT0gJm9tYXAzZXZtX2twX2RhdGEsCi0JLm1hZGMJCT0gJm9tYXAzZXZtX21hZGNfZGF0YSwKLQkudXNiCQk9ICZvbWFwM2V2bV91c2JfZGF0YSwKIAkuZ3BpbwkJPSAmb21hcDNldm1fZ3Bpb19kYXRhLAotCS5jb2RlYwkJPSAmb21hcDNldm1fY29kZWNfZGF0YSwKLQkudmRhYwkJPSAmb21hcDNfZXZtX3ZkYWMsCi0JLnZwbGwyCQk9ICZvbWFwM19ldm1fdnBsbDIsCiAJLnZpbwkJPSAmb21hcDNldm1fdmlvLAogCS52bW1jMQkJPSAmb21hcDNldm1fdm1tYzEsCiAJLnZzaW0JCT0gJm9tYXAzZXZtX3ZzaW0sCkBAIC01NjYsNiArNTAzLDE0IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG9tYXAzX2V2bV9pMmNfaW5pdCh2b2lkKQogeworCW9tYXAzX3BtaWNfZ2V0X2NvbmZpZygmb21hcDNldm1fdHdsZGF0YSwKKwkJCVRXTF9DT01NT05fUERBVEFfVVNCIHwgVFdMX0NPTU1PTl9QREFUQV9NQURDIHwKKwkJCVRXTF9DT01NT05fUERBVEFfQVVESU8sCisJCQlUV0xfQ09NTU9OX1JFR1VMQVRPUl9WREFDIHwgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBMTDIpOworCisJb21hcDNldm1fdHdsZGF0YS52ZGFjLT5jb25zdHJhaW50cy5hcHBseV91ViA9IHRydWU7CisJb21hcDNldm1fdHdsZGF0YS52cGxsMi0+Y29uc3RyYWludHMuYXBwbHlfdVYgPSB0cnVlOworCiAJb21hcDNfcG1pY19pbml0KCJ0d2w0MDMwIiwgJm9tYXAzZXZtX3R3bGRhdGEpOwogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygyLCA0MDAsIE5VTEwsIDApOwogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygzLCA0MDAsIE5VTEwsIDApOwpAQCAtNzQwLDcgKzY4NSw3IEBACiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvbWFwM19ldm1faW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBvbWFwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwM19ldm1faW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzbG9naWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNsb2dpYy5jCmluZGV4IDYwZDliZTQuLjcwM2FlYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNsb2dpYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNsb2dpYy5jCkBAIC0zNSw3ICszNSw2IEBACiAKICNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJoc21tYy5oIgotI2luY2x1ZGUgInRpbWVyLWdwLmgiCiAjaW5jbHVkZSAiY29udHJvbC5oIgogI2luY2x1ZGUgImNvbW1vbi1ib2FyZC1kZXZpY2VzLmgiCiAKQEAgLTU1LDggKzU0LDggQEAKICNkZWZpbmUgT01BUDNfVE9SUEVET19NTUNfR1BJT19DRAkJMTI3CiAjZGVmaW5lIE9NQVAzX1RPUlBFRE9fU01TQzkxMVhfR1BJT19JUlEJCTEyOQogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNsb2dpY192bW1jMV9zdXBwbHkgPSB7Ci0JLnN1cHBseQkJCT0gInZtbWMiLAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG9tYXAzbG9naWNfdm1tYzFfc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjAiKSwKIH07CiAKIC8qIFZNTUMxIGZvciBNTUMxIHBpbnMgQ01ELCBDTEssIERBVDAuLkRBVDMgKDIwIG1BLCBwbHVzIGNhcmQgPT0gbWF4IDIyMCBtQSkgKi8KQEAgLTcxLDggKzcwLDggQEAKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgID0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgICAgICA9ICZvbWFwM2xvZ2ljX3ZtbWMxX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzICA9IEFSUkFZX1NJWkUob21hcDNsb2dpY192bW1jMV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcyAgICAgID0gb21hcDNsb2dpY192bW1jMV9zdXBwbHksCiB9OwogCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfZ3Bpb19wbGF0Zm9ybV9kYXRhIG9tYXAzbG9naWNfZ3Bpb19kYXRhID0gewpAQCAtMTMwLDggKzEyOSw2IEBACiAJfQogCiAJb21hcDJfaHNtbWNfaW5pdChib2FyZF9tbWNfaW5mbyk7Ci0JLyogbGluayByZWd1bGF0b3JzIHRvIE1NQyBhZGFwdGVycyAqLwotCW9tYXAzbG9naWNfdm1tYzFfc3VwcGx5LmRldiA9IGJvYXJkX21tY19pbmZvWzBdLmRldjsKIH0KIAogc3RhdGljIHN0cnVjdCBvbWFwX3Ntc2M5MTF4X3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBib2FyZF9zbXNjOTExeF9kYXRhID0gewpAQCAtMjE1LDE2ICsyMTIsMTYgQEAKIAkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb21hcDNsb2dpY19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9tYXBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXAzbG9naWNfaW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoT01BUDM1MzBfTFZfU09NLCAiT01BUCBMb2dpYyAzNTMwIExWIFNPTSBib2FyZCIpCiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9tYXAzbG9naWNfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBvbWFwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwM2xvZ2ljX2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3BhbmRvcmEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNwYW5kb3JhLmMKaW5kZXggMWQxMDczNi4uMDgwZDdiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3BhbmRvcmEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CkBAIC00MSw3ICs0Miw2IEBACiAKICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8cGxhdC9tY3NwaS5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CkBAIC01Nyw4ICs1Nyw2IEBACiAjZGVmaW5lIFBBTkRPUkFfV0lGSV9OUkVTRVRfR1BJTwkyMwogI2RlZmluZSBPTUFQM19QQU5ET1JBX1RTX0dQSU8JCTk0CiAKLSNkZWZpbmUgTkFORF9CTE9DS19TSVpFCQkJU1pfMTI4SwotCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gb21hcDNwYW5kb3JhX25hbmRfcGFydGl0aW9uc1tdID0gewogCXsKIAkJLm5hbWUgICAgICAgICAgID0gInhsb2FkZXIiLApAQCAtODYsNyArODQsOCBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfbmFuZF9wbGF0Zm9ybV9kYXRhIHBhbmRvcmFfbmFuZF9kYXRhID0gewogCS5jcwkJPSAwLAotCS5kZXZzaXplCT0gMSwJLyogJzAnIGZvciA4LWJpdCwgJzEnIGZvciAxNi1iaXQgZGV2aWNlICovCisJLmRldnNpemUJPSBOQU5EX0JVU1dJRFRIXzE2LAorCS54ZmVyX3R5cGUJPSBOQU5EX09NQVBfUFJFRkVUQ0hfRE1BLAogCS5wYXJ0cwkJPSBvbWFwM3BhbmRvcmFfbmFuZF9wYXJ0aXRpb25zLAogCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUob21hcDNwYW5kb3JhX25hbmRfcGFydGl0aW9ucyksCiB9OwpAQCAtMzIxLDE3ICszMjAsMTcgQEAKIAkuc2V0dXAJCT0gb21hcDNwYW5kb3JhX3R3bF9ncGlvX3NldHVwLAogfTsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHBhbmRvcmFfdm1tYzFfc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgIm9tYXBfaHNtbWMuMCIpOworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHBhbmRvcmFfdm1tYzFfc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjAiKSwKK307CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBwYW5kb3JhX3ZtbWMyX3N1cHBseSA9Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjEiKTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBwYW5kb3JhX3ZtbWMyX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4xIikKK307CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBwYW5kb3JhX3ZtbWMzX3N1cHBseSA9Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjIiKTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHBhbmRvcmFfdmRkYV9kYWNfc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRhX2RhYyIsICJvbWFwZHNzX3ZlbmMiKTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBwYW5kb3JhX3ZtbWMzX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4yIiksCit9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcGFuZG9yYV92ZGRzX3N1cHBsaWVzW10gPSB7CiAJUkVHVUxBVE9SX1NVUFBMWSgidmRkc19zZGkiLCAib21hcGRzcyIpLApAQCAtMzM5LDExICszMzgsMTMgQEAKIAlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RzaTEiKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBwYW5kb3JhX3ZjY19sY2Rfc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2Y2MiLCAiZGlzcGxheTAiKTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBwYW5kb3JhX3ZjY19sY2Rfc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmNjIiwgImRpc3BsYXkwIiksCit9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcGFuZG9yYV91c2JfcGh5X3N1cHBseSA9Ci0JUkVHVUxBVE9SX1NVUFBMWSgiaHN1c2IwIiwgImVoY2ktb21hcC4wIik7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcGFuZG9yYV91c2JfcGh5X3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoImhzdXNiMCIsICJlaGNpLW9tYXAuMCIpLAorfTsKIAogLyogYWRzNzg0NiBvbiBTUEkgYW5kIDIgbnViIGNvbnRyb2xsZXJzIG9uIEkyQyAqLwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHBhbmRvcmFfdmF1eDRfc3VwcGxpZXNbXSA9IHsKQEAgLTM1Miw4ICszNTMsOSBAQAogCVJFR1VMQVRPUl9TVVBQTFkoInZjYyIsICIzLTAwNjciKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBwYW5kb3JhX2FkYWNfc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2Y2MiLCAic29jLWF1ZGlvIik7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcGFuZG9yYV9hZGFjX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZjYyIsICJzb2MtYXVkaW8iKSwKK307CiAKIC8qIFZNTUMxIGZvciBNTUMxIHBpbnMgQ01ELCBDTEssIERBVDAuLkRBVDMgKDIwIG1BLCBwbHVzIGNhcmQgPT0gbWF4IDIyMCBtQSkgKi8KIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBwYW5kb3JhX3ZtbWMxID0gewpAQCAtMzY2LDggKzM2OCw4IEBACiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmcGFuZG9yYV92bW1jMV9zdXBwbHksCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUocGFuZG9yYV92bW1jMV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IHBhbmRvcmFfdm1tYzFfc3VwcGx5LAogfTsKIAogLyogVk1NQzIgZm9yIE1NQzIgcGlucyBDTUQsIENMSywgREFUMC4uREFUMyAobWF4IDEwMCBtQSkgKi8KQEAgLTM4MSwzOCArMzgzLDggQEAKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcwk9ICZwYW5kb3JhX3ZtbWMyX3N1cHBseSwKLX07Ci0KLS8qIFZEQUMgZm9yIERTUyBkcml2aW5nIFMtVmlkZW8gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBwYW5kb3JhX3ZkYWMgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWCQkJPSAxODAwMDAwLAotCQkubWF4X3VWCQkJPSAxODAwMDAwLAotCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmcGFuZG9yYV92ZGRhX2RhY19zdXBwbHksCi19OwotCi0vKiBWUExMMiBmb3IgZGlnaXRhbCB2aWRlbyBvdXRwdXRzICovCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcGFuZG9yYV92cGxsMiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHBhbmRvcmFfdmRkc19zdXBwbGllcyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gcGFuZG9yYV92ZGRzX3N1cHBsaWVzLAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHBhbmRvcmFfdm1tYzJfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBwYW5kb3JhX3ZtbWMyX3N1cHBseSwKIH07CiAKIC8qIFZBVVgxIGZvciBMQ0QgKi8KQEAgLTQyNiw4ICszOTgsOCBAQAogCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmcGFuZG9yYV92Y2NfbGNkX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShwYW5kb3JhX3ZjY19sY2Rfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBwYW5kb3JhX3ZjY19sY2Rfc3VwcGx5LAogfTsKIAogLyogVkFVWDIgZm9yIFVTQiBob3N0IFBIWSAqLwpAQCAtNDQxLDggKzQxMyw4IEBACiAJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcwk9ICZwYW5kb3JhX3VzYl9waHlfc3VwcGx5LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHBhbmRvcmFfdXNiX3BoeV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IHBhbmRvcmFfdXNiX3BoeV9zdXBwbHksCiB9OwogCiAvKiBWQVVYNCBmb3IgYWRzNzg0NiBhbmQgbnVicyAqLwpAQCAtNDcxLDggKzQ0Myw4IEBACiAJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcwk9ICZwYW5kb3JhX2FkYWNfc3VwcGx5LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHBhbmRvcmFfYWRhY19zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IHBhbmRvcmFfYWRhY19zdXBwbHksCiB9OwogCiAvKiBGaXhlZCByZWd1bGF0b3IgaW50ZXJuYWwgdG8gV2lmaSBtb2R1bGUgKi8KQEAgLTQ4MCw4ICs0NTIsOCBAQAogCS5jb25zdHJhaW50cyA9IHsKIAkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJnBhbmRvcmFfdm1tYzNfc3VwcGx5LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHBhbmRvcmFfdm1tYzNfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBwYW5kb3JhX3ZtbWMzX3N1cHBseSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgcGFuZG9yYV92d2xhbiA9IHsKQEAgLTUwMiwyOSArNDc0LDEyIEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSBvbWFwM3BhbmRvcmFfdXNiX2RhdGEgPSB7Ci0JLnVzYl9tb2RlCT0gVDJfVVNCX01PREVfVUxQSSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9jb2RlY19hdWRpb19kYXRhIG9tYXAzcGFuZG9yYV9hdWRpb19kYXRhOwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfZGF0YSBvbWFwM3BhbmRvcmFfY29kZWNfZGF0YSA9IHsKLQkuYXVkaW9fbWNsayA9IDI2MDAwMDAwLAotCS5hdWRpbyA9ICZvbWFwM3BhbmRvcmFfYXVkaW9fZGF0YSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9iY2lfcGxhdGZvcm1fZGF0YSBwYW5kb3JhX2JjaV9kYXRhOwogCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBvbWFwM3BhbmRvcmFfdHdsZGF0YSA9IHsKLQkuaXJxX2Jhc2UJPSBUV0w0MDMwX0lSUV9CQVNFLAotCS5pcnFfZW5kCT0gVFdMNDAzMF9JUlFfRU5ELAogCS5ncGlvCQk9ICZvbWFwM3BhbmRvcmFfZ3Bpb19kYXRhLAotCS51c2IJCT0gJm9tYXAzcGFuZG9yYV91c2JfZGF0YSwKLQkuY29kZWMJCT0gJm9tYXAzcGFuZG9yYV9jb2RlY19kYXRhLAogCS52bW1jMQkJPSAmcGFuZG9yYV92bW1jMSwKIAkudm1tYzIJCT0gJnBhbmRvcmFfdm1tYzIsCi0JLnZkYWMJCT0gJnBhbmRvcmFfdmRhYywKLQkudnBsbDIJCT0gJnBhbmRvcmFfdnBsbDIsCiAJLnZhdXgxCQk9ICZwYW5kb3JhX3ZhdXgxLAogCS52YXV4MgkJPSAmcGFuZG9yYV92YXV4MiwKIAkudmF1eDQJCT0gJnBhbmRvcmFfdmF1eDQsCkBAIC01NDIsNiArNDk3LDE3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG9tYXAzcGFuZG9yYV9pMmNfaW5pdCh2b2lkKQogeworCW9tYXAzX3BtaWNfZ2V0X2NvbmZpZygmb21hcDNwYW5kb3JhX3R3bGRhdGEsCisJCQlUV0xfQ09NTU9OX1BEQVRBX1VTQiB8IFRXTF9DT01NT05fUERBVEFfQVVESU8sCisJCQlUV0xfQ09NTU9OX1JFR1VMQVRPUl9WREFDIHwgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBMTDIpOworCisJb21hcDNwYW5kb3JhX3R3bGRhdGEudmRhYy0+Y29uc3RyYWludHMuYXBwbHlfdVYgPSB0cnVlOworCisJb21hcDNwYW5kb3JhX3R3bGRhdGEudnBsbDItPmNvbnN0cmFpbnRzLmFwcGx5X3VWID0gdHJ1ZTsKKwlvbWFwM3BhbmRvcmFfdHdsZGF0YS52cGxsMi0+bnVtX2NvbnN1bWVyX3N1cHBsaWVzID0KKwkJCQkJQVJSQVlfU0laRShwYW5kb3JhX3ZkZHNfc3VwcGxpZXMpOworCW9tYXAzcGFuZG9yYV90d2xkYXRhLnZwbGwyLT5jb25zdW1lcl9zdXBwbGllcyA9IHBhbmRvcmFfdmRkc19zdXBwbGllczsKKwogCW9tYXAzX3BtaWNfaW5pdCgidHBzNjU5NTAiLCAmb21hcDNwYW5kb3JhX3R3bGRhdGEpOwogCS8qIGkyYzIgcGlucyBhcmUgbm90IGNvbm5lY3RlZCAqLwogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygzLCAxMDAsIG9tYXAzcGFuZG9yYV9pMmMzX2JvYXJkaW5mbywKQEAgLTY0NCw3ICs2MTAsNyBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb21hcDNwYW5kb3JhX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcDNwYW5kb3JhX2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3N0YWxrZXIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNzdGFsa2VyLmMKaW5kZXggMGMxMDhhMi4uOGUxMDQ5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3N0YWxrZXIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzc3RhbGtlci5jCkBAIC01Miw3ICs1Miw2IEBACiAjaW5jbHVkZSAic2RyYW0tbWljcm9uLW10NDZoMzJtMzJsZi02LmgiCiAjaW5jbHVkZSAibXV4LmgiCiAjaW5jbHVkZSAiaHNtbWMuaCIKLSNpbmNsdWRlICJ0aW1lci1ncC5oIgogI2luY2x1ZGUgImNvbW1vbi1ib2FyZC1kZXZpY2VzLmgiCiAKICNpZiBkZWZpbmVkKENPTkZJR19TTVNDOTExWCkgfHwgZGVmaW5lZChDT05GSUdfU01TQzkxMVhfTU9EVUxFKQpAQCAtMjA2LDEyICsyMDUsMTIgQEAKIAkuZGVmYXVsdF9kZXZpY2UJPSAmb21hcDNfc3RhbGtlcl9kdmlfZGV2aWNlLAogfTsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG9tYXAzc3RhbGtlcl92bW1jMV9zdXBwbHkgPSB7Ci0JLnN1cHBseQkJPSAidm1tYyIsCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNzdGFsa2VyX3ZtbWMxX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4wIiksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNzdGFsa2VyX3ZzaW1fc3VwcGx5ID0gewotCS5zdXBwbHkJCT0gInZtbWNfYXV4IiwKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBvbWFwM3N0YWxrZXJfdnNpbV9zdXBwbHlbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jX2F1eCIsICJvbWFwX2hzbW1jLjAiKSwKIH07CiAKIC8qIFZNTUMxIGZvciBNTUMxIHBpbnMgQ01ELCBDTEssIERBVDAuLkRBVDMgKDIwIG1BLCBwbHVzIGNhcmQgPT0gbWF4IDIyMCBtQSkgKi8KQEAgLTIyNCw4ICsyMjMsOCBAQAogCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFCiAJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFIHwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmb21hcDNzdGFsa2VyX3ZtbWMxX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShvbWFwM3N0YWxrZXJfdm1tYzFfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBvbWFwM3N0YWxrZXJfdm1tYzFfc3VwcGx5LAogfTsKIAogLyogVlNJTSBmb3IgTU1DMSBwaW5zIERBVDQuLkRBVDcgKDIgbUEsIHBsdXMgY2FyZCA9PSBtYXggNTAgbUEpICovCkBAIC0yMzgsOCArMjM3LDggQEAKIAkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRQogCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERSB8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJm9tYXAzc3RhbGtlcl92c2ltX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShvbWFwM3N0YWxrZXJfdnNpbV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG9tYXAzc3RhbGtlcl92c2ltX3N1cHBseSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcDJfaHNtbWNfaW5mbyBtbWNbXSA9IHsKQEAgLTMyMSwxMCArMzIwLDYgQEAKIAltbWNbMF0uZ3Bpb19jZCA9IGdwaW8gKyAwOwogCW9tYXAyX2hzbW1jX2luaXQobW1jKTsKIAotCS8qIGxpbmsgcmVndWxhdG9ycyB0byBNTUMgYWRhcHRlcnMgKi8KLQlvbWFwM3N0YWxrZXJfdm1tYzFfc3VwcGx5LmRldiA9IG1tY1swXS5kZXY7Ci0Jb21hcDNzdGFsa2VyX3ZzaW1fc3VwcGx5LmRldiA9IG1tY1swXS5kZXY7Ci0KIAkvKgogCSAqIE1vc3QgR1BJT3MgYXJlIGZvciBVU0IgT1RHLiAgU29tZSBhcmUgbW9zdGx5IHNlbnQgdG8KIAkgKiB0aGUgUDIgY29ubmVjdG9yOyBub3RhYmx5IExFREEgZm9yIHRoZSBMQ0QgYmFja2xpZ2h0LgpAQCAtMzU0LDEwICszNDksNiBAQAogCS5zZXR1cAkJPSBvbWFwM3N0YWxrZXJfdHdsX2dwaW9fc2V0dXAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfdXNiX2RhdGEgb21hcDNzdGFsa2VyX3VzYl9kYXRhID0gewotCS51c2JfbW9kZQk9IFQyX1VTQl9NT0RFX1VMUEksCi19OwotCiBzdGF0aWMgdWludDMyX3QgYm9hcmRfa2V5bWFwW10gPSB7CiAJS0VZKDAsIDAsIEtFWV9MRUZUKSwKIAlLRVkoMCwgMSwgS0VZX0RPV04pLApAQCAtMzkyLDY4ICszODMsMTAgQEAKIAkucmVwCQk9IDEsCiB9OwogCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfbWFkY19wbGF0Zm9ybV9kYXRhIG9tYXAzc3RhbGtlcl9tYWRjX2RhdGEgPSB7Ci0JLmlycV9saW5lCT0gMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9jb2RlY19hdWRpb19kYXRhIG9tYXAzc3RhbGtlcl9hdWRpb19kYXRhOwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfZGF0YSBvbWFwM3N0YWxrZXJfY29kZWNfZGF0YSA9IHsKLQkuYXVkaW9fbWNsawk9IDI2MDAwMDAwLAotCS5hdWRpbwkJPSAmb21hcDNzdGFsa2VyX2F1ZGlvX2RhdGEsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNfc3RhbGtlcl92ZGRhX2RhY19zdXBwbHkgPQotCVJFR1VMQVRPUl9TVVBQTFkoInZkZGFfZGFjIiwgIm9tYXBkc3NfdmVuYyIpOwotCi0vKiBWREFDIGZvciBEU1MgZHJpdmluZyBTLVZpZGVvICovCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDNfc3RhbGtlcl92ZGFjID0gewotCS5jb25zdHJhaW50cwkJPSB7Ci0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcwk9ICZvbWFwM19zdGFsa2VyX3ZkZGFfZGFjX3N1cHBseSwKLX07Ci0KLS8qIFZQTEwyIGZvciBkaWdpdGFsIHZpZGVvIG91dHB1dHMgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBvbWFwM19zdGFsa2VyX3ZwbGwyX3N1cHBsaWVzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzcyIpLAotCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3NfZHNpMSIpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXAzX3N0YWxrZXJfdnBsbDIgPSB7Ci0JLmNvbnN0cmFpbnRzCQk9IHsKLQkJLm5hbWUJCQk9ICJWRFZJIiwKLQkJLm1pbl91VgkJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJCT0gMTgwMDAwMCwKLQkJLmFwcGx5X3VWID0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShvbWFwM19zdGFsa2VyX3ZwbGwyX3N1cHBsaWVzKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBvbWFwM19zdGFsa2VyX3ZwbGwyX3N1cHBsaWVzLAotfTsKLQogc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgb21hcDNzdGFsa2VyX3R3bGRhdGEgPSB7Ci0JLmlycV9iYXNlCT0gVFdMNDAzMF9JUlFfQkFTRSwKLQkuaXJxX2VuZAk9IFRXTDQwMzBfSVJRX0VORCwKLQogCS8qIHBsYXRmb3JtX2RhdGEgZm9yIGNoaWxkcmVuIGdvZXMgaGVyZSAqLwogCS5rZXlwYWQJCT0gJm9tYXAzc3RhbGtlcl9rcF9kYXRhLAotCS5tYWRjCQk9ICZvbWFwM3N0YWxrZXJfbWFkY19kYXRhLAotCS51c2IJCT0gJm9tYXAzc3RhbGtlcl91c2JfZGF0YSwKIAkuZ3BpbwkJPSAmb21hcDNzdGFsa2VyX2dwaW9fZGF0YSwKLQkuY29kZWMJCT0gJm9tYXAzc3RhbGtlcl9jb2RlY19kYXRhLAotCS52ZGFjCQk9ICZvbWFwM19zdGFsa2VyX3ZkYWMsCi0JLnZwbGwyCQk9ICZvbWFwM19zdGFsa2VyX3ZwbGwyLAogCS52bW1jMQkJPSAmb21hcDNzdGFsa2VyX3ZtbWMxLAogCS52c2ltCQk9ICZvbWFwM3N0YWxrZXJfdnNpbSwKIH07CkBAIC00NzQsNiArNDA3LDE1IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG9tYXAzX3N0YWxrZXJfaTJjX2luaXQodm9pZCkKIHsKKwlvbWFwM19wbWljX2dldF9jb25maWcoJm9tYXAzc3RhbGtlcl90d2xkYXRhLAorCQkJVFdMX0NPTU1PTl9QREFUQV9VU0IgfCBUV0xfQ09NTU9OX1BEQVRBX01BREMgfAorCQkJVFdMX0NPTU1PTl9QREFUQV9BVURJTywKKwkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZEQUMgfCBUV0xfQ09NTU9OX1JFR1VMQVRPUl9WUExMMik7CisKKwlvbWFwM3N0YWxrZXJfdHdsZGF0YS52ZGFjLT5jb25zdHJhaW50cy5hcHBseV91ViA9IHRydWU7CisJb21hcDNzdGFsa2VyX3R3bGRhdGEudnBsbDItPmNvbnN0cmFpbnRzLmFwcGx5X3VWID0gdHJ1ZTsKKwlvbWFwM3N0YWxrZXJfdHdsZGF0YS52cGxsMi0+Y29uc3RyYWludHMubmFtZSA9ICJWRFZJIjsKKwogCW9tYXAzX3BtaWNfaW5pdCgidHdsNDAzMCIsICZvbWFwM3N0YWxrZXJfdHdsZGF0YSk7CiAJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDIsIDQwMCwgTlVMTCwgMCk7CiAJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDMsIDQwMCwgb21hcDNzdGFsa2VyX2kyY19ib2FyZGluZm8zLApAQCAtNDk0LDEwICs0MzYsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfc3RhbGtlcl9pbml0X2lycSh2b2lkKQogewotCW9tYXBfaW5pdF9pcnEoKTsKLSNpZmRlZiBDT05GSUdfT01BUF8zMktfVElNRVIKLQlvbWFwMl9ncF9jbG9ja2V2ZW50X3NldF9ncHRpbWVyKDEyKTsKLSNlbmRpZgorCW9tYXAzX2luaXRfaXJxKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvbWFwM19zdGFsa2VyX2RldmljZXNbXSBfX2luaXRkYXRhID0gewpAQCAtNTYwLDUgKzQ5OSw1IEBACiAJLmluaXRfZWFybHkJCT0gb21hcDNfc3RhbGtlcl9pbml0X2Vhcmx5LAogCS5pbml0X2lycQkJPSBvbWFwM19zdGFsa2VyX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJCT0gb21hcDNfc3RhbGtlcl9pbml0LAotCS50aW1lcgkJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQkJPSAmb21hcDNfc2VjdXJlX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDN0b3VjaGJvb2suYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDN0b3VjaGJvb2suYwppbmRleCA4Mjg3MmQ3Li44NTJlYTA0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzdG91Y2hib29rLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3RvdWNoYm9vay5jCkBAIC01MSwxMyArNTEsMTAgQEAKIAogI2luY2x1ZGUgIm11eC5oIgogI2luY2x1ZGUgImhzbW1jLmgiCi0jaW5jbHVkZSAidGltZXItZ3AuaCIKICNpbmNsdWRlICJjb21tb24tYm9hcmQtZGV2aWNlcy5oIgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKLSNkZWZpbmUgTkFORF9CTE9DS19TSVpFCQlTWl8xMjhLCi0KICNkZWZpbmUgT01BUDNfQUNfR1BJTwkJMTM2CiAjZGVmaW5lIE9NQVAzX1RTX0dQSU8JCTE2MgogI2RlZmluZSBUQl9CTF9QV01fVElNRVIJCTkKQEAgLTExNiwxMiArMTEzLDEyIEBACiAJLmN0cmxfbmFtZQk9ICJpbnRlcm5hbCIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdG91Y2hib29rX3ZtbWMxX3N1cHBseSA9IHsKLQkuc3VwcGx5CQkJPSAidm1tYyIsCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdG91Y2hib29rX3ZtbWMxX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4wIiksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdG91Y2hib29rX3ZzaW1fc3VwcGx5ID0gewotCS5zdXBwbHkJCQk9ICJ2bW1jX2F1eCIsCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdG91Y2hib29rX3ZzaW1fc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tY19hdXgiLCAib21hcF9oc21tYy4wIiksCiB9OwogCiBzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGdwaW9fbGVkc1tdOwpAQCAtMTM5LDEwICsxMzYsNiBAQAogCW1tY1swXS5ncGlvX2NkID0gZ3BpbyArIDA7CiAJb21hcDJfaHNtbWNfaW5pdChtbWMpOwogCi0JLyogbGluayByZWd1bGF0b3JzIHRvIE1NQyBhZGFwdGVycyAqLwotCXRvdWNoYm9va192bW1jMV9zdXBwbHkuZGV2ID0gbW1jWzBdLmRldjsKLQl0b3VjaGJvb2tfdnNpbV9zdXBwbHkuZGV2ID0gbW1jWzBdLmRldjsKLQogCS8qIFJFVklTSVQ6IG5lZWQgZWhjaS1vbWFwIGhvb2tzIGZvciBleHRlcm5hbCBWQlVTCiAJICogcG93ZXIgc3dpdGNoIGFuZCBvdmVyY3VycmVudCBkZXRlY3QKIAkgKi8KQEAgLTE2OSwxNCArMTYyLDE4IEBACiAJLnNldHVwCQk9IHRvdWNoYm9va190d2xfZ3Bpb19zZXR1cCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB0b3VjaGJvb2tfdmRhY19zdXBwbHkgPSB7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdG91Y2hib29rX3ZkYWNfc3VwcGx5W10gPSB7Cit7CiAJLnN1cHBseQkJPSAidmRhYyIsCiAJLmRldgkJPSAmb21hcDNfdG91Y2hib29rX2xjZF9kZXZpY2UuZGV2LAorfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB0b3VjaGJvb2tfdmR2aV9zdXBwbHkgPSB7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdG91Y2hib29rX3Zkdmlfc3VwcGx5W10gPSB7Cit7CiAJLnN1cHBseQkJPSAidmR2aSIsCiAJLmRldgkJPSAmb21hcDNfdG91Y2hib29rX2xjZF9kZXZpY2UuZGV2LAorfSwKIH07CiAKIC8qIFZNTUMxIGZvciBNTUMxIHBpbnMgQ01ELCBDTEssIERBVDAuLkRBVDMgKDIwIG1BLCBwbHVzIGNhcmQgPT0gbWF4IDIyMCBtQSkgKi8KQEAgLTE5MCw4ICsxODcsOCBAQAogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJnRvdWNoYm9va192bW1jMV9zdXBwbHksCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUodG91Y2hib29rX3ZtbWMxX3N1cHBseSksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gdG91Y2hib29rX3ZtbWMxX3N1cHBseSwKIH07CiAKIC8qIFZTSU0gZm9yIE1NQzEgcGlucyBEQVQ0Li5EQVQ3ICgyIG1BLCBwbHVzIGNhcmQgPT0gbWF4IDUwIG1BKSAqLwpAQCAtMjA1LDYyICsyMDIsMTUgQEAKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcwk9ICZ0b3VjaGJvb2tfdnNpbV9zdXBwbHksCi19OwotCi0vKiBWREFDIGZvciBEU1MgZHJpdmluZyBTLVZpZGVvICg4IG1BIHVubG9hZGVkLCBtYXggNjUgbUEpICovCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdG91Y2hib29rX3ZkYWMgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWCQkJPSAxODAwMDAwLAotCQkubWF4X3VWCQkJPSAxODAwMDAwLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcwk9ICZ0b3VjaGJvb2tfdmRhY19zdXBwbHksCi19OwotCi0vKiBWUExMMiBmb3IgZGlnaXRhbCB2aWRlbyBvdXRwdXRzICovCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdG91Y2hib29rX3ZwbGwyID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm5hbWUJCQk9ICJWRFZJIiwKLQkJLm1pbl91VgkJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJCT0gMTgwMDAwMCwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSAmdG91Y2hib29rX3Zkdmlfc3VwcGx5LAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX3VzYl9kYXRhIHRvdWNoYm9va191c2JfZGF0YSA9IHsKLQkudXNiX21vZGUJPSBUMl9VU0JfTU9ERV9VTFBJLAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX2NvZGVjX2F1ZGlvX2RhdGEgdG91Y2hib29rX2F1ZGlvX2RhdGE7Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9jb2RlY19kYXRhIHRvdWNoYm9va19jb2RlY19kYXRhID0gewotCS5hdWRpb19tY2xrID0gMjYwMDAwMDAsCi0JLmF1ZGlvID0gJnRvdWNoYm9va19hdWRpb19kYXRhLAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHRvdWNoYm9va192c2ltX3N1cHBseSksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gdG91Y2hib29rX3ZzaW1fc3VwcGx5LAogfTsKIAogc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgdG91Y2hib29rX3R3bGRhdGEgPSB7Ci0JLmlycV9iYXNlCT0gVFdMNDAzMF9JUlFfQkFTRSwKLQkuaXJxX2VuZAk9IFRXTDQwMzBfSVJRX0VORCwKLQogCS8qIHBsYXRmb3JtX2RhdGEgZm9yIGNoaWxkcmVuIGdvZXMgaGVyZSAqLwotCS51c2IJCT0gJnRvdWNoYm9va191c2JfZGF0YSwKIAkuZ3BpbwkJPSAmdG91Y2hib29rX2dwaW9fZGF0YSwKLQkuY29kZWMJCT0gJnRvdWNoYm9va19jb2RlY19kYXRhLAogCS52bW1jMQkJPSAmdG91Y2hib29rX3ZtbWMxLAogCS52c2ltCQk9ICZ0b3VjaGJvb2tfdnNpbSwKLQkudmRhYwkJPSAmdG91Y2hib29rX3ZkYWMsCi0JLnZwbGwyCQk9ICZ0b3VjaGJvb2tfdnBsbDIsCiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgdG91Y2hCb29rX2kyY19ib2FyZGluZm9bXSA9IHsKQEAgLTI3Miw4ICsyMjIsMjAgQEAKIHN0YXRpYyBpbnQgX19pbml0IG9tYXAzX3RvdWNoYm9va19pMmNfaW5pdCh2b2lkKQogewogCS8qIFN0YW5kYXJkIFRvdWNoQm9vayBidXMgKi8KLQlvbWFwM19wbWljX2luaXQoInR3bDQwMzAiLCAmdG91Y2hib29rX3R3bGRhdGEpOworCW9tYXAzX3BtaWNfZ2V0X2NvbmZpZygmdG91Y2hib29rX3R3bGRhdGEsCisJCQlUV0xfQ09NTU9OX1BEQVRBX1VTQiB8IFRXTF9DT01NT05fUERBVEFfQVVESU8sCisJCQlUV0xfQ09NTU9OX1JFR1VMQVRPUl9WREFDIHwgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBMTDIpOwogCisJdG91Y2hib29rX3R3bGRhdGEudmRhYy0+bnVtX2NvbnN1bWVyX3N1cHBsaWVzID0KKwkJCQkJQVJSQVlfU0laRSh0b3VjaGJvb2tfdmRhY19zdXBwbHkpOworCXRvdWNoYm9va190d2xkYXRhLnZkYWMtPmNvbnN1bWVyX3N1cHBsaWVzID0gdG91Y2hib29rX3ZkYWNfc3VwcGx5OworCisJdG91Y2hib29rX3R3bGRhdGEudnBsbDItPmNvbnN0cmFpbnRzLm5hbWUgPSAiVkRWSSI7CisJdG91Y2hib29rX3R3bGRhdGEudnBsbDItPm51bV9jb25zdW1lcl9zdXBwbGllcyA9CisJCQkJCUFSUkFZX1NJWkUodG91Y2hib29rX3Zkdmlfc3VwcGx5KTsKKwl0b3VjaGJvb2tfdHdsZGF0YS52cGxsMi0+Y29uc3VtZXJfc3VwcGxpZXMgPSB0b3VjaGJvb2tfdmR2aV9zdXBwbHk7CisKKwlvbWFwM19wbWljX2luaXQoInR3bDQwMzAiLCAmdG91Y2hib29rX3R3bGRhdGEpOwogCS8qIEFkZGl0aW9uYWwgVG91Y2hCb29rIGJ1cyAqLwogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygzLCAxMDAsIHRvdWNoQm9va19pMmNfYm9hcmRpbmZvLAogCQkJQVJSQVlfU0laRSh0b3VjaEJvb2tfaTJjX2JvYXJkaW5mbykpOwpAQCAtMzczLDEwICszMzUsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfdG91Y2hib29rX2luaXRfaXJxKHZvaWQpCiB7Ci0Jb21hcF9pbml0X2lycSgpOwotI2lmZGVmIENPTkZJR19PTUFQXzMyS19USU1FUgotCW9tYXAyX2dwX2Nsb2NrZXZlbnRfc2V0X2dwdGltZXIoMTIpOwotI2VuZGlmCisJb21hcDNfaW5pdF9pcnEoKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9tYXAzX3RvdWNoYm9va19kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKQEAgLTQ1MSw1ICs0MTAsNSBAQAogCS5pbml0X2Vhcmx5CT0gb21hcDNfdG91Y2hib29rX2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfdG91Y2hib29rX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwM190b3VjaGJvb2tfaW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwM19zZWN1cmVfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXA0cGFuZGEuYwppbmRleCA5MDQ4NWZjLi45YWFhOTYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXA0cGFuZGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXA0cGFuZGEuYwpAQCAtNDEsNyArNDEsNiBAQAogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8cGxhdC9tbWMuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+Ci0jaW5jbHVkZSAidGltZXItZ3AuaCIKIAogI2luY2x1ZGUgImhzbW1jLmgiCiAjaW5jbHVkZSAiY29udHJvbC5oIgpAQCAtMTU1LDE0ICsxNTQsNiBAQAogCS5wb3dlcgkJCT0gMTAwLAogfTsKIAotc3RhdGljIHN0cnVjdCB0d2w0MDMwX3VzYl9kYXRhIG9tYXA0X3VzYnBoeV9kYXRhID0gewotCS5waHlfaW5pdAk9IG9tYXA0NDMwX3BoeV9pbml0LAotCS5waHlfZXhpdAk9IG9tYXA0NDMwX3BoeV9leGl0LAotCS5waHlfcG93ZXIJPSBvbWFwNDQzMF9waHlfcG93ZXIsCi0JLnBoeV9zZXRfY2xvY2sJPSBvbWFwNDQzMF9waHlfc2V0X2NsaywKLQkucGh5X3N1c3BlbmQJPSBvbWFwNDQzMF9waHlfc3VzcGVuZCwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcDJfaHNtbWNfaW5mbyBtbWNbXSA9IHsKIAl7CiAJCS5tbWMJCT0gMSwKQEAgLTE4MiwyNCArMTczLDE2IEBACiAJe30JLyogVGVybWluYXRvciAqLwogfTsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG9tYXA0X3BhbmRhX3ZtbWNfc3VwcGx5W10gPSB7Ci0JewotCQkuc3VwcGx5ID0gInZtbWMiLAotCQkuZGV2X25hbWUgPSAib21hcF9oc21tYy4wIiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG9tYXA0X3BhbmRhX3ZtbWM1X3N1cHBseSA9IHsKLQkuc3VwcGx5ID0gInZtbWMiLAotCS5kZXZfbmFtZSA9ICJvbWFwX2hzbW1jLjQiLAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG9tYXA0X3BhbmRhX3ZtbWM1X3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy40IiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcGFuZGFfdm1tYzUgPSB7CiAJLmNvbnN0cmFpbnRzID0gewogCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcyA9ICZvbWFwNF9wYW5kYV92bW1jNV9zdXBwbHksCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUob21hcDRfcGFuZGFfdm1tYzVfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSBvbWFwNF9wYW5kYV92bW1jNV9zdXBwbHksCiB9OwogCiBzdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIHBhbmRhX3Z3bGFuID0gewpAQCAtMjc0LDEyOCArMjU3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXA0X3BhbmRhX3ZhdXgyID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm1pbl91VgkJCT0gMTIwMDAwMCwKLQkJLm1heF91VgkJCT0gMjgwMDAwMCwKLQkJLmFwcGx5X3VWCQk9IHRydWUsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCSA9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDRfcGFuZGFfdmF1eDMgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWCQkJPSAxMDAwMDAwLAotCQkubWF4X3VWCQkJPSAzMDAwMDAwLAotCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJID0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLS8qIFZNTUMxIGZvciBNTUMxIGNhcmQgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBvbWFwNF9wYW5kYV92bW1jID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm1pbl91VgkJCT0gMTIwMDAwMCwKLQkJLm1heF91VgkJCT0gMzAwMDAwMCwKLQkJLmFwcGx5X3VWCQk9IHRydWUsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCSA9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyAgPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcyAgICAgID0gb21hcDRfcGFuZGFfdm1tY19zdXBwbHksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDRfcGFuZGFfdnBwID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm1pbl91VgkJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJCT0gMjUwMDAwMCwKLQkJLmFwcGx5X3VWCQk9IHRydWUsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCSA9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDRfcGFuZGFfdmFuYSA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5taW5fdVYJCQk9IDIxMDAwMDAsCi0JCS5tYXhfdVYJCQk9IDIxMDAwMDAsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCSA9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDRfcGFuZGFfdmN4aW8gPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWCQkJPSAxODAwMDAwLAotCQkubWF4X3VWCQkJPSAxODAwMDAwLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkgPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXA0X3BhbmRhX3ZkYWMgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWCQkJPSAxODAwMDAwLAotCQkubWF4X3VWCQkJPSAxODAwMDAwLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkgPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXA0X3BhbmRhX3Z1c2IgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWCQkJPSAzMzAwMDAwLAotCQkubWF4X3VWCQkJPSAzMzAwMDAwLAotCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJID0JUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBvbWFwNF9wYW5kYV9jbGszMmtnID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBvbWFwNF9wYW5kYV90d2xkYXRhID0gewotCS5pcnFfYmFzZQk9IFRXTDYwMzBfSVJRX0JBU0UsCi0JLmlycV9lbmQJPSBUV0w2MDMwX0lSUV9FTkQsCi0KLQkvKiBSZWd1bGF0b3JzICovCi0JLnZtbWMJCT0gJm9tYXA0X3BhbmRhX3ZtbWMsCi0JLnZwcAkJPSAmb21hcDRfcGFuZGFfdnBwLAotCS52YW5hCQk9ICZvbWFwNF9wYW5kYV92YW5hLAotCS52Y3hpbwkJPSAmb21hcDRfcGFuZGFfdmN4aW8sCi0JLnZkYWMJCT0gJm9tYXA0X3BhbmRhX3ZkYWMsCi0JLnZ1c2IJCT0gJm9tYXA0X3BhbmRhX3Z1c2IsCi0JLnZhdXgyCQk9ICZvbWFwNF9wYW5kYV92YXV4MiwKLQkudmF1eDMJCT0gJm9tYXA0X3BhbmRhX3ZhdXgzLAotCS5jbGszMmtnCT0gJm9tYXA0X3BhbmRhX2NsazMya2csCi0JLnVzYgkJPSAmb21hcDRfdXNicGh5X2RhdGEsCi19OworLyogUGFuZGEgYm9hcmQgdXNlcyB0aGUgY29tbW9uIFBNSUMgY29uZmlndXJhdGlvbiAqLworc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgb21hcDRfcGFuZGFfdHdsZGF0YTsKIAogLyoKICAqIERpc3BsYXkgbW9uaXRvciBmZWF0dXJlcyBhcmUgYnVybnQgaW4gdGhlaXIgRUVQUk9NIGFzIEVESUQgZGF0YS4gVGhlIEVFUFJPTQpAQCAtNDA5LDYgKzI3MiwxNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwNF9wYW5kYV9pMmNfaW5pdCh2b2lkKQogeworCW9tYXA0X3BtaWNfZ2V0X2NvbmZpZygmb21hcDRfcGFuZGFfdHdsZGF0YSwgVFdMX0NPTU1PTl9QREFUQV9VU0IsCisJCQlUV0xfQ09NTU9OX1JFR1VMQVRPUl9WREFDIHwKKwkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZBVVgyIHwKKwkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZBVVgzIHwKKwkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZNTUMgfAorCQkJVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBQIHwKKwkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZBTkEgfAorCQkJVFdMX0NPTU1PTl9SRUdVTEFUT1JfVkNYSU8gfAorCQkJVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlVTQiB8CisJCQlUV0xfQ09NTU9OX1JFR1VMQVRPUl9DTEszMktHKTsKIAlvbWFwNF9wbWljX2luaXQoInR3bDYwMzAiLCAmb21hcDRfcGFuZGFfdHdsZGF0YSk7CiAJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDIsIDQwMCwgTlVMTCwgMCk7CiAJLyoKQEAgLTUyNiwxOSArMzk5LDE5IEBACiAJCQkgT01BUF9QSU5fT1VUUFVUIHwgT01BUF9NVVhfTU9ERTApLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsMl9kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsMl9kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkICAgICAgICAgICAgID0gMSwKIAkucGFkcyAgICAgICAgICAgPSBzZXJpYWwyX3BhZHMsCiAJLnBhZHNfY250ICAgICAgID0gQVJSQVlfU0laRShzZXJpYWwyX3BhZHMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsM19kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsM19kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkICAgICAgICAgICAgID0gMiwKIAkucGFkcyAgICAgICAgICAgPSBzZXJpYWwzX3BhZHMsCiAJLnBhZHNfY250ICAgICAgID0gQVJSQVlfU0laRShzZXJpYWwzX3BhZHMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsNF9kYXRhID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2RhdGEgc2VyaWFsNF9kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlkICAgICAgICAgICAgID0gMywKIAkucGFkcyAgICAgICAgICAgPSBzZXJpYWw0X3BhZHMsCiAJLnBhZHNfY250ICAgICAgID0gQVJSQVlfU0laRShzZXJpYWw0X3BhZHMpLApAQCAtNjg3LDcgKzU2MCw3IEBACiAKIAlpZiAob21hcF9yZXYoKSA9PSBPTUFQNDQzMF9SRVZfRVMxXzApCiAJCXBhY2thZ2UgPSBPTUFQX1BBQ0tBR0VfQ0JMOwotCW9tYXA0X211eF9pbml0KGJvYXJkX211eCwgcGFja2FnZSk7CisJb21hcDRfbXV4X2luaXQoYm9hcmRfbXV4LCBOVUxMLCBwYWNrYWdlKTsKIAogCWlmICh3bDEyeHhfc2V0X3BsYXRmb3JtX2RhdGEoJm9tYXBfcGFuZGFfd2xhbl9kYXRhKSkKIAkJcHJfZXJyKCJlcnJvciBzZXR0aW5nIHdsMTJ4eCBkYXRhXG4iKTsKQEAgLTcxNiw1ICs1ODksNSBAQAogCS5pbml0X2Vhcmx5CT0gb21hcDRfcGFuZGFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBnaWNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXA0X3BhbmRhX2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDRfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jCmluZGV4IDE1NTU5MTguLmYxZjE4ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW92ZXJvLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgpAQCAtNDUsNyArNDYsNiBAQAogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZ2VuZXJpYy1kcGkuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CkBAIC02NSw4ICs2NSw2IEBACiAjZGVmaW5lIE9WRVJPX0dQSU9fVVNCSF9DUEVOCTE2OAogI2RlZmluZSBPVkVST19HUElPX1VTQkhfTlJFU0VUCTE4MwogCi0jZGVmaW5lIE5BTkRfQkxPQ0tfU0laRSBTWl8xMjhLCi0KICNkZWZpbmUgT1ZFUk9fU01TQzkxMVhfQ1MgICAgICA1CiAjZGVmaW5lIE9WRVJPX1NNU0M5MTFYX0dQSU8gICAgMTc2CiAjZGVmaW5lIE9WRVJPX1NNU0M5MTFYMl9DUyAgICAgNApAQCAtNzYsMTUgKzc0LDE2IEBACiAJZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0Nl9NT0RVTEUpCiAKIC8qIGZpeGVkIHJlZ3VsYXRvciBmb3IgYWRzNzg0NiAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGFkczc4NDZfc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2Y2MiLCAic3BpMS4wIik7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgYWRzNzg0Nl9zdXBwbHlbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2Y2MiLCAic3BpMS4wIiksCit9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdmFkczc4NDZfcmVndWxhdG9yID0gewogCS5jb25zdHJhaW50cyA9IHsKIAkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJmFkczc4NDZfc3VwcGx5LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGFkczc4NDZfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBhZHM3ODQ2X3N1cHBseSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgdmFkczc4NDYgPSB7CkBAIC0yNjYsMTQgKzI2NSw2IEBACiAJLmRlZmF1bHRfZGV2aWNlCT0gJm92ZXJvX2R2aV9kZXZpY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb3Zlcm9fdmRkYV9kYWNfc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRhX2RhYyIsICJvbWFwZHNzX3ZlbmMiKTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG92ZXJvX3ZkZHNfZHNpX3N1cHBseVtdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3MiKSwKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RzaTEiKSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBvdmVyb19uYW5kX3BhcnRpdGlvbnNbXSA9IHsKIAl7CiAJCS5uYW1lICAgICAgICAgICA9ICJ4bG9hZGVyIiwKQEAgLTMyMSw4ICszMTIsOCBAQAogCXt9CS8qIFRlcm1pbmF0b3IgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBvdmVyb192bW1jMV9zdXBwbHkgPSB7Ci0JLnN1cHBseQkJCT0gInZtbWMiLAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG92ZXJvX3ZtbWMxX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4wIiksCiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfTEVEU19HUElPKSB8fCBkZWZpbmVkKENPTkZJR19MRURTX0dQSU9fTU9EVUxFKQpAQCAtNDE3LDggKzQwOCw2IEBACiB7CiAJb21hcDJfaHNtbWNfaW5pdChtbWMpOwogCi0Jb3Zlcm9fdm1tYzFfc3VwcGx5LmRldiA9IG1tY1swXS5kZXY7Ci0KICNpZiBkZWZpbmVkKENPTkZJR19MRURTX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0xFRFNfR1BJT19NT0RVTEUpCiAJLyogVFdMNDAzMF9HUElPX01BWCArIDEgPT0gbGVkQiwgUE1VX1NUQVQgKG91dCwgYWN0aXZlIGxvdyBMRUQpICovCiAJZ3Bpb19sZWRzWzJdLmdwaW8gPSBncGlvICsgVFdMNDAzMF9HUElPX01BWCArIDE7CkBAIC00MzUsMTAgKzQyNCw2IEBACiAJLnNldHVwCQk9IG92ZXJvX3R3bF9ncGlvX3NldHVwLAogfTsKIAotc3RhdGljIHN0cnVjdCB0d2w0MDMwX3VzYl9kYXRhIG92ZXJvX3VzYl9kYXRhID0gewotCS51c2JfbW9kZQk9IFQyX1VTQl9NT0RFX1VMUEksCi19OwotCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb3Zlcm9fdm1tYzEgPSB7CiAJLmNvbnN0cmFpbnRzID0gewogCQkubWluX3VWCQkJPSAxODUwMDAwLApAQCAtNDQ5LDU5ICs0MzQsMjMgQEAKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcwk9ICZvdmVyb192bW1jMV9zdXBwbHksCi19OwotCi0vKiBWREFDIGZvciBEU1MgZHJpdmluZyBTLVZpZGVvICg4IG1BIHVubG9hZGVkLCBtYXggNjUgbUEpICovCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb3Zlcm9fdmRhYyA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJm92ZXJvX3ZkZGFfZGFjX3N1cHBseSwKLX07Ci0KLS8qIFZQTEwyIGZvciBkaWdpdGFsIHZpZGVvIG91dHB1dHMgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBvdmVyb192cGxsMiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVkRWSSIsCi0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUob3Zlcm9fdmRkc19kc2lfc3VwcGx5KSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBvdmVyb192ZGRzX2RzaV9zdXBwbHksCi19OwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfYXVkaW9fZGF0YSBvdmVyb19hdWRpb19kYXRhOwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfZGF0YSBvdmVyb19jb2RlY19kYXRhID0gewotCS5hdWRpb19tY2xrID0gMjYwMDAwMDAsCi0JLmF1ZGlvID0gJm92ZXJvX2F1ZGlvX2RhdGEsCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUob3Zlcm9fdm1tYzFfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBvdmVyb192bW1jMV9zdXBwbHksCiB9OwogCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBvdmVyb190d2xkYXRhID0gewotCS5pcnFfYmFzZQk9IFRXTDQwMzBfSVJRX0JBU0UsCi0JLmlycV9lbmQJPSBUV0w0MDMwX0lSUV9FTkQsCiAJLmdwaW8JCT0gJm92ZXJvX2dwaW9fZGF0YSwKLQkudXNiCQk9ICZvdmVyb191c2JfZGF0YSwKLQkuY29kZWMJCT0gJm92ZXJvX2NvZGVjX2RhdGEsCiAJLnZtbWMxCQk9ICZvdmVyb192bW1jMSwKLQkudmRhYwkJPSAmb3Zlcm9fdmRhYywKLQkudnBsbDIJCT0gJm92ZXJvX3ZwbGwyLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgb3Zlcm9faTJjX2luaXQodm9pZCkKIHsKKwlvbWFwM19wbWljX2dldF9jb25maWcoJm92ZXJvX3R3bGRhdGEsCisJCQlUV0xfQ09NTU9OX1BEQVRBX1VTQiB8IFRXTF9DT01NT05fUERBVEFfQVVESU8sCisJCQlUV0xfQ09NTU9OX1JFR1VMQVRPUl9WREFDIHwgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBMTDIpOworCisJb3Zlcm9fdHdsZGF0YS52cGxsMi0+Y29uc3RyYWludHMubmFtZSA9ICJWRFZJIjsKKwogCW9tYXAzX3BtaWNfaW5pdCgidHBzNjU5NTAiLCAmb3Zlcm9fdHdsZGF0YSk7CiAJLyogaTJjMiBwaW5zIGFyZSB1c2VkIGZvciBncGlvICovCiAJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDMsIDQwMCwgTlVMTCwgMCk7CkBAIC02MTcsNyArNTY2LDcgQEAKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG92ZXJvX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb3Zlcm9faW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJtNjgwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJtNjgwLmMKaW5kZXggNDJkMTBiMS4uN2RmZWQyNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1ybTY4MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcm02ODAuYwpAQCAtNzksMjAgKzc5LDE0IEBACiAJLnB1bGxkb3ducwkJPSBCSVQoMSkgfCBCSVQoMikgfCBCSVQoOCkgfCBCSVQoMTUpLAogfTsKIAotc3RhdGljIHN0cnVjdCB0d2w0MDMwX3VzYl9kYXRhIHJtNjgwX3VzYl9kYXRhID0gewotCS51c2JfbW9kZQkJPSBUMl9VU0JfTU9ERV9VTFBJLAotfTsKLQogc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgcm02ODBfdHdsX2RhdGEgPSB7Ci0JLmlycV9iYXNlCQk9IFRXTDQwMzBfSVJRX0JBU0UsCi0JLmlycV9lbmQJCT0gVFdMNDAzMF9JUlFfRU5ELAogCS5ncGlvCQkJPSAmcm02ODBfZ3Bpb19kYXRhLAotCS51c2IJCQk9ICZybTY4MF91c2JfZGF0YSwKIAkvKiBhZGQgcmVzdCBvZiB0aGUgY2hpbGRyZW4gaGVyZSAqLwogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IHJtNjgwX2kyY19pbml0KHZvaWQpCiB7CisJb21hcDNfcG1pY19nZXRfY29uZmlnKCZybTY4MF90d2xfZGF0YSwgVFdMX0NPTU1PTl9QREFUQV9VU0IsIDApOwogCW9tYXBfcG1pY19pbml0KDEsIDI5MDAsICJ0d2w1MDMxIiwgSU5UXzM0WFhfU1lTX05JUlEsICZybTY4MF90d2xfZGF0YSk7CiAJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDIsIDQwMCwgTlVMTCwgMCk7CiAJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDMsIDQwMCwgTlVMTCwgMCk7CkBAIC0xNjMsNyArMTU3LDcgQEAKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IHJtNjgwX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IHJtNjgwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gcm02ODBfaW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCmluZGV4IGY2MjQ3ZTcuLmJkYjI0ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCkBAIC0yODgsMTAgKzI4OCw2IEBACiAJLnJlcAkJPSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCB0d2w0MDMwX21hZGNfcGxhdGZvcm1fZGF0YSByeDUxX21hZGNfZGF0YSA9IHsKLQkuaXJxX2xpbmUJCT0gMSwKLX07Ci0KIC8qIEVuYWJsZSBpbnB1dCBsb2dpYyBhbmQgcHVsbCBhbGwgbGluZXMgdXAgd2hlbiBlTU1DIGlzIG9uLiAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX211eCByeDUxX21tYzJfb25fbXV4W10gPSB7CiAJT01BUDNfTVVYKFNETU1DMl9DTUQsIE9NQVBfUElOX0lOUFVUX1BVTExVUCB8IE9NQVBfTVVYX01PREUwKSwKQEAgLTM1OCwxNCArMzU0LDE3IEBACiAJe30JLyogVGVybWluYXRvciAqLwogfTsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHJ4NTFfdm1tYzFfc3VwcGx5ID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgIm9tYXBfaHNtbWMuMCIpOworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHJ4NTFfdm1tYzFfc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjAiKSwKK307CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSByeDUxX3ZhdXgzX3N1cHBseSA9Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjEiKTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSByeDUxX3ZhdXgzX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4xIiksCit9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcng1MV92c2ltX3N1cHBseSA9Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tY19hdXgiLCAib21hcF9oc21tYy4xIik7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcng1MV92c2ltX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWNfYXV4IiwgIm9tYXBfaHNtbWMuMSIpLAorfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHJ4NTFfdm1tYzJfc3VwcGxpZXNbXSA9IHsKIAkvKiB0bHYzMjBhaWMzeCBhbmFsb2cgc3VwcGxpZXMgKi8KQEAgLTM5NSwxMCArMzk0LDYgQEAKIAlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQiLCAiMi0wMDYzIiksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcng1MV92ZGFjX3N1cHBseVtdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZGFfZGFjIiwgIm9tYXBkc3NfdmVuYyIpLAotfTsKLQogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHJ4NTFfdmF1eDEgPSB7CiAJLmNvbnN0cmFpbnRzID0gewogCQkubmFtZQkJCT0gIlYyOCIsCkBAIC00NTIsOCArNDQ3LDggQEAKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcwk9ICZyeDUxX3ZhdXgzX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShyeDUxX3ZhdXgzX3N1cHBseSksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gcng1MV92YXV4M19zdXBwbHksCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcng1MV92YXV4NCA9IHsKQEAgLTQ3OSw4ICs0NzQsOCBAQAogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gJnJ4NTFfdm1tYzFfc3VwcGx5LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHJ4NTFfdm1tYzFfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSByeDUxX3ZtbWMxX3N1cHBseSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSByeDUxX3ZtbWMyID0gewpAQCAtNDg4LDYgKzQ4Myw3IEBACiAJCS5uYW1lCQkJPSAiVjI4X0EiLAogCQkubWluX3VWCQkJPSAyODAwMDAwLAogCQkubWF4X3VWCQkJPSAzMDAwMDAwLAorCQkuYWx3YXlzX29uCQk9IHRydWUsIC8qIGR1ZSBWSU8gbGVhayB0byBBSUMzNCBWRERzICovCiAJCS5hcHBseV91VgkJPSB0cnVlLAogCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAogCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCkBAIC01MTAsMjMgKzUwNiw4IEBACiAJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcwk9ICZyeDUxX3ZzaW1fc3VwcGx5LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHJ4NTFfdmRhYyA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVkRBQyIsCi0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IHJ4NTFfdmRhY19zdXBwbHksCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUocng1MV92c2ltX3N1cHBseSksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gcng1MV92c2ltX3N1cHBseSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSByeDUxX3ZpbyA9IHsKQEAgLTU1Nyw3ICs1MzgsNyBAQAogCS5zdWJkZXZfYm9hcmRfaW5mbyA9ICZyeDUxX3NpNDcxM19ib2FyZF9pbmZvLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugcng1MV9zaTQ3MTNfZGV2IF9faW5pdGRhdGFfb3JfbW9kdWxlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugcng1MV9zaTQ3MTNfZGV2ID0gewogCS5uYW1lCT0gInJhZGlvLXNpNDcxMyIsCiAJLmlkCT0gLTEsCiAJLmRldgk9IHsKQEAgLTU4Miw3ICs1NjMsNyBAQAogewogCS8qIEZJWE1FIHRoaXMgZ3BpbyBzZXR1cCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIG5vdyAqLwogCWdwaW9fcmVxdWVzdF9vbmUoZ3BpbyArIDYsIEdQSU9GX09VVF9JTklUX0xPVywgImJhY2tsaWdodF9wd20iKTsKLQlncGlvX3JlcXVlc3Rfb25lKGdwaW8gKyA3LCBHUElPRl9PVVRfSU5JVF9ISUdILCAic3BlYWtlcl9lbiIpOworCWdwaW9fcmVxdWVzdF9vbmUoZ3BpbyArIDcsIEdQSU9GX09VVF9JTklUX0xPVywgInNwZWFrZXJfZW4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTk5LDEwICs1ODAsNiBAQAogCS5zZXR1cAkJCT0gcng1MV90d2xncGlvX3NldHVwLAogfTsKIAotc3RhdGljIHN0cnVjdCB0d2w0MDMwX3VzYl9kYXRhIHJ4NTFfdXNiX2RhdGEgPSB7Ci0JLnVzYl9tb2RlCQk9IFQyX1VTQl9NT0RFX1VMUEksCi19OwotCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfaW5zIHNsZWVwX29uX3NlcVtdIF9faW5pdGRhdGEgPSB7CiAvKgogICogVHVybiBvZmYgZXZlcnl0aGluZwpAQCAtNzc0LDE0ICs3NTEsOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgcng1MV90d2xkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmlycV9iYXNlCQk9IFRXTDQwMzBfSVJRX0JBU0UsCi0JLmlycV9lbmQJCT0gVFdMNDAzMF9JUlFfRU5ELAotCiAJLyogcGxhdGZvcm1fZGF0YSBmb3IgY2hpbGRyZW4gZ29lcyBoZXJlICovCiAJLmdwaW8JCQk9ICZyeDUxX2dwaW9fZGF0YSwKIAkua2V5cGFkCQkJPSAmcng1MV9rcF9kYXRhLAotCS5tYWRjCQkJPSAmcng1MV9tYWRjX2RhdGEsCi0JLnVzYgkJCT0gJnJ4NTFfdXNiX2RhdGEsCiAJLnBvd2VyCQkJPSAmcng1MV90MnNjcmlwdHNfZGF0YSwKIAkuY29kZWMJCQk9ICZyeDUxX2NvZGVjX2RhdGEsCiAKQEAgLTc5MCw3ICs3NjIsNiBAQAogCS52YXV4NAkJCT0gJnJ4NTFfdmF1eDQsCiAJLnZtbWMxCQkJPSAmcng1MV92bW1jMSwKIAkudnNpbQkJCT0gJnJ4NTFfdnNpbSwKLQkudmRhYwkJCT0gJnJ4NTFfdmRhYywKIAkudmlvCQkJPSAmcng1MV92aW8sCiB9OwogCkBAIC04NDYsNiArODE3LDEzIEBACiAJCXJ4NTFfdHdsZGF0YS52YXV4MyA9ICZyeDUxX3ZhdXgzX2NhbTsKIAl9CiAJcng1MV90d2xkYXRhLnZtbWMyID0gJnJ4NTFfdm1tYzI7CisJb21hcDNfcG1pY19nZXRfY29uZmlnKCZyeDUxX3R3bGRhdGEsCisJCQlUV0xfQ09NTU9OX1BEQVRBX1VTQiB8IFRXTF9DT01NT05fUERBVEFfTUFEQywKKwkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZEQUMpOworCisJcng1MV90d2xkYXRhLnZkYWMtPmNvbnN0cmFpbnRzLmFwcGx5X3VWID0gdHJ1ZTsKKwlyeDUxX3R3bGRhdGEudmRhYy0+Y29uc3RyYWludHMubmFtZSA9ICJWREFDIjsKKwogCW9tYXBfcG1pY19pbml0KDEsIDIyMDAsICJ0d2w1MDMwIiwgSU5UXzM0WFhfU1lTX05JUlEsICZyeDUxX3R3bGRhdGEpOwogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygyLCAxMDAsIHJ4NTFfcGVyaXBoZXJhbHNfaTJjX2JvYXJkX2luZm9fMiwKIAkJCSAgICAgIEFSUkFZX1NJWkUocng1MV9wZXJpcGhlcmFsc19pMmNfYm9hcmRfaW5mb18yKSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5jCmluZGV4IGZlYzRjYWMuLjVlYTE0MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkucmVzZXJ2ZQk9IHJ4NTFfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IHJ4NTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gcng1MV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9tYXBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IHJ4NTFfaW5pdCwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXRpODE2OGV2bS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC10aTgxNjhldm0uYwppbmRleCAwOWZhN2JmLi5hODVkNWIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXRpODE2OGV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtdGk4MTY4ZXZtLmMKQEAgLTMzLDExICszMyw2IEBACiAJb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhOVUxMLCBOVUxMKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHRpODE2OF9ldm1faW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwX2luaXRfaXJxKCk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCB0aTgxNjhfZXZtX2luaXQodm9pZCkKIHsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CkBAIC01Niw3ICs1MSw3IEBACiAJLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKIAkubWFwX2lvCQk9IHRpODE2OF9ldm1fbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gdGk4MTY4X2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gdGk4MTY4X2V2bV9pbml0X2lycSwKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCisJLmluaXRfaXJxCT0gdGk4MTZ4X2luaXRfaXJxLAorCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IHRpODE2OF9ldm1faW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20tZGlzcGxheS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLWRpc3BsYXkuYwppbmRleCBjN2M2YmViLi5kNDY4M2JhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20tZGlzcGxheS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS1kaXNwbGF5LmMKQEAgLTI2LDcgKzI2LDcgQEAKIAl7IExDRF9QQU5FTF9RVkdBX0dQSU8sCUdQSU9GX09VVF9JTklUX0hJR0gsICJsY2QgcXZnYSIJIH0sCiB9OwogCi1zdGF0aWMgdm9pZCB6b29tX2xjZF9wYW5lbF9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgem9vbV9sY2RfcGFuZWxfaW5pdCh2b2lkKQogewogCXpvb21fbGNkX2dwaW9zWzBdLmdwaW8gPSAob21hcF9yZXYoKSA+IE9NQVAzNDMwX1JFVl9FUzNfMCkgPwogCQkJTENEX1BBTkVMX1JFU0VUX0dQSU9fUFJPRCA6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20tcGVyaXBoZXJhbHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS1wZXJpcGhlcmFscy5jCmluZGV4IDExOGM2ZjUuLjEzYTY0NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS1wZXJpcGhlcmFscy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS1wZXJpcGhlcmFscy5jCkBAIC0xMDUsMjEgKzEwNSwyMCBAQAogCS5yZXAJCT0gMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB6b29tX3ZtbWMxX3N1cHBseSA9IHsKLQkuc3VwcGx5CQk9ICJ2bW1jIiwKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB6b29tX3ZtbWMxX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4wIiksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgem9vbV92c2ltX3N1cHBseSA9IHsKLQkuc3VwcGx5CQk9ICJ2bW1jX2F1eCIsCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgem9vbV92c2ltX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWNfYXV4IiwgIm9tYXBfaHNtbWMuMCIpLAogfTsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHpvb21fdm1tYzJfc3VwcGx5ID0gewotCS5zdXBwbHkJCT0gInZtbWMiLAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHpvb21fdm1tYzJfc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjEiKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB6b29tX3ZtbWMzX3N1cHBseSA9IHsKLQkuc3VwcGx5CQk9ICJ2bW1jIiwKLQkuZGV2X25hbWUJPSAib21hcF9oc21tYy4yIiwKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB6b29tX3ZtbWMzX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4yIiksCiB9OwogCiAvKiBWTU1DMSBmb3IgT01BUCBWRERfTU1DMSAoaS9vKSBhbmQgTU1DMSBjYXJkICovCkBAIC0xMzMsOCArMTMyLDggQEAKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgID0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgICAgICA9ICZ6b29tX3ZtbWMxX3N1cHBseSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzICA9IEFSUkFZX1NJWkUoem9vbV92bW1jMV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcyAgICAgID0gem9vbV92bW1jMV9zdXBwbHksCiB9OwogCiAvKiBWTU1DMiBmb3IgTU1DMiBjYXJkICovCkBAIC0xNDgsOCArMTQ3LDggQEAKIAkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyAgPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcyAgICAgID0gJnpvb21fdm1tYzJfc3VwcGx5LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgID0gQVJSQVlfU0laRSh6b29tX3ZtbWMyX3N1cHBseSksCisJLmNvbnN1bWVyX3N1cHBsaWVzICAgICAgPSB6b29tX3ZtbWMyX3N1cHBseSwKIH07CiAKIC8qIFZTSU0gZm9yIE9NQVAgVkREX01NQzFBIChpL28gZm9yIERBVDQuLkRBVDcpICovCkBAIC0xNjMsMTYgKzE2MiwxNiBAQAogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyAgPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcyAgICAgID0gJnpvb21fdnNpbV9zdXBwbHksCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyAgPSBBUlJBWV9TSVpFKHpvb21fdnNpbV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcyAgICAgID0gem9vbV92c2ltX3N1cHBseSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSB6b29tX3ZtbWMzID0gewogCS5jb25zdHJhaW50cyA9IHsKIAkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgPSAmem9vbV92bW1jM19zdXBwbHksCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUoem9vbV92bW1jM19zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IHpvb21fdm1tYzNfc3VwcGx5LAogfTsKIAogc3RhdGljIHN0cnVjdCBmaXhlZF92b2x0YWdlX2NvbmZpZyB6b29tX3Z3bGFuID0gewpAQCAtMjI3LDQwICsyMjYsNiBAQAogCXt9ICAgICAgLyogVGVybWluYXRvciAqLwogfTsKIAotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHpvb21fdnBsbDJfc3VwcGxpZXNbXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzIiksCi0JUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzc19kc2kxIiksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgem9vbV92ZGRhX2RhY19zdXBwbHkgPQotCVJFR1VMQVRPUl9TVVBQTFkoInZkZGFfZGFjIiwgIm9tYXBkc3NfdmVuYyIpOwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgem9vbV92cGxsMiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5taW5fdVYgICAgICAgICAgICAgICAgID0gMTgwMDAwMCwKLQkJLm1heF91ViAgICAgICAgICAgICAgICAgPSAxODAwMDAwLAotCQkudmFsaWRfbW9kZXNfbWFzayAgICAgICA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzayAgICAgICAgID0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCQk9IEFSUkFZX1NJWkUoem9vbV92cGxsMl9zdXBwbGllcyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCQk9IHpvb21fdnBsbDJfc3VwcGxpZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgem9vbV92ZGFjID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm1pbl91ViAgICAgICAgICAgICAgICAgPSAxODAwMDAwLAotCQkubWF4X3VWICAgICAgICAgICAgICAgICA9IDE4MDAwMDAsCi0JCS52YWxpZF9tb2Rlc19tYXNrICAgICAgID0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrICAgICAgICAgPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJCT0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJCT0gJnpvb21fdmRkYV9kYWNfc3VwcGx5LAotfTsKLQogc3RhdGljIGludCB6b29tX3R3bF9ncGlvX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJdW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbmdwaW8pCiB7CkBAIC0yNzAsMTMgKzIzNSw2IEBACiAJbW1jWzBdLmdwaW9fY2QgPSBncGlvICsgMDsKIAlvbWFwMl9oc21tY19pbml0KG1tYyk7CiAKLQkvKiBsaW5rIHJlZ3VsYXRvcnMgdG8gTU1DIGFkYXB0ZXJzIC4uLiB3ZSAia25vdyIgdGhlCi0JICogcmVndWxhdG9ycyB3aWxsIGJlIHNldCB1cCBvbmx5ICphZnRlciogd2UgcmV0dXJuLgotCSovCi0Jem9vbV92bW1jMV9zdXBwbHkuZGV2ID0gbW1jWzBdLmRldjsKLQl6b29tX3ZzaW1fc3VwcGx5LmRldiA9IG1tY1swXS5kZXY7Ci0Jem9vbV92bW1jMl9zdXBwbHkuZGV2ID0gbW1jWzFdLmRldjsKLQogCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoTENEX1BBTkVMX0VOQUJMRV9HUElPLCBHUElPRl9PVVRfSU5JVF9MT1csCiAJCQkgICAgICAgImxjZCBlbmFibGUiKTsKIAlpZiAocmV0KQpAQCAtMjkyLDI2ICsyNTAsNiBAQAogCWdwaW9fc2V0X3ZhbHVlKFpPT00yX0hFQURTRVRfRVhUTVVURV9HUElPLCBtdXRlKTsKIH0KIAotc3RhdGljIGludCB6b29tX2JhdHRfdGFibGVbXSA9IHsKLS8qIDAgQyovCi0zMDgwMCwgMjk1MDAsIDI4MzAwLCAyNzEwMCwKLTI2MDAwLCAyNDkwMCwgMjM5MDAsIDIyOTAwLCAyMjAwMCwgMjExMDAsIDIwMzAwLCAxOTQwMCwgMTg3MDAsIDE3OTAwLAotMTcyMDAsIDE2NTAwLCAxNTkwMCwgMTUzMDAsIDE0NzAwLCAxNDEwMCwgMTM2MDAsIDEzMTAwLCAxMjYwMCwgMTIxMDAsCi0xMTYwMCwgMTEyMDAsIDEwODAwLCAxMDQwMCwgMTAwMDAsIDk2MzAsICA5MjgwLCAgODk1MCwgIDg2MjAsICA4MzEwLAotODAyMCwgIDc3MzAsICA3NDYwLCAgNzIwMCwgIDY5NTAsICA2NzEwLCAgNjQ3MCwgIDYyNTAsICA2MDQwLCAgNTgzMCwKLTU2NDAsICA1NDUwLCAgNTI2MCwgIDUwOTAsICA0OTIwLCAgNDc2MCwgIDQ2MDAsICA0NDUwLCAgNDMxMCwgIDQxNzAsCi00MDQwLCAgMzkxMCwgIDM3OTAsICAzNjcwLCAgMzU1MAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX2JjaV9wbGF0Zm9ybV9kYXRhIHpvb21fYmNpX2RhdGEgPSB7Ci0JLmJhdHRlcnlfdG1wX3RibAk9IHpvb21fYmF0dF90YWJsZSwKLQkudGJsc2l6ZQkJPSBBUlJBWV9TSVpFKHpvb21fYmF0dF90YWJsZSksCi19OwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfdXNiX2RhdGEgem9vbV91c2JfZGF0YSA9IHsKLQkudXNiX21vZGUJPSBUMl9VU0JfTU9ERV9VTFBJLAotfTsKLQogc3RhdGljIHN0cnVjdCB0d2w0MDMwX2dwaW9fcGxhdGZvcm1fZGF0YSB6b29tX2dwaW9fZGF0YSA9IHsKIAkuZ3Bpb19iYXNlCT0gT01BUF9NQVhfR1BJT19MSU5FUywKIAkuaXJxX2Jhc2UJPSBUV0w0MDMwX0dQSU9fSVJRX0JBU0UsCkBAIC0zMTksNDEgKzI1NywyOSBAQAogCS5zZXR1cAkJPSB6b29tX3R3bF9ncGlvX3NldHVwLAogfTsKIAotc3RhdGljIHN0cnVjdCB0d2w0MDMwX21hZGNfcGxhdGZvcm1fZGF0YSB6b29tX21hZGNfZGF0YSA9IHsKLQkuaXJxX2xpbmUJPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX2NvZGVjX2F1ZGlvX2RhdGEgem9vbV9hdWRpb19kYXRhOwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfZGF0YSB6b29tX2NvZGVjX2RhdGEgPSB7Ci0JLmF1ZGlvX21jbGsgPSAyNjAwMDAwMCwKLQkuYXVkaW8gPSAmem9vbV9hdWRpb19kYXRhLAotfTsKLQogc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgem9vbV90d2xkYXRhID0gewotCS5pcnFfYmFzZQk9IFRXTDQwMzBfSVJRX0JBU0UsCi0JLmlycV9lbmQJPSBUV0w0MDMwX0lSUV9FTkQsCi0KIAkvKiBwbGF0Zm9ybV9kYXRhIGZvciBjaGlsZHJlbiBnb2VzIGhlcmUgKi8KLQkuYmNpCQk9ICZ6b29tX2JjaV9kYXRhLAotCS5tYWRjCQk9ICZ6b29tX21hZGNfZGF0YSwKLQkudXNiCQk9ICZ6b29tX3VzYl9kYXRhLAogCS5ncGlvCQk9ICZ6b29tX2dwaW9fZGF0YSwKIAkua2V5cGFkCQk9ICZ6b29tX2twX3R3bDQwMzBfZGF0YSwKLQkuY29kZWMJCT0gJnpvb21fY29kZWNfZGF0YSwKIAkudm1tYzEgICAgICAgICAgPSAmem9vbV92bW1jMSwKIAkudm1tYzIgICAgICAgICAgPSAmem9vbV92bW1jMiwKIAkudnNpbSAgICAgICAgICAgPSAmem9vbV92c2ltLAotCS52cGxsMgkJPSAmem9vbV92cGxsMiwKLQkudmRhYwkJPSAmem9vbV92ZGFjLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgb21hcF9pMmNfaW5pdCh2b2lkKQogeworCW9tYXAzX3BtaWNfZ2V0X2NvbmZpZygmem9vbV90d2xkYXRhLAorCQkJVFdMX0NPTU1PTl9QREFUQV9VU0IgfCBUV0xfQ09NTU9OX1BEQVRBX0JDSSB8CisJCQlUV0xfQ09NTU9OX1BEQVRBX01BREMgfCBUV0xfQ09NTU9OX1BEQVRBX0FVRElPLAorCQkJVFdMX0NPTU1PTl9SRUdVTEFUT1JfVkRBQyB8IFRXTF9DT01NT05fUkVHVUxBVE9SX1ZQTEwyKTsKKwogCWlmIChtYWNoaW5lX2lzX29tYXBfem9vbTIoKSkgewotCQl6b29tX2F1ZGlvX2RhdGEucmFtcF9kZWxheV92YWx1ZSA9IDM7CS8qIDE2MSBtcyAqLwotCQl6b29tX2F1ZGlvX2RhdGEuaHNfZXh0bXV0ZSA9IDE7Ci0JCXpvb21fYXVkaW9fZGF0YS5zZXRfaHNfZXh0bXV0ZSA9IHpvb20yX3NldF9oc19leHRtdXRlOworCQlzdHJ1Y3QgdHdsNDAzMF9jb2RlY19hdWRpb19kYXRhICphdWRpb19kYXRhOworCQlhdWRpb19kYXRhID0gem9vbV90d2xkYXRhLmNvZGVjLT5hdWRpbzsKKworCQlhdWRpb19kYXRhLT5yYW1wX2RlbGF5X3ZhbHVlID0gMzsJLyogMTYxIG1zICovCisJCWF1ZGlvX2RhdGEtPmhzX2V4dG11dGUgPSAxOworCQlhdWRpb19kYXRhLT5zZXRfaHNfZXh0bXV0ZSA9IHpvb20yX3NldF9oc19leHRtdXRlOwogCX0KIAlvbWFwX3BtaWNfaW5pdCgxLCAyNDAwLCAidHdsNTAzMCIsIElOVF8zNFhYX1NZU19OSVJRLCAmem9vbV90d2xkYXRhKTsKIAlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMiwgNDAwLCBOVUxMLCAwKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLmMKaW5kZXggNGIxMzNkNy4uOGE5OGMzYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLmMKQEAgLTEzNyw5ICsxMzcsOSBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb21hcF96b29tX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF96b29tX2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKE9NQVBfWk9PTTMsICJPTUFQIFpvb20zIGJvYXJkIikKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb21hcF96b29tX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF96b29tX2luaXQsCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4LmgKaW5kZXggNmJlMTA5NS4uN2NlYjg3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHguaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrNDR4eC5oCkBAIC04LDEzICs4LDYgQEAKICNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX09NQVAyX0NMT0NLNDRYWF9ICiAjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9DTE9DSzQ0WFhfSAogCi0vKgotICogWFhYIE1pc3NpbmcgdmFsdWVzIGZvciB0aGUgT01BUDQgRFBMTF9VU0IKLSAqIFhYWCBNaXNzaW5nIG1pbl9tdWx0aXBsaWVyIHZhbHVlcyBmb3IgYWxsIE9NQVA0IERQTExzCi0gKi8KLSNkZWZpbmUgT01BUDQ0MzBfTUFYX0RQTExfTVVMVAkyMDQ3Ci0jZGVmaW5lIE9NQVA0NDMwX01BWF9EUExMX0RJVgkxMjgKLQogaW50IG9tYXA0eHh4X2Nsa19pbml0KHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4X2RhdGEuYwppbmRleCA4Yzk2NTY3Li4wNDRkZjM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrNDR4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHhfZGF0YS5jCkBAIC01Myw5ICs1Myw5IEBACiBzdGF0aWMgc3RydWN0IGNsayBwYWRfY2xrc19jayA9IHsKIAkubmFtZQkJPSAicGFkX2Nsa3NfY2siLAogCS5yYXRlCQk9IDEyMDAwMDAwLAotCS5vcHMgICAgICAgICAgICA9ICZjbGtvcHNfb21hcDJfZGZsdCwKLQkuZW5hYmxlX3JlZyAgICAgPSBPTUFQNDQzMF9DTV9DTEtTRUxfQUJFLAotCS5lbmFibGVfYml0ICAgICA9IE9NQVA0NDMwX1BBRF9DTEtTX0dBVEVfU0hJRlQsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9DTEtTRUxfQUJFLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfUEFEX0NMS1NfR0FURV9TSElGVCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHBhZF9zbGltYnVzX2NvcmVfY2xrc19jayA9IHsKQEAgLTczLDkgKzczLDkgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHNsaW1idXNfY2xrID0gewogCS5uYW1lCQk9ICJzbGltYnVzX2NsayIsCiAJLnJhdGUJCT0gMTIwMDAwMDAsCi0JLm9wcyAgICAgICAgICAgID0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5lbmFibGVfcmVnICAgICA9IE9NQVA0NDMwX0NNX0NMS1NFTF9BQkUsCi0JLmVuYWJsZV9iaXQgICAgID0gT01BUDQ0MzBfU0xJTUJVU19DTEtfR0FURV9TSElGVCwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0NMS1NFTF9BQkUsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9TTElNQlVTX0NMS19HQVRFX1NISUZULAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgc3lzXzMya19jayA9IHsKQEAgLTI1OCw4ICsyNTgsOCBAQAogCS5lbmFibGVfbWFzawk9IE9NQVA0NDMwX0RQTExfRU5fTUFTSywKIAkuYXV0b2lkbGVfbWFzawk9IE9NQVA0NDMwX0FVVE9fRFBMTF9NT0RFX01BU0ssCiAJLmlkbGVzdF9tYXNrCT0gT01BUDQ0MzBfU1RfRFBMTF9DTEtfTUFTSywKLQkubWF4X211bHRpcGxpZXIJPSBPTUFQNDQzMF9NQVhfRFBMTF9NVUxULAotCS5tYXhfZGl2aWRlcgk9IE9NQVA0NDMwX01BWF9EUExMX0RJViwKKwkubWF4X211bHRpcGxpZXIJPSAyMDQ3LAorCS5tYXhfZGl2aWRlcgk9IDEyOCwKIAkubWluX2RpdmlkZXIJPSAxLAogfTsKIApAQCAtMjc4LDEwICsyNzgsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGxfYWJlX3gyX2NrID0gewogCS5uYW1lCQk9ICJkcGxsX2FiZV94Ml9jayIsCiAJLnBhcmVudAkJPSAmZHBsbF9hYmVfY2ssCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTJfRFBMTF9BQkUsCiAJLmZsYWdzCQk9IENMT0NLX0NMS09VVFgyLAogCS5vcHMJCT0gJmNsa29wc19vbWFwNF9kcGxsbXhfb3BzLAogCS5yZWNhbGMJCT0gJm9tYXAzX2Nsa291dHgyX3JlY2FsYywKLQkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0RJVl9NMl9EUExMX0FCRSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2MzFfMXRvMzFfcmF0ZXNbXSA9IHsKQEAgLTQzNCw4ICs0MzQsOCBAQAogCS5lbmFibGVfbWFzawk9IE9NQVA0NDMwX0RQTExfRU5fTUFTSywKIAkuYXV0b2lkbGVfbWFzawk9IE9NQVA0NDMwX0FVVE9fRFBMTF9NT0RFX01BU0ssCiAJLmlkbGVzdF9tYXNrCT0gT01BUDQ0MzBfU1RfRFBMTF9DTEtfTUFTSywKLQkubWF4X211bHRpcGxpZXIJPSBPTUFQNDQzMF9NQVhfRFBMTF9NVUxULAotCS5tYXhfZGl2aWRlcgk9IE9NQVA0NDMwX01BWF9EUExMX0RJViwKKwkubWF4X211bHRpcGxpZXIJPSAyMDQ3LAorCS5tYXhfZGl2aWRlcgk9IDEyOCwKIAkubWluX2RpdmlkZXIJPSAxLAogfTsKIApAQCAtNjIyLDExICs2MjIsMTEgQEAKIAkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0RJVl9NM19EUExMX0NPUkUsCiAJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfRFBMTF9DTEtPVVRISUZfRElWX01BU0ssCiAJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTNfRFBMTF9DT1JFLAotCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfRFBMTF9DTEtPVVRISUZfR0FURV9DVFJMX1NISUZULAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiAJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCiAJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0RJVl9NM19EUExMX0NPUkUsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9EUExMX0NMS09VVEhJRl9HQVRFX0NUUkxfU0hJRlQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBkcGxsX2NvcmVfbTd4Ml9jayA9IHsKQEAgLTY3Miw4ICs2NzIsOCBAQAogCS5lbmFibGVfbWFzawk9IE9NQVA0NDMwX0RQTExfRU5fTUFTSywKIAkuYXV0b2lkbGVfbWFzawk9IE9NQVA0NDMwX0FVVE9fRFBMTF9NT0RFX01BU0ssCiAJLmlkbGVzdF9tYXNrCT0gT01BUDQ0MzBfU1RfRFBMTF9DTEtfTUFTSywKLQkubWF4X211bHRpcGxpZXIJPSBPTUFQNDQzMF9NQVhfRFBMTF9NVUxULAotCS5tYXhfZGl2aWRlcgk9IE9NQVA0NDMwX01BWF9EUExMX0RJViwKKwkubWF4X211bHRpcGxpZXIJPSAyMDQ3LAorCS5tYXhfZGl2aWRlcgk9IDEyOCwKIAkubWluX2RpdmlkZXIJPSAxLAogfTsKIApAQCAtNzQwLDggKzc0MCw4IEBACiAJLmVuYWJsZV9tYXNrCT0gT01BUDQ0MzBfRFBMTF9FTl9NQVNLLAogCS5hdXRvaWRsZV9tYXNrCT0gT01BUDQ0MzBfQVVUT19EUExMX01PREVfTUFTSywKIAkuaWRsZXN0X21hc2sJPSBPTUFQNDQzMF9TVF9EUExMX0NMS19NQVNLLAotCS5tYXhfbXVsdGlwbGllcgk9IE9NQVA0NDMwX01BWF9EUExMX01VTFQsCi0JLm1heF9kaXZpZGVyCT0gT01BUDQ0MzBfTUFYX0RQTExfRElWLAorCS5tYXhfbXVsdGlwbGllcgk9IDIwNDcsCisJLm1heF9kaXZpZGVyCT0gMTI4LAogCS5taW5fZGl2aWRlcgk9IDEsCiB9OwogCkBAIC04MTMsOCArODEzLDggQEAKIAkuZW5hYmxlX21hc2sJPSBPTUFQNDQzMF9EUExMX0VOX01BU0ssCiAJLmF1dG9pZGxlX21hc2sJPSBPTUFQNDQzMF9BVVRPX0RQTExfTU9ERV9NQVNLLAogCS5pZGxlc3RfbWFzawk9IE9NQVA0NDMwX1NUX0RQTExfQ0xLX01BU0ssCi0JLm1heF9tdWx0aXBsaWVyCT0gT01BUDQ0MzBfTUFYX0RQTExfTVVMVCwKLQkubWF4X2RpdmlkZXIJPSBPTUFQNDQzMF9NQVhfRFBMTF9ESVYsCisJLm1heF9tdWx0aXBsaWVyCT0gMjA0NywKKwkubWF4X2RpdmlkZXIJPSAxMjgsCiAJLm1pbl9kaXZpZGVyCT0gMSwKIH07CiAKQEAgLTg1MCwxMCArODUwLDEwIEBACiBzdGF0aWMgc3RydWN0IGNsayBkcGxsX3Blcl94Ml9jayA9IHsKIAkubmFtZQkJPSAiZHBsbF9wZXJfeDJfY2siLAogCS5wYXJlbnQJCT0gJmRwbGxfcGVyX2NrLAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fRElWX00yX0RQTExfUEVSLAogCS5mbGFncwkJPSBDTE9DS19DTEtPVVRYMiwKIAkub3BzCQk9ICZjbGtvcHNfb21hcDRfZHBsbG14X29wcywKIAkucmVjYWxjCQk9ICZvbWFwM19jbGtvdXR4Ml9yZWNhbGMsCi0JLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTJfRFBMTF9QRVIsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBkcGxsX3Blcl9tMngyX2RpdltdID0gewpAQCAtODgwLDExICs4ODAsMTEgQEAKIAkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0RJVl9NM19EUExMX1BFUiwKIAkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9EUExMX0NMS09VVEhJRl9ESVZfTUFTSywKIAkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKLQkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0RJVl9NM19EUExMX1BFUiwKLQkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX0RQTExfQ0xLT1VUSElGX0dBVEVfQ1RSTF9TSElGVCwKIAkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAogCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAogCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTNfRFBMTF9QRVIsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9EUExMX0NMS09VVEhJRl9HQVRFX0NUUkxfU0hJRlQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBkcGxsX3Blcl9tNHgyX2NrID0gewpAQCAtOTM1LDYzICs5MzUsNiBAQAogCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUsCiB9OwogCi0vKiBEUExMX1VOSVBSTyAqLwotc3RhdGljIHN0cnVjdCBkcGxsX2RhdGEgZHBsbF91bmlwcm9fZGQgPSB7Ci0JLm11bHRfZGl2MV9yZWcJPSBPTUFQNDQzMF9DTV9DTEtTRUxfRFBMTF9VTklQUk8sCi0JLmNsa19ieXBhc3MJPSAmc3lzX2Nsa2luX2NrLAotCS5jbGtfcmVmCT0gJnN5c19jbGtpbl9jaywKLQkuY29udHJvbF9yZWcJPSBPTUFQNDQzMF9DTV9DTEtNT0RFX0RQTExfVU5JUFJPLAotCS5tb2RlcwkJPSAoMSA8PCBEUExMX0xPV19QT1dFUl9CWVBBU1MpIHwgKDEgPDwgRFBMTF9MT0NLRUQpLAotCS5hdXRvaWRsZV9yZWcJPSBPTUFQNDQzMF9DTV9BVVRPSURMRV9EUExMX1VOSVBSTywKLQkuaWRsZXN0X3JlZwk9IE9NQVA0NDMwX0NNX0lETEVTVF9EUExMX1VOSVBSTywKLQkubXVsdF9tYXNrCT0gT01BUDQ0MzBfRFBMTF9NVUxUX01BU0ssCi0JLmRpdjFfbWFzawk9IE9NQVA0NDMwX0RQTExfRElWX01BU0ssCi0JLmVuYWJsZV9tYXNrCT0gT01BUDQ0MzBfRFBMTF9FTl9NQVNLLAotCS5hdXRvaWRsZV9tYXNrCT0gT01BUDQ0MzBfQVVUT19EUExMX01PREVfTUFTSywKLQkuaWRsZXN0X21hc2sJPSBPTUFQNDQzMF9TVF9EUExMX0NMS19NQVNLLAotCS5zZGRpdl9tYXNrCT0gT01BUDQ0MzBfRFBMTF9TRF9ESVZfTUFTSywKLQkubWF4X211bHRpcGxpZXIJPSBPTUFQNDQzMF9NQVhfRFBMTF9NVUxULAotCS5tYXhfZGl2aWRlcgk9IE9NQVA0NDMwX01BWF9EUExMX0RJViwKLQkubWluX2RpdmlkZXIJPSAxLAotfTsKLQotCi1zdGF0aWMgc3RydWN0IGNsayBkcGxsX3VuaXByb19jayA9IHsKLQkubmFtZQkJPSAiZHBsbF91bmlwcm9fY2siLAotCS5wYXJlbnQJCT0gJnN5c19jbGtpbl9jaywKLQkuZHBsbF9kYXRhCT0gJmRwbGxfdW5pcHJvX2RkLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2RwbGxfcGFyZW50LAotCS5vcHMJCT0gJmNsa29wc19vbWFwM19ub25jb3JlX2RwbGxfb3BzLAotCS5yZWNhbGMJCT0gJm9tYXAzX2RwbGxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2RwbGxfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUJPSAmb21hcDNfbm9uY29yZV9kcGxsX3NldF9yYXRlLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHBsbF91bmlwcm9feDJfY2sgPSB7Ci0JLm5hbWUJCT0gImRwbGxfdW5pcHJvX3gyX2NrIiwKLQkucGFyZW50CQk9ICZkcGxsX3VuaXByb19jaywKLQkuZmxhZ3MJCT0gQ0xPQ0tfQ0xLT1VUWDIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnJlY2FsYwkJPSAmb21hcDNfY2xrb3V0eDJfcmVjYWxjLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZHBsbF91bmlwcm9fbTJ4Ml9kaXZbXSA9IHsKLQl7IC5wYXJlbnQgPSAmZHBsbF91bmlwcm9feDJfY2ssIC5yYXRlcyA9IGRpdjMxXzF0bzMxX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHBsbF91bmlwcm9fbTJ4Ml9jayA9IHsKLQkubmFtZQkJPSAiZHBsbF91bmlwcm9fbTJ4Ml9jayIsCi0JLnBhcmVudAkJPSAmZHBsbF91bmlwcm9feDJfY2ssCi0JLmNsa3NlbAkJPSBkcGxsX3VuaXByb19tMngyX2RpdiwKLQkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0RJVl9NMl9EUExMX1VOSVBSTywKLQkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9EUExMX0NMS09VVF9ESVZfTUFTSywKLQkub3BzCQk9ICZjbGtvcHNfb21hcDRfZHBsbG14X29wcywKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUsCi19OwotCiBzdGF0aWMgc3RydWN0IGNsayB1c2JfaHNfY2xrX2Rpdl9jayA9IHsKIAkubmFtZQkJPSAidXNiX2hzX2Nsa19kaXZfY2siLAogCS5wYXJlbnQJCT0gJmRwbGxfYWJlX20zeDJfY2ssCkBAIC0xMDE1LDggKzk1OCw5IEBACiAJLmVuYWJsZV9tYXNrCT0gT01BUDQ0MzBfRFBMTF9FTl9NQVNLLAogCS5hdXRvaWRsZV9tYXNrCT0gT01BUDQ0MzBfQVVUT19EUExMX01PREVfTUFTSywKIAkuaWRsZXN0X21hc2sJPSBPTUFQNDQzMF9TVF9EUExMX0NMS19NQVNLLAotCS5tYXhfbXVsdGlwbGllcgk9IE9NQVA0NDMwX01BWF9EUExMX01VTFQsCi0JLm1heF9kaXZpZGVyCT0gT01BUDQ0MzBfTUFYX0RQTExfRElWLAorCS5zZGRpdl9tYXNrCT0gT01BUDQ0MzBfRFBMTF9TRF9ESVZfTUFTSywKKwkubWF4X211bHRpcGxpZXIJPSA0MDk1LAorCS5tYXhfZGl2aWRlcgk9IDI1NiwKIAkubWluX2RpdmlkZXIJPSAxLAogfTsKIApAQCAtMTAzNSw4ICs5NzksOCBAQAogc3RhdGljIHN0cnVjdCBjbGsgZHBsbF91c2JfY2xrZGNvbGRvX2NrID0gewogCS5uYW1lCQk9ICJkcGxsX3VzYl9jbGtkY29sZG9fY2siLAogCS5wYXJlbnQJCT0gJmRwbGxfdXNiX2NrLAotCS5vcHMJCT0gJmNsa29wc19vbWFwNF9kcGxsbXhfb3BzLAogCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLRENPTERPX0RQTExfVVNCLAorCS5vcHMJCT0gJmNsa29wc19vbWFwNF9kcGxsbXhfb3BzLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xMTY5LDE5ICsxMTEzLDYgQEAKIAkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgaHNtbWM2X2ZjbGtfc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmZ1bmNfNjRtX2ZjbGssIC5yYXRlcyA9IGRpdl8xXzBfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmZnVuY185Nm1fZmNsaywgLnJhdGVzID0gZGl2XzFfMV9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGhzbW1jNl9mY2xrID0gewotCS5uYW1lCQk9ICJoc21tYzZfZmNsayIsCi0JLnBhcmVudAkJPSAmZnVuY182NG1fZmNsaywKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkaXYyXzF0bzhfcmF0ZXNbXSA9IHsKIAl7IC5kaXYgPSAxLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCiAJeyAuZGl2ID0gOCwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LApAQCAtMTI2NCw2ICsxMTk1LDIxIEBACiAJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrIG9jcF9hYmVfaWNsayA9IHsKKwkubmFtZQkJPSAib2NwX2FiZV9pY2xrIiwKKwkucGFyZW50CQk9ICZhZXNzX2ZjbGssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcl9hYmVfMjRtX2ZjbGsgPSB7CisJLm5hbWUJCT0gInBlcl9hYmVfMjRtX2ZjbGsiLAorCS5wYXJlbnQJCT0gJmRwbGxfYWJlX20yX2NrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5maXhlZF9kaXYJPSA0LAorCS5yZWNhbGMJCT0gJm9tYXBfZml4ZWRfZGl2aXNvcl9yZWNhbGMsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBwZXJfYWJlX25jX2ZjbGtfZGl2W10gPSB7CiAJeyAucGFyZW50ID0gJmRwbGxfYWJlX20yX2NrLCAucmF0ZXMgPSBkaXYyXzF0bzJfcmF0ZXMgfSwKIAl7IC5wYXJlbnQgPSBOVUxMIH0sCkBAIC0xMjgxLDQxICsxMjI3LDYgQEAKIAkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgbWNhc3AyX2ZjbGtfc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmZ1bmNfOTZtX2ZjbGssIC5yYXRlcyA9IGRpdl8xXzBfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmcGVyX2FiZV9uY19mY2xrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWNhc3AyX2ZjbGsgPSB7Ci0JLm5hbWUJCT0gIm1jYXNwMl9mY2xrIiwKLQkucGFyZW50CQk9ICZmdW5jXzk2bV9mY2xrLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtY2FzcDNfZmNsayA9IHsKLQkubmFtZQkJPSAibWNhc3AzX2ZjbGsiLAotCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2ZjbGssCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG9jcF9hYmVfaWNsayA9IHsKLQkubmFtZQkJPSAib2NwX2FiZV9pY2xrIiwKLQkucGFyZW50CQk9ICZhZXNzX2ZjbGssCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHBlcl9hYmVfMjRtX2ZjbGsgPSB7Ci0JLm5hbWUJCT0gInBlcl9hYmVfMjRtX2ZjbGsiLAotCS5wYXJlbnQJCT0gJmRwbGxfYWJlX20yX2NrLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5maXhlZF9kaXYJPSA0LAotCS5yZWNhbGMJCT0gJm9tYXBfZml4ZWRfZGl2aXNvcl9yZWNhbGMsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBwbWRfc3RtX2Nsb2NrX211eF9zZWxbXSA9IHsKIAl7IC5wYXJlbnQgPSAmc3lzX2Nsa2luX2NrLCAucmF0ZXMgPSBkaXZfMV8wX3JhdGVzIH0sCiAJeyAucGFyZW50ID0gJmRwbGxfY29yZV9tNngyX2NrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCkBAIC0xODQ2LDggKzE3NTcsOCBAQAogCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAogCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDNJTlNUUl9MM19JTlNUUl9DTEtDVFJMLAogCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9IV0NUUkwsCi0JLmNsa2RtX25hbWUJPSAibDNfaW5zdHJfY2xrZG0iLAogCS5mbGFncwkJPSBFTkFCTEVfT05fSU5JVCwKKwkuY2xrZG1fbmFtZQk9ICJsM19pbnN0cl9jbGtkbSIsCiAJLnBhcmVudAkJPSAmbDNfZGl2X2NrLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwpAQCAtMTg1Nyw4ICsxNzY4LDggQEAKIAkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKIAkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0wzSU5TVFJfTDNfM19DTEtDVFJMLAogCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9IV0NUUkwsCi0JLmNsa2RtX25hbWUJPSAibDNfaW5zdHJfY2xrZG0iLAogCS5mbGFncwkJPSBFTkFCTEVfT05fSU5JVCwKKwkuY2xrZG1fbmFtZQk9ICJsM19pbnN0cl9jbGtkbSIsCiAJLnBhcmVudAkJPSAmbDNfZGl2X2NrLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwpAQCAtMTk5NSwxMCArMTkwNiwxNiBAQAogCS5jbGtkbV9uYW1lCT0gImFiZV9jbGtkbSIsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBtY2JzcDRfc3luY19tdXhfc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmZ1bmNfOTZtX2ZjbGssIC5yYXRlcyA9IGRpdl8xXzBfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmcGVyX2FiZV9uY19mY2xrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKwogc3RhdGljIHN0cnVjdCBjbGsgbWNic3A0X3N5bmNfbXV4X2NrID0gewogCS5uYW1lCQk9ICJtY2JzcDRfc3luY19tdXhfY2siLAogCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2ZjbGssCi0JLmNsa3NlbAkJPSBtY2FzcDJfZmNsa19zZWwsCisJLmNsa3NlbAkJPSBtY2JzcDRfc3luY19tdXhfc2VsLAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCiAJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9MNFBFUl9NQ0JTUDRfQ0xLQ1RSTCwKIAkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfSU5URVJOQUxfU09VUkNFX01BU0ssCkBAIC0yMDc3LDExICsxOTk0LDE3IEBACiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGhzbW1jMV9mY2xrX3NlbFtdID0geworCXsgLnBhcmVudCA9ICZmdW5jXzY0bV9mY2xrLCAucmF0ZXMgPSBkaXZfMV8wX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJmZ1bmNfOTZtX2ZjbGssIC5yYXRlcyA9IGRpdl8xXzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCiAvKiBNZXJnZWQgaHNtbWMxX2ZjbGsgaW50byBtbWMxICovCiBzdGF0aWMgc3RydWN0IGNsayBtbWMxX2ZjayA9IHsKIAkubmFtZQkJPSAibW1jMV9mY2siLAogCS5wYXJlbnQJCT0gJmZ1bmNfNjRtX2ZjbGssCi0JLmNsa3NlbAkJPSBoc21tYzZfZmNsa19zZWwsCisJLmNsa3NlbAkJPSBoc21tYzFfZmNsa19zZWwsCiAJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKIAkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0wzSU5JVF9NTUMxX0NMS0NUUkwsCiAJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX01BU0ssCkBAIC0yMDk2LDcgKzIwMTksNyBAQAogc3RhdGljIHN0cnVjdCBjbGsgbW1jMl9mY2sgPSB7CiAJLm5hbWUJCT0gIm1tYzJfZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzY0bV9mY2xrLAotCS5jbGtzZWwJCT0gaHNtbWM2X2ZjbGtfc2VsLAorCS5jbGtzZWwJCT0gaHNtbWMxX2ZjbGtfc2VsLAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCiAJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9MM0lOSVRfTU1DMl9DTEtDVFJMLAogCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9NQVNLLApAQCAtMjE2Miw4ICsyMDg1LDggQEAKIAkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKIAkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0wzSU5TVFJfT0NQX1dQMV9DTEtDVFJMLAogCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9IV0NUUkwsCi0JLmNsa2RtX25hbWUJPSAibDNfaW5zdHJfY2xrZG0iLAogCS5mbGFncwkJPSBFTkFCTEVfT05fSU5JVCwKKwkuY2xrZG1fbmFtZQk9ICJsM19pbnN0cl9jbGtkbSIsCiAJLnBhcmVudAkJPSAmbDNfZGl2X2NrLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwpAQCAtMjg5NSw2ICsyODE4LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVA0X1NDUk1fQVVYQ0xLMiwKIAkuZW5hYmxlX2JpdAk9IE9NQVA0X0VOQUJMRV9TSElGVCwKIH07CisKIHN0YXRpYyBzdHJ1Y3QgY2xrIGF1eGNsazNfY2sgPSB7CiAJLm5hbWUJCT0gImF1eGNsazNfY2siLAogCS5wYXJlbnQJCT0gJnN5c19jbGtpbl9jaywKQEAgLTMwNzcsOSArMzAwMSw2IEBACiAJQ0xLKE5VTEwsCSJkcGxsX3Blcl9tNXgyX2NrIiwJCSZkcGxsX3Blcl9tNXgyX2NrLAlDS180NDNYKSwKIAlDTEsoTlVMTCwJImRwbGxfcGVyX202eDJfY2siLAkJJmRwbGxfcGVyX202eDJfY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkiZHBsbF9wZXJfbTd4Ml9jayIsCQkmZHBsbF9wZXJfbTd4Ml9jaywJQ0tfNDQzWCksCi0JQ0xLKE5VTEwsCSJkcGxsX3VuaXByb19jayIsCQkmZHBsbF91bmlwcm9fY2ssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkiZHBsbF91bmlwcm9feDJfY2siLAkJJmRwbGxfdW5pcHJvX3gyX2NrLAlDS180NDNYKSwKLQlDTEsoTlVMTCwJImRwbGxfdW5pcHJvX20yeDJfY2siLAkJJmRwbGxfdW5pcHJvX20yeDJfY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkidXNiX2hzX2Nsa19kaXZfY2siLAkJJnVzYl9oc19jbGtfZGl2X2NrLAlDS180NDNYKSwKIAlDTEsoTlVMTCwJImRwbGxfdXNiX2NrIiwJCQkmZHBsbF91c2JfY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkiZHBsbF91c2JfY2xrZGNvbGRvX2NrIiwJJmRwbGxfdXNiX2Nsa2Rjb2xkb19jaywJQ0tfNDQzWCksCkBAIC0zMDkyLDE3ICszMDEzLDE0IEBACiAJQ0xLKE5VTEwsCSJmdW5jXzQ4bWNfZmNsayIsCQkmZnVuY180OG1jX2ZjbGssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkiZnVuY182NG1fZmNsayIsCQkmZnVuY182NG1fZmNsaywJQ0tfNDQzWCksCiAJQ0xLKE5VTEwsCSJmdW5jXzk2bV9mY2xrIiwJCSZmdW5jXzk2bV9mY2xrLAlDS180NDNYKSwKLQlDTEsoTlVMTCwJImhzbW1jNl9mY2xrIiwJCQkmaHNtbWM2X2ZjbGssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkiaW5pdF82MG1fZmNsayIsCQkmaW5pdF82MG1fZmNsaywJQ0tfNDQzWCksCiAJQ0xLKE5VTEwsCSJsM19kaXZfY2siLAkJCSZsM19kaXZfY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkibDRfZGl2X2NrIiwJCQkmbDRfZGl2X2NrLAlDS180NDNYKSwKIAlDTEsoTlVMTCwJImxwX2Nsa19kaXZfY2siLAkJJmxwX2Nsa19kaXZfY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkibDRfd2t1cF9jbGtfbXV4X2NrIiwJCSZsNF93a3VwX2Nsa19tdXhfY2ssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkicGVyX2FiZV9uY19mY2xrIiwJCSZwZXJfYWJlX25jX2ZjbGssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkibWNhc3AyX2ZjbGsiLAkJCSZtY2FzcDJfZmNsaywJQ0tfNDQzWCksCi0JQ0xLKE5VTEwsCSJtY2FzcDNfZmNsayIsCQkJJm1jYXNwM19mY2xrLAlDS180NDNYKSwKIAlDTEsoTlVMTCwJIm9jcF9hYmVfaWNsayIsCQkJJm9jcF9hYmVfaWNsaywJQ0tfNDQzWCksCiAJQ0xLKE5VTEwsCSJwZXJfYWJlXzI0bV9mY2xrIiwJCSZwZXJfYWJlXzI0bV9mY2xrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInBlcl9hYmVfbmNfZmNsayIsCQkmcGVyX2FiZV9uY19mY2xrLAlDS180NDNYKSwKIAlDTEsoTlVMTCwJInBtZF9zdG1fY2xvY2tfbXV4X2NrIiwJCSZwbWRfc3RtX2Nsb2NrX211eF9jaywJQ0tfNDQzWCksCiAJQ0xLKE5VTEwsCSJwbWRfdHJhY2VfY2xrX211eF9jayIsCQkmcG1kX3RyYWNlX2Nsa19tdXhfY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkic3ljX2Nsa19kaXZfY2siLAkJJnN5Y19jbGtfZGl2X2NrLAlDS180NDNYKSwKQEAgLTMyMDQsNyArMzEyMiw2IEBACiAJQ0xLKE5VTEwsCSJ1YXJ0Ml9mY2siLAkJCSZ1YXJ0Ml9mY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkidWFydDNfZmNrIiwJCQkmdWFydDNfZmNrLAlDS180NDNYKSwKIAlDTEsoTlVMTCwJInVhcnQ0X2ZjayIsCQkJJnVhcnQ0X2ZjaywJQ0tfNDQzWCksCi0JQ0xLKE5VTEwsCSJ1c2JfaG9zdF9mc19mY2siLAkJJnVzYl9ob3N0X2ZzX2ZjaywJQ0tfNDQzWCksCiAJQ0xLKCJ1c2Jocy1vbWFwLjAiLAkiZnNfZmNrIiwJCSZ1c2JfaG9zdF9mc19mY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkidXRtaV9wMV9nZmNsayIsCQkmdXRtaV9wMV9nZmNsaywJQ0tfNDQzWCksCiAJQ0xLKE5VTEwsCSJ1c2JfaG9zdF9oc191dG1pX3AxX2NsayIsCSZ1c2JfaG9zdF9oc191dG1pX3AxX2NsaywJQ0tfNDQzWCksCkBAIC0zMjE2LDkgKzMxMzMsNyBAQAogCUNMSyhOVUxMLAkidXNiX2hvc3RfaHNfaHNpYzYwbV9wMl9jbGsiLAkmdXNiX2hvc3RfaHNfaHNpYzYwbV9wMl9jbGssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkidXNiX2hvc3RfaHNfaHNpYzQ4MG1fcDJfY2xrIiwJJnVzYl9ob3N0X2hzX2hzaWM0ODBtX3AyX2NsaywJQ0tfNDQzWCksCiAJQ0xLKE5VTEwsCSJ1c2JfaG9zdF9oc19mdW5jNDhtY2xrIiwJJnVzYl9ob3N0X2hzX2Z1bmM0OG1jbGssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkidXNiX2hvc3RfaHNfZmNrIiwJCSZ1c2JfaG9zdF9oc19mY2ssCUNLXzQ0M1gpLAogCUNMSygidXNiaHMtb21hcC4wIiwJImhzX2ZjayIsCQkmdXNiX2hvc3RfaHNfZmNrLAlDS180NDNYKSwKLQlDTEsoInVzYmhzLW9tYXAuMCIsCSJ1c2Job3N0X2ljayIsCQkmZHVtbXlfY2ssCQlDS180NDNYKSwKIAlDTEsoTlVMTCwJIm90Z182MG1fZ2ZjbGsiLAkJJm90Z182MG1fZ2ZjbGssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkidXNiX290Z19oc194Y2xrIiwJCSZ1c2Jfb3RnX2hzX3hjbGssCUNLXzQ0M1gpLAogCUNMSygibXVzYi1vbWFwMjQzMCIsCSJpY2siLAkJCQkmdXNiX290Z19oc19pY2ssCUNLXzQ0M1gpLApAQCAtMzIyNiwxNyArMzE0MSwyNiBAQAogCUNMSyhOVUxMLAkidXNiX3RsbF9oc191c2JfY2gyX2NsayIsCSZ1c2JfdGxsX2hzX3VzYl9jaDJfY2xrLAlDS180NDNYKSwKIAlDTEsoTlVMTCwJInVzYl90bGxfaHNfdXNiX2NoMF9jbGsiLAkmdXNiX3RsbF9oc191c2JfY2gwX2NsaywJQ0tfNDQzWCksCiAJQ0xLKE5VTEwsCSJ1c2JfdGxsX2hzX3VzYl9jaDFfY2xrIiwJJnVzYl90bGxfaHNfdXNiX2NoMV9jbGssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkidXNiX3RsbF9oc19pY2siLAkJJnVzYl90bGxfaHNfaWNrLAlDS180NDNYKSwKIAlDTEsoInVzYmhzLW9tYXAuMCIsCSJ1c2J0bGxfaWNrIiwJCSZ1c2JfdGxsX2hzX2ljaywJQ0tfNDQzWCksCi0JQ0xLKCJ1c2Jocy1vbWFwLjAiLAkidXNidGxsX2ZjayIsCQkmZHVtbXlfY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkidXNpbV9jayIsCQkJJnVzaW1fY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkidXNpbV9mY2xrIiwJCQkmdXNpbV9mY2xrLAlDS180NDNYKSwKIAlDTEsoTlVMTCwJInVzaW1fZmNrIiwJCQkmdXNpbV9mY2ssCUNLXzQ0M1gpLAogCUNMSygib21hcF93ZHQiLAkiZmNrIiwJCQkJJndkX3RpbWVyMl9mY2ssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkibWFpbGJveGVzX2ljayIsCQkmZHVtbXlfY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkid2RfdGltZXIzX2ZjayIsCQkmd2RfdGltZXIzX2ZjaywJQ0tfNDQzWCksCiAJQ0xLKE5VTEwsCSJzdG1fY2xrX2Rpdl9jayIsCQkmc3RtX2Nsa19kaXZfY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkidHJhY2VfY2xrX2Rpdl9jayIsCQkmdHJhY2VfY2xrX2Rpdl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJhdXhjbGswX2NrIiwJCQkmYXV4Y2xrMF9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJhdXhjbGsxX2NrIiwJCQkmYXV4Y2xrMV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJhdXhjbGsyX2NrIiwJCQkmYXV4Y2xrMl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJhdXhjbGszX2NrIiwJCQkmYXV4Y2xrM19jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJhdXhjbGs0X2NrIiwJCQkmYXV4Y2xrNF9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJhdXhjbGs1X2NrIiwJCQkmYXV4Y2xrNV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJhdXhjbGtyZXEwX2NrIiwJCSZhdXhjbGtyZXEwX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImF1eGNsa3JlcTFfY2siLAkJJmF1eGNsa3JlcTFfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiYXV4Y2xrcmVxMl9jayIsCQkmYXV4Y2xrcmVxMl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJhdXhjbGtyZXEzX2NrIiwJCSZhdXhjbGtyZXEzX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImF1eGNsa3JlcTRfY2siLAkJJmF1eGNsa3JlcTRfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiYXV4Y2xrcmVxNV9jayIsCQkmYXV4Y2xrcmVxNV9jaywJQ0tfNDQzWCksCiAJQ0xLKE5VTEwsCSJncG1jX2NrIiwJCQkmZHVtbXlfY2ssCUNLXzQ0M1gpLAogCUNMSyhOVUxMLAkiZ3B0MV9pY2siLAkJCSZkdW1teV9jaywJQ0tfNDQzWCksCiAJQ0xLKE5VTEwsCSJncHQyX2ljayIsCQkJJmR1bW15X2NrLAlDS180NDNYKSwKQEAgLTMyNTMsNiArMzE3Nyw3IEBACiAJQ0xLKCJvbWFwX2kyYy4yIiwJImljayIsCQkJCSZkdW1teV9jaywJQ0tfNDQzWCksCiAJQ0xLKCJvbWFwX2kyYy4zIiwJImljayIsCQkJCSZkdW1teV9jaywJQ0tfNDQzWCksCiAJQ0xLKCJvbWFwX2kyYy40IiwJImljayIsCQkJCSZkdW1teV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJtYWlsYm94ZXNfaWNrIiwJCSZkdW1teV9jaywJQ0tfNDQzWCksCiAJQ0xLKCJvbWFwX2hzbW1jLjAiLAkiaWNrIiwJCQkJJmR1bW15X2NrLAlDS180NDNYKSwKIAlDTEsoIm9tYXBfaHNtbWMuMSIsCSJpY2siLAkJCQkmZHVtbXlfY2ssCUNLXzQ0M1gpLAogCUNMSygib21hcF9oc21tYy4yIiwJImljayIsCQkJCSZkdW1teV9jaywJQ0tfNDQzWCksCkBAIC0zMjcwLDE5ICszMTk1LDkgQEAKIAlDTEsoTlVMTCwJInVhcnQyX2ljayIsCQkJJmR1bW15X2NrLAlDS180NDNYKSwKIAlDTEsoTlVMTCwJInVhcnQzX2ljayIsCQkJJmR1bW15X2NrLAlDS180NDNYKSwKIAlDTEsoTlVMTCwJInVhcnQ0X2ljayIsCQkJJmR1bW15X2NrLAlDS180NDNYKSwKKwlDTEsoInVzYmhzLW9tYXAuMCIsCSJ1c2Job3N0X2ljayIsCQkmZHVtbXlfY2ssCQlDS180NDNYKSwKKwlDTEsoInVzYmhzLW9tYXAuMCIsCSJ1c2J0bGxfZmNrIiwJCSZkdW1teV9jaywJQ0tfNDQzWCksCiAJQ0xLKCJvbWFwX3dkdCIsCSJpY2siLAkJCQkmZHVtbXlfY2ssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkiYXV4Y2xrMF9jayIsCQkJJmF1eGNsazBfY2ssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkiYXV4Y2xrMV9jayIsCQkJJmF1eGNsazFfY2ssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkiYXV4Y2xrMl9jayIsCQkJJmF1eGNsazJfY2ssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkiYXV4Y2xrM19jayIsCQkJJmF1eGNsazNfY2ssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkiYXV4Y2xrNF9jayIsCQkJJmF1eGNsazRfY2ssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkiYXV4Y2xrNV9jayIsCQkJJmF1eGNsazVfY2ssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkiYXV4Y2xrcmVxMF9jayIsCQkmYXV4Y2xrcmVxMF9jaywJQ0tfNDQzWCksCi0JQ0xLKE5VTEwsCSJhdXhjbGtyZXExX2NrIiwJCSZhdXhjbGtyZXExX2NrLAlDS180NDNYKSwKLQlDTEsoTlVMTCwJImF1eGNsa3JlcTJfY2siLAkJJmF1eGNsa3JlcTJfY2ssCUNLXzQ0M1gpLAotCUNMSyhOVUxMLAkiYXV4Y2xrcmVxM19jayIsCQkmYXV4Y2xrcmVxM19jaywJQ0tfNDQzWCksCi0JQ0xLKE5VTEwsCSJhdXhjbGtyZXE0X2NrIiwJCSZhdXhjbGtyZXE0X2NrLAlDS180NDNYKSwKLQlDTEsoTlVMTCwJImF1eGNsa3JlcTVfY2siLAkJJmF1eGNsa3JlcTVfY2ssCUNLXzQ0M1gpLAogfTsKIAogaW50IF9faW5pdCBvbWFwNHh4eF9jbGtfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnM0NHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zNDR4eF9kYXRhLmMKaW5kZXggYTYwN2VjMS4uNjYwOTBmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnM0NHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczQ0eHhfZGF0YS5jCkBAIC0xLDExICsxLDEyIEBACiAvKgogICogT01BUDQgQ2xvY2sgZG9tYWlucyBmcmFtZXdvcmsKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIE5va2lhIENvcnBvcmF0aW9uCiAgKgogICogQWJoaWppdCBQYWdhcmUgKGFiaGlqaXRwYWdhcmVAdGkuY29tKQogICogQmVub2l0IENvdXNzb24gKGItY291c3NvbkB0aS5jb20pCisgKiBQYXVsIFdhbG1zbGV5IChwYXVsQHB3c2FuLmNvbSkKICAqCiAgKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgT01BUCBoYXJkd2FyZSBkYXRhYmFzZXMuCiAgKiBXZSByZXNwZWN0ZnVsbHkgYXNrIHRoYXQgYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIGJlIGNvb3JkaW5hdGVkCkBAIC0zMiw2ICszMyw0MiBAQAogCiAvKiBTdGF0aWMgRGVwZW5kZW5jaWVzIGZvciBPTUFQNCBDbG9jayBEb21haW5zICovCiAKK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGQyZF93a3VwX3NsZWVwX2RlcHNbXSA9IHsKKwl7CisJCS5jbGtkbV9uYW1lCSA9ICJhYmVfY2xrZG0iLAorCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCisJfSwKKwl7CisJCS5jbGtkbV9uYW1lCSA9ICJpdmFoZF9jbGtkbSIsCisJCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKKwl9LAorCXsKKwkJLmNsa2RtX25hbWUJID0gImwzXzFfY2xrZG0iLAorCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCisJfSwKKwl7CisJCS5jbGtkbV9uYW1lCSA9ICJsM18yX2Nsa2RtIiwKKwkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQorCX0sCisJeworCQkuY2xrZG1fbmFtZQkgPSAibDNfZW1pZl9jbGtkbSIsCisJCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKKwl9LAorCXsKKwkJLmNsa2RtX25hbWUJID0gImwzX2luaXRfY2xrZG0iLAorCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCisJfSwKKwl7CisJCS5jbGtkbV9uYW1lCSA9ICJsNF9jZmdfY2xrZG0iLAorCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCisJfSwKKwl7CisJCS5jbGtkbV9uYW1lCSA9ICJsNF9wZXJfY2xrZG0iLAorCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCisJfSwKKwl7IE5VTEwgfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGR1Y2F0aV93a3VwX3NsZWVwX2RlcHNbXSA9IHsKIAl7CiAJCS5jbGtkbV9uYW1lCSA9ICJhYmVfY2xrZG0iLApAQCAtMTE2LDQyICsxNTMsNiBAQAogCXsgTlVMTCB9LAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbDNfZDJkX3drdXBfc2xlZXBfZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUJID0gImFiZV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gIml2YWhkX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfMV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzXzJfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19lbWlmX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfaW5pdF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X2NmZ19jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3Blcl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQogc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbDNfZG1hX3drdXBfc2xlZXBfZGVwc1tdID0gewogCXsKIAkJLmNsa2RtX25hbWUJID0gImFiZV9jbGtkbSIsCkBAIC0yODAsNyArMjgxLDcgQEAKIAl7IE5VTEwgfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIG1wdXNzX3drdXBfc2xlZXBfZGVwc1tdID0geworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbXB1X3drdXBfc2xlZXBfZGVwc1tdID0gewogCXsKIAkJLmNsa2RtX25hbWUJID0gImFiZV9jbGtkbSIsCiAJCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKQEAgLTQ5NywxNCArNDk4LDE0IEBACiAJLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIG1wdXNzXzQ0eHhfY2xrZG0gPSB7Ci0JLm5hbWUJCSAgPSAibXB1c3NfY2xrZG0iLAotCS5wd3JkbQkJICA9IHsgLm5hbWUgPSAibXB1X3B3cmRtIiB9LAotCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfQ00xX1BBUlRJVElPTiwKLQkuY21faW5zdAkgID0gT01BUDQ0MzBfQ00xX01QVV9JTlNULAotCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9DTTFfTVBVX01QVV9DRE9GRlMsCi0JLndrZGVwX3NyY3MJICA9IG1wdXNzX3drdXBfc2xlZXBfZGVwcywKLQkuc2xlZXBkZXBfc3JjcwkgID0gbXB1c3Nfd2t1cF9zbGVlcF9kZXBzLAorc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkMmRfNDR4eF9jbGtkbSA9IHsKKwkubmFtZQkJICA9ICJkMmRfY2xrZG0iLAorCS5wd3JkbQkJICA9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKKwkucHJjbV9wYXJ0aXRpb24JICA9IE9NQVA0NDMwX0NNMl9QQVJUSVRJT04sCisJLmNtX2luc3QJICA9IE9NQVA0NDMwX0NNMl9DT1JFX0lOU1QsCisJLmNsa2RtX29mZnMJICA9IE9NQVA0NDMwX0NNMl9DT1JFX0QyRF9DRE9GRlMsCisJLndrZGVwX3NyY3MJICA9IGQyZF93a3VwX3NsZWVwX2RlcHMsCisJLnNsZWVwZGVwX3NyY3MJICA9IGQyZF93a3VwX3NsZWVwX2RlcHMsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0ZPUkNFX1dBS0VVUCB8IENMS0RNX0NBTl9IV1NVUCwKIAkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CkBAIC01NjMsNiArNTY0LDE4IEBACiAJLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIG1wdV80NHh4X2Nsa2RtID0geworCS5uYW1lCQkgID0gIm1wdV9jbGtkbSIsCisJLnB3cmRtCQkgID0geyAubmFtZSA9ICJtcHVfcHdyZG0iIH0sCisJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9DTTFfUEFSVElUSU9OLAorCS5jbV9pbnN0CSAgPSBPTUFQNDQzMF9DTTFfTVBVX0lOU1QsCisJLmNsa2RtX29mZnMJICA9IE9NQVA0NDMwX0NNMV9NUFVfTVBVX0NET0ZGUywKKwkud2tkZXBfc3JjcwkgID0gbXB1X3drdXBfc2xlZXBfZGVwcywKKwkuc2xlZXBkZXBfc3JjcwkgID0gbXB1X3drdXBfc2xlZXBfZGVwcywKKwkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fRk9SQ0VfV0FLRVVQIHwgQ0xLRE1fQ0FOX0hXU1VQLAorCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAorfTsKKwogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBsM18yXzQ0eHhfY2xrZG0gPSB7CiAJLm5hbWUJCSAgPSAibDNfMl9jbGtkbSIsCiAJLnB3cmRtCQkgID0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LApAQCAtNTg1LDE4ICs1OTgsNiBAQAogCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBsM19kMmRfNDR4eF9jbGtkbSA9IHsKLQkubmFtZQkJICA9ICJsM19kMmRfY2xrZG0iLAotCS5wd3JkbQkJICA9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKLQkucHJjbV9wYXJ0aXRpb24JICA9IE9NQVA0NDMwX0NNMl9QQVJUSVRJT04sCi0JLmNtX2luc3QJICA9IE9NQVA0NDMwX0NNMl9DT1JFX0lOU1QsCi0JLmNsa2RtX29mZnMJICA9IE9NQVA0NDMwX0NNMl9DT1JFX0QyRF9DRE9GRlMsCi0JLndrZGVwX3NyY3MJICA9IGwzX2QyZF93a3VwX3NsZWVwX2RlcHMsCi0JLnNsZWVwZGVwX3NyY3MJICA9IGwzX2QyZF93a3VwX3NsZWVwX2RlcHMsCi0JLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0ZPUkNFX1dBS0VVUCB8IENMS0RNX0NBTl9IV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gaXNzXzQ0eHhfY2xrZG0gPSB7CiAJLm5hbWUJCSAgPSAiaXNzX2Nsa2RtIiwKIAkucHdyZG0JCSAgPSB7IC5uYW1lID0gImNhbV9wd3JkbSIgfSwKQEAgLTY1NSw2ICs2NTYsNyBAQAogCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAorLyogQXMgY2xvY2tkb21haW5zIGFyZSBhZGRlZCBvciByZW1vdmVkIGFib3ZlLCB0aGlzIGxpc3QgbXVzdCBhbHNvIGJlIGNoYW5nZWQgKi8KIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gKmNsb2NrZG9tYWluc19vbWFwNDR4eFtdIF9faW5pdGRhdGEgPSB7CiAJJmw0X2NlZnVzZV80NHh4X2Nsa2RtLAogCSZsNF9jZmdfNDR4eF9jbGtkbSwKQEAgLTY2NiwyMSArNjY4LDIxIEBACiAJJmFiZV80NHh4X2Nsa2RtLAogCSZsM19pbnN0cl80NHh4X2Nsa2RtLAogCSZsM19pbml0XzQ0eHhfY2xrZG0sCi0JJm1wdXNzXzQ0eHhfY2xrZG0sCisJJmQyZF80NHh4X2Nsa2RtLAogCSZtcHUwXzQ0eHhfY2xrZG0sCiAJJm1wdTFfNDR4eF9jbGtkbSwKIAkmbDNfZW1pZl80NHh4X2Nsa2RtLAogCSZsNF9hb180NHh4X2Nsa2RtLAogCSZkdWNhdGlfNDR4eF9jbGtkbSwKKwkmbXB1XzQ0eHhfY2xrZG0sCiAJJmwzXzJfNDR4eF9jbGtkbSwKIAkmbDNfMV80NHh4X2Nsa2RtLAotCSZsM19kMmRfNDR4eF9jbGtkbSwKIAkmaXNzXzQ0eHhfY2xrZG0sCiAJJmwzX2Rzc180NHh4X2Nsa2RtLAogCSZsNF93a3VwXzQ0eHhfY2xrZG0sCiAJJmVtdV9zeXNfNDR4eF9jbGtkbSwKIAkmbDNfZG1hXzQ0eHhfY2xrZG0sCi0JTlVMTCwKKwlOVUxMCiB9OwogCiB2b2lkIF9faW5pdCBvbWFwNDR4eF9jbG9ja2RvbWFpbnNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbS1yZWdiaXRzLTQ0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY20tcmVnYml0cy00NHh4LmgKaW5kZXggOWQ0N2EwNS4uMGU3Nzk0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbS1yZWdiaXRzLTQ0eHguaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtLXJlZ2JpdHMtNDR4eC5oCkBAIC0yMiwyMiArMjIsMTggQEAKICNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX09NQVAyX0NNX1JFR0JJVFNfNDRYWF9ICiAjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9DTV9SRUdCSVRTXzQ0WFhfSAogCi0vKgotICogVXNlZCBieSBDTV9MM18xX0RZTkFNSUNERVAsIENNX0wzXzFfRFlOQU1JQ0RFUF9SRVNUT1JFLCBDTV9NUFVfRFlOQU1JQ0RFUCwKLSAqIENNX1RFU0xBX0RZTkFNSUNERVAKLSAqLworLyogVXNlZCBieSBDTV9MM18xX0RZTkFNSUNERVAsIENNX01QVV9EWU5BTUlDREVQLCBDTV9URVNMQV9EWU5BTUlDREVQICovCiAjZGVmaW5lIE9NQVA0NDMwX0FCRV9EWU5ERVBfU0hJRlQJCQkJMwogI2RlZmluZSBPTUFQNDQzMF9BQkVfRFlOREVQX01BU0sJCQkJKDEgPDwgMykKIAogLyoKLSAqIFVzZWQgYnkgQ01fRDJEX1NUQVRJQ0RFUCwgQ01fRDJEX1NUQVRJQ0RFUF9SRVNUT1JFLCBDTV9EVUNBVElfU1RBVElDREVQLAotICogQ01fTDNJTklUX1NUQVRJQ0RFUCwgQ01fTVBVX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVAsCi0gKiBDTV9TRE1BX1NUQVRJQ0RFUF9SRVNUT1JFLCBDTV9URVNMQV9TVEFUSUNERVAKKyAqIFVzZWQgYnkgQ01fRDJEX1NUQVRJQ0RFUCwgQ01fRFVDQVRJX1NUQVRJQ0RFUCwgQ01fTDNJTklUX1NUQVRJQ0RFUCwKKyAqIENNX01QVV9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQLCBDTV9URVNMQV9TVEFUSUNERVAKICAqLwogI2RlZmluZSBPTUFQNDQzMF9BQkVfU1RBVERFUF9TSElGVAkJCQkzCiAjZGVmaW5lIE9NQVA0NDMwX0FCRV9TVEFUREVQX01BU0sJCQkJKDEgPDwgMykKIAotLyogVXNlZCBieSBDTV9MNENGR19EWU5BTUlDREVQLCBDTV9MNENGR19EWU5BTUlDREVQX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDRDRkdfRFlOQU1JQ0RFUCAqLwogI2RlZmluZSBPTUFQNDQzMF9BTFdPTkNPUkVfRFlOREVQX1NISUZUCQkJCTE2CiAjZGVmaW5lIE9NQVA0NDMwX0FMV09OQ09SRV9EWU5ERVBfTUFTSwkJCQkoMSA8PCAxNikKIApAQCAtNDcsMTQgKzQzLDEzIEBACiAKIC8qCiAgKiBVc2VkIGJ5IENNX0FVVE9JRExFX0RQTExfQUJFLCBDTV9BVVRPSURMRV9EUExMX0NPUkUsCi0gKiBDTV9BVVRPSURMRV9EUExMX0NPUkVfUkVTVE9SRSwgQ01fQVVUT0lETEVfRFBMTF9ERFJQSFksCi0gKiBDTV9BVVRPSURMRV9EUExMX0lWQSwgQ01fQVVUT0lETEVfRFBMTF9NUFUsIENNX0FVVE9JRExFX0RQTExfUEVSLAotICogQ01fQVVUT0lETEVfRFBMTF9VTklQUk8sIENNX0FVVE9JRExFX0RQTExfVVNCCisgKiBDTV9BVVRPSURMRV9EUExMX0REUlBIWSwgQ01fQVVUT0lETEVfRFBMTF9JVkEsIENNX0FVVE9JRExFX0RQTExfTVBVLAorICogQ01fQVVUT0lETEVfRFBMTF9QRVIsIENNX0FVVE9JRExFX0RQTExfVU5JUFJPLCBDTV9BVVRPSURMRV9EUExMX1VTQgogICovCiAjZGVmaW5lIE9NQVA0NDMwX0FVVE9fRFBMTF9NT0RFX1NISUZUCQkJCTAKICNkZWZpbmUgT01BUDQ0MzBfQVVUT19EUExMX01PREVfTUFTSwkJCQkoMHg3IDw8IDApCiAKLS8qIFVzZWQgYnkgQ01fTDRDRkdfRFlOQU1JQ0RFUCwgQ01fTDRDRkdfRFlOQU1JQ0RFUF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0w0Q0ZHX0RZTkFNSUNERVAgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0VGVVNFX0RZTkRFUF9TSElGVAkJCQkxNwogI2RlZmluZSBPTUFQNDQzMF9DRUZVU0VfRFlOREVQX01BU0sJCQkJKDEgPDwgMTcpCiAKQEAgLTgyLDE1ICs3NywxNSBAQAogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9BQkVfWDJfQ0xLX1NISUZUCQkJOAogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9BQkVfWDJfQ0xLX01BU0sJCQkoMSA8PCA4KQogCi0vKiBVc2VkIGJ5IENNX01FTUlGX0NMS1NUQ1RSTCwgQ01fTUVNSUZfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTUVNSUZfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0FTWU5DX0RMTF9DTEtfU0hJRlQJCTExCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0FTWU5DX0RMTF9DTEtfTUFTSwkJCSgxIDw8IDExKQogCi0vKiBVc2VkIGJ5IENNX01FTUlGX0NMS1NUQ1RSTCwgQ01fTUVNSUZfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTUVNSUZfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0FTWU5DX1BIWTFfQ0xLX1NISUZUCQkxMgogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9BU1lOQ19QSFkxX0NMS19NQVNLCQkoMSA8PCAxMikKIAotLyogVXNlZCBieSBDTV9NRU1JRl9DTEtTVENUUkwsIENNX01FTUlGX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX01FTUlGX0NMS1NUQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9BU1lOQ19QSFkyX0NMS19TSElGVAkJMTMKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfQVNZTkNfUEhZMl9DTEtfTUFTSwkJKDEgPDwgMTMpCiAKQEAgLTExMCwzMSArMTA1LDMxIEBACiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0NVU1RfRUZVU0VfU1lTX0NMS19TSElGVAkJOQogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9DVVNUX0VGVVNFX1NZU19DTEtfTUFTSwkJKDEgPDwgOSkKIAotLyogVXNlZCBieSBDTV9NRU1JRl9DTEtTVENUUkwsIENNX01FTUlGX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX01FTUlGX0NMS1NUQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETExfQ0xLX1NISUZUCQkJOQogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETExfQ0xLX01BU0sJCQkoMSA8PCA5KQogCi0vKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RNVDEwX0dGQ0xLX1NISUZUCQkJOQogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETVQxMF9HRkNMS19NQVNLCQkJKDEgPDwgOSkKIAotLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwsIENNX0w0UEVSX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETVQxMV9HRkNMS19TSElGVAkJCTEwCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RNVDExX0dGQ0xLX01BU0sJCQkoMSA8PCAxMCkKIAotLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwsIENNX0w0UEVSX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETVQyX0dGQ0xLX1NISUZUCQkJMTEKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRE1UMl9HRkNMS19NQVNLCQkJKDEgPDwgMTEpCiAKLS8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRE1UM19HRkNMS19TSElGVAkJCTEyCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RNVDNfR0ZDTEtfTUFTSwkJCSgxIDw8IDEyKQogCi0vKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RNVDRfR0ZDTEtfU0hJRlQJCQkxMwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETVQ0X0dGQ0xLX01BU0sJCQkoMSA8PCAxMykKIAotLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwsIENNX0w0UEVSX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETVQ5X0dGQ0xLX1NISUZUCQkJMTQKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRE1UOV9HRkNMS19NQVNLCQkJKDEgPDwgMTQpCiAKQEAgLTE1OCw3ICsxNTMsNyBAQAogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9GRElGX0dGQ0xLX1NISUZUCQkJMTAKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRkRJRl9HRkNMS19NQVNLCQkJKDEgPDwgMTApCiAKLS8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRlVOQ18xMk1fR0ZDTEtfU0hJRlQJCTE1CiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0ZVTkNfMTJNX0dGQ0xLX01BU0sJCSgxIDw8IDE1KQogCkBAIC0xNzAsNTUgKzE2NSw1NSBAQAogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9IRE1JX1BIWV80OE1IWl9HRkNMS19TSElGVAkJMTEKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSERNSV9QSFlfNDhNSFpfR0ZDTEtfTUFTSwkJKDEgPDwgMTEpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMV80ODBNX0dGQ0xLX1NISUZUCQkyMAogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9IU0lDX1AxXzQ4ME1fR0ZDTEtfTUFTSwkJKDEgPDwgMjApCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMV9HRkNMS19TSElGVAkJMjYKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMV9HRkNMS19NQVNLCQkJKDEgPDwgMjYpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMl80ODBNX0dGQ0xLX1NISUZUCQkyMQogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9IU0lDX1AyXzQ4ME1fR0ZDTEtfTUFTSwkJKDEgPDwgMjEpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMl9HRkNMS19TSElGVAkJMjcKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMl9HRkNMS19NQVNLCQkJKDEgPDwgMjcpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF80OE1DX0dGQ0xLX1NISUZUCQkxMwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUXzQ4TUNfR0ZDTEtfTUFTSwkJKDEgPDwgMTMpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF80OE1fR0ZDTEtfU0hJRlQJCTEyCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfNDhNX0dGQ0xLX01BU0sJCSgxIDw8IDEyKQogCi0vKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwsIENNX0wzSU5JVF9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfNjBNX1AxX0dGQ0xLX1NISUZUCQkyOAogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUXzYwTV9QMV9HRkNMS19NQVNLCQkoMSA8PCAyOCkKIAotLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUXzYwTV9QMl9HRkNMS19TSElGVAkJMjkKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF82ME1fUDJfR0ZDTEtfTUFTSwkJKDEgPDwgMjkpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF85Nk1fR0ZDTEtfU0hJRlQJCTExCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfOTZNX0dGQ0xLX01BU0sJCSgxIDw8IDExKQogCi0vKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwsIENNX0wzSU5JVF9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfSFNJX0dGQ0xLX1NISUZUCQkxNgogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUX0hTSV9HRkNMS19NQVNLCQkoMSA8PCAxNikKIAotLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUX0hTTU1DMV9HRkNMS19TSElGVAkJMTcKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF9IU01NQzFfR0ZDTEtfTUFTSwkJKDEgPDwgMTcpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF9IU01NQzJfR0ZDTEtfU0hJRlQJCTE4CiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfSFNNTUMyX0dGQ0xLX01BU0sJCSgxIDw8IDE4KQogCi0vKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwsIENNX0wzSU5JVF9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfSFNNTUM2X0dGQ0xLX1NISUZUCQkxOQogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUX0hTTU1DNl9HRkNMS19NQVNLCQkoMSA8PCAxOSkKIApAQCAtMjM0LDExICsyMjksMTEgQEAKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNYMl9EMkRfR0lDTEtfU0hJRlQJCTEwCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzWDJfRDJEX0dJQ0xLX01BU0sJCSgxIDw8IDEwKQogCi0vKiBVc2VkIGJ5IENNX0wzXzFfQ0xLU1RDVFJMLCBDTV9MM18xX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzXzFfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzXzFfR0lDTEtfU0hJRlQJCQk4CiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzXzFfR0lDTEtfTUFTSwkJCSgxIDw8IDgpCiAKLS8qIFVzZWQgYnkgQ01fTDNfMl9DTEtTVENUUkwsIENNX0wzXzJfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNfMl9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNfMl9HSUNMS19TSElGVAkJCTgKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNfMl9HSUNMS19NQVNLCQkJKDEgPDwgOCkKIApAQCAtMjU0LDcgKzI0OSw3IEBACiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0RTU19HSUNMS19TSElGVAkJCTgKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNfRFNTX0dJQ0xLX01BU0sJCQkoMSA8PCA4KQogCi0vKiBVc2VkIGJ5IENNX01FTUlGX0NMS1NUQ1RSTCwgQ01fTUVNSUZfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTUVNSUZfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0VNSUZfR0lDTEtfU0hJRlQJCTgKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNfRU1JRl9HSUNMS19NQVNLCQkJKDEgPDwgOCkKIApAQCAtMjYyLDcgKzI1Nyw3IEBACiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0dGWF9HSUNMS19TSElGVAkJCTgKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNfR0ZYX0dJQ0xLX01BU0sJCQkoMSA8PCA4KQogCi0vKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwsIENNX0wzSU5JVF9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0lOSVRfR0lDTEtfU0hJRlQJCTgKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNfSU5JVF9HSUNMS19NQVNLCQkJKDEgPDwgOCkKIApAQCAtMjgyLDcgKzI3Nyw3IEBACiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0w0X0NFRlVTRV9HSUNMS19TSElGVAkJOAogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MNF9DRUZVU0VfR0lDTEtfTUFTSwkJKDEgPDwgOCkKIAotLyogVXNlZCBieSBDTV9MNENGR19DTEtTVENUUkwsIENNX0w0Q0ZHX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0w0Q0ZHX0NMS1NUQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MNF9DRkdfR0lDTEtfU0hJRlQJCQk4CiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0w0X0NGR19HSUNMS19NQVNLCQkJKDEgPDwgOCkKIApAQCAtMjkwLDExICsyODUsMTEgQEAKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDRfRDJEX0dJQ0xLX1NISUZUCQkJOQogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MNF9EMkRfR0lDTEtfTUFTSwkJCSgxIDw8IDkpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDRfSU5JVF9HSUNMS19TSElGVAkJOQogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MNF9JTklUX0dJQ0xLX01BU0sJCQkoMSA8PCA5KQogCi0vKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0w0X1BFUl9HSUNMS19TSElGVAkJCTgKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDRfUEVSX0dJQ0xLX01BU0sJCQkoMSA8PCA4KQogCkBAIC0zMDYsNyArMzAxLDcgQEAKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDRfV0tVUF9HSUNMS19TSElGVAkJMTIKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDRfV0tVUF9HSUNMS19NQVNLCQkJKDEgPDwgMTIpCiAKLS8qIFVzZWQgYnkgQ01fTVBVX0NMS1NUQ1RSTCwgQ01fTVBVX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX01QVV9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTVBVX0RQTExfQ0xLX1NISUZUCQkJOAogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9NUFVfRFBMTF9DTEtfTUFTSwkJCSgxIDw8IDgpCiAKQEAgLTMxNCw0MyArMzA5LDQzIEBACiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX09DUF9BQkVfR0lDTEtfU0hJRlQJCTkKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfT0NQX0FCRV9HSUNMS19NQVNLCQkJKDEgPDwgOSkKIAotLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwsIENNX0w0UEVSX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9QRVJfMjRNQ19HRkNMS19TSElGVAkJMTYKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSXzI0TUNfR0ZDTEtfTUFTSwkJKDEgPDwgMTYpCiAKLS8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSXzMyS19HRkNMS19TSElGVAkJMTcKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSXzMyS19HRkNMS19NQVNLCQkJKDEgPDwgMTcpCiAKLS8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSXzQ4TV9HRkNMS19TSElGVAkJMTgKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSXzQ4TV9HRkNMS19NQVNLCQkJKDEgPDwgMTgpCiAKLS8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSXzk2TV9HRkNMS19TSElGVAkJMTkKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSXzk2TV9HRkNMS19NQVNLCQkJKDEgPDwgMTkpCiAKLS8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSX0FCRV8yNE1fR0ZDTEtfU0hJRlQJCTI1CiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1BFUl9BQkVfMjRNX0dGQ0xLX01BU0sJCSgxIDw8IDI1KQogCi0vKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1BFUl9NQ0FTUDJfR0ZDTEtfU0hJRlQJCTIwCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1BFUl9NQ0FTUDJfR0ZDTEtfTUFTSwkJKDEgPDwgMjApCiAKLS8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSX01DQVNQM19HRkNMS19TSElGVAkJMjEKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSX01DQVNQM19HRkNMS19NQVNLCQkoMSA8PCAyMSkKIAotLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwsIENNX0w0UEVSX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9QRVJfTUNCU1A0X0dGQ0xLX1NISUZUCQkyMgogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9QRVJfTUNCU1A0X0dGQ0xLX01BU0sJCSgxIDw8IDIyKQogCi0vKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1BFUl9TWVNfR0ZDTEtfU0hJRlQJCTI0CiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1BFUl9TWVNfR0ZDTEtfTUFTSwkJCSgxIDw8IDI0KQogCi0vKiBVc2VkIGJ5IENNX01FTUlGX0NMS1NUQ1RSTCwgQ01fTUVNSUZfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTUVNSUZfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1BIWV9ST09UX0NMS19TSElGVAkJCTEwCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1BIWV9ST09UX0NMS19NQVNLCQkJKDEgPDwgMTApCiAKQEAgLTM3OCwyNyArMzczLDI3IEBACiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1RFU0xBX1JPT1RfQ0xLX1NISUZUCQk4CiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1RFU0xBX1JPT1RfQ0xLX01BU0sJCSgxIDw8IDgpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVExMX0NIMF9HRkNMS19TSElGVAkJMjIKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVExMX0NIMF9HRkNMS19NQVNLCQkJKDEgPDwgMjIpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVExMX0NIMV9HRkNMS19TSElGVAkJMjMKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVExMX0NIMV9HRkNMS19NQVNLCQkJKDEgPDwgMjMpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVExMX0NIMl9HRkNMS19TSElGVAkJMjQKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVExMX0NIMl9HRkNMS19NQVNLCQkJKDEgPDwgMjQpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVU5JUFJPX0RQTExfQ0xLX1NISUZUCQkxMAogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9VTklQUk9fRFBMTF9DTEtfTUFTSwkJKDEgPDwgMTApCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVVNCX0RQTExfQ0xLX1NISUZUCQkJMTQKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVVNCX0RQTExfQ0xLX01BU0sJCQkoMSA8PCAxNCkKIAotLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9VU0JfRFBMTF9IU19DTEtfU0hJRlQJCTE1CiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1VTQl9EUExMX0hTX0NMS19NQVNLCQkoMSA8PCAxNSkKIApAQCAtNDA2LDExICs0MDEsMTEgQEAKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVVNJTV9HRkNMS19TSElGVAkJCTEwCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1VTSU1fR0ZDTEtfTUFTSwkJCSgxIDw8IDEwKQogCi0vKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwsIENNX0wzSU5JVF9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1VUTUlfUDNfR0ZDTEtfU0hJRlQJCTMwCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1VUTUlfUDNfR0ZDTEtfTUFTSwkJCSgxIDw8IDMwKQogCi0vKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwsIENNX0wzSU5JVF9DTEtTVENUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1VUTUlfUk9PVF9HRkNMS19TSElGVAkJMjUKICNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVVRNSV9ST09UX0dGQ0xLX01BU0sJCSgxIDw8IDI1KQogCkBAIC00MzIsNyArNDI3LDcgQEAKIAogLyoKICAqIFJlbmFtZWQgZnJvbSBDTEtTRUwgVXNlZCBieSBDTV9BQkVfRFNTX1NZU19DTEtTRUwsIENNX0FCRV9QTExfUkVGX0NMS1NFTCwKLSAqIENNX0w0X1dLVVBfQ0xLU0VMLCBDTV9DTEtTRUxfRFVDQVRJX0lTU19ST09ULCBDTV9DTEtTRUxfVVNCXzYwTUhaCisgKiBDTV9DTEtTRUxfRFVDQVRJX0lTU19ST09ULCBDTV9DTEtTRUxfVVNCXzYwTUhaLCBDTV9MNF9XS1VQX0NMS1NFTAogICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF8wXzBfU0hJRlQJCQkJMAogI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfMF8wX01BU0sJCQkJKDEgPDwgMCkKQEAgLTQ1MywxNCArNDQ4LDExIEBACiAjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9BRVNTX0ZDTEtfU0hJRlQJCQkJMjQKICNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX0FFU1NfRkNMS19NQVNLCQkJCSgxIDw8IDI0KQogCi0vKiBVc2VkIGJ5IENNX0NMS1NFTF9DT1JFLCBDTV9DTEtTRUxfQ09SRV9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0NMS1NFTF9DT1JFICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9DT1JFX1NISUZUCQkJCTAKICNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX0NPUkVfTUFTSwkJCQkoMSA8PCAwKQogCi0vKgotICogUmVuYW1lZCBmcm9tIENMS1NFTF9DT1JFIFVzZWQgYnkgQ01fU0hBRE9XX0ZSRVFfQ09ORklHMl9SRVNUT1JFLAotICogQ01fU0hBRE9XX0ZSRVFfQ09ORklHMgotICovCisvKiBSZW5hbWVkIGZyb20gQ0xLU0VMX0NPUkUgVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcyICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9DT1JFXzFfMV9TSElGVAkJCQkxCiAjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9DT1JFXzFfMV9NQVNLCQkJCSgxIDw8IDEpCiAKQEAgLTQ4NCwxOCArNDc2LDE1IEBACiAjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9JTlRFUk5BTF9TT1VSQ0VfQ00xX0FCRV9ETUlDX1NISUZUCTI2CiAjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9JTlRFUk5BTF9TT1VSQ0VfQ00xX0FCRV9ETUlDX01BU0sJKDB4MyA8PCAyNikKIAotLyogVXNlZCBieSBDTV9DTEtTRUxfQ09SRSwgQ01fQ0xLU0VMX0NPUkVfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9DTEtTRUxfQ09SRSAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfTDNfU0hJRlQJCQkJNAogI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfTDNfTUFTSwkJCQkJKDEgPDwgNCkKIAotLyoKLSAqIFJlbmFtZWQgZnJvbSBDTEtTRUxfTDMgVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcyX1JFU1RPUkUsCi0gKiBDTV9TSEFET1dfRlJFUV9DT05GSUcyCi0gKi8KKy8qIFJlbmFtZWQgZnJvbSBDTEtTRUxfTDMgVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcyICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9MM19TSEFET1dfU0hJRlQJCQkJMgogI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfTDNfU0hBRE9XX01BU0sJCQkJKDEgPDwgMikKIAotLyogVXNlZCBieSBDTV9DTEtTRUxfQ09SRSwgQ01fQ0xLU0VMX0NPUkVfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9DTEtTRUxfQ09SRSAqLwogI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfTDRfU0hJRlQJCQkJOAogI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfTDRfTUFTSwkJCQkJKDEgPDwgOCkKIApAQCAtNTI2LDExICs1MTUsMTEgQEAKICNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1NPVVJDRV8yNF8yNF9TSElGVAkJCTI0CiAjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9TT1VSQ0VfMjRfMjRfTUFTSwkJCSgxIDw8IDI0KQogCi0vKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMLCBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9VVE1JX1AxX1NISUZUCQkJCTI0CiAjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9VVE1JX1AxX01BU0sJCQkJKDEgPDwgMjQpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1VUTUlfUDJfU0hJRlQJCQkJMjUKICNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1VUTUlfUDJfTUFTSwkJCQkoMSA8PCAyNSkKIApAQCAtNTM4LDEzICs1MjcsMTAgQEAKICAqIFVzZWQgYnkgQ00xX0FCRV9DTEtTVENUUkwsIENNX0FMV09OX0NMS1NUQ1RSTCwgQ01fQ0FNX0NMS1NUQ1RSTCwKICAqIENNX0NFRlVTRV9DTEtTVENUUkwsIENNX0QyRF9DTEtTVENUUkwsIENNX0RTU19DTEtTVENUUkwsCiAgKiBDTV9EVUNBVElfQ0xLU1RDVFJMLCBDTV9FTVVfQ0xLU1RDVFJMLCBDTV9HRlhfQ0xLU1RDVFJMLCBDTV9JVkFIRF9DTEtTVENUUkwsCi0gKiBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUsIENNX0wzSU5TVFJfQ0xLU1RDVFJMLAotICogQ01fTDNfMV9DTEtTVENUUkwsIENNX0wzXzFfQ0xLU1RDVFJMX1JFU1RPUkUsIENNX0wzXzJfQ0xLU1RDVFJMLAotICogQ01fTDNfMl9DTEtTVENUUkxfUkVTVE9SRSwgQ01fTDRDRkdfQ0xLU1RDVFJMLCBDTV9MNENGR19DTEtTVENUUkxfUkVTVE9SRSwKLSAqIENNX0w0UEVSX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMX1JFU1RPUkUsIENNX0w0U0VDX0NMS1NUQ1RSTCwKLSAqIENNX01FTUlGX0NMS1NUQ1RSTCwgQ01fTUVNSUZfQ0xLU1RDVFJMX1JFU1RPUkUsIENNX01QVV9DTEtTVENUUkwsCi0gKiBDTV9NUFVfQ0xLU1RDVFJMX1JFU1RPUkUsIENNX1NETUFfQ0xLU1RDVFJMLCBDTV9URVNMQV9DTEtTVENUUkwsCi0gKiBDTV9XS1VQX0NMS1NUQ1RSTAorICogQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTlNUUl9DTEtTVENUUkwsIENNX0wzXzFfQ0xLU1RDVFJMLAorICogQ01fTDNfMl9DTEtTVENUUkwsIENNX0w0Q0ZHX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMLAorICogQ01fTDRTRUNfQ0xLU1RDVFJMLCBDTV9NRU1JRl9DTEtTVENUUkwsIENNX01QVV9DTEtTVENUUkwsIENNX1NETUFfQ0xLU1RDVFJMLAorICogQ01fVEVTTEFfQ0xLU1RDVFJMLCBDTV9XS1VQX0NMS1NUQ1RSTAogICovCiAjZGVmaW5lIE9NQVA0NDMwX0NMS1RSQ1RSTF9TSElGVAkJCQkwCiAjZGVmaW5lIE9NQVA0NDMwX0NMS1RSQ1RSTF9NQVNLCQkJCQkoMHgzIDw8IDApCkBAIC01NjEsMTAgKzU0Nyw3IEBACiAjZGVmaW5lIE9NQVA0NDMwX0NVU1RPTV9TSElGVAkJCQkJNgogI2RlZmluZSBPTUFQNDQzMF9DVVNUT01fTUFTSwkJCQkJKDB4MyA8PCA2KQogCi0vKgotICogVXNlZCBieSBDTV9MM18yX0RZTkFNSUNERVAsIENNX0wzXzJfRFlOQU1JQ0RFUF9SRVNUT1JFLCBDTV9MNENGR19EWU5BTUlDREVQLAotICogQ01fTDRDRkdfRFlOQU1JQ0RFUF9SRVNUT1JFCi0gKi8KKy8qIFVzZWQgYnkgQ01fTDNfMl9EWU5BTUlDREVQLCBDTV9MNENGR19EWU5BTUlDREVQICovCiAjZGVmaW5lIE9NQVA0NDMwX0QyRF9EWU5ERVBfU0hJRlQJCQkJMTgKICNkZWZpbmUgT01BUDQ0MzBfRDJEX0RZTkRFUF9NQVNLCQkJCSgxIDw8IDE4KQogCkBAIC01NzQsMzEgKzU1NywyOSBAQAogCiAvKgogICogVXNlZCBieSBDTV9TU0NfREVMVEFNU1RFUF9EUExMX0FCRSwgQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9DT1JFLAotICogQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9DT1JFX1JFU1RPUkUsIENNX1NTQ19ERUxUQU1TVEVQX0RQTExfRERSUEhZLAotICogQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9JVkEsIENNX1NTQ19ERUxUQU1TVEVQX0RQTExfTVBVLAotICogQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9QRVIsIENNX1NTQ19ERUxUQU1TVEVQX0RQTExfVU5JUFJPLAotICogQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9VU0IKKyAqIENNX1NTQ19ERUxUQU1TVEVQX0RQTExfRERSUEhZLCBDTV9TU0NfREVMVEFNU1RFUF9EUExMX0lWQSwKKyAqIENNX1NTQ19ERUxUQU1TVEVQX0RQTExfTVBVLCBDTV9TU0NfREVMVEFNU1RFUF9EUExMX1BFUiwKKyAqIENNX1NTQ19ERUxUQU1TVEVQX0RQTExfVU5JUFJPLCBDTV9TU0NfREVMVEFNU1RFUF9EUExMX1VTQgogICovCiAjZGVmaW5lIE9NQVA0NDMwX0RFTFRBTVNURVBfU0hJRlQJCQkJMAogI2RlZmluZSBPTUFQNDQzMF9ERUxUQU1TVEVQX01BU0sJCQkJKDB4ZmZmZmYgPDwgMCkKIAotLyogVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcxLCBDTV9TSEFET1dfRlJFUV9DT05GSUcxX1JFU1RPUkUgKi8KLSNkZWZpbmUgT01BUDQ0MzBfRExMX09WRVJSSURFX1NISUZUCQkJCTIKLSNkZWZpbmUgT01BUDQ0MzBfRExMX09WRVJSSURFX01BU0sJCQkJKDEgPDwgMikKKy8qIFVzZWQgYnkgQ01fRExMX0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRExMX09WRVJSSURFX1NISUZUCQkJCTAKKyNkZWZpbmUgT01BUDQ0MzBfRExMX09WRVJSSURFX01BU0sJCQkJKDEgPDwgMCkKIAotLyogUmVuYW1lZCBmcm9tIERMTF9PVkVSUklERSBVc2VkIGJ5IENNX0RMTF9DVFJMICovCi0jZGVmaW5lIE9NQVA0NDMwX0RMTF9PVkVSUklERV8wXzBfU0hJRlQJCQkJMAotI2RlZmluZSBPTUFQNDQzMF9ETExfT1ZFUlJJREVfMF8wX01BU0sJCQkJKDEgPDwgMCkKKy8qIFJlbmFtZWQgZnJvbSBETExfT1ZFUlJJREUgVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcxICovCisjZGVmaW5lIE9NQVA0NDMwX0RMTF9PVkVSUklERV8yXzJfU0hJRlQJCQkJMgorI2RlZmluZSBPTUFQNDQzMF9ETExfT1ZFUlJJREVfMl8yX01BU0sJCQkJKDEgPDwgMikKIAotLyogVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcxLCBDTV9TSEFET1dfRlJFUV9DT05GSUcxX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fU0hBRE9XX0ZSRVFfQ09ORklHMSAqLwogI2RlZmluZSBPTUFQNDQzMF9ETExfUkVTRVRfU0hJRlQJCQkJMwogI2RlZmluZSBPTUFQNDQzMF9ETExfUkVTRVRfTUFTSwkJCQkJKDEgPDwgMykKIAogLyoKLSAqIFVzZWQgYnkgQ01fQ0xLU0VMX0RQTExfQUJFLCBDTV9DTEtTRUxfRFBMTF9DT1JFLAotICogQ01fQ0xLU0VMX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9DTEtTRUxfRFBMTF9ERFJQSFksIENNX0NMS1NFTF9EUExMX0lWQSwKLSAqIENNX0NMS1NFTF9EUExMX01QVSwgQ01fQ0xLU0VMX0RQTExfUEVSLCBDTV9DTEtTRUxfRFBMTF9VTklQUk8sCi0gKiBDTV9DTEtTRUxfRFBMTF9VU0IKKyAqIFVzZWQgYnkgQ01fQ0xLU0VMX0RQTExfQUJFLCBDTV9DTEtTRUxfRFBMTF9DT1JFLCBDTV9DTEtTRUxfRFBMTF9ERFJQSFksCisgKiBDTV9DTEtTRUxfRFBMTF9JVkEsIENNX0NMS1NFTF9EUExMX01QVSwgQ01fQ0xLU0VMX0RQTExfUEVSLAorICogQ01fQ0xLU0VMX0RQTExfVU5JUFJPLCBDTV9DTEtTRUxfRFBMTF9VU0IKICAqLwogI2RlZmluZSBPTUFQNDQzMF9EUExMX0JZUF9DTEtTRUxfU0hJRlQJCQkJMjMKICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9CWVBfQ0xLU0VMX01BU0sJCQkJKDEgPDwgMjMpCkBAIC02MDcsMjggKzU4OCwxOSBAQAogI2RlZmluZSBPTUFQNDQzMF9EUExMX0NMS0RDT0xET19HQVRFX0NUUkxfU0hJRlQJCQk4CiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLRENPTERPX0dBVEVfQ1RSTF9NQVNLCQkJKDEgPDwgOCkKIAotLyogVXNlZCBieSBDTV9DTEtTRUxfRFBMTF9DT1JFLCBDTV9DTEtTRUxfRFBMTF9DT1JFX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fQ0xLU0VMX0RQTExfQ09SRSAqLwogI2RlZmluZSBPTUFQNDQzMF9EUExMX0NMS09VVEhJRl9DTEtTRUxfU0hJRlQJCQkyMAogI2RlZmluZSBPTUFQNDQzMF9EUExMX0NMS09VVEhJRl9DTEtTRUxfTUFTSwkJCSgxIDw8IDIwKQogCi0vKgotICogVXNlZCBieSBDTV9ESVZfTTNfRFBMTF9BQkUsIENNX0RJVl9NM19EUExMX0NPUkUsCi0gKiBDTV9ESVZfTTNfRFBMTF9DT1JFX1JFU1RPUkUsIENNX0RJVl9NM19EUExMX1BFUgotICovCisvKiBVc2VkIGJ5IENNX0RJVl9NM19EUExMX0FCRSwgQ01fRElWX00zX0RQTExfQ09SRSwgQ01fRElWX00zX0RQTExfUEVSICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUSElGX0RJVl9TSElGVAkJCTAKICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRISUZfRElWX01BU0sJCQkoMHgxZiA8PCAwKQogCi0vKgotICogVXNlZCBieSBDTV9ESVZfTTNfRFBMTF9BQkUsIENNX0RJVl9NM19EUExMX0NPUkUsCi0gKiBDTV9ESVZfTTNfRFBMTF9DT1JFX1JFU1RPUkUsIENNX0RJVl9NM19EUExMX1BFUgotICovCisvKiBVc2VkIGJ5IENNX0RJVl9NM19EUExMX0FCRSwgQ01fRElWX00zX0RQTExfQ09SRSwgQ01fRElWX00zX0RQTExfUEVSICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUSElGX0RJVkNIQUNLX1NISUZUCQkJNQogI2RlZmluZSBPTUFQNDQzMF9EUExMX0NMS09VVEhJRl9ESVZDSEFDS19NQVNLCQkJKDEgPDwgNSkKIAotLyoKLSAqIFVzZWQgYnkgQ01fRElWX00zX0RQTExfQUJFLCBDTV9ESVZfTTNfRFBMTF9DT1JFLAotICogQ01fRElWX00zX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9ESVZfTTNfRFBMTF9QRVIKLSAqLworLyogVXNlZCBieSBDTV9ESVZfTTNfRFBMTF9BQkUsIENNX0RJVl9NM19EUExMX0NPUkUsIENNX0RJVl9NM19EUExMX1BFUiAqLwogI2RlZmluZSBPTUFQNDQzMF9EUExMX0NMS09VVEhJRl9HQVRFX0NUUkxfU0hJRlQJCQk4CiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUSElGX0dBVEVfQ1RSTF9NQVNLCQkJKDEgPDwgOCkKIApAQCAtNjM3LDkgKzYwOSw4IEBACiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUWDJfR0FURV9DVFJMX01BU0sJCQkoMSA8PCAxMCkKIAogLyoKLSAqIFVzZWQgYnkgQ01fRElWX00yX0RQTExfQUJFLCBDTV9ESVZfTTJfRFBMTF9DT1JFLAotICogQ01fRElWX00yX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9ESVZfTTJfRFBMTF9ERFJQSFksIENNX0RJVl9NMl9EUExMX01QVSwKLSAqIENNX0RJVl9NMl9EUExMX1BFUiwgQ01fRElWX00yX0RQTExfVU5JUFJPCisgKiBVc2VkIGJ5IENNX0RJVl9NMl9EUExMX0FCRSwgQ01fRElWX00yX0RQTExfQ09SRSwgQ01fRElWX00yX0RQTExfRERSUEhZLAorICogQ01fRElWX00yX0RQTExfTVBVLCBDTV9ESVZfTTJfRFBMTF9QRVIsIENNX0RJVl9NMl9EUExMX1VOSVBSTwogICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVl9TSElGVAkJCQkwCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVl9NQVNLCQkJCSgweDFmIDw8IDApCkBAIC02NDksOSArNjIwLDggQEAKICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRfRElWXzBfNl9NQVNLCQkJKDB4N2YgPDwgMCkKIAogLyoKLSAqIFVzZWQgYnkgQ01fRElWX00yX0RQTExfQUJFLCBDTV9ESVZfTTJfRFBMTF9DT1JFLAotICogQ01fRElWX00yX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9ESVZfTTJfRFBMTF9ERFJQSFksIENNX0RJVl9NMl9EUExMX01QVSwKLSAqIENNX0RJVl9NMl9EUExMX1BFUiwgQ01fRElWX00yX0RQTExfVU5JUFJPCisgKiBVc2VkIGJ5IENNX0RJVl9NMl9EUExMX0FCRSwgQ01fRElWX00yX0RQTExfQ09SRSwgQ01fRElWX00yX0RQTExfRERSUEhZLAorICogQ01fRElWX00yX0RQTExfTVBVLCBDTV9ESVZfTTJfRFBMTF9QRVIsIENNX0RJVl9NMl9EUExMX1VOSVBSTwogICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVkNIQUNLX1NISUZUCQkJNQogI2RlZmluZSBPTUFQNDQzMF9EUExMX0NMS09VVF9ESVZDSEFDS19NQVNLCQkJKDEgPDwgNSkKQEAgLTY2MSwyOSArNjMxLDI4IEBACiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVkNIQUNLX00yX1VTQl9NQVNLCQkoMSA8PCA3KQogCiAvKgotICogVXNlZCBieSBDTV9ESVZfTTJfRFBMTF9BQkUsIENNX0RJVl9NMl9EUExMX0NPUkUsCi0gKiBDTV9ESVZfTTJfRFBMTF9DT1JFX1JFU1RPUkUsIENNX0RJVl9NMl9EUExMX0REUlBIWSwgQ01fRElWX00yX0RQTExfTVBVLAotICogQ01fRElWX00yX0RQTExfUEVSLCBDTV9ESVZfTTJfRFBMTF9VU0IKKyAqIFVzZWQgYnkgQ01fRElWX00yX0RQTExfQUJFLCBDTV9ESVZfTTJfRFBMTF9DT1JFLCBDTV9ESVZfTTJfRFBMTF9ERFJQSFksCisgKiBDTV9ESVZfTTJfRFBMTF9NUFUsIENNX0RJVl9NMl9EUExMX1BFUiwgQ01fRElWX00yX0RQTExfVVNCCiAgKi8KICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRfR0FURV9DVFJMX1NISUZUCQkJOAogI2RlZmluZSBPTUFQNDQzMF9EUExMX0NMS09VVF9HQVRFX0NUUkxfTUFTSwkJCSgxIDw8IDgpCiAKLS8qIFVzZWQgYnkgQ01fU0hBRE9XX0ZSRVFfQ09ORklHMSwgQ01fU0hBRE9XX0ZSRVFfQ09ORklHMV9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX1NIQURPV19GUkVRX0NPTkZJRzEgKi8KICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DT1JFX0RQTExfRU5fU0hJRlQJCQk4CiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ09SRV9EUExMX0VOX01BU0sJCQkJKDB4NyA8PCA4KQogCi0vKiBVc2VkIGJ5IENNX1NIQURPV19GUkVRX0NPTkZJRzEsIENNX1NIQURPV19GUkVRX0NPTkZJRzFfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcxICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ09SRV9NMl9ESVZfU0hJRlQJCQkJMTEKICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DT1JFX00yX0RJVl9NQVNLCQkJCSgweDFmIDw8IDExKQogCi0vKiBVc2VkIGJ5IENNX1NIQURPV19GUkVRX0NPTkZJRzIsIENNX1NIQURPV19GUkVRX0NPTkZJRzJfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcyICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ09SRV9NNV9ESVZfU0hJRlQJCQkJMwogI2RlZmluZSBPTUFQNDQzMF9EUExMX0NPUkVfTTVfRElWX01BU0sJCQkJKDB4MWYgPDwgMykKIAogLyoKLSAqIFVzZWQgYnkgQ01fQ0xLU0VMX0RQTExfQUJFLCBDTV9DTEtTRUxfRFBMTF9DT1JFLAotICogQ01fQ0xLU0VMX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9DTEtTRUxfRFBMTF9ERFJQSFksIENNX0NMS1NFTF9EUExMX0lWQSwKLSAqIENNX0NMS1NFTF9EUExMX01QVSwgQ01fQ0xLU0VMX0RQTExfUEVSLCBDTV9DTEtTRUxfRFBMTF9VTklQUk8KKyAqIFVzZWQgYnkgQ01fQ0xLU0VMX0RQTExfQUJFLCBDTV9DTEtTRUxfRFBMTF9DT1JFLCBDTV9DTEtTRUxfRFBMTF9ERFJQSFksCisgKiBDTV9DTEtTRUxfRFBMTF9JVkEsIENNX0NMS1NFTF9EUExMX01QVSwgQ01fQ0xLU0VMX0RQTExfUEVSLAorICogQ01fQ0xLU0VMX0RQTExfVU5JUFJPCiAgKi8KICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9ESVZfU0hJRlQJCQkJCTAKICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9ESVZfTUFTSwkJCQkJKDB4N2YgPDwgMCkKQEAgLTY5Myw5ICs2NjIsOCBAQAogI2RlZmluZSBPTUFQNDQzMF9EUExMX0RJVl8wXzdfTUFTSwkJCQkoMHhmZiA8PCAwKQogCiAvKgotICogVXNlZCBieSBDTV9DTEtNT0RFX0RQTExfQUJFLCBDTV9DTEtNT0RFX0RQTExfQ09SRSwKLSAqIENNX0NMS01PREVfRFBMTF9DT1JFX1JFU1RPUkUsIENNX0NMS01PREVfRFBMTF9ERFJQSFksIENNX0NMS01PREVfRFBMTF9JVkEsCi0gKiBDTV9DTEtNT0RFX0RQTExfTVBVLCBDTV9DTEtNT0RFX0RQTExfUEVSCisgKiBVc2VkIGJ5IENNX0NMS01PREVfRFBMTF9BQkUsIENNX0NMS01PREVfRFBMTF9DT1JFLCBDTV9DTEtNT0RFX0RQTExfRERSUEhZLAorICogQ01fQ0xLTU9ERV9EUExMX0lWQSwgQ01fQ0xLTU9ERV9EUExMX01QVSwgQ01fQ0xLTU9ERV9EUExMX1BFUgogICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfRFJJRlRHVUFSRF9FTl9TSElGVAkJCTgKICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9EUklGVEdVQVJEX0VOX01BU0sJCQkoMSA8PCA4KQpAQCAtNzA1LDI2ICs2NzMsMjUgQEAKICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9EUklGVEdVQVJEX0VOXzNfM19NQVNLCQkJKDEgPDwgMykKIAogLyoKLSAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsCi0gKiBDTV9DTEtNT0RFX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9DTEtNT0RFX0RQTExfRERSUEhZLCBDTV9DTEtNT0RFX0RQTExfSVZBLAotICogQ01fQ0xLTU9ERV9EUExMX01QVSwgQ01fQ0xLTU9ERV9EUExMX1BFUiwgQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywKLSAqIENNX0NMS01PREVfRFBMTF9VU0IKKyAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsIENNX0NMS01PREVfRFBMTF9ERFJQSFksCisgKiBDTV9DTEtNT0RFX0RQTExfSVZBLCBDTV9DTEtNT0RFX0RQTExfTVBVLCBDTV9DTEtNT0RFX0RQTExfUEVSLAorICogQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywgQ01fQ0xLTU9ERV9EUExMX1VTQgogICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfRU5fU0hJRlQJCQkJCTAKICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9FTl9NQVNLCQkJCQkoMHg3IDw8IDApCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0NMS01PREVfRFBMTF9BQkUsIENNX0NMS01PREVfRFBMTF9DT1JFLAotICogQ01fQ0xLTU9ERV9EUExMX0NPUkVfUkVTVE9SRSwgQ01fQ0xLTU9ERV9EUExMX0REUlBIWSwgQ01fQ0xLTU9ERV9EUExMX0lWQSwKLSAqIENNX0NMS01PREVfRFBMTF9NUFUsIENNX0NMS01PREVfRFBMTF9QRVIsIENNX0NMS01PREVfRFBMTF9VTklQUk8KKyAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsIENNX0NMS01PREVfRFBMTF9ERFJQSFksCisgKiBDTV9DTEtNT0RFX0RQTExfSVZBLCBDTV9DTEtNT0RFX0RQTExfTVBVLCBDTV9DTEtNT0RFX0RQTExfUEVSLAorICogQ01fQ0xLTU9ERV9EUExMX1VOSVBSTwogICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfTFBNT0RFX0VOX1NISUZUCQkJCTEwCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfTFBNT0RFX0VOX01BU0sJCQkJKDEgPDwgMTApCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0NMS1NFTF9EUExMX0FCRSwgQ01fQ0xLU0VMX0RQTExfQ09SRSwKLSAqIENNX0NMS1NFTF9EUExMX0NPUkVfUkVTVE9SRSwgQ01fQ0xLU0VMX0RQTExfRERSUEhZLCBDTV9DTEtTRUxfRFBMTF9JVkEsCi0gKiBDTV9DTEtTRUxfRFBMTF9NUFUsIENNX0NMS1NFTF9EUExMX1BFUiwgQ01fQ0xLU0VMX0RQTExfVU5JUFJPCisgKiBVc2VkIGJ5IENNX0NMS1NFTF9EUExMX0FCRSwgQ01fQ0xLU0VMX0RQTExfQ09SRSwgQ01fQ0xLU0VMX0RQTExfRERSUEhZLAorICogQ01fQ0xLU0VMX0RQTExfSVZBLCBDTV9DTEtTRUxfRFBMTF9NUFUsIENNX0NMS1NFTF9EUExMX1BFUiwKKyAqIENNX0NMS1NFTF9EUExMX1VOSVBSTwogICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfTVVMVF9TSElGVAkJCQk4CiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfTVVMVF9NQVNLCQkJCQkoMHg3ZmYgPDwgOCkKQEAgLTczNCw5ICs3MDEsOSBAQAogI2RlZmluZSBPTUFQNDQzMF9EUExMX01VTFRfVVNCX01BU0sJCQkJKDB4ZmZmIDw8IDgpCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0NMS01PREVfRFBMTF9BQkUsIENNX0NMS01PREVfRFBMTF9DT1JFLAotICogQ01fQ0xLTU9ERV9EUExMX0NPUkVfUkVTVE9SRSwgQ01fQ0xLTU9ERV9EUExMX0REUlBIWSwgQ01fQ0xLTU9ERV9EUExMX0lWQSwKLSAqIENNX0NMS01PREVfRFBMTF9NUFUsIENNX0NMS01PREVfRFBMTF9QRVIsIENNX0NMS01PREVfRFBMTF9VTklQUk8KKyAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsIENNX0NMS01PREVfRFBMTF9ERFJQSFksCisgKiBDTV9DTEtNT0RFX0RQTExfSVZBLCBDTV9DTEtNT0RFX0RQTExfTVBVLCBDTV9DTEtNT0RFX0RQTExfUEVSLAorICogQ01fQ0xLTU9ERV9EUExMX1VOSVBSTwogICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfUkVHTTRYRU5fU0hJRlQJCQkJMTEKICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9SRUdNNFhFTl9NQVNLCQkJCSgxIDw8IDExKQpAQCAtNzQ2LDU1ICs3MTMsNDYgQEAKICNkZWZpbmUgT01BUDQ0MzBfRFBMTF9TRF9ESVZfTUFTSwkJCQkoMHhmZiA8PCAyNCkKIAogLyoKLSAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsCi0gKiBDTV9DTEtNT0RFX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9DTEtNT0RFX0RQTExfRERSUEhZLCBDTV9DTEtNT0RFX0RQTExfSVZBLAotICogQ01fQ0xLTU9ERV9EUExMX01QVSwgQ01fQ0xLTU9ERV9EUExMX1BFUiwgQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywKLSAqIENNX0NMS01PREVfRFBMTF9VU0IKKyAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsIENNX0NMS01PREVfRFBMTF9ERFJQSFksCisgKiBDTV9DTEtNT0RFX0RQTExfSVZBLCBDTV9DTEtNT0RFX0RQTExfTVBVLCBDTV9DTEtNT0RFX0RQTExfUEVSLAorICogQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywgQ01fQ0xLTU9ERV9EUExMX1VTQgogICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfU1NDX0FDS19TSElGVAkJCQkxMwogI2RlZmluZSBPTUFQNDQzMF9EUExMX1NTQ19BQ0tfTUFTSwkJCQkoMSA8PCAxMykKIAogLyoKLSAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsCi0gKiBDTV9DTEtNT0RFX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9DTEtNT0RFX0RQTExfRERSUEhZLCBDTV9DTEtNT0RFX0RQTExfSVZBLAotICogQ01fQ0xLTU9ERV9EUExMX01QVSwgQ01fQ0xLTU9ERV9EUExMX1BFUiwgQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywKLSAqIENNX0NMS01PREVfRFBMTF9VU0IKKyAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsIENNX0NMS01PREVfRFBMTF9ERFJQSFksCisgKiBDTV9DTEtNT0RFX0RQTExfSVZBLCBDTV9DTEtNT0RFX0RQTExfTVBVLCBDTV9DTEtNT0RFX0RQTExfUEVSLAorICogQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywgQ01fQ0xLTU9ERV9EUExMX1VTQgogICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfU1NDX0RPV05TUFJFQURfU0hJRlQJCQkxNAogI2RlZmluZSBPTUFQNDQzMF9EUExMX1NTQ19ET1dOU1BSRUFEX01BU0sJCQkoMSA8PCAxNCkKIAogLyoKLSAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsCi0gKiBDTV9DTEtNT0RFX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9DTEtNT0RFX0RQTExfRERSUEhZLCBDTV9DTEtNT0RFX0RQTExfSVZBLAotICogQ01fQ0xLTU9ERV9EUExMX01QVSwgQ01fQ0xLTU9ERV9EUExMX1BFUiwgQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywKLSAqIENNX0NMS01PREVfRFBMTF9VU0IKKyAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsIENNX0NMS01PREVfRFBMTF9ERFJQSFksCisgKiBDTV9DTEtNT0RFX0RQTExfSVZBLCBDTV9DTEtNT0RFX0RQTExfTVBVLCBDTV9DTEtNT0RFX0RQTExfUEVSLAorICogQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywgQ01fQ0xLTU9ERV9EUExMX1VTQgogICovCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfU1NDX0VOX1NISUZUCQkJCTEyCiAjZGVmaW5lIE9NQVA0NDMwX0RQTExfU1NDX0VOX01BU0sJCQkJKDEgPDwgMTIpCiAKLS8qCi0gKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCwgQ01fTDNfMl9EWU5BTUlDREVQX1JFU1RPUkUsIENNX0w0Q0ZHX0RZTkFNSUNERVAsCi0gKiBDTV9MNENGR19EWU5BTUlDREVQX1JFU1RPUkUsIENNX0w0UEVSX0RZTkFNSUNERVAsIENNX0w0UEVSX0RZTkFNSUNERVBfUkVTVE9SRQotICovCisvKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCwgQ01fTDRDRkdfRFlOQU1JQ0RFUCwgQ01fTDRQRVJfRFlOQU1JQ0RFUCAqLwogI2RlZmluZSBPTUFQNDQzMF9EU1NfRFlOREVQX1NISUZUCQkJCTgKICNkZWZpbmUgT01BUDQ0MzBfRFNTX0RZTkRFUF9NQVNLCQkJCSgxIDw8IDgpCiAKLS8qCi0gKiBVc2VkIGJ5IENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQLAotICogQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRQotICovCisvKiBVc2VkIGJ5IENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQICovCiAjZGVmaW5lIE9NQVA0NDMwX0RTU19TVEFUREVQX1NISUZUCQkJCTgKICNkZWZpbmUgT01BUDQ0MzBfRFNTX1NUQVRERVBfTUFTSwkJCQkoMSA8PCA4KQogCi0vKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCwgQ01fTDNfMl9EWU5BTUlDREVQX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNfMl9EWU5BTUlDREVQICovCiAjZGVmaW5lIE9NQVA0NDMwX0RVQ0FUSV9EWU5ERVBfU0hJRlQJCQkJMAogI2RlZmluZSBPTUFQNDQzMF9EVUNBVElfRFlOREVQX01BU0sJCQkJKDEgPDwgMCkKIAotLyogVXNlZCBieSBDTV9NUFVfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9NUFVfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUCAqLwogI2RlZmluZSBPTUFQNDQzMF9EVUNBVElfU1RBVERFUF9TSElGVAkJCQkwCiAjZGVmaW5lIE9NQVA0NDMwX0RVQ0FUSV9TVEFUREVQX01BU0sJCQkJKDEgPDwgMCkKIAotLyogVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcxLCBDTV9TSEFET1dfRlJFUV9DT05GSUcxX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fU0hBRE9XX0ZSRVFfQ09ORklHMSAqLwogI2RlZmluZSBPTUFQNDQzMF9GUkVRX1VQREFURV9TSElGVAkJCQkwCiAjZGVmaW5lIE9NQVA0NDMwX0ZSRVFfVVBEQVRFX01BU0sJCQkJKDEgPDwgMCkKIApAQCAtODAyLDcgKzc2MCw3IEBACiAjZGVmaW5lIE9NQVA0NDMwX0ZVTkNfU0hJRlQJCQkJCTE2CiAjZGVmaW5lIE9NQVA0NDMwX0ZVTkNfTUFTSwkJCQkJKDB4ZmZmIDw8IDE2KQogCi0vKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCwgQ01fTDNfMl9EWU5BTUlDREVQX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNfMl9EWU5BTUlDREVQICovCiAjZGVmaW5lIE9NQVA0NDMwX0dGWF9EWU5ERVBfU0hJRlQJCQkJMTAKICNkZWZpbmUgT01BUDQ0MzBfR0ZYX0RZTkRFUF9NQVNLCQkJCSgxIDw8IDEwKQogCkBAIC04MTAsMTE5ICs3NjgsOTUgQEAKICNkZWZpbmUgT01BUDQ0MzBfR0ZYX1NUQVRERVBfU0hJRlQJCQkJMTAKICNkZWZpbmUgT01BUDQ0MzBfR0ZYX1NUQVRERVBfTUFTSwkJCQkoMSA8PCAxMCkKIAotLyogVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcyLCBDTV9TSEFET1dfRlJFUV9DT05GSUcyX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fU0hBRE9XX0ZSRVFfQ09ORklHMiAqLwogI2RlZmluZSBPTUFQNDQzMF9HUE1DX0ZSRVFfVVBEQVRFX1NISUZUCQkJCTAKICNkZWZpbmUgT01BUDQ0MzBfR1BNQ19GUkVRX1VQREFURV9NQVNLCQkJCSgxIDw8IDApCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NNF9EUExMX0NPUkUsIENNX0RJVl9NNF9EUExMX0NPUkVfUkVTVE9SRSwKLSAqIENNX0RJVl9NNF9EUExMX0REUlBIWSwgQ01fRElWX000X0RQTExfSVZBLCBDTV9ESVZfTTRfRFBMTF9QRVIKKyAqIFVzZWQgYnkgQ01fRElWX000X0RQTExfQ09SRSwgQ01fRElWX000X0RQTExfRERSUEhZLCBDTV9ESVZfTTRfRFBMTF9JVkEsCisgKiBDTV9ESVZfTTRfRFBMTF9QRVIKICAqLwogI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUMV9ESVZfU0hJRlQJCQkwCiAjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQxX0RJVl9NQVNLCQkJKDB4MWYgPDwgMCkKIAogLyoKLSAqIFVzZWQgYnkgQ01fRElWX000X0RQTExfQ09SRSwgQ01fRElWX000X0RQTExfQ09SRV9SRVNUT1JFLAotICogQ01fRElWX000X0RQTExfRERSUEhZLCBDTV9ESVZfTTRfRFBMTF9JVkEsIENNX0RJVl9NNF9EUExMX1BFUgorICogVXNlZCBieSBDTV9ESVZfTTRfRFBMTF9DT1JFLCBDTV9ESVZfTTRfRFBMTF9ERFJQSFksIENNX0RJVl9NNF9EUExMX0lWQSwKKyAqIENNX0RJVl9NNF9EUExMX1BFUgogICovCiAjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQxX0RJVkNIQUNLX1NISUZUCQk1CiAjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQxX0RJVkNIQUNLX01BU0sJCSgxIDw8IDUpCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NNF9EUExMX0NPUkUsIENNX0RJVl9NNF9EUExMX0NPUkVfUkVTVE9SRSwKLSAqIENNX0RJVl9NNF9EUExMX0REUlBIWSwgQ01fRElWX000X0RQTExfSVZBLCBDTV9ESVZfTTRfRFBMTF9QRVIKKyAqIFVzZWQgYnkgQ01fRElWX000X0RQTExfQ09SRSwgQ01fRElWX000X0RQTExfRERSUEhZLCBDTV9ESVZfTTRfRFBMTF9JVkEsCisgKiBDTV9ESVZfTTRfRFBMTF9QRVIKICAqLwogI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUMV9HQVRFX0NUUkxfU0hJRlQJCTgKICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDFfR0FURV9DVFJMX01BU0sJCSgxIDw8IDgpCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NNF9EUExMX0NPUkUsIENNX0RJVl9NNF9EUExMX0NPUkVfUkVTVE9SRSwKLSAqIENNX0RJVl9NNF9EUExMX0REUlBIWSwgQ01fRElWX000X0RQTExfSVZBLCBDTV9ESVZfTTRfRFBMTF9QRVIKKyAqIFVzZWQgYnkgQ01fRElWX000X0RQTExfQ09SRSwgQ01fRElWX000X0RQTExfRERSUEhZLCBDTV9ESVZfTTRfRFBMTF9JVkEsCisgKiBDTV9ESVZfTTRfRFBMTF9QRVIKICAqLwogI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUMV9QV0ROX1NISUZUCQkJMTIKICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDFfUFdETl9NQVNLCQkJKDEgPDwgMTIpCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NNV9EUExMX0NPUkUsIENNX0RJVl9NNV9EUExMX0NPUkVfUkVTVE9SRSwKLSAqIENNX0RJVl9NNV9EUExMX0REUlBIWSwgQ01fRElWX001X0RQTExfSVZBLCBDTV9ESVZfTTVfRFBMTF9QRVIKKyAqIFVzZWQgYnkgQ01fRElWX001X0RQTExfQ09SRSwgQ01fRElWX001X0RQTExfRERSUEhZLCBDTV9ESVZfTTVfRFBMTF9JVkEsCisgKiBDTV9ESVZfTTVfRFBMTF9QRVIKICAqLwogI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUMl9ESVZfU0hJRlQJCQkwCiAjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQyX0RJVl9NQVNLCQkJKDB4MWYgPDwgMCkKIAogLyoKLSAqIFVzZWQgYnkgQ01fRElWX001X0RQTExfQ09SRSwgQ01fRElWX001X0RQTExfQ09SRV9SRVNUT1JFLAotICogQ01fRElWX001X0RQTExfRERSUEhZLCBDTV9ESVZfTTVfRFBMTF9JVkEsIENNX0RJVl9NNV9EUExMX1BFUgorICogVXNlZCBieSBDTV9ESVZfTTVfRFBMTF9DT1JFLCBDTV9ESVZfTTVfRFBMTF9ERFJQSFksIENNX0RJVl9NNV9EUExMX0lWQSwKKyAqIENNX0RJVl9NNV9EUExMX1BFUgogICovCiAjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQyX0RJVkNIQUNLX1NISUZUCQk1CiAjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQyX0RJVkNIQUNLX01BU0sJCSgxIDw8IDUpCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NNV9EUExMX0NPUkUsIENNX0RJVl9NNV9EUExMX0NPUkVfUkVTVE9SRSwKLSAqIENNX0RJVl9NNV9EUExMX0REUlBIWSwgQ01fRElWX001X0RQTExfSVZBLCBDTV9ESVZfTTVfRFBMTF9QRVIKKyAqIFVzZWQgYnkgQ01fRElWX001X0RQTExfQ09SRSwgQ01fRElWX001X0RQTExfRERSUEhZLCBDTV9ESVZfTTVfRFBMTF9JVkEsCisgKiBDTV9ESVZfTTVfRFBMTF9QRVIKICAqLwogI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUMl9HQVRFX0NUUkxfU0hJRlQJCTgKICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDJfR0FURV9DVFJMX01BU0sJCSgxIDw8IDgpCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NNV9EUExMX0NPUkUsIENNX0RJVl9NNV9EUExMX0NPUkVfUkVTVE9SRSwKLSAqIENNX0RJVl9NNV9EUExMX0REUlBIWSwgQ01fRElWX001X0RQTExfSVZBLCBDTV9ESVZfTTVfRFBMTF9QRVIKKyAqIFVzZWQgYnkgQ01fRElWX001X0RQTExfQ09SRSwgQ01fRElWX001X0RQTExfRERSUEhZLCBDTV9ESVZfTTVfRFBMTF9JVkEsCisgKiBDTV9ESVZfTTVfRFBMTF9QRVIKICAqLwogI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUMl9QV0ROX1NISUZUCQkJMTIKICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDJfUFdETl9NQVNLCQkJKDEgPDwgMTIpCiAKLS8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NNl9EUExMX0NPUkUsIENNX0RJVl9NNl9EUExMX0NPUkVfUkVTVE9SRSwKLSAqIENNX0RJVl9NNl9EUExMX0REUlBIWSwgQ01fRElWX002X0RQTExfUEVSCi0gKi8KKy8qIFVzZWQgYnkgQ01fRElWX002X0RQTExfQ09SRSwgQ01fRElWX002X0RQTExfRERSUEhZLCBDTV9ESVZfTTZfRFBMTF9QRVIgKi8KICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDNfRElWX1NISUZUCQkJMAogI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUM19ESVZfTUFTSwkJCSgweDFmIDw8IDApCiAKLS8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NNl9EUExMX0NPUkUsIENNX0RJVl9NNl9EUExMX0NPUkVfUkVTVE9SRSwKLSAqIENNX0RJVl9NNl9EUExMX0REUlBIWSwgQ01fRElWX002X0RQTExfUEVSCi0gKi8KKy8qIFVzZWQgYnkgQ01fRElWX002X0RQTExfQ09SRSwgQ01fRElWX002X0RQTExfRERSUEhZLCBDTV9ESVZfTTZfRFBMTF9QRVIgKi8KICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDNfRElWQ0hBQ0tfU0hJRlQJCTUKICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDNfRElWQ0hBQ0tfTUFTSwkJKDEgPDwgNSkKIAotLyoKLSAqIFVzZWQgYnkgQ01fRElWX002X0RQTExfQ09SRSwgQ01fRElWX002X0RQTExfQ09SRV9SRVNUT1JFLAotICogQ01fRElWX002X0RQTExfRERSUEhZLCBDTV9ESVZfTTZfRFBMTF9QRVIKLSAqLworLyogVXNlZCBieSBDTV9ESVZfTTZfRFBMTF9DT1JFLCBDTV9ESVZfTTZfRFBMTF9ERFJQSFksIENNX0RJVl9NNl9EUExMX1BFUiAqLwogI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUM19HQVRFX0NUUkxfU0hJRlQJCTgKICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDNfR0FURV9DVFJMX01BU0sJCSgxIDw8IDgpCiAKLS8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NNl9EUExMX0NPUkUsIENNX0RJVl9NNl9EUExMX0NPUkVfUkVTVE9SRSwKLSAqIENNX0RJVl9NNl9EUExMX0REUlBIWSwgQ01fRElWX002X0RQTExfUEVSCi0gKi8KKy8qIFVzZWQgYnkgQ01fRElWX002X0RQTExfQ09SRSwgQ01fRElWX002X0RQTExfRERSUEhZLCBDTV9ESVZfTTZfRFBMTF9QRVIgKi8KICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDNfUFdETl9TSElGVAkJCTEyCiAjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQzX1BXRE5fTUFTSwkJCSgxIDw8IDEyKQogCi0vKgotICogVXNlZCBieSBDTV9ESVZfTTdfRFBMTF9DT1JFLCBDTV9ESVZfTTdfRFBMTF9DT1JFX1JFU1RPUkUsCi0gKiBDTV9ESVZfTTdfRFBMTF9QRVIKLSAqLworLyogVXNlZCBieSBDTV9ESVZfTTdfRFBMTF9DT1JFLCBDTV9ESVZfTTdfRFBMTF9QRVIgKi8KICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDRfRElWX1NISUZUCQkJMAogI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUNF9ESVZfTUFTSwkJCSgweDFmIDw8IDApCiAKLS8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NN19EUExMX0NPUkUsIENNX0RJVl9NN19EUExMX0NPUkVfUkVTVE9SRSwKLSAqIENNX0RJVl9NN19EUExMX1BFUgotICovCisvKiBVc2VkIGJ5IENNX0RJVl9NN19EUExMX0NPUkUsIENNX0RJVl9NN19EUExMX1BFUiAqLwogI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUNF9ESVZDSEFDS19TSElGVAkJNQogI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUNF9ESVZDSEFDS19NQVNLCQkoMSA8PCA1KQogCi0vKgotICogVXNlZCBieSBDTV9ESVZfTTdfRFBMTF9DT1JFLCBDTV9ESVZfTTdfRFBMTF9DT1JFX1JFU1RPUkUsCi0gKiBDTV9ESVZfTTdfRFBMTF9QRVIKLSAqLworLyogVXNlZCBieSBDTV9ESVZfTTdfRFBMTF9DT1JFLCBDTV9ESVZfTTdfRFBMTF9QRVIgKi8KICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDRfR0FURV9DVFJMX1NISUZUCQk4CiAjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQ0X0dBVEVfQ1RSTF9NQVNLCQkoMSA8PCA4KQogCi0vKgotICogVXNlZCBieSBDTV9ESVZfTTdfRFBMTF9DT1JFLCBDTV9ESVZfTTdfRFBMTF9DT1JFX1JFU1RPUkUsCi0gKiBDTV9ESVZfTTdfRFBMTF9QRVIKLSAqLworLyogVXNlZCBieSBDTV9ESVZfTTdfRFBMTF9DT1JFLCBDTV9ESVZfTTdfRFBMTF9QRVIgKi8KICNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDRfUFdETl9TSElGVAkJCTEyCiAjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQ0X1BXRE5fTUFTSwkJCSgxIDw8IDEyKQogCkBAIC05MzQsOCArODY4LDcgQEAKICAqIENNMV9BQkVfVElNRVI4X0NMS0NUUkwsIENNMV9BQkVfV0RUM19DTEtDVFJMLCBDTV9BTFdPTl9NRE1JTlRDX0NMS0NUUkwsCiAgKiBDTV9BTFdPTl9TUl9DT1JFX0NMS0NUUkwsIENNX0FMV09OX1NSX0lWQV9DTEtDVFJMLCBDTV9BTFdPTl9TUl9NUFVfQ0xLQ1RSTCwKICAqIENNX0NBTV9GRElGX0NMS0NUUkwsIENNX0NBTV9JU1NfQ0xLQ1RSTCwgQ01fQ0VGVVNFX0NFRlVTRV9DTEtDVFJMLAotICogQ01fQ00xX1BST0ZJTElOR19DTEtDVFJMLCBDTV9DTTFfUFJPRklMSU5HX0NMS0NUUkxfUkVTVE9SRSwKLSAqIENNX0NNMl9QUk9GSUxJTkdfQ0xLQ1RSTCwgQ01fQ00yX1BST0ZJTElOR19DTEtDVFJMX1JFU1RPUkUsCisgKiBDTV9DTTFfUFJPRklMSU5HX0NMS0NUUkwsIENNX0NNMl9QUk9GSUxJTkdfQ0xLQ1RSTCwKICAqIENNX0QyRF9NT0RFTV9JQ1JfQ0xLQ1RSTCwgQ01fRDJEX1NBRDJEX0NMS0NUUkwsIENNX0QyRF9TQUQyRF9GV19DTEtDVFJMLAogICogQ01fRFNTX0RFSVNTX0NMS0NUUkwsIENNX0RTU19EU1NfQ0xLQ1RSTCwgQ01fRFVDQVRJX0RVQ0FUSV9DTEtDVFJMLAogICogQ01fRU1VX0RFQlVHU1NfQ0xLQ1RSTCwgQ01fR0ZYX0dGWF9DTEtDVFJMLCBDTV9JVkFIRF9JVkFIRF9DTEtDVFJMLApAQCAtOTQ0LDMwICs4NzcsMjQgQEAKICAqIENNX0wzSU5JVF9NTUM2X0NMS0NUUkwsIENNX0wzSU5JVF9QMTUwMF9DTEtDVFJMLCBDTV9MM0lOSVRfUENJRVNTX0NMS0NUUkwsCiAgKiBDTV9MM0lOSVRfU0FUQV9DTEtDVFJMLCBDTV9MM0lOSVRfVFBQU1NfQ0xLQ1RSTCwgQ01fTDNJTklUX1VOSVBSTzFfQ0xLQ1RSTCwKICAqIENNX0wzSU5JVF9VU0JQSFlPQ1AyU0NQX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMLAotICogQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkxfUkVTVE9SRSwgQ01fTDNJTklUX1VTQl9IT1NUX0ZTX0NMS0NUUkwsCi0gKiBDTV9MM0lOSVRfVVNCX09UR19DTEtDVFJMLCBDTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMLAotICogQ01fTDNJTklUX1VTQl9UTExfQ0xLQ1RSTF9SRVNUT1JFLCBDTV9MM0lOSVRfWEhQSV9DTEtDVFJMLAotICogQ01fTDNJTlNUUl9MM18zX0NMS0NUUkwsIENNX0wzSU5TVFJfTDNfM19DTEtDVFJMX1JFU1RPUkUsCi0gKiBDTV9MM0lOU1RSX0wzX0lOU1RSX0NMS0NUUkwsIENNX0wzSU5TVFJfTDNfSU5TVFJfQ0xLQ1RSTF9SRVNUT1JFLAotICogQ01fTDNJTlNUUl9PQ1BfV1AxX0NMS0NUUkwsIENNX0wzSU5TVFJfT0NQX1dQMV9DTEtDVFJMX1JFU1RPUkUsCisgKiBDTV9MM0lOSVRfVVNCX0hPU1RfRlNfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9PVEdfQ0xLQ1RSTCwKKyAqIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkwsIENNX0wzSU5JVF9YSFBJX0NMS0NUUkwsIENNX0wzSU5TVFJfTDNfM19DTEtDVFJMLAorICogQ01fTDNJTlNUUl9MM19JTlNUUl9DTEtDVFJMLCBDTV9MM0lOU1RSX09DUF9XUDFfQ0xLQ1RSTCwKICAqIENNX0wzXzFfTDNfMV9DTEtDVFJMLCBDTV9MM18yX0dQTUNfQ0xLQ1RSTCwgQ01fTDNfMl9MM18yX0NMS0NUUkwsCiAgKiBDTV9MM18yX09DTUNfUkFNX0NMS0NUUkwsIENNX0w0Q0ZHX0hXX1NFTV9DTEtDVFJMLCBDTV9MNENGR19MNF9DRkdfQ0xLQ1RSTCwKICAqIENNX0w0Q0ZHX01BSUxCT1hfQ0xLQ1RSTCwgQ01fTDRDRkdfU0FSX1JPTV9DTEtDVFJMLCBDTV9MNFBFUl9BRENfQ0xLQ1RSTCwKICAqIENNX0w0UEVSX0RNVElNRVIxMF9DTEtDVFJMLCBDTV9MNFBFUl9ETVRJTUVSMTFfQ0xLQ1RSTCwKICAqIENNX0w0UEVSX0RNVElNRVIyX0NMS0NUUkwsIENNX0w0UEVSX0RNVElNRVIzX0NMS0NUUkwsCiAgKiBDTV9MNFBFUl9ETVRJTUVSNF9DTEtDVFJMLCBDTV9MNFBFUl9ETVRJTUVSOV9DTEtDVFJMLCBDTV9MNFBFUl9FTE1fQ0xLQ1RSTCwKLSAqIENNX0w0UEVSX0dQSU8yX0NMS0NUUkwsIENNX0w0UEVSX0dQSU8yX0NMS0NUUkxfUkVTVE9SRSwKLSAqIENNX0w0UEVSX0dQSU8zX0NMS0NUUkwsIENNX0w0UEVSX0dQSU8zX0NMS0NUUkxfUkVTVE9SRSwKLSAqIENNX0w0UEVSX0dQSU80X0NMS0NUUkwsIENNX0w0UEVSX0dQSU80X0NMS0NUUkxfUkVTVE9SRSwKLSAqIENNX0w0UEVSX0dQSU81X0NMS0NUUkwsIENNX0w0UEVSX0dQSU81X0NMS0NUUkxfUkVTVE9SRSwKLSAqIENNX0w0UEVSX0dQSU82X0NMS0NUUkwsIENNX0w0UEVSX0dQSU82X0NMS0NUUkxfUkVTVE9SRSwKLSAqIENNX0w0UEVSX0hEUTFXX0NMS0NUUkwsIENNX0w0UEVSX0hFQ0MxX0NMS0NUUkwsIENNX0w0UEVSX0hFQ0MyX0NMS0NUUkwsCi0gKiBDTV9MNFBFUl9JMkMxX0NMS0NUUkwsIENNX0w0UEVSX0kyQzJfQ0xLQ1RSTCwgQ01fTDRQRVJfSTJDM19DTEtDVFJMLAotICogQ01fTDRQRVJfSTJDNF9DTEtDVFJMLCBDTV9MNFBFUl9JMkM1X0NMS0NUUkwsIENNX0w0UEVSX0w0UEVSX0NMS0NUUkwsCi0gKiBDTV9MNFBFUl9NQ0FTUDJfQ0xLQ1RSTCwgQ01fTDRQRVJfTUNBU1AzX0NMS0NUUkwsIENNX0w0UEVSX01DQlNQNF9DTEtDVFJMLAotICogQ01fTDRQRVJfTUNTUEkxX0NMS0NUUkwsIENNX0w0UEVSX01DU1BJMl9DTEtDVFJMLCBDTV9MNFBFUl9NQ1NQSTNfQ0xLQ1RSTCwKLSAqIENNX0w0UEVSX01DU1BJNF9DTEtDVFJMLCBDTV9MNFBFUl9NR0FURV9DTEtDVFJMLCBDTV9MNFBFUl9NTUNTRDNfQ0xLQ1RSTCwKLSAqIENNX0w0UEVSX01NQ1NENF9DTEtDVFJMLCBDTV9MNFBFUl9NTUNTRDVfQ0xLQ1RSTCwgQ01fTDRQRVJfTVNQUk9IR19DTEtDVFJMLAorICogQ01fTDRQRVJfR1BJTzJfQ0xLQ1RSTCwgQ01fTDRQRVJfR1BJTzNfQ0xLQ1RSTCwgQ01fTDRQRVJfR1BJTzRfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX0dQSU81X0NMS0NUUkwsIENNX0w0UEVSX0dQSU82X0NMS0NUUkwsIENNX0w0UEVSX0hEUTFXX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9IRUNDMV9DTEtDVFJMLCBDTV9MNFBFUl9IRUNDMl9DTEtDVFJMLCBDTV9MNFBFUl9JMkMxX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9JMkMyX0NMS0NUUkwsIENNX0w0UEVSX0kyQzNfQ0xLQ1RSTCwgQ01fTDRQRVJfSTJDNF9DTEtDVFJMLAorICogQ01fTDRQRVJfSTJDNV9DTEtDVFJMLCBDTV9MNFBFUl9MNFBFUl9DTEtDVFJMLCBDTV9MNFBFUl9NQ0FTUDJfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX01DQVNQM19DTEtDVFJMLCBDTV9MNFBFUl9NQ0JTUDRfQ0xLQ1RSTCwgQ01fTDRQRVJfTUNTUEkxX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9NQ1NQSTJfQ0xLQ1RSTCwgQ01fTDRQRVJfTUNTUEkzX0NMS0NUUkwsIENNX0w0UEVSX01DU1BJNF9DTEtDVFJMLAorICogQ01fTDRQRVJfTUdBVEVfQ0xLQ1RSTCwgQ01fTDRQRVJfTU1DU0QzX0NMS0NUUkwsIENNX0w0UEVSX01NQ1NENF9DTEtDVFJMLAorICogQ01fTDRQRVJfTU1DU0Q1X0NMS0NUUkwsIENNX0w0UEVSX01TUFJPSEdfQ0xLQ1RSTCwKICAqIENNX0w0UEVSX1NMSU1CVVMyX0NMS0NUUkwsIENNX0w0UEVSX1VBUlQxX0NMS0NUUkwsIENNX0w0UEVSX1VBUlQyX0NMS0NUUkwsCiAgKiBDTV9MNFBFUl9VQVJUM19DTEtDVFJMLCBDTV9MNFBFUl9VQVJUNF9DTEtDVFJMLCBDTV9MNFNFQ19BRVMxX0NMS0NUUkwsCiAgKiBDTV9MNFNFQ19BRVMyX0NMS0NUUkwsIENNX0w0U0VDX0NSWVBUT0RNQV9DTEtDVFJMLCBDTV9MNFNFQ19ERVMzREVTX0NMS0NUUkwsCkBAIC05ODMsMTY2ICs5MTAsMTQ4IEBACiAjZGVmaW5lIE9NQVA0NDMwX0lETEVTVF9TSElGVAkJCQkJMTYKICNkZWZpbmUgT01BUDQ0MzBfSURMRVNUX01BU0sJCQkJCSgweDMgPDwgMTYpCiAKLS8qCi0gKiBVc2VkIGJ5IENNX0RVQ0FUSV9EWU5BTUlDREVQLCBDTV9MM18yX0RZTkFNSUNERVAsCi0gKiBDTV9MM18yX0RZTkFNSUNERVBfUkVTVE9SRSwgQ01fTDRDRkdfRFlOQU1JQ0RFUCwgQ01fTDRDRkdfRFlOQU1JQ0RFUF9SRVNUT1JFCi0gKi8KKy8qIFVzZWQgYnkgQ01fRFVDQVRJX0RZTkFNSUNERVAsIENNX0wzXzJfRFlOQU1JQ0RFUCwgQ01fTDRDRkdfRFlOQU1JQ0RFUCAqLwogI2RlZmluZSBPTUFQNDQzMF9JU1NfRFlOREVQX1NISUZUCQkJCTkKICNkZWZpbmUgT01BUDQ0MzBfSVNTX0RZTkRFUF9NQVNLCQkJCSgxIDw8IDkpCiAKIC8qCiAgKiBVc2VkIGJ5IENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQLAotICogQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRSwgQ01fVEVTTEFfU1RBVElDREVQCisgKiBDTV9URVNMQV9TVEFUSUNERVAKICAqLwogI2RlZmluZSBPTUFQNDQzMF9JU1NfU1RBVERFUF9TSElGVAkJCQk5CiAjZGVmaW5lIE9NQVA0NDMwX0lTU19TVEFUREVQX01BU0sJCQkJKDEgPDwgOSkKIAotLyogVXNlZCBieSBDTV9MM18yX0RZTkFNSUNERVAsIENNX0wzXzJfRFlOQU1JQ0RFUF9SRVNUT1JFLCBDTV9URVNMQV9EWU5BTUlDREVQICovCisvKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCwgQ01fVEVTTEFfRFlOQU1JQ0RFUCAqLwogI2RlZmluZSBPTUFQNDQzMF9JVkFIRF9EWU5ERVBfU0hJRlQJCQkJMgogI2RlZmluZSBPTUFQNDQzMF9JVkFIRF9EWU5ERVBfTUFTSwkJCQkoMSA8PCAyKQogCiAvKgotICogVXNlZCBieSBDTV9DQU1fU1RBVElDREVQLCBDTV9EMkRfU1RBVElDREVQLCBDTV9EMkRfU1RBVElDREVQX1JFU1RPUkUsCi0gKiBDTV9EU1NfU1RBVElDREVQLCBDTV9EVUNBVElfU1RBVElDREVQLCBDTV9HRlhfU1RBVElDREVQLAotICogQ01fTDNJTklUX1NUQVRJQ0RFUCwgQ01fTVBVX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVAsCi0gKiBDTV9TRE1BX1NUQVRJQ0RFUF9SRVNUT1JFLCBDTV9URVNMQV9TVEFUSUNERVAKKyAqIFVzZWQgYnkgQ01fQ0FNX1NUQVRJQ0RFUCwgQ01fRDJEX1NUQVRJQ0RFUCwgQ01fRFNTX1NUQVRJQ0RFUCwKKyAqIENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX0dGWF9TVEFUSUNERVAsIENNX0wzSU5JVF9TVEFUSUNERVAsCisgKiBDTV9NUFVfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUCwgQ01fVEVTTEFfU1RBVElDREVQCiAgKi8KICNkZWZpbmUgT01BUDQ0MzBfSVZBSERfU1RBVERFUF9TSElGVAkJCQkyCiAjZGVmaW5lIE9NQVA0NDMwX0lWQUhEX1NUQVRERVBfTUFTSwkJCQkoMSA8PCAyKQogCi0vKgotICogVXNlZCBieSBDTV9MM18yX0RZTkFNSUNERVAsIENNX0wzXzJfRFlOQU1JQ0RFUF9SRVNUT1JFLCBDTV9MNENGR19EWU5BTUlDREVQLAotICogQ01fTDRDRkdfRFlOQU1JQ0RFUF9SRVNUT1JFLCBDTV9MNFBFUl9EWU5BTUlDREVQLCBDTV9MNFBFUl9EWU5BTUlDREVQX1JFU1RPUkUKLSAqLworLyogVXNlZCBieSBDTV9MM18yX0RZTkFNSUNERVAsIENNX0w0Q0ZHX0RZTkFNSUNERVAsIENNX0w0UEVSX0RZTkFNSUNERVAgKi8KICNkZWZpbmUgT01BUDQ0MzBfTDNJTklUX0RZTkRFUF9TSElGVAkJCQk3CiAjZGVmaW5lIE9NQVA0NDMwX0wzSU5JVF9EWU5ERVBfTUFTSwkJCQkoMSA8PCA3KQogCiAvKgotICogVXNlZCBieSBDTV9EMkRfU1RBVElDREVQLCBDTV9EMkRfU1RBVElDREVQX1JFU1RPUkUsIENNX0RVQ0FUSV9TVEFUSUNERVAsCi0gKiBDTV9NUFVfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRSwKLSAqIENNX1RFU0xBX1NUQVRJQ0RFUAorICogVXNlZCBieSBDTV9EMkRfU1RBVElDREVQLCBDTV9EVUNBVElfU1RBVElDREVQLCBDTV9NUFVfU1RBVElDREVQLAorICogQ01fU0RNQV9TVEFUSUNERVAsIENNX1RFU0xBX1NUQVRJQ0RFUAogICovCiAjZGVmaW5lIE9NQVA0NDMwX0wzSU5JVF9TVEFUREVQX1NISUZUCQkJCTcKICNkZWZpbmUgT01BUDQ0MzBfTDNJTklUX1NUQVRERVBfTUFTSwkJCQkoMSA8PCA3KQogCiAvKgogICogVXNlZCBieSBDTV9EU1NfRFlOQU1JQ0RFUCwgQ01fTDNJTklUX0RZTkFNSUNERVAsIENNX0wzXzJfRFlOQU1JQ0RFUCwKLSAqIENNX0wzXzJfRFlOQU1JQ0RFUF9SRVNUT1JFLCBDTV9MNENGR19EWU5BTUlDREVQLAotICogQ01fTDRDRkdfRFlOQU1JQ0RFUF9SRVNUT1JFLCBDTV9NUFVfRFlOQU1JQ0RFUCwgQ01fVEVTTEFfRFlOQU1JQ0RFUAorICogQ01fTDRDRkdfRFlOQU1JQ0RFUCwgQ01fTVBVX0RZTkFNSUNERVAsIENNX1RFU0xBX0RZTkFNSUNERVAKICAqLwogI2RlZmluZSBPTUFQNDQzMF9MM18xX0RZTkRFUF9TSElGVAkJCQk1CiAjZGVmaW5lIE9NQVA0NDMwX0wzXzFfRFlOREVQX01BU0sJCQkJKDEgPDwgNSkKIAogLyoKLSAqIFVzZWQgYnkgQ01fQ0FNX1NUQVRJQ0RFUCwgQ01fRDJEX1NUQVRJQ0RFUCwgQ01fRDJEX1NUQVRJQ0RFUF9SRVNUT1JFLAotICogQ01fRFNTX1NUQVRJQ0RFUCwgQ01fRFVDQVRJX1NUQVRJQ0RFUCwgQ01fR0ZYX1NUQVRJQ0RFUCwgQ01fSVZBSERfU1RBVElDREVQLAorICogVXNlZCBieSBDTV9DQU1fU1RBVElDREVQLCBDTV9EMkRfU1RBVElDREVQLCBDTV9EU1NfU1RBVElDREVQLAorICogQ01fRFVDQVRJX1NUQVRJQ0RFUCwgQ01fR0ZYX1NUQVRJQ0RFUCwgQ01fSVZBSERfU1RBVElDREVQLAogICogQ01fTDNJTklUX1NUQVRJQ0RFUCwgQ01fTDRTRUNfU1RBVElDREVQLCBDTV9NUFVfU1RBVElDREVQLAotICogQ01fU0RNQV9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQX1JFU1RPUkUsIENNX1RFU0xBX1NUQVRJQ0RFUAorICogQ01fU0RNQV9TVEFUSUNERVAsIENNX1RFU0xBX1NUQVRJQ0RFUAogICovCiAjZGVmaW5lIE9NQVA0NDMwX0wzXzFfU1RBVERFUF9TSElGVAkJCQk1CiAjZGVmaW5lIE9NQVA0NDMwX0wzXzFfU1RBVERFUF9NQVNLCQkJCSgxIDw8IDUpCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0NBTV9EWU5BTUlDREVQLCBDTV9EMkRfRFlOQU1JQ0RFUCwgQ01fRDJEX0RZTkFNSUNERVBfUkVTVE9SRSwKLSAqIENNX0RVQ0FUSV9EWU5BTUlDREVQLCBDTV9FTVVfRFlOQU1JQ0RFUCwgQ01fR0ZYX0RZTkFNSUNERVAsCi0gKiBDTV9JVkFIRF9EWU5BTUlDREVQLCBDTV9MM0lOSVRfRFlOQU1JQ0RFUCwgQ01fTDNfMV9EWU5BTUlDREVQLAotICogQ01fTDNfMV9EWU5BTUlDREVQX1JFU1RPUkUsIENNX0w0Q0ZHX0RZTkFNSUNERVAsCi0gKiBDTV9MNENGR19EWU5BTUlDREVQX1JFU1RPUkUsIENNX0w0U0VDX0RZTkFNSUNERVAsIENNX1NETUFfRFlOQU1JQ0RFUAorICogVXNlZCBieSBDTV9DQU1fRFlOQU1JQ0RFUCwgQ01fRDJEX0RZTkFNSUNERVAsIENNX0RVQ0FUSV9EWU5BTUlDREVQLAorICogQ01fRU1VX0RZTkFNSUNERVAsIENNX0dGWF9EWU5BTUlDREVQLCBDTV9JVkFIRF9EWU5BTUlDREVQLAorICogQ01fTDNJTklUX0RZTkFNSUNERVAsIENNX0wzXzFfRFlOQU1JQ0RFUCwgQ01fTDRDRkdfRFlOQU1JQ0RFUCwKKyAqIENNX0w0U0VDX0RZTkFNSUNERVAsIENNX1NETUFfRFlOQU1JQ0RFUAogICovCiAjZGVmaW5lIE9NQVA0NDMwX0wzXzJfRFlOREVQX1NISUZUCQkJCTYKICNkZWZpbmUgT01BUDQ0MzBfTDNfMl9EWU5ERVBfTUFTSwkJCQkoMSA8PCA2KQogCiAvKgotICogVXNlZCBieSBDTV9DQU1fU1RBVElDREVQLCBDTV9EMkRfU1RBVElDREVQLCBDTV9EMkRfU1RBVElDREVQX1JFU1RPUkUsCi0gKiBDTV9EU1NfU1RBVElDREVQLCBDTV9EVUNBVElfU1RBVElDREVQLCBDTV9HRlhfU1RBVElDREVQLCBDTV9JVkFIRF9TVEFUSUNERVAsCisgKiBVc2VkIGJ5IENNX0NBTV9TVEFUSUNERVAsIENNX0QyRF9TVEFUSUNERVAsIENNX0RTU19TVEFUSUNERVAsCisgKiBDTV9EVUNBVElfU1RBVElDREVQLCBDTV9HRlhfU1RBVElDREVQLCBDTV9JVkFIRF9TVEFUSUNERVAsCiAgKiBDTV9MM0lOSVRfU1RBVElDREVQLCBDTV9MNFNFQ19TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAsCi0gKiBDTV9TRE1BX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRSwgQ01fVEVTTEFfU1RBVElDREVQCisgKiBDTV9TRE1BX1NUQVRJQ0RFUCwgQ01fVEVTTEFfU1RBVElDREVQCiAgKi8KICNkZWZpbmUgT01BUDQ0MzBfTDNfMl9TVEFUREVQX1NISUZUCQkJCTYKICNkZWZpbmUgT01BUDQ0MzBfTDNfMl9TVEFUREVQX01BU0sJCQkJKDEgPDwgNikKIAotLyogVXNlZCBieSBDTV9MM18xX0RZTkFNSUNERVAsIENNX0wzXzFfRFlOQU1JQ0RFUF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0wzXzFfRFlOQU1JQ0RFUCAqLwogI2RlZmluZSBPTUFQNDQzMF9MNENGR19EWU5ERVBfU0hJRlQJCQkJMTIKICNkZWZpbmUgT01BUDQ0MzBfTDRDRkdfRFlOREVQX01BU0sJCQkJKDEgPDwgMTIpCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0QyRF9TVEFUSUNERVAsIENNX0QyRF9TVEFUSUNERVBfUkVTVE9SRSwgQ01fRFVDQVRJX1NUQVRJQ0RFUCwKLSAqIENNX0wzSU5JVF9TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQLAotICogQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRSwgQ01fVEVTTEFfU1RBVElDREVQCisgKiBVc2VkIGJ5IENNX0QyRF9TVEFUSUNERVAsIENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX0wzSU5JVF9TVEFUSUNERVAsCisgKiBDTV9NUFVfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUCwgQ01fVEVTTEFfU1RBVElDREVQCiAgKi8KICNkZWZpbmUgT01BUDQ0MzBfTDRDRkdfU1RBVERFUF9TSElGVAkJCQkxMgogI2RlZmluZSBPTUFQNDQzMF9MNENGR19TVEFUREVQX01BU0sJCQkJKDEgPDwgMTIpCiAKLS8qIFVzZWQgYnkgQ01fTDNfMl9EWU5BTUlDREVQLCBDTV9MM18yX0RZTkFNSUNERVBfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MM18yX0RZTkFNSUNERVAgKi8KICNkZWZpbmUgT01BUDQ0MzBfTDRQRVJfRFlOREVQX1NISUZUCQkJCTEzCiAjZGVmaW5lIE9NQVA0NDMwX0w0UEVSX0RZTkRFUF9NQVNLCQkJCSgxIDw8IDEzKQogCiAvKgotICogVXNlZCBieSBDTV9EMkRfU1RBVElDREVQLCBDTV9EMkRfU1RBVElDREVQX1JFU1RPUkUsIENNX0RVQ0FUSV9TVEFUSUNERVAsCi0gKiBDTV9MM0lOSVRfU1RBVElDREVQLCBDTV9MNFNFQ19TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAsCi0gKiBDTV9TRE1BX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRSwgQ01fVEVTTEFfU1RBVElDREVQCisgKiBVc2VkIGJ5IENNX0QyRF9TVEFUSUNERVAsIENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX0wzSU5JVF9TVEFUSUNERVAsCisgKiBDTV9MNFNFQ19TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQLCBDTV9URVNMQV9TVEFUSUNERVAKICAqLwogI2RlZmluZSBPTUFQNDQzMF9MNFBFUl9TVEFUREVQX1NISUZUCQkJCTEzCiAjZGVmaW5lIE9NQVA0NDMwX0w0UEVSX1NUQVRERVBfTUFTSwkJCQkoMSA8PCAxMykKIAotLyoKLSAqIFVzZWQgYnkgQ01fTDNfMl9EWU5BTUlDREVQLCBDTV9MM18yX0RZTkFNSUNERVBfUkVTVE9SRSwgQ01fTDRQRVJfRFlOQU1JQ0RFUCwKLSAqIENNX0w0UEVSX0RZTkFNSUNERVBfUkVTVE9SRQotICovCisvKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCwgQ01fTDRQRVJfRFlOQU1JQ0RFUCAqLwogI2RlZmluZSBPTUFQNDQzMF9MNFNFQ19EWU5ERVBfU0hJRlQJCQkJMTQKICNkZWZpbmUgT01BUDQ0MzBfTDRTRUNfRFlOREVQX01BU0sJCQkJKDEgPDwgMTQpCiAKIC8qCiAgKiBVc2VkIGJ5IENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX0wzSU5JVF9TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAsCi0gKiBDTV9TRE1BX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRQorICogQ01fU0RNQV9TVEFUSUNERVAKICAqLwogI2RlZmluZSBPTUFQNDQzMF9MNFNFQ19TVEFUREVQX1NISUZUCQkJCTE0CiAjZGVmaW5lIE9NQVA0NDMwX0w0U0VDX1NUQVRERVBfTUFTSwkJCQkoMSA8PCAxNCkKIAotLyogVXNlZCBieSBDTV9MNENGR19EWU5BTUlDREVQLCBDTV9MNENGR19EWU5BTUlDREVQX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDRDRkdfRFlOQU1JQ0RFUCAqLwogI2RlZmluZSBPTUFQNDQzMF9MNFdLVVBfRFlOREVQX1NISUZUCQkJCTE1CiAjZGVmaW5lIE9NQVA0NDMwX0w0V0tVUF9EWU5ERVBfTUFTSwkJCQkoMSA8PCAxNSkKIAogLyoKICAqIFVzZWQgYnkgQ01fRFVDQVRJX1NUQVRJQ0RFUCwgQ01fTDNJTklUX1NUQVRJQ0RFUCwgQ01fTVBVX1NUQVRJQ0RFUCwKLSAqIENNX1NETUFfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUF9SRVNUT1JFLCBDTV9URVNMQV9TVEFUSUNERVAKKyAqIENNX1NETUFfU1RBVElDREVQLCBDTV9URVNMQV9TVEFUSUNERVAKICAqLwogI2RlZmluZSBPTUFQNDQzMF9MNFdLVVBfU1RBVERFUF9TSElGVAkJCQkxNQogI2RlZmluZSBPTUFQNDQzMF9MNFdLVVBfU1RBVERFUF9NQVNLCQkJCSgxIDw8IDE1KQogCiAvKgotICogVXNlZCBieSBDTV9EMkRfRFlOQU1JQ0RFUCwgQ01fRDJEX0RZTkFNSUNERVBfUkVTVE9SRSwgQ01fTDNfMV9EWU5BTUlDREVQLAotICogQ01fTDNfMV9EWU5BTUlDREVQX1JFU1RPUkUsIENNX0w0Q0ZHX0RZTkFNSUNERVAsCi0gKiBDTV9MNENGR19EWU5BTUlDREVQX1JFU1RPUkUsIENNX01QVV9EWU5BTUlDREVQCisgKiBVc2VkIGJ5IENNX0QyRF9EWU5BTUlDREVQLCBDTV9MM18xX0RZTkFNSUNERVAsIENNX0w0Q0ZHX0RZTkFNSUNERVAsCisgKiBDTV9NUFVfRFlOQU1JQ0RFUAogICovCiAjZGVmaW5lIE9NQVA0NDMwX01FTUlGX0RZTkRFUF9TSElGVAkJCQk0CiAjZGVmaW5lIE9NQVA0NDMwX01FTUlGX0RZTkRFUF9NQVNLCQkJCSgxIDw8IDQpCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0NBTV9TVEFUSUNERVAsIENNX0QyRF9TVEFUSUNERVAsIENNX0QyRF9TVEFUSUNERVBfUkVTVE9SRSwKLSAqIENNX0RTU19TVEFUSUNERVAsIENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX0dGWF9TVEFUSUNERVAsIENNX0lWQUhEX1NUQVRJQ0RFUCwKKyAqIFVzZWQgYnkgQ01fQ0FNX1NUQVRJQ0RFUCwgQ01fRDJEX1NUQVRJQ0RFUCwgQ01fRFNTX1NUQVRJQ0RFUCwKKyAqIENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX0dGWF9TVEFUSUNERVAsIENNX0lWQUhEX1NUQVRJQ0RFUCwKICAqIENNX0wzSU5JVF9TVEFUSUNERVAsIENNX0w0U0VDX1NUQVRJQ0RFUCwgQ01fTVBVX1NUQVRJQ0RFUCwKLSAqIENNX1NETUFfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUF9SRVNUT1JFLCBDTV9URVNMQV9TVEFUSUNERVAKKyAqIENNX1NETUFfU1RBVElDREVQLCBDTV9URVNMQV9TVEFUSUNERVAKICAqLwogI2RlZmluZSBPTUFQNDQzMF9NRU1JRl9TVEFUREVQX1NISUZUCQkJCTQKICNkZWZpbmUgT01BUDQ0MzBfTUVNSUZfU1RBVERFUF9NQVNLCQkJCSgxIDw8IDQpCiAKIC8qCiAgKiBVc2VkIGJ5IENNX1NTQ19NT0RGUkVRRElWX0RQTExfQUJFLCBDTV9TU0NfTU9ERlJFUURJVl9EUExMX0NPUkUsCi0gKiBDTV9TU0NfTU9ERlJFUURJVl9EUExMX0NPUkVfUkVTVE9SRSwgQ01fU1NDX01PREZSRVFESVZfRFBMTF9ERFJQSFksCi0gKiBDTV9TU0NfTU9ERlJFUURJVl9EUExMX0lWQSwgQ01fU1NDX01PREZSRVFESVZfRFBMTF9NUFUsCi0gKiBDTV9TU0NfTU9ERlJFUURJVl9EUExMX1BFUiwgQ01fU1NDX01PREZSRVFESVZfRFBMTF9VTklQUk8sCi0gKiBDTV9TU0NfTU9ERlJFUURJVl9EUExMX1VTQgorICogQ01fU1NDX01PREZSRVFESVZfRFBMTF9ERFJQSFksIENNX1NTQ19NT0RGUkVRRElWX0RQTExfSVZBLAorICogQ01fU1NDX01PREZSRVFESVZfRFBMTF9NUFUsIENNX1NTQ19NT0RGUkVRRElWX0RQTExfUEVSLAorICogQ01fU1NDX01PREZSRVFESVZfRFBMTF9VTklQUk8sIENNX1NTQ19NT0RGUkVRRElWX0RQTExfVVNCCiAgKi8KICNkZWZpbmUgT01BUDQ0MzBfTU9ERlJFUURJVl9FWFBPTkVOVF9TSElGVAkJCTgKICNkZWZpbmUgT01BUDQ0MzBfTU9ERlJFUURJVl9FWFBPTkVOVF9NQVNLCQkJKDB4NyA8PCA4KQogCiAvKgogICogVXNlZCBieSBDTV9TU0NfTU9ERlJFUURJVl9EUExMX0FCRSwgQ01fU1NDX01PREZSRVFESVZfRFBMTF9DT1JFLAotICogQ01fU1NDX01PREZSRVFESVZfRFBMTF9DT1JFX1JFU1RPUkUsIENNX1NTQ19NT0RGUkVRRElWX0RQTExfRERSUEhZLAotICogQ01fU1NDX01PREZSRVFESVZfRFBMTF9JVkEsIENNX1NTQ19NT0RGUkVRRElWX0RQTExfTVBVLAotICogQ01fU1NDX01PREZSRVFESVZfRFBMTF9QRVIsIENNX1NTQ19NT0RGUkVRRElWX0RQTExfVU5JUFJPLAotICogQ01fU1NDX01PREZSRVFESVZfRFBMTF9VU0IKKyAqIENNX1NTQ19NT0RGUkVRRElWX0RQTExfRERSUEhZLCBDTV9TU0NfTU9ERlJFUURJVl9EUExMX0lWQSwKKyAqIENNX1NTQ19NT0RGUkVRRElWX0RQTExfTVBVLCBDTV9TU0NfTU9ERlJFUURJVl9EUExMX1BFUiwKKyAqIENNX1NTQ19NT0RGUkVRRElWX0RQTExfVU5JUFJPLCBDTV9TU0NfTU9ERlJFUURJVl9EUExMX1VTQgogICovCiAjZGVmaW5lIE9NQVA0NDMwX01PREZSRVFESVZfTUFOVElTU0FfU0hJRlQJCQkwCiAjZGVmaW5lIE9NQVA0NDMwX01PREZSRVFESVZfTUFOVElTU0FfTUFTSwkJCSgweDdmIDw8IDApCkBAIC0xMTU1LDggKzEwNjQsNyBAQAogICogQ00xX0FCRV9USU1FUjhfQ0xLQ1RSTCwgQ00xX0FCRV9XRFQzX0NMS0NUUkwsIENNX0FMV09OX01ETUlOVENfQ0xLQ1RSTCwKICAqIENNX0FMV09OX1NSX0NPUkVfQ0xLQ1RSTCwgQ01fQUxXT05fU1JfSVZBX0NMS0NUUkwsIENNX0FMV09OX1NSX01QVV9DTEtDVFJMLAogICogQ01fQ0FNX0ZESUZfQ0xLQ1RSTCwgQ01fQ0FNX0lTU19DTEtDVFJMLCBDTV9DRUZVU0VfQ0VGVVNFX0NMS0NUUkwsCi0gKiBDTV9DTTFfUFJPRklMSU5HX0NMS0NUUkwsIENNX0NNMV9QUk9GSUxJTkdfQ0xLQ1RSTF9SRVNUT1JFLAotICogQ01fQ00yX1BST0ZJTElOR19DTEtDVFJMLCBDTV9DTTJfUFJPRklMSU5HX0NMS0NUUkxfUkVTVE9SRSwKKyAqIENNX0NNMV9QUk9GSUxJTkdfQ0xLQ1RSTCwgQ01fQ00yX1BST0ZJTElOR19DTEtDVFJMLAogICogQ01fRDJEX01PREVNX0lDUl9DTEtDVFJMLCBDTV9EMkRfU0FEMkRfQ0xLQ1RSTCwgQ01fRDJEX1NBRDJEX0ZXX0NMS0NUUkwsCiAgKiBDTV9EU1NfREVJU1NfQ0xLQ1RSTCwgQ01fRFNTX0RTU19DTEtDVFJMLCBDTV9EVUNBVElfRFVDQVRJX0NMS0NUUkwsCiAgKiBDTV9FTVVfREVCVUdTU19DTEtDVFJMLCBDTV9HRlhfR0ZYX0NMS0NUUkwsIENNX0lWQUhEX0lWQUhEX0NMS0NUUkwsCkBAIC0xMTY1LDMwICsxMDczLDI0IEBACiAgKiBDTV9MM0lOSVRfTU1DNl9DTEtDVFJMLCBDTV9MM0lOSVRfUDE1MDBfQ0xLQ1RSTCwgQ01fTDNJTklUX1BDSUVTU19DTEtDVFJMLAogICogQ01fTDNJTklUX1NBVEFfQ0xLQ1RSTCwgQ01fTDNJTklUX1RQUFNTX0NMS0NUUkwsIENNX0wzSU5JVF9VTklQUk8xX0NMS0NUUkwsCiAgKiBDTV9MM0lOSVRfVVNCUEhZT0NQMlNDUF9DTEtDVFJMLCBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTCwKLSAqIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUsIENNX0wzSU5JVF9VU0JfSE9TVF9GU19DTEtDVFJMLAotICogQ01fTDNJTklUX1VTQl9PVEdfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9UTExfQ0xLQ1RSTCwKLSAqIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkxfUkVTVE9SRSwgQ01fTDNJTklUX1hIUElfQ0xLQ1RSTCwKLSAqIENNX0wzSU5TVFJfTDNfM19DTEtDVFJMLCBDTV9MM0lOU1RSX0wzXzNfQ0xLQ1RSTF9SRVNUT1JFLAotICogQ01fTDNJTlNUUl9MM19JTlNUUl9DTEtDVFJMLCBDTV9MM0lOU1RSX0wzX0lOU1RSX0NMS0NUUkxfUkVTVE9SRSwKLSAqIENNX0wzSU5TVFJfT0NQX1dQMV9DTEtDVFJMLCBDTV9MM0lOU1RSX09DUF9XUDFfQ0xLQ1RSTF9SRVNUT1JFLAorICogQ01fTDNJTklUX1VTQl9IT1NUX0ZTX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfT1RHX0NMS0NUUkwsCisgKiBDTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMLCBDTV9MM0lOSVRfWEhQSV9DTEtDVFJMLCBDTV9MM0lOU1RSX0wzXzNfQ0xLQ1RSTCwKKyAqIENNX0wzSU5TVFJfTDNfSU5TVFJfQ0xLQ1RSTCwgQ01fTDNJTlNUUl9PQ1BfV1AxX0NMS0NUUkwsCiAgKiBDTV9MM18xX0wzXzFfQ0xLQ1RSTCwgQ01fTDNfMl9HUE1DX0NMS0NUUkwsIENNX0wzXzJfTDNfMl9DTEtDVFJMLAogICogQ01fTDNfMl9PQ01DX1JBTV9DTEtDVFJMLCBDTV9MNENGR19IV19TRU1fQ0xLQ1RSTCwgQ01fTDRDRkdfTDRfQ0ZHX0NMS0NUUkwsCiAgKiBDTV9MNENGR19NQUlMQk9YX0NMS0NUUkwsIENNX0w0Q0ZHX1NBUl9ST01fQ0xLQ1RSTCwgQ01fTDRQRVJfQURDX0NMS0NUUkwsCiAgKiBDTV9MNFBFUl9ETVRJTUVSMTBfQ0xLQ1RSTCwgQ01fTDRQRVJfRE1USU1FUjExX0NMS0NUUkwsCiAgKiBDTV9MNFBFUl9ETVRJTUVSMl9DTEtDVFJMLCBDTV9MNFBFUl9ETVRJTUVSM19DTEtDVFJMLAogICogQ01fTDRQRVJfRE1USU1FUjRfQ0xLQ1RSTCwgQ01fTDRQRVJfRE1USU1FUjlfQ0xLQ1RSTCwgQ01fTDRQRVJfRUxNX0NMS0NUUkwsCi0gKiBDTV9MNFBFUl9HUElPMl9DTEtDVFJMLCBDTV9MNFBFUl9HUElPMl9DTEtDVFJMX1JFU1RPUkUsCi0gKiBDTV9MNFBFUl9HUElPM19DTEtDVFJMLCBDTV9MNFBFUl9HUElPM19DTEtDVFJMX1JFU1RPUkUsCi0gKiBDTV9MNFBFUl9HUElPNF9DTEtDVFJMLCBDTV9MNFBFUl9HUElPNF9DTEtDVFJMX1JFU1RPUkUsCi0gKiBDTV9MNFBFUl9HUElPNV9DTEtDVFJMLCBDTV9MNFBFUl9HUElPNV9DTEtDVFJMX1JFU1RPUkUsCi0gKiBDTV9MNFBFUl9HUElPNl9DTEtDVFJMLCBDTV9MNFBFUl9HUElPNl9DTEtDVFJMX1JFU1RPUkUsCi0gKiBDTV9MNFBFUl9IRFExV19DTEtDVFJMLCBDTV9MNFBFUl9IRUNDMV9DTEtDVFJMLCBDTV9MNFBFUl9IRUNDMl9DTEtDVFJMLAotICogQ01fTDRQRVJfSTJDMV9DTEtDVFJMLCBDTV9MNFBFUl9JMkMyX0NMS0NUUkwsIENNX0w0UEVSX0kyQzNfQ0xLQ1RSTCwKLSAqIENNX0w0UEVSX0kyQzRfQ0xLQ1RSTCwgQ01fTDRQRVJfSTJDNV9DTEtDVFJMLCBDTV9MNFBFUl9MNFBFUl9DTEtDVFJMLAotICogQ01fTDRQRVJfTUNBU1AyX0NMS0NUUkwsIENNX0w0UEVSX01DQVNQM19DTEtDVFJMLCBDTV9MNFBFUl9NQ0JTUDRfQ0xLQ1RSTCwKLSAqIENNX0w0UEVSX01DU1BJMV9DTEtDVFJMLCBDTV9MNFBFUl9NQ1NQSTJfQ0xLQ1RSTCwgQ01fTDRQRVJfTUNTUEkzX0NMS0NUUkwsCi0gKiBDTV9MNFBFUl9NQ1NQSTRfQ0xLQ1RSTCwgQ01fTDRQRVJfTUdBVEVfQ0xLQ1RSTCwgQ01fTDRQRVJfTU1DU0QzX0NMS0NUUkwsCi0gKiBDTV9MNFBFUl9NTUNTRDRfQ0xLQ1RSTCwgQ01fTDRQRVJfTU1DU0Q1X0NMS0NUUkwsIENNX0w0UEVSX01TUFJPSEdfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX0dQSU8yX0NMS0NUUkwsIENNX0w0UEVSX0dQSU8zX0NMS0NUUkwsIENNX0w0UEVSX0dQSU80X0NMS0NUUkwsCisgKiBDTV9MNFBFUl9HUElPNV9DTEtDVFJMLCBDTV9MNFBFUl9HUElPNl9DTEtDVFJMLCBDTV9MNFBFUl9IRFExV19DTEtDVFJMLAorICogQ01fTDRQRVJfSEVDQzFfQ0xLQ1RSTCwgQ01fTDRQRVJfSEVDQzJfQ0xLQ1RSTCwgQ01fTDRQRVJfSTJDMV9DTEtDVFJMLAorICogQ01fTDRQRVJfSTJDMl9DTEtDVFJMLCBDTV9MNFBFUl9JMkMzX0NMS0NUUkwsIENNX0w0UEVSX0kyQzRfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX0kyQzVfQ0xLQ1RSTCwgQ01fTDRQRVJfTDRQRVJfQ0xLQ1RSTCwgQ01fTDRQRVJfTUNBU1AyX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9NQ0FTUDNfQ0xLQ1RSTCwgQ01fTDRQRVJfTUNCU1A0X0NMS0NUUkwsIENNX0w0UEVSX01DU1BJMV9DTEtDVFJMLAorICogQ01fTDRQRVJfTUNTUEkyX0NMS0NUUkwsIENNX0w0UEVSX01DU1BJM19DTEtDVFJMLCBDTV9MNFBFUl9NQ1NQSTRfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX01HQVRFX0NMS0NUUkwsIENNX0w0UEVSX01NQ1NEM19DTEtDVFJMLCBDTV9MNFBFUl9NTUNTRDRfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX01NQ1NENV9DTEtDVFJMLCBDTV9MNFBFUl9NU1BST0hHX0NMS0NUUkwsCiAgKiBDTV9MNFBFUl9TTElNQlVTMl9DTEtDVFJMLCBDTV9MNFBFUl9VQVJUMV9DTEtDVFJMLCBDTV9MNFBFUl9VQVJUMl9DTEtDVFJMLAogICogQ01fTDRQRVJfVUFSVDNfQ0xLQ1RSTCwgQ01fTDRQRVJfVUFSVDRfQ0xLQ1RSTCwgQ01fTDRTRUNfQUVTMV9DTEtDVFJMLAogICogQ01fTDRTRUNfQUVTMl9DTEtDVFJMLCBDTV9MNFNFQ19DUllQVE9ETUFfQ0xLQ1RSTCwgQ01fTDRTRUNfREVTM0RFU19DTEtDVFJMLApAQCAtMTIyMSwxMSArMTEyMyw5IEBACiAjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9DVFJMQ0xLX01BU0sJCQkJKDEgPDwgOCkKIAogLyoKLSAqIFVzZWQgYnkgQ01fTDRQRVJfR1BJTzJfQ0xLQ1RSTCwgQ01fTDRQRVJfR1BJTzJfQ0xLQ1RSTF9SRVNUT1JFLAotICogQ01fTDRQRVJfR1BJTzNfQ0xLQ1RSTCwgQ01fTDRQRVJfR1BJTzNfQ0xLQ1RSTF9SRVNUT1JFLAotICogQ01fTDRQRVJfR1BJTzRfQ0xLQ1RSTCwgQ01fTDRQRVJfR1BJTzRfQ0xLQ1RSTF9SRVNUT1JFLAotICogQ01fTDRQRVJfR1BJTzVfQ0xLQ1RSTCwgQ01fTDRQRVJfR1BJTzVfQ0xLQ1RSTF9SRVNUT1JFLAotICogQ01fTDRQRVJfR1BJTzZfQ0xLQ1RSTCwgQ01fTDRQRVJfR1BJTzZfQ0xLQ1RSTF9SRVNUT1JFLCBDTV9XS1VQX0dQSU8xX0NMS0NUUkwKKyAqIFVzZWQgYnkgQ01fTDRQRVJfR1BJTzJfQ0xLQ1RSTCwgQ01fTDRQRVJfR1BJTzNfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX0dQSU80X0NMS0NUUkwsIENNX0w0UEVSX0dQSU81X0NMS0NUUkwsIENNX0w0UEVSX0dQSU82X0NMS0NUUkwsCisgKiBDTV9XS1VQX0dQSU8xX0NMS0NUUkwKICAqLwogI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fREJDTEtfU0hJRlQJCQkJOAogI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fREJDTEtfTUFTSwkJCQkoMSA8PCA4KQpAQCAtMTI1NCwyMyArMTE1NCwyMyBAQAogI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fRkNMSzJfU0hJRlQJCQkJMTAKICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0ZDTEsyX01BU0sJCQkJKDEgPDwgMTApCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0ZVTkM0OE1DTEtfU0hJRlQJCQkxNQogI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fRlVOQzQ4TUNMS19NQVNLCQkJKDEgPDwgMTUpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0hTSUM0ODBNX1AxX0NMS19TSElGVAkJMTMKICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0hTSUM0ODBNX1AxX0NMS19NQVNLCQkJKDEgPDwgMTMpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0hTSUM0ODBNX1AyX0NMS19TSElGVAkJMTQKICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0hTSUM0ODBNX1AyX0NMS19NQVNLCQkJKDEgPDwgMTQpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0hTSUM2ME1fUDFfQ0xLX1NISUZUCQkJMTEKICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0hTSUM2ME1fUDFfQ0xLX01BU0sJCQkoMSA8PCAxMSkKIAotLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTCAqLwogI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fSFNJQzYwTV9QMl9DTEtfU0hJRlQJCQkxMgogI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fSFNJQzYwTV9QMl9DTEtfTUFTSwkJCSgxIDw8IDEyKQogCkBAIC0xMzA2LDI3ICsxMjA2LDI3IEBACiAjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9UWFBIWUNMS19TSElGVAkJCTgKICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1RYUEhZQ0xLX01BU0sJCQkoMSA8PCA4KQogCi0vKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9VU0JfQ0gwX0NMS19TSElGVAkJCTgKICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VTQl9DSDBfQ0xLX01BU0sJCQkoMSA8PCA4KQogCi0vKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9VU0JfQ0gxX0NMS19TSElGVAkJCTkKICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VTQl9DSDFfQ0xLX01BU0sJCQkoMSA8PCA5KQogCi0vKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkxfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9VU0JfQ0gyX0NMS19TSElGVAkJCTEwCiAjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9VU0JfQ0gyX0NMS19NQVNLCQkJKDEgPDwgMTApCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VUTUlfUDFfQ0xLX1NISUZUCQkJOAogI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fVVRNSV9QMV9DTEtfTUFTSwkJCSgxIDw8IDgpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VUTUlfUDJfQ0xLX1NISUZUCQkJOQogI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fVVRNSV9QMl9DTEtfTUFTSwkJCSgxIDw8IDkpCiAKLS8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwgKi8KICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VUTUlfUDNfQ0xLX1NISUZUCQkJMTAKICNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VUTUlfUDNfQ0xLX01BU0sJCQkoMSA8PCAxMCkKIApAQCAtMTM3NCw3ICsxMjc0LDcgQEAKICNkZWZpbmUgT01BUDQ0MzBfUE1EX1RSQUNFX01VWF9DVFJMX1NISUZUCQkJMjIKICNkZWZpbmUgT01BUDQ0MzBfUE1EX1RSQUNFX01VWF9DVFJMX01BU0sJCQkoMHgzIDw8IDIyKQogCi0vKiBVc2VkIGJ5IENNX0RZTl9ERVBfUFJFU0NBTCwgQ01fRFlOX0RFUF9QUkVTQ0FMX1JFU1RPUkUgKi8KKy8qIFVzZWQgYnkgQ01fRFlOX0RFUF9QUkVTQ0FMICovCiAjZGVmaW5lIE9NQVA0NDMwX1BSRVNDQUxfU0hJRlQJCQkJCTAKICNkZWZpbmUgT01BUDQ0MzBfUFJFU0NBTF9NQVNLCQkJCQkoMHgzZiA8PCAwKQogCkBAIC0xMzgyLDEwICsxMjgyLDcgQEAKICNkZWZpbmUgT01BUDQ0MzBfUl9SVExfU0hJRlQJCQkJCTExCiAjZGVmaW5lIE9NQVA0NDMwX1JfUlRMX01BU0sJCQkJCSgweDFmIDw8IDExKQogCi0vKgotICogVXNlZCBieSBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkxfUkVTVE9SRSwKLSAqIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkxfUkVTVE9SRQotICovCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMLCBDTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMICovCiAjZGVmaW5lIE9NQVA0NDMwX1NBUl9NT0RFX1NISUZUCQkJCQk0CiAjZGVmaW5lIE9NQVA0NDMwX1NBUl9NT0RFX01BU0sJCQkJCSgxIDw8IDQpCiAKQEAgLTEzOTcsNyArMTI5NCw3IEBACiAjZGVmaW5lIE9NQVA0NDMwX1NDSEVNRV9TSElGVAkJCQkJMzAKICNkZWZpbmUgT01BUDQ0MzBfU0NIRU1FX01BU0sJCQkJCSgweDMgPDwgMzApCiAKLS8qIFVzZWQgYnkgQ01fTDRDRkdfRFlOQU1JQ0RFUCwgQ01fTDRDRkdfRFlOQU1JQ0RFUF9SRVNUT1JFICovCisvKiBVc2VkIGJ5IENNX0w0Q0ZHX0RZTkFNSUNERVAgKi8KICNkZWZpbmUgT01BUDQ0MzBfU0RNQV9EWU5ERVBfU0hJRlQJCQkJMTEKICNkZWZpbmUgT01BUDQ0MzBfU0RNQV9EWU5ERVBfTUFTSwkJCQkoMSA8PCAxMSkKIApAQCAtMTQxNywxMCArMTMxNCwxMCBAQAogICogQ01fTDNJTklUX0hTSV9DTEtDVFJMLCBDTV9MM0lOSVRfTU1DMV9DTEtDVFJMLCBDTV9MM0lOSVRfTU1DMl9DTEtDVFJMLAogICogQ01fTDNJTklUX01NQzZfQ0xLQ1RSTCwgQ01fTDNJTklUX1AxNTAwX0NMS0NUUkwsIENNX0wzSU5JVF9QQ0lFU1NfQ0xLQ1RSTCwKICAqIENNX0wzSU5JVF9TQVRBX0NMS0NUUkwsIENNX0wzSU5JVF9UUFBTU19DTEtDVFJMLCBDTV9MM0lOSVRfVU5JUFJPMV9DTEtDVFJMLAotICogQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUsCi0gKiBDTV9MM0lOSVRfVVNCX0hPU1RfRlNfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9PVEdfQ0xLQ1RSTCwKLSAqIENNX0wzSU5JVF9YSFBJX0NMS0NUUkwsIENNX0w0U0VDX0NSWVBUT0RNQV9DTEtDVFJMLCBDTV9NUFVfTVBVX0NMS0NUUkwsCi0gKiBDTV9TRE1BX1NETUFfQ0xLQ1RSTCwgQ01fVEVTTEFfVEVTTEFfQ0xLQ1RSTAorICogQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9GU19DTEtDVFJMLAorICogQ01fTDNJTklUX1VTQl9PVEdfQ0xLQ1RSTCwgQ01fTDNJTklUX1hIUElfQ0xLQ1RSTCwKKyAqIENNX0w0U0VDX0NSWVBUT0RNQV9DTEtDVFJMLCBDTV9NUFVfTVBVX0NMS0NUUkwsIENNX1NETUFfU0RNQV9DTEtDVFJMLAorICogQ01fVEVTTEFfVEVTTEFfQ0xLQ1RSTAogICovCiAjZGVmaW5lIE9NQVA0NDMwX1NUQllTVF9TSElGVAkJCQkJMTgKICNkZWZpbmUgT01BUDQ0MzBfU1RCWVNUX01BU0sJCQkJCSgxIDw8IDE4KQpAQCAtMTQzOCwxNyArMTMzNSwxMyBAQAogI2RlZmluZSBPTUFQNDQzMF9TVF9EUExMX0NMS0RDT0xET19NQVNLCQkJCSgxIDw8IDkpCiAKIC8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NMl9EUExMX0FCRSwgQ01fRElWX00yX0RQTExfQ09SRSwKLSAqIENNX0RJVl9NMl9EUExMX0NPUkVfUkVTVE9SRSwgQ01fRElWX00yX0RQTExfRERSUEhZLCBDTV9ESVZfTTJfRFBMTF9NUFUsCi0gKiBDTV9ESVZfTTJfRFBMTF9QRVIsIENNX0RJVl9NMl9EUExMX1VTQgorICogVXNlZCBieSBDTV9ESVZfTTJfRFBMTF9BQkUsIENNX0RJVl9NMl9EUExMX0NPUkUsIENNX0RJVl9NMl9EUExMX0REUlBIWSwKKyAqIENNX0RJVl9NMl9EUExMX01QVSwgQ01fRElWX00yX0RQTExfUEVSLCBDTV9ESVZfTTJfRFBMTF9VU0IKICAqLwogI2RlZmluZSBPTUFQNDQzMF9TVF9EUExMX0NMS09VVF9TSElGVAkJCQk5CiAjZGVmaW5lIE9NQVA0NDMwX1NUX0RQTExfQ0xLT1VUX01BU0sJCQkJKDEgPDwgOSkKIAotLyoKLSAqIFVzZWQgYnkgQ01fRElWX00zX0RQTExfQUJFLCBDTV9ESVZfTTNfRFBMTF9DT1JFLAotICogQ01fRElWX00zX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9ESVZfTTNfRFBMTF9QRVIKLSAqLworLyogVXNlZCBieSBDTV9ESVZfTTNfRFBMTF9BQkUsIENNX0RJVl9NM19EUExMX0NPUkUsIENNX0RJVl9NM19EUExMX1BFUiAqLwogI2RlZmluZSBPTUFQNDQzMF9TVF9EUExMX0NMS09VVEhJRl9TSElGVAkJCTkKICNkZWZpbmUgT01BUDQ0MzBfU1RfRFBMTF9DTEtPVVRISUZfTUFTSwkJCQkoMSA8PCA5KQogCkBAIC0xNDU3LDMwICsxMzUwLDI0IEBACiAjZGVmaW5lIE9NQVA0NDMwX1NUX0RQTExfQ0xLT1VUWDJfTUFTSwkJCQkoMSA8PCAxMSkKIAogLyoKLSAqIFVzZWQgYnkgQ01fRElWX000X0RQTExfQ09SRSwgQ01fRElWX000X0RQTExfQ09SRV9SRVNUT1JFLAotICogQ01fRElWX000X0RQTExfRERSUEhZLCBDTV9ESVZfTTRfRFBMTF9JVkEsIENNX0RJVl9NNF9EUExMX1BFUgorICogVXNlZCBieSBDTV9ESVZfTTRfRFBMTF9DT1JFLCBDTV9ESVZfTTRfRFBMTF9ERFJQSFksIENNX0RJVl9NNF9EUExMX0lWQSwKKyAqIENNX0RJVl9NNF9EUExMX1BFUgogICovCiAjZGVmaW5lIE9NQVA0NDMwX1NUX0hTRElWSURFUl9DTEtPVVQxX1NISUZUCQkJOQogI2RlZmluZSBPTUFQNDQzMF9TVF9IU0RJVklERVJfQ0xLT1VUMV9NQVNLCQkJKDEgPDwgOSkKIAogLyoKLSAqIFVzZWQgYnkgQ01fRElWX001X0RQTExfQ09SRSwgQ01fRElWX001X0RQTExfQ09SRV9SRVNUT1JFLAotICogQ01fRElWX001X0RQTExfRERSUEhZLCBDTV9ESVZfTTVfRFBMTF9JVkEsIENNX0RJVl9NNV9EUExMX1BFUgorICogVXNlZCBieSBDTV9ESVZfTTVfRFBMTF9DT1JFLCBDTV9ESVZfTTVfRFBMTF9ERFJQSFksIENNX0RJVl9NNV9EUExMX0lWQSwKKyAqIENNX0RJVl9NNV9EUExMX1BFUgogICovCiAjZGVmaW5lIE9NQVA0NDMwX1NUX0hTRElWSURFUl9DTEtPVVQyX1NISUZUCQkJOQogI2RlZmluZSBPTUFQNDQzMF9TVF9IU0RJVklERVJfQ0xLT1VUMl9NQVNLCQkJKDEgPDwgOSkKIAotLyoKLSAqIFVzZWQgYnkgQ01fRElWX002X0RQTExfQ09SRSwgQ01fRElWX002X0RQTExfQ09SRV9SRVNUT1JFLAotICogQ01fRElWX002X0RQTExfRERSUEhZLCBDTV9ESVZfTTZfRFBMTF9QRVIKLSAqLworLyogVXNlZCBieSBDTV9ESVZfTTZfRFBMTF9DT1JFLCBDTV9ESVZfTTZfRFBMTF9ERFJQSFksIENNX0RJVl9NNl9EUExMX1BFUiAqLwogI2RlZmluZSBPTUFQNDQzMF9TVF9IU0RJVklERVJfQ0xLT1VUM19TSElGVAkJCTkKICNkZWZpbmUgT01BUDQ0MzBfU1RfSFNESVZJREVSX0NMS09VVDNfTUFTSwkJCSgxIDw8IDkpCiAKLS8qCi0gKiBVc2VkIGJ5IENNX0RJVl9NN19EUExMX0NPUkUsIENNX0RJVl9NN19EUExMX0NPUkVfUkVTVE9SRSwKLSAqIENNX0RJVl9NN19EUExMX1BFUgotICovCisvKiBVc2VkIGJ5IENNX0RJVl9NN19EUExMX0NPUkUsIENNX0RJVl9NN19EUExMX1BFUiAqLwogI2RlZmluZSBPTUFQNDQzMF9TVF9IU0RJVklERVJfQ0xLT1VUNF9TSElGVAkJCTkKICNkZWZpbmUgT01BUDQ0MzBfU1RfSFNESVZJREVSX0NMS09VVDRfTUFTSwkJCSgxIDw8IDkpCiAKQEAgLTE0OTYsNyArMTM4Myw3IEBACiAjZGVmaW5lIE9NQVA0NDMwX1NZU19DTEtTRUxfU0hJRlQJCQkJMAogI2RlZmluZSBPTUFQNDQzMF9TWVNfQ0xLU0VMX01BU0sJCQkJKDB4NyA8PCAwKQogCi0vKiBVc2VkIGJ5IENNX0w0Q0ZHX0RZTkFNSUNERVAsIENNX0w0Q0ZHX0RZTkFNSUNERVBfUkVTVE9SRSAqLworLyogVXNlZCBieSBDTV9MNENGR19EWU5BTUlDREVQICovCiAjZGVmaW5lIE9NQVA0NDMwX1RFU0xBX0RZTkRFUF9TSElGVAkJCQkxCiAjZGVmaW5lIE9NQVA0NDMwX1RFU0xBX0RZTkRFUF9NQVNLCQkJCSgxIDw8IDEpCiAKQEAgLTE1MDUsMTEgKzEzOTIsOSBAQAogI2RlZmluZSBPTUFQNDQzMF9URVNMQV9TVEFUREVQX01BU0sJCQkJKDEgPDwgMSkKIAogLyoKLSAqIFVzZWQgYnkgQ01fRDJEX0RZTkFNSUNERVAsIENNX0QyRF9EWU5BTUlDREVQX1JFU1RPUkUsIENNX0RVQ0FUSV9EWU5BTUlDREVQLAotICogQ01fRU1VX0RZTkFNSUNERVAsIENNX0wzXzFfRFlOQU1JQ0RFUCwgQ01fTDNfMV9EWU5BTUlDREVQX1JFU1RPUkUsCi0gKiBDTV9MM18yX0RZTkFNSUNERVAsIENNX0wzXzJfRFlOQU1JQ0RFUF9SRVNUT1JFLCBDTV9MNENGR19EWU5BTUlDREVQLAotICogQ01fTDRDRkdfRFlOQU1JQ0RFUF9SRVNUT1JFLCBDTV9MNFBFUl9EWU5BTUlDREVQLAotICogQ01fTDRQRVJfRFlOQU1JQ0RFUF9SRVNUT1JFLCBDTV9NUFVfRFlOQU1JQ0RFUCwgQ01fVEVTTEFfRFlOQU1JQ0RFUAorICogVXNlZCBieSBDTV9EMkRfRFlOQU1JQ0RFUCwgQ01fRFVDQVRJX0RZTkFNSUNERVAsIENNX0VNVV9EWU5BTUlDREVQLAorICogQ01fTDNfMV9EWU5BTUlDREVQLCBDTV9MM18yX0RZTkFNSUNERVAsIENNX0w0Q0ZHX0RZTkFNSUNERVAsCisgKiBDTV9MNFBFUl9EWU5BTUlDREVQLCBDTV9NUFVfRFlOQU1JQ0RFUCwgQ01fVEVTTEFfRFlOQU1JQ0RFUAogICovCiAjZGVmaW5lIE9NQVA0NDMwX1dJTkRPV1NJWkVfU0hJRlQJCQkJMjQKICNkZWZpbmUgT01BUDQ0MzBfV0lORE9XU0laRV9NQVNLCQkJCSgweGYgPDwgMjQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NtMV80NHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtMV80NHh4LmgKaW5kZXggZTJkN2E1Ni4uMWJjMDBkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbTFfNDR4eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY20xXzQ0eHguaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBPTUFQNDR4eCBDTTEgaW5zdGFuY2Ugb2Zmc2V0IG1hY3JvcwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKiBQYXVsIFdhbG1zbGV5IChwYXVsQHB3c2FuLmNvbSkKQEAgLTQxLDkgKzQxLDkgQEAKICNkZWZpbmUgT01BUDQ0MzBfQ00xX0lOU1RSX0lOU1QJCTB4MGYwMAogCiAvKiBDTTEgY2xvY2tkb21haW4gcmVnaXN0ZXIgb2Zmc2V0cyAoZnJvbSBpbnN0YW5jZSBzdGFydCkgKi8KLSNkZWZpbmUgT01BUDQ0MzBfQ00xX0FCRV9BQkVfQ0RPRkZTCQkweDAwMDAKLSNkZWZpbmUgT01BUDQ0MzBfQ00xX01QVV9NUFVfQ0RPRkZTCQkweDAwMDAKLSNkZWZpbmUgT01BUDQ0MzBfQ00xX1RFU0xBX1RFU0xBX0NET0ZGUwkJMHgwMDAwCisjZGVmaW5lIE9NQVA0NDMwX0NNMV9NUFVfTVBVX0NET0ZGUwkweDAwMDAKKyNkZWZpbmUgT01BUDQ0MzBfQ00xX1RFU0xBX1RFU0xBX0NET0ZGUwkweDAwMDAKKyNkZWZpbmUgT01BUDQ0MzBfQ00xX0FCRV9BQkVfQ0RPRkZTCTB4MDAwMAogCiAvKiBDTTEgKi8KIApAQCAtODIsOCArODIsOCBAQAogI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTdfRFBMTF9DT1JFCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX0lOU1QsIDB4MDA0NCkKICNkZWZpbmUgT01BUDRfQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9DT1JFX09GRlNFVAkweDAwNDgKICNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9DT1JFCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fSU5TVCwgMHgwMDQ4KQotI2RlZmluZSBPTUFQNF9DTV9TU0NfSU5TVEZSRVFESVZfRFBMTF9DT1JFX09GRlNFVAkweDAwNGMKLSNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0lOU1RGUkVRRElWX0RQTExfQ09SRQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX0lOU1QsIDB4MDA0YykKKyNkZWZpbmUgT01BUDRfQ01fU1NDX01PREZSRVFESVZfRFBMTF9DT1JFX09GRlNFVAkweDAwNGMKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX01PREZSRVFESVZfRFBMTF9DT1JFCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fSU5TVCwgMHgwMDRjKQogI2RlZmluZSBPTUFQNF9DTV9FTVVfT1ZFUlJJREVfRFBMTF9DT1JFX09GRlNFVAkJMHgwMDUwCiAjZGVmaW5lIE9NQVA0NDMwX0NNX0VNVV9PVkVSUklERV9EUExMX0NPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9JTlNULCAweDAwNTApCiAjZGVmaW5lIE9NQVA0X0NNX0NMS01PREVfRFBMTF9NUFVfT0ZGU0VUCQkweDAwNjAKQEAgLTk4LDggKzk4LDggQEAKICNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX00yX0RQTExfTVBVCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX0lOU1QsIDB4MDA3MCkKICNkZWZpbmUgT01BUDRfQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9NUFVfT0ZGU0VUCQkweDAwODgKICNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9NUFUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9JTlNULCAweDAwODgpCi0jZGVmaW5lIE9NQVA0X0NNX1NTQ19JTlNURlJFUURJVl9EUExMX01QVV9PRkZTRVQJCTB4MDA4YwotI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfSU5TVEZSRVFESVZfRFBMTF9NUFUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9JTlNULCAweDAwOGMpCisjZGVmaW5lIE9NQVA0X0NNX1NTQ19NT0RGUkVRRElWX0RQTExfTVBVX09GRlNFVAkJMHgwMDhjCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19NT0RGUkVRRElWX0RQTExfTVBVCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fSU5TVCwgMHgwMDhjKQogI2RlZmluZSBPTUFQNF9DTV9CWVBDTEtfRFBMTF9NUFVfT0ZGU0VUCQkJMHgwMDljCiAjZGVmaW5lIE9NQVA0NDMwX0NNX0JZUENMS19EUExMX01QVQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9JTlNULCAweDAwOWMpCiAjZGVmaW5lIE9NQVA0X0NNX0NMS01PREVfRFBMTF9JVkFfT0ZGU0VUCQkweDAwYTAKQEAgLTExNiw4ICsxMTYsOCBAQAogI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTVfRFBMTF9JVkEJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fSU5TVCwgMHgwMGJjKQogI2RlZmluZSBPTUFQNF9DTV9TU0NfREVMVEFNU1RFUF9EUExMX0lWQV9PRkZTRVQJCTB4MDBjOAogI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfREVMVEFNU1RFUF9EUExMX0lWQQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX0lOU1QsIDB4MDBjOCkKLSNkZWZpbmUgT01BUDRfQ01fU1NDX0lOU1RGUkVRRElWX0RQTExfSVZBX09GRlNFVAkJMHgwMGNjCi0jZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19JTlNURlJFUURJVl9EUExMX0lWQQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX0lOU1QsIDB4MDBjYykKKyNkZWZpbmUgT01BUDRfQ01fU1NDX01PREZSRVFESVZfRFBMTF9JVkFfT0ZGU0VUCQkweDAwY2MKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX01PREZSRVFESVZfRFBMTF9JVkEJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9JTlNULCAweDAwY2MpCiAjZGVmaW5lIE9NQVA0X0NNX0JZUENMS19EUExMX0lWQV9PRkZTRVQJCQkweDAwZGMKICNkZWZpbmUgT01BUDQ0MzBfQ01fQllQQ0xLX0RQTExfSVZBCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX0lOU1QsIDB4MDBkYykKICNkZWZpbmUgT01BUDRfQ01fQ0xLTU9ERV9EUExMX0FCRV9PRkZTRVQJCTB4MDBlMApAQCAtMTM0LDggKzEzNCw4IEBACiAjZGVmaW5lIE9NQVA0NDMwX0NNX0RJVl9NM19EUExMX0FCRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9JTlNULCAweDAwZjQpCiAjZGVmaW5lIE9NQVA0X0NNX1NTQ19ERUxUQU1TVEVQX0RQTExfQUJFX09GRlNFVAkJMHgwMTA4CiAjZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19ERUxUQU1TVEVQX0RQTExfQUJFCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fSU5TVCwgMHgwMTA4KQotI2RlZmluZSBPTUFQNF9DTV9TU0NfSU5TVEZSRVFESVZfRFBMTF9BQkVfT0ZGU0VUCQkweDAxMGMKLSNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0lOU1RGUkVRRElWX0RQTExfQUJFCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fSU5TVCwgMHgwMTBjKQorI2RlZmluZSBPTUFQNF9DTV9TU0NfTU9ERlJFUURJVl9EUExMX0FCRV9PRkZTRVQJCTB4MDEwYworI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfTU9ERlJFUURJVl9EUExMX0FCRQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX0lOU1QsIDB4MDEwYykKICNkZWZpbmUgT01BUDRfQ01fQ0xLTU9ERV9EUExMX0REUlBIWV9PRkZTRVQJCTB4MDEyMAogI2RlZmluZSBPTUFQNDQzMF9DTV9DTEtNT0RFX0RQTExfRERSUEhZCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX0lOU1QsIDB4MDEyMCkKICNkZWZpbmUgT01BUDRfQ01fSURMRVNUX0RQTExfRERSUEhZX09GRlNFVAkJMHgwMTI0CkBAIC0xNTQsOCArMTU0LDggQEAKICNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX002X0RQTExfRERSUEhZCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX0lOU1QsIDB4MDE0MCkKICNkZWZpbmUgT01BUDRfQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9ERFJQSFlfT0ZGU0VUCTB4MDE0OAogI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfREVMVEFNU1RFUF9EUExMX0REUlBIWQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX0lOU1QsIDB4MDE0OCkKLSNkZWZpbmUgT01BUDRfQ01fU1NDX0lOU1RGUkVRRElWX0RQTExfRERSUEhZX09GRlNFVAkweDAxNGMKLSNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0lOU1RGUkVRRElWX0RQTExfRERSUEhZCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fSU5TVCwgMHgwMTRjKQorI2RlZmluZSBPTUFQNF9DTV9TU0NfTU9ERlJFUURJVl9EUExMX0REUlBIWV9PRkZTRVQJMHgwMTRjCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19NT0RGUkVRRElWX0RQTExfRERSUEhZCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fSU5TVCwgMHgwMTRjKQogI2RlZmluZSBPTUFQNF9DTV9TSEFET1dfRlJFUV9DT05GSUcxX09GRlNFVAkJMHgwMTYwCiAjZGVmaW5lIE9NQVA0NDMwX0NNX1NIQURPV19GUkVRX0NPTkZJRzEJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fSU5TVCwgMHgwMTYwKQogI2RlZmluZSBPTUFQNF9DTV9TSEFET1dfRlJFUV9DT05GSUcyX09GRlNFVAkJMHgwMTY0CkBAIC0yMTcsNDIgKzIxNyw2IEBACiAjZGVmaW5lIE9NQVA0X0NNMV9BQkVfV0RUM19DTEtDVFJMX09GRlNFVAkJMHgwMDg4CiAjZGVmaW5lIE9NQVA0NDMwX0NNMV9BQkVfV0RUM19DTEtDVFJMCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0FCRV9JTlNULCAweDAwODgpCiAKLS8qIENNMS5SRVNUT1JFX0NNMSByZWdpc3RlciBvZmZzZXRzICovCi0jZGVmaW5lIE9NQVA0X0NNX0NMS1NFTF9DT1JFX1JFU1RPUkVfT0ZGU0VUCQkweDAwMDAKLSNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLU0VMX0NPUkVfUkVTVE9SRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX0lOU1QsIDB4MDAwMCkKLSNkZWZpbmUgT01BUDRfQ01fRElWX00yX0RQTExfQ09SRV9SRVNUT1JFX09GRlNFVAkweDAwMDQKLSNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX00yX0RQTExfQ09SRV9SRVNUT1JFCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfUkVTVE9SRV9JTlNULCAweDAwMDQpCi0jZGVmaW5lIE9NQVA0X0NNX0RJVl9NM19EUExMX0NPUkVfUkVTVE9SRV9PRkZTRVQJMHgwMDA4Ci0jZGVmaW5lIE9NQVA0NDMwX0NNX0RJVl9NM19EUExMX0NPUkVfUkVTVE9SRQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1JFU1RPUkVfSU5TVCwgMHgwMDA4KQotI2RlZmluZSBPTUFQNF9DTV9ESVZfTTRfRFBMTF9DT1JFX1JFU1RPUkVfT0ZGU0VUCTB4MDAwYwotI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTRfRFBMTF9DT1JFX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX0lOU1QsIDB4MDAwYykKLSNkZWZpbmUgT01BUDRfQ01fRElWX001X0RQTExfQ09SRV9SRVNUT1JFX09GRlNFVAkweDAwMTAKLSNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX001X0RQTExfQ09SRV9SRVNUT1JFCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfUkVTVE9SRV9JTlNULCAweDAwMTApCi0jZGVmaW5lIE9NQVA0X0NNX0RJVl9NNl9EUExMX0NPUkVfUkVTVE9SRV9PRkZTRVQJMHgwMDE0Ci0jZGVmaW5lIE9NQVA0NDMwX0NNX0RJVl9NNl9EUExMX0NPUkVfUkVTVE9SRQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1JFU1RPUkVfSU5TVCwgMHgwMDE0KQotI2RlZmluZSBPTUFQNF9DTV9ESVZfTTdfRFBMTF9DT1JFX1JFU1RPUkVfT0ZGU0VUCTB4MDAxOAotI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTdfRFBMTF9DT1JFX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX0lOU1QsIDB4MDAxOCkKLSNkZWZpbmUgT01BUDRfQ01fQ0xLU0VMX0RQTExfQ09SRV9SRVNUT1JFX09GRlNFVAkweDAwMWMKLSNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLU0VMX0RQTExfQ09SRV9SRVNUT1JFCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfUkVTVE9SRV9JTlNULCAweDAwMWMpCi0jZGVmaW5lIE9NQVA0X0NNX1NTQ19ERUxUQU1TVEVQX0RQTExfQ09SRV9SRVNUT1JFX09GRlNFVAkweDAwMjAKLSNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9DT1JFX1JFU1RPUkUJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1JFU1RPUkVfSU5TVCwgMHgwMDIwKQotI2RlZmluZSBPTUFQNF9DTV9TU0NfSU5TVEZSRVFESVZfRFBMTF9DT1JFX1JFU1RPUkVfT0ZGU0VUCTB4MDAyNAotI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfSU5TVEZSRVFESVZfRFBMTF9DT1JFX1JFU1RPUkUJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1JFU1RPUkVfSU5TVCwgMHgwMDI0KQotI2RlZmluZSBPTUFQNF9DTV9DTEtNT0RFX0RQTExfQ09SRV9SRVNUT1JFX09GRlNFVAkweDAwMjgKLSNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLTU9ERV9EUExMX0NPUkVfUkVTVE9SRQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1JFU1RPUkVfSU5TVCwgMHgwMDI4KQotI2RlZmluZSBPTUFQNF9DTV9TSEFET1dfRlJFUV9DT05GSUcyX1JFU1RPUkVfT0ZGU0VUCTB4MDAyYwotI2RlZmluZSBPTUFQNDQzMF9DTV9TSEFET1dfRlJFUV9DT05GSUcyX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX0lOU1QsIDB4MDAyYykKLSNkZWZpbmUgT01BUDRfQ01fU0hBRE9XX0ZSRVFfQ09ORklHMV9SRVNUT1JFX09GRlNFVAkweDAwMzAKLSNkZWZpbmUgT01BUDQ0MzBfQ01fU0hBRE9XX0ZSRVFfQ09ORklHMV9SRVNUT1JFCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfUkVTVE9SRV9JTlNULCAweDAwMzApCi0jZGVmaW5lIE9NQVA0X0NNX0FVVE9JRExFX0RQTExfQ09SRV9SRVNUT1JFX09GRlNFVAkweDAwMzQKLSNkZWZpbmUgT01BUDQ0MzBfQ01fQVVUT0lETEVfRFBMTF9DT1JFX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX0lOU1QsIDB4MDAzNCkKLSNkZWZpbmUgT01BUDRfQ01fTVBVX0NMS1NUQ1RSTF9SRVNUT1JFX09GRlNFVAkJMHgwMDM4Ci0jZGVmaW5lIE9NQVA0NDMwX0NNX01QVV9DTEtTVENUUkxfUkVTVE9SRQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1JFU1RPUkVfSU5TVCwgMHgwMDM4KQotI2RlZmluZSBPTUFQNF9DTV9DTTFfUFJPRklMSU5HX0NMS0NUUkxfUkVTVE9SRV9PRkZTRVQJMHgwMDNjCi0jZGVmaW5lIE9NQVA0NDMwX0NNX0NNMV9QUk9GSUxJTkdfQ0xLQ1RSTF9SRVNUT1JFCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX0lOU1QsIDB4MDAzYykKLSNkZWZpbmUgT01BUDRfQ01fRFlOX0RFUF9QUkVTQ0FMX1JFU1RPUkVfT0ZGU0VUCQkweDAwNDAKLSNkZWZpbmUgT01BUDQ0MzBfQ01fRFlOX0RFUF9QUkVTQ0FMX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX0lOU1QsIDB4MDA0MCkKLQogLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLwogZXh0ZXJuIHUzMiBvbWFwNF9jbTFfcmVhZF9pbnN0X3JlZyhzMTYgaW5zdCwgdTE2IGlkeCk7CiBleHRlcm4gdm9pZCBvbWFwNF9jbTFfd3JpdGVfaW5zdF9yZWcodTMyIHZhbCwgczE2IGluc3QsIHUxNiBpZHgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbTJfNDR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbTJfNDR4eC5oCmluZGV4IGFhNDc0NTAuLmI5ZGU3MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY20yXzQ0eHguaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtMl80NHh4LmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogT01BUDQ0eHggQ00yIGluc3RhbmNlIG9mZnNldCBtYWNyb3MKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE5va2lhIENvcnBvcmF0aW9uCiAgKgogICogUGF1bCBXYWxtc2xleSAocGF1bEBwd3Nhbi5jb20pCkBAIC00MCw5ICs0MCw5IEBACiAjZGVmaW5lIE9NQVA0NDMwX0NNMl9DQU1fSU5TVAkJMHgxMDAwCiAjZGVmaW5lIE9NQVA0NDMwX0NNMl9EU1NfSU5TVAkJMHgxMTAwCiAjZGVmaW5lIE9NQVA0NDMwX0NNMl9HRlhfSU5TVAkJMHgxMjAwCi0jZGVmaW5lIE9NQVA0NDMwX0NNMl9MM0lOSVRfSU5TVAkJMHgxMzAwCisjZGVmaW5lIE9NQVA0NDMwX0NNMl9MM0lOSVRfSU5TVAkweDEzMDAKICNkZWZpbmUgT01BUDQ0MzBfQ00yX0w0UEVSX0lOU1QJCTB4MTQwMAotI2RlZmluZSBPTUFQNDQzMF9DTTJfQ0VGVVNFX0lOU1QJCTB4MTYwMAorI2RlZmluZSBPTUFQNDQzMF9DTTJfQ0VGVVNFX0lOU1QJMHgxNjAwCiAjZGVmaW5lIE9NQVA0NDMwX0NNMl9SRVNUT1JFX0lOU1QJMHgxZTAwCiAjZGVmaW5lIE9NQVA0NDMwX0NNMl9JTlNUUl9JTlNUCQkweDFmMDAKIApAQCAtNjUsNyArNjUsNiBAQAogI2RlZmluZSBPTUFQNDQzMF9DTTJfTDRQRVJfTDRTRUNfQ0RPRkZTCQkweDAxODAKICNkZWZpbmUgT01BUDQ0MzBfQ00yX0NFRlVTRV9DRUZVU0VfQ0RPRkZTCTB4MDAwMAogCi0KIC8qIENNMiAqLwogCiAvKiBDTTIuT0NQX1NPQ0tFVF9DTTIgcmVnaXN0ZXIgb2Zmc2V0cyAqLwpAQCAtMTIxLDggKzEyMCw4IEBACiAjZGVmaW5lIE9NQVA0NDMwX0NNX0RJVl9NN19EUExMX1BFUgkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9JTlNULCAweDAwNjQpCiAjZGVmaW5lIE9NQVA0X0NNX1NTQ19ERUxUQU1TVEVQX0RQTExfUEVSX09GRlNFVAkJMHgwMDY4CiAjZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19ERUxUQU1TVEVQX0RQTExfUEVSCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fSU5TVCwgMHgwMDY4KQotI2RlZmluZSBPTUFQNF9DTV9TU0NfSU5TVEZSRVFESVZfRFBMTF9QRVJfT0ZGU0VUCQkweDAwNmMKLSNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0lOU1RGUkVRRElWX0RQTExfUEVSCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fSU5TVCwgMHgwMDZjKQorI2RlZmluZSBPTUFQNF9DTV9TU0NfTU9ERlJFUURJVl9EUExMX1BFUl9PRkZTRVQJCTB4MDA2YworI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfTU9ERlJFUURJVl9EUExMX1BFUgkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX0lOU1QsIDB4MDA2YykKICNkZWZpbmUgT01BUDRfQ01fQ0xLTU9ERV9EUExMX1VTQl9PRkZTRVQJCTB4MDA4MAogI2RlZmluZSBPTUFQNDQzMF9DTV9DTEtNT0RFX0RQTExfVVNCCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX0lOU1QsIDB4MDA4MCkKICNkZWZpbmUgT01BUDRfQ01fSURMRVNUX0RQTExfVVNCX09GRlNFVAkJCTB4MDA4NApAQCAtMTM1LDggKzEzNCw4IEBACiAjZGVmaW5lIE9NQVA0NDMwX0NNX0RJVl9NMl9EUExMX1VTQgkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9JTlNULCAweDAwOTApCiAjZGVmaW5lIE9NQVA0X0NNX1NTQ19ERUxUQU1TVEVQX0RQTExfVVNCX09GRlNFVAkJMHgwMGE4CiAjZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19ERUxUQU1TVEVQX0RQTExfVVNCCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fSU5TVCwgMHgwMGE4KQotI2RlZmluZSBPTUFQNF9DTV9TU0NfSU5TVEZSRVFESVZfRFBMTF9VU0JfT0ZGU0VUCQkweDAwYWMKLSNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0lOU1RGUkVRRElWX0RQTExfVVNCCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fSU5TVCwgMHgwMGFjKQorI2RlZmluZSBPTUFQNF9DTV9TU0NfTU9ERlJFUURJVl9EUExMX1VTQl9PRkZTRVQJCTB4MDBhYworI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfTU9ERlJFUURJVl9EUExMX1VTQgkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX0lOU1QsIDB4MDBhYykKICNkZWZpbmUgT01BUDRfQ01fQ0xLRENPTERPX0RQTExfVVNCX09GRlNFVAkJMHgwMGI0CiAjZGVmaW5lIE9NQVA0NDMwX0NNX0NMS0RDT0xET19EUExMX1VTQgkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9JTlNULCAweDAwYjQpCiAjZGVmaW5lIE9NQVA0X0NNX0NMS01PREVfRFBMTF9VTklQUk9fT0ZGU0VUCQkweDAwYzAKQEAgLTE1MSw4ICsxNTAsOCBAQAogI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTJfRFBMTF9VTklQUk8JCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fSU5TVCwgMHgwMGQwKQogI2RlZmluZSBPTUFQNF9DTV9TU0NfREVMVEFNU1RFUF9EUExMX1VOSVBST19PRkZTRVQJMHgwMGU4CiAjZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19ERUxUQU1TVEVQX0RQTExfVU5JUFJPCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fSU5TVCwgMHgwMGU4KQotI2RlZmluZSBPTUFQNF9DTV9TU0NfSU5TVEZSRVFESVZfRFBMTF9VTklQUk9fT0ZGU0VUCTB4MDBlYwotI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfSU5TVEZSRVFESVZfRFBMTF9VTklQUk8JCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9JTlNULCAweDAwZWMpCisjZGVmaW5lIE9NQVA0X0NNX1NTQ19NT0RGUkVRRElWX0RQTExfVU5JUFJPX09GRlNFVAkweDAwZWMKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX01PREZSRVFESVZfRFBMTF9VTklQUk8JCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9JTlNULCAweDAwZWMpCiAKIC8qIENNMi5BTFdBWVNfT05fQ00yIHJlZ2lzdGVyIG9mZnNldHMgKi8KICNkZWZpbmUgT01BUDRfQ01fQUxXT05fQ0xLU1RDVFJMX09GRlNFVAkJCTB4MDAwMApAQCAtMjI3LDggKzIyNiw4IEBACiAjZGVmaW5lIE9NQVA0NDMwX0NNX0QyRF9EWU5BTUlDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfSU5TVCwgMHgwNTA4KQogI2RlZmluZSBPTUFQNF9DTV9EMkRfU0FEMkRfQ0xLQ1RSTF9PRkZTRVQJCTB4MDUyMAogI2RlZmluZSBPTUFQNDQzMF9DTV9EMkRfU0FEMkRfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX0lOU1QsIDB4MDUyMCkKLSNkZWZpbmUgT01BUDRfQ01fRDJEX0lOU1RFTV9JQ1JfQ0xLQ1RSTF9PRkZTRVQJCTB4MDUyOAotI2RlZmluZSBPTUFQNDQzMF9DTV9EMkRfSU5TVEVNX0lDUl9DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9JTlNULCAweDA1MjgpCisjZGVmaW5lIE9NQVA0X0NNX0QyRF9NT0RFTV9JQ1JfQ0xLQ1RSTF9PRkZTRVQJCTB4MDUyOAorI2RlZmluZSBPTUFQNDQzMF9DTV9EMkRfTU9ERU1fSUNSX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX0lOU1QsIDB4MDUyOCkKICNkZWZpbmUgT01BUDRfQ01fRDJEX1NBRDJEX0ZXX0NMS0NUUkxfT0ZGU0VUCQkweDA1MzAKICNkZWZpbmUgT01BUDQ0MzBfQ01fRDJEX1NBRDJEX0ZXX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX0lOU1QsIDB4MDUzMCkKICNkZWZpbmUgT01BUDRfQ01fTDRDRkdfQ0xLU1RDVFJMX09GRlNFVAkJCTB4MDYwMApAQCAtNDUwLDU2ICs0NDksNiBAQAogI2RlZmluZSBPTUFQNF9DTV9DRUZVU0VfQ0VGVVNFX0NMS0NUUkxfT0ZGU0VUCQkweDAwMjAKICNkZWZpbmUgT01BUDQ0MzBfQ01fQ0VGVVNFX0NFRlVTRV9DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0VGVVNFX0lOU1QsIDB4MDAyMCkKIAotLyogQ00yLlJFU1RPUkVfQ00yIHJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgT01BUDRfQ01fTDNfMV9DTEtTVENUUkxfUkVTVE9SRV9PRkZTRVQJCTB4MDAwMAotI2RlZmluZSBPTUFQNDQzMF9DTV9MM18xX0NMS1NUQ1RSTF9SRVNUT1JFCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfUkVTVE9SRV9JTlNULCAweDAwMDApCi0jZGVmaW5lIE9NQVA0X0NNX0wzXzJfQ0xLU1RDVFJMX1JFU1RPUkVfT0ZGU0VUCQkweDAwMDQKLSNkZWZpbmUgT01BUDQ0MzBfQ01fTDNfMl9DTEtTVENUUkxfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfSU5TVCwgMHgwMDA0KQotI2RlZmluZSBPTUFQNF9DTV9MNENGR19DTEtTVENUUkxfUkVTVE9SRV9PRkZTRVQJCTB4MDAwOAotI2RlZmluZSBPTUFQNDQzMF9DTV9MNENGR19DTEtTVENUUkxfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfSU5TVCwgMHgwMDA4KQotI2RlZmluZSBPTUFQNF9DTV9NRU1JRl9DTEtTVENUUkxfUkVTVE9SRV9PRkZTRVQJCTB4MDAwYwotI2RlZmluZSBPTUFQNDQzMF9DTV9NRU1JRl9DTEtTVENUUkxfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfSU5TVCwgMHgwMDBjKQotI2RlZmluZSBPTUFQNF9DTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRV9PRkZTRVQJCTB4MDAxMAotI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfSU5TVCwgMHgwMDEwKQotI2RlZmluZSBPTUFQNF9DTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkVfT0ZGU0VUCTB4MDAxNAotI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX0lOU1QsIDB4MDAxNCkKLSNkZWZpbmUgT01BUDRfQ01fTDNJTlNUUl9MM18zX0NMS0NUUkxfUkVTVE9SRV9PRkZTRVQJMHgwMDE4Ci0jZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5TVFJfTDNfM19DTEtDVFJMX1JFU1RPUkUJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfSU5TVCwgMHgwMDE4KQotI2RlZmluZSBPTUFQNF9DTV9MM0lOU1RSX0wzX0lOU1RSX0NMS0NUUkxfUkVTVE9SRV9PRkZTRVQJMHgwMDFjCi0jZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5TVFJfTDNfSU5TVFJfQ0xLQ1RSTF9SRVNUT1JFCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX0lOU1QsIDB4MDAxYykKLSNkZWZpbmUgT01BUDRfQ01fTDNJTlNUUl9PQ1BfV1AxX0NMS0NUUkxfUkVTVE9SRV9PRkZTRVQJMHgwMDIwCi0jZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5TVFJfT0NQX1dQMV9DTEtDVFJMX1JFU1RPUkUJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfSU5TVCwgMHgwMDIwKQotI2RlZmluZSBPTUFQNF9DTV9DTTJfUFJPRklMSU5HX0NMS0NUUkxfUkVTVE9SRV9PRkZTRVQJMHgwMDI0Ci0jZGVmaW5lIE9NQVA0NDMwX0NNX0NNMl9QUk9GSUxJTkdfQ0xLQ1RSTF9SRVNUT1JFCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX0lOU1QsIDB4MDAyNCkKLSNkZWZpbmUgT01BUDRfQ01fRDJEX1NUQVRJQ0RFUF9SRVNUT1JFX09GRlNFVAkJMHgwMDI4Ci0jZGVmaW5lIE9NQVA0NDMwX0NNX0QyRF9TVEFUSUNERVBfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfSU5TVCwgMHgwMDI4KQotI2RlZmluZSBPTUFQNF9DTV9MM18xX0RZTkFNSUNERVBfUkVTVE9SRV9PRkZTRVQJCTB4MDAyYwotI2RlZmluZSBPTUFQNDQzMF9DTV9MM18xX0RZTkFNSUNERVBfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfSU5TVCwgMHgwMDJjKQotI2RlZmluZSBPTUFQNF9DTV9MM18yX0RZTkFNSUNERVBfUkVTVE9SRV9PRkZTRVQJCTB4MDAzMAotI2RlZmluZSBPTUFQNDQzMF9DTV9MM18yX0RZTkFNSUNERVBfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfSU5TVCwgMHgwMDMwKQotI2RlZmluZSBPTUFQNF9DTV9EMkRfRFlOQU1JQ0RFUF9SRVNUT1JFX09GRlNFVAkJMHgwMDM0Ci0jZGVmaW5lIE9NQVA0NDMwX0NNX0QyRF9EWU5BTUlDREVQX1JFU1RPUkUJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX0lOU1QsIDB4MDAzNCkKLSNkZWZpbmUgT01BUDRfQ01fTDRDRkdfRFlOQU1JQ0RFUF9SRVNUT1JFX09GRlNFVAkweDAwMzgKLSNkZWZpbmUgT01BUDQ0MzBfQ01fTDRDRkdfRFlOQU1JQ0RFUF9SRVNUT1JFCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfUkVTVE9SRV9JTlNULCAweDAwMzgpCi0jZGVmaW5lIE9NQVA0X0NNX0w0UEVSX0RZTkFNSUNERVBfUkVTVE9SRV9PRkZTRVQJMHgwMDNjCi0jZGVmaW5lIE9NQVA0NDMwX0NNX0w0UEVSX0RZTkFNSUNERVBfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfSU5TVCwgMHgwMDNjKQotI2RlZmluZSBPTUFQNF9DTV9MNFBFUl9HUElPMl9DTEtDVFJMX1JFU1RPUkVfT0ZGU0VUCTB4MDA0MAotI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9HUElPMl9DTEtDVFJMX1JFU1RPUkUJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX0lOU1QsIDB4MDA0MCkKLSNkZWZpbmUgT01BUDRfQ01fTDRQRVJfR1BJTzNfQ0xLQ1RSTF9SRVNUT1JFX09GRlNFVAkweDAwNDQKLSNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfR1BJTzNfQ0xLQ1RSTF9SRVNUT1JFCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfUkVTVE9SRV9JTlNULCAweDAwNDQpCi0jZGVmaW5lIE9NQVA0X0NNX0w0UEVSX0dQSU80X0NMS0NUUkxfUkVTVE9SRV9PRkZTRVQJMHgwMDQ4Ci0jZGVmaW5lIE9NQVA0NDMwX0NNX0w0UEVSX0dQSU80X0NMS0NUUkxfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfSU5TVCwgMHgwMDQ4KQotI2RlZmluZSBPTUFQNF9DTV9MNFBFUl9HUElPNV9DTEtDVFJMX1JFU1RPUkVfT0ZGU0VUCTB4MDA0YwotI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9HUElPNV9DTEtDVFJMX1JFU1RPUkUJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX0lOU1QsIDB4MDA0YykKLSNkZWZpbmUgT01BUDRfQ01fTDRQRVJfR1BJTzZfQ0xLQ1RSTF9SRVNUT1JFX09GRlNFVAkweDAwNTAKLSNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfR1BJTzZfQ0xLQ1RSTF9SRVNUT1JFCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfUkVTVE9SRV9JTlNULCAweDAwNTApCi0jZGVmaW5lIE9NQVA0X0NNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkVfT0ZGU0VUCTB4MDA1NAotI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTF9SRVNUT1JFCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX0lOU1QsIDB4MDA1NCkKLSNkZWZpbmUgT01BUDRfQ01fTDNJTklUX1VTQl9UTExfQ0xLQ1RSTF9SRVNUT1JFX09GRlNFVAkweDAwNTgKLSNkZWZpbmUgT01BUDQ0MzBfQ01fTDNJTklUX1VTQl9UTExfQ0xLQ1RSTF9SRVNUT1JFCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX0lOU1QsIDB4MDA1OCkKLSNkZWZpbmUgT01BUDRfQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRV9PRkZTRVQJCTB4MDA1YwotI2RlZmluZSBPTUFQNDQzMF9DTV9TRE1BX1NUQVRJQ0RFUF9SRVNUT1JFCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfUkVTVE9SRV9JTlNULCAweDAwNWMpCi0KIC8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIGV4dGVybiB1MzIgb21hcDRfY20yX3JlYWRfaW5zdF9yZWcoczE2IGluc3QsIHUxNiBpZHgpOwogZXh0ZXJuIHZvaWQgb21hcDRfY20yX3dyaXRlX2luc3RfcmVnKHUzMiB2YWwsIHMxNiBpbnN0LCB1MTYgaWR4KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLWJvYXJkLWRldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLWJvYXJkLWRldmljZXMuYwppbmRleCBlOTQ5MDNiLi5iY2IwYzU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi1ib2FyZC1kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24tYm9hcmQtZGV2aWNlcy5jCkBAIC0yMCwzNiArMjAsMTUgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KIAotI2luY2x1ZGUgPHBsYXQvaTJjLmg+CiAjaW5jbHVkZSA8cGxhdC9tY3NwaS5oPgogI2luY2x1ZGUgPHBsYXQvbmFuZC5oPgogCiAjaW5jbHVkZSAiY29tbW9uLWJvYXJkLWRldmljZXMuaCIKIAotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIHBtaWNfaTJjX2JvYXJkX2luZm8gPSB7Ci0JLmFkZHIJCT0gMHg0OCwKLQkuZmxhZ3MJCT0gSTJDX0NMSUVOVF9XQUtFLAotfTsKLQotdm9pZCBfX2luaXQgb21hcF9wbWljX2luaXQoaW50IGJ1cywgdTMyIGNsa3JhdGUsCi0JCQkgICBjb25zdCBjaGFyICpwbWljX3R5cGUsIGludCBwbWljX2lycSwKLQkJCSAgIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgKnBtaWNfZGF0YSkKLXsKLQlzdHJuY3B5KHBtaWNfaTJjX2JvYXJkX2luZm8udHlwZSwgcG1pY190eXBlLAotCQlzaXplb2YocG1pY19pMmNfYm9hcmRfaW5mby50eXBlKSk7Ci0JcG1pY19pMmNfYm9hcmRfaW5mby5pcnEgPSBwbWljX2lycTsKLQlwbWljX2kyY19ib2FyZF9pbmZvLnBsYXRmb3JtX2RhdGEgPSBwbWljX2RhdGE7Ci0KLQlvbWFwX3JlZ2lzdGVyX2kyY19idXMoYnVzLCBjbGtyYXRlLCAmcG1pY19pMmNfYm9hcmRfaW5mbywgMSk7Ci19Ci0KICNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2KSB8fCBcCiAJZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0Nl9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IG9tYXAyX21jc3BpX2RldmljZV9jb25maWcgYWRzNzg0Nl9tY3NwaV9jb25maWcgPSB7CkBAIC04NSwxOCArNjQsMTggQEAKIAlzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKnNwaV9iaSA9ICZhZHM3ODQ2X3NwaV9ib2FyZF9pbmZvOwogCWludCBlcnI7CiAKLQllcnIgPSBncGlvX3JlcXVlc3QoZ3Bpb19wZW5kb3duLCAiVFMgUGVuRG93biIpOwotCWlmIChlcnIpIHsKLQkJcHJfZXJyKCJDb3VsZCBub3Qgb2J0YWluIGdwaW8gZm9yIFRTIFBlbkRvd246ICVkXG4iLCBlcnIpOwotCQlyZXR1cm47CisJaWYgKGJvYXJkX3BkYXRhICYmIGJvYXJkX3BkYXRhLT5nZXRfcGVuZG93bl9zdGF0ZSkgeworCQllcnIgPSBncGlvX3JlcXVlc3Rfb25lKGdwaW9fcGVuZG93biwgR1BJT0ZfSU4sICJUU1BlbkRvd24iKTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJDb3VsZG4ndCBvYnRhaW4gZ3BpbyBmb3IgVFNQZW5Eb3duOiAlZFxuIiwgZXJyKTsKKwkJCXJldHVybjsKKwkJfQorCQlncGlvX2V4cG9ydChncGlvX3BlbmRvd24sIDApOworCisJCWlmIChncGlvX2RlYm91bmNlKQorCQkJZ3Bpb19zZXRfZGVib3VuY2UoZ3Bpb19wZW5kb3duLCBncGlvX2RlYm91bmNlKTsKIAl9CiAKLQlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvX3BlbmRvd24pOwotCWdwaW9fZXhwb3J0KGdwaW9fcGVuZG93biwgMCk7Ci0KLQlpZiAoZ3Bpb19kZWJvdW5jZSkKLQkJZ3Bpb19zZXRfZGVib3VuY2UoZ3Bpb19wZW5kb3duLCBncGlvX2RlYm91bmNlKTsKLQogCWFkczc4NDZfY29uZmlnLmdwaW9fcGVuZG93biA9IGdwaW9fcGVuZG93bjsKIAogCXNwaV9iaS0+YnVzX251bQk9IGJ1c19udW07CkBAIC0xMTUsOSArOTQsNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMikgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfT01BUDJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBvbWFwX25hbmRfcGxhdGZvcm1fZGF0YSBuYW5kX2RhdGEgPSB7Ci0JLmRtYV9jaGFubmVsCT0gLTEsCQkvKiBkaXNhYmxlIERNQSBpbiBPTUFQIE5BTkQgZHJpdmVyICovCi19Oworc3RhdGljIHN0cnVjdCBvbWFwX25hbmRfcGxhdGZvcm1fZGF0YSBuYW5kX2RhdGE7CiAKIHZvaWQgX19pbml0IG9tYXBfbmFuZF9mbGFzaF9pbml0KGludCBvcHRpb25zLCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHMsCiAJCQkJIGludCBucl9wYXJ0cykKQEAgLTE0OCw3ICsxMjUsNyBAQAogCQluYW5kX2RhdGEuY3MgPSBuYW5kY3M7CiAJCW5hbmRfZGF0YS5wYXJ0cyA9IHBhcnRzOwogCQluYW5kX2RhdGEubnJfcGFydHMgPSBucl9wYXJ0czsKLQkJbmFuZF9kYXRhLm9wdGlvbnMgPSBvcHRpb25zOworCQluYW5kX2RhdGEuZGV2c2l6ZSA9IG9wdGlvbnM7CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUmVnaXN0ZXJpbmcgTkFORCBvbiBDUyVkXG4iLCBuYW5kY3MpOwogCQlpZiAoZ3BtY19uYW5kX2luaXQoJm5hbmRfZGF0YSkgPCAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24tYm9hcmQtZGV2aWNlcy5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24tYm9hcmQtZGV2aWNlcy5oCmluZGV4IGViODBiM2IuLmEwYjRhNDI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi1ib2FyZC1kZXZpY2VzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24tYm9hcmQtZGV2aWNlcy5oCkBAIC0xLDMxICsxLDExIEBACiAjaWZuZGVmIF9fT01BUF9DT01NT05fQk9BUkRfREVWSUNFU19fCiAjZGVmaW5lIF9fT01BUF9DT01NT05fQk9BUkRfREVWSUNFU19fCiAKLXN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGE7CisjaW5jbHVkZSAidHdsLWNvbW1vbi5oIgorCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQlTWl8xMjhLCisKIHN0cnVjdCBtdGRfcGFydGl0aW9uOwotCi12b2lkIG9tYXBfcG1pY19pbml0KGludCBidXMsIHUzMiBjbGtyYXRlLCBjb25zdCBjaGFyICpwbWljX3R5cGUsIGludCBwbWljX2lycSwKLQkJICAgIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgKnBtaWNfZGF0YSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMl9wbWljX2luaXQoY29uc3QgY2hhciAqcG1pY190eXBlLAotCQkJCSAgIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgKnBtaWNfZGF0YSkKLXsKLQlvbWFwX3BtaWNfaW5pdCgyLCAyNjAwLCBwbWljX3R5cGUsIElOVF8yNFhYX1NZU19OSVJRLCBwbWljX2RhdGEpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgb21hcDNfcG1pY19pbml0KGNvbnN0IGNoYXIgKnBtaWNfdHlwZSwKLQkJCQkgICBzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhICpwbWljX2RhdGEpCi17Ci0Jb21hcF9wbWljX2luaXQoMSwgMjYwMCwgcG1pY190eXBlLCBJTlRfMzRYWF9TWVNfTklSUSwgcG1pY19kYXRhKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG9tYXA0X3BtaWNfaW5pdChjb25zdCBjaGFyICpwbWljX3R5cGUsCi0JCQkJICAgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSAqcG1pY19kYXRhKQotewotCS8qIFBob2VuaXggQXVkaW8gSUMgbmVlZHMgSTJDMSB0byBzdGFydCB3aXRoIDQwMCBLSHogb3IgbGVzcyAqLwotCW9tYXBfcG1pY19pbml0KDEsIDQwMCwgcG1pY190eXBlLCBPTUFQNDRYWF9JUlFfU1lTXzFOLCBwbWljX2RhdGEpOwotfQotCiBzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhOwogCiB2b2lkIG9tYXBfYWRzNzg0Nl9pbml0KGludCBidXNfbnVtLCBpbnQgZ3Bpb19wZW5kb3duLCBpbnQgZ3Bpb19kZWJvdW5jZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY29udHJvbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb250cm9sLmMKaW5kZXggZGE1M2JhMy4uYWFiODg0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb250cm9sLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb250cm9sLmMKQEAgLTI4NiwxNCArMjg2LDE1IEBACiAJc2NyYXRjaHBhZF9jb250ZW50cy5ib290X2NvbmZpZ19wdHIgPSAweDA7CiAJaWYgKGNwdV9pc19vbWFwMzYzMCgpKQogCQlzY3JhdGNocGFkX2NvbnRlbnRzLnB1YmxpY19yZXN0b3JlX3B0ciA9Ci0JCQl2aXJ0X3RvX3BoeXMoZ2V0X29tYXAzNjMwX3Jlc3RvcmVfcG9pbnRlcigpKTsKKwkJCXZpcnRfdG9fcGh5cyhvbWFwM19yZXN0b3JlXzM2MzApOwogCWVsc2UgaWYgKG9tYXBfcmV2KCkgIT0gT01BUDM0MzBfUkVWX0VTM18wICYmCiAJCQkJCW9tYXBfcmV2KCkgIT0gT01BUDM0MzBfUkVWX0VTM18xKQogCQlzY3JhdGNocGFkX2NvbnRlbnRzLnB1YmxpY19yZXN0b3JlX3B0ciA9Ci0JCQl2aXJ0X3RvX3BoeXMoZ2V0X3Jlc3RvcmVfcG9pbnRlcigpKTsKKwkJCXZpcnRfdG9fcGh5cyhvbWFwM19yZXN0b3JlKTsKIAllbHNlCiAJCXNjcmF0Y2hwYWRfY29udGVudHMucHVibGljX3Jlc3RvcmVfcHRyID0KLQkJCXZpcnRfdG9fcGh5cyhnZXRfZXMzX3Jlc3RvcmVfcG9pbnRlcigpKTsKKwkJCXZpcnRfdG9fcGh5cyhvbWFwM19yZXN0b3JlX2VzMyk7CisKIAlpZiAob21hcF90eXBlKCkgPT0gT01BUDJfREVWSUNFX1RZUEVfR1ApCiAJCXNjcmF0Y2hwYWRfY29udGVudHMuc2VjdXJlX3JhbV9yZXN0b3JlX3B0ciA9IDB4MDsKIAllbHNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbnRyb2wuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY29udHJvbC5oCmluZGV4IGEwMTZjOGIuLmQ0ZWY3NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY29udHJvbC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY29udHJvbC5oCkBAIC0zODYsOSArMzg2LDkgQEAKIAogZXh0ZXJuIHZvaWQgb21hcDNfc2F2ZV9zY3JhdGNocGFkX2NvbnRlbnRzKHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcDNfY2xlYXJfc2NyYXRjaHBhZF9jb250ZW50cyh2b2lkKTsKLWV4dGVybiB1MzIgKmdldF9yZXN0b3JlX3BvaW50ZXIodm9pZCk7Ci1leHRlcm4gdTMyICpnZXRfZXMzX3Jlc3RvcmVfcG9pbnRlcih2b2lkKTsKLWV4dGVybiB1MzIgKmdldF9vbWFwMzYzMF9yZXN0b3JlX3BvaW50ZXIodm9pZCk7CitleHRlcm4gdm9pZCBvbWFwM19yZXN0b3JlKHZvaWQpOworZXh0ZXJuIHZvaWQgb21hcDNfcmVzdG9yZV9lczModm9pZCk7CitleHRlcm4gdm9pZCBvbWFwM19yZXN0b3JlXzM2MzAodm9pZCk7CiBleHRlcm4gdTMyIG9tYXAzX2FybV9jb250ZXh0WzEyOF07CiBleHRlcm4gdm9pZCBvbWFwM19jb250cm9sX3NhdmVfY29udGV4dCh2b2lkKTsKIGV4dGVybiB2b2lkIG9tYXAzX2NvbnRyb2xfcmVzdG9yZV9jb250ZXh0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYwppbmRleCA3Yjg1NTg1Li41YjhjYTY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYwpAQCAtOTcsNyArOTcsNyBAQAogCiAJV0FSTihJU19FUlIob2QpLCAiY291bGQgbm90IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlc1xuIiwgb2hfbmFtZSk7CiAKLQlyZXR1cm4gUFRSX0VSUihvZCk7CisJcmV0dXJuIElTX0VSUihvZCkgPyBQVFJfRVJSKG9kKSA6IDA7CiB9CiBwb3N0Y29yZV9pbml0Y2FsbChvbWFwNF9sM19pbml0KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwaW8uYwppbmRleCA5NTI5ODQyLi4yNzY1Y2RjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwaW8uYwpAQCAtNjEsMTMgKzYxLDQ1IEBACiAJcGRhdGEtPmRiY2tfZmxhZyA9IGRldl9hdHRyLT5kYmNrX2ZsYWc7CiAJcGRhdGEtPnZpcnR1YWxfaXJxX3N0YXJ0ID0gSUhfR1BJT19CQVNFICsgMzIgKiAoaWQgLSAxKTsKIAorCXBkYXRhLT5yZWdzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfZ3Bpb19yZWdfb2ZmcyksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpIHsKKwkJcHJfZXJyKCJncGlvJWQ6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgaWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlzd2l0Y2ggKG9oLT5jbGFzcy0+cmV2KSB7CiAJY2FzZSAwOgogCWNhc2UgMToKIAkJcGRhdGEtPmJhbmtfdHlwZSA9IE1FVEhPRF9HUElPXzI0WFg7CisJCXBkYXRhLT5yZWdzLT5yZXZpc2lvbiA9IE9NQVAyNFhYX0dQSU9fUkVWSVNJT047CisJCXBkYXRhLT5yZWdzLT5kaXJlY3Rpb24gPSBPTUFQMjRYWF9HUElPX09FOworCQlwZGF0YS0+cmVncy0+ZGF0YWluID0gT01BUDI0WFhfR1BJT19EQVRBSU47CisJCXBkYXRhLT5yZWdzLT5kYXRhb3V0ID0gT01BUDI0WFhfR1BJT19EQVRBT1VUOworCQlwZGF0YS0+cmVncy0+c2V0X2RhdGFvdXQgPSBPTUFQMjRYWF9HUElPX1NFVERBVEFPVVQ7CisJCXBkYXRhLT5yZWdzLT5jbHJfZGF0YW91dCA9IE9NQVAyNFhYX0dQSU9fQ0xFQVJEQVRBT1VUOworCQlwZGF0YS0+cmVncy0+aXJxc3RhdHVzID0gT01BUDI0WFhfR1BJT19JUlFTVEFUVVMxOworCQlwZGF0YS0+cmVncy0+aXJxc3RhdHVzMiA9IE9NQVAyNFhYX0dQSU9fSVJRU1RBVFVTMjsKKwkJcGRhdGEtPnJlZ3MtPmlycWVuYWJsZSA9IE9NQVAyNFhYX0dQSU9fSVJRRU5BQkxFMTsKKwkJcGRhdGEtPnJlZ3MtPnNldF9pcnFlbmFibGUgPSBPTUFQMjRYWF9HUElPX1NFVElSUUVOQUJMRTE7CisJCXBkYXRhLT5yZWdzLT5jbHJfaXJxZW5hYmxlID0gT01BUDI0WFhfR1BJT19DTEVBUklSUUVOQUJMRTE7CisJCXBkYXRhLT5yZWdzLT5kZWJvdW5jZSA9IE9NQVAyNFhYX0dQSU9fREVCT1VOQ0VfVkFMOworCQlwZGF0YS0+cmVncy0+ZGVib3VuY2VfZW4gPSBPTUFQMjRYWF9HUElPX0RFQk9VTkNFX0VOOwogCQlicmVhazsKIAljYXNlIDI6CiAJCXBkYXRhLT5iYW5rX3R5cGUgPSBNRVRIT0RfR1BJT180NFhYOworCQlwZGF0YS0+cmVncy0+cmV2aXNpb24gPSBPTUFQNF9HUElPX1JFVklTSU9OOworCQlwZGF0YS0+cmVncy0+ZGlyZWN0aW9uID0gT01BUDRfR1BJT19PRTsKKwkJcGRhdGEtPnJlZ3MtPmRhdGFpbiA9IE9NQVA0X0dQSU9fREFUQUlOOworCQlwZGF0YS0+cmVncy0+ZGF0YW91dCA9IE9NQVA0X0dQSU9fREFUQU9VVDsKKwkJcGRhdGEtPnJlZ3MtPnNldF9kYXRhb3V0ID0gT01BUDRfR1BJT19TRVREQVRBT1VUOworCQlwZGF0YS0+cmVncy0+Y2xyX2RhdGFvdXQgPSBPTUFQNF9HUElPX0NMRUFSREFUQU9VVDsKKwkJcGRhdGEtPnJlZ3MtPmlycXN0YXR1cyA9IE9NQVA0X0dQSU9fSVJRU1RBVFVTMDsKKwkJcGRhdGEtPnJlZ3MtPmlycXN0YXR1czIgPSBPTUFQNF9HUElPX0lSUVNUQVRVUzE7CisJCXBkYXRhLT5yZWdzLT5pcnFlbmFibGUgPSBPTUFQNF9HUElPX0lSUVNUQVRVU1NFVDA7CisJCXBkYXRhLT5yZWdzLT5zZXRfaXJxZW5hYmxlID0gT01BUDRfR1BJT19JUlFTVEFUVVNTRVQwOworCQlwZGF0YS0+cmVncy0+Y2xyX2lycWVuYWJsZSA9IE9NQVA0X0dQSU9fSVJRU1RBVFVTQ0xSMDsKKwkJcGRhdGEtPnJlZ3MtPmRlYm91bmNlID0gT01BUDRfR1BJT19ERUJPVU5DSU5HVElNRTsKKwkJcGRhdGEtPnJlZ3MtPmRlYm91bmNlX2VuID0gT01BUDRfR1BJT19ERUJPVU5DRU5BQkxFOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlXQVJOKDEsICJJbnZhbGlkIGdwaW8gYmFua190eXBlXG4iKTsKQEAgLTg3LDYgKzExOSw4IEBACiAJCXJldHVybiBQVFJfRVJSKG9kKTsKIAl9CiAKKwlvbWFwX2RldmljZV9kaXNhYmxlX2lkbGVfb25fc3VzcGVuZChvZCk7CisKIAlncGlvX2JhbmtfY291bnQrKzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvZ3BtYy1uYW5kLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwbWMtbmFuZC5jCmluZGV4IGMxNzkxZDAuLjhhZDIxMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZ3BtYy1uYW5kLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ncG1jLW5hbmQuYwpAQCAtMjAsOCArMjAsNiBAQAogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KIAotc3RhdGljIHN0cnVjdCBvbWFwX25hbmRfcGxhdGZvcm1fZGF0YSAqZ3BtY19uYW5kX2RhdGE7Ci0KIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZ3BtY19uYW5kX3Jlc291cmNlID0gewogCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKIH07CkBAIC0zMyw3ICszMSw3IEBACiAJLnJlc291cmNlCT0gJmdwbWNfbmFuZF9yZXNvdXJjZSwKIH07CiAKLXN0YXRpYyBpbnQgb21hcDJfbmFuZF9ncG1jX3JldGltZSh2b2lkKQorc3RhdGljIGludCBvbWFwMl9uYW5kX2dwbWNfcmV0aW1lKHN0cnVjdCBvbWFwX25hbmRfcGxhdGZvcm1fZGF0YSAqZ3BtY19uYW5kX2RhdGEpCiB7CiAJc3RydWN0IGdwbWNfdGltaW5ncyB0OwogCWludCBlcnI7CkBAIC04MywxMyArODEsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IF9faW5pdCBncG1jX25hbmRfaW5pdChzdHJ1Y3Qgb21hcF9uYW5kX3BsYXRmb3JtX2RhdGEgKl9uYW5kX2RhdGEpCitpbnQgX19pbml0IGdwbWNfbmFuZF9pbml0KHN0cnVjdCBvbWFwX25hbmRfcGxhdGZvcm1fZGF0YSAqZ3BtY19uYW5kX2RhdGEpCiB7CiAJaW50IGVycgk9IDA7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmdwbWNfbmFuZF9kZXZpY2UuZGV2OwogCi0JZ3BtY19uYW5kX2RhdGEgPSBfbmFuZF9kYXRhOwotCWdwbWNfbmFuZF9kYXRhLT5uYW5kX3NldHVwID0gb21hcDJfbmFuZF9ncG1jX3JldGltZTsKIAlncG1jX25hbmRfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gZ3BtY19uYW5kX2RhdGE7CiAKIAllcnIgPSBncG1jX2NzX3JlcXVlc3QoZ3BtY19uYW5kX2RhdGEtPmNzLCBOQU5EX0lPX1NJWkUsCkBAIC0xMDAsNyArOTYsNyBAQAogCX0KIAogCSAvKiBTZXQgdGltaW5ncyBpbiBHUE1DICovCi0JZXJyID0gb21hcDJfbmFuZF9ncG1jX3JldGltZSgpOworCWVyciA9IG9tYXAyX25hbmRfZ3BtY19yZXRpbWUoZ3BtY19uYW5kX2RhdGEpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIHNldCBncG1jIHRpbWluZ3M6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5jCmluZGV4IGIyZjMwYmUuLjY2ODY4YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmMKQEAgLTE0NSw2ICsxNDUsNyBAQAogCQkJCSBpbnQgcG93ZXJfb24sIGludCB2ZGQpCiB7CiAJdTMyIHJlZzsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKIAlpZiAocG93ZXJfb24pIHsKIAkJcmVnID0gb21hcDRfY3RybF9wYWRfcmVhZGwoY29udHJvbF9wYmlhc19vZmZzZXQpOwpAQCAtMTU3LDkgKzE1OCwxNSBAQAogCQkJT01BUDRfTU1DMV9QV1JETlpfTUFTSyB8CiAJCQlPTUFQNF9VU0JDMV9JQ1VTQl9QV1JETlpfTUFTSyk7CiAJCW9tYXA0X2N0cmxfcGFkX3dyaXRlbChyZWcsIGNvbnRyb2xfcGJpYXNfb2Zmc2V0KTsKLQkJLyogNCBtaWNyb3NlYyBkZWxheSBmb3IgY29tcGFyYXRvciB0byBnZW5lcmF0ZSBhbiBlcnJvciovCi0JCXVkZWxheSg0KTsKLQkJcmVnID0gb21hcDRfY3RybF9wYWRfcmVhZGwoY29udHJvbF9wYmlhc19vZmZzZXQpOworCisJCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1KTsKKwkJZG8geworCQkJcmVnID0gb21hcDRfY3RybF9wYWRfcmVhZGwoY29udHJvbF9wYmlhc19vZmZzZXQpOworCQkJaWYgKCEocmVnICYgT01BUDRfTU1DMV9QQklBU0xJVEVfVk1PREVfRVJST1JfTUFTSykpCisJCQkJYnJlYWs7CisJCQl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCQl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSk7CisKIAkJaWYgKHJlZyAmIE9NQVA0X01NQzFfUEJJQVNMSVRFX1ZNT0RFX0VSUk9SX01BU0spIHsKIAkJCXByX2VycigiUGJpYXMgVm9sdGFnZSBpcyBub3Qgc2FtZSBhcyBMRE9cbiIpOwogCQkJLyogQ2F1dGlvbiA6IE9uIFZNT0RFX0VSUk9SIFBvd2VyIERvd24gTU1DIElPICovCkBAIC0zMzEsNiArMzM4LDkgQEAKIAlpZiAoYy0+bm9fb2ZmKQogCQltbWMtPnNsb3RzWzBdLm5vX29mZiA9IDE7CiAKKwlpZiAoYy0+bm9fb2ZmX2luaXQpCisJCW1tYy0+c2xvdHNbMF0ubm9fcmVndWxhdG9yX29mZl9pbml0ID0gYy0+bm9fb2ZmX2luaXQ7CisKIAlpZiAoYy0+dmNjX2F1eF9kaXNhYmxlX2lzX3NsZWVwKQogCQltbWMtPnNsb3RzWzBdLnZjY19hdXhfZGlzYWJsZV9pc19zbGVlcCA9IDE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuaAppbmRleCBmMTE5MzQ4Li5mNzU3ZTc4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5oCkBAIC0xOCw2ICsxOCw3IEBACiAJYm9vbAlub25yZW1vdmFibGU7CS8qIE5vbnJlbW92YWJsZSBlLmcuIGVNTUMgKi8KIAlib29sCXBvd2VyX3NhdmluZzsJLyogVHJ5IHRvIHNsZWVwIG9yIHBvd2VyIG9mZiB3aGVuIHBvc3NpYmxlICovCiAJYm9vbAlub19vZmY7CQkvKiBwb3dlcl9zYXZpbmcgYW5kIHBvd2VyIGlzIG5vdCB0byBnbyBvZmYgKi8KKwlib29sCW5vX29mZl9pbml0OwkvKiBubyBwb3dlciBvZmYgd2hlbiBub3QgaW4gTU1DIHNsZWVwIHN0YXRlICovCiAJYm9vbAl2Y2NfYXV4X2Rpc2FibGVfaXNfc2xlZXA7IC8qIFJlZ3VsYXRvciBvZmYgcmVtYXBwZWQgdG8gc2xlZXAgKi8KIAlpbnQJZ3Bpb19jZDsJLyogb3IgLUVJTlZBTCAqLwogCWludAlncGlvX3dwOwkvKiBvciAtRUlOVkFMICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwppbmRleCBhNDg2OTBiLi5jZWI4YjdlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKQEAgLTE2NSw2ICsxNjUsMyBAQAogI2VuZGlmCiAKICNlbmRpZgkvKiBNVUxUSV9PTUFQMiAqLwotCi0JCS5tYWNybwlpcnFfcHJpb190YWJsZQotCQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jCmluZGV4IDQ0MWU3OWQuLjJjZTFjZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmMKQEAgLTMzMywyMyArMzMzLDkgQEAKIAlyZXR1cm4gb21hcF9od21vZF9zZXRfcG9zdHNldHVwX3N0YXRlKG9oLCAqKHU4ICopZGF0YSk7CiB9CiAKKy8qIFNlZSBpcnEuYywgb21hcDQtY29tbW9uLmMgYW5kIGVudHJ5LW1hY3JvLlMgKi8KIHZvaWQgX19pb21lbSAqb21hcF9pcnFfYmFzZTsKIAotLyoKLSAqIEluaXRpYWxpemUgYXNtX2lycV9iYXNlIGZvciBlbnRyeS1tYWNyby5TCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2lycV9iYXNlX2luaXQodm9pZCkKLXsKLQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCi0JCW9tYXBfaXJxX2Jhc2UgPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVAyNFhYX0lDX0JBU0UpOwotCWVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKQotCQlvbWFwX2lycV9iYXNlID0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQMzRYWF9JQ19CQVNFKTsKLQllbHNlIGlmIChjcHVfaXNfb21hcDQ0eHgoKSkKLQkJb21hcF9pcnFfYmFzZSA9IE9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDQ0WFhfR0lDX0NQVV9CQVNFKTsKLQllbHNlCi0JCXByX2VycigiQ291bGQgbm90IGluaXRpYWxpemUgb21hcF9pcnFfYmFzZVxuIik7Ci19Ci0KIHZvaWQgX19pbml0IG9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKHZvaWQpCiB7CiAJdTggcG9zdHNldHVwX3N0YXRlOwpAQCAtNDIyLDcgKzQwOCw2IEBACiAJCV9vbWFwMl9pbml0X3JlcHJvZ3JhbV9zZHJjKCk7CiAJfQogCi0Jb21hcF9pcnFfYmFzZV9pbml0KCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pcnEuYwppbmRleCAzYWYyYjdhLi4zYTEyZjc1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaXJxLmMKQEAgLTE0MSwyNSArMTQxLDIwIEBACiAJCQkJSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFLCAwKTsKIH0KIAotdm9pZCBfX2luaXQgb21hcF9pbml0X2lycSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG9tYXBfaW5pdF9pcnEodTMyIGJhc2UsIGludCBucl9pcnFzKQogewogCXVuc2lnbmVkIGxvbmcgbnJfb2ZfaXJxcyA9IDA7CiAJdW5zaWduZWQgaW50IG5yX2JhbmtzID0gMDsKIAlpbnQgaSwgajsKIAorCW9tYXBfaXJxX2Jhc2UgPSBpb3JlbWFwKGJhc2UsIFNaXzRLKTsKKwlpZiAoV0FSTl9PTighb21hcF9pcnFfYmFzZSkpCisJCXJldHVybjsKKwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlycV9iYW5rcyk7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIGJhc2UgPSAwOwogCQlzdHJ1Y3Qgb21hcF9pcnFfYmFuayAqYmFuayA9IGlycV9iYW5rcyArIGk7CiAKLQkJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQotCQkJYmFzZSA9IE9NQVAyNFhYX0lDX0JBU0U7Ci0JCWVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKQotCQkJYmFzZSA9IE9NQVAzNFhYX0lDX0JBU0U7Ci0KLQkJQlVHX09OKCFiYXNlKTsKLQotCQlpZiAoY3B1X2lzX3RpODE2eCgpKQotCQkJYmFuay0+bnJfaXJxcyA9IDEyODsKKwkJYmFuay0+bnJfaXJxcyA9IG5yX2lycXM7CiAKIAkJLyogU3RhdGljIG1hcHBpbmcsIG5ldmVyIHJlbGVhc2VkICovCiAJCWJhbmstPmJhc2VfcmVnID0gaW9yZW1hcChiYXNlLCBTWl80Syk7CkBAIC0xODEsNiArMTc2LDIxIEBACiAJICAgICAgIG5yX29mX2lycXMsIG5yX2JhbmtzLCBucl9iYW5rcyA+IDEgPyAicyIgOiAiIik7CiB9CiAKK3ZvaWQgX19pbml0IG9tYXAyX2luaXRfaXJxKHZvaWQpCit7CisJb21hcF9pbml0X2lycShPTUFQMjRYWF9JQ19CQVNFLCA5Nik7Cit9CisKK3ZvaWQgX19pbml0IG9tYXAzX2luaXRfaXJxKHZvaWQpCit7CisJb21hcF9pbml0X2lycShPTUFQMzRYWF9JQ19CQVNFLCA5Nik7Cit9CisKK3ZvaWQgX19pbml0IHRpODE2eF9pbml0X2lycSh2b2lkKQoreworCW9tYXBfaW5pdF9pcnEoT01BUDM0WFhfSUNfQkFTRSwgMTI4KTsKK30KKwogI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCiBzdGF0aWMgc3RydWN0IG9tYXAzX2ludGNfcmVncyBpbnRjX2NvbnRleHRbQVJSQVlfU0laRShpcnFfYmFua3MpXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmMKaW5kZXggYTRhYjFlMy4uYzdmYjIyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5jCkBAIC04Myw2ICs4Myw5IEBACiB2b2lkIG9tYXBfbXV4X3dyaXRlX2FycmF5KHN0cnVjdCBvbWFwX211eF9wYXJ0aXRpb24gKnBhcnRpdGlvbiwKIAkJCQkgc3RydWN0IG9tYXBfYm9hcmRfbXV4ICpib2FyZF9tdXgpCiB7CisJaWYgKCFib2FyZF9tdXgpCisJCXJldHVybjsKKwogCXdoaWxlIChib2FyZF9tdXgtPnJlZ19vZmZzZXQgIT0gT01BUF9NVVhfVEVSTUlOQVRPUikgewogCQlvbWFwX211eF93cml0ZShwYXJ0aXRpb24sIGJvYXJkX211eC0+dmFsdWUsCiAJCQkgICAgICAgYm9hcmRfbXV4LT5yZWdfb2Zmc2V0KTsKQEAgLTkwNiw3ICs5MDksNyBAQAogdTE2IG9tYXBfbXV4X2dldF9ncGlvKGludCBncGlvKQogewogCXN0cnVjdCBvbWFwX211eF9wYXJ0aXRpb24gKnBhcnRpdGlvbjsKLQlzdHJ1Y3Qgb21hcF9tdXggKm07CisJc3RydWN0IG9tYXBfbXV4ICptID0gTlVMTDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGFydGl0aW9uLCAmbXV4X3BhcnRpdGlvbnMsIG5vZGUpIHsKIAkJbSA9IG9tYXBfbXV4X2dldF9ieV9ncGlvKHBhcnRpdGlvbiwgZ3Bpbyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguaAppbmRleCAxMzdmMzIxLi4yMTMyMzA4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmgKQEAgLTMyMywxMCArMzIzLDEyIEBACiAKIC8qKgogICogb21hcDRfbXV4X2luaXQoKSAtIGluaXRpYWxpemUgbXV4IHN5c3RlbSB3aXRoIGJvYXJkIHNwZWNpZmljIHNldAotICogQGJvYXJkX211eDoJCUJvYXJkIHNwZWNpZmljIG11eCB0YWJsZQorICogQGJvYXJkX3N1YnNldDoJQm9hcmQgc3BlY2lmaWMgbXV4IHRhYmxlCisgKiBAYm9hcmRfd2t1cF9zdWJzZXQ6CUJvYXJkIHNwZWNpZmljIG11eCB0YWJsZSBmb3Igd2FrZXVwIGluc3RhbmNlCiAgKiBAZmxhZ3M6CQlPTUFQIHBhY2thZ2UgdHlwZSB1c2VkIGZvciB0aGUgYm9hcmQKICAqLwotaW50IG9tYXA0X211eF9pbml0KHN0cnVjdCBvbWFwX2JvYXJkX211eCAqYm9hcmRfbXV4LCBpbnQgZmxhZ3MpOworaW50IG9tYXA0X211eF9pbml0KHN0cnVjdCBvbWFwX2JvYXJkX211eCAqYm9hcmRfc3Vic2V0LAorCXN0cnVjdCBvbWFwX2JvYXJkX211eCAqYm9hcmRfd2t1cF9zdWJzZXQsIGludCBmbGFncyk7CiAKIC8qKgogICogb21hcF9tdXhfaW5pdCAtIHByaXZhdGUgbXV4IGluaXQgZnVuY3Rpb24sIGRvIG5vdCBjYWxsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL211eDQ0eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4NDR4eC5jCmluZGV4IDlhNjY0NDUuLmY1YTc0ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4NDR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4NDR4eC5jCkBAIC0xMzA5LDcgKzEzMDksOCBAQAogI2RlZmluZSBvbWFwNF93a3VwX2NibF9jYnNfYmFsbCAgTlVMTAogI2VuZGlmCiAKLWludCBfX2luaXQgb21hcDRfbXV4X2luaXQoc3RydWN0IG9tYXBfYm9hcmRfbXV4ICpib2FyZF9zdWJzZXQsIGludCBmbGFncykKK2ludCBfX2luaXQgb21hcDRfbXV4X2luaXQoc3RydWN0IG9tYXBfYm9hcmRfbXV4ICpib2FyZF9zdWJzZXQsCisJc3RydWN0IG9tYXBfYm9hcmRfbXV4ICpib2FyZF93a3VwX3N1YnNldCwgaW50IGZsYWdzKQogewogCXN0cnVjdCBvbWFwX2JhbGwgKnBhY2thZ2VfYmFsbHNfY29yZTsKIAlzdHJ1Y3Qgb21hcF9iYWxsICpwYWNrYWdlX2JhbGxzX3drdXAgPSBvbWFwNF93a3VwX2NibF9jYnNfYmFsbDsKQEAgLTEzNDcsNyArMTM0OCw3IEBACiAJCQkgICAgT01BUF9NVVhfR1BJT19JTl9NT0RFMywKIAkJCSAgICBPTUFQNF9DVFJMX01PRFVMRV9QQURfV0tVUF9NVVhfUEJBU0UsCiAJCQkgICAgT01BUDRfQ1RSTF9NT0RVTEVfUEFEX1dLVVBfTVVYX1NJWkUsCi0JCQkgICAgb21hcDRfd2t1cF9tdXhtb2RlcywgTlVMTCwgYm9hcmRfc3Vic2V0LAorCQkJICAgIG9tYXA0X3drdXBfbXV4bW9kZXMsIE5VTEwsIGJvYXJkX3drdXBfc3Vic2V0LAogCQkJICAgIHBhY2thZ2VfYmFsbHNfd2t1cCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXNtcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXNtcC5jCmluZGV4IGVjZmU5M2MuLmNlNjVlOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1zbXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtc21wLmMKQEAgLTEyNSwxNCArMTI1LDYgQEAKIAogdm9pZCBfX2luaXQgcGxhdGZvcm1fc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7Ci0JaW50IGk7Ci0KLQkvKgotCSAqIEluaXRpYWxpc2UgdGhlIHByZXNlbnQgbWFwLCB3aGljaCBkZXNjcmliZXMgdGhlIHNldCBvZiBDUFVzCi0JICogYWN0dWFsbHkgcG9wdWxhdGVkIGF0IHRoZSBwcmVzZW50IHRpbWUuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IG1heF9jcHVzOyBpKyspCi0JCXNldF9jcHVfcHJlc2VudChpLCB0cnVlKTsKIAogCS8qCiAJICogSW5pdGlhbGlzZSB0aGUgU0NVIGFuZCB3YWtlIHVwIHRoZSBzZWNvbmRhcnkgY29yZSB1c2luZwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwNC1jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcDQtY29tbW9uLmMKaW5kZXggOWVmOGMyOS4uMzVhYzNlNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwNC1jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXA0LWNvbW1vbi5jCkBAIC0xOSw2ICsxOSw4IEBACiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+CiAKKyNpbmNsdWRlIDxwbGF0L2lycXMuaD4KKwogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL29tYXA0LWNvbW1vbi5oPgogCkBAIC0zMSwxNyArMzMsMTUgQEAKIAogdm9pZCBfX2luaXQgZ2ljX2luaXRfaXJxKHZvaWQpCiB7Ci0Jdm9pZCBfX2lvbWVtICpnaWNfY3B1X2Jhc2U7Ci0KIAkvKiBTdGF0aWMgbWFwcGluZywgbmV2ZXIgcmVsZWFzZWQgKi8KIAlnaWNfZGlzdF9iYXNlX2FkZHIgPSBpb3JlbWFwKE9NQVA0NFhYX0dJQ19ESVNUX0JBU0UsIFNaXzRLKTsKIAlCVUdfT04oIWdpY19kaXN0X2Jhc2VfYWRkcik7CiAKIAkvKiBTdGF0aWMgbWFwcGluZywgbmV2ZXIgcmVsZWFzZWQgKi8KLQlnaWNfY3B1X2Jhc2UgPSBpb3JlbWFwKE9NQVA0NFhYX0dJQ19DUFVfQkFTRSwgU1pfNTEyKTsKLQlCVUdfT04oIWdpY19jcHVfYmFzZSk7CisJb21hcF9pcnFfYmFzZSA9IGlvcmVtYXAoT01BUDQ0WFhfR0lDX0NQVV9CQVNFLCBTWl81MTIpOworCUJVR19PTighb21hcF9pcnFfYmFzZSk7CiAKLQlnaWNfaW5pdCgwLCAyOSwgZ2ljX2Rpc3RfYmFzZV9hZGRyLCBnaWNfY3B1X2Jhc2UpOworCWdpY19pbml0KDAsIDI5LCBnaWNfZGlzdF9iYXNlX2FkZHIsIG9tYXBfaXJxX2Jhc2UpOwogfQogCiAjaWZkZWYgQ09ORklHX0NBQ0hFX0wyWDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKaW5kZXggZTAzNDI5NC4uN2QyNDJjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKQEAgLTIsNiArMiw3IEBACiAgKiBvbWFwX2h3bW9kIGltcGxlbWVudGF0aW9uIGZvciBPTUFQMi8zLzQKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCiAgKgogICogUGF1bCBXYWxtc2xleSwgQmVub8OudCBDb3Vzc29uLCBLZXZpbiBIaWxtYW4KICAqCkBAIC0zODcsMTEgKzM4OCwxMCBAQAogICovCiBzdGF0aWMgaW50IF9lbmFibGVfd2FrZXVwKHN0cnVjdCBvbWFwX2h3bW9kICpvaCwgdTMyICp2KQogewotCXUzMiB3YWtldXBfbWFzazsKLQogCWlmICghb2gtPmNsYXNzLT5zeXNjIHx8CiAJICAgICEoKG9oLT5jbGFzcy0+c3lzYy0+c3lzY19mbGFncyAmIFNZU0NfSEFTX0VOQVdBS0VVUCkgfHwKLQkgICAgICAob2gtPmNsYXNzLT5zeXNjLT5pZGxlbW9kZXMgJiBTSURMRV9TTUFSVF9XS1VQKSkpCisJICAgICAgKG9oLT5jbGFzcy0+c3lzYy0+aWRsZW1vZGVzICYgU0lETEVfU01BUlRfV0tVUCkgfHwKKwkgICAgICAob2gtPmNsYXNzLT5zeXNjLT5pZGxlbW9kZXMgJiBNU1RBTkRCWV9TTUFSVF9XS1VQKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFvaC0+Y2xhc3MtPnN5c2MtPnN5c2NfZmllbGRzKSB7CkBAIC0zOTksMTIgKzM5OSwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl3YWtldXBfbWFzayA9ICgweDEgPDwgb2gtPmNsYXNzLT5zeXNjLT5zeXNjX2ZpZWxkcy0+ZW53a3VwX3NoaWZ0KTsKLQotCSp2IHw9IHdha2V1cF9tYXNrOworCWlmIChvaC0+Y2xhc3MtPnN5c2MtPnN5c2NfZmxhZ3MgJiBTWVNDX0hBU19FTkFXQUtFVVApCisJCSp2IHw9IDB4MSA8PCBvaC0+Y2xhc3MtPnN5c2MtPnN5c2NfZmllbGRzLT5lbndrdXBfc2hpZnQ7CiAKIAlpZiAob2gtPmNsYXNzLT5zeXNjLT5pZGxlbW9kZXMgJiBTSURMRV9TTUFSVF9XS1VQKQogCQlfc2V0X3NsYXZlX2lkbGVtb2RlKG9oLCBIV01PRF9JRExFTU9ERV9TTUFSVF9XS1VQLCB2KTsKKwlpZiAob2gtPmNsYXNzLT5zeXNjLT5pZGxlbW9kZXMgJiBNU1RBTkRCWV9TTUFSVF9XS1VQKQorCQlfc2V0X21hc3Rlcl9zdGFuZGJ5bW9kZShvaCwgSFdNT0RfSURMRU1PREVfU01BUlRfV0tVUCwgdik7CiAKIAkvKiBYWFggdGVzdCBwd3JkbV9nZXRfd2tlbiBmb3IgdGhpcyBod21vZCdzIHN1YnN5c3RlbSAqLwogCkBAIC00MjIsMTEgKzQyMywxMCBAQAogICovCiBzdGF0aWMgaW50IF9kaXNhYmxlX3dha2V1cChzdHJ1Y3Qgb21hcF9od21vZCAqb2gsIHUzMiAqdikKIHsKLQl1MzIgd2FrZXVwX21hc2s7Ci0KIAlpZiAoIW9oLT5jbGFzcy0+c3lzYyB8fAogCSAgICAhKChvaC0+Y2xhc3MtPnN5c2MtPnN5c2NfZmxhZ3MgJiBTWVNDX0hBU19FTkFXQUtFVVApIHx8Ci0JICAgICAgKG9oLT5jbGFzcy0+c3lzYy0+aWRsZW1vZGVzICYgU0lETEVfU01BUlRfV0tVUCkpKQorCSAgICAgIChvaC0+Y2xhc3MtPnN5c2MtPmlkbGVtb2RlcyAmIFNJRExFX1NNQVJUX1dLVVApIHx8CisJICAgICAgKG9oLT5jbGFzcy0+c3lzYy0+aWRsZW1vZGVzICYgTVNUQU5EQllfU01BUlRfV0tVUCkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghb2gtPmNsYXNzLT5zeXNjLT5zeXNjX2ZpZWxkcykgewpAQCAtNDM0LDEyICs0MzQsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jd2FrZXVwX21hc2sgPSAoMHgxIDw8IG9oLT5jbGFzcy0+c3lzYy0+c3lzY19maWVsZHMtPmVud2t1cF9zaGlmdCk7Ci0KLQkqdiAmPSB+d2FrZXVwX21hc2s7CisJaWYgKG9oLT5jbGFzcy0+c3lzYy0+c3lzY19mbGFncyAmIFNZU0NfSEFTX0VOQVdBS0VVUCkKKwkJKnYgJj0gfigweDEgPDwgb2gtPmNsYXNzLT5zeXNjLT5zeXNjX2ZpZWxkcy0+ZW53a3VwX3NoaWZ0KTsKIAogCWlmIChvaC0+Y2xhc3MtPnN5c2MtPmlkbGVtb2RlcyAmIFNJRExFX1NNQVJUX1dLVVApCiAJCV9zZXRfc2xhdmVfaWRsZW1vZGUob2gsIEhXTU9EX0lETEVNT0RFX1NNQVJULCB2KTsKKwlpZiAob2gtPmNsYXNzLT5zeXNjLT5pZGxlbW9kZXMgJiBNU1RBTkRCWV9TTUFSVF9XS1VQKQorCQlfc2V0X21hc3Rlcl9zdGFuZGJ5bW9kZShvaCwgSFdNT0RfSURMRU1PREVfU01BUlRfV0tVUCwgdik7CiAKIAkvKiBYWFggdGVzdCBwd3JkbV9nZXRfd2tlbiBmb3IgdGhpcyBod21vZCdzIHN1YnN5c3RlbSAqLwogCkBAIC02NzgsNiArNjc5LDc1IEBACiB9CiAKIC8qKgorICogX2NvdW50X21wdV9pcnFzIC0gY291bnQgdGhlIG51bWJlciBvZiBNUFUgSVJRIGxpbmVzIGFzc29jaWF0ZWQgd2l0aCBAb2gKKyAqIEBvaDogc3RydWN0IG9tYXBfaHdtb2QgKm9oCisgKgorICogQ291bnQgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIE1QVSBJUlFzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaHdtb2QKKyAqIEBvaC4gIFVzZWQgdG8gYWxsb2NhdGUgc3RydWN0IHJlc291cmNlIGRhdGEuICBSZXR1cm5zIDAgaWYgQG9oIGlzCisgKiBOVUxMLgorICovCitzdGF0aWMgaW50IF9jb3VudF9tcHVfaXJxcyhzdHJ1Y3Qgb21hcF9od21vZCAqb2gpCit7CisJc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gKm9oaWk7CisJaW50IGkgPSAwOworCisJaWYgKCFvaCB8fCAhb2gtPm1wdV9pcnFzKQorCQlyZXR1cm4gMDsKKworCWRvIHsKKwkJb2hpaSA9ICZvaC0+bXB1X2lycXNbaSsrXTsKKwl9IHdoaWxlIChvaGlpLT5pcnEgIT0gLTEpOworCisJcmV0dXJuIGk7Cit9CisKKy8qKgorICogX2NvdW50X3NkbWFfcmVxcyAtIGNvdW50IHRoZSBudW1iZXIgb2YgU0RNQSByZXF1ZXN0IGxpbmVzIGFzc29jaWF0ZWQgd2l0aCBAb2gKKyAqIEBvaDogc3RydWN0IG9tYXBfaHdtb2QgKm9oCisgKgorICogQ291bnQgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIFNETUEgcmVxdWVzdCBsaW5lcyBhc3NvY2lhdGVkIHdpdGgKKyAqIHRoZSBod21vZCBAb2guICBVc2VkIHRvIGFsbG9jYXRlIHN0cnVjdCByZXNvdXJjZSBkYXRhLiAgUmV0dXJucyAwCisgKiBpZiBAb2ggaXMgTlVMTC4KKyAqLworc3RhdGljIGludCBfY291bnRfc2RtYV9yZXFzKHN0cnVjdCBvbWFwX2h3bW9kICpvaCkKK3sKKwlzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyAqb2hkaTsKKwlpbnQgaSA9IDA7CisKKwlpZiAoIW9oIHx8ICFvaC0+c2RtYV9yZXFzKQorCQlyZXR1cm4gMDsKKworCWRvIHsKKwkJb2hkaSA9ICZvaC0+c2RtYV9yZXFzW2krK107CisJfSB3aGlsZSAob2hkaS0+ZG1hX3JlcSAhPSAtMSk7CisKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBfY291bnRfb2NwX2lmX2FkZHJfc3BhY2VzIC0gY291bnQgdGhlIG51bWJlciBvZiBhZGRyZXNzIHNwYWNlIGVudHJpZXMgZm9yIEBvaAorICogQG9oOiBzdHJ1Y3Qgb21hcF9od21vZCAqb2gKKyAqCisgKiBDb3VudCBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYWRkcmVzcyBzcGFjZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoCisgKiB0aGUgaHdtb2QgQG9oLiAgVXNlZCB0byBhbGxvY2F0ZSBzdHJ1Y3QgcmVzb3VyY2UgZGF0YS4gIFJldHVybnMgMAorICogaWYgQG9oIGlzIE5VTEwuCisgKi8KK3N0YXRpYyBpbnQgX2NvdW50X29jcF9pZl9hZGRyX3NwYWNlcyhzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9zKQoreworCXN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2UgKm1lbTsKKwlpbnQgaSA9IDA7CisKKwlpZiAoIW9zIHx8ICFvcy0+YWRkcikKKwkJcmV0dXJuIDA7CisKKwlkbyB7CisJCW1lbSA9ICZvcy0+YWRkcltpKytdOworCX0gd2hpbGUgKG1lbS0+cGFfc3RhcnQgIT0gbWVtLT5wYV9lbmQpOworCisJcmV0dXJuIGk7Cit9CisKKy8qKgogICogX2ZpbmRfbXB1X3BvcnRfaW5kZXggLSBmaW5kIGh3bW9kIE9DUCBzbGF2ZSBwb3J0IElEIGludGVuZGVkIGZvciBNUFUgdXNlCiAgKiBAb2g6IHN0cnVjdCBvbWFwX2h3bW9kICoKICAqCkBAIC03MjIsOCArNzkyLDcgQEAKIHsKIAlzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9zOwogCXN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2UgKm1lbTsKLQlpbnQgaTsKLQlpbnQgZm91bmQgPSAwOworCWludCBpID0gMCwgZm91bmQgPSAwOwogCXZvaWQgX19pb21lbSAqdmFfc3RhcnQ7CiAKIAlpZiAoIW9oIHx8IG9oLT5zbGF2ZXNfY250ID09IDApCkBAIC03MzEsMTIgKzgwMCwxNCBAQAogCiAJb3MgPSBvaC0+c2xhdmVzW2luZGV4XTsKIAotCWZvciAoaSA9IDAsIG1lbSA9IG9zLT5hZGRyOyBpIDwgb3MtPmFkZHJfY250OyBpKyssIG1lbSsrKSB7Ci0JCWlmIChtZW0tPmZsYWdzICYgQUREUl9UWVBFX1JUKSB7CisJaWYgKCFvcy0+YWRkcikKKwkJcmV0dXJuIE5VTEw7CisKKwlkbyB7CisJCW1lbSA9ICZvcy0+YWRkcltpKytdOworCQlpZiAobWVtLT5mbGFncyAmIEFERFJfVFlQRV9SVCkKIAkJCWZvdW5kID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQorCX0gd2hpbGUgKCFmb3VuZCAmJiBtZW0tPnBhX3N0YXJ0ICE9IG1lbS0+cGFfZW5kKTsKIAogCWlmIChmb3VuZCkgewogCQl2YV9zdGFydCA9IGlvcmVtYXAobWVtLT5wYV9zdGFydCwgbWVtLT5wYV9lbmQgLSBtZW0tPnBhX3N0YXJ0KTsKQEAgLTc4MSw4ICs4NTIsMTYgQEAKIAl9CiAKIAlpZiAoc2YgJiBTWVNDX0hBU19NSURMRU1PREUpIHsKLQkJaWRsZW1vZGUgPSAob2gtPmZsYWdzICYgSFdNT0RfU1dTVVBfTVNUQU5EQlkpID8KLQkJCUhXTU9EX0lETEVNT0RFX05PIDogSFdNT0RfSURMRU1PREVfU01BUlQ7CisJCWlmIChvaC0+ZmxhZ3MgJiBIV01PRF9TV1NVUF9NU1RBTkRCWSkgeworCQkJaWRsZW1vZGUgPSBIV01PRF9JRExFTU9ERV9OTzsKKwkJfSBlbHNlIHsKKwkJCWlmIChzZiAmIFNZU0NfSEFTX0VOQVdBS0VVUCkKKwkJCQlfZW5hYmxlX3dha2V1cChvaCwgJnYpOworCQkJaWYgKG9oLT5jbGFzcy0+c3lzYy0+aWRsZW1vZGVzICYgTVNUQU5EQllfU01BUlRfV0tVUCkKKwkJCQlpZGxlbW9kZSA9IEhXTU9EX0lETEVNT0RFX1NNQVJUX1dLVVA7CisJCQllbHNlCisJCQkJaWRsZW1vZGUgPSBIV01PRF9JRExFTU9ERV9TTUFSVDsKKwkJfQogCQlfc2V0X21hc3Rlcl9zdGFuZGJ5bW9kZShvaCwgaWRsZW1vZGUsICZ2KTsKIAl9CiAKQEAgLTg0MCw4ICs5MTksMTYgQEAKIAl9CiAKIAlpZiAoc2YgJiBTWVNDX0hBU19NSURMRU1PREUpIHsKLQkJaWRsZW1vZGUgPSAob2gtPmZsYWdzICYgSFdNT0RfU1dTVVBfTVNUQU5EQlkpID8KLQkJCUhXTU9EX0lETEVNT0RFX0ZPUkNFIDogSFdNT0RfSURMRU1PREVfU01BUlQ7CisJCWlmIChvaC0+ZmxhZ3MgJiBIV01PRF9TV1NVUF9NU1RBTkRCWSkgeworCQkJaWRsZW1vZGUgPSBIV01PRF9JRExFTU9ERV9GT1JDRTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzZiAmIFNZU0NfSEFTX0VOQVdBS0VVUCkKKwkJCQlfZW5hYmxlX3dha2V1cChvaCwgJnYpOworCQkJaWYgKG9oLT5jbGFzcy0+c3lzYy0+aWRsZW1vZGVzICYgTVNUQU5EQllfU01BUlRfV0tVUCkKKwkJCQlpZGxlbW9kZSA9IEhXTU9EX0lETEVNT0RFX1NNQVJUX1dLVVA7CisJCQllbHNlCisJCQkJaWRsZW1vZGUgPSBIV01PRF9JRExFTU9ERV9TTUFSVDsKKwkJfQogCQlfc2V0X21hc3Rlcl9zdGFuZGJ5bW9kZShvaCwgaWRsZW1vZGUsICZ2KTsKIAl9CiAKQEAgLTkyOCw2ICsxMDE1LDggQEAKIAogCWlmICghcmV0KQogCQlvaC0+X3N0YXRlID0gX0hXTU9EX1NUQVRFX0NMS1NfSU5JVEVEOworCWVsc2UKKwkJcHJfd2FybmluZygib21hcF9od21vZDogJXM6IGNhbm5vdCBfaW5pdF9jbG9ja3NcbiIsIG9oLT5uYW1lKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMjI0LDYgKzEzMTMsOCBAQAogewogCWludCByOwogCisJcHJfZGVidWcoIm9tYXBfaHdtb2Q6ICVzOiBlbmFibGluZ1xuIiwgb2gtPm5hbWUpOworCiAJaWYgKG9oLT5fc3RhdGUgIT0gX0hXTU9EX1NUQVRFX0lOSVRJQUxJWkVEICYmCiAJICAgIG9oLT5fc3RhdGUgIT0gX0hXTU9EX1NUQVRFX0lETEUgJiYKIAkgICAgb2gtPl9zdGF0ZSAhPSBfSFdNT0RfU1RBVEVfRElTQUJMRUQpIHsKQEAgLTEyMzIsMTcgKzEzMjMsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcl9kZWJ1Zygib21hcF9od21vZDogJXM6IGVuYWJsaW5nXG4iLCBvaC0+bmFtZSk7Ci0KLQkvKgotCSAqIElmIGFuIElQIGNvbnRhaW5zIG9ubHkgb25lIEhXIHJlc2V0IGxpbmUsIHRoZW4gZGUtYXNzZXJ0IGl0IGluIG9yZGVyCi0JICogdG8gYWxsb3cgdG8gZW5hYmxlIHRoZSBjbG9ja3MuIE90aGVyd2lzZSB0aGUgUFJDTSB3aWxsIHJldHVybgotCSAqIEludHJhbnNpdGlvbiBzdGF0dXMsIGFuZCB0aGUgaW5pdCB3aWxsIGZhaWxlZC4KLQkgKi8KLQlpZiAoKG9oLT5fc3RhdGUgPT0gX0hXTU9EX1NUQVRFX0lOSVRJQUxJWkVEIHx8Ci0JICAgICBvaC0+X3N0YXRlID09IF9IV01PRF9TVEFURV9ESVNBQkxFRCkgJiYgb2gtPnJzdF9saW5lc19jbnQgPT0gMSkKLQkJX2RlYXNzZXJ0X2hhcmRyZXNldChvaCwgb2gtPnJzdF9saW5lc1swXS5uYW1lKTsKLQogCS8qIE11eCBwaW5zIGZvciBkZXZpY2UgcnVudGltZSBpZiBwb3B1bGF0ZWQgKi8KIAlpZiAob2gtPm11eCAmJiAoIW9oLT5tdXgtPmVuYWJsZWQgfHwKIAkJCSgob2gtPl9zdGF0ZSA9PSBfSFdNT0RfU1RBVEVfSURMRSkgJiYKQEAgLTEyNTIsMjAgKzEzMzIsMzEgQEAKIAlfYWRkX2luaXRpYXRvcl9kZXAob2gsIG1wdV9vaCk7CiAJX2VuYWJsZV9jbG9ja3Mob2gpOwogCi0JciA9IF93YWl0X3RhcmdldF9yZWFkeShvaCk7Ci0JaWYgKCFyKSB7Ci0JCW9oLT5fc3RhdGUgPSBfSFdNT0RfU1RBVEVfRU5BQkxFRDsKKwkvKgorCSAqIElmIGFuIElQIGNvbnRhaW5zIG9ubHkgb25lIEhXIHJlc2V0IGxpbmUsIHRoZW4gZGUtYXNzZXJ0IGl0IGluIG9yZGVyCisJICogdG8gYWxsb3cgdGhlIG1vZHVsZSBzdGF0ZSB0cmFuc2l0aW9uLiBPdGhlcndpc2UgdGhlIFBSQ00gd2lsbCByZXR1cm4KKwkgKiBJbnRyYW5zaXRpb24gc3RhdHVzLCBhbmQgdGhlIGluaXQgd2lsbCBmYWlsZWQuCisJICovCisJaWYgKChvaC0+X3N0YXRlID09IF9IV01PRF9TVEFURV9JTklUSUFMSVpFRCB8fAorCSAgICAgb2gtPl9zdGF0ZSA9PSBfSFdNT0RfU1RBVEVfRElTQUJMRUQpICYmIG9oLT5yc3RfbGluZXNfY250ID09IDEpCisJCV9kZWFzc2VydF9oYXJkcmVzZXQob2gsIG9oLT5yc3RfbGluZXNbMF0ubmFtZSk7CiAKLQkJLyogQWNjZXNzIHRoZSBzeXNjb25maWcgb25seSBpZiB0aGUgdGFyZ2V0IGlzIHJlYWR5ICovCi0JCWlmIChvaC0+Y2xhc3MtPnN5c2MpIHsKLQkJCWlmICghKG9oLT5faW50X2ZsYWdzICYgX0hXTU9EX1NZU0NPTkZJR19MT0FERUQpKQotCQkJCV91cGRhdGVfc3lzY19jYWNoZShvaCk7Ci0JCQlfZW5hYmxlX3N5c2Mob2gpOwotCQl9Ci0JfSBlbHNlIHsKLQkJX2Rpc2FibGVfY2xvY2tzKG9oKTsKKwlyID0gX3dhaXRfdGFyZ2V0X3JlYWR5KG9oKTsKKwlpZiAocikgewogCQlwcl9kZWJ1Zygib21hcF9od21vZDogJXM6IF93YWl0X3RhcmdldF9yZWFkeTogJWRcbiIsCiAJCQkgb2gtPm5hbWUsIHIpOworCQlfZGlzYWJsZV9jbG9ja3Mob2gpOworCisJCXJldHVybiByOworCX0KKworCW9oLT5fc3RhdGUgPSBfSFdNT0RfU1RBVEVfRU5BQkxFRDsKKworCS8qIEFjY2VzcyB0aGUgc3lzY29uZmlnIG9ubHkgaWYgdGhlIHRhcmdldCBpcyByZWFkeSAqLworCWlmIChvaC0+Y2xhc3MtPnN5c2MpIHsKKwkJaWYgKCEob2gtPl9pbnRfZmxhZ3MgJiBfSFdNT0RfU1lTQ09ORklHX0xPQURFRCkpCisJCQlfdXBkYXRlX3N5c2NfY2FjaGUob2gpOworCQlfZW5hYmxlX3N5c2Mob2gpOwogCX0KIAogCXJldHVybiByOwpAQCAtMTI4MSwxNCArMTM3MiwxNCBAQAogICovCiBzdGF0aWMgaW50IF9pZGxlKHN0cnVjdCBvbWFwX2h3bW9kICpvaCkKIHsKKwlwcl9kZWJ1Zygib21hcF9od21vZDogJXM6IGlkbGluZ1xuIiwgb2gtPm5hbWUpOworCiAJaWYgKG9oLT5fc3RhdGUgIT0gX0hXTU9EX1NUQVRFX0VOQUJMRUQpIHsKIAkJV0FSTigxLCAib21hcF9od21vZDogJXM6IGlkbGUgc3RhdGUgY2FuIG9ubHkgYmUgZW50ZXJlZCBmcm9tICIKIAkJICAgICAiZW5hYmxlZCBzdGF0ZVxuIiwgb2gtPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcl9kZWJ1Zygib21hcF9od21vZDogJXM6IGlkbGluZ1xuIiwgb2gtPm5hbWUpOwotCiAJaWYgKG9oLT5jbGFzcy0+c3lzYykKIAkJX2lkbGVfc3lzYyhvaCk7CiAJX2RlbF9pbml0aWF0b3JfZGVwKG9oLCBtcHVfb2gpOwpAQCAtMTM3NCwxNSArMTQ2NSwxMSBAQAogCQl9CiAJfQogCi0JaWYgKG9oLT5jbGFzcy0+c3lzYykKKwlpZiAob2gtPmNsYXNzLT5zeXNjKSB7CisJCWlmIChvaC0+X3N0YXRlID09IF9IV01PRF9TVEFURV9JRExFKQorCQkJX2VuYWJsZShvaCk7CiAJCV9zaHV0ZG93bl9zeXNjKG9oKTsKLQotCS8qCi0JICogSWYgYW4gSVAgY29udGFpbnMgb25seSBvbmUgSFcgcmVzZXQgbGluZSwgdGhlbiBhc3NlcnQgaXQKLQkgKiBiZWZvcmUgZGlzYWJsaW5nIHRoZSBjbG9ja3MgYW5kIHNodXR0aW5nIGRvd24gdGhlIElQLgotCSAqLwotCWlmIChvaC0+cnN0X2xpbmVzX2NudCA9PSAxKQotCQlfYXNzZXJ0X2hhcmRyZXNldChvaCwgb2gtPnJzdF9saW5lc1swXS5uYW1lKTsKKwl9CiAKIAkvKiBjbG9ja3MgYW5kIGRlcHMgYXJlIGFscmVhZHkgZGlzYWJsZWQgaW4gaWRsZSAqLwogCWlmIChvaC0+X3N0YXRlID09IF9IV01PRF9TVEFURV9FTkFCTEVEKSB7CkBAIC0xMzkyLDYgKzE0NzksMTMgQEAKIAl9CiAJLyogWFhYIFNob3VsZCB0aGlzIGNvZGUgYWxzbyBmb3JjZS1kaXNhYmxlIHRoZSBvcHRpb25hbCBjbG9ja3M/ICovCiAKKwkvKgorCSAqIElmIGFuIElQIGNvbnRhaW5zIG9ubHkgb25lIEhXIHJlc2V0IGxpbmUsIHRoZW4gYXNzZXJ0IGl0CisJICogYWZ0ZXIgZGlzYWJsaW5nIHRoZSBjbG9ja3MgYW5kIGJlZm9yZSBzaHV0dGluZyBkb3duIHRoZSBJUC4KKwkgKi8KKwlpZiAob2gtPnJzdF9saW5lc19jbnQgPT0gMSkKKwkJX2Fzc2VydF9oYXJkcmVzZXQob2gsIG9oLT5yc3RfbGluZXNbMF0ubmFtZSk7CisKIAkvKiBNdXggcGlucyB0byBzYWZlIG1vZGUgb3IgdXNlIHBvcHVsYXRlZCBvZmYgbW9kZSB2YWx1ZXMgKi8KIAlpZiAob2gtPm11eCkKIAkJb21hcF9od21vZF9tdXgob2gtPm11eCwgX0hXTU9EX1NUQVRFX0RJU0FCTEVEKTsKQEAgLTE2MjgsNyArMTcyMiw3IEBACiAJCQl2b2lkICpkYXRhKQogewogCXN0cnVjdCBvbWFwX2h3bW9kICp0ZW1wX29oOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAlpZiAoIWZuKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE2ODUsOSArMTc3OSw2IEBACiAJCXJldHVybiAwOwogCiAJb2gtPl9tcHVfcnRfdmEgPSBfZmluZF9tcHVfcnRfYmFzZShvaCwgb2gtPl9tcHVfcG9ydF9pbmRleCk7Ci0JaWYgKCFvaC0+X21wdV9ydF92YSkKLQkJcHJfd2FybmluZygib21hcF9od21vZDogJXMgZm91bmQgbm8gX21wdV9ydF92YSBmb3IgJXNcbiIsCi0JCQkJX19mdW5jX18sIG9oLT5uYW1lKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTkzOSwxMCArMjAzMCwxMCBAQAogewogCWludCByZXQsIGk7CiAKLQlyZXQgPSBvaC0+bXB1X2lycXNfY250ICsgb2gtPnNkbWFfcmVxc19jbnQ7CisJcmV0ID0gX2NvdW50X21wdV9pcnFzKG9oKSArIF9jb3VudF9zZG1hX3JlcXMob2gpOwogCiAJZm9yIChpID0gMDsgaSA8IG9oLT5zbGF2ZXNfY250OyBpKyspCi0JCXJldCArPSBvaC0+c2xhdmVzW2ldLT5hZGRyX2NudDsKKwkJcmV0ICs9IF9jb3VudF9vY3BfaWZfYWRkcl9zcGFjZXMob2gtPnNsYXZlc1tpXSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTk1OSwxMiArMjA1MCwxMyBAQAogICovCiBpbnQgb21hcF9od21vZF9maWxsX3Jlc291cmNlcyhzdHJ1Y3Qgb21hcF9od21vZCAqb2gsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewotCWludCBpLCBqOworCWludCBpLCBqLCBtcHVfaXJxc19jbnQsIHNkbWFfcmVxc19jbnQ7CiAJaW50IHIgPSAwOwogCiAJLyogRm9yIGVhY2ggSVJRLCBETUEsIG1lbW9yeSBhcmVhLCBmaWxsIGluIGFycmF5LiovCiAKLQlmb3IgKGkgPSAwOyBpIDwgb2gtPm1wdV9pcnFzX2NudDsgaSsrKSB7CisJbXB1X2lycXNfY250ID0gX2NvdW50X21wdV9pcnFzKG9oKTsKKwlmb3IgKGkgPSAwOyBpIDwgbXB1X2lycXNfY250OyBpKyspIHsKIAkJKHJlcyArIHIpLT5uYW1lID0gKG9oLT5tcHVfaXJxcyArIGkpLT5uYW1lOwogCQkocmVzICsgciktPnN0YXJ0ID0gKG9oLT5tcHVfaXJxcyArIGkpLT5pcnE7CiAJCShyZXMgKyByKS0+ZW5kID0gKG9oLT5tcHVfaXJxcyArIGkpLT5pcnE7CkBAIC0xOTcyLDcgKzIwNjQsOCBAQAogCQlyKys7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IG9oLT5zZG1hX3JlcXNfY250OyBpKyspIHsKKwlzZG1hX3JlcXNfY250ID0gX2NvdW50X3NkbWFfcmVxcyhvaCk7CisJZm9yIChpID0gMDsgaSA8IHNkbWFfcmVxc19jbnQ7IGkrKykgewogCQkocmVzICsgciktPm5hbWUgPSAob2gtPnNkbWFfcmVxcyArIGkpLT5uYW1lOwogCQkocmVzICsgciktPnN0YXJ0ID0gKG9oLT5zZG1hX3JlcXMgKyBpKS0+ZG1hX3JlcTsKIAkJKHJlcyArIHIpLT5lbmQgPSAob2gtPnNkbWFfcmVxcyArIGkpLT5kbWFfcmVxOwpAQCAtMTk4MiwxMCArMjA3NSwxMiBAQAogCiAJZm9yIChpID0gMDsgaSA8IG9oLT5zbGF2ZXNfY250OyBpKyspIHsKIAkJc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvczsKKwkJaW50IGFkZHJfY250OwogCiAJCW9zID0gb2gtPnNsYXZlc1tpXTsKKwkJYWRkcl9jbnQgPSBfY291bnRfb2NwX2lmX2FkZHJfc3BhY2VzKG9zKTsKIAotCQlmb3IgKGogPSAwOyBqIDwgb3MtPmFkZHJfY250OyBqKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IGFkZHJfY250OyBqKyspIHsKIAkJCShyZXMgKyByKS0+bmFtZSA9IChvcy0+YWRkciArIGopLT5uYW1lOwogCQkJKHJlcyArIHIpLT5zdGFydCA9IChvcy0+YWRkciArIGopLT5wYV9zdGFydDsKIAkJCShyZXMgKyByKS0+ZW5kID0gKG9zLT5hZGRyICsgaiktPnBhX2VuZDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8yNDIwX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8yNDIwX2RhdGEuYwppbmRleCBjNGQwYWU4Li5mMzkwMWFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMjQyMF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzI0MjBfZGF0YS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIG9tYXBfaHdtb2RfMjQyMF9kYXRhLmMgLSBoYXJkd2FyZSBtb2R1bGVzIHByZXNlbnQgb24gdGhlIE9NQVAyNDIwIGNoaXBzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIE5va2lhIENvcnBvcmF0aW9uCiAgKiBQYXVsIFdhbG1zbGV5CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTExNCwzOCArMTE0LDIwIEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfbWNic3AyX2h3bW9kOwogCiAvKiBsNCBjb3JlIC0+IG1jc3BpMSBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDIwX21jc3BpMV9hZGRyX3NwYWNlW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDk4MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwOTgwZmYsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MjBfbDRfY29yZV9fbWNzcGkxID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDIwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQyMF9tY3NwaTFfaHdtb2QsCiAJLmNsawkJPSAibWNzcGkxX2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MjBfbWNzcGkxX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9tY3NwaTFfYWRkcl9zcGFjZSksCisJLmFkZHIJCT0gb21hcDJfbWNzcGkxX2FkZHJfc3BhY2UsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKIC8qIGw0IGNvcmUgLT4gbWNzcGkyIGludGVyZmFjZSAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MjBfbWNzcGkyX2FkZHJfc3BhY2VbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwOWEwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA5YTBmZiwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVCwKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQyMF9sNF9jb3JlX19tY3NwaTIgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MjBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX21jc3BpMl9od21vZCwKIAkuY2xrCQk9ICJtY3NwaTJfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF9tY3NwaTJfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21jc3BpMl9hZGRyX3NwYWNlKSwKKwkuYWRkcgkJPSBvbWFwMl9tY3NwaTJfYWRkcl9zcGFjZSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTU3LDk1ICsxMzksNDcgQEAKIH07CiAKIC8qIEw0IENPUkUgLT4gVUFSVDEgaW50ZXJmYWNlICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF91YXJ0MV9hZGRyX3NwYWNlW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSBPTUFQMl9VQVJUMV9CQVNFLAotCQkucGFfZW5kCQk9IE9NQVAyX1VBUlQxX0JBU0UgKyBTWl84SyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX01BUF9PTl9JTklUIHwgQUREUl9UWVBFX1JULAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyX2w0X2NvcmVfX3VhcnQxID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDIwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQyMF91YXJ0MV9od21vZCwKIAkuY2xrCQk9ICJ1YXJ0MV9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDIwX3VhcnQxX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF91YXJ0MV9hZGRyX3NwYWNlKSwKKwkuYWRkcgkJPSBvbWFwMnh4eF91YXJ0MV9hZGRyX3NwYWNlLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCiAvKiBMNCBDT1JFIC0+IFVBUlQyIGludGVyZmFjZSAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MjBfdWFydDJfYWRkcl9zcGFjZVtdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gT01BUDJfVUFSVDJfQkFTRSwKLQkJLnBhX2VuZAkJPSBPTUFQMl9VQVJUMl9CQVNFICsgU1pfMUsgLSAxLAotCQkuZmxhZ3MJCT0gQUREUl9NQVBfT05fSU5JVCB8IEFERFJfVFlQRV9SVCwKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMl9sNF9jb3JlX191YXJ0MiA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQyMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfdWFydDJfaHdtb2QsCiAJLmNsawkJPSAidWFydDJfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF91YXJ0Ml9hZGRyX3NwYWNlLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdWFydDJfYWRkcl9zcGFjZSksCisJLmFkZHIJCT0gb21hcDJ4eHhfdWFydDJfYWRkcl9zcGFjZSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIAogLyogTDQgUEVSIC0+IFVBUlQzIGludGVyZmFjZSAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MjBfdWFydDNfYWRkcl9zcGFjZVtdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gT01BUDJfVUFSVDNfQkFTRSwKLQkJLnBhX2VuZAkJPSBPTUFQMl9VQVJUM19CQVNFICsgU1pfMUsgLSAxLAotCQkuZmxhZ3MJCT0gQUREUl9NQVBfT05fSU5JVCB8IEFERFJfVFlQRV9SVCwKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMl9sNF9jb3JlX191YXJ0MyA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQyMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfdWFydDNfaHdtb2QsCiAJLmNsawkJPSAidWFydDNfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF91YXJ0M19hZGRyX3NwYWNlLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdWFydDNfYWRkcl9zcGFjZSksCisJLmFkZHIJCT0gb21hcDJ4eHhfdWFydDNfYWRkcl9zcGFjZSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIAotLyogSTJDIElQIGJsb2NrIGFkZHJlc3Mgc3BhY2UgbGVuZ3RoIChpbiBieXRlcykgKi8KLSNkZWZpbmUgT01BUDJfSTJDX0FTX0xFTgkJMTI4Ci0KIC8qIEw0IENPUkUgLT4gSTJDMSBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDIwX2kyYzFfYWRkcl9zcGFjZVtdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA3MDAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDcwMDAwICsgT01BUDJfSTJDX0FTX0xFTiAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MjBfbDRfY29yZV9faTJjMSA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQyMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfaTJjMV9od21vZCwKIAkuY2xrCQk9ICJpMmMxX2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MjBfaTJjMV9hZGRyX3NwYWNlLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfaTJjMV9hZGRyX3NwYWNlKSwKKwkuYWRkcgkJPSBvbWFwMl9pMmMxX2FkZHJfc3BhY2UsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKIC8qIEw0IENPUkUgLT4gSTJDMiBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDIwX2kyYzJfYWRkcl9zcGFjZVtdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA3MjAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDcyMDAwICsgT01BUDJfSTJDX0FTX0xFTiAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MjBfbDRfY29yZV9faTJjMiA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQyMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfaTJjMl9od21vZCwKIAkuY2xrCQk9ICJpMmMyX2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MjBfaTJjMl9hZGRyX3NwYWNlLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfaTJjMl9hZGRyX3NwYWNlKSwKKwkuYWRkcgkJPSBvbWFwMl9pMmMyX2FkZHJfc3BhY2UsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTM0MCwyOSArMjc0LDggQEAKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCkKIH07CiAKLS8qIFRpbWVyIENvbW1vbiAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwMjQyMF90aW1lcl9zeXNjID0gewotCS5yZXZfb2Zmcwk9IDB4MDAwMCwKLQkuc3lzY19vZmZzCT0gMHgwMDEwLAotCS5zeXNzX29mZnMJPSAweDAwMTQsCi0JLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfU0lETEVNT0RFIHwgU1lTQ19IQVNfQ0xPQ0tBQ1RJVklUWSB8Ci0JCQkgICBTWVNDX0hBU19FTkFXQUtFVVAgfCBTWVNDX0hBU19TT0ZUUkVTRVQgfAotCQkJICAgU1lTQ19IQVNfQVVUT0lETEUpLAotCS5pZGxlbW9kZXMJPSAoU0lETEVfRk9SQ0UgfCBTSURMRV9OTyB8IFNJRExFX1NNQVJUKSwKLQkuc3lzY19maWVsZHMgICAgPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyNDIwX3RpbWVyX2h3bW9kX2NsYXNzID0gewotCS5uYW1lID0gInRpbWVyIiwKLQkuc3lzYyA9ICZvbWFwMjQyMF90aW1lcl9zeXNjLAotCS5yZXYgPSBPTUFQX1RJTUVSX0lQX1ZFUlNJT05fMSwKLX07Ci0KIC8qIHRpbWVyMSAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX3RpbWVyMV9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyMF90aW1lcjFfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSAzNywgfSwKLX07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDIwX3RpbWVyMV9hZGRyc1tdID0gewogCXsKQEAgLTM3MCw2ICsyODMsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwMjgwMDAgKyBTWl8xSyAtIDEsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfd2t1cCAtPiB0aW1lcjEgKi8KQEAgLTM3OCw3ICsyOTIsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfdGltZXIxX2h3bW9kLAogCS5jbGsJCT0gImdwdDFfaWNrIiwKIAkuYWRkcgkJPSBvbWFwMjQyMF90aW1lcjFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0zOTAsOCArMzAzLDcgQEAKIC8qIHRpbWVyMSBod21vZCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX3RpbWVyMV9od21vZCA9IHsKIAkubmFtZQkJPSAidGltZXIxIiwKLQkubXB1X2lycXMJPSBvbWFwMjQyMF90aW1lcjFfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXIxX21wdV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl90aW1lcjFfbXB1X2lycXMsCiAJLm1haW5fY2xrCT0gImdwdDFfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTQwNCwzMSArMzE2LDE5IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyMV9zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0MjBfdGltZXJfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCkKIH07CiAKIC8qIHRpbWVyMiAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX3RpbWVyMl9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyMF90aW1lcjJfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSAzOCwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDIwX3RpbWVyMl9hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODAyYTAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDJhMDAwICsgU1pfMUsgLSAxLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07CiAKIC8qIGw0X2NvcmUgLT4gdGltZXIyICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDIwX2w0X2NvcmVfX3RpbWVyMiA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQyMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfdGltZXIyX2h3bW9kLAogCS5jbGsJCT0gImdwdDJfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF90aW1lcjJfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjJfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyeHh4X3RpbWVyMl9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNDQwLDggKzM0MCw3IEBACiAvKiB0aW1lcjIgaHdtb2QgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF90aW1lcjJfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInRpbWVyMiIsCi0JLm1wdV9pcnFzCT0gb21hcDI0MjBfdGltZXIyX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyMl9tcHVfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfdGltZXIyX21wdV9pcnFzLAogCS5tYWluX2Nsawk9ICJncHQyX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC00NTQsMzEgKzM1MywxOSBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjJfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDIwX3RpbWVyX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiB0aW1lcjMgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF90aW1lcjNfaHdtb2Q7Ci1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MjBfdGltZXIzX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gMzksIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF90aW1lcjNfYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwNzgwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA3ODAwMCArIFNaXzFLIC0gMSwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwogCiAvKiBsNF9jb3JlIC0+IHRpbWVyMyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQyMF9sNF9jb3JlX190aW1lcjMgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MjBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX3RpbWVyM19od21vZCwKIAkuY2xrCQk9ICJncHQzX2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MjBfdGltZXIzX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXIzX2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMnh4eF90aW1lcjNfYWRkcnMsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTQ5MCw4ICszNzcsNyBAQAogLyogdGltZXIzIGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfdGltZXIzX2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjMiLAotCS5tcHVfaXJxcwk9IG9tYXAyNDIwX3RpbWVyM19tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjNfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyM19tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0M19mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtNTA0LDMxICszOTAsMTkgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdGltZXIzX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXIzX3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQyMF90aW1lcl9od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIAogLyogdGltZXI0ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfdGltZXI0X2h3bW9kOwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDIwX3RpbWVyNF9tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IDQwLCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MjBfdGltZXI0X2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDdhMDAwLAotCQkucGFfZW5kCQk9IDB4NDgwN2EwMDAgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKIAogLyogbDRfY29yZSAtPiB0aW1lcjQgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MjBfbDRfY29yZV9fdGltZXI0ID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDIwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQyMF90aW1lcjRfaHdtb2QsCiAJLmNsawkJPSAiZ3B0NF9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDIwX3RpbWVyNF9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyNF9hZGRycyksCisJLmFkZHIJCT0gb21hcDJ4eHhfdGltZXI0X2FkZHJzLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC01NDAsOCArNDE0LDcgQEAKIC8qIHRpbWVyNCBod21vZCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX3RpbWVyNF9od21vZCA9IHsKIAkubmFtZQkJPSAidGltZXI0IiwKLQkubXB1X2lycXMJPSBvbWFwMjQyMF90aW1lcjRfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXI0X21wdV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl90aW1lcjRfbXB1X2lycXMsCiAJLm1haW5fY2xrCT0gImdwdDRfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTU1NCwzMSArNDI3LDE5IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyNF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyNF9zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0MjBfdGltZXJfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCkKIH07CiAKIC8qIHRpbWVyNSAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX3RpbWVyNV9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyMF90aW1lcjVfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0MSwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDIwX3RpbWVyNV9hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA3YzAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDdjMDAwICsgU1pfMUsgLSAxLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07CiAKIC8qIGw0X2NvcmUgLT4gdGltZXI1ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDIwX2w0X2NvcmVfX3RpbWVyNSA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQyMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfdGltZXI1X2h3bW9kLAogCS5jbGsJCT0gImdwdDVfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF90aW1lcjVfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjVfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyeHh4X3RpbWVyNV9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNTkwLDggKzQ1MSw3IEBACiAvKiB0aW1lcjUgaHdtb2QgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF90aW1lcjVfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInRpbWVyNSIsCi0JLm1wdV9pcnFzCT0gb21hcDI0MjBfdGltZXI1X21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyNV9tcHVfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfdGltZXI1X21wdV9pcnFzLAogCS5tYWluX2Nsawk9ICJncHQ1X2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC02MDQsMzIgKzQ2NCwyMCBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjVfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDIwX3RpbWVyX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAKIC8qIHRpbWVyNiAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX3RpbWVyNl9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyMF90aW1lcjZfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0MiwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDIwX3RpbWVyNl9hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA3ZTAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDdlMDAwICsgU1pfMUsgLSAxLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07CiAKIC8qIGw0X2NvcmUgLT4gdGltZXI2ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDIwX2w0X2NvcmVfX3RpbWVyNiA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQyMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfdGltZXI2X2h3bW9kLAogCS5jbGsJCT0gImdwdDZfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF90aW1lcjZfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjZfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyeHh4X3RpbWVyNl9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNjQxLDggKzQ4OSw3IEBACiAvKiB0aW1lcjYgaHdtb2QgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF90aW1lcjZfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInRpbWVyNiIsCi0JLm1wdV9pcnFzCT0gb21hcDI0MjBfdGltZXI2X21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyNl9tcHVfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfdGltZXI2X21wdV9pcnFzLAogCS5tYWluX2Nsawk9ICJncHQ2X2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC02NTUsMzEgKzUwMiwxOSBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjZfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjZfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDIwX3RpbWVyX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiB0aW1lcjcgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF90aW1lcjdfaHdtb2Q7Ci1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MjBfdGltZXI3X21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gNDMsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF90aW1lcjdfYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwODAwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA4MDAwMCArIFNaXzFLIC0gMSwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwogCiAvKiBsNF9jb3JlIC0+IHRpbWVyNyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQyMF9sNF9jb3JlX190aW1lcjcgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MjBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX3RpbWVyN19od21vZCwKIAkuY2xrCQk9ICJncHQ3X2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MjBfdGltZXI3X2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXI3X2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMnh4eF90aW1lcjdfYWRkcnMsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTY5MSw4ICs1MjYsNyBAQAogLyogdGltZXI3IGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfdGltZXI3X2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjciLAotCS5tcHVfaXJxcwk9IG9tYXAyNDIwX3RpbWVyN19tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjdfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyN19tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0N19mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtNzA1LDMxICs1MzksMTkgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdGltZXI3X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXI3X3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQyMF90aW1lcl9od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIAogLyogdGltZXI4ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfdGltZXI4X2h3bW9kOwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDIwX3RpbWVyOF9tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IDQ0LCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MjBfdGltZXI4X2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDgyMDAwLAotCQkucGFfZW5kCQk9IDB4NDgwODIwMDAgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKIAogLyogbDRfY29yZSAtPiB0aW1lcjggKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MjBfbDRfY29yZV9fdGltZXI4ID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDIwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQyMF90aW1lcjhfaHdtb2QsCiAJLmNsawkJPSAiZ3B0OF9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDIwX3RpbWVyOF9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyOF9hZGRycyksCisJLmFkZHIJCT0gb21hcDJ4eHhfdGltZXI4X2FkZHJzLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC03NDEsOCArNTYzLDcgQEAKIC8qIHRpbWVyOCBod21vZCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX3RpbWVyOF9od21vZCA9IHsKIAkubmFtZQkJPSAidGltZXI4IiwKLQkubXB1X2lycXMJPSBvbWFwMjQyMF90aW1lcjhfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXI4X21wdV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl90aW1lcjhfbXB1X2lycXMsCiAJLm1haW5fY2xrCT0gImdwdDhfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTc1NSwzMSArNTc2LDE5IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyOF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyOF9zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0MjBfdGltZXJfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCkKIH07CiAKIC8qIHRpbWVyOSAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX3RpbWVyOV9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyMF90aW1lcjlfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0NSwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDIwX3RpbWVyOV9hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA4NDAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDg0MDAwICsgU1pfMUsgLSAxLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07CiAKIC8qIGw0X2NvcmUgLT4gdGltZXI5ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDIwX2w0X2NvcmVfX3RpbWVyOSA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQyMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfdGltZXI5X2h3bW9kLAogCS5jbGsJCT0gImdwdDlfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF90aW1lcjlfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjlfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyeHh4X3RpbWVyOV9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNzkxLDggKzYwMCw3IEBACiAvKiB0aW1lcjkgaHdtb2QgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF90aW1lcjlfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInRpbWVyOSIsCi0JLm1wdV9pcnFzCT0gb21hcDI0MjBfdGltZXI5X21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyOV9tcHVfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfdGltZXI5X21wdV9pcnFzLAogCS5tYWluX2Nsawk9ICJncHQ5X2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC04MDUsMzEgKzYxMywxOSBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjlfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjlfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDIwX3RpbWVyX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiB0aW1lcjEwICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfdGltZXIxMF9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyMF90aW1lcjEwX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gNDYsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF90aW1lcjEwX2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDg2MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwODYwMDAgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKIAogLyogbDRfY29yZSAtPiB0aW1lcjEwICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDIwX2w0X2NvcmVfX3RpbWVyMTAgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MjBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX3RpbWVyMTBfaHdtb2QsCiAJLmNsawkJPSAiZ3B0MTBfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF90aW1lcjEwX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXIxMF9hZGRycyksCisJLmFkZHIJCT0gb21hcDJfdGltZXIxMF9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtODQxLDggKzYzNyw3IEBACiAvKiB0aW1lcjEwIGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfdGltZXIxMF9od21vZCA9IHsKIAkubmFtZQkJPSAidGltZXIxMCIsCi0JLm1wdV9pcnFzCT0gb21hcDI0MjBfdGltZXIxMF9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjEwX21wdV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl90aW1lcjEwX21wdV9pcnFzLAogCS5tYWluX2Nsawk9ICJncHQxMF9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtODU1LDMxICs2NTAsMTkgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdGltZXIxMF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyMTBfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDIwX3RpbWVyX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiB0aW1lcjExICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfdGltZXIxMV9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyMF90aW1lcjExX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gNDcsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF90aW1lcjExX2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDg4MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwODgwMDAgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKIAogLyogbDRfY29yZSAtPiB0aW1lcjExICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDIwX2w0X2NvcmVfX3RpbWVyMTEgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MjBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX3RpbWVyMTFfaHdtb2QsCiAJLmNsawkJPSAiZ3B0MTFfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF90aW1lcjExX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXIxMV9hZGRycyksCisJLmFkZHIJCT0gb21hcDJfdGltZXIxMV9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtODkxLDggKzY3NCw3IEBACiAvKiB0aW1lcjExIGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfdGltZXIxMV9od21vZCA9IHsKIAkubmFtZQkJPSAidGltZXIxMSIsCi0JLm1wdV9pcnFzCT0gb21hcDI0MjBfdGltZXIxMV9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjExX21wdV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl90aW1lcjExX21wdV9pcnFzLAogCS5tYWluX2Nsawk9ICJncHQxMV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtOTA1LDMxICs2ODcsMTkgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdGltZXIxMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyMTFfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDIwX3RpbWVyX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiB0aW1lcjEyICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfdGltZXIxMl9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyMF90aW1lcjEyX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gNDgsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF90aW1lcjEyX2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDhhMDAwLAotCQkucGFfZW5kCQk9IDB4NDgwOGEwMDAgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKIAogLyogbDRfY29yZSAtPiB0aW1lcjEyICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDIwX2w0X2NvcmVfX3RpbWVyMTIgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MjBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX3RpbWVyMTJfaHdtb2QsCiAJLmNsawkJPSAiZ3B0MTJfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF90aW1lcjEyX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXIxMl9hZGRycyksCisJLmFkZHIJCT0gb21hcDJ4eHhfdGltZXIxMl9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtOTQxLDggKzcxMSw3IEBACiAvKiB0aW1lcjEyIGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfdGltZXIxMl9od21vZCA9IHsKIAkubmFtZQkJPSAidGltZXIxMiIsCi0JLm1wdV9pcnFzCT0gb21hcDI0MjBfdGltZXIxMl9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjEyX21wdV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMnh4eF90aW1lcjEyX21wdV9pcnFzLAogCS5tYWluX2Nsawk9ICJncHQxMl9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtOTU1LDcgKzcyNCw3IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyMTJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjEyX3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQyMF90aW1lcl9od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIApAQCAtOTY2LDYgKzczNSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODAyMjA3ZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDIwX2w0X3drdXBfX3dkX3RpbWVyMiA9IHsKQEAgLTk3MywzMSArNzQzLDkgQEAKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX3dkX3RpbWVyMl9od21vZCwKIAkuY2xrCQk9ICJtcHVfd2R0X2ljayIsCiAJLmFkZHIJCT0gb21hcDI0MjBfd2RfdGltZXIyX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfd2RfdGltZXIyX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIAotLyoKLSAqICd3ZF90aW1lcicgY2xhc3MKLSAqIDMyLWJpdCB3YXRjaGRvZyB1cHdhcmQgY291bnRlciB0aGF0IGdlbmVyYXRlcyBhIHB1bHNlIG9uIHRoZSByZXNldCBwaW4gb24KLSAqIG92ZXJmbG93IGNvbmRpdGlvbgotICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzc19zeXNjb25maWcgb21hcDI0MjBfd2RfdGltZXJfc3lzYyA9IHsKLQkucmV2X29mZnMJPSAweDAwMDAsCi0JLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKLQkuc3lzc19vZmZzCT0gMHgwMDE0LAotCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX0VNVUZSRUUgfCBTWVNDX0hBU19TT0ZUUkVTRVQgfAotCQkJICAgU1lTQ19IQVNfQVVUT0lETEUgfCBTWVNTX0hBU19SRVNFVF9TVEFUVVMpLAotCS5zeXNjX2ZpZWxkcyAgICA9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDI0MjBfd2RfdGltZXJfaHdtb2RfY2xhc3MgPSB7Ci0JLm5hbWUJCT0gIndkX3RpbWVyIiwKLQkuc3lzYwkJPSAmb21hcDI0MjBfd2RfdGltZXJfc3lzYywKLQkucHJlX3NodXRkb3duCT0gJm9tYXAyX3dkX3RpbWVyX2Rpc2FibGUKLX07Ci0KIC8qIHdkX3RpbWVyMiAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDI0MjBfd2RfdGltZXIyX3NsYXZlc1tdID0gewogCSZvbWFwMjQyMF9sNF93a3VwX193ZF90aW1lcjIsCkBAIC0xMDA1LDcgKzc1Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF93ZF90aW1lcjJfaHdtb2QgPSB7CiAJLm5hbWUJCT0gIndkX3RpbWVyMiIsCi0JLmNsYXNzCQk9ICZvbWFwMjQyMF93ZF90aW1lcl9od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X3dkX3RpbWVyX2h3bW9kX2NsYXNzLAogCS5tYWluX2Nsawk9ICJtcHVfd2R0X2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xMDIxLDQ1ICs3NjksMTYgQEAKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCi0vKiBVQVJUICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzc19zeXNjb25maWcgdWFydF9zeXNjID0gewotCS5yZXZfb2Zmcwk9IDB4NTAsCi0JLnN5c2Nfb2Zmcwk9IDB4NTQsCi0JLnN5c3Nfb2Zmcwk9IDB4NTgsCi0JLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfU0lETEVNT0RFIHwKLQkJCSAgIFNZU0NfSEFTX0VOQVdBS0VVUCB8IFNZU0NfSEFTX1NPRlRSRVNFVCB8Ci0JCQkgICBTWVNDX0hBU19BVVRPSURMRSB8IFNZU1NfSEFTX1JFU0VUX1NUQVRVUyksCi0JLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQpLAotCS5zeXNjX2ZpZWxkcyAgICA9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3MgdWFydF9jbGFzcyA9IHsKLQkubmFtZSA9ICJ1YXJ0IiwKLQkuc3lzYyA9ICZ1YXJ0X3N5c2MsCi19OwotCiAvKiBVQVJUMSAqLwogCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gdWFydDFfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSBJTlRfMjRYWF9VQVJUMV9JUlEsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gdWFydDFfc2RtYV9yZXFzW10gPSB7Ci0JeyAubmFtZSA9ICJyeCIsCS5kbWFfcmVxID0gT01BUDI0WFhfRE1BX1VBUlQxX1JYLCB9LAotCXsgLm5hbWUgPSAidHgiLAkuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9VQVJUMV9UWCwgfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAyNDIwX3VhcnQxX3NsYXZlc1tdID0gewogCSZvbWFwMl9sNF9jb3JlX191YXJ0MSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF91YXJ0MV9od21vZCA9IHsKIAkubmFtZQkJPSAidWFydDEiLAotCS5tcHVfaXJxcwk9IHVhcnQxX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKHVhcnQxX21wdV9pcnFzKSwKLQkuc2RtYV9yZXFzCT0gdWFydDFfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRSh1YXJ0MV9zZG1hX3JlcXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3VhcnQxX21wdV9pcnFzLAorCS5zZG1hX3JlcXMJPSBvbWFwMl91YXJ0MV9zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gInVhcnQxX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xMDcyLDMxICs3OTEsMjAgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdWFydDFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF91YXJ0MV9zbGF2ZXMpLAotCS5jbGFzcwkJPSAmdWFydF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyX3VhcnRfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAogLyogVUFSVDIgKi8KIAotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIHVhcnQyX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gSU5UXzI0WFhfVUFSVDJfSVJRLCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIHVhcnQyX3NkbWFfcmVxc1tdID0gewotCXsgLm5hbWUgPSAicngiLAkuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9VQVJUMl9SWCwgfSwKLQl7IC5uYW1lID0gInR4IiwJLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfVUFSVDJfVFgsIH0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwMjQyMF91YXJ0Ml9zbGF2ZXNbXSA9IHsKIAkmb21hcDJfbDRfY29yZV9fdWFydDIsCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfdWFydDJfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInVhcnQyIiwKLQkubXB1X2lycXMJPSB1YXJ0Ml9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRSh1YXJ0Ml9tcHVfaXJxcyksCi0JLnNkbWFfcmVxcwk9IHVhcnQyX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUodWFydDJfc2RtYV9yZXFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl91YXJ0Ml9tcHVfaXJxcywKKwkuc2RtYV9yZXFzCT0gb21hcDJfdWFydDJfc2RtYV9yZXFzLAogCS5tYWluX2Nsawk9ICJ1YXJ0Ml9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTEwOSwzMSArODE3LDIwIEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3VhcnQyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdWFydDJfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJnVhcnRfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMl91YXJ0X2NsYXNzLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qIFVBUlQzICovCiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyB1YXJ0M19tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IElOVF8yNFhYX1VBUlQzX0lSUSwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyB1YXJ0M19zZG1hX3JlcXNbXSA9IHsKLQl7IC5uYW1lID0gInJ4IiwJLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfVUFSVDNfUlgsIH0sCi0JeyAubmFtZSA9ICJ0eCIsCS5kbWFfcmVxID0gT01BUDI0WFhfRE1BX1VBUlQzX1RYLCB9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDI0MjBfdWFydDNfc2xhdmVzW10gPSB7CiAJJm9tYXAyX2w0X2NvcmVfX3VhcnQzLAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX3VhcnQzX2h3bW9kID0gewogCS5uYW1lCQk9ICJ1YXJ0MyIsCi0JLm1wdV9pcnFzCT0gdWFydDNfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUodWFydDNfbXB1X2lycXMpLAotCS5zZG1hX3JlcXMJPSB1YXJ0M19zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKHVhcnQzX3NkbWFfcmVxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfdWFydDNfbXB1X2lycXMsCisJLnNkbWFfcmVxcwk9IG9tYXAyX3VhcnQzX3NkbWFfcmVxcywKIAkubWFpbl9jbGsJPSAidWFydDNfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTExNDYsNTMgKzg0MywyMiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF91YXJ0M19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3VhcnQzX3NsYXZlcyksCi0JLmNsYXNzCQk9ICZ1YXJ0X2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJfdWFydF9jbGFzcywKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCi0vKgotICogJ2RzcycgY2xhc3MKLSAqIGRpc3BsYXkgc3ViLXN5c3RlbQotICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzc19zeXNjb25maWcgb21hcDI0MjBfZHNzX3N5c2MgPSB7Ci0JLnJldl9vZmZzCT0gMHgwMDAwLAotCS5zeXNjX29mZnMJPSAweDAwMTAsCi0JLnN5c3Nfb2Zmcwk9IDB4MDAxNCwKLQkuc3lzY19mbGFncwk9IChTWVNDX0hBU19TT0ZUUkVTRVQgfCBTWVNDX0hBU19BVVRPSURMRSksCi0JLnN5c2NfZmllbGRzCT0gJm9tYXBfaHdtb2Rfc3lzY190eXBlMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBvbWFwMjQyMF9kc3NfaHdtb2RfY2xhc3MgPSB7Ci0JLm5hbWUgPSAiZHNzIiwKLQkuc3lzYyA9ICZvbWFwMjQyMF9kc3Nfc3lzYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwMjQyMF9kc3Nfc2RtYV9jaHNbXSA9IHsKLQl7IC5uYW1lID0gImRpc3BjIiwgLmRtYV9yZXEgPSA1IH0sCi19OwotCiAvKiBkc3MgKi8KIC8qIGRzcyBtYXN0ZXIgcG9ydHMgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAyNDIwX2Rzc19tYXN0ZXJzW10gPSB7CiAJJm9tYXAyNDIwX2Rzc19fbDMsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF9kc3NfYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwNTAwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA1MDNGRiwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwotCiAvKiBsNF9jb3JlIC0+IGRzcyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQyMF9sNF9jb3JlX19kc3MgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MjBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX2Rzc19jb3JlX2h3bW9kLAogCS5jbGsJCT0gImRzc19pY2siLAotCS5hZGRyCQk9IG9tYXAyNDIwX2Rzc19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2Rzc19hZGRycyksCisJLmFkZHIJCT0gb21hcDJfZHNzX2FkZHJzLAogCS5mdyA9IHsKIAkJLm9tYXAyID0gewogCQkJLmw0X2Z3X3JlZ2lvbiAgPSBPTUFQMjQyMF9MNF9DT1JFX0ZXX0RTU19DT1JFX1JFR0lPTiwKQEAgLTEyMTQsMTAgKzg4MCw5IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF9kc3NfY29yZV9od21vZCA9IHsKIAkubmFtZQkJPSAiZHNzX2NvcmUiLAotCS5jbGFzcwkJPSAmb21hcDI0MjBfZHNzX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJfZHNzX2h3bW9kX2NsYXNzLAogCS5tYWluX2Nsawk9ICJkc3MxX2ZjayIsIC8qIGluc3RlYWQgb2YgZHNzX2ZjayAqLwotCS5zZG1hX3JlcXMJPSBvbWFwMjQyMF9kc3Nfc2RtYV9jaHMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2Rzc19zZG1hX2NocyksCisJLnNkbWFfcmVxcwk9IG9tYXAyeHh4X2Rzc19zZG1hX2NocywKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKIAkJCS5wcmNtX3JlZ19pZCA9IDEsCkBAIC0xMjM3LDQ2ICs5MDIsMTIgQEAKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIAotLyoKLSAqICdkaXNwYycgY2xhc3MKLSAqIGRpc3BsYXkgY29udHJvbGxlcgotICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzc19zeXNjb25maWcgb21hcDI0MjBfZGlzcGNfc3lzYyA9IHsKLQkucmV2X29mZnMJPSAweDAwMDAsCi0JLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKLQkuc3lzc19vZmZzCT0gMHgwMDE0LAotCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX1NJRExFTU9ERSB8IFNZU0NfSEFTX01JRExFTU9ERSB8Ci0JCQkgICBTWVNDX0hBU19TT0ZUUkVTRVQgfCBTWVNDX0hBU19BVVRPSURMRSksCi0JLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQgfAotCQkJICAgTVNUQU5EQllfRk9SQ0UgfCBNU1RBTkRCWV9OTyB8IE1TVEFOREJZX1NNQVJUKSwKLQkuc3lzY19maWVsZHMJPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyNDIwX2Rpc3BjX2h3bW9kX2NsYXNzID0gewotCS5uYW1lID0gImRpc3BjIiwKLQkuc3lzYyA9ICZvbWFwMjQyMF9kaXNwY19zeXNjLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDIwX2Rpc3BjX2lycXNbXSA9IHsKLQl7IC5pcnEgPSAyNSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MjBfZHNzX2Rpc3BjX2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDUwNDAwLAotCQkucGFfZW5kCQk9IDB4NDgwNTA3RkYsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKLQogLyogbDRfY29yZSAtPiBkc3NfZGlzcGMgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MjBfbDRfY29yZV9fZHNzX2Rpc3BjID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDIwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQyMF9kc3NfZGlzcGNfaHdtb2QsCiAJLmNsawkJPSAiZHNzX2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MjBfZHNzX2Rpc3BjX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZHNzX2Rpc3BjX2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMl9kc3NfZGlzcGNfYWRkcnMsCiAJLmZ3ID0gewogCQkub21hcDIgPSB7CiAJCQkubDRfZndfcmVnaW9uICA9IE9NQVAyNDIwX0w0X0NPUkVfRldfRFNTX0RJU1BDX1JFR0lPTiwKQEAgLTEyOTMsOSArOTI0LDggQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX2Rzc19kaXNwY19od21vZCA9IHsKIAkubmFtZQkJPSAiZHNzX2Rpc3BjIiwKLQkuY2xhc3MJCT0gJm9tYXAyNDIwX2Rpc3BjX2h3bW9kX2NsYXNzLAotCS5tcHVfaXJxcwk9IG9tYXAyNDIwX2Rpc3BjX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZGlzcGNfaXJxcyksCisJLmNsYXNzCQk9ICZvbWFwMl9kaXNwY19od21vZF9jbGFzcywKKwkubXB1X2lycXMJPSBvbWFwMl9kaXNwY19pcnFzLAogCS5tYWluX2Nsawk9ICJkc3MxX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xMzEyLDQxICs5NDIsMTIgQEAKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIAotLyoKLSAqICdyZmJpJyBjbGFzcwotICogcmVtb3RlIGZyYW1lIGJ1ZmZlciBpbnRlcmZhY2UKLSAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAyNDIwX3JmYmlfc3lzYyA9IHsKLQkucmV2X29mZnMJPSAweDAwMDAsCi0JLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKLQkuc3lzc19vZmZzCT0gMHgwMDE0LAotCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX1NJRExFTU9ERSB8IFNZU0NfSEFTX1NPRlRSRVNFVCB8Ci0JCQkgICBTWVNDX0hBU19BVVRPSURMRSksCi0JLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQpLAotCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDI0MjBfcmZiaV9od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJyZmJpIiwKLQkuc3lzYyA9ICZvbWFwMjQyMF9yZmJpX3N5c2MsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF9kc3NfcmZiaV9hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA1MDgwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDUwQkZGLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07Ci0KIC8qIGw0X2NvcmUgLT4gZHNzX3JmYmkgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MjBfbDRfY29yZV9fZHNzX3JmYmkgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MjBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX2Rzc19yZmJpX2h3bW9kLAogCS5jbGsJCT0gImRzc19pY2siLAotCS5hZGRyCQk9IG9tYXAyNDIwX2Rzc19yZmJpX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZHNzX3JmYmlfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyX2Rzc19yZmJpX2FkZHJzLAogCS5mdyA9IHsKIAkJLm9tYXAyID0gewogCQkJLmw0X2Z3X3JlZ2lvbiAgPSBPTUFQMjQyMF9MNF9DT1JFX0ZXX0RTU19DT1JFX1JFR0lPTiwKQEAgLTEzNjMsNyArOTY0LDcgQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX2Rzc19yZmJpX2h3bW9kID0gewogCS5uYW1lCQk9ICJkc3NfcmZiaSIsCi0JLmNsYXNzCQk9ICZvbWFwMjQyMF9yZmJpX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJfcmZiaV9od21vZF9jbGFzcywKIAkubWFpbl9jbGsJPSAiZHNzMV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTM3OCwzMSArOTc5LDEyIEBACiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKLS8qCi0gKiAndmVuYycgY2xhc3MKLSAqIHZpZGVvIGVuY29kZXIKLSAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDI0MjBfdmVuY19od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJ2ZW5jIiwKLX07Ci0KLS8qIGRzc192ZW5jICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF9kc3NfdmVuY19hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA1MEMwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDUwRkZGLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07Ci0KIC8qIGw0X2NvcmUgLT4gZHNzX3ZlbmMgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MjBfbDRfY29yZV9fZHNzX3ZlbmMgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MjBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX2Rzc192ZW5jX2h3bW9kLAogCS5jbGsJCT0gImRzc181NG1fZmNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF9kc3NfdmVuY19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2Rzc192ZW5jX2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMl9kc3NfdmVuY19hZGRycywKIAkuZncgPSB7CiAJCS5vbWFwMiA9IHsKIAkJCS5sNF9md19yZWdpb24gID0gT01BUDI0MjBfTDRfQ09SRV9GV19EU1NfVkVOQ19SRUdJT04sCkBAIC0xNDIwLDcgKzEwMDIsNyBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfZHNzX3ZlbmNfaHdtb2QgPSB7CiAJLm5hbWUJCT0gImRzc192ZW5jIiwKLQkuY2xhc3MJCT0gJm9tYXAyNDIwX3ZlbmNfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMl92ZW5jX2h3bW9kX2NsYXNzLAogCS5tYWluX2Nsawk9ICJkc3MxX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xNDUzLDI1ICsxMDM1LDE0IEBACiAKIC8qIEkyQzEgKi8KIAotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIGkyYzFfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSBJTlRfMjRYWF9JMkMxX0lSUSwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBpMmMxX3NkbWFfcmVxc1tdID0gewotCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9JMkMxX1RYIH0sCi0JeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gT01BUDI0WFhfRE1BX0kyQzFfUlggfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAyNDIwX2kyYzFfc2xhdmVzW10gPSB7CiAJJm9tYXAyNDIwX2w0X2NvcmVfX2kyYzEsCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfaTJjMV9od21vZCA9IHsKIAkubmFtZQkJPSAiaTJjMSIsCi0JLm1wdV9pcnFzCT0gaTJjMV9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShpMmMxX21wdV9pcnFzKSwKLQkuc2RtYV9yZXFzCT0gaTJjMV9zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKGkyYzFfc2RtYV9yZXFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9pMmMxX21wdV9pcnFzLAorCS5zZG1hX3JlcXMJPSBvbWFwMl9pMmMxX3NkbWFfcmVxcywKIAkubWFpbl9jbGsJPSAiaTJjMV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTQ5MiwyNSArMTA2MywxNCBAQAogCiAvKiBJMkMyICovCiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBpMmMyX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gSU5UXzI0WFhfSTJDMl9JUlEsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gaTJjMl9zZG1hX3JlcXNbXSA9IHsKLQl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfSTJDMl9UWCB9LAotCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9JMkMyX1JYIH0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwMjQyMF9pMmMyX3NsYXZlc1tdID0gewogCSZvbWFwMjQyMF9sNF9jb3JlX19pMmMyLAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX2kyYzJfaHdtb2QgPSB7CiAJLm5hbWUJCT0gImkyYzIiLAotCS5tcHVfaXJxcwk9IGkyYzJfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUoaTJjMl9tcHVfaXJxcyksCi0JLnNkbWFfcmVxcwk9IGkyYzJfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShpMmMyX3NkbWFfcmVxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfaTJjMl9tcHVfaXJxcywKKwkuc2RtYV9yZXFzCT0gb21hcDJfaTJjMl9zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gImkyYzJfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE1MzYsNiArMTA5Niw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODAxODFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDIwX2w0X3drdXBfX2dwaW8xID0gewpAQCAtMTU0Myw3ICsxMTA0LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX2dwaW8xX2h3bW9kLAogCS5jbGsJCT0gImdwaW9zX2ljayIsCiAJLmFkZHIJCT0gb21hcDI0MjBfZ3BpbzFfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2dwaW8xX2FkZHJfc3BhY2UpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0xNTU0LDYgKzExMTQsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwMWExZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQyMF9sNF93a3VwX19ncGlvMiA9IHsKQEAgLTE1NjEsNyArMTEyMiw2IEBACiAJLnNsYXZlCQk9ICZvbWFwMjQyMF9ncGlvMl9od21vZCwKIAkuY2xrCQk9ICJncGlvc19pY2siLAogCS5hZGRyCQk9IG9tYXAyNDIwX2dwaW8yX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9ncGlvMl9hZGRyX3NwYWNlKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTU3Miw2ICsxMTMyLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDFjMWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MjBfbDRfd2t1cF9fZ3BpbzMgPSB7CkBAIC0xNTc5LDcgKzExNDAsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfZ3BpbzNfaHdtb2QsCiAJLmNsawkJPSAiZ3Bpb3NfaWNrIiwKIAkuYWRkcgkJPSBvbWFwMjQyMF9ncGlvM19hZGRyX3NwYWNlLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZ3BpbzNfYWRkcl9zcGFjZSksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTE1OTAsNiArMTE1MCw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODAxZTFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDIwX2w0X3drdXBfX2dwaW80ID0gewpAQCAtMTU5Nyw3ICsxMTU4LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX2dwaW80X2h3bW9kLAogCS5jbGsJCT0gImdwaW9zX2ljayIsCiAJLmFkZHIJCT0gb21hcDI0MjBfZ3BpbzRfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2dwaW80X2FkZHJfc3BhY2UpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0xNjA3LDMyICsxMTY3LDcgQEAKIAkuZGJja19mbGFnID0gZmFsc2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAyNDJ4X2dwaW9fc3lzYyA9IHsKLQkucmV2X29mZnMJPSAweDAwMDAsCi0JLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKLQkuc3lzc19vZmZzCT0gMHgwMDE0LAotCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX0VOQVdBS0VVUCB8IFNZU0NfSEFTX1NJRExFTU9ERSB8Ci0JCQkgICBTWVNDX0hBU19TT0ZUUkVTRVQgfCBTWVNDX0hBU19BVVRPSURMRSB8Ci0JCQkgICBTWVNTX0hBU19SRVNFVF9TVEFUVVMpLAotCS5pZGxlbW9kZXMJPSAoU0lETEVfRk9SQ0UgfCBTSURMRV9OTyB8IFNJRExFX1NNQVJUKSwKLQkuc3lzY19maWVsZHMgICAgPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAotfTsKLQotLyoKLSAqICdncGlvJyBjbGFzcwotICogZ2VuZXJhbCBwdXJwb3NlIGlvIG1vZHVsZQotICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDI0MnhfZ3Bpb19od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJncGlvIiwKLQkuc3lzYyA9ICZvbWFwMjQyeF9ncGlvX3N5c2MsCi0JLnJldiA9IDAsCi19OwotCiAvKiBncGlvMSAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDJ4X2dwaW8xX2lycXNbXSA9IHsKLQl7IC5pcnEgPSAyOSB9LCAvKiBJTlRfMjRYWF9HUElPX0JBTksxICovCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwMjQyMF9ncGlvMV9zbGF2ZXNbXSA9IHsKIAkmb21hcDI0MjBfbDRfd2t1cF9fZ3BpbzEsCiB9OwpAQCAtMTY0MCw4ICsxMTc1LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF9ncGlvMV9od21vZCA9IHsKIAkubmFtZQkJPSAiZ3BpbzEiLAogCS5mbGFncwkJPSBIV01PRF9DT05UUk9MX09QVF9DTEtTX0lOX1JFU0VULAotCS5tcHVfaXJxcwk9IG9tYXAyNDJ4X2dwaW8xX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MnhfZ3BpbzFfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfZ3BpbzFfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3Bpb3NfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE2NTQsMTYgKzExODgsMTIgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfZ3BpbzFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9ncGlvMV9zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0MnhfZ3Bpb19od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAogLyogZ3BpbzIgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyeF9ncGlvMl9pcnFzW10gPSB7Ci0JeyAuaXJxID0gMzAgfSwgLyogSU5UXzI0WFhfR1BJT19CQU5LMiAqLwotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDI0MjBfZ3BpbzJfc2xhdmVzW10gPSB7CiAJJm9tYXAyNDIwX2w0X3drdXBfX2dwaW8yLAogfTsKQEAgLTE2NzEsOCArMTIwMSw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfZ3BpbzJfaHdtb2QgPSB7CiAJLm5hbWUJCT0gImdwaW8yIiwKIAkuZmxhZ3MJCT0gSFdNT0RfQ09OVFJPTF9PUFRfQ0xLU19JTl9SRVNFVCwKLQkubXB1X2lycXMJPSBvbWFwMjQyeF9ncGlvMl9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDJ4X2dwaW8yX2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX2dwaW8yX2lycXMsCiAJLm1haW5fY2xrCT0gImdwaW9zX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xNjg1LDE2ICsxMjE0LDEyIEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX2dwaW8yX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZ3BpbzJfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDJ4X2dwaW9faHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qIGdwaW8zICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MnhfZ3BpbzNfaXJxc1tdID0gewotCXsgLmlycSA9IDMxIH0sIC8qIElOVF8yNFhYX0dQSU9fQkFOSzMgKi8KLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAyNDIwX2dwaW8zX3NsYXZlc1tdID0gewogCSZvbWFwMjQyMF9sNF93a3VwX19ncGlvMywKIH07CkBAIC0xNzAyLDggKzEyMjcsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX2dwaW8zX2h3bW9kID0gewogCS5uYW1lCQk9ICJncGlvMyIsCiAJLmZsYWdzCQk9IEhXTU9EX0NPTlRST0xfT1BUX0NMS1NfSU5fUkVTRVQsCi0JLm1wdV9pcnFzCT0gb21hcDI0MnhfZ3BpbzNfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyeF9ncGlvM19pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9ncGlvM19pcnFzLAogCS5tYWluX2Nsawk9ICJncGlvc19mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTcxNiwxNiArMTI0MCwxMiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF9ncGlvM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2dwaW8zX3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQyeF9ncGlvX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCiAvKiBncGlvNCAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDJ4X2dwaW80X2lycXNbXSA9IHsKLQl7IC5pcnEgPSAzMiB9LCAvKiBJTlRfMjRYWF9HUElPX0JBTks0ICovCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwMjQyMF9ncGlvNF9zbGF2ZXNbXSA9IHsKIAkmb21hcDI0MjBfbDRfd2t1cF9fZ3BpbzQsCiB9OwpAQCAtMTczMyw4ICsxMjUzLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF9ncGlvNF9od21vZCA9IHsKIAkubmFtZQkJPSAiZ3BpbzQiLAogCS5mbGFncwkJPSBIV01PRF9DT05UUk9MX09QVF9DTEtTX0lOX1JFU0VULAotCS5tcHVfaXJxcwk9IG9tYXAyNDJ4X2dwaW80X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MnhfZ3BpbzRfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfZ3BpbzRfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3Bpb3NfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE3NDcsMjggKzEyNjYsMTEgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfZ3BpbzRfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9ncGlvNF9zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0MnhfZ3Bpb19od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAotLyogc3lzdGVtIGRtYSAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwMjQyMF9kbWFfc3lzYyA9IHsKLQkucmV2X29mZnMJPSAweDAwMDAsCi0JLnN5c2Nfb2Zmcwk9IDB4MDAyYywKLQkuc3lzc19vZmZzCT0gMHgwMDI4LAotCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX1NPRlRSRVNFVCB8IFNZU0NfSEFTX01JRExFTU9ERSB8Ci0JCQkgICBTWVNDX0hBU19DTE9DS0FDVElWSVRZIHwgU1lTQ19IQVNfRU1VRlJFRSB8Ci0JCQkgICBTWVNDX0hBU19BVVRPSURMRSB8IFNZU1NfSEFTX1JFU0VUX1NUQVRVUyksCi0JLmlkbGVtb2Rlcwk9IChNU1RBTkRCWV9GT1JDRSB8IE1TVEFOREJZX05PIHwgTVNUQU5EQllfU01BUlQpLAotCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDI0MjBfZG1hX2h3bW9kX2NsYXNzID0gewotCS5uYW1lID0gImRtYSIsCi0JLnN5c2MgPSAmb21hcDI0MjBfZG1hX3N5c2MsCi19OwotCiAvKiBkbWEgYXR0cmlidXRlcyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2RtYV9kZXZfYXR0ciBkbWFfZGV2X2F0dHIgPSB7CiAJLmRldl9jYXBzICA9IFJFU0VSVkVfQ0hBTk5FTCB8IERNQV9MSU5LRURfTENIIHwgR0xPQkFMX1BSSU9SSVRZIHwKQEAgLTE3NzYsMjEgKzEyNzgsNiBAQAogCS5sY2hfY291bnQgPSAzMiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyMF9kbWFfc3lzdGVtX2lycXNbXSA9IHsKLQl7IC5uYW1lID0gIjAiLCAuaXJxID0gMTIgfSwgLyogSU5UXzI0WFhfU0RNQV9JUlEwICovCi0JeyAubmFtZSA9ICIxIiwgLmlycSA9IDEzIH0sIC8qIElOVF8yNFhYX1NETUFfSVJRMSAqLwotCXsgLm5hbWUgPSAiMiIsIC5pcnEgPSAxNCB9LCAvKiBJTlRfMjRYWF9TRE1BX0lSUTIgKi8KLQl7IC5uYW1lID0gIjMiLCAuaXJxID0gMTUgfSwgLyogSU5UXzI0WFhfU0RNQV9JUlEzICovCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF9kbWFfc3lzdGVtX2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDU2MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwNTZmZmYsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKLQogLyogZG1hX3N5c3RlbSAtPiBMMyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQyMF9kbWFfc3lzdGVtX19sMyA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQyMF9kbWFfc3lzdGVtX2h3bW9kLApAQCAtMTgwOSw4ICsxMjk2LDcgQEAKIAkubWFzdGVyCQk9ICZvbWFwMjQyMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfZG1hX3N5c3RlbV9od21vZCwKIAkuY2xrCQk9ICJzZG1hX2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MjBfZG1hX3N5c3RlbV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2RtYV9zeXN0ZW1fYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyX2RtYV9zeXN0ZW1fYWRkcnMsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTE4MjEsOSArMTMwNyw4IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF9kbWFfc3lzdGVtX2h3bW9kID0gewogCS5uYW1lCQk9ICJkbWEiLAotCS5jbGFzcwkJPSAmb21hcDI0MjBfZG1hX2h3bW9kX2NsYXNzLAotCS5tcHVfaXJxcwk9IG9tYXAyNDIwX2RtYV9zeXN0ZW1faXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9kbWFfc3lzdGVtX2lycXMpLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfZG1hX2h3bW9kX2NsYXNzLAorCS5tcHVfaXJxcwk9IG9tYXAyX2RtYV9zeXN0ZW1faXJxcywKIAkubWFpbl9jbGsJPSAiY29yZV9sM19jayIsCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF9kbWFfc3lzdGVtX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZG1hX3N5c3RlbV9zbGF2ZXMpLApAQCAtMTgzNCw0OCArMTMxOSwxOSBAQAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCi0vKgotICogJ21haWxib3gnIGNsYXNzCi0gKiBtYWlsYm94IG1vZHVsZSBhbGxvd2luZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIG9uLWNoaXAgcHJvY2Vzc29ycwotICogdXNpbmcgYSBxdWV1ZWQgbWFpbGJveC1pbnRlcnJ1cHQgbWVjaGFuaXNtLgotICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzc19zeXNjb25maWcgb21hcDI0MjBfbWFpbGJveF9zeXNjID0gewotCS5yZXZfb2Zmcwk9IDB4MDAwLAotCS5zeXNjX29mZnMJPSAweDAxMCwKLQkuc3lzc19vZmZzCT0gMHgwMTQsCi0JLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfQ0xPQ0tBQ1RJVklUWSB8IFNZU0NfSEFTX1NJRExFTU9ERSB8Ci0JCQkgICBTWVNDX0hBU19TT0ZUUkVTRVQgfCBTWVNDX0hBU19BVVRPSURMRSksCi0JLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQpLAotCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDI0MjBfbWFpbGJveF9od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJtYWlsYm94IiwKLQkuc3lzYyA9ICZvbWFwMjQyMF9tYWlsYm94X3N5c2MsCi19OwotCiAvKiBtYWlsYm94ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfbWFpbGJveF9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyMF9tYWlsYm94X2lycXNbXSA9IHsKIAl7IC5uYW1lID0gImRzcCIsIC5pcnEgPSAyNiB9LAogCXsgLm5hbWUgPSAiaXZhIiwgLmlycSA9IDM0IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF9tYWlsYm94X2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDk0MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwOTQxZmYsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCi0JfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiAvKiBsNF9jb3JlIC0+IG1haWxib3ggKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MjBfbDRfY29yZV9fbWFpbGJveCA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQyMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MjBfbWFpbGJveF9od21vZCwKLQkuYWRkcgkJPSBvbWFwMjQyMF9tYWlsYm94X2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfbWFpbGJveF9hZGRycyksCisJLmFkZHIJCT0gb21hcDJfbWFpbGJveF9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTg4Niw5ICsxMzQyLDggQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDIwX21haWxib3hfaHdtb2QgPSB7CiAJLm5hbWUJCT0gIm1haWxib3giLAotCS5jbGFzcwkJPSAmb21hcDI0MjBfbWFpbGJveF9od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X21haWxib3hfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDI0MjBfbWFpbGJveF9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21haWxib3hfaXJxcyksCiAJLm1haW5fY2xrCT0gIm1haWxib3hlc19pY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTkwNCw0NSArMTM1OSw3IEBACiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAotLyoKLSAqICdtY3NwaScgY2xhc3MKLSAqIG11bHRpY2hhbm5lbCBzZXJpYWwgcG9ydCBpbnRlcmZhY2UgKG1jc3BpKSAvIG1hc3Rlci9zbGF2ZSBzeW5jaHJvbm91cyBzZXJpYWwKLSAqIGJ1cwotICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzc19zeXNjb25maWcgb21hcDI0MjBfbWNzcGlfc3lzYyA9IHsKLQkucmV2X29mZnMJPSAweDAwMDAsCi0JLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKLQkuc3lzc19vZmZzCT0gMHgwMDE0LAotCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX0NMT0NLQUNUSVZJVFkgfCBTWVNDX0hBU19TSURMRU1PREUgfAotCQkJCVNZU0NfSEFTX0VOQVdBS0VVUCB8IFNZU0NfSEFTX1NPRlRSRVNFVCB8Ci0JCQkJU1lTQ19IQVNfQVVUT0lETEUgfCBTWVNTX0hBU19SRVNFVF9TVEFUVVMpLAotCS5pZGxlbW9kZXMJPSAoU0lETEVfRk9SQ0UgfCBTSURMRV9OTyB8IFNJRExFX1NNQVJUKSwKLQkuc3lzY19maWVsZHMgICAgPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyNDIwX21jc3BpX2NsYXNzID0gewotCS5uYW1lID0gIm1jc3BpIiwKLQkuc3lzYyA9ICZvbWFwMjQyMF9tY3NwaV9zeXNjLAotCS5yZXYgPSBPTUFQMl9NQ1NQSV9SRVYsCi19OwotCiAvKiBtY3NwaTEgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQyMF9tY3NwaTFfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA2NSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAyNDIwX21jc3BpMV9zZG1hX3JlcXNbXSA9IHsKLQl7IC5uYW1lID0gInR4MCIsIC5kbWFfcmVxID0gMzUgfSwgLyogRE1BX1NQSTFfVFgwICovCi0JeyAubmFtZSA9ICJyeDAiLCAuZG1hX3JlcSA9IDM2IH0sIC8qIERNQV9TUEkxX1JYMCAqLwotCXsgLm5hbWUgPSAidHgxIiwgLmRtYV9yZXEgPSAzNyB9LCAvKiBETUFfU1BJMV9UWDEgKi8KLQl7IC5uYW1lID0gInJ4MSIsIC5kbWFfcmVxID0gMzggfSwgLyogRE1BX1NQSTFfUlgxICovCi0JeyAubmFtZSA9ICJ0eDIiLCAuZG1hX3JlcSA9IDM5IH0sIC8qIERNQV9TUEkxX1RYMiAqLwotCXsgLm5hbWUgPSAicngyIiwgLmRtYV9yZXEgPSA0MCB9LCAvKiBETUFfU1BJMV9SWDIgKi8KLQl7IC5uYW1lID0gInR4MyIsIC5kbWFfcmVxID0gNDEgfSwgLyogRE1BX1NQSTFfVFgzICovCi0JeyAubmFtZSA9ICJyeDMiLCAuZG1hX3JlcSA9IDQyIH0sIC8qIERNQV9TUEkxX1JYMyAqLwotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDI0MjBfbWNzcGkxX3NsYXZlc1tdID0gewogCSZvbWFwMjQyMF9sNF9jb3JlX19tY3NwaTEsCiB9OwpAQCAtMTk1MywxMCArMTM3MCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQyMF9tY3NwaTFfaHdtb2QgPSB7CiAJLm5hbWUJCT0gIm1jc3BpMV9od21vZCIsCi0JLm1wdV9pcnFzCT0gb21hcDI0MjBfbWNzcGkxX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21jc3BpMV9tcHVfaXJxcyksCi0JLnNkbWFfcmVxcwk9IG9tYXAyNDIwX21jc3BpMV9zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21jc3BpMV9zZG1hX3JlcXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX21jc3BpMV9tcHVfaXJxcywKKwkuc2RtYV9yZXFzCT0gb21hcDJfbWNzcGkxX3NkbWFfcmVxcywKIAkubWFpbl9jbGsJPSAibWNzcGkxX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xOTY5LDIzICsxMzg0LDEyIEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX21jc3BpMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21jc3BpMV9zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0MjBfbWNzcGlfY2xhc3MsCi0JLmRldl9hdHRyICAgICAgID0gJm9tYXBfbWNzcGkxX2Rldl9hdHRyLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfbWNzcGlfY2xhc3MsCisJLmRldl9hdHRyCT0gJm9tYXBfbWNzcGkxX2Rldl9hdHRyLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qIG1jc3BpMiAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDIwX21jc3BpMl9tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IDY2IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDI0MjBfbWNzcGkyX3NkbWFfcmVxc1tdID0gewotCXsgLm5hbWUgPSAidHgwIiwgLmRtYV9yZXEgPSA0MyB9LCAvKiBETUFfU1BJMl9UWDAgKi8KLQl7IC5uYW1lID0gInJ4MCIsIC5kbWFfcmVxID0gNDQgfSwgLyogRE1BX1NQSTJfUlgwICovCi0JeyAubmFtZSA9ICJ0eDEiLCAuZG1hX3JlcSA9IDQ1IH0sIC8qIERNQV9TUEkyX1RYMSAqLwotCXsgLm5hbWUgPSAicngxIiwgLmRtYV9yZXEgPSA0NiB9LCAvKiBETUFfU1BJMl9SWDEgKi8KLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAyNDIwX21jc3BpMl9zbGF2ZXNbXSA9IHsKIAkmb21hcDI0MjBfbDRfY29yZV9fbWNzcGkyLAogfTsKQEAgLTE5OTYsMTAgKzE0MDAsOCBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MjBfbWNzcGkyX2h3bW9kID0gewogCS5uYW1lCQk9ICJtY3NwaTJfaHdtb2QiLAotCS5tcHVfaXJxcwk9IG9tYXAyNDIwX21jc3BpMl9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9tY3NwaTJfbXB1X2lycXMpLAotCS5zZG1hX3JlcXMJPSBvbWFwMjQyMF9tY3NwaTJfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9tY3NwaTJfc2RtYV9yZXFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9tY3NwaTJfbXB1X2lycXMsCisJLnNkbWFfcmVxcwk9IG9tYXAyX21jc3BpMl9zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gIm1jc3BpMl9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMjAxMiw4ICsxNDE0LDggQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfbWNzcGkyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfbWNzcGkyX3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQyMF9tY3NwaV9jbGFzcywKLQkuZGV2X2F0dHIgICAgICAgPSAmb21hcF9tY3NwaTJfZGV2X2F0dHIsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF9tY3NwaV9jbGFzcywKKwkuZGV2X2F0dHIJPSAmb21hcF9tY3NwaTJfZGV2X2F0dHIsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIApAQCAtMjAzMCwyMCArMTQzMiw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MjBfbWNic3AxX2lycXNbXSA9IHsKIAl7IC5uYW1lID0gInR4IiwgLmlycSA9IDU5IH0sCiAJeyAubmFtZSA9ICJyeCIsIC5pcnEgPSA2MCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAyNDIwX21jYnNwMV9zZG1hX2Noc1tdID0gewotCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDMyIH0sCi0JeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gMzEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDIwX21jYnNwMV9hZGRyc1tdID0gewotCXsKLQkJLm5hbWUJCT0gIm1wdSIsCi0JCS5wYV9zdGFydAk9IDB4NDgwNzQwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA3NDBmZiwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogLyogbDRfY29yZSAtPiBtY2JzcDEgKi8KQEAgLTIwNTEsOCArMTQ0MCw3IEBACiAJLm1hc3RlcgkJPSAmb21hcDI0MjBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDIwX21jYnNwMV9od21vZCwKIAkuY2xrCQk9ICJtY2JzcDFfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQyMF9tY2JzcDFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9tY2JzcDFfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyX21jYnNwMV9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMjA2NSw5ICsxNDUzLDcgQEAKIAkubmFtZQkJPSAibWNic3AxIiwKIAkuY2xhc3MJCT0gJm9tYXAyNDIwX21jYnNwX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXAyNDIwX21jYnNwMV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21jYnNwMV9pcnFzKSwKLQkuc2RtYV9yZXFzCT0gb21hcDI0MjBfbWNic3AxX3NkbWFfY2hzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9tY2JzcDFfc2RtYV9jaHMpLAorCS5zZG1hX3JlcXMJPSBvbWFwMl9tY2JzcDFfc2RtYV9yZXFzLAogCS5tYWluX2Nsawk9ICJtY2JzcDFfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTIwODcsMjAgKzE0NzMsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDIwX21jYnNwMl9pcnFzW10gPSB7CiAJeyAubmFtZSA9ICJ0eCIsIC5pcnEgPSA2MiB9LAogCXsgLm5hbWUgPSAicngiLCAuaXJxID0gNjMgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwMjQyMF9tY2JzcDJfc2RtYV9jaHNbXSA9IHsKLQl7IC5uYW1lID0gInJ4IiwgLmRtYV9yZXEgPSAzNCB9LAotCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IDMzIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQyMF9tY2JzcDJfYWRkcnNbXSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJtcHUiLAotCQkucGFfc3RhcnQJPSAweDQ4MDc2MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwNzYwZmYsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIC8qIGw0X2NvcmUgLT4gbWNic3AyICovCkBAIC0yMTA4LDggKzE0ODEsNyBAQAogCS5tYXN0ZXIJCT0gJm9tYXAyNDIwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQyMF9tY2JzcDJfaHdtb2QsCiAJLmNsawkJPSAibWNic3AyX2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MjBfbWNic3AyX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfbWNic3AyX2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMnh4eF9tY2JzcDJfYWRkcnMsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTIxMjIsOSArMTQ5NCw3IEBACiAJLm5hbWUJCT0gIm1jYnNwMiIsCiAJLmNsYXNzCQk9ICZvbWFwMjQyMF9tY2JzcF9od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwMjQyMF9tY2JzcDJfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9tY2JzcDJfaXJxcyksCi0JLnNkbWFfcmVxcwk9IG9tYXAyNDIwX21jYnNwMl9zZG1hX2NocywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfbWNic3AyX3NkbWFfY2hzKSwKKwkuc2RtYV9yZXFzCT0gb21hcDJfbWNic3AyX3NkbWFfcmVxcywKIAkubWFpbl9jbGsJPSAibWNic3AyX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMjQzMF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMjQzMF9kYXRhLmMKaW5kZXggOTY4MmRkNS4uMmE1MmYwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzI0MzBfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8yNDMwX2RhdGEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBvbWFwX2h3bW9kXzI0MzBfZGF0YS5jIC0gaGFyZHdhcmUgbW9kdWxlcyBwcmVzZW50IG9uIHRoZSBPTUFQMjQzMCBjaGlwcwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgogICogUGF1bCBXYWxtc2xleQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0xMzEsNDIgKzEzMSwyMSBAQAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKLS8qIEkyQyBJUCBibG9jayBhZGRyZXNzIHNwYWNlIGxlbmd0aCAoaW4gYnl0ZXMpICovCi0jZGVmaW5lIE9NQVAyX0kyQ19BU19MRU4JCTEyOAotCiAvKiBMNCBDT1JFIC0+IEkyQzEgaW50ZXJmYWNlICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF9pMmMxX2FkZHJfc3BhY2VbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwNzAwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA3MDAwMCArIE9NQVAyX0kyQ19BU19MRU4gLSAxLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2w0X2NvcmVfX2kyYzEgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX2kyYzFfaHdtb2QsCiAJLmNsawkJPSAiaTJjMV9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX2kyYzFfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2kyYzFfYWRkcl9zcGFjZSksCisJLmFkZHIJCT0gb21hcDJfaTJjMV9hZGRyX3NwYWNlLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCiAvKiBMNCBDT1JFIC0+IEkyQzIgaW50ZXJmYWNlICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF9pMmMyX2FkZHJfc3BhY2VbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwNzIwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA3MjAwMCArIE9NQVAyX0kyQ19BU19MRU4gLSAxLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2w0X2NvcmVfX2kyYzIgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX2kyYzJfaHdtb2QsCiAJLmNsawkJPSAiaTJjMl9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX2kyYzJfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2kyYzJfYWRkcl9zcGFjZSksCisJLmFkZHIJCT0gb21hcDJfaTJjMl9hZGRyX3NwYWNlLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0xNzgsNTYgKzE1NywyOSBAQAogfTsKIAogLyogTDQgQ09SRSAtPiBVQVJUMSBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDMwX3VhcnQxX2FkZHJfc3BhY2VbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IE9NQVAyX1VBUlQxX0JBU0UsCi0JCS5wYV9lbmQJCT0gT01BUDJfVUFSVDFfQkFTRSArIFNaXzhLIC0gMSwKLQkJLmZsYWdzCQk9IEFERFJfTUFQX09OX0lOSVQgfCBBRERSX1RZUEVfUlQsCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDJfbDRfY29yZV9fdWFydDEgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX3VhcnQxX2h3bW9kLAogCS5jbGsJCT0gInVhcnQxX2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MzBfdWFydDFfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3VhcnQxX2FkZHJfc3BhY2UpLAorCS5hZGRyCQk9IG9tYXAyeHh4X3VhcnQxX2FkZHJfc3BhY2UsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKIC8qIEw0IENPUkUgLT4gVUFSVDIgaW50ZXJmYWNlICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF91YXJ0Ml9hZGRyX3NwYWNlW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSBPTUFQMl9VQVJUMl9CQVNFLAotCQkucGFfZW5kCQk9IE9NQVAyX1VBUlQyX0JBU0UgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX01BUF9PTl9JTklUIHwgQUREUl9UWVBFX1JULAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyX2w0X2NvcmVfX3VhcnQyID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDMwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQzMF91YXJ0Ml9od21vZCwKIAkuY2xrCQk9ICJ1YXJ0Ml9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX3VhcnQyX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF91YXJ0Ml9hZGRyX3NwYWNlKSwKKwkuYWRkcgkJPSBvbWFwMnh4eF91YXJ0Ml9hZGRyX3NwYWNlLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCiAvKiBMNCBQRVIgLT4gVUFSVDMgaW50ZXJmYWNlICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF91YXJ0M19hZGRyX3NwYWNlW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSBPTUFQMl9VQVJUM19CQVNFLAotCQkucGFfZW5kCQk9IE9NQVAyX1VBUlQzX0JBU0UgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX01BUF9PTl9JTklUIHwgQUREUl9UWVBFX1JULAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyX2w0X2NvcmVfX3VhcnQzID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDMwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQzMF91YXJ0M19od21vZCwKIAkuY2xrCQk9ICJ1YXJ0M19pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX3VhcnQzX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF91YXJ0M19hZGRyX3NwYWNlKSwKKwkuYWRkcgkJPSBvbWFwMnh4eF91YXJ0M19hZGRyX3NwYWNlLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yNDgsNyArMjAwLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX3VzYmhzb3RnX2h3bW9kLAogCS5jbGsJCT0gInVzYl9sNF9pY2siLAogCS5hZGRyCQk9IG9tYXAyNDMwX3VzYmhzb3RnX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdXNiaHNvdGdfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKQEAgLTI2MSwzOCArMjEyLDIwIEBACiB9OwogCiAvKiBMNCBDT1JFIC0+IE1NQzEgaW50ZXJmYWNlICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF9tbWMxX2FkZHJfc3BhY2VbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwOWMwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA5YzFmZiwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVCwKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQzMF9sNF9jb3JlX19tbWMxID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDMwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQzMF9tbWMxX2h3bW9kLAogCS5jbGsJCT0gIm1tY2hzMV9pY2siLAogCS5hZGRyCQk9IG9tYXAyNDMwX21tYzFfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21tYzFfYWRkcl9zcGFjZSksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKIC8qIEw0IENPUkUgLT4gTU1DMiBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDMwX21tYzJfYWRkcl9zcGFjZVtdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODBiNDAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MGI0MWZmLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2w0X2NvcmVfX21tYzIgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX21tYzJfaHdtb2QsCi0JLmFkZHIJCT0gb21hcDI0MzBfbW1jMl9hZGRyX3NwYWNlLAogCS5jbGsJCT0gIm1tY2hzMl9pY2siLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbW1jMl9hZGRyX3NwYWNlKSwKKwkuYWRkcgkJPSBvbWFwMjQzMF9tbWMyX2FkZHJfc3BhY2UsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTMzMyw1NiArMjY2LDI5IEBACiB9OwogCiAvKiBsNCBjb3JlIC0+IG1jc3BpMSBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDMwX21jc3BpMV9hZGRyX3NwYWNlW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDk4MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwOTgwZmYsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MzBfbDRfY29yZV9fbWNzcGkxID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDMwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQzMF9tY3NwaTFfaHdtb2QsCiAJLmNsawkJPSAibWNzcGkxX2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MzBfbWNzcGkxX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY3NwaTFfYWRkcl9zcGFjZSksCisJLmFkZHIJCT0gb21hcDJfbWNzcGkxX2FkZHJfc3BhY2UsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKIC8qIGw0IGNvcmUgLT4gbWNzcGkyIGludGVyZmFjZSAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MzBfbWNzcGkyX2FkZHJfc3BhY2VbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwOWEwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA5YTBmZiwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVCwKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQzMF9sNF9jb3JlX19tY3NwaTIgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX21jc3BpMl9od21vZCwKIAkuY2xrCQk9ICJtY3NwaTJfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQzMF9tY3NwaTJfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jc3BpMl9hZGRyX3NwYWNlKSwKKwkuYWRkcgkJPSBvbWFwMl9tY3NwaTJfYWRkcl9zcGFjZSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIAogLyogbDQgY29yZSAtPiBtY3NwaTMgaW50ZXJmYWNlICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF9tY3NwaTNfYWRkcl9zcGFjZVtdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODBiODAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MGI4MGZmLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2w0X2NvcmVfX21jc3BpMyA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQzMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MzBfbWNzcGkzX2h3bW9kLAogCS5jbGsJCT0gIm1jc3BpM19pY2siLAogCS5hZGRyCQk9IG9tYXAyNDMwX21jc3BpM19hZGRyX3NwYWNlLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNzcGkzX2FkZHJfc3BhY2UpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC00NDEsMjkgKzM0Nyw4IEBACiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCi0vKiBUaW1lciBDb21tb24gKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzc19zeXNjb25maWcgb21hcDI0MzBfdGltZXJfc3lzYyA9IHsKLQkucmV2X29mZnMJPSAweDAwMDAsCi0JLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKLQkuc3lzc19vZmZzCT0gMHgwMDE0LAotCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX1NJRExFTU9ERSB8IFNZU0NfSEFTX0NMT0NLQUNUSVZJVFkgfAotCQkJICAgU1lTQ19IQVNfRU5BV0FLRVVQIHwgU1lTQ19IQVNfU09GVFJFU0VUIHwKLQkJCSAgIFNZU0NfSEFTX0FVVE9JRExFKSwKLQkuaWRsZW1vZGVzCT0gKFNJRExFX0ZPUkNFIHwgU0lETEVfTk8gfCBTSURMRV9TTUFSVCksCi0JLnN5c2NfZmllbGRzICAgID0gJm9tYXBfaHdtb2Rfc3lzY190eXBlMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBvbWFwMjQzMF90aW1lcl9od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJ0aW1lciIsCi0JLnN5c2MgPSAmb21hcDI0MzBfdGltZXJfc3lzYywKLQkucmV2ID0gT01BUF9USU1FUl9JUF9WRVJTSU9OXzEsCi19OwotCiAvKiB0aW1lcjEgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF90aW1lcjFfaHdtb2Q7Ci1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MzBfdGltZXIxX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gMzcsIH0sCi19OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF90aW1lcjFfYWRkcnNbXSA9IHsKIAl7CkBAIC00NzEsNiArMzU2LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ5MDE4MDAwICsgU1pfMUsgLSAxLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3drdXAgLT4gdGltZXIxICovCkBAIC00NzksNyArMzY1LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX3RpbWVyMV9od21vZCwKIAkuY2xrCQk9ICJncHQxX2ljayIsCiAJLmFkZHIJCT0gb21hcDI0MzBfdGltZXIxX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXIxX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNDkxLDggKzM3Niw3IEBACiAvKiB0aW1lcjEgaHdtb2QgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF90aW1lcjFfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInRpbWVyMSIsCi0JLm1wdV9pcnFzCT0gb21hcDI0MzBfdGltZXIxX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyMV9tcHVfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfdGltZXIxX21wdV9pcnFzLAogCS5tYWluX2Nsawk9ICJncHQxX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC01MDUsMzEgKzM4OSwxOSBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjFfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDMwX3RpbWVyX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCiAvKiB0aW1lcjIgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF90aW1lcjJfaHdtb2Q7Ci1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MzBfdGltZXIyX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gMzgsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF90aW1lcjJfYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwMmEwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODAyYTAwMCArIFNaXzFLIC0gMSwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwogCiAvKiBsNF9jb3JlIC0+IHRpbWVyMiAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQzMF9sNF9jb3JlX190aW1lcjIgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX3RpbWVyMl9od21vZCwKIAkuY2xrCQk9ICJncHQyX2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MzBfdGltZXIyX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXIyX2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMnh4eF90aW1lcjJfYWRkcnMsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTU0MSw4ICs0MTMsNyBAQAogLyogdGltZXIyIGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfdGltZXIyX2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjIiLAotCS5tcHVfaXJxcwk9IG9tYXAyNDMwX3RpbWVyMl9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjJfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyMl9tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0Ml9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtNTU1LDMxICs0MjYsMTkgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXIyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXIyX3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQzMF90aW1lcl9od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyogdGltZXIzICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfdGltZXIzX2h3bW9kOwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDMwX3RpbWVyM19tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IDM5LCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MzBfdGltZXIzX2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDc4MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwNzgwMDAgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKIAogLyogbDRfY29yZSAtPiB0aW1lcjMgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MzBfbDRfY29yZV9fdGltZXIzID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDMwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQzMF90aW1lcjNfaHdtb2QsCiAJLmNsawkJPSAiZ3B0M19pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX3RpbWVyM19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyM19hZGRycyksCisJLmFkZHIJCT0gb21hcDJ4eHhfdGltZXIzX2FkZHJzLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC01OTEsOCArNDUwLDcgQEAKIC8qIHRpbWVyMyBod21vZCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDMwX3RpbWVyM19od21vZCA9IHsKIAkubmFtZQkJPSAidGltZXIzIiwKLQkubXB1X2lycXMJPSBvbWFwMjQzMF90aW1lcjNfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXIzX21wdV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl90aW1lcjNfbXB1X2lycXMsCiAJLm1haW5fY2xrCT0gImdwdDNfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTYwNSwzMSArNDYzLDE5IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3RpbWVyM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyM19zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0MzBfdGltZXJfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyNCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDMwX3RpbWVyNF9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQzMF90aW1lcjRfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0MCwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDMwX3RpbWVyNF9hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA3YTAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDdhMDAwICsgU1pfMUsgLSAxLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07CiAKIC8qIGw0X2NvcmUgLT4gdGltZXI0ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2w0X2NvcmVfX3RpbWVyNCA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQzMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MzBfdGltZXI0X2h3bW9kLAogCS5jbGsJCT0gImdwdDRfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQzMF90aW1lcjRfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjRfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyeHh4X3RpbWVyNF9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNjQxLDggKzQ4Nyw3IEBACiAvKiB0aW1lcjQgaHdtb2QgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF90aW1lcjRfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInRpbWVyNCIsCi0JLm1wdV9pcnFzCT0gb21hcDI0MzBfdGltZXI0X21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyNF9tcHVfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfdGltZXI0X21wdV9pcnFzLAogCS5tYWluX2Nsawk9ICJncHQ0X2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC02NTUsMzEgKzUwMCwxOSBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjRfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjRfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDMwX3RpbWVyX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCiAvKiB0aW1lcjUgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF90aW1lcjVfaHdtb2Q7Ci1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MzBfdGltZXI1X21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gNDEsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF90aW1lcjVfYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwN2MwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA3YzAwMCArIFNaXzFLIC0gMSwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwogCiAvKiBsNF9jb3JlIC0+IHRpbWVyNSAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQzMF9sNF9jb3JlX190aW1lcjUgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX3RpbWVyNV9od21vZCwKIAkuY2xrCQk9ICJncHQ1X2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MzBfdGltZXI1X2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXI1X2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMnh4eF90aW1lcjVfYWRkcnMsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTY5MSw4ICs1MjQsNyBAQAogLyogdGltZXI1IGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfdGltZXI1X2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjUiLAotCS5tcHVfaXJxcwk9IG9tYXAyNDMwX3RpbWVyNV9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjVfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyNV9tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0NV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtNzA1LDMxICs1MzcsMTkgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXI1X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXI1X3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQzMF90aW1lcl9od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyogdGltZXI2ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfdGltZXI2X2h3bW9kOwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDMwX3RpbWVyNl9tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IDQyLCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MzBfdGltZXI2X2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDdlMDAwLAotCQkucGFfZW5kCQk9IDB4NDgwN2UwMDAgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKIAogLyogbDRfY29yZSAtPiB0aW1lcjYgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MzBfbDRfY29yZV9fdGltZXI2ID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDMwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQzMF90aW1lcjZfaHdtb2QsCiAJLmNsawkJPSAiZ3B0Nl9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX3RpbWVyNl9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyNl9hZGRycyksCisJLmFkZHIJCT0gb21hcDJ4eHhfdGltZXI2X2FkZHJzLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC03NDEsOCArNTYxLDcgQEAKIC8qIHRpbWVyNiBod21vZCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDMwX3RpbWVyNl9od21vZCA9IHsKIAkubmFtZQkJPSAidGltZXI2IiwKLQkubXB1X2lycXMJPSBvbWFwMjQzMF90aW1lcjZfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXI2X21wdV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl90aW1lcjZfbXB1X2lycXMsCiAJLm1haW5fY2xrCT0gImdwdDZfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTc1NSwzMSArNTc0LDE5IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3RpbWVyNl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyNl9zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0MzBfdGltZXJfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyNyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDMwX3RpbWVyN19od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQzMF90aW1lcjdfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0MywgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDMwX3RpbWVyN19hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA4MDAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDgwMDAwICsgU1pfMUsgLSAxLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07CiAKIC8qIGw0X2NvcmUgLT4gdGltZXI3ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2w0X2NvcmVfX3RpbWVyNyA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQzMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MzBfdGltZXI3X2h3bW9kLAogCS5jbGsJCT0gImdwdDdfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQzMF90aW1lcjdfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjdfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyeHh4X3RpbWVyN19hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNzkxLDggKzU5OCw3IEBACiAvKiB0aW1lcjcgaHdtb2QgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF90aW1lcjdfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInRpbWVyNyIsCi0JLm1wdV9pcnFzCT0gb21hcDI0MzBfdGltZXI3X21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyN19tcHVfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfdGltZXI3X21wdV9pcnFzLAogCS5tYWluX2Nsawk9ICJncHQ3X2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC04MDUsMzEgKzYxMSwxOSBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjdfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjdfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDMwX3RpbWVyX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCiAvKiB0aW1lcjggKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF90aW1lcjhfaHdtb2Q7Ci1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MzBfdGltZXI4X21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gNDQsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF90aW1lcjhfYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwODIwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA4MjAwMCArIFNaXzFLIC0gMSwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwogCiAvKiBsNF9jb3JlIC0+IHRpbWVyOCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQzMF9sNF9jb3JlX190aW1lcjggPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX3RpbWVyOF9od21vZCwKIAkuY2xrCQk9ICJncHQ4X2ljayIsCi0JLmFkZHIJCT0gb21hcDI0MzBfdGltZXI4X2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXI4X2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMnh4eF90aW1lcjhfYWRkcnMsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTg0MSw4ICs2MzUsNyBAQAogLyogdGltZXI4IGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfdGltZXI4X2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjgiLAotCS5tcHVfaXJxcwk9IG9tYXAyNDMwX3RpbWVyOF9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjhfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyOF9tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0OF9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtODU1LDMxICs2NDgsMTkgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXI4X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXI4X3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQzMF90aW1lcl9od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyogdGltZXI5ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfdGltZXI5X2h3bW9kOwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDMwX3RpbWVyOV9tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IDQ1LCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MzBfdGltZXI5X2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDg0MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwODQwMDAgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKIAogLyogbDRfY29yZSAtPiB0aW1lcjkgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MzBfbDRfY29yZV9fdGltZXI5ID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDMwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQzMF90aW1lcjlfaHdtb2QsCiAJLmNsawkJPSAiZ3B0OV9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX3RpbWVyOV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyOV9hZGRycyksCisJLmFkZHIJCT0gb21hcDJ4eHhfdGltZXI5X2FkZHJzLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC04OTEsOCArNjcyLDcgQEAKIC8qIHRpbWVyOSBod21vZCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDMwX3RpbWVyOV9od21vZCA9IHsKIAkubmFtZQkJPSAidGltZXI5IiwKLQkubXB1X2lycXMJPSBvbWFwMjQzMF90aW1lcjlfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXI5X21wdV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl90aW1lcjlfbXB1X2lycXMsCiAJLm1haW5fY2xrCT0gImdwdDlfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTkwNSwzMSArNjg1LDE5IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3RpbWVyOV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyOV9zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0MzBfdGltZXJfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyMTAgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF90aW1lcjEwX2h3bW9kOwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDMwX3RpbWVyMTBfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0NiwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDMwX3RpbWVyMTBfYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwODYwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA4NjAwMCArIFNaXzFLIC0gMSwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwogCiAvKiBsNF9jb3JlIC0+IHRpbWVyMTAgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MzBfbDRfY29yZV9fdGltZXIxMCA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQzMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MzBfdGltZXIxMF9od21vZCwKIAkuY2xrCQk9ICJncHQxMF9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX3RpbWVyMTBfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjEwX2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMl90aW1lcjEwX2FkZHJzLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC05NDEsOCArNzA5LDcgQEAKIC8qIHRpbWVyMTAgaHdtb2QgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF90aW1lcjEwX2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjEwIiwKLQkubXB1X2lycXMJPSBvbWFwMjQzMF90aW1lcjEwX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyMTBfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyMTBfbXB1X2lycXMsCiAJLm1haW5fY2xrCT0gImdwdDEwX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC05NTUsMzEgKzcyMiwxOSBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjEwX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXIxMF9zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0MzBfdGltZXJfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyMTEgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF90aW1lcjExX2h3bW9kOwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDMwX3RpbWVyMTFfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0NywgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDMwX3RpbWVyMTFfYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwODgwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA4ODAwMCArIFNaXzFLIC0gMSwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwogCiAvKiBsNF9jb3JlIC0+IHRpbWVyMTEgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MzBfbDRfY29yZV9fdGltZXIxMSA9IHsKIAkubWFzdGVyCQk9ICZvbWFwMjQzMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MzBfdGltZXIxMV9od21vZCwKIAkuY2xrCQk9ICJncHQxMV9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX3RpbWVyMTFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjExX2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMl90aW1lcjExX2FkZHJzLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC05OTEsOCArNzQ2LDcgQEAKIC8qIHRpbWVyMTEgaHdtb2QgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF90aW1lcjExX2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjExIiwKLQkubXB1X2lycXMJPSBvbWFwMjQzMF90aW1lcjExX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyMTFfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyMTFfbXB1X2lycXMsCiAJLm1haW5fY2xrCT0gImdwdDExX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xMDA1LDMxICs3NTksMTkgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXIxMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyMTFfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDMwX3RpbWVyX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCiAvKiB0aW1lcjEyICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfdGltZXIxMl9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQzMF90aW1lcjEyX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gNDgsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF90aW1lcjEyX2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDhhMDAwLAotCQkucGFfZW5kCQk9IDB4NDgwOGEwMDAgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKIAogLyogbDRfY29yZSAtPiB0aW1lcjEyICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2w0X2NvcmVfX3RpbWVyMTIgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX3RpbWVyMTJfaHdtb2QsCiAJLmNsawkJPSAiZ3B0MTJfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQzMF90aW1lcjEyX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXIxMl9hZGRycyksCisJLmFkZHIJCT0gb21hcDJ4eHhfdGltZXIxMl9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTA0MSw4ICs3ODMsNyBAQAogLyogdGltZXIxMiBod21vZCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDMwX3RpbWVyMTJfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInRpbWVyMTIiLAotCS5tcHVfaXJxcwk9IG9tYXAyNDMwX3RpbWVyMTJfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXIxMl9tcHVfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJ4eHhfdGltZXIxMl9tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0MTJfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTEwNTUsNyArNzk2LDcgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXIxMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyMTJfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDMwX3RpbWVyX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCkBAIC0xMDY2LDYgKzgwNyw3IEBACiAJCS5wYV9lbmQJCT0gMHg0OTAxNjA3ZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2w0X3drdXBfX3dkX3RpbWVyMiA9IHsKQEAgLTEwNzMsMzEgKzgxNSw5IEBACiAJLnNsYXZlCQk9ICZvbWFwMjQzMF93ZF90aW1lcjJfaHdtb2QsCiAJLmNsawkJPSAibXB1X3dkdF9pY2siLAogCS5hZGRyCQk9IG9tYXAyNDMwX3dkX3RpbWVyMl9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3dkX3RpbWVyMl9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKLS8qCi0gKiAnd2RfdGltZXInIGNsYXNzCi0gKiAzMi1iaXQgd2F0Y2hkb2cgdXB3YXJkIGNvdW50ZXIgdGhhdCBnZW5lcmF0ZXMgYSBwdWxzZSBvbiB0aGUgcmVzZXQgcGluIG9uCi0gKiBvdmVyZmxvdyBjb25kaXRpb24KLSAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAyNDMwX3dkX3RpbWVyX3N5c2MgPSB7Ci0JLnJldl9vZmZzCT0gMHgwLAotCS5zeXNjX29mZnMJPSAweDAwMTAsCi0JLnN5c3Nfb2Zmcwk9IDB4MDAxNCwKLQkuc3lzY19mbGFncwk9IChTWVNDX0hBU19FTVVGUkVFIHwgU1lTQ19IQVNfU09GVFJFU0VUIHwKLQkJCSAgIFNZU0NfSEFTX0FVVE9JRExFIHwgU1lTU19IQVNfUkVTRVRfU1RBVFVTKSwKLQkuc3lzY19maWVsZHMgICAgPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyNDMwX3dkX3RpbWVyX2h3bW9kX2NsYXNzID0gewotCS5uYW1lCQk9ICJ3ZF90aW1lciIsCi0JLnN5c2MJCT0gJm9tYXAyNDMwX3dkX3RpbWVyX3N5c2MsCi0JLnByZV9zaHV0ZG93bgk9ICZvbWFwMl93ZF90aW1lcl9kaXNhYmxlCi19OwotCiAvKiB3ZF90aW1lcjIgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAyNDMwX3dkX3RpbWVyMl9zbGF2ZXNbXSA9IHsKIAkmb21hcDI0MzBfbDRfd2t1cF9fd2RfdGltZXIyLApAQCAtMTEwNSw3ICs4MjUsNyBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfd2RfdGltZXIyX2h3bW9kID0gewogCS5uYW1lCQk9ICJ3ZF90aW1lcjIiLAotCS5jbGFzcwkJPSAmb21hcDI0MzBfd2RfdGltZXJfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF93ZF90aW1lcl9od21vZF9jbGFzcywKIAkubWFpbl9jbGsJPSAibXB1X3dkdF9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTEyMSw0NSArODQxLDE2IEBACiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAotLyogVUFSVCAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIHVhcnRfc3lzYyA9IHsKLQkucmV2X29mZnMJPSAweDUwLAotCS5zeXNjX29mZnMJPSAweDU0LAotCS5zeXNzX29mZnMJPSAweDU4LAotCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX1NJRExFTU9ERSB8Ci0JCQkgICBTWVNDX0hBU19FTkFXQUtFVVAgfCBTWVNDX0hBU19TT0ZUUkVTRVQgfAotCQkJICAgU1lTQ19IQVNfQVVUT0lETEUgfCBTWVNTX0hBU19SRVNFVF9TVEFUVVMpLAotCS5pZGxlbW9kZXMJPSAoU0lETEVfRk9SQ0UgfCBTSURMRV9OTyB8IFNJRExFX1NNQVJUKSwKLQkuc3lzY19maWVsZHMgICAgPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIHVhcnRfY2xhc3MgPSB7Ci0JLm5hbWUgPSAidWFydCIsCi0JLnN5c2MgPSAmdWFydF9zeXNjLAotfTsKLQogLyogVUFSVDEgKi8KIAotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIHVhcnQxX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gSU5UXzI0WFhfVUFSVDFfSVJRLCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIHVhcnQxX3NkbWFfcmVxc1tdID0gewotCXsgLm5hbWUgPSAicngiLAkuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9VQVJUMV9SWCwgfSwKLQl7IC5uYW1lID0gInR4IiwJLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfVUFSVDFfVFgsIH0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwMjQzMF91YXJ0MV9zbGF2ZXNbXSA9IHsKIAkmb21hcDJfbDRfY29yZV9fdWFydDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfdWFydDFfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInVhcnQxIiwKLQkubXB1X2lycXMJPSB1YXJ0MV9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRSh1YXJ0MV9tcHVfaXJxcyksCi0JLnNkbWFfcmVxcwk9IHVhcnQxX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUodWFydDFfc2RtYV9yZXFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl91YXJ0MV9tcHVfaXJxcywKKwkuc2RtYV9yZXFzCT0gb21hcDJfdWFydDFfc2RtYV9yZXFzLAogCS5tYWluX2Nsawk9ICJ1YXJ0MV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTE3MiwzMSArODYzLDIwIEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3VhcnQxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdWFydDFfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJnVhcnRfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMl91YXJ0X2NsYXNzLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIFVBUlQyICovCiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyB1YXJ0Ml9tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IElOVF8yNFhYX1VBUlQyX0lSUSwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyB1YXJ0Ml9zZG1hX3JlcXNbXSA9IHsKLQl7IC5uYW1lID0gInJ4IiwJLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfVUFSVDJfUlgsIH0sCi0JeyAubmFtZSA9ICJ0eCIsCS5kbWFfcmVxID0gT01BUDI0WFhfRE1BX1VBUlQyX1RYLCB9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDI0MzBfdWFydDJfc2xhdmVzW10gPSB7CiAJJm9tYXAyX2w0X2NvcmVfX3VhcnQyLAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDMwX3VhcnQyX2h3bW9kID0gewogCS5uYW1lCQk9ICJ1YXJ0MiIsCi0JLm1wdV9pcnFzCT0gdWFydDJfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUodWFydDJfbXB1X2lycXMpLAotCS5zZG1hX3JlcXMJPSB1YXJ0Ml9zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKHVhcnQyX3NkbWFfcmVxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfdWFydDJfbXB1X2lycXMsCisJLnNkbWFfcmVxcwk9IG9tYXAyX3VhcnQyX3NkbWFfcmVxcywKIAkubWFpbl9jbGsJPSAidWFydDJfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTEyMDksMzEgKzg4OSwyMCBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF91YXJ0Ml9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3VhcnQyX3NsYXZlcyksCi0JLmNsYXNzCQk9ICZ1YXJ0X2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJfdWFydF9jbGFzcywKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBVQVJUMyAqLwogCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gdWFydDNfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSBJTlRfMjRYWF9VQVJUM19JUlEsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gdWFydDNfc2RtYV9yZXFzW10gPSB7Ci0JeyAubmFtZSA9ICJyeCIsCS5kbWFfcmVxID0gT01BUDI0WFhfRE1BX1VBUlQzX1JYLCB9LAotCXsgLm5hbWUgPSAidHgiLAkuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9VQVJUM19UWCwgfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAyNDMwX3VhcnQzX3NsYXZlc1tdID0gewogCSZvbWFwMl9sNF9jb3JlX191YXJ0MywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF91YXJ0M19od21vZCA9IHsKIAkubmFtZQkJPSAidWFydDMiLAotCS5tcHVfaXJxcwk9IHVhcnQzX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKHVhcnQzX21wdV9pcnFzKSwKLQkuc2RtYV9yZXFzCT0gdWFydDNfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRSh1YXJ0M19zZG1hX3JlcXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3VhcnQzX21wdV9pcnFzLAorCS5zZG1hX3JlcXMJPSBvbWFwMl91YXJ0M19zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gInVhcnQzX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xMjQ2LDUzICs5MTUsMjIgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdWFydDNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF91YXJ0M19zbGF2ZXMpLAotCS5jbGFzcwkJPSAmdWFydF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyX3VhcnRfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAotLyoKLSAqICdkc3MnIGNsYXNzCi0gKiBkaXNwbGF5IHN1Yi1zeXN0ZW0KLSAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAyNDMwX2Rzc19zeXNjID0gewotCS5yZXZfb2Zmcwk9IDB4MDAwMCwKLQkuc3lzY19vZmZzCT0gMHgwMDEwLAotCS5zeXNzX29mZnMJPSAweDAwMTQsCi0JLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfU09GVFJFU0VUIHwgU1lTQ19IQVNfQVVUT0lETEUpLAotCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDI0MzBfZHNzX2h3bW9kX2NsYXNzID0gewotCS5uYW1lID0gImRzcyIsCi0JLnN5c2MgPSAmb21hcDI0MzBfZHNzX3N5c2MsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDI0MzBfZHNzX3NkbWFfY2hzW10gPSB7Ci0JeyAubmFtZSA9ICJkaXNwYyIsIC5kbWFfcmVxID0gNSB9LAotfTsKLQogLyogZHNzICovCiAvKiBkc3MgbWFzdGVyIHBvcnRzICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwMjQzMF9kc3NfbWFzdGVyc1tdID0gewogCSZvbWFwMjQzMF9kc3NfX2wzLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MzBfZHNzX2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDUwMDAwLAotCQkucGFfZW5kCQk9IDB4NDgwNTAzRkYsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKLQogLyogbDRfY29yZSAtPiBkc3MgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MzBfbDRfY29yZV9fZHNzID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDMwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQzMF9kc3NfY29yZV9od21vZCwKIAkuY2xrCQk9ICJkc3NfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQzMF9kc3NfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9kc3NfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyX2Rzc19hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTMwOCwxMCArOTQ2LDkgQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDMwX2Rzc19jb3JlX2h3bW9kID0gewogCS5uYW1lCQk9ICJkc3NfY29yZSIsCi0JLmNsYXNzCQk9ICZvbWFwMjQzMF9kc3NfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMl9kc3NfaHdtb2RfY2xhc3MsCiAJLm1haW5fY2xrCT0gImRzczFfZmNrIiwgLyogaW5zdGVhZCBvZiBkc3NfZmNrICovCi0JLnNkbWFfcmVxcwk9IG9tYXAyNDMwX2Rzc19zZG1hX2NocywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZHNzX3NkbWFfY2hzKSwKKwkuc2RtYV9yZXFzCT0gb21hcDJ4eHhfZHNzX3NkbWFfY2hzLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewogCQkJLnByY21fcmVnX2lkID0gMSwKQEAgLTEzMzEsNDYgKzk2OCwxMiBAQAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCi0vKgotICogJ2Rpc3BjJyBjbGFzcwotICogZGlzcGxheSBjb250cm9sbGVyCi0gKi8KLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwMjQzMF9kaXNwY19zeXNjID0gewotCS5yZXZfb2Zmcwk9IDB4MDAwMCwKLQkuc3lzY19vZmZzCT0gMHgwMDEwLAotCS5zeXNzX29mZnMJPSAweDAwMTQsCi0JLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfU0lETEVNT0RFIHwgU1lTQ19IQVNfTUlETEVNT0RFIHwKLQkJCSAgIFNZU0NfSEFTX1NPRlRSRVNFVCB8IFNZU0NfSEFTX0FVVE9JRExFKSwKLQkuaWRsZW1vZGVzCT0gKFNJRExFX0ZPUkNFIHwgU0lETEVfTk8gfCBTSURMRV9TTUFSVCB8Ci0JCQkgICBNU1RBTkRCWV9GT1JDRSB8IE1TVEFOREJZX05PIHwgTVNUQU5EQllfU01BUlQpLAotCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDI0MzBfZGlzcGNfaHdtb2RfY2xhc3MgPSB7Ci0JLm5hbWUgPSAiZGlzcGMiLAotCS5zeXNjID0gJm9tYXAyNDMwX2Rpc3BjX3N5c2MsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MzBfZGlzcGNfaXJxc1tdID0gewotCXsgLmlycSA9IDI1IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF9kc3NfZGlzcGNfYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwNTA0MDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA1MDdGRiwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwotCiAvKiBsNF9jb3JlIC0+IGRzc19kaXNwYyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQzMF9sNF9jb3JlX19kc3NfZGlzcGMgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX2Rzc19kaXNwY19od21vZCwKIAkuY2xrCQk9ICJkc3NfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQzMF9kc3NfZGlzcGNfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9kc3NfZGlzcGNfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyX2Rzc19kaXNwY19hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTM4MSw5ICs5ODQsOCBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfZHNzX2Rpc3BjX2h3bW9kID0gewogCS5uYW1lCQk9ICJkc3NfZGlzcGMiLAotCS5jbGFzcwkJPSAmb21hcDI0MzBfZGlzcGNfaHdtb2RfY2xhc3MsCi0JLm1wdV9pcnFzCT0gb21hcDI0MzBfZGlzcGNfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9kaXNwY19pcnFzKSwKKwkuY2xhc3MJCT0gJm9tYXAyX2Rpc3BjX2h3bW9kX2NsYXNzLAorCS5tcHVfaXJxcwk9IG9tYXAyX2Rpc3BjX2lycXMsCiAJLm1haW5fY2xrCT0gImRzczFfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE0MDAsNDEgKzEwMDIsMTIgQEAKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIAotLyoKLSAqICdyZmJpJyBjbGFzcwotICogcmVtb3RlIGZyYW1lIGJ1ZmZlciBpbnRlcmZhY2UKLSAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAyNDMwX3JmYmlfc3lzYyA9IHsKLQkucmV2X29mZnMJPSAweDAwMDAsCi0JLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKLQkuc3lzc19vZmZzCT0gMHgwMDE0LAotCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX1NJRExFTU9ERSB8IFNZU0NfSEFTX1NPRlRSRVNFVCB8Ci0JCQkgICBTWVNDX0hBU19BVVRPSURMRSksCi0JLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQpLAotCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDI0MzBfcmZiaV9od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJyZmJpIiwKLQkuc3lzYyA9ICZvbWFwMjQzMF9yZmJpX3N5c2MsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF9kc3NfcmZiaV9hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA1MDgwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDUwQkZGLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07Ci0KIC8qIGw0X2NvcmUgLT4gZHNzX3JmYmkgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MzBfbDRfY29yZV9fZHNzX3JmYmkgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX2Rzc19yZmJpX2h3bW9kLAogCS5jbGsJCT0gImRzc19pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX2Rzc19yZmJpX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZHNzX3JmYmlfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyX2Rzc19yZmJpX2FkZHJzLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0xNDQ1LDcgKzEwMTgsNyBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfZHNzX3JmYmlfaHdtb2QgPSB7CiAJLm5hbWUJCT0gImRzc19yZmJpIiwKLQkuY2xhc3MJCT0gJm9tYXAyNDMwX3JmYmlfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMl9yZmJpX2h3bW9kX2NsYXNzLAogCS5tYWluX2Nsawk9ICJkc3MxX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xNDYwLDMxICsxMDMzLDEyIEBACiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKLS8qCi0gKiAndmVuYycgY2xhc3MKLSAqIHZpZGVvIGVuY29kZXIKLSAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDI0MzBfdmVuY19od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJ2ZW5jIiwKLX07Ci0KLS8qIGRzc192ZW5jICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF9kc3NfdmVuY19hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA1MEMwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDUwRkZGLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07Ci0KIC8qIGw0X2NvcmUgLT4gZHNzX3ZlbmMgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MzBfbDRfY29yZV9fZHNzX3ZlbmMgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX2Rzc192ZW5jX2h3bW9kLAogCS5jbGsJCT0gImRzc181NG1fZmNrIiwKLQkuYWRkcgkJPSBvbWFwMjQzMF9kc3NfdmVuY19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2Rzc192ZW5jX2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMl9kc3NfdmVuY19hZGRycywKIAkuZmxhZ3MJCT0gT0NQSUZfU1dTVVBfSURMRSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKQEAgLTE0OTYsNyArMTA1MCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF9kc3NfdmVuY19od21vZCA9IHsKIAkubmFtZQkJPSAiZHNzX3ZlbmMiLAotCS5jbGFzcwkJPSAmb21hcDI0MzBfdmVuY19od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyX3ZlbmNfaHdtb2RfY2xhc3MsCiAJLm1haW5fY2xrCT0gImRzczFfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE1MzIsMjUgKzEwODYsMTQgQEAKIAogLyogSTJDMSAqLwogCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gaTJjMV9tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IElOVF8yNFhYX0kyQzFfSVJRLCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIGkyYzFfc2RtYV9yZXFzW10gPSB7Ci0JeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gT01BUDI0WFhfRE1BX0kyQzFfVFggfSwKLQl7IC5uYW1lID0gInJ4IiwgLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfSTJDMV9SWCB9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDI0MzBfaTJjMV9zbGF2ZXNbXSA9IHsKIAkmb21hcDI0MzBfbDRfY29yZV9faTJjMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF9pMmMxX2h3bW9kID0gewogCS5uYW1lCQk9ICJpMmMxIiwKLQkubXB1X2lycXMJPSBpMmMxX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKGkyYzFfbXB1X2lycXMpLAotCS5zZG1hX3JlcXMJPSBpMmMxX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUoaTJjMV9zZG1hX3JlcXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX2kyYzFfbXB1X2lycXMsCisJLnNkbWFfcmVxcwk9IG9tYXAyX2kyYzFfc2RtYV9yZXFzLAogCS5tYWluX2Nsawk9ICJpMmNoczFfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE1NzgsMjUgKzExMjEsMTQgQEAKIAogLyogSTJDMiAqLwogCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gaTJjMl9tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IElOVF8yNFhYX0kyQzJfSVJRLCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIGkyYzJfc2RtYV9yZXFzW10gPSB7Ci0JeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gT01BUDI0WFhfRE1BX0kyQzJfVFggfSwKLQl7IC5uYW1lID0gInJ4IiwgLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfSTJDMl9SWCB9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDI0MzBfaTJjMl9zbGF2ZXNbXSA9IHsKIAkmb21hcDI0MzBfbDRfY29yZV9faTJjMiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF9pMmMyX2h3bW9kID0gewogCS5uYW1lCQk9ICJpMmMyIiwKLQkubXB1X2lycXMJPSBpMmMyX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKGkyYzJfbXB1X2lycXMpLAotCS5zZG1hX3JlcXMJPSBpMmMyX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUoaTJjMl9zZG1hX3JlcXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX2kyYzJfbXB1X2lycXMsCisJLnNkbWFfcmVxcwk9IG9tYXAyX2kyYzJfc2RtYV9yZXFzLAogCS5tYWluX2Nsawk9ICJpMmNoczJfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE2MjEsNiArMTE1Myw3IEBACiAJCS5wYV9lbmQJCT0gMHg0OTAwQzFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2w0X3drdXBfX2dwaW8xID0gewpAQCAtMTYyOCw3ICsxMTYxLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX2dwaW8xX2h3bW9kLAogCS5jbGsJCT0gImdwaW9zX2ljayIsCiAJLmFkZHIJCT0gb21hcDI0MzBfZ3BpbzFfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2dwaW8xX2FkZHJfc3BhY2UpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0xNjM5LDYgKzExNzEsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwMEUxZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQzMF9sNF93a3VwX19ncGlvMiA9IHsKQEAgLTE2NDYsNyArMTE3OSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwMjQzMF9ncGlvMl9od21vZCwKIAkuY2xrCQk9ICJncGlvc19pY2siLAogCS5hZGRyCQk9IG9tYXAyNDMwX2dwaW8yX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9ncGlvMl9hZGRyX3NwYWNlKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTY1Nyw2ICsxMTg5LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ5MDEwMWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDI0MzBfbDRfd2t1cF9fZ3BpbzMgPSB7CkBAIC0xNjY0LDcgKzExOTcsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDI0MzBfZ3BpbzNfaHdtb2QsCiAJLmNsawkJPSAiZ3Bpb3NfaWNrIiwKIAkuYWRkcgkJPSBvbWFwMjQzMF9ncGlvM19hZGRyX3NwYWNlLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZ3BpbzNfYWRkcl9zcGFjZSksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTE2NzUsNiArMTIwNyw3IEBACiAJCS5wYV9lbmQJCT0gMHg0OTAxMjFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2w0X3drdXBfX2dwaW80ID0gewpAQCAtMTY4Miw3ICsxMjE1LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX2dwaW80X2h3bW9kLAogCS5jbGsJCT0gImdwaW9zX2ljayIsCiAJLmFkZHIJCT0gb21hcDI0MzBfZ3BpbzRfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2dwaW80X2FkZHJfc3BhY2UpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0xNjkzLDYgKzEyMjUsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwQjYxZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMjQzMF9sNF9jb3JlX19ncGlvNSA9IHsKQEAgLTE3MDAsNyArMTIzMyw2IEBACiAJLnNsYXZlCQk9ICZvbWFwMjQzMF9ncGlvNV9od21vZCwKIAkuY2xrCQk9ICJncGlvNV9pY2siLAogCS5hZGRyCQk9IG9tYXAyNDMwX2dwaW81X2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9ncGlvNV9hZGRyX3NwYWNlKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTcxMCwzMiArMTI0Miw3IEBACiAJLmRiY2tfZmxhZyA9IGZhbHNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwMjQzeF9ncGlvX3N5c2MgPSB7Ci0JLnJldl9vZmZzCT0gMHgwMDAwLAotCS5zeXNjX29mZnMJPSAweDAwMTAsCi0JLnN5c3Nfb2Zmcwk9IDB4MDAxNCwKLQkuc3lzY19mbGFncwk9IChTWVNDX0hBU19FTkFXQUtFVVAgfCBTWVNDX0hBU19TSURMRU1PREUgfAotCQkJICAgU1lTQ19IQVNfU09GVFJFU0VUIHwgU1lTQ19IQVNfQVVUT0lETEUgfAotCQkJICAgU1lTU19IQVNfUkVTRVRfU1RBVFVTKSwKLQkuaWRsZW1vZGVzCT0gKFNJRExFX0ZPUkNFIHwgU0lETEVfTk8gfCBTSURMRV9TTUFSVCksCi0JLnN5c2NfZmllbGRzICAgID0gJm9tYXBfaHdtb2Rfc3lzY190eXBlMSwKLX07Ci0KLS8qCi0gKiAnZ3BpbycgY2xhc3MKLSAqIGdlbmVyYWwgcHVycG9zZSBpbyBtb2R1bGUKLSAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyNDN4X2dwaW9faHdtb2RfY2xhc3MgPSB7Ci0JLm5hbWUgPSAiZ3BpbyIsCi0JLnN5c2MgPSAmb21hcDI0M3hfZ3Bpb19zeXNjLAotCS5yZXYgPSAwLAotfTsKLQogLyogZ3BpbzEgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQzeF9ncGlvMV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gMjkgfSwgLyogSU5UXzI0WFhfR1BJT19CQU5LMSAqLwotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDI0MzBfZ3BpbzFfc2xhdmVzW10gPSB7CiAJJm9tYXAyNDMwX2w0X3drdXBfX2dwaW8xLAogfTsKQEAgLTE3NDMsOCArMTI1MCw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfZ3BpbzFfaHdtb2QgPSB7CiAJLm5hbWUJCT0gImdwaW8xIiwKIAkuZmxhZ3MJCT0gSFdNT0RfQ09OVFJPTF9PUFRfQ0xLU19JTl9SRVNFVCwKLQkubXB1X2lycXMJPSBvbWFwMjQzeF9ncGlvMV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDN4X2dwaW8xX2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX2dwaW8xX2lycXMsCiAJLm1haW5fY2xrCT0gImdwaW9zX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xNzU3LDE2ICsxMjYzLDEyIEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX2dwaW8xX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZ3BpbzFfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDN4X2dwaW9faHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIGdwaW8yICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0M3hfZ3BpbzJfaXJxc1tdID0gewotCXsgLmlycSA9IDMwIH0sIC8qIElOVF8yNFhYX0dQSU9fQkFOSzIgKi8KLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAyNDMwX2dwaW8yX3NsYXZlc1tdID0gewogCSZvbWFwMjQzMF9sNF93a3VwX19ncGlvMiwKIH07CkBAIC0xNzc0LDggKzEyNzYsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDMwX2dwaW8yX2h3bW9kID0gewogCS5uYW1lCQk9ICJncGlvMiIsCiAJLmZsYWdzCQk9IEhXTU9EX0NPTlRST0xfT1BUX0NMS1NfSU5fUkVTRVQsCi0JLm1wdV9pcnFzCT0gb21hcDI0M3hfZ3BpbzJfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzeF9ncGlvMl9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9ncGlvMl9pcnFzLAogCS5tYWluX2Nsawk9ICJncGlvc19mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTc4OCwxNiArMTI4OSwxMiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF9ncGlvMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2dwaW8yX3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQzeF9ncGlvX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBncGlvMyAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDN4X2dwaW8zX2lycXNbXSA9IHsKLQl7IC5pcnEgPSAzMSB9LCAvKiBJTlRfMjRYWF9HUElPX0JBTkszICovCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwMjQzMF9ncGlvM19zbGF2ZXNbXSA9IHsKIAkmb21hcDI0MzBfbDRfd2t1cF9fZ3BpbzMsCiB9OwpAQCAtMTgwNSw4ICsxMzAyLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF9ncGlvM19od21vZCA9IHsKIAkubmFtZQkJPSAiZ3BpbzMiLAogCS5mbGFncwkJPSBIV01PRF9DT05UUk9MX09QVF9DTEtTX0lOX1JFU0VULAotCS5tcHVfaXJxcwk9IG9tYXAyNDN4X2dwaW8zX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0M3hfZ3BpbzNfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfZ3BpbzNfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3Bpb3NfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE4MTksMTYgKzEzMTUsMTIgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfZ3BpbzNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9ncGlvM19zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0M3hfZ3Bpb19od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogZ3BpbzQgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQzeF9ncGlvNF9pcnFzW10gPSB7Ci0JeyAuaXJxID0gMzIgfSwgLyogSU5UXzI0WFhfR1BJT19CQU5LNCAqLwotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDI0MzBfZ3BpbzRfc2xhdmVzW10gPSB7CiAJJm9tYXAyNDMwX2w0X3drdXBfX2dwaW80LAogfTsKQEAgLTE4MzYsOCArMTMyOCw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfZ3BpbzRfaHdtb2QgPSB7CiAJLm5hbWUJCT0gImdwaW80IiwKIAkuZmxhZ3MJCT0gSFdNT0RfQ09OVFJPTF9PUFRfQ0xLU19JTl9SRVNFVCwKLQkubXB1X2lycXMJPSBvbWFwMjQzeF9ncGlvNF9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDN4X2dwaW80X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX2dwaW80X2lycXMsCiAJLm1haW5fY2xrCT0gImdwaW9zX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xODUwLDcgKzEzNDEsNyBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF9ncGlvNF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2dwaW80X3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQzeF9ncGlvX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwpAQCAtMTg1OCw2ICsxMzQ5LDcgQEAKIC8qIGdwaW81ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0M3hfZ3BpbzVfaXJxc1tdID0gewogCXsgLmlycSA9IDMzIH0sIC8qIElOVF8yNFhYX0dQSU9fQkFOSzUgKi8KKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwMjQzMF9ncGlvNV9zbGF2ZXNbXSA9IHsKQEAgLTE4NjgsNyArMTM2MCw2IEBACiAJLm5hbWUJCT0gImdwaW81IiwKIAkuZmxhZ3MJCT0gSFdNT0RfQ09OVFJPTF9PUFRfQ0xLU19JTl9SRVNFVCwKIAkubXB1X2lycXMJPSBvbWFwMjQzeF9ncGlvNV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDN4X2dwaW81X2lycXMpLAogCS5tYWluX2Nsawk9ICJncGlvNV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTg4MSwyOCArMTM3MiwxMSBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF9ncGlvNV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2dwaW81X3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQzeF9ncGlvX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCi0vKiBkbWFfc3lzdGVtICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAyNDMwX2RtYV9zeXNjID0gewotCS5yZXZfb2Zmcwk9IDB4MDAwMCwKLQkuc3lzY19vZmZzCT0gMHgwMDJjLAotCS5zeXNzX29mZnMJPSAweDAwMjgsCi0JLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfU09GVFJFU0VUIHwgU1lTQ19IQVNfTUlETEVNT0RFIHwKLQkJCSAgIFNZU0NfSEFTX0NMT0NLQUNUSVZJVFkgfCBTWVNDX0hBU19FTVVGUkVFIHwKLQkJCSAgIFNZU0NfSEFTX0FVVE9JRExFIHwgU1lTU19IQVNfUkVTRVRfU1RBVFVTKSwKLQkuaWRsZW1vZGVzCT0gKE1TVEFOREJZX0ZPUkNFIHwgTVNUQU5EQllfTk8gfCBNU1RBTkRCWV9TTUFSVCksCi0JLnN5c2NfZmllbGRzCT0gJm9tYXBfaHdtb2Rfc3lzY190eXBlMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBvbWFwMjQzMF9kbWFfaHdtb2RfY2xhc3MgPSB7Ci0JLm5hbWUgPSAiZG1hIiwKLQkuc3lzYyA9ICZvbWFwMjQzMF9kbWFfc3lzYywKLX07Ci0KIC8qIGRtYSBhdHRyaWJ1dGVzICovCiBzdGF0aWMgc3RydWN0IG9tYXBfZG1hX2Rldl9hdHRyIGRtYV9kZXZfYXR0ciA9IHsKIAkuZGV2X2NhcHMgID0gUkVTRVJWRV9DSEFOTkVMIHwgRE1BX0xJTktFRF9MQ0ggfCBHTE9CQUxfUFJJT1JJVFkgfApAQCAtMTkxMCwyMSArMTM4NCw2IEBACiAJLmxjaF9jb3VudCA9IDMyLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyNDMwX2RtYV9zeXN0ZW1faXJxc1tdID0gewotCXsgLm5hbWUgPSAiMCIsIC5pcnEgPSAxMiB9LCAvKiBJTlRfMjRYWF9TRE1BX0lSUTAgKi8KLQl7IC5uYW1lID0gIjEiLCAuaXJxID0gMTMgfSwgLyogSU5UXzI0WFhfU0RNQV9JUlExICovCi0JeyAubmFtZSA9ICIyIiwgLmlycSA9IDE0IH0sIC8qIElOVF8yNFhYX1NETUFfSVJRMiAqLwotCXsgLm5hbWUgPSAiMyIsIC5pcnEgPSAxNSB9LCAvKiBJTlRfMjRYWF9TRE1BX0lSUTMgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDMwX2RtYV9zeXN0ZW1fYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwNTYwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA1NmZmZiwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwotCiAvKiBkbWFfc3lzdGVtIC0+IEwzICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2RtYV9zeXN0ZW1fX2wzID0gewogCS5tYXN0ZXIJCT0gJm9tYXAyNDMwX2RtYV9zeXN0ZW1faHdtb2QsCkBAIC0xOTQzLDggKzE0MDIsNyBAQAogCS5tYXN0ZXIJCT0gJm9tYXAyNDMwX2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMjQzMF9kbWFfc3lzdGVtX2h3bW9kLAogCS5jbGsJCT0gInNkbWFfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMjQzMF9kbWFfc3lzdGVtX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZG1hX3N5c3RlbV9hZGRycyksCisJLmFkZHIJCT0gb21hcDJfZG1hX3N5c3RlbV9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTk1NSw5ICsxNDEzLDggQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDMwX2RtYV9zeXN0ZW1faHdtb2QgPSB7CiAJLm5hbWUJCT0gImRtYSIsCi0JLmNsYXNzCQk9ICZvbWFwMjQzMF9kbWFfaHdtb2RfY2xhc3MsCi0JLm1wdV9pcnFzCT0gb21hcDI0MzBfZG1hX3N5c3RlbV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2RtYV9zeXN0ZW1faXJxcyksCisJLmNsYXNzCQk9ICZvbWFwMnh4eF9kbWFfaHdtb2RfY2xhc3MsCisJLm1wdV9pcnFzCT0gb21hcDJfZG1hX3N5c3RlbV9pcnFzLAogCS5tYWluX2Nsawk9ICJjb3JlX2wzX2NrIiwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX2RtYV9zeXN0ZW1fc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9kbWFfc3lzdGVtX3NsYXZlcyksCkBAIC0xOTY4LDQ3ICsxNDI1LDE4IEBACiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKLS8qCi0gKiAnbWFpbGJveCcgY2xhc3MKLSAqIG1haWxib3ggbW9kdWxlIGFsbG93aW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgb24tY2hpcCBwcm9jZXNzb3JzCi0gKiB1c2luZyBhIHF1ZXVlZCBtYWlsYm94LWludGVycnVwdCBtZWNoYW5pc20uCi0gKi8KLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwMjQzMF9tYWlsYm94X3N5c2MgPSB7Ci0JLnJldl9vZmZzCT0gMHgwMDAsCi0JLnN5c2Nfb2Zmcwk9IDB4MDEwLAotCS5zeXNzX29mZnMJPSAweDAxNCwKLQkuc3lzY19mbGFncwk9IChTWVNDX0hBU19DTE9DS0FDVElWSVRZIHwgU1lTQ19IQVNfU0lETEVNT0RFIHwKLQkJCQlTWVNDX0hBU19TT0ZUUkVTRVQgfCBTWVNDX0hBU19BVVRPSURMRSksCi0JLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQpLAotCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDI0MzBfbWFpbGJveF9od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJtYWlsYm94IiwKLQkuc3lzYyA9ICZvbWFwMjQzMF9tYWlsYm94X3N5c2MsCi19OwotCiAvKiBtYWlsYm94ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfbWFpbGJveF9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQzMF9tYWlsYm94X2lycXNbXSA9IHsKIAl7IC5pcnEgPSAyNiB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MzBfbWFpbGJveF9hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA5NDAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDk0MWZmLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAotCX0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogLyogbDRfY29yZSAtPiBtYWlsYm94ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAyNDMwX2w0X2NvcmVfX21haWxib3ggPSB7CiAJLm1hc3RlcgkJPSAmb21hcDI0MzBfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX21haWxib3hfaHdtb2QsCi0JLmFkZHIJCT0gb21hcDI0MzBfbWFpbGJveF9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21haWxib3hfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyX21haWxib3hfYWRkcnMsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTIwMTksOSArMTQ0Nyw4IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF9tYWlsYm94X2h3bW9kID0gewogCS5uYW1lCQk9ICJtYWlsYm94IiwKLQkuY2xhc3MJCT0gJm9tYXAyNDMwX21haWxib3hfaHdtb2RfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF9tYWlsYm94X2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXAyNDMwX21haWxib3hfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tYWlsYm94X2lycXMpLAogCS5tYWluX2Nsawk9ICJtYWlsYm94ZXNfaWNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTIwMzcsNDUgKzE0NjQsNyBAQAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKLS8qCi0gKiAnbWNzcGknIGNsYXNzCi0gKiBtdWx0aWNoYW5uZWwgc2VyaWFsIHBvcnQgaW50ZXJmYWNlIChtY3NwaSkgLyBtYXN0ZXIvc2xhdmUgc3luY2hyb25vdXMgc2VyaWFsCi0gKiBidXMKLSAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAyNDMwX21jc3BpX3N5c2MgPSB7Ci0JLnJldl9vZmZzCT0gMHgwMDAwLAotCS5zeXNjX29mZnMJPSAweDAwMTAsCi0JLnN5c3Nfb2Zmcwk9IDB4MDAxNCwKLQkuc3lzY19mbGFncwk9IChTWVNDX0hBU19DTE9DS0FDVElWSVRZIHwgU1lTQ19IQVNfU0lETEVNT0RFIHwKLQkJCQlTWVNDX0hBU19FTkFXQUtFVVAgfCBTWVNDX0hBU19TT0ZUUkVTRVQgfAotCQkJCVNZU0NfSEFTX0FVVE9JRExFIHwgU1lTU19IQVNfUkVTRVRfU1RBVFVTKSwKLQkuaWRsZW1vZGVzCT0gKFNJRExFX0ZPUkNFIHwgU0lETEVfTk8gfCBTSURMRV9TTUFSVCksCi0JLnN5c2NfZmllbGRzICAgID0gJm9tYXBfaHdtb2Rfc3lzY190eXBlMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBvbWFwMjQzMF9tY3NwaV9jbGFzcyA9IHsKLQkubmFtZSA9ICJtY3NwaSIsCi0JLnN5c2MgPSAmb21hcDI0MzBfbWNzcGlfc3lzYywKLQkucmV2ID0gT01BUDJfTUNTUElfUkVWLAotfTsKLQogLyogbWNzcGkxICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MzBfbWNzcGkxX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gNjUgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwMjQzMF9tY3NwaTFfc2RtYV9yZXFzW10gPSB7Ci0JeyAubmFtZSA9ICJ0eDAiLCAuZG1hX3JlcSA9IDM1IH0sIC8qIERNQV9TUEkxX1RYMCAqLwotCXsgLm5hbWUgPSAicngwIiwgLmRtYV9yZXEgPSAzNiB9LCAvKiBETUFfU1BJMV9SWDAgKi8KLQl7IC5uYW1lID0gInR4MSIsIC5kbWFfcmVxID0gMzcgfSwgLyogRE1BX1NQSTFfVFgxICovCi0JeyAubmFtZSA9ICJyeDEiLCAuZG1hX3JlcSA9IDM4IH0sIC8qIERNQV9TUEkxX1JYMSAqLwotCXsgLm5hbWUgPSAidHgyIiwgLmRtYV9yZXEgPSAzOSB9LCAvKiBETUFfU1BJMV9UWDIgKi8KLQl7IC5uYW1lID0gInJ4MiIsIC5kbWFfcmVxID0gNDAgfSwgLyogRE1BX1NQSTFfUlgyICovCi0JeyAubmFtZSA9ICJ0eDMiLCAuZG1hX3JlcSA9IDQxIH0sIC8qIERNQV9TUEkxX1RYMyAqLwotCXsgLm5hbWUgPSAicngzIiwgLmRtYV9yZXEgPSA0MiB9LCAvKiBETUFfU1BJMV9SWDMgKi8KLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAyNDMwX21jc3BpMV9zbGF2ZXNbXSA9IHsKIAkmb21hcDI0MzBfbDRfY29yZV9fbWNzcGkxLAogfTsKQEAgLTIwODYsMTAgKzE0NzUsOCBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDI0MzBfbWNzcGkxX2h3bW9kID0gewogCS5uYW1lCQk9ICJtY3NwaTFfaHdtb2QiLAotCS5tcHVfaXJxcwk9IG9tYXAyNDMwX21jc3BpMV9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY3NwaTFfbXB1X2lycXMpLAotCS5zZG1hX3JlcXMJPSBvbWFwMjQzMF9tY3NwaTFfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY3NwaTFfc2RtYV9yZXFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9tY3NwaTFfbXB1X2lycXMsCisJLnNkbWFfcmVxcwk9IG9tYXAyX21jc3BpMV9zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gIm1jc3BpMV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMjEwMiwyMyArMTQ4OSwxMiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF9tY3NwaTFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY3NwaTFfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJm9tYXAyNDMwX21jc3BpX2NsYXNzLAotCS5kZXZfYXR0ciAgICAgICA9ICZvbWFwX21jc3BpMV9kZXZfYXR0ciwKKwkuY2xhc3MJCT0gJm9tYXAyeHh4X21jc3BpX2NsYXNzLAorCS5kZXZfYXR0cgk9ICZvbWFwX21jc3BpMV9kZXZfYXR0ciwKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBtY3NwaTIgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMjQzMF9tY3NwaTJfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA2NiB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAyNDMwX21jc3BpMl9zZG1hX3JlcXNbXSA9IHsKLQl7IC5uYW1lID0gInR4MCIsIC5kbWFfcmVxID0gNDMgfSwgLyogRE1BX1NQSTJfVFgwICovCi0JeyAubmFtZSA9ICJyeDAiLCAuZG1hX3JlcSA9IDQ0IH0sIC8qIERNQV9TUEkyX1JYMCAqLwotCXsgLm5hbWUgPSAidHgxIiwgLmRtYV9yZXEgPSA0NSB9LCAvKiBETUFfU1BJMl9UWDEgKi8KLQl7IC5uYW1lID0gInJ4MSIsIC5kbWFfcmVxID0gNDYgfSwgLyogRE1BX1NQSTJfUlgxICovCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwMjQzMF9tY3NwaTJfc2xhdmVzW10gPSB7CiAJJm9tYXAyNDMwX2w0X2NvcmVfX21jc3BpMiwKIH07CkBAIC0yMTI5LDEwICsxNTA1LDggQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAyNDMwX21jc3BpMl9od21vZCA9IHsKIAkubmFtZQkJPSAibWNzcGkyX2h3bW9kIiwKLQkubXB1X2lycXMJPSBvbWFwMjQzMF9tY3NwaTJfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNzcGkyX21wdV9pcnFzKSwKLQkuc2RtYV9yZXFzCT0gb21hcDI0MzBfbWNzcGkyX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNzcGkyX3NkbWFfcmVxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfbWNzcGkyX21wdV9pcnFzLAorCS5zZG1hX3JlcXMJPSBvbWFwMl9tY3NwaTJfc2RtYV9yZXFzLAogCS5tYWluX2Nsawk9ICJtY3NwaTJfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTIxNDUsMTQgKzE1MTksMTUgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfbWNzcGkyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNzcGkyX3NsYXZlcyksCi0JLmNsYXNzCQk9ICZvbWFwMjQzMF9tY3NwaV9jbGFzcywKLQkuZGV2X2F0dHIgICAgICAgPSAmb21hcF9tY3NwaTJfZGV2X2F0dHIsCisJLmNsYXNzCQk9ICZvbWFwMnh4eF9tY3NwaV9jbGFzcywKKwkuZGV2X2F0dHIJPSAmb21hcF9tY3NwaTJfZGV2X2F0dHIsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogbWNzcGkzICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MzBfbWNzcGkzX21wdV9pcnFzW10gPSB7CiAJeyAuaXJxID0gOTEgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDI0MzBfbWNzcGkzX3NkbWFfcmVxc1tdID0gewpAQCAtMjE2MCw2ICsxNTM1LDcgQEAKIAl7IC5uYW1lID0gInJ4MCIsIC5kbWFfcmVxID0gMTYgfSwgLyogRE1BX1NQSTNfUlgwICovCiAJeyAubmFtZSA9ICJ0eDEiLCAuZG1hX3JlcSA9IDIzIH0sIC8qIERNQV9TUEkzX1RYMSAqLwogCXsgLm5hbWUgPSAicngxIiwgLmRtYV9yZXEgPSAyNCB9LCAvKiBETUFfU1BJM19SWDEgKi8KKwl7IC5kbWFfcmVxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDI0MzBfbWNzcGkzX3NsYXZlc1tdID0gewpAQCAtMjE3Myw5ICsxNTQ5LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF9tY3NwaTNfaHdtb2QgPSB7CiAJLm5hbWUJCT0gIm1jc3BpM19od21vZCIsCiAJLm1wdV9pcnFzCT0gb21hcDI0MzBfbWNzcGkzX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jc3BpM19tcHVfaXJxcyksCiAJLnNkbWFfcmVxcwk9IG9tYXAyNDMwX21jc3BpM19zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jc3BpM19zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJtY3NwaTNfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTIxODgsOCArMTU2Miw4IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX21jc3BpM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jc3BpM19zbGF2ZXMpLAotCS5jbGFzcwkJPSAmb21hcDI0MzBfbWNzcGlfY2xhc3MsCi0JLmRldl9hdHRyICAgICAgID0gJm9tYXBfbWNzcGkzX2Rldl9hdHRyLAorCS5jbGFzcwkJPSAmb21hcDJ4eHhfbWNzcGlfY2xhc3MsCisJLmRldl9hdHRyCT0gJm9tYXBfbWNzcGkzX2Rldl9hdHRyLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKQEAgLTIyMTgsMTIgKzE1OTIsMTIgQEAKIAogCXsgLm5hbWUgPSAibWMiLCAuaXJxID0gOTIgfSwKIAl7IC5uYW1lID0gImRtYSIsIC5pcnEgPSA5MyB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwMjQzMF91c2Joc290Z19od21vZCA9IHsKIAkubmFtZQkJPSAidXNiX290Z19ocyIsCiAJLm1wdV9pcnFzCT0gb21hcDI0MzBfdXNiaHNvdGdfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdXNiaHNvdGdfbXB1X2lycXMpLAogCS5tYWluX2Nsawk9ICJ1c2Joc19pY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMjI3MywyMCArMTY0Nyw3IEBACiAJeyAubmFtZSA9ICJyeCIsCQkuaXJxID0gNjAgfSwKIAl7IC5uYW1lID0gIm92ciIsCS5pcnEgPSA2MSB9LAogCXsgLm5hbWUgPSAiY29tbW9uIiwJLmlycSA9IDY0IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDI0MzBfbWNic3AxX3NkbWFfY2hzW10gPSB7Ci0JeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gMzIgfSwKLQl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSAzMSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MzBfbWNic3AxX2FkZHJzW10gPSB7Ci0JewotCQkubmFtZQkJPSAibXB1IiwKLQkJLnBhX3N0YXJ0CT0gMHg0ODA3NDAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDc0MGZmLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiAvKiBsNF9jb3JlIC0+IG1jYnNwMSAqLwpAQCAtMjI5NCw4ICsxNjU1LDcgQEAKIAkubWFzdGVyCQk9ICZvbWFwMjQzMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MzBfbWNic3AxX2h3bW9kLAogCS5jbGsJCT0gIm1jYnNwMV9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX21jYnNwMV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwMV9hZGRycyksCisJLmFkZHIJCT0gb21hcDJfbWNic3AxX2FkZHJzLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yMzA4LDkgKzE2NjgsNyBAQAogCS5uYW1lCQk9ICJtY2JzcDEiLAogCS5jbGFzcwkJPSAmb21hcDI0MzBfbWNic3BfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDI0MzBfbWNic3AxX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNic3AxX2lycXMpLAotCS5zZG1hX3JlcXMJPSBvbWFwMjQzMF9tY2JzcDFfc2RtYV9jaHMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwMV9zZG1hX2NocyksCisJLnNkbWFfcmVxcwk9IG9tYXAyX21jYnNwMV9zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gIm1jYnNwMV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMjMzMSwyMCArMTY4OSw3IEBACiAJeyAubmFtZSA9ICJ0eCIsCQkuaXJxID0gNjIgfSwKIAl7IC5uYW1lID0gInJ4IiwJCS5pcnEgPSA2MyB9LAogCXsgLm5hbWUgPSAiY29tbW9uIiwJLmlycSA9IDE2IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDI0MzBfbWNic3AyX3NkbWFfY2hzW10gPSB7Ci0JeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gMzQgfSwKLQl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSAzMyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MzBfbWNic3AyX2FkZHJzW10gPSB7Ci0JewotCQkubmFtZQkJPSAibXB1IiwKLQkJLnBhX3N0YXJ0CT0gMHg0ODA3NjAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDc2MGZmLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiAvKiBsNF9jb3JlIC0+IG1jYnNwMiAqLwpAQCAtMjM1Miw4ICsxNjk3LDcgQEAKIAkubWFzdGVyCQk9ICZvbWFwMjQzMF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDI0MzBfbWNic3AyX2h3bW9kLAogCS5jbGsJCT0gIm1jYnNwMl9pY2siLAotCS5hZGRyCQk9IG9tYXAyNDMwX21jYnNwMl9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwMl9hZGRycyksCisJLmFkZHIJCT0gb21hcDJ4eHhfbWNic3AyX2FkZHJzLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yMzY2LDkgKzE3MTAsNyBAQAogCS5uYW1lCQk9ICJtY2JzcDIiLAogCS5jbGFzcwkJPSAmb21hcDI0MzBfbWNic3BfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDI0MzBfbWNic3AyX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNic3AyX2lycXMpLAotCS5zZG1hX3JlcXMJPSBvbWFwMjQzMF9tY2JzcDJfc2RtYV9jaHMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwMl9zZG1hX2NocyksCisJLnNkbWFfcmVxcwk9IG9tYXAyX21jYnNwMl9zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gIm1jYnNwMl9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMjM4OSwxMSArMTczMSw3IEBACiAJeyAubmFtZSA9ICJ0eCIsCQkuaXJxID0gODkgfSwKIAl7IC5uYW1lID0gInJ4IiwJCS5pcnEgPSA5MCB9LAogCXsgLm5hbWUgPSAiY29tbW9uIiwJLmlycSA9IDE3IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDI0MzBfbWNic3AzX3NkbWFfY2hzW10gPSB7Ci0JeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gMTggfSwKLQl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSAxNyB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDMwX21jYnNwM19hZGRyc1tdID0gewpAQCAtMjQwMyw2ICsxNzQxLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDhDMGZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X2NvcmUgLT4gbWNic3AzICovCkBAIC0yNDExLDcgKzE3NTAsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDI0MzBfbWNic3AzX2h3bW9kLAogCS5jbGsJCT0gIm1jYnNwM19pY2siLAogCS5hZGRyCQk9IG9tYXAyNDMwX21jYnNwM19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwM19hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTI0MjQsOSArMTc2Miw3IEBACiAJLm5hbWUJCT0gIm1jYnNwMyIsCiAJLmNsYXNzCQk9ICZvbWFwMjQzMF9tY2JzcF9od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwMjQzMF9tY2JzcDNfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY2JzcDNfaXJxcyksCi0JLnNkbWFfcmVxcwk9IG9tYXAyNDMwX21jYnNwM19zZG1hX2NocywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNic3AzX3NkbWFfY2hzKSwKKwkuc2RtYV9yZXFzCT0gb21hcDJfbWNic3AzX3NkbWFfcmVxcywKIAkubWFpbl9jbGsJPSAibWNic3AzX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0yNDQ3LDExICsxNzgzLDEzIEBACiAJeyAubmFtZSA9ICJ0eCIsCQkuaXJxID0gNTQgfSwKIAl7IC5uYW1lID0gInJ4IiwJCS5pcnEgPSA1NSB9LAogCXsgLm5hbWUgPSAiY29tbW9uIiwJLmlycSA9IDE4IH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAyNDMwX21jYnNwNF9zZG1hX2Noc1tdID0gewogCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDIwIH0sCiAJeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gMTkgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MzBfbWNic3A0X2FkZHJzW10gPSB7CkBAIC0yNDYxLDYgKzE3OTksNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwOEUwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfY29yZSAtPiBtY2JzcDQgKi8KQEAgLTI0NjksNyArMTgwOCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwMjQzMF9tY2JzcDRfaHdtb2QsCiAJLmNsawkJPSAibWNic3A0X2ljayIsCiAJLmFkZHIJCT0gb21hcDI0MzBfbWNic3A0X2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNic3A0X2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMjQ4Miw5ICsxODIwLDcgQEAKIAkubmFtZQkJPSAibWNic3A0IiwKIAkuY2xhc3MJCT0gJm9tYXAyNDMwX21jYnNwX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXAyNDMwX21jYnNwNF9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwNF9pcnFzKSwKIAkuc2RtYV9yZXFzCT0gb21hcDI0MzBfbWNic3A0X3NkbWFfY2hzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY2JzcDRfc2RtYV9jaHMpLAogCS5tYWluX2Nsawk9ICJtY2JzcDRfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTI1MDUsMTEgKzE4NDEsMTMgQEAKIAl7IC5uYW1lID0gInR4IiwJCS5pcnEgPSA4MSB9LAogCXsgLm5hbWUgPSAicngiLAkJLmlycSA9IDgyIH0sCiAJeyAubmFtZSA9ICJjb21tb24iLAkuaXJxID0gMTkgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDI0MzBfbWNic3A1X3NkbWFfY2hzW10gPSB7CiAJeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gMjIgfSwKIAl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSAyMSB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF9tY2JzcDVfYWRkcnNbXSA9IHsKQEAgLTI1MTksNiArMTg1Nyw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODA5NjBmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9jb3JlIC0+IG1jYnNwNSAqLwpAQCAtMjUyNyw3ICsxODY2LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAyNDMwX21jYnNwNV9od21vZCwKIAkuY2xrCQk9ICJtY2JzcDVfaWNrIiwKIAkuYWRkcgkJPSBvbWFwMjQzMF9tY2JzcDVfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY2JzcDVfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yNTQwLDkgKzE4NzgsNyBAQAogCS5uYW1lCQk9ICJtY2JzcDUiLAogCS5jbGFzcwkJPSAmb21hcDI0MzBfbWNic3BfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDI0MzBfbWNic3A1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNic3A1X2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwMjQzMF9tY2JzcDVfc2RtYV9jaHMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwNV9zZG1hX2NocyksCiAJLm1haW5fY2xrCT0gIm1jYnNwNV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMjU4MCwxMSArMTkxNiwxMyBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MzBfbW1jMV9tcHVfaXJxc1tdID0gewogCXsgLmlycSA9IDgzIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAyNDMwX21tYzFfc2RtYV9yZXFzW10gPSB7CiAJeyAubmFtZSA9ICJ0eCIsCS5kbWFfcmVxID0gNjEgfSwgLyogRE1BX01NQzFfVFggKi8KIAl7IC5uYW1lID0gInJ4IiwJLmRtYV9yZXEgPSA2MiB9LCAvKiBETUFfTU1DMV9SWCAqLworCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb3B0X2NsayBvbWFwMjQzMF9tbWMxX29wdF9jbGtzW10gPSB7CkBAIC0yNjAzLDkgKzE5NDEsNyBAQAogCS5uYW1lCQk9ICJtbWMxIiwKIAkuZmxhZ3MJCT0gSFdNT0RfQ09OVFJPTF9PUFRfQ0xLU19JTl9SRVNFVCwKIAkubXB1X2lycXMJPSBvbWFwMjQzMF9tbWMxX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21tYzFfbXB1X2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwMjQzMF9tbWMxX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbW1jMV9zZG1hX3JlcXMpLAogCS5vcHRfY2xrcwk9IG9tYXAyNDMwX21tYzFfb3B0X2Nsa3MsCiAJLm9wdF9jbGtzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbW1jMV9vcHRfY2xrcyksCiAJLm1haW5fY2xrCT0gIm1tY2hzMV9mY2siLApAQCAtMjYyOSwxMSArMTk2NSwxMyBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDI0MzBfbW1jMl9tcHVfaXJxc1tdID0gewogCXsgLmlycSA9IDg2IH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAyNDMwX21tYzJfc2RtYV9yZXFzW10gPSB7CiAJeyAubmFtZSA9ICJ0eCIsCS5kbWFfcmVxID0gNDcgfSwgLyogRE1BX01NQzJfVFggKi8KIAl7IC5uYW1lID0gInJ4IiwJLmRtYV9yZXEgPSA0OCB9LCAvKiBETUFfTU1DMl9SWCAqLworCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb3B0X2NsayBvbWFwMjQzMF9tbWMyX29wdF9jbGtzW10gPSB7CkBAIC0yNjQ4LDkgKzE5ODYsNyBAQAogCS5uYW1lCQk9ICJtbWMyIiwKIAkuZmxhZ3MJCT0gSFdNT0RfQ09OVFJPTF9PUFRfQ0xLU19JTl9SRVNFVCwKIAkubXB1X2lycXMJPSBvbWFwMjQzMF9tbWMyX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21tYzJfbXB1X2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwMjQzMF9tbWMyX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbW1jMl9zZG1hX3JlcXMpLAogCS5vcHRfY2xrcwk9IG9tYXAyNDMwX21tYzJfb3B0X2Nsa3MsCiAJLm9wdF9jbGtzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbW1jMl9vcHRfY2xrcyksCiAJLm1haW5fY2xrCT0gIm1tY2hzMl9mY2siLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzJ4eHhfM3h4eF9pbnRlcmNvbm5lY3RfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzJ4eHhfM3h4eF9pbnRlcmNvbm5lY3RfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjM3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMnh4eF8zeHh4X2ludGVyY29ubmVjdF9kYXRhLmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBvbWFwX2h3bW9kXzJ4eHhfM3h4eF9pbnRlcmNvbm5lY3RfZGF0YS5jIC0gY29tbW9uIGludGVyY29ubmVjdCBkYXRhLCBPTUFQMi8zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqIFBhdWwgV2FsbXNsZXkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFhYWCBoYW5kbGUgY3Jvc3NiYXIvc2hhcmVkIGxpbmsgZGlmZmVyZW5jZSBmb3IgTDM/CisgKiBYWFggdGhlc2Ugc2hvdWxkIGJlIG1hcmtlZCBpbml0ZGF0YSBmb3IgbXVsdGktT01BUCBrZXJuZWxzCisgKi8KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKworI2luY2x1ZGUgPHBsYXQvb21hcF9od21vZC5oPgorI2luY2x1ZGUgPHBsYXQvc2VyaWFsLmg+CisKKyNpbmNsdWRlICJvbWFwX2h3bW9kX2NvbW1vbl9kYXRhLmgiCisKK3N0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MzBfbW1jMV9hZGRyX3NwYWNlW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MDljMDAwLAorCQkucGFfZW5kCQk9IDB4NDgwOWMxZmYsCisJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCisJfSwKKwl7IH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDI0MzBfbW1jMl9hZGRyX3NwYWNlW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MGI0MDAwLAorCQkucGFfZW5kCQk9IDB4NDgwYjQxZmYsCisJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCisJfSwKKwl7IH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJfaTJjMV9hZGRyX3NwYWNlW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MDcwMDAwLAorCQkucGFfZW5kCQk9IDB4NDgwNzAwMDAgKyBTWl8xMjggLSAxLAorCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAorCX0sCisJeyB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyX2kyYzJfYWRkcl9zcGFjZVtdID0geworCXsKKwkJLnBhX3N0YXJ0CT0gMHg0ODA3MjAwMCwKKwkJLnBhX2VuZAkJPSAweDQ4MDcyMDAwICsgU1pfMTI4IC0gMSwKKwkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVCwKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMl9kc3NfYWRkcnNbXSA9IHsKKwl7CisJCS5wYV9zdGFydAk9IDB4NDgwNTAwMDAsCisJCS5wYV9lbmQJCT0gMHg0ODA1MDAwMCArIFNaXzFLIC0gMSwKKwkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAorCX0sCisJeyB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyX2Rzc19kaXNwY19hZGRyc1tdID0geworCXsKKwkJLnBhX3N0YXJ0CT0gMHg0ODA1MDQwMCwKKwkJLnBhX2VuZAkJPSAweDQ4MDUwNDAwICsgU1pfMUsgLSAxLAorCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCisJfSwKKwl7IH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJfZHNzX3JmYmlfYWRkcnNbXSA9IHsKKwl7CisJCS5wYV9zdGFydAk9IDB4NDgwNTA4MDAsCisJCS5wYV9lbmQJCT0gMHg0ODA1MDgwMCArIFNaXzFLIC0gMSwKKwkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAorCX0sCisJeyB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyX2Rzc192ZW5jX2FkZHJzW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MDUwQzAwLAorCQkucGFfZW5kCQk9IDB4NDgwNTBDMDAgKyBTWl8xSyAtIDEsCisJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMl90aW1lcjEwX2FkZHJzW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MDg2MDAwLAorCQkucGFfZW5kCQk9IDB4NDgwODYwMDAgKyBTWl8xSyAtIDEsCisJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMl90aW1lcjExX2FkZHJzW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MDg4MDAwLAorCQkucGFfZW5kCQk9IDB4NDgwODgwMDAgKyBTWl8xSyAtIDEsCisJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMnh4eF90aW1lcjEyX2FkZHJzW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MDhhMDAwLAorCQkucGFfZW5kCQk9IDB4NDgwOGEwMDAgKyBTWl8xSyAtIDEsCisJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMl9tY3NwaTFfYWRkcl9zcGFjZVtdID0geworCXsKKwkJLnBhX3N0YXJ0CT0gMHg0ODA5ODAwMCwKKwkJLnBhX2VuZAkJPSAweDQ4MDk4MDAwICsgU1pfMjU2IC0gMSwKKwkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVCwKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMl9tY3NwaTJfYWRkcl9zcGFjZVtdID0geworCXsKKwkJLnBhX3N0YXJ0CT0gMHg0ODA5YTAwMCwKKwkJLnBhX2VuZAkJPSAweDQ4MDlhMDAwICsgU1pfMjU2IC0gMSwKKwkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVCwKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF9tY3NwaTNfYWRkcl9zcGFjZVtdID0geworCXsKKwkJLnBhX3N0YXJ0CT0gMHg0ODBiODAwMCwKKwkJLnBhX2VuZAkJPSAweDQ4MGI4MDAwICsgU1pfMjU2IC0gMSwKKwkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVCwKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMl9kbWFfc3lzdGVtX2FkZHJzW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MDU2MDAwLAorCQkucGFfZW5kCQk9IDB4NDgwNTYwMDAgKyBTWl80SyAtIDEsCisJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMl9tYWlsYm94X2FkZHJzW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MDk0MDAwLAorCQkucGFfZW5kCQk9IDB4NDgwOTQwMDAgKyBTWl81MTIgLSAxLAorCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAorCX0sCisJeyB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyX21jYnNwMV9hZGRyc1tdID0geworCXsKKwkJLm5hbWUJCT0gIm1wdSIsCisJCS5wYV9zdGFydAk9IDB4NDgwNzQwMDAsCisJCS5wYV9lbmQJCT0gMHg0ODA3NDBmZiwKKwkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAorCX0sCisJeyB9Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzJ4eHhfM3h4eF9pcGJsb2NrX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8yeHh4XzN4eHhfaXBibG9ja19kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1MTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8yeHh4XzN4eHhfaXBibG9ja19kYXRhLmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBvbWFwX2h3bW9kXzJ4eHhfM3h4eF9pcGJsb2NrX2RhdGEuYyAtIGNvbW1vbiBJUCBibG9jayBkYXRhIGZvciBPTUFQMi8zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKiBQYXVsIFdhbG1zbGV5CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPHBsYXQvb21hcF9od21vZC5oPgorI2luY2x1ZGUgPHBsYXQvc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9kbWEuaD4KKworI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorCisjaW5jbHVkZSAib21hcF9od21vZF9jb21tb25fZGF0YS5oIgorCisvKiBVQVJUICovCisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzc19zeXNjb25maWcgb21hcDJfdWFydF9zeXNjID0geworCS5yZXZfb2Zmcwk9IDB4NTAsCisJLnN5c2Nfb2Zmcwk9IDB4NTQsCisJLnN5c3Nfb2Zmcwk9IDB4NTgsCisJLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfU0lETEVNT0RFIHwKKwkJCSAgIFNZU0NfSEFTX0VOQVdBS0VVUCB8IFNZU0NfSEFTX1NPRlRSRVNFVCB8CisJCQkgICBTWVNDX0hBU19BVVRPSURMRSB8IFNZU1NfSEFTX1JFU0VUX1NUQVRVUyksCisJLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQpLAorCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBvbWFwMl91YXJ0X2NsYXNzID0geworCS5uYW1lCT0gInVhcnQiLAorCS5zeXNjCT0gJm9tYXAyX3VhcnRfc3lzYywKK307CisKKy8qCisgKiAnZHNzJyBjbGFzcworICogZGlzcGxheSBzdWItc3lzdGVtCisgKi8KKworc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwMl9kc3Nfc3lzYyA9IHsKKwkucmV2X29mZnMJPSAweDAwMDAsCisJLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKKwkuc3lzc19vZmZzCT0gMHgwMDE0LAorCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX1NPRlRSRVNFVCB8IFNZU0NfSEFTX0FVVE9JRExFKSwKKwkuc3lzY19maWVsZHMJPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDJfZHNzX2h3bW9kX2NsYXNzID0geworCS5uYW1lCT0gImRzcyIsCisJLnN5c2MJPSAmb21hcDJfZHNzX3N5c2MsCit9OworCisvKgorICogJ2Rpc3BjJyBjbGFzcworICogZGlzcGxheSBjb250cm9sbGVyCisgKi8KKworc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwMl9kaXNwY19zeXNjID0geworCS5yZXZfb2Zmcwk9IDB4MDAwMCwKKwkuc3lzY19vZmZzCT0gMHgwMDEwLAorCS5zeXNzX29mZnMJPSAweDAwMTQsCisJLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfU0lETEVNT0RFIHwgU1lTQ19IQVNfTUlETEVNT0RFIHwKKwkJCSAgIFNZU0NfSEFTX1NPRlRSRVNFVCB8IFNZU0NfSEFTX0FVVE9JRExFKSwKKwkuaWRsZW1vZGVzCT0gKFNJRExFX0ZPUkNFIHwgU0lETEVfTk8gfCBTSURMRV9TTUFSVCB8CisJCQkgICBNU1RBTkRCWV9GT1JDRSB8IE1TVEFOREJZX05PIHwgTVNUQU5EQllfU01BUlQpLAorCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBvbWFwMl9kaXNwY19od21vZF9jbGFzcyA9IHsKKwkubmFtZQk9ICJkaXNwYyIsCisJLnN5c2MJPSAmb21hcDJfZGlzcGNfc3lzYywKK307CisKKy8qCisgKiAncmZiaScgY2xhc3MKKyAqIHJlbW90ZSBmcmFtZSBidWZmZXIgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwMl9yZmJpX3N5c2MgPSB7CisJLnJldl9vZmZzCT0gMHgwMDAwLAorCS5zeXNjX29mZnMJPSAweDAwMTAsCisJLnN5c3Nfb2Zmcwk9IDB4MDAxNCwKKwkuc3lzY19mbGFncwk9IChTWVNDX0hBU19TSURMRU1PREUgfCBTWVNDX0hBU19TT0ZUUkVTRVQgfAorCQkJICAgU1lTQ19IQVNfQVVUT0lETEUpLAorCS5pZGxlbW9kZXMJPSAoU0lETEVfRk9SQ0UgfCBTSURMRV9OTyB8IFNJRExFX1NNQVJUKSwKKwkuc3lzY19maWVsZHMJPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDJfcmZiaV9od21vZF9jbGFzcyA9IHsKKwkubmFtZQk9ICJyZmJpIiwKKwkuc3lzYwk9ICZvbWFwMl9yZmJpX3N5c2MsCit9OworCisvKgorICogJ3ZlbmMnIGNsYXNzCisgKiB2aWRlbyBlbmNvZGVyCisgKi8KKworc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDJfdmVuY19od21vZF9jbGFzcyA9IHsKKwkubmFtZSA9ICJ2ZW5jIiwKK307CisKKworLyogQ29tbW9uIERNQSByZXF1ZXN0IGxpbmUgZGF0YSAqLworc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDJfdWFydDFfc2RtYV9yZXFzW10gPSB7CisJeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gT01BUDI0WFhfRE1BX1VBUlQxX1JYLCB9LAorCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9VQVJUMV9UWCwgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDJfdWFydDJfc2RtYV9yZXFzW10gPSB7CisJeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gT01BUDI0WFhfRE1BX1VBUlQyX1JYLCB9LAorCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9VQVJUMl9UWCwgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDJfdWFydDNfc2RtYV9yZXFzW10gPSB7CisJeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gT01BUDI0WFhfRE1BX1VBUlQzX1JYLCB9LAorCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9VQVJUM19UWCwgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDJfaTJjMV9zZG1hX3JlcXNbXSA9IHsKKwl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfSTJDMV9UWCB9LAorCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9JMkMxX1JYIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAyX2kyYzJfc2RtYV9yZXFzW10gPSB7CisJeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gT01BUDI0WFhfRE1BX0kyQzJfVFggfSwKKwl7IC5uYW1lID0gInJ4IiwgLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfSTJDMl9SWCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwMl9tY3NwaTFfc2RtYV9yZXFzW10gPSB7CisJeyAubmFtZSA9ICJ0eDAiLCAuZG1hX3JlcSA9IDM1IH0sIC8qIERNQV9TUEkxX1RYMCAqLworCXsgLm5hbWUgPSAicngwIiwgLmRtYV9yZXEgPSAzNiB9LCAvKiBETUFfU1BJMV9SWDAgKi8KKwl7IC5uYW1lID0gInR4MSIsIC5kbWFfcmVxID0gMzcgfSwgLyogRE1BX1NQSTFfVFgxICovCisJeyAubmFtZSA9ICJyeDEiLCAuZG1hX3JlcSA9IDM4IH0sIC8qIERNQV9TUEkxX1JYMSAqLworCXsgLm5hbWUgPSAidHgyIiwgLmRtYV9yZXEgPSAzOSB9LCAvKiBETUFfU1BJMV9UWDIgKi8KKwl7IC5uYW1lID0gInJ4MiIsIC5kbWFfcmVxID0gNDAgfSwgLyogRE1BX1NQSTFfUlgyICovCisJeyAubmFtZSA9ICJ0eDMiLCAuZG1hX3JlcSA9IDQxIH0sIC8qIERNQV9TUEkxX1RYMyAqLworCXsgLm5hbWUgPSAicngzIiwgLmRtYV9yZXEgPSA0MiB9LCAvKiBETUFfU1BJMV9SWDMgKi8KKwl7IC5kbWFfcmVxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDJfbWNzcGkyX3NkbWFfcmVxc1tdID0geworCXsgLm5hbWUgPSAidHgwIiwgLmRtYV9yZXEgPSA0MyB9LCAvKiBETUFfU1BJMl9UWDAgKi8KKwl7IC5uYW1lID0gInJ4MCIsIC5kbWFfcmVxID0gNDQgfSwgLyogRE1BX1NQSTJfUlgwICovCisJeyAubmFtZSA9ICJ0eDEiLCAuZG1hX3JlcSA9IDQ1IH0sIC8qIERNQV9TUEkyX1RYMSAqLworCXsgLm5hbWUgPSAicngxIiwgLmRtYV9yZXEgPSA0NiB9LCAvKiBETUFfU1BJMl9SWDEgKi8KKwl7IC5kbWFfcmVxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDJfbWNic3AxX3NkbWFfcmVxc1tdID0geworCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDMyIH0sCisJeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gMzEgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDJfbWNic3AyX3NkbWFfcmVxc1tdID0geworCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDM0IH0sCisJeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gMzMgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDJfbWNic3AzX3NkbWFfcmVxc1tdID0geworCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDE4IH0sCisJeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gMTcgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQorfTsKKworLyogT3RoZXIgSVAgYmxvY2sgZGF0YSAqLworCisKKy8qCisgKiBvbWFwX2h3bW9kIGNsYXNzIGRhdGEKKyAqLworCitzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBsM19od21vZF9jbGFzcyA9IHsKKwkubmFtZSA9ICJsMyIKK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIGw0X2h3bW9kX2NsYXNzID0geworCS5uYW1lID0gImw0IgorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfY2xhc3MgbXB1X2h3bW9kX2NsYXNzID0geworCS5uYW1lID0gIm1wdSIKK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIGl2YV9od21vZF9jbGFzcyA9IHsKKwkubmFtZSA9ICJpdmEiCit9OworCisvKiBDb21tb24gTVBVIElSUSBsaW5lIGRhdGEgKi8KKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdGltZXIxX21wdV9pcnFzW10gPSB7CisJeyAuaXJxID0gMzcsIH0sCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdGltZXIyX21wdV9pcnFzW10gPSB7CisJeyAuaXJxID0gMzgsIH0sCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdGltZXIzX21wdV9pcnFzW10gPSB7CisJeyAuaXJxID0gMzksIH0sCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdGltZXI0X21wdV9pcnFzW10gPSB7CisJeyAuaXJxID0gNDAsIH0sCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdGltZXI1X21wdV9pcnFzW10gPSB7CisJeyAuaXJxID0gNDEsIH0sCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdGltZXI2X21wdV9pcnFzW10gPSB7CisJeyAuaXJxID0gNDIsIH0sCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdGltZXI3X21wdV9pcnFzW10gPSB7CisJeyAuaXJxID0gNDMsIH0sCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdGltZXI4X21wdV9pcnFzW10gPSB7CisJeyAuaXJxID0gNDQsIH0sCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdGltZXI5X21wdV9pcnFzW10gPSB7CisJeyAuaXJxID0gNDUsIH0sCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdGltZXIxMF9tcHVfaXJxc1tdID0geworCXsgLmlycSA9IDQ2LCB9LAorCXsgLmlycSA9IC0xIH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyX3RpbWVyMTFfbXB1X2lycXNbXSA9IHsKKwl7IC5pcnEgPSA0NywgfSwKKwl7IC5pcnEgPSAtMSB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl91YXJ0MV9tcHVfaXJxc1tdID0geworCXsgLmlycSA9IElOVF8yNFhYX1VBUlQxX0lSUSwgfSwKKwl7IC5pcnEgPSAtMSB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl91YXJ0Ml9tcHVfaXJxc1tdID0geworCXsgLmlycSA9IElOVF8yNFhYX1VBUlQyX0lSUSwgfSwKKwl7IC5pcnEgPSAtMSB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl91YXJ0M19tcHVfaXJxc1tdID0geworCXsgLmlycSA9IElOVF8yNFhYX1VBUlQzX0lSUSwgfSwKKwl7IC5pcnEgPSAtMSB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl9kaXNwY19pcnFzW10gPSB7CisJeyAuaXJxID0gMjUgfSwKKwl7IC5pcnEgPSAtMSB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl9pMmMxX21wdV9pcnFzW10gPSB7CisJeyAuaXJxID0gSU5UXzI0WFhfSTJDMV9JUlEsIH0sCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfaTJjMl9tcHVfaXJxc1tdID0geworCXsgLmlycSA9IElOVF8yNFhYX0kyQzJfSVJRLCB9LAorCXsgLmlycSA9IC0xIH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyX2dwaW8xX2lycXNbXSA9IHsKKwl7IC5pcnEgPSAyOSB9LCAvKiBJTlRfMjRYWF9HUElPX0JBTksxICovCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfZ3BpbzJfaXJxc1tdID0geworCXsgLmlycSA9IDMwIH0sIC8qIElOVF8yNFhYX0dQSU9fQkFOSzIgKi8KKwl7IC5pcnEgPSAtMSB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl9ncGlvM19pcnFzW10gPSB7CisJeyAuaXJxID0gMzEgfSwgLyogSU5UXzI0WFhfR1BJT19CQU5LMyAqLworCXsgLmlycSA9IC0xIH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyX2dwaW80X2lycXNbXSA9IHsKKwl7IC5pcnEgPSAzMiB9LCAvKiBJTlRfMjRYWF9HUElPX0JBTks0ICovCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfZG1hX3N5c3RlbV9pcnFzW10gPSB7CisJeyAubmFtZSA9ICIwIiwgLmlycSA9IDEyIH0sIC8qIElOVF8yNFhYX1NETUFfSVJRMCAqLworCXsgLm5hbWUgPSAiMSIsIC5pcnEgPSAxMyB9LCAvKiBJTlRfMjRYWF9TRE1BX0lSUTEgKi8KKwl7IC5uYW1lID0gIjIiLCAuaXJxID0gMTQgfSwgLyogSU5UXzI0WFhfU0RNQV9JUlEyICovCisJeyAubmFtZSA9ICIzIiwgLmlycSA9IDE1IH0sIC8qIElOVF8yNFhYX1NETUFfSVJRMyAqLworCXsgLmlycSA9IC0xIH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyX21jc3BpMV9tcHVfaXJxc1tdID0geworCXsgLmlycSA9IDY1IH0sCisJeyAuaXJxID0gLTEgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfbWNzcGkyX21wdV9pcnFzW10gPSB7CisJeyAuaXJxID0gNjYgfSwKKwl7IC5pcnEgPSAtMSB9Cit9OworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMnh4eF9pbnRlcmNvbm5lY3RfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzJ4eHhfaW50ZXJjb25uZWN0X2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjM1NDdjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzJ4eHhfaW50ZXJjb25uZWN0X2RhdGEuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIG9tYXBfaHdtb2RfMnh4eF9pbnRlcmNvbm5lY3RfZGF0YS5jIC0gY29tbW9uIGludGVyY29ubmVjdCBkYXRhIGZvciBPTUFQMnh4eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIE5va2lhIENvcnBvcmF0aW9uCisgKiBQYXVsIFdhbG1zbGV5CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBYWFggaGFuZGxlIGNyb3NzYmFyL3NoYXJlZCBsaW5rIGRpZmZlcmVuY2UgZm9yIEwzPworICogWFhYIHRoZXNlIHNob3VsZCBiZSBtYXJrZWQgaW5pdGRhdGEgZm9yIG11bHRpLU9NQVAga2VybmVscworICovCisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisKKyNpbmNsdWRlIDxwbGF0L29tYXBfaHdtb2QuaD4KKyNpbmNsdWRlIDxwbGF0L3NlcmlhbC5oPgorCisjaW5jbHVkZSAib21hcF9od21vZF9jb21tb25fZGF0YS5oIgorCitzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyeHh4X3VhcnQxX2FkZHJfc3BhY2VbXSA9IHsKKwl7CisJCS5wYV9zdGFydAk9IE9NQVAyX1VBUlQxX0JBU0UsCisJCS5wYV9lbmQJCT0gT01BUDJfVUFSVDFfQkFTRSArIFNaXzhLIC0gMSwKKwkJLmZsYWdzCQk9IEFERFJfTUFQX09OX0lOSVQgfCBBRERSX1RZUEVfUlQsCisJfSwKKwl7IH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJ4eHhfdWFydDJfYWRkcl9zcGFjZVtdID0geworCXsKKwkJLnBhX3N0YXJ0CT0gT01BUDJfVUFSVDJfQkFTRSwKKwkJLnBhX2VuZAkJPSBPTUFQMl9VQVJUMl9CQVNFICsgU1pfMUsgLSAxLAorCQkuZmxhZ3MJCT0gQUREUl9NQVBfT05fSU5JVCB8IEFERFJfVFlQRV9SVCwKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMnh4eF91YXJ0M19hZGRyX3NwYWNlW10gPSB7CisJeworCQkucGFfc3RhcnQJPSBPTUFQMl9VQVJUM19CQVNFLAorCQkucGFfZW5kCQk9IE9NQVAyX1VBUlQzX0JBU0UgKyBTWl8xSyAtIDEsCisJCS5mbGFncwkJPSBBRERSX01BUF9PTl9JTklUIHwgQUREUl9UWVBFX1JULAorCX0sCisJeyB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyeHh4X3RpbWVyMl9hZGRyc1tdID0geworCXsKKwkJLnBhX3N0YXJ0CT0gMHg0ODAyYTAwMCwKKwkJLnBhX2VuZAkJPSAweDQ4MDJhMDAwICsgU1pfMUsgLSAxLAorCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCisJfSwKKwl7IH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJ4eHhfdGltZXIzX2FkZHJzW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MDc4MDAwLAorCQkucGFfZW5kCQk9IDB4NDgwNzgwMDAgKyBTWl8xSyAtIDEsCisJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMnh4eF90aW1lcjRfYWRkcnNbXSA9IHsKKwl7CisJCS5wYV9zdGFydAk9IDB4NDgwN2EwMDAsCisJCS5wYV9lbmQJCT0gMHg0ODA3YTAwMCArIFNaXzFLIC0gMSwKKwkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAorCX0sCisJeyB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyeHh4X3RpbWVyNV9hZGRyc1tdID0geworCXsKKwkJLnBhX3N0YXJ0CT0gMHg0ODA3YzAwMCwKKwkJLnBhX2VuZAkJPSAweDQ4MDdjMDAwICsgU1pfMUsgLSAxLAorCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCisJfSwKKwl7IH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJ4eHhfdGltZXI2X2FkZHJzW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MDdlMDAwLAorCQkucGFfZW5kCQk9IDB4NDgwN2UwMDAgKyBTWl8xSyAtIDEsCisJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMnh4eF90aW1lcjdfYWRkcnNbXSA9IHsKKwl7CisJCS5wYV9zdGFydAk9IDB4NDgwODAwMDAsCisJCS5wYV9lbmQJCT0gMHg0ODA4MDAwMCArIFNaXzFLIC0gMSwKKwkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAorCX0sCisJeyB9Cit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyeHh4X3RpbWVyOF9hZGRyc1tdID0geworCXsKKwkJLnBhX3N0YXJ0CT0gMHg0ODA4MjAwMCwKKwkJLnBhX2VuZAkJPSAweDQ4MDgyMDAwICsgU1pfMUsgLSAxLAorCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCisJfSwKKwl7IH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJ4eHhfdGltZXI5X2FkZHJzW10gPSB7CisJeworCQkucGFfc3RhcnQJPSAweDQ4MDg0MDAwLAorCQkucGFfZW5kCQk9IDB4NDgwODQwMDAgKyBTWl8xSyAtIDEsCisJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKKwl9LAorCXsgfQorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMnh4eF9tY2JzcDJfYWRkcnNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJtcHUiLAorCQkucGFfc3RhcnQJPSAweDQ4MDc2MDAwLAorCQkucGFfZW5kCQk9IDB4NDgwNzYwZmYsCisJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKKwl9LAorCXsgfQorfTsKKworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMnh4eF9pcGJsb2NrX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8yeHh4X2lwYmxvY2tfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3N2RlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMnh4eF9pcGJsb2NrX2RhdGEuYwpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIG9tYXBfaHdtb2RfMnh4eF9pcGJsb2NrX2RhdGEuYyAtIGNvbW1vbiBJUCBibG9jayBkYXRhIGZvciBPTUFQMnh4eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICogUGF1bCBXYWxtc2xleQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxwbGF0L29tYXBfaHdtb2QuaD4KKyNpbmNsdWRlIDxwbGF0L3NlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvZG1hLmg+CisjaW5jbHVkZSA8cGxhdC9kbXRpbWVyLmg+CisjaW5jbHVkZSA8cGxhdC9tY3NwaS5oPgorCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKKyNpbmNsdWRlICJvbWFwX2h3bW9kX2NvbW1vbl9kYXRhLmgiCisjaW5jbHVkZSAid2RfdGltZXIuaCIKKworc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJ4eHhfdGltZXIxMl9tcHVfaXJxc1tdID0geworCXsgLmlycSA9IDQ4LCB9LAorCXsgLmlycSA9IC0xIH0KK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAyeHh4X2Rzc19zZG1hX2Noc1tdID0geworCXsgLm5hbWUgPSAiZGlzcGMiLCAuZG1hX3JlcSA9IDUgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQorfTsKKy8qIE9NQVAyeHh4IFRpbWVyIENvbW1vbiAqLworc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwMnh4eF90aW1lcl9zeXNjID0geworCS5yZXZfb2Zmcwk9IDB4MDAwMCwKKwkuc3lzY19vZmZzCT0gMHgwMDEwLAorCS5zeXNzX29mZnMJPSAweDAwMTQsCisJLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfU0lETEVNT0RFIHwgU1lTQ19IQVNfQ0xPQ0tBQ1RJVklUWSB8CisJCQkgICBTWVNDX0hBU19FTkFXQUtFVVAgfCBTWVNDX0hBU19TT0ZUUkVTRVQgfAorCQkJICAgU1lTQ19IQVNfQVVUT0lETEUpLAorCS5pZGxlbW9kZXMJPSAoU0lETEVfRk9SQ0UgfCBTSURMRV9OTyB8IFNJRExFX1NNQVJUKSwKKwkuc3lzY19maWVsZHMJPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MgPSB7CisJLm5hbWUJPSAidGltZXIiLAorCS5zeXNjCT0gJm9tYXAyeHh4X3RpbWVyX3N5c2MsCisJLnJldgk9IE9NQVBfVElNRVJfSVBfVkVSU0lPTl8xLAorfTsKKworLyoKKyAqICd3ZF90aW1lcicgY2xhc3MKKyAqIDMyLWJpdCB3YXRjaGRvZyB1cHdhcmQgY291bnRlciB0aGF0IGdlbmVyYXRlcyBhIHB1bHNlIG9uIHRoZSByZXNldCBwaW4gb24KKyAqIG92ZXJmbG93IGNvbmRpdGlvbgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzc19zeXNjb25maWcgb21hcDJ4eHhfd2RfdGltZXJfc3lzYyA9IHsKKwkucmV2X29mZnMJPSAweDAwMDAsCisJLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKKwkuc3lzc19vZmZzCT0gMHgwMDE0LAorCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX0VNVUZSRUUgfCBTWVNDX0hBU19TT0ZUUkVTRVQgfAorCQkJICAgU1lTQ19IQVNfQVVUT0lETEUgfCBTWVNTX0hBU19SRVNFVF9TVEFUVVMpLAorCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBvbWFwMnh4eF93ZF90aW1lcl9od21vZF9jbGFzcyA9IHsKKwkubmFtZQkJPSAid2RfdGltZXIiLAorCS5zeXNjCQk9ICZvbWFwMnh4eF93ZF90aW1lcl9zeXNjLAorCS5wcmVfc2h1dGRvd24JPSAmb21hcDJfd2RfdGltZXJfZGlzYWJsZQorfTsKKworLyoKKyAqICdncGlvJyBjbGFzcworICogZ2VuZXJhbCBwdXJwb3NlIGlvIG1vZHVsZQorICovCitzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAyeHh4X2dwaW9fc3lzYyA9IHsKKwkucmV2X29mZnMJPSAweDAwMDAsCisJLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKKwkuc3lzc19vZmZzCT0gMHgwMDE0LAorCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX0VOQVdBS0VVUCB8IFNZU0NfSEFTX1NJRExFTU9ERSB8CisJCQkgICBTWVNDX0hBU19TT0ZUUkVTRVQgfCBTWVNDX0hBU19BVVRPSURMRSB8CisJCQkgICBTWVNTX0hBU19SRVNFVF9TVEFUVVMpLAorCS5pZGxlbW9kZXMJPSAoU0lETEVfRk9SQ0UgfCBTSURMRV9OTyB8IFNJRExFX1NNQVJUKSwKKwkuc3lzY19maWVsZHMJPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDJ4eHhfZ3Bpb19od21vZF9jbGFzcyA9IHsKKwkubmFtZSA9ICJncGlvIiwKKwkuc3lzYyA9ICZvbWFwMnh4eF9ncGlvX3N5c2MsCisJLnJldiA9IDAsCit9OworCisvKiBzeXN0ZW0gZG1hICovCitzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAyeHh4X2RtYV9zeXNjID0geworCS5yZXZfb2Zmcwk9IDB4MDAwMCwKKwkuc3lzY19vZmZzCT0gMHgwMDJjLAorCS5zeXNzX29mZnMJPSAweDAwMjgsCisJLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfU09GVFJFU0VUIHwgU1lTQ19IQVNfTUlETEVNT0RFIHwKKwkJCSAgIFNZU0NfSEFTX0NMT0NLQUNUSVZJVFkgfCBTWVNDX0hBU19FTVVGUkVFIHwKKwkJCSAgIFNZU0NfSEFTX0FVVE9JRExFIHwgU1lTU19IQVNfUkVTRVRfU1RBVFVTKSwKKwkuaWRsZW1vZGVzCT0gKE1TVEFOREJZX0ZPUkNFIHwgTVNUQU5EQllfTk8gfCBNU1RBTkRCWV9TTUFSVCksCisJLnN5c2NfZmllbGRzCT0gJm9tYXBfaHdtb2Rfc3lzY190eXBlMSwKK307CisKK3N0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyeHh4X2RtYV9od21vZF9jbGFzcyA9IHsKKwkubmFtZQk9ICJkbWEiLAorCS5zeXNjCT0gJm9tYXAyeHh4X2RtYV9zeXNjLAorfTsKKworLyoKKyAqICdtYWlsYm94JyBjbGFzcworICogbWFpbGJveCBtb2R1bGUgYWxsb3dpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBvbi1jaGlwIHByb2Nlc3NvcnMKKyAqIHVzaW5nIGEgcXVldWVkIG1haWxib3gtaW50ZXJydXB0IG1lY2hhbmlzbS4KKyAqLworCitzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAyeHh4X21haWxib3hfc3lzYyA9IHsKKwkucmV2X29mZnMJPSAweDAwMCwKKwkuc3lzY19vZmZzCT0gMHgwMTAsCisJLnN5c3Nfb2Zmcwk9IDB4MDE0LAorCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX0NMT0NLQUNUSVZJVFkgfCBTWVNDX0hBU19TSURMRU1PREUgfAorCQkJICAgU1lTQ19IQVNfU09GVFJFU0VUIHwgU1lTQ19IQVNfQVVUT0lETEUpLAorCS5pZGxlbW9kZXMJPSAoU0lETEVfRk9SQ0UgfCBTSURMRV9OTyB8IFNJRExFX1NNQVJUKSwKKwkuc3lzY19maWVsZHMJPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAorfTsKKworc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDJ4eHhfbWFpbGJveF9od21vZF9jbGFzcyA9IHsKKwkubmFtZQk9ICJtYWlsYm94IiwKKwkuc3lzYwk9ICZvbWFwMnh4eF9tYWlsYm94X3N5c2MsCit9OworCisvKgorICogJ21jc3BpJyBjbGFzcworICogbXVsdGljaGFubmVsIHNlcmlhbCBwb3J0IGludGVyZmFjZSAobWNzcGkpIC8gbWFzdGVyL3NsYXZlIHN5bmNocm9ub3VzIHNlcmlhbAorICogYnVzCisgKi8KKworc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwMnh4eF9tY3NwaV9zeXNjID0geworCS5yZXZfb2Zmcwk9IDB4MDAwMCwKKwkuc3lzY19vZmZzCT0gMHgwMDEwLAorCS5zeXNzX29mZnMJPSAweDAwMTQsCisJLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfQ0xPQ0tBQ1RJVklUWSB8IFNZU0NfSEFTX1NJRExFTU9ERSB8CisJCQkJU1lTQ19IQVNfRU5BV0FLRVVQIHwgU1lTQ19IQVNfU09GVFJFU0VUIHwKKwkJCQlTWVNDX0hBU19BVVRPSURMRSB8IFNZU1NfSEFTX1JFU0VUX1NUQVRVUyksCisJLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQpLAorCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCit9OworCitzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBvbWFwMnh4eF9tY3NwaV9jbGFzcyA9IHsKKwkubmFtZQk9ICJtY3NwaSIsCisJLnN5c2MJPSAmb21hcDJ4eHhfbWNzcGlfc3lzYywKKwkucmV2CT0gT01BUDJfTUNTUElfUkVWLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYwppbmRleCA5MDlhODRkLi4xYTUyNzE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfM3h4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzN4eHhfZGF0YS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIG9tYXBfaHdtb2RfM3h4eF9kYXRhLmMgLSBoYXJkd2FyZSBtb2R1bGVzIHByZXNlbnQgb24gdGhlIE9NQVAzeHh4IGNoaXBzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIE5va2lhIENvcnBvcmF0aW9uCiAgKiBQYXVsIFdhbG1zbGV5CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTEwMyw2ICsxMDMsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAzeHh4X2wzX21haW5faXJxc1tdID0gewogCXsgLmlycSA9IElOVF8zNFhYX0wzX0RCR19JUlEgfSwKIAl7IC5pcnEgPSBJTlRfMzRYWF9MM19BUFBfSVJRIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDN4eHhfbDNfbWFpbl9hZGRyc1tdID0gewpAQCAtMTExLDYgKzExMiw3IEBACiAJCS5wYV9lbmQgICAgICAgICA9IDB4NjgwMGZmZmYsCiAJCS5mbGFncyAgICAgICAgICA9IEFERFJfVFlQRV9SVCwKIAl9LAorCXsgfQogfTsKIAogLyogTVBVIC0+IEwzIGludGVyZmFjZSAqLwpAQCAtMTE4LDcgKzEyMCw2IEBACiAJLm1hc3RlciAgID0gJm9tYXAzeHh4X21wdV9od21vZCwKIAkuc2xhdmUgICAgPSAmb21hcDN4eHhfbDNfbWFpbl9od21vZCwKIAkuYWRkciAgICAgPSBvbWFwM3h4eF9sM19tYWluX2FkZHJzLAotCS5hZGRyX2NudCA9IEFSUkFZX1NJWkUob21hcDN4eHhfbDNfbWFpbl9hZGRycyksCiAJLnVzZXIJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC0xNTAsOCArMTUxLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF9sM19tYWluX2h3bW9kID0gewogCS5uYW1lCQk9ICJsM19tYWluIiwKIAkuY2xhc3MJCT0gJmwzX2h3bW9kX2NsYXNzLAotCS5tcHVfaXJxcyAgICAgICA9IG9tYXAzeHh4X2wzX21haW5faXJxcywKLQkubXB1X2lycXNfY250ICAgPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2wzX21haW5faXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDN4eHhfbDNfbWFpbl9pcnFzLAogCS5tYXN0ZXJzCT0gb21hcDN4eHhfbDNfbWFpbl9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbDNfbWFpbl9tYXN0ZXJzKSwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X2wzX21haW5fc2xhdmVzLApAQCAtMTkwLDM5ICsxOTAsMjEgQEAKIH07CiAKIC8qIEw0IENPUkUgLT4gTU1DMSBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X21tYzFfYWRkcl9zcGFjZVtdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA5YzAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDljMWZmLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAzeHh4X2w0X2NvcmVfX21tYzEgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDN4eHhfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAzeHh4X21tYzFfaHdtb2QsCiAJLmNsawkJPSAibW1jaHMxX2ljayIsCi0JLmFkZHIJCT0gb21hcDN4eHhfbW1jMV9hZGRyX3NwYWNlLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbW1jMV9hZGRyX3NwYWNlKSwKKwkuYWRkcgkJPSBvbWFwMjQzMF9tbWMxX2FkZHJfc3BhY2UsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIAkuZmxhZ3MJCT0gT01BUF9GSVJFV0FMTF9MNAogfTsKIAogLyogTDQgQ09SRSAtPiBNTUMyIGludGVyZmFjZSAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDN4eHhfbW1jMl9hZGRyX3NwYWNlW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MGI0MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwYjQxZmYsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDN4eHhfbDRfY29yZV9fbW1jMiA9IHsKIAkubWFzdGVyCQk9ICZvbWFwM3h4eF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfbW1jMl9od21vZCwKIAkuY2xrCQk9ICJtbWNoczJfaWNrIiwKLQkuYWRkcgkJPSBvbWFwM3h4eF9tbWMyX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tbWMyX2FkZHJfc3BhY2UpLAorCS5hZGRyCQk9IG9tYXAyNDMwX21tYzJfYWRkcl9zcGFjZSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogCS5mbGFncwkJPSBPTUFQX0ZJUkVXQUxMX0w0CiB9OwpAQCAtMjM0LDYgKzIxNiw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODBhZDFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVCwKIAl9LAorCXsgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwM3h4eF9sNF9jb3JlX19tbWMzID0gewpAQCAtMjQxLDcgKzIyNCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF9tbWMzX2h3bW9kLAogCS5jbGsJCT0gIm1tY2hzM19pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X21tYzNfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21tYzNfYWRkcl9zcGFjZSksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIAkuZmxhZ3MJCT0gT01BUF9GSVJFV0FMTF9MNAogfTsKQEAgLTI1Myw2ICsyMzUsNyBAQAogCQkucGFfZW5kCQk9IE9NQVAzX1VBUlQxX0JBU0UgKyBTWl84SyAtIDEsCiAJCS5mbGFncwkJPSBBRERSX01BUF9PTl9JTklUIHwgQUREUl9UWVBFX1JULAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAzX2w0X2NvcmVfX3VhcnQxID0gewpAQCAtMjYwLDcgKzI0Myw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF91YXJ0MV9od21vZCwKIAkuY2xrCQk9ICJ1YXJ0MV9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3VhcnQxX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF91YXJ0MV9hZGRyX3NwYWNlKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMjcxLDYgKzI1Myw3IEBACiAJCS5wYV9lbmQJCT0gT01BUDNfVUFSVDJfQkFTRSArIFNaXzFLIC0gMSwKIAkJLmZsYWdzCQk9IEFERFJfTUFQX09OX0lOSVQgfCBBRERSX1RZUEVfUlQsCiAJfSwKKwl7IH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDNfbDRfY29yZV9fdWFydDIgPSB7CkBAIC0yNzgsNyArMjYxLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAzeHh4X3VhcnQyX2h3bW9kLAogCS5jbGsJCT0gInVhcnQyX2ljayIsCiAJLmFkZHIJCT0gb21hcDN4eHhfdWFydDJfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3VhcnQyX2FkZHJfc3BhY2UpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yODksNiArMjcxLDcgQEAKIAkJLnBhX2VuZAkJPSBPTUFQM19VQVJUM19CQVNFICsgU1pfMUsgLSAxLAogCQkuZmxhZ3MJCT0gQUREUl9NQVBfT05fSU5JVCB8IEFERFJfVFlQRV9SVCwKIAl9LAorCXsgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwM19sNF9wZXJfX3VhcnQzID0gewpAQCAtMjk2LDcgKzI3OSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF91YXJ0M19od21vZCwKIAkuY2xrCQk9ICJ1YXJ0M19pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3VhcnQzX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF91YXJ0M19hZGRyX3NwYWNlKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMzA3LDYgKzI4OSw3IEBACiAJCS5wYV9lbmQJCT0gT01BUDNfVUFSVDRfQkFTRSArIFNaXzFLIC0gMSwKIAkJLmZsYWdzCQk9IEFERFJfTUFQX09OX0lOSVQgfCBBRERSX1RZUEVfUlQsCiAJfSwKKwl7IH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDNfbDRfcGVyX191YXJ0NCA9IHsKQEAgLTMxNCwyOCArMjk3LDE1IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF91YXJ0NF9od21vZCwKIAkuY2xrCQk9ICJ1YXJ0NF9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3VhcnQ0X2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF91YXJ0NF9hZGRyX3NwYWNlKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIAotLyogSTJDIElQIGJsb2NrIGFkZHJlc3Mgc3BhY2UgbGVuZ3RoIChpbiBieXRlcykgKi8KLSNkZWZpbmUgT01BUDJfSTJDX0FTX0xFTgkJMTI4Ci0KIC8qIEw0IENPUkUgLT4gSTJDMSBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X2kyYzFfYWRkcl9zcGFjZVtdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA3MDAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDcwMDAwICsgT01BUDJfSTJDX0FTX0xFTiAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDNfbDRfY29yZV9faTJjMSA9IHsKIAkubWFzdGVyCQk9ICZvbWFwM3h4eF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfaTJjMV9od21vZCwKIAkuY2xrCQk9ICJpMmMxX2ljayIsCi0JLmFkZHIJCT0gb21hcDN4eHhfaTJjMV9hZGRyX3NwYWNlLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfaTJjMV9hZGRyX3NwYWNlKSwKKwkuYWRkcgkJPSBvbWFwMl9pMmMxX2FkZHJfc3BhY2UsCiAJLmZ3ID0gewogCQkub21hcDIgPSB7CiAJCQkubDRfZndfcmVnaW9uICA9IE9NQVAzX0w0X0NPUkVfRldfSTJDMV9SRUdJT04sCkBAIC0zNDcsMjAgKzMxNywxMSBAQAogfTsKIAogLyogTDQgQ09SRSAtPiBJMkMyIGludGVyZmFjZSAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDN4eHhfaTJjMl9hZGRyX3NwYWNlW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDcyMDAwLAotCQkucGFfZW5kCQk9IDB4NDgwNzIwMDAgKyBPTUFQMl9JMkNfQVNfTEVOIC0gMSwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVCwKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwM19sNF9jb3JlX19pMmMyID0gewogCS5tYXN0ZXIJCT0gJm9tYXAzeHh4X2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwM3h4eF9pMmMyX2h3bW9kLAogCS5jbGsJCT0gImkyYzJfaWNrIiwKLQkuYWRkcgkJPSBvbWFwM3h4eF9pMmMyX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9pMmMyX2FkZHJfc3BhY2UpLAorCS5hZGRyCQk9IG9tYXAyX2kyYzJfYWRkcl9zcGFjZSwKIAkuZncgPSB7CiAJCS5vbWFwMiA9IHsKIAkJCS5sNF9md19yZWdpb24gID0gT01BUDNfTDRfQ09SRV9GV19JMkMyX1JFR0lPTiwKQEAgLTM3NSw5ICszMzYsMTAgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X2kyYzNfYWRkcl9zcGFjZVtdID0gewogCXsKIAkJLnBhX3N0YXJ0CT0gMHg0ODA2MDAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDYwMDAwICsgT01BUDJfSTJDX0FTX0xFTiAtIDEsCisJCS5wYV9lbmQJCT0gMHg0ODA2MDAwMCArIFNaXzEyOCAtIDEsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCiAJfSwKKwl7IH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDNfbDRfY29yZV9faTJjMyA9IHsKQEAgLTM4NSw3ICszNDcsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfaTJjM19od21vZCwKIAkuY2xrCQk9ICJpMmMzX2ljayIsCiAJLmFkZHIJCT0gb21hcDN4eHhfaTJjM19hZGRyX3NwYWNlLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfaTJjM19hZGRyX3NwYWNlKSwKIAkuZncgPSB7CiAJCS5vbWFwMiA9IHsKIAkJCS5sNF9md19yZWdpb24gID0gT01BUDNfTDRfQ09SRV9GV19JMkMzX1JFR0lPTiwKQEAgLTQwMyw2ICszNjQsNyBAQAogCQkucGFfZW5kCQk9IE9NQVAzNFhYX1NSMV9CQVNFICsgU1pfMUsgLSAxLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAzX2w0X2NvcmVfX3NyMSA9IHsKQEAgLTQxMCw3ICszNzIsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDM0eHhfc3IxX2h3bW9kLAogCS5jbGsJCT0gInNyX2w0X2ljayIsCiAJLmFkZHIJCT0gb21hcDNfc3IxX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM19zcjFfYWRkcl9zcGFjZSksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVLAogfTsKIApAQCAtNDIxLDYgKzM4Miw3IEBACiAJCS5wYV9lbmQJCT0gT01BUDM0WFhfU1IyX0JBU0UgKyBTWl8xSyAtIDEsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCiAJfSwKKwl7IH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDNfbDRfY29yZV9fc3IyID0gewpAQCAtNDI4LDcgKzM5MCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwMzR4eF9zcjJfaHdtb2QsCiAJLmNsawkJPSAic3JfbDRfaWNrIiwKIAkuYWRkcgkJPSBvbWFwM19zcjJfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzX3NyMl9hZGRyX3NwYWNlKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC00NDIsNiArNDAzLDcgQEAKIAkJLnBhX2VuZAkJPSBPTUFQMzRYWF9IU1VTQl9PVEdfQkFTRSArIFNaXzRLIC0gMSwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9jb3JlIC0+IHVzYmhzb3RnICAqLwpAQCAtNDUwLDcgKzQxMiw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF91c2Joc290Z19od21vZCwKIAkuY2xrCQk9ICJsNF9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3VzYmhzb3RnX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdXNiaHNvdGdfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKQEAgLTQ2OCw2ICs0MjksNyBAQAogCQkucGFfZW5kCQk9IEFNMzVYWF9JUFNTX1VTQk9UR1NTX0JBU0UgKyBTWl80SyAtIDEsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfY29yZSAtPiB1c2Joc290ZyAgKi8KQEAgLTQ3Niw3ICs0MzgsNiBAQAogCS5zbGF2ZQkJPSAmYW0zNXh4X3VzYmhzb3RnX2h3bW9kLAogCS5jbGsJCT0gImw0X2ljayIsCiAJLmFkZHIJCT0gYW0zNXh4X3VzYmhzb3RnX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUoYW0zNXh4X3VzYmhzb3RnX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC02MTEsOSArNTcyLDYgQEAKIAogLyogdGltZXIxICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXIxX2h3bW9kOwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAzeHh4X3RpbWVyMV9tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IDM3LCB9LAotfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDN4eHhfdGltZXIxX2FkZHJzW10gPSB7CiAJewpAQCAtNjIxLDYgKzU3OSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODMxODAwMCArIFNaXzFLIC0gMSwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF93a3VwIC0+IHRpbWVyMSAqLwpAQCAtNjI5LDcgKzU4OCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF90aW1lcjFfaHdtb2QsCiAJLmNsawkJPSAiZ3B0MV9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3RpbWVyMV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyMV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTY0MSw4ICs1OTksNyBAQAogLyogdGltZXIxIGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXIxX2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjEiLAotCS5tcHVfaXJxcwk9IG9tYXAzeHh4X3RpbWVyMV9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjFfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyMV9tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0MV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtNjYxLDkgKzYxOCw2IEBACiAKIC8qIHRpbWVyMiAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X3RpbWVyMl9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF90aW1lcjJfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSAzOCwgfSwKLX07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X3RpbWVyMl9hZGRyc1tdID0gewogCXsKQEAgLTY3MSw2ICs2MjUsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwMzIwMDAgKyBTWl8xSyAtIDEsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IHRpbWVyMiAqLwpAQCAtNjc5LDcgKzYzNCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF90aW1lcjJfaHdtb2QsCiAJLmNsawkJPSAiZ3B0Ml9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3RpbWVyMl9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyMl9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTY5MSw4ICs2NDUsNyBAQAogLyogdGltZXIyIGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXIyX2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjIiLAotCS5tcHVfaXJxcwk9IG9tYXAzeHh4X3RpbWVyMl9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjJfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyMl9tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0Ml9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtNzExLDkgKzY2NCw2IEBACiAKIC8qIHRpbWVyMyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X3RpbWVyM19od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF90aW1lcjNfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSAzOSwgfSwKLX07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X3RpbWVyM19hZGRyc1tdID0gewogCXsKQEAgLTcyMSw2ICs2NzEsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwMzQwMDAgKyBTWl8xSyAtIDEsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IHRpbWVyMyAqLwpAQCAtNzI5LDcgKzY4MCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF90aW1lcjNfaHdtb2QsCiAJLmNsawkJPSAiZ3B0M19pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3RpbWVyM19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyM19hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTc0MSw4ICs2OTEsNyBAQAogLyogdGltZXIzIGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXIzX2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjMiLAotCS5tcHVfaXJxcwk9IG9tYXAzeHh4X3RpbWVyM19tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjNfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyM19tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0M19mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtNzYxLDkgKzcxMCw2IEBACiAKIC8qIHRpbWVyNCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X3RpbWVyNF9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF90aW1lcjRfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0MCwgfSwKLX07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X3RpbWVyNF9hZGRyc1tdID0gewogCXsKQEAgLTc3MSw2ICs3MTcsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwMzYwMDAgKyBTWl8xSyAtIDEsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IHRpbWVyNCAqLwpAQCAtNzc5LDcgKzcyNiw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF90aW1lcjRfaHdtb2QsCiAJLmNsawkJPSAiZ3B0NF9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3RpbWVyNF9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyNF9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTc5MSw4ICs3MzcsNyBAQAogLyogdGltZXI0IGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXI0X2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjQiLAotCS5tcHVfaXJxcwk9IG9tYXAzeHh4X3RpbWVyNF9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjRfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyNF9tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0NF9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtODExLDkgKzc1Niw2IEBACiAKIC8qIHRpbWVyNSAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X3RpbWVyNV9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF90aW1lcjVfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0MSwgfSwKLX07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X3RpbWVyNV9hZGRyc1tdID0gewogCXsKQEAgLTgyMSw2ICs3NjMsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwMzgwMDAgKyBTWl8xSyAtIDEsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IHRpbWVyNSAqLwpAQCAtODI5LDcgKzc3Miw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF90aW1lcjVfaHdtb2QsCiAJLmNsawkJPSAiZ3B0NV9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3RpbWVyNV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyNV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTg0MSw4ICs3ODMsNyBAQAogLyogdGltZXI1IGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXI1X2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjUiLAotCS5tcHVfaXJxcwk9IG9tYXAzeHh4X3RpbWVyNV9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjVfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyNV9tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0NV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtODYxLDkgKzgwMiw2IEBACiAKIC8qIHRpbWVyNiAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X3RpbWVyNl9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF90aW1lcjZfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0MiwgfSwKLX07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X3RpbWVyNl9hZGRyc1tdID0gewogCXsKQEAgLTg3MSw2ICs4MDksNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwM0EwMDAgKyBTWl8xSyAtIDEsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IHRpbWVyNiAqLwpAQCAtODc5LDcgKzgxOCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF90aW1lcjZfaHdtb2QsCiAJLmNsawkJPSAiZ3B0Nl9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3RpbWVyNl9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyNl9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTg5MSw4ICs4MjksNyBAQAogLyogdGltZXI2IGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXI2X2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjYiLAotCS5tcHVfaXJxcwk9IG9tYXAzeHh4X3RpbWVyNl9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjZfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyNl9tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0Nl9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtOTExLDkgKzg0OCw2IEBACiAKIC8qIHRpbWVyNyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X3RpbWVyN19od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF90aW1lcjdfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0MywgfSwKLX07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X3RpbWVyN19hZGRyc1tdID0gewogCXsKQEAgLTkyMSw2ICs4NTUsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwM0MwMDAgKyBTWl8xSyAtIDEsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IHRpbWVyNyAqLwpAQCAtOTI5LDcgKzg2NCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF90aW1lcjdfaHdtb2QsCiAJLmNsawkJPSAiZ3B0N19pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3RpbWVyN19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyN19hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTk0MSw4ICs4NzUsNyBAQAogLyogdGltZXI3IGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXI3X2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjciLAotCS5tcHVfaXJxcwk9IG9tYXAzeHh4X3RpbWVyN19tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjdfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyN19tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0N19mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtOTYxLDkgKzg5NCw2IEBACiAKIC8qIHRpbWVyOCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X3RpbWVyOF9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF90aW1lcjhfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0NCwgfSwKLX07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X3RpbWVyOF9hZGRyc1tdID0gewogCXsKQEAgLTk3MSw2ICs5MDEsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwM0UwMDAgKyBTWl8xSyAtIDEsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IHRpbWVyOCAqLwpAQCAtOTc5LDcgKzkxMCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF90aW1lcjhfaHdtb2QsCiAJLmNsawkJPSAiZ3B0OF9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3RpbWVyOF9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyOF9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTk5MSw4ICs5MjEsNyBAQAogLyogdGltZXI4IGh3bW9kICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXI4X2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjgiLAotCS5tcHVfaXJxcwk9IG9tYXAzeHh4X3RpbWVyOF9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjhfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyOF9tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0OF9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTAxMSw5ICs5NDAsNiBAQAogCiAvKiB0aW1lcjkgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF90aW1lcjlfaHdtb2Q7Ci1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDN4eHhfdGltZXI5X21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gNDUsIH0sCi19OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwM3h4eF90aW1lcjlfYWRkcnNbXSA9IHsKIAl7CkBAIC0xMDIxLDYgKzk0Nyw3IEBACiAJCS5wYV9lbmQJCT0gMHg0OTA0MDAwMCArIFNaXzFLIC0gMSwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9wZXIgLT4gdGltZXI5ICovCkBAIC0xMDI5LDcgKzk1Niw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF90aW1lcjlfaHdtb2QsCiAJLmNsawkJPSAiZ3B0OV9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3RpbWVyOV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyOV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTEwNDEsOCArOTY3LDcgQEAKIC8qIHRpbWVyOSBod21vZCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X3RpbWVyOV9od21vZCA9IHsKIAkubmFtZQkJPSAidGltZXI5IiwKLQkubXB1X2lycXMJPSBvbWFwM3h4eF90aW1lcjlfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXI5X21wdV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl90aW1lcjlfbXB1X2lycXMsCiAJLm1haW5fY2xrCT0gImdwdDlfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTEwNjEsMjUgKzk4NiwxMyBAQAogCiAvKiB0aW1lcjEwICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXIxMF9od21vZDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF90aW1lcjEwX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gNDYsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwM3h4eF90aW1lcjEwX2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDg2MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwODYwMDAgKyBTWl8xSyAtIDEsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKIAogLyogbDRfY29yZSAtPiB0aW1lcjEwICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAzeHh4X2w0X2NvcmVfX3RpbWVyMTAgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDN4eHhfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAzeHh4X3RpbWVyMTBfaHdtb2QsCiAJLmNsawkJPSAiZ3B0MTBfaWNrIiwKLQkuYWRkcgkJPSBvbWFwM3h4eF90aW1lcjEwX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXIxMF9hZGRycyksCisJLmFkZHIJCT0gb21hcDJfdGltZXIxMF9hZGRycywKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTA5MSw4ICsxMDA0LDcgQEAKIC8qIHRpbWVyMTAgaHdtb2QgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF90aW1lcjEwX2h3bW9kID0gewogCS5uYW1lCQk9ICJ0aW1lcjEwIiwKLQkubXB1X2lycXMJPSBvbWFwM3h4eF90aW1lcjEwX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyMTBfbXB1X2lycXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3RpbWVyMTBfbXB1X2lycXMsCiAJLm1haW5fY2xrCT0gImdwdDEwX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xMTExLDI1ICsxMDIzLDEzIEBACiAKIC8qIHRpbWVyMTEgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF90aW1lcjExX2h3bW9kOwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAzeHh4X3RpbWVyMTFfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSA0NywgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X3RpbWVyMTFfYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwODgwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA4ODAwMCArIFNaXzFLIC0gMSwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwogCiAvKiBsNF9jb3JlIC0+IHRpbWVyMTEgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDN4eHhfbDRfY29yZV9fdGltZXIxMSA9IHsKIAkubWFzdGVyCQk9ICZvbWFwM3h4eF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfdGltZXIxMV9od21vZCwKIAkuY2xrCQk9ICJncHQxMV9pY2siLAotCS5hZGRyCQk9IG9tYXAzeHh4X3RpbWVyMTFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjExX2FkZHJzKSwKKwkuYWRkcgkJPSBvbWFwMl90aW1lcjExX2FkZHJzLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0xMTQxLDggKzEwNDEsNyBAQAogLyogdGltZXIxMSBod21vZCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X3RpbWVyMTFfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInRpbWVyMTEiLAotCS5tcHVfaXJxcwk9IG9tYXAzeHh4X3RpbWVyMTFfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXIxMV9tcHVfaXJxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfdGltZXIxMV9tcHVfaXJxcywKIAkubWFpbl9jbGsJPSAiZ3B0MTFfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTExNjMsNiArMTA2Miw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXIxMl9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF90aW1lcjEyX21wdV9pcnFzW10gPSB7CiAJeyAuaXJxID0gOTUsIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDN4eHhfdGltZXIxMl9hZGRyc1tdID0gewpAQCAtMTE3MSw2ICsxMDcxLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MzA0MDAwICsgU1pfMUsgLSAxLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X2NvcmUgLT4gdGltZXIxMiAqLwpAQCAtMTE3OSw3ICsxMDgwLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAzeHh4X3RpbWVyMTJfaHdtb2QsCiAJLmNsawkJPSAiZ3B0MTJfaWNrIiwKIAkuYWRkcgkJPSBvbWFwM3h4eF90aW1lcjEyX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXIxMl9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTExOTIsNyArMTA5Miw2IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXIxMl9od21vZCA9IHsKIAkubmFtZQkJPSAidGltZXIxMiIsCiAJLm1wdV9pcnFzCT0gb21hcDN4eHhfdGltZXIxMl9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjEyX21wdV9pcnFzKSwKIAkubWFpbl9jbGsJPSAiZ3B0MTJfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTEyMTYsNiArMTExNSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODMxNDA3ZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAzeHh4X2w0X3drdXBfX3dkX3RpbWVyMiA9IHsKQEAgLTEyMjMsNyArMTEyMyw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF93ZF90aW1lcjJfaHdtb2QsCiAJLmNsawkJPSAid2R0Ml9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X3dkX3RpbWVyMl9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3dkX3RpbWVyMl9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTEyOTEsNDUgKzExOTAsMTYgQEAKIAkuZmxhZ3MJCT0gSFdNT0RfU1dTVVBfU0lETEUsCiB9OwogCi0vKiBVQVJUIGNvbW1vbiAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIHVhcnRfc3lzYyA9IHsKLQkucmV2X29mZnMJPSAweDUwLAotCS5zeXNjX29mZnMJPSAweDU0LAotCS5zeXNzX29mZnMJPSAweDU4LAotCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX1NJRExFTU9ERSB8Ci0JCQkgICBTWVNDX0hBU19FTkFXQUtFVVAgfCBTWVNDX0hBU19TT0ZUUkVTRVQgfAotCQkJICAgU1lTQ19IQVNfQVVUT0lETEUgfCBTWVNTX0hBU19SRVNFVF9TVEFUVVMpLAotCS5pZGxlbW9kZXMJPSAoU0lETEVfRk9SQ0UgfCBTSURMRV9OTyB8IFNJRExFX1NNQVJUKSwKLQkuc3lzY19maWVsZHMgICAgPSAmb21hcF9od21vZF9zeXNjX3R5cGUxLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIHVhcnRfY2xhc3MgPSB7Ci0JLm5hbWUgPSAidWFydCIsCi0JLnN5c2MgPSAmdWFydF9zeXNjLAotfTsKLQogLyogVUFSVDEgKi8KIAotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIHVhcnQxX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gSU5UXzI0WFhfVUFSVDFfSVJRLCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIHVhcnQxX3NkbWFfcmVxc1tdID0gewotCXsgLm5hbWUgPSAidHgiLAkuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9VQVJUMV9UWCwgfSwKLQl7IC5uYW1lID0gInJ4IiwJLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfVUFSVDFfUlgsIH0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwM3h4eF91YXJ0MV9zbGF2ZXNbXSA9IHsKIAkmb21hcDNfbDRfY29yZV9fdWFydDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdWFydDFfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInVhcnQxIiwKLQkubXB1X2lycXMJPSB1YXJ0MV9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRSh1YXJ0MV9tcHVfaXJxcyksCi0JLnNkbWFfcmVxcwk9IHVhcnQxX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUodWFydDFfc2RtYV9yZXFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl91YXJ0MV9tcHVfaXJxcywKKwkuc2RtYV9yZXFzCT0gb21hcDJfdWFydDFfc2RtYV9yZXFzLAogCS5tYWluX2Nsawk9ICJ1YXJ0MV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTM0MiwzMSArMTIxMiwyMCBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF91YXJ0MV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3VhcnQxX3NsYXZlcyksCi0JLmNsYXNzCQk9ICZ1YXJ0X2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJfdWFydF9jbGFzcywKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBVQVJUMiAqLwogCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gdWFydDJfbXB1X2lycXNbXSA9IHsKLQl7IC5pcnEgPSBJTlRfMjRYWF9VQVJUMl9JUlEsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gdWFydDJfc2RtYV9yZXFzW10gPSB7Ci0JeyAubmFtZSA9ICJ0eCIsCS5kbWFfcmVxID0gT01BUDI0WFhfRE1BX1VBUlQyX1RYLCB9LAotCXsgLm5hbWUgPSAicngiLAkuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9VQVJUMl9SWCwgfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAzeHh4X3VhcnQyX3NsYXZlc1tdID0gewogCSZvbWFwM19sNF9jb3JlX191YXJ0MiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF91YXJ0Ml9od21vZCA9IHsKIAkubmFtZQkJPSAidWFydDIiLAotCS5tcHVfaXJxcwk9IHVhcnQyX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKHVhcnQyX21wdV9pcnFzKSwKLQkuc2RtYV9yZXFzCT0gdWFydDJfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRSh1YXJ0Ml9zZG1hX3JlcXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX3VhcnQyX21wdV9pcnFzLAorCS5zZG1hX3JlcXMJPSBvbWFwMl91YXJ0Ml9zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gInVhcnQyX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xMzc5LDMxICsxMjM4LDIwIEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3VhcnQyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdWFydDJfc2xhdmVzKSwKLQkuY2xhc3MJCT0gJnVhcnRfY2xhc3MsCisJLmNsYXNzCQk9ICZvbWFwMl91YXJ0X2NsYXNzLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIFVBUlQzICovCiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyB1YXJ0M19tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IElOVF8yNFhYX1VBUlQzX0lSUSwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyB1YXJ0M19zZG1hX3JlcXNbXSA9IHsKLQl7IC5uYW1lID0gInR4IiwJLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfVUFSVDNfVFgsIH0sCi0JeyAubmFtZSA9ICJyeCIsCS5kbWFfcmVxID0gT01BUDI0WFhfRE1BX1VBUlQzX1JYLCB9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDN4eHhfdWFydDNfc2xhdmVzW10gPSB7CiAJJm9tYXAzX2w0X3Blcl9fdWFydDMsCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdWFydDNfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInVhcnQzIiwKLQkubXB1X2lycXMJPSB1YXJ0M19tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRSh1YXJ0M19tcHVfaXJxcyksCi0JLnNkbWFfcmVxcwk9IHVhcnQzX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUodWFydDNfc2RtYV9yZXFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl91YXJ0M19tcHVfaXJxcywKKwkuc2RtYV9yZXFzCT0gb21hcDJfdWFydDNfc2RtYV9yZXFzLAogCS5tYWluX2Nsawk9ICJ1YXJ0M19mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTQxNiw3ICsxMjY0LDcgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdWFydDNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF91YXJ0M19zbGF2ZXMpLAotCS5jbGFzcwkJPSAmdWFydF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyX3VhcnRfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIApAQCAtMTQyNCwxMSArMTI3MiwxMyBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gdWFydDRfbXB1X2lycXNbXSA9IHsKIAl7IC5pcnEgPSBJTlRfMzZYWF9VQVJUNF9JUlEsIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIHVhcnQ0X3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAicngiLAkuZG1hX3JlcSA9IE9NQVAzNlhYX0RNQV9VQVJUNF9SWCwgfSwKIAl7IC5uYW1lID0gInR4IiwJLmRtYV9yZXEgPSBPTUFQMzZYWF9ETUFfVUFSVDRfVFgsIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAzeHh4X3VhcnQ0X3NsYXZlc1tdID0gewpAQCAtMTQzOCw5ICsxMjg4LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF91YXJ0NF9od21vZCA9IHsKIAkubmFtZQkJPSAidWFydDQiLAogCS5tcHVfaXJxcwk9IHVhcnQ0X21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKHVhcnQ0X21wdV9pcnFzKSwKIAkuc2RtYV9yZXFzCT0gdWFydDRfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRSh1YXJ0NF9zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJ1YXJ0NF9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTQ1Myw3ICsxMzAxLDcgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdWFydDRfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF91YXJ0NF9zbGF2ZXMpLAotCS5jbGFzcwkJPSAmdWFydF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyX3VhcnRfY2xhc3MsCiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM2MzBFUzEpLAogfTsKIApAQCAtMTQ2MiwyNyArMTMxMCwxMCBAQAogCS5zeXNjID0gJmkyY19zeXNjLAogfTsKIAotLyoKLSAqICdkc3MnIGNsYXNzCi0gKiBkaXNwbGF5IHN1Yi1zeXN0ZW0KLSAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAzeHh4X2Rzc19zeXNjID0gewotCS5yZXZfb2Zmcwk9IDB4MDAwMCwKLQkuc3lzY19vZmZzCT0gMHgwMDEwLAotCS5zeXNzX29mZnMJPSAweDAwMTQsCi0JLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfU09GVFJFU0VUIHwgU1lTQ19IQVNfQVVUT0lETEUpLAotCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDN4eHhfZHNzX2h3bW9kX2NsYXNzID0gewotCS5uYW1lID0gImRzcyIsCi0JLnN5c2MgPSAmb21hcDN4eHhfZHNzX3N5c2MsCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDN4eHhfZHNzX3NkbWFfY2hzW10gPSB7CiAJeyAubmFtZSA9ICJkaXNwYyIsIC5kbWFfcmVxID0gNSB9LAogCXsgLm5hbWUgPSAiZHNpMSIsIC5kbWFfcmVxID0gNzQgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQogfTsKIAogLyogZHNzICovCkBAIC0xNDkxLDIxICsxMzIyLDEyIEBACiAJJm9tYXAzeHh4X2Rzc19fbDMsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwM3h4eF9kc3NfYWRkcnNbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwNTAwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA1MDNGRiwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAotCX0sCi19OwotCiAvKiBsNF9jb3JlIC0+IGRzcyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMzQzMGVzMV9sNF9jb3JlX19kc3MgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDN4eHhfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAzNDMwZXMxX2Rzc19jb3JlX2h3bW9kLAogCS5jbGsJCT0gImRzc19pY2siLAotCS5hZGRyCQk9IG9tYXAzeHh4X2Rzc19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2Rzc19hZGRycyksCisJLmFkZHIJCT0gb21hcDJfZHNzX2FkZHJzLAogCS5mdyA9IHsKIAkJLm9tYXAyID0gewogCQkJLmw0X2Z3X3JlZ2lvbiAgPSBPTUFQM0VTMV9MNF9DT1JFX0ZXX0RTU19DT1JFX1JFR0lPTiwKQEAgLTE1MjAsOCArMTM0Miw3IEBACiAJLm1hc3RlcgkJPSAmb21hcDN4eHhfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAzeHh4X2Rzc19jb3JlX2h3bW9kLAogCS5jbGsJCT0gImRzc19pY2siLAotCS5hZGRyCQk9IG9tYXAzeHh4X2Rzc19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2Rzc19hZGRycyksCisJLmFkZHIJCT0gb21hcDJfZHNzX2FkZHJzLAogCS5mdyA9IHsKIAkJLm9tYXAyID0gewogCQkJLmw0X2Z3X3JlZ2lvbiAgPSBPTUFQM19MNF9DT1JFX0ZXX0RTU19DT1JFX1JFR0lPTiwKQEAgLTE1NDksMTEgKzEzNzAsOSBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDM0MzBlczFfZHNzX2NvcmVfaHdtb2QgPSB7CiAJLm5hbWUJCT0gImRzc19jb3JlIiwKLQkuY2xhc3MJCT0gJm9tYXAzeHh4X2Rzc19od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyX2Rzc19od21vZF9jbGFzcywKIAkubWFpbl9jbGsJPSAiZHNzMV9hbHdvbl9mY2siLCAvKiBpbnN0ZWFkIG9mIGRzc19mY2sgKi8KIAkuc2RtYV9yZXFzCT0gb21hcDN4eHhfZHNzX3NkbWFfY2hzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9kc3Nfc2RtYV9jaHMpLAotCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CiAJCQkucHJjbV9yZWdfaWQgPSAxLApAQCAtMTU3NSwxMSArMTM5NCw5IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF9kc3NfY29yZV9od21vZCA9IHsKIAkubmFtZQkJPSAiZHNzX2NvcmUiLAotCS5jbGFzcwkJPSAmb21hcDN4eHhfZHNzX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJfZHNzX2h3bW9kX2NsYXNzLAogCS5tYWluX2Nsawk9ICJkc3MxX2Fsd29uX2ZjayIsIC8qIGluc3RlYWQgb2YgZHNzX2ZjayAqLwogCS5zZG1hX3JlcXMJPSBvbWFwM3h4eF9kc3Nfc2RtYV9jaHMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2Rzc19zZG1hX2NocyksCi0KIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKIAkJCS5wcmNtX3JlZ19pZCA9IDEsCkBAIC0xNjAwLDQ3ICsxNDE3LDEyIEBACiAJCQkJQ0hJUF9JU19PTUFQMzYzMEVTMSB8IENISVBfR0VfT01BUDM2MzBFUzFfMSksCiB9OwogCi0vKgotICogJ2Rpc3BjJyBjbGFzcwotICogZGlzcGxheSBjb250cm9sbGVyCi0gKi8KLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwM3h4eF9kaXNwY19zeXNjID0gewotCS5yZXZfb2Zmcwk9IDB4MDAwMCwKLQkuc3lzY19vZmZzCT0gMHgwMDEwLAotCS5zeXNzX29mZnMJPSAweDAwMTQsCi0JLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfU0lETEVNT0RFIHwgU1lTQ19IQVNfQ0xPQ0tBQ1RJVklUWSB8Ci0JCQkgICBTWVNDX0hBU19NSURMRU1PREUgfCBTWVNDX0hBU19FTkFXQUtFVVAgfAotCQkJICAgU1lTQ19IQVNfU09GVFJFU0VUIHwgU1lTQ19IQVNfQVVUT0lETEUpLAotCS5pZGxlbW9kZXMJPSAoU0lETEVfRk9SQ0UgfCBTSURMRV9OTyB8IFNJRExFX1NNQVJUIHwKLQkJCSAgIE1TVEFOREJZX0ZPUkNFIHwgTVNUQU5EQllfTk8gfCBNU1RBTkRCWV9TTUFSVCksCi0JLnN5c2NfZmllbGRzCT0gJm9tYXBfaHdtb2Rfc3lzY190eXBlMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBvbWFwM3h4eF9kaXNwY19od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJkaXNwYyIsCi0JLnN5c2MgPSAmb21hcDN4eHhfZGlzcGNfc3lzYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF9kaXNwY19pcnFzW10gPSB7Ci0JeyAuaXJxID0gMjUgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X2Rzc19kaXNwY19hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA1MDQwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDUwN0ZGLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07Ci0KIC8qIGw0X2NvcmUgLT4gZHNzX2Rpc3BjICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAzeHh4X2w0X2NvcmVfX2Rzc19kaXNwYyA9IHsKIAkubWFzdGVyCQk9ICZvbWFwM3h4eF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfZHNzX2Rpc3BjX2h3bW9kLAogCS5jbGsJCT0gImRzc19pY2siLAotCS5hZGRyCQk9IG9tYXAzeHh4X2Rzc19kaXNwY19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2Rzc19kaXNwY19hZGRycyksCisJLmFkZHIJCT0gb21hcDJfZHNzX2Rpc3BjX2FkZHJzLAogCS5mdyA9IHsKIAkJLm9tYXAyID0gewogCQkJLmw0X2Z3X3JlZ2lvbiAgPSBPTUFQM19MNF9DT1JFX0ZXX0RTU19ESVNQQ19SRUdJT04sCkBAIC0xNjU4LDkgKzE0NDAsOCBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfZHNzX2Rpc3BjX2h3bW9kID0gewogCS5uYW1lCQk9ICJkc3NfZGlzcGMiLAotCS5jbGFzcwkJPSAmb21hcDN4eHhfZGlzcGNfaHdtb2RfY2xhc3MsCi0JLm1wdV9pcnFzCT0gb21hcDN4eHhfZGlzcGNfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9kaXNwY19pcnFzKSwKKwkuY2xhc3MJCT0gJm9tYXAyX2Rpc3BjX2h3bW9kX2NsYXNzLAorCS5tcHVfaXJxcwk9IG9tYXAyX2Rpc3BjX2lycXMsCiAJLm1haW5fY2xrCT0gImRzczFfYWx3b25fZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE2ODgsNiArMTQ2OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF9kc2kxX2lycXNbXSA9IHsKIAl7IC5pcnEgPSAyNSB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIC8qIGRzc19kc2kxICovCkBAIC0xNjk3LDYgKzE0NzksNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwNEZGRkYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfY29yZSAtPiBkc3NfZHNpMSAqLwpAQCAtMTcwNCw3ICsxNDg3LDYgQEAKIAkubWFzdGVyCQk9ICZvbWFwM3h4eF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfZHNzX2RzaTFfaHdtb2QsCiAJLmFkZHIJCT0gb21hcDN4eHhfZHNzX2RzaTFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9kc3NfZHNpMV9hZGRycyksCiAJLmZ3ID0gewogCQkub21hcDIgPSB7CiAJCQkubDRfZndfcmVnaW9uICA9IE9NQVAzX0w0X0NPUkVfRldfRFNTX0RTSV9SRUdJT04sCkBAIC0xNzI0LDcgKzE1MDYsNiBAQAogCS5uYW1lCQk9ICJkc3NfZHNpMSIsCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF9kc2lfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDN4eHhfZHNpMV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2RzaTFfaXJxcyksCiAJLm1haW5fY2xrCT0gImRzczFfYWx3b25fZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE3NDEsNDEgKzE1MjIsMTIgQEAKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIAotLyoKLSAqICdyZmJpJyBjbGFzcwotICogcmVtb3RlIGZyYW1lIGJ1ZmZlciBpbnRlcmZhY2UKLSAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Nfc3lzY29uZmlnIG9tYXAzeHh4X3JmYmlfc3lzYyA9IHsKLQkucmV2X29mZnMJPSAweDAwMDAsCi0JLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKLQkuc3lzc19vZmZzCT0gMHgwMDE0LAotCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX1NJRExFTU9ERSB8IFNZU0NfSEFTX1NPRlRSRVNFVCB8Ci0JCQkgICBTWVNDX0hBU19BVVRPSURMRSksCi0JLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQpLAotCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDN4eHhfcmZiaV9od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJyZmJpIiwKLQkuc3lzYyA9ICZvbWFwM3h4eF9yZmJpX3N5c2MsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwM3h4eF9kc3NfcmZiaV9hZGRyc1tdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODA1MDgwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MDUwQkZGLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCi0JfSwKLX07Ci0KIC8qIGw0X2NvcmUgLT4gZHNzX3JmYmkgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDN4eHhfbDRfY29yZV9fZHNzX3JmYmkgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDN4eHhfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAzeHh4X2Rzc19yZmJpX2h3bW9kLAogCS5jbGsJCT0gImRzc19pY2siLAotCS5hZGRyCQk9IG9tYXAzeHh4X2Rzc19yZmJpX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZHNzX3JmYmlfYWRkcnMpLAorCS5hZGRyCQk9IG9tYXAyX2Rzc19yZmJpX2FkZHJzLAogCS5mdyA9IHsKIAkJLm9tYXAyID0gewogCQkJLmw0X2Z3X3JlZ2lvbiAgPSBPTUFQM19MNF9DT1JFX0ZXX0RTU19SRkJJX1JFR0lPTiwKQEAgLTE3OTMsNyArMTU0NSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF9kc3NfcmZiaV9od21vZCA9IHsKIAkubmFtZQkJPSAiZHNzX3JmYmkiLAotCS5jbGFzcwkJPSAmb21hcDN4eHhfcmZiaV9od21vZF9jbGFzcywKKwkuY2xhc3MJCT0gJm9tYXAyX3JmYmlfaHdtb2RfY2xhc3MsCiAJLm1haW5fY2xrCT0gImRzczFfYWx3b25fZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE4MTAsMzEgKzE1NjIsMTIgQEAKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIAotLyoKLSAqICd2ZW5jJyBjbGFzcwotICogdmlkZW8gZW5jb2RlcgotICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBvbWFwM3h4eF92ZW5jX2h3bW9kX2NsYXNzID0gewotCS5uYW1lID0gInZlbmMiLAotfTsKLQotLyogZHNzX3ZlbmMgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X2Rzc192ZW5jX2FkZHJzW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDUwQzAwLAotCQkucGFfZW5kCQk9IDB4NDgwNTBGRkYsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKLQl9LAotfTsKLQogLyogbDRfY29yZSAtPiBkc3NfdmVuYyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwM3h4eF9sNF9jb3JlX19kc3NfdmVuYyA9IHsKIAkubWFzdGVyCQk9ICZvbWFwM3h4eF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfZHNzX3ZlbmNfaHdtb2QsCiAJLmNsawkJPSAiZHNzX3R2X2ZjayIsCi0JLmFkZHIJCT0gb21hcDN4eHhfZHNzX3ZlbmNfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9kc3NfdmVuY19hZGRycyksCisJLmFkZHIJCT0gb21hcDJfZHNzX3ZlbmNfYWRkcnMsCiAJLmZ3ID0gewogCQkub21hcDIgPSB7CiAJCQkubDRfZndfcmVnaW9uICA9IE9NQVAzX0w0X0NPUkVfRldfRFNTX1ZFTkNfUkVHSU9OLApAQCAtMTg1Myw3ICsxNTg2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X2Rzc192ZW5jX2h3bW9kID0gewogCS5uYW1lCQk9ICJkc3NfdmVuYyIsCi0JLmNsYXNzCQk9ICZvbWFwM3h4eF92ZW5jX2h3bW9kX2NsYXNzLAorCS5jbGFzcwkJPSAmb21hcDJfdmVuY19od21vZF9jbGFzcywKIAkubWFpbl9jbGsJPSAiZHNzMV9hbHdvbl9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMTg3NiwyNSArMTYwOSwxNCBAQAogCS5maWZvX2RlcHRoCT0gOCwgLyogYnl0ZXMgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBpMmMxX21wdV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gSU5UXzI0WFhfSTJDMV9JUlEsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gaTJjMV9zZG1hX3JlcXNbXSA9IHsKLQl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfSTJDMV9UWCB9LAotCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IE9NQVAyNFhYX0RNQV9JMkMxX1JYIH0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwM3h4eF9pMmMxX3NsYXZlc1tdID0gewogCSZvbWFwM19sNF9jb3JlX19pMmMxLAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X2kyYzFfaHdtb2QgPSB7CiAJLm5hbWUJCT0gImkyYzEiLAotCS5tcHVfaXJxcwk9IGkyYzFfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUoaTJjMV9tcHVfaXJxcyksCi0JLnNkbWFfcmVxcwk9IGkyYzFfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShpMmMxX3NkbWFfcmVxcyksCisJLm1wdV9pcnFzCT0gb21hcDJfaTJjMV9tcHVfaXJxcywKKwkuc2RtYV9yZXFzCT0gb21hcDJfaTJjMV9zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gImkyYzFfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTE5MTgsMjUgKzE2NDAsMTQgQEAKIAkuZmlmb19kZXB0aAk9IDgsIC8qIGJ5dGVzICovCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gaTJjMl9tcHVfaXJxc1tdID0gewotCXsgLmlycSA9IElOVF8yNFhYX0kyQzJfSVJRLCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIGkyYzJfc2RtYV9yZXFzW10gPSB7Ci0JeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gT01BUDI0WFhfRE1BX0kyQzJfVFggfSwKLQl7IC5uYW1lID0gInJ4IiwgLmRtYV9yZXEgPSBPTUFQMjRYWF9ETUFfSTJDMl9SWCB9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiAqb21hcDN4eHhfaTJjMl9zbGF2ZXNbXSA9IHsKIAkmb21hcDNfbDRfY29yZV9faTJjMiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF9pMmMyX2h3bW9kID0gewogCS5uYW1lCQk9ICJpMmMyIiwKLQkubXB1X2lycXMJPSBpMmMyX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKGkyYzJfbXB1X2lycXMpLAotCS5zZG1hX3JlcXMJPSBpMmMyX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUoaTJjMl9zZG1hX3JlcXMpLAorCS5tcHVfaXJxcwk9IG9tYXAyX2kyYzJfbXB1X2lycXMsCisJLnNkbWFfcmVxcwk9IG9tYXAyX2kyYzJfc2RtYV9yZXFzLAogCS5tYWluX2Nsawk9ICJpMmMyX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0xOTYyLDExICsxNjczLDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBpMmMzX21wdV9pcnFzW10gPSB7CiAJeyAuaXJxID0gSU5UXzM0WFhfSTJDM19JUlEsIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIGkyYzNfc2RtYV9yZXFzW10gPSB7CiAJeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gT01BUDM0WFhfRE1BX0kyQzNfVFggfSwKIAl7IC5uYW1lID0gInJ4IiwgLmRtYV9yZXEgPSBPTUFQMzRYWF9ETUFfSTJDM19SWCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmICpvbWFwM3h4eF9pMmMzX3NsYXZlc1tdID0gewpAQCAtMTk3Niw5ICsxNjg5LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF9pMmMzX2h3bW9kID0gewogCS5uYW1lCQk9ICJpMmMzIiwKIAkubXB1X2lycXMJPSBpMmMzX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKGkyYzNfbXB1X2lycXMpLAogCS5zZG1hX3JlcXMJPSBpMmMzX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUoaTJjM19zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJpMmMzX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0yMDAzLDEzICsxNzE0LDEzIEBACiAJCS5wYV9lbmQJCT0gMHg0ODMxMDFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAzeHh4X2w0X3drdXBfX2dwaW8xID0gewogCS5tYXN0ZXIJCT0gJm9tYXAzeHh4X2w0X3drdXBfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwM3h4eF9ncGlvMV9od21vZCwKIAkuYWRkcgkJPSBvbWFwM3h4eF9ncGlvMV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2dwaW8xX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMjAyMCwxMyArMTczMSwxMyBAQAogCQkucGFfZW5kCQk9IDB4NDkwNTAxZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwM3h4eF9sNF9wZXJfX2dwaW8yID0gewogCS5tYXN0ZXIJCT0gJm9tYXAzeHh4X2w0X3Blcl9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAzeHh4X2dwaW8yX2h3bW9kLAogCS5hZGRyCQk9IG9tYXAzeHh4X2dwaW8yX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZ3BpbzJfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yMDM3LDEzICsxNzQ4LDEzIEBACiAJCS5wYV9lbmQJCT0gMHg0OTA1MjFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAzeHh4X2w0X3Blcl9fZ3BpbzMgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDN4eHhfbDRfcGVyX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfZ3BpbzNfaHdtb2QsCiAJLmFkZHIJCT0gb21hcDN4eHhfZ3BpbzNfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9ncGlvM19hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTIwNTQsMTMgKzE3NjUsMTMgQEAKIAkJLnBhX2VuZAkJPSAweDQ5MDU0MWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDN4eHhfbDRfcGVyX19ncGlvNCA9IHsKIAkubWFzdGVyCQk9ICZvbWFwM3h4eF9sNF9wZXJfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwM3h4eF9ncGlvNF9od21vZCwKIAkuYWRkcgkJPSBvbWFwM3h4eF9ncGlvNF9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2dwaW80X2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMjA3MSwxMyArMTc4MiwxMyBAQAogCQkucGFfZW5kCQk9IDB4NDkwNTYxZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwM3h4eF9sNF9wZXJfX2dwaW81ID0gewogCS5tYXN0ZXIJCT0gJm9tYXAzeHh4X2w0X3Blcl9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAzeHh4X2dwaW81X2h3bW9kLAogCS5hZGRyCQk9IG9tYXAzeHh4X2dwaW81X2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZ3BpbzVfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yMDg4LDEzICsxNzk5LDEzIEBACiAJCS5wYV9lbmQJCT0gMHg0OTA1ODFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAzeHh4X2w0X3Blcl9fZ3BpbzYgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDN4eHhfbDRfcGVyX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfZ3BpbzZfaHdtb2QsCiAJLmFkZHIJCT0gb21hcDN4eHhfZ3BpbzZfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9ncGlvNl9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTIxMjcsMTAgKzE4MzgsNiBAQAogfTsKIAogLyogZ3BpbzEgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF9ncGlvMV9pcnFzW10gPSB7Ci0JeyAuaXJxID0gMjkgfSwgLyogSU5UXzM0WFhfR1BJT19CQU5LMSAqLwotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29wdF9jbGsgZ3BpbzFfb3B0X2Nsa3NbXSA9IHsKIAl7IC5yb2xlID0gImRiY2xrIiwgLmNsayA9ICJncGlvMV9kYmNrIiwgfSwKIH07CkBAIC0yMTQyLDggKzE4NDksNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X2dwaW8xX2h3bW9kID0gewogCS5uYW1lCQk9ICJncGlvMSIsCiAJLmZsYWdzCQk9IEhXTU9EX0NPTlRST0xfT1BUX0NMS1NfSU5fUkVTRVQsCi0JLm1wdV9pcnFzCT0gb21hcDN4eHhfZ3BpbzFfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9ncGlvMV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9ncGlvMV9pcnFzLAogCS5tYWluX2Nsawk9ICJncGlvMV9pY2siLAogCS5vcHRfY2xrcwk9IGdwaW8xX29wdF9jbGtzLAogCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKGdwaW8xX29wdF9jbGtzKSwKQEAgLTIxNjQsMTAgKzE4NzAsNiBAQAogfTsKIAogLyogZ3BpbzIgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF9ncGlvMl9pcnFzW10gPSB7Ci0JeyAuaXJxID0gMzAgfSwgLyogSU5UXzM0WFhfR1BJT19CQU5LMiAqLwotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29wdF9jbGsgZ3BpbzJfb3B0X2Nsa3NbXSA9IHsKIAl7IC5yb2xlID0gImRiY2xrIiwgLmNsayA9ICJncGlvMl9kYmNrIiwgfSwKIH07CkBAIC0yMTc5LDggKzE4ODEsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X2dwaW8yX2h3bW9kID0gewogCS5uYW1lCQk9ICJncGlvMiIsCiAJLmZsYWdzCQk9IEhXTU9EX0NPTlRST0xfT1BUX0NMS1NfSU5fUkVTRVQsCi0JLm1wdV9pcnFzCT0gb21hcDN4eHhfZ3BpbzJfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9ncGlvMl9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9ncGlvMl9pcnFzLAogCS5tYWluX2Nsawk9ICJncGlvMl9pY2siLAogCS5vcHRfY2xrcwk9IGdwaW8yX29wdF9jbGtzLAogCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKGdwaW8yX29wdF9jbGtzKSwKQEAgLTIyMDEsMTAgKzE5MDIsNiBAQAogfTsKIAogLyogZ3BpbzMgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF9ncGlvM19pcnFzW10gPSB7Ci0JeyAuaXJxID0gMzEgfSwgLyogSU5UXzM0WFhfR1BJT19CQU5LMyAqLwotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29wdF9jbGsgZ3BpbzNfb3B0X2Nsa3NbXSA9IHsKIAl7IC5yb2xlID0gImRiY2xrIiwgLmNsayA9ICJncGlvM19kYmNrIiwgfSwKIH07CkBAIC0yMjE2LDggKzE5MTMsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X2dwaW8zX2h3bW9kID0gewogCS5uYW1lCQk9ICJncGlvMyIsCiAJLmZsYWdzCQk9IEhXTU9EX0NPTlRST0xfT1BUX0NMS1NfSU5fUkVTRVQsCi0JLm1wdV9pcnFzCT0gb21hcDN4eHhfZ3BpbzNfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9ncGlvM19pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9ncGlvM19pcnFzLAogCS5tYWluX2Nsawk9ICJncGlvM19pY2siLAogCS5vcHRfY2xrcwk9IGdwaW8zX29wdF9jbGtzLAogCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKGdwaW8zX29wdF9jbGtzKSwKQEAgLTIyMzgsMTAgKzE5MzQsNiBAQAogfTsKIAogLyogZ3BpbzQgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF9ncGlvNF9pcnFzW10gPSB7Ci0JeyAuaXJxID0gMzIgfSwgLyogSU5UXzM0WFhfR1BJT19CQU5LNCAqLwotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29wdF9jbGsgZ3BpbzRfb3B0X2Nsa3NbXSA9IHsKIAl7IC5yb2xlID0gImRiY2xrIiwgLmNsayA9ICJncGlvNF9kYmNrIiwgfSwKIH07CkBAIC0yMjUzLDggKzE5NDUsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X2dwaW80X2h3bW9kID0gewogCS5uYW1lCQk9ICJncGlvNCIsCiAJLmZsYWdzCQk9IEhXTU9EX0NPTlRST0xfT1BUX0NMS1NfSU5fUkVTRVQsCi0JLm1wdV9pcnFzCT0gb21hcDN4eHhfZ3BpbzRfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9ncGlvNF9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9ncGlvNF9pcnFzLAogCS5tYWluX2Nsawk9ICJncGlvNF9pY2siLAogCS5vcHRfY2xrcwk9IGdwaW80X29wdF9jbGtzLAogCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKGdwaW80X29wdF9jbGtzKSwKQEAgLTIyNzcsNiArMTk2OCw3IEBACiAvKiBncGlvNSAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAzeHh4X2dwaW81X2lycXNbXSA9IHsKIAl7IC5pcnEgPSAzMyB9LCAvKiBJTlRfMzRYWF9HUElPX0JBTks1ICovCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29wdF9jbGsgZ3BpbzVfb3B0X2Nsa3NbXSA9IHsKQEAgLTIyOTEsNyArMTk4Myw2IEBACiAJLm5hbWUJCT0gImdwaW81IiwKIAkuZmxhZ3MJCT0gSFdNT0RfQ09OVFJPTF9PUFRfQ0xLU19JTl9SRVNFVCwKIAkubXB1X2lycXMJPSBvbWFwM3h4eF9ncGlvNV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2dwaW81X2lycXMpLAogCS5tYWluX2Nsawk9ICJncGlvNV9pY2siLAogCS5vcHRfY2xrcwk9IGdwaW81X29wdF9jbGtzLAogCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKGdwaW81X29wdF9jbGtzKSwKQEAgLTIzMTQsNiArMjAwNSw3IEBACiAvKiBncGlvNiAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAzeHh4X2dwaW82X2lycXNbXSA9IHsKIAl7IC5pcnEgPSAzNCB9LCAvKiBJTlRfMzRYWF9HUElPX0JBTks2ICovCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29wdF9jbGsgZ3BpbzZfb3B0X2Nsa3NbXSA9IHsKQEAgLTIzMjgsNyArMjAyMCw2IEBACiAJLm5hbWUJCT0gImdwaW82IiwKIAkuZmxhZ3MJCT0gSFdNT0RfQ09OVFJPTF9PUFRfQ0xLU19JTl9SRVNFVCwKIAkubXB1X2lycXMJPSBvbWFwM3h4eF9ncGlvNl9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2dwaW82X2lycXMpLAogCS5tYWluX2Nsawk9ICJncGlvNl9pY2siLAogCS5vcHRfY2xrcwk9IGdwaW82X29wdF9jbGtzLAogCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKGdwaW82X29wdF9jbGtzKSwKQEAgLTIzODIsMTkgKzIwNzMsMTMgQEAKIH07CiAKIC8qIGRtYV9zeXN0ZW0gKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF9kbWFfc3lzdGVtX2lycXNbXSA9IHsKLQl7IC5uYW1lID0gIjAiLCAuaXJxID0gMTIgfSwgLyogSU5UXzI0WFhfU0RNQV9JUlEwICovCi0JeyAubmFtZSA9ICIxIiwgLmlycSA9IDEzIH0sIC8qIElOVF8yNFhYX1NETUFfSVJRMSAqLwotCXsgLm5hbWUgPSAiMiIsIC5pcnEgPSAxNCB9LCAvKiBJTlRfMjRYWF9TRE1BX0lSUTIgKi8KLQl7IC5uYW1lID0gIjMiLCAuaXJxID0gMTUgfSwgLyogSU5UXzI0WFhfU0RNQV9JUlEzICovCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwM3h4eF9kbWFfc3lzdGVtX2FkZHJzW10gPSB7CiAJewogCQkucGFfc3RhcnQJPSAweDQ4MDU2MDAwLAogCQkucGFfZW5kCQk9IDB4NDgwNTZmZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogZG1hX3N5c3RlbSBtYXN0ZXIgcG9ydHMgKi8KQEAgLTI0MDgsNyArMjA5Myw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF9kbWFfc3lzdGVtX2h3bW9kLAogCS5jbGsJCT0gImNvcmVfbDRfaWNrIiwKIAkuYWRkcgkJPSBvbWFwM3h4eF9kbWFfc3lzdGVtX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZG1hX3N5c3RlbV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTI0MjAsOCArMjEwNCw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfZG1hX3N5c3RlbV9od21vZCA9IHsKIAkubmFtZQkJPSAiZG1hIiwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X2RtYV9od21vZF9jbGFzcywKLQkubXB1X2lycXMJPSBvbWFwM3h4eF9kbWFfc3lzdGVtX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZG1hX3N5c3RlbV9pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9kbWFfc3lzdGVtX2lycXMsCiAJLm1haW5fY2xrCT0gImNvcmVfbDNfaWNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXAyID0gewpAQCAtMjQ2NiwxMSArMjE0OSw3IEBACiAJeyAubmFtZSA9ICJpcnEiLCAuaXJxID0gMTYgfSwKIAl7IC5uYW1lID0gInR4IiwgLmlycSA9IDU5IH0sCiAJeyAubmFtZSA9ICJyeCIsIC5pcnEgPSA2MCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAzeHh4X21jYnNwMV9zZG1hX2Noc1tdID0gewotCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDMyIH0sCi0JeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gMzEgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwM3h4eF9tY2JzcDFfYWRkcnNbXSA9IHsKQEAgLTI0ODAsNiArMjE1OSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODA3NDBmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9jb3JlIC0+IG1jYnNwMSAqLwpAQCAtMjQ4OCw3ICsyMTY4LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAzeHh4X21jYnNwMV9od21vZCwKIAkuY2xrCQk9ICJtY2JzcDFfaWNrIiwKIAkuYWRkcgkJPSBvbWFwM3h4eF9tY2JzcDFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tY2JzcDFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yNTAxLDkgKzIxODAsNyBAQAogCS5uYW1lCQk9ICJtY2JzcDEiLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfbWNic3BfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDN4eHhfbWNic3AxX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWNic3AxX2lycXMpLAotCS5zZG1hX3JlcXMJPSBvbWFwM3h4eF9tY2JzcDFfc2RtYV9jaHMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwMV9zZG1hX2NocyksCisJLnNkbWFfcmVxcwk9IG9tYXAyX21jYnNwMV9zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gIm1jYnNwMV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMjUyNCwxMSArMjIwMSw3IEBACiAJeyAubmFtZSA9ICJpcnEiLCAuaXJxID0gMTcgfSwKIAl7IC5uYW1lID0gInR4IiwgLmlycSA9IDYyIH0sCiAJeyAubmFtZSA9ICJyeCIsIC5pcnEgPSA2MyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAzeHh4X21jYnNwMl9zZG1hX2Noc1tdID0gewotCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDM0IH0sCi0JeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gMzMgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwM3h4eF9tY2JzcDJfYWRkcnNbXSA9IHsKQEAgLTI1MzgsNiArMjIxMSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0OTAyMjBmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9wZXIgLT4gbWNic3AyICovCkBAIC0yNTQ2LDcgKzIyMjAsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfbWNic3AyX2h3bW9kLAogCS5jbGsJCT0gIm1jYnNwMl9pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X21jYnNwMl9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwMl9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTI1NjMsOSArMjIzNiw3IEBACiAJLm5hbWUJCT0gIm1jYnNwMiIsCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF9tY2JzcF9od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwM3h4eF9tY2JzcDJfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tY2JzcDJfaXJxcyksCi0JLnNkbWFfcmVxcwk9IG9tYXAzeHh4X21jYnNwMl9zZG1hX2NocywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWNic3AyX3NkbWFfY2hzKSwKKwkuc2RtYV9yZXFzCT0gb21hcDJfbWNic3AyX3NkbWFfcmVxcywKIAkubWFpbl9jbGsJPSAibWNic3AyX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0yNTg3LDExICsyMjU4LDcgQEAKIAl7IC5uYW1lID0gImlycSIsIC5pcnEgPSAyMiB9LAogCXsgLm5hbWUgPSAidHgiLCAuaXJxID0gODkgfSwKIAl7IC5uYW1lID0gInJ4IiwgLmlycSA9IDkwIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDN4eHhfbWNic3AzX3NkbWFfY2hzW10gPSB7Ci0JeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gMTggfSwKLQl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSAxNyB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X21jYnNwM19hZGRyc1tdID0gewpAQCAtMjYwMSw2ICsyMjY4LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ5MDI0MGZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBtY2JzcDMgKi8KQEAgLTI2MDksNyArMjI3Nyw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF9tY2JzcDNfaHdtb2QsCiAJLmNsawkJPSAibWNic3AzX2ljayIsCiAJLmFkZHIJCT0gb21hcDN4eHhfbWNic3AzX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWNic3AzX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMjYyNiw5ICsyMjkzLDcgQEAKIAkubmFtZQkJPSAibWNic3AzIiwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X21jYnNwX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXAzeHh4X21jYnNwM19pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwM19pcnFzKSwKLQkuc2RtYV9yZXFzCT0gb21hcDN4eHhfbWNic3AzX3NkbWFfY2hzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tY2JzcDNfc2RtYV9jaHMpLAorCS5zZG1hX3JlcXMJPSBvbWFwMl9tY2JzcDNfc2RtYV9yZXFzLAogCS5tYWluX2Nsawk9ICJtY2JzcDNfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTI2NTAsMTEgKzIzMTUsMTMgQEAKIAl7IC5uYW1lID0gImlycSIsIC5pcnEgPSAyMyB9LAogCXsgLm5hbWUgPSAidHgiLCAuaXJxID0gNTQgfSwKIAl7IC5uYW1lID0gInJ4IiwgLmlycSA9IDU1IH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAzeHh4X21jYnNwNF9zZG1hX2Noc1tdID0gewogCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDIwIH0sCiAJeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gMTkgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDN4eHhfbWNic3A0X2FkZHJzW10gPSB7CkBAIC0yNjY0LDYgKzIzMzEsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwMjYwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IG1jYnNwNCAqLwpAQCAtMjY3Miw3ICsyMzQwLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAzeHh4X21jYnNwNF9od21vZCwKIAkuY2xrCQk9ICJtY2JzcDRfaWNrIiwKIAkuYWRkcgkJPSBvbWFwM3h4eF9tY2JzcDRfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tY2JzcDRfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yNjg1LDkgKzIzNTIsNyBAQAogCS5uYW1lCQk9ICJtY2JzcDQiLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfbWNic3BfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDN4eHhfbWNic3A0X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWNic3A0X2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwM3h4eF9tY2JzcDRfc2RtYV9jaHMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwNF9zZG1hX2NocyksCiAJLm1haW5fY2xrCT0gIm1jYnNwNF9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMjcwOCwxMSArMjM3MywxMyBAQAogCXsgLm5hbWUgPSAiaXJxIiwgLmlycSA9IDI3IH0sCiAJeyAubmFtZSA9ICJ0eCIsIC5pcnEgPSA4MSB9LAogCXsgLm5hbWUgPSAicngiLCAuaXJxID0gODIgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDN4eHhfbWNic3A1X3NkbWFfY2hzW10gPSB7CiAJeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gMjIgfSwKIAl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSAyMSB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwM3h4eF9tY2JzcDVfYWRkcnNbXSA9IHsKQEAgLTI3MjIsNiArMjM4OSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODA5NjBmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9jb3JlIC0+IG1jYnNwNSAqLwpAQCAtMjczMCw3ICsyMzk4LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAzeHh4X21jYnNwNV9od21vZCwKIAkuY2xrCQk9ICJtY2JzcDVfaWNrIiwKIAkuYWRkcgkJPSBvbWFwM3h4eF9tY2JzcDVfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tY2JzcDVfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yNzQzLDkgKzI0MTAsNyBAQAogCS5uYW1lCQk9ICJtY2JzcDUiLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfbWNic3BfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDN4eHhfbWNic3A1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWNic3A1X2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwM3h4eF9tY2JzcDVfc2RtYV9jaHMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwNV9zZG1hX2NocyksCiAJLm1haW5fY2xrCT0gIm1jYnNwNV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMjc3Niw2ICsyNDQxLDcgQEAKIC8qIG1jYnNwMl9zaWRldG9uZSAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAzeHh4X21jYnNwMl9zaWRldG9uZV9pcnFzW10gPSB7CiAJeyAubmFtZSA9ICJpcnEiLCAuaXJxID0gNCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzeHh4X21jYnNwMl9zaWRldG9uZV9hZGRyc1tdID0gewpAQCAtMjc4NSw2ICsyNDUxLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ5MDI4MGZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBtY2JzcDJfc2lkZXRvbmUgKi8KQEAgLTI3OTMsNyArMjQ2MCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwM3h4eF9tY2JzcDJfc2lkZXRvbmVfaHdtb2QsCiAJLmNsawkJPSAibWNic3AyX2ljayIsCiAJLmFkZHIJCT0gb21hcDN4eHhfbWNic3AyX3NpZGV0b25lX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWNic3AyX3NpZGV0b25lX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC0yODA2LDcgKzI0NzIsNiBAQAogCS5uYW1lCQk9ICJtY2JzcDJfc2lkZXRvbmUiLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfbWNic3Bfc2lkZXRvbmVfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDN4eHhfbWNic3AyX3NpZGV0b25lX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWNic3AyX3NpZGV0b25lX2lycXMpLAogCS5tYWluX2Nsawk9ICJtY2JzcDJfZmNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTI4MjUsNiArMjQ5MCw3IEBACiAvKiBtY2JzcDNfc2lkZXRvbmUgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF9tY2JzcDNfc2lkZXRvbmVfaXJxc1tdID0gewogCXsgLm5hbWUgPSAiaXJxIiwgLmlycSA9IDUgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwM3h4eF9tY2JzcDNfc2lkZXRvbmVfYWRkcnNbXSA9IHsKQEAgLTI4MzQsNiArMjUwMCw3IEBACiAJCS5wYV9lbmQJCT0gMHg0OTAyQTBmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9wZXIgLT4gbWNic3AzX3NpZGV0b25lICovCkBAIC0yODQyLDcgKzI1MDksNiBAQAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfbWNic3AzX3NpZGV0b25lX2h3bW9kLAogCS5jbGsJCT0gIm1jYnNwM19pY2siLAogCS5hZGRyCQk9IG9tYXAzeHh4X21jYnNwM19zaWRldG9uZV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwM19zaWRldG9uZV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVLAogfTsKIApAQCAtMjg1NSw3ICsyNTIxLDYgQEAKIAkubmFtZQkJPSAibWNic3AzX3NpZGV0b25lIiwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X21jYnNwX3NpZGV0b25lX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXAzeHh4X21jYnNwM19zaWRldG9uZV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwM19zaWRldG9uZV9pcnFzKSwKIAkubWFpbl9jbGsJPSAibWNic3AzX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0zMDI1LDYgKzI2OTAsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X21haWxib3hfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDN4eHhfbWFpbGJveF9pcnFzW10gPSB7CiAJeyAuaXJxID0gMjYgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwM3h4eF9tYWlsYm94X2FkZHJzW10gPSB7CkBAIC0zMDMzLDYgKzI2OTksNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwOTQxZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X2NvcmUgLT4gbWFpbGJveCAqLwpAQCAtMzA0MCw3ICsyNzA3LDYgQEAKIAkubWFzdGVyCQk9ICZvbWFwM3h4eF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDN4eHhfbWFpbGJveF9od21vZCwKIAkuYWRkcgkJPSBvbWFwM3h4eF9tYWlsYm94X2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWFpbGJveF9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTMwNTMsNyArMjcxOSw2IEBACiAJLm5hbWUJCT0gIm1haWxib3giLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfbWFpbGJveF9od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwM3h4eF9tYWlsYm94X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWFpbGJveF9pcnFzKSwKIAkubWFpbl9jbGsJPSAibWFpbGJveGVzX2ljayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0zMDcwLDU2ICsyNzM1LDI5IEBACiB9OwogCiAvKiBsNCBjb3JlIC0+IG1jc3BpMSBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAzNHh4X21jc3BpMV9hZGRyX3NwYWNlW10gPSB7Ci0JewotCQkucGFfc3RhcnQJPSAweDQ4MDk4MDAwLAotCQkucGFfZW5kCQk9IDB4NDgwOTgwZmYsCi0JCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDM0eHhfbDRfY29yZV9fbWNzcGkxID0gewogCS5tYXN0ZXIJCT0gJm9tYXAzeHh4X2w0X2NvcmVfaHdtb2QsCiAJLnNsYXZlCQk9ICZvbWFwMzR4eF9tY3NwaTEsCiAJLmNsawkJPSAibWNzcGkxX2ljayIsCi0JLmFkZHIJCT0gb21hcDM0eHhfbWNzcGkxX2FkZHJfc3BhY2UsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTFfYWRkcl9zcGFjZSksCisJLmFkZHIJCT0gb21hcDJfbWNzcGkxX2FkZHJfc3BhY2UsCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKIC8qIGw0IGNvcmUgLT4gbWNzcGkyIGludGVyZmFjZSAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDM0eHhfbWNzcGkyX2FkZHJfc3BhY2VbXSA9IHsKLQl7Ci0JCS5wYV9zdGFydAk9IDB4NDgwOWEwMDAsCi0JCS5wYV9lbmQJCT0gMHg0ODA5YTBmZiwKLQkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVCwKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwMzR4eF9sNF9jb3JlX19tY3NwaTIgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDN4eHhfbDRfY29yZV9od21vZCwKIAkuc2xhdmUJCT0gJm9tYXAzNHh4X21jc3BpMiwKIAkuY2xrCQk9ICJtY3NwaTJfaWNrIiwKLQkuYWRkcgkJPSBvbWFwMzR4eF9tY3NwaTJfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzNHh4X21jc3BpMl9hZGRyX3NwYWNlKSwKKwkuYWRkcgkJPSBvbWFwMl9tY3NwaTJfYWRkcl9zcGFjZSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIAogLyogbDQgY29yZSAtPiBtY3NwaTMgaW50ZXJmYWNlICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMzR4eF9tY3NwaTNfYWRkcl9zcGFjZVtdID0gewotCXsKLQkJLnBhX3N0YXJ0CT0gMHg0ODBiODAwMCwKLQkJLnBhX2VuZAkJPSAweDQ4MGI4MGZmLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXAzNHh4X2w0X2NvcmVfX21jc3BpMyA9IHsKIAkubWFzdGVyCQk9ICZvbWFwM3h4eF9sNF9jb3JlX2h3bW9kLAogCS5zbGF2ZQkJPSAmb21hcDM0eHhfbWNzcGkzLAogCS5jbGsJCT0gIm1jc3BpM19pY2siLAotCS5hZGRyCQk9IG9tYXAzNHh4X21jc3BpM19hZGRyX3NwYWNlLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDM0eHhfbWNzcGkzX2FkZHJfc3BhY2UpLAorCS5hZGRyCQk9IG9tYXAyNDMwX21jc3BpM19hZGRyX3NwYWNlLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0zMTMwLDYgKzI3NjgsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwYmEwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQsCiAJfSwKKwl7IH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDM0eHhfbDRfY29yZV9fbWNzcGk0ID0gewpAQCAtMzEzNyw3ICsyNzc2LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXAzNHh4X21jc3BpNCwKIAkuY2xrCQk9ICJtY3NwaTRfaWNrIiwKIAkuYWRkcgkJPSBvbWFwMzR4eF9tY3NwaTRfYWRkcl9zcGFjZSwKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXAzNHh4X21jc3BpNF9hZGRyX3NwYWNlKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMzE2NSwyMSArMjgwMyw2IEBACiB9OwogCiAvKiBtY3NwaTEgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMzR4eF9tY3NwaTFfbXB1X2lycXNbXSA9IHsKLQl7IC5uYW1lID0gImlycSIsIC5pcnEgPSA2NSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAzNHh4X21jc3BpMV9zZG1hX3JlcXNbXSA9IHsKLQl7IC5uYW1lID0gInR4MCIsIC5kbWFfcmVxID0gMzUgfSwKLQl7IC5uYW1lID0gInJ4MCIsIC5kbWFfcmVxID0gMzYgfSwKLQl7IC5uYW1lID0gInR4MSIsIC5kbWFfcmVxID0gMzcgfSwKLQl7IC5uYW1lID0gInJ4MSIsIC5kbWFfcmVxID0gMzggfSwKLQl7IC5uYW1lID0gInR4MiIsIC5kbWFfcmVxID0gMzkgfSwKLQl7IC5uYW1lID0gInJ4MiIsIC5kbWFfcmVxID0gNDAgfSwKLQl7IC5uYW1lID0gInR4MyIsIC5kbWFfcmVxID0gNDEgfSwKLQl7IC5uYW1lID0gInJ4MyIsIC5kbWFfcmVxID0gNDIgfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAzNHh4X21jc3BpMV9zbGF2ZXNbXSA9IHsKIAkmb21hcDM0eHhfbDRfY29yZV9fbWNzcGkxLAogfTsKQEAgLTMxOTAsMTAgKzI4MTMsOCBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDM0eHhfbWNzcGkxID0gewogCS5uYW1lCQk9ICJtY3NwaTEiLAotCS5tcHVfaXJxcwk9IG9tYXAzNHh4X21jc3BpMV9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTFfbXB1X2lycXMpLAotCS5zZG1hX3JlcXMJPSBvbWFwMzR4eF9tY3NwaTFfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTFfc2RtYV9yZXFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9tY3NwaTFfbXB1X2lycXMsCisJLnNkbWFfcmVxcwk9IG9tYXAyX21jc3BpMV9zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gIm1jc3BpMV9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMzIxMiwxNyArMjgzMyw2IEBACiB9OwogCiAvKiBtY3NwaTIgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMzR4eF9tY3NwaTJfbXB1X2lycXNbXSA9IHsKLQl7IC5uYW1lID0gImlycSIsIC5pcnEgPSA2NiB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAzNHh4X21jc3BpMl9zZG1hX3JlcXNbXSA9IHsKLQl7IC5uYW1lID0gInR4MCIsIC5kbWFfcmVxID0gNDMgfSwKLQl7IC5uYW1lID0gInJ4MCIsIC5kbWFfcmVxID0gNDQgfSwKLQl7IC5uYW1lID0gInR4MSIsIC5kbWFfcmVxID0gNDUgfSwKLQl7IC5uYW1lID0gInJ4MSIsIC5kbWFfcmVxID0gNDYgfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAzNHh4X21jc3BpMl9zbGF2ZXNbXSA9IHsKIAkmb21hcDM0eHhfbDRfY29yZV9fbWNzcGkyLAogfTsKQEAgLTMyMzMsMTAgKzI4NDMsOCBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDM0eHhfbWNzcGkyID0gewogCS5uYW1lCQk9ICJtY3NwaTIiLAotCS5tcHVfaXJxcwk9IG9tYXAzNHh4X21jc3BpMl9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTJfbXB1X2lycXMpLAotCS5zZG1hX3JlcXMJPSBvbWFwMzR4eF9tY3NwaTJfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTJfc2RtYV9yZXFzKSwKKwkubXB1X2lycXMJPSBvbWFwMl9tY3NwaTJfbXB1X2lycXMsCisJLnNkbWFfcmVxcwk9IG9tYXAyX21jc3BpMl9zZG1hX3JlcXMsCiAJLm1haW5fY2xrCT0gIm1jc3BpMl9mY2siLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewpAQCAtMzI1Nyw2ICsyODY1LDcgQEAKIC8qIG1jc3BpMyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAzNHh4X21jc3BpM19tcHVfaXJxc1tdID0gewogCXsgLm5hbWUgPSAiaXJxIiwgLmlycSA9IDkxIH0sIC8qIDkxICovCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAzNHh4X21jc3BpM19zZG1hX3JlcXNbXSA9IHsKQEAgLTMyNjQsNiArMjg3Myw3IEBACiAJeyAubmFtZSA9ICJyeDAiLCAuZG1hX3JlcSA9IDE2IH0sCiAJeyAubmFtZSA9ICJ0eDEiLCAuZG1hX3JlcSA9IDIzIH0sCiAJeyAubmFtZSA9ICJyeDEiLCAuZG1hX3JlcSA9IDI0IH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAzNHh4X21jc3BpM19zbGF2ZXNbXSA9IHsKQEAgLTMyNzcsOSArMjg4Nyw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDM0eHhfbWNzcGkzID0gewogCS5uYW1lCQk9ICJtY3NwaTMiLAogCS5tcHVfaXJxcwk9IG9tYXAzNHh4X21jc3BpM19tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTNfbXB1X2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwMzR4eF9tY3NwaTNfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTNfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAibWNzcGkzX2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0zMzAwLDExICsyOTA4LDEzIEBACiAvKiBTUEk0ICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDM0eHhfbWNzcGk0X21wdV9pcnFzW10gPSB7CiAJeyAubmFtZSA9ICJpcnEiLCAuaXJxID0gSU5UXzM0WFhfU1BJNF9JUlEgfSwgLyogNDggKi8KKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDM0eHhfbWNzcGk0X3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgwIiwgLmRtYV9yZXEgPSA3MCB9LCAvKiBETUFfU1BJNF9UWDAgKi8KIAl7IC5uYW1lID0gInJ4MCIsIC5kbWFfcmVxID0gNzEgfSwgLyogRE1BX1NQSTRfUlgwICovCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgKm9tYXAzNHh4X21jc3BpNF9zbGF2ZXNbXSA9IHsKQEAgLTMzMTgsOSArMjkyOCw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDM0eHhfbWNzcGk0ID0gewogCS5uYW1lCQk9ICJtY3NwaTQiLAogCS5tcHVfaXJxcwk9IG9tYXAzNHh4X21jc3BpNF9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTRfbXB1X2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwMzR4eF9tY3NwaTRfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTRfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAibWNzcGk0X2ZjayIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CkBAIC0zMzYyLDEyICsyOTcwLDEyIEBACiAKIAl7IC5uYW1lID0gIm1jIiwgLmlycSA9IDkyIH0sCiAJeyAubmFtZSA9ICJkbWEiLCAuaXJxID0gOTMgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdXNiaHNvdGdfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInVzYl9vdGdfaHMiLAogCS5tcHVfaXJxcwk9IG9tYXAzeHh4X3VzYmhzb3RnX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3VzYmhzb3RnX21wdV9pcnFzKSwKIAkubWFpbl9jbGsJPSAiaHNvdGd1c2JfaWNrIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKQEAgLTMzOTksNiArMzAwNyw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gYW0zNXh4X3VzYmhzb3RnX21wdV9pcnFzW10gPSB7CiAKIAl7IC5uYW1lID0gIm1jIiwgLmlycSA9IDcxIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIGFtMzV4eF91c2JvdGdfY2xhc3MgPSB7CkBAIC0zNDA5LDcgKzMwMTgsNiBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIGFtMzV4eF91c2Joc290Z19od21vZCA9IHsKIAkubmFtZQkJPSAiYW0zNXhfb3RnX2hzIiwKIAkubXB1X2lycXMJPSBhbTM1eHhfdXNiaHNvdGdfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUoYW0zNXh4X3VzYmhzb3RnX21wdV9pcnFzKSwKIAkubWFpbl9jbGsJPSBOVUxMLAogCS5wcmNtID0gewogCQkub21hcDIgPSB7CkBAIC0zNDQ1LDExICszMDUzLDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMzR4eF9tbWMxX21wdV9pcnFzW10gPSB7CiAJeyAuaXJxID0gODMsIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAzNHh4X21tYzFfc2RtYV9yZXFzW10gPSB7CiAJeyAubmFtZSA9ICJ0eCIsCS5kbWFfcmVxID0gNjEsIH0sCiAJeyAubmFtZSA9ICJyeCIsCS5kbWFfcmVxID0gNjIsIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vcHRfY2xrIG9tYXAzNHh4X21tYzFfb3B0X2Nsa3NbXSA9IHsKQEAgLTM0NjcsOSArMzA3Nyw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfbW1jMV9od21vZCA9IHsKIAkubmFtZQkJPSAibW1jMSIsCiAJLm1wdV9pcnFzCT0gb21hcDM0eHhfbW1jMV9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tbWMxX21wdV9pcnFzKSwKIAkuc2RtYV9yZXFzCT0gb21hcDM0eHhfbW1jMV9zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzNHh4X21tYzFfc2RtYV9yZXFzKSwKIAkub3B0X2Nsa3MJPSBvbWFwMzR4eF9tbWMxX29wdF9jbGtzLAogCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzNHh4X21tYzFfb3B0X2Nsa3MpLAogCS5tYWluX2Nsawk9ICJtbWNoczFfZmNrIiwKQEAgLTM0OTMsMTEgKzMxMDEsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAzNHh4X21tYzJfbXB1X2lycXNbXSA9IHsKIAl7IC5pcnEgPSBJTlRfMjRYWF9NTUMyX0lSUSwgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDM0eHhfbW1jMl9zZG1hX3JlcXNbXSA9IHsKIAl7IC5uYW1lID0gInR4IiwJLmRtYV9yZXEgPSA0NywgfSwKIAl7IC5uYW1lID0gInJ4IiwJLmRtYV9yZXEgPSA0OCwgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29wdF9jbGsgb21hcDM0eHhfbW1jMl9vcHRfY2xrc1tdID0gewpAQCAtMzUxMSw5ICszMTIxLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF9tbWMyX2h3bW9kID0gewogCS5uYW1lCQk9ICJtbWMyIiwKIAkubXB1X2lycXMJPSBvbWFwMzR4eF9tbWMyX21wdV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzNHh4X21tYzJfbXB1X2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwMzR4eF9tbWMyX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDM0eHhfbW1jMl9zZG1hX3JlcXMpLAogCS5vcHRfY2xrcwk9IG9tYXAzNHh4X21tYzJfb3B0X2Nsa3MsCiAJLm9wdF9jbGtzX2NudAk9IEFSUkFZX1NJWkUob21hcDM0eHhfbW1jMl9vcHRfY2xrcyksCiAJLm1haW5fY2xrCT0gIm1tY2hzMl9mY2siLApAQCAtMzUzNiwxMSArMzE0NCwxMyBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDM0eHhfbW1jM19tcHVfaXJxc1tdID0gewogCXsgLmlycSA9IDk0LCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwMzR4eF9tbWMzX3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgiLAkuZG1hX3JlcSA9IDc3LCB9LAogCXsgLm5hbWUgPSAicngiLAkuZG1hX3JlcSA9IDc4LCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb3B0X2NsayBvbWFwMzR4eF9tbWMzX29wdF9jbGtzW10gPSB7CkBAIC0zNTU0LDkgKzMxNjQsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXAzeHh4X21tYzNfaHdtb2QgPSB7CiAJLm5hbWUJCT0gIm1tYzMiLAogCS5tcHVfaXJxcwk9IG9tYXAzNHh4X21tYzNfbXB1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDM0eHhfbW1jM19tcHVfaXJxcyksCiAJLnNkbWFfcmVxcwk9IG9tYXAzNHh4X21tYzNfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tbWMzX3NkbWFfcmVxcyksCiAJLm9wdF9jbGtzCT0gb21hcDM0eHhfbW1jM19vcHRfY2xrcywKIAkub3B0X2Nsa3NfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tbWMzX29wdF9jbGtzKSwKIAkubWFpbl9jbGsJPSAibW1jaHMzX2ZjayIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfNDR4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfNDR4eF9kYXRhLmMKaW5kZXggYWJjNTQ4YS4uZTAxMTQzNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzQ0eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF80NHh4X2RhdGEuYwpAQCAtODAsNyArODAsMTIgQEAKIAkubmFtZQk9ICJkbW0iLAogfTsKIAotLyogZG1tIGludGVyZmFjZSBkYXRhICovCisvKiBkbW0gKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF9kbW1faXJxc1tdID0geworCXsgLmlycSA9IDExMyArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9Cit9OworCiAvKiBsM19tYWluXzEgLT4gZG1tICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXA0NHh4X2wzX21haW5fMV9fZG1tID0gewogCS5tYXN0ZXIJCT0gJm9tYXA0NHh4X2wzX21haW5fMV9od21vZCwKQEAgLTk1LDYgKzEwMCw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ZTAwMDdmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBtcHUgLT4gZG1tICovCkBAIC0xMDMsNyArMTA5LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X2RtbV9od21vZCwKIAkuY2xrCQk9ICJsM19kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X2RtbV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2RtbV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVLAogfTsKIApAQCAtMTEzLDE3ICsxMTgsMTIgQEAKIAkmb21hcDQ0eHhfbXB1X19kbW0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfZG1tX2lycXNbXSA9IHsKLQl7IC5pcnEgPSAxMTMgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfZG1tX2h3bW9kID0gewogCS5uYW1lCQk9ICJkbW0iLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfZG1tX2h3bW9kX2NsYXNzLAorCS5tcHVfaXJxcwk9IG9tYXA0NHh4X2RtbV9pcnFzLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfZG1tX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZG1tX3NsYXZlcyksCi0JLm1wdV9pcnFzCT0gb21hcDQ0eHhfZG1tX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZG1tX2lycXMpLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKQEAgLTEzNSw3ICsxMzUsNyBAQAogCS5uYW1lCT0gImVtaWZfZnciLAogfTsKIAotLyogZW1pZl9mdyBpbnRlcmZhY2UgZGF0YSAqLworLyogZW1pZl9mdyAqLwogLyogZG1tIC0+IGVtaWZfZncgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDQ0eHhfZG1tX19lbWlmX2Z3ID0gewogCS5tYXN0ZXIJCT0gJm9tYXA0NHh4X2RtbV9od21vZCwKQEAgLTE1MCw2ICsxNTAsNyBAQAogCQkucGFfZW5kCQk9IDB4NGEyMGMwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfY2ZnIC0+IGVtaWZfZncgKi8KQEAgLTE1OCw3ICsxNTksNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfZW1pZl9md19od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X2VtaWZfZndfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9lbWlmX2Z3X2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC0xODQsNyArMTg0LDcgQEAKIAkubmFtZQk9ICJsMyIsCiB9OwogCi0vKiBsM19pbnN0ciBpbnRlcmZhY2UgZGF0YSAqLworLyogbDNfaW5zdHIgKi8KIC8qIGl2YSAtPiBsM19pbnN0ciAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwNDR4eF9pdmFfX2wzX2luc3RyID0gewogCS5tYXN0ZXIJCT0gJm9tYXA0NHh4X2l2YV9od21vZCwKQEAgLTIxNSw3ICsyMTUsMTMgQEAKIAkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCi0vKiBsM19tYWluXzEgaW50ZXJmYWNlIGRhdGEgKi8KKy8qIGwzX21haW5fMSAqLworc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X2wzX21haW5fMV9pcnFzW10gPSB7CisJeyAubmFtZSA9ICJkYmdfZXJyIiwgLmlycSA9IDkgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAubmFtZSA9ICJhcHBfZXJyIiwgLmlycSA9IDEwICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KK307CisKIC8qIGRzcCAtPiBsM19tYWluXzEgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYgb21hcDQ0eHhfZHNwX19sM19tYWluXzEgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDQ0eHhfZHNwX2h3bW9kLApAQCAtMjY0LDE4ICsyNzAsMTMgQEAKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIAotLyogTDMgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gYW5kIGVycm9yIGxvZyByZWdpc3RlcnMgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF9sM190YXJnX2lycXNbXSA9IHsKLQl7IC5pcnEgPSA5ICArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKLQl7IC5pcnEgPSAxMCArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X2wzX21haW5fMV9hZGRyc1tdID0gewogCXsKIAkJLnBhX3N0YXJ0CT0gMHg0NDAwMDAwMCwKIAkJLnBhX2VuZAkJPSAweDQ0MDAwZmZmLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAorCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIG1wdSAtPiBsM19tYWluXzEgKi8KQEAgLTI4NCw4ICsyODUsNyBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfbDNfbWFpbl8xX2h3bW9kLAogCS5jbGsJCT0gImwzX2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfbDNfbWFpbl8xX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbDNfbWFpbl8xX2FkZHJzKSwKLQkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAorCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKIC8qIGwzX21haW5fMSBzbGF2ZSBwb3J0cyAqLwpAQCAtMzAyLDE0ICszMDIsMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9sM19tYWluXzFfaHdtb2QgPSB7CiAJLm5hbWUJCT0gImwzX21haW5fMSIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9sM19od21vZF9jbGFzcywKLQkubXB1X2lycXMJPSBvbWFwNDR4eF9sM190YXJnX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbDNfdGFyZ19pcnFzKSwKKwkubXB1X2lycXMJPSBvbWFwNDR4eF9sM19tYWluXzFfaXJxcywKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2wzX21haW5fMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2wzX21haW5fMV9zbGF2ZXMpLAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKLS8qIGwzX21haW5fMiBpbnRlcmZhY2UgZGF0YSAqLworLyogbDNfbWFpbl8yICovCiAvKiBkbWFfc3lzdGVtIC0+IGwzX21haW5fMiAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwNDR4eF9kbWFfc3lzdGVtX19sM19tYWluXzIgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDQ0eHhfZG1hX3N5c3RlbV9od21vZCwKQEAgLTM1NCw4ICszNTMsOSBAQAogCXsKIAkJLnBhX3N0YXJ0CT0gMHg0NDgwMDAwMCwKIAkJLnBhX2VuZAkJPSAweDQ0ODAxZmZmLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAorCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGwzX21haW5fMSAtPiBsM19tYWluXzIgKi8KQEAgLTM2NCw4ICszNjQsNyBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfbDNfbWFpbl8yX2h3bW9kLAogCS5jbGsJCT0gImwzX2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfbDNfbWFpbl8yX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbDNfbWFpbl8yX2FkZHJzKSwKLQkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAorCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKIC8qIGw0X2NmZyAtPiBsM19tYWluXzIgKi8KQEAgLTQwNCwxMyArNDAzLDE0IEBACiAJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAotLyogbDNfbWFpbl8zIGludGVyZmFjZSBkYXRhICovCisvKiBsM19tYWluXzMgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X2wzX21haW5fM19hZGRyc1tdID0gewogCXsKIAkJLnBhX3N0YXJ0CT0gMHg0NTAwMDAwMCwKIAkJLnBhX2VuZAkJPSAweDQ1MDAwZmZmLAotCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JULAorCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGwzX21haW5fMSAtPiBsM19tYWluXzMgKi8KQEAgLTQxOSw4ICs0MTksNyBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfbDNfbWFpbl8zX2h3bW9kLAogCS5jbGsJCT0gImwzX2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfbDNfbWFpbl8zX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbDNfbWFpbl8zX2FkZHJzKSwKLQkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAorCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKIC8qIGwzX21haW5fMiAtPiBsM19tYWluXzMgKi8KQEAgLTQ2Miw3ICs0NjEsNyBAQAogCS5uYW1lCT0gImw0IiwKIH07CiAKLS8qIGw0X2FiZSBpbnRlcmZhY2UgZGF0YSAqLworLyogbDRfYWJlICovCiAvKiBhZXNzIC0+IGw0X2FiZSAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX29jcF9pZiBvbWFwNDR4eF9hZXNzX19sNF9hYmUgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDQ0eHhfYWVzc19od21vZCwKQEAgLTUxMSw3ICs1MTAsNyBAQAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKLS8qIGw0X2NmZyBpbnRlcmZhY2UgZGF0YSAqLworLyogbDRfY2ZnICovCiAvKiBsM19tYWluXzEgLT4gbDRfY2ZnICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXA0NHh4X2wzX21haW5fMV9fbDRfY2ZnID0gewogCS5tYXN0ZXIJCT0gJm9tYXA0NHh4X2wzX21haW5fMV9od21vZCwKQEAgLTUzMyw3ICs1MzIsNyBAQAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKLS8qIGw0X3BlciBpbnRlcmZhY2UgZGF0YSAqLworLyogbDRfcGVyICovCiAvKiBsM19tYWluXzIgLT4gbDRfcGVyICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXA0NHh4X2wzX21haW5fMl9fbDRfcGVyID0gewogCS5tYXN0ZXIJCT0gJm9tYXA0NHh4X2wzX21haW5fMl9od21vZCwKQEAgLTU1NSw3ICs1NTQsNyBAQAogCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKLS8qIGw0X3drdXAgaW50ZXJmYWNlIGRhdGEgKi8KKy8qIGw0X3drdXAgKi8KIC8qIGw0X2NmZyAtPiBsNF93a3VwICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXA0NHh4X2w0X2NmZ19fbDRfd2t1cCA9IHsKIAkubWFzdGVyCQk9ICZvbWFwNDR4eF9sNF9jZmdfaHdtb2QsCkBAIC01ODUsNyArNTg0LDcgQEAKIAkubmFtZQk9ICJtcHVfYnVzIiwKIH07CiAKLS8qIG1wdV9wcml2YXRlIGludGVyZmFjZSBkYXRhICovCisvKiBtcHVfcHJpdmF0ZSAqLwogLyogbXB1IC0+IG1wdV9wcml2YXRlICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmIG9tYXA0NHh4X21wdV9fbXB1X3ByaXZhdGUgPSB7CiAJLm1hc3RlcgkJPSAmb21hcDQ0eHhfbXB1X2h3bW9kLApAQCAtNjMzLDcgKzYzMiw5IEBACiAgKiAgZ3BtYwogICogIGdwdQogICogIGhkcTF3Ci0gKiAgaHNpCisgKiAgbWNhc3AKKyAqICBtcHVfYzAKKyAqICBtcHVfYzEKICAqICBvY21jX3JhbQogICogIG9jcDJzY3BfdXNiX3BoeQogICogIG9jcF93cF9ub2MKQEAgLTY2MCw3ICs2NjEsOCBAQAogCS5zeXNjX29mZnMJPSAweDAwMTAsCiAJLnN5c2NfZmxhZ3MJPSAoU1lTQ19IQVNfTUlETEVNT0RFIHwgU1lTQ19IQVNfU0lETEVNT0RFKSwKIAkuaWRsZW1vZGVzCT0gKFNJRExFX0ZPUkNFIHwgU0lETEVfTk8gfCBTSURMRV9TTUFSVCB8Ci0JCQkgICBNU1RBTkRCWV9GT1JDRSB8IE1TVEFOREJZX05PIHwgTVNUQU5EQllfU01BUlQpLAorCQkJICAgTVNUQU5EQllfRk9SQ0UgfCBNU1RBTkRCWV9OTyB8IE1TVEFOREJZX1NNQVJUIHwKKwkJCSAgIE1TVEFOREJZX1NNQVJUX1dLVVApLAogCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTIsCiB9OwogCkBAIC02NzIsNiArNjc0LDcgQEAKIC8qIGFlc3MgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF9hZXNzX2lycXNbXSA9IHsKIAl7IC5pcnEgPSA5OSArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDQ0eHhfYWVzc19zZG1hX3JlcXNbXSA9IHsKQEAgLTY4Myw2ICs2ODYsNyBAQAogCXsgLm5hbWUgPSAiZmlmbzUiLCAuZG1hX3JlcSA9IDEwNSArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKIAl7IC5uYW1lID0gImZpZm82IiwgLmRtYV9yZXEgPSAxMDYgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCiAJeyAubmFtZSA9ICJmaWZvNyIsIC5kbWFfcmVxID0gMTA3ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiAvKiBhZXNzIG1hc3RlciBwb3J0cyAqLwpAQCAtNjk2LDYgKzcwMCw3IEBACiAJCS5wYV9lbmQJCT0gMHg0MDFmMTNmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9hYmUgLT4gYWVzcyAqLwpAQCAtNzA0LDcgKzcwOSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9hZXNzX2h3bW9kLAogCS5jbGsJCT0gIm9jcF9hYmVfaWNsayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfYWVzc19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Flc3NfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKQEAgLTcxNCw2ICs3MTgsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwZjEzZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfYWJlIC0+IGFlc3MgKGRtYSkgKi8KQEAgLTcyMiw3ICs3MjcsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfYWVzc19od21vZCwKIAkuY2xrCQk9ICJvY3BfYWJlX2ljbGsiLAogCS5hZGRyCQk9IG9tYXA0NHh4X2Flc3NfZG1hX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfYWVzc19kbWFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC03MzYsMTEgKzc0MCw5IEBACiAJLm5hbWUJCT0gImFlc3MiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfYWVzc19od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9hZXNzX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfYWVzc19pcnFzKSwKIAkuc2RtYV9yZXFzCT0gb21hcDQ0eHhfYWVzc19zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Flc3Nfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAiYWVzc19mY2siLAotCS5wcmNtCQk9IHsKKwkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewogCQkJLmNsa2N0cmxfcmVnID0gT01BUDQ0MzBfQ00xX0FCRV9BRVNTX0NMS0NUUkwsCiAJCX0sCkBAIC03NjksNyArNzcxLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9iYW5kZ2FwX2h3bW9kID0gewogCS5uYW1lCQk9ICJiYW5kZ2FwIiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X2JhbmRnYXBfaHdtb2RfY2xhc3MsCi0JLnByY20JCT0geworCS5wcmNtID0gewogCQkub21hcDQgPSB7CiAJCQkuY2xrY3RybF9yZWcgPSBPTUFQNDQzMF9DTV9XS1VQX0JBTkRHQVBfQ0xLQ1RSTCwKIAkJfSwKQEAgLTgwNiw2ICs4MDgsNyBAQAogCQkucGFfZW5kCQk9IDB4NGEzMDQwMWYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfd2t1cCAtPiBjb3VudGVyXzMyayAqLwpAQCAtODE0LDcgKzgxNyw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9jb3VudGVyXzMya19od21vZCwKIAkuY2xrCQk9ICJsNF93a3VwX2Nsa19tdXhfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X2NvdW50ZXJfMzJrX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfY291bnRlcl8zMmtfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC04MjgsNyArODMwLDcgQEAKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X2NvdW50ZXJfaHdtb2RfY2xhc3MsCiAJLmZsYWdzCQk9IEhXTU9EX1NXU1VQX1NJRExFLAogCS5tYWluX2Nsawk9ICJzeXNfMzJrX2NrIiwKLQkucHJjbQkJPSB7CisJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKIAkJCS5jbGtjdHJsX3JlZyA9IE9NQVA0NDMwX0NNX1dLVVBfU1lOQ1RJTUVSX0NMS0NUUkwsCiAJCX0sCkBAIC04NzUsNiArODc3LDcgQEAKIAl7IC5uYW1lID0gIjEiLCAuaXJxID0gMTMgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCiAJeyAubmFtZSA9ICIyIiwgLmlycSA9IDE0ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAogCXsgLm5hbWUgPSAiMyIsIC5pcnEgPSAxNSArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiAvKiBkbWFfc3lzdGVtIG1hc3RlciBwb3J0cyAqLwpAQCAtODg4LDYgKzg5MSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0YTA1NmZmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9jZmcgLT4gZG1hX3N5c3RlbSAqLwpAQCAtODk2LDcgKzkwMCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9kbWFfc3lzdGVtX2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfZG1hX3N5c3RlbV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2RtYV9zeXN0ZW1fYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC05MDksNyArOTEyLDYgQEAKIAkubmFtZQkJPSAiZG1hX3N5c3RlbSIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9kbWFfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfZG1hX3N5c3RlbV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2RtYV9zeXN0ZW1faXJxcyksCiAJLm1haW5fY2xrCT0gImwzX2Rpdl9jayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTk0OCwxMCArOTUwLDEyIEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfZG1pY19od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF9kbWljX2lycXNbXSA9IHsKIAl7IC5pcnEgPSAxMTQgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXA0NHh4X2RtaWNfc2RtYV9yZXFzW10gPSB7CiAJeyAuZG1hX3JlcSA9IDY2ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF9kbWljX2FkZHJzW10gPSB7CkBAIC05NjAsNiArOTY0LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQwMTJlMDdmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X2FiZSAtPiBkbWljICovCkBAIC05NjgsNyArOTczLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X2RtaWNfaHdtb2QsCiAJLmNsawkJPSAib2NwX2FiZV9pY2xrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9kbWljX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZG1pY19hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVLAogfTsKIApAQCAtOTc4LDYgKzk4Miw3IEBACiAJCS5wYV9lbmQJCT0gMHg0OTAyZTA3ZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9hYmUgLT4gZG1pYyAoZG1hKSAqLwpAQCAtOTg2LDcgKzk5MSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9kbWljX2h3bW9kLAogCS5jbGsJCT0gIm9jcF9hYmVfaWNsayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfZG1pY19kbWFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kbWljX2RtYV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTEwMDAsMTEgKzEwMDQsOSBAQAogCS5uYW1lCQk9ICJkbWljIiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X2RtaWNfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfZG1pY19pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2RtaWNfaXJxcyksCiAJLnNkbWFfcmVxcwk9IG9tYXA0NHh4X2RtaWNfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kbWljX3NkbWFfcmVxcyksCiAJLm1haW5fY2xrCT0gImRtaWNfZmNrIiwKLQkucHJjbQkJPSB7CisJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKIAkJCS5jbGtjdHJsX3JlZyA9IE9NQVA0NDMwX0NNMV9BQkVfRE1JQ19DTEtDVFJMLAogCQl9LApAQCAtMTAyNiw2ICsxMDI4LDcgQEAKIC8qIGRzcCAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X2RzcF9pcnFzW10gPSB7CiAJeyAuaXJxID0gMjggKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX3JzdF9pbmZvIG9tYXA0NHh4X2RzcF9yZXNldHNbXSA9IHsKQEAgLTEwODIsNyArMTA4NSw2IEBACiAJLm5hbWUJCT0gImRzcCIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9kc3BfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfZHNwX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNwX2lycXMpLAogCS5yc3RfbGluZXMJPSBvbWFwNDR4eF9kc3BfcmVzZXRzLAogCS5yc3RfbGluZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3BfcmVzZXRzKSwKIAkubWFpbl9jbGsJPSAiZHNwX2ZjayIsCkBAIC0xMTI3LDYgKzExMjksNyBAQAogCQkucGFfZW5kCQk9IDB4NTgwMDAwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDNfbWFpbl8yIC0+IGRzcyAqLwpAQCAtMTEzNSw3ICsxMTM4LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X2Rzc19od21vZCwKIAkuY2xrCQk9ICJsM19kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X2Rzc19kbWFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfZG1hX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTE0NSw2ICsxMTQ3LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDQwMDdmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBkc3MgKi8KQEAgLTExNTMsNyArMTE1Niw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9kc3NfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9kc3NfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKQEAgLTEyMTUsMTAgKzEyMTcsMTIgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9kc3NfZGlzcGNfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfZHNzX2Rpc3BjX2lycXNbXSA9IHsKIAl7IC5pcnEgPSAyNSArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDQ0eHhfZHNzX2Rpc3BjX3NkbWFfcmVxc1tdID0gewogCXsgLmRtYV9yZXEgPSA1ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF9kc3NfZGlzcGNfZG1hX2FkZHJzW10gPSB7CkBAIC0xMjI3LDYgKzEyMzEsNyBAQAogCQkucGFfZW5kCQk9IDB4NTgwMDFmZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDNfbWFpbl8yIC0+IGRzc19kaXNwYyAqLwpAQCAtMTIzNSw3ICsxMjQwLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X2Rzc19kaXNwY19od21vZCwKIAkuY2xrCQk9ICJsM19kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X2Rzc19kaXNwY19kbWFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfZGlzcGNfZG1hX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTI0NSw2ICsxMjQ5LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDQxZmZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBkc3NfZGlzcGMgKi8KQEAgLTEyNTMsNyArMTI1OCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9kc3NfZGlzcGNfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9kc3NfZGlzcGNfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfZGlzcGNfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKQEAgLTEyNjcsOSArMTI3MSw3IEBACiAJLm5hbWUJCT0gImRzc19kaXNwYyIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9kaXNwY19od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9kc3NfZGlzcGNfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfZGlzcGNfaXJxcyksCiAJLnNkbWFfcmVxcwk9IG9tYXA0NHh4X2Rzc19kaXNwY19zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19kaXNwY19zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJkc3NfZmNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtMTMwNiwxMCArMTMwOCwxMiBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X2Rzc19kc2kxX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X2Rzc19kc2kxX2lycXNbXSA9IHsKIAl7IC5pcnEgPSA1MyArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDQ0eHhfZHNzX2RzaTFfc2RtYV9yZXFzW10gPSB7CiAJeyAuZG1hX3JlcSA9IDc0ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF9kc3NfZHNpMV9kbWFfYWRkcnNbXSA9IHsKQEAgLTEzMTgsNiArMTMyMiw3IEBACiAJCS5wYV9lbmQJCT0gMHg1ODAwNDFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsM19tYWluXzIgLT4gZHNzX2RzaTEgKi8KQEAgLTEzMjYsNyArMTMzMSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9kc3NfZHNpMV9od21vZCwKIAkuY2xrCQk9ICJsM19kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X2Rzc19kc2kxX2RtYV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19kc2kxX2RtYV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTEzMzYsNiArMTM0MCw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODA0NDFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9wZXIgLT4gZHNzX2RzaTEgKi8KQEAgLTEzNDQsNyArMTM0OSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9kc3NfZHNpMV9od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X2Rzc19kc2kxX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNzX2RzaTFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKQEAgLTEzNTgsOSArMTM2Miw3IEBACiAJLm5hbWUJCT0gImRzc19kc2kxIiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X2RzaV9od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9kc3NfZHNpMV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19kc2kxX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9kc3NfZHNpMV9zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19kc2kxX3NkbWFfcmVxcyksCiAJLm1haW5fY2xrCT0gImRzc19mY2siLAogCS5wcmNtID0gewogCQkub21hcDQgPSB7CkBAIC0xMzc2LDEwICsxMzc4LDEyIEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfZHNzX2RzaTJfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfZHNzX2RzaTJfaXJxc1tdID0gewogCXsgLmlycSA9IDg0ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9kc3NfZHNpMl9zZG1hX3JlcXNbXSA9IHsKIAl7IC5kbWFfcmVxID0gODMgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X2Rzc19kc2kyX2RtYV9hZGRyc1tdID0gewpAQCAtMTM4OCw2ICsxMzkyLDcgQEAKIAkJLnBhX2VuZAkJPSAweDU4MDA1MWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGwzX21haW5fMiAtPiBkc3NfZHNpMiAqLwpAQCAtMTM5Niw3ICsxNDAxLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X2Rzc19kc2kyX2h3bW9kLAogCS5jbGsJCT0gImwzX2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfZHNzX2RzaTJfZG1hX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNzX2RzaTJfZG1hX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTQwNiw2ICsxNDEwLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDQ1MWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBkc3NfZHNpMiAqLwpAQCAtMTQxNCw3ICsxNDE5LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X2Rzc19kc2kyX2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfZHNzX2RzaTJfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfZHNpMl9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVLAogfTsKIApAQCAtMTQyOCw5ICsxNDMyLDcgQEAKIAkubmFtZQkJPSAiZHNzX2RzaTIiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfZHNpX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X2Rzc19kc2kyX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNzX2RzaTJfaXJxcyksCiAJLnNkbWFfcmVxcwk9IG9tYXA0NHh4X2Rzc19kc2kyX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNzX2RzaTJfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAiZHNzX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTE0NjYsMTAgKzE0NjgsMTIgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9kc3NfaGRtaV9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF9kc3NfaGRtaV9pcnFzW10gPSB7CiAJeyAuaXJxID0gMTAxICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9kc3NfaGRtaV9zZG1hX3JlcXNbXSA9IHsKIAl7IC5kbWFfcmVxID0gNzUgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X2Rzc19oZG1pX2RtYV9hZGRyc1tdID0gewpAQCAtMTQ3OCw2ICsxNDgyLDcgQEAKIAkJLnBhX2VuZAkJPSAweDU4MDA2ZmZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGwzX21haW5fMiAtPiBkc3NfaGRtaSAqLwpAQCAtMTQ4Niw3ICsxNDkxLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X2Rzc19oZG1pX2h3bW9kLAogCS5jbGsJCT0gImwzX2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfZHNzX2hkbWlfZG1hX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNzX2hkbWlfZG1hX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTQ5Niw2ICsxNTAwLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDQ2ZmZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBkc3NfaGRtaSAqLwpAQCAtMTUwNCw3ICsxNTA5LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X2Rzc19oZG1pX2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfZHNzX2hkbWlfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfaGRtaV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVLAogfTsKIApAQCAtMTUxOCw5ICsxNTIyLDcgQEAKIAkubmFtZQkJPSAiZHNzX2hkbWkiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfaGRtaV9od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9kc3NfaGRtaV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19oZG1pX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9kc3NfaGRtaV9zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19oZG1pX3NkbWFfcmVxcyksCiAJLm1haW5fY2xrCT0gImRzc19mY2siLAogCS5wcmNtID0gewogCQkub21hcDQgPSB7CkBAIC0xNTU2LDYgKzE1NTgsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X2Rzc19yZmJpX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXA0NHh4X2Rzc19yZmJpX3NkbWFfcmVxc1tdID0gewogCXsgLmRtYV9yZXEgPSAxMyArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfZHNzX3JmYmlfZG1hX2FkZHJzW10gPSB7CkBAIC0xNTY0LDYgKzE1NjcsNyBAQAogCQkucGFfZW5kCQk9IDB4NTgwMDIwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDNfbWFpbl8yIC0+IGRzc19yZmJpICovCkBAIC0xNTcyLDcgKzE1NzYsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfZHNzX3JmYmlfaHdtb2QsCiAJLmNsawkJPSAibDNfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9kc3NfcmZiaV9kbWFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfcmZiaV9kbWFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0xNTgyLDYgKzE1ODUsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwNDIwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IGRzc19yZmJpICovCkBAIC0xNTkwLDcgKzE1OTQsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfZHNzX3JmYmlfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9kc3NfcmZiaV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19yZmJpX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC0xNjA0LDcgKzE2MDcsNiBAQAogCS5uYW1lCQk9ICJkc3NfcmZiaSIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9yZmJpX2h3bW9kX2NsYXNzLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9kc3NfcmZiaV9zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19yZmJpX3NkbWFfcmVxcyksCiAJLm1haW5fY2xrCT0gImRzc19mY2siLAogCS5wcmNtID0gewogCQkub21hcDQgPSB7CkBAIC0xNjMzLDYgKzE2MzUsNyBAQAogCQkucGFfZW5kCQk9IDB4NTgwMDMwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDNfbWFpbl8yIC0+IGRzc192ZW5jICovCkBAIC0xNjQxLDcgKzE2NDQsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfZHNzX3ZlbmNfaHdtb2QsCiAJLmNsawkJPSAibDNfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9kc3NfdmVuY19kbWFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfdmVuY19kbWFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0xNjUxLDYgKzE2NTMsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwNDMwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IGRzc192ZW5jICovCkBAIC0xNjU5LDcgKzE2NjIsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfZHNzX3ZlbmNfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9kc3NfdmVuY19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc192ZW5jX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC0xNzE2LDYgKzE3MTgsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X2dwaW8xX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X2dwaW8xX2lycXNbXSA9IHsKIAl7IC5pcnEgPSAyOSArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF9ncGlvMV9hZGRyc1tdID0gewpAQCAtMTcyNCw2ICsxNzI3LDcgQEAKIAkJLnBhX2VuZAkJPSAweDRhMzEwMWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3drdXAgLT4gZ3BpbzEgKi8KQEAgLTE3MzIsNyArMTczNiw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9ncGlvMV9od21vZCwKIAkuY2xrCQk9ICJsNF93a3VwX2Nsa19tdXhfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X2dwaW8xX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZ3BpbzFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0xNzQ5LDcgKzE3NTIsNiBAQAogCS5uYW1lCQk9ICJncGlvMSIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X2dwaW8xX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZ3BpbzFfaXJxcyksCiAJLm1haW5fY2xrCT0gImdwaW8xX2ljayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTE3NjgsNiArMTc3MCw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfZ3BpbzJfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfZ3BpbzJfaXJxc1tdID0gewogCXsgLmlycSA9IDMwICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X2dwaW8yX2FkZHJzW10gPSB7CkBAIC0xNzc2LDYgKzE3NzksNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwNTUxZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IGdwaW8yICovCkBAIC0xNzg0LDcgKzE3ODgsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfZ3BpbzJfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9ncGlvMl9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2dwaW8yX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTgwMiw3ICsxODA1LDYgQEAKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmZsYWdzCQk9IEhXTU9EX0NPTlRST0xfT1BUX0NMS1NfSU5fUkVTRVQsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfZ3BpbzJfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9ncGlvMl9pcnFzKSwKIAkubWFpbl9jbGsJPSAiZ3BpbzJfaWNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtMTgyMSw2ICsxODIzLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9ncGlvM19od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF9ncGlvM19pcnFzW10gPSB7CiAJeyAuaXJxID0gMzEgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfZ3BpbzNfYWRkcnNbXSA9IHsKQEAgLTE4MjksNiArMTgzMiw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODA1NzFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9wZXIgLT4gZ3BpbzMgKi8KQEAgLTE4MzcsNyArMTg0MSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9ncGlvM19od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X2dwaW8zX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZ3BpbzNfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0xODU1LDcgKzE4NTgsNiBAQAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZmxhZ3MJCT0gSFdNT0RfQ09OVFJPTF9PUFRfQ0xLU19JTl9SRVNFVCwKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9ncGlvM19pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2dwaW8zX2lycXMpLAogCS5tYWluX2Nsawk9ICJncGlvM19pY2siLAogCS5wcmNtID0gewogCQkub21hcDQgPSB7CkBAIC0xODc0LDYgKzE4NzYsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X2dwaW80X2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X2dwaW80X2lycXNbXSA9IHsKIAl7IC5pcnEgPSAzMiArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF9ncGlvNF9hZGRyc1tdID0gewpAQCAtMTg4Miw2ICsxODg1LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDU5MWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBncGlvNCAqLwpAQCAtMTg5MCw3ICsxODk0LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X2dwaW80X2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfZ3BpbzRfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9ncGlvNF9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTE5MDgsNyArMTkxMSw2IEBACiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5mbGFncwkJPSBIV01PRF9DT05UUk9MX09QVF9DTEtTX0lOX1JFU0VULAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X2dwaW80X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZ3BpbzRfaXJxcyksCiAJLm1haW5fY2xrCT0gImdwaW80X2ljayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTE5MjcsNiArMTkyOSw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfZ3BpbzVfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfZ3BpbzVfaXJxc1tdID0gewogCXsgLmlycSA9IDMzICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X2dwaW81X2FkZHJzW10gPSB7CkBAIC0xOTM1LDYgKzE5MzgsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwNWIxZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IGdwaW81ICovCkBAIC0xOTQzLDcgKzE5NDcsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfZ3BpbzVfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9ncGlvNV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2dwaW81X2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMTk2MSw3ICsxOTY0LDYgQEAKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmZsYWdzCQk9IEhXTU9EX0NPTlRST0xfT1BUX0NMS1NfSU5fUkVTRVQsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfZ3BpbzVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9ncGlvNV9pcnFzKSwKIAkubWFpbl9jbGsJPSAiZ3BpbzVfaWNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtMTk4MCw2ICsxOTgyLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9ncGlvNl9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF9ncGlvNl9pcnFzW10gPSB7CiAJeyAuaXJxID0gMzQgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfZ3BpbzZfYWRkcnNbXSA9IHsKQEAgLTE5ODgsNiArMTk5MSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODA1ZDFmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9wZXIgLT4gZ3BpbzYgKi8KQEAgLTE5OTYsNyArMjAwMCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9ncGlvNl9od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X2dwaW82X2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZ3BpbzZfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yMDE0LDcgKzIwMTcsNiBAQAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZmxhZ3MJCT0gSFdNT0RfQ09OVFJPTF9PUFRfQ0xLU19JTl9SRVNFVCwKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9ncGlvNl9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2dwaW82X2lycXMpLAogCS5tYWluX2Nsawk9ICJncGlvNl9pY2siLAogCS5wcmNtID0gewogCQkub21hcDQgPSB7CkBAIC0yMDQ0LDcgKzIwNDYsNyBAQAogCQkJICAgU1lTQ19IQVNfU09GVFJFU0VUIHwgU1lTU19IQVNfUkVTRVRfU1RBVFVTKSwKIAkuaWRsZW1vZGVzCT0gKFNJRExFX0ZPUkNFIHwgU0lETEVfTk8gfCBTSURMRV9TTUFSVCB8CiAJCQkgICBTSURMRV9TTUFSVF9XS1VQIHwgTVNUQU5EQllfRk9SQ0UgfCBNU1RBTkRCWV9OTyB8Ci0JCQkgICBNU1RBTkRCWV9TTUFSVCksCisJCQkgICBNU1RBTkRCWV9TTUFSVCB8IE1TVEFOREJZX1NNQVJUX1dLVVApLAogCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCiB9OwogCkBAIC0yMDU4LDYgKzIwNjAsNyBAQAogCXsgLm5hbWUgPSAibXB1X3AxIiwgLmlycSA9IDY3ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAogCXsgLm5hbWUgPSAibXB1X3AyIiwgLmlycSA9IDY4ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAogCXsgLm5hbWUgPSAibXB1X2RtYSIsIC5pcnEgPSA3MSArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiAvKiBoc2kgbWFzdGVyIHBvcnRzICovCkBAIC0yMDcxLDYgKzIwNzQsNyBAQAogCQkucGFfZW5kCQk9IDB4NGEwNWJmZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfY2ZnIC0+IGhzaSAqLwpAQCAtMjA3OSw3ICsyMDgzLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X2hzaV9od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X2hzaV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2hzaV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTIwOTIsOSArMjA5NSw4IEBACiAJLm5hbWUJCT0gImhzaSIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9oc2lfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfaHNpX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaHNpX2lycXMpLAogCS5tYWluX2Nsawk9ICJoc2lfZmNrIiwKLQkucHJjbQkJPSB7CisJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKIAkJCS5jbGtjdHJsX3JlZyA9IE9NQVA0NDMwX0NNX0wzSU5JVF9IU0lfQ0xLQ1RSTCwKIAkJfSwKQEAgLTIxMzEsMTEgKzIxMzMsMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9pMmMxX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X2kyYzFfaXJxc1tdID0gewogCXsgLmlycSA9IDU2ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9pMmMxX3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IDI2ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDI3ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF9pMmMxX2FkZHJzW10gPSB7CkBAIC0yMTQ0LDYgKzIxNDgsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwNzAwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IGkyYzEgKi8KQEAgLTIxNTIsNyArMjE1Nyw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9pMmMxX2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfaTJjMV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2kyYzFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yMTY2LDkgKzIxNzAsNyBAQAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfaTJjX2h3bW9kX2NsYXNzLAogCS5mbGFncwkJPSBIV01PRF9JTklUX05PX1JFU0VULAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X2kyYzFfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pMmMxX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9pMmMxX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaTJjMV9zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJpMmMxX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTIxODQsMTEgKzIxODYsMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9pMmMyX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X2kyYzJfaXJxc1tdID0gewogCXsgLmlycSA9IDU3ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9pMmMyX3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IDI4ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDI5ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF9pMmMyX2FkZHJzW10gPSB7CkBAIC0yMTk3LDYgKzIyMDEsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwNzIwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IGkyYzIgKi8KQEAgLTIyMDUsNyArMjIxMCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9pMmMyX2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfaTJjMl9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2kyYzJfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yMjE5LDkgKzIyMjMsNyBAQAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfaTJjX2h3bW9kX2NsYXNzLAogCS5mbGFncwkJPSBIV01PRF9JTklUX05PX1JFU0VULAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X2kyYzJfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pMmMyX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9pMmMyX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaTJjMl9zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJpMmMyX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTIyMzcsMTEgKzIyMzksMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9pMmMzX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X2kyYzNfaXJxc1tdID0gewogCXsgLmlycSA9IDYxICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9pMmMzX3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IDI0ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDI1ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF9pMmMzX2FkZHJzW10gPSB7CkBAIC0yMjUwLDYgKzIyNTQsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwNjAwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IGkyYzMgKi8KQEAgLTIyNTgsNyArMjI2Myw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9pMmMzX2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfaTJjM19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2kyYzNfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yMjcyLDkgKzIyNzYsNyBAQAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfaTJjX2h3bW9kX2NsYXNzLAogCS5mbGFncwkJPSBIV01PRF9JTklUX05PX1JFU0VULAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X2kyYzNfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pMmMzX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9pMmMzX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaTJjM19zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJpMmMzX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTIyOTAsMTEgKzIyOTIsMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9pMmM0X2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X2kyYzRfaXJxc1tdID0gewogCXsgLmlycSA9IDYyICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9pMmM0X3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IDEyMyArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKIAl7IC5uYW1lID0gInJ4IiwgLmRtYV9yZXEgPSAxMjQgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X2kyYzRfYWRkcnNbXSA9IHsKQEAgLTIzMDMsNiArMjMwNyw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODM1MDBmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9wZXIgLT4gaTJjNCAqLwpAQCAtMjMxMSw3ICsyMzE2LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X2kyYzRfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9pMmM0X2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaTJjNF9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTIzMjUsOSArMjMyOSw3IEBACiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9pMmNfaHdtb2RfY2xhc3MsCiAJLmZsYWdzCQk9IEhXTU9EX0lOSVRfTk9fUkVTRVQsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfaTJjNF9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2kyYzRfaXJxcyksCiAJLnNkbWFfcmVxcwk9IG9tYXA0NHh4X2kyYzRfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pMmM0X3NkbWFfcmVxcyksCiAJLm1haW5fY2xrCT0gImkyYzRfZmNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtMjM1MSw2ICsyMzUzLDcgQEAKIC8qIGlwdSAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X2lwdV9pcnFzW10gPSB7CiAJeyAuaXJxID0gMTAwICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9yc3RfaW5mbyBvbWFwNDR4eF9pcHVfYzBfcmVzZXRzW10gPSB7CkBAIC0yMzkwLDcgKzIzOTMsNyBAQAogCS5mbGFncwkJPSBIV01PRF9JTklUX05PX1JFU0VULAogCS5yc3RfbGluZXMJPSBvbWFwNDR4eF9pcHVfYzBfcmVzZXRzLAogCS5yc3RfbGluZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pcHVfYzBfcmVzZXRzKSwKLQkucHJjbQkJPSB7CisJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKIAkJCS5yc3RjdHJsX3JlZyA9IE9NQVA0NDMwX1JNX0RVQ0FUSV9SU1RDVFJMLAogCQl9LApAQCAtMjQwNSw3ICsyNDA4LDcgQEAKIAkuZmxhZ3MJCT0gSFdNT0RfSU5JVF9OT19SRVNFVCwKIAkucnN0X2xpbmVzCT0gb21hcDQ0eHhfaXB1X2MxX3Jlc2V0cywKIAkucnN0X2xpbmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaXB1X2MxX3Jlc2V0cyksCi0JLnByY20JCT0geworCS5wcmNtID0gewogCQkub21hcDQgPSB7CiAJCQkucnN0Y3RybF9yZWcgPSBPTUFQNDQzMF9STV9EVUNBVElfUlNUQ1RSTCwKIAkJfSwKQEAgLTI0MTcsMTEgKzI0MjAsMTAgQEAKIAkubmFtZQkJPSAiaXB1IiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X2lwdV9od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9pcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pcHVfaXJxcyksCiAJLnJzdF9saW5lcwk9IG9tYXA0NHh4X2lwdV9yZXNldHMsCiAJLnJzdF9saW5lc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2lwdV9yZXNldHMpLAogCS5tYWluX2Nsawk9ICJpcHVfZmNrIiwKLQkucHJjbQkJPSB7CisJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKIAkJCS5jbGtjdHJsX3JlZyA9IE9NQVA0NDMwX0NNX0RVQ0FUSV9EVUNBVElfQ0xLQ1RSTCwKIAkJCS5yc3RjdHJsX3JlZyA9IE9NQVA0NDMwX1JNX0RVQ0FUSV9SU1RDVFJMLApAQCAtMjQ0Niw3ICsyNDQ4LDcgQEAKIAkJCSAgIFNZU0NfSEFTX1NJRExFTU9ERSB8IFNZU0NfSEFTX1NPRlRSRVNFVCksCiAJLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQgfAogCQkJICAgU0lETEVfU01BUlRfV0tVUCB8IE1TVEFOREJZX0ZPUkNFIHwgTVNUQU5EQllfTk8gfAotCQkJICAgTVNUQU5EQllfU01BUlQpLAorCQkJICAgTVNUQU5EQllfU01BUlQgfCBNU1RBTkRCWV9TTUFSVF9XS1VQKSwKIAkuc3lzY19maWVsZHMJPSAmb21hcF9od21vZF9zeXNjX3R5cGUyLAogfTsKIApAQCAtMjQ1OCw2ICsyNDYwLDcgQEAKIC8qIGlzcyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X2lzc19pcnFzW10gPSB7CiAJeyAuaXJxID0gMjQgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXA0NHh4X2lzc19zZG1hX3JlcXNbXSA9IHsKQEAgLTI0NjUsNiArMjQ2OCw3IEBACiAJeyAubmFtZSA9ICIyIiwgLmRtYV9yZXEgPSA5ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAiMyIsIC5kbWFfcmVxID0gMTEgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCiAJeyAubmFtZSA9ICI0IiwgLmRtYV9yZXEgPSAxMiArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQogfTsKIAogLyogaXNzIG1hc3RlciBwb3J0cyAqLwpAQCAtMjQ3OCw2ICsyNDgyLDcgQEAKIAkJLnBhX2VuZAkJPSAweDUyMDAwMGZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGwzX21haW5fMiAtPiBpc3MgKi8KQEAgLTI0ODYsNyArMjQ5MSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9pc3NfaHdtb2QsCiAJLmNsawkJPSAibDNfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9pc3NfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pc3NfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yNTAzLDExICsyNTA3LDkgQEAKIAkubmFtZQkJPSAiaXNzIiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X2lzc19od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9pc3NfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pc3NfaXJxcyksCiAJLnNkbWFfcmVxcwk9IG9tYXA0NHh4X2lzc19zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2lzc19zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJpc3NfZmNrIiwKLQkucHJjbQkJPSB7CisJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKIAkJCS5jbGtjdHJsX3JlZyA9IE9NQVA0NDMwX0NNX0NBTV9JU1NfQ0xLQ1RSTCwKIAkJfSwKQEAgLTI1MzUsNiArMjUzNyw3IEBACiAJeyAubmFtZSA9ICJzeW5jXzEiLCAuaXJxID0gMTAzICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAogCXsgLm5hbWUgPSAic3luY18wIiwgLmlycSA9IDEwNCArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKIAl7IC5uYW1lID0gIm1haWxib3hfMCIsIC5pcnEgPSAxMDcgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX3JzdF9pbmZvIG9tYXA0NHh4X2l2YV9yZXNldHNbXSA9IHsKQEAgLTI1NjEsNiArMjU2NCw3IEBACiAJCS5wYV9lbmQJCT0gMHg1YTA3ZmZmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsM19tYWluXzIgLT4gaXZhICovCkBAIC0yNTY5LDcgKzI1NzMsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfaXZhX2h3bW9kLAogCS5jbGsJCT0gImwzX2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfaXZhX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaXZhX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC0yNjEzLDcgKzI2MTYsNiBAQAogCS5uYW1lCQk9ICJpdmEiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfaXZhX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X2l2YV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2l2YV9pcnFzKSwKIAkucnN0X2xpbmVzCT0gb21hcDQ0eHhfaXZhX3Jlc2V0cywKIAkucnN0X2xpbmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaXZhX3Jlc2V0cyksCiAJLm1haW5fY2xrCT0gIml2YV9mY2siLApAQCAtMjY1Niw2ICsyNjU4LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9rYmRfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfa2JkX2lycXNbXSA9IHsKIAl7IC5pcnEgPSAxMjAgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfa2JkX2FkZHJzW10gPSB7CkBAIC0yNjY0LDYgKzI2NjcsNyBAQAogCQkucGFfZW5kCQk9IDB4NGEzMWMwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfd2t1cCAtPiBrYmQgKi8KQEAgLTI2NzIsNyArMjY3Niw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9rYmRfaHdtb2QsCiAJLmNsawkJPSAibDRfd2t1cF9jbGtfbXV4X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9rYmRfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9rYmRfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yNjg1LDkgKzI2ODgsOCBAQAogCS5uYW1lCQk9ICJrYmQiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfa2JkX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X2tiZF9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2tiZF9pcnFzKSwKIAkubWFpbl9jbGsJPSAia2JkX2ZjayIsCi0JLnByY20JCT0geworCS5wcmNtID0gewogCQkub21hcDQgPSB7CiAJCQkuY2xrY3RybF9yZWcgPSBPTUFQNDQzMF9DTV9XS1VQX0tFWUJPQVJEX0NMS0NUUkwsCiAJCX0sCkBAIC0yNzIxLDYgKzI3MjMsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X21haWxib3hfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfbWFpbGJveF9pcnFzW10gPSB7CiAJeyAuaXJxID0gMjYgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfbWFpbGJveF9hZGRyc1tdID0gewpAQCAtMjcyOSw2ICsyNzMyLDcgQEAKIAkJLnBhX2VuZAkJPSAweDRhMGY0MWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X2NmZyAtPiBtYWlsYm94ICovCkBAIC0yNzM3LDcgKzI3NDEsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfbWFpbGJveF9od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X21haWxib3hfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tYWlsYm94X2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMjc1MCw4ICsyNzUzLDcgQEAKIAkubmFtZQkJPSAibWFpbGJveCIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9tYWlsYm94X2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X21haWxib3hfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tYWlsYm94X2lycXMpLAotCS5wcmNtCQk9IHsKKwkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewogCQkJLmNsa2N0cmxfcmVnID0gT01BUDQ0MzBfQ01fTDRDRkdfTUFJTEJPWF9DTEtDVFJMLAogCQl9LApAQCAtMjc4NCwxMSArMjc4NiwxMyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X21jYnNwMV9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF9tY2JzcDFfaXJxc1tdID0gewogCXsgLmlycSA9IDE3ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9tY2JzcDFfc2RtYV9yZXFzW10gPSB7CiAJeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gMzIgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCiAJeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gMzMgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X21jYnNwMV9hZGRyc1tdID0gewpAQCAtMjc5OCw2ICsyODAyLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQwMTIyMGZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X2FiZSAtPiBtY2JzcDEgKi8KQEAgLTI4MDYsNyArMjgxMSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9tY2JzcDFfaHdtb2QsCiAJLmNsawkJPSAib2NwX2FiZV9pY2xrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9tY2JzcDFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY2JzcDFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKQEAgLTI4MTcsNiArMjgyMSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0OTAyMjBmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9hYmUgLT4gbWNic3AxIChkbWEpICovCkBAIC0yODI1LDcgKzI4MzAsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfbWNic3AxX2h3bW9kLAogCS5jbGsJCT0gIm9jcF9hYmVfaWNsayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfbWNic3AxX2RtYV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jYnNwMV9kbWFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0yODM5LDkgKzI4NDMsNyBAQAogCS5uYW1lCQk9ICJtY2JzcDEiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfbWNic3BfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfbWNic3AxX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNic3AxX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9tY2JzcDFfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY2JzcDFfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAibWNic3AxX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTI4NTcsMTEgKzI4NTksMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9tY2JzcDJfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfbWNic3AyX2lycXNbXSA9IHsKIAl7IC5pcnEgPSAyMiArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDQ0eHhfbWNic3AyX3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IDE2ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDE3ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF9tY2JzcDJfYWRkcnNbXSA9IHsKQEAgLTI4NzEsNiArMjg3NSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0MDEyNDBmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9hYmUgLT4gbWNic3AyICovCkBAIC0yODc5LDcgKzI4ODQsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfbWNic3AyX2h3bW9kLAogCS5jbGsJCT0gIm9jcF9hYmVfaWNsayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfbWNic3AyX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNic3AyX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC0yODkwLDYgKzI4OTQsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwMjQwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfYWJlIC0+IG1jYnNwMiAoZG1hKSAqLwpAQCAtMjg5OCw3ICsyOTAzLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X21jYnNwMl9od21vZCwKIAkuY2xrCQk9ICJvY3BfYWJlX2ljbGsiLAogCS5hZGRyCQk9IG9tYXA0NHh4X21jYnNwMl9kbWFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY2JzcDJfZG1hX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMjkxMiw5ICsyOTE2LDcgQEAKIAkubmFtZQkJPSAibWNic3AyIiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X21jYnNwX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X21jYnNwMl9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jYnNwMl9pcnFzKSwKIAkuc2RtYV9yZXFzCT0gb21hcDQ0eHhfbWNic3AyX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNic3AyX3NkbWFfcmVxcyksCiAJLm1haW5fY2xrCT0gIm1jYnNwMl9mY2siLAogCS5wcmNtID0gewogCQkub21hcDQgPSB7CkBAIC0yOTMwLDExICsyOTMyLDEzIEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfbWNic3AzX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X21jYnNwM19pcnFzW10gPSB7CiAJeyAuaXJxID0gMjMgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXA0NHh4X21jYnNwM19zZG1hX3JlcXNbXSA9IHsKIAl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSAxOCArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKIAl7IC5uYW1lID0gInJ4IiwgLmRtYV9yZXEgPSAxOSArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfbWNic3AzX2FkZHJzW10gPSB7CkBAIC0yOTQ0LDYgKzI5NDgsNyBAQAogCQkucGFfZW5kCQk9IDB4NDAxMjYwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfYWJlIC0+IG1jYnNwMyAqLwpAQCAtMjk1Miw3ICsyOTU3LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X21jYnNwM19od21vZCwKIAkuY2xrCQk9ICJvY3BfYWJlX2ljbGsiLAogCS5hZGRyCQk9IG9tYXA0NHh4X21jYnNwM19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jYnNwM19hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVLAogfTsKIApAQCAtMjk2Myw2ICsyOTY3LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ5MDI2MGZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X2FiZSAtPiBtY2JzcDMgKGRtYSkgKi8KQEAgLTI5NzEsNyArMjk3Niw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9tY2JzcDNfaHdtb2QsCiAJLmNsawkJPSAib2NwX2FiZV9pY2xrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9tY2JzcDNfZG1hX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNic3AzX2RtYV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTI5ODUsOSArMjk4OSw3IEBACiAJLm5hbWUJCT0gIm1jYnNwMyIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9tY2JzcF9od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9tY2JzcDNfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY2JzcDNfaXJxcyksCiAJLnNkbWFfcmVxcwk9IG9tYXA0NHh4X21jYnNwM19zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jYnNwM19zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJtY2JzcDNfZmNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtMzAwMywxMSArMzAwNSwxMyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X21jYnNwNF9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF9tY2JzcDRfaXJxc1tdID0gewogCXsgLmlycSA9IDE2ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9tY2JzcDRfc2RtYV9yZXFzW10gPSB7CiAJeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gMzAgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCiAJeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gMzEgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X21jYnNwNF9hZGRyc1tdID0gewpAQCAtMzAxNiw2ICszMDIwLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDk2MGZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBtY2JzcDQgKi8KQEAgLTMwMjQsNyArMzAyOSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9tY2JzcDRfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9tY2JzcDRfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY2JzcDRfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0zMDM3LDkgKzMwNDEsNyBAQAogCS5uYW1lCQk9ICJtY2JzcDQiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfbWNic3BfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfbWNic3A0X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNic3A0X2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9tY2JzcDRfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY2JzcDRfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAibWNic3A0X2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTMwNzYsMTEgKzMwNzgsMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9tY3BkbV9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF9tY3BkbV9pcnFzW10gPSB7CiAJeyAuaXJxID0gMTEyICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9tY3BkbV9zZG1hX3JlcXNbXSA9IHsKIAl7IC5uYW1lID0gInVwX2xpbmsiLCAuZG1hX3JlcSA9IDY0ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAiZG5fbGluayIsIC5kbWFfcmVxID0gNjUgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X21jcGRtX2FkZHJzW10gPSB7CkBAIC0zMDg5LDYgKzMwOTMsNyBAQAogCQkucGFfZW5kCQk9IDB4NDAxMzIwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfYWJlIC0+IG1jcGRtICovCkBAIC0zMDk3LDcgKzMxMDIsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfbWNwZG1faHdtb2QsCiAJLmNsawkJPSAib2NwX2FiZV9pY2xrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9tY3BkbV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jcGRtX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC0zMTA3LDYgKzMxMTEsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwMzIwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfYWJlIC0+IG1jcGRtIChkbWEpICovCkBAIC0zMTE1LDcgKzMxMjAsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfbWNwZG1faHdtb2QsCiAJLmNsawkJPSAib2NwX2FiZV9pY2xrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9tY3BkbV9kbWFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3BkbV9kbWFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0zMTI5LDExICszMTMzLDkgQEAKIAkubmFtZQkJPSAibWNwZG0iLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfbWNwZG1faHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfbWNwZG1faXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3BkbV9pcnFzKSwKIAkuc2RtYV9yZXFzCT0gb21hcDQ0eHhfbWNwZG1fc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3BkbV9zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJtY3BkbV9mY2siLAotCS5wcmNtCQk9IHsKKwkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewogCQkJLmNsa2N0cmxfcmVnID0gT01BUDQ0MzBfQ00xX0FCRV9QRE1fQ0xLQ1RSTCwKIAkJfSwKQEAgLTMxNjksNiArMzE3MSw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfbWNzcGkxX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X21jc3BpMV9pcnFzW10gPSB7CiAJeyAuaXJxID0gNjUgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXA0NHh4X21jc3BpMV9zZG1hX3JlcXNbXSA9IHsKQEAgLTMxODAsNiArMzE4Myw3IEBACiAJeyAubmFtZSA9ICJyeDIiLCAuZG1hX3JlcSA9IDM5ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAidHgzIiwgLmRtYV9yZXEgPSA0MCArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKIAl7IC5uYW1lID0gInJ4MyIsIC5kbWFfcmVxID0gNDEgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X21jc3BpMV9hZGRyc1tdID0gewpAQCAtMzE4OCw2ICszMTkyLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDk4MWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBtY3NwaTEgKi8KQEAgLTMxOTYsNyArMzIwMSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9tY3NwaTFfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9tY3NwaTFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3NwaTFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0zMjE0LDkgKzMyMTgsNyBAQAogCS5uYW1lCQk9ICJtY3NwaTEiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfbWNzcGlfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfbWNzcGkxX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNzcGkxX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9tY3NwaTFfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3NwaTFfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAibWNzcGkxX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTMyMzMsNiArMzIzNSw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfbWNzcGkyX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X21jc3BpMl9pcnFzW10gPSB7CiAJeyAuaXJxID0gNjYgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXA0NHh4X21jc3BpMl9zZG1hX3JlcXNbXSA9IHsKQEAgLTMyNDAsNiArMzI0Myw3IEBACiAJeyAubmFtZSA9ICJyeDAiLCAuZG1hX3JlcSA9IDQzICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAidHgxIiwgLmRtYV9yZXEgPSA0NCArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKIAl7IC5uYW1lID0gInJ4MSIsIC5kbWFfcmVxID0gNDUgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X21jc3BpMl9hZGRyc1tdID0gewpAQCAtMzI0OCw2ICszMjUyLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDlhMWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBtY3NwaTIgKi8KQEAgLTMyNTYsNyArMzI2MSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9tY3NwaTJfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9tY3NwaTJfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3NwaTJfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0zMjc0LDkgKzMyNzgsNyBAQAogCS5uYW1lCQk9ICJtY3NwaTIiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfbWNzcGlfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfbWNzcGkyX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNzcGkyX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9tY3NwaTJfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3NwaTJfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAibWNzcGkyX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTMyOTMsNiArMzI5NSw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfbWNzcGkzX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X21jc3BpM19pcnFzW10gPSB7CiAJeyAuaXJxID0gOTEgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXA0NHh4X21jc3BpM19zZG1hX3JlcXNbXSA9IHsKQEAgLTMzMDAsNiArMzMwMyw3IEBACiAJeyAubmFtZSA9ICJyeDAiLCAuZG1hX3JlcSA9IDE1ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAidHgxIiwgLmRtYV9yZXEgPSAyMiArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKIAl7IC5uYW1lID0gInJ4MSIsIC5kbWFfcmVxID0gMjMgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X21jc3BpM19hZGRyc1tdID0gewpAQCAtMzMwOCw2ICszMzEyLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MGI4MWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBtY3NwaTMgKi8KQEAgLTMzMTYsNyArMzMyMSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9tY3NwaTNfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9tY3NwaTNfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3NwaTNfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0zMzM0LDkgKzMzMzgsNyBAQAogCS5uYW1lCQk9ICJtY3NwaTMiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfbWNzcGlfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfbWNzcGkzX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNzcGkzX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9tY3NwaTNfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3NwaTNfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAibWNzcGkzX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTMzNTMsMTEgKzMzNTUsMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9tY3NwaTRfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfbWNzcGk0X2lycXNbXSA9IHsKIAl7IC5pcnEgPSA0OCArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDQ0eHhfbWNzcGk0X3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgwIiwgLmRtYV9yZXEgPSA2OSArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKIAl7IC5uYW1lID0gInJ4MCIsIC5kbWFfcmVxID0gNzAgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X21jc3BpNF9hZGRyc1tdID0gewpAQCAtMzM2Niw2ICszMzcwLDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MGJhMWZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBtY3NwaTQgKi8KQEAgLTMzNzQsNyArMzM3OSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9tY3NwaTRfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9tY3NwaTRfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3NwaTRfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0zMzkyLDkgKzMzOTYsNyBAQAogCS5uYW1lCQk9ICJtY3NwaTQiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfbWNzcGlfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfbWNzcGk0X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNzcGk0X2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9tY3NwaTRfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3NwaTRfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAibWNzcGk0X2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTM0MjAsNyArMzQyMiw3IEBACiAJCQkgICBTWVNDX0hBU19TT0ZUUkVTRVQpLAogCS5pZGxlbW9kZXMJPSAoU0lETEVfRk9SQ0UgfCBTSURMRV9OTyB8IFNJRExFX1NNQVJUIHwKIAkJCSAgIFNJRExFX1NNQVJUX1dLVVAgfCBNU1RBTkRCWV9GT1JDRSB8IE1TVEFOREJZX05PIHwKLQkJCSAgIE1TVEFOREJZX1NNQVJUKSwKKwkJCSAgIE1TVEFOREJZX1NNQVJUIHwgTVNUQU5EQllfU01BUlRfV0tVUCksCiAJLnN5c2NfZmllbGRzCT0gJm9tYXBfaHdtb2Rfc3lzY190eXBlMiwKIH07CiAKQEAgLTM0MzAsMTQgKzM0MzIsMTUgQEAKIH07CiAKIC8qIG1tYzEgKi8KLQogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X21tYzFfaXJxc1tdID0gewogCXsgLmlycSA9IDgzICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9tbWMxX3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IDYwICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDYxICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiAvKiBtbWMxIG1hc3RlciBwb3J0cyAqLwpAQCAtMzQ1MSw2ICszNDU0LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDljM2ZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBtbWMxICovCkBAIC0zNDU5LDcgKzM0NjMsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfbW1jMV9od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X21tYzFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tbWMxX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMzQ3NywxMSArMzQ4MCw5IEBACiAJLm5hbWUJCT0gIm1tYzEiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfbW1jX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X21tYzFfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tbWMxX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9tbWMxX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbW1jMV9zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJtbWMxX2ZjayIsCi0JLnByY20JCT0geworCS5wcmNtID0gewogCQkub21hcDQgPSB7CiAJCQkuY2xrY3RybF9yZWcgPSBPTUFQNDQzMF9DTV9MM0lOSVRfTU1DMV9DTEtDVFJMLAogCQl9LApAQCAtMzQ5NywxMSArMzQ5OCwxMyBAQAogLyogbW1jMiAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X21tYzJfaXJxc1tdID0gewogCXsgLmlycSA9IDg2ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9tbWMyX3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IDQ2ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDQ3ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiAvKiBtbWMyIG1hc3RlciBwb3J0cyAqLwpAQCAtMzUxNSw2ICszNTE4LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MGI0M2ZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBtbWMyICovCkBAIC0zNTIzLDcgKzM1MjcsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfbW1jMl9od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X21tYzJfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tbWMyX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMzUzNiwxMSArMzUzOSw5IEBACiAJLm5hbWUJCT0gIm1tYzIiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfbW1jX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X21tYzJfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tbWMyX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9tbWMyX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbW1jMl9zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJtbWMyX2ZjayIsCi0JLnByY20JCT0geworCS5wcmNtID0gewogCQkub21hcDQgPSB7CiAJCQkuY2xrY3RybF9yZWcgPSBPTUFQNDQzMF9DTV9MM0lOSVRfTU1DMl9DTEtDVFJMLAogCQl9LApAQCAtMzU1NiwxMSArMzU1NywxMyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X21tYzNfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfbW1jM19pcnFzW10gPSB7CiAJeyAuaXJxID0gOTQgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXA0NHh4X21tYzNfc2RtYV9yZXFzW10gPSB7CiAJeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gNzYgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCiAJeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gNzcgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X21tYzNfYWRkcnNbXSA9IHsKQEAgLTM1NjksNiArMzU3Miw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODBhZDNmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9wZXIgLT4gbW1jMyAqLwpAQCAtMzU3Nyw3ICszNTgxLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X21tYzNfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9tbWMzX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbW1jM19hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTM1OTAsMTEgKzM1OTMsOSBAQAogCS5uYW1lCQk9ICJtbWMzIiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X21tY19od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9tbWMzX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbW1jM19pcnFzKSwKIAkuc2RtYV9yZXFzCT0gb21hcDQ0eHhfbW1jM19zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21tYzNfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAibW1jM19mY2siLAotCS5wcmNtCQk9IHsKKwkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewogCQkJLmNsa2N0cmxfcmVnID0gT01BUDQ0MzBfQ01fTDRQRVJfTU1DU0QzX0NMS0NUUkwsCiAJCX0sCkBAIC0zNjA4LDExICszNjA5LDEzIEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfbW1jNF9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF9tbWM0X2lycXNbXSA9IHsKIAl7IC5pcnEgPSA5NiArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDQ0eHhfbW1jNF9zZG1hX3JlcXNbXSA9IHsKIAl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSA1NiArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKIAl7IC5uYW1lID0gInJ4IiwgLmRtYV9yZXEgPSA1NyArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfbW1jNF9hZGRyc1tdID0gewpAQCAtMzYyMSw2ICszNjI0LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MGQxM2ZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiBtbWM0ICovCkBAIC0zNjI5LDcgKzM2MzMsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfbW1jNF9od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X21tYzRfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tbWM0X2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtMzY0MiwxMSArMzY0NSwxMCBAQAogCS5uYW1lCQk9ICJtbWM0IiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X21tY19od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9tbWM0X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbW1jNF9pcnFzKSwKKwogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF9tbWM0X3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbW1jNF9zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJtbWM0X2ZjayIsCi0JLnByY20JCT0geworCS5wcmNtID0gewogCQkub21hcDQgPSB7CiAJCQkuY2xrY3RybF9yZWcgPSBPTUFQNDQzMF9DTV9MNFBFUl9NTUNTRDRfQ0xLQ1RSTCwKIAkJfSwKQEAgLTM2NjAsMTEgKzM2NjIsMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9tbWM1X2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X21tYzVfaXJxc1tdID0gewogCXsgLmlycSA9IDU5ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF9tbWM1X3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IDU4ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDU5ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF9tbWM1X2FkZHJzW10gPSB7CkBAIC0zNjczLDYgKzM2NzcsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwZDUzZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IG1tYzUgKi8KQEAgLTM2ODEsNyArMzY4Niw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9tbWM1X2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfbW1jNV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21tYzVfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0zNjk0LDExICszNjk4LDkgQEAKIAkubmFtZQkJPSAibW1jNSIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9tbWNfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfbW1jNV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21tYzVfaXJxcyksCiAJLnNkbWFfcmVxcwk9IG9tYXA0NHh4X21tYzVfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tbWM1X3NkbWFfcmVxcyksCiAJLm1haW5fY2xrCT0gIm1tYzVfZmNrIiwKLQkucHJjbQkJPSB7CisJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKIAkJCS5jbGtjdHJsX3JlZyA9IE9NQVA0NDMwX0NNX0w0UEVSX01NQ1NENV9DTEtDVFJMLAogCQl9LApAQCAtMzcyMiw2ICszNzI0LDcgQEAKIAl7IC5uYW1lID0gInBsMzEwIiwgLmlycSA9IDAgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCiAJeyAubmFtZSA9ICJjdGkwIiwgLmlycSA9IDEgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCiAJeyAubmFtZSA9ICJjdGkxIiwgLmlycSA9IDIgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogLyogbXB1IG1hc3RlciBwb3J0cyAqLwpAQCAtMzczNCw5ICszNzM3LDggQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9tcHVfaHdtb2QgPSB7CiAJLm5hbWUJCT0gIm1wdSIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9tcHVfaHdtb2RfY2xhc3MsCi0JLmZsYWdzCQk9IChIV01PRF9JTklUX05PX0lETEUgfCBIV01PRF9JTklUX05PX1JFU0VUKSwKKwkuZmxhZ3MJCT0gSFdNT0RfSU5JVF9OT19JRExFIHwgSFdNT0RfSU5JVF9OT19SRVNFVCwKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tcHVfaXJxcyksCiAJLm1haW5fY2xrCT0gImRwbGxfbXB1X20yX2NrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtMzc3OCw2ICszNzgwLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9zbWFydHJlZmxleF9jb3JlX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X3NtYXJ0cmVmbGV4X2NvcmVfaXJxc1tdID0gewogCXsgLmlycSA9IDE5ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X3NtYXJ0cmVmbGV4X2NvcmVfYWRkcnNbXSA9IHsKQEAgLTM3ODYsNiArMzc4OSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0YTBkZDAzZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9jZmcgLT4gc21hcnRyZWZsZXhfY29yZSAqLwpAQCAtMzc5NCw3ICszNzk4LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3NtYXJ0cmVmbGV4X2NvcmVfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9zbWFydHJlZmxleF9jb3JlX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfc21hcnRyZWZsZXhfY29yZV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTM4MDcsNyArMzgxMCw3IEBACiAJLm5hbWUJCT0gInNtYXJ0cmVmbGV4X2NvcmUiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfc21hcnRyZWZsZXhfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfc21hcnRyZWZsZXhfY29yZV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3NtYXJ0cmVmbGV4X2NvcmVfaXJxcyksCisKIAkubWFpbl9jbGsJPSAic21hcnRyZWZsZXhfY29yZV9mY2siLAogCS52ZGRfbmFtZQk9ICJjb3JlIiwKIAkucHJjbSA9IHsKQEAgLTM4MjQsNiArMzgyNyw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfc21hcnRyZWZsZXhfaXZhX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X3NtYXJ0cmVmbGV4X2l2YV9pcnFzW10gPSB7CiAJeyAuaXJxID0gMTAyICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X3NtYXJ0cmVmbGV4X2l2YV9hZGRyc1tdID0gewpAQCAtMzgzMiw2ICszODM2LDcgQEAKIAkJLnBhX2VuZAkJPSAweDRhMGRiMDNmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X2NmZyAtPiBzbWFydHJlZmxleF9pdmEgKi8KQEAgLTM4NDAsNyArMzg0NSw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF9zbWFydHJlZmxleF9pdmFfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF9zbWFydHJlZmxleF9pdmFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9zbWFydHJlZmxleF9pdmFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC0zODUzLDcgKzM4NTcsNiBAQAogCS5uYW1lCQk9ICJzbWFydHJlZmxleF9pdmEiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfc21hcnRyZWZsZXhfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfc21hcnRyZWZsZXhfaXZhX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfc21hcnRyZWZsZXhfaXZhX2lycXMpLAogCS5tYWluX2Nsawk9ICJzbWFydHJlZmxleF9pdmFfZmNrIiwKIAkudmRkX25hbWUJPSAiaXZhIiwKIAkucHJjbSA9IHsKQEAgLTM4NzAsNiArMzg3Myw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfc21hcnRyZWZsZXhfbXB1X2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X3NtYXJ0cmVmbGV4X21wdV9pcnFzW10gPSB7CiAJeyAuaXJxID0gMTggKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfc21hcnRyZWZsZXhfbXB1X2FkZHJzW10gPSB7CkBAIC0zODc4LDYgKzM4ODIsNyBAQAogCQkucGFfZW5kCQk9IDB4NGEwZDkwM2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfY2ZnIC0+IHNtYXJ0cmVmbGV4X21wdSAqLwpAQCAtMzg4Niw3ICszODkxLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3NtYXJ0cmVmbGV4X21wdV9od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X3NtYXJ0cmVmbGV4X21wdV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3NtYXJ0cmVmbGV4X21wdV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTM4OTksNyArMzkwMyw2IEBACiAJLm5hbWUJCT0gInNtYXJ0cmVmbGV4X21wdSIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF9zbWFydHJlZmxleF9od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9zbWFydHJlZmxleF9tcHVfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9zbWFydHJlZmxleF9tcHVfaXJxcyksCiAJLm1haW5fY2xrCT0gInNtYXJ0cmVmbGV4X21wdV9mY2siLAogCS52ZGRfbmFtZQk9ICJtcHUiLAogCS5wcmNtID0gewpAQCAtMzk0Myw2ICszOTQ2LDcgQEAKIAkJLnBhX2VuZAkJPSAweDRhMGY2ZmZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X2NmZyAtPiBzcGlubG9jayAqLwpAQCAtMzk1MSw3ICszOTU1LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3NwaW5sb2NrX2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfc3BpbmxvY2tfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9zcGlubG9ja19hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTQwMTUsNiArNDAxOCw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfdGltZXIxX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X3RpbWVyMV9pcnFzW10gPSB7CiAJeyAuaXJxID0gMzcgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfdGltZXIxX2FkZHJzW10gPSB7CkBAIC00MDIzLDYgKzQwMjcsNyBAQAogCQkucGFfZW5kCQk9IDB4NGEzMTgwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfd2t1cCAtPiB0aW1lcjEgKi8KQEAgLTQwMzEsNyArNDAzNiw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF90aW1lcjFfaHdtb2QsCiAJLmNsawkJPSAibDRfd2t1cF9jbGtfbXV4X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF90aW1lcjFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC00MDQ0LDcgKzQwNDgsNiBAQAogCS5uYW1lCQk9ICJ0aW1lcjEiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfdGltZXJfMW1zX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X3RpbWVyMV9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyMV9pcnFzKSwKIAkubWFpbl9jbGsJPSAidGltZXIxX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTQwNjAsNiArNDA2Myw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfdGltZXIyX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X3RpbWVyMl9pcnFzW10gPSB7CiAJeyAuaXJxID0gMzggKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfdGltZXIyX2FkZHJzW10gPSB7CkBAIC00MDY4LDYgKzQwNzIsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwMzIwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IHRpbWVyMiAqLwpAQCAtNDA3Niw3ICs0MDgxLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3RpbWVyMl9od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X3RpbWVyMl9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyMl9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTQwODksNyArNDA5Myw2IEBACiAJLm5hbWUJCT0gInRpbWVyMiIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF90aW1lcl8xbXNfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfdGltZXIyX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXIyX2lycXMpLAogCS5tYWluX2Nsawk9ICJ0aW1lcjJfZmNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtNDEwNSw2ICs0MTA4LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF90aW1lcjNfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfdGltZXIzX2lycXNbXSA9IHsKIAl7IC5pcnEgPSAzOSArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF90aW1lcjNfYWRkcnNbXSA9IHsKQEAgLTQxMTMsNiArNDExNyw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODAzNDA3ZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9wZXIgLT4gdGltZXIzICovCkBAIC00MTIxLDcgKzQxMjYsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfdGltZXIzX2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfdGltZXIzX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXIzX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNDEzNCw3ICs0MTM4LDYgQEAKIAkubmFtZQkJPSAidGltZXIzIiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X3RpbWVyX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X3RpbWVyM19pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyM19pcnFzKSwKIAkubWFpbl9jbGsJPSAidGltZXIzX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTQxNTAsNiArNDE1Myw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfdGltZXI0X2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X3RpbWVyNF9pcnFzW10gPSB7CiAJeyAuaXJxID0gNDAgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfdGltZXI0X2FkZHJzW10gPSB7CkBAIC00MTU4LDYgKzQxNjIsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwMzYwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IHRpbWVyNCAqLwpAQCAtNDE2Niw3ICs0MTcxLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3RpbWVyNF9od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X3RpbWVyNF9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyNF9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTQxNzksNyArNDE4Myw2IEBACiAJLm5hbWUJCT0gInRpbWVyNCIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF90aW1lcl9od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF90aW1lcjRfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjRfaXJxcyksCiAJLm1haW5fY2xrCT0gInRpbWVyNF9mY2siLAogCS5wcmNtID0gewogCQkub21hcDQgPSB7CkBAIC00MTk1LDYgKzQxOTgsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X3RpbWVyNV9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF90aW1lcjVfaXJxc1tdID0gewogCXsgLmlycSA9IDQxICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X3RpbWVyNV9hZGRyc1tdID0gewpAQCAtNDIwMyw2ICs0MjA3LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQwMTM4MDdmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X2FiZSAtPiB0aW1lcjUgKi8KQEAgLTQyMTEsNyArNDIxNiw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF90aW1lcjVfaHdtb2QsCiAJLmNsawkJPSAib2NwX2FiZV9pY2xrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF90aW1lcjVfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjVfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSwKIH07CiAKQEAgLTQyMjEsNiArNDIyNSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0OTAzODA3ZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9hYmUgLT4gdGltZXI1IChkbWEpICovCkBAIC00MjI5LDcgKzQyMzQsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfdGltZXI1X2h3bW9kLAogCS5jbGsJCT0gIm9jcF9hYmVfaWNsayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfdGltZXI1X2RtYV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyNV9kbWFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC00MjQzLDcgKzQyNDcsNiBAQAogCS5uYW1lCQk9ICJ0aW1lcjUiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfdGltZXI1X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXI1X2lycXMpLAogCS5tYWluX2Nsawk9ICJ0aW1lcjVfZmNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtNDI1OSw2ICs0MjYyLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF90aW1lcjZfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfdGltZXI2X2lycXNbXSA9IHsKIAl7IC5pcnEgPSA0MiArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF90aW1lcjZfYWRkcnNbXSA9IHsKQEAgLTQyNjcsNiArNDI3MSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0MDEzYTA3ZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9hYmUgLT4gdGltZXI2ICovCkBAIC00Mjc1LDcgKzQyODAsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfdGltZXI2X2h3bW9kLAogCS5jbGsJCT0gIm9jcF9hYmVfaWNsayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfdGltZXI2X2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXI2X2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC00Mjg1LDYgKzQyODksNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwM2EwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfYWJlIC0+IHRpbWVyNiAoZG1hKSAqLwpAQCAtNDI5Myw3ICs0Mjk4LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3RpbWVyNl9od21vZCwKIAkuY2xrCQk9ICJvY3BfYWJlX2ljbGsiLAogCS5hZGRyCQk9IG9tYXA0NHh4X3RpbWVyNl9kbWFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjZfZG1hX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNDMwNyw3ICs0MzExLDcgQEAKIAkubmFtZQkJPSAidGltZXI2IiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X3RpbWVyX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X3RpbWVyNl9pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyNl9pcnFzKSwKKwogCS5tYWluX2Nsawk9ICJ0aW1lcjZfZmNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtNDMyMyw2ICs0MzI3LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF90aW1lcjdfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfdGltZXI3X2lycXNbXSA9IHsKIAl7IC5pcnEgPSA0MyArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF90aW1lcjdfYWRkcnNbXSA9IHsKQEAgLTQzMzEsNiArNDMzNiw3IEBACiAJCS5wYV9lbmQJCT0gMHg0MDEzYzA3ZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9hYmUgLT4gdGltZXI3ICovCkBAIC00MzM5LDcgKzQzNDUsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfdGltZXI3X2h3bW9kLAogCS5jbGsJCT0gIm9jcF9hYmVfaWNsayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfdGltZXI3X2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXI3X2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC00MzQ5LDYgKzQzNTQsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwM2MwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfYWJlIC0+IHRpbWVyNyAoZG1hKSAqLwpAQCAtNDM1Nyw3ICs0MzYzLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3RpbWVyN19od21vZCwKIAkuY2xrCQk9ICJvY3BfYWJlX2ljbGsiLAogCS5hZGRyCQk9IG9tYXA0NHh4X3RpbWVyN19kbWFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjdfZG1hX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNDM3MSw3ICs0Mzc2LDYgQEAKIAkubmFtZQkJPSAidGltZXI3IiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X3RpbWVyX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X3RpbWVyN19pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyN19pcnFzKSwKIAkubWFpbl9jbGsJPSAidGltZXI3X2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTQzODcsNiArNDM5MSw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfdGltZXI4X2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X3RpbWVyOF9pcnFzW10gPSB7CiAJeyAuaXJxID0gNDQgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfdGltZXI4X2FkZHJzW10gPSB7CkBAIC00Mzk1LDYgKzQ0MDAsNyBAQAogCQkucGFfZW5kCQk9IDB4NDAxM2UwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfYWJlIC0+IHRpbWVyOCAqLwpAQCAtNDQwMyw3ICs0NDA5LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3RpbWVyOF9od21vZCwKIAkuY2xrCQk9ICJvY3BfYWJlX2ljbGsiLAogCS5hZGRyCQk9IG9tYXA0NHh4X3RpbWVyOF9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyOF9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVLAogfTsKIApAQCAtNDQxMyw2ICs0NDE4LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ5MDNlMDdmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X2FiZSAtPiB0aW1lcjggKGRtYSkgKi8KQEAgLTQ0MjEsNyArNDQyNyw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF90aW1lcjhfaHdtb2QsCiAJLmNsawkJPSAib2NwX2FiZV9pY2xrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF90aW1lcjhfZG1hX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXI4X2RtYV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTQ0MzUsNyArNDQ0MCw2IEBACiAJLm5hbWUJCT0gInRpbWVyOCIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF90aW1lcl9od21vZF9jbGFzcywKIAkubXB1X2lycXMJPSBvbWFwNDR4eF90aW1lcjhfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjhfaXJxcyksCiAJLm1haW5fY2xrCT0gInRpbWVyOF9mY2siLAogCS5wcmNtID0gewogCQkub21hcDQgPSB7CkBAIC00NDUxLDYgKzQ0NTUsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X3RpbWVyOV9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF90aW1lcjlfaXJxc1tdID0gewogCXsgLmlycSA9IDQ1ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X3RpbWVyOV9hZGRyc1tdID0gewpAQCAtNDQ1OSw2ICs0NDY0LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDNlMDdmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiB0aW1lcjkgKi8KQEAgLTQ0NjcsNyArNDQ3Myw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF90aW1lcjlfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF90aW1lcjlfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjlfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC00NDgwLDcgKzQ0ODUsNiBAQAogCS5uYW1lCQk9ICJ0aW1lcjkiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfdGltZXI5X2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXI5X2lycXMpLAogCS5tYWluX2Nsawk9ICJ0aW1lcjlfZmNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtNDQ5Niw2ICs0NTAwLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF90aW1lcjEwX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X3RpbWVyMTBfaXJxc1tdID0gewogCXsgLmlycSA9IDQ2ICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X3RpbWVyMTBfYWRkcnNbXSA9IHsKQEAgLTQ1MDQsNiArNDUwOSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODA4NjA3ZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9wZXIgLT4gdGltZXIxMCAqLwpAQCAtNDUxMiw3ICs0NTE4LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3RpbWVyMTBfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF90aW1lcjEwX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXIxMF9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTQ1MjUsNyArNDUzMCw2IEBACiAJLm5hbWUJCT0gInRpbWVyMTAiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfdGltZXJfMW1zX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X3RpbWVyMTBfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjEwX2lycXMpLAogCS5tYWluX2Nsawk9ICJ0aW1lcjEwX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTQ1NDEsNiArNDU0NSw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfdGltZXIxMV9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF90aW1lcjExX2lycXNbXSA9IHsKIAl7IC5pcnEgPSA0NyArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF90aW1lcjExX2FkZHJzW10gPSB7CkBAIC00NTQ5LDYgKzQ1NTQsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwODgwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IHRpbWVyMTEgKi8KQEAgLTQ1NTcsNyArNDU2Myw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF90aW1lcjExX2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfdGltZXIxMV9hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyMTFfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC00NTcwLDcgKzQ1NzUsNiBAQAogCS5uYW1lCQk9ICJ0aW1lcjExIiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X3RpbWVyX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X3RpbWVyMTFfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjExX2lycXMpLAogCS5tYWluX2Nsawk9ICJ0aW1lcjExX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTQ2MDgsMTEgKzQ2MTIsMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF91YXJ0MV9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF91YXJ0MV9pcnFzW10gPSB7CiAJeyAuaXJxID0gNzIgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXA0NHh4X3VhcnQxX3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IDQ4ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDQ5ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF91YXJ0MV9hZGRyc1tdID0gewpAQCAtNDYyMSw2ICs0NjI3LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDZhMGZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiB1YXJ0MSAqLwpAQCAtNDYyOSw3ICs0NjM2LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3VhcnQxX2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfdWFydDFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF91YXJ0MV9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTQ2NDIsOSArNDY0OCw3IEBACiAJLm5hbWUJCT0gInVhcnQxIiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X3VhcnRfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfdWFydDFfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF91YXJ0MV9pcnFzKSwKIAkuc2RtYV9yZXFzCT0gb21hcDQ0eHhfdWFydDFfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF91YXJ0MV9zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJ1YXJ0MV9mY2siLAogCS5wcmNtID0gewogCQkub21hcDQgPSB7CkBAIC00NjYwLDExICs0NjY0LDEzIEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfdWFydDJfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfdWFydDJfaXJxc1tdID0gewogCXsgLmlycSA9IDczICsgT01BUDQ0WFhfSVJRX0dJQ19TVEFSVCB9LAorCXsgLmlycSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwNDR4eF91YXJ0Ml9zZG1hX3JlcXNbXSA9IHsKIAl7IC5uYW1lID0gInR4IiwgLmRtYV9yZXEgPSA1MCArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKIAl7IC5uYW1lID0gInJ4IiwgLmRtYV9yZXEgPSA1MSArIE9NQVA0NFhYX0RNQV9SRVFfU1RBUlQgfSwKKwl7IC5kbWFfcmVxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfdWFydDJfYWRkcnNbXSA9IHsKQEAgLTQ2NzMsNiArNDY3OSw3IEBACiAJCS5wYV9lbmQJCT0gMHg0ODA2YzBmZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9wZXIgLT4gdWFydDIgKi8KQEAgLTQ2ODEsNyArNDY4OCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF91YXJ0Ml9od21vZCwKIAkuY2xrCQk9ICJsNF9kaXZfY2siLAogCS5hZGRyCQk9IG9tYXA0NHh4X3VhcnQyX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdWFydDJfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC00Njk0LDkgKzQ3MDAsNyBAQAogCS5uYW1lCQk9ICJ1YXJ0MiIsCiAJLmNsYXNzCQk9ICZvbWFwNDR4eF91YXJ0X2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X3VhcnQyX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdWFydDJfaXJxcyksCiAJLnNkbWFfcmVxcwk9IG9tYXA0NHh4X3VhcnQyX3NkbWFfcmVxcywKLQkuc2RtYV9yZXFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdWFydDJfc2RtYV9yZXFzKSwKIAkubWFpbl9jbGsJPSAidWFydDJfZmNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtNDcxMiwxMSArNDcxNiwxMyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X3VhcnQzX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X3VhcnQzX2lycXNbXSA9IHsKIAl7IC5pcnEgPSA3NCArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDQ0eHhfdWFydDNfc2RtYV9yZXFzW10gPSB7CiAJeyAubmFtZSA9ICJ0eCIsIC5kbWFfcmVxID0gNTIgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCiAJeyAubmFtZSA9ICJyeCIsIC5kbWFfcmVxID0gNTMgKyBPTUFQNDRYWF9ETUFfUkVRX1NUQVJUIH0sCisJeyAuZG1hX3JlcSA9IC0xIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXA0NHh4X3VhcnQzX2FkZHJzW10gPSB7CkBAIC00NzI1LDYgKzQ3MzEsNyBAQAogCQkucGFfZW5kCQk9IDB4NDgwMjAwZmYsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfcGVyIC0+IHVhcnQzICovCkBAIC00NzMzLDcgKzQ3NDAsNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfdWFydDNfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF91YXJ0M19hZGRycywKLQkuYWRkcl9jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3VhcnQzX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUgfCBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNDc0NSwxMSArNDc1MSw5IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfdWFydDNfaHdtb2QgPSB7CiAJLm5hbWUJCT0gInVhcnQzIiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X3VhcnRfaHdtb2RfY2xhc3MsCi0JLmZsYWdzCQk9IChIV01PRF9JTklUX05PX0lETEUgfCBIV01PRF9JTklUX05PX1JFU0VUKSwKKwkuZmxhZ3MJCT0gSFdNT0RfSU5JVF9OT19JRExFIHwgSFdNT0RfSU5JVF9OT19SRVNFVCwKIAkubXB1X2lycXMJPSBvbWFwNDR4eF91YXJ0M19pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3VhcnQzX2lycXMpLAogCS5zZG1hX3JlcXMJPSBvbWFwNDR4eF91YXJ0M19zZG1hX3JlcXMsCi0JLnNkbWFfcmVxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3VhcnQzX3NkbWFfcmVxcyksCiAJLm1haW5fY2xrCT0gInVhcnQzX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTQ3NjUsMTEgKzQ3NjksMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF91YXJ0NF9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF91YXJ0NF9pcnFzW10gPSB7CiAJeyAuaXJxID0gNzAgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXA0NHh4X3VhcnQ0X3NkbWFfcmVxc1tdID0gewogCXsgLm5hbWUgPSAidHgiLCAuZG1hX3JlcSA9IDU0ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAogCXsgLm5hbWUgPSAicngiLCAuZG1hX3JlcSA9IDU1ICsgT01BUDQ0WFhfRE1BX1JFUV9TVEFSVCB9LAorCXsgLmRtYV9yZXEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF91YXJ0NF9hZGRyc1tdID0gewpAQCAtNDc3OCw2ICs0Nzg0LDcgQEAKIAkJLnBhX2VuZAkJPSAweDQ4MDZlMGZmLAogCQkuZmxhZ3MJCT0gQUREUl9UWVBFX1JUCiAJfSwKKwl7IH0KIH07CiAKIC8qIGw0X3BlciAtPiB1YXJ0NCAqLwpAQCAtNDc4Niw3ICs0NzkzLDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3VhcnQ0X2h3bW9kLAogCS5jbGsJCT0gImw0X2Rpdl9jayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfdWFydDRfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF91YXJ0NF9hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTQ3OTksOSArNDgwNSw3IEBACiAJLm5hbWUJCT0gInVhcnQ0IiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X3VhcnRfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfdWFydDRfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF91YXJ0NF9pcnFzKSwKIAkuc2RtYV9yZXFzCT0gb21hcDQ0eHhfdWFydDRfc2RtYV9yZXFzLAotCS5zZG1hX3JlcXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF91YXJ0NF9zZG1hX3JlcXMpLAogCS5tYWluX2Nsawk9ICJ1YXJ0NF9mY2siLAogCS5wcmNtID0gewogCQkub21hcDQgPSB7CkBAIC00ODMyLDE0ICs0ODM2LDE1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDQ0eHhfdXNiX290Z19oc19od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJ1c2Jfb3RnX2hzIiwKLQkuc3lzYyA9ICZvbWFwNDR4eF91c2Jfb3RnX2hzX3N5c2MsCisJLm5hbWUJPSAidXNiX290Z19ocyIsCisJLnN5c2MJPSAmb21hcDQ0eHhfdXNiX290Z19oc19zeXNjLAogfTsKIAogLyogdXNiX290Z19ocyAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X3VzYl9vdGdfaHNfaXJxc1tdID0gewogCXsgLm5hbWUgPSAibWMiLCAuaXJxID0gOTIgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCiAJeyAubmFtZSA9ICJkbWEiLCAuaXJxID0gOTMgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogLyogdXNiX290Z19ocyBtYXN0ZXIgcG9ydHMgKi8KQEAgLTQ4NTMsNiArNDg1OCw3IEBACiAJCS5wYV9lbmQJCT0gMHg0YTBhYjAwMywKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9jZmcgLT4gdXNiX290Z19ocyAqLwpAQCAtNDg2MSw3ICs0ODY3LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3VzYl9vdGdfaHNfaHdtb2QsCiAJLmNsawkJPSAibDRfZGl2X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF91c2Jfb3RnX2hzX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdXNiX290Z19oc19hZGRycyksCiAJLnVzZXIJCT0gT0NQX1VTRVJfTVBVIHwgT0NQX1VTRVJfU0RNQSwKIH07CiAKQEAgLTQ4NzksNyArNDg4NCw2IEBACiAJLmNsYXNzCQk9ICZvbWFwNDR4eF91c2Jfb3RnX2hzX2h3bW9kX2NsYXNzLAogCS5mbGFncwkJPSBIV01PRF9TV1NVUF9TSURMRSB8IEhXTU9EX1NXU1VQX01TVEFOREJZLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X3VzYl9vdGdfaHNfaXJxcywKLQkubXB1X2lycXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF91c2Jfb3RnX2hzX2lycXMpLAogCS5tYWluX2Nsawk9ICJ1c2Jfb3RnX2hzX2ljayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTQ4ODcsNyArNDg5MSw3IEBACiAJCX0sCiAJfSwKIAkub3B0X2Nsa3MJPSB1c2Jfb3RnX2hzX29wdF9jbGtzLAotCS5vcHRfY2xrc19jbnQgPSBBUlJBWV9TSVpFKHVzYl9vdGdfaHNfb3B0X2Nsa3MpLAorCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKHVzYl9vdGdfaHNfb3B0X2Nsa3MpLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfdXNiX290Z19oc19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3VzYl9vdGdfaHNfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXA0NHh4X3VzYl9vdGdfaHNfbWFzdGVycywKQEAgLTQ5MjIsNiArNDkyNiw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfd2RfdGltZXIyX2h3bW9kOwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXA0NHh4X3dkX3RpbWVyMl9pcnFzW10gPSB7CiAJeyAuaXJxID0gODAgKyBPTUFQNDRYWF9JUlFfR0lDX1NUQVJUIH0sCisJeyAuaXJxID0gLTEgfQogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDQ0eHhfd2RfdGltZXIyX2FkZHJzW10gPSB7CkBAIC00OTMwLDYgKzQ5MzUsNyBAQAogCQkucGFfZW5kCQk9IDB4NGEzMTQwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfd2t1cCAtPiB3ZF90aW1lcjIgKi8KQEAgLTQ5MzgsNyArNDk0NCw2IEBACiAJLnNsYXZlCQk9ICZvbWFwNDR4eF93ZF90aW1lcjJfaHdtb2QsCiAJLmNsawkJPSAibDRfd2t1cF9jbGtfbXV4X2NrIiwKIAkuYWRkcgkJPSBvbWFwNDR4eF93ZF90aW1lcjJfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF93ZF90aW1lcjJfYWRkcnMpLAogCS51c2VyCQk9IE9DUF9VU0VSX01QVSB8IE9DUF9VU0VSX1NETUEsCiB9OwogCkBAIC00OTUxLDcgKzQ5NTYsNiBAQAogCS5uYW1lCQk9ICJ3ZF90aW1lcjIiLAogCS5jbGFzcwkJPSAmb21hcDQ0eHhfd2RfdGltZXJfaHdtb2RfY2xhc3MsCiAJLm1wdV9pcnFzCT0gb21hcDQ0eHhfd2RfdGltZXIyX2lycXMsCi0JLm1wdV9pcnFzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfd2RfdGltZXIyX2lycXMpLAogCS5tYWluX2Nsawk9ICJ3ZF90aW1lcjJfZmNrIiwKIAkucHJjbSA9IHsKIAkJLm9tYXA0ID0gewpAQCAtNDk2Nyw2ICs0OTcxLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF93ZF90aW1lcjNfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfd2RfdGltZXIzX2lycXNbXSA9IHsKIAl7IC5pcnEgPSAzNiArIE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQgfSwKKwl7IC5pcnEgPSAtMSB9CiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwNDR4eF93ZF90aW1lcjNfYWRkcnNbXSA9IHsKQEAgLTQ5NzUsNiArNDk4MCw3IEBACiAJCS5wYV9lbmQJCT0gMHg0MDEzMDA3ZiwKIAkJLmZsYWdzCQk9IEFERFJfVFlQRV9SVAogCX0sCisJeyB9CiB9OwogCiAvKiBsNF9hYmUgLT4gd2RfdGltZXIzICovCkBAIC00OTgzLDcgKzQ5ODksNiBAQAogCS5zbGF2ZQkJPSAmb21hcDQ0eHhfd2RfdGltZXIzX2h3bW9kLAogCS5jbGsJCT0gIm9jcF9hYmVfaWNsayIsCiAJLmFkZHIJCT0gb21hcDQ0eHhfd2RfdGltZXIzX2FkZHJzLAotCS5hZGRyX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfd2RfdGltZXIzX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9NUFUsCiB9OwogCkBAIC00OTkzLDYgKzQ5OTgsNyBAQAogCQkucGFfZW5kCQk9IDB4NDkwMzAwN2YsCiAJCS5mbGFncwkJPSBBRERSX1RZUEVfUlQKIAl9LAorCXsgfQogfTsKIAogLyogbDRfYWJlIC0+IHdkX3RpbWVyMyAoZG1hKSAqLwpAQCAtNTAwMSw3ICs1MDA3LDYgQEAKIAkuc2xhdmUJCT0gJm9tYXA0NHh4X3dkX3RpbWVyM19od21vZCwKIAkuY2xrCQk9ICJvY3BfYWJlX2ljbGsiLAogCS5hZGRyCQk9IG9tYXA0NHh4X3dkX3RpbWVyM19kbWFfYWRkcnMsCi0JLmFkZHJfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF93ZF90aW1lcjNfZG1hX2FkZHJzKSwKIAkudXNlcgkJPSBPQ1BfVVNFUl9TRE1BLAogfTsKIApAQCAtNTAxNSw3ICs1MDIwLDYgQEAKIAkubmFtZQkJPSAid2RfdGltZXIzIiwKIAkuY2xhc3MJCT0gJm9tYXA0NHh4X3dkX3RpbWVyX2h3bW9kX2NsYXNzLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X3dkX3RpbWVyM19pcnFzLAotCS5tcHVfaXJxc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3dkX3RpbWVyM19pcnFzKSwKIAkubWFpbl9jbGsJPSAid2RfdGltZXIzX2ZjayIsCiAJLnByY20gPSB7CiAJCS5vbWFwNCA9IHsKQEAgLTUxMDksNyArNTExMyw3IEBACiAJJm9tYXA0NHh4X2l2YV9zZXExX2h3bW9kLAogCiAJLyoga2JkIGNsYXNzICovCi0vKgkmb21hcDQ0eHhfa2JkX2h3bW9kLCAqLworCSZvbWFwNDR4eF9rYmRfaHdtb2QsCiAKIAkvKiBtYWlsYm94IGNsYXNzICovCiAJJm9tYXA0NHh4X21haWxib3hfaHdtb2QsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfY29tbW9uX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF9jb21tb25fZGF0YS5jCmluZGV4IDA4YTEzNDIuLmRlODMyZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF9jb21tb25fZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF9jb21tb25fZGF0YS5jCkBAIC00OSwyMyArNDksMyBAQAogCS5zcnN0X3NoaWZ0CT0gU1lTQ19UWVBFMl9TT0ZUUkVTRVRfU0hJRlQsCiB9OwogCi0KLS8qCi0gKiBvbWFwX2h3bW9kIGNsYXNzIGRhdGEKLSAqLwotCi1zdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBsM19od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJsMyIKLX07Ci0KLXN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIGw0X2h3bW9kX2NsYXNzID0gewotCS5uYW1lID0gImw0IgotfTsKLQotc3RydWN0IG9tYXBfaHdtb2RfY2xhc3MgbXB1X2h3bW9kX2NsYXNzID0gewotCS5uYW1lID0gIm1wdSIKLX07Ci0KLXN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIGl2YV9od21vZF9jbGFzcyA9IHsKLQkubmFtZSA9ICJpdmEiCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kX2NvbW1vbl9kYXRhLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfY29tbW9uX2RhdGEuaAppbmRleCBjMzRlOThiLi4zOWE3YzM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfY29tbW9uX2RhdGEuaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfY29tbW9uX2RhdGEuaApAQCAtMSwxMCArMSwxMCBAQAogLyoKICAqIG9tYXBfaHdtb2RfY29tbW9uX2RhdGEuaCAtIE9NQVAgaHdtb2QgY29tbW9uIG1hY3JvcyBhbmQgZGVjbGFyYXRpb25zCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgogICogUGF1bCBXYWxtc2xleQogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KICAqIEJlbm/DrnQgQ291c3NvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0xNiwxMCArMTYsOTkgQEAKIAogI2luY2x1ZGUgPHBsYXQvb21hcF9od21vZC5oPgogCisvKiBDb21tb24gYWRkcmVzcyBzcGFjZSBhY3Jvc3MgT01BUDJ4eHggKi8KK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyeHh4X3VhcnQxX2FkZHJfc3BhY2VbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyeHh4X3VhcnQyX2FkZHJfc3BhY2VbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyeHh4X3VhcnQzX2FkZHJfc3BhY2VbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyeHh4X3RpbWVyMl9hZGRyc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJ4eHhfdGltZXIzX2FkZHJzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMnh4eF90aW1lcjRfYWRkcnNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyeHh4X3RpbWVyNV9hZGRyc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJ4eHhfdGltZXI2X2FkZHJzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMnh4eF90aW1lcjdfYWRkcnNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyeHh4X3RpbWVyOF9hZGRyc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJ4eHhfdGltZXI5X2FkZHJzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMnh4eF90aW1lcjEyX2FkZHJzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMnh4eF9tY2JzcDJfYWRkcnNbXTsKKworLyogQ29tbW9uIGFkZHJlc3Mgc3BhY2UgYWNyb3NzIE9NQVAyeHh4LzN4eHggKi8KK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyX2kyYzFfYWRkcl9zcGFjZVtdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJfaTJjMl9hZGRyX3NwYWNlW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMl9kc3NfYWRkcnNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyX2Rzc19kaXNwY19hZGRyc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJfZHNzX3JmYmlfYWRkcnNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyX2Rzc192ZW5jX2FkZHJzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMl90aW1lcjEwX2FkZHJzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMl90aW1lcjExX2FkZHJzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF9tbWMxX2FkZHJfc3BhY2VbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyNDMwX21tYzJfYWRkcl9zcGFjZVtdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJfbWNzcGkxX2FkZHJfc3BhY2VbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9hZGRyX3NwYWNlIG9tYXAyX21jc3BpMl9hZGRyX3NwYWNlW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfYWRkcl9zcGFjZSBvbWFwMjQzMF9tY3NwaTNfYWRkcl9zcGFjZVtdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJfZG1hX3N5c3RlbV9hZGRyc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJfbWFpbGJveF9hZGRyc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2FkZHJfc3BhY2Ugb21hcDJfbWNic3AxX2FkZHJzW107CisKKy8qIENvbW1vbiBJUCBibG9jayBkYXRhIGFjcm9zcyBPTUFQMnh4eCAqLworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyeHh4X3RpbWVyMTJfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwMnh4eF9kc3Nfc2RtYV9jaHNbXTsKKworLyogQ29tbW9uIElQIGJsb2NrIGRhdGEgKi8KK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwMl91YXJ0MV9zZG1hX3JlcXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwMl91YXJ0Ml9zZG1hX3JlcXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwMl91YXJ0M19zZG1hX3JlcXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwMl9pMmMxX3NkbWFfcmVxc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAyX2kyYzJfc2RtYV9yZXFzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDJfbWNzcGkxX3NkbWFfcmVxc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAyX21jc3BpMl9zZG1hX3JlcXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9kbWFfaW5mbyBvbWFwMl9tY2JzcDFfc2RtYV9yZXFzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gb21hcDJfbWNic3AyX3NkbWFfcmVxc1tdOworCisvKiBDb21tb24gSVAgYmxvY2sgZGF0YSBvbiBPTUFQMjQzMC9PTUFQMyAqLworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIG9tYXAyX21jYnNwM19zZG1hX3JlcXNbXTsKKworLyogQ29tbW9uIElQIGJsb2NrIGRhdGEgYWNyb3NzIE9NQVAyLzMgKi8KK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl90aW1lcjFfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl90aW1lcjJfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl90aW1lcjNfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl90aW1lcjRfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl90aW1lcjVfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl90aW1lcjZfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl90aW1lcjdfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl90aW1lcjhfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl90aW1lcjlfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl90aW1lcjEwX21wdV9pcnFzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdGltZXIxMV9tcHVfaXJxc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyX3VhcnQxX21wdV9pcnFzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfdWFydDJfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl91YXJ0M19tcHVfaXJxc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyX2Rpc3BjX2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl9pMmMxX21wdV9pcnFzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfaTJjMl9tcHVfaXJxc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyX2dwaW8xX2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl9ncGlvMl9pcnFzW107CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDJfZ3BpbzNfaXJxc1tdOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIG9tYXAyX2dwaW80X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl9kbWFfc3lzdGVtX2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl9tY3NwaTFfbXB1X2lycXNbXTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwMl9tY3NwaTJfbXB1X2lycXNbXTsKKwogLyogT01BUCBod21vZCBjbGFzc2VzIC0gZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KIGV4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBsM19od21vZF9jbGFzczsKIGV4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBsNF9od21vZF9jbGFzczsKIGV4dGVybiBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBtcHVfaHdtb2RfY2xhc3M7CiBleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfY2xhc3MgaXZhX2h3bW9kX2NsYXNzOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyX3VhcnRfY2xhc3M7CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDJfZHNzX2h3bW9kX2NsYXNzOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyX2Rpc3BjX2h3bW9kX2NsYXNzOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyX3JmYmlfaHdtb2RfY2xhc3M7CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDJfdmVuY19od21vZF9jbGFzczsKKworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyeHh4X3dkX3RpbWVyX2h3bW9kX2NsYXNzOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyeHh4X2dwaW9faHdtb2RfY2xhc3M7CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDJ4eHhfZG1hX2h3bW9kX2NsYXNzOworZXh0ZXJuIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIG9tYXAyeHh4X21haWxib3hfaHdtb2RfY2xhc3M7CitleHRlcm4gc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDJ4eHhfbWNzcGlfY2xhc3M7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX3BoeV9pbnRlcm5hbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX3BoeV9pbnRlcm5hbC5jCmluZGV4IGY0NzgxM2UuLjU4Nzc1ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9waHlfaW50ZXJuYWwuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfcGh5X2ludGVybmFsLmMKQEAgLTU2LDggKzU2LDEwIEBACiAJLyogUG93ZXIgZG93biB0aGUgcGh5ICovCiAJX19yYXdfd3JpdGVsKFBIWV9QRCwgY3RybF9iYXNlICsgQ09OVFJPTF9ERVZfQ09ORik7CiAKLQlpZiAoIWRldikKKwlpZiAoIWRldikgeworCQlpb3VubWFwKGN0cmxfYmFzZSk7CiAJCXJldHVybiAwOworCX0KIAogCXBoeWNsayA9IGNsa19nZXQoZGV2LCAib2NwMnNjcF91c2JfcGh5X2ljayIpOwogCWlmIChJU19FUlIocGh5Y2xrKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS1kZWJ1Zy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS1kZWJ1Zy5jCmluZGV4IGE1YTgzYjMuLjQ0MTExNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0tZGVidWcuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLWRlYnVnLmMKQEAgLTM4LDMxOCArMzgsMjEgQEAKICNpbmNsdWRlICJwcm0yeHh4XzN4eHguaCIKICNpbmNsdWRlICJwbS5oIgogCi1pbnQgb21hcDJfcG1fZGVidWc7CiB1MzIgZW5hYmxlX29mZl9tb2RlOwotdTMyIHNsZWVwX3doaWxlX2lkbGU7Ci11MzIgd2FrZXVwX3RpbWVyX3NlY29uZHM7Ci11MzIgd2FrZXVwX3RpbWVyX21pbGxpc2Vjb25kczsKLQotI2RlZmluZSBEVU1QX1BSTV9NT0RfUkVHKG1vZCwgcmVnKSAgICBcCi0JcmVnc1tyZWdfY291bnRdLm5hbWUgPSAjbW9kICIuIiAjcmVnOyBcCi0JcmVnc1tyZWdfY291bnQrK10udmFsID0gb21hcDJfcHJtX3JlYWRfbW9kX3JlZyhtb2QsIHJlZykKLSNkZWZpbmUgRFVNUF9DTV9NT0RfUkVHKG1vZCwgcmVnKSAgICAgXAotCXJlZ3NbcmVnX2NvdW50XS5uYW1lID0gI21vZCAiLiIgI3JlZzsgXAotCXJlZ3NbcmVnX2NvdW50KytdLnZhbCA9IG9tYXAyX2NtX3JlYWRfbW9kX3JlZyhtb2QsIHJlZykKLSNkZWZpbmUgRFVNUF9QUk1fUkVHKHJlZykgXAotCXJlZ3NbcmVnX2NvdW50XS5uYW1lID0gI3JlZzsgXAotCXJlZ3NbcmVnX2NvdW50KytdLnZhbCA9IF9fcmF3X3JlYWRsKHJlZykKLSNkZWZpbmUgRFVNUF9DTV9SRUcocmVnKSBcCi0JcmVnc1tyZWdfY291bnRdLm5hbWUgPSAjcmVnOyBcCi0JcmVnc1tyZWdfY291bnQrK10udmFsID0gX19yYXdfcmVhZGwocmVnKQotI2RlZmluZSBEVU1QX0lOVENfUkVHKHJlZywgb2ZmKSBcCi0JcmVnc1tyZWdfY291bnRdLm5hbWUgPSAjcmVnOyBcCi0JcmVnc1tyZWdfY291bnQrK10udmFsID0gXAotCQkJIF9fcmF3X3JlYWRsKE9NQVAyX0w0X0lPX0FERFJFU1MoMHg0ODBmZTAwMCArIChvZmYpKSkKLQotdm9pZCBvbWFwMl9wbV9kdW1wKGludCBtb2RlLCBpbnQgcmVzdW1lLCB1bnNpZ25lZCBpbnQgdXMpCi17Ci0Jc3RydWN0IHJlZyB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0JCXUzMiB2YWw7Ci0JfSByZWdzWzMyXTsKLQlpbnQgcmVnX2NvdW50ID0gMCwgaTsKLQljb25zdCBjaGFyICpzMSA9IE5VTEwsICpzMiA9IE5VTEw7Ci0KLQlpZiAoIXJlc3VtZSkgewotI2lmIDAKLQkJLyogTVBVICovCi0JCURVTVBfUFJNX01PRF9SRUcoT0NQX01PRCwgT01BUDJfUFJNX0lSUUVOQUJMRV9NUFVfT0ZGU0VUKTsKLQkJRFVNUF9DTV9NT0RfUkVHKE1QVV9NT0QsIE9NQVAyX0NNX0NMS1NUQ1RSTCk7Ci0JCURVTVBfUFJNX01PRF9SRUcoTVBVX01PRCwgT01BUDJfUE1fUFdTVENUUkwpOwotCQlEVU1QX1BSTV9NT0RfUkVHKE1QVV9NT0QsIE9NQVAyX1BNX1BXU1RTVCk7Ci0JCURVTVBfUFJNX01PRF9SRUcoTVBVX01PRCwgUE1fV0tERVApOwotI2VuZGlmCi0jaWYgMAotCQkvKiBJTlRDICovCi0JCURVTVBfSU5UQ19SRUcoSU5UQ19NSVIwLCAweDAwODQpOwotCQlEVU1QX0lOVENfUkVHKElOVENfTUlSMSwgMHgwMGE0KTsKLQkJRFVNUF9JTlRDX1JFRyhJTlRDX01JUjIsIDB4MDBjNCk7Ci0jZW5kaWYKLSNpZiAwCi0JCURVTVBfQ01fTU9EX1JFRyhDT1JFX01PRCwgQ01fRkNMS0VOMSk7Ci0JCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQkJRFVNUF9DTV9NT0RfUkVHKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKTsKLQkJCURVTVBfUFJNX01PRF9SRUcoT01BUDI0WFhfR1JfTU9ELAotCQkJCQlPTUFQMl9QUkNNX0NMS0VNVUxfQ1RSTF9PRkZTRVQpOwotCQkJRFVNUF9QUk1fTU9EX1JFRyhPTUFQMjRYWF9HUl9NT0QsCi0JCQkJCU9NQVAyX1BSQ01fQ0xLU1JDX0NUUkxfT0ZGU0VUKTsKLQkJfQotCQlEVU1QX0NNX01PRF9SRUcoV0tVUF9NT0QsIENNX0ZDTEtFTik7Ci0JCURVTVBfQ01fTU9EX1JFRyhDT1JFX01PRCwgQ01fSUNMS0VOMSk7Ci0JCURVTVBfQ01fTU9EX1JFRyhDT1JFX01PRCwgQ01fSUNMS0VOMik7Ci0JCURVTVBfQ01fTU9EX1JFRyhXS1VQX01PRCwgQ01fSUNMS0VOKTsKLQkJRFVNUF9DTV9NT0RfUkVHKFBMTF9NT0QsIENNX0NMS0VOKTsKLQkJRFVNUF9DTV9NT0RfUkVHKFBMTF9NT0QsIENNX0FVVE9JRExFKTsKLQkJRFVNUF9QUk1fTU9EX1JFRyhDT1JFX01PRCwgT01BUDJfUE1fUFdTVFNUKTsKLSNlbmRpZgotI2lmIDAKLQkJLyogRFNQICovCi0JCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQkJRFVNUF9DTV9NT0RfUkVHKE9NQVAyNFhYX0RTUF9NT0QsIENNX0ZDTEtFTik7Ci0JCQlEVU1QX0NNX01PRF9SRUcoT01BUDI0WFhfRFNQX01PRCwgQ01fSUNMS0VOKTsKLQkJCURVTVBfQ01fTU9EX1JFRyhPTUFQMjRYWF9EU1BfTU9ELCBDTV9JRExFU1QpOwotCQkJRFVNUF9DTV9NT0RfUkVHKE9NQVAyNFhYX0RTUF9NT0QsIENNX0FVVE9JRExFKTsKLQkJCURVTVBfQ01fTU9EX1JFRyhPTUFQMjRYWF9EU1BfTU9ELCBDTV9DTEtTRUwpOwotCQkJRFVNUF9DTV9NT0RfUkVHKE9NQVAyNFhYX0RTUF9NT0QsIE9NQVAyX0NNX0NMS1NUQ1RSTCk7Ci0JCQlEVU1QX1BSTV9NT0RfUkVHKE9NQVAyNFhYX0RTUF9NT0QsIE9NQVAyX1JNX1JTVENUUkwpOwotCQkJRFVNUF9QUk1fTU9EX1JFRyhPTUFQMjRYWF9EU1BfTU9ELCBPTUFQMl9STV9SU1RTVCk7Ci0JCQlEVU1QX1BSTV9NT0RfUkVHKE9NQVAyNFhYX0RTUF9NT0QsIE9NQVAyX1BNX1BXU1RDVFJMKTsKLQkJCURVTVBfUFJNX01PRF9SRUcoT01BUDI0WFhfRFNQX01PRCwgT01BUDJfUE1fUFdTVFNUKTsKLQkJfQotI2VuZGlmCi0JfSBlbHNlIHsKLQkJRFVNUF9QUk1fTU9EX1JFRyhDT1JFX01PRCwgUE1fV0tTVDEpOwotCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCi0JCQlEVU1QX1BSTV9NT0RfUkVHKENPUkVfTU9ELCBPTUFQMjRYWF9QTV9XS1NUMik7Ci0JCURVTVBfUFJNX01PRF9SRUcoV0tVUF9NT0QsIFBNX1dLU1QpOwotCQlEVU1QX1BSTV9NT0RfUkVHKE9DUF9NT0QsIE9NQVAyX1BSQ01fSVJRU1RBVFVTX01QVV9PRkZTRVQpOwotI2lmIDEKLQkJRFVNUF9JTlRDX1JFRyhJTlRDX1BFTkRJTkdfSVJRMCwgMHgwMDk4KTsKLQkJRFVNUF9JTlRDX1JFRyhJTlRDX1BFTkRJTkdfSVJRMSwgMHgwMGI4KTsKLQkJRFVNUF9JTlRDX1JFRyhJTlRDX1BFTkRJTkdfSVJRMiwgMHgwMGQ4KTsKLSNlbmRpZgotCX0KLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgMDoKLQkJczEgPSAiZnVsbCI7Ci0JCXMyID0gInJldGVudGlvbiI7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJczEgPSAiTVBVIjsKLQkJczIgPSAicmV0ZW50aW9uIjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlzMSA9ICJNUFUiOwotCQlzMiA9ICJpZGxlIjsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFyZXN1bWUpCi0jaWZkZWYgQ09ORklHX05PX0haCi0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICItLS0gR29pbmcgdG8gJXMgJXMgKG5leHQgdGltZXIgYWZ0ZXIgJXUgbXMpXG4iLCBzMSwgczIsCi0JCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKGdldF9uZXh0X3RpbWVyX2ludGVycnVwdChqaWZmaWVzKSAtCi0JCQkJCWppZmZpZXMpKTsKLSNlbHNlCi0JCXByaW50ayhLRVJOX0lORk8gIi0tLSBHb2luZyB0byAlcyAlc1xuIiwgczEsIHMyKTsKLSNlbmRpZgotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAiLS0tIFdva2UgdXAgKHNsZXB0IGZvciAldS4lMDN1IG1zKVxuIiwKLQkJCXVzIC8gMTAwMCwgdXMgJSAxMDAwKTsKLQotCWZvciAoaSA9IDA7IGkgPCByZWdfY291bnQ7IGkrKykKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJS0yMHM6IDB4JTA4eFxuIiwgcmVnc1tpXS5uYW1lLCByZWdzW2ldLnZhbCk7Ci19Ci0KLXZvaWQgb21hcDJfcG1fd2FrZXVwX29uX3RpbWVyKHUzMiBzZWNvbmRzLCB1MzIgbWlsbGlzZWNvbmRzKQotewotCXUzMiB0aWNrX3JhdGUsIGN5Y2xlczsKLQotCWlmICghc2Vjb25kcyAmJiAhbWlsbGlzZWNvbmRzKQotCQlyZXR1cm47Ci0KLQl0aWNrX3JhdGUgPSBjbGtfZ2V0X3JhdGUob21hcF9kbV90aW1lcl9nZXRfZmNsayhncHRpbWVyX3dha2V1cCkpOwotCWN5Y2xlcyA9IHRpY2tfcmF0ZSAqIHNlY29uZHMgKyB0aWNrX3JhdGUgKiBtaWxsaXNlY29uZHMgLyAxMDAwOwotCW9tYXBfZG1fdGltZXJfc3RvcChncHRpbWVyX3dha2V1cCk7Ci0Jb21hcF9kbV90aW1lcl9zZXRfbG9hZF9zdGFydChncHRpbWVyX3dha2V1cCwgMCwgMHhmZmZmZmZmZiAtIGN5Y2xlcyk7Ci0KLQlwcl9pbmZvKCJQTTogUmVzdW1lIHRpbWVyIGluICV1LiUwM3Ugc2VjcyIKLQkJIiAoJWQgdGlja3MgYXQgJWQgdGlja3Mvc2VjLilcbiIsCi0JCXNlY29uZHMsIG1pbGxpc2Vjb25kcywgY3ljbGVzLCB0aWNrX3JhdGUpOwotfQogCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKLXN0YXRpYyB2b2lkIHBtX2RiZ19yZWdzZXRfc3RvcmUodTMyICpwdHIpOwotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqcG1fZGJnX2RpcjsKLQogc3RhdGljIGludCBwbV9kYmdfaW5pdF9kb25lOwogCi1zdGF0aWMgaW50IF9faW5pdCBwbV9kYmdfaW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgcG1fZGJnX2luaXQodm9pZCk7CiAKIGVudW0gewogCURFQlVHX0ZJTEVfQ09VTlRFUlMgPSAwLAogCURFQlVHX0ZJTEVfVElNRVJTLAogfTsKIAotc3RydWN0IHBtX21vZHVsZV9kZWYgewotCWNoYXIgbmFtZVs4XTsgLyogTmFtZSBvZiB0aGUgbW9kdWxlICovCi0Jc2hvcnQgdHlwZTsgLyogQ00gb3IgUFJNICovCi0JdW5zaWduZWQgc2hvcnQgb2Zmc2V0OwotCWludCBsb3c7IC8qIEZpcnN0IHJlZ2lzdGVyIGFkZHJlc3Mgb24gdGhpcyBtb2R1bGUgKi8KLQlpbnQgaGlnaDsgLyogTGFzdCByZWdpc3RlciBhZGRyZXNzIG9uIHRoaXMgbW9kdWxlICovCi19OwotCi0jZGVmaW5lIE1PRF9DTSAwCi0jZGVmaW5lIE1PRF9QUk0gMQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBtX21vZHVsZV9kZWYgKnBtX2RiZ19yZWdfbW9kdWxlczsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcG1fbW9kdWxlX2RlZiBvbWFwM19wbV9yZWdfbW9kdWxlc1tdID0gewotCXsgIklWQTIiLCBNT0RfQ00sIE9NQVAzNDMwX0lWQTJfTU9ELCAwLCAweDRjIH0sCi0JeyAiT0NQIiwgTU9EX0NNLCBPQ1BfTU9ELCAwLCAweDEwIH0sCi0JeyAiTVBVIiwgTU9EX0NNLCBNUFVfTU9ELCA0LCAweDRjIH0sCi0JeyAiQ09SRSIsIE1PRF9DTSwgQ09SRV9NT0QsIDAsIDB4NGMgfSwKLQl7ICJTR1giLCBNT0RfQ00sIE9NQVAzNDMwRVMyX1NHWF9NT0QsIDAsIDB4NGMgfSwKLQl7ICJXS1VQIiwgTU9EX0NNLCBXS1VQX01PRCwgMCwgMHg0MCB9LAotCXsgIkNDUiIsIE1PRF9DTSwgUExMX01PRCwgMCwgMHg3MCB9LAotCXsgIkRTUyIsIE1PRF9DTSwgT01BUDM0MzBfRFNTX01PRCwgMCwgMHg0YyB9LAotCXsgIkNBTSIsIE1PRF9DTSwgT01BUDM0MzBfQ0FNX01PRCwgMCwgMHg0YyB9LAotCXsgIlBFUiIsIE1PRF9DTSwgT01BUDM0MzBfUEVSX01PRCwgMCwgMHg0YyB9LAotCXsgIkVNVSIsIE1PRF9DTSwgT01BUDM0MzBfRU1VX01PRCwgMHg0MCwgMHg1NCB9LAotCXsgIk5FT04iLCBNT0RfQ00sIE9NQVAzNDMwX05FT05fTU9ELCAweDIwLCAweDQ4IH0sCi0JeyAiVVNCIiwgTU9EX0NNLCBPTUFQMzQzMEVTMl9VU0JIT1NUX01PRCwgMCwgMHg0YyB9LAotCi0JeyAiSVZBMiIsIE1PRF9QUk0sIE9NQVAzNDMwX0lWQTJfTU9ELCAweDUwLCAweGZjIH0sCi0JeyAiT0NQIiwgTU9EX1BSTSwgT0NQX01PRCwgNCwgMHgxYyB9LAotCXsgIk1QVSIsIE1PRF9QUk0sIE1QVV9NT0QsIDB4NTgsIDB4ZTggfSwKLQl7ICJDT1JFIiwgTU9EX1BSTSwgQ09SRV9NT0QsIDB4NTgsIDB4ZjggfSwKLQl7ICJTR1giLCBNT0RfUFJNLCBPTUFQMzQzMEVTMl9TR1hfTU9ELCAweDU4LCAweGU4IH0sCi0JeyAiV0tVUCIsIE1PRF9QUk0sIFdLVVBfTU9ELCAweGEwLCAweGIwIH0sCi0JeyAiQ0NSIiwgTU9EX1BSTSwgUExMX01PRCwgMHg0MCwgMHg3MCB9LAotCXsgIkRTUyIsIE1PRF9QUk0sIE9NQVAzNDMwX0RTU19NT0QsIDB4NTgsIDB4ZTggfSwKLQl7ICJDQU0iLCBNT0RfUFJNLCBPTUFQMzQzMF9DQU1fTU9ELCAweDU4LCAweGU4IH0sCi0JeyAiUEVSIiwgTU9EX1BSTSwgT01BUDM0MzBfUEVSX01PRCwgMHg1OCwgMHhlOCB9LAotCXsgIkVNVSIsIE1PRF9QUk0sIE9NQVAzNDMwX0VNVV9NT0QsIDB4NTgsIDB4ZTQgfSwKLQl7ICJHTEJMIiwgTU9EX1BSTSwgT01BUDM0MzBfR1JfTU9ELCAweDIwLCAweGU0IH0sCi0JeyAiTkVPTiIsIE1PRF9QUk0sIE9NQVAzNDMwX05FT05fTU9ELCAweDU4LCAweGU4IH0sCi0JeyAiVVNCIiwgTU9EX1BSTSwgT01BUDM0MzBFUzJfVVNCSE9TVF9NT0QsIDB4NTgsIDB4ZTggfSwKLQl7ICIiLCAwLCAwLCAwLCAwIH0sCi19OwotCi0jZGVmaW5lIFBNX0RCR19NQVhfUkVHX1NFVFMgNAotCi1zdGF0aWMgdm9pZCAqcG1fZGJnX3JlZ19zZXRbUE1fREJHX01BWF9SRUdfU0VUU107Ci0KLXN0YXRpYyBpbnQgcG1fZGJnX2dldF9yZWdzZXRfc2l6ZSh2b2lkKQotewotCXN0YXRpYyBpbnQgcmVnc2V0X3NpemU7Ci0KLQlpZiAocmVnc2V0X3NpemUgPT0gMCkgewotCQlpbnQgaSA9IDA7Ci0KLQkJd2hpbGUgKHBtX2RiZ19yZWdfbW9kdWxlc1tpXS5uYW1lWzBdICE9IDApIHsKLQkJCXJlZ3NldF9zaXplICs9IHBtX2RiZ19yZWdfbW9kdWxlc1tpXS5oaWdoICsKLQkJCQk0IC0gcG1fZGJnX3JlZ19tb2R1bGVzW2ldLmxvdzsKLQkJCWkrKzsKLQkJfQotCX0KLQlyZXR1cm4gcmVnc2V0X3NpemU7Ci19Ci0KLXN0YXRpYyBpbnQgcG1fZGJnX3Nob3dfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnVudXNlZCkKLXsKLQlpbnQgaSwgajsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgcmVnX3NldCA9IChpbnQpcy0+cHJpdmF0ZTsKLQl1MzIgKnB0cjsKLQl2b2lkICpzdG9yZSA9IE5VTEw7Ci0JaW50IHJlZ3M7Ci0JaW50IGxpbmVmZWVkOwotCi0JaWYgKHJlZ19zZXQgPT0gMCkgewotCQlzdG9yZSA9IGttYWxsb2MocG1fZGJnX2dldF9yZWdzZXRfc2l6ZSgpLCBHRlBfS0VSTkVMKTsKLQkJcHRyID0gc3RvcmU7Ci0JCXBtX2RiZ19yZWdzZXRfc3RvcmUocHRyKTsKLQl9IGVsc2UgewotCQlwdHIgPSBwbV9kYmdfcmVnX3NldFtyZWdfc2V0IC0gMV07Ci0JfQotCi0JaSA9IDA7Ci0KLQl3aGlsZSAocG1fZGJnX3JlZ19tb2R1bGVzW2ldLm5hbWVbMF0gIT0gMCkgewotCQlyZWdzID0gMDsKLQkJbGluZWZlZWQgPSAwOwotCQlpZiAocG1fZGJnX3JlZ19tb2R1bGVzW2ldLnR5cGUgPT0gTU9EX0NNKQotCQkJc2VxX3ByaW50ZihzLCAiTU9EOiBDTV8lcyAoJTA4eClcbiIsCi0JCQkJcG1fZGJnX3JlZ19tb2R1bGVzW2ldLm5hbWUsCi0JCQkJKHUzMikoT01BUDM0MzBfQ01fQkFTRSArCi0JCQkJcG1fZGJnX3JlZ19tb2R1bGVzW2ldLm9mZnNldCkpOwotCQllbHNlCi0JCQlzZXFfcHJpbnRmKHMsICJNT0Q6IFBSTV8lcyAoJTA4eClcbiIsCi0JCQkJcG1fZGJnX3JlZ19tb2R1bGVzW2ldLm5hbWUsCi0JCQkJKHUzMikoT01BUDM0MzBfUFJNX0JBU0UgKwotCQkJCXBtX2RiZ19yZWdfbW9kdWxlc1tpXS5vZmZzZXQpKTsKLQotCQlmb3IgKGogPSBwbV9kYmdfcmVnX21vZHVsZXNbaV0ubG93OwotCQkJaiA8PSBwbV9kYmdfcmVnX21vZHVsZXNbaV0uaGlnaDsgaiArPSA0KSB7Ci0JCQl2YWwgPSAqKHB0cisrKTsKLQkJCWlmICh2YWwgIT0gMCkgewotCQkJCXJlZ3MrKzsKLQkJCQlpZiAobGluZWZlZWQpIHsKLQkJCQkJc2VxX3ByaW50ZihzLCAiXG4iKTsKLQkJCQkJbGluZWZlZWQgPSAwOwotCQkJCX0KLQkJCQlzZXFfcHJpbnRmKHMsICIgICUwMnggPT4gJTA4bHgiLCBqLCB2YWwpOwotCQkJCWlmIChyZWdzICUgNCA9PSAwKQotCQkJCQlsaW5lZmVlZCA9IDE7Ci0JCQl9Ci0JCX0KLQkJc2VxX3ByaW50ZihzLCAiXG4iKTsKLQkJaSsrOwotCX0KLQotCWlmIChzdG9yZSAhPSBOVUxMKQotCQlrZnJlZShzdG9yZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcG1fZGJnX3JlZ3NldF9zdG9yZSh1MzIgKnB0cikKLXsKLQlpbnQgaSwgajsKLQl1MzIgdmFsOwotCi0JaSA9IDA7Ci0KLQl3aGlsZSAocG1fZGJnX3JlZ19tb2R1bGVzW2ldLm5hbWVbMF0gIT0gMCkgewotCQlmb3IgKGogPSBwbV9kYmdfcmVnX21vZHVsZXNbaV0ubG93OwotCQkJaiA8PSBwbV9kYmdfcmVnX21vZHVsZXNbaV0uaGlnaDsgaiArPSA0KSB7Ci0JCQlpZiAocG1fZGJnX3JlZ19tb2R1bGVzW2ldLnR5cGUgPT0gTU9EX0NNKQotCQkJCXZhbCA9IG9tYXAyX2NtX3JlYWRfbW9kX3JlZygKLQkJCQkJcG1fZGJnX3JlZ19tb2R1bGVzW2ldLm9mZnNldCwgaik7Ci0JCQllbHNlCi0JCQkJdmFsID0gb21hcDJfcHJtX3JlYWRfbW9kX3JlZygKLQkJCQkJcG1fZGJnX3JlZ19tb2R1bGVzW2ldLm9mZnNldCwgaik7Ci0JCQkqKHB0cisrKSA9IHZhbDsKLQkJfQotCQlpKys7Ci0JfQotfQotCi1pbnQgcG1fZGJnX3JlZ3NldF9zYXZlKGludCByZWdfc2V0KQotewotCWlmIChwbV9kYmdfcmVnX3NldFtyZWdfc2V0LTFdID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcG1fZGJnX3JlZ3NldF9zdG9yZShwbV9kYmdfcmVnX3NldFtyZWdfc2V0LTFdKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3QgY2hhciBwd3JkbV9zdGF0ZV9uYW1lc1tdW1BXUkRNX01BWF9QV1JTVFNdID0gewogCSJPRkYiLAogCSJSRVQiLApAQCAtNDY5LDExICsxNzIsNiBAQAogCX07CiB9CiAKLXN0YXRpYyBpbnQgcG1fZGJnX3JlZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwbV9kYmdfc2hvd19yZWdzLCBpbm9kZS0+aV9wcml2YXRlKTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfZm9wcyA9IHsKIAkub3BlbiAgICAgICAgICAgPSBwbV9kYmdfb3BlbiwKIAkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKQEAgLTQ4MSw0MCArMTc5LDYgQEAKIAkucmVsZWFzZSAgICAgICAgPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX3JlZ19mb3BzID0gewotCS5vcGVuICAgICAgICAgICA9IHBtX2RiZ19yZWdfb3BlbiwKLQkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgICAgICAgID0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi1pbnQgcG1fZGJnX3JlZ3NldF9pbml0KGludCByZWdfc2V0KQotewotCWNoYXIgbmFtZVsyXTsKLQotCWlmICghcG1fZGJnX2luaXRfZG9uZSkKLQkJcG1fZGJnX2luaXQoKTsKLQotCWlmIChyZWdfc2V0IDwgMSB8fCByZWdfc2V0ID4gUE1fREJHX01BWF9SRUdfU0VUUyB8fAotCQlwbV9kYmdfcmVnX3NldFtyZWdfc2V0LTFdICE9IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcG1fZGJnX3JlZ19zZXRbcmVnX3NldC0xXSA9Ci0JCWttYWxsb2MocG1fZGJnX2dldF9yZWdzZXRfc2l6ZSgpLCBHRlBfS0VSTkVMKTsKLQotCWlmIChwbV9kYmdfcmVnX3NldFtyZWdfc2V0LTFdID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKHBtX2RiZ19kaXIgIT0gTlVMTCkgewotCQlzcHJpbnRmKG5hbWUsICIlZCIsIHJlZ19zZXQpOwotCi0JCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSVJVR08sCi0JCQlwbV9kYmdfZGlyLCAodm9pZCAqKXJlZ19zZXQsICZkZWJ1Z19yZWdfZm9wcyk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgcHdyZG1fc3VzcGVuZF9nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCiB7CiAJaW50IHJldCA9IC1FSU5WQUw7CkBAIC01NzYsOSArMjQwLDYgQEAKIHsKIAl1MzIgKm9wdGlvbiA9IGRhdGE7CiAKLQlpZiAob3B0aW9uID09ICZ3YWtldXBfdGltZXJfbWlsbGlzZWNvbmRzICYmIHZhbCA+PSAxMDAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCSpvcHRpb24gPSB2YWw7CiAKIAlpZiAob3B0aW9uID09ICZlbmFibGVfb2ZmX21vZGUpIHsKQEAgLTU5NywyMCArMjU4LDExIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBtX2RiZ19pbml0KHZvaWQpCiB7Ci0JaW50IGk7CiAJc3RydWN0IGRlbnRyeSAqZDsKLQljaGFyIG5hbWVbMl07CiAKIAlpZiAocG1fZGJnX2luaXRfZG9uZSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpCi0JCXBtX2RiZ19yZWdfbW9kdWxlcyA9IG9tYXAzX3BtX3JlZ19tb2R1bGVzOwotCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvbmx5IE9NQVAzIHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KIAlkID0gZGVidWdmc19jcmVhdGVfZGlyKCJwbV9kZWJ1ZyIsIE5VTEwpOwogCWlmIChJU19FUlIoZCkpCiAJCXJldHVybiBQVFJfRVJSKGQpOwpAQCAtNjIyLDMwICsyNzQsOCBAQAogCiAJcHdyZG1fZm9yX2VhY2gocHdyZG1zX3NldHVwLCAodm9pZCAqKWQpOwogCi0JcG1fZGJnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigicmVnaXN0ZXJzIiwgZCk7Ci0JaWYgKElTX0VSUihwbV9kYmdfZGlyKSkKLQkJcmV0dXJuIFBUUl9FUlIocG1fZGJnX2Rpcik7Ci0KLQkodm9pZCkgZGVidWdmc19jcmVhdGVfZmlsZSgiY3VycmVudCIsIFNfSVJVR08sCi0JCXBtX2RiZ19kaXIsICh2b2lkICopMCwgJmRlYnVnX3JlZ19mb3BzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBQTV9EQkdfTUFYX1JFR19TRVRTOyBpKyspCi0JCWlmIChwbV9kYmdfcmVnX3NldFtpXSAhPSBOVUxMKSB7Ci0JCQlzcHJpbnRmKG5hbWUsICIlZCIsIGkrMSk7Ci0JCQkodm9pZCkgZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lSVUdPLAotCQkJCXBtX2RiZ19kaXIsICh2b2lkICopKGkrMSksICZkZWJ1Z19yZWdfZm9wcyk7Ci0KLQkJfQotCiAJKHZvaWQpIGRlYnVnZnNfY3JlYXRlX2ZpbGUoImVuYWJsZV9vZmZfbW9kZSIsIFNfSVJVR08gfCBTX0lXVVNSLCBkLAogCQkJCSAgICZlbmFibGVfb2ZmX21vZGUsICZwbV9kYmdfb3B0aW9uX2ZvcHMpOwotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzbGVlcF93aGlsZV9pZGxlIiwgU19JUlVHTyB8IFNfSVdVU1IsIGQsCi0JCQkJICAgJnNsZWVwX3doaWxlX2lkbGUsICZwbV9kYmdfb3B0aW9uX2ZvcHMpOwotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ3YWtldXBfdGltZXJfc2Vjb25kcyIsIFNfSVJVR08gfCBTX0lXVVNSLCBkLAotCQkJCSAgICZ3YWtldXBfdGltZXJfc2Vjb25kcywgJnBtX2RiZ19vcHRpb25fZm9wcyk7Ci0JKHZvaWQpIGRlYnVnZnNfY3JlYXRlX2ZpbGUoIndha2V1cF90aW1lcl9taWxsaXNlY29uZHMiLAotCQkJU19JUlVHTyB8IFNfSVdVU1IsIGQsICZ3YWtldXBfdGltZXJfbWlsbGlzZWNvbmRzLAotCQkJJnBtX2RiZ19vcHRpb25fZm9wcyk7CiAJcG1fZGJnX2luaXRfZG9uZSA9IDE7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0uaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0uaAppbmRleCA0NWJjZmNlLi40ZTE2NmFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS5oCkBAIC02MCw0NiArNjAsNDAgQEAKIGV4dGVybiBpbnQgb21hcDNfcG1fZ2V0X3N1c3BlbmRfc3RhdGUoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSk7CiBleHRlcm4gaW50IG9tYXAzX3BtX3NldF9zdXNwZW5kX3N0YXRlKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sIGludCBzdGF0ZSk7CiAKLWV4dGVybiB1MzIgd2FrZXVwX3RpbWVyX3NlY29uZHM7Ci1leHRlcm4gdTMyIHdha2V1cF90aW1lcl9taWxsaXNlY29uZHM7Ci1leHRlcm4gc3RydWN0IG9tYXBfZG1fdGltZXIgKmdwdGltZXJfd2FrZXVwOwotCiAjaWZkZWYgQ09ORklHX1BNX0RFQlVHCi1leHRlcm4gdm9pZCBvbWFwMl9wbV9kdW1wKGludCBtb2RlLCBpbnQgcmVzdW1lLCB1bnNpZ25lZCBpbnQgdXMpOwotZXh0ZXJuIHZvaWQgb21hcDJfcG1fd2FrZXVwX29uX3RpbWVyKHUzMiBzZWNvbmRzLCB1MzIgbWlsbGlzZWNvbmRzKTsKLWV4dGVybiBpbnQgb21hcDJfcG1fZGVidWc7CiBleHRlcm4gdTMyIGVuYWJsZV9vZmZfbW9kZTsKLWV4dGVybiB1MzIgc2xlZXBfd2hpbGVfaWRsZTsKICNlbHNlCi0jZGVmaW5lIG9tYXAyX3BtX2R1bXAobW9kZSwgcmVzdW1lLCB1cykJCWRvIHt9IHdoaWxlICgwKTsKLSNkZWZpbmUgb21hcDJfcG1fd2FrZXVwX29uX3RpbWVyKHNlY29uZHMsIG1pbGxpc2Vjb25kcykJZG8ge30gd2hpbGUgKDApOwotI2RlZmluZSBvbWFwMl9wbV9kZWJ1ZwkJCQkwCiAjZGVmaW5lIGVuYWJsZV9vZmZfbW9kZSAwCi0jZGVmaW5lIHNsZWVwX3doaWxlX2lkbGUgMAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19QTV9ERUJVRykgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCiBleHRlcm4gdm9pZCBwbV9kYmdfdXBkYXRlX3RpbWUoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwgaW50IHByZXYpOwotZXh0ZXJuIGludCBwbV9kYmdfcmVnc2V0X3NhdmUoaW50IHJlZ19zZXQpOwotZXh0ZXJuIGludCBwbV9kYmdfcmVnc2V0X2luaXQoaW50IHJlZ19zZXQpOwogI2Vsc2UKICNkZWZpbmUgcG1fZGJnX3VwZGF0ZV90aW1lKHB3cmRtLCBwcmV2KSBkbyB7fSB3aGlsZSAoMCk7Ci0jZGVmaW5lIHBtX2RiZ19yZWdzZXRfc2F2ZShyZWdfc2V0KSBkbyB7fSB3aGlsZSAoMCk7Ci0jZGVmaW5lIHBtX2RiZ19yZWdzZXRfaW5pdChyZWdfc2V0KSBkbyB7fSB3aGlsZSAoMCk7CiAjZW5kaWYgLyogQ09ORklHX1BNX0RFQlVHICovCiAKKy8qIDI0eHggKi8KIGV4dGVybiB2b2lkIG9tYXAyNHh4X2lkbGVfbG9vcF9zdXNwZW5kKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGludCBvbWFwMjR4eF9pZGxlX2xvb3Bfc3VzcGVuZF9zejsKIAogZXh0ZXJuIHZvaWQgb21hcDI0eHhfY3B1X3N1c3BlbmQodTMyIGRsbF9jdHJsLCB2b2lkIF9faW9tZW0gKnNkcmNfZGxsYV9jdHJsLAogCQkJCQl2b2lkIF9faW9tZW0gKnNkcmNfcG93ZXIpOwotZXh0ZXJuIHZvaWQgb21hcDM0eHhfY3B1X3N1c3BlbmQodTMyICphZGRyLCBpbnQgc2F2ZV9zdGF0ZSk7Ci1leHRlcm4gaW50IHNhdmVfc2VjdXJlX3JhbV9jb250ZXh0KHUzMiAqYWRkcik7Ci1leHRlcm4gdm9pZCBvbWFwM19zYXZlX3NjcmF0Y2hwYWRfY29udGVudHModm9pZCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgb21hcDI0eHhfaWRsZV9sb29wX3N1c3BlbmRfc3o7Ci1leHRlcm4gdW5zaWduZWQgaW50IHNhdmVfc2VjdXJlX3JhbV9jb250ZXh0X3N6OwogZXh0ZXJuIHVuc2lnbmVkIGludCBvbWFwMjR4eF9jcHVfc3VzcGVuZF9zejsKLWV4dGVybiB1bnNpZ25lZCBpbnQgb21hcDM0eHhfY3B1X3N1c3BlbmRfc3o7CisKKy8qIDN4eHggKi8KK2V4dGVybiB2b2lkIG9tYXAzNHh4X2NwdV9zdXNwZW5kKGludCBzYXZlX3N0YXRlKTsKKworLyogb21hcDNfZG9fd2ZpIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIHNpemUsIGZvciBjb3B5IHRvIFNSQU0gKi8KK2V4dGVybiB2b2lkIG9tYXAzX2RvX3dmaSh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgb21hcDNfZG9fd2ZpX3N6OworLyogLi4uIGFuZCBpdHMgcG9pbnRlciBmcm9tIFNSQU0gYWZ0ZXIgY29weSAqLworZXh0ZXJuIHZvaWQgKCpvbWFwM19kb193Zmlfc3JhbSkodm9pZCk7CisKKy8qIHNhdmVfc2VjdXJlX3JhbV9jb250ZXh0IGZ1bmN0aW9uIHBvaW50ZXIgYW5kIHNpemUsIGZvciBjb3B5IHRvIFNSQU0gKi8KK2V4dGVybiBpbnQgc2F2ZV9zZWN1cmVfcmFtX2NvbnRleHQodTMyICphZGRyKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgc2F2ZV9zZWN1cmVfcmFtX2NvbnRleHRfc3o7CisKK2V4dGVybiB2b2lkIG9tYXAzX3NhdmVfc2NyYXRjaHBhZF9jb250ZW50cyh2b2lkKTsKIAogI2RlZmluZSBQTV9SVEFfRVJSQVRVTV9pNjA4CQkoMSA8PCAwKQogI2RlZmluZSBQTV9TRFJDX1dBS0VVUF9FUlJBVFVNX2k1ODMJKDEgPDwgMSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0yNHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMjR4eC5jCmluZGV4IGRmM2RlZDYuLmJmMDg5ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0yNHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTI0eHguYwpAQCAtNTMsNiArNTMsOCBAQAogI2luY2x1ZGUgInBvd2VyZG9tYWluLmgiCiAjaW5jbHVkZSAiY2xvY2tkb21haW4uaCIKIAorc3RhdGljIGludCBvbWFwMl9wbV9kZWJ1ZzsKKwogI2lmZGVmIENPTkZJR19TVVNQRU5ECiBzdGF0aWMgc3VzcGVuZF9zdGF0ZV90IHN1c3BlbmRfc3RhdGUgPSBQTV9TVVNQRU5EX09OOwogc3RhdGljIGlubGluZSBib29sIGlzX3N1c3BlbmRpbmcodm9pZCkKQEAgLTEyMyw3ICsxMjUsNiBAQAogCW9tYXAyX2dwaW9fcHJlcGFyZV9mb3JfaWRsZSgwKTsKIAogCWlmIChvbWFwMl9wbV9kZWJ1ZykgewotCQlvbWFwMl9wbV9kdW1wKDAsIDAsIDApOwogCQlnZXRuc3RpbWVvZmRheSgmdHNfcHJlaWRsZSk7CiAJfQogCkBAIC0xNjAsNyArMTYxLDYgQEAKIAkJZ2V0bnN0aW1lb2ZkYXkoJnRzX3Bvc3RpZGxlKTsKIAkJdHNfaWRsZSA9IHRpbWVzcGVjX3N1Yih0c19wb3N0aWRsZSwgdHNfcHJlaWRsZSk7CiAJCXRtcCA9IHRpbWVzcGVjX3RvX25zKCZ0c19pZGxlKSAqIE5TRUNfUEVSX1VTRUM7Ci0JCW9tYXAyX3BtX2R1bXAoMCwgMSwgdG1wKTsKIAl9CiAJb21hcDJfZ3Bpb19yZXN1bWVfYWZ0ZXJfaWRsZSgpOwogCkBAIC0yNDcsNyArMjQ3LDYgQEAKIAl9CiAKIAlpZiAob21hcDJfcG1fZGVidWcpIHsKLQkJb21hcDJfcG1fZHVtcChvbmx5X2lkbGUgPyAyIDogMSwgMCwgMCk7CiAJCWdldG5zdGltZW9mZGF5KCZ0c19wcmVpZGxlKTsKIAl9CiAKQEAgLTI1OSw3ICsyNTgsNiBAQAogCQlnZXRuc3RpbWVvZmRheSgmdHNfcG9zdGlkbGUpOwogCQl0c19pZGxlID0gdGltZXNwZWNfc3ViKHRzX3Bvc3RpZGxlLCB0c19wcmVpZGxlKTsKIAkJdG1wID0gdGltZXNwZWNfdG9fbnMoJnRzX2lkbGUpICogTlNFQ19QRVJfVVNFQzsKLQkJb21hcDJfcG1fZHVtcChvbmx5X2lkbGUgPyAyIDogMSwgMSwgdG1wKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0zNHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMzR4eC5jCmluZGV4IGMxNTVjOWQuLjcyNTVkOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0zNHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTM0eHguYwpAQCAtMzEsNiArMzEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KIAorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CisKICNpbmNsdWRlIDxwbGF0L3NyYW0uaD4KICNpbmNsdWRlICJjbG9ja2RvbWFpbi5oIgogI2luY2x1ZGUgInBvd2VyZG9tYWluLmgiCkBAIC00MCw4ICs0Miw2IEBACiAjaW5jbHVkZSA8cGxhdC9ncG1jLmg+CiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KIAotI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgotCiAjaW5jbHVkZSAiY20yeHh4XzN4eHguaCIKICNpbmNsdWRlICJjbS1yZWdiaXRzLTM0eHguaCIKICNpbmNsdWRlICJwcm0tcmVnYml0cy0zNHh4LmgiCkBAIC02NCwxMSArNjQsNiBAQAogfQogI2VuZGlmCiAKLS8qIFNjcmF0Y2hwYWQgb2Zmc2V0cyAqLwotI2RlZmluZSBPTUFQMzQzWF9UQUJMRV9BRERSRVNTX09GRlNFVAkgICAweGM0Ci0jZGVmaW5lIE9NQVAzNDNYX1RBQkxFX1ZBTFVFX09GRlNFVAkgICAweGMwCi0jZGVmaW5lIE9NQVAzNDNYX0NPTlRST0xfUkVHX1ZBTFVFX09GRlNFVCAgMHhjOAotCiAvKiBwbTM0eHggZXJyYXRhIGRlZmluZWQgaW4gcG0uaCAqLwogdTE2IHBtMzR4eF9lcnJhdGE7CiAKQEAgLTgzLDkgKzc4LDggQEAKIAogc3RhdGljIExJU1RfSEVBRChwd3JzdF9saXN0KTsKIAotc3RhdGljIHZvaWQgKCpfb21hcF9zcmFtX2lkbGUpKHUzMiAqYWRkciwgaW50IHNhdmVfc3RhdGUpOwotCiBzdGF0aWMgaW50ICgqX29tYXBfc2F2ZV9zZWN1cmVfc3JhbSkodTMyICphZGRyKTsKK3ZvaWQgKCpvbWFwM19kb193Zmlfc3JhbSkodm9pZCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gKm1wdV9wd3JkbSwgKm5lb25fcHdyZG07CiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluICpjb3JlX3B3cmRtLCAqcGVyX3B3cmRtOwpAQCAtMzEyLDI4ICszMDYsMjUgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qIEZ1bmN0aW9uIHRvIHJlc3RvcmUgdGhlIHRhYmxlIGVudHJ5IHRoYXQgd2FzIG1vZGlmaWVkIGZvciBlbmFibGluZyBNTVUgKi8KLXN0YXRpYyB2b2lkIHJlc3RvcmVfdGFibGVfZW50cnkodm9pZCkKK3N0YXRpYyB2b2lkIG9tYXAzNHh4X3NhdmVfY29udGV4dCh1MzIgKnNhdmUpCiB7Ci0Jdm9pZCBfX2lvbWVtICpzY3JhdGNocGFkX2FkZHJlc3M7Ci0JdTMyIHByZXZpb3VzX3ZhbHVlLCBjb250cm9sX3JlZ192YWx1ZTsKLQl1MzIgKmFkZHJlc3M7CisJdTMyIHZhbDsKIAotCXNjcmF0Y2hwYWRfYWRkcmVzcyA9IE9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDM0M1hfU0NSQVRDSFBBRCk7CisJLyogUmVhZCBBdXhpbGlhcnkgQ29udHJvbCBSZWdpc3RlciAqLworCWFzbSgibXJjIHAxNSwgMCwgJTAsIGMxLCBjMCwgMSIgOiAiPXIiICh2YWwpKTsKKwkqc2F2ZSsrID0gMTsKKwkqc2F2ZSsrID0gdmFsOwogCi0JLyogR2V0IGFkZHJlc3Mgb2YgZW50cnkgdGhhdCB3YXMgbW9kaWZpZWQgKi8KLQlhZGRyZXNzID0gKHUzMiAqKV9fcmF3X3JlYWRsKHNjcmF0Y2hwYWRfYWRkcmVzcyArCi0JCQkJICAgICBPTUFQMzQzWF9UQUJMRV9BRERSRVNTX09GRlNFVCk7Ci0JLyogR2V0IHRoZSBwcmV2aW91cyB2YWx1ZSB3aGljaCBuZWVkcyB0byBiZSByZXN0b3JlZCAqLwotCXByZXZpb3VzX3ZhbHVlID0gX19yYXdfcmVhZGwoc2NyYXRjaHBhZF9hZGRyZXNzICsKLQkJCQkgICAgIE9NQVAzNDNYX1RBQkxFX1ZBTFVFX09GRlNFVCk7Ci0JYWRkcmVzcyA9IF9fdmEoYWRkcmVzcyk7Ci0JKmFkZHJlc3MgPSBwcmV2aW91c192YWx1ZTsKLQlmbHVzaF90bGJfYWxsKCk7Ci0JY29udHJvbF9yZWdfdmFsdWUgPSBfX3Jhd19yZWFkbChzY3JhdGNocGFkX2FkZHJlc3MKLQkJCQkJKyBPTUFQMzQzWF9DT05UUk9MX1JFR19WQUxVRV9PRkZTRVQpOwotCS8qIFRoaXMgd2lsbCBlbmFibGUgY2FjaGVzIGFuZCBwcmVkaWN0aW9uICovCi0Jc2V0X2NyKGNvbnRyb2xfcmVnX3ZhbHVlKTsKKwkvKiBSZWFkIEwyIEFVWCBjdHJsIHJlZ2lzdGVyICovCisJYXNtKCJtcmMgcDE1LCAxLCAlMCwgYzksIGMwLCAyIiA6ICI9ciIgKHZhbCkpOworCSpzYXZlKysgPSAxOworCSpzYXZlKysgPSB2YWw7Cit9CisKK3N0YXRpYyBpbnQgb21hcDM0eHhfZG9fc3JhbV9pZGxlKHVuc2lnbmVkIGxvbmcgc2F2ZV9zdGF0ZSkKK3sKKwlvbWFwMzR4eF9jcHVfc3VzcGVuZChzYXZlX3N0YXRlKTsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBvbWFwX3NyYW1faWRsZSh2b2lkKQpAQCAtMzUyLDkgKzM0Myw2IEBACiAJaW50IGNvcmVfcHJldl9zdGF0ZSwgcGVyX3ByZXZfc3RhdGU7CiAJdTMyIHNkcmNfcHdyID0gMDsKIAotCWlmICghX29tYXBfc3JhbV9pZGxlKQotCQlyZXR1cm47Ci0KIAlwd3JkbV9jbGVhcl9hbGxfcHJldl9wd3JzdChtcHVfcHdyZG0pOwogCXB3cmRtX2NsZWFyX2FsbF9wcmV2X3B3cnN0KG5lb25fcHdyZG0pOwogCXB3cmRtX2NsZWFyX2FsbF9wcmV2X3B3cnN0KGNvcmVfcHdyZG0pOwpAQCAtNDMyLDEyICs0MjAsMTYgQEAKIAkJc2RyY19wd3IgPSBzZHJjX3JlYWRfcmVnKFNEUkNfUE9XRVIpOwogCiAJLyoKLQkgKiBvbWFwM19hcm1fY29udGV4dCBpcyB0aGUgbG9jYXRpb24gd2hlcmUgQVJNIHJlZ2lzdGVycwotCSAqIGdldCBzYXZlZC4gVGhlIHJlc3RvcmUgcGF0aCB0aGVuIHJlYWRzIGZyb20gdGhpcwotCSAqIGxvY2F0aW9uIGFuZCByZXN0b3JlcyB0aGVtIGJhY2suCisJICogb21hcDNfYXJtX2NvbnRleHQgaXMgdGhlIGxvY2F0aW9uIHdoZXJlIHNvbWUgQVJNIGNvbnRleHQKKwkgKiBnZXQgc2F2ZWQuIFRoZSByZXN0IGlzIHBsYWNlZCBvbiB0aGUgc3RhY2ssIGFuZCByZXN0b3JlZAorCSAqIGZyb20gdGhlcmUgYmVmb3JlIHJlc3VtaW5nLgogCSAqLwotCV9vbWFwX3NyYW1faWRsZShvbWFwM19hcm1fY29udGV4dCwgc2F2ZV9zdGF0ZSk7Ci0JY3B1X2luaXQoKTsKKwlpZiAoc2F2ZV9zdGF0ZSkKKwkJb21hcDM0eHhfc2F2ZV9jb250ZXh0KG9tYXAzX2FybV9jb250ZXh0KTsKKwlpZiAoc2F2ZV9zdGF0ZSA9PSAxIHx8IHNhdmVfc3RhdGUgPT0gMykKKwkJY3B1X3N1c3BlbmQoc2F2ZV9zdGF0ZSwgb21hcDM0eHhfZG9fc3JhbV9pZGxlKTsKKwllbHNlCisJCW9tYXAzNHh4X2RvX3NyYW1faWRsZShzYXZlX3N0YXRlKTsKIAogCS8qIFJlc3RvcmUgbm9ybWFsIFNEUkMgUE9XRVIgc2V0dGluZ3MgKi8KIAlpZiAob21hcF9yZXYoKSA+PSBPTUFQMzQzMF9SRVZfRVMzXzAgJiYKQEAgLTQ0NSwxMCArNDM3LDYgQEAKIAkgICAgY29yZV9uZXh0X3N0YXRlID09IFBXUkRNX1BPV0VSX09GRikKIAkJc2RyY193cml0ZV9yZWcoc2RyY19wd3IsIFNEUkNfUE9XRVIpOwogCi0JLyogUmVzdG9yZSB0YWJsZSBlbnRyeSBtb2RpZmllZCBkdXJpbmcgTU1VIHJlc3RvcmF0aW9uICovCi0JaWYgKHB3cmRtX3JlYWRfcHJldl9wd3JzdChtcHVfcHdyZG0pID09IFBXUkRNX1BPV0VSX09GRikKLQkJcmVzdG9yZV90YWJsZV9lbnRyeSgpOwotCiAJLyogQ09SRSAqLwogCWlmIChjb3JlX25leHRfc3RhdGUgPCBQV1JETV9QT1dFUl9PTikgewogCQljb3JlX3ByZXZfc3RhdGUgPSBwd3JkbV9yZWFkX3ByZXZfcHdyc3QoY29yZV9wd3JkbSk7CkBAIC00OTcsOCArNDg1LDYgQEAKIAogaW50IG9tYXAzX2Nhbl9zbGVlcCh2b2lkKQogewotCWlmICghc2xlZXBfd2hpbGVfaWRsZSkKLQkJcmV0dXJuIDA7CiAJaWYgKCFvbWFwX3VhcnRfY2FuX3NsZWVwKCkpCiAJCXJldHVybiAwOwogCXJldHVybiAxOwpAQCAtNTM0LDEwICs1MjAsNiBAQAogCXN0cnVjdCBwb3dlcl9zdGF0ZSAqcHdyc3Q7CiAJaW50IHN0YXRlLCByZXQgPSAwOwogCi0JaWYgKHdha2V1cF90aW1lcl9zZWNvbmRzIHx8IHdha2V1cF90aW1lcl9taWxsaXNlY29uZHMpCi0JCW9tYXAyX3BtX3dha2V1cF9vbl90aW1lcih3YWtldXBfdGltZXJfc2Vjb25kcywKLQkJCQkJIHdha2V1cF90aW1lcl9taWxsaXNlY29uZHMpOwotCiAJLyogUmVhZCBjdXJyZW50IG5leHRfcHdyc3RzICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwd3JzdCwgJnB3cnN0X2xpc3QsIG5vZGUpCiAJCXB3cnN0LT5zYXZlZF9zdGF0ZSA9IHB3cmRtX3JlYWRfbmV4dF9wd3JzdChwd3JzdC0+cHdyZG0pOwpAQCAtODUyLDEwICs4MzQsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFB1c2ggZnVuY3Rpb25zIHRvIFNSQU0KKyAqCisgKiBUaGUgbWluaW11bSBzZXQgb2YgZnVuY3Rpb25zIGlzIHB1c2hlZCB0byBTUkFNIGZvciBleGVjdXRpb246CisgKiAtIG9tYXAzX2RvX3dmaSBmb3IgZXJyYXR1bSBpNTgxIFdBLAorICogLSBzYXZlX3NlY3VyZV9yYW1fY29udGV4dCBmb3Igc2VjdXJpdHkgZXh0ZW5zaW9ucy4KKyAqLwogdm9pZCBvbWFwX3B1c2hfc3JhbV9pZGxlKHZvaWQpCiB7Ci0JX29tYXBfc3JhbV9pZGxlID0gb21hcF9zcmFtX3B1c2gob21hcDM0eHhfY3B1X3N1c3BlbmQsCi0JCQkJCW9tYXAzNHh4X2NwdV9zdXNwZW5kX3N6KTsKKwlvbWFwM19kb193Zmlfc3JhbSA9IG9tYXBfc3JhbV9wdXNoKG9tYXAzX2RvX3dmaSwgb21hcDNfZG9fd2ZpX3N6KTsKKwogCWlmIChvbWFwX3R5cGUoKSAhPSBPTUFQMl9ERVZJQ0VfVFlQRV9HUCkKIAkJX29tYXBfc2F2ZV9zZWN1cmVfc3JhbSA9IG9tYXBfc3JhbV9wdXNoKHNhdmVfc2VjdXJlX3JhbV9jb250ZXh0LAogCQkJCXNhdmVfc2VjdXJlX3JhbV9jb250ZXh0X3N6KTsKQEAgLTkyMCw3ICs5MDksNiBAQAogCXBlcl9jbGtkbSA9IGNsa2RtX2xvb2t1cCgicGVyX2Nsa2RtIik7CiAJY29yZV9jbGtkbSA9IGNsa2RtX2xvb2t1cCgiY29yZV9jbGtkbSIpOwogCi0Jb21hcF9wdXNoX3NyYW1faWRsZSgpOwogI2lmZGVmIENPTkZJR19TVVNQRU5ECiAJc3VzcGVuZF9zZXRfb3BzKCZvbWFwX3BtX29wcyk7CiAjZW5kaWYgLyogQ09ORklHX1NVU1BFTkQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zNDR4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczQ0eHhfZGF0YS5jCmluZGV4IGM0MjIyYzcuLjNhN2U2NzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zNDR4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnM0NHh4X2RhdGEuYwpAQCAtNTMsNyArNTMsNyBAQAogCQlbM10gPSBQV1JTVFNfT04sCS8qIGR1Y2F0aV9sMnJhbSAqLwogCQlbNF0gPSBQV1JTVFNfT04sCS8qIGR1Y2F0aV91bmljYWNoZSAqLwogCX0sCi0JLmZsYWdzCQk9IFBXUkRNX0hBU19MT1dQT1dFUlNUQVRFQ0hBTkdFLAorCS5mbGFncwkJICA9IFBXUkRNX0hBU19MT1dQT1dFUlNUQVRFQ0hBTkdFLAogfTsKIAogLyogZ2Z4XzQ0eHhfcHdyZG06IDNEIGFjY2VsZXJhdG9yIHBvd2VyIGRvbWFpbiAqLwpAQCAtNzAsNyArNzAsNyBAQAogCS5wd3JzdHNfbWVtX29uCT0gewogCQlbMF0gPSBQV1JTVFNfT04sCS8qIGdmeF9tZW0gKi8KIAl9LAotCS5mbGFncwkJPSBQV1JETV9IQVNfTE9XUE9XRVJTVEFURUNIQU5HRSwKKwkuZmxhZ3MJCSAgPSBQV1JETV9IQVNfTE9XUE9XRVJTVEFURUNIQU5HRSwKIH07CiAKIC8qIGFiZV80NHh4X3B3cmRtOiBBdWRpbyBiYWNrIGVuZCBwb3dlciBkb21haW4gKi8KQEAgLTkwLDcgKzkwLDcgQEAKIAkJWzBdID0gUFdSU1RTX09OLAkvKiBhZXNzbWVtICovCiAJCVsxXSA9IFBXUlNUU19PTiwJLyogcGVyaXBobWVtICovCiAJfSwKLQkuZmxhZ3MJCT0gUFdSRE1fSEFTX0xPV1BPV0VSU1RBVEVDSEFOR0UsCisJLmZsYWdzCQkgID0gUFdSRE1fSEFTX0xPV1BPV0VSU1RBVEVDSEFOR0UsCiB9OwogCiAvKiBkc3NfNDR4eF9wd3JkbTogRGlzcGxheSBzdWJzeXN0ZW0gcG93ZXIgZG9tYWluICovCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkucHdyc3RzX21lbV9vbgk9IHsKIAkJWzBdID0gUFdSU1RTX09OLAkvKiBkc3NfbWVtICovCiAJfSwKLQkuZmxhZ3MJCT0gUFdSRE1fSEFTX0xPV1BPV0VSU1RBVEVDSEFOR0UsCisJLmZsYWdzCQkgID0gUFdSRE1fSEFTX0xPV1BPV0VSU1RBVEVDSEFOR0UsCiB9OwogCiAvKiB0ZXNsYV80NHh4X3B3cmRtOiBUZXNsYSBwcm9jZXNzb3IgcG93ZXIgZG9tYWluICovCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJWzFdID0gUFdSU1RTX09OLAkvKiB0ZXNsYV9sMSAqLwogCQlbMl0gPSBQV1JTVFNfT04sCS8qIHRlc2xhX2wyICovCiAJfSwKLQkuZmxhZ3MJCT0gUFdSRE1fSEFTX0xPV1BPV0VSU1RBVEVDSEFOR0UsCisJLmZsYWdzCQkgID0gUFdSRE1fSEFTX0xPV1BPV0VSU1RBVEVDSEFOR0UsCiB9OwogCiAvKiB3a3VwXzQ0eHhfcHdyZG06IFdha2UtdXAgcG93ZXIgZG9tYWluICovCkBAIC0yNDEsNyArMjQxLDcgQEAKIAkJWzJdID0gUFdSU1RTX09OLAkvKiB0Y20xX21lbSAqLwogCQlbM10gPSBQV1JTVFNfT04sCS8qIHRjbTJfbWVtICovCiAJfSwKLQkuZmxhZ3MJCT0gUFdSRE1fSEFTX0xPV1BPV0VSU1RBVEVDSEFOR0UsCisJLmZsYWdzCQkgID0gUFdSRE1fSEFTX0xPV1BPV0VSU1RBVEVDSEFOR0UsCiB9OwogCiAvKiBjYW1fNDR4eF9wd3JkbTogQ2FtZXJhIHN1YnN5c3RlbSBwb3dlciBkb21haW4gKi8KQEAgLTI1OCw3ICsyNTgsNyBAQAogCS5wd3JzdHNfbWVtX29uCT0gewogCQlbMF0gPSBQV1JTVFNfT04sCS8qIGNhbV9tZW0gKi8KIAl9LAotCS5mbGFncwkJPSBQV1JETV9IQVNfTE9XUE9XRVJTVEFURUNIQU5HRSwKKwkuZmxhZ3MJCSAgPSBQV1JETV9IQVNfTE9XUE9XRVJTVEFURUNIQU5HRSwKIH07CiAKIC8qIGwzaW5pdF80NHh4X3B3cmRtOiBMMyBpbml0YXRvcnMgcGhlcmlwaGVyYWxzIHBvd2VyIGRvbWFpbiAgKi8KQEAgLTI3Niw3ICsyNzYsNyBAQAogCS5wd3JzdHNfbWVtX29uCT0gewogCQlbMF0gPSBQV1JTVFNfT04sCS8qIGwzaW5pdF9iYW5rMSAqLwogCX0sCi0JLmZsYWdzCQk9IFBXUkRNX0hBU19MT1dQT1dFUlNUQVRFQ0hBTkdFLAorCS5mbGFncwkJICA9IFBXUkRNX0hBU19MT1dQT1dFUlNUQVRFQ0hBTkdFLAogfTsKIAogLyogbDRwZXJfNDR4eF9wd3JkbTogVGFyZ2V0IHBlcmlwaGVyYWxzIHBvd2VyIGRvbWFpbiAqLwpAQCAtMjk2LDcgKzI5Niw3IEBACiAJCVswXSA9IFBXUlNUU19PTiwJLyogbm9ucmV0YWluZWRfYmFuayAqLwogCQlbMV0gPSBQV1JTVFNfT04sCS8qIHJldGFpbmVkX2JhbmsgKi8KIAl9LAotCS5mbGFncwkJPSBQV1JETV9IQVNfTE9XUE9XRVJTVEFURUNIQU5HRSwKKwkuZmxhZ3MJCSAgPSBQV1JETV9IQVNfTE9XUE9XRVJTVEFURUNIQU5HRSwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ByY21fbXB1NDR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcmNtX21wdTQ0eHguaAppbmRleCBkMjJkMWI0Li44YTZlMjUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ByY21fbXB1NDR4eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJjbV9tcHU0NHh4LmgKQEAgLTMxLDcgKzMxLDYgQEAKIAlPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NDMwX1BSQ01fTVBVX0JBU0UgKyAoaW5zdCkgKyAocmVnKSkKIAogLyogUFJDTV9NUFUgaW5zdGFuY2VzICovCi0KICNkZWZpbmUgT01BUDQ0MzBfUFJDTV9NUFVfT0NQX1NPQ0tFVF9QUkNNX0lOU1QJMHgwMDAwCiAjZGVmaW5lIE9NQVA0NDMwX1BSQ01fTVBVX0RFVklDRV9QUk1fSU5TVAkweDAyMDAKICNkZWZpbmUgT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMF9JTlNUCQkweDA0MDAKQEAgLTUyLDQ2ICs1MSw0NiBAQAogICovCiAKIC8qIFBSQ01fTVBVLk9DUF9TT0NLRVRfUFJDTSByZWdpc3RlciBvZmZzZXRzICovCi0jZGVmaW5lIE9NQVA0X1JFVklTSU9OX1BSQ01fT0ZGU0VUCQkJMHgwMDAwCi0jZGVmaW5lIE9NQVA0NDMwX1JFVklTSU9OX1BSQ00JCQkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9PQ1BfU09DS0VUX1BSQ01fSU5TVCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNF9SRVZJU0lPTl9QUkNNX09GRlNFVAkJMHgwMDAwCisjZGVmaW5lIE9NQVA0NDMwX1JFVklTSU9OX1BSQ00JCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX09DUF9TT0NLRVRfUFJDTV9JTlNULCAweDAwMDApCiAKIC8qIFBSQ01fTVBVLkRFVklDRV9QUk0gcmVnaXN0ZXIgb2Zmc2V0cyAqLwotI2RlZmluZSBPTUFQNF9QUkNNX01QVV9QUk1fUlNUU1RfT0ZGU0VUCQkJMHgwMDAwCi0jZGVmaW5lIE9NQVA0NDMwX1BSQ01fTVBVX1BSTV9SU1RTVAkJCU9NQVA0NFhYX1BSQ01fTVBVX1JFR0FERFIoT01BUDQ0MzBfUFJDTV9NUFVfREVWSUNFX1BSTV9JTlNULCAweDAwMDApCi0jZGVmaW5lIE9NQVA0X1BSQ01fTVBVX1BSTV9QU0NPTl9DT1VOVF9PRkZTRVQJCTB4MDAwNAotI2RlZmluZSBPTUFQNDQzMF9QUkNNX01QVV9QUk1fUFNDT05fQ09VTlQJCU9NQVA0NFhYX1BSQ01fTVBVX1JFR0FERFIoT01BUDQ0MzBfUFJDTV9NUFVfREVWSUNFX1BSTV9JTlNULCAweDAwMDQpCisjZGVmaW5lIE9NQVA0X1BSQ01fTVBVX1BSTV9SU1RTVF9PRkZTRVQJCTB4MDAwMAorI2RlZmluZSBPTUFQNDQzMF9QUkNNX01QVV9QUk1fUlNUU1QJCU9NQVA0NFhYX1BSQ01fTVBVX1JFR0FERFIoT01BUDQ0MzBfUFJDTV9NUFVfREVWSUNFX1BSTV9JTlNULCAweDAwMDApCisjZGVmaW5lIE9NQVA0X1BSQ01fTVBVX1BSTV9QU0NPTl9DT1VOVF9PRkZTRVQJMHgwMDA0CisjZGVmaW5lIE9NQVA0NDMwX1BSQ01fTVBVX1BSTV9QU0NPTl9DT1VOVAlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0RFVklDRV9QUk1fSU5TVCwgMHgwMDA0KQogCiAvKiBQUkNNX01QVS5DUFUwIHJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgT01BUDRfUE1fQ1BVMF9QV1JTVENUUkxfT0ZGU0VUCQkJMHgwMDAwCi0jZGVmaW5lIE9NQVA0NDMwX1BNX0NQVTBfUFdSU1RDVFJMCQkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9DUFUwX0lOU1QsIDB4MDAwMCkKLSNkZWZpbmUgT01BUDRfUE1fQ1BVMF9QV1JTVFNUX09GRlNFVAkJCTB4MDAwNAotI2RlZmluZSBPTUFQNDQzMF9QTV9DUFUwX1BXUlNUU1QJCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0NQVTBfSU5TVCwgMHgwMDA0KQotI2RlZmluZSBPTUFQNF9STV9DUFUwX0NQVTBfQ09OVEVYVF9PRkZTRVQJCTB4MDAwOAotI2RlZmluZSBPTUFQNDQzMF9STV9DUFUwX0NQVTBfQ09OVEVYVAkJCU9NQVA0NFhYX1BSQ01fTVBVX1JFR0FERFIoT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMF9JTlNULCAweDAwMDgpCi0jZGVmaW5lIE9NQVA0X1JNX0NQVTBfQ1BVMF9SU1RDVFJMX09GRlNFVAkJMHgwMDBjCi0jZGVmaW5lIE9NQVA0NDMwX1JNX0NQVTBfQ1BVMF9SU1RDVFJMCQkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9DUFUwX0lOU1QsIDB4MDAwYykKLSNkZWZpbmUgT01BUDRfUk1fQ1BVMF9DUFUwX1JTVFNUX09GRlNFVAkJCTB4MDAxMAotI2RlZmluZSBPTUFQNDQzMF9STV9DUFUwX0NQVTBfUlNUU1QJCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0NQVTBfSU5TVCwgMHgwMDEwKQotI2RlZmluZSBPTUFQNF9DTV9DUFUwX0NQVTBfQ0xLQ1RSTF9PRkZTRVQJCTB4MDAxNAotI2RlZmluZSBPTUFQNDQzMF9DTV9DUFUwX0NQVTBfQ0xLQ1RSTAkJCU9NQVA0NFhYX1BSQ01fTVBVX1JFR0FERFIoT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMF9JTlNULCAweDAwMTQpCi0jZGVmaW5lIE9NQVA0X0NNX0NQVTBfQ0xLU1RDVFJMX09GRlNFVAkJCTB4MDAxOAotI2RlZmluZSBPTUFQNDQzMF9DTV9DUFUwX0NMS1NUQ1RSTAkJCU9NQVA0NFhYX1BSQ01fTVBVX1JFR0FERFIoT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMF9JTlNULCAweDAwMTgpCisjZGVmaW5lIE9NQVA0X1BNX0NQVTBfUFdSU1RDVFJMX09GRlNFVAkJMHgwMDAwCisjZGVmaW5lIE9NQVA0NDMwX1BNX0NQVTBfUFdSU1RDVFJMCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0NQVTBfSU5TVCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNF9QTV9DUFUwX1BXUlNUU1RfT0ZGU0VUCQkweDAwMDQKKyNkZWZpbmUgT01BUDQ0MzBfUE1fQ1BVMF9QV1JTVFNUCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0NQVTBfSU5TVCwgMHgwMDA0KQorI2RlZmluZSBPTUFQNF9STV9DUFUwX0NQVTBfQ09OVEVYVF9PRkZTRVQJMHgwMDA4CisjZGVmaW5lIE9NQVA0NDMwX1JNX0NQVTBfQ1BVMF9DT05URVhUCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0NQVTBfSU5TVCwgMHgwMDA4KQorI2RlZmluZSBPTUFQNF9STV9DUFUwX0NQVTBfUlNUQ1RSTF9PRkZTRVQJMHgwMDBjCisjZGVmaW5lIE9NQVA0NDMwX1JNX0NQVTBfQ1BVMF9SU1RDVFJMCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0NQVTBfSU5TVCwgMHgwMDBjKQorI2RlZmluZSBPTUFQNF9STV9DUFUwX0NQVTBfUlNUU1RfT0ZGU0VUCQkweDAwMTAKKyNkZWZpbmUgT01BUDQ0MzBfUk1fQ1BVMF9DUFUwX1JTVFNUCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0NQVTBfSU5TVCwgMHgwMDEwKQorI2RlZmluZSBPTUFQNF9DTV9DUFUwX0NQVTBfQ0xLQ1RSTF9PRkZTRVQJMHgwMDE0CisjZGVmaW5lIE9NQVA0NDMwX0NNX0NQVTBfQ1BVMF9DTEtDVFJMCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0NQVTBfSU5TVCwgMHgwMDE0KQorI2RlZmluZSBPTUFQNF9DTV9DUFUwX0NMS1NUQ1RSTF9PRkZTRVQJCTB4MDAxOAorI2RlZmluZSBPTUFQNDQzMF9DTV9DUFUwX0NMS1NUQ1RSTAkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9DUFUwX0lOU1QsIDB4MDAxOCkKIAogLyogUFJDTV9NUFUuQ1BVMSByZWdpc3RlciBvZmZzZXRzICovCi0jZGVmaW5lIE9NQVA0X1BNX0NQVTFfUFdSU1RDVFJMX09GRlNFVAkJCTB4MDAwMAotI2RlZmluZSBPTUFQNDQzMF9QTV9DUFUxX1BXUlNUQ1RSTAkJCU9NQVA0NFhYX1BSQ01fTVBVX1JFR0FERFIoT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMV9JTlNULCAweDAwMDApCi0jZGVmaW5lIE9NQVA0X1BNX0NQVTFfUFdSU1RTVF9PRkZTRVQJCQkweDAwMDQKLSNkZWZpbmUgT01BUDQ0MzBfUE1fQ1BVMV9QV1JTVFNUCQkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9DUFUxX0lOU1QsIDB4MDAwNCkKLSNkZWZpbmUgT01BUDRfUk1fQ1BVMV9DUFUxX0NPTlRFWFRfT0ZGU0VUCQkweDAwMDgKLSNkZWZpbmUgT01BUDQ0MzBfUk1fQ1BVMV9DUFUxX0NPTlRFWFQJCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0NQVTFfSU5TVCwgMHgwMDA4KQotI2RlZmluZSBPTUFQNF9STV9DUFUxX0NQVTFfUlNUQ1RSTF9PRkZTRVQJCTB4MDAwYwotI2RlZmluZSBPTUFQNDQzMF9STV9DUFUxX0NQVTFfUlNUQ1RSTAkJCU9NQVA0NFhYX1BSQ01fTVBVX1JFR0FERFIoT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMV9JTlNULCAweDAwMGMpCi0jZGVmaW5lIE9NQVA0X1JNX0NQVTFfQ1BVMV9SU1RTVF9PRkZTRVQJCQkweDAwMTAKLSNkZWZpbmUgT01BUDQ0MzBfUk1fQ1BVMV9DUFUxX1JTVFNUCQkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9DUFUxX0lOU1QsIDB4MDAxMCkKLSNkZWZpbmUgT01BUDRfQ01fQ1BVMV9DUFUxX0NMS0NUUkxfT0ZGU0VUCQkweDAwMTQKLSNkZWZpbmUgT01BUDQ0MzBfQ01fQ1BVMV9DUFUxX0NMS0NUUkwJCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0NQVTFfSU5TVCwgMHgwMDE0KQotI2RlZmluZSBPTUFQNF9DTV9DUFUxX0NMS1NUQ1RSTF9PRkZTRVQJCQkweDAwMTgKLSNkZWZpbmUgT01BUDQ0MzBfQ01fQ1BVMV9DTEtTVENUUkwJCQlPTUFQNDRYWF9QUkNNX01QVV9SRUdBRERSKE9NQVA0NDMwX1BSQ01fTVBVX0NQVTFfSU5TVCwgMHgwMDE4KQorI2RlZmluZSBPTUFQNF9QTV9DUFUxX1BXUlNUQ1RSTF9PRkZTRVQJCTB4MDAwMAorI2RlZmluZSBPTUFQNDQzMF9QTV9DUFUxX1BXUlNUQ1RSTAkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9DUFUxX0lOU1QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDRfUE1fQ1BVMV9QV1JTVFNUX09GRlNFVAkJMHgwMDA0CisjZGVmaW5lIE9NQVA0NDMwX1BNX0NQVTFfUFdSU1RTVAkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9DUFUxX0lOU1QsIDB4MDAwNCkKKyNkZWZpbmUgT01BUDRfUk1fQ1BVMV9DUFUxX0NPTlRFWFRfT0ZGU0VUCTB4MDAwOAorI2RlZmluZSBPTUFQNDQzMF9STV9DUFUxX0NQVTFfQ09OVEVYVAkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9DUFUxX0lOU1QsIDB4MDAwOCkKKyNkZWZpbmUgT01BUDRfUk1fQ1BVMV9DUFUxX1JTVENUUkxfT0ZGU0VUCTB4MDAwYworI2RlZmluZSBPTUFQNDQzMF9STV9DUFUxX0NQVTFfUlNUQ1RSTAkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9DUFUxX0lOU1QsIDB4MDAwYykKKyNkZWZpbmUgT01BUDRfUk1fQ1BVMV9DUFUxX1JTVFNUX09GRlNFVAkJMHgwMDEwCisjZGVmaW5lIE9NQVA0NDMwX1JNX0NQVTFfQ1BVMV9SU1RTVAkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9DUFUxX0lOU1QsIDB4MDAxMCkKKyNkZWZpbmUgT01BUDRfQ01fQ1BVMV9DUFUxX0NMS0NUUkxfT0ZGU0VUCTB4MDAxNAorI2RlZmluZSBPTUFQNDQzMF9DTV9DUFUxX0NQVTFfQ0xLQ1RSTAkJT01BUDQ0WFhfUFJDTV9NUFVfUkVHQUREUihPTUFQNDQzMF9QUkNNX01QVV9DUFUxX0lOU1QsIDB4MDAxNCkKKyNkZWZpbmUgT01BUDRfQ01fQ1BVMV9DTEtTVENUUkxfT0ZGU0VUCQkweDAwMTgKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ1BVMV9DTEtTVENUUkwJCU9NQVA0NFhYX1BSQ01fTVBVX1JFR0FERFIoT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMV9JTlNULCAweDAwMTgpCiAKIC8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KICMgaWZuZGVmIF9fQVNTRU1CTEVSX18KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtNDR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm00NHh4LmgKaW5kZXggNjdhMGQzZi4uNmU1MzEyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm00NHh4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm00NHh4LmgKQEAgLTMxLDcgKzMxLDcgQEAKICNkZWZpbmUgT01BUDQ0MzBfUFJNX0JBU0UJCTB4NGEzMDYwMDAKIAogI2RlZmluZSBPTUFQNDRYWF9QUk1fUkVHQUREUihpbnN0LCByZWcpCQkJCVwKLQlPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NDMwX1BSTV9CQVNFICsJKGluc3QpICsgKHJlZykpCisJT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQNDQzMF9QUk1fQkFTRSArIChpbnN0KSArIChyZWcpKQogCiAKIC8qIFBSTSBpbnN0YW5jZXMgKi8KQEAgLTQ2LDMwICs0NiwxOCBAQAogI2RlZmluZSBPTUFQNDQzMF9QUk1fQ0FNX0lOU1QJCTB4MTAwMAogI2RlZmluZSBPTUFQNDQzMF9QUk1fRFNTX0lOU1QJCTB4MTEwMAogI2RlZmluZSBPTUFQNDQzMF9QUk1fR0ZYX0lOU1QJCTB4MTIwMAotI2RlZmluZSBPTUFQNDQzMF9QUk1fTDNJTklUX0lOU1QJCTB4MTMwMAorI2RlZmluZSBPTUFQNDQzMF9QUk1fTDNJTklUX0lOU1QJMHgxMzAwCiAjZGVmaW5lIE9NQVA0NDMwX1BSTV9MNFBFUl9JTlNUCQkweDE0MDAKLSNkZWZpbmUgT01BUDQ0MzBfUFJNX0NFRlVTRV9JTlNUCQkweDE2MDAKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0NFRlVTRV9JTlNUCTB4MTYwMAogI2RlZmluZSBPTUFQNDQzMF9QUk1fV0tVUF9JTlNUCQkweDE3MDAKICNkZWZpbmUgT01BUDQ0MzBfUFJNX1dLVVBfQ01fSU5TVAkweDE4MDAKICNkZWZpbmUgT01BUDQ0MzBfUFJNX0VNVV9JTlNUCQkweDE5MDAKLSNkZWZpbmUgT01BUDQ0MzBfUFJNX0VNVV9DTV9JTlNUCQkweDFhMDAKLSNkZWZpbmUgT01BUDQ0MzBfUFJNX0RFVklDRV9JTlNUCQkweDFiMDAKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0VNVV9DTV9JTlNUCTB4MWEwMAorI2RlZmluZSBPTUFQNDQzMF9QUk1fREVWSUNFX0lOU1QJMHgxYjAwCiAjZGVmaW5lIE9NQVA0NDMwX1BSTV9JTlNUUl9JTlNUCQkweDFmMDAKIAogLyogUFJNIGNsb2NrZG9tYWluIHJlZ2lzdGVyIG9mZnNldHMgKGZyb20gaW5zdGFuY2Ugc3RhcnQpICovCi0jZGVmaW5lIE9NQVA0NDMwX1BSTV9NUFVfTVBVX0NET0ZGUwkJMHgwMDAwCi0jZGVmaW5lIE9NQVA0NDMwX1BSTV9URVNMQV9URVNMQV9DRE9GRlMJCTB4MDAwMAotI2RlZmluZSBPTUFQNDQzMF9QUk1fQUJFX0FCRV9DRE9GRlMJCTB4MDAwMAotI2RlZmluZSBPTUFQNDQzMF9QUk1fQ09SRV9DT1JFX0NET0ZGUwkJMHgwMDAwCi0jZGVmaW5lIE9NQVA0NDMwX1BSTV9JVkFIRF9JVkFIRF9DRE9GRlMJCTB4MDAwMAotI2RlZmluZSBPTUFQNDQzMF9QUk1fQ0FNX0NBTV9DRE9GRlMJCTB4MDAwMAotI2RlZmluZSBPTUFQNDQzMF9QUk1fRFNTX0RTU19DRE9GRlMJCTB4MDAwMAotI2RlZmluZSBPTUFQNDQzMF9QUk1fR0ZYX0dGWF9DRE9GRlMJCTB4MDAwMAotI2RlZmluZSBPTUFQNDQzMF9QUk1fTDNJTklUX0wzSU5JVF9DRE9GRlMJMHgwMDAwCi0jZGVmaW5lIE9NQVA0NDMwX1BSTV9MNFBFUl9MNFBFUl9DRE9GRlMJCTB4MDAwMAotI2RlZmluZSBPTUFQNDQzMF9QUk1fQ0VGVVNFX0NFRlVTRV9DRE9GRlMJMHgwMDAwCiAjZGVmaW5lIE9NQVA0NDMwX1BSTV9XS1VQX0NNX1dLVVBfQ0RPRkZTCTB4MDAwMAotI2RlZmluZSBPTUFQNDQzMF9QUk1fRU1VX0VNVV9DRE9GRlMJCTB4MDAwMAogI2RlZmluZSBPTUFQNDQzMF9QUk1fRU1VX0NNX0VNVV9DRE9GRlMJCTB4MDAwMAogCiAvKiBPTUFQNCBzcGVjaWZpYyByZWdpc3RlciBvZmZzZXRzICovCkBAIC0yNDcsOCArMjM1LDggQEAKICNkZWZpbmUgT01BUDQ0MzBfUk1fTUVNSUZfRExMX0hfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DT1JFX0lOU1QsIDB4MDQ2NCkKICNkZWZpbmUgT01BUDRfUk1fRDJEX1NBRDJEX0NPTlRFWFRfT0ZGU0VUCQkweDA1MjQKICNkZWZpbmUgT01BUDQ0MzBfUk1fRDJEX1NBRDJEX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9JTlNULCAweDA1MjQpCi0jZGVmaW5lIE9NQVA0X1JNX0QyRF9JTlNURU1fSUNSX0NPTlRFWFRfT0ZGU0VUCQkweDA1MmMKLSNkZWZpbmUgT01BUDQ0MzBfUk1fRDJEX0lOU1RFTV9JQ1JfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0NPUkVfSU5TVCwgMHgwNTJjKQorI2RlZmluZSBPTUFQNF9STV9EMkRfTU9ERU1fSUNSX0NPTlRFWFRfT0ZGU0VUCQkweDA1MmMKKyNkZWZpbmUgT01BUDQ0MzBfUk1fRDJEX01PREVNX0lDUl9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9JTlNULCAweDA1MmMpCiAjZGVmaW5lIE9NQVA0X1JNX0QyRF9TQUQyRF9GV19DT05URVhUX09GRlNFVAkJMHgwNTM0CiAjZGVmaW5lIE9NQVA0NDMwX1JNX0QyRF9TQUQyRF9GV19DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9JTlNULCAweDA1MzQpCiAjZGVmaW5lIE9NQVA0X1JNX0w0Q0ZHX0w0X0NGR19DT05URVhUX09GRlNFVAkJMHgwNjI0CkBAIC03MTMsOCArNzAxLDggQEAKICNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZDX1ZBTF9CWVBBU1MJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX0lOU1QsIDB4MDBhMCkKICNkZWZpbmUgT01BUDRfUFJNX1ZDX0NGR19DSEFOTkVMX09GRlNFVAkJCTB4MDBhNAogI2RlZmluZSBPTUFQNDQzMF9QUk1fVkNfQ0ZHX0NIQU5ORUwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX0lOU1QsIDB4MDBhNCkKLSNkZWZpbmUgT01BUDRfUFJNX1ZDX0NGR19JMkNfSU5TVEVfT0ZGU0VUCQkweDAwYTgKLSNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZDX0NGR19JMkNfSU5TVEUJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX0lOU1QsIDB4MDBhOCkKKyNkZWZpbmUgT01BUDRfUFJNX1ZDX0NGR19JMkNfTU9ERV9PRkZTRVQJCTB4MDBhOAorI2RlZmluZSBPTUFQNDQzMF9QUk1fVkNfQ0ZHX0kyQ19NT0RFCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9JTlNULCAweDAwYTgpCiAjZGVmaW5lIE9NQVA0X1BSTV9WQ19DRkdfSTJDX0NMS19PRkZTRVQJCQkweDAwYWMKICNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZDX0NGR19JMkNfQ0xLCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9JTlNULCAweDAwYWMpCiAjZGVmaW5lIE9NQVA0X1BSTV9TUkFNX0NPVU5UX09GRlNFVAkJCTB4MDBiMApAQCAtNzUxLDggKzczOSw4IEBACiAjZGVmaW5lIE9NQVA0NDMwX1BSTV9QSEFTRTJBX0NORFAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX0lOU1QsIDB4MDBlYykKICNkZWZpbmUgT01BUDRfUFJNX1BIQVNFMkJfQ05EUF9PRkZTRVQJCQkweDAwZjAKICNkZWZpbmUgT01BUDQ0MzBfUFJNX1BIQVNFMkJfQ05EUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfSU5TVCwgMHgwMGYwKQotI2RlZmluZSBPTUFQNF9QUk1fSU5TVEVNX0lGX0NUUkxfT0ZGU0VUCQkJMHgwMGY0Ci0jZGVmaW5lIE9NQVA0NDMwX1BSTV9JTlNURU1fSUZfQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfSU5TVCwgMHgwMGY0KQorI2RlZmluZSBPTUFQNF9QUk1fTU9ERU1fSUZfQ1RSTF9PRkZTRVQJCQkweDAwZjQKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX01PREVNX0lGX0NUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX0lOU1QsIDB4MDBmNCkKICNkZWZpbmUgT01BUDRfUFJNX1ZDX0VSUlNUX09GRlNFVAkJCTB4MDBmOAogI2RlZmluZSBPTUFQNDQzMF9QUk1fVkNfRVJSU1QJCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9JTlNULCAweDAwZjgpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NlcmlhbC5jCmluZGV4IDFhYzM2MWIuLjQ2NmZjNzIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NlcmlhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMKQEAgLTgwNSw2ICs4MDUsNyBAQAogCVdBUk4oSVNfRVJSKG9kKSwgIkNvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXM6ICVzLlxuIiwKIAkgICAgIG5hbWUsIG9oLT5uYW1lKTsKIAorCW9tYXBfZGV2aWNlX2Rpc2FibGVfaWRsZV9vbl9zdXNwZW5kKG9kKTsKIAlvaC0+bXV4ID0gb21hcF9od21vZF9tdXhfaW5pdChiZGF0YS0+cGFkcywgYmRhdGEtPnBhZHNfY250KTsKIAogCXVhcnQtPmlycSA9IG9oLT5tcHVfaXJxc1swXS5pcnE7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NsZWVwMzR4eC5TIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbGVlcDM0eHguUwppbmRleCA2M2YxMDY2Li5mMmVhMWJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NsZWVwMzR4eC5TCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2xlZXAzNHh4LlMKQEAgLTc0LDQ2ICs3NCw2IEBACiAgKiBBUEkgZnVuY3Rpb25zCiAgKi8KIAotLyoKLSAqIFRoZSAiZ2V0XypyZXN0b3JlX3BvaW50ZXIiIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBwcm92aWRlIGEKLSAqIHBoeXNpY2FsIHJlc3RvcmUgYWRkcmVzcyB3aGVyZSB0aGUgUk9NIGNvZGUganVtcHMgd2hpbGUgd2FraW5nCi0gKiB1cCBmcm9tIE1QVSBPRkYvT1NXUiBzdGF0ZS4KLSAqIFRoZSByZXN0b3JlIHBvaW50ZXIgaXMgc3RvcmVkIGludG8gdGhlIHNjcmF0Y2hwYWQuCi0gKi8KLQotCS50ZXh0Ci0vKiBGdW5jdGlvbiBjYWxsIHRvIGdldCB0aGUgcmVzdG9yZSBwb2ludGVyIGZvciByZXN1bWUgZnJvbSBPRkYgKi8KLUVOVFJZKGdldF9yZXN0b3JlX3BvaW50ZXIpCi0Jc3RtZmQJc3AhLCB7bHJ9CUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKLQlhZHIJcjAsIHJlc3RvcmUKLQlsZG1mZAlzcCEsIHtwY30JQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgotRU5EUFJPQyhnZXRfcmVzdG9yZV9wb2ludGVyKQotCS5hbGlnbgotRU5UUlkoZ2V0X3Jlc3RvcmVfcG9pbnRlcl9zeikKLQkud29yZAkuIC0gZ2V0X3Jlc3RvcmVfcG9pbnRlcgotCi0JLnRleHQKLS8qIEZ1bmN0aW9uIGNhbGwgdG8gZ2V0IHRoZSByZXN0b3JlIHBvaW50ZXIgZm9yIDM2MzAgcmVzdW1lIGZyb20gT0ZGICovCi1FTlRSWShnZXRfb21hcDM2MzBfcmVzdG9yZV9wb2ludGVyKQotCXN0bWZkCXNwISwge2xyfQlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCi0JYWRyCXIwLCByZXN0b3JlXzM2MzAKLQlsZG1mZAlzcCEsIHtwY30JQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgotRU5EUFJPQyhnZXRfb21hcDM2MzBfcmVzdG9yZV9wb2ludGVyKQotCS5hbGlnbgotRU5UUlkoZ2V0X29tYXAzNjMwX3Jlc3RvcmVfcG9pbnRlcl9zeikKLQkud29yZAkuIC0gZ2V0X29tYXAzNjMwX3Jlc3RvcmVfcG9pbnRlcgotCi0JLnRleHQKLS8qIEZ1bmN0aW9uIGNhbGwgdG8gZ2V0IHRoZSByZXN0b3JlIHBvaW50ZXIgZm9yIEVTMyB0byByZXN1bWUgZnJvbSBPRkYgKi8KLUVOVFJZKGdldF9lczNfcmVzdG9yZV9wb2ludGVyKQotCXN0bWZkCXNwISwge2xyfQlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCi0JYWRyCXIwLCByZXN0b3JlX2VzMwotCWxkbWZkCXNwISwge3BjfQlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCi1FTkRQUk9DKGdldF9lczNfcmVzdG9yZV9wb2ludGVyKQotCS5hbGlnbgotRU5UUlkoZ2V0X2VzM19yZXN0b3JlX3BvaW50ZXJfc3opCi0JLndvcmQJLiAtIGdldF9lczNfcmVzdG9yZV9wb2ludGVyCi0KIAkudGV4dAogLyoKICAqIEwyIGNhY2hlIG5lZWRzIHRvIGJlIHRvZ2dsZWQgZm9yIHN0YWJsZSBPRkYgbW9kZSBmdW5jdGlvbmFsaXR5IG9uIDM2MzAuCkBAIC0xMzMsNyArOTMsNyBAQAogLyogRnVuY3Rpb24gdG8gY2FsbCByb20gY29kZSB0byBzYXZlIHNlY3VyZSByYW0gY29udGV4dCAqLwogCS5hbGlnbgkzCiBFTlRSWShzYXZlX3NlY3VyZV9yYW1fY29udGV4dCkKLQlzdG1mZAlzcCEsIHtyMS1yMTIsIGxyfQlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCisJc3RtZmQJc3AhLCB7cjQgLSByMTEsIGxyfQlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCiAJYWRyCXIzLCBhcGlfcGFyYW1zCQlAIHIzIHBvaW50cyB0byBwYXJhbWV0ZXJzCiAJc3RyCXIwLCBbcjMsIzB4NF0JCUAgcjAgaGFzIHNkcmFtIGFkZHJlc3MKIAlsZHIJcjEyLCBoaWdoX21hc2sKQEAgLTE1Miw3ICsxMTIsNyBAQAogCW5vcAogCW5vcAogCW5vcAotCWxkbWZkCXNwISwge3IxLXIxMiwgcGN9CisJbGRtZmQJc3AhLCB7cjQgLSByMTEsIHBjfQogCS5hbGlnbgogc3JhbV9waHlfYWRkcl9tYXNrOgogCS53b3JkCVNSQU1fQkFTRV9QCkBAIC0xNzksNjkgKzEzOSwzOCBAQAogICoKICAqCiAgKiBOb3RlczoKLSAqIC0gdGhpcyBjb2RlIGdldHMgY29waWVkIHRvIGludGVybmFsIFNSQU0gYXQgYm9vdCBhbmQgYWZ0ZXIgd2FrZS11cAotICogICBmcm9tIE9GRiBtb2RlLiBUaGUgZXhlY3V0aW9uIHBvaW50ZXIgaW4gU1JBTSBpcyBfb21hcF9zcmFtX2lkbGUuCisgKiAtIG9ubHkgdGhlIG1pbmltdW0gc2V0IG9mIGZ1bmN0aW9ucyBnZXRzIGNvcGllZCB0byBpbnRlcm5hbCBTUkFNIGF0IGJvb3QKKyAqICAgYW5kIGFmdGVyIHdha2UtdXAgZnJvbSBPRkYgbW9kZSwgY2YuIG9tYXBfcHVzaF9zcmFtX2lkbGUuIFRoZSBmdW5jdGlvbgorICogICBwb2ludGVycyBpbiBTRFJBTSBvciBTUkFNIGFyZSBjYWxsZWQgZGVwZW5kaW5nIG9uIHRoZSBkZXNpcmVkIGxvdyBwb3dlcgorICogICB0YXJnZXQgc3RhdGUuCiAgKiAtIHdoZW4gdGhlIE9NQVAgd2FrZXMgdXAgaXQgY29udGludWVzIGF0IGRpZmZlcmVudCBleGVjdXRpb24gcG9pbnRzCiAgKiAgIGRlcGVuZGluZyBvbiB0aGUgbG93IHBvd2VyIG1vZGUgKG5vbi1PRkYgdnMgT0ZGIG1vZGVzKSwKICAqICAgY2YuICdSZXN1bWUgcGF0aCBmb3IgeHh4IG1vZGUnIGNvbW1lbnRzLgogICovCiAJLmFsaWduCTMKIEVOVFJZKG9tYXAzNHh4X2NwdV9zdXNwZW5kKQotCXN0bWZkCXNwISwge3IwLXIxMiwgbHJ9CUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKKwlzdG1mZAlzcCEsIHtyNCAtIHIxMSwgbHJ9CUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKIAogCS8qCi0JICogcjAgY29udGFpbnMgQ1BVIGNvbnRleHQgc2F2ZS9yZXN0b3JlIHBvaW50ZXIgaW4gc2RyYW0KLQkgKiByMSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBzYXZpbmcgY29udGV4dDoKKwkgKiByMCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBzYXZpbmcgY29udGV4dDoKIAkgKiAgIDAgLSBObyBjb250ZXh0IGxvc3QKIAkgKiAgIDEgLSBPbmx5IEwxIGFuZCBsb2dpYyBsb3N0CiAJICogICAyIC0gT25seSBMMiBsb3N0IChFdmVuIEwxIGlzIHJldGFpbmVkIHdlIGNsZWFuIGl0IGFsb25nIHdpdGggTDIpCiAJICogICAzIC0gQm90aCBMMSBhbmQgTDIgbG9zdCBhbmQgbG9naWMgbG9zdAogCSAqLwogCi0JLyogRGlyZWN0bHkganVtcCB0byBXRkkgaXMgdGhlIGNvbnRleHQgc2F2ZSBpcyBub3QgcmVxdWlyZWQgKi8KLQljbXAJcjEsICMweDAKLQliZXEJb21hcDNfZG9fd2ZpCisJLyoKKwkgKiBGb3IgT0ZGIG1vZGU6IHNhdmUgY29udGV4dCBhbmQganVtcCB0byBXRkkgaW4gU0RSQU0gKG9tYXAzX2RvX3dmaSkKKwkgKiBGb3Igbm9uLU9GRiBtb2RlczoganVtcCB0byB0aGUgV0ZJIGNvZGUgaW4gU1JBTSAob21hcDNfZG9fd2ZpX3NyYW0pCisJICovCisJbGRyCXI0LCBvbWFwM19kb193Zmlfc3JhbV9hZGRyCisJbGRyCXI1LCBbcjRdCisJY21wCXIwLCAjMHgwCQlAIElmIG5vIGNvbnRleHQgc2F2ZSByZXF1aXJlZCwKKwlieGVxCXI1CQkJQCAganVtcCB0byB0aGUgV0ZJIGNvZGUgaW4gU1JBTQorCiAKIAkvKiBPdGhlcndpc2UgZmFsbCB0aHJvdWdoIHRvIHRoZSBzYXZlIGNvbnRleHQgY29kZSAqLwogc2F2ZV9jb250ZXh0X3dmaToKLQltb3YJcjgsIHIwCQkJQCBTdG9yZSBTRFJBTSBhZGRyZXNzIGluIHI4Ci0JbXJjCXAxNSwgMCwgcjUsIGMxLCBjMCwgMQlAIFJlYWQgQXV4aWxpYXJ5IENvbnRyb2wgUmVnaXN0ZXIKLQltb3YJcjQsICMweDEJCUAgTnVtYmVyIG9mIHBhcmFtZXRlcnMgZm9yIHJlc3RvcmUgY2FsbAotCXN0bWlhCXI4ISwge3I0LXI1fQkJQCBQdXNoIHBhcmFtZXRlcnMgZm9yIHJlc3RvcmUgY2FsbAotCW1yYwlwMTUsIDEsIHI1LCBjOSwgYzAsIDIJQCBSZWFkIEwyIEFVWCBjdHJsIHJlZ2lzdGVyCi0Jc3RtaWEJcjghLCB7cjQtcjV9CQlAIFB1c2ggcGFyYW1ldGVycyBmb3IgcmVzdG9yZSBjYWxsCi0KLSAgICAgICAgLyogQ2hlY2sgd2hhdCB0aGF0IHRhcmdldCBzbGVlcCBzdGF0ZSBpcyBmcm9tIHIxICovCi0JY21wCXIxLCAjMHgyCQlAIE9ubHkgTDIgbG9zdCwgbm8gbmVlZCB0byBzYXZlIGNvbnRleHQKLQliZXEJY2xlYW5fY2FjaGVzCi0KLWwxX2xvZ2ljX2xvc3Q6Ci0JbW92CXI0LCBzcAkJCUAgU3RvcmUgc3AKLQltcnMJcjUsIHNwc3IJCUAgU3RvcmUgc3BzcgotCW1vdglyNiwgbHIJCQlAIFN0b3JlIGxyCi0Jc3RtaWEJcjghLCB7cjQtcjZ9Ci0KLQltcmMJcDE1LCAwLCByNCwgYzEsIGMwLCAyCUAgQ29wcm9jZXNzb3IgYWNjZXNzIGNvbnRyb2wgcmVnaXN0ZXIKLQltcmMJcDE1LCAwLCByNSwgYzIsIGMwLCAwCUAgVFRCUjAKLQltcmMJcDE1LCAwLCByNiwgYzIsIGMwLCAxCUAgVFRCUjEKLQltcmMJcDE1LCAwLCByNywgYzIsIGMwLCAyCUAgVFRCQ1IKLQlzdG1pYQlyOCEsIHtyNC1yN30KLQotCW1yYwlwMTUsIDAsIHI0LCBjMywgYzAsIDAJQCBEb21haW4gYWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIKLQltcmMJcDE1LCAwLCByNSwgYzEwLCBjMiwgMAlAIFBSUlIKLQltcmMJcDE1LCAwLCByNiwgYzEwLCBjMiwgMQlAIE5NUlIKLQlzdG1pYQlyOCEse3I0LXI2fQotCi0JbXJjCXAxNSwgMCwgcjQsIGMxMywgYzAsIDEJQCBDb250ZXh0IElECi0JbXJjCXAxNSwgMCwgcjUsIGMxMywgYzAsIDIJQCBVc2VyIHIvdyB0aHJlYWQgYW5kIHByb2Nlc3MgSUQKLQltcmMJcDE1LCAwLCByNiwgYzEyLCBjMCwgMAlAIFNlY3VyZSBvciBOUyB2ZWN0b3IgYmFzZSBhZGRyZXNzCi0JbXJzCXI3LCBjcHNyCQlAIFN0b3JlIGN1cnJlbnQgY3BzcgotCXN0bWlhCXI4ISwge3I0LXI3fQotCi0JbXJjCXAxNSwgMCwgcjQsIGMxLCBjMCwgMAlAIHNhdmUgY29udHJvbCByZWdpc3RlcgotCXN0bWlhCXI4ISwge3I0fQotCi1jbGVhbl9jYWNoZXM6CiAJLyoKIAkgKiBqdW1wIG91dCB0byBrZXJuZWwgZmx1c2ggcm91dGluZQogCSAqICAtIHJldXNlIHRoYXQgY29kZSBpcyBiZXR0ZXIKQEAgLTI4NCw3ICsyMTMsMzIgQEAKICBUSFVNQigJbm9wCQkpCiAJLmFybQogCi1vbWFwM19kb193Zmk6CisJYglvbWFwM19kb193ZmkKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlcworICovCitvbWFwM19kb193Zmlfc3JhbV9hZGRyOgorCS53b3JkIG9tYXAzX2RvX3dmaV9zcmFtCitrZXJuZWxfZmx1c2g6CisJLndvcmQgdjdfZmx1c2hfZGNhY2hlX2FsbAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogPT0gV0ZJIGluc3RydWN0aW9uID0+IEVudGVyIGlkbGUgPT0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAqIERvIFdGSSBpbnN0cnVjdGlvbgorICogSW5jbHVkZXMgdGhlIHJlc3VtZSBwYXRoIGZvciBub24tT0ZGIG1vZGVzCisgKgorICogVGhpcyBjb2RlIGdldHMgY29waWVkIHRvIGludGVybmFsIFNSQU0gYW5kIGlzIGFjY2Vzc2libGUKKyAqIGZyb20gYm90aCBTRFJBTSBhbmQgU1JBTToKKyAqIC0gZXhlY3V0ZWQgZnJvbSBTUkFNIGZvciBub24tb2ZmIG1vZGVzIChvbWFwM19kb193Zmlfc3JhbSksCisgKiAtIGV4ZWN1dGVkIGZyb20gU0RSQU0gZm9yIE9GRiBtb2RlIChvbWFwM19kb193ZmkpLgorICovCisJLmFsaWduCTMKK0VOVFJZKG9tYXAzX2RvX3dmaSkKIAlsZHIJcjQsIHNkcmNfcG93ZXIJCUAgcmVhZCB0aGUgU0RSQ19QT1dFUiByZWdpc3RlcgogCWxkcglyNSwgW3I0XQkJQCByZWFkIHRoZSBjb250ZW50cyBvZiBTRFJDX1BPV0VSCiAJb3JyCXI1LCByNSwgIzB4NDAJCUAgZW5hYmxlIHNlbGYgcmVmcmVzaCBvbiBpZGxlIHJlcQpAQCAtMzE2LDggKzI3MCw4NiBAQAogCW5vcAogCW5vcAogCW5vcAotCWJsIHdhaXRfc2RyY19vawogCisvKgorICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBlcnJhdHVtIElEIGk1ODEgV0E6CisgKiAgU0RSQyBzdGF0ZSByZXN0b3JlIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIFNEUkFNCisgKgorICogT25seSB1c2VkIGF0IHJldHVybiBmcm9tIG5vbi1PRkYgbW9kZS4gRm9yIE9GRgorICogbW9kZSB0aGUgUk9NIGNvZGUgY29uZmlndXJlcyB0aGUgU0RSQyBhbmQKKyAqIHRoZSBEUExMIGJlZm9yZSBjYWxsaW5nIHRoZSByZXN0b3JlIGNvZGUgZGlyZWN0bHkKKyAqIGZyb20gRERSLgorICovCisKKy8qIE1ha2Ugc3VyZSBTRFJDIGFjY2Vzc2VzIGFyZSBvayAqLword2FpdF9zZHJjX29rOgorCisvKiBEUExMMyBtdXN0IGJlIGxvY2tlZCBiZWZvcmUgYWNjZXNzaW5nIHRoZSBTRFJDLiBNYXliZSB0aGUgSFcgZW5zdXJlcyB0aGlzICovCisJbGRyCXI0LCBjbV9pZGxlc3RfY2tnZW4KK3dhaXRfZHBsbDNfbG9jazoKKwlsZHIJcjUsIFtyNF0KKwl0c3QJcjUsICMxCisJYmVxCXdhaXRfZHBsbDNfbG9jaworCisJbGRyCXI0LCBjbV9pZGxlc3QxX2NvcmUKK3dhaXRfc2RyY19yZWFkeToKKwlsZHIJcjUsIFtyNF0KKwl0c3QJcjUsICMweDIKKwlibmUJd2FpdF9zZHJjX3JlYWR5CisJLyogYWxsb3cgRExMIHBvd2VyZG93biB1cG9uIGh3IGlkbGUgcmVxICovCisJbGRyCXI0LCBzZHJjX3Bvd2VyCisJbGRyCXI1LCBbcjRdCisJYmljCXI1LCByNSwgIzB4NDAKKwlzdHIJcjUsIFtyNF0KKworLyoKKyAqIFBDLXJlbGF0aXZlIHN0b3JlcyBsZWFkIHRvIHVuZGVmaW5lZCBiZWhhdmlvdXIgaW4gVGh1bWItMjogdXNlIGEgcjcgYXMgYQorICogYmFzZSBpbnN0ZWFkLgorICogQmUgY2FyZWZ1bCBub3QgdG8gY2xvYmJlciByNyB3aGVuIG1haW50YWluZyB0aGlzIGNvZGUuCisgKi8KKworaXNfZGxsX2luX2xvY2tfbW9kZToKKwkvKiBJcyBkbGwgaW4gbG9jayBtb2RlPyAqLworCWxkcglyNCwgc2RyY19kbGxhX2N0cmwKKwlsZHIJcjUsIFtyNF0KKwl0c3QJcjUsICMweDQKKwlibmUJZXhpdF9ub25vZmZfbW9kZXMJQCBSZXR1cm4gaWYgbG9ja2VkCisJLyogd2FpdCB0aWxsIGRsbCBsb2NrcyAqLworCWFkcglyNywga2lja19jb3VudGVyCit3YWl0X2RsbF9sb2NrX3RpbWVkOgorCWxkcglyNCwgd2FpdF9kbGxfbG9ja19jb3VudGVyCisJYWRkCXI0LCByNCwgIzEKKwlzdHIJcjQsIFtyNywgI3dhaXRfZGxsX2xvY2tfY291bnRlciAtIGtpY2tfY291bnRlcl0KKwlsZHIJcjQsIHNkcmNfZGxsYV9zdGF0dXMKKwkvKiBXYWl0IDIwdVMgZm9yIGxvY2sgKi8KKwltb3YJcjYsICM4Cit3YWl0X2RsbF9sb2NrOgorCXN1YnMJcjYsIHI2LCAjMHgxCisJYmVxCWtpY2tfZGxsCisJbGRyCXI1LCBbcjRdCisJYW5kCXI1LCByNSwgIzB4NAorCWNtcAlyNSwgIzB4NAorCWJuZQl3YWl0X2RsbF9sb2NrCisJYglleGl0X25vbm9mZl9tb2RlcwlAIFJldHVybiB3aGVuIGxvY2tlZAorCisJLyogZGlzYWJsZS9yZWVuYWJsZSBETEwgaWYgbm90IGxvY2tlZCAqLwora2lja19kbGw6CisJbGRyCXI0LCBzZHJjX2RsbGFfY3RybAorCWxkcglyNSwgW3I0XQorCW1vdglyNiwgcjUKKwliaWMJcjYsICMoMTw8MykJCUAgZGlzYWJsZSBkbGwKKwlzdHIJcjYsIFtyNF0KKwlkc2IKKwlvcnIJcjYsIHI2LCAjKDE8PDMpCQlAIGVuYWJsZSBkbGwKKwlzdHIJcjYsIFtyNF0KKwlkc2IKKwlsZHIJcjQsIGtpY2tfY291bnRlcgorCWFkZAlyNCwgcjQsICMxCisJc3RyCXI0LCBbcjddCQlAIGtpY2tfY291bnRlcgorCWIJd2FpdF9kbGxfbG9ja190aW1lZAorCitleGl0X25vbm9mZl9tb2RlczoKKwkvKiBSZS1lbmFibGUgQy1iaXQgaWYgbmVlZGVkICovCiAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAogCXRzdAlyMCwgIygxIDw8IDIpCQlAIENoZWNrIEMgYml0IGVuYWJsZWQ/CiAJb3JyZXEJcjAsIHIwLCAjKDEgPDwgMikJQCBFbmFibGUgdGhlIEMgYml0IGlmIGNsZWFyZWQKQEAgLTMyOSw3ICszNjEsMzIgQEAKICAqID09IEV4aXQgcG9pbnQgZnJvbSBub24tT0ZGIG1vZGVzID09CiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi0JbGRtZmQJc3AhLCB7cjAtcjEyLCBwY30JQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgorCWxkbWZkCXNwISwge3I0IC0gcjExLCBwY30JQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgorCisvKgorICogTG9jYWwgdmFyaWFibGVzCisgKi8KK3NkcmNfcG93ZXI6CisJLndvcmQJU0RSQ19QT1dFUl9WCitjbV9pZGxlc3QxX2NvcmU6CisJLndvcmQJQ01fSURMRVNUMV9DT1JFX1YKK2NtX2lkbGVzdF9ja2dlbjoKKwkud29yZAlDTV9JRExFU1RfQ0tHRU5fVgorc2RyY19kbGxhX3N0YXR1czoKKwkud29yZAlTRFJDX0RMTEFfU1RBVFVTX1YKK3NkcmNfZGxsYV9jdHJsOgorCS53b3JkCVNEUkNfRExMQV9DVFJMX1YKKwkvKgorCSAqIFdoZW4gZXhwb3J0aW5nIHRvIHVzZXJzcGFjZSB3aGlsZSB0aGUgY291bnRlcnMgYXJlIGluIFNSQU0sCisJICogdGhlc2UgMiB3b3JkcyBuZWVkIHRvIGJlIGF0IHRoZSBlbmQgdG8gZmFjaWxpdGF0ZSByZXRyaXZhbCEKKwkgKi8KK2tpY2tfY291bnRlcjoKKwkud29yZAkwCit3YWl0X2RsbF9sb2NrX2NvdW50ZXI6CisJLndvcmQJMAorCitFTlRSWShvbWFwM19kb193Zmlfc3opCisJLndvcmQJLiAtIG9tYXAzX2RvX3dmaQogCiAKIC8qCkBAIC0zNDYsMTMgKzQwMywxNyBAQAogICogIHJlc3RvcmVfZXMzOiBhcHBsaWVzIHRvIDM0eHggPj0gRVMzLjAKICAqICByZXN0b3JlXzM2MzA6IGFwcGxpZXMgdG8gMzZ4eAogICogIHJlc3RvcmU6IGNvbW1vbiBjb2RlIGZvciAzeHh4CisgKgorICogTm90ZTogd2hlbiBiYWNrIGZyb20gQ09SRSBhbmQgTVBVIE9GRiBtb2RlIHdlIGFyZSBydW5uaW5nCisgKiAgZnJvbSBTRFJBTSwgd2l0aG91dCBNTVUsIHdpdGhvdXQgdGhlIGNhY2hlcyBhbmQgcHJlZGljdGlvbi4KKyAqICBBbHNvIHRoZSBTUkFNIGNvbnRlbnQgaGFzIGJlZW4gY2xlYXJlZC4KICAqLwotcmVzdG9yZV9lczM6CitFTlRSWShvbWFwM19yZXN0b3JlX2VzMykKIAlsZHIJcjUsIHBtX3ByZXB3c3RzdF9jb3JlX3AKIAlsZHIJcjQsIFtyNV0KIAlhbmQJcjQsIHI0LCAjMHgzCiAJY21wCXI0LCAjMHgwCUAgQ2hlY2sgaWYgcHJldmlvdXMgcG93ZXIgc3RhdGUgb2YgQ09SRSBpcyBPRkYKLQlibmUJcmVzdG9yZQorCWJuZQlvbWFwM19yZXN0b3JlCUAgRmFsbCB0aHJvdWdoIHRvIE9NQVAzIGNvbW1vbiBjb2RlCiAJYWRyCXIwLCBlczNfc2RyY19maXgKIAlsZHIJcjEsIHNyYW1fYmFzZQogCWxkcglyMiwgZXMzX3NkcmNfZml4X3N6CkBAIC0zNjQsMzUgKzQyNSwzMiBAQAogCWJuZQljb3B5X3RvX3NyYW0KIAlsZHIJcjEsIHNyYW1fYmFzZQogCWJseAlyMQotCWIJcmVzdG9yZQorCWIJb21hcDNfcmVzdG9yZQlAIEZhbGwgdGhyb3VnaCB0byBPTUFQMyBjb21tb24gY29kZQorRU5EUFJPQyhvbWFwM19yZXN0b3JlX2VzMykKIAotcmVzdG9yZV8zNjMwOgorRU5UUlkob21hcDNfcmVzdG9yZV8zNjMwKQogCWxkcglyMSwgcG1fcHJlcHdzdHN0X2NvcmVfcAogCWxkcglyMiwgW3IxXQogCWFuZAlyMiwgcjIsICMweDMKIAljbXAJcjIsICMweDAJQCBDaGVjayBpZiBwcmV2aW91cyBwb3dlciBzdGF0ZSBvZiBDT1JFIGlzIE9GRgotCWJuZQlyZXN0b3JlCisJYm5lCW9tYXAzX3Jlc3RvcmUJQCBGYWxsIHRocm91Z2ggdG8gT01BUDMgY29tbW9uIGNvZGUKIAkvKiBEaXNhYmxlIFJUQSBiZWZvcmUgZ2l2aW5nIGNvbnRyb2wgKi8KIAlsZHIJcjEsIGNvbnRyb2xfbWVtX3J0YQogCW1vdglyMiwgI09NQVAzNlhYX1JUQV9ESVNBQkxFCiAJc3RyCXIyLCBbcjFdCitFTkRQUk9DKG9tYXAzX3Jlc3RvcmVfMzYzMCkKIAogCS8qIEZhbGwgdGhyb3VnaCB0byBjb21tb24gY29kZSBmb3IgdGhlIHJlbWFpbmluZyBsb2dpYyAqLwogCi1yZXN0b3JlOgorRU5UUlkob21hcDNfcmVzdG9yZSkKIAkvKgotCSAqIENoZWNrIHdoYXQgd2FzIHRoZSByZWFzb24gZm9yIG1wdSByZXNldCBhbmQgc3RvcmUgdGhlIHJlYXNvbiBpbiByOToKLQkgKiAgMCAtIE5vIGNvbnRleHQgbG9zdAotCSAqICAxIC0gT25seSBMMSBhbmQgbG9naWMgbG9zdAotCSAqICAyIC0gT25seSBMMiBsb3N0IC0gSW4gdGhpcyBjYXNlLCB3ZSB3b250IGJlIGhlcmUKLQkgKiAgMyAtIEJvdGggTDEgYW5kIEwyIGxvc3QKKwkgKiBSZWFkIHRoZSBwd3N0Y3RybCByZWdpc3RlciB0byBjaGVjayB0aGUgcmVhc29uIGZvciBtcHUgcmVzZXQuCisJICogVGhpcyB0ZWxscyB1cyB3aGF0IHdhcyBsb3N0LgogCSAqLwogCWxkcglyMSwgcG1fcHdzdGN0cmxfbXB1CiAJbGRyCXIyLCBbcjFdCiAJYW5kCXIyLCByMiwgIzB4MwogCWNtcAlyMiwgIzB4MAlAIENoZWNrIGlmIHRhcmdldCBwb3dlciBzdGF0ZSB3YXMgT0ZGIG9yIFJFVAotCW1vdmVxCXI5LCAjMHgzCUAgTVBVIE9GRiA9PiBMMSBhbmQgTDIgbG9zdAotCW1vdm5lCXI5LCAjMHgxCUAgT25seSBMMSBhbmQgTDIgbG9zdCA9PiBhdm9pZCBMMiBpbnZhbGlkYXRpb24KIAlibmUJbG9naWNfbDFfcmVzdG9yZQogCiAJbGRyCXIwLCBsMmRpc18zNjMwCkBAIC00NzEsMTE1ICs1MjksMzkgQEAKIAlvcnIJcjEsIHIxLCAjMgkJQCByZS1lbmFibGUgTDIgY2FjaGUKIAltY3IJcDE1LCAwLCByMSwgYzEsIGMwLCAxCiBza2lwbDJyZWVuOgotCW1vdglyMSwgIzAKLQkvKgotCSAqIEludmFsaWRhdGUgYWxsIGluc3RydWN0aW9uIGNhY2hlcyB0byBQb1UKLQkgKiBhbmQgZmx1c2ggYnJhbmNoIHRhcmdldCBjYWNoZQotCSAqLwotCW1jcglwMTUsIDAsIHIxLCBjNywgYzUsIDAKIAotCWxkcglyNCwgc2NyYXRjaHBhZF9iYXNlCi0JbGRyCXIzLCBbcjQsIzB4QkNdCi0JYWRkcwlyMywgcjMsICMxNgorCS8qIE5vdyBicmFuY2ggdG8gdGhlIGNvbW1vbiBDUFUgcmVzdW1lIGZ1bmN0aW9uICovCisJYgljcHVfcmVzdW1lCitFTkRQUk9DKG9tYXAzX3Jlc3RvcmUpCiAKLQlsZG1pYQlyMyEsIHtyNC1yNn0KLQltb3YJc3AsIHI0CQkJQCBSZXN0b3JlIHNwCi0JbXNyCXNwc3JfY3hzZiwgcjUJCUAgUmVzdG9yZSBzcHNyCi0JbW92CWxyLCByNgkJCUAgUmVzdG9yZSBscgotCi0JbGRtaWEJcjMhLCB7cjQtcjd9Ci0JbWNyCXAxNSwgMCwgcjQsIGMxLCBjMCwgMglAIENvcHJvY2Vzc29yIGFjY2VzcyBDb250cm9sIFJlZ2lzdGVyCi0JbWNyCXAxNSwgMCwgcjUsIGMyLCBjMCwgMAlAIFRUQlIwCi0JbWNyCXAxNSwgMCwgcjYsIGMyLCBjMCwgMQlAIFRUQlIxCi0JbWNyCXAxNSwgMCwgcjcsIGMyLCBjMCwgMglAIFRUQkNSCi0KLQlsZG1pYQlyMyEse3I0LXI2fQotCW1jcglwMTUsIDAsIHI0LCBjMywgYzAsIDAJQCBEb21haW4gYWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIKLQltY3IJcDE1LCAwLCByNSwgYzEwLCBjMiwgMAlAIFBSUlIKLQltY3IJcDE1LCAwLCByNiwgYzEwLCBjMiwgMQlAIE5NUlIKLQotCi0JbGRtaWEJcjMhLHtyNC1yN30KLQltY3IJcDE1LCAwLCByNCwgYzEzLCBjMCwgMQlAIENvbnRleHQgSUQKLQltY3IJcDE1LCAwLCByNSwgYzEzLCBjMCwgMglAIFVzZXIgci93IHRocmVhZCBhbmQgcHJvY2VzcyBJRAotCW1yYwlwMTUsIDAsIHI2LCBjMTIsIGMwLCAwCUAgU2VjdXJlIG9yIE5TIHZlY3RvciBiYXNlIGFkZHJlc3MKLQltc3IJY3BzciwgcjcJCUAgc3RvcmUgY3BzcgotCi0JLyogRW5hYmxpbmcgTU1VIGhlcmUgKi8KLQltcmMJcDE1LCAwLCByNywgYzIsIGMwLCAyIAlAIFJlYWQgVFRCUkNvbnRyb2wKLQkvKiBFeHRyYWN0IE4gKDA6MikgYml0cyBhbmQgZGVjaWRlIHdoZXRoZXIgdG8gdXNlIFRUQlIwIG9yIFRUQlIxICovCi0JYW5kCXI3LCAjMHg3Ci0JY21wCXI3LCAjMHgwCi0JYmVxCXVzZXR0YnIwCi10dGJyX2Vycm9yOgotCS8qCi0JICogTW9yZSB3b3JrIG5lZWRzIHRvIGJlIGRvbmUgdG8gc3VwcG9ydCBOWzA6Ml0gdmFsdWUgb3RoZXIgdGhhbiAwCi0JICogU28gbG9vcGluZyBoZXJlIHNvIHRoYXQgdGhlIGVycm9yIGNhbiBiZSBkZXRlY3RlZAotCSAqLwotCWIJdHRicl9lcnJvcgotdXNldHRicjA6Ci0JbXJjCXAxNSwgMCwgcjIsIGMyLCBjMCwgMAotCWxkcglyNSwgdHRicmJpdF9tYXNrCi0JYW5kCXIyLCByNQotCW1vdglyNCwgcGMKLQlsZHIJcjUsIHRhYmxlX2luZGV4X21hc2sKLQlhbmQJcjQsIHI1CQkJQCByNCA9IDMxIHRvIDIwIGJpdHMgb2YgcGMKLQkvKiBFeHRyYWN0IHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRhYmxlIGVudHJ5ICovCi0JbGRyCXIxLCB0YWJsZV9lbnRyeQotCS8qIHIxIGhhcyB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0YWJsZSBlbnRyeSovCi0JYWRkCXIxLCByMSwgcjQKLQkvKiBHZXR0aW5nIHRoZSBhZGRyZXNzIG9mIHRhYmxlIGVudHJ5IHRvIG1vZGlmeSAqLwotCWxzcglyNCwgIzE4Ci0JLyogcjIgaGFzIHRoZSBsb2NhdGlvbiB3aGljaCBuZWVkcyB0byBiZSBtb2RpZmllZCAqLwotCWFkZAlyMiwgcjQKLQkvKiBTdG9yaW5nIHByZXZpb3VzIGVudHJ5IG9mIGxvY2F0aW9uIGJlaW5nIG1vZGlmaWVkICovCi0JbGRyCXI1LCBzY3JhdGNocGFkX2Jhc2UKLQlsZHIJcjQsIFtyMl0KLQlzdHIJcjQsIFtyNSwgIzB4QzBdCi0JLyogTW9kaWZ5IHRoZSB0YWJsZSBlbnRyeSAqLwotCXN0cglyMSwgW3IyXQotCS8qCi0JICogU3RvcmluZyBhZGRyZXNzIG9mIGVudHJ5IGJlaW5nIG1vZGlmaWVkCi0JICogLSB3aWxsIGJlIHJlc3RvcmVkIGFmdGVyIGVuYWJsaW5nIE1NVQotCSAqLwotCWxkcglyNSwgc2NyYXRjaHBhZF9iYXNlCi0Jc3RyCXIyLCBbcjUsICMweEM0XQotCi0JbW92CXIwLCAjMAotCW1jcglwMTUsIDAsIHIwLCBjNywgYzUsIDQJQCBGbHVzaCBwcmVmZXRjaCBidWZmZXIKLQltY3IJcDE1LCAwLCByMCwgYzcsIGM1LCA2CUAgSW52YWxpZGF0ZSBicmFuY2ggcHJlZGljdG9yIGFycmF5Ci0JbWNyCXAxNSwgMCwgcjAsIGM4LCBjNSwgMAlAIEludmFsaWRhdGUgaW5zdHJ1Y3Rpb24gVExCCi0JbWNyCXAxNSwgMCwgcjAsIGM4LCBjNiwgMAlAIEludmFsaWRhdGUgZGF0YSBUTEIKLQkvKgotCSAqIFJlc3RvcmUgY29udHJvbCByZWdpc3Rlci4gVGhpcyBlbmFibGVzIHRoZSBNTVUuCi0JICogVGhlIGNhY2hlcyBhbmQgcHJlZGljdGlvbiBhcmUgbm90IGVuYWJsZWQgaGVyZSwgdGhleQotCSAqIHdpbGwgYmUgZW5hYmxlZCBhZnRlciByZXN0b3JpbmcgdGhlIE1NVSB0YWJsZSBlbnRyeS4KLQkgKi8KLQlsZG1pYQlyMyEsIHtyNH0KLQkvKiBTdG9yZSBwcmV2aW91cyB2YWx1ZSBvZiBjb250cm9sIHJlZ2lzdGVyIGluIHNjcmF0Y2hwYWQgKi8KLQlzdHIJcjQsIFtyNSwgIzB4QzhdCi0JbGRyCXIyLCBjYWNoZV9wcmVkX2Rpc2FibGVfbWFzawotCWFuZAlyNCwgcjIKLQltY3IJcDE1LCAwLCByNCwgYzEsIGMwLCAwCi0JZHNiCi0JaXNiCi0JbGRyICAgICByMCwgPXJlc3RvcmVtbXVfb24KLQlieCAgICAgIHIwCisJLmx0b3JnCiAKIC8qCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqID09IEV4aXQgcG9pbnQgZnJvbSBPRkYgbW9kZSA9PQotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCB2YXJpYWJsZXMKICAqLwotcmVzdG9yZW1tdV9vbjoKLQlsZG1mZAlzcCEsIHtyMC1yMTIsIHBjfQlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCi0KK3BtX3ByZXB3c3RzdF9jb3JlX3A6CisJLndvcmQJUE1fUFJFUFdTVFNUX0NPUkVfUAorcG1fcHdzdGN0cmxfbXB1OgorCS53b3JkCVBNX1BXU1RDVFJMX01QVV9QCitzY3JhdGNocGFkX2Jhc2U6CisJLndvcmQJU0NSQVRDSFBBRF9CQVNFX1AKK3NyYW1fYmFzZToKKwkud29yZAlTUkFNX0JBU0VfUCArIDB4ODAwMAorY29udHJvbF9zdGF0OgorCS53b3JkCUNPTlRST0xfU1RBVAorY29udHJvbF9tZW1fcnRhOgorCS53b3JkCUNPTlRST0xfTUVNX1JUQV9DVFJMCitsMmRpc18zNjMwOgorCS53b3JkCTAKIAogLyoKICAqIEludGVybmFsIGZ1bmN0aW9ucwogICovCiAKLS8qIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgZXJyYXR1bSBJRCBpNDQzIFdBLCBhcHBsaWVzIHRvIDM0eHggPj0gRVMzLjAgKi8KKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIGVycmF0dW0gSUQgaTQ0MyBXQSwgYXBwbGllcyB0byAzNHh4ID49IEVTMy4wCisgKiBDb3BpZWQgdG8gYW5kIHJ1biBmcm9tIFNSQU0gaW4gb3JkZXIgdG8gcmVjb25maWd1cmUgdGhlIFNEUkMgcGFyYW1ldGVycy4KKyAqLwogCS50ZXh0CiAJLmFsaWduCTMKIEVOVFJZKGVzM19zZHJjX2ZpeCkKQEAgLTYwOSw2ICs1OTEsOSBAQAogCXN0cglyNSwgW3I0XQkJQCBraWNrIG9mZiByZWZyZXNoZXMKIAlieAlscgogCisvKgorICogTG9jYWwgdmFyaWFibGVzCisgKi8KIAkuYWxpZ24KIHNkcmNfc3lzY2ZnOgogCS53b3JkCVNEUkNfU1lTQ09ORklHX1AKQEAgLTYyNywxMjggKzYxMiwzIEBACiBFTkRQUk9DKGVzM19zZHJjX2ZpeCkKIEVOVFJZKGVzM19zZHJjX2ZpeF9zeikKIAkud29yZAkuIC0gZXMzX3NkcmNfZml4Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIGVycmF0dW0gSUQgaTU4MSBXQToKLSAqICBTRFJDIHN0YXRlIHJlc3RvcmUgYmVmb3JlIGFjY2Vzc2luZyB0aGUgU0RSQU0KLSAqCi0gKiBPbmx5IHVzZWQgYXQgcmV0dXJuIGZyb20gbm9uLU9GRiBtb2RlLiBGb3IgT0ZGCi0gKiBtb2RlIHRoZSBST00gY29kZSBjb25maWd1cmVzIHRoZSBTRFJDIGFuZAotICogdGhlIERQTEwgYmVmb3JlIGNhbGxpbmcgdGhlIHJlc3RvcmUgY29kZSBkaXJlY3RseQotICogZnJvbSBERFIuCi0gKi8KLQotLyogTWFrZSBzdXJlIFNEUkMgYWNjZXNzZXMgYXJlIG9rICovCi13YWl0X3NkcmNfb2s6Ci0KLS8qIERQTEwzIG11c3QgYmUgbG9ja2VkIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIFNEUkMuIE1heWJlIHRoZSBIVyBlbnN1cmVzIHRoaXMgKi8KLQlsZHIJcjQsIGNtX2lkbGVzdF9ja2dlbgotd2FpdF9kcGxsM19sb2NrOgotCWxkcglyNSwgW3I0XQotCXRzdAlyNSwgIzEKLQliZXEJd2FpdF9kcGxsM19sb2NrCi0KLQlsZHIJcjQsIGNtX2lkbGVzdDFfY29yZQotd2FpdF9zZHJjX3JlYWR5OgotCWxkcglyNSwgW3I0XQotCXRzdAlyNSwgIzB4MgotCWJuZQl3YWl0X3NkcmNfcmVhZHkKLQkvKiBhbGxvdyBETEwgcG93ZXJkb3duIHVwb24gaHcgaWRsZSByZXEgKi8KLQlsZHIJcjQsIHNkcmNfcG93ZXIKLQlsZHIJcjUsIFtyNF0KLQliaWMJcjUsIHI1LCAjMHg0MAotCXN0cglyNSwgW3I0XQotCi0vKgotICogUEMtcmVsYXRpdmUgc3RvcmVzIGxlYWQgdG8gdW5kZWZpbmVkIGJlaGF2aW91ciBpbiBUaHVtYi0yOiB1c2UgYSByNyBhcyBhCi0gKiBiYXNlIGluc3RlYWQuCi0gKiBCZSBjYXJlZnVsIG5vdCB0byBjbG9iYmVyIHI3IHdoZW4gbWFpbnRhaW5nIHRoaXMgY29kZS4KLSAqLwotCi1pc19kbGxfaW5fbG9ja19tb2RlOgotCS8qIElzIGRsbCBpbiBsb2NrIG1vZGU/ICovCi0JbGRyCXI0LCBzZHJjX2RsbGFfY3RybAotCWxkcglyNSwgW3I0XQotCXRzdAlyNSwgIzB4NAotCWJ4bmUJbHIJCQlAIFJldHVybiBpZiBsb2NrZWQKLQkvKiB3YWl0IHRpbGwgZGxsIGxvY2tzICovCi0JYWRyCXI3LCBraWNrX2NvdW50ZXIKLXdhaXRfZGxsX2xvY2tfdGltZWQ6Ci0JbGRyCXI0LCB3YWl0X2RsbF9sb2NrX2NvdW50ZXIKLQlhZGQJcjQsIHI0LCAjMQotCXN0cglyNCwgW3I3LCAjd2FpdF9kbGxfbG9ja19jb3VudGVyIC0ga2lja19jb3VudGVyXQotCWxkcglyNCwgc2RyY19kbGxhX3N0YXR1cwotCS8qIFdhaXQgMjB1UyBmb3IgbG9jayAqLwotCW1vdglyNiwgIzgKLXdhaXRfZGxsX2xvY2s6Ci0Jc3VicwlyNiwgcjYsICMweDEKLQliZXEJa2lja19kbGwKLQlsZHIJcjUsIFtyNF0KLQlhbmQJcjUsIHI1LCAjMHg0Ci0JY21wCXI1LCAjMHg0Ci0JYm5lCXdhaXRfZGxsX2xvY2sKLQlieAlscgkJCUAgUmV0dXJuIHdoZW4gbG9ja2VkCi0KLQkvKiBkaXNhYmxlL3JlZW5hYmxlIERMTCBpZiBub3QgbG9ja2VkICovCi1raWNrX2RsbDoKLQlsZHIJcjQsIHNkcmNfZGxsYV9jdHJsCi0JbGRyCXI1LCBbcjRdCi0JbW92CXI2LCByNQotCWJpYwlyNiwgIygxPDwzKQkJQCBkaXNhYmxlIGRsbAotCXN0cglyNiwgW3I0XQotCWRzYgotCW9ycglyNiwgcjYsICMoMTw8MykJCUAgZW5hYmxlIGRsbAotCXN0cglyNiwgW3I0XQotCWRzYgotCWxkcglyNCwga2lja19jb3VudGVyCi0JYWRkCXI0LCByNCwgIzEKLQlzdHIJcjQsIFtyN10JCUAga2lja19jb3VudGVyCi0JYgl3YWl0X2RsbF9sb2NrX3RpbWVkCi0KLQkuYWxpZ24KLWNtX2lkbGVzdDFfY29yZToKLQkud29yZAlDTV9JRExFU1QxX0NPUkVfVgotY21faWRsZXN0X2NrZ2VuOgotCS53b3JkCUNNX0lETEVTVF9DS0dFTl9WCi1zZHJjX2RsbGFfc3RhdHVzOgotCS53b3JkCVNEUkNfRExMQV9TVEFUVVNfVgotc2RyY19kbGxhX2N0cmw6Ci0JLndvcmQJU0RSQ19ETExBX0NUUkxfVgotcG1fcHJlcHdzdHN0X2NvcmVfcDoKLQkud29yZAlQTV9QUkVQV1NUU1RfQ09SRV9QCi1wbV9wd3N0Y3RybF9tcHU6Ci0JLndvcmQJUE1fUFdTVENUUkxfTVBVX1AKLXNjcmF0Y2hwYWRfYmFzZToKLQkud29yZAlTQ1JBVENIUEFEX0JBU0VfUAotc3JhbV9iYXNlOgotCS53b3JkCVNSQU1fQkFTRV9QICsgMHg4MDAwCi1zZHJjX3Bvd2VyOgotCS53b3JkCVNEUkNfUE9XRVJfVgotdHRicmJpdF9tYXNrOgotCS53b3JkCTB4RkZGRkMwMDAKLXRhYmxlX2luZGV4X21hc2s6Ci0JLndvcmQJMHhGRkYwMDAwMAotdGFibGVfZW50cnk6Ci0JLndvcmQJMHgwMDAwMEMwMgotY2FjaGVfcHJlZF9kaXNhYmxlX21hc2s6Ci0JLndvcmQJMHhGRkZGRTdGQgotY29udHJvbF9zdGF0OgotCS53b3JkCUNPTlRST0xfU1RBVAotY29udHJvbF9tZW1fcnRhOgotCS53b3JkCUNPTlRST0xfTUVNX1JUQV9DVFJMCi1rZXJuZWxfZmx1c2g6Ci0JLndvcmQJdjdfZmx1c2hfZGNhY2hlX2FsbAotbDJkaXNfMzYzMDoKLQkud29yZAkwCi0JLyoKLQkgKiBXaGVuIGV4cG9ydGluZyB0byB1c2Vyc3BhY2Ugd2hpbGUgdGhlIGNvdW50ZXJzIGFyZSBpbiBTUkFNLAotCSAqIHRoZXNlIDIgd29yZHMgbmVlZCB0byBiZSBhdCB0aGUgZW5kIHRvIGZhY2lsaXRhdGUgcmV0cml2YWwhCi0JICovCi1raWNrX2NvdW50ZXI6Ci0JLndvcmQJMAotd2FpdF9kbGxfbG9ja19jb3VudGVyOgotCS53b3JkCTAKLUVORFBST0Mob21hcDM0eHhfY3B1X3N1c3BlbmQpCi0KLUVOVFJZKG9tYXAzNHh4X2NwdV9zdXNwZW5kX3N6KQotCS53b3JkCS4gLSBvbWFwMzR4eF9jcHVfc3VzcGVuZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbWFydHJlZmxleC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbWFydHJlZmxleC5jCmluZGV4IGZiN2RjNTIuLjJjZTJmYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvc21hcnRyZWZsZXguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NtYXJ0cmVmbGV4LmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCQlzcl93cml0ZV9yZWcoc3JfaW5mbywgSVJRU1RBVFVTLCBzdGF0dXMpOwogCX0KIAotCWlmIChzcl9jbGFzcy0+Y2xhc3NfdHlwZSA9PSBTUl9DTEFTUzIgJiYgc3JfY2xhc3MtPm5vdGlmeSkKKwlpZiAoc3JfY2xhc3MtPm5vdGlmeSkKIAkJc3JfY2xhc3MtPm5vdGlmeShzcl9pbmZvLT52b2x0ZG0sIHN0YXR1cyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0yNTgsOSArMjU4LDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChzcl9jbGFzcy0+Y2xhc3NfdHlwZSA9PSBTUl9DTEFTUzIgJiYKLQkJc3JfY2xhc3MtPm5vdGlmeV9mbGFncyAmJiBzcl9pbmZvLT5pcnEpIHsKLQorCWlmIChzcl9jbGFzcy0+bm90aWZ5ICYmIHNyX2NsYXNzLT5ub3RpZnlfZmxhZ3MgJiYgc3JfaW5mby0+aXJxKSB7CiAJCW5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgInNyXyVzIiwgc3JfaW5mby0+dm9sdGRtLT5uYW1lKTsKIAkJaWYgKG5hbWUgPT0gTlVMTCkgewogCQkJcmV0ID0gLUVOT01FTTsKQEAgLTI3MCw2ICsyNjgsNyBAQAogCQkJCTAsIG5hbWUsICh2b2lkICopc3JfaW5mbyk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yOworCQlkaXNhYmxlX2lycShzcl9pbmZvLT5pcnEpOwogCX0KIAogCWlmIChwZGF0YSAmJiBwZGF0YS0+ZW5hYmxlX29uX2luaXQpCkBAIC0yNzgsMTYgKzI3NywxNiBAQAogCXJldHVybiByZXQ7CiAKIGVycm9yOgotCQlpb3VubWFwKHNyX2luZm8tPmJhc2UpOwotCQltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2Uoc3JfaW5mby0+cGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCQlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKLQkJbGlzdF9kZWwoJnNyX2luZm8tPm5vZGUpOwotCQlkZXZfZXJyKCZzcl9pbmZvLT5wZGV2LT5kZXYsICIlczogRVJST1IgaW4gcmVnaXN0ZXJpbmciCi0JCQkiaW50ZXJydXB0IGhhbmRsZXIuIFNtYXJ0cmVmbGV4IHdpbGwiCi0JCQkibm90IGZ1bmN0aW9uIGFzIGRlc2lyZWRcbiIsIF9fZnVuY19fKTsKLQkJa2ZyZWUobmFtZSk7Ci0JCWtmcmVlKHNyX2luZm8pOwotCQlyZXR1cm4gcmV0OworCWlvdW5tYXAoc3JfaW5mby0+YmFzZSk7CisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHNyX2luZm8tPnBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKKwlsaXN0X2RlbCgmc3JfaW5mby0+bm9kZSk7CisJZGV2X2Vycigmc3JfaW5mby0+cGRldi0+ZGV2LCAiJXM6IEVSUk9SIGluIHJlZ2lzdGVyaW5nIgorCQkiaW50ZXJydXB0IGhhbmRsZXIuIFNtYXJ0cmVmbGV4IHdpbGwiCisJCSJub3QgZnVuY3Rpb24gYXMgZGVzaXJlZFxuIiwgX19mdW5jX18pOworCWtmcmVlKG5hbWUpOworCWtmcmVlKHNyX2luZm8pOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHNyX3YxX2Rpc2FibGUoc3RydWN0IG9tYXBfc3IgKnNyKQpAQCAtODA4LDEwICs4MDcsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCF2YWwpCi0JCXNyX3N0b3BfdmRkYXV0b2NvbXAoc3JfaW5mbyk7Ci0JZWxzZQotCQlzcl9zdGFydF92ZGRhdXRvY29tcChzcl9pbmZvKTsKKwkvKiBjb250cm9sIGVuYWJsZS9kaXNhYmxlIG9ubHkgaWYgdGhlcmUgaXMgYSBkZWx0YSBpbiB2YWx1ZSAqLworCWlmIChzcl9pbmZvLT5hdXRvY29tcF9hY3RpdmUgIT0gdmFsKSB7CisJCWlmICghdmFsKQorCQkJc3Jfc3RvcF92ZGRhdXRvY29tcChzcl9pbmZvKTsKKwkJZWxzZQorCQkJc3Jfc3RhcnRfdmRkYXV0b2NvbXAoc3JfaW5mbyk7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3RpbWVyLWdwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3RpbWVyLWdwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOWNmODUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi90aW1lci1ncC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAyL3RpbWVyLWdwLmMKLSAqCi0gKiBPTUFQMiBHUCB0aW1lciBzdXBwb3J0LgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgotICoKLSAqIFVwZGF0ZSB0byB1c2UgbmV3IGNsb2Nrc291cmNlL2Nsb2NrZXZlbnQgbGF5ZXJzCi0gKiBBdXRob3I6IEtldmluIEhpbG1hbiwgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIE9yaWdpbmFsIGRyaXZlcjoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgotICogQXV0aG9yOiBQYXVsIE11bmR0IDxwYXVsLm11bmR0QG5va2lhLmNvbT4KLSAqICAgICAgICAgSnVoYSBZcmrDtmzDpCA8anVoYS55cmpvbGFAbm9raWEuY29tPgotICogT01BUCBEdWFsLW1vZGUgdGltZXIgZnJhbWV3b3JrIHN1cHBvcnQgYnkgVGltbyBUZXJhcwotICoKLSAqIFNvbWUgcGFydHMgYmFzZWQgb2ZmIG9mIFRJJ3MgMjR4eCBjb2RlOgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCi0gKgotICogUm91Z2hseSBtb2RlbGxlZCBhZnRlciB0aGUgT01BUDEgTVBVIHRpbWVyIGNvZGUuCi0gKiBBZGRlZCBPTUFQNCBzdXBwb3J0IC0gU2FudG9zaCBTaGlsaW1rYXIgPHNhbnRvc2guc2hpbGlta2FyQHRpLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotI2luY2x1ZGUgPHBsYXQvZG10aW1lci5oPgotI2luY2x1ZGUgPGFzbS9sb2NhbHRpbWVyLmg+Ci0jaW5jbHVkZSA8YXNtL3NjaGVkX2Nsb2NrLmg+Ci0jaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KLSNpbmNsdWRlIDxwbGF0L29tYXBfaHdtb2QuaD4KLQotI2luY2x1ZGUgInRpbWVyLWdwLmgiCi0KLQotLyogTUFYX0dQVElNRVJfSUQ6IG51bWJlciBvZiBHUFRJTUVScyBvbiB0aGUgY2hpcCAqLwotI2RlZmluZSBNQVhfR1BUSU1FUl9JRAkJMTIKLQotc3RhdGljIHN0cnVjdCBvbWFwX2RtX3RpbWVyICpncHRpbWVyOwotc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgY2xvY2tldmVudF9ncHQ7Ci1zdGF0aWMgdTggX19pbml0ZGF0YSBncHRpbWVyX2lkID0gMTsKLXN0YXRpYyB1OCBfX2luaXRkYXRhIGluaXRlZDsKLXN0cnVjdCBvbWFwX2RtX3RpbWVyICpncHRpbWVyX3dha2V1cDsKLQotc3RhdGljIGlycXJldHVybl90IG9tYXAyX2dwX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IG9tYXBfZG1fdGltZXIgKmdwdCA9IChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqKWRldl9pZDsKLQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAmY2xvY2tldmVudF9ncHQ7Ci0KLQlvbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyhncHQsIE9NQVBfVElNRVJfSU5UX09WRVJGTE9XKTsKLQotCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcDJfZ3BfdGltZXJfaXJxID0gewotCS5uYW1lCQk9ICJncCB0aW1lciIsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMLAotCS5oYW5kbGVyCT0gb21hcDJfZ3BfdGltZXJfaW50ZXJydXB0LAotfTsKLQotc3RhdGljIGludCBvbWFwMl9ncF90aW1lcl9zZXRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGN5Y2xlcywKLQkJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKLXsKLQlvbWFwX2RtX3RpbWVyX3NldF9sb2FkX3N0YXJ0KGdwdGltZXIsIDAsIDB4ZmZmZmZmZmYgLSBjeWNsZXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXAyX2dwX3RpbWVyX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAotCQkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi17Ci0JdTMyIHBlcmlvZDsKLQotCW9tYXBfZG1fdGltZXJfc3RvcChncHRpbWVyKTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6Ci0JCXBlcmlvZCA9IGNsa19nZXRfcmF0ZShvbWFwX2RtX3RpbWVyX2dldF9mY2xrKGdwdGltZXIpKSAvIEhaOwotCQlwZXJpb2QgLT0gMTsKLQkJb21hcF9kbV90aW1lcl9zZXRfbG9hZF9zdGFydChncHRpbWVyLCAxLCAweGZmZmZmZmZmIC0gcGVyaW9kKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgotCQlicmVhazsKLQljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKLQljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGNsb2NrZXZlbnRfZ3B0ID0gewotCS5uYW1lCQk9ICJncCB0aW1lciIsCi0JLmZlYXR1cmVzICAgICAgID0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAotCS5zaGlmdAkJPSAzMiwKLQkuc2V0X25leHRfZXZlbnQJPSBvbWFwMl9ncF90aW1lcl9zZXRfbmV4dF9ldmVudCwKLQkuc2V0X21vZGUJPSBvbWFwMl9ncF90aW1lcl9zZXRfbW9kZSwKLX07Ci0KLS8qKgotICogb21hcDJfZ3BfY2xvY2tldmVudF9zZXRfZ3B0aW1lciAtIHNldCB3aGljaCBHUFRJTUVSIGlzIHVzZWQgZm9yIGNsb2NrZXZlbnRzCi0gKiBAaWQ6IEdQVElNRVIgdG8gdXNlICgxLi5NQVhfR1BUSU1FUl9JRCkKLSAqCi0gKiBEZWZpbmUgdGhlIEdQVElNRVIgdGhhdCB0aGUgc3lzdGVtIHNob3VsZCB1c2UgZm9yIHRoZSB0aWNrIHRpbWVyLgotICogTWVhbnQgdG8gYmUgY2FsbGVkIGZyb20gYm9hcmQtKi5jIGZpbGVzIGluIHRoZSBldmVudCB0aGF0IEdQVElNRVIxLCB0aGUKLSAqIGRlZmF1bHQsIGlzIHVuc3VpdGFibGUuICBSZXR1cm5zIC1FSU5WQUwgb24gZXJyb3Igb3IgMCBvbiBzdWNjZXNzLgotICovCi1pbnQgX19pbml0IG9tYXAyX2dwX2Nsb2NrZXZlbnRfc2V0X2dwdGltZXIodTggaWQpCi17Ci0JaWYgKGlkIDwgMSB8fCBpZCA+IE1BWF9HUFRJTUVSX0lEKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCUJVR19PTihpbml0ZWQpOwotCi0JZ3B0aW1lcl9pZCA9IGlkOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwMl9ncF9jbG9ja2V2ZW50X2luaXQodm9pZCkKLXsKLQl1MzIgdGlja19yYXRlOwotCWludCBzcmM7Ci0JY2hhciBjbG9ja2V2ZW50X2h3bW9kX25hbWVbOF07IC8qIDggPSBzaXplb2YoInRpbWVyWFgwIikgKi8KLQotCWluaXRlZCA9IDE7Ci0KLQlzcHJpbnRmKGNsb2NrZXZlbnRfaHdtb2RfbmFtZSwgInRpbWVyJWQiLCBncHRpbWVyX2lkKTsKLQlvbWFwX2h3bW9kX3NldHVwX29uZShjbG9ja2V2ZW50X2h3bW9kX25hbWUpOwotCi0JZ3B0aW1lciA9IG9tYXBfZG1fdGltZXJfcmVxdWVzdF9zcGVjaWZpYyhncHRpbWVyX2lkKTsKLQlCVUdfT04oZ3B0aW1lciA9PSBOVUxMKTsKLQlncHRpbWVyX3dha2V1cCA9IGdwdGltZXI7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQXzMyS19USU1FUikKLQlzcmMgPSBPTUFQX1RJTUVSX1NSQ18zMl9LSFo7Ci0jZWxzZQotCXNyYyA9IE9NQVBfVElNRVJfU1JDX1NZU19DTEs7Ci0JV0FSTihncHRpbWVyX2lkID09IDEyLCAiV0FSTklORzogR1BUSU1FUjEyIGNhbiBvbmx5IHVzZSB0aGUgIgotCSAgICAgInNlY3VyZSAzMktpSHogY2xvY2sgc291cmNlXG4iKTsKLSNlbmRpZgotCi0JaWYgKGdwdGltZXJfaWQgIT0gMTIpCi0JCVdBUk4oSVNfRVJSX1ZBTFVFKG9tYXBfZG1fdGltZXJfc2V0X3NvdXJjZShncHRpbWVyLCBzcmMpKSwKLQkJICAgICAidGltZXItZ3A6IG9tYXBfZG1fdGltZXJfc2V0X3NvdXJjZSgpIGZhaWxlZFxuIik7Ci0KLQl0aWNrX3JhdGUgPSBjbGtfZ2V0X3JhdGUob21hcF9kbV90aW1lcl9nZXRfZmNsayhncHRpbWVyKSk7Ci0KLQlwcl9pbmZvKCJPTUFQIGNsb2NrZXZlbnQgc291cmNlOiBHUFRJTUVSJWQgYXQgJXUgSHpcbiIsCi0JCWdwdGltZXJfaWQsIHRpY2tfcmF0ZSk7Ci0KLQlvbWFwMl9ncF90aW1lcl9pcnEuZGV2X2lkID0gKHZvaWQgKilncHRpbWVyOwotCXNldHVwX2lycShvbWFwX2RtX3RpbWVyX2dldF9pcnEoZ3B0aW1lciksICZvbWFwMl9ncF90aW1lcl9pcnEpOwotCW9tYXBfZG1fdGltZXJfc2V0X2ludF9lbmFibGUoZ3B0aW1lciwgT01BUF9USU1FUl9JTlRfT1ZFUkZMT1cpOwotCi0JY2xvY2tldmVudF9ncHQubXVsdCA9IGRpdl9zYyh0aWNrX3JhdGUsIE5TRUNfUEVSX1NFQywKLQkJCQkgICAgIGNsb2NrZXZlbnRfZ3B0LnNoaWZ0KTsKLQljbG9ja2V2ZW50X2dwdC5tYXhfZGVsdGFfbnMgPQotCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZmZmZmZmZmYsICZjbG9ja2V2ZW50X2dwdCk7Ci0JY2xvY2tldmVudF9ncHQubWluX2RlbHRhX25zID0KLQkJY2xvY2tldmVudF9kZWx0YTJucygzLCAmY2xvY2tldmVudF9ncHQpOwotCQkvKiBUaW1lciBpbnRlcm5hbCByZXN5bmNoIGxhdGVuY3kuICovCi0KLQljbG9ja2V2ZW50X2dwdC5jcHVtYXNrID0gY3B1bWFza19vZigwKTsKLQljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJmNsb2NrZXZlbnRfZ3B0KTsKLX0KLQotLyogQ2xvY2tzb3VyY2UgY29kZSAqLwotCi0jaWZkZWYgQ09ORklHX09NQVBfMzJLX1RJTUVSCi0vKiAKLSAqIFdoZW4gMzJrLXRpbWVyIGlzIGVuYWJsZWQsIGRvbid0IHVzZSBHUFRpbWVyIGZvciBjbG9ja3NvdXJjZQotICogaW5zdGVhZCwganVzdCBsZWF2ZSBkZWZhdWx0IGNsb2Nrc291cmNlIHdoaWNoIHVzZXMgdGhlIDMyawotICogc3luYyBjb3VudGVyLiAgU2VlIGNsb2Nrc291cmNlIHNldHVwIGluIHBsYXQtb21hcC9jb3VudGVyXzMyay5jCi0gKi8KLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXAyX2dwX2Nsb2Nrc291cmNlX2luaXQodm9pZCkKLXsKLQlvbWFwX2luaXRfY2xvY2tzb3VyY2VfMzJrKCk7Ci19Ci0KLSNlbHNlCi0vKgotICogY2xvY2tzb3VyY2UKLSAqLwotc3RhdGljIERFRklORV9DTE9DS19EQVRBKGNkKTsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kbV90aW1lciAqZ3B0X2Nsb2Nrc291cmNlOwotc3RhdGljIGN5Y2xlX3QgY2xvY2tzb3VyY2VfcmVhZF9jeWNsZXMoc3RydWN0IGNsb2Nrc291cmNlICpjcykKLXsKLQlyZXR1cm4gKGN5Y2xlX3Qpb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIoZ3B0X2Nsb2Nrc291cmNlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9ncHQgPSB7Ci0JLm5hbWUJCT0gImdwIHRpbWVyIiwKLQkucmF0aW5nCQk9IDMwMCwKLQkucmVhZAkJPSBjbG9ja3NvdXJjZV9yZWFkX2N5Y2xlcywKLQkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKLQkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCi19OwotCi1zdGF0aWMgdm9pZCBub3RyYWNlIGRtdGltZXJfdXBkYXRlX3NjaGVkX2Nsb2NrKHZvaWQpCi17Ci0JdTMyIGN5YzsKLQotCWN5YyA9IG9tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKGdwdF9jbG9ja3NvdXJjZSk7Ci0KLQl1cGRhdGVfc2NoZWRfY2xvY2soJmNkLCBjeWMsICh1MzIpfjApOwotfQotCi0vKiBTZXR1cCBmcmVlLXJ1bm5pbmcgY291bnRlciBmb3IgY2xvY2tzb3VyY2UgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwMl9ncF9jbG9ja3NvdXJjZV9pbml0KHZvaWQpCi17Ci0Jc3RhdGljIHN0cnVjdCBvbWFwX2RtX3RpbWVyICpncHQ7Ci0JdTMyIHRpY2tfcmF0ZTsKLQlzdGF0aWMgY2hhciBlcnIxW10gX19pbml0ZGF0YSA9IEtFUk5fRVJSCi0JCSIlczogZmFpbGVkIHRvIHJlcXVlc3QgZG0tdGltZXJcbiI7Ci0Jc3RhdGljIGNoYXIgZXJyMltdIF9faW5pdGRhdGEgPSBLRVJOX0VSUgotCQkiJXM6IGNhbid0IHJlZ2lzdGVyIGNsb2Nrc291cmNlIVxuIjsKLQotCWdwdCA9IG9tYXBfZG1fdGltZXJfcmVxdWVzdCgpOwotCWlmICghZ3B0KQotCQlwcmludGsoZXJyMSwgY2xvY2tzb3VyY2VfZ3B0Lm5hbWUpOwotCWdwdF9jbG9ja3NvdXJjZSA9IGdwdDsKLQotCW9tYXBfZG1fdGltZXJfc2V0X3NvdXJjZShncHQsIE9NQVBfVElNRVJfU1JDX1NZU19DTEspOwotCXRpY2tfcmF0ZSA9IGNsa19nZXRfcmF0ZShvbWFwX2RtX3RpbWVyX2dldF9mY2xrKGdwdCkpOwotCi0Jb21hcF9kbV90aW1lcl9zZXRfbG9hZF9zdGFydChncHQsIDEsIDApOwotCi0JaW5pdF9zY2hlZF9jbG9jaygmY2QsIGRtdGltZXJfdXBkYXRlX3NjaGVkX2Nsb2NrLCAzMiwgdGlja19yYXRlKTsKLQotCWlmIChjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY2xvY2tzb3VyY2VfZ3B0LCB0aWNrX3JhdGUpKQotCQlwcmludGsoZXJyMiwgY2xvY2tzb3VyY2VfZ3B0Lm5hbWUpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwMl9ncF90aW1lcl9pbml0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwotCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewotCQl0d2RfYmFzZSA9IGlvcmVtYXAoT01BUDQ0WFhfTE9DQUxfVFdEX0JBU0UsIFNaXzI1Nik7Ci0JCUJVR19PTighdHdkX2Jhc2UpOwotCX0KLSNlbmRpZgotCW9tYXBfZG1fdGltZXJfaW5pdCgpOwotCi0Jb21hcDJfZ3BfY2xvY2tldmVudF9pbml0KCk7Ci0Jb21hcDJfZ3BfY2xvY2tzb3VyY2VfaW5pdCgpOwotfQotCi1zdHJ1Y3Qgc3lzX3RpbWVyIG9tYXBfdGltZXIgPSB7Ci0JLmluaXQJPSBvbWFwMl9ncF90aW1lcl9pbml0LAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdGltZXItZ3AuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvdGltZXItZ3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxMDcyYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3RpbWVyLWdwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKgotICogT01BUDIvMyBHUFRJTUVSIHN1cHBvcnQuaGVhZGVycwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX0FSQ0hfQVJNX1BMQVRfT01BUF9JTkNMVURFX01BQ0hfVElNRVJfR1BfSAotI2RlZmluZSBfX0FSQ0hfQVJNX1BMQVRfT01BUF9JTkNMVURFX01BQ0hfVElNRVJfR1BfSAotCi1leHRlcm4gaW50IF9faW5pdCBvbWFwMl9ncF9jbG9ja2V2ZW50X3NldF9ncHRpbWVyKHU4IGlkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2NDA3MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdGltZXIuYwpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDIvdGltZXIuYworICoKKyAqIE9NQVAyIEdQIHRpbWVyIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogVXBkYXRlIHRvIHVzZSBuZXcgY2xvY2tzb3VyY2UvY2xvY2tldmVudCBsYXllcnMKKyAqIEF1dGhvcjogS2V2aW4gSGlsbWFuLCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogT3JpZ2luYWwgZHJpdmVyOgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFBhdWwgTXVuZHQgPHBhdWwubXVuZHRAbm9raWEuY29tPgorICogICAgICAgICBKdWhhIFlyasO2bMOkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKiBPTUFQIER1YWwtbW9kZSB0aW1lciBmcmFtZXdvcmsgc3VwcG9ydCBieSBUaW1vIFRlcmFzCisgKgorICogU29tZSBwYXJ0cyBiYXNlZCBvZmYgb2YgVEkncyAyNHh4IGNvZGU6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBSb3VnaGx5IG1vZGVsbGVkIGFmdGVyIHRoZSBPTUFQMSBNUFUgdGltZXIgY29kZS4KKyAqIEFkZGVkIE9NQVA0IHN1cHBvcnQgLSBTYW50b3NoIFNoaWxpbWthciA8c2FudG9zaC5zaGlsaW1rYXJAdGkuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8cGxhdC9kbXRpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2xvY2FsdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vc2NoZWRfY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgorI2luY2x1ZGUgPHBsYXQvb21hcF9od21vZC5oPgorCisvKiBQYXJlbnQgY2xvY2tzLCBldmVudHVhbGx5IHRoZXNlIHdpbGwgY29tZSBmcm9tIHRoZSBjbG9jayBmcmFtZXdvcmsgKi8KKworI2RlZmluZSBPTUFQMl9NUFVfU09VUkNFCSJzeXNfY2siCisjZGVmaW5lIE9NQVAzX01QVV9TT1VSQ0UJT01BUDJfTVBVX1NPVVJDRQorI2RlZmluZSBPTUFQNF9NUFVfU09VUkNFCSJzeXNfY2xraW5fY2siCisjZGVmaW5lIE9NQVAyXzMyS19TT1VSQ0UJImZ1bmNfMzJrX2NrIgorI2RlZmluZSBPTUFQM18zMktfU09VUkNFCSJvbWFwXzMya19mY2siCisjZGVmaW5lIE9NQVA0XzMyS19TT1VSQ0UJInN5c18zMmtfY2siCisKKyNpZmRlZiBDT05GSUdfT01BUF8zMktfVElNRVIKKyNkZWZpbmUgT01BUDJfQ0xLRVZfU09VUkNFCU9NQVAyXzMyS19TT1VSQ0UKKyNkZWZpbmUgT01BUDNfQ0xLRVZfU09VUkNFCU9NQVAzXzMyS19TT1VSQ0UKKyNkZWZpbmUgT01BUDRfQ0xLRVZfU09VUkNFCU9NQVA0XzMyS19TT1VSQ0UKKyNkZWZpbmUgT01BUDNfU0VDVVJFX1RJTUVSCTEyCisjZWxzZQorI2RlZmluZSBPTUFQMl9DTEtFVl9TT1VSQ0UJT01BUDJfTVBVX1NPVVJDRQorI2RlZmluZSBPTUFQM19DTEtFVl9TT1VSQ0UJT01BUDNfTVBVX1NPVVJDRQorI2RlZmluZSBPTUFQNF9DTEtFVl9TT1VSQ0UJT01BUDRfTVBVX1NPVVJDRQorI2RlZmluZSBPTUFQM19TRUNVUkVfVElNRVIJMQorI2VuZGlmCisKKy8qIE1BWF9HUFRJTUVSX0lEOiBudW1iZXIgb2YgR1BUSU1FUnMgb24gdGhlIGNoaXAgKi8KKyNkZWZpbmUgTUFYX0dQVElNRVJfSUQJCTEyCisKK3UzMiBzeXNfdGltZXJfcmVzZXJ2ZWQ7CisKKy8qIENsb2NrZXZlbnQgY29kZSAqLworCitzdGF0aWMgc3RydWN0IG9tYXBfZG1fdGltZXIgY2xrZXY7CitzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBjbG9ja2V2ZW50X2dwdDsKKworc3RhdGljIGlycXJldHVybl90IG9tYXAyX2dwX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gJmNsb2NrZXZlbnRfZ3B0OworCisJX19vbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyhjbGtldi5pb19iYXNlLCBPTUFQX1RJTUVSX0lOVF9PVkVSRkxPVyk7CisKKwlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG9tYXAyX2dwX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiZ3AgdGltZXIiLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiB8IElSUUZfSVJRUE9MTCwKKwkuaGFuZGxlcgk9IG9tYXAyX2dwX3RpbWVyX2ludGVycnVwdCwKK307CisKK3N0YXRpYyBpbnQgb21hcDJfZ3BfdGltZXJfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCisJCQkJCSBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJX19vbWFwX2RtX3RpbWVyX2xvYWRfc3RhcnQoY2xrZXYuaW9fYmFzZSwgT01BUF9USU1FUl9DVFJMX1NULAorCQkJCQkJMHhmZmZmZmZmZiAtIGN5Y2xlcywgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb21hcDJfZ3BfdGltZXJfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCisJCQkJICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1MzIgcGVyaW9kOworCisJX19vbWFwX2RtX3RpbWVyX3N0b3AoY2xrZXYuaW9fYmFzZSwgMSwgY2xrZXYucmF0ZSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCQlwZXJpb2QgPSBjbGtldi5yYXRlIC8gSFo7CisJCXBlcmlvZCAtPSAxOworCQkvKiBMb29rcyBsaWtlIHdlIG5lZWQgdG8gZmlyc3Qgc2V0IHRoZSBsb2FkIHZhbHVlIHNlcGFyYXRlbHkgKi8KKwkJX19vbWFwX2RtX3RpbWVyX3dyaXRlKGNsa2V2LmlvX2Jhc2UsIE9NQVBfVElNRVJfTE9BRF9SRUcsCisJCQkJCTB4ZmZmZmZmZmYgLSBwZXJpb2QsIDEpOworCQlfX29tYXBfZG1fdGltZXJfbG9hZF9zdGFydChjbGtldi5pb19iYXNlLAorCQkJCQlPTUFQX1RJTUVSX0NUUkxfQVIgfCBPTUFQX1RJTUVSX0NUUkxfU1QsCisJCQkJCQkweGZmZmZmZmZmIC0gcGVyaW9kLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCQlicmVhazsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGNsb2NrZXZlbnRfZ3B0ID0geworCS5uYW1lCQk9ICJncCB0aW1lciIsCisJLmZlYXR1cmVzICAgICAgID0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAorCS5zaGlmdAkJPSAzMiwKKwkuc2V0X25leHRfZXZlbnQJPSBvbWFwMl9ncF90aW1lcl9zZXRfbmV4dF9ldmVudCwKKwkuc2V0X21vZGUJPSBvbWFwMl9ncF90aW1lcl9zZXRfbW9kZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfZG1fdGltZXJfaW5pdF9vbmUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLAorCQkJCQkJaW50IGdwdGltZXJfaWQsCisJCQkJCQljb25zdCBjaGFyICpmY2tfc291cmNlKQoreworCWNoYXIgbmFtZVsxMF07IC8qIDEwID0gc2l6ZW9mKCJncHRYWF9YY2swIikgKi8KKwlzdHJ1Y3Qgb21hcF9od21vZCAqb2g7CisJc2l6ZV90IHNpemU7CisJaW50IHJlcyA9IDA7CisKKwlzcHJpbnRmKG5hbWUsICJ0aW1lciVkIiwgZ3B0aW1lcl9pZCk7CisJb21hcF9od21vZF9zZXR1cF9vbmUobmFtZSk7CisJb2ggPSBvbWFwX2h3bW9kX2xvb2t1cChuYW1lKTsKKwlpZiAoIW9oKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXRpbWVyLT5pcnEgPSBvaC0+bXB1X2lycXNbMF0uaXJxOworCXRpbWVyLT5waHlzX2Jhc2UgPSBvaC0+c2xhdmVzWzBdLT5hZGRyLT5wYV9zdGFydDsKKwlzaXplID0gb2gtPnNsYXZlc1swXS0+YWRkci0+cGFfZW5kIC0gdGltZXItPnBoeXNfYmFzZTsKKworCS8qIFN0YXRpYyBtYXBwaW5nLCBuZXZlciByZWxlYXNlZCAqLworCXRpbWVyLT5pb19iYXNlID0gaW9yZW1hcCh0aW1lci0+cGh5c19iYXNlLCBzaXplKTsKKwlpZiAoIXRpbWVyLT5pb19iYXNlKQorCQlyZXR1cm4gLUVOWElPOworCisJLyogQWZ0ZXIgdGhlIGRtdGltZXIgaXMgdXNpbmcgaHdtb2QgdGhlc2UgY2xvY2tzIHdvbid0IGJlIG5lZWRlZCAqLworCXNwcmludGYobmFtZSwgImdwdCVkX2ZjayIsIGdwdGltZXJfaWQpOworCXRpbWVyLT5mY2xrID0gY2xrX2dldChOVUxMLCBuYW1lKTsKKwlpZiAoSVNfRVJSKHRpbWVyLT5mY2xrKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcHJpbnRmKG5hbWUsICJncHQlZF9pY2siLCBncHRpbWVyX2lkKTsKKwl0aW1lci0+aWNsayA9IGNsa19nZXQoTlVMTCwgbmFtZSk7CisJaWYgKElTX0VSUih0aW1lci0+aWNsaykpIHsKKwkJY2xrX3B1dCh0aW1lci0+ZmNsayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW9tYXBfaHdtb2RfZW5hYmxlKG9oKTsKKworCXN5c190aW1lcl9yZXNlcnZlZCB8PSAoMSA8PCAoZ3B0aW1lcl9pZCAtIDEpKTsKKworCWlmIChncHRpbWVyX2lkICE9IDEyKSB7CisJCXN0cnVjdCBjbGsgKnNyYzsKKworCQlzcmMgPSBjbGtfZ2V0KE5VTEwsIGZja19zb3VyY2UpOworCQlpZiAoSVNfRVJSKHNyYykpIHsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQlyZXMgPSBfX29tYXBfZG1fdGltZXJfc2V0X3NvdXJjZSh0aW1lci0+ZmNsaywgc3JjKTsKKwkJCWlmIChJU19FUlJfVkFMVUUocmVzKSkKKwkJCQlwcl93YXJuaW5nKCIlczogdGltZXIlaSBjYW5ub3Qgc2V0IHNvdXJjZVxuIiwKKwkJCQkJCV9fZnVuY19fLCBncHRpbWVyX2lkKTsKKwkJCWNsa19wdXQoc3JjKTsKKwkJfQorCX0KKwlfX29tYXBfZG1fdGltZXJfcmVzZXQodGltZXItPmlvX2Jhc2UsIDEsIDEpOworCXRpbWVyLT5wb3N0ZWQgPSAxOworCisJdGltZXItPnJhdGUgPSBjbGtfZ2V0X3JhdGUodGltZXItPmZjbGspOworCisJdGltZXItPnJlc2VydmVkID0gMTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwMl9ncF9jbG9ja2V2ZW50X2luaXQoaW50IGdwdGltZXJfaWQsCisJCQkJCQljb25zdCBjaGFyICpmY2tfc291cmNlKQoreworCWludCByZXM7CisKKwlyZXMgPSBvbWFwX2RtX3RpbWVyX2luaXRfb25lKCZjbGtldiwgZ3B0aW1lcl9pZCwgZmNrX3NvdXJjZSk7CisJQlVHX09OKHJlcyk7CisKKwlvbWFwMl9ncF90aW1lcl9pcnEuZGV2X2lkID0gKHZvaWQgKikmY2xrZXY7CisJc2V0dXBfaXJxKGNsa2V2LmlycSwgJm9tYXAyX2dwX3RpbWVyX2lycSk7CisKKwlfX29tYXBfZG1fdGltZXJfaW50X2VuYWJsZShjbGtldi5pb19iYXNlLCBPTUFQX1RJTUVSX0lOVF9PVkVSRkxPVyk7CisKKwljbG9ja2V2ZW50X2dwdC5tdWx0ID0gZGl2X3NjKGNsa2V2LnJhdGUsIE5TRUNfUEVSX1NFQywKKwkJCQkgICAgIGNsb2NrZXZlbnRfZ3B0LnNoaWZ0KTsKKwljbG9ja2V2ZW50X2dwdC5tYXhfZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZmZmZmZmZmYsICZjbG9ja2V2ZW50X2dwdCk7CisJY2xvY2tldmVudF9ncHQubWluX2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygzLCAmY2xvY2tldmVudF9ncHQpOworCQkvKiBUaW1lciBpbnRlcm5hbCByZXN5bmNoIGxhdGVuY3kuICovCisKKwljbG9ja2V2ZW50X2dwdC5jcHVtYXNrID0gY3B1bWFza19vZigwKTsKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJmNsb2NrZXZlbnRfZ3B0KTsKKworCXByX2luZm8oIk9NQVAgY2xvY2tldmVudCBzb3VyY2U6IEdQVElNRVIlZCBhdCAlbHUgSHpcbiIsCisJCWdwdGltZXJfaWQsIGNsa2V2LnJhdGUpOworfQorCisvKiBDbG9ja3NvdXJjZSBjb2RlICovCisKKyNpZmRlZiBDT05GSUdfT01BUF8zMktfVElNRVIKKy8qCisgKiBXaGVuIDMyay10aW1lciBpcyBlbmFibGVkLCBkb24ndCB1c2UgR1BUaW1lciBmb3IgY2xvY2tzb3VyY2UKKyAqIGluc3RlYWQsIGp1c3QgbGVhdmUgZGVmYXVsdCBjbG9ja3NvdXJjZSB3aGljaCB1c2VzIHRoZSAzMmsKKyAqIHN5bmMgY291bnRlci4gIFNlZSBjbG9ja3NvdXJjZSBzZXR1cCBpbiBwbGF0LW9tYXAvY291bnRlcl8zMmsuYworICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwMl9ncF9jbG9ja3NvdXJjZV9pbml0KGludCB1bnVzZWQsIGNvbnN0IGNoYXIgKmR1bW15KQoreworCW9tYXBfaW5pdF9jbG9ja3NvdXJjZV8zMmsoKTsKK30KKworI2Vsc2UKKworc3RhdGljIHN0cnVjdCBvbWFwX2RtX3RpbWVyIGNsa3NyYzsKKworLyoKKyAqIGNsb2Nrc291cmNlCisgKi8KK3N0YXRpYyBERUZJTkVfQ0xPQ0tfREFUQShjZCk7CitzdGF0aWMgY3ljbGVfdCBjbG9ja3NvdXJjZV9yZWFkX2N5Y2xlcyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXJldHVybiAoY3ljbGVfdClfX29tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKGNsa3NyYy5pb19iYXNlLCAxKTsKK30KKworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9ncHQgPSB7CisJLm5hbWUJCT0gImdwIHRpbWVyIiwKKwkucmF0aW5nCQk9IDMwMCwKKwkucmVhZAkJPSBjbG9ja3NvdXJjZV9yZWFkX2N5Y2xlcywKKwkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCit9OworCitzdGF0aWMgdm9pZCBub3RyYWNlIGRtdGltZXJfdXBkYXRlX3NjaGVkX2Nsb2NrKHZvaWQpCit7CisJdTMyIGN5YzsKKworCWN5YyA9IF9fb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIoY2xrc3JjLmlvX2Jhc2UsIDEpOworCisJdXBkYXRlX3NjaGVkX2Nsb2NrKCZjZCwgY3ljLCAodTMyKX4wKTsKK30KKwordW5zaWduZWQgbG9uZyBsb25nIG5vdHJhY2Ugc2NoZWRfY2xvY2sodm9pZCkKK3sKKwl1MzIgY3ljID0gMDsKKworCWlmIChjbGtzcmMucmVzZXJ2ZWQpCisJCWN5YyA9IF9fb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIoY2xrc3JjLmlvX2Jhc2UsIDEpOworCisJcmV0dXJuIGN5Y190b19zY2hlZF9jbG9jaygmY2QsIGN5YywgKHUzMil+MCk7Cit9CisKKy8qIFNldHVwIGZyZWUtcnVubmluZyBjb3VudGVyIGZvciBjbG9ja3NvdXJjZSAqLworc3RhdGljIHZvaWQgX19pbml0IG9tYXAyX2dwX2Nsb2Nrc291cmNlX2luaXQoaW50IGdwdGltZXJfaWQsCisJCQkJCQljb25zdCBjaGFyICpmY2tfc291cmNlKQoreworCWludCByZXM7CisKKwlyZXMgPSBvbWFwX2RtX3RpbWVyX2luaXRfb25lKCZjbGtzcmMsIGdwdGltZXJfaWQsIGZja19zb3VyY2UpOworCUJVR19PTihyZXMpOworCisJcHJfaW5mbygiT01BUCBjbG9ja3NvdXJjZTogR1BUSU1FUiVkIGF0ICVsdSBIelxuIiwKKwkJZ3B0aW1lcl9pZCwgY2xrc3JjLnJhdGUpOworCisJX19vbWFwX2RtX3RpbWVyX2xvYWRfc3RhcnQoY2xrc3JjLmlvX2Jhc2UsIE9NQVBfVElNRVJfQ1RSTF9TVCwgMCwgMSk7CisJaW5pdF9zY2hlZF9jbG9jaygmY2QsIGRtdGltZXJfdXBkYXRlX3NjaGVkX2Nsb2NrLCAzMiwgY2xrc3JjLnJhdGUpOworCisJaWYgKGNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjbG9ja3NvdXJjZV9ncHQsIGNsa3NyYy5yYXRlKSkKKwkJcHJfZXJyKCJDb3VsZCBub3QgcmVnaXN0ZXIgY2xvY2tzb3VyY2UgJXNcbiIsCisJCQljbG9ja3NvdXJjZV9ncHQubmFtZSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBPTUFQX1NZU19USU1FUl9JTklUKG5hbWUsIGNsa2V2X25yLCBjbGtldl9zcmMsCQkJXAorCQkJCWNsa3NyY19uciwgY2xrc3JjX3NyYykJCQlcCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcCMjbmFtZSMjX3RpbWVyX2luaXQodm9pZCkJCQlcCit7CQkJCQkJCQkJXAorCW9tYXAyX2dwX2Nsb2NrZXZlbnRfaW5pdCgoY2xrZXZfbnIpLCBjbGtldl9zcmMpOwkJXAorCW9tYXAyX2dwX2Nsb2Nrc291cmNlX2luaXQoKGNsa3NyY19uciksIGNsa3NyY19zcmMpOwkJXAorfQorCisjZGVmaW5lIE9NQVBfU1lTX1RJTUVSKG5hbWUpCQkJCQkJXAorc3RydWN0IHN5c190aW1lciBvbWFwIyNuYW1lIyNfdGltZXIgPSB7CQkJCQlcCisJLmluaXQJPSBvbWFwIyNuYW1lIyNfdGltZXJfaW5pdCwJCQkJXAorfTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAyCitPTUFQX1NZU19USU1FUl9JTklUKDIsIDEsIE9NQVAyX0NMS0VWX1NPVVJDRSwgMiwgT01BUDJfTVBVX1NPVVJDRSkKK09NQVBfU1lTX1RJTUVSKDIpCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCitPTUFQX1NZU19USU1FUl9JTklUKDMsIDEsIE9NQVAzX0NMS0VWX1NPVVJDRSwgMiwgT01BUDNfTVBVX1NPVVJDRSkKK09NQVBfU1lTX1RJTUVSKDMpCitPTUFQX1NZU19USU1FUl9JTklUKDNfc2VjdXJlLCBPTUFQM19TRUNVUkVfVElNRVIsIE9NQVAzX0NMS0VWX1NPVVJDRSwKKwkJCTIsIE9NQVAzX01QVV9TT1VSQ0UpCitPTUFQX1NZU19USU1FUigzX3NlY3VyZSkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDQKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwNF90aW1lcl9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUworCXR3ZF9iYXNlID0gaW9yZW1hcChPTUFQNDRYWF9MT0NBTF9UV0RfQkFTRSwgU1pfMjU2KTsKKwlCVUdfT04oIXR3ZF9iYXNlKTsKKyNlbmRpZgorCW9tYXAyX2dwX2Nsb2NrZXZlbnRfaW5pdCgxLCBPTUFQNF9DTEtFVl9TT1VSQ0UpOworCW9tYXAyX2dwX2Nsb2Nrc291cmNlX2luaXQoMiwgT01BUDRfTVBVX1NPVVJDRSk7Cit9CitPTUFQX1NZU19USU1FUig0KQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3R3bC1jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdHdsLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYWE0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3R3bC1jb21tb24uYwpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIHR3bC1jb21tb24uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLi4KKyAqIEF1dGhvcjogUGV0ZXIgVWpmYWx1c2kgPHBldGVyLnVqZmFsdXNpQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2ZpeGVkLmg+CisKKyNpbmNsdWRlIDxwbGF0L2kyYy5oPgorI2luY2x1ZGUgPHBsYXQvdXNiLmg+CisKKyNpbmNsdWRlICJ0d2wtY29tbW9uLmgiCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBwbWljX2kyY19ib2FyZF9pbmZvID0geworCS5hZGRyCQk9IDB4NDgsCisJLmZsYWdzCQk9IEkyQ19DTElFTlRfV0FLRSwKK307CisKK3ZvaWQgX19pbml0IG9tYXBfcG1pY19pbml0KGludCBidXMsIHUzMiBjbGtyYXRlLAorCQkJICAgY29uc3QgY2hhciAqcG1pY190eXBlLCBpbnQgcG1pY19pcnEsCisJCQkgICBzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhICpwbWljX2RhdGEpCit7CisJc3RybmNweShwbWljX2kyY19ib2FyZF9pbmZvLnR5cGUsIHBtaWNfdHlwZSwKKwkJc2l6ZW9mKHBtaWNfaTJjX2JvYXJkX2luZm8udHlwZSkpOworCXBtaWNfaTJjX2JvYXJkX2luZm8uaXJxID0gcG1pY19pcnE7CisJcG1pY19pMmNfYm9hcmRfaW5mby5wbGF0Zm9ybV9kYXRhID0gcG1pY19kYXRhOworCisJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKGJ1cywgY2xrcmF0ZSwgJnBtaWNfaTJjX2JvYXJkX2luZm8sIDEpOworfQorCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfdXNiX2RhdGEgb21hcDRfdXNiX3BkYXRhID0geworCS5waHlfaW5pdAk9IG9tYXA0NDMwX3BoeV9pbml0LAorCS5waHlfZXhpdAk9IG9tYXA0NDMwX3BoeV9leGl0LAorCS5waHlfcG93ZXIJPSBvbWFwNDQzMF9waHlfcG93ZXIsCisJLnBoeV9zZXRfY2xvY2sJPSBvbWFwNDQzMF9waHlfc2V0X2NsaywKKwkucGh5X3N1c3BlbmQJPSBvbWFwNDQzMF9waHlfc3VzcGVuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSBvbWFwM191c2JfcGRhdGEgPSB7CisJLnVzYl9tb2RlCT0gVDJfVVNCX01PREVfVUxQSSwKK307CisKK3N0YXRpYyBpbnQgb21hcDNfYmF0dF90YWJsZVtdID0geworLyogMCBDICovCiszMDgwMCwgMjk1MDAsIDI4MzAwLCAyNzEwMCwKKzI2MDAwLCAyNDkwMCwgMjM5MDAsIDIyOTAwLCAyMjAwMCwgMjExMDAsIDIwMzAwLCAxOTQwMCwgMTg3MDAsIDE3OTAwLAorMTcyMDAsIDE2NTAwLCAxNTkwMCwgMTUzMDAsIDE0NzAwLCAxNDEwMCwgMTM2MDAsIDEzMTAwLCAxMjYwMCwgMTIxMDAsCisxMTYwMCwgMTEyMDAsIDEwODAwLCAxMDQwMCwgMTAwMDAsIDk2MzAsICA5MjgwLCAgODk1MCwgIDg2MjAsICA4MzEwLAorODAyMCwgIDc3MzAsICA3NDYwLCAgNzIwMCwgIDY5NTAsICA2NzEwLCAgNjQ3MCwgIDYyNTAsICA2MDQwLCAgNTgzMCwKKzU2NDAsICA1NDUwLCAgNTI2MCwgIDUwOTAsICA0OTIwLCAgNDc2MCwgIDQ2MDAsICA0NDUwLCAgNDMxMCwgIDQxNzAsCis0MDQwLCAgMzkxMCwgIDM3OTAsICAzNjcwLCAgMzU1MAorfTsKKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX2JjaV9wbGF0Zm9ybV9kYXRhIG9tYXAzX2JjaV9wZGF0YSA9IHsKKwkuYmF0dGVyeV90bXBfdGJsCT0gb21hcDNfYmF0dF90YWJsZSwKKwkudGJsc2l6ZQkJPSBBUlJBWV9TSVpFKG9tYXAzX2JhdHRfdGFibGUpLAorfTsKKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX21hZGNfcGxhdGZvcm1fZGF0YSBvbWFwM19tYWRjX3BkYXRhID0geworCS5pcnFfbGluZQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfYXVkaW9fZGF0YSBvbWFwM19hdWRpbzsKKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX2NvZGVjX2RhdGEgb21hcDNfY29kZWNfcGRhdGEgPSB7CisJLmF1ZGlvX21jbGsgPSAyNjAwMDAwMCwKKwkuYXVkaW8gPSAmb21hcDNfYXVkaW8sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNfdmRkYV9kYWNfc3VwcGxpZXNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRhX2RhYyIsICJvbWFwZHNzX3ZlbmMiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBvbWFwM192ZGFjX2lkYXRhID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm1pbl91VgkJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJCT0gMTgwMDAwMCwKKwkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKKwkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAorCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShvbWFwM192ZGRhX2RhY19zdXBwbGllcyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gb21hcDNfdmRkYV9kYWNfc3VwcGxpZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNfdnBsbDJfc3VwcGxpZXNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzIiksCisJUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzc19kc2kxIiksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDNfdnBsbDJfaWRhdGEgPSB7CisJLmNvbnN0cmFpbnRzID0geworCQkubWluX3VWICAgICAgICAgICAgICAgICA9IDE4MDAwMDAsCisJCS5tYXhfdVYgICAgICAgICAgICAgICAgID0gMTgwMDAwMCwKKwkJLnZhbGlkX21vZGVzX21hc2sgICAgICAgPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKKwkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAorCQkudmFsaWRfb3BzX21hc2sgICAgICAgICA9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQorCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwkJPSBBUlJBWV9TSVpFKG9tYXAzX3ZwbGwyX3N1cHBsaWVzKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJCT0gb21hcDNfdnBsbDJfc3VwcGxpZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDRfdmRhY19pZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS5taW5fdVYJCQk9IDE4MDAwMDAsCisJCS5tYXhfdVYJCQk9IDE4MDAwMDAsCisJCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCisJCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKKwkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQorCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDRfdmF1eDJfaWRhdGEgPSB7CisJLmNvbnN0cmFpbnRzID0geworCQkubWluX3VWCQkJPSAxMjAwMDAwLAorCQkubWF4X3VWCQkJPSAyODAwMDAwLAorCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKKwkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKKwkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAorCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBvbWFwNF92YXV4M19pZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS5taW5fdVYJCQk9IDEwMDAwMDAsCisJCS5tYXhfdVYJCQk9IDMwMDAwMDAsCisJCS5hcHBseV91VgkJPSB0cnVlLAorCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAorCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCisJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UKKwkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKKwkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG9tYXA0X3ZtbWNfc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjAiKSwKK307CisKKy8qIFZNTUMxIGZvciBNTUMxIGNhcmQgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBvbWFwNF92bW1jX2lkYXRhID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm1pbl91VgkJCT0gMTIwMDAwMCwKKwkJLm1heF91VgkJCT0gMzAwMDAwMCwKKwkJLmFwcGx5X3VWCQk9IHRydWUsCisJCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCisJCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKKwkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRQorCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQorCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyAgPSBBUlJBWV9TSVpFKG9tYXA0X3ZtbWNfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgICAgICA9IG9tYXA0X3ZtbWNfc3VwcGx5LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXA0X3ZwcF9pZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS5taW5fdVYJCQk9IDE4MDAwMDAsCisJCS5tYXhfdVYJCQk9IDI1MDAwMDAsCisJCS5hcHBseV91VgkJPSB0cnVlLAorCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAorCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCisJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UKKwkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKKwkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXA0X3ZhbmFfaWRhdGEgPSB7CisJLmNvbnN0cmFpbnRzID0geworCQkubWluX3VWCQkJPSAyMTAwMDAwLAorCQkubWF4X3VWCQkJPSAyMTAwMDAwLAorCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAorCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCisJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKKwkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXA0X3ZjeGlvX2lkYXRhID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm1pbl91VgkJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJCT0gMTgwMDAwMCwKKwkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKKwkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAorCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBvbWFwNF92dXNiX2lkYXRhID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm1pbl91VgkJCT0gMzMwMDAwMCwKKwkJLm1heF91VgkJCT0gMzMwMDAwMCwKKwkJLmFwcGx5X3VWCQk9IHRydWUsCisJCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCisJCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKKwkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQorCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDRfY2xrMzJrZ19pZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwl9LAorfTsKKwordm9pZCBfX2luaXQgb21hcDRfcG1pY19nZXRfY29uZmlnKHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgKnBtaWNfZGF0YSwKKwkJCQkgIHUzMiBwZGF0YV9mbGFncywgdTMyIHJlZ3VsYXRvcnNfZmxhZ3MpCit7CisJaWYgKCFwbWljX2RhdGEtPmlycV9iYXNlKQorCQlwbWljX2RhdGEtPmlycV9iYXNlID0gVFdMNjAzMF9JUlFfQkFTRTsKKwlpZiAoIXBtaWNfZGF0YS0+aXJxX2VuZCkKKwkJcG1pY19kYXRhLT5pcnFfZW5kID0gVFdMNjAzMF9JUlFfRU5EOworCisJLyogQ29tbW9uIHBsYXRmb3JtIGRhdGEgY29uZmlndXJhdGlvbnMgKi8KKwlpZiAocGRhdGFfZmxhZ3MgJiBUV0xfQ09NTU9OX1BEQVRBX1VTQiAmJiAhcG1pY19kYXRhLT51c2IpCisJCXBtaWNfZGF0YS0+dXNiID0gJm9tYXA0X3VzYl9wZGF0YTsKKworCS8qIENvbW1vbiByZWd1bGF0b3IgY29uZmlndXJhdGlvbnMgKi8KKwlpZiAocmVndWxhdG9yc19mbGFncyAmIFRXTF9DT01NT05fUkVHVUxBVE9SX1ZEQUMgJiYgIXBtaWNfZGF0YS0+dmRhYykKKwkJcG1pY19kYXRhLT52ZGFjID0gJm9tYXA0X3ZkYWNfaWRhdGE7CisKKwlpZiAocmVndWxhdG9yc19mbGFncyAmIFRXTF9DT01NT05fUkVHVUxBVE9SX1ZBVVgyICYmICFwbWljX2RhdGEtPnZhdXgyKQorCQlwbWljX2RhdGEtPnZhdXgyID0gJm9tYXA0X3ZhdXgyX2lkYXRhOworCisJaWYgKHJlZ3VsYXRvcnNfZmxhZ3MgJiBUV0xfQ09NTU9OX1JFR1VMQVRPUl9WQVVYMyAmJiAhcG1pY19kYXRhLT52YXV4MykKKwkJcG1pY19kYXRhLT52YXV4MyA9ICZvbWFwNF92YXV4M19pZGF0YTsKKworCWlmIChyZWd1bGF0b3JzX2ZsYWdzICYgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVk1NQyAmJiAhcG1pY19kYXRhLT52bW1jKQorCQlwbWljX2RhdGEtPnZtbWMgPSAmb21hcDRfdm1tY19pZGF0YTsKKworCWlmIChyZWd1bGF0b3JzX2ZsYWdzICYgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBQICYmICFwbWljX2RhdGEtPnZwcCkKKwkJcG1pY19kYXRhLT52cHAgPSAmb21hcDRfdnBwX2lkYXRhOworCisJaWYgKHJlZ3VsYXRvcnNfZmxhZ3MgJiBUV0xfQ09NTU9OX1JFR1VMQVRPUl9WQU5BICYmICFwbWljX2RhdGEtPnZhbmEpCisJCXBtaWNfZGF0YS0+dmFuYSA9ICZvbWFwNF92YW5hX2lkYXRhOworCisJaWYgKHJlZ3VsYXRvcnNfZmxhZ3MgJiBUV0xfQ09NTU9OX1JFR1VMQVRPUl9WQ1hJTyAmJiAhcG1pY19kYXRhLT52Y3hpbykKKwkJcG1pY19kYXRhLT52Y3hpbyA9ICZvbWFwNF92Y3hpb19pZGF0YTsKKworCWlmIChyZWd1bGF0b3JzX2ZsYWdzICYgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlVTQiAmJiAhcG1pY19kYXRhLT52dXNiKQorCQlwbWljX2RhdGEtPnZ1c2IgPSAmb21hcDRfdnVzYl9pZGF0YTsKKworCWlmIChyZWd1bGF0b3JzX2ZsYWdzICYgVFdMX0NPTU1PTl9SRUdVTEFUT1JfQ0xLMzJLRyAmJgorCSAgICAhcG1pY19kYXRhLT5jbGszMmtnKQorCQlwbWljX2RhdGEtPmNsazMya2cgPSAmb21hcDRfY2xrMzJrZ19pZGF0YTsKK30KKwordm9pZCBfX2luaXQgb21hcDNfcG1pY19nZXRfY29uZmlnKHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgKnBtaWNfZGF0YSwKKwkJCQkgIHUzMiBwZGF0YV9mbGFncywgdTMyIHJlZ3VsYXRvcnNfZmxhZ3MpCit7CisJaWYgKCFwbWljX2RhdGEtPmlycV9iYXNlKQorCQlwbWljX2RhdGEtPmlycV9iYXNlID0gVFdMNDAzMF9JUlFfQkFTRTsKKwlpZiAoIXBtaWNfZGF0YS0+aXJxX2VuZCkKKwkJcG1pY19kYXRhLT5pcnFfZW5kID0gVFdMNDAzMF9JUlFfRU5EOworCisJLyogQ29tbW9uIHBsYXRmb3JtIGRhdGEgY29uZmlndXJhdGlvbnMgKi8KKwlpZiAocGRhdGFfZmxhZ3MgJiBUV0xfQ09NTU9OX1BEQVRBX1VTQiAmJiAhcG1pY19kYXRhLT51c2IpCisJCXBtaWNfZGF0YS0+dXNiID0gJm9tYXAzX3VzYl9wZGF0YTsKKworCWlmIChwZGF0YV9mbGFncyAmIFRXTF9DT01NT05fUERBVEFfQkNJICYmICFwbWljX2RhdGEtPmJjaSkKKwkJcG1pY19kYXRhLT5iY2kgPSAmb21hcDNfYmNpX3BkYXRhOworCisJaWYgKHBkYXRhX2ZsYWdzICYgVFdMX0NPTU1PTl9QREFUQV9NQURDICYmICFwbWljX2RhdGEtPm1hZGMpCisJCXBtaWNfZGF0YS0+bWFkYyA9ICZvbWFwM19tYWRjX3BkYXRhOworCisJaWYgKHBkYXRhX2ZsYWdzICYgVFdMX0NPTU1PTl9QREFUQV9BVURJTyAmJiAhcG1pY19kYXRhLT5jb2RlYykKKwkJcG1pY19kYXRhLT5jb2RlYyA9ICZvbWFwM19jb2RlY19wZGF0YTsKKworCS8qIENvbW1vbiByZWd1bGF0b3IgY29uZmlndXJhdGlvbnMgKi8KKwlpZiAocmVndWxhdG9yc19mbGFncyAmIFRXTF9DT01NT05fUkVHVUxBVE9SX1ZEQUMgJiYgIXBtaWNfZGF0YS0+dmRhYykKKwkJcG1pY19kYXRhLT52ZGFjID0gJm9tYXAzX3ZkYWNfaWRhdGE7CisKKwlpZiAocmVndWxhdG9yc19mbGFncyAmIFRXTF9DT01NT05fUkVHVUxBVE9SX1ZQTEwyICYmICFwbWljX2RhdGEtPnZwbGwyKQorCQlwbWljX2RhdGEtPnZwbGwyID0gJm9tYXAzX3ZwbGwyX2lkYXRhOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi90d2wtY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL3R3bC1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTgzYTViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi90d2wtY29tbW9uLmgKQEAgLTAsMCArMSw1OSBAQAorI2lmbmRlZiBfX09NQVBfUE1JQ19DT01NT05fXworI2RlZmluZSBfX09NQVBfUE1JQ19DT01NT05fXworCisjZGVmaW5lIFRXTF9DT01NT05fUERBVEFfVVNCCQkoMSA8PCAwKQorI2RlZmluZSBUV0xfQ09NTU9OX1BEQVRBX0JDSQkJKDEgPDwgMSkKKyNkZWZpbmUgVFdMX0NPTU1PTl9QREFUQV9NQURDCQkoMSA8PCAyKQorI2RlZmluZSBUV0xfQ09NTU9OX1BEQVRBX0FVRElPCQkoMSA8PCAzKQorCisvKiBDb21tb24gTERPIHJlZ3VsYXRvcnMgZm9yIFRXTDQwMzAvVFdMNjAzMCAqLworI2RlZmluZSBUV0xfQ09NTU9OX1JFR1VMQVRPUl9WREFDCSgxIDw8IDApCisjZGVmaW5lIFRXTF9DT01NT05fUkVHVUxBVE9SX1ZBVVgxCSgxIDw8IDEpCisjZGVmaW5lIFRXTF9DT01NT05fUkVHVUxBVE9SX1ZBVVgyCSgxIDw8IDIpCisjZGVmaW5lIFRXTF9DT01NT05fUkVHVUxBVE9SX1ZBVVgzCSgxIDw8IDMpCisKKy8qIFRXTDYwMzAgTERPIHJlZ3VsYXRvcnMgKi8KKyNkZWZpbmUgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVk1NQwkoMSA8PCA0KQorI2RlZmluZSBUV0xfQ09NTU9OX1JFR1VMQVRPUl9WUFAJKDEgPDwgNSkKKyNkZWZpbmUgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlVTSU0JKDEgPDwgNikKKyNkZWZpbmUgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVkFOQQkoMSA8PCA3KQorI2RlZmluZSBUV0xfQ09NTU9OX1JFR1VMQVRPUl9WQ1hJTwkoMSA8PCA4KQorI2RlZmluZSBUV0xfQ09NTU9OX1JFR1VMQVRPUl9WVVNCCSgxIDw8IDkpCisjZGVmaW5lIFRXTF9DT01NT05fUkVHVUxBVE9SX0NMSzMyS0cJKDEgPDwgMTApCisKKy8qIFRXTDQwMzAgTERPIHJlZ3VsYXRvcnMgKi8KKyNkZWZpbmUgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBMTDEJKDEgPDwgNCkKKyNkZWZpbmUgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBMTDIJKDEgPDwgNSkKKworCitzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhOworCit2b2lkIG9tYXBfcG1pY19pbml0KGludCBidXMsIHUzMiBjbGtyYXRlLCBjb25zdCBjaGFyICpwbWljX3R5cGUsIGludCBwbWljX2lycSwKKwkJICAgIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgKnBtaWNfZGF0YSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMl9wbWljX2luaXQoY29uc3QgY2hhciAqcG1pY190eXBlLAorCQkJCSAgIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgKnBtaWNfZGF0YSkKK3sKKwlvbWFwX3BtaWNfaW5pdCgyLCAyNjAwLCBwbWljX3R5cGUsIElOVF8yNFhYX1NZU19OSVJRLCBwbWljX2RhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcDNfcG1pY19pbml0KGNvbnN0IGNoYXIgKnBtaWNfdHlwZSwKKwkJCQkgICBzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhICpwbWljX2RhdGEpCit7CisJb21hcF9wbWljX2luaXQoMSwgMjYwMCwgcG1pY190eXBlLCBJTlRfMzRYWF9TWVNfTklSUSwgcG1pY19kYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9tYXA0X3BtaWNfaW5pdChjb25zdCBjaGFyICpwbWljX3R5cGUsCisJCQkJICAgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSAqcG1pY19kYXRhKQoreworCS8qIFBob2VuaXggQXVkaW8gSUMgbmVlZHMgSTJDMSB0byBzdGFydCB3aXRoIDQwMCBLSHogb3IgbGVzcyAqLworCW9tYXBfcG1pY19pbml0KDEsIDQwMCwgcG1pY190eXBlLCBPTUFQNDRYWF9JUlFfU1lTXzFOLCBwbWljX2RhdGEpOworfQorCit2b2lkIG9tYXAzX3BtaWNfZ2V0X2NvbmZpZyhzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhICpwbWljX2RhdGEsCisJCQkgICB1MzIgcGRhdGFfZmxhZ3MsIHUzMiByZWd1bGF0b3JzX2ZsYWdzKTsKKwordm9pZCBvbWFwNF9wbWljX2dldF9jb25maWcoc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSAqcG1pY19kYXRhLAorCQkJICAgdTMyIHBkYXRhX2ZsYWdzLCB1MzIgcmVndWxhdG9yc19mbGFncyk7CisKKyNlbmRpZiAvKiBfX09NQVBfUE1JQ19DT01NT05fXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi91c2ItbXVzYi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi91c2ItbXVzYi5jCmluZGV4IGM3ZWQ1NDAuLmE2NTE0NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdXNiLW11c2IuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3VzYi1tdXNiLmMKQEAgLTMzLDggKzMzLDYgQEAKICNpbmNsdWRlIDxwbGF0L29tYXBfZGV2aWNlLmg+CiAjaW5jbHVkZSAibXV4LmgiCiAKLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9PTUFQMlBMVVMpIHx8IGRlZmluZWQgKENPTkZJR19VU0JfTVVTQl9BTTM1WCkKLQogc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfY29uZmlnIG11c2JfY29uZmlnID0gewogCS5tdWx0aXBvaW50CT0gMSwKIAkuZHluX2ZpZm8JPSAxLApAQCAtMTc1LDExICsxNzMsMyBAQAogCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkKIAkJb21hcDQ0MzBfcGh5X2luaXQoZGV2KTsKIH0KLQotI2Vsc2UKLXZvaWQgX19pbml0IHVzYl9tdXNiX2luaXQoc3RydWN0IG9tYXBfbXVzYl9ib2FyZF9kYXRhICpib2FyZF9kYXRhKQotewotCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkKLQkJb21hcDQ0MzBfcGh5X2luaXQoTlVMTCk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1VTQl9NVVNCX1NPQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21wcC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21wcC5jCmluZGV4IGYxMmM0MWIuLmI2ZGRkN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tcHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXBwLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogCW9yaW9uNXhfcGNpZV9pZCgmZGV2LCAmcmV2KTsKIAotCWlmIChkZXYgPT0gTVY4OEY1MTgxX0RFVl9JRCAmJiByZXYgPj0gTVY4OEY1MTgxTF9SRVZfQTApCisJaWYgKGRldiA9PSBNVjg4RjUxODFfREVWX0lEKQogCQlyZXR1cm4gTVBQX0Y1MTgxX01BU0s7CiAKIAlpZiAoZGV2ID09IE1WODhGNTE4Ml9ERVZfSUQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKaW5kZXggODAwMzAzNy4uZGI3ZWVlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtMTIwLDggKzEyMCwzIEBACiAxMDAzOgogCQkuZW5kbQogCi0KLQkJLm1hY3JvCWlycV9wcmlvX3RhYmxlCi0JCS5lbmRtCi0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC5jCmluZGV4IGExMDk5NjcuLmJjNTVkMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHguYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LmMKQEAgLTUxOCw0ICs1MTgsNyBAQAogCS5pbml0X2lycQk9IGNteDJ4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJnB4YV90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gY214Mnh4X2luaXQsCisjaWZkZWYgQ09ORklHX1BDSQorCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLAorI2VuZGlmCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDMwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDMwMC5jCmluZGV4IGIyMjQ4ZTcuLmIxOTk1OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgzMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14MzAwLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2RlZmluZSBwcl9mbXQoZm10KSAiJXM6ICIgZm10LCBfX2Z1bmNfXwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xNjEsMTAgKzE2MiwxMCBAQAogCUdQSU85OV9HUElPLAkJCS8qIEV0aGVybmV0IElSUSAqLwogCiAJLyogUlRDIEdQSU9zICovCi0JR1BJTzk1X0dQSU8sCQkJLyogUlRDIENTICovCi0JR1BJTzk2X0dQSU8sCQkJLyogUlRDIFdSICovCi0JR1BJTzk3X0dQSU8sCQkJLyogUlRDIFJEICovCi0JR1BJTzk4X0dQSU8sCQkJLyogUlRDIElPICovCisJR1BJTzk1X0dQSU8gfCBNRlBfTFBNX0RSSVZFX0hJR0gsCS8qIFJUQyBDUyAqLworCUdQSU85Nl9HUElPIHwgTUZQX0xQTV9EUklWRV9ISUdILAkvKiBSVEMgV1IgKi8KKwlHUElPOTdfR1BJTyB8IE1GUF9MUE1fRFJJVkVfSElHSCwJLyogUlRDIFJEICovCisJR1BJTzk4X0dQSU8sCQkJCS8qIFJUQyBJTyAqLwogCiAJLyogU3RhbmRhcmQgSTJDICovCiAJR1BJTzIxX0kyQ19TQ0wsCkBAIC00ODQsMTQgKzQ4NSwxMyBAQAogCWludCBlcnI7CiAKIAkvKiByZXNldCB0aGUgUEhZICovCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fVUxQSV9QSFlfUlNULCAidWxwaSByZXNldCIpOworCWVyciA9IGdwaW9fcmVxdWVzdF9vbmUoR1BJT19VTFBJX1BIWV9SU1QsIEdQSU9GX09VVF9JTklUX0xPVywKKwkJCSAgICAgICAidWxwaSByZXNldCIpOwogCWlmIChlcnIpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlcXVlc3QgVUxQSSByZXNldCBHUElPOiAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBlcnIpOworCQlwcl9lcnIoImZhaWxlZCB0byByZXF1ZXN0IFVMUEkgcmVzZXQgR1BJTzogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fVUxQSV9QSFlfUlNULCAwKTsKIAltc2xlZXAoMTApOwogCWdwaW9fc2V0X3ZhbHVlKEdQSU9fVUxQSV9QSFlfUlNULCAxKTsKIAltc2xlZXAoMTApOwpAQCAtNTEwLDggKzUxMCw3IEBACiAJCXBvdXRfY2xrID0gY2xrX2dldChOVUxMLCAiQ0xLX1BPVVQiKTsKIAkJaWYgKElTX0VSUihwb3V0X2NsaykpIHsKIAkJCWVyciA9IFBUUl9FUlIocG91dF9jbGspOwotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBDTEtfUE9VVDogJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGVycik7CisJCQlwcl9lcnIoImZhaWxlZCB0byBnZXQgQ0xLX1BPVVQ6ICVkXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQljbGtfZW5hYmxlKHBvdXRfY2xrKTsKQEAgLTc2OCwzOSArNzY3LDM2IEBACiAJaXJxX3NldF9pcnFfd2FrZShJUlFfV0FLRVVQMCwgMSk7CiB9CiAKKy8qIHdpMndpIGdwaW8gc2V0dGluZyBmb3Igc3lzdGVtX3JldiA+PSAxMzAgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3BpbyBjbV94MzAwX3dpMndpX2dwaW9zW10gX19pbml0ZGF0YSA9IHsKKwl7IDcxLCBHUElPRl9PVVRfSU5JVF9ISUdILCAid2xhbiBlbiIgfSwKKwl7IDcwLCBHUElPRl9PVVRfSU5JVF9ISUdILCAiYnQgcmVzZXQiIH0sCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgY21feDMwMF9pbml0X3dpMndpKHZvaWQpCiB7CiAJaW50IGJ0X3Jlc2V0LCB3bGFuX2VuOwogCWludCBlcnI7CiAKIAlpZiAoc3lzdGVtX3JldiA8IDEzMCkgewotCQl3bGFuX2VuID0gNzc7Ci0JCWJ0X3Jlc2V0ID0gNzg7Ci0JfSBlbHNlIHsKLQkJd2xhbl9lbiA9IDcxOwotCQlidF9yZXNldCA9IDcwOworCQljbV94MzAwX3dpMndpX2dwaW9zWzBdLmdwaW8gPSA3NzsJLyogd2xhbiBlbiAqLworCQljbV94MzAwX3dpMndpX2dwaW9zWzFdLmdwaW8gPSA3ODsJLyogYnQgcmVzZXQgKi8KIAl9CiAKIAkvKiBMaWJlcnRhcyBhbmQgQ1NSIHJlc2V0ICovCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KHdsYW5fZW4sICJ3bGFuIGVuIik7CisJZXJyID0gZ3Bpb19yZXF1ZXN0X2FycmF5KEFSUkFZX0FORF9TSVpFKGNtX3gzMDBfd2kyd2lfZ3Bpb3MpKTsKIAlpZiAoZXJyKSB7Ci0JCXByX2VycigiQ00tWDMwMDogZmFpbGVkIHRvIHJlcXVlc3Qgd2xhbiBlbiBncGlvOiAlZFxuIiwgZXJyKTsKLQl9IGVsc2UgewotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQod2xhbl9lbiwgMSk7Ci0JCWdwaW9fZnJlZSh3bGFuX2VuKTsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVxdWVzdCB3aWZpL2J0IGdwaW9zOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuOwogCX0KIAotCWVyciA9IGdwaW9fcmVxdWVzdChidF9yZXNldCwgImJ0IHJlc2V0Iik7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoIkNNLVgzMDA6IGZhaWxlZCB0byByZXF1ZXN0IGJ0IHJlc2V0IGdwaW86ICVkXG4iLCBlcnIpOwotCX0gZWxzZSB7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChidF9yZXNldCwgMSk7Ci0JCXVkZWxheSgxMCk7Ci0JCWdwaW9fc2V0X3ZhbHVlKGJ0X3Jlc2V0LCAwKTsKLQkJdWRlbGF5KDEwKTsKLQkJZ3Bpb19zZXRfdmFsdWUoYnRfcmVzZXQsIDEpOwotCQlncGlvX2ZyZWUoYnRfcmVzZXQpOwotCX0KKwl1ZGVsYXkoMTApOworCWdwaW9fc2V0X3ZhbHVlKGJ0X3Jlc2V0LCAwKTsKKwl1ZGVsYXkoMTApOworCWdwaW9fc2V0X3ZhbHVlKGJ0X3Jlc2V0LCAxKTsKKworCWdwaW9fZnJlZSh3bGFuX2VuKTsKKwlncGlvX2ZyZWUoYnRfcmVzZXQpOwogfQogCiAvKiBNRlAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2h4NDcwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaHg0NzAwLmMKaW5kZXggZjk0MWE0OS4uOTk5NjBhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaHg0NzAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaHg0NzAwLmMKQEAgLTEzNSw0MiArMTM1LDYgQEAKIAlHUElPNjZfR1BJTywJLyogblNESU9fSVJRICovCiB9OwogCi0jZGVmaW5lIEhYNDcwMF9HUElPX0lOKG51bSwgX2Rlc2MpIFwKLQl7IC5ncGlvID0gKG51bSksIC5kaXIgPSAwLCAuZGVzYyA9IChfZGVzYykgfQotI2RlZmluZSBIWDQ3MDBfR1BJT19PVVQobnVtLCBfaW5pdCwgX2Rlc2MpIFwKLQl7IC5ncGlvID0gKG51bSksIC5kaXIgPSAxLCAuaW5pdCA9IChfaW5pdCksIC5kZXNjID0gKF9kZXNjKSB9Ci1zdHJ1Y3QgZ3Bpb19yZXNzIHsKLQl1bnNpZ25lZCBncGlvIDogODsKLQl1bnNpZ25lZCBkaXIgOiAxOwotCXVuc2lnbmVkIGluaXQgOiAxOwotCWNoYXIgKmRlc2M7Ci19OwotCi1zdGF0aWMgaW50IGh4NDcwMF9ncGlvX3JlcXVlc3Qoc3RydWN0IGdwaW9fcmVzcyAqZ3Bpb3MsIGludCBzaXplKQotewotCWludCBpLCByYyA9IDA7Ci0JaW50IGdwaW87Ci0JaW50IGRpcjsKLQotCWZvciAoaSA9IDA7ICghcmMpICYmIChpIDwgc2l6ZSk7IGkrKykgewotCQlncGlvID0gZ3Bpb3NbaV0uZ3BpbzsKLQkJZGlyID0gZ3Bpb3NbaV0uZGlyOwotCQlyYyA9IGdwaW9fcmVxdWVzdChncGlvLCBncGlvc1tpXS5kZXNjKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIkVycm9yIHJlcXVlc3RpbmcgR1BJTyAlZCglcykgOiAlZFxuIiwKLQkJCSAgICAgICBncGlvLCBncGlvc1tpXS5kZXNjLCByYyk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoZGlyKQotCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIGdwaW9zW2ldLmluaXQpOwotCQllbHNlCi0JCQlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKLQl9Ci0Jd2hpbGUgKChyYykgJiYgKC0taSA+PSAwKSkKLQkJZ3Bpb19mcmVlKGdwaW9zW2ldLmdwaW8pOwotCXJldHVybiByYzsKLX0KLQogLyoKICAqIElSREEKICAqLwpAQCAtODI5LDI2ICs3OTMsMzAgQEAKIAkmcGNtY2lhLAogfTsKIAotc3RhdGljIHN0cnVjdCBncGlvX3Jlc3MgZ2xvYmFsX2dwaW9zW10gPSB7Ci0JSFg0NzAwX0dQSU9fSU4oR1BJTzEyX0hYNDcwMF9BU0lDM19JUlEsICJBU0lDM19JUlEiKSwKLQlIWDQ3MDBfR1BJT19JTihHUElPMTNfSFg0NzAwX1czMjIwX0lSUSwgIlczMjIwX0lSUSIpLAotCUhYNDcwMF9HUElPX0lOKEdQSU8xNF9IWDQ3MDBfbldMQU5fSVJRLCAiV0xBTl9JUlEiKSwKLQlIWDQ3MDBfR1BJT19PVVQoR1BJTzU5X0hYNDcwMF9MQ0RfUEMxLCAgICAgICAgICAxLCAiTENEX1BDMSIpLAotCUhYNDcwMF9HUElPX09VVChHUElPNjJfSFg0NzAwX0xDRF9uUkVTRVQsICAgICAgIDEsICJMQ0RfUkVTRVQiKSwKLQlIWDQ3MDBfR1BJT19PVVQoR1BJTzcwX0hYNDcwMF9MQ0RfU0xJTjEsICAgICAgICAxLCAiTENEX1NMSU4xIiksCi0JSFg0NzAwX0dQSU9fT1VUKEdQSU84NF9IWDQ3MDBfTENEX1NRTiwgICAgICAgICAgMSwgIkxDRF9TUU4iKSwKLQlIWDQ3MDBfR1BJT19PVVQoR1BJTzExMF9IWDQ3MDBfTENEX0xWRERfM1YzX09OLCAxLCAiTENEX0xWREQiKSwKLQlIWDQ3MDBfR1BJT19PVVQoR1BJTzExMV9IWDQ3MDBfTENEX0FWRERfM1YzX09OLCAxLCAiTENEX0FWREQiKSwKLQlIWDQ3MDBfR1BJT19PVVQoR1BJTzMyX0hYNDcwMF9SUzIzMl9PTiwgICAgICAgICAxLCAiUlMyMzJfT04iKSwKLQlIWDQ3MDBfR1BJT19PVVQoR1BJTzcxX0hYNDcwMF9BU0lDM19uUkVTRVQsICAgICAxLCAiQVNJQzNfblJFU0VUIiksCi0JSFg0NzAwX0dQSU9fT1VUKEdQSU84Ml9IWDQ3MDBfRVVBUlRfUkVTRVQsICAgICAgMSwgIkVVQVJUX1JFU0VUIiksCi0JSFg0NzAwX0dQSU9fT1VUKEdQSU8xMDVfSFg0NzAwX25JUl9PTiwgICAgICAgICAgMSwgIm5JUl9FTiIpLAorc3RhdGljIHN0cnVjdCBncGlvIGdsb2JhbF9ncGlvc1tdID0geworCXsgR1BJTzEyX0hYNDcwMF9BU0lDM19JUlEsIEdQSU9GX0lOLCAiQVNJQzNfSVJRIiB9LAorCXsgR1BJTzEzX0hYNDcwMF9XMzIyMF9JUlEsIEdQSU9GX0lOLCAiVzMyMjBfSVJRIiB9LAorCXsgR1BJTzE0X0hYNDcwMF9uV0xBTl9JUlEsIEdQSU9GX0lOLCAiV0xBTl9JUlEiIH0sCisJeyBHUElPNTlfSFg0NzAwX0xDRF9QQzEsICAgICAgICAgIEdQSU9GX09VVF9JTklUX0hJR0gsICJMQ0RfUEMxIiB9LAorCXsgR1BJTzYyX0hYNDcwMF9MQ0RfblJFU0VULCAgICAgICBHUElPRl9PVVRfSU5JVF9ISUdILCAiTENEX1JFU0VUIiB9LAorCXsgR1BJTzcwX0hYNDcwMF9MQ0RfU0xJTjEsICAgICAgICBHUElPRl9PVVRfSU5JVF9ISUdILCAiTENEX1NMSU4xIiB9LAorCXsgR1BJTzg0X0hYNDcwMF9MQ0RfU1FOLCAgICAgICAgICBHUElPRl9PVVRfSU5JVF9ISUdILCAiTENEX1NRTiIgfSwKKwl7IEdQSU8xMTBfSFg0NzAwX0xDRF9MVkREXzNWM19PTiwgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIkxDRF9MVkREIiB9LAorCXsgR1BJTzExMV9IWDQ3MDBfTENEX0FWRERfM1YzX09OLCBHUElPRl9PVVRfSU5JVF9ISUdILCAiTENEX0FWREQiIH0sCisJeyBHUElPMzJfSFg0NzAwX1JTMjMyX09OLCAgICAgICAgIEdQSU9GX09VVF9JTklUX0hJR0gsICJSUzIzMl9PTiIgfSwKKwl7IEdQSU83MV9IWDQ3MDBfQVNJQzNfblJFU0VULCAgICAgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIkFTSUMzX25SRVNFVCIgfSwKKwl7IEdQSU84Ml9IWDQ3MDBfRVVBUlRfUkVTRVQsICAgICAgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIkVVQVJUX1JFU0VUIiB9LAorCXsgR1BJTzEwNV9IWDQ3MDBfbklSX09OLCAgICAgICAgICBHUElPRl9PVVRfSU5JVF9ISUdILCAibklSX0VOIiB9LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGh4NDcwMF9pbml0KHZvaWQpCiB7CisJaW50IHJldDsKKwogCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGh4NDcwMF9waW5fY29uZmlnKSk7Ci0JaHg0NzAwX2dwaW9fcmVxdWVzdChBUlJBWV9BTkRfU0laRShnbG9iYWxfZ3Bpb3MpKTsKKwlyZXQgPSBncGlvX3JlcXVlc3RfYXJyYXkoQVJSQVlfQU5EX1NJWkUoZ2xvYmFsX2dwaW9zKSk7CisJaWYgKHJldCkKKwkJcHJfZXJyICgiaHg0NzAwOiBGYWlsZWQgdG8gcmVxdWVzdCBHUElPcy5cbiIpOwogCiAJcHhhX3NldF9mZnVhcnRfaW5mbyhOVUxMKTsKIAlweGFfc2V0X2J0dWFydF9pbmZvKE5VTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2NvcmdpLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvY29yZ2kuaAppbmRleCAwMDExMDU1Li41ZGZkMTE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvY29yZ2kuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvY29yZ2kuaApAQCAtMzQsNyArMzQsNyBAQAogI2RlZmluZSBDT1JHSV9HUElPX0xDRENPTl9DUwkJKDE5KSAvKiBMQ0QgQ29udHJvbCBDaGlwIFNlbGVjdCAqLwogI2RlZmluZSBDT1JHSV9HUElPX01BWDExMTFfQ1MJCSgyMCkgLyogTUFYMTExMSBDaGlwIFNlbGVjdCAqLwogI2RlZmluZSBDT1JHSV9HUElPX0FEQ19URU1QX09OCQkoMjEpIC8qIFNlbGVjdCBiYXR0ZXJ5IHZvbHRhZ2Ugb3IgdGVtcGVyYXR1cmUgKi8KLSNkZWZpbmUgQ09SR0lfR1BJT19JUl9PTgkJCSgyMikgLyogRW5hYmxlIElSIFRyYW5zY2lldmVyICovCisjZGVmaW5lIENPUkdJX0dQSU9fSVJfT04JCQkoMjIpIC8qIEVuYWJsZSBJUiBUcmFuc2NlaXZlciAqLwogI2RlZmluZSBDT1JHSV9HUElPX0FEUzc4NDZfQ1MJCSgyNCkgLyogQURTNzg0NiBDaGlwIFNlbGVjdCAqLwogI2RlZmluZSBDT1JHSV9HUElPX1NEX1BXUgkJCSgzMykgLyogTU1DL1NEIFBvd2VyICovCiAjZGVmaW5lIENPUkdJX0dQSU9fQ0hSR19PTgkJCSgzOCkgLyogRW5hYmxlIGJhdHRlcnkgQ2hhcmdpbmcgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tYWdpY2lhbi5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21hZ2ljaWFuLmgKaW5kZXggMGEyZWZjZi4uN2NiZmM1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21hZ2ljaWFuLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21hZ2ljaWFuLmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpZm5kZWYgX01BR0lDSUFOX0hfCiAjZGVmaW5lIF9NQUdJQ0lBTl9IXwogCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiAvKgpAQCAtNzcsNyArNzgsNyBAQAogICogQ1BMRCBFR1BJT3MKICAqLwogCi0jZGVmaW5lIE1BR0lDSUFOX0VHUElPX0JBU0UJCQkweDgwIC8qIEdQSU9fQk9BUkRfU1RBUlQgKi8KKyNkZWZpbmUgTUFHSUNJQU5fRUdQSU9fQkFTRQkJCU5SX0JVSUxUSU5fR1BJTwogI2RlZmluZSBNQUdJQ0lBTl9FR1BJTyhyZWcsYml0KSBcCiAJKE1BR0lDSUFOX0VHUElPX0JBU0UgKyA4KnJlZyArIGJpdCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IDA3NzM0ZjMuLmQwNWE1OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTE3LDggKzE3LDQgQEAKICAqLwogI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4YTAwMDAwMDApCiAKLSNpZiBkZWZpbmVkKENPTkZJR19NQUNIX0FSTUNPUkUpICYmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgQVJNX0RNQV9aT05FX1NJWkUJU1pfNjRNCi0jZW5kaWYKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcG0uaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wbS5oCmluZGV4IGYxNWFmZTAuLjUxNTU4YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wbS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wbS5oCkBAIC0yMiw4ICsyMiw4IEBACiBleHRlcm4gc3RydWN0IHB4YV9jcHVfcG1fZm5zICpweGFfY3B1X3BtX2ZuczsKIAogLyogc2xlZXAuUyAqLwotZXh0ZXJuIHZvaWQgcHhhMjV4X2NwdV9zdXNwZW5kKHVuc2lnbmVkIGludCwgbG9uZyk7Ci1leHRlcm4gdm9pZCBweGEyN3hfY3B1X3N1c3BlbmQodW5zaWduZWQgaW50LCBsb25nKTsKK2V4dGVybiBpbnQgcHhhMjV4X2ZpbmlzaF9zdXNwZW5kKHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIGludCBweGEyN3hfZmluaXNoX3N1c3BlbmQodW5zaWduZWQgbG9uZyk7CiAKIGV4dGVybiBpbnQgcHhhX3BtX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSk7CiBleHRlcm4gaW50IHB4YV9wbV9wcmVwYXJlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTI3eC11ZGMuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyN3gtdWRjLmgKaW5kZXggYWIxNDQzZi4uNGNmMjhmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTI3eC11ZGMuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhMjd4LXVkYy5oCkBAIC01Niw5ICs1Niw5IEBACiAjZGVmaW5lIFVEQ0ZOUiAgICAgICAgICBfX1JFRygweDQwNjAwMDE0KSAvKiBVREMgRnJhbWUgTnVtYmVyIFJlZ2lzdGVyICovCiAjZGVmaW5lIFVEQ09UR0lDUglfX1JFRygweDQwNjAwMDE4KSAvKiBVREMgT24tVGhlLUdvIGludGVycnVwdCBjb250cm9sICovCiAjZGVmaW5lIFVEQ09UR0lDUl9JRVNGCSgxIDw8IDI0KQkvKiBPVEcgU0VUX0ZFQVRVUkUgY29tbWFuZCByZWN2ZCAqLwotI2RlZmluZSBVRENPVEdJQ1JfSUVYUgkoMSA8PCAxNykJLyogRXh0cmEgVHJhbnNjaWV2ZXIgSW50ZXJydXB0CisjZGVmaW5lIFVEQ09UR0lDUl9JRVhSCSgxIDw8IDE3KQkvKiBFeHRyYSBUcmFuc2NlaXZlciBJbnRlcnJ1cHQKIAkJCQkJICAgUmlzaW5nIEVkZ2UgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBVRENPVEdJQ1JfSUVYRgkoMSA8PCAxNikJLyogRXh0cmEgVHJhbnNjaWV2ZXIgSW50ZXJydXB0CisjZGVmaW5lIFVEQ09UR0lDUl9JRVhGCSgxIDw8IDE2KQkvKiBFeHRyYSBUcmFuc2NlaXZlciBJbnRlcnJ1cHQKIAkJCQkJICAgRmFsbGluZyBFZGdlIEludGVycnVwdCBFbmFibGUgKi8KICNkZWZpbmUgVURDT1RHSUNSX0lFVlY0MFIgKDEgPDwgOSkJLyogT1RHIFZidXMgVmFsaWQgNC4wViBSaXNpbmcgRWRnZQogCQkJCQkgICBJbnRlcnJ1cHQgRW5hYmxlICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFnaWNpYW4uYwppbmRleCBlMTkyMDU3Li4wZTQyNzk4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMKQEAgLTM0NCwyMiArMzQ0LDE0IEBACiAgKiBCYWNrbGlnaHQKICAqLwogCitzdGF0aWMgc3RydWN0IGdwaW8gbWFnaWNpYW5fYmxfZ3Bpb3NbXSA9IHsKKwl7IEVHUElPX01BR0lDSUFOX0JMX1BPV0VSLCAgR1BJT0ZfRElSX09VVCwgIkJhY2tsaWdodCBwb3dlciIgfSwKKwl7IEVHUElPX01BR0lDSUFOX0JMX1BPV0VSMiwgR1BJT0ZfRElSX09VVCwgIkJhY2tsaWdodCBwb3dlciAyIiB9LAorfTsKKwogc3RhdGljIGludCBtYWdpY2lhbl9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IGdwaW9fcmVxdWVzdChFR1BJT19NQUdJQ0lBTl9CTF9QT1dFUiwgIkJMX1BPV0VSIik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0JcmV0ID0gZ3Bpb19yZXF1ZXN0KEVHUElPX01BR0lDSUFOX0JMX1BPV0VSMiwgIkJMX1BPV0VSMiIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyMjsKLQlyZXR1cm4gMDsKLQotZXJyMjoKLQlncGlvX2ZyZWUoRUdQSU9fTUFHSUNJQU5fQkxfUE9XRVIpOwotZXJyOgotCXJldHVybiByZXQ7CisJcmV0dXJuIGdwaW9fcmVxdWVzdF9hcnJheShBUlJBWV9BTkRfU0laRShtYWdpY2lhbl9ibF9ncGlvcykpOwogfQogCiBzdGF0aWMgaW50IG1hZ2ljaWFuX2JhY2tsaWdodF9ub3RpZnkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgYnJpZ2h0bmVzcykKQEAgLTM3Niw4ICszNjgsNyBAQAogCiBzdGF0aWMgdm9pZCBtYWdpY2lhbl9iYWNrbGlnaHRfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JZ3Bpb19mcmVlKEVHUElPX01BR0lDSUFOX0JMX1BPV0VSKTsKLQlncGlvX2ZyZWUoRUdQSU9fTUFHSUNJQU5fQkxfUE9XRVIyKTsKKwlncGlvX2ZyZWVfYXJyYXkoQVJSQVlfQU5EX1NJWkUobWFnaWNpYW5fYmxfZ3Bpb3MpKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEgYmFja2xpZ2h0X2RhdGEgPSB7CkBAIC03MTIsMTYgKzcwMywyNSBAQAogCSZsZWRzX2dwaW8sCiB9OwogCitzdGF0aWMgc3RydWN0IGdwaW8gbWFnaWNpYW5fZ2xvYmFsX2dwaW9zW10gPSB7CisJeyBHUElPMTNfTUFHSUNJQU5fQ1BMRF9JUlEsICAgR1BJT0ZfSU4sICJDUExEX0lSUSIgfSwKKwl7IEdQSU8xMDdfTUFHSUNJQU5fRFMxV01fSVJRLCBHUElPRl9JTiwgIkRTMVdNX0lSUSIgfSwKKwl7IEdQSU8xMDRfTUFHSUNJQU5fTENEX1BPV0VSXzEsIEdQSU9GX09VVF9JTklUX0xPVywgIkxDRCBwb3dlciAxIiB9LAorCXsgR1BJTzEwNV9NQUdJQ0lBTl9MQ0RfUE9XRVJfMiwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiTENEIHBvd2VyIDIiIH0sCisJeyBHUElPMTA2X01BR0lDSUFOX0xDRF9QT1dFUl8zLCBHUElPRl9PVVRfSU5JVF9MT1csICJMQ0QgcG93ZXIgMyIgfSwKKwl7IEdQSU84M19NQUdJQ0lBTl9uSVJfRU4sIEdQSU9GX09VVF9JTklUX0hJR0gsICJuSVJfRU4iIH0sCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgbWFnaWNpYW5faW5pdCh2b2lkKQogewogCXZvaWQgX19pb21lbSAqY3BsZDsKIAlpbnQgbGNkX3NlbGVjdDsKIAlpbnQgZXJyOwogCi0JZ3Bpb19yZXF1ZXN0KEdQSU8xM19NQUdJQ0lBTl9DUExEX0lSUSwgIkNQTERfSVJRIik7Ci0JZ3Bpb19yZXF1ZXN0KEdQSU8xMDdfTUFHSUNJQU5fRFMxV01fSVJRLCAiRFMxV01fSVJRIik7Ci0KIAlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShtYWdpY2lhbl9waW5fY29uZmlnKSk7CisJZXJyID0gZ3Bpb19yZXF1ZXN0X2FycmF5KEFSUkFZX0FORF9TSVpFKG1hZ2ljaWFuX2dsb2JhbF9ncGlvcykpOworCWlmIChlcnIpCisJCXByX2VycigibWFnaWNpYW46IEZhaWxlZCB0byByZXF1ZXN0IEdQSU9zOiAlZFxuIiwgZXJyKTsKIAogCXB4YV9zZXRfZmZ1YXJ0X2luZm8oTlVMTCk7CiAJcHhhX3NldF9idHVhcnRfaW5mbyhOVUxMKTsKQEAgLTcyOSwxMSArNzI5LDcgQEAKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKEFSUkFZX0FORF9TSVpFKGRldmljZXMpKTsKIAotCWVyciA9IGdwaW9fcmVxdWVzdChHUElPODNfTUFHSUNJQU5fbklSX0VOLCAibklSX0VOIik7Ci0JaWYgKCFlcnIpIHsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU84M19NQUdJQ0lBTl9uSVJfRU4sIDEpOwotCQlweGFfc2V0X2ZpY3BfaW5mbygmbWFnaWNpYW5fZmljcF9pbmZvKTsKLQl9CisJcHhhX3NldF9maWNwX2luZm8oJm1hZ2ljaWFuX2ZpY3BfaW5mbyk7CiAJcHhhMjd4X3NldF9pMmNfcG93ZXJfaW5mbyhOVUxMKTsKIAlweGFfc2V0X2kyY19pbmZvKCZpMmNfaW5mbyk7CiAJcHhhX3NldF9tY2lfaW5mbygmbWFnaWNpYW5fbWNpX2luZm8pOwpAQCAtNzQ3LDE2ICs3NDMsOSBAQAogCQlzeXN0ZW1fcmV2ID0gYm9hcmRfaWQgJiAweDc7CiAJCWxjZF9zZWxlY3QgPSBib2FyZF9pZCAmIDB4ODsKIAkJcHJfaW5mbygiTENEIHR5cGU6ICVzXG4iLCBsY2Rfc2VsZWN0ID8gIlNhbXN1bmciIDogIlRvcHBvbHkiKTsKLQkJaWYgKGxjZF9zZWxlY3QgJiYgKHN5c3RlbV9yZXYgPCAzKSkgewotCQkJZ3Bpb19yZXF1ZXN0KEdQSU83NV9NQUdJQ0lBTl9TQU1TVU5HX1BPV0VSLCAiU0FNU1VOR19QT1dFUiIpOwotCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU83NV9NQUdJQ0lBTl9TQU1TVU5HX1BPV0VSLCAwKTsKLQkJfQotCQlncGlvX3JlcXVlc3QoR1BJTzEwNF9NQUdJQ0lBTl9MQ0RfUE9XRVJfMSwgIkxDRF9QT1dFUl8xIik7Ci0JCWdwaW9fcmVxdWVzdChHUElPMTA1X01BR0lDSUFOX0xDRF9QT1dFUl8yLCAiTENEX1BPV0VSXzIiKTsKLQkJZ3Bpb19yZXF1ZXN0KEdQSU8xMDZfTUFHSUNJQU5fTENEX1BPV0VSXzMsICJMQ0RfUE9XRVJfMyIpOwotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJTzEwNF9NQUdJQ0lBTl9MQ0RfUE9XRVJfMSwgMCk7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPMTA1X01BR0lDSUFOX0xDRF9QT1dFUl8yLCAwKTsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU8xMDZfTUFHSUNJQU5fTENEX1BPV0VSXzMsIDApOworCQlpZiAobGNkX3NlbGVjdCAmJiAoc3lzdGVtX3JldiA8IDMpKQorCQkJZ3Bpb19yZXF1ZXN0X29uZShHUElPNzVfTUFHSUNJQU5fU0FNU1VOR19QT1dFUiwKKwkJCSAgICAgICAgICAgICAgICAgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiU0FNU1VOR19QT1dFUiIpOwogCQlweGFfc2V0X2ZiX2luZm8oTlVMTCwgbGNkX3NlbGVjdCA/ICZzYW1zdW5nX2luZm8gOiAmdG9wcG9seV9pbmZvKTsKIAl9IGVsc2UKIAkJcHJfZXJyKCJMQ0QgZGV0ZWN0aW9uOiBDUExEIG1hcHBpbmcgZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYwppbmRleCA4N2FlMzEyLi5iMjc1NDRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhMnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jCkBAIC0zNDcsOSArMzQ3LDkgQEAKIAkJaWYgKChncGlvX2Rlc2NbaV0uY29uZmlnICYgTUZQX0xQTV9LRUVQX09VVFBVVCkgJiYKIAkJICAgIChHUERSKGkpICYgR1BJT19iaXQoaSkpKSB7CiAJCQlpZiAoR1BMUihpKSAmIEdQSU9fYml0KGkpKQotCQkJCVBHU1IoaSkgfD0gR1BJT19iaXQoaSk7CisJCQkJUEdTUihncGlvX3RvX2JhbmsoaSkpIHw9IEdQSU9fYml0KGkpOwogCQkJZWxzZQotCQkJCVBHU1IoaSkgJj0gfkdQSU9fYml0KGkpOworCQkJCVBHU1IoZ3Bpb190b19iYW5rKGkpKSAmPSB+R1BJT19iaXQoaSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21pb2E3MDEuYyBiL2FyY2gvYXJtL21hY2gtcHhhL21pb2E3MDEuYwppbmRleCBlMzQ3MDEzLi5hYTY3NjM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9taW9hNzAxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWlvYTcwMS5jCkBAIC0xNzcsNTAgKzE3Nyw2IEBACiAJTUZQX0NGR19PVVQoR1BJTzExNiwgQUYwLCBEUklWRV9ISUdIKSwKIH07CiAKLSNkZWZpbmUgTUlPX0dQSU9fSU4obnVtLCBfZGVzYykgXAotCXsgLmdwaW8gPSAobnVtKSwgLmRpciA9IDAsIC5kZXNjID0gKF9kZXNjKSB9Ci0jZGVmaW5lIE1JT19HUElPX09VVChudW0sIF9pbml0LCBfZGVzYykgXAotCXsgLmdwaW8gPSAobnVtKSwgLmRpciA9IDEsIC5pbml0ID0gKF9pbml0KSwgLmRlc2MgPSAoX2Rlc2MpIH0KLXN0cnVjdCBncGlvX3Jlc3MgewotCXVuc2lnbmVkIGdwaW8gOiA4OwotCXVuc2lnbmVkIGRpciA6IDE7Ci0JdW5zaWduZWQgaW5pdCA6IDE7Ci0JY2hhciAqZGVzYzsKLX07Ci0KLXN0YXRpYyBpbnQgbWlvX2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19yZXNzICpncGlvcywgaW50IHNpemUpCi17Ci0JaW50IGksIHJjID0gMDsKLQlpbnQgZ3BpbzsKLQlpbnQgZGlyOwotCi0JZm9yIChpID0gMDsgKCFyYykgJiYgKGkgPCBzaXplKTsgaSsrKSB7Ci0JCWdwaW8gPSBncGlvc1tpXS5ncGlvOwotCQlkaXIgPSBncGlvc1tpXS5kaXI7Ci0JCXJjID0gZ3Bpb19yZXF1ZXN0KGdwaW8sIGdwaW9zW2ldLmRlc2MpOwotCQlpZiAocmMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgcmVxdWVzdGluZyBHUElPICVkKCVzKSA6ICVkXG4iLAotCQkJICAgICAgIGdwaW8sIGdwaW9zW2ldLmRlc2MsIHJjKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChkaXIpCi0JCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgZ3Bpb3NbaV0uaW5pdCk7Ci0JCWVsc2UKLQkJCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOwotCX0KLQl3aGlsZSAoKHJjKSAmJiAoLS1pID49IDApKQotCQlncGlvX2ZyZWUoZ3Bpb3NbaV0uZ3Bpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBtaW9fZ3Bpb19mcmVlKHN0cnVjdCBncGlvX3Jlc3MgKmdwaW9zLCBpbnQgc2l6ZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCWdwaW9fZnJlZShncGlvc1tpXS5ncGlvKTsKLX0KLQogLyogTENEIFNjcmVlbiBhbmQgQmFja2xpZ2h0ICovCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSBtaW9hNzAxX2JhY2tsaWdodF9kYXRhID0gewogCS5wd21faWQJCT0gMCwKQEAgLTM0NiwxNiArMzAyLDE2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdHJ1Y3QgZ3Bpb19yZXNzIGdzbV9ncGlvc1tdID0gewotCU1JT19HUElPX0lOKEdQSU8yNV9HU01fTU9EX09OX1NUQVRFLCAiR1NNIHN0YXRlIiksCi0JTUlPX0dQSU9fSU4oR1BJTzExM19HU01fRVZFTlQsICJHU00gZXZlbnQiKSwKK3N0YXRpYyBzdHJ1Y3QgZ3BpbyBnc21fZ3Bpb3NbXSA9IHsKKwl7IEdQSU8yNV9HU01fTU9EX09OX1NUQVRFLCBHUElPRl9JTiwgIkdTTSBzdGF0ZSIgfSwKKwl7IEdQSU8xMTNfR1NNX0VWRU5ULCBHUElPRl9JTiwgIkdTTSBldmVudCIgfSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGdzbV9pbml0KHZvaWQpCiB7CiAJaW50IHJjOwogCi0JcmMgPSBtaW9fZ3Bpb19yZXF1ZXN0KEFSUkFZX0FORF9TSVpFKGdzbV9ncGlvcykpOworCXJjID0gZ3Bpb19yZXF1ZXN0X2FycmF5KEFSUkFZX0FORF9TSVpFKGdzbV9ncGlvcykpOwogCWlmIChyYykKIAkJZ290byBlcnJfZ3BpbzsKIAlyYyA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKEdQSU8yNV9HU01fTU9EX09OX1NUQVRFKSwgZ3NtX29uX2lycSwKQEAgLTM2OSw3ICszMjUsNyBAQAogCiBlcnJfaXJxOgogCXByaW50ayhLRVJOX0VSUiAiTWlvYTcwMTogQ2FuJ3QgcmVxdWVzdCBHU01fT04gaXJxXG4iKTsKLQltaW9fZ3Bpb19mcmVlKEFSUkFZX0FORF9TSVpFKGdzbV9ncGlvcykpOworCWdwaW9fZnJlZV9hcnJheShBUlJBWV9BTkRfU0laRShnc21fZ3Bpb3MpKTsKIGVycl9ncGlvOgogCXByaW50ayhLRVJOX0VSUiAiTWlvYTcwMTogZ3NtIG5vdCBhdmFpbGFibGVcbiIpOwogCXJldHVybiByYzsKQEAgLTM3OCw3ICszMzQsNyBAQAogc3RhdGljIHZvaWQgZ3NtX2V4aXQodm9pZCkKIHsKIAlmcmVlX2lycShncGlvX3RvX2lycShHUElPMjVfR1NNX01PRF9PTl9TVEFURSksIE5VTEwpOwotCW1pb19ncGlvX2ZyZWUoQVJSQVlfQU5EX1NJWkUoZ3NtX2dwaW9zKSk7CisJZ3Bpb19mcmVlX2FycmF5KEFSUkFZX0FORF9TSVpFKGdzbV9ncGlvcykpOwogfQogCiAvKgpAQCAtNzQ5LDE0ICs3MDUsMTYgQEAKIAlhcm1fbWFjaGluZV9yZXN0YXJ0KCdzJywgY21kKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX3Jlc3MgZ2xvYmFsX2dwaW9zW10gPSB7Ci0JTUlPX0dQSU9fT1VUKEdQSU85X0NIQVJHRV9FTiwgMSwgIkNoYXJnZXIgZW5hYmxlIiksCi0JTUlPX0dQSU9fT1VUKEdQSU8xOF9QT1dFUk9GRiwgMCwgIlBvd2VyIE9mZiIpLAotCU1JT19HUElPX09VVChHUElPODdfTENEX1BPV0VSLCAwLCAiTENEIFBvd2VyIiksCitzdGF0aWMgc3RydWN0IGdwaW8gZ2xvYmFsX2dwaW9zW10gPSB7CisJeyBHUElPOV9DSEFSR0VfRU4sIEdQSU9GX09VVF9JTklUX0hJR0gsICJDaGFyZ2VyIGVuYWJsZSIgfSwKKwl7IEdQSU8xOF9QT1dFUk9GRiwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiUG93ZXIgT2ZmIiB9LAorCXsgR1BJTzg3X0xDRF9QT1dFUiwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiTENEIFBvd2VyIiB9LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IG1pb2E3MDFfbWFjaGluZV9pbml0KHZvaWQpCiB7CisJaW50IHJjOworCiAJUFNMUiAgPSAweGZmMTAwMDAwOyAvKiBTWVNERUw9MTI1bXMsIFBXUkRFTD0xMjVtcywgUFNMUl9TTF9ST0Q9MSAqLwogCVBDRlIgPSBQQ0ZSX0RDX0VOIHwgUENGUl9HUFJfRU4gfCBQQ0ZSX09QREU7CiAJUlRUUiA9IDMyNzY4IC0gMTsgLyogUmVzZXQgY3JhenkgV2luQ0UgdmFsdWUgKi8KQEAgLTc2Niw3ICs3MjQsOSBAQAogCXB4YV9zZXRfZmZ1YXJ0X2luZm8oTlVMTCk7CiAJcHhhX3NldF9idHVhcnRfaW5mbyhOVUxMKTsKIAlweGFfc2V0X3N0dWFydF9pbmZvKE5VTEwpOwotCW1pb19ncGlvX3JlcXVlc3QoQVJSQVlfQU5EX1NJWkUoZ2xvYmFsX2dwaW9zKSk7CisJcmMgPSBncGlvX3JlcXVlc3RfYXJyYXkoQVJSQVlfQU5EX1NJWkUoZ2xvYmFsX2dwaW9zKSk7CisJaWYgKHJjKQorCQlwcl9lcnIoIk1pb0E3MDE6IEZhaWxlZCB0byByZXF1ZXN0IEdQSU9zOiAlZCIsIHJjKTsKIAlib290c3RyYXBfaW5pdCgpOwogCXB4YV9zZXRfZmJfaW5mbyhOVUxMLCAmbWlvYTcwMV9weGFmYl9pbmZvKTsKIAlweGFfc2V0X21jaV9pbmZvKCZtaW9hNzAxX21jaV9pbmZvKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG16NzIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG16NzIuYwppbmRleCA2NWYyNGYwLi41YTUzMjliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtejcyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXo3Mi5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BtLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wbS5jCmluZGV4IDUxZTE1ODMuLjM3MTc4YTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcG0uYwpAQCAtNDIsNyArNDIsNiBAQAogCiAJLyogKioqIGdvIHp6eiAqKiogKi8KIAlweGFfY3B1X3BtX2Zucy0+ZW50ZXIoc3RhdGUpOwotCWNwdV9pbml0KCk7CiAKIAlpZiAoc3RhdGUgIT0gUE1fU1VTUEVORF9TVEFOREJZICYmIHB4YV9jcHVfcG1fZm5zLT5yZXN0b3JlKSB7CiAJCS8qIGFmdGVyIHNsZWVwaW5nLCB2YWxpZGF0ZSB0aGUgY2hlY2tzdW0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKaW5kZXggZmVkMzYzYy4uOWM0MzRkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgpAQCAtMjQ0LDcgKzI0NSw3IEBACiAKIAlzd2l0Y2ggKHN0YXRlKSB7CiAJY2FzZSBQTV9TVVNQRU5EX01FTToKLQkJcHhhMjV4X2NwdV9zdXNwZW5kKFBXUk1PREVfU0xFRVAsIFBMQVRfUEhZU19PRkZTRVQgLSBQQUdFX09GRlNFVCk7CisJCWNwdV9zdXNwZW5kKFBXUk1PREVfU0xFRVAsIHB4YTI1eF9maW5pc2hfc3VzcGVuZCk7CiAJCWJyZWFrOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKaW5kZXggMmZlY2JlYy4uOWQyNDAwYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyN3guaD4KQEAgLTI4NCw2ICsyODUsMTEgQEAKIHZvaWQgcHhhMjd4X2NwdV9wbV9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCiB7CiAJZXh0ZXJuIHZvaWQgcHhhX2NwdV9zdGFuZGJ5KHZvaWQpOworI2lmbmRlZiBDT05GSUdfSVdNTVhUCisJdTY0IGFjYzA7CisKKwlhc20gdm9sYXRpbGUoIm1yYSAlUTAsICVSMCwgYWNjMCIgOiAiPXIiIChhY2MwKSk7CisjZW5kaWYKIAogCS8qIGVuc3VyZSB2b2x0YWdlLWNoYW5nZSBzZXF1ZW5jZXIgbm90IGluaXRpYXRlZCwgd2hpY2ggaGFuZ3MgKi8KIAlQQ0ZSICY9IH5QQ0ZSX0ZWQzsKQEAgLTI5OSw3ICszMDUsMTAgQEAKIAkJcHhhX2NwdV9zdGFuZGJ5KCk7CiAJCWJyZWFrOwogCWNhc2UgUE1fU1VTUEVORF9NRU06Ci0JCXB4YTI3eF9jcHVfc3VzcGVuZChwd3Jtb2RlLCBQTEFUX1BIWVNfT0ZGU0VUIC0gUEFHRV9PRkZTRVQpOworCQljcHVfc3VzcGVuZChwd3Jtb2RlLCBweGEyN3hfZmluaXNoX3N1c3BlbmQpOworI2lmbmRlZiBDT05GSUdfSVdNTVhUCisJCWFzbSB2b2xhdGlsZSgibWFyIGFjYzAsICVRMCwgJVIwIiA6ICI9ciIgKGFjYzApKTsKKyNlbmRpZgogCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGEzeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jCmluZGV4IDg1MjFkN2QuLmVmMWM1NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjL3B4YS1pMmMuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhM3h4LXJlZ3MuaD4KQEAgLTE0MSw4ICsxNDIsMTMgQEAKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwID0gKHZvbGF0aWxlIHZvaWQgKikweGMwMDAwMDAwOwogCXVuc2lnbmVkIGxvbmcgc2F2ZWRfZGF0YSA9ICpwOworI2lmbmRlZiBDT05GSUdfSVdNTVhUCisJdTY0IGFjYzA7CiAKLQlleHRlcm4gdm9pZCBweGEzeHhfY3B1X3N1c3BlbmQobG9uZyk7CisJYXNtIHZvbGF0aWxlKCJtcmEgJVEwLCAlUjAsIGFjYzAiIDogIj1yIiAoYWNjMCkpOworI2VuZGlmCisKKwlleHRlcm4gaW50IHB4YTN4eF9maW5pc2hfc3VzcGVuZCh1bnNpZ25lZCBsb25nKTsKIAogCS8qIHJlc3VtaW5nIGZyb20gRDIgcmVxdWlyZXMgdGhlIEhTSU8yL0JPT1QvVFBNIGNsb2NrcyBlbmFibGVkICovCiAJQ0tFTkEgfD0gKDEgPDwgQ0tFTl9CT09UKSB8ICgxIDw8IENLRU5fVFBNKTsKQEAgLTE2MiwxMSArMTY4LDE1IEBACiAJLyogb3ZlcndyaXRlIHdpdGggdGhlIHJlc3VtZSBhZGRyZXNzICovCiAJKnAgPSB2aXJ0X3RvX3BoeXMoY3B1X3Jlc3VtZSk7CiAKLQlweGEzeHhfY3B1X3N1c3BlbmQoUExBVF9QSFlTX09GRlNFVCAtIFBBR0VfT0ZGU0VUKTsKKwljcHVfc3VzcGVuZCgwLCBweGEzeHhfZmluaXNoX3N1c3BlbmQpOwogCiAJKnAgPSBzYXZlZF9kYXRhOwogCiAJQUQzRVIgPSAwOworCisjaWZuZGVmIENPTkZJR19JV01NWFQKKwlhc20gdm9sYXRpbGUoIm1hciBhY2MwLCAlUTAsICVSMCIgOiAiPXIiIChhY2MwKSk7CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgcHhhM3h4X2NwdV9wbV9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9yYXVtZmVsZC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcmF1bWZlbGQuYwppbmRleCBkMTMwZjc3Li4yZjM3ZDQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9yYXVtZmVsZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3JhdW1mZWxkLmMKQEAgLTU3MywxMCArNTczLDEwIEBACiAJLnhyZXMJCT0gNDgwLAogCS55cmVzCQk9IDI3MiwKIAkuYnBwCQk9IDE2LAotCS5oc3luY19sZW4JPSA0LAorCS5oc3luY19sZW4JPSA0MSwKIAkubGVmdF9tYXJnaW4JPSAyLAogCS5yaWdodF9tYXJnaW4JPSAxLAotCS52c3luY19sZW4JPSAxLAorCS52c3luY19sZW4JPSAxMCwKIAkudXBwZXJfbWFyZ2luCT0gMywKIAkubG93ZXJfbWFyZ2luCT0gMSwKIAkuc3luYwkJPSAwLApAQCAtNTk2LDI5ICs1OTYsMzEgQEAKIHsKIAlpbnQgcmV0OwogCi0JcHhhX3NldF9mYl9pbmZvKE5VTEwsICZyYXVtZmVsZF9zaGFycF9sY2RfaW5mbyk7Ci0KLQkvKiBFYXJsaWVyIGRldmljZXMgaGFkIHRoZSBiYWNrbGlnaHQgcmVndWxhdG9yIGNvbnRyb2xsZWQKLQkgKiB2aWEgUFdNLCBsYXRlciB2ZXJzaW9ucyB1c2UgYW5vdGhlciBjb250cm9sbGVyIGZvciB0aGF0ICovCi0JaWYgKChzeXN0ZW1fcmV2ICYgMHhmZikgPCAyKSB7Ci0JCW1mcF9jZmdfdCByYXVtZmVsZF9wd21fcGluX2NvbmZpZyA9IEdQSU8xN19QV00wX09VVDsKLQkJcHhhM3h4X21mcF9jb25maWcoJnJhdW1mZWxkX3B3bV9waW5fY29uZmlnLCAxKTsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyYXVtZmVsZF9wd21fYmFja2xpZ2h0X2RldmljZSk7Ci0JfSBlbHNlCi0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmF1bWZlbGRfbHQzNTkzX2RldmljZSk7Ci0KIAlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19URlRfVkFfRU4sICJkaXNwbGF5IFZBIGVuYWJsZSIpOwogCWlmIChyZXQgPCAwKQogCQlwcl93YXJuaW5nKCJVbmFibGUgdG8gcmVxdWVzdCBHUElPX1RGVF9WQV9FTlxuIik7CiAJZWxzZQogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19URlRfVkFfRU4sIDEpOwogCisJbXNsZWVwKDEwMCk7CisKIAlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19ESVNQTEFZX0VOQUJMRSwgImRpc3BsYXkgZW5hYmxlIik7CiAJaWYgKHJldCA8IDApCiAJCXByX3dhcm5pbmcoIlVuYWJsZSB0byByZXF1ZXN0IEdQSU9fRElTUExBWV9FTkFCTEVcbiIpOwogCWVsc2UKIAkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fRElTUExBWV9FTkFCTEUsIDEpOwogCisJLyogSGFyZHdhcmUgcmV2aXNpb24gMiBoYXMgdGhlIGJhY2tsaWdodCByZWd1bGF0b3IgY29udHJvbGxlZAorCSAqIGJ5IGFuIExUMzU5MywgZWFybGllciBhbmQgbGF0ZXIgZGV2aWNlcyB1c2UgUFdNIGZvciB0aGF0LiAqLworCWlmICgoc3lzdGVtX3JldiAmIDB4ZmYpID09IDIpIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyYXVtZmVsZF9sdDM1OTNfZGV2aWNlKTsKKwl9IGVsc2UgeworCQltZnBfY2ZnX3QgcmF1bWZlbGRfcHdtX3Bpbl9jb25maWcgPSBHUElPMTdfUFdNMF9PVVQ7CisJCXB4YTN4eF9tZnBfY29uZmlnKCZyYXVtZmVsZF9wd21fcGluX2NvbmZpZywgMSk7CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmF1bWZlbGRfcHdtX2JhY2tsaWdodF9kZXZpY2UpOworCX0KKworCXB4YV9zZXRfZmJfaW5mbyhOVUxMLCAmcmF1bWZlbGRfc2hhcnBfbGNkX2luZm8pOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcHhhM3h4X2RldmljZV9nY3UpOwogfQogCkBAIC02NTcsMTAgKzY1OSwxMCBAQAogCiAjZGVmaW5lIFNQSV9BSzQxMDQJXAogewkJCVwKLQkubW9kYWxpYXMJPSAiYWs0MTA0IiwJXAotCS5tYXhfc3BlZWRfaHoJPSAxMDAwMCwJXAotCS5idXNfbnVtCT0gMCwJCVwKLQkuY2hpcF9zZWxlY3QJPSAwLAkJXAorCS5tb2RhbGlhcwk9ICJhazQxMDQtY29kZWMiLAlcCisJLm1heF9zcGVlZF9oegk9IDEwMDAwLAkJXAorCS5idXNfbnVtCT0gMCwJCQlcCisJLmNoaXBfc2VsZWN0CT0gMCwJCQlcCiAJLmNvbnRyb2xsZXJfZGF0YSA9ICh2b2lkICopIEdQSU9fU1BESUZfQ1MsCVwKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc2FhcmIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3NhYXJiLmMKaW5kZXggOTMyMmZlNS4uZTUzYTMzMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvc2FhcmIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zYWFyYi5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogTUFDSElORV9TVEFSVChTQUFSQiwgIlBYQTk1NSBIYW5kaGVsZCBQbGF0Zm9ybSAoYWthIFNBQVJCKSIpCiAJLmJvb3RfcGFyYW1zICAgID0gMHhhMDAwMDEwMCwKLQkubWFwX2lvICAgICAgICAgPSBweGFfbWFwX2lvLAorCS5tYXBfaW8gICAgICAgICA9IHB4YTN4eF9tYXBfaW8sCiAJLm5yX2lycXMJPSBTQUFSQl9OUl9JUlFTLAogCS5pbml0X2lycSAgICAgICA9IHB4YTk1eF9pbml0X2lycSwKIAkudGltZXIgICAgICAgICAgPSAmcHhhX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc2xlZXAuUyBiL2FyY2gvYXJtL21hY2gtcHhhL3NsZWVwLlMKaW5kZXggNmY1MzY4OC4uMWU1NDRiZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvc2xlZXAuUworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zbGVlcC5TCkBAIC0yNCwyMCArMjQsOSBAQAogCiAjaWZkZWYgQ09ORklHX1BYQTN4eAogLyoKLSAqIHB4YTN4eF9jcHVfc3VzcGVuZCgpIC0gZm9yY2VzIENQVSBpbnRvIHNsZWVwIHN0YXRlIChTMkQzQzQpCi0gKgotICogcjAgPSB2OnAgb2Zmc2V0CisgKiBweGEzeHhfZmluaXNoX3N1c3BlbmQoKSAtIGZvcmNlcyBDUFUgaW50byBzbGVlcCBzdGF0ZSAoUzJEM0M0KQogICovCi1FTlRSWShweGEzeHhfY3B1X3N1c3BlbmQpCi0KLSNpZm5kZWYgQ09ORklHX0lXTU1YVAotCW1yYQlyMiwgcjMsIGFjYzAKLSNlbmRpZgotCXN0bWZkCXNwISwge3IyIC0gcjEyLCBscn0JQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjawotCW1vdglyMSwgcjAKLQlsZHIJcjMsID1weGFfY3B1X3Jlc3VtZQlAIHJlc3VtZSBmdW5jdGlvbgotCWJsCWNwdV9zdXNwZW5kCi0KK0VOVFJZKHB4YTN4eF9maW5pc2hfc3VzcGVuZCkKIAltb3YJcjAsICMweDA2CQlAIFMyRDNDNCBtb2RlCiAJbWNyCXAxNCwgMCwgcjAsIGM3LCBjMCwgMAlAIGVudGVyIHNsZWVwCiAKQEAgLTQ2LDI4ICszNSwxOCBAQAogCiAjaWZkZWYgQ09ORklHX1BYQTI3eAogLyoKLSAqIHB4YTI3eF9jcHVfc3VzcGVuZCgpCisgKiBweGEyN3hfZmluaXNoX3N1c3BlbmQoKQogICoKICAqIEZvcmNlcyBDUFUgaW50byBzbGVlcCBzdGF0ZS4KICAqCiAgKiByMCA9IHZhbHVlIGZvciBQV1JNT0RFIE0gZmllbGQgZm9yIGRlc2lyZWQgc2xlZXAgc3RhdGUKLSAqIHIxID0gdjpwIG9mZnNldAogICovCi1FTlRSWShweGEyN3hfY3B1X3N1c3BlbmQpCi0KLSNpZm5kZWYgQ09ORklHX0lXTU1YVAotCW1yYQlyMiwgcjMsIGFjYzAKLSNlbmRpZgotCXN0bWZkCXNwISwge3IyIC0gcjEyLCBscn0JCUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKLQltb3YJcjQsIHIwCQkJCUAgc2F2ZSBzbGVlcCBtb2RlCi0JbGRyCXIzLCA9cHhhX2NwdV9yZXN1bWUJCUAgcmVzdW1lIGZ1bmN0aW9uCi0JYmwJY3B1X3N1c3BlbmQKLQorRU5UUlkocHhhMjd4X2ZpbmlzaF9zdXNwZW5kKQogCUAgUHV0IHRoZSBwcm9jZXNzb3IgdG8gc2xlZXAKIAlAIChhbHNvIHdvcmthcm91bmQgZm9yIHNpZ2h0aW5nIDI4MDcxKQogCiAJQCBwcmVwYXJlIHZhbHVlIGZvciBzbGVlcCBtb2RlCi0JbW92CXIxLCByNAkJCQlAIHNsZWVwIG1vZGUKKwltb3YJcjEsIHIwCQkJCUAgc2xlZXAgbW9kZQogCiAJQCBwcmVwYXJlIHBvaW50ZXIgdG8gcGh5c2ljYWwgYWRkcmVzcyAwICh2aXJ0dWFsIG1hcHBpbmcgaW4gZ2VuZXJpYy5jKQogCW1vdglyMiwgI1VOQ0FDSEVEX1BIWVNfMApAQCAtOTksMjEgKzc4LDE2IEBACiAKICNpZmRlZiBDT05GSUdfUFhBMjV4CiAvKgotICogcHhhMjV4X2NwdV9zdXNwZW5kKCkKKyAqIHB4YTI1eF9maW5pc2hfc3VzcGVuZCgpCiAgKgogICogRm9yY2VzIENQVSBpbnRvIHNsZWVwIHN0YXRlLgogICoKICAqIHIwID0gdmFsdWUgZm9yIFBXUk1PREUgTSBmaWVsZCBmb3IgZGVzaXJlZCBzbGVlcCBzdGF0ZQotICogcjEgPSB2OnAgb2Zmc2V0CiAgKi8KIAotRU5UUlkocHhhMjV4X2NwdV9zdXNwZW5kKQotCXN0bWZkCXNwISwge3IyIC0gcjEyLCBscn0JCUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKLQltb3YJcjQsIHIwCQkJCUAgc2F2ZSBzbGVlcCBtb2RlCi0JbGRyCXIzLCA9cHhhX2NwdV9yZXN1bWUJCUAgcmVzdW1lIGZ1bmN0aW9uCi0JYmwJY3B1X3N1c3BlbmQKK0VOVFJZKHB4YTI1eF9maW5pc2hfc3VzcGVuZCkKIAlAIHByZXBhcmUgdmFsdWUgZm9yIHNsZWVwIG1vZGUKLQltb3YJcjEsIHI0CQkJCUAgc2xlZXAgbW9kZQorCW1vdglyMSwgcjAJCQkJQCBzbGVlcCBtb2RlCiAKIAlAIHByZXBhcmUgcG9pbnRlciB0byBwaHlzaWNhbCBhZGRyZXNzIDAgKHZpcnR1YWwgbWFwcGluZyBpbiBnZW5lcmljLmMpCiAJbW92CXIyLCAjVU5DQUNIRURfUEhZU18wCkBAIC0xOTUsMTYgKzE2OSwzIEBACiAJbWNyCXAxNCwgMCwgcjEsIGM3LCBjMCwgMAkJQCBQV1JNT0RFCiAKIDIwOgliCTIwYgkJCQlAIGxvb3Agd2FpdGluZyBmb3Igc2xlZXAKLQotLyoKLSAqIHB4YV9jcHVfcmVzdW1lKCkKLSAqCi0gKiBlbnRyeSBwb2ludCBmcm9tIGJvb3Rsb2FkZXIgaW50byBrZXJuZWwgZHVyaW5nIHJlc3VtZQotICovCi0JLmFsaWduIDUKLXB4YV9jcHVfcmVzdW1lOgotCWxkbWZkCXNwISwge3IyLCByM30KLSNpZm5kZWYgQ09ORklHX0lXTU1YVAotCW1hcglhY2MwLCByMiwgcjMKLSNlbmRpZgotCWxkbWZkCXNwISwge3I0IC0gcjEyLCBwY30JCUAgcmV0dXJuIHRvIGNhbGxlcgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHpfcG0uYyBiL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6X3BtLmMKaW5kZXggN2ZlNzQwNi4uMDk0Mjc5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHpfcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zcGl0el9wbS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FwbS1lbXVsYXRpb24uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3pldXMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3pldXMuYwppbmRleCAwMDM2M2M3Li45Yjk5Y2MxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS96ZXVzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvemV1cy5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvY2FuL3BsYXRmb3JtL21jcDI1MXguaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKQEAgLTY3Niw3ICs2NzcsNyBAQAogc3RhdGljIHZvaWQgemV1c19wb3dlcl9vZmYodm9pZCkKIHsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXB4YTI3eF9jcHVfc3VzcGVuZChQV1JNT0RFX0RFRVBTTEVFUCwgUExBVF9QSFlTX09GRlNFVCAtIFBBR0VfT0ZGU0VUKTsKKwljcHVfc3VzcGVuZChQV1JNT0RFX0RFRVBTTEVFUCwgcHhhMjd4X2ZpbmlzaF9zdXNwZW5kKTsKIH0KICNlbHNlCiAjZGVmaW5lIHpldXNfcG93ZXJfb2ZmICAgTlVMTApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9LY29uZmlnCmluZGV4IGI5YTk4MDUuLmRiYTZkMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L0tjb25maWcKQEAgLTUwLDYgKzUwLDcgQEAKIAlib29sICJTdXBwb3J0IFJlYWxWaWV3KFIpIFBsYXRmb3JtIEJhc2Vib2FyZCBmb3IgQVJNMTE3NkpaRi1TIgogCXNlbGVjdCBDUFVfVjYKIAlzZWxlY3QgQVJNX0dJQworCXNlbGVjdCBIQVZFX1RDTQogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEFSTShSKSBSZWFsVmlldyhSKSBQbGF0Zm9ybSBCYXNlYm9hcmQgZm9yCiAJICBBUk0xMTc2SlpGLVMuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IDE3NTlmYTYuLjIwMjJlMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0yOSwxMCArMjksNiBAQAogI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDAwMDAwMDAwKQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfWk9ORV9ETUEKLSNkZWZpbmUgQVJNX0RNQV9aT05FX1NJWkUJU1pfMjU2TQotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfU1BBUlNFTUVNCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jCmluZGV4IDk2M2JmMGQuLjRhZTk0M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jCkBAIC02OCwxNCArNjgsNiBAQAogCiB2b2lkIF9faW5pdCBwbGF0Zm9ybV9zbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKIHsKLQlpbnQgaTsKLQotCS8qCi0JICogSW5pdGlhbGlzZSB0aGUgcHJlc2VudCBtYXAsIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2V0IG9mIENQVXMKLQkgKiBhY3R1YWxseSBwb3B1bGF0ZWQgYXQgdGhlIHByZXNlbnQgdGltZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbWF4X2NwdXM7IGkrKykKLQkJc2V0X2NwdV9wcmVzZW50KGksIHRydWUpOwogCiAJc2N1X2VuYWJsZShzY3VfYmFzZV9hZGRyKCkpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMKaW5kZXggMTBlNzVmYS4uN2E0ZTNiMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYwpAQCAtNDcwLDQgKzQ3MCw3IEBACiAJLmluaXRfaXJxCT0gZ2ljX2luaXRfaXJxLAogCS50aW1lcgkJPSAmcmVhbHZpZXdfZWJfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IHJlYWx2aWV3X2ViX2luaXQsCisjaWZkZWYgQ09ORklHX1pPTkVfRE1BCisJLmRtYV96b25lX3NpemUJPSBTWl8yNTZNLAorI2VuZGlmCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExNzYuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMTc2LmMKaW5kZXggZWFiNjA3MC4uYWQ1NjcxYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExNzYuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTE3Ni5jCkBAIC0zNjUsNCArMzY1LDcgQEAKIAkuaW5pdF9pcnEJPSBnaWNfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZyZWFsdmlld19wYjExNzZfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IHJlYWx2aWV3X3BiMTE3Nl9pbml0LAorI2lmZGVmIENPTkZJR19aT05FX0RNQQorCS5kbWFfem9uZV9zaXplCT0gU1pfMjU2TSwKKyNlbmRpZgogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMW1wLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTFtcC5jCmluZGV4IGIyOTg1ZmMuLmI0MzY0NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMW1wLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYwpAQCAtMzY3LDQgKzM2Nyw3IEBACiAJLmluaXRfaXJxCT0gZ2ljX2luaXRfaXJxLAogCS50aW1lcgkJPSAmcmVhbHZpZXdfcGIxMW1wX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSByZWFsdmlld19wYjExbXBfaW5pdCwKKyNpZmRlZiBDT05GSUdfWk9ORV9ETUEKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzI1Nk0sCisjZW5kaWYKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiYTguYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCmluZGV4IGZiNjg2NjUuLjc2M2U4ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCkBAIC0zMTcsNCArMzE3LDcgQEAKIAkuaW5pdF9pcnEJPSBnaWNfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZyZWFsdmlld19wYmE4X3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSByZWFsdmlld19wYmE4X2luaXQsCisjaWZkZWYgQ09ORklHX1pPTkVfRE1BCisJLmRtYV96b25lX3NpemUJPSBTWl8yNTZNLAorI2VuZGlmCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYnguYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJ4LmMKaW5kZXggOTJhY2UyYy4uMzYzYjBhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYnguYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BieC5jCkBAIC00MDAsNCArNDAwLDcgQEAKIAkuaW5pdF9pcnEJPSBnaWNfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZyZWFsdmlld19wYnhfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IHJlYWx2aWV3X3BieF9pbml0LAorI2lmZGVmIENPTkZJR19aT05FX0RNQQorCS5kbWFfem9uZV9zaXplCT0gU1pfMjU2TSwKKyNlbmRpZgogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQwMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDAwL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDhmNWUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDAwL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDcgU2ltdGVjIEVsZWN0cm9uaWNzCi0jCi0jIExpY2Vuc2VkIHVuZGVyIEdQTHYyCi0KLW1lbnUgIlMzQzI0MDAgTWFjaGluZXMiCi0KLWVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQwMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtczNjMjQwMC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyM2Y0ZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MDAvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIGFyY2gvYXJtL21hY2gtczNjMjQwMC9NYWtlZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKLSMKLSMgTGljZW5zZWQgdW5kZXIgR1BMdjIKLQotb2JqLXkJCQkJOj0KLW9iai1tCQkJCTo9Ci1vYmotbgkJCQk6PQotb2JqLQkJCQk6PQotCi1vYmotJChDT05GSUdfQ1BVX1MzQzI0MDApCSs9IGdwaW8ubwotCi0jIE1hY2hpbmUgc3VwcG9ydAotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MDAvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDAwL2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2OGU3OC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MDAvZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDAwL2dwaW8uYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBMdWNhcyBDb3JyZWlhIFZpbGxhIFJlYWwgPGx1Y2FzdnJAZ29ib2xpbnV4Lm9yZz4KLSAqCi0gKiBTM0MyNDAwIEdQSU8gc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotCi1pbnQgczNjMjQwMF9ncGlvX2dldGlycSh1bnNpZ25lZCBpbnQgcGluKQotewotCWlmIChwaW4gPCBTM0MyNDEwX0dQRSgwKSB8fCBwaW4gPiBTM0MyNDAwX0dQRSg3KSkKLQkJcmV0dXJuIC1FSU5WQUw7ICAvKiBub3QgdmFsaWQgaW50ZXJydXB0cyAqLwotCi0JcmV0dXJuIChwaW4gLSBTM0MyNDEwX0dQRSgwKSkgKyBJUlFfRUlOVDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0woczNjMjQwMF9ncGlvX2dldGlycSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MDAvaW5jbHVkZS9tYWNoL21hcC5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDAwL2luY2x1ZGUvbWFjaC9tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkODg5Mi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MDAvaW5jbHVkZS9tYWNoL21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1zM2MyNDAwL2luY2x1ZGUvbWFjaC9tYXAuaAotICoKLSAqIENvcHlyaWdodCAyMDAzLTIwMDcgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIENvcHlyaWdodCAyMDAzLCBMdWNhcyBDb3JyZWlhIFZpbGxhIFJlYWwKLSAqCi0gKiBTM0MyNDAwIC0gTWVtb3J5IG1hcCBkZWZpbml0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jZGVmaW5lIFMzQzI0MDBfUEFfTUVNQ1RSTAkoMHgxNDAwMDAwMCkKLSNkZWZpbmUgUzNDMjQwMF9QQV9VU0JIT1NUCSgweDE0MjAwMDAwKQotI2RlZmluZSBTM0MyNDAwX1BBX0lSUQkJKDB4MTQ0MDAwMDApCi0jZGVmaW5lIFMzQzI0MDBfUEFfRE1BCQkoMHgxNDYwMDAwMCkKLSNkZWZpbmUgUzNDMjQwMF9QQV9DTEtQV1IJKDB4MTQ4MDAwMDApCi0jZGVmaW5lIFMzQzI0MDBfUEFfTENECQkoMHgxNEEwMDAwMCkKLSNkZWZpbmUgUzNDMjQwMF9QQV9VQVJUCQkoMHgxNTAwMDAwMCkKLSNkZWZpbmUgUzNDMjQwMF9QQV9USU1FUgkoMHgxNTEwMDAwMCkKLSNkZWZpbmUgUzNDMjQwMF9QQV9VU0JERVYJKDB4MTUyMDAxNDApCi0jZGVmaW5lIFMzQzI0MDBfUEFfV0FUQ0hET0cJKDB4MTUzMDAwMDApCi0jZGVmaW5lIFMzQzI0MDBfUEFfSUlDCQkoMHgxNTQwMDAwMCkKLSNkZWZpbmUgUzNDMjQwMF9QQV9JSVMJCSgweDE1NTA4MDAwKQotI2RlZmluZSBTM0MyNDAwX1BBX0dQSU8JCSgweDE1NjAwMDAwKQotI2RlZmluZSBTM0MyNDAwX1BBX1JUQwkJKDB4MTU3MDAwNDApCi0jZGVmaW5lIFMzQzI0MDBfUEFfQURDCQkoMHgxNTgwMDAwMCkKLSNkZWZpbmUgUzNDMjQwMF9QQV9TUEkJCSgweDE1OTAwMDAwKQotCi0jZGVmaW5lIFMzQzI0MDBfUEFfTU1DCQkoMHgxNUEwMDAwMCkKLSNkZWZpbmUgUzNDMjQwMF9TWl9NTUMJCVNaXzFNCi0KLS8qIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiBhbGwgdGhlIGNoaXAtc2VsZWN0IGFyZWFzICovCi0KLSNkZWZpbmUgUzNDMjQwMF9DUzAJKDB4MDAwMDAwMDApCi0jZGVmaW5lIFMzQzI0MDBfQ1MxCSgweDAyMDAwMDAwKQotI2RlZmluZSBTM0MyNDAwX0NTMgkoMHgwNDAwMDAwMCkKLSNkZWZpbmUgUzNDMjQwMF9DUzMJKDB4MDYwMDAwMDApCi0jZGVmaW5lIFMzQzI0MDBfQ1M0CSgweDA4MDAwMDAwKQotI2RlZmluZSBTM0MyNDAwX0NTNQkoMHgwQTAwMDAwMCkKLSNkZWZpbmUgUzNDMjQwMF9DUzYJKDB4MEMwMDAwMDApCi0jZGVmaW5lIFMzQzI0MDBfQ1M3CSgweDBFMDAwMDAwKQotCi0jZGVmaW5lIFMzQzI0MDBfU0RSQU1fUEEgICAgKFMzQzI0MDBfQ1M2KQotCi0vKiBVc2UgYSBzaW5nbGUgaW50ZXJmYWNlIGZvciBjb21tb24gcmVzb3VyY2VzIGJldHdlZW4gUzNDMjRYWCBjcHVzICovCi0KLSNkZWZpbmUgUzNDMjRYWF9QQV9JUlEJCVMzQzI0MDBfUEFfSVJRCi0jZGVmaW5lIFMzQzI0WFhfUEFfTUVNQ1RSTAlTM0MyNDAwX1BBX01FTUNUUkwKLSNkZWZpbmUgUzNDMjRYWF9QQV9VU0JIT1NUCVMzQzI0MDBfUEFfVVNCSE9TVAotI2RlZmluZSBTM0MyNFhYX1BBX0RNQQkJUzNDMjQwMF9QQV9ETUEKLSNkZWZpbmUgUzNDMjRYWF9QQV9DTEtQV1IJUzNDMjQwMF9QQV9DTEtQV1IKLSNkZWZpbmUgUzNDMjRYWF9QQV9MQ0QJCVMzQzI0MDBfUEFfTENECi0jZGVmaW5lIFMzQzI0WFhfUEFfVUFSVAkJUzNDMjQwMF9QQV9VQVJUCi0jZGVmaW5lIFMzQzI0WFhfUEFfVElNRVIJUzNDMjQwMF9QQV9USU1FUgotI2RlZmluZSBTM0MyNFhYX1BBX1VTQkRFVglTM0MyNDAwX1BBX1VTQkRFVgotI2RlZmluZSBTM0MyNFhYX1BBX1dBVENIRE9HCVMzQzI0MDBfUEFfV0FUQ0hET0cKLSNkZWZpbmUgUzNDMjRYWF9QQV9JSUMJCVMzQzI0MDBfUEFfSUlDCi0jZGVmaW5lIFMzQzI0WFhfUEFfSUlTCQlTM0MyNDAwX1BBX0lJUwotI2RlZmluZSBTM0MyNFhYX1BBX0dQSU8JCVMzQzI0MDBfUEFfR1BJTwotI2RlZmluZSBTM0MyNFhYX1BBX1JUQwkJUzNDMjQwMF9QQV9SVEMKLSNkZWZpbmUgUzNDMjRYWF9QQV9BREMJCVMzQzI0MDBfUEFfQURDCi0jZGVmaW5lIFMzQzI0WFhfUEFfU1BJCQlTM0MyNDAwX1BBX1NQSQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCmluZGV4IDBkNDY4ZTkuLjgxNjk1MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDYgQEAKIG9iai0JCQkJOj0KIAogb2JqLSQoQ09ORklHX0NQVV9TM0MyNDEwKQkrPSBzM2MyNDEwLm8KLW9iai0kKENPTkZJR19DUFVfUzNDMjQxMCkJKz0gaXJxLm8KIG9iai0kKENPTkZJR19DUFVfUzNDMjQxMF9ETUEpCSs9IGRtYS5vCiBvYmotJChDT05GSUdfQ1BVX1MzQzI0MTBfRE1BKQkrPSBkbWEubwogb2JqLSQoQ09ORklHX1MzQzI0MTBfUE0pCSs9IHBtLm8gc2xlZXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2gxOTQwLWJsdWV0b290aC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2gxOTQwLWJsdWV0b290aC5jCmluZGV4IDJjMTI2YmIuLmE1ZWViNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9oMTk0MC1ibHVldG9vdGguYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaDE5NDAtYmx1ZXRvb3RoLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLWZucy5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLWZucy5oCmluZGV4IGY0NTNjNGYuLmJhYjEzOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby1mbnMuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tZm5zLmgKQEAgLTUyLDEyICs1Miw2IEBACiAKIGV4dGVybiBpbnQgczNjMjQxMF9ncGlvX2dldGlycSh1bnNpZ25lZCBpbnQgcGluKTsKIAotI2lmZGVmIENPTkZJR19DUFVfUzNDMjQwMAotCi1leHRlcm4gaW50IHMzYzI0MDBfZ3Bpb19nZXRpcnEodW5zaWduZWQgaW50IHBpbik7Ci0KLSNlbmRpZiAvKiBDT05GSUdfQ1BVX1MzQzI0MDAgKi8KLQogLyogczNjMjQxMF9ncGlvX2lycWZpbHRlcgogICoKICAqIHNldCB0aGUgaXJxIGZpbHRlcmluZyBvbiB0aGUgZ2l2ZW4gcGluCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3MtZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaAppbmRleCBhMGE4OWQ0Li5jYWMxYWQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3MtZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy1ncGlvLmgKQEAgLTE2LDExICsxNiw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2dwaW8tbnJzLmg+CiAKLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0MDAKLSNkZWZpbmUgUzNDMjRYWF9NSVNDQ1IJCVMzQzI0MDBfTUlTQ0NSCi0jZWxzZQogI2RlZmluZSBTM0MyNFhYX01JU0NDUgkJUzNDMjRYWF9HUElPUkVHMigweDgwKQotI2VuZGlmIC8qIENPTkZJR19DUFVfUzNDMjQwMCAqLwogCiAvKiBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLwogCkBAIC00Miw2NyArMzgsMzMgQEAKIC8qIGNvbmZpZ3VyZSBHUElPIHBvcnRzIEEuLkcgKi8KIAogLyogcG9ydCBBIC0gUzNDMjQxMDogMjJiaXRzLCB6ZXJvIGluIGJpdCBYIG1ha2VzIHBpbiBYIG91dHB1dAotICogICAgICAgICAgUzNDMjQwMDogMThiaXRzLCB6ZXJvIGluIGJpdCBYIG1ha2VzIHBpbiBYIG91dHB1dAogICogMSBtYWtlcyBwb3J0IHNwZWNpYWwgZnVuY3Rpb24sIHRoaXMgaXMgZGVmYXVsdAogKi8KICNkZWZpbmUgUzNDMjQxMF9HUEFDT04JICAgUzNDMjQxMF9HUElPUkVHKDB4MDApCiAjZGVmaW5lIFMzQzI0MTBfR1BBREFUCSAgIFMzQzI0MTBfR1BJT1JFRygweDA0KQogCi0jZGVmaW5lIFMzQzI0MDBfR1BBQ09OCSAgIFMzQzI0MTBfR1BJT1JFRygweDAwKQotI2RlZmluZSBTM0MyNDAwX0dQQURBVAkgICBTM0MyNDEwX0dQSU9SRUcoMHgwNCkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTBfQUREUjAgICAoMTw8MCkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTFfQUREUjE2ICAoMTw8MSkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTJfQUREUjE3ICAoMTw8MikKLQogI2RlZmluZSBTM0MyNDEwX0dQQTNfQUREUjE4ICAoMTw8MykKLQogI2RlZmluZSBTM0MyNDEwX0dQQTRfQUREUjE5ICAoMTw8NCkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTVfQUREUjIwICAoMTw8NSkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTZfQUREUjIxICAoMTw8NikKLQogI2RlZmluZSBTM0MyNDEwX0dQQTdfQUREUjIyICAoMTw8NykKLQogI2RlZmluZSBTM0MyNDEwX0dQQThfQUREUjIzICAoMTw8OCkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTlfQUREUjI0ICAoMTw8OSkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTEwX0FERFIyNSAoMTw8MTApCi0jZGVmaW5lIFMzQzI0MDBfR1BBMTBfU0NLRSAgICgxPDwxMCkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTExX0FERFIyNiAoMTw8MTEpCi0jZGVmaW5lIFMzQzI0MDBfR1BBMTFfbkNBUzAgICgxPDwxMSkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTEyX25HQ1MxICAoMTw8MTIpCi0jZGVmaW5lIFMzQzI0MDBfR1BBMTJfbkNBUzEgICgxPDwxMikKLQogI2RlZmluZSBTM0MyNDEwX0dQQTEzX25HQ1MyICAoMTw8MTMpCi0jZGVmaW5lIFMzQzI0MDBfR1BBMTNfbkdDUzEgICgxPDwxMykKLQogI2RlZmluZSBTM0MyNDEwX0dQQTE0X25HQ1MzICAoMTw8MTQpCi0jZGVmaW5lIFMzQzI0MDBfR1BBMTRfbkdDUzIgICgxPDwxNCkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTE1X25HQ1M0ICAoMTw8MTUpCi0jZGVmaW5lIFMzQzI0MDBfR1BBMTVfbkdDUzMgICgxPDwxNSkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTE2X25HQ1M1ICAoMTw8MTYpCi0jZGVmaW5lIFMzQzI0MDBfR1BBMTZfbkdDUzQgICgxPDwxNikKLQogI2RlZmluZSBTM0MyNDEwX0dQQTE3X0NMRSAgICAoMTw8MTcpCi0jZGVmaW5lIFMzQzI0MDBfR1BBMTdfbkdDUzUgICgxPDwxNykKLQogI2RlZmluZSBTM0MyNDEwX0dQQTE4X0FMRSAgICAoMTw8MTgpCi0KICNkZWZpbmUgUzNDMjQxMF9HUEExOV9uRldFICAgKDE8PDE5KQotCiAjZGVmaW5lIFMzQzI0MTBfR1BBMjBfbkZSRSAgICgxPDwyMCkKLQogI2RlZmluZSBTM0MyNDEwX0dQQTIxX25SU1RPVVQgKDE8PDIxKQotCiAjZGVmaW5lIFMzQzI0MTBfR1BBMjJfbkZDRSAgICgxPDwyMikKIAogLyogMHgwOCBhbmQgMHgwYyBhcmUgcmVzZXJ2ZWQgb24gUzNDMjQxMCAqLwpAQCAtMTExLDEwICs3Myw2IEBACiAgKiBHUEIgaXMgMTAgSU8gcGlucywgZWFjaCBjb25maWd1cmVkIGJ5IDIgYml0cyBlYWNoIGluIEdQQkNPTi4KICAqICAgMDAgPSBpbnB1dCwgMDEgPSBvdXRwdXQsIDEwPXNwZWNpYWwgZnVuY3Rpb24sIDExPXJlc2VydmVkCiAKLSAqIFMzQzI0MDA6Ci0gKiBHUEIgaXMgMTYgSU8gcGlucywgZWFjaCBjb25maWd1cmVkIGJ5IDIgYml0cyBlYWNoIGluIEdQQkNPTi4KLSAqICAgMDAgPSBpbnB1dCwgMDEgPSBvdXRwdXQsIDEwPWRhdGEsIDExPXNwZWNpYWwgZnVuY3Rpb24KLQogICogYml0IDAsMSA9IHBpbiAwLCAyLDM9IHBpbiAxLi4uCiAgKgogICogQ1BCVVAgPSBwdWxsIHVwIHJlc2lzdG9yIGNvbnRyb2wsIDE9ZGlzYWJsZWQsIDA9ZW5hYmxlZApAQCAtMTI0LDc4ICs4MiwzNSBAQAogI2RlZmluZSBTM0MyNDEwX0dQQkRBVAkgICBTM0MyNDEwX0dQSU9SRUcoMHgxNCkKICNkZWZpbmUgUzNDMjQxMF9HUEJVUAkgICBTM0MyNDEwX0dQSU9SRUcoMHgxOCkKIAotI2RlZmluZSBTM0MyNDAwX0dQQkNPTgkgICBTM0MyNDEwX0dQSU9SRUcoMHgwOCkKLSNkZWZpbmUgUzNDMjQwMF9HUEJEQVQJICAgUzNDMjQxMF9HUElPUkVHKDB4MEMpCi0jZGVmaW5lIFMzQzI0MDBfR1BCVVAJICAgUzNDMjQxMF9HUElPUkVHKDB4MTApCi0KIC8qIG5vIGkvbyBwaW4gaW4gcG9ydCBiIGNhbiBoYXZlIHZhbHVlIDMgKHVubGVzcyBpdCBpcyBhIHMzYzI0NDMpICEgKi8KIAogI2RlZmluZSBTM0MyNDEwX0dQQjBfVE9VVDAgICAoMHgwMiA8PCAwKQotI2RlZmluZSBTM0MyNDAwX0dQQjBfREFUQTE2ICAoMHgwMiA8PCAwKQogCiAjZGVmaW5lIFMzQzI0MTBfR1BCMV9UT1VUMSAgICgweDAyIDw8IDIpCi0jZGVmaW5lIFMzQzI0MDBfR1BCMV9EQVRBMTcgICgweDAyIDw8IDIpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEIyX1RPVVQyICAgKDB4MDIgPDwgNCkKLSNkZWZpbmUgUzNDMjQwMF9HUEIyX0RBVEExOCAgKDB4MDIgPDwgNCkKLSNkZWZpbmUgUzNDMjQwMF9HUEIyX1RDTEsxICAgKDB4MDMgPDwgNCkKIAogI2RlZmluZSBTM0MyNDEwX0dQQjNfVE9VVDMgICAoMHgwMiA8PCA2KQotI2RlZmluZSBTM0MyNDAwX0dQQjNfREFUQTE5ICAoMHgwMiA8PCA2KQotI2RlZmluZSBTM0MyNDAwX0dQQjNfVFhEMSAgICAoMHgwMyA8PCA2KQogCiAjZGVmaW5lIFMzQzI0MTBfR1BCNF9UQ0xLMCAgICgweDAyIDw8IDgpCi0jZGVmaW5lIFMzQzI0MDBfR1BCNF9EQVRBMjAgICgweDAyIDw8IDgpCiAjZGVmaW5lIFMzQzI0MTBfR1BCNF9NQVNLICAgICgweDAzIDw8IDgpCi0jZGVmaW5lIFMzQzI0MDBfR1BCNF9SWEQxICAgICgweDAzIDw8IDgpCi0jZGVmaW5lIFMzQzI0MDBfR1BCNF9NQVNLICAgICgweDAzIDw8IDgpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEI1X25YQkFDSyAgKDB4MDIgPDwgMTApCiAjZGVmaW5lIFMzQzI0NDNfR1BCNV9YQkFDSyAgICgweDAzIDw8IDEwKQotI2RlZmluZSBTM0MyNDAwX0dQQjVfREFUQTIxICAoMHgwMiA8PCAxMCkKLSNkZWZpbmUgUzNDMjQwMF9HUEI1X25DVFMxICAgKDB4MDMgPDwgMTApCiAKICNkZWZpbmUgUzNDMjQxMF9HUEI2X25YQlJFUSAgKDB4MDIgPDwgMTIpCiAjZGVmaW5lIFMzQzI0NDNfR1BCNl9YQlJFUSAgICgweDAzIDw8IDEyKQotI2RlZmluZSBTM0MyNDAwX0dQQjZfREFUQTIyICAoMHgwMiA8PCAxMikKLSNkZWZpbmUgUzNDMjQwMF9HUEI2X25SVFMxICAgKDB4MDMgPDwgMTIpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEI3X25YREFDSzEgKDB4MDIgPDwgMTQpCiAjZGVmaW5lIFMzQzI0NDNfR1BCN19YREFDSzEgICgweDAzIDw8IDE0KQotI2RlZmluZSBTM0MyNDAwX0dQQjdfREFUQTIzICAoMHgwMiA8PCAxNCkKIAogI2RlZmluZSBTM0MyNDEwX0dQQjhfblhEUkVRMSAoMHgwMiA8PCAxNikKLSNkZWZpbmUgUzNDMjQwMF9HUEI4X0RBVEEyNCAgKDB4MDIgPDwgMTYpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEI5X25YREFDSzAgKDB4MDIgPDwgMTgpCiAjZGVmaW5lIFMzQzI0NDNfR1BCOV9YREFDSzAgICgweDAzIDw8IDE4KQotI2RlZmluZSBTM0MyNDAwX0dQQjlfREFUQTI1ICAoMHgwMiA8PCAxOCkKLSNkZWZpbmUgUzNDMjQwMF9HUEI5X0kyU1NESSAgKDB4MDMgPDwgMTgpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEIxMF9uWERSRTAgKDB4MDIgPDwgMjApCiAjZGVmaW5lIFMzQzI0NDNfR1BCMTBfWERSRVEwICgweDAzIDw8IDIwKQotI2RlZmluZSBTM0MyNDAwX0dQQjEwX0RBVEEyNiAoMHgwMiA8PCAyMCkKLSNkZWZpbmUgUzNDMjQwMF9HUEIxMF9uU1MgICAgKDB4MDMgPDwgMjApCi0KLSNkZWZpbmUgUzNDMjQwMF9HUEIxMV9JTlAgICAgKDB4MDAgPDwgMjIpCi0jZGVmaW5lIFMzQzI0MDBfR1BCMTFfT1VUUCAgICgweDAxIDw8IDIyKQotI2RlZmluZSBTM0MyNDAwX0dQQjExX0RBVEEyNyAoMHgwMiA8PCAyMikKLQotI2RlZmluZSBTM0MyNDAwX0dQQjEyX0lOUCAgICAoMHgwMCA8PCAyNCkKLSNkZWZpbmUgUzNDMjQwMF9HUEIxMl9PVVRQICAgKDB4MDEgPDwgMjQpCi0jZGVmaW5lIFMzQzI0MDBfR1BCMTJfREFUQTI4ICgweDAyIDw8IDI0KQotCi0jZGVmaW5lIFMzQzI0MDBfR1BCMTNfSU5QICAgICgweDAwIDw8IDI2KQotI2RlZmluZSBTM0MyNDAwX0dQQjEzX09VVFAgICAoMHgwMSA8PCAyNikKLSNkZWZpbmUgUzNDMjQwMF9HUEIxM19EQVRBMjkgKDB4MDIgPDwgMjYpCi0KLSNkZWZpbmUgUzNDMjQwMF9HUEIxNF9JTlAgICAgKDB4MDAgPDwgMjgpCi0jZGVmaW5lIFMzQzI0MDBfR1BCMTRfT1VUUCAgICgweDAxIDw8IDI4KQotI2RlZmluZSBTM0MyNDAwX0dQQjE0X0RBVEEzMCAoMHgwMiA8PCAyOCkKLQotI2RlZmluZSBTM0MyNDAwX0dQQjE1X0lOUCAgICAoMHgwMCA8PCAzMCkKLSNkZWZpbmUgUzNDMjQwMF9HUEIxNV9PVVRQICAgKDB4MDEgPDwgMzApCi0jZGVmaW5lIFMzQzI0MDBfR1BCMTVfREFUQTMxICgweDAyIDw8IDMwKQogCiAjZGVmaW5lIFMzQzI0MTBfR1BCX1BVUERJUyh4KSAgKDE8PCh4KSkKIApAQCAtMjA4LDU5ICsxMjMsMjIgQEAKICNkZWZpbmUgUzNDMjQxMF9HUENDT04JICAgUzNDMjQxMF9HUElPUkVHKDB4MjApCiAjZGVmaW5lIFMzQzI0MTBfR1BDREFUCSAgIFMzQzI0MTBfR1BJT1JFRygweDI0KQogI2RlZmluZSBTM0MyNDEwX0dQQ1VQCSAgIFMzQzI0MTBfR1BJT1JFRygweDI4KQotCi0jZGVmaW5lIFMzQzI0MDBfR1BDQ09OCSAgIFMzQzI0MTBfR1BJT1JFRygweDE0KQotI2RlZmluZSBTM0MyNDAwX0dQQ0RBVAkgICBTM0MyNDEwX0dQSU9SRUcoMHgxOCkKLSNkZWZpbmUgUzNDMjQwMF9HUENVUAkgICBTM0MyNDEwX0dQSU9SRUcoMHgxQykKLQogI2RlZmluZSBTM0MyNDEwX0dQQzBfTEVORAkoMHgwMiA8PCAwKQotI2RlZmluZSBTM0MyNDAwX0dQQzBfVkQwIAkoMHgwMiA8PCAwKQotCiAjZGVmaW5lIFMzQzI0MTBfR1BDMV9WQ0xLCSgweDAyIDw8IDIpCi0jZGVmaW5lIFMzQzI0MDBfR1BDMV9WRDEgCSgweDAyIDw8IDIpCi0KICNkZWZpbmUgUzNDMjQxMF9HUEMyX1ZMSU5FCSgweDAyIDw8IDQpCi0jZGVmaW5lIFMzQzI0MDBfR1BDMl9WRDIgIAkoMHgwMiA8PCA0KQotCiAjZGVmaW5lIFMzQzI0MTBfR1BDM19WRlJBTUUJKDB4MDIgPDwgNikKLSNkZWZpbmUgUzNDMjQwMF9HUEMzX1ZEMyAgIAkoMHgwMiA8PCA2KQotCiAjZGVmaW5lIFMzQzI0MTBfR1BDNF9WTQkJKDB4MDIgPDwgOCkKLSNkZWZpbmUgUzNDMjQwMF9HUEM0X1ZENAkoMHgwMiA8PCA4KQotCiAjZGVmaW5lIFMzQzI0MTBfR1BDNV9MQ0RWRjAJKDB4MDIgPDwgMTApCi0jZGVmaW5lIFMzQzI0MDBfR1BDNV9WRDUgICAJKDB4MDIgPDwgMTApCi0KICNkZWZpbmUgUzNDMjQxMF9HUEM2X0xDRFZGMQkoMHgwMiA8PCAxMikKLSNkZWZpbmUgUzNDMjQwMF9HUEM2X1ZENiAgIAkoMHgwMiA8PCAxMikKLQogI2RlZmluZSBTM0MyNDEwX0dQQzdfTENEVkYyCSgweDAyIDw8IDE0KQotI2RlZmluZSBTM0MyNDAwX0dQQzdfVkQ3ICAgCSgweDAyIDw8IDE0KQotCiAjZGVmaW5lIFMzQzI0MTBfR1BDOF9WRDAJKDB4MDIgPDwgMTYpCi0jZGVmaW5lIFMzQzI0MDBfR1BDOF9WRDgJKDB4MDIgPDwgMTYpCi0KICNkZWZpbmUgUzNDMjQxMF9HUEM5X1ZEMQkoMHgwMiA8PCAxOCkKLSNkZWZpbmUgUzNDMjQwMF9HUEM5X1ZEOQkoMHgwMiA8PCAxOCkKLQogI2RlZmluZSBTM0MyNDEwX0dQQzEwX1ZEMgkoMHgwMiA8PCAyMCkKLSNkZWZpbmUgUzNDMjQwMF9HUEMxMF9WRDEwCSgweDAyIDw8IDIwKQotCiAjZGVmaW5lIFMzQzI0MTBfR1BDMTFfVkQzCSgweDAyIDw8IDIyKQotI2RlZmluZSBTM0MyNDAwX0dQQzExX1ZEMTEJKDB4MDIgPDwgMjIpCi0KICNkZWZpbmUgUzNDMjQxMF9HUEMxMl9WRDQJKDB4MDIgPDwgMjQpCi0jZGVmaW5lIFMzQzI0MDBfR1BDMTJfVkQxMgkoMHgwMiA8PCAyNCkKLQogI2RlZmluZSBTM0MyNDEwX0dQQzEzX1ZENQkoMHgwMiA8PCAyNikKLSNkZWZpbmUgUzNDMjQwMF9HUEMxM19WRDEzCSgweDAyIDw8IDI2KQotCiAjZGVmaW5lIFMzQzI0MTBfR1BDMTRfVkQ2CSgweDAyIDw8IDI4KQotI2RlZmluZSBTM0MyNDAwX0dQQzE0X1ZEMTQJKDB4MDIgPDwgMjgpCi0KICNkZWZpbmUgUzNDMjQxMF9HUEMxNV9WRDcJKDB4MDIgPDwgMzApCi0jZGVmaW5lIFMzQzI0MDBfR1BDMTVfVkQxNQkoMHgwMiA8PCAzMCkKLQogI2RlZmluZSBTM0MyNDEwX0dQQ19QVVBESVMoeCkgICgxPDwoeCkpCiAKIC8qCkBAIC0yNjksOCArMTQ3LDYgQEAKICAqIGFsbW9zdCBpZGVudGljYWwgc2V0dXAgdG8gcG9ydCBiLCBidXQgdGhlIHNwZWNpYWwgZnVuY3Rpb25zIGFyZSBtb3N0bHkKICAqIHRvIGRvIHdpdGggdGhlIHZpZGVvIHN5c3RlbSdzIGRhdGEuCiAgKgotICogUzNDMjQwMDogUG9ydCBEIGNvbnNpc3RzIG9mIDExIEdQSU8vU3BlY2lhbCBmdW5jdGlvbgotICoKICAqIGFsbW9zdCBpZGVudGljYWwgc2V0dXAgdG8gcG9ydCBjCiAqLwogCkBAIC0yNzgsNDYgKzE1NCwzMSBAQAogI2RlZmluZSBTM0MyNDEwX0dQRERBVAkgICBTM0MyNDEwX0dQSU9SRUcoMHgzNCkKICNkZWZpbmUgUzNDMjQxMF9HUERVUAkgICBTM0MyNDEwX0dQSU9SRUcoMHgzOCkKIAotI2RlZmluZSBTM0MyNDAwX0dQRENPTgkgICBTM0MyNDEwX0dQSU9SRUcoMHgyMCkKLSNkZWZpbmUgUzNDMjQwMF9HUEREQVQJICAgUzNDMjQxMF9HUElPUkVHKDB4MjQpCi0jZGVmaW5lIFMzQzI0MDBfR1BEVVAJICAgUzNDMjQxMF9HUElPUkVHKDB4MjgpCi0KICNkZWZpbmUgUzNDMjQxMF9HUEQwX1ZEOAkoMHgwMiA8PCAwKQotI2RlZmluZSBTM0MyNDAwX0dQRDBfVkZSQU1FCSgweDAyIDw8IDApCiAjZGVmaW5lIFMzQzI0NDJfR1BEMF9uU1BJQ1MxCSgweDAzIDw8IDApCiAKICNkZWZpbmUgUzNDMjQxMF9HUEQxX1ZEOQkoMHgwMiA8PCAyKQotI2RlZmluZSBTM0MyNDAwX0dQRDFfVk0JCSgweDAyIDw8IDIpCiAjZGVmaW5lIFMzQzI0NDJfR1BEMV9TUElDTEsxCSgweDAzIDw8IDIpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEQyX1ZEMTAJKDB4MDIgPDwgNCkKLSNkZWZpbmUgUzNDMjQwMF9HUEQyX1ZMSU5FCSgweDAyIDw8IDQpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEQzX1ZEMTEJKDB4MDIgPDwgNikKLSNkZWZpbmUgUzNDMjQwMF9HUEQzX1ZDTEsJKDB4MDIgPDwgNikKIAogI2RlZmluZSBTM0MyNDEwX0dQRDRfVkQxMgkoMHgwMiA8PCA4KQotI2RlZmluZSBTM0MyNDAwX0dQRDRfTEVORAkoMHgwMiA8PCA4KQogCiAjZGVmaW5lIFMzQzI0MTBfR1BENV9WRDEzCSgweDAyIDw8IDEwKQotI2RlZmluZSBTM0MyNDAwX0dQRDVfVE9VVDAJKDB4MDIgPDwgMTApCiAKICNkZWZpbmUgUzNDMjQxMF9HUEQ2X1ZEMTQJKDB4MDIgPDwgMTIpCi0jZGVmaW5lIFMzQzI0MDBfR1BENl9UT1VUMQkoMHgwMiA8PCAxMikKIAogI2RlZmluZSBTM0MyNDEwX0dQRDdfVkQxNQkoMHgwMiA8PCAxNCkKLSNkZWZpbmUgUzNDMjQwMF9HUEQ3X1RPVVQyCSgweDAyIDw8IDE0KQogCiAjZGVmaW5lIFMzQzI0MTBfR1BEOF9WRDE2CSgweDAyIDw8IDE2KQotI2RlZmluZSBTM0MyNDAwX0dQRDhfVE9VVDMJKDB4MDIgPDwgMTYpCiAjZGVmaW5lIFMzQzI0NDBfR1BEOF9TUElNSVNPMQkoMHgwMyA8PCAxNikKIAogI2RlZmluZSBTM0MyNDEwX0dQRDlfVkQxNwkoMHgwMiA8PCAxOCkKLSNkZWZpbmUgUzNDMjQwMF9HUEQ5X1RDTEswCSgweDAyIDw8IDE4KQogI2RlZmluZSBTM0MyNDQwX0dQRDlfU1BJTU9TSTEJKDB4MDMgPDwgMTgpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEQxMF9WRDE4CSgweDAyIDw8IDIwKQotI2RlZmluZSBTM0MyNDAwX0dQRDEwX25XQUlUCSgweDAyIDw8IDIwKQogI2RlZmluZSBTM0MyNDQwX0dQRDEwX1NQSUNMSzEJKDB4MDMgPDwgMjApCiAKICNkZWZpbmUgUzNDMjQxMF9HUEQxMV9WRDE5CSgweDAyIDw8IDIyKQpAQCAtMzQwLDkgKzIwMSw2IEBACiAgKiBhZ2FpbiwgdGhlIHNhbWUgYXMgcG9ydCBCLCBidXQgZGVhbGluZyB3aXRoIEkyUywgU0RJLCBhbmQKICAqIG1vcmUgbWlzY2VsbGFuZW91cyBmdW5jdGlvbnMKICAqCi0gKiBTM0MyNDAwOgotICogUG9ydCBFIGNvbnNpc3RzIG9mIDEyIEdQSU8vU3BlY2lhbCBmdW5jdGlvbgotICoKICAqIEdQSU8gLyBpbnRlcnJ1cHQgaW5wdXRzCiAqLwogCkBAIC0zNTAsNzQgKzIwOCw1MSBAQAogI2RlZmluZSBTM0MyNDEwX0dQRURBVAkgICBTM0MyNDEwX0dQSU9SRUcoMHg0NCkKICNkZWZpbmUgUzNDMjQxMF9HUEVVUAkgICBTM0MyNDEwX0dQSU9SRUcoMHg0OCkKIAotI2RlZmluZSBTM0MyNDAwX0dQRUNPTgkgICBTM0MyNDEwX0dQSU9SRUcoMHgyQykKLSNkZWZpbmUgUzNDMjQwMF9HUEVEQVQJICAgUzNDMjQxMF9HUElPUkVHKDB4MzApCi0jZGVmaW5lIFMzQzI0MDBfR1BFVVAJICAgUzNDMjQxMF9HUElPUkVHKDB4MzQpCi0KICNkZWZpbmUgUzNDMjQxMF9HUEUwX0kyU0xSQ0sgICAoMHgwMiA8PCAwKQogI2RlZmluZSBTM0MyNDQzX0dQRTBfQUNfblJFU0VUICgweDAzIDw8IDApCi0jZGVmaW5lIFMzQzI0MDBfR1BFMF9FSU5UMCAgICAgKDB4MDIgPDwgMCkKICNkZWZpbmUgUzNDMjQxMF9HUEUwX01BU0sgICAgICAoMHgwMyA8PCAwKQogCiAjZGVmaW5lIFMzQzI0MTBfR1BFMV9JMlNTQ0xLICAgKDB4MDIgPDwgMikKICNkZWZpbmUgUzNDMjQ0M19HUEUxX0FDX1NZTkMgICAoMHgwMyA8PCAyKQotI2RlZmluZSBTM0MyNDAwX0dQRTFfRUlOVDEgICAgICgweDAyIDw8IDIpCi0jZGVmaW5lIFMzQzI0MDBfR1BFMV9uU1MgICAgICAgKDB4MDMgPDwgMikKICNkZWZpbmUgUzNDMjQxMF9HUEUxX01BU0sgICAgICAoMHgwMyA8PCAyKQogCiAjZGVmaW5lIFMzQzI0MTBfR1BFMl9DRENMSyAgICAgKDB4MDIgPDwgNCkKICNkZWZpbmUgUzNDMjQ0M19HUEUyX0FDX0JJVENMSyAoMHgwMyA8PCA0KQotI2RlZmluZSBTM0MyNDAwX0dQRTJfRUlOVDIgICAgICgweDAyIDw8IDQpCi0jZGVmaW5lIFMzQzI0MDBfR1BFMl9JMlNTREkgICAgKDB4MDMgPDwgNCkKIAogI2RlZmluZSBTM0MyNDEwX0dQRTNfSTJTU0RJICAgICgweDAyIDw8IDYpCiAjZGVmaW5lIFMzQzI0NDNfR1BFM19BQ19TREkgICAgKDB4MDMgPDwgNikKLSNkZWZpbmUgUzNDMjQwMF9HUEUzX0VJTlQzICAgICAoMHgwMiA8PCA2KQotI2RlZmluZSBTM0MyNDAwX0dQRTNfbkNUUzEgICAgICgweDAzIDw8IDYpCiAjZGVmaW5lIFMzQzI0MTBfR1BFM19uU1MwICAgICAgKDB4MDMgPDwgNikKICNkZWZpbmUgUzNDMjQxMF9HUEUzX01BU0sgICAgICAoMHgwMyA8PCA2KQogCiAjZGVmaW5lIFMzQzI0MTBfR1BFNF9JMlNTRE8gICAgKDB4MDIgPDwgOCkKICNkZWZpbmUgUzNDMjQ0M19HUEU0X0FDX1NETyAgICAoMHgwMyA8PCA4KQotI2RlZmluZSBTM0MyNDAwX0dQRTRfRUlOVDQgICAgICgweDAyIDw8IDgpCi0jZGVmaW5lIFMzQzI0MDBfR1BFNF9uUlRTMSAgICAgKDB4MDMgPDwgOCkKICNkZWZpbmUgUzNDMjQxMF9HUEU0X0kyU1NESSAgICAoMHgwMyA8PCA4KQogI2RlZmluZSBTM0MyNDEwX0dQRTRfTUFTSyAgICAgICgweDAzIDw8IDgpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEU1X1NEQ0xLICAgICAoMHgwMiA8PCAxMCkKICNkZWZpbmUgUzNDMjQ0M19HUEU1X1NEMV9DTEsgICAoMHgwMiA8PCAxMCkKLSNkZWZpbmUgUzNDMjQwMF9HUEU1X0VJTlQ1ICAgICAoMHgwMiA8PCAxMCkKLSNkZWZpbmUgUzNDMjQwMF9HUEU1X1RDTEsxICAgICAoMHgwMyA8PCAxMCkKICNkZWZpbmUgUzNDMjQ0M19HUEU1X0FDX0JJVENMSyAoMHgwMyA8PCAxMCkKIAogI2RlZmluZSBTM0MyNDEwX0dQRTZfU0RDTUQgICAgICgweDAyIDw8IDEyKQogI2RlZmluZSBTM0MyNDQzX0dQRTZfU0QxX0NNRCAgICgweDAyIDw8IDEyKQogI2RlZmluZSBTM0MyNDQzX0dQRTZfQUNfU0RJICAgICgweDAzIDw8IDEyKQotI2RlZmluZSBTM0MyNDAwX0dQRTZfRUlOVDYgICAgICgweDAyIDw8IDEyKQogCiAjZGVmaW5lIFMzQzI0MTBfR1BFN19TRERBVDAgICAgKDB4MDIgPDwgMTQpCiAjZGVmaW5lIFMzQzI0NDNfR1BFNV9TRDFfREFUMCAgKDB4MDIgPDwgMTQpCiAjZGVmaW5lIFMzQzI0NDNfR1BFN19BQ19TRE8gICAgKDB4MDMgPDwgMTQpCi0jZGVmaW5lIFMzQzI0MDBfR1BFN19FSU5UNyAgICAgKDB4MDIgPDwgMTQpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEU4X1NEREFUMSAgICAoMHgwMiA8PCAxNikKICNkZWZpbmUgUzNDMjQ0M19HUEU4X1NEMV9EQVQxICAoMHgwMiA8PCAxNikKICNkZWZpbmUgUzNDMjQ0M19HUEU4X0FDX1NZTkMgICAoMHgwMyA8PCAxNikKLSNkZWZpbmUgUzNDMjQwMF9HUEU4X25YREFDSzAgICAoMHgwMiA8PCAxNikKIAogI2RlZmluZSBTM0MyNDEwX0dQRTlfU0REQVQyICAgICgweDAyIDw8IDE4KQogI2RlZmluZSBTM0MyNDQzX0dQRTlfU0QxX0RBVDIgICgweDAyIDw8IDE4KQogI2RlZmluZSBTM0MyNDQzX0dQRTlfQUNfblJFU0VUICgweDAzIDw8IDE4KQotI2RlZmluZSBTM0MyNDAwX0dQRTlfblhEQUNLMSAgICgweDAyIDw8IDE4KQotI2RlZmluZSBTM0MyNDAwX0dQRTlfblhCQUNLICAgICgweDAzIDw8IDE4KQogCiAjZGVmaW5lIFMzQzI0MTBfR1BFMTBfU0REQVQzICAgKDB4MDIgPDwgMjApCiAjZGVmaW5lIFMzQzI0NDNfR1BFMTBfU0QxX0RBVDMgKDB4MDIgPDwgMjApCi0jZGVmaW5lIFMzQzI0MDBfR1BFMTBfblhEUkVRMCAgKDB4MDIgPDwgMjApCiAKICNkZWZpbmUgUzNDMjQxMF9HUEUxMV9TUElNSVNPMCAoMHgwMiA8PCAyMikKLSNkZWZpbmUgUzNDMjQwMF9HUEUxMV9uWERSRVExICAoMHgwMiA8PCAyMikKLSNkZWZpbmUgUzNDMjQwMF9HUEUxMV9uWEJSRVEgICAoMHgwMyA8PCAyMikKIAogI2RlZmluZSBTM0MyNDEwX0dQRTEyX1NQSU1PU0kwICgweDAyIDw8IDI0KQogCkBAIC00NDcsOSArMjgyLDYgQEAKICAqCiAgKiBwdWxsIHVwIHdvcmtzIGxpa2UgYWxsIG90aGVyIHBvcnRzLgogICoKLSAqIFMzQzI0MDA6Ci0gKiBQb3J0IEYgY29uc2lzdHMgb2YgNyBHUElPL1NwZWNpYWwgZnVuY3Rpb24KLSAqCiAgKiBHUElPL3NlcmlhbC9taXNjIHBpbnMKICovCiAKQEAgLTQ1NywzNyArMjg5LDE0IEBACiAjZGVmaW5lIFMzQzI0MTBfR1BGREFUCSAgIFMzQzI0MTBfR1BJT1JFRygweDU0KQogI2RlZmluZSBTM0MyNDEwX0dQRlVQCSAgIFMzQzI0MTBfR1BJT1JFRygweDU4KQogCi0jZGVmaW5lIFMzQzI0MDBfR1BGQ09OCSAgIFMzQzI0MTBfR1BJT1JFRygweDM4KQotI2RlZmluZSBTM0MyNDAwX0dQRkRBVAkgICBTM0MyNDEwX0dQSU9SRUcoMHgzQykKLSNkZWZpbmUgUzNDMjQwMF9HUEZVUAkgICBTM0MyNDEwX0dQSU9SRUcoMHg0MCkKLQogI2RlZmluZSBTM0MyNDEwX0dQRjBfRUlOVDAgICgweDAyIDw8IDApCi0jZGVmaW5lIFMzQzI0MDBfR1BGMF9SWEQwICAgKDB4MDIgPDwgMCkKLQogI2RlZmluZSBTM0MyNDEwX0dQRjFfRUlOVDEgICgweDAyIDw8IDIpCi0jZGVmaW5lIFMzQzI0MDBfR1BGMV9SWEQxICAgKDB4MDIgPDwgMikKLSNkZWZpbmUgUzNDMjQwMF9HUEYxX0lJQ1NEQSAoMHgwMyA8PCAyKQotCiAjZGVmaW5lIFMzQzI0MTBfR1BGMl9FSU5UMiAgKDB4MDIgPDwgNCkKLSNkZWZpbmUgUzNDMjQwMF9HUEYyX1RYRDAgICAoMHgwMiA8PCA0KQotCiAjZGVmaW5lIFMzQzI0MTBfR1BGM19FSU5UMyAgKDB4MDIgPDwgNikKLSNkZWZpbmUgUzNDMjQwMF9HUEYzX1RYRDEgICAoMHgwMiA8PCA2KQotI2RlZmluZSBTM0MyNDAwX0dQRjNfSUlDU0NMICgweDAzIDw8IDYpCi0KICNkZWZpbmUgUzNDMjQxMF9HUEY0X0VJTlQ0ICAoMHgwMiA8PCA4KQotI2RlZmluZSBTM0MyNDAwX0dQRjRfblJUUzAgICgweDAyIDw8IDgpCi0jZGVmaW5lIFMzQzI0MDBfR1BGNF9uWEJBQ0sgKDB4MDMgPDwgOCkKLQogI2RlZmluZSBTM0MyNDEwX0dQRjVfRUlOVDUgICgweDAyIDw8IDEwKQotI2RlZmluZSBTM0MyNDAwX0dQRjVfbkNUUzAgICgweDAyIDw8IDEwKQotI2RlZmluZSBTM0MyNDAwX0dQRjVfblhCUkVRICgweDAzIDw8IDEwKQotCiAjZGVmaW5lIFMzQzI0MTBfR1BGNl9FSU5UNiAgKDB4MDIgPDwgMTIpCi0jZGVmaW5lIFMzQzI0MDBfR1BGNl9DTEtPVVQgKDB4MDIgPDwgMTIpCi0KICNkZWZpbmUgUzNDMjQxMF9HUEY3X0VJTlQ3ICAoMHgwMiA8PCAxNCkKLQogI2RlZmluZSBTM0MyNDEwX0dQRl9QVVBESVMoeCkgICgxPDwoeCkpCiAKIC8qIFMzQzI0MTA6CkBAIC00OTcsNjIgKzMwNiwzOCBAQAogICogICAwMCA9IDAgaW5wdXQsIDEgb3V0cHV0LCAyIGludGVycnVwdCAoRUlOVDAuLjcpLCAzIHNwZWNpYWwgZnVuYwogICoKICAqIHB1bGwgdXAgd29ya3MgbGlrZSBhbGwgb3RoZXIgcG9ydHMuCi0gKgotICogUzNDMjQwMDoKLSAqIFBvcnQgRyBjb25zaXN0cyBvZiAxMCBHUElPL1NwZWNpYWwgZnVuY3Rpb24KICovCiAKICNkZWZpbmUgUzNDMjQxMF9HUEdDT04JICAgUzNDMjQxMF9HUElPUkVHKDB4NjApCiAjZGVmaW5lIFMzQzI0MTBfR1BHREFUCSAgIFMzQzI0MTBfR1BJT1JFRygweDY0KQogI2RlZmluZSBTM0MyNDEwX0dQR1VQCSAgIFMzQzI0MTBfR1BJT1JFRygweDY4KQogCi0jZGVmaW5lIFMzQzI0MDBfR1BHQ09OCSAgIFMzQzI0MTBfR1BJT1JFRygweDQ0KQotI2RlZmluZSBTM0MyNDAwX0dQR0RBVAkgICBTM0MyNDEwX0dQSU9SRUcoMHg0OCkKLSNkZWZpbmUgUzNDMjQwMF9HUEdVUAkgICBTM0MyNDEwX0dQSU9SRUcoMHg0QykKLQogI2RlZmluZSBTM0MyNDEwX0dQRzBfRUlOVDggICAgKDB4MDIgPDwgMCkKLSNkZWZpbmUgUzNDMjQwMF9HUEcwX0kyU0xSQ0sgICgweDAyIDw8IDApCiAKICNkZWZpbmUgUzNDMjQxMF9HUEcxX0VJTlQ5ICAgICgweDAyIDw8IDIpCi0jZGVmaW5lIFMzQzI0MDBfR1BHMV9JMlNTQ0xLICAoMHgwMiA8PCAyKQogCiAjZGVmaW5lIFMzQzI0MTBfR1BHMl9FSU5UMTAgICAoMHgwMiA8PCA0KQogI2RlZmluZSBTM0MyNDEwX0dQRzJfblNTMCAgICAgKDB4MDMgPDwgNCkKLSNkZWZpbmUgUzNDMjQwMF9HUEcyX0NEQ0xLICAgICgweDAyIDw8IDQpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEczX0VJTlQxMSAgICgweDAyIDw8IDYpCiAjZGVmaW5lIFMzQzI0MTBfR1BHM19uU1MxICAgICAoMHgwMyA8PCA2KQotI2RlZmluZSBTM0MyNDAwX0dQRzNfSTJTU0RPICAgKDB4MDIgPDwgNikKLSNkZWZpbmUgUzNDMjQwMF9HUEczX0kyU1NESSAgICgweDAzIDw8IDYpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEc0X0VJTlQxMiAgICgweDAyIDw8IDgpCi0jZGVmaW5lIFMzQzI0MDBfR1BHNF9NTUNDTEsgICAoMHgwMiA8PCA4KQotI2RlZmluZSBTM0MyNDAwX0dQRzRfSTJTU0RJICAgKDB4MDMgPDwgOCkKICNkZWZpbmUgUzNDMjQxMF9HUEc0X0xDRFBXUkVOICgweDAzIDw8IDgpCiAjZGVmaW5lIFMzQzI0NDNfR1BHNF9MQ0RQV1JETiAoMHgwMyA8PCA4KQogCiAjZGVmaW5lIFMzQzI0MTBfR1BHNV9FSU5UMTMgICAoMHgwMiA8PCAxMCkKLSNkZWZpbmUgUzNDMjQwMF9HUEc1X01NQ0NNRCAgICgweDAyIDw8IDEwKQotI2RlZmluZSBTM0MyNDAwX0dQRzVfSUlDU0RBICAgKDB4MDMgPDwgMTApCiAjZGVmaW5lIFMzQzI0MTBfR1BHNV9TUElNSVNPMSAoMHgwMyA8PCAxMCkJLyogbm90IHMzYzI0NDMgKi8KIAogI2RlZmluZSBTM0MyNDEwX0dQRzZfRUlOVDE0ICAgKDB4MDIgPDwgMTIpCi0jZGVmaW5lIFMzQzI0MDBfR1BHNl9NTUNEQVQgICAoMHgwMiA8PCAxMikKLSNkZWZpbmUgUzNDMjQwMF9HUEc2X0lJQ1NDTCAgICgweDAzIDw8IDEyKQogI2RlZmluZSBTM0MyNDEwX0dQRzZfU1BJTU9TSTEgKDB4MDMgPDwgMTIpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEc3X0VJTlQxNSAgICgweDAyIDw8IDE0KQogI2RlZmluZSBTM0MyNDEwX0dQRzdfU1BJQ0xLMSAgKDB4MDMgPDwgMTQpCi0jZGVmaW5lIFMzQzI0MDBfR1BHN19TUElNSVNPICAoMHgwMiA8PCAxNCkKLSNkZWZpbmUgUzNDMjQwMF9HUEc3X0lJQ1NEQSAgICgweDAzIDw8IDE0KQogCiAjZGVmaW5lIFMzQzI0MTBfR1BHOF9FSU5UMTYgICAoMHgwMiA8PCAxNikKLSNkZWZpbmUgUzNDMjQwMF9HUEc4X1NQSU1PU0kgICgweDAyIDw8IDE2KQotI2RlZmluZSBTM0MyNDAwX0dQRzhfSUlDU0NMICAgKDB4MDMgPDwgMTYpCiAKICNkZWZpbmUgUzNDMjQxMF9HUEc5X0VJTlQxNyAgICgweDAyIDw8IDE4KQotI2RlZmluZSBTM0MyNDAwX0dQRzlfU1BJQ0xLICAgKDB4MDIgPDwgMTgpCi0jZGVmaW5lIFMzQzI0MDBfR1BHOV9NTUNDTEsgICAoMHgwMyA8PCAxOCkKIAogI2RlZmluZSBTM0MyNDEwX0dQRzEwX0VJTlQxOCAgKDB4MDIgPDwgMjApCiAKQEAgLTY2MCw3ICs0NDUsNiBAQAogI2RlZmluZSBTM0MyNDQzX0dQTVVQCSAgIFMzQzI0MTBfR1BJT1JFRygweDEwOCkKIAogLyogbWlzY2VsbGFuZW91cyBjb250cm9sICovCi0jZGVmaW5lIFMzQzI0MDBfTUlTQ0NSCSAgIFMzQzI0MTBfR1BJT1JFRygweDU0KQogI2RlZmluZSBTM0MyNDEwX01JU0NDUgkgICBTM0MyNDEwX0dQSU9SRUcoMHg4MCkKICNkZWZpbmUgUzNDMjQxMF9EQ0xLQ09OCSAgIFMzQzI0MTBfR1BJT1JFRygweDg0KQogCkBAIC02NzQsMTQgKzQ1OCw2IEBACiAjZGVmaW5lIFMzQzI0MTBfTUlTQ0NSX1NQVUNSX0xFTiAgICAoMDw8MSkKICNkZWZpbmUgUzNDMjQxMF9NSVNDQ1JfU1BVQ1JfTERJUyAgICgxPDwxKQogCi0jZGVmaW5lIFMzQzI0MDBfTUlTQ0NSX1NQVUNSX0xFTiAgICAoMDw8MCkKLSNkZWZpbmUgUzNDMjQwMF9NSVNDQ1JfU1BVQ1JfTERJUyAgICgxPDwwKQotI2RlZmluZSBTM0MyNDAwX01JU0NDUl9TUFVDUl9IRU4gICAgKDA8PDEpCi0jZGVmaW5lIFMzQzI0MDBfTUlTQ0NSX1NQVUNSX0hESVMgICAoMTw8MSkKLQotI2RlZmluZSBTM0MyNDAwX01JU0NDUl9IWl9TVE9QRU4gICAgKDA8PDIpCi0jZGVmaW5lIFMzQzI0MDBfTUlTQ0NSX0haX1NUT1BQUkVWICAoMTw8MikKLQogI2RlZmluZSBTM0MyNDEwX01JU0NDUl9VU0JERVYJICAgICgwPDwzKQogI2RlZmluZSBTM0MyNDEwX01JU0NDUl9VU0JIT1NUCSAgICAoMTw8MykKIApAQCAtNzI4LDcgKzUwNCw2IEBACiAgKgogICogU2Ftc3VuZyBkYXRhc2hlZXQgcDktMjUKICovCi0jZGVmaW5lIFMzQzI0MDBfRVhUSU5UMCAgICBTM0MyNDEwX0dQSU9SRUcoMHg1OCkKICNkZWZpbmUgUzNDMjQxMF9FWFRJTlQwCSAgIFMzQzI0MTBfR1BJT1JFRygweDg4KQogI2RlZmluZSBTM0MyNDEwX0VYVElOVDEJICAgUzNDMjQxMF9HUElPUkVHKDB4OEMpCiAjZGVmaW5lIFMzQzI0MTBfRVhUSU5UMgkgICBTM0MyNDEwX0dQSU9SRUcoMHg5MCkKQEAgLTc5NiwyMiArNTcxLDYgQEAKICNkZWZpbmUgUzNDMjQxMF9HU1RBVFVTMl9PRkZSRVNFVCAgKDE8PDEpCiAjZGVmaW5lIFMzQzI0MTBfR1NUQVRVUzJfUE9OUkVTRVQgICgxPDwwKQogCi0vKiBvcGVuIGRyYWluIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUzNDMjQwMF9PUEVOQ1IgICAgIFMzQzI0MTBfR1BJT1JFRygweDUwKQotCi0jZGVmaW5lIFMzQzI0MDBfT1BFTkNSX09QQ19SWEQxRElTICAoMDw8MCkKLSNkZWZpbmUgUzNDMjQwMF9PUEVOQ1JfT1BDX1JYRDFFTiAgICgxPDwwKQotI2RlZmluZSBTM0MyNDAwX09QRU5DUl9PUENfVFhEMURJUyAgKDA8PDEpCi0jZGVmaW5lIFMzQzI0MDBfT1BFTkNSX09QQ19UWEQxRU4gICAoMTw8MSkKLSNkZWZpbmUgUzNDMjQwMF9PUEVOQ1JfT1BDX0NNRERJUyAgICgwPDwyKQotI2RlZmluZSBTM0MyNDAwX09QRU5DUl9PUENfQ01ERU4gICAgKDE8PDIpCi0jZGVmaW5lIFMzQzI0MDBfT1BFTkNSX09QQ19EQVRESVMgICAoMDw8MykKLSNkZWZpbmUgUzNDMjQwMF9PUEVOQ1JfT1BDX0RBVEVOICAgICgxPDwzKQotI2RlZmluZSBTM0MyNDAwX09QRU5DUl9PUENfTUlTT0RJUyAgKDA8PDQpCi0jZGVmaW5lIFMzQzI0MDBfT1BFTkNSX09QQ19NSVNPRU4gICAoMTw8NCkKLSNkZWZpbmUgUzNDMjQwMF9PUEVOQ1JfT1BDX01PU0lESVMgICgwPDw1KQotI2RlZmluZSBTM0MyNDAwX09QRU5DUl9PUENfTU9TSUVOICAgKDE8PDUpCi0KIC8qIDI0MTIvMjQxMyBzbGVlcCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLwogCiAjZGVmaW5lIFMzQzI0MTJfR1BCU0xQQ09OCVMzQzI0MTBfR1BJT1JFRygweDFDKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9yZWdzLW1lbS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9yZWdzLW1lbS5oCmluZGV4IDk4OGE2ODYuLmUwYzY3YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy1tZW0uaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3MtbWVtLmgKQEAgLTE0NSwyOSArMTQ1LDggQEAKICNkZWZpbmUgUzNDMjQxMF9CQU5LQ09OX1RhY3NfU0hJRlQJKDEzKQogCiAjZGVmaW5lIFMzQzI0MTBfQkFOS0NPTl9TUkFNCQkoMHgwIDw8IDE1KQotI2RlZmluZSBTM0MyNDAwX0JBTktDT05fRURPRFJBTQkJKDB4MiA8PCAxNSkKICNkZWZpbmUgUzNDMjQxMF9CQU5LQ09OX1NEUkFNCQkoMHgzIDw8IDE1KQogCi0vKiBuZXh0IGJpdHMgb25seSBmb3IgRURPIERSQU0gaW4gNiw3ICovCi0jZGVmaW5lIFMzQzI0MDBfQkFOS0NPTl9FRE9fVHJjZDEgICAgICAoMHgwMCA8PCA0KQotI2RlZmluZSBTM0MyNDAwX0JBTktDT05fRURPX1RyY2QyICAgICAgKDB4MDEgPDwgNCkKLSNkZWZpbmUgUzNDMjQwMF9CQU5LQ09OX0VET19UcmNkMyAgICAgICgweDAyIDw8IDQpCi0jZGVmaW5lIFMzQzI0MDBfQkFOS0NPTl9FRE9fVHJjZDQgICAgICAoMHgwMyA8PCA0KQotCi0vKiBDQVMgcHVsc2Ugd2lkdGggKi8KLSNkZWZpbmUgUzNDMjQwMF9CQU5LQ09OX0VET19QVUxTRTEgICAgICgweDAwIDw8IDMpCi0jZGVmaW5lIFMzQzI0MDBfQkFOS0NPTl9FRE9fUFVMU0UyICAgICAoMHgwMSA8PCAzKQotCi0vKiBDQVMgcHJlLWNoYXJnZSAqLwotI2RlZmluZSBTM0MyNDAwX0JBTktDT05fRURPX1RDUDEgICAgICAgKDB4MDAgPDwgMikKLSNkZWZpbmUgUzNDMjQwMF9CQU5LQ09OX0VET19UQ1AyICAgICAgICgweDAxIDw8IDIpCi0KLS8qIGNvbnRyb2wgY29sdW1uIGFkZHJlc3Mgc2VsZWN0ICovCi0jZGVmaW5lIFMzQzI0MDBfQkFOS0NPTl9FRE9fU0NBTmI4ICAgICAoMHgwMCA8PCAwKQotI2RlZmluZSBTM0MyNDAwX0JBTktDT05fRURPX1NDQU5iOSAgICAgKDB4MDEgPDwgMCkKLSNkZWZpbmUgUzNDMjQwMF9CQU5LQ09OX0VET19TQ0FOYjEwICAgICgweDAyIDw8IDApCi0jZGVmaW5lIFMzQzI0MDBfQkFOS0NPTl9FRE9fU0NBTmIxMSAgICAoMHgwMyA8PCAwKQotCiAvKiBuZXh0IGJpdHMgb25seSBmb3IgU0RSQU0gaW4gNiw3ICovCiAjZGVmaW5lIFMzQzI0MTBfQkFOS0NPTl9UcmNkMgkJKDB4MDAgPDwgMikKICNkZWZpbmUgUzNDMjQxMF9CQU5LQ09OX1RyY2QzCQkoMHgwMSA8PCAyKQpAQCAtMTk0LDEyICsxNzMsNiBAQAogI2RlZmluZSBTM0MyNDEwX1JFRlJFU0hfVFJQXzNjbGsJKDE8PDIwKQogI2RlZmluZSBTM0MyNDEwX1JFRlJFU0hfVFJQXzRjbGsJKDI8PDIwKQogCi0jZGVmaW5lIFMzQzI0MDBfUkVGUkVTSF9EUkFNX1RSUF9NQVNLICAgKDM8PDIwKQotI2RlZmluZSBTM0MyNDAwX1JFRlJFU0hfRFJBTV9UUlBfMV81Y2xrICgwPDwyMCkKLSNkZWZpbmUgUzNDMjQwMF9SRUZSRVNIX0RSQU1fVFJQXzJfNWNsayAoMTw8MjApCi0jZGVmaW5lIFMzQzI0MDBfUkVGUkVTSF9EUkFNX1RSUF8zXzVjbGsgKDI8PDIwKQotI2RlZmluZSBTM0MyNDAwX1JFRlJFU0hfRFJBTV9UUlBfNF81Y2xrICgzPDwyMCkKLQogI2RlZmluZSBTM0MyNDEwX1JFRlJFU0hfVFNSQ19NQVNLCSgzPDwxOCkKICNkZWZpbmUgUzNDMjQxMF9SRUZSRVNIX1RTUkNfNGNsawkoMDw8MTgpCiAjZGVmaW5lIFMzQzI0MTBfUkVGUkVTSF9UU1JDXzVjbGsJKDE8PDE4KQpAQCAtMjIyLDcgKzE5NSw2IEBACiAjZGVmaW5lIFMzQzI0MTBfQkFOS1NJWkVfNE0JCSgweDUgPDwgMCkKICNkZWZpbmUgUzNDMjQxMF9CQU5LU0laRV8yTQkJKDB4NCA8PCAwKQogI2RlZmluZSBTM0MyNDEwX0JBTktTSVpFX01BU0sJCSgweDcgPDwgMCkKLSNkZWZpbmUgUzNDMjQwMF9CQU5LU0laRV9NQVNLICAgICAgICAgICAoMHg0IDw8IDApCiAjZGVmaW5lIFMzQzI0MTBfQkFOS1NJWkVfU0NMS19FTgkoMTw8NCkKICNkZWZpbmUgUzNDMjQxMF9CQU5LU0laRV9TQ0tFX0VOCSgxPDw1KQogI2RlZmluZSBTM0MyNDEwX0JBTktTSVpFX0JVUlNUCQkoMTw8NykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3BpLWdwaW8uaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3BpLWdwaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlZjIyOC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS1ncGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS1ncGlvLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogUzNDMjQxMCAtIFNQSSBDb250cm9sbGVyIHBsYXRmb3JtX2RldmljZSBpbmZvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9TUElHUElPX0gKLSNkZWZpbmUgX19BU01fQVJDSF9TUElHUElPX0ggX19GSUxFX18KLQotc3RydWN0IHMzYzI0MTBfc3BpZ3Bpb19pbmZvIHsKLQl1bnNpZ25lZCBsb25nCQkgcGluX2NsazsKLQl1bnNpZ25lZCBsb25nCQkgcGluX21vc2k7Ci0JdW5zaWduZWQgbG9uZwkJIHBpbl9taXNvOwotCi0JaW50CQkJIG51bV9jaGlwc2VsZWN0OwotCWludAkJCSBidXNfbnVtOwotCi0Jdm9pZCAoKmNoaXBfc2VsZWN0KShzdHJ1Y3QgczNjMjQxMF9zcGlncGlvX2luZm8gKnNwaSwgaW50IGNzKTsKLX07Ci0KLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfU1BJR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NTQxMjkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqCi0qLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotI2luY2x1ZGUgPHBsYXQvcG0uaD4KLQotc3RydWN0IHN5c2NvcmVfb3BzIHMzYzI0eHhfaXJxX3N5c2NvcmVfb3BzID0gewotCS5zdXNwZW5kCT0gczNjMjR4eF9pcnFfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHMzYzI0eHhfaXJxX3Jlc3VtZSwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1xdDI0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXF0MjQxMC5jCmluZGV4IGU4ZjQ5ZmUuLmY0NGY3NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXF0MjQxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXF0MjQxMC5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KQEAgLTUzLDggKzUzLDYgQEAKICNpbmNsdWRlIDxtYWNoL2ZiLmg+CiAjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CiAjaW5jbHVkZSA8cGxhdC91ZGMuaD4KLSNpbmNsdWRlIDxtYWNoL3NwaS5oPgotI2luY2x1ZGUgPG1hY2gvc3BpLWdwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2lpYy5oPgogCiAjaW5jbHVkZSA8cGxhdC9jb21tb24tc21kay5oPgpAQCAtMjE2LDMyICsyMTQsMTYgQEAKIAogLyogU1BJICovCiAKLXN0YXRpYyB2b2lkIHNwaV9ncGlvX2NzKHN0cnVjdCBzM2MyNDEwX3NwaWdwaW9faW5mbyAqc3BpLCBpbnQgY3MpCi17Ci0Jc3dpdGNoIChjcykgewotCWNhc2UgQklUQkFOR19DU19BQ1RJVkU6Ci0JCWdwaW9fc2V0X3ZhbHVlKFMzQzI0MTBfR1BCKDUpLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBCSVRCQU5HX0NTX0lOQUNUSVZFOgotCQlncGlvX3NldF92YWx1ZShTM0MyNDEwX0dQQig1KSwgMSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3NwaWdwaW9faW5mbyBzcGlfZ3Bpb19jZmcgPSB7Ci0JLnBpbl9jbGsJPSBTM0MyNDEwX0dQRyg3KSwKLQkucGluX21vc2kJPSBTM0MyNDEwX0dQRyg2KSwKLQkucGluX21pc28JPSBTM0MyNDEwX0dQRyg1KSwKLQkuY2hpcF9zZWxlY3QJPSAmc3BpX2dwaW9fY3MsCitzdGF0aWMgc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEgc3BpX2dwaW9fY2ZnID0geworCS5zY2sJCT0gUzNDMjQxMF9HUEcoNyksCisJLm1vc2kJCT0gUzNDMjQxMF9HUEcoNiksCisJLm1pc28JCT0gUzNDMjQxMF9HUEcoNSksCiB9OwogCi0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHF0MjQxMF9zcGkgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjR4eC1zcGktZ3BpbyIsCi0JLmlkCQkgID0gMSwKLQkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZzcGlfZ3Bpb19jZmcsCi0JfSwKKwkubmFtZQkJPSAic3BpLWdwaW8iLAorCS5pZAkJPSAxLAorCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZzcGlfZ3Bpb19jZmcsCiB9OwogCiAvKiBCb2FyZCBkZXZpY2VzICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9LY29uZmlnCmluZGV4IGU4MmFiNGEuLmMyY2Y0ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9LY29uZmlnCkBAIC0xNSw3ICsxNSw3IEBACiAKIGNvbmZpZyBDUFVfUzNDMjQxMl9PTkxZCiAJYm9vbAotCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwICYmICFDUFVfUzNDMjQwMCAmJiAhQ1BVX1MzQzI0MTAgJiYgXAorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwICYmICFDUFVfUzNDMjQxMCAmJiBcCiAJCSAgICFDUFVfUzNDMjQxNiAmJiAhQ1BVX1MzQzI0NDAgJiYgIUNQVV9TM0MyNDQyICYmIFwKIAkJICAgIUNQVV9TM0MyNDQzICYmIENQVV9TM0MyNDEyCiAJZGVmYXVsdCB5IGlmIENQVV9TM0MyNDEyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9jbG9jay5jCmluZGV4IDBjMDUwNWIuLjE0MDcxMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9jbG9jay5jCkBAIC05NSwxMiArOTUsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX2VyZWZjbGsgPSB7CiAJLm5hbWUJCT0gImVyZWZjbGsiLAotCS5pZAkJPSAtMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa191cmVmY2xrID0gewogCS5uYW1lCQk9ICJ1cmVmY2xrIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgaW50IHMzYzI0MTJfc2V0cGFyZW50X3VzeXNjbGsoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCkBAIC0xMjIsNyArMTIwLDYgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3VzeXNjbGsgPSB7CiAJLm5hbWUJCT0gInVzeXNjbGsiLAotCS5pZAkJPSAtMSwKIAkucGFyZW50CQk9ICZjbGtfeHRhbCwKIAkub3BzCQk9ICYoc3RydWN0IGNsa19vcHMpIHsKIAkJLnNldF9wYXJlbnQJPSBzM2MyNDEyX3NldHBhcmVudF91c3lzY2xrLApAQCAtMTMyLDEzICsxMjksMTEgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19tcmVmY2xrID0gewogCS5uYW1lCQk9ICJtcmVmY2xrIiwKIAkucGFyZW50CQk9ICZjbGtfeHRhbCwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfbWRpdmNsayA9IHsKIAkubmFtZQkJPSAibWRpdmNsayIsCiAJLnBhcmVudAkJPSAmY2xrX3h0YWwsCi0JLmlkCQk9IC0xLAogfTsKIAogc3RhdGljIGludCBzM2MyNDEyX3NldHBhcmVudF91c2JzcmMoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCkBAIC0yMDAsNyArMTk1LDYgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3VzYnNyYyA9IHsKIAkubmFtZQkJPSAidXNic3JjIiwKLQkuaWQJCT0gLTEsCiAJLm9wcwkJPSAmKHN0cnVjdCBjbGtfb3BzKSB7CiAJCS5nZXRfcmF0ZQk9IHMzYzI0MTJfZ2V0cmF0ZV91c2JzcmMsCiAJCS5zZXRfcmF0ZQk9IHMzYzI0MTJfc2V0cmF0ZV91c2JzcmMsCkBAIC0yMjgsNyArMjIyLDYgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX21zeXNjbGsgPSB7CiAJLm5hbWUJCT0gIm1zeXNjbGsiLAotCS5pZAkJPSAtMSwKIAkub3BzCQk9ICYoc3RydWN0IGNsa19vcHMpIHsKIAkJLnNldF9wYXJlbnQJPSBzM2MyNDEyX3NldHBhcmVudF9tc3lzY2xrLAogCX0sCkBAIC0yNjgsNyArMjYxLDYgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX2FybWNsayA9IHsKIAkubmFtZQkJPSAiYXJtY2xrIiwKLQkuaWQJCT0gLTEsCiAJLnBhcmVudAkJPSAmY2xrX21zeXNjbGssCiAJLm9wcwkJPSAmKHN0cnVjdCBjbGtfb3BzKSB7CiAJCS5zZXRfcGFyZW50CT0gczNjMjQxMl9zZXRwYXJlbnRfYXJtY2xrLApAQCAtMzQ0LDcgKzMzNiw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa191YXJ0ID0gewogCS5uYW1lCQk9ICJ1YXJ0Y2xrIiwKLQkuaWQJCT0gLTEsCiAJLm9wcwkJPSAmKHN0cnVjdCBjbGtfb3BzKSB7CiAJCS5nZXRfcmF0ZQk9IHMzYzI0MTJfZ2V0cmF0ZV91YXJ0LAogCQkuc2V0X3JhdGUJPSBzM2MyNDEyX3NldHJhdGVfdWFydCwKQEAgLTM5Nyw3ICszODgsNiBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfaTJzID0gewogCS5uYW1lCQk9ICJpMnNjbGsiLAotCS5pZAkJPSAtMSwKIAkub3BzCQk9ICYoc3RydWN0IGNsa19vcHMpIHsKIAkJLmdldF9yYXRlCT0gczNjMjQxMl9nZXRyYXRlX2kycywKIAkJLnNldF9yYXRlCT0gczNjMjQxMl9zZXRyYXRlX2kycywKQEAgLTQ0OSw3ICs0MzksNiBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfY2FtID0gewogCS5uYW1lCQk9ICJjYW1pZi11cGxsIiwJLyogc2FtZSBhcyAyNDQwIG5hbWUgKi8KLQkuaWQJCT0gLTEsCiAJLm9wcwkJPSAmKHN0cnVjdCBjbGtfb3BzKSB7CiAJCS5nZXRfcmF0ZQk9IHMzYzI0MTJfZ2V0cmF0ZV9jYW0sCiAJCS5zZXRfcmF0ZQk9IHMzYzI0MTJfc2V0cmF0ZV9jYW0sCkBAIC00NjMsMzcgKzQ1MiwzMSBAQAogc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3NfZGlzYWJsZVtdID0gewogCXsKIAkJLm5hbWUJCT0gIm5hbmQiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9OQU5ELAogCX0sIHsKIAkJLm5hbWUJCT0gInNkaSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAogCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX1NESSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJhZGMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9BREMsCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCiAJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fSUlDLAogCX0sIHsKIAkJLm5hbWUJCT0gImlpcyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAogCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX0lJUywKIAl9LCB7CiAJCS5uYW1lCQk9ICJzcGkiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9TUEksCkBAIC01MDMsOTYgKzQ4Niw4MyBAQAogc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3NbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJkbWEiLAotCQkuaWQJCT0gMCwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAogCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX0RNQTAsCiAJfSwgewogCQkubmFtZQkJPSAiZG1hIiwKLQkJLmlkCQk9IDEsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9ETUExLAogCX0sIHsKIAkJLm5hbWUJCT0gImRtYSIsCi0JCS5pZAkJPSAyLAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCiAJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fRE1BMiwKIAl9LCB7CiAJCS5uYW1lCQk9ICJkbWEiLAotCQkuaWQJCT0gMywKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAogCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX0RNQTMsCiAJfSwgewogCQkubmFtZQkJPSAibGNkIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCiAJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fTENEQywKIAl9LCB7CiAJCS5uYW1lCQk9ICJncGlvIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCiAJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fR1BJTywKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1c2ItaG9zdCIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAogCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX1VTQkgsCiAJfSwgewogCQkubmFtZQkJPSAidXNiLWRldmljZSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAogCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX1VTQkQsCiAJfSwgewogCQkubmFtZQkJPSAidGltZXJzIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCiAJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fUFdNVCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYzI0MTItdWFydC4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAogCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX1VBUlQwLAogCX0sIHsKIAkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAiczNjMjQxMi11YXJ0LjEiLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCiAJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fVUFSVDEsCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAyLAorCQkuZGV2bmFtZQk9ICJzM2MyNDEyLXVhcnQuMiIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9VQVJUMiwKIAl9LCB7CiAJCS5uYW1lCQk9ICJydGMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9SVEMsCiAJfSwgewogCQkubmFtZQkJPSAid2F0Y2hkb2ciLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuY3RybGJpdAk9IDAsCiAJfSwgewogCQkubmFtZQkJPSAidXNiLWJ1cy1nYWRnZXQiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa191c2JfYnVzLAogCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9VU0JfREVWNDgsCiAJfSwgewogCQkubmFtZQkJPSAidXNiLWJ1cy1ob3N0IiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfdXNiX2J1cywKIAkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCiAJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fVVNCX0hPU1Q0OCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLWppdmUuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLWppdmUuYwppbmRleCA4NWRjYWViLi41ZWViNDc1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1qaXZlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtaml2ZS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8dmlkZW8vaWxpOTMyMC5oPgogCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgpAQCAtMzgsNyArMzksNiBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLW1lbS5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1sY2QuaD4KLSNpbmNsdWRlIDxtYWNoL3NwaS1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTM4OSw0NSArMzg5LDMwIEBACiAKIC8qIExDRCBTUEkgc3VwcG9ydCAqLwogCi1zdGF0aWMgdm9pZCBqaXZlX2xjZF9zcGlfY2hpcHNlbGVjdChzdHJ1Y3QgczNjMjQxMF9zcGlncGlvX2luZm8gKnNwaSwgaW50IGNzKQotewotCWdwaW9fc2V0X3ZhbHVlKFMzQzI0MTBfR1BCKDcpLCBjcyA/IDAgOiAxKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3NwaWdwaW9faW5mbyBqaXZlX2xjZF9zcGkgPSB7Ci0JLmJ1c19udW0JPSAxLAotCS5waW5fY2xrCT0gUzNDMjQxMF9HUEcoOCksCi0JLnBpbl9tb3NpCT0gUzNDMjQxMF9HUEIoOCksCi0JLm51bV9jaGlwc2VsZWN0CT0gMSwKLQkuY2hpcF9zZWxlY3QJPSBqaXZlX2xjZF9zcGlfY2hpcHNlbGVjdCwKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSBqaXZlX2xjZF9zcGkgPSB7CisJLnNjawkJPSBTM0MyNDEwX0dQRyg4KSwKKwkubW9zaQkJPSBTM0MyNDEwX0dQQig4KSwKKwkubWlzbwkJPSBTUElfR1BJT19OT19NSVNPLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugaml2ZV9kZXZpY2VfbGNkc3BpID0gewotCS5uYW1lCQk9ICJzcGlfczNjMjR4eF9ncGlvIiwKKwkubmFtZQkJPSAic3BpLWdwaW8iLAogCS5pZAkJPSAxLAotCS5udW1fcmVzb3VyY2VzICA9IDAsCiAJLmRldi5wbGF0Zm9ybV9kYXRhID0gJmppdmVfbGNkX3NwaSwKIH07CiAKKwogLyogV004NzUwIGF1ZGlvIGNvZGUgU1BJIGRlZmluaXRpb24gKi8KIAotc3RhdGljIHZvaWQgaml2ZV93bTg3NTBfY2hpcHNlbGVjdChzdHJ1Y3QgczNjMjQxMF9zcGlncGlvX2luZm8gKnNwaSwgaW50IGNzKQotewotCWdwaW9fc2V0X3ZhbHVlKFMzQzI0MTBfR1BIKDEwKSwgY3MgPyAwIDogMSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF9zcGlncGlvX2luZm8gaml2ZV93bTg3NTBfc3BpID0gewotCS5idXNfbnVtCT0gMiwKLQkucGluX2Nsawk9IFMzQzI0MTBfR1BCKDQpLAotCS5waW5fbW9zaQk9IFMzQzI0MTBfR1BCKDkpLAotCS5udW1fY2hpcHNlbGVjdAk9IDEsCi0JLmNoaXBfc2VsZWN0CT0gaml2ZV93bTg3NTBfY2hpcHNlbGVjdCwKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSBqaXZlX3dtODc1MF9zcGkgPSB7CisJLnNjawkJPSBTM0MyNDEwX0dQQig0KSwKKwkubW9zaQkJPSBTM0MyNDEwX0dQQig5KSwKKwkubWlzbwkJPSBTUElfR1BJT19OT19NSVNPLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugaml2ZV9kZXZpY2Vfd204NzUwID0gewotCS5uYW1lCQk9ICJzcGlfczNjMjR4eF9ncGlvIiwKKwkubmFtZQkJPSAic3BpLWdwaW8iLAogCS5pZAkJPSAyLAotCS5udW1fcmVzb3VyY2VzICA9IDAsCiAJLmRldi5wbGF0Zm9ybV9kYXRhID0gJmppdmVfd204NzUwX3NwaSwKIH07CiAKQEAgLTQ0MSwxMiArNDI2LDE0IEBACiAJCS5tb2RlCQk9IFNQSV9NT0RFXzMsCS8qIENQT0w9MSwgQ1BIQT0xICovCiAJCS5tYXhfc3BlZWRfaHoJPSAxMDAwMDAsCiAJCS5wbGF0Zm9ybV9kYXRhCT0gJmppdmVfbGNtX2NvbmZpZywKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICh2b2lkICopUzNDMjQxMF9HUEIoNyksCiAJfSwgewogCQkubW9kYWxpYXMJPSAiV004NzUwIiwKIAkJLmJ1c19udW0JPSAyLAogCQkuY2hpcF9zZWxlY3QJPSAwLAogCQkubW9kZQkJPSBTUElfTU9ERV8wLAkvKiBDUE9MPTAsIENQSEE9MCAqLwogCQkubWF4X3NwZWVkX2h6CT0gMTAwMDAwLAorCQkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKilTM0MyNDEwX0dQSCgxMCksCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9wbS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3BtLmMKaW5kZXggNzUyYjEzYS4uZjQwNzdlZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3BtLmMKQEAgLTM3LDEyICszNywxMCBAQAogCiBleHRlcm4gdm9pZCBzM2MyNDEyX3NsZWVwX2VudGVyKHZvaWQpOwogCi1zdGF0aWMgdm9pZCBzM2MyNDEyX2NwdV9zdXNwZW5kKHZvaWQpCitzdGF0aWMgaW50IHMzYzI0MTJfY3B1X3N1c3BlbmQodW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAKLQlmbHVzaF9jYWNoZV9hbGwoKTsKLQogCS8qIHNldCBvdXIgc3RhbmRieSBtZXRob2QgdG8gc2xlZXAgKi8KIAogCXRtcCA9IF9fcmF3X3JlYWRsKFMzQzI0MTJfUFdSQ0ZHKTsKQEAgLTUwLDYgKzQ4LDggQEAKIAlfX3Jhd193cml0ZWwodG1wLCBTM0MyNDEyX1BXUkNGRyk7CiAKIAlzM2MyNDEyX3NsZWVwX2VudGVyKCk7CisKKwlwYW5pYygic2xlZXAgcmVzdW1lZCB0byBvcmlnaW5hdG9yPyIpOwogfQogCiBzdGF0aWMgdm9pZCBzM2MyNDEyX3BtX3ByZXBhcmUodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxNi9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L2Nsb2NrLmMKaW5kZXggM2IwMmQ4NS4uMjFhNWU4MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L2Nsb2NrLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAlbMF0gPSB7CiAJCS5jbGsgPSB7CiAJCQkubmFtZQk9ICJoc21tYy1kaXYiLAotCQkJLmlkCT0gMCwKKwkJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4wIiwKIAkJCS5wYXJlbnQJPSAmY2xrX2VzeXNjbGsuY2xrLAogCQl9LAogCQkucmVnX2RpdiA9IHsgLnJlZyA9IFMzQzI0MTZfQ0xLRElWMiwgLnNpemUgPSAyLCAuc2hpZnQgPSA2IH0sCkBAIC01MCw3ICs1MCw3IEBACiAJWzFdID0gewogCQkuY2xrID0gewogCQkJLm5hbWUJPSAiaHNtbWMtZGl2IiwKLQkJCS5pZAk9IDEsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCQkucGFyZW50CT0gJmNsa19lc3lzY2xrLmNsaywKIAkJfSwKIAkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTM0MyNDQzX0NMS0RJVjEsIC5zaXplID0gMiwgLnNoaWZ0ID0gNiB9LApAQCAtNjAsOCArNjAsOCBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGhzbW1jX211eFtdID0gewogCVswXSA9IHsKIAkJLmNsawk9IHsKLQkJCS5pZAk9IDAsCiAJCQkubmFtZQk9ICJoc21tYy1pZiIsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMCIsCiAJCQkuY3RybGJpdCA9ICgxIDw8IDYpLAogCQkJLmVuYWJsZSA9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9zLAogCQl9LApAQCAtNzYsOCArNzYsOCBAQAogCX0sCiAJWzFdID0gewogCQkuY2xrCT0gewotCQkJLmlkCT0gMSwKIAkJCS5uYW1lCT0gImhzbW1jLWlmIiwKKwkJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4xIiwKIAkJCS5jdHJsYml0ID0gKDEgPDwgMTIpLAogCQkJLmVuYWJsZSA9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9zLAogCQl9LApAQCAtOTQsNyArOTQsNyBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBoc21tYzBfY2xrID0gewogCS5uYW1lCQk9ICJoc21tYyIsCi0JLmlkCQk9IDAsCisJLmRldm5hbWUJPSAiczNjLXNkaGNpLjAiLAogCS5wYXJlbnQJCT0gJmNsa19oLAogCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX2gsCiAJLmN0cmxiaXQJPSBTM0MyNDE2X0hDTEtDT05fSFNNTUMwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L3BtLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvcG0uYwppbmRleCA0MWRiMmIyLi45ZWM1NGYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTYvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvcG0uYwpAQCAtMjQsMTAgKzI0LDggQEAKIAogZXh0ZXJuIHZvaWQgczNjMjQxMl9zbGVlcF9lbnRlcih2b2lkKTsKIAotc3RhdGljIHZvaWQgczNjMjQxNl9jcHVfc3VzcGVuZCh2b2lkKQorc3RhdGljIGludCBzM2MyNDE2X2NwdV9zdXNwZW5kKHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWZsdXNoX2NhY2hlX2FsbCgpOwotCiAJLyogZW5hYmxlIHdha2V1cCBzb3VyY2VzIHJlZ2FyZGxlc3Mgb2YgYmF0dGVyeSBzdGF0ZSAqLwogCV9fcmF3X3dyaXRlbChTM0MyNDQzX1BXUkNGR19TTEVFUCwgUzNDMjQ0M19QV1JDRkcpOwogCkBAIC0zNSw2ICszMyw4IEBACiAJX19yYXdfd3JpdGVsKDB4MkJFRCwgUzNDMjQ0M19QV1JNT0RFKTsKIAogCXMzYzI0MTJfc2xlZXBfZW50ZXIoKTsKKworCXBhbmljKCJzbGVlcCByZXN1bWVkIHRvIG9yaWdpbmF0b3I/Iik7CiB9CiAKIHN0YXRpYyB2b2lkIHMzYzI0MTZfcG1fcHJlcGFyZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvY2xvY2suYwppbmRleCAzZGMyNDI2Li41NTRlMGQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvY2xvY2suYwpAQCAtOTAsMTQgKzkwLDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHMzYzI0NDBfY2xrX2NhbSA9IHsKIAkubmFtZQkJPSAiY2FtaWYiLAotCS5pZAkJPSAtMSwKIAkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKIAkuY3RybGJpdAk9IFMzQzI0NDBfQ0xLQ09OX0NBTUVSQSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHMzYzI0NDBfY2xrX2NhbV91cGxsID0gewogCS5uYW1lCQk9ICJjYW1pZi11cGxsIiwKLQkuaWQJCT0gLTEsCiAJLm9wcwkJPSAmKHN0cnVjdCBjbGtfb3BzKSB7CiAJCS5zZXRfcmF0ZQk9IHMzYzI0NDBfY2FtaWZfdXBsbF9zZXRyYXRlLAogCQkucm91bmRfcmF0ZQk9IHMzYzI0NDBfY2FtaWZfdXBsbF9yb3VuZCwKQEAgLTEwNiw3ICsxMDQsNiBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBzM2MyNDQwX2Nsa19hYzk3ID0gewogCS5uYW1lCQk9ICJhYzk3IiwKLQkuaWQJCT0gLTEsCiAJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCiAJLmN0cmxiaXQJPSBTM0MyNDQwX0NMS0NPTl9DQU1FUkEsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtZ3RhMDIuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWd0YTAyLmMKaW5kZXggNzE2NjYyMC4uYzEwZGRmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtZ3RhMDIuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1ndGEwMi5jCkBAIC03NCw3ICs3NCw2IEBACiAjaW5jbHVkZSA8bWFjaC9mYi5oPgogCiAjaW5jbHVkZSA8bWFjaC9zcGkuaD4KLSNpbmNsdWRlIDxtYWNoL3NwaS1ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC91c2ItY29udHJvbC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1tZW0uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1taW5pMjQ0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbWluaTI0NDAuYwppbmRleCBkZDMxMjBkLi5mYzJkYzBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1taW5pMjQ0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW1pbmkyNDQwLmMKQEAgLTU1Miw3ICs1NTIsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wdGlvbmFsWzhdOwogfTsKIAotc3RhdGljIHZvaWQgbWluaTI0NDBfcGFyc2VfZmVhdHVyZXMoCitzdGF0aWMgdm9pZCBfX2luaXQgbWluaTI0NDBfcGFyc2VfZmVhdHVyZXMoCiAJCXN0cnVjdCBtaW5pMjQ0MF9mZWF0dXJlc190ICogZmVhdHVyZXMsCiAJCWNvbnN0IGNoYXIgKiBmZWF0dXJlc19zdHIgKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvY2xvY2suYwppbmRleCBmNGVjNmQ1Li5hMWE3MTc2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvY2xvY2suYwpAQCAtNTksNyArNTksNiBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfaTJzX2V4dCA9IHsKIAkubmFtZQkJPSAiaTJzLWV4dCIsCi0JLmlkCQk9IC0xLAogfTsKIAogLyogYXJtZGl2CkBAIC0xMzksNyArMTM4LDYgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX2FybWRpdiA9IHsKIAkubmFtZQkJPSAiYXJtZGl2IiwKLQkuaWQJCT0gLTEsCiAJLnBhcmVudAkJPSAmY2xrX21zeXNjbGsuY2xrLAogCS5vcHMJCT0gJihzdHJ1Y3QgY2xrX29wcykgewogCQkucm91bmRfcmF0ZSA9IHMzYzI0NDNfYXJtY2xrX3JvdW5kcmF0ZSwKQEAgLTE2MCw3ICsxNTgsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hcm0gPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImFybWNsayIsCi0JCS5pZAkJPSAtMSwKIAl9LAogCS5zb3VyY2VzID0gJihzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMpIHsKIAkJLnNvdXJjZXMgPSBjbGtfYXJtX3NvdXJjZXMsCkBAIC0xNzcsNyArMTc0LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfaHNzcGkgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImhzc3BpIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZXN5c2Nsay5jbGssCiAJCS5jdHJsYml0CT0gUzNDMjQ0M19TQ0xLQ09OX0hTU1BJQ0xLLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9zLApAQCAtMTk2LDcgKzE5Miw3IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2hzbW1jX2RpdiA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAiaHNtbWMtZGl2IiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX2VzeXNjbGsuY2xrLAogCX0sCiAJLnJlZ19kaXYgPSB7IC5yZWcgPSBTM0MyNDQzX0NMS0RJVjEsIC5zaXplID0gMiwgLnNoaWZ0ID0gNiB9LApAQCAtMjMxLDcgKzIyNyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19oc21tYyA9IHsKIAkubmFtZQkJPSAiaHNtbWMtaWYiLAotCS5pZAkJPSAxLAorCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4xIiwKIAkucGFyZW50CQk9ICZjbGtfaHNtbWNfZGl2LmNsaywKIAkuZW5hYmxlCQk9IHMzYzI0NDNfZW5hYmxlX2hzbW1jLAogCS5vcHMJCT0gJihzdHJ1Y3QgY2xrX29wcykgewpAQCAtMjQ4LDcgKzI0NCw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2kyc19lcGxsZGl2ID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJpMnMtZXBsbGRpdiIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2VzeXNjbGsuY2xrLAogCX0sCiAJLnJlZ19kaXYgPSB7IC5yZWcgPSBTM0MyNDQzX0NMS0RJVjEsIC5zaXplID0gNCwgLnNoaWZ0ID0gMTIsIH0sCkBAIC0yNzEsNyArMjY2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfaTJzID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJpMnMtaWYiLAotCQkuaWQJCT0gLTEsCiAJCS5jdHJsYml0CT0gUzNDMjQ0M19TQ0xLQ09OX0kyU0NMSywKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcywKIApAQCAtMjg4LDI1ICsyODIsMjMgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0gewogCXsKIAkJLm5hbWUJCT0gInNkaSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX3AsCiAJCS5jdHJsYml0CT0gUzNDMjQ0M19QQ0xLQ09OX1NESSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJpaXMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfUENMS0NPTl9JSVMsCiAJfSwgewogCQkubmFtZQkJPSAic3BpIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYzI0MTAtc3BpLjAiLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcCwKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX1BDTEtDT05fU1BJMCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJzcGkiLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAiczNjMjQxMC1zcGkuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfUENMS0NPTl9TUEkxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzVhNzM4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0vKiBwdWxsIGluIHRoZSByZWxldmFudCByZWdpc3RlciBhbmQgbWFwIGZpbGVzLiAqLwotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+Ci0KLQkubWFjcm8gYWRkcnVhcnQsIHJwLCBydgotCQlsZHIJXHJwLCA9IFMzQzI0WFhfUEFfVUFSVAotCQlsZHIJXHJ2LCA9IFMzQzI0WFhfVkFfVUFSVAotI2lmIENPTkZJR19ERUJVR19TM0NfVUFSVCAhPSAwCi0JCWFkZAlccnAsIFxycCwgIyhTM0MyNDEwX1VBUlQxX09GRiAqIENPTkZJR19ERUJVR19TM0NfVUFSVCkKLQkJYWRkCVxydiwgXHJ2LCAjKFMzQzI0MTBfVUFSVDFfT0ZGICogQ09ORklHX0RFQlVHX1MzQ19VQVJUKQotI2VuZGlmCi0JLmVuZG0KLQotLyogaW5jbHVkZSB0aGUgcmVzZXQgb2YgdGhlIGNvZGUgd2hpY2ggd2lsbCBkbyB0aGUgd29yaywgd2UncmUgb25seQotICogY29tcGlsaW5nIGZvciBhIHNpbmdsZSBjcHUgcHJvY2Vzc29yIHR5cGUgc28gdGhlIGRlZmF1bHQgb2YgczNjMjQ0MAotICogd2lsbCBiZSBmaW5lIHdpdGggdXMuCi0gKi8KLQotI2luY2x1ZGUgPHBsYXQvZGVidWctbWFjcm8uUz4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyNmMzMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL2lvLmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4KLSAqCi0gKiBEZWZhdWx0IElPIHJvdXRpbmVzIGZvciBTM0MyNEEwCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUk1fQVJDSF9JT19ICi0jZGVmaW5lIF9fQVNNX0FSTV9BUkNIX0lPX0gKLQotLyogTm8gY3VycmVudCBJU0EvUENJIGJ1cyBzdXBwb3J0LiAqLwotI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCi0jZGVmaW5lIF9fbWVtX3BjaShhKQkoYSkKLQotI2RlZmluZSBJT19TUEFDRV9MSU1JVCAoMHhGRkZGRkZGRikKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvaXJxcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2NlMmE3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvaXJxcy5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKiAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfMjRBMF9JUlFTX0gKLSNkZWZpbmUgX19BU01fQVJDSF8yNEEwX0lSUVNfSCBfX0ZJTEVfXwotCi0jZGVmaW5lIElSUV9FSU5UMHQyCVMzQzI0MTBfSVJRKDApCS8qIDE2ICovCi0vKiBmb3IgZ2VuZXJpYyBlbnRyeS1tYWNyby5TICovCi0jZGVmaW5lIElSUV9FSU5UMAlJUlFfRUlOVDB0MgotCi0jZGVmaW5lIElSUV9FSU5UM3Q2CVMzQzI0MTBfSVJRKDEpCi0jZGVmaW5lIElSUV9FSU5UN3QxMAlTM0MyNDEwX0lSUSgyKQotI2RlZmluZSBJUlFfRUlOVDExdDE0CVMzQzI0MTBfSVJRKDMpCi0jZGVmaW5lIElSUV9FSU5UMTV0MTgJUzNDMjQxMF9JUlEoNCkJLyogMjAgKi8KLSNkZWZpbmUgSVJRX1RJQ0sJUzNDMjQxMF9JUlEoNSkKLSNkZWZpbmUgSVJRX0RDVFEJUzNDMjQxMF9JUlEoNikKLSNkZWZpbmUgSVJRX01DCQlTM0MyNDEwX0lSUSg3KQotI2RlZmluZSBJUlFfTUUJCVMzQzI0MTBfSVJRKDgpCS8qIDI0ICovCi0jZGVmaW5lIElSUV9LRVlQQUQJUzNDMjQxMF9JUlEoOSkKLSNkZWZpbmUgSVJRX1RJTUVSMAlTM0MyNDEwX0lSUSgxMCkKLSNkZWZpbmUgSVJRX1RJTUVSMQlTM0MyNDEwX0lSUSgxMSkKLSNkZWZpbmUgSVJRX1RJTUVSMglTM0MyNDEwX0lSUSgxMikKLSNkZWZpbmUgSVJRX1RJTUVSM180CVMzQzI0MTBfSVJRKDEzKQotI2RlZmluZSBJUlFfT1NfVElNRVIJSVJRX1RJTUVSM180Ci0jZGVmaW5lIElSUV9MQ0QJCVMzQzI0MTBfSVJRKDE0KQotI2RlZmluZSBJUlFfQ0FNX0MJUzNDMjQxMF9JUlEoMTUpCi0jZGVmaW5lIElSUV9XRFRfQkFURkxUCVMzQzI0MTBfSVJRKDE2KQkvKiAzMiAqLwotI2RlZmluZSBJUlFfVUFSVDAJUzNDMjQxMF9JUlEoMTcpCi0jZGVmaW5lIElSUV9DQU1fUAlTM0MyNDEwX0lSUSgxOCkKLSNkZWZpbmUgSVJRX01PREVNCVMzQzI0MTBfSVJRKDE5KQotI2RlZmluZSBJUlFfRE1BCQlTM0MyNDEwX0lSUSgyMCkKLSNkZWZpbmUgSVJRX1NESQkJUzNDMjQxMF9JUlEoMjEpCi0jZGVmaW5lIElSUV9TUEkwCVMzQzI0MTBfSVJRKDIyKQotI2RlZmluZSBJUlFfVUFSVDEJUzNDMjQxMF9JUlEoMjMpCi0jZGVmaW5lIElSUV9BQzk3X05GTEFTSAlTM0MyNDEwX0lSUSgyNCkJLyogNDAgKi8KLSNkZWZpbmUgSVJRX1VTQkQJUzNDMjQxMF9JUlEoMjUpCi0jZGVmaW5lIElSUV9VU0JICVMzQzI0MTBfSVJRKDI2KQotI2RlZmluZSBJUlFfSUlDCQlTM0MyNDEwX0lSUSgyNykKLSNkZWZpbmUgSVJRX0lSREFfTVNUSUNLCVMzQzI0MTBfSVJRKDI4KQkvKiA0NCAqLwotI2RlZmluZSBJUlFfVkxYX1NQSTEJUzNDMjQxMF9JUlEoMjkpCi0jZGVmaW5lIElSUV9SVEMJCVMzQzI0MTBfSVJRKDMwKQkvKiA0NiAqLwotI2RlZmluZSBJUlFfQURDX1BFTiAgICAgUzNDMjQxMF9JUlEoMzEpCi0KLS8qIGludGVycnVwdHMgZ2VuZXJhdGVkIGZyb20gdGhlIGV4dGVybmFsIGludGVycnVwdHMgc291cmNlcyAqLwotI2RlZmluZSBJUlFfRUlOVDAwCVMzQzI0MTBfSVJRKDMyKQkvKiA0OCAqLwotI2RlZmluZSBJUlFfRUlOVDEJUzNDMjQxMF9JUlEoMzMpCi0jZGVmaW5lIElSUV9FSU5UMglTM0MyNDEwX0lSUSgzNCkKLSNkZWZpbmUgSVJRX0VJTlQzCVMzQzI0MTBfSVJRKDM1KQotI2RlZmluZSBJUlFfRUlOVDQJUzNDMjQxMF9JUlEoMzYpCi0jZGVmaW5lIElSUV9FSU5UNQlTM0MyNDEwX0lSUSgzNykKLSNkZWZpbmUgSVJRX0VJTlQ2CVMzQzI0MTBfSVJRKDM4KQotI2RlZmluZSBJUlFfRUlOVDcJUzNDMjQxMF9JUlEoMzkpCi0jZGVmaW5lIElSUV9FSU5UOAlTM0MyNDEwX0lSUSg0MCkKLSNkZWZpbmUgSVJRX0VJTlQ5CVMzQzI0MTBfSVJRKDQxKQotI2RlZmluZSBJUlFfRUlOVDEwCVMzQzI0MTBfSVJRKDQyKQotI2RlZmluZSBJUlFfRUlOVDExCVMzQzI0MTBfSVJRKDQzKQotI2RlZmluZSBJUlFfRUlOVDEyCVMzQzI0MTBfSVJRKDQ0KQotI2RlZmluZSBJUlFfRUlOVDEzCVMzQzI0MTBfSVJRKDQ1KQotI2RlZmluZSBJUlFfRUlOVDE0CVMzQzI0MTBfSVJRKDQ2KQotI2RlZmluZSBJUlFfRUlOVDE1CVMzQzI0MTBfSVJRKDQ3KQotI2RlZmluZSBJUlFfRUlOVDE2CVMzQzI0MTBfSVJRKDQ4KQotI2RlZmluZSBJUlFfRUlOVDE3CVMzQzI0MTBfSVJRKDQ5KQotI2RlZmluZSBJUlFfRUlOVDE4CVMzQzI0MTBfSVJRKDUwKQotCi0jZGVmaW5lIElSUV9FSU5UX0JJVCh4KSAoKHgpIC0gSVJRX0VJTlQwMCkKLQotLyogU1VCIElSUVMgKi8KLSNkZWZpbmUgSVJRX1MzQ1VBUlRfUlgwCQlTM0MyNDEwX0lSUSg1MSkJLyogNjcgKi8KLSNkZWZpbmUgSVJRX1MzQ1VBUlRfVFgwCQlTM0MyNDEwX0lSUSg1MikKLSNkZWZpbmUgSVJRX1MzQ1VBUlRfRVJSMAlTM0MyNDEwX0lSUSg1MykKLQotI2RlZmluZSBJUlFfUzNDVUFSVF9SWDEJCVMzQzI0MTBfSVJRKDU0KQotI2RlZmluZSBJUlFfUzNDVUFSVF9UWDEJCVMzQzI0MTBfSVJRKDU1KQotI2RlZmluZSBJUlFfUzNDVUFSVF9FUlIxCVMzQzI0MTBfSVJRKDU2KQotCi0jZGVmaW5lIElSUV9TM0NVQVJUX1JYMgkJKDB4MCkKLSNkZWZpbmUgSVJRX1MzQ1VBUlRfVFgyCQkoMHgwKQotI2RlZmluZSBJUlFfUzNDVUFSVF9FUlIyCSgweDApCi0KLQotI2RlZmluZSBJUlFfSVJEQQlTM0MyNDEwX0lSUSg1NykKLSNkZWZpbmUgSVJRX01TVElDSwlTM0MyNDEwX0lSUSg1OCkKLSNkZWZpbmUgSVJRX1JFU0VSVkVEMAlTM0MyNDEwX0lSUSg1OSkKLSNkZWZpbmUgSVJRX1JFU0VSVkVEMQlTM0MyNDEwX0lSUSg2MCkKLSNkZWZpbmUgSVJRX1JFU0VSVkVEMglTM0MyNDEwX0lSUSg2MSkKLSNkZWZpbmUgSVJRX1RJTUVSMwlTM0MyNDEwX0lSUSg2MikKLSNkZWZpbmUgSVJRX1RJTUVSNAlTM0MyNDEwX0lSUSg2MykKLSNkZWZpbmUgSVJRX1dEVAkJUzNDMjQxMF9JUlEoNjQpCi0jZGVmaW5lIElSUV9CQVRGTFQJUzNDMjQxMF9JUlEoNjUpCi0jZGVmaW5lIElSUV9QT1NUCVMzQzI0MTBfSVJRKDY2KQotI2RlZmluZSBJUlFfRElTUF9GSUZPCVMzQzI0MTBfSVJRKDY3KQotI2RlZmluZSBJUlFfUEVOVVAJUzNDMjQxMF9JUlEoNjgpCi0jZGVmaW5lIElSUV9QRU5ETglTM0MyNDEwX0lSUSg2OSkKLSNkZWZpbmUgSVJRX0FEQwkJUzNDMjQxMF9JUlEoNzApCi0jZGVmaW5lIElSUV9ESVNQX0ZSQU1FCVMzQzI0MTBfSVJRKDcxKQotI2RlZmluZSBJUlFfTkZMQVNICVMzQzI0MTBfSVJRKDcyKQotI2RlZmluZSBJUlFfQUM5NwlTM0MyNDEwX0lSUSg3MykKLSNkZWZpbmUgSVJRX1NQSTEJUzNDMjQxMF9JUlEoNzQpCi0jZGVmaW5lIElSUV9WTFgJCVMzQzI0MTBfSVJRKDc1KQotI2RlZmluZSBJUlFfRE1BMAlTM0MyNDEwX0lSUSg3NikKLSNkZWZpbmUgSVJRX0RNQTEJUzNDMjQxMF9JUlEoNzcpCi0jZGVmaW5lIElSUV9ETUEyCVMzQzI0MTBfSVJRKDc4KQotI2RlZmluZSBJUlFfRE1BMwlTM0MyNDEwX0lSUSg3OSkKLQotI2RlZmluZSBJUlFfVEMJCSgweDApCi0KLSNkZWZpbmUgTlJfSVJRUwkJKElSUV9ETUEzKzEpCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIXzI0QTBfSVJRU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL21hcC5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4YzhiMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9tYXAuaAotICoKLSAqIENvcHlyaWdodCAyMDAzLTIwMDcgIFNpbXRlYyBFbGVjdHJvbmljcwotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBTM0MyNEEwIC0gTWVtb3J5IG1hcCBkZWZpbml0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfMjRBMF9NQVBfSAotI2RlZmluZSBfX0FTTV9BUkNIXzI0QTBfTUFQX0ggX19GSUxFX18KLQotI2luY2x1ZGUgPHBsYXQvbWFwLWJhc2UuaD4KLSNpbmNsdWRlIDxwbGF0L21hcC5oPgotCi0jZGVmaW5lIFMzQzI0QTBfUEFfSU9fQkFTRQkoMHg0MDAwMDAwMCkKLSNkZWZpbmUgUzNDMjRBMF9QQV9DTEtQV1IJKDB4NDAwMDAwMDApCi0jZGVmaW5lIFMzQzI0QTBfUEFfSVJRCQkoMHg0MDIwMDAwMCkKLSNkZWZpbmUgUzNDMjRBMF9QQV9ETUEJCSgweDQwNDAwMDAwKQotI2RlZmluZSBTM0MyNEEwX1BBX01FTUNUUkwJKDB4NDBDMDAwMDApCi0jZGVmaW5lIFMzQzI0QTBfUEFfTkFORAkJKDB4NDBDMDAwMDApCi0jZGVmaW5lIFMzQzI0QTBfUEFfU1JPTQkJKDB4NDBDMjAwMDApCi0jZGVmaW5lIFMzQzI0QTBfUEFfU0RSQU0JKDB4NDBDNDAwMDApCi0jZGVmaW5lIFMzQzI0QTBfUEFfQlVTTQkJKDB4NDBDRTAwMDApCi0jZGVmaW5lIFMzQzI0QTBfUEFfVVNCSE9TVAkoMHg0MTAwMDAwMCkKLSNkZWZpbmUgUzNDMjRBMF9QQV9NT0RFTUlGCSgweDQxMTgwMDAwKQotI2RlZmluZSBTM0MyNEEwX1BBX0lSREEJCSgweDQxODAwMDAwKQotI2RlZmluZSBTM0MyNEEwX1BBX1RJTUVSCSgweDQ0MDAwMDAwKQotI2RlZmluZSBTM0MyNEEwX1BBX1dBVENIRE9HCSgweDQ0MTAwMDAwKQotI2RlZmluZSBTM0MyNEEwX1BBX1JUQwkJKDB4NDQyMDAwMDApCi0jZGVmaW5lIFMzQzI0QTBfUEFfVUFSVAkJKDB4NDQ0MDAwMDApCi0jZGVmaW5lIFMzQzI0QTBfUEFfVUFSVDAJKFMzQzI0QTBfUEFfVUFSVCkKLSNkZWZpbmUgUzNDMjRBMF9QQV9VQVJUMQkoUzNDMjRBMF9QQV9VQVJUICsgMHg0MDAwKQotI2RlZmluZSBTM0MyNEEwX1BBX1NQSQkJKDB4NDQ1MDAwMDApCi0jZGVmaW5lIFMzQzI0QTBfUEFfSUlDCQkoMHg0NDYwMDAwMCkKLSNkZWZpbmUgUzNDMjRBMF9QQV9JSVMJCSgweDQ0NzAwMDAwKQotI2RlZmluZSBTM0MyNEEwX1BBX0dQSU8JCSgweDQ0ODAwMDAwKQotI2RlZmluZSBTM0MyNEEwX1BBX0tFWUlGCSgweDQ0OTAwMDAwKQotI2RlZmluZSBTM0MyNEEwX1BBX1VTQkRFVgkoMHg0NEEwMDAwMCkKLSNkZWZpbmUgUzNDMjRBMF9QQV9BQzk3CQkoMHg0NTAwMDAwMCkKLSNkZWZpbmUgUzNDMjRBMF9QQV9BREMJCSgweDQ1ODAwMDAwKQotI2RlZmluZSBTM0MyNEEwX1BBX1NESQkJKDB4NDYwMDAwMDApCi0jZGVmaW5lIFMzQzI0QTBfUEFfTVMJCSgweDQ2MTAwMDAwKQotI2RlZmluZSBTM0MyNEEwX1BBX0xDRAkJKDB4NEEwMDAwMDApCi0jZGVmaW5lIFMzQzI0QTBfUEFfVlBPU1QJKDB4NEExMDAwMDApCi0KLS8qIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiBhbGwgdGhlIGNoaXAtc2VsZWN0IGFyZWFzICovCi0KLSNkZWZpbmUgUzNDMjRBMF9DUzAJKDB4MDAwMDAwMDApCi0jZGVmaW5lIFMzQzI0QTBfQ1MxCSgweDA0MDAwMDAwKQotI2RlZmluZSBTM0MyNEEwX0NTMgkoMHgwODAwMDAwMCkKLSNkZWZpbmUgUzNDMjRBMF9DUzMJKDB4MEMwMDAwMDApCi0jZGVmaW5lIFMzQzI0QTBfQ1M0CSgweDEwMDAwMDAwKQotI2RlZmluZSBTM0MyNEEwX0NTNQkoMHg0MDAwMDAwMCkKLQotI2RlZmluZSBTM0MyNEEwX1NEUkFNX1BBCShTM0MyNEEwX0NTNCkKLQotLyogVXNlIGEgc2luZ2xlIGludGVyZmFjZSBmb3IgY29tbW9uIHJlc291cmNlcyBiZXR3ZWVuIFMzQzI0WFggY3B1cyAqLwotCi0jZGVmaW5lIFMzQzI0WFhfUEFfSVJRCQlTM0MyNEEwX1BBX0lSUQotI2RlZmluZSBTM0MyNFhYX1BBX01FTUNUUkwJUzNDMjRBMF9QQV9NRU1DVFJMCi0jZGVmaW5lIFMzQzI0WFhfUEFfVVNCSE9TVAlTM0MyNEEwX1BBX1VTQkhPU1QKLSNkZWZpbmUgUzNDMjRYWF9QQV9ETUEJCVMzQzI0QTBfUEFfRE1BCi0jZGVmaW5lIFMzQzI0WFhfUEFfQ0xLUFdSCVMzQzI0QTBfUEFfQ0xLUFdSCi0jZGVmaW5lIFMzQzI0WFhfUEFfTENECQlTM0MyNEEwX1BBX0xDRAotI2RlZmluZSBTM0MyNFhYX1BBX1VBUlQJCVMzQzI0QTBfUEFfVUFSVAotI2RlZmluZSBTM0MyNFhYX1BBX1RJTUVSCVMzQzI0QTBfUEFfVElNRVIKLSNkZWZpbmUgUzNDMjRYWF9QQV9VU0JERVYJUzNDMjRBMF9QQV9VU0JERVYKLSNkZWZpbmUgUzNDMjRYWF9QQV9XQVRDSERPRwlTM0MyNEEwX1BBX1dBVENIRE9HCi0jZGVmaW5lIFMzQzI0WFhfUEFfSUlTCQlTM0MyNEEwX1BBX0lJUwotI2RlZmluZSBTM0MyNFhYX1BBX0dQSU8JCVMzQzI0QTBfUEFfR1BJTwotI2RlZmluZSBTM0MyNFhYX1BBX1JUQwkJUzNDMjRBMF9QQV9SVEMKLSNkZWZpbmUgUzNDMjRYWF9QQV9BREMJCVMzQzI0QTBfUEFfQURDCi0jZGVmaW5lIFMzQzI0WFhfUEFfU1BJCQlTM0MyNEEwX1BBX1NQSQotI2RlZmluZSBTM0MyNFhYX1BBX1NESQkJUzNDMjRBMF9QQV9TREkKLSNkZWZpbmUgUzNDMjRYWF9QQV9OQU5ECQlTM0MyNEEwX1BBX05BTkQKLQotI2RlZmluZSBTM0NfUEFfVUFSVAkJUzNDMjRBMF9QQV9VQVJUCi0jZGVmaW5lIFMzQ19QQV9JSUMJCVMzQzI0QTBfUEFfSUlDCi0jZGVmaW5lIFMzQ19QQV9OQU5ECQlTM0MyNFhYX1BBX05BTkQKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfMjRBMF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMjA4YTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqICBmcm9tIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLXJwYy9tZW1vcnkuaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NywxOTk4IFJ1c3NlbGwgS2luZy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIXzI0QTBfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF8yNEEwX01FTU9SWV9IIF9fRklMRV9fCi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVCBVTCgweDEwMDAwMDAwKQotCi0jZGVmaW5lIF9fdmlydF90b19idXMoeCkgX192aXJ0X3RvX3BoeXMoeCkKLSNkZWZpbmUgX19idXNfdG9fdmlydCh4KSBfX3BoeXNfdG9fdmlydCh4KQotI2RlZmluZSBfX3Bmbl90b19idXMoeCkgX19wZm5fdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b19wZm4oeCkJX19waHlzX3RvX3Bmbih4KQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMGFmNTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2IFNpbXRlYyBFbGVjdHJvbmljcyA8bGludXhAc2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFMzQzI0QTAgY2xvY2sgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF8yNEEwX1JFR1NfQ0xPQ0tfSAotI2RlZmluZSBfX0FTTV9BUkNIXzI0QTBfUkVHU19DTE9DS19IIF9fRklMRV9fCi0KLSNkZWZpbmUgUzNDMjRBMF9NUExMQ09OCQlTM0MyNDEwX0NMS1JFRygweDEwKQotI2RlZmluZSBTM0MyNEEwX1VQTExDT04JCVMzQzI0MTBfQ0xLUkVHKDB4MTQpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OCQlTM0MyNDEwX0NMS1JFRygweDIwKQotI2RlZmluZSBTM0MyNEEwX0NMS1NSQwkJUzNDMjQxMF9DTEtSRUcoMHgyNCkKLSNkZWZpbmUgUzNDMjRBMF9DTEtESVZOCQlTM0MyNDEwX0NMS1JFRygweDI4KQotCi0vKiBDTEtDT04gcmVnaXN0ZXIgYml0cyAqLwotCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1ZMWAkoMTw8MjkpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1ZQT1NUCSgxPDwyOCkKLSNkZWZpbmUgUzNDMjRBMF9DTEtDT05fV0RUCSgxPDwyNykJLyogcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgUzNDMjRBMF9DTEtDT05fTVBFR0RDVFEJKDE8PDI2KQotI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9WUE9TVElGCSgxPDwyNSkKLSNkZWZpbmUgUzNDMjRBMF9DTEtDT05fTVBFRzRJRgkoMTw8MjQpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0NBTV9VUExMCSgxPDwyMykKLSNkZWZpbmUgUzNDMjRBMF9DTEtDT05fTENEQwkoMTw8MjIpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0NBTV9IQ0xLCSgxPDwyMSkKLSNkZWZpbmUgUzNDMjRBMF9DTEtDT05fTVBFRzQJKDE8PDIwKQotI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9LRVlQQUQJKDE8PDE5KQotI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9BREMJKDE8PDE4KQotI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9TREkJKDE8PDE3KQotI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9NUwkoMTw8MTYpIC8qIG1lbW9yeSBzdGljayAqLwotI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9VU0JECSgxPDwxNSkKLSNkZWZpbmUgUzNDMjRBMF9DTEtDT05fR1BJTwkoMTw8MTQpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0lJUwkoMTw8MTMpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0lJQwkoMTw8MTIpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1NQSQkoMTw8MTEpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1VBUlQxCSgxPDwxMCkKLSNkZWZpbmUgUzNDMjRBMF9DTEtDT05fVUFSVDAJKDE8PDkpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1BXTVQJKDE8PDgpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1VTQkgJKDE8PDcpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0FDOTcJKDE8PDYpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0lyREEJKDE8PDQpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0lETEUJKDE8PDIpCi0jZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX01PTgkoMTw8MSkKLSNkZWZpbmUgUzNDMjRBMF9DTEtDT05fU1RPUAkoMTw8MCkKLQotLyogQ0xLU1JDIHJlZ2lzdGVyIGJpdHMgKi8KLQotI2RlZmluZSBTM0MyNEEwX0NMS1NSQ19PU0MJKDE8PDgpICAvKiBDTEtTUkMgKi8KLSNkZWZpbmUgUzNDMjRBMF9DTEtTUkNfVVBMTAkoMTw8NykKLSNkZWZpbmUgUzNDMjRBMF9DTEtTUkNfTVBMTAkoMTw8NSkKLSNkZWZpbmUgUzNDMjRBMF9DTEtTUkNfRVhUCSgxPDw0KQotCi0vKiBVc2UgYSBzaW5nbGUgaW50ZXJmYWNlIHdpdGggdGhlIGNvbW1vbiBjb2RlLCBmb3IgczNjMjR4eCAqLwotCi0jZGVmaW5lIFMzQzI0MTBfTVBMTENPTgkJUzNDMjRBMF9NUExMQ09OCi0jZGVmaW5lIFMzQzI0MTBfVVBMTENPTgkJUzNDMjRBMF9VUExMQ09OCi0jZGVmaW5lIFMzQzI0MTBfQ0xLQ09OCQlTM0MyNEEwX0NMS0NPTgotI2RlZmluZSBTM0MyNDEwX0NMS1NMT1cJCVMzQzI0QTBfQ0xLU1JDCi0jZGVmaW5lIFMzQzI0MTBfQ0xLRElWTgkJUzNDMjRBMF9DTEtESVZOCi0KLSNkZWZpbmUgUzNDMjQxMF9DTEtDT05fSURMRQlTM0MyNEEwX0NMS0NPTl9JRExFCi0jZGVmaW5lIFMzQzI0MTBfQ0xLQ09OX1BPV0VSCVMzQzI0QTBfQ0xLQ09OX1NUT1AKLSNkZWZpbmUgUzNDMjQxMF9DTEtDT05fTENEQwlTM0MyNEEwX0NMS0NPTl9MQ0RDCi0jZGVmaW5lIFMzQzI0MTBfQ0xLQ09OX1VTQkgJUzNDMjRBMF9DTEtDT05fVVNCSAotI2RlZmluZSBTM0MyNDEwX0NMS0NPTl9VU0JECVMzQzI0QTBfQ0xLQ09OX1VTQkQKLSNkZWZpbmUgUzNDMjQxMF9DTEtDT05fUFdNVAlTM0MyNEEwX0NMS0NPTl9QV01UCi0jZGVmaW5lIFMzQzI0MTBfQ0xLQ09OX1NESQlTM0MyNEEwX0NMS0NPTl9TREkKLSNkZWZpbmUgUzNDMjQxMF9DTEtDT05fVUFSVDAJUzNDMjRBMF9DTEtDT05fVUFSVDAKLSNkZWZpbmUgUzNDMjQxMF9DTEtDT05fVUFSVDEJUzNDMjRBMF9DTEtDT05fVUFSVDEKLSNkZWZpbmUgUzNDMjQxMF9DTEtDT05fR1BJTwlTM0MyNEEwX0NMS0NPTl9HUElPCi0jZGVmaW5lIFMzQzI0MTBfQ0xLQ09OX0FEQwlTM0MyNEEwX0NMS0NPTl9BREMKLSNkZWZpbmUgUzNDMjQxMF9DTEtDT05fSUlDCVMzQzI0QTBfQ0xLQ09OX0lJQwotI2RlZmluZSBTM0MyNDEwX0NMS0NPTl9JSVMJUzNDMjRBMF9DTEtDT05fSUlTCi0jZGVmaW5lIFMzQzI0MTBfQ0xLQ09OX1NQSQlTM0MyNEEwX0NMS0NPTl9TUEkKLQotI2RlZmluZSBTM0MyNDEwX0NMS1NMT1dfVUNMS19PRkYJUzNDMjRBMF9DTEtTUkNfVVBMTAotI2RlZmluZSBTM0MyNDEwX0NMS1NMT1dfTVBMTF9PRkYJUzNDMjRBMF9DTEtTUkNfTVBMTAotI2RlZmluZSBTM0MyNDEwX0NMS1NMT1dfU0xPVwkJKDB4RkYpCi0jZGVmaW5lIFMzQzI0MTBfQ0xLU0xPV19HRVRfU0xPV1ZBTCh4KQkoMHgxKQotCi0jZW5kaWYgLyogX19BU01fQVJDSF8yNEEwX1JFR1NfQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDg2ZjZmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvcmVncy1pcnEuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvcmVncy1pcnEuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBTaW10ZWMgRWxlY3Ryb25pY3MgPGxpbnV4QHNpbXRlYy5jby51az4KLSAqCQkgICAgICBodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9TV0xJTlVYLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0KLSNpZm5kZWYgX19fQVNNX0FSQ0hfMjRBMF9SRUdTX0lSUV9ICi0jZGVmaW5lIF9fX0FTTV9BUkNIXzI0QTBfUkVHU19JUlFfSCBfX0ZJTEVfXwotCi0KLSNkZWZpbmUgUzNDMjQxMF9FSU5UTUFTSwlTM0MyNDEwX0VJTlRSRUcoMHgwMzQpCi0jZGVmaW5lIFMzQzI0MTBfRUlOVFBFTkQJUzNDMjQxMF9FSU5UUkVHKDBYMDM4KQotCi0jZGVmaW5lIFMzQzI0WFhfRUlOVE1BU0sJUzNDMjRYWF9FSU5UUkVHKDB4MDM0KQotI2RlZmluZSBTM0MyNFhYX0VJTlRQRU5ECVMzQzI0WFhfRUlOVFJFRygwWDAzOCkKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfMjRBMF9SRUdTX0lSUV9IICovCi0KLQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxYmQxOS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAotICoKLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFMzQzI0QTAgLSBTeXN0ZW0gZnVuY3Rpb24gZGVmaW5lcyBhbmQgaW5jbHVkZXMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLXN0YXRpYyB2b2lkIGFyY2hfaWRsZSh2b2lkKQotewotCS8qIGN1cnJlbnRseSBubyBzcGVjaWZpYyBpZGxlIHN1cHBvcnQuICovCi19Ci0KLXZvaWQgKCpzM2MyNHh4X3Jlc2V0X2hvb2spKHZvaWQpOwotCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zeXN0ZW0tcmVzZXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvdGljay5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC90aWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZWE4YmEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC90aWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3RpY2suaAotICoKLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDMjRBMCAtIHRpbWVyIHRpY2sgc3VwcG9ydAotICovCi0KLSNkZWZpbmUgU1VCU1JDX1RJTUVSNAkoMSA8PCAoSVJRX1RJTUVSNCAtIElSUV9TM0NVQVJUX1JYMCkpCi0KLXN0YXRpYyBpbmxpbmUgaW50IHMzYzI0eHhfb3N0aW1lcl9wZW5kaW5nKHZvaWQpCi17Ci0JcmV0dXJuIF9fcmF3X3JlYWRsKFMzQzI0MTBfU1VCU1JDUE5EKSAmIFNVQlNSQ19USU1FUjQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3RpbWV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NTczNDIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC90aW1leC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC90aW1leC5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFMzQzI0MTAgLSB0aW1lIHBhcmFtZXRlcnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1RJTUVYX0gKLSNkZWZpbmUgX19BU01fQVJDSF9USU1FWF9ICi0KLSNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFIDEyMDAwMDAwCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX1RJTUVYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODBiMTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNGFvL3ZtYWxsb2MuaAotICoKLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcyA8bGludXhAc2ltdGVjLmNvLnVrPgotCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFMzQzI0QTAgdm1hbGxvYyBkZWZpbml0aW9uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfVk1BTExPQ19ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfVk1BTExPQ19ICi0KLSNkZWZpbmUgVk1BTExPQ19FTkQJMHhGNjAwMDAwMFVMCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX1ZNQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvS2NvbmZpZwppbmRleCBlNDE3N2UyLi5mZGM4OWZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvS2NvbmZpZwpAQCAtMTQyLDYgKzE0Miw3IEBACiAJc2VsZWN0IFMzQ19ERVZfVVNCX0hPU1QKIAlzZWxlY3QgUzNDX0RFVl9VU0JfSFNPVEcKIAlzZWxlY3QgUzNDX0RFVl9XRFQKKwlzZWxlY3QgU0FNU1VOR19ERVZfQkFDS0xJR0hUCiAJc2VsZWN0IFNBTVNVTkdfREVWX0tFWVBBRAogCXNlbGVjdCBTQU1TVU5HX0RFVl9QV00KIAlzZWxlY3QgSEFWRV9TM0MyNDEwX1dBVENIRE9HIGlmIFdBVENIRE9HCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvTWFrZWZpbGUKaW5kZXggNDY1NzM2My4uZjVhNzE0NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9NYWtlZmlsZQpAQCAtMjMsMTAgKzIzLDYgQEAKIG9iai15CQkJCSs9IGlycS5vCiBvYmoteQkJCQkrPSBpcnEtZWludC5vCiAKLSMgQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nCi0KLW9iai0kKENPTkZJR19DUFVfRlJFUV9TM0M2NFhYKSAgKz0gY3B1ZnJlcS5vCi0KICMgRE1BIHN1cHBvcnQKIAogb2JqLSQoQ09ORklHX1MzQzY0WFhfRE1BKQkrPSBkbWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY2xvY2suYwppbmRleCBmZGZjNGQ1Li44Y2YzOWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY2xvY2suYwpAQCAtMzksNyArMzksNiBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfZXh0X3h0YWxfbXV4ID0gewogCS5uYW1lCQk9ICJleHRfeHRhbCIsCi0JLmlkCQk9IC0xLAogfTsKIAogI2RlZmluZSBjbGtfZmluX2FwbGwgY2xrX2V4dF94dGFsX211eApAQCAtNTEsMTMgKzUwLDExIEBACiAKIHN0cnVjdCBjbGsgY2xrX2gyID0gewogCS5uYW1lCQk9ICJoY2xrMiIsCi0JLmlkCQk9IC0xLAogCS5yYXRlCQk9IDAsCiB9OwogCiBzdHJ1Y3QgY2xrIGNsa18yN20gPSB7CiAJLm5hbWUJCT0gImNsa18yN20iLAotCS5pZAkJPSAtMSwKIAkucmF0ZQkJPSAyNzAwMDAwMCwKIH07CiAKQEAgLTgzLDE0ICs4MCwxMiBAQAogCiBzdHJ1Y3QgY2xrIGNsa180OG0gPSB7CiAJLm5hbWUJCT0gImNsa180OG0iLAotCS5pZAkJPSAtMSwKIAkucmF0ZQkJPSA0ODAwMDAwMCwKIAkuZW5hYmxlCQk9IGNsa180OG1fY3RybCwKIH07CiAKIHN0cnVjdCBjbGsgY2xrX3h1c2J4dGkgPSB7CiAJLm5hbWUJCT0gInh1c2J4dGkiLAotCS5pZAkJPSAtMSwKIAkucmF0ZQkJPSA0ODAwMDAwMCwKIH07CiAKQEAgLTEzMCwxMDkgKzEyNSwxMDEgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0gewogCXsKIAkJLm5hbWUJCT0gIm5hbmQiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCX0sIHsKIAkJLm5hbWUJCT0gInJ0YyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjNjR4eF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX1JUQywKIAl9LCB7CiAJCS5uYW1lCQk9ICJhZGMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzY0eHhfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fUENMS19UU0FEQywKIAl9LCB7CiAJCS5uYW1lCQk9ICJpMmMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzY0eHhfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fUENMS19JSUMsCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjEiLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2M2NHh4X3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSBTM0M2NDEwX0NMS0NPTl9QQ0xLX0kyQzEsCiAJfSwgewogCQkubmFtZQkJPSAiaWlzIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjAiLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2M2NHh4X3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX1BDTEtfSUlTMCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJpaXMiLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAic2Ftc3VuZy1pMnMuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzY0eHhfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fUENMS19JSVMxLAogCX0sIHsKICNpZmRlZiBDT05GSUdfQ1BVX1MzQzY0MTAKIAkJLm5hbWUJCT0gImlpcyIsCi0JCS5pZAkJPSAtMSwgIC8qIFRoZXJlJ3Mgb25seSBvbmUgSUlTdjQgcG9ydCAqLwogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2M2NHh4X3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSBTM0M2NDEwX0NMS0NPTl9QQ0xLX0lJUzIsCiAJfSwgewogI2VuZGlmCiAJCS5uYW1lCQk9ICJrZXlwYWQiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzY0eHhfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fUENMS19LRVlQQUQsCiAJfSwgewogCQkubmFtZQkJPSAic3BpIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjAiLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2M2NHh4X3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX1BDTEtfU1BJMCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJzcGkiLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzY0eHhfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fUENMS19TUEkxLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwaV80OG0iLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa180OG0sCiAJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9TQ0xLX1NQSTBfNDgsCiAJfSwgewogCQkubmFtZQkJPSAic3BpXzQ4bSIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4xIiwKIAkJLnBhcmVudAkJPSAmY2xrXzQ4bSwKIAkJLmVuYWJsZQkJPSBzM2M2NHh4X3NjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX1NDTEtfU1BJMV80OCwKIAl9LCB7CiAJCS5uYW1lCQk9ICI0OG0iLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjAiLAogCQkucGFyZW50CQk9ICZjbGtfNDhtLAogCQkuZW5hYmxlCQk9IHMzYzY0eHhfc2Nsa19jdHJsLAogCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fU0NMS19NTUMwXzQ4LAogCX0sIHsKIAkJLm5hbWUJCT0gIjQ4bSIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa180OG0sCiAJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9TQ0xLX01NQzFfNDgsCiAJfSwgewogCQkubmFtZQkJPSAiNDhtIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4yIiwKIAkJLnBhcmVudAkJPSAmY2xrXzQ4bSwKIAkJLmVuYWJsZQkJPSBzM2M2NHh4X3NjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX1NDTEtfTU1DMl80OCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJkbWEwIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2M2NHh4X2hjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX0hDTEtfRE1BMCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJkbWExIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2M2NHh4X2hjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX0hDTEtfRE1BMSwKQEAgLTI0Miw4OSArMjI5LDgxIEBACiBzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc1tdID0gewogCXsKIAkJLm5hbWUJCT0gImxjZCIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjNjR4eF9oY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9IQ0xLX0xDRCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJncGlvIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2M2NHh4X3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX1BDTEtfR1BJTywKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1c2ItaG9zdCIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjNjR4eF9oY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9IQ0xLX1VIT1NULAogCX0sIHsKIAkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjNjR4eF9oY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9IQ0xLX0hTTU1DMCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJoc21tYyIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCQkuZW5hYmxlCQk9IHMzYzY0eHhfaGNsa19jdHJsLAogCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fSENMS19IU01NQzEsCiAJfSwgewogCQkubmFtZQkJPSAiaHNtbWMiLAotCQkuaWQJCT0gMiwKKwkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjIiLAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2M2NHh4X2hjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX0hDTEtfSFNNTUMyLAogCX0sIHsKIAkJLm5hbWUJCT0gIm90ZyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjNjR4eF9oY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9IQ0xLX1VTQiwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ0aW1lcnMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzY0eHhfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fUENMS19QV00sCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzM2M2NDAwLXVhcnQuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzY0eHhfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fUENMS19VQVJUMCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInMzYzY0MDAtdWFydC4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjNjR4eF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX1VBUlQxLAogCX0sIHsKIAkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMiwKKwkJLmRldm5hbWUJPSAiczNjNjQwMC11YXJ0LjIiLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2M2NHh4X3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX1BDTEtfVUFSVDIsCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAzLAorCQkuZGV2bmFtZQk9ICJzM2M2NDAwLXVhcnQuMyIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzY0eHhfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fUENMS19VQVJUMywKIAl9LCB7CiAJCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX1dEVCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJhYzk3IiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX1BDTEtfQUM5NywKIAl9LCB7CiAJCS5uYW1lCQk9ICJjZmNvbiIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjNjR4eF9oY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9IQ0xLX0lIT1NULApAQCAtMzM0LDcgKzMxMyw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19mb3V0X2FwbGwgPSB7CiAJLm5hbWUJCT0gImZvdXRfYXBsbCIsCi0JLmlkCQk9IC0xLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgKmNsa19zcmNfYXBsbF9saXN0W10gPSB7CkBAIC0zNTAsNyArMzI4LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9hcGxsID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJtb3V0X2FwbGwiLAotCQkuaWQJCT0gLTEsCiAJfSwKIAkucmVnX3NyYwk9IHsgLnJlZyA9IFMzQ19DTEtfU1JDLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDEgIH0sCiAJLnNvdXJjZXMJPSAmY2xrX3NyY19hcGxsLApAQCAtMzY5LDcgKzM0Niw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfZXBsbCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAibW91dF9lcGxsIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnJlZ19zcmMJPSB7IC5yZWcgPSBTM0NfQ0xLX1NSQywgLnNoaWZ0ID0gMiwgLnNpemUgPSAxICB9LAogCS5zb3VyY2VzCT0gJmNsa19zcmNfZXBsbCwKQEAgLTM4OCw3ICszNjQsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X21wbGwgPSB7CiAJLmNsayA9IHsKIAkJLm5hbWUJCT0gIm1vdXRfbXBsbCIsCi0JCS5pZAkJPSAtMSwKIAl9LAogCS5yZWdfc3JjCT0geyAucmVnID0gUzNDX0NMS19TUkMsIC5zaGlmdCA9IDEsIC5zaXplID0gMSAgfSwKIAkuc291cmNlcwk9ICZjbGtfc3JjX21wbGwsCkBAIC00NDYsNyArNDIxLDYgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX2FybSA9IHsKIAkubmFtZQkJPSAiYXJtY2xrIiwKLQkuaWQJCT0gLTEsCiAJLnBhcmVudAkJPSAmY2xrX21vdXRfYXBsbC5jbGssCiAJLm9wcwkJPSAmKHN0cnVjdCBjbGtfb3BzKSB7CiAJCS5nZXRfcmF0ZQk9IHMzYzY0eHhfY2xrX2FybV9nZXRfcmF0ZSwKQEAgLTQ3Myw3ICs0NDcsNiBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfZG91dF9tcGxsID0gewogCS5uYW1lCQk9ICJkb3V0X21wbGwiLAotCS5pZAkJPSAtMSwKIAkucGFyZW50CQk9ICZjbGtfbW91dF9tcGxsLmNsaywKIAkub3BzCQk9ICZjbGtfZG91dF9vcHMsCiB9OwpAQCAtNTQwLDIyICs1MTMsMTggQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX2lpc19jZDAgPSB7CiAJLm5hbWUJCT0gImlpc19jZGNsazAiLAotCS5pZAkJPSAtMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19paXNfY2QxID0gewogCS5uYW1lCQk9ICJpaXNfY2RjbGsxIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfaWlzdjRfY2QgPSB7CiAJLm5hbWUJCT0gImlpc19jZGNsa192NCIsCi0JLmlkCQk9IC0xLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3BjbV9jZCA9IHsKIAkubmFtZQkJPSAicGNtX2NkY2xrIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X2F1ZGlvMF9saXN0W10gPSB7CkBAIC02MTAsNyArNTc5LDcgQEAKIAl7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAibW1jX2J1cyIsCi0JCQkuaWQJCT0gMCwKKwkJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4wIiwKIAkJCS5jdHJsYml0ICAgICAgICA9IFMzQ19DTEtDT05fU0NMS19NTUMwLAogCQkJLmVuYWJsZQkJPSBzM2M2NHh4X3NjbGtfY3RybCwKIAkJfSwKQEAgLTYyMCw3ICs1ODksNyBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJtbWNfYnVzIiwKLQkJCS5pZAkJPSAxLAorCQkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjEiLAogCQkJLmN0cmxiaXQgICAgICAgID0gUzNDX0NMS0NPTl9TQ0xLX01NQzEsCiAJCQkuZW5hYmxlCQk9IHMzYzY0eHhfc2Nsa19jdHJsLAogCQl9LApAQCAtNjMwLDcgKzU5OSw3IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gIm1tY19idXMiLAotCQkJLmlkCQk9IDIsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMiIsCiAJCQkuY3RybGJpdCAgICAgICAgPSBTM0NfQ0xLQ09OX1NDTEtfTU1DMiwKIAkJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCiAJCX0sCkBAIC02NDAsNyArNjA5LDYgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAidXNiLWJ1cy1ob3N0IiwKLQkJCS5pZAkJPSAtMSwKIAkJCS5jdHJsYml0ICAgICAgICA9IFMzQ19DTEtDT05fU0NMS19VSE9TVCwKIAkJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCiAJCX0sCkBAIC02NTAsNyArNjE4LDYgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAidWNsazEiLAotCQkJLmlkCQk9IC0xLAogCQkJLmN0cmxiaXQgICAgICAgID0gUzNDX0NMS0NPTl9TQ0xLX1VBUlQsCiAJCQkuZW5hYmxlCQk9IHMzYzY0eHhfc2Nsa19jdHJsLAogCQl9LApAQCAtNjYxLDcgKzYyOCw3IEBACiAvKiBXaGVyZSBkb2VzIFVDTEswIGNvbWUgZnJvbT8gKi8KIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzcGktYnVzIiwKLQkJCS5pZAkJPSAwLAorCQkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMCIsCiAJCQkuY3RybGJpdCAgICAgICAgPSBTM0NfQ0xLQ09OX1NDTEtfU1BJMCwKIAkJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCiAJCX0sCkBAIC02NzEsOCArNjM4LDcgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic3BpLWJ1cyIsCi0JCQkuaWQJCT0gMSwKLQkJCS5jdHJsYml0ICAgICAgICA9IFMzQ19DTEtDT05fU0NMS19TUEkxLAorCQkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMSIsCiAJCQkuZW5hYmxlCQk9IHMzYzY0eHhfc2Nsa19jdHJsLAogCQl9LAogCQkucmVnX3NyYwk9IHsgLnJlZyA9IFMzQ19DTEtfU1JDLCAuc2hpZnQgPSAxNiwgLnNpemUgPSAyICB9LApAQCAtNjgxLDcgKzY0Nyw3IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gImF1ZGlvLWJ1cyIsCi0JCQkuaWQJCT0gMCwKKwkJCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjAiLAogCQkJLmN0cmxiaXQgICAgICAgID0gUzNDX0NMS0NPTl9TQ0xLX0FVRElPMCwKIAkJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCiAJCX0sCkBAIC02OTEsNyArNjU3LDcgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAiYXVkaW8tYnVzIiwKLQkJCS5pZAkJPSAxLAorCQkJLmRldm5hbWUJPSAic2Ftc3VuZy1pMnMuMSIsCiAJCQkuY3RybGJpdCAgICAgICAgPSBTM0NfQ0xLQ09OX1NDTEtfQVVESU8xLAogCQkJLmVuYWJsZQkJPSBzM2M2NHh4X3NjbGtfY3RybCwKIAkJfSwKQEAgLTcwMSw3ICs2NjcsNyBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJhdWRpby1idXMiLAotCQkJLmlkCQk9IDIsCisJCQkuZGV2bmFtZQk9ICJzYW1zdW5nLWkycy4yIiwKIAkJCS5jdHJsYml0ICAgICAgICA9IFMzQzY0MTBfQ0xLQ09OX1NDTEtfQVVESU8yLAogCQkJLmVuYWJsZQkJPSBzM2M2NHh4X3NjbGtfY3RybCwKIAkJfSwKQEAgLTcxMSw3ICs2NzcsNiBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJpcmRhLWJ1cyIsCi0JCQkuaWQJCT0gMCwKIAkJCS5jdHJsYml0ICAgICAgICA9IFMzQ19DTEtDT05fU0NMS19JUkRBLAogCQkJLmVuYWJsZQkJPSBzM2M2NHh4X3NjbGtfY3RybCwKIAkJfSwKQEAgLTcyMSw3ICs2ODYsNiBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJjYW1lcmEiLAotCQkJLmlkCQk9IC0xLAogCQkJLmN0cmxiaXQgICAgICAgID0gUzNDX0NMS0NPTl9TQ0xLX0NBTSwKIAkJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCiAJCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY3B1ZnJlcS5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2NwdWZyZXEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3NWI5Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY3B1ZnJlcS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjNjR4eC9jcHVmcmVxLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCi0gKgotICogUzNDNjR4eCBDUFVmcmVxIFN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICphcm1jbGs7Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqdmRkYXJtOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVndWxhdG9yX2xhdGVuY3k7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzY0MTAKLXN0cnVjdCBzM2M2NHh4X2R2ZnMgewotCXVuc2lnbmVkIGludCB2ZGRhcm1fbWluOwotCXVuc2lnbmVkIGludCB2ZGRhcm1fbWF4OwotfTsKLQotc3RhdGljIHN0cnVjdCBzM2M2NHh4X2R2ZnMgczNjNjR4eF9kdmZzX3RhYmxlW10gPSB7Ci0JWzBdID0geyAxMDAwMDAwLCAxMTUwMDAwIH0sCi0JWzFdID0geyAxMDUwMDAwLCAxMTUwMDAwIH0sCi0JWzJdID0geyAxMTAwMDAwLCAxMTUwMDAwIH0sCi0JWzNdID0geyAxMjAwMDAwLCAxMzUwMDAwIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIHMzYzY0eHhfZnJlcV90YWJsZVtdID0gewotCXsgMCwgIDY2MDAwIH0sCi0JeyAwLCAxMzMwMDAgfSwKLQl7IDEsIDIyMjAwMCB9LAotCXsgMSwgMjY2MDAwIH0sCi0JeyAyLCAzMzMwMDAgfSwKLQl7IDIsIDQwMDAwMCB9LAotCXsgMiwgNTMyMDAwIH0sCi0JeyAyLCA1MzMwMDAgfSwKLQl7IDMsIDY2NzAwMCB9LAotCXsgMCwgQ1BVRlJFUV9UQUJMRV9FTkQgfSwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBzM2M2NHh4X2NwdWZyZXFfdmVyaWZ5X3NwZWVkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQotewotCWlmIChwb2xpY3ktPmNwdSAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCBzM2M2NHh4X2ZyZXFfdGFibGUpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHMzYzY0eHhfY3B1ZnJlcV9nZXRfc3BlZWQodW5zaWduZWQgaW50IGNwdSkKLXsKLQlpZiAoY3B1ICE9IDApCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGNsa19nZXRfcmF0ZShhcm1jbGspIC8gMTAwMDsKLX0KLQotc3RhdGljIGludCBzM2M2NHh4X2NwdWZyZXFfc2V0X3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7Ci0Jc3RydWN0IHMzYzY0eHhfZHZmcyAqZHZmczsKLQotCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIHMzYzY0eHhfZnJlcV90YWJsZSwKLQkJCQkJICAgICB0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZpKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KLQlmcmVxcy5jcHUgPSAwOwotCWZyZXFzLm9sZCA9IGNsa19nZXRfcmF0ZShhcm1jbGspIC8gMTAwMDsKLQlmcmVxcy5uZXcgPSBzM2M2NHh4X2ZyZXFfdGFibGVbaV0uZnJlcXVlbmN5OwotCWZyZXFzLmZsYWdzID0gMDsKLQlkdmZzID0gJnMzYzY0eHhfZHZmc190YWJsZVtzM2M2NHh4X2ZyZXFfdGFibGVbaV0uaW5kZXhdOwotCi0JaWYgKGZyZXFzLm9sZCA9PSBmcmVxcy5uZXcpCi0JCXJldHVybiAwOwotCi0JcHJfZGVidWcoImNwdWZyZXE6IFRyYW5zaXRpb24gJWQtJWRrSHpcbiIsIGZyZXFzLm9sZCwgZnJlcXMubmV3KTsKLQotCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7Ci0KLSNpZmRlZiBDT05GSUdfUkVHVUxBVE9SCi0JaWYgKHZkZGFybSAmJiBmcmVxcy5uZXcgPiBmcmVxcy5vbGQpIHsKLQkJcmV0ID0gcmVndWxhdG9yX3NldF92b2x0YWdlKHZkZGFybSwKLQkJCQkJICAgIGR2ZnMtPnZkZGFybV9taW4sCi0JCQkJCSAgICBkdmZzLT52ZGRhcm1fbWF4KTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlwcl9lcnIoImNwdWZyZXE6IEZhaWxlZCB0byBzZXQgVkREQVJNIGZvciAlZGtIejogJWRcbiIsCi0JCQkgICAgICAgZnJlcXMubmV3LCByZXQpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCXJldCA9IGNsa19zZXRfcmF0ZShhcm1jbGssIGZyZXFzLm5ldyAqIDEwMDApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiY3B1ZnJlcTogRmFpbGVkIHRvIHNldCByYXRlICVka0h6OiAlZFxuIiwKLQkJICAgICAgIGZyZXFzLm5ldywgcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1JFR1VMQVRPUgotCWlmICh2ZGRhcm0gJiYgZnJlcXMubmV3IDwgZnJlcXMub2xkKSB7Ci0JCXJldCA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZSh2ZGRhcm0sCi0JCQkJCSAgICBkdmZzLT52ZGRhcm1fbWluLAotCQkJCQkgICAgZHZmcy0+dmRkYXJtX21heCk7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJcHJfZXJyKCJjcHVmcmVxOiBGYWlsZWQgdG8gc2V0IFZEREFSTSBmb3IgJWRrSHo6ICVkXG4iLAotCQkJICAgICAgIGZyZXFzLm5ldywgcmV0KTsKLQkJCWdvdG8gZXJyX2NsazsKLQkJfQotCX0KLSNlbmRpZgotCi0JY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Ci0KLQlwcl9kZWJ1ZygiY3B1ZnJlcTogU2V0IGFjdHVhbCBmcmVxdWVuY3kgJWx1a0h6XG4iLAotCQkgY2xrX2dldF9yYXRlKGFybWNsaykgLyAxMDAwKTsKLQotCXJldHVybiAwOwotCi1lcnJfY2xrOgotCWlmIChjbGtfc2V0X3JhdGUoYXJtY2xrLCBmcmVxcy5vbGQgKiAxMDAwKSA8IDApCi0JCXByX2VycigiRmFpbGVkIHRvIHJlc3RvcmUgb3JpZ2luYWwgY2xvY2sgcmF0ZVxuIik7Ci1lcnI6Ci0JY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jaWZkZWYgQ09ORklHX1JFR1VMQVRPUgotc3RhdGljIHZvaWQgX19pbml0IHMzYzY0eHhfY3B1ZnJlcV9jb25maWdfcmVndWxhdG9yKHZvaWQpCi17Ci0JaW50IGNvdW50LCB2LCBpLCBmb3VuZDsKLQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZyZXE7Ci0Jc3RydWN0IHMzYzY0eHhfZHZmcyAqZHZmczsKLQotCWNvdW50ID0gcmVndWxhdG9yX2NvdW50X3ZvbHRhZ2VzKHZkZGFybSk7Ci0JaWYgKGNvdW50IDwgMCkgewotCQlwcl9lcnIoImNwdWZyZXE6IFVuYWJsZSB0byBjaGVjayBzdXBwb3J0ZWQgdm9sdGFnZXNcbiIpOwotCX0KLQotCWZyZXEgPSBzM2M2NHh4X2ZyZXFfdGFibGU7Ci0Jd2hpbGUgKGNvdW50ID4gMCAmJiBmcmVxLT5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpIHsKLQkJaWYgKGZyZXEtPmZyZXF1ZW5jeSA9PSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQpCi0JCQljb250aW51ZTsKLQotCQlkdmZzID0gJnMzYzY0eHhfZHZmc190YWJsZVtmcmVxLT5pbmRleF07Ci0JCWZvdW5kID0gMDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJdiA9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2UodmRkYXJtLCBpKTsKLQkJCWlmICh2ID49IGR2ZnMtPnZkZGFybV9taW4gJiYgdiA8PSBkdmZzLT52ZGRhcm1fbWF4KQotCQkJCWZvdW5kID0gMTsKLQkJfQotCi0JCWlmICghZm91bmQpIHsKLQkJCXByX2RlYnVnKCJjcHVmcmVxOiAlZGtIeiB1bnN1cHBvcnRlZCBieSByZWd1bGF0b3JcbiIsCi0JCQkJIGZyZXEtPmZyZXF1ZW5jeSk7Ci0JCQlmcmVxLT5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7Ci0JCX0KLQotCQlmcmVxKys7Ci0JfQotCi0JLyogR3Vlc3MgYmFzZWQgb24gaGF2aW5nIHRvIGRvIGFuIEkyQy9TUEkgd3JpdGU7IGluIGZ1dHVyZSB3ZQotCSAqIHdpbGwgYmUgYWJsZSB0byBxdWVyeSB0aGUgcmVndWxhdG9yIHBlcmZvcm1hbmNlIGhlcmUuICovCi0JcmVndWxhdG9yX2xhdGVuY3kgPSAxICogMTAwMCAqIDEwMDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBzM2M2NHh4X2NwdWZyZXFfZHJpdmVyX2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZyZXE7Ci0KLQlpZiAocG9saWN5LT5jcHUgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoczNjNjR4eF9mcmVxX3RhYmxlID09IE5VTEwpIHsKLQkJcHJfZXJyKCJjcHVmcmVxOiBObyBmcmVxdWVuY3kgaW5mb3JtYXRpb24gZm9yIHRoaXMgQ1BVXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JYXJtY2xrID0gY2xrX2dldChOVUxMLCAiYXJtY2xrIik7Ci0JaWYgKElTX0VSUihhcm1jbGspKSB7Ci0JCXByX2VycigiY3B1ZnJlcTogVW5hYmxlIHRvIG9idGFpbiBBUk1DTEs6ICVsZFxuIiwKLQkJICAgICAgIFBUUl9FUlIoYXJtY2xrKSk7Ci0JCXJldHVybiBQVFJfRVJSKGFybWNsayk7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1JFR1VMQVRPUgotCXZkZGFybSA9IHJlZ3VsYXRvcl9nZXQoTlVMTCwgInZkZGFybSIpOwotCWlmIChJU19FUlIodmRkYXJtKSkgewotCQlyZXQgPSBQVFJfRVJSKHZkZGFybSk7Ci0JCXByX2VycigiY3B1ZnJlcTogRmFpbGVkIHRvIG9idGFpbiBWRERBUk06ICVkXG4iLCByZXQpOwotCQlwcl9lcnIoImNwdWZyZXE6IE9ubHkgZnJlcXVlbmN5IHNjYWxpbmcgYXZhaWxhYmxlXG4iKTsKLQkJdmRkYXJtID0gTlVMTDsKLQl9IGVsc2UgewotCQlzM2M2NHh4X2NwdWZyZXFfY29uZmlnX3JlZ3VsYXRvcigpOwotCX0KLSNlbmRpZgotCi0JZnJlcSA9IHMzYzY0eHhfZnJlcV90YWJsZTsKLQl3aGlsZSAoZnJlcS0+ZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcjsKLQotCQkvKiBDaGVjayBmb3IgZnJlcXVlbmNpZXMgd2UgY2FuIGdlbmVyYXRlICovCi0JCXIgPSBjbGtfcm91bmRfcmF0ZShhcm1jbGssIGZyZXEtPmZyZXF1ZW5jeSAqIDEwMDApOwotCQlyIC89IDEwMDA7Ci0JCWlmIChyICE9IGZyZXEtPmZyZXF1ZW5jeSkgewotCQkJcHJfZGVidWcoImNwdWZyZXE6ICVka0h6IHVuc3VwcG9ydGVkIGJ5IGNsb2NrXG4iLAotCQkJCSBmcmVxLT5mcmVxdWVuY3kpOwotCQkJZnJlcS0+ZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOwotCQl9Ci0KLQkJLyogSWYgd2UgaGF2ZSBubyByZWd1bGF0b3IgdGhlbiBhc3N1bWUgc3RhcnR1cAotCQkgKiBmcmVxdWVuY3kgaXMgdGhlIG1heGltdW0gd2UgY2FuIHN1cHBvcnQuICovCi0JCWlmICghdmRkYXJtICYmIGZyZXEtPmZyZXF1ZW5jeSA+IHMzYzY0eHhfY3B1ZnJlcV9nZXRfc3BlZWQoMCkpCi0JCQlmcmVxLT5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7Ci0KLQkJZnJlcSsrOwotCX0KLQotCXBvbGljeS0+Y3VyID0gY2xrX2dldF9yYXRlKGFybWNsaykgLyAxMDAwOwotCi0JLyogRGF0YXNoZWV0IHNheXMgUExMIHN0YWJhbGlzYXRpb24gdGltZSAoaWYgd2Ugd2VyZSB0byB1c2UKLQkgKiB0aGUgUExMcywgd2hpY2ggd2UgZG9uJ3QgY3VycmVudGx5KSBpcyB+MzAwdXMgd29yc3QgY2FzZSwKLQkgKiBidXQgYWRkIHNvbWUgZnVkZ2UuCi0JICovCi0JcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9ICg1MDAgKiAxMDAwKSArIHJlZ3VsYXRvcl9sYXRlbmN5OwotCi0JcmV0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIHMzYzY0eHhfZnJlcV90YWJsZSk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCXByX2VycigiY3B1ZnJlcTogRmFpbGVkIHRvIGNvbmZpZ3VyZSBmcmVxdWVuY3kgdGFibGU6ICVkXG4iLAotCQkgICAgICAgcmV0KTsKLQkJcmVndWxhdG9yX3B1dCh2ZGRhcm0pOwotCQljbGtfcHV0KGFybWNsayk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBzM2M2NHh4X2NwdWZyZXFfZHJpdmVyID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkuZmxhZ3MgICAgICAgICAgPSAwLAotCS52ZXJpZnkJCT0gczNjNjR4eF9jcHVmcmVxX3ZlcmlmeV9zcGVlZCwKLQkudGFyZ2V0CQk9IHMzYzY0eHhfY3B1ZnJlcV9zZXRfdGFyZ2V0LAotCS5nZXQJCT0gczNjNjR4eF9jcHVmcmVxX2dldF9zcGVlZCwKLQkuaW5pdAkJPSBzM2M2NHh4X2NwdWZyZXFfZHJpdmVyX2luaXQsCi0JLm5hbWUJCT0gInMzYyIsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzM2M2NHh4X2NwdWZyZXFfaW5pdCh2b2lkKQotewotCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmczNjNjR4eF9jcHVmcmVxX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChzM2M2NHh4X2NwdWZyZXFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LW9uZW5hbmQxLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LW9uZW5hbmQxLmMKaW5kZXggOTJmZmQ1Yi4uOTk5ZjllMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1vbmVuYW5kMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtb25lbmFuZDEuYwpAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2M2NHh4X29uZW5hbmQxX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CT0gUzNDNjRYWF9QQV9PTkVOQU5EMSwKQEAgLTQ2LDEwICs0OCw2IEBACiAKIHZvaWQgczNjNjR4eF9vbmVuYW5kMV9zZXRfcGxhdGRhdGEoc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCiB7Ci0Jc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSAqcGQ7Ci0KLQlwZCA9IGttZW1kdXAocGRhdGEsIHNpemVvZihzdHJ1Y3Qgb25lbmFuZF9wbGF0Zm9ybV9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IGZvciBwbGF0Zm9ybSBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JczNjNjR4eF9kZXZpY2Vfb25lbmFuZDEuZGV2LnBsYXRmb3JtX2RhdGEgPSBwZDsKKwlzM2Nfc2V0X3BsYXRkYXRhKHBkYXRhLCBzaXplb2Yoc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSksCisJCQkgJnMzYzY0eHhfZGV2aWNlX29uZW5hbmQxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtc3BpLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LXNwaS5jCmluZGV4IDgyZGIwNzIuLjVlNmI0MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtc3BpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1zcGkuYwpAQCAtODgsNiArODgsNyBAQAogCS5jZmdfZ3BpbyA9IHMzYzY0eHhfc3BpX2NmZ19ncGlvLAogCS5maWZvX2x2bF9tYXNrID0gMHg3ZiwKIAkucnhfbHZsX29mZnNldCA9IDEzLAorCS50eF9zdF9kb25lID0gMjEsCiB9OwogCiBzdGF0aWMgdTY0IHNwaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKQEAgLTEzMiw2ICsxMzMsNyBAQAogCS5jZmdfZ3BpbyA9IHMzYzY0eHhfc3BpX2NmZ19ncGlvLAogCS5maWZvX2x2bF9tYXNrID0gMHg3ZiwKIAkucnhfbHZsX29mZnNldCA9IDEzLAorCS50eF9zdF9kb25lID0gMjEsCiB9OwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX3NwaTEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZG1hLmMKaW5kZXggYjE5NzE3MS4uMjA0YmZhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kbWEuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJcmV0dXJuIGNoYW47CiB9CiAKLWludCBzM2MyNDEwX2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsIGludCB4ZmVydW5pdCkKK2ludCBzM2MyNDEwX2RtYV9jb25maWcoZW51bSBkbWFfY2ggY2hhbm5lbCwgaW50IHhmZXJ1bml0KQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKIApAQCAtMjk3LDcgKzI5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBzM2MyNDEwX2RtYV9jdHJsKHVuc2lnbmVkIGludCBjaGFubmVsLCBlbnVtIHMzYzI0MTBfY2hhbl9vcCBvcCkKK2ludCBzM2MyNDEwX2RtYV9jdHJsKGVudW0gZG1hX2NoIGNoYW5uZWwsIGVudW0gczNjMjQxMF9jaGFuX29wIG9wKQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKIApAQCAtMzMxLDcgKzMzMSw3IEBACiAgKgogICovCiAKLWludCBzM2MyNDEwX2RtYV9lbnF1ZXVlKHVuc2lnbmVkIGludCBjaGFubmVsLCB2b2lkICppZCwKK2ludCBzM2MyNDEwX2RtYV9lbnF1ZXVlKGVudW0gZG1hX2NoIGNoYW5uZWwsIHZvaWQgKmlkLAogCQkJZG1hX2FkZHJfdCBkYXRhLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CkBAIC00MTUsNyArNDE1LDcgQEAKIEVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfZW5xdWV1ZSk7CiAKIAotaW50IHMzYzI0MTBfZG1hX2RldmNvbmZpZyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2ludCBzM2MyNDEwX2RtYV9kZXZjb25maWcoZW51bSBkbWFfY2ggY2hhbm5lbCwKIAkJCSAgZW51bSBzM2MyNDEwX2RtYXNyYyBzb3VyY2UsCiAJCQkgIHVuc2lnbmVkIGxvbmcgZGV2YWRkcikKIHsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9kZXZjb25maWcpOwogCiAKLWludCBzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbih1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2ludCBzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbihlbnVtIGRtYV9jaCBjaGFubmVsLAogCQkJICAgIGRtYV9hZGRyX3QgKnNyYywgZG1hX2FkZHJfdCAqZHN0KQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogICogZ2V0IGNvbnRyb2wgb2YgYW4gZG1hIGNoYW5uZWwKICovCiAKLWludCBzM2MyNDEwX2RtYV9yZXF1ZXN0KHVuc2lnbmVkIGludCBjaGFubmVsLAoraW50IHMzYzI0MTBfZG1hX3JlcXVlc3QoZW51bSBkbWFfY2ggY2hhbm5lbCwKIAkJCXN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCwKIAkJCXZvaWQgKmRldikKIHsKQEAgLTUzMyw3ICs1MzMsNyBAQAogICogYWxsb3dlZCB0byBnbyB0aHJvdWdoLgogKi8KIAotaW50IHMzYzI0MTBfZG1hX2ZyZWUodW5zaWduZWQgaW50IGNoYW5uZWwsIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCkKK2ludCBzM2MyNDEwX2RtYV9mcmVlKGVudW0gZG1hX2NoIGNoYW5uZWwsIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmZhODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX01BQ0hfQ0xLREVWX0hfXworI2RlZmluZSBfX01BQ0hfQ0xLREVWX0hfXworCisjZGVmaW5lIF9fY2xrX2dldChjbGspICh7IDE7IH0pCisjZGVmaW5lIF9fY2xrX3B1dChjbGspIGRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcmVncy1mYi5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9yZWdzLWZiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNmVlMGEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9yZWdzLWZiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICogQ29weXJpZ2h0IDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4KLSAqCi0gKiBQYXdlbCBPc2NpYWsgPHAub3NjaWFrQHNhbXN1bmcuY29tPgotICogQmFzZWQgb24gcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3MtZmIuaCBieSBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogRnJhbWVidWZmZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIFNhbXN1bmcgUzNDNjR4eC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01BQ0hfUkVHU19GQl9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUFDSF9SRUdTX0ZCX0ggX19GSUxFX18KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgotCi0jZW5kaWYgLyogX19BU01fQVJDSF9NQUNIX1JFR1NfRkJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtYW53NjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtYW53NjQxMC5jCmluZGV4IGE1M2NmMTQuLmNiODg2NDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLWFudzY0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1hbnc2NDEwLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZmIuaD4KICNpbmNsdWRlIDxtYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtNDQsNiArNDMsNyBAQAogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxwbGF0L2lpYy5oPgogI2luY2x1ZGUgPHBsYXQvZmIuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtZmItdjQuaD4KIAogI2luY2x1ZGUgPG1hY2gvczNjNjQxMC5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLWhtdC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtaG10LmMKaW5kZXggYjI2Mzk1OC4uYjNkOTNjYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtaG10LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtaG10LmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZmIuaD4KICNpbmNsdWRlIDxtYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtNDIsNiArNDEsNyBAQAogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgogCiAjZGVmaW5lIFVDT04gUzNDMjQxMF9VQ09OX0RFRkFVTFQKICNkZWZpbmUgVUxDT04gKFMzQzI0MTBfTENPTl9DUzggfCBTM0MyNDEwX0xDT05fUE5PTkUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1taW5pNjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtbWluaTY0MTAuYwppbmRleCA4OWYzNWUwLi41MjdmNDliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1taW5pNjQxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLW1pbmk2NDEwLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWZiLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbW9kZW0uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3Mtc3JvbS5oPgpAQCAtNDIsNiArNDEsNyBAQAogI2luY2x1ZGUgPHBsYXQvbmFuZC5oPgogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxwbGF0L3RzLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+CiAKICNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtbmNwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1uY3AuYwppbmRleCBjNDk4NjQ5Li4wMWM2ODU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1uY3AuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1uY3AuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1mYi5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC00NCw2ICs0Myw3IEBACiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+CiAKICNkZWZpbmUgVUNPTiBTM0MyNDEwX1VDT05fREVGQVVMVAogI2RlZmluZSBVTENPTiBTM0MyNDEwX0xDT05fQ1M4IHwgUzNDMjQxMF9MQ09OX1BOT05FCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1yZWFsNjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtcmVhbDY0MTAuYwppbmRleCA0OTU3YWIwLi45NWIwNGIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1yZWFsNjQxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXJlYWw2NDEwLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWZiLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbW9kZW0uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3Mtc3JvbS5oPgpAQCAtNDMsNiArNDIsNyBAQAogI2luY2x1ZGUgPHBsYXQvbmFuZC5oPgogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxwbGF0L3RzLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+CiAKICNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21hcnRxNS5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21hcnRxNS5jCmluZGV4IDNhM2U1YWMuLjM0MmU4ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtYXJ0cTUuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWFydHE1LmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAKICNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1mYi5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9zM2M2NDEwLmg+CiAKQEAgLTI5LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2ZiLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgogCiAjaW5jbHVkZSAibWFjaC1zbWFydHEuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21hcnRxNy5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21hcnRxNy5jCmluZGV4IGU2NTM3NTguLjU3OTYzOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtYXJ0cTcuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWFydHE3LmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAKICNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1mYi5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9zM2M2NDEwLmg+CiAKQEAgLTI5LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2ZiLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgogCiAjaW5jbHVkZSAibWFjaC1zbWFydHEuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21kazY0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtZGs2NDEwLmMKaW5kZXggMmMwMzUzYS4uZWNiZWE5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21kazY0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWRrNjQxMC5jCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWZiLmg+CiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTcxLDYgKzcwLDggQEAKICNpbmNsdWRlIDxwbGF0L2FkYy5oPgogI2luY2x1ZGUgPHBsYXQvdHMuaD4KICNpbmNsdWRlIDxwbGF0L2tleXBhZC5oPgorI2luY2x1ZGUgPHBsYXQvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+CiAKICNkZWZpbmUgVUNPTiBTM0MyNDEwX1VDT05fREVGQVVMVCB8IFMzQzI0MTBfVUNPTl9VQ0xLCiAjZGVmaW5lIFVMQ09OIFMzQzI0MTBfTENPTl9DUzggfCBTM0MyNDEwX0xDT05fUE5PTkUgfCBTM0MyNDEwX0xDT05fU1RPUEIKQEAgLTIwOSwxNyArMjEwLDkgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfUkVHVUxBVE9SCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgc21kazY0MTBfYl9wd3JfNXZfY29uc3VtZXJzW10gPSB7Ci0JewotCQkvKiBXTTg1ODAgKi8KLQkJLnN1cHBseSA9ICJQVkREIiwKLQkJLmRldl9uYW1lID0gIjAtMDAxYiIsCi0JfSwKLQl7Ci0JCS8qIFdNODU4MCAqLwotCQkuc3VwcGx5ID0gIkFWREQiLAotCQkuZGV2X25hbWUgPSAiMC0wMDFiIiwKLQl9LAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHNtZGs2NDEwX2JfcHdyXzV2X2NvbnN1bWVyc1tdIF9faW5pdGRhdGEgPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiUFZERCIsICIwLTAwMWIiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJBVkREIiwgIjAtMDAxYiIpLAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHNtZGs2NDEwX2JfcHdyXzV2X2RhdGEgPSB7CkBAIC0zMzcsMTYgKzMzMCwxMiBAQAogCSZzM2NfZGV2aWNlX3J0YywKIAkmczNjX2RldmljZV90cywKIAkmczNjX2RldmljZV93ZHQsCi0JJnMzY19kZXZpY2VfdGltZXJbMV0sCi0JJnNtZGs2NDEwX2JhY2tsaWdodF9kZXZpY2UsCiB9OwogCiAjaWZkZWYgQ09ORklHX1JFR1VMQVRPUgogLyogQVJNIGNvcmUgKi8KIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBzbWRrNjQxMF92ZGRhcm1fY29uc3VtZXJzW10gPSB7Ci0JewotCQkuc3VwcGx5ID0gInZkZGFybSIsCi0JfQorCVJFR1VMQVRPUl9TVVBQTFkoInZkZGFybSIsIE5VTEwpLAogfTsKIAogLyogVkREQVJNLCBCVUNLMSBvbiBKNSAqLwpAQCAtNDg0LDExICs0NzMsNyBAQAogCiAvKiBVU0IsIEVYVCwgUENNLCBBREMvREFDLCBVU0IsIE1NQyAqLwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHdtODM1MF9kY2RjNF9jb25zdW1lcnNbXSA9IHsKLQl7Ci0JCS8qIFdNODU4MCAqLwotCQkuc3VwcGx5ID0gIkRWREQiLAotCQkuZGV2X25hbWUgPSAiMC0wMDFiIiwKLQl9LAorCVJFR1VMQVRPUl9TVVBQTFkoIkRWREQiLCAiMC0wMDFiIiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgd204MzUwX2RjZGM0X2RhdGEgPSB7CkBAIC01OTksNyArNTg0LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB3bTExOTJfbGRvMV9jb25zdW1lcnNbXSA9IHsKLQl7IC5zdXBwbHkgPSAiRFZERCIsIC5kZXZfbmFtZSA9ICIwLTAwMWIiLCB9LCAgIC8qIFdNODU4MCAqLworCVJFR1VMQVRPUl9TVVBQTFkoIkRWREQiLCAiMC0wMDFiIiksICAgLyogV004NTgwICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgd20xMTkyX2xkbzEgPSB7CkBAIC02NzksNiArNjY0LDE2IEBACiAJLm92ZXJzYW1wbGluZ19zaGlmdAk9IDIsCiB9OwogCisvKiBMQ0QgQmFja2xpZ2h0IGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21kazY0MTBfYmxfZ3Bpb19pbmZvID0geworCS5ubyA9IFMzQzY0WFhfR1BGKDE1KSwKKwkuZnVuYyA9IFMzQ19HUElPX1NGTigyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHNtZGs2NDEwX2JsX2RhdGEgPSB7CisJLnB3bV9pZCA9IDEsCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgc21kazY0MTBfbWFwX2lvKHZvaWQpCiB7CiAJdTMyIHRtcDsKQEAgLTc0MCw2ICs3MzUsOCBAQAogCiAJczNjX2lkZV9zZXRfcGxhdGRhdGEoJnNtZGs2NDEwX2lkZV9wZGF0YSk7CiAKKwlzYW1zdW5nX2JsX3NldCgmc21kazY0MTBfYmxfZ3Bpb19pbmZvLCAmc21kazY0MTBfYmxfZGF0YSk7CisKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWRrNjQxMF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNtZGs2NDEwX2RldmljZXMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3BtLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvcG0uYwppbmRleCBiYzFjNDcwLi44YmFkNjQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvcG0uYwpAQCAtMTEyLDcgKzExMiw3IEBACiAgKiB0aGlzLgogICovCiAKLXN0YXRpYyB2b2lkIHMzYzY0eHhfY3B1X3N1c3BlbmQodm9pZCkKK3N0YXRpYyBpbnQgczNjNjR4eF9jcHVfc3VzcGVuZCh1bnNpZ25lZCBsb25nIGFyZykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3NldHVwLWZiLTI0YnBwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvc2V0dXAtZmItMjRicHAuYwppbmRleCA4ZjMwOTExLi44M2QyYWZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvc2V0dXAtZmItMjRicHAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvc2V0dXAtZmItMjRicHAuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCi0jaW5jbHVkZSA8bWFjaC9yZWdzLWZiLmg+CiAjaW5jbHVkZSA8cGxhdC9mYi5oPgogI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3NsZWVwLlMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvc2xlZXAuUwppbmRleCAxZjg3NzMyLi4zNDMxM2Y5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvc2xlZXAuUworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvc2xlZXAuUwpAQCAtMjUsMjkgKzI1LDYgQEAKIAogCS50ZXh0CiAKLQkvKiBzM2NfY3B1X3NhdmUKLQkgKgotCSAqIFNhdmUgZW5vdWdoIHByb2Nlc3NvciBzdGF0ZSB0byBhbGxvdyB0aGUgcmVzdGFydCBvZiB0aGUgcG0uYwotCSAqIGNvZGUgYWZ0ZXIgcmVzdW1lLgotCSAqCi0JICogZW50cnk6Ci0JICoJcjEgPSB2OnAgb2Zmc2V0Ci0JKi8KLQotRU5UUlkoczNjX2NwdV9zYXZlKQotCXN0bWZkCXNwISwgeyByNCAtIHIxMiwgbHIgfQotCWxkcglyMywgPXJlc3VtZV93aXRoX21tdQotCWJsCWNwdV9zdXNwZW5kCi0KLQlAQCBjYWxsIGZpbmFsIHN1c3BlbmQgY29kZQotCWxkcglyMCwgPXBtX2NwdV9zbGVlcAotCWxkcglwYywgW3IwXQotCQotCUBAIHJldHVybiB0byB0aGUgY2FsbGVyLCBhZnRlciB0aGUgTU1VIGlzIHR1cm5lZCBvbi4KLQlAQCByZXN0b3JlIHRoZSBsYXN0IGJpdHMgb2YgdGhlIHN0YWNrIGFuZCByZXR1cm4uCi1yZXN1bWVfd2l0aF9tbXU6Ci0JbGRtZmQJc3AhLCB7IHI0IC0gcjEyLCBwYyB9CUAgcmV0dXJuLCBmcm9tIHNwIGZyb20gczNjX2NwdV9zYXZlCi0KIAkvKiBTbGVlcCBtYWdpYywgdGhlIHdvcmQgYmVmb3JlIHRoZSByZXN1bWUgZW50cnkgcG9pbnQgc28gdGhhdCB0aGUKIAkgKiBib290bG9hZGVyIGNhbiBjaGVjayBmb3IgYSByZXN1bWVhYmxlIGltYWdlLiAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9LY29uZmlnCmluZGV4IDAxN2FmNGMuLjY1Yzc1MTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9LY29uZmlnCkBAIC0zNiw2ICszNiw3IEBACiAJc2VsZWN0IFMzQ19ERVZfV0RUCiAJc2VsZWN0IFMzQzY0WFhfREVWX1NQSQogCXNlbGVjdCBTQU1TVU5HX0RFVl9BREMKKwlzZWxlY3QgU0FNU1VOR19ERVZfQkFDS0xJR0hUCiAJc2VsZWN0IFNBTVNVTkdfREVWX1BXTQogCXNlbGVjdCBTQU1TVU5HX0RFVl9UUwogCXNlbGVjdCBTNVA2NFgwX1NFVFVQX0kyQzEKQEAgLTUwLDYgKzUxLDcgQEAKIAlzZWxlY3QgUzNDX0RFVl9XRFQKIAlzZWxlY3QgUzNDNjRYWF9ERVZfU1BJCiAJc2VsZWN0IFNBTVNVTkdfREVWX0FEQworCXNlbGVjdCBTQU1TVU5HX0RFVl9CQUNLTElHSFQKIAlzZWxlY3QgU0FNU1VOR19ERVZfUFdNCiAJc2VsZWN0IFNBTVNVTkdfREVWX1RTCiAJc2VsZWN0IFM1UDY0WDBfU0VUVVBfSTJDMQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Nsb2NrLXM1cDY0NDAuYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jbG9jay1zNXA2NDQwLmMKaW5kZXggOWYxMmMyZS4uMGU5Y2QzMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Nsb2NrLXM1cDY0NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY2xvY2stczVwNjQ0MC5jCkBAIC05NSw3ICs5NSw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2hjbGsgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImNsa19oY2xrIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfYXJtY2xrLmNsaywKIAl9LAogCS5yZWdfZGl2CT0geyAucmVnID0gUzVQNjRYMF9DTEtfRElWMCwgLnNoaWZ0ID0gOCwgLnNpemUgPSA0IH0sCkBAIC0xMDQsNyArMTAzLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfcGNsayA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAiY2xrX3BjbGsiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrLmNsaywKIAl9LAogCS5yZWdfZGl2CT0geyAucmVnID0gUzVQNjRYMF9DTEtfRElWMCwgLnNoaWZ0ID0gMTIsIC5zaXplID0gNCB9LApAQCAtMTEyLDcgKzExMCw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2hjbGtfbG93ID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJjbGtfaGNsa19sb3ciLAotCQkuaWQJCT0gLTEsCiAJfSwKIAkuc291cmNlcwk9ICZjbGtzZXRfaGNsa19sb3csCiAJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVA2NFgwX1NZU19PVEhFUlMsIC5zaGlmdCA9IDYsIC5zaXplID0gMSB9LApAQCAtMTIyLDcgKzExOSw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3BjbGtfbG93ID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJjbGtfcGNsa19sb3ciLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJfSwKIAkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UDY0WDBfQ0xLX0RJVjMsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDQgfSwKQEAgLTEzNiwxODcgKzEzMiwxNjcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0gewogCXsKIAkJLm5hbWUJCT0gIm5hbmQiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrLmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX21lbV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDIpLAogCX0sIHsKIAkJLm5hbWUJCT0gInBvc3QiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDUpCiAJfSwgewogCQkubmFtZQkJPSAiMmQiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrLmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX2hjbGswX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgOCksCiAJfSwgewogCQkubmFtZQkJPSAicGRtYSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX2hjbGswX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTIpLAogCX0sIHsKIAkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX2hjbGswX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTcpLAogCX0sIHsKIAkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX2hjbGswX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTgpLAogCX0sIHsKIAkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4yIiwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX2hjbGswX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTkpLAogCX0sIHsKIAkJLm5hbWUJCT0gIm90ZyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX2hjbGswX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMjApCiAJfSwgewogCQkubmFtZQkJPSAiaXJvbSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGsuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfaGNsazBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyNSksCiAJfSwgewogCQkubmFtZQkJPSAibGNkIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaGNsa19sb3cuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfaGNsazFfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJoY2xrX2ZpbWd2ZyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGsuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfaGNsazFfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ0c2kiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCX0sIHsKIAkJLm5hbWUJCT0gIndhdGNoZG9nIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19sb3cuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDUpLAogCX0sIHsKIAkJLm5hbWUJCT0gInJ0YyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA2KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ0aW1lcnMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNyksCiAJfSwgewogCQkubmFtZQkJPSAicGNtIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19sb3cuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDgpLAogCX0sIHsKIAkJLm5hbWUJCT0gImFkYyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxMiksCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19sb3cuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE3KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJzcGkiLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMjEpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwaSIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyMiksCiAJfSwgewogCQkubmFtZQkJPSAiZ3BzIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19sb3cuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDI1KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJpaXMiLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAic2Ftc3VuZy1pMnMuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMjYpLAogCX0sIHsKIAkJLm5hbWUJCT0gImRzaW0iLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMjgpLAogCX0sIHsKIAkJLm5hbWUJCT0gImV0bSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGsuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDI5KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJkbWMwIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcGNsay5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMzApLAogCX0sIHsKIAkJLm5hbWUJCT0gInBjbGtfZmltZ3ZnIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcGNsay5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMzEpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNjbGtfc3BpXzQ4IiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjAiLAogCQkucGFyZW50CQk9ICZjbGtfNDhtLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfc2Nsa19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDIyKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJzY2xrX3NwaV80OCIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4xIiwKIAkJLnBhcmVudAkJPSAmY2xrXzQ4bSwKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3NjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyMyksCiAJfSwgewogCQkubmFtZQkJPSAibW1jXzQ4bSIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa180OG0sCiAJCS5lbmFibGUJCT0gczVwNjR4MF9zY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMjcpLAogCX0sIHsKIAkJLm5hbWUJCT0gIm1tY180OG0iLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjEiLAogCQkucGFyZW50CQk9ICZjbGtfNDhtLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfc2Nsa19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDI4KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJtbWNfNDhtIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4yIiwKIAkJLnBhcmVudAkJPSAmY2xrXzQ4bSwKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3NjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyOSksCkBAIC0zMjksNDMgKzMwNSw0MCBAQAogc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3NbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJpbnRjIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaGNsay5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEpLAogCX0sIHsKIAkJLm5hbWUJCT0gIm1lbSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGsuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfaGNsazBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyMSksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzM2M2NDAwLXVhcnQuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMSksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2M2NDAwLXVhcnQuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMiksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAyLAorCQkuZGV2bmFtZQk9ICJzM2M2NDAwLXVhcnQuMiIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMyksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAzLAorCQkuZGV2bmFtZQk9ICJzM2M2NDAwLXVhcnQuMyIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNCksCiAJfSwgewogCQkubmFtZQkJPSAiZ3BpbyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxOCksCkBAIC0zNzQsMTIgKzM0NywxMCBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfaWlzX2NkX3Y0MCA9IHsKIAkubmFtZQkJPSAiaWlzX2NkY2xrX3Y0MCIsCi0JLmlkCQk9IC0xLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3BjbV9jZCA9IHsKIAkubmFtZQkJPSAicGNtX2NkY2xrIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X2dyb3VwMV9saXN0W10gPSB7CkBAIC00MjAsNyArMzkxLDcgQEAKIAl7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMCIsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDI0KSwKIAkJCS5lbmFibGUJCT0gczVwNjR4MF9zY2xrX2N0cmwsCiAJCX0sCkBAIC00MzAsNyArNDAxLDcgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDEsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDI1KSwKIAkJCS5lbmFibGUJCT0gczVwNjR4MF9zY2xrX2N0cmwsCiAJCX0sCkBAIC00NDAsNyArNDExLDcgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDIsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMiIsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDI2KSwKIAkJCS5lbmFibGUJCT0gczVwNjR4MF9zY2xrX2N0cmwsCiAJCX0sCkBAIC00NTAsNyArNDIxLDYgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAidWNsazEiLAotCQkJLmlkCQk9IC0xLAogCQkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKIAkJCS5lbmFibGUJCT0gczVwNjR4MF9zY2xrX2N0cmwsCiAJCX0sCkBAIC00NjAsNyArNDMwLDcgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19zcGkiLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4wIiwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMjApLAogCQkJLmVuYWJsZQkJPSBzNXA2NHgwX3NjbGtfY3RybCwKIAkJfSwKQEAgLTQ3MCw3ICs0NDAsNyBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX3NwaSIsCi0JCQkuaWQJCT0gMSwKKwkJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjEiLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAyMSksCiAJCQkuZW5hYmxlCQk9IHM1cDY0eDBfc2Nsa19jdHJsLAogCQl9LApAQCAtNDgwLDcgKzQ1MCw2IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfcG9zdCIsCi0JCQkuaWQJCT0gLTEsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDEwKSwKIAkJCS5lbmFibGUJCT0gczVwNjR4MF9zY2xrX2N0cmwsCiAJCX0sCkBAIC00OTAsNyArNDU5LDYgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19kaXNwY29uIiwKLQkJCS5pZAkJPSAtMSwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMSksCiAJCQkuZW5hYmxlCQk9IHM1cDY0eDBfc2NsazFfY3RybCwKIAkJfSwKQEAgLTUwMCw3ICs0NjgsNiBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2ZpbWd2ZyIsCi0JCQkuaWQJCT0gLTEsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDIpLAogCQkJLmVuYWJsZQkJPSBzNXA2NHgwX3NjbGsxX2N0cmwsCiAJCX0sCkBAIC01MTAsNyArNDc3LDYgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19hdWRpbzIiLAotCQkJLmlkCQk9IC0xLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAxMSksCiAJCQkuZW5hYmxlCQk9IHM1cDY0eDBfc2Nsa19jdHJsLAogCQl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Nsb2NrLXM1cDY0NTAuYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jbG9jay1zNXA2NDUwLmMKaW5kZXggNGVlYzQ1Ny4uZDlkYzE2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Nsb2NrLXM1cDY0NTAuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY2xvY2stczVwNjQ1MC5jCkBAIC0zNiw3ICszNiw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfZHBsbCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAibW91dF9kcGxsIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMJPSAmY2xrX3NyY19kcGxsLAogCS5yZWdfc3JjCT0geyAucmVnID0gUzVQNjRYMF9DTEtfU1JDMCwgLnNoaWZ0ID0gNSwgLnNpemUgPSAxIH0sCkBAIC05Niw3ICs5NSw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2RvdXRfZXBsbCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAiZG91dF9lcGxsIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfbW91dF9lcGxsLmNsaywKIAl9LAogCS5yZWdfZGl2CT0geyAucmVnID0gUzVQNjRYMF9DTEtfRElWMSwgLnNoaWZ0ID0gMjQsIC5zaXplID0gNCB9LApAQCAtMTA1LDcgKzEwMyw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfaGNsa19zZWwgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gIm1vdXRfaGNsa19zZWwiLAotCQkuaWQJCT0gLTEsCiAJfSwKIAkuc291cmNlcwk9ICZjbGtzZXRfaGNsa19sb3csCiAJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVA2NFgwX09USEVSUywgLnNoaWZ0ID0gMTUsIC5zaXplID0gMSB9LApAQCAtMTI0LDcgKzEyMSw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2hjbGsgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImNsa19oY2xrIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMJPSAmY2xrc2V0X2hjbGssCiAJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVA2NFgwX09USEVSUywgLnNoaWZ0ID0gMTQsIC5zaXplID0gMSB9LApAQCAtMTM0LDcgKzEzMCw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3BjbGsgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImNsa19wY2xrIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaGNsay5jbGssCiAJfSwKIAkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UDY0WDBfQ0xLX0RJVjAsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDQgfSwKQEAgLTE0Miw3ICsxMzcsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kb3V0X3B3bV9yYXRpbzAgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImNsa19kb3V0X3B3bV9yYXRpbzAiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19tb3V0X2hjbGtfc2VsLmNsaywKIAl9LAogCS5yZWdfZGl2CT0geyAucmVnID0gUzVQNjRYMF9DTEtfRElWMywgLnNoaWZ0ID0gMTYsIC5zaXplID0gNCB9LApAQCAtMTUxLDcgKzE0NSw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3BjbGtfdG9fd2R0X3B3bSA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAiY2xrX3BjbGtfdG9fd2R0X3B3bSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2RvdXRfcHdtX3JhdGlvMC5jbGssCiAJfSwKIAkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UDY0WDBfQ0xLX0RJVjMsIC5zaGlmdCA9IDIwLCAuc2l6ZSA9IDQgfSwKQEAgLTE2MCw3ICsxNTMsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19oY2xrX2xvdyA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAiY2xrX2hjbGtfbG93IiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMJPSAmY2xrc2V0X2hjbGtfbG93LAogCS5yZWdfc3JjCT0geyAucmVnID0gUzVQNjRYMF9PVEhFUlMsIC5zaGlmdCA9IDYsIC5zaXplID0gMSB9LApAQCAtMTcwLDcgKzE2Miw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3BjbGtfbG93ID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJjbGtfcGNsa19sb3ciLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJfSwKIAkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UDY0WDBfQ0xLX0RJVjMsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDQgfSwKQEAgLTE4NCwxMDkgKzE3NSwxMDEgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0gewogCXsKIAkJLm5hbWUJCT0gInVzYmhvc3QiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDMpLAogCX0sIHsKIAkJLm5hbWUJCT0gInBkbWEiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJoc21tYyIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE3KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJoc21tYyIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE4KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJoc21tYyIsCi0JCS5pZAkJPSAyLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMiIsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE5KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1c2JvdGciLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDIwKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJsY2QiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfaGNsazFfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJydGMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNiksCiAJfSwgewogCQkubmFtZQkJPSAiYWRjIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19sb3cuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJpMmMiLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTcpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwaSIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyMSksCiAJfSwgewogCQkubmFtZQkJPSAic3BpIiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjEiLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19sb3cuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDIyKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJpaXMiLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAic2Ftc3VuZy1pMnMuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMjYpLAogCX0sIHsKIAkJLm5hbWUJCT0gImlpcyIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzYW1zdW5nLWkycy4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxNSksCiAJfSwgewogCQkubmFtZQkJPSAiaWlzIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjIiLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19sb3cuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE2KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJpMmMiLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMjcpLAogCX0sIHsKIAkJLm5hbWUJCT0gImRtYzAiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrLmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAzMCksCkBAIC0yOTksNDkgKzI4Miw0NSBAQAogc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3NbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJpbnRjIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaGNsay5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEpLAogCX0sIHsKIAkJLm5hbWUJCT0gIm1lbSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGsuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfaGNsazBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyMSksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzM2M2NDAwLXVhcnQuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMSksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2M2NDAwLXVhcnQuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMiksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAyLAorCQkuZGV2bmFtZQk9ICJzM2M2NDAwLXVhcnQuMiIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMyksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAzLAorCQkuZGV2bmFtZQk9ICJzM2M2NDAwLXVhcnQuMyIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNCksCiAJfSwgewogCQkubmFtZQkJPSAidGltZXJzIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa190b193ZHRfcHdtLmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA3KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJncGlvIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19sb3cuY2xrLAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfcGNsa19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE4KSwKQEAgLTQyMSw3ICs0MDAsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX2F1ZGlvMCA9IHsKIAkuY2xrCQk9IHsKIAkJLm5hbWUJCT0gImF1ZGlvLWJ1cyIsCi0JCS5pZAkJPSAtMSwKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3NjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKIAkJLnBhcmVudAkJPSAmY2xrX2RvdXRfZXBsbC5jbGssCkBAIC00MzUsNyArNDEzLDcgQEAKIAl7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMCIsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDI0KSwKIAkJCS5lbmFibGUJCT0gczVwNjR4MF9zY2xrX2N0cmwsCiAJCX0sCkBAIC00NDUsNyArNDIzLDcgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDEsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDI1KSwKIAkJCS5lbmFibGUJCT0gczVwNjR4MF9zY2xrX2N0cmwsCiAJCX0sCkBAIC00NTUsNyArNDMzLDcgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDIsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMiIsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDI2KSwKIAkJCS5lbmFibGUJCT0gczVwNjR4MF9zY2xrX2N0cmwsCiAJCX0sCkBAIC00NjUsNyArNDQzLDYgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAidWNsazEiLAotCQkJLmlkCQk9IC0xLAogCQkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKIAkJCS5lbmFibGUJCT0gczVwNjR4MF9zY2xrX2N0cmwsCiAJCX0sCkBAIC00NzUsNyArNDUyLDcgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19zcGkiLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4wIiwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMjApLAogCQkJLmVuYWJsZQkJPSBzNXA2NHgwX3NjbGtfY3RybCwKIAkJfSwKQEAgLTQ4NSw3ICs0NjIsNyBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX3NwaSIsCi0JCQkuaWQJCT0gMSwKKwkJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjEiLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAyMSksCiAJCQkuZW5hYmxlCQk9IHM1cDY0eDBfc2Nsa19jdHJsLAogCQl9LApAQCAtNDk1LDcgKzQ3Miw2IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfZmltYyIsCi0JCQkuaWQJCT0gLTEsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDEwKSwKIAkJCS5lbmFibGUJCT0gczVwNjR4MF9zY2xrX2N0cmwsCiAJCX0sCkBAIC01MDUsNyArNDgxLDYgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAiYWNsa19tYWxpIiwKLQkJCS5pZAkJPSAtMSwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMiksCiAJCQkuZW5hYmxlCQk9IHM1cDY0eDBfc2NsazFfY3RybCwKIAkJfSwKQEAgLTUxNSw3ICs0OTAsNiBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrXzJkIiwKLQkJCS5pZAkJPSAtMSwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTIpLAogCQkJLmVuYWJsZQkJPSBzNXA2NHgwX3NjbGtfY3RybCwKIAkJfSwKQEAgLTUyNSw3ICs0OTksNiBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX3VzaSIsCi0JCQkuaWQJCT0gLTEsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDcpLAogCQkJLmVuYWJsZQkJPSBzNXA2NHgwX3NjbGtfY3RybCwKIAkJfSwKQEAgLTUzNSw3ICs1MDgsNiBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2NhbWlmIiwKLQkJCS5pZAkJPSAtMSwKIAkJCS5jdHJsYml0CT0gKDEgPDwgNiksCiAJCQkuZW5hYmxlCQk9IHM1cDY0eDBfc2Nsa19jdHJsLAogCQl9LApAQCAtNTQ1LDcgKzUxNyw2IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfZGlzcGNvbiIsCi0JCQkuaWQJCT0gLTEsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDEpLAogCQkJLmVuYWJsZQkJPSBzNXA2NHgwX3NjbGsxX2N0cmwsCiAJCX0sCkBAIC01NTUsNyArNTI2LDYgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19oc21tYzQ0IiwKLQkJCS5pZAkJPSAtMSwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMzApLAogCQkJLmVuYWJsZQkJPSBzNXA2NHgwX3NjbGtfY3RybCwKIAkJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9kZXYtc3BpLmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZGV2LXNwaS5jCmluZGV4IGU3OGVlMTguLmFjODI1ZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9kZXYtc3BpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Rldi1zcGkuYwpAQCAtMTEyLDEyICsxMTIsMTQgQEAKIAkuY2ZnX2dwaW8JPSBzNXA2NDQwX3NwaV9jZmdfZ3BpbywKIAkuZmlmb19sdmxfbWFzawk9IDB4MWZmLAogCS5yeF9sdmxfb2Zmc2V0CT0gMTUsCisJLnR4X3N0X2RvbmUJPSAyNSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyBzNXA2NDUwX3NwaTBfcGRhdGEgPSB7CiAJLmNmZ19ncGlvCT0gczVwNjQ1MF9zcGlfY2ZnX2dwaW8sCiAJLmZpZm9fbHZsX21hc2sJPSAweDFmZiwKIAkucnhfbHZsX29mZnNldAk9IDE1LAorCS50eF9zdF9kb25lCT0gMjUsCiB9OwogCiBzdGF0aWMgdTY0IHNwaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKQEAgLTE2MCwxMiArMTYyLDE0IEBACiAJLmNmZ19ncGlvCT0gczVwNjQ0MF9zcGlfY2ZnX2dwaW8sCiAJLmZpZm9fbHZsX21hc2sJPSAweDdmLAogCS5yeF9sdmxfb2Zmc2V0CT0gMTUsCisJLnR4X3N0X2RvbmUJPSAyNSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyBzNXA2NDUwX3NwaTFfcGRhdGEgPSB7CiAJLmNmZ19ncGlvCT0gczVwNjQ1MF9zcGlfY2ZnX2dwaW8sCiAJLmZpZm9fbHZsX21hc2sJPSAweDdmLAogCS5yeF9sdmxfb2Zmc2V0CT0gMTUsCisJLnR4X3N0X2RvbmUJPSAyNSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjR4MF9kZXZpY2Vfc3BpMSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmZhODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX01BQ0hfQ0xLREVWX0hfXworI2RlZmluZSBfX01BQ0hfQ0xLREVWX0hfXworCisjZGVmaW5lIF9fY2xrX2dldChjbGspICh7IDE7IH0pCisjZGVmaW5lIF9fY2xrX3B1dChjbGspIGRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9tYWNoLXNtZGs2NDQwLmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvbWFjaC1zbWRrNjQ0MC5jCmluZGV4IDJkNTU5ZjEuLjM0NmY4ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9tYWNoLXNtZGs2NDQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL21hY2gtc21kazY0NDAuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPHBsYXQvYWRjLmg+CiAjaW5jbHVkZSA8cGxhdC90cy5oPgogI2luY2x1ZGUgPHBsYXQvczVwLXRpbWUuaD4KKyNpbmNsdWRlIDxwbGF0L2JhY2tsaWdodC5oPgogCiAjZGVmaW5lIFNNREs2NDQwX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAogCQkJCVMzQzI0MTBfVUNPTl9SWElMRVZFTCB8CQlcCkBAIC05MSw0NSArOTIsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IHNtZGs2NDQwX2JhY2tsaWdodF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0KFM1UDY0NDBfR1BGKDE1KSwgIkJhY2tsaWdodCIpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVxdWVzdCBHUEYgZm9yIFBXTS1PVVQxXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBDb25maWd1cmUgR1BJTyBwaW4gd2l0aCBTNVA2NDQwX0dQRjE1X1BXTV9UT1VUMSAqLwotCXMzY19ncGlvX2NmZ3BpbihTNVA2NDQwX0dQRigxNSksIFMzQ19HUElPX1NGTigyKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc21kazY0NDBfYmFja2xpZ2h0X2V4aXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXMzY19ncGlvX2NmZ3BpbihTNVA2NDQwX0dQRigxNSksIFMzQ19HUElPX09VVFBVVCk7Ci0JZ3Bpb19mcmVlKFM1UDY0NDBfR1BGKDE1KSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHNtZGs2NDQwX2JhY2tsaWdodF9kYXRhID0gewotCS5wd21faWQJCT0gMSwKLQkubWF4X2JyaWdodG5lc3MJPSAyNTUsCi0JLmRmdF9icmlnaHRuZXNzCT0gMjU1LAotCS5wd21fcGVyaW9kX25zCT0gNzg3NzAsCi0JLmluaXQJCT0gc21kazY0NDBfYmFja2xpZ2h0X2luaXQsCi0JLmV4aXQJCT0gc21kazY0NDBfYmFja2xpZ2h0X2V4aXQsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWRrNjQ0MF9iYWNrbGlnaHRfZGV2aWNlID0gewotCS5uYW1lCQk9ICJwd20tYmFja2xpZ2h0IiwKLQkuZGV2CQk9IHsKLQkJLnBhcmVudAkJPSAmczNjX2RldmljZV90aW1lclsxXS5kZXYsCi0JCS5wbGF0Zm9ybV9kYXRhCT0gJnNtZGs2NDQwX2JhY2tsaWdodF9kYXRhLAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21kazY0NDBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnMzY19kZXZpY2VfYWRjLAogCSZzM2NfZGV2aWNlX3J0YywKQEAgLTEzOSw4ICsxMDEsNiBAQAogCSZzM2NfZGV2aWNlX3dkdCwKIAkmc2Ftc3VuZ19hc29jX2RtYSwKIAkmczVwNjQ0MF9kZXZpY2VfaWlzLAotCSZzM2NfZGV2aWNlX3RpbWVyWzFdLAotCSZzbWRrNjQ0MF9iYWNrbGlnaHRfZGV2aWNlLAogfTsKIAogc3RhdGljIHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyBzNXA2NDQwX2kyYzBfZGF0YSBfX2luaXRkYXRhID0gewpAQCAtMTc1LDYgKzEzNSwxNiBAQAogCS5vdmVyc2FtcGxpbmdfc2hpZnQJPSAyLAogfTsKIAorLyogTENEIEJhY2tsaWdodCBkYXRhICovCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfYmxfZ3Bpb19pbmZvIHNtZGs2NDQwX2JsX2dwaW9faW5mbyA9IHsKKwkubm8gPSBTNVA2NDQwX0dQRigxNSksCisJLmZ1bmMgPSBTM0NfR1BJT19TRk4oMiksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSBzbWRrNjQ0MF9ibF9kYXRhID0geworCS5wd21faWQgPSAxLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IHNtZGs2NDQwX21hcF9pbyh2b2lkKQogewogCXM1cF9pbml0X2lvKE5VTEwsIDAsIFM1UDY0WDBfU1lTX0lEKTsKQEAgLTE5NCw2ICsxNjQsOCBAQAogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIHNtZGs2NDQwX2kyY19kZXZzMSwKIAkJCUFSUkFZX1NJWkUoc21kazY0NDBfaTJjX2RldnMxKSk7CiAKKwlzYW1zdW5nX2JsX3NldCgmc21kazY0NDBfYmxfZ3Bpb19pbmZvLCAmc21kazY0NDBfYmxfZGF0YSk7CisKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWRrNjQ0MF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNtZGs2NDQwX2RldmljZXMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL21hY2gtc21kazY0NTAuYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9tYWNoLXNtZGs2NDUwLmMKaW5kZXggZDE5YzQ2OS4uMzNmMmFkZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL21hY2gtc21kazY0NTAuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvbWFjaC1zbWRrNjQ1MC5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8cGxhdC9hZGMuaD4KICNpbmNsdWRlIDxwbGF0L3RzLmg+CiAjaW5jbHVkZSA8cGxhdC9zNXAtdGltZS5oPgorI2luY2x1ZGUgPHBsYXQvYmFja2xpZ2h0Lmg+CiAKICNkZWZpbmUgU01ESzY0NTBfVUNPTl9ERUZBVUxUCShTM0MyNDEwX1VDT05fVFhJTEVWRUwgfAlcCiAJCQkJUzNDMjQxMF9VQ09OX1JYSUxFVkVMIHwJCVwKQEAgLTEwOSw0NSArMTEwLDYgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIGludCBzbWRrNjQ1MF9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGdwaW9fcmVxdWVzdChTNVA2NDUwX0dQRigxNSksICJCYWNrbGlnaHQiKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlcXVlc3QgR1BGIGZvciBQV00tT1VUMVxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogQ29uZmlndXJlIEdQSU8gcGluIHdpdGggUzVQNjQ1MF9HUEYxNV9QV01fVE9VVDEgKi8KLQlzM2NfZ3Bpb19jZmdwaW4oUzVQNjQ1MF9HUEYoMTUpLCBTM0NfR1BJT19TRk4oMikpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNtZGs2NDUwX2JhY2tsaWdodF9leGl0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzM2NfZ3Bpb19jZmdwaW4oUzVQNjQ1MF9HUEYoMTUpLCBTM0NfR1BJT19PVVRQVVQpOwotCWdwaW9fZnJlZShTNVA2NDUwX0dQRigxNSkpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSBzbWRrNjQ1MF9iYWNrbGlnaHRfZGF0YSA9IHsKLQkucHdtX2lkCQk9IDEsCi0JLm1heF9icmlnaHRuZXNzCT0gMjU1LAotCS5kZnRfYnJpZ2h0bmVzcwk9IDI1NSwKLQkucHdtX3BlcmlvZF9ucwk9IDc4NzcwLAotCS5pbml0CQk9IHNtZGs2NDUwX2JhY2tsaWdodF9pbml0LAotCS5leGl0CQk9IHNtZGs2NDUwX2JhY2tsaWdodF9leGl0LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21kazY0NTBfYmFja2xpZ2h0X2RldmljZSA9IHsKLQkubmFtZQkJPSAicHdtLWJhY2tsaWdodCIsCi0JLmRldgkJPSB7Ci0JCS5wYXJlbnQJCT0gJnMzY19kZXZpY2VfdGltZXJbMV0uZGV2LAotCQkucGxhdGZvcm1fZGF0YQk9ICZzbWRrNjQ1MF9iYWNrbGlnaHRfZGF0YSwKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNtZGs2NDUwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzM2NfZGV2aWNlX2FkYywKIAkmczNjX2RldmljZV9ydGMsCkBAIC0xNTcsOCArMTE5LDYgQEAKIAkmczNjX2RldmljZV93ZHQsCiAJJnNhbXN1bmdfYXNvY19kbWEsCiAJJnM1cDY0NTBfZGV2aWNlX2lpczAsCi0JJnMzY19kZXZpY2VfdGltZXJbMV0sCi0JJnNtZGs2NDUwX2JhY2tsaWdodF9kZXZpY2UsCiAJLyogczVwNjQ1MF9kZXZpY2Vfc3BpMCB3aWxsIGJlIGFkZGVkICovCiB9OwogCkBAIC0xOTQsNiArMTU0LDE2IEBACiAJLm92ZXJzYW1wbGluZ19zaGlmdAk9IDIsCiB9OwogCisvKiBMQ0QgQmFja2xpZ2h0IGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21kazY0NTBfYmxfZ3Bpb19pbmZvID0geworCS5ubyA9IFM1UDY0NTBfR1BGKDE1KSwKKwkuZnVuYyA9IFMzQ19HUElPX1NGTigyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHNtZGs2NDUwX2JsX2RhdGEgPSB7CisJLnB3bV9pZCA9IDEsCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgc21kazY0NTBfbWFwX2lvKHZvaWQpCiB7CiAJczVwX2luaXRfaW8oTlVMTCwgMCwgUzVQNjRYMF9TWVNfSUQpOwpAQCAtMjEzLDYgKzE4Myw4IEBACiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgc21kazY0NTBfaTJjX2RldnMxLAogCQkJQVJSQVlfU0laRShzbWRrNjQ1MF9pMmNfZGV2czEpKTsKIAorCXNhbXN1bmdfYmxfc2V0KCZzbWRrNjQ1MF9ibF9ncGlvX2luZm8sICZzbWRrNjQ1MF9ibF9kYXRhKTsKKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNtZGs2NDUwX2RldmljZXMsIEFSUkFZX1NJWkUoc21kazY0NTBfZGV2aWNlcykpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9LY29uZmlnCmluZGV4IDYwODcyMmYuLmU4YTMzYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9LY29uZmlnCkBAIC01Niw2ICs1Niw3IEBACiAJc2VsZWN0IFMzQ19ERVZfUlRDCiAJc2VsZWN0IFMzQ19ERVZfV0RUCiAJc2VsZWN0IFNBTVNVTkdfREVWX0FEQworCXNlbGVjdCBTQU1TVU5HX0RFVl9CQUNLTElHSFQKIAlzZWxlY3QgU0FNU1VOR19ERVZfSURFCiAJc2VsZWN0IFNBTVNVTkdfREVWX0tFWVBBRAogCXNlbGVjdCBTQU1TVU5HX0RFVl9QV00KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2Nsb2NrLmMKaW5kZXggMDMwNWU5Yi4uZmY1Y2JiMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2Nsb2NrLmMKQEAgLTMxLDcgKzMxLDYgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgczVwX2Nsa19vdGdwaHkgPSB7CiAJLm5hbWUJCT0gIm90Z19waHkiLAotCS5pZAkJPSAtMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfc3JjX21vdXRfaHJlZl9saXN0W10gPSB7CkBAIC00Nyw3ICs0Niw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfaHJlZiA9IHsKIAkuY2xrID0gewogCQkubmFtZSAgICAgICAgICAgPSAibW91dF9ocmVmIiwKLQkJLmlkICAgICAgICAgICAgID0gLTEsCiAJfSwKIAkuc291cmNlcyAgICAgICAgPSAmY2xrX3NyY19tb3V0X2hyZWYsCiAJLnJlZ19zcmMgICAgICAgID0geyAucmVnID0gUzVQX0NMS19TUkMwLCAuc2hpZnQgPSAyMCwgLnNpemUgPSAxIH0sCkBAIC02Niw3ICs2NCw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfNDhtID0gewogCS5jbGsgPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJtb3V0XzQ4bSIsCi0JCS5pZCAgICAgICAgICAgICA9IC0xLAogCX0sCiAJLnNvdXJjZXMgICAgICAgID0gJmNsa19zcmNfbW91dF80OG0sCiAJLnJlZ19zcmMgICAgICAgID0geyAucmVnID0gUzVQX0NMS19TUkMxLCAuc2hpZnQgPSAyNCwgLnNpemUgPSAxIH0sCkBAIC03NSw3ICs3Miw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfbXBsbCA9IHsKIAkuY2xrID0gewogCQkubmFtZSAgICAgICAgICAgPSAibW91dF9tcGxsIiwKLQkJLmlkICAgICAgICAgICAgID0gLTEsCiAJfSwKIAkuc291cmNlcyAgICAgICAgPSAmY2xrX3NyY19tcGxsLAogCS5yZWdfc3JjICAgICAgICA9IHsgLnJlZyA9IFM1UF9DTEtfU1JDMCwgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCkBAIC04NSw3ICs4MSw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfYXBsbCA9IHsKIAkuY2xrICAgID0gewogCQkubmFtZSAgICAgICAgICAgPSAibW91dF9hcGxsIiwKLQkJLmlkICAgICAgICAgICAgID0gLTEsCiAJfSwKIAkuc291cmNlcyAgICAgICAgPSAmY2xrX3NyY19hcGxsLAogCS5yZWdfc3JjICAgICAgICA9IHsgLnJlZyA9IFM1UF9DTEtfU1JDMCwgLnNoaWZ0ID0gMCwgLnNpemUgPSAxIH0sCkBAIC05NCw3ICs4OSw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfZXBsbCA9IHsKIAkuY2xrICAgID0gewogCQkubmFtZSAgICAgICAgICAgPSAibW91dF9lcGxsIiwKLQkJLmlkICAgICAgICAgICAgID0gLTEsCiAJfSwKIAkuc291cmNlcyAgICAgICAgPSAmY2xrX3NyY19lcGxsLAogCS5yZWdfc3JjICAgICAgICA9IHsgLnJlZyA9IFM1UF9DTEtfU1JDMCwgLnNoaWZ0ID0gOCwgLnNpemUgPSAxIH0sCkBAIC0xMTIsNyArMTA2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9ocGxsID0gewogCS5jbGsgICAgPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJtb3V0X2hwbGwiLAotCQkuaWQgICAgICAgICAgICAgPSAtMSwKIAl9LAogCS5zb3VyY2VzICAgICAgICA9ICZjbGtfc3JjX21vdXRfaHBsbCwKIAkucmVnX3NyYyAgICAgICAgPSB7IC5yZWcgPSBTNVBfQ0xLX1NSQzAsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDEgfSwKQEAgLTEyMSw3ICsxMTQsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kaXZfYXBsbCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQk9ICJkaXZfYXBsbCIsCi0JCS5pZAk9IC0xLAogCQkucGFyZW50CT0gJmNsa19tb3V0X2FwbGwuY2xrLAogCX0sCiAJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLX0RJVjAsIC5zaGlmdCA9IDAsIC5zaXplID0gMSB9LApAQCAtMTMwLDcgKzEyMiw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2Rpdl9hcm0gPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJPSAiZGl2X2FybSIsCi0JCS5pZAk9IC0xLAogCQkucGFyZW50CT0gJmNsa19kaXZfYXBsbC5jbGssCiAJfSwKIAkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtfRElWMCwgLnNoaWZ0ID0gNCwgLnNpemUgPSAzIH0sCkBAIC0xMzksNyArMTMwLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZGl2X2QwX2J1cyA9IHsKIAkuY2xrCT0gewogCQkubmFtZQk9ICJkaXZfZDBfYnVzIiwKLQkJLmlkCT0gLTEsCiAJCS5wYXJlbnQJPSAmY2xrX2Rpdl9hcm0uY2xrLAogCX0sCiAJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLX0RJVjAsIC5zaGlmdCA9IDgsIC5zaXplID0gMyB9LApAQCAtMTQ4LDcgKzEzOCw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2Rpdl9wY2xrZDAgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJPSAiZGl2X3BjbGtkMCIsCi0JCS5pZAk9IC0xLAogCQkucGFyZW50CT0gJmNsa19kaXZfZDBfYnVzLmNsaywKIAl9LAogCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS19ESVYwLCAuc2hpZnQgPSAxMiwgLnNpemUgPSAzIH0sCkBAIC0xNTcsNyArMTQ2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZGl2X3NlY3NzID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCT0gImRpdl9zZWNzcyIsCi0JCS5pZAk9IC0xLAogCQkucGFyZW50CT0gJmNsa19kaXZfZDBfYnVzLmNsaywKIAl9LAogCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS19ESVYwLCAuc2hpZnQgPSAxNiwgLnNpemUgPSAzIH0sCkBAIC0xNjYsNyArMTU0LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZGl2X2FwbGwyID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCT0gImRpdl9hcGxsMiIsCi0JCS5pZAk9IC0xLAogCQkucGFyZW50CT0gJmNsa19tb3V0X2FwbGwuY2xrLAogCX0sCiAJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLX0RJVjEsIC5zaGlmdCA9IDAsIC5zaXplID0gMyB9LApAQCAtMTg1LDcgKzE3Miw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfYW0gPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJPSAibW91dF9hbSIsCi0JCS5pZAk9IC0xLAogCX0sCiAJLnNvdXJjZXMgPSAmY2xrX3NyY19tb3V0X2FtLAogCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS19TUkMwLCAuc2hpZnQgPSAxNiwgLnNpemUgPSAxIH0sCkBAIC0xOTQsNyArMTgwLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZGl2X2QxX2J1cyA9IHsKIAkuY2xrCT0gewogCQkubmFtZQk9ICJkaXZfZDFfYnVzIiwKLQkJLmlkCT0gLTEsCiAJCS5wYXJlbnQJPSAmY2xrX21vdXRfYW0uY2xrLAogCX0sCiAJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLX0RJVjEsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDMgfSwKQEAgLTIwMyw3ICsxODgsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kaXZfbXBsbDIgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJPSAiZGl2X21wbGwyIiwKLQkJLmlkCT0gLTEsCiAJCS5wYXJlbnQJPSAmY2xrX21vdXRfYW0uY2xrLAogCX0sCiAJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLX0RJVjEsIC5zaGlmdCA9IDgsIC5zaXplID0gMSB9LApAQCAtMjEyLDcgKzE5Niw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2Rpdl9tcGxsID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCT0gImRpdl9tcGxsIiwKLQkJLmlkCT0gLTEsCiAJCS5wYXJlbnQJPSAmY2xrX21vdXRfYW0uY2xrLAogCX0sCiAJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLX0RJVjEsIC5zaGlmdCA9IDQsIC5zaXplID0gMiB9LApAQCAtMjMxLDcgKzIxNCw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfb25lbmFuZCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQk9ICJtb3V0X29uZW5hbmQiLAotCQkuaWQJPSAtMSwKIAl9LAogCS5zb3VyY2VzID0gJmNsa19zcmNfbW91dF9vbmVuYW5kLAogCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS19TUkMwLCAuc2hpZnQgPSAyNCwgLnNpemUgPSAxIH0sCkBAIC0yNDAsNyArMjIyLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZGl2X29uZW5hbmQgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJPSAiZGl2X29uZW5hbmQiLAotCQkuaWQJPSAtMSwKIAkJLnBhcmVudAk9ICZjbGtfbW91dF9vbmVuYW5kLmNsaywKIAl9LAogCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS19ESVYxLCAuc2hpZnQgPSAyMCwgLnNpemUgPSAyIH0sCkBAIC0yNDksNyArMjMwLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZGl2X3BjbGtkMSA9IHsKIAkuY2xrCT0gewogCQkubmFtZQk9ICJkaXZfcGNsa2QxIiwKLQkJLmlkCT0gLTEsCiAJCS5wYXJlbnQJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCX0sCiAJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLX0RJVjEsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDMgfSwKQEAgLTI1OCw3ICsyMzgsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kaXZfY2FtID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCT0gImRpdl9jYW0iLAotCQkuaWQJPSAtMSwKIAkJLnBhcmVudAk9ICZjbGtfZGl2X21wbGwyLmNsaywKIAl9LAogCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS19ESVYxLCAuc2hpZnQgPSAyNCwgLnNpemUgPSA1IH0sCkBAIC0yNjcsNyArMjQ2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZGl2X2hkbWkgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJPSAiZGl2X2hkbWkiLAotCQkuaWQJPSAtMSwKIAkJLnBhcmVudAk9ICZjbGtfbW91dF9ocGxsLmNsaywKIAl9LAogCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS19ESVYzLCAuc2hpZnQgPSAyOCwgLnNpemUgPSA0IH0sCkBAIC0zOTksMzY3ICszNzcsMzI5IEBACiBzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc19vZmZbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJjc3N5cyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMF9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDBfMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDYpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNlY3NzIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QwX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMF8wX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNSksCiAJfSwgewogCQkubmFtZQkJPSAiZzJkIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QwX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMF8wX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNCksCiAJfSwgewogCQkubmFtZQkJPSAibWRtYSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMF9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDBfMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDMpLAogCX0sIHsKIAkJLm5hbWUJCT0gImNmY29uIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QwX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMF8wX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMiksCiAJfSwgewogCQkubmFtZQkJPSAibmZjb24iLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDBfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QwXzFfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJvbmVuYW5kYyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMF9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDBfMV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDIpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNkbSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMF9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDBfMl9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDIpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNlY2tleSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMF9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDBfMl9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEpLAogCX0sIHsKIAkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4yIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDcpLAogCX0sIHsKIAkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDYpLAogCX0sIHsKIAkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDUpLAogCX0sIHsKIAkJLm5hbWUJCT0gIm1vZGVtaWYiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJvdGciLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1c2Job3N0IiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8wX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMiksCiAJfSwgewogCQkubmFtZQkJPSAicGRtYSIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2MtcGwzMzAuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJwZG1hIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYy1wbDMzMC4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCX0sIHsKIAkJLm5hbWUJCT0gImxjZCIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfMV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCX0sIHsKIAkJLm5hbWUJCT0gInJvdGF0b3IiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzFfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJmaW1jIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInM1cC1maW1jLjAiLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8xX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMiksCiAJfSwgewogCQkubmFtZQkJPSAiZmltYyIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzNXAtZmltYy4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfMV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDMpLAogCX0sIHsKIAkJLm5hbWUJCT0gImZpbWMiLAotCQkuaWQJCT0gMiwKLQkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAorCQkuZGV2bmFtZQk9ICJzNXAtZmltYy4yIiwKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzFfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJqcGVnIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8xX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNSksCiAJfSwgewogCQkubmFtZQkJPSAibWlwaS1kc2ltIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8xX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNiksCiAJfSwgewogCQkubmFtZQkJPSAibWlwaS1jc2lzIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8xX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNyksCiAJfSwgewogCQkubmFtZQkJPSAiZzNkIiwKLQkJLmlkCQk9IDAsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ0diIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfMl9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCX0sIHsKIAkJLm5hbWUJCT0gInZwIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8yX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMSksCiAJfSwgewogCQkubmFtZQkJPSAibWl4ZXIiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzJfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJoZG1pIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8yX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMyksCiAJfSwgewogCQkubmFtZQkJPSAibWZjIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8yX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNCksCiAJfSwgewogCQkubmFtZQkJPSAiYXBjIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8zX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMiksCiAJfSwgewogCQkubmFtZQkJPSAiaWVjIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8zX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMyksCiAJfSwgewogCQkubmFtZQkJPSAic3lzdGltZXIiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA3KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfM19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDgpLAogCX0sIHsKIAkJLm5hbWUJCT0gInJ0YyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfM19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDkpLAogCX0sIHsKIAkJLm5hbWUJCT0gImkyYyIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDQpLAogCX0sIHsKIAkJLm5hbWUJCT0gImkyYyIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDUpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwaSIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDYpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwaSIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDcpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwaSIsCi0JCS5pZAkJPSAyLAorCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4yIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDgpLAogCX0sIHsKIAkJLm5hbWUJCT0gImlyZGEiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzRfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA5KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJjY2FuIiwKLQkJLmlkCQk9IDAsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzRfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxMCksCiAJfSwgewogCQkubmFtZQkJPSAiY2NhbiIsCi0JCS5pZAkJPSAxLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV80X2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTEpLAogCX0sIHsKIAkJLm5hbWUJCT0gImhzaXR4IiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV80X2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTIpLAogCX0sIHsKIAkJLm5hbWUJCT0gImhzaXJ4IiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV80X2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTMpLAogCX0sIHsKIAkJLm5hbWUJCT0gImlpcyIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzYW1zdW5nLWkycy4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9wY2xrZDEuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCX0sIHsKIAkJLm5hbWUJCT0gImlpcyIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzYW1zdW5nLWkycy4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9wY2xrZDEuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEpLAogCX0sIHsKIAkJLm5hbWUJCT0gImlpcyIsCi0JCS5pZAkJPSAyLAorCQkuZGV2bmFtZQk9ICJzYW1zdW5nLWkycy4yIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9wY2xrZDEuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDIpLAogCX0sIHsKIAkJLm5hbWUJCT0gImFjOTciLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfcGNsa2QxLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzVfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJwY20iLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAic2Ftc3VuZy1wY20uMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfcGNsa2QxLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzVfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJwY20iLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAic2Ftc3VuZy1wY20uMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfcGNsa2QxLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzVfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJzcGRpZiIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9wY2xrZDEuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDYpLAogCX0sIHsKIAkJLm5hbWUJCT0gImFkYyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9wY2xrZDEuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDcpLAogCX0sIHsKIAkJLm5hbWUJCT0gImtleXBhZCIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9wY2xrZDEuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDgpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwaV80OG0iLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19tb3V0XzQ4bS5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9zY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDcpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwaV80OG0iLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19tb3V0XzQ4bS5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9zY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDgpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwaV80OG0iLAotCQkuaWQJCT0gMiwKKwkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMiIsCiAJCS5wYXJlbnQJCT0gJmNsa19tb3V0XzQ4bS5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9zY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDkpLAogCX0sIHsKIAkJLm5hbWUJCT0gIm1tY180OG0iLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjAiLAogCQkucGFyZW50CQk9ICZjbGtfbW91dF80OG0uY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfc2NsazBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxNSksCiAJfSwgewogCQkubmFtZQkJPSAibW1jXzQ4bSIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19tb3V0XzQ4bS5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9zY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE2KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJtbWNfNDhtIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4yIiwKIAkJLnBhcmVudAkJPSAmY2xrX21vdXRfNDhtLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX3NjbGswX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTcpLApAQCAtNzY4LDMzICs3MDgsMjcgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3ZjbGs1NG0gPSB7CiAJLm5hbWUJCT0gInZjbGtfNTRtIiwKLQkuaWQJCT0gLTEsCiAJLnJhdGUJCT0gNTQwMDAwMDAsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfaTJzY2RjbGswID0gewogCS5uYW1lCQk9ICJpMnNfY2RjbGswIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfaTJzY2RjbGsxID0gewogCS5uYW1lCQk9ICJpMnNfY2RjbGsxIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfaTJzY2RjbGsyID0gewogCS5uYW1lCQk9ICJpMnNfY2RjbGsyIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfcGNtY2RjbGswID0gewogCS5uYW1lCQk9ICJwY21fY2RjbGswIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfcGNtY2RjbGsxID0gewogCS5uYW1lCQk9ICJwY21fY2RjbGsxIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayAqY2xrX3NyY19ncm91cDFfbGlzdFtdID0gewpAQCAtODM2LDcgKzc3MCw3IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfYXVkaW8wID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJzY2xrX2F1ZGlvIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctcGNtLjAiLAogCQkuY3RybGJpdAk9ICgxIDw8IDgpLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfc2NsazFfY3RybCwKIAl9LApAQCAtODYyLDcgKzc5Niw3IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfYXVkaW8xID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJzY2xrX2F1ZGlvIiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctcGNtLjEiLAogCQkuY3RybGJpdAk9ICgxIDw8IDkpLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfc2NsazFfY3RybCwKIAl9LApAQCAtODg3LDcgKzgyMSw3IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfYXVkaW8yID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJzY2xrX2F1ZGlvIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctcGNtLjIiLAogCQkuY3RybGJpdAk9ICgxIDw8IDEwKSwKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX3NjbGsxX2N0cmwsCiAJfSwKQEAgLTk3Niw0OCArOTEwLDEyIEBACiAJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa19zY2xrX3NwZGlmX2xpc3QpLAogfTsKIAotc3RhdGljIGludCBzNXBjMTAwX3NwZGlmX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCXN0cnVjdCBjbGsgKnBjbGs7Ci0JaW50IHJldDsKLQotCXBjbGsgPSBjbGtfZ2V0X3BhcmVudChjbGspOwotCWlmIChJU19FUlIocGNsaykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gcGNsay0+b3BzLT5zZXRfcmF0ZShwY2xrLCByYXRlKTsKLQljbGtfcHV0KHBjbGspOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgczVwYzEwMF9zcGRpZl9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0Jc3RydWN0IGNsayAqcGNsazsKLQlpbnQgcmF0ZTsKLQotCXBjbGsgPSBjbGtfZ2V0X3BhcmVudChjbGspOwotCWlmIChJU19FUlIocGNsaykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmF0ZSA9IHBjbGstPm9wcy0+Z2V0X3JhdGUoY2xrKTsKLQljbGtfcHV0KHBjbGspOwotCi0JcmV0dXJuIHJhdGU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzNXBjMTAwX3NjbGtfc3BkaWZfb3BzID0gewotCS5zZXRfcmF0ZQk9IHM1cGMxMDBfc3BkaWZfc2V0X3JhdGUsCi0JLmdldF9yYXRlCT0gczVwYzEwMF9zcGRpZl9nZXRfcmF0ZSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa19zcGRpZiA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAic2Nsa19zcGRpZiIsCi0JCS5pZAkJPSAtMSwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxMSksCiAJCS5lbmFibGUJCT0gczVwYzEwMF9zY2xrMV9jdHJsLAotCQkub3BzCQk9ICZzNXBjMTAwX3NjbGtfc3BkaWZfb3BzLAorCQkub3BzCQk9ICZzNXBfc2Nsa19zcGRpZl9vcHMsCiAJfSwKIAkuc291cmNlcyA9ICZjbGtfc3JjX3NjbGtfc3BkaWYsCiAJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLX1NSQzMsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDIgfSwKQEAgLTEwMjcsNyArOTI1LDcgQEAKIAl7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19zcGkiLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4wIiwKIAkJCS5jdHJsYml0CT0gKDEgPDwgNCksCiAJCQkuZW5hYmxlCQk9IHM1cGMxMDBfc2NsazBfY3RybCwKIApAQCAtMTAzOCw3ICs5MzYsNyBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX3NwaSIsCi0JCQkuaWQJCT0gMSwKKwkJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjEiLAogCQkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKIAkJCS5lbmFibGUJCT0gczVwYzEwMF9zY2xrMF9jdHJsLAogCkBAIC0xMDQ5LDcgKzk0Nyw3IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfc3BpIiwKLQkJCS5pZAkJPSAyLAorCQkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMiIsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDYpLAogCQkJLmVuYWJsZQkJPSBzNXBjMTAwX3NjbGswX2N0cmwsCiAKQEAgLTEwNjAsNyArOTU4LDYgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAidWNsazEiLAotCQkJLmlkCQk9IC0xLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKIAkJCS5lbmFibGUJCT0gczVwYzEwMF9zY2xrMF9jdHJsLAogCkBAIC0xMDcxLDcgKzk2OCw2IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfbWl4ZXIiLAotCQkJLmlkCQk9IC0xLAogCQkJLmN0cmxiaXQJPSAoMSA8PCA2KSwKIAkJCS5lbmFibGUJCT0gczVwYzEwMF9zY2xrMF9jdHJsLAogCkBAIC0xMDgxLDcgKzk3Nyw2IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfbGNkIiwKLQkJCS5pZAkJPSAtMSwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMCksCiAJCQkuZW5hYmxlCQk9IHM1cGMxMDBfc2NsazFfY3RybCwKIApAQCAtMTA5Miw3ICs5ODcsNyBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJzNXAtZmltYy4wIiwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMSksCiAJCQkuZW5hYmxlCQk9IHM1cGMxMDBfc2NsazFfY3RybCwKIApAQCAtMTEwMyw3ICs5OTgsNyBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAotCQkJLmlkCQk9IDEsCisJCQkuZGV2bmFtZQk9ICJzNXAtZmltYy4xIiwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMiksCiAJCQkuZW5hYmxlCQk9IHM1cGMxMDBfc2NsazFfY3RybCwKIApAQCAtMTExNCw3ICsxMDA5LDcgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19maW1jIiwKLQkJCS5pZAkJPSAyLAorCQkJLmRldm5hbWUJPSAiczVwLWZpbWMuMiIsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDMpLAogCQkJLmVuYWJsZQkJPSBzNXBjMTAwX3NjbGsxX2N0cmwsCiAKQEAgLTExMjUsNyArMTAyMCw3IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfbW1jIiwKLQkJCS5pZAkJPSAwLAorCQkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjAiLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAxMiksCiAJCQkuZW5hYmxlCQk9IHM1cGMxMDBfc2NsazFfY3RybCwKIApAQCAtMTEzNiw3ICsxMDMxLDcgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDEsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDEzKSwKIAkJCS5lbmFibGUJCT0gczVwYzEwMF9zY2xrMV9jdHJsLAogCkBAIC0xMTQ3LDcgKzEwNDIsNyBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX21tYyIsCi0JCQkuaWQJCT0gMiwKKwkJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4yIiwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTQpLAogCQkJLmVuYWJsZQkJPSBzNXBjMTAwX3NjbGsxX2N0cmwsCiAKQEAgLTExNTgsNyArMTA1Myw2IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfaXJkYSIsCi0JCQkuaWQJCT0gMiwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTApLAogCQkJLmVuYWJsZQkJPSBzNXBjMTAwX3NjbGswX2N0cmwsCiAKQEAgLTExNjksNyArMTA2Myw2IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfaXJkYSIsCi0JCQkuaWQJCT0gLTEsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDEwKSwKIAkJCS5lbmFibGUJCT0gczVwYzEwMF9zY2xrMF9jdHJsLAogCkBAIC0xMTgwLDcgKzEwNzMsNiBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX3B3aSIsCi0JCQkuaWQJCT0gLTEsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDEpLAogCQkJLmVuYWJsZQkJPSBzNXBjMTAwX3NjbGswX2N0cmwsCiAKQEAgLTExOTEsNyArMTA4Myw2IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfdWhvc3QiLAotCQkJLmlkCQk9IC0xLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAxMSksCiAJCQkuZW5hYmxlCQk9IHM1cGMxMDBfc2NsazBfY3RybCwKIApAQCAtMTI5MSw3OSArMTE4Miw3MCBAQAogc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3NbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJ0emljIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QwX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMF8wX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMSksCiAJfSwgewogCQkubmFtZQkJPSAiaW50YyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMF9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDBfMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDApLAogCX0sIHsKIAkJLm5hbWUJCT0gImViaSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMF9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDBfMV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDUpLAogCX0sIHsKIAkJLm5hbWUJCT0gImludG1lbSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMF9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDBfMV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDQpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNyb21jIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QwX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMF8xX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMSksCiAJfSwgewogCQkubmFtZQkJPSAiZG1jIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QwX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMF8xX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMCksCiAJfSwgewogCQkubmFtZQkJPSAiY2hpcGlkIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QwX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMF8xX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMCksCiAJfSwgewogCQkubmFtZQkJPSAiZ3BpbyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfM19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEpLAogCX0sIHsKIAkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczNjNjQwMC11YXJ0LjAiLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV80X2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMCksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2M2NDAwLXVhcnQuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzRfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInMzYzY0MDAtdWFydC4yIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfNF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDIpLAogCX0sIHsKIAkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMywKKwkJLmRldm5hbWUJPSAiczNjNjQwMC11YXJ0LjMiLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV80X2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMyksCiAJfSwgewogCQkubmFtZQkJPSAidGltZXJzIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8zX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNiksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvZGV2LXNwaS5jIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2Rldi1zcGkuYwppbmRleCA1N2IxOTc5Li5lNWQ2YzRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvZGV2LXNwaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9kZXYtc3BpLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9zcGktY2xvY2tzLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKICNpbmNsdWRlIDxwbGF0L3MzYzY0eHgtc3BpLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgpAQCAtOTAsNiArOTEsNyBAQAogCS5maWZvX2x2bF9tYXNrID0gMHg3ZiwKIAkucnhfbHZsX29mZnNldCA9IDEzLAogCS5oaWdoX3NwZWVkID0gMSwKKwkudHhfc3RfZG9uZSA9IDIxLAogfTsKIAogc3RhdGljIHU2NCBzcGlfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CkBAIC0xMzQsNiArMTM2LDcgQEAKIAkuZmlmb19sdmxfbWFzayA9IDB4N2YsCiAJLnJ4X2x2bF9vZmZzZXQgPSAxMywKIAkuaGlnaF9zcGVlZCA9IDEsCisJLnR4X3N0X2RvbmUgPSAyMSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2Vfc3BpMSA9IHsKQEAgLTE3Niw2ICsxNzksNyBAQAogCS5maWZvX2x2bF9tYXNrID0gMHg3ZiwKIAkucnhfbHZsX29mZnNldCA9IDEzLAogCS5oaWdoX3NwZWVkID0gMSwKKwkudHhfc3RfZG9uZSA9IDIxLAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9zcGkyID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9jbGtkZXYuaCBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmZmE4MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9fTUFDSF9DTEtERVZfSF9fCisjZGVmaW5lIF9fTUFDSF9DTEtERVZfSF9fCisKKyNkZWZpbmUgX19jbGtfZ2V0KGNsaykgKHsgMTsgfSkKKyNkZWZpbmUgX19jbGtfcHV0KGNsaykgZG8ge30gd2hpbGUgKDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9yZWdzLWZiLmggYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL3JlZ3MtZmIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhYTRkNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL3JlZ3MtZmIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL3JlZ3MtZmIuaAotICoKLSAqIENvcHlyaWdodCAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uCi0gKiAgIFBhd2VsIE9zY2lhayA8cC5vc2NpYWtAc2Ftc3VuZy5jb20+Ci0gKgotICogRnJhbWVidWZmZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIFNhbXN1bmcgUzVQQzEwMC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfRkJfSAotI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfRkJfSCBfX0ZJTEVfXwotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+Ci0KLS8qIFZQMSBpbnRlcmZhY2UgdGltaW5nIGNvbnRyb2wgKi8KLSNkZWZpbmUgVlAxQ09OMAkJCQkJCSgweDExOCkKLSNkZWZpbmUgVlAxX1JBVEVDT05fRU4JCQkJCSgxIDw8IDMxKQotI2RlZmluZSBWUDFfQ0xLUkFURV9NQVNLCQkJCSgweGZmKQotCi0jZGVmaW5lIFZQMUNPTjEJCQkJCQkoMHgxMWMpCi0jZGVmaW5lIFZQMV9WVFJFR0NPTl9FTgkJCQkJKDEgPDwgMzEpCi0jZGVmaW5lIFZQMV9WQlBEX01BU0sJCQkJCSgweGZmZikKLSNkZWZpbmUgVlAxX1ZCUERfU0hJRlQJCQkJCSgxNikKLQotCi0jZGVmaW5lIFdQQUxDT05fSAkJCQkJKDB4MTljKQotI2RlZmluZSBXUEFMQ09OX0wJCQkJCSgweDFhMCkKLQotLyogUGFsZXR0ZSBjb250cm9sIGZvciBXUEFMMCBhbmQgV1BBTDEgaXMgdGhlIHNhbWUgYXMgaW4gUzNDNjR4eCwgYnV0Ci0gKiBkaWZmZXJlbnQgZm9yIFdQQUwyLTQKLSAqLwotLyogSW4gV1BBTENPTl9MIChha2EgV1BBTENPTikgKi8KLSNkZWZpbmUgV1BBTENPTl9XMVBBTF8zMkJQUF9BODg4CQkJKDB4NyA8PCAzKQotI2RlZmluZSBXUEFMQ09OX1cwUEFMXzMyQlBQX0E4ODgJCQkoMHg3IDw8IDApCi0KLS8qIFRvIHNldCBXMlBBTC1XNFBBTCBjb25zaXN0IG9mIG9uZSBiaXQgZnJvbSBXUEFMQ09OX0wgYW5kIHR3byBmcm9tIFdQQUxDT05fSCwKLSAqIGUuZy4gVzJQQUxbMi4uMF0gaXMgbWFkZSBvZiAoV1BBTENPTl9IWzEwLi45XSwgV1BBTENPTl9MWzZdKS4KLSAqLwotI2RlZmluZSBXUEFMQ09OX0xfV3hQQUxfTF9NQVNLCQkJCSgweDEpCi0jZGVmaW5lIFdQQUxDT05fTF9XMlBBTF9MX1NISUZUCQkJCSg2KQotI2RlZmluZSBXUEFMQ09OX0xfVzNQQUxfTF9TSElGVAkJCQkoNykKLSNkZWZpbmUgV1BBTENPTl9MX1c0UEFMX0xfU0hJRlQJCQkJKDgpCi0KLSNkZWZpbmUgV1BBTENPTl9MX1d4UEFMX0hfTUFTSwkJCQkoMHgzKQotI2RlZmluZSBXUEFMQ09OX0hfVzJQQUxfSF9TSElGVAkJCQkoOSkKLSNkZWZpbmUgV1BBTENPTl9IX1czUEFMX0hfU0hJRlQJCQkJKDEzKQotI2RlZmluZSBXUEFMQ09OX0hfVzRQQUxfSF9TSElGVAkJCQkoMTcpCi0KLS8qIFBlci13aW5kb3cgYWxwaGEgdmFsdWUgcmVnaXN0ZXJzICovCi0vKiBGb3Igd2luZG93IDAgOC1iaXQgYWxwaGEgdmFsdWVzIGFyZSBpbiBWSURXMEFMUEhBeCwKLSAqIGZvciB3aW5kb3dzIDEtNCBhbHBoYSB2YWx1ZXMgY29uc2lzdCBvZiB0d28gcGFydHMsIHRoZSA0IGxvdyBiaXRzIGFyZQotICogdGFrZW4gZnJvbSBWSURXeEFMUEhBeCBhbmQgNCBoaWdoIGJpdHMgYXJlIGZyb20gVklET1NEeEMsCi0gKiBlLmcuIFdJTjFfQUxQSEEwX0JbNy4uMF0gPSAoVklET1NEMUNbMy4uMF0sIFZJRFcxQUxQSEEwWzMuLjBdKQotICovCi0jZGVmaW5lIFZJRFd4QUxQSEEwKF93aW4pCQkJCSgweDIwMCArIChfd2luICogOCkpCi0jZGVmaW5lIFZJRFd4QUxQSEExKF93aW4pCQkJCSgweDIwNCArIChfd2luICogOCkpCi0KLS8qIE9ubHkgZm9yIHdpbmRvdyAwIGluIFZJRFcwQUxQSEF4LiAqLwotI2RlZmluZSBWSURXMEFMUEhBeF9SKF94KQkJCQkoKF94KSA8PCAxNikKLSNkZWZpbmUgVklEVzBBTFBIQXhfUl9NQVNLCQkJCSgweGZmIDw8IDE2KQotI2RlZmluZSBWSURXMEFMUEhBeF9SX1NISUZUCQkJCSgxNikKLSNkZWZpbmUgVklEVzBBTFBIQXhfRyhfeCkJCQkJKChfeCkgPDwgOCkKLSNkZWZpbmUgVklEVzBBTFBIQXhfR19NQVNLCQkJCSgweGZmIDw8IDgpCi0jZGVmaW5lIFZJRFcwQUxQSEF4X0dfU0hJRlQJCQkJKDgpCi0jZGVmaW5lIFZJRFcwQUxQSEF4X0IoX3gpCQkJCSgoX3gpIDw8IDApCi0jZGVmaW5lIFZJRFcwQUxQSEF4X0JfTUFTSwkJCQkoMHhmZiA8PCAwKQotI2RlZmluZSBWSURXMEFMUEhBeF9CX1NISUZUCQkJCSgwKQotCi0vKiBMb3cgNCBiaXRzIG9mIGFscGhhMC0xIGZvciB3aW5kb3dzIDEtNCAqLwotI2RlZmluZSBWSURXMTRBTFBIQXhfUl9MKF94KQkJCQkoKF94KSA8PCAxNikKLSNkZWZpbmUgVklEVzE0QUxQSEF4X1JfTF9NQVNLCQkJCSgweGYgPDwgMTYpCi0jZGVmaW5lIFZJRFcxNEFMUEhBeF9SX0xfU0hJRlQJCQkJKDE2KQotI2RlZmluZSBWSURXMTRBTFBIQXhfR19MKF94KQkJCQkoKF94KSA8PCA4KQotI2RlZmluZSBWSURXMTRBTFBIQXhfR19MX01BU0sJCQkJKDB4ZiA8PCA4KQotI2RlZmluZSBWSURXMTRBTFBIQXhfR19MX1NISUZUCQkJCSg4KQotI2RlZmluZSBWSURXMTRBTFBIQXhfQl9MKF94KQkJCQkoKF94KSA8PCAwKQotI2RlZmluZSBWSURXMTRBTFBIQXhfQl9MX01BU0sJCQkJKDB4ZiA8PCAwKQotI2RlZmluZSBWSURXMTRBTFBIQXhfQl9MX1NISUZUCQkJCSgwKQotCi0KLS8qIFBlci13aW5kb3cgYmxlbmRpbmcgZXF1YXRpb24gY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgQkxFTkRFUXgoX3dpbikJCQkJCSgweDI0NCArICgoX3dpbikgKiA0KSkKLSNkZWZpbmUgQkxFTkRFUTEJCQkJCSgweDI0NCkKLSNkZWZpbmUgQkxFTkRFUTIJCQkJCSgweDI0OCkKLSNkZWZpbmUgQkxFTkRFUTMJCQkJCSgweDI0YykKLSNkZWZpbmUgQkxFTkRFUTQJCQkJCSgweDI1MCkKLQotI2RlZmluZSBCTEVOREVReF9RX0ZVTkMoX3gpCQkJCSgoX3gpIDw8IDE4KQotI2RlZmluZSBCTEVOREVReF9RX0ZVTkNfTUFTSwkJCQkoMHhmIDw8IDE4KQotI2RlZmluZSBCTEVOREVReF9QX0ZVTkMoX3gpCQkJCSgoX3gpIDw8IDEyKQotI2RlZmluZSBCTEVOREVReF9QX0ZVTkNfTUFTSwkJCQkoMHhmIDw8IDEyKQotI2RlZmluZSBCTEVOREVReF9CX0ZVTkMoX3gpCQkJCSgoX3gpIDw8IDYpCi0jZGVmaW5lIEJMRU5ERVF4X0JfRlVOQ19NQVNLCQkJCSgweGYgPDwgNikKLSNkZWZpbmUgQkxFTkRFUXhfQV9GVU5DKF94KQkJCQkoKF94KSA8PCAwKQotI2RlZmluZSBCTEVOREVReF9BX0ZVTkNfTUFTSwkJCQkoMHhmIDw8IDApCi0KLSNkZWZpbmUgQkxFTkRDT04JCQkJCSgweDI2MCkKLSNkZWZpbmUgQkxFTkRDT05fOEJJVF9BTFBIQQkJCQkoMSA8PCAwKQotCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX1JFR1NfRkJfSCAqLwotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvbWFjaC1zbWRrYzEwMC5jIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL21hY2gtc21ka2MxMDAuYwppbmRleCAwNTI1Y2IzLi4yMjdkODkwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvbWFjaC1zbWRrYzEwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9tYWNoLXNtZGtjMTAwLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWZiLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIAogI2luY2x1ZGUgPHZpZGVvL3BsYXRmb3JtX2xjZC5oPgpAQCAtNTEsNiArNTAsOCBAQAogI2luY2x1ZGUgPHBsYXQva2V5cGFkLmg+CiAjaW5jbHVkZSA8cGxhdC90cy5oPgogI2luY2x1ZGUgPHBsYXQvYXVkaW8uaD4KKyNpbmNsdWRlIDxwbGF0L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgogCiAvKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KICNkZWZpbmUgU01ES0MxMDBfVUNPTl9ERUZBVUxUCShTM0MyNDEwX1VDT05fVFhJTEVWRUwgfAlcCkBAIC0xNzksNDUgKzE4MCw2IEBACiAJLmNvbHMJCT0gOCwKIH07CiAKLXN0YXRpYyBpbnQgc21ka2MxMDBfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBncGlvX3JlcXVlc3QoUzVQQzEwMF9HUEQoMCksICJCYWNrbGlnaHQiKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlcXVlc3QgR1BGIGZvciBQV00tT1VUMFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogQ29uZmlndXJlIEdQSU8gcGluIHdpdGggUzVQQzEwMF9HUERfVE9VVF8wICovCi0JczNjX2dwaW9fY2ZncGluKFM1UEMxMDBfR1BEKDApLCBTM0NfR1BJT19TRk4oMikpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNtZGtjMTAwX2JhY2tsaWdodF9leGl0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzM2NfZ3Bpb19jZmdwaW4oUzVQQzEwMF9HUEQoMCksIFMzQ19HUElPX09VVFBVVCk7Ci0JZ3Bpb19mcmVlKFM1UEMxMDBfR1BEKDApKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEgc21ka2MxMDBfYmFja2xpZ2h0X2RhdGEgPSB7Ci0JLnB3bV9pZAkJPSAwLAotCS5tYXhfYnJpZ2h0bmVzcwk9IDI1NSwKLQkuZGZ0X2JyaWdodG5lc3MJPSAyNTUsCi0JLnB3bV9wZXJpb2RfbnMJPSA3ODc3MCwKLQkuaW5pdAkJPSBzbWRrYzEwMF9iYWNrbGlnaHRfaW5pdCwKLQkuZXhpdAkJPSBzbWRrYzEwMF9iYWNrbGlnaHRfZXhpdCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtZGtjMTAwX2JhY2tsaWdodF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInB3bS1iYWNrbGlnaHQiLAotCS5kZXYJCT0gewotCQkucGFyZW50CQk9ICZzM2NfZGV2aWNlX3RpbWVyWzBdLmRldiwKLQkJLnBsYXRmb3JtX2RhdGEJPSAmc21ka2MxMDBfYmFja2xpZ2h0X2RhdGEsCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbWRrYzEwMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmczNjX2RldmljZV9hZGMsCiAJJnMzY19kZXZpY2VfY2Zjb24sCkBAIC0yMzksOCArMjAxLDYgQEAKIAkmczVwX2RldmljZV9maW1jMSwKIAkmczVwX2RldmljZV9maW1jMiwKIAkmczVwYzEwMF9kZXZpY2Vfc3BkaWYsCi0JJnMzY19kZXZpY2VfdGltZXJbMF0sCi0JJnNtZGtjMTAwX2JhY2tsaWdodF9kZXZpY2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvIHMzY190c19wbGF0Zm9ybSBfX2luaXRkYXRhID0gewpAQCAtMjQ5LDYgKzIwOSwxNiBAQAogCS5vdmVyc2FtcGxpbmdfc2hpZnQJPSAyLAogfTsKIAorLyogTENEIEJhY2tsaWdodCBkYXRhICovCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfYmxfZ3Bpb19pbmZvIHNtZGtjMTAwX2JsX2dwaW9faW5mbyA9IHsKKwkubm8gPSBTNVBDMTAwX0dQRCgwKSwKKwkuZnVuYyA9IFMzQ19HUElPX1NGTigyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHNtZGtjMTAwX2JsX2RhdGEgPSB7CisJLnB3bV9pZCA9IDAsCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgc21ka2MxMDBfbWFwX2lvKHZvaWQpCiB7CiAJczVwX2luaXRfaW8oTlVMTCwgMCwgUzVQX1ZBX0NISVBJRCk7CkBAIC0yNzYsNiArMjQ2LDkgQEAKIAkvKiBMQ0QgaW5pdCAqLwogCWdwaW9fcmVxdWVzdChTNVBDMTAwX0dQSDAoNiksICJHUEgwIik7CiAJc21ka2MxMDBfbGNkX3Bvd2VyX3NldCgmc21ka2MxMDBfbGNkX3Bvd2VyX2RhdGEsIDApOworCisJc2Ftc3VuZ19ibF9zZXQoJnNtZGtjMTAwX2JsX2dwaW9faW5mbywgJnNtZGtjMTAwX2JsX2RhdGEpOworCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc21ka2MxMDBfZGV2aWNlcywgQVJSQVlfU0laRShzbWRrYzEwMF9kZXZpY2VzKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9zZXR1cC1mYi0yNGJwcC5jIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL3NldHVwLWZiLTI0YnBwLmMKaW5kZXggZDMxYzBmMy4uODk3OGU0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL3NldHVwLWZiLTI0YnBwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL3NldHVwLWZiLTI0YnBwLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAotI2luY2x1ZGUgPG1hY2gvcmVncy1mYi5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8cGxhdC9mYi5oPgogI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL0tjb25maWcKaW5kZXggMzdiNWE5Ny4uNzliYjNhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL0tjb25maWcKQEAgLTEzNCw2ICsxMzQsNyBAQAogCXNlbGVjdCBTM0NfREVWX1JUQwogCXNlbGVjdCBTM0NfREVWX1dEVAogCXNlbGVjdCBTQU1TVU5HX0RFVl9BREMKKwlzZWxlY3QgU0FNU1VOR19ERVZfQkFDS0xJR0hUCiAJc2VsZWN0IFNBTVNVTkdfREVWX0lERQogCXNlbGVjdCBTQU1TVU5HX0RFVl9LRVlQQUQKIAlzZWxlY3QgU0FNU1VOR19ERVZfUFdNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvTWFrZWZpbGUKaW5kZXggNTA5MDdhYy4uNTk5YTNjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9NYWtlZmlsZQpAQCAtMTUsNyArMTUsNiBAQAogb2JqLSQoQ09ORklHX0NQVV9TNVBWMjEwKQkrPSBjcHUubyBpbml0Lm8gY2xvY2subyBkbWEubwogb2JqLSQoQ09ORklHX0NQVV9TNVBWMjEwKQkrPSBzZXR1cC1pMmMwLm8KIG9iai0kKENPTkZJR19TNVBWMjEwX1BNKQkrPSBwbS5vIHNsZWVwLm8KLW9iai0kKENPTkZJR19DUFVfRlJFUSkJCSs9IGNwdWZyZXEubwogCiAjIG1hY2hpbmUgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jbG9jay5jCmluZGV4IDJkNTk5NDkuLmFlNzJmODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jbG9jay5jCkBAIC0zNiw3ICszNiw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfYXBsbCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAibW91dF9hcGxsIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMJPSAmY2xrX3NyY19hcGxsLAogCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS19TUkMwLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDEgfSwKQEAgLTQ1LDcgKzQ0LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9lcGxsID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJtb3V0X2VwbGwiLAotCQkuaWQJCT0gLTEsCiAJfSwKIAkuc291cmNlcwk9ICZjbGtfc3JjX2VwbGwsCiAJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLX1NSQzAsIC5zaGlmdCA9IDgsIC5zaXplID0gMSB9LApAQCAtNTQsNyArNTIsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X21wbGwgPSB7CiAJLmNsayA9IHsKIAkJLm5hbWUJCT0gIm1vdXRfbXBsbCIsCi0JCS5pZAkJPSAtMSwKIAl9LAogCS5zb3VyY2VzCT0gJmNsa19zcmNfbXBsbCwKIAkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtfU1JDMCwgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCkBAIC03Myw3ICs3MCw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FybWNsayA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAiYXJtY2xrIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMJPSAmY2xrc2V0X2FybWNsaywKIAkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtfU1JDMCwgLnNoaWZ0ID0gMTYsIC5zaXplID0gMSB9LApAQCAtODMsNyArNzksNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19oY2xrX21zeXMgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImhjbGtfbXN5cyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2FybWNsay5jbGssCiAJfSwKIAkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtfRElWMCwgLnNoaWZ0ID0gOCwgLnNpemUgPSAzIH0sCkBAIC05Miw3ICs4Nyw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3BjbGtfbXN5cyA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAicGNsa19tc3lzIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaGNsa19tc3lzLmNsaywKIAl9LAogCS5yZWdfZGl2ICAgICAgICA9IHsgLnJlZyA9IFM1UF9DTEtfRElWMCwgLnNoaWZ0ID0gMTIsIC5zaXplID0gMyB9LApAQCAtMTAxLDcgKzk1LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa19hMm0gPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gInNjbGtfYTJtIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfbW91dF9hcGxsLmNsaywKIAl9LAogCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS19ESVYwLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDMgfSwKQEAgLTEyMCw3ICsxMTMsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19oY2xrX2RzeXMgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJPSAiaGNsa19kc3lzIiwKLQkJLmlkCT0gLTEsCiAJfSwKIAkuc291cmNlcwk9ICZjbGtzZXRfaGNsa19zeXMsCiAJLnJlZ19zcmMgICAgICAgID0geyAucmVnID0gUzVQX0NMS19TUkMwLCAuc2hpZnQgPSAyMCwgLnNpemUgPSAxIH0sCkBAIC0xMzAsNyArMTIyLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfcGNsa19kc3lzID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCT0gInBjbGtfZHN5cyIsCi0JCS5pZAk9IC0xLAogCQkucGFyZW50CT0gJmNsa19oY2xrX2RzeXMuY2xrLAogCX0sCiAJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLX0RJVjAsIC5zaGlmdCA9IDIwLCAuc2l6ZSA9IDMgfSwKQEAgLTEzOSw3ICsxMzAsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19oY2xrX3BzeXMgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJPSAiaGNsa19wc3lzIiwKLQkJLmlkCT0gLTEsCiAJfSwKIAkuc291cmNlcwk9ICZjbGtzZXRfaGNsa19zeXMsCiAJLnJlZ19zcmMgICAgICAgID0geyAucmVnID0gUzVQX0NMS19TUkMwLCAuc2hpZnQgPSAyNCwgLnNpemUgPSAxIH0sCkBAIC0xNDksNyArMTM5LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfcGNsa19wc3lzID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCT0gInBjbGtfcHN5cyIsCi0JCS5pZAk9IC0xLAogCQkucGFyZW50CT0gJmNsa19oY2xrX3BzeXMuY2xrLAogCX0sCiAJLnJlZ19kaXYgICAgICAgID0geyAucmVnID0gUzVQX0NMS19ESVYwLCAuc2hpZnQgPSAyOCwgLnNpemUgPSAzIH0sCkBAIC0xODcsMzggKzE3NiwzMSBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfc2Nsa19oZG1pMjdtID0gewogCS5uYW1lCQk9ICJzY2xrX2hkbWkyN20iLAotCS5pZAkJPSAtMSwKIAkucmF0ZQkJPSAyNzAwMDAwMCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19zY2xrX2hkbWlwaHkgPSB7CiAJLm5hbWUJCT0gInNjbGtfaGRtaXBoeSIsCi0JLmlkCQk9IC0xLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3NjbGtfdXNicGh5MCA9IHsKIAkubmFtZQkJPSAic2Nsa191c2JwaHkwIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfc2Nsa191c2JwaHkxID0gewogCS5uYW1lCQk9ICJzY2xrX3VzYnBoeTEiLAotCS5pZAkJPSAtMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19wY21jZGNsazAgPSB7CiAJLm5hbWUJCT0gInBjbWNkY2xrIiwKLQkuaWQJCT0gLTEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfcGNtY2RjbGsxID0gewogCS5uYW1lCQk9ICJwY21jZGNsayIsCi0JLmlkCQk9IC0xLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3BjbWNkY2xrMiA9IHsKIAkubmFtZQkJPSAicGNtY2RjbGsiLAotCS5pZAkJPSAtMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfdnBsbHNyY19saXN0W10gPSB7CkBAIC0yMzQsNyArMjE2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfdnBsbHNyYyA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAidnBsbF9zcmMiLAotCQkuaWQJCT0gLTEsCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA3KSwKIAl9LApAQCAtMjU1LDcgKzIzNiw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfdnBsbCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAic2Nsa192cGxsIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMJPSAmY2xrc2V0X3NjbGtfdnBsbCwKIAkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtfU1JDMCwgLnNoaWZ0ID0gMTIsIC5zaXplID0gMSB9LApAQCAtMjc2LDcgKzI1Niw2IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfZG1jMCA9IHsKIAkuY2xrCT0gewogCQkubmFtZQkJPSAibW91dF9kbWMwIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMJPSAmY2xrc2V0X21vdXRkbWMwc3JjLAogCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS19TUkM2LCAuc2hpZnQgPSAyNCwgLnNpemUgPSAyIH0sCkBAIC0yODUsNyArMjY0LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa19kbWMwID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJzY2xrX2RtYzAiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19tb3V0X2RtYzAuY2xrLAogCX0sCiAJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLX0RJVjYsIC5zaGlmdCA9IDI4LCAuc2l6ZSA9IDQgfSwKQEAgLTMxMiwxODEgKzI5MCwxNjkgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0gewogCXsKIAkJLm5hbWUJCT0gInBkbWEiLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczNjLXBsMzMwLjAiLAogCQkucGFyZW50CQk9ICZjbGtfaGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJwZG1hIiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInMzYy1wbDMzMC4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfcHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAwX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNCksCiAJfSwgewogCQkubmFtZQkJPSAicm90IiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaGNsa19kc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMTw8MjkpLAogCX0sIHsKIAkJLm5hbWUJCT0gImZpbWMiLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczVwdjIxMC1maW1jLjAiLAogCQkucGFyZW50CQk9ICZjbGtfaGNsa19kc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyNCksCiAJfSwgewogCQkubmFtZQkJPSAiZmltYyIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzNXB2MjEwLWZpbWMuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2RzeXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDI1KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJmaW1jIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInM1cHYyMTAtZmltYy4yIiwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfZHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAwX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMjYpLAogCX0sIHsKIAkJLm5hbWUJCT0gIm90ZyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfcHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAxX2N0cmwsCiAJCS5jdHJsYml0CT0gKDE8PDE2KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1c2ItaG9zdCIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfcHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAxX2N0cmwsCiAJCS5jdHJsYml0CT0gKDE8PDE3KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJsY2QiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2RzeXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwMV9jdHJsLAogCQkuY3RybGJpdAk9ICgxPDwwKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJjZmNvbiIsCi0JCS5pZAkJPSAwLAogCQkucGFyZW50CQk9ICZjbGtfaGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDFfY3RybCwKIAkJLmN0cmxiaXQJPSAoMTw8MjUpLAogCX0sIHsKIAkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfcHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAyX2N0cmwsCiAJCS5jdHJsYml0CT0gKDE8PDE2KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJoc21tYyIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX3BzeXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwMl9jdHJsLAogCQkuY3RybGJpdAk9ICgxPDwxNyksCiAJfSwgewogCQkubmFtZQkJPSAiaHNtbWMiLAotCQkuaWQJCT0gMiwKKwkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjIiLAogCQkucGFyZW50CQk9ICZjbGtfaGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDJfY3RybCwKIAkJLmN0cmxiaXQJPSAoMTw8MTgpLAogCX0sIHsKIAkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmlkCQk9IDMsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4zIiwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfcHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAyX2N0cmwsCiAJCS5jdHJsYml0CT0gKDE8PDE5KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJzeXN0aW1lciIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfcHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAzX2N0cmwsCiAJCS5jdHJsYml0CT0gKDE8PDE2KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfcHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAzX2N0cmwsCiAJCS5jdHJsYml0CT0gKDE8PDIyKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJydGMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX3BzeXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwM19jdHJsLAogCQkuY3RybGJpdAk9ICgxPDwxNSksCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjAiLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMTw8NyksCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjEiLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxMCksCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjIiLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMTw8OSksCiAJfSwgewogCQkubmFtZQkJPSAic3BpIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjAiLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMTw8MTIpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwaSIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfcHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAzX2N0cmwsCiAJCS5jdHJsYml0CT0gKDE8PDEzKSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJzcGkiLAotCQkuaWQJCT0gMiwKKwkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMiIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX3BzeXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwM19jdHJsLAogCQkuY3RybGJpdAk9ICgxPDwxNCksCiAJfSwgewogCQkubmFtZQkJPSAidGltZXJzIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMTw8MjMpLAogCX0sIHsKIAkJLm5hbWUJCT0gImFkYyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfcHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAzX2N0cmwsCiAJCS5jdHJsYml0CT0gKDE8PDI0KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJrZXlwYWQiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX3BzeXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwM19jdHJsLAogCQkuY3RybGJpdAk9ICgxPDwyMSksCiAJfSwgewogCQkubmFtZQkJPSAiaWlzIiwKLQkJLmlkCQk9IDAsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjAiLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMTw8NCksCiAJfSwgewogCQkubmFtZQkJPSAiaWlzIiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjEiLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJpaXMiLAotCQkuaWQJCT0gMiwKKwkJLmRldm5hbWUJPSAic2Ftc3VuZy1pMnMuMiIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwM19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDYpLAogCX0sIHsKIAkJLm5hbWUJCT0gInNwZGlmIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKQEAgLTQ5NiwzOCArNDYyLDM2IEBACiBzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc1tdID0gewogCXsKIAkJLm5hbWUJCT0gImhjbGtfaW1lbSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfbXN5cy5jbGssCiAJCS5jdHJsYml0CT0gKDEgPDwgNSksCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAwX2N0cmwsCiAJCS5vcHMJCT0gJmNsa19oY2xrX2ltZW1fb3BzLAogCX0sIHsKIAkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjAiLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxNyksCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX3BzeXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwM19jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE4KSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4yIiwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfcHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAzX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTkpLAogCX0sIHsKIAkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMywKKwkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjMiLAogCQkucGFyZW50CQk9ICZjbGtfcGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyMCksCiAJfSwgewogCQkubmFtZQkJPSAic3JvbWMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX3BzeXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwMV9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDI2KSwKQEAgLTU3OSw3ICs1NDMsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX2RhYyA9IHsKIAkuY2xrCQk9IHsKIAkJLm5hbWUJCT0gInNjbGtfZGFjIiwKLQkJLmlkCQk9IC0xLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX21hc2swX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMiksCiAJfSwKQEAgLTU5MCw3ICs1NTMsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX3BpeGVsID0gewogCS5jbGsJCT0gewogCQkubmFtZQkJPSAic2Nsa19waXhlbCIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3NjbGtfdnBsbC5jbGssCiAJfSwKIAkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtfRElWMSwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0fSwKQEAgLTYwOSw3ICs1NzEsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX2hkbWkgPSB7CiAJLmNsawkJPSB7CiAJCS5uYW1lCQk9ICJzY2xrX2hkbWkiLAotCQkuaWQJCT0gLTEsCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKIAl9LApAQCAtNjQ3LDcgKzYwOCw3IEBACiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfYXVkaW8wID0gewogCS5jbGsJCT0gewogCQkubmFtZQkJPSAic2Nsa19hdWRpbyIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzb2MtYXVkaW8uMCIsCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyNCksCiAJfSwKQEAgLTY3Niw3ICs2MzcsNyBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX2F1ZGlvMSA9IHsKIAkuY2xrCQk9IHsKIAkJLm5hbWUJCT0gInNjbGtfYXVkaW8iLAotCQkuaWQJCT0gMSwKKwkJLmRldm5hbWUJPSAic29jLWF1ZGlvLjEiLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX21hc2swX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMjUpLAogCX0sCkBAIC03MDUsNyArNjY2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa19hdWRpbzIgPSB7CiAJLmNsawkJPSB7CiAJCS5uYW1lCQk9ICJzY2xrX2F1ZGlvIiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInNvYy1hdWRpby4yIiwKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19tYXNrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDI2KSwKIAl9LApAQCAtNzI1LDQ4ICs2ODYsMTIgQEAKIAkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X3NjbGtfc3BkaWZfbGlzdCksCiB9OwogCi1zdGF0aWMgaW50IHM1cHYyMTBfc3BkaWZfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0Jc3RydWN0IGNsayAqcGNsazsKLQlpbnQgcmV0OwotCi0JcGNsayA9IGNsa19nZXRfcGFyZW50KGNsayk7Ci0JaWYgKElTX0VSUihwY2xrKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSBwY2xrLT5vcHMtPnNldF9yYXRlKHBjbGssIHJhdGUpOwotCWNsa19wdXQocGNsayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzNXB2MjEwX3NwZGlmX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlzdHJ1Y3QgY2xrICpwY2xrOwotCWludCByYXRlOwotCi0JcGNsayA9IGNsa19nZXRfcGFyZW50KGNsayk7Ci0JaWYgKElTX0VSUihwY2xrKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyYXRlID0gcGNsay0+b3BzLT5nZXRfcmF0ZShjbGspOwotCWNsa19wdXQocGNsayk7Ci0KLQlyZXR1cm4gcmF0ZTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGtfb3BzIHM1cHYyMTBfc2Nsa19zcGRpZl9vcHMgPSB7Ci0JLnNldF9yYXRlCT0gczVwdjIxMF9zcGRpZl9zZXRfcmF0ZSwKLQkuZ2V0X3JhdGUJPSBzNXB2MjEwX3NwZGlmX2dldF9yYXRlLAotfTsKLQogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX3NwZGlmID0gewogCS5jbGsJCT0gewogCQkubmFtZQkJPSAic2Nsa19zcGRpZiIsCi0JCS5pZAkJPSAtMSwKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19tYXNrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDI3KSwKLQkJLm9wcwkJPSAmczVwdjIxMF9zY2xrX3NwZGlmX29wcywKKwkJLm9wcwkJPSAmczVwX3NjbGtfc3BkaWZfb3BzLAogCX0sCiAJLnNvdXJjZXMgPSAmY2xrc2V0X3NjbGtfc3BkaWYsCiAJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLX1NSQzYsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDIgfSwKQEAgLTc5Myw3ICs3MTgsNiBAQAogCXsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2RtYyIsCi0JCQkuaWQJCT0gLTEsCiAJCX0sCiAJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cDEsCiAJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS19TUkM2LCAuc2hpZnQgPSAyNCwgLnNpemUgPSAyIH0sCkBAIC04MDEsNyArNzI1LDYgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19vbmVuYW5kIiwKLQkJCS5pZAkJPSAtMSwKIAkJfSwKIAkJLnNvdXJjZXMgPSAmY2xrc2V0X3NjbGtfb25lbmFuZCwKIAkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLX1NSQzAsIC5zaGlmdCA9IDI4LCAuc2l6ZSA9IDEgfSwKQEAgLTgwOSw3ICs3MzIsNyBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJ1Y2xrMSIsCi0JCQkuaWQJCT0gMCwKKwkJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4wIiwKIAkJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTIpLAogCQl9LApAQCAtODE5LDcgKzc0Miw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJ1Y2xrMSIsCi0JCQkuaWQJCT0gMSwKKwkJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4xIiwKIAkJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTMpLAogCQl9LApAQCAtODI5LDcgKzc1Miw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJ1Y2xrMSIsCi0JCQkuaWQJCT0gMiwKKwkJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4yIiwKIAkJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTQpLAogCQl9LApAQCAtODM5LDcgKzc2Miw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJ1Y2xrMSIsCi0JCQkuaWQJCT0gMywKKwkJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4zIiwKIAkJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTUpLAogCQl9LApAQCAtODQ5LDcgKzc3Miw2IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfbWl4ZXIiLAotCQkJLmlkCQk9IC0xLAogCQkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19tYXNrMF9jdHJsLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKIAkJfSwKQEAgLTg1OCw3ICs3ODAsNyBAQAogCX0sIHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJzNXB2MjEwLWZpbWMuMCIsCiAJCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX21hc2sxX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDIpLAogCQl9LApAQCAtODY4LDcgKzc5MCw3IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfZmltYyIsCi0JCQkuaWQJCT0gMSwKKwkJCS5kZXZuYW1lCT0gInM1cHYyMTAtZmltYy4xIiwKIAkJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazFfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMyksCiAJCX0sCkBAIC04NzgsNyArODAwLDcgQEAKIAl9LCB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19maW1jIiwKLQkJCS5pZAkJPSAyLAorCQkJLmRldm5hbWUJPSAiczVwdjIxMC1maW1jLjIiLAogCQkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19tYXNrMV9jdHJsLAogCQkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKIAkJfSwKQEAgLTg4OCw3ICs4MTAsNyBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19jYW0iLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJzNXB2MjEwLWZpbWMuMCIsCiAJCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX21hc2swX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDMpLAogCQl9LApAQCAtODk4LDcgKzgyMCw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2NhbSIsCi0JCQkuaWQJCT0gMSwKKwkJCS5kZXZuYW1lCT0gInM1cHYyMTAtZmltYy4xIiwKIAkJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgNCksCiAJCX0sCkBAIC05MDgsNyArODMwLDYgQEAKIAl9LCB7CiAJCS5jbGsJCT0gewogCQkJLm5hbWUJCT0gInNjbGtfZmltZCIsCi0JCQkuaWQJCT0gLTEsCiAJCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX21hc2swX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDUpLAogCQl9LApAQCAtOTE4LDcgKzgzOSw3IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX21tYyIsCi0JCQkuaWQJCT0gMCwKKwkJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4wIiwKIAkJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgOCksCiAJCX0sCkBAIC05MjgsNyArODQ5LDcgQEAKIAl9LCB7CiAJCS5jbGsJCT0gewogCQkJLm5hbWUJCT0gInNjbGtfbW1jIiwKLQkJCS5pZAkJPSAxLAorCQkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjEiLAogCQkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19tYXNrMF9jdHJsLAogCQkJLmN0cmxiaXQJPSAoMSA8PCA5KSwKIAkJfSwKQEAgLTkzOCw3ICs4NTksNyBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDIsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMiIsCiAJCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX21hc2swX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDEwKSwKIAkJfSwKQEAgLTk0OCw3ICs4NjksNyBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmlkCQk9IDMsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMyIsCiAJCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX21hc2swX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDExKSwKIAkJfSwKQEAgLTk1OCw3ICs4NzksNiBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19tZmMiLAotCQkJLmlkCQk9IC0xLAogCQkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDBfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTYpLAogCQl9LApAQCAtOTY4LDcgKzg4OCw2IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2cyZCIsCi0JCQkuaWQJCT0gLTEsCiAJCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwMF9jdHJsLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAxMiksCiAJCX0sCkBAIC05NzgsNyArODk3LDYgQEAKIAl9LCB7CiAJCS5jbGsJCT0gewogCQkJLm5hbWUJCT0gInNjbGtfZzNkIiwKLQkJCS5pZAkJPSAtMSwKIAkJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAwX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDgpLAogCQl9LApAQCAtOTg4LDcgKzkwNiw2IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2NzaXMiLAotCQkJLmlkCQk9IC0xLAogCQkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19tYXNrMF9jdHJsLAogCQkJLmN0cmxiaXQJPSAoMSA8PCA2KSwKIAkJfSwKQEAgLTk5OCw3ICs5MTUsNyBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19zcGkiLAotCQkJLmlkCQk9IDAsCisJCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4wIiwKIAkJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTYpLAogCQl9LApAQCAtMTAwOCw3ICs5MjUsNyBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19zcGkiLAotCQkJLmlkCQk9IDEsCisJCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4xIiwKIAkJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKIAkJCS5jdHJsYml0CT0gKDEgPDwgMTcpLAogCQl9LApAQCAtMTAxOCw3ICs5MzUsNiBAQAogCX0sIHsKIAkJLmNsawkJPSB7CiAJCQkubmFtZQkJPSAic2Nsa19wd2kiLAotCQkJLmlkCQk9IC0xLAogCQkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19tYXNrMF9jdHJsLAogCQkJLmN0cmxiaXQJPSAoMSA8PCAyOSksCiAJCX0sCkBAIC0xMDI4LDcgKzk0NCw2IEBACiAJfSwgewogCQkuY2xrCQk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX3B3bSIsCi0JCQkuaWQJCT0gLTEsCiAJCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX21hc2swX2N0cmwsCiAJCQkuY3RybGJpdAk9ICgxIDw8IDE5KSwKIAkJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jcHVmcmVxLmMgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvY3B1ZnJlcS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjA0NmUyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jcHVmcmVxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2NwdWZyZXEuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBDUFUgZnJlcXVlbmN5IHNjYWxpbmcgZm9yIFM1UEMxMTAvUzVQVjIxMAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgotCi1zdGF0aWMgc3RydWN0IGNsayAqY3B1X2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpkbWMwX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpkbWMxX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKLQotLyogQVBMTCBNLFAsUyB2YWx1ZXMgZm9yIDFHLzgwME1oeiAqLwotI2RlZmluZSBBUExMX1ZBTF8xMDAwCSgoMSA8PCAzMSkgfCAoMTI1IDw8IDE2KSB8ICgzIDw8IDgpIHwgMSkKLSNkZWZpbmUgQVBMTF9WQUxfODAwCSgoMSA8PCAzMSkgfCAoMTAwIDw8IDE2KSB8ICgzIDw8IDgpIHwgMSkKLQotLyoKLSAqIERSQU0gY29uZmlndXJhdGlvbnMgdG8gY2FsY3VsYXRlIHJlZnJlc2ggY291bnRlciBmb3IgY2hhbmdpbmcKLSAqIGZyZXF1ZW5jeSBvZiBtZW1vcnkuCi0gKi8KLXN0cnVjdCBkcmFtX2NvbmYgewotCXVuc2lnbmVkIGxvbmcgZnJlcTsJLyogSFogKi8KLQl1bnNpZ25lZCBsb25nIHJlZnJlc2g7CS8qIERSQU0gcmVmcmVzaCBjb3VudGVyICogMTAwMCAqLwotfTsKLQotLyogRFJBTSBjb25maWd1cmF0aW9uIChETUMwIGFuZCBETUMxKSAqLwotc3RhdGljIHN0cnVjdCBkcmFtX2NvbmYgczVwdjIxMF9kcmFtX2NvbmZbMl07Ci0KLWVudW0gcGVyZl9sZXZlbCB7Ci0JTDAsIEwxLCBMMiwgTDMsIEw0LAotfTsKLQotZW51bSBzNXB2MjEwX21lbV90eXBlIHsKLQlMUEREUgk9IDB4MSwKLQlMUEREUjIJPSAweDIsCi0JRERSMgk9IDB4NCwKLX07Ci0KLWVudW0gczVwdjIxMF9kbWNfcG9ydCB7Ci0JRE1DMCA9IDAsCi0JRE1DMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgczVwdjIxMF9mcmVxX3RhYmxlW10gPSB7Ci0Je0wwLCAxMDAwKjEwMDB9LAotCXtMMSwgODAwKjEwMDB9LAotCXtMMiwgNDAwKjEwMDB9LAotCXtMMywgMjAwKjEwMDB9LAotCXtMNCwgMTAwKjEwMDB9LAotCXswLCBDUFVGUkVRX1RBQkxFX0VORH0sCi19OwotCi1zdGF0aWMgdTMyIGNsa2Rpdl92YWxbNV1bMTFdID0gewotCS8qCi0JICogQ2xvY2sgZGl2aWRlciB2YWx1ZSBmb3IgZm9sbG93aW5nCi0JICogeyBBUExMLCBBMk0sIEhDTEtfTVNZUywgUENMS19NU1lTLAotCSAqICAgSENMS19EU1lTLCBQQ0xLX0RTWVMsIEhDTEtfUFNZUywgUENMS19QU1lTLAotCSAqICAgT05FRFJBTSwgTUZDLCBHM0QgfQotCSAqLwotCi0JLyogTDAgOiBbMTAwMC8yMDAvMTAwXVsxNjYvODNdWzEzMy82Nl1bMjAwLzIwMF0gKi8KLQl7MCwgNCwgNCwgMSwgMywgMSwgNCwgMSwgMywgMCwgMH0sCi0KLQkvKiBMMSA6IFs4MDAvMjAwLzEwMF1bMTY2LzgzXVsxMzMvNjZdWzIwMC8yMDBdICovCi0JezAsIDMsIDMsIDEsIDMsIDEsIDQsIDEsIDMsIDAsIDB9LAotCi0JLyogTDIgOiBbNDAwLzIwMC8xMDBdWzE2Ni84M11bMTMzLzY2XVsyMDAvMjAwXSAqLwotCXsxLCAzLCAxLCAxLCAzLCAxLCA0LCAxLCAzLCAwLCAwfSwKLQotCS8qIEwzIDogWzIwMC8yMDAvMTAwXVsxNjYvODNdWzEzMy82Nl1bMjAwLzIwMF0gKi8KLQl7MywgMywgMSwgMSwgMywgMSwgNCwgMSwgMywgMCwgMH0sCi0KLQkvKiBMNCA6IFsxMDAvMTAwLzEwMF1bODMvODNdWzY2LzY2XVsxMDAvMTAwXSAqLwotCXs3LCA3LCAwLCAwLCA3LCAwLCA5LCAwLCA3LCAwLCAwfSwKLX07Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNldCBEUkFNIHJlZnJlc2ggY291bnRlcgotICogYWNjb3JpZGluZyB0byBvcGVyYXRpbmcgZnJlcXVlbmN5IG9mIERSQU0KLSAqIGNoOiBETUMgcG9ydCBudW1iZXIgMCBvciAxCi0gKiBmcmVxOiBPcGVyYXRpbmcgZnJlcXVlbmN5IG9mIERSQU0oS0h6KQotICovCi1zdGF0aWMgdm9pZCBzNXB2MjEwX3NldF9yZWZyZXNoKGVudW0gczVwdjIxMF9kbWNfcG9ydCBjaCwgdW5zaWduZWQgbG9uZyBmcmVxKQotewotCXVuc2lnbmVkIGxvbmcgdG1wLCB0bXAxOwotCXZvaWQgX19pb21lbSAqcmVnID0gTlVMTDsKLQotCWlmIChjaCA9PSBETUMwKQotCQlyZWcgPSAoUzVQX1ZBX0RNQzAgKyAweDMwKTsKLQllbHNlIGlmIChjaCA9PSBETUMxKQotCQlyZWcgPSAoUzVQX1ZBX0RNQzEgKyAweDMwKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGZpbmQgRE1DIHBvcnRcbiIpOwotCi0JLyogRmluZCBjdXJyZW50IERSQU0gZnJlcXVlbmN5ICovCi0JdG1wID0gczVwdjIxMF9kcmFtX2NvbmZbY2hdLmZyZXE7Ci0KLQlkb19kaXYodG1wLCBmcmVxKTsKLQotCXRtcDEgPSBzNXB2MjEwX2RyYW1fY29uZltjaF0ucmVmcmVzaDsKLQotCWRvX2Rpdih0bXAxLCB0bXApOwotCi0JX19yYXdfd3JpdGVsKHRtcDEsIHJlZyk7Ci19Ci0KLWludCBzNXB2MjEwX3ZlcmlmeV9zcGVlZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKLXsKLQlpZiAocG9saWN5LT5jcHUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIHM1cHYyMTBfZnJlcV90YWJsZSk7Ci19Ci0KLXVuc2lnbmVkIGludCBzNXB2MjEwX2dldHNwZWVkKHVuc2lnbmVkIGludCBjcHUpCi17Ci0JaWYgKGNwdSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gY2xrX2dldF9yYXRlKGNwdV9jbGspIC8gMTAwMDsKLX0KLQotc3RhdGljIGludCBzNXB2MjEwX3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKLQkJCSAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAotCQkJICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCi17Ci0JdW5zaWduZWQgbG9uZyByZWc7Ci0JdW5zaWduZWQgaW50IGluZGV4LCBwcml2X2luZGV4OwotCXVuc2lnbmVkIGludCBwbGxfY2hhbmdpbmcgPSAwOwotCXVuc2lnbmVkIGludCBidXNfc3BlZWRfY2hhbmdpbmcgPSAwOwotCi0JZnJlcXMub2xkID0gczVwdjIxMF9nZXRzcGVlZCgwKTsKLQotCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBzNXB2MjEwX2ZyZXFfdGFibGUsCi0JCQkJCSAgIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJmluZGV4KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmcmVxcy5uZXcgPSBzNXB2MjEwX2ZyZXFfdGFibGVbaW5kZXhdLmZyZXF1ZW5jeTsKLQlmcmVxcy5jcHUgPSAwOwotCi0JaWYgKGZyZXFzLm5ldyA9PSBmcmVxcy5vbGQpCi0JCXJldHVybiAwOwotCi0JLyogRmluZGluZyBjdXJyZW50IHJ1bm5pbmcgbGV2ZWwgaW5kZXggKi8KLQlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgczVwdjIxMF9mcmVxX3RhYmxlLAotCQkJCQkgICBmcmVxcy5vbGQsIHJlbGF0aW9uLCAmcHJpdl9pbmRleCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKLQotCWlmIChmcmVxcy5uZXcgPiBmcmVxcy5vbGQpIHsKLQkJLyogVm9sdGFnZSB1cDogd2lsbCBiZSBpbXBsZW1lbnRlZCAqLwotCX0KLQotCS8qIENoZWNrIGlmIHRoZXJlIG5lZWQgdG8gY2hhbmdlIFBMTCAqLwotCWlmICgoaW5kZXggPT0gTDApIHx8IChwcml2X2luZGV4ID09IEwwKSkKLQkJcGxsX2NoYW5naW5nID0gMTsKLQotCS8qIENoZWNrIGlmIHRoZXJlIG5lZWQgdG8gY2hhbmdlIFN5c3RlbSBidXMgY2xvY2sgKi8KLQlpZiAoKGluZGV4ID09IEw0KSB8fCAocHJpdl9pbmRleCA9PSBMNCkpCi0JCWJ1c19zcGVlZF9jaGFuZ2luZyA9IDE7Ci0KLQlpZiAoYnVzX3NwZWVkX2NoYW5naW5nKSB7Ci0JCS8qCi0JCSAqIFJlY29uZmlndXJlIERSQU0gcmVmcmVzaCBjb3VudGVyIHZhbHVlIGZvciBtaW5pbXVtCi0JCSAqIHRlbXBvcmFyeSBjbG9jayB3aGlsZSBjaGFuZ2luZyBkaXZpZGVyLgotCQkgKiBleHBlY3RlZCBjbG9jayBpcyA4M01oeiA6IDcuOHVzZWMvKDEvODNNaHopID0gMHgyODcKLQkJICovCi0JCWlmIChwbGxfY2hhbmdpbmcpCi0JCQlzNXB2MjEwX3NldF9yZWZyZXNoKERNQzEsIDgzMDAwKTsKLQkJZWxzZQotCQkJczVwdjIxMF9zZXRfcmVmcmVzaChETUMxLCAxMDAwMDApOwotCi0JCXM1cHYyMTBfc2V0X3JlZnJlc2goRE1DMCwgODMwMDApOwotCX0KLQotCS8qCi0JICogQVBMTCBzaG91bGQgYmUgY2hhbmdlZCBpbiB0aGlzIGxldmVsCi0JICogQVBMTCAtPiBNUExMKGZvciBzdGFibGUgdHJhbnNpdGlvbikgLT4gQVBMTAotCSAqIFNvbWUgY2xvY2sgc291cmNlJ3MgY2xvY2sgQVBJIGFyZSBub3QgcHJlcGFyZWQuCi0JICogRG8gbm90IHVzZSBjbG9jayBBUEkgaW4gYmVsb3cgY29kZS4KLQkgKi8KLQlpZiAocGxsX2NoYW5naW5nKSB7Ci0JCS8qCi0JCSAqIDEuIFRlbXBvcmFyeSBDaGFuZ2UgZGl2aWRlciBmb3IgTUZDIGFuZCBHM0QKLQkJICogU0NMS0EyTSgyMDAvMT0yMDApLT4oMjAwLzQ9NTApTWh6Ci0JCSAqLwotCQlyZWcgPSBfX3Jhd19yZWFkbChTNVBfQ0xLX0RJVjIpOwotCQlyZWcgJj0gfihTNVBfQ0xLRElWMl9HM0RfTUFTSyB8IFM1UF9DTEtESVYyX01GQ19NQVNLKTsKLQkJcmVnIHw9ICgzIDw8IFM1UF9DTEtESVYyX0czRF9TSElGVCkgfAotCQkJKDMgPDwgUzVQX0NMS0RJVjJfTUZDX1NISUZUKTsKLQkJX19yYXdfd3JpdGVsKHJlZywgUzVQX0NMS19ESVYyKTsKLQotCQkvKiBGb3IgTUZDLCBHM0QgZGl2aWRpbmcgKi8KLQkJZG8gewotCQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9TVEFUMCk7Ci0JCX0gd2hpbGUgKHJlZyAmICgoMSA8PCAxNikgfCAoMSA8PCAxNykpKTsKLQotCQkvKgotCQkgKiAyLiBDaGFuZ2UgU0NMS0EyTSgyMDBNaHopdG8gU0NMS01QTEwgaW4gTUZDX01VWCwgRzNEIE1VWAotCQkgKiAoMjAwLzQ9NTApLT4oNjY3LzQ9MTY2KU1oegotCQkgKi8KLQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS19TUkMyKTsKLQkJcmVnICY9IH4oUzVQX0NMS1NSQzJfRzNEX01BU0sgfCBTNVBfQ0xLU1JDMl9NRkNfTUFTSyk7Ci0JCXJlZyB8PSAoMSA8PCBTNVBfQ0xLU1JDMl9HM0RfU0hJRlQpIHwKLQkJCSgxIDw8IFM1UF9DTEtTUkMyX01GQ19TSElGVCk7Ci0JCV9fcmF3X3dyaXRlbChyZWcsIFM1UF9DTEtfU1JDMik7Ci0KLQkJZG8gewotCQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS01VWF9TVEFUMSk7Ci0JCX0gd2hpbGUgKHJlZyAmICgoMSA8PCA3KSB8ICgxIDw8IDMpKSk7Ci0KLQkJLyoKLQkJICogMy4gRE1DMSByZWZyZXNoIGNvdW50IGZvciAxMzNNaHogaWYgKGluZGV4ID09IEw0KSBpcwotCQkgKiB0cnVlIHJlZnJlc2ggY291bnRlciBpcyBhbHJlYWR5IHByb2dyYW1lZCBpbiB1cHBlcgotCQkgKiBjb2RlLiAweDI4N0A4M01oegotCQkgKi8KLQkJaWYgKCFidXNfc3BlZWRfY2hhbmdpbmcpCi0JCQlzNXB2MjEwX3NldF9yZWZyZXNoKERNQzEsIDEzMzAwMCk7Ci0KLQkJLyogNC4gU0NMS0FQTEwgLT4gU0NMS01QTEwgKi8KLQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS19TUkMwKTsKLQkJcmVnICY9IH4oUzVQX0NMS1NSQzBfTVVYMjAwX01BU0spOwotCQlyZWcgfD0gKDB4MSA8PCBTNVBfQ0xLU1JDMF9NVVgyMDBfU0hJRlQpOwotCQlfX3Jhd193cml0ZWwocmVnLCBTNVBfQ0xLX1NSQzApOwotCi0JCWRvIHsKLQkJCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtNVVhfU1RBVDApOwotCQl9IHdoaWxlIChyZWcgJiAoMHgxIDw8IDE4KSk7Ci0KLQl9Ci0KLQkvKiBDaGFuZ2UgZGl2aWRlciAqLwotCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtfRElWMCk7Ci0KLQlyZWcgJj0gfihTNVBfQ0xLRElWMF9BUExMX01BU0sgfCBTNVBfQ0xLRElWMF9BMk1fTUFTSyB8Ci0JCVM1UF9DTEtESVYwX0hDTEsyMDBfTUFTSyB8IFM1UF9DTEtESVYwX1BDTEsxMDBfTUFTSyB8Ci0JCVM1UF9DTEtESVYwX0hDTEsxNjZfTUFTSyB8IFM1UF9DTEtESVYwX1BDTEs4M19NQVNLIHwKLQkJUzVQX0NMS0RJVjBfSENMSzEzM19NQVNLIHwgUzVQX0NMS0RJVjBfUENMSzY2X01BU0spOwotCi0JcmVnIHw9ICgoY2xrZGl2X3ZhbFtpbmRleF1bMF0gPDwgUzVQX0NMS0RJVjBfQVBMTF9TSElGVCkgfAotCQkoY2xrZGl2X3ZhbFtpbmRleF1bMV0gPDwgUzVQX0NMS0RJVjBfQTJNX1NISUZUKSB8Ci0JCShjbGtkaXZfdmFsW2luZGV4XVsyXSA8PCBTNVBfQ0xLRElWMF9IQ0xLMjAwX1NISUZUKSB8Ci0JCShjbGtkaXZfdmFsW2luZGV4XVszXSA8PCBTNVBfQ0xLRElWMF9QQ0xLMTAwX1NISUZUKSB8Ci0JCShjbGtkaXZfdmFsW2luZGV4XVs0XSA8PCBTNVBfQ0xLRElWMF9IQ0xLMTY2X1NISUZUKSB8Ci0JCShjbGtkaXZfdmFsW2luZGV4XVs1XSA8PCBTNVBfQ0xLRElWMF9QQ0xLODNfU0hJRlQpIHwKLQkJKGNsa2Rpdl92YWxbaW5kZXhdWzZdIDw8IFM1UF9DTEtESVYwX0hDTEsxMzNfU0hJRlQpIHwKLQkJKGNsa2Rpdl92YWxbaW5kZXhdWzddIDw8IFM1UF9DTEtESVYwX1BDTEs2Nl9TSElGVCkpOwotCi0JX19yYXdfd3JpdGVsKHJlZywgUzVQX0NMS19ESVYwKTsKLQotCWRvIHsKLQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9TVEFUMCk7Ci0JfSB3aGlsZSAocmVnICYgMHhmZik7Ci0KLQkvKiBBUk0gTUNTIHZhbHVlIGNoYW5nZWQgKi8KLQlyZWcgPSBfX3Jhd19yZWFkbChTNVBfQVJNX01DU19DT04pOwotCXJlZyAmPSB+MHgzOwotCWlmIChpbmRleCA+PSBMMykKLQkJcmVnIHw9IDB4MzsKLQllbHNlCi0JCXJlZyB8PSAweDE7Ci0KLQlfX3Jhd193cml0ZWwocmVnLCBTNVBfQVJNX01DU19DT04pOwotCi0JaWYgKHBsbF9jaGFuZ2luZykgewotCQkvKiA1LiBTZXQgTG9jayB0aW1lID0gMzB1cyoyNE1oeiA9IDB4MmNmICovCi0JCV9fcmF3X3dyaXRlbCgweDJjZiwgUzVQX0FQTExfTE9DSyk7Ci0KLQkJLyoKLQkJICogNi4gVHVybiBvbiBBUExMCi0JCSAqIDYtMS4gU2V0IFBNUyB2YWx1ZXMKLQkJICogNi0yLiBXYWl0IHVudGlsZSB0aGUgUExMIGlzIGxvY2tlZAotCQkgKi8KLQkJaWYgKGluZGV4ID09IEwwKQotCQkJX19yYXdfd3JpdGVsKEFQTExfVkFMXzEwMDAsIFM1UF9BUExMX0NPTik7Ci0JCWVsc2UKLQkJCV9fcmF3X3dyaXRlbChBUExMX1ZBTF84MDAsIFM1UF9BUExMX0NPTik7Ci0KLQkJZG8gewotCQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0FQTExfQ09OKTsKLQkJfSB3aGlsZSAoIShyZWcgJiAoMHgxIDw8IDI5KSkpOwotCi0JCS8qCi0JCSAqIDcuIENoYW5nZSBzb3VjZSBjbG9jayBmcm9tIFNDTEtNUExMKDY2N01oeikKLQkJICogdG8gU0NMS0EyTSgyMDBNaHopIGluIE1GQ19NVVggYW5kIEczRCBNVVgKLQkJICogKDY2Ny80PTE2NiktPigyMDAvND01MClNaHoKLQkJICovCi0JCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtfU1JDMik7Ci0JCXJlZyAmPSB+KFM1UF9DTEtTUkMyX0czRF9NQVNLIHwgUzVQX0NMS1NSQzJfTUZDX01BU0spOwotCQlyZWcgfD0gKDAgPDwgUzVQX0NMS1NSQzJfRzNEX1NISUZUKSB8Ci0JCQkoMCA8PCBTNVBfQ0xLU1JDMl9NRkNfU0hJRlQpOwotCQlfX3Jhd193cml0ZWwocmVnLCBTNVBfQ0xLX1NSQzIpOwotCi0JCWRvIHsKLQkJCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtNVVhfU1RBVDEpOwotCQl9IHdoaWxlIChyZWcgJiAoKDEgPDwgNykgfCAoMSA8PCAzKSkpOwotCi0JCS8qCi0JCSAqIDguIENoYW5nZSBkaXZpZGVyIGZvciBNRkMgYW5kIEczRAotCQkgKiAoMjAwLzQ9NTApLT4oMjAwLzE9MjAwKU1oegotCQkgKi8KLQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS19ESVYyKTsKLQkJcmVnICY9IH4oUzVQX0NMS0RJVjJfRzNEX01BU0sgfCBTNVBfQ0xLRElWMl9NRkNfTUFTSyk7Ci0JCXJlZyB8PSAoY2xrZGl2X3ZhbFtpbmRleF1bMTBdIDw8IFM1UF9DTEtESVYyX0czRF9TSElGVCkgfAotCQkJKGNsa2Rpdl92YWxbaW5kZXhdWzldIDw8IFM1UF9DTEtESVYyX01GQ19TSElGVCk7Ci0JCV9fcmF3X3dyaXRlbChyZWcsIFM1UF9DTEtfRElWMik7Ci0KLQkJLyogRm9yIE1GQywgRzNEIGRpdmlkaW5nICovCi0JCWRvIHsKLQkJCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtESVZfU1RBVDApOwotCQl9IHdoaWxlIChyZWcgJiAoKDEgPDwgMTYpIHwgKDEgPDwgMTcpKSk7Ci0KLQkJLyogOS4gQ2hhbmdlIE1QTEwgdG8gQVBMTCBpbiBNU1lTX01VWCAqLwotCQlyZWcgPSBfX3Jhd19yZWFkbChTNVBfQ0xLX1NSQzApOwotCQlyZWcgJj0gfihTNVBfQ0xLU1JDMF9NVVgyMDBfTUFTSyk7Ci0JCXJlZyB8PSAoMHgwIDw8IFM1UF9DTEtTUkMwX01VWDIwMF9TSElGVCk7Ci0JCV9fcmF3X3dyaXRlbChyZWcsIFM1UF9DTEtfU1JDMCk7Ci0KLQkJZG8gewotCQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS01VWF9TVEFUMCk7Ci0JCX0gd2hpbGUgKHJlZyAmICgweDEgPDwgMTgpKTsKLQotCQkvKgotCQkgKiAxMC4gRE1DMSByZWZyZXNoIGNvdW50ZXIKLQkJICogTDQgOiBETUMxID0gMTAwTWh6IDcuOHVzLygxLzEwMCkgPSAweDMwYwotCQkgKiBPdGhlcnMgOiBETUMxID0gMjAwTWh6IDcuOHVzLygxLzIwMCkgPSAweDYxOAotCQkgKi8KLQkJaWYgKCFidXNfc3BlZWRfY2hhbmdpbmcpCi0JCQlzNXB2MjEwX3NldF9yZWZyZXNoKERNQzEsIDIwMDAwMCk7Ci0JfQotCi0JLyoKLQkgKiBMNCBsZXZlbCBuZWVkIHRvIGNoYW5nZSBtZW1vcnkgYnVzIHNwZWVkLCBoZW5jZSBvbmVkcmFtIGNsb2NrIGRpdmllcgotCSAqIGFuZCBtZW1vcnkgcmVmcmVzaCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGNoYW5nZWQKLQkgKi8KLQlpZiAoYnVzX3NwZWVkX2NoYW5naW5nKSB7Ci0JCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtfRElWNik7Ci0JCXJlZyAmPSB+UzVQX0NMS0RJVjZfT05FRFJBTV9NQVNLOwotCQlyZWcgfD0gKGNsa2Rpdl92YWxbaW5kZXhdWzhdIDw8IFM1UF9DTEtESVY2X09ORURSQU1fU0hJRlQpOwotCQlfX3Jhd193cml0ZWwocmVnLCBTNVBfQ0xLX0RJVjYpOwotCi0JCWRvIHsKLQkJCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtESVZfU1RBVDEpOwotCQl9IHdoaWxlIChyZWcgJiAoMSA8PCAxNSkpOwotCi0JCS8qIFJlY29uZmlndXJlIERSQU0gcmVmcmVzaCBjb3VudGVyIHZhbHVlICovCi0JCWlmIChpbmRleCAhPSBMNCkgewotCQkJLyoKLQkJCSAqIERNQzAgOiAxNjZNaHoKLQkJCSAqIERNQzEgOiAyMDBNaHoKLQkJCSAqLwotCQkJczVwdjIxMF9zZXRfcmVmcmVzaChETUMwLCAxNjYwMDApOwotCQkJczVwdjIxMF9zZXRfcmVmcmVzaChETUMxLCAyMDAwMDApOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIERNQzAgOiA4M01oegotCQkJICogRE1DMSA6IDEwME1oegotCQkJICovCi0JCQlzNXB2MjEwX3NldF9yZWZyZXNoKERNQzAsIDgzMDAwKTsKLQkJCXM1cHYyMTBfc2V0X3JlZnJlc2goRE1DMSwgMTAwMDAwKTsKLQkJfQotCX0KLQotCWlmIChmcmVxcy5uZXcgPCBmcmVxcy5vbGQpIHsKLQkJLyogVm9sdGFnZSBkb3duOiB3aWxsIGJlIGltcGxlbWVudGVkICovCi0JfQotCi0JY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiUGVyZiBjaGFuZ2VkW0wlZF1cbiIsIGluZGV4KTsKLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHM1cHYyMTBfY3B1ZnJlcV9zdXNwZW5kKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHM1cHYyMTBfY3B1ZnJlcV9yZXN1bWUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBjaGVja19tZW1fdHlwZSh2b2lkIF9faW9tZW0gKmRtY19yZWcpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0KLQl2YWwgPSBfX3Jhd19yZWFkbChkbWNfcmVnICsgMHg0KTsKLQl2YWwgPSAodmFsICYgKDB4ZiA8PCA4KSk7Ci0KLQlyZXR1cm4gdmFsID4+IDg7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHM1cHYyMTBfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCi17Ci0JdW5zaWduZWQgbG9uZyBtZW1fdHlwZTsKLQotCWNwdV9jbGsgPSBjbGtfZ2V0KE5VTEwsICJhcm1jbGsiKTsKLQlpZiAoSVNfRVJSKGNwdV9jbGspKQotCQlyZXR1cm4gUFRSX0VSUihjcHVfY2xrKTsKLQotCWRtYzBfY2xrID0gY2xrX2dldChOVUxMLCAic2Nsa19kbWMwIik7Ci0JaWYgKElTX0VSUihkbWMwX2NsaykpIHsKLQkJY2xrX3B1dChjcHVfY2xrKTsKLQkJcmV0dXJuIFBUUl9FUlIoZG1jMF9jbGspOwotCX0KLQotCWRtYzFfY2xrID0gY2xrX2dldChOVUxMLCAiaGNsa19tc3lzIik7Ci0JaWYgKElTX0VSUihkbWMxX2NsaykpIHsKLQkJY2xrX3B1dChkbWMwX2Nsayk7Ci0JCWNsa19wdXQoY3B1X2Nsayk7Ci0JCXJldHVybiBQVFJfRVJSKGRtYzFfY2xrKTsKLQl9Ci0KLQlpZiAocG9saWN5LT5jcHUgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKgotCSAqIGNoZWNrX21lbV90eXBlIDogVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0IExQRERSICYgTFBERFIyLgotCSAqIG90aGVyIG1lbW9yeSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuCi0JICovCi0JbWVtX3R5cGUgPSBjaGVja19tZW1fdHlwZShTNVBfVkFfRE1DMCk7Ci0KLQlpZiAoKG1lbV90eXBlICE9IExQRERSKSAmJiAobWVtX3R5cGUgIT0gTFBERFIyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkNQVUZyZXEgZG9lc24ndCBzdXBwb3J0IHRoaXMgbWVtb3J5IHR5cGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBGaW5kIGN1cnJlbnQgcmVmcmVzaCBjb3VudGVyIGFuZCBmcmVxdWVuY3kgZWFjaCBETUMgKi8KLQlzNXB2MjEwX2RyYW1fY29uZlswXS5yZWZyZXNoID0gKF9fcmF3X3JlYWRsKFM1UF9WQV9ETUMwICsgMHgzMCkgKiAxMDAwKTsKLQlzNXB2MjEwX2RyYW1fY29uZlswXS5mcmVxID0gY2xrX2dldF9yYXRlKGRtYzBfY2xrKTsKLQotCXM1cHYyMTBfZHJhbV9jb25mWzFdLnJlZnJlc2ggPSAoX19yYXdfcmVhZGwoUzVQX1ZBX0RNQzEgKyAweDMwKSAqIDEwMDApOwotCXM1cHYyMTBfZHJhbV9jb25mWzFdLmZyZXEgPSBjbGtfZ2V0X3JhdGUoZG1jMV9jbGspOwotCi0JcG9saWN5LT5jdXIgPSBwb2xpY3ktPm1pbiA9IHBvbGljeS0+bWF4ID0gczVwdjIxMF9nZXRzcGVlZCgwKTsKLQotCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKHM1cHYyMTBfZnJlcV90YWJsZSwgcG9saWN5LT5jcHUpOwotCi0JcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDQwMDAwOwotCi0JcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBzNXB2MjEwX2ZyZXFfdGFibGUpOwotfQotCi1zdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIHM1cHYyMTBfZHJpdmVyID0gewotCS5mbGFncwkJPSBDUFVGUkVRX1NUSUNLWSwKLQkudmVyaWZ5CQk9IHM1cHYyMTBfdmVyaWZ5X3NwZWVkLAotCS50YXJnZXQJCT0gczVwdjIxMF90YXJnZXQsCi0JLmdldAkJPSBzNXB2MjEwX2dldHNwZWVkLAotCS5pbml0CQk9IHM1cHYyMTBfY3B1X2luaXQsCi0JLm5hbWUJCT0gInM1cHYyMTAiLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gczVwdjIxMF9jcHVmcmVxX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzNXB2MjEwX2NwdWZyZXFfcmVzdW1lLAotI2VuZGlmCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzNXB2MjEwX2NwdWZyZXFfaW5pdCh2b2lkKQotewotCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmczVwdjIxMF9kcml2ZXIpOwotfQotCi1sYXRlX2luaXRjYWxsKHM1cHYyMTBfY3B1ZnJlcV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9kZXYtc3BpLmMgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvZGV2LXNwaS5jCmluZGV4IGUzMjQ5YTQuLmVhZjlhN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9kZXYtc3BpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2Rldi1zcGkuYwpAQCAtODUsNiArODUsNyBAQAogCS5maWZvX2x2bF9tYXNrID0gMHgxZmYsCiAJLnJ4X2x2bF9vZmZzZXQgPSAxNSwKIAkuaGlnaF9zcGVlZCA9IDEsCisJLnR4X3N0X2RvbmUgPSAyNSwKIH07CiAKIHN0YXRpYyB1NjQgc3BpX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwpAQCAtMTI5LDYgKzEzMCw3IEBACiAJLmZpZm9fbHZsX21hc2sgPSAweDdmLAogCS5yeF9sdmxfb2Zmc2V0ID0gMTUsCiAJLmhpZ2hfc3BlZWQgPSAxLAorCS50eF9zdF9kb25lID0gMjUsCiB9OwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3NwaTEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9jbGtkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGZmYTgzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9jbGtkZXYuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX19NQUNIX0NMS0RFVl9IX18KKyNkZWZpbmUgX19NQUNIX0NMS0RFVl9IX18KKworI2RlZmluZSBfX2Nsa19nZXQoY2xrKSAoeyAxOyB9KQorI2RlZmluZSBfX2Nsa19wdXQoY2xrKSBkbyB7fSB3aGlsZSAoMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL3JlZ3MtZmIuaCBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvcmVncy1mYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGQ5OTI5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvcmVncy1mYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgMjAxMCBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+Ci0gKgotICogRHVtbXkgZnJhbWVidWZmZXIgdG8gYWxsb3cgYnVpbGQgZm9yIHRoZSBtb21lbnQuCi0gKiAKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUFDSF9SRUdTX0ZCX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NQUNIX1JFR1NfRkJfSCBfX0ZJTEVfXwotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHMzY19mYl9wYWxfcmVnKHVuc2lnbmVkIGludCB3aW5kb3csIGludCByZWcpCi17Ci0JcmV0dXJuIDB4MjQwMCArICh3aW5kb3cgKiAyNTYgKjQgKSArIHJlZzsKLX0KLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTUFDSF9SRUdTX0ZCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLWFxdWlsYS5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtYXF1aWxhLmMKaW5kZXggNGUxZDhmZi4uNTA5NjI3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtYXF1aWxhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtYXF1aWxhLmMKQEAgLTI5LDcgKzI5LDYgQEAKIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWZiLmg+CiAKICNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgpAQCAtNDAsNiArMzksNyBAQAogI2luY2x1ZGUgPHBsYXQvZmltYy1jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgogI2luY2x1ZGUgPHBsYXQvczVwLXRpbWUuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtZmItdjQuaD4KIAogLyogRm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgVUNPTiwgVUxDT04gYW5kIFVGQ09OIFVBUlQgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFRVUlMQV9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLWdvbmkuYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLWdvbmkuYwppbmRleCAzMWQ1YWE3Li5lMGM0ZDA2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1nb25pLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtZ29uaS5jCkBAIC0zNCw3ICszNCw2IEBACiAKICNpbmNsdWRlIDxtYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1mYi5oPgogCiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KQEAgLTQ3LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvczVwLXRpbWUuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtZmItdjQuaD4KIAogLyogRm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgVUNPTiwgVUxDT04gYW5kIFVGQ09OIFVBUlQgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEdPTklfVUNPTl9ERUZBVUxUCShTM0MyNDEwX1VDT05fVFhJTEVWRUwgfAlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1zbWRrdjIxMC5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtc21ka3YyMTAuYwppbmRleCBjNmE5ZTg2Li5lZjIwZjkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1zbWRrdjIxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLXNtZGt2MjEwLmMKQEAgLTI5LDcgKzI5LDYgQEAKIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWZiLmg+CiAKICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLXNyb20uaD4KQEAgLTQ1LDYgKzQ0LDggQEAKICNpbmNsdWRlIDxwbGF0L3BtLmg+CiAjaW5jbHVkZSA8cGxhdC9mYi5oPgogI2luY2x1ZGUgPHBsYXQvczVwLXRpbWUuaD4KKyNpbmNsdWRlIDxwbGF0L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgogCiAvKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KICNkZWZpbmUgU01ES1YyMTBfVUNPTl9ERUZBVUxUCShTM0MyNDEwX1VDT05fVFhJTEVWRUwgfAlcCkBAIC0yMTAsNDUgKzIxMSw2IEBACiAJLnNldHVwX2dwaW8JPSBzNXB2MjEwX2ZiX2dwaW9fc2V0dXBfMjRicHAsCiB9OwogCi1zdGF0aWMgaW50IHNtZGt2MjEwX2JhY2tsaWdodF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0KFM1UFYyMTBfR1BEMCgzKSwgIkJhY2tsaWdodCIpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVxdWVzdCBHUEQgZm9yIFBXTS1PVVQgM1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogQ29uZmlndXJlIEdQSU8gcGluIHdpdGggUzVQVjIxMF9HUERfMF8zX1RPVVRfMyAqLwotCXMzY19ncGlvX2NmZ3BpbihTNVBWMjEwX0dQRDAoMyksIFMzQ19HUElPX1NGTigyKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc21ka3YyMTBfYmFja2xpZ2h0X2V4aXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXMzY19ncGlvX2NmZ3BpbihTNVBWMjEwX0dQRDAoMyksIFMzQ19HUElPX09VVFBVVCk7Ci0JZ3Bpb19mcmVlKFM1UFYyMTBfR1BEMCgzKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHNtZGt2MjEwX2JhY2tsaWdodF9kYXRhID0gewotCS5wd21faWQJCT0gMywKLQkubWF4X2JyaWdodG5lc3MJPSAyNTUsCi0JLmRmdF9icmlnaHRuZXNzCT0gMjU1LAotCS5wd21fcGVyaW9kX25zCT0gNzg3NzAsCi0JLmluaXQJCT0gc21ka3YyMTBfYmFja2xpZ2h0X2luaXQsCi0JLmV4aXQJCT0gc21ka3YyMTBfYmFja2xpZ2h0X2V4aXQsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWRrdjIxMF9iYWNrbGlnaHRfZGV2aWNlID0gewotCS5uYW1lCQk9ICJwd20tYmFja2xpZ2h0IiwKLQkuZGV2CQk9IHsKLQkJLnBhcmVudAkJPSAmczNjX2RldmljZV90aW1lclszXS5kZXYsCi0JCS5wbGF0Zm9ybV9kYXRhCT0gJnNtZGt2MjEwX2JhY2tsaWdodF9kYXRhLAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21ka3YyMTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnMzY19kZXZpY2VfYWRjLAogCSZzM2NfZGV2aWNlX2NmY29uLApAQCAtMjcwLDggKzIzMiw2IEBACiAJJnNhbXN1bmdfZGV2aWNlX2tleXBhZCwKIAkmc21ka3YyMTBfZG05MDAwLAogCSZzbWRrdjIxMF9sY2RfbHRlNDgwd3YsCi0JJnMzY19kZXZpY2VfdGltZXJbM10sCi0JJnNtZGt2MjEwX2JhY2tsaWdodF9kZXZpY2UsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgc21ka3YyMTBfZG05MDAwX2luaXQodm9pZCkKQEAgLTMxMCw2ICsyNzAsMTYgQEAKIAkub3ZlcnNhbXBsaW5nX3NoaWZ0CT0gMiwKIH07CiAKKy8qIExDRCBCYWNrbGlnaHQgZGF0YSAqLworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2JsX2dwaW9faW5mbyBzbWRrdjIxMF9ibF9ncGlvX2luZm8gPSB7CisJLm5vID0gUzVQVjIxMF9HUEQwKDMpLAorCS5mdW5jID0gUzNDX0dQSU9fU0ZOKDIpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEgc21ka3YyMTBfYmxfZGF0YSA9IHsKKwkucHdtX2lkID0gMywKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzbWRrdjIxMF9tYXBfaW8odm9pZCkKIHsKIAlzNXBfaW5pdF9pbyhOVUxMLCAwLCBTNVBfVkFfQ0hJUElEKTsKQEAgLTM0MSw2ICszMTEsOCBAQAogCiAJczNjX2ZiX3NldF9wbGF0ZGF0YSgmc21ka3YyMTBfbGNkMF9wZGF0YSk7CiAKKwlzYW1zdW5nX2JsX3NldCgmc21ka3YyMTBfYmxfZ3Bpb19pbmZvLCAmc21ka3YyMTBfYmxfZGF0YSk7CisKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWRrdjIxMF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNtZGt2MjEwX2RldmljZXMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL3BtLmMgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvcG0uYwppbmRleCAyNGZlYmFlLi4zMDllMzg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvcG0uYwpAQCAtODgsNyArODgsNyBAQAogCVNBVkVfSVRFTShTM0MyNDEwX1RDTlRPKDApKSwKIH07CiAKLXZvaWQgczVwdjIxMF9jcHVfc3VzcGVuZCh2b2lkKQordm9pZCBzNXB2MjEwX2NwdV9zdXNwZW5kKHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXVuc2lnbmVkIGxvbmcgdG1wOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvc2V0dXAtZmItMjRicHAuYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9zZXR1cC1mYi0yNGJwcC5jCmluZGV4IGU5MzJlYmYuLjU1MTAzYzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9zZXR1cC1mYi0yNGJwcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9zZXR1cC1mYi0yNGJwcC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZmIuaD4KICNpbmNsdWRlIDxtYWNoL21hcC5oPgogI2luY2x1ZGUgPHBsYXQvZmIuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9zbGVlcC5TIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL3NsZWVwLlMKaW5kZXggYTNkNjQ5NC4uZTM0NTJjYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL3NsZWVwLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL3NsZWVwLlMKQEAgLTMyLDI3ICszMiw2IEBACiAKIAkudGV4dAogCi0JLyogczNjX2NwdV9zYXZlCi0JICoKLQkgKiBlbnRyeToKLQkgKglyMSA9IHY6cCBvZmZzZXQKLQkqLwotCi1FTlRSWShzM2NfY3B1X3NhdmUpCi0KLQlzdG1mZAlzcCEsIHsgcjMgLSByMTIsIGxyIH0KLQlsZHIJcjMsID1yZXN1bWVfd2l0aF9tbXUKLQlibAljcHVfc3VzcGVuZAotCi0JbGRyCXIwLCA9cG1fY3B1X3NsZWVwCi0JbGRyCXIwLCBbIHIwIF0KLQltb3YJcGMsIHIwCi0KLXJlc3VtZV93aXRoX21tdToKLQlsZG1mZAlzcCEsIHsgcjMgLSByMTIsIHBjIH0KLQotCS5sdG9yZwotCiAJLyogc2xlZXAgbWFnaWMsIHRvIGFsbG93IHRoZSBib290bG9hZGVyIHRvIGNoZWNrIGZvciBhbiB2YWxpZAogCSAqIGltYWdlIHRvIHJlc3VtZSB0by4gTXVzdCBiZSB0aGUgZmlyc3Qgd29yZCBiZWZvcmUgdGhlCiAJICogczNjX2NwdV9yZXN1bWUgZW50cnkuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9hc3NhYmV0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9hc3NhYmV0LmMKaW5kZXggNTc3ODI3NC4uMjYyNTdkZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvYXNzYWJldC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Fzc2FiZXQuYwpAQCAtNDUzLDQgKzQ1Myw3IEBACiAJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBhc3NhYmV0X2luaXQsCisjaWZkZWYgQ09ORklHX1NBMTExMQorCS5kbWFfem9uZV9zaXplCT0gU1pfMU0sCisjZW5kaWYKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2JhZGdlNC5jCmluZGV4IDRmMTlmZjguLmI0MzExYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2JhZGdlNC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2JhZGdlNC5jCkBAIC0zMDYsNCArMzA2LDcgQEAKIAkubWFwX2lvCQk9IGJhZGdlNF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAorI2lmZGVmIENPTkZJR19TQTExMTEKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzFNLAorI2VuZGlmCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGNmZjMxZWUuLjEyZDM3NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTE0LDEwICsxNCw2IEBACiAgKi8KICNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweGMwMDAwMDAwKQogCi0jaWZkZWYgQ09ORklHX1NBMTExMQotI2RlZmluZSBBUk1fRE1BX1pPTkVfU0laRQlTWl8xTQotI2VuZGlmCi0KIC8qCiAgKiBCZWNhdXNlIG9mIHRoZSB3aWRlIG1lbW9yeSBhZGRyZXNzIHNwYWNlIGJldHdlZW4gcGh5c2ljYWwgUkFNIGJhbmtzIG9uIHRoZQogICogU0ExMTAwLCBpdCdzIG11Y2ggY29udmVuaWVudCB0byB1c2UgTGludXgncyBTcGFyc2VNRU0gc3VwcG9ydCB0byBpbXBsZW1lbnQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYwppbmRleCA0OTFhYzlmLi4xNzZjMDY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jCkBAIC0zNjksNCArMzY5LDcgQEAKIAkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IGpvcm5hZGE3MjBfbWFjaF9pbml0LAorI2lmZGVmIENPTkZJR19TQTExMTEKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzFNLAorI2VuZGlmCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvcG0uYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BtLmMKaW5kZXggYzQ2NjFhYS4uYmY4NWI4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbS5jCkBAIC0yOSwxMCArMjksMTEgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogCi1leHRlcm4gdm9pZCBzYTExMDBfY3B1X3N1c3BlbmQobG9uZyk7CitleHRlcm4gaW50IHNhMTEwMF9maW5pc2hfc3VzcGVuZCh1bnNpZ25lZCBsb25nKTsKIAogI2RlZmluZSBTQVZFKHgpCQlzbGVlcF9zYXZlW1NMRUVQX1NBVkVfIyN4XSA9IHgKICNkZWZpbmUgUkVTVE9SRSh4KQl4ID0gc2xlZXBfc2F2ZVtTTEVFUF9TQVZFXyMjeF0KQEAgLTc1LDkgKzc2LDcgQEAKIAlQU1BSID0gdmlydF90b19waHlzKGNwdV9yZXN1bWUpOwogCiAJLyogZ28genp6ICovCi0Jc2ExMTAwX2NwdV9zdXNwZW5kKFBMQVRfUEhZU19PRkZTRVQgLSBQQUdFX09GRlNFVCk7Ci0KLQljcHVfaW5pdCgpOworCWNwdV9zdXNwZW5kKDAsIHNhMTEwMF9maW5pc2hfc3VzcGVuZCk7CiAKIAkvKgogCSAqIEVuc3VyZSBub3QgdG8gY29tZSBiYWNrIGhlcmUgaWYgaXQgd2Fzbid0IGludGVuZGVkCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zbGVlcC5TIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2xlZXAuUwppbmRleCAwNGYyYTYxLi5lODIyMzMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zbGVlcC5TCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NsZWVwLlMKQEAgLTIyLDE4ICsyMiwxMyBAQAogCiAJCS50ZXh0CiAvKgotICogc2ExMTAwX2NwdV9zdXNwZW5kKCkKKyAqIHNhMTEwMF9maW5pc2hfc3VzcGVuZCgpCiAgKgogICogQ2F1c2VzIHNhMTF4MCB0byBlbnRlciBzbGVlcCBzdGF0ZQogICoKICAqLwogCi1FTlRSWShzYTExMDBfY3B1X3N1c3BlbmQpCi0Jc3RtZmQJc3AhLCB7cjQgLSByMTIsIGxyfQkJQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjawotCW1vdglyMSwgcjAKLQlsZHIJcjMsID1zYTExMDBfY3B1X3Jlc3VtZQkJQCByZXR1cm4gZnVuY3Rpb24KLQlibAljcHVfc3VzcGVuZAotCitFTlRSWShzYTExMDBfZmluaXNoX3N1c3BlbmQpCiAJQCBkaXNhYmxlIGNsb2NrIHN3aXRjaGluZwogCW1jcglwMTUsIDAsIHIxLCBjMTUsIGMyLCAyCiAKQEAgLTEzOSwxMyArMTM0LDMgQEAKIAlzdHIJcjEzLCBbcjEyXQogCiAyMDoJYgkyMGIJCQlAIGxvb3Agd2FpdGluZyBmb3Igc2xlZXAKLQotLyoKLSAqIGNwdV9zYTExMDBfcmVzdW1lKCkKLSAqCi0gKiBlbnRyeSBwb2ludCBmcm9tIGJvb3Rsb2FkZXIgaW50byBrZXJuZWwgZHVyaW5nIHJlc3VtZQotICovCi0JLmFsaWduIDUKLXNhMTEwMF9jcHVfcmVzdW1lOgotCW1jcglwMTUsIDAsIHIxLCBjMTUsIGMxLCAyCQlAIGVuYWJsZSBjbG9jayBzd2l0Y2hpbmcKLQlsZG1mZAlzcCEsIHtyNCAtIHIxMiwgcGN9CQlAIHJldHVybiB0byBjYWxsZXIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKaW5kZXggNWNmN2Y5NC4uYWMyODczYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKQEAgLTE1Niw0ICsxNTYsNSBAQAogCS5tYXBfaW8JCT0gc2hhcmtfbWFwX2lvLAogCS5pbml0X2lycQk9IHNoYXJrX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2hhcmtfdGltZXIsCisJLmRtYV96b25lX3NpemUJPSBTWl80TSwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwppbmRleCBlMjg1M2MwLi4wYmI2Y2M2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKQEAgLTExLDE3ICsxMSwxNyBAQAogCQkuZW5kbQogCiAJCS5tYWNybyAgZ2V0X2lycW5yX3ByZWFtYmxlLCBiYXNlLCB0bXAKKwkJbW92CVxiYXNlLCAjMHhlMDAwMDAwMAogCQkuZW5kbQogCiAJCS5tYWNybyAgYXJjaF9yZXRfdG9fdXNlciwgdG1wMSwgdG1wMgogCQkuZW5kbQogCiAJCS5tYWNybwlnZXRfaXJxbnJfYW5kX2Jhc2UsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLQkJbW92CXI0LCAjMHhlMDAwMDAwMAogCiAJCW1vdglcaXJxc3RhdCwgIzB4MEMKLQkJc3RyYglcaXJxc3RhdCwgW3I0LCAjMHgyMF0JCUBvdXRiKDB4MEMsIDB4MjApIC8qIFBvbGwgY29tbWFuZCAqLwotCQlsZHJiCVxpcnFuciwgW3I0LCAjMHgyMF0JCUBpcnEgPSBpbmIoMHgyMCkgJiA3CisJCXN0cmIJXGlycXN0YXQsIFtcYmFzZSwgIzB4MjBdCUBvdXRiKDB4MEMsIDB4MjApIC8qIFBvbGwgY29tbWFuZCAqLworCQlsZHJiCVxpcnFuciwgW1xiYXNlLCAjMHgyMF0JCUBpcnEgPSBpbmIoMHgyMCkgJiA3CiAJCWFuZAlcaXJxc3RhdCwgXGlycW5yLCAjMHg4MAogCQl0ZXEJXGlycXN0YXQsICMwCiAJCWJlcQk0M2YKQEAgLTI5LDggKzI5LDggQEAKIAkJdGVxCVxpcnFuciwgIzIKIAkJYm5lCTQ0ZgogNDM6CQltb3YJXGlycXN0YXQsICMweDBDCi0JCXN0cmIJXGlycXN0YXQsIFtyNCwgIzB4YTBdCQlAb3V0YigweDBDLCAweEEwKSAvKiBQb2xsIGNvbW1hbmQgKi8KLQkJbGRyYglcaXJxbnIsIFtyNCwgIzB4YTBdCQlAaXJxID0gKGluYigweEEwKSAmIDcpICsgOAorCQlzdHJiCVxpcnFzdGF0LCBbXGJhc2UsICMweGEwXQlAb3V0YigweDBDLCAweEEwKSAvKiBQb2xsIGNvbW1hbmQgKi8KKwkJbGRyYglcaXJxbnIsIFtcYmFzZSwgIzB4YTBdCQlAaXJxID0gKGluYigweEEwKSAmIDcpICsgOAogCQlhbmQJXGlycXN0YXQsIFxpcnFuciwgIzB4ODAKIAkJdGVxCVxpcnFzdGF0LCAjMAogCQliZXEJNDRmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IDRjMDgzMWY4Li4xY2Y4ZDY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMTcsOCArMTcsNiBAQAogICovCiAjZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQgICAgIFVMKDB4MDgwMDAwMDApCiAKLSNkZWZpbmUgQVJNX0RNQV9aT05FX1NJWkUJU1pfNE0KLQogLyoKICAqIENhY2hlIGZsdXNoaW5nIGFyZWEKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hZzVldm0uYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYWc1ZXZtLmMKaW5kZXggYzk1MjU4Yy4uY2U1YzI1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hZzVldm0uYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFnNWV2bS5jCkBAIC0zODEsMTEgKzM4MSw5IEBACiAJZ3Bpb19zZXRfdmFsdWUoR1BJT19QT1JUMTE0LCBzdGF0ZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzaF9zZGhpMV9wbGF0ZGF0YSA9IHsKLQkuZG1hX3NsYXZlX3R4CT0gU0hETUFfU0xBVkVfU0RISTFfVFgsCi0JLmRtYV9zbGF2ZV9yeAk9IFNIRE1BX1NMQVZFX1NESEkxX1JYLAorc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHNoX3NkaGkxX2luZm8gPSB7CiAJLnRtaW9fZmxhZ3MJPSBUTUlPX01NQ19XUlBST1RFQ1RfRElTQUJMRSwKLQkudG1pb19jYXBzCT0gTU1DX0NBUF9OT05SRU1PVkFCTEUsCisJLnRtaW9fY2Fwcwk9IE1NQ19DQVBfTk9OUkVNT1ZBQkxFIHwgTU1DX0NBUF9TRElPX0lSUSwKIAkudG1pb19vY3JfbWFzawk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0LAogCS5zZXRfcHdyCT0gYWc1ZXZtX3NkaGkxX3NldF9wd3IsCiB9OwpAQCAtNDE1LDcgKzQxMyw3IEBACiAJLm5hbWUJCT0gInNoX21vYmlsZV9zZGhpIiwKIAkuaWQJCT0gMSwKIAkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmc2hfc2RoaTFfcGxhdGRhdGEsCisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNoX3NkaGkxX2luZm8sCiAJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2RoaTFfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBzZGhpMV9yZXNvdXJjZXMsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcDRldmIuYwppbmRleCBmNmI2ODdmLi44MzcxMzhlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXA0ZXZiLmMKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCS5yZXNvdXJjZQk9IHVzYjFfaG9zdF9yZXNvdXJjZXMsCiB9OwogCi1jb25zdCBzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBhcDRldmJfbGNkY19tb2Rlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgYXA0ZXZiX2xjZGNfbW9kZXNbXSA9IHsKIAl7CiAjaWZkZWYgQ09ORklHX0FQNEVWQl9RSEQKIAkJLm5hbWUJCT0gIlI2MzMwMihRSEQpIiwKQEAgLTkxMyw3ICs5MTMsNyBAQAogCUkyQ19CT0FSRF9JTkZPKCJpbXgwNzQiLCAweDFhKSwKIH07CiAKLXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgaW14MDc0X2xpbmsgPSB7CitzdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfbGluayBpbXgwNzRfbGluayA9IHsKIAkuYnVzX2lkCQk9IDAsCiAJLmJvYXJkX2luZm8JPSAmaW14MDc0X2luZm8sCiAJLmkyY19hZGFwdGVyX2lkCT0gMCwKQEAgLTE0MDgsOSArMTQwOCwxNCBAQAogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoYXA0ZXZiX2RldmljZXMsIEFSUkFZX1NJWkUoYXA0ZXZiX2RldmljZXMpKTsKIAorCXNoNzM3Ml9hZGRfZGV2aWNlX3RvX2RvbWFpbigmc2g3MzcyX2E0bGMsICZsY2RjMV9kZXZpY2UpOworCXNoNzM3Ml9hZGRfZGV2aWNlX3RvX2RvbWFpbigmc2g3MzcyX2E0bGMsICZsY2RjX2RldmljZSk7CisJc2g3MzcyX2FkZF9kZXZpY2VfdG9fZG9tYWluKCZzaDczNzJfYTRtcCwgJmZzaV9kZXZpY2UpOworCiAJaGRtaV9pbml0X3BtX2Nsb2NrKCk7CiAJZnNpX2luaXRfcG1fY2xvY2soKTsKIAlzaDczNzJfcG1faW5pdCgpOworCXBtX2Nsa19hZGQoJmZzaV9kZXZpY2UuZGV2LCAic3B1MiIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgYXA0ZXZiX3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYwppbmRleCA3NzZmMjA1Li41YjM2YjZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCkBAIC0xMjYsNyArMTI2LDcgQEAKICAqIC0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tCiAgKiBJUlEwICB8IElDUjFBLklSUTBTQT0wMDEwICB8IFNESEkyIGNhcmQgZGV0ZWN0ICB8IExvdwogICogSVJRNiAgfCBJQ1IxQS5JUlE2U0E9MDAxMSAgfCBFdGhlcihMQU45MjIwKSAgICAgfCBIaWdoCi0gKiBJUlE3ICB8IElDUjFBLklSUTdTQT0wMDEwICB8IExDRCBUdWNoIFBhbmVsICAgICB8IExvdworICogSVJRNyAgfCBJQ1IxQS5JUlE3U0E9MDAxMCAgfCBMQ0QgVG91Y2ggUGFuZWwgICAgfCBMb3cKICAqIElSUTggIHwgSUNSMkEuSVJROFNBPTAwMTAgIHwgTU1DL1NEIGNhcmQgZGV0ZWN0IHwgTG93CiAgKiBJUlE5ICB8IElDUjJBLklSUTlTQT0wMDEwICB8IEtFWShUQ0E2NDA4KSAgICAgICB8IExvdwogICogSVJRMjEgfCBJQ1I0QS5JUlEyMVNBPTAwMTEgfCBTZW5zb3IoQURYTDM0NSkgICAgfCBIaWdoCkBAIC0xNjUsMTAgKzE2NSwxMCBAQAogICogVVNCMSBjYW4gYmVjb21lIEhvc3QgYnkgcjhhNjY1OTcsIGFuZCBiZWNvbWUgRnVuY3Rpb24gYnkgcmVuZXNhc191c2Jocy4KICAqIEJ1dCBkb24ndCBzZWxlY3QgYm90aCBkcml2ZXJzIGluIHNhbWUgdGltZS4KICAqIFRoZXNlIHVzZXMgc2FtZSBJUlEgbnVtYmVyIGZvciByZXF1ZXN0X2lycSgpLCBhbmQgYXJlbid0IHN1cHBvcnRpbmcKLSAqIElSUUZfU0hBUkQgLyBJT1JFU09VUkNFX0lSUV9TSEFSRUFCTEUuCisgKiBJUlFGX1NIQVJFRCAvIElPUkVTT1VSQ0VfSVJRX1NIQVJFQUJMRS4KICAqCiAgKiBBY3R1YWxseSB0aGVzZSBhcmUgb2xkL25ldyB2ZXJzaW9uIG9mIFVTQiBkcml2ZXIuCi0gKiBUaGlzIG1lYW4gaXRzIHJlZ2lzdGVyIHdpbGwgYmUgYnJva2VuIGlmIGl0IHN1cHBvcnRzIFNIQVJEIElSUSwKKyAqIFRoaXMgbWVhbiBpdHMgcmVnaXN0ZXIgd2lsbCBiZSBicm9rZW4gaWYgaXQgc3VwcG9ydHMgc2hhcmVkIElSUSwKICAqLwogCiAvKgpAQCAtNTYyLDcgKzU2MiwxMjEgQEAKIAkJY2xrX3B1dChoZG1pX2ljayk7CiB9CiAKLS8qIFVTQjEgKEhvc3QpICovCisvKiBVU0JIUzAgaXMgY29ubmVjdGVkIHRvIENOMjIgd2hpY2ggdGFrZXMgYSBVU0IgTWluaS1CIHBsdWcKKyAqCisgKiBUaGUgc2g3MzcyIFNvQyBoYXMgSVJRNyBzZXQgYXNpZGUgZm9yIFVTQkhTMCBob3RwbHVnLAorICogYnV0IG9uIHRoaXMgcGFydGljdWxhciBib2FyZCBJUlE3IGlzIGFscmVhZHkgdXNlZCBieQorICogdGhlIHRvdWNoIHNjcmVlbi4gVGhpcyBsZWF2ZXMgdXMgd2l0aCBzb2Z0d2FyZSBwb2xsaW5nLgorICovCisjZGVmaW5lIFVTQkhTMF9QT0xMX0lOVEVSVkFMIChIWiAqIDUpCisKK3N0cnVjdCB1c2Joc19wcml2YXRlIHsKKwl1bnNpZ25lZCBpbnQgdXNicGh5YWRkcjsKKwl1bnNpZ25lZCBpbnQgdXNiY3JjYWRkcjsKKwlzdHJ1Y3QgcmVuZXNhc191c2Joc19wbGF0Zm9ybV9pbmZvIGluZm87CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Cit9OworCisjZGVmaW5lIHVzYmhzX2dldF9wcml2KHBkZXYpCQkJCVwKKwljb250YWluZXJfb2YocmVuZXNhc191c2Joc19nZXRfaW5mbyhwZGV2KSwJXAorCQkgICAgIHN0cnVjdCB1c2Joc19wcml2YXRlLCBpbmZvKQorCisjZGVmaW5lIHVzYmhzX2lzX2Nvbm5lY3RlZChwcml2KQkJCVwKKwkoISgoMSA8PCA3KSAmIF9fcmF3X3JlYWR3KHByaXYtPnVzYmNyY2FkZHIpKSkKKworc3RhdGljIGludCB1c2Joc19nZXRfdmJ1cyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiB1c2Joc19pc19jb25uZWN0ZWQodXNiaHNfZ2V0X3ByaXYocGRldikpOworfQorCitzdGF0aWMgdm9pZCB1c2Joc19waHlfcmVzZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdXNiaHNfcHJpdmF0ZSAqcHJpdiA9IHVzYmhzX2dldF9wcml2KHBkZXYpOworCisJLyogaW5pdCBwaHkgKi8KKwlfX3Jhd193cml0ZXcoMHg4YTBhLCBwcml2LT51c2JjcmNhZGRyKTsKK30KKworc3RhdGljIGludCB1c2JoczBfZ2V0X2lkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIFVTQkhTX0dBREdFVDsKK30KKworc3RhdGljIHZvaWQgdXNiaHMwX3dvcmtfZnVuY3Rpb24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB1c2Joc19wcml2YXRlICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2Joc19wcml2YXRlLAorCQkJCQkJICB3b3JrLndvcmspOworCisJcmVuZXNhc191c2Joc19jYWxsX25vdGlmeV9ob3RwbHVnKHByaXYtPnBkZXYpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+d29yaywgVVNCSFMwX1BPTExfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50IHVzYmhzMF9oYXJkd2FyZV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHVzYmhzX3ByaXZhdGUgKnByaXYgPSB1c2Joc19nZXRfcHJpdihwZGV2KTsKKworCXByaXYtPnBkZXYgPSBwZGV2OworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT53b3JrLCB1c2JoczBfd29ya19mdW5jdGlvbik7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT53b3JrLCBVU0JIUzBfUE9MTF9JTlRFUlZBTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmhzMF9oYXJkd2FyZV9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHVzYmhzX3ByaXZhdGUgKnByaXYgPSB1c2Joc19nZXRfcHJpdihwZGV2KTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+d29yayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiaHNfcHJpdmF0ZSB1c2JoczBfcHJpdmF0ZSA9IHsKKwkudXNiY3JjYWRkcgk9IDB4ZTYwNTgxMGMsCQkvKiBVU0JDUjIgKi8KKwkuaW5mbyA9IHsKKwkJLnBsYXRmb3JtX2NhbGxiYWNrID0geworCQkJLmhhcmR3YXJlX2luaXQJPSB1c2JoczBfaGFyZHdhcmVfaW5pdCwKKwkJCS5oYXJkd2FyZV9leGl0CT0gdXNiaHMwX2hhcmR3YXJlX2V4aXQsCisJCQkucGh5X3Jlc2V0CT0gdXNiaHNfcGh5X3Jlc2V0LAorCQkJLmdldF9pZAkJPSB1c2JoczBfZ2V0X2lkLAorCQkJLmdldF92YnVzCT0gdXNiaHNfZ2V0X3ZidXMsCisJCX0sCisJCS5kcml2ZXJfcGFyYW0gPSB7CisJCQkuYnVzd2FpdF9id2FpdAk9IDQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiaHMwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVVNCSFMwIiwKKwkJLnN0YXJ0CT0gMHhlNjg5MDAwMCwKKwkJLmVuZAk9IDB4ZTY4OTAwZTYgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gZXZ0MmlycSgweDFjYTApIC8qIFVTQjBfVVNCMEkwICovLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdXNiaHMwX2RldmljZSA9IHsKKwkubmFtZQk9ICJyZW5lc2FzX3VzYmhzIiwKKwkuaWQJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZ1c2JoczBfcHJpdmF0ZS5pbmZvLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHVzYmhzMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHVzYmhzMF9yZXNvdXJjZXMsCit9OworCisvKiBVU0JIUzEgaXMgY29ubmVjdGVkIHRvIENOMzEgd2hpY2ggdGFrZXMgYSBVU0IgTWluaS1BQiBwbHVnCisgKgorICogVXNlIEozMCB0byBzZWxlY3QgYmV0d2VlbiBIb3N0IGFuZCBGdW5jdGlvbi4gVGhpcyBzZXR0aW5nCisgKiBjYW4gaG93ZXZlciBub3QgYmUgZGV0ZWN0ZWQgYnkgc29mdHdhcmUuIEhvdHBsdWcgb2YgVVNCSFMxCisgKiBpcyBwcm92aWRlZCB2aWEgSVJROC4KKyAqLworI2RlZmluZSBJUlE4IGV2dDJpcnEoMHgwMzAwKQorCisvKiBVU0JIUzEgVVNCIEhvc3Qgc3VwcG9ydCB2aWEgcjhhNjY1OTdfaGNkICovCiBzdGF0aWMgdm9pZCB1c2IxX2hvc3RfcG9ydF9wb3dlcihpbnQgcG9ydCwgaW50IHBvd2VyKQogewogCWlmICghcG93ZXIpIC8qIG9ubHkgcG93ZXItb24gaXMgc3VwcG9ydGVkIGZvciBub3cgKi8KQEAgLTU3OSw5ICs2OTMsOSBAQAogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYjFfaG9zdF9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5uYW1lCT0gIlVTQkhTIiwKLQkJLnN0YXJ0CT0gMHhFNjhCMDAwMCwKLQkJLmVuZAk9IDB4RTY4QjAwRTYgLSAxLAorCQkubmFtZQk9ICJVU0JIUzEiLAorCQkuc3RhcnQJPSAweGU2OGIwMDAwLAorCQkuZW5kCT0gMHhlNjhiMDBlNiAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtNjAyLDM3ICs3MTYsMTQgQEAKIAkucmVzb3VyY2UJPSB1c2IxX2hvc3RfcmVzb3VyY2VzLAogfTsKIAotLyogVVNCMSAoRnVuY3Rpb24pICovCisvKiBVU0JIUzEgVVNCIEZ1bmN0aW9uIHN1cHBvcnQgdmlhIHJlbmVzYXNfdXNiaHMgKi8KKwogI2RlZmluZSBVU0JfUEhZX01PREUJCSgxIDw8IDQpCiAjZGVmaW5lIFVTQl9QSFlfSU5UX0VOCQkoKDEgPDwgMykgfCAoMSA8PCAyKSkKICNkZWZpbmUgVVNCX1BIWV9PTgkJKDEgPDwgMSkKICNkZWZpbmUgVVNCX1BIWV9PRkYJCSgxIDw8IDApCiAjZGVmaW5lIFVTQl9QSFlfSU5UX0NMUgkJKFVTQl9QSFlfT04gfCBVU0JfUEhZX09GRikKIAotc3RydWN0IHVzYmhzX3ByaXZhdGUgewotCXVuc2lnbmVkIGludCBpcnE7Ci0JdW5zaWduZWQgaW50IHVzYnBoeWFkZHI7Ci0JdW5zaWduZWQgaW50IHVzYmNyY2FkZHI7Ci0Jc3RydWN0IHJlbmVzYXNfdXNiaHNfcGxhdGZvcm1faW5mbyBpbmZvOwotfTsKLQotI2RlZmluZSB1c2Joc19nZXRfcHJpdihwZGV2KQkJCQlcCi0JY29udGFpbmVyX29mKHJlbmVzYXNfdXNiaHNfZ2V0X2luZm8ocGRldiksCVwKLQkJICAgICBzdHJ1Y3QgdXNiaHNfcHJpdmF0ZSwgaW5mbykKLQotI2RlZmluZSB1c2Joc19pc19jb25uZWN0ZWQocHJpdikJCQlcCi0JKCEoKDEgPDwgNykgJiBfX3Jhd19yZWFkdyhwcml2LT51c2JjcmNhZGRyKSkpCi0KLXN0YXRpYyBpbnQgdXNiaHMxX2dldF9pZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBVU0JIU19HQURHRVQ7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiaHMxX2dldF92YnVzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIHVzYmhzX2lzX2Nvbm5lY3RlZCh1c2Joc19nZXRfcHJpdihwZGV2KSk7Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCB1c2JoczFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGRhdGE7CkBAIC02NTQsMTIgKzc0NSwxMCBAQAogCXN0cnVjdCB1c2Joc19wcml2YXRlICpwcml2ID0gdXNiaHNfZ2V0X3ByaXYocGRldik7CiAJaW50IHJldDsKIAotCWlycV9zZXRfaXJxX3R5cGUocHJpdi0+aXJxLCBJUlFfVFlQRV9MRVZFTF9ISUdIKTsKLQogCS8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KIAlfX3Jhd193cml0ZXcoVVNCX1BIWV9NT0RFIHwgVVNCX1BIWV9JTlRfQ0xSLCBwcml2LT51c2JwaHlhZGRyKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKHByaXYtPmlycSwgdXNiaHMxX2ludGVycnVwdCwgMCwKKwlyZXQgPSByZXF1ZXN0X2lycShJUlE4LCB1c2JoczFfaW50ZXJydXB0LCBJUlFGX1RSSUdHRVJfSElHSCwKIAkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIHBkZXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZXJyXG4iKTsKQEAgLTY3OSwxNSArNzY4LDEyIEBACiAJLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwogCV9fcmF3X3dyaXRldyhVU0JfUEhZX01PREUgfCBVU0JfUEhZX0lOVF9DTFIsIHByaXYtPnVzYnBoeWFkZHIpOwogCi0JZnJlZV9pcnEocHJpdi0+aXJxLCBwZGV2KTsKKwlmcmVlX2lycShJUlE4LCBwZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgdXNiaHMxX3BoeV9yZXNldChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCB1c2JoczFfZ2V0X2lkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHVzYmhzX3ByaXZhdGUgKnByaXYgPSB1c2Joc19nZXRfcHJpdihwZGV2KTsKLQotCS8qIGluaXQgcGh5ICovCi0JX19yYXdfd3JpdGV3KDB4OGEwYSwgcHJpdi0+dXNiY3JjYWRkcik7CisJcmV0dXJuIFVTQkhTX0dBREdFVDsKIH0KIAogc3RhdGljIHUzMiB1c2JoczFfcGlwZV9jZmdbXSA9IHsKQEAgLTcxMCwxNiArNzk2LDE1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHVzYmhzX3ByaXZhdGUgdXNiaHMxX3ByaXZhdGUgPSB7Ci0JLmlycQkJPSBldnQyaXJxKDB4MDMwMCksCS8qIElSUTggKi8KLQkudXNicGh5YWRkcgk9IDB4RTYwNTgxRTIsCQkvKiBVU0JQSFkxSU5UQVAgKi8KLQkudXNiY3JjYWRkcgk9IDB4RTYwNTgxMzAsCQkvKiBVU0JDUjQgKi8KKwkudXNicGh5YWRkcgk9IDB4ZTYwNTgxZTIsCQkvKiBVU0JQSFkxSU5UQVAgKi8KKwkudXNiY3JjYWRkcgk9IDB4ZTYwNTgxMzAsCQkvKiBVU0JDUjQgKi8KIAkuaW5mbyA9IHsKIAkJLnBsYXRmb3JtX2NhbGxiYWNrID0gewogCQkJLmhhcmR3YXJlX2luaXQJPSB1c2JoczFfaGFyZHdhcmVfaW5pdCwKIAkJCS5oYXJkd2FyZV9leGl0CT0gdXNiaHMxX2hhcmR3YXJlX2V4aXQsCi0JCQkucGh5X3Jlc2V0CT0gdXNiaHMxX3BoeV9yZXNldCwKIAkJCS5nZXRfaWQJCT0gdXNiaHMxX2dldF9pZCwKLQkJCS5nZXRfdmJ1cwk9IHVzYmhzMV9nZXRfdmJ1cywKKwkJCS5waHlfcmVzZXQJPSB1c2Joc19waHlfcmVzZXQsCisJCQkuZ2V0X3ZidXMJPSB1c2Joc19nZXRfdmJ1cywKIAkJfSwKIAkJLmRyaXZlcl9wYXJhbSA9IHsKIAkJCS5idXN3YWl0X2J3YWl0CT0gNCwKQEAgLTczMSw5ICs4MTYsOSBAQAogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYmhzMV9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5uYW1lCT0gIlVTQkhTIiwKLQkJLnN0YXJ0CT0gMHhFNjhCMDAwMCwKLQkJLmVuZAk9IDB4RTY4QjAwRTYgLSAxLAorCQkubmFtZQk9ICJVU0JIUzEiLAorCQkuc3RhcnQJPSAweGU2OGIwMDAwLAorCQkuZW5kCT0gMHhlNjhiMDBlNiAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtNzUyLDcgKzgzNyw2IEBACiAJLnJlc291cmNlCT0gdXNiaHMxX3Jlc291cmNlcywKIH07CiAKLQogLyogTEVEICovCiBzdGF0aWMgc3RydWN0IGdwaW9fbGVkIG1hY2tlcmVsX2xlZHNbXSA9IHsKIAl7CkBAIC0xMjA1LDYgKzEyODksNyBAQAogCSZsY2RjX2RldmljZSwKIAkmdXNiMV9ob3N0X2RldmljZSwKIAkmdXNiaHMxX2RldmljZSwKKwkmdXNiaHMwX2RldmljZSwKIAkmbGVkc19kZXZpY2UsCiAJJmZzaV9kZXZpY2UsCiAJJmZzaV9hazQ2NDNfZGV2aWNlLApAQCAtMTMwMSw2ICsxMzg2LDcgQEAKIAogI2RlZmluZSBHUElPX1BPUlQ5Q1IJMHhFNjA1MTAwOQogI2RlZmluZSBHUElPX1BPUlQxMENSCTB4RTYwNTEwMEEKKyNkZWZpbmUgR1BJT19QT1JUMTY3Q1IJMHhFNjA1MjBBNwogI2RlZmluZSBHUElPX1BPUlQxNjhDUgkweEU2MDUyMEE4CiAjZGVmaW5lIFNSQ1I0CQkweGU2MTU4MGJjCiAjZGVmaW5lIFVTQ0NSMQkJMHhFNjA1ODE0NApAQCAtMTM1NCwxNyArMTQ0MCwxNyBAQAogCWdwaW9fcmVxdWVzdChHUElPX1BPUlQxNTEsIE5VTEwpOyAvKiBMQ0RET04gKi8KIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QT1JUMTUxLCAxKTsKIAotCS8qIFVTQiBlbmFibGUgKi8KLQlncGlvX3JlcXVlc3QoR1BJT19GTl9WQlVTMF8xLCAgICBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9JRElOXzFfMTgsICBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9QV0VOXzFfMTE1LCBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9PVkNOXzFfMTE0LCBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9FWFRMUF8xLCAgICBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9PVkNOMl8xLCAgICBOVUxMKTsKLQlncGlvX3B1bGxfZG93bihHUElPX1BPUlQxNjhDUik7CisJLyogVVNCSFMwICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVkJVUzBfMCwgTlVMTCk7CisJZ3Bpb19wdWxsX2Rvd24oR1BJT19QT1JUMTY4Q1IpOyAvKiBWQlVTMF8wIHB1bGwgZG93biAqLwogCi0JLyogc2V0dXAgVVNCIHBoeSAqLwotCV9fcmF3X3dyaXRldygweDhhMGEsIDB4RTYwNTgxMzApOwkvKiBVU0JDUjQgKi8KKwkvKiBVU0JIUzEgKi8KKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WQlVTMF8xLCBOVUxMKTsKKwlncGlvX3B1bGxfZG93bihHUElPX1BPUlQxNjdDUik7IC8qIFZCVVMwXzEgcHVsbCBkb3duICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fSURJTl8xXzExMywgTlVMTCk7CisKKwkvKiBVU0IgcGh5IHR3ZWFrIHRvIG1ha2UgdGhlIHI4YTY2NTk3X2hjZCBob3N0IGRyaXZlciB3b3JrICovCisJX19yYXdfd3JpdGV3KDB4OGEwYSwgMHhlNjA1ODEzMCk7ICAgICAgIC8qIFVTQkNSNCAqLwogCiAJLyogZW5hYmxlIEZTSTIgcG9ydCBBIChhazQ2NDMpICovCiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRlNJQUlCVCwJTlVMTCk7CkBAIC0xNDk2LDggKzE1ODIsMTMgQEAKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG1hY2tlcmVsX2RldmljZXMsIEFSUkFZX1NJWkUobWFja2VyZWxfZGV2aWNlcykpOwogCisJc2g3MzcyX2FkZF9kZXZpY2VfdG9fZG9tYWluKCZzaDczNzJfYTRsYywgJmxjZGNfZGV2aWNlKTsKKwlzaDczNzJfYWRkX2RldmljZV90b19kb21haW4oJnNoNzM3Ml9hNGxjLCAmaGRtaV9sY2RjX2RldmljZSk7CisJc2g3MzcyX2FkZF9kZXZpY2VfdG9fZG9tYWluKCZzaDczNzJfYTRtcCwgJmZzaV9kZXZpY2UpOworCiAJaGRtaV9pbml0X3BtX2Nsb2NrKCk7CiAJc2g3MzcyX3BtX2luaXQoKTsKKwlwbV9jbGtfYWRkKCZmc2lfZGV2aWNlLmRldiwgInNwdTIiKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG1hY2tlcmVsX3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzcyLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Mi5jCmluZGV4IGMwODAwZDguLjkxZjU3NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzcyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzIuYwpAQCAtNjYyLDYgKzY2Miw3IEBACiAJQ0xLREVWX0lDS19JRCgiaWNrIiwgInNoLW1vYmlsZS1oZG1pIiwgJmRpdjZfcmVwYXJlbnRfY2xrc1tESVY2X0hETUldKSwKIAlDTEtERVZfSUNLX0lEKCJpY2thIiwgInNoX2ZzaTIiLCAmZGl2Nl9yZXBhcmVudF9jbGtzW0RJVjZfRlNJQV0pLAogCUNMS0RFVl9JQ0tfSUQoImlja2IiLCAic2hfZnNpMiIsICZkaXY2X3JlcGFyZW50X2Nsa3NbRElWNl9GU0lCXSksCisJQ0xLREVWX0lDS19JRCgic3B1MiIsICJzaF9mc2kyIiwgJm1zdHBfY2xrc1tNU1RQMjIzXSksCiB9OwogCiB2b2lkIF9faW5pdCBzaDczNzJfY2xvY2tfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvc2RoaS1zaDczNzIuaCBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL3NkaGktc2g3MzcyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4MWIwMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL3NkaGktc2g3MzcyLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBTREhJX1NINzM3Ml9ICisjZGVmaW5lIFNESElfU0g3MzcyX0gKKworI2RlZmluZSBTREdFTkNOVEEgICAgICAgMHhmZTQwMDA5YworCisvKiBUaGUgY291bnRkb3duIG9mIFNER0VOQ05UQSBpcyBjb250cm9sbGVkIGJ5CisgKiBaQjNEMkNMSyB3aGljaCBydW5zIGF0IDE0OS41TUh6LgorICogVGhhdCBpcyAxNDkuNXRpY2tzL3VzLiBBcHByb3hpbWF0ZSB0aGlzIGFzIDE1MHRpY2tzL3VzLgorICovCitzdGF0aWMgdm9pZCB1ZGVsYXkoaW50IHVzKQoreworCV9fcmF3X3dyaXRlbCh1cyAqIDE1MCwgU0RHRU5DTlRBKTsKKwl3aGlsZShfX3Jhd19yZWFkbChTREdFTkNOVEEpKSA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbGVlcChpbnQgbXMpCit7CisJdWRlbGF5KG1zICogMTAwMCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvc2RoaS5oIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvc2RoaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzllNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9zZGhpLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBTREhJX0gKKyNkZWZpbmUgU0RISV9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCQlDUFUgc3BlY2lmaWMgc2V0dGluZ3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBDT05GSUdfQVJDSF9TSDczNzIKKyNpbmNsdWRlICJtYWNoL3NkaGktc2g3MzcyLmgiCisjZWxzZQorI2Vycm9yICJ1bnN1cHBvcnRlZCBDUFUuIgorI2VuZGlmCisKKyNlbmRpZiAvKiBTREhJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL3NoNzM3Mi5oIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvc2g3MzcyLmgKaW5kZXggZGYyMGQ3Ni4uY2U1OTVjZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvc2g3MzcyLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvc2g3MzcyLmgKQEAgLTEyLDYgKzEyLDcgQEAKICNkZWZpbmUgX19BU01fU0g3MzcyX0hfXwogCiAjaW5jbHVkZSA8bGludXgvc2hfY2xrLmg+CisjaW5jbHVkZSA8bGludXgvcG1fZG9tYWluLmg+CiAKIC8qCiAgKiBQaW4gRnVuY3Rpb24gQ29udHJvbGxlcjoKQEAgLTQ3MCw0ICs0NzEsMzIgQEAKIGV4dGVybiBzdHJ1Y3QgY2xrIHNoNzM3Ml9mc2lkaXZhX2NsazsKIGV4dGVybiBzdHJ1Y3QgY2xrIHNoNzM3Ml9mc2lkaXZiX2NsazsKIAorc3RydWN0IHBsYXRmb3JtX2RldmljZTsKKworc3RydWN0IHNoNzM3Ml9wbV9kb21haW4geworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiBnZW5wZDsKKwl1bnNpZ25lZCBpbnQgYml0X3NoaWZ0OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2g3MzcyX3BtX2RvbWFpbiAqdG9fc2g3MzcyX3BkKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGQsIHN0cnVjdCBzaDczNzJfcG1fZG9tYWluLCBnZW5wZCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK2V4dGVybiBzdHJ1Y3Qgc2g3MzcyX3BtX2RvbWFpbiBzaDczNzJfYTRsYzsKK2V4dGVybiBzdHJ1Y3Qgc2g3MzcyX3BtX2RvbWFpbiBzaDczNzJfYTRtcDsKK2V4dGVybiBzdHJ1Y3Qgc2g3MzcyX3BtX2RvbWFpbiBzaDczNzJfZDQ7CitleHRlcm4gc3RydWN0IHNoNzM3Ml9wbV9kb21haW4gc2g3MzcyX2EzcnY7CitleHRlcm4gc3RydWN0IHNoNzM3Ml9wbV9kb21haW4gc2g3MzcyX2Ezcmk7CitleHRlcm4gc3RydWN0IHNoNzM3Ml9wbV9kb21haW4gc2g3MzcyX2Ezc2c7CisKK2V4dGVybiB2b2lkIHNoNzM3Ml9pbml0X3BtX2RvbWFpbihzdHJ1Y3Qgc2g3MzcyX3BtX2RvbWFpbiAqc2g3MzcyX3BkKTsKK2V4dGVybiB2b2lkIHNoNzM3Ml9hZGRfZGV2aWNlX3RvX2RvbWFpbihzdHJ1Y3Qgc2g3MzcyX3BtX2RvbWFpbiAqc2g3MzcyX3BkLAorCQkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKyNlbHNlCisjZGVmaW5lIHNoNzM3Ml9pbml0X3BtX2RvbWFpbihwZCkgZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIHNoNzM3Ml9hZGRfZGV2aWNlX3RvX2RvbWFpbihwZCwgcGRldikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKICNlbmRpZiAvKiBfX0FTTV9TSDczNzJfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3M2EwLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3M2EwLmMKaW5kZXggNWQwZTE1MC4uYTkxMWE2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzNhMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczYTAuYwpAQCAtMjUwLDYgKzI1MCwxMSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGludCBzaDczYTBfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgb24pCit7CisJcmV0dXJuIDA7IC8qIGFsd2F5cyBhbGxvdyB3YWtldXAgKi8KK30KKwogdm9pZCBfX2luaXQgc2g3M2EwX2luaXRfaXJxKHZvaWQpCiB7CiAJdm9pZCBfX2lvbWVtICpnaWNfZGlzdF9iYXNlID0gX19pbygweGYwMDAxMDAwKTsKQEAgLTI1Nyw2ICsyNjIsNyBAQAogCXZvaWQgX19pb21lbSAqaW50ZXZ0c2EgPSBpb3JlbWFwX25vY2FjaGUoMHhmZmQyMDEwMCwgUEFHRV9TSVpFKTsKIAogCWdpY19pbml0KDAsIDI5LCBnaWNfZGlzdF9iYXNlLCBnaWNfY3B1X2Jhc2UpOworCWdpY19hcmNoX2V4dG4uaXJxX3NldF93YWtlID0gc2g3M2EwX3NldF93YWtlOwogCiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjc19kZXNjKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BsYXRzbXAuYwppbmRleCBmMzg4OGZlLi42NmY5ODA2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BsYXRzbXAuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BsYXRzbXAuYwpAQCAtNjQsMTAgKzY0LDUgQEAKIAogdm9pZCBfX2luaXQgcGxhdGZvcm1fc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWF4X2NwdXM7IGkrKykKLQkJc2V0X2NwdV9wcmVzZW50KGksIHRydWUpOwotCiAJc2htb2JpbGVfc21wX3ByZXBhcmVfY3B1cygpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbS1zaDczNzIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcG0tc2g3MzcyLmMKaW5kZXggOGU0YWFkZi4uOTMzZmI0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbS1zaDczNzIuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BtLXNoNzM3Mi5jCkBAIC0xNSwxNiArMTUsMTc2IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL3NoNzM3Mi5oPgogCiAjZGVmaW5lIFNNRlJBTSAweGU2YTcwMDAwCiAjZGVmaW5lIFNZU1RCQ1IgMHhlNjE1MDAyNAogI2RlZmluZSBTQkFSIDB4ZTYxODAwMjAKICNkZWZpbmUgQVBBUk1CQVJFQSAweGU2ZjEwMDIwCiAKKyNkZWZpbmUgU1BEQ1IgMHhlNjE4MDAwOAorI2RlZmluZSBTV1VDUiAweGU2MTgwMDE0CisjZGVmaW5lIFBTVFIgMHhlNjE4MDA4MAorCisjZGVmaW5lIFBTVFJfUkVUUklFUyAxMDAKKyNkZWZpbmUgUFNUUl9ERUxBWV9VUyAxMAorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgcGRfcG93ZXJfZG93bihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQoreworCXN0cnVjdCBzaDczNzJfcG1fZG9tYWluICpzaDczNzJfcGQgPSB0b19zaDczNzJfcGQoZ2VucGQpOworCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCBzaDczNzJfcGQtPmJpdF9zaGlmdDsKKworCWlmIChfX3Jhd19yZWFkbChQU1RSKSAmIG1hc2spIHsKKwkJdW5zaWduZWQgaW50IHJldHJ5X2NvdW50OworCisJCV9fcmF3X3dyaXRlbChtYXNrLCBTUERDUik7CisKKwkJZm9yIChyZXRyeV9jb3VudCA9IFBTVFJfUkVUUklFUzsgcmV0cnlfY291bnQ7IHJldHJ5X2NvdW50LS0pIHsKKwkJCWlmICghKF9fcmF3X3JlYWRsKFNQRENSKSAmIG1hc2spKQorCQkJCWJyZWFrOworCQkJY3B1X3JlbGF4KCk7CisJCX0KKwl9CisKKwlwcl9kZWJ1Zygic2g3MzcyIHBvd2VyIGRvbWFpbiBkb3duIDB4JTA4eCAtPiBQU1RSID0gMHglMDh4XG4iLAorCQkgbWFzaywgX19yYXdfcmVhZGwoUFNUUikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGRfcG93ZXJfdXAoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3sKKwlzdHJ1Y3Qgc2g3MzcyX3BtX2RvbWFpbiAqc2g3MzcyX3BkID0gdG9fc2g3MzcyX3BkKGdlbnBkKTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgc2g3MzcyX3BkLT5iaXRfc2hpZnQ7CisJdW5zaWduZWQgaW50IHJldHJ5X2NvdW50OworCWludCByZXQgPSAwOworCisJaWYgKF9fcmF3X3JlYWRsKFBTVFIpICYgbWFzaykKKwkJZ290byBvdXQ7CisKKwlfX3Jhd193cml0ZWwobWFzaywgU1dVQ1IpOworCisJZm9yIChyZXRyeV9jb3VudCA9IDIgKiBQU1RSX1JFVFJJRVM7IHJldHJ5X2NvdW50OyByZXRyeV9jb3VudC0tKSB7CisJCWlmICghKF9fcmF3X3JlYWRsKFNXVUNSKSAmIG1hc2spKQorCQkJZ290byBvdXQ7CisJCWlmIChyZXRyeV9jb3VudCA+IFBTVFJfUkVUUklFUykKKwkJCXVkZWxheShQU1RSX0RFTEFZX1VTKTsKKwkJZWxzZQorCQkJY3B1X3JlbGF4KCk7CisJfQorCWlmIChfX3Jhd19yZWFkbChTV1VDUikgJiBtYXNrKQorCQlyZXQgPSAtRUlPOworCisgb3V0OgorCXByX2RlYnVnKCJzaDczNzIgcG93ZXIgZG9tYWluIHVwIDB4JTA4eCAtPiBQU1RSID0gMHglMDh4XG4iLAorCQkgbWFzaywgX19yYXdfcmVhZGwoUFNUUikpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwZF9wb3dlcl91cF9hM3J2KHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJaW50IHJldCA9IHBkX3Bvd2VyX3VwKGdlbnBkKTsKKworCS8qIGZvcmNlIEE0TEMgb24gYWZ0ZXIgQTNSViBoYXMgYmVlbiByZXF1ZXN0ZWQgb24gKi8KKwlwbV9nZW5wZF9wb3dlcm9uKCZzaDczNzJfYTRsYy5nZW5wZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBkX3Bvd2VyX2Rvd25fYTNydihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQoreworCWludCByZXQgPSBwZF9wb3dlcl9kb3duKGdlbnBkKTsKKworCS8qIHRyeSB0byBwb3dlciBkb3duIEE0TEMgYWZ0ZXIgQTNSViBpcyByZXF1ZXN0ZWQgb2ZmICovCisJZ2VucGRfcXVldWVfcG93ZXJfb2ZmX3dvcmsoJnNoNzM3Ml9hNGxjLmdlbnBkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGRfcG93ZXJfZG93bl9hNGxjKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJLyogb25seSBwb3dlciBkb3duIEE0TEMgaWYgQTNSViBpcyBvZmYgKi8KKwlpZiAoIShfX3Jhd19yZWFkbChQU1RSKSAmICgxIDw8IHNoNzM3Ml9hM3J2LmJpdF9zaGlmdCkpKQorCQlyZXR1cm4gcGRfcG93ZXJfZG93bihnZW5wZCk7CisKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgYm9vbCBwZF9hY3RpdmVfd2FrZXVwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBzaDczNzJfaW5pdF9wbV9kb21haW4oc3RydWN0IHNoNzM3Ml9wbV9kb21haW4gKnNoNzM3Ml9wZCkKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkID0gJnNoNzM3Ml9wZC0+Z2VucGQ7CisKKwlwbV9nZW5wZF9pbml0KGdlbnBkLCBOVUxMLCBmYWxzZSk7CisJZ2VucGQtPnN0b3BfZGV2aWNlID0gcG1fY2xrX3N1c3BlbmQ7CisJZ2VucGQtPnN0YXJ0X2RldmljZSA9IHBtX2Nsa19yZXN1bWU7CisJZ2VucGQtPmFjdGl2ZV93YWtldXAgPSBwZF9hY3RpdmVfd2FrZXVwOworCisJaWYgKHNoNzM3Ml9wZCA9PSAmc2g3MzcyX2E0bGMpIHsKKwkJZ2VucGQtPnBvd2VyX29mZiA9IHBkX3Bvd2VyX2Rvd25fYTRsYzsKKwkJZ2VucGQtPnBvd2VyX29uID0gcGRfcG93ZXJfdXA7CisJfSBlbHNlIGlmIChzaDczNzJfcGQgPT0gJnNoNzM3Ml9hM3J2KSB7CisJCWdlbnBkLT5wb3dlcl9vZmYgPSBwZF9wb3dlcl9kb3duX2EzcnY7CisJCWdlbnBkLT5wb3dlcl9vbiA9IHBkX3Bvd2VyX3VwX2EzcnY7CisJfSBlbHNlIHsKKwkJZ2VucGQtPnBvd2VyX29mZiA9IHBkX3Bvd2VyX2Rvd247CisJCWdlbnBkLT5wb3dlcl9vbiA9IHBkX3Bvd2VyX3VwOworCX0KKwlnZW5wZC0+cG93ZXJfb24oJnNoNzM3Ml9wZC0+Z2VucGQpOworfQorCit2b2lkIHNoNzM3Ml9hZGRfZGV2aWNlX3RvX2RvbWFpbihzdHJ1Y3Qgc2g3MzcyX3BtX2RvbWFpbiAqc2g3MzcyX3BkLAorCQkJCSBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisKKwlpZiAoIWRldi0+cG93ZXIuc3Vic3lzX2RhdGEpIHsKKwkJcG1fY2xrX2luaXQoZGV2KTsKKwkJcG1fY2xrX2FkZChkZXYsIE5VTEwpOworCX0KKwlwbV9nZW5wZF9hZGRfZGV2aWNlKCZzaDczNzJfcGQtPmdlbnBkLCBkZXYpOworfQorCitzdHJ1Y3Qgc2g3MzcyX3BtX2RvbWFpbiBzaDczNzJfYTRsYyA9IHsKKwkuYml0X3NoaWZ0ID0gMSwKK307CisKK3N0cnVjdCBzaDczNzJfcG1fZG9tYWluIHNoNzM3Ml9hNG1wID0geworCS5iaXRfc2hpZnQgPSAyLAorfTsKKworc3RydWN0IHNoNzM3Ml9wbV9kb21haW4gc2g3MzcyX2Q0ID0geworCS5iaXRfc2hpZnQgPSAzLAorfTsKKworc3RydWN0IHNoNzM3Ml9wbV9kb21haW4gc2g3MzcyX2EzcnYgPSB7CisJLmJpdF9zaGlmdCA9IDYsCit9OworCitzdHJ1Y3Qgc2g3MzcyX3BtX2RvbWFpbiBzaDczNzJfYTNyaSA9IHsKKwkuYml0X3NoaWZ0ID0gOCwKK307CisKK3N0cnVjdCBzaDczNzJfcG1fZG9tYWluIHNoNzM3Ml9hM3NnID0geworCS5iaXRfc2hpZnQgPSAxMywKK307CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKwogc3RhdGljIHZvaWQgc2g3MzcyX2VudGVyX2NvcmVfc3RhbmRieSh2b2lkKQogewogCXZvaWQgX19pb21lbSAqc21mcmFtID0gKHZvaWQgX19pb21lbSAqKVNNRlJBTTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcG1fcnVudGltZS5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbV9ydW50aW1lLmMKaW5kZXggMmQxYjY3YS4uNmVjNDU0ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbV9ydW50aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbV9ydW50aW1lLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9kb21haW4uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9zaF9jbGsuaD4KQEAgLTI4LDMxICsyOSwzOCBAQAogCXJldHVybiBwbV9ydW50aW1lX3N1c3BlbmQoZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZfcG93ZXJfZG9tYWluIGRlZmF1bHRfcG93ZXJfZG9tYWluID0geworc3RhdGljIHN0cnVjdCBkZXZfcG1fZG9tYWluIGRlZmF1bHRfcG1fZG9tYWluID0gewogCS5vcHMgPSB7Ci0JCS5ydW50aW1lX3N1c3BlbmQgPSBwbV9ydW50aW1lX2Nsa19zdXNwZW5kLAotCQkucnVudGltZV9yZXN1bWUgPSBwbV9ydW50aW1lX2Nsa19yZXN1bWUsCisJCS5ydW50aW1lX3N1c3BlbmQgPSBwbV9jbGtfc3VzcGVuZCwKKwkJLnJ1bnRpbWVfcmVzdW1lID0gcG1fY2xrX3Jlc3VtZSwKIAkJLnJ1bnRpbWVfaWRsZSA9IGRlZmF1bHRfcGxhdGZvcm1fcnVudGltZV9pZGxlLAogCQlVU0VfUExBVEZPUk1fUE1fU0xFRVBfT1BTCiAJfSwKIH07CiAKLSNkZWZpbmUgREVGQVVMVF9QV1JfRE9NQUlOX1BUUgkoJmRlZmF1bHRfcG93ZXJfZG9tYWluKQorI2RlZmluZSBERUZBVUxUX1BNX0RPTUFJTl9QVFIJKCZkZWZhdWx0X3BtX2RvbWFpbikKIAogI2Vsc2UKIAotI2RlZmluZSBERUZBVUxUX1BXUl9ET01BSU5fUFRSCU5VTEwKKyNkZWZpbmUgREVGQVVMVF9QTV9ET01BSU5fUFRSCU5VTEwKIAogI2VuZGlmIC8qIENPTkZJR19QTV9SVU5USU1FICovCiAKIHN0YXRpYyBzdHJ1Y3QgcG1fY2xrX25vdGlmaWVyX2Jsb2NrIHBsYXRmb3JtX2J1c19ub3RpZmllciA9IHsKLQkucHdyX2RvbWFpbiA9IERFRkFVTFRfUFdSX0RPTUFJTl9QVFIsCisJLnBtX2RvbWFpbiA9IERFRkFVTFRfUE1fRE9NQUlOX1BUUiwKIAkuY29uX2lkcyA9IHsgTlVMTCwgfSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNoX3BtX3J1bnRpbWVfaW5pdCh2b2lkKQogewotCXBtX3J1bnRpbWVfY2xrX2FkZF9ub3RpZmllcigmcGxhdGZvcm1fYnVzX3R5cGUsICZwbGF0Zm9ybV9idXNfbm90aWZpZXIpOworCXBtX2Nsa19hZGRfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmcGxhdGZvcm1fYnVzX25vdGlmaWVyKTsKIAlyZXR1cm4gMDsKIH0KIGNvcmVfaW5pdGNhbGwoc2hfcG1fcnVudGltZV9pbml0KTsKKworc3RhdGljIGludCBfX2luaXQgc2hfcG1fcnVudGltZV9sYXRlX2luaXQodm9pZCkKK3sKKwlwbV9nZW5wZF9wb3dlcm9mZl91bnVzZWQoKTsKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoc2hfcG1fcnVudGltZV9sYXRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1zaDczNjcuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3MzY3LmMKaW5kZXggMmMxMDE5MC4uZTU0NjAxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1zaDczNjcuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NldHVwLXNoNzM2Ny5jCkBAIC0zOCw3ICszOCw3IEBACiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAotCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGMwMCksIGV2dDJpcnEoMHhjMDApLAogCQkJICAgIGV2dDJpcnEoMHhjMDApLCBldnQyaXJxKDB4YzAwKSB9LAogfTsKQEAgLTU3LDcgKzU3LDcgQEAKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCi0JLnR5cGUJCT0gUE9SVF9TQ0lGLAorCS50eXBlCQk9IFBPUlRfU0NJRkEsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4YzIwKSwgZXZ0MmlycSgweGMyMCksCiAJCQkgICAgZXZ0MmlycSgweGMyMCksIGV2dDJpcnEoMHhjMjApIH0sCiB9OwpAQCAtNzYsNyArNzYsNyBAQAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKLQkudHlwZQkJPSBQT1JUX1NDSUYsCisJLnR5cGUJCT0gUE9SVF9TQ0lGQSwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhjNDApLCBldnQyaXJxKDB4YzQwKSwKIAkJCSAgICBldnQyaXJxKDB4YzQwKSwgZXZ0MmlycSgweGM0MCkgfSwKIH07CkBAIC05NSw3ICs5NSw3IEBACiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAotCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGM2MCksIGV2dDJpcnEoMHhjNjApLAogCQkJICAgIGV2dDJpcnEoMHhjNjApLCBldnQyaXJxKDB4YzYwKSB9LAogfTsKQEAgLTExNCw3ICsxMTQsNyBAQAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKLQkudHlwZQkJPSBQT1JUX1NDSUYsCisJLnR5cGUJCT0gUE9SVF9TQ0lGQSwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhkMjApLCBldnQyaXJxKDB4ZDIwKSwKIAkJCSAgICBldnQyaXJxKDB4ZDIwKSwgZXZ0MmlycSgweGQyMCkgfSwKIH07CkBAIC0xMzMsNyArMTMzLDcgQEAKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCi0JLnR5cGUJCT0gUE9SVF9TQ0lGLAorCS50eXBlCQk9IFBPUlRfU0NJRkEsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4ZDQwKSwgZXZ0MmlycSgweGQ0MCksCiAJCQkgICAgZXZ0MmlycSgweGQ0MCksIGV2dDJpcnEoMHhkNDApIH0sCiB9OwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAotCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkudHlwZQkJPSBQT1JUX1NDSUZCLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGQ2MCksIGV2dDJpcnEoMHhkNjApLAogCQkJICAgIGV2dDJpcnEoMHhkNjApLCBldnQyaXJxKDB4ZDYwKSB9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3MzcyLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NldHVwLXNoNzM3Mi5jCmluZGV4IGNkODA3ZWUuLjc5ZjA0MTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3MzcyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1zaDczNzIuYwpAQCAtODQxLDExICs4NDEsMjIgQEAKIAogdm9pZCBfX2luaXQgc2g3MzcyX2FkZF9zdGFuZGFyZF9kZXZpY2VzKHZvaWQpCiB7CisJc2g3MzcyX2luaXRfcG1fZG9tYWluKCZzaDczNzJfYTRsYyk7CisJc2g3MzcyX2luaXRfcG1fZG9tYWluKCZzaDczNzJfYTRtcCk7CisJc2g3MzcyX2luaXRfcG1fZG9tYWluKCZzaDczNzJfZDQpOworCXNoNzM3Ml9pbml0X3BtX2RvbWFpbigmc2g3MzcyX2EzcnYpOworCXNoNzM3Ml9pbml0X3BtX2RvbWFpbigmc2g3MzcyX2EzcmkpOworCXNoNzM3Ml9pbml0X3BtX2RvbWFpbigmc2g3MzcyX2Ezc2cpOworCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3MzcyX2Vhcmx5X2RldmljZXMsCiAJCQkgICAgQVJSQVlfU0laRShzaDczNzJfZWFybHlfZGV2aWNlcykpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3MzcyX2xhdGVfZGV2aWNlcywKIAkJCSAgICBBUlJBWV9TSVpFKHNoNzM3Ml9sYXRlX2RldmljZXMpKTsKKworCXNoNzM3Ml9hZGRfZGV2aWNlX3RvX2RvbWFpbigmc2g3MzcyX2EzcnYsICZ2cHVfZGV2aWNlKTsKKwlzaDczNzJfYWRkX2RldmljZV90b19kb21haW4oJnNoNzM3Ml9hNG1wLCAmc3B1MF9kZXZpY2UpOworCXNoNzM3Ml9hZGRfZGV2aWNlX3RvX2RvbWFpbigmc2g3MzcyX2E0bXAsICZzcHUxX2RldmljZSk7CiB9CiAKIHZvaWQgX19pbml0IHNoNzM3Ml9hZGRfZWFybHlfZGV2aWNlcyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUKaW5kZXggODIzYzcwMy4uZWQ1OGVmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlCkBAIC00LDcgKzQsNiBAQAogb2JqLXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IGlycS5vCiBvYmoteSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gY2xvY2subwogb2JqLXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IHRpbWVyLm8KLW9iai15ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSBncGlvLm8KIG9iai15ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSBwaW5tdXgubwogb2JqLXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IHBvd2VyZ2F0ZS5vCiBvYmoteQkJCQkJKz0gZnVzZS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXNlYWJvYXJkLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXNlYWJvYXJkLmMKaW5kZXggYThkN2FjZS4uMTBmYmJkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1zZWFib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtc2VhYm9hcmQuYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCAmaXNsMjkwMThfZGV2aWNlLCAxKTsKIAotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDQsICZhZHQ3NDYxX2RldmljZSwgMSk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMywgJmFkdDc0NjFfZGV2aWNlLCAxKTsKIAogCXRlZ3JhX2kyY19kZXZpY2UxLmRldi5wbGF0Zm9ybV9kYXRhID0gJnNlYWJvYXJkX2kyYzFfcGxhdGZvcm1fZGF0YTsKIAl0ZWdyYV9pMmNfZGV2aWNlMi5kZXYucGxhdGZvcm1fZGF0YSA9ICZzZWFib2FyZF9pMmMyX3BsYXRmb3JtX2RhdGE7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXRyaW1zbGljZS1waW5tdXguYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLXBpbm11eC5jCmluZGV4IDEzNTM0ZmEuLmQ5ZGM1ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLXBpbm11eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLXBpbm11eC5jCkBAIC0zNSw3ICszNSw3IEBACiAJe1RFR1JBX1BJTkdST1VQX0NTVVMsICBURUdSQV9NVVhfVklfU0VOU09SX0NMSywgVEVHUkFfUFVQRF9QVUxMX0RPV04sICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKIAl7VEVHUkFfUElOR1JPVVBfREFQMSwgIFRFR1JBX01VWF9EQVAxLCAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgICBURUdSQV9UUklfTk9STUFMfSwKIAl7VEVHUkFfUElOR1JPVVBfREFQMiwgIFRFR1JBX01VWF9EQVAyLCAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgICBURUdSQV9UUklfVFJJU1RBVEV9LAotCXtURUdSQV9QSU5HUk9VUF9EQVAzLCAgVEVHUkFfTVVYX0RBUDMsICAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICAgIFRFR1JBX1RSSV9OT1JNQUx9LAorCXtURUdSQV9QSU5HUk9VUF9EQVAzLCAgVEVHUkFfTVVYX0RBUDMsICAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICAgIFRFR1JBX1RSSV9UUklTVEFURX0sCiAJe1RFR1JBX1BJTkdST1VQX0RBUDQsICBURUdSQV9NVVhfREFQNCwgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKIAl7VEVHUkFfUElOR1JPVVBfRERDLCAgIFRFR1JBX01VWF9JMkMyLCAgICAgICAgICBURUdSQV9QVVBEX1BVTExfVVAsICAgICBURUdSQV9UUklfTk9STUFMfSwKIAl7VEVHUkFfUElOR1JPVVBfRFRBLCAgIFRFR1JBX01VWF9WSSwgICAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgICBURUdSQV9UUklfVFJJU1RBVEV9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9jbG9jay5jCmluZGV4IGUwMjgzMjAuLmY4ZDQxZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2Nsb2NrLmMKQEAgLTU4NSw3ICs1ODUsNyBAQAogCiBzdGF0aWMgaW50IGNsa19kZWJ1Z2ZzX3JlZ2lzdGVyX29uZShzdHJ1Y3QgY2xrICpjKQogewotCXN0cnVjdCBkZW50cnkgKmQsICpjaGlsZCwgKmNoaWxkX3RtcDsKKwlzdHJ1Y3QgZGVudHJ5ICpkOwogCiAJZCA9IGRlYnVnZnNfY3JlYXRlX2RpcihjLT5uYW1lLCBjbGtfZGVidWdmc19yb290KTsKIAlpZiAoIWQpCkBAIC02MTQsMTAgKzYxNCw3IEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXQ6Ci0JZCA9IGMtPmRlbnQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoaWxkLCBjaGlsZF90bXAsICZkLT5kX3N1YmRpcnMsIGRfdS5kX2NoaWxkKQotCQlkZWJ1Z2ZzX3JlbW92ZShjaGlsZCk7Ci0JZGVidWdmc19yZW1vdmUoYy0+ZGVudCk7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGMtPmRlbnQpOwogCXJldHVybiAtRU5PTUVNOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTlkNjM4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLXRlZ3JhL2dwaW8uYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBHb29nbGUsIEluYwotICoKLSAqIEF1dGhvcjoKLSAqCUVyaWsgR2lsbGluZyA8a29ua2Vyc0Bnb29nbGUuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgotCi0jaW5jbHVkZSA8bWFjaC9pb21hcC5oPgotI2luY2x1ZGUgPG1hY2gvc3VzcGVuZC5oPgotCi0jZGVmaW5lIEdQSU9fQkFOSyh4KQkJKCh4KSA+PiA1KQotI2RlZmluZSBHUElPX1BPUlQoeCkJCSgoKHgpID4+IDMpICYgMHgzKQotI2RlZmluZSBHUElPX0JJVCh4KQkJKCh4KSAmIDB4NykKLQotI2RlZmluZSBHUElPX1JFRyh4KQkJKElPX1RPX1ZJUlQoVEVHUkFfR1BJT19CQVNFKSArCVwKLQkJCQkgR1BJT19CQU5LKHgpICogMHg4MCArCQlcCi0JCQkJIEdQSU9fUE9SVCh4KSAqIDQpCi0KLSNkZWZpbmUgR1BJT19DTkYoeCkJCShHUElPX1JFRyh4KSArIDB4MDApCi0jZGVmaW5lIEdQSU9fT0UoeCkJCShHUElPX1JFRyh4KSArIDB4MTApCi0jZGVmaW5lIEdQSU9fT1VUKHgpCQkoR1BJT19SRUcoeCkgKyAwWDIwKQotI2RlZmluZSBHUElPX0lOKHgpCQkoR1BJT19SRUcoeCkgKyAweDMwKQotI2RlZmluZSBHUElPX0lOVF9TVEEoeCkJCShHUElPX1JFRyh4KSArIDB4NDApCi0jZGVmaW5lIEdQSU9fSU5UX0VOQih4KQkJKEdQSU9fUkVHKHgpICsgMHg1MCkKLSNkZWZpbmUgR1BJT19JTlRfTFZMKHgpCQkoR1BJT19SRUcoeCkgKyAweDYwKQotI2RlZmluZSBHUElPX0lOVF9DTFIoeCkJCShHUElPX1JFRyh4KSArIDB4NzApCi0KLSNkZWZpbmUgR1BJT19NU0tfQ05GKHgpCQkoR1BJT19SRUcoeCkgKyAweDgwMCkKLSNkZWZpbmUgR1BJT19NU0tfT0UoeCkJCShHUElPX1JFRyh4KSArIDB4ODEwKQotI2RlZmluZSBHUElPX01TS19PVVQoeCkJCShHUElPX1JFRyh4KSArIDBYODIwKQotI2RlZmluZSBHUElPX01TS19JTlRfU1RBKHgpCShHUElPX1JFRyh4KSArIDB4ODQwKQotI2RlZmluZSBHUElPX01TS19JTlRfRU5CKHgpCShHUElPX1JFRyh4KSArIDB4ODUwKQotI2RlZmluZSBHUElPX01TS19JTlRfTFZMKHgpCShHUElPX1JFRyh4KSArIDB4ODYwKQotCi0jZGVmaW5lIEdQSU9fSU5UX0xWTF9NQVNLCQkweDAxMDEwMQotI2RlZmluZSBHUElPX0lOVF9MVkxfRURHRV9SSVNJTkcJMHgwMDAxMDEKLSNkZWZpbmUgR1BJT19JTlRfTFZMX0VER0VfRkFMTElORwkweDAwMDEwMAotI2RlZmluZSBHUElPX0lOVF9MVkxfRURHRV9CT1RICQkweDAxMDEwMAotI2RlZmluZSBHUElPX0lOVF9MVkxfTEVWRUxfSElHSAkJMHgwMDAwMDEKLSNkZWZpbmUgR1BJT19JTlRfTFZMX0xFVkVMX0xPVwkJMHgwMDAwMDAKLQotc3RydWN0IHRlZ3JhX2dwaW9fYmFuayB7Ci0JaW50IGJhbms7Ci0JaW50IGlycTsKLQlzcGlubG9ja190IGx2bF9sb2NrWzRdOwotI2lmZGVmIENPTkZJR19QTQotCXUzMiBjbmZbNF07Ci0JdTMyIG91dFs0XTsKLQl1MzIgb2VbNF07Ci0JdTMyIGludF9lbmJbNF07Ci0JdTMyIGludF9sdmxbNF07Ci0jZW5kaWYKLX07Ci0KLQotc3RhdGljIHN0cnVjdCB0ZWdyYV9ncGlvX2JhbmsgdGVncmFfZ3Bpb19iYW5rc1tdID0gewotCXsuYmFuayA9IDAsIC5pcnEgPSBJTlRfR1BJTzF9LAotCXsuYmFuayA9IDEsIC5pcnEgPSBJTlRfR1BJTzJ9LAotCXsuYmFuayA9IDIsIC5pcnEgPSBJTlRfR1BJTzN9LAotCXsuYmFuayA9IDMsIC5pcnEgPSBJTlRfR1BJTzR9LAotCXsuYmFuayA9IDQsIC5pcnEgPSBJTlRfR1BJTzV9LAotCXsuYmFuayA9IDUsIC5pcnEgPSBJTlRfR1BJTzZ9LAotCXsuYmFuayA9IDYsIC5pcnEgPSBJTlRfR1BJTzd9LAotfTsKLQotc3RhdGljIGludCB0ZWdyYV9ncGlvX2NvbXBvc2UoaW50IGJhbmssIGludCBwb3J0LCBpbnQgYml0KQotewotCXJldHVybiAoYmFuayA8PCA1KSB8ICgocG9ydCAmIDB4MykgPDwgMykgfCAoYml0ICYgMHg3KTsKLX0KLQotc3RhdGljIHZvaWQgdGVncmFfZ3Bpb19tYXNrX3dyaXRlKHUzMiByZWcsIGludCBncGlvLCBpbnQgdmFsdWUpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IDB4MTAwIDw8IEdQSU9fQklUKGdwaW8pOwotCWlmICh2YWx1ZSkKLQkJdmFsIHw9IDEgPDwgR1BJT19CSVQoZ3Bpbyk7Ci0JX19yYXdfd3JpdGVsKHZhbCwgcmVnKTsKLX0KLQotdm9pZCB0ZWdyYV9ncGlvX2VuYWJsZShpbnQgZ3BpbykKLXsKLQl0ZWdyYV9ncGlvX21hc2tfd3JpdGUoR1BJT19NU0tfQ05GKGdwaW8pLCBncGlvLCAxKTsKLX0KLQotdm9pZCB0ZWdyYV9ncGlvX2Rpc2FibGUoaW50IGdwaW8pCi17Ci0JdGVncmFfZ3Bpb19tYXNrX3dyaXRlKEdQSU9fTVNLX0NORihncGlvKSwgZ3BpbywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRlZ3JhX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXRlZ3JhX2dwaW9fbWFza193cml0ZShHUElPX01TS19PVVQob2Zmc2V0KSwgb2Zmc2V0LCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgdGVncmFfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiAoX19yYXdfcmVhZGwoR1BJT19JTihvZmZzZXQpKSA+PiBHUElPX0JJVChvZmZzZXQpKSAmIDB4MTsKLX0KLQotc3RhdGljIGludCB0ZWdyYV9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JdGVncmFfZ3Bpb19tYXNrX3dyaXRlKEdQSU9fTVNLX09FKG9mZnNldCksIG9mZnNldCwgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGVncmFfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKLQkJCQkJaW50IHZhbHVlKQotewotCXRlZ3JhX2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOwotCXRlZ3JhX2dwaW9fbWFza193cml0ZShHUElPX01TS19PRShvZmZzZXQpLCBvZmZzZXQsIDEpOwotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVncmFfZ3Bpb19jaGlwID0gewotCS5sYWJlbAkJCT0gInRlZ3JhLWdwaW8iLAotCS5kaXJlY3Rpb25faW5wdXQJPSB0ZWdyYV9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKLQkuZ2V0CQkJPSB0ZWdyYV9ncGlvX2dldCwKLQkuZGlyZWN0aW9uX291dHB1dAk9IHRlZ3JhX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKLQkuc2V0CQkJPSB0ZWdyYV9ncGlvX3NldCwKLQkuYmFzZQkJCT0gMCwKLQkubmdwaW8JCQk9IFRFR1JBX05SX0dQSU9TLAotfTsKLQotc3RhdGljIHZvaWQgdGVncmFfZ3Bpb19pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlpbnQgZ3BpbyA9IGQtPmlycSAtIElOVF9HUElPX0JBU0U7Ci0KLQlfX3Jhd193cml0ZWwoMSA8PCBHUElPX0JJVChncGlvKSwgR1BJT19JTlRfQ0xSKGdwaW8pKTsKLX0KLQotc3RhdGljIHZvaWQgdGVncmFfZ3Bpb19pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JaW50IGdwaW8gPSBkLT5pcnEgLSBJTlRfR1BJT19CQVNFOwotCi0JdGVncmFfZ3Bpb19tYXNrX3dyaXRlKEdQSU9fTVNLX0lOVF9FTkIoZ3BpbyksIGdwaW8sIDApOwotfQotCi1zdGF0aWMgdm9pZCB0ZWdyYV9ncGlvX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotCWludCBncGlvID0gZC0+aXJxIC0gSU5UX0dQSU9fQkFTRTsKLQotCXRlZ3JhX2dwaW9fbWFza193cml0ZShHUElPX01TS19JTlRfRU5CKGdwaW8pLCBncGlvLCAxKTsKLX0KLQotc3RhdGljIGludCB0ZWdyYV9ncGlvX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQotewotCWludCBncGlvID0gZC0+aXJxIC0gSU5UX0dQSU9fQkFTRTsKLQlzdHJ1Y3QgdGVncmFfZ3Bpb19iYW5rICpiYW5rID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JaW50IHBvcnQgPSBHUElPX1BPUlQoZ3Bpbyk7Ci0JaW50IGx2bF90eXBlOwotCWludCB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXN3aXRjaCAodHlwZSAmIElSUV9UWVBFX1NFTlNFX01BU0spIHsKLQljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgotCQlsdmxfdHlwZSA9IEdQSU9fSU5UX0xWTF9FREdFX1JJU0lORzsKLQkJYnJlYWs7Ci0KLQljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKLQkJbHZsX3R5cGUgPSBHUElPX0lOVF9MVkxfRURHRV9GQUxMSU5HOwotCQlicmVhazsKLQotCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgotCQlsdmxfdHlwZSA9IEdQSU9fSU5UX0xWTF9FREdFX0JPVEg7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgotCQlsdmxfdHlwZSA9IEdQSU9fSU5UX0xWTF9MRVZFTF9ISUdIOwotCQlicmVhazsKLQotCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgotCQlsdmxfdHlwZSA9IEdQSU9fSU5UX0xWTF9MRVZFTF9MT1c7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmx2bF9sb2NrW3BvcnRdLCBmbGFncyk7Ci0KLQl2YWwgPSBfX3Jhd19yZWFkbChHUElPX0lOVF9MVkwoZ3BpbykpOwotCXZhbCAmPSB+KEdQSU9fSU5UX0xWTF9NQVNLIDw8IEdQSU9fQklUKGdwaW8pKTsKLQl2YWwgfD0gbHZsX3R5cGUgPDwgR1BJT19CSVQoZ3Bpbyk7Ci0JX19yYXdfd3JpdGVsKHZhbCwgR1BJT19JTlRfTFZMKGdwaW8pKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmx2bF9sb2NrW3BvcnRdLCBmbGFncyk7Ci0KLQlpZiAodHlwZSAmIChJUlFfVFlQRV9MRVZFTF9MT1cgfCBJUlFfVFlQRV9MRVZFTF9ISUdIKSkKLQkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX2xldmVsX2lycSk7Ci0JZWxzZSBpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX0ZBTExJTkcgfCBJUlFfVFlQRV9FREdFX1JJU0lORykpCi0JCV9faXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLT5pcnEsIGhhbmRsZV9lZGdlX2lycSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGVncmFfZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IHRlZ3JhX2dwaW9fYmFuayAqYmFuazsKLQlpbnQgcG9ydDsKLQlpbnQgcGluOwotCWludCB1bm1hc2tlZCA9IDA7Ci0Jc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7Ci0KLQljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKLQotCWJhbmsgPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOwotCi0JZm9yIChwb3J0ID0gMDsgcG9ydCA8IDQ7IHBvcnQrKykgewotCQlpbnQgZ3BpbyA9IHRlZ3JhX2dwaW9fY29tcG9zZShiYW5rLT5iYW5rLCBwb3J0LCAwKTsKLQkJdW5zaWduZWQgbG9uZyBzdGEgPSBfX3Jhd19yZWFkbChHUElPX0lOVF9TVEEoZ3BpbykpICYKLQkJCV9fcmF3X3JlYWRsKEdQSU9fSU5UX0VOQihncGlvKSk7Ci0JCXUzMiBsdmwgPSBfX3Jhd19yZWFkbChHUElPX0lOVF9MVkwoZ3BpbykpOwotCi0JCWZvcl9lYWNoX3NldF9iaXQocGluLCAmc3RhLCA4KSB7Ci0JCQlfX3Jhd193cml0ZWwoMSA8PCBwaW4sIEdQSU9fSU5UX0NMUihncGlvKSk7Ci0KLQkJCS8qIGlmIGdwaW8gaXMgZWRnZSB0cmlnZ2VyZWQsIGNsZWFyIGNvbmRpdGlvbgotCQkJICogYmVmb3JlIGV4ZWN1dGluZyB0aGUgaGFuZGVyIHNvIHRoYXQgd2UgZG9uJ3QKLQkJCSAqIG1pc3MgZWRnZXMKLQkJCSAqLwotCQkJaWYgKGx2bCAmICgweDEwMCA8PCBwaW4pKSB7Ci0JCQkJdW5tYXNrZWQgPSAxOwotCQkJCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Ci0JCQl9Ci0KLQkJCWdlbmVyaWNfaGFuZGxlX2lycShncGlvX3RvX2lycShncGlvICsgcGluKSk7Ci0JCX0KLQl9Ci0KLQlpZiAoIXVubWFza2VkKQotCQljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOwotCi19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXZvaWQgdGVncmFfZ3Bpb19yZXN1bWUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBiOwotCWludCBwOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JZm9yIChiID0gMDsgYiA8IEFSUkFZX1NJWkUodGVncmFfZ3Bpb19iYW5rcyk7IGIrKykgewotCQlzdHJ1Y3QgdGVncmFfZ3Bpb19iYW5rICpiYW5rID0gJnRlZ3JhX2dwaW9fYmFua3NbYl07Ci0KLQkJZm9yIChwID0gMDsgcCA8IEFSUkFZX1NJWkUoYmFuay0+b2UpOyBwKyspIHsKLQkJCXVuc2lnbmVkIGludCBncGlvID0gKGI8PDUpIHwgKHA8PDMpOwotCQkJX19yYXdfd3JpdGVsKGJhbmstPmNuZltwXSwgR1BJT19DTkYoZ3BpbykpOwotCQkJX19yYXdfd3JpdGVsKGJhbmstPm91dFtwXSwgR1BJT19PVVQoZ3BpbykpOwotCQkJX19yYXdfd3JpdGVsKGJhbmstPm9lW3BdLCBHUElPX09FKGdwaW8pKTsKLQkJCV9fcmF3X3dyaXRlbChiYW5rLT5pbnRfbHZsW3BdLCBHUElPX0lOVF9MVkwoZ3BpbykpOwotCQkJX19yYXdfd3JpdGVsKGJhbmstPmludF9lbmJbcF0sIEdQSU9fSU5UX0VOQihncGlvKSk7Ci0JCX0KLQl9Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXZvaWQgdGVncmFfZ3Bpb19zdXNwZW5kKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgYjsKLQlpbnQgcDsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlmb3IgKGIgPSAwOyBiIDwgQVJSQVlfU0laRSh0ZWdyYV9ncGlvX2JhbmtzKTsgYisrKSB7Ci0JCXN0cnVjdCB0ZWdyYV9ncGlvX2JhbmsgKmJhbmsgPSAmdGVncmFfZ3Bpb19iYW5rc1tiXTsKLQotCQlmb3IgKHAgPSAwOyBwIDwgQVJSQVlfU0laRShiYW5rLT5vZSk7IHArKykgewotCQkJdW5zaWduZWQgaW50IGdwaW8gPSAoYjw8NSkgfCAocDw8Myk7Ci0JCQliYW5rLT5jbmZbcF0gPSBfX3Jhd19yZWFkbChHUElPX0NORihncGlvKSk7Ci0JCQliYW5rLT5vdXRbcF0gPSBfX3Jhd19yZWFkbChHUElPX09VVChncGlvKSk7Ci0JCQliYW5rLT5vZVtwXSA9IF9fcmF3X3JlYWRsKEdQSU9fT0UoZ3BpbykpOwotCQkJYmFuay0+aW50X2VuYltwXSA9IF9fcmF3X3JlYWRsKEdQSU9fSU5UX0VOQihncGlvKSk7Ci0JCQliYW5rLT5pbnRfbHZsW3BdID0gX19yYXdfcmVhZGwoR1BJT19JTlRfTFZMKGdwaW8pKTsKLQkJfQotCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgdGVncmFfZ3Bpb193YWtlX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBlbmFibGUpCi17Ci0Jc3RydWN0IHRlZ3JhX2dwaW9fYmFuayAqYmFuayA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXJldHVybiBpcnFfc2V0X2lycV93YWtlKGJhbmstPmlycSwgZW5hYmxlKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHRlZ3JhX2dwaW9faXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIkdQSU8iLAotCS5pcnFfYWNrCT0gdGVncmFfZ3Bpb19pcnFfYWNrLAotCS5pcnFfbWFzawk9IHRlZ3JhX2dwaW9faXJxX21hc2ssCi0JLmlycV91bm1hc2sJPSB0ZWdyYV9ncGlvX2lycV91bm1hc2ssCi0JLmlycV9zZXRfdHlwZQk9IHRlZ3JhX2dwaW9faXJxX3NldF90eXBlLAotI2lmZGVmIENPTkZJR19QTQotCS5pcnFfc2V0X3dha2UJPSB0ZWdyYV9ncGlvX3dha2VfZW5hYmxlLAotI2VuZGlmCi19OwotCi0KLS8qIFRoaXMgbG9jayBjbGFzcyB0ZWxscyBsb2NrZGVwIHRoYXQgR1BJTyBpcnFzIGFyZSBpbiBhIGRpZmZlcmVudAotICogY2F0ZWdvcnkgdGhhbiB0aGVpciBwYXJlbnRzLCBzbyBpdCB3b24ndCByZXBvcnQgZmFsc2UgcmVjdXJzaW9uLgotICovCi1zdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGdwaW9fbG9ja19jbGFzczsKLQotc3RhdGljIGludCBfX2luaXQgdGVncmFfZ3Bpb19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHRlZ3JhX2dwaW9fYmFuayAqYmFuazsKLQlpbnQgaTsKLQlpbnQgajsKLQotCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewotCQkJaW50IGdwaW8gPSB0ZWdyYV9ncGlvX2NvbXBvc2UoaSwgaiwgMCk7Ci0JCQlfX3Jhd193cml0ZWwoMHgwMCwgR1BJT19JTlRfRU5CKGdwaW8pKTsKLQkJfQotCX0KLQotCWdwaW9jaGlwX2FkZCgmdGVncmFfZ3Bpb19jaGlwKTsKLQotCWZvciAoaSA9IElOVF9HUElPX0JBU0U7IGkgPCAoSU5UX0dQSU9fQkFTRSArIFRFR1JBX05SX0dQSU9TKTsgaSsrKSB7Ci0JCWJhbmsgPSAmdGVncmFfZ3Bpb19iYW5rc1tHUElPX0JBTksoaXJxX3RvX2dwaW8oaSkpXTsKLQotCQlpcnFfc2V0X2xvY2tkZXBfY2xhc3MoaSwgJmdwaW9fbG9ja19jbGFzcyk7Ci0JCWlycV9zZXRfY2hpcF9kYXRhKGksIGJhbmspOwotCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgJnRlZ3JhX2dwaW9faXJxX2NoaXAsCi0JCQkJCSBoYW5kbGVfc2ltcGxlX2lycSk7Ci0JCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVncmFfZ3Bpb19iYW5rcyk7IGkrKykgewotCQliYW5rID0gJnRlZ3JhX2dwaW9fYmFua3NbaV07Ci0KLQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoYmFuay0+aXJxLCB0ZWdyYV9ncGlvX2lycV9oYW5kbGVyKTsKLQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoYmFuay0+aXJxLCBiYW5rKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotCQkJc3Bpbl9sb2NrX2luaXQoJmJhbmstPmx2bF9sb2NrW2pdKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotcG9zdGNvcmVfaW5pdGNhbGwodGVncmFfZ3Bpb19pbml0KTsKLQotdm9pZCBfX2luaXQgdGVncmFfZ3Bpb19jb25maWcoc3RydWN0IHRlZ3JhX2dwaW9fdGFibGUgKnRhYmxlLCBpbnQgbnVtKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCWludCBncGlvID0gdGFibGVbaV0uZ3BpbzsKLQotCQlpZiAodGFibGVbaV0uZW5hYmxlKQotCQkJdGVncmFfZ3Bpb19lbmFibGUoZ3Bpbyk7Ci0JCWVsc2UKLQkJCXRlZ3JhX2dwaW9fZGlzYWJsZShncGlvKTsKLQl9Ci19Ci0KLSNpZmRlZglDT05GSUdfREVCVUdfRlMKLQotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCi1zdGF0aWMgaW50IGRiZ19ncGlvX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCi17Ci0JaW50IGk7Ci0JaW50IGo7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCWludCBncGlvID0gdGVncmFfZ3Bpb19jb21wb3NlKGksIGosIDApOwotCQkJc2VxX3ByaW50ZihzLAotCQkJCSIlZDolZCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDZ4XG4iLAotCQkJCWksIGosCi0JCQkJX19yYXdfcmVhZGwoR1BJT19DTkYoZ3BpbykpLAotCQkJCV9fcmF3X3JlYWRsKEdQSU9fT0UoZ3BpbykpLAotCQkJCV9fcmF3X3JlYWRsKEdQSU9fT1VUKGdwaW8pKSwKLQkJCQlfX3Jhd19yZWFkbChHUElPX0lOKGdwaW8pKSwKLQkJCQlfX3Jhd19yZWFkbChHUElPX0lOVF9TVEEoZ3BpbykpLAotCQkJCV9fcmF3X3JlYWRsKEdQSU9fSU5UX0VOQihncGlvKSksCi0JCQkJX19yYXdfcmVhZGwoR1BJT19JTlRfTFZMKGdwaW8pKSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZGJnX2dwaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGJnX2dwaW9fc2hvdywgJmlub2RlLT5pX3ByaXZhdGUpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19mb3BzID0gewotCS5vcGVuCQk9IGRiZ19ncGlvX29wZW4sCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRlZ3JhX2dwaW9fZGVidWdpbml0KHZvaWQpCi17Ci0JKHZvaWQpIGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRlZ3JhX2dwaW8iLCBTX0lSVUdPLAotCQkJCQlOVUxMLCBOVUxMLCAmZGVidWdfZm9wcyk7Ci0JcmV0dXJuIDA7Ci19Ci1sYXRlX2luaXRjYWxsKHRlZ3JhX2dwaW9fZGVidWdpbml0KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3BsYXRzbXAuYwppbmRleCBiOGFlM2M5Li4xYTU5NGRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3BsYXRzbXAuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3BsYXRzbXAuYwpAQCAtMTI5LDE0ICsxMjksNiBAQAogCiB2b2lkIF9faW5pdCBwbGF0Zm9ybV9zbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKIHsKLQlpbnQgaTsKLQotCS8qCi0JICogSW5pdGlhbGlzZSB0aGUgcHJlc2VudCBtYXAsIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2V0IG9mIENQVXMKLQkgKiBhY3R1YWxseSBwb3B1bGF0ZWQgYXQgdGhlIHByZXNlbnQgdGltZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbWF4X2NwdXM7IGkrKykKLQkJc2V0X2NwdV9wcmVzZW50KGksIHRydWUpOwogCiAJc2N1X2VuYWJsZShzY3VfYmFzZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtdTMwMC9jbG9jay5oCmluZGV4IGMzNGYzZWEuLjRmNTBjYTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9jbG9jay5oCkBAIC0zMSw3ICszMSw3IEBACiAJYm9vbCByZXNldDsKIAlfX3UxNiBjbGtfdmFsOwogCV9fczggdXNlY291bnQ7Ci0JX191MzIgcmVzX3JlZzsKKwl2b2lkIF9faW9tZW0gKiByZXNfcmVnOwogCV9fdTE2IHJlc19tYXNrOwogCiAJYm9vbCBod19jdHJsZDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLXUzMDAvY29yZS5jCmluZGV4IDUxM2Q2YWIuLjM5OWM4OWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL2NvcmUuYwpAQCAtMTc5MSw3ICsxNzkxLDcgQEAKIAkJCQkgICAgIDAgPT0gcmVzLT5zdGFydCkgewogCQkJCXJlcy0+c3RhcnQgID0gY3Vycl9zdGFydDsKIAkJCQlyZXMtPmVuZCAgICs9IGN1cnJfc3RhcnQ7Ci0JCQkJY3Vycl9zdGFydCArPSAocmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJCQkJY3Vycl9zdGFydCArPSByZXNvdXJjZV9zaXplKHJlcyk7CiAKIAkJCQlwcmludGsoS0VSTl9JTkZPICJjb3JlLmM6IE1hcHBpbmcgUkFNICIgXAogCQkJCSAgICAgICAiJSN4LSUjeCB0byBkZXZpY2UgJXM6JXNcbiIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL3UzMDAtcmVncy5oIGIvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC91MzAwLXJlZ3MuaAppbmRleCA4Yjg1ZGY0Li4wMzVmZGM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL3UzMDAtcmVncy5oCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvdTMwMC1yZWdzLmgKQEAgLTE4LDYgKzE4LDEyIEBACiAgKiB0aGUgZGVmaW5lcyBhcmUgdXNlZCBmb3Igc2V0dGluZyB1cCB0aGUgSS9PIG1lbW9yeSBtYXBwaW5nLgogICovCiAKKyNpZmRlZiBfX0FTU0VNQkxFUl9fCisjZGVmaW5lIElPTUVNKGEpIChhKQorI2Vsc2UKKyNkZWZpbmUgSU9NRU0oYSkgKHZvaWQgX19pb21lbSAqKSBhCisjZW5kaWYKKwogLyogTkFORCBGbGFzaCBDUzAgKi8KICNkZWZpbmUgVTMwMF9OQU5EX0NTMF9QSFlTX0JBU0UJCTB4ODAwMDAwMDAKIApAQCAtNDgsMTMgKzU0LDYgQEAKICNlbmRpZgogCiAvKgotICogQWxsIHRoZSBmb2xsb3dpbmcgcGVyaXBoZXJhbHMgYXJlIHNwZWNpZmllZCBhdCB0aGVpciBQSFlTSUNBTCBhZGRyZXNzLAotICogc28gaWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZW0gKGluIHRoZSBrZXJuZWwpLCB5b3UgTVVTVCB1c2UgdGhlIG1hY3JvcwotICogZGVmaW5lZCBpbiA8YXNtL2lvLmg+IHRvIG1hcCB0byB0aGUgSU9fQUREUkVTU19BSEIoKSBJT19BRERSRVNTX0ZBU1QoKQotICogZXRjLgotICovCi0KLS8qCiAgKiBBSEIgcGVyaXBoZXJhbHMKICAqLwogCkBAIC02MywxMSArNjIsMTEgQEAKIAogLyogVmVjdG9yZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgMCwgc2VydmljaW5nIDMyIGludGVycnVwdHMgKi8KICNkZWZpbmUgVTMwMF9JTlRDT04wX0JBU0UJCShVMzAwX0FIQl9QRVJfUEhZU19CQVNFKzB4MTAwMCkKLSNkZWZpbmUgVTMwMF9JTlRDT04wX1ZCQVNFCQkoVTMwMF9BSEJfUEVSX1ZJUlRfQkFTRSsweDEwMDApCisjZGVmaW5lIFUzMDBfSU5UQ09OMF9WQkFTRQkJSU9NRU0oVTMwMF9BSEJfUEVSX1ZJUlRfQkFTRSsweDEwMDApCiAKIC8qIFZlY3RvcmVkIEludGVycnVwdCBDb250cm9sbGVyIDEsIHNlcnZpY2luZyAzMiBpbnRlcnJ1cHRzICovCiAjZGVmaW5lIFUzMDBfSU5UQ09OMV9CQVNFCQkoVTMwMF9BSEJfUEVSX1BIWVNfQkFTRSsweDIwMDApCi0jZGVmaW5lIFUzMDBfSU5UQ09OMV9WQkFTRQkJKFUzMDBfQUhCX1BFUl9WSVJUX0JBU0UrMHgyMDAwKQorI2RlZmluZSBVMzAwX0lOVENPTjFfVkJBU0UJCUlPTUVNKFUzMDBfQUhCX1BFUl9WSVJUX0JBU0UrMHgyMDAwKQogCiAvKiBNZW1vcnkgU3RpY2sgUHJvIChNU1BSTykgY29udHJvbGxlciAqLwogI2RlZmluZSBVMzAwX01TUFJPX0JBU0UJCQkoVTMwMF9BSEJfUEVSX1BIWVNfQkFTRSsweDMwMDApCkBAIC0xMTUsNyArMTE0LDcgQEAKIAogLyogU1lTQ09OICovCiAjZGVmaW5lIFUzMDBfU1lTQ09OX0JBU0UJCShVMzAwX1NMT1dfUEVSX1BIWVNfQkFTRSsweDEwMDApCi0jZGVmaW5lIFUzMDBfU1lTQ09OX1ZCQVNFCQkoVTMwMF9TTE9XX1BFUl9WSVJUX0JBU0UrMHgxMDAwKQorI2RlZmluZSBVMzAwX1NZU0NPTl9WQkFTRQkJSU9NRU0oVTMwMF9TTE9XX1BFUl9WSVJUX0JBU0UrMHgxMDAwKQogCiAvKiBXYXRjaGRvZyAqLwogI2RlZmluZSBVMzAwX1dET0dfQkFTRQkJCShVMzAwX1NMT1dfUEVSX1BIWVNfQkFTRSsweDIwMDApCkBAIC0xMjUsNyArMTI0LDcgQEAKIAogLyogQVBQIHNpZGUgc3BlY2lhbCB0aW1lciAqLwogI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9CQVNFCQkoVTMwMF9TTE9XX1BFUl9QSFlTX0JBU0UrMHg0MDAwKQotI2RlZmluZSBVMzAwX1RJTUVSX0FQUF9WQkFTRQkJKFUzMDBfU0xPV19QRVJfVklSVF9CQVNFKzB4NDAwMCkKKyNkZWZpbmUgVTMwMF9USU1FUl9BUFBfVkJBU0UJCUlPTUVNKFUzMDBfU0xPV19QRVJfVklSVF9CQVNFKzB4NDAwMCkKIAogLyogS2V5cGFkICovCiAjZGVmaW5lIFUzMDBfS0VZUEFEX0JBU0UJCShVMzAwX1NMT1dfUEVSX1BIWVNfQkFTRSsweDUwMDApCkBAIC0xODEsNSArMTgwLDQgQEAKICAqIFZpcnR1YWwgYWNjZXNzb3IgbWFjcm9zIGZvciBzdGF0aWMgZGV2aWNlcwogICovCiAKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtdTMwMC90aW1lci5jCmluZGV4IDg5MWNmNDQuLjE4ZDdmYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC90aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC90aW1lci5jCkBAIC00MTEsOCArNDExLDcgQEAKIAkvKiBVc2UgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyIDIgYXMgY2xvY2sgc291cmNlICovCiAJaWYgKGNsb2Nrc291cmNlX21taW9faW5pdChVMzAwX1RJTUVSX0FQUF9WQkFTRSArIFUzMDBfVElNRVJfQVBQX0dQVDJDQywKIAkJCSJHUFQyIiwgcmF0ZSwgMzAwLCAzMiwgY2xvY2tzb3VyY2VfbW1pb19yZWFkbF91cCkpCi0JCXByaW50ayhLRVJOX0VSUiAidGltZXI6IGZhaWxlZCB0byBpbml0aWFsaXplIGNsb2NrICIKLQkJICAgICAgICJzb3VyY2UgJXNcbiIsIGNsb2Nrc291cmNlX3UzMDBfMW1oei5uYW1lKTsKKwkJcHJfZXJyKCJ0aW1lcjogZmFpbGVkIHRvIGluaXRpYWxpemUgVTMwMCBjbG9jayBzb3VyY2VcbiIpOwogCiAJY2xvY2tldmVudHNfY2FsY19tdWx0X3NoaWZ0KCZjbG9ja2V2ZW50X3UzMDBfMW1oeiwKIAkJCQkgICAgcmF0ZSwgQVBQVElNRVJfTUlOX1JBTkdFKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXBpbnMuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXBpbnMuYwppbmRleCBmZDRjZjFjLi43MGNkYmQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1waW5zLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtcGlucy5jCkBAIC0xMTAsMTAgKzExMCwxOCBAQAogCUdQSU8xNjhfS1BfTzAsCiAKIAkvKiBVQVJUICovCi0JR1BJTzBfVTBfQ1RTbgl8IFBJTl9JTlBVVF9QVUxMVVAsCi0JR1BJTzFfVTBfUlRTbgl8IFBJTl9PVVRQVVRfSElHSCwKLQlHUElPMl9VMF9SWEQJfCBQSU5fSU5QVVRfUFVMTFVQLAotCUdQSU8zX1UwX1RYRAl8IFBJTl9PVVRQVVRfSElHSCwKKwkvKiB1YXJ0LTAgcGlucyBncGlvIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlCisJICoga2VwdCBpbnRhY3QgdG8gcHJldmVudCBnbGl0Y2ggaW4gdHggbGluZQorCSAqIHdoZW4gdHR5IGRldiBpcyBvcGVuZWQuIExhdGVyIHRoZXNlIHBpbnMKKwkgKiBhcmUgY29uZmlndXJlZCB0byB1YXJ0IG1vcDUwMF9waW5zX3VhcnQwCisJICoKKwkgKiBJdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdWFydCBjb25maWd1cmF0aW9uCisJICogb25jZSB0aGUgaXNzdWUgaXMgc29sdmVkLgorCSAqLworCUdQSU8wX0dQSU8JfCBQSU5fSU5QVVRfUFVMTFVQLAorCUdQSU8xX0dQSU8JfCBQSU5fT1VUUFVUX0hJR0gsCisJR1BJTzJfR1BJTwl8IFBJTl9JTlBVVF9QVUxMVVAsCisJR1BJTzNfR1BJTwl8IFBJTl9PVVRQVVRfSElHSCwKIAogCUdQSU8yOV9VMl9SWEQJfCBQSU5fSU5QVVRfUFVMTFVQLAogCUdQSU8zMF9VMl9UWEQJfCBQSU5fT1VUUFVUX0hJR0gsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1yZWd1bGF0b3JzLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1yZWd1bGF0b3JzLmMKaW5kZXggOWVkMGY5MC4uMGYyZTUyMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtcmVndWxhdG9ycy5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXJlZ3VsYXRvcnMuYwpAQCAtNzcsNyArNzcsNyBAQAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGFiODUwMF92aW50Y29yZV9jb25zdW1lcnNbXSA9IHsKIAkvKiBTb0MgY29yZSBzdXBwbHksIG5vIGRldmljZSAqLwogCVJFR1VMQVRPUl9TVVBQTFkoInYtaW50Y29yZSIsIE5VTEwpLAotCS8qIFVTQiBUcmFuc2NpZXZlciAqLworCS8qIFVTQiBUcmFuc2NlaXZlciAqLwogCVJFR1VMQVRPUl9TVVBQTFkoInZkZHVscGl2aW8xOCIsICJhYjg1MDAtdXNiLjAiKSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC5jCmluZGV4IGJiMjZmNDAuLjJhMDhjMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuYwpAQCAtMjcsMTggKzI3LDIxIEBACiAjaW5jbHVkZSA8bGludXgvbGVkcy1scDU1MjEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAogI2luY2x1ZGUgPHBsYXQvaTJjLmg+CiAjaW5jbHVkZSA8cGxhdC9zdGVfZG1hNDAuaD4KKyNpbmNsdWRlIDxwbGF0L3BpbmNmZy5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvc2V0dXAuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAorI2luY2x1ZGUgInBpbnMtZGI4NTAwLmgiCiAjaW5jbHVkZSAic3RlLWRtYTQwLWRiODUwMC5oIgogI2luY2x1ZGUgImRldmljZXMtZGI4NTAwLmgiCiAjaW5jbHVkZSAiYm9hcmQtbW9wNTAwLmgiCkBAIC0zOTMsMTIgKzM5Niw2MyBAQAogfTsKICNlbmRpZgogCisKK3N0YXRpYyBwaW5fY2ZnX3QgbW9wNTAwX3BpbnNfdWFydDBbXSA9IHsKKwlHUElPMF9VMF9DVFNuICAgfCBQSU5fSU5QVVRfUFVMTFVQLAorCUdQSU8xX1UwX1JUU24gICB8IFBJTl9PVVRQVVRfSElHSCwKKwlHUElPMl9VMF9SWEQgICAgfCBQSU5fSU5QVVRfUFVMTFVQLAorCUdQSU8zX1UwX1RYRCAgICB8IFBJTl9PVVRQVVRfSElHSCwKK307CisKKyNkZWZpbmUgUFJDQ19LX1NPRlRSU1RfU0VUICAgICAgMHgxOAorI2RlZmluZSBQUkNDX0tfU09GVFJTVF9DTEVBUiAgICAweDFDCitzdGF0aWMgdm9pZCB1eDUwMF91YXJ0MF9yZXNldCh2b2lkKQoreworCXZvaWQgX19pb21lbSAqcHJjY19yc3Rfc2V0LCAqcHJjY19yc3RfY2xyOworCisJcHJjY19yc3Rfc2V0ID0gKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoVTg1MDBfQ0xLUlNUMV9CQVNFICsKKwkJCVBSQ0NfS19TT0ZUUlNUX1NFVCk7CisJcHJjY19yc3RfY2xyID0gKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoVTg1MDBfQ0xLUlNUMV9CQVNFICsKKwkJCVBSQ0NfS19TT0ZUUlNUX0NMRUFSKTsKKworCS8qIEFjdGl2YXRlIHNvZnQgcmVzZXQgUFJDQ19LX1NPRlRSU1RfQ0xFQVIgKi8KKwl3cml0ZWwoKHJlYWRsKHByY2NfcnN0X2NscikgfCAweDEpLCBwcmNjX3JzdF9jbHIpOworCXVkZWxheSgxKTsKKworCS8qIFJlbGVhc2Ugc29mdCByZXNldCBQUkNDX0tfU09GVFJTVF9TRVQgKi8KKwl3cml0ZWwoKHJlYWRsKHByY2NfcnN0X3NldCkgfCAweDEpLCBwcmNjX3JzdF9zZXQpOworCXVkZWxheSgxKTsKK30KKworc3RhdGljIHZvaWQgdXg1MDBfdWFydDBfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBubWtfY29uZmlnX3BpbnMobW9wNTAwX3BpbnNfdWFydDAsCisJCQlBUlJBWV9TSVpFKG1vcDUwMF9waW5zX3VhcnQwKSk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigicGwwMTE6IHVhcnQgcGluc19lbmFibGUgZmFpbGVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgdXg1MDBfdWFydDBfZXhpdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBubWtfY29uZmlnX3BpbnNfc2xlZXAobW9wNTAwX3BpbnNfdWFydDAsCisJCQlBUlJBWV9TSVpFKG1vcDUwMF9waW5zX3VhcnQwKSk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigicGwwMTE6IHVhcnQgcGluc19kaXNhYmxlIGZhaWxlZFxuIik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9wbDAxMV9kYXRhIHVhcnQwX3BsYXQgPSB7CiAjaWZkZWYgQ09ORklHX1NURV9ETUE0MAogCS5kbWFfZmlsdGVyID0gc3RlZG1hNDBfZmlsdGVyLAogCS5kbWFfcnhfcGFyYW0gPSAmdWFydDBfZG1hX2NmZ19yeCwKIAkuZG1hX3R4X3BhcmFtID0gJnVhcnQwX2RtYV9jZmdfdHgsCiAjZW5kaWYKKwkuaW5pdCA9IHV4NTAwX3VhcnQwX2luaXQsCisJLmV4aXQgPSB1eDUwMF91YXJ0MF9leGl0LAorCS5yZXNldCA9IHV4NTAwX3VhcnQwX3Jlc2V0LAogfTsKIAogc3RhdGljIHN0cnVjdCBhbWJhX3BsMDExX2RhdGEgdWFydDFfcGxhdCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtdTU1MDAuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtdTU1MDAuYwppbmRleCA0NGZkM2I1Li5lNThmMGY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLXU1NTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC11NTUwMC5jCkBAIC0xMCwxNiArMTAsOTcgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCisjaW5jbHVkZSA8cGxhdC9waW5jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L2kyYy5oPgorCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy5oPgogI2luY2x1ZGUgPG1hY2gvc2V0dXAuaD4KIAorI2luY2x1ZGUgInBpbnMtZGI1NTAwLmgiCiAjaW5jbHVkZSAiZGV2aWNlcy1kYjU1MDAuaCIKKyNpbmNsdWRlIDxsaW51eC9sZWQtbG0zNTMwLmg+CiAKKy8qCisgKiBHUElPCisgKi8KKworc3RhdGljIHBpbl9jZmdfdCB1NTUwMF9waW5zW10gPSB7CisJLyogSTJDICovCisJR1BJTzIxOF9JMkMyX1NDTCAgICAgICAgfCBQSU5fSU5QVVRfUFVMTFVQLAorCUdQSU8yMTlfSTJDMl9TREEgICAgICAgIHwgUElOX0lOUFVUX1BVTExVUCwKKworCS8qIERJU1BMQVlfRU5BQkxFICovCisJR1BJTzIyNl9HUElPICAgICAgICB8IFBJTl9PVVRQVVRfTE9XLAorCisJLyogQmFja2xpZ2h0IEVuYmFsZSAqLworCUdQSU8yMjRfR1BJTyAgICAgICAgfCBQSU5fT1VUUFVUX0hJR0gsCit9OworLyoKKyAqIEkyQworICovCisKKyNkZWZpbmUgVTU1MDBfSTJDX0NPTlRST0xMRVIoaWQsIF9zbHN1LCBfdGZ0LCBfcmZ0LCBjbGssIF9zbSkgXAorc3RhdGljIHN0cnVjdCBubWtfaTJjX2NvbnRyb2xsZXIgdTU1MDBfaTJjIyNpZCMjX2RhdGEgPSB7IFwKKwkvKgkJCQlcCisJICogc2xhdmUgZGF0YSBzZXR1cCB0aW1lLCB3aGljaCBpcwlcCisJICogMjUwIG5zLDEwMG5zLDEwbnMgd2hpY2ggaXMgMTQsNiwyCVwKKwkgKiByZXNwZWN0aXZlbHkgZm9yIGEgNDggTWh6CVwKKwkgKiBpMmMgY2xvY2sJCQlcCisJICovCQkJCVwKKwkuc2xzdQkJPSBfc2xzdSwJXAorCS8qIFR4IEZJRk8gdGhyZXNob2xkICovCQlcCisJLnRmdAkJPSBfdGZ0LAkJXAorCS8qIFJ4IEZJRk8gdGhyZXNob2xkICovCQlcCisJLnJmdAkJPSBfcmZ0LAkJXAorCS8qIHN0ZC4gbW9kZSBvcGVyYXRpb24gKi8JXAorCS5jbGtfZnJlcQk9IGNsaywJCVwKKwkuc20JCT0gX3NtLAkJXAorfQorLyoKKyAqIFRoZSBib2FyZCB1c2VzIFRPRE8gPDM+IGkyYyBjb250cm9sbGVycywgaW5pdGlhbGl6ZSBhbGwgb2YKKyAqIHRoZW0gd2l0aCBzbGF2ZSBkYXRhIHNldHVwIHRpbWUgb2YgMjUwIG5zLAorICogVHggJiBSeCBGSUZPIHRocmVzaG9sZCB2YWx1ZXMgYXMgMSBhbmQgc3RhbmRhcmQKKyAqIG1vZGUgb2Ygb3BlcmF0aW9uCisgKi8KKworVTU1MDBfSTJDX0NPTlRST0xMRVIoMiwJMHhlLCAxLCAxLCA0MDAwMDAsIEkyQ19GUkVRX01PREVfRkFTVCk7CisKK3N0YXRpYyBzdHJ1Y3QgbG0zNTMwX3BsYXRmb3JtX2RhdGEgdTU1MDBfYWxzX3BsYXRmb3JtX2RhdGEgPSB7CisJLm1vZGUgPSBMTTM1MzBfQkxfTU9ERV9NQU5VQUwsCisJLmFsc19pbnB1dF9tb2RlID0gTE0zNTMwX0lOUFVUX0FMUzEsCisJLm1heF9jdXJyZW50ID0gTE0zNTMwX0ZTX0NVUlJfMjZtQSwKKwkucHdtX3BvbF9oaSA9IHRydWUsCisJLmFsc19hdnJnX3RpbWUgPSBMTTM1MzBfQUxTX0FWUkdfVElNRV81MTJtcywKKwkuYnJ0X3JhbXBfbGF3ID0gMSwgICAgICAvKiBMaW5lYXIgKi8KKwkuYnJ0X3JhbXBfZmFsbCA9IExNMzUzMF9SQU1QX1RJTUVfOHMsCisJLmJydF9yYW1wX3Jpc2UgPSBMTTM1MzBfUkFNUF9USU1FXzhzLAorCS5hbHMxX3Jlc2lzdG9yX3NlbCA9IExNMzUzMF9BTFNfSU1QRF8xM181M2tPaG0sCisJLmFsczJfcmVzaXN0b3Jfc2VsID0gTE0zNTMwX0FMU19JTVBEX1osCisJLmFsc192bWluID0gNzMwLAkvKiBtViAqLworCS5hbHNfdm1heCA9IDEwMjAsCS8qIG1WICovCisJLmJydF92YWwgPSAweDdGLAkvKiBNYXggYnJpZ2h0bmVzcyAqLworfTsKKworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgdTU1MDBfaTJjMl9kZXZpY2VzW10gPSB7CisJeworCQkvKiBCYWNrbGlnaHQgKi8KKwkJSTJDX0JPQVJEX0lORk8oImxtMzUzMC1sZWQiLCAweDM2KSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmdTU1MDBfYWxzX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB1NTUwMF9pMmNfaW5pdCh2b2lkKQoreworCWRiNTUwMF9hZGRfaTJjMigmdTU1MDBfaTJjMl9kYXRhKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygyLCBBUlJBWV9BTkRfU0laRSh1NTUwMF9pMmMyX2RldmljZXMpKTsKK30KIHN0YXRpYyB2b2lkIF9faW5pdCB1NTUwMF91YXJ0X2luaXQodm9pZCkKIHsKIAlkYjU1MDBfYWRkX3VhcnQwKE5VTEwpOwpAQCAtMzAsNyArMTExLDggQEAKIHN0YXRpYyB2b2lkIF9faW5pdCB1NTUwMF9pbml0X21hY2hpbmUodm9pZCkKIHsKIAl1NTUwMF9pbml0X2RldmljZXMoKTsKLQorCW5ta19jb25maWdfcGlucyh1NTUwMF9waW5zLCBBUlJBWV9TSVpFKHU1NTAwX3BpbnMpKTsKKwl1NTUwMF9pMmNfaW5pdCgpOwogCXU1NTAwX3NkaV9pbml0KCk7CiAJdTU1MDBfdWFydF9pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2Nsb2NrLmMKaW5kZXggMzJjZTkwOC4uN2QxMDdiZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY2xvY2suYwpAQCAtNjM1LDE2ICs2MzUsMTMgQEAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjbGtfZGVidWdmc19yZWdpc3Rlcl9kaXIoc3RydWN0IGNsayAqYywKIAkJCQkJCXN0cnVjdCBkZW50cnkgKnBfZGVudHJ5KQogewotCXN0cnVjdCBkZW50cnkgKmQsICpjbGtfZCwgKmNoaWxkLCAqY2hpbGRfdG1wOwotCWNoYXIgc1syNTVdOwotCWNoYXIgKnAgPSBzOworCXN0cnVjdCBkZW50cnkgKmQsICpjbGtfZDsKKwljb25zdCBjaGFyICpwID0gYy0+bmFtZTsKIAotCWlmIChjLT5uYW1lID09IE5VTEwpCi0JCXAgKz0gc3ByaW50ZihwLCAiQlVHIik7Ci0JZWxzZQotCQlwICs9IHNwcmludGYocCwgIiVzIiwgYy0+bmFtZSk7CisJaWYgKCFwKQorCQlwID0gIkJVRyI7CiAKLQljbGtfZCA9IGRlYnVnZnNfY3JlYXRlX2RpcihzLCBwX2RlbnRyeSk7CisJY2xrX2QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIocCwgcF9kZW50cnkpOwogCWlmICghY2xrX2QpCiAJCXJldHVybiBOVUxMOwogCkBAIC02NjYsMjQgKzY2MywxMCBAQAogCXJldHVybiBjbGtfZDsKIAogZXJyX291dDoKLQlkID0gY2xrX2Q7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoaWxkLCBjaGlsZF90bXAsICZkLT5kX3N1YmRpcnMsIGRfdS5kX2NoaWxkKQotCQlkZWJ1Z2ZzX3JlbW92ZShjaGlsZCk7Ci0JZGVidWdmc19yZW1vdmUoY2xrX2QpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShjbGtfZCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGNsa19kZWJ1Z2ZzX3JlbW92ZV9kaXIoc3RydWN0IGRlbnRyeSAqY2RlbnRyeSkKLXsKLQlzdHJ1Y3QgZGVudHJ5ICpkLCAqY2hpbGQsICpjaGlsZF90bXA7Ci0KLQlkID0gY2RlbnRyeTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hpbGQsIGNoaWxkX3RtcCwgJmQtPmRfc3ViZGlycywgZF91LmRfY2hpbGQpCi0JCWRlYnVnZnNfcmVtb3ZlKGNoaWxkKTsKLQlkZWJ1Z2ZzX3JlbW92ZShjZGVudHJ5KTsKLQlyZXR1cm4gOwotfQotCiBzdGF0aWMgaW50IGNsa19kZWJ1Z2ZzX3JlZ2lzdGVyX29uZShzdHJ1Y3QgY2xrICpjKQogewogCXN0cnVjdCBjbGsgKnBhID0gYy0+cGFyZW50X3BlcmlwaDsKQEAgLTcwMCw3ICs2ODMsNyBAQAogCQljLT5kZW50X2J1cyA9IGNsa19kZWJ1Z2ZzX3JlZ2lzdGVyX2RpcihjLAogCQkJCWJwYS0+ZGVudF9idXMgPyBicGEtPmRlbnRfYnVzIDogYnBhLT5kZW50KTsKIAkJaWYgKCghYy0+ZGVudF9idXMpICYmICAoYy0+ZGVudCkpIHsKLQkJCWNsa19kZWJ1Z2ZzX3JlbW92ZV9kaXIoYy0+ZGVudCk7CisJCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYy0+ZGVudCk7CiAJCQljLT5kZW50ID0gTlVMTDsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiODUwMC5jCmluZGV4IGMzYzQxNzYuLjQ1OThiMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiODUwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiODUwMC5jCkBAIC0xNTksNiArMTU5LDkgQEAKIAkJLyogTm8gY3VzdG9tIGRhdGEgeWV0ICovCiAJfTsKIAorCWlmIChjcHVfaXNfdTg1MDB2MigpKQorCQlwZGF0YS5zdXBwb3J0c19zbGVlcG1vZGUgPSB0cnVlOworCiAJZGJ4NTAwX2FkZF9ncGlvcyhBUlJBWV9BTkRfU0laRShkYjg1MDBfZ3Bpb19iYXNlKSwKIAkJCSBJUlFfREI4NTAwX0dQSU8wLCAmcGRhdGEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL3BsYXRzbXAuYwppbmRleCAwYzUyN2ZlLi5hMzNkZjVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL3BsYXRzbXAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL3BsYXRzbXAuYwpAQCAtMTcyLDE0ICsxNzIsNiBAQAogCiB2b2lkIF9faW5pdCBwbGF0Zm9ybV9zbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKIHsKLQlpbnQgaTsKLQotCS8qCi0JICogSW5pdGlhbGlzZSB0aGUgcHJlc2VudCBtYXAsIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2V0IG9mIENQVXMKLQkgKiBhY3R1YWxseSBwb3B1bGF0ZWQgYXQgdGhlIHByZXNlbnQgdGltZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbWF4X2NwdXM7IGkrKykKLQkJc2V0X2NwdV9wcmVzZW50KGksIHRydWUpOwogCiAJc2N1X2VuYWJsZShzY3VfYmFzZV9hZGRyKCkpOwogCXdha2V1cF9zZWNvbmRhcnkoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvY3QtY2E5eDQuYyBiL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvY3QtY2E5eDQuYwppbmRleCA3NjVhNzFmLi5iZmQzMmY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL2N0LWNhOXg0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9jdC1jYTl4NC5jCkBAIC0yMjksMTAgKzIyOSw2IEBACiAKIHN0YXRpYyB2b2lkIGN0X2NhOXg0X3NtcF9lbmFibGUodW5zaWduZWQgaW50IG1heF9jcHVzKQogewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBtYXhfY3B1czsgaSsrKQotCQlzZXRfY3B1X3ByZXNlbnQoaSwgdHJ1ZSk7Ci0KIAlzY3VfZW5hYmxlKE1NSU9fUDJWKEE5X01QQ09SRV9TQ1UpKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy92Mm0uYyBiL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvdjJtLmMKaW5kZXggMjg1ZWRjZC4uOWU2YjkzYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy92Mm0uYworKysgYi9hcmNoL2FybS9tYWNoLXZleHByZXNzL3YybS5jCkBAIC00NiwxMiArNDYsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgdjJtX2luaXRfZWFybHkodm9pZCkKLXsKLQljdF9kZXNjLT5pbml0X2Vhcmx5KCk7Ci0JdmVyc2F0aWxlX3NjaGVkX2Nsb2NrX2luaXQoTU1JT19QMlYoVjJNX1NZU18yNE1IWiksIDI0MDAwMDAwKTsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IHYybV90aW1lcl9pbml0KHZvaWQpCiB7CiAJdTMyIHNjY3RybDsKQEAgLTM2NSw2ICszNTksMTMgQEAKIAl9LAogfTsKIAorc3RhdGljIHZvaWQgX19pbml0IHYybV9pbml0X2Vhcmx5KHZvaWQpCit7CisJY3RfZGVzYy0+aW5pdF9lYXJseSgpOworCWNsa2Rldl9hZGRfdGFibGUodjJtX2xvb2t1cHMsIEFSUkFZX1NJWkUodjJtX2xvb2t1cHMpKTsKKwl2ZXJzYXRpbGVfc2NoZWRfY2xvY2tfaW5pdChNTUlPX1AyVihWMk1fU1lTXzI0TUhaKSwgMjQwMDAwMDApOworfQorCiBzdGF0aWMgdm9pZCB2Mm1fcG93ZXJfb2ZmKHZvaWQpCiB7CiAJaWYgKHYybV9jZmdfd3JpdGUoU1lTX0NGR19TSFVURE9XTiB8IFNZU19DRkdfU0lURV9NQiwgMCkpCkBAIC00MTgsOCArNDE5LDYgQEAKIHsKIAlpbnQgaTsKIAotCWNsa2Rldl9hZGRfdGFibGUodjJtX2xvb2t1cHMsIEFSUkFZX1NJWkUodjJtX2xvb2t1cHMpKTsKLQogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdjJtX3BjaWVfaTJjX2RldmljZSk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ2Mm1fZGRjX2kyY19kZXZpY2UpOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdjJtX2ZsYXNoX2RldmljZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZ0ODUwMC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2lycS5jCmluZGV4IDI0NTE0MGMuLjY0MmRlMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2lycS5jCkBAIC0zOSw5ICszOSwxMCBAQAogc3RhdGljIHZvaWQgX19pb21lbSAqaWNfcmVnYmFzZTsKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnNpY19yZWdiYXNlOwogCi1zdGF0aWMgdm9pZCB2dDg1MDBfaXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHZ0ODUwMF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gaWNfcmVnYmFzZTsKKwl1bnNpZ25lZCBpcnEgPSBkLT5pcnE7CiAJdTggZWRnZTsKIAogCWlmIChpcnEgPj0gNjQpIHsKQEAgLTY0LDkgKzY1LDEwIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB2dDg1MDBfaXJxX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgdnQ4NTAwX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGljX3JlZ2Jhc2U7CisJdW5zaWduZWQgaXJxID0gZC0+aXJxOwogCXU4IGRjdHI7CiAKIAlpZiAoaXJxID49IDY0KSB7CkBAIC03OCwxMCArODAsMTEgQEAKIAl3cml0ZWIoZGN0ciwgYmFzZSArIFZUODUwMF9JQ19EQ1RSICsgaXJxKTsKIH0KIAotc3RhdGljIGludCB2dDg1MDBfaXJxX3NldF90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCitzdGF0aWMgaW50IHZ0ODUwMF9pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGljX3JlZ2Jhc2U7Ci0JdW5zaWduZWQgaW50IG9yaWdfaXJxID0gaXJxOworCXVuc2lnbmVkIGlycSA9IGQtPmlycTsKKwl1bnNpZ25lZCBvcmlnX2lycSA9IGlycTsKIAl1OCBkY3RyOwogCiAJaWYgKGlycSA+PSA2NCkgewpAQCAtMTE0LDExICsxMTcsMTEgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB2dDg1MDBfaXJxX2NoaXAgPSB7Ci0JLm5hbWUgICAgICA9ICJ2dDg1MDAiLAotCS5hY2sgICAgICAgPSB2dDg1MDBfaXJxX21hc2ssCi0JLm1hc2sgICAgICA9IHZ0ODUwMF9pcnFfbWFzaywKLQkudW5tYXNrICAgID0gdnQ4NTAwX2lycV91bm1hc2ssCi0JLnNldF90eXBlICA9IHZ0ODUwMF9pcnFfc2V0X3R5cGUsCisJLm5hbWUgPSAidnQ4NTAwIiwKKwkuaXJxX2FjayA9IHZ0ODUwMF9pcnFfbWFzaywKKwkuaXJxX21hc2sgPSB2dDg1MDBfaXJxX21hc2ssCisJLmlycV91bm1hc2sgPSB2dDg1MDBfaXJxX3VubWFzaywKKwkuaXJxX3NldF90eXBlID0gdnQ4NTAwX2lycV9zZXRfdHlwZSwKIH07CiAKIHZvaWQgX19pbml0IHZ0ODUwMF9pbml0X2lycSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYWJvcnQtZXY0LlMgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjQuUwppbmRleCA0ZjE4ZjllLi41NDQ3M2NkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9hYm9ydC1ldjQuUworKysgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjQuUwpAQCAtMywxNCArMywxMSBAQAogLyoKICAqIEZ1bmN0aW9uOiB2NF9lYXJseV9hYm9ydAogICoKLSAqIFBhcmFtcyAgOiByMiA9IGFkZHJlc3Mgb2YgYWJvcnRlZCBpbnN0cnVjdGlvbgotICogICAgICAgICA6IHIzID0gc2F2ZWQgU1BTUgorICogUGFyYW1zICA6IHIyID0gcHRfcmVncworICoJICAgOiByNCA9IGFib3J0ZWQgY29udGV4dCBwYworICoJICAgOiByNSA9IGFib3J0ZWQgY29udGV4dCBwc3IKICAqCi0gKiBSZXR1cm5zIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0Ci0gKgkgICA6IHIxID0gRlNSLCBiaXQgMTEgPSB3cml0ZQotICoJICAgOiByMi1yOCA9IGNvcnJ1cHRlZAotICoJICAgOiByOSA9IHByZXNlcnZlZAotICoJICAgOiBzcCA9IHBvaW50ZXIgdG8gcmVnaXN0ZXJzCisgKiBSZXR1cm5zIDogcjQgLSByMTEsIHIxMyBwcmVzZXJ2ZWQKICAqCiAgKiBQdXJwb3NlIDogb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgYWJvcnRlZCBpbnN0cnVjdGlvbi4KICAqIE5vdGU6IHdlIHJlYWQgdXNlciBzcGFjZS4gIFRoaXMgbWVhbnMgd2UgbWlnaHQgY2F1c2UgYSBkYXRhCkBAIC0yMSwxMCArMTgsOCBAQAogRU5UUlkodjRfZWFybHlfYWJvcnQpCiAJbXJjCXAxNSwgMCwgcjEsIGM1LCBjMCwgMAkJQCBnZXQgRlNSCiAJbXJjCXAxNSwgMCwgcjAsIGM2LCBjMCwgMAkJQCBnZXQgRkFSCi0JbGRyCXIzLCBbcjJdCQkJQCByZWFkIGFib3J0ZWQgQVJNIGluc3RydWN0aW9uCisJbGRyCXIzLCBbcjRdCQkJQCByZWFkIGFib3J0ZWQgQVJNIGluc3RydWN0aW9uCiAJYmljCXIxLCByMSwgIzEgPDwgMTEgfCAxIDw8IDEwCUAgY2xlYXIgYml0cyAxMSBhbmQgMTAgb2YgRlNSCiAJdHN0CXIzLCAjMSA8PCAyMAkJCUAgTCA9IDEgLT4gd3JpdGU/CiAJb3JyZXEJcjEsIHIxLCAjMSA8PCAxMQkJQCB5ZXMuCi0JbW92CXBjLCBscgotCi0KKwliCWRvX0RhdGFBYm9ydApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYWJvcnQtZXY0dC5TIGIvYXJjaC9hcm0vbW0vYWJvcnQtZXY0dC5TCmluZGV4IGI2MjgyNTQuLjlkYTcwNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2Fib3J0LWV2NHQuUworKysgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjR0LlMKQEAgLTQsMTQgKzQsMTEgQEAKIC8qCiAgKiBGdW5jdGlvbjogdjR0X2Vhcmx5X2Fib3J0CiAgKgotICogUGFyYW1zICA6IHIyID0gYWRkcmVzcyBvZiBhYm9ydGVkIGluc3RydWN0aW9uCi0gKiAgICAgICAgIDogcjMgPSBzYXZlZCBTUFNSCisgKiBQYXJhbXMgIDogcjIgPSBwdF9yZWdzCisgKgkgICA6IHI0ID0gYWJvcnRlZCBjb250ZXh0IHBjCisgKgkgICA6IHI1ID0gYWJvcnRlZCBjb250ZXh0IHBzcgogICoKLSAqIFJldHVybnMgOiByMCA9IGFkZHJlc3Mgb2YgYWJvcnQKLSAqCSAgIDogcjEgPSBGU1IsIGJpdCAxMSA9IHdyaXRlCi0gKgkgICA6IHIyLXI4ID0gY29ycnVwdGVkCi0gKgkgICA6IHI5ID0gcHJlc2VydmVkCi0gKgkgICA6IHNwID0gcG9pbnRlciB0byByZWdpc3RlcnMKKyAqIFJldHVybnMgOiByNCAtIHIxMSwgcjEzIHByZXNlcnZlZAogICoKICAqIFB1cnBvc2UgOiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBhYm9ydGVkIGluc3RydWN0aW9uLgogICogTm90ZTogd2UgcmVhZCB1c2VyIHNwYWNlLiAgVGhpcyBtZWFucyB3ZSBtaWdodCBjYXVzZSBhIGRhdGEKQEAgLTIyLDkgKzE5LDkgQEAKIEVOVFJZKHY0dF9lYXJseV9hYm9ydCkKIAltcmMJcDE1LCAwLCByMSwgYzUsIGMwLCAwCQlAIGdldCBGU1IKIAltcmMJcDE1LCAwLCByMCwgYzYsIGMwLCAwCQlAIGdldCBGQVIKLQlkb190aHVtYl9hYm9ydAotCWxkcmVxCXIzLCBbcjJdCQkJQCByZWFkIGFib3J0ZWQgQVJNIGluc3RydWN0aW9uCisJZG9fdGh1bWJfYWJvcnQgZnNyPXIxLCBwYz1yNCwgcHNyPXI1LCB0bXA9cjMKKwlsZHJlcQlyMywgW3I0XQkJCUAgcmVhZCBhYm9ydGVkIEFSTSBpbnN0cnVjdGlvbgogCWJpYwlyMSwgcjEsICMxIDw8IDExIHwgMSA8PCAxMAlAIGNsZWFyIGJpdHMgMTEgYW5kIDEwIG9mIEZTUgogCXRzdAlyMywgIzEgPDwgMjAJCQlAIGNoZWNrIHdyaXRlCiAJb3JyZXEJcjEsIHIxLCAjMSA8PCAxMQotCW1vdglwYywgbHIKKwliCWRvX0RhdGFBYm9ydApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYWJvcnQtZXY1dC5TIGIvYXJjaC9hcm0vbW0vYWJvcnQtZXY1dC5TCmluZGV4IDAyMjUxYjUuLmEwOTA4ZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2Fib3J0LWV2NXQuUworKysgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjV0LlMKQEAgLTQsMTQgKzQsMTEgQEAKIC8qCiAgKiBGdW5jdGlvbjogdjV0X2Vhcmx5X2Fib3J0CiAgKgotICogUGFyYW1zICA6IHIyID0gYWRkcmVzcyBvZiBhYm9ydGVkIGluc3RydWN0aW9uCi0gKiAgICAgICAgIDogcjMgPSBzYXZlZCBTUFNSCisgKiBQYXJhbXMgIDogcjIgPSBwdF9yZWdzCisgKgkgICA6IHI0ID0gYWJvcnRlZCBjb250ZXh0IHBjCisgKgkgICA6IHI1ID0gYWJvcnRlZCBjb250ZXh0IHBzcgogICoKLSAqIFJldHVybnMgOiByMCA9IGFkZHJlc3Mgb2YgYWJvcnQKLSAqCSAgIDogcjEgPSBGU1IsIGJpdCAxMSA9IHdyaXRlCi0gKgkgICA6IHIyLXI4ID0gY29ycnVwdGVkCi0gKgkgICA6IHI5ID0gcHJlc2VydmVkCi0gKgkgICA6IHNwID0gcG9pbnRlciB0byByZWdpc3RlcnMKKyAqIFJldHVybnMgOiByNCAtIHIxMSwgcjEzIHByZXNlcnZlZAogICoKICAqIFB1cnBvc2UgOiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBhYm9ydGVkIGluc3RydWN0aW9uLgogICogTm90ZTogd2UgcmVhZCB1c2VyIHNwYWNlLiAgVGhpcyBtZWFucyB3ZSBtaWdodCBjYXVzZSBhIGRhdGEKQEAgLTIyLDEwICsxOSwxMCBAQAogRU5UUlkodjV0X2Vhcmx5X2Fib3J0KQogCW1yYwlwMTUsIDAsIHIxLCBjNSwgYzAsIDAJCUAgZ2V0IEZTUgogCW1yYwlwMTUsIDAsIHIwLCBjNiwgYzAsIDAJCUAgZ2V0IEZBUgotCWRvX3RodW1iX2Fib3J0Ci0JbGRyZXEJcjMsIFtyMl0JCQlAIHJlYWQgYWJvcnRlZCBBUk0gaW5zdHJ1Y3Rpb24KKwlkb190aHVtYl9hYm9ydCBmc3I9cjEsIHBjPXI0LCBwc3I9cjUsIHRtcD1yMworCWxkcmVxCXIzLCBbcjRdCQkJQCByZWFkIGFib3J0ZWQgQVJNIGluc3RydWN0aW9uCiAJYmljCXIxLCByMSwgIzEgPDwgMTEJCUAgY2xlYXIgYml0cyAxMSBvZiBGU1IKLQlkb19sZHJkX2Fib3J0CisJZG9fbGRyZF9hYm9ydCB0bXA9aXAsIGluc249cjMKIAl0c3QJcjMsICMxIDw8IDIwCQkJQCBjaGVjayB3cml0ZQogCW9ycmVxCXIxLCByMSwgIzEgPDwgMTEKLQltb3YJcGMsIGxyCisJYglkb19EYXRhQWJvcnQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2Fib3J0LWV2NXRqLlMgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjV0ai5TCmluZGV4IGJjZTY4ZDYuLjQwMDZiN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2Fib3J0LWV2NXRqLlMKKysrIGIvYXJjaC9hcm0vbW0vYWJvcnQtZXY1dGouUwpAQCAtNCwxNCArNCwxMSBAQAogLyoKICAqIEZ1bmN0aW9uOiB2NXRqX2Vhcmx5X2Fib3J0CiAgKgotICogUGFyYW1zICA6IHIyID0gYWRkcmVzcyBvZiBhYm9ydGVkIGluc3RydWN0aW9uCi0gKiAgICAgICAgIDogcjMgPSBzYXZlZCBTUFNSCisgKiBQYXJhbXMgIDogcjIgPSBwdF9yZWdzCisgKgkgICA6IHI0ID0gYWJvcnRlZCBjb250ZXh0IHBjCisgKgkgICA6IHI1ID0gYWJvcnRlZCBjb250ZXh0IHBzcgogICoKLSAqIFJldHVybnMgOiByMCA9IGFkZHJlc3Mgb2YgYWJvcnQKLSAqCSAgIDogcjEgPSBGU1IsIGJpdCAxMSA9IHdyaXRlCi0gKgkgICA6IHIyLXI4ID0gY29ycnVwdGVkCi0gKgkgICA6IHI5ID0gcHJlc2VydmVkCi0gKgkgICA6IHNwID0gcG9pbnRlciB0byByZWdpc3RlcnMKKyAqIFJldHVybnMgOiByNCAtIHIxMSwgcjEzIHByZXNlcnZlZAogICoKICAqIFB1cnBvc2UgOiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBhYm9ydGVkIGluc3RydWN0aW9uLgogICogTm90ZTogd2UgcmVhZCB1c2VyIHNwYWNlLiAgVGhpcyBtZWFucyB3ZSBtaWdodCBjYXVzZSBhIGRhdGEKQEAgLTIzLDEzICsyMCwxMSBAQAogCW1yYwlwMTUsIDAsIHIxLCBjNSwgYzAsIDAJCUAgZ2V0IEZTUgogCW1yYwlwMTUsIDAsIHIwLCBjNiwgYzAsIDAJCUAgZ2V0IEZBUgogCWJpYwlyMSwgcjEsICMxIDw8IDExIHwgMSA8PCAxMAlAIGNsZWFyIGJpdHMgMTEgYW5kIDEwIG9mIEZTUgotCXRzdAlyMywgI1BTUl9KX0JJVAkJCUAgSmF2YT8KLQltb3ZuZQlwYywgbHIKLQlkb190aHVtYl9hYm9ydAotCWxkcmVxCXIzLCBbcjJdCQkJQCByZWFkIGFib3J0ZWQgQVJNIGluc3RydWN0aW9uCi0JZG9fbGRyZF9hYm9ydAorCXRzdAlyNSwgI1BTUl9KX0JJVAkJCUAgSmF2YT8KKwlibmUJZG9fRGF0YUFib3J0CisJZG9fdGh1bWJfYWJvcnQgZnNyPXIxLCBwYz1yNCwgcHNyPXI1LCB0bXA9cjMKKwlsZHJlcQlyMywgW3I0XQkJCUAgcmVhZCBhYm9ydGVkIEFSTSBpbnN0cnVjdGlvbgorCWRvX2xkcmRfYWJvcnQgdG1wPWlwLCBpbnNuPXIzCiAJdHN0CXIzLCAjMSA8PCAyMAkJCUAgTCA9IDAgLT4gd3JpdGUKIAlvcnJlcQlyMSwgcjEsICMxIDw8IDExCQlAIHllcy4KLQltb3YJcGMsIGxyCi0KLQorCWIJZG9fRGF0YUFib3J0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9hYm9ydC1ldjYuUyBiL2FyY2gvYXJtL21tL2Fib3J0LWV2Ni5TCmluZGV4IDE0NzhhYTUuLmZmMWY3Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2Fib3J0LWV2Ni5TCisrKyBiL2FyY2gvYXJtL21tL2Fib3J0LWV2Ni5TCkBAIC00LDE0ICs0LDExIEBACiAvKgogICogRnVuY3Rpb246IHY2X2Vhcmx5X2Fib3J0CiAgKgotICogUGFyYW1zICA6IHIyID0gYWRkcmVzcyBvZiBhYm9ydGVkIGluc3RydWN0aW9uCi0gKiAgICAgICAgIDogcjMgPSBzYXZlZCBTUFNSCisgKiBQYXJhbXMgIDogcjIgPSBwdF9yZWdzCisgKgkgICA6IHI0ID0gYWJvcnRlZCBjb250ZXh0IHBjCisgKgkgICA6IHI1ID0gYWJvcnRlZCBjb250ZXh0IHBzcgogICoKLSAqIFJldHVybnMgOiByMCA9IGFkZHJlc3Mgb2YgYWJvcnQKLSAqCSAgIDogcjEgPSBGU1IsIGJpdCAxMSA9IHdyaXRlCi0gKgkgICA6IHIyLXI4ID0gY29ycnVwdGVkCi0gKgkgICA6IHI5ID0gcHJlc2VydmVkCi0gKgkgICA6IHNwID0gcG9pbnRlciB0byByZWdpc3RlcnMKKyAqIFJldHVybnMgOiByNCAtIHIxMSwgcjEzIHByZXNlcnZlZAogICoKICAqIFB1cnBvc2UgOiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBhYm9ydGVkIGluc3RydWN0aW9uLgogICogTm90ZTogd2UgcmVhZCB1c2VyIHNwYWNlLiAgVGhpcyBtZWFucyB3ZSBtaWdodCBjYXVzZSBhIGRhdGEKQEAgLTMzLDE2ICszMCwxNCBAQAogICogVGhlIHRlc3QgYmVsb3cgY292ZXJzIGFsbCB0aGUgd3JpdGUgc2l0dWF0aW9ucywgaW5jbHVkaW5nIEphdmEgYnl0ZWNvZGVzCiAgKi8KIAliaWMJcjEsIHIxLCAjMSA8PCAxMQkJQCBjbGVhciBiaXQgMTEgb2YgRlNSCi0JdHN0CXIzLCAjUFNSX0pfQklUCQkJQCBKYXZhPwotCW1vdm5lCXBjLCBscgotCWRvX3RodW1iX2Fib3J0Ci0JbGRyZXEJcjMsIFtyMl0JCQlAIHJlYWQgYWJvcnRlZCBBUk0gaW5zdHJ1Y3Rpb24KKwl0c3QJcjUsICNQU1JfSl9CSVQJCQlAIEphdmE/CisJYm5lCWRvX0RhdGFBYm9ydAorCWRvX3RodW1iX2Fib3J0IGZzcj1yMSwgcGM9cjQsIHBzcj1yNSwgdG1wPXIzCisJbGRyZXEJcjMsIFtyNF0JCQlAIHJlYWQgYWJvcnRlZCBBUk0gaW5zdHJ1Y3Rpb24KICNpZmRlZiBDT05GSUdfQ1BVX0VORElBTl9CRTgKIAlyZXZlcQlyMywgcjMKICNlbmRpZgotCWRvX2xkcmRfYWJvcnQKKwlkb19sZHJkX2Fib3J0IHRtcD1pcCwgaW5zbj1yMwogCXRzdAlyMywgIzEgPDwgMjAJCQlAIEwgPSAwIC0+IHdyaXRlCiAJb3JyZXEJcjEsIHIxLCAjMSA8PCAxMQkJQCB5ZXMuCi0JbW92CXBjLCBscgotCi0KKwliCWRvX0RhdGFBYm9ydApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYWJvcnQtZXY3LlMgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjcuUwppbmRleCBlYzg4YjE1Li43MDMzNzUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9hYm9ydC1ldjcuUworKysgYi9hcmNoL2FybS9tbS9hYm9ydC1ldjcuUwpAQCAtMywxNCArMywxMSBAQAogLyoKICAqIEZ1bmN0aW9uOiB2N19lYXJseV9hYm9ydAogICoKLSAqIFBhcmFtcyAgOiByMiA9IGFkZHJlc3Mgb2YgYWJvcnRlZCBpbnN0cnVjdGlvbgotICogICAgICAgICA6IHIzID0gc2F2ZWQgU1BTUgorICogUGFyYW1zICA6IHIyID0gcHRfcmVncworICoJICAgOiByNCA9IGFib3J0ZWQgY29udGV4dCBwYworICoJICAgOiByNSA9IGFib3J0ZWQgY29udGV4dCBwc3IKICAqCi0gKiBSZXR1cm5zIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0Ci0gKgkgICA6IHIxID0gRlNSLCBiaXQgMTEgPSB3cml0ZQotICoJICAgOiByMi1yOCA9IGNvcnJ1cHRlZAotICoJICAgOiByOSA9IHByZXNlcnZlZAotICoJICAgOiBzcCA9IHBvaW50ZXIgdG8gcmVnaXN0ZXJzCisgKiBSZXR1cm5zIDogcjQgLSByMTEsIHIxMyBwcmVzZXJ2ZWQKICAqCiAgKiBQdXJwb3NlIDogb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgYWJvcnRlZCBpbnN0cnVjdGlvbi4KICAqLwpAQCAtMzcsMTggKzM0LDE4IEBACiAJbGRyCXIzLCA9MHg0MGQJCQlAIE9uIHBlcm1pc3Npb24gZmF1bHQKIAlhbmQJcjMsIHIxLCByMwogCWNtcAlyMywgIzB4MGQKLQltb3ZuZQlwYywgbHIKKwlibmUJZG9fRGF0YUFib3J0CiAKIAltY3IJcDE1LCAwLCByMCwgYzcsIGM4LCAwICAgCUAgUmV0cmFuc2xhdGUgRkFSCiAJaXNiCi0JbXJjCXAxNSwgMCwgcjIsIGM3LCBjNCwgMCAgIAlAIFJlYWQgdGhlIFBBUgotCWFuZAlyMywgcjIsICMweDdiICAgCQlAIE9uIHRyYW5zbGF0aW9uIGZhdWx0CisJbXJjCXAxNSwgMCwgaXAsIGM3LCBjNCwgMCAgIAlAIFJlYWQgdGhlIFBBUgorCWFuZAlyMywgaXAsICMweDdiICAgCQlAIE9uIHRyYW5zbGF0aW9uIGZhdWx0CiAJY21wCXIzLCAjMHgwYgotCW1vdm5lCXBjLCBscgorCWJuZQlkb19EYXRhQWJvcnQKIAliaWMJcjEsIHIxLCAjMHhmCQkJQCBGaXggdXAgRlNSIEZTWzU6MF0KLQlhbmQJcjIsIHIyLCAjMHg3ZQotCW9ycglyMSwgcjEsIHIyLCBMU1IgIzEKKwlhbmQJaXAsIGlwLCAjMHg3ZQorCW9ycglyMSwgcjEsIGlwLCBMU1IgIzEKICNlbmRpZgogCi0JbW92CXBjLCBscgorCWIJZG9fRGF0YUFib3J0CiBFTkRQUk9DKHY3X2Vhcmx5X2Fib3J0KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYWJvcnQtbHY0dC5TIGIvYXJjaC9hcm0vbW0vYWJvcnQtbHY0dC5TCmluZGV4IDlmYjdiMGUuLmYzOTgyNTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2Fib3J0LWx2NHQuUworKysgYi9hcmNoL2FybS9tbS9hYm9ydC1sdjR0LlMKQEAgLTMsMTQgKzMsMTEgQEAKIC8qCiAgKiBGdW5jdGlvbjogdjR0X2xhdGVfYWJvcnQKICAqCi0gKiBQYXJhbXMgIDogcjIgPSBhZGRyZXNzIG9mIGFib3J0ZWQgaW5zdHJ1Y3Rpb24KLSAqICAgICAgICAgOiByMyA9IHNhdmVkIFNQU1IKKyAqIFBhcmFtcyAgOiByMiA9IHB0X3JlZ3MKKyAqCSAgIDogcjQgPSBhYm9ydGVkIGNvbnRleHQgcGMKKyAqCSAgIDogcjUgPSBhYm9ydGVkIGNvbnRleHQgcHNyCiAgKgotICogUmV0dXJucyA6IHIwID0gYWRkcmVzcyBvZiBhYm9ydAotICoJICAgOiByMSA9IEZTUiwgYml0IDExID0gd3JpdGUKLSAqCSAgIDogcjItcjggPSBjb3JydXB0ZWQKLSAqCSAgIDogcjkgPSBwcmVzZXJ2ZWQKLSAqCSAgIDogc3AgPSBwb2ludGVyIHRvIHJlZ2lzdGVycworICogUmV0dXJucyA6IHI0LXI1LCByMTAtcjExLCByMTMgcHJlc2VydmVkCiAgKgogICogUHVycG9zZSA6IG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IGFib3J0ZWQgaW5zdHJ1Y3Rpb24uCiAgKiBOb3RlOiB3ZSByZWFkIHVzZXIgc3BhY2UuICBUaGlzIG1lYW5zIHdlIG1pZ2h0IGNhdXNlIGEgZGF0YQpAQCAtMTgsNyArMTUsNyBAQAogICogcGljdHVyZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgZG9lcyBoYXBwZW4uICBXZSBsaXZlIHdpdGggaXQuCiAgKi8KIEVOVFJZKHY0dF9sYXRlX2Fib3J0KQotCXRzdAlyMywgI1BTUl9UX0JJVAkJCUAgY2hlY2sgZm9yIHRodW1iIG1vZGUKKwl0c3QJcjUsICNQU1JfVF9CSVQJCQlAIGNoZWNrIGZvciB0aHVtYiBtb2RlCiAjaWZkZWYgQ09ORklHX0NQVV9DUDE1X01NVQogCW1yYwlwMTUsIDAsIHIxLCBjNSwgYzAsIDAJCUAgZ2V0IEZTUgogCW1yYwlwMTUsIDAsIHIwLCBjNiwgYzAsIDAJCUAgZ2V0IEZBUgpAQCAtMjgsNyArMjUsNyBAQAogCW1vdglyMSwgIzAKICNlbmRpZgogCWJuZQkuZGF0YV90aHVtYl9hYm9ydAotCWxkcglyOCwgW3IyXQkJCUAgcmVhZCBhcm0gaW5zdHJ1Y3Rpb24KKwlsZHIJcjgsIFtyNF0JCQlAIHJlYWQgYXJtIGluc3RydWN0aW9uCiAJdHN0CXI4LCAjMSA8PCAyMAkJCUAgTCA9IDEgLT4gd3JpdGU/CiAJb3JyZXEJcjEsIHIxLCAjMSA8PCAxMQkJQCB5ZXMuCiAJYW5kCXI3LCByOCwgIzE1IDw8IDI0CkBAIC00Nyw4NiArNDQsODQgQEAKIC8qIDkgKi8JYgkuZGF0YV9hcm1fbGRtc3RtCQlAIGxkbSpiCXJuLCA8cmxpc3Q+CiAvKiBhICovCWIJLmRhdGFfdW5rbm93bgogLyogYiAqLwliCS5kYXRhX3Vua25vd24KLS8qIGMgKi8JbW92CXBjLCBscgkJCQlAIGxkYwlyZCwgW3JuXSwgI20JQCBTYW1lIGFzIGxkcglyZCwgW3JuXSwgI20KLS8qIGQgKi8JbW92CXBjLCBscgkJCQlAIGxkYwlyZCwgW3JuLCAjbV0KKy8qIGMgKi8JYglkb19EYXRhQWJvcnQJCQlAIGxkYwlyZCwgW3JuXSwgI20JQCBTYW1lIGFzIGxkcglyZCwgW3JuXSwgI20KKy8qIGQgKi8JYglkb19EYXRhQWJvcnQJCQlAIGxkYwlyZCwgW3JuLCAjbV0KIC8qIGUgKi8JYgkuZGF0YV91bmtub3duCiAvKiBmICovCiAuZGF0YV91bmtub3duOglAIFBhcnQgb2YganVtcHRhYmxlCi0JbW92CXIwLCByMgorCW1vdglyMCwgcjQKIAltb3YJcjEsIHI4Ci0JbW92CXIyLCBzcAotCWJsCWJhZGRhdGFhYm9ydAotCWIJcmV0X2Zyb21fZXhjZXB0aW9uCisJYgliYWRkYXRhYWJvcnQKIAogLmRhdGFfYXJtX2xkbXN0bToKIAl0c3QJcjgsICMxIDw8IDIxCQkJQCBjaGVjayB3cml0ZWJhY2sgYml0Ci0JbW92ZXEJcGMsIGxyCQkJCUAgbm8gd3JpdGViYWNrIC0+IG5vIGZpeHVwCisJYmVxCWRvX0RhdGFBYm9ydAkJCUAgbm8gd3JpdGViYWNrIC0+IG5vIGZpeHVwCiAJbW92CXI3LCAjMHgxMQogCW9ycglyNywgcjcsICMweDExMDAKIAlhbmQJcjYsIHI4LCByNwotCWFuZAlyMiwgcjgsIHI3LCBsc2wgIzEKLQlhZGQJcjYsIHI2LCByMiwgbHNyICMxCi0JYW5kCXIyLCByOCwgcjcsIGxzbCAjMgotCWFkZAlyNiwgcjYsIHIyLCBsc3IgIzIKLQlhbmQJcjIsIHI4LCByNywgbHNsICMzCi0JYWRkCXI2LCByNiwgcjIsIGxzciAjMworCWFuZAlyOSwgcjgsIHI3LCBsc2wgIzEKKwlhZGQJcjYsIHI2LCByOSwgbHNyICMxCisJYW5kCXI5LCByOCwgcjcsIGxzbCAjMgorCWFkZAlyNiwgcjYsIHI5LCBsc3IgIzIKKwlhbmQJcjksIHI4LCByNywgbHNsICMzCisJYWRkCXI2LCByNiwgcjksIGxzciAjMwogCWFkZAlyNiwgcjYsIHI2LCBsc3IgIzgKIAlhZGQJcjYsIHI2LCByNiwgbHNyICM0CiAJYW5kCXI2LCByNiwgIzE1CQkJQCByNiA9IG5vLiBvZiByZWdpc3RlcnMgdG8gdHJhbnNmZXIuCi0JYW5kCXI1LCByOCwgIzE1IDw8IDE2CQlAIEV4dHJhY3QgJ24nIGZyb20gaW5zdHJ1Y3Rpb24KLQlsZHIJcjcsIFtzcCwgcjUsIGxzciAjMTRdCQlAIEdldCByZWdpc3RlciAnUm4nCisJYW5kCXI5LCByOCwgIzE1IDw8IDE2CQlAIEV4dHJhY3QgJ24nIGZyb20gaW5zdHJ1Y3Rpb24KKwlsZHIJcjcsIFtyMiwgcjksIGxzciAjMTRdCQlAIEdldCByZWdpc3RlciAnUm4nCiAJdHN0CXI4LCAjMSA8PCAyMwkJCUAgQ2hlY2sgVSBiaXQKIAlzdWJuZQlyNywgcjcsIHI2LCBsc2wgIzIJCUAgVW5kbyBpbmNyZW1lbnQKIAlhZGRlcQlyNywgcjcsIHI2LCBsc2wgIzIJCUAgVW5kbyBkZWNyZW1lbnQKLQlzdHIJcjcsIFtzcCwgcjUsIGxzciAjMTRdCQlAIFB1dCByZWdpc3RlciAnUm4nCi0JbW92CXBjLCBscgorCXN0cglyNywgW3IyLCByOSwgbHNyICMxNF0JCUAgUHV0IHJlZ2lzdGVyICdSbicKKwliCWRvX0RhdGFBYm9ydAogCiAuZGF0YV9hcm1fbGF0ZWxkcmhwcmU6CiAJdHN0CXI4LCAjMSA8PCAyMQkJCUAgQ2hlY2sgd3JpdGViYWNrIGJpdAotCW1vdmVxCXBjLCBscgkJCQlAIE5vIHdyaXRlYmFjayAtPiBubyBmaXh1cAorCWJlcQlkb19EYXRhQWJvcnQJCQlAIE5vIHdyaXRlYmFjayAtPiBubyBmaXh1cAogLmRhdGFfYXJtX2xhdGVsZHJocG9zdDoKLQlhbmQJcjUsIHI4LCAjMHgwMGYJCQlAIGdldCBSbSAvIGxvdyBuaWJibGUgb2YgaW1tZWRpYXRlIHZhbHVlCisJYW5kCXI5LCByOCwgIzB4MDBmCQkJQCBnZXQgUm0gLyBsb3cgbmliYmxlIG9mIGltbWVkaWF0ZSB2YWx1ZQogCXRzdAlyOCwgIzEgPDwgMjIJCQlAIGlmIChpbW1lZGlhdGUgb2Zmc2V0KQogCWFuZG5lCXI2LCByOCwgIzB4ZjAwCQkJQCB7IGltbWVkaWF0ZSBoaWdoIG5pYmJsZQotCW9ycm5lCXI2LCByNSwgcjYsIGxzciAjNAkJQCAgIGNvbWJpbmUgbmliYmxlcyB9IGVsc2UKLQlsZHJlcQlyNiwgW3NwLCByNSwgbHNsICMyXQkJQCB7IGxvYWQgUm0gdmFsdWUgfQorCW9ycm5lCXI2LCByOSwgcjYsIGxzciAjNAkJQCAgIGNvbWJpbmUgbmliYmxlcyB9IGVsc2UKKwlsZHJlcQlyNiwgW3IyLCByOSwgbHNsICMyXQkJQCB7IGxvYWQgUm0gdmFsdWUgfQogLmRhdGFfYXJtX2FwcGx5X3I2X2FuZF9ybjoKLQlhbmQJcjUsIHI4LCAjMTUgPDwgMTYJCUAgRXh0cmFjdCAnbicgZnJvbSBpbnN0cnVjdGlvbgotCWxkcglyNywgW3NwLCByNSwgbHNyICMxNF0JCUAgR2V0IHJlZ2lzdGVyICdSbicKKwlhbmQJcjksIHI4LCAjMTUgPDwgMTYJCUAgRXh0cmFjdCAnbicgZnJvbSBpbnN0cnVjdGlvbgorCWxkcglyNywgW3IyLCByOSwgbHNyICMxNF0JCUAgR2V0IHJlZ2lzdGVyICdSbicKIAl0c3QJcjgsICMxIDw8IDIzCQkJQCBDaGVjayBVIGJpdAogCXN1Ym5lCXI3LCByNywgcjYJCQlAIFVuZG8gaW5jcm1lbmV0CiAJYWRkZXEJcjcsIHI3LCByNgkJCUAgVW5kbyBkZWNyZW1lbnQKLQlzdHIJcjcsIFtzcCwgcjUsIGxzciAjMTRdCQlAIFB1dCByZWdpc3RlciAnUm4nCi0JbW92CXBjLCBscgorCXN0cglyNywgW3IyLCByOSwgbHNyICMxNF0JCUAgUHV0IHJlZ2lzdGVyICdSbicKKwliCWRvX0RhdGFBYm9ydAogCiAuZGF0YV9hcm1fbGF0ZWxkcnByZWNvbnN0OgogCXRzdAlyOCwgIzEgPDwgMjEJCQlAIGNoZWNrIHdyaXRlYmFjayBiaXQKLQltb3ZlcQlwYywgbHIJCQkJQCBubyB3cml0ZWJhY2sgLT4gbm8gZml4dXAKKwliZXEJZG9fRGF0YUFib3J0CQkJQCBubyB3cml0ZWJhY2sgLT4gbm8gZml4dXAKIC5kYXRhX2FybV9sYXRlbGRycG9zdGNvbnN0OgotCW1vdnMJcjIsIHI4LCBsc2wgIzIwCQkJQCBHZXQgb2Zmc2V0Ci0JbW92ZXEJcGMsIGxyCQkJCUAgemVybyAtPiBubyBmaXh1cAotCWFuZAlyNSwgcjgsICMxNSA8PCAxNgkJQCBFeHRyYWN0ICduJyBmcm9tIGluc3RydWN0aW9uCi0JbGRyCXI3LCBbc3AsIHI1LCBsc3IgIzE0XQkJQCBHZXQgcmVnaXN0ZXIgJ1JuJworCW1vdnMJcjYsIHI4LCBsc2wgIzIwCQkJQCBHZXQgb2Zmc2V0CisJYmVxCWRvX0RhdGFBYm9ydAkJCUAgemVybyAtPiBubyBmaXh1cAorCWFuZAlyOSwgcjgsICMxNSA8PCAxNgkJQCBFeHRyYWN0ICduJyBmcm9tIGluc3RydWN0aW9uCisJbGRyCXI3LCBbcjIsIHI5LCBsc3IgIzE0XQkJQCBHZXQgcmVnaXN0ZXIgJ1JuJwogCXRzdAlyOCwgIzEgPDwgMjMJCQlAIENoZWNrIFUgYml0Ci0Jc3VibmUJcjcsIHI3LCByMiwgbHNyICMyMAkJQCBVbmRvIGluY3JlbWVudAotCWFkZGVxCXI3LCByNywgcjIsIGxzciAjMjAJCUAgVW5kbyBkZWNyZW1lbnQKLQlzdHIJcjcsIFtzcCwgcjUsIGxzciAjMTRdCQlAIFB1dCByZWdpc3RlciAnUm4nCi0JbW92CXBjLCBscgorCXN1Ym5lCXI3LCByNywgcjYsIGxzciAjMjAJCUAgVW5kbyBpbmNyZW1lbnQKKwlhZGRlcQlyNywgcjcsIHI2LCBsc3IgIzIwCQlAIFVuZG8gZGVjcmVtZW50CisJc3RyCXI3LCBbcjIsIHI5LCBsc3IgIzE0XQkJQCBQdXQgcmVnaXN0ZXIgJ1JuJworCWIJZG9fRGF0YUFib3J0CiAKIC5kYXRhX2FybV9sYXRlbGRycHJlcmVnOgogCXRzdAlyOCwgIzEgPDwgMjEJCQlAIGNoZWNrIHdyaXRlYmFjayBiaXQKLQltb3ZlcQlwYywgbHIJCQkJQCBubyB3cml0ZWJhY2sgLT4gbm8gZml4dXAKKwliZXEJZG9fRGF0YUFib3J0CQkJQCBubyB3cml0ZWJhY2sgLT4gbm8gZml4dXAKIC5kYXRhX2FybV9sYXRlbGRycG9zdHJlZzoKIAlhbmQJcjcsIHI4LCAjMTUJCQlAIEV4dHJhY3QgJ20nIGZyb20gaW5zdHJ1Y3Rpb24KLQlsZHIJcjYsIFtzcCwgcjcsIGxzbCAjMl0JCUAgR2V0IHJlZ2lzdGVyICdSbScKLQltb3YJcjUsIHI4LCBsc3IgIzcJCQlAIGdldCBzaGlmdCBjb3VudAotCWFuZHMJcjUsIHI1LCAjMzEKKwlsZHIJcjYsIFtyMiwgcjcsIGxzbCAjMl0JCUAgR2V0IHJlZ2lzdGVyICdSbScKKwltb3YJcjksIHI4LCBsc3IgIzcJCQlAIGdldCBzaGlmdCBjb3VudAorCWFuZHMJcjksIHI5LCAjMzEKIAlhbmQJcjcsIHI4LCAjMHg3MAkJCUAgZ2V0IHNoaWZ0IHR5cGUKIAlvcnJlcQlyNywgcjcsICM4CQkJQCBzaGlmdCBjb3VudCA9IDAKIAlhZGQJcGMsIHBjLCByNwogCW5vcAogCi0JbW92CXI2LCByNiwgbHNsIHI1CQkJQCAwOiBMU0wgIyEwCisJbW92CXI2LCByNiwgbHNsIHI5CQkJQCAwOiBMU0wgIyEwCiAJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCiAJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCUAgMTogTFNMICMwCiAJbm9wCkBAIC0xMzQsNyArMTI5LDcgQEAKIAlub3AKIAliCS5kYXRhX3Vua25vd24JCQlAIDM6IE1VTD8KIAlub3AKLQltb3YJcjYsIHI2LCBsc3IgcjUJCQlAIDQ6IExTUiAjITAKKwltb3YJcjYsIHI2LCBsc3IgcjkJCQlAIDQ6IExTUiAjITAKIAliCS5kYXRhX2FybV9hcHBseV9yNl9hbmRfcm4KIAltb3YJcjYsIHI2LCBsc3IgIzMyCQkJQCA1OiBMU1IgIzMyCiAJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCkBAIC0xNDIsNyArMTM3LDcgQEAKIAlub3AKIAliCS5kYXRhX3Vua25vd24JCQlAIDc6IE1VTD8KIAlub3AKLQltb3YJcjYsIHI2LCBhc3IgcjUJCQlAIDg6IEFTUiAjITAKKwltb3YJcjYsIHI2LCBhc3IgcjkJCQlAIDg6IEFTUiAjITAKIAliCS5kYXRhX2FybV9hcHBseV9yNl9hbmRfcm4KIAltb3YJcjYsIHI2LCBhc3IgIzMyCQkJQCA5OiBBU1IgIzMyCiAJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCkBAIC0xNTAsNyArMTQ1LDcgQEAKIAlub3AKIAliCS5kYXRhX3Vua25vd24JCQlAIEI6IE1VTD8KIAlub3AKLQltb3YJcjYsIHI2LCByb3IgcjUJCQlAIEM6IFJPUiAjITAKKwltb3YJcjYsIHI2LCByb3IgcjkJCQlAIEM6IFJPUiAjITAKIAliCS5kYXRhX2FybV9hcHBseV9yNl9hbmRfcm4KIAltb3YJcjYsIHI2LCBycngJCQlAIEQ6IFJSWAogCWIJLmRhdGFfYXJtX2FwcGx5X3I2X2FuZF9ybgpAQCAtMTU5LDcgKzE1NCw3IEBACiAJYgkuZGF0YV91bmtub3duCQkJQCBGOiBNVUw/CiAKIC5kYXRhX3RodW1iX2Fib3J0OgotCWxkcmgJcjgsIFtyMl0JCQlAIHJlYWQgaW5zdHJ1Y3Rpb24KKwlsZHJoCXI4LCBbcjRdCQkJQCByZWFkIGluc3RydWN0aW9uCiAJdHN0CXI4LCAjMSA8PCAxMQkJCUAgTCA9IDEgLT4gd3JpdGU/CiAJb3JyZXEJcjEsIHIxLCAjMSA8PCA4CQkJQCB5ZXMKIAlhbmQJcjcsIHI4LCAjMTUgPDwgMTIKQEAgLTE3MiwxMCArMTY3LDEwIEBACiAvKiAzICovCWIJLmRhdGFfdW5rbm93bgogLyogNCAqLwliCS5kYXRhX3Vua25vd24KIC8qIDUgKi8JYgkuZGF0YV90aHVtYl9yZWcKLS8qIDYgKi8JbW92CXBjLCBscgotLyogNyAqLwltb3YJcGMsIGxyCi0vKiA4ICovCW1vdglwYywgbHIKLS8qIDkgKi8JbW92CXBjLCBscgorLyogNiAqLwliCWRvX0RhdGFBYm9ydAorLyogNyAqLwliCWRvX0RhdGFBYm9ydAorLyogOCAqLwliCWRvX0RhdGFBYm9ydAorLyogOSAqLwliCWRvX0RhdGFBYm9ydAogLyogQSAqLwliCS5kYXRhX3Vua25vd24KIC8qIEIgKi8JYgkuZGF0YV90aHVtYl9wdXNocG9wCiAvKiBDICovCWIJLmRhdGFfdGh1bWJfbGRtc3RtCkBAIC0xODUsNDEgKzE4MCw0MSBAQAogCiAuZGF0YV90aHVtYl9yZWc6CiAJdHN0CXI4LCAjMSA8PCA5Ci0JbW92ZXEJcGMsIGxyCisJYmVxCWRvX0RhdGFBYm9ydAogCXRzdAlyOCwgIzEgPDwgMTAJCQlAIElmICdTJyAoc2lnbmVkKSBiaXQgaXMgc2V0CiAJbW92bmUJcjEsICMwCQkJCUAgaXQgbXVzdCBiZSBhIGxvYWQgaW5zdHIKLQltb3YJcGMsIGxyCisJYglkb19EYXRhQWJvcnQKIAogLmRhdGFfdGh1bWJfcHVzaHBvcDoKIAl0c3QJcjgsICMxIDw8IDEwCiAJYmVxCS5kYXRhX3Vua25vd24KIAlhbmQJcjYsIHI4LCAjMHg1NQkJCUAgaHdlaWdodDgocjgpICsgUiBiaXQKLQlhbmQJcjIsIHI4LCAjMHhhYQotCWFkZAlyNiwgcjYsIHIyLCBsc3IgIzEKLQlhbmQJcjIsIHI2LCAjMHhjYworCWFuZAlyOSwgcjgsICMweGFhCisJYWRkCXI2LCByNiwgcjksIGxzciAjMQorCWFuZAlyOSwgcjYsICMweGNjCiAJYW5kCXI2LCByNiwgIzB4MzMKLQlhZGQJcjYsIHI2LCByMiwgbHNyICMyCisJYWRkCXI2LCByNiwgcjksIGxzciAjMgogCW1vdnMJcjcsIHI4LCBsc3IgIzkJCQlAIEMgPSByOCBiaXQgOCAoUiBiaXQpCiAJYWRjCXI2LCByNiwgcjYsIGxzciAjNAkJQCBoaWdoICsgbG93IG5pYmJsZSArIFIgYml0CiAJYW5kCXI2LCByNiwgIzE1CQkJQCBudW1iZXIgb2YgcmVncyB0byB0cmFuc2ZlcgotCWxkcglyNywgW3NwLCAjMTMgPDwgMl0KKwlsZHIJcjcsIFtyMiwgIzEzIDw8IDJdCiAJdHN0CXI4LCAjMSA8PCAxMQogCWFkZGVxCXI3LCByNywgcjYsIGxzbCAjMgkJQCBpbmNyZW1lbnQgU1AgaWYgUFVTSAogCXN1Ym5lCXI3LCByNywgcjYsIGxzbCAjMgkJQCBkZWNyZW1lbnQgU1AgaWYgUE9QCi0Jc3RyCXI3LCBbc3AsICMxMyA8PCAyXQotCW1vdglwYywgbHIKKwlzdHIJcjcsIFtyMiwgIzEzIDw8IDJdCisJYglkb19EYXRhQWJvcnQKIAogLmRhdGFfdGh1bWJfbGRtc3RtOgogCWFuZAlyNiwgcjgsICMweDU1CQkJQCBod2VpZ2h0OChyOCkKLQlhbmQJcjIsIHI4LCAjMHhhYQotCWFkZAlyNiwgcjYsIHIyLCBsc3IgIzEKLQlhbmQJcjIsIHI2LCAjMHhjYworCWFuZAlyOSwgcjgsICMweGFhCisJYWRkCXI2LCByNiwgcjksIGxzciAjMQorCWFuZAlyOSwgcjYsICMweGNjCiAJYW5kCXI2LCByNiwgIzB4MzMKLQlhZGQJcjYsIHI2LCByMiwgbHNyICMyCisJYWRkCXI2LCByNiwgcjksIGxzciAjMgogCWFkZAlyNiwgcjYsIHI2LCBsc3IgIzQKLQlhbmQJcjUsIHI4LCAjNyA8PCA4Ci0JbGRyCXI3LCBbc3AsIHI1LCBsc3IgIzZdCisJYW5kCXI5LCByOCwgIzcgPDwgOAorCWxkcglyNywgW3IyLCByOSwgbHNyICM2XQogCWFuZAlyNiwgcjYsICMxNQkJCUAgbnVtYmVyIG9mIHJlZ3MgdG8gdHJhbnNmZXIKIAlzdWIJcjcsIHI3LCByNiwgbHNsICMyCQlAIGFsd2F5cyBkZWNyZW1lbnQKLQlzdHIJcjcsIFtzcCwgcjUsIGxzciAjNl0KLQltb3YJcGMsIGxyCisJc3RyCXI3LCBbcjIsIHI5LCBsc3IgIzZdCisJYglkb19EYXRhQWJvcnQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2Fib3J0LW1hY3JvLlMgYi9hcmNoL2FybS9tbS9hYm9ydC1tYWNyby5TCmluZGV4IGQ3Y2IxYmYuLjUyMTYyZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2Fib3J0LW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbW0vYWJvcnQtbWFjcm8uUwpAQCAtOSwzNCArOSwzMiBAQAogICoKICAqLwogCi0JLm1hY3JvCWRvX3RodW1iX2Fib3J0Ci0JdHN0CXIzLCAjUFNSX1RfQklUCisJLm1hY3JvCWRvX3RodW1iX2Fib3J0LCBmc3IsIHBjLCBwc3IsIHRtcAorCXRzdAlccHNyLCAjUFNSX1RfQklUCiAJYmVxCW5vdF90aHVtYgotCWxkcmgJcjMsIFtyMl0JCQlAIFJlYWQgYWJvcnRlZCBUaHVtYiBpbnN0cnVjdGlvbgotCWFuZAlyMywgcjMsICMgMHhmZTAwCQlAIE1hc2sgb3Bjb2RlIGZpZWxkCi0JY21wCXIzLCAjIDB4NTYwMAkJCUAgSXMgaXQgbGRyc2I/Ci0Jb3JyZXEJcjMsIHIzLCAjMSA8PCAxMQkJQCBTZXQgTC1iaXQgaWYgeWVzCi0JdHN0CXIzLCAjMSA8PCAxMQkJCUAgTCA9IDAgLT4gd3JpdGUKLQlvcnJlcQlyMSwgcjEsICMxIDw8IDExCQlAIHllcy4KLQltb3YJcGMsIGxyCisJbGRyaAlcdG1wLCBbXHBjXQkJCUAgUmVhZCBhYm9ydGVkIFRodW1iIGluc3RydWN0aW9uCisJYW5kCVx0bXAsIFx0bXAsICMgMHhmZTAwCQlAIE1hc2sgb3Bjb2RlIGZpZWxkCisJY21wCVx0bXAsICMgMHg1NjAwCQkJQCBJcyBpdCBsZHJzYj8KKwlvcnJlcQlcdG1wLCBcdG1wLCAjMSA8PCAxMQkJQCBTZXQgTC1iaXQgaWYgeWVzCisJdHN0CVx0bXAsICMxIDw8IDExCQkJQCBMID0gMCAtPiB3cml0ZQorCW9ycmVxCVxwc3IsIFxwc3IsICMxIDw8IDExCQlAIHllcy4KKwliCWRvX0RhdGFBYm9ydAogbm90X3RodW1iOgogCS5lbmRtCiAKIC8qCi0gKiBXZSBjaGVjayBmb3IgdGhlIGZvbGxvd2luZyBpbnN0dXJjdGlvbiBlbmNvZGluZyBmb3IgTERSRC4KKyAqIFdlIGNoZWNrIGZvciB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uIGVuY29kaW5nIGZvciBMRFJELgogICoKLSAqIFsyNzoyNV0gPT0gMAorICogWzI3OjI1XSA9PSAwMDAKICAqICAgWzc6NF0gPT0gMTEwMQogICogICAgWzIwXSA9PSAwCiAgKi8KLSAJLm1hY3JvCWRvX2xkcmRfYWJvcnQKLSAJdHN0CXIzLCAjMHgwZTAwMDAwMAkJCUAgWzI3OjI1XSA9PSAwCisJLm1hY3JvCWRvX2xkcmRfYWJvcnQsIHRtcCwgaW5zbgorCXRzdAlcaW5zbiwgIzB4MGUxMDAwMDAJCUAgWzI3OjI1LDIwXSA9PSAwCiAJYm5lCW5vdF9sZHJkCi0JYW5kCXIyLCByMywgIzB4MDAwMDAwZjAJCUAgWzc6NF0gPT0gMTEwMQotCWNtcAlyMiwgIzB4MDAwMDAwZDAKLQlibmUJbm90X2xkcmQKLQl0c3QJcjMsICMxIDw8IDIwCQkJQCBbMjBdID09IDAKLQltb3ZlcQlwYywgbHIKKwlhbmQJXHRtcCwgXGluc24sICMweDAwMDAwMGYwCUAgWzc6NF0gPT0gMTEwMQorCWNtcAlcdG1wLCAjMHgwMDAwMDBkMAorCWJlcQlkb19EYXRhQWJvcnQKIG5vdF9sZHJkOgogCS5lbmRtCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2Fib3J0LW5vbW11LlMgYi9hcmNoL2FybS9tbS9hYm9ydC1ub21tdS5TCmluZGV4IDYyNWU1ODAuLjExOWNiNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2Fib3J0LW5vbW11LlMKKysrIGIvYXJjaC9hcm0vbW0vYWJvcnQtbm9tbXUuUwpAQCAtMywxMSArMywxMSBAQAogLyoKICAqIEZ1bmN0aW9uOiBub21tdV9lYXJseV9hYm9ydAogICoKLSAqIFBhcmFtcyAgOiByMiA9IGFkZHJlc3Mgb2YgYWJvcnRlZCBpbnN0cnVjdGlvbgotICogICAgICAgICA6IHIzID0gc2F2ZWQgU1BTUgorICogUGFyYW1zICA6IHIyID0gcHRfcmVncworICoJICAgOiByNCA9IGFib3J0ZWQgY29udGV4dCBwYworICoJICAgOiByNSA9IGFib3J0ZWQgY29udGV4dCBwc3IKICAqCi0gKiBSZXR1cm5zIDogcjAgPSAwIChhYm9ydCBhZGRyZXNzKQotICoJICAgOiByMSA9IDAgKEZTUikKKyAqIFJldHVybnMgOiByNCAtIHIxMSwgcjEzIHByZXNlcnZlZAogICoKICAqIE5vdGU6IFRoZXJlIGlzIG5vIEZTUi9GQVIgb24gIUNQVV9DUDE1X01NVSBjb3Jlcy4KICAqICAgICAgIEp1c3QgZmlsbCB6ZXJvIGludG8gdGhlIHJlZ2lzdGVycy4KQEAgLTE2LDUgKzE2LDUgQEAKIEVOVFJZKG5vbW11X2Vhcmx5X2Fib3J0KQogCW1vdglyMCwgIzAJCQkJQCBjbGVhciByMCwgcjEgKG5vIEZTUi9GQVIpCiAJbW92CXIxLCAjMAotCW1vdglwYywgbHIKKwliCWRvX0RhdGFBYm9ydAogRU5EUFJPQyhub21tdV9lYXJseV9hYm9ydCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2FsaWdubWVudC5jIGIvYXJjaC9hcm0vbW0vYWxpZ25tZW50LmMKaW5kZXggNzI0YmEzYi4uYmU3YzYzOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vYWxpZ25tZW50LmMKKysrIGIvYXJjaC9hcm0vbW0vYWxpZ25tZW50LmMKQEAgLTcyNyw2ICs3MjcsOSBAQAogCWludCBpc2l6ZSA9IDQ7CiAJaW50IHRodW1iMl8zMmIgPSAwOwogCisJaWYgKGludGVycnVwdHNfZW5hYmxlZChyZWdzKSkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCiAJaW5zdHJwdHIgPSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOwogCiAJZnMgPSBnZXRfZnMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NhY2hlLWZhLlMgYi9hcmNoL2FybS9tbS9jYWNoZS1mYS5TCmluZGV4IDFmYTZmNzEuLjA3MjAxNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NhY2hlLWZhLlMKKysrIGIvYXJjaC9hcm0vbW0vY2FjaGUtZmEuUwpAQCAtMjQyLDE2ICsyNDIsNSBAQAogCiAJX19JTklUREFUQQogCi0JLnR5cGUJZmFfY2FjaGVfZm5zLCAjb2JqZWN0Ci1FTlRSWShmYV9jYWNoZV9mbnMpCi0JLmxvbmcJZmFfZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCWZhX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCi0JLmxvbmcJZmFfZmx1c2hfdXNlcl9jYWNoZV9hbGwKLQkubG9uZwlmYV9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJZmFfY29oZXJlbnRfa2Vybl9yYW5nZQotCS5sb25nCWZhX2NvaGVyZW50X3VzZXJfcmFuZ2UKLQkubG9uZwlmYV9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJZmFfZG1hX21hcF9hcmVhCi0JLmxvbmcJZmFfZG1hX3VubWFwX2FyZWEKLQkubG9uZwlmYV9kbWFfZmx1c2hfcmFuZ2UKLQkuc2l6ZQlmYV9jYWNoZV9mbnMsIC4gLSBmYV9jYWNoZV9mbnMKKwlAIGRlZmluZSBzdHJ1Y3QgY3B1X2NhY2hlX2ZucyAoc2VlIDxhc20vY2FjaGVmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfY2FjaGVfZnVuY3Rpb25zIGZhCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMgYi9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMKaW5kZXggZWY1OTA5OS4uNDRjMDg2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAuYwpAQCAtMTIwLDE3ICsxMjAsMjIgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMngwX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgX19sMngwX2ZsdXNoX2FsbCh2b2lkKQoreworCWRlYnVnX3dyaXRlbCgweDAzKTsKKwl3cml0ZWxfcmVsYXhlZChsMngwX3dheV9tYXNrLCBsMngwX2Jhc2UgKyBMMlgwX0NMRUFOX0lOVl9XQVkpOworCWNhY2hlX3dhaXRfd2F5KGwyeDBfYmFzZSArIEwyWDBfQ0xFQU5fSU5WX1dBWSwgbDJ4MF93YXlfbWFzayk7CisJY2FjaGVfc3luYygpOworCWRlYnVnX3dyaXRlbCgweDAwKTsKK30KKwogc3RhdGljIHZvaWQgbDJ4MF9mbHVzaF9hbGwodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogY2xlYW4gYWxsIHdheXMgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmbDJ4MF9sb2NrLCBmbGFncyk7Ci0JZGVidWdfd3JpdGVsKDB4MDMpOwotCXdyaXRlbF9yZWxheGVkKGwyeDBfd2F5X21hc2ssIGwyeDBfYmFzZSArIEwyWDBfQ0xFQU5fSU5WX1dBWSk7Ci0JY2FjaGVfd2FpdF93YXkobDJ4MF9iYXNlICsgTDJYMF9DTEVBTl9JTlZfV0FZLCBsMngwX3dheV9tYXNrKTsKLQljYWNoZV9zeW5jKCk7Ci0JZGVidWdfd3JpdGVsKDB4MDApOworCV9fbDJ4MF9mbHVzaF9hbGwoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMngwX2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMjY2LDcgKzI3MSw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZsMngwX2xvY2ssIGZsYWdzKTsKLQl3cml0ZWwoMCwgbDJ4MF9iYXNlICsgTDJYMF9DVFJMKTsKKwlfX2wyeDBfZmx1c2hfYWxsKCk7CisJd3JpdGVsX3JlbGF4ZWQoMCwgbDJ4MF9iYXNlICsgTDJYMF9DVFJMKTsKKwlkc2IoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMngwX2xvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtdjMuUyBiL2FyY2gvYXJtL21tL2NhY2hlLXYzLlMKaW5kZXggMmUyYmM0MC4uYzIzMDFmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtdjMuUworKysgYi9hcmNoL2FybS9tbS9jYWNoZS12My5TCkBAIC0xMjksMTYgKzEyOSw1IEBACiAKIAlfX0lOSVREQVRBCiAKLQkudHlwZQl2M19jYWNoZV9mbnMsICNvYmplY3QKLUVOVFJZKHYzX2NhY2hlX2ZucykKLQkubG9uZwl2M19mbHVzaF9pY2FjaGVfYWxsCi0JLmxvbmcJdjNfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLQkubG9uZwl2M19mbHVzaF91c2VyX2NhY2hlX2FsbAotCS5sb25nCXYzX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKLQkubG9uZwl2M19jb2hlcmVudF9rZXJuX3JhbmdlCi0JLmxvbmcJdjNfY29oZXJlbnRfdXNlcl9yYW5nZQotCS5sb25nCXYzX2ZsdXNoX2tlcm5fZGNhY2hlX2FyZWEKLQkubG9uZwl2M19kbWFfbWFwX2FyZWEKLQkubG9uZwl2M19kbWFfdW5tYXBfYXJlYQotCS5sb25nCXYzX2RtYV9mbHVzaF9yYW5nZQotCS5zaXplCXYzX2NhY2hlX2ZucywgLiAtIHYzX2NhY2hlX2ZucworCUAgZGVmaW5lIHN0cnVjdCBjcHVfY2FjaGVfZm5zIChzZWUgPGFzbS9jYWNoZWZsdXNoLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQorCWRlZmluZV9jYWNoZV9mdW5jdGlvbnMgdjMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NhY2hlLXY0LlMgYi9hcmNoL2FybS9tbS9jYWNoZS12NC5TCmluZGV4IGE4ZmVmYjUuLmZkOWJiN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NhY2hlLXY0LlMKKysrIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjQuUwpAQCAtMTQxLDE2ICsxNDEsNSBAQAogCiAJX19JTklUREFUQQogCi0JLnR5cGUJdjRfY2FjaGVfZm5zLCAjb2JqZWN0Ci1FTlRSWSh2NF9jYWNoZV9mbnMpCi0JLmxvbmcJdjRfZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCXY0X2ZsdXNoX2tlcm5fY2FjaGVfYWxsCi0JLmxvbmcJdjRfZmx1c2hfdXNlcl9jYWNoZV9hbGwKLQkubG9uZwl2NF9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJdjRfY29oZXJlbnRfa2Vybl9yYW5nZQotCS5sb25nCXY0X2NvaGVyZW50X3VzZXJfcmFuZ2UKLQkubG9uZwl2NF9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJdjRfZG1hX21hcF9hcmVhCi0JLmxvbmcJdjRfZG1hX3VubWFwX2FyZWEKLQkubG9uZwl2NF9kbWFfZmx1c2hfcmFuZ2UKLQkuc2l6ZQl2NF9jYWNoZV9mbnMsIC4gLSB2NF9jYWNoZV9mbnMKKwlAIGRlZmluZSBzdHJ1Y3QgY3B1X2NhY2hlX2ZucyAoc2VlIDxhc20vY2FjaGVmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfY2FjaGVfZnVuY3Rpb25zIHY0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS12NHdiLlMgYi9hcmNoL2FybS9tbS9jYWNoZS12NHdiLlMKaW5kZXggZjQwYzY5Ni4uNGYyYzE0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtdjR3Yi5TCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXY0d2IuUwpAQCAtMjUzLDE2ICsyNTMsNSBAQAogCiAJX19JTklUREFUQQogCi0JLnR5cGUJdjR3Yl9jYWNoZV9mbnMsICNvYmplY3QKLUVOVFJZKHY0d2JfY2FjaGVfZm5zKQotCS5sb25nCXY0d2JfZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCXY0d2JfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLQkubG9uZwl2NHdiX2ZsdXNoX3VzZXJfY2FjaGVfYWxsCi0JLmxvbmcJdjR3Yl9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJdjR3Yl9jb2hlcmVudF9rZXJuX3JhbmdlCi0JLmxvbmcJdjR3Yl9jb2hlcmVudF91c2VyX3JhbmdlCi0JLmxvbmcJdjR3Yl9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJdjR3Yl9kbWFfbWFwX2FyZWEKLQkubG9uZwl2NHdiX2RtYV91bm1hcF9hcmVhCi0JLmxvbmcJdjR3Yl9kbWFfZmx1c2hfcmFuZ2UKLQkuc2l6ZQl2NHdiX2NhY2hlX2ZucywgLiAtIHY0d2JfY2FjaGVfZm5zCisJQCBkZWZpbmUgc3RydWN0IGNwdV9jYWNoZV9mbnMgKHNlZSA8YXNtL2NhY2hlZmx1c2guaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX2NhY2hlX2Z1bmN0aW9ucyB2NHdiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS12NHd0LlMgYi9hcmNoL2FybS9tbS9jYWNoZS12NHd0LlMKaW5kZXggYTdiMjc2ZC4uNGQ3YjQ2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtdjR3dC5TCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXY0d3QuUwpAQCAtMTk3LDE2ICsxOTcsNSBAQAogCiAJX19JTklUREFUQQogCi0JLnR5cGUJdjR3dF9jYWNoZV9mbnMsICNvYmplY3QKLUVOVFJZKHY0d3RfY2FjaGVfZm5zKQotCS5sb25nCXY0d3RfZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCXY0d3RfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLQkubG9uZwl2NHd0X2ZsdXNoX3VzZXJfY2FjaGVfYWxsCi0JLmxvbmcJdjR3dF9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJdjR3dF9jb2hlcmVudF9rZXJuX3JhbmdlCi0JLmxvbmcJdjR3dF9jb2hlcmVudF91c2VyX3JhbmdlCi0JLmxvbmcJdjR3dF9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJdjR3dF9kbWFfbWFwX2FyZWEKLQkubG9uZwl2NHd0X2RtYV91bm1hcF9hcmVhCi0JLmxvbmcJdjR3dF9kbWFfZmx1c2hfcmFuZ2UKLQkuc2l6ZQl2NHd0X2NhY2hlX2ZucywgLiAtIHY0d3RfY2FjaGVfZm5zCisJQCBkZWZpbmUgc3RydWN0IGNwdV9jYWNoZV9mbnMgKHNlZSA8YXNtL2NhY2hlZmx1c2guaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX2NhY2hlX2Z1bmN0aW9ucyB2NHd0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS12Ni5TIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjYuUwppbmRleCA3M2I0YThiLi43NGMyZTVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jYWNoZS12Ni5TCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXY2LlMKQEAgLTMzMCwxNiArMzMwLDUgQEAKIAogCV9fSU5JVERBVEEKIAotCS50eXBlCXY2X2NhY2hlX2ZucywgI29iamVjdAotRU5UUlkodjZfY2FjaGVfZm5zKQotCS5sb25nCXY2X2ZsdXNoX2ljYWNoZV9hbGwKLQkubG9uZwl2Nl9mbHVzaF9rZXJuX2NhY2hlX2FsbAotCS5sb25nCXY2X2ZsdXNoX3VzZXJfY2FjaGVfYWxsCi0JLmxvbmcJdjZfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQotCS5sb25nCXY2X2NvaGVyZW50X2tlcm5fcmFuZ2UKLQkubG9uZwl2Nl9jb2hlcmVudF91c2VyX3JhbmdlCi0JLmxvbmcJdjZfZmx1c2hfa2Vybl9kY2FjaGVfYXJlYQotCS5sb25nCXY2X2RtYV9tYXBfYXJlYQotCS5sb25nCXY2X2RtYV91bm1hcF9hcmVhCi0JLmxvbmcJdjZfZG1hX2ZsdXNoX3JhbmdlCi0JLnNpemUJdjZfY2FjaGVfZm5zLCAuIC0gdjZfY2FjaGVfZm5zCisJQCBkZWZpbmUgc3RydWN0IGNwdV9jYWNoZV9mbnMgKHNlZSA8YXNtL2NhY2hlZmx1c2guaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX2NhY2hlX2Z1bmN0aW9ucyB2NgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtdjcuUyBiL2FyY2gvYXJtL21tL2NhY2hlLXY3LlMKaW5kZXggZDMyZjAyYi4uM2IyNGJmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtdjcuUworKysgYi9hcmNoL2FybS9tbS9jYWNoZS12Ny5TCkBAIC0zMjUsMTYgKzMyNSw1IEBACiAKIAlfX0lOSVREQVRBCiAKLQkudHlwZQl2N19jYWNoZV9mbnMsICNvYmplY3QKLUVOVFJZKHY3X2NhY2hlX2ZucykKLQkubG9uZwl2N19mbHVzaF9pY2FjaGVfYWxsCi0JLmxvbmcJdjdfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLQkubG9uZwl2N19mbHVzaF91c2VyX2NhY2hlX2FsbAotCS5sb25nCXY3X2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKLQkubG9uZwl2N19jb2hlcmVudF9rZXJuX3JhbmdlCi0JLmxvbmcJdjdfY29oZXJlbnRfdXNlcl9yYW5nZQotCS5sb25nCXY3X2ZsdXNoX2tlcm5fZGNhY2hlX2FyZWEKLQkubG9uZwl2N19kbWFfbWFwX2FyZWEKLQkubG9uZwl2N19kbWFfdW5tYXBfYXJlYQotCS5sb25nCXY3X2RtYV9mbHVzaF9yYW5nZQotCS5zaXplCXY3X2NhY2hlX2ZucywgLiAtIHY3X2NhY2hlX2ZucworCUAgZGVmaW5lIHN0cnVjdCBjcHVfY2FjaGVfZm5zIChzZWUgPGFzbS9jYWNoZWZsdXNoLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQorCWRlZmluZV9jYWNoZV9mdW5jdGlvbnMgdjcKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvbnRleHQuYyBiL2FyY2gvYXJtL21tL2NvbnRleHQuYwppbmRleCA4YmZhZTk2Li5iMGVlOWJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jb250ZXh0LmMKKysrIGIvYXJjaC9hcm0vbW0vY29udGV4dC5jCkBAIC0yNCw3ICsyNCw5IEBACiAKIC8qCiAgKiBXZSBmb3JrKCllZCBhIHByb2Nlc3MsIGFuZCB3ZSBuZWVkIGEgbmV3IGNvbnRleHQgZm9yIHRoZSBjaGlsZAotICogdG8gcnVuIGluLgorICogdG8gcnVuIGluLiAgV2UgcmVzZXJ2ZSB2ZXJzaW9uIDAgZm9yIGluaXRpYWwgdGFza3Mgc28gd2Ugd2lsbAorICogYWx3YXlzIGFsbG9jYXRlIGFuIEFTSUQuIFRoZSBBU0lEIDAgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBUVEJSCisgKiByZWdpc3RlciBjaGFuZ2luZyBzZXF1ZW5jZS4KICAqLwogdm9pZCBfX2luaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewpAQCAtMzQsMTEgKzM2LDggQEAKIAogc3RhdGljIHZvaWQgZmx1c2hfY29udGV4dCh2b2lkKQogewotCXUzMiB0dGI7Ci0JLyogQ29weSBUVEJSMSBpbnRvIFRUQlIwICovCi0JYXNtIHZvbGF0aWxlKCJtcmMJcDE1LCAwLCAlMCwgYzIsIGMwLCAxXG4iCi0JCSAgICAgIm1jcglwMTUsIDAsICUwLCBjMiwgYzAsIDAiCi0JCSAgICAgOiAiPXIiICh0dGIpKTsKKwkvKiBzZXQgdGhlIHJlc2VydmVkIEFTSUQgYmVmb3JlIGZsdXNoaW5nIHRoZSBUTEIgKi8KKwlhc20oIm1jcglwMTUsIDAsICUwLCBjMTMsIGMwLCAxXG4iIDogOiAiciIgKDApKTsKIAlpc2IoKTsKIAlsb2NhbF9mbHVzaF90bGJfYWxsKCk7CiAJaWYgKGljYWNoZV9pc192aXZ0X2FzaWRfdGFnZ2VkKCkpIHsKQEAgLTk0LDcgKzkzLDcgQEAKIAkJcmV0dXJuOwogCiAJc21wX3JtYigpOwotCWFzaWQgPSBjcHVfbGFzdF9hc2lkICsgY3B1OworCWFzaWQgPSBjcHVfbGFzdF9hc2lkICsgY3B1ICsgMTsKIAogCWZsdXNoX2NvbnRleHQoKTsKIAlzZXRfbW1fY29udGV4dChtbSwgYXNpZCk7CkBAIC0xNDQsMTMgKzE0MywxMyBAQAogCSAqIHRvIHN0YXJ0IGEgbmV3IHZlcnNpb24gYW5kIGZsdXNoIHRoZSBUTEIuCiAJICovCiAJaWYgKHVubGlrZWx5KChhc2lkICYgfkFTSURfTUFTSykgPT0gMCkpIHsKLQkJYXNpZCA9IGNwdV9sYXN0X2FzaWQgKyBzbXBfcHJvY2Vzc29yX2lkKCk7CisJCWFzaWQgPSBjcHVfbGFzdF9hc2lkICsgc21wX3Byb2Nlc3Nvcl9pZCgpICsgMTsKIAkJZmx1c2hfY29udGV4dCgpOwogI2lmZGVmIENPTkZJR19TTVAKIAkJc21wX3dtYigpOwogCQlzbXBfY2FsbF9mdW5jdGlvbihyZXNldF9jb250ZXh0LCBOVUxMLCAxKTsKICNlbmRpZgotCQljcHVfbGFzdF9hc2lkICs9IE5SX0NQVVMgLSAxOworCQljcHVfbGFzdF9hc2lkICs9IE5SX0NQVVM7CiAJfQogCiAJc2V0X21tX2NvbnRleHQobW0sIGFzaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjYuYyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY2LmMKaW5kZXggYmRiYTZjNi4uNjNjY2EwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjYuYworKysgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12Ni5jCkBAIC00MSw3ICs0MSw2IEBACiAJa2Zyb20gPSBrbWFwX2F0b21pYyhmcm9tLCBLTV9VU0VSMCk7CiAJa3RvID0ga21hcF9hdG9taWModG8sIEtNX1VTRVIxKTsKIAljb3B5X3BhZ2Uoa3RvLCBrZnJvbSk7Ci0JX19jcHVjX2ZsdXNoX2RjYWNoZV9hcmVhKGt0bywgUEFHRV9TSVpFKTsKIAlrdW5tYXBfYXRvbWljKGt0bywgS01fVVNFUjEpOwogCWt1bm1hcF9hdG9taWMoa2Zyb20sIEtNX1VTRVIwKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMgYi9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jCmluZGV4IDgyYTA5M2MuLjBhMGExZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKKysrIGIvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYwpAQCAtMjUsOSArMjUsMTEgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KIAorI2luY2x1ZGUgIm1tLmgiCisKIHN0YXRpYyB1NjQgZ2V0X2NvaGVyZW50X2RtYV9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQl1NjQgbWFzayA9IElTQV9ETUFfVEhSRVNIT0xEOworCXU2NCBtYXNrID0gKHU2NClhcm1fZG1hX2xpbWl0OwogCiAJaWYgKGRldikgewogCQltYXNrID0gZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKQEAgLTQxLDEwICs0MywxMCBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQlpZiAoKH5tYXNrKSAmIElTQV9ETUFfVEhSRVNIT0xEKSB7CisJCWlmICgofm1hc2spICYgKHU2NClhcm1fZG1hX2xpbWl0KSB7CiAJCQlkZXZfd2FybihkZXYsICJjb2hlcmVudCBETUEgbWFzayAlI2xseCBpcyBzbWFsbGVyICIKIAkJCQkgInRoYW4gc3lzdGVtIEdGUF9ETUEgbWFzayAlI2xseFxuIiwKLQkJCQkgbWFzaywgKHVuc2lnbmVkIGxvbmcgbG9uZylJU0FfRE1BX1RIUkVTSE9MRCk7CisJCQkJIG1hc2ssICh1NjQpYXJtX2RtYV9saW1pdCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTY1Nyw2ICs2NTksMzMgQEAKIH0KIEVYUE9SVF9TWU1CT0woZG1hX3N5bmNfc2dfZm9yX2RldmljZSk7CiAKKy8qCisgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gZGV2aWNlIERNQSBhZGRyZXNzIG1hc2sgY2FuIGJlIHN1cHBvcnRlZAorICogcHJvcGVybHkuICBGb3IgZXhhbXBsZSwgaWYgeW91ciBkZXZpY2UgY2FuIG9ubHkgZHJpdmUgdGhlIGxvdyAyNC1iaXRzCisgKiBkdXJpbmcgYnVzIG1hc3RlcmluZywgdGhlbiB5b3Ugd291bGQgcGFzcyAweDAwZmZmZmZmIGFzIHRoZSBtYXNrCisgKiB0byB0aGlzIGZ1bmN0aW9uLgorICovCitpbnQgZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQoreworCWlmIChtYXNrIDwgKHU2NClhcm1fZG1hX2xpbWl0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3N1cHBvcnRlZCk7CisKK2ludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgZG1hX21hc2spCit7CisJaWYgKCFkZXYtPmRtYV9tYXNrIHx8ICFkbWFfc3VwcG9ydGVkKGRldiwgZG1hX21hc2spKQorCQlyZXR1cm4gLUVJTzsKKworI2lmbmRlZiBDT05GSUdfRE1BQk9VTkNFCisJKmRldi0+ZG1hX21hc2sgPSBkbWFfbWFzazsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9zZXRfbWFzayk7CisKICNkZWZpbmUgUFJFQUxMT0NfRE1BX0RFQlVHX0VOVFJJRVMJNDA5NgogCiBzdGF0aWMgaW50IF9faW5pdCBkbWFfZGVidWdfZG9faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmF1bHQuYyBiL2FyY2gvYXJtL21tL2ZhdWx0LmMKaW5kZXggYmMwZTFkOC4uM2I1ZWE2OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmF1bHQuYworKysgYi9hcmNoL2FybS9tbS9mYXVsdC5jCkBAIC05NCw3ICs5NCw3IEBACiAKIAkJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOwogCQlpZiAoUFRSU19QRVJfUFVEICE9IDEpCi0JCQlwcmludGsoIiwgKnB1ZD0lMDhseCIsIHB1ZF92YWwoKnB1ZCkpOworCQkJcHJpbnRrKCIsICpwdWQ9JTA4bGx4IiwgKGxvbmcgbG9uZylwdWRfdmFsKCpwdWQpKTsKIAogCQlpZiAocHVkX25vbmUoKnB1ZCkpCiAJCQlicmVhazsKQEAgLTI4NSw2ICsyODUsMTAgQEAKIAl0c2sgPSBjdXJyZW50OwogCW1tICA9IHRzay0+bW07CiAKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBpZiB0aGV5IHdlcmUgZW5hYmxlZCBpbiB0aGUgcGFyZW50IGNvbnRleHQuICovCisJaWYgKGludGVycnVwdHNfZW5hYmxlZChyZWdzKSkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCiAJLyoKIAkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQgb3IgaGF2ZSBubyB1c2VyCiAJICogY29udGV4dCwgd2UgbXVzdCBub3QgdGFrZSB0aGUgZmF1bHQuLgpAQCAtMzE4LDExICszMjIsMTEgQEAKIAlmYXVsdCA9IF9fZG9fcGFnZV9mYXVsdChtbSwgYWRkciwgZnNyLCB0c2spOwogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAKLQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMsIDEsIDAsIHJlZ3MsIGFkZHIpOworCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUywgMSwgcmVncywgYWRkcik7CiAJaWYgKGZhdWx0ICYgVk1fRkFVTFRfTUFKT1IpCi0JCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NQUosIDEsIDAsIHJlZ3MsIGFkZHIpOworCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKLCAxLCByZWdzLCBhZGRyKTsKIAllbHNlIGlmIChmYXVsdCAmIFZNX0ZBVUxUX01JTk9SKQotCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUlOLCAxLCAwLCByZWdzLCBhZGRyKTsKKwkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTiwgMSwgcmVncywgYWRkcik7CiAKIAkvKgogCSAqIEhhbmRsZSB0aGUgIm5vcm1hbCIgY2FzZSBmaXJzdCAtIFZNX0ZBVUxUX01BSk9SIC8gVk1fRkFVTFRfTUlOT1IKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2luaXQuYyBiL2FyY2gvYXJtL21tL2luaXQuYwppbmRleCAyYzJjY2U5Li4yZmVlNzgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm0vbW0vaW5pdC5jCkBAIC0yMTIsNiArMjEyLDE4IEBACiB9CiAKICNpZmRlZiBDT05GSUdfWk9ORV9ETUEKKwordW5zaWduZWQgbG9uZyBhcm1fZG1hX3pvbmVfc2l6ZSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChhcm1fZG1hX3pvbmVfc2l6ZSk7CisKKy8qCisgKiBUaGUgRE1BIG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgbWF4aW11bSBidXMgYWRkcmVzcyBhbGxvY2F0YWJsZQorICogdXNpbmcgR0ZQX0RNQS4gIFRoZSBkZWZhdWx0IGhlcmUgcGxhY2VzIG5vIHJlc3RyaWN0aW9uIG9uIERNQQorICogYWxsb2NhdGlvbnMuICBUaGlzIG11c3QgYmUgdGhlIHNtYWxsZXN0IERNQSBtYXNrIGluIHRoZSBzeXN0ZW0sCisgKiBzbyBhIHN1Y2Nlc3NmdWwgR0ZQX0RNQSBhbGxvY2F0aW9uIHdpbGwgYWx3YXlzIHNhdGlzZnkgdGhpcy4KKyAqLwordTMyIGFybV9kbWFfbGltaXQ7CisKIHN0YXRpYyB2b2lkIF9faW5pdCBhcm1fYWRqdXN0X2RtYV96b25lKHVuc2lnbmVkIGxvbmcgKnNpemUsIHVuc2lnbmVkIGxvbmcgKmhvbGUsCiAJdW5zaWduZWQgbG9uZyBkbWFfc2l6ZSkKIHsKQEAgLTI2NywxNyArMjc5LDE3IEBACiAjZW5kaWYKIAl9CiAKLSNpZmRlZiBBUk1fRE1BX1pPTkVfU0laRQotI2lmbmRlZiBDT05GSUdfWk9ORV9ETUEKLSNlcnJvciBBUk1fRE1BX1pPTkVfU0laRSBzZXQgYnV0IG5vIERNQSB6b25lIHRvIGxpbWl0IGFsbG9jYXRpb25zCi0jZW5kaWYKLQorI2lmZGVmIENPTkZJR19aT05FX0RNQQogCS8qCiAJICogQWRqdXN0IHRoZSBzaXplcyBhY2NvcmRpbmcgdG8gYW55IHNwZWNpYWwgcmVxdWlyZW1lbnRzIGZvcgogCSAqIHRoaXMgbWFjaGluZSB0eXBlLgogCSAqLwotCWFybV9hZGp1c3RfZG1hX3pvbmUoem9uZV9zaXplLCB6aG9sZV9zaXplLAotCQlBUk1fRE1BX1pPTkVfU0laRSA+PiBQQUdFX1NISUZUKTsKKwlpZiAoYXJtX2RtYV96b25lX3NpemUpIHsKKwkJYXJtX2FkanVzdF9kbWFfem9uZSh6b25lX3NpemUsIHpob2xlX3NpemUsCisJCQlhcm1fZG1hX3pvbmVfc2l6ZSA+PiBQQUdFX1NISUZUKTsKKwkJYXJtX2RtYV9saW1pdCA9IFBIWVNfT0ZGU0VUICsgYXJtX2RtYV96b25lX3NpemUgLSAxOworCX0gZWxzZQorCQlhcm1fZG1hX2xpbWl0ID0gMHhmZmZmZmZmZjsKICNlbmRpZgogCiAJZnJlZV9hcmVhX2luaXRfbm9kZSgwLCB6b25lX3NpemUsIG1pbiwgemhvbGVfc2l6ZSk7CkBAIC0zMzEsNiArMzQzLDEyIEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlpZiAocGh5c19pbml0cmRfc2l6ZSAmJgorCSAgICAhbWVtYmxvY2tfaXNfcmVnaW9uX21lbW9yeShwaHlzX2luaXRyZF9zdGFydCwgcGh5c19pbml0cmRfc2l6ZSkpIHsKKwkJcHJfZXJyKCJJTklUUkQ6IDB4JTA4bHgrMHglMDhseCBpcyBub3QgYSBtZW1vcnkgcmVnaW9uIC0gZGlzYWJsaW5nIGluaXRyZFxuIiwKKwkJICAgICAgIHBoeXNfaW5pdHJkX3N0YXJ0LCBwaHlzX2luaXRyZF9zaXplKTsKKwkJcGh5c19pbml0cmRfc3RhcnQgPSBwaHlzX2luaXRyZF9zaXplID0gMDsKKwl9CisJaWYgKHBoeXNfaW5pdHJkX3NpemUgJiYKIAkgICAgbWVtYmxvY2tfaXNfcmVnaW9uX3Jlc2VydmVkKHBoeXNfaW5pdHJkX3N0YXJ0LCBwaHlzX2luaXRyZF9zaXplKSkgewogCQlwcl9lcnIoIklOSVRSRDogMHglMDhseCsweCUwOGx4IG92ZXJsYXBzIGluLXVzZSBtZW1vcnkgcmVnaW9uIC0gZGlzYWJsaW5nIGluaXRyZFxuIiwKIAkJICAgICAgIHBoeXNfaW5pdHJkX3N0YXJ0LCBwaHlzX2luaXRyZF9zaXplKTsKQEAgLTQxNiw2ICs0MzQsMTcgQEAKIAlyZXR1cm4gcGFnZXM7CiB9CiAKKy8qCisgKiBQb2lzb24gaW5pdCBtZW1vcnkgd2l0aCBhbiB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gKEFSTSkgb3IgYSBicmFuY2ggdG8gYW4KKyAqIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiAoVGh1bWIpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcG9pc29uX2luaXRfbWVtKHZvaWQgKnMsIHNpemVfdCBjb3VudCkKK3sKKwl1MzIgKnAgPSAodTMyICopczsKKwl3aGlsZSAoKGNvdW50ID0gY291bnQgLSA0KSkKKwkJKnArKyA9IDB4ZTdmZGRlZjA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZAogZnJlZV9tZW1tYXAodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKIHsKQEAgLTYzMyw5ICs2NjIsMTAgQEAKIAkJCSIgICAgcGttYXAgICA6IDB4JTA4bHggLSAweCUwOGx4ICAgKCU0bGQgTUIpXG4iCiAjZW5kaWYKIAkJCSIgICAgbW9kdWxlcyA6IDB4JTA4bHggLSAweCUwOGx4ICAgKCU0bGQgTUIpXG4iCi0JCQkiICAgICAgLmluaXQgOiAweCVwIiAiIC0gMHglcCIgIiAgICglNGQga0IpXG4iCiAJCQkiICAgICAgLnRleHQgOiAweCVwIiAiIC0gMHglcCIgIiAgICglNGQga0IpXG4iCi0JCQkiICAgICAgLmRhdGEgOiAweCVwIiAiIC0gMHglcCIgIiAgICglNGQga0IpXG4iLAorCQkJIiAgICAgIC5pbml0IDogMHglcCIgIiAtIDB4JXAiICIgICAoJTRkIGtCKVxuIgorCQkJIiAgICAgIC5kYXRhIDogMHglcCIgIiAtIDB4JXAiICIgICAoJTRkIGtCKVxuIgorCQkJIiAgICAgICAuYnNzIDogMHglcCIgIiAtIDB4JXAiICIgICAoJTRkIGtCKVxuIiwKIAogCQkJTUxLKFVMKENPTkZJR19WRUNUT1JTX0JBU0UpLCBVTChDT05GSUdfVkVDVE9SU19CQVNFKSArCiAJCQkJKFBBR0VfU0laRSkpLApAQCAtNjU1LDkgKzY4NSwxMCBAQAogI2VuZGlmCiAJCQlNTE0oTU9EVUxFU19WQUREUiwgTU9EVUxFU19FTkQpLAogCi0JCQlNTEtfUk9VTkRVUChfX2luaXRfYmVnaW4sIF9faW5pdF9lbmQpLAogCQkJTUxLX1JPVU5EVVAoX3RleHQsIF9ldGV4dCksCi0JCQlNTEtfUk9VTkRVUChfc2RhdGEsIF9lZGF0YSkpOworCQkJTUxLX1JPVU5EVVAoX19pbml0X2JlZ2luLCBfX2luaXRfZW5kKSwKKwkJCU1MS19ST1VORFVQKF9zZGF0YSwgX2VkYXRhKSwKKwkJCU1MS19ST1VORFVQKF9fYnNzX3N0YXJ0LCBfX2Jzc19zdG9wKSk7CiAKICN1bmRlZiBNTEsKICN1bmRlZiBNTE0KQEAgLTY5NiwxMSArNzI3LDEzIEBACiAjaWZkZWYgQ09ORklHX0hBVkVfVENNCiAJZXh0ZXJuIGNoYXIgX190Y21fc3RhcnQsIF9fdGNtX2VuZDsKIAorCXBvaXNvbl9pbml0X21lbSgmX190Y21fc3RhcnQsICZfX3RjbV9lbmQgLSAmX190Y21fc3RhcnQpOwogCXRvdGFscmFtX3BhZ2VzICs9IGZyZWVfYXJlYShfX3BoeXNfdG9fcGZuKF9fcGEoJl9fdGNtX3N0YXJ0KSksCiAJCQkJICAgIF9fcGh5c190b19wZm4oX19wYSgmX190Y21fZW5kKSksCiAJCQkJICAgICJUQ00gbGluayIpOwogI2VuZGlmCiAKKwlwb2lzb25faW5pdF9tZW0oX19pbml0X2JlZ2luLCBfX2luaXRfZW5kIC0gX19pbml0X2JlZ2luKTsKIAlpZiAoIW1hY2hpbmVfaXNfaW50ZWdyYXRvcigpICYmICFtYWNoaW5lX2lzX2NpbnRlZ3JhdG9yKCkpCiAJCXRvdGFscmFtX3BhZ2VzICs9IGZyZWVfYXJlYShfX3BoeXNfdG9fcGZuKF9fcGEoX19pbml0X2JlZ2luKSksCiAJCQkJCSAgICBfX3BoeXNfdG9fcGZuKF9fcGEoX19pbml0X2VuZCkpLApAQCAtNzEzLDEwICs3NDYsMTIgQEAKIAogdm9pZCBmcmVlX2luaXRyZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0JaWYgKCFrZWVwX2luaXRyZCkKKwlpZiAoIWtlZXBfaW5pdHJkKSB7CisJCXBvaXNvbl9pbml0X21lbSgodm9pZCAqKXN0YXJ0LCBQQUdFX0FMSUdOKGVuZCkgLSBzdGFydCk7CiAJCXRvdGFscmFtX3BhZ2VzICs9IGZyZWVfYXJlYShfX3BoeXNfdG9fcGZuKF9fcGEoc3RhcnQpKSwKIAkJCQkJICAgIF9fcGh5c190b19wZm4oX19wYShlbmQpKSwKIAkJCQkJICAgICJpbml0cmQiKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGtlZXBpbml0cmRfc2V0dXAoY2hhciAqX191bnVzZWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbS5oIGIvYXJjaC9hcm0vbW0vbW0uaAppbmRleCA1YjNkN2Q1Li4wMTA1NjY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbS5oCisrKyBiL2FyY2gvYXJtL21tL21tLmgKQEAgLTIzLDUgKzIzLDExIEBACiAKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1pPTkVfRE1BCitleHRlcm4gdTMyIGFybV9kbWFfbGltaXQ7CisjZWxzZQorI2RlZmluZSBhcm1fZG1hX2xpbWl0ICgodTMyKX4wKQorI2VuZGlmCisKIHZvaWQgX19pbml0IGJvb3RtZW1faW5pdCh2b2lkKTsKIHZvaWQgYXJtX21tX21lbWJsb2NrX3Jlc2VydmUodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbXUuYyBiL2FyY2gvYXJtL21tL21tdS5jCmluZGV4IDlkOWU3MzYuLjU5NGQ2NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tdS5jCisrKyBiL2FyY2gvYXJtL21tL21tdS5jCkBAIC03NTksNyArNzU5LDcgQEAKIAogc3RhdGljIHBoeXNfYWRkcl90IGxvd21lbV9saW1pdCBfX2luaXRkYXRhID0gMDsKIAotc3RhdGljIHZvaWQgX19pbml0IHNhbml0eV9jaGVja19tZW1pbmZvKHZvaWQpCit2b2lkIF9faW5pdCBzYW5pdHlfY2hlY2tfbWVtaW5mbyh2b2lkKQogewogCWludCBpLCBqLCBoaWdobWVtID0gMDsKIApAQCAtMTAzMiw4ICsxMDMyLDkgQEAKIHsKIAl2b2lkICp6ZXJvX3BhZ2U7CiAKKwltZW1ibG9ja19zZXRfY3VycmVudF9saW1pdChsb3dtZW1fbGltaXQpOworCiAJYnVpbGRfbWVtX3R5cGVfdGFibGUoKTsKLQlzYW5pdHlfY2hlY2tfbWVtaW5mbygpOwogCXByZXBhcmVfcGFnZV90YWJsZSgpOwogCW1hcF9sb3dtZW0oKTsKIAlkZXZpY2VtYXBzX2luaXQobWRlc2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbm9tbXUuYyBiL2FyY2gvYXJtL21tL25vbW11LmMKaW5kZXggNjg3ZDAyMy4uOTQxYTk4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vbm9tbXUuYworKysgYi9hcmNoL2FybS9tbS9ub21tdS5jCkBAIC0yNyw2ICsyNywxMCBAQAogCW1lbWJsb2NrX3Jlc2VydmUoQ09ORklHX1ZFQ1RPUlNfQkFTRSwgUEFHRV9TSVpFKTsKIH0KIAordm9pZCBfX2luaXQgc2FuaXR5X2NoZWNrX21lbWluZm8odm9pZCkKK3sKK30KKwogLyoKICAqIHBhZ2luZ19pbml0KCkgc2V0cyB1cCB0aGUgcGFnZSB0YWJsZXMsIGluaXRpYWxpc2VzIHRoZSB6b25lIG1lbW9yeQogICogbWFwcywgYW5kIHNldHMgdXAgdGhlIHplcm8gcGFnZSwgYmFkIHBhZ2UgYW5kIGJhZCBwYWdlIHRhYmxlcy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3BhYm9ydC1sZWdhY3kuUyBiL2FyY2gvYXJtL21tL3BhYm9ydC1sZWdhY3kuUwppbmRleCA4Nzk3MGViLi44YmJmZjAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wYWJvcnQtbGVnYWN5LlMKKysrIGIvYXJjaC9hcm0vbW0vcGFib3J0LWxlZ2FjeS5TCkBAIC00LDE2ICs0LDE4IEBACiAvKgogICogRnVuY3Rpb246IGxlZ2FjeV9wYWJvcnQKICAqCi0gKiBQYXJhbXMgIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0ZWQgaW5zdHJ1Y3Rpb24KKyAqIFBhcmFtcyAgOiByMiA9IHB0X3JlZ3MKKyAqCSAgIDogcjQgPSBhZGRyZXNzIG9mIGFib3J0ZWQgaW5zdHJ1Y3Rpb24KKyAqCSAgIDogcjUgPSBwc3IgZm9yIHBhcmVudCBjb250ZXh0CiAgKgotICogUmV0dXJucyA6IHIwID0gYWRkcmVzcyBvZiBhYm9ydAotICoJICAgOiByMSA9IFNpbXVsYXRlZCBJRlNSIHdpdGggc2VjdGlvbiB0cmFuc2xhdGlvbiBmYXVsdCBzdGF0dXMKKyAqIFJldHVybnMgOiByNCAtIHIxMSwgcjEzIHByZXNlcnZlZAogICoKICAqIFB1cnBvc2UgOiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBwcmVmZXRjaCBhYm9ydC4KICAqLwogCiAJLmFsaWduCTUKIEVOVFJZKGxlZ2FjeV9wYWJvcnQpCisJbW92CXIwLCByNAogCW1vdglyMSwgIzUKLQltb3YJcGMsIGxyCisJYglkb19QcmVmZXRjaEFib3J0CiBFTkRQUk9DKGxlZ2FjeV9wYWJvcnQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wYWJvcnQtdjYuUyBiL2FyY2gvYXJtL21tL3BhYm9ydC12Ni5TCmluZGV4IDA2ZTNkMWUuLjk2Mjc2NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3BhYm9ydC12Ni5TCisrKyBiL2FyY2gvYXJtL21tL3BhYm9ydC12Ni5TCkBAIC00LDE2ICs0LDE4IEBACiAvKgogICogRnVuY3Rpb246IHY2X3BhYm9ydAogICoKLSAqIFBhcmFtcyAgOiByMCA9IGFkZHJlc3Mgb2YgYWJvcnRlZCBpbnN0cnVjdGlvbgorICogUGFyYW1zICA6IHIyID0gcHRfcmVncworICoJICAgOiByNCA9IGFkZHJlc3Mgb2YgYWJvcnRlZCBpbnN0cnVjdGlvbgorICoJICAgOiByNSA9IHBzciBmb3IgcGFyZW50IGNvbnRleHQKICAqCi0gKiBSZXR1cm5zIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0Ci0gKgkgICA6IHIxID0gSUZTUgorICogUmV0dXJucyA6IHI0IC0gcjExLCByMTMgcHJlc2VydmVkCiAgKgogICogUHVycG9zZSA6IG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHByZWZldGNoIGFib3J0LgogICovCiAKIAkuYWxpZ24JNQogRU5UUlkodjZfcGFib3J0KQorCW1vdglyMCwgcjQKIAltcmMJcDE1LCAwLCByMSwgYzUsIGMwLCAxCQlAIGdldCBJRlNSCi0JbW92CXBjLCBscgorCWIJZG9fUHJlZmV0Y2hBYm9ydAogRU5EUFJPQyh2Nl9wYWJvcnQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wYWJvcnQtdjcuUyBiL2FyY2gvYXJtL21tL3BhYm9ydC12Ny5TCmluZGV4IGE4YjNiMzAuLjg3NTc2MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3BhYm9ydC12Ny5TCisrKyBiL2FyY2gvYXJtL21tL3BhYm9ydC12Ny5TCkBAIC0yLDEyICsyLDEzIEBACiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogCiAvKgotICogRnVuY3Rpb246IHY2X3BhYm9ydAorICogRnVuY3Rpb246IHY3X3BhYm9ydAogICoKLSAqIFBhcmFtcyAgOiByMCA9IGFkZHJlc3Mgb2YgYWJvcnRlZCBpbnN0cnVjdGlvbgorICogUGFyYW1zICA6IHIyID0gcHRfcmVncworICoJICAgOiByNCA9IGFkZHJlc3Mgb2YgYWJvcnRlZCBpbnN0cnVjdGlvbgorICoJICAgOiByNSA9IHBzciBmb3IgcGFyZW50IGNvbnRleHQKICAqCi0gKiBSZXR1cm5zIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0Ci0gKgkgICA6IHIxID0gSUZTUgorICogUmV0dXJucyA6IHI0IC0gcjExLCByMTMgcHJlc2VydmVkCiAgKgogICogUHVycG9zZSA6IG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHByZWZldGNoIGFib3J0LgogICovCkBAIC0xNiw1ICsxNyw1IEBACiBFTlRSWSh2N19wYWJvcnQpCiAJbXJjCXAxNSwgMCwgcjAsIGM2LCBjMCwgMgkJQCBnZXQgSUZBUgogCW1yYwlwMTUsIDAsIHIxLCBjNSwgYzAsIDEJCUAgZ2V0IElGU1IKLQltb3YJcGMsIGxyCisJYglkb19QcmVmZXRjaEFib3J0CiBFTkRQUk9DKHY3X3BhYm9ydCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMKaW5kZXggNmM0ZTdmZC4uNjc0Njk2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMKQEAgLTM2NCwxNyArMzY0LDggQEAKIAltb3YJcGMsIGxyCiBFTkRQUk9DKGFybTEwMjBfZG1hX3VubWFwX2FyZWEpCiAKLUVOVFJZKGFybTEwMjBfY2FjaGVfZm5zKQotCS5sb25nCWFybTEwMjBfZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCWFybTEwMjBfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLQkubG9uZwlhcm0xMDIwX2ZsdXNoX3VzZXJfY2FjaGVfYWxsCi0JLmxvbmcJYXJtMTAyMF9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJYXJtMTAyMF9jb2hlcmVudF9rZXJuX3JhbmdlCi0JLmxvbmcJYXJtMTAyMF9jb2hlcmVudF91c2VyX3JhbmdlCi0JLmxvbmcJYXJtMTAyMF9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJYXJtMTAyMF9kbWFfbWFwX2FyZWEKLQkubG9uZwlhcm0xMDIwX2RtYV91bm1hcF9hcmVhCi0JLmxvbmcJYXJtMTAyMF9kbWFfZmx1c2hfcmFuZ2UKKwlAIGRlZmluZSBzdHJ1Y3QgY3B1X2NhY2hlX2ZucyAoc2VlIDxhc20vY2FjaGVmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfY2FjaGVfZnVuY3Rpb25zIGFybTEwMjAKIAogCS5hbGlnbgk1CiBFTlRSWShjcHVfYXJtMTAyMF9kY2FjaGVfY2xlYW5fYXJlYSkKQEAgLTQ3NywzOCArNDY4LDE0IEBACiAJY3J2YWwJY2xlYXI9MHgwMDAwNTkzZiwgbW11c2V0PTB4MDAwMDM5MzUsIHVjc2V0PTB4MDAwMDE5MzAKIAogCV9fSU5JVERBVEEKKwlAIGRlZmluZSBzdHJ1Y3QgcHJvY2Vzc29yIChzZWUgPGFzbS9wcm9jLWZucy5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBhcm0xMDIwLCBkYWJvcnQ9djR0X2Vhcmx5X2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydAogCi0vKgotICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscwotICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKLSAqLwotCS50eXBlCWFybTEwMjBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAotYXJtMTAyMF9wcm9jZXNzb3JfZnVuY3Rpb25zOgotCS53b3JkCXY0dF9lYXJseV9hYm9ydAotCS53b3JkCWxlZ2FjeV9wYWJvcnQKLQkud29yZAljcHVfYXJtMTAyMF9wcm9jX2luaXQKLQkud29yZAljcHVfYXJtMTAyMF9wcm9jX2ZpbgotCS53b3JkCWNwdV9hcm0xMDIwX3Jlc2V0Ci0JLndvcmQJY3B1X2FybTEwMjBfZG9faWRsZQotCS53b3JkCWNwdV9hcm0xMDIwX2RjYWNoZV9jbGVhbl9hcmVhCi0JLndvcmQJY3B1X2FybTEwMjBfc3dpdGNoX21tCi0JLndvcmQJY3B1X2FybTEwMjBfc2V0X3B0ZV9leHQKLQkud29yZAkwCi0JLndvcmQJMAotCS53b3JkCTAKLQkuc2l6ZQlhcm0xMDIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm0xMDIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAogCS5zZWN0aW9uICIucm9kYXRhIgogCi0JLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdAotY3B1X2FyY2hfbmFtZToKLQkuYXNjaXoJImFybXY1dCIKLQkuc2l6ZQljcHVfYXJjaF9uYW1lLCAuIC0gY3B1X2FyY2hfbmFtZQotCi0JLnR5cGUJY3B1X2VsZl9uYW1lLCAjb2JqZWN0Ci1jcHVfZWxmX25hbWU6Ci0JLmFzY2l6CSJ2NSIKLQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKKwlzdHJpbmcJY3B1X2FyY2hfbmFtZSwgImFybXY1dCIKKwlzdHJpbmcJY3B1X2VsZl9uYW1lLCAidjUiCiAKIAkudHlwZQljcHVfYXJtMTAyMF9uYW1lLCAjb2JqZWN0CiBjcHVfYXJtMTAyMF9uYW1lOgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TCmluZGV4IDRjZTk0N2MuLjQyNTE0MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMKQEAgLTM1MCwxNyArMzUwLDggQEAKIAltb3YJcGMsIGxyCiBFTkRQUk9DKGFybTEwMjBlX2RtYV91bm1hcF9hcmVhKQogCi1FTlRSWShhcm0xMDIwZV9jYWNoZV9mbnMpCi0JLmxvbmcJYXJtMTAyMGVfZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCWFybTEwMjBlX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCi0JLmxvbmcJYXJtMTAyMGVfZmx1c2hfdXNlcl9jYWNoZV9hbGwKLQkubG9uZwlhcm0xMDIwZV9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJYXJtMTAyMGVfY29oZXJlbnRfa2Vybl9yYW5nZQotCS5sb25nCWFybTEwMjBlX2NvaGVyZW50X3VzZXJfcmFuZ2UKLQkubG9uZwlhcm0xMDIwZV9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJYXJtMTAyMGVfZG1hX21hcF9hcmVhCi0JLmxvbmcJYXJtMTAyMGVfZG1hX3VubWFwX2FyZWEKLQkubG9uZwlhcm0xMDIwZV9kbWFfZmx1c2hfcmFuZ2UKKwlAIGRlZmluZSBzdHJ1Y3QgY3B1X2NhY2hlX2ZucyAoc2VlIDxhc20vY2FjaGVmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfY2FjaGVfZnVuY3Rpb25zIGFybTEwMjBlCiAKIAkuYWxpZ24JNQogRU5UUlkoY3B1X2FybTEwMjBlX2RjYWNoZV9jbGVhbl9hcmVhKQpAQCAtNDU4LDQzICs0NDksMTQgQEAKIAljcnZhbAljbGVhcj0weDAwMDA3ZjNmLCBtbXVzZXQ9MHgwMDAwMzkzNSwgdWNzZXQ9MHgwMDAwMTkzMAogCiAJX19JTklUREFUQQotCi0vKgotICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscwotICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKLSAqLwotCS50eXBlCWFybTEwMjBlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKLWFybTEwMjBlX3Byb2Nlc3Nvcl9mdW5jdGlvbnM6Ci0JLndvcmQJdjR0X2Vhcmx5X2Fib3J0Ci0JLndvcmQJbGVnYWN5X3BhYm9ydAotCS53b3JkCWNwdV9hcm0xMDIwZV9wcm9jX2luaXQKLQkud29yZAljcHVfYXJtMTAyMGVfcHJvY19maW4KLQkud29yZAljcHVfYXJtMTAyMGVfcmVzZXQKLQkud29yZAljcHVfYXJtMTAyMGVfZG9faWRsZQotCS53b3JkCWNwdV9hcm0xMDIwZV9kY2FjaGVfY2xlYW5fYXJlYQotCS53b3JkCWNwdV9hcm0xMDIwZV9zd2l0Y2hfbW0KLQkud29yZAljcHVfYXJtMTAyMGVfc2V0X3B0ZV9leHQKLQkud29yZAkwCi0JLndvcmQJMAotCS53b3JkCTAKLQkuc2l6ZQlhcm0xMDIwZV9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtMTAyMGVfcHJvY2Vzc29yX2Z1bmN0aW9ucworCUAgZGVmaW5lIHN0cnVjdCBwcm9jZXNzb3IgKHNlZSA8YXNtL3Byb2MtZm5zLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQorCWRlZmluZV9wcm9jZXNzb3JfZnVuY3Rpb25zIGFybTEwMjBlLCBkYWJvcnQ9djR0X2Vhcmx5X2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydAogCiAJLnNlY3Rpb24gIi5yb2RhdGEiCiAKLQkudHlwZQljcHVfYXJjaF9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJjaF9uYW1lOgotCS5hc2NpegkiYXJtdjV0ZSIKLQkuc2l6ZQljcHVfYXJjaF9uYW1lLCAuIC0gY3B1X2FyY2hfbmFtZQotCi0JLnR5cGUJY3B1X2VsZl9uYW1lLCAjb2JqZWN0Ci1jcHVfZWxmX25hbWU6Ci0JLmFzY2l6CSJ2NSIKLQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKLQotCS50eXBlCWNwdV9hcm0xMDIwZV9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJtMTAyMGVfbmFtZToKLQkuYXNjaXoJIkFSTTEwMjBFIgotCS5zaXplCWNwdV9hcm0xMDIwZV9uYW1lLCAuIC0gY3B1X2FybTEwMjBlX25hbWUKKwlzdHJpbmcJY3B1X2FyY2hfbmFtZSwgImFybXY1dGUiCisJc3RyaW5nCWNwdV9lbGZfbmFtZSwgInY1IgorCXN0cmluZwljcHVfYXJtMTAyMGVfbmFtZSwgIkFSTTEwMjBFIgogCiAJLmFsaWduCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKaW5kZXggYzg4ODRjNS4uZDI4M2NmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKQEAgLTMzOSwxNyArMzM5LDggQEAKIAltb3YJcGMsIGxyCiBFTkRQUk9DKGFybTEwMjJfZG1hX3VubWFwX2FyZWEpCiAKLUVOVFJZKGFybTEwMjJfY2FjaGVfZm5zKQotCS5sb25nCWFybTEwMjJfZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCWFybTEwMjJfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLQkubG9uZwlhcm0xMDIyX2ZsdXNoX3VzZXJfY2FjaGVfYWxsCi0JLmxvbmcJYXJtMTAyMl9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJYXJtMTAyMl9jb2hlcmVudF9rZXJuX3JhbmdlCi0JLmxvbmcJYXJtMTAyMl9jb2hlcmVudF91c2VyX3JhbmdlCi0JLmxvbmcJYXJtMTAyMl9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJYXJtMTAyMl9kbWFfbWFwX2FyZWEKLQkubG9uZwlhcm0xMDIyX2RtYV91bm1hcF9hcmVhCi0JLmxvbmcJYXJtMTAyMl9kbWFfZmx1c2hfcmFuZ2UKKwlAIGRlZmluZSBzdHJ1Y3QgY3B1X2NhY2hlX2ZucyAoc2VlIDxhc20vY2FjaGVmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfY2FjaGVfZnVuY3Rpb25zIGFybTEwMjIKIAogCS5hbGlnbgk1CiBFTlRSWShjcHVfYXJtMTAyMl9kY2FjaGVfY2xlYW5fYXJlYSkKQEAgLTQ0MSw0MyArNDMyLDE0IEBACiAJY3J2YWwJY2xlYXI9MHgwMDAwN2YzZiwgbW11c2V0PTB4MDAwMDM5MzUsIHVjc2V0PTB4MDAwMDE5MzAKIAogCV9fSU5JVERBVEEKLQotLyoKLSAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKLSAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCi0gKi8KLQkudHlwZQlhcm0xMDIyX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKLWFybTEwMjJfcHJvY2Vzc29yX2Z1bmN0aW9uczoKLQkud29yZAl2NHRfZWFybHlfYWJvcnQKLQkud29yZAlsZWdhY3lfcGFib3J0Ci0JLndvcmQJY3B1X2FybTEwMjJfcHJvY19pbml0Ci0JLndvcmQJY3B1X2FybTEwMjJfcHJvY19maW4KLQkud29yZAljcHVfYXJtMTAyMl9yZXNldAotCS53b3JkCWNwdV9hcm0xMDIyX2RvX2lkbGUKLQkud29yZAljcHVfYXJtMTAyMl9kY2FjaGVfY2xlYW5fYXJlYQotCS53b3JkCWNwdV9hcm0xMDIyX3N3aXRjaF9tbQotCS53b3JkCWNwdV9hcm0xMDIyX3NldF9wdGVfZXh0Ci0JLndvcmQJMAotCS53b3JkCTAKLQkud29yZAkwCi0JLnNpemUJYXJtMTAyMl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtMTAyMl9wcm9jZXNzb3JfZnVuY3Rpb25zCisJQCBkZWZpbmUgc3RydWN0IHByb2Nlc3NvciAoc2VlIDxhc20vcHJvYy1mbnMuaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX3Byb2Nlc3Nvcl9mdW5jdGlvbnMgYXJtMTAyMiwgZGFib3J0PXY0dF9lYXJseV9hYm9ydCwgcGFib3J0PWxlZ2FjeV9wYWJvcnQKIAogCS5zZWN0aW9uICIucm9kYXRhIgogCi0JLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdAotY3B1X2FyY2hfbmFtZToKLQkuYXNjaXoJImFybXY1dGUiCi0JLnNpemUJY3B1X2FyY2hfbmFtZSwgLiAtIGNwdV9hcmNoX25hbWUKLQotCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAotY3B1X2VsZl9uYW1lOgotCS5hc2NpegkidjUiCi0JLnNpemUJY3B1X2VsZl9uYW1lLCAuIC0gY3B1X2VsZl9uYW1lCi0KLQkudHlwZQljcHVfYXJtMTAyMl9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJtMTAyMl9uYW1lOgotCS5hc2NpegkiQVJNMTAyMiIKLQkuc2l6ZQljcHVfYXJtMTAyMl9uYW1lLCAuIC0gY3B1X2FybTEwMjJfbmFtZQorCXN0cmluZwljcHVfYXJjaF9uYW1lLCAiYXJtdjV0ZSIKKwlzdHJpbmcJY3B1X2VsZl9uYW1lLCAidjUiCisJc3RyaW5nCWNwdV9hcm0xMDIyX25hbWUsICJBUk0xMDIyIgogCiAJLmFsaWduCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyNi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMKaW5kZXggNDEzNjg0Ni4uNjc4YTFjZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMKQEAgLTMzMywxNyArMzMzLDggQEAKIAltb3YJcGMsIGxyCiBFTkRQUk9DKGFybTEwMjZfZG1hX3VubWFwX2FyZWEpCiAKLUVOVFJZKGFybTEwMjZfY2FjaGVfZm5zKQotCS5sb25nCWFybTEwMjZfZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCWFybTEwMjZfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLQkubG9uZwlhcm0xMDI2X2ZsdXNoX3VzZXJfY2FjaGVfYWxsCi0JLmxvbmcJYXJtMTAyNl9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJYXJtMTAyNl9jb2hlcmVudF9rZXJuX3JhbmdlCi0JLmxvbmcJYXJtMTAyNl9jb2hlcmVudF91c2VyX3JhbmdlCi0JLmxvbmcJYXJtMTAyNl9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJYXJtMTAyNl9kbWFfbWFwX2FyZWEKLQkubG9uZwlhcm0xMDI2X2RtYV91bm1hcF9hcmVhCi0JLmxvbmcJYXJtMTAyNl9kbWFfZmx1c2hfcmFuZ2UKKwlAIGRlZmluZSBzdHJ1Y3QgY3B1X2NhY2hlX2ZucyAoc2VlIDxhc20vY2FjaGVmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfY2FjaGVfZnVuY3Rpb25zIGFybTEwMjYKIAogCS5hbGlnbgk1CiBFTlRSWShjcHVfYXJtMTAyNl9kY2FjaGVfY2xlYW5fYXJlYSkKQEAgLTQzNiw0NSArNDI3LDE1IEBACiAJY3J2YWwJY2xlYXI9MHgwMDAwN2YzZiwgbW11c2V0PTB4MDAwMDM5MzUsIHVjc2V0PTB4MDAwMDE5MzQKIAogCV9fSU5JVERBVEEKLQotLyoKLSAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKLSAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCi0gKi8KLQkudHlwZQlhcm0xMDI2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKLWFybTEwMjZfcHJvY2Vzc29yX2Z1bmN0aW9uczoKLQkud29yZAl2NXRfZWFybHlfYWJvcnQKLQkud29yZAlsZWdhY3lfcGFib3J0Ci0JLndvcmQJY3B1X2FybTEwMjZfcHJvY19pbml0Ci0JLndvcmQJY3B1X2FybTEwMjZfcHJvY19maW4KLQkud29yZAljcHVfYXJtMTAyNl9yZXNldAotCS53b3JkCWNwdV9hcm0xMDI2X2RvX2lkbGUKLQkud29yZAljcHVfYXJtMTAyNl9kY2FjaGVfY2xlYW5fYXJlYQotCS53b3JkCWNwdV9hcm0xMDI2X3N3aXRjaF9tbQotCS53b3JkCWNwdV9hcm0xMDI2X3NldF9wdGVfZXh0Ci0JLndvcmQJMAotCS53b3JkCTAKLQkud29yZAkwCi0JLnNpemUJYXJtMTAyNl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtMTAyNl9wcm9jZXNzb3JfZnVuY3Rpb25zCisJQCBkZWZpbmUgc3RydWN0IHByb2Nlc3NvciAoc2VlIDxhc20vcHJvYy1mbnMuaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX3Byb2Nlc3Nvcl9mdW5jdGlvbnMgYXJtMTAyNiwgZGFib3J0PXY1dF9lYXJseV9hYm9ydCwgcGFib3J0PWxlZ2FjeV9wYWJvcnQKIAogCS5zZWN0aW9uIC5yb2RhdGEKIAotCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6Ci0JLmFzY2l6CSJhcm12NXRlaiIKLQkuc2l6ZQljcHVfYXJjaF9uYW1lLCAuIC0gY3B1X2FyY2hfbmFtZQotCi0JLnR5cGUJY3B1X2VsZl9uYW1lLCAjb2JqZWN0Ci1jcHVfZWxmX25hbWU6Ci0JLmFzY2l6CSJ2NSIKLQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKKwlzdHJpbmcJY3B1X2FyY2hfbmFtZSwgImFybXY1dGVqIgorCXN0cmluZwljcHVfZWxmX25hbWUsICJ2NSIKIAkuYWxpZ24KLQotCS50eXBlCWNwdV9hcm0xMDI2X25hbWUsICNvYmplY3QKLWNwdV9hcm0xMDI2X25hbWU6Ci0JLmFzY2l6CSJBUk0xMDI2RUotUyIKLQkuc2l6ZQljcHVfYXJtMTAyNl9uYW1lLCAuIC0gY3B1X2FybTEwMjZfbmFtZQotCisJc3RyaW5nCWNwdV9hcm0xMDI2X25hbWUsICJBUk0xMDI2RUotUyIKIAkuYWxpZ24KIAogCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTZfNy5TCmluZGV4IDVmNzlkYzQuLmU1Yjk3NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm02XzcuUwpAQCAtMjksMTkgKzI5LDE5IEBACiAvKgogICogRnVuY3Rpb246IGFybTZfN19kYXRhX2Fib3J0ICgpCiAgKgotICogUGFyYW1zICA6IHIyID0gYWRkcmVzcyBvZiBhYm9ydGVkIGluc3RydWN0aW9uCi0gKgkgICA6IHNwID0gcG9pbnRlciB0byByZWdpc3RlcnMKKyAqIFBhcmFtcyAgOiByMiA9IHB0X3JlZ3MKKyAqCSAgIDogcjQgPSBhYm9ydGVkIGNvbnRleHQgcGMKKyAqCSAgIDogcjUgPSBhYm9ydGVkIGNvbnRleHQgcHNyCiAgKgogICogUHVycG9zZSA6IG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IGFib3J0ZWQgaW5zdHJ1Y3Rpb24KICAqCi0gKiBSZXR1cm5zIDogcjAgPSBhZGRyZXNzIG9mIGFib3J0Ci0gKgkgICA6IHIxID0gRlNSCisgKiBSZXR1cm5zIDogcjQtcjUsIHIxMC1yMTEsIHIxMyBwcmVzZXJ2ZWQKICAqLwogCiBFTlRSWShjcHVfYXJtN19kYXRhX2Fib3J0KQogCW1yYwlwMTUsIDAsIHIxLCBjNSwgYzAsIDAJCUAgZ2V0IEZTUgogCW1yYwlwMTUsIDAsIHIwLCBjNiwgYzAsIDAJCUAgZ2V0IEZBUgotCWxkcglyOCwgW3IyXQkJCUAgcmVhZCBhcm0gaW5zdHJ1Y3Rpb24KKwlsZHIJcjgsIFtyNF0JCQlAIHJlYWQgYXJtIGluc3RydWN0aW9uCiAJdHN0CXI4LCAjMSA8PCAyMAkJCUAgTCA9IDAgLT4gd3JpdGU/CiAJb3JyZXEJcjEsIHIxLCAjMSA8PCAxMQkJQCB5ZXMuCiAJYW5kCXI3LCByOCwgIzE1IDw8IDI0CkBAIC00OSw3ICs0OSw3IEBACiAJbm9wCiAKIC8qIDAgKi8JYgkuZGF0YV91bmtub3duCi0vKiAxICovCW1vdglwYywgbHIJCQkJQCBzd3AKKy8qIDEgKi8JYglkb19EYXRhQWJvcnQJCQlAIHN3cAogLyogMiAqLwliCS5kYXRhX3Vua25vd24KIC8qIDMgKi8JYgkuZGF0YV91bmtub3duCiAvKiA0ICovCWIJLmRhdGFfYXJtX2xhdGVsZHJwb3N0Y29uc3QJQCBsZHIJcmQsIFtybl0sICNtCkBAIC02MCw4NyArNjAsODUgQEAKIC8qIDkgKi8JYgkuZGF0YV9hcm1fbGRtc3RtCQlAIGxkbSpiCXJuLCA8cmxpc3Q+CiAvKiBhICovCWIJLmRhdGFfdW5rbm93bgogLyogYiAqLwliCS5kYXRhX3Vua25vd24KLS8qIGMgKi8JbW92CXBjLCBscgkJCQlAIGxkYwlyZCwgW3JuXSwgI20JQCBTYW1lIGFzIGxkcglyZCwgW3JuXSwgI20KLS8qIGQgKi8JbW92CXBjLCBscgkJCQlAIGxkYwlyZCwgW3JuLCAjbV0KKy8qIGMgKi8JYglkb19EYXRhQWJvcnQJCQlAIGxkYwlyZCwgW3JuXSwgI20JQCBTYW1lIGFzIGxkcglyZCwgW3JuXSwgI20KKy8qIGQgKi8JYglkb19EYXRhQWJvcnQJCQlAIGxkYwlyZCwgW3JuLCAjbV0KIC8qIGUgKi8JYgkuZGF0YV91bmtub3duCiAvKiBmICovCiAuZGF0YV91bmtub3duOglAIFBhcnQgb2YganVtcHRhYmxlCi0JbW92CXIwLCByMgorCW1vdglyMCwgcjQKIAltb3YJcjEsIHI4Ci0JbW92CXIyLCBzcAotCWJsCWJhZGRhdGFhYm9ydAotCWIJcmV0X2Zyb21fZXhjZXB0aW9uCisJYgliYWRkYXRhYWJvcnQKIAogRU5UUlkoY3B1X2FybTZfZGF0YV9hYm9ydCkKIAltcmMJcDE1LCAwLCByMSwgYzUsIGMwLCAwCQlAIGdldCBGU1IKIAltcmMJcDE1LCAwLCByMCwgYzYsIGMwLCAwCQlAIGdldCBGQVIKLQlsZHIJcjgsIFtyMl0JCQlAIHJlYWQgYXJtIGluc3RydWN0aW9uCisJbGRyCXI4LCBbcjRdCQkJQCByZWFkIGFybSBpbnN0cnVjdGlvbgogCXRzdAlyOCwgIzEgPDwgMjAJCQlAIEwgPSAwIC0+IHdyaXRlPwogCW9ycmVxCXIxLCByMSwgIzEgPDwgMTEJCUAgeWVzLgogCWFuZAlyNywgcjgsICMxNCA8PCAyNAogCXRlcQlyNywgIzggPDwgMjQJCQlAIHdhcyBpdCBsZG0vc3RtCi0JbW92bmUJcGMsIGxyCisJYm5lCWRvX0RhdGFBYm9ydAogCiAuZGF0YV9hcm1fbGRtc3RtOgogCXRzdAlyOCwgIzEgPDwgMjEJCQlAIGNoZWNrIHdyaXRlYmFjayBiaXQKLQltb3ZlcQlwYywgbHIJCQkJQCBubyB3cml0ZWJhY2sgLT4gbm8gZml4dXAKKwliZXEJZG9fRGF0YUFib3J0CQkJQCBubyB3cml0ZWJhY2sgLT4gbm8gZml4dXAKIAltb3YJcjcsICMweDExCiAJb3JyCXI3LCByNywgIzB4MTEwMAogCWFuZAlyNiwgcjgsIHI3Ci0JYW5kCXIyLCByOCwgcjcsIGxzbCAjMQotCWFkZAlyNiwgcjYsIHIyLCBsc3IgIzEKLQlhbmQJcjIsIHI4LCByNywgbHNsICMyCi0JYWRkCXI2LCByNiwgcjIsIGxzciAjMgotCWFuZAlyMiwgcjgsIHI3LCBsc2wgIzMKLQlhZGQJcjYsIHI2LCByMiwgbHNyICMzCisJYW5kCXI5LCByOCwgcjcsIGxzbCAjMQorCWFkZAlyNiwgcjYsIHI5LCBsc3IgIzEKKwlhbmQJcjksIHI4LCByNywgbHNsICMyCisJYWRkCXI2LCByNiwgcjksIGxzciAjMgorCWFuZAlyOSwgcjgsIHI3LCBsc2wgIzMKKwlhZGQJcjYsIHI2LCByOSwgbHNyICMzCiAJYWRkCXI2LCByNiwgcjYsIGxzciAjOAogCWFkZAlyNiwgcjYsIHI2LCBsc3IgIzQKIAlhbmQJcjYsIHI2LCAjMTUJCQlAIHI2ID0gbm8uIG9mIHJlZ2lzdGVycyB0byB0cmFuc2Zlci4KLQlhbmQJcjUsIHI4LCAjMTUgPDwgMTYJCUAgRXh0cmFjdCAnbicgZnJvbSBpbnN0cnVjdGlvbgotCWxkcglyNywgW3NwLCByNSwgbHNyICMxNF0JCUAgR2V0IHJlZ2lzdGVyICdSbicKKwlhbmQJcjksIHI4LCAjMTUgPDwgMTYJCUAgRXh0cmFjdCAnbicgZnJvbSBpbnN0cnVjdGlvbgorCWxkcglyNywgW3IyLCByOSwgbHNyICMxNF0JCUAgR2V0IHJlZ2lzdGVyICdSbicKIAl0c3QJcjgsICMxIDw8IDIzCQkJQCBDaGVjayBVIGJpdAogCXN1Ym5lCXI3LCByNywgcjYsIGxzbCAjMgkJQCBVbmRvIGluY3JlbWVudAogCWFkZGVxCXI3LCByNywgcjYsIGxzbCAjMgkJQCBVbmRvIGRlY3JlbWVudAotCXN0cglyNywgW3NwLCByNSwgbHNyICMxNF0JCUAgUHV0IHJlZ2lzdGVyICdSbicKLQltb3YJcGMsIGxyCisJc3RyCXI3LCBbcjIsIHI5LCBsc3IgIzE0XQkJQCBQdXQgcmVnaXN0ZXIgJ1JuJworCWIJZG9fRGF0YUFib3J0CiAKIC5kYXRhX2FybV9hcHBseV9yNl9hbmRfcm46Ci0JYW5kCXI1LCByOCwgIzE1IDw8IDE2CQlAIEV4dHJhY3QgJ24nIGZyb20gaW5zdHJ1Y3Rpb24KLQlsZHIJcjcsIFtzcCwgcjUsIGxzciAjMTRdCQlAIEdldCByZWdpc3RlciAnUm4nCisJYW5kCXI5LCByOCwgIzE1IDw8IDE2CQlAIEV4dHJhY3QgJ24nIGZyb20gaW5zdHJ1Y3Rpb24KKwlsZHIJcjcsIFtyMiwgcjksIGxzciAjMTRdCQlAIEdldCByZWdpc3RlciAnUm4nCiAJdHN0CXI4LCAjMSA8PCAyMwkJCUAgQ2hlY2sgVSBiaXQKIAlzdWJuZQlyNywgcjcsIHI2CQkJQCBVbmRvIGluY3JtZW5ldAogCWFkZGVxCXI3LCByNywgcjYJCQlAIFVuZG8gZGVjcmVtZW50Ci0Jc3RyCXI3LCBbc3AsIHI1LCBsc3IgIzE0XQkJQCBQdXQgcmVnaXN0ZXIgJ1JuJwotCW1vdglwYywgbHIKKwlzdHIJcjcsIFtyMiwgcjksIGxzciAjMTRdCQlAIFB1dCByZWdpc3RlciAnUm4nCisJYglkb19EYXRhQWJvcnQKIAogLmRhdGFfYXJtX2xhdGVsZHJwcmVjb25zdDoKIAl0c3QJcjgsICMxIDw8IDIxCQkJQCBjaGVjayB3cml0ZWJhY2sgYml0Ci0JbW92ZXEJcGMsIGxyCQkJCUAgbm8gd3JpdGViYWNrIC0+IG5vIGZpeHVwCisJYmVxCWRvX0RhdGFBYm9ydAkJCUAgbm8gd3JpdGViYWNrIC0+IG5vIGZpeHVwCiAuZGF0YV9hcm1fbGF0ZWxkcnBvc3Rjb25zdDoKLQltb3ZzCXIyLCByOCwgbHNsICMyMAkJCUAgR2V0IG9mZnNldAotCW1vdmVxCXBjLCBscgkJCQlAIHplcm8gLT4gbm8gZml4dXAKLQlhbmQJcjUsIHI4LCAjMTUgPDwgMTYJCUAgRXh0cmFjdCAnbicgZnJvbSBpbnN0cnVjdGlvbgotCWxkcglyNywgW3NwLCByNSwgbHNyICMxNF0JCUAgR2V0IHJlZ2lzdGVyICdSbicKKwltb3ZzCXI2LCByOCwgbHNsICMyMAkJCUAgR2V0IG9mZnNldAorCWJlcQlkb19EYXRhQWJvcnQJCQlAIHplcm8gLT4gbm8gZml4dXAKKwlhbmQJcjksIHI4LCAjMTUgPDwgMTYJCUAgRXh0cmFjdCAnbicgZnJvbSBpbnN0cnVjdGlvbgorCWxkcglyNywgW3IyLCByOSwgbHNyICMxNF0JCUAgR2V0IHJlZ2lzdGVyICdSbicKIAl0c3QJcjgsICMxIDw8IDIzCQkJQCBDaGVjayBVIGJpdAotCXN1Ym5lCXI3LCByNywgcjIsIGxzciAjMjAJCUAgVW5kbyBpbmNyZW1lbnQKLQlhZGRlcQlyNywgcjcsIHIyLCBsc3IgIzIwCQlAIFVuZG8gZGVjcmVtZW50Ci0Jc3RyCXI3LCBbc3AsIHI1LCBsc3IgIzE0XQkJQCBQdXQgcmVnaXN0ZXIgJ1JuJwotCW1vdglwYywgbHIKKwlzdWJuZQlyNywgcjcsIHI2LCBsc3IgIzIwCQlAIFVuZG8gaW5jcmVtZW50CisJYWRkZXEJcjcsIHI3LCByNiwgbHNyICMyMAkJQCBVbmRvIGRlY3JlbWVudAorCXN0cglyNywgW3IyLCByOSwgbHNyICMxNF0JCUAgUHV0IHJlZ2lzdGVyICdSbicKKwliCWRvX0RhdGFBYm9ydAogCiAuZGF0YV9hcm1fbGF0ZWxkcnByZXJlZzoKIAl0c3QJcjgsICMxIDw8IDIxCQkJQCBjaGVjayB3cml0ZWJhY2sgYml0Ci0JbW92ZXEJcGMsIGxyCQkJCUAgbm8gd3JpdGViYWNrIC0+IG5vIGZpeHVwCisJYmVxCWRvX0RhdGFBYm9ydAkJCUAgbm8gd3JpdGViYWNrIC0+IG5vIGZpeHVwCiAuZGF0YV9hcm1fbGF0ZWxkcnBvc3RyZWc6CiAJYW5kCXI3LCByOCwgIzE1CQkJQCBFeHRyYWN0ICdtJyBmcm9tIGluc3RydWN0aW9uCi0JbGRyCXI2LCBbc3AsIHI3LCBsc2wgIzJdCQlAIEdldCByZWdpc3RlciAnUm0nCi0JbW92CXI1LCByOCwgbHNyICM3CQkJQCBnZXQgc2hpZnQgY291bnQKLQlhbmRzCXI1LCByNSwgIzMxCisJbGRyCXI2LCBbcjIsIHI3LCBsc2wgIzJdCQlAIEdldCByZWdpc3RlciAnUm0nCisJbW92CXI5LCByOCwgbHNyICM3CQkJQCBnZXQgc2hpZnQgY291bnQKKwlhbmRzCXI5LCByOSwgIzMxCiAJYW5kCXI3LCByOCwgIzB4NzAJCQlAIGdldCBzaGlmdCB0eXBlCiAJb3JyZXEJcjcsIHI3LCAjOAkJCUAgc2hpZnQgY291bnQgPSAwCiAJYWRkCXBjLCBwYywgcjcKIAlub3AKIAotCW1vdglyNiwgcjYsIGxzbCByNQkJCUAgMDogTFNMICMhMAorCW1vdglyNiwgcjYsIGxzbCByOQkJCUAgMDogTFNMICMhMAogCWIJLmRhdGFfYXJtX2FwcGx5X3I2X2FuZF9ybgogCWIJLmRhdGFfYXJtX2FwcGx5X3I2X2FuZF9ybglAIDE6IExTTCAjMAogCW5vcApAQCAtMTQ4LDcgKzE0Niw3IEBACiAJbm9wCiAJYgkuZGF0YV91bmtub3duCQkJQCAzOiBNVUw/CiAJbm9wCi0JbW92CXI2LCByNiwgbHNyIHI1CQkJQCA0OiBMU1IgIyEwCisJbW92CXI2LCByNiwgbHNyIHI5CQkJQCA0OiBMU1IgIyEwCiAJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCiAJbW92CXI2LCByNiwgbHNyICMzMgkJCUAgNTogTFNSICMzMgogCWIJLmRhdGFfYXJtX2FwcGx5X3I2X2FuZF9ybgpAQCAtMTU2LDcgKzE1NCw3IEBACiAJbm9wCiAJYgkuZGF0YV91bmtub3duCQkJQCA3OiBNVUw/CiAJbm9wCi0JbW92CXI2LCByNiwgYXNyIHI1CQkJQCA4OiBBU1IgIyEwCisJbW92CXI2LCByNiwgYXNyIHI5CQkJQCA4OiBBU1IgIyEwCiAJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCiAJbW92CXI2LCByNiwgYXNyICMzMgkJCUAgOTogQVNSICMzMgogCWIJLmRhdGFfYXJtX2FwcGx5X3I2X2FuZF9ybgpAQCAtMTY0LDcgKzE2Miw3IEBACiAJbm9wCiAJYgkuZGF0YV91bmtub3duCQkJQCBCOiBNVUw/CiAJbm9wCi0JbW92CXI2LCByNiwgcm9yIHI1CQkJQCBDOiBST1IgIyEwCisJbW92CXI2LCByNiwgcm9yIHI5CQkJQCBDOiBST1IgIyEwCiAJYgkuZGF0YV9hcm1fYXBwbHlfcjZfYW5kX3JuCiAJbW92CXI2LCByNiwgcnJ4CQkJQCBEOiBSUlgKIAliCS5kYXRhX2FybV9hcHBseV9yNl9hbmRfcm4KQEAgLTI2OSwxNTkgKzI2Nyw1NyBAQAogCiAJCV9fSU5JVERBVEEKIAotLyoKLSAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKLSAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCi0gKi8KLQkJLnR5cGUJYXJtNl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0Ci1FTlRSWShhcm02X3Byb2Nlc3Nvcl9mdW5jdGlvbnMpCi0JCS53b3JkCWNwdV9hcm02X2RhdGFfYWJvcnQKLQkJLndvcmQJbGVnYWN5X3BhYm9ydAotCQkud29yZAljcHVfYXJtNl9wcm9jX2luaXQKLQkJLndvcmQJY3B1X2FybTZfcHJvY19maW4KLQkJLndvcmQJY3B1X2FybTZfcmVzZXQKLQkJLndvcmQJY3B1X2FybTZfZG9faWRsZQotCQkud29yZAljcHVfYXJtNl9kY2FjaGVfY2xlYW5fYXJlYQotCQkud29yZAljcHVfYXJtNl9zd2l0Y2hfbW0KLQkJLndvcmQJY3B1X2FybTZfc2V0X3B0ZV9leHQKLQkJLndvcmQJMAotCQkud29yZAkwCi0JCS53b3JkCTAKLQkJLnNpemUJYXJtNl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtNl9wcm9jZXNzb3JfZnVuY3Rpb25zCi0KLS8qCi0gKiBQdXJwb3NlIDogRnVuY3Rpb24gcG9pbnRlcnMgdXNlZCB0byBhY2Nlc3MgYWJvdmUgZnVuY3Rpb25zIC0gYWxsIGNhbGxzCi0gKgkgICAgIGNvbWUgdGhyb3VnaCB0aGVzZQotICovCi0JCS50eXBlCWFybTdfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAotRU5UUlkoYXJtN19wcm9jZXNzb3JfZnVuY3Rpb25zKQotCQkud29yZAljcHVfYXJtN19kYXRhX2Fib3J0Ci0JCS53b3JkCWxlZ2FjeV9wYWJvcnQKLQkJLndvcmQJY3B1X2FybTdfcHJvY19pbml0Ci0JCS53b3JkCWNwdV9hcm03X3Byb2NfZmluCi0JCS53b3JkCWNwdV9hcm03X3Jlc2V0Ci0JCS53b3JkCWNwdV9hcm03X2RvX2lkbGUKLQkJLndvcmQJY3B1X2FybTdfZGNhY2hlX2NsZWFuX2FyZWEKLQkJLndvcmQJY3B1X2FybTdfc3dpdGNoX21tCi0JCS53b3JkCWNwdV9hcm03X3NldF9wdGVfZXh0Ci0JCS53b3JkCTAKLQkJLndvcmQJMAotCQkud29yZAkwCi0JCS5zaXplCWFybTdfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGFybTdfcHJvY2Vzc29yX2Z1bmN0aW9ucworCQlAIGRlZmluZSBzdHJ1Y3QgcHJvY2Vzc29yIChzZWUgPGFzbS9wcm9jLWZucy5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwkJZGVmaW5lX3Byb2Nlc3Nvcl9mdW5jdGlvbnMgYXJtNiwgZGFib3J0PWNwdV9hcm02X2RhdGFfYWJvcnQsIHBhYm9ydD1sZWdhY3lfcGFib3J0CisJCWRlZmluZV9wcm9jZXNzb3JfZnVuY3Rpb25zIGFybTcsIGRhYm9ydD1jcHVfYXJtN19kYXRhX2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydAogCiAJCS5zZWN0aW9uICIucm9kYXRhIgogCi0JCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6CS5hc2NpegkiYXJtdjMiCi0JCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCi0KLQkJLnR5cGUJY3B1X2VsZl9uYW1lLCAjb2JqZWN0Ci1jcHVfZWxmX25hbWU6CS5hc2NpegkidjMiCi0JCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQotCi0JCS50eXBlCWNwdV9hcm02X25hbWUsICNvYmplY3QKLWNwdV9hcm02X25hbWU6CS5hc2NpegkiQVJNNiIKLQkJLnNpemUJY3B1X2FybTZfbmFtZSwgLiAtIGNwdV9hcm02X25hbWUKLQotCQkudHlwZQljcHVfYXJtNjEwX25hbWUsICNvYmplY3QKLWNwdV9hcm02MTBfbmFtZToKLQkJLmFzY2l6CSJBUk02MTAiCi0JCS5zaXplCWNwdV9hcm02MTBfbmFtZSwgLiAtIGNwdV9hcm02MTBfbmFtZQotCi0JCS50eXBlCWNwdV9hcm03X25hbWUsICNvYmplY3QKLWNwdV9hcm03X25hbWU6CS5hc2NpegkiQVJNNyIKLQkJLnNpemUJY3B1X2FybTdfbmFtZSwgLiAtIGNwdV9hcm03X25hbWUKLQotCQkudHlwZQljcHVfYXJtNzEwX25hbWUsICNvYmplY3QKLWNwdV9hcm03MTBfbmFtZToKLQkJLmFzY2l6CSJBUk03MTAiCi0JCS5zaXplCWNwdV9hcm03MTBfbmFtZSwgLiAtIGNwdV9hcm03MTBfbmFtZQorCQlzdHJpbmcJY3B1X2FyY2hfbmFtZSwgImFybXYzIgorCQlzdHJpbmcJY3B1X2VsZl9uYW1lLCAidjMiCisJCXN0cmluZwljcHVfYXJtNl9uYW1lLCAiQVJNNiIKKwkJc3RyaW5nCWNwdV9hcm02MTBfbmFtZSwgIkFSTTYxMCIKKwkJc3RyaW5nCWNwdV9hcm03X25hbWUsICJBUk03IgorCQlzdHJpbmcJY3B1X2FybTcxMF9uYW1lLCAiQVJNNzEwIgogCiAJCS5hbGlnbgogCiAJCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKIAotCQkudHlwZQlfX2FybTZfcHJvY19pbmZvLCAjb2JqZWN0Ci1fX2FybTZfcHJvY19pbmZvOgotCQkubG9uZwkweDQxNTYwNjAwCi0JCS5sb25nCTB4ZmZmZmZmZjAKLQkJLmxvbmcJMHgwMDAwMGMxZQorLm1hY3JvIGFybTY3X3Byb2NfaW5mbyBuYW1lOnJlcSwgY3B1X3ZhbDpyZXEsIGNwdV9tYXNrOnJlcSwgY3B1X25hbWU6cmVxLCBcCisJY3B1X21tX21tdV9mbGFnczpyZXEsIGNwdV9mbHVzaDpyZXEsIGNwdV9wcm9jX2Z1bmNzOnJlcQorCQkudHlwZQlfX1xuYW1lXCgpX3Byb2NfaW5mbywgI29iamVjdAorX19cbmFtZVwoKV9wcm9jX2luZm86CisJCS5sb25nCVxjcHVfdmFsCisJCS5sb25nCVxjcHVfbWFzaworCQkubG9uZwlcY3B1X21tX21tdV9mbGFncwogCQkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCiAJCQlQTURfQklUNCB8IFwKIAkJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQkJUE1EX1NFQ1RfQVBfUkVBRAotCQliCV9fYXJtNl9zZXR1cAorCQliCVxjcHVfZmx1c2gKIAkJLmxvbmcJY3B1X2FyY2hfbmFtZQogCQkubG9uZwljcHVfZWxmX25hbWUKIAkJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfMjZCSVQKLQkJLmxvbmcJY3B1X2FybTZfbmFtZQotCQkubG9uZwlhcm02X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkJLmxvbmcJXGNwdV9uYW1lCisJCS5sb25nCVxjcHVfcHJvY19mdW5jcwogCQkubG9uZwl2M190bGJfZm5zCiAJCS5sb25nCXYzX3VzZXJfZm5zCiAJCS5sb25nCXYzX2NhY2hlX2ZucwotCQkuc2l6ZQlfX2FybTZfcHJvY19pbmZvLCAuIC0gX19hcm02X3Byb2NfaW5mbworCQkuc2l6ZQlfX1xuYW1lXCgpX3Byb2NfaW5mbywgLiAtIF9fXG5hbWVcKClfcHJvY19pbmZvCisuZW5kbQogCi0JCS50eXBlCV9fYXJtNjEwX3Byb2NfaW5mbywgI29iamVjdAotX19hcm02MTBfcHJvY19pbmZvOgotCQkubG9uZwkweDQxNTYwNjEwCi0JCS5sb25nCTB4ZmZmZmZmZjAKLQkJLmxvbmcJMHgwMDAwMGMxZQotCQkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCi0JCQlQTURfQklUNCB8IFwKLQkJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQkJUE1EX1NFQ1RfQVBfUkVBRAotCQliCV9fYXJtNl9zZXR1cAotCQkubG9uZwljcHVfYXJjaF9uYW1lCi0JCS5sb25nCWNwdV9lbGZfbmFtZQotCQkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF8yNkJJVAotCQkubG9uZwljcHVfYXJtNjEwX25hbWUKLQkJLmxvbmcJYXJtNl9wcm9jZXNzb3JfZnVuY3Rpb25zCi0JCS5sb25nCXYzX3RsYl9mbnMKLQkJLmxvbmcJdjNfdXNlcl9mbnMKLQkJLmxvbmcJdjNfY2FjaGVfZm5zCi0JCS5zaXplCV9fYXJtNjEwX3Byb2NfaW5mbywgLiAtIF9fYXJtNjEwX3Byb2NfaW5mbwotCi0JCS50eXBlCV9fYXJtN19wcm9jX2luZm8sICNvYmplY3QKLV9fYXJtN19wcm9jX2luZm86Ci0JCS5sb25nCTB4NDEwMDcwMDAKLQkJLmxvbmcJMHhmZmZmZmYwMAotCQkubG9uZwkweDAwMDAwYzFlCi0JCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJCVBNRF9CSVQ0IHwgXAotCQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCQlQTURfU0VDVF9BUF9SRUFECi0JCWIJX19hcm03X3NldHVwCi0JCS5sb25nCWNwdV9hcmNoX25hbWUKLQkJLmxvbmcJY3B1X2VsZl9uYW1lCi0JCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQXzI2QklUCi0JCS5sb25nCWNwdV9hcm03X25hbWUKLQkJLmxvbmcJYXJtN19wcm9jZXNzb3JfZnVuY3Rpb25zCi0JCS5sb25nCXYzX3RsYl9mbnMKLQkJLmxvbmcJdjNfdXNlcl9mbnMKLQkJLmxvbmcJdjNfY2FjaGVfZm5zCi0JCS5zaXplCV9fYXJtN19wcm9jX2luZm8sIC4gLSBfX2FybTdfcHJvY19pbmZvCi0KLQkJLnR5cGUJX19hcm03MTBfcHJvY19pbmZvLCAjb2JqZWN0Ci1fX2FybTcxMF9wcm9jX2luZm86Ci0JCS5sb25nCTB4NDEwMDcxMDAKLQkJLmxvbmcJMHhmZmY4ZmYwMAotCQkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCisJYXJtNjdfcHJvY19pbmZvCWFybTYsCTB4NDE1NjA2MDAsIDB4ZmZmZmZmZjAsIGNwdV9hcm02X25hbWUsIFwKKwkJMHgwMDAwMGMxZSwgX19hcm02X3NldHVwLCBhcm02X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwlhcm02N19wcm9jX2luZm8JYXJtNjEwLAkweDQxNTYwNjEwLCAweGZmZmZmZmYwLCBjcHVfYXJtNjEwX25hbWUsIFwKKwkJMHgwMDAwMGMxZSwgX19hcm02X3NldHVwLCBhcm02X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwlhcm02N19wcm9jX2luZm8JYXJtNywJMHg0MTAwNzAwMCwgMHhmZmZmZmYwMCwgY3B1X2FybTdfbmFtZSwgXAorCQkweDAwMDAwYzFlLCBfX2FybTdfc2V0dXAsIGFybTdfcHJvY2Vzc29yX2Z1bmN0aW9ucworCWFybTY3X3Byb2NfaW5mbwlhcm03MTAsCTB4NDEwMDcxMDAsIDB4ZmZmOGZmMDAsIGNwdV9hcm03MTBfbmFtZSwgXAorCQkJUE1EX1RZUEVfU0VDVCB8IFwKIAkJCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCiAJCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCiAJCQlQTURfQklUNCB8IFwKIAkJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQkJUE1EX1NFQ1RfQVBfUkVBRAotCQkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCi0JCQlQTURfQklUNCB8IFwKLQkJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQkJUE1EX1NFQ1RfQVBfUkVBRAotCQliCV9fYXJtN19zZXR1cAotCQkubG9uZwljcHVfYXJjaF9uYW1lCi0JCS5sb25nCWNwdV9lbGZfbmFtZQotCQkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF8yNkJJVAotCQkubG9uZwljcHVfYXJtNzEwX25hbWUKLQkJLmxvbmcJYXJtN19wcm9jZXNzb3JfZnVuY3Rpb25zCi0JCS5sb25nCXYzX3RsYl9mbnMKLQkJLmxvbmcJdjNfdXNlcl9mbnMKLQkJLmxvbmcJdjNfY2FjaGVfZm5zCi0JCS5zaXplCV9fYXJtNzEwX3Byb2NfaW5mbywgLiAtIF9fYXJtNzEwX3Byb2NfaW5mbworCQkJUE1EX1NFQ1RfQVBfUkVBRCwgXAorCQlfX2FybTdfc2V0dXAsIGFybTdfcHJvY2Vzc29yX2Z1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMKaW5kZXggN2EwNmU1OS4uNTVmNGUyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTcyMC5TCkBAIC0xNjksNDYgKzE2OSwxNSBAQAogCWNydmFsCWNsZWFyPTB4MDAwMDJmM2YsIG1tdXNldD0weDAwMDAyMTNkLCB1Y3NldD0weDAwMDAwMTMwCiAKIAkJX19JTklUREFUQQotCi0vKgotICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscwotICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKLSAqLwotCQkudHlwZQlhcm03MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAotRU5UUlkoYXJtNzIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMpCi0JCS53b3JkCXY0dF9sYXRlX2Fib3J0Ci0JCS53b3JkCWxlZ2FjeV9wYWJvcnQKLQkJLndvcmQJY3B1X2FybTcyMF9wcm9jX2luaXQKLQkJLndvcmQJY3B1X2FybTcyMF9wcm9jX2ZpbgotCQkud29yZAljcHVfYXJtNzIwX3Jlc2V0Ci0JCS53b3JkCWNwdV9hcm03MjBfZG9faWRsZQotCQkud29yZAljcHVfYXJtNzIwX2RjYWNoZV9jbGVhbl9hcmVhCi0JCS53b3JkCWNwdV9hcm03MjBfc3dpdGNoX21tCi0JCS53b3JkCWNwdV9hcm03MjBfc2V0X3B0ZV9leHQKLQkJLndvcmQJMAotCQkud29yZAkwCi0JCS53b3JkCTAKLQkJLnNpemUJYXJtNzIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm03MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucworCUAgZGVmaW5lIHN0cnVjdCBwcm9jZXNzb3IgKHNlZSA8YXNtL3Byb2MtZm5zLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQorCWRlZmluZV9wcm9jZXNzb3JfZnVuY3Rpb25zIGFybTcyMCwgZGFib3J0PXY0dF9sYXRlX2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydAogCiAJCS5zZWN0aW9uICIucm9kYXRhIgogCi0JCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6CS5hc2NpegkiYXJtdjR0IgotCQkuc2l6ZQljcHVfYXJjaF9uYW1lLCAuIC0gY3B1X2FyY2hfbmFtZQotCi0JCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAotY3B1X2VsZl9uYW1lOgkuYXNjaXoJInY0IgotCQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKLQotCQkudHlwZQljcHVfYXJtNzEwX25hbWUsICNvYmplY3QKLWNwdV9hcm03MTBfbmFtZToKLQkJLmFzY2l6CSJBUk03MTBUIgotCQkuc2l6ZQljcHVfYXJtNzEwX25hbWUsIC4gLSBjcHVfYXJtNzEwX25hbWUKLQotCQkudHlwZQljcHVfYXJtNzIwX25hbWUsICNvYmplY3QKLWNwdV9hcm03MjBfbmFtZToKLQkJLmFzY2l6CSJBUk03MjBUIgotCQkuc2l6ZQljcHVfYXJtNzIwX25hbWUsIC4gLSBjcHVfYXJtNzIwX25hbWUKKwlzdHJpbmcJY3B1X2FyY2hfbmFtZSwgImFybXY0dCIKKwlzdHJpbmcJY3B1X2VsZl9uYW1lLCAidjQiCisJc3RyaW5nCWNwdV9hcm03MTBfbmFtZSwgIkFSTTcxMFQiCisJc3RyaW5nCWNwdV9hcm03MjBfbmFtZSwgIkFSTTcyMFQiCiAKIAkJLmFsaWduCiAKQEAgLTIxOCwxMCArMTg3LDExIEBACiAJCiAJCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKIAotCQkudHlwZQlfX2FybTcxMF9wcm9jX2luZm8sICNvYmplY3QKLV9fYXJtNzEwX3Byb2NfaW5mbzoKLQkJLmxvbmcJMHg0MTgwNzEwMAkJCQlAIGNwdV92YWwKLQkJLmxvbmcJMHhmZmZmZmYwMAkJCQlAIGNwdV9tYXNrCisubWFjcm8gYXJtNzIwX3Byb2NfaW5mbyBuYW1lOnJlcSwgY3B1X3ZhbDpyZXEsIGNwdV9tYXNrOnJlcSwgY3B1X25hbWU6cmVxLCBjcHVfZmx1c2g6cmVxCisJCS50eXBlCV9fXG5hbWVcKClfcHJvY19pbmZvLCNvYmplY3QKK19fXG5hbWVcKClfcHJvY19pbmZvOgorCQkubG9uZwlcY3B1X3ZhbAorCQkubG9uZwlcY3B1X21hc2sKIAkJLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAogCQkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKIAkJCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKQEAgLTIzMiwzOCArMjAyLDE3IEBACiAJCQlQTURfQklUNCB8IFwKIAkJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQkJUE1EX1NFQ1RfQVBfUkVBRAotCQliCV9fYXJtNzEwX3NldHVwCQkJCUAgY3B1X2ZsdXNoCisJCWIJXGNwdV9mbHVzaAkJCQlAIGNwdV9mbHVzaAogCQkubG9uZwljcHVfYXJjaF9uYW1lCQkJCUAgYXJjaF9uYW1lCiAJCS5sb25nCWNwdV9lbGZfbmFtZQkJCQlAIGVsZl9uYW1lCiAJCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQglAIGVsZl9od2NhcAotCQkubG9uZwljcHVfYXJtNzEwX25hbWUJCQkJQCBuYW1lCisJCS5sb25nCVxjcHVfbmFtZQogCQkubG9uZwlhcm03MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucwogCQkubG9uZwl2NF90bGJfZm5zCiAJCS5sb25nCXY0d3RfdXNlcl9mbnMKIAkJLmxvbmcJdjRfY2FjaGVfZm5zCi0JCS5zaXplCV9fYXJtNzEwX3Byb2NfaW5mbywgLiAtIF9fYXJtNzEwX3Byb2NfaW5mbworCQkuc2l6ZQlfX1xuYW1lXCgpX3Byb2NfaW5mbywgLiAtIF9fXG5hbWVcKClfcHJvY19pbmZvCisuZW5kbQogCi0JCS50eXBlCV9fYXJtNzIwX3Byb2NfaW5mbywgI29iamVjdAotX19hcm03MjBfcHJvY19pbmZvOgotCQkubG9uZwkweDQxODA3MjAwCQkJCUAgY3B1X3ZhbAotCQkubG9uZwkweGZmZmZmZjAwCQkJCUAgY3B1X21hc2sKLQkJLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKLQkJCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKLQkJCVBNRF9CSVQ0IHwgXAotCQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCQlQTURfU0VDVF9BUF9SRUFECi0JCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJCVBNRF9CSVQ0IHwgXAotCQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCQlQTURfU0VDVF9BUF9SRUFECi0JCWIJX19hcm03MjBfc2V0dXAJCQkJQCBjcHVfZmx1c2gKLQkJLmxvbmcJY3B1X2FyY2hfbmFtZQkJCQlAIGFyY2hfbmFtZQotCQkubG9uZwljcHVfZWxmX25hbWUJCQkJQCBlbGZfbmFtZQotCQkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9IQUxGIHwgSFdDQVBfVEhVTUIJQCBlbGZfaHdjYXAKLQkJLmxvbmcJY3B1X2FybTcyMF9uYW1lCQkJCUAgbmFtZQotCQkubG9uZwlhcm03MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucwotCQkubG9uZwl2NF90bGJfZm5zCi0JCS5sb25nCXY0d3RfdXNlcl9mbnMKLQkJLmxvbmcJdjRfY2FjaGVfZm5zCi0JCS5zaXplCV9fYXJtNzIwX3Byb2NfaW5mbywgLiAtIF9fYXJtNzIwX3Byb2NfaW5mbworCWFybTcyMF9wcm9jX2luZm8gYXJtNzEwLCAweDQxODA3MTAwLCAweGZmZmZmZjAwLCBjcHVfYXJtNzEwX25hbWUsIF9fYXJtNzEwX3NldHVwCisJYXJtNzIwX3Byb2NfaW5mbyBhcm03MjAsIDB4NDE4MDcyMDAsIDB4ZmZmZmZmMDAsIGNwdV9hcm03MjBfbmFtZSwgX19hcm03MjBfc2V0dXAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNzQwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTc0MC5TCmluZGV4IDZmOWQxMmUuLjQ1MDZiZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNzQwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03NDAuUwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCisjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKKwogCS50ZXh0CiAvKgogICogY3B1X2FybTc0MF9wcm9jX2luaXQoKQpAQCAtMTE1LDQyICsxMTcsMTQgQEAKIAogCV9fSU5JVERBVEEKIAotLyoKLSAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKLSAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCi0gKi8KLQkudHlwZQlhcm03NDBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAotRU5UUlkoYXJtNzQwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMpCi0JLndvcmQJdjR0X2xhdGVfYWJvcnQKLQkud29yZAlsZWdhY3lfcGFib3J0Ci0JLndvcmQJY3B1X2FybTc0MF9wcm9jX2luaXQKLQkud29yZAljcHVfYXJtNzQwX3Byb2NfZmluCi0JLndvcmQJY3B1X2FybTc0MF9yZXNldAotCS53b3JkICAgY3B1X2FybTc0MF9kb19pZGxlCi0JLndvcmQJY3B1X2FybTc0MF9kY2FjaGVfY2xlYW5fYXJlYQotCS53b3JkCWNwdV9hcm03NDBfc3dpdGNoX21tCi0JLndvcmQJMAkJCUAgY3B1Xypfc2V0X3B0ZQotCS53b3JkCTAKLQkud29yZAkwCi0JLndvcmQJMAotCS5zaXplCWFybTc0MF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtNzQwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwlAIGRlZmluZSBzdHJ1Y3QgcHJvY2Vzc29yIChzZWUgPGFzbS9wcm9jLWZucy5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBhcm03NDAsIGRhYm9ydD12NHRfbGF0ZV9hYm9ydCwgcGFib3J0PWxlZ2FjeV9wYWJvcnQsIG5vbW11PTEKIAogCS5zZWN0aW9uICIucm9kYXRhIgogCi0JLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdAotY3B1X2FyY2hfbmFtZToKLQkuYXNjaXoJImFybXY0IgotCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCi0KLQkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKLWNwdV9lbGZfbmFtZToKLQkuYXNjaXoJInY0IgotCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQotCi0JLnR5cGUJY3B1X2FybTc0MF9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJtNzQwX25hbWU6Ci0JLmFzY2lpCSJBUk03NDBUIgotCS5zaXplCWNwdV9hcm03NDBfbmFtZSwgLiAtIGNwdV9hcm03NDBfbmFtZQorCXN0cmluZwljcHVfYXJjaF9uYW1lLCAiYXJtdjQiCisJc3RyaW5nCWNwdV9lbGZfbmFtZSwgInY0IgorCXN0cmluZwljcHVfYXJtNzQwX25hbWUsICJBUk03NDBUIgogCiAJLmFsaWduCiAKQEAgLTE3MCw1ICsxNDQsMyBAQAogCS5sb25nCTAKIAkubG9uZwl2M19jYWNoZV9mbnMJCQlAIGNhY2hlIG1vZGVsCiAJLnNpemUJX19hcm03NDBfcHJvY19pbmZvLCAuIC0gX19hcm03NDBfcHJvY19pbmZvCi0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TCmluZGV4IGU0YzE2NWMuLjdlMGUxZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtN3RkbWkuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTd0ZG1pLlMKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAorI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCisKIAkudGV4dAogLyoKICAqIGNwdV9hcm03dGRtaV9wcm9jX2luaXQoKQpAQCAtNTUsMTk3ICs1Nyw1NyBAQAogCiAJCV9fSU5JVERBVEEKIAotLyoKLSAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKLSAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCi0gKi8KLQkJLnR5cGUJYXJtN3RkbWlfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAotRU5UUlkoYXJtN3RkbWlfcHJvY2Vzc29yX2Z1bmN0aW9ucykKLQkJLndvcmQJdjR0X2xhdGVfYWJvcnQKLQkJLndvcmQJbGVnYWN5X3BhYm9ydAotCQkud29yZAljcHVfYXJtN3RkbWlfcHJvY19pbml0Ci0JCS53b3JkCWNwdV9hcm03dGRtaV9wcm9jX2ZpbgotCQkud29yZAljcHVfYXJtN3RkbWlfcmVzZXQKLQkJLndvcmQJY3B1X2FybTd0ZG1pX2RvX2lkbGUKLQkJLndvcmQJY3B1X2FybTd0ZG1pX2RjYWNoZV9jbGVhbl9hcmVhCi0JCS53b3JkCWNwdV9hcm03dGRtaV9zd2l0Y2hfbW0KLQkJLndvcmQJMAkJQCBjcHVfKl9zZXRfcHRlCi0JCS53b3JkCTAKLQkJLndvcmQJMAotCQkud29yZAkwCi0JCS5zaXplCWFybTd0ZG1pX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm03dGRtaV9wcm9jZXNzb3JfZnVuY3Rpb25zCisJCUAgZGVmaW5lIHN0cnVjdCBwcm9jZXNzb3IgKHNlZSA8YXNtL3Byb2MtZm5zLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQorCQlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBhcm03dGRtaSwgZGFib3J0PXY0dF9sYXRlX2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydCwgbm9tbXU9MQogCiAJCS5zZWN0aW9uICIucm9kYXRhIgogCi0JCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6Ci0JCS5hc2NpegkiYXJtdjR0IgotCQkuc2l6ZQljcHVfYXJjaF9uYW1lLCAuIC0gY3B1X2FyY2hfbmFtZQotCi0JCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAotY3B1X2VsZl9uYW1lOgotCQkuYXNjaXoJInY0IgotCQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKLQotCQkudHlwZQljcHVfYXJtN3RkbWlfbmFtZSwgI29iamVjdAotY3B1X2FybTd0ZG1pX25hbWU6Ci0JCS5hc2NpegkiQVJNN1RETUkiCi0JCS5zaXplCWNwdV9hcm03dGRtaV9uYW1lLCAuIC0gY3B1X2FybTd0ZG1pX25hbWUKLQotCQkudHlwZQljcHVfdHJpc2NlbmRhN19uYW1lLCAjb2JqZWN0Ci1jcHVfdHJpc2NlbmRhN19uYW1lOgotCQkuYXNjaXoJIlRyaXNjZW5kLUE3eCIKLQkJLnNpemUJY3B1X3RyaXNjZW5kYTdfbmFtZSwgLiAtIGNwdV90cmlzY2VuZGE3X25hbWUKLQotCQkudHlwZQljcHVfYXQ5MV9uYW1lLCAjb2JqZWN0Ci1jcHVfYXQ5MV9uYW1lOgotCQkuYXNjaXoJIkF0bWVsLUFUOTFNNDB4eHgiCi0JCS5zaXplCWNwdV9hdDkxX25hbWUsIC4gLSBjcHVfYXQ5MV9uYW1lCi0KLQkJLnR5cGUJY3B1X3MzYzM0MTBfbmFtZSwgI29iamVjdAotY3B1X3MzYzM0MTBfbmFtZToKLQkJLmFzY2l6CSJTYW1zdW5nLVMzQzM0MTAiCi0JCS5zaXplCWNwdV9zM2MzNDEwX25hbWUsIC4gLSBjcHVfczNjMzQxMF9uYW1lCi0KLQkJLnR5cGUJY3B1X3MzYzQ0YjB4X25hbWUsICNvYmplY3QKLWNwdV9zM2M0NGIweF9uYW1lOgotCQkuYXNjaXoJIlNhbXN1bmctUzNDNDRCMHgiCi0JCS5zaXplCWNwdV9zM2M0NGIweF9uYW1lLCAuIC0gY3B1X3MzYzQ0YjB4X25hbWUKLQotCQkudHlwZQljcHVfczNjNDUxMGIsICNvYmplY3QKLWNwdV9zM2M0NTEwYl9uYW1lOgotCQkuYXNjaXoJIlNhbXN1bmctUzNDNDUxMEIiCi0JCS5zaXplCWNwdV9zM2M0NTEwYl9uYW1lLCAuIC0gY3B1X3MzYzQ1MTBiX25hbWUKLQotCQkudHlwZQljcHVfczNjNDUzMF9uYW1lLCAjb2JqZWN0Ci1jcHVfczNjNDUzMF9uYW1lOgotCQkuYXNjaXoJIlNhbXN1bmctUzNDNDUzMCIKLQkJLnNpemUJY3B1X3MzYzQ1MzBfbmFtZSwgLiAtIGNwdV9zM2M0NTMwX25hbWUKLQotCQkudHlwZQljcHVfbmV0YXJtX25hbWUsICNvYmplY3QKLWNwdV9uZXRhcm1fbmFtZToKLQkJLmFzY2l6CSJORVRBUk0iCi0JCS5zaXplCWNwdV9uZXRhcm1fbmFtZSwgLiAtIGNwdV9uZXRhcm1fbmFtZQorCQlzdHJpbmcJY3B1X2FyY2hfbmFtZSwgImFybXY0dCIKKwkJc3RyaW5nCWNwdV9lbGZfbmFtZSwgInY0IgorCQlzdHJpbmcJY3B1X2FybTd0ZG1pX25hbWUsICJBUk03VERNSSIKKwkJc3RyaW5nCWNwdV90cmlzY2VuZGE3X25hbWUsICJUcmlzY2VuZC1BN3giCisJCXN0cmluZwljcHVfYXQ5MV9uYW1lLCAiQXRtZWwtQVQ5MU00MHh4eCIKKwkJc3RyaW5nCWNwdV9zM2MzNDEwX25hbWUsICJTYW1zdW5nLVMzQzM0MTAiCisJCXN0cmluZwljcHVfczNjNDRiMHhfbmFtZSwgIlNhbXN1bmctUzNDNDRCMHgiCisJCXN0cmluZwljcHVfczNjNDUxMGJfbmFtZSwgIlNhbXN1bmctUzNDNDUxMEIiCisJCXN0cmluZwljcHVfczNjNDUzMF9uYW1lLCAiU2Ftc3VuZy1TM0M0NTMwIgorCQlzdHJpbmcJY3B1X25ldGFybV9uYW1lLCAiTkVUQVJNIgogCiAJCS5hbGlnbgogCiAJCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKIAotCQkudHlwZQlfX2FybTd0ZG1pX3Byb2NfaW5mbywgI29iamVjdAotX19hcm03dGRtaV9wcm9jX2luZm86Ci0JCS5sb25nCTB4NDEwMDc3MDAKLQkJLmxvbmcJMHhmZmY4ZmYwMAorLm1hY3JvIGFybTd0ZG1pX3Byb2NfaW5mbyBuYW1lOnJlcSwgY3B1X3ZhbDpyZXEsIGNwdV9tYXNrOnJlcSwgY3B1X25hbWU6cmVxLCBcCisJZXh0cmFfaHdjYXBzPTAKKwkJLnR5cGUJX19cbmFtZVwoKV9wcm9jX2luZm8sICNvYmplY3QKK19fXG5hbWVcKClfcHJvY19pbmZvOgorCQkubG9uZwlcY3B1X3ZhbAorCQkubG9uZwlcY3B1X21hc2sKIAkJLmxvbmcJMAogCQkubG9uZwkwCiAJCWIJX19hcm03dGRtaV9zZXR1cAogCQkubG9uZwljcHVfYXJjaF9uYW1lCiAJCS5sb25nCWNwdV9lbGZfbmFtZQotCQkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF8yNkJJVAotCQkubG9uZwljcHVfYXJtN3RkbWlfbmFtZQorCQkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF8yNkJJVCB8ICggXGV4dHJhX2h3Y2FwcyApCisJCS5sb25nCVxjcHVfbmFtZQogCQkubG9uZwlhcm03dGRtaV9wcm9jZXNzb3JfZnVuY3Rpb25zCiAJCS5sb25nCTAKIAkJLmxvbmcJMAogCQkubG9uZwl2NF9jYWNoZV9mbnMKLQkJLnNpemUJX19hcm03dGRtaV9wcm9jX2luZm8sIC4gLSBfX2FybTdkbWlfcHJvY19pbmZvCisJCS5zaXplCV9fXG5hbWVcKClfcHJvY19pbmZvLCAuIC0gX19cbmFtZVwoKV9wcm9jX2luZm8KKy5lbmRtCiAKLQkJLnR5cGUJX190cmlzY2VuZGE3X3Byb2NfaW5mbywgI29iamVjdAotX190cmlzY2VuZGE3X3Byb2NfaW5mbzoKLQkJLmxvbmcJMHgwMDAxZDJmZgotCQkubG9uZwkweDAwMDFmZmZmCi0JCS5sb25nCTAKLQkJLmxvbmcJMAotCQliCV9fYXJtN3RkbWlfc2V0dXAKLQkJLmxvbmcJY3B1X2FyY2hfbmFtZQotCQkubG9uZwljcHVfZWxmX25hbWUKLQkJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfVEhVTUIgfCBIV0NBUF8yNkJJVAotCQkubG9uZwljcHVfdHJpc2NlbmRhN19uYW1lCi0JCS5sb25nCWFybTd0ZG1pX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKLQkJLmxvbmcJMAotCQkubG9uZwkwCi0JCS5sb25nCXY0X2NhY2hlX2ZucwotCQkuc2l6ZQlfX3RyaXNjZW5kYTdfcHJvY19pbmZvLCAuIC0gX190cmlzY2VuZGE3X3Byb2NfaW5mbwotCi0JCS50eXBlCV9fYXQ5MV9wcm9jX2luZm8sICNvYmplY3QKLV9fYXQ5MV9wcm9jX2luZm86Ci0JCS5sb25nCTB4MTQwMDAwNDAKLQkJLmxvbmcJMHhmZmYwMDBlMAotCQkubG9uZwkwCi0JCS5sb25nCTAKLQkJYglfX2FybTd0ZG1pX3NldHVwCi0JCS5sb25nCWNwdV9hcmNoX25hbWUKLQkJLmxvbmcJY3B1X2VsZl9uYW1lCi0JCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX1RIVU1CIHwgSFdDQVBfMjZCSVQKLQkJLmxvbmcJY3B1X2F0OTFfbmFtZQotCQkubG9uZwlhcm03dGRtaV9wcm9jZXNzb3JfZnVuY3Rpb25zCi0JCS5sb25nCTAKLQkJLmxvbmcJMAotCQkubG9uZwl2NF9jYWNoZV9mbnMKLQkJLnNpemUJX19hdDkxX3Byb2NfaW5mbywgLiAtIF9fYXQ5MV9wcm9jX2luZm8KLQotCQkudHlwZQlfX3MzYzQ1MTBiX3Byb2NfaW5mbywgI29iamVjdAotX19zM2M0NTEwYl9wcm9jX2luZm86Ci0JCS5sb25nCTB4MzYzNjUwMDAKLQkJLmxvbmcJMHhmZmZmZjAwMAotCQkubG9uZwkwCi0JCS5sb25nCTAKLQkJYglfX2FybTd0ZG1pX3NldHVwCi0JCS5sb25nCWNwdV9hcmNoX25hbWUKLQkJLmxvbmcJY3B1X2VsZl9uYW1lCi0JCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX1RIVU1CIHwgSFdDQVBfMjZCSVQKLQkJLmxvbmcJY3B1X3MzYzQ1MTBiX25hbWUKLQkJLmxvbmcJYXJtN3RkbWlfcHJvY2Vzc29yX2Z1bmN0aW9ucwotCQkubG9uZwkwCi0JCS5sb25nCTAKLQkJLmxvbmcJdjRfY2FjaGVfZm5zCi0JCS5zaXplCV9fczNjNDUxMGJfcHJvY19pbmZvLCAuIC0gX19zM2M0NTEwYl9wcm9jX2luZm8KLQotCQkudHlwZQlfX3MzYzQ1MzBfcHJvY19pbmZvLCAjb2JqZWN0Ci1fX3MzYzQ1MzBfcHJvY19pbmZvOgotCQkubG9uZwkweDRjMDAwMDAwCi0JCS5sb25nCTB4ZmZmMDAwZTAKLQkJLmxvbmcJMAotCQkubG9uZwkwCi0JCWIJX19hcm03dGRtaV9zZXR1cAotCQkubG9uZwljcHVfYXJjaF9uYW1lCi0JCS5sb25nCWNwdV9lbGZfbmFtZQotCQkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9USFVNQiB8IEhXQ0FQXzI2QklUCi0JCS5sb25nCWNwdV9zM2M0NTMwX25hbWUKLQkJLmxvbmcJYXJtN3RkbWlfcHJvY2Vzc29yX2Z1bmN0aW9ucwotCQkubG9uZwkwCi0JCS5sb25nCTAKLQkJLmxvbmcJdjRfY2FjaGVfZm5zCi0JCS5zaXplCV9fczNjNDUzMF9wcm9jX2luZm8sIC4gLSBfX3MzYzQ1MzBfcHJvY19pbmZvCi0KLQkJLnR5cGUJX19zM2MzNDEwX3Byb2NfaW5mbywgI29iamVjdAotX19zM2MzNDEwX3Byb2NfaW5mbzoKLQkJLmxvbmcJMHgzNDEwMDAwMAotCQkubG9uZwkweGZmZmYwMDAwCi0JCS5sb25nCTAKLQkJLmxvbmcJMAotCQliCV9fYXJtN3RkbWlfc2V0dXAKLQkJLmxvbmcJY3B1X2FyY2hfbmFtZQotCQkubG9uZwljcHVfZWxmX25hbWUKLQkJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfVEhVTUIgfCBIV0NBUF8yNkJJVAotCQkubG9uZwljcHVfczNjMzQxMF9uYW1lCi0JCS5sb25nCWFybTd0ZG1pX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKLQkJLmxvbmcJMAotCQkubG9uZwkwCi0JCS5sb25nCXY0X2NhY2hlX2ZucwotCQkuc2l6ZQlfX3MzYzM0MTBfcHJvY19pbmZvLCAuIC0gX19zM2MzNDEwX3Byb2NfaW5mbwotCi0JCS50eXBlCV9fczNjNDRiMHhfcHJvY19pbmZvLCAjb2JqZWN0Ci1fX3MzYzQ0YjB4X3Byb2NfaW5mbzoKLQkJLmxvbmcJMHg0NGIwMDAwMAotCQkubG9uZwkweGZmZmYwMDAwCi0JCS5sb25nCTAKLQkJLmxvbmcJMAotCQliCV9fYXJtN3RkbWlfc2V0dXAKLQkJLmxvbmcJY3B1X2FyY2hfbmFtZQotCQkubG9uZwljcHVfZWxmX25hbWUKLQkJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfVEhVTUIgfCBIV0NBUF8yNkJJVAotCQkubG9uZwljcHVfczNjNDRiMHhfbmFtZQotCQkubG9uZwlhcm03dGRtaV9wcm9jZXNzb3JfZnVuY3Rpb25zCi0JCS5sb25nCTAKLQkJLmxvbmcJMAotCQkubG9uZwl2NF9jYWNoZV9mbnMKLQkJLnNpemUJX19zM2M0NGIweF9wcm9jX2luZm8sIC4gLSBfX3MzYzQ0YjB4X3Byb2NfaW5mbworCQlhcm03dGRtaV9wcm9jX2luZm8gYXJtN3RkbWksIDB4NDEwMDc3MDAsIDB4ZmZmOGZmMDAsIFwKKwkJCWNwdV9hcm03dGRtaV9uYW1lCisJCWFybTd0ZG1pX3Byb2NfaW5mbyB0cmlzY2VuZGE3LCAweDAwMDFkMmZmLCAweDAwMDFmZmZmLCBcCisJCQljcHVfdHJpc2NlbmRhN19uYW1lLCBleHRyYV9od2NhcHM9SFdDQVBfVEhVTUIKKwkJYXJtN3RkbWlfcHJvY19pbmZvIGF0OTEsIDB4MTQwMDAwNDAsIDB4ZmZmMDAwZTAsIFwKKwkJCWNwdV9hdDkxX25hbWUsIGV4dHJhX2h3Y2Fwcz1IV0NBUF9USFVNQgorCQlhcm03dGRtaV9wcm9jX2luZm8gczNjNDUxMGIsIDB4MzYzNjUwMDAsIDB4ZmZmZmYwMDAsIFwKKwkJCWNwdV9zM2M0NTEwYl9uYW1lLCBleHRyYV9od2NhcHM9SFdDQVBfVEhVTUIKKwkJYXJtN3RkbWlfcHJvY19pbmZvIHMzYzQ1MzAsIDB4NGMwMDAwMDAsIDB4ZmZmMDAwZTAsIFwKKwkJCWNwdV9zM2M0NTMwX25hbWUsIGV4dHJhX2h3Y2Fwcz1IV0NBUF9USFVNQgorCQlhcm03dGRtaV9wcm9jX2luZm8gczNjMzQxMCwgMHgzNDEwMDAwMCwgMHhmZmZmMDAwMCwgXAorCQkJY3B1X3MzYzM0MTBfbmFtZSwgZXh0cmFfaHdjYXBzPUhXQ0FQX1RIVU1CCisJCWFybTd0ZG1pX3Byb2NfaW5mbyBzM2M0NGIweCwgMHg0NGIwMDAwMCwgMHhmZmZmMDAwMCwgXAorCQkJY3B1X3MzYzQ0YjB4X25hbWUsIGV4dHJhX2h3Y2Fwcz1IV0NBUF9USFVNQgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIwLlMKaW5kZXggYmY4YTFkMS4uOTJiZDEwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMC5TCkBAIC0zMTUsMTggKzMxNSw4IEBACiAJbW92CXBjLCBscgogRU5EUFJPQyhhcm05MjBfZG1hX3VubWFwX2FyZWEpCiAKLUVOVFJZKGFybTkyMF9jYWNoZV9mbnMpCi0JLmxvbmcJYXJtOTIwX2ZsdXNoX2ljYWNoZV9hbGwKLQkubG9uZwlhcm05MjBfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLQkubG9uZwlhcm05MjBfZmx1c2hfdXNlcl9jYWNoZV9hbGwKLQkubG9uZwlhcm05MjBfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQotCS5sb25nCWFybTkyMF9jb2hlcmVudF9rZXJuX3JhbmdlCi0JLmxvbmcJYXJtOTIwX2NvaGVyZW50X3VzZXJfcmFuZ2UKLQkubG9uZwlhcm05MjBfZmx1c2hfa2Vybl9kY2FjaGVfYXJlYQotCS5sb25nCWFybTkyMF9kbWFfbWFwX2FyZWEKLQkubG9uZwlhcm05MjBfZG1hX3VubWFwX2FyZWEKLQkubG9uZwlhcm05MjBfZG1hX2ZsdXNoX3JhbmdlCi0KKwlAIGRlZmluZSBzdHJ1Y3QgY3B1X2NhY2hlX2ZucyAoc2VlIDxhc20vY2FjaGVmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfY2FjaGVfZnVuY3Rpb25zIGFybTkyMAogI2VuZGlmCiAKIApAQCAtNDE2LDkgKzQwNiw2IEBACiAJCSAgICAgUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgUE1EX0JJVDQgfCBQTURfU0VDVF9BUF9XUklURQogCWIJY3B1X3Jlc3VtZV9tbXUKIEVORFBST0MoY3B1X2FybTkyMF9kb19yZXN1bWUpCi0jZWxzZQotI2RlZmluZSBjcHVfYXJtOTIwX2RvX3N1c3BlbmQJMAotI2RlZmluZSBjcHVfYXJtOTIwX2RvX3Jlc3VtZQkwCiAjZW5kaWYKIAogCV9fQ1BVSU5JVApAQCAtNDUwLDQzICs0MzcsMTQgQEAKIAljcnZhbAljbGVhcj0weDAwMDAzZjNmLCBtbXVzZXQ9MHgwMDAwMzEzNSwgdWNzZXQ9MHgwMDAwMTEzMAogCiAJX19JTklUREFUQQotCi0vKgotICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscwotICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKLSAqLwotCS50eXBlCWFybTkyMF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0Ci1hcm05MjBfcHJvY2Vzc29yX2Z1bmN0aW9uczoKLQkud29yZAl2NHRfZWFybHlfYWJvcnQKLQkud29yZAlsZWdhY3lfcGFib3J0Ci0JLndvcmQJY3B1X2FybTkyMF9wcm9jX2luaXQKLQkud29yZAljcHVfYXJtOTIwX3Byb2NfZmluCi0JLndvcmQJY3B1X2FybTkyMF9yZXNldAotCS53b3JkICAgY3B1X2FybTkyMF9kb19pZGxlCi0JLndvcmQJY3B1X2FybTkyMF9kY2FjaGVfY2xlYW5fYXJlYQotCS53b3JkCWNwdV9hcm05MjBfc3dpdGNoX21tCi0JLndvcmQJY3B1X2FybTkyMF9zZXRfcHRlX2V4dAotCS53b3JkCWNwdV9hcm05MjBfc3VzcGVuZF9zaXplCi0JLndvcmQJY3B1X2FybTkyMF9kb19zdXNwZW5kCi0JLndvcmQJY3B1X2FybTkyMF9kb19yZXN1bWUKLQkuc2l6ZQlhcm05MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGFybTkyMF9wcm9jZXNzb3JfZnVuY3Rpb25zCisJQCBkZWZpbmUgc3RydWN0IHByb2Nlc3NvciAoc2VlIDxhc20vcHJvYy1mbnMuaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX3Byb2Nlc3Nvcl9mdW5jdGlvbnMgYXJtOTIwLCBkYWJvcnQ9djR0X2Vhcmx5X2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydCwgc3VzcGVuZD0xCiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKIAotCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6Ci0JLmFzY2l6CSJhcm12NHQiCi0JLnNpemUJY3B1X2FyY2hfbmFtZSwgLiAtIGNwdV9hcmNoX25hbWUKLQotCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAotY3B1X2VsZl9uYW1lOgotCS5hc2NpegkidjQiCi0JLnNpemUJY3B1X2VsZl9uYW1lLCAuIC0gY3B1X2VsZl9uYW1lCi0KLQkudHlwZQljcHVfYXJtOTIwX25hbWUsICNvYmplY3QKLWNwdV9hcm05MjBfbmFtZToKLQkuYXNjaXoJIkFSTTkyMFQiCi0JLnNpemUJY3B1X2FybTkyMF9uYW1lLCAuIC0gY3B1X2FybTkyMF9uYW1lCisJc3RyaW5nCWNwdV9hcmNoX25hbWUsICJhcm12NHQiCisJc3RyaW5nCWNwdV9lbGZfbmFtZSwgInY0IgorCXN0cmluZwljcHVfYXJtOTIwX25hbWUsICJBUk05MjBUIgogCiAJLmFsaWduCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIyLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMi5TCmluZGV4IDk1YmExZmMuLjQ5MGUxODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIyLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjIuUwpAQCAtMzE3LDE4ICszMTcsOCBAQAogCW1vdglwYywgbHIKIEVORFBST0MoYXJtOTIyX2RtYV91bm1hcF9hcmVhKQogCi1FTlRSWShhcm05MjJfY2FjaGVfZm5zKQotCS5sb25nCWFybTkyMl9mbHVzaF9pY2FjaGVfYWxsCi0JLmxvbmcJYXJtOTIyX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCi0JLmxvbmcJYXJtOTIyX2ZsdXNoX3VzZXJfY2FjaGVfYWxsCi0JLmxvbmcJYXJtOTIyX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKLQkubG9uZwlhcm05MjJfY29oZXJlbnRfa2Vybl9yYW5nZQotCS5sb25nCWFybTkyMl9jb2hlcmVudF91c2VyX3JhbmdlCi0JLmxvbmcJYXJtOTIyX2ZsdXNoX2tlcm5fZGNhY2hlX2FyZWEKLQkubG9uZwlhcm05MjJfZG1hX21hcF9hcmVhCi0JLmxvbmcJYXJtOTIyX2RtYV91bm1hcF9hcmVhCi0JLmxvbmcJYXJtOTIyX2RtYV9mbHVzaF9yYW5nZQotCisJQCBkZWZpbmUgc3RydWN0IGNwdV9jYWNoZV9mbnMgKHNlZSA8YXNtL2NhY2hlZmx1c2guaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX2NhY2hlX2Z1bmN0aW9ucyBhcm05MjIKICNlbmRpZgogCiAKQEAgLTQyMCw0MyArNDEwLDE0IEBACiAJY3J2YWwJY2xlYXI9MHgwMDAwM2YzZiwgbW11c2V0PTB4MDAwMDMxMzUsIHVjc2V0PTB4MDAwMDExMzAKIAogCV9fSU5JVERBVEEKLQotLyoKLSAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKLSAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCi0gKi8KLQkudHlwZQlhcm05MjJfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAotYXJtOTIyX3Byb2Nlc3Nvcl9mdW5jdGlvbnM6Ci0JLndvcmQJdjR0X2Vhcmx5X2Fib3J0Ci0JLndvcmQJbGVnYWN5X3BhYm9ydAotCS53b3JkCWNwdV9hcm05MjJfcHJvY19pbml0Ci0JLndvcmQJY3B1X2FybTkyMl9wcm9jX2ZpbgotCS53b3JkCWNwdV9hcm05MjJfcmVzZXQKLQkud29yZCAgIGNwdV9hcm05MjJfZG9faWRsZQotCS53b3JkCWNwdV9hcm05MjJfZGNhY2hlX2NsZWFuX2FyZWEKLQkud29yZAljcHVfYXJtOTIyX3N3aXRjaF9tbQotCS53b3JkCWNwdV9hcm05MjJfc2V0X3B0ZV9leHQKLQkud29yZAkwCi0JLndvcmQJMAotCS53b3JkCTAKLQkuc2l6ZQlhcm05MjJfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGFybTkyMl9wcm9jZXNzb3JfZnVuY3Rpb25zCisJQCBkZWZpbmUgc3RydWN0IHByb2Nlc3NvciAoc2VlIDxhc20vcHJvYy1mbnMuaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX3Byb2Nlc3Nvcl9mdW5jdGlvbnMgYXJtOTIyLCBkYWJvcnQ9djR0X2Vhcmx5X2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydAogCiAJLnNlY3Rpb24gIi5yb2RhdGEiCiAKLQkudHlwZQljcHVfYXJjaF9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJjaF9uYW1lOgotCS5hc2NpegkiYXJtdjR0IgotCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCi0KLQkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKLWNwdV9lbGZfbmFtZToKLQkuYXNjaXoJInY0IgotCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQotCi0JLnR5cGUJY3B1X2FybTkyMl9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJtOTIyX25hbWU6Ci0JLmFzY2l6CSJBUk05MjJUIgotCS5zaXplCWNwdV9hcm05MjJfbmFtZSwgLiAtIGNwdV9hcm05MjJfbmFtZQorCXN0cmluZwljcHVfYXJjaF9uYW1lLCAiYXJtdjR0IgorCXN0cmluZwljcHVfZWxmX25hbWUsICJ2NCIKKwlzdHJpbmcJY3B1X2FybTkyMl9uYW1lLCAiQVJNOTIyVCIKIAogCS5hbGlnbgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyNS5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjUuUwppbmRleCA1NDFlNDc3Li41MWQ0OTRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyNS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI1LlMKQEAgLTM3MiwxNyArMzcyLDggQEAKIAltb3YJcGMsIGxyCiBFTkRQUk9DKGFybTkyNV9kbWFfdW5tYXBfYXJlYSkKIAotRU5UUlkoYXJtOTI1X2NhY2hlX2ZucykKLQkubG9uZwlhcm05MjVfZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCWFybTkyNV9mbHVzaF9rZXJuX2NhY2hlX2FsbAotCS5sb25nCWFybTkyNV9mbHVzaF91c2VyX2NhY2hlX2FsbAotCS5sb25nCWFybTkyNV9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJYXJtOTI1X2NvaGVyZW50X2tlcm5fcmFuZ2UKLQkubG9uZwlhcm05MjVfY29oZXJlbnRfdXNlcl9yYW5nZQotCS5sb25nCWFybTkyNV9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJYXJtOTI1X2RtYV9tYXBfYXJlYQotCS5sb25nCWFybTkyNV9kbWFfdW5tYXBfYXJlYQotCS5sb25nCWFybTkyNV9kbWFfZmx1c2hfcmFuZ2UKKwlAIGRlZmluZSBzdHJ1Y3QgY3B1X2NhY2hlX2ZucyAoc2VlIDxhc20vY2FjaGVmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfY2FjaGVfZnVuY3Rpb25zIGFybTkyNQogCiBFTlRSWShjcHVfYXJtOTI1X2RjYWNoZV9jbGVhbl9hcmVhKQogI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKQEAgLTQ4Nyw1MiArNDc4LDI0IEBACiAJY3J2YWwJY2xlYXI9MHgwMDAwN2YzZiwgbW11c2V0PTB4MDAwMDMxM2QsIHVjc2V0PTB4MDAwMDExMzAKIAogCV9fSU5JVERBVEEKLQotLyoKLSAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKLSAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCi0gKi8KLQkudHlwZQlhcm05MjVfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAotYXJtOTI1X3Byb2Nlc3Nvcl9mdW5jdGlvbnM6Ci0JLndvcmQJdjR0X2Vhcmx5X2Fib3J0Ci0JLndvcmQJbGVnYWN5X3BhYm9ydAotCS53b3JkCWNwdV9hcm05MjVfcHJvY19pbml0Ci0JLndvcmQJY3B1X2FybTkyNV9wcm9jX2ZpbgotCS53b3JkCWNwdV9hcm05MjVfcmVzZXQKLQkud29yZCAgIGNwdV9hcm05MjVfZG9faWRsZQotCS53b3JkCWNwdV9hcm05MjVfZGNhY2hlX2NsZWFuX2FyZWEKLQkud29yZAljcHVfYXJtOTI1X3N3aXRjaF9tbQotCS53b3JkCWNwdV9hcm05MjVfc2V0X3B0ZV9leHQKLQkud29yZAkwCi0JLndvcmQJMAotCS53b3JkCTAKLQkuc2l6ZQlhcm05MjVfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGFybTkyNV9wcm9jZXNzb3JfZnVuY3Rpb25zCisJQCBkZWZpbmUgc3RydWN0IHByb2Nlc3NvciAoc2VlIDxhc20vcHJvYy1mbnMuaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX3Byb2Nlc3Nvcl9mdW5jdGlvbnMgYXJtOTI1LCBkYWJvcnQ9djR0X2Vhcmx5X2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydAogCiAJLnNlY3Rpb24gIi5yb2RhdGEiCiAKLQkudHlwZQljcHVfYXJjaF9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJjaF9uYW1lOgotCS5hc2NpegkiYXJtdjR0IgotCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCi0KLQkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKLWNwdV9lbGZfbmFtZToKLQkuYXNjaXoJInY0IgotCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQotCi0JLnR5cGUJY3B1X2FybTkyNV9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJtOTI1X25hbWU6Ci0JLmFzY2l6CSJBUk05MjVUIgotCS5zaXplCWNwdV9hcm05MjVfbmFtZSwgLiAtIGNwdV9hcm05MjVfbmFtZQorCXN0cmluZwljcHVfYXJjaF9uYW1lLCAiYXJtdjR0IgorCXN0cmluZwljcHVfZWxmX25hbWUsICJ2NCIKKwlzdHJpbmcJY3B1X2FybTkyNV9uYW1lLCAiQVJNOTI1VCIKIAogCS5hbGlnbgogCiAJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgogCi0JLnR5cGUJX19hcm05MjVfcHJvY19pbmZvLCNvYmplY3QKLV9fYXJtOTI1X3Byb2NfaW5mbzoKLQkubG9uZwkweDU0MDI5MjUwCi0JLmxvbmcJMHhmZmZmZmZmMAorLm1hY3JvIGFybTkyNV9wcm9jX2luZm8gbmFtZTpyZXEsIGNwdV92YWw6cmVxLCBjcHVfbWFzazpyZXEsIGNwdV9uYW1lOnJlcSwgY2FjaGUKKwkudHlwZQlfX1xuYW1lXCgpX3Byb2NfaW5mbywjb2JqZWN0CitfX1xuYW1lXCgpX3Byb2NfaW5mbzoKKwkubG9uZwlcY3B1X3ZhbAorCS5sb25nCVxjcHVfbWFzawogCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKIAkJUE1EX0JJVDQgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXApAQCAtNTUwLDI3ICs1MTMsOCBAQAogCS5sb25nCXY0d2JpX3RsYl9mbnMKIAkubG9uZwl2NHdiX3VzZXJfZm5zCiAJLmxvbmcJYXJtOTI1X2NhY2hlX2ZucwotCS5zaXplCV9fYXJtOTI1X3Byb2NfaW5mbywgLiAtIF9fYXJtOTI1X3Byb2NfaW5mbworCS5zaXplCV9fXG5hbWVcKClfcHJvY19pbmZvLCAuIC0gX19cbmFtZVwoKV9wcm9jX2luZm8KKy5lbmRtCiAKLQkudHlwZQlfX2FybTkxNV9wcm9jX2luZm8sI29iamVjdAotX19hcm05MTVfcHJvY19pbmZvOgotCS5sb25nCTB4NTQwMjkxNTAKLQkubG9uZwkweGZmZmZmZmYwCi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfQklUNCB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCi0JCVBNRF9CSVQ0IHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCWIJX19hcm05MjVfc2V0dXAKLQkubG9uZwljcHVfYXJjaF9uYW1lCi0JLmxvbmcJY3B1X2VsZl9uYW1lCi0JLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRiB8IEhXQ0FQX1RIVU1CCi0JLmxvbmcJY3B1X2FybTkyNV9uYW1lCi0JLmxvbmcJYXJtOTI1X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKLQkubG9uZwl2NHdiaV90bGJfZm5zCi0JLmxvbmcJdjR3Yl91c2VyX2ZucwotCS5sb25nCWFybTkyNV9jYWNoZV9mbnMKLQkuc2l6ZQlfX2FybTkyNV9wcm9jX2luZm8sIC4gLSBfX2FybTkyNV9wcm9jX2luZm8KKwlhcm05MjVfcHJvY19pbmZvIGFybTkyNSwgMHg1NDAyOTI1MCwgMHhmZmZmZmZmMCwgY3B1X2FybTkyNV9uYW1lCisJYXJtOTI1X3Byb2NfaW5mbyBhcm05MTUsIDB4NTQwMjkxNTAsIDB4ZmZmZmZmZjAsIGNwdV9hcm05MjVfbmFtZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMKaW5kZXggMGVkODVkOS4uMmJiY2YwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TCkBAIC0zMzUsMTcgKzMzNSw4IEBACiAJbW92CXBjLCBscgogRU5EUFJPQyhhcm05MjZfZG1hX3VubWFwX2FyZWEpCiAKLUVOVFJZKGFybTkyNl9jYWNoZV9mbnMpCi0JLmxvbmcJYXJtOTI2X2ZsdXNoX2ljYWNoZV9hbGwKLQkubG9uZwlhcm05MjZfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLQkubG9uZwlhcm05MjZfZmx1c2hfdXNlcl9jYWNoZV9hbGwKLQkubG9uZwlhcm05MjZfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQotCS5sb25nCWFybTkyNl9jb2hlcmVudF9rZXJuX3JhbmdlCi0JLmxvbmcJYXJtOTI2X2NvaGVyZW50X3VzZXJfcmFuZ2UKLQkubG9uZwlhcm05MjZfZmx1c2hfa2Vybl9kY2FjaGVfYXJlYQotCS5sb25nCWFybTkyNl9kbWFfbWFwX2FyZWEKLQkubG9uZwlhcm05MjZfZG1hX3VubWFwX2FyZWEKLQkubG9uZwlhcm05MjZfZG1hX2ZsdXNoX3JhbmdlCisJQCBkZWZpbmUgc3RydWN0IGNwdV9jYWNoZV9mbnMgKHNlZSA8YXNtL2NhY2hlZmx1c2guaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX2NhY2hlX2Z1bmN0aW9ucyBhcm05MjYKIAogRU5UUlkoY3B1X2FybTkyNl9kY2FjaGVfY2xlYW5fYXJlYSkKICNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICkBAIC00MzAsOSArNDIxLDYgQEAKIAkJICAgICBQTURfU0VDVF9DQUNIRUFCTEUgfCBQTURfQklUNCB8IFBNRF9TRUNUX0FQX1dSSVRFCiAJYgljcHVfcmVzdW1lX21tdQogRU5EUFJPQyhjcHVfYXJtOTI2X2RvX3Jlc3VtZSkKLSNlbHNlCi0jZGVmaW5lIGNwdV9hcm05MjZfZG9fc3VzcGVuZAkwCi0jZGVmaW5lIGNwdV9hcm05MjZfZG9fcmVzdW1lCTAKICNlbmRpZgogCiAJX19DUFVJTklUCkBAIC00NzUsNDIgKzQ2MywxNCBAQAogCiAJX19JTklUREFUQQogCi0vKgotICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscwotICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKLSAqLwotCS50eXBlCWFybTkyNl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0Ci1hcm05MjZfcHJvY2Vzc29yX2Z1bmN0aW9uczoKLQkud29yZAl2NXRqX2Vhcmx5X2Fib3J0Ci0JLndvcmQJbGVnYWN5X3BhYm9ydAotCS53b3JkCWNwdV9hcm05MjZfcHJvY19pbml0Ci0JLndvcmQJY3B1X2FybTkyNl9wcm9jX2ZpbgotCS53b3JkCWNwdV9hcm05MjZfcmVzZXQKLQkud29yZAljcHVfYXJtOTI2X2RvX2lkbGUKLQkud29yZAljcHVfYXJtOTI2X2RjYWNoZV9jbGVhbl9hcmVhCi0JLndvcmQJY3B1X2FybTkyNl9zd2l0Y2hfbW0KLQkud29yZAljcHVfYXJtOTI2X3NldF9wdGVfZXh0Ci0JLndvcmQJY3B1X2FybTkyNl9zdXNwZW5kX3NpemUKLQkud29yZAljcHVfYXJtOTI2X2RvX3N1c3BlbmQKLQkud29yZAljcHVfYXJtOTI2X2RvX3Jlc3VtZQotCS5zaXplCWFybTkyNl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtOTI2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwlAIGRlZmluZSBzdHJ1Y3QgcHJvY2Vzc29yIChzZWUgPGFzbS9wcm9jLWZucy5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBhcm05MjYsIGRhYm9ydD12NXRqX2Vhcmx5X2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydCwgc3VzcGVuZD0xCiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKIAotCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6Ci0JLmFzY2l6CSJhcm12NXRlaiIKLQkuc2l6ZQljcHVfYXJjaF9uYW1lLCAuIC0gY3B1X2FyY2hfbmFtZQotCi0JLnR5cGUJY3B1X2VsZl9uYW1lLCAjb2JqZWN0Ci1jcHVfZWxmX25hbWU6Ci0JLmFzY2l6CSJ2NSIKLQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKLQotCS50eXBlCWNwdV9hcm05MjZfbmFtZSwgI29iamVjdAotY3B1X2FybTkyNl9uYW1lOgotCS5hc2NpegkiQVJNOTI2RUotUyIKLQkuc2l6ZQljcHVfYXJtOTI2X25hbWUsIC4gLSBjcHVfYXJtOTI2X25hbWUKKwlzdHJpbmcJY3B1X2FyY2hfbmFtZSwgImFybXY1dGVqIgorCXN0cmluZwljcHVfZWxmX25hbWUsICJ2NSIKKwlzdHJpbmcJY3B1X2FybTkyNl9uYW1lLCAiQVJNOTI2RUotUyIKIAogCS5hbGlnbgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTk0MC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDAuUwppbmRleCAyNmFlYTNmLi5hYzc1MGQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTk0MC5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQwLlMKQEAgLTI2NCwxNyArMjY0LDggQEAKIAltb3YJcGMsIGxyCiBFTkRQUk9DKGFybTk0MF9kbWFfdW5tYXBfYXJlYSkKIAotRU5UUlkoYXJtOTQwX2NhY2hlX2ZucykKLQkubG9uZwlhcm05NDBfZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCWFybTk0MF9mbHVzaF9rZXJuX2NhY2hlX2FsbAotCS5sb25nCWFybTk0MF9mbHVzaF91c2VyX2NhY2hlX2FsbAotCS5sb25nCWFybTk0MF9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJYXJtOTQwX2NvaGVyZW50X2tlcm5fcmFuZ2UKLQkubG9uZwlhcm05NDBfY29oZXJlbnRfdXNlcl9yYW5nZQotCS5sb25nCWFybTk0MF9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJYXJtOTQwX2RtYV9tYXBfYXJlYQotCS5sb25nCWFybTk0MF9kbWFfdW5tYXBfYXJlYQotCS5sb25nCWFybTk0MF9kbWFfZmx1c2hfcmFuZ2UKKwlAIGRlZmluZSBzdHJ1Y3QgY3B1X2NhY2hlX2ZucyAoc2VlIDxhc20vY2FjaGVmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfY2FjaGVfZnVuY3Rpb25zIGFybTk0MAogCiAJX19DUFVJTklUCiAKQEAgLTM0OCw0MiArMzM5LDE0IEBACiAKIAlfX0lOSVREQVRBCiAKLS8qCi0gKiBQdXJwb3NlIDogRnVuY3Rpb24gcG9pbnRlcnMgdXNlZCB0byBhY2Nlc3MgYWJvdmUgZnVuY3Rpb25zIC0gYWxsIGNhbGxzCi0gKgkgICAgIGNvbWUgdGhyb3VnaCB0aGVzZQotICovCi0JLnR5cGUJYXJtOTQwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKLUVOVFJZKGFybTk0MF9wcm9jZXNzb3JfZnVuY3Rpb25zKQotCS53b3JkCW5vbW11X2Vhcmx5X2Fib3J0Ci0JLndvcmQJbGVnYWN5X3BhYm9ydAotCS53b3JkCWNwdV9hcm05NDBfcHJvY19pbml0Ci0JLndvcmQJY3B1X2FybTk0MF9wcm9jX2ZpbgotCS53b3JkCWNwdV9hcm05NDBfcmVzZXQKLQkud29yZCAgIGNwdV9hcm05NDBfZG9faWRsZQotCS53b3JkCWNwdV9hcm05NDBfZGNhY2hlX2NsZWFuX2FyZWEKLQkud29yZAljcHVfYXJtOTQwX3N3aXRjaF9tbQotCS53b3JkCTAJCUAgY3B1Xypfc2V0X3B0ZQotCS53b3JkCTAKLQkud29yZAkwCi0JLndvcmQJMAotCS5zaXplCWFybTk0MF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtOTQwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwlAIGRlZmluZSBzdHJ1Y3QgcHJvY2Vzc29yIChzZWUgPGFzbS9wcm9jLWZucy5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBhcm05NDAsIGRhYm9ydD1ub21tdV9lYXJseV9hYm9ydCwgcGFib3J0PWxlZ2FjeV9wYWJvcnQsIG5vbW11PTEKIAogCS5zZWN0aW9uICIucm9kYXRhIgogCi0udHlwZQljcHVfYXJjaF9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJjaF9uYW1lOgotCS5hc2NpegkiYXJtdjR0IgotCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCi0KLQkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKLWNwdV9lbGZfbmFtZToKLQkuYXNjaXoJInY0IgotCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQotCi0JLnR5cGUJY3B1X2FybTk0MF9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJtOTQwX25hbWU6Ci0JLmFzY2lpCSJBUk05NDBUIgotCS5zaXplCWNwdV9hcm05NDBfbmFtZSwgLiAtIGNwdV9hcm05NDBfbmFtZQorCXN0cmluZwljcHVfYXJjaF9uYW1lLCAiYXJtdjR0IgorCXN0cmluZwljcHVfZWxmX25hbWUsICJ2NCIKKwlzdHJpbmcJY3B1X2FybTk0MF9uYW1lLCAiQVJNOTQwVCIKIAogCS5hbGlnbgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTk0Ni5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDYuUwppbmRleCA4MDYzMzQ1Li5mOGY3ZWEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTk0Ni5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQ2LlMKQEAgLTMwNiwxOCArMzA2LDggQEAKIAltb3YJcGMsIGxyCiBFTkRQUk9DKGFybTk0Nl9kbWFfdW5tYXBfYXJlYSkKIAotRU5UUlkoYXJtOTQ2X2NhY2hlX2ZucykKLQkubG9uZwlhcm05NDZfZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCWFybTk0Nl9mbHVzaF9rZXJuX2NhY2hlX2FsbAotCS5sb25nCWFybTk0Nl9mbHVzaF91c2VyX2NhY2hlX2FsbAotCS5sb25nCWFybTk0Nl9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJYXJtOTQ2X2NvaGVyZW50X2tlcm5fcmFuZ2UKLQkubG9uZwlhcm05NDZfY29oZXJlbnRfdXNlcl9yYW5nZQotCS5sb25nCWFybTk0Nl9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJYXJtOTQ2X2RtYV9tYXBfYXJlYQotCS5sb25nCWFybTk0Nl9kbWFfdW5tYXBfYXJlYQotCS5sb25nCWFybTk0Nl9kbWFfZmx1c2hfcmFuZ2UKLQorCUAgZGVmaW5lIHN0cnVjdCBjcHVfY2FjaGVfZm5zIChzZWUgPGFzbS9jYWNoZWZsdXNoLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQorCWRlZmluZV9jYWNoZV9mdW5jdGlvbnMgYXJtOTQ2CiAKIEVOVFJZKGNwdV9hcm05NDZfZGNhY2hlX2NsZWFuX2FyZWEpCiAjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSApAQCAtNDAzLDQzICszOTMsMTQgQEAKIAogCV9fSU5JVERBVEEKIAotLyoKLSAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKLSAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCi0gKi8KLQkudHlwZQlhcm05NDZfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAotRU5UUlkoYXJtOTQ2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMpCi0JLndvcmQJbm9tbXVfZWFybHlfYWJvcnQKLQkud29yZAlsZWdhY3lfcGFib3J0Ci0JLndvcmQJY3B1X2FybTk0Nl9wcm9jX2luaXQKLQkud29yZAljcHVfYXJtOTQ2X3Byb2NfZmluCi0JLndvcmQJY3B1X2FybTk0Nl9yZXNldAotCS53b3JkICAgY3B1X2FybTk0Nl9kb19pZGxlCi0KLQkud29yZAljcHVfYXJtOTQ2X2RjYWNoZV9jbGVhbl9hcmVhCi0JLndvcmQJY3B1X2FybTk0Nl9zd2l0Y2hfbW0KLQkud29yZAkwCQlAIGNwdV8qX3NldF9wdGUKLQkud29yZAkwCi0JLndvcmQJMAotCS53b3JkCTAKLQkuc2l6ZQlhcm05NDZfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGFybTk0Nl9wcm9jZXNzb3JfZnVuY3Rpb25zCisJQCBkZWZpbmUgc3RydWN0IHByb2Nlc3NvciAoc2VlIDxhc20vcHJvYy1mbnMuaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX3Byb2Nlc3Nvcl9mdW5jdGlvbnMgYXJtOTQ2LCBkYWJvcnQ9bm9tbXVfZWFybHlfYWJvcnQsIHBhYm9ydD1sZWdhY3lfcGFib3J0LCBub21tdT0xCiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKIAotCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6Ci0JLmFzY2l6CSJhcm12NXRlIgotCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCi0KLQkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKLWNwdV9lbGZfbmFtZToKLQkuYXNjaXoJInY1dCIKLQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKLQotCS50eXBlCWNwdV9hcm05NDZfbmFtZSwgI29iamVjdAotY3B1X2FybTk0Nl9uYW1lOgotCS5hc2NpaQkiQVJNOTQ2RS1TIgotCS5zaXplCWNwdV9hcm05NDZfbmFtZSwgLiAtIGNwdV9hcm05NDZfbmFtZQorCXN0cmluZwljcHVfYXJjaF9uYW1lLCAiYXJtdjV0ZSIKKwlzdHJpbmcJY3B1X2VsZl9uYW1lLCAidjV0IgorCXN0cmluZwljcHVfYXJtOTQ2X25hbWUsICJBUk05NDZFLVMiCiAKIAkuYWxpZ24KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05dGRtaS5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05dGRtaS5TCmluZGV4IDdiN2ViZDQuLjIxMjBmOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOXRkbWkuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAorI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCisKIAkudGV4dAogLyoKICAqIGNwdV9hcm05dGRtaV9wcm9jX2luaXQoKQpAQCAtNTUsODIgKzU3LDM4IEBACiAKIAkJX19JTklUREFUQQogCi0vKgotICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscwotICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKLSAqLwotCQkudHlwZQlhcm05dGRtaV9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0Ci1FTlRSWShhcm05dGRtaV9wcm9jZXNzb3JfZnVuY3Rpb25zKQotCQkud29yZAlub21tdV9lYXJseV9hYm9ydAotCQkud29yZAlsZWdhY3lfcGFib3J0Ci0JCS53b3JkCWNwdV9hcm05dGRtaV9wcm9jX2luaXQKLQkJLndvcmQJY3B1X2FybTl0ZG1pX3Byb2NfZmluCi0JCS53b3JkCWNwdV9hcm05dGRtaV9yZXNldAotCQkud29yZAljcHVfYXJtOXRkbWlfZG9faWRsZQotCQkud29yZAljcHVfYXJtOXRkbWlfZGNhY2hlX2NsZWFuX2FyZWEKLQkJLndvcmQJY3B1X2FybTl0ZG1pX3N3aXRjaF9tbQotCQkud29yZAkwCQlAIGNwdV8qX3NldF9wdGUKLQkJLndvcmQJMAotCQkud29yZAkwCi0JCS53b3JkCTAKLQkJLnNpemUJYXJtOXRkbWlfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGFybTl0ZG1pX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkJQCBkZWZpbmUgc3RydWN0IHByb2Nlc3NvciAoc2VlIDxhc20vcHJvYy1mbnMuaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJCWRlZmluZV9wcm9jZXNzb3JfZnVuY3Rpb25zIGFybTl0ZG1pLCBkYWJvcnQ9bm9tbXVfZWFybHlfYWJvcnQsIHBhYm9ydD1sZWdhY3lfcGFib3J0LCBub21tdT0xCiAKIAkJLnNlY3Rpb24gIi5yb2RhdGEiCiAKLQkJLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdAotY3B1X2FyY2hfbmFtZToKLQkJLmFzY2l6CSJhcm12NHQiCi0JCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCi0KLQkJLnR5cGUJY3B1X2VsZl9uYW1lLCAjb2JqZWN0Ci1jcHVfZWxmX25hbWU6Ci0JCS5hc2NpegkidjQiCi0JCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQotCi0JCS50eXBlCWNwdV9hcm05dGRtaV9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJtOXRkbWlfbmFtZToKLQkJLmFzY2l6CSJBUk05VERNSSIKLQkJLnNpemUJY3B1X2FybTl0ZG1pX25hbWUsIC4gLSBjcHVfYXJtOXRkbWlfbmFtZQotCi0JCS50eXBlCWNwdV9wMjAwMV9uYW1lLCAjb2JqZWN0Ci1jcHVfcDIwMDFfbmFtZToKLQkJLmFzY2l6CSJQMjAwMSIKLQkJLnNpemUJY3B1X3AyMDAxX25hbWUsIC4gLSBjcHVfcDIwMDFfbmFtZQorCQlzdHJpbmcJY3B1X2FyY2hfbmFtZSwgImFybXY0dCIKKwkJc3RyaW5nCWNwdV9lbGZfbmFtZSwgInY0IgorCQlzdHJpbmcJY3B1X2FybTl0ZG1pX25hbWUsICJBUk05VERNSSIKKwkJc3RyaW5nCWNwdV9wMjAwMV9uYW1lLCAiUDIwMDEiCiAKIAkJLmFsaWduCiAKIAkJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgogCi0JCS50eXBlCV9fYXJtOXRkbWlfcHJvY19pbmZvLCAjb2JqZWN0Ci1fX2FybTl0ZG1pX3Byb2NfaW5mbzoKLQkJLmxvbmcJMHg0MTAwOTkwMAotCQkubG9uZwkweGZmZjhmZjAwCisubWFjcm8gYXJtOXRkbWlfcHJvY19pbmZvIG5hbWU6cmVxLCBjcHVfdmFsOnJlcSwgY3B1X21hc2s6cmVxLCBjcHVfbmFtZTpyZXEKKwkJLnR5cGUJX19cbmFtZVwoKV9wcm9jX2luZm8sICNvYmplY3QKK19fXG5hbWVcKClfcHJvY19pbmZvOgorCQkubG9uZwlcY3B1X3ZhbAorCQkubG9uZwlcY3B1X21hc2sKIAkJLmxvbmcJMAogCQkubG9uZwkwCiAJCWIJX19hcm05dGRtaV9zZXR1cAogCQkubG9uZwljcHVfYXJjaF9uYW1lCiAJCS5sb25nCWNwdV9lbGZfbmFtZQogCQkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9USFVNQiB8IEhXQ0FQXzI2QklUCi0JCS5sb25nCWNwdV9hcm05dGRtaV9uYW1lCisJCS5sb25nCVxjcHVfbmFtZQogCQkubG9uZwlhcm05dGRtaV9wcm9jZXNzb3JfZnVuY3Rpb25zCiAJCS5sb25nCTAKIAkJLmxvbmcJMAogCQkubG9uZwl2NF9jYWNoZV9mbnMKLQkJLnNpemUJX19hcm05dGRtaV9wcm9jX2luZm8sIC4gLSBfX2FybTlkbWlfcHJvY19pbmZvCisJCS5zaXplCV9fXG5hbWVcKClfcHJvY19pbmZvLCAuIC0gX19cbmFtZVwoKV9wcm9jX2luZm8KKy5lbmRtCiAKLQkJLnR5cGUJX19wMjAwMV9wcm9jX2luZm8sICNvYmplY3QKLV9fcDIwMDFfcHJvY19pbmZvOgotCQkubG9uZwkweDQxMDI5MDAwCi0JCS5sb25nCTB4ZmZmZmZmZmYKLQkJLmxvbmcJMAotCQkubG9uZwkwCi0JCWIJX19hcm05dGRtaV9zZXR1cAotCQkubG9uZwljcHVfYXJjaF9uYW1lCi0JCS5sb25nCWNwdV9lbGZfbmFtZQotCQkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9USFVNQiB8IEhXQ0FQXzI2QklUCi0JCS5sb25nCWNwdV9wMjAwMV9uYW1lCi0JCS5sb25nCWFybTl0ZG1pX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKLQkJLmxvbmcJMAotCQkubG9uZwkwCi0JCS5sb25nCXY0X2NhY2hlX2ZucwotCQkuc2l6ZQlfX3AyMDAxX3Byb2NfaW5mbywgLiAtIF9fcDIwMDFfcHJvY19pbmZvCisJYXJtOXRkbWlfcHJvY19pbmZvIGFybTl0ZG1pLCAweDQxMDA5OTAwLCAweGZmZjhmZjAwLCBjcHVfYXJtOXRkbWlfbmFtZQorCWFybTl0ZG1pX3Byb2NfaW5mbyBwMjAwMSwgMHg0MTAyOTAwMCwgMHhmZmZmZmZmZiwgY3B1X3AyMDAxX25hbWUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtZmE1MjYuUyBiL2FyY2gvYXJtL21tL3Byb2MtZmE1MjYuUwppbmRleCBmYzJhNGFlLi40YzdhNTcxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWZhNTI2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1mYTUyNi5TCkBAIC0xODAsNDIgKzE4MCwxNCBAQAogCiAJX19JTklUREFUQQogCi0vKgotICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscwotICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKLSAqLwotCS50eXBlCWZhNTI2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKLWZhNTI2X3Byb2Nlc3Nvcl9mdW5jdGlvbnM6Ci0JLndvcmQJdjRfZWFybHlfYWJvcnQKLQkud29yZAlsZWdhY3lfcGFib3J0Ci0JLndvcmQJY3B1X2ZhNTI2X3Byb2NfaW5pdAotCS53b3JkCWNwdV9mYTUyNl9wcm9jX2ZpbgotCS53b3JkCWNwdV9mYTUyNl9yZXNldAotCS53b3JkICAgY3B1X2ZhNTI2X2RvX2lkbGUKLQkud29yZAljcHVfZmE1MjZfZGNhY2hlX2NsZWFuX2FyZWEKLQkud29yZAljcHVfZmE1MjZfc3dpdGNoX21tCi0JLndvcmQJY3B1X2ZhNTI2X3NldF9wdGVfZXh0Ci0JLndvcmQJMAotCS53b3JkCTAKLQkud29yZAkwCi0JLnNpemUJZmE1MjZfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGZhNTI2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwlAIGRlZmluZSBzdHJ1Y3QgcHJvY2Vzc29yIChzZWUgPGFzbS9wcm9jLWZucy5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBmYTUyNiwgZGFib3J0PXY0X2Vhcmx5X2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydAogCiAJLnNlY3Rpb24gIi5yb2RhdGEiCiAKLQkudHlwZQljcHVfYXJjaF9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJjaF9uYW1lOgotCS5hc2NpegkiYXJtdjQiCi0JLnNpemUJY3B1X2FyY2hfbmFtZSwgLiAtIGNwdV9hcmNoX25hbWUKLQotCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAotY3B1X2VsZl9uYW1lOgotCS5hc2NpegkidjQiCi0JLnNpemUJY3B1X2VsZl9uYW1lLCAuIC0gY3B1X2VsZl9uYW1lCi0KLQkudHlwZQljcHVfZmE1MjZfbmFtZSwgI29iamVjdAotY3B1X2ZhNTI2X25hbWU6Ci0JLmFzY2l6CSJGQTUyNiIKLQkuc2l6ZQljcHVfZmE1MjZfbmFtZSwgLiAtIGNwdV9mYTUyNl9uYW1lCisJc3RyaW5nCWNwdV9hcmNoX25hbWUsICJhcm12NCIKKwlzdHJpbmcJY3B1X2VsZl9uYW1lLCAidjQiCisJc3RyaW5nCWNwdV9mYTUyNl9uYW1lLCAiRkE1MjYiCiAKIAkuYWxpZ24KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1mZXJvY2Vvbi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1mZXJvY2Vvbi5TCmluZGV4IGQzODgzZWUuLjhhNmMyZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtZmVyb2Nlb24uUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWZlcm9jZW9uLlMKQEAgLTQxMSwyOSArNDExLDI4IEBACiAJbW92CXBjLCBscgogRU5EUFJPQyhmZXJvY2Vvbl9kbWFfdW5tYXBfYXJlYSkKIAotRU5UUlkoZmVyb2Nlb25fY2FjaGVfZm5zKQotCS5sb25nCWZlcm9jZW9uX2ZsdXNoX2ljYWNoZV9hbGwKLQkubG9uZwlmZXJvY2Vvbl9mbHVzaF9rZXJuX2NhY2hlX2FsbAotCS5sb25nCWZlcm9jZW9uX2ZsdXNoX3VzZXJfY2FjaGVfYWxsCi0JLmxvbmcJZmVyb2Nlb25fZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQotCS5sb25nCWZlcm9jZW9uX2NvaGVyZW50X2tlcm5fcmFuZ2UKLQkubG9uZwlmZXJvY2Vvbl9jb2hlcmVudF91c2VyX3JhbmdlCi0JLmxvbmcJZmVyb2Nlb25fZmx1c2hfa2Vybl9kY2FjaGVfYXJlYQotCS5sb25nCWZlcm9jZW9uX2RtYV9tYXBfYXJlYQotCS5sb25nCWZlcm9jZW9uX2RtYV91bm1hcF9hcmVhCi0JLmxvbmcJZmVyb2Nlb25fZG1hX2ZsdXNoX3JhbmdlCisJQCBkZWZpbmUgc3RydWN0IGNwdV9jYWNoZV9mbnMgKHNlZSA8YXNtL2NhY2hlZmx1c2guaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX2NhY2hlX2Z1bmN0aW9ucyBmZXJvY2VvbgogCi1FTlRSWShmZXJvY2Vvbl9yYW5nZV9jYWNoZV9mbnMpCi0JLmxvbmcJZmVyb2Nlb25fZmx1c2hfaWNhY2hlX2FsbAotCS5sb25nCWZlcm9jZW9uX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCi0JLmxvbmcJZmVyb2Nlb25fZmx1c2hfdXNlcl9jYWNoZV9hbGwKLQkubG9uZwlmZXJvY2Vvbl9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJZmVyb2Nlb25fY29oZXJlbnRfa2Vybl9yYW5nZQotCS5sb25nCWZlcm9jZW9uX2NvaGVyZW50X3VzZXJfcmFuZ2UKLQkubG9uZwlmZXJvY2Vvbl9yYW5nZV9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJZmVyb2Nlb25fcmFuZ2VfZG1hX21hcF9hcmVhCi0JLmxvbmcJZmVyb2Nlb25fZG1hX3VubWFwX2FyZWEKLQkubG9uZwlmZXJvY2Vvbl9yYW5nZV9kbWFfZmx1c2hfcmFuZ2UKKy5tYWNybyByYW5nZV9hbGlhcyBiYXNlbmFtZQorCS5nbG9ibCBmZXJvY2Vvbl9yYW5nZV9cYmFzZW5hbWUKKwkudHlwZSBmZXJvY2Vvbl9yYW5nZV9cYmFzZW5hbWUgLCAlZnVuY3Rpb24KKwkuZXF1IGZlcm9jZW9uX3JhbmdlX1xiYXNlbmFtZSAsIGZlcm9jZW9uX1xiYXNlbmFtZQorLmVuZG0KKworLyoKKyAqIE1vc3Qgb2YgdGhlIGNhY2hlIGZ1bmN0aW9ucyBhcmUgdW5jaGFuZ2VkIGZvciB0aGlzIGNhc2UuCisgKiBFeHBvcnQgc3VpdGFibGUgYWxpYXMgc3ltYm9scyBmb3IgdGhlIHVuY2hhbmdlZCBmdW5jdGlvbnM6CisgKi8KKwlyYW5nZV9hbGlhcyBmbHVzaF9pY2FjaGVfYWxsCisJcmFuZ2VfYWxpYXMgZmx1c2hfdXNlcl9jYWNoZV9hbGwKKwlyYW5nZV9hbGlhcyBmbHVzaF9rZXJuX2NhY2hlX2FsbAorCXJhbmdlX2FsaWFzIGZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKKwlyYW5nZV9hbGlhcyBjb2hlcmVudF9rZXJuX3JhbmdlCisJcmFuZ2VfYWxpYXMgY29oZXJlbnRfdXNlcl9yYW5nZQorCXJhbmdlX2FsaWFzIGRtYV91bm1hcF9hcmVhCisKKwlkZWZpbmVfY2FjaGVfZnVuY3Rpb25zIGZlcm9jZW9uX3JhbmdlCiAKIAkuYWxpZ24JNQogRU5UUlkoY3B1X2Zlcm9jZW9uX2RjYWNoZV9jbGVhbl9hcmVhKQpAQCAtNTM5LDY3ICs1MzgsMjcgQEAKIAogCV9fSU5JVERBVEEKIAotLyoKLSAqIFB1cnBvc2UgOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBhYm92ZSBmdW5jdGlvbnMgLSBhbGwgY2FsbHMKLSAqCSAgICAgY29tZSB0aHJvdWdoIHRoZXNlCi0gKi8KLQkudHlwZQlmZXJvY2Vvbl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0Ci1mZXJvY2Vvbl9wcm9jZXNzb3JfZnVuY3Rpb25zOgotCS53b3JkCXY1dF9lYXJseV9hYm9ydAotCS53b3JkCWxlZ2FjeV9wYWJvcnQKLQkud29yZAljcHVfZmVyb2Nlb25fcHJvY19pbml0Ci0JLndvcmQJY3B1X2Zlcm9jZW9uX3Byb2NfZmluCi0JLndvcmQJY3B1X2Zlcm9jZW9uX3Jlc2V0Ci0JLndvcmQJY3B1X2Zlcm9jZW9uX2RvX2lkbGUKLQkud29yZAljcHVfZmVyb2Nlb25fZGNhY2hlX2NsZWFuX2FyZWEKLQkud29yZAljcHVfZmVyb2Nlb25fc3dpdGNoX21tCi0JLndvcmQJY3B1X2Zlcm9jZW9uX3NldF9wdGVfZXh0Ci0JLndvcmQJMAotCS53b3JkCTAKLQkud29yZAkwCi0JLnNpemUJZmVyb2Nlb25fcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGZlcm9jZW9uX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwlAIGRlZmluZSBzdHJ1Y3QgcHJvY2Vzc29yIChzZWUgPGFzbS9wcm9jLWZucy5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBmZXJvY2VvbiwgZGFib3J0PXY1dF9lYXJseV9hYm9ydCwgcGFib3J0PWxlZ2FjeV9wYWJvcnQKIAogCS5zZWN0aW9uICIucm9kYXRhIgogCi0JLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdAotY3B1X2FyY2hfbmFtZToKLQkuYXNjaXoJImFybXY1dGUiCi0JLnNpemUJY3B1X2FyY2hfbmFtZSwgLiAtIGNwdV9hcmNoX25hbWUKLQotCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAotY3B1X2VsZl9uYW1lOgotCS5hc2NpegkidjUiCi0JLnNpemUJY3B1X2VsZl9uYW1lLCAuIC0gY3B1X2VsZl9uYW1lCi0KLQkudHlwZQljcHVfZmVyb2Nlb25fbmFtZSwgI29iamVjdAotY3B1X2Zlcm9jZW9uX25hbWU6Ci0JLmFzY2l6CSJGZXJvY2VvbiIKLQkuc2l6ZQljcHVfZmVyb2Nlb25fbmFtZSwgLiAtIGNwdV9mZXJvY2Vvbl9uYW1lCi0KLQkudHlwZQljcHVfODhmcjUzMV9uYW1lLCAjb2JqZWN0Ci1jcHVfODhmcjUzMV9uYW1lOgotCS5hc2NpegkiRmVyb2Nlb24gODhGUjUzMS12ZCIKLQkuc2l6ZQljcHVfODhmcjUzMV9uYW1lLCAuIC0gY3B1Xzg4ZnI1MzFfbmFtZQotCi0JLnR5cGUJY3B1Xzg4ZnI1NzFfbmFtZSwgI29iamVjdAotY3B1Xzg4ZnI1NzFfbmFtZToKLQkuYXNjaXoJIkZlcm9jZW9uIDg4RlI1NzEtdmQiCi0JLnNpemUJY3B1Xzg4ZnI1NzFfbmFtZSwgLiAtIGNwdV84OGZyNTcxX25hbWUKLQotCS50eXBlCWNwdV84OGZyMTMxX25hbWUsICNvYmplY3QKLWNwdV84OGZyMTMxX25hbWU6Ci0JLmFzY2l6CSJGZXJvY2VvbiA4OEZSMTMxIgotCS5zaXplCWNwdV84OGZyMTMxX25hbWUsIC4gLSBjcHVfODhmcjEzMV9uYW1lCisJc3RyaW5nCWNwdV9hcmNoX25hbWUsICJhcm12NXRlIgorCXN0cmluZwljcHVfZWxmX25hbWUsICJ2NSIKKwlzdHJpbmcJY3B1X2Zlcm9jZW9uX25hbWUsICJGZXJvY2VvbiIKKwlzdHJpbmcJY3B1Xzg4ZnI1MzFfbmFtZSwgIkZlcm9jZW9uIDg4RlI1MzEtdmQiCisJc3RyaW5nCWNwdV84OGZyNTcxX25hbWUsICJGZXJvY2VvbiA4OEZSNTcxLXZkIgorCXN0cmluZwljcHVfODhmcjEzMV9uYW1lLCAiRmVyb2Nlb24gODhGUjEzMSIKIAogCS5hbGlnbgogCiAJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgogCi0jaWZkZWYgQ09ORklHX0NQVV9GRVJPQ0VPTl9PTERfSUQKLQkudHlwZQlfX2Zlcm9jZW9uX29sZF9pZF9wcm9jX2luZm8sI29iamVjdAotX19mZXJvY2Vvbl9vbGRfaWRfcHJvY19pbmZvOgotCS5sb25nCTB4NDEwMDkyNjAKLQkubG9uZwkweGZmMDBmZmYwCisubWFjcm8gZmVyb2Nlb25fcHJvY19pbmZvIG5hbWU6cmVxLCBjcHVfdmFsOnJlcSwgY3B1X21hc2s6cmVxLCBjcHVfbmFtZTpyZXEsIGNhY2hlOnJlcQorCS50eXBlCV9fXG5hbWVcKClfcHJvY19pbmZvLCNvYmplY3QKK19fXG5hbWVcKClfcHJvY19pbmZvOgorCS5sb25nCVxjcHVfdmFsCisJLmxvbmcJXGNwdV9tYXNrCiAJLmxvbmcJUE1EX1RZUEVfU0VDVCB8IFwKIAkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKIAkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXApAQCAtNjE0LDg1ICs1NzMsMjIgQEAKIAkubG9uZwljcHVfYXJjaF9uYW1lCiAJLmxvbmcJY3B1X2VsZl9uYW1lCiAJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKLQkubG9uZwljcHVfZmVyb2Nlb25fbmFtZQorCS5sb25nCVxjcHVfbmFtZQogCS5sb25nCWZlcm9jZW9uX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAkubG9uZwl2NHdiaV90bGJfZm5zCiAJLmxvbmcJZmVyb2Nlb25fdXNlcl9mbnMKLQkubG9uZwlmZXJvY2Vvbl9jYWNoZV9mbnMKLQkuc2l6ZQlfX2Zlcm9jZW9uX29sZF9pZF9wcm9jX2luZm8sIC4gLSBfX2Zlcm9jZW9uX29sZF9pZF9wcm9jX2luZm8KKwkubG9uZwlcY2FjaGUKKwkgLnNpemUJX19cbmFtZVwoKV9wcm9jX2luZm8sIC4gLSBfX1xuYW1lXCgpX3Byb2NfaW5mbworLmVuZG0KKworI2lmZGVmIENPTkZJR19DUFVfRkVST0NFT05fT0xEX0lECisJZmVyb2Nlb25fcHJvY19pbmZvIGZlcm9jZW9uX29sZF9pZCwgMHg0MTAwOTI2MCwgMHhmZjAwZmZmMCwgXAorCQljcHVfbmFtZT1jcHVfZmVyb2Nlb25fbmFtZSwgY2FjaGU9ZmVyb2Nlb25fY2FjaGVfZm5zCiAjZW5kaWYKIAotCS50eXBlCV9fODhmcjUzMV9wcm9jX2luZm8sI29iamVjdAotX184OGZyNTMxX3Byb2NfaW5mbzoKLQkubG9uZwkweDU2MDU1MzEwCi0JLmxvbmcJMHhmZmZmZmZmMAotCS5sb25nCVBNRF9UWVBFX1NFQ1QgfCBcCi0JCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCi0JCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKLQkJUE1EX0JJVDQgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JLmxvbmcJUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX0JJVDQgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JYglfX2Zlcm9jZW9uX3NldHVwCi0JLmxvbmcJY3B1X2FyY2hfbmFtZQotCS5sb25nCWNwdV9lbGZfbmFtZQotCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCi0JLmxvbmcJY3B1Xzg4ZnI1MzFfbmFtZQotCS5sb25nCWZlcm9jZW9uX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKLQkubG9uZwl2NHdiaV90bGJfZm5zCi0JLmxvbmcJZmVyb2Nlb25fdXNlcl9mbnMKLQkubG9uZwlmZXJvY2Vvbl9jYWNoZV9mbnMKLQkuc2l6ZQlfXzg4ZnI1MzFfcHJvY19pbmZvLCAuIC0gX184OGZyNTMxX3Byb2NfaW5mbwotCi0JLnR5cGUJX184OGZyNTcxX3Byb2NfaW5mbywjb2JqZWN0Ci1fXzg4ZnI1NzFfcHJvY19pbmZvOgotCS5sb25nCTB4NTYxNTU3MTAKLQkubG9uZwkweGZmZmZmZmYwCi0JLmxvbmcJUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKLQkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAotCQlQTURfQklUNCB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQkubG9uZwlQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfQklUNCB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQliCV9fZmVyb2Nlb25fc2V0dXAKLQkubG9uZwljcHVfYXJjaF9uYW1lCi0JLmxvbmcJY3B1X2VsZl9uYW1lCi0JLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKLQkubG9uZwljcHVfODhmcjU3MV9uYW1lCi0JLmxvbmcJZmVyb2Nlb25fcHJvY2Vzc29yX2Z1bmN0aW9ucwotCS5sb25nCXY0d2JpX3RsYl9mbnMKLQkubG9uZwlmZXJvY2Vvbl91c2VyX2ZucwotCS5sb25nCWZlcm9jZW9uX3JhbmdlX2NhY2hlX2ZucwotCS5zaXplCV9fODhmcjU3MV9wcm9jX2luZm8sIC4gLSBfXzg4ZnI1NzFfcHJvY19pbmZvCi0KLQkudHlwZQlfXzg4ZnIxMzFfcHJvY19pbmZvLCNvYmplY3QKLV9fODhmcjEzMV9wcm9jX2luZm86Ci0JLmxvbmcJMHg1NjI1MTMxMAotCS5sb25nCTB4ZmZmZmZmZjAKLQkubG9uZwlQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCi0JCVBNRF9CSVQ0IHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCS5sb25nCVBNRF9UWVBFX1NFQ1QgfCBcCi0JCVBNRF9CSVQ0IHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCWIJX19mZXJvY2Vvbl9zZXR1cAotCS5sb25nCWNwdV9hcmNoX25hbWUKLQkubG9uZwljcHVfZWxmX25hbWUKLQkubG9uZwlIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUAotCS5sb25nCWNwdV84OGZyMTMxX25hbWUKLQkubG9uZwlmZXJvY2Vvbl9wcm9jZXNzb3JfZnVuY3Rpb25zCi0JLmxvbmcJdjR3YmlfdGxiX2ZucwotCS5sb25nCWZlcm9jZW9uX3VzZXJfZm5zCi0JLmxvbmcJZmVyb2Nlb25fcmFuZ2VfY2FjaGVfZm5zCi0JLnNpemUJX184OGZyMTMxX3Byb2NfaW5mbywgLiAtIF9fODhmcjEzMV9wcm9jX2luZm8KKwlmZXJvY2Vvbl9wcm9jX2luZm8gODhmcjUzMSwgMHg1NjA1NTMxMCwgMHhmZmZmZmZmMCwgY3B1Xzg4ZnI1MzFfbmFtZSwgXAorCQljYWNoZT1mZXJvY2Vvbl9jYWNoZV9mbnMKKwlmZXJvY2Vvbl9wcm9jX2luZm8gODhmcjU3MSwgMHg1NjE1NTcxMCwgMHhmZmZmZmZmMCwgY3B1Xzg4ZnI1NzFfbmFtZSwgXAorCQljYWNoZT1mZXJvY2Vvbl9yYW5nZV9jYWNoZV9mbnMKKwlmZXJvY2Vvbl9wcm9jX2luZm8gODhmcjEzMSwgMHg1NjI1MTMxMCwgMHhmZmZmZmZmMCwgY3B1Xzg4ZnIxMzFfbmFtZSwgXAorCQljYWNoZT1mZXJvY2Vvbl9yYW5nZV9jYWNoZV9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMgYi9hcmNoL2FybS9tbS9wcm9jLW1hY3Jvcy5TCmluZGV4IDM0MjYxZjkuLjMwN2E0ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUwpAQCAtMjU0LDMgKzI1NCw3MSBAQAogCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEwxIEQgbGluZQogCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRhdGEgd3JpdGUgYmFycmllcgogCS5lbmRtCisKKy5tYWNybyBkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBuYW1lOnJlcSwgZGFib3J0OnJlcSwgcGFib3J0OnJlcSwgbm9tbXU9MCwgc3VzcGVuZD0wCisJLnR5cGUJXG5hbWVcKClfcHJvY2Vzc29yX2Z1bmN0aW9ucywgI29iamVjdAorCS5hbGlnbiAyCitFTlRSWShcbmFtZVwoKV9wcm9jZXNzb3JfZnVuY3Rpb25zKQorCS53b3JkCVxkYWJvcnQKKwkud29yZAlccGFib3J0CisJLndvcmQJY3B1X1xuYW1lXCgpX3Byb2NfaW5pdAorCS53b3JkCWNwdV9cbmFtZVwoKV9wcm9jX2ZpbgorCS53b3JkCWNwdV9cbmFtZVwoKV9yZXNldAorCS53b3JkCWNwdV9cbmFtZVwoKV9kb19pZGxlCisJLndvcmQJY3B1X1xuYW1lXCgpX2RjYWNoZV9jbGVhbl9hcmVhCisJLndvcmQJY3B1X1xuYW1lXCgpX3N3aXRjaF9tbQorCisJLmlmIFxub21tdQorCS53b3JkCTAKKwkuZWxzZQorCS53b3JkCWNwdV9cbmFtZVwoKV9zZXRfcHRlX2V4dAorCS5lbmRpZgorCisJLmlmIFxzdXNwZW5kCisJLndvcmQJY3B1X1xuYW1lXCgpX3N1c3BlbmRfc2l6ZQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorCS53b3JkCWNwdV9cbmFtZVwoKV9kb19zdXNwZW5kCisJLndvcmQJY3B1X1xuYW1lXCgpX2RvX3Jlc3VtZQorI2Vsc2UKKwkud29yZAkwCisJLndvcmQJMAorI2VuZGlmCisJLmVsc2UKKwkud29yZAkwCisJLndvcmQJMAorCS53b3JkCTAKKwkuZW5kaWYKKworCS5zaXplCVxuYW1lXCgpX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBcbmFtZVwoKV9wcm9jZXNzb3JfZnVuY3Rpb25zCisuZW5kbQorCisubWFjcm8gZGVmaW5lX2NhY2hlX2Z1bmN0aW9ucyBuYW1lOnJlcQorCS5hbGlnbiAyCisJLnR5cGUJXG5hbWVcKClfY2FjaGVfZm5zLCAjb2JqZWN0CitFTlRSWShcbmFtZVwoKV9jYWNoZV9mbnMpCisJLmxvbmcJXG5hbWVcKClfZmx1c2hfaWNhY2hlX2FsbAorCS5sb25nCVxuYW1lXCgpX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCisJLmxvbmcJXG5hbWVcKClfZmx1c2hfdXNlcl9jYWNoZV9hbGwKKwkubG9uZwlcbmFtZVwoKV9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCisJLmxvbmcJXG5hbWVcKClfY29oZXJlbnRfa2Vybl9yYW5nZQorCS5sb25nCVxuYW1lXCgpX2NvaGVyZW50X3VzZXJfcmFuZ2UKKwkubG9uZwlcbmFtZVwoKV9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCisJLmxvbmcJXG5hbWVcKClfZG1hX21hcF9hcmVhCisJLmxvbmcJXG5hbWVcKClfZG1hX3VubWFwX2FyZWEKKwkubG9uZwlcbmFtZVwoKV9kbWFfZmx1c2hfcmFuZ2UKKwkuc2l6ZQlcbmFtZVwoKV9jYWNoZV9mbnMsIC4gLSBcbmFtZVwoKV9jYWNoZV9mbnMKKy5lbmRtCisKKy5tYWNybyBkZWZpbmVfdGxiX2Z1bmN0aW9ucyBuYW1lOnJlcSwgZmxhZ3NfdXA6cmVxLCBmbGFnc19zbXAKKwkudHlwZQlcbmFtZVwoKV90bGJfZm5zLCAjb2JqZWN0CitFTlRSWShcbmFtZVwoKV90bGJfZm5zKQorCS5sb25nCVxuYW1lXCgpX2ZsdXNoX3VzZXJfdGxiX3JhbmdlCisJLmxvbmcJXG5hbWVcKClfZmx1c2hfa2Vybl90bGJfcmFuZ2UKKwkuaWZuYiBcZmxhZ3Nfc21wCisJCUFMVF9TTVAoLmxvbmcJXGZsYWdzX3NtcCApCisJCUFMVF9VUCgubG9uZwlcZmxhZ3NfdXAgKQorCS5lbHNlCisJCS5sb25nCVxmbGFnc191cAorCS5lbmRpZgorCS5zaXplCVxuYW1lXCgpX3RsYl9mbnMsIC4gLSBcbmFtZVwoKV90bGJfZm5zCisuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1tb2hhd2suUyBiL2FyY2gvYXJtL21tL3Byb2MtbW9oYXdrLlMKaW5kZXggOWQ0ZjJhZS4uZGI1MmIwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1tb2hhd2suUworKysgYi9hcmNoL2FybS9tbS9wcm9jLW1vaGF3ay5TCkBAIC05Myw2ICs5MywxNyBAQAogCW1vdglwYywgbHIKIAogLyoKKyAqCWZsdXNoX2ljYWNoZV9hbGwoKQorICoKKyAqCVVuY29uZGl0aW9uYWxseSBjbGVhbiBhbmQgaW52YWxpZGF0ZSB0aGUgZW50aXJlIGljYWNoZS4KKyAqLworRU5UUlkobW9oYXdrX2ZsdXNoX2ljYWNoZV9hbGwpCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzUsIDAJCUAgaW52YWxpZGF0ZSBJIGNhY2hlCisJbW92CXBjLCBscgorRU5EUFJPQyhtb2hhd2tfZmx1c2hfaWNhY2hlX2FsbCkKKworLyoKICAqCWZsdXNoX3VzZXJfY2FjaGVfYWxsKCkKICAqCiAgKglDbGVhbiBhbmQgaW52YWxpZGF0ZSBhbGwgY2FjaGUgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIKQEAgLTI4OCwxNiArMjk5LDggQEAKIAltb3YJcGMsIGxyCiBFTkRQUk9DKG1vaGF3a19kbWFfdW5tYXBfYXJlYSkKIAotRU5UUlkobW9oYXdrX2NhY2hlX2ZucykKLQkubG9uZwltb2hhd2tfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLQkubG9uZwltb2hhd2tfZmx1c2hfdXNlcl9jYWNoZV9hbGwKLQkubG9uZwltb2hhd2tfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQotCS5sb25nCW1vaGF3a19jb2hlcmVudF9rZXJuX3JhbmdlCi0JLmxvbmcJbW9oYXdrX2NvaGVyZW50X3VzZXJfcmFuZ2UKLQkubG9uZwltb2hhd2tfZmx1c2hfa2Vybl9kY2FjaGVfYXJlYQotCS5sb25nCW1vaGF3a19kbWFfbWFwX2FyZWEKLQkubG9uZwltb2hhd2tfZG1hX3VubWFwX2FyZWEKLQkubG9uZwltb2hhd2tfZG1hX2ZsdXNoX3JhbmdlCisJQCBkZWZpbmUgc3RydWN0IGNwdV9jYWNoZV9mbnMgKHNlZSA8YXNtL2NhY2hlZmx1c2guaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX2NhY2hlX2Z1bmN0aW9ucyBtb2hhd2sKIAogRU5UUlkoY3B1X21vaGF3a19kY2FjaGVfY2xlYW5fYXJlYSkKIDE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKQEAgLTM3Myw0MiArMzc2LDE0IEBACiAKIAlfX0lOSVREQVRBCiAKLS8qCi0gKiBQdXJwb3NlIDogRnVuY3Rpb24gcG9pbnRlcnMgdXNlZCB0byBhY2Nlc3MgYWJvdmUgZnVuY3Rpb25zIC0gYWxsIGNhbGxzCi0gKgkgICAgIGNvbWUgdGhyb3VnaCB0aGVzZQotICovCi0JLnR5cGUJbW9oYXdrX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKLW1vaGF3a19wcm9jZXNzb3JfZnVuY3Rpb25zOgotCS53b3JkCXY1dF9lYXJseV9hYm9ydAotCS53b3JkCWxlZ2FjeV9wYWJvcnQKLQkud29yZAljcHVfbW9oYXdrX3Byb2NfaW5pdAotCS53b3JkCWNwdV9tb2hhd2tfcHJvY19maW4KLQkud29yZAljcHVfbW9oYXdrX3Jlc2V0Ci0JLndvcmQJY3B1X21vaGF3a19kb19pZGxlCi0JLndvcmQJY3B1X21vaGF3a19kY2FjaGVfY2xlYW5fYXJlYQotCS53b3JkCWNwdV9tb2hhd2tfc3dpdGNoX21tCi0JLndvcmQJY3B1X21vaGF3a19zZXRfcHRlX2V4dAotCS53b3JkCTAKLQkud29yZAkwCi0JLndvcmQJMAotCS5zaXplCW1vaGF3a19wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gbW9oYXdrX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwlAIGRlZmluZSBzdHJ1Y3QgcHJvY2Vzc29yIChzZWUgPGFzbS9wcm9jLWZucy5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBtb2hhd2ssIGRhYm9ydD12NXRfZWFybHlfYWJvcnQsIHBhYm9ydD1sZWdhY3lfcGFib3J0CiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKIAotCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6Ci0JLmFzY2l6CSJhcm12NXRlIgotCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCi0KLQkudHlwZQljcHVfZWxmX25hbWUsICNvYmplY3QKLWNwdV9lbGZfbmFtZToKLQkuYXNjaXoJInY1IgotCS5zaXplCWNwdV9lbGZfbmFtZSwgLiAtIGNwdV9lbGZfbmFtZQotCi0JLnR5cGUJY3B1X21vaGF3a19uYW1lLCAjb2JqZWN0Ci1jcHVfbW9oYXdrX25hbWU6Ci0JLmFzY2l6CSJNYXJ2ZWxsIDg4U1YzMzF4IgotCS5zaXplCWNwdV9tb2hhd2tfbmFtZSwgLiAtIGNwdV9tb2hhd2tfbmFtZQorCXN0cmluZwljcHVfYXJjaF9uYW1lLCAiYXJtdjV0ZSIKKwlzdHJpbmcJY3B1X2VsZl9uYW1lLCAidjUiCisJc3RyaW5nCWNwdV9tb2hhd2tfbmFtZSwgIk1hcnZlbGwgODhTVjMzMXgiCiAKIAkuYWxpZ24KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TCmluZGV4IDQ2ZjA5ZWQuLmQ1MGFkYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMKQEAgLTE4Nyw0MyArMTg3LDE0IEBACiAKIAlfX0lOSVREQVRBCiAKLS8qCi0gKiBQdXJwb3NlIDogRnVuY3Rpb24gcG9pbnRlcnMgdXNlZCB0byBhY2Nlc3MgYWJvdmUgZnVuY3Rpb25zIC0gYWxsIGNhbGxzCi0gKgkgICAgIGNvbWUgdGhyb3VnaCB0aGVzZQotICovCi0KLQkudHlwZQlzYTExMF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0Ci1FTlRSWShzYTExMF9wcm9jZXNzb3JfZnVuY3Rpb25zKQotCS53b3JkCXY0X2Vhcmx5X2Fib3J0Ci0JLndvcmQJbGVnYWN5X3BhYm9ydAotCS53b3JkCWNwdV9zYTExMF9wcm9jX2luaXQKLQkud29yZAljcHVfc2ExMTBfcHJvY19maW4KLQkud29yZAljcHVfc2ExMTBfcmVzZXQKLQkud29yZAljcHVfc2ExMTBfZG9faWRsZQotCS53b3JkCWNwdV9zYTExMF9kY2FjaGVfY2xlYW5fYXJlYQotCS53b3JkCWNwdV9zYTExMF9zd2l0Y2hfbW0KLQkud29yZAljcHVfc2ExMTBfc2V0X3B0ZV9leHQKLQkud29yZAkwCi0JLndvcmQJMAotCS53b3JkCTAKLQkuc2l6ZQlzYTExMF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gc2ExMTBfcHJvY2Vzc29yX2Z1bmN0aW9ucworCUAgZGVmaW5lIHN0cnVjdCBwcm9jZXNzb3IgKHNlZSA8YXNtL3Byb2MtZm5zLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQorCWRlZmluZV9wcm9jZXNzb3JfZnVuY3Rpb25zIHNhMTEwLCBkYWJvcnQ9djRfZWFybHlfYWJvcnQsIHBhYm9ydD1sZWdhY3lfcGFib3J0CiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKIAotCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6Ci0JLmFzY2l6CSJhcm12NCIKLQkuc2l6ZQljcHVfYXJjaF9uYW1lLCAuIC0gY3B1X2FyY2hfbmFtZQotCi0JLnR5cGUJY3B1X2VsZl9uYW1lLCAjb2JqZWN0Ci1jcHVfZWxmX25hbWU6Ci0JLmFzY2l6CSJ2NCIKLQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKLQotCS50eXBlCWNwdV9zYTExMF9uYW1lLCAjb2JqZWN0Ci1jcHVfc2ExMTBfbmFtZToKLQkuYXNjaXoJIlN0cm9uZ0FSTS0xMTAiCi0JLnNpemUJY3B1X3NhMTEwX25hbWUsIC4gLSBjcHVfc2ExMTBfbmFtZQorCXN0cmluZwljcHVfYXJjaF9uYW1lLCAiYXJtdjQiCisJc3RyaW5nCWNwdV9lbGZfbmFtZSwgInY0IgorCXN0cmluZwljcHVfc2ExMTBfbmFtZSwgIlN0cm9uZ0FSTS0xMTAiCiAKIAkuYWxpZ24KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUyBiL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMKaW5kZXggMTg0YTljOS4uMDcyMTljMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TCkBAIC0zNCw3ICszNCw3IEBACiAgKi8KICNkZWZpbmUgRENBQ0hFTElORVNJWkUJMzIKIAotCV9fSU5JVAorCS5zZWN0aW9uIC50ZXh0CiAKIC8qCiAgKiBjcHVfc2ExMTAwX3Byb2NfaW5pdCgpCkBAIC00NSw4ICs0NSw2IEBACiAJbWNyCXAxNSwgMCwgcjAsIGM5LCBjMCwgNQkJQCBBbGxvdyByZWFkLWJ1ZmZlciBvcGVyYXRpb25zIGZyb20gdXNlcmxhbmQKIAltb3YJcGMsIGxyCiAKLQkuc2VjdGlvbiAudGV4dAotCiAvKgogICogY3B1X3NhMTEwMF9wcm9jX2ZpbigpCiAgKgpAQCAtMjAwLDkgKzE5OCw2IEBACiAJCSAgICAgUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgUE1EX1NFQ1RfQVBfV1JJVEUKIAliCWNwdV9yZXN1bWVfbW11CiBFTkRQUk9DKGNwdV9zYTExMDBfZG9fcmVzdW1lKQotI2Vsc2UKLSNkZWZpbmUgY3B1X3NhMTEwMF9kb19zdXNwZW5kCTAKLSNkZWZpbmUgY3B1X3NhMTEwMF9kb19yZXN1bWUJMAogI2VuZGlmCiAKIAlfX0NQVUlOSVQKQEAgLTIzNiw1OSArMjMxLDI4IEBACiAJX19JTklUREFUQQogCiAvKgotICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscwotICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKLSAqLwotCi0vKgogICogU0ExMTAwIGFuZCBTQTExMTAgc2hhcmUgdGhlIHNhbWUgZnVuY3Rpb24gY2FsbHMKICAqLwotCS50eXBlCXNhMTEwMF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0Ci1FTlRSWShzYTExMDBfcHJvY2Vzc29yX2Z1bmN0aW9ucykKLQkud29yZAl2NF9lYXJseV9hYm9ydAotCS53b3JkCWxlZ2FjeV9wYWJvcnQKLQkud29yZAljcHVfc2ExMTAwX3Byb2NfaW5pdAotCS53b3JkCWNwdV9zYTExMDBfcHJvY19maW4KLQkud29yZAljcHVfc2ExMTAwX3Jlc2V0Ci0JLndvcmQJY3B1X3NhMTEwMF9kb19pZGxlCi0JLndvcmQJY3B1X3NhMTEwMF9kY2FjaGVfY2xlYW5fYXJlYQotCS53b3JkCWNwdV9zYTExMDBfc3dpdGNoX21tCi0JLndvcmQJY3B1X3NhMTEwMF9zZXRfcHRlX2V4dAotCS53b3JkCWNwdV9zYTExMDBfc3VzcGVuZF9zaXplCi0JLndvcmQJY3B1X3NhMTEwMF9kb19zdXNwZW5kCi0JLndvcmQJY3B1X3NhMTEwMF9kb19yZXN1bWUKLQkuc2l6ZQlzYTExMDBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIHNhMTEwMF9wcm9jZXNzb3JfZnVuY3Rpb25zCisKKwlAIGRlZmluZSBzdHJ1Y3QgcHJvY2Vzc29yIChzZWUgPGFzbS9wcm9jLWZucy5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBzYTExMDAsIGRhYm9ydD12NF9lYXJseV9hYm9ydCwgcGFib3J0PWxlZ2FjeV9wYWJvcnQsIHN1c3BlbmQ9MQogCiAJLnNlY3Rpb24gIi5yb2RhdGEiCiAKLQkudHlwZQljcHVfYXJjaF9uYW1lLCAjb2JqZWN0Ci1jcHVfYXJjaF9uYW1lOgotCS5hc2NpegkiYXJtdjQiCi0JLnNpemUJY3B1X2FyY2hfbmFtZSwgLiAtIGNwdV9hcmNoX25hbWUKLQotCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAotY3B1X2VsZl9uYW1lOgotCS5hc2NpegkidjQiCi0JLnNpemUJY3B1X2VsZl9uYW1lLCAuIC0gY3B1X2VsZl9uYW1lCi0KLQkudHlwZQljcHVfc2ExMTAwX25hbWUsICNvYmplY3QKLWNwdV9zYTExMDBfbmFtZToKLQkuYXNjaXoJIlN0cm9uZ0FSTS0xMTAwIgotCS5zaXplCWNwdV9zYTExMDBfbmFtZSwgLiAtIGNwdV9zYTExMDBfbmFtZQotCi0JLnR5cGUJY3B1X3NhMTExMF9uYW1lLCAjb2JqZWN0Ci1jcHVfc2ExMTEwX25hbWU6Ci0JLmFzY2l6CSJTdHJvbmdBUk0tMTExMCIKLQkuc2l6ZQljcHVfc2ExMTEwX25hbWUsIC4gLSBjcHVfc2ExMTEwX25hbWUKKwlzdHJpbmcJY3B1X2FyY2hfbmFtZSwgImFybXY0IgorCXN0cmluZwljcHVfZWxmX25hbWUsICJ2NCIKKwlzdHJpbmcJY3B1X3NhMTEwMF9uYW1lLCAiU3Ryb25nQVJNLTExMDAiCisJc3RyaW5nCWNwdV9zYTExMTBfbmFtZSwgIlN0cm9uZ0FSTS0xMTEwIgogCiAJLmFsaWduCiAKIAkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCiAKLQkudHlwZQlfX3NhMTEwMF9wcm9jX2luZm8sI29iamVjdAotX19zYTExMDBfcHJvY19pbmZvOgotCS5sb25nCTB4NDQwMWExMTAKLQkubG9uZwkweGZmZmZmZmYwCisubWFjcm8gc2ExMTAwX3Byb2NfaW5mbyBuYW1lOnJlcSwgY3B1X3ZhbDpyZXEsIGNwdV9tYXNrOnJlcSwgY3B1X25hbWU6cmVxCisJLnR5cGUJX19cbmFtZVwoKV9wcm9jX2luZm8sI29iamVjdAorX19cbmFtZVwoKV9wcm9jX2luZm86CisJLmxvbmcJXGNwdV92YWwKKwkubG9uZwlcY3B1X21hc2sKIAkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCiAJCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCiAJCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKQEAgLTMwMSwzMiArMjY1LDEzIEBACiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQogCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF8yNkJJVCB8IEhXQ0FQX0ZBU1RfTVVMVAotCS5sb25nCWNwdV9zYTExMDBfbmFtZQorCS5sb25nCVxjcHVfbmFtZQogCS5sb25nCXNhMTEwMF9wcm9jZXNzb3JfZnVuY3Rpb25zCiAJLmxvbmcJdjR3Yl90bGJfZm5zCiAJLmxvbmcJdjRfbWNfdXNlcl9mbnMKIAkubG9uZwl2NHdiX2NhY2hlX2ZucwotCS5zaXplCV9fc2ExMTAwX3Byb2NfaW5mbywgLiAtIF9fc2ExMTAwX3Byb2NfaW5mbworCS5zaXplCV9fXG5hbWVcKClfcHJvY19pbmZvLCAuIC0gX19cbmFtZVwoKV9wcm9jX2luZm8KKy5lbmRtCiAKLQkudHlwZQlfX3NhMTExMF9wcm9jX2luZm8sI29iamVjdAotX19zYTExMTBfcHJvY19pbmZvOgotCS5sb25nCTB4NjkwMWIxMTAKLQkubG9uZwkweGZmZmZmZmYwCi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCWIJX19zYTExMDBfc2V0dXAKLQkubG9uZwljcHVfYXJjaF9uYW1lCi0JLmxvbmcJY3B1X2VsZl9uYW1lCi0JLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRiB8IEhXQ0FQXzI2QklUIHwgSFdDQVBfRkFTVF9NVUxUCi0JLmxvbmcJY3B1X3NhMTExMF9uYW1lCi0JLmxvbmcJc2ExMTAwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKLQkubG9uZwl2NHdiX3RsYl9mbnMKLQkubG9uZwl2NF9tY191c2VyX2ZucwotCS5sb25nCXY0d2JfY2FjaGVfZm5zCi0JLnNpemUJX19zYTExMTBfcHJvY19pbmZvLCAuIC0gX19zYTExMTBfcHJvY19pbmZvCisJc2ExMTAwX3Byb2NfaW5mbyBzYTExMDAsIDB4NDQwMWExMTAsIDB4ZmZmZmZmZjAsIGNwdV9zYTExMDBfbmFtZQorCXNhMTEwMF9wcm9jX2luZm8gc2ExMTEwLCAweDY5MDFiMTEwLCAweGZmZmZmZmYwLCBjcHVfc2ExMTEwX25hbWUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjYuUwppbmRleCAxZDJiODQ1Li4yMTkxMzhkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCkBAIC01Niw2ICs1NiwxMSBAQAogICovCiAJLmFsaWduCTUKIEVOVFJZKGNwdV92Nl9yZXNldCkKKwltcmMJcDE1LCAwLCByMSwgYzEsIGMwLCAwCQlAIGN0cmwgcmVnaXN0ZXIKKwliaWMJcjEsIHIxLCAjMHgxCQkJQCAuLi4uLi4uLi4uLi4uLi5tCisJbWNyCXAxNSwgMCwgcjEsIGMxLCBjMCwgMAkJQCBkaXNhYmxlIE1NVQorCW1vdglyMSwgIzAKKwltY3IJcDE1LCAwLCByMSwgYzcsIGM1LCA0CQlAIElTQgogCW1vdglwYywgcjAKIAogLyoKQEAgLTE2NCwxNiArMTY5LDkgQEAKIGNwdV9yZXN1bWVfbDFfZmxhZ3M6CiAJQUxUX1NNUCgubG9uZyBQTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfQVBfV1JJVEUgfCBQTURfRkxBR1NfU01QKQogCUFMVF9VUCgubG9uZyAgUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0FQX1dSSVRFIHwgUE1EX0ZMQUdTX1VQKQotI2Vsc2UKLSNkZWZpbmUgY3B1X3Y2X2RvX3N1c3BlbmQgMAotI2RlZmluZSBjcHVfdjZfZG9fcmVzdW1lIDAKICNlbmRpZgogCi0KLQkudHlwZQljcHVfdjZfbmFtZSwgI29iamVjdAotY3B1X3Y2X25hbWU6Ci0JLmFzY2l6CSJBUk12Ni1jb21wYXRpYmxlIHByb2Nlc3NvciIKLQkuc2l6ZQljcHVfdjZfbmFtZSwgLiAtIGNwdV92Nl9uYW1lCisJc3RyaW5nCWNwdV92Nl9uYW1lLCAiQVJNdjYtY29tcGF0aWJsZSBwcm9jZXNzb3IiCiAKIAkuYWxpZ24KIApAQCAtMjM5LDMzICsyMzcsMTMgQEAKIAogCV9fSU5JVERBVEEKIAotCS50eXBlCXY2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKLUVOVFJZKHY2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMpCi0JLndvcmQJdjZfZWFybHlfYWJvcnQKLQkud29yZAl2Nl9wYWJvcnQKLQkud29yZAljcHVfdjZfcHJvY19pbml0Ci0JLndvcmQJY3B1X3Y2X3Byb2NfZmluCi0JLndvcmQJY3B1X3Y2X3Jlc2V0Ci0JLndvcmQJY3B1X3Y2X2RvX2lkbGUKLQkud29yZAljcHVfdjZfZGNhY2hlX2NsZWFuX2FyZWEKLQkud29yZAljcHVfdjZfc3dpdGNoX21tCi0JLndvcmQJY3B1X3Y2X3NldF9wdGVfZXh0Ci0JLndvcmQJY3B1X3Y2X3N1c3BlbmRfc2l6ZQotCS53b3JkCWNwdV92Nl9kb19zdXNwZW5kCi0JLndvcmQJY3B1X3Y2X2RvX3Jlc3VtZQotCS5zaXplCXY2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSB2Nl9wcm9jZXNzb3JfZnVuY3Rpb25zCisJQCBkZWZpbmUgc3RydWN0IHByb2Nlc3NvciAoc2VlIDxhc20vcHJvYy1mbnMuaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX3Byb2Nlc3Nvcl9mdW5jdGlvbnMgdjYsIGRhYm9ydD12Nl9lYXJseV9hYm9ydCwgcGFib3J0PXY2X3BhYm9ydCwgc3VzcGVuZD0xCiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKIAotCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6Ci0JLmFzY2l6CSJhcm12NiIKLQkuc2l6ZQljcHVfYXJjaF9uYW1lLCAuIC0gY3B1X2FyY2hfbmFtZQotCi0JLnR5cGUJY3B1X2VsZl9uYW1lLCAjb2JqZWN0Ci1jcHVfZWxmX25hbWU6Ci0JLmFzY2l6CSJ2NiIKLQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKKwlzdHJpbmcJY3B1X2FyY2hfbmFtZSwgImFybXY2IgorCXN0cmluZwljcHVfZWxmX25hbWUsICJ2NiIKIAkuYWxpZ24KIAogCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwppbmRleCBiM2I1NjZlLi5hMzBlNzg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCkBAIC01OCw5ICs1OCwxNiBAQAogICoJdG8gd2hhdCB3b3VsZCBiZSB0aGUgcmVzZXQgdmVjdG9yLgogICoKICAqCS0gbG9jICAgLSBsb2NhdGlvbiB0byBqdW1wIHRvIGZvciBzb2Z0IHJlc2V0CisgKgorICoJVGhpcyBjb2RlIG11c3QgYmUgZXhlY3V0ZWQgdXNpbmcgYSBmbGF0IGlkZW50aXR5IG1hcHBpbmcgd2l0aAorICogICAgICBjYWNoZXMgZGlzYWJsZWQuCiAgKi8KIAkuYWxpZ24JNQogRU5UUlkoY3B1X3Y3X3Jlc2V0KQorCW1yYwlwMTUsIDAsIHIxLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgorCWJpYwlyMSwgcjEsICMweDEJCQlAIC4uLi4uLi4uLi4uLi4uLm0KKwltY3IJcDE1LCAwLCByMSwgYzEsIGMwLCAwCQlAIGRpc2FibGUgTU1VCisJaXNiCiAJbW92CXBjLCByMAogRU5EUFJPQyhjcHVfdjdfcmVzZXQpCiAKQEAgLTEwOCwxNiArMTE1LDE4IEBACiAjaWZkZWYgQ09ORklHX0FSTV9FUlJBVEFfNDMwOTczCiAJbWNyCXAxNSwgMCwgcjIsIGM3LCBjNSwgNgkJQCBmbHVzaCBCVEFDL0JUQgogI2VuZGlmCi0JbXJjCXAxNSwgMCwgcjIsIGMyLCBjMCwgMQkJQCBsb2FkIFRUQiAxCi0JbWNyCXAxNSwgMCwgcjIsIGMyLCBjMCwgMAkJQCBpbnRvIFRUQiAwCisjaWZkZWYgQ09ORklHX0FSTV9FUlJBVEFfNzU0MzIyCisJZHNiCisjZW5kaWYKKwltY3IJcDE1LCAwLCByMiwgYzEzLCBjMCwgMQkJQCBzZXQgcmVzZXJ2ZWQgY29udGV4dCBJRAorCWlzYgorMToJbWNyCXAxNSwgMCwgcjAsIGMyLCBjMCwgMAkJQCBzZXQgVFRCIDAKIAlpc2IKICNpZmRlZiBDT05GSUdfQVJNX0VSUkFUQV83NTQzMjIKIAlkc2IKICNlbmRpZgogCW1jcglwMTUsIDAsIHIxLCBjMTMsIGMwLCAxCQlAIHNldCBjb250ZXh0IElECiAJaXNiCi0JbWNyCXAxNSwgMCwgcjAsIGMyLCBjMCwgMAkJQCBzZXQgVFRCIDAKLQlpc2IKICNlbmRpZgogCW1vdglwYywgbHIKIEVORFBST0MoY3B1X3Y3X3N3aXRjaF9tbSkKQEAgLTE3MSw4ICsxODAsNyBAQAogCW1vdglwYywgbHIKIEVORFBST0MoY3B1X3Y3X3NldF9wdGVfZXh0KQogCi1jcHVfdjdfbmFtZToKLQkuYXNjaWkJIkFSTXY3IFByb2Nlc3NvciIKKwlzdHJpbmcJY3B1X3Y3X25hbWUsICJBUk12NyBQcm9jZXNzb3IiCiAJLmFsaWduCiAKIAkvKgpAQCAtMjA4LDE5ICsyMTYsMjEgQEAKIAogLyogU3VzcGVuZC9yZXN1bWUgc3VwcG9ydDogZGVyaXZlZCBmcm9tIGFyY2gvYXJtL21hY2gtczVwdjIxMC9zbGVlcC5TICovCiAuZ2xvYmwJY3B1X3Y3X3N1c3BlbmRfc2l6ZQotLmVxdQljcHVfdjdfc3VzcGVuZF9zaXplLCA0ICogOAorLmVxdQljcHVfdjdfc3VzcGVuZF9zaXplLCA0ICogOQogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogRU5UUlkoY3B1X3Y3X2RvX3N1c3BlbmQpCiAJc3RtZmQJc3AhLCB7cjQgLSByMTEsIGxyfQogCW1yYwlwMTUsIDAsIHI0LCBjMTMsIGMwLCAwCUAgRkNTRS9QSUQKIAltcmMJcDE1LCAwLCByNSwgYzEzLCBjMCwgMQlAIENvbnRleHQgSUQKKwltcmMJcDE1LCAwLCByNiwgYzEzLCBjMCwgMwlAIFVzZXIgci9vIHRocmVhZCBJRAorCXN0bWlhCXIwISwge3I0IC0gcjZ9CiAJbXJjCXAxNSwgMCwgcjYsIGMzLCBjMCwgMAlAIERvbWFpbiBJRAogCW1yYwlwMTUsIDAsIHI3LCBjMiwgYzAsIDAJQCBUVEIgMAogCW1yYwlwMTUsIDAsIHI4LCBjMiwgYzAsIDEJQCBUVEIgMQogCW1yYwlwMTUsIDAsIHI5LCBjMSwgYzAsIDAJQCBDb250cm9sIHJlZ2lzdGVyCiAJbXJjCXAxNSwgMCwgcjEwLCBjMSwgYzAsIDEJQCBBdXhpbGlhcnkgY29udHJvbCByZWdpc3RlcgogCW1yYwlwMTUsIDAsIHIxMSwgYzEsIGMwLCAyCUAgQ28tcHJvY2Vzc29yIGFjY2VzcyBjb250cm9sCi0Jc3RtaWEJcjAsIHtyNCAtIHIxMX0KKwlzdG1pYQlyMCwge3I2IC0gcjExfQogCWxkbWZkCXNwISwge3I0IC0gcjExLCBwY30KIEVORFBST0MoY3B1X3Y3X2RvX3N1c3BlbmQpCiAKQEAgLTIyOCw5ICsyMzgsMTEgQEAKIAltb3YJaXAsICMwCiAJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAlAIGludmFsaWRhdGUgVExCcwogCW1jcglwMTUsIDAsIGlwLCBjNywgYzUsIDAJQCBpbnZhbGlkYXRlIEkgY2FjaGUKLQlsZG1pYQlyMCwge3I0IC0gcjExfQorCWxkbWlhCXIwISwge3I0IC0gcjZ9CiAJbWNyCXAxNSwgMCwgcjQsIGMxMywgYzAsIDAJQCBGQ1NFL1BJRAogCW1jcglwMTUsIDAsIHI1LCBjMTMsIGMwLCAxCUAgQ29udGV4dCBJRAorCW1jcglwMTUsIDAsIHI2LCBjMTMsIGMwLCAzCUAgVXNlciByL28gdGhyZWFkIElECisJbGRtaWEJcjAsIHtyNiAtIHIxMX0KIAltY3IJcDE1LCAwLCByNiwgYzMsIGMwLCAwCUAgRG9tYWluIElECiAJbWNyCXAxNSwgMCwgcjcsIGMyLCBjMCwgMAlAIFRUQiAwCiAJbWNyCXAxNSwgMCwgcjgsIGMyLCBjMCwgMQlAIFRUQiAxCkBAIC0yNTEsOSArMjYzLDYgQEAKIGNwdV9yZXN1bWVfbDFfZmxhZ3M6CiAJQUxUX1NNUCgubG9uZyBQTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfQVBfV1JJVEUgfCBQTURfRkxBR1NfU01QKQogCUFMVF9VUCgubG9uZyAgUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0FQX1dSSVRFIHwgUE1EX0ZMQUdTX1VQKQotI2Vsc2UKLSNkZWZpbmUgY3B1X3Y3X2RvX3N1c3BlbmQJMAotI2RlZmluZSBjcHVfdjdfZG9fcmVzdW1lCTAKICNlbmRpZgogCiAJX19DUFVJTklUCkBAIC0yNzMsMTMgKzI4MiwyMCBAQAogICoJSXQgaXMgYXNzdW1lZCB0aGF0OgogICoJLSBjYWNoZSB0eXBlIHJlZ2lzdGVyIGlzIGltcGxlbWVudGVkCiAgKi8KK19fdjdfY2E1bXBfc2V0dXA6CiBfX3Y3X2NhOW1wX3NldHVwOgorCW1vdglyMTAsICMoMSA8PCAwKQkJCUAgVExCIG9wcyBicm9hZGNhc3RpbmcKKwliCTFmCitfX3Y3X2NhMTVtcF9zZXR1cDoKKwltb3YJcjEwLCAjMAorMToKICNpZmRlZiBDT05GSUdfU01QCiAJQUxUX1NNUChtcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAxKQogCUFMVF9VUChtb3YJcjAsICMoMSA8PCA2KSkJCUAgZmFrZSBpdCBmb3IgVVAKIAl0c3QJcjAsICMoMSA8PCA2KQkJCUAgU01QL25BTVAgbW9kZSBlbmFibGVkPwotCW9ycmVxCXIwLCByMCwgIygxIDw8IDYpIHwgKDEgPDwgMCkJQCBFbmFibGUgU01QL25BTVAgbW9kZSBhbmQKLQltY3JlcQlwMTUsIDAsIHIwLCBjMSwgYzAsIDEJCUAgVExCIG9wcyBicm9hZGNhc3RpbmcKKwlvcnJlcQlyMCwgcjAsICMoMSA8PCA2KQkJQCBFbmFibGUgU01QL25BTVAgbW9kZQorCW9ycmVxCXIwLCByMCwgcjEwCQkJQCBFbmFibGUgQ1BVLXNwZWNpZmljIFNNUCBiaXRzCisJbWNyZXEJcDE1LCAwLCByMCwgYzEsIGMwLCAxCiAjZW5kaWYKIF9fdjdfc2V0dXA6CiAJYWRyCXIxMiwgX192N19zZXR1cF9zdGFjawkJQCB0aGUgbG9jYWwgc3RhY2sKQEAgLTQwNSw5NCArNDIxLDc1IEBACiAKIAlfX0lOSVREQVRBCiAKLQkudHlwZQl2N19wcm9jZXNzb3JfZnVuY3Rpb25zLCAjb2JqZWN0Ci1FTlRSWSh2N19wcm9jZXNzb3JfZnVuY3Rpb25zKQotCS53b3JkCXY3X2Vhcmx5X2Fib3J0Ci0JLndvcmQJdjdfcGFib3J0Ci0JLndvcmQJY3B1X3Y3X3Byb2NfaW5pdAotCS53b3JkCWNwdV92N19wcm9jX2ZpbgotCS53b3JkCWNwdV92N19yZXNldAotCS53b3JkCWNwdV92N19kb19pZGxlCi0JLndvcmQJY3B1X3Y3X2RjYWNoZV9jbGVhbl9hcmVhCi0JLndvcmQJY3B1X3Y3X3N3aXRjaF9tbQotCS53b3JkCWNwdV92N19zZXRfcHRlX2V4dAotCS53b3JkCTAKLQkud29yZAkwCi0JLndvcmQJMAotCS5zaXplCXY3X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSB2N19wcm9jZXNzb3JfZnVuY3Rpb25zCisJQCBkZWZpbmUgc3RydWN0IHByb2Nlc3NvciAoc2VlIDxhc20vcHJvYy1mbnMuaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX3Byb2Nlc3Nvcl9mdW5jdGlvbnMgdjcsIGRhYm9ydD12N19lYXJseV9hYm9ydCwgcGFib3J0PXY3X3BhYm9ydCwgc3VzcGVuZD0xCiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKIAotCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6Ci0JLmFzY2l6CSJhcm12NyIKLQkuc2l6ZQljcHVfYXJjaF9uYW1lLCAuIC0gY3B1X2FyY2hfbmFtZQotCi0JLnR5cGUJY3B1X2VsZl9uYW1lLCAjb2JqZWN0Ci1jcHVfZWxmX25hbWU6Ci0JLmFzY2l6CSJ2NyIKLQkuc2l6ZQljcHVfZWxmX25hbWUsIC4gLSBjcHVfZWxmX25hbWUKKwlzdHJpbmcJY3B1X2FyY2hfbmFtZSwgImFybXY3IgorCXN0cmluZwljcHVfZWxmX25hbWUsICJ2NyIKIAkuYWxpZ24KIAogCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKIAotCS50eXBlICAgX192N19jYTltcF9wcm9jX2luZm8sICNvYmplY3QKLV9fdjdfY2E5bXBfcHJvY19pbmZvOgotCS5sb25nCTB4NDEwZmMwOTAJCUAgUmVxdWlyZWQgSUQgdmFsdWUKLQkubG9uZwkweGZmMGZmZmYwCQlAIE1hc2sgZm9yIElECi0JQUxUX1NNUCgubG9uZyBcCi0JCVBNRF9UWVBFX1NFQ1QgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFEIHwgXAotCQlQTURfRkxBR1NfU01QKQotCUFMVF9VUCgubG9uZyBcCi0JCVBNRF9UWVBFX1NFQ1QgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFEIHwgXAotCQlQTURfRkxBR1NfVVApCi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9YTiB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQlXKGIpCV9fdjdfY2E5bXBfc2V0dXAKKwkvKgorCSAqIFN0YW5kYXJkIHY3IHByb2MgaW5mbyBjb250ZW50CisJICovCisubWFjcm8gX192N19wcm9jIGluaXRmdW5jLCBtbV9tbXVmbGFncyA9IDAsIGlvX21tdWZsYWdzID0gMCwgaHdjYXBzID0gMAorCUFMVF9TTVAoLmxvbmcJUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0FQX1dSSVRFIHwgUE1EX1NFQ1RfQVBfUkVBRCB8IFwKKwkJCVBNRF9GTEFHU19TTVAgfCBcbW1fbW11ZmxhZ3MpCisJQUxUX1VQKC5sb25nCVBNRF9UWVBFX1NFQ1QgfCBQTURfU0VDVF9BUF9XUklURSB8IFBNRF9TRUNUX0FQX1JFQUQgfCBcCisJCQlQTURfRkxBR1NfVVAgfCBcbW1fbW11ZmxhZ3MpCisJLmxvbmcJUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX1hOIHwgUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCisJCVBNRF9TRUNUX0FQX1JFQUQgfCBcaW9fbW11ZmxhZ3MKKwlXKGIpCVxpbml0ZnVuYwogCS5sb25nCWNwdV9hcmNoX25hbWUKIAkubG9uZwljcHVfZWxmX25hbWUKLQkubG9uZwlIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUHxIV0NBUF9UTFMKKwkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9IQUxGIHwgSFdDQVBfVEhVTUIgfCBIV0NBUF9GQVNUX01VTFQgfCBcCisJCUhXQ0FQX0VEU1AgfCBIV0NBUF9UTFMgfCBcaHdjYXBzCiAJLmxvbmcJY3B1X3Y3X25hbWUKIAkubG9uZwl2N19wcm9jZXNzb3JfZnVuY3Rpb25zCiAJLmxvbmcJdjd3YmlfdGxiX2ZucwogCS5sb25nCXY2X3VzZXJfZm5zCiAJLmxvbmcJdjdfY2FjaGVfZm5zCisuZW5kbQorCisJLyoKKwkgKiBBUk0gTHRkLiBDb3J0ZXggQTUgcHJvY2Vzc29yLgorCSAqLworCS50eXBlICAgX192N19jYTVtcF9wcm9jX2luZm8sICNvYmplY3QKK19fdjdfY2E1bXBfcHJvY19pbmZvOgorCS5sb25nCTB4NDEwZmMwNTAKKwkubG9uZwkweGZmMGZmZmYwCisJX192N19wcm9jIF9fdjdfY2E1bXBfc2V0dXAKKwkuc2l6ZQlfX3Y3X2NhNW1wX3Byb2NfaW5mbywgLiAtIF9fdjdfY2E1bXBfcHJvY19pbmZvCisKKwkvKgorCSAqIEFSTSBMdGQuIENvcnRleCBBOSBwcm9jZXNzb3IuCisJICovCisJLnR5cGUgICBfX3Y3X2NhOW1wX3Byb2NfaW5mbywgI29iamVjdAorX192N19jYTltcF9wcm9jX2luZm86CisJLmxvbmcJMHg0MTBmYzA5MAorCS5sb25nCTB4ZmYwZmZmZjAKKwlfX3Y3X3Byb2MgX192N19jYTltcF9zZXR1cAogCS5zaXplCV9fdjdfY2E5bXBfcHJvY19pbmZvLCAuIC0gX192N19jYTltcF9wcm9jX2luZm8KIAogCS8qCisJICogQVJNIEx0ZC4gQ29ydGV4IEExNSBwcm9jZXNzb3IuCisJICovCisJLnR5cGUJX192N19jYTE1bXBfcHJvY19pbmZvLCAjb2JqZWN0CitfX3Y3X2NhMTVtcF9wcm9jX2luZm86CisJLmxvbmcJMHg0MTBmYzBmMAorCS5sb25nCTB4ZmYwZmZmZjAKKwlfX3Y3X3Byb2MgX192N19jYTE1bXBfc2V0dXAsIGh3Y2FwcyA9IEhXQ0FQX0lESVYKKwkuc2l6ZQlfX3Y3X2NhMTVtcF9wcm9jX2luZm8sIC4gLSBfX3Y3X2NhMTVtcF9wcm9jX2luZm8KKworCS8qCiAJICogTWF0Y2ggYW55IEFSTXY3IHByb2Nlc3NvciBjb3JlLgogCSAqLwogCS50eXBlCV9fdjdfcHJvY19pbmZvLCAjb2JqZWN0CiBfX3Y3X3Byb2NfaW5mbzoKIAkubG9uZwkweDAwMGYwMDAwCQlAIFJlcXVpcmVkIElEIHZhbHVlCiAJLmxvbmcJMHgwMDBmMDAwMAkJQCBNYXNrIGZvciBJRAotCUFMVF9TTVAoLmxvbmcgXAotCQlQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRCB8IFwKLQkJUE1EX0ZMQUdTX1NNUCkKLQlBTFRfVVAoLmxvbmcgXAotCQlQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRCB8IFwKLQkJUE1EX0ZMQUdTX1VQKQotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfWE4gfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JVyhiKQlfX3Y3X3NldHVwCi0JLmxvbmcJY3B1X2FyY2hfbmFtZQotCS5sb25nCWNwdV9lbGZfbmFtZQotCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQfEhXQ0FQX1RMUwotCS5sb25nCWNwdV92N19uYW1lCi0JLmxvbmcJdjdfcHJvY2Vzc29yX2Z1bmN0aW9ucwotCS5sb25nCXY3d2JpX3RsYl9mbnMKLQkubG9uZwl2Nl91c2VyX2ZucwotCS5sb25nCXY3X2NhY2hlX2ZucworCV9fdjdfcHJvYyBfX3Y3X3NldHVwCiAJLnNpemUJX192N19wcm9jX2luZm8sIC4gLSBfX3Y3X3Byb2NfaW5mbwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy14c2MzLlMgYi9hcmNoL2FybS9tbS9wcm9jLXhzYzMuUwppbmRleCA1OTYyMTM2Li42NGYxZmM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXhzYzMuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXhzYzMuUwpAQCAtMzM1LDE3ICszMzUsOCBAQAogCW1vdglwYywgbHIKIEVORFBST0MoeHNjM19kbWFfdW5tYXBfYXJlYSkKIAotRU5UUlkoeHNjM19jYWNoZV9mbnMpCi0JLmxvbmcJeHNjM19mbHVzaF9pY2FjaGVfYWxsCi0JLmxvbmcJeHNjM19mbHVzaF9rZXJuX2NhY2hlX2FsbAotCS5sb25nCXhzYzNfZmx1c2hfdXNlcl9jYWNoZV9hbGwKLQkubG9uZwl4c2MzX2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UKLQkubG9uZwl4c2MzX2NvaGVyZW50X2tlcm5fcmFuZ2UKLQkubG9uZwl4c2MzX2NvaGVyZW50X3VzZXJfcmFuZ2UKLQkubG9uZwl4c2MzX2ZsdXNoX2tlcm5fZGNhY2hlX2FyZWEKLQkubG9uZwl4c2MzX2RtYV9tYXBfYXJlYQotCS5sb25nCXhzYzNfZG1hX3VubWFwX2FyZWEKLQkubG9uZwl4c2MzX2RtYV9mbHVzaF9yYW5nZQorCUAgZGVmaW5lIHN0cnVjdCBjcHVfY2FjaGVfZm5zIChzZWUgPGFzbS9jYWNoZWZsdXNoLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQorCWRlZmluZV9jYWNoZV9mdW5jdGlvbnMgeHNjMwogCiBFTlRSWShjcHVfeHNjM19kY2FjaGVfY2xlYW5fYXJlYSkKIDE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEwxIEQgbGluZQpAQCAtNDU0LDkgKzQ0NSw2IEBACiAJbGRyCXIzLCA9MHg1NDJlCQlAIHNlY3Rpb24gZmxhZ3MKIAliCWNwdV9yZXN1bWVfbW11CiBFTkRQUk9DKGNwdV94c2MzX2RvX3Jlc3VtZSkKLSNlbHNlCi0jZGVmaW5lIGNwdV94c2MzX2RvX3N1c3BlbmQJMAotI2RlZmluZSBjcHVfeHNjM19kb19yZXN1bWUJMAogI2VuZGlmCiAKIAlfX0NQVUlOSVQKQEAgLTUwMyw1MiArNDkxLDI0IEBACiAKIAlfX0lOSVREQVRBCiAKLS8qCi0gKiBQdXJwb3NlIDogRnVuY3Rpb24gcG9pbnRlcnMgdXNlZCB0byBhY2Nlc3MgYWJvdmUgZnVuY3Rpb25zIC0gYWxsIGNhbGxzCi0gKgkgICAgIGNvbWUgdGhyb3VnaCB0aGVzZQotICovCi0KLQkudHlwZQl4c2MzX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKLUVOVFJZKHhzYzNfcHJvY2Vzc29yX2Z1bmN0aW9ucykKLQkud29yZAl2NXRfZWFybHlfYWJvcnQKLQkud29yZAlsZWdhY3lfcGFib3J0Ci0JLndvcmQJY3B1X3hzYzNfcHJvY19pbml0Ci0JLndvcmQJY3B1X3hzYzNfcHJvY19maW4KLQkud29yZAljcHVfeHNjM19yZXNldAotCS53b3JkCWNwdV94c2MzX2RvX2lkbGUKLQkud29yZAljcHVfeHNjM19kY2FjaGVfY2xlYW5fYXJlYQotCS53b3JkCWNwdV94c2MzX3N3aXRjaF9tbQotCS53b3JkCWNwdV94c2MzX3NldF9wdGVfZXh0Ci0JLndvcmQJY3B1X3hzYzNfc3VzcGVuZF9zaXplCi0JLndvcmQJY3B1X3hzYzNfZG9fc3VzcGVuZAotCS53b3JkCWNwdV94c2MzX2RvX3Jlc3VtZQotCS5zaXplCXhzYzNfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIHhzYzNfcHJvY2Vzc29yX2Z1bmN0aW9ucworCUAgZGVmaW5lIHN0cnVjdCBwcm9jZXNzb3IgKHNlZSA8YXNtL3Byb2MtZm5zLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQorCWRlZmluZV9wcm9jZXNzb3JfZnVuY3Rpb25zIHhzYzMsIGRhYm9ydD12NXRfZWFybHlfYWJvcnQsIHBhYm9ydD1sZWdhY3lfcGFib3J0LCBzdXNwZW5kPTEKIAogCS5zZWN0aW9uICIucm9kYXRhIgogCi0JLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdAotY3B1X2FyY2hfbmFtZToKLQkuYXNjaXoJImFybXY1dGUiCi0JLnNpemUJY3B1X2FyY2hfbmFtZSwgLiAtIGNwdV9hcmNoX25hbWUKLQotCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAotY3B1X2VsZl9uYW1lOgotCS5hc2NpegkidjUiCi0JLnNpemUJY3B1X2VsZl9uYW1lLCAuIC0gY3B1X2VsZl9uYW1lCi0KLQkudHlwZQljcHVfeHNjM19uYW1lLCAjb2JqZWN0Ci1jcHVfeHNjM19uYW1lOgotCS5hc2NpegkiWFNjYWxlLVYzIGJhc2VkIHByb2Nlc3NvciIKLQkuc2l6ZQljcHVfeHNjM19uYW1lLCAuIC0gY3B1X3hzYzNfbmFtZQorCXN0cmluZwljcHVfYXJjaF9uYW1lLCAiYXJtdjV0ZSIKKwlzdHJpbmcJY3B1X2VsZl9uYW1lLCAidjUiCisJc3RyaW5nCWNwdV94c2MzX25hbWUsICJYU2NhbGUtVjMgYmFzZWQgcHJvY2Vzc29yIgogCiAJLmFsaWduCiAKIAkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCiAKLQkudHlwZQlfX3hzYzNfcHJvY19pbmZvLCNvYmplY3QKLV9feHNjM19wcm9jX2luZm86Ci0JLmxvbmcJMHg2OTA1NjAwMAotCS5sb25nCTB4ZmZmZmUwMDAKKy5tYWNybyB4c2MzX3Byb2NfaW5mbyBuYW1lOnJlcSwgY3B1X3ZhbDpyZXEsIGNwdV9tYXNrOnJlcQorCS50eXBlCV9fXG5hbWVcKClfcHJvY19pbmZvLCNvYmplY3QKK19fXG5hbWVcKClfcHJvY19pbmZvOgorCS5sb25nCVxjcHVfdmFsCisJLmxvbmcJXGNwdV9tYXNrCiAJLmxvbmcJUE1EX1RZUEVfU0VDVCB8IFwKIAkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKIAkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXApAQCAtNTY2LDI5ICs1MjYsMTAgQEAKIAkubG9uZwl2NHdiaV90bGJfZm5zCiAJLmxvbmcJeHNjM19tY191c2VyX2ZucwogCS5sb25nCXhzYzNfY2FjaGVfZm5zCi0JLnNpemUJX194c2MzX3Byb2NfaW5mbywgLiAtIF9feHNjM19wcm9jX2luZm8KKwkuc2l6ZQlfX1xuYW1lXCgpX3Byb2NfaW5mbywgLiAtIF9fXG5hbWVcKClfcHJvY19pbmZvCisuZW5kbQorCisJeHNjM19wcm9jX2luZm8geHNjMywgMHg2OTA1NjAwMCwgMHhmZmZmZTAwMAogCiAvKiBOb3RlOiBQWEE5MzUgY2hhbmdlZCBpdHMgaW1wbGVtZW50b3IgSUQgZnJvbSBJbnRlbCB0byBNYXJ2ZWxsICovCi0KLQkudHlwZQlfX3hzYzNfcHhhOTM1X3Byb2NfaW5mbywjb2JqZWN0Ci1fX3hzYzNfcHhhOTM1X3Byb2NfaW5mbzoKLQkubG9uZwkweDU2MDU2MDAwCi0JLmxvbmcJMHhmZmZmZTAwMAotCS5sb25nCVBNRF9UWVBFX1NFQ1QgfCBcCi0JCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCi0JCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQkubG9uZwlQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCWIJX194c2MzX3NldHVwCi0JLmxvbmcJY3B1X2FyY2hfbmFtZQotCS5sb25nCWNwdV9lbGZfbmFtZQotCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCi0JLmxvbmcJY3B1X3hzYzNfbmFtZQotCS5sb25nCXhzYzNfcHJvY2Vzc29yX2Z1bmN0aW9ucwotCS5sb25nCXY0d2JpX3RsYl9mbnMKLQkubG9uZwl4c2MzX21jX3VzZXJfZm5zCi0JLmxvbmcJeHNjM19jYWNoZV9mbnMKLQkuc2l6ZQlfX3hzYzNfcHhhOTM1X3Byb2NfaW5mbywgLiAtIF9feHNjM19weGE5MzVfcHJvY19pbmZvCisJeHNjM19wcm9jX2luZm8geHNjM19weGE5MzUsIDB4NTYwNTYwMDAsIDB4ZmZmZmUwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMgYi9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TCmluZGV4IDQyYWY5NzYuLmZiYzA2ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUwpAQCAtMzkwLDEyICszOTAsMTIgQEAKICAqCS0gc2l6ZQktIHNpemUgb2YgcmVnaW9uCiAgKgktIGRpcgktIERNQSBkaXJlY3Rpb24KICAqLwotRU5UUlkoeHNjYWxlX2RtYV9hMF9tYXBfYXJlYSkKK0VOVFJZKHhzY2FsZV84MDIwMF9BMF9BMV9kbWFfbWFwX2FyZWEpCiAJYWRkCXIxLCByMSwgcjAKIAl0ZXEJcjIsICNETUFfVE9fREVWSUNFCiAJYmVxCXhzY2FsZV9kbWFfY2xlYW5fcmFuZ2UKIAliCXhzY2FsZV9kbWFfZmx1c2hfcmFuZ2UKLUVORFBST0MoeHNjYWxlX2RtYV9hMF9tYXBfYXJlYSkKK0VORFBST0MoeHNjYWxlXzgwMjAwX0EwX0ExX2RtYV9tYXBfYXJlYSkKIAogLyoKICAqCWRtYV91bm1hcF9hcmVhKHN0YXJ0LCBzaXplLCBkaXIpCkBAIC00MDcsMTcgKzQwNyw4IEBACiAJbW92CXBjLCBscgogRU5EUFJPQyh4c2NhbGVfZG1hX3VubWFwX2FyZWEpCiAKLUVOVFJZKHhzY2FsZV9jYWNoZV9mbnMpCi0JLmxvbmcJeHNjYWxlX2ZsdXNoX2ljYWNoZV9hbGwKLQkubG9uZwl4c2NhbGVfZmx1c2hfa2Vybl9jYWNoZV9hbGwKLQkubG9uZwl4c2NhbGVfZmx1c2hfdXNlcl9jYWNoZV9hbGwKLQkubG9uZwl4c2NhbGVfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQotCS5sb25nCXhzY2FsZV9jb2hlcmVudF9rZXJuX3JhbmdlCi0JLmxvbmcJeHNjYWxlX2NvaGVyZW50X3VzZXJfcmFuZ2UKLQkubG9uZwl4c2NhbGVfZmx1c2hfa2Vybl9kY2FjaGVfYXJlYQotCS5sb25nCXhzY2FsZV9kbWFfbWFwX2FyZWEKLQkubG9uZwl4c2NhbGVfZG1hX3VubWFwX2FyZWEKLQkubG9uZwl4c2NhbGVfZG1hX2ZsdXNoX3JhbmdlCisJQCBkZWZpbmUgc3RydWN0IGNwdV9jYWNoZV9mbnMgKHNlZSA8YXNtL2NhY2hlZmx1c2guaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX2NhY2hlX2Z1bmN0aW9ucyB4c2NhbGUKIAogLyoKICAqIE9uIHN0ZXBwaW5nIEEwL0ExIG9mIHRoZSA4MDIwMCwgaW52YWxpZGF0aW5nIEQtY2FjaGUgYnkgbGluZSBkb2Vzbid0CkBAIC00MzIsMTYgKzQyMywyOCBAQAogICogcmV2aXNpb24gSmFudWFyeSAyMiwgMjAwMywgYXZhaWxhYmxlIGF0OgogICogICAgIGh0dHA6Ly93d3cuaW50ZWwuY29tL2Rlc2lnbi9paW8vc3BlY3VwZHQvMjczNDE1Lmh0bQogICovCi1FTlRSWSh4c2NhbGVfODAyMDBfQTBfQTFfY2FjaGVfZm5zKQotCS5sb25nCXhzY2FsZV9mbHVzaF9rZXJuX2NhY2hlX2FsbAotCS5sb25nCXhzY2FsZV9mbHVzaF91c2VyX2NhY2hlX2FsbAotCS5sb25nCXhzY2FsZV9mbHVzaF91c2VyX2NhY2hlX3JhbmdlCi0JLmxvbmcJeHNjYWxlX2NvaGVyZW50X2tlcm5fcmFuZ2UKLQkubG9uZwl4c2NhbGVfY29oZXJlbnRfdXNlcl9yYW5nZQotCS5sb25nCXhzY2FsZV9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhCi0JLmxvbmcJeHNjYWxlX2RtYV9hMF9tYXBfYXJlYQotCS5sb25nCXhzY2FsZV9kbWFfdW5tYXBfYXJlYQotCS5sb25nCXhzY2FsZV9kbWFfZmx1c2hfcmFuZ2UKKy5tYWNybyBhMF9hbGlhcyBiYXNlbmFtZQorCS5nbG9ibCB4c2NhbGVfODAyMDBfQTBfQTFfXGJhc2VuYW1lCisJLnR5cGUgeHNjYWxlXzgwMjAwX0EwX0ExX1xiYXNlbmFtZSAsICVmdW5jdGlvbgorCS5lcXUgeHNjYWxlXzgwMjAwX0EwX0ExX1xiYXNlbmFtZSAsIHhzY2FsZV9cYmFzZW5hbWUKKy5lbmRtCisKKy8qCisgKiBNb3N0IG9mIHRoZSBjYWNoZSBmdW5jdGlvbnMgYXJlIHVuY2hhbmdlZCBmb3IgdGhlc2UgcHJvY2Vzc29yIHJldmlzaW9ucy4KKyAqIEV4cG9ydCBzdWl0YWJsZSBhbGlhcyBzeW1ib2xzIGZvciB0aGUgdW5jaGFuZ2VkIGZ1bmN0aW9uczoKKyAqLworCWEwX2FsaWFzIGZsdXNoX2ljYWNoZV9hbGwKKwlhMF9hbGlhcyBmbHVzaF91c2VyX2NhY2hlX2FsbAorCWEwX2FsaWFzIGZsdXNoX2tlcm5fY2FjaGVfYWxsCisJYTBfYWxpYXMgZmx1c2hfdXNlcl9jYWNoZV9yYW5nZQorCWEwX2FsaWFzIGNvaGVyZW50X2tlcm5fcmFuZ2UKKwlhMF9hbGlhcyBjb2hlcmVudF91c2VyX3JhbmdlCisJYTBfYWxpYXMgZmx1c2hfa2Vybl9kY2FjaGVfYXJlYQorCWEwX2FsaWFzIGRtYV9mbHVzaF9yYW5nZQorCWEwX2FsaWFzIGRtYV91bm1hcF9hcmVhCisKKwlAIGRlZmluZSBzdHJ1Y3QgY3B1X2NhY2hlX2ZucyAoc2VlIDxhc20vY2FjaGVmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykKKwlkZWZpbmVfY2FjaGVfZnVuY3Rpb25zIHhzY2FsZV84MDIwMF9BMF9BMQogCiBFTlRSWShjcHVfeHNjYWxlX2RjYWNoZV9jbGVhbl9hcmVhKQogMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQpAQCAtNTUxLDkgKzU1NCw2IEBACiAJCSAgICAgUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgUE1EX1NFQ1RfQVBfV1JJVEUKIAliCWNwdV9yZXN1bWVfbW11CiBFTkRQUk9DKGNwdV94c2NhbGVfZG9fcmVzdW1lKQotI2Vsc2UKLSNkZWZpbmUgY3B1X3hzY2FsZV9kb19zdXNwZW5kCTAKLSNkZWZpbmUgY3B1X3hzY2FsZV9kb19yZXN1bWUJMAogI2VuZGlmCiAKIAlfX0NQVUlOSVQKQEAgLTU4Nyw0MzIgKzU4Nyw3NCBAQAogCiAJX19JTklUREFUQQogCi0vKgotICogUHVycG9zZSA6IEZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gYWNjZXNzIGFib3ZlIGZ1bmN0aW9ucyAtIGFsbCBjYWxscwotICoJICAgICBjb21lIHRocm91Z2ggdGhlc2UKLSAqLwotCi0JLnR5cGUJeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsICNvYmplY3QKLUVOVFJZKHhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zKQotCS53b3JkCXY1dF9lYXJseV9hYm9ydAotCS53b3JkCWxlZ2FjeV9wYWJvcnQKLQkud29yZAljcHVfeHNjYWxlX3Byb2NfaW5pdAotCS53b3JkCWNwdV94c2NhbGVfcHJvY19maW4KLQkud29yZAljcHVfeHNjYWxlX3Jlc2V0Ci0JLndvcmQJY3B1X3hzY2FsZV9kb19pZGxlCi0JLndvcmQJY3B1X3hzY2FsZV9kY2FjaGVfY2xlYW5fYXJlYQotCS53b3JkCWNwdV94c2NhbGVfc3dpdGNoX21tCi0JLndvcmQJY3B1X3hzY2FsZV9zZXRfcHRlX2V4dAotCS53b3JkCWNwdV94c2NhbGVfc3VzcGVuZF9zaXplCi0JLndvcmQJY3B1X3hzY2FsZV9kb19zdXNwZW5kCi0JLndvcmQJY3B1X3hzY2FsZV9kb19yZXN1bWUKLQkuc2l6ZQl4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIHhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zCisJQCBkZWZpbmUgc3RydWN0IHByb2Nlc3NvciAoc2VlIDxhc20vcHJvYy1mbnMuaD4gYW5kIHByb2MtbWFjcm9zLlMpCisJZGVmaW5lX3Byb2Nlc3Nvcl9mdW5jdGlvbnMgeHNjYWxlLCBkYWJvcnQ9djV0X2Vhcmx5X2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydCwgc3VzcGVuZD0xCiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKIAotCS50eXBlCWNwdV9hcmNoX25hbWUsICNvYmplY3QKLWNwdV9hcmNoX25hbWU6Ci0JLmFzY2l6CSJhcm12NXRlIgotCS5zaXplCWNwdV9hcmNoX25hbWUsIC4gLSBjcHVfYXJjaF9uYW1lCisJc3RyaW5nCWNwdV9hcmNoX25hbWUsICJhcm12NXRlIgorCXN0cmluZwljcHVfZWxmX25hbWUsICJ2NSIKIAotCS50eXBlCWNwdV9lbGZfbmFtZSwgI29iamVjdAotY3B1X2VsZl9uYW1lOgotCS5hc2NpegkidjUiCi0JLnNpemUJY3B1X2VsZl9uYW1lLCAuIC0gY3B1X2VsZl9uYW1lCi0KLQkudHlwZQljcHVfODAyMDBfQTBfQTFfbmFtZSwgI29iamVjdAotY3B1XzgwMjAwX0EwX0ExX25hbWU6Ci0JLmFzY2l6CSJYU2NhbGUtODAyMDAgQTAvQTEiCi0JLnNpemUJY3B1XzgwMjAwX0EwX0ExX25hbWUsIC4gLSBjcHVfODAyMDBfQTBfQTFfbmFtZQotCi0JLnR5cGUJY3B1XzgwMjAwX25hbWUsICNvYmplY3QKLWNwdV84MDIwMF9uYW1lOgotCS5hc2NpegkiWFNjYWxlLTgwMjAwIgotCS5zaXplCWNwdV84MDIwMF9uYW1lLCAuIC0gY3B1XzgwMjAwX25hbWUKLQotCS50eXBlCWNwdV84MDIxOV9uYW1lLCAjb2JqZWN0Ci1jcHVfODAyMTlfbmFtZToKLQkuYXNjaXoJIlhTY2FsZS04MDIxOSIKLQkuc2l6ZQljcHVfODAyMTlfbmFtZSwgLiAtIGNwdV84MDIxOV9uYW1lCi0KLQkudHlwZQljcHVfODAzMnhfbmFtZSwgI29iamVjdAotY3B1XzgwMzJ4X25hbWU6Ci0JLmFzY2l6CSJYU2NhbGUtSU9QODAzMnggRmFtaWx5IgotCS5zaXplCWNwdV84MDMyeF9uYW1lLCAuIC0gY3B1XzgwMzJ4X25hbWUKLQotCS50eXBlCWNwdV84MDMzeF9uYW1lLCAjb2JqZWN0Ci1jcHVfODAzM3hfbmFtZToKLQkuYXNjaXoJIlhTY2FsZS1JT1A4MDMzeCBGYW1pbHkiCi0JLnNpemUJY3B1XzgwMzN4X25hbWUsIC4gLSBjcHVfODAzM3hfbmFtZQotCi0JLnR5cGUJY3B1X3B4YTI1MF9uYW1lLCAjb2JqZWN0Ci1jcHVfcHhhMjUwX25hbWU6Ci0JLmFzY2l6CSJYU2NhbGUtUFhBMjUwIgotCS5zaXplCWNwdV9weGEyNTBfbmFtZSwgLiAtIGNwdV9weGEyNTBfbmFtZQotCi0JLnR5cGUJY3B1X3B4YTIxMF9uYW1lLCAjb2JqZWN0Ci1jcHVfcHhhMjEwX25hbWU6Ci0JLmFzY2l6CSJYU2NhbGUtUFhBMjEwIgotCS5zaXplCWNwdV9weGEyMTBfbmFtZSwgLiAtIGNwdV9weGEyMTBfbmFtZQotCi0JLnR5cGUJY3B1X2l4cDQyeF9uYW1lLCAjb2JqZWN0Ci1jcHVfaXhwNDJ4X25hbWU6Ci0JLmFzY2l6CSJYU2NhbGUtSVhQNDJ4IEZhbWlseSIKLQkuc2l6ZQljcHVfaXhwNDJ4X25hbWUsIC4gLSBjcHVfaXhwNDJ4X25hbWUKLQotCS50eXBlCWNwdV9peHA0M3hfbmFtZSwgI29iamVjdAotY3B1X2l4cDQzeF9uYW1lOgotCS5hc2NpegkiWFNjYWxlLUlYUDQzeCBGYW1pbHkiCi0JLnNpemUJY3B1X2l4cDQzeF9uYW1lLCAuIC0gY3B1X2l4cDQzeF9uYW1lCi0KLQkudHlwZQljcHVfaXhwNDZ4X25hbWUsICNvYmplY3QKLWNwdV9peHA0NnhfbmFtZToKLQkuYXNjaXoJIlhTY2FsZS1JWFA0NnggRmFtaWx5IgotCS5zaXplCWNwdV9peHA0NnhfbmFtZSwgLiAtIGNwdV9peHA0NnhfbmFtZQotCi0JLnR5cGUJY3B1X2l4cDI0MDBfbmFtZSwgI29iamVjdAotY3B1X2l4cDI0MDBfbmFtZToKLQkuYXNjaXoJIlhTY2FsZS1JWFAyNDAwIgotCS5zaXplCWNwdV9peHAyNDAwX25hbWUsIC4gLSBjcHVfaXhwMjQwMF9uYW1lCi0KLQkudHlwZQljcHVfaXhwMjgwMF9uYW1lLCAjb2JqZWN0Ci1jcHVfaXhwMjgwMF9uYW1lOgotCS5hc2NpegkiWFNjYWxlLUlYUDI4MDAiCi0JLnNpemUJY3B1X2l4cDI4MDBfbmFtZSwgLiAtIGNwdV9peHAyODAwX25hbWUKLQotCS50eXBlCWNwdV9weGEyNTVfbmFtZSwgI29iamVjdAotY3B1X3B4YTI1NV9uYW1lOgotCS5hc2NpegkiWFNjYWxlLVBYQTI1NSIKLQkuc2l6ZQljcHVfcHhhMjU1X25hbWUsIC4gLSBjcHVfcHhhMjU1X25hbWUKLQotCS50eXBlCWNwdV9weGEyNzBfbmFtZSwgI29iamVjdAotY3B1X3B4YTI3MF9uYW1lOgotCS5hc2NpegkiWFNjYWxlLVBYQTI3MCIKLQkuc2l6ZQljcHVfcHhhMjcwX25hbWUsIC4gLSBjcHVfcHhhMjcwX25hbWUKKwlzdHJpbmcJY3B1XzgwMjAwX0EwX0ExX25hbWUsICJYU2NhbGUtODAyMDAgQTAvQTEiCisJc3RyaW5nCWNwdV84MDIwMF9uYW1lLCAiWFNjYWxlLTgwMjAwIgorCXN0cmluZwljcHVfODAyMTlfbmFtZSwgIlhTY2FsZS04MDIxOSIKKwlzdHJpbmcJY3B1XzgwMzJ4X25hbWUsICJYU2NhbGUtSU9QODAzMnggRmFtaWx5IgorCXN0cmluZwljcHVfODAzM3hfbmFtZSwgIlhTY2FsZS1JT1A4MDMzeCBGYW1pbHkiCisJc3RyaW5nCWNwdV9weGEyNTBfbmFtZSwgIlhTY2FsZS1QWEEyNTAiCisJc3RyaW5nCWNwdV9weGEyMTBfbmFtZSwgIlhTY2FsZS1QWEEyMTAiCisJc3RyaW5nCWNwdV9peHA0MnhfbmFtZSwgIlhTY2FsZS1JWFA0MnggRmFtaWx5IgorCXN0cmluZwljcHVfaXhwNDN4X25hbWUsICJYU2NhbGUtSVhQNDN4IEZhbWlseSIKKwlzdHJpbmcJY3B1X2l4cDQ2eF9uYW1lLCAiWFNjYWxlLUlYUDQ2eCBGYW1pbHkiCisJc3RyaW5nCWNwdV9peHAyNDAwX25hbWUsICJYU2NhbGUtSVhQMjQwMCIKKwlzdHJpbmcJY3B1X2l4cDI4MDBfbmFtZSwgIlhTY2FsZS1JWFAyODAwIgorCXN0cmluZwljcHVfcHhhMjU1X25hbWUsICJYU2NhbGUtUFhBMjU1IgorCXN0cmluZwljcHVfcHhhMjcwX25hbWUsICJYU2NhbGUtUFhBMjcwIgogCiAJLmFsaWduCiAKIAkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCiAKLQkudHlwZQlfXzgwMjAwX0EwX0ExX3Byb2NfaW5mbywjb2JqZWN0Ci1fXzgwMjAwX0EwX0ExX3Byb2NfaW5mbzoKLQkubG9uZwkweDY5MDUyMDAwCi0JLmxvbmcJMHhmZmZmZmZmZQotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKKy5tYWNybyB4c2NhbGVfcHJvY19pbmZvIG5hbWU6cmVxLCBjcHVfdmFsOnJlcSwgY3B1X21hc2s6cmVxLCBjcHVfbmFtZTpyZXEsIGNhY2hlCisJLnR5cGUJX19cbmFtZVwoKV9wcm9jX2luZm8sI29iamVjdAorX19cbmFtZVwoKV9wcm9jX2luZm86CisJLmxvbmcJXGNwdV92YWwKKwkubG9uZwlcY3B1X21hc2sKKwkubG9uZwlQTURfVFlQRV9TRUNUIHwgXAogCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAogCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQlQTURfU0VDVF9BUF9SRUFECi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAorCS5sb25nCVBNRF9UWVBFX1NFQ1QgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQlQTURfU0VDVF9BUF9SRUFECiAJYglfX3hzY2FsZV9zZXR1cAogCS5sb25nCWNwdV9hcmNoX25hbWUKIAkubG9uZwljcHVfZWxmX25hbWUKIAkubG9uZwlIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUAotCS5sb25nCWNwdV84MDIwMF9uYW1lCisJLmxvbmcJXGNwdV9uYW1lCiAJLmxvbmcJeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAkubG9uZwl2NHdiaV90bGJfZm5zCiAJLmxvbmcJeHNjYWxlX21jX3VzZXJfZm5zCi0JLmxvbmcJeHNjYWxlXzgwMjAwX0EwX0ExX2NhY2hlX2ZucwotCS5zaXplCV9fODAyMDBfQTBfQTFfcHJvY19pbmZvLCAuIC0gX184MDIwMF9BMF9BMV9wcm9jX2luZm8KKwkuaWZiIFxjYWNoZQorCQkubG9uZwl4c2NhbGVfY2FjaGVfZm5zCisJLmVsc2UKKwkJLmxvbmcJXGNhY2hlCisJLmVuZGlmCisJLnNpemUJX19cbmFtZVwoKV9wcm9jX2luZm8sIC4gLSBfX1xuYW1lXCgpX3Byb2NfaW5mbworLmVuZG0KIAotCS50eXBlCV9fODAyMDBfcHJvY19pbmZvLCNvYmplY3QKLV9fODAyMDBfcHJvY19pbmZvOgotCS5sb25nCTB4NjkwNTIwMDAKLQkubG9uZwkweGZmZmZmZmYwCi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCWIJX194c2NhbGVfc2V0dXAKLQkubG9uZwljcHVfYXJjaF9uYW1lCi0JLmxvbmcJY3B1X2VsZl9uYW1lCi0JLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKLQkubG9uZwljcHVfODAyMDBfbmFtZQotCS5sb25nCXhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zCi0JLmxvbmcJdjR3YmlfdGxiX2ZucwotCS5sb25nCXhzY2FsZV9tY191c2VyX2ZucwotCS5sb25nCXhzY2FsZV9jYWNoZV9mbnMKLQkuc2l6ZQlfXzgwMjAwX3Byb2NfaW5mbywgLiAtIF9fODAyMDBfcHJvY19pbmZvCi0KLQkudHlwZQlfXzgwMjE5X3Byb2NfaW5mbywjb2JqZWN0Ci1fXzgwMjE5X3Byb2NfaW5mbzoKLQkubG9uZwkweDY5MDUyZTIwCi0JLmxvbmcJMHhmZmZmZmZlMAotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKLQkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQliCV9feHNjYWxlX3NldHVwCi0JLmxvbmcJY3B1X2FyY2hfbmFtZQotCS5sb25nCWNwdV9lbGZfbmFtZQotCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCi0JLmxvbmcJY3B1XzgwMjE5X25hbWUKLQkubG9uZwl4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucwotCS5sb25nCXY0d2JpX3RsYl9mbnMKLQkubG9uZwl4c2NhbGVfbWNfdXNlcl9mbnMKLQkubG9uZwl4c2NhbGVfY2FjaGVfZm5zCi0JLnNpemUJX184MDIxOV9wcm9jX2luZm8sIC4gLSBfXzgwMjE5X3Byb2NfaW5mbwotCi0JLnR5cGUJX184MDMyeF9wcm9jX2luZm8sI29iamVjdAotX184MDMyeF9wcm9jX2luZm86Ci0JLmxvbmcJMHg2OTA1MjQyMAotCS5sb25nCTB4ZmZmZmY3ZTAKLQkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCi0JCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCi0JCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JYglfX3hzY2FsZV9zZXR1cAotCS5sb25nCWNwdV9hcmNoX25hbWUKLQkubG9uZwljcHVfZWxmX25hbWUKLQkubG9uZwlIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUAotCS5sb25nCWNwdV84MDMyeF9uYW1lCi0JLmxvbmcJeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKLQkubG9uZwl2NHdiaV90bGJfZm5zCi0JLmxvbmcJeHNjYWxlX21jX3VzZXJfZm5zCi0JLmxvbmcJeHNjYWxlX2NhY2hlX2ZucwotCS5zaXplCV9fODAzMnhfcHJvY19pbmZvLCAuIC0gX184MDMyeF9wcm9jX2luZm8KLQotCS50eXBlCV9fODAzM3hfcHJvY19pbmZvLCNvYmplY3QKLV9fODAzM3hfcHJvY19pbmZvOgotCS5sb25nCTB4NjkwNTQwMTAKLQkubG9uZwkweGZmZmZmZDMwCi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCWIJX194c2NhbGVfc2V0dXAKLQkubG9uZwljcHVfYXJjaF9uYW1lCi0JLmxvbmcJY3B1X2VsZl9uYW1lCi0JLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKLQkubG9uZwljcHVfODAzM3hfbmFtZQotCS5sb25nCXhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zCi0JLmxvbmcJdjR3YmlfdGxiX2ZucwotCS5sb25nCXhzY2FsZV9tY191c2VyX2ZucwotCS5sb25nCXhzY2FsZV9jYWNoZV9mbnMKLQkuc2l6ZQlfXzgwMzN4X3Byb2NfaW5mbywgLiAtIF9fODAzM3hfcHJvY19pbmZvCi0KLQkudHlwZQlfX3B4YTI1MF9wcm9jX2luZm8sI29iamVjdAotX19weGEyNTBfcHJvY19pbmZvOgotCS5sb25nCTB4NjkwNTIxMDAKLQkubG9uZwkweGZmZmZmN2YwCi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCWIJX194c2NhbGVfc2V0dXAKLQkubG9uZwljcHVfYXJjaF9uYW1lCi0JLmxvbmcJY3B1X2VsZl9uYW1lCi0JLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKLQkubG9uZwljcHVfcHhhMjUwX25hbWUKLQkubG9uZwl4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucwotCS5sb25nCXY0d2JpX3RsYl9mbnMKLQkubG9uZwl4c2NhbGVfbWNfdXNlcl9mbnMKLQkubG9uZwl4c2NhbGVfY2FjaGVfZm5zCi0JLnNpemUJX19weGEyNTBfcHJvY19pbmZvLCAuIC0gX19weGEyNTBfcHJvY19pbmZvCi0KLQkudHlwZQlfX3B4YTIxMF9wcm9jX2luZm8sI29iamVjdAotX19weGEyMTBfcHJvY19pbmZvOgotCS5sb25nCTB4NjkwNTIxMjAKLQkubG9uZwkweGZmZmZmM2YwCi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCWIJX194c2NhbGVfc2V0dXAKLQkubG9uZwljcHVfYXJjaF9uYW1lCi0JLmxvbmcJY3B1X2VsZl9uYW1lCi0JLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKLQkubG9uZwljcHVfcHhhMjEwX25hbWUKLQkubG9uZwl4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucwotCS5sb25nCXY0d2JpX3RsYl9mbnMKLQkubG9uZwl4c2NhbGVfbWNfdXNlcl9mbnMKLQkubG9uZwl4c2NhbGVfY2FjaGVfZm5zCi0JLnNpemUJX19weGEyMTBfcHJvY19pbmZvLCAuIC0gX19weGEyMTBfcHJvY19pbmZvCi0KLQkudHlwZQlfX2l4cDI0MDBfcHJvY19pbmZvLCAjb2JqZWN0Ci1fX2l4cDI0MDBfcHJvY19pbmZvOgotCS5sb25nICAgMHg2OTA1NDE5MAotCS5sb25nICAgMHhmZmZmZmZmMAotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKLQkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQliICAgICAgIF9feHNjYWxlX3NldHVwCi0JLmxvbmcgICBjcHVfYXJjaF9uYW1lCi0JLmxvbmcgICBjcHVfZWxmX25hbWUKLQkubG9uZyAgIEhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCi0JLmxvbmcgICBjcHVfaXhwMjQwMF9uYW1lCi0JLmxvbmcgICB4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucwotCS5sb25nCXY0d2JpX3RsYl9mbnMKLQkubG9uZwl4c2NhbGVfbWNfdXNlcl9mbnMKLQkubG9uZwl4c2NhbGVfY2FjaGVfZm5zCi0JLnNpemUgICBfX2l4cDI0MDBfcHJvY19pbmZvLCAuIC0gX19peHAyNDAwX3Byb2NfaW5mbyAgICAgICAgICAgICAgICAKLQotCS50eXBlCV9faXhwMjgwMF9wcm9jX2luZm8sICNvYmplY3QKLV9faXhwMjgwMF9wcm9jX2luZm86Ci0JLmxvbmcgICAweDY5MDU0MWEwCi0JLmxvbmcgICAweGZmZmZmZmYwCi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCWIgICAgICAgX194c2NhbGVfc2V0dXAKLQkubG9uZyAgIGNwdV9hcmNoX25hbWUKLQkubG9uZyAgIGNwdV9lbGZfbmFtZQotCS5sb25nICAgSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKLQkubG9uZyAgIGNwdV9peHAyODAwX25hbWUKLQkubG9uZyAgIHhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zCi0JLmxvbmcJdjR3YmlfdGxiX2ZucwotCS5sb25nCXhzY2FsZV9tY191c2VyX2ZucwotCS5sb25nCXhzY2FsZV9jYWNoZV9mbnMKLQkuc2l6ZSAgIF9faXhwMjgwMF9wcm9jX2luZm8sIC4gLSBfX2l4cDI4MDBfcHJvY19pbmZvICAgICAgICAgICAgICAgIAotCi0JLnR5cGUJX19peHA0MnhfcHJvY19pbmZvLCAjb2JqZWN0Ci1fX2l4cDQyeF9wcm9jX2luZm86Ci0JLmxvbmcgICAweDY5MDU0MWMwCi0JLmxvbmcgICAweGZmZmZmZmMwCi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQlQTURfU0VDVF9DQUNIRUFCTEUgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCWIgICAgICAgX194c2NhbGVfc2V0dXAKLQkubG9uZyAgIGNwdV9hcmNoX25hbWUKLQkubG9uZyAgIGNwdV9lbGZfbmFtZQotCS5sb25nICAgSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKLQkubG9uZyAgIGNwdV9peHA0MnhfbmFtZQotCS5sb25nICAgeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKLQkubG9uZwl2NHdiaV90bGJfZm5zCi0JLmxvbmcJeHNjYWxlX21jX3VzZXJfZm5zCi0JLmxvbmcJeHNjYWxlX2NhY2hlX2ZucwotCS5zaXplICAgX19peHA0MnhfcHJvY19pbmZvLCAuIC0gX19peHA0MnhfcHJvY19pbmZvICAgICAgICAgICAgICAgIAotCi0JLnR5cGUgICBfX2l4cDQzeF9wcm9jX2luZm8sICNvYmplY3QKLV9faXhwNDN4X3Byb2NfaW5mbzoKLQkubG9uZyAgIDB4NjkwNTQwNDAKLQkubG9uZyAgIDB4ZmZmZmZmZjAKLQkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCi0JCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCi0JCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCi0JCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAotCQlQTURfU0VDVF9BUF9SRUFECi0JYiAgICAgICBfX3hzY2FsZV9zZXR1cAotCS5sb25nICAgY3B1X2FyY2hfbmFtZQotCS5sb25nICAgY3B1X2VsZl9uYW1lCi0JLmxvbmcgICBIV0NBUF9TV1B8SFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFR8SFdDQVBfRURTUAotCS5sb25nICAgY3B1X2l4cDQzeF9uYW1lCi0JLmxvbmcgICB4c2NhbGVfcHJvY2Vzc29yX2Z1bmN0aW9ucwotCS5sb25nICAgdjR3YmlfdGxiX2ZucwotCS5sb25nICAgeHNjYWxlX21jX3VzZXJfZm5zCi0JLmxvbmcgICB4c2NhbGVfY2FjaGVfZm5zCi0JLnNpemUgICBfX2l4cDQzeF9wcm9jX2luZm8sIC4gLSBfX2l4cDQzeF9wcm9jX2luZm8KLQotCS50eXBlCV9faXhwNDZ4X3Byb2NfaW5mbywgI29iamVjdAotX19peHA0NnhfcHJvY19pbmZvOgotCS5sb25nICAgMHg2OTA1NDIwMAotCS5sb25nICAgMHhmZmZmZmYwMAotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKLQkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQliICAgICAgIF9feHNjYWxlX3NldHVwCi0JLmxvbmcgICBjcHVfYXJjaF9uYW1lCi0JLmxvbmcgICBjcHVfZWxmX25hbWUKLQkubG9uZyAgIEhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCi0JLmxvbmcgICBjcHVfaXhwNDZ4X25hbWUKLQkubG9uZyAgIHhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zCi0JLmxvbmcJdjR3YmlfdGxiX2ZucwotCS5sb25nCXhzY2FsZV9tY191c2VyX2ZucwotCS5sb25nCXhzY2FsZV9jYWNoZV9mbnMKLQkuc2l6ZSAgIF9faXhwNDZ4X3Byb2NfaW5mbywgLiAtIF9faXhwNDZ4X3Byb2NfaW5mbwotCi0JLnR5cGUJX19weGEyNTVfcHJvY19pbmZvLCNvYmplY3QKLV9fcHhhMjU1X3Byb2NfaW5mbzoKLQkubG9uZwkweDY5MDUyZDAwCi0JLmxvbmcJMHhmZmZmZmZmMAotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKLQkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQliCV9feHNjYWxlX3NldHVwCi0JLmxvbmcJY3B1X2FyY2hfbmFtZQotCS5sb25nCWNwdV9lbGZfbmFtZQotCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCi0JLmxvbmcJY3B1X3B4YTI1NV9uYW1lCi0JLmxvbmcJeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKLQkubG9uZwl2NHdiaV90bGJfZm5zCi0JLmxvbmcJeHNjYWxlX21jX3VzZXJfZm5zCi0JLmxvbmcJeHNjYWxlX2NhY2hlX2ZucwotCS5zaXplCV9fcHhhMjU1X3Byb2NfaW5mbywgLiAtIF9fcHhhMjU1X3Byb2NfaW5mbwotCi0JLnR5cGUJX19weGEyNzBfcHJvY19pbmZvLCNvYmplY3QKLV9fcHhhMjcwX3Byb2NfaW5mbzoKLQkubG9uZwkweDY5MDU0MTEwCi0JLmxvbmcJMHhmZmZmZmZmMAotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKLQkJUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgXAotCQlQTURfU0VDVF9BUF9XUklURSB8IFwKLQkJUE1EX1NFQ1RfQVBfUkVBRAotCS5sb25nICAgUE1EX1RZUEVfU0VDVCB8IFwKLQkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCi0JCVBNRF9TRUNUX0FQX1JFQUQKLQliCV9feHNjYWxlX3NldHVwCi0JLmxvbmcJY3B1X2FyY2hfbmFtZQotCS5sb25nCWNwdV9lbGZfbmFtZQotCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCi0JLmxvbmcJY3B1X3B4YTI3MF9uYW1lCi0JLmxvbmcJeHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKLQkubG9uZwl2NHdiaV90bGJfZm5zCi0JLmxvbmcJeHNjYWxlX21jX3VzZXJfZm5zCi0JLmxvbmcJeHNjYWxlX2NhY2hlX2ZucwotCS5zaXplCV9fcHhhMjcwX3Byb2NfaW5mbywgLiAtIF9fcHhhMjcwX3Byb2NfaW5mbwotCisJeHNjYWxlX3Byb2NfaW5mbyA4MDIwMF9BMF9BMSwgMHg2OTA1MjAwMCwgMHhmZmZmZmZmZSwgY3B1XzgwMjAwX25hbWUsIFwKKwkJY2FjaGU9eHNjYWxlXzgwMjAwX0EwX0ExX2NhY2hlX2ZucworCXhzY2FsZV9wcm9jX2luZm8gODAyMDAsIDB4NjkwNTIwMDAsIDB4ZmZmZmZmZjAsIGNwdV84MDIwMF9uYW1lCisJeHNjYWxlX3Byb2NfaW5mbyA4MDIxOSwgMHg2OTA1MmUyMCwgMHhmZmZmZmZlMCwgY3B1XzgwMjE5X25hbWUKKwl4c2NhbGVfcHJvY19pbmZvIDgwMzJ4LCAweDY5MDUyNDIwLCAweGZmZmZmN2UwLCBjcHVfODAzMnhfbmFtZQorCXhzY2FsZV9wcm9jX2luZm8gODAzM3gsIDB4NjkwNTQwMTAsIDB4ZmZmZmZkMzAsIGNwdV84MDMzeF9uYW1lCisJeHNjYWxlX3Byb2NfaW5mbyBweGEyNTAsIDB4NjkwNTIxMDAsIDB4ZmZmZmY3ZjAsIGNwdV9weGEyNTBfbmFtZQorCXhzY2FsZV9wcm9jX2luZm8gcHhhMjEwLCAweDY5MDUyMTIwLCAweGZmZmZmM2YwLCBjcHVfcHhhMjEwX25hbWUKKwl4c2NhbGVfcHJvY19pbmZvIGl4cDI0MDAsIDB4NjkwNTQxOTAsIDB4ZmZmZmZmZjAsIGNwdV9peHAyNDAwX25hbWUKKwl4c2NhbGVfcHJvY19pbmZvIGl4cDI4MDAsIDB4NjkwNTQxYTAsIDB4ZmZmZmZmZjAsIGNwdV9peHAyODAwX25hbWUKKwl4c2NhbGVfcHJvY19pbmZvIGl4cDQyeCwgMHg2OTA1NDFjMCwgMHhmZmZmZmZjMCwgY3B1X2l4cDQyeF9uYW1lCisJeHNjYWxlX3Byb2NfaW5mbyBpeHA0M3gsIDB4NjkwNTQwNDAsIDB4ZmZmZmZmZjAsIGNwdV9peHA0M3hfbmFtZQorCXhzY2FsZV9wcm9jX2luZm8gaXhwNDZ4LCAweDY5MDU0MjAwLCAweGZmZmZmZjAwLCBjcHVfaXhwNDZ4X25hbWUKKwl4c2NhbGVfcHJvY19pbmZvIHB4YTI1NSwgMHg2OTA1MmQwMCwgMHhmZmZmZmZmMCwgY3B1X3B4YTI1NV9uYW1lCisJeHNjYWxlX3Byb2NfaW5mbyBweGEyNzAsIDB4NjkwNTQxMTAsIDB4ZmZmZmZmZjAsIGNwdV9weGEyNzBfbmFtZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vdGxiLWZhLlMgYi9hcmNoL2FybS9tbS90bGItZmEuUwppbmRleCA5Njk0ZjFmLi5kM2RkY2Y5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS90bGItZmEuUworKysgYi9hcmNoL2FybS9tbS90bGItZmEuUwpAQCAtNDYsNyArNDYsNiBAQAogCWFkZAlyMCwgcjAsICNQQUdFX1NaCiAJY21wCXIwLCByMQogCWJsbwkxYgotCW1jcglwMTUsIDAsIHIzLCBjNywgYzUsIDYJCUAgaW52YWxpZGF0ZSBCVEIKIAltY3IJcDE1LCAwLCByMywgYzcsIGMxMCwgNAkJQCBkYXRhIHdyaXRlIGJhcnJpZXIKIAltb3YJcGMsIGxyCiAKQEAgLTYwLDE2ICs1OSwxMSBAQAogCWFkZAlyMCwgcjAsICNQQUdFX1NaCiAJY21wCXIwLCByMQogCWJsbwkxYgotCW1jcglwMTUsIDAsIHIzLCBjNywgYzUsIDYJCUAgaW52YWxpZGF0ZSBCVEIKIAltY3IJcDE1LCAwLCByMywgYzcsIGMxMCwgNAkJQCBkYXRhIHdyaXRlIGJhcnJpZXIKLQltY3IJcDE1LCAwLCByMywgYzcsIGM1LCA0CQlAIHByZWZldGNoIGZsdXNoCisJbWNyCXAxNSwgMCwgcjMsIGM3LCBjNSwgNAkJQCBwcmVmZXRjaCBmbHVzaCAoaXNiKQogCW1vdglwYywgbHIKIAogCV9fSU5JVERBVEEKIAotCS50eXBlCWZhX3RsYl9mbnMsICNvYmplY3QKLUVOVFJZKGZhX3RsYl9mbnMpCi0JLmxvbmcJZmFfZmx1c2hfdXNlcl90bGJfcmFuZ2UKLQkubG9uZwlmYV9mbHVzaF9rZXJuX3RsYl9yYW5nZQotCS5sb25nCWZhX3RsYl9mbGFncwotCS5zaXplCWZhX3RsYl9mbnMsIC4gLSBmYV90bGJfZm5zCisJLyogZGVmaW5lIHN0cnVjdCBjcHVfdGxiX2ZucyAoc2VlIDxhc20vdGxiZmx1c2guaD4gYW5kIHByb2MtbWFjcm9zLlMpICovCisJZGVmaW5lX3RsYl9mdW5jdGlvbnMgZmEsIGZhX3RsYl9mbGFncwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vdGxiLXYzLlMgYi9hcmNoL2FybS9tbS90bGItdjMuUwppbmRleCBjMTA3ODZlLi5kMjUzOTk1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS90bGItdjMuUworKysgYi9hcmNoL2FybS9tbS90bGItdjMuUwpAQCAtNDQsOSArNDQsNSBAQAogCiAJX19JTklUREFUQQogCi0JLnR5cGUJdjNfdGxiX2ZucywgI29iamVjdAotRU5UUlkodjNfdGxiX2ZucykKLQkubG9uZwl2M19mbHVzaF91c2VyX3RsYl9yYW5nZQotCS5sb25nCXYzX2ZsdXNoX2tlcm5fdGxiX3JhbmdlCi0JLmxvbmcJdjNfdGxiX2ZsYWdzCi0JLnNpemUJdjNfdGxiX2ZucywgLiAtIHYzX3RsYl9mbnMKKwkvKiBkZWZpbmUgc3RydWN0IGNwdV90bGJfZm5zIChzZWUgPGFzbS90bGJmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykgKi8KKwlkZWZpbmVfdGxiX2Z1bmN0aW9ucyB2MywgdjNfdGxiX2ZsYWdzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS90bGItdjQuUyBiL2FyY2gvYXJtL21tL3RsYi12NC5TCmluZGV4IGQ2Yzk0NDUuLjE3YTAyNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3RsYi12NC5TCisrKyBiL2FyY2gvYXJtL21tL3RsYi12NC5TCkBAIC01Nyw5ICs1Nyw1IEBACiAKIAlfX0lOSVREQVRBCiAKLQkudHlwZQl2NF90bGJfZm5zLCAjb2JqZWN0Ci1FTlRSWSh2NF90bGJfZm5zKQotCS5sb25nCXY0X2ZsdXNoX3VzZXJfdGxiX3JhbmdlCi0JLmxvbmcJdjRfZmx1c2hfa2Vybl90bGJfcmFuZ2UKLQkubG9uZwl2NF90bGJfZmxhZ3MKLQkuc2l6ZQl2NF90bGJfZm5zLCAuIC0gdjRfdGxiX2ZucworCS8qIGRlZmluZSBzdHJ1Y3QgY3B1X3RsYl9mbnMgKHNlZSA8YXNtL3RsYmZsdXNoLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKSAqLworCWRlZmluZV90bGJfZnVuY3Rpb25zIHY0LCB2NF90bGJfZmxhZ3MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3RsYi12NHdiLlMgYi9hcmNoL2FybS9tbS90bGItdjR3Yi5TCmluZGV4IGNiODI5Y2EuLmMwNDU5OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3RsYi12NHdiLlMKKysrIGIvYXJjaC9hcm0vbW0vdGxiLXY0d2IuUwpAQCAtNjksOSArNjksNSBAQAogCiAJX19JTklUREFUQQogCi0JLnR5cGUJdjR3Yl90bGJfZm5zLCAjb2JqZWN0Ci1FTlRSWSh2NHdiX3RsYl9mbnMpCi0JLmxvbmcJdjR3Yl9mbHVzaF91c2VyX3RsYl9yYW5nZQotCS5sb25nCXY0d2JfZmx1c2hfa2Vybl90bGJfcmFuZ2UKLQkubG9uZwl2NHdiX3RsYl9mbGFncwotCS5zaXplCXY0d2JfdGxiX2ZucywgLiAtIHY0d2JfdGxiX2ZucworCS8qIGRlZmluZSBzdHJ1Y3QgY3B1X3RsYl9mbnMgKHNlZSA8YXNtL3RsYmZsdXNoLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKSAqLworCWRlZmluZV90bGJfZnVuY3Rpb25zIHY0d2IsIHY0d2JfdGxiX2ZsYWdzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS90bGItdjR3YmkuUyBiL2FyY2gvYXJtL21tL3RsYi12NHdiaS5TCmluZGV4IDYwY2ZjNGEuLjFmNjA2MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3RsYi12NHdiaS5TCisrKyBiL2FyY2gvYXJtL21tL3RsYi12NHdiaS5TCkBAIC02MCw5ICs2MCw1IEBACiAKIAlfX0lOSVREQVRBCiAKLQkudHlwZQl2NHdiaV90bGJfZm5zLCAjb2JqZWN0Ci1FTlRSWSh2NHdiaV90bGJfZm5zKQotCS5sb25nCXY0d2JpX2ZsdXNoX3VzZXJfdGxiX3JhbmdlCi0JLmxvbmcJdjR3YmlfZmx1c2hfa2Vybl90bGJfcmFuZ2UKLQkubG9uZwl2NHdiaV90bGJfZmxhZ3MKLQkuc2l6ZQl2NHdiaV90bGJfZm5zLCAuIC0gdjR3YmlfdGxiX2ZucworCS8qIGRlZmluZSBzdHJ1Y3QgY3B1X3RsYl9mbnMgKHNlZSA8YXNtL3RsYmZsdXNoLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKSAqLworCWRlZmluZV90bGJfZnVuY3Rpb25zIHY0d2JpLCB2NHdiaV90bGJfZmxhZ3MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3RsYi12Ni5TIGIvYXJjaC9hcm0vbW0vdGxiLXY2LlMKaW5kZXggNzNkN2Q4OS4uZWNhMDdmNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vdGxiLXY2LlMKKysrIGIvYXJjaC9hcm0vbW0vdGxiLXY2LlMKQEAgLTU0LDcgKzU0LDYgQEAKIAlhZGQJcjAsIHIwLCAjUEFHRV9TWgogCWNtcAlyMCwgcjEKIAlibG8JMWIKLQltY3IJcDE1LCAwLCBpcCwgYzcsIGM1LCA2CQlAIGZsdXNoIEJUQUMvQlRCCiAJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJCUAgZGF0YSBzeW5jaHJvbml6YXRpb24gYmFycmllcgogCW1vdglwYywgbHIKIApAQCAtODMsMTYgKzgyLDExIEBACiAJYWRkCXIwLCByMCwgI1BBR0VfU1oKIAljbXAJcjAsIHIxCiAJYmxvCTFiCi0JbWNyCXAxNSwgMCwgcjIsIGM3LCBjNSwgNgkJQCBmbHVzaCBCVEFDL0JUQgogCW1jcglwMTUsIDAsIHIyLCBjNywgYzEwLCA0CQlAIGRhdGEgc3luY2hyb25pemF0aW9uIGJhcnJpZXIKLQltY3IJcDE1LCAwLCByMiwgYzcsIGM1LCA0CQlAIHByZWZldGNoIGZsdXNoCisJbWNyCXAxNSwgMCwgcjIsIGM3LCBjNSwgNAkJQCBwcmVmZXRjaCBmbHVzaCAoaXNiKQogCW1vdglwYywgbHIKIAogCV9fSU5JVAogCi0JLnR5cGUJdjZ3YmlfdGxiX2ZucywgI29iamVjdAotRU5UUlkodjZ3YmlfdGxiX2ZucykKLQkubG9uZwl2NndiaV9mbHVzaF91c2VyX3RsYl9yYW5nZQotCS5sb25nCXY2d2JpX2ZsdXNoX2tlcm5fdGxiX3JhbmdlCi0JLmxvbmcJdjZ3YmlfdGxiX2ZsYWdzCi0JLnNpemUJdjZ3YmlfdGxiX2ZucywgLiAtIHY2d2JpX3RsYl9mbnMKKwkvKiBkZWZpbmUgc3RydWN0IGNwdV90bGJfZm5zIChzZWUgPGFzbS90bGJmbHVzaC5oPiBhbmQgcHJvYy1tYWNyb3MuUykgKi8KKwlkZWZpbmVfdGxiX2Z1bmN0aW9ucyB2NndiaSwgdjZ3YmlfdGxiX2ZsYWdzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS90bGItdjcuUyBiL2FyY2gvYXJtL21tL3RsYi12Ny5TCmluZGV4IDUzY2Q1YjQuLjg0NWY0NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3RsYi12Ny5TCisrKyBiL2FyY2gvYXJtL21tL3RsYi12Ny5TCkBAIC00OCw5ICs0OCw2IEBACiAJYWRkCXIwLCByMCwgI1BBR0VfU1oKIAljbXAJcjAsIHIxCiAJYmxvCTFiCi0JbW92CWlwLCAjMAotCUFMVF9TTVAobWNyCXAxNSwgMCwgaXAsIGM3LCBjMSwgNikJQCBmbHVzaCBCVEFDL0JUQiBJbm5lciBTaGFyZWFibGUKLQlBTFRfVVAobWNyCXAxNSwgMCwgaXAsIGM3LCBjNSwgNikJQCBmbHVzaCBCVEFDL0JUQgogCWRzYgogCW1vdglwYywgbHIKIEVORFBST0Modjd3YmlfZmx1c2hfdXNlcl90bGJfcmFuZ2UpCkBAIC03NSw5ICs3Miw2IEBACiAJYWRkCXIwLCByMCwgI1BBR0VfU1oKIAljbXAJcjAsIHIxCiAJYmxvCTFiCi0JbW92CXIyLCAjMAotCUFMVF9TTVAobWNyCXAxNSwgMCwgcjIsIGM3LCBjMSwgNikJQCBmbHVzaCBCVEFDL0JUQiBJbm5lciBTaGFyZWFibGUKLQlBTFRfVVAobWNyCXAxNSwgMCwgcjIsIGM3LCBjNSwgNikJQCBmbHVzaCBCVEFDL0JUQgogCWRzYgogCWlzYgogCW1vdglwYywgbHIKQEAgLTg1LDEwICs3OSw1IEBACiAKIAlfX0lOSVQKIAotCS50eXBlCXY3d2JpX3RsYl9mbnMsICNvYmplY3QKLUVOVFJZKHY3d2JpX3RsYl9mbnMpCi0JLmxvbmcJdjd3YmlfZmx1c2hfdXNlcl90bGJfcmFuZ2UKLQkubG9uZwl2N3diaV9mbHVzaF9rZXJuX3RsYl9yYW5nZQotCUFMVF9TTVAoLmxvbmcJdjd3YmlfdGxiX2ZsYWdzX3NtcCkKLQlBTFRfVVAoLmxvbmcJdjd3YmlfdGxiX2ZsYWdzX3VwKQotCS5zaXplCXY3d2JpX3RsYl9mbnMsIC4gLSB2N3diaV90bGJfZm5zCisJLyogZGVmaW5lIHN0cnVjdCBjcHVfdGxiX2ZucyAoc2VlIDxhc20vdGxiZmx1c2guaD4gYW5kIHByb2MtbWFjcm9zLlMpICovCisJZGVmaW5lX3RsYl9mdW5jdGlvbnMgdjd3YmksIHY3d2JpX3RsYl9mbGFnc191cCwgZmxhZ3Nfc21wPXY3d2JpX3RsYl9mbGFnc19zbXAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtaW9wL2NwNi5jIGIvYXJjaC9hcm0vcGxhdC1pb3AvY3A2LmMKaW5kZXggOTYxMmE4Ny4uYmFiNzNlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1pb3AvY3A2LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1pb3AvY3A2LmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIHN0YXRpYyBpbnQgY3A2X3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnN0cikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL01ha2VmaWxlIGIvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUKaW5kZXggYTEzODc4Ny4uZDUzYzM1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUKQEAgLTMsNyArMyw3IEBACiAjCiAKICMgQ29tbW9uIHN1cHBvcnQKLW9iai15IDo9IGNsb2NrLm8gZ3Bpby5vIHRpbWUubyBkZXZpY2VzLm8gY3B1Lm8gc3lzdGVtLm8gaXJxLWNvbW1vbi5vCitvYmoteSA6PSBjbG9jay5vIHRpbWUubyBkZXZpY2VzLm8gY3B1Lm8gc3lzdGVtLm8gaXJxLWNvbW1vbi5vCiAKICMgTVg1MSB1c2VzIHRoZSBUWklDIGludGVycnVwdCBjb250cm9sbGVyLCBvbGRlciBwbGF0Zm9ybXMgdXNlIEFWSUMKIG9iai0kKENPTkZJR19NWENfVFpJQykgKz0gdHppYy5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9hdmljLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9hdmljLmMKaW5kZXggMDllMmJkMC4uNTVkMjUzNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvYXZpYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2F2aWMuYwpAQCAtNDYsNiArNDYsOCBAQAogI2RlZmluZSBBVklDX0ZJUE5ESAkJMHg2MAkvKiBmYXN0IGludCBwZW5kaW5nIGhpZ2ggKi8KICNkZWZpbmUgQVZJQ19GSVBOREwJCTB4NjQJLyogZmFzdCBpbnQgcGVuZGluZyBsb3cgKi8KIAorI2RlZmluZSBBVklDX05VTV9JUlFTIDY0CisKIHZvaWQgX19pb21lbSAqYXZpY19iYXNlOwogCiAjaWZkZWYgQ09ORklHX01YQ19JUlFfUFJJT1IKQEAgLTU0LDcgKzU2LDcgQEAKIAl1bnNpZ25lZCBpbnQgdGVtcDsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDB4MEYgPDwgaXJxICUgOCAqIDQ7CiAKLQlpZiAoaXJxID49IE1YQ19JTlRFUk5BTF9JUlFTKQorCWlmIChpcnEgPj0gQVZJQ19OVU1fSVJRUykKIAkJcmV0dXJuIC1FSU5WQUw7OwogCiAJdGVtcCA9IF9fcmF3X3JlYWRsKGF2aWNfYmFzZSArIEFWSUNfTklQUklPUklUWShpcnEgLyA4KSk7CkBAIC03MiwxNCArNzQsMTQgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaXJxdDsKIAotCWlmIChpcnEgPj0gTVhDX0lOVEVSTkFMX0lSUVMpCisJaWYgKGlycSA+PSBBVklDX05VTV9JUlFTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChpcnEgPCBNWENfSU5URVJOQUxfSVJRUyAvIDIpIHsKKwlpZiAoaXJxIDwgQVZJQ19OVU1fSVJRUyAvIDIpIHsKIAkJaXJxdCA9IF9fcmF3X3JlYWRsKGF2aWNfYmFzZSArIEFWSUNfSU5UVFlQRUwpICYgfigxIDw8IGlycSk7CiAJCV9fcmF3X3dyaXRlbChpcnF0IHwgKCEhdHlwZSA8PCBpcnEpLCBhdmljX2Jhc2UgKyBBVklDX0lOVFRZUEVMKTsKIAl9IGVsc2UgewotCQlpcnEgLT0gTVhDX0lOVEVSTkFMX0lSUVMgLyAyOworCQlpcnEgLT0gQVZJQ19OVU1fSVJRUyAvIDI7CiAJCWlycXQgPSBfX3Jhd19yZWFkbChhdmljX2Jhc2UgKyBBVklDX0lOVFRZUEVIKSAmIH4oMSA8PCBpcnEpOwogCQlfX3Jhd193cml0ZWwoaXJxdCB8ICghIXR5cGUgPDwgaXJxKSwgYXZpY19iYXNlICsgQVZJQ19JTlRUWVBFSCk7CiAJfQpAQCAtMTM4LDcgKzE0MCw3IEBACiAJLyogYWxsIElSUSBubyBGSVEgKi8KIAlfX3Jhd193cml0ZWwoMCwgYXZpY19iYXNlICsgQVZJQ19JTlRUWVBFSCk7CiAJX19yYXdfd3JpdGVsKDAsIGF2aWNfYmFzZSArIEFWSUNfSU5UVFlQRUwpOwotCWZvciAoaSA9IDA7IGkgPCBNWENfSU5URVJOQUxfSVJRUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFWSUNfTlVNX0lSUVM7IGkrKykgewogCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgJm14Y19hdmljX2NoaXAuYmFzZSwKIAkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy5jCmluZGV4IGVlZTFiNjAuLmZiMTY2YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzLmMKQEAgLTg5LDMgKzg5LDE0IEBACiAKIAlyZXR1cm4gcGRldjsKIH0KKworc3RydWN0IGRldmljZSBteGNfYWlwc19idXMgPSB7CisJLmluaXRfbmFtZQk9ICJteGNfYWlwcyIsCisJLnBhcmVudAkJPSAmcGxhdGZvcm1fYnVzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXhjX2RldmljZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGRldmljZV9yZWdpc3RlcigmbXhjX2FpcHNfYnVzKTsKK30KK2NvcmVfaW5pdGNhbGwobXhjX2RldmljZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL01ha2VmaWxlCmluZGV4IGFkMjkyMmEuLmI0MWJmOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9NYWtlZmlsZQpAQCAtMiw2ICsyLDcgQEAKIG9iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9GTEVYQ0FOKSArPSBwbGF0Zm9ybS1mbGV4Y2FuLm8KIG9iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9GU0xfVVNCMl9VREMpICs9IHBsYXRmb3JtLWZzbC11c2IyLXVkYy5vCiBvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fR1BJT19LRVlTKSArPSBwbGF0Zm9ybS1ncGlvX2tleXMubworb2JqLXkgKz0gcGxhdGZvcm0tZ3Bpby1teGMubwogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX0lNWDIxX0hDRCkgKz0gcGxhdGZvcm0taW14MjEtaGNkLm8KIG9iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9JTVgyX1dEVCkgKz0gcGxhdGZvcm0taW14Mi13ZHQubwogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX0lNWERJX1JUQykgKz0gcGxhdGZvcm0taW14ZGlfcnRjLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZmVjLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWZlYy5jCmluZGV4IGNjYzc4OWUuLjRmYzZmZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZmVjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1mZWMuYwpAQCAtNiw2ICs2LDcgQEAKICAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZnNsLXVzYjItdWRjLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWZzbC11c2IyLXVkYy5jCmluZGV4IDU5YzMzZjYuLjIzY2UwOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZnNsLXVzYjItdWRjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1mc2wtdXNiMi11ZGMuYwpAQCAtNiw2ICs2LDcgQEAKICAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1ncGlvLW14Yy5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1ncGlvLW14Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OTE5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWdwaW8tbXhjLmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTGltaXRlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBteGNfcmVnaXN0ZXJfZ3BpbyhjaGFyICpuYW1lLCBpbnQgaWQsCisJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgcmVzb3VyY2Vfc2l6ZV90IGlvc2l6ZSwgaW50IGlycSwgaW50IGlycV9oaWdoKQoreworCXN0cnVjdCByZXNvdXJjZSByZXNbXSA9IHsKKwkJeworCQkJLnN0YXJ0ID0gaW9iYXNlLAorCQkJLmVuZCA9IGlvYmFzZSArIGlvc2l6ZSAtIDEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwkJfSwgeworCQkJLnN0YXJ0ID0gaXJxLAorCQkJLmVuZCA9IGlycSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQl9LCB7CisJCQkuc3RhcnQgPSBpcnFfaGlnaCwKKwkJCS5lbmQgPSBpcnFfaGlnaCwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQl9LAorCX07CisKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3Jlc25kYXRhKCZteGNfYWlwc19idXMsCisJCQluYW1lLCBpZCwgcmVzLCBBUlJBWV9TSVpFKHJlcyksIE5VTEwsIDApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZG1hLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC1kbWEuYwppbmRleCAzNTM4Yjg1ZS4uYzY0ZjAxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZG1hLmMKQEAgLTMzLDIyICszMywyMiBAQAogCiAjaWZkZWYgQ09ORklHX1NPQ19JTVgyNQogc3RydWN0IGlteF9pbXhfc2RtYV9kYXRhIGlteDI1X2lteF9zZG1hX2RhdGEgX19pbml0Y29uc3QgPQotCWlteF9pbXhfc2RtYV9kYXRhX2VudHJ5X3NpbmdsZShNWDI1LCAxLCAiaW14MjUiLCAwKTsKKwlpbXhfaW14X3NkbWFfZGF0YV9lbnRyeV9zaW5nbGUoTVgyNSwgMiwgImlteDI1IiwgMSk7CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVgyNSAqLwogCiAjaWZkZWYgQ09ORklHX1NPQ19JTVgzMQogc3RydWN0IGlteF9pbXhfc2RtYV9kYXRhIGlteDMxX2lteF9zZG1hX2RhdGEgX19pbml0ZGF0YSA9Ci0JaW14X2lteF9zZG1hX2RhdGFfZW50cnlfc2luZ2xlKE1YMzEsIDEsICJpbXgzMSIsIDApOworCWlteF9pbXhfc2RtYV9kYXRhX2VudHJ5X3NpbmdsZShNWDMxLCAxLCAiaW14MzEiLCAxKTsKICNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU09DX0lNWDMxICovCiAKICNpZmRlZiBDT05GSUdfU09DX0lNWDM1CiBzdHJ1Y3QgaW14X2lteF9zZG1hX2RhdGEgaW14MzVfaW14X3NkbWFfZGF0YSBfX2luaXRkYXRhID0KLQlpbXhfaW14X3NkbWFfZGF0YV9lbnRyeV9zaW5nbGUoTVgzNSwgMiwgImlteDM1IiwgMCk7CisJaW14X2lteF9zZG1hX2RhdGFfZW50cnlfc2luZ2xlKE1YMzUsIDIsICJpbXgzNSIsIDEpOwogI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YMzUgKi8KIAogI2lmZGVmIENPTkZJR19TT0NfSU1YNTEKIHN0cnVjdCBpbXhfaW14X3NkbWFfZGF0YSBpbXg1MV9pbXhfc2RtYV9kYXRhIF9faW5pdGNvbnN0ID0KLQlpbXhfaW14X3NkbWFfZGF0YV9lbnRyeV9zaW5nbGUoTVg1MSwgMiwgImlteDUxIiwgMCk7CisJaW14X2lteF9zZG1hX2RhdGFfZW50cnlfc2luZ2xlKE1YNTEsIDIsICJpbXg1MSIsIDEpOwogI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YNTEgKi8KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgX19pbml0IF9fbWF5YmVfdW51c2VkICppbXhfYWRkX2lteF9zZG1hKApAQCAtNTcsNyArNTcsNyBAQAogCXN0cnVjdCByZXNvdXJjZSByZXNbXSA9IHsKIAkJewogCQkJLnN0YXJ0ID0gZGF0YS0+aW9iYXNlLAotCQkJLmVuZCA9IGRhdGEtPmlvYmFzZSArIFNaXzRLIC0gMSwKKwkJCS5lbmQgPSBkYXRhLT5pb2Jhc2UgKyBTWl8xNksgLSAxLAogCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJCX0sIHsKIAkJCS5zdGFydCA9IGRhdGEtPmlycSwKQEAgLTc3LDcgKzc3LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19BUkNIX01YMjUKLXN0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgYWRkcl9pbXgyNV90bzEgPSB7CitzdGF0aWMgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzIGFkZHJfaW14MjUgPSB7CiAJLmFwXzJfYXBfYWRkciA9IDcyOSwKIAkudWFydF8yX21jdV9hZGRyID0gOTA0LAogCS5wZXJfMl9hcHBfYWRkciA9IDEyNTUsCkBAIC0xMzksNyArMTM5LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NPQ19JTVg1MQotc3RhdGljIHN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycyBhZGRyX2lteDUxX3RvMSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgYWRkcl9pbXg1MSA9IHsKIAkuYXBfMl9hcF9hZGRyID0gNjQyLAogCS51YXJ0XzJfbWN1X2FkZHIgPSA4MTcsCiAJLm1jdV8yX2FwcF9hZGRyID0gNzQ3LApAQCAtMTY1LDcgKzE2NSw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19TT0NfSU1YMjUpCiAJaWYgKGNwdV9pc19teDI1KCkpIHsKLQkJaW14MjVfaW14X3NkbWFfZGF0YS5wZGF0YS5zY3JpcHRfYWRkcnMgPSAmYWRkcl9pbXgyNV90bzE7CisJCWlteDI1X2lteF9zZG1hX2RhdGEucGRhdGEuc2NyaXB0X2FkZHJzID0gJmFkZHJfaW14MjU7CiAJCXJldCA9IGlteF9hZGRfaW14X3NkbWEoJmlteDI1X2lteF9zZG1hX2RhdGEpOwogCX0gZWxzZQogI2VuZGlmCkBAIC0xOTYsNyArMTk2LDkgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX1NPQ19JTVg1MSkKIAlpZiAoY3B1X2lzX214NTEoKSkgewotCQlpbXg1MV9pbXhfc2RtYV9kYXRhLnBkYXRhLnNjcmlwdF9hZGRycyA9ICZhZGRyX2lteDUxX3RvMTsKKwkJaW50IHRvX3ZlcnNpb24gPSBteDUxX3JldmlzaW9uKCkgPj4gNDsKKwkJaW14NTFfaW14X3NkbWFfZGF0YS5wZGF0YS50b192ZXJzaW9uID0gdG9fdmVyc2lvbjsKKwkJaW14NTFfaW14X3NkbWFfZGF0YS5wZGF0YS5zY3JpcHRfYWRkcnMgPSAmYWRkcl9pbXg1MTsKIAkJcmV0ID0gaW14X2FkZF9pbXhfc2RtYSgmaW14NTFfaW14X3NkbWFfZGF0YSk7CiAJfSBlbHNlCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWZiLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC1mYi5jCmluZGV4IDc5YTFjYjEuLjJiMGI1ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWZiLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZmIuYwpAQCAtNiw2ICs2LDcgQEAKICAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtc3NpLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC1zc2kuYwppbmRleCAyNTY5YzhkLi42NmI4NTkzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC1zc2kuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC1zc2kuYwpAQCAtNjksNyArNjksNyBAQAogI2lmZGVmIENPTkZJR19TT0NfSU1YNTEKIGNvbnN0IHN0cnVjdCBpbXhfaW14X3NzaV9kYXRhIGlteDUxX2lteF9zc2lfZGF0YVtdIF9faW5pdGNvbnN0ID0gewogI2RlZmluZSBpbXg1MV9pbXhfc3NpX2RhdGFfZW50cnkoX2lkLCBfaHdpZCkJCQkJXAotCWlteF9pbXhfc3NpX2RhdGFfZW50cnkoTVg1MSwgX2lkLCBfaHdpZCwgU1pfNEspCisJaW14X2lteF9zc2lfZGF0YV9lbnRyeShNWDUxLCBfaWQsIF9od2lkLCBTWl8xNkspCiAJaW14NTFfaW14X3NzaV9kYXRhX2VudHJ5KDAsIDEpLAogCWlteDUxX2lteF9zc2lfZGF0YV9lbnRyeSgxLCAyKSwKIAlpbXg1MV9pbXhfc3NpX2RhdGFfZW50cnkoMiwgMyksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlwdS1jb3JlLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlwdS1jb3JlLmMKaW5kZXggZWRmNjUwMy4uNzlkMzQwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pcHUtY29yZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taXB1LWNvcmUuYwpAQCAtNiw2ICs2LDcgQEAKICAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1teGMtZWhjaS5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1teGMtZWhjaS5jCmluZGV4IGNjNDg4ZjQuLmUxNzYzZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tbXhjLWVoY2kuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLW14Yy1laGNpLmMKQEAgLTYsNiArNiw3IEBACiAgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCiAgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tbXhjLW1tYy5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1teGMtbW1jLmMKaW5kZXggOTBkNzYyZi4uNTQwZDNhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1teGMtbW1jLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1teGMtbW1jLmMKQEAgLTYsNiArNiw3IEBACiAgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCiAgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tc3BpX2lteC5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1zcGlfaW14LmMKaW5kZXggZjk3ZWIzNi4uOWJmYWU4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1zcGlfaW14LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1zcGlfaW14LmMKQEAgLTQwLDkgKzQwLDEwIEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TT0NfSU1YMjUKKy8qIGkubXgyNSBoYXMgdGhlIGkubXgzNSB0eXBlIGNzcGkgKi8KIGNvbnN0IHN0cnVjdCBpbXhfc3BpX2lteF9kYXRhIGlteDI1X2NzcGlfZGF0YVtdIF9faW5pdGNvbnN0ID0gewogI2RlZmluZSBpbXgyNV9jc3BpX2RhdGFfZW50cnkoX2lkLCBfaHdpZCkJCQkJXAotCWlteF9zcGlfaW14X2RhdGFfZW50cnkoTVgyNSwgQ1NQSSwgImlteDI1LWNzcGkiLCBfaWQsIF9od2lkLCBTWl8xNkspCisJaW14X3NwaV9pbXhfZGF0YV9lbnRyeShNWDI1LCBDU1BJLCAiaW14MzUtY3NwaSIsIF9pZCwgX2h3aWQsIFNaXzE2SykKIAlpbXgyNV9jc3BpX2RhdGFfZW50cnkoMCwgMSksCiAJaW14MjVfY3NwaV9kYXRhX2VudHJ5KDEsIDIpLAogCWlteDI1X2NzcGlfZGF0YV9lbnRyeSgyLCAzKSwKQEAgLTc5LDggKzgwLDkgQEAKICNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU09DX0lNWDM1ICovCiAKICNpZmRlZiBDT05GSUdfU09DX0lNWDUxCisvKiBpLm14NTEgaGFzIHRoZSBpLm14MzUgdHlwZSBjc3BpICovCiBjb25zdCBzdHJ1Y3QgaW14X3NwaV9pbXhfZGF0YSBpbXg1MV9jc3BpX2RhdGEgX19pbml0Y29uc3QgPQotCWlteF9zcGlfaW14X2RhdGFfZW50cnlfc2luZ2xlKE1YNTEsIENTUEksICJpbXg1MS1jc3BpIiwgMiwgLCBTWl80Syk7CisJaW14X3NwaV9pbXhfZGF0YV9lbnRyeV9zaW5nbGUoTVg1MSwgQ1NQSSwgImlteDM1LWNzcGkiLCAyLCAsIFNaXzRLKTsKIAogY29uc3Qgc3RydWN0IGlteF9zcGlfaW14X2RhdGEgaW14NTFfZWNzcGlfZGF0YVtdIF9faW5pdGNvbnN0ID0gewogI2RlZmluZSBpbXg1MV9lY3NwaV9kYXRhX2VudHJ5KF9pZCwgX2h3aWQpCQkJCVwKQEAgLTkxLDEyICs5MywxNCBAQAogI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YNTEgKi8KIAogI2lmZGVmIENPTkZJR19TT0NfSU1YNTMKKy8qIGkubXg1MyBoYXMgdGhlIGkubXgzNSB0eXBlIGNzcGkgKi8KIGNvbnN0IHN0cnVjdCBpbXhfc3BpX2lteF9kYXRhIGlteDUzX2NzcGlfZGF0YSBfX2luaXRjb25zdCA9Ci0JaW14X3NwaV9pbXhfZGF0YV9lbnRyeV9zaW5nbGUoTVg1MywgQ1NQSSwgImlteDUzLWNzcGkiLCAwLCAsIFNaXzRLKTsKKwlpbXhfc3BpX2lteF9kYXRhX2VudHJ5X3NpbmdsZShNWDUzLCBDU1BJLCAiaW14MzUtY3NwaSIsIDAsICwgU1pfNEspOwogCisvKiBpLm14NTMgaGFzIHRoZSBpLm14NTEgdHlwZSBlY3NwaSAqLwogY29uc3Qgc3RydWN0IGlteF9zcGlfaW14X2RhdGEgaW14NTNfZWNzcGlfZGF0YVtdIF9faW5pdGNvbnN0ID0gewogI2RlZmluZSBpbXg1M19lY3NwaV9kYXRhX2VudHJ5KF9pZCwgX2h3aWQpCQkJCVwKLQlpbXhfc3BpX2lteF9kYXRhX2VudHJ5KE1YNTMsIEVDU1BJLCAiaW14NTMtZWNzcGkiLCBfaWQsIF9od2lkLCBTWl80SykKKwlpbXhfc3BpX2lteF9kYXRhX2VudHJ5KE1YNTMsIEVDU1BJLCAiaW14NTEtZWNzcGkiLCBfaWQsIF9od2lkLCBTWl80SykKIAlpbXg1M19lY3NwaV9kYXRhX2VudHJ5KDAsIDEpLAogCWlteDUzX2Vjc3BpX2RhdGFfZW50cnkoMSwgMiksCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2Q2ZDdmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKgotICogTVhDIEdQSU8gc3VwcG9ydC4gKGMpIDIwMDggRGFuaWVsIE1hY2sgPGRhbmllbEBjYWlhcS5kZT4KLSAqIENvcHlyaWdodCAyMDA4IEp1ZXJnZW4gQmVpc2VydCwga2VybmVsQHBlbmd1dHJvbml4LmRlCi0gKgotICogQmFzZWQgb24gY29kZSBmcm9tIEZyZWVzY2FsZSwKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgbXhjX2dwaW9fcG9ydCAqbXhjX2dwaW9fcG9ydHM7Ci1zdGF0aWMgaW50IGdwaW9fdGFibGVfc2l6ZTsKLQotI2RlZmluZSBjcHVfaXNfbXgxX214MigpCShjcHVfaXNfbXgxKCkgfHwgY3B1X2lzX214MigpKQotCi0jZGVmaW5lIEdQSU9fRFIJCShjcHVfaXNfbXgxX214MigpID8gMHgxYyA6IDB4MDApCi0jZGVmaW5lIEdQSU9fR0RJUgkoY3B1X2lzX214MV9teDIoKSA/IDB4MDAgOiAweDA0KQotI2RlZmluZSBHUElPX1BTUgkoY3B1X2lzX214MV9teDIoKSA/IDB4MjQgOiAweDA4KQotI2RlZmluZSBHUElPX0lDUjEJKGNwdV9pc19teDFfbXgyKCkgPyAweDI4IDogMHgwQykKLSNkZWZpbmUgR1BJT19JQ1IyCShjcHVfaXNfbXgxX214MigpID8gMHgyQyA6IDB4MTApCi0jZGVmaW5lIEdQSU9fSU1SCShjcHVfaXNfbXgxX214MigpID8gMHgzMCA6IDB4MTQpCi0jZGVmaW5lIEdQSU9fSVNSCShjcHVfaXNfbXgxX214MigpID8gMHgzNCA6IDB4MTgpCi0KLSNkZWZpbmUgR1BJT19JTlRfTE9XX0xFVgkoY3B1X2lzX214MV9teDIoKSA/IDB4MyA6IDB4MCkKLSNkZWZpbmUgR1BJT19JTlRfSElHSF9MRVYJKGNwdV9pc19teDFfbXgyKCkgPyAweDIgOiAweDEpCi0jZGVmaW5lIEdQSU9fSU5UX1JJU0VfRURHRQkoY3B1X2lzX214MV9teDIoKSA/IDB4MCA6IDB4MikKLSNkZWZpbmUgR1BJT19JTlRfRkFMTF9FREdFCShjcHVfaXNfbXgxX214MigpID8gMHgxIDogMHgzKQotI2RlZmluZSBHUElPX0lOVF9OT05FCQkweDQKLQotLyogTm90ZTogVGhpcyBkcml2ZXIgYXNzdW1lcyAzMiBHUElPcyBhcmUgaGFuZGxlZCBpbiBvbmUgcmVnaXN0ZXIgKi8KLQotc3RhdGljIHZvaWQgX2NsZWFyX2dwaW9faXJxc3RhdHVzKHN0cnVjdCBteGNfZ3Bpb19wb3J0ICpwb3J0LCB1MzIgaW5kZXgpCi17Ci0JX19yYXdfd3JpdGVsKDEgPDwgaW5kZXgsIHBvcnQtPmJhc2UgKyBHUElPX0lTUik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9zZXRfZ3Bpb19pcnFlbmFibGUoc3RydWN0IG14Y19ncGlvX3BvcnQgKnBvcnQsIHUzMiBpbmRleCwKLQkJCQlpbnQgZW5hYmxlKQotewotCXUzMiBsOwotCi0JbCA9IF9fcmF3X3JlYWRsKHBvcnQtPmJhc2UgKyBHUElPX0lNUik7Ci0JbCA9IChsICYgKH4oMSA8PCBpbmRleCkpKSB8ICghIWVuYWJsZSA8PCBpbmRleCk7Ci0JX19yYXdfd3JpdGVsKGwsIHBvcnQtPmJhc2UgKyBHUElPX0lNUik7Ci19Ci0KLXN0YXRpYyB2b2lkIGdwaW9fYWNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JdTMyIGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOwotCV9jbGVhcl9ncGlvX2lycXN0YXR1cygmbXhjX2dwaW9fcG9ydHNbZ3BpbyAvIDMyXSwgZ3BpbyAmIDB4MWYpOwotfQotCi1zdGF0aWMgdm9pZCBncGlvX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQl1MzIgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0JX3NldF9ncGlvX2lycWVuYWJsZSgmbXhjX2dwaW9fcG9ydHNbZ3BpbyAvIDMyXSwgZ3BpbyAmIDB4MWYsIDApOwotfQotCi1zdGF0aWMgdm9pZCBncGlvX3VubWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQotewotCXUzMiBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKLQlfc2V0X2dwaW9faXJxZW5hYmxlKCZteGNfZ3Bpb19wb3J0c1tncGlvIC8gMzJdLCBncGlvICYgMHgxZiwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXhjX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCk7Ci0KLXN0YXRpYyBpbnQgZ3Bpb19zZXRfaXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1MzIgdHlwZSkKLXsKLQl1MzIgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0Jc3RydWN0IG14Y19ncGlvX3BvcnQgKnBvcnQgPSAmbXhjX2dwaW9fcG9ydHNbZ3BpbyAvIDMyXTsKLQl1MzIgYml0LCB2YWw7Ci0JaW50IGVkZ2U7Ci0Jdm9pZCBfX2lvbWVtICpyZWcgPSBwb3J0LT5iYXNlOwotCi0JcG9ydC0+Ym90aF9lZGdlcyAmPSB+KDEgPDwgKGdwaW8gJiAzMSkpOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6Ci0JCWVkZ2UgPSBHUElPX0lOVF9SSVNFX0VER0U7Ci0JCWJyZWFrOwotCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgotCQllZGdlID0gR1BJT19JTlRfRkFMTF9FREdFOwotCQlicmVhazsKLQljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKLQkJdmFsID0gbXhjX2dwaW9fZ2V0KCZwb3J0LT5jaGlwLCBncGlvICYgMzEpOwotCQlpZiAodmFsKSB7Ci0JCQllZGdlID0gR1BJT19JTlRfTE9XX0xFVjsKLQkJCXByX2RlYnVnKCJteGM6IHNldCBHUElPICVkIHRvIGxvdyB0cmlnZ2VyXG4iLCBncGlvKTsKLQkJfSBlbHNlIHsKLQkJCWVkZ2UgPSBHUElPX0lOVF9ISUdIX0xFVjsKLQkJCXByX2RlYnVnKCJteGM6IHNldCBHUElPICVkIHRvIGhpZ2ggdHJpZ2dlclxuIiwgZ3Bpbyk7Ci0JCX0KLQkJcG9ydC0+Ym90aF9lZGdlcyB8PSAxIDw8IChncGlvICYgMzEpOwotCQlicmVhazsKLQljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKLQkJZWRnZSA9IEdQSU9fSU5UX0xPV19MRVY7Ci0JCWJyZWFrOwotCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKLQkJZWRnZSA9IEdQSU9fSU5UX0hJR0hfTEVWOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZWcgKz0gR1BJT19JQ1IxICsgKChncGlvICYgMHgxMCkgPj4gMik7IC8qIGxvd2VyIG9yIHVwcGVyIHJlZ2lzdGVyICovCi0JYml0ID0gZ3BpbyAmIDB4ZjsKLQl2YWwgPSBfX3Jhd19yZWFkbChyZWcpICYgfigweDMgPDwgKGJpdCA8PCAxKSk7Ci0JX19yYXdfd3JpdGVsKHZhbCB8IChlZGdlIDw8IChiaXQgPDwgMSkpLCByZWcpOwotCV9jbGVhcl9ncGlvX2lycXN0YXR1cyhwb3J0LCBncGlvICYgMHgxZik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXhjX2ZsaXBfZWRnZShzdHJ1Y3QgbXhjX2dwaW9fcG9ydCAqcG9ydCwgdTMyIGdwaW8pCi17Ci0Jdm9pZCBfX2lvbWVtICpyZWcgPSBwb3J0LT5iYXNlOwotCXUzMiBiaXQsIHZhbDsKLQlpbnQgZWRnZTsKLQotCXJlZyArPSBHUElPX0lDUjEgKyAoKGdwaW8gJiAweDEwKSA+PiAyKTsgLyogbG93ZXIgb3IgdXBwZXIgcmVnaXN0ZXIgKi8KLQliaXQgPSBncGlvICYgMHhmOwotCXZhbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JZWRnZSA9ICh2YWwgPj4gKGJpdCA8PCAxKSkgJiAzOwotCXZhbCAmPSB+KDB4MyA8PCAoYml0IDw8IDEpKTsKLQlpZiAoZWRnZSA9PSBHUElPX0lOVF9ISUdIX0xFVikgewotCQllZGdlID0gR1BJT19JTlRfTE9XX0xFVjsKLQkJcHJfZGVidWcoIm14Yzogc3dpdGNoIEdQSU8gJWQgdG8gbG93IHRyaWdnZXJcbiIsIGdwaW8pOwotCX0gZWxzZSBpZiAoZWRnZSA9PSBHUElPX0lOVF9MT1dfTEVWKSB7Ci0JCWVkZ2UgPSBHUElPX0lOVF9ISUdIX0xFVjsKLQkJcHJfZGVidWcoIm14Yzogc3dpdGNoIEdQSU8gJWQgdG8gaGlnaCB0cmlnZ2VyXG4iLCBncGlvKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIm14YzogaW52YWxpZCBjb25maWd1cmF0aW9uIGZvciBHUElPICVkOiAleFxuIiwKLQkJICAgICAgIGdwaW8sIGVkZ2UpOwotCQlyZXR1cm47Ci0JfQotCV9fcmF3X3dyaXRlbCh2YWwgfCAoZWRnZSA8PCAoYml0IDw8IDEpKSwgcmVnKTsKLX0KLQotLyogaGFuZGxlIDMyIGludGVycnVwdHMgaW4gb25lIHN0YXR1cyByZWdpc3RlciAqLwotc3RhdGljIHZvaWQgbXhjX2dwaW9faXJxX2hhbmRsZXIoc3RydWN0IG14Y19ncGlvX3BvcnQgKnBvcnQsIHUzMiBpcnFfc3RhdCkKLXsKLQl1MzIgZ3Bpb19pcnFfbm9fYmFzZSA9IHBvcnQtPnZpcnR1YWxfaXJxX3N0YXJ0OwotCi0Jd2hpbGUgKGlycV9zdGF0ICE9IDApIHsKLQkJaW50IGlycW9mZnNldCA9IGZscyhpcnFfc3RhdCkgLSAxOwotCi0JCWlmIChwb3J0LT5ib3RoX2VkZ2VzICYgKDEgPDwgaXJxb2Zmc2V0KSkKLQkJCW14Y19mbGlwX2VkZ2UocG9ydCwgaXJxb2Zmc2V0KTsKLQotCQlnZW5lcmljX2hhbmRsZV9pcnEoZ3Bpb19pcnFfbm9fYmFzZSArIGlycW9mZnNldCk7Ci0KLQkJaXJxX3N0YXQgJj0gfigxIDw8IGlycW9mZnNldCk7Ci0JfQotfQotCi0vKiBNWDEgYW5kIE1YMyBoYXMgb25lIGludGVycnVwdCAqcGVyKiBncGlvIHBvcnQgKi8KLXN0YXRpYyB2b2lkIG14M19ncGlvX2lycV9oYW5kbGVyKHUzMiBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKLXsKLQl1MzIgaXJxX3N0YXQ7Ci0Jc3RydWN0IG14Y19ncGlvX3BvcnQgKnBvcnQgPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOwotCi0JaXJxX3N0YXQgPSBfX3Jhd19yZWFkbChwb3J0LT5iYXNlICsgR1BJT19JU1IpICYKLQkJCV9fcmF3X3JlYWRsKHBvcnQtPmJhc2UgKyBHUElPX0lNUik7Ci0KLQlteGNfZ3Bpb19pcnFfaGFuZGxlcihwb3J0LCBpcnFfc3RhdCk7Ci19Ci0KLS8qIE1YMiBoYXMgb25lIGludGVycnVwdCAqZm9yIGFsbCogZ3BpbyBwb3J0cyAqLwotc3RhdGljIHZvaWQgbXgyX2dwaW9faXJxX2hhbmRsZXIodTMyIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQotewotCWludCBpOwotCXUzMiBpcnFfbXNrLCBpcnFfc3RhdDsKLQlzdHJ1Y3QgbXhjX2dwaW9fcG9ydCAqcG9ydCA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7Ci0KLQkvKiB3YWxrIHRocm91Z2ggYWxsIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzICovCi0JZm9yIChpID0gMDsgaSA8IGdwaW9fdGFibGVfc2l6ZTsgaSsrKSB7Ci0JCWlycV9tc2sgPSBfX3Jhd19yZWFkbChwb3J0W2ldLmJhc2UgKyBHUElPX0lNUik7Ci0JCWlmICghaXJxX21zaykKLQkJCWNvbnRpbnVlOwotCi0JCWlycV9zdGF0ID0gX19yYXdfcmVhZGwocG9ydFtpXS5iYXNlICsgR1BJT19JU1IpICYgaXJxX21zazsKLQkJaWYgKGlycV9zdGF0KQotCQkJbXhjX2dwaW9faXJxX2hhbmRsZXIoJnBvcnRbaV0sIGlycV9zdGF0KTsKLQl9Ci19Ci0KLS8qCi0gKiBTZXQgaW50ZXJydXB0IG51bWJlciAiaXJxIiBpbiB0aGUgR1BJTyBhcyBhIHdha2UtdXAgc291cmNlLgotICogV2hpbGUgc3lzdGVtIGlzIHJ1bm5pbmcsIGFsbCByZWdpc3RlcmVkIEdQSU8gaW50ZXJydXB0cyBuZWVkIHRvIGhhdmUKLSAqIHdha2UtdXAgZW5hYmxlZC4gV2hlbiBzeXN0ZW0gaXMgc3VzcGVuZGVkLCBvbmx5IHNlbGVjdGVkIEdQSU8gaW50ZXJydXB0cwotICogbmVlZCB0byBoYXZlIHdha2UtdXAgZW5hYmxlZC4KLSAqIEBwYXJhbSAgaXJxICAgICAgICAgIGludGVycnVwdCBzb3VyY2UgbnVtYmVyCi0gKiBAcGFyYW0gIGVuYWJsZSAgICAgICBlbmFibGUgYXMgd2FrZS11cCBpZiBlcXVhbCB0byBub24temVybwotICogQHJldHVybiAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLgotICovCi1zdGF0aWMgaW50IGdwaW9fc2V0X3dha2VfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCwgdTMyIGVuYWJsZSkKLXsKLQl1MzIgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0JdTMyIGdwaW9faWR4ID0gZ3BpbyAmIDB4MUY7Ci0Jc3RydWN0IG14Y19ncGlvX3BvcnQgKnBvcnQgPSAmbXhjX2dwaW9fcG9ydHNbZ3BpbyAvIDMyXTsKLQotCWlmIChlbmFibGUpIHsKLQkJaWYgKHBvcnQtPmlycV9oaWdoICYmIChncGlvX2lkeCA+PSAxNikpCi0JCQllbmFibGVfaXJxX3dha2UocG9ydC0+aXJxX2hpZ2gpOwotCQllbHNlCi0JCQllbmFibGVfaXJxX3dha2UocG9ydC0+aXJxKTsKLQl9IGVsc2UgewotCQlpZiAocG9ydC0+aXJxX2hpZ2ggJiYgKGdwaW9faWR4ID49IDE2KSkKLQkJCWRpc2FibGVfaXJxX3dha2UocG9ydC0+aXJxX2hpZ2gpOwotCQllbHNlCi0JCQlkaXNhYmxlX2lycV93YWtlKHBvcnQtPmlycSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZ3Bpb19pcnFfY2hpcCA9IHsKLQkubmFtZSA9ICJHUElPIiwKLQkuaXJxX2FjayA9IGdwaW9fYWNrX2lycSwKLQkuaXJxX21hc2sgPSBncGlvX21hc2tfaXJxLAotCS5pcnFfdW5tYXNrID0gZ3Bpb191bm1hc2tfaXJxLAotCS5pcnFfc2V0X3R5cGUgPSBncGlvX3NldF9pcnFfdHlwZSwKLQkuaXJxX3NldF93YWtlID0gZ3Bpb19zZXRfd2FrZV9pcnEsCi19OwotCi1zdGF0aWMgdm9pZCBfc2V0X2dwaW9fZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKLQkJCQlpbnQgZGlyKQotewotCXN0cnVjdCBteGNfZ3Bpb19wb3J0ICpwb3J0ID0KLQkJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBteGNfZ3Bpb19wb3J0LCBjaGlwKTsKLQl1MzIgbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlsID0gX19yYXdfcmVhZGwocG9ydC0+YmFzZSArIEdQSU9fR0RJUik7Ci0JaWYgKGRpcikKLQkJbCB8PSAxIDw8IG9mZnNldDsKLQllbHNlCi0JCWwgJj0gfigxIDw8IG9mZnNldCk7Ci0JX19yYXdfd3JpdGVsKGwsIHBvcnQtPmJhc2UgKyBHUElPX0dESVIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbXhjX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBteGNfZ3Bpb19wb3J0ICpwb3J0ID0KLQkJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBteGNfZ3Bpb19wb3J0LCBjaGlwKTsKLQl2b2lkIF9faW9tZW0gKnJlZyA9IHBvcnQtPmJhc2UgKyBHUElPX0RSOwotCXUzMiBsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCWwgPSAoX19yYXdfcmVhZGwocmVnKSAmICh+KDEgPDwgb2Zmc2V0KSkpIHwgKCEhdmFsdWUgPDwgb2Zmc2V0KTsKLQlfX3Jhd193cml0ZWwobCwgcmVnKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXhjX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgbXhjX2dwaW9fcG9ydCAqcG9ydCA9Ci0JCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbXhjX2dwaW9fcG9ydCwgY2hpcCk7Ci0KLQlyZXR1cm4gKF9fcmF3X3JlYWRsKHBvcnQtPmJhc2UgKyBHUElPX1BTUikgPj4gb2Zmc2V0KSAmIDE7Ci19Ci0KLXN0YXRpYyBpbnQgbXhjX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlfc2V0X2dwaW9fZGlyZWN0aW9uKGNoaXAsIG9mZnNldCwgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXhjX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JbXhjX2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOwotCV9zZXRfZ3Bpb19kaXJlY3Rpb24oY2hpcCwgb2Zmc2V0LCAxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgbG9jayBjbGFzcyB0ZWxscyBsb2NrZGVwIHRoYXQgR1BJTyBpcnFzIGFyZSBpbiBhIGRpZmZlcmVudAotICogY2F0ZWdvcnkgdGhhbiB0aGVpciBwYXJlbnRzLCBzbyBpdCB3b24ndCByZXBvcnQgZmFsc2UgcmVjdXJzaW9uLgotICovCi1zdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGdwaW9fbG9ja19jbGFzczsKLQotaW50IF9faW5pdCBteGNfZ3Bpb19pbml0KHN0cnVjdCBteGNfZ3Bpb19wb3J0ICpwb3J0LCBpbnQgY250KQotewotCWludCBpLCBqOwotCi0JLyogc2F2ZSBmb3IgbG9jYWwgdXNhZ2UgKi8KLQlteGNfZ3Bpb19wb3J0cyA9IHBvcnQ7Ci0JZ3Bpb190YWJsZV9zaXplID0gY250OwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiTVhDIEdQSU8gaGFyZHdhcmVcbiIpOwotCi0JZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7Ci0JCS8qIGRpc2FibGUgdGhlIGludGVycnVwdCBhbmQgY2xlYXIgdGhlIHN0YXR1cyAqLwotCQlfX3Jhd193cml0ZWwoMCwgcG9ydFtpXS5iYXNlICsgR1BJT19JTVIpOwotCQlfX3Jhd193cml0ZWwofjAsIHBvcnRbaV0uYmFzZSArIEdQSU9fSVNSKTsKLQkJZm9yIChqID0gcG9ydFtpXS52aXJ0dWFsX2lycV9zdGFydDsKLQkJCWogPCBwb3J0W2ldLnZpcnR1YWxfaXJxX3N0YXJ0ICsgMzI7IGorKykgewotCQkJaXJxX3NldF9sb2NrZGVwX2NsYXNzKGosICZncGlvX2xvY2tfY2xhc3MpOwotCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGosICZncGlvX2lycV9jaGlwLAotCQkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwotCQkJc2V0X2lycV9mbGFncyhqLCBJUlFGX1ZBTElEKTsKLQkJfQotCi0JCS8qIHJlZ2lzdGVyIGdwaW8gY2hpcCAqLwotCQlwb3J0W2ldLmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gbXhjX2dwaW9fZGlyZWN0aW9uX2lucHV0OwotCQlwb3J0W2ldLmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IG14Y19ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7Ci0JCXBvcnRbaV0uY2hpcC5nZXQgPSBteGNfZ3Bpb19nZXQ7Ci0JCXBvcnRbaV0uY2hpcC5zZXQgPSBteGNfZ3Bpb19zZXQ7Ci0JCXBvcnRbaV0uY2hpcC5iYXNlID0gaSAqIDMyOwotCQlwb3J0W2ldLmNoaXAubmdwaW8gPSAzMjsKLQotCQlzcGluX2xvY2tfaW5pdCgmcG9ydFtpXS5sb2NrKTsKLQotCQkvKiBpdHMgYSBzZXJpb3VzIGNvbmZpZ3VyYXRpb24gYnVnIHdoZW4gaXQgZmFpbHMgKi8KLQkJQlVHX09OKCBncGlvY2hpcF9hZGQoJnBvcnRbaV0uY2hpcCkgPCAwICk7Ci0KLQkJaWYgKGNwdV9pc19teDEoKSB8fCBjcHVfaXNfbXgzKCkgfHwgY3B1X2lzX214MjUoKSB8fCBjcHVfaXNfbXg1MSgpKSB7Ci0JCQkvKiBzZXR1cCBvbmUgaGFuZGxlciBmb3IgZWFjaCBlbnRyeSAqLwotCQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIocG9ydFtpXS5pcnEsCi0JCQkJCQlteDNfZ3Bpb19pcnFfaGFuZGxlcik7Ci0JCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShwb3J0W2ldLmlycSwgJnBvcnRbaV0pOwotCQkJaWYgKHBvcnRbaV0uaXJxX2hpZ2gpIHsKLQkJCQkvKiBzZXR1cCBoYW5kbGVyIGZvciBHUElPIDE2IHRvIDMxICovCi0JCQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIocG9ydFtpXS5pcnFfaGlnaCwKLQkJCQkJCQlteDNfZ3Bpb19pcnFfaGFuZGxlcik7Ci0JCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEocG9ydFtpXS5pcnFfaGlnaCwKLQkJCQkJCSAgICAgJnBvcnRbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGNwdV9pc19teDIoKSkgewotCQkvKiBzZXR1cCBvbmUgaGFuZGxlciBmb3IgYWxsIEdQSU8gaW50ZXJydXB0cyAqLwotCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwb3J0WzBdLmlycSwgbXgyX2dwaW9faXJxX2hhbmRsZXIpOwotCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShwb3J0WzBdLmlycSwgcG9ydCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvY29tbW9uLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvY29tbW9uLmgKaW5kZXggZGE3OTkxOC4uNGUzZDk3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9jb21tb24uaApAQCAtNDMsNiArNDMsMTUgQEAKIGV4dGVybiB2b2lkIG14NTBfaW5pdF9pcnEodm9pZCk7CiBleHRlcm4gdm9pZCBteDUxX2luaXRfaXJxKHZvaWQpOwogZXh0ZXJuIHZvaWQgbXg1M19pbml0X2lycSh2b2lkKTsKK2V4dGVybiB2b2lkIGlteDFfc29jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbXgyMV9zb2NfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlteDI1X3NvY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaW14Mjdfc29jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbXgzMV9zb2NfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlteDM1X3NvY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaW14NTBfc29jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbXg1MV9zb2NfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlteDUzX3NvY19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgZXBpdF90aW1lcl9pbml0KHN0cnVjdCBjbGsgKnRpbWVyX2Nsaywgdm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgaXJxKTsKIGV4dGVybiB2b2lkIG14Y190aW1lcl9pbml0KHN0cnVjdCBjbGsgKnRpbWVyX2Nsaywgdm9pZCBfX2lvbWVtICosIGludCk7CiBleHRlcm4gaW50IG14MV9jbG9ja3NfaW5pdCh1bnNpZ25lZCBsb25nIGZyZWYpOwpAQCAtNTUsNyArNjQsOCBAQAogCQkJdW5zaWduZWQgbG9uZyBja2loMSwgdW5zaWduZWQgbG9uZyBja2loMik7CiBleHRlcm4gaW50IG14NTNfY2xvY2tzX2luaXQodW5zaWduZWQgbG9uZyBja2lsLCB1bnNpZ25lZCBsb25nIG9zYywKIAkJCXVuc2lnbmVkIGxvbmcgY2tpaDEsIHVuc2lnbmVkIGxvbmcgY2tpaDIpOwotZXh0ZXJuIGludCBteGNfcmVnaXN0ZXJfZ3Bpb3Modm9pZCk7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbXhjX3JlZ2lzdGVyX2dwaW8oY2hhciAqbmFtZSwgaW50IGlkLAorCXJlc291cmNlX3NpemVfdCBpb2Jhc2UsIHJlc291cmNlX3NpemVfdCBpb3NpemUsIGludCBpcnEsIGludCBpcnFfaGlnaCk7CiBleHRlcm4gaW50IG14Y19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdm9pZCAqZGF0YSk7CiBleHRlcm4gdm9pZCBteGNfc2V0X2NwdV90eXBlKHVuc2lnbmVkIGludCB0eXBlKTsKIGV4dGVybiB2b2lkIG14Y19hcmNoX3Jlc2V0X2luaXQodm9pZCBfX2lvbWVtICopOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA4ZThkMTc1Li45MWZjN2NkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTIsMzIgKzEyLDMyIEBACiAgKi8KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9NWDEKKyNpZmRlZiBDT05GSUdfU09DX0lNWDEKICNkZWZpbmUgVUFSVF9QQUREUglNWDFfVUFSVDFfQkFTRV9BRERSCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19BUkNIX01YMjUKKyNpZmRlZiBDT05GSUdfU09DX0lNWDI1CiAjaWZkZWYgVUFSVF9QQUREUgogI2Vycm9yICJDT05GSUdfREVCVUdfTEwgaXMgaW5jb21wYXRpYmxlIHdpdGggbXVsdGlwbGUgYXJjaHMiCiAjZW5kaWYKICNkZWZpbmUgVUFSVF9QQUREUglNWDI1X1VBUlQxX0JBU0VfQUREUgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQVJDSF9NWDIKKyNpZiBkZWZpbmVkKENPTkZJR19TT0NfSU1YMjEpIHx8IGRlZmluZWQgKENPTkZJR19TT0NfSU1YMjcpCiAjaWZkZWYgVUFSVF9QQUREUgogI2Vycm9yICJDT05GSUdfREVCVUdfTEwgaXMgaW5jb21wYXRpYmxlIHdpdGggbXVsdGlwbGUgYXJjaHMiCiAjZW5kaWYKICNkZWZpbmUgVUFSVF9QQUREUglNWDJ4X1VBUlQxX0JBU0VfQUREUgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQVJDSF9NWDMKKyNpZiBkZWZpbmVkKENPTkZJR19TT0NfSU1YMzEpIHx8IGRlZmluZWQoQ09ORklHX1NPQ19JTVgzNSkKICNpZmRlZiBVQVJUX1BBRERSCiAjZXJyb3IgIkNPTkZJR19ERUJVR19MTCBpcyBpbmNvbXBhdGlibGUgd2l0aCBtdWx0aXBsZSBhcmNocyIKICNlbmRpZgogI2RlZmluZSBVQVJUX1BBRERSCU1YM3hfVUFSVDFfQkFTRV9BRERSCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19BUkNIX01YNQorI2lmZGVmIENPTkZJR19TT0NfSU1YNTEKICNpZmRlZiBVQVJUX1BBRERSCiAjZXJyb3IgIkNPTkZJR19ERUJVR19MTCBpcyBpbmNvbXBhdGlibGUgd2l0aCBtdWx0aXBsZSBhcmNocyIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaAppbmRleCBmYTg0NzczLi4wM2Y2MjY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaApAQCAtMTAsNiArMTAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAorZXh0ZXJuIHN0cnVjdCBkZXZpY2UgbXhjX2FpcHNfYnVzOworCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbXhfYWRkX3BsYXRmb3JtX2RldmljZV9kbWFtYXNrKAogCQljb25zdCBjaGFyICpuYW1lLCBpbnQgaWQsCiAJCWNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBpbnQgbnVtX3Jlc291cmNlcywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKaW5kZXggMmU0OWU3MS4uMDY2ZDQ2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKQEAgLTc4LDcgKzc4LDMgQEAKIAltb3ZzIFxpcnFuciwgXGlycW5yCiAjZW5kaWYKIAkuZW5kbQotCi0JQCBpcnEgcHJpb3JpdHkgdGFibGUgKG5vdCB1c2VkKQotCS5tYWNybwlpcnFfcHJpb190YWJsZQotCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBhMjc0N2YxLi4zMWM4MjBjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTM2LDMxICszNiw0IEBACiAjZGVmaW5lIGdwaW9fdG9faXJxKGdwaW8pCShNWENfR1BJT19JUlFfU1RBUlQgKyAoZ3BpbykpCiAjZGVmaW5lIGlycV90b19ncGlvKGlycSkJKChpcnEpIC0gTVhDX0dQSU9fSVJRX1NUQVJUKQogCi1zdHJ1Y3QgbXhjX2dwaW9fcG9ydCB7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwotCWludCBpcnE7Ci0JaW50IGlycV9oaWdoOwotCWludCB2aXJ0dWFsX2lycV9zdGFydDsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7Ci0JdTMyIGJvdGhfZWRnZXM7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotfTsKLQotI2RlZmluZSBERUZJTkVfSU1YX0dQSU9fUE9SVF9JUlFfSElHSChzb2MsIF9pZCwgX2h3aWQsIF9pcnEsIF9pcnFfaGlnaCkJXAotCXsJCQkJCQkJCVwKLQkJLmNoaXAubGFiZWwgPSAiZ3Bpby0iICNfaWQsCQkJCVwKLQkJLmlycSA9IF9pcnEsCQkJCQkJXAotCQkuaXJxX2hpZ2ggPSBfaXJxX2hpZ2gsCQkJCQlcCi0JCS5iYXNlID0gc29jICMjIF9JT19BRERSRVNTKAkJCQlcCi0JCQkJc29jICMjIF9HUElPICMjIF9od2lkICMjIF9CQVNFX0FERFIpLAlcCi0JCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVCArIChfaWQpICogMzIsCVwKLQl9Ci0KLSNkZWZpbmUgREVGSU5FX0lNWF9HUElPX1BPUlRfSVJRKHNvYywgX2lkLCBfaHdpZCwgX2lycSkJCQlcCi0JREVGSU5FX0lNWF9HUElPX1BPUlRfSVJRX0hJR0goc29jLCBfaWQsIF9od2lkLCBfaXJxLCAwKQotI2RlZmluZSBERUZJTkVfSU1YX0dQSU9fUE9SVChzb2MsIF9pZCwgX2h3aWQpCQkJCVwKLQlERUZJTkVfSU1YX0dQSU9fUE9SVF9JUlEoc29jLCBfaWQsIF9od2lkLCAwKQotCi1pbnQgbXhjX2dwaW9faW5pdChzdHJ1Y3QgbXhjX2dwaW9fcG9ydCosIGludCk7Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCA2N2QzZTJiLi5hOGJmZDU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtOTcsMzUgKzk3LDE3IEBACiAKICNpbmNsdWRlIDxtYWNoL214Yy5oPgogCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVg1CiAjaW5jbHVkZSA8bWFjaC9teDUwLmg+CiAjaW5jbHVkZSA8bWFjaC9teDUxLmg+CiAjaW5jbHVkZSA8bWFjaC9teDUzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX01YMwogI2luY2x1ZGUgPG1hY2gvbXgzeC5oPgogI2luY2x1ZGUgPG1hY2gvbXgzMS5oPgogI2luY2x1ZGUgPG1hY2gvbXgzNS5oPgotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9NWDIKLSMgaW5jbHVkZSA8bWFjaC9teDJ4Lmg+Ci0jIGlmZGVmIENPTkZJR19NQUNIX01YMjEKLSMgIGluY2x1ZGUgPG1hY2gvbXgyMS5oPgotIyBlbmRpZgotIyBpZmRlZiBDT05GSUdfTUFDSF9NWDI3Ci0jICBpbmNsdWRlIDxtYWNoL214MjcuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVgxCi0jIGluY2x1ZGUgPG1hY2gvbXgxLmg+Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX01YMjUKLSMgaW5jbHVkZSA8bWFjaC9teDI1Lmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDxtYWNoL214MnguaD4KKyNpbmNsdWRlIDxtYWNoL214MjEuaD4KKyNpbmNsdWRlIDxtYWNoL214MjcuaD4KKyNpbmNsdWRlIDxtYWNoL214MS5oPgorI2luY2x1ZGUgPG1hY2gvbXgyNS5oPgogCiAjZGVmaW5lIGlteF9tYXBfZW50cnkoc29jLCBuYW1lLCBfdHlwZSkJewkJCQlcCiAJLnZpcnR1YWwgPSBzb2MgIyMgX0lPX1AyVihzb2MgIyMgXyAjIyBuYW1lICMjIF9CQVNFX0FERFIpLAlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgyNS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14MjUuaAppbmRleCAyZTUyNDRkLi5iZjY0ZTFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgyNS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDI1LmgKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogI2RlZmluZSBNWDI1X1BBRF9HUElPX0FfX1VTQk9UR19QV1IJSU9NVVhfUEFEKDB4M2YwLCAweDFmNCwgMHgxMiwgMCwgMCwgUEFEX0NUTF9QS0UpCiAKICNkZWZpbmUgTVgyNV9QQURfR1BJT19CX19HUElPX0IJCUlPTVVYX1BBRCgweDNmNCwgMHgxZjgsIDB4MTAsIDAsIDAsIE5PX1BBRF9DVFJMKQotI2RlZmluZSBNWDI1X1BBRF9HUElPX0JfX0NBTjFfUlgJSU9NVVhfUEFEKDB4M2Y0LCAweDFmOCwgMHgxNiwgMHg0ODAsIDEsIFBBRF9DVExfUFVTXzIySykKKyNkZWZpbmUgTVgyNV9QQURfR1BJT19CX19DQU4xX1JYCUlPTVVYX1BBRCgweDNmNCwgMHgxZjgsIDB4MTYsIDB4NDgwLCAxLCBQQURfQ1RMX1BVU18yMktfVVApCiAjZGVmaW5lIE1YMjVfUEFEX0dQSU9fQl9fVVNCT1RHX09DCUlPTVVYX1BBRCgweDNmNCwgMHgxZjgsIDB4MTIsIDB4NTdjLCAxLCBQQURfQ1RMX1BVU18xMDBLX1VQKQogCiAjZGVmaW5lIE1YMjVfUEFEX0dQSU9fQ19fR1BJT19DCQlJT01VWF9QQUQoMHgzZjgsIDB4MWZjLCAweDEwLCAwLCAwLCBOT19QQURfQ1RSTCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDUzLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXg1My5oCmluZGV4IGU5NWQ5Y2IuLjk0NDBiOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDUzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14NTMuaApAQCAtMzksMTAgKzM5LDEwIEBACiAjZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE5X19FQ1NQSTFfUkRZCUlPTVVYX1BBRCgweDM0OCwgMHgyMCwgNSwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfR1BJT18xOV9fRkVDX1REQVRBXzMJSU9NVVhfUEFEKDB4MzQ4LCAweDIwLCA2LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE5X19TUkNfSU5UX0JPT1QJSU9NVVhfUEFEKDB4MzQ4LCAweDIwLDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wwX19LUFBfQ09MXzAJSU9NVVhfUEFEKDB4MzRDLCAweDI0LCBvLCAweDAsIDAsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMF9fS1BQX0NPTF8wCUlPTVVYX1BBRCgweDM0QywgMHgyNCwgMCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDBfX0dQSU80XzYJCUlPTVVYX1BBRCgweDM0QywgMHgyNCwgMSwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDBfX0FVRE1VWF9BVUQ1X1RYQwlJT01VWF9QQUQoMHgzNEMsIDB4MjQsIDIsIDB4NzU4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDBfX1VBUlQ0X1RYRF9NVVgJSU9NVVhfUEFEKDB4MzRDLCAweDI0LCA0LCAweDg5MCwgMCwgMCkKKyNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wwX19VQVJUNF9UWERfTVVYCUlPTVVYX1BBRCgweDM0QywgMHgyNCwgNCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDBfX0VDU1BJMV9TQ0xLCUlPTVVYX1BBRCgweDM0QywgMHgyNCwgNSwgMHg3OUMsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMF9fRkVDX1JEQVRBXzMJSU9NVVhfUEFEKDB4MzRDLCAweDI0LCA2LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMF9fU1JDX0FOWV9QVV9SU1QJSU9NVVhfUEFEKDB4MzRDLCAweDI0LCA3LCAweDAsIDAsIDApCkBAIC01NSw3ICs1NSw3IEBACiAjZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMV9fS1BQX0NPTF8xCUlPTVVYX1BBRCgweDM1NCwgMHgyQywgMCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDFfX0dQSU80XzgJCUlPTVVYX1BBRCgweDM1NCwgMHgyQywgMSwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDFfX0FVRE1VWF9BVUQ1X1RYRlMJSU9NVVhfUEFEKDB4MzU0LCAweDJDLCAyLCAweDc1QywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wxX19VQVJUNV9UWERfTVVYCUlPTVVYX1BBRCgweDM1NCwgMHgyQywgNCwgMHg4OTgsIDAsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMV9fVUFSVDVfVFhEX01VWAlJT01VWF9QQUQoMHgzNTQsIDB4MkMsIDQsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wxX19FQ1NQSTFfTUlTTwlJT01VWF9QQUQoMHgzNTQsIDB4MkMsIDUsIDB4N0EwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDFfX0ZFQ19SWF9DTEsJSU9NVVhfUEFEKDB4MzU0LCAweDJDLCA2LCAweDgwOCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wxX19VU0JQSFkxX1RYUkVBRFkJSU9NVVhfUEFEKDB4MzU0LCAweDJDLCA3LCAweDAsIDAsIDApCkBAIC0xMDcsNyArMTA3LDcgQEAKICNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1c0X19HUElPNF8xNQlJT01VWF9QQUQoMHgzNzAsIDB4NDgsIDEsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1c0X19DQU4yX1JYQ0FOCUlPTVVYX1BBRCgweDM3MCwgMHg0OCwgMiwgMHg3NjQsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XNF9fSVBVX1NJU0dfNQlJT01VWF9QQUQoMHgzNzAsIDB4NDgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1c0X19VQVJUNV9DVFMJSU9NVVhfUEFEKDB4MzcwLCAweDQ4LCA0LCAweDg5NCwgMSwgMCkKKyNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1c0X19VQVJUNV9DVFMJSU9NVVhfUEFEKDB4MzcwLCAweDQ4LCA0LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XNF9fVVNCT0gzX1VTQk9UR19QV1IJSU9NVVhfUEFEKDB4MzcwLCAweDQ4LCA1LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XNF9fVVNCUEhZMV9WQlVTVkFMSUQJSU9NVVhfUEFEKDB4MzcwLCAweDQ4LCA3LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9ESTBfRElTUF9DTEtfX0lQVV9ESTBfRElTUF9DTEsJSU9NVVhfUEFEKDB4Mzc4LCAweDRDLCAwLCAweDAsIDAsIDApCkBAIC0zNzcsNyArMzc3LDcgQEAKICNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOV9fVFBJVV9UUkFDRV82CQlJT01VWF9QQUQoMHg0MTAsIDB4RTQsIDcsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTBfX0lQVV9DU0kwX0RfMTAJCUlPTVVYX1BBRCgweDQxNCwgMHhFOCwgMCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fR1BJTzVfMjgJCUlPTVVYX1BBRCgweDQxNCwgMHhFOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fVUFSVDFfVFhEX01VWAlJT01VWF9QQUQoMHg0MTQsIDB4RTgsIDIsIDB4ODc4LCAwLCAwKQorI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fVUFSVDFfVFhEX01VWAlJT01VWF9QQUQoMHg0MTQsIDB4RTgsIDIsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTBfX0VDU1BJMl9NSVNPCQlJT01VWF9QQUQoMHg0MTQsIDB4RTgsIDMsIDB4N0JDLCAxLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fQVVETVVYX0FVRDNfUlhDCUlPTVVYX1BBRCgweDQxNCwgMHhFOCwgNCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fU0RNQV9ERUJVR19QQ180CUlPTVVYX1BBRCgweDQxNCwgMHhFOCwgNSwgMHgwLCAwLCAwKQpAQCAtMzkzLDcgKzM5Myw3IEBACiAjZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDExX19UUElVX1RSQUNFXzgJCUlPTVVYX1BBRCgweDQxOCwgMHhFQywgNywgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMl9fSVBVX0NTSTBfRF8xMgkJSU9NVVhfUEFEKDB4NDFDLCAweEYwLCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEyX19HUElPNV8zMAkJSU9NVVhfUEFEKDB4NDFDLCAweEYwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEyX19VQVJUNF9UWERfTVVYCUlPTVVYX1BBRCgweDQxQywgMHhGMCwgMiwgMHg4OTAsIDIsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEyX19VQVJUNF9UWERfTVVYCUlPTVVYX1BBRCgweDQxQywgMHhGMCwgMiwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMl9fVVNCT0gzX1VTQkgzX0RBVEFfMAlJT01VWF9QQUQoMHg0MUMsIDB4RjAsIDQsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTJfX1NETUFfREVCVUdfUENfNglJT01VWF9QQUQoMHg0MUMsIDB4RjAsIDUsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTJfX0VNSV9FTUlfREVCVUdfNDEJSU9NVVhfUEFEKDB4NDFDLCAweEYwLCA2LCAweDAsIDAsIDApCkBAIC00MDcsNyArNDA3LDcgQEAKICNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTNfX1RQSVVfVFJBQ0VfMTAJCUlPTVVYX1BBRCgweDQyMCwgMHhGNCwgNywgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNF9fSVBVX0NTSTBfRF8xNAkJSU9NVVhfUEFEKDB4NDI0LCAweEY4LCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE0X19HUElPNl8wCQlJT01VWF9QQUQoMHg0MjQsIDB4RjgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTRfX1VBUlQ1X1RYRF9NVVgJSU9NVVhfUEFEKDB4NDI0LCAweEY4LCAyLCAweDg5OCwgMiwgMCkKKyNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTRfX1VBUlQ1X1RYRF9NVVgJSU9NVVhfUEFEKDB4NDI0LCAweEY4LCAyLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE0X19VU0JPSDNfVVNCSDNfREFUQV8yCUlPTVVYX1BBRCgweDQyNCwgMHhGOCwgNCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNF9fU0RNQV9ERUJVR19QQ184CUlPTVVYX1BBRCgweDQyNCwgMHhGOCwgNSwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNF9fRU1JX0VNSV9ERUJVR180MwlJT01VWF9QQUQoMHg0MjQsIDB4RjgsIDYsIDB4MCwgMCwgMCkKQEAgLTQyOCw3ICs0MjgsNyBAQAogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNl9fVFBJVV9UUkFDRV8xMwkJSU9NVVhfUEFEKDB4NDJDLCAweDEwMCwgNywgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxN19fSVBVX0NTSTBfRF8xNwkJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgMCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxN19fR1BJTzZfMwkJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxN19fVUFSVDRfQ1RTCQlJT01VWF9QQUQoMHg0MzAsIDB4MTA0LCAyLCAweDg4QywgMSwgMCkKKyNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTdfX1VBUlQ0X0NUUwkJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgMiwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxN19fVVNCT0gzX1VTQkgzX0RBVEFfNQlJT01VWF9QQUQoMHg0MzAsIDB4MTA0LCA0LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE3X19TRE1BX0RFQlVHX1BDXzExCUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDUsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTdfX0VNSV9FTUlfREVCVUdfNDYJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgNiwgMHgwLCAwLCAwKQpAQCAtNDQyLDcgKzQ0Miw3IEBACiAjZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE4X19UUElVX1RSQUNFXzE1CQlJT01VWF9QQUQoMHg0MzQsIDB4MTA4LCA3LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE5X19JUFVfQ1NJMF9EXzE5CQlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE5X19HUElPNl81CQlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE5X19VQVJUNV9DVFMJCUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDIsIDB4ODk0LCAzLCAwKQorI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxOV9fVUFSVDVfQ1RTCQlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCAyLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE5X19VU0JPSDNfVVNCSDNfREFUQV83CUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDQsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTlfX1NETUFfREVCVUdfUENfMTMJSU9NVVhfUEFEKDB4NDM4LCAweDEwQywgNSwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxOV9fRU1JX0VNSV9ERUJVR180OAlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCA2LCAweDAsIDAsIDApCkBAIC00NjUsMTkgKzQ2NSwxOSBAQAogI2RlZmluZSBfTVg1M19QQURfRUlNX0QxNl9fSVBVX0RJMF9QSU41CQlJT01VWF9QQUQoMHg0NjAsIDB4MTE4LCAyLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE2X19JUFVfRElTUEIxX1NFUl9DTEsJSU9NVVhfUEFEKDB4NDYwLCAweDExOCwgMywgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QxNl9fRUNTUEkxX1NDTEsJCUlPTVVYX1BBRCgweDQ2MCwgMHgxMTgsIDQsIDB4NzlDLCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxNl9fSTJDMl9TREEJCQlJT01VWF9QQUQoMHg0NjAsIDB4MTE4LCA1LCAweDgyMCwgMSwgMCkKKyNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTZfX0kyQzJfU0RBCQkJSU9NVVhfUEFEKDB4NDYwLCAweDExOCwgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyMCwgMSwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTdfX0VNSV9XRUlNX0RfMTcJCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDAsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTdfX0dQSU8zXzE3CQkJSU9NVVhfUEFEKDB4NDY0LCAweDExQywgMSwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QxN19fSVBVX0RJMF9QSU42CQlJT01VWF9QQUQoMHg0NjQsIDB4MTFDLCAyLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE3X19JUFVfRElTUEIxX1NFUl9ESU4JSU9NVVhfUEFEKDB4NDY0LCAweDExQywgMywgMHg4MzAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE3X19FQ1NQSTFfTUlTTwkJSU9NVVhfUEFEKDB4NDY0LCAweDExQywgNCwgMHg3QTAsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE3X19JMkMzX1NDTAkJCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDUsIDB4ODI0LCAwLCAwKQorI2RlZmluZSBfTVg1M19QQURfRUlNX0QxN19fSTJDM19TQ0wJCQlJT01VWF9QQUQoMHg0NjQsIDB4MTFDLCA1IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODI0LCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOF9fRU1JX1dFSU1fRF8xOAkJSU9NVVhfUEFEKDB4NDY4LCAweDEyMCwgMCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOF9fR1BJTzNfMTgJCQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCAxLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE4X19JUFVfREkwX1BJTjcJCUlPTVVYX1BBRCgweDQ2OCwgMHgxMjAsIDIsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMThfX0lQVV9ESVNQQjFfU0VSX0RJTwlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCAzLCAweDgzMCwgMSwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMThfX0VDU1BJMV9NT1NJCQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCA0LCAweDdBNCwgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMThfX0kyQzNfU0RBCQkJSU9NVVhfUEFEKDB4NDY4LCAweDEyMCwgNSwgMHg4MjgsIDAsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE4X19JMkMzX1NEQQkJCUlPTVVYX1BBRCgweDQ2OCwgMHgxMjAsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MjgsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE4X19JUFVfREkxX0QwX0NTCQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCA2LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE5X19FTUlfV0VJTV9EXzE5CQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE5X19HUElPM18xOQkJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDEsIDB4MCwgMCwgMCkKQEAgLTQ4NSw3ICs0ODUsNyBAQAogI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOV9fSVBVX0RJU1BCMV9TRVJfUlMJSU9NVVhfUEFEKDB4NDZDLCAweDEyNCwgMywgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOV9fRUNTUEkxX1NTMQkJSU9NVVhfUEFEKDB4NDZDLCAweDEyNCwgNCwgMHg3QUMsIDIsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE5X19FUElUMV9FUElUTwkJSU9NVVhfUEFEKDB4NDZDLCAweDEyNCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOV9fVUFSVDFfQ1RTCQkJSU9NVVhfUEFEKDB4NDZDLCAweDEyNCwgNiwgMHg4NzQsIDAsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE5X19VQVJUMV9DVFMJCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCA2LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE5X19VU0JPSDNfVVNCSDJfT0MJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDcsIDB4OEE0LCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMF9fRU1JX1dFSU1fRF8yMAkJSU9NVVhfUEFEKDB4NDcwLCAweDEyOCwgMCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMF9fR1BJTzNfMjAJCQlJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCAxLCAweDAsIDAsIDApCkBAIC01MDAsNyArNTAwLDcgQEAKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjFfX0lQVV9ESTBfUElOMTcJCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDIsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjFfX0lQVV9ESVNQQjBfU0VSX0NMSwlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCAzLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIxX19DU1BJX1NDTEsJCQlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCA0LCAweDc4MCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjFfX0kyQzFfU0NMCQkJSU9NVVhfUEFEKDB4NDc0LCAweDEyQywgNSwgMHg4MTQsIDEsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIxX19JMkMxX1NDTAkJCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MTQsIDEsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIxX19VU0JPSDNfVVNCT1RHX09DCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDYsIDB4ODlDLCAxLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMl9fRU1JX1dFSU1fRF8yMgkJSU9NVVhfUEFEKDB4NDc4LCAweDEzMCwgMCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMl9fR1BJTzNfMjIJCQlJT01VWF9QQUQoMHg0NzgsIDB4MTMwLCAxLCAweDAsIDAsIDApCkBAIC01MTAsNyArNTEwLDcgQEAKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjJfX1VTQk9IM19VU0JPVEdfUFdSCUlPTVVYX1BBRCgweDQ3OCwgMHgxMzAsIDYsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjNfX0VNSV9XRUlNX0RfMjMJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDAsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjNfX0dQSU8zXzIzCQkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyM19fVUFSVDNfQ1RTCQkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgMiwgMHg4ODQsIDAsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIzX19VQVJUM19DVFMJCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCAyLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIzX19VQVJUMV9EQ0QJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDMsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTBfRDBfQ1MJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDQsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTFfUElOMgkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgNSwgMHgwLCAwLCAwKQpAQCAtNTI1LDcgKzUyNSw3IEBACiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIzX19JUFVfREkxX1BJTjE2CQlJT01VWF9QQUQoMHg0ODAsIDB4MTM4LCA3LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI0X19FTUlfV0VJTV9EXzI0CQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI0X19HUElPM18yNAkJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjRfX1VBUlQzX1RYRF9NVVgJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDIsIDB4ODg4LCAwLCAwKQorI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNF9fVUFSVDNfVFhEX01VWAkJSU9NVVhfUEFEKDB4NDg0LCAweDEzQywgMiwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNF9fRUNTUEkxX1NTMgkJSU9NVVhfUEFEKDB4NDg0LCAweDEzQywgMywgMHg3QjAsIDEsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI0X19DU1BJX1NTMgkJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDQsIDB4Nzk0LCAxLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNF9fQVVETVVYX0FVRDVfUlhGUwlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCA1LCAweDc1NCwgMSwgMCkKQEAgLTU0MSw3ICs1NDEsNyBAQAogI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNV9fVUFSVDFfRFNSCQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCA3LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI2X19FTUlfV0VJTV9EXzI2CQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI2X19HUElPM18yNgkJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjZfX1VBUlQyX1RYRF9NVVgJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDIsIDB4ODgwLCAwLCAwKQorI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNl9fVUFSVDJfVFhEX01VWAkJSU9NVVhfUEFEKDB4NDhDLCAweDE0NCwgMiwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNl9fRklSSV9SWEQJCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCAzLCAweDgwQywgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjZfX0lQVV9DU0kwX0RfMQkJSU9NVVhfUEFEKDB4NDhDLCAweDE0NCwgNCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNl9fSVBVX0RJMV9QSU4xMQkJSU9NVVhfUEFEKDB4NDhDLCAweDE0NCwgNSwgMHgwLCAwLCAwKQpAQCAtNTU3LDEwICs1NTcsMTAgQEAKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjdfX0lQVV9ESVNQMV9EQVRfMjMJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDcsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjhfX0VNSV9XRUlNX0RfMjgJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDAsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjhfX0dQSU8zXzI4CQkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOF9fVUFSVDJfQ1RTCQkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgMiwgMHg4N0MsIDAsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI4X19VQVJUMl9DVFMJCQlJT01VWF9QQUQoMHg0OTQsIDB4MTRDLCAyLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI4X19JUFVfRElTUEIwX1NFUl9ESU8JSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgMywgMHg4MkMsIDEsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI4X19DU1BJX01PU0kJCQlJT01VWF9QQUQoMHg0OTQsIDB4MTRDLCA0LCAweDc4OCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjhfX0kyQzFfU0RBCQkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgNSwgMHg4MTgsIDEsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI4X19JMkMxX1NEQQkJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MTgsIDEsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI4X19JUFVfRVhUX1RSSUcJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDYsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjhfX0lQVV9ESTBfUElOMTMJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDcsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjlfX0VNSV9XRUlNX0RfMjkJCUlPTVVYX1BBRCgweDQ5OCwgMHgxNTAsIDAsIDB4MCwgMCwgMCkKQEAgLTU3Myw3ICs1NzMsNyBAQAogI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJMF9QSU4xNAkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgNywgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMF9fRU1JX1dFSU1fRF8zMAkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgMCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMF9fR1BJTzNfMzAJCQlJT01VWF9QQUQoMHg0OUMsIDB4MTU0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMwX19VQVJUM19DVFMJCQlJT01VWF9QQUQoMHg0OUMsIDB4MTU0LCAyLCAweDg4NCwgMiwgMCkKKyNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMzBfX1VBUlQzX0NUUwkJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDIsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMzBfX0lQVV9DU0kwX0RfMwkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgMywgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMF9fSVBVX0RJMF9QSU4xMQkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgNCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMF9fSVBVX0RJU1AxX0RBVF8yMQkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgNSwgMHgwLCAwLCAwKQpAQCAtNjk3LDcgKzY5Nyw3IEBACiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE1X19HUElPM181CQkJSU9NVVhfUEFEKDB4NTAwLCAweDFCMCwgMSwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNV9fSVBVX0RJU1AxX0RBVF80CQlJT01VWF9QQUQoMHg1MDAsIDB4MUIwLCAzLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE1X19JUFVfQ1NJMV9EXzQJCUlPTVVYX1BBRCgweDUwMCwgMHgxQjAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTVfX1NSQ19CVF9DRkczXzYJCUlPTVVYX1BBRCgweDUwMCwgMHgxQjAsIDE3LCAweDAsIDAsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE1X19TUkNfQlRfQ0ZHM182CQlJT01VWF9QQUQoMHg1MDAsIDB4MUIwLCA3IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTZfX0VNSV9OQU5EX1dFSU1fREFfNglJT01VWF9QQUQoMHg1MDQsIDB4MUI0LCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE2X19HUElPM182CQkJSU9NVVhfUEFEKDB4NTA0LCAweDFCNCwgMSwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNl9fSVBVX0RJU1AxX0RBVF8zCQlJT01VWF9QQUQoMHg1MDQsIDB4MUI0LCAzLCAweDAsIDAsIDApCkBAIC04NTksNyArODU5LDcgQEAKICNkZWZpbmUgX01YNTNfUEFEX0ZFQ19NRENfX1VTQlBIWTJfREFUQU9VVF8xCUlPTVVYX1BBRCgweDVFOCwgMHgyNkMsIDcsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRElPV19fUEFUQV9ESU9XCQlJT01VWF9QQUQoMHg1RjAsIDB4MjcwLCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RJT1dfX0dQSU82XzE3CQlJT01VWF9QQUQoMHg1RjAsIDB4MjcwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RJT1dfX1VBUlQxX1RYRF9NVVgJSU9NVVhfUEFEKDB4NUYwLCAweDI3MCwgMywgMHg4NzgsIDIsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RJT1dfX1VBUlQxX1RYRF9NVVgJSU9NVVhfUEFEKDB4NUYwLCAweDI3MCwgMywgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfUEFUQV9ESU9XX19VU0JQSFkyX0RBVEFPVVRfMglJT01VWF9QQUQoMHg1RjAsIDB4MjcwLCA3LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQUNLX19QQVRBX0RNQUNLCQlJT01VWF9QQUQoMHg1RjQsIDB4Mjc0LCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQUNLX19HUElPNl8xOAkJSU9NVVhfUEFEKDB4NUY0LCAweDI3NCwgMSwgMHgwLCAwLCAwKQpAQCAtODY3LDcgKzg2Nyw3IEBACiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQUNLX19VU0JQSFkyX0RBVEFPVVRfMwlJT01VWF9QQUQoMHg1RjQsIDB4Mjc0LCA3LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQVJRX19QQVRBX0RNQVJRCQlJT01VWF9QQUQoMHg1RjgsIDB4Mjc4LCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQVJRX19HUElPN18wCQlJT01VWF9QQUQoMHg1RjgsIDB4Mjc4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQVJRX19VQVJUMl9UWERfTVVYCUlPTVVYX1BBRCgweDVGOCwgMHgyNzgsIDMsIDB4ODgwLCAyLCAwKQorI2RlZmluZSBfTVg1M19QQURfUEFUQV9ETUFSUV9fVUFSVDJfVFhEX01VWAlJT01VWF9QQUQoMHg1RjgsIDB4Mjc4LCAzLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQVJRX19DQ01fQ0NNX09VVF8wCUlPTVVYX1BBRCgweDVGOCwgMHgyNzgsIDUsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRE1BUlFfX1VTQlBIWTJfREFUQU9VVF80CUlPTVVYX1BBRCgweDVGOCwgMHgyNzgsIDcsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19QQVRBX0JVRkZFUl9FTglJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCAwLCAweDAsIDAsIDApCkBAIC04NzcsNyArODc3LDcgQEAKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19VU0JQSFkyX0RBVEFPVVRfNQlJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCA3LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lOVFJRX19QQVRBX0lOVFJRCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lOVFJRX19HUElPN18yCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lOVFJRX19VQVJUMl9DVFMJCUlPTVVYX1BBRCgweDYwMCwgMHgyODAsIDMsIDB4ODdDLCAyLCAwKQorI2RlZmluZSBfTVg1M19QQURfUEFUQV9JTlRSUV9fVUFSVDJfQ1RTCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCAzLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lOVFJRX19DQU4xX1RYQ0FOCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCA0LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lOVFJRX19DQ01fQ0NNX09VVF8yCUlPTVVYX1BBRCgweDYwMCwgMHgyODAsIDUsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfSU5UUlFfX1VTQlBIWTJfREFUQU9VVF82CUlPTVVYX1BBRCgweDYwMCwgMHgyODAsIDcsIDB4MCwgMCwgMCkKQEAgLTg4OSw3ICs4ODksNyBAQAogI2RlZmluZSBfTVg1M19QQURfUEFUQV9SRVNFVF9CX19QQVRBX1BBVEFfUkVTRVRfQglJT01VWF9QQUQoMHg2MDgsIDB4Mjg4LCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX0dQSU83XzQJCUlPTVVYX1BBRCgweDYwOCwgMHgyODgsIDEsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfUkVTRVRfQl9fRVNESEMzX0NNRAkJSU9NVVhfUEFEKDB4NjA4LCAweDI4OCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9SRVNFVF9CX19VQVJUMV9DVFMJCUlPTVVYX1BBRCgweDYwOCwgMHgyODgsIDMsIDB4ODc0LCAyLCAwKQorI2RlZmluZSBfTVg1M19QQURfUEFUQV9SRVNFVF9CX19VQVJUMV9DVFMJCUlPTVVYX1BBRCgweDYwOCwgMHgyODgsIDMsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfUkVTRVRfQl9fQ0FOMl9UWENBTgkJSU9NVVhfUEFEKDB4NjA4LCAweDI4OCwgNCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfUEFUQV9SRVNFVF9CX19VU0JQSFkxX0RBVEFPVVRfMAlJT01VWF9QQUQoMHg2MDgsIDB4Mjg4LCA3LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lPUkRZX19QQVRBX0lPUkRZCQlJT01VWF9QQUQoMHg2MEMsIDB4MjhDLCAwLCAweDAsIDAsIDApCkBAIC05MDYsNyArOTA2LDcgQEAKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMV9fUEFUQV9EQV8xCQlJT01VWF9QQUQoMHg2MTQsIDB4Mjk0LCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBXzFfX0dQSU83XzcJCUlPTVVYX1BBRCgweDYxNCwgMHgyOTQsIDEsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMV9fRVNESEM0X0NNRAkJSU9NVVhfUEFEKDB4NjE0LCAweDI5NCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8xX19VQVJUM19DVFMJCUlPTVVYX1BBRCgweDYxNCwgMHgyOTQsIDQsIDB4ODg0LCA0LCAwKQorI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8xX19VQVJUM19DVFMJCUlPTVVYX1BBRCgweDYxNCwgMHgyOTQsIDQsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMV9fVVNCUEhZMV9EQVRBT1VUXzMJSU9NVVhfUEFEKDB4NjE0LCAweDI5NCwgNywgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8yX19QQVRBX0RBXzIJCUlPTVVYX1BBRCgweDYxOCwgMHgyOTgsIDAsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMl9fR1BJTzdfOAkJSU9NVVhfUEFEKDB4NjE4LCAweDI5OCwgMSwgMHgwLCAwLCAwKQpAQCAtOTE1LDcgKzkxNSw3IEBACiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBXzJfX1VTQlBIWTFfREFUQU9VVF80CUlPTVVYX1BBRCgweDYxOCwgMHgyOTgsIDcsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQ1NfMF9fUEFUQV9DU18wCQlJT01VWF9QQUQoMHg2MUMsIDB4MjlDLCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0NTXzBfX0dQSU83XzkJCQlJT01VWF9QQUQoMHg2MUMsIDB4MjlDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0NTXzBfX1VBUlQzX1RYRF9NVVgJCUlPTVVYX1BBRCgweDYxQywgMHgyOUMsIDQsIDB4ODg4LCAyLCAwKQorI2RlZmluZSBfTVg1M19QQURfUEFUQV9DU18wX19VQVJUM19UWERfTVVYCQlJT01VWF9QQUQoMHg2MUMsIDB4MjlDLCA0LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0NTXzBfX1VTQlBIWTFfREFUQU9VVF81CUlPTVVYX1BBRCgweDYxQywgMHgyOUMsIDcsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQ1NfMV9fUEFUQV9DU18xCQlJT01VWF9QQUQoMHg2MjAsIDB4MkEwLCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0NTXzFfX0dQSU83XzEwCQlJT01VWF9QQUQoMHg2MjAsIDB4MkEwLCAxLCAweDAsIDAsIDApCkBAIC05NTgsMTIgKzk1OCwxMiBAQAogI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNV9fRVNESEM0X0RBVDUJCUlPTVVYX1BBRCgweDYzQywgMHgyQjgsIDQsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTVfX0dQVTNkX0dQVV9ERUJVR19PVVRfNQlJT01VWF9QQUQoMHg2M0MsIDB4MkI4LCA1LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE1X19JUFVfRElBR19CVVNfNQlJT01VWF9QQUQoMHg2M0MsIDB4MkI4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE2X19QQVRBX0RBVEFfNglJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCAxLCAweDAsIDAsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE2X19QQVRBX0RBVEFfNglJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE2X19HUElPMl82CQlJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE2X19FTUlfTkFOREZfRF82CUlPTVVYX1BBRCgweDY0MCwgMHgyQkMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTZfX0VTREhDNF9EQVQ2CQlJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE2X19HUFUzZF9HUFVfREVCVUdfT1VUXzYJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNl9fSVBVX0RJQUdfQlVTXzYJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgMSwgMHgwLCAwLCAwKQorI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNl9fRU1JX05BTkRGX0RfNglJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCAzLCAweDAsIDAsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE2X19FU0RIQzRfREFUNgkJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgNCwgMHgwLCAwLCAwKQorI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNl9fR1BVM2RfR1BVX0RFQlVHX09VVF82CUlPTVVYX1BBRCgweDY0MCwgMHgyQkMsIDUsIDB4MCwgMCwgMCkKKyNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTZfX0lQVV9ESUFHX0JVU182CUlPTVVYX1BBRCgweDY0MCwgMHgyQkMsIDYsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTdfX1BBVEFfREFUQV83CQlJT01VWF9QQUQoMHg2NDQsIDB4MkMwLCAwLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE3X19HUElPMl83CQlJT01VWF9QQUQoMHg2NDQsIDB4MkMwLCAxLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE3X19FTUlfTkFOREZfRF83CUlPTVVYX1BBRCgweDY0NCwgMHgyQzAsIDMsIDB4MCwgMCwgMCkKQEAgLTExNjEsMTMgKzExNjEsMTMgQEAKICNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fQ0NNX0NMS08JCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDMsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fQ1NVX0NTVV9BTEFSTV9BVVRfMglJT01VWF9QQUQoMHg2QzAsIDB4MzMwLCA0LCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9HUElPXzVfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQ0CUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fSTJDM19TQ0wJCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDYsIDB4ODI0LCAyLCAwKQorI2RlZmluZSBfTVg1M19QQURfR1BJT181X19JMkMzX1NDTAkJSU9NVVhfUEFEKDB4NkMwLCAweDMzMCwgNiB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyNCwgMiwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fQ0NNX1BMTDFfQllQCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDcsIDB4NzcwLCAxLCAwKQogI2RlZmluZSBfTVg1M19QQURfR1BJT183X19FU0FJMV9UWDRfUlgxCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDAsIDB4N0Y0LCAxLCAwKQogI2RlZmluZSBfTVg1M19QQURfR1BJT183X19HUElPMV83CQlJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCAxLCAweDAsIDAsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9HUElPXzdfX0VQSVQxX0VQSVRPCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDIsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0dQSU9fN19fQ0FOMV9UWENBTglJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzdfX1VBUlQyX1RYRF9NVVgJSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgNCwgMHg4ODAsIDQsIDApCisjZGVmaW5lIF9NWDUzX1BBRF9HUElPXzdfX1VBUlQyX1RYRF9NVVgJSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgNCwgMHgwLCAwLCAwKQogI2RlZmluZSBfTVg1M19QQURfR1BJT183X19GSVJJX1JYRAkJSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgNSwgMHg4MEMsIDEsIDApCiAjZGVmaW5lIF9NWDUzX1BBRF9HUElPXzdfX1NQRElGX1BMT0NLCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDYsIDB4MCwgMCwgMCkKICNkZWZpbmUgX01YNTNfUEFEX0dQSU9fN19fQ0NNX1BMTDJfQllQCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDcsIDB4Nzc0LCAxLCAwKQpAQCAtMTIxNCwyNyArMTIxNCwyNyBAQAogI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMF9fS1BQX0NPTF8wCQkoX01YNTNfUEFEX0tFWV9DT0wwX19LUFBfQ09MXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMF9fR1BJTzRfNgkJKF9NWDUzX1BBRF9LRVlfQ09MMF9fR1BJTzRfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19BVURNVVhfQVVENV9UWEMJCShfTVg1M19QQURfS0VZX0NPTDBfX0FVRE1VWF9BVUQ1X1RYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19VQVJUNF9UWERfTVVYCQkoX01YNTNfUEFEX0tFWV9DT0wwX19VQVJUNF9UWERfTVVYIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX1VBUlQ0X1RYRF9NVVgJCShfTVg1M19QQURfS0VZX0NPTDBfX1VBUlQ0X1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX0VDU1BJMV9TQ0xLCQkoX01YNTNfUEFEX0tFWV9DT0wwX19FQ1NQSTFfU0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19GRUNfUkRBVEFfMwkJKF9NWDUzX1BBRF9LRVlfQ09MMF9fRkVDX1JEQVRBXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMF9fU1JDX0FOWV9QVV9SU1QJCShfTVg1M19QQURfS0VZX0NPTDBfX1NSQ19BTllfUFVfUlNUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzBfX0tQUF9ST1dfMAkJKF9NWDUzX1BBRF9LRVlfUk9XMF9fS1BQX1JPV18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzBfX0dQSU80XzcJCShfTVg1M19QQURfS0VZX1JPVzBfX0dQSU80XzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMF9fQVVETVVYX0FVRDVfVFhECQkoX01YNTNfUEFEX0tFWV9ST1cwX19BVURNVVhfQVVENV9UWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMF9fVUFSVDRfUlhEX01VWAkJKF9NWDUzX1BBRF9LRVlfUk9XMF9fVUFSVDRfUlhEX01VWCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cwX19VQVJUNF9SWERfTVVYCQkoX01YNTNfUEFEX0tFWV9ST1cwX19VQVJUNF9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cwX19FQ1NQSTFfTU9TSQkJKF9NWDUzX1BBRF9LRVlfUk9XMF9fRUNTUEkxX01PU0kgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMF9fRkVDX1RYX0VSCQkoX01YNTNfUEFEX0tFWV9ST1cwX19GRUNfVFhfRVIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fS1BQX0NPTF8xCQkoX01YNTNfUEFEX0tFWV9DT0wxX19LUFBfQ09MXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fR1BJTzRfOAkJKF9NWDUzX1BBRF9LRVlfQ09MMV9fR1BJTzRfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wxX19BVURNVVhfQVVENV9UWEZTCQkoX01YNTNfUEFEX0tFWV9DT0wxX19BVURNVVhfQVVENV9UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDFfX1VBUlQ1X1RYRF9NVVgJCShfTVg1M19QQURfS0VZX0NPTDFfX1VBUlQ1X1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fVUFSVDVfVFhEX01VWAkJKF9NWDUzX1BBRF9LRVlfQ09MMV9fVUFSVDVfVFhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fRUNTUEkxX01JU08JCShfTVg1M19QQURfS0VZX0NPTDFfX0VDU1BJMV9NSVNPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDFfX0ZFQ19SWF9DTEsJCShfTVg1M19QQURfS0VZX0NPTDFfX0ZFQ19SWF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fVVNCUEhZMV9UWFJFQURZCQkoX01YNTNfUEFEX0tFWV9DT0wxX19VU0JQSFkxX1RYUkVBRFkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fS1BQX1JPV18xCQkoX01YNTNfUEFEX0tFWV9ST1cxX19LUFBfUk9XXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fR1BJTzRfOQkJKF9NWDUzX1BBRF9LRVlfUk9XMV9fR1BJTzRfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19BVURNVVhfQVVENV9SWEQJCShfTVg1M19QQURfS0VZX1JPVzFfX0FVRE1VWF9BVUQ1X1JYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19VQVJUNV9SWERfTVVYCQkoX01YNTNfUEFEX0tFWV9ST1cxX19VQVJUNV9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzFfX1VBUlQ1X1JYRF9NVVgJCShfTVg1M19QQURfS0VZX1JPVzFfX1VBUlQ1X1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzFfX0VDU1BJMV9TUzAJCShfTVg1M19QQURfS0VZX1JPVzFfX0VDU1BJMV9TUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fRkVDX0NPTAkJKF9NWDUzX1BBRF9LRVlfUk9XMV9fRkVDX0NPTCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19VU0JQSFkxX1JYVkFMSUQJCShfTVg1M19QQURfS0VZX1JPVzFfX1VTQlBIWTFfUlhWQUxJRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCkBAIC0xMjcyLDE0ICsxMjcyLDE0IEBACiAjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19HUElPNF8xNAkJKF9NWDUzX1BBRF9LRVlfQ09MNF9fR1BJTzRfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fQ0FOMl9UWENBTgkJKF9NWDUzX1BBRF9LRVlfQ09MNF9fQ0FOMl9UWENBTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19JUFVfU0lTR180CQkoX01YNTNfUEFEX0tFWV9DT0w0X19JUFVfU0lTR180IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDRfX1VBUlQ1X1JUUwkJKF9NWDUzX1BBRF9LRVlfQ09MNF9fVUFSVDVfUlRTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDRfX1VBUlQ1X1JUUwkJKF9NWDUzX1BBRF9LRVlfQ09MNF9fVUFSVDVfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19VU0JPSDNfVVNCT1RHX09DCQkoX01YNTNfUEFEX0tFWV9DT0w0X19VU0JPSDNfVVNCT1RHX09DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDRfX1VTQlBIWTFfTElORVNUQVRFXzEJCShfTVg1M19QQURfS0VZX0NPTDRfX1VTQlBIWTFfTElORVNUQVRFXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fS1BQX1JPV180CQkoX01YNTNfUEFEX0tFWV9ST1c0X19LUFBfUk9XXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fR1BJTzRfMTUJCShfTVg1M19QQURfS0VZX1JPVzRfX0dQSU80XzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzRfX0NBTjJfUlhDQU4JCShfTVg1M19QQURfS0VZX1JPVzRfX0NBTjJfUlhDQU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fSVBVX1NJU0dfNQkJKF9NWDUzX1BBRF9LRVlfUk9XNF9fSVBVX1NJU0dfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1c0X19VQVJUNV9DVFMJCShfTVg1M19QQURfS0VZX1JPVzRfX1VBUlQ1X0NUUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1c0X19VQVJUNV9DVFMJCShfTVg1M19QQURfS0VZX1JPVzRfX1VBUlQ1X0NUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fVVNCT0gzX1VTQk9UR19QV1IJCShfTVg1M19QQURfS0VZX1JPVzRfX1VTQk9IM19VU0JPVEdfUFdSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzRfX1VTQlBIWTFfVkJVU1ZBTElECQkoX01YNTNfUEFEX0tFWV9ST1c0X19VU0JQSFkxX1ZCVVNWQUxJRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0RJMF9ESVNQX0NMS19fSVBVX0RJMF9ESVNQX0NMSwkJKF9NWDUzX1BBRF9ESTBfRElTUF9DTEtfX0lQVV9ESTBfRElTUF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQpAQCAtMTU2NSw1NiArMTU2NSw1NiBAQAogI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDExX19UUElVX1RSQUNFXzgJCShfTVg1M19QQURfQ1NJMF9EQVQxMV9fVFBJVV9UUkFDRV84IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fSVBVX0NTSTBfRF8xMgkJKF9NWDUzX1BBRF9DU0kwX0RBVDEyX19JUFVfQ1NJMF9EXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fR1BJTzVfMzAJCShfTVg1M19QQURfQ1NJMF9EQVQxMl9fR1BJTzVfMzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEyX19VQVJUNF9UWERfTVVYCQkoX01YNTNfUEFEX0NTSTBfREFUMTJfX1VBUlQ0X1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEyX19VQVJUNF9UWERfTVVYCQkoX01YNTNfUEFEX0NTSTBfREFUMTJfX1VBUlQ0X1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fVVNCT0gzX1VTQkgzX0RBVEFfMAkJKF9NWDUzX1BBRF9DU0kwX0RBVDEyX19VU0JPSDNfVVNCSDNfREFUQV8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fU0RNQV9ERUJVR19QQ182CQkoX01YNTNfUEFEX0NTSTBfREFUMTJfX1NETUFfREVCVUdfUENfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX0VNSV9FTUlfREVCVUdfNDEJCShfTVg1M19QQURfQ1NJMF9EQVQxMl9fRU1JX0VNSV9ERUJVR180MSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX1RQSVVfVFJBQ0VfOQkJKF9NWDUzX1BBRF9DU0kwX0RBVDEyX19UUElVX1RSQUNFXzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19JUFVfQ1NJMF9EXzEzCQkoX01YNTNfUEFEX0NTSTBfREFUMTNfX0lQVV9DU0kwX0RfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19HUElPNV8zMQkJKF9NWDUzX1BBRF9DU0kwX0RBVDEzX19HUElPNV8zMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTNfX1VBUlQ0X1JYRF9NVVgJCShfTVg1M19QQURfQ1NJMF9EQVQxM19fVUFSVDRfUlhEX01VWCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTNfX1VBUlQ0X1JYRF9NVVgJCShfTVg1M19QQURfQ1NJMF9EQVQxM19fVUFSVDRfUlhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19VU0JPSDNfVVNCSDNfREFUQV8xCQkoX01YNTNfUEFEX0NTSTBfREFUMTNfX1VTQk9IM19VU0JIM19EQVRBXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19TRE1BX0RFQlVHX1BDXzcJCShfTVg1M19QQURfQ1NJMF9EQVQxM19fU0RNQV9ERUJVR19QQ183IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fRU1JX0VNSV9ERUJVR180MgkJKF9NWDUzX1BBRF9DU0kwX0RBVDEzX19FTUlfRU1JX0RFQlVHXzQyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fVFBJVV9UUkFDRV8xMAkJKF9NWDUzX1BBRF9DU0kwX0RBVDEzX19UUElVX1RSQUNFXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fSVBVX0NTSTBfRF8xNAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE0X19JUFVfQ1NJMF9EXzE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fR1BJTzZfMAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE0X19HUElPNl8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fVUFSVDVfVFhEX01VWAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE0X19VQVJUNV9UWERfTVVYIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fVUFSVDVfVFhEX01VWAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE0X19VQVJUNV9UWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTRfX1VTQk9IM19VU0JIM19EQVRBXzIJCShfTVg1M19QQURfQ1NJMF9EQVQxNF9fVVNCT0gzX1VTQkgzX0RBVEFfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTRfX1NETUFfREVCVUdfUENfOAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE0X19TRE1BX0RFQlVHX1BDXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19FTUlfRU1JX0RFQlVHXzQzCQkoX01YNTNfUEFEX0NTSTBfREFUMTRfX0VNSV9FTUlfREVCVUdfNDMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19UUElVX1RSQUNFXzExCQkoX01YNTNfUEFEX0NTSTBfREFUMTRfX1RQSVVfVFJBQ0VfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19JUFVfQ1NJMF9EXzE1CQkoX01YNTNfUEFEX0NTSTBfREFUMTVfX0lQVV9DU0kwX0RfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19HUElPNl8xCQkoX01YNTNfUEFEX0NTSTBfREFUMTVfX0dQSU82XzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19VQVJUNV9SWERfTVVYCQkoX01YNTNfUEFEX0NTSTBfREFUMTVfX1VBUlQ1X1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19VQVJUNV9SWERfTVVYCQkoX01YNTNfUEFEX0NTSTBfREFUMTVfX1VBUlQ1X1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNV9fVVNCT0gzX1VTQkgzX0RBVEFfMwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE1X19VU0JPSDNfVVNCSDNfREFUQV8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNV9fU0RNQV9ERUJVR19QQ185CQkoX01YNTNfUEFEX0NTSTBfREFUMTVfX1NETUFfREVCVUdfUENfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX0VNSV9FTUlfREVCVUdfNDQJCShfTVg1M19QQURfQ1NJMF9EQVQxNV9fRU1JX0VNSV9ERUJVR180NCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX1RQSVVfVFJBQ0VfMTIJCShfTVg1M19QQURfQ1NJMF9EQVQxNV9fVFBJVV9UUkFDRV8xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX0lQVV9DU0kwX0RfMTYJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fSVBVX0NTSTBfRF8xNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX0dQSU82XzIJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fR1BJTzZfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX1VBUlQ0X1JUUwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE2X19VQVJUNF9SVFMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE2X19VQVJUNF9SVFMJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fVUFSVDRfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX1VTQk9IM19VU0JIM19EQVRBXzQJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fVVNCT0gzX1VTQkgzX0RBVEFfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX1NETUFfREVCVUdfUENfMTAJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fU0RNQV9ERUJVR19QQ18xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX0VNSV9FTUlfREVCVUdfNDUJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fRU1JX0VNSV9ERUJVR180NSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX1RQSVVfVFJBQ0VfMTMJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fVFBJVV9UUkFDRV8xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX0lQVV9DU0kwX0RfMTcJCShfTVg1M19QQURfQ1NJMF9EQVQxN19fSVBVX0NTSTBfRF8xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX0dQSU82XzMJCShfTVg1M19QQURfQ1NJMF9EQVQxN19fR1BJTzZfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX1VBUlQ0X0NUUwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE3X19VQVJUNF9DVFMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE3X19VQVJUNF9DVFMJCShfTVg1M19QQURfQ1NJMF9EQVQxN19fVUFSVDRfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX1VTQk9IM19VU0JIM19EQVRBXzUJCShfTVg1M19QQURfQ1NJMF9EQVQxN19fVVNCT0gzX1VTQkgzX0RBVEFfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX1NETUFfREVCVUdfUENfMTEJCShfTVg1M19QQURfQ1NJMF9EQVQxN19fU0RNQV9ERUJVR19QQ18xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX0VNSV9FTUlfREVCVUdfNDYJCShfTVg1M19QQURfQ1NJMF9EQVQxN19fRU1JX0VNSV9ERUJVR180NiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX1RQSVVfVFJBQ0VfMTQJCShfTVg1M19QQURfQ1NJMF9EQVQxN19fVFBJVV9UUkFDRV8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX0lQVV9DU0kwX0RfMTgJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fSVBVX0NTSTBfRF8xOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX0dQSU82XzQJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fR1BJTzZfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX1VBUlQ1X1JUUwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE4X19VQVJUNV9SVFMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19VQVJUNV9SVFMJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fVUFSVDVfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX1VTQk9IM19VU0JIM19EQVRBXzYJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fVVNCT0gzX1VTQkgzX0RBVEFfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX1NETUFfREVCVUdfUENfMTIJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fU0RNQV9ERUJVR19QQ18xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX0VNSV9FTUlfREVCVUdfNDcJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fRU1JX0VNSV9ERUJVR180NyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX1RQSVVfVFJBQ0VfMTUJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fVFBJVV9UUkFDRV8xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX0lQVV9DU0kwX0RfMTkJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fSVBVX0NTSTBfRF8xOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX0dQSU82XzUJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fR1BJTzZfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX1VBUlQ1X0NUUwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE5X19VQVJUNV9DVFMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE5X19VQVJUNV9DVFMJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fVUFSVDVfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX1VTQk9IM19VU0JIM19EQVRBXzcJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fVVNCT0gzX1VTQkgzX0RBVEFfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX1NETUFfREVCVUdfUENfMTMJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fU0RNQV9ERUJVR19QQ18xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX0VNSV9FTUlfREVCVUdfNDgJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fRU1JX0VNSV9ERUJVR180OCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCkBAIC0xNjU3LDcgKzE2NTcsNyBAQAogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE5X19JUFVfRElTUEIxX1NFUl9SUwkJKF9NWDUzX1BBRF9FSU1fRDE5X19JUFVfRElTUEIxX1NFUl9SUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX0VDU1BJMV9TUzEJCShfTVg1M19QQURfRUlNX0QxOV9fRUNTUEkxX1NTMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX0VQSVQxX0VQSVRPCQkoX01YNTNfUEFEX0VJTV9EMTlfX0VQSVQxX0VQSVRPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fVUFSVDFfQ1RTCQkoX01YNTNfUEFEX0VJTV9EMTlfX1VBUlQxX0NUUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX1VBUlQxX0NUUwkJKF9NWDUzX1BBRF9FSU1fRDE5X19VQVJUMV9DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fVVNCT0gzX1VTQkgyX09DCQkoX01YNTNfUEFEX0VJTV9EMTlfX1VTQk9IM19VU0JIMl9PQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0VNSV9XRUlNX0RfMjAJCShfTVg1M19QQURfRUlNX0QyMF9fRU1JX1dFSU1fRF8yMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0dQSU8zXzIwCQkoX01YNTNfUEFEX0VJTV9EMjBfX0dQSU8zXzIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKQEAgLTE2NjUsNyArMTY2NSw3IEBACiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0lQVV9TRVJfRElTUDBfQ1MJCShfTVg1M19QQURfRUlNX0QyMF9fSVBVX1NFUl9ESVNQMF9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0NTUElfU1MwCQkoX01YNTNfUEFEX0VJTV9EMjBfX0NTUElfU1MwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fRVBJVDJfRVBJVE8JCShfTVg1M19QQURfRUlNX0QyMF9fRVBJVDJfRVBJVE8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIwX19VQVJUMV9SVFMJCShfTVg1M19QQURfRUlNX0QyMF9fVUFSVDFfUlRTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fVUFSVDFfUlRTCQkoX01YNTNfUEFEX0VJTV9EMjBfX1VBUlQxX1JUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIwX19VU0JPSDNfVVNCSDJfUFdSCQkoX01YNTNfUEFEX0VJTV9EMjBfX1VTQk9IM19VU0JIMl9QV1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIxX19FTUlfV0VJTV9EXzIxCQkoX01YNTNfUEFEX0VJTV9EMjFfX0VNSV9XRUlNX0RfMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIxX19HUElPM18yMQkJKF9NWDUzX1BBRF9FSU1fRDIxX19HUElPM18yMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCkBAIC0xNjgyLDcgKzE2ODIsNyBAQAogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIyX19VU0JPSDNfVVNCT1RHX1BXUgkJKF9NWDUzX1BBRF9FSU1fRDIyX19VU0JPSDNfVVNCT1RHX1BXUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX0VNSV9XRUlNX0RfMjMJCShfTVg1M19QQURfRUlNX0QyM19fRU1JX1dFSU1fRF8yMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX0dQSU8zXzIzCQkoX01YNTNfUEFEX0VJTV9EMjNfX0dQSU8zXzIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fVUFSVDNfQ1RTCQkoX01YNTNfUEFEX0VJTV9EMjNfX1VBUlQzX0NUUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX1VBUlQzX0NUUwkJKF9NWDUzX1BBRF9FSU1fRDIzX19VQVJUM19DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fVUFSVDFfRENECQkoX01YNTNfUEFEX0VJTV9EMjNfX1VBUlQxX0RDRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTBfRDBfQ1MJCShfTVg1M19QQURfRUlNX0QyM19fSVBVX0RJMF9EMF9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTFfUElOMgkJKF9NWDUzX1BBRF9FSU1fRDIzX19JUFVfREkxX1BJTjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQpAQCAtMTY5MCwxNCArMTY5MCwxNCBAQAogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19JUFVfREkxX1BJTjE0CQkoX01YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTFfUElOMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19FTUlfV0VJTV9FQl8zCQkoX01YNTNfUEFEX0VJTV9FQjNfX0VNSV9XRUlNX0VCXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19HUElPMl8zMQkJKF9NWDUzX1BBRF9FSU1fRUIzX19HUElPMl8zMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjNfX1VBUlQzX1JUUwkJKF9NWDUzX1BBRF9FSU1fRUIzX19VQVJUM19SVFMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19VQVJUM19SVFMJCShfTVg1M19QQURfRUlNX0VCM19fVUFSVDNfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjNfX1VBUlQxX1JJCQkoX01YNTNfUEFEX0VJTV9FQjNfX1VBUlQxX1JJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fSVBVX0RJMV9QSU4zCQkoX01YNTNfUEFEX0VJTV9FQjNfX0lQVV9ESTFfUElOMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjNfX0lQVV9DU0kxX0hTWU5DCQkoX01YNTNfUEFEX0VJTV9FQjNfX0lQVV9DU0kxX0hTWU5DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fSVBVX0RJMV9QSU4xNgkJKF9NWDUzX1BBRF9FSU1fRUIzX19JUFVfREkxX1BJTjE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fRU1JX1dFSU1fRF8yNAkJKF9NWDUzX1BBRF9FSU1fRDI0X19FTUlfV0VJTV9EXzI0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fR1BJTzNfMjQJCShfTVg1M19QQURfRUlNX0QyNF9fR1BJTzNfMjQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19VQVJUM19UWERfTVVYCQkoX01YNTNfUEFEX0VJTV9EMjRfX1VBUlQzX1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19VQVJUM19UWERfTVVYCQkoX01YNTNfUEFEX0VJTV9EMjRfX1VBUlQzX1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fRUNTUEkxX1NTMgkJKF9NWDUzX1BBRF9FSU1fRDI0X19FQ1NQSTFfU1MyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fQ1NQSV9TUzIJCShfTVg1M19QQURfRUlNX0QyNF9fQ1NQSV9TUzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19BVURNVVhfQVVENV9SWEZTCQkoX01YNTNfUEFEX0VJTV9EMjRfX0FVRE1VWF9BVUQ1X1JYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQpAQCAtMTcwNSw3ICsxNzA1LDcgQEAKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fVUFSVDFfRFRSCQkoX01YNTNfUEFEX0VJTV9EMjRfX1VBUlQxX0RUUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX0VNSV9XRUlNX0RfMjUJCShfTVg1M19QQURfRUlNX0QyNV9fRU1JX1dFSU1fRF8yNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX0dQSU8zXzI1CQkoX01YNTNfUEFEX0VJTV9EMjVfX0dQSU8zXzI1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fVUFSVDNfUlhEX01VWAkJKF9NWDUzX1BBRF9FSU1fRDI1X19VQVJUM19SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fVUFSVDNfUlhEX01VWAkJKF9NWDUzX1BBRF9FSU1fRDI1X19VQVJUM19SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX0VDU1BJMV9TUzMJCShfTVg1M19QQURfRUlNX0QyNV9fRUNTUEkxX1NTMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX0NTUElfU1MzCQkoX01YNTNfUEFEX0VJTV9EMjVfX0NTUElfU1MzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fQVVETVVYX0FVRDVfUlhDCQkoX01YNTNfUEFEX0VJTV9EMjVfX0FVRE1VWF9BVUQ1X1JYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCkBAIC0xNzEzLDcgKzE3MTMsNyBAQAogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19VQVJUMV9EU1IJCShfTVg1M19QQURfRUlNX0QyNV9fVUFSVDFfRFNSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fRU1JX1dFSU1fRF8yNgkJKF9NWDUzX1BBRF9FSU1fRDI2X19FTUlfV0VJTV9EXzI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fR1BJTzNfMjYJCShfTVg1M19QQURfRUlNX0QyNl9fR1BJTzNfMjYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI2X19VQVJUMl9UWERfTVVYCQkoX01YNTNfUEFEX0VJTV9EMjZfX1VBUlQyX1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI2X19VQVJUMl9UWERfTVVYCQkoX01YNTNfUEFEX0VJTV9EMjZfX1VBUlQyX1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fRklSSV9SWEQJCShfTVg1M19QQURfRUlNX0QyNl9fRklSSV9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI2X19JUFVfQ1NJMF9EXzEJCShfTVg1M19QQURfRUlNX0QyNl9fSVBVX0NTSTBfRF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fSVBVX0RJMV9QSU4xMQkJKF9NWDUzX1BBRF9FSU1fRDI2X19JUFVfREkxX1BJTjExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKQEAgLTE3MjEsNyArMTcyMSw3IEBACiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjZfX0lQVV9ESVNQMV9EQVRfMjIJCShfTVg1M19QQURfRUlNX0QyNl9fSVBVX0RJU1AxX0RBVF8yMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0VNSV9XRUlNX0RfMjcJCShfTVg1M19QQURfRUlNX0QyN19fRU1JX1dFSU1fRF8yNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0dQSU8zXzI3CQkoX01YNTNfUEFEX0VJTV9EMjdfX0dQSU8zXzI3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fVUFSVDJfUlhEX01VWAkJKF9NWDUzX1BBRF9FSU1fRDI3X19VQVJUMl9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fVUFSVDJfUlhEX01VWAkJKF9NWDUzX1BBRF9FSU1fRDI3X19VQVJUMl9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0ZJUklfVFhECQkoX01YNTNfUEFEX0VJTV9EMjdfX0ZJUklfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fSVBVX0NTSTBfRF8wCQkoX01YNTNfUEFEX0VJTV9EMjdfX0lQVV9DU0kwX0RfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0lQVV9ESTFfUElOMTMJCShfTVg1M19QQURfRUlNX0QyN19fSVBVX0RJMV9QSU4xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCkBAIC0xNzI5LDcgKzE3MjksNyBAQAogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI3X19JUFVfRElTUDFfREFUXzIzCQkoX01YNTNfUEFEX0VJTV9EMjdfX0lQVV9ESVNQMV9EQVRfMjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19FTUlfV0VJTV9EXzI4CQkoX01YNTNfUEFEX0VJTV9EMjhfX0VNSV9XRUlNX0RfMjggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19HUElPM18yOAkJKF9NWDUzX1BBRF9FSU1fRDI4X19HUElPM18yOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX1VBUlQyX0NUUwkJKF9NWDUzX1BBRF9FSU1fRDI4X19VQVJUMl9DVFMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19VQVJUMl9DVFMJCShfTVg1M19QQURfRUlNX0QyOF9fVUFSVDJfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0lQVV9ESVNQQjBfU0VSX0RJTwkJKF9NWDUzX1BBRF9FSU1fRDI4X19JUFVfRElTUEIwX1NFUl9ESU8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19DU1BJX01PU0kJCShfTVg1M19QQURfRUlNX0QyOF9fQ1NQSV9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fSTJDMV9TREEJCShfTVg1M19QQURfRUlNX0QyOF9fSTJDMV9TREEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQpAQCAtMTczNyw3ICsxNzM3LDcgQEAKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fSVBVX0RJMF9QSU4xMwkJKF9NWDUzX1BBRF9FSU1fRDI4X19JUFVfREkwX1BJTjEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fRU1JX1dFSU1fRF8yOQkJKF9NWDUzX1BBRF9FSU1fRDI5X19FTUlfV0VJTV9EXzI5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fR1BJTzNfMjkJCShfTVg1M19QQURfRUlNX0QyOV9fR1BJTzNfMjkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19VQVJUMl9SVFMJCShfTVg1M19QQURfRUlNX0QyOV9fVUFSVDJfUlRTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fVUFSVDJfUlRTCQkoX01YNTNfUEFEX0VJTV9EMjlfX1VBUlQyX1JUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19JUFVfRElTUEIwX1NFUl9SUwkJKF9NWDUzX1BBRF9FSU1fRDI5X19JUFVfRElTUEIwX1NFUl9SUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX0NTUElfU1MwCQkoX01YNTNfUEFEX0VJTV9EMjlfX0NTUElfU1MwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJMV9QSU4xNQkJKF9NWDUzX1BBRF9FSU1fRDI5X19JUFVfREkxX1BJTjE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKQEAgLTE3NDUsNyArMTc0NSw3IEBACiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX0lQVV9ESTBfUElOMTQJCShfTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJMF9QSU4xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX0VNSV9XRUlNX0RfMzAJCShfTVg1M19QQURfRUlNX0QzMF9fRU1JX1dFSU1fRF8zMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX0dQSU8zXzMwCQkoX01YNTNfUEFEX0VJTV9EMzBfX0dQSU8zXzMwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fVUFSVDNfQ1RTCQkoX01YNTNfUEFEX0VJTV9EMzBfX1VBUlQzX0NUUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX1VBUlQzX0NUUwkJKF9NWDUzX1BBRF9FSU1fRDMwX19VQVJUM19DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fSVBVX0NTSTBfRF8zCQkoX01YNTNfUEFEX0VJTV9EMzBfX0lQVV9DU0kwX0RfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX0lQVV9ESTBfUElOMTEJCShfTVg1M19QQURfRUlNX0QzMF9fSVBVX0RJMF9QSU4xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX0lQVV9ESVNQMV9EQVRfMjEJCShfTVg1M19QQURfRUlNX0QzMF9fSVBVX0RJU1AxX0RBVF8yMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCkBAIC0xNzUzLDcgKzE3NTMsNyBAQAogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19VU0JPSDNfVVNCSDJfT0MJCShfTVg1M19QQURfRUlNX0QzMF9fVVNCT0gzX1VTQkgyX09DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fRU1JX1dFSU1fRF8zMQkJKF9NWDUzX1BBRF9FSU1fRDMxX19FTUlfV0VJTV9EXzMxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fR1BJTzNfMzEJCShfTVg1M19QQURfRUlNX0QzMV9fR1BJTzNfMzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19VQVJUM19SVFMJCShfTVg1M19QQURfRUlNX0QzMV9fVUFSVDNfUlRTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fVUFSVDNfUlRTCQkoX01YNTNfUEFEX0VJTV9EMzFfX1VBUlQzX1JUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19JUFVfQ1NJMF9EXzIJCShfTVg1M19QQURfRUlNX0QzMV9fSVBVX0NTSTBfRF8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fSVBVX0RJMF9QSU4xMgkJKF9NWDUzX1BBRF9FSU1fRDMxX19JUFVfREkwX1BJTjEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fSVBVX0RJU1AxX0RBVF8yMAkJKF9NWDUzX1BBRF9FSU1fRDMxX19JUFVfRElTUDFfREFUXzIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKQEAgLTIwNjEsMTMgKzIwNjEsMTMgQEAKICNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19QQVRBX1BBVEFfUkVTRVRfQgkJKF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1BBVEFfUEFUQV9SRVNFVF9CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19HUElPN180CQkoX01YNTNfUEFEX1BBVEFfUkVTRVRfQl9fR1BJTzdfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX1BBVEFfUkVTRVRfQl9fRVNESEMzX0NNRAkJKF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX0VTREhDM19DTUQgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19VQVJUMV9DVFMJCShfTVg1M19QQURfUEFUQV9SRVNFVF9CX19VQVJUMV9DVFMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1VBUlQxX0NUUwkJKF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1VBUlQxX0NUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9QQVRBX1JFU0VUX0JfX0NBTjJfVFhDQU4JCShfTVg1M19QQURfUEFUQV9SRVNFVF9CX19DQU4yX1RYQ0FOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19VU0JQSFkxX0RBVEFPVVRfMAkJKF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1VTQlBIWTFfREFUQU9VVF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fUEFUQV9JT1JEWQkJKF9NWDUzX1BBRF9QQVRBX0lPUkRZX19QQVRBX0lPUkRZIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fR1BJTzdfNQkJKF9NWDUzX1BBRF9QQVRBX0lPUkRZX19HUElPN181IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fRVNESEMzX0NMSwkJKF9NWDUzX1BBRF9QQVRBX0lPUkRZX19FU0RIQzNfQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX1VBUlQxX1JUUwkJKF9NWDUzX1BBRF9QQVRBX0lPUkRZX19VQVJUMV9SVFMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lPUkRZX19VQVJUMV9SVFMJCShfTVg1M19QQURfUEFUQV9JT1JEWV9fVUFSVDFfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX0NBTjJfUlhDQU4JCShfTVg1M19QQURfUEFUQV9JT1JEWV9fQ0FOMl9SWENBTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX1VTQlBIWTFfREFUQU9VVF8xCQkoX01YNTNfUEFEX1BBVEFfSU9SRFlfX1VTQlBIWTFfREFUQU9VVF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8wX19QQVRBX0RBXzAJCShfTVg1M19QQURfUEFUQV9EQV8wX19QQVRBX0RBXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQpAQCAtMjMzOSw3ICsyMzM5LDcgQEAKICNkZWZpbmUgTVg1M19QQURfR1BJT183X19HUElPMV83CQkoX01YNTNfUEFEX0dQSU9fN19fR1BJTzFfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0dQSU9fN19fRVBJVDFfRVBJVE8JCShfTVg1M19QQURfR1BJT183X19FUElUMV9FUElUTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0dQSU9fN19fQ0FOMV9UWENBTgkJKF9NWDUzX1BBRF9HUElPXzdfX0NBTjFfVFhDQU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX1VBUlQyX1RYRF9NVVgJCShfTVg1M19QQURfR1BJT183X19VQVJUMl9UWERfTVVYIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKKyNkZWZpbmUgTVg1M19QQURfR1BJT183X19VQVJUMl9UWERfTVVYCQkoX01YNTNfUEFEX0dQSU9fN19fVUFSVDJfVFhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX0ZJUklfUlhECQkoX01YNTNfUEFEX0dQSU9fN19fRklSSV9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX1NQRElGX1BMT0NLCQkoX01YNTNfUEFEX0dQSU9fN19fU1BESUZfUExPQ0sgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQogI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX0NDTV9QTEwyX0JZUAkJKF9NWDUzX1BBRF9HUElPXzdfX0NDTV9QTEwyX0JZUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCkBAIC0yMzQ3LDcgKzIzNDcsNyBAQAogI2RlZmluZSBNWDUzX1BBRF9HUElPXzhfX0dQSU8xXzgJCShfTVg1M19QQURfR1BJT184X19HUElPMV84IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfR1BJT184X19FUElUMl9FUElUTwkJKF9NWDUzX1BBRF9HUElPXzhfX0VQSVQyX0VQSVRPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKICNkZWZpbmUgTVg1M19QQURfR1BJT184X19DQU4xX1JYQ0FOCQkoX01YNTNfUEFEX0dQSU9fOF9fQ0FOMV9SWENBTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fVUFSVDJfUlhEX01VWAkJKF9NWDUzX1BBRF9HUElPXzhfX1VBUlQyX1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzhfX1VBUlQyX1JYRF9NVVgJCShfTVg1M19QQURfR1BJT184X19VQVJUMl9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fRklSSV9UWEQJCShfTVg1M19QQURfR1BJT184X19GSVJJX1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fU1BESUZfU1JDTEsJCShfTVg1M19QQURfR1BJT184X19TUERJRl9TUkNMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCiAjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fQ0NNX1BMTDNfQllQCQkoX01YNTNfUEFEX0dQSU9fOF9fQ0NNX1BMTDNfQllQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC12MS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LXYxLmgKaW5kZXggYzA3ZDMwMi4uNmZhOGE3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LXYxLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LXYxLmgKQEAgLTg1LDkgKzg1LDYgQEAKICNkZWZpbmUgR1BJT19CT1VUXzAJKDIgPDwgR1BJT19CT1VUX1NISUZUKQogI2RlZmluZSBHUElPX0JPVVRfMQkoMyA8PCBHUElPX0JPVVRfU0hJRlQpCiAKLS8qIGRlY29kZSBpcnEgbnVtYmVyIHRvIHVzZSB3aXRoIElNUih4KSwgSVNSKHgpIGFuZCBmcmllbmRzICovCi0jZGVmaW5lIElSUV9UT19SRUcoaXJxKSAoKGlycSAtIE1YQ19JTlRFUk5BTF9JUlFTKSA+PiA1KQotCiAjZGVmaW5lIElSUV9HUElPQSh4KSAgKE1YQ19HUElPX0lSUV9TVEFSVCArIHgpCiAjZGVmaW5lIElSUV9HUElPQih4KSAgKElSUV9HUElPQSgzMikgKyB4KQogI2RlZmluZSBJUlFfR1BJT0MoeCkgIChJUlFfR1BJT0IoMzIpICsgeCkKQEAgLTk4LDcgKzk1LDYgQEAKIGV4dGVybiBpbnQgbXhjX2dwaW9fbW9kZShpbnQgZ3Bpb19tb2RlKTsKIGV4dGVybiBpbnQgbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhjb25zdCBpbnQgKnBpbl9saXN0LCB1bnNpZ25lZCBjb3VudCwKIAkJY29uc3QgY2hhciAqbGFiZWwpOwotZXh0ZXJuIHZvaWQgbXhjX2dwaW9fcmVsZWFzZV9tdWx0aXBsZV9waW5zKGNvbnN0IGludCAqcGluX2xpc3QsIGludCBjb3VudCk7CiAKIGV4dGVybiBpbnQgX19pbml0IGlteF9pb211eHYxX2luaXQodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgbnVtcG9ydHMpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtdjMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC12My5oCmluZGV4IDgyNjIwYWYuLmViYmNlMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC12My5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC12My5oCkBAIC02Niw3ICs2Niw2IEBACiAjZGVmaW5lIE1VWF9NT0RFX01BU0sJCSgoaW9tdXhfdjNfY2ZnX3QpMHgxZiA8PCBNVVhfTU9ERV9TSElGVCkKICNkZWZpbmUgTVVYX1BBRF9DVFJMX1NISUZUCTQxCiAjZGVmaW5lIE1VWF9QQURfQ1RSTF9NQVNLCSgoaW9tdXhfdjNfY2ZnX3QpMHgxZmZmZiA8PCBNVVhfUEFEX0NUUkxfU0hJRlQpCi0jZGVmaW5lIE5PX1BBRF9DVFJMCQkoKGlvbXV4X3YzX2NmZ190KTEgPDwgKE1VWF9QQURfQ1RSTF9TSElGVCArIDE2KSkKICNkZWZpbmUgTVVYX1NFTF9JTlBVVF9TSElGVAk1OAogI2RlZmluZSBNVVhfU0VMX0lOUFVUX01BU0sJKChpb211eF92M19jZmdfdCkweGYgPDwgTVVYX1NFTF9JTlBVVF9TSElGVCkKIApAQCAtODUsNiArODQsNyBAQAogICogVXNlIHRvIHNldCBQQUQgY29udHJvbAogICovCiAKKyNkZWZpbmUgTk9fUEFEX0NUUkwJCQkoMSA8PCAxNikKICNkZWZpbmUgUEFEX0NUTF9EVlMJCQkoMSA8PCAxMykKICNkZWZpbmUgUEFEX0NUTF9IWVMJCQkoMSA8PCA4KQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXguaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDIyNmQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBVd2UgS2xlaW5lLUtvZW5pZywgUGVuZ3V0cm9uaXgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0jaWZuZGVmIF9fTUFDSF9JT01VWF9IX18KLSNkZWZpbmUgX19NQUNIX0lPTVVYX0hfXwotCi0vKiBUaGlzIGZpbGUgd2lsbCBnbyBhd2F5LCBwbGVhc2UgaW5jbHVkZSBtYWNoL2lvbXV4LW14Li4uIGRpcmVjdGx5ICovCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9NWDEKLSNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MS5oPgotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVgyCi0jaW5jbHVkZSA8bWFjaC9pb211eC1teDJ4Lmg+Ci0jaWZkZWYgQ09ORklHX01BQ0hfTVgyMQotI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyMS5oPgotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01BQ0hfTVgyNwotI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyNy5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTUFDSF9JT01VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IDM1Yzg5YmMuLjAwZTgxMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtMTEsNiArMTEsOCBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19JUlFTX0hfXwogI2RlZmluZSBfX0FTTV9BUkNIX01YQ19JUlFTX0hfXwogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgorCiAvKgogICogU29DcyB3aXRoIFRaSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIgaGF2ZSAxMjggSVJRcywgdGhvc2Ugd2l0aCBBVklDIGhhdmUgNjQKICAqLwpAQCAtMjIsMzAgKzI0LDEzIEBACiAKICNkZWZpbmUgTVhDX0dQSU9fSVJRX1NUQVJUCU1YQ19JTlRFUk5BTF9JUlFTCiAKLS8qIHRoZXNlIGFyZSBvcmRlcmVkIGJ5IHNpemUgdG8gc3VwcG9ydCBtdWx0aS1Tb0Mga2VybmVscyAqLwotI2lmIGRlZmluZWQgQ09ORklHX1NPQ19JTVg1MwotI2RlZmluZSBNWENfR1BJT19JUlFTCQkoMzIgKiA3KQotI2VsaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDIKLSNkZWZpbmUgTVhDX0dQSU9fSVJRUwkJKDMyICogNikKLSNlbGlmIGRlZmluZWQgQ09ORklHX1NPQ19JTVg1MAotI2RlZmluZSBNWENfR1BJT19JUlFTCQkoMzIgKiA2KQotI2VsaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDEKLSNkZWZpbmUgTVhDX0dQSU9fSVJRUwkJKDMyICogNCkKLSNlbGlmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVgyNQotI2RlZmluZSBNWENfR1BJT19JUlFTCQkoMzIgKiA0KQotI2VsaWYgZGVmaW5lZCBDT05GSUdfU09DX0lNWDUxCi0jZGVmaW5lIE1YQ19HUElPX0lSUVMJCSgzMiAqIDQpCi0jZWxpZiBkZWZpbmVkIENPTkZJR19BUkNIX01YMwotI2RlZmluZSBNWENfR1BJT19JUlFTCQkoMzIgKiAzKQotI2VuZGlmCi0KIC8qCiAgKiBUaGUgbmV4dCAxNiBpbnRlcnJ1cHRzIGFyZSBmb3IgYm9hcmQgc3BlY2lmaWMgcHVycG9zZXMuICBTaW5jZQogICogdGhlIGtlcm5lbCBjYW4gb25seSBydW4gb24gb25lIG1hY2hpbmUgYXQgYSB0aW1lLCB3ZSBjYW4gcmUtdXNlCiAgKiB0aGVzZS4gIElmIHlvdSBuZWVkIG1vcmUsIGluY3JlYXNlIE1YQ19CT0FSRF9JUlFTLCBidXQga2VlcCBpdAogICogd2l0aGluIHNlbnNpYmxlIGxpbWl0cy4KICAqLwotI2RlZmluZSBNWENfQk9BUkRfSVJRX1NUQVJUCShNWENfSU5URVJOQUxfSVJRUyArIE1YQ19HUElPX0lSUVMpCisjZGVmaW5lIE1YQ19CT0FSRF9JUlFfU1RBUlQJKE1YQ19JTlRFUk5BTF9JUlFTICsgQVJDSF9OUl9HUElPUykKIAogI2lmZGVmIENPTkZJR19NQUNIX01YMzFBRFNfV00xMTMzX0VWMQogI2RlZmluZSBNWENfQk9BUkRfSVJRUyAgODAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDUzLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXg1My5oCmluZGV4IDlkMmExZWYuLjc0Y2QwOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDUzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214NTMuaApAQCAtMTQ1LDE0ICsxNDUsMTQgQEAKIC8qCiAgKiBNZW1vcnkgcmVnaW9ucyBhbmQgQ1MKICAqLwotI2RlZmluZSBNWDUzX0NTRDBfQkFTRV9BRERSCQkweDkwMDAwMDAwCi0jZGVmaW5lIE1YNTNfQ1NEMV9CQVNFX0FERFIJCTB4QTAwMDAwMDAKLSNkZWZpbmUgTVg1M19DUzBfQkFTRV9BRERSCQkweEIwMDAwMDAwCi0jZGVmaW5lIE1YNTNfQ1MxX0JBU0VfQUREUgkJMHhCODAwMDAwMAotI2RlZmluZSBNWDUzX0NTMl9CQVNFX0FERFIJCTB4QzAwMDAwMDAKLSNkZWZpbmUgTVg1M19DUzNfQkFTRV9BRERSCQkweEM4MDAwMDAwCi0jZGVmaW5lIE1YNTNfQ1M0X0JBU0VfQUREUgkJMHhDQzAwMDAwMAotI2RlZmluZSBNWDUzX0NTNV9CQVNFX0FERFIJCTB4Q0UwMDAwMDAKKyNkZWZpbmUgTVg1M19DU0QwX0JBU0VfQUREUgkJMHg3MDAwMDAwMAorI2RlZmluZSBNWDUzX0NTRDFfQkFTRV9BRERSCQkweEIwMDAwMDAwCisjZGVmaW5lIE1YNTNfQ1MwX0JBU0VfQUREUgkJMHhGMDAwMDAwMAorI2RlZmluZSBNWDUzX0NTMV8zMk1CX0JBU0VfQUREUgkweEYyMDAwMDAwCisjZGVmaW5lIE1YNTNfQ1MxXzY0TUJfQkFTRV9BRERSCQkweEY0MDAwMDAwCisjZGVmaW5lIE1YNTNfQ1MyXzY0TUJfQkFTRV9BRERSCQkweEY0MDAwMDAwCisjZGVmaW5lIE1YNTNfQ1MyXzk2TUJfQkFTRV9BRERSCQkweEY2MDAwMDAwCisjZGVmaW5lIE1YNTNfQ1MzX0JBU0VfQUREUgkJMHhGNjAwMDAwMAogCiAjZGVmaW5lIE1YNTNfSU9fUDJWKHgpCQkJSU1YX0lPX1AyVih4KQogI2RlZmluZSBNWDUzX0lPX0FERFJFU1MoeCkJCUlPTUVNKE1YNTNfSU9fUDJWKHgpKQpAQCAtMjMzLDcgKzIzMyw3IEBACiAjZGVmaW5lIE1YNTNfSU5UX0VTREhDMgkyCiAjZGVmaW5lIE1YNTNfSU5UX0VTREhDMwkzCiAjZGVmaW5lIE1YNTNfSU5UX0VTREhDNAk0Ci0jZGVmaW5lIE1YNTNfSU5UX1JFU1Y1CTUKKyNkZWZpbmUgTVg1M19JTlRfREFQCTUKICNkZWZpbmUgTVg1M19JTlRfU0RNQQk2CiAjZGVmaW5lIE1YNTNfSU5UX0lPTVVYCTcKICNkZWZpbmUgTVg1M19JTlRfTkZDCTgKQEAgLTI2Miw4ICsyNjIsOCBAQAogI2RlZmluZSBNWDUzX0lOVF9VQVJUMQkzMQogI2RlZmluZSBNWDUzX0lOVF9VQVJUMgkzMgogI2RlZmluZSBNWDUzX0lOVF9VQVJUMwkzMwotI2RlZmluZSBNWDUzX0lOVF9SRVNWMzQJMzQKLSNkZWZpbmUgTVg1M19JTlRfUkVTVjM1CTM1CisjZGVmaW5lIE1YNTNfSU5UX1JUQwkzNAorI2RlZmluZSBNWDUzX0lOVF9QVFAJMzUKICNkZWZpbmUgTVg1M19JTlRfRUNTUEkxCTM2CiAjZGVmaW5lIE1YNTNfSU5UX0VDU1BJMgkzNwogI2RlZmluZSBNWDUzX0lOVF9DU1BJCTM4CkBAIC0yOTMsOCArMjkzLDggQEAKICNkZWZpbmUgTVg1M19JTlRfSTJDMQk2MgogI2RlZmluZSBNWDUzX0lOVF9JMkMyCTYzCiAjZGVmaW5lIE1YNTNfSU5UX0kyQzMJNjQKLSNkZWZpbmUgTVg1M19JTlRfUkVTVjY1CTY1Ci0jZGVmaW5lIE1YNTNfSU5UX1JFU1Y2Ngk2NgorI2RlZmluZSBNWDUzX0lOVF9NTEIJNjUKKyNkZWZpbmUgTVg1M19JTlRfQVNSQwk2NgogI2RlZmluZSBNWDUzX0lOVF9TUERJRgk2NwogI2RlZmluZSBNWDUzX0lOVF9TSU1fREFUCTY4CiAjZGVmaW5lIE1YNTNfSU5UX0lJTQk2OQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Yy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Yy5oCmluZGV4IDRhYzUzY2UuLjA5ODc5MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXhjLmgKQEAgLTY4LDcgKzY4LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgX19teGNfY3B1X3R5cGU7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19BUkNIX01YMQorI2lmZGVmIENPTkZJR19TT0NfSU1YMQogIyBpZmRlZiBteGNfY3B1X3R5cGUKICMgIHVuZGVmIG14Y19jcHVfdHlwZQogIyAgZGVmaW5lIG14Y19jcHVfdHlwZSBfX214Y19jcHVfdHlwZQpAQCAtODAsNyArODAsNyBAQAogIyBkZWZpbmUgY3B1X2lzX214MSgpCQkoMCkKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX01BQ0hfTVgyMQorI2lmZGVmIENPTkZJR19TT0NfSU1YMjEKICMgaWZkZWYgbXhjX2NwdV90eXBlCiAjICB1bmRlZiBteGNfY3B1X3R5cGUKICMgIGRlZmluZSBteGNfY3B1X3R5cGUgX19teGNfY3B1X3R5cGUKQEAgLTkyLDcgKzkyLDcgQEAKICMgZGVmaW5lIGNwdV9pc19teDIxKCkJCSgwKQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQVJDSF9NWDI1CisjaWZkZWYgQ09ORklHX1NPQ19JTVgyNQogIyBpZmRlZiBteGNfY3B1X3R5cGUKICMgIHVuZGVmIG14Y19jcHVfdHlwZQogIyAgZGVmaW5lIG14Y19jcHVfdHlwZSBfX214Y19jcHVfdHlwZQpAQCAtMTA0LDcgKzEwNCw3IEBACiAjIGRlZmluZSBjcHVfaXNfbXgyNSgpCQkoMCkKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX01BQ0hfTVgyNworI2lmZGVmIENPTkZJR19TT0NfSU1YMjcKICMgaWZkZWYgbXhjX2NwdV90eXBlCiAjICB1bmRlZiBteGNfY3B1X3R5cGUKICMgIGRlZmluZSBteGNfY3B1X3R5cGUgX19teGNfY3B1X3R5cGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC90aW1leC5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3RpbWV4LmgKaW5kZXggZDYxZDVjNy4uMTAzNDNkMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3RpbWV4LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3RpbWV4LmgKQEAgLTE2LDE2ICsxNiw3IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfTVhDX1RJTUVYX0hfXwogI2RlZmluZSBfX0FTTV9BUkNIX01YQ19USU1FWF9IX18KIAotI2lmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVgxCi0jZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJMTYwMDAwMDAKLSNlbGlmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVgyCi0jZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJMTMzMDAwMDAKLSNlbGlmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVgzCi0jZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJMTY2MjUwMDAKLSNlbGlmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVgyNQotI2RlZmluZSBDTE9DS19USUNLX1JBVEUJCTE2MDAwMDAwCi0jZWxpZiBkZWZpbmVkIENPTkZJR19BUkNIX01YNQotI2RlZmluZSBDTE9DS19USUNLX1JBVEUJCTgwMDAwMDAKLSNlbmRpZgorLyogQm9ndXMgdmFsdWUgKi8KKyNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCTEyMzQ1Njc4CiAKICNlbmRpZgkJCQkvKiBfX0FTTV9BUkNIX01YQ19USU1FWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2lvbXV4LXYxLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9pb211eC12MS5jCmluZGV4IDMyMzhjMTAuLjFmNzM5NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2lvbXV4LXYxLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW9tdXgtdjEuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiBzdGF0aWMgaW50IGlteF9pb211eHYxX3NldHVwX211bHRpcGxlKGNvbnN0IGludCAqbGlzdCwgdW5zaWduZWQgY291bnQpCiB7CiAJc2l6ZV90IGk7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAJCXJldCA9IG14Y19ncGlvX21vZGUobGlzdFtpXSk7CkBAIC0xNzIsNDUgKzE3MiwxMyBAQAogaW50IG14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMoY29uc3QgaW50ICpwaW5fbGlzdCwgdW5zaWduZWQgY291bnQsCiAJCWNvbnN0IGNoYXIgKmxhYmVsKQogewotCXNpemVfdCBpOwogCWludCByZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQl1bnNpZ25lZCBncGlvID0gcGluX2xpc3RbaV0gJiAoR1BJT19QSU5fTUFTSyB8IEdQSU9fUE9SVF9NQVNLKTsKLQotCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3BpbywgbGFiZWwpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJfZ3Bpb19yZXF1ZXN0OwotCX0KLQogCXJldCA9IGlteF9pb211eHYxX3NldHVwX211bHRpcGxlKHBpbl9saXN0LCBjb3VudCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfc2V0dXA7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3NldHVwOgotCUJVR19PTihpICE9IGNvdW50KTsKLQotZXJyX2dwaW9fcmVxdWVzdDoKLQlteGNfZ3Bpb19yZWxlYXNlX211bHRpcGxlX3BpbnMocGluX2xpc3QsIGkpOwotCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wobXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyk7CiAKLXZvaWQgbXhjX2dwaW9fcmVsZWFzZV9tdWx0aXBsZV9waW5zKGNvbnN0IGludCAqcGluX2xpc3QsIGludCBjb3VudCkKLXsKLQlzaXplX3QgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0JCXVuc2lnbmVkIGdwaW8gPSBwaW5fbGlzdFtpXSAmIChHUElPX1BJTl9NQVNLIHwgR1BJT19QT1JUX01BU0spOwotCi0JCWdwaW9fZnJlZShncGlvKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKG14Y19ncGlvX3JlbGVhc2VfbXVsdGlwbGVfcGlucyk7Ci0KIGludCBfX2luaXQgaW14X2lvbXV4djFfaW5pdCh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBudW1wb3J0cykKIHsKIAlpbXhfaW9tdXh2MV9iYXNlYWRkciA9IGJhc2U7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9wd20uYyBiL2FyY2gvYXJtL3BsYXQtbXhjL3B3bS5jCmluZGV4IDdhNjFlZjguLjc2MWMzYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL3B3bS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL3B3bS5jCkBAIC0yMTQsMTQgKzIxNCwxNCBAQAogCQlnb3RvIGVycl9mcmVlX2NsazsKIAl9CiAKLQlyID0gcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCArIDEsIHBkZXYtPm5hbWUpOworCXIgPSByZXF1ZXN0X21lbV9yZWdpb24oci0+c3RhcnQsIHJlc291cmNlX3NpemUociksIHBkZXYtPm5hbWUpOwogCWlmIChyID09IE5VTEwpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgbWVtb3J5IHJlc291cmNlXG4iKTsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIGVycl9mcmVlX2NsazsKIAl9CiAKLQlwd20tPm1taW9fYmFzZSA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJcHdtLT5tbWlvX2Jhc2UgPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKIAlpZiAocHdtLT5tbWlvX2Jhc2UgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW9yZW1hcCgpIHJlZ2lzdGVyc1xuIik7CiAJCXJldCA9IC1FTk9ERVY7CkBAIC0yMzYsNyArMjM2LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX2ZyZWVfbWVtOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihyLT5zdGFydCwgci0+ZW5kIC0gci0+c3RhcnQgKyAxKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOwogZXJyX2ZyZWVfY2xrOgogCWNsa19wdXQocHdtLT5jbGspOwogZXJyX2ZyZWU6CkBAIC0yNjAsNyArMjYwLDcgQEAKIAlpb3VubWFwKHB3bS0+bW1pb19iYXNlKTsKIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihyLT5zdGFydCwgci0+ZW5kIC0gci0+c3RhcnQgKyAxKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOwogCiAJY2xrX3B1dChwd20tPmNsayk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL3R6aWMuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL3R6aWMuYwppbmRleCA1N2Y5Mzk1Li43MTBmMmU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy90emljLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvdHppYy5jCkBAIC00OSw2ICs0OSw4IEBACiAKIHZvaWQgX19pb21lbSAqdHppY19iYXNlOyAvKiBVc2VkIGFzIGlycSBjb250cm9sbGVyIGJhc2UgaW4gZW50cnktbWFjcm8uUyAqLwogCisjZGVmaW5lIFRaSUNfTlVNX0lSUVMgMTI4CisKICNpZmRlZiBDT05GSUdfRklRCiBzdGF0aWMgaW50IHR6aWNfc2V0X2lycV9maXEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCiB7CkBAIC0xNjYsNyArMTY4LDcgQEAKIAogCS8qIGFsbCBJUlEgbm8gRklRIFdhcm5pbmcgOjogTm8gc2VsZWN0aW9uICovCiAKLQlmb3IgKGkgPSAwOyBpIDwgTVhDX0lOVEVSTkFMX0lSUVM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBUWklDX05VTV9JUlFTOyBpKyspIHsKIAkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZteGNfdHppY19jaGlwLmJhc2UsCiAJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvZ3Bpby5oIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLmgKaW5kZXggZWExOWE1Yi4uZDVkN2U2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLmgKQEAgLTkwLDYgKzkwLDcgQEAKIAlpbnQgbnVtX2dwaW87CiAJdTMyICgqZ2V0X3NlY29uZGFyeV9zdGF0dXMpKHVuc2lnbmVkIGludCBiYW5rKTsKIAl2b2lkICgqc2V0X2lvZm9yY2UpKGJvb2wgZW5hYmxlKTsKKwlib29sIHN1cHBvcnRzX3NsZWVwbW9kZTsKIH07CiAKICNlbmRpZiAvKiBfX0FTTV9QTEFUX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9zdGVfZG1hNDAuaCBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvc3RlX2RtYTQwLmgKaW5kZXggYzQ0ODg2MC4uNjg1Yzc4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9zdGVfZG1hNDAuaAorKysgYi9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L3N0ZV9kbWE0MC5oCkBAIC0xMCw2ICsxMCw3IEBACiAjZGVmaW5lIFNURV9ETUE0MF9ICiAKICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnCmluZGV4IDQ5YTRjNzUuLjZlNjczNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnCkBAIC0yMTEsOSArMjExLDYgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUAogCWRlZmF1bHQgT01BUF9QTV9OT09QCiAKLWNvbmZpZyBPTUFQX1BNX05PTkUKLQlib29sICJObyBQTSBsYXllciIKLQogY29uZmlnIE9NQVBfUE1fTk9PUAogCWJvb2wgIk5vLW9wL2RlYnVnIFBNIGxheWVyIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCmluZGV4IGM5MTIyZGQuLjk2NDcwNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCkBAIC00ODAsMTMgKzQ4MCwxMCBAQAogc3RhdGljIGludCBjbGtfZGVidWdmc19yZWdpc3Rlcl9vbmUoc3RydWN0IGNsayAqYykKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBkZW50cnkgKmQsICpjaGlsZCwgKmNoaWxkX3RtcDsKKwlzdHJ1Y3QgZGVudHJ5ICpkOwogCXN0cnVjdCBjbGsgKnBhID0gYy0+cGFyZW50OwotCWNoYXIgc1syNTVdOwotCWNoYXIgKnAgPSBzOwogCi0JcCArPSBzcHJpbnRmKHAsICIlcyIsIGMtPm5hbWUpOwotCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIocywgcGEgPyBwYS0+ZGVudCA6IGNsa19kZWJ1Z2ZzX3Jvb3QpOworCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoYy0+bmFtZSwgcGEgPyBwYS0+ZGVudCA6IGNsa19kZWJ1Z2ZzX3Jvb3QpOwogCWlmICghZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJYy0+ZGVudCA9IGQ7CkBAIC01MDksMTAgKzUwNiw3IEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXQ6Ci0JZCA9IGMtPmRlbnQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoaWxkLCBjaGlsZF90bXAsICZkLT5kX3N1YmRpcnMsIGRfdS5kX2NoaWxkKQotCQlkZWJ1Z2ZzX3JlbW92ZShjaGlsZCk7Ci0JZGVidWdmc19yZW1vdmUoYy0+ZGVudCk7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGMtPmRlbnQpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9jb3VudGVyXzMyay5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2NvdW50ZXJfMzJrLmMKaW5kZXggZjdmZWQ2MC4uYTZjYmI3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2NvdW50ZXJfMzJrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2NvdW50ZXJfMzJrLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9zY2hlZF9jbG9jay5oPgogCkBAIC0yNiw4NyArMjcsMTYgQEAKIAogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KIAotCiAvKgogICogMzJLSHogY2xvY2tzb3VyY2UgLi4uIGFsd2F5cyBhdmFpbGFibGUsIG9uIHByZXR0eSBtb3N0IGNoaXBzIGV4Y2VwdAogICogT01BUCA3MzAgYW5kIDE1MTAuICBPdGhlciB0aW1lcnMgY291bGQgYmUgdXNlZCBhcyBjbG9ja3NvdXJjZXMsIHdpdGgKICAqIGhpZ2hlciByZXNvbHV0aW9uIGluIGZyZWUtcnVubmluZyBjb3VudGVyIG1vZGVzIChlLmcuIDEyIE1IeiB4dGFsKSwKICAqIGJ1dCBzeXN0ZW1zIHdvbid0IG5lY2Vzc2FyaWx5IHdhbnQgdG8gc3BlbmQgcmVzb3VyY2VzIHRoYXQgd2F5LgogICovCitzdGF0aWMgdm9pZCBfX2lvbWVtICp0aW1lcl8zMmtfYmFzZTsKIAogI2RlZmluZSBPTUFQMTZYWF9USU1FUl8zMktfU1lOQ0hST05JWkVECQkweGZmZmJjNDEwCiAKLSNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgotCi0vKgotICogb2Zmc2V0XzMyayBob2xkcyB0aGUgaW5pdCB0aW1lIGNvdW50ZXIgdmFsdWUuIEl0IGlzIHRoZW4gc3VidHJhY3RlZAotICogZnJvbSBldmVyeSBjb3VudGVyIHJlYWQgdG8gYWNoaWV2ZSBhIGNvdW50ZXIgdGhhdCBjb3VudHMgdGltZSBmcm9tIHRoZQotICoga2VybmVsIGJvb3QgKG5lZWRlZCBmb3Igc2NoZWRfY2xvY2soKSkuCi0gKi8KLXN0YXRpYyB1MzIgb2Zmc2V0XzMyayBfX3JlYWRfbW9zdGx5OwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKLXN0YXRpYyBjeWNsZV90IG5vdHJhY2Ugb21hcDE2eHhfMzJrX3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKLXsKLQlyZXR1cm4gb21hcF9yZWFkbChPTUFQMTZYWF9USU1FUl8zMktfU1lOQ0hST05JWkVEKSAtIG9mZnNldF8zMms7Ci19Ci0jZWxzZQotI2RlZmluZSBvbWFwMTZ4eF8zMmtfcmVhZAlOVUxMCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TT0NfT01BUDI0MjAKLXN0YXRpYyBjeWNsZV90IG5vdHJhY2Ugb21hcDI0MjBfMzJrX3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKLXsKLQlyZXR1cm4gb21hcF9yZWFkbChPTUFQMjQyMF8zMktTWU5DVF9CQVNFICsgMHgxMCkgLSBvZmZzZXRfMzJrOwotfQotI2Vsc2UKLSNkZWZpbmUgb21hcDI0MjBfMzJrX3JlYWQJTlVMTAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfU09DX09NQVAyNDMwCi1zdGF0aWMgY3ljbGVfdCBub3RyYWNlIG9tYXAyNDMwXzMya19yZWFkKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCi17Ci0JcmV0dXJuIG9tYXBfcmVhZGwoT01BUDI0MzBfMzJLU1lOQ1RfQkFTRSArIDB4MTApIC0gb2Zmc2V0XzMyazsKLX0KLSNlbHNlCi0jZGVmaW5lIG9tYXAyNDMwXzMya19yZWFkCU5VTEwKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKLXN0YXRpYyBjeWNsZV90IG5vdHJhY2Ugb21hcDM0eHhfMzJrX3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKLXsKLQlyZXR1cm4gb21hcF9yZWFkbChPTUFQMzQzMF8zMktTWU5DVF9CQVNFICsgMHgxMCkgLSBvZmZzZXRfMzJrOwotfQotI2Vsc2UKLSNkZWZpbmUgb21hcDM0eHhfMzJrX3JlYWQJTlVMTAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNAotc3RhdGljIGN5Y2xlX3Qgbm90cmFjZSBvbWFwNDR4eF8zMmtfcmVhZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQotewotCXJldHVybiBvbWFwX3JlYWRsKE9NQVA0NDMwXzMyS1NZTkNUX0JBU0UgKyAweDEwKSAtIG9mZnNldF8zMms7Ci19Ci0jZWxzZQotI2RlZmluZSBvbWFwNDR4eF8zMmtfcmVhZAlOVUxMCi0jZW5kaWYKLQotLyoKLSAqIEtlcm5lbCBhc3N1bWVzIHRoYXQgc2NoZWRfY2xvY2sgY2FuIGJlIGNhbGxlZCBlYXJseSBidXQgbWF5IG5vdCBoYXZlCi0gKiB0aGluZ3MgcmVhZHkgeWV0LgotICovCi1zdGF0aWMgY3ljbGVfdCBub3RyYWNlIG9tYXBfMzJrX3JlYWRfZHVtbXkoc3RydWN0IGNsb2Nrc291cmNlICpjcykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV8zMmsgPSB7Ci0JLm5hbWUJCT0gIjMya19jb3VudGVyIiwKLQkucmF0aW5nCQk9IDI1MCwKLQkucmVhZAkJPSBvbWFwXzMya19yZWFkX2R1bW15LAotCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAotCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKLX07Ci0KIC8qCiAgKiBSZXR1cm5zIGN1cnJlbnQgdGltZSBmcm9tIGJvb3QgaW4gbnNlY3MuIEl0J3MgT0sgZm9yIHRoaXMgdG8gd3JhcAogICogYXJvdW5kIGZvciBub3csIGFzIGl0J3MganVzdCBhIHJlbGF0aXZlIHRpbWUgc3RhbXAuCkBAIC0xMjIsMTEgKzUyLDExIEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIG5vdHJhY2UgX29tYXBfMzJrX3NjaGVkX2Nsb2NrKHZvaWQpCiB7Ci0JdTMyIGN5YyA9IGNsb2Nrc291cmNlXzMyay5yZWFkKCZjbG9ja3NvdXJjZV8zMmspOworCXUzMiBjeWMgPSB0aW1lcl8zMmtfYmFzZSA/IF9fcmF3X3JlYWRsKHRpbWVyXzMya19iYXNlKSA6IDA7CiAJcmV0dXJuIGN5Y190b19maXhlZF9zY2hlZF9jbG9jaygmY2QsIGN5YywgKHUzMil+MCwgU0NfTVVMVCwgU0NfU0hJRlQpOwogfQogCi0jaWZuZGVmIENPTkZJR19PTUFQX01QVV9USU1FUgorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfMzJLX1RJTUVSKSAmJiAhZGVmaW5lZChDT05GSUdfT01BUF9NUFVfVElNRVIpCiB1bnNpZ25lZCBsb25nIGxvbmcgbm90cmFjZSBzY2hlZF9jbG9jayh2b2lkKQogewogCXJldHVybiBfb21hcF8zMmtfc2NoZWRfY2xvY2soKTsKQEAgLTE0MCw3ICs3MCw3IEBACiAKIHN0YXRpYyB2b2lkIG5vdHJhY2Ugb21hcF91cGRhdGVfc2NoZWRfY2xvY2sodm9pZCkKIHsKLQl1MzIgY3ljID0gY2xvY2tzb3VyY2VfMzJrLnJlYWQoJmNsb2Nrc291cmNlXzMyayk7CisJdTMyIGN5YyA9IHRpbWVyXzMya19iYXNlID8gX19yYXdfcmVhZGwodGltZXJfMzJrX2Jhc2UpIDogMDsKIAl1cGRhdGVfc2NoZWRfY2xvY2soJmNkLCBjeWMsICh1MzIpfjApOwogfQogCkBAIC0xNTMsNiArODMsNyBAQAogICovCiBzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHBlcnNpc3RlbnRfdHM7CiBzdGF0aWMgY3ljbGVzX3QgY3ljbGVzLCBsYXN0X2N5Y2xlczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGVyc2lzdGVudF9tdWx0LCBwZXJzaXN0ZW50X3NoaWZ0Owogdm9pZCByZWFkX3BlcnNpc3RlbnRfY2xvY2soc3RydWN0IHRpbWVzcGVjICp0cykKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbnNlY3M7CkBAIC0xNjAsMTEgKzkxLDEwIEBACiAJc3RydWN0IHRpbWVzcGVjICp0c3AgPSAmcGVyc2lzdGVudF90czsKIAogCWxhc3RfY3ljbGVzID0gY3ljbGVzOwotCWN5Y2xlcyA9IGNsb2Nrc291cmNlXzMyay5yZWFkKCZjbG9ja3NvdXJjZV8zMmspOworCWN5Y2xlcyA9IHRpbWVyXzMya19iYXNlID8gX19yYXdfcmVhZGwodGltZXJfMzJrX2Jhc2UpIDogMDsKIAlkZWx0YSA9IGN5Y2xlcyAtIGxhc3RfY3ljbGVzOwogCi0JbnNlY3MgPSBjbG9ja3NvdXJjZV9jeWMybnMoZGVsdGEsCi0JCQkJICAgY2xvY2tzb3VyY2VfMzJrLm11bHQsIGNsb2Nrc291cmNlXzMyay5zaGlmdCk7CisJbnNlY3MgPSBjbG9ja3NvdXJjZV9jeWMybnMoZGVsdGEsIHBlcnNpc3RlbnRfbXVsdCwgcGVyc2lzdGVudF9zaGlmdCk7CiAKIAl0aW1lc3BlY19hZGRfbnModHNwLCBuc2Vjcyk7CiAJKnRzID0gKnRzcDsKQEAgLTE3NiwyOSArMTA2LDQ2IEBACiAJCQkiJXM6IGNhbid0IHJlZ2lzdGVyIGNsb2Nrc291cmNlIVxuIjsKIAogCWlmIChjcHVfaXNfb21hcDE2eHgoKSB8fCBjcHVfY2xhc3NfaXNfb21hcDIoKSkgeworCQl1MzIgcGJhc2U7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IFNaXzRLOworCQl2b2lkIF9faW9tZW0gKmJhc2U7CiAJCXN0cnVjdCBjbGsgKnN5bmNfMzJrX2ljazsKIAotCQlpZiAoY3B1X2lzX29tYXAxNnh4KCkpCi0JCQljbG9ja3NvdXJjZV8zMmsucmVhZCA9IG9tYXAxNnh4XzMya19yZWFkOwotCQllbHNlIGlmIChjcHVfaXNfb21hcDI0MjAoKSkKLQkJCWNsb2Nrc291cmNlXzMyay5yZWFkID0gb21hcDI0MjBfMzJrX3JlYWQ7CisJCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgeworCQkJcGJhc2UgPSBPTUFQMTZYWF9USU1FUl8zMktfU1lOQ0hST05JWkVEOworCQkJc2l6ZSA9IFNaXzFLOworCQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMjQyMCgpKQorCQkJcGJhc2UgPSBPTUFQMjQyMF8zMktTWU5DVF9CQVNFICsgMHgxMDsKIAkJZWxzZSBpZiAoY3B1X2lzX29tYXAyNDMwKCkpCi0JCQljbG9ja3NvdXJjZV8zMmsucmVhZCA9IG9tYXAyNDMwXzMya19yZWFkOworCQkJcGJhc2UgPSBPTUFQMjQzMF8zMktTWU5DVF9CQVNFICsgMHgxMDsKIAkJZWxzZSBpZiAoY3B1X2lzX29tYXAzNHh4KCkpCi0JCQljbG9ja3NvdXJjZV8zMmsucmVhZCA9IG9tYXAzNHh4XzMya19yZWFkOworCQkJcGJhc2UgPSBPTUFQMzQzMF8zMktTWU5DVF9CQVNFICsgMHgxMDsKIAkJZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpCi0JCQljbG9ja3NvdXJjZV8zMmsucmVhZCA9IG9tYXA0NHh4XzMya19yZWFkOworCQkJcGJhc2UgPSBPTUFQNDQzMF8zMktTWU5DVF9CQVNFICsgMHgxMDsKIAkJZWxzZQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKKwkJLyogRm9yIHRoaXMgdG8gd29yayB3ZSBtdXN0IGhhdmUgYSBzdGF0aWMgbWFwcGluZyBpbiBpby5jIGZvciB0aGlzIGFyZWEgKi8KKwkJYmFzZSA9IGlvcmVtYXAocGJhc2UsIHNpemUpOworCQlpZiAoIWJhc2UpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwogCQlzeW5jXzMya19pY2sgPSBjbGtfZ2V0KE5VTEwsICJvbWFwXzMya3N5bmNfaWNrIik7CiAJCWlmICghSVNfRVJSKHN5bmNfMzJrX2ljaykpCiAJCQljbGtfZW5hYmxlKHN5bmNfMzJrX2ljayk7CiAKLQkJb2Zmc2V0XzMyayA9IGNsb2Nrc291cmNlXzMyay5yZWFkKCZjbG9ja3NvdXJjZV8zMmspOworCQl0aW1lcl8zMmtfYmFzZSA9IGJhc2U7CiAKLQkJaWYgKGNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjbG9ja3NvdXJjZV8zMmssIDMyNzY4KSkKLQkJCXByaW50ayhlcnIsIGNsb2Nrc291cmNlXzMyay5uYW1lKTsKKwkJLyoKKwkJICogMTIwMDAwIHJvdWdoIGVzdGltYXRlIGZyb20gdGhlIGNhbGN1bGF0aW9ucyBpbgorCQkgKiBfX2Nsb2Nrc291cmNlX3VwZGF0ZWZyZXFfc2NhbGUuCisJCSAqLworCQljbG9ja3NfY2FsY19tdWx0X3NoaWZ0KCZwZXJzaXN0ZW50X211bHQsICZwZXJzaXN0ZW50X3NoaWZ0LAorCQkJCTMyNzY4LCBOU0VDX1BFUl9TRUMsIDEyMDAwMCk7CisKKwkJaWYgKGNsb2Nrc291cmNlX21taW9faW5pdChiYXNlLCAiMzJrX2NvdW50ZXIiLCAzMjc2OCwgMjUwLCAzMiwKKwkJCQkJICBjbG9ja3NvdXJjZV9tbWlvX3JlYWRsX3VwKSkKKwkJCXByaW50ayhlcnIsICIzMmtfY291bnRlciIpOwogCiAJCWluaXRfZml4ZWRfc2NoZWRfY2xvY2soJmNkLCBvbWFwX3VwZGF0ZV9zY2hlZF9jbG9jaywgMzIsCiAJCQkJICAgICAgIDMyNzY4LCBTQ19NVUxULCBTQ19TSElGVCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvZG10aW1lci5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYwppbmRleCBlZTlmNmViLi44ZGZiODE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZG10aW1lci5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMKQEAgLTQxLDEyNyArNDEsNiBAQAogI2luY2x1ZGUgPHBsYXQvZG10aW1lci5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCi0vKiByZWdpc3RlciBvZmZzZXRzICovCi0jZGVmaW5lIF9PTUFQX1RJTUVSX0lEX09GRlNFVAkJMHgwMAotI2RlZmluZSBfT01BUF9USU1FUl9PQ1BfQ0ZHX09GRlNFVAkweDEwCi0jZGVmaW5lIF9PTUFQX1RJTUVSX1NZU19TVEFUX09GRlNFVAkweDE0Ci0jZGVmaW5lIF9PTUFQX1RJTUVSX1NUQVRfT0ZGU0VUCQkweDE4Ci0jZGVmaW5lIF9PTUFQX1RJTUVSX0lOVF9FTl9PRkZTRVQJMHgxYwotI2RlZmluZSBfT01BUF9USU1FUl9XQUtFVVBfRU5fT0ZGU0VUCTB4MjAKLSNkZWZpbmUgX09NQVBfVElNRVJfQ1RSTF9PRkZTRVQJCTB4MjQKLSNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9HUE9DRkcJCSgxIDw8IDE0KQotI2RlZmluZQkJT01BUF9USU1FUl9DVFJMX0NBUFRNT0RFCSgxIDw8IDEzKQotI2RlZmluZQkJT01BUF9USU1FUl9DVFJMX1BUCQkoMSA8PCAxMikKLSNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9UQ01fTE9XVE9ISUdICSgweDEgPDwgOCkKLSNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9UQ01fSElHSFRPTE9XCSgweDIgPDwgOCkKLSNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9UQ01fQk9USEVER0VTCSgweDMgPDwgOCkKLSNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9TQ1BXTQkJKDEgPDwgNykKLSNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9DRQkJKDEgPDwgNikgLyogY29tcGFyZSBlbmFibGUgKi8KLSNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9QUkUJCSgxIDw8IDUpIC8qIHByZXNjYWxlciBlbmFibGUgKi8KLSNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9QVFZfU0hJRlQJMiAvKiBwcmVzY2FsZXIgdmFsdWUgc2hpZnQgKi8KLSNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9QT1NURUQJCSgxIDw8IDIpCi0jZGVmaW5lCQlPTUFQX1RJTUVSX0NUUkxfQVIJCSgxIDw8IDEpIC8qIGF1dG8tcmVsb2FkIGVuYWJsZSAqLwotI2RlZmluZQkJT01BUF9USU1FUl9DVFJMX1NUCQkoMSA8PCAwKSAvKiBzdGFydCB0aW1lciAqLwotI2RlZmluZSBfT01BUF9USU1FUl9DT1VOVEVSX09GRlNFVAkweDI4Ci0jZGVmaW5lIF9PTUFQX1RJTUVSX0xPQURfT0ZGU0VUCQkweDJjCi0jZGVmaW5lIF9PTUFQX1RJTUVSX1RSSUdHRVJfT0ZGU0VUCTB4MzAKLSNkZWZpbmUgX09NQVBfVElNRVJfV1JJVEVfUEVORF9PRkZTRVQJMHgzNAotI2RlZmluZQkJV1BfTk9ORQkJCTAJLyogbm8gd3JpdGUgcGVuZGluZyBiaXQgKi8KLSNkZWZpbmUJCVdQX1RDTFIJCQkoMSA8PCAwKQotI2RlZmluZQkJV1BfVENSUgkJCSgxIDw8IDEpCi0jZGVmaW5lCQlXUF9UTERSCQkJKDEgPDwgMikKLSNkZWZpbmUJCVdQX1RUR1IJCQkoMSA8PCAzKQotI2RlZmluZQkJV1BfVE1BUgkJCSgxIDw8IDQpCi0jZGVmaW5lCQlXUF9UUElSCQkJKDEgPDwgNSkKLSNkZWZpbmUJCVdQX1ROSVIJCQkoMSA8PCA2KQotI2RlZmluZQkJV1BfVENWUgkJCSgxIDw8IDcpCi0jZGVmaW5lCQlXUF9UT0NSCQkJKDEgPDwgOCkKLSNkZWZpbmUJCVdQX1RPV1IJCQkoMSA8PCA5KQotI2RlZmluZSBfT01BUF9USU1FUl9NQVRDSF9PRkZTRVQJMHgzOAotI2RlZmluZSBfT01BUF9USU1FUl9DQVBUVVJFX09GRlNFVAkweDNjCi0jZGVmaW5lIF9PTUFQX1RJTUVSX0lGX0NUUkxfT0ZGU0VUCTB4NDAKLSNkZWZpbmUgX09NQVBfVElNRVJfQ0FQVFVSRTJfT0ZGU0VUCQkweDQ0CS8qIFRDQVIyLCAzNHh4IG9ubHkgKi8KLSNkZWZpbmUgX09NQVBfVElNRVJfVElDS19QT1NfT0ZGU0VUCQkweDQ4CS8qIFRQSVIsIDM0eHggb25seSAqLwotI2RlZmluZSBfT01BUF9USU1FUl9USUNLX05FR19PRkZTRVQJCTB4NGMJLyogVE5JUiwgMzR4eCBvbmx5ICovCi0jZGVmaW5lIF9PTUFQX1RJTUVSX1RJQ0tfQ09VTlRfT0ZGU0VUCQkweDUwCS8qIFRDVlIsIDM0eHggb25seSAqLwotI2RlZmluZSBfT01BUF9USU1FUl9USUNLX0lOVF9NQVNLX1NFVF9PRkZTRVQJMHg1NAkvKiBUT0NSLCAzNHh4IG9ubHkgKi8KLSNkZWZpbmUgX09NQVBfVElNRVJfVElDS19JTlRfTUFTS19DT1VOVF9PRkZTRVQJMHg1OAkvKiBUT1dSLCAzNHh4IG9ubHkgKi8KLQotLyogcmVnaXN0ZXIgb2Zmc2V0cyB3aXRoIHRoZSB3cml0ZSBwZW5kaW5nIGJpdCBlbmNvZGVkICovCi0jZGVmaW5lCVdQU0hJRlQJCQkJCTE2Ci0KLSNkZWZpbmUgT01BUF9USU1FUl9JRF9SRUcJCQkoX09NQVBfVElNRVJfSURfT0ZGU0VUIFwKLQkJCQkJCQl8IChXUF9OT05FIDw8IFdQU0hJRlQpKQotCi0jZGVmaW5lIE9NQVBfVElNRVJfT0NQX0NGR19SRUcJCQkoX09NQVBfVElNRVJfT0NQX0NGR19PRkZTRVQgXAotCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCi0KLSNkZWZpbmUgT01BUF9USU1FUl9TWVNfU1RBVF9SRUcJCQkoX09NQVBfVElNRVJfU1lTX1NUQVRfT0ZGU0VUIFwKLQkJCQkJCQl8IChXUF9OT05FIDw8IFdQU0hJRlQpKQotCi0jZGVmaW5lIE9NQVBfVElNRVJfU1RBVF9SRUcJCQkoX09NQVBfVElNRVJfU1RBVF9PRkZTRVQgXAotCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCi0KLSNkZWZpbmUgT01BUF9USU1FUl9JTlRfRU5fUkVHCQkJKF9PTUFQX1RJTUVSX0lOVF9FTl9PRkZTRVQgXAotCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCi0KLSNkZWZpbmUgT01BUF9USU1FUl9XQUtFVVBfRU5fUkVHCQkoX09NQVBfVElNRVJfV0FLRVVQX0VOX09GRlNFVCBcCi0JCQkJCQkJfCAoV1BfTk9ORSA8PCBXUFNISUZUKSkKLQotI2RlZmluZSBPTUFQX1RJTUVSX0NUUkxfUkVHCQkJKF9PTUFQX1RJTUVSX0NUUkxfT0ZGU0VUIFwKLQkJCQkJCQl8IChXUF9UQ0xSIDw8IFdQU0hJRlQpKQotCi0jZGVmaW5lIE9NQVBfVElNRVJfQ09VTlRFUl9SRUcJCQkoX09NQVBfVElNRVJfQ09VTlRFUl9PRkZTRVQgXAotCQkJCQkJCXwgKFdQX1RDUlIgPDwgV1BTSElGVCkpCi0KLSNkZWZpbmUgT01BUF9USU1FUl9MT0FEX1JFRwkJCShfT01BUF9USU1FUl9MT0FEX09GRlNFVCBcCi0JCQkJCQkJfCAoV1BfVExEUiA8PCBXUFNISUZUKSkKLQotI2RlZmluZSBPTUFQX1RJTUVSX1RSSUdHRVJfUkVHCQkJKF9PTUFQX1RJTUVSX1RSSUdHRVJfT0ZGU0VUIFwKLQkJCQkJCQl8IChXUF9UVEdSIDw8IFdQU0hJRlQpKQotCi0jZGVmaW5lIE9NQVBfVElNRVJfV1JJVEVfUEVORF9SRUcJCShfT01BUF9USU1FUl9XUklURV9QRU5EX09GRlNFVCBcCi0JCQkJCQkJfCAoV1BfTk9ORSA8PCBXUFNISUZUKSkKLQotI2RlZmluZSBPTUFQX1RJTUVSX01BVENIX1JFRwkJCShfT01BUF9USU1FUl9NQVRDSF9PRkZTRVQgXAotCQkJCQkJCXwgKFdQX1RNQVIgPDwgV1BTSElGVCkpCi0KLSNkZWZpbmUgT01BUF9USU1FUl9DQVBUVVJFX1JFRwkJCShfT01BUF9USU1FUl9DQVBUVVJFX09GRlNFVCBcCi0JCQkJCQkJfCAoV1BfTk9ORSA8PCBXUFNISUZUKSkKLQotI2RlZmluZSBPTUFQX1RJTUVSX0lGX0NUUkxfUkVHCQkJKF9PTUFQX1RJTUVSX0lGX0NUUkxfT0ZGU0VUIFwKLQkJCQkJCQl8IChXUF9OT05FIDw8IFdQU0hJRlQpKQotCi0jZGVmaW5lIE9NQVBfVElNRVJfQ0FQVFVSRTJfUkVHCQkJKF9PTUFQX1RJTUVSX0NBUFRVUkUyX09GRlNFVCBcCi0JCQkJCQkJfCAoV1BfTk9ORSA8PCBXUFNISUZUKSkKLQotI2RlZmluZSBPTUFQX1RJTUVSX1RJQ0tfUE9TX1JFRwkJCShfT01BUF9USU1FUl9USUNLX1BPU19PRkZTRVQgXAotCQkJCQkJCXwgKFdQX1RQSVIgPDwgV1BTSElGVCkpCi0KLSNkZWZpbmUgT01BUF9USU1FUl9USUNLX05FR19SRUcJCQkoX09NQVBfVElNRVJfVElDS19ORUdfT0ZGU0VUIFwKLQkJCQkJCQl8IChXUF9UTklSIDw8IFdQU0hJRlQpKQotCi0jZGVmaW5lIE9NQVBfVElNRVJfVElDS19DT1VOVF9SRUcJCShfT01BUF9USU1FUl9USUNLX0NPVU5UX09GRlNFVCBcCi0JCQkJCQkJfCAoV1BfVENWUiA8PCBXUFNISUZUKSkKLQotI2RlZmluZSBPTUFQX1RJTUVSX1RJQ0tfSU5UX01BU0tfU0VUX1JFRwkJCQlcCi0JCShfT01BUF9USU1FUl9USUNLX0lOVF9NQVNLX1NFVF9PRkZTRVQgfCAoV1BfVE9DUiA8PCBXUFNISUZUKSkKLQotI2RlZmluZSBPTUFQX1RJTUVSX1RJQ0tfSU5UX01BU0tfQ09VTlRfUkVHCQkJCVwKLQkJKF9PTUFQX1RJTUVSX1RJQ0tfSU5UX01BU0tfQ09VTlRfT0ZGU0VUIHwgKFdQX1RPV1IgPDwgV1BTSElGVCkpCi0KLXN0cnVjdCBvbWFwX2RtX3RpbWVyIHsKLQl1bnNpZ25lZCBsb25nIHBoeXNfYmFzZTsKLQlpbnQgaXJxOwotI2lmZGVmIENPTkZJR19BUkNIX09NQVAyUExVUwotCXN0cnVjdCBjbGsgKmljbGssICpmY2xrOwotI2VuZGlmCi0Jdm9pZCBfX2lvbWVtICppb19iYXNlOwotCXVuc2lnbmVkIHJlc2VydmVkOjE7Ci0JdW5zaWduZWQgZW5hYmxlZDoxOwotCXVuc2lnbmVkIHBvc3RlZDoxOwotfTsKLQogc3RhdGljIGludCBkbV90aW1lcl9jb3VudDsKIAogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCkBAIC0yOTEsMTEgKzE3MCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdTMyIG9tYXBfZG1fdGltZXJfcmVhZF9yZWcoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1MzIgcmVnKQogewotCWlmICh0aW1lci0+cG9zdGVkKQotCQl3aGlsZSAocmVhZGwodGltZXItPmlvX2Jhc2UgKyAoT01BUF9USU1FUl9XUklURV9QRU5EX1JFRyAmIDB4ZmYpKQotCQkJCSYgKHJlZyA+PiBXUFNISUZUKSkKLQkJCWNwdV9yZWxheCgpOwotCXJldHVybiByZWFkbCh0aW1lci0+aW9fYmFzZSArIChyZWcgJiAweGZmKSk7CisJcmV0dXJuIF9fb21hcF9kbV90aW1lcl9yZWFkKHRpbWVyLT5pb19iYXNlLCByZWcsIHRpbWVyLT5wb3N0ZWQpOwogfQogCiAvKgpAQCAtMzA3LDExICsxODIsNyBAQAogc3RhdGljIHZvaWQgb21hcF9kbV90aW1lcl93cml0ZV9yZWcoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1MzIgcmVnLAogCQkJCQkJdTMyIHZhbHVlKQogewotCWlmICh0aW1lci0+cG9zdGVkKQotCQl3aGlsZSAocmVhZGwodGltZXItPmlvX2Jhc2UgKyAoT01BUF9USU1FUl9XUklURV9QRU5EX1JFRyAmIDB4ZmYpKQotCQkJCSYgKHJlZyA+PiBXUFNISUZUKSkKLQkJCWNwdV9yZWxheCgpOwotCXdyaXRlbCh2YWx1ZSwgdGltZXItPmlvX2Jhc2UgKyAocmVnICYgMHhmZikpOworCV9fb21hcF9kbV90aW1lcl93cml0ZSh0aW1lci0+aW9fYmFzZSwgcmVnLCB2YWx1ZSwgdGltZXItPnBvc3RlZCk7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXBfZG1fdGltZXJfd2FpdF9mb3JfcmVzZXQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQpAQCAtMzMwLDcgKzIwMSw3IEBACiAKIHN0YXRpYyB2b2lkIG9tYXBfZG1fdGltZXJfcmVzZXQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogewotCXUzMiBsOworCWludCBhdXRvaWRsZSA9IDAsIHdha2V1cCA9IDA7CiAKIAlpZiAoIWNwdV9jbGFzc19pc19vbWFwMigpIHx8IHRpbWVyICE9ICZkbV90aW1lcnNbMF0pIHsKIAkJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfSUZfQ1RSTF9SRUcsIDB4MDYpOwpAQCAtMzM4LDI4ICsyMDksMjEgQEAKIAl9CiAJb21hcF9kbV90aW1lcl9zZXRfc291cmNlKHRpbWVyLCBPTUFQX1RJTUVSX1NSQ18zMl9LSFopOwogCi0JbCA9IG9tYXBfZG1fdGltZXJfcmVhZF9yZWcodGltZXIsIE9NQVBfVElNRVJfT0NQX0NGR19SRUcpOwotCWwgfD0gMHgwMiA8PCAzOyAgLyogU2V0IHRvIHNtYXJ0LWlkbGUgbW9kZSAqLwotCWwgfD0gMHgyIDw8IDg7ICAgLyogU2V0IGNsb2NrIGFjdGl2aXR5IHRvIHBlcnNlcnZlIGYtY2xvY2sgb24gaWRsZSAqLwotCiAJLyogRW5hYmxlIGF1dG9pZGxlIG9uIE9NQVAyIC8gT01BUDMgKi8KIAlpZiAoY3B1X2lzX29tYXAyNHh4KCkgfHwgY3B1X2lzX29tYXAzNHh4KCkpCi0JCWwgfD0gMHgxIDw8IDA7CisJCWF1dG9pZGxlID0gMTsKIAogCS8qCiAJICogRW5hYmxlIHdha2UtdXAgb24gT01BUDIgQ1BVcy4KIAkgKi8KIAlpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpCi0JCWwgfD0gMSA8PCAyOwotCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX09DUF9DRkdfUkVHLCBsKTsKKwkJd2FrZXVwID0gMTsKIAotCS8qIE1hdGNoIGhhcmR3YXJlIHJlc2V0IGRlZmF1bHQgb2YgcG9zdGVkIG1vZGUgKi8KLQlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9JRl9DVFJMX1JFRywKLQkJCU9NQVBfVElNRVJfQ1RSTF9QT1NURUQpOworCV9fb21hcF9kbV90aW1lcl9yZXNldCh0aW1lci0+aW9fYmFzZSwgYXV0b2lkbGUsIHdha2V1cCk7CiAJdGltZXItPnBvc3RlZCA9IDE7CiB9CiAKLXN0YXRpYyB2b2lkIG9tYXBfZG1fdGltZXJfcHJlcGFyZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCit2b2lkIG9tYXBfZG1fdGltZXJfcHJlcGFyZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCiB7CiAJb21hcF9kbV90aW1lcl9lbmFibGUodGltZXIpOwogCW9tYXBfZG1fdGltZXJfcmVzZXQodGltZXIpOwpAQCAtNTMxLDI1ICszOTUsMTMgQEAKIAogdm9pZCBvbWFwX2RtX3RpbWVyX3N0b3Aoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogewotCXUzMiBsOworCXVuc2lnbmVkIGxvbmcgcmF0ZSA9IDA7CiAKLQlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7Ci0JaWYgKGwgJiBPTUFQX1RJTUVSX0NUUkxfU1QpIHsKLQkJbCAmPSB+MHgxOwotCQlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgbCk7CiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDJQTFVTCi0JCS8qIFJlYWRiYWNrIHRvIG1ha2Ugc3VyZSB3cml0ZSBoYXMgY29tcGxldGVkICovCi0JCW9tYXBfZG1fdGltZXJfcmVhZF9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcpOwotCQkgLyoKLQkJICAqIFdhaXQgZm9yIGZ1bmN0aW9uYWwgY2xvY2sgcGVyaW9kIHggMy41IHRvIG1ha2Ugc3VyZSB0aGF0Ci0JCSAgKiB0aW1lciBpcyBzdG9wcGVkCi0JCSAgKi8KLQkJdWRlbGF5KDM1MDAwMDAgLyBjbGtfZ2V0X3JhdGUodGltZXItPmZjbGspICsgMSk7CisJcmF0ZSA9IGNsa19nZXRfcmF0ZSh0aW1lci0+ZmNsayk7CiAjZW5kaWYKLQl9Ci0JLyogQWNrIHBvc3NpYmx5IHBlbmRpbmcgaW50ZXJydXB0ICovCi0Jb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfU1RBVF9SRUcsCi0JCQlPTUFQX1RJTUVSX0lOVF9PVkVSRkxPVyk7CisKKwlfX29tYXBfZG1fdGltZXJfc3RvcCh0aW1lci0+aW9fYmFzZSwgdGltZXItPnBvc3RlZCwgcmF0ZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3N0b3ApOwogCkBAIC01NzIsMjIgKzQyNCwxMSBAQAogCiBpbnQgb21hcF9kbV90aW1lcl9zZXRfc291cmNlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IHNvdXJjZSkKIHsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQogCWlmIChzb3VyY2UgPCAwIHx8IHNvdXJjZSA+PSAzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWNsa19kaXNhYmxlKHRpbWVyLT5mY2xrKTsKLQlyZXQgPSBjbGtfc2V0X3BhcmVudCh0aW1lci0+ZmNsaywgZG1fc291cmNlX2Nsb2Nrc1tzb3VyY2VdKTsKLQljbGtfZW5hYmxlKHRpbWVyLT5mY2xrKTsKLQotCS8qCi0JICogV2hlbiB0aGUgZnVuY3Rpb25hbCBjbG9jayBkaXNhcHBlYXJzLCB0b28gcXVpY2sgd3JpdGVzIHNlZW0KLQkgKiB0byBjYXVzZSBhbiBhYm9ydC4gWFhYIElzIHRoaXMgc3RpbGwgbmVjZXNzYXJ5PwotCSAqLwotCV9fZGVsYXkoMzAwMDAwKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIF9fb21hcF9kbV90aW1lcl9zZXRfc291cmNlKHRpbWVyLT5mY2xrLAorCQkJCQkJZG1fc291cmNlX2Nsb2Nrc1tzb3VyY2VdKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfc2V0X3NvdXJjZSk7CiAKQEAgLTYyNSw4ICs0NjYsNyBAQAogCX0KIAlsIHw9IE9NQVBfVElNRVJfQ1RSTF9TVDsKIAotCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NPVU5URVJfUkVHLCBsb2FkKTsKLQlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgbCk7CisJX19vbWFwX2RtX3RpbWVyX2xvYWRfc3RhcnQodGltZXItPmlvX2Jhc2UsIGwsIGxvYWQsIHRpbWVyLT5wb3N0ZWQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9zZXRfbG9hZF9zdGFydCk7CiAKQEAgLTY3OSw4ICs1MTksNyBAQAogdm9pZCBvbWFwX2RtX3RpbWVyX3NldF9pbnRfZW5hYmxlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwKIAkJCQkgIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKLQlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9JTlRfRU5fUkVHLCB2YWx1ZSk7Ci0Jb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfV0FLRVVQX0VOX1JFRywgdmFsdWUpOworCV9fb21hcF9kbV90aW1lcl9pbnRfZW5hYmxlKHRpbWVyLT5pb19iYXNlLCB2YWx1ZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3NldF9pbnRfZW5hYmxlKTsKIApAQCAtNjk2LDE3ICs1MzUsMTMgQEAKIAogdm9pZCBvbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKLQlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9TVEFUX1JFRywgdmFsdWUpOworCV9fb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXModGltZXItPmlvX2Jhc2UsIHZhbHVlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfd3JpdGVfc3RhdHVzKTsKIAogdW5zaWduZWQgaW50IG9tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKIHsKLQl1bnNpZ25lZCBpbnQgbDsKLQotCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NPVU5URVJfUkVHKTsKLQotCXJldHVybiBsOworCXJldHVybiBfX29tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKHRpbWVyLT5pb19iYXNlLCB0aW1lci0+cG9zdGVkKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKTsKIApAQCAtNzM3LDcgKzU3Miw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyc19hY3RpdmUpOwogCi1pbnQgX19pbml0IG9tYXBfZG1fdGltZXJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgb21hcF9kbV90aW1lcl9pbml0KHZvaWQpCiB7CiAJc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyOwogCWludCBpLCBtYXBfc2l6ZSA9IFNaXzhLOwkvKiBNb2R1bGUgNEtCICsgTDQgNEtCIGV4Y2VwdCBvbiBvbWFwMSAqLwpAQCAtNzkwLDggKzYyNSwxNiBAQAogCQkJc3ByaW50ZihjbGtfbmFtZSwgImdwdCVkX2ZjayIsIGkgKyAxKTsKIAkJCXRpbWVyLT5mY2xrID0gY2xrX2dldChOVUxMLCBjbGtfbmFtZSk7CiAJCX0KKworCQkvKiBPbmUgb3IgdHdvIHRpbWVycyBtYXkgYmUgc2V0IHVwIGVhcmx5IGZvciBzeXNfdGltZXIgKi8KKwkJaWYgKHN5c190aW1lcl9yZXNlcnZlZCAmICgxICA8PCBpKSkgeworCQkJdGltZXItPnJlc2VydmVkID0gMTsKKwkJCXRpbWVyLT5wb3N0ZWQgPSAxOworCQl9CiAjZW5kaWYKIAl9CiAKIAlyZXR1cm4gMDsKIH0KKworYXJjaF9pbml0Y2FsbChvbWFwX2RtX3RpbWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jbG9jay5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jbG9jay5oCmluZGV4IDAwNmU1OTkuLmY1N2UwNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY2xvY2suaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2Nsb2NrLmgKQEAgLTE1Miw3ICsxNTIsNyBAQAogCXUxNgkJCW1heF9tdWx0aXBsaWVyOwogCXU4CQkJbGFzdF9yb3VuZGVkX247CiAJdTgJCQltaW5fZGl2aWRlcjsKLQl1OAkJCW1heF9kaXZpZGVyOworCXUxNgkJCW1heF9kaXZpZGVyOwogCXU4CQkJbW9kZXM7CiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNCkKIAl2b2lkIF9faW9tZW0JCSphdXRvaWRsZV9yZWc7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NvbW1vbi5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jb21tb24uaAppbmRleCA1Mjg4MTMwLi40NTY0Y2M2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY29tbW9uLmgKQEAgLTM0LDcgKzM0LDExIEBACiBzdHJ1Y3Qgc3lzX3RpbWVyOwogCiBleHRlcm4gdm9pZCBvbWFwX21hcF9jb21tb25faW8odm9pZCk7Ci1leHRlcm4gc3RydWN0IHN5c190aW1lciBvbWFwX3RpbWVyOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgb21hcDFfdGltZXI7CitleHRlcm4gc3RydWN0IHN5c190aW1lciBvbWFwMl90aW1lcjsKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIG9tYXAzX3RpbWVyOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgb21hcDNfc2VjdXJlX3RpbWVyOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgb21hcDRfdGltZXI7CiBleHRlcm4gYm9vbCBvbWFwXzMya190aW1lcl9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBfX2luaXQgb21hcF9pbml0X2Nsb2Nrc291cmNlXzMyayh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbm90cmFjZSBvbWFwXzMya19zY2hlZF9jbG9jayh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZG10aW1lci5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9kbXRpbWVyLmgKaW5kZXggZDZjNzBkMi4uZWI1ZDE2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9kbXRpbWVyLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9kbXRpbWVyLmgKQEAgLTMyLDYgKzMyLDEwIEBACiAgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCiAjaWZuZGVmIF9fQVNNX0FSQ0hfRE1USU1FUl9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfRE1USU1FUl9ICiAKQEAgLTU2LDEyICs2MCw4IEBACiAgKi8KICNkZWZpbmUgT01BUF9USU1FUl9JUF9WRVJTSU9OXzEgICAgICAgICAgICAgICAgICAgICAgICAweDEKIHN0cnVjdCBvbWFwX2RtX3RpbWVyOwotZXh0ZXJuIHN0cnVjdCBvbWFwX2RtX3RpbWVyICpncHRpbWVyX3dha2V1cDsKLWV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIG9tYXBfdGltZXI7CiBzdHJ1Y3QgY2xrOwogCi1pbnQgb21hcF9kbV90aW1lcl9pbml0KHZvaWQpOwotCiBzdHJ1Y3Qgb21hcF9kbV90aW1lciAqb21hcF9kbV90aW1lcl9yZXF1ZXN0KHZvaWQpOwogc3RydWN0IG9tYXBfZG1fdGltZXIgKm9tYXBfZG1fdGltZXJfcmVxdWVzdF9zcGVjaWZpYyhpbnQgdGltZXJfaWQpOwogdm9pZCBvbWFwX2RtX3RpbWVyX2ZyZWUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKQEAgLTkzLDUgKzkzLDI0OCBAQAogCiBpbnQgb21hcF9kbV90aW1lcnNfYWN0aXZlKHZvaWQpOwogCisvKgorICogRG8gbm90IHVzZSB0aGUgZGVmaW5lcyBiZWxvdywgdGhleSBhcmUgbm90IG5lZWRlZC4gVGhleSBzaG91bGQgYmUgb25seQorICogdXNlZCBieSBkbXRpbWVyLmMgYW5kIHN5c190aW1lciByZWxhdGVkIGNvZGUuCisgKi8KKworLyogcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBfT01BUF9USU1FUl9JRF9PRkZTRVQJCTB4MDAKKyNkZWZpbmUgX09NQVBfVElNRVJfT0NQX0NGR19PRkZTRVQJMHgxMAorI2RlZmluZSBfT01BUF9USU1FUl9TWVNfU1RBVF9PRkZTRVQJMHgxNAorI2RlZmluZSBfT01BUF9USU1FUl9TVEFUX09GRlNFVAkJMHgxOAorI2RlZmluZSBfT01BUF9USU1FUl9JTlRfRU5fT0ZGU0VUCTB4MWMKKyNkZWZpbmUgX09NQVBfVElNRVJfV0FLRVVQX0VOX09GRlNFVAkweDIwCisjZGVmaW5lIF9PTUFQX1RJTUVSX0NUUkxfT0ZGU0VUCQkweDI0CisjZGVmaW5lCQlPTUFQX1RJTUVSX0NUUkxfR1BPQ0ZHCQkoMSA8PCAxNCkKKyNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9DQVBUTU9ERQkoMSA8PCAxMykKKyNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9QVAkJKDEgPDwgMTIpCisjZGVmaW5lCQlPTUFQX1RJTUVSX0NUUkxfVENNX0xPV1RPSElHSAkoMHgxIDw8IDgpCisjZGVmaW5lCQlPTUFQX1RJTUVSX0NUUkxfVENNX0hJR0hUT0xPVwkoMHgyIDw8IDgpCisjZGVmaW5lCQlPTUFQX1RJTUVSX0NUUkxfVENNX0JPVEhFREdFUwkoMHgzIDw8IDgpCisjZGVmaW5lCQlPTUFQX1RJTUVSX0NUUkxfU0NQV00JCSgxIDw8IDcpCisjZGVmaW5lCQlPTUFQX1RJTUVSX0NUUkxfQ0UJCSgxIDw8IDYpIC8qIGNvbXBhcmUgZW5hYmxlICovCisjZGVmaW5lCQlPTUFQX1RJTUVSX0NUUkxfUFJFCQkoMSA8PCA1KSAvKiBwcmVzY2FsZXIgZW5hYmxlICovCisjZGVmaW5lCQlPTUFQX1RJTUVSX0NUUkxfUFRWX1NISUZUCTIgLyogcHJlc2NhbGVyIHZhbHVlIHNoaWZ0ICovCisjZGVmaW5lCQlPTUFQX1RJTUVSX0NUUkxfUE9TVEVECQkoMSA8PCAyKQorI2RlZmluZQkJT01BUF9USU1FUl9DVFJMX0FSCQkoMSA8PCAxKSAvKiBhdXRvLXJlbG9hZCBlbmFibGUgKi8KKyNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9TVAkJKDEgPDwgMCkgLyogc3RhcnQgdGltZXIgKi8KKyNkZWZpbmUgX09NQVBfVElNRVJfQ09VTlRFUl9PRkZTRVQJMHgyOAorI2RlZmluZSBfT01BUF9USU1FUl9MT0FEX09GRlNFVAkJMHgyYworI2RlZmluZSBfT01BUF9USU1FUl9UUklHR0VSX09GRlNFVAkweDMwCisjZGVmaW5lIF9PTUFQX1RJTUVSX1dSSVRFX1BFTkRfT0ZGU0VUCTB4MzQKKyNkZWZpbmUJCVdQX05PTkUJCQkwCS8qIG5vIHdyaXRlIHBlbmRpbmcgYml0ICovCisjZGVmaW5lCQlXUF9UQ0xSCQkJKDEgPDwgMCkKKyNkZWZpbmUJCVdQX1RDUlIJCQkoMSA8PCAxKQorI2RlZmluZQkJV1BfVExEUgkJCSgxIDw8IDIpCisjZGVmaW5lCQlXUF9UVEdSCQkJKDEgPDwgMykKKyNkZWZpbmUJCVdQX1RNQVIJCQkoMSA8PCA0KQorI2RlZmluZQkJV1BfVFBJUgkJCSgxIDw8IDUpCisjZGVmaW5lCQlXUF9UTklSCQkJKDEgPDwgNikKKyNkZWZpbmUJCVdQX1RDVlIJCQkoMSA8PCA3KQorI2RlZmluZQkJV1BfVE9DUgkJCSgxIDw8IDgpCisjZGVmaW5lCQlXUF9UT1dSCQkJKDEgPDwgOSkKKyNkZWZpbmUgX09NQVBfVElNRVJfTUFUQ0hfT0ZGU0VUCTB4MzgKKyNkZWZpbmUgX09NQVBfVElNRVJfQ0FQVFVSRV9PRkZTRVQJMHgzYworI2RlZmluZSBfT01BUF9USU1FUl9JRl9DVFJMX09GRlNFVAkweDQwCisjZGVmaW5lIF9PTUFQX1RJTUVSX0NBUFRVUkUyX09GRlNFVAkJMHg0NAkvKiBUQ0FSMiwgMzR4eCBvbmx5ICovCisjZGVmaW5lIF9PTUFQX1RJTUVSX1RJQ0tfUE9TX09GRlNFVAkJMHg0OAkvKiBUUElSLCAzNHh4IG9ubHkgKi8KKyNkZWZpbmUgX09NQVBfVElNRVJfVElDS19ORUdfT0ZGU0VUCQkweDRjCS8qIFROSVIsIDM0eHggb25seSAqLworI2RlZmluZSBfT01BUF9USU1FUl9USUNLX0NPVU5UX09GRlNFVAkJMHg1MAkvKiBUQ1ZSLCAzNHh4IG9ubHkgKi8KKyNkZWZpbmUgX09NQVBfVElNRVJfVElDS19JTlRfTUFTS19TRVRfT0ZGU0VUCTB4NTQJLyogVE9DUiwgMzR4eCBvbmx5ICovCisjZGVmaW5lIF9PTUFQX1RJTUVSX1RJQ0tfSU5UX01BU0tfQ09VTlRfT0ZGU0VUCTB4NTgJLyogVE9XUiwgMzR4eCBvbmx5ICovCisKKy8qIHJlZ2lzdGVyIG9mZnNldHMgd2l0aCB0aGUgd3JpdGUgcGVuZGluZyBiaXQgZW5jb2RlZCAqLworI2RlZmluZQlXUFNISUZUCQkJCQkxNgorCisjZGVmaW5lIE9NQVBfVElNRVJfSURfUkVHCQkJKF9PTUFQX1RJTUVSX0lEX09GRlNFVCBcCisJCQkJCQkJfCAoV1BfTk9ORSA8PCBXUFNISUZUKSkKKworI2RlZmluZSBPTUFQX1RJTUVSX09DUF9DRkdfUkVHCQkJKF9PTUFQX1RJTUVSX09DUF9DRkdfT0ZGU0VUIFwKKwkJCQkJCQl8IChXUF9OT05FIDw8IFdQU0hJRlQpKQorCisjZGVmaW5lIE9NQVBfVElNRVJfU1lTX1NUQVRfUkVHCQkJKF9PTUFQX1RJTUVSX1NZU19TVEFUX09GRlNFVCBcCisJCQkJCQkJfCAoV1BfTk9ORSA8PCBXUFNISUZUKSkKKworI2RlZmluZSBPTUFQX1RJTUVSX1NUQVRfUkVHCQkJKF9PTUFQX1RJTUVSX1NUQVRfT0ZGU0VUIFwKKwkJCQkJCQl8IChXUF9OT05FIDw8IFdQU0hJRlQpKQorCisjZGVmaW5lIE9NQVBfVElNRVJfSU5UX0VOX1JFRwkJCShfT01BUF9USU1FUl9JTlRfRU5fT0ZGU0VUIFwKKwkJCQkJCQl8IChXUF9OT05FIDw8IFdQU0hJRlQpKQorCisjZGVmaW5lIE9NQVBfVElNRVJfV0FLRVVQX0VOX1JFRwkJKF9PTUFQX1RJTUVSX1dBS0VVUF9FTl9PRkZTRVQgXAorCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCisKKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX1JFRwkJCShfT01BUF9USU1FUl9DVFJMX09GRlNFVCBcCisJCQkJCQkJfCAoV1BfVENMUiA8PCBXUFNISUZUKSkKKworI2RlZmluZSBPTUFQX1RJTUVSX0NPVU5URVJfUkVHCQkJKF9PTUFQX1RJTUVSX0NPVU5URVJfT0ZGU0VUIFwKKwkJCQkJCQl8IChXUF9UQ1JSIDw8IFdQU0hJRlQpKQorCisjZGVmaW5lIE9NQVBfVElNRVJfTE9BRF9SRUcJCQkoX09NQVBfVElNRVJfTE9BRF9PRkZTRVQgXAorCQkJCQkJCXwgKFdQX1RMRFIgPDwgV1BTSElGVCkpCisKKyNkZWZpbmUgT01BUF9USU1FUl9UUklHR0VSX1JFRwkJCShfT01BUF9USU1FUl9UUklHR0VSX09GRlNFVCBcCisJCQkJCQkJfCAoV1BfVFRHUiA8PCBXUFNISUZUKSkKKworI2RlZmluZSBPTUFQX1RJTUVSX1dSSVRFX1BFTkRfUkVHCQkoX09NQVBfVElNRVJfV1JJVEVfUEVORF9PRkZTRVQgXAorCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCisKKyNkZWZpbmUgT01BUF9USU1FUl9NQVRDSF9SRUcJCQkoX09NQVBfVElNRVJfTUFUQ0hfT0ZGU0VUIFwKKwkJCQkJCQl8IChXUF9UTUFSIDw8IFdQU0hJRlQpKQorCisjZGVmaW5lIE9NQVBfVElNRVJfQ0FQVFVSRV9SRUcJCQkoX09NQVBfVElNRVJfQ0FQVFVSRV9PRkZTRVQgXAorCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCisKKyNkZWZpbmUgT01BUF9USU1FUl9JRl9DVFJMX1JFRwkJCShfT01BUF9USU1FUl9JRl9DVFJMX09GRlNFVCBcCisJCQkJCQkJfCAoV1BfTk9ORSA8PCBXUFNISUZUKSkKKworI2RlZmluZSBPTUFQX1RJTUVSX0NBUFRVUkUyX1JFRwkJCShfT01BUF9USU1FUl9DQVBUVVJFMl9PRkZTRVQgXAorCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCisKKyNkZWZpbmUgT01BUF9USU1FUl9USUNLX1BPU19SRUcJCQkoX09NQVBfVElNRVJfVElDS19QT1NfT0ZGU0VUIFwKKwkJCQkJCQl8IChXUF9UUElSIDw8IFdQU0hJRlQpKQorCisjZGVmaW5lIE9NQVBfVElNRVJfVElDS19ORUdfUkVHCQkJKF9PTUFQX1RJTUVSX1RJQ0tfTkVHX09GRlNFVCBcCisJCQkJCQkJfCAoV1BfVE5JUiA8PCBXUFNISUZUKSkKKworI2RlZmluZSBPTUFQX1RJTUVSX1RJQ0tfQ09VTlRfUkVHCQkoX09NQVBfVElNRVJfVElDS19DT1VOVF9PRkZTRVQgXAorCQkJCQkJCXwgKFdQX1RDVlIgPDwgV1BTSElGVCkpCisKKyNkZWZpbmUgT01BUF9USU1FUl9USUNLX0lOVF9NQVNLX1NFVF9SRUcJCQkJXAorCQkoX09NQVBfVElNRVJfVElDS19JTlRfTUFTS19TRVRfT0ZGU0VUIHwgKFdQX1RPQ1IgPDwgV1BTSElGVCkpCisKKyNkZWZpbmUgT01BUF9USU1FUl9USUNLX0lOVF9NQVNLX0NPVU5UX1JFRwkJCQlcCisJCShfT01BUF9USU1FUl9USUNLX0lOVF9NQVNLX0NPVU5UX09GRlNFVCB8IChXUF9UT1dSIDw8IFdQU0hJRlQpKQorCitzdHJ1Y3Qgb21hcF9kbV90aW1lciB7CisJdW5zaWduZWQgbG9uZyBwaHlzX2Jhc2U7CisJaW50IGlycTsKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMlBMVVMKKwlzdHJ1Y3QgY2xrICppY2xrLCAqZmNsazsKKyNlbmRpZgorCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisJdW5zaWduZWQgcmVzZXJ2ZWQ6MTsKKwl1bnNpZ25lZCBlbmFibGVkOjE7CisJdW5zaWduZWQgcG9zdGVkOjE7Cit9OworCitleHRlcm4gdTMyIHN5c190aW1lcl9yZXNlcnZlZDsKK3ZvaWQgb21hcF9kbV90aW1lcl9wcmVwYXJlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CisKK3N0YXRpYyBpbmxpbmUgdTMyIF9fb21hcF9kbV90aW1lcl9yZWFkKHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIHJlZywKKwkJCQkJCWludCBwb3N0ZWQpCit7CisJaWYgKHBvc3RlZCkKKwkJd2hpbGUgKF9fcmF3X3JlYWRsKGJhc2UgKyAoT01BUF9USU1FUl9XUklURV9QRU5EX1JFRyAmIDB4ZmYpKQorCQkJCSYgKHJlZyA+PiBXUFNISUZUKSkKKwkJCWNwdV9yZWxheCgpOworCisJcmV0dXJuIF9fcmF3X3JlYWRsKGJhc2UgKyAocmVnICYgMHhmZikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX3dyaXRlKHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIHJlZywgdTMyIHZhbCwKKwkJCQkJCWludCBwb3N0ZWQpCit7CisJaWYgKHBvc3RlZCkKKwkJd2hpbGUgKF9fcmF3X3JlYWRsKGJhc2UgKyAoT01BUF9USU1FUl9XUklURV9QRU5EX1JFRyAmIDB4ZmYpKQorCQkJCSYgKHJlZyA+PiBXUFNISUZUKSkKKwkJCWNwdV9yZWxheCgpOworCisJX19yYXdfd3JpdGVsKHZhbCwgYmFzZSArIChyZWcgJiAweGZmKSk7Cit9CisKKy8qIEFzc3VtZXMgdGhlIHNvdXJjZSBjbG9jayBoYXMgYmVlbiBzZXQgYnkgY2FsbGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX3Jlc2V0KHZvaWQgX19pb21lbSAqYmFzZSwgaW50IGF1dG9pZGxlLAorCQkJCQkJaW50IHdha2V1cCkKK3sKKwl1MzIgbDsKKworCWwgPSBfX29tYXBfZG1fdGltZXJfcmVhZChiYXNlLCBPTUFQX1RJTUVSX09DUF9DRkdfUkVHLCAwKTsKKwlsIHw9IDB4MDIgPDwgMzsgIC8qIFNldCB0byBzbWFydC1pZGxlIG1vZGUgKi8KKwlsIHw9IDB4MiA8PCA4OyAgIC8qIFNldCBjbG9jayBhY3Rpdml0eSB0byBwZXJzZXJ2ZSBmLWNsb2NrIG9uIGlkbGUgKi8KKworCWlmIChhdXRvaWRsZSkKKwkJbCB8PSAweDEgPDwgMDsKKworCWlmICh3YWtldXApCisJCWwgfD0gMSA8PCAyOworCisJX19vbWFwX2RtX3RpbWVyX3dyaXRlKGJhc2UsIE9NQVBfVElNRVJfT0NQX0NGR19SRUcsIGwsIDApOworCisJLyogTWF0Y2ggaGFyZHdhcmUgcmVzZXQgZGVmYXVsdCBvZiBwb3N0ZWQgbW9kZSAqLworCV9fb21hcF9kbV90aW1lcl93cml0ZShiYXNlLCBPTUFQX1RJTUVSX0lGX0NUUkxfUkVHLAorCQkJCQlPTUFQX1RJTUVSX0NUUkxfUE9TVEVELCAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19vbWFwX2RtX3RpbWVyX3NldF9zb3VyY2Uoc3RydWN0IGNsayAqdGltZXJfZmNrLAorCQkJCQkJc3RydWN0IGNsayAqcGFyZW50KQoreworCWludCByZXQ7CisKKwljbGtfZGlzYWJsZSh0aW1lcl9mY2spOworCXJldCA9IGNsa19zZXRfcGFyZW50KHRpbWVyX2ZjaywgcGFyZW50KTsKKwljbGtfZW5hYmxlKHRpbWVyX2Zjayk7CisKKwkvKgorCSAqIFdoZW4gdGhlIGZ1bmN0aW9uYWwgY2xvY2sgZGlzYXBwZWFycywgdG9vIHF1aWNrIHdyaXRlcyBzZWVtCisJICogdG8gY2F1c2UgYW4gYWJvcnQuIFhYWCBJcyB0aGlzIHN0aWxsIG5lY2Vzc2FyeT8KKwkgKi8KKwlfX2RlbGF5KDMwMDAwMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX3N0b3Aodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgcG9zdGVkLAorCQkJCQkJdW5zaWduZWQgbG9uZyByYXRlKQoreworCXUzMiBsOworCisJbCA9IF9fb21hcF9kbV90aW1lcl9yZWFkKGJhc2UsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIHBvc3RlZCk7CisJaWYgKGwgJiBPTUFQX1RJTUVSX0NUUkxfU1QpIHsKKwkJbCAmPSB+MHgxOworCQlfX29tYXBfZG1fdGltZXJfd3JpdGUoYmFzZSwgT01BUF9USU1FUl9DVFJMX1JFRywgbCwgcG9zdGVkKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMlBMVVMKKwkJLyogUmVhZGJhY2sgdG8gbWFrZSBzdXJlIHdyaXRlIGhhcyBjb21wbGV0ZWQgKi8KKwkJX19vbWFwX2RtX3RpbWVyX3JlYWQoYmFzZSwgT01BUF9USU1FUl9DVFJMX1JFRywgcG9zdGVkKTsKKwkJLyoKKwkJICogV2FpdCBmb3IgZnVuY3Rpb25hbCBjbG9jayBwZXJpb2QgeCAzLjUgdG8gbWFrZSBzdXJlIHRoYXQKKwkJICogdGltZXIgaXMgc3RvcHBlZAorCQkgKi8KKwkJdWRlbGF5KDM1MDAwMDAgLyByYXRlICsgMSk7CisjZW5kaWYKKwl9CisKKwkvKiBBY2sgcG9zc2libHkgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKwlfX29tYXBfZG1fdGltZXJfd3JpdGUoYmFzZSwgT01BUF9USU1FUl9TVEFUX1JFRywKKwkJCQkJT01BUF9USU1FUl9JTlRfT1ZFUkZMT1csIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX2xvYWRfc3RhcnQodm9pZCBfX2lvbWVtICpiYXNlLCB1MzIgY3RybCwKKwkJCQkJCXVuc2lnbmVkIGludCBsb2FkLCBpbnQgcG9zdGVkKQoreworCV9fb21hcF9kbV90aW1lcl93cml0ZShiYXNlLCBPTUFQX1RJTUVSX0NPVU5URVJfUkVHLCBsb2FkLCBwb3N0ZWQpOworCV9fb21hcF9kbV90aW1lcl93cml0ZShiYXNlLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBjdHJsLCBwb3N0ZWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX2ludF9lbmFibGUodm9pZCBfX2lvbWVtICpiYXNlLAorCQkJCQkJdW5zaWduZWQgaW50IHZhbHVlKQoreworCV9fb21hcF9kbV90aW1lcl93cml0ZShiYXNlLCBPTUFQX1RJTUVSX0lOVF9FTl9SRUcsIHZhbHVlLCAwKTsKKwlfX29tYXBfZG1fdGltZXJfd3JpdGUoYmFzZSwgT01BUF9USU1FUl9XQUtFVVBfRU5fUkVHLCB2YWx1ZSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIodm9pZCBfX2lvbWVtICpiYXNlLAorCQkJCQkJCWludCBwb3N0ZWQpCit7CisJcmV0dXJuIF9fb21hcF9kbV90aW1lcl9yZWFkKGJhc2UsIE9NQVBfVElNRVJfQ09VTlRFUl9SRUcsIHBvc3RlZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX29tYXBfZG1fdGltZXJfd3JpdGVfc3RhdHVzKHZvaWQgX19pb21lbSAqYmFzZSwKKwkJCQkJCXVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlfX29tYXBfZG1fdGltZXJfd3JpdGUoYmFzZSwgT01BUF9USU1FUl9TVEFUX1JFRywgdmFsdWUsIDApOworfQogCiAjZW5kaWYgLyogX19BU01fQVJDSF9ETVRJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZmxhc2guaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZmxhc2guaAppbmRleCAzMDgzMTk1Li4wZDg4NDk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2ZsYXNoLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9mbGFzaC5oCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7CiBleHRlcm4gdm9pZCBvbWFwMV9zZXRfdnBwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCBlbmFibGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZ3Bpby5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9ncGlvLmgKaW5kZXggZWM5N2UwMC4uOTFlOGRlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9ncGlvLmgKQEAgLTE3NCwxMiArMTc0LDMyIEBACiAJYm9vbCBkYmNrX2ZsYWc7CQkvKiBkYmNrIHJlcXVpcmVkIG9yIG5vdCAtIFRydWUgZm9yIE9NQVAzJjQgKi8KIH07CiAKK3N0cnVjdCBvbWFwX2dwaW9fcmVnX29mZnMgeworCXUxNiByZXZpc2lvbjsKKwl1MTYgZGlyZWN0aW9uOworCXUxNiBkYXRhaW47CisJdTE2IGRhdGFvdXQ7CisJdTE2IHNldF9kYXRhb3V0OworCXUxNiBjbHJfZGF0YW91dDsKKwl1MTYgaXJxc3RhdHVzOworCXUxNiBpcnFzdGF0dXMyOworCXUxNiBpcnFlbmFibGU7CisJdTE2IHNldF9pcnFlbmFibGU7CisJdTE2IGNscl9pcnFlbmFibGU7CisJdTE2IGRlYm91bmNlOworCXUxNiBkZWJvdW5jZV9lbjsKKworCWJvb2wgaXJxZW5hYmxlX2ludjsKK307CisKIHN0cnVjdCBvbWFwX2dwaW9fcGxhdGZvcm1fZGF0YSB7CiAJdTE2IHZpcnR1YWxfaXJxX3N0YXJ0OwogCWludCBiYW5rX3R5cGU7CiAJaW50IGJhbmtfd2lkdGg7CQkvKiBHUElPIGJhbmsgd2lkdGggKi8KIAlpbnQgYmFua19zdHJpZGU7CS8qIE9ubHkgbmVlZGVkIGZvciBvbWFwMSBNUFVJTyAqLwogCWJvb2wgZGJja19mbGFnOwkJLyogZGJjayByZXF1aXJlZCBvciBub3QgLSBUcnVlIGZvciBPTUFQMyY0ICovCisKKwlzdHJ1Y3Qgb21hcF9ncGlvX3JlZ19vZmZzICpyZWdzOwogfTsKIAogLyogVE9ETzogQW5hbHl6ZSByZW1vdmluZyBncGlvX2JhbmtfY291bnQgdXNhZ2UgZnJvbSBkcml2ZXIgY29kZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb3ZtbS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb3ZtbS5oCmluZGV4IDMyYTJmNmMuLmU5OTJiOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW92bW0uaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvdm1tLmgKQEAgLTI5LDkgKzI5LDYgQEAKICAqIGxvd2VyIDE2IGJpdCBpcyB1c2VkIGZvciBoL3cgYW5kIHVwcGVyIDE2IGJpdCBpcyBmb3Igcy93LgogICovCiAjZGVmaW5lIElPVk1GX1NXX1NISUZUCQkxNgotI2RlZmluZSBJT1ZNRl9IV19TSVpFCQkoMSA8PCBJT1ZNRl9TV19TSElGVCkKLSNkZWZpbmUgSU9WTUZfSFdfTUFTSwkJKElPVk1GX0hXX1NJWkUgLSAxKQotI2RlZmluZSBJT1ZNRl9TV19NQVNLCQkofklPVk1GX0hXX01BU0spVUwKIAogLyoKICAqIGlvdm1hOiBoL3cgZmxhZ3MgZGVyaXZlZCBmcm9tIGNhbSBhbmQgcmFtIGF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pcnFzLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lycXMuaAppbmRleCA1YTI1MDk4Li5jODg0MzIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lycXMuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lycXMuaApAQCAtNDI4LDcgKzQyOCwxMSBAQAogI2RlZmluZSBJTlRDUFNfTlJfSVJRUwkJOTYKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KLWV4dGVybiB2b2lkIG9tYXBfaW5pdF9pcnEodm9pZCk7CitleHRlcm4gdm9pZCBfX2lvbWVtICpvbWFwX2lycV9iYXNlOwordm9pZCBvbWFwMV9pbml0X2lycSh2b2lkKTsKK3ZvaWQgb21hcDJfaW5pdF9pcnEodm9pZCk7Cit2b2lkIG9tYXAzX2luaXRfaXJxKHZvaWQpOwordm9pZCB0aTgxNnhfaW5pdF9pcnEodm9pZCk7CiBleHRlcm4gaW50IG9tYXBfaXJxX3BlbmRpbmcodm9pZCk7CiB2b2lkIG9tYXBfaW50Y19zYXZlX2NvbnRleHQodm9pZCk7CiB2b2lkIG9tYXBfaW50Y19yZXN0b3JlX2NvbnRleHQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21jYnNwLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21jYnNwLmgKaW5kZXggZjhmNjkwYS4uOTg4MmM2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tY2JzcC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbWNic3AuaApAQCAtMjQsNyArMjQsNiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX09NQVBfTUNCU1BfSAogI2RlZmluZSBfX0FTTV9BUkNIX09NQVBfTUNCU1BfSAogCi0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0zNCw3ICszMyw3IEBACiAjZGVmaW5lIE9NQVBfTUNCU1BfUExBVEZPUk1fREVWSUNFKHBvcnRfbnIpCQlcCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwX21jYnNwIyNwb3J0X25yID0gewlcCiAJLm5hbWUJPSAib21hcC1tY2JzcC1kYWkiLAkJCVwKLQkuaWQJPSBPTUFQX01DQlNQIyNwb3J0X25yLAkJCVwKKwkuaWQJPSBwb3J0X25yIC0gMSwJCQlcCiB9CiAKICNkZWZpbmUgTUNCU1BfQ09ORklHX1RZUEUyCTB4MgpAQCAtMzMzLDE4ICszMzIsNiBAQAogfTsKIAogdHlwZWRlZiBlbnVtIHsKLQlPTUFQX01DQlNQMSA9IDAsCi0JT01BUF9NQ0JTUDIsCi0JT01BUF9NQ0JTUDMsCi0JT01BUF9NQ0JTUDQsCi0JT01BUF9NQ0JTUDUKLX0gb21hcF9tY2JzcF9pZDsKLQotdHlwZWRlZiBpbnQgX19iaXR3aXNlIG9tYXBfbWNic3BfaW9fdHlwZV90OwotI2RlZmluZSBPTUFQX01DQlNQX0lSUV9JTyAoKF9fZm9yY2Ugb21hcF9tY2JzcF9pb190eXBlX3QpIDEpCi0jZGVmaW5lIE9NQVBfTUNCU1BfUE9MTF9JTyAoKF9fZm9yY2Ugb21hcF9tY2JzcF9pb190eXBlX3QpIDIpCi0KLXR5cGVkZWYgZW51bSB7CiAJT01BUF9NQ0JTUF9XT1JEXzggPSAwLAogCU9NQVBfTUNCU1BfV09SRF8xMiwKIAlPTUFQX01DQlNQX1dPUkRfMTYsCkBAIC0zNTMsMzggKzM0MCw2IEBACiAJT01BUF9NQ0JTUF9XT1JEXzMyLAogfSBvbWFwX21jYnNwX3dvcmRfbGVuZ3RoOwogCi10eXBlZGVmIGVudW0gewotCU9NQVBfTUNCU1BfQ0xLX1JJU0lORyA9IDAsCi0JT01BUF9NQ0JTUF9DTEtfRkFMTElORywKLX0gb21hcF9tY2JzcF9jbGtfcG9sYXJpdHk7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JT01BUF9NQ0JTUF9GU19BQ1RJVkVfSElHSCA9IDAsCi0JT01BUF9NQ0JTUF9GU19BQ1RJVkVfTE9XLAotfSBvbWFwX21jYnNwX2ZzX3BvbGFyaXR5OwotCi10eXBlZGVmIGVudW0gewotCU9NQVBfTUNCU1BfQ0xLX1NUUF9NT0RFX05PX0RFTEFZID0gMCwKLQlPTUFQX01DQlNQX0NMS19TVFBfTU9ERV9ERUxBWSwKLX0gb21hcF9tY2JzcF9jbGtfc3RwX21vZGU7Ci0KLQotLyoqKioqKiogU1BJIHNwZWNpZmljIG1vZGUgKioqKioqKioqKi8KLXR5cGVkZWYgZW51bSB7Ci0JT01BUF9NQ0JTUF9TUElfTUFTVEVSID0gMCwKLQlPTUFQX01DQlNQX1NQSV9TTEFWRSwKLX0gb21hcF9tY2JzcF9zcGlfbW9kZTsKLQotc3RydWN0IG9tYXBfbWNic3Bfc3BpX2NmZyB7Ci0Jb21hcF9tY2JzcF9zcGlfbW9kZQkJc3BpX21vZGU7Ci0Jb21hcF9tY2JzcF9jbGtfcG9sYXJpdHkJCXJ4X2Nsb2NrX3BvbGFyaXR5OwotCW9tYXBfbWNic3BfY2xrX3BvbGFyaXR5CQl0eF9jbG9ja19wb2xhcml0eTsKLQlvbWFwX21jYnNwX2ZzX3BvbGFyaXR5CQlmc3hfcG9sYXJpdHk7Ci0JdTgJCQkJY2xrX2RpdjsKLQlvbWFwX21jYnNwX2Nsa19zdHBfbW9kZQkJY2xrX3N0cF9tb2RlOwotCW9tYXBfbWNic3Bfd29yZF9sZW5ndGgJCXdvcmRfbGVuZ3RoOwotfTsKLQogLyogUGxhdGZvcm0gc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLwogc3RydWN0IG9tYXBfbWNic3Bfb3BzIHsKIAl2b2lkICgqcmVxdWVzdCkodW5zaWduZWQgaW50KTsKQEAgLTQyMiwyNSArMzc3LDEzIEBACiAJdm9pZCBfX2lvbWVtICppb19iYXNlOwogCXU4IGlkOwogCXU4IGZyZWU7Ci0Jb21hcF9tY2JzcF93b3JkX2xlbmd0aCByeF93b3JkX2xlbmd0aDsKLQlvbWFwX21jYnNwX3dvcmRfbGVuZ3RoIHR4X3dvcmRfbGVuZ3RoOwogCi0Jb21hcF9tY2JzcF9pb190eXBlX3QgaW9fdHlwZTsgLyogSVJRIG9yIHBvbGwgKi8KLQkvKiBJUlEgYmFzZWQgVFgvUlggKi8KIAlpbnQgcnhfaXJxOwogCWludCB0eF9pcnE7CiAKIAkvKiBETUEgc3R1ZmYgKi8KIAl1OCBkbWFfcnhfc3luYzsKLQlzaG9ydCBkbWFfcnhfbGNoOwogCXU4IGRtYV90eF9zeW5jOwotCXNob3J0IGRtYV90eF9sY2g7Ci0KLQkvKiBDb21wbGV0aW9uIHF1ZXVlcyAqLwotCXN0cnVjdCBjb21wbGV0aW9uIHR4X2lycV9jb21wbGV0aW9uOwotCXN0cnVjdCBjb21wbGV0aW9uIHJ4X2lycV9jb21wbGV0aW9uOwotCXN0cnVjdCBjb21wbGV0aW9uIHR4X2RtYV9jb21wbGV0aW9uOwotCXN0cnVjdCBjb21wbGV0aW9uIHJ4X2RtYV9jb21wbGV0aW9uOwogCiAJLyogUHJvdGVjdCB0aGUgZmllbGQgLmZyZWUsIHdoaWxlIGNoZWNraW5nIGlmIHRoZSBtY2JzcCBpcyBpbiB1c2UgKi8KIAlzcGlubG9ja190IGxvY2s7CkBAIC00OTksMjQgKzQ0Miw5IEBACiB2b2lkIG9tYXBfbWNic3BfZnJlZSh1bnNpZ25lZCBpbnQgaWQpOwogdm9pZCBvbWFwX21jYnNwX3N0YXJ0KHVuc2lnbmVkIGludCBpZCwgaW50IHR4LCBpbnQgcngpOwogdm9pZCBvbWFwX21jYnNwX3N0b3AodW5zaWduZWQgaW50IGlkLCBpbnQgdHgsIGludCByeCk7Ci12b2lkIG9tYXBfbWNic3BfeG1pdF93b3JkKHVuc2lnbmVkIGludCBpZCwgdTMyIHdvcmQpOwotdTMyIG9tYXBfbWNic3BfcmVjdl93b3JkKHVuc2lnbmVkIGludCBpZCk7Ci0KLWludCBvbWFwX21jYnNwX3htaXRfYnVmZmVyKHVuc2lnbmVkIGludCBpZCwgZG1hX2FkZHJfdCBidWZmZXIsIHVuc2lnbmVkIGludCBsZW5ndGgpOwotaW50IG9tYXBfbWNic3BfcmVjdl9idWZmZXIodW5zaWduZWQgaW50IGlkLCBkbWFfYWRkcl90IGJ1ZmZlciwgdW5zaWduZWQgaW50IGxlbmd0aCk7Ci1pbnQgb21hcF9tY2JzcF9zcGlfbWFzdGVyX3htaXRfd29yZF9wb2xsKHVuc2lnbmVkIGludCBpZCwgdTMyIHdvcmQpOwotaW50IG9tYXBfbWNic3Bfc3BpX21hc3Rlcl9yZWN2X3dvcmRfcG9sbCh1bnNpZ25lZCBpbnQgaWQsIHUzMiAqIHdvcmQpOwotCiAKIC8qIE1jQlNQIGZ1bmN0aW9uYWwgY2xvY2sgc291cmNlIGNoYW5naW5nIGZ1bmN0aW9uICovCiBleHRlcm4gaW50IG9tYXAyX21jYnNwX3NldF9jbGtzX3NyYyh1OCBpZCwgdTggZmNrX3NyY19pZCk7Ci0vKiBTUEkgc3BlY2lmaWMgQVBJICovCi12b2lkIG9tYXBfbWNic3Bfc2V0X3NwaV9tb2RlKHVuc2lnbmVkIGludCBpZCwgY29uc3Qgc3RydWN0IG9tYXBfbWNic3Bfc3BpX2NmZyAqIHNwaV9jZmcpOwotCi0vKiBQb2xsZWQgcmVhZC93cml0ZSBmdW5jdGlvbnMgKi8KLWludCBvbWFwX21jYnNwX3BvbGxyZWFkKHVuc2lnbmVkIGludCBpZCwgdTE2ICogYnVmKTsKLWludCBvbWFwX21jYnNwX3BvbGx3cml0ZSh1bnNpZ25lZCBpbnQgaWQsIHUxNiBidWYpOwotaW50IG9tYXBfbWNic3Bfc2V0X2lvX3R5cGUodW5zaWduZWQgaW50IGlkLCBvbWFwX21jYnNwX2lvX3R5cGVfdCBpb190eXBlKTsKIAogLyogTWNCU1Agc2lnbmFsIG11eGluZyBBUEkgKi8KIHZvaWQgb21hcDJfbWNic3AxX211eF9jbGtyX3NyYyh1OCBtdXgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tbWMuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbW1jLmgKaW5kZXggZjM4ZmVmOS4uYzdiODc0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tbWMuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21tYy5oCkBAIC0xMDEsNiArMTAxLDkgQEAKIAkJLyogSWYgdXNpbmcgcG93ZXJfc2F2aW5nIGFuZCB0aGUgTU1DIHBvd2VyIGlzIG5vdCB0byBnbyBvZmYgKi8KIAkJdW5zaWduZWQgbm9fb2ZmOjE7CiAKKwkJLyogZU1NQyBkb2VzIG5vdCBoYW5kbGUgcG93ZXIgb2ZmIHdoZW4gbm90IGluIHNsZWVwIHN0YXRlICovCisJCXVuc2lnbmVkIG5vX3JlZ3VsYXRvcl9vZmZfaW5pdDoxOworCiAJCS8qIFJlZ3VsYXRvciBvZmYgcmVtYXBwZWQgdG8gc2xlZXAgKi8KIAkJdW5zaWduZWQgdmNjX2F1eF9kaXNhYmxlX2lzX3NsZWVwOjE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbmFuZC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9uYW5kLmgKaW5kZXggZDg2ZDFlYy4uNjdmYzUwNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9uYW5kLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9uYW5kLmgKQEAgLTE5LDE1ICsxOSwxMSBAQAogfTsKIAogc3RydWN0IG9tYXBfbmFuZF9wbGF0Zm9ybV9kYXRhIHsKLQl1bnNpZ25lZCBpbnQJCW9wdGlvbnM7CiAJaW50CQkJY3M7Ci0JaW50CQkJZ3Bpb19pcnE7CiAJc3RydWN0IG10ZF9wYXJ0aXRpb24JKnBhcnRzOwogCXN0cnVjdCBncG1jX3RpbWluZ3MJKmdwbWNfdDsKIAlpbnQJCQlucl9wYXJ0czsKLQlpbnQJCQkoKm5hbmRfc2V0dXApKHZvaWQpOwotCWludAkJCSgqZGV2X3JlYWR5KShzdHJ1Y3Qgb21hcF9uYW5kX3BsYXRmb3JtX2RhdGEgKik7Ci0JaW50CQkJZG1hX2NoYW5uZWw7CisJYm9vbAkJCWRldl9yZWFkeTsKIAlpbnQJCQlncG1jX2lycTsKIAllbnVtIG5hbmRfaW8JCXhmZXJfdHlwZTsKIAl1bnNpZ25lZCBsb25nCQlwaHlzX2Jhc2U7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXAtcG0uaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcC1wbS5oCmluZGV4IGMwYTc1MjAuLjA4NDBkZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcC1wbS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcC1wbS5oCkBAIC00MCwxMSArNDAsNyBAQAogICogZnJhbWV3b3JrIHN0YXJ0cy4gIFRoZSAiX2lmXyIgaXMgdG8gYXZvaWQgbmFtZSBjb2xsaXNpb25zIHdpdGggdGhlCiAgKiBQTSBpZGxlLWxvb3AgY29kZS4KICAqLwotI2lmZGVmIENPTkZJR19PTUFQX1BNX05PTkUKLSNkZWZpbmUgb21hcF9wbV9pZl9lYXJseV9pbml0KCkgMAotI2Vsc2UKIGludCBfX2luaXQgb21hcF9wbV9pZl9lYXJseV9pbml0KHZvaWQpOwotI2VuZGlmCiAKIC8qKgogICogb21hcF9wbV9pZl9pbml0IC0gT01BUCBQTSBpbml0IGNvZGUgY2FsbGVkIGFmdGVyIGNsb2NrIGZ3IGluaXQKQEAgLTUyLDExICs0OCw3IEBACiAgKiBUaGUgbWFpbiBpbml0aWFsaXphdGlvbiBjb2RlLiAgT1BQIHRhYmxlcyBhcmUgcGFzc2VkIGluIGhlcmUuICBUaGUKICAqICJfaWZfIiBpcyB0byBhdm9pZCBuYW1lIGNvbGxpc2lvbnMgd2l0aCB0aGUgUE0gaWRsZS1sb29wIGNvZGUuCiAgKi8KLSNpZmRlZiBDT05GSUdfT01BUF9QTV9OT05FCi0jZGVmaW5lIG9tYXBfcG1faWZfaW5pdCgpIDAKLSNlbHNlCiBpbnQgX19pbml0IG9tYXBfcG1faWZfaW5pdCh2b2lkKTsKLSNlbmRpZgogCiAvKioKICAqIG9tYXBfcG1faWZfZXhpdCAtIE9NQVAgUE0gZXhpdCBjb2RlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfZGV2aWNlLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfZGV2aWNlLmgKaW5kZXggZTRjMzQ5Zi4uZWU0MDViMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9kZXZpY2UuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfZGV2aWNlLmgKQEAgLTQ0LDYgKzQ0LDEwIEBACiAjZGVmaW5lIE9NQVBfREVWSUNFX1NUQVRFX0lETEUJCTIKICNkZWZpbmUgT01BUF9ERVZJQ0VfU1RBVEVfU0hVVERPV04JMwogCisvKiBvbWFwX2RldmljZS5mbGFncyB2YWx1ZXMgKi8KKyNkZWZpbmUgT01BUF9ERVZJQ0VfU1VTUEVOREVEIEJJVCgwKQorI2RlZmluZSBPTUFQX0RFVklDRV9OT19JRExFX09OX1NVU1BFTkQgQklUKDEpCisKIC8qKgogICogc3RydWN0IG9tYXBfZGV2aWNlIC0gb21hcF9kZXZpY2Ugd3JhcHBlciBmb3IgcGxhdGZvcm1fZGV2aWNlcwogICogQHBkZXY6IHBsYXRmb3JtX2RldmljZQpAQCAtNzMsNiArNzcsNyBAQAogCXM4CQkJCXBtX2xhdF9sZXZlbDsKIAl1OAkJCQlod21vZHNfY250OwogCXU4CQkJCV9zdGF0ZTsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOwogfTsKIAogLyogRGV2aWNlIGRyaXZlciBpbnRlcmZhY2UgKGNhbGwgdmlhIHBsYXRmb3JtX2RhdGEgZm4gcHRycykgKi8KQEAgLTExNyw2ICsxMjIsMTAgQEAKIGludCBvbWFwX2RldmljZV9kaXNhYmxlX2Nsb2NrcyhzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kKTsKIGludCBvbWFwX2RldmljZV9lbmFibGVfY2xvY2tzKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpOwogCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9kZXZpY2VfZGlzYWJsZV9pZGxlX29uX3N1c3BlbmQoc3RydWN0IG9tYXBfZGV2aWNlICpvZCkKK3sKKwlvZC0+ZmxhZ3MgfD0gT01BUF9ERVZJQ0VfTk9fSURMRV9PTl9TVVNQRU5EOworfQogCiAvKgogICogRW50cmllcyBzaG91bGQgYmUga2VwdCBpbiBsYXRlbmN5IG9yZGVyIGFzY2VuZGluZwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwX2h3bW9kLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfaHdtb2QuaAppbmRleCAxYWRlYTljLi5jZTA2YWM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfaHdtb2QuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfaHdtb2QuaApAQCAtNzcsNyArNzcsNiBAQAogI2RlZmluZSBIV01PRF9JRExFTU9ERV9GT1JDRQkJKDEgPDwgMCkKICNkZWZpbmUgSFdNT0RfSURMRU1PREVfTk8JCSgxIDw8IDEpCiAjZGVmaW5lIEhXTU9EX0lETEVNT0RFX1NNQVJUCQkoMSA8PCAyKQotLyogU2xhdmUgaWRsZSBtb2RlIGZsYWcgb25seSAqLwogI2RlZmluZSBIV01PRF9JRExFTU9ERV9TTUFSVF9XS1VQCSgxIDw8IDMpCiAKIC8qKgpAQCAtOTgsNyArOTcsNyBAQAogLyoqCiAgKiBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyAtIE1QVSBJUlFzIHVzZWQgYnkgdGhlIGh3bW9kCiAgKiBAbmFtZTogbmFtZSBvZiB0aGUgSVJRIGNoYW5uZWwgKG1vZHVsZSBsb2NhbCBuYW1lKQotICogQGlycV9jaDogSVJRIGNoYW5uZWwgSUQKKyAqIEBpcnE6IElSUSBjaGFubmVsIElEIChzaG91bGQgYmUgbm9uLW5lZ2F0aXZlIGV4Y2VwdCAtMSA9IHRlcm1pbmF0b3IpCiAgKgogICogQG5hbWUgc2hvdWxkIGJlIHNvbWV0aGluZyBzaG9ydCwgZS5nLiwgInR4IiBvciAicngiLiAgSXQgaXMgZm9yIHVzZQogICogYnkgcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZSgpLiAgSXQgaXMgZGVmaW5lZCBsb2NhbGx5IHRvIHRoZQpAQCAtMTA2LDEzICsxMDUsMTMgQEAKICAqLwogc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gewogCWNvbnN0IGNoYXIJKm5hbWU7Ci0JdTE2CQlpcnE7CisJczE2CQlpcnE7CiB9OwogCiAvKioKICAqIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIC0gRE1BIGNoYW5uZWxzIHVzZWQgYnkgdGhlIGh3bW9kCiAgKiBAbmFtZTogbmFtZSBvZiB0aGUgRE1BIGNoYW5uZWwgKG1vZHVsZSBsb2NhbCBuYW1lKQotICogQGRtYV9yZXE6IERNQSByZXF1ZXN0IElECisgKiBAZG1hX3JlcTogRE1BIHJlcXVlc3QgSUQgKHNob3VsZCBiZSBub24tbmVnYXRpdmUgZXhjZXB0IC0xID0gdGVybWluYXRvcikKICAqCiAgKiBAbmFtZSBzaG91bGQgYmUgc29tZXRoaW5nIHNob3J0LCBlLmcuLCAidHgiIG9yICJyeCIuICBJdCBpcyBmb3IgdXNlCiAgKiBieSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKCkuICBJdCBpcyBkZWZpbmVkIGxvY2FsbHkgdG8gdGhlCkBAIC0xMjAsNyArMTE5LDcgQEAKICAqLwogc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gewogCWNvbnN0IGNoYXIJKm5hbWU7Ci0JdTE2CQlkbWFfcmVxOworCXMxNgkJZG1hX3JlcTsKIH07CiAKIC8qKgpAQCAtMjIwLDcgKzIxOSw2IEBACiAgKiBAY2xrOiBpbnRlcmZhY2UgY2xvY2s6IE9NQVAgY2xvY2sgbmFtZQogICogQF9jbGs6IHBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3QgY2xrIChmaWxsZWQgaW4gYXQgcnVudGltZSkKICAqIEBmdzogaW50ZXJmYWNlIGZpcmV3YWxsIGRhdGEKLSAqIEBhZGRyX2NudDogQVJSQVlfU0laRShAYWRkcikKICAqIEB3aWR0aDogT0NQIGRhdGEgd2lkdGgKICAqIEB1c2VyOiBpbml0aWF0b3JzIHVzaW5nIHRoaXMgaW50ZXJmYWNlIChzZWUgT0NQX1VTRVJfKiBtYWNyb3MgYWJvdmUpCiAgKiBAZmxhZ3M6IE9DUCBpbnRlcmZhY2UgZmxhZ3MgKHNlZSBPQ1BJRl8qIG1hY3JvcyBhYm92ZSkKQEAgLTIzOSw3ICsyMzcsNiBAQAogCXVuaW9uIHsKIAkJc3RydWN0IG9tYXBfaHdtb2Rfb21hcDJfZmlyZXdhbGwgb21hcDI7CiAJfQkJCQlmdzsKLQl1OAkJCQlhZGRyX2NudDsKIAl1OAkJCQl3aWR0aDsKIAl1OAkJCQl1c2VyOwogCXU4CQkJCWZsYWdzOwpAQCAtMjU4LDYgKzI1NSw3IEBACiAjZGVmaW5lIE1TVEFOREJZX0ZPUkNFCQkoSFdNT0RfSURMRU1PREVfRk9SQ0UgPDwgTUFTVEVSX1NUQU5EQllfU0hJRlQpCiAjZGVmaW5lIE1TVEFOREJZX05PCQkoSFdNT0RfSURMRU1PREVfTk8gPDwgTUFTVEVSX1NUQU5EQllfU0hJRlQpCiAjZGVmaW5lIE1TVEFOREJZX1NNQVJUCQkoSFdNT0RfSURMRU1PREVfU01BUlQgPDwgTUFTVEVSX1NUQU5EQllfU0hJRlQpCisjZGVmaW5lIE1TVEFOREJZX1NNQVJUX1dLVVAJKEhXTU9EX0lETEVNT0RFX1NNQVJUX1dLVVAgPDwgTUFTVEVSX1NUQU5EQllfU0hJRlQpCiAKIC8qIG9tYXBfaHdtb2Rfc3lzY29uZmlnLnN5c2NfZmxhZ3MgY2FwYWJpbGl0eSBmbGFncyAqLwogI2RlZmluZSBTWVNDX0hBU19BVVRPSURMRQkoMSA8PCAwKQpAQCAtNDY4LDggKzQ2Niw4IEBACiAgKiBAbmFtZTogbmFtZSBvZiB0aGUgaHdtb2QKICAqIEBjbGFzczogc3RydWN0IG9tYXBfaHdtb2RfY2xhc3MgKiB0byB0aGUgY2xhc3Mgb2YgdGhpcyBod21vZAogICogQG9kOiBzdHJ1Y3Qgb21hcF9kZXZpY2UgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGh3bW9kIChpbnRlcm5hbCB1c2UpCi0gKiBAbXB1X2lycXM6IHB0ciB0byBhbiBhcnJheSBvZiBNUFUgSVJRcyAoc2VlIGFsc28gbXB1X2lycXNfY250KQotICogQHNkbWFfcmVxczogcHRyIHRvIGFuIGFycmF5IG9mIFN5c3RlbSBETUEgcmVxdWVzdCBJRHMgKHNlZSBzZG1hX3JlcXNfY250KQorICogQG1wdV9pcnFzOiBwdHIgdG8gYW4gYXJyYXkgb2YgTVBVIElSUXMKKyAqIEBzZG1hX3JlcXM6IHB0ciB0byBhbiBhcnJheSBvZiBTeXN0ZW0gRE1BIHJlcXVlc3QgSURzCiAgKiBAcHJjbTogUFJDTSBkYXRhIHBlcnRhaW5pbmcgdG8gdGhpcyBod21vZAogICogQG1haW5fY2xrOiBtYWluIGNsb2NrOiBPTUFQIGNsb2NrIG5hbWUKICAqIEBfY2xrOiBwb2ludGVyIHRvIHRoZSBtYWluIHN0cnVjdCBjbGsgKGZpbGxlZCBpbiBhdCBydW50aW1lKQpAQCAtNDgyLDggKzQ4MCw2IEBACiAgKiBAX3N5c2NfY2FjaGU6IGludGVybmFsLXVzZSBod21vZCBmbGFncwogICogQF9tcHVfcnRfdmE6IGNhY2hlZCByZWdpc3RlciB0YXJnZXQgc3RhcnQgYWRkcmVzcyAoaW50ZXJuYWwgdXNlKQogICogQF9tcHVfcG9ydF9pbmRleDogY2FjaGVkIE1QVSByZWdpc3RlciB0YXJnZXQgc2xhdmUgSUQgKGludGVybmFsIHVzZSkKLSAqIEBtcHVfaXJxc19jbnQ6IG51bWJlciBvZiBAbXB1X2lycXMKLSAqIEBzZG1hX3JlcXNfY250OiBudW1iZXIgb2YgQHNkbWFfcmVxcwogICogQG9wdF9jbGtzX2NudDogbnVtYmVyIG9mIEBvcHRfY2xrcwogICogQG1hc3Rlcl9jbnQ6IG51bWJlciBvZiBAbWFzdGVyIGVudHJpZXMKICAqIEBzbGF2ZXNfY250OiBudW1iZXIgb2YgQHNsYXZlIGVudHJpZXMKQEAgLTUzMSw4ICs1MjcsNiBAQAogCXUxNgkJCQlmbGFnczsKIAl1OAkJCQlfbXB1X3BvcnRfaW5kZXg7CiAJdTgJCQkJcmVzcG9uc2VfbGF0OwotCXU4CQkJCW1wdV9pcnFzX2NudDsKLQl1OAkJCQlzZG1hX3JlcXNfY250OwogCXU4CQkJCXJzdF9saW5lc19jbnQ7CiAJdTgJCQkJb3B0X2Nsa3NfY250OwogCXU4CQkJCW1hc3RlcnNfY250OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2lvdm1tLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW92bW0uYwppbmRleCA1MWVmNDNlLi44M2EzN2M1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW92bW0uYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW92bW0uYwpAQCAtNjQ4LDcgKzY0OCw2IEBACiAJCQlyZXR1cm4gUFRSX0VSUih2YSk7CiAJfQogCi0JZmxhZ3MgJj0gSU9WTUZfSFdfTUFTSzsKIAlmbGFncyB8PSBJT1ZNRl9ESVNDT05UOwogCWZsYWdzIHw9IElPVk1GX01NSU87CiAKQEAgLTcwNiw3ICs3MDUsNiBAQAogCWlmICghdmEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZmxhZ3MgJj0gSU9WTUZfSFdfTUFTSzsKIAlmbGFncyB8PSBJT1ZNRl9ESVNDT05UOwogCWZsYWdzIHw9IElPVk1GX0FMTE9DOwogCkBAIC03OTUsNyArNzkzLDYgQEAKIAlpZiAoIXZhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZsYWdzICY9IElPVk1GX0hXX01BU0s7CiAJZmxhZ3MgfD0gSU9WTUZfTElORUFSOwogCWZsYWdzIHw9IElPVk1GX01NSU87CiAKQEAgLTg1Myw3ICs4NTAsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlwYSA9IHZpcnRfdG9fcGh5cyh2YSk7CiAKLQlmbGFncyAmPSBJT1ZNRl9IV19NQVNLOwogCWZsYWdzIHw9IElPVk1GX0xJTkVBUjsKIAlmbGFncyB8PSBJT1ZNRl9BTExPQzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYwppbmRleCA1NTg3YWNmLi4zYzFmYmRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYwpAQCAtMTYsOCArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpAQCAtMjUsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi0jaW5jbHVkZSA8cGxhdC9kbWEuaD4KICNpbmNsdWRlIDxwbGF0L21jYnNwLmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KQEAgLTEzNiw4ICsxMzMsNiBAQAogCQkJaXJxc3Rfc3BjcjIpOwogCQkvKiBXcml0aW5nIHplcm8gdG8gWFNZTkNfRVJSIGNsZWFycyB0aGUgSVJRICovCiAJCU1DQlNQX1dSSVRFKG1jYnNwX3R4LCBTUENSMiwgTUNCU1BfUkVBRF9DQUNIRShtY2JzcF90eCwgU1BDUjIpKTsKLQl9IGVsc2UgewotCQljb21wbGV0ZSgmbWNic3BfdHgtPnR4X2lycV9jb21wbGV0aW9uKTsKIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0xNTYsNDEgKzE1MSwxMSBAQAogCQkJaXJxc3Rfc3BjcjEpOwogCQkvKiBXcml0aW5nIHplcm8gdG8gUlNZTkNfRVJSIGNsZWFycyB0aGUgSVJRICovCiAJCU1DQlNQX1dSSVRFKG1jYnNwX3J4LCBTUENSMSwgTUNCU1BfUkVBRF9DQUNIRShtY2JzcF9yeCwgU1BDUjEpKTsKLQl9IGVsc2UgewotCQljb21wbGV0ZSgmbWNic3BfcngtPnJ4X2lycV9jb21wbGV0aW9uKTsKIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIG9tYXBfbWNic3BfdHhfZG1hX2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwX2RtYV90eCA9IGRhdGE7Ci0KLQlkZXZfZGJnKG1jYnNwX2RtYV90eC0+ZGV2LCAiVFggRE1BIGNhbGxiYWNrIDogMHgleFxuIiwKLQkJTUNCU1BfUkVBRChtY2JzcF9kbWFfdHgsIFNQQ1IyKSk7Ci0KLQkvKiBXZSBjYW4gZnJlZSB0aGUgY2hhbm5lbHMgKi8KLQlvbWFwX2ZyZWVfZG1hKG1jYnNwX2RtYV90eC0+ZG1hX3R4X2xjaCk7Ci0JbWNic3BfZG1hX3R4LT5kbWFfdHhfbGNoID0gLTE7Ci0KLQljb21wbGV0ZSgmbWNic3BfZG1hX3R4LT50eF9kbWFfY29tcGxldGlvbik7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXBfbWNic3BfcnhfZG1hX2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwX2RtYV9yeCA9IGRhdGE7Ci0KLQlkZXZfZGJnKG1jYnNwX2RtYV9yeC0+ZGV2LCAiUlggRE1BIGNhbGxiYWNrIDogMHgleFxuIiwKLQkJTUNCU1BfUkVBRChtY2JzcF9kbWFfcngsIFNQQ1IyKSk7Ci0KLQkvKiBXZSBjYW4gZnJlZSB0aGUgY2hhbm5lbHMgKi8KLQlvbWFwX2ZyZWVfZG1hKG1jYnNwX2RtYV9yeC0+ZG1hX3J4X2xjaCk7Ci0JbWNic3BfZG1hX3J4LT5kbWFfcnhfbGNoID0gLTE7Ci0KLQljb21wbGV0ZSgmbWNic3BfZG1hX3J4LT5yeF9kbWFfY29tcGxldGlvbik7Ci19Ci0KIC8qCiAgKiBvbWFwX21jYnNwX2NvbmZpZyBzaW1wbHkgd3JpdGUgYSBjb25maWcgdG8gdGhlCiAgKiBhcHByb3ByaWF0ZSBNY0JTUC4KQEAgLTc1OCwzNyArNzIzLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3N0X3N0b3Aoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwKSB7fQogI2VuZGlmCiAKLS8qCi0gKiBXZSBjYW4gY2hvb3NlIGJldHdlZW4gSVJRIGJhc2VkIG9yIHBvbGxlZCBJTy4KLSAqIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSBvbWFwX21jYnNwX3JlcXVlc3QoKS4KLSAqLwotaW50IG9tYXBfbWNic3Bfc2V0X2lvX3R5cGUodW5zaWduZWQgaW50IGlkLCBvbWFwX21jYnNwX2lvX3R5cGVfdCBpb190eXBlKQotewotCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKLQotCWlmICghb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBpZCAoJWQpXG4iLCBfX2Z1bmNfXywgaWQgKyAxKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKLQotCXNwaW5fbG9jaygmbWNic3AtPmxvY2spOwotCi0JaWYgKCFtY2JzcC0+ZnJlZSkgewotCQlkZXZfZXJyKG1jYnNwLT5kZXYsICJNY0JTUCVkIGlzIGN1cnJlbnRseSBpbiB1c2VcbiIsCi0JCQltY2JzcC0+aWQpOwotCQlzcGluX3VubG9jaygmbWNic3AtPmxvY2spOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltY2JzcC0+aW9fdHlwZSA9IGlvX3R5cGU7Ci0KLQlzcGluX3VubG9jaygmbWNic3AtPmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfbWNic3Bfc2V0X2lvX3R5cGUpOwotCiBpbnQgb21hcF9tY2JzcF9yZXF1ZXN0KHVuc2lnbmVkIGludCBpZCkKIHsKIAlzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3A7CkBAIC04MzMsMjkgKzc2NywyNCBAQAogCU1DQlNQX1dSSVRFKG1jYnNwLCBTUENSMSwgMCk7CiAJTUNCU1BfV1JJVEUobWNic3AsIFNQQ1IyLCAwKTsKIAotCWlmIChtY2JzcC0+aW9fdHlwZSA9PSBPTUFQX01DQlNQX0lSUV9JTykgewotCQkvKiBXZSBuZWVkIHRvIGdldCBJUlFzIGhlcmUgKi8KLQkJaW5pdF9jb21wbGV0aW9uKCZtY2JzcC0+dHhfaXJxX2NvbXBsZXRpb24pOwotCQllcnIgPSByZXF1ZXN0X2lycShtY2JzcC0+dHhfaXJxLCBvbWFwX21jYnNwX3R4X2lycV9oYW5kbGVyLAotCQkJCQkwLCAiTWNCU1AiLCAodm9pZCAqKW1jYnNwKTsKLQkJaWYgKGVyciAhPSAwKSB7Ci0JCQlkZXZfZXJyKG1jYnNwLT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBUWCBJUlEgJWQgIgotCQkJCQkiZm9yIE1jQlNQJWRcbiIsIG1jYnNwLT50eF9pcnEsCi0JCQkJCW1jYnNwLT5pZCk7Ci0JCQlnb3RvIGVycl9jbGtfZGlzYWJsZTsKLQkJfQorCWVyciA9IHJlcXVlc3RfaXJxKG1jYnNwLT50eF9pcnEsIG9tYXBfbWNic3BfdHhfaXJxX2hhbmRsZXIsCisJCQkJMCwgIk1jQlNQIiwgKHZvaWQgKiltY2JzcCk7CisJaWYgKGVyciAhPSAwKSB7CisJCWRldl9lcnIobWNic3AtPmRldiwgIlVuYWJsZSB0byByZXF1ZXN0IFRYIElSUSAlZCAiCisJCQkJImZvciBNY0JTUCVkXG4iLCBtY2JzcC0+dHhfaXJxLAorCQkJCW1jYnNwLT5pZCk7CisJCWdvdG8gZXJyX2Nsa19kaXNhYmxlOworCX0KIAotCQlpZiAobWNic3AtPnJ4X2lycSkgewotCQkJaW5pdF9jb21wbGV0aW9uKCZtY2JzcC0+cnhfaXJxX2NvbXBsZXRpb24pOwotCQkJZXJyID0gcmVxdWVzdF9pcnEobWNic3AtPnJ4X2lycSwKLQkJCQkJb21hcF9tY2JzcF9yeF9pcnFfaGFuZGxlciwKLQkJCQkJMCwgIk1jQlNQIiwgKHZvaWQgKiltY2JzcCk7Ci0JCQlpZiAoZXJyICE9IDApIHsKLQkJCQlkZXZfZXJyKG1jYnNwLT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBSWCBJUlEgJWQgIgotCQkJCQkJImZvciBNY0JTUCVkXG4iLCBtY2JzcC0+cnhfaXJxLAotCQkJCQkJbWNic3AtPmlkKTsKLQkJCQlnb3RvIGVycl9mcmVlX2lycTsKLQkJCX0KKwlpZiAobWNic3AtPnJ4X2lycSkgeworCQllcnIgPSByZXF1ZXN0X2lycShtY2JzcC0+cnhfaXJxLAorCQkJCW9tYXBfbWNic3BfcnhfaXJxX2hhbmRsZXIsCisJCQkJMCwgIk1jQlNQIiwgKHZvaWQgKiltY2JzcCk7CisJCWlmIChlcnIgIT0gMCkgeworCQkJZGV2X2VycihtY2JzcC0+ZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgUlggSVJRICVkICIKKwkJCQkJImZvciBNY0JTUCVkXG4iLCBtY2JzcC0+cnhfaXJxLAorCQkJCQltY2JzcC0+aWQpOworCQkJZ290byBlcnJfZnJlZV9pcnE7CiAJCX0KIAl9CiAKQEAgLTkwMSwxMiArODMwLDkgQEAKIAogCXBtX3J1bnRpbWVfcHV0X3N5bmMobWNic3AtPmRldik7CiAKLQlpZiAobWNic3AtPmlvX3R5cGUgPT0gT01BUF9NQ0JTUF9JUlFfSU8pIHsKLQkJLyogRnJlZSBJUlFzICovCi0JCWlmIChtY2JzcC0+cnhfaXJxKQotCQkJZnJlZV9pcnEobWNic3AtPnJ4X2lycSwgKHZvaWQgKiltY2JzcCk7Ci0JCWZyZWVfaXJxKG1jYnNwLT50eF9pcnEsICh2b2lkICopbWNic3ApOwotCX0KKwlpZiAobWNic3AtPnJ4X2lycSkKKwkJZnJlZV9pcnEobWNic3AtPnJ4X2lycSwgKHZvaWQgKiltY2JzcCk7CisJZnJlZV9pcnEobWNic3AtPnR4X2lycSwgKHZvaWQgKiltY2JzcCk7CiAKIAlyZWdfY2FjaGUgPSBtY2JzcC0+cmVnX2NhY2hlOwogCkBAIC05NDMsOSArODY5LDYgQEAKIAlpZiAoY3B1X2lzX29tYXAzNHh4KCkpCiAJCW9tYXBfc3Rfc3RhcnQobWNic3ApOwogCi0JbWNic3AtPnJ4X3dvcmRfbGVuZ3RoID0gKE1DQlNQX1JFQURfQ0FDSEUobWNic3AsIFJDUjEpID4+IDUpICYgMHg3OwotCW1jYnNwLT50eF93b3JkX2xlbmd0aCA9IChNQ0JTUF9SRUFEX0NBQ0hFKG1jYnNwLCBYQ1IxKSA+PiA1KSAmIDB4NzsKLQogCS8qIE9ubHkgZW5hYmxlIFNSRywgaWYgTWNCU1AgaXMgbWFzdGVyICovCiAJdyA9IE1DQlNQX1JFQURfQ0FDSEUobWNic3AsIFBDUjApOwogCWlmICh3ICYgKEZTWE0gfCBGU1JNIHwgQ0xLWE0gfCBDTEtSTSkpCkBAIC0xMDQzLDQ4NSArOTY2LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9zdG9wKTsKIAotLyogcG9sbGVkIG1jYnNwIGkvbyBvcGVyYXRpb25zICovCi1pbnQgb21hcF9tY2JzcF9wb2xsd3JpdGUodW5zaWduZWQgaW50IGlkLCB1MTYgYnVmKQotewotCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKLQotCWlmICghb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBpZCAoJWQpXG4iLCBfX2Z1bmNfXywgaWQgKyAxKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JbWNic3AgPSBpZF90b19tY2JzcF9wdHIoaWQpOwotCi0JTUNCU1BfV1JJVEUobWNic3AsIERYUjEsIGJ1Zik7Ci0JLyogaWYgZnJhbWUgc3luYyBlcnJvciAtIGNsZWFyIHRoZSBlcnJvciAqLwotCWlmIChNQ0JTUF9SRUFEKG1jYnNwLCBTUENSMikgJiBYU1lOQ19FUlIpIHsKLQkJLyogY2xlYXIgZXJyb3IgKi8KLQkJTUNCU1BfV1JJVEUobWNic3AsIFNQQ1IyLCBNQ0JTUF9SRUFEX0NBQ0hFKG1jYnNwLCBTUENSMikpOwotCQkvKiByZXNlbmQgKi8KLQkJcmV0dXJuIC0xOwotCX0gZWxzZSB7Ci0JCS8qIHdhaXQgZm9yIHRyYW5zbWl0IGNvbmZpcm1hdGlvbiAqLwotCQlpbnQgYXR0ZW1wcyA9IDA7Ci0JCXdoaWxlICghKE1DQlNQX1JFQUQobWNic3AsIFNQQ1IyKSAmIFhSRFkpKSB7Ci0JCQlpZiAoYXR0ZW1wcysrID4gMTAwMCkgewotCQkJCU1DQlNQX1dSSVRFKG1jYnNwLCBTUENSMiwKLQkJCQkJCU1DQlNQX1JFQURfQ0FDSEUobWNic3AsIFNQQ1IyKSAmCi0JCQkJCQkoflhSU1QpKTsKLQkJCQl1ZGVsYXkoMTApOwotCQkJCU1DQlNQX1dSSVRFKG1jYnNwLCBTUENSMiwKLQkJCQkJCU1DQlNQX1JFQURfQ0FDSEUobWNic3AsIFNQQ1IyKSB8Ci0JCQkJCQkoWFJTVCkpOwotCQkJCXVkZWxheSgxMCk7Ci0JCQkJZGV2X2VycihtY2JzcC0+ZGV2LCAiQ291bGQgbm90IHdyaXRlIHRvIgotCQkJCQkiIE1jQlNQJWQgUmVnaXN0ZXJcbiIsIG1jYnNwLT5pZCk7Ci0JCQkJcmV0dXJuIC0yOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfbWNic3BfcG9sbHdyaXRlKTsKLQotaW50IG9tYXBfbWNic3BfcG9sbHJlYWQodW5zaWduZWQgaW50IGlkLCB1MTYgKmJ1ZikKLXsKLQlzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3A7Ci0KLQlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7Ci0KLQkvKiBpZiBmcmFtZSBzeW5jIGVycm9yIC0gY2xlYXIgdGhlIGVycm9yICovCi0JaWYgKE1DQlNQX1JFQUQobWNic3AsIFNQQ1IxKSAmIFJTWU5DX0VSUikgewotCQkvKiBjbGVhciBlcnJvciAqLwotCQlNQ0JTUF9XUklURShtY2JzcCwgU1BDUjEsIE1DQlNQX1JFQURfQ0FDSEUobWNic3AsIFNQQ1IxKSk7Ci0JCS8qIHJlc2VuZCAqLwotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkJLyogd2FpdCBmb3IgcmVjZWl2ZSBjb25maXJtYXRpb24gKi8KLQkJaW50IGF0dGVtcHMgPSAwOwotCQl3aGlsZSAoIShNQ0JTUF9SRUFEKG1jYnNwLCBTUENSMSkgJiBSUkRZKSkgewotCQkJaWYgKGF0dGVtcHMrKyA+IDEwMDApIHsKLQkJCQlNQ0JTUF9XUklURShtY2JzcCwgU1BDUjEsCi0JCQkJCQlNQ0JTUF9SRUFEX0NBQ0hFKG1jYnNwLCBTUENSMSkgJgotCQkJCQkJKH5SUlNUKSk7Ci0JCQkJdWRlbGF5KDEwKTsKLQkJCQlNQ0JTUF9XUklURShtY2JzcCwgU1BDUjEsCi0JCQkJCQlNQ0JTUF9SRUFEX0NBQ0hFKG1jYnNwLCBTUENSMSkgfAotCQkJCQkJKFJSU1QpKTsKLQkJCQl1ZGVsYXkoMTApOwotCQkJCWRldl9lcnIobWNic3AtPmRldiwgIkNvdWxkIG5vdCByZWFkIGZyb20iCi0JCQkJCSIgTWNCU1AlZCBSZWdpc3RlclxuIiwgbWNic3AtPmlkKTsKLQkJCQlyZXR1cm4gLTI7Ci0JCQl9Ci0JCX0KLQl9Ci0JKmJ1ZiA9IE1DQlNQX1JFQUQobWNic3AsIERSUjEpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfbWNic3BfcG9sbHJlYWQpOwotCi0vKgotICogSVJRIGJhc2VkIHdvcmQgdHJhbnNtaXNzaW9uLgotICovCi12b2lkIG9tYXBfbWNic3BfeG1pdF93b3JkKHVuc2lnbmVkIGludCBpZCwgdTMyIHdvcmQpCi17Ci0Jc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOwotCW9tYXBfbWNic3Bfd29yZF9sZW5ndGggd29yZF9sZW5ndGg7Ci0KLQlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7Ci0JCXJldHVybjsKLQl9Ci0KLQltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7Ci0Jd29yZF9sZW5ndGggPSBtY2JzcC0+dHhfd29yZF9sZW5ndGg7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtY2JzcC0+dHhfaXJxX2NvbXBsZXRpb24pOwotCi0JaWYgKHdvcmRfbGVuZ3RoID4gT01BUF9NQ0JTUF9XT1JEXzE2KQotCQlNQ0JTUF9XUklURShtY2JzcCwgRFhSMiwgd29yZCA+PiAxNik7Ci0JTUNCU1BfV1JJVEUobWNic3AsIERYUjEsIHdvcmQgJiAweGZmZmYpOwotfQotRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3htaXRfd29yZCk7Ci0KLXUzMiBvbWFwX21jYnNwX3JlY3Zfd29yZCh1bnNpZ25lZCBpbnQgaWQpCi17Ci0Jc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOwotCXUxNiB3b3JkX2xzYiwgd29yZF9tc2IgPSAwOwotCW9tYXBfbWNic3Bfd29yZF9sZW5ndGggd29yZF9sZW5ndGg7Ci0KLQlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7Ci0KLQl3b3JkX2xlbmd0aCA9IG1jYnNwLT5yeF93b3JkX2xlbmd0aDsKLQotCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1jYnNwLT5yeF9pcnFfY29tcGxldGlvbik7Ci0KLQlpZiAod29yZF9sZW5ndGggPiBPTUFQX01DQlNQX1dPUkRfMTYpCi0JCXdvcmRfbXNiID0gTUNCU1BfUkVBRChtY2JzcCwgRFJSMik7Ci0Jd29yZF9sc2IgPSBNQ0JTUF9SRUFEKG1jYnNwLCBEUlIxKTsKLQotCXJldHVybiAod29yZF9sc2IgfCAod29yZF9tc2IgPDwgMTYpKTsKLX0KLUVYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9yZWN2X3dvcmQpOwotCi1pbnQgb21hcF9tY2JzcF9zcGlfbWFzdGVyX3htaXRfd29yZF9wb2xsKHVuc2lnbmVkIGludCBpZCwgdTMyIHdvcmQpCi17Ci0Jc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOwotCW9tYXBfbWNic3Bfd29yZF9sZW5ndGggdHhfd29yZF9sZW5ndGg7Ci0Jb21hcF9tY2JzcF93b3JkX2xlbmd0aCByeF93b3JkX2xlbmd0aDsKLQl1MTYgc3BjcjIsIHNwY3IxLCBhdHRlbXB0cyA9IDAsIHdvcmRfbHNiLCB3b3JkX21zYiA9IDA7Ci0KLQlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7Ci0JdHhfd29yZF9sZW5ndGggPSBtY2JzcC0+dHhfd29yZF9sZW5ndGg7Ci0Jcnhfd29yZF9sZW5ndGggPSBtY2JzcC0+cnhfd29yZF9sZW5ndGg7Ci0KLQlpZiAodHhfd29yZF9sZW5ndGggIT0gcnhfd29yZF9sZW5ndGgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogRmlyc3Qgd2Ugd2FpdCBmb3IgdGhlIHRyYW5zbWl0dGVyIHRvIGJlIHJlYWR5ICovCi0Jc3BjcjIgPSBNQ0JTUF9SRUFEKG1jYnNwLCBTUENSMik7Ci0Jd2hpbGUgKCEoc3BjcjIgJiBYUkRZKSkgewotCQlzcGNyMiA9IE1DQlNQX1JFQUQobWNic3AsIFNQQ1IyKTsKLQkJaWYgKGF0dGVtcHRzKysgPiAxMDAwKSB7Ci0JCQkvKiBXZSBtdXN0IHJlc2V0IHRoZSB0cmFuc21pdHRlciAqLwotCQkJTUNCU1BfV1JJVEUobWNic3AsIFNQQ1IyLAotCQkJCSAgICBNQ0JTUF9SRUFEX0NBQ0hFKG1jYnNwLCBTUENSMikgJiAoflhSU1QpKTsKLQkJCXVkZWxheSgxMCk7Ci0JCQlNQ0JTUF9XUklURShtY2JzcCwgU1BDUjIsCi0JCQkJICAgIE1DQlNQX1JFQURfQ0FDSEUobWNic3AsIFNQQ1IyKSB8IFhSU1QpOwotCQkJdWRlbGF5KDEwKTsKLQkJCWRldl9lcnIobWNic3AtPmRldiwgIk1jQlNQJWQgdHJhbnNtaXR0ZXIgbm90ICIKLQkJCQkicmVhZHlcbiIsIG1jYnNwLT5pZCk7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCX0KLQotCS8qIE5vdyB3ZSBjYW4gcHVzaCB0aGUgZGF0YSAqLwotCWlmICh0eF93b3JkX2xlbmd0aCA+IE9NQVBfTUNCU1BfV09SRF8xNikKLQkJTUNCU1BfV1JJVEUobWNic3AsIERYUjIsIHdvcmQgPj4gMTYpOwotCU1DQlNQX1dSSVRFKG1jYnNwLCBEWFIxLCB3b3JkICYgMHhmZmZmKTsKLQotCS8qIFdlIHdhaXQgZm9yIHRoZSByZWNlaXZlciB0byBiZSByZWFkeSAqLwotCXNwY3IxID0gTUNCU1BfUkVBRChtY2JzcCwgU1BDUjEpOwotCXdoaWxlICghKHNwY3IxICYgUlJEWSkpIHsKLQkJc3BjcjEgPSBNQ0JTUF9SRUFEKG1jYnNwLCBTUENSMSk7Ci0JCWlmIChhdHRlbXB0cysrID4gMTAwMCkgewotCQkJLyogV2UgbXVzdCByZXNldCB0aGUgcmVjZWl2ZXIgKi8KLQkJCU1DQlNQX1dSSVRFKG1jYnNwLCBTUENSMSwKLQkJCQkgICAgTUNCU1BfUkVBRF9DQUNIRShtY2JzcCwgU1BDUjEpICYgKH5SUlNUKSk7Ci0JCQl1ZGVsYXkoMTApOwotCQkJTUNCU1BfV1JJVEUobWNic3AsIFNQQ1IxLAotCQkJCSAgICBNQ0JTUF9SRUFEX0NBQ0hFKG1jYnNwLCBTUENSMSkgfCBSUlNUKTsKLQkJCXVkZWxheSgxMCk7Ci0JCQlkZXZfZXJyKG1jYnNwLT5kZXYsICJNY0JTUCVkIHJlY2VpdmVyIG5vdCAiCi0JCQkJInJlYWR5XG4iLCBtY2JzcC0+aWQpOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQl9Ci0KLQkvKiBSZWNlaXZlciBpcyByZWFkeSwgbGV0J3MgcmVhZCB0aGUgZHVtbXkgZGF0YSAqLwotCWlmIChyeF93b3JkX2xlbmd0aCA+IE9NQVBfTUNCU1BfV09SRF8xNikKLQkJd29yZF9tc2IgPSBNQ0JTUF9SRUFEKG1jYnNwLCBEUlIyKTsKLQl3b3JkX2xzYiA9IE1DQlNQX1JFQUQobWNic3AsIERSUjEpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfbWNic3Bfc3BpX21hc3Rlcl94bWl0X3dvcmRfcG9sbCk7Ci0KLWludCBvbWFwX21jYnNwX3NwaV9tYXN0ZXJfcmVjdl93b3JkX3BvbGwodW5zaWduZWQgaW50IGlkLCB1MzIgKndvcmQpCi17Ci0Jc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOwotCXUzMiBjbG9ja193b3JkID0gMDsKLQlvbWFwX21jYnNwX3dvcmRfbGVuZ3RoIHR4X3dvcmRfbGVuZ3RoOwotCW9tYXBfbWNic3Bfd29yZF9sZW5ndGggcnhfd29yZF9sZW5ndGg7Ci0JdTE2IHNwY3IyLCBzcGNyMSwgYXR0ZW1wdHMgPSAwLCB3b3JkX2xzYiwgd29yZF9tc2IgPSAwOwotCi0JaWYgKCFvbWFwX21jYnNwX2NoZWNrX3ZhbGlkX2lkKGlkKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIGlkICglZClcbiIsIF9fZnVuY19fLCBpZCArIDEpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7Ci0KLQl0eF93b3JkX2xlbmd0aCA9IG1jYnNwLT50eF93b3JkX2xlbmd0aDsKLQlyeF93b3JkX2xlbmd0aCA9IG1jYnNwLT5yeF93b3JkX2xlbmd0aDsKLQotCWlmICh0eF93b3JkX2xlbmd0aCAhPSByeF93b3JkX2xlbmd0aCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBGaXJzdCB3ZSB3YWl0IGZvciB0aGUgdHJhbnNtaXR0ZXIgdG8gYmUgcmVhZHkgKi8KLQlzcGNyMiA9IE1DQlNQX1JFQUQobWNic3AsIFNQQ1IyKTsKLQl3aGlsZSAoIShzcGNyMiAmIFhSRFkpKSB7Ci0JCXNwY3IyID0gTUNCU1BfUkVBRChtY2JzcCwgU1BDUjIpOwotCQlpZiAoYXR0ZW1wdHMrKyA+IDEwMDApIHsKLQkJCS8qIFdlIG11c3QgcmVzZXQgdGhlIHRyYW5zbWl0dGVyICovCi0JCQlNQ0JTUF9XUklURShtY2JzcCwgU1BDUjIsCi0JCQkJICAgIE1DQlNQX1JFQURfQ0FDSEUobWNic3AsIFNQQ1IyKSAmICh+WFJTVCkpOwotCQkJdWRlbGF5KDEwKTsKLQkJCU1DQlNQX1dSSVRFKG1jYnNwLCBTUENSMiwKLQkJCQkgICAgTUNCU1BfUkVBRF9DQUNIRShtY2JzcCwgU1BDUjIpIHwgWFJTVCk7Ci0JCQl1ZGVsYXkoMTApOwotCQkJZGV2X2VycihtY2JzcC0+ZGV2LCAiTWNCU1AlZCB0cmFuc21pdHRlciBub3QgIgotCQkJCSJyZWFkeVxuIiwgbWNic3AtPmlkKTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0JfQotCi0JLyogV2UgZmlyc3QgbmVlZCB0byBlbmFibGUgdGhlIGJ1cyBjbG9jayAqLwotCWlmICh0eF93b3JkX2xlbmd0aCA+IE9NQVBfTUNCU1BfV09SRF8xNikKLQkJTUNCU1BfV1JJVEUobWNic3AsIERYUjIsIGNsb2NrX3dvcmQgPj4gMTYpOwotCU1DQlNQX1dSSVRFKG1jYnNwLCBEWFIxLCBjbG9ja193b3JkICYgMHhmZmZmKTsKLQotCS8qIFdlIHdhaXQgZm9yIHRoZSByZWNlaXZlciB0byBiZSByZWFkeSAqLwotCXNwY3IxID0gTUNCU1BfUkVBRChtY2JzcCwgU1BDUjEpOwotCXdoaWxlICghKHNwY3IxICYgUlJEWSkpIHsKLQkJc3BjcjEgPSBNQ0JTUF9SRUFEKG1jYnNwLCBTUENSMSk7Ci0JCWlmIChhdHRlbXB0cysrID4gMTAwMCkgewotCQkJLyogV2UgbXVzdCByZXNldCB0aGUgcmVjZWl2ZXIgKi8KLQkJCU1DQlNQX1dSSVRFKG1jYnNwLCBTUENSMSwKLQkJCQkgICAgTUNCU1BfUkVBRF9DQUNIRShtY2JzcCwgU1BDUjEpICYgKH5SUlNUKSk7Ci0JCQl1ZGVsYXkoMTApOwotCQkJTUNCU1BfV1JJVEUobWNic3AsIFNQQ1IxLAotCQkJCSAgICBNQ0JTUF9SRUFEX0NBQ0hFKG1jYnNwLCBTUENSMSkgfCBSUlNUKTsKLQkJCXVkZWxheSgxMCk7Ci0JCQlkZXZfZXJyKG1jYnNwLT5kZXYsICJNY0JTUCVkIHJlY2VpdmVyIG5vdCAiCi0JCQkJInJlYWR5XG4iLCBtY2JzcC0+aWQpOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQl9Ci0KLQkvKiBSZWNlaXZlciBpcyByZWFkeSwgdGhlcmUgaXMgc29tZXRoaW5nIGZvciB1cyAqLwotCWlmIChyeF93b3JkX2xlbmd0aCA+IE9NQVBfTUNCU1BfV09SRF8xNikKLQkJd29yZF9tc2IgPSBNQ0JTUF9SRUFEKG1jYnNwLCBEUlIyKTsKLQl3b3JkX2xzYiA9IE1DQlNQX1JFQUQobWNic3AsIERSUjEpOwotCi0Jd29yZFswXSA9ICh3b3JkX2xzYiB8ICh3b3JkX21zYiA8PCAxNikpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfbWNic3Bfc3BpX21hc3Rlcl9yZWN2X3dvcmRfcG9sbCk7Ci0KLS8qCi0gKiBTaW1wbGUgRE1BIGJhc2VkIGJ1ZmZlciByeC90eCByb3V0aW5lcy4KLSAqIE5vdGhpbmcgZmFuY3ksIGp1c3QgYSBzaW5nbGUgYnVmZmVyIHR4L3J4IHRocm91Z2ggRE1BLgotICogVGhlIERNQSByZXNvdXJjZXMgYXJlIHJlbGVhc2VkIG9uY2UgdGhlIHRyYW5zZmVyIGlzIGRvbmUuCi0gKiBGb3IgYW55dGhpbmcgZmFuY2llciwgeW91IHNob3VsZCB1c2UgeW91ciBvd24gY3VzdG9taXplZCBETUEKLSAqIHJvdXRpbmVzIGFuZCBjYWxsYmFja3MuCi0gKi8KLWludCBvbWFwX21jYnNwX3htaXRfYnVmZmVyKHVuc2lnbmVkIGludCBpZCwgZG1hX2FkZHJfdCBidWZmZXIsCi0JCQkJdW5zaWduZWQgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3A7Ci0JaW50IGRtYV90eF9jaDsKLQlpbnQgc3JjX3BvcnQgPSAwOwotCWludCBkZXN0X3BvcnQgPSAwOwotCWludCBzeW5jX2RldiA9IDA7Ci0KLQlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7Ci0KLQlpZiAob21hcF9yZXF1ZXN0X2RtYShtY2JzcC0+ZG1hX3R4X3N5bmMsICJNY0JTUCBUWCIsCi0JCQkJb21hcF9tY2JzcF90eF9kbWFfY2FsbGJhY2ssCi0JCQkJbWNic3AsCi0JCQkJJmRtYV90eF9jaCkpIHsKLQkJZGV2X2VycihtY2JzcC0+ZGV2LCAiIFVuYWJsZSB0byByZXF1ZXN0IERNQSBjaGFubmVsIGZvciAiCi0JCQkJIk1jQlNQJWQgVFguIFRyeWluZyBJUlEgYmFzZWQgVFhcbiIsCi0JCQkJbWNic3AtPmlkKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCW1jYnNwLT5kbWFfdHhfbGNoID0gZG1hX3R4X2NoOwotCi0JZGV2X2VycihtY2JzcC0+ZGV2LCAiTWNCU1AlZCBUWCBETUEgb24gY2hhbm5lbCAlZFxuIiwgbWNic3AtPmlkLAotCQlkbWFfdHhfY2gpOwotCi0JaW5pdF9jb21wbGV0aW9uKCZtY2JzcC0+dHhfZG1hX2NvbXBsZXRpb24pOwotCi0JaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7Ci0JCXNyY19wb3J0ID0gT01BUF9ETUFfUE9SVF9USVBCOwotCQlkZXN0X3BvcnQgPSBPTUFQX0RNQV9QT1JUX0VNSUZGOwotCX0KLQlpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpCi0JCXN5bmNfZGV2ID0gbWNic3AtPmRtYV90eF9zeW5jOwotCi0Jb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhtY2JzcC0+ZG1hX3R4X2xjaCwKLQkJCQkgICAgIE9NQVBfRE1BX0RBVEFfVFlQRV9TMTYsCi0JCQkJICAgICBsZW5ndGggPj4gMSwgMSwKLQkJCQkgICAgIE9NQVBfRE1BX1NZTkNfRUxFTUVOVCwKLQkgc3luY19kZXYsIDApOwotCi0Jb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKG1jYnNwLT5kbWFfdHhfbGNoLAotCQkJCSBzcmNfcG9ydCwKLQkJCQkgT01BUF9ETUFfQU1PREVfQ09OU1RBTlQsCi0JCQkJIG1jYnNwLT5waHlzX2Jhc2UgKyBPTUFQX01DQlNQX1JFR19EWFIxLAotCQkJCSAwLCAwKTsKLQotCW9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKG1jYnNwLT5kbWFfdHhfbGNoLAotCQkJCWRlc3RfcG9ydCwKLQkJCQlPTUFQX0RNQV9BTU9ERV9QT1NUX0lOQywKLQkJCQlidWZmZXIsCi0JCQkJMCwgMCk7Ci0KLQlvbWFwX3N0YXJ0X2RtYShtY2JzcC0+ZG1hX3R4X2xjaCk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmbWNic3AtPnR4X2RtYV9jb21wbGV0aW9uKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3htaXRfYnVmZmVyKTsKLQotaW50IG9tYXBfbWNic3BfcmVjdl9idWZmZXIodW5zaWduZWQgaW50IGlkLCBkbWFfYWRkcl90IGJ1ZmZlciwKLQkJCQl1bnNpZ25lZCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKLQlpbnQgZG1hX3J4X2NoOwotCWludCBzcmNfcG9ydCA9IDA7Ci0JaW50IGRlc3RfcG9ydCA9IDA7Ci0JaW50IHN5bmNfZGV2ID0gMDsKLQotCWlmICghb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBpZCAoJWQpXG4iLCBfX2Z1bmNfXywgaWQgKyAxKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKLQotCWlmIChvbWFwX3JlcXVlc3RfZG1hKG1jYnNwLT5kbWFfcnhfc3luYywgIk1jQlNQIFJYIiwKLQkJCQlvbWFwX21jYnNwX3J4X2RtYV9jYWxsYmFjaywKLQkJCQltY2JzcCwKLQkJCQkmZG1hX3J4X2NoKSkgewotCQlkZXZfZXJyKG1jYnNwLT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBETUEgY2hhbm5lbCBmb3IgIgotCQkJCSJNY0JTUCVkIFJYLiBUcnlpbmcgSVJRIGJhc2VkIFJYXG4iLAotCQkJCW1jYnNwLT5pZCk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQltY2JzcC0+ZG1hX3J4X2xjaCA9IGRtYV9yeF9jaDsKLQotCWRldl9lcnIobWNic3AtPmRldiwgIk1jQlNQJWQgUlggRE1BIG9uIGNoYW5uZWwgJWRcbiIsIG1jYnNwLT5pZCwKLQkJZG1hX3J4X2NoKTsKLQotCWluaXRfY29tcGxldGlvbigmbWNic3AtPnJ4X2RtYV9jb21wbGV0aW9uKTsKLQotCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgewotCQlzcmNfcG9ydCA9IE9NQVBfRE1BX1BPUlRfVElQQjsKLQkJZGVzdF9wb3J0ID0gT01BUF9ETUFfUE9SVF9FTUlGRjsKLQl9Ci0JaWYgKGNwdV9jbGFzc19pc19vbWFwMigpKQotCQlzeW5jX2RldiA9IG1jYnNwLT5kbWFfcnhfc3luYzsKLQotCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMobWNic3AtPmRtYV9yeF9sY2gsCi0JCQkJCU9NQVBfRE1BX0RBVEFfVFlQRV9TMTYsCi0JCQkJCWxlbmd0aCA+PiAxLCAxLAotCQkJCQlPTUFQX0RNQV9TWU5DX0VMRU1FTlQsCi0JCQkJCXN5bmNfZGV2LCAwKTsKLQotCW9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKG1jYnNwLT5kbWFfcnhfbGNoLAotCQkJCXNyY19wb3J0LAotCQkJCU9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULAotCQkJCW1jYnNwLT5waHlzX2Jhc2UgKyBPTUFQX01DQlNQX1JFR19EUlIxLAotCQkJCTAsIDApOwotCi0Jb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKG1jYnNwLT5kbWFfcnhfbGNoLAotCQkJCQlkZXN0X3BvcnQsCi0JCQkJCU9NQVBfRE1BX0FNT0RFX1BPU1RfSU5DLAotCQkJCQlidWZmZXIsCi0JCQkJCTAsIDApOwotCi0Jb21hcF9zdGFydF9kbWEobWNic3AtPmRtYV9yeF9sY2gpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1jYnNwLT5yeF9kbWFfY29tcGxldGlvbik7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9yZWN2X2J1ZmZlcik7Ci0KLS8qCi0gKiBTUEkgd3JhcHBlci4KLSAqIFNpbmNlIFNQSSBzZXR1cCBpcyBtdWNoIHNpbXBsZXIgdGhhbiB0aGUgZ2VuZXJpYyBNY0JTUCBvbmUsCi0gKiB0aGlzIHdyYXBwZXIganVzdCBuZWVkIGFuIG9tYXBfbWNic3Bfc3BpX2NmZyBzdHJ1Y3R1cmUgYXMgYW4gaW5wdXQuCi0gKiBPbmNlIHRoaXMgaXMgZG9uZSwgeW91IGNhbiBjYWxsIG9tYXBfbWNic3Bfc3RhcnQoKS4KLSAqLwotdm9pZCBvbWFwX21jYnNwX3NldF9zcGlfbW9kZSh1bnNpZ25lZCBpbnQgaWQsCi0JCQkJY29uc3Qgc3RydWN0IG9tYXBfbWNic3Bfc3BpX2NmZyAqc3BpX2NmZykKLXsKLQlzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3A7Ci0Jc3RydWN0IG9tYXBfbWNic3BfcmVnX2NmZyBtY2JzcF9jZmc7Ci0KLQlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7Ci0JCXJldHVybjsKLQl9Ci0JbWNic3AgPSBpZF90b19tY2JzcF9wdHIoaWQpOwotCi0JbWVtc2V0KCZtY2JzcF9jZmcsIDAsIHNpemVvZihzdHJ1Y3Qgb21hcF9tY2JzcF9yZWdfY2ZnKSk7Ci0KLQkvKiBTUEkgaGFzIG9ubHkgb25lIGZyYW1lICovCi0JbWNic3BfY2ZnLnJjcjEgfD0gKFJXRExFTjEoc3BpX2NmZy0+d29yZF9sZW5ndGgpIHwgUkZSTEVOMSgwKSk7Ci0JbWNic3BfY2ZnLnhjcjEgfD0gKFhXRExFTjEoc3BpX2NmZy0+d29yZF9sZW5ndGgpIHwgWEZSTEVOMSgwKSk7Ci0KLQkvKiBDbG9jayBzdG9wIG1vZGUgKi8KLQlpZiAoc3BpX2NmZy0+Y2xrX3N0cF9tb2RlID09IE9NQVBfTUNCU1BfQ0xLX1NUUF9NT0RFX05PX0RFTEFZKQotCQltY2JzcF9jZmcuc3BjcjEgfD0gKDEgPDwgMTIpOwotCWVsc2UKLQkJbWNic3BfY2ZnLnNwY3IxIHw9ICgzIDw8IDExKTsKLQotCS8qIFNldCBjbG9jayBwYXJpdGllcyAqLwotCWlmIChzcGlfY2ZnLT5yeF9jbG9ja19wb2xhcml0eSA9PSBPTUFQX01DQlNQX0NMS19SSVNJTkcpCi0JCW1jYnNwX2NmZy5wY3IwIHw9IENMS1JQOwotCWVsc2UKLQkJbWNic3BfY2ZnLnBjcjAgJj0gfkNMS1JQOwotCi0JaWYgKHNwaV9jZmctPnR4X2Nsb2NrX3BvbGFyaXR5ID09IE9NQVBfTUNCU1BfQ0xLX1JJU0lORykKLQkJbWNic3BfY2ZnLnBjcjAgJj0gfkNMS1hQOwotCWVsc2UKLQkJbWNic3BfY2ZnLnBjcjAgfD0gQ0xLWFA7Ci0KLQkvKiBTZXQgU0NMS01FIHRvIDAgYW5kIENMS1NNIHRvIDEgKi8KLQltY2JzcF9jZmcucGNyMCAmPSB+U0NMS01FOwotCW1jYnNwX2NmZy5zcmdyMiB8PSBDTEtTTTsKLQotCS8qIFNldCBGU1hQICovCi0JaWYgKHNwaV9jZmctPmZzeF9wb2xhcml0eSA9PSBPTUFQX01DQlNQX0ZTX0FDVElWRV9ISUdIKQotCQltY2JzcF9jZmcucGNyMCAmPSB+RlNYUDsKLQllbHNlCi0JCW1jYnNwX2NmZy5wY3IwIHw9IEZTWFA7Ci0KLQlpZiAoc3BpX2NmZy0+c3BpX21vZGUgPT0gT01BUF9NQ0JTUF9TUElfTUFTVEVSKSB7Ci0JCW1jYnNwX2NmZy5wY3IwIHw9IENMS1hNOwotCQltY2JzcF9jZmcuc3JncjEgfD0gQ0xLR0RWKHNwaV9jZmctPmNsa19kaXYgLSAxKTsKLQkJbWNic3BfY2ZnLnBjcjAgfD0gRlNYTTsKLQkJbWNic3BfY2ZnLnNyZ3IyICY9IH5GU0dNOwotCQltY2JzcF9jZmcueGNyMiB8PSBYREFURExZKDEpOwotCQltY2JzcF9jZmcucmNyMiB8PSBSREFURExZKDEpOwotCX0gZWxzZSB7Ci0JCW1jYnNwX2NmZy5wY3IwICY9IH5DTEtYTTsKLQkJbWNic3BfY2ZnLnNyZ3IxIHw9IENMS0dEVigxKTsKLQkJbWNic3BfY2ZnLnBjcjAgJj0gfkZTWE07Ci0JCW1jYnNwX2NmZy54Y3IyICY9IH5YREFURExZKDMpOwotCQltY2JzcF9jZmcucmNyMiAmPSB+UkRBVERMWSgzKTsKLQl9Ci0KLQltY2JzcF9jZmcueGNyMiAmPSB+WFBIQVNFOwotCW1jYnNwX2NmZy5yY3IyICY9IH5SUEhBU0U7Ci0KLQlvbWFwX21jYnNwX2NvbmZpZyhpZCwgJm1jYnNwX2NmZyk7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfbWNic3Bfc2V0X3NwaV9tb2RlKTsKLQogI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCiAjZGVmaW5lIG1heF90aHJlcyhtKQkJCShtY2JzcC0+cGRhdGEtPmJ1ZmZlcl9zaXplKQogI2RlZmluZSB2YWxpZF90aHJlc2hvbGQobSwgdmFsKQkJKCh2YWwpIDw9IG1heF90aHJlcyhtKSkKQEAgLTE4MzMsOCArMTI3Nyw2IEBACiAJc3Bpbl9sb2NrX2luaXQoJm1jYnNwLT5sb2NrKTsKIAltY2JzcC0+aWQgPSBpZCArIDE7CiAJbWNic3AtPmZyZWUgPSB0cnVlOwotCW1jYnNwLT5kbWFfdHhfbGNoID0gLTE7Ci0JbWNic3AtPmRtYV9yeF9sY2ggPSAtMTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJtcHUiKTsKIAlpZiAoIXJlcykgewpAQCAtMTg2MCw5ICsxMzAyLDYgQEAKIAllbHNlCiAJCW1jYnNwLT5waHlzX2RtYV9iYXNlID0gcmVzLT5zdGFydDsKIAotCS8qIERlZmF1bHQgSS9PIGlzIElSUSBiYXNlZCAqLwotCW1jYnNwLT5pb190eXBlID0gT01BUF9NQ0JTUF9JUlFfSU87Ci0KIAltY2JzcC0+dHhfaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInR4Iik7CiAJbWNic3AtPnJ4X2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJyeCIpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvb21hcF9kZXZpY2UuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCmluZGV4IGEzN2I4ZWIuLjM0NzFjNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCkBAIC04NCw2ICs4NCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDxwbGF0L29tYXBfZGV2aWNlLmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwX2h3bW9kLmg+CkBAIC0yMzUsMTEgKzIzNiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG9tYXBfZGV2aWNlICpfZmluZF9ieV9wZGV2KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihwZGV2LCBzdHJ1Y3Qgb21hcF9kZXZpY2UsIHBkZXYpOwotfQotCiAvKioKICAqIF9hZGRfb3B0aW9uYWxfY2xvY2tfY2xrZGV2IC0gQWRkIGNsa2RldiBlbnRyeSBmb3IgaHdtb2Qgb3B0aW9uYWwgY2xvY2tzCiAgKiBAb2Q6IHN0cnVjdCBvbWFwX2RldmljZSAqb2QKQEAgLTMxNSw3ICszMTEsNyBAQAogCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CiAJdTMyIHJldCA9IDA7CiAKLQlvZCA9IF9maW5kX2J5X3BkZXYocGRldik7CisJb2QgPSB0b19vbWFwX2RldmljZShwZGV2KTsKIAogCWlmIChvZC0+aHdtb2RzX2NudCkKIAkJcmV0ID0gb21hcF9od21vZF9nZXRfY29udGV4dF9sb3NzX2NvdW50KG9kLT5od21vZHNbMF0pOwpAQCAtNTM2LDI1ICs1MzIsODIgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCiBzdGF0aWMgaW50IF9vZF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlpbnQgcmV0OwogCi0JcmV0dXJuIG9tYXBfZGV2aWNlX2lkbGUocGRldik7CisJcmV0ID0gcG1fZ2VuZXJpY19ydW50aW1lX3N1c3BlbmQoZGV2KTsKKworCWlmICghcmV0KQorCQlvbWFwX2RldmljZV9pZGxlKHBkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfb2RfcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcG1fZ2VuZXJpY19ydW50aW1lX2lkbGUoZGV2KTsKIH0KIAogc3RhdGljIGludCBfb2RfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAotCXJldHVybiBvbWFwX2RldmljZV9lbmFibGUocGRldik7CisJb21hcF9kZXZpY2VfZW5hYmxlKHBkZXYpOworCisJcmV0dXJuIHBtX2dlbmVyaWNfcnVudGltZV9yZXN1bWUoZGV2KTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NVU1BFTkQKK3N0YXRpYyBpbnQgX29kX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kID0gdG9fb21hcF9kZXZpY2UocGRldik7CisJaW50IHJldDsKKworCWlmIChvZC0+ZmxhZ3MgJiBPTUFQX0RFVklDRV9OT19JRExFX09OX1NVU1BFTkQpCisJCXJldHVybiBwbV9nZW5lcmljX3N1c3BlbmRfbm9pcnEoZGV2KTsKKworCXJldCA9IHBtX2dlbmVyaWNfc3VzcGVuZF9ub2lycShkZXYpOworCisJaWYgKCFyZXQgJiYgIXBtX3J1bnRpbWVfc3RhdHVzX3N1c3BlbmRlZChkZXYpKSB7CisJCWlmIChwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZChkZXYpID09IDApIHsKKwkJCW9tYXBfZGV2aWNlX2lkbGUocGRldik7CisJCQlvZC0+ZmxhZ3MgfD0gT01BUF9ERVZJQ0VfU1VTUEVOREVEOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZfcG93ZXJfZG9tYWluIG9tYXBfZGV2aWNlX3Bvd2VyX2RvbWFpbiA9IHsKK3N0YXRpYyBpbnQgX29kX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBvbWFwX2RldmljZSAqb2QgPSB0b19vbWFwX2RldmljZShwZGV2KTsKKworCWlmIChvZC0+ZmxhZ3MgJiBPTUFQX0RFVklDRV9OT19JRExFX09OX1NVU1BFTkQpCisJCXJldHVybiBwbV9nZW5lcmljX3Jlc3VtZV9ub2lycShkZXYpOworCisJaWYgKChvZC0+ZmxhZ3MgJiBPTUFQX0RFVklDRV9TVVNQRU5ERUQpICYmCisJICAgICFwbV9ydW50aW1lX3N0YXR1c19zdXNwZW5kZWQoZGV2KSkgeworCQlvZC0+ZmxhZ3MgJj0gfk9NQVBfREVWSUNFX1NVU1BFTkRFRDsKKwkJb21hcF9kZXZpY2VfZW5hYmxlKHBkZXYpOworCQlwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lKGRldik7CisJfQorCisJcmV0dXJuIHBtX2dlbmVyaWNfcmVzdW1lX25vaXJxKGRldik7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBkZXZfcG1fZG9tYWluIG9tYXBfZGV2aWNlX3BtX2RvbWFpbiA9IHsKIAkub3BzID0gewotCQkucnVudGltZV9zdXNwZW5kID0gX29kX3J1bnRpbWVfc3VzcGVuZCwKLQkJLnJ1bnRpbWVfcmVzdW1lID0gX29kX3J1bnRpbWVfcmVzdW1lLAorCQlTRVRfUlVOVElNRV9QTV9PUFMoX29kX3J1bnRpbWVfc3VzcGVuZCwgX29kX3J1bnRpbWVfcmVzdW1lLAorCQkJCSAgIF9vZF9ydW50aW1lX2lkbGUpCiAJCVVTRV9QTEFURk9STV9QTV9TTEVFUF9PUFMKKwkJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoX29kX3N1c3BlbmRfbm9pcnEsIF9vZF9yZXN1bWVfbm9pcnEpCiAJfQogfTsKIApAQCAtNTcxLDcgKzYyNCw3IEBACiAJcHJfZGVidWcoIm9tYXBfZGV2aWNlOiAlczogcmVnaXN0ZXJpbmdcbiIsIG9kLT5wZGV2Lm5hbWUpOwogCiAJb2QtPnBkZXYuZGV2LnBhcmVudCA9ICZvbWFwX2RldmljZV9wYXJlbnQ7Ci0Jb2QtPnBkZXYuZGV2LnB3cl9kb21haW4gPSAmb21hcF9kZXZpY2VfcG93ZXJfZG9tYWluOworCW9kLT5wZGV2LmRldi5wbV9kb21haW4gPSAmb21hcF9kZXZpY2VfcG1fZG9tYWluOwogCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9kLT5wZGV2KTsKIH0KIApAQCAtNTk2LDcgKzY0OSw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOwogCi0Jb2QgPSBfZmluZF9ieV9wZGV2KHBkZXYpOworCW9kID0gdG9fb21hcF9kZXZpY2UocGRldik7CiAKIAlpZiAob2QtPl9zdGF0ZSA9PSBPTUFQX0RFVklDRV9TVEFURV9FTkFCTEVEKSB7CiAJCVdBUk4oMSwgIm9tYXBfZGV2aWNlOiAlcy4lZDogJXMoKSBjYWxsZWQgZnJvbSBpbnZhbGlkIHN0YXRlICVkXG4iLApAQCAtNjM1LDcgKzY4OCw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOwogCi0Jb2QgPSBfZmluZF9ieV9wZGV2KHBkZXYpOworCW9kID0gdG9fb21hcF9kZXZpY2UocGRldik7CiAKIAlpZiAob2QtPl9zdGF0ZSAhPSBPTUFQX0RFVklDRV9TVEFURV9FTkFCTEVEKSB7CiAJCVdBUk4oMSwgIm9tYXBfZGV2aWNlOiAlcy4lZDogJXMoKSBjYWxsZWQgZnJvbSBpbnZhbGlkIHN0YXRlICVkXG4iLApAQCAtNjY2LDcgKzcxOSw3IEBACiAJaW50IHJldCwgaTsKIAlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOwogCi0Jb2QgPSBfZmluZF9ieV9wZGV2KHBkZXYpOworCW9kID0gdG9fb21hcF9kZXZpY2UocGRldik7CiAKIAlpZiAob2QtPl9zdGF0ZSAhPSBPTUFQX0RFVklDRV9TVEFURV9FTkFCTEVEICYmCiAJICAgIG9kLT5fc3RhdGUgIT0gT01BUF9ERVZJQ0VfU1RBVEVfSURMRSkgewpAQCAtNzA3LDcgKzc2MCw3IEBACiAJaW50IHJldCA9IC1FSU5WQUw7CiAJc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKIAotCW9kID0gX2ZpbmRfYnlfcGRldihwZGV2KTsKKwlvZCA9IHRvX29tYXBfZGV2aWNlKHBkZXYpOwogCiAJaWYgKG5ld193YWtldXBfbGF0X2xpbWl0ID09IG9kLT5kZXZfd2FrZXVwX2xhdCkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYwppbmRleCBhM2Y1MGIzLi4zNjNjOTFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCQllbHNlIGlmIChjcHVfaXNfb21hcDE2MTEoKSkKIAkJCW9tYXBfc3JhbV9zaXplID0gU1pfMjU2SzsKIAkJZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBkZXRlY3QgU1JBTSBzaXplXG4iKTsKKwkJCXByX2VycigiQ291bGQgbm90IGRldGVjdCBTUkFNIHNpemVcbiIpOwogCQkJb21hcF9zcmFtX3NpemUgPSAweDQwMDA7CiAJCX0KIAl9CkBAIC0yMjEsMTAgKzIyMSwxMCBAQAogCW9tYXBfc3JhbV9pb19kZXNjWzBdLmxlbmd0aCA9IFJPVU5EX0RPV04ob21hcF9zcmFtX3NpemUsIFBBR0VfU0laRSk7CiAJaW90YWJsZV9pbml0KG9tYXBfc3JhbV9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXBfc3JhbV9pb19kZXNjKSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJTUkFNOiBNYXBwZWQgcGEgMHglMDhseCB0byB2YSAweCUwOGx4IHNpemU6IDB4JWx4XG4iLAotCV9fcGZuX3RvX3BoeXMob21hcF9zcmFtX2lvX2Rlc2NbMF0ucGZuKSwKLQlvbWFwX3NyYW1faW9fZGVzY1swXS52aXJ0dWFsLAotCSAgICAgICBvbWFwX3NyYW1faW9fZGVzY1swXS5sZW5ndGgpOworCXByX2luZm8oIlNSQU06IE1hcHBlZCBwYSAweCUwOGxseCB0byB2YSAweCUwOGx4IHNpemU6IDB4JWx4XG4iLAorCQkobG9uZyBsb25nKSBfX3Bmbl90b19waHlzKG9tYXBfc3JhbV9pb19kZXNjWzBdLnBmbiksCisJCW9tYXBfc3JhbV9pb19kZXNjWzBdLnZpcnR1YWwsCisJCW9tYXBfc3JhbV9pb19kZXNjWzBdLmxlbmd0aCk7CiAKIAkvKgogCSAqIE5vcm1hbGx5IGRldmljZW1hcHNfaW5pdCgpIHdvdWxkIGZsdXNoIGNhY2hlcyBhbmQgdGxiIGFmdGVyCkBAIC0yNTIsNyArMjUyLDcgQEAKIHZvaWQgKm9tYXBfc3JhbV9wdXNoX2FkZHJlc3ModW5zaWduZWQgbG9uZyBzaXplKQogewogCWlmIChzaXplID4gKG9tYXBfc3JhbV9jZWlsIC0gKG9tYXBfc3JhbV9iYXNlICsgU1JBTV9CT09UTE9BREVSX1NaKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJOb3QgZW5vdWdoIHNwYWNlIGluIFNSQU1cbiIpOworCQlwcl9lcnIoIk5vdCBlbm91Z2ggc3BhY2UgaW4gU1JBTVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMzk0LDIwICszOTQsMTUgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAotc3RhdGljIGludCBfX2luaXQgb21hcDM0eHhfc3JhbV9pbml0KHZvaWQpCi17Ci0JX29tYXAzX3NyYW1fY29uZmlndXJlX2NvcmVfZHBsbCA9Ci0JCW9tYXBfc3JhbV9wdXNoKG9tYXAzX3NyYW1fY29uZmlndXJlX2NvcmVfZHBsbCwKLQkJCSAgICAgICBvbWFwM19zcmFtX2NvbmZpZ3VyZV9jb3JlX2RwbGxfc3opOwotCW9tYXBfcHVzaF9zcmFtX2lkbGUoKTsKLQlyZXR1cm4gMDsKLX0KLSNlbHNlCisjZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUDMgKi8KKwogc3RhdGljIGlubGluZSBpbnQgb21hcDM0eHhfc3JhbV9pbml0KHZvaWQpCiB7CisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykgJiYgZGVmaW5lZChDT05GSUdfUE0pCisJb21hcDNfc3JhbV9yZXN0b3JlX2NvbnRleHQoKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQotI2VuZGlmCiAKIGludCBfX2luaXQgb21hcF9zcmFtX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb3Jpb24vZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1vcmlvbi9ncGlvLmMKaW5kZXggNWI0ZmZmYS4uNDFhYjk3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vcmlvbi9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vcmlvbi9ncGlvLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogCWN0LT5yZWdzLm1hc2sgPSBvY2hpcC0+bWFza19vZmZzZXQgKyBHUElPX0VER0VfTUFTS19PRkY7CiAJY3QtPnJlZ3MuYWNrID0gR1BJT19FREdFX0NBVVNFX09GRjsKIAljdC0+dHlwZSA9IElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HOwotCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrOworCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrX2Nscl9iaXQ7CiAJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OwogCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpcnFfZ2NfbWFza19zZXRfYml0OwogCWN0LT5jaGlwLmlycV9zZXRfdHlwZSA9IGdwaW9faXJxX3NldF90eXBlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1weGEvZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1weGEvZ3Bpby5jCmluZGV4IDQ4ZWJiOTQuLmExMWRjMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtcHhhL2dwaW8uYworKysgYi9hcmNoL2FybS9wbGF0LXB4YS9ncGlvLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGMsIHN0cnVjdCBweGFfZ3Bpb19jaGlwLCBjaGlwKS0+cmVnYmFzZTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqZ3Bpb190b19jaGlwKHVuc2lnbmVkIGdwaW8pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBweGFfZ3Bpb19jaGlwICpncGlvX3RvX3B4YWNoaXAodW5zaWduZWQgZ3BpbykKIHsKIAlyZXR1cm4gJnB4YV9ncGlvX2NoaXBzW2dwaW9fdG9fYmFuayhncGlvKV07CiB9CkBAIC0xNjEsNyArMTYxLDcgQEAKIAlpbnQgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7CiAJdW5zaWduZWQgbG9uZyBncGRyLCBtYXNrID0gR1BJT19iaXQoZ3Bpbyk7CiAKLQljID0gZ3Bpb190b19jaGlwKGdwaW8pOworCWMgPSBncGlvX3RvX3B4YWNoaXAoZ3Bpbyk7CiAKIAlpZiAodHlwZSA9PSBJUlFfVFlQRV9QUk9CRSkgewogCQkvKiBEb24ndCBtZXNzIHdpdGggZW5hYmxlZCBHUElPcyB1c2luZyBwcmVjb25maWd1cmVkIGVkZ2VzIG9yCkBAIC0yMzAsNyArMjMwLDcgQEAKIHN0YXRpYyB2b2lkIHB4YV9hY2tfbXV4ZWRfZ3BpbyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJaW50IGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOwotCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjID0gZ3Bpb190b19jaGlwKGdwaW8pOworCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjID0gZ3Bpb190b19weGFjaGlwKGdwaW8pOwogCiAJX19yYXdfd3JpdGVsKEdQSU9fYml0KGdwaW8pLCBjLT5yZWdiYXNlICsgR0VEUl9PRkZTRVQpOwogfQpAQCAtMjM4LDcgKzIzOCw3IEBACiBzdGF0aWMgdm9pZCBweGFfbWFza19tdXhlZF9ncGlvKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAlpbnQgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0Jc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMgPSBncGlvX3RvX2NoaXAoZ3Bpbyk7CisJc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMgPSBncGlvX3RvX3B4YWNoaXAoZ3Bpbyk7CiAJdWludDMyX3QgZ3JlciwgZ2ZlcjsKIAogCWMtPmlycV9tYXNrICY9IH5HUElPX2JpdChncGlvKTsKQEAgLTI1Miw3ICsyNTIsNyBAQAogc3RhdGljIHZvaWQgcHhhX3VubWFza19tdXhlZF9ncGlvKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAlpbnQgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0Jc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMgPSBncGlvX3RvX2NoaXAoZ3Bpbyk7CisJc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMgPSBncGlvX3RvX3B4YWNoaXAoZ3Bpbyk7CiAKIAljLT5pcnFfbWFzayB8PSBHUElPX2JpdChncGlvKTsKIAl1cGRhdGVfZWRnZV9kZXRlY3QoYyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvc2RoY2kuaCBiL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9zZGhjaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWIzMzJlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9zZGhjaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L3NkaGNpLmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAxMCBNYXJ2ZWxsCi0gKglaaGFuZ2ZlaSBHYW8gPHpoYW5nZmVpLmdhb0BtYXJ2ZWxsLmNvbT4KLSAqCi0gKiBQWEEgUGxhdGZvcm0gLSBTREhDSSBwbGF0Zm9ybSBkYXRhIGRlZmluaXRpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaWZuZGVmIF9fUExBVF9QWEFfU0RIQ0lfSAotI2RlZmluZSBfX1BMQVRfUFhBX1NESENJX0gKLQotLyogcHhhIHNwZWNpZmljIGZsYWcgKi8KLS8qIFJlcXVpcmUgY2xvY2sgZnJlZSBydW5uaW5nICovCi0jZGVmaW5lIFBYQV9GTEFHX0RJU0FCTEVfQ0xPQ0tfR0FUSU5HICgxPDwwKQotCi0vKiBCb2FyZCBkZXNpZ24gc3VwcG9ydHMgOC1iaXQgZGF0YSBvbiBTRC9TRElPIEJVUyAqLwotI2RlZmluZSBQWEFfRkxBR19TRF84X0JJVF9DQVBBQkxFX1NMT1QgKDE8PDIpCi0KLS8qCi0gKiBzdHJ1Y3QgcHhhX3NkaGNpX3BsYXRkYXRhKCkgLSBQbGF0Zm9ybSBkZXZpY2UgZGF0YSBmb3IgUFhBIFNESENJCi0gKiBAbWF4X3NwZWVkOiB0aGUgbWF4aW11bSBzcGVlZCBzdXBwb3J0ZWQKLSAqIEBxdWlya3M6IHF1aXJrcyBvZiBzcGVjaWZpYyBkZXZpY2UKLSAqIEBmbGFnczogZmxhZ3MgZm9yIHBsYXRmb3JtIHJlcXVpcmVtZW50Ci0gKi8KLXN0cnVjdCBzZGhjaV9weGFfcGxhdGRhdGEgewotCXVuc2lnbmVkIGludAltYXhfc3BlZWQ7Ci0JdW5zaWduZWQgaW50CXF1aXJrczsKLQl1bnNpZ25lZCBpbnQJZmxhZ3M7Ci19OwotCi0jZW5kaWYgLyogX19QTEFUX1BYQV9TREhDSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9LY29uZmlnCmluZGV4IGQ5YzQwOTYuLjhjNWIzMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9LY29uZmlnCkBAIC00LDcgKzQsNyBAQAogCiBjb25maWcgUExBVF9TM0MyNFhYCiAJYm9vbAotCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwIHx8IEFSQ0hfUzNDMjRBMAorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwCiAJZGVmYXVsdCB5CiAJc2VsZWN0IE5PX0lPUE9SVAogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Nsb2NrLWRjbGsuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jbG9jay1kY2xrLmMKaW5kZXggY2Y5N2NhYS4uZjk1ZDMyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Nsb2NrLWRjbGsuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY2xvY2stZGNsay5jCkBAIC0xNjksNyArMTY5LDYgQEAKIAogc3RydWN0IGNsayBzM2MyNHh4X2RjbGswID0gewogCS5uYW1lCQk9ICJkY2xrMCIsCi0JLmlkCQk9IC0xLAogCS5jdHJsYml0CT0gUzNDMjQxMF9EQ0xLQ09OX0RDTEswRU4sCiAJLmVuYWJsZQkgICAgICAgID0gczNjMjR4eF9kY2xrX2VuYWJsZSwKIAkub3BzCQk9ICZkY2xrX29wcywKQEAgLTE3Nyw3ICsxNzYsNiBAQAogCiBzdHJ1Y3QgY2xrIHMzYzI0eHhfZGNsazEgPSB7CiAJLm5hbWUJCT0gImRjbGsxIiwKLQkuaWQJCT0gLTEsCiAJLmN0cmxiaXQJPSBTM0MyNDEwX0RDTEtDT05fRENMSzFFTiwKIAkuZW5hYmxlCQk9IHMzYzI0eHhfZGNsa19lbmFibGUsCiAJLm9wcwkJPSAmZGNsa19vcHMsCkBAIC0xODksMTIgKzE4NywxMCBAQAogCiBzdHJ1Y3QgY2xrIHMzYzI0eHhfY2xrb3V0MCA9IHsKIAkubmFtZQkJPSAiY2xrb3V0MCIsCi0JLmlkCQk9IC0xLAogCS5vcHMJCT0gJmNsa291dF9vcHMsCiB9OwogCiBzdHJ1Y3QgY2xrIHMzYzI0eHhfY2xrb3V0MSA9IHsKIAkubmFtZQkJPSAiY2xrb3V0MSIsCi0JLmlkCQk9IC0xLAogCS5vcHMJCT0gJmNsa291dF9vcHMsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS5jCmluZGV4IDRhMTBjMGYuLmMxZmM2YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY3B1LmMKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KLSNpbmNsdWRlIDxwbGF0L3MzYzI0MDAuaD4KICNpbmNsdWRlIDxwbGF0L3MzYzI0MTAuaD4KICNpbmNsdWRlIDxwbGF0L3MzYzI0MTIuaD4KICNpbmNsdWRlIDxwbGF0L3MzYzI0MTYuaD4KQEAgLTU1LDcgKzU0LDYgQEAKIAogLyogdGFibGUgb2Ygc3VwcG9ydGVkIENQVXMgKi8KIAotc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9zM2MyNDAwW10gID0gIlMzQzI0MDAiOwogc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9zM2MyNDEwW10gID0gIlMzQzI0MTAiOwogc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9zM2MyNDEyW10gID0gIlMzQzI0MTIiOwogc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9zM2MyNDE2W10gID0gIlMzQzI0MTYvUzNDMjQ1MCI7CkBAIC0xNTcsMTUgKzE1NSw2IEBACiAJCS5pbml0CQk9IHMzYzI0NDNfaW5pdCwKIAkJLm5hbWUJCT0gbmFtZV9zM2MyNDQzLAogCX0sCi0JewotCQkuaWRjb2RlCQk9IDB4MCwgICAvKiBTM0MyNDAwIGRvZXNuJ3QgaGF2ZSBhbiBpZGNvZGUgKi8KLQkJLmlkbWFzawkJPSAweGZmZmZmZmZmLAotCQkubWFwX2lvCQk9IHMzYzI0MDBfbWFwX2lvLAotCQkuaW5pdF9jbG9ja3MJPSBzM2MyNDAwX2luaXRfY2xvY2tzLAotCQkuaW5pdF91YXJ0cwk9IHMzYzI0MDBfaW5pdF91YXJ0cywKLQkJLmluaXQJCT0gczNjMjQwMF9pbml0LAotCQkubmFtZQkJPSBuYW1lX3MzYzI0MDAKLQl9LAogfTsKIAogLyogbWluaW1hbCBJTyBtYXBwaW5nICovCkBAIC0yMDAsMTEgKzE4OSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHMzYzI0eHhfcmVhZF9pZGNvZGVfdjQodm9pZCkKIHsKLSNpZm5kZWYgQ09ORklHX0NQVV9TM0MyNDAwCiAJcmV0dXJuIF9fcmF3X3JlYWRsKFMzQzI0MTBfR1NUQVRVUzEpOwotI2Vsc2UKLQlyZXR1cm4gMFVMOwotI2VuZGlmCiB9CiAKIC8qIEhvb2sgZm9yIGFybV9wbV9yZXN0YXJ0IHRvIGVuc3VyZSB3ZSBleGVjdXRlIHRoZSByZXNldCBjb2RlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZGV2cy5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RldnMuYwppbmRleCA3MzY2Nzk5Li5hNzZiZjJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZGV2cy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kZXZzLmMKQEAgLTE1MCw5ICsxNTAsOCBAQAogewogCXN0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvICpucGQ7CiAKLQlucGQgPSBrbWVtZHVwKHBkLCBzaXplb2YoKm5wZCksIEdGUF9LRVJORUwpOworCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZigqbnBkKSwgJnMzY19kZXZpY2VfbGNkKTsKIAlpZiAobnBkKSB7Ci0JCXMzY19kZXZpY2VfbGNkLmRldi5wbGF0Zm9ybV9kYXRhID0gbnBkOwogCQlucGQtPmRpc3BsYXlzID0ga21lbWR1cChwZC0+ZGlzcGxheXMsCiAJCQlzaXplb2Yoc3RydWN0IHMzYzI0MTBmYl9kaXNwbGF5KSAqIG5wZC0+bnVtX2Rpc3BsYXlzLAogCQkJR0ZQX0tFUk5FTCk7CkBAIC0xODgsMTIgKzE4NywxMCBAQAogfTsKIEVYUE9SVF9TWU1CT0woczNjX2RldmljZV90cyk7CiAKLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gczNjMjQxMHRzX2luZm87Ci0KIHZvaWQgX19pbml0IHMzYzI0eHhfdHNfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyAqaGFyZF9zM2MyNDEwdHNfaW5mbykKIHsKLQltZW1jcHkoJnMzYzI0MTB0c19pbmZvLCBoYXJkX3MzYzI0MTB0c19pbmZvLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvKSk7Ci0JczNjX2RldmljZV90cy5kZXYucGxhdGZvcm1fZGF0YSA9ICZzM2MyNDEwdHNfaW5mbzsKKwlzM2Nfc2V0X3BsYXRkYXRhKGhhcmRfczNjMjQxMHRzX2luZm8sCisJCQkgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyksICZzM2NfZGV2aWNlX3RzKTsKIH0KIAogLyogVVNCIERldmljZSAoR2FkZ2V0KSovCkBAIC0yMjMsMTUgKzIyMCw3IEBACiAKIHZvaWQgX19pbml0IHMzYzI0eHhfdWRjX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF91ZGNfbWFjaF9pbmZvICpwZCkKIHsKLQlzdHJ1Y3QgczNjMjQxMF91ZGNfbWFjaF9pbmZvICpucGQ7Ci0KLQlucGQgPSBrbWFsbG9jKHNpemVvZigqbnBkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5wZCkgewotCQltZW1jcHkobnBkLCBwZCwgc2l6ZW9mKCpucGQpKTsKLQkJczNjX2RldmljZV91c2JnYWRnZXQuZGV2LnBsYXRmb3JtX2RhdGEgPSBucGQ7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJubyBtZW1vcnkgZm9yIHVkYyBwbGF0Zm9ybSBkYXRhXG4iKTsKLQl9CisJczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKCpwZCksICZzM2NfZGV2aWNlX3VzYmdhZGdldCk7CiB9CiAKIC8qIFVTQiBIaWdoIFNwZWVkIDIuMCBEZXZpY2UgKEdhZGdldCkgKi8KQEAgLTI2MywxNSArMjUyLDcgQEAKIAogdm9pZCBfX2luaXQgczNjMjR4eF9oc3VkY19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0eHhfaHN1ZGNfcGxhdGRhdGEgKnBkKQogewotCXN0cnVjdCBzM2MyNHh4X2hzdWRjX3BsYXRkYXRhICpucGQ7Ci0KLQlucGQgPSBrbWFsbG9jKHNpemVvZigqbnBkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5wZCkgewotCQltZW1jcHkobnBkLCBwZCwgc2l6ZW9mKCpucGQpKTsKLQkJczNjX2RldmljZV91c2JfaHN1ZGMuZGV2LnBsYXRmb3JtX2RhdGEgPSBucGQ7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJubyBtZW1vcnkgZm9yIHVkYyBwbGF0Zm9ybSBkYXRhXG4iKTsKLQl9CisJczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKCpwZCksICZzM2NfZGV2aWNlX3VzYl9oc3VkYyk7CiB9CiAKIC8qIElJUyAqLwpAQCAtMzgzLDEzICszNjQsOCBAQAogCiB2b2lkIF9faW5pdCBzM2MyNHh4X21jaV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhICpwZGF0YSkKIHsKLQlzdHJ1Y3QgczNjMjR4eF9tY2lfcGRhdGEgKm5wZDsKLQotCW5wZCA9IGttZW1kdXAocGRhdGEsIHNpemVvZihzdHJ1Y3QgczNjMjR4eF9tY2lfcGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5wZCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IHRvIGNvcHkgcGRhdGEiLCBfX2Z1bmNfXyk7Ci0KLQlzM2NfZGV2aWNlX3NkaS5kZXYucGxhdGZvcm1fZGF0YSA9IG5wZDsKKwlzM2Nfc2V0X3BsYXRkYXRhKHBkYXRhLCBzaXplb2Yoc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhKSwKKwkJCSAmczNjX2RldmljZV9zZGkpOwogfQogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYwppbmRleCBjMTBkMTBjLi41MzliZDBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jCkBAIC03MTIsNyArNzEyLDcgQEAKICAqIGdldCBjb250cm9sIG9mIGFuIGRtYSBjaGFubmVsCiAqLwogCi1pbnQgczNjMjQxMF9kbWFfcmVxdWVzdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwKK2ludCBzM2MyNDEwX2RtYV9yZXF1ZXN0KGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCQlzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQsCiAJCQl2b2lkICpkZXYpCiB7CkBAIC03ODMsNyArNzgzLDcgQEAKICAqIGFsbG93ZWQgdG8gZ28gdGhyb3VnaC4KICovCiAKLWludCBzM2MyNDEwX2RtYV9mcmVlKHVuc2lnbmVkIGludCBjaGFubmVsLCBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQpCitpbnQgczNjMjQxMF9kbWFfZnJlZShlbnVtIGRtYV9jaCBjaGFubmVsLCBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBzM2NfZG1hX2xvb2t1cF9jaGFubmVsKGNoYW5uZWwpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC05NzQsNyArOTc0LDcgQEAKIH0KIAogaW50Ci1zM2MyNDEwX2RtYV9jdHJsKHVuc2lnbmVkIGludCBjaGFubmVsLCBlbnVtIHMzYzI0MTBfY2hhbl9vcCBvcCkKK3MzYzI0MTBfZG1hX2N0cmwoZW51bSBkbWFfY2ggY2hhbm5lbCwgZW51bSBzM2MyNDEwX2NoYW5fb3Agb3ApCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBzM2NfZG1hX2xvb2t1cF9jaGFubmVsKGNoYW5uZWwpOwogCkBAIC0xMDIxLDIzICsxMDIxLDE5IEBACiAgKiB4ZmVyc2l6ZTogICAgIHNpemUgb2YgdW5pdCBpbiBieXRlcyAoMSwyLDQpCiAqLwogCi1pbnQgczNjMjQxMF9kbWFfY29uZmlnKHVuc2lnbmVkIGludCBjaGFubmVsLAoraW50IHMzYzI0MTBfZG1hX2NvbmZpZyhlbnVtIGRtYV9jaCBjaGFubmVsLAogCQkgICAgICAgaW50IHhmZXJ1bml0KQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKIAl1bnNpZ25lZCBpbnQgZGNvbjsKIAotCXByX2RlYnVnKCIlczogY2hhbj0lZCwgeGZlcl91bml0PSVkLCBkY29uPSUwOHhcbiIsCi0JCSBfX2Z1bmNfXywgY2hhbm5lbCwgeGZlcnVuaXQsIGRjb24pOworCXByX2RlYnVnKCIlczogY2hhbj0lZCwgeGZlcl91bml0PSVkXG4iLCBfX2Z1bmNfXywgY2hhbm5lbCwgeGZlcnVuaXQpOwogCiAJaWYgKGNoYW4gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcl9kZWJ1ZygiJXM6IEluaXRpYWwgZGNvbiBpcyAlMDh4XG4iLCBfX2Z1bmNfXywgZGNvbik7Ci0KIAlkY29uID0gY2hhbi0+ZGNvbiAmIGRtYV9zZWwuZGNvbl9tYXNrOwotCi0JcHJfZGVidWcoIiVzOiBOZXcgZGNvbiBpcyAlMDh4XG4iLCBfX2Z1bmNfXywgZGNvbik7CisJcHJfZGVidWcoIiVzOiBkY29uIGlzICUwOHhcbiIsIF9fZnVuY19fLCBkY29uKTsKIAogCXN3aXRjaCAoY2hhbi0+cmVxX2NoKSB7CiAJY2FzZSBETUFDSF9JMlNfSU46CkBAIC0xMTA0LDcgKzExMDAsNyBAQAogICogZGV2YWRkcjogICBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzb3VyY2UKICovCiAKLWludCBzM2MyNDEwX2RtYV9kZXZjb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsCitpbnQgczNjMjQxMF9kbWFfZGV2Y29uZmlnKGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCQkgIGVudW0gczNjMjQxMF9kbWFzcmMgc291cmNlLAogCQkJICB1bnNpZ25lZCBsb25nIGRldmFkZHIpCiB7CkBAIC0xMTc3LDcgKzExNzMsNyBAQAogICogcmV0dXJucyB0aGUgY3VycmVudCB0cmFuc2ZlciBwb2ludHMgZm9yIHRoZSBkbWEgc291cmNlIGFuZCBkZXN0aW5hdGlvbgogKi8KIAotaW50IHMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKHVuc2lnbmVkIGludCBjaGFubmVsLCBkbWFfYWRkcl90ICpzcmMsIGRtYV9hZGRyX3QgKmRzdCkKK2ludCBzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbihlbnVtIGRtYV9jaCBjaGFubmVsLCBkbWFfYWRkcl90ICpzcmMsIGRtYV9hZGRyX3QgKmRzdCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CiAKQEAgLTExOTksNyArMTE5NSw3IEBACiAKICNpZmRlZiBDT05GSUdfUE0KIAotc3RhdGljIHZvaWQgczNjMjQxMF9kbWFfc3VzcGVuZF9jaGFuKHMzYzI0MTBfZG1hX2NoYW4gKmNwKQorc3RhdGljIHZvaWQgczNjMjQxMF9kbWFfc3VzcGVuZF9jaGFuKHN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjcCkKIHsKIAlwcmludGsoS0VSTl9ERUJVRyAic3VzcGVuZGluZyBkbWEgY2hhbm5lbCAlZFxuIiwgY3AtPm51bWJlcik7CiAKQEAgLTEyMzUsNyArMTIzMSw3IEBACiAJLyogcmVzdG9yZSBjaGFubmVsJ3MgaGFyZHdhcmUgY29uZmlndXJhdGlvbiAqLwogCiAJaWYgKCFjcC0+aW5fdXNlKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiZG1hJWQ6IHJlc3RvcmluZyBjb25maWd1cmF0aW9uXG4iLCBjcC0+bnVtYmVyKTsKIApAQCAtMTI0Niw4ICsxMjQyLDYgQEAKIAogCWlmIChjcC0+bWFwICE9IE5VTEwpCiAJCWRtYV9zZWwuc2VsZWN0KGNwLCBjcC0+bWFwKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzM2MyNDEwX2RtYV9yZXN1bWUodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmZhODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX01BQ0hfQ0xLREVWX0hfXworI2RlZmluZSBfX01BQ0hfQ0xLREVWX0hfXworCisjZGVmaW5lIF9fY2xrX2dldChjbGspICh7IDE7IH0pCisjZGVmaW5lIF9fY2xrX3B1dChjbGspIGRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy1paXMuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy1paXMuaAppbmRleCBhNmYxZDVkLi5jYzQ0ZTBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3JlZ3MtaWlzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLWlpcy5oCkBAIC02NCwxNCArNjQsNSBAQAogI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fUlhNQVNLCSAgKDB4M2YpCiAjZGVmaW5lIFMzQzI0MTBfSUlTRkNPTl9SWFNISUZUCSAgKDApCiAKLSNkZWZpbmUgUzNDMjQwMF9JSVNGQ09OX1RYRE1BICAgICAoMTw8MTEpCi0jZGVmaW5lIFMzQzI0MDBfSUlTRkNPTl9SWERNQSAgICAgKDE8PDEwKQotI2RlZmluZSBTM0MyNDAwX0lJU0ZDT05fVFhFTkFCTEUgICgxPDw5KQotI2RlZmluZSBTM0MyNDAwX0lJU0ZDT05fUlhFTkFCTEUgICgxPDw4KQotI2RlZmluZSBTM0MyNDAwX0lJU0ZDT05fVFhNQVNLCSAgKDB4MDcgPDwgNCkKLSNkZWZpbmUgUzNDMjQwMF9JSVNGQ09OX1RYU0hJRlQJICAoNCkKLSNkZWZpbmUgUzNDMjQwMF9JSVNGQ09OX1JYTUFTSwkgICgweDA3KQotI2RlZmluZSBTM0MyNDAwX0lJU0ZDT05fUlhTSElGVAkgICgwKQotCiAjZGVmaW5lIFMzQzI0MTBfSUlTRklGTyAgKDB4MTApCiAjZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX0lJU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3JlZ3Mtc3BpLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3JlZ3Mtc3BpLmgKaW5kZXggMmIzNTQ3OS4uODkyZTJmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLXNwaS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy1zcGkuaApAQCAtNjcsNyArNjcsNiBAQAogCiAjZGVmaW5lIFMzQzI0MTBfU1BQSU5fRU5NVUwJICAoMTw8MikJLyogTXVsdGkgTWFzdGVyIEVycm9yIGRldGVjdCAqLwogI2RlZmluZSBTM0MyNDEwX1NQUElOX1JFU0VSVkVECSAgKDE8PDEpCi0jZGVmaW5lIFMzQzI0MDBfU1BQSU5fbkNTICAgICAJICAoMTw8MSkJLyogU1BJIENhcmQgU2VsZWN0ICovCiAjZGVmaW5lIFMzQzI0MTBfU1BQSU5fS0VFUAkgICgxPDwwKQkvKiBNYXN0ZXIgT3V0IGtlZXAgKi8KIAogI2RlZmluZSBTM0MyNDEwX1NQUFJFCSAoMHgwQykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQwMC5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZmVhZWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L3MzYzI0MDAuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgUzNDMjQwMCBjcHUgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTW9kaWZpY2F0aW9uczoKLSAqICAgICAwOS1GZXYtMjAwNiBMQ1ZSICBGaXJzdCB2ZXJzaW9uLCBiYXNlZCBvbiBzM2MyNDEwLmgKLSovCi0KLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0MDAKLQotZXh0ZXJuICBpbnQgczNjMjQwMF9pbml0KHZvaWQpOwotCi1leHRlcm4gdm9pZCBzM2MyNDAwX21hcF9pbyh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQwMF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQwMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci0KLSNlbHNlCi0jZGVmaW5lIHMzYzI0MDBfaW5pdF9jbG9ja3MgTlVMTAotI2RlZmluZSBzM2MyNDAwX2luaXRfdWFydHMgTlVMTAotI2RlZmluZSBzM2MyNDAwX21hcF9pbyBOVUxMCi0jZGVmaW5lIHMzYzI0MDBfaW5pdCBOVUxMCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pcnEuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pcnEuYwppbmRleCA5YWVlN2UxLi5mYzhjNWY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaXJxLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2lycS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KQEAgLTY2OCwzICs2NjksOCBAQAogCiAJaXJxZGJmKCJzM2MyNDEwOiByZWdpc3RlcmVkIGludGVycnVwdCBoYW5kbGVyc1xuIik7CiB9CisKK3N0cnVjdCBzeXNjb3JlX29wcyBzM2MyNHh4X2lycV9zeXNjb3JlX29wcyA9IHsKKwkuc3VzcGVuZAk9IHMzYzI0eHhfaXJxX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzM2MyNHh4X2lycV9yZXN1bWUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0MTAtY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDEwLWNsb2NrLmMKaW5kZXggOWVjYzVkOS4uZGVmNzZhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0MTAtY2xvY2suYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQxMC1jbG9jay5jCkBAIC05MCwzNyArOTAsMzEgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0gewogCXsKIAkJLm5hbWUJCT0gIm5hbmQiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCQkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9OQU5ELAogCX0sIHsKIAkJLm5hbWUJCT0gInNkaSIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjMjQxMF9jbGtjb25fZW5hYmxlLAogCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX1NESSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJhZGMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9BREMsCiAJfSwgewogCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCiAJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fSUlDLAogCX0sIHsKIAkJLm5hbWUJCT0gImlpcyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjMjQxMF9jbGtjb25fZW5hYmxlLAogCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX0lJUywKIAl9LCB7CiAJCS5uYW1lCQk9ICJzcGkiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9TUEksCkBAIC0xMzAsNzAgKzEyNCw2MSBAQAogc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3NbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJsY2QiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCQkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9MQ0RDLAogCX0sIHsKIAkJLm5hbWUJCT0gImdwaW8iLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9HUElPLAogCX0sIHsKIAkJLm5hbWUJCT0gInVzYi1ob3N0IiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCiAJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fVVNCSCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1c2ItZGV2aWNlIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCiAJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fVVNCRCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ0aW1lcnMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9QV01ULAogCX0sIHsKIAkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMCwKKwkJLmRldm5hbWUJPSAiczNjMjQxMC11YXJ0LjAiLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCiAJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fVUFSVDAsCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAxLAorCQkuZGV2bmFtZQk9ICJzM2MyNDEwLXVhcnQuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKIAkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9VQVJUMSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmlkCQk9IDIsCisJCS5kZXZuYW1lCT0gInMzYzI0MTAtdWFydC4yIiwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjMjQxMF9jbGtjb25fZW5hYmxlLAogCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX1VBUlQyLAogCX0sIHsKIAkJLm5hbWUJCT0gInJ0YyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjMjQxMF9jbGtjb25fZW5hYmxlLAogCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX1JUQywKIAl9LCB7CiAJCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5jdHJsYml0CT0gMCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1c2ItYnVzLWhvc3QiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa191c2JfYnVzLAogCX0sIHsKIAkJLm5hbWUJCT0gInVzYi1idXMtZ2FkZ2V0IiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfdXNiX2J1cywKIAl9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDQzLWNsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQ0My1jbG9jay5jCmluZGV4IDgyZjJkNGEuLjU5NTUyYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDQzLWNsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NDMtY2xvY2suYwpAQCAtNTYsNyArNTYsNiBAQAogc3RydWN0IGNsayBjbGtfbXBsbHJlZiA9IHsKIAkubmFtZQkJPSAibXBsbHJlZiIsCiAJLnBhcmVudAkJPSAmY2xrX3h0YWwsCi0JLmlkCQk9IC0xLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgKmNsa19lcGxscmVmX3NvdXJjZXNbXSA9IHsKQEAgLTY5LDcgKzY4LDYgQEAKIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19lcGxscmVmID0gewogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJlcGxscmVmIiwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMgPSAmKHN0cnVjdCBjbGtzcmNfc291cmNlcykgewogCQkuc291cmNlcyA9IGNsa19lcGxscmVmX3NvdXJjZXMsCkBAIC05Miw3ICs5MCw2IEBACiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gImVzeXNjbGsiLAogCQkucGFyZW50CQk9ICZjbGtfZXBsbCwKLQkJLmlkCQk9IC0xLAogCX0sCiAJLnNvdXJjZXMgPSAmKHN0cnVjdCBjbGtzcmNfc291cmNlcykgewogCQkuc291cmNlcyA9IGNsa19zeXNjbGtfc291cmNlcywKQEAgLTExNSw3ICsxMTIsNiBAQAogc3RhdGljIHN0cnVjdCBjbGsgY2xrX21kaXZjbGsgPSB7CiAJLm5hbWUJCT0gIm1kaXZjbGsiLAogCS5wYXJlbnQJCT0gJmNsa19tcGxscmVmLAotCS5pZAkJPSAtMSwKIAkub3BzCQk9ICYoc3RydWN0IGNsa19vcHMpIHsKIAkJLmdldF9yYXRlCT0gczNjMjQ0M19nZXRyYXRlX21kaXZjbGssCiAJfSwKQEAgLTEzMiw3ICsxMjgsNiBAQAogCS5jbGsJPSB7CiAJCS5uYW1lCQk9ICJtc3lzY2xrIiwKIAkJLnBhcmVudAkJPSAmY2xrX3h0YWwsCi0JCS5pZAkJPSAtMSwKIAl9LAogCS5zb3VyY2VzID0gJihzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMpIHsKIAkJLnNvdXJjZXMgPSBjbGtfbXN5c2Nsa19zb3VyY2VzLApAQCAtMTU5LDcgKzE1NCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19wcmVkaXYgPSB7CiAJLm5hbWUJCT0gInByZWRpdiIsCi0JLmlkCQk9IC0xLAogCS5wYXJlbnQJCT0gJmNsa19tc3lzY2xrLmNsaywKIAkub3BzCQk9ICYoc3RydWN0IGNsa19vcHMpIHsKIAkJLmdldF9yYXRlCT0gczNjMjQ0M19wcmVkaXZfZ2V0cmF0ZSwKQEAgLTE3NCw3ICsxNjgsNiBAQAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa191c2JfYnVzX2hvc3QgPSB7CiAJLmNsawk9IHsKIAkJLm5hbWUJCT0gInVzYi1idXMtaG9zdC1wYXJlbnQiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19lc3lzY2xrLmNsaywKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX1NDTEtDT05fVVNCSE9TVCwKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcywKQEAgLTE4OSw3ICsxODIsNiBAQAogCQkvKiBBUlQgYmF1ZC1yYXRlIGNsb2NrIHNvdXJjZWQgZnJvbSBlc3lzY2xrIHZpYSBhIGRpdmlzb3IgKi8KIAkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJ1YXJ0Y2xrIiwKLQkJCS5pZAkJPSAtMSwKIAkJCS5wYXJlbnQJCT0gJmNsa19lc3lzY2xrLmNsaywKIAkJfSwKIAkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTM0MyNDQzX0NMS0RJVjEsIC5zaXplID0gNCwgLnNoaWZ0ID0gOCB9LApAQCAtMTk3LDcgKzE4OSw2IEBACiAJCS8qIGNhbWVyYSBpbnRlcmZhY2UgYnVzLWNsb2NrLCBkaXZpZGVkIGRvd24gZnJvbSBlc3lzY2xrICovCiAJCS5jbGsJPSB7CiAJCQkubmFtZQkJPSAiY2FtaWYtdXBsbCIsCS8qIHNhbWUgYXMgMjQ0MCBuYW1lICovCi0JCQkuaWQJCT0gLTEsCiAJCQkucGFyZW50CQk9ICZjbGtfZXN5c2Nsay5jbGssCiAJCQkuY3RybGJpdAk9IFMzQzI0NDNfU0NMS0NPTl9DQU1DTEssCiAJCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9zLApAQCAtMjA2LDcgKzE5Nyw2IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gImRpc3BsYXktaWYiLAotCQkJLmlkCQk9IC0xLAogCQkJLnBhcmVudAkJPSAmY2xrX2VzeXNjbGsuY2xrLAogCQkJLmN0cmxiaXQJPSBTM0MyNDQzX1NDTEtDT05fRElTUENMSywKIAkJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX3MsCkBAIC0yMTksMTMgKzIwOSwxMSBAQAogc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3Nfb2ZmW10gPSB7CiAJewogCQkubmFtZQkJPSAiYWRjIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcCwKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX1BDTEtDT05fQURDLAogCX0sIHsKIAkJLm5hbWUJCT0gImkyYyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX3AsCiAJCS5jdHJsYml0CT0gUzNDMjQ0M19QQ0xLQ09OX0lJQywKQEAgLTIzNSwxMzYgKzIyMywxMTcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzW10gPSB7CiAJewogCQkubmFtZQkJPSAiZG1hIiwKLQkJLmlkCQk9IDAsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9oLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfSENMS0NPTl9ETUEwLAogCX0sIHsKIAkJLm5hbWUJCT0gImRtYSIsCi0JCS5pZAkJPSAxLAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfaCwKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX0hDTEtDT05fRE1BMSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJkbWEiLAotCQkuaWQJCT0gMiwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX2gsCiAJCS5jdHJsYml0CT0gUzNDMjQ0M19IQ0xLQ09OX0RNQTIsCiAJfSwgewogCQkubmFtZQkJPSAiZG1hIiwKLQkJLmlkCQk9IDMsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9oLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfSENMS0NPTl9ETUEzLAogCX0sIHsKIAkJLm5hbWUJCT0gImRtYSIsCi0JCS5pZAkJPSA0LAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfaCwKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX0hDTEtDT05fRE1BNCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJkbWEiLAotCQkuaWQJCT0gNSwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX2gsCiAJCS5jdHJsYml0CT0gUzNDMjQ0M19IQ0xLQ09OX0RNQTUsCiAJfSwgewogCQkubmFtZQkJPSAiaHNtbWMiLAotCQkuaWQJCT0gMSwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX2gsCiAJCS5jdHJsYml0CT0gUzNDMjQ0M19IQ0xLQ09OX0hTTU1DLAogCX0sIHsKIAkJLm5hbWUJCT0gImdwaW8iLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfUENMS0NPTl9HUElPLAogCX0sIHsKIAkJLm5hbWUJCT0gInVzYi1ob3N0IiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfaCwKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX0hDTEtDT05fVVNCSCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1c2ItZGV2aWNlIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfaCwKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX0hDTEtDT05fVVNCRCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJsY2QiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9oLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfSENMS0NPTl9MQ0RDLAogCiAJfSwgewogCQkubmFtZQkJPSAidGltZXJzIiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcCwKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX1BDTEtDT05fUFdNVCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJjZmMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9oLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfSENMS0NPTl9DRkMsCiAJfSwgewogCQkubmFtZQkJPSAic3NtYyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX2gsCiAJCS5jdHJsYml0CT0gUzNDMjQ0M19IQ0xLQ09OX1NTTUMsCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAwLAorCQkuZGV2bmFtZQk9ICJzM2MyNDQwLXVhcnQuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfUENMS0NPTl9VQVJUMCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmlkCQk9IDEsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtdWFydC4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX3AsCiAJCS5jdHJsYml0CT0gUzNDMjQ0M19QQ0xLQ09OX1VBUlQxLAogCX0sIHsKIAkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMiwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC11YXJ0LjIiLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcCwKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX1BDTEtDT05fVUFSVDIsCiAJfSwgewogCQkubmFtZQkJPSAidWFydCIsCi0JCS5pZAkJPSAzLAorCQkuZGV2bmFtZQk9ICJzM2MyNDQwLXVhcnQuMyIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfUENMS0NPTl9VQVJUMywKIAl9LCB7CiAJCS5uYW1lCQk9ICJydGMiLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfUENMS0NPTl9SVEMsCiAJfSwgewogCQkubmFtZQkJPSAid2F0Y2hkb2ciLAotCQkuaWQJCT0gLTEsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfUENMS0NPTl9XRFQsCiAJfSwgewogCQkubmFtZQkJPSAiYWM5NyIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5jdHJsYml0CT0gUzNDMjQ0M19QQ0xLQ09OX0FDOTcsCiAJfSwgewogCQkubmFtZQkJPSAibmFuZCIsCi0JCS5pZAkJPSAtMSwKIAkJLnBhcmVudAkJPSAmY2xrX2gsCiAJfSwgewogCQkubmFtZQkJPSAidXNiLWJ1cy1ob3N0IiwKLQkJLmlkCQk9IC0xLAogCQkucGFyZW50CQk9ICZjbGtfdXNiX2J1c19ob3N0LmNsaywKIAl9CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NsZWVwLlMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvc2xlZXAuUwppbmRleCBmZDcwMzJmLi5jNTY2MTI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvc2xlZXAuUworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvc2xlZXAuUwpAQCAtNDEsMzEgKzQxLDYgQEAKIAogCS50ZXh0CiAKLQkvKiBzM2NfY3B1X3NhdmUKLQkgKgotCSAqIGVudHJ5OgotCSAqCXIxID0gdjpwIG9mZnNldAotCSovCi0KLUVOVFJZKHMzY19jcHVfc2F2ZSkKLQlzdG1mZAlzcCEsIHsgcjQgLSByMTIsIGxyIH0KLQlsZHIJcjMsID1yZXN1bWVfd2l0aF9tbXUKLQlibAljcHVfc3VzcGVuZAotCi0JQEAganVtcCB0byBmaW5hbCBjb2RlIHRvIHNlbmQgc3lzdGVtIHRvIHNsZWVwCi0JbGRyCXIwLCA9cG1fY3B1X3NsZWVwCi0JQEBsZHIJcGMsIFsgcjAgXQotCWxkcglyMCwgWyByMCBdCi0JbW92CXBjLCByMAotCQotCUBAIHJldHVybiB0byB0aGUgY2FsbGVyLCBhZnRlciBoYXZpbmcgdGhlIE1NVQotCUBAIHR1cm5lZCBvbiwgdGhpcyByZXN0b3JlcyB0aGUgbGFzdCBiaXRzIGZyb20gdGhlCi0JQEAgc3RhY2sKLXJlc3VtZV93aXRoX21tdToKLQlsZG1mZAlzcCEsIHsgcjQgLSByMTIsIHBjIH0KLQotCS5sdG9yZwotCiAJLyogc2xlZXAgbWFnaWMsIHRvIGFsbG93IHRoZSBib290bG9hZGVyIHRvIGNoZWNrIGZvciBhbiB2YWxpZAogCSAqIGltYWdlIHRvIHJlc3VtZSB0by4gTXVzdCBiZSB0aGUgZmlyc3Qgd29yZCBiZWZvcmUgdGhlCiAJICogczNjX2NwdV9yZXN1bWUgZW50cnkuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9jbG9jay5jIGIvYXJjaC9hcm0vcGxhdC1zNXAvY2xvY2suYwppbmRleCA4ZDA4MWQ5Li4wMmFmMjM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL2Nsb2NrLmMKQEAgLTE2OCw2ICsxNjgsNDEgQEAKIAlyZXR1cm4gY2xrLT5yYXRlOwogfQogCitpbnQgczVwX3NwZGlmX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXN0cnVjdCBjbGsgKnBjbGs7CisJaW50IHJldDsKKworCXBjbGsgPSBjbGtfZ2V0X3BhcmVudChjbGspOworCWlmIChJU19FUlIocGNsaykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gcGNsay0+b3BzLT5zZXRfcmF0ZShwY2xrLCByYXRlKTsKKwljbGtfcHV0KHBjbGspOworCisJcmV0dXJuIHJldDsKK30KKwordW5zaWduZWQgbG9uZyBzNXBfc3BkaWZfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXN0cnVjdCBjbGsgKnBjbGs7CisJaW50IHJhdGU7CisKKwlwY2xrID0gY2xrX2dldF9wYXJlbnQoY2xrKTsKKwlpZiAoSVNfRVJSKHBjbGspKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJhdGUgPSBwY2xrLT5vcHMtPmdldF9yYXRlKGNsayk7CisJY2xrX3B1dChwY2xrKTsKKworCXJldHVybiByYXRlOworfQorCitzdHJ1Y3QgY2xrX29wcyBzNXBfc2Nsa19zcGRpZl9vcHMgPSB7CisJLnNldF9yYXRlCT0gczVwX3NwZGlmX3NldF9yYXRlLAorCS5nZXRfcmF0ZQk9IHM1cF9zcGRpZl9nZXRfcmF0ZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrICpzNXBfY2xrc1tdIF9faW5pdGRhdGEgPSB7CiAJJmNsa19leHRfeHRhbF9tdXgsCiAJJmNsa180OG0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtb25lbmFuZC5jIGIvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW9uZW5hbmQuYwppbmRleCA2ZGI5MjYyLi4yMDMzNmM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtb25lbmFuZC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1vbmVuYW5kLmMKQEAgLTE1LDggKzE1LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvb25lbmFuZC5oPgogCiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KQEAgLTQ1LDEzICs0MywzIEBACiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9vbmVuYW5kX3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gczVwX29uZW5hbmRfcmVzb3VyY2VzLAogfTsKLQotdm9pZCBzNXBfb25lbmFuZF9zZXRfcGxhdGRhdGEoc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCi17Ci0Jc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSAqcGQ7Ci0KLQlwZCA9IGttZW1kdXAocGRhdGEsIHNpemVvZihzdHJ1Y3Qgb25lbmFuZF9wbGF0Zm9ybV9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IGZvciBwbGF0Zm9ybSBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JczVwX2RldmljZV9vbmVuYW5kLmRldi5wbGF0Zm9ybV9kYXRhID0gcGQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvbWFwLXM1cC5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21hcC1zNXAuaAppbmRleCBhNmMzZDMyLi5kOTczZDM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvbWFwLXM1cC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9tYXAtczVwLmgKQEAgLTM5LDcgKzM5LDcgQEAKICNkZWZpbmUgUzVQX1ZBX1RXRAkJUzVQX1ZBX0NPUkVQRVJJKDB4NjAwKQogI2RlZmluZSBTNVBfVkFfR0lDX0RJU1QJCVM1UF9WQV9DT1JFUEVSSSgweDEwMDApCiAKLSNkZWZpbmUgUzVQX1ZBX1VTQl9IU1BIWQlTM0NfQUREUigweDAyOTAwMDAwKQorI2RlZmluZSBTM0NfVkFfVVNCX0hTUEhZCVMzQ19BRERSKDB4MDI5MDAwMDApCiAKICNkZWZpbmUgVkFfVklDKHgpCQkoUzNDX1ZBX0lSUSArICgoeCkgKiAweDEwMDAwKSkKICNkZWZpbmUgVkFfVklDMAkJCVZBX1ZJQygwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cC1jbG9jay5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cC1jbG9jay5oCmluZGV4IDJiNmRjZmYuLjc2OWI1YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXAtY2xvY2suaAorKysgYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwLWNsb2NrLmgKQEAgLTQ3LDQgKzQ3LDkgQEAKIGV4dGVybiBpbnQgczVwX2VwbGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBzNXBfZXBsbF9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspOwogCisvKiBTUERJRiBjbGsgb3BlcmF0aW9ucyBjb21tb24gZm9yIFM1UEMxMDAvVjIxMC9DMTEwIGFuZCBFeHlub3M0ICovCitleHRlcm4gaW50IHM1cF9zcGRpZl9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzNXBfc3BkaWZfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKTsKKworZXh0ZXJuIHN0cnVjdCBjbGtfb3BzIHM1cF9zY2xrX3NwZGlmX29wczsKICNlbmRpZiAvKiBfX0FTTV9QTEFUX1M1UF9DTE9DS19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pcnEtZ3Bpb2ludC5jIGIvYXJjaC9hcm0vcGxhdC1zNXAvaXJxLWdwaW9pbnQuYwppbmRleCAxMzVhYmRhLi4zMjdhYjlmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pcnEtZ3Bpb2ludC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL2lycS1ncGlvaW50LmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCWlmICghZ2MpCiAJCXJldHVybiAtRU5PTUVNOwogCWN0ID0gZ2MtPmNoaXBfdHlwZXM7Ci0JY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2s7CisJY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2tfc2V0X2JpdDsKIAljdC0+Y2hpcC5pcnFfbWFzayA9IGlycV9nY19tYXNrX3NldF9iaXQ7CiAJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CiAJY3QtPmNoaXAuaXJxX3NldF90eXBlID0gczVwX2dwaW9pbnRfc2V0X3R5cGUsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9zNXAtdGltZS5jIGIvYXJjaC9hcm0vcGxhdC1zNXAvczVwLXRpbWUuYwppbmRleCA4OTlhOGNjLi5jODMzZTdiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9zNXAtdGltZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL3M1cC10aW1lLmMKQEAgLTMxNCwxMyArMzE0LDYgQEAKIAlyZXR1cm4gUzNDX1RJTUVSUkVHKG9mZnNldCk7CiB9CiAKLXN0YXRpYyBjeWNsZV90IHM1cF90aW1lcl9yZWFkKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCi17Ci0Jdm9pZCBfX2lvbWVtICpyZWcgPSBzNXBfdGltZXJfcmVnKCk7Ci0KLQlyZXR1cm4gKGN5Y2xlX3QpIChyZWcgPyB+X19yYXdfcmVhZGwocmVnKSA6IDApOwotfQotCiAvKgogICogT3ZlcnJpZGUgdGhlIGdsb2JhbCB3ZWFrIHNjaGVkX2Nsb2NrIHN5bWJvbCB3aXRoIHRoaXMKICAqIGxvY2FsIGltcGxlbWVudGF0aW9uIHdoaWNoIHVzZXMgdGhlIGNsb2Nrc291cmNlIHRvIGdldCBzb21lCkBAIC0zNTAsMTQgKzM0Myw2IEBACiAJdXBkYXRlX3NjaGVkX2Nsb2NrKCZjZCwgfl9fcmF3X3JlYWRsKHJlZyksICh1MzIpfjApOwogfQogCi1zdHJ1Y3QgY2xvY2tzb3VyY2UgdGltZV9jbG9ja3NvdXJjZSA9IHsKLQkubmFtZQkJPSAiczVwX2Nsb2Nrc291cmNlX3RpbWVyIiwKLQkucmF0aW5nCQk9IDI1MCwKLQkucmVhZAkJPSBzNXBfdGltZXJfcmVhZCwKLQkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKLQkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCi19OwotCiBzdGF0aWMgdm9pZCBfX2luaXQgczVwX2Nsb2Nrc291cmNlX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHBjbGs7CkBAIC0zNzAsMTMgKzM1NSwxNCBAQAogCiAJY2xvY2tfcmF0ZSA9IGNsa19nZXRfcmF0ZSh0aW5fc291cmNlKTsKIAotCWluaXRfc2NoZWRfY2xvY2soJmNkLCBzNXBfdXBkYXRlX3NjaGVkX2Nsb2NrLCAzMiwgY2xvY2tfcmF0ZSk7Ci0KIAlzNXBfdGltZV9zZXR1cCh0aW1lcl9zb3VyY2Uuc291cmNlX2lkLCBUQ05UX01BWCk7CiAJczVwX3RpbWVfc3RhcnQodGltZXJfc291cmNlLnNvdXJjZV9pZCwgUEVSSU9ESUMpOwogCi0JaWYgKGNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZ0aW1lX2Nsb2Nrc291cmNlLCBjbG9ja19yYXRlKSkKLQkJcGFuaWMoIiVzOiBjYW4ndCByZWdpc3RlciBjbG9ja3NvdXJjZVxuIiwgdGltZV9jbG9ja3NvdXJjZS5uYW1lKTsKKwlpbml0X3NjaGVkX2Nsb2NrKCZjZCwgczVwX3VwZGF0ZV9zY2hlZF9jbG9jaywgMzIsIGNsb2NrX3JhdGUpOworCisJaWYgKGNsb2Nrc291cmNlX21taW9faW5pdChzNXBfdGltZXJfcmVnKCksICJzNXBfY2xvY2tzb3VyY2VfdGltZXIiLAorCQkJY2xvY2tfcmF0ZSwgMjUwLCAzMiwgY2xvY2tzb3VyY2VfbW1pb19yZWFkbF9kb3duKSkKKwkJcGFuaWMoInM1cF9jbG9ja3NvdXJjZV90aW1lcjogY2FuJ3QgcmVnaXN0ZXIgY2xvY2tzb3VyY2VcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgczVwX3RpbWVyX3Jlc291cmNlcyh2b2lkKQpAQCAtMzg0LDYgKzM3MCw3IEBACiAKIAl1bnNpZ25lZCBsb25nIGV2ZW50X2lkID0gdGltZXJfc291cmNlLmV2ZW50X2lkOwogCXVuc2lnbmVkIGxvbmcgc291cmNlX2lkID0gdGltZXJfc291cmNlLnNvdXJjZV9pZDsKKwljaGFyIGRldm5hbWVbMTVdOwogCiAJdGltZXJjbGsgPSBjbGtfZ2V0KE5VTEwsICJ0aW1lcnMiKTsKIAlpZiAoSVNfRVJSKHRpbWVyY2xrKSkKQEAgLTM5MSw2ICszNzgsMTAgQEAKIAogCWNsa19lbmFibGUodGltZXJjbGspOwogCisJc3ByaW50ZihkZXZuYW1lLCAiczNjMjR4eC1wd20uJWx1IiwgZXZlbnRfaWQpOworCXMzY19kZXZpY2VfdGltZXJbZXZlbnRfaWRdLmlkID0gZXZlbnRfaWQ7CisJczNjX2RldmljZV90aW1lcltldmVudF9pZF0uZGV2LmluaXRfbmFtZSA9IGRldm5hbWU7CisKIAl0aW5fZXZlbnQgPSBjbGtfZ2V0KCZzM2NfZGV2aWNlX3RpbWVyW2V2ZW50X2lkXS5kZXYsICJwd20tdGluIik7CiAJaWYgKElTX0VSUih0aW5fZXZlbnQpKQogCQlwYW5pYygiZmFpbGVkIHRvIGdldCBwd20tdGluIGNsb2NrIGZvciBldmVudCB0aW1lciIpOwpAQCAtNDAxLDYgKzM5MiwxMCBAQAogCiAJY2xrX2VuYWJsZSh0aW5fZXZlbnQpOwogCisJc3ByaW50ZihkZXZuYW1lLCAiczNjMjR4eC1wd20uJWx1Iiwgc291cmNlX2lkKTsKKwlzM2NfZGV2aWNlX3RpbWVyW3NvdXJjZV9pZF0uaWQgPSBzb3VyY2VfaWQ7CisJczNjX2RldmljZV90aW1lcltzb3VyY2VfaWRdLmRldi5pbml0X25hbWUgPSBkZXZuYW1lOworCiAJdGluX3NvdXJjZSA9IGNsa19nZXQoJnMzY19kZXZpY2VfdGltZXJbc291cmNlX2lkXS5kZXYsICJwd20tdGluIik7CiAJaWYgKElTX0VSUih0aW5fc291cmNlKSkKIAkJcGFuaWMoImZhaWxlZCB0byBnZXQgcHdtLXRpbiBjbG9jayBmb3Igc291cmNlIHRpbWVyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9zeXNtbXUuYyBiL2FyY2gvYXJtL3BsYXQtczVwL3N5c21tdS5jCmluZGV4IDU0ZjVlZGQuLmUxY2JjNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL3N5c21tdS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL3N5c21tdS5jCkBAIC0yMzIsOCArMjMyLDggQEAKIAkJCWdvdG8gZXJyX3JlczsKIAkJfQogCi0JCW1lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LAotCQkJCSgocmVzLT5lbmQpIC0gKHJlcy0+c3RhcnQpKSArIDEsIHBkZXYtPm5hbWUpOworCQltZW0gPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLAorCQkJCQkgcGRldi0+bmFtZSk7CiAJCWlmICghbWVtKSB7CiAJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXF1ZXN0IHRoZSBtZW1vcnkgcmVnaW9uIG9mICVzLlxuIiwKIAkJCQkJCQlzeXNtbXVfaXBzX25hbWVbaV0pOwpAQCAtMjQxLDcgKzI0MSw3IEBACiAJCQlnb3RvIGVycl9yZXM7CiAJCX0KIAotCQlzeXNtbXVzZnJzW2ldID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwkJc3lzbW11c2Zyc1tpXSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAkJaWYgKCFzeXNtbXVzZnJzW2ldKSB7CiAJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpb3JlbWFwKCkgZm9yICVzLlxuIiwKIAkJCQkJCQlzeXNtbXVfaXBzX25hbWVbaV0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvS2NvbmZpZwppbmRleCA0ZDc5NTE5Li5iM2UxMDY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvS2NvbmZpZworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvS2NvbmZpZwpAQCAtMjgwLDYgKzI4MCwxMiBAQAogCWhlbHAKIAkgIENvbXBpbGUgaW4gcGxhdGZvcm0gZGV2aWNlIGRlZmluaXRpb24gZm9yIFBXTSBUaW1lcgogCitjb25maWcgU0FNU1VOR19ERVZfQkFDS0xJR0hUCisJYm9vbAorCWRlcGVuZHMgb24gU0FNU1VOR19ERVZfUFdNCisJaGVscAorCSAgQ29tcGlsZSBpbiBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbiBMQ0QgYmFja2xpZ2h0IHdpdGggUFdNIFRpbWVyCisKIGNvbmZpZyBTM0MyNFhYX1BXTQogCWJvb2wgIlBXTSBkZXZpY2Ugc3VwcG9ydCIKIAlzZWxlY3QgSEFWRV9QV00KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9NYWtlZmlsZQppbmRleCA1M2ViMTViLi44NTM3NjRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL01ha2VmaWxlCkBAIC01OSw2ICs1OSw3IEBACiBvYmotJChDT05GSUdfU0FNU1VOR19ERVZfVFMpCSs9IGRldi10cy5vCiBvYmotJChDT05GSUdfU0FNU1VOR19ERVZfS0VZUEFEKQkrPSBkZXYta2V5cGFkLm8KIG9iai0kKENPTkZJR19TQU1TVU5HX0RFVl9QV00pCSs9IGRldi1wd20ubworb2JqLSQoQ09ORklHX1NBTVNVTkdfREVWX0JBQ0tMSUdIVCkJKz0gZGV2LWJhY2tsaWdodC5vCiAKICMgRE1BIHN1cHBvcnQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Nsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvY2xvY2suYwppbmRleCA3NzI4OTI4Li4zMDJjNDI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvY2xvY2suYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvY2xvY2suYwpAQCAtNzEsNzQgKzcxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZXZfaXNfczNjX3VhcnQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKipwZGV2ID0gczNjMjR4eF91YXJ0X2RldnM7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoczNjMjR4eF91YXJ0X2RldnMpOyBpKyssIHBkZXYrKykKLQkJaWYgKCpwZGV2ICYmIGRldiA9PSAmKCpwZGV2KS0+ZGV2KQotCQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZXJpYWwgZHJpdmVycyBjYWxsIGdldF9jbG9jaygpIHZlcnkgZWFybHksIGJlZm9yZSBwbGF0Zm9ybSBidXMKLSAqIGhhcyBiZWVuIHNldCB1cCwgdGhpcyByZXF1aXJlcyBhIHNwZWNpYWwgY2hlY2sgdG8gbGV0IHRoZW0gZ2V0Ci0gKiBhIHByb3BlciBjbG9jawotICovCi0KLXN0YXRpYyBpbnQgZGV2X2lzX3BsYXRmb3JtX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGRldi0+YnVzID09ICZwbGF0Zm9ybV9idXNfdHlwZSB8fAotCSAgICAgICAoZGV2LT5idXMgPT0gTlVMTCAmJiBkZXZfaXNfczNjX3VhcnQoZGV2KSk7Ci19Ci0KLS8qIENsb2NrIEFQSSBjYWxscyAqLwotCi1zdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCi17Ci0Jc3RydWN0IGNsayAqcDsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBFUlJfUFRSKC1FTk9FTlQpOwotCWludCBpZG5vOwotCi0JaWYgKGRldiA9PSBOVUxMIHx8ICFkZXZfaXNfcGxhdGZvcm1fZGV2aWNlKGRldikpCi0JCWlkbm8gPSAtMTsKLQllbHNlCi0JCWlkbm8gPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KS0+aWQ7Ci0KLQlzcGluX2xvY2soJmNsb2Nrc19sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsb2NrcywgbGlzdCkgewotCQlpZiAocC0+aWQgPT0gaWRubyAmJgotCQkgICAgc3RyY21wKGlkLCBwLT5uYW1lKSA9PSAwICYmCi0JCSAgICB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKLQkJCWNsayA9IHA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIGNoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSBhIGRldmljZSB3YXMgc3VwcGxpZWQsIGJ1dCB0aGUKLQkgKiBjbG9jayB0aGF0IHdhcyBiZWluZyBzZWFyY2hlZCBmb3IgaXMgbm90IGRldmljZSBzcGVjaWZpYyAqLwotCi0JaWYgKElTX0VSUihjbGspKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsb2NrcywgbGlzdCkgewotCQkJaWYgKHAtPmlkID09IC0xICYmIHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJgotCQkJICAgIHRyeV9tb2R1bGVfZ2V0KHAtPm93bmVyKSkgewotCQkJCWNsayA9IHA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9jaygmY2xvY2tzX2xvY2spOwotCXJldHVybiBjbGs7Ci19Ci0KLXZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCi17Ci0JbW9kdWxlX3B1dChjbGstPm93bmVyKTsKLX0KLQogaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQogewogCWlmIChJU19FUlIoY2xrKSB8fCBjbGsgPT0gTlVMTCkKQEAgLTI0MSw4ICsxNzMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLUVYUE9SVF9TWU1CT0woY2xrX2dldCk7Ci1FWFBPUlRfU1lNQk9MKGNsa19wdXQpOwogRVhQT1JUX1NZTUJPTChjbGtfZW5hYmxlKTsKIEVYUE9SVF9TWU1CT0woY2xrX2Rpc2FibGUpOwogRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3JhdGUpOwpAQCAtMjY1LDcgKzE5NSw2IEBACiAKIHN0cnVjdCBjbGsgY2xrX3h0YWwgPSB7CiAJLm5hbWUJCT0gInh0YWwiLAotCS5pZAkJPSAtMSwKIAkucmF0ZQkJPSAwLAogCS5wYXJlbnQJCT0gTlVMTCwKIAkuY3RybGJpdAk9IDAsCkBAIC0yNzMsMzAgKzIwMiwyNSBAQAogCiBzdHJ1Y3QgY2xrIGNsa19leHQgPSB7CiAJLm5hbWUJCT0gImV4dCIsCi0JLmlkCQk9IC0xLAogfTsKIAogc3RydWN0IGNsayBjbGtfZXBsbCA9IHsKIAkubmFtZQkJPSAiZXBsbCIsCi0JLmlkCQk9IC0xLAogfTsKIAogc3RydWN0IGNsayBjbGtfbXBsbCA9IHsKIAkubmFtZQkJPSAibXBsbCIsCi0JLmlkCQk9IC0xLAogCS5vcHMJCT0gJmNsa19vcHNfZGVmX3NldHJhdGUsCiB9OwogCiBzdHJ1Y3QgY2xrIGNsa191cGxsID0gewogCS5uYW1lCQk9ICJ1cGxsIiwKLQkuaWQJCT0gLTEsCiAJLnBhcmVudAkJPSBOVUxMLAogCS5jdHJsYml0CT0gMCwKIH07CiAKIHN0cnVjdCBjbGsgY2xrX2YgPSB7CiAJLm5hbWUJCT0gImZjbGsiLAotCS5pZAkJPSAtMSwKIAkucmF0ZQkJPSAwLAogCS5wYXJlbnQJCT0gJmNsa19tcGxsLAogCS5jdHJsYml0CT0gMCwKQEAgLTMwNCw3ICsyMjgsNiBAQAogCiBzdHJ1Y3QgY2xrIGNsa19oID0gewogCS5uYW1lCQk9ICJoY2xrIiwKLQkuaWQJCT0gLTEsCiAJLnJhdGUJCT0gMCwKIAkucGFyZW50CQk9IE5VTEwsCiAJLmN0cmxiaXQJPSAwLApAQCAtMzEzLDcgKzIzNiw2IEBACiAKIHN0cnVjdCBjbGsgY2xrX3AgPSB7CiAJLm5hbWUJCT0gInBjbGsiLAotCS5pZAkJPSAtMSwKIAkucmF0ZQkJPSAwLAogCS5wYXJlbnQJCT0gTlVMTCwKIAkuY3RybGJpdAk9IDAsCkBAIC0zMjIsNyArMjQ0LDYgQEAKIAogc3RydWN0IGNsayBjbGtfdXNiX2J1cyA9IHsKIAkubmFtZQkJPSAidXNiLWJ1cyIsCi0JLmlkCQk9IC0xLAogCS5yYXRlCQk9IDAsCiAJLnBhcmVudAkJPSAmY2xrX3VwbGwsCiB9OwpAQCAtMzMwLDcgKzI1MSw2IEBACiAKIHN0cnVjdCBjbGsgczNjMjR4eF91Y2xrID0gewogCS5uYW1lCQk9ICJ1Y2xrIiwKLQkuaWQJCT0gLTEsCiB9OwogCiAvKiBpbml0aWFsaXNlIHRoZSBjbG9jayBzeXN0ZW0gKi8KQEAgLTM0NiwxNCArMjY2LDExIEBACiAJaWYgKGNsay0+ZW5hYmxlID09IE5VTEwpCiAJCWNsay0+ZW5hYmxlID0gY2xrX251bGxfZW5hYmxlOwogCi0JLyogYWRkIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjbG9ja3MgKi8KLQotCS8qIFF1aWNrIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGNsb2NrIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZC4gKi8KLQlCVUdfT04oY2xrLT5saXN0LnByZXYgIT0gY2xrLT5saXN0Lm5leHQpOwotCi0Jc3Bpbl9sb2NrKCZjbG9ja3NfbG9jayk7Ci0JbGlzdF9hZGQoJmNsay0+bGlzdCwgJmNsb2Nrcyk7Ci0Jc3Bpbl91bmxvY2soJmNsb2Nrc19sb2NrKTsKKwkvKiBmaWxsIHVwIHRoZSBjbGtfbG9va3VwIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXIgaXQqLworCWNsay0+bG9va3VwLmRldl9pZCA9IGNsay0+ZGV2bmFtZTsKKwljbGstPmxvb2t1cC5jb25faWQgPSBjbGstPm5hbWU7CisJY2xrLT5sb29rdXAuY2xrID0gY2xrOworCWNsa2Rldl9hZGQoJmNsay0+bG9va3VwKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDU4LDE1ICszNzUsMTIgQEAKIHN0YXRpYyBpbnQgY2xrX2RlYnVnZnNfcmVnaXN0ZXJfb25lKHN0cnVjdCBjbGsgKmMpCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3QgZGVudHJ5ICpkLCAqY2hpbGQsICpjaGlsZF90bXA7CisJc3RydWN0IGRlbnRyeSAqZDsKIAlzdHJ1Y3QgY2xrICpwYSA9IGMtPnBhcmVudDsKIAljaGFyIHNbMjU1XTsKIAljaGFyICpwID0gczsKIAotCXAgKz0gc3ByaW50ZihwLCAiJXMiLCBjLT5uYW1lKTsKLQotCWlmIChjLT5pZCA+PSAwKQotCQlzcHJpbnRmKHAsICI6JWQiLCBjLT5pZCk7CisJcCArPSBzcHJpbnRmKHAsICIlcyIsIGMtPmRldm5hbWUpOwogCiAJZCA9IGRlYnVnZnNfY3JlYXRlX2RpcihzLCBwYSA/IHBhLT5kZW50IDogY2xrX2RlYnVnZnNfcm9vdCk7CiAJaWYgKCFkKQpAQCAtNDg4LDEwICs0MDIsNyBAQAogCXJldHVybiAwOwogCiBlcnJfb3V0OgotCWQgPSBjLT5kZW50OwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGlsZCwgY2hpbGRfdG1wLCAmZC0+ZF9zdWJkaXJzLCBkX3UuZF9jaGlsZCkKLQkJZGVidWdmc19yZW1vdmUoY2hpbGQpOwotCWRlYnVnZnNfcmVtb3ZlKGMtPmRlbnQpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShjLT5kZW50KTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWJhY2tsaWdodC5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1iYWNrbGlnaHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2VkZDRjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1iYWNrbGlnaHQuYwpAQCAtMCwwICsxLDE0OSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1iYWNrbGlnaHQuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogICAgICAgICAgICAgIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBDb21tb24gaW5mcmFzdHJ1Y3R1cmUgZm9yIFBXTSBCYWNrbGlnaHQgZm9yIFNhbXN1bmcgYm9hcmRzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgorCisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorI2luY2x1ZGUgPHBsYXQvYmFja2xpZ2h0Lmg+CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19ibF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0aW1lcl9kZXYgPQorCQkJY29udGFpbmVyX29mKGRldi0+cGFyZW50LCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOworCXN0cnVjdCBzYW1zdW5nX2JsX2dwaW9faW5mbyAqYmxfZ3Bpb19pbmZvID0KKwkJCXRpbWVyX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoYmxfZ3Bpb19pbmZvLT5ubywgIkJhY2tsaWdodCIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVxdWVzdCBHUElPIGZvciBMQ0QgQmFja2xpZ2h0XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBDb25maWd1cmUgR1BJTyBwaW4gd2l0aCBzcGVjaWZpYyBHUElPIGZ1bmN0aW9uIGZvciBQV00gdGltZXIgKi8KKwlzM2NfZ3Bpb19jZmdwaW4oYmxfZ3Bpb19pbmZvLT5ubywgYmxfZ3Bpb19pbmZvLT5mdW5jKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzYW1zdW5nX2JsX2V4aXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRpbWVyX2RldiA9CisJCQljb250YWluZXJfb2YoZGV2LT5wYXJlbnQsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7CisJc3RydWN0IHNhbXN1bmdfYmxfZ3Bpb19pbmZvICpibF9ncGlvX2luZm8gPQorCQkJdGltZXJfZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCXMzY19ncGlvX2NmZ3BpbihibF9ncGlvX2luZm8tPm5vLCBTM0NfR1BJT19PVVRQVVQpOworCWdwaW9fZnJlZShibF9ncGlvX2luZm8tPm5vKTsKK30KKworLyogSW5pdGlhbGl6ZSBmZXcgaW1wb3J0YW50IGZpZWxkcyBvZiBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEKKyAqIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzLiBUaGVzZSBmaWVsZHMgY2FuIGJlIG92ZXJyaWRkZW4gYnkKKyAqIGJvYXJkLXNwZWNpZmljIHZhbHVlcyBzZW50IGZyb20gbWFjaGluZSBmaWxlLgorICogRm9yIGVhc2Ugb2Ygb3BlcmF0aW9uLCB0aGVzZSBmaWVsZHMgYXJlIGluaXRpYWxpemVkIHdpdGggdmFsdWVzCisgKiB1c2VkIGJ5IG1vc3Qgc2Ftc3VuZyBib2FyZHMuCisgKiBVc2VycyBoYXMgdGhlIG9wdGlvbiBvZiBzZW5kaW5nIGluZm8gYWJvdXQgb3RoZXIgcGFyYW1ldGVycworICogZm9yIHRoZWlyIHNwZWNpZmljIGJvYXJkcworICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHNhbXN1bmdfZGZsX2JsX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkubWF4X2JyaWdodG5lc3MgPSAyNTUsCisJLmRmdF9icmlnaHRuZXNzID0gMjU1LAorCS5wd21fcGVyaW9kX25zICA9IDc4NzcwLAorCS5pbml0ICAgICAgICAgICA9IHNhbXN1bmdfYmxfaW5pdCwKKwkuZXhpdCAgICAgICAgICAgPSBzYW1zdW5nX2JsX2V4aXQsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzYW1zdW5nX2RmbF9ibF9kZXZpY2UgX19pbml0ZGF0YSA9IHsKKwkubmFtZQkJPSAicHdtLWJhY2tsaWdodCIsCit9OworCisvKiBzYW1zdW5nX2JsX3NldCAtIFNldCBib2FyZCBzcGVjaWZpYyBkYXRhIChpZiBhbnkpIHByb3ZpZGVkIGJ5IHVzZXIgZm9yCisgKiBQV00gQmFja2xpZ2h0IGNvbnRyb2wgYW5kIHJlZ2lzdGVyIHNwZWNpZmljIFBXTSBhbmQgYmFja2xpZ2h0IGRldmljZS4KKyAqIEBncGlvX2luZm86CXN0cnVjdHVyZSBjb250YWluaW5nIEdQSU8gaW5mbyBmb3IgUFdNIHRpbWVyCisgKiBAYmxfZGF0YToJc3RydWN0dXJlIGNvbnRhaW5pbmcgQmFja2xpZ2h0IGNvbnRyb2wgZGF0YQorICovCit2b2lkIHNhbXN1bmdfYmxfc2V0KHN0cnVjdCBzYW1zdW5nX2JsX2dwaW9faW5mbyAqZ3Bpb19pbmZvLAorCXN0cnVjdCBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEgKmJsX2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2Ftc3VuZ19ibF9kZXZpY2U7CisJc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSAqc2Ftc3VuZ19ibF9kYXRhOworCisJc2Ftc3VuZ19ibF9kZXZpY2UgPSBrbWVtZHVwKCZzYW1zdW5nX2RmbF9ibF9kZXZpY2UsCisJCQlzaXplb2Yoc3RydWN0IHBsYXRmb3JtX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghc2Ftc3VuZ19ibF9kZXZpY2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IGZvciBwbGF0Zm9ybSBkZXZcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXNhbXN1bmdfYmxfZGF0YSA9IHMzY19zZXRfcGxhdGRhdGEoJnNhbXN1bmdfZGZsX2JsX2RhdGEsCisJCXNpemVvZihzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhKSwgc2Ftc3VuZ19ibF9kZXZpY2UpOworCWlmICghc2Ftc3VuZ19ibF9kYXRhKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lbW9yeSBmb3IgcGxhdGZvcm0gZGV2XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2RhdGE7CisJfQorCisJLyogQ29weSBib2FyZCBzcGVjaWZpYyBkYXRhIHByb3ZpZGVkIGJ5IHVzZXIgKi8KKwlzYW1zdW5nX2JsX2RhdGEtPnB3bV9pZCA9IGJsX2RhdGEtPnB3bV9pZDsKKwlzYW1zdW5nX2JsX2RldmljZS0+ZGV2LnBhcmVudCA9CisJCQkmczNjX2RldmljZV90aW1lcltzYW1zdW5nX2JsX2RhdGEtPnB3bV9pZF0uZGV2OworCisJaWYgKGJsX2RhdGEtPm1heF9icmlnaHRuZXNzKQorCQlzYW1zdW5nX2JsX2RhdGEtPm1heF9icmlnaHRuZXNzID0gYmxfZGF0YS0+bWF4X2JyaWdodG5lc3M7CisJaWYgKGJsX2RhdGEtPmRmdF9icmlnaHRuZXNzKQorCQlzYW1zdW5nX2JsX2RhdGEtPmRmdF9icmlnaHRuZXNzID0gYmxfZGF0YS0+ZGZ0X2JyaWdodG5lc3M7CisJaWYgKGJsX2RhdGEtPmx0aF9icmlnaHRuZXNzKQorCQlzYW1zdW5nX2JsX2RhdGEtPmx0aF9icmlnaHRuZXNzID0gYmxfZGF0YS0+bHRoX2JyaWdodG5lc3M7CisJaWYgKGJsX2RhdGEtPnB3bV9wZXJpb2RfbnMpCisJCXNhbXN1bmdfYmxfZGF0YS0+cHdtX3BlcmlvZF9ucyA9IGJsX2RhdGEtPnB3bV9wZXJpb2RfbnM7CisJaWYgKGJsX2RhdGEtPmluaXQpCisJCXNhbXN1bmdfYmxfZGF0YS0+aW5pdCA9IGJsX2RhdGEtPmluaXQ7CisJaWYgKGJsX2RhdGEtPm5vdGlmeSkKKwkJc2Ftc3VuZ19ibF9kYXRhLT5ub3RpZnkgPSBibF9kYXRhLT5ub3RpZnk7CisJaWYgKGJsX2RhdGEtPmV4aXQpCisJCXNhbXN1bmdfYmxfZGF0YS0+ZXhpdCA9IGJsX2RhdGEtPmV4aXQ7CisJaWYgKGJsX2RhdGEtPmNoZWNrX2ZiKQorCQlzYW1zdW5nX2JsX2RhdGEtPmNoZWNrX2ZiID0gYmxfZGF0YS0+Y2hlY2tfZmI7CisKKwkvKiBLZWVwIHRoZSBHUElPIGluZm8gZm9yIGZ1dHVyZSB1c2UgKi8KKwlzM2NfZGV2aWNlX3RpbWVyW3NhbXN1bmdfYmxfZGF0YS0+cHdtX2lkXS5kZXYucGxhdGZvcm1fZGF0YSA9IGdwaW9faW5mbzsKKworCS8qIFJlZ2lzdGVyIHRoZSBzcGVjaWZpYyBQV00gdGltZXIgZGV2IGZvciBCYWNrbGlnaHQgY29udHJvbCAqLworCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigKKwkJCSZzM2NfZGV2aWNlX3RpbWVyW3NhbXN1bmdfYmxfZGF0YS0+cHdtX2lkXSk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBwd20gdGltZXIgZm9yIGJhY2tsaWdodDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3BsYXRfcmVnMTsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgQmFja2xpZ2h0IGRldiAqLworCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcihzYW1zdW5nX2JsX2RldmljZSk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBiYWNrbGlnaHQgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfcGxhdF9yZWcyOworCX0KKworCXJldHVybjsKKworZXJyX3BsYXRfcmVnMjoKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmczNjX2RldmljZV90aW1lcltzYW1zdW5nX2JsX2RhdGEtPnB3bV9pZF0pOworZXJyX3BsYXRfcmVnMToKKwlrZnJlZShzYW1zdW5nX2JsX2RhdGEpOworZXJyX2RhdGE6CisJa2ZyZWUoc2Ftc3VuZ19ibF9kZXZpY2UpOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtZmIuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtZmIuYwppbmRleCBiZjYwMjA0Li40OWExMzYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWZiLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1mYi5jCkBAIC01OCwxNiArNTgsNiBAQAogCiB2b2lkIF9faW5pdCBzM2NfZmJfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgKnBkKQogewotCXN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgKm5wZDsKLQotCWlmICghcGQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gcGxhdGZvcm0gZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JbnBkID0ga21lbWR1cChwZCwgc2l6ZW9mKHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5wZCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IGZvciBwbGF0Zm9ybSBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0KLQlzM2NfZGV2aWNlX2ZiLmRldi5wbGF0Zm9ybV9kYXRhID0gbnBkOworCXMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhKSwKKwkJCSAmczNjX2RldmljZV9mYik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWh3bW9uLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWh3bW9uLmMKaW5kZXggYjNmZmI5NS4uYzkxYTc5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1od21vbi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHdtb24uYwpAQCAtMjcsMTYgKzI3LDYgQEAKIAogdm9pZCBfX2luaXQgczNjX2h3bW9uX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX2h3bW9uX3BkYXRhICpwZCkKIHsKLQlzdHJ1Y3QgczNjX2h3bW9uX3BkYXRhICpucGQ7Ci0KLQlpZiAoIXBkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIHBsYXRmb3JtIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCW5wZCA9IGttZW1kdXAocGQsIHNpemVvZihzdHJ1Y3QgczNjX2h3bW9uX3BkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFucGQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lbW9yeSBmb3IgcGxhdGZvcm0gZGF0YVxuIiwgX19mdW5jX18pOwotCi0JczNjX2RldmljZV9od21vbi5kZXYucGxhdGZvcm1fZGF0YSA9IG5wZDsKKwlzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzY19od21vbl9wZGF0YSksCisJCQkgJnMzY19kZXZpY2VfaHdtb24pOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMwLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzAuYwppbmRleCAzYTYwMWMxLi5mODI1MWY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzAuYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzAuYwpAQCAtNDgsNyArNDgsNyBAQAogCS5yZXNvdXJjZQkgID0gczNjX2kyY19yZXNvdXJjZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgZGVmYXVsdF9pMmNfZGF0YTAgX19pbml0ZGF0YSA9IHsKK3N0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyBkZWZhdWx0X2kyY19kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmZsYWdzCQk9IDAsCiAJLnNsYXZlX2FkZHIJPSAweDEwLAogCS5mcmVxdWVuY3kJPSAxMDAqMTAwMCwKQEAgLTYwLDEzICs2MCwxMSBAQAogCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOwogCiAJaWYgKCFwZCkKLQkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTA7CisJCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7CiAKLQlucGQgPSBrbWVtZHVwKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFucGQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lbW9yeSBmb3IgcGxhdGZvcm0gZGF0YVxuIiwgX19mdW5jX18pOwotCWVsc2UgaWYgKCFucGQtPmNmZ19ncGlvKQorCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAorCQkJICAgICAgICZzM2NfZGV2aWNlX2kyYzApOworCisJaWYgKCFucGQtPmNmZ19ncGlvKQogCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzBfY2ZnX2dwaW87Ci0KLQlzM2NfZGV2aWNlX2kyYzAuZGV2LnBsYXRmb3JtX2RhdGEgPSBucGQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzEuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjMS5jCmluZGV4IDg1OGVlMmEuLjNiN2M3YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjMS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjMS5jCkBAIC00NCwyNiArNDQsMTggQEAKIAkucmVzb3VyY2UJICA9IHMzY19pMmNfcmVzb3VyY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIGRlZmF1bHRfaTJjX2RhdGExIF9faW5pdGRhdGEgPSB7Ci0JLmZsYWdzCQk9IDAsCi0JLmJ1c19udW0JPSAxLAotCS5zbGF2ZV9hZGRyCT0gMHgxMCwKLQkuZnJlcXVlbmN5CT0gMTAwKjEwMDAsCi0JLnNkYV9kZWxheQk9IDEwMCwKLX07Ci0KIHZvaWQgX19pbml0IHMzY19pMmMxX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQogewogCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOwogCi0JaWYgKCFwZCkKLQkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTE7CisJaWYgKCFwZCkgeworCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOworCQlwZC0+YnVzX251bSA9IDE7CisJfQogCi0JbnBkID0ga21lbWR1cChwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksIEdGUF9LRVJORUwpOwotCWlmICghbnBkKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBtZW1vcnkgZm9yIHBsYXRmb3JtIGRhdGFcbiIsIF9fZnVuY19fKTsKLQllbHNlIGlmICghbnBkLT5jZmdfZ3BpbykKKwlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKKwkJCSAgICAgICAmczNjX2RldmljZV9pMmMxKTsKKworCWlmICghbnBkLT5jZmdfZ3BpbykKIAkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmMxX2NmZ19ncGlvOwotCi0JczNjX2RldmljZV9pMmMxLmRldi5wbGF0Zm9ybV9kYXRhID0gbnBkOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMyLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzIuYwppbmRleCBmZjRiYTY5Li4wN2U5ZmQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzIuYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzIuYwpAQCAtNDUsMjYgKzQ1LDE4IEBACiAJLnJlc291cmNlCSAgPSBzM2NfaTJjX3Jlc291cmNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyBkZWZhdWx0X2kyY19kYXRhMiBfX2luaXRkYXRhID0gewotCS5mbGFncwkJPSAwLAotCS5idXNfbnVtCT0gMiwKLQkuc2xhdmVfYWRkcgk9IDB4MTAsCi0JLmZyZXF1ZW5jeQk9IDEwMCoxMDAwLAotCS5zZGFfZGVsYXkJPSAxMDAsCi19OwotCiB2b2lkIF9faW5pdCBzM2NfaTJjMl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKIAotCWlmICghcGQpCi0JCXBkID0gJmRlZmF1bHRfaTJjX2RhdGEyOworCWlmICghcGQpIHsKKwkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTsKKwkJcGQtPmJ1c19udW0gPSAyOworCX0KIAotCW5wZCA9IGttZW1kdXAocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5wZCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IGZvciBwbGF0Zm9ybSBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JZWxzZSBpZiAoIW5wZC0+Y2ZnX2dwaW8pCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCisJCQkgICAgICAgJnMzY19kZXZpY2VfaTJjMik7CisKKwlpZiAoIW5wZC0+Y2ZnX2dwaW8pCiAJCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjMl9jZmdfZ3BpbzsKLQotCXMzY19kZXZpY2VfaTJjMi5kZXYucGxhdGZvcm1fZGF0YSA9IG5wZDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjMy5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMzLmMKaW5kZXggODU4NmExMC4uZDQ4ZWZhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMzLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMzLmMKQEAgLTQzLDI2ICs0MywxOCBAQAogCS5yZXNvdXJjZQk9IHMzY19pMmNfcmVzb3VyY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIGRlZmF1bHRfaTJjX2RhdGEzIF9faW5pdGRhdGEgPSB7Ci0JLmZsYWdzCQk9IDAsCi0JLmJ1c19udW0JPSAzLAotCS5zbGF2ZV9hZGRyCT0gMHgxMCwKLQkuZnJlcXVlbmN5CT0gMTAwKjEwMDAsCi0JLnNkYV9kZWxheQk9IDEwMCwKLX07Ci0KIHZvaWQgX19pbml0IHMzY19pMmMzX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQogewogCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOwogCi0JaWYgKCFwZCkKLQkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTM7CisJaWYgKCFwZCkgeworCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOworCQlwZC0+YnVzX251bSA9IDM7CisJfQogCi0JbnBkID0ga21lbWR1cChwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksIEdGUF9LRVJORUwpOwotCWlmICghbnBkKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBtZW1vcnkgZm9yIHBsYXRmb3JtIGRhdGFcbiIsIF9fZnVuY19fKTsKLQllbHNlIGlmICghbnBkLT5jZmdfZ3BpbykKKwlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKKwkJCSAgICAgICAmczNjX2RldmljZV9pMmMzKTsKKworCWlmICghbnBkLT5jZmdfZ3BpbykKIAkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmMzX2NmZ19ncGlvOwotCi0JczNjX2RldmljZV9pMmMzLmRldi5wbGF0Zm9ybV9kYXRhID0gbnBkOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM0LmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzQuYwppbmRleCBkZjIxNTllLi4wN2UyNjQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzQuYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzQuYwpAQCAtNDMsMjYgKzQzLDE4IEBACiAJLnJlc291cmNlCT0gczNjX2kyY19yZXNvdXJjZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgZGVmYXVsdF9pMmNfZGF0YTQgX19pbml0ZGF0YSA9IHsKLQkuZmxhZ3MJCT0gMCwKLQkuYnVzX251bQk9IDQsCi0JLnNsYXZlX2FkZHIJPSAweDEwLAotCS5mcmVxdWVuY3kJPSAxMDAqMTAwMCwKLQkuc2RhX2RlbGF5CT0gMTAwLAotfTsKLQogdm9pZCBfX2luaXQgczNjX2kyYzRfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCiB7CiAJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7CiAKLQlpZiAoIXBkKQotCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhNDsKKwlpZiAoIXBkKSB7CisJCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7CisJCXBkLT5idXNfbnVtID0gNDsKKwl9CiAKLQlucGQgPSBrbWVtZHVwKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFucGQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lbW9yeSBmb3IgcGxhdGZvcm0gZGF0YVxuIiwgX19mdW5jX18pOwotCWVsc2UgaWYgKCFucGQtPmNmZ19ncGlvKQorCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAorCQkJICAgICAgICZzM2NfZGV2aWNlX2kyYzQpOworCisJaWYgKCFucGQtPmNmZ19ncGlvKQogCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzRfY2ZnX2dwaW87Ci0KLQlzM2NfZGV2aWNlX2kyYzQuZGV2LnBsYXRmb3JtX2RhdGEgPSBucGQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzUuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNS5jCmluZGV4IDA0OTljMmMuLmY0OTY1NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNS5jCkBAIC00MywyNiArNDMsMTggQEAKIAkucmVzb3VyY2UJPSBzM2NfaTJjX3Jlc291cmNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyBkZWZhdWx0X2kyY19kYXRhNSBfX2luaXRkYXRhID0gewotCS5mbGFncwkJPSAwLAotCS5idXNfbnVtCT0gNSwKLQkuc2xhdmVfYWRkcgk9IDB4MTAsCi0JLmZyZXF1ZW5jeQk9IDEwMCoxMDAwLAotCS5zZGFfZGVsYXkJPSAxMDAsCi19OwotCiB2b2lkIF9faW5pdCBzM2NfaTJjNV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKIAotCWlmICghcGQpCi0JCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE1OworCWlmICghcGQpIHsKKwkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTsKKwkJcGQtPmJ1c19udW0gPSA1OworCX0KIAotCW5wZCA9IGttZW1kdXAocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5wZCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IGZvciBwbGF0Zm9ybSBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JZWxzZSBpZiAoIW5wZC0+Y2ZnX2dwaW8pCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCisJCQkgICAgICAgJnMzY19kZXZpY2VfaTJjNSk7CisKKwlpZiAoIW5wZC0+Y2ZnX2dwaW8pCiAJCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjNV9jZmdfZ3BpbzsKLQotCXMzY19kZXZpY2VfaTJjNS5kZXYucGxhdGZvcm1fZGF0YSA9IG5wZDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNi5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM2LmMKaW5kZXggNDA4MzEwOC4uMTQxZDc5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM2LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM2LmMKQEAgLTQzLDI2ICs0MywxOCBAQAogCS5yZXNvdXJjZQk9IHMzY19pMmNfcmVzb3VyY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIGRlZmF1bHRfaTJjX2RhdGE2IF9faW5pdGRhdGEgPSB7Ci0JLmZsYWdzCQk9IDAsCi0JLmJ1c19udW0JPSA2LAotCS5zbGF2ZV9hZGRyCT0gMHgxMCwKLQkuZnJlcXVlbmN5CT0gMTAwKjEwMDAsCi0JLnNkYV9kZWxheQk9IDEwMCwKLX07Ci0KIHZvaWQgX19pbml0IHMzY19pMmM2X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQogewogCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOwogCi0JaWYgKCFwZCkKLQkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTY7CisJaWYgKCFwZCkgeworCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOworCQlwZC0+YnVzX251bSA9IDY7CisJfQogCi0JbnBkID0ga21lbWR1cChwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksIEdGUF9LRVJORUwpOwotCWlmICghbnBkKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBtZW1vcnkgZm9yIHBsYXRmb3JtIGRhdGFcbiIsIF9fZnVuY19fKTsKLQllbHNlIGlmICghbnBkLT5jZmdfZ3BpbykKKwlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKKwkJCSAgICAgICAmczNjX2RldmljZV9pMmM2KTsKKworCWlmICghbnBkLT5jZmdfZ3BpbykKIAkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmM2X2NmZ19ncGlvOwotCi0JczNjX2RldmljZV9pMmM2LmRldi5wbGF0Zm9ybV9kYXRhID0gbnBkOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM3LmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzcuYwppbmRleCAxMTgyNDUxLi45ZGRkY2QxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzcuYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzcuYwpAQCAtNDMsMjYgKzQzLDE4IEBACiAJLnJlc291cmNlCT0gczNjX2kyY19yZXNvdXJjZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgZGVmYXVsdF9pMmNfZGF0YTcgX19pbml0ZGF0YSA9IHsKLQkuZmxhZ3MJCT0gMCwKLQkuYnVzX251bQk9IDcsCi0JLnNsYXZlX2FkZHIJPSAweDEwLAotCS5mcmVxdWVuY3kJPSAxMDAqMTAwMCwKLQkuc2RhX2RlbGF5CT0gMTAwLAotfTsKLQogdm9pZCBfX2luaXQgczNjX2kyYzdfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCiB7CiAJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7CiAKLQlpZiAoIXBkKQotCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhNzsKKwlpZiAoIXBkKSB7CisJCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7CisJCXBkLT5idXNfbnVtID0gNzsKKwl9CiAKLQlucGQgPSBrbWVtZHVwKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFucGQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lbW9yeSBmb3IgcGxhdGZvcm0gZGF0YVxuIiwgX19mdW5jX18pOwotCWVsc2UgaWYgKCFucGQtPmNmZ19ncGlvKQorCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAorCQkJICAgICAgICZzM2NfZGV2aWNlX2kyYzcpOworCisJaWYgKCFucGQtPmNmZ19ncGlvKQogCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzdfY2ZnX2dwaW87Ci0KLQlzM2NfZGV2aWNlX2kyYzcuZGV2LnBsYXRmb3JtX2RhdGEgPSBucGQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LW5hbmQuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtbmFuZC5jCmluZGV4IDY5MjdhZTguLmI4ZTMwZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtbmFuZC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtbmFuZC5jCkBAIC05MSwxMSArOTEsMTAgQEAKIAkgKiB0aW1lIHRoZW4gdGhlcmUgaXMgbGl0dGxlIGNoYW5jZSB0aGUgc3lzdGVtIGlzIGdvaW5nIHRvIHJ1bi4KIAkgKi8gCiAKLQlucGQgPSBrbWVtZHVwKG5hbmQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9uYW5kKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFucGQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIGNvcHlpbmcgcGxhdGZvcm0gZGF0YVxuIiwgX19mdW5jX18pOworCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEobmFuZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX25hbmQpLAorCQkJCSZzM2NfZGV2aWNlX25hbmQpOworCWlmICghbnBkKQogCQlyZXR1cm47Ci0JfQogCiAJLyogbm93IHNlZSBpZiB3ZSBuZWVkIHRvIGNvcHkgYW55IG9mIHRoZSBuYW5kIHNldCBkYXRhICovCiAKQEAgLTEyMyw2ICsxMjIsNCBAQAogCQkJdG8rKzsKIAkJfQogCX0KLQotCXMzY19kZXZpY2VfbmFuZC5kZXYucGxhdGZvcm1fZGF0YSA9IG5wZDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtb25lbmFuZC5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1vbmVuYW5kLmMKaW5kZXggNDVlYzczMi4uZjU0YWU3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1vbmVuYW5kLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1vbmVuYW5kLmMKQEAgLTEzLDggKzEzLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvb25lbmFuZC5oPgogCiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KQEAgLTQzLDEzICs0MSwzIEBACiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19vbmVuYW5kX3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gczNjX29uZW5hbmRfcmVzb3VyY2VzLAogfTsKLQotdm9pZCBzM2Nfb25lbmFuZF9zZXRfcGxhdGRhdGEoc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCi17Ci0Jc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSAqcGQ7Ci0KLQlwZCA9IGttZW1kdXAocGRhdGEsIHNpemVvZihzdHJ1Y3Qgb25lbmFuZF9wbGF0Zm9ybV9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IGZvciBwbGF0Zm9ybSBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JczNjX2RldmljZV9vbmVuYW5kLmRldi5wbGF0Zm9ybV9kYXRhID0gcGQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXRzLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXRzLmMKaW5kZXggM2U0YmQ4MS4uODI1NDNmMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi10cy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtdHMuYwpAQCAtNDUsMTYgKzQ1LDYgQEAKIAogdm9pZCBfX2luaXQgczNjMjR4eF90c19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvICpwZCkKIHsKLQlzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gKm5wZDsKLQotCWlmICghcGQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gcGxhdGZvcm0gZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JbnBkID0ga21lbWR1cChwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghbnBkKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBtZW1vcnkgZm9yIHBsYXRmb3JtIGRhdGFcbiIsIF9fZnVuY19fKTsKLQotCXMzY19kZXZpY2VfdHMuZGV2LnBsYXRmb3JtX2RhdGEgPSBucGQ7CisJczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyksCisJCQkgJnMzY19kZXZpY2VfdHMpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi11c2IuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtdXNiLmMKaW5kZXggMGUwYTNiZi4uMzNmYmFhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi11c2IuYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXVzYi5jCkBAIC02MCwxMSArNjAsNiBAQAogICovCiB2b2lkIF9faW5pdCBzM2Nfb2hjaV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfaGNkX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IHMzYzI0MTBfaGNkX2luZm8gKm5wZDsKLQotCW5wZCA9IGttZW1kdXAoaW5mbywgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX2hjZF9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFucGQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lbW9yeSBmb3IgcGxhdGZvcm0gZGF0YVxuIiwgX19mdW5jX18pOwotCi0JczNjX2RldmljZV9vaGNpLmRldi5wbGF0Zm9ybV9kYXRhID0gbnBkOworCXMzY19zZXRfcGxhdGRhdGEoaW5mbywgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX2hjZF9pbmZvKSwKKwkJCSAmczNjX2RldmljZV9vaGNpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kbWEuYwppbmRleCBjYjQ1OWRkLi42MTQzYWExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2RtYS5jCkBAIC00MSw3ICs0MSw3IEBACiAgKiBpcnE/CiAqLwogCi1pbnQgczNjMjQxMF9kbWFfc2V0X29wZm4odW5zaWduZWQgaW50IGNoYW5uZWwsIHMzYzI0MTBfZG1hX29wZm5fdCBydG4pCitpbnQgczNjMjQxMF9kbWFfc2V0X29wZm4oZW51bSBkbWFfY2ggY2hhbm5lbCwgczNjMjQxMF9kbWFfb3Bmbl90IHJ0bikKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CiAKQEAgLTU2LDcgKzU2LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfc2V0X29wZm4pOwogCi1pbnQgczNjMjQxMF9kbWFfc2V0X2J1ZmZkb25lX2ZuKHVuc2lnbmVkIGludCBjaGFubmVsLCBzM2MyNDEwX2RtYV9jYmZuX3QgcnRuKQoraW50IHMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihlbnVtIGRtYV9jaCBjaGFubmVsLCBzM2MyNDEwX2RtYV9jYmZuX3QgcnRuKQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKIApAQCAtNzEsNyArNzEsNyBAQAogfQogRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4pOwogCi1pbnQgczNjMjQxMF9kbWFfc2V0ZmxhZ3ModW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBmbGFncykKK2ludCBzM2MyNDEwX2RtYV9zZXRmbGFncyhlbnVtIGRtYV9jaCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBzM2NfZG1hX2xvb2t1cF9jaGFubmVsKGNoYW5uZWwpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2JhY2tsaWdodC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9iYWNrbGlnaHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQ4ZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9iYWNrbGlnaHQuaApAQCAtMCwwICsxLDI2IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2JhY2tsaWdodC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiAgICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9QTEFUX0JBQ0tMSUdIVF9ICisjZGVmaW5lIF9fQVNNX1BMQVRfQkFDS0xJR0hUX0ggX19GSUxFX18KKworLyogc2Ftc3VuZ19ibF9ncGlvX2luZm8gLSBHUElPIGluZm8gZm9yIFBXTSBCYWNrbGlnaHQgY29udHJvbAorICogQG5vOgkJR1BJTyBudW1iZXIgZm9yIFBXTSB0aW1lciBvdXQKKyAqIEBmdW5jOglTcGVjaWFsIGZ1bmN0aW9uIG9mIEdQSU8gbGluZSBmb3IgUFdNIHRpbWVyCisgKi8KK3N0cnVjdCBzYW1zdW5nX2JsX2dwaW9faW5mbyB7CisJaW50IG5vOworCWludCBmdW5jOworfTsKKworZXh0ZXJuIHZvaWQgc2Ftc3VuZ19ibF9zZXQoc3RydWN0IHNhbXN1bmdfYmxfZ3Bpb19pbmZvICpncGlvX2luZm8sCisJc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSAqYmxfZGF0YSk7CisKKyNlbmRpZiAvKiBfX0FTTV9QTEFUX0JBQ0tMSUdIVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2Nsb2NrLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2Nsb2NrLmgKaW5kZXggOTgzYzU3OC4uODdkNWIzOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jbG9jay5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY2xvY2suaApAQCAtMTAsNiArMTAsNyBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+CiAKIHN0cnVjdCBjbGs7CiAKQEAgLTQwLDYgKzQxLDcgQEAKIAlzdHJ1Y3QgbW9kdWxlICAgICAgICAqb3duZXI7CiAJc3RydWN0IGNsayAgICAgICAgICAgKnBhcmVudDsKIAljb25zdCBjaGFyICAgICAgICAgICAqbmFtZTsKKwljb25zdCBjaGFyCQkqZGV2bmFtZTsKIAlpbnQJCSAgICAgIGlkOwogCWludAkJICAgICAgdXNhZ2U7CiAJdW5zaWduZWQgbG9uZyAgICAgICAgIHJhdGU7CkBAIC00Nyw2ICs0OSw3IEBACiAKIAlzdHJ1Y3QgY2xrX29wcwkJKm9wczsKIAlpbnQJCSAgICAoKmVuYWJsZSkoc3RydWN0IGNsayAqLCBpbnQgZW5hYmxlKTsKKwlzdHJ1Y3QgY2xrX2xvb2t1cAlsb29rdXA7CiAjaWYgZGVmaW5lZChDT05GSUdfUE1fREVCVUcpICYmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQogCXN0cnVjdCBkZW50cnkJCSpkZW50OwkvKiBGb3IgdmlzaWJsZSB0cmVlIGhpZXJhcmNoeSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RldnMuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZGV2cy5oCmluZGV4IGI2MWI4ZWUuLmUzYjMxYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZGV2cy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZGV2cy5oCkBAIC0xMiw2ICsxMiwxMCBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KKworI2lmbmRlZiBfX1BMQVRfREVWU19ICisjZGVmaW5lIF9fUExBVF9ERVZTX0ggX19GSUxFX18KKwogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiBzdHJ1Y3QgczNjMjR4eF91YXJ0X3Jlc291cmNlcyB7CkBAIC03NSwxMCArNzksOCBAQAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2Vfc3BpMjsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3NwaTA7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9zcGkxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ0MF9kZXZpY2Vfc3BpMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0NDBfZGV2aWNlX3NwaTE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDUwX2RldmljZV9zcGkwOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ1MF9kZXZpY2Vfc3BpMTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0eDBfZGV2aWNlX3NwaTA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NHgwX2RldmljZV9zcGkxOwogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2h3bW9uOwogCkBAIC0xNjEsMyArMTYzLDUgQEAKICAqLwogZXh0ZXJuIHZvaWQgKnMzY19zZXRfcGxhdGRhdGEodm9pZCAqcGQsIHNpemVfdCBwZHNpemUsCiAJCQkgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworI2VuZGlmIC8qIF9fUExBVF9ERVZTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS5oCmluZGV4IDJlOGY4YzYuLjhjMjczYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEuaApAQCAtNDIsNiArNDIsNyBAQAogfTsKIAogc3RydWN0IHMzYzI0MTBfZG1hX2NoYW47CitlbnVtIGRtYV9jaDsKIAogLyogczNjMjQxMF9kbWFfY2Jmbl90CiAgKgpAQCAtNjIsNyArNjMsNyBAQAogICogcmVxdWVzdCBhIGRtYSBjaGFubmVsIGV4Y2x1c2l2bGV5CiAqLwogCi1leHRlcm4gaW50IHMzYzI0MTBfZG1hX3JlcXVlc3QodW5zaWduZWQgaW50IGNoYW5uZWwsCitleHRlcm4gaW50IHMzYzI0MTBfZG1hX3JlcXVlc3QoZW51bSBkbWFfY2ggY2hhbm5lbCwKIAkJCSAgICAgICBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICosIHZvaWQgKmRldik7CiAKIApAQCAtNzEsMTQgKzcyLDE0IEBACiAgKiBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBkbWEgY2hhbm5lbAogKi8KIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9jdHJsKHVuc2lnbmVkIGludCBjaGFubmVsLCBlbnVtIHMzYzI0MTBfY2hhbl9vcCBvcCk7CitleHRlcm4gaW50IHMzYzI0MTBfZG1hX2N0cmwoZW51bSBkbWFfY2ggY2hhbm5lbCwgZW51bSBzM2MyNDEwX2NoYW5fb3Agb3ApOwogCiAvKiBzM2MyNDEwX2RtYV9zZXRmbGFncwogICoKICAqIHNldCB0aGUgY2hhbm5lbCdzIGZsYWdzIHRvIGEgZ2l2ZW4gc3RhdGUKICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfc2V0ZmxhZ3ModW5zaWduZWQgaW50IGNoYW5uZWwsCitleHRlcm4gaW50IHMzYzI0MTBfZG1hX3NldGZsYWdzKGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKIAogLyogczNjMjQxMF9kbWFfZnJlZQpAQCAtODYsNyArODcsNyBAQAogICogZnJlZSB0aGUgZG1hIGNoYW5uZWwgKHdpbGwgYWxzbyBhYm9ydCBhbnkgb3V0c3RhbmRpbmcgb3BlcmF0aW9ucykKICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfZnJlZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCAqKTsKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfZnJlZShlbnVtIGRtYV9jaCBjaGFubmVsLCBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICopOwogCiAvKiBzM2MyNDEwX2RtYV9lbnF1ZXVlCiAgKgpAQCAtOTUsNyArOTYsNyBAQAogICogZHJhaW5lZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBnaXZlbiB0byB0aGUgRE1BIHN5c3RlbS4KICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfZW5xdWV1ZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdm9pZCAqaWQsCitleHRlcm4gaW50IHMzYzI0MTBfZG1hX2VucXVldWUoZW51bSBkbWFfY2ggY2hhbm5lbCwgdm9pZCAqaWQsCiAJCQkgICAgICAgZG1hX2FkZHJfdCBkYXRhLCBpbnQgc2l6ZSk7CiAKIC8qIHMzYzI0MTBfZG1hX2NvbmZpZwpAQCAtMTAzLDE0ICsxMDQsMTQgQEAKICAqIGNvbmZpZ3VyZSB0aGUgZG1hIGNoYW5uZWwKICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfY29uZmlnKHVuc2lnbmVkIGludCBjaGFubmVsLCBpbnQgeGZlcnVuaXQpOworZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9jb25maWcoZW51bSBkbWFfY2ggY2hhbm5lbCwgaW50IHhmZXJ1bml0KTsKIAogLyogczNjMjQxMF9kbWFfZGV2Y29uZmlnCiAgKgogICogY29uZmlndXJlIHRoZSBkZXZpY2Ugd2UncmUgdGFsa2luZyB0bwogKi8KIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9kZXZjb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsCitleHRlcm4gaW50IHMzYzI0MTBfZG1hX2RldmNvbmZpZyhlbnVtIGRtYV9jaCBjaGFubmVsLAogCQllbnVtIHMzYzI0MTBfZG1hc3JjIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBkZXZhZGRyKTsKIAogLyogczNjMjQxMF9kbWFfZ2V0cG9zaXRpb24KQEAgLTExOCwxMCArMTE5LDEwIEBACiAgKiBnZXQgdGhlIHBvc2l0aW9uIHRoYXQgdGhlIGRtYSB0cmFuc2ZlciBpcyBjdXJyZW50bHkgYXQKICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfZ2V0cG9zaXRpb24odW5zaWduZWQgaW50IGNoYW5uZWwsCitleHRlcm4gaW50IHMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKGVudW0gZG1hX2NoIGNoYW5uZWwsCiAJCQkJICAgZG1hX2FkZHJfdCAqc3JjLCBkbWFfYWRkcl90ICpkZXN0KTsKIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9zZXRfb3Bmbih1bnNpZ25lZCBpbnQsIHMzYzI0MTBfZG1hX29wZm5fdCBydG4pOwotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4odW5zaWduZWQgaW50LCBzM2MyNDEwX2RtYV9jYmZuX3QgcnRuKTsKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfc2V0X29wZm4oZW51bSBkbWFfY2gsIHMzYzI0MTBfZG1hX29wZm5fdCBydG4pOworZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4oZW51bSBkbWFfY2gsIHMzYzI0MTBfZG1hX2NiZm5fdCBydG4pOwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZ3Bpby1jZmctaGVscGVycy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy1oZWxwZXJzLmgKaW5kZXggM2FkODM4Ni4uOWE0ZTUzZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy1oZWxwZXJzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy1oZWxwZXJzLmgKQEAgLTE0MCw3ICsxNDAsNyBAQAogCiAvKiBQdWxsLXt1cCxkb3dufSByZXNpc3RvciBjb250cm9scy4KICAqCi0gKiBTM0MyNDEwLFMzQzI0NDAsUzNDMjRBMCA9IFB1bGwtVVAsCisgKiBTM0MyNDEwLFMzQzI0NDAgPSBQdWxsLVVQLAogICogUzNDMjQxMixTM0MyNDEzID0gUHVsbC1Eb3duCiAgKiBTM0M2NDAwLFMzQzY0MTAgPSBQdWxsLUJvdGggW05vbmUsRG93bixVcCxVbmRlZl0KICAqIFMzQzI0NDMgPSBQdWxsLUJvdGggW25vdCBzYW1lIGFzIFMzQzY0MDBdCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2lpYy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9paWMuaAppbmRleCAxNTQzZGE4Li41NmIwMDU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2lpYy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvaWljLmgKQEAgLTcxLDQgKzcxLDYgQEAKIGV4dGVybiB2b2lkIHMzY19pMmM2X2NmZ19ncGlvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBzM2NfaTJjN19jZmdfZ3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpOwogCitleHRlcm4gc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIGRlZmF1bHRfaTJjX2RhdGE7CisKICNlbmRpZiAvKiBfX0FTTV9BUkNIX0lJQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BtLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BtLmgKaW5kZXggN2ZiNmY2Yi4uZjY3NDk5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wbS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcG0uaApAQCAtNDIsNyArNDIsNyBAQAogLyogcGVyLWNwdSBzbGVlcCBmdW5jdGlvbnMgKi8KIAogZXh0ZXJuIHZvaWQgKCpwbV9jcHVfcHJlcCkodm9pZCk7Ci1leHRlcm4gdm9pZCAoKnBtX2NwdV9zbGVlcCkodm9pZCk7CitleHRlcm4gaW50ICgqcG1fY3B1X3NsZWVwKSh1bnNpZ25lZCBsb25nKTsKIAogLyogRmxhZ3MgZm9yIFBNIENvbnRyb2wgKi8KIApAQCAtNTIsMTAgKzUyLDkgQEAKIAogLyogZnJvbSBzbGVlcC5TICovCiAKLWV4dGVybiBpbnQgIHMzY19jcHVfc2F2ZSh1bnNpZ25lZCBsb25nICpzYXZlYmxrLCBsb25nKTsKIGV4dGVybiB2b2lkIHMzY19jcHVfcmVzdW1lKHZvaWQpOwogCi1leHRlcm4gdm9pZCBzM2MyNDEwX2NwdV9zdXNwZW5kKHZvaWQpOworZXh0ZXJuIGludCBzM2MyNDEwX2NwdV9zdXNwZW5kKHVuc2lnbmVkIGxvbmcpOwogCiAvKiBzbGVlcCBzYXZlIGluZm8gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXNlcmlhbC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXNlcmlhbC5oCmluZGV4IGMxNTFjNWYuLmJhYzM2ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zZXJpYWwuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3Mtc2VyaWFsLmgKQEAgLTE1NSwxNCArMTU1LDYgQEAKICNkZWZpbmUgUzNDMjQxMF9VRlNUQVRfUlhNQVNLCSAgKDE1PDwwKQogI2RlZmluZSBTM0MyNDEwX1VGU1RBVF9SWFNISUZUCSAgKDApCiAKLS8qIFVGU1RBVCBTM0MyNEEwICovCi0jZGVmaW5lIFMzQzI0QTBfVUZTVEFUX1RYRlVMTAkgICgxIDw8IDE0KQotI2RlZmluZSBTM0MyNEEwX1VGU1RBVF9SWEZVTEwJICAoMSA8PCA2KQotI2RlZmluZSBTM0MyNEEwX1VGU1RBVF9UWE1BU0sJICAoNjMgPDwgOCkKLSNkZWZpbmUgUzNDMjRBMF9VRlNUQVRfVFhTSElGVAkgICg4KQotI2RlZmluZSBTM0MyNEEwX1VGU1RBVF9SWE1BU0sJICAoNjMpCi0jZGVmaW5lIFMzQzI0QTBfVUZTVEFUX1JYU0hJRlQJICAoMCkKLQogLyogVUZTVEFUIFMzQzI0NDMgc2FtZSBhcyBTM0MyNDQwICovCiAjZGVmaW5lIFMzQzI0NDBfVUZTVEFUX1RYRlVMTAkgICgxPDwxNCkKICNkZWZpbmUgUzNDMjQ0MF9VRlNUQVRfUlhGVUxMCSAgKDE8PDYpCkBAIC0yMjQsNiArMjE2LDggQEAKICNkZWZpbmUgUzVQVjIxMF9VRlNUQVRfUlhNQVNLCSgyNTU8PDApCiAjZGVmaW5lIFM1UFYyMTBfVUZTVEFUX1JYU0hJRlQJKDApCiAKKyNkZWZpbmUgTk9fTkVFRF9DSEVDS19DTEtTUkMJMQorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAvKiBzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NHh4LXNwaS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NHh4LXNwaS5oCmluZGV4IDBmZmUzNGEuLjRjMTZmYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjNjR4eC1zcGkuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzY0eHgtc3BpLmgKQEAgLTM5LDYgKzM5LDcgQEAKICAqIEBmaWZvX2x2bF9tYXNrOiBBbGwgdHggZmlmb19sdmwgZmllbGRzIHN0YXJ0IGF0IG9mZnNldC02CiAgKiBAcnhfbHZsX29mZnNldDogRGVwZW5kcyBvbiB0eCBmaWZvX2x2bCBmaWVsZCBhbmQgYnVzIG51bWJlcgogICogQGhpZ2hfc3BlZWQ6IElmIHRoZSBjb250cm9sbGVyIHN1cHBvcnRzIEhJR0hfU1BFRURfRU4gYml0CisgKiBAdHhfc3RfZG9uZTogRGVwZW5kcyBvbiB0eCBmaWZvX2x2bCBmaWVsZAogICovCiBzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyB7CiAJaW50IHNyY19jbGtfbnI7CkBAIC01Myw2ICs1NCw3IEBACiAJaW50IGZpZm9fbHZsX21hc2s7CiAJaW50IHJ4X2x2bF9vZmZzZXQ7CiAJaW50IGhpZ2hfc3BlZWQ7CisJaW50IHR4X3N0X2RvbmU7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pcnEtdWFydC5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2lycS11YXJ0LmMKaW5kZXggMzI1ODJjMC4uNjU3NDA1YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2lycS11YXJ0LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2lycS11YXJ0LmMKQEAgLTU0LDggKzU0LDE1IEBACiAKIAlnYyA9IGlycV9hbGxvY19nZW5lcmljX2NoaXAoInMzYy11YXJ0IiwgMSwgdWlycS0+YmFzZV9pcnEsIHJlZ19iYXNlLAogCQkJCSAgICBoYW5kbGVfbGV2ZWxfaXJxKTsKKworCWlmICghZ2MpIHsKKwkJcHJfZXJyKCIlczogaXJxX2FsbG9jX2dlbmVyaWNfY2hpcCBmb3IgSVJRICV1IGZhaWxlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCB1aXJxLT5iYXNlX2lycSk7CisJCXJldHVybjsKKwl9CisKIAljdCA9IGdjLT5jaGlwX3R5cGVzOwotCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrOworCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrX3NldF9iaXQ7CiAJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19zZXRfYml0OwogCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OwogCWN0LT5yZWdzLmFjayA9IFMzQzY0WFhfVUlOVFA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaXJxLXZpYy10aW1lci5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2lycS12aWMtdGltZXIuYwppbmRleCBhNjA3NTQ2Li5mNzE0ZDA2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaXJxLXZpYy10aW1lci5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pcnEtdmljLXRpbWVyLmMKQEAgLTU0LDYgKzU0LDEzIEBACiAKIAlzM2NfdGdjID0gaXJxX2FsbG9jX2dlbmVyaWNfY2hpcCgiczNjLXRpbWVyIiwgMSwgdGltZXJfaXJxLAogCQkJCQkgUzNDNjRYWF9USU5UX0NTVEFULCBoYW5kbGVfbGV2ZWxfaXJxKTsKKworCWlmICghczNjX3RnYykgeworCQlwcl9lcnIoIiVzOiBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwIGZvciBJUlEgJWQgZmFpbGVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHRpbWVyX2lycSk7CisJCXJldHVybjsKKwl9CisKIAljdCA9IHMzY190Z2MtPmNoaXBfdHlwZXM7CiAJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OwogCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpcnFfZ2NfbWFza19zZXRfYml0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLWNoZWNrLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcG0tY2hlY2suYwppbmRleCA2YjczM2ZhLi4zY2JkNjI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcG0tY2hlY2suYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcG0tY2hlY2suYwpAQCAtNzIsNyArNzIsNyBAQAogCiBzdGF0aWMgdTMyICpzM2NfcG1fY291bnRyYW0oc3RydWN0IHJlc291cmNlICpyZXMsIHUzMiAqdmFsKQogewotCXUzMiBzaXplID0gKHUzMikocmVzLT5lbmQgLSByZXMtPnN0YXJ0KSsxOworCXUzMiBzaXplID0gKHUzMilyZXNvdXJjZV9zaXplKHJlcyk7CiAKIAlzaXplICs9IENIRUNLX0NIVU5LU0laRS0xOwogCXNpemUgLz0gQ0hFQ0tfQ0hVTktTSVpFOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcG0uYwppbmRleCA1YzBhNDQwLi41ZmExNzQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcG0uYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcG0uYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKQEAgLTIzMSw3ICsyMzIsNyBAQAogCiAKIHZvaWQgKCpwbV9jcHVfcHJlcCkodm9pZCk7Ci12b2lkICgqcG1fY3B1X3NsZWVwKSh2b2lkKTsKK2ludCAoKnBtX2NwdV9zbGVlcCkodW5zaWduZWQgbG9uZyk7CiAKICNkZWZpbmUgYW55X2FsbG93ZWQobWFzaywgYWxsb3cpICgoKG1hc2spICYgKGFsbG93KSkgIT0gKGFsbG93KSkKIApAQCAtMjk0LDE1ICsyOTUsMTEgQEAKIAogCXMzY19wbV9hcmNoX3N0b3BfY2xvY2tzKCk7CiAKLQkvKiBzM2NfY3B1X3NhdmUgd2lsbCBhbHNvIGFjdCBhcyBvdXIgcmV0dXJuIHBvaW50IGZyb20gd2hlbgorCS8qIHRoaXMgd2lsbCBhbHNvIGFjdCBhcyBvdXIgcmV0dXJuIHBvaW50IGZyb20gd2hlbgogCSAqIHdlIHJlc3VtZSBhcyBpdCBzYXZlcyBpdHMgb3duIHJlZ2lzdGVyIHN0YXRlIGFuZCByZXN0b3JlcyBpdAogCSAqIGR1cmluZyB0aGUgcmVzdW1lLiAgKi8KIAotCXMzY19jcHVfc2F2ZSgwLCBQTEFUX1BIWVNfT0ZGU0VUIC0gUEFHRV9PRkZTRVQpOwotCi0JLyogcmVzdG9yZSB0aGUgY3B1IHN0YXRlIHVzaW5nIHRoZSBrZXJuZWwncyBjcHUgaW5pdCBjb2RlLiAqLwotCi0JY3B1X2luaXQoKTsKKwljcHVfc3VzcGVuZCgwLCBwbV9jcHVfc2xlZXApOwogCiAJLyogcmVzdG9yZSB0aGUgc3lzdGVtIHN0YXRlICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wd20tY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wd20tY2xvY2suYwppbmRleCA0NmM5MzgxLi5mMWJiYTg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcHdtLWNsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3B3bS1jbG9jay5jCkBAIC0yNjgsNiArMjY4LDcgQEAKIAlbMF0JPSB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQk9ICJwd20tdGRpdiIsCisJCQkuZGV2bmFtZQk9ICJzM2MyNHh4LXB3bS4wIiwKIAkJCS5vcHMJPSAmY2xrX3RkaXZfb3BzLAogCQkJLnBhcmVudAk9ICZjbGtfdGltZXJfc2NhbGVyWzBdLAogCQl9LApAQCAtMjc1LDYgKzI3Niw3IEBACiAJWzFdCT0gewogCQkuY2xrCT0gewogCQkJLm5hbWUJPSAicHdtLXRkaXYiLAorCQkJLmRldm5hbWUJPSAiczNjMjR4eC1wd20uMSIsCiAJCQkub3BzCT0gJmNsa190ZGl2X29wcywKIAkJCS5wYXJlbnQJPSAmY2xrX3RpbWVyX3NjYWxlclswXSwKIAkJfQpAQCAtMjgyLDYgKzI4NCw3IEBACiAJWzJdCT0gewogCQkuY2xrCT0gewogCQkJLm5hbWUJPSAicHdtLXRkaXYiLAorCQkJLmRldm5hbWUJPSAiczNjMjR4eC1wd20uMiIsCiAJCQkub3BzCT0gJmNsa190ZGl2X29wcywKIAkJCS5wYXJlbnQJPSAmY2xrX3RpbWVyX3NjYWxlclsxXSwKIAkJfSwKQEAgLTI4OSw2ICsyOTIsNyBAQAogCVszXQk9IHsKIAkJLmNsawk9IHsKIAkJCS5uYW1lCT0gInB3bS10ZGl2IiwKKwkJCS5kZXZuYW1lCT0gInMzYzI0eHgtcHdtLjMiLAogCQkJLm9wcwk9ICZjbGtfdGRpdl9vcHMsCiAJCQkucGFyZW50CT0gJmNsa190aW1lcl9zY2FsZXJbMV0sCiAJCX0sCkBAIC0yOTYsNiArMzAwLDcgQEAKIAlbNF0JPSB7CiAJCS5jbGsJPSB7CiAJCQkubmFtZQk9ICJwd20tdGRpdiIsCisJCQkuZGV2bmFtZQk9ICJzM2MyNHh4LXB3bS40IiwKIAkJCS5vcHMJPSAmY2xrX3RkaXZfb3BzLAogCQkJLnBhcmVudAk9ICZjbGtfdGltZXJfc2NhbGVyWzFdLAogCQl9LApAQCAtMzYxLDI2ICszNjYsMzEgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa190aW5bXSA9IHsKIAlbMF0JPSB7CiAJCS5uYW1lCT0gInB3bS10aW4iLAorCQkuZGV2bmFtZQk9ICJzM2MyNHh4LXB3bS4wIiwKIAkJLmlkCT0gMCwKIAkJLm9wcwk9ICZjbGtfdGluX29wcywKIAl9LAogCVsxXQk9IHsKIAkJLm5hbWUJPSAicHdtLXRpbiIsCisJCS5kZXZuYW1lCT0gInMzYzI0eHgtcHdtLjEiLAogCQkuaWQJPSAxLAogCQkub3BzCT0gJmNsa190aW5fb3BzLAogCX0sCiAJWzJdCT0gewogCQkubmFtZQk9ICJwd20tdGluIiwKKwkJLmRldm5hbWUJPSAiczNjMjR4eC1wd20uMiIsCiAJCS5pZAk9IDIsCiAJCS5vcHMJPSAmY2xrX3Rpbl9vcHMsCiAJfSwKIAlbM10JPSB7CiAJCS5uYW1lCT0gInB3bS10aW4iLAorCQkuZGV2bmFtZQk9ICJzM2MyNHh4LXB3bS4zIiwKIAkJLmlkCT0gMywKIAkJLm9wcwk9ICZjbGtfdGluX29wcywKIAl9LAogCVs0XQk9IHsKIAkJLm5hbWUJPSAicHdtLXRpbiIsCisJCS5kZXZuYW1lCT0gInMzYzI0eHgtcHdtLjQiLAogCQkuaWQJPSA0LAogCQkub3BzCT0gJmNsa190aW5fb3BzLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvdGltZS5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3RpbWUuYwppbmRleCAyMjMxZDgwLi5lM2JiODA2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvdGltZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy90aW1lLmMKQEAgLTI1OSw2ICsyNTksOCBAQAogCWNsa19lbmFibGUodGltZXJjbGspOwogCiAJaWYgKCF1c2VfdGNsazFfMTIoKSkgeworCQl0bXBkZXYuaWQgPSA0OworCQl0bXBkZXYuZGV2LmluaXRfbmFtZSA9ICJzM2MyNHh4LXB3bS40IjsKIAkJdGluID0gY2xrX2dldCgmdG1wZGV2LmRldiwgInB3bS10aW4iKTsKIAkJaWYgKElTX0VSUih0aW4pKQogCQkJcGFuaWMoImZhaWxlZCB0byBnZXQgcHdtLXRpbiBjbG9jayBmb3Igc3lzdGVtIHRpbWVyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNwZWFyL2Nsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXNwZWFyL2Nsb2NrLmMKaW5kZXggNmZhNDc0Yy4uNjdkZDAwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zcGVhci9jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc3BlYXIvY2xvY2suYwpAQCAtOTE2LDcgKzkxNiw3IEBACiBzdGF0aWMgaW50IGNsa19kZWJ1Z2ZzX3JlZ2lzdGVyX29uZShzdHJ1Y3QgY2xrICpjKQogewogCWludCBlcnI7Ci0Jc3RydWN0IGRlbnRyeSAqZCwgKmNoaWxkOworCXN0cnVjdCBkZW50cnkgKmQ7CiAJc3RydWN0IGNsayAqcGEgPSBjLT5wY2xrOwogCWNoYXIgc1syNTVdOwogCWNoYXIgKnAgPSBzOwpAQCAtOTUxLDEwICs5NTEsNyBAQAogCXJldHVybiAwOwogCiBlcnJfb3V0OgotCWQgPSBjLT5kZW50OwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkLT5kX3N1YmRpcnMsIGRfdS5kX2NoaWxkKQotCQlkZWJ1Z2ZzX3JlbW92ZShjaGlsZCk7Ci0JZGVidWdmc19yZW1vdmUoYy0+ZGVudCk7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGMtPmRlbnQpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBody5TIGIvYXJjaC9hcm0vdmZwL3ZmcGh3LlMKaW5kZXggOTg5N2RjZi4uMmQzMGM3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdmZwL3ZmcGh3LlMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcGh3LlMKQEAgLTc3LDI3ICs3NywyNyBAQAogCWJuZQlsb29rX2Zvcl9WRlBfZXhjZXB0aW9ucwlAIFZGUCBpcyBhbHJlYWR5IGVuYWJsZWQKIAogCURCR1NUUjEgImVuYWJsZSAleCIsIHIxMAotCWxkcglyMywgbGFzdF9WRlBfY29udGV4dF9hZGRyZXNzCisJbGRyCXIzLCB2ZnBfY3VycmVudF9od19zdGF0ZV9hZGRyZXNzCiAJb3JyCXIxLCByMSwgI0ZQRVhDX0VOCUAgdXNlciBGUEVYQyBoYXMgdGhlIGVuYWJsZSBiaXQgc2V0Ci0JbGRyCXI0LCBbcjMsIHIxMSwgbHNsICMyXQlAIGxhc3RfVkZQX2NvbnRleHQgcG9pbnRlcgorCWxkcglyNCwgW3IzLCByMTEsIGxzbCAjMl0JQCB2ZnBfY3VycmVudF9od19zdGF0ZSBwb2ludGVyCiAJYmljCXI1LCByMSwgI0ZQRVhDX0VYCUAgbWFrZSBzdXJlIGV4Y2VwdGlvbnMgYXJlIGRpc2FibGVkCi0JY21wCXI0LCByMTAKLQliZXEJY2hlY2tfZm9yX2V4Y2VwdGlvbglAIHdlIGFyZSByZXR1cm5pbmcgdG8gdGhlIHNhbWUKLQkJCQkJQCBwcm9jZXNzLCBzbyB0aGUgcmVnaXN0ZXJzIGFyZQotCQkJCQlAIHN0aWxsIHRoZXJlLiAgSW4gdGhpcyBjYXNlLCB3ZSBkbwotCQkJCQlAIG5vdCB3YW50IHRvIGRyb3AgYSBwZW5kaW5nIGV4Y2VwdGlvbi4KKwljbXAJcjQsIHIxMAkJCUAgdGhpcyB0aHJlYWQgb3ducyB0aGUgaHcgY29udGV4dD8KKyNpZm5kZWYgQ09ORklHX1NNUAorCUAgRm9yIFVQLCBjaGVja2luZyB0aGF0IHRoaXMgdGhyZWFkIG93bnMgdGhlIGh3IGNvbnRleHQgaXMKKwlAIHN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHRoYXQgdGhlIGhhcmR3YXJlIHN0YXRlIGlzIHZhbGlkLgorCWJlcQl2ZnBfaHdfc3RhdGVfdmFsaWQKKworCUAgT24gVVAsIHdlIGxhemlseSBzYXZlIHRoZSBWRlAgY29udGV4dC4gIEFzIGEgZGlmZmVyZW50CisJQCB0aHJlYWQgd2FudHMgb3duZXJzaGlwIG9mIHRoZSBWRlAgaGFyZHdhcmUsIHNhdmUgdGhlIG9sZAorCUAgc3RhdGUgaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgKHZhbGlkKSBvd25lci4KIAogCVZGUEZNWFIJRlBFWEMsIHI1CQlAIGVuYWJsZSBWRlAsIGRpc2FibGUgYW55IHBlbmRpbmcKIAkJCQkJQCBleGNlcHRpb25zLCBzbyB3ZSBjYW4gZ2V0IGF0IHRoZQogCQkJCQlAIHJlc3Qgb2YgaXQKIAotI2lmbmRlZiBDT05GSUdfU01QCi0JQCBTYXZlIG91dCB0aGUgY3VycmVudCByZWdpc3RlcnMgdG8gdGhlIG9sZCB0aHJlYWQgc3RhdGUKLQlAIE5vIG5lZWQgZm9yIFNNUCBzaW5jZSB0aGlzIGlzIG5vdCBkb25lIGxhemlseQotCiAJREJHU1RSMQkic2F2ZSBvbGQgc3RhdGUgJXAiLCByNAotCWNtcAlyNCwgIzAKLQliZXEJbm9fb2xkX1ZGUF9wcm9jZXNzCisJY21wCXI0LCAjMAkJCUAgaWYgdGhlIHZmcF9jdXJyZW50X2h3X3N0YXRlIGlzIE5VTEwKKwliZXEJdmZwX3JlbG9hZF9odwkJQCB0aGVuIHRoZSBodyBzdGF0ZSBuZWVkcyByZWxvYWRpbmcKIAlWRlBGU1RNSUEgcjQsIHI1CQlAIHNhdmUgdGhlIHdvcmtpbmcgcmVnaXN0ZXJzCiAJVkZQRk1SWAlyNSwgRlBTQ1IJCUAgY3VycmVudCBzdGF0dXMKICNpZm5kZWYgQ09ORklHX0NQVV9GRVJPQ0VPTgpAQCAtMTEwLDEzICsxMTAsMzUgQEAKIDE6CiAjZW5kaWYKIAlzdG1pYQlyNCwge3IxLCByNSwgcjYsIHI4fQlAIHNhdmUgRlBFWEMsIEZQU0NSLCBGUElOU1QsIEZQSU5TVDIKLQkJCQkJQCBhbmQgcG9pbnQgcjQgYXQgdGhlIHdvcmQgYXQgdGhlCi0JCQkJCUAgc3RhcnQgb2YgdGhlIHJlZ2lzdGVyIGR1bXAKK3ZmcF9yZWxvYWRfaHc6CisKKyNlbHNlCisJQCBGb3IgU01QLCBpZiB0aGlzIHRocmVhZCBkb2VzIG5vdCBvd24gdGhlIGh3IGNvbnRleHQsIHRoZW4gd2UKKwlAIG5lZWQgdG8gcmVsb2FkIGl0LiAgTm8gbmVlZCB0byBzYXZlIHRoZSBvbGQgc3RhdGUgYXMgb24gU01QLAorCUAgd2UgYWx3YXlzIHNhdmUgdGhlIHN0YXRlIHdoZW4gd2Ugc3dpdGNoIGF3YXkgZnJvbSBhIHRocmVhZC4KKwlibmUJdmZwX3JlbG9hZF9odworCisJQCBUaGlzIHRocmVhZCBoYXMgb3duZXJzaGlwIG9mIHRoZSBjdXJyZW50IGhhcmR3YXJlIGNvbnRleHQuCisJQCBIb3dldmVyLCBpdCBtYXkgaGF2ZSBiZWVuIG1pZ3JhdGVkIHRvIGFub3RoZXIgQ1BVLCBpbiB3aGljaAorCUAgY2FzZSB0aGUgc2F2ZWQgc3RhdGUgaXMgbmV3ZXIgdGhhbiB0aGUgaGFyZHdhcmUgY29udGV4dC4KKwlAIENoZWNrIHRoaXMgYnkgbG9va2luZyBhdCB0aGUgQ1BVIG51bWJlciB3aGljaCB0aGUgc3RhdGUgd2FzCisJQCBsYXN0IGxvYWRlZCBvbnRvLgorCWxkcglpcCwgW3IxMCwgI1ZGUF9DUFVdCisJdGVxCWlwLCByMTEKKwliZXEJdmZwX2h3X3N0YXRlX3ZhbGlkCisKK3ZmcF9yZWxvYWRfaHc6CisJQCBXZSdyZSBsb2FkaW5nIHRoaXMgdGhyZWFkcyBzdGF0ZSBpbnRvIHRoZSBWRlAgaGFyZHdhcmUuIFVwZGF0ZQorCUAgdGhlIENQVSBudW1iZXIgd2hpY2ggY29udGFpbnMgdGhlIG1vc3QgdXAgdG8gZGF0ZSBWRlAgY29udGV4dC4KKwlzdHIJcjExLCBbcjEwLCAjVkZQX0NQVV0KKworCVZGUEZNWFIJRlBFWEMsIHI1CQlAIGVuYWJsZSBWRlAsIGRpc2FibGUgYW55IHBlbmRpbmcKKwkJCQkJQCBleGNlcHRpb25zLCBzbyB3ZSBjYW4gZ2V0IGF0IHRoZQorCQkJCQlAIHJlc3Qgb2YgaXQKICNlbmRpZgogCi1ub19vbGRfVkZQX3Byb2Nlc3M6CiAJREJHU1RSMQkibG9hZCBzdGF0ZSAlcCIsIHIxMAotCXN0cglyMTAsIFtyMywgcjExLCBsc2wgIzJdCUAgdXBkYXRlIHRoZSBsYXN0X1ZGUF9jb250ZXh0IHBvaW50ZXIKKwlzdHIJcjEwLCBbcjMsIHIxMSwgbHNsICMyXQlAIHVwZGF0ZSB0aGUgdmZwX2N1cnJlbnRfaHdfc3RhdGUgcG9pbnRlcgogCQkJCQlAIExvYWQgdGhlIHNhdmVkIHN0YXRlIGJhY2sgaW50byB0aGUgVkZQCiAJVkZQRkxETUlBIHIxMCwgcjUJCUAgcmVsb2FkIHRoZSB3b3JraW5nIHJlZ2lzdGVycyB3aGlsZQogCQkJCQlAIEZQRVhDIGlzIGluIGEgc2FmZSBzdGF0ZQpAQCAtMTMyLDcgKzE1NCw4IEBACiAjZW5kaWYKIAlWRlBGTVhSCUZQU0NSLCByNQkJQCByZXN0b3JlIHN0YXR1cwogCi1jaGVja19mb3JfZXhjZXB0aW9uOgorQCBUaGUgY29udGV4dCBzdG9yZWQgaW4gdGhlIFZGUCBoYXJkd2FyZSBpcyB1cCB0byBkYXRlIHdpdGggdGhpcyB0aHJlYWQKK3ZmcF9od19zdGF0ZV92YWxpZDoKIAl0c3QJcjEsICNGUEVYQ19FWAogCWJuZQlwcm9jZXNzX2V4Y2VwdGlvbglAIG1pZ2h0IGFzIHdlbGwgaGFuZGxlIHRoZSBwZW5kaW5nCiAJCQkJCUAgZXhjZXB0aW9uIGJlZm9yZSByZXRyeWluZyBicmFuY2gKQEAgLTIwNyw4ICsyMzAsOCBAQAogRU5EUFJPQyh2ZnBfc2F2ZV9zdGF0ZSkKIAogCS5hbGlnbgotbGFzdF9WRlBfY29udGV4dF9hZGRyZXNzOgotCS53b3JkCWxhc3RfVkZQX2NvbnRleHQKK3ZmcF9jdXJyZW50X2h3X3N0YXRlX2FkZHJlc3M6CisJLndvcmQJdmZwX2N1cnJlbnRfaHdfc3RhdGUKIAogCS5tYWNybwl0YmxfYnJhbmNoLCBiYXNlLCB0bXAsIHNoaWZ0CiAjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYwppbmRleCBmMjVlN2VjLi43OWJjYjQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCkBAIC0zMyw3ICszMyw2IEBACiB2b2lkIHZmcF9udWxsX2VudHJ5KHZvaWQpOwogCiB2b2lkICgqdmZwX3ZlY3Rvcikodm9pZCkgPSB2ZnBfbnVsbF9lbnRyeTsKLXVuaW9uIHZmcF9zdGF0ZSAqbGFzdF9WRlBfY29udGV4dFtOUl9DUFVTXTsKIAogLyoKICAqIER1YWwtdXNlIHZhcmlhYmxlLgpAQCAtNDMsNiArNDIsNDYgQEAKIHVuc2lnbmVkIGludCBWRlBfYXJjaDsKIAogLyoKKyAqIFRoZSBwb2ludGVyIHRvIHRoZSB2ZnBzdGF0ZSBzdHJ1Y3R1cmUgb2YgdGhlIHRocmVhZCB3aGljaCBjdXJyZW50bHkKKyAqIG93bnMgdGhlIGNvbnRleHQgaGVsZCBpbiB0aGUgVkZQIGhhcmR3YXJlLCBvciBOVUxMIGlmIHRoZSBoYXJkd2FyZQorICogY29udGV4dCBpcyBpbnZhbGlkLgorICoKKyAqIEZvciBVUCwgdGhpcyBpcyBzdWZmaWNpZW50IHRvIHRlbGwgd2hpY2ggdGhyZWFkIG93bnMgdGhlIFZGUCBjb250ZXh0LgorICogSG93ZXZlciwgZm9yIFNNUCwgd2UgYWxzbyBuZWVkIHRvIGNoZWNrIHRoZSBDUFUgbnVtYmVyIHN0b3JlZCBpbiB0aGUKKyAqIHNhdmVkIHN0YXRlIHRvbyB0byBjYXRjaCBtaWdyYXRpb25zLgorICovCit1bmlvbiB2ZnBfc3RhdGUgKnZmcF9jdXJyZW50X2h3X3N0YXRlW05SX0NQVVNdOworCisvKgorICogSXMgJ3RocmVhZCdzIG1vc3QgdXAgdG8gZGF0ZSBzdGF0ZSBzdG9yZWQgaW4gdGhpcyBDUFVzIGhhcmR3YXJlPworICogTXVzdCBiZSBjYWxsZWQgZnJvbSBub24tcHJlZW1wdGlibGUgY29udGV4dC4KKyAqLworc3RhdGljIGJvb2wgdmZwX3N0YXRlX2luX2h3KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlpZiAodGhyZWFkLT52ZnBzdGF0ZS5oYXJkLmNwdSAhPSBjcHUpCisJCXJldHVybiBmYWxzZTsKKyNlbmRpZgorCXJldHVybiB2ZnBfY3VycmVudF9od19zdGF0ZVtjcHVdID09ICZ0aHJlYWQtPnZmcHN0YXRlOworfQorCisvKgorICogRm9yY2UgYSByZWxvYWQgb2YgdGhlIFZGUCBjb250ZXh0IGZyb20gdGhlIHRocmVhZCBzdHJ1Y3R1cmUuICBXZSBkbworICogdGhpcyBieSBlbnN1cmluZyB0aGF0IGFjY2VzcyB0byB0aGUgVkZQIGhhcmR3YXJlIGlzIGRpc2FibGVkLCBhbmQKKyAqIGNsZWFyIGxhc3RfVkZQX2NvbnRleHQuICBNdXN0IGJlIGNhbGxlZCBmcm9tIG5vbi1wcmVlbXB0aWJsZSBjb250ZXh0LgorICovCitzdGF0aWMgdm9pZCB2ZnBfZm9yY2VfcmVsb2FkKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkKQoreworCWlmICh2ZnBfc3RhdGVfaW5faHcoY3B1LCB0aHJlYWQpKSB7CisJCWZteHIoRlBFWEMsIGZtcngoRlBFWEMpICYgfkZQRVhDX0VOKTsKKwkJdmZwX2N1cnJlbnRfaHdfc3RhdGVbY3B1XSA9IE5VTEw7CisJfQorI2lmZGVmIENPTkZJR19TTVAKKwl0aHJlYWQtPnZmcHN0YXRlLmhhcmQuY3B1ID0gTlJfQ1BVUzsKKyNlbmRpZgorfQorCisvKgogICogUGVyLXRocmVhZCBWRlAgaW5pdGlhbGl6YXRpb24uCiAgKi8KIHN0YXRpYyB2b2lkIHZmcF90aHJlYWRfZmx1c2goc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQpCkBAIC01MCwyMSArODksMjcgQEAKIAl1bmlvbiB2ZnBfc3RhdGUgKnZmcCA9ICZ0aHJlYWQtPnZmcHN0YXRlOwogCXVuc2lnbmVkIGludCBjcHU7CiAKKwkvKgorCSAqIERpc2FibGUgVkZQIHRvIGVuc3VyZSB3ZSBpbml0aWFsaXplIGl0IGZpcnN0LiAgV2UgbXVzdCBlbnN1cmUKKwkgKiB0aGF0IHRoZSBtb2RpZmljYXRpb24gb2YgdmZwX2N1cnJlbnRfaHdfc3RhdGVbXSBhbmQgaGFyZHdhcmUKKwkgKiBkaXNhYmxlIGFyZSBkb25lIGZvciB0aGUgc2FtZSBDUFUgYW5kIHdpdGhvdXQgcHJlZW1wdGlvbi4KKwkgKgorCSAqIERvIHRoaXMgZmlyc3QgdG8gZW5zdXJlIHRoYXQgcHJlZW1wdGlvbiB3b24ndCBvdmVyd3JpdGUgb3VyCisJICogc3RhdGUgc2F2aW5nIHNob3VsZCBhY2Nlc3MgdG8gdGhlIFZGUCBiZSBlbmFibGVkIGF0IHRoaXMgcG9pbnQuCisJICovCisJY3B1ID0gZ2V0X2NwdSgpOworCWlmICh2ZnBfY3VycmVudF9od19zdGF0ZVtjcHVdID09IHZmcCkKKwkJdmZwX2N1cnJlbnRfaHdfc3RhdGVbY3B1XSA9IE5VTEw7CisJZm14cihGUEVYQywgZm1yeChGUEVYQykgJiB+RlBFWENfRU4pOworCXB1dF9jcHUoKTsKKwogCW1lbXNldCh2ZnAsIDAsIHNpemVvZih1bmlvbiB2ZnBfc3RhdGUpKTsKIAogCXZmcC0+aGFyZC5mcGV4YyA9IEZQRVhDX0VOOwogCXZmcC0+aGFyZC5mcHNjciA9IEZQU0NSX1JPVU5EX05FQVJFU1Q7Ci0KLQkvKgotCSAqIERpc2FibGUgVkZQIHRvIGVuc3VyZSB3ZSBpbml0aWFsaXplIGl0IGZpcnN0LiAgV2UgbXVzdCBlbnN1cmUKLQkgKiB0aGF0IHRoZSBtb2RpZmljYXRpb24gb2YgbGFzdF9WRlBfY29udGV4dFtdIGFuZCBoYXJkd2FyZSBkaXNhYmxlCi0JICogYXJlIGRvbmUgZm9yIHRoZSBzYW1lIENQVSBhbmQgd2l0aG91dCBwcmVlbXB0aW9uLgotCSAqLwotCWNwdSA9IGdldF9jcHUoKTsKLQlpZiAobGFzdF9WRlBfY29udGV4dFtjcHVdID09IHZmcCkKLQkJbGFzdF9WRlBfY29udGV4dFtjcHVdID0gTlVMTDsKLQlmbXhyKEZQRVhDLCBmbXJ4KEZQRVhDKSAmIH5GUEVYQ19FTik7Ci0JcHV0X2NwdSgpOworI2lmZGVmIENPTkZJR19TTVAKKwl2ZnAtPmhhcmQuY3B1ID0gTlJfQ1BVUzsKKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCB2ZnBfdGhyZWFkX2V4aXQoc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQpCkBAIC03Myw4ICsxMTgsOCBAQAogCXVuaW9uIHZmcF9zdGF0ZSAqdmZwID0gJnRocmVhZC0+dmZwc3RhdGU7CiAJdW5zaWduZWQgaW50IGNwdSA9IGdldF9jcHUoKTsKIAotCWlmIChsYXN0X1ZGUF9jb250ZXh0W2NwdV0gPT0gdmZwKQotCQlsYXN0X1ZGUF9jb250ZXh0W2NwdV0gPSBOVUxMOworCWlmICh2ZnBfY3VycmVudF9od19zdGF0ZVtjcHVdID09IHZmcCkKKwkJdmZwX2N1cnJlbnRfaHdfc3RhdGVbY3B1XSA9IE5VTEw7CiAJcHV0X2NwdSgpOwogfQogCkBAIC04NCw2ICsxMjksOSBAQAogCiAJdmZwX3N5bmNfaHdzdGF0ZShwYXJlbnQpOwogCXRocmVhZC0+dmZwc3RhdGUgPSBwYXJlbnQtPnZmcHN0YXRlOworI2lmZGVmIENPTkZJR19TTVAKKwl0aHJlYWQtPnZmcHN0YXRlLmhhcmQuY3B1ID0gTlJfQ1BVUzsKKyNlbmRpZgogfQogCiAvKgpAQCAtMTI5LDE3ICsxNzcsOCBAQAogCQkgKiBjYXNlIHRoZSB0aHJlYWQgbWlncmF0ZXMgdG8gYSBkaWZmZXJlbnQgQ1BVLiBUaGUKIAkJICogcmVzdG9yaW5nIGlzIGRvbmUgbGF6aWx5LgogCQkgKi8KLQkJaWYgKChmcGV4YyAmIEZQRVhDX0VOKSAmJiBsYXN0X1ZGUF9jb250ZXh0W2NwdV0pIHsKLQkJCXZmcF9zYXZlX3N0YXRlKGxhc3RfVkZQX2NvbnRleHRbY3B1XSwgZnBleGMpOwotCQkJbGFzdF9WRlBfY29udGV4dFtjcHVdLT5oYXJkLmNwdSA9IGNwdTsKLQkJfQotCQkvKgotCQkgKiBUaHJlYWQgbWlncmF0aW9uLCBqdXN0IGZvcmNlIHRoZSByZWxvYWRpbmcgb2YgdGhlCi0JCSAqIHN0YXRlIG9uIHRoZSBuZXcgQ1BVIGluIGNhc2UgdGhlIFZGUCByZWdpc3RlcnMKLQkJICogY29udGFpbiBzdGFsZSBkYXRhLgotCQkgKi8KLQkJaWYgKHRocmVhZC0+dmZwc3RhdGUuaGFyZC5jcHUgIT0gY3B1KQotCQkJbGFzdF9WRlBfY29udGV4dFtjcHVdID0gTlVMTDsKKwkJaWYgKChmcGV4YyAmIEZQRVhDX0VOKSAmJiB2ZnBfY3VycmVudF9od19zdGF0ZVtjcHVdKQorCQkJdmZwX3NhdmVfc3RhdGUodmZwX2N1cnJlbnRfaHdfc3RhdGVbY3B1XSwgZnBleGMpOwogI2VuZGlmCiAKIAkJLyoKQEAgLTQxNSw3ICs0NTQsNyBAQAogCX0KIAogCS8qIGNsZWFyIGFueSBpbmZvcm1hdGlvbiB3ZSBoYWQgYWJvdXQgbGFzdCBjb250ZXh0IHN0YXRlICovCi0JbWVtc2V0KGxhc3RfVkZQX2NvbnRleHQsIDAsIHNpemVvZihsYXN0X1ZGUF9jb250ZXh0KSk7CisJbWVtc2V0KHZmcF9jdXJyZW50X2h3X3N0YXRlLCAwLCBzaXplb2YodmZwX2N1cnJlbnRfaHdfc3RhdGUpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDQzLDE1ICs0ODIsMTUgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZnBfcG1faW5pdCh2b2lkKSB7IH0KICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAorLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBWRlAgc3RhdGUgc3RvcmVkIGluICd0aHJlYWQtPnZmcHN0YXRlJyBpcyB1cCB0byBkYXRlCisgKiB3aXRoIHRoZSBoYXJkd2FyZSBzdGF0ZS4KKyAqLwogdm9pZCB2ZnBfc3luY19od3N0YXRlKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkKQogewogCXVuc2lnbmVkIGludCBjcHUgPSBnZXRfY3B1KCk7CiAKLQkvKgotCSAqIElmIHRoZSB0aHJlYWQgd2UncmUgaW50ZXJlc3RlZCBpbiBpcyB0aGUgY3VycmVudCBvd25lciBvZiB0aGUKLQkgKiBoYXJkd2FyZSBWRlAgc3RhdGUsIHRoZW4gd2UgbmVlZCB0byBzYXZlIGl0cyBzdGF0ZS4KLQkgKi8KLQlpZiAobGFzdF9WRlBfY29udGV4dFtjcHVdID09ICZ0aHJlYWQtPnZmcHN0YXRlKSB7CisJaWYgKHZmcF9zdGF0ZV9pbl9odyhjcHUsIHRocmVhZCkpIHsKIAkJdTMyIGZwZXhjID0gZm1yeChGUEVYQyk7CiAKIAkJLyoKQEAgLTQ2NSwzNiArNTA0LDEzIEBACiAJcHV0X2NwdSgpOwogfQogCisvKiBFbnN1cmUgdGhhdCB0aGUgdGhyZWFkIHJlbG9hZHMgdGhlIGhhcmR3YXJlIFZGUCBzdGF0ZSBvbiB0aGUgbmV4dCB1c2UuICovCiB2b2lkIHZmcF9mbHVzaF9od3N0YXRlKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkKQogewogCXVuc2lnbmVkIGludCBjcHUgPSBnZXRfY3B1KCk7CiAKLQkvKgotCSAqIElmIHRoZSB0aHJlYWQgd2UncmUgaW50ZXJlc3RlZCBpbiBpcyB0aGUgY3VycmVudCBvd25lciBvZiB0aGUKLQkgKiBoYXJkd2FyZSBWRlAgc3RhdGUsIHRoZW4gd2UgbmVlZCB0byBzYXZlIGl0cyBzdGF0ZS4KLQkgKi8KLQlpZiAobGFzdF9WRlBfY29udGV4dFtjcHVdID09ICZ0aHJlYWQtPnZmcHN0YXRlKSB7Ci0JCXUzMiBmcGV4YyA9IGZtcngoRlBFWEMpOworCXZmcF9mb3JjZV9yZWxvYWQoY3B1LCB0aHJlYWQpOwogCi0JCWZteHIoRlBFWEMsIGZwZXhjICYgfkZQRVhDX0VOKTsKLQotCQkvKgotCQkgKiBTZXQgdGhlIGNvbnRleHQgdG8gTlVMTCB0byBmb3JjZSBhIHJlbG9hZCB0aGUgbmV4dCB0aW1lCi0JCSAqIHRoZSB0aHJlYWQgdXNlcyB0aGUgVkZQLgotCQkgKi8KLQkJbGFzdF9WRlBfY29udGV4dFtjcHVdID0gTlVMTDsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0JLyoKLQkgKiBGb3IgU01QIHdlIHN0aWxsIGhhdmUgdG8gdGFrZSBjYXJlIG9mIHRoZSBjYXNlIHdoZXJlIHRoZSB0aHJlYWQKLQkgKiBtaWdyYXRlcyB0byBhbm90aGVyIENQVSBhbmQgdGhlbiBiYWNrIHRvIHRoZSBvcmlnaW5hbCBDUFUgb24gd2hpY2gKLQkgKiB0aGUgbGFzdCBWRlAgdXNlciBpcyBzdGlsbCB0aGUgc2FtZSB0aHJlYWQuIE1hcmsgdGhlIHRocmVhZCBWRlAKLQkgKiBzdGF0ZSBhcyBiZWxvbmdpbmcgdG8gYSBub24tZXhpc3RlbnQgQ1BVIHNvIHRoYXQgdGhlIHNhdmVkIG9uZSB3aWxsCi0JICogYmUgcmVsb2FkZWQgaW4gdGhlIGFib3ZlIGNhc2UuCi0JICovCi0JdGhyZWFkLT52ZnBzdGF0ZS5oYXJkLmNwdSA9IE5SX0NQVVM7Ci0jZW5kaWYKIAlwdXRfY3B1KCk7CiB9CiAKQEAgLTUxMyw4ICs1MjksNyBAQAogCXZvaWQgKmhjcHUpCiB7CiAJaWYgKGFjdGlvbiA9PSBDUFVfRFlJTkcgfHwgYWN0aW9uID09IENQVV9EWUlOR19GUk9aRU4pIHsKLQkJdW5zaWduZWQgaW50IGNwdSA9IChsb25nKWhjcHU7Ci0JCWxhc3RfVkZQX2NvbnRleHRbY3B1XSA9IE5VTEw7CisJCXZmcF9mb3JjZV9yZWxvYWQoKGxvbmcpaGNwdSwgY3VycmVudF90aHJlYWRfaW5mbygpKTsKIAl9IGVsc2UgaWYgKGFjdGlvbiA9PSBDUFVfU1RBUlRJTkcgfHwgYWN0aW9uID09IENQVV9TVEFSVElOR19GUk9aRU4pCiAJCXZmcF9lbmFibGUoTlVMTCk7CiAJcmV0dXJuIE5PVElGWV9PSzsKQEAgLTU4Miw3ICs1OTcsNiBAQAogCQkJCWVsZl9od2NhcCB8PSBIV0NBUF9WRlB2M0QxNjsKIAkJfQogI2VuZGlmCi0jaWZkZWYgQ09ORklHX05FT04KIAkJLyoKIAkJICogQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgQWR2YW5jZWQgU0lNRAogCQkgKiBsb2FkL3N0b3JlIGluc3RydWN0aW9ucywgaW50ZWdlciBhbmQgc2luZ2xlCkBAIC01OTAsMTAgKzYwNCwxMyBAQAogCQkgKiBmb3IgTkVPTiBpZiB0aGUgaGFyZHdhcmUgaGFzIHRoZSBNVkZSIHJlZ2lzdGVycy4KIAkJICovCiAJCWlmICgocmVhZF9jcHVpZF9pZCgpICYgMHgwMDBmMDAwMCkgPT0gMHgwMDBmMDAwMCkgeworI2lmZGVmIENPTkZJR19ORU9OCiAJCQlpZiAoKGZtcngoTVZGUjEpICYgMHgwMDBmZmYwMCkgPT0gMHgwMDAxMTEwMCkKIAkJCQllbGZfaHdjYXAgfD0gSFdDQVBfTkVPTjsKLQkJfQogI2VuZGlmCisJCQlpZiAoKGZtcngoTVZGUjEpICYgMHhmMDAwMDAwMCkgPT0gMHgxMDAwMDAwMCkKKwkJCQllbGZfaHdjYXAgfD0gSFdDQVBfVkZQdjQ7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2RlZmNvbmZpZwppbmRleCA2ZjljYTU2Li5hMDZiZmNjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9kZWZjb25maWcKQEAgLTUsNiArNSw3IEBACiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2V2a2xjZDEwMF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAwX2RlZmNvbmZpZwppbmRleCA3ZWVjZTBhLi5kOGYxZmU4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAwX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAwX2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAxX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9ldmtsY2QxMDFfZGVmY29uZmlnCmluZGV4IDM4N2ViOWQuLmQ0YzViMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9ldmtsY2QxMDFfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9ldmtsY2QxMDFfZGVmY29uZmlnCkBAIC01LDYgKzUsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9tcm10X2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9tcm10X2RlZmNvbmZpZwppbmRleCAxOWY2Y2VlLi43N2NhNGY5IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfbXJtdF9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX21ybXRfZGVmY29uZmlnCkBAIC03LDYgKzcsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMVUJfREVCVUcgaXMgbm90IHNldApAQCAtMTA5LDcgKzExMCw3IEBACiBDT05GSUdfTEVEU19UUklHR0VSUz15CiBDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPXkKIENPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPXkKLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9TMzUzOTBBPW0KIENPTkZJR19SVENfRFJWX0FUMzJBUDcwMFg9bQogQ09ORklHX0RNQURFVklDRVM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2RlZmNvbmZpZwppbmRleCBmMGZlMjM3Li42ZTBkY2E0IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMF9kZWZjb25maWcKaW5kZXggZTRhN2MxZC4uN2YyYTM0NCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9ldmtsY2QxMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMG1raWlfZXZrbGNkMTAwX2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMV9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMV9kZWZjb25maWcKaW5kZXggNmYzN2Y3MC4uMDg1ZWViYSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9ldmtsY2QxMDFfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMG1raWlfZXZrbGNkMTAxX2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAyX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCmluZGV4IDRmYjAxZjUuLmQxYTg4N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCkBAIC01LDYgKzUsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKaW5kZXggOWZhYWY5Yi4uOTU2ZjI4MSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKQEAgLTUsNiArNSw3IEBACiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA0X2RlZmNvbmZpZwppbmRleCAzZDJhNWQ4Li40MGM2OWYzIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA0X2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA0X2RlZmNvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA2X2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCmluZGV4IDFlZDhmMjIuLjUxMWViOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCkBAIC01LDYgKzUsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9mYXZyLTMyX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9mYXZyLTMyX2RlZmNvbmZpZwppbmRleCBhZWFkYzk1Li4xOTk3M2IwIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvZmF2ci0zMl9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2ZhdnItMzJfZGVmY29uZmlnCkBAIC02LDYgKzYsNyBAQAogQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2hhbW1lcmhlYWRfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2hhbW1lcmhlYWRfZGVmY29uZmlnCmluZGV4IDE2OTJiZWUuLjZmNDU2ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9oYW1tZXJoZWFkX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvaGFtbWVyaGVhZF9kZWZjb25maWcKQEAgLTcsNiArNyw3IEBACiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvbWVyaXNjX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9tZXJpc2NfZGVmY29uZmlnCmluZGV4IDhiNjcwYTYuLjNiZWZhYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9tZXJpc2NfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9tZXJpc2NfZGVmY29uZmlnCkBAIC03LDYgKzcsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVTPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9taW1jMjAwX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9taW1jMjAwX2RlZmNvbmZpZwppbmRleCA1YTUxZjJlLi4xYmVlNTFmIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvbWltYzIwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL21pbWMyMDBfZGVmY29uZmlnCkBAIC03LDYgKzcsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9kZWxheS5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9kZWxheS5oCmluZGV4IGEwZWQ5YTkuLjk2NzBlMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vZGVsYXkuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2RlbGF5LmgKQEAgLTEsMjYgKzEgQEAKLSNpZm5kZWYgX19BU01fQVZSMzJfREVMQVlfSAotI2RlZmluZSBfX0FTTV9BVlIzMl9ERUxBWV9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTMgTGludXMgVG9ydmFsZHMKLSAqCi0gKiBEZWxheSByb3V0aW5lcyBjYWxsaW5nIGZ1bmN0aW9ucyBpbiBhcmNoL2F2cjMyL2xpYi9kZWxheS5jCi0gKi8KLQotZXh0ZXJuIHZvaWQgX19iYWRfdWRlbGF5KHZvaWQpOwotZXh0ZXJuIHZvaWQgX19iYWRfbmRlbGF5KHZvaWQpOwotCi1leHRlcm4gdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKLWV4dGVybiB2b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbnNlY3MpOwotZXh0ZXJuIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB4bG9vcHMpOwotZXh0ZXJuIHZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKTsKLQotI2RlZmluZSB1ZGVsYXkobikgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8gXAotCSgobikgPiAyMDAwMCA/IF9fYmFkX3VkZWxheSgpIDogX19jb25zdF91ZGVsYXkoKG4pICogMHgxMGM2dWwpKSA6IFwKLQlfX3VkZWxheShuKSkKLQotI2RlZmluZSBuZGVsYXkobikgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8gXAotCSgobikgPiAyMDAwMCA/IF9fYmFkX25kZWxheSgpIDogX19jb25zdF91ZGVsYXkoKG4pICogNXVsKSkgOiBcCi0JX19uZGVsYXkobikpCi0KLSNlbmRpZiAvKiBfX0FTTV9BVlIzMl9ERUxBWV9IICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDQ5YTg4ZjUuLjEwODUwMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTMxLDcgKzEzMSw2IEBACiAgKi8KICNkZWZpbmUgc3RhcnRfdGhyZWFkKHJlZ3MsIG5ld19wYywgbmV3X3NwKQkgXAogCWRvIHsJCQkJCSBcCi0JCXNldF9mcyhVU0VSX0RTKTsJCSBcCiAJCW1lbXNldChyZWdzLCAwLCBzaXplb2YoKnJlZ3MpKTsJIFwKIAkJcmVncy0+c3IgPSBNT0RFX1VTRVI7CQkgXAogCQlyZWdzLT5wYyA9IG5ld19wYyAmIH4xOwkJIFwKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL21vZHVsZS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggYTcyN2Y1NC4uNTk2ZjczMCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvbW9kdWxlLmMKQEAgLTE5LDEzICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCi12b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQotewotCWlmIChzaXplID09IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiB2bWFsbG9jKHNpemUpOwotfQotCiB2b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKIHsKIAl2ZnJlZShtb2QtPmFyY2guc3ltaW5mbyk7CkBAIC0yOTksMTUgKzI5Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGFwcGx5X3JlbG9jYXRlKEVsZjMyX1NoZHIgKnNlY2hkcnMsIGNvbnN0IGNoYXIgKnN0cnRhYiwKLQkJICAgdW5zaWduZWQgaW50IHN5bWluZGV4LCB1bnNpZ25lZCBpbnQgcmVsaW5kZXgsCi0JCSAgIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKLXsKLQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogUkVMIHJlbG9jYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkXG4iLAotCQltb2R1bGUtPm5hbWUpOwotCXJldHVybiAtRU5PRVhFQzsKLX0KLQogaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLCBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKIAkJICAgIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKIHsKQEAgLTMxNiw3ICszMDAsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLXZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2R1bGUpCi17Ci19CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYwppbmRleCBiYjA5NzRjLi5iNDI0N2Y0IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3NldHVwLmMKQEAgLTQ0NCw3ICs0NDQsNyBAQAogZmluZF9ib290bWFwX3Bmbihjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKm1lbSkKIHsKIAl1bnNpZ25lZCBsb25nIGJvb3RtYXBfcGFnZXMsIGJvb3RtYXBfbGVuOwotCXVuc2lnbmVkIGxvbmcgbm9kZV9wYWdlcyA9IFBGTl9VUChtZW0tPmVuZCAtIG1lbS0+c3RhcnQgKyAxKTsKKwl1bnNpZ25lZCBsb25nIG5vZGVfcGFnZXMgPSBQRk5fVVAocmVzb3VyY2Vfc2l6ZShtZW0pKTsKIAl1bnNpZ25lZCBsb25nIGJvb3RtYXBfc3RhcnQ7CiAKIAlib290bWFwX3BhZ2VzID0gYm9vdG1lbV9ib290bWFwX3BhZ2VzKG5vZGVfcGFnZXMpOwpAQCAtNTQxLDEwICs1NDEsMTAgQEAKIAkJCSAqLwogCQkJaWYgKHJlcy0+c3RhcnQgPj0gUEZOX1BIWVMoZmlyc3RfcGZuKQogCQkJICAgICYmIHJlcy0+ZW5kIDwgUEZOX1BIWVMobWF4X3BmbikpCi0JCQkJcmVzZXJ2ZV9ib290bWVtX25vZGUoCi0JCQkJCU5PREVfREFUQShub2RlKSwgcmVzLT5zdGFydCwKLQkJCQkJcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSwKLQkJCQkJQk9PVE1FTV9ERUZBVUxUKTsKKwkJCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksCisJCQkJCQkgICAgIHJlcy0+c3RhcnQsCisJCQkJCQkgICAgIHJlc291cmNlX3NpemUocmVzKSwKKwkJCQkJCSAgICAgQk9PVE1FTV9ERUZBVUxUKTsKIAkJfQogCiAJCW5vZGVfc2V0X29ubGluZShub2RlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDB4LmMKaW5kZXggYWE2NzdlMi4uN2ZiZjBkYyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDB4LmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDB4LmMKQEAgLTEwNDMsOCArMTA0Myw5IEBACiAJCWRhdGEtPnJlZ3MgPSAodm9pZCBfX2lvbWVtICopcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7CiAJfQogCisJcGRldi0+aWQgPSBsaW5lOwogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JcGRhdGEtPm51bSA9IHBvcnRucjsKKwlwZGF0YS0+bnVtID0gbGluZTsKIAlhdDMyX3VzYXJ0c1tsaW5lXSA9IHBkZXY7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvZXh0aW50LmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2V4dGludC5jCmluZGV4IGZiYzJhZWEuLmNmYjI5OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvZXh0aW50LmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9leHRpbnQuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJfQogCiAJZWljLT5maXJzdF9pcnEgPSBFSU1fSVJRX0JBU0UgKyAzMiAqIHBkZXYtPmlkOwotCWVpYy0+cmVncyA9IGlvcmVtYXAocmVncy0+c3RhcnQsIHJlZ3MtPmVuZCAtIHJlZ3MtPnN0YXJ0ICsgMSk7CisJZWljLT5yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZWdzKSk7CiAJaWYgKCFlaWMtPnJlZ3MpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIG1hcCByZWdzXG4iKTsKIAkJZ290byBlcnJfaW9yZW1hcDsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaHNtYy5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9oc21jLmMKaW5kZXggZjc2NzJkMy4uZjY2MjQ1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9oc21jLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9oc21jLmMKQEAgLTI0NSw3ICsyNDUsNyBAQAogCiAJaHNtYy0+cGNsayA9IHBjbGs7CiAJaHNtYy0+bWNrID0gbWNrOwotCWhzbWMtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCWhzbWMtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKIAlpZiAoIWhzbWMtPnJlZ3MpCiAJCWdvdG8gb3V0X2Rpc2FibGVfY2xvY2tzOwogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9jcHUuaCBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2NwdS5oCmluZGV4IDljOTZhMTMuLjgxODEyOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2NwdS5oCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2NwdS5oCkBAIC0zMSw4ICszMSwyMCBAQAogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjMoKQkoMCkKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05cmwoKQkoMCkKICNkZWZpbmUgY3B1X2lzX2F0OTFjYXA5KCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxY2FwOV9yZXZCKCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxY2FwOV9yZXZDKCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcxMCgpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMjAoKQkoMCkKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1KCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NWVzKCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOW0xMCgpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDYoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05bTExKCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXg1KCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcxNSgpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMzUoKQkoMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eDM1KCkJKDApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcyNSgpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4MjUoKQkoMCkKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW50Yy5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbnRjLmMKaW5kZXggM2UzNjQ2MS4uMjU4NjgyYiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbnRjLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbnRjLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogCiAJY2xrX2VuYWJsZShwY2xrKTsKIAotCWludGMwLnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCWludGMwLnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKIAlpZiAoIWludGMwLnJlZ3MpIHsKIAkJcHJpbnRrKEtFUk5fRU1FUkcgImludGM6IGZhaWxlZCB0byBtYXAgcmVnaXN0ZXJzICgweCUwOGx4KVxuIiwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlZ3MtPnN0YXJ0KTsKQEAgLTE2NywxNCArMTY3LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaW50Y19yZXN1bWUodm9pZCkKK3N0YXRpYyB2b2lkIGludGNfcmVzdW1lKHZvaWQpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKIAkJaW50Y193cml0ZWwoJmludGMwLCBJTlRQUjAgKyA0ICogaSwgaW50YzAuc2F2ZWRfaXByW2ldKTsKLQotCXJldHVybiAwOwogfQogI2Vsc2UKICNkZWZpbmUgaW50Y19zdXNwZW5kCU5VTEwKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jCmluZGV4IDJlMGFhODUuLjliMzlkZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAJCWNsa19lbmFibGUocGlvLT5jbGspOwogCiAJcGlvLT5wZGV2ID0gcGRldjsKLQlwaW8tPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCXBpby0+cmVncyA9IGlvcmVtYXAocmVncy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVncykpOwogCiAJLyogc3RhcnQgd2l0aCBpcnFzIGRpc2FibGVkIGFuZCBhY2tlZCAqLwogCXBpb193cml0ZWwocGlvLCBJRFIsIH4wVUwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9LY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9LY29uZmlnCmluZGV4IGQ2MTliMTcuLmM3NDc2MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL0tjb25maWcKQEAgLTk1Myw2ICs5NTMsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGdwdGltZXJzLgogCitjb25maWcgSEFWRV9QV00KKwl0cmlzdGF0ZSAiRW5hYmxlIFBXTSBBUEkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJGSU5fR1BUSU1FUlMKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFB1bHNlIFdpZHRoIE1vZHVsYXRpb24gZnJhbWV3b3JrIChhcworCSAgZm91bmQgaW4gbGludXgvcHdtLmgpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBwd20uCisKIGNob2ljZQogCXByb21wdCAiVW5jYWNoZWQgRE1BIHJlZ2lvbiIKIAlkZWZhdWx0IERNQV9VTkNBQ0hFRF8xTQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTYxLUVaS0lUX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU2MS1FWktJVF9kZWZjb25maWcKaW5kZXggMWMwYTgyYS4uZDdmZjJhZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTYxLUVaS0lUX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NjEtRVpLSVRfZGVmY29uZmlnCkBAIC01OCwxMyArNTgsMTMgQEAKIENPTkZJR19NVEQ9eQogQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15Ci1DT05GSUdfTVREX0NIQVI9bQorQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQotQ09ORklHX01URF9DRkk9bQotQ09ORklHX01URF9DRklfQU1EU1REPW0KK0NPTkZJR19NVERfQ0ZJPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CiBDT05GSUdfTVREX1JBTT15CiBDT05GSUdfTVREX1JPTT1tCi1DT05GSUdfTVREX1BIWVNNQVA9bQorQ09ORklHX01URF9QSFlTTUFQPXkKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfTkVUREVWSUNFUz15CiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NDhfZGVmY29uZmlnCmluZGV4IDMxZDk1NDIuLjlmMWQwODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTQ4X2RlZmNvbmZpZwpAQCAtMTEyLDcgKzExMiw3IEBACiBDT05GSUdfVVNCX0dfUFJJTlRFUj1tCiBDT05GSUdfTU1DPW0KIENPTkZJR19TREhfQkZJTj1tCi1DT05GSUdfUlRDX0NMQVNTPW0KK0NPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19EUlZfQkZJTj1tCiBDT05GSUdfRVhUMl9GUz1tCiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggOWU3YzUzNy4uN2EwNzVlYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsNSArMSw0OCBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KIAorZ2VuZXJpYy15ICs9IGF1eHZlYy5oCitnZW5lcmljLXkgKz0gYml0c3BlcmxvbmcuaAorZ2VuZXJpYy15ICs9IGJ1Z3MuaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAorZ2VuZXJpYy15ICs9IGN1cnJlbnQuaAorZ2VuZXJpYy15ICs9IGRldmljZS5oCitnZW5lcmljLXkgKz0gZGl2NjQuaAorZ2VuZXJpYy15ICs9IGVtZXJnZW5jeS1yZXN0YXJ0LmgKK2dlbmVyaWMteSArPSBlcnJuby5oCitnZW5lcmljLXkgKz0gZmIuaAorZ2VuZXJpYy15ICs9IGZ1dGV4LmgKK2dlbmVyaWMteSArPSBod19pcnEuaAorZ2VuZXJpYy15ICs9IGlvY3RsLmgKK2dlbmVyaWMteSArPSBpcGNidWYuaAorZ2VuZXJpYy15ICs9IGlycV9yZWdzLmgKK2dlbmVyaWMteSArPSBrZGVidWcuaAorZ2VuZXJpYy15ICs9IGttYXBfdHlwZXMuaAorZ2VuZXJpYy15ICs9IGxvY2FsNjQuaAorZ2VuZXJpYy15ICs9IGxvY2FsLmgKK2dlbmVyaWMteSArPSBtbWFuLmgKK2dlbmVyaWMteSArPSBtc2didWYuaAorZ2VuZXJpYy15ICs9IHBhcmFtLmgKK2dlbmVyaWMteSArPSBwZXJjcHUuaAorZ2VuZXJpYy15ICs9IHBnYWxsb2MuaAorZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKK2dlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCitnZW5lcmljLXkgKz0gc2VtYnVmLmgKK2dlbmVyaWMteSArPSBzZXJpYWwuaAorZ2VuZXJpYy15ICs9IHNldHVwLmgKK2dlbmVyaWMteSArPSBzaG1idWYuaAorZ2VuZXJpYy15ICs9IHNobXBhcmFtLmgKK2dlbmVyaWMteSArPSBzb2NrZXQuaAorZ2VuZXJpYy15ICs9IHNvY2tpb3MuaAorZ2VuZXJpYy15ICs9IHN0YXRmcy5oCitnZW5lcmljLXkgKz0gdGVybWJpdHMuaAorZ2VuZXJpYy15ICs9IHRlcm1pb3MuaAorZ2VuZXJpYy15ICs9IHRvcG9sb2d5LmgKK2dlbmVyaWMteSArPSB0eXBlcy5oCitnZW5lcmljLXkgKz0gdWNvbnRleHQuaAorZ2VuZXJpYy15ICs9IHVuYWxpZ25lZC5oCitnZW5lcmljLXkgKz0gdXNlci5oCitnZW5lcmljLXkgKz0geG9yLmgKKwogaGVhZGVyLXkgKz0gYmZpbl9zcG9ydC5oCiBoZWFkZXIteSArPSBjYWNoZWN0bC5oCiBoZWFkZXIteSArPSBmaXhlZF9jb2RlLmgKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IGU0ODUwODkuLjRjNzA3ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMSw4ICsxLDggQEAKIC8qCi3CoCogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCi3CoCoKLcKgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCi3CoCovCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KIAogI2lmbmRlZiBfX0FSQ0hfQkxBQ0tGSU5fQVRPTUlDX18KICNkZWZpbmUgX19BUkNIX0JMQUNLRklOX0FUT01JQ19fCkBAIC03NiwxMSArNzYsNiBAQAogCV9fcmF3X2F0b21pY19zZXRfYXNtKCZ2LT5jb3VudGVyLCBtYXNrKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYXRvbWljX3Rlc3RfbWFzayhpbnQgbWFzaywgYXRvbWljX3QgKnYpCi17Ci0JcmV0dXJuIF9fcmF3X2F0b21pY190ZXN0X2FzbSgmdi0+Y291bnRlciwgbWFzayk7Ci19Ci0KIC8qIEF0b21pYyBvcGVyYXRpb25zIGFyZSBhbHJlYWR5IHNlcmlhbGl6aW5nICovCiAjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKSAgICBiYXJyaWVyKCkKICNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCkgYmFycmllcigpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2F1eHZlYy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hdXh2ZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFmYTY4Yi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2F1eHZlYy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1eHZlYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iaXRzcGVybG9uZy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iaXRzcGVybG9uZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGMwYmIwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYml0c3BlcmxvbmcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRzcGVybG9uZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ibGFja2Zpbi5oCmluZGV4IGViN2MxNDQuLjA5Mjg3MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JsYWNrZmluLmgKQEAgLTEsOSArMSw5IEBACiAvKgogICogQ29tbW9uIGhlYWRlciBmaWxlIGZvciBCbGFja2ZpbiBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KICAqCi3CoCogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCi3CoCoKLcKgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQkxBQ0tGSU5fSF8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYnVncy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9idWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNzkxZTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9idWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2OGFkNy4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2N1cnJlbnQuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3VycmVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzUxNDAxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3VycmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2N1cnJlbnQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZGV2aWNlLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGE0YzI1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZGV2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RpdjY0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RpdjY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZDk3OGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kaXY2NC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RpdjY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RwbWMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZHBtYy5oCmluZGV4IGVkZjJhMmEuLmM0ZWM5NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZHBtYy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZHBtYy5oCkBAIC0xMTcsNyArMTE3LDYgQEAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIHZvaWQgc2xlZXBfbW9kZSh1MzIgc2ljX2l3cjAsIHUzMiBzaWNfaXdyMSwgdTMyIHNpY19pd3IyKTsKLXZvaWQgaGliZXJuYXRlX21vZGUodTMyIHNpY19pd3IwLCB1MzIgc2ljX2l3cjEsIHUzMiBzaWNfaXdyMik7CiB2b2lkIHNsZWVwX2RlZXBlcih1MzIgc2ljX2l3cjAsIHUzMiBzaWNfaXdyMSwgdTMyIHNpY19pd3IyKTsKIHZvaWQgZG9faGliZXJuYXRlKGludCB3YWtldXApOwogdm9pZCBzZXRfZHJhbV9zcmZzKHZvaWQpOwpAQCAtMTM0LDMyICsxMzMsNiBAQAogCXVuc2lnbmVkIHNob3J0IHZyX3NldHRsaW5nX3RpbWU7IC8qIGluIHVzICovCiB9OwogCi0jZWxzZQotCi0jZGVmaW5lIFBNX1BVU0goeCkgXAotCVIwID0gW1AwICsgKHggLSBTUkFNX0JBU0VfQUREUkVTUyldO1wKLQlbLS1TUF0gPSAgUjA7XAotCi0jZGVmaW5lIFBNX1BPUCh4KSBcCi0JUjAgPSBbU1ArK107XAotCVtQMCArICh4IC0gU1JBTV9CQVNFX0FERFJFU1MpXSA9IFIwO1wKLQotI2RlZmluZSBQTV9TWVNfUFVTSCh4KSBcCi0JUjAgPSBbUDAgKyAoeCAtIFBMTF9DVEwpXTtcCi0JWy0tU1BdID0gIFIwO1wKLQotI2RlZmluZSBQTV9TWVNfUE9QKHgpIFwKLQlSMCA9IFtTUCsrXTtcCi0JW1AwICsgKHggLSBQTExfQ1RMKV0gPSBSMDtcCi0KLSNkZWZpbmUgUE1fU1lTX1BVU0gxNih4KSBcCi0JUjAgPSB3W1AwICsgKHggLSBQTExfQ1RMKV07XAotCVstLVNQXSA9ICBSMDtcCi0KLSNkZWZpbmUgUE1fU1lTX1BPUDE2KHgpIFwKLQlSMCA9IFtTUCsrXTtcCi0Jd1tQMCArICh4IC0gUExMX0NUTCldID0gUjA7XAotCiAjZW5kaWYKIAogI2VuZGlmCS8qX0JMQUNLRklOX0RQTUNfSF8qLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9lbWVyZ2VuY3ktcmVzdGFydC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9lbWVyZ2VuY3ktcmVzdGFydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzExYmQ5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZW1lcmdlbmN5LXJlc3RhcnQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9lbWVyZ2VuY3ktcmVzdGFydC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9lcnJuby5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9lcnJuby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzgyYjUwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZXJybm8uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9mYi5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9mYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ5ODhlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZmIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9mdXRleC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9mdXRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjc0NTgyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZnV0ZXguaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mdXRleC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ncGlvLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaAppbmRleCAxZWY4NDE3Li41YTI1ODU2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaApAQCAtMTYsNTggKzE2LDEzIEBACiAKICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAotI2RlZmluZSBHUElPXzAJMAotI2RlZmluZSBHUElPXzEJMQotI2RlZmluZSBHUElPXzIJMgotI2RlZmluZSBHUElPXzMJMwotI2RlZmluZSBHUElPXzQJNAotI2RlZmluZSBHUElPXzUJNQotI2RlZmluZSBHUElPXzYJNgotI2RlZmluZSBHUElPXzcJNwotI2RlZmluZSBHUElPXzgJOAotI2RlZmluZSBHUElPXzkJOQotI2RlZmluZSBHUElPXzEwCTEwCi0jZGVmaW5lIEdQSU9fMTEJMTEKLSNkZWZpbmUgR1BJT18xMgkxMgotI2RlZmluZSBHUElPXzEzCTEzCi0jZGVmaW5lIEdQSU9fMTQJMTQKLSNkZWZpbmUgR1BJT18xNQkxNQotI2RlZmluZSBHUElPXzE2CTE2Ci0jZGVmaW5lIEdQSU9fMTcJMTcKLSNkZWZpbmUgR1BJT18xOAkxOAotI2RlZmluZSBHUElPXzE5CTE5Ci0jZGVmaW5lIEdQSU9fMjAJMjAKLSNkZWZpbmUgR1BJT18yMQkyMQotI2RlZmluZSBHUElPXzIyCTIyCi0jZGVmaW5lIEdQSU9fMjMJMjMKLSNkZWZpbmUgR1BJT18yNAkyNAotI2RlZmluZSBHUElPXzI1CTI1Ci0jZGVmaW5lIEdQSU9fMjYJMjYKLSNkZWZpbmUgR1BJT18yNwkyNwotI2RlZmluZSBHUElPXzI4CTI4Ci0jZGVmaW5lIEdQSU9fMjkJMjkKLSNkZWZpbmUgR1BJT18zMAkzMAotI2RlZmluZSBHUElPXzMxCTMxCi0jZGVmaW5lIEdQSU9fMzIJMzIKLSNkZWZpbmUgR1BJT18zMwkzMwotI2RlZmluZSBHUElPXzM0CTM0Ci0jZGVmaW5lIEdQSU9fMzUJMzUKLSNkZWZpbmUgR1BJT18zNgkzNgotI2RlZmluZSBHUElPXzM3CTM3Ci0jZGVmaW5lIEdQSU9fMzgJMzgKLSNkZWZpbmUgR1BJT18zOQkzOQotI2RlZmluZSBHUElPXzQwCTQwCi0jZGVmaW5lIEdQSU9fNDEJNDEKLSNkZWZpbmUgR1BJT180Mgk0MgotI2RlZmluZSBHUElPXzQzCTQzCi0jZGVmaW5lIEdQSU9fNDQJNDQKLSNkZWZpbmUgR1BJT180NQk0NQotI2RlZmluZSBHUElPXzQ2CTQ2Ci0jZGVmaW5lIEdQSU9fNDcJNDcKLQogI2RlZmluZSBQRVJJUEhFUkFMX1VTQUdFIDEKICNkZWZpbmUgR1BJT19VU0FHRSAwCiAKKyNpZm5kZWYgQkZJTl9HUElPX1BJTlQKKyMgZGVmaW5lIEJGSU5fR1BJT19QSU5UIDAKKyNlbmRpZgorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KQEAgLTg5LDcgKzQ0LDcgQEAKICogTU9ESUZJQ0FUSU9OIEhJU1RPUlkgOgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgQ09ORklHX0JGNTR4CisjaWYgIUJGSU5fR1BJT19QSU5UCiB2b2lkIHNldF9ncGlvX2Rpcih1bnNpZ25lZCwgdW5zaWduZWQgc2hvcnQpOwogdm9pZCBzZXRfZ3Bpb19pbmVuKHVuc2lnbmVkLCB1bnNpZ25lZCBzaG9ydCk7CiB2b2lkIHNldF9ncGlvX3BvbGFyKHVuc2lnbmVkLCB1bnNpZ25lZCBzaG9ydCk7CkBAIC0xNjQsNiArMTE5LDEwIEBACiAjaWZkZWYgQkZJTl9TUEVDSUFMX0dQSU9fQkFOS1MKIHZvaWQgYmZpbl9zcGVjaWFsX2dwaW9fZnJlZSh1bnNpZ25lZCBncGlvKTsKIGludCBiZmluX3NwZWNpYWxfZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKTsKKyMgaWZkZWYgQ09ORklHX1BNCit2b2lkIGJmaW5fc3BlY2lhbF9ncGlvX3BtX2hpYmVybmF0ZV9yZXN0b3JlKHZvaWQpOwordm9pZCBiZmluX3NwZWNpYWxfZ3Bpb19wbV9oaWJlcm5hdGVfc3VzcGVuZCh2b2lkKTsKKyMgZW5kaWYKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC0xODIsNyArMTQxLDcgQEAKIHZvaWQgYmZpbl9ncGlvX3BtX2hpYmVybmF0ZV9yZXN0b3JlKHZvaWQpOwogdm9pZCBiZmluX2dwaW9fcG1faGliZXJuYXRlX3N1c3BlbmQodm9pZCk7CiAKLSNpZm5kZWYgQ09ORklHX0JGNTR4CisjIGlmICFCRklOX0dQSU9fUElOVAogaW50IGdwaW9fcG1fd2FrZXVwX2N0cmwodW5zaWduZWQgZ3BpbywgdW5zaWduZWQgY3RybCk7CiAKIHN0cnVjdCBncGlvX3BvcnRfcyB7CkBAIC0xOTksOCArMTU4LDkgQEAKIAl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDsKIAl1bnNpZ25lZCBzaG9ydCBtdXg7CiB9OwotI2VuZGlmIC8qQ09ORklHX0JGNTR4Ki8KKyMgZW5kaWYKICNlbmRpZiAvKkNPTkZJR19QTSovCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGVU5DVElPTlM6IEJsYWNrZmluIEdQSU8gRHJpdmVyCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwdGltZXJzLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwdGltZXJzLmgKaW5kZXggMzg2NTdkYS4uMzhiZGRjYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ncHRpbWVycy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZ3B0aW1lcnMuaApAQCAtMTkzLDYgKzE5MywxNiBAQAogdWludDMyX3QgZ2V0X2dwdGltZXJfc3RhdHVzKHVuc2lnbmVkIGludCBncm91cCk7CiB2b2lkICAgICBzZXRfZ3B0aW1lcl9zdGF0dXModW5zaWduZWQgaW50IGdyb3VwLCB1aW50MzJfdCB2YWx1ZSk7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfZ3B0aW1lcih1bnNpZ25lZCBpbnQgdGltZXJfaWQpCit7CisJZW5hYmxlX2dwdGltZXJzKDEgPDwgdGltZXJfaWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9ncHRpbWVyKHVuc2lnbmVkIGludCB0aW1lcl9pZCkKK3sKKwlkaXNhYmxlX2dwdGltZXJzKDEgPDwgdGltZXJfaWQpOworfQorCiAvKgogICogQWxsIEJsYWNrZmluIHN5c3RlbSBNTVJzIGFyZSBwYWRkZWQgdG8gMzJiaXRzIGV2ZW4gaWYgdGhlIHJlZ2lzdGVyCiAgKiBpdHNlbGYgaXMgb25seSAxNmJpdHMuICBTbyB1c2UgYSBoZWxwZXIgbWFjcm8gdG8gc3RyZWFtbGluZSB0aGlzLgpAQCAtMjA5LDYgKzIxOSwxNSBAQAogCXUzMiB3aWR0aDsKIH07CiAKKy8qCisgKiBiZmluIGdyb3VwIHRpbWVyIHJlZ2lzdGVycyBsYXlvdXQKKyAqLworc3RydWN0IGJmaW5fZ3B0aW1lcl9ncm91cF9yZWdzIHsKKwlfX0JGUChlbmFibGUpOworCV9fQkZQKGRpc2FibGUpOworCXUzMiBzdGF0dXM7Cit9OworCiAjdW5kZWYgX19CRlAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2h3X2lycS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9od19pcnEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1ZWY3ZC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2h3X2lycS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2h3X2lycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pb2N0bC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pb2N0bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjc5ZmUwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaW9jdGwuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcGNidWYuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXBjYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzdlNTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcGNidWYuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcGNidWYuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxX3JlZ3MuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxX3JlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkOWMwYi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycV9yZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaXJxX3JlZ3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxZmxhZ3MuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxZmxhZ3MuaAppbmRleCBiNGJiYjc1Li40M2ViNDc0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCkBAIC0xOCwxMiArMTgsMTIgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGJmaW5faXJxX2ZsYWdzOwogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBiZmluX3N0aSh1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgYmZpbl9zdGkodW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlhc20gdm9sYXRpbGUoInN0aSAlMDsiIDogOiAiZCIgKGZsYWdzKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBiZmluX2NsaSh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIHVuc2lnbmVkIGxvbmcgYmZpbl9jbGkodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWFzbSB2b2xhdGlsZSgiY2xpICUwOyIgOiAiPWQiIChmbGFncykpOwpAQCAtNDAsMjIgKzQwLDIyIEBACiAvKgogICogSGFyZCwgdW50cmFjZWQgQ1BVIGludGVycnVwdCBmbGFnIG1hbmlwdWxhdGlvbiBhbmQgYWNjZXNzLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19oYXJkX2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2Ugdm9pZCBfX2hhcmRfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKIHsKIAliZmluX2NsaSgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19oYXJkX2xvY2FsX2lycV9lbmFibGUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB2b2lkIF9faGFyZF9sb2NhbF9pcnFfZW5hYmxlKHZvaWQpCiB7CiAJYmZpbl9zdGkoYmZpbl9pcnFfZmxhZ3MpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaGFyZF9sb2NhbF9zYXZlX2ZsYWdzKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgdW5zaWduZWQgbG9uZyBoYXJkX2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKIHsKIAlyZXR1cm4gYmZpbl9yZWFkX0lNQVNLKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2hhcmRfbG9jYWxfaXJxX3NhdmUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB1bnNpZ25lZCBsb25nIF9faGFyZF9sb2NhbF9pcnFfc2F2ZSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJZmxhZ3MgPSBiZmluX2NsaSgpOwpAQCAtNjUsMTggKzY1LDE4IEBACiAJcmV0dXJuIGZsYWdzOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBoYXJkX2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSBpbnQgaGFyZF9pcnFzX2Rpc2FibGVkX2ZsYWdzKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJcmV0dXJuIChmbGFncyAmIH4weDNmKSA9PSAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBoYXJkX2lycXNfZGlzYWJsZWQodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSBpbnQgaGFyZF9pcnFzX2Rpc2FibGVkKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IGhhcmRfbG9jYWxfc2F2ZV9mbGFncygpOwogCXJldHVybiBoYXJkX2lycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19oYXJkX2xvY2FsX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgaW5saW5lIG5vdHJhY2Ugdm9pZCBfX2hhcmRfbG9jYWxfaXJxX3Jlc3RvcmUodW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlpZiAoIWhhcmRfaXJxc19kaXNhYmxlZF9mbGFncyhmbGFncykpCiAJCV9faGFyZF9sb2NhbF9pcnFfZW5hYmxlKCk7CkBAIC0xMTMsMzEgKzExMywzMSBAQAogLyoKICAqIEludGVycnVwdCBwaXBlIGludGVyZmFjZSB0byBsaW51eC9pcnFmbGFncy5oLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfZGlzYWJsZSh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgYXJjaF9sb2NhbF9pcnFfZGlzYWJsZSh2b2lkKQogewogCV9fY2hlY2tfaXJxb3BfY29udGV4dCgpOwogCV9faXBpcGVfc3RhbGxfcm9vdCgpOwogCWJhcnJpZXIoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgYXJjaF9sb2NhbF9pcnFfZW5hYmxlKHZvaWQpCiB7CiAJYmFycmllcigpOwogCV9fY2hlY2tfaXJxb3BfY29udGV4dCgpOwogCV9faXBpcGVfdW5zdGFsbF9yb290KCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfc2F2ZV9mbGFncyh2b2lkKQogewogCXJldHVybiBfX2lwaXBlX3Rlc3Rfcm9vdCgpID8gYmZpbl9ub19pcnFzIDogYmZpbl9pcnFfZmxhZ3M7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFyY2hfaXJxc19kaXNhYmxlZF9mbGFncyh1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBub3RyYWNlIGludCBhcmNoX2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlyZXR1cm4gZmxhZ3MgPT0gYmZpbl9ub19pcnFzOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9pcnFfc2F2ZSh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9pcnFfc2F2ZSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTE0OCwxMyArMTQ4LDEzIEBACiAJcmV0dXJuIGZsYWdzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCV9fY2hlY2tfaXJxb3BfY29udGV4dCgpOwogCV9faXBpcGVfcmVzdG9yZV9yb290KGZsYWdzID09IGJmaW5fbm9faXJxcyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhcmNoX21hbmdsZV9pcnFfYml0cyhpbnQgdmlydCwgdW5zaWduZWQgbG9uZyByZWFsKQorc3RhdGljIGlubGluZSBub3RyYWNlIHVuc2lnbmVkIGxvbmcgYXJjaF9tYW5nbGVfaXJxX2JpdHMoaW50IHZpcnQsIHVuc2lnbmVkIGxvbmcgcmVhbCkKIHsKIAkvKgogCSAqIE1lcmdlIHZpcnR1YWwgYW5kIHJlYWwgaW50ZXJydXB0IG1hc2sgYml0cyBpbnRvIGEgc2luZ2xlCkBAIC0xNjMsNyArMTYzLDcgQEAKIAlyZXR1cm4gKHJlYWwgJiB+KDEgPDwgMzEpKSB8ICgodmlydCAhPSAwKSA8PCAzMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFyY2hfZGVtYW5nbGVfaXJxX2JpdHModW5zaWduZWQgbG9uZyAqeCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSBpbnQgYXJjaF9kZW1hbmdsZV9pcnFfYml0cyh1bnNpZ25lZCBsb25nICp4KQogewogCWludCB2aXJ0ID0gKCp4ICYgKDEgPDwgMzEpKSAhPSAwOwogCSp4ICY9IH4oMUwgPDwgMzEpOwpAQCAtMTc0LDcgKzE3NCw3IEBACiAgKiBJbnRlcmZhY2UgdG8gdmFyaW91cyBhcmNoIHJvdXRpbmVzIHRoYXQgbWF5IGJlIHRyYWNlZC4KICAqLwogI2lmZGVmIENPTkZJR19JUElQRV9UUkFDRV9JUlFTT0ZGCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFyZF9sb2NhbF9pcnFfZGlzYWJsZSh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgaGFyZF9sb2NhbF9pcnFfZGlzYWJsZSh2b2lkKQogewogCWlmICghaGFyZF9pcnFzX2Rpc2FibGVkKCkpIHsKIAkJX19oYXJkX2xvY2FsX2lycV9kaXNhYmxlKCk7CkBAIC0xODIsNyArMTgyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoYXJkX2xvY2FsX2lycV9lbmFibGUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB2b2lkIGhhcmRfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQogewogCWlmIChoYXJkX2lycXNfZGlzYWJsZWQoKSkgewogCQlpcGlwZV90cmFjZV9lbmQoMHg4MDAwMDAwMCk7CkBAIC0xOTAsNyArMTkwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoYXJkX2xvY2FsX2lycV9zYXZlKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgdW5zaWduZWQgbG9uZyBoYXJkX2xvY2FsX2lycV9zYXZlKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IGhhcmRfbG9jYWxfc2F2ZV9mbGFncygpOwogCWlmICghaGFyZF9pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKSkgewpAQCAtMjAwLDcgKzIwMCw3IEBACiAJcmV0dXJuIGZsYWdzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFyZF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgaGFyZF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCWlmICghaGFyZF9pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKSkgewogCQlpcGlwZV90cmFjZV9lbmQoMHg4MDAwMDAwMSk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9rZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjZTFiMC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2tkZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9rbWFwX3R5cGVzLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ttYXBfdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3NWM2NC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ttYXBfdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9rbWFwX3R5cGVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2xvY2FsLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2xvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMWM1MzAuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9sb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2xvY2FsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2xvY2FsNjQuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbG9jYWw2NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmM5M2I1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbG9jYWw2NC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2xvY2FsNjQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW1hbi5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tbWFuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZWJmODkuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tbWFuLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1hbi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tb2R1bGUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW9kdWxlLmgKaW5kZXggNDI4MmIxNi4uZWQ1Njg5YiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tb2R1bGUuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21vZHVsZS5oCkBAIC0xLDggKzEsOCBAQAogLyoKLcKgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLcKgKgotwqAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KLcKgKi8KKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLwogCiAjaWZuZGVmIF9BU01fQkZJTl9NT0RVTEVfSAogI2RlZmluZSBfQVNNX0JGSU5fTU9EVUxFX0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXNnYnVmLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21zZ2J1Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDkxMzRjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXNnYnVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXNnYnVmLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL211dGV4LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL211dGV4LmgKaW5kZXggZjcyNmUzYS4uZmY2MTAxYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tdXRleC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXV0ZXguaApAQCAtMSw3NiArMSBAQAotLyoKLSAqIFB1bGwgaW4gdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtdXRleCBmYXN0cGF0aC4KLSAqCi0gKiBUT0RPOiBpbXBsZW1lbnQgb3B0aW1pemVkIHByaW1pdGl2ZXMgaW5zdGVhZCwgb3IgbGVhdmUgdGhlIGdlbmVyaWMKLSAqIGltcGxlbWVudGF0aW9uIGluIHBsYWNlLCBvciBwaWNrIHRoZSBhdG9taWNfeGNoZygpIGJhc2VkIGdlbmVyaWMKLSAqIGltcGxlbWVudGF0aW9uLiAoc2VlIGFzbS1nZW5lcmljL211dGV4LXhjaGcuaCBmb3IgZGV0YWlscykKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCi0gKi8KLQotI2lmbmRlZiBfQVNNX01VVEVYX0gKLSNkZWZpbmUgX0FTTV9NVVRFWF9ICi0KLSNpZm5kZWYgQ09ORklHX1NNUAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL211dGV4Lmg+Ci0jZWxzZQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9fbXV0ZXhfZmFzdHBhdGhfbG9jayhhdG9taWNfdCAqY291bnQsIHZvaWQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKLXsKLQlpZiAodW5saWtlbHkoYXRvbWljX2RlY19yZXR1cm4oY291bnQpIDwgMCkpCi0JCWZhaWxfZm4oY291bnQpOwotCWVsc2UKLQkJc21wX21iKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1fX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsKGF0b21pY190ICpjb3VudCwgaW50ICgqZmFpbF9mbikoYXRvbWljX3QgKikpCi17Ci0JaWYgKHVubGlrZWx5KGF0b21pY19kZWNfcmV0dXJuKGNvdW50KSA8IDApKQotCQlyZXR1cm4gZmFpbF9mbihjb3VudCk7Ci0JZWxzZSB7Ci0JCXNtcF9tYigpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19tdXRleF9mYXN0cGF0aF91bmxvY2soYXRvbWljX3QgKmNvdW50LCB2b2lkICgqZmFpbF9mbikoYXRvbWljX3QgKikpCi17Ci0Jc21wX21iKCk7Ci0JaWYgKHVubGlrZWx5KGF0b21pY19pbmNfcmV0dXJuKGNvdW50KSA8PSAwKSkKLQkJZmFpbF9mbihjb3VudCk7Ci19Ci0KLSNkZWZpbmUgX19tdXRleF9zbG93cGF0aF9uZWVkc190b191bmxvY2soKQkJMQotCi1zdGF0aWMgaW5saW5lIGludAotX19tdXRleF9mYXN0cGF0aF90cnlsb2NrKGF0b21pY190ICpjb3VudCwgaW50ICgqZmFpbF9mbikoYXRvbWljX3QgKikpCi17Ci0JLyoKLQkgKiBXZSBoYXZlIHR3byB2YXJpYW50cyBoZXJlLiBUaGUgY21weGNoZyBiYXNlZCBvbmUgaXMgdGhlIGJlc3Qgb25lCi0JICogYmVjYXVzZSBpdCBuZXZlciBpbmR1Y2UgYSBmYWxzZSBjb250ZW50aW9uIHN0YXRlLiAgSXQgaXMgaW5jbHVkZWQKLQkgKiBoZXJlIGJlY2F1c2UgYXJjaGl0ZWN0dXJlcyB1c2luZyB0aGUgaW5jL2RlYyBhbGdvcml0aG1zIG92ZXIgdGhlCi0JICogeGNoZyBvbmVzIGFyZSBtdWNoIG1vcmUgbGlrZWx5IHRvIHN1cHBvcnQgY21weGNoZyBuYXRpdmVseS4KLQkgKgotCSAqIElmIG5vdCB3ZSBmYWxsIGJhY2sgdG8gdGhlIHNwaW5sb2NrIGJhc2VkIHZhcmlhbnQgLSB0aGF0IGlzCi0JICoganVzdCBhcyBlZmZpY2llbnQgKGFuZCBzaW1wbGVyKSBhcyBhICdkZXN0cnVjdGl2ZScgcHJvYmluZyBvZgotCSAqIHRoZSBtdXRleCBzdGF0ZSB3b3VsZCBiZS4KLQkgKi8KLSNpZmRlZiBfX0hBVkVfQVJDSF9DTVBYQ0hHCi0JaWYgKGxpa2VseShhdG9taWNfY21weGNoZyhjb3VudCwgMSwgMCkgPT0gMSkpIHsKLQkJc21wX21iKCk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLSNlbHNlCi0JcmV0dXJuIGZhaWxfZm4oY291bnQpOwotI2VuZGlmCi19Ci0KLSNlbmRpZgotCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGFnZS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggZDBjZTk3NS4uNzIwMjQwNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wYWdlLmgKQEAgLTEsOCArMSw4IEBACiAvKgotwqAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgotwqAqCi3CoCogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgotwqAqLworICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCiAKICNpZm5kZWYgX0JMQUNLRklOX1BBR0VfSAogI2RlZmluZSBfQkxBQ0tGSU5fUEFHRV9ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BhcmFtLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BhcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWQ0NTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wYXJhbS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhcmFtLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BkYS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZGEuaAppbmRleCBkNDliYjI2Li4yOGMyNDk4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BkYS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGRhLmgKQEAgLTU0LDYgKzU0LDE2IEBACiAjZW5kaWYKIH07CiAKK3N0cnVjdCBibGFja2Zpbl9pbml0aWFsX3BkYSB7CisJdm9pZCAqcmV0eDsKKyNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKKwl2b2lkICpkY3BsYl9kb3VibGVmYXVsdF9hZGRyOworCXZvaWQgKmljcGxiX2RvdWJsZWZhdWx0X2FkZHI7CisJdm9pZCAqcmV0eF9kb3VibGVmYXVsdDsKKwl1bnNpZ25lZCBzZXFzdGF0X2RvdWJsZWZhdWx0OworI2VuZGlmCit9OworCiBleHRlcm4gc3RydWN0IGJsYWNrZmluX3BkYSBjcHVfcGRhW107CiAKICNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGVyY3B1LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BlcmNwdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE5NTlkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGVyY3B1LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGVyY3B1Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BnYWxsb2MuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGdhbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjYxY2I3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGdhbGxvYy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BnYWxsb2MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcmVzb3VyY2UuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcmVzb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiYzRkYi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Jlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvcmVzb3VyY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2NhdHRlcmxpc3QuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2NhdHRlcmxpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3N2ExNS4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX0JMQUNLRklOX1NDQVRURVJMSVNUX0gKLSNkZWZpbmUgX0JMQUNLRklOX1NDQVRURVJMSVNUX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NjYXR0ZXJsaXN0Lmg+Ci0KLSNlbmRpZgkJCQkvKiAhKF9CTEFDS0ZJTl9TQ0FUVEVSTElTVF9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oCmluZGV4IDE0YTNlNjYuLmZiZDQwODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VjdGlvbnMuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NlY3Rpb25zLmgKQEAgLTEsOCArMSw4IEBACiAvKgotwqAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgotwqAqCi3CoCogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgotwqAqLworICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCiAKICNpZm5kZWYgX0JMQUNLRklOX1NFQ1RJT05TX0gKICNkZWZpbmUgX0JMQUNLRklOX1NFQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VtYnVmLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NlbWJ1Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjczYjgzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VtYnVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2VtYnVmLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NlcmlhbC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zZXJpYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjYjBjYS4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NlcmlhbC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NlcmlhbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zZXR1cC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zZXR1cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTJkZjgzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2V0dXAuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZXR1cC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zaG1idWYuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2htYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzA1ZmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zaG1idWYuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zaG1idWYuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2htcGFyYW0uaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2htcGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmMzBkZS4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NobXBhcmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2htcGFyYW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2lnY29udGV4dC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKaW5kZXggY2U0MDgxYS4uOTA2YmRjMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKQEAgLTEsOCArMSw4IEBACiAvKgotwqAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotwqAqCi3CoCogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgotwqAqLworICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCiAKICNpZm5kZWYgX0FTTV9CTEFDS0ZJTl9TSUdDT05URVhUX0gKICNkZWZpbmUgX0FTTV9CTEFDS0ZJTl9TSUdDT05URVhUX0gKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NvY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjcxMzg0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvc29ja2V0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NvY2tpb3MuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc29ja2lvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY2ZDQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc29ja2lvcy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NvY2tpb3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2suaAppbmRleCAxZjI4NmU3Li4yMzM2MDkzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oCkBAIC0xLDggKzEsOCBAQAogLyoKLcKgKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KLcKgKgotwqAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KLcKgKi8KKyAqIENvcHlyaWdodCAyMDA0LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLwogCiAjaWZuZGVmIF9fQkZJTl9TUElOTE9DS19ICiAjZGVmaW5lIF9fQkZJTl9TUElOTE9DS19ICmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3N0YXRmcy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zdGF0ZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5MWZlMS4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3N0YXRmcy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90ZXJtYml0cy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90ZXJtYml0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTM1YjEwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGVybWJpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy90ZXJtYml0cy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90ZXJtaW9zLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Rlcm1pb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwZDc4YS4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Rlcm1pb3MuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy90ZXJtaW9zLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MjhmMzMuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RvcG9sb2d5Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3R5cGVzLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTc5YmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3R5cGVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Vjb250ZXh0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Vjb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYzA3YjkuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS91Y29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Vjb250ZXh0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VuYWxpZ25lZC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS91bmFsaWduZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNlY2JiYi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VuYWxpZ25lZC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3VuYWxpZ25lZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS91c2VyLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5MmE2MC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy91c2VyLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3hvci5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS94b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyZWIxMi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3hvci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3hvci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9NYWtlZmlsZQppbmRleCBkNTUwYjI0Li5iN2JkYzQyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9NYWtlZmlsZQpAQCAtMjEsNiArMjEsNyBAQAogb2JqLSQoQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUikgICs9IGZ0cmFjZS5vCiBDRkxBR1NfUkVNT1ZFX2Z0cmFjZS5vID0gLXBnCiAKK29iai0kKENPTkZJR19IQVZFX1BXTSkgICAgICAgICAgICAgICArPSBwd20ubwogb2JqLSQoQ09ORklHX0lQSVBFKSAgICAgICAgICAgICAgICAgICs9IGlwaXBlLm8KIG9iai0kKENPTkZJR19CRklOX0dQVElNRVJTKSAgICAgICAgICArPSBncHRpbWVycy5vCiBvYmotJChDT05GSUdfQ1BMQl9JTkZPKSAgICAgICAgICAgICAgKz0gY3BsYmluZm8ubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggYmQzMmMwOS4uMTdlMzU0NiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xMzgsNiArMTM4LDE2IEBACiAJREVGSU5FKFBEQV9ERl9TRVFTVEFULCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBzZXFzdGF0X2RvdWJsZWZhdWx0KSk7CiAJREVGSU5FKFBEQV9ERl9SRVRYLCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCByZXR4X2RvdWJsZWZhdWx0KSk7CiAjZW5kaWYKKworCS8qIFBEQSBpbml0aWFsIG1hbmFnZW1lbnQgKi8KKwlERUZJTkUoUERBX0lOSVRfUkVUWCwgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX2luaXRpYWxfcGRhLCByZXR4KSk7CisjaWZkZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUCisJREVGSU5FKFBEQV9JTklUX0RGX0RDUExCLCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5faW5pdGlhbF9wZGEsIGRjcGxiX2RvdWJsZWZhdWx0X2FkZHIpKTsKKwlERUZJTkUoUERBX0lOSVRfREZfSUNQTEIsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9pbml0aWFsX3BkYSwgaWNwbGJfZG91YmxlZmF1bHRfYWRkcikpOworCURFRklORShQREFfSU5JVF9ERl9TRVFTVEFULCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5faW5pdGlhbF9wZGEsIHNlcXN0YXRfZG91YmxlZmF1bHQpKTsKKwlERUZJTkUoUERBX0lOSVRfREZfUkVUWCwgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX2luaXRpYWxfcGRhLCByZXR4X2RvdWJsZWZhdWx0KSk7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19TTVAKIAkvKiBJbnRlci1jb3JlIGxvY2sgKGluIEwyIFNSQU0pICovCiAJREVGSU5FKFNJWkVPRl9DT1JFTE9DSywgc2l6ZW9mKHN0cnVjdCBjb3JlbG9ja19zbG90KSk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2dwaW8uYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jCmluZGV4IGJjZjhjZjYuLjAyNzk2YjggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jCkBAIC0xMTgsNiArMTE4LDkgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX1BNKQogc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfcyBncGlvX2Jhbmtfc2F2ZWRbR1BJT19CQU5LX05VTV07CisjIGlmZGVmIEJGNTM4X0ZBTUlMWQorc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRfZmVyX3NhdmVkWzNdOworIyBlbmRpZgogI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGdwaW9fZXJyb3IodW5zaWduZWQgZ3BpbykKQEAgLTYwNCw2ICs2MDcsMTEgQEAKIHsKIAlpbnQgaSwgYmFuazsKIAorI2lmZGVmIEJGNTM4X0ZBTUlMWQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvcnRfZmVyX3NhdmVkKTsgKytpKQorCQlwb3J0X2Zlcl9zYXZlZFtpXSA9ICpwb3J0X2ZlcltpXTsKKyNlbmRpZgorCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CTEFDS0ZJTl9HUElPUzsgaSArPSBHUElPX0JBTktTSVpFKSB7CiAJCWJhbmsgPSBncGlvX2JhbmsoaSk7CiAKQEAgLTYyNSw2ICs2MzMsMTAgQEAKIAkJZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLm1hc2thID0gZ3Bpb19hcnJheVtiYW5rXS0+bWFza2E7CiAJfQogCisjaWZkZWYgQkZJTl9TUEVDSUFMX0dQSU9fQkFOS1MKKwliZmluX3NwZWNpYWxfZ3Bpb19wbV9oaWJlcm5hdGVfc3VzcGVuZCgpOworI2VuZGlmCisKIAlBV0FfRFVNTVlfUkVBRChtYXNrYSk7CiB9CiAKQEAgLTYzMiw2ICs2NDQsMTEgQEAKIHsKIAlpbnQgaSwgYmFuazsKIAorI2lmZGVmIEJGNTM4X0ZBTUlMWQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvcnRfZmVyX3NhdmVkKTsgKytpKQorCQkqcG9ydF9mZXJbaV0gPSBwb3J0X2Zlcl9zYXZlZFtpXTsKKyNlbmRpZgorCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CTEFDS0ZJTl9HUElPUzsgaSArPSBHUElPX0JBTktTSVpFKSB7CiAJCWJhbmsgPSBncGlvX2JhbmsoaSk7CiAKQEAgLTY1Myw2ICs2NzAsMTEgQEAKIAkJZ3Bpb19hcnJheVtiYW5rXS0+Ym90aCAgPSBncGlvX2Jhbmtfc2F2ZWRbYmFua10uYm90aDsKIAkJZ3Bpb19hcnJheVtiYW5rXS0+bWFza2EgPSBncGlvX2Jhbmtfc2F2ZWRbYmFua10ubWFza2E7CiAJfQorCisjaWZkZWYgQkZJTl9TUEVDSUFMX0dQSU9fQkFOS1MKKwliZmluX3NwZWNpYWxfZ3Bpb19wbV9oaWJlcm5hdGVfcmVzdG9yZSgpOworI2VuZGlmCisKIAlBV0FfRFVNTVlfUkVBRChtYXNrYSk7CiB9CiAKQEAgLTY5MSw5ICs3MTMsOSBAQAogCQlncGlvX2FycmF5W2JhbmtdLT5wb3J0X211eCA9IGdwaW9fYmFua19zYXZlZFtiYW5rXS5tdXg7CiAJCWdwaW9fYXJyYXlbYmFua10tPnBvcnRfZmVyID0gZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLmZlcjsKIAkJZ3Bpb19hcnJheVtiYW5rXS0+aW5lbiA9IGdwaW9fYmFua19zYXZlZFtiYW5rXS5pbmVuOwotCQlncGlvX2FycmF5W2JhbmtdLT5kaXJfc2V0ID0gZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLmRpcjsKIAkJZ3Bpb19hcnJheVtiYW5rXS0+ZGF0YV9zZXQgPSBncGlvX2Jhbmtfc2F2ZWRbYmFua10uZGF0YQotCQkJCQkJfCBncGlvX2Jhbmtfc2F2ZWRbYmFua10uZGlyOworCQkJCQkJJiBncGlvX2Jhbmtfc2F2ZWRbYmFua10uZGlyOworCQlncGlvX2FycmF5W2JhbmtdLT5kaXJfc2V0ID0gZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLmRpcjsKIAl9CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2RlYnVnLW1tcnMuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2RlYnVnLW1tcnMuYwppbmRleCBmY2U0ODA3Li45MmY2NjQ4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9kZWJ1Zy1tbXJzLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZGVidWctbW1ycy5jCkBAIC0yNyw3ICsyNyw3IEBACiAjZGVmaW5lIFBPUlRfTVVYIEJGSU5fUE9SVF9NVVgKICNlbmRpZgogCi0jZGVmaW5lIF9kKG5hbWUsIGJpdHMsIGFkZHIsIHBlcm1zKSBkZWJ1Z2ZzX2NyZWF0ZV94IyNiaXRzKG5hbWUsIHBlcm1zLCBwYXJlbnQsICh1IyNiaXRzICopYWRkcikKKyNkZWZpbmUgX2QobmFtZSwgYml0cywgYWRkciwgcGVybXMpIGRlYnVnZnNfY3JlYXRlX3gjI2JpdHMobmFtZSwgcGVybXMsIHBhcmVudCwgKHUjI2JpdHMgKikoYWRkcikpCiAjZGVmaW5lIGQobmFtZSwgYml0cywgYWRkcikgICAgICAgICBfZChuYW1lLCBiaXRzLCBhZGRyLCBTX0lSVVNSfFNfSVdVU1IpCiAjZGVmaW5lIGRfUk8obmFtZSwgYml0cywgYWRkcikgICAgICBfZChuYW1lLCBiaXRzLCBhZGRyLCBTX0lSVVNSKQogI2RlZmluZSBkX1dPKG5hbWUsIGJpdHMsIGFkZHIpICAgICAgX2QobmFtZSwgYml0cywgYWRkciwgU19JV1VTUikKQEAgLTIyMyw3ICsyMjMsOCBAQAogCV9fRE1BKENVUlJfREVTQ19QVFIsIGN1cnJfZGVzY19wdHIpOwogCV9fRE1BKENVUlJfQUREUiwgY3Vycl9hZGRyKTsKIAlfX0RNQShJUlFfU1RBVFVTLCBpcnFfc3RhdHVzKTsKLQlfX0RNQShQRVJJUEhFUkFMX01BUCwgcGVyaXBoZXJhbF9tYXApOworCWlmIChzdHJjbXAocGZ4LCAiSU1ETUEiKSAhPSAwKQorCQlfX0RNQShQRVJJUEhFUkFMX01BUCwgcGVyaXBoZXJhbF9tYXApOwogCV9fRE1BKENVUlJfWF9DT1VOVCwgY3Vycl94X2NvdW50KTsKIAlfX0RNQShDVVJSX1lfQ09VTlQsIGN1cnJfeV9jb3VudCk7CiB9CkBAIC0yNzcsNiArMjc4LDMyIEBACiB9CiAjZGVmaW5lIEdQVElNRVIobnVtKSBiZmluX2RlYnVnX21tcnNfZ3B0aW1lcihwYXJlbnQsIFRJTUVSIyNudW0jI19DT05GSUcsIG51bSkKIAorI2RlZmluZSBHUFRJTUVSX0dST1VQX09GRihtbXIpIFJFR1NfT0ZGKGdwdGltZXJfZ3JvdXAsIG1tcikKKyNkZWZpbmUgX19HUFRJTUVSX0dST1VQKHVuYW1lLCBsbmFtZSkgX19SRUdTKGdwdGltZXJfZ3JvdXAsICN1bmFtZSwgbG5hbWUpCitzdGF0aWMgdm9pZCBfX2luaXQgX19tYXliZV91bnVzZWQKK2JmaW5fZGVidWdfbW1yc19ncHRpbWVyX2dyb3VwKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgbnVtKQoreworCWNoYXIgYnVmWzMyXSwgKl9idWY7CisKKwlpZiAobnVtID09IC0xKSB7CisJCV9idWYgPSBidWYgKyBzcHJpbnRmKGJ1ZiwgIlRJTUVSXyIpOworCQlfX0dQVElNRVJfR1JPVVAoRU5BQkxFLCBlbmFibGUpOworCQlfX0dQVElNRVJfR1JPVVAoRElTQUJMRSwgZGlzYWJsZSk7CisJCV9fR1BUSU1FUl9HUk9VUChTVEFUVVMsIHN0YXR1cyk7CisJfSBlbHNlIHsKKwkJLyogVGhlc2UgTU1ScyBhcmUgYSBiaXQgb2RkIGFzIHRoZSBncm91cCAjIGlzIGEgc3VmZml4ICovCisJCV9idWYgPSBidWYgKyBzcHJpbnRmKGJ1ZiwgIlRJTUVSX0VOQUJMRSVpIiwgbnVtKTsKKwkJZChidWYsIDE2LCBiYXNlICsgR1BUSU1FUl9HUk9VUF9PRkYoZW5hYmxlKSk7CisKKwkJX2J1ZiA9IGJ1ZiArIHNwcmludGYoYnVmLCAiVElNRVJfRElTQUJMRSVpIiwgbnVtKTsKKwkJZChidWYsIDE2LCBiYXNlICsgR1BUSU1FUl9HUk9VUF9PRkYoZGlzYWJsZSkpOworCisJCV9idWYgPSBidWYgKyBzcHJpbnRmKGJ1ZiwgIlRJTUVSX1NUQVRVUyVpIiwgbnVtKTsKKwkJZChidWYsIDMyLCBiYXNlICsgR1BUSU1FUl9HUk9VUF9PRkYoc3RhdHVzKSk7CisJfQorfQorI2RlZmluZSBHUFRJTUVSX0dST1VQKG1tciwgbnVtKSBiZmluX2RlYnVnX21tcnNfZ3B0aW1lcl9ncm91cChwYXJlbnQsIG1tciwgbnVtKQorCiAvKgogICogSGFuZHNoYWtlIE1ETUEKICAqLwpAQCAtMjk2LDYgKzMyMywyOSBAQAogI2RlZmluZSBITURNQShudW0pIGJmaW5fZGVidWdfbW1yc19obWRtYShwYXJlbnQsIEhNRE1BIyNudW0jI19DT05UUk9MLCBudW0pCiAKIC8qCisgKiBQZXJpcGhlcmFsIEludGVycnVwdHMgKFBJTlQvR1BJTykKKyAqLworI2lmZGVmIFBJTlQwX01BU0tfU0VUCisjZGVmaW5lIF9fUElOVCh1bmFtZSwgbG5hbWUpIF9fUkVHUyhwaW50LCAjdW5hbWUsIGxuYW1lKQorc3RhdGljIHZvaWQgX19pbml0IF9fbWF5YmVfdW51c2VkCitiZmluX2RlYnVnX21tcnNfcGludChzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IG51bSkKK3sKKwljaGFyIGJ1ZlszMl0sICpfYnVmID0gUkVHU19TVFJfUEZYKGJ1ZiwgUElOVCwgbnVtKTsKKwlfX1BJTlQoTUFTS19TRVQsIG1hc2tfc2V0KTsKKwlfX1BJTlQoTUFTS19DTEVBUiwgbWFza19jbGVhcik7CisJX19QSU5UKFJFUVVFU1QsIHJlcXVlc3QpOworCV9fUElOVChBU1NJR04sIGFzc2lnbik7CisJX19QSU5UKEVER0VfU0VULCBlZGdlX3NldCk7CisJX19QSU5UKEVER0VfQ0xFQVIsIGVkZ2VfY2xlYXIpOworCV9fUElOVChJTlZFUlRfU0VULCBpbnZlcnRfc2V0KTsKKwlfX1BJTlQoSU5WRVJUX0NMRUFSLCBpbnZlcnRfY2xlYXIpOworCV9fUElOVChQSU5TVEFURSwgcGluc3RhdGUpOworCV9fUElOVChMQVRDSCwgbGF0Y2gpOworfQorI2RlZmluZSBQSU5UKG51bSkgYmZpbl9kZWJ1Z19tbXJzX3BpbnQocGFyZW50LCBQSU5UIyNudW0jI19NQVNLX1NFVCwgbnVtKQorI2VuZGlmCisKKy8qCiAgKiBQb3J0L0dQSU8KICAqLwogI2RlZmluZSBiZmluX2dwaW9fcmVncyBncGlvX3BvcnRfdApAQCAtNzQ3LDcgKzc5Nyw3IEBACiAjZW5kaWYKIAogCXBhcmVudCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZG1hYyIsIHRvcCk7Ci0jaWZkZWYgRE1BX1RDX0NOVAorI2lmZGVmIERNQUNfVENfQ05UCiAJRDE2KERNQUNfVENfQ05UKTsKIAlEMTYoRE1BQ19UQ19QRVIpOwogI2VuZGlmCkBAIC0xMDA1LDI5ICsxMDU1LDE5IEBACiAjZW5kaWYKIAogCXBhcmVudCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZ3B0aW1lciIsIHRvcCk7Ci0jaWZkZWYgVElNRVJfRElTQUJMRQotCUQxNihUSU1FUl9ESVNBQkxFKTsKLQlEMTYoVElNRVJfRU5BQkxFKTsKLQlEMzIoVElNRVJfU1RBVFVTKTsKKyNpZmRlZiBUSU1FUl9FTkFCTEUKKwlHUFRJTUVSX0dST1VQKFRJTUVSX0VOQUJMRSwgLTEpOwogI2VuZGlmCi0jaWZkZWYgVElNRVJfRElTQUJMRTAKLQlEMTYoVElNRVJfRElTQUJMRTApOwotCUQxNihUSU1FUl9FTkFCTEUwKTsKLQlEMzIoVElNRVJfU1RBVFVTMCk7CisjaWZkZWYgVElNRVJfRU5BQkxFMAorCUdQVElNRVJfR1JPVVAoVElNRVJfRU5BQkxFMCwgMCk7CiAjZW5kaWYKLSNpZmRlZiBUSU1FUl9ESVNBQkxFMQotCUQxNihUSU1FUl9ESVNBQkxFMSk7Ci0JRDE2KFRJTUVSX0VOQUJMRTEpOwotCUQzMihUSU1FUl9TVEFUVVMxKTsKKyNpZmRlZiBUSU1FUl9FTkFCTEUxCisJR1BUSU1FUl9HUk9VUChUSU1FUl9FTkFCTEUxLCAxKTsKICNlbmRpZgogCS8qIFhYWDogU2hvdWxkIGNvbnZlcnQgQkY1NjEgTU1SIG5hbWVzICovCiAjaWZkZWYgVE1SUzRfRElTQUJMRQotCUQxNihUTVJTNF9ESVNBQkxFKTsKLQlEMTYoVE1SUzRfRU5BQkxFKTsKLQlEMzIoVE1SUzRfU1RBVFVTKTsKLQlEMTYoVE1SUzhfRElTQUJMRSk7Ci0JRDE2KFRNUlM4X0VOQUJMRSk7Ci0JRDMyKFRNUlM4X1NUQVRVUyk7CisJR1BUSU1FUl9HUk9VUChUTVJTNF9FTkFCTEUsIDApOworCUdQVElNRVJfR1JPVVAoVE1SUzhfRU5BQkxFLCAxKTsKICNlbmRpZgogCUdQVElNRVIoMCk7CiAJR1BUSU1FUigxKTsKQEAgLTEyNTMsNiArMTI5MywxNCBAQAogCUQzMihPVFBfREFUQTMpOwogI2VuZGlmCiAKKyNpZmRlZiBQSU5UMF9NQVNLX1NFVAorCXBhcmVudCA9IGRlYnVnZnNfY3JlYXRlX2RpcigicGludCIsIHRvcCk7CisJUElOVCgwKTsKKwlQSU5UKDEpOworCVBJTlQoMik7CisJUElOVCgzKTsKKyNlbmRpZgorCiAjaWZkZWYgUElYQ19DVEwKIAlwYXJlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInBpeGMiLCB0b3ApOwogCUQxNihQSVhDX0NUTCk7CkBAIC0xODE2LDcgKzE4NjQsNiBAQAogCXsKIAkJaW50IG51bTsKIAkJdW5zaWduZWQgbG9uZyBiYXNlOwotCQljaGFyICpfYnVmLCBidWZbMzJdOwogCiAJCWJhc2UgPSBQT1JUQV9GRVI7CiAJCWZvciAobnVtID0gMDsgbnVtIDwgMTA7ICsrbnVtKSB7CkBAIC0xODI0LDI0ICsxODcxLDYgQEAKIAkJCWJhc2UgKz0gc2l6ZW9mKHN0cnVjdCBiZmluX2dwaW9fcmVncyk7CiAJCX0KIAotI2RlZmluZSBfX1BJTlQodW5hbWUsIGxuYW1lKSBfX1JFR1MocGludCwgI3VuYW1lLCBsbmFtZSkKLQkJcGFyZW50ID0gZGVidWdmc19jcmVhdGVfZGlyKCJwaW50IiwgdG9wKTsKLQkJYmFzZSA9IFBJTlQwX01BU0tfU0VUOwotCQlmb3IgKG51bSA9IDA7IG51bSA8IDQ7ICsrbnVtKSB7Ci0JCQlfYnVmID0gUkVHU19TVFJfUEZYKGJ1ZiwgUElOVCwgbnVtKTsKLQkJCV9fUElOVChNQVNLX1NFVCwgbWFza19zZXQpOwotCQkJX19QSU5UKE1BU0tfQ0xFQVIsIG1hc2tfY2xlYXIpOwotCQkJX19QSU5UKElSUSwgaXJxKTsKLQkJCV9fUElOVChBU1NJR04sIGFzc2lnbik7Ci0JCQlfX1BJTlQoRURHRV9TRVQsIGVkZ2Vfc2V0KTsKLQkJCV9fUElOVChFREdFX0NMRUFSLCBlZGdlX2NsZWFyKTsKLQkJCV9fUElOVChJTlZFUlRfU0VULCBpbnZlcnRfc2V0KTsKLQkJCV9fUElOVChJTlZFUlRfQ0xFQVIsIGludmVydF9jbGVhcik7Ci0JCQlfX1BJTlQoUElOU1RBVEUsIHBpbnN0YXRlKTsKLQkJCV9fUElOVChMQVRDSCwgbGF0Y2gpOwotCQkJYmFzZSArPSBzaXplb2Yoc3RydWN0IGJmaW5fcGludF9yZWdzKTsKLQkJfQotCiAJfQogI2VuZGlmCS8qIEJGNTR4ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2dwdGltZXJzLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9ncHRpbWVycy5jCmluZGV4IDhiODFkYzAuLjA2NDU5ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2dwdGltZXJzLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZ3B0aW1lcnMuYwpAQCAtMjUsNDkgKzI1LDMzIEBACiAKICNkZWZpbmUgQkZJTl9USU1FUl9OVU1fR1JPVVAgIChCRklOX1RJTUVSX09DVEVUKE1BWF9CTEFDS0ZJTl9HUFRJTUVSUyAtIDEpICsgMSkKIAotdHlwZWRlZiBzdHJ1Y3QgewotCXVpbnQxNl90IGNvbmZpZzsKLQl1aW50MTZfdCBfX3BhZDsKLQl1aW50MzJfdCBjb3VudGVyOwotCXVpbnQzMl90IHBlcmlvZDsKLQl1aW50MzJfdCB3aWR0aDsKLX0gR1BUSU1FUl90aW1lcl9yZWdzOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdWludDE2X3QgZW5hYmxlOwotCXVpbnQxNl90IF9fcGFkMDsKLQl1aW50MTZfdCBkaXNhYmxlOwotCXVpbnQxNl90IF9fcGFkMTsKLQl1aW50MzJfdCBzdGF0dXM7Ci19IEdQVElNRVJfZ3JvdXBfcmVnczsKLQotc3RhdGljIHZvbGF0aWxlIEdQVElNRVJfdGltZXJfcmVncyAqY29uc3QgdGltZXJfcmVnc1tNQVhfQkxBQ0tGSU5fR1BUSU1FUlNdID0KK3N0YXRpYyBzdHJ1Y3QgYmZpbl9ncHRpbWVyX3JlZ3MgKiBjb25zdCB0aW1lcl9yZWdzW01BWF9CTEFDS0ZJTl9HUFRJTUVSU10gPQogewotCShHUFRJTUVSX3RpbWVyX3JlZ3MgKilUSU1FUjBfQ09ORklHLAotCShHUFRJTUVSX3RpbWVyX3JlZ3MgKilUSU1FUjFfQ09ORklHLAotCShHUFRJTUVSX3RpbWVyX3JlZ3MgKilUSU1FUjJfQ09ORklHLAorCSh2b2lkICopVElNRVIwX0NPTkZJRywKKwkodm9pZCAqKVRJTUVSMV9DT05GSUcsCisJKHZvaWQgKilUSU1FUjJfQ09ORklHLAogI2lmIChNQVhfQkxBQ0tGSU5fR1BUSU1FUlMgPiAzKQotCShHUFRJTUVSX3RpbWVyX3JlZ3MgKilUSU1FUjNfQ09ORklHLAotCShHUFRJTUVSX3RpbWVyX3JlZ3MgKilUSU1FUjRfQ09ORklHLAotCShHUFRJTUVSX3RpbWVyX3JlZ3MgKilUSU1FUjVfQ09ORklHLAotCShHUFRJTUVSX3RpbWVyX3JlZ3MgKilUSU1FUjZfQ09ORklHLAotCShHUFRJTUVSX3RpbWVyX3JlZ3MgKilUSU1FUjdfQ09ORklHLAorCSh2b2lkICopVElNRVIzX0NPTkZJRywKKwkodm9pZCAqKVRJTUVSNF9DT05GSUcsCisJKHZvaWQgKilUSU1FUjVfQ09ORklHLAorCSh2b2lkICopVElNRVI2X0NPTkZJRywKKwkodm9pZCAqKVRJTUVSN19DT05GSUcsCiAjIGlmIChNQVhfQkxBQ0tGSU5fR1BUSU1FUlMgPiA4KQotCShHUFRJTUVSX3RpbWVyX3JlZ3MgKilUSU1FUjhfQ09ORklHLAotCShHUFRJTUVSX3RpbWVyX3JlZ3MgKilUSU1FUjlfQ09ORklHLAotCShHUFRJTUVSX3RpbWVyX3JlZ3MgKilUSU1FUjEwX0NPTkZJRywKKwkodm9pZCAqKVRJTUVSOF9DT05GSUcsCisJKHZvaWQgKilUSU1FUjlfQ09ORklHLAorCSh2b2lkICopVElNRVIxMF9DT05GSUcsCiAjICBpZiAoTUFYX0JMQUNLRklOX0dQVElNRVJTID4gMTEpCi0JKEdQVElNRVJfdGltZXJfcmVncyAqKVRJTUVSMTFfQ09ORklHLAorCSh2b2lkICopVElNRVIxMV9DT05GSUcsCiAjICBlbmRpZgogIyBlbmRpZgogI2VuZGlmCiB9OwogCi1zdGF0aWMgdm9sYXRpbGUgR1BUSU1FUl9ncm91cF9yZWdzICpjb25zdCBncm91cF9yZWdzW0JGSU5fVElNRVJfTlVNX0dST1VQXSA9CitzdGF0aWMgc3RydWN0IGJmaW5fZ3B0aW1lcl9ncm91cF9yZWdzICogY29uc3QgZ3JvdXBfcmVnc1tCRklOX1RJTUVSX05VTV9HUk9VUF0gPQogewotCShHUFRJTUVSX2dyb3VwX3JlZ3MgKilUSU1FUjBfR1JPVVBfUkVHLAorCSh2b2lkICopVElNRVIwX0dST1VQX1JFRywKICNpZiAoTUFYX0JMQUNLRklOX0dQVElNRVJTID4gOCkKLQkoR1BUSU1FUl9ncm91cF9yZWdzICopVElNRVI4X0dST1VQX1JFRywKKwkodm9pZCAqKVRJTUVSOF9HUk9VUF9SRUcsCiAjZW5kaWYKIH07CiAKQEAgLTE0MCw3ICsxMjQsNyBAQAogdm9pZCBzZXRfZ3B0aW1lcl9wd2lkdGgodW5zaWduZWQgaW50IHRpbWVyX2lkLCB1aW50MzJfdCB2YWx1ZSkKIHsKIAl0YXNzZXJ0KHRpbWVyX2lkIDwgTUFYX0JMQUNLRklOX0dQVElNRVJTKTsKLQl0aW1lcl9yZWdzW3RpbWVyX2lkXS0+d2lkdGggPSB2YWx1ZTsKKwliZmluX3dyaXRlKCZ0aW1lcl9yZWdzW3RpbWVyX2lkXS0+d2lkdGgsIHZhbHVlKTsKIAlTU1lOQygpOwogfQogRVhQT1JUX1NZTUJPTChzZXRfZ3B0aW1lcl9wd2lkdGgpOwpAQCAtMTQ4LDE0ICsxMzIsMTQgQEAKIHVpbnQzMl90IGdldF9ncHRpbWVyX3B3aWR0aCh1bnNpZ25lZCBpbnQgdGltZXJfaWQpCiB7CiAJdGFzc2VydCh0aW1lcl9pZCA8IE1BWF9CTEFDS0ZJTl9HUFRJTUVSUyk7Ci0JcmV0dXJuIHRpbWVyX3JlZ3NbdGltZXJfaWRdLT53aWR0aDsKKwlyZXR1cm4gYmZpbl9yZWFkKCZ0aW1lcl9yZWdzW3RpbWVyX2lkXS0+d2lkdGgpOwogfQogRVhQT1JUX1NZTUJPTChnZXRfZ3B0aW1lcl9wd2lkdGgpOwogCiB2b2lkIHNldF9ncHRpbWVyX3BlcmlvZCh1bnNpZ25lZCBpbnQgdGltZXJfaWQsIHVpbnQzMl90IHBlcmlvZCkKIHsKIAl0YXNzZXJ0KHRpbWVyX2lkIDwgTUFYX0JMQUNLRklOX0dQVElNRVJTKTsKLQl0aW1lcl9yZWdzW3RpbWVyX2lkXS0+cGVyaW9kID0gcGVyaW9kOworCWJmaW5fd3JpdGUoJnRpbWVyX3JlZ3NbdGltZXJfaWRdLT5wZXJpb2QsIHBlcmlvZCk7CiAJU1NZTkMoKTsKIH0KIEVYUE9SVF9TWU1CT0woc2V0X2dwdGltZXJfcGVyaW9kKTsKQEAgLTE2Myw3MSArMTQ3LDc2IEBACiB1aW50MzJfdCBnZXRfZ3B0aW1lcl9wZXJpb2QodW5zaWduZWQgaW50IHRpbWVyX2lkKQogewogCXRhc3NlcnQodGltZXJfaWQgPCBNQVhfQkxBQ0tGSU5fR1BUSU1FUlMpOwotCXJldHVybiB0aW1lcl9yZWdzW3RpbWVyX2lkXS0+cGVyaW9kOworCXJldHVybiBiZmluX3JlYWQoJnRpbWVyX3JlZ3NbdGltZXJfaWRdLT5wZXJpb2QpOwogfQogRVhQT1JUX1NZTUJPTChnZXRfZ3B0aW1lcl9wZXJpb2QpOwogCiB1aW50MzJfdCBnZXRfZ3B0aW1lcl9jb3VudCh1bnNpZ25lZCBpbnQgdGltZXJfaWQpCiB7CiAJdGFzc2VydCh0aW1lcl9pZCA8IE1BWF9CTEFDS0ZJTl9HUFRJTUVSUyk7Ci0JcmV0dXJuIHRpbWVyX3JlZ3NbdGltZXJfaWRdLT5jb3VudGVyOworCXJldHVybiBiZmluX3JlYWQoJnRpbWVyX3JlZ3NbdGltZXJfaWRdLT5jb3VudGVyKTsKIH0KIEVYUE9SVF9TWU1CT0woZ2V0X2dwdGltZXJfY291bnQpOwogCiB1aW50MzJfdCBnZXRfZ3B0aW1lcl9zdGF0dXModW5zaWduZWQgaW50IGdyb3VwKQogewogCXRhc3NlcnQoZ3JvdXAgPCBCRklOX1RJTUVSX05VTV9HUk9VUCk7Ci0JcmV0dXJuIGdyb3VwX3JlZ3NbZ3JvdXBdLT5zdGF0dXM7CisJcmV0dXJuIGJmaW5fcmVhZCgmZ3JvdXBfcmVnc1tncm91cF0tPnN0YXR1cyk7CiB9CiBFWFBPUlRfU1lNQk9MKGdldF9ncHRpbWVyX3N0YXR1cyk7CiAKIHZvaWQgc2V0X2dwdGltZXJfc3RhdHVzKHVuc2lnbmVkIGludCBncm91cCwgdWludDMyX3QgdmFsdWUpCiB7CiAJdGFzc2VydChncm91cCA8IEJGSU5fVElNRVJfTlVNX0dST1VQKTsKLQlncm91cF9yZWdzW2dyb3VwXS0+c3RhdHVzID0gdmFsdWU7CisJYmZpbl93cml0ZSgmZ3JvdXBfcmVnc1tncm91cF0tPnN0YXR1cywgdmFsdWUpOwogCVNTWU5DKCk7CiB9CiBFWFBPUlRfU1lNQk9MKHNldF9ncHRpbWVyX3N0YXR1cyk7CiAKK3N0YXRpYyB1aW50MzJfdCByZWFkX2dwdGltZXJfc3RhdHVzKHVuc2lnbmVkIGludCB0aW1lcl9pZCkKK3sKKwlyZXR1cm4gYmZpbl9yZWFkKCZncm91cF9yZWdzW0JGSU5fVElNRVJfT0NURVQodGltZXJfaWQpXS0+c3RhdHVzKTsKK30KKwogaW50IGdldF9ncHRpbWVyX2ludHIodW5zaWduZWQgaW50IHRpbWVyX2lkKQogewogCXRhc3NlcnQodGltZXJfaWQgPCBNQVhfQkxBQ0tGSU5fR1BUSU1FUlMpOwotCXJldHVybiAhIShncm91cF9yZWdzW0JGSU5fVElNRVJfT0NURVQodGltZXJfaWQpXS0+c3RhdHVzICYgdGltaWxfbWFza1t0aW1lcl9pZF0pOworCXJldHVybiAhIShyZWFkX2dwdGltZXJfc3RhdHVzKHRpbWVyX2lkKSAmIHRpbWlsX21hc2tbdGltZXJfaWRdKTsKIH0KIEVYUE9SVF9TWU1CT0woZ2V0X2dwdGltZXJfaW50cik7CiAKIHZvaWQgY2xlYXJfZ3B0aW1lcl9pbnRyKHVuc2lnbmVkIGludCB0aW1lcl9pZCkKIHsKIAl0YXNzZXJ0KHRpbWVyX2lkIDwgTUFYX0JMQUNLRklOX0dQVElNRVJTKTsKLQlncm91cF9yZWdzW0JGSU5fVElNRVJfT0NURVQodGltZXJfaWQpXS0+c3RhdHVzID0gdGltaWxfbWFza1t0aW1lcl9pZF07CisJYmZpbl93cml0ZSgmZ3JvdXBfcmVnc1tCRklOX1RJTUVSX09DVEVUKHRpbWVyX2lkKV0tPnN0YXR1cywgdGltaWxfbWFza1t0aW1lcl9pZF0pOwogfQogRVhQT1JUX1NZTUJPTChjbGVhcl9ncHRpbWVyX2ludHIpOwogCiBpbnQgZ2V0X2dwdGltZXJfb3Zlcih1bnNpZ25lZCBpbnQgdGltZXJfaWQpCiB7CiAJdGFzc2VydCh0aW1lcl9pZCA8IE1BWF9CTEFDS0ZJTl9HUFRJTUVSUyk7Ci0JcmV0dXJuICEhKGdyb3VwX3JlZ3NbQkZJTl9USU1FUl9PQ1RFVCh0aW1lcl9pZCldLT5zdGF0dXMgJiB0b3ZmX21hc2tbdGltZXJfaWRdKTsKKwlyZXR1cm4gISEocmVhZF9ncHRpbWVyX3N0YXR1cyh0aW1lcl9pZCkgJiB0b3ZmX21hc2tbdGltZXJfaWRdKTsKIH0KIEVYUE9SVF9TWU1CT0woZ2V0X2dwdGltZXJfb3Zlcik7CiAKIHZvaWQgY2xlYXJfZ3B0aW1lcl9vdmVyKHVuc2lnbmVkIGludCB0aW1lcl9pZCkKIHsKIAl0YXNzZXJ0KHRpbWVyX2lkIDwgTUFYX0JMQUNLRklOX0dQVElNRVJTKTsKLQlncm91cF9yZWdzW0JGSU5fVElNRVJfT0NURVQodGltZXJfaWQpXS0+c3RhdHVzID0gdG92Zl9tYXNrW3RpbWVyX2lkXTsKKwliZmluX3dyaXRlKCZncm91cF9yZWdzW0JGSU5fVElNRVJfT0NURVQodGltZXJfaWQpXS0+c3RhdHVzLCB0b3ZmX21hc2tbdGltZXJfaWRdKTsKIH0KIEVYUE9SVF9TWU1CT0woY2xlYXJfZ3B0aW1lcl9vdmVyKTsKIAogaW50IGdldF9ncHRpbWVyX3J1bih1bnNpZ25lZCBpbnQgdGltZXJfaWQpCiB7CiAJdGFzc2VydCh0aW1lcl9pZCA8IE1BWF9CTEFDS0ZJTl9HUFRJTUVSUyk7Ci0JcmV0dXJuICEhKGdyb3VwX3JlZ3NbQkZJTl9USU1FUl9PQ1RFVCh0aW1lcl9pZCldLT5zdGF0dXMgJiB0cnVuX21hc2tbdGltZXJfaWRdKTsKKwlyZXR1cm4gISEocmVhZF9ncHRpbWVyX3N0YXR1cyh0aW1lcl9pZCkgJiB0cnVuX21hc2tbdGltZXJfaWRdKTsKIH0KIEVYUE9SVF9TWU1CT0woZ2V0X2dwdGltZXJfcnVuKTsKIAogdm9pZCBzZXRfZ3B0aW1lcl9jb25maWcodW5zaWduZWQgaW50IHRpbWVyX2lkLCB1aW50MTZfdCBjb25maWcpCiB7CiAJdGFzc2VydCh0aW1lcl9pZCA8IE1BWF9CTEFDS0ZJTl9HUFRJTUVSUyk7Ci0JdGltZXJfcmVnc1t0aW1lcl9pZF0tPmNvbmZpZyA9IGNvbmZpZzsKKwliZmluX3dyaXRlKCZ0aW1lcl9yZWdzW3RpbWVyX2lkXS0+Y29uZmlnLCBjb25maWcpOwogCVNTWU5DKCk7CiB9CiBFWFBPUlRfU1lNQk9MKHNldF9ncHRpbWVyX2NvbmZpZyk7CkBAIC0yMzUsNyArMjI0LDcgQEAKIHVpbnQxNl90IGdldF9ncHRpbWVyX2NvbmZpZyh1bnNpZ25lZCBpbnQgdGltZXJfaWQpCiB7CiAJdGFzc2VydCh0aW1lcl9pZCA8IE1BWF9CTEFDS0ZJTl9HUFRJTUVSUyk7Ci0JcmV0dXJuIHRpbWVyX3JlZ3NbdGltZXJfaWRdLT5jb25maWc7CisJcmV0dXJuIGJmaW5fcmVhZCgmdGltZXJfcmVnc1t0aW1lcl9pZF0tPmNvbmZpZyk7CiB9CiBFWFBPUlRfU1lNQk9MKGdldF9ncHRpbWVyX2NvbmZpZyk7CiAKQEAgLTI0NCw3ICsyMzMsNyBAQAogCWludCBpOwogCXRhc3NlcnQoKG1hc2sgJiB+QkxBQ0tGSU5fR1BUSU1FUl9JRE1BU0spID09IDApOwogCWZvciAoaSA9IDA7IGkgPCBCRklOX1RJTUVSX05VTV9HUk9VUDsgKytpKSB7Ci0JCWdyb3VwX3JlZ3NbaV0tPmVuYWJsZSA9IG1hc2sgJiAweEZGOworCQliZmluX3dyaXRlKCZncm91cF9yZWdzW2ldLT5lbmFibGUsIG1hc2sgJiAweEZGKTsKIAkJbWFzayA+Pj0gODsKIAl9CiAJU1NZTkMoKTsKQEAgLTI1Nyw3ICsyNDYsNyBAQAogCXVpbnQxNl90IG0gPSBtYXNrOwogCXRhc3NlcnQoKG1hc2sgJiB+QkxBQ0tGSU5fR1BUSU1FUl9JRE1BU0spID09IDApOwogCWZvciAoaSA9IDA7IGkgPCBCRklOX1RJTUVSX05VTV9HUk9VUDsgKytpKSB7Ci0JCWdyb3VwX3JlZ3NbaV0tPmRpc2FibGUgPSBtICYgMHhGRjsKKwkJYmZpbl93cml0ZSgmZ3JvdXBfcmVnc1tpXS0+ZGlzYWJsZSwgbSAmIDB4RkYpOwogCQltID4+PSA4OwogCX0KIH0KQEAgLTI2OCw3ICsyNTcsNyBAQAogCV9kaXNhYmxlX2dwdGltZXJzKG1hc2spOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfQkxBQ0tGSU5fR1BUSU1FUlM7ICsraSkKIAkJaWYgKG1hc2sgJiAoMSA8PCBpKSkKLQkJCWdyb3VwX3JlZ3NbQkZJTl9USU1FUl9PQ1RFVChpKV0tPnN0YXR1cyA9IHRydW5fbWFza1tpXTsKKwkJCWJmaW5fd3JpdGUoJmdyb3VwX3JlZ3NbQkZJTl9USU1FUl9PQ1RFVChpKV0tPnN0YXR1cywgdHJ1bl9tYXNrW2ldKTsKIAlTU1lOQygpOwogfQogRVhQT1JUX1NZTUJPTChkaXNhYmxlX2dwdGltZXJzKTsKQEAgLTI4Myw3ICsyNzIsNyBAQAogdm9pZCBzZXRfZ3B0aW1lcl9wdWxzZV9oaSh1bnNpZ25lZCBpbnQgdGltZXJfaWQpCiB7CiAJdGFzc2VydCh0aW1lcl9pZCA8IE1BWF9CTEFDS0ZJTl9HUFRJTUVSUyk7Ci0JdGltZXJfcmVnc1t0aW1lcl9pZF0tPmNvbmZpZyB8PSBUSU1FUl9QVUxTRV9ISTsKKwliZmluX3dyaXRlX29yKCZ0aW1lcl9yZWdzW3RpbWVyX2lkXS0+Y29uZmlnLCBUSU1FUl9QVUxTRV9ISSk7CiAJU1NZTkMoKTsKIH0KIEVYUE9SVF9TWU1CT0woc2V0X2dwdGltZXJfcHVsc2VfaGkpOwpAQCAtMjkxLDcgKzI4MCw3IEBACiB2b2lkIGNsZWFyX2dwdGltZXJfcHVsc2VfaGkodW5zaWduZWQgaW50IHRpbWVyX2lkKQogewogCXRhc3NlcnQodGltZXJfaWQgPCBNQVhfQkxBQ0tGSU5fR1BUSU1FUlMpOwotCXRpbWVyX3JlZ3NbdGltZXJfaWRdLT5jb25maWcgJj0gflRJTUVSX1BVTFNFX0hJOworCWJmaW5fd3JpdGVfYW5kKCZ0aW1lcl9yZWdzW3RpbWVyX2lkXS0+Y29uZmlnLCB+VElNRVJfUFVMU0VfSEkpOwogCVNTWU5DKCk7CiB9CiBFWFBPUlRfU1lNQk9MKGNsZWFyX2dwdGltZXJfcHVsc2VfaGkpOwpAQCAtMzAxLDcgKzI5MCw3IEBACiAJaW50IGk7CiAJdWludDE2X3QgcmVzdWx0ID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgQkZJTl9USU1FUl9OVU1fR1JPVVA7ICsraSkKLQkJcmVzdWx0IHw9IChncm91cF9yZWdzW2ldLT5lbmFibGUgPDwgKGkgPDwgMykpOworCQlyZXN1bHQgfD0gKGJmaW5fcmVhZCgmZ3JvdXBfcmVnc1tpXS0+ZW5hYmxlKSA8PCAoaSA8PCAzKSk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIEVYUE9SVF9TWU1CT0woZ2V0X2VuYWJsZWRfZ3B0aW1lcnMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9tb2R1bGUuYwppbmRleCAzNWUzNTBjLi40NDg5ZWZjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9tb2R1bGUuYwpAQCAtMTYsMTkgKzE2LDYgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLXZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHZtYWxsb2Moc2l6ZSk7Ci19Ci0KLS8qIEZyZWUgbWVtb3J5IHJldHVybmVkIGZyb20gbW9kdWxlX2FsbG9jICovCi12b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKLXsKLQl2ZnJlZShtb2R1bGVfcmVnaW9uKTsKLX0KLQogLyogVHJhbnNmZXIgdGhlIHNlY3Rpb24gdG8gdGhlIEwxIG1lbW9yeSAqLwogaW50CiBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsIEVsZl9TaGRyICpzZWNoZHJzLApAQCAtMTUwLDE0ICsxMzcsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQKLWFwcGx5X3JlbG9jYXRlKEVsZl9TaGRyICogc2VjaGRycywgY29uc3QgY2hhciAqc3RydGFiLAotCSAgICAgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsIHVuc2lnbmVkIGludCByZWxzZWMsIHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLQlwcl9lcnIoIi5yZWwgdW5zdXBwb3J0ZWRcbiIpOwotCXJldHVybiAtRU5PRVhFQzsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGVU5DVElPTiA6IGFwcGx5X3JlbG9jYXRlX2FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEFCU1RSQUNUIDogQmxhY2tmaW4gc3BlY2lmaWMgcmVsb2NhdGlvbiBoYW5kbGluZyBmb3IgdGhlIGxvYWRhYmxlICAgICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDZhNjYwZmEuLjZhODBhOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE0MCw3ICsxNDAsNiBAQAogICovCiB2b2lkIHN0YXJ0X3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBuZXdfaXAsIHVuc2lnbmVkIGxvbmcgbmV3X3NwKQogewotCXNldF9mcyhVU0VSX0RTKTsKIAlyZWdzLT5wYyA9IG5ld19pcDsKIAlpZiAoY3VycmVudC0+bW0pCiAJCXJlZ3MtPnA1ID0gY3VycmVudC0+bW0tPnN0YXJ0X2RhdGE7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9wd20uYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3B3bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjU5NDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wd20uYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIEJsYWNrZmluIFB1bHNlIFdpZHRoIE1vZHVsYXRpb24gKFBXTSkgY29yZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wd20uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vZ3B0aW1lcnMuaD4KKyNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgorCitzdHJ1Y3QgcHdtX2RldmljZSB7CisJdW5zaWduZWQgaWQ7CisJdW5zaWduZWQgc2hvcnQgcGluOworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHB3bV90b19ncHRpbWVyX3BlcltdID0geworCVBfVE1SMCwgUF9UTVIxLCBQX1RNUjIsIFBfVE1SMywgUF9UTVI0LCBQX1RNUjUsCisJUF9UTVI2LCBQX1RNUjcsIFBfVE1SOCwgUF9UTVI5LCBQX1RNUjEwLCBQX1RNUjExLAorfTsKKworc3RydWN0IHB3bV9kZXZpY2UgKnB3bV9yZXF1ZXN0KGludCBwd21faWQsIGNvbnN0IGNoYXIgKmxhYmVsKQoreworCXN0cnVjdCBwd21fZGV2aWNlICpwd207CisJaW50IHJldDsKKworCS8qIFhYWDogcHdtX2lkIHJlYWxseSBzaG91bGQgYmUgdW5zaWduZWQgKi8KKwlpZiAocHdtX2lkIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwd20gPSBremFsbG9jKHNpemVvZigqcHdtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwd20pCisJCXJldHVybiBwd207CisKKwlwd20tPmlkID0gcHdtX2lkOworCWlmIChwd20tPmlkID49IEFSUkFZX1NJWkUocHdtX3RvX2dwdGltZXJfcGVyKSkKKwkJZ290byBlcnI7CisKKwlwd20tPnBpbiA9IHB3bV90b19ncHRpbWVyX3Blcltwd20tPmlkXTsKKwlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QocHdtLT5waW4sIGxhYmVsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldHVybiBwd207CisgZXJyOgorCWtmcmVlKHB3bSk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHB3bV9yZXF1ZXN0KTsKKwordm9pZCBwd21fZnJlZShzdHJ1Y3QgcHdtX2RldmljZSAqcHdtKQoreworCXBlcmlwaGVyYWxfZnJlZShwd20tPnBpbik7CisJa2ZyZWUocHdtKTsKK30KK0VYUE9SVF9TWU1CT0wocHdtX2ZyZWUpOworCitpbnQgcHdtX2NvbmZpZyhzdHJ1Y3QgcHdtX2RldmljZSAqcHdtLCBpbnQgZHV0eV9ucywgaW50IHBlcmlvZF9ucykKK3sKKwl1bnNpZ25lZCBsb25nIHBlcmlvZCwgZHV0eTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCisJaWYgKGR1dHlfbnMgPCAwIHx8IGR1dHlfbnMgPiBwZXJpb2RfbnMpCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsID0gKHVuc2lnbmVkIGxvbmcgbG9uZylnZXRfc2NsaygpICogcGVyaW9kX25zOworCWRvX2Rpdih2YWwsIE5TRUNfUEVSX1NFQyk7CisJcGVyaW9kID0gdmFsOworCisJdmFsID0gKHVuc2lnbmVkIGxvbmcgbG9uZylwZXJpb2QgKiBkdXR5X25zOworCWRvX2Rpdih2YWwsIHBlcmlvZF9ucyk7CisJZHV0eSA9IHBlcmlvZCAtIHZhbDsKKworCWlmIChkdXR5ID49IHBlcmlvZCkKKwkJZHV0eSA9IHBlcmlvZCAtIDE7CisKKwlzZXRfZ3B0aW1lcl9jb25maWcocHdtLT5pZCwgVElNRVJfTU9ERV9QV00gfCBUSU1FUl9QRVJJT0RfQ05UKTsKKwlzZXRfZ3B0aW1lcl9wd2lkdGgocHdtLT5pZCwgZHV0eSk7CisJc2V0X2dwdGltZXJfcGVyaW9kKHB3bS0+aWQsIHBlcmlvZCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocHdtX2NvbmZpZyk7CisKK2ludCBwd21fZW5hYmxlKHN0cnVjdCBwd21fZGV2aWNlICpwd20pCit7CisJZW5hYmxlX2dwdGltZXIocHdtLT5pZCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHB3bV9lbmFibGUpOworCit2b2lkIHB3bV9kaXNhYmxlKHN0cnVjdCBwd21fZGV2aWNlICpwd20pCit7CisJZGlzYWJsZV9ncHRpbWVyKHB3bS0+aWQpOworfQorRVhQT1JUX1NZTUJPTChwd21fZGlzYWJsZSk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3JlYm9vdC5jCmluZGV4IDQ4OGJkYzUuLmM0YzAwODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3JlYm9vdC5jCkBAIC01NCw3ICs1NCw5IEBACiAKIAkvKiBUaGUgQkY1MjYgUk9NIHdpbGwgY3Jhc2ggZHVyaW5nIHJlc2V0ICovCiAjaWYgZGVmaW5lZChfX0FEU1BCRjUyMl9fKSB8fCBkZWZpbmVkKF9fQURTUEJGNTI0X18pIHx8IGRlZmluZWQoX19BRFNQQkY1MjZfXykKLQliZmluX3JlYWRfU1dSU1QoKTsKKwkvKiBTZWVtcyB0byBiZSBmaXhlZCB3aXRoIG5ld2VyIHBhcnRzIHRob3VnaCAuLi4gKi8KKwlpZiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxICYmIGJmaW5fcmV2aWQoKSA8IDEpCisJCWJmaW5fcmVhZF9TV1JTVCgpOwogI2VuZGlmCiAKIAkvKiBXYWl0IGZvciB0aGUgU1dSU1Qgd3JpdGUgdG8gY29tcGxldGUuICBDYW5ub3QgcmVseSBvbiBTU1lOQwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMKaW5kZXggNTM2YmQ5ZC4uZGZhMjUyNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zZXR1cC5jCkBAIC01NCw4ICs1NCw3IEBACiAjZW5kaWYKIAogY2hhciBfX2luaXRkYXRhIGNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07Ci12b2lkIF9faW5pdGRhdGEgKmluaXRfcmV0eCwgKmluaXRfc2F2ZWRfcmV0eCwgKmluaXRfc2F2ZWRfc2Vxc3RhdCwKLQkqaW5pdF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyLCAqaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOworc3RydWN0IGJsYWNrZmluX2luaXRpYWxfcGRhIF9faW5pdGRhdGEgaW5pdGlhbF9wZGE7CiAKIC8qIGJvb3QgbWVtbWFwLCBmb3IgcGFyc2luZyAibWVtbWFwPSIgKi8KICNkZWZpbmUgQkZJTl9NRU1NQVBfTUFYCQkxMjggLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gYmZpbl9tZW1tYXAgKi8KQEAgLTk1NywxMyArOTU2LDE2IEBACiAJCXByaW50ayhLRVJOX0VNRVJHICJSZWNvdmVyaW5nIGZyb20gRE9VQkxFIEZBVUxUIGV2ZW50XG4iKTsKICNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKIAkJLyogV2UgYXNzdW1lIHRoZSBjcmFzaGluZyBrZXJuZWwsIGFuZCB0aGUgY3VycmVudCBzeW1ib2wgdGFibGUgbWF0Y2ggKi8KLQkJcHJpbnRrKEtFUk5fRU1FUkcgIiBXaGlsZSBoYW5kbGluZyBleGNlcHRpb24gKEVYQ0FVU0UgPSAweCV4KSBhdCAlcEZcbiIsCi0JCQkoaW50KWluaXRfc2F2ZWRfc2Vxc3RhdCAmIFNFUVNUQVRfRVhDQVVTRSwgaW5pdF9zYXZlZF9yZXR4KTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICIgICBEQ1BMQl9GQVVMVF9BRERSOiAlcEZcbiIsIGluaXRfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcik7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiICAgSUNQTEJfRkFVTFRfQUREUjogJXBGXG4iLCBpbml0X3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHIpOworCQlwcmludGsoS0VSTl9FTUVSRyAiIFdoaWxlIGhhbmRsaW5nIGV4Y2VwdGlvbiAoRVhDQVVTRSA9ICUjeCkgYXQgJXBGXG4iLAorCQkJaW5pdGlhbF9wZGEuc2Vxc3RhdF9kb3VibGVmYXVsdCAmIFNFUVNUQVRfRVhDQVVTRSwKKwkJCWluaXRpYWxfcGRhLnJldHhfZG91YmxlZmF1bHQpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgIERDUExCX0ZBVUxUX0FERFI6ICVwRlxuIiwKKwkJCWluaXRpYWxfcGRhLmRjcGxiX2RvdWJsZWZhdWx0X2FkZHIpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgIElDUExCX0ZBVUxUX0FERFI6ICVwRlxuIiwKKwkJCWluaXRpYWxfcGRhLmljcGxiX2RvdWJsZWZhdWx0X2FkZHIpOwogI2VuZGlmCiAJCXByaW50ayhLRVJOX05PVElDRSAiIFRoZSBpbnN0cnVjdGlvbiBhdCAlcEYgY2F1c2VkIGEgZG91YmxlIGV4Y2VwdGlvblxuIiwKLQkJCWluaXRfcmV0eCk7CisJCQlpbml0aWFsX3BkYS5yZXR4KTsKIAl9IGVsc2UgaWYgKF9iZmluX3N3cnN0ICYgUkVTRVRfV0RPRykKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUmVjb3ZlcmluZyBmcm9tIFdhdGNoZG9nIGV2ZW50XG4iKTsKIAllbHNlIGlmIChfYmZpbl9zd3JzdCAmIFJFU0VUX1NPRlRXQVJFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS5jCmluZGV4IDhkNzM3MjQuLmNlYjJiZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3RpbWUuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC90aW1lLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAl1MzIgdGNvdW50OwogCiAJLyogcG93ZXIgdXAgdGhlIHRpbWVyLCBidXQgZG9uJ3QgZW5hYmxlIGl0IGp1c3QgeWV0ICovCi0JYmZpbl93cml0ZV9UQ05UTCgxKTsKKwliZmluX3dyaXRlX1RDTlRMKFRNUFdSKTsKIAlDU1lOQygpOwogCiAJLyogdGhlIFRTQ0FMRSBwcmVzY2FsZXIgY291bnRlciAqLwpAQCAtNjQsNyArNjQsNyBAQAogCS8qIG5vdyBlbmFibGUgdGhlIHRpbWVyICovCiAJQ1NZTkMoKTsKIAotCWJmaW5fd3JpdGVfVENOVEwoNyk7CisJYmZpbl93cml0ZV9UQ05UTChUQVVUT1JMRCB8IFRNUkVOIHwgVE1QV1IpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDNhYzViNjYuLmJhMzU4NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTU1LDYgKzE1NSw3IEBACiAJCVNFQ1VSSVRZX0lOSVRDQUxMCiAJCUlOSVRfUkFNX0ZTCiAKKwkJLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAJCV9fX3Blcl9jcHVfbG9hZCA9IC47CiAJCVBFUkNQVV9JTlBVVCgzMikKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvS2NvbmZpZwppbmRleCAxZDlmNjMxLi5iZGU5MmExIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvS2NvbmZpZwpAQCAtMTEsNTUgKzExLDc1IEBACiBjb21tZW50ICJBbHRlcm5hdGl2ZSBNdWx0aXBsZXhpbmcgU2NoZW1lIgogCiBjaG9pY2UKLQlwcm9tcHQgIlNQT1JUMCIKLQlkZWZhdWx0IEJGNTE4X1NQT1JUMF9QT1JURworCXByb21wdCAiUFdNIENoYW5uZWwgUGlucyIKKwlkZWZhdWx0IEJGNTE4X1BXTV9BTExfUE9SVEYKIAloZWxwCi0JICBTZWxlY3QgUE9SVCB1c2VkIGZvciBTUE9SVDAuIFNlZSBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFsCisJICBTZWxlY3QgcGlucyB1c2VkIGZvciB0aGUgUFdNIGNoYW5uZWxzOgorCSAgICBQV01fQUggUFdNX0FMIFBXTV9CSCBQV01fQkwgUFdNX0NIIFBXTV9DTAogCi1jb25maWcgQkY1MThfU1BPUlQwX1BPUlRGCi0JYm9vbCAiUE9SVCBGIgotCWhlbHAKLQkgIFBPUlQgRgorCSAgU2VlIHRoZSBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFsIGZvciBtb3JlIGRldGFpbHMuCiAKLWNvbmZpZyBCRjUxOF9TUE9SVDBfUE9SVEcKLQlib29sICJQT1JUIEciCitjb25maWcgQkY1MThfUFdNX0FMTF9QT1JURgorCWJvb2wgIlBGMSAtIFBGNiIKIAloZWxwCi0JICBQT1JUIEcKKwkgIFBGezEsMiwzLDQsNSw2fSA8LT4gUFdNX3tBSCxBTCxCSCxCTCxDSCxDTH0KKworY29uZmlnIEJGNTE4X1BXTV9QT1JURl9QT1JURworCWJvb2wgIlBGMTEgLSBQRjE0IC8gUEcxIC0gUEcyIgorCWhlbHAKKwkgIFBGezExLDEyLDEzLDE0fSA8LT4gUFdNX3tBSCxBTCxCSCxCTH0KKwkgIFBHezEsMn0gPC0+IFBXTV97Q0gsQ0x9CisKIGVuZGNob2ljZQogCiBjaG9pY2UKLQlwcm9tcHQgIlNQT1JUMCBUU0NMSyBMb2NhdGlvbiIKLQlkZXBlbmRzIG9uIEJGNTE4X1NQT1JUMF9QT1JURwotCWRlZmF1bHQgQkY1MThfU1BPUlQwX1RTQ0xLX1BHMTAKKwlwcm9tcHQgIlBXTSBTeW5jIFBpbiIKKwlkZWZhdWx0IEJGNTE4X1BXTV9TWU5DX1BGNwogCWhlbHAKLQkgIFNlbGVjdCBQSU4gdXNlZCBmb3IgU1BPUlQwX1RTQ0xLLiBTZWUgSGFyZHdhcmUgUmVmZXJlbmNlIE1hbnVhbAorCSAgU2VsZWN0IHRoZSBwaW4gdXNlZCBmb3IgUFdNX1NZTkMuCiAKLWNvbmZpZyBCRjUxOF9TUE9SVDBfVFNDTEtfUEcxMAotCWJvb2wgIlBPUlQgUEcxMCIKLQloZWxwCi0JICBQT1JUIFBHMTAKKwkgIFNlZSB0aGUgSGFyZHdhcmUgUmVmZXJlbmNlIE1hbnVhbCBmb3IgbW9yZSBkZXRhaWxzLgogCi1jb25maWcgQkY1MThfU1BPUlQwX1RTQ0xLX1BHMTQKLQlib29sICJQT1JUIFBHMTQiCi0JaGVscAotCSAgUE9SVCBQRzE0Citjb25maWcgQkY1MThfUFdNX1NZTkNfUEY3CisJYm9vbCAiUEY3IgorY29uZmlnIEJGNTE4X1BXTV9TWU5DX1BGMTUKKwlib29sICJQRjE1IgogZW5kY2hvaWNlCiAKIGNob2ljZQotCXByb21wdCAiVUFSVDEiCi0JZGVmYXVsdCBCRjUxOF9VQVJUMV9QT1JURgorCXByb21wdCAiUFdNIFRyaXAgQiBQaW4iCisJZGVmYXVsdCBCRjUxOF9QV01fVFJJUEJfUEcxMAogCWhlbHAKLQkgIFNlbGVjdCBQT1JUIHVzZWQgZm9yIFVBUlQxLiBTZWUgSGFyZHdhcmUgUmVmZXJlbmNlIE1hbnVhbAorCSAgU2VsZWN0IHRoZSBwaW4gdXNlZCBmb3IgUFdNX1RSSVBCLgogCi1jb25maWcgQkY1MThfVUFSVDFfUE9SVEYKLQlib29sICJQT1JUIEYiCi0JaGVscAotCSAgUE9SVCBGCisJICBTZWUgdGhlIEhhcmR3YXJlIFJlZmVyZW5jZSBNYW51YWwgZm9yIG1vcmUgZGV0YWlscy4KIAotY29uZmlnIEJGNTE4X1VBUlQxX1BPUlRHCi0JYm9vbCAiUE9SVCBHIgorY29uZmlnIEJGNTE4X1BXTV9UUklQQl9QRzEwCisJYm9vbCAiUEcxMCIKK2NvbmZpZyBCRjUxOF9QV01fVFJJUEJfUEcxNAorCWJvb2wgIlBHMTQiCitlbmRjaG9pY2UKKworY2hvaWNlCisJcHJvbXB0ICJQUEkgLyBUaW1lciBQaW5zIgorCWRlZmF1bHQgQkY1MThfUFBJX1RNUl9QRzUKIAloZWxwCi0JICBQT1JUIEcKKwkgIFNlbGVjdCBwaW5zIHVzZWQgZm9yIFBQSS9UaW1lcjoKKwkgICAgUFBJQ0xLIFBQSUZTMSBQUElGUzIKKwkgICAgVE1SQ0xLIFRNUjAgVE1SMQorCisJICBTZWUgdGhlIEhhcmR3YXJlIFJlZmVyZW5jZSBNYW51YWwgZm9yIG1vcmUgZGV0YWlscy4KKworY29uZmlnIEJGNTE4X1BQSV9UTVJfUEc1CisJYm9vbCAiUEc1IC0gUEc3IgorCWhlbHAKKwkgIFBHezUsNiw3fSA8LT4ge1BQSUNMSy9UTVJDTEssVE1SMC9QUElGUzEsVE1SMS9QUElGUzJ9CisKK2NvbmZpZyBCRjUxOF9QUElfVE1SX1BHMTIKKwlib29sICJQRzEyIC0gUEcxNCIKKwloZWxwCisJICBQR3sxMiwxMywxNH0gPC0+IHtQUElDTEsvVE1SQ0xLLFRNUjAvUFBJRlMxLFRNUjEvUFBJRlMyfQorCiBlbmRjaG9pY2UKIAogY29tbWVudCAiSHlzdGVyZXNpcy9TY2htaXR0IFRyaWdnZXIgQ29udHJvbCIKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYwppbmRleCBjMGNjYWRjLi5kNzhmYzJjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9lemJyZC5jCkBAIC0xODcsNDMgKzE4NywxNiBAQAogLyogU1BJIGZsYXNoIGNoaXAgKG0yNXA2NCkgKi8KIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BREMpIFwKLQl8fCBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BRENfTU9EVUxFKQotLyogU1BJIEFEQyBjaGlwICovCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkY19jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAxLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19CRklOX01BQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfTU9EVUxFKQotI2lmIGRlZmluZWQoQ09ORklHX05FVF9EU0FfS1NaODg5M00pIFwKLQl8fCBkZWZpbmVkKENPTkZJR19ORVRfRFNBX0tTWjg4OTNNX01PRFVMRSkKLS8qIFNQSSBTV0lUQ0ggQ0hJUCAqLwotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9zd2l0Y2hfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19NTUNfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfU1BJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBtbWNfc3BpX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogfTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3KSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzdfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZDc4NzdfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDE2LAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBhZDc4NzdfcGxhdGZvcm1fZGF0YSBiZmluX2FkNzg3N190c19pbmZvID0gewogCS5tb2RlbAkJCT0gNzg3NywKIAkudnJlZl9kZWxheV91c2Vjcwk9IDUwLAkvKiBpbnRlcm5hbCwgbm8gY2FwYWNpdG9yICovCkBAIC0yMzksMjEgKzIxMiw2IEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCi0JICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfd204NzMxX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaWRldl9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBiZmluX3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKICNpZiBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwKSBcCiAJfHwgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MF9NT0RVTEUpCkBAIC0yNjksMTggKzIyNyw2IEBACiAJfSwKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLQl7Ci0JCS5tb2RhbGlhcyA9ICJiZmluX3NwaV9hZGMiLCAvKiBOYW1lIG9mIHNwaV9kcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCi0JCS5tYXhfc3BlZWRfaHogPSA2MjUwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwotCQkuYnVzX251bSA9IDAsIC8qIEZyYW1ld29yayBidXMgbnVtYmVyICovCi0JCS5jaGlwX3NlbGVjdCA9IDEsIC8qIEZyYW1ld29yayBjaGlwIHNlbGVjdC4gKi8KLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLCAvKiBObyBzcGlfZHJpdmVyIHNwZWNpZmljIGNvbmZpZyAqLwotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZGNfY2hpcF9pbmZvLAotCX0sCi0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fTUFDKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX01BQ19NT0RVTEUpCiAjaWYgZGVmaW5lZChDT05GSUdfTkVUX0RTQV9LU1o4ODkzTSkgXAogCXx8IGRlZmluZWQoQ09ORklHX05FVF9EU0FfS1NaODg5M01fTU9EVUxFKQpAQCAtMjkwLDcgKzIzNiw2IEBACiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gMSwKIAkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9zd2l0Y2hfaW5mbywKIAkJLm1vZGUgPSBTUElfTU9ERV8zLAogCX0sCiAjZW5kaWYKQEAgLTMxNCw3ICsyNTksNiBAQAogCQkubWF4X3NwZWVkX2h6CT0gMTI1MDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtCT0gMCwKIAkJLmNoaXBfc2VsZWN0ICA9IDIsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3N19jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9NT0RVTEUpIFwKQEAgLTMyNCw3ICsyNjgsNiBAQAogCQkubWF4X3NwZWVkX2h6CT0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0JPSAwLAogCQkuY2hpcF9zZWxlY3QgICAgPSA1LAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV93bTg3MzFfY2hpcF9pbmZvLAogCQkubW9kZSA9IFNQSV9NT0RFXzAsCiAJfSwKICNlbmRpZgpAQCAtMzM0LDcgKzI3Nyw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDEsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQpAQCAtMzQzLDcgKzI4NSw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSAxLAotCQkuY29udHJvbGxlcl9kYXRhID0gJmxxMDM1cTFfc3BpX2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAogCX0sCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvdGNtLWJmNTE4LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL3RjbS1iZjUxOC5jCmluZGV4IDUwZmM1YzguLjU1YzEyNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvdGNtLWJmNTE4LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy90Y20tYmY1MTguYwpAQCAtMTM4LDMyICsxMzgsMTYgQEAKIC8qIFNQSSBmbGFzaCBjaGlwIChtMjVwNjQpICovCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2ZsYXNoX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLS8qIFNQSSBBREMgY2hpcCAqLwotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZGNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMSwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDE2LAogfTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgbW1jX3NwaV9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3NykgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3X01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc3X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3ODc3X3BsYXRmb3JtX2RhdGEgYmZpbl9hZDc4NzdfdHNfaW5mbyA9IHsKIAkubW9kZWwJCQk9IDc4NzcsCiAJLnZyZWZfZGVsYXlfdXNlY3MJPSA1MCwJLyogaW50ZXJuYWwsIG5vIGNhcGFjaXRvciAqLwpAQCAtMTc5LDIxICsxNjMsNiBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzEpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX01PRFVMRSkgXAotCSAmJiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9TUEkpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX3dtODczMV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gYmZpbl9zcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MCkgXAogCXx8IGRlZmluZWQoQ09ORklHX01URF9NMjVQODBfTU9EVUxFKQpAQCAtMjA5LDE4ICsxNzgsNiBAQAogCX0sCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgXAotCXx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAiYmZpbl9zcGlfYWRjIiwgLyogTmFtZSBvZiBzcGlfZHJpdmVyIGZvciB0aGlzIGRldmljZSAqLwotCQkubWF4X3NwZWVkX2h6ID0gNjI1MDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLwotCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuICovCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwgLyogTm8gc3BpX2RyaXZlciBzcGVjaWZpYyBjb25maWcgKi8KLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWRjX2NoaXBfaW5mbywKLQl9LAotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19NTUNfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfU1BJX01PRFVMRSkKIAl7CiAJCS5tb2RhbGlhcyA9ICJtbWNfc3BpIiwKQEAgLTIzOSw3ICsxOTYsNiBAQAogCQkubWF4X3NwZWVkX2h6CT0gMTI1MDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtCT0gMCwKIAkJLmNoaXBfc2VsZWN0ICA9IDIsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3N19jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9NT0RVTEUpIFwKQEAgLTI0OSw3ICsyMDUsNiBAQAogCQkubWF4X3NwZWVkX2h6CT0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0JPSAwLAogCQkuY2hpcF9zZWxlY3QgICAgPSA1LAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV93bTg3MzFfY2hpcF9pbmZvLAogCQkubW9kZSA9IFNQSV9NT0RFXzAsCiAJfSwKICNlbmRpZgpAQCAtMjU5LDcgKzIxNCw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDEsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQpAQCAtMjY4LDcgKzIyMiw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSAxLAotCQkuY29udHJvbGxlcl9kYXRhID0gJmxxMDM1cTFfc3BpX2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAogCX0sCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKaW5kZXggZDJmMDc2Zi4uNTYzODNmNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTExLDEwICsxMSw5IEBACiAgKi8KIAogLyogVGhpcyBmaWxlIHNob3VsZCBiZSB1cCB0byBkYXRlIHdpdGg6Ci0gKiAgLSBSZXZpc2lvbiBFLCAwMS8yNi8yMDEwOyBBRFNQLUJGNTEyL0JGNTE0L0JGNTE2L0JGNTE4IEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKKyAqICAtIFJldmlzaW9uIEYsIDA1LzIzLzIwMTE7IEFEU1AtQkY1MTIvQkY1MTQvQkY1MTYvQkY1MTggQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAogICovCiAKLS8qIFdlIHBsYW4gb24gbm90IHN1cHBvcnRpbmcgMC4wIHNpbGljb24sIGJ1dCAwLjEgaXNuJ3Qgb3V0IHlldCAtIHNvcnJ5ICovCiAjaWYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAwCiAjIGVycm9yIHdpbGwgbm90IHdvcmsgb24gQkY1MTggc2lsaWNvbiB2ZXJzaW9uCiAjZW5kaWYKQEAgLTc3LDE5ICs3NiwyOSBAQAogLyogRmFsc2UgSGFyZHdhcmUgRXJyb3Igd2hlbiBSRVRJIFBvaW50cyB0byBJbnZhbGlkIE1lbW9yeSAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDYxICgxKQogLyogU3luY2hyb25pemF0aW9uIFByb2JsZW0gYXQgU3RhcnR1cCBNYXkgQ2F1c2UgU1BPUlQgVHJhbnNtaXQgQ2hhbm5lbHMgdG8gTWlzYWxpZ24gKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2MiAoMSkKLS8qIFBMTCBMYXRjaGVzIEluY29ycmVjdCBTZXR0aW5ncyBEdXJpbmcgUmVzZXQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2OSAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2MiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogSW5jb3JyZWN0IERlZmF1bHQgTVNFTCBWYWx1ZSBpbiBQTExfQ1RMICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0NzIgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKIC8qIEludGVycnVwdGVkIFNQT1JUIFJlY2VpdmUgRGF0YSBSZWdpc3RlciBSZWFkIFJlc3VsdHMgSW4gVW5kZXJmbG93IHdoZW4gU0xFTiA+IDE1ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzMgKDEpCiAvKiBURVNUU0VUIEluc3RydWN0aW9uIENhbm5vdCBCZSBJbnRlcnJ1cHRlZCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDc3ICgxKQogLyogUmVhZHMgb2YgSVRFU1RfQ09NTUFORCBhbmQgSVRFU1RfREFUQSBSZWdpc3RlcnMgQ2F1c2UgQ2FjaGUgQ29ycnVwdGlvbiAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDgxICgxKQotLyogSUZMVVNIIHN1Y2tzIGF0IGxpZmUgKi8KKy8qIFBMTCBMYXRjaGVzIEluY29ycmVjdCBTZXR0aW5ncyBEdXJpbmcgUmVzZXQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ4MiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogUExMX0NUTCBDaGFuZ2UgVXNpbmcgYmZyb21fU3lzQ29udHJvbCgpIENhbiBSZXN1bHQgaW4gUHJvY2Vzc29yIE92ZXJjbG9ja2luZyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDg1IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBTUEkgTWFzdGVyIEJvb3QgQ2FuIEZhaWwgVW5kZXIgQ2VydGFpbiBDb25kaXRpb25zICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0OTAgKDEpCisvKiBJbnN0cnVjdGlvbiBNZW1vcnkgU3RhbGxzIENhbiBDYXVzZSBJRkxVU0ggdG8gRmFpbCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDkxICgxKQorLyogRVhDUFQgSW5zdHJ1Y3Rpb24gTWF5IEJlIExvc3QgSWYgTk1JIEhhcHBlbnMgU2ltdWx0YW5lb3VzbHkgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ5NCAoMSkKKy8qIENOVF9DT01NQU5EIEZ1bmN0aW9uYWxpdHkgRGVwZW5kcyBvbiBDTlRfSU1BU0sgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDk4ICgxKQorLyogUlhTIEJpdCBpbiBTUElfU1RBVCBNYXkgQmVjb21lIFN0dWNrIEluIFJYIERNQSBNb2RlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNTAxICgxKQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDA5OSAoMCkKQEAgLTE1Nyw2ICsxNjYsNSBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDc0ICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDc1ICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDgwICgwKQotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDg1ICgwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKaW5kZXggY2Q4NGE1Ni4uYjNiODA2ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKQEAgLTgxLDkgKzgxLDE1IEBACiAjZGVmaW5lIFBfUFBJMF9EMTQJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjE0KSB8IFBfRlVOQ1QoMSkpCiAjZGVmaW5lIFBfUFBJMF9EMTUJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjE1KSB8IFBfRlVOQ1QoMSkpCiAKKyNpZm5kZWYgQ09ORklHX0JGNTE4X1BQSV9UTVJfUEcxMgorI2RlZmluZSBQX1BQSTBfQ0xLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc1KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9GUzEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzYpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0ZTMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNykgfCBQX0ZVTkNUKDEpKQorI2Vsc2UKICNkZWZpbmUgUF9QUEkwX0NMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTIpIHwgUF9GVU5DVCgxKSkKICNkZWZpbmUgUF9QUEkwX0ZTMQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTMpIHwgUF9GVU5DVCgxKSkKICNkZWZpbmUgUF9QUEkwX0ZTMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTQpIHwgUF9GVU5DVCgxKSkKKyNlbmRpZgogI2RlZmluZSBQX1BQSTBfRlMzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxNSkgfCBQX0ZVTkNUKDEpKQogCiAvKiBTUEkgUG9ydCBNdXggKi8KQEAgLTEzOSw5ICsxNDUsMTUgQEAKICNkZWZpbmUgUF9VQVJUMV9SWAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BINykgfCBQX0ZVTkNUKDEpKQogCiAvKiBUaW1lciAqLworI2lmbmRlZiBDT05GSUdfQkY1MThfUFBJX1RNUl9QRzEyCiAjZGVmaW5lIFBfVE1SQ0xLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc1KSB8IFBfRlVOQ1QoMikpCiAjZGVmaW5lIFBfVE1SMAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzYpIHwgUF9GVU5DVCgyKSkKICNkZWZpbmUgUF9UTVIxCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNykgfCBQX0ZVTkNUKDIpKQorI2Vsc2UKKyNkZWZpbmUgUF9UTVJDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEyKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfVE1SMAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEzKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfVE1SMQkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzE0KSB8IFBfRlVOQ1QoMikpCisjZW5kaWYKICNkZWZpbmUgUF9UTVIyCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGOSkgfCBQX0ZVTkNUKDIpKQogI2RlZmluZSBQX1RNUjMJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMCkgfCBQX0ZVTkNUKDIpKQogI2RlZmluZSBQX1RNUjQJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc5KSB8IFBfRlVOQ1QoMikpCkBAIC0xNTgsMjMgKzE3MCwzMyBAQAogI2RlZmluZSBQX1RXSTBfU0RBCShQX0RPTlRDQVJFKQogCiAvKiBQV00gKi8KLSNkZWZpbmUgUF9QV00wX0FICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMSkgfCBQX0ZVTkNUKDIpKQotI2RlZmluZSBQX1BXTTBfQUwJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYyKSB8IFBfRlVOQ1QoMikpCi0jZGVmaW5lIFBfUFdNMF9CSAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjMpIHwgUF9GVU5DVCgyKSkKLSNkZWZpbmUgUF9QV00wX0JMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNCkgfCBQX0ZVTkNUKDIpKQotI2RlZmluZSBQX1BXTTBfQ0gJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY1KSB8IFBfRlVOQ1QoMikpCi0jZGVmaW5lIFBfUFdNMF9DTAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjYpIHwgUF9GVU5DVCgyKSkKLSNkZWZpbmUgUF9QV00wX1NZTkMJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY3KSB8IFBfRlVOQ1QoMikpCisjaWZuZGVmIENPTkZJR19CRjUxOF9QV01fUE9SVEZfUE9SVEcKKyNkZWZpbmUgUF9QV01fQUgJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNX0FMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMikgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTV9CSAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjMpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV01fQkwJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY0KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNX0NICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNSkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTV9DTAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjYpIHwgUF9GVU5DVCgyKSkKKyNlbHNlCisjZGVmaW5lIFBfUFdNX0FICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTEpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV01fQUwJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMikgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTV9CSAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEzKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNX0JMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTQpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV01fQ0gJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNX0NMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMikgfCBQX0ZVTkNUKDIpKQorI2VuZGlmCiAKLSNkZWZpbmUgUF9QV00xX0FICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTEpIHwgUF9GVU5DVCgyKSkKLSNkZWZpbmUgUF9QV00xX0FMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTIpIHwgUF9GVU5DVCgyKSkKLSNkZWZpbmUgUF9QV00xX0JICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTMpIHwgUF9GVU5DVCgyKSkKLSNkZWZpbmUgUF9QV00xX0JMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTQpIHwgUF9GVU5DVCgyKSkKLSNkZWZpbmUgUF9QV00xX0NICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMSkgfCBQX0ZVTkNUKDIpKQotI2RlZmluZSBQX1BXTTFfQ0wJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcyKSB8IFBfRlVOQ1QoMikpCi0jZGVmaW5lIFBfUFdNMV9TWU5DCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTUpIHwgUF9GVU5DVCgyKSkKKyNpZm5kZWYgQ09ORklHX0JGNTE4X1BXTV9TWU5DX1BGMTUKKyNkZWZpbmUgUF9QV01fU1lOQwkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjcpIHwgUF9GVU5DVCgyKSkKKyNlbHNlCisjZGVmaW5lIFBfUFdNX1NZTkMJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxNSkgfCBQX0ZVTkNUKDIpKQorI2VuZGlmCiAKKyNpZm5kZWYgQ09ORklHX0JGNTE4X1BXTV9UUklQQl9QRzE0CisjZGVmaW5lIFBfUFdNX1RSSVBCCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTApIHwgUF9GVU5DVCgyKSkKKyNlbHNlCiAjZGVmaW5lIFBfUFdNX1RSSVBCCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTQpIHwgUF9GVU5DVCgyKSkKKyNlbmRpZgogCiAvKiBSU0kgKi8KICNkZWZpbmUgUF9SU0lfREFUQTAJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEczKSB8IFBfRlVOQ1QoMSkpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2FkNzE2MGV2YWwuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvYWQ3MTYwZXZhbC5jCmluZGV4IGNjYWI0YzYuLmMwNGRmNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvYWQ3MTYwZXZhbC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvYWQ3MTYwZXZhbC5jCkBAIC0yNjUsMjkgKzI2NSwxMiBAQAogLyogU1BJIGZsYXNoIGNoaXAgKG0yNXA2NCkgKi8KIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgXAotCXx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBhZDE4MzZfc3BpX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwICBtbWNfc3BpX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogfTsKICNlbmRpZgogCkBAIC0zMjgsNyArMzExLDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gNCwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZhZDE4MzZfc3BpX2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCkBAIC0zNDcsNyArMzI5LDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gMSwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKIH07CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMKaW5kZXggYzlkNmRjOC4uNjQwMDM0MSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYwpAQCAtMzU0LDQwICszNTQsMTYgQEAKIC8qIFNQSSBmbGFzaCBjaGlwIChtMjVwNjQpICovCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2ZsYXNoX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLS8qIFNQSSBBREMgY2hpcCAqLwotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZGNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMSwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDE2LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1gpIFwKLQl8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWF9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgYWQxODM2X3NwaV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCiB9OwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19NTUNfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfU1BJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCAgbW1jX3NwaV9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3NykgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3X01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc3X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3ODc3X3BsYXRmb3JtX2RhdGEgYmZpbl9hZDc4NzdfdHNfaW5mbyA9IHsKIAkubW9kZWwJCQk9IDc4NzcsCiAJLnZyZWZfZGVsYXlfdXNlY3MJPSA1MCwJLyogaW50ZXJuYWwsIG5vIGNhcGFjaXRvciAqLwpAQCAtNDAzLDIxICszNzksNiBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzEpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX01PRFVMRSkgXAotCSAmJiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9TUEkpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX3dtODczMV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gYmZpbl9zcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MCkgXAogCXx8IGRlZmluZWQoQ09ORklHX01URF9NMjVQODBfTU9EVUxFKQpAQCAtNDMzLDE4ICszOTQsNiBAQAogCX0sCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgXAotCXx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAiYmZpbl9zcGlfYWRjIiwgLyogTmFtZSBvZiBzcGlfZHJpdmVyIGZvciB0aGlzIGRldmljZSAqLwotCQkubWF4X3NwZWVkX2h6ID0gNjI1MDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLwotCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuICovCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwgLyogTm8gc3BpX2RyaXZlciBzcGVjaWZpYyBjb25maWcgKi8KLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWRjX2NoaXBfaW5mbywKLQl9LAotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgXAogCXx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKIAl7CkBAIC00NTIsNyArNDAxLDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gNCwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZhZDE4MzZfc3BpX2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCkBAIC00NzMsNyArNDIxLDYgQEAKIAkJLm1heF9zcGVlZF9oegk9IDEyNTAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bQk9IDAsCiAJCS5jaGlwX3NlbGVjdCAgPSAyLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzdfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCkBAIC00ODMsNyArNDMwLDYgQEAKIAkJLm1heF9zcGVlZF9oegk9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtCT0gMCwKIAkJLmNoaXBfc2VsZWN0ICAgID0gNSwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfd204NzMxX2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfTU9ERV8wLAogCX0sCiAjZW5kaWYKQEAgLTQ5Myw3ICs0MzksNiBAQAogCQkubWF4X3NwZWVkX2h6ID0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSAxLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaWRldl9jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYwppbmRleCBiNzEwMWFhLi42ZGJiMWI0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCkBAIC0yNTMsMzIgKzI1MywxNiBAQAogLyogU1BJIGZsYXNoIGNoaXAgKHNzdDI1d2YwNDApICovCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2ZsYXNoX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLS8qIFNQSSBBREMgY2hpcCAqLwotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZGNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMSwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDE2LAogfTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgbW1jX3NwaV9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3NykgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3X01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc3X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3ODc3X3BsYXRmb3JtX2RhdGEgYmZpbl9hZDc4NzdfdHNfaW5mbyA9IHsKIAkubW9kZWwJCQk9IDc4NzcsCiAJLnZyZWZfZGVsYXlfdXNlY3MJPSA1MCwJLyogaW50ZXJuYWwsIG5vIGNhcGFjaXRvciAqLwpAQCAtMzExLDM1ICsyOTUsNiBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSV9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3OV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCi0JICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfd204NzMxX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaWRldl9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSkgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBscTAzNXExX3NwaV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBiZmluX3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKICNpZiBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwKSBcCiAJfHwgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MF9NT0RVTEUpCkBAIC0zNTUsMTggKzMxMCw2IEBACiAJfSwKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLQl7Ci0JCS5tb2RhbGlhcyA9ICJiZmluX3NwaV9hZGMiLCAvKiBOYW1lIG9mIHNwaV9kcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCi0JCS5tYXhfc3BlZWRfaHogPSA2MjUwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwotCQkuYnVzX251bSA9IDAsIC8qIEZyYW1ld29yayBidXMgbnVtYmVyICovCi0JCS5jaGlwX3NlbGVjdCA9IDEsIC8qIEZyYW1ld29yayBjaGlwIHNlbGVjdC4gKi8KLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLCAvKiBObyBzcGlfZHJpdmVyIHNwZWNpZmljIGNvbmZpZyAqLwotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZGNfY2hpcF9pbmZvLAotCX0sCi0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQogCXsKIAkJLm1vZGFsaWFzID0gIm1tY19zcGkiLApAQCAtMzg1LDcgKzMyOCw2IEBACiAJCS5tYXhfc3BlZWRfaHoJPSAxMjUwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0JPSAwLAogCQkuY2hpcF9zZWxlY3QgID0gMiwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc3X2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSV9NT0RVTEUpCkBAIC0zOTYsNyArMzM4LDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDUwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gNSwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc5X2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAogCX0sCiAjZW5kaWYKQEAgLTQwNyw3ICszNDgsNiBAQAogCQkubWF4X3NwZWVkX2h6CT0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0JPSAwLAogCQkuY2hpcF9zZWxlY3QgICAgPSA1LAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV93bTg3MzFfY2hpcF9pbmZvLAogCQkubW9kZSA9IFNQSV9NT0RFXzAsCiAJfSwKICNlbmRpZgpAQCAtNDE3LDcgKzM1Nyw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDEsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQpAQCAtNDI2LDcgKzM2NSw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSAxLAotCQkuY29udHJvbGxlcl9kYXRhID0gJmxxMDM1cTFfc3BpX2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAogCX0sCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYwppbmRleCBlNjdhYzc3Li40ZTlkYzljIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jCkBAIC00MDksNiArNDA5LDkgQEAKIAkJLmVuZCA9IDB4MjAzMDAwMDAgKyAweDEwMCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwgeworCQkuc3RhcnQgPSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0JVUywKKwl9LCB7CiAJCS5zdGFydCA9IElSUV9QRjcsCiAJCS5lbmQgPSBJUlFfUEY3LAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0hJR0hMRVZFTCwKQEAgLTQ0OCw0MCArNDUxLDE2IEBACiAvKiBTUEkgZmxhc2ggY2hpcCAobTI1cDY0KSAqLwogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9mbGFzaF9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgXAotCXx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0vKiBTUEkgQURDIGNoaXAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWRjX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDEsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1hfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGFkMTgzNl9zcGlfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDE2LAogfTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgIG1tY19zcGlfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzcpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3N19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3N19jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzg3N19wbGF0Zm9ybV9kYXRhIGJmaW5fYWQ3ODc3X3RzX2luZm8gPSB7CiAJLm1vZGVsCQkJPSA3ODc3LAogCS52cmVmX2RlbGF5X3VzZWNzCT0gNTAsCS8qIGludGVybmFsLCBubyBjYXBhY2l0b3IgKi8KQEAgLTUxMywyMCArNDkyLDYgQEAKIH07CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUEkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUElfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZDc4NzlfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDE2LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0kyUykgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0kyU19NT0RVTEUpIHx8IFwKIAlkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfVERNKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfVERNX01PRFVMRSkKIApAQCAtNTc0LDkgKzUzOSwyNSBAQAogCUJGSU5fU05EX1JFUygwKSwKIAlCRklOX1NORF9SRVMoMSksCiB9OworI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fcGNtID0gewotCS5uYW1lID0gImJmaW4tcGNtLWF1ZGlvIiwKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfSTJTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfSTJTX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faTJzX3BjbSA9IHsKKwkubmFtZSA9ICJiZmluLWkycy1wY20tYXVkaW8iLAorCS5pZCA9IC0xLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1RETSkgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1RETV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3RkbV9wY20gPSB7CisJLm5hbWUgPSAiYmZpbi10ZG0tcGNtLWF1ZGlvIiwKKwkuaWQgPSAtMSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9BQzk3KSB8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfQUM5N19NT0RVTEUpCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2FjOTdfcGNtID0geworCS5uYW1lID0gImJmaW4tYWM5Ny1wY20tYXVkaW8iLAogCS5pZCA9IC0xLAogfTsKICNlbmRpZgpAQCAtNjA1LDEzICs1ODYsNiBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGxxMDM1cTFfc3BpX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYQk9IDAsCi0JLmJpdHNfcGVyX3dvcmQJPSA4LAotfTsKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGJmaW5fc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0gewogI2lmIGRlZmluZWQoQ09ORklHX01URF9NMjVQODApIFwKIAl8fCBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwX01PRFVMRSkKQEAgLTYyNywxOCArNjAxLDYgQEAKIAl9LAogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BREMpIFwKLQl8fCBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BRENfTU9EVUxFKQotCXsKLQkJLm1vZGFsaWFzID0gImJmaW5fc3BpX2FkYyIsIC8qIE5hbWUgb2Ygc3BpX2RyaXZlciBmb3IgdGhpcyBkZXZpY2UgKi8KLQkJLm1heF9zcGVlZF9oeiA9IDYyNTAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCi0JCS5idXNfbnVtID0gMCwgLyogRnJhbWV3b3JrIGJ1cyBudW1iZXIgKi8KLQkJLmNoaXBfc2VsZWN0ID0gMSwgLyogRnJhbWV3b3JrIGNoaXAgc2VsZWN0LiAqLwotCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsIC8qIE5vIHNwaV9kcml2ZXIgc3BlY2lmaWMgY29uZmlnICovCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkY19jaGlwX2luZm8sCi0JfSwKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1gpIFwKIAl8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWF9NT0RVTEUpCiAJewpAQCAtNjQ3LDcgKzYwOSw2IEBACiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gNCwKIAkJLnBsYXRmb3JtX2RhdGEgPSAiYWQxODM2IiwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZhZDE4MzZfc3BpX2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfTU9ERV8zLAogCX0sCiAjZW5kaWYKQEAgLTY3MCw3ICs2MzEsNiBAQAogCQkubWF4X3NwZWVkX2h6CT0gMTI1MDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtCT0gMCwKIAkJLmNoaXBfc2VsZWN0ICA9IDIsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3N19jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUEkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUElfTU9EVUxFKQpAQCAtNjgxLDcgKzY0MSw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSA1MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDMsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3OV9jaGlwX2luZm8sCiAJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKIAl9LAogI2VuZGlmCkBAIC02OTEsNyArNjUwLDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gMSwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTEpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMV9NT0RVTEUpCkBAIC03MDAsNyArNjU4LDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDIwMDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDcsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmbHEwMzVxMV9zcGlfY2hpcF9pbmZvLAogCQkubW9kZSA9IFNQSV9DUEhBIHwgU1BJX0NQT0wsCiAJfSwKICNlbmRpZgpAQCAtMTI3Niw5ICsxMjMzLDE2IEBACiAJJmV6a2l0X2ZsYXNoX2RldmljZSwKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0kyUykgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0kyU19NT0RVTEUpIHx8IFwKLQlkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfVERNKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfVERNX01PRFVMRSkKLQkmYmZpbl9wY20sCisjaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0kyUykgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0kyU19NT0RVTEUpCisJJmJmaW5faTJzX3BjbSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1RETSkgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1RETV9NT0RVTEUpCisJJmJmaW5fdGRtX3BjbSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0FDOTcpIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9BQzk3X01PRFVMRSkKKwkmYmZpbl9hYzk3X3BjbSwKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0kyUykgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0kyU19NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL3RsbDY1MjdtLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL3RsbDY1MjdtLmMKaW5kZXggMThkMzAzZC4uZWM0YmM3NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy90bGw2NTI3bS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvdGxsNjUyN20uYwpAQCAtMzE0LDI5ICszMTQsMTIgQEAKIC8qIFNQSSBmbGFzaCBjaGlwIChtMjVwNjQpICovCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2ZsYXNoX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLS8qIFNQSSBBREMgY2hpcCAqLwotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZGNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLS8qCi0gKiB0bGw2NTI3bSBWMS4wIGRvZXMgbm90IHN1cHBvcnQgbmF0aXZlIHNwaSBzbGF2ZSBzZWxlY3RzCi0gKiBoZW5jZSBETUEgbW9kZSB3aWxsIG5vdCBiZSB1c2VmdWwgc2luY2UgdGhlIEFEQyBuZWVkcwotICogQ1MgdG8gdG9nZ2xlIGZvciBlYWNoIHNhbXBsZSBhbmQgY3NfY2hhbmdlX3Blcl93b3JkCi0gKiBzZWVtcyB0byBiZSByZW1vdmVkIGZyb20gc3BpX2JmaW41eHguYwotICovCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwICBtbWNfc3BpX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogfTsKICNlbmRpZgogCkBAIC0zNTksMjEgKzM0Miw2IEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSV9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3OV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfSTJTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfSTJTX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faTJzID0gewogCS5uYW1lID0gImJmaW4taTJzIiwKQEAgLTM4MiwyNCArMzUwLDcgQEAKIH07CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSkgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBscTAzNXExX3NwaV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEJPSAwLAotCS5iaXRzX3Blcl93b3JkCT0gOCwKLX07Ci0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX0dQSU9fTUNQMjNTMDgpIHx8IGRlZmluZWQoQ09ORklHX0dQSU9fTUNQMjNTMDhfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9tY3AyM3MwOF9zeXNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX21jcDIzczA4X3Vzcl9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0KICNpbmNsdWRlIDxsaW51eC9zcGkvbWNwMjNzMDguaD4KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWNwMjNzMDhfcGxhdGZvcm1fZGF0YSBiZmluX21jcDIzczA4X3N5c19ncGlvX2luZm8gPSB7CiAJLmNoaXBbMF0uaXNfcHJlc2VudCA9IHRydWUsCkBAIC00MjksMjIgKzM4MCw2IEBACiAJfSwKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKQotCXx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAiYmZpbl9zcGlfYWRjIiwKLQkJCQkvKiBOYW1lIG9mIHNwaV9kcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCi0JCS5tYXhfc3BlZWRfaHogPSAxMDAwMDAwMCwKLQkJCQkvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCi0JCS5idXNfbnVtID0gMCwgLyogRnJhbWV3b3JrIGJ1cyBudW1iZXIgKi8KLQkJLmNoaXBfc2VsZWN0ID0gRVhQX0dQSU9fU1BJU0VMX0JBU0UgKyAweDA0ICsgTUFYX0NUUkxfQ1MsCi0JCSAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuICovCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwgLyogTm8gc3BpX2RyaXZlciBzcGVjaWZpYyBjb25maWcgKi8KLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWRjX2NoaXBfaW5mbywKLQkJLm1vZGUgPSBTUElfTU9ERV8wLAotCX0sCi0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQogCXsKIAkJLm1vZGFsaWFzID0gIm1tY19zcGkiLApAQCAtNDcwLDcgKzQwNSw2IEBACiAJCQkJCS8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSBFWFBfR1BJT19TUElTRUxfQkFTRSArIDB4MDcgKyBNQVhfQ1RSTF9DUywKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc5X2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAogCX0sCiAjZW5kaWYKQEAgLTQ4Miw3ICs0MTYsNiBAQAogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IEVYUF9HUElPX1NQSVNFTF9CQVNFICsgMHgwMyArIE1BWF9DVFJMX0NTLAogCQkubW9kZSA9IFNQSV9DUEhBIHwgU1BJX0NQT0wsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQpAQCAtNDkxLDcgKzQyNCw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwKIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSBFWFBfR1BJT19TUElTRUxfQkFTRSArIDB4MDYgKyBNQVhfQ1RSTF9DUywKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZscTAzNXExX3NwaV9jaGlwX2luZm8sCiAJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKIAl9LAogI2VuZGlmCkBAIC01MDIsNyArNDM0LDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDUwMDAwMDAsIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSBFWFBfR1BJT19TUElTRUxfQkFTRSArIDB4MDEgKyBNQVhfQ1RSTF9DUywKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfbWNwMjNzMDhfc3lzX2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAogCX0sCiAJewpAQCAtNTExLDcgKzQ0Miw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSA1MDAwMDAwLCAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gRVhQX0dQSU9fU1BJU0VMX0JBU0UgKyAweDAyICsgTUFYX0NUUkxfQ1MsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX21jcDIzczA4X3Vzcl9jaGlwX2luZm8sCiAJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKIAl9LAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCmluZGV4IGU2NmE3ZTguLjY4ODQ3MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC0xMSw4ICsxMSw4IEBACiAgKi8KIAogLyogVGhpcyBmaWxlIHNob3VsZCBiZSB1cCB0byBkYXRlIHdpdGg6Ci0gKiAgLSBSZXZpc2lvbiBFLCAwMy8xNS8yMDEwOyBBRFNQLUJGNTI2IEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKLSAqICAtIFJldmlzaW9uIEgsIDA0LzI5LzIwMTA7IEFEU1AtQkY1MjcgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAorICogIC0gUmV2aXNpb24gRiwgMDUvMjMvMjAxMTsgQURTUC1CRjUyNiBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CisgKiAgLSBSZXZpc2lvbiBJLCAwNS8yMy8yMDExOyBBRFNQLUJGNTI3IEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKICAqLwogCiAjaWZuZGVmIF9NQUNIX0FOT01BTFlfSF8KQEAgLTU3LDcgKzU3LDcgQEAKIC8qIEluY29ycmVjdCBBY2Nlc3Mgb2YgT1RQX1NUQVRVUyBEdXJpbmcgb3RwX3dyaXRlKCkgRnVuY3Rpb24gKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMyOCAoX0FOT01BTFlfQkY1MjcoPCAyKSkKIC8qIEhvc3QgRE1BIEJvb3QgTW9kZXMgQXJlIE5vdCBGdW5jdGlvbmFsICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzMzAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMzMCAoX0FOT01BTFlfQkY1MjcoPCAyKSkKIC8qIERpc2FsbG93ZWQgQ29uZmlndXJhdGlvbiBQcmV2ZW50cyBTdWJzZXF1ZW50IEFsbG93ZWQgQ29uZmlndXJhdGlvbiBvbiBIb3N0IERNQSBQb3J0ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMzcgKF9BTk9NQUxZX0JGNTI3KDwgMikpCiAvKiBFdGhlcm5ldCBNQUMgTURJTyBSZWFkcyBEbyBOb3QgTWVldCBJRUVFIFNwZWNpZmljYXRpb24gKi8KQEAgLTEzNSw3ICsxMzUsNyBAQAogLyogSW5jb3JyZWN0IERlZmF1bHQgSW50ZXJuYWwgVm9sdGFnZSBSZWd1bGF0b3IgU2V0dGluZyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDEwIChfQU5PTUFMWV9CRjUyNyg8IDIpKQogLyogYmZyb21fU3lzQ29udHJvbCgpIEZpcm13YXJlIEZ1bmN0aW9uIENhbm5vdCBiZSBVc2VkIHRvIEVudGVyIFBvd2VyIFNhdmluZyBNb2RlcyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDExIChfQU5PTUFMWV9CRjUyNl9CRjUyNyg8IDEsIDwgMikpCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTEgKF9BTk9NQUxZX0JGNTI2KDwgMSkpCiAvKiBPVFBfQ0hFQ0tfRk9SX1BSRVZfV1JJVEUgQml0IGlzIE5vdCBGdW5jdGlvbmFsIGluIGJmcm9tX090cFdyaXRlKCkgQVBJICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTQgKF9BTk9NQUxZX0JGNTI2X0JGNTI3KDwgMSwgPCAyKSkKIC8qIERFQjJfVVJHRU5UIEJpdCBOb3QgRnVuY3Rpb25hbCAqLwpAQCAtMTgxLDExICsxODEsMTEgQEAKIC8qIElGTFVTSCBJbnN0cnVjdGlvbiBhdCBFbmQgb2YgSGFyZHdhcmUgTG9vcCBDYXVzZXMgSW5maW5pdGUgU3RhbGwgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0MyAoMSkKIC8qIFRoZSBXVVJFU0VUIEJpdCBpbiB0aGUgU1lTQ1IgUmVnaXN0ZXIgaXMgbm90IEZ1bmN0aW9uYWwgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0NSAoMSkKLS8qIFVTQiBETUEgTW9kZSAxIFNob3J0IFBhY2tldCBEYXRhIENvcnJ1cHRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0NSAoX0FOT01BTFlfQkY1MjcoPj0gMCkpCisvKiBVU0IgRE1BIFNob3J0IFBhY2tldCBEYXRhIENvcnJ1cHRpb24gKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ1MCAoMSkKIC8qIEJDT0RFX1FVSUNLQk9PVCwgQkNPREVfQUxMQk9PVCwgYW5kIEJDT0RFX0ZVTExCT09UIFNldHRpbmdzIGluIFNZU0NSIFJlZ2lzdGVyIE5vdCBGdW5jdGlvbmFsICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0NTEgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NTEgKF9BTk9NQUxZX0JGNTI3KD49IDApKQogLyogSW5jb3JyZWN0IERlZmF1bHQgSHlzdGVyZXNpcyBTZXR0aW5nIGZvciBSRVNFVCwgTk1JLCBhbmQgQk1PREUgU2lnbmFscyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDUyIChfQU5PTUFMWV9CRjUyNl9CRjUyNyg8IDEsID49IDApKQogLyogVVNCIFJlY2VpdmUgSW50ZXJydXB0IElzIE5vdCBHZW5lcmF0ZWQgaW4gRE1BIE1vZGUgMSAqLwpAQCAtMTk4LDE5ICsxOTgsMTkgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2MSAoMSkKIC8qIFN5bmNocm9uaXphdGlvbiBQcm9ibGVtIGF0IFN0YXJ0dXAgTWF5IENhdXNlIFNQT1JUIFRyYW5zbWl0IENoYW5uZWxzIHRvIE1pc2FsaWduICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NjIgKDEpCi0vKiBVU0IgUnggRE1BIGhhbmcgKi8KKy8qIFVTQiBSeCBETUEgSGFuZyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDY1ICgxKQogLyogVHhQa3RSZHkgQml0IE5vdCBTZXQgZm9yIFRyYW5zbWl0IEVuZHBvaW50IFdoZW4gQ29yZSBhbmQgRE1BIEFjY2VzcyBVU0IgRW5kcG9pbnQgRklGT3MgU2ltdWx0YW5lb3VzbHkgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2NiAoMSkKLS8qIFBvc3NpYmxlIFJYIGRhdGEgY29ycnVwdGlvbiB3aGVuIGNvbnRyb2wgJiBkYXRhIEVQIEZJRk9zIGFyZSBhY2Nlc3NlZCB2aWEgdGhlIGNvcmUgKi8KKy8qIFBvc3NpYmxlIFVTQiBSWCBEYXRhIENvcnJ1cHRpb24gV2hlbiBDb250cm9sICYgRGF0YSBFUCBGSUZPcyBhcmUgQWNjZXNzZWQgdmlhIHRoZSBDb3JlICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NjcgKDEpCiAvKiBQTEwgTGF0Y2hlcyBJbmNvcnJlY3QgU2V0dGluZ3MgRHVyaW5nIFJlc2V0ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NjkgKDEpCiAvKiBJbmNvcnJlY3QgRGVmYXVsdCBNU0VMIFZhbHVlIGluIFBMTF9DVEwgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ3MiAoX0FOT01BTFlfQkY1MjYoPj0gMCkpCi0vKiBJbnRlcnJ1cHRlZCAzMi1CaXQgU1BPUlQgRGF0YSBSZWdpc3RlciBBY2Nlc3MgUmVzdWx0cyBJbiBVbmRlcmZsb3cgKi8KKy8qIEludGVycnVwdGVkIFNQT1JUIFJlY2VpdmUgRGF0YSBSZWdpc3RlciBSZWFkIFJlc3VsdHMgSW4gVW5kZXJmbG93IHdoZW4gU0xFTiA+IDE1ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzMgKDEpCi0vKiBQb3NzaWJsZSBMb2NrdXAgQ29uZGl0aW9uIHdoZW0gTW9kaWZ5aW5nIFBMTCBmcm9tIEV4dGVybmFsIE1lbW9yeSAqLworLyogUG9zc2libGUgTG9ja3VwIENvbmRpdGlvbiB3aGVuIE1vZGlmeWluZyBQTEwgZnJvbSBFeHRlcm5hbCBNZW1vcnkgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ3NSAoMSkKIC8qIFRFU1RTRVQgSW5zdHJ1Y3Rpb24gQ2Fubm90IEJlIEludGVycnVwdGVkICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzcgKDEpCkBAIC0yMTksMTEgKzIxOSwxOSBAQAogLyogUG9zc2libGUgVVNCIERhdGEgQ29ycnVwdGlvbiBXaGVuIE11bHRpcGxlIEVuZHBvaW50cyBBcmUgQWNjZXNzZWQgYnkgdGhlIENvcmUgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ4MyAoMSkKIC8qIFBMTF9DVEwgQ2hhbmdlIFVzaW5nIGJmcm9tX1N5c0NvbnRyb2woKSBDYW4gUmVzdWx0IGluIFByb2Nlc3NvciBPdmVyY2xvY2tpbmcgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ4NSAoX0FOT01BTFlfQkY1MjZfQkY1MjcoPCAyLCA8IDMpKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDg1IChfQU5PTUFMWV9CRjUyNl9CRjUyNyg8IDIsID49IDApKQogLyogVGhlIENPREVDIFplcm8tQ3Jvc3MgRGV0ZWN0IEZlYXR1cmUgaXMgbm90IEZ1bmN0aW9uYWwgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ4NyAoMSkKLS8qIElGTFVTSCBzdWNrcyBhdCBsaWZlICovCisvKiBTUEkgTWFzdGVyIEJvb3QgQ2FuIEZhaWwgVW5kZXIgQ2VydGFpbiBDb25kaXRpb25zICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0OTAgKDEpCisvKiBJbnN0cnVjdGlvbiBNZW1vcnkgU3RhbGxzIENhbiBDYXVzZSBJRkxVU0ggdG8gRmFpbCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDkxICgxKQorLyogRVhDUFQgSW5zdHJ1Y3Rpb24gTWF5IEJlIExvc3QgSWYgTk1JIEhhcHBlbnMgU2ltdWx0YW5lb3VzbHkgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ5NCAoMSkKKy8qIENOVF9DT01NQU5EIEZ1bmN0aW9uYWxpdHkgRGVwZW5kcyBvbiBDTlRfSU1BU0sgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDk4ICgxKQorLyogUlhTIEJpdCBpbiBTUElfU1RBVCBNYXkgQmVjb21lIFN0dWNrIEluIFJYIERNQSBNb2RlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNTAxICgxKQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDA5OSAoMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYwppbmRleCBkNGJmY2VhLi5lYjMyNWVkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jCkBAIC0xNTksMjIgKzE1OSw2IEBACiAvKiBTUEkgZmxhc2ggY2hpcCAobTI1cDY0KSAqLwogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9mbGFzaF9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLS8qIFNQSSBBREMgY2hpcCAqLwotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZGNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMSwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDE2LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1gpIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBhZDE4MzZfc3BpX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKIH07CiAjZW5kaWYKIApAQCAtMTk1LDI0ICsxNzksMTIgQEAKIAl9LAogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BREMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAiYmZpbl9zcGlfYWRjIiwgLyogTmFtZSBvZiBzcGlfZHJpdmVyIGZvciB0aGlzIGRldmljZSAqLwotCQkubWF4X3NwZWVkX2h6ID0gNCwgICAgIC8qIGFjdHVhbCBiYXVkcmF0ZSBpcyBTQ0xLLygyeHNwZWVkX2h6KSAqLwotCQkuYnVzX251bSA9IDEsIC8qIEZyYW1ld29yayBidXMgbnVtYmVyICovCi0JCS5jaGlwX3NlbGVjdCA9IDEsIC8qIEZyYW1ld29yayBjaGlwIHNlbGVjdC4gKi8KLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLCAvKiBObyBzcGlfZHJpdmVyIHNwZWNpZmljIGNvbmZpZyAqLwotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZGNfY2hpcF9pbmZvLAotCX0sCi0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWF9NT0RVTEUpCiAJewogCQkubW9kYWxpYXMgPSAiYWQxODN4IiwKIAkJLm1heF9zcGVlZF9oeiA9IDE2LAogCQkuYnVzX251bSA9IDEsCiAJCS5jaGlwX3NlbGVjdCA9IDQsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmYWQxODM2X3NwaV9jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2JsYWNrc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCmluZGV4IDg3YjVhZjMuLmIwZWM4MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCkBAIC0xMDIsMjEgKzEwMiwxMiBAQAogLyogU1BJIGZsYXNoIGNoaXAgKG0yNXA2NCkgKi8KIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19NTUNfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfU1BJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBtbWNfc3BpX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogfTsKICNlbmRpZgogCkBAIC0xNTEsNyArMTQyLDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gNywKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKIH07CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMKaW5kZXggNGQ1NjA0ZS4uMTRmNTRhMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYwpAQCAtNTksMjkgKzU5LDEyIEBACiAvKiBTUEkgZmxhc2ggY2hpcCAobTI1cDY0KSAqLwogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9mbGFzaF9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQotLyogU1BJIEFEQyBjaGlwICovCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BRENfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZGNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMSwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDE2LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1gpIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBhZDE4MzZfc3BpX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIG1tY19zcGlfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKQEAgLTk5LDI0ICs4MiwxMiBAQAogCX0sCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLQl7Ci0JCS5tb2RhbGlhcyA9ICJiZmluX3NwaV9hZGMiLCAvKiBOYW1lIG9mIHNwaV9kcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCi0JCS5tYXhfc3BlZWRfaHogPSA2MjUwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwotCQkuYnVzX251bSA9IDAsICAgICAgICAgICAgICAgLyogRnJhbWV3b3JrIGJ1cyBudW1iZXIgKi8KLQkJLmNoaXBfc2VsZWN0ID0gMiwgICAgICAgICAgIC8qIEZyYW1ld29yayBjaGlwIHNlbGVjdC4gKi8KLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLCAgICAgIC8qIE5vIHNwaV9kcml2ZXIgc3BlY2lmaWMgY29uZmlnICovCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkY19jaGlwX2luZm8sCi0JfSwKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1gpIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKIAl7CiAJCS5tb2RhbGlhcyA9ICJhZDE4M3giLAogCQkubWF4X3NwZWVkX2h6ID0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSA0LAotCQkuY29udHJvbGxlcl9kYXRhID0gJmFkMTgzNl9zcGlfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jCmluZGV4IGI2N2I5MWQuLmVjZDI4MDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKQEAgLTIxMCwyOSArMjEwLDYgQEAKIC8qIFNQSSBmbGFzaCBjaGlwIChtMjVwNjQpICovCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2ZsYXNoX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BRENfTU9EVUxFKQotLyogU1BJIEFEQyBjaGlwICovCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkY19jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAxLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1hfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGFkMTgzNl9zcGlfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDE2LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogfTsKICNlbmRpZgogCkBAIC0yNTAsMjQgKzIyNywxMiBAQAogCX0sCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLQl7Ci0JCS5tb2RhbGlhcyA9ICJiZmluX3NwaV9hZGMiLCAvKiBOYW1lIG9mIHNwaV9kcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCi0JCS5tYXhfc3BlZWRfaHogPSA2MjUwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwotCQkuYnVzX251bSA9IDAsIC8qIEZyYW1ld29yayBidXMgbnVtYmVyICovCi0JCS5jaGlwX3NlbGVjdCA9IDEsIC8qIEZyYW1ld29yayBjaGlwIHNlbGVjdC4gKi8KLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLCAvKiBObyBzcGlfZHJpdmVyIHNwZWNpZmljIGNvbmZpZyAqLwotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZGNfY2hpcF9pbmZvLAotCX0sCi0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWF9NT0RVTEUpCiAJewogCQkubW9kYWxpYXMgPSAiYWQxODN4IiwKIAkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gNCwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZhZDE4MzZfc3BpX2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCkBAIC0yNzYsNyArMjQxLDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gMSwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKIH07CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvaXAweC5jCmluZGV4IGEzNzdkOGEuLmZiZWU3N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvaXAweC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvaXAweC5jCkBAIC0xMTAsNyArMTEwLDYgQEAKICNpZiBkZWZpbmVkKENPTkZJR19NTUNfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfU1BJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBtbWNfc3BpX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsCQkvKiBpZiAxIC0gYmxvY2shISEgKi8KLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYwppbmRleCA0MzIyNGVmLi45NjRhOGU1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCkBAIC04MCw2ICs4MCw5IEBACiAJCS5lbmQgPSAweDIwMzAwMDAwICsgMHgxMDAsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sIHsKKwkJLnN0YXJ0ID0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9CVVMsCisJfSwgewogCQkuc3RhcnQgPSBJUlFfUEYxMCwKIAkJLmVuZCA9IElSUV9QRjEwLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0hJR0hMRVZFTCwKQEAgLTE3MiwyOSArMTc1LDYgQEAKIC8qIFNQSSBmbGFzaCBjaGlwIChtMjVwNjQpICovCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2ZsYXNoX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BRENfTU9EVUxFKQotLyogU1BJIEFEQyBjaGlwICovCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkY19jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAxLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1hfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGFkMTgzNl9zcGlfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDE2LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogfTsKICNlbmRpZgogCkBAIC0yMjEsNyArMjAxLDYgQEAKIAogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwICBtbWNfc3BpX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogCS5waW9faW50ZXJydXB0ID0gMCwKIH07CiAjZW5kaWYKQEAgLTI0MCwxNyArMjE5LDYgQEAKIAl9LAogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BREMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAiYmZpbl9zcGlfYWRjIiwgLyogTmFtZSBvZiBzcGlfZHJpdmVyIGZvciB0aGlzIGRldmljZSAqLwotCQkubWF4X3NwZWVkX2h6ID0gNjI1MDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLwotCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuICovCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwgLyogTm8gc3BpX2RyaXZlciBzcGVjaWZpYyBjb25maWcgKi8KLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWRjX2NoaXBfaW5mbywKLQl9LAotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1hfTU9EVUxFKQogCXsKIAkJLm1vZGFsaWFzID0gImFkMTgzeCIsCkBAIC0yNTgsNyArMjI2LDYgQEAKIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSA0LAogCQkucGxhdGZvcm1fZGF0YSA9ICJhZDE4MzYiLCAvKiBvbmx5IGluY2x1ZGVzIGNoaXAgbmFtZSBmb3IgdGhlIG1vbWVudCAqLwotCQkuY29udHJvbGxlcl9kYXRhID0gJmFkMTgzNl9zcGlfY2hpcF9pbmZvLAogCQkubW9kZSA9IFNQSV9NT0RFXzMsCiAJfSwKICNlbmRpZgpAQCAtMjY5LDcgKzIzNiw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDEsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCkBAIC02NTksNiArNjI1LDQxIEBACiAjZW5kaWYKIH07CiAKK3N0YXRpYyBpbnQgX19pbml0IG5ldDIyNzJfaW5pdCh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9ORVQyMjcyKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTkVUMjI3Ml9NT0RVTEUpCisJaW50IHJldDsKKworCS8qIFNldCBQRjAgdG8gMCwgUEYxIHRvIDEgbWFrZSAvQU1TMyB3b3JrIHByb3Blcmx5ICovCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KEdQSU9fUEYwLCAibmV0MjI3MiIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19QRjEsICJuZXQyMjcyIik7CisJaWYgKHJldCkgeworCQlncGlvX2ZyZWUoR1BJT19QRjApOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX1BGMTEsICJuZXQyMjcyIik7CisJaWYgKHJldCkgeworCQlncGlvX2ZyZWUoR1BJT19QRjApOworCQlncGlvX2ZyZWUoR1BJT19QRjEpOworCQlyZXR1cm4gcmV0OworCX0KKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BGMCwgMCk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUEYxLCAxKTsKKworCS8qIFJlc2V0IHRoZSBVU0IgY2hpcCAqLworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BGMTEsIDApOworCW1kZWxheSgyKTsKKwlncGlvX3NldF92YWx1ZShHUElPX1BGMTEsIDEpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX2luaXQgc3RhbXBfaW5pdCh2b2lkKQogewogCWludCByZXQ7CkBAIC02ODUsNiArNjg2LDkgQEAKIAl9CiAjZW5kaWYKIAorCWlmIChuZXQyMjcyX2luaXQoKSkKKwkJcHJfd2FybmluZygidW5hYmxlIHRvIGNvbmZpZ3VyZSBuZXQyMjcyOyBpdCBwcm9iYWJseSB3b24ndCB3b3JrXG4iKTsKKwogCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGJmaW5fc3BpX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoYmZpbl9zcGlfYm9hcmRfaW5mbykpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAppbmRleCA3MmFhNTk0Li4wM2YyYjQwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApAQCAtMTEsNyArMTEsNyBAQAogICovCiAKIC8qIFRoaXMgZmlsZSBzaG91bGQgYmUgdXAgdG8gZGF0ZSB3aXRoOgotICogIC0gUmV2aXNpb24gRiwgMDUvMjUvMjAxMDsgQURTUC1CRjUzMS9CRjUzMi9CRjUzMyBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CisgKiAgLSBSZXZpc2lvbiBHLCAwNS8yMy8yMDExOyBBRFNQLUJGNTMxL0JGNTMyL0JGNTMzIEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKICAqLwogCiAjaWZuZGVmIF9NQUNIX0FOT01BTFlfSF8KQEAgLTE1Miw3ICsxNTIsNyBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjc3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDYpCiAvKiBEaXNhYmxpbmcgUGVyaXBoZXJhbHMgd2l0aCBETUEgUnVubmluZyBNYXkgQ2F1c2UgRE1BIFN5c3RlbSBJbnN0YWJpbGl0eSAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjc4IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDYpCi0vKiBGYWxzZSBIYXJkd2FyZSBFcnJvciBFeGNlcHRpb24gd2hlbiBJU1IgQ29udGV4dCBJcyBOb3QgUmVzdG9yZWQgKi8KKy8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIHdoZW4gSVNSIENvbnRleHQgSXMgTm90IFJlc3RvcmVkICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyODEgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNikKIC8qIE1lbW9yeSBETUEgQ29ycnVwdGlvbiB3aXRoIDMyLUJpdCBEYXRhIGFuZCBUcmFmZmljIENvbnRyb2wgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI4MiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA2KQpAQCAtMjEwLDE4ICsyMTAsMjUgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2MiAoMSkKIC8qIEJvb3QgRmFpbHVyZSBXaGVuIFNEUkFNIENvbnRyb2wgU2lnbmFscyBUb2dnbGUgQ29taW5nIE91dCBPZiBSZXNldCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDcxICgxKQotLyogSW50ZXJydXB0ZWQgMzItQml0IFNQT1JUIERhdGEgUmVnaXN0ZXIgQWNjZXNzIFJlc3VsdHMgSW4gVW5kZXJmbG93ICovCisvKiBJbnRlcnJ1cHRlZCBTUE9SVCBSZWNlaXZlIERhdGEgUmVnaXN0ZXIgUmVhZCBSZXN1bHRzIEluIFVuZGVyZmxvdyB3aGVuIFNMRU4gPiAxNSAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDczICgxKQotLyogUG9zc2libGUgTG9ja3VwIENvbmRpdGlvbiB3aGVtIE1vZGlmeWluZyBQTEwgZnJvbSBFeHRlcm5hbCBNZW1vcnkgKi8KKy8qIFBvc3NpYmxlIExvY2t1cCBDb25kaXRpb24gd2hlbiBNb2RpZnlpbmcgUExMIGZyb20gRXh0ZXJuYWwgTWVtb3J5ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzUgKDEpCiAvKiBURVNUU0VUIEluc3RydWN0aW9uIENhbm5vdCBCZSBJbnRlcnJ1cHRlZCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDc3ICgxKQogLyogUmVhZHMgb2YgSVRFU1RfQ09NTUFORCBhbmQgSVRFU1RfREFUQSBSZWdpc3RlcnMgQ2F1c2UgQ2FjaGUgQ29ycnVwdGlvbiAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDgxICgxKQotLyogSUZMVVNIIHN1Y2tzIGF0IGxpZmUgKi8KKy8qIFBMTCBNYXkgTGF0Y2ggSW5jb3JyZWN0IFZhbHVlcyBDb21pbmcgT3V0IG9mIFJlc2V0ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0ODkgKDEpCisvKiBJbnN0cnVjdGlvbiBNZW1vcnkgU3RhbGxzIENhbiBDYXVzZSBJRkxVU0ggdG8gRmFpbCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDkxICgxKQorLyogRVhDUFQgSW5zdHJ1Y3Rpb24gTWF5IEJlIExvc3QgSWYgTk1JIEhhcHBlbnMgU2ltdWx0YW5lb3VzbHkgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ5NCAoMSkKKy8qIFJYUyBCaXQgaW4gU1BJX1NUQVQgTWF5IEJlY29tZSBTdHVjayBJbiBSWCBETUEgTW9kZXMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDUwMSAoMSkKIAotLyogVGhlc2UgYW5vbWFsaWVzIGhhdmUgYmVlbiAicGhhc2VkIiBvdXQgb2YgYW5hbG9nLmNvbSBhbm9tYWx5IHNoZWV0cyBhbmQgYXJlCisvKgorICogVGhlc2UgYW5vbWFsaWVzIGhhdmUgYmVlbiAicGhhc2VkIiBvdXQgb2YgYW5hbG9nLmNvbSBhbm9tYWx5IHNoZWV0cyBhbmQgYXJlCiAgKiBoZXJlIHRvIHNob3cgcnVubmluZyBvbiBvbGRlciBzaWxpY29uIGp1c3QgaXNuJ3QgZmVhc2libGUuCiAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN2UuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzdlLmMKaW5kZXggZDU4MmI4MS4uNDRmZDg0MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN2UuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3ZS5jCkBAIC02MSwyOSArNjEsMTIgQEAKIC8qIFNQSSBmbGFzaCBjaGlwIChtMjVwNjQpICovCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2ZsYXNoX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BRENfTU9EVUxFKQotLyogU1BJIEFEQyBjaGlwICovCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkY19jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAxLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1hfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGFkMTgzNl9zcGlfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDE2LAogfTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgIG1tY19zcGlfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKQEAgLTEwMSwyNCArODQsMTIgQEAKIAl9LAogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BREMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAiYmZpbl9zcGlfYWRjIiwgLyogTmFtZSBvZiBzcGlfZHJpdmVyIGZvciB0aGlzIGRldmljZSAqLwotCQkubWF4X3NwZWVkX2h6ID0gNjI1MDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLwotCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuICovCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwgLyogTm8gc3BpX2RyaXZlciBzcGVjaWZpYyBjb25maWcgKi8KLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWRjX2NoaXBfaW5mbywKLQl9LAotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1hfTU9EVUxFKQogCXsKIAkJLm1vZGFsaWFzID0gImFkMTgzeCIsCiAJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDQsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmYWQxODM2X3NwaV9jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogCkBAIC03NjYsNiArNzM3LDI0IEBACiAjZW5kaWYKIH07CiAKK3N0YXRpYyBpbnQgX19pbml0IG5ldDIyNzJfaW5pdCh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9ORVQyMjcyKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTkVUMjI3Ml9NT0RVTEUpCisJaW50IHJldDsKKworCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX1BHMTQsICJuZXQyMjcyIik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlc2V0IFVTQiBDaGlwLCBQRzE0ICovCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUEcxNCwgMCk7CisJbWRlbGF5KDIpOworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUEcxNCwgMSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBjbV9iZjUzN2VfaW5pdCh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKQEAgLTc3Nyw2ICs3NjYsMTAgQEAKICNpZiBkZWZpbmVkKENPTkZJR19QQVRBX1BMQVRGT1JNKSB8fCBkZWZpbmVkKENPTkZJR19QQVRBX1BMQVRGT1JNX01PRFVMRSkKIAlpcnFfc2V0X3N0YXR1c19mbGFncyhQQVRBX0lOVCwgSVJRX05PQVVUT0VOKTsKICNlbmRpZgorCisJaWYgKG5ldDIyNzJfaW5pdCgpKQorCQlwcl93YXJuaW5nKCJ1bmFibGUgdG8gY29uZmlndXJlIG5ldDIyNzI7IGl0IHByb2JhYmx5IHdvbid0IHdvcmtcbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1Mzd1LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3dS5jCmluZGV4IGNiYjgwOTguLjFiNGFjNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1Mzd1LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN3UuYwpAQCAtNjIsMjkgKzYyLDEyIEBACiAvKiBTUEkgZmxhc2ggY2hpcCAobTI1cDY0KSAqLwogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9mbGFzaF9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLS8qIFNQSSBBREMgY2hpcCAqLwotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZGNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMSwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDE2LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1gpIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBhZDE4MzZfc3BpX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwICBtbWNfc3BpX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogfTsKICNlbmRpZgogCkBAIC0xMDIsMjQgKzg1LDEyIEBACiAJfSwKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BRENfTU9EVUxFKQotCXsKLQkJLm1vZGFsaWFzID0gImJmaW5fc3BpX2FkYyIsIC8qIE5hbWUgb2Ygc3BpX2RyaXZlciBmb3IgdGhpcyBkZXZpY2UgKi8KLQkJLm1heF9zcGVlZF9oeiA9IDYyNTAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCi0JCS5idXNfbnVtID0gMCwgLyogRnJhbWV3b3JrIGJ1cyBudW1iZXIgKi8KLQkJLmNoaXBfc2VsZWN0ID0gMSwgLyogRnJhbWV3b3JrIGNoaXAgc2VsZWN0LiAqLwotCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsIC8qIE5vIHNwaV9kcml2ZXIgc3BlY2lmaWMgY29uZmlnICovCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkY19jaGlwX2luZm8sCi0JfSwKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1gpIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKIAl7CiAJCS5tb2RhbGlhcyA9ICJhZDE4M3giLAogCQkubWF4X3NwZWVkX2h6ID0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSA0LAotCQkuY29udHJvbGxlcl9kYXRhID0gJmFkMTgzNl9zcGlfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKIApAQCAtNzMxLDYgKzcwMiwzNiBAQAogI2VuZGlmCiB9OwogCitzdGF0aWMgaW50IF9faW5pdCBuZXQyMjcyX2luaXQodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfTkVUMjI3MikgfHwgZGVmaW5lZChDT05GSUdfVVNCX05FVDIyNzJfTU9EVUxFKQorCWludCByZXQ7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19QSDE1LCBkcml2ZXJfbmFtZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX1BIMTMsICJuZXQyMjcyIik7CisJaWYgKHJldCkgeworCQlncGlvX2ZyZWUoR1BJT19QSDE1KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBTZXQgUEgxNSBMb3cgbWFrZSAvQU1TMiB3b3JrIHByb3Blcmx5ICovCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUEgxNSwgMCk7CisKKwkvKiBlbmFibGUgQ0xLQlVGIG91dHB1dCAqLworCWJmaW5fd3JpdGVfVlJfQ1RMKGJmaW5fcmVhZF9WUl9DVEwoKSB8IENMS0JVRk9FKTsKKworCS8qIFJlc2V0IHRoZSBVU0IgY2hpcCAqLworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BIMTMsIDApOworCW1kZWxheSgyKTsKKwlncGlvX3NldF92YWx1ZShHUElPX1BIMTMsIDEpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX2luaXQgY21fYmY1Mzd1X2luaXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7CkBAIC03NDIsNiArNzQzLDEwIEBACiAjaWYgZGVmaW5lZChDT05GSUdfUEFUQV9QTEFURk9STSkgfHwgZGVmaW5lZChDT05GSUdfUEFUQV9QTEFURk9STV9NT0RVTEUpCiAJaXJxX3NldF9zdGF0dXNfZmxhZ3MoUEFUQV9JTlQsIElSUV9OT0FVVE9FTik7CiAjZW5kaWYKKworCWlmIChuZXQyMjcyX2luaXQoKSkKKwkJcHJfd2FybmluZygidW5hYmxlIHRvIGNvbmZpZ3VyZSBuZXQyMjcyOyBpdCBwcm9iYWJseSB3b24ndCB3b3JrXG4iKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2RucDUzNzAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZG5wNTM3MC5jCmluZGV4IDZiNGZmNDYuLjhiYzk1MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZG5wNTM3MC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZG5wNTM3MC5jCkBAIC0xMzAsNyArMTMwLDYgQEAKIAogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIG1tY19zcGlfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hICAgID0gMCwJIC8qIHVzZSBubyBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gOCwKIH07CiAKICNlbmRpZgpAQCAtMTYxLDcgKzE2MCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZGF0YWZsYXNoX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSAgICA9IDAsCSAvKiB1c2Ugbm8gZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYwppbmRleCBiZmIzNjcxLi5jNjJmOWRjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9taW5vdGF1ci5jCkBAIC0xNTksMTQgKzE1OSwxMiBAQAogLyogU1BJIGZsYXNoIGNoaXAgKG0yNXA2NCkgKi8KIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19NTUNfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfU1BJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBtbWNfc3BpX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYwppbmRleCA5Mzg5ZjAzLi4zYjgxNTFkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvcG5hdjEwLmMKQEAgLTE4NCw0MCArMTg0LDE2IEBACiAvKiBTUEkgZmxhc2ggY2hpcCAobTI1cDY0KSAqLwogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9mbGFzaF9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgXAotCXx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0vKiBTUEkgQURDIGNoaXAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWRjX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDEsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1hfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGFkMTgzNl9zcGlfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDE2LAogfTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgbW1jX3NwaV9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3NykgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3X01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc3X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3ODc3X3BsYXRmb3JtX2RhdGEgYmZpbl9hZDc4NzdfdHNfaW5mbyA9IHsKIAkubW9kZWwJCQk9IDc4NzcsCiAJLnZyZWZfZGVsYXlfdXNlY3MJPSA1MCwJLyogaW50ZXJuYWwsIG5vIGNhcGFjaXRvciAqLwpAQCAtMjQ4LDE4ICsyMjQsNiBAQAogCX0sCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgXAotCXx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAiYmZpbl9zcGlfYWRjIiwgLyogTmFtZSBvZiBzcGlfZHJpdmVyIGZvciB0aGlzIGRldmljZSAqLwotCQkubWF4X3NwZWVkX2h6ID0gNjI1MDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLwotCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuICovCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwgLyogTm8gc3BpX2RyaXZlciBzcGVjaWZpYyBjb25maWcgKi8KLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWRjX2NoaXBfaW5mbywKLQl9LAotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgXAogCXx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKIAl7CkBAIC0yNjcsNyArMjMxLDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gNCwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZhZDE4MzZfc3BpX2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCkBAIC0yODgsNyArMjUxLDYgQEAKIAkubWF4X3NwZWVkX2h6CQk9IDEyNTAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCS5idXNfbnVtCQk9IDAsCiAJLmNoaXBfc2VsZWN0ICAJCT0gNSwKLQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzdfY2hpcF9pbmZvLAogfSwKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKaW5kZXggNzZkYjFkNC4uYjUyZTY3MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYwpAQCAtMzY3LDYgKzM2Nyw5IEBACiAJCS5lbmQgPSAweDIwMzAwMDAwICsgMHgxMDAsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sIHsKKwkJLnN0YXJ0ID0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9CVVMsCisJfSwgewogCQkuc3RhcnQgPSBJUlFfUEY3LAogCQkuZW5kID0gSVJRX1BGNywKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9ISUdITEVWRUwsCkBAIC01MzMsNDkgKzUzNiwxMSBAQAogLyogU1BJIGZsYXNoIGNoaXAgKG0yNXA2NCkgKi8KIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BREMpIFwKLQl8fCBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BRENfTU9EVUxFKQotLyogU1BJIEFEQyBjaGlwICovCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkY19jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAxLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgXAotCXx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBhZDE4MzZfc3BpX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxOTNYKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE5M1hfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGFkMTkzOF9zcGlfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEQVY4MFgpIFwKLQl8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEQVY4MFhfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGFkYXY4MDFfc3BpX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogfTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfQUQ3MTRYX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfQUQ3MTRYX1NQSV9NT0RVTEUpCiAjaW5jbHVkZSA8bGludXgvaW5wdXQvYWQ3MTR4Lmg+Ci1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgYWQ3MTQ3X3NwaV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwogCiBzdGF0aWMgc3RydWN0IGFkNzE0eF9zbGlkZXJfcGxhdCBhZDcxNDdfc3BpX3NsaWRlcl9wbGF0W10gPSB7CiAJewpAQCAtNjg1LDcgKzY1MCw2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfQUQyUzkwKSB8fCBkZWZpbmVkKENPTkZJR19BRDJTOTBfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGFkMnM5MF9zcGlfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDE2LAogfTsKICNlbmRpZgogCkBAIC02OTcsNyArNjYxLDYgQEAKIAogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGFkMnMxMjB4X3NwaV9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCiB9OwogI2VuZGlmCiAKQEAgLTcxNCwxNCArNjc3LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBhZDJzMTIxMF9zcGlfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19BRDczMTQpIHx8IGRlZmluZWQoQ09ORklHX0FENzMxNF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgYWQ3MzE0X3NwaV9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCiB9OwogI2VuZGlmCiAKQEAgLTczNSw3ICs2OTYsNiBAQAogCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgYWQ3ODE2X3NwaV9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKIH07CiAjZW5kaWYKIApAQCAtNzQ5LDcgKzcwOSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBhZHQ3MzEwX3NwaV9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKIH07CiAjZW5kaWYKIApAQCAtNzU4LDExICs3MTcsNiBAQAogCUdQSU9fUEY3LCAvKiBidXN5X3BpbiAqLwogCTAsCiB9OwotCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgYWQ3Mjk4X3NwaV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19BRFQ3MzE2X1NQSSkgfHwgZGVmaW5lZChDT05GSUdfQURUNzMxNl9TUElfTU9EVUxFKQpAQCAtNzczLDcgKzcyNyw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBhZHQ3MzE2X3NwaV9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKIH07CiAjZW5kaWYKIApAQCAtODAwLDE4ICs3NTMsMTIgQEAKIAogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwICBtbWNfc3BpX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogCS5waW9faW50ZXJydXB0ID0gMCwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3NykgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3X01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC9zcGkvYWQ3ODc3Lmg+Ci1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3N19jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzg3N19wbGF0Zm9ybV9kYXRhIGJmaW5fYWQ3ODc3X3RzX2luZm8gPSB7CiAJLm1vZGVsCQkJPSA3ODc3LAogCS52cmVmX2RlbGF5X3VzZWNzCT0gNTAsCS8qIGludGVybmFsLCBubyBjYXBhY2l0b3IgKi8KQEAgLTg4MywzOSArODMwLDEzIEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc5X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaWRldl9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSkgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBscTAzNXExX3NwaV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEJPSAwLAotCS5iaXRzX3Blcl93b3JkCT0gOCwKLX07Ci0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX0VOQzI4SjYwKSB8fCBkZWZpbmVkKENPTkZJR19FTkMyOEo2MF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgZW5jMjhqNjBfc3BpX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYQk9IDEsCi0JLmJpdHNfcGVyX3dvcmQJPSA4LAogfTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQURGNzAyWCkgfHwgZGVmaW5lZChDT05GSUdfQURGNzAyWF9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgYWRmNzAyMV9zcGlfY2hpcF9pbmZvID0gewotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotCiAjaW5jbHVkZSA8bGludXgvc3BpL2FkZjcwMnguaD4KICNkZWZpbmUgVFhSRUcgMHgwMTYwQTQ3MAogc3RhdGljIGNvbnN0IHUzMiBhZGY3MDIxX3JlZ3NbXSA9IHsKQEAgLTk1OSwxMCArODgwLDYgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDYpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDZfTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+Ci1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgYWQ3ODczX3NwaV9jaGlwX2luZm8gPSB7Ci0JLmJpdHNfcGVyX3dvcmQJPSA4LAotfTsKLQogc3RhdGljIGludCBhZHM3ODczX2dldF9wZW5kb3duX3N0YXRlKHZvaWQpCiB7CiAJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKEdQSU9fUEY2KTsKQEAgLTEwMDksMjEgKzkyNiwxMiBAQAogLyogRGF0YUZsYXNoIGNoaXAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBkYXRhX2ZsYXNoX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfQURYTDM0WF9TUEkpIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX0FEWEwzNFhfU1BJX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWR4bDM0eF9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gOCwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0FENzQ3NikgfHwgZGVmaW5lZChDT05GSUdfQUQ3NDc2X01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3NDc2X2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAogfTsKICNlbmRpZgogCkBAIC0xMDUzLDE3ICs5NjEsNiBAQAogCQkubW9kZSA9IFNQSV9NT0RFXzMsCiAJfSwKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgXAotCXx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAiYmZpbl9zcGlfYWRjIiwgLyogTmFtZSBvZiBzcGlfZHJpdmVyIGZvciB0aGlzIGRldmljZSAqLwotCQkubWF4X3NwZWVkX2h6ID0gNjI1MDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLwotCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuICovCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwgLyogTm8gc3BpX2RyaXZlciBzcGVjaWZpYyBjb25maWcgKi8KLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWRjX2NoaXBfaW5mbywKLQl9LAotI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgXAogCXx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKQEAgLTEwNzMsNyArOTcwLDYgQEAKIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSA0LAogCQkucGxhdGZvcm1fZGF0YSA9ICJhZDE4MzYiLCAvKiBvbmx5IGluY2x1ZGVzIGNoaXAgbmFtZSBmb3IgdGhlIG1vbWVudCAqLwotCQkuY29udHJvbGxlcl9kYXRhID0gJmFkMTgzNl9zcGlfY2hpcF9pbmZvLAogCQkubW9kZSA9IFNQSV9NT0RFXzMsCiAJfSwKICNlbmRpZgpAQCAtMTA4NCw3ICs5ODAsNiBAQAogCQkubWF4X3NwZWVkX2h6ID0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSA1LAotCQkuY29udHJvbGxlcl9kYXRhID0gJmFkMTkzOF9zcGlfY2hpcF9pbmZvLAogCQkubW9kZSA9IFNQSV9NT0RFXzMsCiAJfSwKICNlbmRpZgpAQCAtMTA5NSw3ICs5OTAsNiBAQAogCQkubWF4X3NwZWVkX2h6ID0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSAxLAotCQkuY29udHJvbGxlcl9kYXRhID0gJmFkYXY4MDFfc3BpX2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfTU9ERV8zLAogCX0sCiAjZW5kaWYKQEAgLTExMDksNyArMTAwMyw2IEBACiAJCS5jaGlwX3NlbGVjdCA9IDUsCiAJCS5tb2RlID0gU1BJX01PREVfMywKIAkJLnBsYXRmb3JtX2RhdGEgPSAmYWQ3MTQ3X3NwaV9wbGF0Zm9ybV9kYXRhLAotCQkuY29udHJvbGxlcl9kYXRhID0gJmFkNzE0N19zcGlfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKIApAQCAtMTE4OCw3ICsxMDgxLDYgQEAKIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSA0LCAgICAgICAgICAgIC8qIENTLCBjaGFuZ2UgaXQgZm9yIHlvdXIgYm9hcmQgKi8KIAkJLnBsYXRmb3JtX2RhdGEgPSBhZDcyOThfcGxhdGZvcm1fZGF0YSwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZhZDcyOThfc3BpX2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfTU9ERV8zLAogCX0sCiAjZW5kaWYKQEAgLTEyMjUsNyArMTExNyw2IEBACiAJCS5tYXhfc3BlZWRfaHoJPSAxMjUwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0JPSAwLAogCQkuY2hpcF9zZWxlY3QgID0gMSwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc3X2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSV9NT0RVTEUpCkBAIC0xMjM2LDcgKzExMjcsNiBAQAogCQkubWF4X3NwZWVkX2h6ID0gNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSAxLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzlfY2hpcF9pbmZvLAogCQkubW9kZSA9IFNQSV9DUEhBIHwgU1BJX0NQT0wsCiAJfSwKICNlbmRpZgpAQCAtMTI0Niw3ICsxMTM2LDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gMSwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTEpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMV9NT0RVTEUpCkBAIC0xMjU1LDcgKzExNDQsNiBAQAogCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gMiwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZscTAzNXExX3NwaV9jaGlwX2luZm8sCiAJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKIAl9LAogI2VuZGlmCkBAIC0xMjc4LDcgKzExNjYsNiBAQAogCQkubWF4X3NwZWVkX2h6CT0gNTAwMDAwMCwgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bQk9IDAsCiAJCS5jaGlwX3NlbGVjdAk9IDIsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkeGwzNHhfY2hpcF9pbmZvLAogCQkubW9kZSA9IFNQSV9NT0RFXzMsCiAJfSwKICNlbmRpZgpAQCAtMTI4OCw3ICsxMTc1LDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDE2MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IEdQSU9fUEYxMCArIE1BWF9DVFJMX0NTLAkvKiBHUElPIGNvbnRyb2xsZWQgU1NFTCAqLwotCQkuY29udHJvbGxlcl9kYXRhID0gJmFkZjcwMjFfc3BpX2NoaXBfaW5mbywKIAkJLnBsYXRmb3JtX2RhdGEgPSAmYWRmNzAyMV9wbGF0Zm9ybV9kYXRhLAogCQkubW9kZSA9IFNQSV9NT0RFXzAsCiAJfSwKQEAgLTEzMDAsNyArMTE4Niw2IEBACiAJCS5idXNfbnVtID0gMCwKIAkJLmlycSA9IElSUV9QRjYsCiAJCS5jaGlwX3NlbGVjdCA9IEdQSU9fUEYxMCArIE1BWF9DVFJMX0NTLAkvKiBHUElPIGNvbnRyb2xsZWQgU1NFTCAqLwotCQkuY29udHJvbGxlcl9kYXRhID0gJmFkNzg3M19zcGlfY2hpcF9pbmZvLAogCQkucGxhdGZvcm1fZGF0YSA9ICZhZDc4NzNfcGRhdGEsCiAJCS5tb2RlID0gU1BJX01PREVfMCwKIAl9LApAQCAtMjYzMiw5ICsyNTE3LDI1IEBACiAJQkZJTl9TTkRfUkVTKDApLAogCUJGSU5fU05EX1JFUygxKSwKIH07CisjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9wY20gPSB7Ci0JLm5hbWUgPSAiYmZpbi1wY20tYXVkaW8iLAorI2lmIGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9JMlMpIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9JMlNfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pMnNfcGNtID0geworCS5uYW1lID0gImJmaW4taTJzLXBjbS1hdWRpbyIsCisJLmlkID0gLTEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfVERNKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfVERNX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fdGRtX3BjbSA9IHsKKwkubmFtZSA9ICJiZmluLXRkbS1wY20tYXVkaW8iLAorCS5pZCA9IC0xLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0FDOTcpIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9BQzk3X01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fYWM5N19wY20gPSB7CisJLm5hbWUgPSAiYmZpbi1hYzk3LXBjbS1hdWRpbyIsCiAJLmlkID0gLTEsCiB9OwogI2VuZGlmCkBAIC0yODY5LDEwICsyNzcwLDE2IEBACiAJJnN0YW1wX2ZsYXNoX2RldmljZSwKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0kyUykgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX0kyU19NT0RVTEUpIHx8IFwKLQlkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfVERNKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfVERNX01PRFVMRSkgfHwgXAotCWRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9BQzk3KSB8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfQUM5N19NT0RVTEUpCi0JJmJmaW5fcGNtLAorI2lmIGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9JMlMpIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9JMlNfTU9EVUxFKQorCSZiZmluX2kyc19wY20sCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9URE0pIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9URE1fTU9EVUxFKQorCSZiZmluX3RkbV9wY20sCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9BQzk3KSB8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfQUM5N19NT0RVTEUpCisJJmJmaW5fYWM5N19wY20sCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQ3MzMxMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDczMzExX01PRFVMRSkKQEAgLTI5MTYsNiArMjgyMywyNCBAQAogI2VuZGlmCiB9OwogCitzdGF0aWMgaW50IF9faW5pdCBuZXQyMjcyX2luaXQodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfTkVUMjI3MikgfHwgZGVmaW5lZChDT05GSUdfVVNCX05FVDIyNzJfTU9EVUxFKQorCWludCByZXQ7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19QRjYsICJuZXQyMjcyIik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlc2V0IHRoZSBVU0IgY2hpcCAqLworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BGNiwgMCk7CisJbWRlbGF5KDIpOworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUEY2LCAxKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHN0YW1wX2luaXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7CkBAIC0yOTI2LDYgKzI4NTEsOSBAQAogCQkJCUFSUkFZX1NJWkUoYmZpbl9pMmNfYm9hcmRfaW5mbykpOwogCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGJmaW5fc3BpX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoYmZpbl9zcGlfYm9hcmRfaW5mbykpOwogCisJaWYgKG5ldDIyNzJfaW5pdCgpKQorCQlwcl93YXJuaW5nKCJ1bmFibGUgdG8gY29uZmlndXJlIG5ldDIyNzI7IGl0IHByb2JhYmx5IHdvbid0IHdvcmtcbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jCmluZGV4IDE2NGE3ZTAuLjliNzI4N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYwpAQCAtNjIsMjkgKzYyLDEyIEBACiAvKiBTUEkgZmxhc2ggY2hpcCAobTI1cDY0KSAqLwogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9mbGFzaF9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLS8qIFNQSSBBREMgY2hpcCAqLwotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZGNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMSwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDE2LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1gpIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBhZDE4MzZfc3BpX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIG1tY19zcGlfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKQEAgLTEwMiwyNCArODUsMTIgQEAKIAl9LAogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BREMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAiYmZpbl9zcGlfYWRjIiwgLyogTmFtZSBvZiBzcGlfZHJpdmVyIGZvciB0aGlzIGRldmljZSAqLwotCQkubWF4X3NwZWVkX2h6ID0gNjI1MDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLwotCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuICovCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwgLyogTm8gc3BpX2RyaXZlciBzcGVjaWZpYyBjb25maWcgKi8KLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWRjX2NoaXBfaW5mbywKLQl9LAotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1hfTU9EVUxFKQogCXsKIAkJLm1vZGFsaWFzID0gImFkMTgzeCIsCiAJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDQsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmYWQxODM2X3NwaV9jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogCkBAIC03MzMsNiArNzA0LDI0IEBACiAjZW5kaWYKIH07CiAKK3N0YXRpYyBpbnQgX19pbml0IG5ldDIyNzJfaW5pdCh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9ORVQyMjcyKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTkVUMjI3Ml9NT0RVTEUpCisJaW50IHJldDsKKworCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX1BHMTQsICJuZXQyMjcyIik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlc2V0IFVTQiBDaGlwLCBQRzE0ICovCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUEcxNCwgMCk7CisJbWRlbGF5KDIpOworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUEcxNCwgMSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCB0Y21fYmY1MzdfaW5pdCh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKQEAgLTc0NCw2ICs3MzMsMTAgQEAKICNpZiBkZWZpbmVkKENPTkZJR19QQVRBX1BMQVRGT1JNKSB8fCBkZWZpbmVkKENPTkZJR19QQVRBX1BMQVRGT1JNX01PRFVMRSkKIAlpcnFfc2V0X3N0YXR1c19mbGFncyhQQVRBX0lOVCwgSVJRX05PQVVUT0VOKTsKICNlbmRpZgorCisJaWYgKG5ldDIyNzJfaW5pdCgpKQorCQlwcl93YXJuaW5nKCJ1bmFibGUgdG8gY29uZmlndXJlIG5ldDIyNzI7IGl0IHByb2JhYmx5IHdvbid0IHdvcmtcbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKaW5kZXggN2Y4ZTVhOS4uNTQzY2QzZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTExLDcgKzExLDcgQEAKICAqLwogCiAvKiBUaGlzIGZpbGUgc2hvdWxkIGJlIHVwIHRvIGRhdGUgd2l0aDoKLSAqICAtIFJldmlzaW9uIEUsIDA1LzI1LzIwMTA7IEFEU1AtQkY1MzQvQURTUC1CRjUzNi9BRFNQLUJGNTM3IEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKKyAqICAtIFJldmlzaW9uIEYsIDA1LzIzLzIwMTE7IEFEU1AtQkY1MzQvQURTUC1CRjUzNi9BRFNQLUJGNTM3IEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKICAqLwogCiAjaWZuZGVmIF9NQUNIX0FOT01BTFlfSF8KQEAgLTQ0LDE4ICs0NCwxMiBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTE5ICgxKQogLyogUnguSCBDYW5ub3QgQmUgVXNlZCB0byBBY2Nlc3MgMTYtYml0IFN5c3RlbSBNTVIgUmVnaXN0ZXJzICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAxMjIgKDEpCi0vKiBLaWxsZWQgMzItQml0IE1NUiBXcml0ZSBMZWFkcyB0byBOZXh0IFN5c3RlbSBNTVIgQWNjZXNzIFRoaW5raW5nIEl0IFNob3VsZCBCZSAzMi1CaXQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDE1NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogUFBJX0RFTEFZIE5vdCBGdW5jdGlvbmFsIGluIFBQSSBNb2RlcyB3aXRoIDAgRnJhbWUgU3luY3MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDE4MCAoMSkKLS8qIEluc3RydWN0aW9uIENhY2hlIElzIE5vdCBGdW5jdGlvbmFsICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAyMzcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKIC8qIElmIEktQ2FjaGUgSXMgT24sIENTWU5DL1NTWU5DL0lETEUgQXJvdW5kIENoYW5nZSBvZiBDb250cm9sIENhdXNlcyBGYWlsdXJlcyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjQ0IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCiAvKiBGYWxzZSBIYXJkd2FyZSBFcnJvciBmcm9tIGFuIEFjY2VzcyBpbiB0aGUgU2hhZG93IG9mIGEgQ29uZGl0aW9uYWwgQnJhbmNoICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNDUgKDEpCi0vKiBCdWZmZXJlZCBDTEtJTiBPdXRwdXQgSXMgRGlzYWJsZWQgYnkgRGVmYXVsdCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMjQ3ICgxKQogLyogSW5jb3JyZWN0IEJpdCBTaGlmdCBvZiBEYXRhIFdvcmQgaW4gTXVsdGljaGFubmVsIChURE0pIE1vZGUgaW4gQ2VydGFpbiBDb25kaXRpb25zICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNTAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKIC8qIEVNQUMgVFggRE1BIEVycm9yIEFmdGVyIGFuIEVhcmx5IEZyYW1lIEFib3J0ICovCkBAIC05OCw3ICs5Miw3IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzggKCgoQU5PTUFMWV9CRjUzNiB8fCBBTk9NQUxZX0JGNTM3KSAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpIHx8IChBTk9NQUxZX0JGNTM0ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikpCiAvKiBTUEkgTWFzdGVyIEJvb3QgTW9kZSBEb2VzIE5vdCBXb3JrIFdlbGwgd2l0aCBBdG1lbCBEYXRhIEZsYXNoIERldmljZXMgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI4MCAoMSkKLS8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIEV4Y2VwdGlvbiB3aGVuIElTUiBDb250ZXh0IElzIE5vdCBSZXN0b3JlZCAqLworLyogRmFsc2UgSGFyZHdhcmUgRXJyb3Igd2hlbiBJU1IgQ29udGV4dCBJcyBOb3QgUmVzdG9yZWQgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI4MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQogLyogTWVtb3J5IERNQSBDb3JydXB0aW9uIHdpdGggMzItQml0IERhdGEgYW5kIFRyYWZmaWMgQ29udHJvbCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjgyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCkBAIC0xNjIsOSArMTU2LDkgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2MSAoMSkKIC8qIFN5bmNocm9uaXphdGlvbiBQcm9ibGVtIGF0IFN0YXJ0dXAgTWF5IENhdXNlIFNQT1JUIFRyYW5zbWl0IENoYW5uZWxzIHRvIE1pc2FsaWduICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NjIgKDEpCi0vKiBJbnRlcnJ1cHRlZCAzMi1CaXQgU1BPUlQgRGF0YSBSZWdpc3RlciBBY2Nlc3MgUmVzdWx0cyBJbiBVbmRlcmZsb3cgKi8KKy8qIEludGVycnVwdGVkIFNQT1JUIFJlY2VpdmUgRGF0YSBSZWdpc3RlciBSZWFkIFJlc3VsdHMgSW4gVW5kZXJmbG93IHdoZW4gU0xFTiA+IDE1ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzMgKDEpCi0vKiBQb3NzaWJsZSBMb2NrdXAgQ29uZGl0aW9uIHdoZW0gTW9kaWZ5aW5nIFBMTCBmcm9tIEV4dGVybmFsIE1lbW9yeSAqLworLyogUG9zc2libGUgTG9ja3VwIENvbmRpdGlvbiB3aGVuIE1vZGlmeWluZyBQTEwgZnJvbSBFeHRlcm5hbCBNZW1vcnkgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ3NSAoMSkKIC8qIFRFU1RTRVQgSW5zdHJ1Y3Rpb24gQ2Fubm90IEJlIEludGVycnVwdGVkICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzcgKDEpCkBAIC0xNzIsOCArMTY2LDI2IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0ODAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKIC8qIFJlYWRzIG9mIElURVNUX0NPTU1BTkQgYW5kIElURVNUX0RBVEEgUmVnaXN0ZXJzIENhdXNlIENhY2hlIENvcnJ1cHRpb24gKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ4MSAoMSkKLS8qIElGTFVTSCBzdWNrcyBhdCBsaWZlICovCisvKiBQTEwgTWF5IExhdGNoIEluY29ycmVjdCBWYWx1ZXMgQ29taW5nIE91dCBvZiBSZXNldCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDg5ICgxKQorLyogSW5zdHJ1Y3Rpb24gTWVtb3J5IFN0YWxscyBDYW4gQ2F1c2UgSUZMVVNIIHRvIEZhaWwgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ5MSAoMSkKKy8qIEVYQ1BUIEluc3RydWN0aW9uIE1heSBCZSBMb3N0IElmIE5NSSBIYXBwZW5zIFNpbXVsdGFuZW91c2x5ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0OTQgKDEpCisvKiBSWFMgQml0IGluIFNQSV9TVEFUIE1heSBCZWNvbWUgU3R1Y2sgSW4gUlggRE1BIE1vZGVzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA1MDEgKDEpCisKKy8qCisgKiBUaGVzZSBhbm9tYWxpZXMgaGF2ZSBiZWVuICJwaGFzZWQiIG91dCBvZiBhbmFsb2cuY29tIGFub21hbHkgc2hlZXRzIGFuZCBhcmUKKyAqIGhlcmUgdG8gc2hvdyBydW5uaW5nIG9uIG9sZGVyIHNpbGljb24ganVzdCBpc24ndCBmZWFzaWJsZS4KKyAqLworCisvKiBLaWxsZWQgMzItQml0IE1NUiBXcml0ZSBMZWFkcyB0byBOZXh0IFN5c3RlbSBNTVIgQWNjZXNzIFRoaW5raW5nIEl0IFNob3VsZCBCZSAzMi1CaXQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE1NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogSW5zdHJ1Y3Rpb24gQ2FjaGUgSXMgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDIzNyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogQnVmZmVyZWQgQ0xLSU4gT3V0cHV0IElzIERpc2FibGVkIGJ5IERlZmF1bHQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI0NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDA5OSAoMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYwppbmRleCBlNjE0MjRlLi42MjlmM2MzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jCkBAIC01MDIsNyArNTAyLDYgQEAKIAogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9mbGFzaF9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gOCwKIH07CiAjZW5kaWYKIApAQCAtNTIzLDEzICs1MjIsNiBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSV9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3OV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTEpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMV9NT0RVTEUpCiAjaW5jbHVkZSA8YXNtL2JmaW4tbHEwMzVxMS5oPgogCkBAIC01NTksMjAgKzU1MSw2IEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTEpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMV9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgbHEwMzVxMV9zcGlfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hCT0gMCwKLQkuYml0c19wZXJfd29yZAk9IDgsCi19OwotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gYmY1Mzhfc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0gewogI2lmIGRlZmluZWQoQ09ORklHX01URF9NMjVQODApIFwKIAl8fCBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwX01PRFVMRSkKQEAgLTU5NSw3ICs1NzMsNiBAQAogCQkubWF4X3NwZWVkX2h6ID0gNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSAxLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzlfY2hpcF9pbmZvLAogCQkubW9kZSA9IFNQSV9DUEhBIHwgU1BJX0NQT0wsCiAJfSwKICNlbmRpZgpAQCAtNjA1LDcgKzU4Miw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSAyLAotCQkuY29udHJvbGxlcl9kYXRhID0gJmxxMDM1cTFfc3BpX2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAogCX0sCiAjZW5kaWYKQEAgLTYxNSw3ICs1OTEsNiBAQAogCQkubWF4X3NwZWVkX2h6ID0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSAxLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaWRldl9jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9leHQtZ3Bpby5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2V4dC1ncGlvLmMKaW5kZXggMTgwYjEyNS4uNDcxYTliMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2V4dC1ncGlvLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2V4dC1ncGlvLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogR1BJT0xJQiBpbnRlcmZhY2UgZm9yIEJGNTM4LzkgUE9SVCBDLCBELCBhbmQgRSBHUElPcwogICoKLSAqIENvcHlyaWdodCAyMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA5LTIwMTEgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtMTIxLDMgKzEyMSwzOCBAQAogCQlncGlvY2hpcF9hZGQoJmJmNTM4X3BvcnRlX2NoaXApOwogfQogYXJjaF9pbml0Y2FsbChiZjUzOF9leHRncGlvX3NldHVwKTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHN0cnVjdCB7CisJdTE2IGRhdGEsIGRpciwgaW5lbjsKK30gZ3Bpb19iYW5rX3NhdmVkWzNdOworCitzdGF0aWMgdm9pZCBfX2lvbWVtICogY29uc3QgcG9ydF9iYXNlc1szXSA9IHsKKwkodm9pZCAqKVBPUlRDSU8sCisJKHZvaWQgKilQT1JURElPLAorCSh2b2lkICopUE9SVEVJTywKK307CisKK3ZvaWQgYmZpbl9zcGVjaWFsX2dwaW9fcG1faGliZXJuYXRlX3N1c3BlbmQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvcnRfYmFzZXMpOyArK2kpIHsKKwkJZ3Bpb19iYW5rX3NhdmVkW2ldLmRhdGEgPSByZWFkX1BPUlRJTyhwb3J0X2Jhc2VzW2ldKTsKKwkJZ3Bpb19iYW5rX3NhdmVkW2ldLmluZW4gPSByZWFkX1BPUlRJT19JTkVOKHBvcnRfYmFzZXNbaV0pOworCQlncGlvX2Jhbmtfc2F2ZWRbaV0uZGlyID0gcmVhZF9QT1JUSU9fRElSKHBvcnRfYmFzZXNbaV0pOworCX0KK30KKwordm9pZCBiZmluX3NwZWNpYWxfZ3Bpb19wbV9oaWJlcm5hdGVfcmVzdG9yZSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydF9iYXNlcyk7ICsraSkgeworCQl3cml0ZV9QT1JUSU9fSU5FTihwb3J0X2Jhc2VzW2ldLCBncGlvX2Jhbmtfc2F2ZWRbaV0uaW5lbik7CisJCXdyaXRlX1BPUlRJT19TRVQocG9ydF9iYXNlc1tpXSwKKwkJCWdwaW9fYmFua19zYXZlZFtpXS5kYXRhICYgZ3Bpb19iYW5rX3NhdmVkW2ldLmRpcik7CisJCXdyaXRlX1BPUlRJT19ESVIocG9ydF9iYXNlc1tpXSwgZ3Bpb19iYW5rX3NhdmVkW2ldLmRpcik7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCmluZGV4IDU1ZTdkMDcuLmI2Y2E5OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC0xMSw4ICsxMSw4IEBACiAgKi8KIAogLyogVGhpcyBmaWxlIHNob3VsZCBiZSB1cCB0byBkYXRlIHdpdGg6Ci0gKiAgLSBSZXZpc2lvbiBJLCAwNS8yNS8yMDEwOyBBRFNQLUJGNTM4L0JGNTM4RiBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0Ci0gKiAgLSBSZXZpc2lvbiBOLCAwNS8yNS8yMDEwOyBBRFNQLUJGNTM5L0JGNTM5RiBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CisgKiAgLSBSZXZpc2lvbiBKLCAwNS8yMy8yMDExOyBBRFNQLUJGNTM4L0JGNTM4RiBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CisgKiAgLSBSZXZpc2lvbiBPLCAwNS8yMy8yMDExOyBBRFNQLUJGNTM5L0JGNTM5RiBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CiAgKi8KIAogI2lmbmRlZiBfTUFDSF9BTk9NQUxZX0hfCkBAIC01NiwyNSArNTYsMjEgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDIyOSAoMSkKIC8qIFBQSV9GUzMgSXMgTm90IERyaXZlbiBpbiAyIG9yIDMgSW50ZXJuYWwgRnJhbWUgU3luYyBUcmFuc21pdCBNb2RlcyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjMzICgxKQotLyogSWYgSS1DYWNoZSBJcyBPbiwgQ1NZTkMvU1NZTkMvSURMRSBBcm91bmQgQ2hhbmdlIG9mIENvbnRyb2wgQ2F1c2VzIEZhaWx1cmVzICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAyNDQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKIC8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIGZyb20gYW4gQWNjZXNzIGluIHRoZSBTaGFkb3cgb2YgYSBDb25kaXRpb25hbCBCcmFuY2ggKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI0NSAoMSkKIC8qIE1heGltdW0gRXh0ZXJuYWwgQ2xvY2sgU3BlZWQgZm9yIFRpbWVycyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjUzICgxKQotLyogRENQTEJfRkFVTFRfQUREUiBNTVIgUmVnaXN0ZXIgTWF5IEJlIENvcnJ1cHRlZCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMjYxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCiAvKiBIaWdoIEkvTyBBY3Rpdml0eSBDYXVzZXMgT3V0cHV0IFZvbHRhZ2Ugb2YgSW50ZXJuYWwgVm9sdGFnZSBSZWd1bGF0b3IgKFZkZGludCkgdG8gRGVjcmVhc2UgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3MCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQogLyogQ2VydGFpbiBEYXRhIENhY2hlIFdyaXRldGhyb3VnaCBNb2RlcyBGYWlsIGZvciBWZGRpbnQgPD0gMC45ViAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMjcyICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjcyIChBTk9NQUxZX0JGNTM4KQogLyogV3JpdGVzIHRvIFN5bmNocm9ub3VzIFNEUkFNIE1lbW9yeSBNYXkgQmUgTG9zdCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjczIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCiAvKiBXcml0ZXMgdG8gYW4gSS9PIERhdGEgUmVnaXN0ZXIgT25lIFNDTEsgQ3ljbGUgYWZ0ZXIgYW4gRWRnZSBJcyBEZXRlY3RlZCBNYXkgQ2xlYXIgSW50ZXJydXB0ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKIC8qIERpc2FibGluZyBQZXJpcGhlcmFscyB3aXRoIERNQSBSdW5uaW5nIE1heSBDYXVzZSBETUEgU3lzdGVtIEluc3RhYmlsaXR5ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzggKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKLS8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIEV4Y2VwdGlvbiB3aGVuIElTUiBDb250ZXh0IElzIE5vdCBSZXN0b3JlZCAqLworLyogRmFsc2UgSGFyZHdhcmUgRXJyb3Igd2hlbiBJU1IgQ29udGV4dCBJcyBOb3QgUmVzdG9yZWQgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI4MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQogLyogTWVtb3J5IERNQSBDb3JydXB0aW9uIHdpdGggMzItQml0IERhdGEgYW5kIFRyYWZmaWMgQ29udHJvbCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjgyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCkBAIC0xMDIsOCArOTgsMTAgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQogLyogS2lsbGVkIFN5c3RlbSBNTVIgV3JpdGUgQ29tcGxldGVzIEVycm9uZW91c2x5IG9uIE5leHQgU3lzdGVtIE1NUiBBY2Nlc3MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxNSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogUEZ4IEdsaXRjaCBvbiBXcml0ZSB0byBQT1JURklPIG9yIFBPUlRGSU9fVE9HR0xFICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkJLyogWFhYOiBTYW1lIGFzIDA1MDAwMzE4ICovCiAvKiBQRnggR2xpdGNoIG9uIFdyaXRlIHRvIEZJT19GTEFHX0Qgb3IgRklPX0ZMQUdfVCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzE4IChBTk9NQUxZX0JGNTM5ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxOCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQkvKiBYWFg6IFNhbWUgYXMgMDUwMDAzMTcgKi8KIC8qIFJlZ3VsYXRvciBQcm9ncmFtbWluZyBCbG9ja2VkIHdoZW4gSGliZXJuYXRlIFdha2V1cCBTb3VyY2UgUmVtYWlucyBBY3RpdmUgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1NSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQogLyogU2VyaWFsIFBvcnQgKFNQT1JUKSBNdWx0aWNoYW5uZWwgVHJhbnNtaXQgRmFpbHVyZSB3aGVuIENoYW5uZWwgMCBJcyBEaXNhYmxlZCAqLwpAQCAtMTM0LDE2ICsxMzIsMzIgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2MSAoMSkKIC8qIFN5bmNocm9uaXphdGlvbiBQcm9ibGVtIGF0IFN0YXJ0dXAgTWF5IENhdXNlIFNQT1JUIFRyYW5zbWl0IENoYW5uZWxzIHRvIE1pc2FsaWduICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NjIgKDEpCi0vKiBJbnRlcnJ1cHRlZCAzMi1CaXQgU1BPUlQgRGF0YSBSZWdpc3RlciBBY2Nlc3MgUmVzdWx0cyBJbiBVbmRlcmZsb3cgKi8KKy8qIEludGVycnVwdGVkIFNQT1JUIFJlY2VpdmUgRGF0YSBSZWdpc3RlciBSZWFkIFJlc3VsdHMgSW4gVW5kZXJmbG93IHdoZW4gU0xFTiA+IDE1ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzMgKDEpCi0vKiBQb3NzaWJsZSBMb2NrdXAgQ29uZGl0aW9uIHdoZW0gTW9kaWZ5aW5nIFBMTCBmcm9tIEV4dGVybmFsIE1lbW9yeSAqLworLyogUG9zc2libGUgTG9ja3VwIENvbmRpdGlvbiB3aGVuIE1vZGlmeWluZyBQTEwgZnJvbSBFeHRlcm5hbCBNZW1vcnkgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ3NSAoMSkKIC8qIFRFU1RTRVQgSW5zdHJ1Y3Rpb24gQ2Fubm90IEJlIEludGVycnVwdGVkICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzcgKDEpCiAvKiBSZWFkcyBvZiBJVEVTVF9DT01NQU5EIGFuZCBJVEVTVF9EQVRBIFJlZ2lzdGVycyBDYXVzZSBDYWNoZSBDb3JydXB0aW9uICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0ODEgKDEpCi0vKiBJRkxVU0ggc3Vja3MgYXQgbGlmZSAqLworLyogUExMIE1heSBMYXRjaCBJbmNvcnJlY3QgVmFsdWVzIENvbWluZyBPdXQgb2YgUmVzZXQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ4OSAoMSkKKy8qIEluc3RydWN0aW9uIE1lbW9yeSBTdGFsbHMgQ2FuIENhdXNlIElGTFVTSCB0byBGYWlsICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0OTEgKDEpCisvKiBFWENQVCBJbnN0cnVjdGlvbiBNYXkgQmUgTG9zdCBJZiBOTUkgSGFwcGVucyBTaW11bHRhbmVvdXNseSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDk0ICgxKQorLyogUlhTIEJpdCBpbiBTUElfU1RBVCBNYXkgQmVjb21lIFN0dWNrIEluIFJYIERNQSBNb2RlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNTAxICgxKQorCisvKgorICogVGhlc2UgYW5vbWFsaWVzIGhhdmUgYmVlbiAicGhhc2VkIiBvdXQgb2YgYW5hbG9nLmNvbSBhbm9tYWx5IHNoZWV0cyBhbmQgYXJlCisgKiBoZXJlIHRvIHNob3cgcnVubmluZyBvbiBvbGRlciBzaWxpY29uIGp1c3QgaXNuJ3QgZmVhc2libGUuCisgKi8KKworLyogSWYgSS1DYWNoZSBJcyBPbiwgQ1NZTkMvU1NZTkMvSURMRSBBcm91bmQgQ2hhbmdlIG9mIENvbnRyb2wgQ2F1c2VzIEZhaWx1cmVzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNDQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKKy8qIERDUExCX0ZBVUxUX0FERFIgTU1SIFJlZ2lzdGVyIE1heSBCZSBDb3JydXB0ZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI2MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDA5OSAoMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggOGE1YmVlZS4uMzU2MWM3ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTgsNyArOCwxMCBAQAogI2RlZmluZSBfTUFDSF9HUElPX0hfCiAKICNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDE2CisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKy8qIFdlIG9ubHkgdXNlIHRoZSBzcGVjaWFsIGxvZ2ljIHdpdGggR1BJT0xJQiBkZXZpY2VzICovCiAjZGVmaW5lIEJGSU5fU1BFQ0lBTF9HUElPX0JBTktTIDMKKyNlbmRpZgogCiAjZGVmaW5lIEdQSU9fUEYwCTAJLyogUEYgKi8KICNkZWZpbmUgR1BJT19QRjEJMQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jCmluZGV4IGQxMTUwMmEuLjIxMmI5ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMKQEAgLTg2MSwxNiArODYxLDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzcpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3N19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3N19jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzg3N19wbGF0Zm9ybV9kYXRhIGJmaW5fYWQ3ODc3X3RzX2luZm8gPSB7CiAJLm1vZGVsCQkJPSA3ODc3LAogCS52cmVmX2RlbGF5X3VzZWNzCT0gNTAsCS8qIGludGVybmFsLCBubyBjYXBhY2l0b3IgKi8KQEAgLTg4NiwxMyArODgwLDYgQEAKIH07CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaWRldl9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBiZjU0eF9zcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MCkgXAogCXx8IGRlZmluZWQoQ09ORklHX01URF9NMjVQODBfTU9EVUxFKQpAQCAtOTE1LDcgKzkwMiw2IEBACiAJLm1heF9zcGVlZF9oegkJPSAxMjUwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkuYnVzX251bQkJPSAwLAogCS5jaGlwX3NlbGVjdCAgCQk9IDIsCi0JLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc3X2NoaXBfaW5mbywKIH0sCiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKQEAgLTkyNCw3ICs5MTAsNiBAQAogCQkubWF4X3NwZWVkX2h6ID0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSAxLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaWRldl9jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYwppbmRleCAzMTFiZjk5Li5jZDljYmI2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jCkBAIC0xMDE4LDI0ICsxMDE4LDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0gewogCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgXAotCXx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBhZDE4MzZfc3BpX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKIH07CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3NykgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3X01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc3X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3ODc3X3BsYXRmb3JtX2RhdGEgYmZpbl9hZDc4NzdfdHNfaW5mbyA9IHsKIAkubW9kZWwJCQk9IDc4NzcsCiAJLnZyZWZfZGVsYXlfdXNlY3MJPSA1MCwJLyogaW50ZXJuYWwsIG5vIGNhcGFjaXRvciAqLwpAQCAtMTA1MSwyMCArMTAzNyw2IEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19JTlBVVF9BRFhMMzRYX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfQURYTDM0WF9TUElfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZHhsMzR4X2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGJmaW5fc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0gewogI2lmIGRlZmluZWQoQ09ORklHX01URF9NMjVQODApIFwKIAl8fCBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwX01PRFVMRSkKQEAgLTEwODYsNyArMTA1OCw2IEBACiAJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDEsCiAJCS5jaGlwX3NlbGVjdCA9IDQsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmYWQxODM2X3NwaV9jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3NykgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3X01PRFVMRSkKQEAgLTEwOTcsNyArMTA2OCw2IEBACiAJCS5tYXhfc3BlZWRfaHoJCT0gMTI1MDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtCQk9IDAsCiAJCS5jaGlwX3NlbGVjdCAgCQk9IDIsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3N19jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQpAQCAtMTEwNiw3ICsxMDc2LDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gMSwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19JTlBVVF9BRFhMMzRYX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfQURYTDM0WF9TUElfTU9EVUxFKQpAQCAtMTExNyw3ICsxMDg2LDYgQEAKIAkJLm1heF9zcGVlZF9oegkJPSA1MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bQkJPSAxLAogCQkuY2hpcF9zZWxlY3QgIAkJPSAyLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZHhsMzR4X2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfTU9ERV8zLAogCX0sCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKaW5kZXggOWU3MDc4NS4uYWM5NmVlOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTExLDcgKzExLDcgQEAKICAqLwogCiAvKiBUaGlzIGZpbGUgc2hvdWxkIGJlIHVwIHRvIGRhdGUgd2l0aDoKLSAqICAtIFJldmlzaW9uIEosIDA2LzAzLzIwMTA7IEFEU1AtQkY1NDIvQkY1NDQvQkY1NDcvQkY1NDgvQkY1NDkgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAorICogIC0gUmV2aXNpb24gSywgMDUvMjMvMjAxMTsgQURTUC1CRjU0Mi9CRjU0NC9CRjU0Ny9CRjU0OC9CRjU0OSBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CiAgKi8KIAogI2lmbmRlZiBfTUFDSF9BTk9NQUxZX0hfCkBAIC0yOSwyNSArMjksMTQ3IEBACiAvKiBSeC5IIENhbm5vdCBCZSBVc2VkIHRvIEFjY2VzcyAxNi1iaXQgU3lzdGVtIE1NUiBSZWdpc3RlcnMgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyMiAoMSkKIC8qIERhdGEgQ29ycnVwdGlvbi9Db3JlIEhhbmcgd2l0aCBMMi9MMyBDb25maWd1cmVkIGluIFdyaXRlYmFjayBDYWNoZSBNb2RlICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAyMjAgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyMjAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKIC8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIGZyb20gYW4gQWNjZXNzIGluIHRoZSBTaGFkb3cgb2YgYSBDb25kaXRpb25hbCBCcmFuY2ggKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI0NSAoMSkKIC8qIFNlbnNpdGl2aXR5IFRvIE5vaXNlIHdpdGggU2xvdyBJbnB1dCBFZGdlIFJhdGVzIG9uIEV4dGVybmFsIFNQT1JUIFRYIGFuZCBSWCBDbG9ja3MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI2NSAoMSkKIC8qIENlcnRhaW4gRGF0YSBDYWNoZSBXcml0ZXRocm91Z2ggTW9kZXMgRmFpbCBmb3IgVmRkaW50IDw9IDAuOVYgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3MiAoMSkKLS8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIEV4Y2VwdGlvbiB3aGVuIElTUiBDb250ZXh0IElzIE5vdCBSZXN0b3JlZCAqLworLyogRmFsc2UgSGFyZHdhcmUgRXJyb3JzIENhdXNlZCBieSBGZXRjaGVzIGF0IHRoZSBCb3VuZGFyeSBvZiBSZXNlcnZlZCBNZW1vcnkgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMCAoMSkKKy8qIEZJRk8gQm9vdCBNb2RlIE5vdCBGdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMjUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIGJmcm9tX1N5c0NvbnRyb2woKSBGaXJtd2FyZSBGdW5jdGlvbiBQZXJmb3JtcyBJbXByb3BlciBTeXN0ZW0gUmVzZXQgKi8KKy8qCisgKiBOb3RlOiBhbm9tYWx5IHNoZWV0IHNheXMgdGhpcyBpcyBmaXhlZCB3aXRoIGJmNTR4LTAuMissIGJ1dCB0ZXN0aW5nCisgKiAgICAgICBzaG93cyB0aGF0IHRoZSBmaXggaXRzZWxmIGRvZXMgbm90IGNvdmVyIGFsbCBjYXNlcy4KKyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzUzICgxKQorLyogU2VyaWFsIFBvcnQgKFNQT1JUKSBNdWx0aWNoYW5uZWwgVHJhbnNtaXQgRmFpbHVyZSB3aGVuIENoYW5uZWwgMCBJcyBEaXNhYmxlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzU3ICgxKQorLyogRXh0ZXJuYWwgTWVtb3J5IFJlYWQgQWNjZXNzIEhhbmdzIENvcmUgV2l0aCBQTEwgQnlwYXNzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjAgKDEpCisvKiBETUFzIHRoYXQgR28gVXJnZW50IGR1cmluZyBUaWdodCBDb3JlIFdyaXRlcyB0byBFeHRlcm5hbCBNZW1vcnkgQXJlIEJsb2NrZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM2NSAoMSkKKy8qIEFkZHJlc3NpbmcgQ29uZmxpY3QgYmV0d2VlbiBCb290IFJPTSBhbmQgQXN5bmNocm9ub3VzIE1lbW9yeSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzY5ICgxKQorLyogUG9zc2libGUgUkVUUyBSZWdpc3RlciBDb3JydXB0aW9uIHdoZW4gU3Vicm91dGluZSBJcyB1bmRlciA1IEN5Y2xlcyBpbiBEdXJhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzcxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBTZWN1cml0eS9BdXRoZW50aWNhdGlvbiBTcGVlZHBhdGggQ2F1c2VzIEF1dGhlbnRpY2F0aW9uIFRvIEZhaWwgVG8gSW5pdGlhdGUgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3OCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogMTYtQml0IE5BTkQgRkxBU0ggQm9vdCBNb2RlIElzIE5vdCBGdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNzkgKDEpCisvKiBMb2NrYm94IFNFU1IgRGlzYWxsb3dzIENlcnRhaW4gVXNlciBJbnRlcnJ1cHRzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIExvY2tib3ggU0VTUiBGaXJtd2FyZSBEb2VzIE5vdCBTYXZlL1Jlc3RvcmUgRnVsbCBDb250ZXh0ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDUgKDEpCisvKiBMb2NrYm94IFNFU1IgQXJndW1lbnQgQ2hlY2tpbmcgRG9lcyBOb3QgQ2hlY2sgTDIgTWVtb3J5IFByb3RlY3Rpb24gUmFuZ2UgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwNiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogTG9ja2JveCBTRVNSIEZpcm13YXJlIEFyZ3VtZW50cyBBcmUgTm90IFJldGFpbmVkIEFmdGVyIEZpcnN0IEluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIExvY2tib3ggRmlybXdhcmUgTWVtb3J5IENsZWFudXAgUm91dGluZSBEb2VzIG5vdCBDbGVhciBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwOCAoMSkKKy8qIExvY2tib3ggZmlybXdhcmUgbGVhdmVzIE1ETUEwIGNoYW5uZWwgZW5hYmxlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDA5IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBiZnJvbV9TeXNDb250cm9sKCkgRmlybXdhcmUgRnVuY3Rpb24gQ2Fubm90IGJlIFVzZWQgdG8gRW50ZXIgUG93ZXIgU2F2aW5nIE1vZGVzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTEgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIE5BTkQgQm9vdCBNb2RlIE5vdCBDb21wYXRpYmxlIFdpdGggU29tZSBOQU5EIEZsYXNoIERldmljZXMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxMyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogT1RQX0NIRUNLX0ZPUl9QUkVWX1dSSVRFIEJpdCBpcyBOb3QgRnVuY3Rpb25hbCBpbiBiZnJvbV9PdHBXcml0ZSgpIEFQSSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDE0IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIENhbiBDYXVzZSBVbmRlc2lyZWQgRXh0ZXJuYWwgRklGTyBPcGVyYXRpb25zICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTYgKDEpCisvKiBNdWx0aWNoYW5uZWwgU1BPUlQgQ2hhbm5lbCBNaXNhbGlnbm1lbnQgVW5kZXIgU3BlY2lmaWMgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI1IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIG9mIEluZGlyZWN0LVBvaW50ZXIgSW5zdHJ1Y3Rpb25zIENhbiBDYXVzZSBGYWxzZSBIYXJkd2FyZSBFcnJvcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyNiAoMSkKKy8qIENPUkVfRVBQSV9QUklPIGJpdCBhbmQgU1lTX0VQUElfUFJJTyBiaXQgaW4gdGhlIEhNRE1BMV9DT05UUk9MIHJlZ2lzdGVyIGFyZSBub3QgZnVuY3Rpb25hbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBXQl9FREdFIEJpdCBpbiBORkNfSVJRU1RBVCBJbmNvcnJlY3RseSBSZWZsZWN0cyBCdWZmZXIgU3RhdHVzIEluc3RlYWQgb2YgSVJRIFN0YXR1cyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI5IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBTb2Z0d2FyZSBTeXN0ZW0gUmVzZXQgQ29ycnVwdHMgUExMX0xPQ0tDTlQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzMCAoX19TSUxJQ09OX1JFVklTSU9OX18gPj0gMikKKy8qIEluY29ycmVjdCBVc2Ugb2YgU3RhY2sgaW4gTG9ja2JveCBGaXJtd2FyZSBEdXJpbmcgQXV0aGVudGljYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzMSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogU1cgQnJlYWtwb2ludHMgSWdub3JlZCBVcG9uIFJldHVybiBGcm9tIExvY2tib3ggQXV0aGVudGljYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzNCAoMSkKKy8qIElGTFVTSCBJbnN0cnVjdGlvbiBhdCBFbmQgb2YgSGFyZHdhcmUgTG9vcCBDYXVzZXMgSW5maW5pdGUgU3RhbGwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0MyAoMSkKKy8qIENETUFQUklPIGFuZCBMMkRNQVBSSU8gQml0cyBpbiB0aGUgU1lTQ1IgUmVnaXN0ZXIgQXJlIE5vdCBGdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NDYgKDEpCisvKiBVQVJUIElyREEgUmVjZWl2ZXIgRmFpbHMgb24gRXh0ZW5kZWQgQml0IFB1bHNlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQ3ICgxKQorLyogRERSIENsb2NrIER1dHkgQ3ljbGUgU3BlYyBWaW9sYXRpb24gKHRDSCwgdENMKSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQ4IChfX1NJTElDT05fUkVWSVNJT05fXyA9PSAxKQorLyogUmVkdWNlZCBUaW1pbmcgTWFyZ2lucyBvbiBERFIgT3V0cHV0IFNldHVwIGFuZCBIb2xkICh0RFMgYW5kIHRESCkgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0OSAoX19TSUxJQ09OX1JFVklTSU9OX18gPT0gMSkKKy8qIFVTQiBETUEgU2hvcnQgUGFja2V0IERhdGEgQ29ycnVwdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDUwICgxKQorLyogVVNCIFJlY2VpdmUgSW50ZXJydXB0IElzIE5vdCBHZW5lcmF0ZWQgaW4gRE1BIE1vZGUgMSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDU2ICgxKQorLyogSG9zdCBETUEgUG9ydCBSZXNwb25kcyB0byBDZXJ0YWluIEJ1cyBBY3Rpdml0eSBXaXRob3V0IEhPU1RfQ0UgQXNzZXJ0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NTcgKDEpCisvKiBVU0IgRE1BIE1vZGUgMSBGYWlsdXJlIFdoZW4gTXVsdGlwbGUgVVNCIERNQSBDaGFubmVscyBBcmUgQ29uY3VycmVudGx5IEVuYWJsZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2MCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogRmFsc2UgSGFyZHdhcmUgRXJyb3Igd2hlbiBSRVRJIFBvaW50cyB0byBJbnZhbGlkIE1lbW9yeSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDYxICgxKQorLyogU3luY2hyb25pemF0aW9uIFByb2JsZW0gYXQgU3RhcnR1cCBNYXkgQ2F1c2UgU1BPUlQgVHJhbnNtaXQgQ2hhbm5lbHMgdG8gTWlzYWxpZ24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2MiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogVVNCIERNQSBSWCBEYXRhIENvcnJ1cHRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2MyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogVVNCIFRYIERNQSBIYW5nICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NjQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIFVTQiBSeCBETUEgSGFuZyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDY1ICgxKQorLyogVHhQa3RSZHkgQml0IE5vdCBTZXQgZm9yIFRyYW5zbWl0IEVuZHBvaW50IFdoZW4gQ29yZSBhbmQgRE1BIEFjY2VzcyBVU0IgRW5kcG9pbnQgRklGT3MgU2ltdWx0YW5lb3VzbHkgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2NiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogUG9zc2libGUgVVNCIFJYIERhdGEgQ29ycnVwdGlvbiBXaGVuIENvbnRyb2wgJiBEYXRhIEVQIEZJRk9zIGFyZSBBY2Nlc3NlZCB2aWEgdGhlIENvcmUgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogSW50ZXJydXB0ZWQgU1BPUlQgUmVjZWl2ZSBEYXRhIFJlZ2lzdGVyIFJlYWQgUmVzdWx0cyBJbiBVbmRlcmZsb3cgd2hlbiBTTEVOID4gMTUgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ3MyAoMSkKKy8qIEFjY2VzcyB0byBERFIgU0RSQU0gQ2F1c2VzIFN5c3RlbSBIYW5nIHdpdGggQ2VydGFpbiBQTEwgU2V0dGluZ3MgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ3NCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogVEVTVFNFVCBJbnN0cnVjdGlvbiBDYW5ub3QgQmUgSW50ZXJydXB0ZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ3NyAoMSkKKy8qIFJlYWRzIG9mIElURVNUX0NPTU1BTkQgYW5kIElURVNUX0RBVEEgUmVnaXN0ZXJzIENhdXNlIENhY2hlIENvcnJ1cHRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ4MSAoMSkKKy8qIFBvc3NpYmxlIFVTQiBEYXRhIENvcnJ1cHRpb24gV2hlbiBNdWx0aXBsZSBFbmRwb2ludHMgQXJlIEFjY2Vzc2VkIGJ5IHRoZSBDb3JlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0ODMgKDEpCisvKiBERFIgVHJpbSBNYXkgTm90IEJlIFBlcmZvcm1lZCBmb3IgQ2VydGFpbiBWTEVWIFZhbHVlcyBpbiBPVFAgUGFnZSBQQlMwMEwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ4NCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogUExMX0NUTCBDaGFuZ2UgVXNpbmcgYmZyb21fU3lzQ29udHJvbCgpIENhbiBSZXN1bHQgaW4gUHJvY2Vzc29yIE92ZXJjbG9ja2luZyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDg1IChfX1NJTElDT05fUkVWSVNJT05fXyA+IDEgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogUExMIE1heSBMYXRjaCBJbmNvcnJlY3QgVmFsdWVzIENvbWluZyBPdXQgb2YgUmVzZXQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ4OSAoMSkKKy8qIFNQSSBNYXN0ZXIgQm9vdCBDYW4gRmFpbCBVbmRlciBDZXJ0YWluIENvbmRpdGlvbnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ5MCAoMSkKKy8qIEluc3RydWN0aW9uIE1lbW9yeSBTdGFsbHMgQ2FuIENhdXNlIElGTFVTSCB0byBGYWlsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0OTEgKDEpCisvKiBFWENQVCBJbnN0cnVjdGlvbiBNYXkgQmUgTG9zdCBJZiBOTUkgSGFwcGVucyBTaW11bHRhbmVvdXNseSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDk0ICgxKQorLyogQ05UX0NPTU1BTkQgRnVuY3Rpb25hbGl0eSBEZXBlbmRzIG9uIENOVF9JTUFTSyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0OTggKDEpCisvKiBOYW5kIEZsYXNoIENvbnRyb2xsZXIgSGFuZ3MgV2hlbiB0aGUgQU1DIFJlcXVlc3RzIHRoZSBBc3luYyBQaW5zIER1cmluZyB0aGUgbGFzdCAxNiBCeXRlcyBvZiBhIFBhZ2UgV3JpdGUgT3BlcmF0aW9uLiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNTAwICgxKQorLyogUlhTIEJpdCBpbiBTUElfU1RBVCBNYXkgQmVjb21lIFN0dWNrIEluIFJYIERNQSBNb2RlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNTAxICgxKQorLyogQXN5bmMgTWVtb3J5IFdyaXRlcyBNYXkgQmUgU2tpcHBlZCBXaGVuIFVzaW5nIE9kZCBDbG9jayBSYXRpb3MgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDUwMiAoMSkKKworLyoKKyAqIFRoZXNlIGFub21hbGllcyBoYXZlIGJlZW4gInBoYXNlZCIgb3V0IG9mIGFuYWxvZy5jb20gYW5vbWFseSBzaGVldHMgYW5kIGFyZQorICogaGVyZSB0byBzaG93IHJ1bm5pbmcgb24gb2xkZXIgc2lsaWNvbiBqdXN0IGlzbid0IGZlYXNpYmxlLgorICovCisKKy8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIHdoZW4gSVNSIENvbnRleHQgSXMgTm90IFJlc3RvcmVkICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyODEgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKIC8qIFNTWU5DcyBBZnRlciBXcml0ZXMgVG8gQ0FOL0RNQSBNTVIgUmVnaXN0ZXJzIEFyZSBOb3QgQWx3YXlzIEhhbmRsZWQgQ29ycmVjdGx5ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMDQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKLS8qIEZhbHNlIEhhcmR3YXJlIEVycm9ycyBDYXVzZWQgYnkgRmV0Y2hlcyBhdCB0aGUgQm91bmRhcnkgb2YgUmVzZXJ2ZWQgTWVtb3J5ICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzMTAgKDEpCiAvKiBFcnJvcnMgd2hlbiBTU1lOQywgQ1NZTkMsIG9yIExvYWRzIHRvIExULCBMQiBhbmQgTEMgUmVnaXN0ZXJzIEFyZSBJbnRlcnJ1cHRlZCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCiAvKiBUV0kgU2xhdmUgQm9vdCBNb2RlIElzIE5vdCBGdW5jdGlvbmFsICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMjQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKLS8qIEZJRk8gQm9vdCBNb2RlIE5vdCBGdW5jdGlvbmFsICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzMjUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKIC8qIERhdGEgTG9zdCBXaGVuIENvcmUgYW5kIERNQSBBY2Nlc3NlcyBBcmUgTWFkZSB0byB0aGUgVVNCIEZJRk8gU2ltdWx0YW5lb3VzbHkgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMyNyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQogLyogSW5jb3JyZWN0IEFjY2VzcyBvZiBPVFBfU1RBVFVTIER1cmluZyBvdHBfd3JpdGUoKSBGdW5jdGlvbiAqLwpAQCAtODAsNDAgKzIwMiwxOCBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzQ5IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCiAvKiBQTEwgU3RhdHVzIFJlZ2lzdGVyIElzIEluYWNjdXJhdGUgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQotLyogYmZyb21fU3lzQ29udHJvbCgpIEZpcm13YXJlIEZ1bmN0aW9uIFBlcmZvcm1zIEltcHJvcGVyIFN5c3RlbSBSZXNldCAqLwotLyoKLSAqIE5vdGU6IGFub21hbHkgc2hlZXQgc2F5cyB0aGlzIGlzIGZpeGVkIHdpdGggYmY1NHgtMC4yKywgYnV0IHRlc3RpbmcKLSAqICAgICAgIHNob3dzIHRoYXQgdGhlIGZpeCBpdHNlbGYgZG9lcyBub3QgY292ZXIgYWxsIGNhc2VzLgotICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzNTMgKDEpCiAvKiBSZWd1bGF0b3IgUHJvZ3JhbW1pbmcgQmxvY2tlZCB3aGVuIEhpYmVybmF0ZSBXYWtldXAgU291cmNlIFJlbWFpbnMgQWN0aXZlICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKIC8qIFN5c3RlbSBTdGFsbGVkIER1cmluZyBBIENvcmUgQWNjZXNzIFRvIEFNQyBXaGlsZSBBIENvcmUgQWNjZXNzIFRvIE5GQyBGSUZPIElzIFJlcXVpcmVkICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTYgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKLS8qIFNlcmlhbCBQb3J0IChTUE9SVCkgTXVsdGljaGFubmVsIFRyYW5zbWl0IEZhaWx1cmUgd2hlbiBDaGFubmVsIDAgSXMgRGlzYWJsZWQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1NyAoMSkKLS8qIEV4dGVybmFsIE1lbW9yeSBSZWFkIEFjY2VzcyBIYW5ncyBDb3JlIFdpdGggUExMIEJ5cGFzcyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzYwICgxKQotLyogRE1BcyB0aGF0IEdvIFVyZ2VudCBkdXJpbmcgVGlnaHQgQ29yZSBXcml0ZXMgdG8gRXh0ZXJuYWwgTWVtb3J5IEFyZSBCbG9ja2VkICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzNjUgKDEpCiAvKiBXVVJFU0VUIEJpdCBJbiBTWVNDUiBSZWdpc3RlciBEb2VzIE5vdCBQcm9wZXJseSBJbmRpY2F0ZSBIaWJlcm5hdGUgV2FrZS1VcCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzY3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCi0vKiBBZGRyZXNzaW5nIENvbmZsaWN0IGJldHdlZW4gQm9vdCBST00gYW5kIEFzeW5jaHJvbm91cyBNZW1vcnkgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDM2OSAoMSkKIC8qIERlZmF1bHQgUExMIE1TRUwgYW5kIFNTRUwgU2V0dGluZ3MgQ2FuIENhdXNlIDQwME1IeiBQcm9kdWN0IFRvIFZpb2xhdGUgU3BlY2lmaWNhdGlvbnMgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3MCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQotLyogUG9zc2libGUgUkVUUyBSZWdpc3RlciBDb3JydXB0aW9uIHdoZW4gU3Vicm91dGluZSBJcyB1bmRlciA1IEN5Y2xlcyBpbiBEdXJhdGlvbiAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzcxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCiAvKiBVU0IgRFAvRE0gRGF0YSBQaW5zIE1heSBMb3NlIFN0YXRlIFdoZW4gRW50ZXJpbmcgSGliZXJuYXRlICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNzIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKLS8qIFNlY3VyaXR5L0F1dGhlbnRpY2F0aW9uIFNwZWVkcGF0aCBDYXVzZXMgQXV0aGVudGljYXRpb24gVG8gRmFpbCBUbyBJbml0aWF0ZSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzc4IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCi0vKiAxNi1CaXQgTkFORCBGTEFTSCBCb290IE1vZGUgSXMgTm90IEZ1bmN0aW9uYWwgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3OSAoMSkKIC8qIDgtQml0IE5BTkQgRmxhc2ggQm9vdCBNb2RlIE5vdCBGdW5jdGlvbmFsICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzODIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKLS8qIFNvbWUgQVRBUEkgTW9kZXMgQXJlIE5vdCBGdW5jdGlvbmFsICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzODMgKDEpCiAvKiBCb290IGZyb20gT1RQIE1lbW9yeSBOb3QgRnVuY3Rpb25hbCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg1IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCiAvKiBiZnJvbV9TeXNDb250cm9sKCkgRmlybXdhcmUgUm91dGluZSBOb3QgRnVuY3Rpb25hbCAqLwpAQCAtMTQwLDkyICsyNDAsMTAgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM5NiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQogLyogQktfT05FUywgQktfWkVST1MsIGFuZCBCS19EQVRFQ09ERSBDb25zdGFudHMgTm90IEZ1bmN0aW9uYWwgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM5NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQotLyogTG9ja2JveCBTRVNSIERpc2FsbG93cyBDZXJ0YWluIFVzZXIgSW50ZXJydXB0cyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDA0IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCi0vKiBMb2NrYm94IFNFU1IgRmlybXdhcmUgRG9lcyBOb3QgU2F2ZS9SZXN0b3JlIEZ1bGwgQ29udGV4dCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDA1ICgxKQotLyogTG9ja2JveCBTRVNSIEFyZ3VtZW50IENoZWNraW5nIERvZXMgTm90IENoZWNrIEwyIE1lbW9yeSBQcm90ZWN0aW9uIFJhbmdlICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0MDYgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKLS8qIExvY2tib3ggU0VTUiBGaXJtd2FyZSBBcmd1bWVudHMgQXJlIE5vdCBSZXRhaW5lZCBBZnRlciBGaXJzdCBJbml0aWFsaXphdGlvbiAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDA3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCi0vKiBMb2NrYm94IEZpcm13YXJlIE1lbW9yeSBDbGVhbnVwIFJvdXRpbmUgRG9lcyBub3QgQ2xlYXIgUmVnaXN0ZXJzICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0MDggKDEpCi0vKiBMb2NrYm94IGZpcm13YXJlIGxlYXZlcyBNRE1BMCBjaGFubmVsIGVuYWJsZWQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwOSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQotLyogYmZyb21fU3lzQ29udHJvbCgpIEZpcm13YXJlIEZ1bmN0aW9uIENhbm5vdCBiZSBVc2VkIHRvIEVudGVyIFBvd2VyIFNhdmluZyBNb2RlcyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDExIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCi0vKiBOQU5EIEJvb3QgTW9kZSBOb3QgQ29tcGF0aWJsZSBXaXRoIFNvbWUgTkFORCBGbGFzaCBEZXZpY2VzICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0MTMgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKLS8qIE9UUF9DSEVDS19GT1JfUFJFVl9XUklURSBCaXQgaXMgTm90IEZ1bmN0aW9uYWwgaW4gYmZyb21fT3RwV3JpdGUoKSBBUEkgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxNCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQotLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBDYW4gQ2F1c2UgVW5kZXNpcmVkIEV4dGVybmFsIEZJRk8gT3BlcmF0aW9ucyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDE2ICgxKQotLyogTXVsdGljaGFubmVsIFNQT1JUIENoYW5uZWwgTWlzYWxpZ25tZW50IFVuZGVyIFNwZWNpZmljIENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyNSAoMSkKLS8qIFNwZWN1bGF0aXZlIEZldGNoZXMgb2YgSW5kaXJlY3QtUG9pbnRlciBJbnN0cnVjdGlvbnMgQ2FuIENhdXNlIEZhbHNlIEhhcmR3YXJlIEVycm9ycyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI2ICgxKQotLyogQ09SRV9FUFBJX1BSSU8gYml0IGFuZCBTWVNfRVBQSV9QUklPIGJpdCBpbiB0aGUgSE1ETUExX0NPTlRST0wgcmVnaXN0ZXIgYXJlIG5vdCBmdW5jdGlvbmFsICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0MjcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKLS8qIFdCX0VER0UgQml0IGluIE5GQ19JUlFTVEFUIEluY29ycmVjdGx5IFJlZmxlY3RzIEJ1ZmZlciBTdGF0dXMgSW5zdGVhZCBvZiBJUlEgU3RhdHVzICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0MjkgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKLS8qIFNvZnR3YXJlIFN5c3RlbSBSZXNldCBDb3JydXB0cyBQTExfTE9DS0NOVCBSZWdpc3RlciAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMwIChfX1NJTElDT05fUkVWSVNJT05fXyA+PSAyKQotLyogSW5jb3JyZWN0IFVzZSBvZiBTdGFjayBpbiBMb2NrYm94IEZpcm13YXJlIER1cmluZyBBdXRoZW50aWNhdGlvbiAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCi0vKiBTVyBCcmVha3BvaW50cyBJZ25vcmVkIFVwb24gUmV0dXJuIEZyb20gTG9ja2JveCBBdXRoZW50aWNhdGlvbiAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM0ICgxKQogLyogT1RQIFdyaXRlIEFjY2Vzc2VzIE5vdCBTdXBwb3J0ZWQgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0MiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQotLyogSUZMVVNIIEluc3RydWN0aW9uIGF0IEVuZCBvZiBIYXJkd2FyZSBMb29wIENhdXNlcyBJbmZpbml0ZSBTdGFsbCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQzICgxKQotLyogQ0RNQVBSSU8gYW5kIEwyRE1BUFJJTyBCaXRzIGluIHRoZSBTWVNDUiBSZWdpc3RlciBBcmUgTm90IEZ1bmN0aW9uYWwgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0NiAoMSkKLS8qIFVBUlQgSXJEQSBSZWNlaXZlciBGYWlscyBvbiBFeHRlbmRlZCBCaXQgUHVsc2VzICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0NDcgKDEpCi0vKiBERFIgQ2xvY2sgRHV0eSBDeWNsZSBTcGVjIFZpb2xhdGlvbiAodENILCB0Q0wpICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0NDggKF9fU0lMSUNPTl9SRVZJU0lPTl9fID09IDEpCi0vKiBSZWR1Y2VkIFRpbWluZyBNYXJnaW5zIG9uIEREUiBPdXRwdXQgU2V0dXAgYW5kIEhvbGQgKHREUyBhbmQgdERIKSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQ5IChfX1NJTElDT05fUkVWSVNJT05fXyA9PSAxKQotLyogVVNCIERNQSBNb2RlIDEgU2hvcnQgUGFja2V0IERhdGEgQ29ycnVwdGlvbiAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDUwICgxKQogLyogSW5jb3JyZWN0IERlZmF1bHQgSHlzdGVyZXNpcyBTZXR0aW5nIGZvciBSRVNFVCwgTk1JLCBhbmQgQk1PREUgU2lnbmFscyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDUyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCi0vKiBVU0IgUmVjZWl2ZSBJbnRlcnJ1cHQgSXMgTm90IEdlbmVyYXRlZCBpbiBETUEgTW9kZSAxICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0NTYgKDEpCi0vKiBIb3N0IERNQSBQb3J0IFJlc3BvbmRzIHRvIENlcnRhaW4gQnVzIEFjdGl2aXR5IFdpdGhvdXQgSE9TVF9DRSBBc3NlcnRpb24gKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ1NyAoMSkKLS8qIFVTQiBETUEgTW9kZSAxIEZhaWx1cmUgV2hlbiBNdWx0aXBsZSBVU0IgRE1BIENoYW5uZWxzIEFyZSBDb25jdXJyZW50bHkgRW5hYmxlZCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDYwICgxKQotLyogRmFsc2UgSGFyZHdhcmUgRXJyb3Igd2hlbiBSRVRJIFBvaW50cyB0byBJbnZhbGlkIE1lbW9yeSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDYxICgxKQotLyogU3luY2hyb25pemF0aW9uIFByb2JsZW0gYXQgU3RhcnR1cCBNYXkgQ2F1c2UgU1BPUlQgVHJhbnNtaXQgQ2hhbm5lbHMgdG8gTWlzYWxpZ24gKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2MiAoMSkKLS8qIFVTQiBETUEgUlggRGF0YSBDb3JydXB0aW9uICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0NjMgKDEpCi0vKiBVU0IgVFggRE1BIEhhbmcgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2NCAoMSkKLS8qIFVTQiBSeCBETUEgaGFuZyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDY1ICgxKQotLyogVHhQa3RSZHkgQml0IE5vdCBTZXQgZm9yIFRyYW5zbWl0IEVuZHBvaW50IFdoZW4gQ29yZSBhbmQgRE1BIEFjY2VzcyBVU0IgRW5kcG9pbnQgRklGT3MgU2ltdWx0YW5lb3VzbHkgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2NiAoMSkKLS8qIFBvc3NpYmxlIFJYIGRhdGEgY29ycnVwdGlvbiB3aGVuIGNvbnRyb2wgJiBkYXRhIEVQIEZJRk9zIGFyZSBhY2Nlc3NlZCB2aWEgdGhlIGNvcmUgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ2NyAoMSkKLS8qIEludGVycnVwdGVkIDMyLUJpdCBTUE9SVCBEYXRhIFJlZ2lzdGVyIEFjY2VzcyBSZXN1bHRzIEluIFVuZGVyZmxvdyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDczICgxKQotLyogQWNjZXNzIHRvIEREUi1TRFJBTSBjYXVzZXMgc3lzdGVtIGhhbmcgdW5kZXIgY2VydGFpbiBQTEwvVlIgc2V0dGluZ3MgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ3NCAoMSkKLS8qIFRFU1RTRVQgSW5zdHJ1Y3Rpb24gQ2Fubm90IEJlIEludGVycnVwdGVkICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0NzcgKDEpCi0vKiBSZWFkcyBvZiBJVEVTVF9DT01NQU5EIGFuZCBJVEVTVF9EQVRBIFJlZ2lzdGVycyBDYXVzZSBDYWNoZSBDb3JydXB0aW9uICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0ODEgKDEpCi0vKiBQb3NzaWJsZSBVU0IgRGF0YSBDb3JydXB0aW9uIFdoZW4gTXVsdGlwbGUgRW5kcG9pbnRzIEFyZSBBY2Nlc3NlZCBieSB0aGUgQ29yZSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDgzICgxKQotLyogRERSIFRyaW0gTWF5IE5vdCBCZSBQZXJmb3JtZWQgZm9yIENlcnRhaW4gVkxFViBWYWx1ZXMgaW4gT1RQIFBhZ2UgUEJTMDBMICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0ODQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKLS8qIFBMTF9DVEwgQ2hhbmdlIFVzaW5nIGJmcm9tX1N5c0NvbnRyb2woKSBDYW4gUmVzdWx0IGluIFByb2Nlc3NvciBPdmVyY2xvY2tpbmcgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ4NSAoX19TSUxJQ09OX1JFVklTSU9OX18gPj0gMikKLS8qIElGTFVTSCBzdWNrcyBhdCBsaWZlICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0OTEgKDEpCiAKIC8qIEFub21hbGllcyB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgcHJvYyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMDk5ICgwKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA3ZGI0MzM1Li4zNWM4Y2VkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTcwLDYgKzE3MCw4IEBACiAKICNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDE2MAogCisjZGVmaW5lIEJGSU5fR1BJT19QSU5UIDEKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogc3RydWN0IGdwaW9fcG9ydF90IHsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvaXJxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2lycS5oCmluZGV4IDUzM2I4MDkuLjEwZGMxNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvaXJxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9pcnEuaApAQCAtNDM4LDcgKzQzOCw3IEBACiBzdHJ1Y3QgYmZpbl9waW50X3JlZ3MgewogCXUzMiBtYXNrX3NldDsKIAl1MzIgbWFza19jbGVhcjsKLQl1MzIgaXJxOworCXUzMiByZXF1ZXN0OwogCXUzMiBhc3NpZ247CiAJdTMyIGVkZ2Vfc2V0OwogCXUzMiBlZGdlX2NsZWFyOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9hY3ZpbG9uLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2Fjdmlsb24uYwppbmRleCA5MjMxYTk0Li45NzJlMTM0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2Fjdmlsb24uYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2Fjdmlsb24uYwpAQCAtMzY0LDE0ICszNjQsNiBAQAogLyogRGF0YUZsYXNoIGNoaXAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBkYXRhX2ZsYXNoX2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsCS8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAgKi8KLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKQEAgLTQyMCw3ICs0MTIsNiBAQAogCSAubWF4X3NwZWVkX2h6ID0gMzEyNTAwMCwJLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCSAuYnVzX251bSA9IDAsCiAJIC5jaGlwX3NlbGVjdCA9IDMsCi0JIC5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKIAkgfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX01URF9EQVRBRkxBU0gpIHx8IGRlZmluZWQoQ09ORklHX01URF9EQVRBRkxBU0hfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCmluZGV4IDg3NTk1Y2QuLmU0ZjM5N2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKQEAgLTYwLDI5ICs2MCw2IEBACiAvKiBTUEkgZmxhc2ggY2hpcCAobTI1cDY0KSAqLwogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9mbGFzaF9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLwotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TUElfQURDX01PRFVMRSkKLS8qIFNQSSBBREMgY2hpcCAqLwotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZGNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMSwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KLQkuYml0c19wZXJfd29yZCA9IDE2LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1gpIHx8IGRlZmluZWQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODNYX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBhZDE4MzZfc3BpX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLmJpdHNfcGVyX3dvcmQgPSAxNiwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIG1tY19zcGlfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCiAKQEAgLTEwMCwyNCArNzcsMTIgQEAKIAl9LAogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NQSV9BREMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU1BJX0FEQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAiYmZpbl9zcGlfYWRjIiwgLyogTmFtZSBvZiBzcGlfZHJpdmVyIGZvciB0aGlzIGRldmljZSAqLwotCQkubWF4X3NwZWVkX2h6ID0gNjI1MDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLwotCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuICovCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwgLyogTm8gc3BpX2RyaXZlciBzcGVjaWZpYyBjb25maWcgKi8KLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWRjX2NoaXBfaW5mbywKLQl9LAotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWCkgfHwgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1hfTU9EVUxFKQogCXsKIAkJLm1vZGFsaWFzID0gImFkMTgzeCIsCiAJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDQsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmYWQxODM2X3NwaV9jaGlwX2luZm8sCiAJfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQpAQCAtMTI2LDcgKzkxLDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDIwMDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDEsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmbW1jX3NwaV9jaGlwX2luZm8sCiAJCS5tb2RlID0gU1BJX01PREVfMywKIAl9LAogI2VuZGlmCkBAIC01MzIsNiArNDk2LDI0IEBACiAjZW5kaWYKIH07CiAKK3N0YXRpYyBpbnQgX19pbml0IG5ldDIyNzJfaW5pdCh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9ORVQyMjcyKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTkVUMjI3Ml9NT0RVTEUpCisJaW50IHJldDsKKworCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX1BGNDYsICJuZXQyMjcyIik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlc2V0IFVTQiBDaGlwLCBQRjQ2ICovCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUEY0NiwgMCk7CisJbWRlbGF5KDIpOworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUEY0NiwgMSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBjbV9iZjU2MV9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogcmVnaXN0ZXJpbmcgZGV2aWNlIHJlc291cmNlc1xuIiwgX19mdW5jX18pOwpAQCAtNTQzLDYgKzUyNSwxMCBAQAogI2lmIGRlZmluZWQoQ09ORklHX1BBVEFfUExBVEZPUk0pIHx8IGRlZmluZWQoQ09ORklHX1BBVEFfUExBVEZPUk1fTU9EVUxFKQogCWlycV9zZXRfc3RhdHVzX2ZsYWdzKFBBVEFfSU5ULCBJUlFfTk9BVVRPRU4pOwogI2VuZGlmCisKKwlpZiAobmV0MjI3Ml9pbml0KCkpCisJCXByX3dhcm5pbmcoInVuYWJsZSB0byBjb25maWd1cmUgbmV0MjI3MjsgaXQgcHJvYmFibHkgd29uJ3Qgd29ya1xuIik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCmluZGV4IDUwNjc5ODQuLjk0OTBkYzggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKQEAgLTEwOCw2ICsxMDgsOSBAQAogCQkuZW5kID0gMHgyQzAwMDAwMCArIDB4N0YsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sIHsKKwkJLnN0YXJ0ID0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9CVVMsCisJfSwgewogCQkuc3RhcnQgPSBJUlFfUEYxMCwKIAkJLmVuZCA9IElSUV9QRjEwLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0xPV0xFVkVMLApAQCAtMjgzLDIxICsyODYsNiBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE4M1gpIFwKLQl8fCBkZWZpbmVkKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTgzWF9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgYWQxODM2X3NwaV9jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAwLAotCS5iaXRzX3Blcl93b3JkID0gMTYsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMCwKLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQogLyogU1BJICgwKSAqLwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NwaTBfcmVzb3VyY2VbXSA9IHsKQEAgLTM0NSw3ICszMzMsNiBAQAogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDQsCiAJCS5wbGF0Zm9ybV9kYXRhID0gImFkMTgzNiIsIC8qIG9ubHkgaW5jbHVkZXMgY2hpcCBuYW1lIGZvciB0aGUgbW9tZW50ICovCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmYWQxODM2X3NwaV9jaGlwX2luZm8sCiAJCS5tb2RlID0gU1BJX01PREVfMywKIAl9LAogI2VuZGlmCkBAIC0zNTUsNyArMzQyLDYgQEAKIAkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKIAkJLmNoaXBfc2VsZWN0ID0gMSwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKIH07CkBAIC01MTYsNiArNTAyLDI0IEBACiAjZW5kaWYKIH07CiAKK3N0YXRpYyBpbnQgX19pbml0IG5ldDIyNzJfaW5pdCh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9ORVQyMjcyKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTkVUMjI3Ml9NT0RVTEUpCisJaW50IHJldDsKKworCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX1BGMTEsICJuZXQyMjcyIik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlc2V0IHRoZSBVU0IgY2hpcCAqLworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BGMTEsIDApOworCW1kZWxheSgyKTsKKwlncGlvX3NldF92YWx1ZShHUElPX1BGMTEsIDEpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX2luaXQgZXpraXRfaW5pdCh2b2lkKQogewogCWludCByZXQ7CkBAIC01NDIsNiArNTQ2LDkgQEAKIAl1ZGVsYXkoNDAwKTsKICNlbmRpZgogCisJaWYgKG5ldDIyNzJfaW5pdCgpKQorCQlwcl93YXJuaW5nKCJ1bmFibGUgdG8gY29uZmlndXJlIG5ldDIyNzI7IGl0IHByb2JhYmx5IHdvbid0IHdvcmtcbiIpOworCiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oYmZpbl9zcGlfYm9hcmRfaW5mbywgQVJSQVlfU0laRShiZmluX3NwaV9ib2FyZF9pbmZvKSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCmluZGV4IDIyYjVhYjcuLjgzNmJhZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC0xMSw3ICsxMSw3IEBACiAgKi8KIAogLyogVGhpcyBmaWxlIHNob3VsZCBiZSB1cCB0byBkYXRlIHdpdGg6Ci0gKiAgLSBSZXZpc2lvbiBSLCAwNS8yNS8yMDEwOyBBRFNQLUJGNTYxIEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKKyAqICAtIFJldmlzaW9uIFMsIDA1LzIzLzIwMTE7IEFEU1AtQkY1NjEgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAogICovCiAKICNpZm5kZWYgX01BQ0hfQU5PTUFMWV9IXwpAQCAtMjYsNjIgKzI2LDE2IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAwNzQgKDEpCiAvKiBVQVJUIExpbmUgU3RhdHVzIFJlZ2lzdGVyIChVQVJUX0xTUikgQml0cyBBcmUgTm90IFVwZGF0ZWQgYXQgdGhlIFNhbWUgVGltZSAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMDk5IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCi0vKiBUcmFjZSBCdWZmZXJzIE1heSBDb250YWluIEVycm9ycyBpbiBFbXVsYXRpb24gTW9kZSBhbmQvb3IgRXhjZXB0aW9uLCBOTUksIFJlc2V0IEhhbmRsZXJzICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAxMTYgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKIC8qIFRFU1RTRVQgSW5zdHJ1Y3Rpb25zIFJlc3RyaWN0ZWQgdG8gMzItQml0IEFsaWduZWQgTWVtb3J5IExvY2F0aW9ucyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTIwICgxKQogLyogUnguSCBDYW5ub3QgQmUgVXNlZCB0byBBY2Nlc3MgMTYtYml0IFN5c3RlbSBNTVIgUmVnaXN0ZXJzICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAxMjIgKDEpCi0vKiBFcnJvbmVvdXMgRXhjZXB0aW9uIHdoZW4gRW5hYmxpbmcgQ2FjaGUgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyNSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQogLyogU0lHTkJJVFMgSW5zdHJ1Y3Rpb24gTm90IEZ1bmN0aW9uYWwgdW5kZXIgQ2VydGFpbiBDb25kaXRpb25zICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAxMjcgKDEpCi0vKiBUd28gYml0cyBpbiB0aGUgV2F0Y2hwb2ludCBTdGF0dXMgUmVnaXN0ZXIgKFdQU1RBVCkgYXJlIHN3YXBwZWQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDEzNCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQotLyogRW5hYmxlIHdpcmVzIGZyb20gdGhlIERhdGEgV2F0Y2hwb2ludCBBZGRyZXNzIENvbnRyb2wgUmVnaXN0ZXIgKFdQREFDVEwpIGFyZSBzd2FwcGVkICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAxMzUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKLS8qIFN0YWxsIGluIG11bHRpLXVuaXQgRE1BIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDEzNiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQotLyogQWxsb3dpbmcgdGhlIFNQT1JUIFJYIEZJRk8gdG8gZmlsbCB3aWxsIGNhdXNlIGFuIG92ZXJmbG93ICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAxNDAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKLS8qIEluZmluaXRlIFN0YWxsIG1heSBvY2N1ciB3aXRoIGEgcGFydGljdWxhciBzZXF1ZW5jZSBvZiBjb25zZWN1dGl2ZSBkdWFsIGRhZyBldmVudHMgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDE0MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQotLyogSW50ZXJydXB0cyBtYXkgYmUgbG9zdCB3aGVuIGEgcHJvZ3JhbW1hYmxlIGlucHV0IGZsYWcgaXMgY29uZmlndXJlZCB0byBiZSBlZGdlIHNlbnNpdGl2ZSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMTQyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCi0vKiBETUEgYW5kIFRFU1RTRVQgY29uZmxpY3Qgd2hlbiBib3RoIGFyZSBhY2Nlc3NpbmcgZXh0ZXJuYWwgbWVtb3J5ICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAxNDQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKLS8qIEluIFBXTV9PVVQgbW9kZSwgeW91IG11c3QgZW5hYmxlIHRoZSBQUEkgYmxvY2sgdG8gZ2VuZXJhdGUgYSB3YXZlZm9ybSBmcm9tIFBQSV9DTEsgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDE0NSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQotLyogTURNQSBtYXkgbG9zZSB0aGUgZmlyc3QgZmV3IHdvcmRzIG9mIGEgZGVzY3JpcHRvciBjaGFpbiAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMTQ2IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCi0vKiBTb3VyY2UgTURNQSBkZXNjcmlwdG9yIG1heSBzdG9wIHdpdGggYSBETUEgRXJyb3IgbmVhciBiZWdpbm5pbmcgb2YgZGVzY3JpcHRvciBmZXRjaCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMTQ3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCiAvKiBJTURNQSBTMS9EMSBDaGFubmVsIE1heSBTdGFsbCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTQ5ICgxKQotLyogRE1BIGVuZ2luZSBtYXkgbG9zZSBkYXRhIGR1ZSB0byBpbmNvcnJlY3QgaGFuZHNoYWtpbmcgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDE1MCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQotLyogRE1BIHN0YWxscyB3aGVuIGFsbCB0aHJlZSBjb250cm9sbGVycyByZWFkIGRhdGEgZnJvbSB0aGUgc2FtZSBzb3VyY2UgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDE1MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQotLyogRXhlY3V0aW9uIHN0YWxsIHdoZW4gZXhlY3V0aW5nIGluIEwyIGFuZCBkb2luZyBleHRlcm5hbCBhY2Nlc3NlcyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMTUyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCi0vKiBGcmFtZSBEZWxheSBpbiBTUE9SVCBNdWx0aWNoYW5uZWwgTW9kZSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMTUzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCi0vKiBTUE9SVCBURlMgc2lnbmFsIHN0YXlzIGFjdGl2ZSBpbiBtdWx0aWNoYW5uZWwgbW9kZSBvdXRzaWRlIG9mIHZhbGlkIGNoYW5uZWxzICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAxNTQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKIC8qIFRpbWVycyBpbiBQV00tT3V0IE1vZGUgd2l0aCBQUEkgR1AgUmVjZWl2ZSAoSW5wdXQpIE1vZGUgd2l0aCAwIEZyYW1lIFN5bmNzICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAxNTYgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKLS8qIEtpbGxlZCAzMi1CaXQgTU1SIFdyaXRlIExlYWRzIHRvIE5leHQgU3lzdGVtIE1NUiBBY2Nlc3MgVGhpbmtpbmcgSXQgU2hvdWxkIEJlIDMyLUJpdCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMTU3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCi0vKiBETUEgTG9jay11cCBhdCBDQ0xLIHRvIFNDTEsgcmF0aW9zIG9mIDQ6MSwgMjoxLCBvciAxOjEgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDE1OSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQotLyogQSByZWFkIGZyb20gZXh0ZXJuYWwgbWVtb3J5IG1heSByZXR1cm4gYSB3cm9uZyB2YWx1ZSB3aXRoIGRhdGEgY2FjaGUgZW5hYmxlZCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMTYwIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCi0vKiBEYXRhIENhY2hlIEZpbGwgZGF0YSBjYW4gYmUgY29ycnVwdGVkIGFmdGVyL2R1cmluZyBJbnN0cnVjdGlvbiBETUEgaWYgY2VydGFpbiBjb3JlIHN0YWxscyBleGlzdCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMTYxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCi0vKiBETUVNX0NPTlRST0w8MTI+IGlzIG5vdCBzZXQgb24gUmVzZXQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDE2MiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQotLyogU1BPUlQgVHJhbnNtaXQgRGF0YSBJcyBOb3QgR2F0ZWQgYnkgRXh0ZXJuYWwgRnJhbWUgU3luYyBpbiBDZXJ0YWluIENvbmRpdGlvbnMgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDE2MyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQogLyogUFBJIERhdGEgTGVuZ3RocyBiZXR3ZWVuIDggYW5kIDE2IERvIE5vdCBaZXJvIE91dCBVcHBlciBCaXRzICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAxNjYgKDEpCiAvKiBUdXJuaW5nIFNQT1JUcyBvbiB3aGlsZSBFeHRlcm5hbCBGcmFtZSBTeW5jIElzIEFjdGl2ZSBNYXkgQ29ycnVwdCBEYXRhICovCkBAIC05MiwxMCArNDYsNiBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTY5IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCiAvKiBCb290LVJPTSBNb2RpZmllcyBTSUNBX0lXUnggV2FrZXVwIFJlZ2lzdGVycyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTcxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCi0vKiBEU1BJRCByZWdpc3RlciB2YWx1ZXMgaW5jb3JyZWN0ICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAxNzIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKLS8qIERNQSB2cyBDb3JlIGFjY2Vzc2VzIHRvIGV4dGVybmFsIG1lbW9yeSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMTczIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCiAvKiBDYWNoZSBGaWxsIEJ1ZmZlciBEYXRhIGxvc3QgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDE3NCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQogLyogT3ZlcmxhcHBpbmcgU2VxdWVuY2VyIGFuZCBNZW1vcnkgU3RhbGxzICovCkBAIC0xMjQsOCArNzQsNiBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTg5IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCiAvKiBQUEkgTm90IEZ1bmN0aW9uYWwgYXQgQ29yZSBWb2x0YWdlIDwgMVZvbHQgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDE5MCAoMSkKLS8qIFBQSSBkb2VzIG5vdCBpbnZlcnQgdGhlIERyaXZpbmcgUFBJQ0xLIGVkZ2UgaW4gVHJhbnNtaXQgTW9kZXMgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDE5MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQogLyogRmFsc2UgSS9PIFBpbiBJbnRlcnJ1cHRzIG9uIEVkZ2UtU2Vuc2l0aXZlIElucHV0cyBXaGVuIFBvbGFyaXR5IFNldHRpbmcgSXMgQ2hhbmdlZCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTkzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCiAvKiBSZXN0YXJ0aW5nIFNQT1JUIGluIFNwZWNpZmljIE1vZGVzIE1heSBDYXVzZSBEYXRhIENvcnJ1cHRpb24gKi8KQEAgLTIxNywxMCArMTY1LDEwIEBACiAvKiBUaW1pbmcgUmVxdWlyZW1lbnRzIENoYW5nZSBmb3IgRXh0ZXJuYWwgRnJhbWUgU3luYyBQUEkgTW9kZXMgd2l0aCBOb24tWmVybyBQUElfREVMQVkgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3NiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQogLyogV3JpdGVzIHRvIGFuIEkvTyBEYXRhIFJlZ2lzdGVyIE9uZSBTQ0xLIEN5Y2xlIGFmdGVyIGFuIEVkZ2UgSXMgRGV0ZWN0ZWQgTWF5IENsZWFyIEludGVycnVwdCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMjc3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNSkKIC8qIERpc2FibGluZyBQZXJpcGhlcmFscyB3aXRoIERNQSBSdW5uaW5nIE1heSBDYXVzZSBETUEgU3lzdGVtIEluc3RhYmlsaXR5ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzggKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNSkKLS8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIEV4Y2VwdGlvbiB3aGVuIElTUiBDb250ZXh0IElzIE5vdCBSZXN0b3JlZCAqLworLyogRmFsc2UgSGFyZHdhcmUgRXJyb3Igd2hlbiBJU1IgQ29udGV4dCBJcyBOb3QgUmVzdG9yZWQgKi8KIC8qIFRlbXBvcmFyaWx5IHdhbGsgYXJvdW5kIGZvciBidWcgNTQyMyB0aWxsIHRoaXMgaXNzdWUgaXMgY29uZmlybWVkIGJ5CiAgKiBvZmZpY2lhbCBhbm9tYWx5IGRvY3VtZW50LiBJdCBsb29rcyAwNTAwMDI4MSBzdGlsbCBleGlzdHMgb24gYmY1NjEKICAqIHYwLjUuCkBAIC0yNzQsOCArMjIyLDYgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM2NiAoMSkKIC8qIFBvc3NpYmxlIFJFVFMgUmVnaXN0ZXIgQ29ycnVwdGlvbiB3aGVuIFN1YnJvdXRpbmUgSXMgdW5kZXIgNSBDeWNsZXMgaW4gRHVyYXRpb24gKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3MSAoMSkKLS8qIFNTWU5DIFN0YWxscyBQcm9jZXNzb3Igd2hlbiBFeGVjdXRlZCBmcm9tIE5vbi1DYWNoZWFibGUgTWVtb3J5ICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0MDIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fID09IDQpCiAvKiBMZXZlbC1TZW5zaXRpdmUgRXh0ZXJuYWwgR1BJTyBXYWtldXBzIE1heSBDYXVzZSBJbmRlZmluaXRlIFN0YWxsICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDMgKDEpCiAvKiBURVNUU0VUIEluc3RydWN0aW9uIENhdXNlcyBEYXRhIENvcnJ1cHRpb24gd2l0aCBXcml0ZWJhY2sgRGF0YSBDYWNoZSBFbmFibGVkICovCkBAIC0yOTgsMTYgKzI0NCw4MiBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDYyICgxKQogLyogQm9vdCBGYWlsdXJlIFdoZW4gU0RSQU0gQ29udHJvbCBTaWduYWxzIFRvZ2dsZSBDb21pbmcgT3V0IE9mIFJlc2V0ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzEgKDEpCi0vKiBJbnRlcnJ1cHRlZCAzMi1CaXQgU1BPUlQgRGF0YSBSZWdpc3RlciBBY2Nlc3MgUmVzdWx0cyBJbiBVbmRlcmZsb3cgKi8KKy8qIEludGVycnVwdGVkIFNQT1JUIFJlY2VpdmUgRGF0YSBSZWdpc3RlciBSZWFkIFJlc3VsdHMgSW4gVW5kZXJmbG93IHdoZW4gU0xFTiA+IDE1ICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzMgKDEpCi0vKiBQb3NzaWJsZSBMb2NrdXAgQ29uZGl0aW9uIHdoZW0gTW9kaWZ5aW5nIFBMTCBmcm9tIEV4dGVybmFsIE1lbW9yeSAqLworLyogUG9zc2libGUgTG9ja3VwIENvbmRpdGlvbiB3aGVuIE1vZGlmeWluZyBQTEwgZnJvbSBFeHRlcm5hbCBNZW1vcnkgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ3NSAoMSkKIC8qIFRFU1RTRVQgSW5zdHJ1Y3Rpb24gQ2Fubm90IEJlIEludGVycnVwdGVkICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0NzcgKDEpCiAvKiBSZWFkcyBvZiBJVEVTVF9DT01NQU5EIGFuZCBJVEVTVF9EQVRBIFJlZ2lzdGVycyBDYXVzZSBDYWNoZSBDb3JydXB0aW9uICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0ODEgKDEpCi0vKiBJRkxVU0ggc3Vja3MgYXQgbGlmZSAqLworLyogUExMIE1heSBMYXRjaCBJbmNvcnJlY3QgVmFsdWVzIENvbWluZyBPdXQgb2YgUmVzZXQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ4OSAoMSkKKy8qIEluc3RydWN0aW9uIE1lbW9yeSBTdGFsbHMgQ2FuIENhdXNlIElGTFVTSCB0byBGYWlsICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0OTEgKDEpCisvKiBFWENQVCBJbnN0cnVjdGlvbiBNYXkgQmUgTG9zdCBJZiBOTUkgSGFwcGVucyBTaW11bHRhbmVvdXNseSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDk0ICgxKQorLyogUlhTIEJpdCBpbiBTUElfU1RBVCBNYXkgQmVjb21lIFN0dWNrIEluIFJYIERNQSBNb2RlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNTAxICgxKQorCisvKgorICogVGhlc2UgYW5vbWFsaWVzIGhhdmUgYmVlbiAicGhhc2VkIiBvdXQgb2YgYW5hbG9nLmNvbSBhbm9tYWx5IHNoZWV0cyBhbmQgYXJlCisgKiBoZXJlIHRvIHNob3cgcnVubmluZyBvbiBvbGRlciBzaWxpY29uIGp1c3QgaXNuJ3QgZmVhc2libGUuCisgKi8KKworLyogVHJhY2UgQnVmZmVycyBNYXkgQ29udGFpbiBFcnJvcnMgaW4gRW11bGF0aW9uIE1vZGUgYW5kL29yIEV4Y2VwdGlvbiwgTk1JLCBSZXNldCBIYW5kbGVycyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTE2IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBFcnJvbmVvdXMgRXhjZXB0aW9uIHdoZW4gRW5hYmxpbmcgQ2FjaGUgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyNSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogVHdvIGJpdHMgaW4gdGhlIFdhdGNocG9pbnQgU3RhdHVzIFJlZ2lzdGVyIChXUFNUQVQpIGFyZSBzd2FwcGVkICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxMzQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKKy8qIEVuYWJsZSB3aXJlcyBmcm9tIHRoZSBEYXRhIFdhdGNocG9pbnQgQWRkcmVzcyBDb250cm9sIFJlZ2lzdGVyIChXUERBQ1RMKSBhcmUgc3dhcHBlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTM1IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBTdGFsbCBpbiBtdWx0aS11bml0IERNQSBvcGVyYXRpb25zICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxMzYgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKKy8qIEFsbG93aW5nIHRoZSBTUE9SVCBSWCBGSUZPIHRvIGZpbGwgd2lsbCBjYXVzZSBhbiBvdmVyZmxvdyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTQwIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBJbmZpbml0ZSBTdGFsbCBtYXkgb2NjdXIgd2l0aCBhIHBhcnRpY3VsYXIgc2VxdWVuY2Ugb2YgY29uc2VjdXRpdmUgZHVhbCBkYWcgZXZlbnRzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxNDEgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKKy8qIEludGVycnVwdHMgbWF5IGJlIGxvc3Qgd2hlbiBhIHByb2dyYW1tYWJsZSBpbnB1dCBmbGFnIGlzIGNvbmZpZ3VyZWQgdG8gYmUgZWRnZSBzZW5zaXRpdmUgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE0MiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogRE1BIGFuZCBURVNUU0VUIGNvbmZsaWN0IHdoZW4gYm90aCBhcmUgYWNjZXNzaW5nIGV4dGVybmFsIG1lbW9yeSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTQ0IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBJbiBQV01fT1VUIG1vZGUsIHlvdSBtdXN0IGVuYWJsZSB0aGUgUFBJIGJsb2NrIHRvIGdlbmVyYXRlIGEgd2F2ZWZvcm0gZnJvbSBQUElfQ0xLICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxNDUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKKy8qIE1ETUEgbWF5IGxvc2UgdGhlIGZpcnN0IGZldyB3b3JkcyBvZiBhIGRlc2NyaXB0b3IgY2hhaW4gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE0NiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogU291cmNlIE1ETUEgZGVzY3JpcHRvciBtYXkgc3RvcCB3aXRoIGEgRE1BIEVycm9yIG5lYXIgYmVnaW5uaW5nIG9mIGRlc2NyaXB0b3IgZmV0Y2ggKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE0NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogRE1BIGVuZ2luZSBtYXkgbG9zZSBkYXRhIGR1ZSB0byBpbmNvcnJlY3QgaGFuZHNoYWtpbmcgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE1MCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogRE1BIHN0YWxscyB3aGVuIGFsbCB0aHJlZSBjb250cm9sbGVycyByZWFkIGRhdGEgZnJvbSB0aGUgc2FtZSBzb3VyY2UgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE1MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogRXhlY3V0aW9uIHN0YWxsIHdoZW4gZXhlY3V0aW5nIGluIEwyIGFuZCBkb2luZyBleHRlcm5hbCBhY2Nlc3NlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTUyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBGcmFtZSBEZWxheSBpbiBTUE9SVCBNdWx0aWNoYW5uZWwgTW9kZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTUzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBTUE9SVCBURlMgc2lnbmFsIHN0YXlzIGFjdGl2ZSBpbiBtdWx0aWNoYW5uZWwgbW9kZSBvdXRzaWRlIG9mIHZhbGlkIGNoYW5uZWxzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxNTQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKKy8qIEtpbGxlZCAzMi1CaXQgTU1SIFdyaXRlIExlYWRzIHRvIE5leHQgU3lzdGVtIE1NUiBBY2Nlc3MgVGhpbmtpbmcgSXQgU2hvdWxkIEJlIDMyLUJpdCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTU3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBETUEgTG9jay11cCBhdCBDQ0xLIHRvIFNDTEsgcmF0aW9zIG9mIDQ6MSwgMjoxLCBvciAxOjEgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE1OSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogQSByZWFkIGZyb20gZXh0ZXJuYWwgbWVtb3J5IG1heSByZXR1cm4gYSB3cm9uZyB2YWx1ZSB3aXRoIGRhdGEgY2FjaGUgZW5hYmxlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTYwIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBEYXRhIENhY2hlIEZpbGwgZGF0YSBjYW4gYmUgY29ycnVwdGVkIGFmdGVyL2R1cmluZyBJbnN0cnVjdGlvbiBETUEgaWYgY2VydGFpbiBjb3JlIHN0YWxscyBleGlzdCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTYxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBETUVNX0NPTlRST0w8MTI+IGlzIG5vdCBzZXQgb24gUmVzZXQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE2MiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogU1BPUlQgVHJhbnNtaXQgRGF0YSBJcyBOb3QgR2F0ZWQgYnkgRXh0ZXJuYWwgRnJhbWUgU3luYyBpbiBDZXJ0YWluIENvbmRpdGlvbnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE2MyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogRFNQSUQgcmVnaXN0ZXIgdmFsdWVzIGluY29ycmVjdCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTcyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBETUEgdnMgQ29yZSBhY2Nlc3NlcyB0byBleHRlcm5hbCBtZW1vcnkgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE3MyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogUFBJIGRvZXMgbm90IGludmVydCB0aGUgRHJpdmluZyBQUElDTEsgZWRnZSBpbiBUcmFuc21pdCBNb2RlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTkxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBTU1lOQyBTdGFsbHMgUHJvY2Vzc29yIHdoZW4gRXhlY3V0ZWQgZnJvbSBOb24tQ2FjaGVhYmxlIE1lbW9yeSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDAyIChfX1NJTElDT05fUkVWSVNJT05fXyA9PSA0KQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDExOSAoMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggNTdkNWVhYi4uZjlmOGIyYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTU4LDkgKzU4LDkgQEAKICNkZWZpbmUgR1BJT19QRjQ2CTQ2CiAjZGVmaW5lIEdQSU9fUEY0Nwk0NwogCi0jZGVmaW5lIFBPUlRfRklPMCBHUElPXzAKLSNkZWZpbmUgUE9SVF9GSU8xIEdQSU9fMTYKLSNkZWZpbmUgUE9SVF9GSU8yIEdQSU9fMzIKKyNkZWZpbmUgUE9SVF9GSU8wIEdQSU9fUEYwCisjZGVmaW5lIFBPUlRfRklPMSBHUElPX1BGMTYKKyNkZWZpbmUgUE9SVF9GSU8yIEdQSU9fUEYzMgogCiAjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtZi5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc2Vjb25kYXJ5LlMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc2Vjb25kYXJ5LlMKaW5kZXggNGM0NjI4My4uMDFlNTQwOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NlY29uZGFyeS5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zZWNvbmRhcnkuUwpAQCAtMjMsMTA4ICsyMyw3OCBAQAogI2RlZmluZSBJTklUSUFMX1NUQUNLCShDT1JFQl9MMV9TQ1JBVENIX1NUQVJUICsgTDFfU0NSQVRDSF9MRU5HVEggLSAxMikKIAogRU5UUlkoX2NvcmViX3RyYW1wb2xpbmVfc3RhcnQpCi0JLyogU2V0IHRoZSBTWVNDRkcgcmVnaXN0ZXIgKi8KLQlSMCA9IDB4MzY7Ci0JU1lTQ0ZHID0gUjA7IC8qRW5hYmxlIEN5Y2xlIENvdW50ZXIgYW5kIE5lc3RpbmcgT2YgSW50ZXJydXB0cygzcmQgQml0KSovCi0JUjAgPSAwOworCS8qIEVuYWJsZSBDeWNsZSBDb3VudGVyIGFuZCBOZXN0aW5nIE9mIEludGVycnVwdHMgKi8KKyNpZmRlZiBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19DWUNMRVMKKwlSMCA9IFNZU0NGR19TTkVOOworI2Vsc2UKKwlSMCA9IFNZU0NGR19TTkVOIHwgU1lTQ0ZHX0NDRU47CisjZW5kaWYKKwlTWVNDRkcgPSBSMDsKIAotCS8qQ2xlYXIgT3V0IEFsbCB0aGUgZGF0YSBhbmQgcG9pbnRlciAgUmVnaXN0ZXJzKi8KLQlSMSA9IFIwOwotCVIyID0gUjA7Ci0JUjMgPSBSMDsKLQlSNCA9IFIwOwotCVI1ID0gUjA7Ci0JUjYgPSBSMDsKLQlSNyA9IFIwOworCS8qIE9wdGltaXphdGlvbiByZWdpc3RlciB0cmlja3M6IGtlZXAgYSBiYXNlIHZhbHVlIGluIHRoZQorCSAqIHJlc2VydmVkIFAgcmVnaXN0ZXJzIHNvIHdlIHVzZSB0aGUgbG9hZC9zdG9yZSB3aXRoIGFuCisJICogb2Zmc2V0IHN5bnRheC4gIFIwID0gW1A1ICsgPGNvbnN0YW50Pl07CisJICogICBQNSAtIGNvcmUgTU1SIGJhc2UKKwkgKiAgIFI2IC0gMAorCSAqLworCXI2ID0gMDsKKwlwNS5sID0gMDsKKwlwNS5oID0gaGkoQ09SRU1NUl9CQVNFKTsKIAotCVAwID0gUjA7Ci0JUDEgPSBSMDsKLQlQMiA9IFIwOwotCVAzID0gUjA7Ci0JUDQgPSBSMDsKLQlQNSA9IFIwOworCS8qIFplcm8gb3V0IHJlZ2lzdGVycyByZXF1aXJlZCBieSBCbGFja2ZpbiBBQkkgKi8KIAotCUxDMCA9IHIwOwotCUxDMSA9IHIwOwotCUwwID0gcjA7Ci0JTDEgPSByMDsKLQlMMiA9IHIwOwotCUwzID0gcjA7CisJLyogRGlzYWJsZSBjaXJjdWxhciBidWZmZXJzICovCisJTDAgPSByNjsKKwlMMSA9IHI2OworCUwyID0gcjY7CisJTDMgPSByNjsKIAotCS8qIENsZWFyIE91dCBBbGwgdGhlIERBRyBSZWdpc3RlcnMqLwotCUIwID0gcjA7Ci0JQjEgPSByMDsKLQlCMiA9IHIwOwotCUIzID0gcjA7CisJLyogRGlzYWJsZSBoYXJkd2FyZSBsb29wcyBpbiBjYXNlIHdlIHdlcmUgc3RhcnRlZCBieSAnZ28nICovCisJTEMwID0gcjY7CisJTEMxID0gcjY7CiAKLQlJMCA9IHIwOwotCUkxID0gcjA7Ci0JSTIgPSByMDsKLQlJMyA9IHIwOwotCi0JTTAgPSByMDsKLQlNMSA9IHIwOwotCU0yID0gcjA7Ci0JTTMgPSByMDsKKwkvKgorCSAqIENsZWFyIElURVNUX0NPTU1BTkQgYW5kIERURVNUX0NPTU1BTkQgcmVnaXN0ZXJzLAorCSAqIExlYXZpbmcgdGhlc2UgYXMgbm9uLXplcm8gY2FuIGNvbmZ1c2UgdGhlIGVtdWxhdG9yCisJICovCisJW3A1ICsgKERURVNUX0NPTU1BTkQgLSBDT1JFTU1SX0JBU0UpXSA9IHI2OworCVtwNSArIChJVEVTVF9DT01NQU5EIC0gQ09SRU1NUl9CQVNFKV0gPSByNjsKKwlDU1lOQzsKIAogCXRyYWNlX2J1ZmZlcl9pbml0KHAwLHIwKTsKIAogCS8qIFR1cm4gb2ZmIHRoZSBpY2FjaGUgKi8KLQlwMC5sID0gTE8oSU1FTV9DT05UUk9MKTsKLQlwMC5oID0gSEkoSU1FTV9DT05UUk9MKTsKLQlSMSA9IFtwMF07Ci0JUjAgPSB+RU5JQ1BMQjsKLQlSMCA9IFIwICYgUjE7Ci0KLQkvKiBEaXNhYmxpbmcgb2YgQ1BMQnMgc2hvdWxkIGJlIHByb2NlZWRlZCBieSBhIENTWU5DICovCi0JQ1NZTkM7Ci0JW3AwXSA9IFIwOworCXIxID0gW3A1ICsgKElNRU1fQ09OVFJPTCAtIENPUkVNTVJfQkFTRSldOworCUJJVENMUiAocjEsIEVOSUNQTEJfUCk7CisJW3A1ICsgKElNRU1fQ09OVFJPTCAtIENPUkVNTVJfQkFTRSldID0gcjE7CiAJU1NZTkM7CiAKIAkvKiBUdXJuIG9mZiB0aGUgZGNhY2hlICovCi0JcDAubCA9IExPKERNRU1fQ09OVFJPTCk7Ci0JcDAuaCA9IEhJKERNRU1fQ09OVFJPTCk7Ci0JUjEgPSBbcDBdOwotCVIwID0gfkVORENQTEI7Ci0JUjAgPSBSMCAmIFIxOwotCi0JLyogRGlzYWJsaW5nIG9mIENQTEJzIHNob3VsZCBiZSBwcm9jZWVkZWQgYnkgYSBDU1lOQyAqLwotCUNTWU5DOwotCVtwMF0gPSBSMDsKKwlyMSA9IFtwNSArIChETUVNX0NPTlRST0wgLSBDT1JFTU1SX0JBU0UpXTsKKwlCSVRDTFIgKHIxLCBFTkRDUExCX1ApOworCVtwNSArIChETUVNX0NPTlRST0wgLSBDT1JFTU1SX0JBU0UpXSA9IHIxOwogCVNTWU5DOwogCiAJLyogaW4gY2FzZSBvZiBkb3VibGUgZmF1bHRzLCBzYXZlIGEgZmV3IHRoaW5ncyAqLwotCXAwLmwgPSBfaW5pdF9yZXR4X2NvcmViOwotCXAwLmggPSBfaW5pdF9yZXR4X2NvcmViOwotCVIwID0gUkVUWDsKLQlbUDBdID0gUjA7Ci0KKwlwMS5sID0gX2luaXRpYWxfcGRhX2NvcmViOworCXAxLmggPSBfaW5pdGlhbF9wZGFfY29yZWI7CisJcjQgPSBSRVRYOwogI2lmZGVmIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVAogCS8qIE9ubHkgc2F2ZSB0aGVzZSBpZiB3ZSBhcmUgc3RvcmluZyB0aGVtLAogCSAqIFRoaXMgaGFwcGVucyBoZXJlLCBzaW5jZSBMMSBnZXRzIGNsb2JiZXJlZAogCSAqIGJlbG93CiAJICovCiAJR0VUX1BEQShwMCwgcjApOwotCXI3ID0gW3AwICsgUERBX0RGX1JFVFhdOwotCXAxLmwgPSBfaW5pdF9zYXZlZF9yZXR4X2NvcmViOwotCXAxLmggPSBfaW5pdF9zYXZlZF9yZXR4X2NvcmViOwotCVtwMV0gPSByNzsKLQotCXI3ID0gW3AwICsgUERBX0RGX0RDUExCXTsKLQlwMS5sID0gX2luaXRfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcl9jb3JlYjsKLQlwMS5oID0gX2luaXRfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcl9jb3JlYjsKLQlbcDFdID0gcjc7Ci0KLQlyNyA9IFtwMCArIFBEQV9ERl9JQ1BMQl07Ci0JcDEubCA9IF9pbml0X3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHJfY29yZWI7Ci0JcDEuaCA9IF9pbml0X3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHJfY29yZWI7Ci0JW3AxXSA9IHI3OwotCi0JcjcgPSBbcDAgKyBQREFfREZfU0VRU1RBVF07Ci0JcDEubCA9IF9pbml0X3NhdmVkX3NlcXN0YXRfY29yZWI7Ci0JcDEuaCA9IF9pbml0X3NhdmVkX3NlcXN0YXRfY29yZWI7Ci0JW3AxXSA9IHI3OworCXIwID0gW3AwICsgUERBX0RGX1JFVFhdOworCXIxID0gW3AwICsgUERBX0RGX0RDUExCXTsKKwlyMiA9IFtwMCArIFBEQV9ERl9JQ1BMQl07CisJcjMgPSBbcDAgKyBQREFfREZfU0VRU1RBVF07CisJW3AxICsgUERBX0lOSVRfREZfUkVUWF0gPSByMDsKKwlbcDEgKyBQREFfSU5JVF9ERl9EQ1BMQl0gPSByMTsKKwlbcDEgKyBQREFfSU5JVF9ERl9JQ1BMQl0gPSByMjsKKwlbcDEgKyBQREFfSU5JVF9ERl9TRVFTVEFUXSA9IHIzOwogI2VuZGlmCisJW3AxICsgUERBX0lOSVRfUkVUWF0gPSByNDsKIAogCS8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlciAqLwogCXNwLmwgPSBsbyhJTklUSUFMX1NUQUNLKTsKQEAgLTEzOCwxOSArMTA4LDEzIEBACiAKIAkvKiBFVlQxNSA9IF9yZWFsX3N0YXJ0ICovCiAKLQlwMC5sID0gbG8oRVZUMTUpOwotCXAwLmggPSBoaShFVlQxNSk7CiAJcDEubCA9IF9jb3JlYl9zdGFydDsKIAlwMS5oID0gX2NvcmViX3N0YXJ0OwotCVtwMF0gPSBwMTsKKwlbcDUgKyAoRVZUMTUgLSBDT1JFTU1SX0JBU0UpXSA9IHAxOwogCWNzeW5jOwogCi0JcDAubCA9IGxvKElNQVNLKTsKLQlwMC5oID0gaGkoSU1BU0spOwotCXAxLmwgPSBJTUFTS19JVkcxNTsKLQlwMS5oID0gMHgwOwotCVtwMF0gPSBwMTsKLQljc3luYzsKKwlyMCA9IEVWVF9JVkcxNSAoeik7CisJc3RpIHIwOwogCiAJcmFpc2UgMTU7CiAJcDAubCA9IC5MV0FJVF9IRVJFOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9kcG1jX21vZGVzLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2RwbWNfbW9kZXMuUwppbmRleCA5Y2ZkZDQ5Li4xYzUzNGQyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2RwbWNfbW9kZXMuUworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2RwbWNfbW9kZXMuUwpAQCAtMTIsOCArMTIsOCBAQAogLnNlY3Rpb24gLmwxLnRleHQKIAogRU5UUlkoX3NsZWVwX21vZGUpCi0JWy0tU1BdID0gKCBSNzowLCBQNTowICk7Ci0JWy0tU1BdID0gIFJFVFM7CisJWy0tU1BdID0gKFI3OjQsIFA1OjMpOworCVstLVNQXSA9IFJFVFM7CiAKIAljYWxsIF9zZXRfc2ljX2l3cjsKIApAQCAtNDYsMTUgKzQ2LDI1IEBACiAJY2FsbCBfdGVzdF9wbGxfbG9ja2VkOwogCiAJUkVUUyA9IFtTUCsrXTsKLQkoIFI3OjAsIFA1OjAgKSA9IFtTUCsrXTsKKwkoUjc6NCwgUDU6MykgPSBbU1ArK107CiAJUlRTOwogRU5EUFJPQyhfc2xlZXBfbW9kZSkKIAorLyoKKyAqIFRoaXMgZnVuYyBuZXZlciByZXR1cm5zIGFzIGl0IHB1dHMgdGhlIHBhcnQgaW50byBoaWJlcm5hdGUsIGFuZAorICogaXMgb25seSBjYWxsZWQgZnJvbSBkb19oaWJlcm5hdGUsIHNvIHdlIGRvbid0IGJvdGhlciBzYXZpbmcgb3IKKyAqIHJlc3RvcmluZyBhbnkgb2YgdGhlIG5vcm1hbCBDIHJ1bnRpbWUgc3RhdGUuICBXaGVuIHdlIHdha2UgdXAsCisgKiB0aGUgZW50cnkgcG9pbnQgd2lsbCBiZSBpbiBkb19oaWJlcm5hdGUgYW5kIG5vdCBoZXJlLgorICoKKyAqIFdlIGFjY2VwdCBqdXN0IG9uZSBhcmd1bWVudCAtLSB0aGUgdmFsdWUgdG8gd3JpdGUgdG8gVlJfQ1RMLgorICovCiBFTlRSWShfaGliZXJuYXRlX21vZGUpCi0JWy0tU1BdID0gKCBSNzowLCBQNTowICk7Ci0JWy0tU1BdID0gIFJFVFM7CisJLyogU2F2ZS9zZXR1cCB0aGUgcmVncyB3ZSBuZWVkIGVhcmx5IGZvciBtaW5vciBwaXBlbGluZSBvcHRpbWl6YXRpb24gKi8KKwlSNCA9IFIwOworCVAzLkggPSBoaShWUl9DVEwpOworCVAzLkwgPSBsbyhWUl9DVEwpOwogCi0JUjMgPSBSMDsKKwkvKiBEaXNhYmxlIGFsbCB3YWtldXAgc291cmNlcyAqLwogCVIwID0gSVdSX0RJU0FCTEVfQUxMOwogCVIxID0gSVdSX0RJU0FCTEVfQUxMOwogCVIyID0gSVdSX0RJU0FCTEVfQUxMOwpAQCAtNjIsMTAgKzcyLDggQEAKIAljYWxsIF9zZXRfZHJhbV9zcmZzOwogCVNTWU5DOwogCi0JUDAuSCA9IGhpKFZSX0NUTCk7Ci0JUDAuTCA9IGxvKFZSX0NUTCk7Ci0KLQlXW1AwXSA9IFIzLkw7CisJLyogRmluYWxseSwgd2UgY2xpbWIgaW50byBvdXIgY2F2ZSB0byBoaWJlcm5hdGUgKi8KKwlXW1AzXSA9IFI0Lkw7CiAJQ0xJIFIyOwogCUlETEU7CiAuTGZvcmV2ZXI6CkBAIC03Myw4ICs4MSw4IEBACiBFTkRQUk9DKF9oaWJlcm5hdGVfbW9kZSkKIAogRU5UUlkoX3NsZWVwX2RlZXBlcikKLQlbLS1TUF0gPSAoIFI3OjAsIFA1OjAgKTsKLQlbLS1TUF0gPSAgUkVUUzsKKwlbLS1TUF0gPSAoUjc6NCwgUDU6Myk7CisJWy0tU1BdID0gUkVUUzsKIAogCUNMSSBSNDsKIApAQCAtMTY3LDcgKzE3NSw3IEBACiAJU1RJIFI0OwogCiAJUkVUUyA9IFtTUCsrXTsKLQkoIFI3OjAsIFA1OjAgKSA9IFtTUCsrXTsKKwkoUjc6NCwgUDU6MykgPSBbU1ArK107CiAJUlRTOwogRU5EUFJPQyhfc2xlZXBfZGVlcGVyKQogCkBAIC0xODgsMjEgKzE5NiwyMCBAQAogI2Vsc2UgCQkJCS8qIFNEUkFNICovCiAJUDAuTCA9IGxvKEVCSVVfU0RHQ1RMKTsKIAlQMC5IID0gaGkoRUJJVV9TREdDVEwpOworCVAxLkwgPSBsbyhFQklVX1NEU1RBVCk7CisJUDEuSCA9IGhpKEVCSVVfU0RTVEFUKTsKKwogCVIyID0gW1AwXTsKIAlCSVRTRVQoUjIsIDI0KTsgLyogU1JGUyBlbnRlciBzZWxmLXJlZnJlc2ggbW9kZSAqLwogCVtQMF0gPSBSMjsKIAlTU1lOQzsKIAotCVAwLkwgPSBsbyhFQklVX1NEU1RBVCk7Ci0JUDAuSCA9IGhpKEVCSVVfU0RTVEFUKTsKIDE6Ci0JUjIgPSB3W1AwXTsKKwlSMiA9IHdbUDFdOwogCVNTWU5DOwogCWNjID0gQklUVFNUKFIyLCAxKTsgLyogU0RTUkEgcG9sbCBzZWxmLXJlZnJlc2ggc3RhdHVzICovCiAJaWYgIWNjIGp1bXAgMWI7CiAKLQlQMC5MID0gbG8oRUJJVV9TREdDVEwpOwotCVAwLkggPSBoaShFQklVX1NER0NUTCk7CiAJUjIgPSBbUDBdOwogCUJJVENMUihSMiwgMCk7IC8qIFNDVExFIGRpc2FibGUgQ0xLT1VUICovCiAJW1AwXSA9IFIyOwpAQCAtMjEyLDYgKzIxOSw3IEBACiAKIEVOVFJZKF91bnNldF9kcmFtX3NyZnMpCiAJLyogIHNldCB0aGUgZHJhbSBvdXQgb2Ygc2VsZiByZWZyZXNoIG1vZGUgKi8KKwogI2lmIGRlZmluZWQoRUJJVV9SU1RDVEwpCS8qIEREUiAqLwogCVAwLkggPSBoaShFQklVX1JTVENUTCk7CiAJUDAuTCA9IGxvKEVCSVVfUlNUQ1RMKTsKQEAgLTIxOSw0MiArMjI3LDM5IEBACiAJQklUQ0xSKFIyLCAzKTsgLyogY2xlYXIgU1JSRVEgYml0ICovCiAJW1AwXSA9IFIyOwogI2VsaWYgZGVmaW5lZChFQklVX1NER0NUTCkJLyogU0RSQU0gKi8KLQotCVAwLkwgPSBsbyhFQklVX1NER0NUTCk7IC8qIHJlbGVhc2UgQ0xLT1VUIGZyb20gc2VsZi1yZWZyZXNoICovCisJLyogcmVsZWFzZSBDTEtPVVQgZnJvbSBzZWxmLXJlZnJlc2ggKi8KKwlQMC5MID0gbG8oRUJJVV9TREdDVEwpOwogCVAwLkggPSBoaShFQklVX1NER0NUTCk7CisKIAlSMiA9IFtQMF07CiAJQklUU0VUKFIyLCAwKTsgLyogU0NUTEUgZW5hYmxlIENMS09VVCAqLwogCVtQMF0gPSBSMgogCVNTWU5DOwogCi0JUDAuTCA9IGxvKEVCSVVfU0RHQ1RMKTsgLyogcmVsZWFzZSBTRFJBTSBmcm9tIHNlbGYtcmVmcmVzaCAqLwotCVAwLkggPSBoaShFQklVX1NER0NUTCk7CisJLyogcmVsZWFzZSBTRFJBTSBmcm9tIHNlbGYtcmVmcmVzaCAqLwogCVIyID0gW1AwXTsKIAlCSVRDTFIoUjIsIDI0KTsgLyogY2xlYXIgU1JGUyBiaXQgKi8KIAlbUDBdID0gUjIKICNlbmRpZgorCiAJU1NZTkM7CiAJUlRTOwogRU5EUFJPQyhfdW5zZXRfZHJhbV9zcmZzKQogCiBFTlRSWShfc2V0X3NpY19pd3IpCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkgfHwgXAotCWRlZmluZWQoQ09ORklHX0JGNTM4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzOSkgfHwgZGVmaW5lZChDT05GSUdfQkY1MXgpCi0JUDAuSCA9IGhpKFNJQ19JV1IwKTsKLQlQMC5MID0gbG8oU0lDX0lXUjApOwotCVAxLkggPSBoaShTSUNfSVdSMSk7Ci0JUDEuTCA9IGxvKFNJQ19JV1IxKTsKLQlbUDFdID0gUjE7Ci0jaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpCi0JUDEuSCA9IGhpKFNJQ19JV1IyKTsKLQlQMS5MID0gbG8oU0lDX0lXUjIpOwotCVtQMV0gPSBSMjsKLSNlbmRpZgorI2lmZGVmIFNJQ19JV1IwCisJUDAuSCA9IGhpKFNZU01NUl9CQVNFKTsKKwlQMC5MID0gbG8oU1lTTU1SX0JBU0UpOworCVtQMCArIChTSUNfSVdSMCAtIFNZU01NUl9CQVNFKV0gPSBSMDsKKwlbUDAgKyAoU0lDX0lXUjEgLSBTWVNNTVJfQkFTRSldID0gUjE7CisjIGlmZGVmIFNJQ19JV1IyCisJW1AwICsgKFNJQ19JV1IyIC0gU1lTTU1SX0JBU0UpXSA9IFIyOworIyBlbmRpZgogI2Vsc2UKIAlQMC5IID0gaGkoU0lDX0lXUik7CiAJUDAuTCA9IGxvKFNJQ19JV1IpOwotI2VuZGlmCiAJW1AwXSA9IFIwOworI2VuZGlmCiAKIAlTU1lOQzsKIAlSVFM7CkBAIC0yNzIsMjA2ICsyNzcsNTUgQEAKIAogLnNlY3Rpb24gLnRleHQKIAorI2RlZmluZSBQTV9SRUcwICBSNworI2RlZmluZSBQTV9SRUcxICBSNgorI2RlZmluZSBQTV9SRUcyICBSNQorI2RlZmluZSBQTV9SRUczICBSNAorI2RlZmluZSBQTV9SRUc0ICBSMworI2RlZmluZSBQTV9SRUc1ICBSMgorI2RlZmluZSBQTV9SRUc2ICBSMQorI2RlZmluZSBQTV9SRUc3ICBSMAorI2RlZmluZSBQTV9SRUc4ICBQNQorI2RlZmluZSBQTV9SRUc5ICBQNAorI2RlZmluZSBQTV9SRUcxMCBQMworI2RlZmluZSBQTV9SRUcxMSBQMgorI2RlZmluZSBQTV9SRUcxMiBQMQorI2RlZmluZSBQTV9SRUcxMyBQMAorCisjZGVmaW5lIFBNX1JFR1NFVDAgIFI3OjcKKyNkZWZpbmUgUE1fUkVHU0VUMSAgUjc6NgorI2RlZmluZSBQTV9SRUdTRVQyICBSNzo1CisjZGVmaW5lIFBNX1JFR1NFVDMgIFI3OjQKKyNkZWZpbmUgUE1fUkVHU0VUNCAgUjc6MworI2RlZmluZSBQTV9SRUdTRVQ1ICBSNzoyCisjZGVmaW5lIFBNX1JFR1NFVDYgIFI3OjEKKyNkZWZpbmUgUE1fUkVHU0VUNyAgUjc6MAorI2RlZmluZSBQTV9SRUdTRVQ4ICBSNzowLCBQNTo1CisjZGVmaW5lIFBNX1JFR1NFVDkgIFI3OjAsIFA1OjQKKyNkZWZpbmUgUE1fUkVHU0VUMTAgUjc6MCwgUDU6MworI2RlZmluZSBQTV9SRUdTRVQxMSBSNzowLCBQNToyCisjZGVmaW5lIFBNX1JFR1NFVDEyIFI3OjAsIFA1OjEKKyNkZWZpbmUgUE1fUkVHU0VUMTMgUjc6MCwgUDU6MAorCisjZGVmaW5lIF9QTV9QVVNIKG4sIHgsIHcsIGJhc2UpIFBNX1JFRyMjbiA9IHdbRlAgKyAoKHgpIC0gKGJhc2UpKV07CisjZGVmaW5lIF9QTV9QT1AobiwgeCwgdywgYmFzZSkgIHdbRlAgKyAoKHgpIC0gKGJhc2UpKV0gPSBQTV9SRUcjI247CisjZGVmaW5lIFBNX1BVU0hfU1lOQyhuKSAgICAgICAgIFstLXNwXSA9IChQTV9SRUdTRVQjI24pOworI2RlZmluZSBQTV9QT1BfU1lOQyhuKSAgICAgICAgICAoUE1fUkVHU0VUIyNuKSA9IFtzcCsrXTsKKyNkZWZpbmUgUE1fUFVTSChuLCB4KSAgICAgICAgICAgUE1fUkVHIyNuID0gW0ZQKytdOworI2RlZmluZSBQTV9QT1AobiwgeCkgICAgICAgICAgICBbRlAtLV0gPSBQTV9SRUcjI247CisjZGVmaW5lIFBNX0NPUkVfUFVTSChuLCB4KSAgICAgIF9QTV9QVVNIKG4sIHgsICwgQ09SRU1NUl9CQVNFKQorI2RlZmluZSBQTV9DT1JFX1BPUChuLCB4KSAgICAgICBfUE1fUE9QKG4sIHgsICwgQ09SRU1NUl9CQVNFKQorI2RlZmluZSBQTV9TWVNfUFVTSChuLCB4KSAgICAgICBfUE1fUFVTSChuLCB4LCAsIFNZU01NUl9CQVNFKQorI2RlZmluZSBQTV9TWVNfUE9QKG4sIHgpICAgICAgICBfUE1fUE9QKG4sIHgsICwgU1lTTU1SX0JBU0UpCisjZGVmaW5lIFBNX1NZU19QVVNIMTYobiwgeCkgICAgIF9QTV9QVVNIKG4sIHgsIHcsIFNZU01NUl9CQVNFKQorI2RlZmluZSBQTV9TWVNfUE9QMTYobiwgeCkgICAgICBfUE1fUE9QKG4sIHgsIHcsIFNZU01NUl9CQVNFKQorCiBFTlRSWShfZG9faGliZXJuYXRlKQotCVstLVNQXSA9ICggUjc6MCwgUDU6MCApOwotCVstLVNQXSA9ICBSRVRTOwotCS8qIFNhdmUgU3lzdGVtIE1NUnMgKi8KLQlSMiA9IFIwOwotCVAwLkggPSBoaShQTExfQ1RMKTsKLQlQMC5MID0gbG8oUExMX0NUTCk7Ci0KLSNpZmRlZiBTSUNfSU1BU0swCi0JUE1fU1lTX1BVU0goU0lDX0lNQVNLMCkKLSNlbmRpZgotI2lmZGVmIFNJQ19JTUFTSzEKLQlQTV9TWVNfUFVTSChTSUNfSU1BU0sxKQotI2VuZGlmCi0jaWZkZWYgU0lDX0lNQVNLMgotCVBNX1NZU19QVVNIKFNJQ19JTUFTSzIpCi0jZW5kaWYKLSNpZmRlZiBTSUNfSU1BU0sKLQlQTV9TWVNfUFVTSChTSUNfSU1BU0spCi0jZW5kaWYKLSNpZmRlZiBTSUNfSUFSMAotCVBNX1NZU19QVVNIKFNJQ19JQVIwKQotCVBNX1NZU19QVVNIKFNJQ19JQVIxKQotCVBNX1NZU19QVVNIKFNJQ19JQVIyKQotI2VuZGlmCi0jaWZkZWYgU0lDX0lBUjMKLQlQTV9TWVNfUFVTSChTSUNfSUFSMykKLSNlbmRpZgotI2lmZGVmIFNJQ19JQVI0Ci0JUE1fU1lTX1BVU0goU0lDX0lBUjQpCi0JUE1fU1lTX1BVU0goU0lDX0lBUjUpCi0JUE1fU1lTX1BVU0goU0lDX0lBUjYpCi0jZW5kaWYKLSNpZmRlZiBTSUNfSUFSNwotCVBNX1NZU19QVVNIKFNJQ19JQVI3KQotI2VuZGlmCi0jaWZkZWYgU0lDX0lBUjgKLQlQTV9TWVNfUFVTSChTSUNfSUFSOCkKLQlQTV9TWVNfUFVTSChTSUNfSUFSOSkKLQlQTV9TWVNfUFVTSChTSUNfSUFSMTApCi0JUE1fU1lTX1BVU0goU0lDX0lBUjExKQotI2VuZGlmCi0KLSNpZmRlZiBTSUNfSVdSCi0JUE1fU1lTX1BVU0goU0lDX0lXUikKLSNlbmRpZgotI2lmZGVmIFNJQ19JV1IwCi0JUE1fU1lTX1BVU0goU0lDX0lXUjApCi0jZW5kaWYKLSNpZmRlZiBTSUNfSVdSMQotCVBNX1NZU19QVVNIKFNJQ19JV1IxKQotI2VuZGlmCi0jaWZkZWYgU0lDX0lXUjIKLQlQTV9TWVNfUFVTSChTSUNfSVdSMikKLSNlbmRpZgotCi0jaWZkZWYgUElOVDBfQVNTSUdOCi0JUE1fU1lTX1BVU0goUElOVDBfTUFTS19TRVQpCi0JUE1fU1lTX1BVU0goUElOVDFfTUFTS19TRVQpCi0JUE1fU1lTX1BVU0goUElOVDJfTUFTS19TRVQpCi0JUE1fU1lTX1BVU0goUElOVDNfTUFTS19TRVQpCi0JUE1fU1lTX1BVU0goUElOVDBfQVNTSUdOKQotCVBNX1NZU19QVVNIKFBJTlQxX0FTU0lHTikKLQlQTV9TWVNfUFVTSChQSU5UMl9BU1NJR04pCi0JUE1fU1lTX1BVU0goUElOVDNfQVNTSUdOKQotCVBNX1NZU19QVVNIKFBJTlQwX0lOVkVSVF9TRVQpCi0JUE1fU1lTX1BVU0goUElOVDFfSU5WRVJUX1NFVCkKLQlQTV9TWVNfUFVTSChQSU5UMl9JTlZFUlRfU0VUKQotCVBNX1NZU19QVVNIKFBJTlQzX0lOVkVSVF9TRVQpCi0JUE1fU1lTX1BVU0goUElOVDBfRURHRV9TRVQpCi0JUE1fU1lTX1BVU0goUElOVDFfRURHRV9TRVQpCi0JUE1fU1lTX1BVU0goUElOVDJfRURHRV9TRVQpCi0JUE1fU1lTX1BVU0goUElOVDNfRURHRV9TRVQpCi0jZW5kaWYKLQotCVBNX1NZU19QVVNIKEVCSVVfQU1CQ1RMMCkKLQlQTV9TWVNfUFVTSChFQklVX0FNQkNUTDEpCi0JUE1fU1lTX1BVU0gxNihFQklVX0FNR0NUTCkKLQotI2lmZGVmIEVCSVVfRkNUTAotCVBNX1NZU19QVVNIKEVCSVVfTUJTQ1RMKQotCVBNX1NZU19QVVNIKEVCSVVfTU9ERSkKLQlQTV9TWVNfUFVTSChFQklVX0ZDVEwpCi0jZW5kaWYKLQotI2lmZGVmIFBPUlRDSU9fRkVSCi0JUE1fU1lTX1BVU0gxNihQT1JUQ0lPX0RJUikKLQlQTV9TWVNfUFVTSDE2KFBPUlRDSU9fSU5FTikKLQlQTV9TWVNfUFVTSDE2KFBPUlRDSU8pCi0JUE1fU1lTX1BVU0gxNihQT1JUQ0lPX0ZFUikKLQlQTV9TWVNfUFVTSDE2KFBPUlRESU9fRElSKQotCVBNX1NZU19QVVNIMTYoUE9SVERJT19JTkVOKQotCVBNX1NZU19QVVNIMTYoUE9SVERJTykKLQlQTV9TWVNfUFVTSDE2KFBPUlRESU9fRkVSKQotCVBNX1NZU19QVVNIMTYoUE9SVEVJT19ESVIpCi0JUE1fU1lTX1BVU0gxNihQT1JURUlPX0lORU4pCi0JUE1fU1lTX1BVU0gxNihQT1JURUlPKQotCVBNX1NZU19QVVNIMTYoUE9SVEVJT19GRVIpCi0jZW5kaWYKLQotCVBNX1NZU19QVVNIMTYoU1lTQ1IpCi0KLQkvKiBTYXZlIENvcmUgTU1ScyAqLwotCVAwLkggPSBoaShTUkFNX0JBU0VfQUREUkVTUyk7Ci0JUDAuTCA9IGxvKFNSQU1fQkFTRV9BRERSRVNTKTsKLQotCVBNX1BVU0goRE1FTV9DT05UUk9MKQotCVBNX1BVU0goRENQTEJfQUREUjApCi0JUE1fUFVTSChEQ1BMQl9BRERSMSkKLQlQTV9QVVNIKERDUExCX0FERFIyKQotCVBNX1BVU0goRENQTEJfQUREUjMpCi0JUE1fUFVTSChEQ1BMQl9BRERSNCkKLQlQTV9QVVNIKERDUExCX0FERFI1KQotCVBNX1BVU0goRENQTEJfQUREUjYpCi0JUE1fUFVTSChEQ1BMQl9BRERSNykKLQlQTV9QVVNIKERDUExCX0FERFI4KQotCVBNX1BVU0goRENQTEJfQUREUjkpCi0JUE1fUFVTSChEQ1BMQl9BRERSMTApCi0JUE1fUFVTSChEQ1BMQl9BRERSMTEpCi0JUE1fUFVTSChEQ1BMQl9BRERSMTIpCi0JUE1fUFVTSChEQ1BMQl9BRERSMTMpCi0JUE1fUFVTSChEQ1BMQl9BRERSMTQpCi0JUE1fUFVTSChEQ1BMQl9BRERSMTUpCi0JUE1fUFVTSChEQ1BMQl9EQVRBMCkKLQlQTV9QVVNIKERDUExCX0RBVEExKQotCVBNX1BVU0goRENQTEJfREFUQTIpCi0JUE1fUFVTSChEQ1BMQl9EQVRBMykKLQlQTV9QVVNIKERDUExCX0RBVEE0KQotCVBNX1BVU0goRENQTEJfREFUQTUpCi0JUE1fUFVTSChEQ1BMQl9EQVRBNikKLQlQTV9QVVNIKERDUExCX0RBVEE3KQotCVBNX1BVU0goRENQTEJfREFUQTgpCi0JUE1fUFVTSChEQ1BMQl9EQVRBOSkKLQlQTV9QVVNIKERDUExCX0RBVEExMCkKLQlQTV9QVVNIKERDUExCX0RBVEExMSkKLQlQTV9QVVNIKERDUExCX0RBVEExMikKLQlQTV9QVVNIKERDUExCX0RBVEExMykKLQlQTV9QVVNIKERDUExCX0RBVEExNCkKLQlQTV9QVVNIKERDUExCX0RBVEExNSkKLQlQTV9QVVNIKElNRU1fQ09OVFJPTCkKLQlQTV9QVVNIKElDUExCX0FERFIwKQotCVBNX1BVU0goSUNQTEJfQUREUjEpCi0JUE1fUFVTSChJQ1BMQl9BRERSMikKLQlQTV9QVVNIKElDUExCX0FERFIzKQotCVBNX1BVU0goSUNQTEJfQUREUjQpCi0JUE1fUFVTSChJQ1BMQl9BRERSNSkKLQlQTV9QVVNIKElDUExCX0FERFI2KQotCVBNX1BVU0goSUNQTEJfQUREUjcpCi0JUE1fUFVTSChJQ1BMQl9BRERSOCkKLQlQTV9QVVNIKElDUExCX0FERFI5KQotCVBNX1BVU0goSUNQTEJfQUREUjEwKQotCVBNX1BVU0goSUNQTEJfQUREUjExKQotCVBNX1BVU0goSUNQTEJfQUREUjEyKQotCVBNX1BVU0goSUNQTEJfQUREUjEzKQotCVBNX1BVU0goSUNQTEJfQUREUjE0KQotCVBNX1BVU0goSUNQTEJfQUREUjE1KQotCVBNX1BVU0goSUNQTEJfREFUQTApCi0JUE1fUFVTSChJQ1BMQl9EQVRBMSkKLQlQTV9QVVNIKElDUExCX0RBVEEyKQotCVBNX1BVU0goSUNQTEJfREFUQTMpCi0JUE1fUFVTSChJQ1BMQl9EQVRBNCkKLQlQTV9QVVNIKElDUExCX0RBVEE1KQotCVBNX1BVU0goSUNQTEJfREFUQTYpCi0JUE1fUFVTSChJQ1BMQl9EQVRBNykKLQlQTV9QVVNIKElDUExCX0RBVEE4KQotCVBNX1BVU0goSUNQTEJfREFUQTkpCi0JUE1fUFVTSChJQ1BMQl9EQVRBMTApCi0JUE1fUFVTSChJQ1BMQl9EQVRBMTEpCi0JUE1fUFVTSChJQ1BMQl9EQVRBMTIpCi0JUE1fUFVTSChJQ1BMQl9EQVRBMTMpCi0JUE1fUFVTSChJQ1BMQl9EQVRBMTQpCi0JUE1fUFVTSChJQ1BMQl9EQVRBMTUpCi0JUE1fUFVTSChFVlQwKQotCVBNX1BVU0goRVZUMSkKLQlQTV9QVVNIKEVWVDIpCi0JUE1fUFVTSChFVlQzKQotCVBNX1BVU0goRVZUNCkKLQlQTV9QVVNIKEVWVDUpCi0JUE1fUFVTSChFVlQ2KQotCVBNX1BVU0goRVZUNykKLQlQTV9QVVNIKEVWVDgpCi0JUE1fUFVTSChFVlQ5KQotCVBNX1BVU0goRVZUMTApCi0JUE1fUFVTSChFVlQxMSkKLQlQTV9QVVNIKEVWVDEyKQotCVBNX1BVU0goRVZUMTMpCi0JUE1fUFVTSChFVlQxNCkKLQlQTV9QVVNIKEVWVDE1KQotCVBNX1BVU0goSU1BU0spCi0JUE1fUFVTSChJTEFUKQotCVBNX1BVU0goSVBSSU8pCi0JUE1fUFVTSChUQ05UTCkKLQlQTV9QVVNIKFRQRVJJT0QpCi0JUE1fUFVTSChUU0NBTEUpCi0JUE1fUFVTSChUQ09VTlQpCi0JUE1fUFVTSChUQlVGQ1RMKQotCi0JLyogU2F2ZSBDb3JlIFJlZ2lzdGVycyAqLwotCVstLXNwXSA9IFNZU0NGRzsKLQlbLS1zcF0gPSAoIFI3OjAsIFA1OjAgKTsKKwkvKgorCSAqIFNhdmUgdGhlIGNvcmUgcmVncyBlYXJseSBzbyB3ZSBjYW4gYmxvdyB0aGVtIGF3YXkgd2hlbgorCSAqIHNhdmluZy9yZXN0b3JpbmcgTU1SIHN0YXRlcworCSAqLworCVstLXNwXSA9IChSNzowLCBQNTowKTsKIAlbLS1zcF0gPSBmcDsKIAlbLS1zcF0gPSB1c3A7CiAKQEAgLTUwNiw0NyArMzYwLDQ5NyBAQAogCVstLXNwXSA9IExCMDsKIAlbLS1zcF0gPSBMQjE7CiAKKwkvKiBXZSBjYW4ndCBwdXNoIFJFVEkgZGlyZWN0bHkgYXMgdGhhdCdsbCBjaGFuZ2UgSVBFTkRbNF0gKi8KKwlyNyA9IFJFVEk7CisJWy0tc3BdID0gUkVUUzsKIAlbLS1zcF0gPSBBU1RBVDsKIAlbLS1zcF0gPSBDWUNMRVM7CiAJWy0tc3BdID0gQ1lDTEVTMjsKLQotCVstLXNwXSA9IFJFVFM7Ci0JcjAgPSBSRVRJOwotCVstLXNwXSA9IHIwOworCVstLXNwXSA9IFNZU0NGRzsKIAlbLS1zcF0gPSBSRVRYOwotCVstLXNwXSA9IFJFVE47Ci0JWy0tc3BdID0gUkVURTsKIAlbLS1zcF0gPSBTRVFTVEFUOworCVstLXNwXSA9IHI3OworCisJLyogU2F2ZSBmaXJzdCBmdW5jIGFyZyBpbiBNMyAqLworCU0zID0gUjA7CisKKwkvKiBTYXZlIHN5c3RlbSBNTVJzICovCisJRlAuSCA9IGhpKFNZU01NUl9CQVNFKTsKKwlGUC5MID0gbG8oU1lTTU1SX0JBU0UpOworCisjaWZkZWYgU0lDX0lNQVNLMAorCVBNX1NZU19QVVNIKDAsIFNJQ19JTUFTSzApCisJUE1fU1lTX1BVU0goMSwgU0lDX0lNQVNLMSkKKyMgaWZkZWYgU0lDX0lNQVNLMgorCVBNX1NZU19QVVNIKDIsIFNJQ19JTUFTSzIpCisjIGVuZGlmCisjZWxzZQorCVBNX1NZU19QVVNIKDAsIFNJQ19JTUFTSykKKyNlbmRpZgorI2lmZGVmIFNJQ19JQVIwCisJUE1fU1lTX1BVU0goMywgU0lDX0lBUjApCisJUE1fU1lTX1BVU0goNCwgU0lDX0lBUjEpCisJUE1fU1lTX1BVU0goNSwgU0lDX0lBUjIpCisjZW5kaWYKKyNpZmRlZiBTSUNfSUFSMworCVBNX1NZU19QVVNIKDYsIFNJQ19JQVIzKQorI2VuZGlmCisjaWZkZWYgU0lDX0lBUjQKKwlQTV9TWVNfUFVTSCg3LCBTSUNfSUFSNCkKKwlQTV9TWVNfUFVTSCg4LCBTSUNfSUFSNSkKKwlQTV9TWVNfUFVTSCg5LCBTSUNfSUFSNikKKyNlbmRpZgorI2lmZGVmIFNJQ19JQVI3CisJUE1fU1lTX1BVU0goMTAsIFNJQ19JQVI3KQorI2VuZGlmCisjaWZkZWYgU0lDX0lBUjgKKwlQTV9TWVNfUFVTSCgxMSwgU0lDX0lBUjgpCisJUE1fU1lTX1BVU0goMTIsIFNJQ19JQVI5KQorCVBNX1NZU19QVVNIKDEzLCBTSUNfSUFSMTApCisjZW5kaWYKKwlQTV9QVVNIX1NZTkMoMTMpCisjaWZkZWYgU0lDX0lBUjExCisJUE1fU1lTX1BVU0goMCwgU0lDX0lBUjExKQorI2VuZGlmCisKKyNpZmRlZiBTSUNfSVdSCisJUE1fU1lTX1BVU0goMSwgU0lDX0lXUikKKyNlbmRpZgorI2lmZGVmIFNJQ19JV1IwCisJUE1fU1lTX1BVU0goMSwgU0lDX0lXUjApCisjZW5kaWYKKyNpZmRlZiBTSUNfSVdSMQorCVBNX1NZU19QVVNIKDIsIFNJQ19JV1IxKQorI2VuZGlmCisjaWZkZWYgU0lDX0lXUjIKKwlQTV9TWVNfUFVTSCgzLCBTSUNfSVdSMikKKyNlbmRpZgorCisjaWZkZWYgUElOVDBfQVNTSUdOCisJUE1fU1lTX1BVU0goNCwgUElOVDBfTUFTS19TRVQpCisJUE1fU1lTX1BVU0goNSwgUElOVDFfTUFTS19TRVQpCisJUE1fU1lTX1BVU0goNiwgUElOVDJfTUFTS19TRVQpCisJUE1fU1lTX1BVU0goNywgUElOVDNfTUFTS19TRVQpCisJUE1fU1lTX1BVU0goOCwgUElOVDBfQVNTSUdOKQorCVBNX1NZU19QVVNIKDksIFBJTlQxX0FTU0lHTikKKwlQTV9TWVNfUFVTSCgxMCwgUElOVDJfQVNTSUdOKQorCVBNX1NZU19QVVNIKDExLCBQSU5UM19BU1NJR04pCisJUE1fU1lTX1BVU0goMTIsIFBJTlQwX0lOVkVSVF9TRVQpCisJUE1fU1lTX1BVU0goMTMsIFBJTlQxX0lOVkVSVF9TRVQpCisJUE1fUFVTSF9TWU5DKDEzKQorCVBNX1NZU19QVVNIKDAsIFBJTlQyX0lOVkVSVF9TRVQpCisJUE1fU1lTX1BVU0goMSwgUElOVDNfSU5WRVJUX1NFVCkKKwlQTV9TWVNfUFVTSCgyLCBQSU5UMF9FREdFX1NFVCkKKwlQTV9TWVNfUFVTSCgzLCBQSU5UMV9FREdFX1NFVCkKKwlQTV9TWVNfUFVTSCg0LCBQSU5UMl9FREdFX1NFVCkKKwlQTV9TWVNfUFVTSCg1LCBQSU5UM19FREdFX1NFVCkKKyNlbmRpZgorCisJUE1fU1lTX1BVU0gxNig2LCBTWVNDUikKKworCVBNX1NZU19QVVNIMTYoNywgRUJJVV9BTUdDVEwpCisJUE1fU1lTX1BVU0goOCwgRUJJVV9BTUJDVEwwKQorCVBNX1NZU19QVVNIKDksIEVCSVVfQU1CQ1RMMSkKKyNpZmRlZiBFQklVX0ZDVEwKKwlQTV9TWVNfUFVTSCgxMCwgRUJJVV9NQlNDVEwpCisJUE1fU1lTX1BVU0goMTEsIEVCSVVfTU9ERSkKKwlQTV9TWVNfUFVTSCgxMiwgRUJJVV9GQ1RMKQorCVBNX1BVU0hfU1lOQygxMikKKyNlbHNlCisJUE1fUFVTSF9TWU5DKDkpCisjZW5kaWYKKworCS8qIFNhdmUgQ29yZSBNTVJzICovCisJSTAuSCA9IGhpKENPUkVNTVJfQkFTRSk7CisJSTAuTCA9IGxvKENPUkVNTVJfQkFTRSk7CisJSTEgPSBJMDsKKwlJMiA9IEkwOworCUkzID0gSTA7CisJQjAgPSBJMDsKKwlCMSA9IEkwOworCUIyID0gSTA7CisJQjMgPSBJMDsKKwlJMS5MID0gbG8oRENQTEJfQUREUjApOworCUkyLkwgPSBsbyhEQ1BMQl9EQVRBMCk7CisJSTMuTCA9IGxvKElDUExCX0FERFIwKTsKKwlCMC5MID0gbG8oSUNQTEJfREFUQTApOworCUIxLkwgPSBsbyhFVlQyKTsKKwlCMi5MID0gbG8oSU1BU0spOworCUIzLkwgPSBsbyhUQ05UTCk7CisKKwkvKiBEQ1BMQiBBZGRyICovCisJRlAgPSBJMTsKKwlQTV9QVVNIKDAsIERDUExCX0FERFIwKQorCVBNX1BVU0goMSwgRENQTEJfQUREUjEpCisJUE1fUFVTSCgyLCBEQ1BMQl9BRERSMikKKwlQTV9QVVNIKDMsIERDUExCX0FERFIzKQorCVBNX1BVU0goNCwgRENQTEJfQUREUjQpCisJUE1fUFVTSCg1LCBEQ1BMQl9BRERSNSkKKwlQTV9QVVNIKDYsIERDUExCX0FERFI2KQorCVBNX1BVU0goNywgRENQTEJfQUREUjcpCisJUE1fUFVTSCg4LCBEQ1BMQl9BRERSOCkKKwlQTV9QVVNIKDksIERDUExCX0FERFI5KQorCVBNX1BVU0goMTAsIERDUExCX0FERFIxMCkKKwlQTV9QVVNIKDExLCBEQ1BMQl9BRERSMTEpCisJUE1fUFVTSCgxMiwgRENQTEJfQUREUjEyKQorCVBNX1BVU0goMTMsIERDUExCX0FERFIxMykKKwlQTV9QVVNIX1NZTkMoMTMpCisJUE1fUFVTSCgwLCBEQ1BMQl9BRERSMTQpCisJUE1fUFVTSCgxLCBEQ1BMQl9BRERSMTUpCisKKwkvKiBEQ1BMQiBEYXRhICovCisJRlAgPSBJMjsKKwlQTV9QVVNIKDIsIERDUExCX0RBVEEwKQorCVBNX1BVU0goMywgRENQTEJfREFUQTEpCisJUE1fUFVTSCg0LCBEQ1BMQl9EQVRBMikKKwlQTV9QVVNIKDUsIERDUExCX0RBVEEzKQorCVBNX1BVU0goNiwgRENQTEJfREFUQTQpCisJUE1fUFVTSCg3LCBEQ1BMQl9EQVRBNSkKKwlQTV9QVVNIKDgsIERDUExCX0RBVEE2KQorCVBNX1BVU0goOSwgRENQTEJfREFUQTcpCisJUE1fUFVTSCgxMCwgRENQTEJfREFUQTgpCisJUE1fUFVTSCgxMSwgRENQTEJfREFUQTkpCisJUE1fUFVTSCgxMiwgRENQTEJfREFUQTEwKQorCVBNX1BVU0goMTMsIERDUExCX0RBVEExMSkKKwlQTV9QVVNIX1NZTkMoMTMpCisJUE1fUFVTSCgwLCBEQ1BMQl9EQVRBMTIpCisJUE1fUFVTSCgxLCBEQ1BMQl9EQVRBMTMpCisJUE1fUFVTSCgyLCBEQ1BMQl9EQVRBMTQpCisJUE1fUFVTSCgzLCBEQ1BMQl9EQVRBMTUpCisKKwkvKiBJQ1BMQiBBZGRyICovCisJRlAgPSBJMzsKKwlQTV9QVVNIKDQsIElDUExCX0FERFIwKQorCVBNX1BVU0goNSwgSUNQTEJfQUREUjEpCisJUE1fUFVTSCg2LCBJQ1BMQl9BRERSMikKKwlQTV9QVVNIKDcsIElDUExCX0FERFIzKQorCVBNX1BVU0goOCwgSUNQTEJfQUREUjQpCisJUE1fUFVTSCg5LCBJQ1BMQl9BRERSNSkKKwlQTV9QVVNIKDEwLCBJQ1BMQl9BRERSNikKKwlQTV9QVVNIKDExLCBJQ1BMQl9BRERSNykKKwlQTV9QVVNIKDEyLCBJQ1BMQl9BRERSOCkKKwlQTV9QVVNIKDEzLCBJQ1BMQl9BRERSOSkKKwlQTV9QVVNIX1NZTkMoMTMpCisJUE1fUFVTSCgwLCBJQ1BMQl9BRERSMTApCisJUE1fUFVTSCgxLCBJQ1BMQl9BRERSMTEpCisJUE1fUFVTSCgyLCBJQ1BMQl9BRERSMTIpCisJUE1fUFVTSCgzLCBJQ1BMQl9BRERSMTMpCisJUE1fUFVTSCg0LCBJQ1BMQl9BRERSMTQpCisJUE1fUFVTSCg1LCBJQ1BMQl9BRERSMTUpCisKKwkvKiBJQ1BMQiBEYXRhICovCisJRlAgPSBCMDsKKwlQTV9QVVNIKDYsIElDUExCX0RBVEEwKQorCVBNX1BVU0goNywgSUNQTEJfREFUQTEpCisJUE1fUFVTSCg4LCBJQ1BMQl9EQVRBMikKKwlQTV9QVVNIKDksIElDUExCX0RBVEEzKQorCVBNX1BVU0goMTAsIElDUExCX0RBVEE0KQorCVBNX1BVU0goMTEsIElDUExCX0RBVEE1KQorCVBNX1BVU0goMTIsIElDUExCX0RBVEE2KQorCVBNX1BVU0goMTMsIElDUExCX0RBVEE3KQorCVBNX1BVU0hfU1lOQygxMykKKwlQTV9QVVNIKDAsIElDUExCX0RBVEE4KQorCVBNX1BVU0goMSwgSUNQTEJfREFUQTkpCisJUE1fUFVTSCgyLCBJQ1BMQl9EQVRBMTApCisJUE1fUFVTSCgzLCBJQ1BMQl9EQVRBMTEpCisJUE1fUFVTSCg0LCBJQ1BMQl9EQVRBMTIpCisJUE1fUFVTSCg1LCBJQ1BMQl9EQVRBMTMpCisJUE1fUFVTSCg2LCBJQ1BMQl9EQVRBMTQpCisJUE1fUFVTSCg3LCBJQ1BMQl9EQVRBMTUpCisKKwkvKiBFdmVudCBWZWN0b3JzICovCisJRlAgPSBCMTsKKwlQTV9QVVNIKDgsIEVWVDIpCisJUE1fUFVTSCg5LCBFVlQzKQorCUZQICs9IDQ7CS8qIEVWVDQgKi8KKwlQTV9QVVNIKDEwLCBFVlQ1KQorCVBNX1BVU0goMTEsIEVWVDYpCisJUE1fUFVTSCgxMiwgRVZUNykKKwlQTV9QVVNIKDEzLCBFVlQ4KQorCVBNX1BVU0hfU1lOQygxMykKKwlQTV9QVVNIKDAsIEVWVDkpCisJUE1fUFVTSCgxLCBFVlQxMCkKKwlQTV9QVVNIKDIsIEVWVDExKQorCVBNX1BVU0goMywgRVZUMTIpCisJUE1fUFVTSCg0LCBFVlQxMykKKwlQTV9QVVNIKDUsIEVWVDE0KQorCVBNX1BVU0goNiwgRVZUMTUpCisKKwkvKiBDRUMgKi8KKwlGUCA9IEIyOworCVBNX1BVU0goNywgSU1BU0spCisJRlAgKz0gNDsJLyogSVBFTkQgKi8KKwlQTV9QVVNIKDgsIElMQVQpCisJUE1fUFVTSCg5LCBJUFJJTykKKworCS8qIENvcmUgVGltZXIgKi8KKwlGUCA9IEIzOworCVBNX1BVU0goMTAsIFRDTlRMKQorCVBNX1BVU0goMTEsIFRQRVJJT0QpCisJUE1fUFVTSCgxMiwgVFNDQUxFKQorCVBNX1BVU0goMTMsIFRDT1VOVCkKKwlQTV9QVVNIX1NZTkMoMTMpCisKKwkvKiBNaXNjIG5vbi1jb250aWd1b3VzIHJlZ2lzdGVycyAqLworCUZQID0gSTA7CisJUE1fQ09SRV9QVVNIKDAsIERNRU1fQ09OVFJPTCk7CisJUE1fQ09SRV9QVVNIKDEsIElNRU1fQ09OVFJPTCk7CisJUE1fQ09SRV9QVVNIKDIsIFRCVUZDVEwpOworCVBNX1BVU0hfU1lOQygyKQorCisJLyogU2V0dXAgYXJncyB0byBoaWJlcm5hdGUgbW9kZSBlYXJseSBmb3IgcGlwZWxpbmUgb3B0aW1pemF0aW9uICovCisJUjAgPSBNMzsKKwlQMS5IID0gX2hpYmVybmF0ZV9tb2RlOworCVAxLkwgPSBfaGliZXJuYXRlX21vZGU7CiAKIAkvKiBTYXZlIE1hZ2ljLCByZXR1cm4gYWRkcmVzcyBhbmQgU3RhY2sgUG9pbnRlciAqLwotCVAwLkggPSAwOwotCVAwLkwgPSAwOwotCVIwLkggPSAweERFQUQ7CS8qIEhpYmVybmF0ZSBNYWdpYyAqLwotCVIwLkwgPSAweEJFRUY7Ci0JW1AwKytdID0gUjA7CS8qIFN0b3JlIEhpYmVybmF0ZSBNYWdpYyAqLwotCVIwLkggPSAuTHBtX3Jlc3VtZV9oZXJlOwotCVIwLkwgPSAuTHBtX3Jlc3VtZV9oZXJlOwotCVtQMCsrXSA9IFIwOwkvKiBTYXZlIFJldHVybiBBZGRyZXNzICovCisJUDAgPSAwOworCVIxLkggPSAweERFQUQ7CS8qIEhpYmVybmF0ZSBNYWdpYyAqLworCVIxLkwgPSAweEJFRUY7CisJUjIuSCA9IC5McG1fcmVzdW1lX2hlcmU7CisJUjIuTCA9IC5McG1fcmVzdW1lX2hlcmU7CisJW1AwKytdID0gUjE7CS8qIFN0b3JlIEhpYmVybmF0ZSBNYWdpYyAqLworCVtQMCsrXSA9IFIyOwkvKiBTYXZlIFJldHVybiBBZGRyZXNzICovCiAJW1AwKytdID0gU1A7CS8qIFNhdmUgU3RhY2sgUG9pbnRlciAqLwotCVAwLkggPSBfaGliZXJuYXRlX21vZGU7Ci0JUDAuTCA9IF9oaWJlcm5hdGVfbW9kZTsKLQlSMCA9IFIyOwotCWNhbGwgKFAwKTsgLyogR29vZGJ5ZSAqLworCisJLyogTXVzdCB1c2UgYW4gaW5kaXJlY3QgY2FsbCBhcyB3ZSBuZWVkIHRvIGp1bXAgdG8gTDEgKi8KKwljYWxsIChQMSk7IC8qIEdvb2RieWUgKi8KIAogLkxwbV9yZXN1bWVfaGVyZToKIAotCS8qIFJlc3RvcmUgQ29yZSBSZWdpc3RlcnMgKi8KLQlTRVFTVEFUID0gW3NwKytdOwotCVJFVEUgPSBbc3ArK107Ci0JUkVUTiA9IFtzcCsrXTsKLQlSRVRYID0gW3NwKytdOwotCXIwID0gW3NwKytdOwotCVJFVEkgPSByMDsKLQlSRVRTID0gW3NwKytdOworCS8qIFJlc3RvcmUgQ29yZSBNTVJzICovCisJSTAuSCA9IGhpKENPUkVNTVJfQkFTRSk7CisJSTAuTCA9IGxvKENPUkVNTVJfQkFTRSk7CisJSTEgPSBJMDsKKwlJMiA9IEkwOworCUkzID0gSTA7CisJQjAgPSBJMDsKKwlCMSA9IEkwOworCUIyID0gSTA7CisJQjMgPSBJMDsKKwlJMS5MID0gbG8oRENQTEJfQUREUjE1KTsKKwlJMi5MID0gbG8oRENQTEJfREFUQTE1KTsKKwlJMy5MID0gbG8oSUNQTEJfQUREUjE1KTsKKwlCMC5MID0gbG8oSUNQTEJfREFUQTE1KTsKKwlCMS5MID0gbG8oRVZUMTUpOworCUIyLkwgPSBsbyhJUFJJTyk7CisJQjMuTCA9IGxvKFRDT1VOVCk7CiAKKwkvKiBNaXNjIG5vbi1jb250aWd1b3VzIHJlZ2lzdGVycyAqLworCUZQID0gSTA7CisJUE1fUE9QX1NZTkMoMikKKwlQTV9DT1JFX1BPUCgyLCBUQlVGQ1RMKQorCVBNX0NPUkVfUE9QKDEsIElNRU1fQ09OVFJPTCkKKwlQTV9DT1JFX1BPUCgwLCBETUVNX0NPTlRST0wpCisKKwkvKiBDb3JlIFRpbWVyICovCisJUE1fUE9QX1NZTkMoMTMpCisJRlAgPSBCMzsKKwlQTV9QT1AoMTMsIFRDT1VOVCkKKwlQTV9QT1AoMTIsIFRTQ0FMRSkKKwlQTV9QT1AoMTEsIFRQRVJJT0QpCisJUE1fUE9QKDEwLCBUQ05UTCkKKworCS8qIENFQyAqLworCUZQID0gQjI7CisJUE1fUE9QKDksIElQUklPKQorCVBNX1BPUCg4LCBJTEFUKQorCUZQICs9IC00OwkvKiBJUEVORCAqLworCVBNX1BPUCg3LCBJTUFTSykKKworCS8qIEV2ZW50IFZlY3RvcnMgKi8KKwlGUCA9IEIxOworCVBNX1BPUCg2LCBFVlQxNSkKKwlQTV9QT1AoNSwgRVZUMTQpCisJUE1fUE9QKDQsIEVWVDEzKQorCVBNX1BPUCgzLCBFVlQxMikKKwlQTV9QT1AoMiwgRVZUMTEpCisJUE1fUE9QKDEsIEVWVDEwKQorCVBNX1BPUCgwLCBFVlQ5KQorCVBNX1BPUF9TWU5DKDEzKQorCVBNX1BPUCgxMywgRVZUOCkKKwlQTV9QT1AoMTIsIEVWVDcpCisJUE1fUE9QKDExLCBFVlQ2KQorCVBNX1BPUCgxMCwgRVZUNSkKKwlGUCArPSAtNDsJLyogRVZUNCAqLworCVBNX1BPUCg5LCBFVlQzKQorCVBNX1BPUCg4LCBFVlQyKQorCisJLyogSUNQTEIgRGF0YSAqLworCUZQID0gQjA7CisJUE1fUE9QKDcsIElDUExCX0RBVEExNSkKKwlQTV9QT1AoNiwgSUNQTEJfREFUQTE0KQorCVBNX1BPUCg1LCBJQ1BMQl9EQVRBMTMpCisJUE1fUE9QKDQsIElDUExCX0RBVEExMikKKwlQTV9QT1AoMywgSUNQTEJfREFUQTExKQorCVBNX1BPUCgyLCBJQ1BMQl9EQVRBMTApCisJUE1fUE9QKDEsIElDUExCX0RBVEE5KQorCVBNX1BPUCgwLCBJQ1BMQl9EQVRBOCkKKwlQTV9QT1BfU1lOQygxMykKKwlQTV9QT1AoMTMsIElDUExCX0RBVEE3KQorCVBNX1BPUCgxMiwgSUNQTEJfREFUQTYpCisJUE1fUE9QKDExLCBJQ1BMQl9EQVRBNSkKKwlQTV9QT1AoMTAsIElDUExCX0RBVEE0KQorCVBNX1BPUCg5LCBJQ1BMQl9EQVRBMykKKwlQTV9QT1AoOCwgSUNQTEJfREFUQTIpCisJUE1fUE9QKDcsIElDUExCX0RBVEExKQorCVBNX1BPUCg2LCBJQ1BMQl9EQVRBMCkKKworCS8qIElDUExCIEFkZHIgKi8KKwlGUCA9IEkzOworCVBNX1BPUCg1LCBJQ1BMQl9BRERSMTUpCisJUE1fUE9QKDQsIElDUExCX0FERFIxNCkKKwlQTV9QT1AoMywgSUNQTEJfQUREUjEzKQorCVBNX1BPUCgyLCBJQ1BMQl9BRERSMTIpCisJUE1fUE9QKDEsIElDUExCX0FERFIxMSkKKwlQTV9QT1AoMCwgSUNQTEJfQUREUjEwKQorCVBNX1BPUF9TWU5DKDEzKQorCVBNX1BPUCgxMywgSUNQTEJfQUREUjkpCisJUE1fUE9QKDEyLCBJQ1BMQl9BRERSOCkKKwlQTV9QT1AoMTEsIElDUExCX0FERFI3KQorCVBNX1BPUCgxMCwgSUNQTEJfQUREUjYpCisJUE1fUE9QKDksIElDUExCX0FERFI1KQorCVBNX1BPUCg4LCBJQ1BMQl9BRERSNCkKKwlQTV9QT1AoNywgSUNQTEJfQUREUjMpCisJUE1fUE9QKDYsIElDUExCX0FERFIyKQorCVBNX1BPUCg1LCBJQ1BMQl9BRERSMSkKKwlQTV9QT1AoNCwgSUNQTEJfQUREUjApCisKKwkvKiBEQ1BMQiBEYXRhICovCisJRlAgPSBJMjsKKwlQTV9QT1AoMywgRENQTEJfREFUQTE1KQorCVBNX1BPUCgyLCBEQ1BMQl9EQVRBMTQpCisJUE1fUE9QKDEsIERDUExCX0RBVEExMykKKwlQTV9QT1AoMCwgRENQTEJfREFUQTEyKQorCVBNX1BPUF9TWU5DKDEzKQorCVBNX1BPUCgxMywgRENQTEJfREFUQTExKQorCVBNX1BPUCgxMiwgRENQTEJfREFUQTEwKQorCVBNX1BPUCgxMSwgRENQTEJfREFUQTkpCisJUE1fUE9QKDEwLCBEQ1BMQl9EQVRBOCkKKwlQTV9QT1AoOSwgRENQTEJfREFUQTcpCisJUE1fUE9QKDgsIERDUExCX0RBVEE2KQorCVBNX1BPUCg3LCBEQ1BMQl9EQVRBNSkKKwlQTV9QT1AoNiwgRENQTEJfREFUQTQpCisJUE1fUE9QKDUsIERDUExCX0RBVEEzKQorCVBNX1BPUCg0LCBEQ1BMQl9EQVRBMikKKwlQTV9QT1AoMywgRENQTEJfREFUQTEpCisJUE1fUE9QKDIsIERDUExCX0RBVEEwKQorCisJLyogRENQTEIgQWRkciAqLworCUZQID0gSTE7CisJUE1fUE9QKDEsIERDUExCX0FERFIxNSkKKwlQTV9QT1AoMCwgRENQTEJfQUREUjE0KQorCVBNX1BPUF9TWU5DKDEzKQorCVBNX1BPUCgxMywgRENQTEJfQUREUjEzKQorCVBNX1BPUCgxMiwgRENQTEJfQUREUjEyKQorCVBNX1BPUCgxMSwgRENQTEJfQUREUjExKQorCVBNX1BPUCgxMCwgRENQTEJfQUREUjEwKQorCVBNX1BPUCg5LCBEQ1BMQl9BRERSOSkKKwlQTV9QT1AoOCwgRENQTEJfQUREUjgpCisJUE1fUE9QKDcsIERDUExCX0FERFI3KQorCVBNX1BPUCg2LCBEQ1BMQl9BRERSNikKKwlQTV9QT1AoNSwgRENQTEJfQUREUjUpCisJUE1fUE9QKDQsIERDUExCX0FERFI0KQorCVBNX1BPUCgzLCBEQ1BMQl9BRERSMykKKwlQTV9QT1AoMiwgRENQTEJfQUREUjIpCisJUE1fUE9QKDEsIERDUExCX0FERFIxKQorCVBNX1BPUCgwLCBEQ1BMQl9BRERSMCkKKworCS8qIFJlc3RvcmUgU3lzdGVtIE1NUnMgKi8KKwlGUC5IID0gaGkoU1lTTU1SX0JBU0UpOworCUZQLkwgPSBsbyhTWVNNTVJfQkFTRSk7CisKKyNpZmRlZiBFQklVX0ZDVEwKKwlQTV9QT1BfU1lOQygxMikKKwlQTV9TWVNfUE9QKDEyLCBFQklVX0ZDVEwpCisJUE1fU1lTX1BPUCgxMSwgRUJJVV9NT0RFKQorCVBNX1NZU19QT1AoMTAsIEVCSVVfTUJTQ1RMKQorI2Vsc2UKKwlQTV9QT1BfU1lOQyg5KQorI2VuZGlmCisJUE1fU1lTX1BPUCg5LCBFQklVX0FNQkNUTDEpCisJUE1fU1lTX1BPUCg4LCBFQklVX0FNQkNUTDApCisJUE1fU1lTX1BPUDE2KDcsIEVCSVVfQU1HQ1RMKQorCisJUE1fU1lTX1BPUDE2KDYsIFNZU0NSKQorCisjaWZkZWYgUElOVDBfQVNTSUdOCisJUE1fU1lTX1BPUCg1LCBQSU5UM19FREdFX1NFVCkKKwlQTV9TWVNfUE9QKDQsIFBJTlQyX0VER0VfU0VUKQorCVBNX1NZU19QT1AoMywgUElOVDFfRURHRV9TRVQpCisJUE1fU1lTX1BPUCgyLCBQSU5UMF9FREdFX1NFVCkKKwlQTV9TWVNfUE9QKDEsIFBJTlQzX0lOVkVSVF9TRVQpCisJUE1fU1lTX1BPUCgwLCBQSU5UMl9JTlZFUlRfU0VUKQorCVBNX1BPUF9TWU5DKDEzKQorCVBNX1NZU19QT1AoMTMsIFBJTlQxX0lOVkVSVF9TRVQpCisJUE1fU1lTX1BPUCgxMiwgUElOVDBfSU5WRVJUX1NFVCkKKwlQTV9TWVNfUE9QKDExLCBQSU5UM19BU1NJR04pCisJUE1fU1lTX1BPUCgxMCwgUElOVDJfQVNTSUdOKQorCVBNX1NZU19QT1AoOSwgUElOVDFfQVNTSUdOKQorCVBNX1NZU19QT1AoOCwgUElOVDBfQVNTSUdOKQorCVBNX1NZU19QT1AoNywgUElOVDNfTUFTS19TRVQpCisJUE1fU1lTX1BPUCg2LCBQSU5UMl9NQVNLX1NFVCkKKwlQTV9TWVNfUE9QKDUsIFBJTlQxX01BU0tfU0VUKQorCVBNX1NZU19QT1AoNCwgUElOVDBfTUFTS19TRVQpCisjZW5kaWYKKworI2lmZGVmIFNJQ19JV1IyCisJUE1fU1lTX1BPUCgzLCBTSUNfSVdSMikKKyNlbmRpZgorI2lmZGVmIFNJQ19JV1IxCisJUE1fU1lTX1BPUCgyLCBTSUNfSVdSMSkKKyNlbmRpZgorI2lmZGVmIFNJQ19JV1IwCisJUE1fU1lTX1BPUCgxLCBTSUNfSVdSMCkKKyNlbmRpZgorI2lmZGVmIFNJQ19JV1IKKwlQTV9TWVNfUE9QKDEsIFNJQ19JV1IpCisjZW5kaWYKKworI2lmZGVmIFNJQ19JQVIxMQorCVBNX1NZU19QT1AoMCwgU0lDX0lBUjExKQorI2VuZGlmCisJUE1fUE9QX1NZTkMoMTMpCisjaWZkZWYgU0lDX0lBUjgKKwlQTV9TWVNfUE9QKDEzLCBTSUNfSUFSMTApCisJUE1fU1lTX1BPUCgxMiwgU0lDX0lBUjkpCisJUE1fU1lTX1BPUCgxMSwgU0lDX0lBUjgpCisjZW5kaWYKKyNpZmRlZiBTSUNfSUFSNworCVBNX1NZU19QT1AoMTAsIFNJQ19JQVI3KQorI2VuZGlmCisjaWZkZWYgU0lDX0lBUjYKKwlQTV9TWVNfUE9QKDksIFNJQ19JQVI2KQorCVBNX1NZU19QT1AoOCwgU0lDX0lBUjUpCisJUE1fU1lTX1BPUCg3LCBTSUNfSUFSNCkKKyNlbmRpZgorI2lmZGVmIFNJQ19JQVIzCisJUE1fU1lTX1BPUCg2LCBTSUNfSUFSMykKKyNlbmRpZgorI2lmZGVmIFNJQ19JQVIwCisJUE1fU1lTX1BPUCg1LCBTSUNfSUFSMikKKwlQTV9TWVNfUE9QKDQsIFNJQ19JQVIxKQorCVBNX1NZU19QT1AoMywgU0lDX0lBUjApCisjZW5kaWYKKyNpZmRlZiBTSUNfSU1BU0swCisjIGlmZGVmIFNJQ19JTUFTSzIKKwlQTV9TWVNfUE9QKDIsIFNJQ19JTUFTSzIpCisjIGVuZGlmCisJUE1fU1lTX1BPUCgxLCBTSUNfSU1BU0sxKQorCVBNX1NZU19QT1AoMCwgU0lDX0lNQVNLMCkKKyNlbHNlCisJUE1fU1lTX1BPUCgwLCBTSUNfSU1BU0spCisjZW5kaWYKKworCS8qIFJlc3RvcmUgQ29yZSBSZWdpc3RlcnMgKi8KKwlSRVRJID0gW3NwKytdOworCVNFUVNUQVQgPSBbc3ArK107CisJUkVUWCA9IFtzcCsrXTsKKwlTWVNDRkcgPSBbc3ArK107CiAJQ1lDTEVTMiA9IFtzcCsrXTsKIAlDWUNMRVMgPSBbc3ArK107CiAJQVNUQVQgPSBbc3ArK107CisJUkVUUyA9IFtzcCsrXTsKIAogCUxCMSA9IFtzcCsrXTsKIAlMQjAgPSBbc3ArK107CkBAIC01ODEsMjA0ICs4ODUsMTAgQEAKIAogCXVzcCA9IFtzcCsrXTsKIAlmcCA9IFtzcCsrXTsKLQotCSggUjcgOiAwLCBQNSA6IDApID0gWyBTUCArKyBdOwotCVNZU0NGRyA9IFtzcCsrXTsKLQotCS8qIFJlc3RvcmUgQ29yZSBNTVJzICovCi0KLQlQTV9QT1AoVEJVRkNUTCkKLQlQTV9QT1AoVENPVU5UKQotCVBNX1BPUChUU0NBTEUpCi0JUE1fUE9QKFRQRVJJT0QpCi0JUE1fUE9QKFRDTlRMKQotCVBNX1BPUChJUFJJTykKLQlQTV9QT1AoSUxBVCkKLQlQTV9QT1AoSU1BU0spCi0JUE1fUE9QKEVWVDE1KQotCVBNX1BPUChFVlQxNCkKLQlQTV9QT1AoRVZUMTMpCi0JUE1fUE9QKEVWVDEyKQotCVBNX1BPUChFVlQxMSkKLQlQTV9QT1AoRVZUMTApCi0JUE1fUE9QKEVWVDkpCi0JUE1fUE9QKEVWVDgpCi0JUE1fUE9QKEVWVDcpCi0JUE1fUE9QKEVWVDYpCi0JUE1fUE9QKEVWVDUpCi0JUE1fUE9QKEVWVDQpCi0JUE1fUE9QKEVWVDMpCi0JUE1fUE9QKEVWVDIpCi0JUE1fUE9QKEVWVDEpCi0JUE1fUE9QKEVWVDApCi0JUE1fUE9QKElDUExCX0RBVEExNSkKLQlQTV9QT1AoSUNQTEJfREFUQTE0KQotCVBNX1BPUChJQ1BMQl9EQVRBMTMpCi0JUE1fUE9QKElDUExCX0RBVEExMikKLQlQTV9QT1AoSUNQTEJfREFUQTExKQotCVBNX1BPUChJQ1BMQl9EQVRBMTApCi0JUE1fUE9QKElDUExCX0RBVEE5KQotCVBNX1BPUChJQ1BMQl9EQVRBOCkKLQlQTV9QT1AoSUNQTEJfREFUQTcpCi0JUE1fUE9QKElDUExCX0RBVEE2KQotCVBNX1BPUChJQ1BMQl9EQVRBNSkKLQlQTV9QT1AoSUNQTEJfREFUQTQpCi0JUE1fUE9QKElDUExCX0RBVEEzKQotCVBNX1BPUChJQ1BMQl9EQVRBMikKLQlQTV9QT1AoSUNQTEJfREFUQTEpCi0JUE1fUE9QKElDUExCX0RBVEEwKQotCVBNX1BPUChJQ1BMQl9BRERSMTUpCi0JUE1fUE9QKElDUExCX0FERFIxNCkKLQlQTV9QT1AoSUNQTEJfQUREUjEzKQotCVBNX1BPUChJQ1BMQl9BRERSMTIpCi0JUE1fUE9QKElDUExCX0FERFIxMSkKLQlQTV9QT1AoSUNQTEJfQUREUjEwKQotCVBNX1BPUChJQ1BMQl9BRERSOSkKLQlQTV9QT1AoSUNQTEJfQUREUjgpCi0JUE1fUE9QKElDUExCX0FERFI3KQotCVBNX1BPUChJQ1BMQl9BRERSNikKLQlQTV9QT1AoSUNQTEJfQUREUjUpCi0JUE1fUE9QKElDUExCX0FERFI0KQotCVBNX1BPUChJQ1BMQl9BRERSMykKLQlQTV9QT1AoSUNQTEJfQUREUjIpCi0JUE1fUE9QKElDUExCX0FERFIxKQotCVBNX1BPUChJQ1BMQl9BRERSMCkKLQlQTV9QT1AoSU1FTV9DT05UUk9MKQotCVBNX1BPUChEQ1BMQl9EQVRBMTUpCi0JUE1fUE9QKERDUExCX0RBVEExNCkKLQlQTV9QT1AoRENQTEJfREFUQTEzKQotCVBNX1BPUChEQ1BMQl9EQVRBMTIpCi0JUE1fUE9QKERDUExCX0RBVEExMSkKLQlQTV9QT1AoRENQTEJfREFUQTEwKQotCVBNX1BPUChEQ1BMQl9EQVRBOSkKLQlQTV9QT1AoRENQTEJfREFUQTgpCi0JUE1fUE9QKERDUExCX0RBVEE3KQotCVBNX1BPUChEQ1BMQl9EQVRBNikKLQlQTV9QT1AoRENQTEJfREFUQTUpCi0JUE1fUE9QKERDUExCX0RBVEE0KQotCVBNX1BPUChEQ1BMQl9EQVRBMykKLQlQTV9QT1AoRENQTEJfREFUQTIpCi0JUE1fUE9QKERDUExCX0RBVEExKQotCVBNX1BPUChEQ1BMQl9EQVRBMCkKLQlQTV9QT1AoRENQTEJfQUREUjE1KQotCVBNX1BPUChEQ1BMQl9BRERSMTQpCi0JUE1fUE9QKERDUExCX0FERFIxMykKLQlQTV9QT1AoRENQTEJfQUREUjEyKQotCVBNX1BPUChEQ1BMQl9BRERSMTEpCi0JUE1fUE9QKERDUExCX0FERFIxMCkKLQlQTV9QT1AoRENQTEJfQUREUjkpCi0JUE1fUE9QKERDUExCX0FERFI4KQotCVBNX1BPUChEQ1BMQl9BRERSNykKLQlQTV9QT1AoRENQTEJfQUREUjYpCi0JUE1fUE9QKERDUExCX0FERFI1KQotCVBNX1BPUChEQ1BMQl9BRERSNCkKLQlQTV9QT1AoRENQTEJfQUREUjMpCi0JUE1fUE9QKERDUExCX0FERFIyKQotCVBNX1BPUChEQ1BMQl9BRERSMSkKLQlQTV9QT1AoRENQTEJfQUREUjApCi0JUE1fUE9QKERNRU1fQ09OVFJPTCkKLQotCS8qIFJlc3RvcmUgU3lzdGVtIE1NUnMgKi8KLQotCVAwLkggPSBoaShQTExfQ1RMKTsKLQlQMC5MID0gbG8oUExMX0NUTCk7Ci0JUE1fU1lTX1BPUDE2KFNZU0NSKQotCi0jaWZkZWYgUE9SVENJT19GRVIKLQlQTV9TWVNfUE9QMTYoUE9SVEVJT19GRVIpCi0JUE1fU1lTX1BPUDE2KFBPUlRFSU8pCi0JUE1fU1lTX1BPUDE2KFBPUlRFSU9fSU5FTikKLQlQTV9TWVNfUE9QMTYoUE9SVEVJT19ESVIpCi0JUE1fU1lTX1BPUDE2KFBPUlRESU9fRkVSKQotCVBNX1NZU19QT1AxNihQT1JURElPKQotCVBNX1NZU19QT1AxNihQT1JURElPX0lORU4pCi0JUE1fU1lTX1BPUDE2KFBPUlRESU9fRElSKQotCVBNX1NZU19QT1AxNihQT1JUQ0lPX0ZFUikKLQlQTV9TWVNfUE9QMTYoUE9SVENJTykKLQlQTV9TWVNfUE9QMTYoUE9SVENJT19JTkVOKQotCVBNX1NZU19QT1AxNihQT1JUQ0lPX0RJUikKLSNlbmRpZgotCi0jaWZkZWYgRUJJVV9GQ1RMCi0JUE1fU1lTX1BPUChFQklVX0ZDVEwpCi0JUE1fU1lTX1BPUChFQklVX01PREUpCi0JUE1fU1lTX1BPUChFQklVX01CU0NUTCkKLSNlbmRpZgotCVBNX1NZU19QT1AxNihFQklVX0FNR0NUTCkKLQlQTV9TWVNfUE9QKEVCSVVfQU1CQ1RMMSkKLQlQTV9TWVNfUE9QKEVCSVVfQU1CQ1RMMCkKLQotI2lmZGVmIFBJTlQwX0FTU0lHTgotCVBNX1NZU19QT1AoUElOVDNfRURHRV9TRVQpCi0JUE1fU1lTX1BPUChQSU5UMl9FREdFX1NFVCkKLQlQTV9TWVNfUE9QKFBJTlQxX0VER0VfU0VUKQotCVBNX1NZU19QT1AoUElOVDBfRURHRV9TRVQpCi0JUE1fU1lTX1BPUChQSU5UM19JTlZFUlRfU0VUKQotCVBNX1NZU19QT1AoUElOVDJfSU5WRVJUX1NFVCkKLQlQTV9TWVNfUE9QKFBJTlQxX0lOVkVSVF9TRVQpCi0JUE1fU1lTX1BPUChQSU5UMF9JTlZFUlRfU0VUKQotCVBNX1NZU19QT1AoUElOVDNfQVNTSUdOKQotCVBNX1NZU19QT1AoUElOVDJfQVNTSUdOKQotCVBNX1NZU19QT1AoUElOVDFfQVNTSUdOKQotCVBNX1NZU19QT1AoUElOVDBfQVNTSUdOKQotCVBNX1NZU19QT1AoUElOVDNfTUFTS19TRVQpCi0JUE1fU1lTX1BPUChQSU5UMl9NQVNLX1NFVCkKLQlQTV9TWVNfUE9QKFBJTlQxX01BU0tfU0VUKQotCVBNX1NZU19QT1AoUElOVDBfTUFTS19TRVQpCi0jZW5kaWYKLQotI2lmZGVmIFNJQ19JV1IyCi0JUE1fU1lTX1BPUChTSUNfSVdSMikKLSNlbmRpZgotI2lmZGVmIFNJQ19JV1IxCi0JUE1fU1lTX1BPUChTSUNfSVdSMSkKLSNlbmRpZgotI2lmZGVmIFNJQ19JV1IwCi0JUE1fU1lTX1BPUChTSUNfSVdSMCkKLSNlbmRpZgotI2lmZGVmIFNJQ19JV1IKLQlQTV9TWVNfUE9QKFNJQ19JV1IpCi0jZW5kaWYKLQotI2lmZGVmIFNJQ19JQVI4Ci0JUE1fU1lTX1BPUChTSUNfSUFSMTEpCi0JUE1fU1lTX1BPUChTSUNfSUFSMTApCi0JUE1fU1lTX1BPUChTSUNfSUFSOSkKLQlQTV9TWVNfUE9QKFNJQ19JQVI4KQotI2VuZGlmCi0jaWZkZWYgU0lDX0lBUjcKLQlQTV9TWVNfUE9QKFNJQ19JQVI3KQotI2VuZGlmCi0jaWZkZWYgU0lDX0lBUjYKLQlQTV9TWVNfUE9QKFNJQ19JQVI2KQotCVBNX1NZU19QT1AoU0lDX0lBUjUpCi0JUE1fU1lTX1BPUChTSUNfSUFSNCkKLSNlbmRpZgotI2lmZGVmIFNJQ19JQVIzCi0JUE1fU1lTX1BPUChTSUNfSUFSMykKLSNlbmRpZgotI2lmZGVmIFNJQ19JQVIwCi0JUE1fU1lTX1BPUChTSUNfSUFSMikKLQlQTV9TWVNfUE9QKFNJQ19JQVIxKQotCVBNX1NZU19QT1AoU0lDX0lBUjApCi0jZW5kaWYKLSNpZmRlZiBTSUNfSU1BU0sKLQlQTV9TWVNfUE9QKFNJQ19JTUFTSykKLSNlbmRpZgotI2lmZGVmIFNJQ19JTUFTSzIKLQlQTV9TWVNfUE9QKFNJQ19JTUFTSzIpCi0jZW5kaWYKLSNpZmRlZiBTSUNfSU1BU0sxCi0JUE1fU1lTX1BPUChTSUNfSU1BU0sxKQotI2VuZGlmCi0jaWZkZWYgU0lDX0lNQVNLMAotCVBNX1NZU19QT1AoU0lDX0lNQVNLMCkKLSNlbmRpZgorCShSNzowLCBQNTowKSA9IFtzcCsrXTsKIAogCVstLXNwXSA9IFJFVEk7CS8qIENsZWFyIEdsb2JhbCBJbnRlcnJ1cHQgRGlzYWJsZSAqLwogCVNQICs9IDQ7CiAKLQlSRVRTID0gW1NQKytdOwotCSggUjc6MCwgUDU6MCApID0gW1NQKytdOwogCVJUUzsKIEVORFBST0MoX2RvX2hpYmVybmF0ZSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKaW5kZXggNzZkZTU3Mi4uOGI0ZDk4OCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKQEAgLTg1LDM3ICs4NSwyNSBAQAogCVNTWU5DOwogCiAJLyogaW4gY2FzZSBvZiBkb3VibGUgZmF1bHRzLCBzYXZlIGEgZmV3IHRoaW5ncyAqLwotCXAwLmwgPSBfaW5pdF9yZXR4OwotCXAwLmggPSBfaW5pdF9yZXR4OwotCVIwID0gUkVUWDsKLQlbUDBdID0gUjA7Ci0KKwlwMS5sID0gX2luaXRpYWxfcGRhOworCXAxLmggPSBfaW5pdGlhbF9wZGE7CisJcjQgPSBSRVRYOwogI2lmZGVmIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVAogCS8qIE9ubHkgc2F2ZSB0aGVzZSBpZiB3ZSBhcmUgc3RvcmluZyB0aGVtLAogCSAqIFRoaXMgaGFwcGVucyBoZXJlLCBzaW5jZSBMMSBnZXRzIGNsb2JiZXJlZAogCSAqIGJlbG93CiAJICovCiAJR0VUX1BEQShwMCwgcjApOwotCXI1ID0gW3AwICsgUERBX0RGX1JFVFhdOwotCXAxLmwgPSBfaW5pdF9zYXZlZF9yZXR4OwotCXAxLmggPSBfaW5pdF9zYXZlZF9yZXR4OwotCVtwMV0gPSByNTsKLQotCXI1ID0gW3AwICsgUERBX0RGX0RDUExCXTsKLQlwMS5sID0gX2luaXRfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKLQlwMS5oID0gX2luaXRfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKLQlbcDFdID0gcjU7Ci0KLQlyNSA9IFtwMCArIFBEQV9ERl9JQ1BMQl07Ci0JcDEubCA9IF9pbml0X3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7Ci0JcDEuaCA9IF9pbml0X3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7Ci0JW3AxXSA9IHI1OwotCi0JcjUgPSBbcDAgKyBQREFfREZfU0VRU1RBVF07Ci0JcDEubCA9IF9pbml0X3NhdmVkX3NlcXN0YXQ7Ci0JcDEuaCA9IF9pbml0X3NhdmVkX3NlcXN0YXQ7Ci0JW3AxXSA9IHI1OworCXIwID0gW3AwICsgUERBX0RGX1JFVFhdOworCXIxID0gW3AwICsgUERBX0RGX0RDUExCXTsKKwlyMiA9IFtwMCArIFBEQV9ERl9JQ1BMQl07CisJcjMgPSBbcDAgKyBQREFfREZfU0VRU1RBVF07CisJW3AxICsgUERBX0lOSVRfREZfUkVUWF0gPSByMDsKKwlbcDEgKyBQREFfSU5JVF9ERl9EQ1BMQl0gPSByMTsKKwlbcDEgKyBQREFfSU5JVF9ERl9JQ1BMQl0gPSByMjsKKwlbcDEgKyBQREFfSU5JVF9ERl9TRVFTVEFUXSA9IHIzOwogI2VuZGlmCisJW3AxICsgUERBX0lOSVRfUkVUWF0gPSByNDsKIAogCS8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlciAqLwogCXNwLmwgPSBfaW5pdF90aHJlYWRfdW5pb24gKyBUSFJFQURfU0laRTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKaW5kZXggMTE3NzM2OS4uMzMyZGFjZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKQEAgLTQ0NCw3ICs0NDQsNyBAQAogc3RhdGljIERFQ0xBUkVfQklUTUFQKGdwaW9fZW5hYmxlZCwgTUFYX0JMQUNLRklOX0dQSU9TKTsKIGV4dGVybiB2b2lkIGJmaW5fZ3Bpb19pcnFfcHJlcGFyZSh1bnNpZ25lZCBncGlvKTsKIAotI2lmICFkZWZpbmVkKENPTkZJR19CRjU0eCkKKyNpZiAhQkZJTl9HUElPX1BJTlQKIAogc3RhdGljIHZvaWQgYmZpbl9ncGlvX2Fja19pcnEoc3RydWN0IGlycV9kYXRhICpkKQogewpAQCAtNjMzLDcgKzYzMyw3IEBACiAJYmZpbl9kZW11eF9ncGlvX2Jsb2NrKGlycSk7CiB9CiAKLSNlbHNlCQkJCS8qIENPTkZJR19CRjU0eCAqLworI2Vsc2UKIAogI2RlZmluZSBOUl9QSU5UX1NZU19JUlFTCTQKICNkZWZpbmUgTlJfUElOVF9CSVRTCQkzMgpAQCAtNjQ3LDI0ICs2NDcsMTEgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGlycTJwaW50X2x1dFtOUl9QSU5UU107CiBzdGF0aWMgdW5zaWduZWQgY2hhciBwaW50MmlycV9sdXRbTlJfUElOVF9TWVNfSVJRUyAqIE5SX1BJTlRfQklUU107CiAKLXN0cnVjdCBwaW5faW50X3QgewotCXVuc2lnbmVkIGludCBtYXNrX3NldDsKLQl1bnNpZ25lZCBpbnQgbWFza19jbGVhcjsKLQl1bnNpZ25lZCBpbnQgcmVxdWVzdDsKLQl1bnNpZ25lZCBpbnQgYXNzaWduOwotCXVuc2lnbmVkIGludCBlZGdlX3NldDsKLQl1bnNpZ25lZCBpbnQgZWRnZV9jbGVhcjsKLQl1bnNpZ25lZCBpbnQgaW52ZXJ0X3NldDsKLQl1bnNpZ25lZCBpbnQgaW52ZXJ0X2NsZWFyOwotCXVuc2lnbmVkIGludCBwaW5zdGF0ZTsKLQl1bnNpZ25lZCBpbnQgbGF0Y2g7Ci19OwotCi1zdGF0aWMgc3RydWN0IHBpbl9pbnRfdCAqcGludFtOUl9QSU5UX1NZU19JUlFTXSA9IHsKLQkoc3RydWN0IHBpbl9pbnRfdCAqKVBJTlQwX01BU0tfU0VULAotCShzdHJ1Y3QgcGluX2ludF90ICopUElOVDFfTUFTS19TRVQsCi0JKHN0cnVjdCBwaW5faW50X3QgKilQSU5UMl9NQVNLX1NFVCwKLQkoc3RydWN0IHBpbl9pbnRfdCAqKVBJTlQzX01BU0tfU0VULAorc3RhdGljIHN0cnVjdCBiZmluX3BpbnRfcmVncyAqIGNvbnN0IHBpbnRbTlJfUElOVF9TWVNfSVJRU10gPSB7CisJKHN0cnVjdCBiZmluX3BpbnRfcmVncyAqKVBJTlQwX01BU0tfU0VULAorCShzdHJ1Y3QgYmZpbl9waW50X3JlZ3MgKilQSU5UMV9NQVNLX1NFVCwKKwkoc3RydWN0IGJmaW5fcGludF9yZWdzICopUElOVDJfTUFTS19TRVQsCisJKHN0cnVjdCBiZmluX3BpbnRfcmVncyAqKVBJTlQzX01BU0tfU0VULAogfTsKIAogaW5saW5lIHVuc2lnbmVkIGludCBnZXRfaXJxX2Jhc2UodTMyIGJhbmssIHU4IGJtYXApCkBAIC05ODEsNyArOTY4LDcgQEAKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKLSNpZmRlZiBDT05GSUdfQkY1NHgKKyNpZiBCRklOX0dQSU9fUElOVAogIyBpZmRlZiBDT05GSUdfUElOVHhfUkVBU1NJR04KIAlwaW50WzBdLT5hc3NpZ24gPSBDT05GSUdfUElOVDBfQVNTSUdOOwogCXBpbnRbMV0tPmFzc2lnbiA9IENPTkZJR19QSU5UMV9BU1NJR047CkBAIC05OTksMTYgKzk4NiwxNiBAQAogCQkJaXJxX3NldF9jaGlwKGlycSwgJmJmaW5faW50ZXJuYWxfaXJxY2hpcCk7CiAKIAkJc3dpdGNoIChpcnEpIHsKLSNpZiBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkKLQkJY2FzZSBJUlFfUEhfSU5UQV9NQUNfUlg6Ci0JCWNhc2UgSVJRX1BGX0lOVEFfUEdfSU5UQToKLSNlbGlmIGRlZmluZWQoQkY1MzNfRkFNSUxZKQotCQljYXNlIElSUV9QUk9HX0lOVEE6Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkKKyNpZiBCRklOX0dQSU9fUElOVAogCQljYXNlIElSUV9QSU5UMDoKIAkJY2FzZSBJUlFfUElOVDE6CiAJCWNhc2UgSVJRX1BJTlQyOgogCQljYXNlIElSUV9QSU5UMzoKKyNlbGlmIGRlZmluZWQoQkY1MzdfRkFNSUxZKQorCQljYXNlIElSUV9QSF9JTlRBX01BQ19SWDoKKwkJY2FzZSBJUlFfUEZfSU5UQV9QR19JTlRBOgorI2VsaWYgZGVmaW5lZChCRjUzM19GQU1JTFkpCisJCWNhc2UgSVJRX1BST0dfSU5UQToKICNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUxeCkKIAkJY2FzZSBJUlFfUE9SVEZfSU5UQToKIAkJY2FzZSBJUlFfUE9SVEdfSU5UQToKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jCmluZGV4IDM1ZTdlMWUuLjFjMTQzYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zbXAuYwpAQCAtNDUsOSArNDUsNyBAQAogdW5zaWduZWQgbG9uZyBibGFja2Zpbl9pZmx1c2hfbDFfZW50cnlbTlJfQ1BVU107CiAjZW5kaWYKIAotdm9pZCBfX2NwdWluaXRkYXRhICppbml0X3JldHhfY29yZWIsICppbml0X3NhdmVkX3JldHhfY29yZWIsCi0JKmluaXRfc2F2ZWRfc2Vxc3RhdF9jb3JlYiwgKmluaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcl9jb3JlYiwKLQkqaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyX2NvcmViOworc3RydWN0IGJsYWNrZmluX2luaXRpYWxfcGRhIF9fY3B1aW5pdGRhdGEgaW5pdGlhbF9wZGFfY29yZWI7CiAKICNkZWZpbmUgQkZJTl9JUElfUkVTQ0hFRFVMRSAgIDAKICNkZWZpbmUgQkZJTl9JUElfQ0FMTF9GVU5DICAgIDEKQEAgLTM2OSwxMyArMzY3LDE2IEBACiAJaWYgKF9iZmluX3N3cnN0ICYgU1dSU1RfREJMX0ZBVUxUX0IpIHsKIAkJcHJpbnRrKEtFUk5fRU1FUkcgIkNvcmVCIFJlY292ZXJpbmcgZnJvbSBET1VCTEUgRkFVTFQgZXZlbnRcbiIpOwogI2lmZGVmIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVAotCQlwcmludGsoS0VSTl9FTUVSRyAiIFdoaWxlIGhhbmRsaW5nIGV4Y2VwdGlvbiAoRVhDQVVTRSA9IDB4JXgpIGF0ICVwRlxuIiwKLQkJCShpbnQpaW5pdF9zYXZlZF9zZXFzdGF0X2NvcmViICYgU0VRU1RBVF9FWENBVVNFLCBpbml0X3NhdmVkX3JldHhfY29yZWIpOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgIERDUExCX0ZBVUxUX0FERFI6ICVwRlxuIiwgaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyX2NvcmViKTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICIgICBJQ1BMQl9GQVVMVF9BRERSOiAlcEZcbiIsIGluaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcl9jb3JlYik7CisJCXByaW50ayhLRVJOX0VNRVJHICIgV2hpbGUgaGFuZGxpbmcgZXhjZXB0aW9uIChFWENBVVNFID0gJSN4KSBhdCAlcEZcbiIsCisJCQlpbml0aWFsX3BkYV9jb3JlYi5zZXFzdGF0X2RvdWJsZWZhdWx0ICYgU0VRU1RBVF9FWENBVVNFLAorCQkJaW5pdGlhbF9wZGFfY29yZWIucmV0eF9kb3VibGVmYXVsdCk7CisJCXByaW50ayhLRVJOX05PVElDRSAiICAgRENQTEJfRkFVTFRfQUREUjogJXBGXG4iLAorCQkJaW5pdGlhbF9wZGFfY29yZWIuZGNwbGJfZG91YmxlZmF1bHRfYWRkcik7CisJCXByaW50ayhLRVJOX05PVElDRSAiICAgSUNQTEJfRkFVTFRfQUREUjogJXBGXG4iLAorCQkJaW5pdGlhbF9wZGFfY29yZWIuaWNwbGJfZG91YmxlZmF1bHRfYWRkcik7CiAjZW5kaWYKIAkJcHJpbnRrKEtFUk5fTk9USUNFICIgVGhlIGluc3RydWN0aW9uIGF0ICVwRiBjYXVzZWQgYSBkb3VibGUgZXhjZXB0aW9uXG4iLAotCQkJaW5pdF9yZXR4X2NvcmViKTsKKwkJCWluaXRpYWxfcGRhX2NvcmViLnJldHgpOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9waW5tdXguYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL3Bpbm11eC5jCmluZGV4IDE4NjQ4ZWYuLjU5MWY3NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL3Bpbm11eC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL3Bpbm11eC5jCkBAIC04NSw2ICs4NSw4IEBACiAJaW50IHJldCA9IC1FSU5WQUw7CiAJY2hhciBzYXZlZFtzaXplb2YgcGluc107CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlyZWdfcGlubXV4X3J3X2h3cHJvdCBod3Byb3Q7CisJcmVnX2Nsa2dlbl9yd19jbGtfY3RybCBjbGtfY3RybDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwaW5tdXhfbG9jaywgZmxhZ3MpOwogCkBAIC05Myw5ICs5NSw4IEBACiAKIAljcmlzdjMyX3Bpbm11eF9pbml0KCk7IC8qIG11c3QgYmUgZG9uZSBiZWZvcmUgd2UgcmVhZCByd19od3Byb3QgKi8KIAotCXJlZ19waW5tdXhfcndfaHdwcm90IGh3cHJvdCA9IFJFR19SRChwaW5tdXgsIHJlZ2lfcGlubXV4LCByd19od3Byb3QpOwotCXJlZ19jbGtnZW5fcndfY2xrX2N0cmwgY2xrX2N0cmwgPSBSRUdfUkQoY2xrZ2VuLCByZWdpX2Nsa2dlbiwKLQkJcndfY2xrX2N0cmwpOworCWh3cHJvdCA9IFJFR19SRChwaW5tdXgsIHJlZ2lfcGlubXV4LCByd19od3Byb3QpOworCWNsa19jdHJsID0gUkVHX1JEKGNsa2dlbiwgcmVnaV9jbGtnZW4sIHJ3X2Nsa19jdHJsKTsKIAogCXN3aXRjaCAoZnVuY3Rpb24pIHsKIAljYXNlIHBpbm11eF9ldGg6CkBAIC0yNjIsNiArMjYzLDcgQEAKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAljaGFyIHNhdmVkW3NpemVvZiBwaW5zXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXJlZ19waW5tdXhfcndfaHdwcm90IGh3cHJvdDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwaW5tdXhfbG9jaywgZmxhZ3MpOwogCkBAIC0yNzAsNyArMjcyLDcgQEAKIAogCWNyaXN2MzJfcGlubXV4X2luaXQoKTsgLyogbXVzdCBiZSBkb25lIGJlZm9yZSB3ZSByZWFkIHJ3X2h3cHJvdCAqLwogCi0JcmVnX3Bpbm11eF9yd19od3Byb3QgaHdwcm90ID0gUkVHX1JEKHBpbm11eCwgcmVnaV9waW5tdXgsIHJ3X2h3cHJvdCk7CisJaHdwcm90ID0gUkVHX1JEKHBpbm11eCwgcmVnaV9waW5tdXgsIHJ3X2h3cHJvdCk7CiAKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBwaW5tdXhfZXRoOgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2luY2x1ZGUvYXJjaC12MTAvYXJjaC9wcm9jZXNzb3IuaCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjEwL2FyY2gvcHJvY2Vzc29yLmgKaW5kZXggY2M2OTJjNy4uOTNmZWIyYSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2luY2x1ZGUvYXJjaC12MTAvYXJjaC9wcm9jZXNzb3IuaAorKysgYi9hcmNoL2NyaXMvaW5jbHVkZS9hcmNoLXYxMC9hcmNoL3Byb2Nlc3Nvci5oCkBAIC01Myw3ICs1Myw2IEBACiAgKi8KIAogI2RlZmluZSBzdGFydF90aHJlYWQocmVncywgaXAsIHVzcCkgZG8geyBcCi0Jc2V0X2ZzKFVTRVJfRFMpOyAgICAgIFwKIAlyZWdzLT5pcnAgPSBpcDsgICAgICAgXAogCXJlZ3MtPmRjY3IgfD0gMSA8PCBVX0RDQ1JfQklUTlI7IFwKIAl3cnVzcCh1c3ApOyAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2luY2x1ZGUvYXJjaC12MzIvYXJjaC9wcm9jZXNzb3IuaCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjMyL2FyY2gvcHJvY2Vzc29yLmgKaW5kZXggZjgwYjQ3Ny4uOTYwM2M5MCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2luY2x1ZGUvYXJjaC12MzIvYXJjaC9wcm9jZXNzb3IuaAorKysgYi9hcmNoL2NyaXMvaW5jbHVkZS9hcmNoLXYzMi9hcmNoL3Byb2Nlc3Nvci5oCkBAIC00Nyw3ICs0Nyw2IEBACiAgKi8KICNkZWZpbmUgc3RhcnRfdGhyZWFkKHJlZ3MsIGlwLCB1c3ApIFwKIGRvIHsgXAotCXNldF9mcyhVU0VSX0RTKTsgXAogCXJlZ3MtPmVycCA9IGlwOyBcCiAJcmVncy0+Y2NzIHw9IDEgPDwgKFVfQ0NTX0JJVE5SICsgQ0NTX1NISUZUKTsgXAogCXdydXNwKHVzcCk7IFwKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2NyaXMva2VybmVsL21vZHVsZS5jCmluZGV4IGJjZDUwMmYuLjM3NDAwZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9jcmlzL2tlcm5lbC9tb2R1bGUuYwpAQCAtMzAsNDUgKzMwLDE5IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19FVFJBWF9LTUFMTE9DRURfTU9EVUxFUwotI2RlZmluZSBNQUxMT0NfTU9EVUxFKHNpemUpIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkKLSNkZWZpbmUgRlJFRV9NT0RVTEUocmVnaW9uKSBrZnJlZShyZWdpb24pCi0jZWxzZQotI2RlZmluZSBNQUxMT0NfTU9EVUxFKHNpemUpIHZtYWxsb2NfZXhlYyhzaXplKQotI2RlZmluZSBGUkVFX01PRFVMRShyZWdpb24pIHZmcmVlKHJlZ2lvbikKLSNlbmRpZgotCiB2b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQogewogCWlmIChzaXplID09IDApCiAJCXJldHVybiBOVUxMOwotCXJldHVybiBNQUxMT0NfTU9EVUxFKHNpemUpOworCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogfQogCi0KIC8qIEZyZWUgbWVtb3J5IHJldHVybmVkIGZyb20gbW9kdWxlX2FsbG9jICovCiB2b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKIHsKLQlGUkVFX01PRFVMRShtb2R1bGVfcmVnaW9uKTsKKwlrZnJlZShtb2R1bGVfcmVnaW9uKTsKIH0KLQotLyogV2UgZG9uJ3QgbmVlZCBhbnl0aGluZyBzcGVjaWFsLiAqLwotaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmhkciwKLQkJCSAgICAgIEVsZl9TaGRyICpzZWNoZHJzLAotCQkJICAgICAgY2hhciAqc2Vjc3RyaW5ncywKLQkJCSAgICAgIHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGFwcGx5X3JlbG9jYXRlKEVsZjMyX1NoZHIgKnNlY2hkcnMsCi0JCSAgIGNvbnN0IGNoYXIgKnN0cnRhYiwKLQkJICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAotCQkgICB1bnNpZ25lZCBpbnQgcmVsc2VjLAotCQkgICBzdHJ1Y3QgbW9kdWxlICptZSkKLXsKLQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogUkVMIHJlbG9jYXRpb24gdW5zdXBwb3J0ZWRcbiIsIG1lLT5uYW1lKTsKLQlyZXR1cm4gLUVOT0VYRUM7Ci19CisjZW5kaWYKIAogaW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGYzMl9TaGRyICpzZWNoZHJzLAogCQkgICAgICAgY29uc3QgY2hhciAqc3RydGFiLApAQCAtMTA4LDE0ICs4MiwzIEBACiAKIAlyZXR1cm4gMDsKIH0KLQotaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAotCQkgICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCSAgICBzdHJ1Y3QgbW9kdWxlICptZSkKLXsKLSAJcmV0dXJuIDA7Ci19Ci0KLXZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci19CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2Zydi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggNzExNzYzYy4uOWQ5ODM1ZiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9tb2R1bGUuYwpAQCAtMjIsNTcgKzIyLDYgQEAKICNkZWZpbmUgREVCVUdQKGZtdC4uLikKICNlbmRpZgogCi12b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQotewotCWlmIChzaXplID09IDApCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIHZtYWxsb2NfZXhlYyhzaXplKTsKLX0KLQotCi0vKiBGcmVlIG1lbW9yeSByZXR1cm5lZCBmcm9tIG1vZHVsZV9hbGxvYyAqLwotdm9pZCBtb2R1bGVfZnJlZShzdHJ1Y3QgbW9kdWxlICptb2QsIHZvaWQgKm1vZHVsZV9yZWdpb24pCi17Ci0JdmZyZWUobW9kdWxlX3JlZ2lvbik7Ci19Ci0KLS8qIFdlIGRvbid0IG5lZWQgYW55dGhpbmcgc3BlY2lhbC4gKi8KLWludCBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsCi0JCQkgICAgICBFbGZfU2hkciAqc2VjaGRycywKLQkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsCi0JCQkgICAgICBzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBhcHBseV9yZWxvY2F0ZShFbGYzMl9TaGRyICpzZWNoZHJzLAotCQkgICBjb25zdCBjaGFyICpzdHJ0YWIsCi0JCSAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKLQkJICAgdW5zaWduZWQgaW50IHJlbHNlYywKLQkJICAgc3RydWN0IG1vZHVsZSAqbWUpCi17Ci0JcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IEFERCBSRUxPQ0FUSU9OIHVuc3VwcG9ydGVkXG4iLCBtZS0+bmFtZSk7Ci0JcmV0dXJuIC1FTk9FWEVDOwotfQotCi1pbnQgYXBwbHlfcmVsb2NhdGVfYWRkKEVsZjMyX1NoZHIgKnNlY2hkcnMsCi0JCSAgICAgICBjb25zdCBjaGFyICpzdHJ0YWIsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsc2VjLAotCQkgICAgICAgc3RydWN0IG1vZHVsZSAqbWUpCi17Ci0JcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IEFERCBSRUxPQ0FUSU9OIHVuc3VwcG9ydGVkXG4iLCBtZS0+bmFtZSk7Ci0JcmV0dXJuIC1FTk9FWEVDOwotfQotCi1pbnQgbW9kdWxlX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICpoZHIsCi0JCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKLQkJICAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotCXJldHVybiAwOwotfQotCi12b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQotewotfQorLyogVE9ETzogQXQgbGVhc3Qgb25lIG9mIGFwcGx5X3JlbG9jYXRlIG9yIGFwcGx5X3JlbG9jYXRlX2FkZCBtdXN0IGJlCisgKiBpbXBsZW1lbnRlZCBpbiBvcmRlciB0byBnZXQgd29ya2luZyBtb2R1bGUgc3VwcG9ydC4KKyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9LY29uZmlnLmNwdSBiL2FyY2gvaDgzMDAvS2NvbmZpZy5jcHUKaW5kZXggZDIzNmFiNC4uMTVjMjIyOCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9LY29uZmlnLmNwdQorKysgYi9hcmNoL2g4MzAwL0tjb25maWcuY3B1CkBAIC0xNjIsOSArMTYyLDcgQEAKIAlpbnQgIlRQVSBjaGFubmVsIgogCWRlcGVuZHMgb24gSDgzMDBfVFBVCiAKLWNvbmZpZyBQUkVFTVBUCi0JYm9vbCAiUHJlZW1wdGlibGUgS2VybmVsIgotCWRlZmF1bHQgbgorc291cmNlICJrZXJuZWwvS2NvbmZpZy5wcmVlbXB0IgogCiBzb3VyY2UgIm1tL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDY5ZThhMzQuLmU4MzRiNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtODEsNyArODEsNiBAQAogI2lmIGRlZmluZWQoX19IODMwMEhfXykKICNkZWZpbmUgc3RhcnRfdGhyZWFkKF9yZWdzLCBfcGMsIF91c3ApCQkJICAgICAgICBcCiBkbyB7CQkJCQkJCSAgICAgICAgXAotCXNldF9mcyhVU0VSX0RTKTsgICAgICAgICAgIC8qIHJlYWRzIGZyb20gdXNlciBzcGFjZSAqLyAgXAogICAJKF9yZWdzKS0+cGMgPSAoX3BjKTsJCQkJICAgICAgICBcCiAJKF9yZWdzKS0+Y2NyID0gMHgwMDsJICAgLyogY2xlYXIgYWxsIGZsYWdzICovICAgICAgICBcCiAJKF9yZWdzKS0+ZXI1ID0gY3VycmVudC0+bW0tPnN0YXJ0X2RhdGE7CS8qIEdPVCBiYXNlICovICBcCkBAIC05MSw3ICs5MCw2IEBACiAjaWYgZGVmaW5lZChfX0g4MzAwU19fKQogI2RlZmluZSBzdGFydF90aHJlYWQoX3JlZ3MsIF9wYywgX3VzcCkJCQkgICAgICAgIFwKIGRvIHsJCQkJCQkJICAgICAgICBcCi0Jc2V0X2ZzKFVTRVJfRFMpOyAgICAgICAgICAgLyogcmVhZHMgZnJvbSB1c2VyIHNwYWNlICovICBcCiAJKF9yZWdzKS0+cGMgPSAoX3BjKTsJCQkJICAgICAgICBcCiAJKF9yZWdzKS0+Y2NyID0gMHgwMDsJICAgLyogY2xlYXIga2VybmVsIGZsYWcgKi8gICAgICBcCiAJKF9yZWdzKS0+ZXhyID0gMHg3ODsgICAgICAgLyogZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovICBcCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvaDgzMDAva2VybmVsL21vZHVsZS5jCmluZGV4IGRiNDk1M2QuLjFkNTI2ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL21vZHVsZS5jCkBAIC0xMSw0MCArMTEsNiBAQAogI2RlZmluZSBERUJVR1AoZm10Li4uKQogI2VuZGlmCiAKLXZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHZtYWxsb2Moc2l6ZSk7Ci19Ci0KLQotLyogRnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfYWxsb2MgKi8KLXZvaWQgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKQotewotCXZmcmVlKG1vZHVsZV9yZWdpb24pOwotfQotCi0vKiBXZSBkb24ndCBuZWVkIGFueXRoaW5nIHNwZWNpYWwuICovCi1pbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLAotCQkJICAgICAgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCQkgICAgICBjaGFyICpzZWNzdHJpbmdzLAotCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbW9kKQotewotCXJldHVybiAwOwotfQotCi1pbnQgYXBwbHlfcmVsb2NhdGUoRWxmMzJfU2hkciAqc2VjaGRycywKLQkJICAgY29uc3QgY2hhciAqc3RydGFiLAotCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCi0JCSAgIHVuc2lnbmVkIGludCByZWxzZWMsCi0JCSAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBSRUxPQ0FUSU9OIHVuc3VwcG9ydGVkXG4iLAotCSAgICAgICBtZS0+bmFtZSk7Ci0JcmV0dXJuIC1FTk9FWEVDOwotfQotCiBpbnQgYXBwbHlfcmVsb2NhdGVfYWRkKEVsZjMyX1NoZHIgKnNlY2hkcnMsCiAJCSAgICAgICBjb25zdCBjaGFyICpzdHJ0YWIsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCkBAIC0xMDcsMTQgKzczLDMgQEAKIAkgICAgICAgbWUtPm5hbWUsIHJlbGFbaV0ucl9vZmZzZXQpOwogCXJldHVybiAtRU5PRVhFQzsKIH0KLQotaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAotCQkgICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCSAgICBzdHJ1Y3QgbW9kdWxlICptZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3NldHVwLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9zZXR1cC5jCmluZGV4IDdmZGE2NTcuLjY4ZDY1MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvc2V0dXAuYwpAQCAtNDYsNyArNDYsNyBAQAogI2luY2x1ZGUgPGFzbS9yZWdzMjY3eC5oPgogI2VuZGlmCiAKLSNkZWZpbmUgU1RVQlNJWkUgMHhjMDAwOworI2RlZmluZSBTVFVCU0laRSAweGMwMDAKIAogdW5zaWduZWQgbG9uZyByb21fbGVuZ3RoOwogdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQ7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvS2NvbmZpZyBiL2FyY2gvaWE2NC9LY29uZmlnCmluZGV4IDM4MjgwZWYuLjEzN2IyNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9LY29uZmlnCkBAIC0xMDEsNiArMTAxLDkgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX0NMT0NLU09VUkNFX0RBVEEKKwlkZWZfYm9vbCB5CisKIGNvbmZpZyBTQ0hFRF9PTUlUX0ZSQU1FX1BPSU5URVIKIAlib29sCiAJZGVmYXVsdCB5CkBAIC02MjcsMjcgKzYzMCw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9wY21jaWEvS2NvbmZpZyIKIAotY29uZmlnIERNQVIKLSAgICAgICAgYm9vbCAiU3VwcG9ydCBmb3IgRE1BIFJlbWFwcGluZyBEZXZpY2VzIChFWFBFUklNRU5UQUwpIgotICAgICAgICBkZXBlbmRzIG9uIElBNjRfR0VORVJJQyAmJiBBQ1BJICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIERNQSByZW1hcHBpbmcgKERNQVIpIGRldmljZXMgc3VwcG9ydCBlbmFibGVzIGluZGVwZW5kZW50IGFkZHJlc3MKLQkgIHRyYW5zbGF0aW9ucyBmb3IgRGlyZWN0IE1lbW9yeSBBY2Nlc3MgKERNQSkgZnJvbSBkZXZpY2VzLgotCSAgVGhlc2UgRE1BIHJlbWFwcGluZyBkZXZpY2VzIGFyZSByZXBvcnRlZCB2aWEgQUNQSSB0YWJsZXMKLQkgIGFuZCBpbmNsdWRlIFBDSSBkZXZpY2Ugc2NvcGUgY292ZXJlZCBieSB0aGVzZSBETUEKLQkgIHJlbWFwcGluZyBkZXZpY2VzLgotCi1jb25maWcgRE1BUl9ERUZBVUxUX09OCi0JZGVmX2Jvb2wgeQotCXByb21wdCAiRW5hYmxlIERNQSBSZW1hcHBpbmcgRGV2aWNlcyBieSBkZWZhdWx0IgotCWRlcGVuZHMgb24gRE1BUgotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBhIERNQVIgZGV2aWNlIGF0IGJvb3QgdGltZSBpZgotCSAgb25lIGlzIGZvdW5kLiBJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc2VsZWN0ZWQsIERNQVIgc3VwcG9ydCBjYW4KLQkgIGJlIGVuYWJsZWQgYnkgcGFzc2luZyBpbnRlbF9pb21tdT1vbiB0byB0aGUga2VybmVsLiBJdCBpcwotCSAgcmVjb21tZW5kZWQgeW91IHNheSBOIGhlcmUgd2hpbGUgdGhlIERNQVIgY29kZSByZW1haW5zCi0JICBleHBlcmltZW50YWwuCi0KIGVuZG1lbnUKIAogZW5kaWYKQEAgLTY4MSw2ICs2NjMsMyBAQAogCiBjb25maWcgSU9NTVVfSEVMUEVSCiAJZGVmX2Jvb2wgKElBNjRfSFBfWlgxIHx8IElBNjRfSFBfWlgxX1NXSU9UTEIgfHwgSUE2NF9HRU5FUklDIHx8IFNXSU9UTEIpCi0KLWNvbmZpZyBJT01NVV9BUEkKLQlkZWZfYm9vbCAoRE1BUikKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2Nsb2Nrc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4NTk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oCkBAIC0wLDAgKzEsMTAgQEAKKy8qIElBNjQtc3BlY2lmaWMgY2xvY2tzb3VyY2UgYWRkaXRpb25zICovCisKKyNpZm5kZWYgX0FTTV9JQTY0X0NMT0NLU09VUkNFX0gKKyNkZWZpbmUgX0FTTV9JQTY0X0NMT0NLU09VUkNFX0gKKworc3RydWN0IGFyY2hfY2xvY2tzb3VyY2VfZGF0YSB7CisJdm9pZCAqZnN5c19tbWlvOyAgICAgICAgLyogdXNlZCBieSBmc3lzY2FsbCBhc20gY29kZSAqLworfTsKKworI2VuZGlmIC8qIF9BU01fSUE2NF9DTE9DS1NPVVJDRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGFyYXZpcnQuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCmluZGV4IDJlYjBhOTguLjMyNTUxZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCkBAIC0yODEsNiArMjgxLDEwIEBACiAJCXB2X3RpbWVfb3BzLmluaXRfbWlzc2luZ190aWNrc19hY2NvdW50aW5nKGNwdSk7CiB9CiAKK3N0cnVjdCBqdW1wX2xhYmVsX2tleTsKK2V4dGVybiBzdHJ1Y3QganVtcF9sYWJlbF9rZXkgcGFyYXZpcnRfc3RlYWxfZW5hYmxlZDsKK2V4dGVybiBzdHJ1Y3QganVtcF9sYWJlbF9rZXkgcGFyYXZpcnRfc3RlYWxfcnFfZW5hYmxlZDsKKwogc3RhdGljIGlubGluZSBpbnQKIHBhcmF2aXJ0X2RvX3N0ZWFsX2FjY291bnRpbmcodW5zaWduZWQgbG9uZyAqbmV3X2l0bSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zbi90aW9jZS5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NuL3Rpb2NlLmgKaW5kZXggODkzNDY4ZS4uNmVhZThhZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NuL3Rpb2NlLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NuL3Rpb2NlLmgKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogI2RlZmluZSBDRV9MU0lfR0JfQ0ZHMV9SWEwwU19USFNfU0hGVAkwCiAjZGVmaW5lIENFX0xTSV9HQl9DRkcxX1JYTDBTX1RIU19NQVNLCSgweGZmVUxMIDw8IDApCiAjZGVmaW5lIENFX0xTSV9HQl9DRkcxX1JYTDBTX1NNUF9TSEZUCTgKLSNkZWZpbmUgQ0VfTFNJX0dCX0NGRzFfUlhMMFNfU01QX01BU0sJKDB4ZlVMTCA8PCA4KTsKKyNkZWZpbmUgQ0VfTFNJX0dCX0NGRzFfUlhMMFNfU01QX01BU0sJKDB4ZlVMTCA8PCA4KQogI2RlZmluZSBDRV9MU0lfR0JfQ0ZHMV9SWEwwU19BREpfU0hGVAkxMgogI2RlZmluZSBDRV9MU0lfR0JfQ0ZHMV9SWEwwU19BREpfTUFTSwkoMHg3VUxMIDw8IDEyKQogI2RlZmluZSBDRV9MU0lfR0JfQ0ZHMV9SWEwwU19GTFRfU0hGVAkxNQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9jeWNsb25lLmMgYi9hcmNoL2lhNjQva2VybmVsL2N5Y2xvbmUuYwppbmRleCBmNjQwOTdiLi40ODI2ZmY5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2N5Y2xvbmUuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2N5Y2xvbmUuYwpAQCAtMTE1LDcgKzExNSw3IEBACiAJfQogCS8qIGluaXRpYWxpemUgbGFzdCB0aWNrICovCiAJY3ljbG9uZV9tYyA9IGN5Y2xvbmVfdGltZXI7Ci0JY2xvY2tzb3VyY2VfY3ljbG9uZS5mc3lzX21taW8gPSBjeWNsb25lX3RpbWVyOworCWNsb2Nrc291cmNlX2N5Y2xvbmUuYXJjaGRhdGEuZnN5c19tbWlvID0gY3ljbG9uZV90aW1lcjsKIAljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY2xvY2tzb3VyY2VfY3ljbG9uZSwgQ1lDTE9ORV9USU1FUl9GUkVRKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvaWE2NC9rZXJuZWwvbW9kdWxlLmMKaW5kZXggMTQ4MWIwYS4uMjQ2MDNiZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL2lhNjQva2VybmVsL21vZHVsZS5jCkBAIC0zMDQsMTQgKzMwNCw2IEBACiAKICNlbmRpZiAvKiAhVVNFX0JSTCAqLwogCi12b2lkICoKLW1vZHVsZV9hbGxvYyAodW5zaWduZWQgbG9uZyBzaXplKQotewotCWlmICghc2l6ZSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHZtYWxsb2Moc2l6ZSk7Ci19Ci0KIHZvaWQKIG1vZHVsZV9mcmVlIChzdHJ1Y3QgbW9kdWxlICptb2QsIHZvaWQgKm1vZHVsZV9yZWdpb24pCiB7CkBAIC04NTMsMTQgKzg0NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludAotYXBwbHlfcmVsb2NhdGUgKEVsZjY0X1NoZHIgKnNlY2hkcnMsIGNvbnN0IGNoYXIgKnN0cnRhYiwgdW5zaWduZWQgaW50IHN5bWluZGV4LAotCQl1bnNpZ25lZCBpbnQgcmVsc2VjLCBzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci0JcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFJFTCByZWxvY3MgaW4gc2VjdGlvbiAldSB1bnN1cHBvcnRlZFxuIiwgbW9kLT5uYW1lLCByZWxzZWMpOwotCXJldHVybiAtRU5PRVhFQzsKLX0KLQogLyoKICAqIE1vZHVsZXMgY29udGFpbiBhIHNpbmdsZSB1bndpbmQgdGFibGUgd2hpY2ggY292ZXJzIGJvdGggdGhlIGNvcmUgYW5kIHRoZSBpbml0IHRleHQKICAqIHNlY3Rpb25zIGJ1dCBzaW5jZSB0aGUgdHdvIGFyZSBub3QgY29udGlndW91cywgd2UgbmVlZCB0byBzcGxpdCB0aGlzIHRhYmxlIHVwIHN1Y2ggdGhhdApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wYXJhdmlydC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9wYXJhdmlydC5jCmluZGV4IGEyMWQ3YmIuLjEwMDg2ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcGFyYXZpcnQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BhcmF2aXJ0LmMKQEAgLTYzNCw2ICs2MzQsOCBAQAogICogcHZfdGltZV9vcHMKICAqIHRpbWUgb3BlcmF0aW9ucwogICovCitzdHJ1Y3QganVtcF9sYWJlbF9rZXkgcGFyYXZpcnRfc3RlYWxfZW5hYmxlZDsKK3N0cnVjdCBqdW1wX2xhYmVsX2tleSBwYXJhdmlydF9zdGVhbF9ycV9lbmFibGVkOwogCiBzdGF0aWMgaW50CiBpYTY0X25hdGl2ZV9kb19zdGVhbF9hY2NvdW50aW5nKHVuc2lnbmVkIGxvbmcgKm5ld19pdG0pCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCmluZGV4IDg1MTE4ZGYuLjQzOTIwZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCkBAIC00NjgsNyArNDY4LDcgQEAKICAgICAgICAgZnN5c2NhbGxfZ3RvZF9kYXRhLmNsa19tYXNrID0gYy0+bWFzazsKICAgICAgICAgZnN5c2NhbGxfZ3RvZF9kYXRhLmNsa19tdWx0ID0gbXVsdDsKICAgICAgICAgZnN5c2NhbGxfZ3RvZF9kYXRhLmNsa19zaGlmdCA9IGMtPnNoaWZ0OwotICAgICAgICBmc3lzY2FsbF9ndG9kX2RhdGEuY2xrX2ZzeXNfbW1pbyA9IGMtPmZzeXNfbW1pbzsKKyAgICAgICAgZnN5c2NhbGxfZ3RvZF9kYXRhLmNsa19mc3lzX21taW8gPSBjLT5hcmNoZGF0YS5mc3lzX21taW87CiAgICAgICAgIGZzeXNjYWxsX2d0b2RfZGF0YS5jbGtfY3ljbGVfbGFzdCA9IGMtPmN5Y2xlX2xhc3Q7CiAKIAkvKiBjb3B5IGtlcm5lbCB0aW1lIHN0cnVjdHVyZXMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rdm0vS2NvbmZpZyBiL2FyY2gvaWE2NC9rdm0vS2NvbmZpZwppbmRleCBmYTRkMWU1Li45ODA2ZTU1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva3ZtL0tjb25maWcKKysrIGIvYXJjaC9pYTY0L2t2bS9LY29uZmlnCkBAIC00OSw2ICs0OSw1IEBACiAJICBleHRlbnNpb25zLgogCiBzb3VyY2UgZHJpdmVycy92aG9zdC9LY29uZmlnCi1zb3VyY2UgZHJpdmVycy92aXJ0aW8vS2NvbmZpZwogCiBlbmRpZiAjIFZJUlRVQUxJWkFUSU9OCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYwppbmRleCA4MWExZjRlLi40ODVjNDJkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKQEAgLTExMiw4ICsxMTIsNiBAQAogCWlycV9tb3ZlX2lycShkYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgc25faXJxX2luZm9fZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpOwotCiBzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX3JldGFyZ2V0X3ZlY3RvcihzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvLAogCQkJCSAgICAgICBuYXNpZF90IG5hc2lkLCBpbnQgc2xpY2UpCiB7CkBAIC0xNzcsNyArMTc1LDcgQEAKIAlzcGluX2xvY2soJnNuX2lycV9pbmZvX2xvY2spOwogCWxpc3RfcmVwbGFjZV9yY3UoJnNuX2lycV9pbmZvLT5saXN0LCAmbmV3X2lycV9pbmZvLT5saXN0KTsKIAlzcGluX3VubG9jaygmc25faXJxX2luZm9fbG9jayk7Ci0JY2FsbF9yY3UoJnNuX2lycV9pbmZvLT5yY3UsIHNuX2lycV9pbmZvX2ZyZWUpOworCWtmcmVlX3JjdShzbl9pcnFfaW5mbywgcmN1KTsKIAogCiBmaW5pc2hfdXA6CkBAIC0zMzgsMTQgKzMzNiw2IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNuX2lycV9pbmZvX2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKQotewotCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87Ci0KLQlzbl9pcnFfaW5mbyA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3Qgc25faXJxX2luZm8sIHJjdSk7Ci0Ja2ZyZWUoc25faXJxX2luZm8pOwotfQotCiB2b2lkIHNuX2lycV9maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldiwgc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbykKIHsKIAluYXNpZF90IG5hc2lkID0gc25faXJxX2luZm8tPmlycV9uYXNpZDsKQEAgLTM5OSw3ICszODksNyBAQAogCXNwaW5fdW5sb2NrKCZzbl9pcnFfaW5mb19sb2NrKTsKIAlpZiAobGlzdF9lbXB0eShzbl9pcnFfbGhbc25faXJxX2luZm8tPmlycV9pcnFdKSkKIAkJZnJlZV9pcnFfdmVjdG9yKHNuX2lycV9pbmZvLT5pcnFfaXJxKTsKLQljYWxsX3JjdSgmc25faXJxX2luZm8tPnJjdSwgc25faXJxX2luZm9fZnJlZSk7CisJa2ZyZWVfcmN1KHNuX2lycV9pbmZvLCByY3UpOwogCXBjaV9kZXZfcHV0KHBjaV9kZXYpOwogCiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi90aW1lci5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvdGltZXIuYwppbmRleCBjMzRlZmRhLi4wZjg4NDRlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi90aW1lci5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3RpbWVyLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAogdm9pZCBfX2luaXQgc25fdGltZXJfaW5pdCh2b2lkKQogewotCWNsb2Nrc291cmNlX3NuMi5mc3lzX21taW8gPSBSVENfQ09VTlRFUl9BRERSOworCWNsb2Nrc291cmNlX3NuMi5hcmNoZGF0YS5mc3lzX21taW8gPSBSVENfQ09VTlRFUl9BRERSOwogCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjbG9ja3NvdXJjZV9zbjIsIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZCk7CiAKIAlpYTY0X3VkZWxheSA9ICZpYTY0X3NuX3VkZWxheTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9LY29uZmlnIGIvYXJjaC9tMzJyL0tjb25maWcKaW5kZXggODViNDRlOC4uYjkyYjk0NCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL0tjb25maWcKKysrIGIvYXJjaC9tMzJyL0tjb25maWcKQEAgLTI2OCwxNyArMjY4LDcgQEAKICAgICAgICAgYm9vbAogICAgICAgICBkZWZhdWx0IHkKIAotY29uZmlnIFBSRUVNUFQKLQlib29sICJQcmVlbXB0aWJsZSBLZXJuZWwiCi0JaGVscAotCSAgVGhpcyBvcHRpb24gcmVkdWNlcyB0aGUgbGF0ZW5jeSBvZiB0aGUga2VybmVsIHdoZW4gcmVhY3RpbmcgdG8KLQkgIHJlYWwtdGltZSBvciBpbnRlcmFjdGl2ZSBldmVudHMgYnkgYWxsb3dpbmcgYSBsb3cgcHJpb3JpdHkgcHJvY2VzcyB0bwotCSAgYmUgcHJlZW1wdGVkIGV2ZW4gaWYgaXQgaXMgaW4ga2VybmVsIG1vZGUgZXhlY3V0aW5nIGEgc3lzdGVtIGNhbGwuCi0JICBUaGlzIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gcnVuIG1vcmUgcmVsaWFibHkgZXZlbiB3aGVuIHRoZSBzeXN0ZW0gaXMKLQkgIHVuZGVyIGxvYWQuCi0KLQkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSBkZXNrdG9wLCBlbWJlZGRlZAotCSAgb3IgcmVhbC10aW1lIHN5c3RlbS4gIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgorc291cmNlICJrZXJuZWwvS2NvbmZpZy5wcmVlbXB0IgogCiBjb25maWcgU01QCiAJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9kZWxheS5oIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL2RlbGF5LmgKaW5kZXggOWRkOWU5OS4uOTY3MGUxMiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL2RlbGF5LmgKKysrIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL2RlbGF5LmgKQEAgLTEsMjYgKzEgQEAKLSNpZm5kZWYgX0FTTV9NMzJSX0RFTEFZX0gKLSNkZWZpbmUgX0FTTV9NMzJSX0RFTEFZX0gKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5MyBMaW51cyBUb3J2YWxkcwotICoKLSAqIERlbGF5IHJvdXRpbmVzIGNhbGxpbmcgZnVuY3Rpb25zIGluIGFyY2gvbTMyci9saWIvZGVsYXkuYwotICovCi0KLWV4dGVybiB2b2lkIF9fYmFkX3VkZWxheSh2b2lkKTsKLWV4dGVybiB2b2lkIF9fYmFkX25kZWxheSh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7Ci1leHRlcm4gdm9pZCBfX25kZWxheSh1bnNpZ25lZCBsb25nIG5zZWNzKTsKLWV4dGVybiB2b2lkIF9fY29uc3RfdWRlbGF5KHVuc2lnbmVkIGxvbmcgeGxvb3BzKTsKLWV4dGVybiB2b2lkIF9fZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcyk7Ci0KLSNkZWZpbmUgdWRlbGF5KG4pIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKLQkoKG4pID4gMjAwMDAgPyBfX2JhZF91ZGVsYXkoKSA6IF9fY29uc3RfdWRlbGF5KChuKSAqIDB4MTBjN3VsKSkgOiBcCi0JX191ZGVsYXkobikpCi0KLSNkZWZpbmUgbmRlbGF5KG4pIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKLQkoKG4pID4gMjAwMDAgPyBfX2JhZF9uZGVsYXkoKSA6IF9fY29uc3RfdWRlbGF5KChuKSAqIDV1bCkpIDogXAotCV9fbmRlbGF5KG4pKQotCi0jZW5kaWYgLyogX0FTTV9NMzJSX0RFTEFZX0ggKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL21tem9uZS5oCmluZGV4IDlmM2I1YWMuLjExNWNlZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9tbXpvbmUuaAorKysgYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vbW16b25lLmgKQEAgLTE0LDEyICsxNCw2IEBACiAjZGVmaW5lIE5PREVfREFUQShuaWQpCQkobm9kZV9kYXRhW25pZF0pCiAKICNkZWZpbmUgbm9kZV9sb2NhbG5yKHBmbiwgbmlkKQkoKHBmbikgLSBOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCi0jZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKLSNkZWZpbmUgbm9kZV9lbmRfcGZuKG5pZCkJCQkJCQlcCi0oewkJCQkJCQkJCVwKLQlwZ19kYXRhX3QgKl9fcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsJCQkJXAotCV9fcGdkYXQtPm5vZGVfc3RhcnRfcGZuICsgX19wZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzIC0gMTsJXAotfSkKIAogI2RlZmluZSBwbWRfcGFnZShwbWQpCQkocGZuX3RvX3BhZ2UocG1kX3ZhbChwbWQpID4+IFBBR0VfU0hJRlQpKQogLyoKQEAgLTQ0LDcgKzM4LDcgQEAKIAlpbnQgbm9kZTsKIAogCWZvciAobm9kZSA9IDAgOyBub2RlIDwgTUFYX05VTU5PREVTIDsgbm9kZSsrKQotCQlpZiAocGZuID49IG5vZGVfc3RhcnRfcGZuKG5vZGUpICYmIHBmbiA8PSBub2RlX2VuZF9wZm4obm9kZSkpCisJCWlmIChwZm4gPj0gbm9kZV9zdGFydF9wZm4obm9kZSkgJiYgcGZuIDwgbm9kZV9lbmRfcGZuKG5vZGUpKQogCQkJYnJlYWs7CiAKIAlyZXR1cm4gbm9kZTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCA4Mzk3YzI0Li5lMWY0NmQ3IDEwMDY0NAotLS0gYS9hcmNoL20zMnIvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0xMDYsNyArMTA2LDYgQEAKIAogI2RlZmluZSBzdGFydF90aHJlYWQocmVncywgbmV3X3BjLCBuZXdfc3B1KSAJCQkJXAogCWRvIHsJCQkJCQkJCVwKLQkJc2V0X2ZzKFVTRVJfRFMpOyAJCQkJCVwKIAkJcmVncy0+cHN3ID0gKHJlZ3MtPnBzdyB8IFVTRVJQU19CUFNXKSAmIDB4MDAwMEZGRkZVTDsJXAogCQlyZWdzLT5icGMgPSBuZXdfcGM7CQkJCQlcCiAJCXJlZ3MtPnNwdSA9IG5ld19zcHU7CQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL21vZHVsZS5jIGIvYXJjaC9tMzJyL2tlcm5lbC9tb2R1bGUuYwppbmRleCBjYjVmMzdkLi4zMDcxZmU4IDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvbW9kdWxlLmMKQEAgLTI4LDMzICsyOCw2IEBACiAjZGVmaW5lIERFQlVHUChmbXQuLi4pCiAjZW5kaWYKIAotdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpZiAoc2l6ZSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLSNpZmRlZiBDT05GSUdfTU1VCi0JcmV0dXJuIHZtYWxsb2NfZXhlYyhzaXplKTsKLSNlbHNlCi0JcmV0dXJuIHZtYWxsb2Moc2l6ZSk7Ci0jZW5kaWYKLX0KLQotCi0vKiBGcmVlIG1lbW9yeSByZXR1cm5lZCBmcm9tIG1vZHVsZV9hbGxvYyAqLwotdm9pZCBtb2R1bGVfZnJlZShzdHJ1Y3QgbW9kdWxlICptb2QsIHZvaWQgKm1vZHVsZV9yZWdpb24pCi17Ci0JdmZyZWUobW9kdWxlX3JlZ2lvbik7Ci19Ci0KLS8qIFdlIGRvbid0IG5lZWQgYW55dGhpbmcgc3BlY2lhbC4gKi8KLWludCBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsCi0JCQkgICAgICBFbGZfU2hkciAqc2VjaGRycywKLQkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsCi0JCQkgICAgICBzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KICNkZWZpbmUgQ09QWV9VTkFMSUdORURfV09SRChzdywgdHcsIGFsaWduKSBcCiB7IFwKIAl2b2lkICpfX3MgPSAmKHN3KSwgKl9fdCA9ICYodHcpOyBcCkBAIC0yNDMsMTQgKzIxNiwzIEBACiAJcmV0dXJuIDA7CiAKIH0KLQotaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAotCQkgICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCSAgICBzdHJ1Y3QgbW9kdWxlICptZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnIGIvYXJjaC9tNjhrL0tjb25maWcKaW5kZXggZDY2ZTM0Yy4uMjg0Y2QzNyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcKKysrIGIvYXJjaC9tNjhrL0tjb25maWcKQEAgLTQxLDYgKzQxLDEwIEBACiBjb25maWcgWk9ORV9ETUEKIAlib29sCiAJZGVmYXVsdCB5CisKK2NvbmZpZyBDUFVfSEFTX05PX0JJVEZJRUxEUworCWJvb2wKKwogY29uZmlnIEhaCiAJaW50CiAJZGVmYXVsdCAxMDAwIGlmIENMRU9QQVRSQQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcubm9tbXUgYi9hcmNoL202OGsvS2NvbmZpZy5ub21tdQppbmRleCBmYzk4ZjliLi5mZjQ2MzgzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvS2NvbmZpZy5ub21tdQorKysgYi9hcmNoL202OGsvS2NvbmZpZy5ub21tdQpAQCAtMTQsNiArMTQsMzYgQEAKIAlib29sCiAJZGVmYXVsdCBuCiAKK2NvbmZpZyBNNjgwMDAKKwlib29sCisJc2VsZWN0IENQVV9IQVNfTk9fQklURklFTERTCisJaGVscAorCSAgVGhlIEZyZWVzY2FsZSAod2FzIE1vdG9yb2xhKSA2ODAwMCBDUFUgaXMgdGhlIGZpcnN0IGdlbmVyYXRpb24gb2YKKwkgIHRoZSB3ZWxsIGtub3duIE02OEsgZmFtaWx5IG9mIHByb2Nlc3NvcnMuIFRoZSBDUFUgY29yZSBhcyB3ZWxsIGFzCisJICBiZWluZyBhdmFpbGFibGUgYXMgYSBzdGFuZCBhbG9uZSBDUFUgd2FzIGFsc28gdXNlZCBpbiBtYW55CisJICBTeXN0ZW0tT24tQ2hpcCBkZXZpY2VzIChlZyA2ODMyOCwgNjgzMDIsIGV0YykuIEl0IGRvZXMgbm90IGNvbnRhaW4KKwkgIGEgcGFnaW5nIE1NVS4KKworY29uZmlnIE1DUFUzMgorCWJvb2wKKwlzZWxlY3QgQ1BVX0hBU19OT19CSVRGSUVMRFMKKwloZWxwCisJICBUaGUgRnJlZXNjYWxlICh3YXMgdGhlbiBNb3Rvcm9sYSkgQ1BVMzIgaXMgYSBDUFUgY29yZSB0aGF0IGlzCisJICBiYXNlZCBvbiB0aGUgNjgwMjAgcHJvY2Vzc29yLiBGb3IgdGhlIG1vc3QgcGFydCBpdCBpcyB1c2VkIGluCisJICBTeXN0ZW0tT24tQ2hpcCBwYXJ0cywgYW5kIGRvZXMgbm90IGNvbnRhaW4gYSBwYWdpbmcgTU1VLgorCitjb25maWcgQ09MREZJUkUKKwlib29sCisJc2VsZWN0IEdFTkVSSUNfR1BJTworCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCXNlbGVjdCBDUFVfSEFTX05PX0JJVEZJRUxEUworCWhlbHAKKwkgIFRoZSBGcmVlc2NhbGUgQ29sZEZpcmUgZmFtaWx5IG9mIHByb2Nlc3NvcnMgaXMgYSBtb2Rlcm4gZGVyaXZpdGl2ZQorCSAgb2YgdGhlIDY4MDAwIHByb2Nlc3NvciBmYW1pbHkuIFRoZXkgYXJlIG1haW5seSB0YXJnZXRlZCBhdCBlbWJlZGRlZAorCSAgYXBwbGljYXRpb25zLCBhbmQgYXJlIGFsbCBTeXN0ZW0tT24tQ2hpcCAoU09DKSBkZXZpY2VzLCBhcyBvcHBvc2VkCisJICB0byBzdGFuZCBhbG9uZSBDUFVzLiBUaGV5IGltcGxlbWVudCBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgNjgwMDAKKwkgIHByb2Nlc3NvciBpbnN0cnVjdGlvbiBzZXQuCisKIGNvbmZpZyBDT0xERklSRV9TV19BNwogCWJvb2wKIAlkZWZhdWx0IG4KQEAgLTM2LDI2ICs2NiwzMSBAQAogCiBjb25maWcgTTY4MzI4CiAJYm9vbCAiTUM2ODMyOCIKKwlzZWxlY3QgTTY4MDAwCiAJaGVscAogCSAgTW90b3JvbGEgNjgzMjggcHJvY2Vzc29yIHN1cHBvcnQuCiAKIGNvbmZpZyBNNjhFWjMyOAogCWJvb2wgIk1DNjhFWjMyOCIKKwlzZWxlY3QgTTY4MDAwCiAJaGVscAogCSAgTW90b3JvbGEgNjhFWDMyOCBwcm9jZXNzb3Igc3VwcG9ydC4KIAogY29uZmlnIE02OFZaMzI4CiAJYm9vbCAiTUM2OFZaMzI4IgorCXNlbGVjdCBNNjgwMDAKIAloZWxwCiAJICBNb3Rvcm9sYSA2OFZaMzI4IHByb2Nlc3NvciBzdXBwb3J0LgogCiBjb25maWcgTTY4MzYwCiAJYm9vbCAiTUM2ODM2MCIKKwlzZWxlY3QgTUNQVTMyCiAJaGVscAogCSAgTW90b3JvbGEgNjgzNjAgcHJvY2Vzc29yIHN1cHBvcnQuCiAKIGNvbmZpZyBNNTIwNgogCWJvb2wgIk1DRjUyMDYiCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IENPTERGSVJFX1NXX0E3CiAJc2VsZWN0IEhBVkVfTUJBUgogCWhlbHAKQEAgLTYzLDYgKzk4LDcgQEAKIAogY29uZmlnIE01MjA2ZQogCWJvb2wgIk1DRjUyMDZlIgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBDT0xERklSRV9TV19BNwogCXNlbGVjdCBIQVZFX01CQVIKIAloZWxwCkBAIC03MCw2ICsxMDYsNyBAQAogCiBjb25maWcgTTUyMHgKIAlib29sICJNQ0Y1MjB4IgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfQ0FDSEVfU1BMSVQKIAloZWxwCkBAIC03Nyw2ICsxMTQsNyBAQAogCiBjb25maWcgTTUyM3gKIAlib29sICJNQ0Y1MjN4IgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfQ0FDSEVfU1BMSVQKIAlzZWxlY3QgSEFWRV9JUFNCQVIKQEAgLTg1LDYgKzEyMyw3IEBACiAKIGNvbmZpZyBNNTI0OQogCWJvb2wgIk1DRjUyNDkiCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IENPTERGSVJFX1NXX0E3CiAJc2VsZWN0IEhBVkVfTUJBUgogCWhlbHAKQEAgLTkyLDYgKzEzMSw3IEBACiAKIGNvbmZpZyBNNTI3MQogCWJvb2wgIk1DRjUyNzEiCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IEhBVkVfQ0FDSEVfU1BMSVQKIAlzZWxlY3QgSEFWRV9JUFNCQVIKIAloZWxwCkBAIC05OSw2ICsxMzksNyBAQAogCiBjb25maWcgTTUyNzIKIAlib29sICJNQ0Y1MjcyIgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBDT0xERklSRV9TV19BNwogCXNlbGVjdCBIQVZFX01CQVIKIAloZWxwCkBAIC0xMDYsNiArMTQ3LDcgQEAKIAogY29uZmlnIE01Mjc1CiAJYm9vbCAiTUNGNTI3NSIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgSEFWRV9DQUNIRV9TUExJVAogCXNlbGVjdCBIQVZFX0lQU0JBUgogCWhlbHAKQEAgLTExMyw2ICsxNTUsNyBAQAogCiBjb25maWcgTTUyOHgKIAlib29sICJNQ0Y1Mjh4IgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfQ0FDSEVfU1BMSVQKIAlzZWxlY3QgSEFWRV9JUFNCQVIKQEAgLTEyMSw2ICsxNjQsNyBAQAogCiBjb25maWcgTTUzMDcKIAlib29sICJNQ0Y1MzA3IgorCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBDT0xERklSRV9TV19BNwogCXNlbGVjdCBIQVZFX0NBQ0hFX0NCCiAJc2VsZWN0IEhBVkVfTUJBUgpAQCAtMTI5LDEyICsxNzMsMTQgQEAKIAogY29uZmlnIE01MzJ4CiAJYm9vbCAiTUNGNTMyeCIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCWhlbHAKIAkgIEZyZWVzY2FsZSAoTW90b3JvbGEpIENvbGRGaXJlIDUzMnggcHJvY2Vzc29yIHN1cHBvcnQuCiAKIGNvbmZpZyBNNTQwNwogCWJvb2wgIk1DRjU0MDciCisJc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IENPTERGSVJFX1NXX0E3CiAJc2VsZWN0IEhBVkVfQ0FDSEVfQ0IKIAlzZWxlY3QgSEFWRV9NQkFSCkBAIC0xNDMsNiArMTg5LDcgQEAKIAogY29uZmlnIE01NDd4CiAJYm9vbCAiTUNGNTQ3eCIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCXNlbGVjdCBIQVZFX01CQVIKIAloZWxwCkBAIC0xNTAsNiArMTk3LDcgQEAKIAogY29uZmlnIE01NDh4CiAJYm9vbCAiTUNGNTQ4eCIKKwlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCXNlbGVjdCBIQVZFX01CQVIKIAloZWxwCkBAIC0xNjgsMTMgKzIxNiw2IEBACiAJZGVwZW5kcyBvbiAoTTU0OHggfHwgTTU0N3gpCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBDT0xERklSRQotCWJvb2wKLQlkZXBlbmRzIG9uIChNNTIwNiB8fCBNNTIwNmUgfHwgTTUyMHggfHwgTTUyM3ggfHwgTTUyNDkgfHwgTTUyN3ggfHwgTTUyNzIgfHwgTTUyOHggfHwgTTUzMDcgfHwgTTUzMnggfHwgTTU0MDcgfHwgTTU0eHgpCi0Jc2VsZWN0IEdFTkVSSUNfR1BJTwotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgotCWRlZmF1bHQgeQotCiBjb25maWcgQ0xPQ0tfU0VUCiAJYm9vbCAiRW5hYmxlIHNldHRpbmcgdGhlIENQVSBjbG9jayBmcmVxdWVuY3kiCiAJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9hcmNoL202OGsvTWFrZWZpbGVfbm8gYi9hcmNoL202OGsvTWFrZWZpbGVfbm8KaW5kZXggODE2NTJhYi4uODQ0ZDNmMSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL01ha2VmaWxlX25vCisrKyBiL2FyY2gvbTY4ay9NYWtlZmlsZV9ubwpAQCAtMTMsNyArMTMsNyBAQAogcGxhdGZvcm0tJChDT05GSUdfTTY4VlozMjgpCTo9IDY4VlozMjgKIHBsYXRmb3JtLSQoQ09ORklHX002ODM2MCkJOj0gNjgzNjAKIHBsYXRmb3JtLSQoQ09ORklHX001MjA2KQk6PSA1MjA2Ci1wbGF0Zm9ybS0kKENPTkZJR19NNTIwNmUpCTo9IDUyMDZlCitwbGF0Zm9ybS0kKENPTkZJR19NNTIwNmUpCTo9IDUyMDYKIHBsYXRmb3JtLSQoQ09ORklHX001MjB4KQk6PSA1MjB4CiBwbGF0Zm9ybS0kKENPTkZJR19NNTIzeCkJOj0gNTIzeAogcGxhdGZvcm0tJChDT05GSUdfTTUyNDkpCTo9IDUyNDkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9lbXUvbmZldGguYyBiL2FyY2gvbTY4ay9lbXUvbmZldGguYwppbmRleCA4YjZlMjAxLi5jNTc0OGJiIDEwMDY0NAotLS0gYS9hcmNoL202OGsvZW11L25mZXRoLmMKKysrIGIvYXJjaC9tNjhrL2VtdS9uZmV0aC5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9uYXRmZWF0Lmg+CiAjaW5jbHVkZSA8YXNtL3ZpcnRjb252ZXJ0Lmg+CkBAIC0yMDQsNyArMjA1LDYgQEAKIAlkZXYtPmlycSA9IG5mRXRoZXJJUlE7CiAJZGV2LT5uZXRkZXZfb3BzID0gJm5mZXRoX25ldGRldl9vcHM7CiAKLQlkZXYtPmZsYWdzIHw9IE5FVElGX0ZfTk9fQ1NVTTsKIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgbWFjLCBFVEhfQUxFTik7CiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCAwM2FlM2QxLi4zMDdhNTczIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0xNjksMTggKzE2OSwxOCBAQAogCWNoYXIgYzsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYWRkbCAlMiwlMTsgc21pICUwIgogCQkJICAgICA6ICI9ZCIgKGMpLCAiK20iICgqdikKLQkJCSAgICAgOiAiaWQiIChpKSk7CisJCQkgICAgIDogQVNNX0RJIChpKSk7CiAJcmV0dXJuIGMgIT0gMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgdW5zaWduZWQgbG9uZyAqdikKIHsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYW5kbCAlMSwlMCIgOiAiK20iICgqdikgOiAiaWQiICh+KG1hc2spKSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oImFuZGwgJTEsJTAiIDogIittIiAoKnYpIDogQVNNX0RJICh+KG1hc2spKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc2V0X21hc2sodW5zaWduZWQgbG9uZyBtYXNrLCB1bnNpZ25lZCBsb25nICp2KQogewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJvcmwgJTEsJTAiIDogIittIiAoKnYpIDogImlkIiAobWFzaykpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJvcmwgJTEsJTAiIDogIittIiAoKnYpIDogQVNNX0RJIChtYXNrKSk7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfYWRkX3VubGVzcyhhdG9taWNfdCAqdiwgaW50IGEsIGludCB1KQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2JpdG9wcy5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2JpdG9wcy5oCmluZGV4IGNlMTYzYWIuLmM2YmFhOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9iaXRvcHMuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vYml0b3BzLmgKQEAgLTEsNSArMSw1MzAgQEAKLSNpZmRlZiBfX3VDbGludXhfXwotI2luY2x1ZGUgImJpdG9wc19uby5oIgotI2Vsc2UKLSNpbmNsdWRlICJiaXRvcHNfbW0uaCIKKyNpZm5kZWYgX002OEtfQklUT1BTX0gKKyNkZWZpbmUgX002OEtfQklUT1BTX0gKKy8qCisgKiBDb3B5cmlnaHQgMTk5MiwgTGludXMgVG9ydmFsZHMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0JJVE9QU19ICisjZXJyb3Igb25seSA8bGludXgvYml0b3BzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseQogI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisvKgorICoJQml0IGFjY2VzcyBmdW5jdGlvbnMgdmFyeSBhY3Jvc3MgdGhlIENvbGRGaXJlIGFuZCA2OGsgZmFtaWxpZXMuCisgKglTbyB3ZSB3aWxsIGJyZWFrIHRoZW0gb3V0IGhlcmUsIGFuZCB0aGVuIG1hY3JvIGluIHRoZSBvbmVzIHdlIHdhbnQuCisgKgorICoJQ29sZEZpcmUgLSBzdXBwb3J0cyBzdGFuZGFyZCBic2V0L2JjbHIvYmNoZyB3aXRoIHJlZ2lzdGVyIG9wZXJhbmQgb25seQorICoJNjgwMDAgICAgLSBzdXBwb3J0cyBzdGFuZGFyZCBic2V0L2JjbHIvYmNoZyB3aXRoIG1lbW9yeSBvcGVyYW5kCisgKgk+PSA2ODAyMCAtIGFsc28gc3VwcG9ydHMgdGhlIGJmc2V0L2JmY2xyL2JmY2hnIGluc3RydWN0aW9ucworICoKKyAqCUFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBvbmx5IHRoZSBic2V0L2JjbHIvYmNoZyB3aXRoIHJlZ2lzdGVyCisgKglvcGVyYW5kcyBvbiBhbGwgcGxhdGZvcm1zIHlvdSBlbmQgdXAgd2l0aCBsYXJnZXIgZ2VuZXJhdGVkIGNvZGUuCisgKglTbyB3ZSB1c2UgdGhlIGJlc3QgZm9ybSBwb3NzaWJsZSBvbiBhIGdpdmVuIHBsYXRmb3JtLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBic2V0X3JlZ19zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdmFkZHIpCit7CisJY2hhciAqcCA9IChjaGFyICopdmFkZHIgKyAobnIgXiAzMSkgLyA4OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJic2V0ICUxLCglMCkiCisJCToKKwkJOiAiYSIgKHApLCAiZGkiIChuciAmIDcpCisJCTogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnNldF9tZW1fc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnZhZGRyKQoreworCWNoYXIgKnAgPSAoY2hhciAqKXZhZGRyICsgKG5yIF4gMzEpIC8gODsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiYnNldCAlMSwlMCIKKwkJOiAiK20iICgqcCkKKwkJOiAiZGkiIChuciAmIDcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJmc2V0X21lbV9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdmFkZHIpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZnNldCAlMXslMDojMX0iCisJCToKKwkJOiAiZCIgKG5yIF4gMzEpLCAibyIgKCp2YWRkcikKKwkJOiAibWVtb3J5Iik7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKKyNkZWZpbmUJc2V0X2JpdChuciwgdmFkZHIpCWJzZXRfcmVnX3NldF9iaXQobnIsIHZhZGRyKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX0hBU19OT19CSVRGSUVMRFMpCisjZGVmaW5lCXNldF9iaXQobnIsIHZhZGRyKQlic2V0X21lbV9zZXRfYml0KG5yLCB2YWRkcikKKyNlbHNlCisjZGVmaW5lIHNldF9iaXQobnIsIHZhZGRyKQkoX19idWlsdGluX2NvbnN0YW50X3AobnIpID8gXAorCQkJCWJzZXRfbWVtX3NldF9iaXQobnIsIHZhZGRyKSA6IFwKKwkJCQliZnNldF9tZW1fc2V0X2JpdChuciwgdmFkZHIpKQorI2VuZGlmCisKKyNkZWZpbmUgX19zZXRfYml0KG5yLCB2YWRkcikJc2V0X2JpdChuciwgdmFkZHIpCisKKworLyoKKyAqIGNsZWFyX2JpdCgpIGRvZXNuJ3QgcHJvdmlkZSBhbnkgYmFycmllciBmb3IgdGhlIGNvbXBpbGVyLgorICovCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNscl9yZWdfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdmFkZHIpCit7CisJY2hhciAqcCA9IChjaGFyICopdmFkZHIgKyAobnIgXiAzMSkgLyA4OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiY2xyICUxLCglMCkiCisJCToKKwkJOiAiYSIgKHApLCAiZGkiIChuciAmIDcpCisJCTogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNscl9tZW1fY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdmFkZHIpCit7CisJY2hhciAqcCA9IChjaGFyICopdmFkZHIgKyAobnIgXiAzMSkgLyA4OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiY2xyICUxLCUwIgorCQk6ICIrbSIgKCpwKQorCQk6ICJkaSIgKG5yICYgNykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmZjbHJfbWVtX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnZhZGRyKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgiYmZjbHIgJTF7JTA6IzF9IgorCQk6CisJCTogImQiIChuciBeIDMxKSwgIm8iICgqdmFkZHIpCisJCTogIm1lbW9yeSIpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCisjZGVmaW5lCWNsZWFyX2JpdChuciwgdmFkZHIpCWJjbHJfcmVnX2NsZWFyX2JpdChuciwgdmFkZHIpCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfSEFTX05PX0JJVEZJRUxEUykKKyNkZWZpbmUJY2xlYXJfYml0KG5yLCB2YWRkcikJYmNscl9tZW1fY2xlYXJfYml0KG5yLCB2YWRkcikKKyNlbHNlCisjZGVmaW5lIGNsZWFyX2JpdChuciwgdmFkZHIpCShfX2J1aWx0aW5fY29uc3RhbnRfcChucikgPyBcCisJCQkJYmNscl9tZW1fY2xlYXJfYml0KG5yLCB2YWRkcikgOiBcCisJCQkJYmZjbHJfbWVtX2NsZWFyX2JpdChuciwgdmFkZHIpKQorI2VuZGlmCisKKyNkZWZpbmUgX19jbGVhcl9iaXQobnIsIHZhZGRyKQljbGVhcl9iaXQobnIsIHZhZGRyKQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY2hnX3JlZ19jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdmFkZHIpCit7CisJY2hhciAqcCA9IChjaGFyICopdmFkZHIgKyAobnIgXiAzMSkgLyA4OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiY2hnICUxLCglMCkiCisJCToKKwkJOiAiYSIgKHApLCAiZGkiIChuciAmIDcpCisJCTogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNoZ19tZW1fY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnZhZGRyKQoreworCWNoYXIgKnAgPSAoY2hhciAqKXZhZGRyICsgKG5yIF4gMzEpIC8gODsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiYmNoZyAlMSwlMCIKKwkJOiAiK20iICgqcCkKKwkJOiAiZGkiIChuciAmIDcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJmY2hnX21lbV9jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdmFkZHIpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZmNoZyAlMXslMDojMX0iCisJCToKKwkJOiAiZCIgKG5yIF4gMzEpLCAibyIgKCp2YWRkcikKKwkJOiAibWVtb3J5Iik7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKKyNkZWZpbmUJY2hhbmdlX2JpdChuciwgdmFkZHIpCWJjaGdfcmVnX2NoYW5nZV9iaXQobnIsIHZhZGRyKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX0hBU19OT19CSVRGSUVMRFMpCisjZGVmaW5lCWNoYW5nZV9iaXQobnIsIHZhZGRyKQliY2hnX21lbV9jaGFuZ2VfYml0KG5yLCB2YWRkcikKKyNlbHNlCisjZGVmaW5lIGNoYW5nZV9iaXQobnIsIHZhZGRyKQkoX19idWlsdGluX2NvbnN0YW50X3AobnIpID8gXAorCQkJCWJjaGdfbWVtX2NoYW5nZV9iaXQobnIsIHZhZGRyKSA6IFwKKwkJCQliZmNoZ19tZW1fY2hhbmdlX2JpdChuciwgdmFkZHIpKQorI2VuZGlmCisKKyNkZWZpbmUgX19jaGFuZ2VfYml0KG5yLCB2YWRkcikJY2hhbmdlX2JpdChuciwgdmFkZHIpCisKKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9iaXQoaW50IG5yLCBjb25zdCB1bnNpZ25lZCBsb25nICp2YWRkcikKK3sKKwlyZXR1cm4gKHZhZGRyW25yID4+IDVdICYgKDFVTCA8PCAobnIgJiAzMSkpKSAhPSAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IGJzZXRfcmVnX3Rlc3RfYW5kX3NldF9iaXQoaW50IG5yLAorCQkJCQkgICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdmFkZHIpCit7CisJY2hhciAqcCA9IChjaGFyICopdmFkZHIgKyAobnIgXiAzMSkgLyA4OworCWNoYXIgcmV0dmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJic2V0ICUyLCglMSk7IHNuZSAlMCIKKwkJOiAiPWQiIChyZXR2YWwpCisJCTogImEiIChwKSwgImRpIiAobnIgJiA3KQorCQk6ICJtZW1vcnkiKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBic2V0X21lbV90ZXN0X2FuZF9zZXRfYml0KGludCBuciwKKwkJCQkJICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnZhZGRyKQoreworCWNoYXIgKnAgPSAoY2hhciAqKXZhZGRyICsgKG5yIF4gMzEpIC8gODsKKwljaGFyIHJldHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiYnNldCAlMiwlMTsgc25lICUwIgorCQk6ICI9ZCIgKHJldHZhbCksICIrbSIgKCpwKQorCQk6ICJkaSIgKG5yICYgNykpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJmc2V0X21lbV90ZXN0X2FuZF9zZXRfYml0KGludCBuciwKKwkJCQkJICAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2YWRkcikKK3sKKwljaGFyIHJldHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiYmZzZXQgJTJ7JTE6IzF9OyBzbmUgJTAiCisJCTogIj1kIiAocmV0dmFsKQorCQk6ICJkIiAobnIgXiAzMSksICJvIiAoKnZhZGRyKQorCQk6ICJtZW1vcnkiKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCisjZGVmaW5lCXRlc3RfYW5kX3NldF9iaXQobnIsIHZhZGRyKQlic2V0X3JlZ190ZXN0X2FuZF9zZXRfYml0KG5yLCB2YWRkcikKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9IQVNfTk9fQklURklFTERTKQorI2RlZmluZQl0ZXN0X2FuZF9zZXRfYml0KG5yLCB2YWRkcikJYnNldF9tZW1fdGVzdF9hbmRfc2V0X2JpdChuciwgdmFkZHIpCisjZWxzZQorI2RlZmluZSB0ZXN0X2FuZF9zZXRfYml0KG5yLCB2YWRkcikJKF9fYnVpbHRpbl9jb25zdGFudF9wKG5yKSA/IFwKKwkJCQkJYnNldF9tZW1fdGVzdF9hbmRfc2V0X2JpdChuciwgdmFkZHIpIDogXAorCQkJCQliZnNldF9tZW1fdGVzdF9hbmRfc2V0X2JpdChuciwgdmFkZHIpKQorI2VuZGlmCisKKyNkZWZpbmUgX190ZXN0X2FuZF9zZXRfYml0KG5yLCB2YWRkcikJdGVzdF9hbmRfc2V0X2JpdChuciwgdmFkZHIpCisKKworc3RhdGljIGlubGluZSBpbnQgYmNscl9yZWdfdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwKKwkJCQkJICAgICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdmFkZHIpCit7CisJY2hhciAqcCA9IChjaGFyICopdmFkZHIgKyAobnIgXiAzMSkgLyA4OworCWNoYXIgcmV0dmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiY2xyICUyLCglMSk7IHNuZSAlMCIKKwkJOiAiPWQiIChyZXR2YWwpCisJCTogImEiIChwKSwgImRpIiAobnIgJiA3KQorCQk6ICJtZW1vcnkiKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBiY2xyX21lbV90ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLAorCQkJCQkgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2YWRkcikKK3sKKwljaGFyICpwID0gKGNoYXIgKil2YWRkciArIChuciBeIDMxKSAvIDg7CisJY2hhciByZXR2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJjbHIgJTIsJTE7IHNuZSAlMCIKKwkJOiAiPWQiIChyZXR2YWwpLCAiK20iICgqcCkKKwkJOiAiZGkiIChuciAmIDcpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBiZmNscl9tZW1fdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwKKwkJCQkJICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnZhZGRyKQoreworCWNoYXIgcmV0dmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZmNsciAlMnslMTojMX07IHNuZSAlMCIKKwkJOiAiPWQiIChyZXR2YWwpCisJCTogImQiIChuciBeIDMxKSwgIm8iICgqdmFkZHIpCisJCTogIm1lbW9yeSIpOworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKKyNkZWZpbmUJdGVzdF9hbmRfY2xlYXJfYml0KG5yLCB2YWRkcikJYmNscl9yZWdfdGVzdF9hbmRfY2xlYXJfYml0KG5yLCB2YWRkcikKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9IQVNfTk9fQklURklFTERTKQorI2RlZmluZQl0ZXN0X2FuZF9jbGVhcl9iaXQobnIsIHZhZGRyKQliY2xyX21lbV90ZXN0X2FuZF9jbGVhcl9iaXQobnIsIHZhZGRyKQorI2Vsc2UKKyNkZWZpbmUgdGVzdF9hbmRfY2xlYXJfYml0KG5yLCB2YWRkcikJKF9fYnVpbHRpbl9jb25zdGFudF9wKG5yKSA/IFwKKwkJCQkJYmNscl9tZW1fdGVzdF9hbmRfY2xlYXJfYml0KG5yLCB2YWRkcikgOiBcCisJCQkJCWJmY2xyX21lbV90ZXN0X2FuZF9jbGVhcl9iaXQobnIsIHZhZGRyKSkKKyNlbmRpZgorCisjZGVmaW5lIF9fdGVzdF9hbmRfY2xlYXJfYml0KG5yLCB2YWRkcikJdGVzdF9hbmRfY2xlYXJfYml0KG5yLCB2YWRkcikKKworCitzdGF0aWMgaW5saW5lIGludCBiY2hnX3JlZ190ZXN0X2FuZF9jaGFuZ2VfYml0KGludCBuciwKKwkJCQkJICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnZhZGRyKQoreworCWNoYXIgKnAgPSAoY2hhciAqKXZhZGRyICsgKG5yIF4gMzEpIC8gODsKKwljaGFyIHJldHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiYmNoZyAlMiwoJTEpOyBzbmUgJTAiCisJCTogIj1kIiAocmV0dmFsKQorCQk6ICJhIiAocCksICJkaSIgKG5yICYgNykKKwkJOiAibWVtb3J5Iik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmNoZ19tZW1fdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsCisJCQkJCSAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2YWRkcikKK3sKKwljaGFyICpwID0gKGNoYXIgKil2YWRkciArIChuciBeIDMxKSAvIDg7CisJY2hhciByZXR2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJjaGcgJTIsJTE7IHNuZSAlMCIKKwkJOiAiPWQiIChyZXR2YWwpLCAiK20iICgqcCkKKwkJOiAiZGkiIChuciAmIDcpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBiZmNoZ19tZW1fdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsCisJCQkJCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2YWRkcikKK3sKKwljaGFyIHJldHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiYmZjaGcgJTJ7JTE6IzF9OyBzbmUgJTAiCisJCTogIj1kIiAocmV0dmFsKQorCQk6ICJkIiAobnIgXiAzMSksICJvIiAoKnZhZGRyKQorCQk6ICJtZW1vcnkiKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCisjZGVmaW5lCXRlc3RfYW5kX2NoYW5nZV9iaXQobnIsIHZhZGRyKQliY2hnX3JlZ190ZXN0X2FuZF9jaGFuZ2VfYml0KG5yLCB2YWRkcikKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9IQVNfTk9fQklURklFTERTKQorI2RlZmluZQl0ZXN0X2FuZF9jaGFuZ2VfYml0KG5yLCB2YWRkcikJYmNoZ19tZW1fdGVzdF9hbmRfY2hhbmdlX2JpdChuciwgdmFkZHIpCisjZWxzZQorI2RlZmluZSB0ZXN0X2FuZF9jaGFuZ2VfYml0KG5yLCB2YWRkcikJKF9fYnVpbHRpbl9jb25zdGFudF9wKG5yKSA/IFwKKwkJCQkJYmNoZ19tZW1fdGVzdF9hbmRfY2hhbmdlX2JpdChuciwgdmFkZHIpIDogXAorCQkJCQliZmNoZ19tZW1fdGVzdF9hbmRfY2hhbmdlX2JpdChuciwgdmFkZHIpKQorI2VuZGlmCisKKyNkZWZpbmUgX190ZXN0X2FuZF9jaGFuZ2VfYml0KG5yLCB2YWRkcikgdGVzdF9hbmRfY2hhbmdlX2JpdChuciwgdmFkZHIpCisKKworLyoKKyAqCVRoZSB0cnVlIDY4MDIwIGFuZCBtb3JlIGFkdmFuY2VkIHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgImJmZmZvIgorICoJaW5zdHJ1Y3Rpb24gZm9yIGZpbmRpbmcgYml0cy4gQ29sZEZpcmUgYW5kIHNpbXBsZSA2ODAwMCBwYXJ0cworICoJKGluY2x1ZGluZyBDUFUzMikgZG8gbm90IHN1cHBvcnQgdGhpcy4gVGhleSBzaW1wbHkgdXNlIHRoZSBnZW5lcmljCisgKglmdW5jdGlvbnMuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfSEFTX05PX0JJVEZJRUxEUykKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmluZC5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9mZnouaD4KKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IGZpbmRfZmlyc3RfemVyb19iaXQoY29uc3QgdW5zaWduZWQgbG9uZyAqdmFkZHIsCisJCQkJICAgICAgdW5zaWduZWQgc2l6ZSkKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nICpwID0gdmFkZHI7CisJaW50IHJlcyA9IDMyOworCXVuc2lnbmVkIGludCB3b3JkczsKKwl1bnNpZ25lZCBsb25nIG51bTsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwl3b3JkcyA9IChzaXplICsgMzEpID4+IDU7CisJd2hpbGUgKCEobnVtID0gfipwKyspKSB7CisJCWlmICghLS13b3JkcykKKwkJCWdvdG8gb3V0OworCX0KKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiYmZmZm8gJTF7IzAsIzB9LCUwIgorCQkJICAgICAgOiAiPWQiIChyZXMpIDogImQiIChudW0gJiAtbnVtKSk7CisJcmVzIF49IDMxOworb3V0OgorCXJlcyArPSAoKGxvbmcpcCAtIChsb25nKXZhZGRyIC0gNCkgKiA4OworCXJldHVybiByZXMgPCBzaXplID8gcmVzIDogc2l6ZTsKK30KKyNkZWZpbmUgZmluZF9maXJzdF96ZXJvX2JpdCBmaW5kX2ZpcnN0X3plcm9fYml0CisKK3N0YXRpYyBpbmxpbmUgaW50IGZpbmRfbmV4dF96ZXJvX2JpdChjb25zdCB1bnNpZ25lZCBsb25nICp2YWRkciwgaW50IHNpemUsCisJCQkJICAgICBpbnQgb2Zmc2V0KQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnAgPSB2YWRkciArIChvZmZzZXQgPj4gNSk7CisJaW50IGJpdCA9IG9mZnNldCAmIDMxVUwsIHJlczsKKworCWlmIChvZmZzZXQgPj0gc2l6ZSkKKwkJcmV0dXJuIHNpemU7CisKKwlpZiAoYml0KSB7CisJCXVuc2lnbmVkIGxvbmcgbnVtID0gfipwKysgJiAofjBVTCA8PCBiaXQpOworCQlvZmZzZXQgLT0gYml0OworCisJCS8qIExvb2sgZm9yIHplcm8gaW4gZmlyc3QgbG9uZ3dvcmQgKi8KKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZmZmbyAlMXsjMCwjMH0sJTAiCisJCQkJICAgICAgOiAiPWQiIChyZXMpIDogImQiIChudW0gJiAtbnVtKSk7CisJCWlmIChyZXMgPCAzMikgeworCQkJb2Zmc2V0ICs9IHJlcyBeIDMxOworCQkJcmV0dXJuIG9mZnNldCA8IHNpemUgPyBvZmZzZXQgOiBzaXplOworCQl9CisJCW9mZnNldCArPSAzMjsKKworCQlpZiAob2Zmc2V0ID49IHNpemUpCisJCQlyZXR1cm4gc2l6ZTsKKwl9CisJLyogTm8gemVybyB5ZXQsIHNlYXJjaCByZW1haW5pbmcgZnVsbCBieXRlcyBmb3IgYSB6ZXJvICovCisJcmV0dXJuIG9mZnNldCArIGZpbmRfZmlyc3RfemVyb19iaXQocCwgc2l6ZSAtIG9mZnNldCk7Cit9CisjZGVmaW5lIGZpbmRfbmV4dF96ZXJvX2JpdCBmaW5kX25leHRfemVyb19iaXQKKworc3RhdGljIGlubGluZSBpbnQgZmluZF9maXJzdF9iaXQoY29uc3QgdW5zaWduZWQgbG9uZyAqdmFkZHIsIHVuc2lnbmVkIHNpemUpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9IHZhZGRyOworCWludCByZXMgPSAzMjsKKwl1bnNpZ25lZCBpbnQgd29yZHM7CisJdW5zaWduZWQgbG9uZyBudW07CisKKwlpZiAoIXNpemUpCisJCXJldHVybiAwOworCisJd29yZHMgPSAoc2l6ZSArIDMxKSA+PiA1OworCXdoaWxlICghKG51bSA9ICpwKyspKSB7CisJCWlmICghLS13b3JkcykKKwkJCWdvdG8gb3V0OworCX0KKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiYmZmZm8gJTF7IzAsIzB9LCUwIgorCQkJICAgICAgOiAiPWQiIChyZXMpIDogImQiIChudW0gJiAtbnVtKSk7CisJcmVzIF49IDMxOworb3V0OgorCXJlcyArPSAoKGxvbmcpcCAtIChsb25nKXZhZGRyIC0gNCkgKiA4OworCXJldHVybiByZXMgPCBzaXplID8gcmVzIDogc2l6ZTsKK30KKyNkZWZpbmUgZmluZF9maXJzdF9iaXQgZmluZF9maXJzdF9iaXQKKworc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X2JpdChjb25zdCB1bnNpZ25lZCBsb25nICp2YWRkciwgaW50IHNpemUsCisJCQkJaW50IG9mZnNldCkKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nICpwID0gdmFkZHIgKyAob2Zmc2V0ID4+IDUpOworCWludCBiaXQgPSBvZmZzZXQgJiAzMVVMLCByZXM7CisKKwlpZiAob2Zmc2V0ID49IHNpemUpCisJCXJldHVybiBzaXplOworCisJaWYgKGJpdCkgeworCQl1bnNpZ25lZCBsb25nIG51bSA9ICpwKysgJiAofjBVTCA8PCBiaXQpOworCQlvZmZzZXQgLT0gYml0OworCisJCS8qIExvb2sgZm9yIG9uZSBpbiBmaXJzdCBsb25nd29yZCAqLworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJmZmZvICUxeyMwLCMwfSwlMCIKKwkJCQkgICAgICA6ICI9ZCIgKHJlcykgOiAiZCIgKG51bSAmIC1udW0pKTsKKwkJaWYgKHJlcyA8IDMyKSB7CisJCQlvZmZzZXQgKz0gcmVzIF4gMzE7CisJCQlyZXR1cm4gb2Zmc2V0IDwgc2l6ZSA/IG9mZnNldCA6IHNpemU7CisJCX0KKwkJb2Zmc2V0ICs9IDMyOworCisJCWlmIChvZmZzZXQgPj0gc2l6ZSkKKwkJCXJldHVybiBzaXplOworCX0KKwkvKiBObyBvbmUgeWV0LCBzZWFyY2ggcmVtYWluaW5nIGZ1bGwgYnl0ZXMgZm9yIGEgb25lICovCisJcmV0dXJuIG9mZnNldCArIGZpbmRfZmlyc3RfYml0KHAsIHNpemUgLSBvZmZzZXQpOworfQorI2RlZmluZSBmaW5kX25leHRfYml0IGZpbmRfbmV4dF9iaXQKKworLyoKKyAqIGZmeiA9IEZpbmQgRmlyc3QgWmVybyBpbiB3b3JkLiBVbmRlZmluZWQgaWYgbm8gemVybyBleGlzdHMsCisgKiBzbyBjb2RlIHNob3VsZCBjaGVjayBhZ2FpbnN0IH4wVUwgZmlyc3QuLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZmZ6KHVuc2lnbmVkIGxvbmcgd29yZCkKK3sKKwlpbnQgcmVzOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZmZmbyAlMXsjMCwjMH0sJTAiCisJCQkgICAgICA6ICI9ZCIgKHJlcykgOiAiZCIgKH53b3JkICYgLX53b3JkKSk7CisJcmV0dXJuIHJlcyBeIDMxOworfQorCisjZW5kaWYKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9IQVNfTk9fQklURklFTERTKQorCisvKgorICoJVGhlIG5ld2VyIENvbGRGaXJlIGZhbWlseSBtZW1iZXJzIHN1cHBvcnQgYSAiYml0cmV2IiBpbnN0cnVjdGlvbgorICoJYW5kIHdlIGNhbiB1c2UgdGhhdCB0byBpbXBsZW1lbnQgYSBmYXN0IGZmcy4gT2xkZXIgQ29sZGZpcmUgcGFydHMsCisgKglhbmQgbm9ybWFsIDY4MDAwIHBhcnRzIGRvbid0IGhhdmUgYW55dGhpbmcgc3BlY2lhbCwgc28gd2UgdXNlIHRoZQorICoJZ2VuZXJpYyBmdW5jdGlvbnMgZm9yIHRob3NlLgorICovCisjaWYgKGRlZmluZWQoX19tY2Zpc2FhcGx1c19fKSB8fCBkZWZpbmVkKF9fbWNmaXNhY19fKSkgJiYgXAorCSFkZWZpbmVkKENPTkZJR19NNjgwMDApICYmICFkZWZpbmVkKENPTkZJR19NQ1BVMzIpCitzdGF0aWMgaW5saW5lIGludCBfX2ZmcyhpbnQgeCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJpdHJldiAlMDsgZmYxICUwIgorCQk6ICI9ZCIgKHgpCisJCTogIjAiICh4KSk7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZmcyhpbnQgeCkKK3sKKwlpZiAoIXgpCisJCXJldHVybiAwOworCXJldHVybiBfX2Zmcyh4KSArIDE7Cit9CisKKyNlbHNlCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2Zmcy5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9fX2Zmcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmxzLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL19fZmxzLmg+CisKKyNlbHNlCisKKy8qCisgKglmZnM6IGZpbmQgZmlyc3QgYml0IHNldC4gVGhpcyBpcyBkZWZpbmVkIHRoZSBzYW1lIHdheSBhcworICoJdGhlIGxpYmMgYW5kIGNvbXBpbGVyIGJ1aWx0aW4gZmZzIHJvdXRpbmVzLCB0aGVyZWZvcmUKKyAqCWRpZmZlcnMgaW4gc3Bpcml0IGZyb20gdGhlIGFib3ZlIGZmeiAobWFuIGZmcykuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZmcyhpbnQgeCkKK3sKKwlpbnQgY250OworCisJX19hc21fXyAoImJmZmZvICUxeyMwOiMwfSwlMCIKKwkJOiAiPWQiIChjbnQpCisJCTogImRtIiAoeCAmIC14KSk7CisJcmV0dXJuIDMyIC0gY250OworfQorI2RlZmluZSBfX2Zmcyh4KSAoZmZzKHgpIC0gMSkKKworLyoKKyAqCWZsczogZmluZCBsYXN0IGJpdCBzZXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZscyhpbnQgeCkKK3sKKwlpbnQgY250OworCisJX19hc21fXyAoImJmZmZvICUxeyMwLCMwfSwlMCIKKwkJOiAiPWQiIChjbnQpCisJCTogImRtIiAoeCkpOworCXJldHVybiAzMiAtIGNudDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19mbHMoaW50IHgpCit7CisJcmV0dXJuIGZscyh4KSAtIDE7Cit9CisKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2V4dDItYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2xlLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2ZsczY0Lmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2h3ZWlnaHQuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvbG9jay5oPgorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9NNjhLX0JJVE9QU19IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYml0b3BzX21tLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vYml0b3BzX21tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Y2Y1YjguLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2JpdG9wc19tbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLSNpZm5kZWYgX002OEtfQklUT1BTX0gKLSNkZWZpbmUgX002OEtfQklUT1BTX0gKLS8qCi0gKiBDb3B5cmlnaHQgMTk5MiwgTGludXMgVG9ydmFsZHMuCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0JJVE9QU19ICi0jZXJyb3Igb25seSA8bGludXgvYml0b3BzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseQotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotCi0vKgotICogUmVxdWlyZSA2ODAyMCBvciBiZXR0ZXIuCi0gKgotICogVGhleSB1c2UgdGhlIHN0YW5kYXJkIGJpZy1lbmRpYW4gbTY4MHgwIGJpdCBvcmRlcmluZy4KLSAqLwotCi0jZGVmaW5lIHRlc3RfYW5kX3NldF9iaXQobnIsdmFkZHIpIFwKLSAgKF9fYnVpbHRpbl9jb25zdGFudF9wKG5yKSA/IFwKLSAgIF9fY29uc3RhbnRfdGVzdF9hbmRfc2V0X2JpdChuciwgdmFkZHIpIDogXAotICAgX19nZW5lcmljX3Rlc3RfYW5kX3NldF9iaXQobnIsIHZhZGRyKSkKLQotI2RlZmluZSBfX3Rlc3RfYW5kX3NldF9iaXQobnIsdmFkZHIpIHRlc3RfYW5kX3NldF9iaXQobnIsdmFkZHIpCi0KLXN0YXRpYyBpbmxpbmUgaW50IF9fY29uc3RhbnRfdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgKnZhZGRyKQotewotCWNoYXIgKnAgPSAoY2hhciAqKXZhZGRyICsgKG5yIF4gMzEpIC8gODsKLQljaGFyIHJldHZhbDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgiYnNldCAlMiwlMTsgc25lICUwIgotCQkJOiAiPWQiIChyZXR2YWwpLCAiK20iICgqcCkKLQkJCTogImRpIiAobnIgJiA3KSk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBfX2dlbmVyaWNfdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgKnZhZGRyKQotewotCWNoYXIgcmV0dmFsOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZnNldCAlMnslMTojMX07IHNuZSAlMCIKLQkJCTogIj1kIiAocmV0dmFsKSA6ICJkIiAobnJeMzEpLCAibyIgKCp2YWRkcikgOiAibWVtb3J5Iik7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0jZGVmaW5lIHNldF9iaXQobnIsdmFkZHIpIFwKLSAgKF9fYnVpbHRpbl9jb25zdGFudF9wKG5yKSA/IFwKLSAgIF9fY29uc3RhbnRfc2V0X2JpdChuciwgdmFkZHIpIDogXAotICAgX19nZW5lcmljX3NldF9iaXQobnIsIHZhZGRyKSkKLQotI2RlZmluZSBfX3NldF9iaXQobnIsdmFkZHIpIHNldF9iaXQobnIsdmFkZHIpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NvbnN0YW50X3NldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2YWRkcikKLXsKLQljaGFyICpwID0gKGNoYXIgKil2YWRkciArIChuciBeIDMxKSAvIDg7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJic2V0ICUxLCUwIgotCQkJOiAiK20iICgqcCkgOiAiZGkiIChuciAmIDcpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fZ2VuZXJpY19zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdmFkZHIpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZnNldCAlMXslMDojMX0iCi0JCQk6IDogImQiIChucl4zMSksICJvIiAoKnZhZGRyKSA6ICJtZW1vcnkiKTsKLX0KLQotI2RlZmluZSB0ZXN0X2FuZF9jbGVhcl9iaXQobnIsdmFkZHIpIFwKLSAgKF9fYnVpbHRpbl9jb25zdGFudF9wKG5yKSA/IFwKLSAgIF9fY29uc3RhbnRfdGVzdF9hbmRfY2xlYXJfYml0KG5yLCB2YWRkcikgOiBcCi0gICBfX2dlbmVyaWNfdGVzdF9hbmRfY2xlYXJfYml0KG5yLCB2YWRkcikpCi0KLSNkZWZpbmUgX190ZXN0X2FuZF9jbGVhcl9iaXQobnIsdmFkZHIpIHRlc3RfYW5kX2NsZWFyX2JpdChucix2YWRkcikKLQotc3RhdGljIGlubGluZSBpbnQgX19jb25zdGFudF90ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLCB1bnNpZ25lZCBsb25nICp2YWRkcikKLXsKLQljaGFyICpwID0gKGNoYXIgKil2YWRkciArIChuciBeIDMxKSAvIDg7Ci0JY2hhciByZXR2YWw7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJjbHIgJTIsJTE7IHNuZSAlMCIKLQkJCTogIj1kIiAocmV0dmFsKSwgIittIiAoKnApCi0JCQk6ICJkaSIgKG5yICYgNykpOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgX19nZW5lcmljX3Rlc3RfYW5kX2NsZWFyX2JpdChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgKnZhZGRyKQotewotCWNoYXIgcmV0dmFsOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZmNsciAlMnslMTojMX07IHNuZSAlMCIKLQkJCTogIj1kIiAocmV0dmFsKSA6ICJkIiAobnJeMzEpLCAibyIgKCp2YWRkcikgOiAibWVtb3J5Iik7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKgotICogY2xlYXJfYml0KCkgZG9lc24ndCBwcm92aWRlIGFueSBiYXJyaWVyIGZvciB0aGUgY29tcGlsZXIuCi0gKi8KLSNkZWZpbmUgc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCkJYmFycmllcigpCi0KLSNkZWZpbmUgY2xlYXJfYml0KG5yLHZhZGRyKSBcCi0gIChfX2J1aWx0aW5fY29uc3RhbnRfcChucikgPyBcCi0gICBfX2NvbnN0YW50X2NsZWFyX2JpdChuciwgdmFkZHIpIDogXAotICAgX19nZW5lcmljX2NsZWFyX2JpdChuciwgdmFkZHIpKQotI2RlZmluZSBfX2NsZWFyX2JpdChucix2YWRkcikgY2xlYXJfYml0KG5yLHZhZGRyKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jb25zdGFudF9jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2YWRkcikKLXsKLQljaGFyICpwID0gKGNoYXIgKil2YWRkciArIChuciBeIDMxKSAvIDg7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiY2xyICUxLCUwIgotCQkJOiAiK20iICgqcCkgOiAiZGkiIChuciAmIDcpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fZ2VuZXJpY19jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2YWRkcikKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJmY2xyICUxeyUwOiMxfSIKLQkJCTogOiAiZCIgKG5yXjMxKSwgIm8iICgqdmFkZHIpIDogIm1lbW9yeSIpOwotfQotCi0jZGVmaW5lIHRlc3RfYW5kX2NoYW5nZV9iaXQobnIsdmFkZHIpIFwKLSAgKF9fYnVpbHRpbl9jb25zdGFudF9wKG5yKSA/IFwKLSAgIF9fY29uc3RhbnRfdGVzdF9hbmRfY2hhbmdlX2JpdChuciwgdmFkZHIpIDogXAotICAgX19nZW5lcmljX3Rlc3RfYW5kX2NoYW5nZV9iaXQobnIsIHZhZGRyKSkKLQotI2RlZmluZSBfX3Rlc3RfYW5kX2NoYW5nZV9iaXQobnIsdmFkZHIpIHRlc3RfYW5kX2NoYW5nZV9iaXQobnIsdmFkZHIpCi0jZGVmaW5lIF9fY2hhbmdlX2JpdChucix2YWRkcikgY2hhbmdlX2JpdChucix2YWRkcikKLQotc3RhdGljIGlubGluZSBpbnQgX19jb25zdGFudF90ZXN0X2FuZF9jaGFuZ2VfYml0KGludCBuciwgdW5zaWduZWQgbG9uZyAqdmFkZHIpCi17Ci0JY2hhciAqcCA9IChjaGFyICopdmFkZHIgKyAobnIgXiAzMSkgLyA4OwotCWNoYXIgcmV0dmFsOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiY2hnICUyLCUxOyBzbmUgJTAiCi0JCQk6ICI9ZCIgKHJldHZhbCksICIrbSIgKCpwKQotCQkJOiAiZGkiIChuciAmIDcpKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IF9fZ2VuZXJpY190ZXN0X2FuZF9jaGFuZ2VfYml0KGludCBuciwgdW5zaWduZWQgbG9uZyAqdmFkZHIpCi17Ci0JY2hhciByZXR2YWw7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJmY2hnICUyeyUxOiMxfTsgc25lICUwIgotCQkJOiAiPWQiIChyZXR2YWwpIDogImQiIChucl4zMSksICJvIiAoKnZhZGRyKSA6ICJtZW1vcnkiKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLSNkZWZpbmUgY2hhbmdlX2JpdChucix2YWRkcikgXAotICAoX19idWlsdGluX2NvbnN0YW50X3AobnIpID8gXAotICAgX19jb25zdGFudF9jaGFuZ2VfYml0KG5yLCB2YWRkcikgOiBcCi0gICBfX2dlbmVyaWNfY2hhbmdlX2JpdChuciwgdmFkZHIpKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jb25zdGFudF9jaGFuZ2VfYml0KGludCBuciwgdW5zaWduZWQgbG9uZyAqdmFkZHIpCi17Ci0JY2hhciAqcCA9IChjaGFyICopdmFkZHIgKyAobnIgXiAzMSkgLyA4OwotCV9fYXNtX18gX192b2xhdGlsZV9fICgiYmNoZyAlMSwlMCIKLQkJCTogIittIiAoKnApIDogImRpIiAobnIgJiA3KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2dlbmVyaWNfY2hhbmdlX2JpdChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgKnZhZGRyKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fICgiYmZjaGcgJTF7JTA6IzF9IgotCQkJOiA6ICJkIiAobnJeMzEpLCAibyIgKCp2YWRkcikgOiAibWVtb3J5Iik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRlc3RfYml0KGludCBuciwgY29uc3QgdW5zaWduZWQgbG9uZyAqdmFkZHIpCi17Ci0JcmV0dXJuICh2YWRkcltuciA+PiA1XSAmICgxVUwgPDwgKG5yICYgMzEpKSkgIT0gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZmluZF9maXJzdF96ZXJvX2JpdChjb25zdCB1bnNpZ25lZCBsb25nICp2YWRkciwKLQkJCQkgICAgICB1bnNpZ25lZCBzaXplKQotewotCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnAgPSB2YWRkcjsKLQlpbnQgcmVzID0gMzI7Ci0JdW5zaWduZWQgaW50IHdvcmRzOwotCXVuc2lnbmVkIGxvbmcgbnVtOwotCi0JaWYgKCFzaXplKQotCQlyZXR1cm4gMDsKLQotCXdvcmRzID0gKHNpemUgKyAzMSkgPj4gNTsKLQl3aGlsZSAoIShudW0gPSB+KnArKykpIHsKLQkJaWYgKCEtLXdvcmRzKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZmZmbyAlMXsjMCwjMH0sJTAiCi0JCQkgICAgICA6ICI9ZCIgKHJlcykgOiAiZCIgKG51bSAmIC1udW0pKTsKLQlyZXMgXj0gMzE7Ci1vdXQ6Ci0JcmVzICs9ICgobG9uZylwIC0gKGxvbmcpdmFkZHIgLSA0KSAqIDg7Ci0JcmV0dXJuIHJlcyA8IHNpemUgPyByZXMgOiBzaXplOwotfQotI2RlZmluZSBmaW5kX2ZpcnN0X3plcm9fYml0IGZpbmRfZmlyc3RfemVyb19iaXQKLQotc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXh0X3plcm9fYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKnZhZGRyLCBpbnQgc2l6ZSwKLQkJCQkgICAgIGludCBvZmZzZXQpCi17Ci0JY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9IHZhZGRyICsgKG9mZnNldCA+PiA1KTsKLQlpbnQgYml0ID0gb2Zmc2V0ICYgMzFVTCwgcmVzOwotCi0JaWYgKG9mZnNldCA+PSBzaXplKQotCQlyZXR1cm4gc2l6ZTsKLQotCWlmIChiaXQpIHsKLQkJdW5zaWduZWQgbG9uZyBudW0gPSB+KnArKyAmICh+MFVMIDw8IGJpdCk7Ci0JCW9mZnNldCAtPSBiaXQ7Ci0KLQkJLyogTG9vayBmb3IgemVybyBpbiBmaXJzdCBsb25nd29yZCAqLwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJmZmZvICUxeyMwLCMwfSwlMCIKLQkJCQkgICAgICA6ICI9ZCIgKHJlcykgOiAiZCIgKG51bSAmIC1udW0pKTsKLQkJaWYgKHJlcyA8IDMyKSB7Ci0JCQlvZmZzZXQgKz0gcmVzIF4gMzE7Ci0JCQlyZXR1cm4gb2Zmc2V0IDwgc2l6ZSA/IG9mZnNldCA6IHNpemU7Ci0JCX0KLQkJb2Zmc2V0ICs9IDMyOwotCi0JCWlmIChvZmZzZXQgPj0gc2l6ZSkKLQkJCXJldHVybiBzaXplOwotCX0KLQkvKiBObyB6ZXJvIHlldCwgc2VhcmNoIHJlbWFpbmluZyBmdWxsIGJ5dGVzIGZvciBhIHplcm8gKi8KLQlyZXR1cm4gb2Zmc2V0ICsgZmluZF9maXJzdF96ZXJvX2JpdChwLCBzaXplIC0gb2Zmc2V0KTsKLX0KLSNkZWZpbmUgZmluZF9uZXh0X3plcm9fYml0IGZpbmRfbmV4dF96ZXJvX2JpdAotCi1zdGF0aWMgaW5saW5lIGludCBmaW5kX2ZpcnN0X2JpdChjb25zdCB1bnNpZ25lZCBsb25nICp2YWRkciwgdW5zaWduZWQgc2l6ZSkKLXsKLQljb25zdCB1bnNpZ25lZCBsb25nICpwID0gdmFkZHI7Ci0JaW50IHJlcyA9IDMyOwotCXVuc2lnbmVkIGludCB3b3JkczsKLQl1bnNpZ25lZCBsb25nIG51bTsKLQotCWlmICghc2l6ZSkKLQkJcmV0dXJuIDA7Ci0KLQl3b3JkcyA9IChzaXplICsgMzEpID4+IDU7Ci0Jd2hpbGUgKCEobnVtID0gKnArKykpIHsKLQkJaWYgKCEtLXdvcmRzKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiZmZmbyAlMXsjMCwjMH0sJTAiCi0JCQkgICAgICA6ICI9ZCIgKHJlcykgOiAiZCIgKG51bSAmIC1udW0pKTsKLQlyZXMgXj0gMzE7Ci1vdXQ6Ci0JcmVzICs9ICgobG9uZylwIC0gKGxvbmcpdmFkZHIgLSA0KSAqIDg7Ci0JcmV0dXJuIHJlcyA8IHNpemUgPyByZXMgOiBzaXplOwotfQotI2RlZmluZSBmaW5kX2ZpcnN0X2JpdCBmaW5kX2ZpcnN0X2JpdAotCi1zdGF0aWMgaW5saW5lIGludCBmaW5kX25leHRfYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKnZhZGRyLCBpbnQgc2l6ZSwKLQkJCQlpbnQgb2Zmc2V0KQotewotCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnAgPSB2YWRkciArIChvZmZzZXQgPj4gNSk7Ci0JaW50IGJpdCA9IG9mZnNldCAmIDMxVUwsIHJlczsKLQotCWlmIChvZmZzZXQgPj0gc2l6ZSkKLQkJcmV0dXJuIHNpemU7Ci0KLQlpZiAoYml0KSB7Ci0JCXVuc2lnbmVkIGxvbmcgbnVtID0gKnArKyAmICh+MFVMIDw8IGJpdCk7Ci0JCW9mZnNldCAtPSBiaXQ7Ci0KLQkJLyogTG9vayBmb3Igb25lIGluIGZpcnN0IGxvbmd3b3JkICovCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiYmZmZm8gJTF7IzAsIzB9LCUwIgotCQkJCSAgICAgIDogIj1kIiAocmVzKSA6ICJkIiAobnVtICYgLW51bSkpOwotCQlpZiAocmVzIDwgMzIpIHsKLQkJCW9mZnNldCArPSByZXMgXiAzMTsKLQkJCXJldHVybiBvZmZzZXQgPCBzaXplID8gb2Zmc2V0IDogc2l6ZTsKLQkJfQotCQlvZmZzZXQgKz0gMzI7Ci0KLQkJaWYgKG9mZnNldCA+PSBzaXplKQotCQkJcmV0dXJuIHNpemU7Ci0JfQotCS8qIE5vIG9uZSB5ZXQsIHNlYXJjaCByZW1haW5pbmcgZnVsbCBieXRlcyBmb3IgYSBvbmUgKi8KLQlyZXR1cm4gb2Zmc2V0ICsgZmluZF9maXJzdF9iaXQocCwgc2l6ZSAtIG9mZnNldCk7Ci19Ci0jZGVmaW5lIGZpbmRfbmV4dF9iaXQgZmluZF9uZXh0X2JpdAotCi0vKgotICogZmZ6ID0gRmluZCBGaXJzdCBaZXJvIGluIHdvcmQuIFVuZGVmaW5lZCBpZiBubyB6ZXJvIGV4aXN0cywKLSAqIHNvIGNvZGUgc2hvdWxkIGNoZWNrIGFnYWluc3QgfjBVTCBmaXJzdC4uCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmZnoodW5zaWduZWQgbG9uZyB3b3JkKQotewotCWludCByZXM7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJmZmZvICUxeyMwLCMwfSwlMCIKLQkJCSAgICAgIDogIj1kIiAocmVzKSA6ICJkIiAofndvcmQgJiAtfndvcmQpKTsKLQlyZXR1cm4gcmVzIF4gMzE7Ci19Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLS8qCi0gKiBmZnM6IGZpbmQgZmlyc3QgYml0IHNldC4gVGhpcyBpcyBkZWZpbmVkIHRoZSBzYW1lIHdheSBhcwotICogdGhlIGxpYmMgYW5kIGNvbXBpbGVyIGJ1aWx0aW4gZmZzIHJvdXRpbmVzLCB0aGVyZWZvcmUKLSAqIGRpZmZlcnMgaW4gc3Bpcml0IGZyb20gdGhlIGFib3ZlIGZmeiAobWFuIGZmcykuCi0gKi8KLQotc3RhdGljIGlubGluZSBpbnQgZmZzKGludCB4KQotewotCWludCBjbnQ7Ci0KLQlhc20gKCJiZmZmbyAlMXsjMDojMH0sJTAiIDogIj1kIiAoY250KSA6ICJkbSIgKHggJiAteCkpOwotCi0JcmV0dXJuIDMyIC0gY250OwotfQotI2RlZmluZSBfX2Zmcyh4KSAoZmZzKHgpIC0gMSkKLQotLyoKLSAqIGZsczogZmluZCBsYXN0IGJpdCBzZXQuCi0gKi8KLQotc3RhdGljIGlubGluZSBpbnQgZmxzKGludCB4KQotewotCWludCBjbnQ7Ci0KLQlhc20gKCJiZmZmbyAlMXsjMCwjMH0sJTAiIDogIj1kIiAoY250KSA6ICJkbSIgKHgpKTsKLQotCXJldHVybiAzMiAtIGNudDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgX19mbHMoaW50IHgpCi17Ci0JcmV0dXJuIGZscyh4KSAtIDE7Ci19Ci0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmxzNjQuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvaHdlaWdodC5oPgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9sb2NrLmg+Ci0KLS8qIEJpdG1hcCBmdW5jdGlvbnMgZm9yIHRoZSBsaXR0bGUgZW5kaWFuIGJpdG1hcC4gKi8KLQotc3RhdGljIGlubGluZSB2b2lkIF9fc2V0X2JpdF9sZShpbnQgbnIsIHZvaWQgKmFkZHIpCi17Ci0JX19zZXRfYml0KG5yIF4gMjQsIGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jbGVhcl9iaXRfbGUoaW50IG5yLCB2b2lkICphZGRyKQotewotCV9fY2xlYXJfYml0KG5yIF4gMjQsIGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX3NldF9iaXRfbGUoaW50IG5yLCB2b2lkICphZGRyKQotewotCXJldHVybiBfX3Rlc3RfYW5kX3NldF9iaXQobnIgXiAyNCwgYWRkcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRlc3RfYW5kX3NldF9iaXRfbGUoaW50IG5yLCB2b2lkICphZGRyKQotewotCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KG5yIF4gMjQsIGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX2NsZWFyX2JpdF9sZShpbnQgbnIsIHZvaWQgKmFkZHIpCi17Ci0JcmV0dXJuIF9fdGVzdF9hbmRfY2xlYXJfYml0KG5yIF4gMjQsIGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9jbGVhcl9iaXRfbGUoaW50IG5yLCB2b2lkICphZGRyKQotewotCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQobnIgXiAyNCwgYWRkcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRlc3RfYml0X2xlKGludCBuciwgY29uc3Qgdm9pZCAqdmFkZHIpCi17Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHZhZGRyOwotCXJldHVybiAocFtuciA+PiAzXSAmICgxVSA8PCAobnIgJiA3KSkpICE9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGZpbmRfZmlyc3RfemVyb19iaXRfbGUoY29uc3Qgdm9pZCAqdmFkZHIsIHVuc2lnbmVkIHNpemUpCi17Ci0JY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9IHZhZGRyLCAqYWRkciA9IHZhZGRyOwotCWludCByZXMgPSAwOwotCXVuc2lnbmVkIGludCB3b3JkczsKLQotCWlmICghc2l6ZSkKLQkJcmV0dXJuIDA7Ci0KLQl3b3JkcyA9IChzaXplID4+IDUpICsgKChzaXplICYgMzEpID4gMCk7Ci0Jd2hpbGUgKCpwKysgPT0gfjBVTCkgewotCQlpZiAoLS13b3JkcyA9PSAwKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JLS1wOwotCWZvciAocmVzID0gMDsgcmVzIDwgMzI7IHJlcysrKQotCQlpZiAoIXRlc3RfYml0X2xlKHJlcywgcCkpCi0JCQlicmVhazsKLW91dDoKLQlyZXMgKz0gKHAgLSBhZGRyKSAqIDMyOwotCXJldHVybiByZXMgPCBzaXplID8gcmVzIDogc2l6ZTsKLX0KLSNkZWZpbmUgZmluZF9maXJzdF96ZXJvX2JpdF9sZSBmaW5kX2ZpcnN0X3plcm9fYml0X2xlCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmaW5kX25leHRfemVyb19iaXRfbGUoY29uc3Qgdm9pZCAqYWRkciwKLQkJdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQljb25zdCB1bnNpZ25lZCBsb25nICpwID0gYWRkcjsKLQlpbnQgYml0ID0gb2Zmc2V0ICYgMzFVTCwgcmVzOwotCi0JaWYgKG9mZnNldCA+PSBzaXplKQotCQlyZXR1cm4gc2l6ZTsKLQotCXAgKz0gb2Zmc2V0ID4+IDU7Ci0KLQlpZiAoYml0KSB7Ci0JCW9mZnNldCAtPSBiaXQ7Ci0JCS8qIExvb2sgZm9yIHplcm8gaW4gZmlyc3QgbG9uZ3dvcmQgKi8KLQkJZm9yIChyZXMgPSBiaXQ7IHJlcyA8IDMyOyByZXMrKykKLQkJCWlmICghdGVzdF9iaXRfbGUocmVzLCBwKSkgewotCQkJCW9mZnNldCArPSByZXM7Ci0JCQkJcmV0dXJuIG9mZnNldCA8IHNpemUgPyBvZmZzZXQgOiBzaXplOwotCQkJfQotCQlwKys7Ci0JCW9mZnNldCArPSAzMjsKLQotCQlpZiAob2Zmc2V0ID49IHNpemUpCi0JCQlyZXR1cm4gc2l6ZTsKLQl9Ci0JLyogTm8gemVybyB5ZXQsIHNlYXJjaCByZW1haW5pbmcgZnVsbCBieXRlcyBmb3IgYSB6ZXJvICovCi0JcmV0dXJuIG9mZnNldCArIGZpbmRfZmlyc3RfemVyb19iaXRfbGUocCwgc2l6ZSAtIG9mZnNldCk7Ci19Ci0jZGVmaW5lIGZpbmRfbmV4dF96ZXJvX2JpdF9sZSBmaW5kX25leHRfemVyb19iaXRfbGUKLQotc3RhdGljIGlubGluZSBpbnQgZmluZF9maXJzdF9iaXRfbGUoY29uc3Qgdm9pZCAqdmFkZHIsIHVuc2lnbmVkIHNpemUpCi17Ci0JY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9IHZhZGRyLCAqYWRkciA9IHZhZGRyOwotCWludCByZXMgPSAwOwotCXVuc2lnbmVkIGludCB3b3JkczsKLQotCWlmICghc2l6ZSkKLQkJcmV0dXJuIDA7Ci0KLQl3b3JkcyA9IChzaXplID4+IDUpICsgKChzaXplICYgMzEpID4gMCk7Ci0Jd2hpbGUgKCpwKysgPT0gMFVMKSB7Ci0JCWlmICgtLXdvcmRzID09IDApCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQktLXA7Ci0JZm9yIChyZXMgPSAwOyByZXMgPCAzMjsgcmVzKyspCi0JCWlmICh0ZXN0X2JpdF9sZShyZXMsIHApKQotCQkJYnJlYWs7Ci1vdXQ6Ci0JcmVzICs9IChwIC0gYWRkcikgKiAzMjsKLQlyZXR1cm4gcmVzIDwgc2l6ZSA/IHJlcyA6IHNpemU7Ci19Ci0jZGVmaW5lIGZpbmRfZmlyc3RfYml0X2xlIGZpbmRfZmlyc3RfYml0X2xlCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmaW5kX25leHRfYml0X2xlKGNvbnN0IHZvaWQgKmFkZHIsCi0JCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9IGFkZHI7Ci0JaW50IGJpdCA9IG9mZnNldCAmIDMxVUwsIHJlczsKLQotCWlmIChvZmZzZXQgPj0gc2l6ZSkKLQkJcmV0dXJuIHNpemU7Ci0KLQlwICs9IG9mZnNldCA+PiA1OwotCi0JaWYgKGJpdCkgewotCQlvZmZzZXQgLT0gYml0OwotCQkvKiBMb29rIGZvciBvbmUgaW4gZmlyc3QgbG9uZ3dvcmQgKi8KLQkJZm9yIChyZXMgPSBiaXQ7IHJlcyA8IDMyOyByZXMrKykKLQkJCWlmICh0ZXN0X2JpdF9sZShyZXMsIHApKSB7Ci0JCQkJb2Zmc2V0ICs9IHJlczsKLQkJCQlyZXR1cm4gb2Zmc2V0IDwgc2l6ZSA/IG9mZnNldCA6IHNpemU7Ci0JCQl9Ci0JCXArKzsKLQkJb2Zmc2V0ICs9IDMyOwotCi0JCWlmIChvZmZzZXQgPj0gc2l6ZSkKLQkJCXJldHVybiBzaXplOwotCX0KLQkvKiBObyBzZXQgYml0IHlldCwgc2VhcmNoIHJlbWFpbmluZyBmdWxsIGJ5dGVzIGZvciBhIHNldCBiaXQgKi8KLQlyZXR1cm4gb2Zmc2V0ICsgZmluZF9maXJzdF9iaXRfbGUocCwgc2l6ZSAtIG9mZnNldCk7Ci19Ci0jZGVmaW5lIGZpbmRfbmV4dF9iaXRfbGUgZmluZF9uZXh0X2JpdF9sZQotCi0vKiBCaXRtYXAgZnVuY3Rpb25zIGZvciB0aGUgZXh0MiBmaWxlc3lzdGVtLiAqLwotCi0jZGVmaW5lIGV4dDJfc2V0X2JpdF9hdG9taWMobG9jaywgbnIsIGFkZHIpCVwKLQl0ZXN0X2FuZF9zZXRfYml0X2xlKG5yLCBhZGRyKQotI2RlZmluZSBleHQyX2NsZWFyX2JpdF9hdG9taWMobG9jaywgbnIsIGFkZHIpCVwKLQl0ZXN0X2FuZF9jbGVhcl9iaXRfbGUobnIsIGFkZHIpCi0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNlbmRpZiAvKiBfTTY4S19CSVRPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2JpdG9wc19uby5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2JpdG9wc19uby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmU4NWFjLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9iaXRvcHNfbm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0jaWZuZGVmIF9NNjhLTk9NTVVfQklUT1BTX0gKLSNkZWZpbmUgX002OEtOT01NVV9CSVRPUFNfSAotCi0vKgotICogQ29weXJpZ2h0IDE5OTIsIExpbnVzIFRvcnZhbGRzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JLyogc3dhYjMyICovCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpZm5kZWYgX0xJTlVYX0JJVE9QU19ICi0jZXJyb3Igb25seSA8bGludXgvYml0b3BzLmg+IGNhbiBiZSBpbmNsdWRlZCBkaXJlY3RseQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX21jZmlzYWFwbHVzX18pIHx8IGRlZmluZWQgKF9fbWNmaXNhY19fKQotc3RhdGljIGlubGluZSBpbnQgZmZzKHVuc2lnbmVkIGludCB2YWwpCi17Ci0gICAgICAgIGlmICghdmFsKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGFzbSB2b2xhdGlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJiaXRyZXYgJTBcblx0IgotICAgICAgICAgICAgICAgICAgICAgICAgImZmMSAlMFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICAgICA6ICI9ZCIgKHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiICh2YWwpCi0JCSAgICApOwotICAgICAgICB2YWwrKzsKLSAgICAgICAgcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgX19mZnModW5zaWduZWQgaW50IHZhbCkKLXsKLSAgICAgICAgYXNtIHZvbGF0aWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgImJpdHJldiAlMFxuXHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZmYxICUwXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIDogIj1kIiAodmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgOiAiMCIgKHZhbCkKLQkJICAgICk7Ci0gICAgICAgIHJldHVybiB2YWw7Ci19Ci0KLSNlbHNlCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2Zmcy5oPgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9fX2Zmcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmZ6Lmg+Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKiBhZGRyKQotewotI2lmZGVmIENPTkZJR19DT0xERklSRQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibGVhICUwLCUlYTA7IGJzZXQgJTEsKCUlYTApIgotCSAgICAgOiAiK20iICgoKHZvbGF0aWxlIGNoYXIgKilhZGRyKVsobnJeMzEpID4+IDNdKQotCSAgICAgOiAiZCIgKG5yKQotCSAgICAgOiAiJWEwIiwgImNjIik7Ci0jZWxzZQotCV9fYXNtX18gX192b2xhdGlsZV9fICgiYnNldCAlMSwlMCIKLQkgICAgIDogIittIiAoKCh2b2xhdGlsZSBjaGFyICopYWRkcilbKG5yXjMxKSA+PiAzXSkKLQkgICAgIDogImRpIiAobnIpCi0JICAgICA6ICJjYyIpOwotI2VuZGlmCi19Ci0KLSNkZWZpbmUgX19zZXRfYml0KG5yLCBhZGRyKSBzZXRfYml0KG5yLCBhZGRyKQotCi0vKgotICogY2xlYXJfYml0KCkgZG9lc24ndCBwcm92aWRlIGFueSBiYXJyaWVyIGZvciB0aGUgY29tcGlsZXIuCi0gKi8KLSNkZWZpbmUgc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCkJYmFycmllcigpCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqIGFkZHIpCi17Ci0jaWZkZWYgQ09ORklHX0NPTERGSVJFCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsZWEgJTAsJSVhMDsgYmNsciAlMSwoJSVhMCkiCi0JICAgICA6ICIrbSIgKCgodm9sYXRpbGUgY2hhciAqKWFkZHIpWyhucl4zMSkgPj4gM10pCi0JICAgICA6ICJkIiAobnIpCi0JICAgICA6ICIlYTAiLCAiY2MiKTsKLSNlbHNlCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJiY2xyICUxLCUwIgotCSAgICAgOiAiK20iICgoKHZvbGF0aWxlIGNoYXIgKilhZGRyKVsobnJeMzEpID4+IDNdKQotCSAgICAgOiAiZGkiIChucikKLQkgICAgIDogImNjIik7Ci0jZW5kaWYKLX0KLQotI2RlZmluZSBfX2NsZWFyX2JpdChuciwgYWRkcikgY2xlYXJfYml0KG5yLCBhZGRyKQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICogYWRkcikKLXsKLSNpZmRlZiBDT05GSUdfQ09MREZJUkUKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxlYSAlMCwlJWEwOyBiY2hnICUxLCglJWEwKSIKLQkgICAgIDogIittIiAoKCh2b2xhdGlsZSBjaGFyICopYWRkcilbKG5yXjMxKSA+PiAzXSkKLQkgICAgIDogImQiIChucikKLQkgICAgIDogIiVhMCIsICJjYyIpOwotI2Vsc2UKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJjaGcgJTEsJTAiCi0JICAgICA6ICIrbSIgKCgodm9sYXRpbGUgY2hhciAqKWFkZHIpWyhucl4zMSkgPj4gM10pCi0JICAgICA6ICJkaSIgKG5yKQotCSAgICAgOiAiY2MiKTsKLSNlbmRpZgotfQotCi0jZGVmaW5lIF9fY2hhbmdlX2JpdChuciwgYWRkcikgY2hhbmdlX2JpdChuciwgYWRkcikKLQotc3RhdGljIF9faW5saW5lX18gaW50IHRlc3RfYW5kX3NldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICogYWRkcikKLXsKLQljaGFyIHJldHZhbDsKLQotI2lmZGVmIENPTkZJR19DT0xERklSRQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibGVhICUxLCUlYTA7IGJzZXQgJTIsKCUlYTApOyBzbmUgJTAiCi0JICAgICA6ICI9ZCIgKHJldHZhbCksICIrbSIgKCgodm9sYXRpbGUgY2hhciAqKWFkZHIpWyhucl4zMSkgPj4gM10pCi0JICAgICA6ICJkIiAobnIpCi0JICAgICA6ICIlYTAiKTsKLSNlbHNlCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJic2V0ICUyLCUxOyBzbmUgJTAiCi0JICAgICA6ICI9ZCIgKHJldHZhbCksICIrbSIgKCgodm9sYXRpbGUgY2hhciAqKWFkZHIpWyhucl4zMSkgPj4gM10pCi0JICAgICA6ICJkaSIgKG5yKQotCSAgICAgLyogTm8gY2xvYmJlciAqLyk7Ci0jZW5kaWYKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLSNkZWZpbmUgX190ZXN0X2FuZF9zZXRfYml0KG5yLCBhZGRyKSB0ZXN0X2FuZF9zZXRfYml0KG5yLCBhZGRyKQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqIGFkZHIpCi17Ci0JY2hhciByZXR2YWw7Ci0KLSNpZmRlZiBDT05GSUdfQ09MREZJUkUKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxlYSAlMSwlJWEwOyBiY2xyICUyLCglJWEwKTsgc25lICUwIgotCSAgICAgOiAiPWQiIChyZXR2YWwpLCAiK20iICgoKHZvbGF0aWxlIGNoYXIgKilhZGRyKVsobnJeMzEpID4+IDNdKQotCSAgICAgOiAiZCIgKG5yKQotCSAgICAgOiAiJWEwIik7Ci0jZWxzZQotCV9fYXNtX18gX192b2xhdGlsZV9fICgiYmNsciAlMiwlMTsgc25lICUwIgotCSAgICAgOiAiPWQiIChyZXR2YWwpLCAiK20iICgoKHZvbGF0aWxlIGNoYXIgKilhZGRyKVsobnJeMzEpID4+IDNdKQotCSAgICAgOiAiZGkiIChucikKLQkgICAgIC8qIE5vIGNsb2JiZXIgKi8pOwotI2VuZGlmCi0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0jZGVmaW5lIF9fdGVzdF9hbmRfY2xlYXJfYml0KG5yLCBhZGRyKSB0ZXN0X2FuZF9jbGVhcl9iaXQobnIsIGFkZHIpCi0KLXN0YXRpYyBfX2lubGluZV9fIGludCB0ZXN0X2FuZF9jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqIGFkZHIpCi17Ci0JY2hhciByZXR2YWw7Ci0KLSNpZmRlZiBDT05GSUdfQ09MREZJUkUKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxlYSAlMSwlJWEwXG5cdGJjaGcgJTIsKCUlYTApXG5cdHNuZSAlMCIKLQkgICAgIDogIj1kIiAocmV0dmFsKSwgIittIiAoKCh2b2xhdGlsZSBjaGFyICopYWRkcilbKG5yXjMxKSA+PiAzXSkKLQkgICAgIDogImQiIChucikKLQkgICAgIDogIiVhMCIpOwotI2Vsc2UKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJjaGcgJTIsJTE7IHNuZSAlMCIKLQkgICAgIDogIj1kIiAocmV0dmFsKSwgIittIiAoKCh2b2xhdGlsZSBjaGFyICopYWRkcilbKG5yXjMxKSA+PiAzXSkKLQkgICAgIDogImRpIiAobnIpCi0JICAgICAvKiBObyBjbG9iYmVyICovKTsKLSNlbmRpZgotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotI2RlZmluZSBfX3Rlc3RfYW5kX2NoYW5nZV9iaXQobnIsIGFkZHIpIHRlc3RfYW5kX2NoYW5nZV9iaXQobnIsIGFkZHIpCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgZG9lc24ndCBuZWVkIHRvIGJlIGF0b21pYy4KLSAqLwotc3RhdGljIF9faW5saW5lX18gaW50IF9fY29uc3RhbnRfdGVzdF9iaXQoaW50IG5yLCBjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICogYWRkcikKLXsKLQlyZXR1cm4gKCgxVUwgPDwgKG5yICYgMzEpKSAmICgoKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSBhZGRyKVtuciA+PiA1XSkpICE9IDA7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCBfX3Rlc3RfYml0KGludCBuciwgY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqIGFkZHIpCi17Ci0JaW50IAkqIGEgPSAoaW50ICopIGFkZHI7Ci0JaW50CW1hc2s7Ci0KLQlhICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMHgxZik7Ci0JcmV0dXJuICgobWFzayAmICphKSAhPSAwKTsKLX0KLQotI2RlZmluZSB0ZXN0X2JpdChucixhZGRyKSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AobnIpID8gXAotIF9fY29uc3RhbnRfdGVzdF9iaXQoKG5yKSwoYWRkcikpIDogXAotIF9fdGVzdF9iaXQoKG5yKSwoYWRkcikpKQotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2ZpbmQuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvaHdlaWdodC5oPgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9sb2NrLmg+Ci0KLSNkZWZpbmUgQklUT1BfTEVfU1dJWlpMRQkoKEJJVFNfUEVSX0xPTkctMSkgJiB+MHg3KQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfYml0X2xlKGludCBuciwgdm9pZCAqYWRkcikKLXsKLQlfX3NldF9iaXQobnIgXiBCSVRPUF9MRV9TV0laWkxFLCBhZGRyKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fY2xlYXJfYml0X2xlKGludCBuciwgdm9pZCAqYWRkcikKLXsKLQlfX2NsZWFyX2JpdChuciBeIEJJVE9QX0xFX1NXSVpaTEUsIGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX3NldF9iaXRfbGUoaW50IG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQotewotCWNoYXIgcmV0dmFsOwotCi0jaWZkZWYgQ09ORklHX0NPTERGSVJFCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsZWEgJTEsJSVhMDsgYnNldCAlMiwoJSVhMCk7IHNuZSAlMCIKLQkgICAgIDogIj1kIiAocmV0dmFsKSwgIittIiAoKCh2b2xhdGlsZSBjaGFyICopYWRkcilbbnIgPj4gM10pCi0JICAgICA6ICJkIiAobnIpCi0JICAgICA6ICIlYTAiKTsKLSNlbHNlCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJic2V0ICUyLCUxOyBzbmUgJTAiCi0JICAgICA6ICI9ZCIgKHJldHZhbCksICIrbSIgKCgodm9sYXRpbGUgY2hhciAqKWFkZHIpW25yID4+IDNdKQotCSAgICAgOiAiZGkiIChucikKLQkgICAgIC8qIE5vIGNsb2JiZXIgKi8pOwotI2VuZGlmCi0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX2NsZWFyX2JpdF9sZShpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCi17Ci0JY2hhciByZXR2YWw7Ci0KLSNpZmRlZiBDT05GSUdfQ09MREZJUkUKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxlYSAlMSwlJWEwOyBiY2xyICUyLCglJWEwKTsgc25lICUwIgotCSAgICAgOiAiPWQiIChyZXR2YWwpLCAiK20iICgoKHZvbGF0aWxlIGNoYXIgKilhZGRyKVtuciA+PiAzXSkKLQkgICAgIDogImQiIChucikKLQkgICAgIDogIiVhMCIpOwotI2Vsc2UKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJjbHIgJTIsJTE7IHNuZSAlMCIKLQkgICAgIDogIj1kIiAocmV0dmFsKSwgIittIiAoKCh2b2xhdGlsZSBjaGFyICopYWRkcilbbnIgPj4gM10pCi0JICAgICA6ICJkaSIgKG5yKQotCSAgICAgLyogTm8gY2xvYmJlciAqLyk7Ci0jZW5kaWYKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZXh0Mi1hdG9taWMuaD4KLQotc3RhdGljIGlubGluZSBpbnQgdGVzdF9iaXRfbGUoaW50IG5yLCBjb25zdCB2b2xhdGlsZSB2b2lkICphZGRyKQotewotCWNoYXIgcmV0dmFsOwotCi0jaWZkZWYgQ09ORklHX0NPTERGSVJFCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsZWEgJTEsJSVhMDsgYnRzdCAlMiwoJSVhMCk7IHNuZSAlMCIKLQkgICAgIDogIj1kIiAocmV0dmFsKQotCSAgICAgOiAibSIgKCgoY29uc3Qgdm9sYXRpbGUgY2hhciAqKWFkZHIpW25yID4+IDNdKSwgImQiIChucikKLQkgICAgIDogIiVhMCIpOwotI2Vsc2UKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImJ0c3QgJTIsJTE7IHNuZSAlMCIKLQkgICAgIDogIj1kIiAocmV0dmFsKQotCSAgICAgOiAibSIgKCgoY29uc3Qgdm9sYXRpbGUgY2hhciAqKWFkZHIpW25yID4+IDNdKSwgImRpIiAobnIpCi0JICAgICAvKiBObyBjbG9iYmVyICovKTsKLSNlbmRpZgotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotI2RlZmluZSBmaW5kX2ZpcnN0X3plcm9fYml0X2xlKGFkZHIsIHNpemUpCVwKLQlmaW5kX25leHRfemVyb19iaXRfbGUoKGFkZHIpLCAoc2l6ZSksIDApCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmaW5kX25leHRfemVyb19iaXRfbGUodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQl1bnNpZ25lZCBsb25nICpwID0gKCh1bnNpZ25lZCBsb25nICopIGFkZHIpICsgKG9mZnNldCA+PiA1KTsKLQl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IG9mZnNldCAmIH4zMVVMOwotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JaWYgKG9mZnNldCA+PSBzaXplKQotCQlyZXR1cm4gc2l6ZTsKLQlzaXplIC09IHJlc3VsdDsKLQlvZmZzZXQgJj0gMzFVTDsKLQlpZihvZmZzZXQpIHsKLQkJLyogV2UgaG9sZCB0aGUgbGl0dGxlIGVuZGlhbiB2YWx1ZSBpbiB0bXAsIGJ1dCB0aGVuIHRoZQotCQkgKiBzaGlmdCBpcyBpbGxlZ2FsLiBTbyB3ZSBjb3VsZCBrZWVwIGEgYmlnIGVuZGlhbiB2YWx1ZQotCQkgKiBpbiB0bXAsIGxpa2UgdGhpczoKLQkJICoKLQkJICogdG1wID0gX19zd2FiMzIoKihwKyspKTsKLQkJICogdG1wIHw9IH4wVUwgPj4gKDMyLW9mZnNldCk7Ci0JCSAqCi0JCSAqIGJ1dCB0aGlzIHdvdWxkIGRlY3JlYXNlIHBlcmZvcm1hbmNlLCBzbyB3ZSBjaGFuZ2UgdGhlCi0JCSAqIHNoaWZ0OgotCQkgKi8KLQkJdG1wID0gKihwKyspOwotCQl0bXAgfD0gX19zd2FiMzIofjBVTCA+PiAoMzItb2Zmc2V0KSk7Ci0JCWlmKHNpemUgPCAzMikKLQkJCWdvdG8gZm91bmRfZmlyc3Q7Ci0JCWlmKH50bXApCi0JCQlnb3RvIGZvdW5kX21pZGRsZTsKLQkJc2l6ZSAtPSAzMjsKLQkJcmVzdWx0ICs9IDMyOwotCX0KLQl3aGlsZShzaXplICYgfjMxVUwpIHsKLQkJaWYofih0bXAgPSAqKHArKykpKQotCQkJZ290byBmb3VuZF9taWRkbGU7Ci0JCXJlc3VsdCArPSAzMjsKLQkJc2l6ZSAtPSAzMjsKLQl9Ci0JaWYoIXNpemUpCi0JCXJldHVybiByZXN1bHQ7Ci0JdG1wID0gKnA7Ci0KLWZvdW5kX2ZpcnN0OgotCS8qIHRtcCBpcyBsaXR0bGUgZW5kaWFuLCBzbyB3ZSB3b3VsZCBoYXZlIHRvIHN3YWIgdGhlIHNoaWZ0LAotCSAqIHNlZSBhYm92ZS4gQnV0IHRoZW4gd2UgaGF2ZSB0byBzd2FiIHRtcCBiZWxvdyBmb3IgZmZ6LCBzbwotCSAqIHdlIG1pZ2h0IGFzIHdlbGwgZG8gdGhpcyBoZXJlLgotCSAqLwotCXJldHVybiByZXN1bHQgKyBmZnooX19zd2FiMzIodG1wKSB8ICh+MFVMIDw8IHNpemUpKTsKLWZvdW5kX21pZGRsZToKLQlyZXR1cm4gcmVzdWx0ICsgZmZ6KF9fc3dhYjMyKHRtcCkpOwotfQotI2RlZmluZSBmaW5kX25leHRfemVyb19iaXRfbGUgZmluZF9uZXh0X3plcm9fYml0X2xlCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGZpbmRfbmV4dF9iaXRfbGUoY29uc3Qgdm9pZCAqYWRkciwKLQkJdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIG9mZnNldCk7Ci0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmxzLmg+Ci0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL19fZmxzLmg+Ci0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2ZsczY0Lmg+Ci0KLSNlbmRpZiAvKiBfTTY4S05PTU1VX0JJVE9QU19IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vZGVsYXkuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9kZWxheS5oCmluZGV4IGQyNTk4ZTMuLjljMDliZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9kZWxheS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9kZWxheS5oCkBAIC0xLDUgKzEsOTYgQEAKLSNpZmRlZiBfX3VDbGludXhfXwotI2luY2x1ZGUgImRlbGF5X25vLmgiCisjaWZuZGVmIF9NNjhLX0RFTEFZX0gKKyNkZWZpbmUgX002OEtfREVMQVlfSAorCisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgSGFtaXNoIE1hY2RvbmFsZAorICogQ29weXJpZ2h0IChDKSAyMDA0IEdyZWcgVW5nZXJlciA8Z2VyZ0B1Y2xpbnV4LmNvbT4KKyAqCisgKiBEZWxheSByb3V0aW5lcywgdXNpbmcgYSBwcmUtY29tcHV0ZWQgImxvb3BzX3Blcl9qaWZmeSIgdmFsdWUuCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0NPTERGSVJFKQorLyoKKyAqIFRoZSBDb2xkRmlyZSBydW5zIHRoZSBkZWxheSBsb29wIGF0IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IHNwZWVkcworICogZGVwZW5kaW5nIHVwb24gbG9uZyB3b3JkIGFsaWdubWVudCBvciBub3QuICBXZSdsbCBwYWQgaXQgdG8KKyAqIGxvbmcgd29yZCBhbGlnbm1lbnQgd2hpY2ggaXMgdGhlIGZhc3RlciB2ZXJzaW9uLgorICogVGhlIDB4NGE4ZSBpcyBvZiBjb3Vyc2UgYSAndHN0bCAlZnAnIGluc3RydWN0aW9uLiAgVGhpcyBpcyBiZXR0ZXIKKyAqIHRoYW4gdXNpbmcgYSBOT1AgKDB4NGU3MSkgaW5zdHJ1Y3Rpb24gYmVjYXVzZSBpdCBleGVjdXRlcyBpbiBvbmUKKyAqIGN5Y2xlIG5vdCB0aHJlZSBhbmQgZG9lc24ndCBhbGxvdyBmb3IgYW4gYXJiaXRyYXJ5IGRlbGF5IHdhaXRpbmcKKyAqIGZvciBidXMgY3ljbGVzIHRvIGZpbmlzaC4gIEFsc28gZnAvYTYgaXNuJ3QgbGlrZWx5IHRvIGNhdXNlIGEKKyAqIHN0YWxsIHdhaXRpbmcgZm9yIHRoZSByZWdpc3RlciB0byBiZWNvbWUgdmFsaWQgaWYgc3VjaCBpcyBhZGRlZAorICogdG8gdGhlIGNvbGRmaXJlIGF0IHNvbWUgc3RhZ2UuCisgKi8KKyNkZWZpbmUJREVMQVlfQUxJR04JIi5iYWxpZ253IDQsIDB4NGE4ZVxuXHQiCiAjZWxzZQotI2luY2x1ZGUgImRlbGF5X21tLmgiCisvKgorICogTm8gaW5zdHJ1Y3Rpb24gYWxpZ25tZW50IHJlcXVpcmVkIGZvciBvdGhlciBtNjhrIHR5cGVzLgorICovCisjZGVmaW5lCURFTEFZX0FMSUdOCiAjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIF9fZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCURFTEFZX0FMSUdOCisJCSIxOiBzdWJxbCAjMSwlMFxuXHQiCisJCSJqY2MgMWIiCisJCTogIj1kIiAobG9vcHMpCisJCTogIjAiIChsb29wcykpOworfQorCitleHRlcm4gdm9pZCBfX2JhZF91ZGVsYXkodm9pZCk7CisKKworI2lmIGRlZmluZWQoQ09ORklHX002ODAwMCkgfHwgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCisvKgorICogVGhlIHNpbXBsZXIgbTY4ayBhbmQgQ29sZEZpcmUgcHJvY2Vzc29ycyBkbyBub3QgaGF2ZSBhIDMyKjMyLT42NAorICogbXVsdGlwbHkgaW5zdHJ1Y3Rpb24uIFNvIHdlIG5lZWQgdG8gaGFuZGxlIHRoZW0gYSBsaXR0bGUgZGlmZmVyZW50bHkuCisgKiBXZSB1c2UgYSBiaXQgb2Ygc2hpZnRpbmcgYW5kIGEgc2luZ2xlIDMyKjMyLT4zMiBtdWx0aXBseSB0byBnZXQgY2xvc2UuCisgKiBUaGlzIGlzIGEgbWFjcm8gc28gdGhhdCB0aGUgY29uc3QgdmVyc2lvbiBjYW4gZmFjdG9yIG91dCB0aGUgZmlyc3QKKyAqIG11bHRpcGx5IGFuZCBzaGlmdC4KKyAqLworI2RlZmluZQlIWlNDQUxFCQkoMjY4NDM1NDU2IC8gKDEwMDAwMDAgLyBIWikpCisKKyNkZWZpbmUJX19jb25zdF91ZGVsYXkodSkgXAorCV9fZGVsYXkoKCgoKHUpICogSFpTQ0FMRSkgPj4gMTEpICogKGxvb3BzX3Blcl9qaWZmeSA+PiAxMSkpID4+IDYpCisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3hkZWxheSh1bnNpZ25lZCBsb25nIHhsb29wcykKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCV9fYXNtX18gKCJtdWx1bCAlMiwlMDolMSIKKwkJOiAiPWQiICh4bG9vcHMpLCAiPWQiICh0bXApCisJCTogImQiICh4bG9vcHMpLCAiMSIgKGxvb3BzX3Blcl9qaWZmeSkpOworCV9fZGVsYXkoeGxvb3BzICogSFopOworfQorCisvKgorICogVGhlIGRlZmluaXRpb24gb2YgX19jb25zdF91ZGVsYXkgaXMgc3BlY2lmaWNhbGx5IG1hZGUgYSBtYWNybyBzbyB0aGF0CisgKiB0aGUgY29uc3QgZmFjdG9yICg0Mjk1ID0gMioqMzIgLyAxMDAwMDAwKSBjYW4gYmUgb3B0aW1pemVkIG91dCB3aGVuCisgKiB0aGUgZGVsYXkgaXMgYSBjb25zdC4KKyAqLworI2RlZmluZQlfX2NvbnN0X3VkZWxheShuKQkoX194ZGVsYXkoKG4pICogNDI5NSkpCisKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKK3sKKwlfX2NvbnN0X3VkZWxheSh1c2Vjcyk7Cit9CisKKy8qCisgKiBVc2Ugb25seSBmb3IgdmVyeSBzbWFsbCBkZWxheXMgKCA8IDEgbXNlYykuICBTaG91bGQgcHJvYmFibHkgdXNlIGEKKyAqIGxvb2t1cCB0YWJsZSwgcmVhbGx5LCBhcyB0aGUgbXVsdGlwbGljYXRpb25zIHRha2UgbXVjaCB0b28gbG9uZyB3aXRoCisgKiBzaG9ydCBkZWxheXMuICBUaGlzIGlzIGEgInJlYXNvbmFibGUiIGltcGxlbWVudGF0aW9uLCB0aG91Z2ggKGFuZCB0aGUKKyAqIGZpcnN0IGNvbnN0YW50IG11bHRpcGxpY2F0aW9ucyBnZXRzIG9wdGltaXplZCBhd2F5IGlmIHRoZSBkZWxheSBpcworICogYSBjb25zdGFudCkKKyAqLworI2RlZmluZSB1ZGVsYXkobikgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8gXAorCSgobikgPiAyMDAwMCA/IF9fYmFkX3VkZWxheSgpIDogX19jb25zdF91ZGVsYXkobikpIDogX191ZGVsYXkobikpCisKKworI2VuZGlmIC8qIGRlZmluZWQoX002OEtfREVMQVlfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9kZWxheV9tbS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2RlbGF5X21tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDkyODUuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2RlbGF5X21tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jaWZuZGVmIF9NNjhLX0RFTEFZX0gKLSNkZWZpbmUgX002OEtfREVMQVlfSAotCi0jaW5jbHVkZSA8YXNtL3BhcmFtLmg+Ci0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQgSGFtaXNoIE1hY2RvbmFsZAotICoKLSAqIERlbGF5IHJvdXRpbmVzLCB1c2luZyBhIHByZS1jb21wdXRlZCAibG9vcHNfcGVyX2ppZmZ5IiB2YWx1ZS4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fICgiMTogc3VicWwgIzEsJTA7IGpjYyAxYiIKLQkJOiAiPWQiIChsb29wcykgOiAiMCIgKGxvb3BzKSk7Ci19Ci0KLWV4dGVybiB2b2lkIF9fYmFkX3VkZWxheSh2b2lkKTsKLQotLyoKLSAqIFVzZSBvbmx5IGZvciB2ZXJ5IHNtYWxsIGRlbGF5cyAoIDwgMSBtc2VjKS4gIFNob3VsZCBwcm9iYWJseSB1c2UgYQotICogbG9va3VwIHRhYmxlLCByZWFsbHksIGFzIHRoZSBtdWx0aXBsaWNhdGlvbnMgdGFrZSBtdWNoIHRvbyBsb25nIHdpdGgKLSAqIHNob3J0IGRlbGF5cy4gIFRoaXMgaXMgYSAicmVhc29uYWJsZSIgaW1wbGVtZW50YXRpb24sIHRob3VnaCAoYW5kIHRoZQotICogZmlyc3QgY29uc3RhbnQgbXVsdGlwbGljYXRpb25zIGdldHMgb3B0aW1pemVkIGF3YXkgaWYgdGhlIGRlbGF5IGlzCi0gKiBhIGNvbnN0YW50KQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB4bG9vcHMpCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlfX2FzbV9fICgibXVsdWwgJTIsJTA6JTEiCi0JCTogIj1kIiAoeGxvb3BzKSwgIj1kIiAodG1wKQotCQk6ICJkIiAoeGxvb3BzKSwgIjEiIChsb29wc19wZXJfamlmZnkpKTsKLQlfX2RlbGF5KHhsb29wcyAqIEhaKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCi17Ci0JX19jb25zdF91ZGVsYXkodXNlY3MgKiA0Mjk1KTsJLyogMioqMzIgLyAxMDAwMDAwICovCi19Ci0KLSNkZWZpbmUgdWRlbGF5KG4pIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKLQkoKG4pID4gMjAwMDAgPyBfX2JhZF91ZGVsYXkoKSA6IF9fY29uc3RfdWRlbGF5KChuKSAqIDQyOTUpKSA6IFwKLQlfX3VkZWxheShuKSkKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG11bGRpdih1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYiwKLQkJCQkgICB1bnNpZ25lZCBsb25nIGMpCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlfX2FzbV9fICgibXVsdWwgJTIsJTA6JTE7IGRpdnVsICUzLCUwOiUxIgotCQk6ICI9ZCIgKHRtcCksICI9ZCIgKGEpCi0JCTogImQiIChiKSwgImQiIChjKSwgIjEiIChhKSk7Ci0JcmV0dXJuIGE7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkKF9NNjhLX0RFTEFZX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vZGVsYXlfbm8uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9kZWxheV9uby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2EwZWRjLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9kZWxheV9uby5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotI2lmbmRlZiBfTTY4S05PTU1VX0RFTEFZX0gKLSNkZWZpbmUgX002OEtOT01NVV9ERUxBWV9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQgSGFtaXNoIE1hY2RvbmFsZAotICogQ29weXJpZ2h0IChDKSAyMDA0IEdyZWcgVW5nZXJlciA8Z2VyZ0BzbmFwZ2Vhci5jb20+Ci0gKi8KLQotI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQotewotI2lmIGRlZmluZWQoQ09ORklHX0NPTERGSVJFKQotCS8qIFRoZSBjb2xkZmlyZSBydW5zIHRoaXMgbG9vcCBhdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBzcGVlZHMKLQkgKiBkZXBlbmRpbmcgdXBvbiBsb25nIHdvcmQgYWxpZ25tZW50IG9yIG5vdC4gIFdlJ2xsIHBhZCBpdCB0bwotCSAqIGxvbmcgd29yZCBhbGlnbm1lbnQgd2hpY2ggaXMgdGhlIGZhc3RlciB2ZXJzaW9uLgotCSAqIFRoZSAweDRhOGUgaXMgb2YgY291cnNlIGEgJ3RzdGwgJWZwJyBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgYmV0dGVyCi0JICogdGhhbiB1c2luZyBhIE5PUCAoMHg0ZTcxKSBpbnN0cnVjdGlvbiBiZWNhdXNlIGl0IGV4ZWN1dGVzIGluIG9uZQotCSAqIGN5Y2xlIG5vdCB0aHJlZSBhbmQgZG9lc24ndCBhbGxvdyBmb3IgYW4gYXJiaXRyYXJ5IGRlbGF5IHdhaXRpbmcKLQkgKiBmb3IgYnVzIGN5Y2xlcyB0byBmaW5pc2guICBBbHNvIGZwL2E2IGlzbid0IGxpa2VseSB0byBjYXVzZSBhCi0JICogc3RhbGwgd2FpdGluZyBmb3IgdGhlIHJlZ2lzdGVyIHRvIGJlY29tZSB2YWxpZCBpZiBzdWNoIGlzIGFkZGVkCi0JICogdG8gdGhlIGNvbGRmaXJlIGF0IHNvbWUgc3RhZ2UuCi0JICovCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAkiLmJhbGlnbncgNCwgMHg0YThlXG5cdCIKLQkJCQkiMTogc3VicWwgIzEsICUwXG5cdCIKLQkJCQkiamNjIDFiIgotCQk6ICI9ZCIgKGxvb3BzKSA6ICIwIiAobG9vcHMpKTsKLSNlbHNlCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAkiMTogc3VicWwgIzEsICUwXG5cdCIKLQkJCQkiamNjIDFiIgotCQk6ICI9ZCIgKGxvb3BzKSA6ICIwIiAobG9vcHMpKTsKLSNlbmRpZgotfQotCi0vKgotICoJSWRlYWxseSB3ZSB1c2UgYSAzMiozMi0+NjQgbXVsdGlwbHkgdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YKLSAqCWxvb3AgaXRlcmF0aW9ucywgYnV0IHRoZSBvbGRlciBzdGFuZGFyZCA2OGsgYW5kIENvbGRGaXJlIGRvIG5vdAotICoJaGF2ZSB0aGlzIGluc3RydWN0aW9uLiBTbyBmb3IgdGhlbSB3ZSBoYXZlIGEgY2xzb2UgYXBwcm94aW1hdGlvbgotICoJbG9vcCB1c2luZyAzMiozMi0+MzIgbXVsdGlwbGllcyBvbmx5LiBUaGlzIGNhbGN1bGF0aW9uIGJhc2VkIG9uCi0gKgl0aGUgQVJNIHZlcnNpb24gb2YgZGVsYXkuCi0gKgotICoJV2Ugd2FudCB0byBpbXBsZW1lbnQ6Ci0gKgotICoJbG9vcHMgPSAodXNlY3MgKiAweDEwYzYgKiBIWiAqIGxvb3BzX3Blcl9qaWZmeSkgLyAyXjMyCi0gKi8KLQotI2RlZmluZQlIWlNDQUxFCQkoMjY4NDM1NDU2IC8gKDEwMDAwMDAvSFopKQotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfTTY4MzI4KSB8fCBkZWZpbmVkKENPTkZJR19NNjhFWjMyOCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX002OFZaMzI4KSB8fCBkZWZpbmVkKENPTkZJR19NNjgzNjApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKLQlfX2RlbGF5KCgoKHVzZWNzICogSFpTQ0FMRSkgPj4gMTEpICogKGxvb3BzX3Blcl9qaWZmeSA+PiAxMSkpID4+IDYpOwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCXVzZWNzICo9IDQyOTU7CQkvKiAyKiozMiAvIDEwMDAwMDAgKi8KLQlfX2FzbV9fICgibXVsdWwgJTIsJTA6JTEiCi0JCTogIj1kIiAodXNlY3MpLCAiPWQiICh0bXApCi0JCTogImQiICh1c2VjcyksICIxIiAobG9vcHNfcGVyX2ppZmZ5KkhaKSk7Ci0JX19kZWxheSh1c2Vjcyk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqCU1vdmVkIHRoZSB1ZGVsYXkoKSBmdW5jdGlvbiBpbnRvIGxpYnJhcnkgY29kZSwgbm8gbG9uZ2VyIGlubGluZWQuCi0gKglJIGhhZCB0byBjaGFuZ2UgdGhlIGFsZ29yaXRobSBiZWNhdXNlIHdlIGFyZSBvdmVyZmxvd2luZyBub3cgb24KLSAqCXRoZSBmYXN0ZXIgQ29sZEZpcmUgcGFydHMuIFRoZSBjb2RlIGlzIGEgbGl0dGxlIGJpZ2dlciwgc28gaXQgbWFrZXMKLSAqCXNlbnNlIHRvIGxpYnJhcnkgaXQuCi0gKi8KLWV4dGVybiB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKLQotI2VuZGlmIC8qIGRlZmluZWQoX002OEtOT01NVV9ERUxBWV9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2VudHJ5X25vLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vZW50cnlfbm8uaAppbmRleCA2MjdkNjliLi42ODYxMWUzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vZW50cnlfbm8uaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vZW50cnlfbm8uaApAQCAtOTYsMTEgKzk2LDExIEBACiAuZW5kbQogCiAubWFjcm8gUkRVU1AKLQltb3ZlbAlzd191c3AsJWEyCisJbW92ZWwJc3dfdXNwLCVhMwogLmVuZG0KIAogLm1hY3JvIFdSVVNQCi0JbW92ZWwJJWEwLHN3X3VzcAorCW1vdmVsCSVhMyxzd191c3AKIC5lbmRtCiAKICNlbHNlIC8qICFDT05GSUdfQ09MREZJUkVfU1dfQTcgKi8KQEAgLTEyNywxMyArMTI3LDEzIEBACiAuZW5kbQogCiAubWFjcm8gUkRVU1AKLQkvKm1vdmUJJXVzcCwlYTIqLwotCS53b3JkCTB4NGU2YQorCS8qbW92ZQkldXNwLCVhMyovCisJLndvcmQJMHg0ZTZiCiAuZW5kbQogCiAubWFjcm8gV1JVU1AKLQkvKm1vdmUJJWEwLCV1c3AqLwotCS53b3JkCTB4NGU2MAorCS8qbW92ZQklYTMsJXVzcCovCisJLndvcmQJMHg0ZTYzCiAuZW5kbQogCiAjZW5kaWYgLyogIUNPTkZJR19DT0xERklSRV9TV19BNyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKaW5kZXggNTZkMGQ1ZC4uODcwZTUzNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2hhcmRpcnEuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vaGFyZGlycS5oCkBAIC0xLDUgKzEsMzQgQEAKLSNpZmRlZiBfX3VDbGludXhfXwotI2luY2x1ZGUgImhhcmRpcnFfbm8uaCIKKyNpZm5kZWYgX19NNjhLX0hBUkRJUlFfSAorI2RlZmluZSBfX002OEtfSEFSRElSUV9ICisKKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNkZWZpbmUgSEFSRElSUV9CSVRTCTgKKworLyoKKyAqIFRoZSBoYXJkaXJxIG1hc2sgaGFzIHRvIGJlIGxhcmdlIGVub3VnaCB0byBoYXZlCisgKiBzcGFjZSBmb3IgcG90ZW50aWFsbHkgYWxsIElSUSBzb3VyY2VzIGluIHRoZSBzeXN0ZW0KKyAqIG5lc3Rpbmcgb24gYSBzaW5nbGUgQ1BVOgorICovCisjaWYgKDEgPDwgSEFSRElSUV9CSVRTKSA8IE5SX0lSUVMKKyMgZXJyb3IgSEFSRElSUV9CSVRTIGlzIHRvbyBsb3chCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTVUKKworLyogZW50cnkuUyBpcyBzZW5zaXRpdmUgdG8gdGhlIG9mZnNldHMgb2YgdGhlc2UgZmllbGRzICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IF9fc29mdGlycV9wZW5kaW5nOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQgaXJxX2NwdXN0YXRfdDsKKworI2luY2x1ZGUgPGxpbnV4L2lycV9jcHVzdGF0Lmg+CS8qIFN0YW5kYXJkIG1hcHBpbmdzIGZvciBpcnFfY3B1c3RhdF90IGFib3ZlICovCisKICNlbHNlCi0jaW5jbHVkZSAiaGFyZGlycV9tbS5oIgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaGFyZGlycS5oPgorCisjZW5kaWYgLyogIUNPTkZJR19NTVUgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vaGFyZGlycV9tbS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2hhcmRpcnFfbW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0ZWU5NC4uMDAwMDAwMAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vaGFyZGlycV9tbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI2lmbmRlZiBfX002OEtfSEFSRElSUV9ICi0jZGVmaW5lIF9fTTY4S19IQVJESVJRX0gKLQotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgotCi0vKiBlbnRyeS5TIGlzIHNlbnNpdGl2ZSB0byB0aGUgb2Zmc2V0cyBvZiB0aGVzZSBmaWVsZHMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQgX19zb2Z0aXJxX3BlbmRpbmc7Ci19IF9fX19jYWNoZWxpbmVfYWxpZ25lZCBpcnFfY3B1c3RhdF90OwotCi0jaW5jbHVkZSA8bGludXgvaXJxX2NwdXN0YXQuaD4JLyogU3RhbmRhcmQgbWFwcGluZ3MgZm9yIGlycV9jcHVzdGF0X3QgYWJvdmUgKi8KLQotI2RlZmluZSBIQVJESVJRX0JJVFMJOAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9oYXJkaXJxX25vLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vaGFyZGlycV9uby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRiMTRiLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9oYXJkaXJxX25vLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jaWZuZGVmIF9fTTY4S19IQVJESVJRX0gKLSNkZWZpbmUgX19NNjhLX0hBUkRJUlFfSAotCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jZGVmaW5lIEhBUkRJUlFfQklUUwk4Ci0KLS8qCi0gKiBUaGUgaGFyZGlycSBtYXNrIGhhcyB0byBiZSBsYXJnZSBlbm91Z2ggdG8gaGF2ZQotICogc3BhY2UgZm9yIHBvdGVudGlhbGx5IGFsbCBJUlEgc291cmNlcyBpbiB0aGUgc3lzdGVtCi0gKiBuZXN0aW5nIG9uIGEgc2luZ2xlIENQVToKLSAqLwotI2lmICgxIDw8IEhBUkRJUlFfQklUUykgPCBOUl9JUlFTCi0jIGVycm9yIEhBUkRJUlFfQklUUyBpcyB0b28gbG93IQotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9oYXJkaXJxLmg+Ci0KLSNlbmRpZiAvKiBfX002OEtfSEFSRElSUV9IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggOTA3ZWZmMS4uNjllZDBkNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vaXJxLmgKQEAgLTMzLDE1ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdHlwZXMuaD4KIAogLyoKLSAqIFRoZSBoYXJkaXJxIG1hc2sgaGFzIHRvIGJlIGxhcmdlIGVub3VnaCB0byBoYXZlCi0gKiBzcGFjZSBmb3IgcG90ZW50aWFsbHkgYWxsIElSUSBzb3VyY2VzIGluIHRoZSBzeXN0ZW0KLSAqIG5lc3Rpbmcgb24gYSBzaW5nbGUgQ1BVOgotICovCi0jaWYgKDEgPDwgSEFSRElSUV9CSVRTKSA8IE5SX0lSUVMKLSMgZXJyb3IgSEFSRElSUV9CSVRTIGlzIHRvbyBsb3chCi0jZW5kaWYKLQotLyoKICAqIEludGVycnVwdCBzb3VyY2UgZGVmaW5pdGlvbnMKICAqIEdlbmVyYWwgaW50ZXJydXB0IHNvdXJjZXMgYXJlIHRoZSBsZXZlbCAxLTcuCiAgKiBBZGRpbmcgYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3Igb25lIG9mIHRoZXNlIHNvdXJjZXMKQEAgLTEzMSw0ICsxMjIsNiBAQAogI2RlZmluZSBpcnFfY2Fub25pY2FsaXplKGlycSkgIChpcnEpCiAjZW5kaWYgLyogQ09ORklHX01NVSAqLwogCithc21saW5rYWdlIHZvaWQgZG9fSVJRKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKwogI2VuZGlmIC8qIF9NNjhLX0lSUV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21hY2hkZXAuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKaW5kZXggNDE1ZDU0OC4uNzg5ZjNiMiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21hY2hkZXAuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbWFjaGRlcC5oCkBAIC00MCw2ICs0MCw1IEBACiBleHRlcm4gaXJxcmV0dXJuX3QgYXJjaF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXkpOwogCiBleHRlcm4gdm9pZCBjb25maWdfQlNQKGNoYXIgKmNvbW1hbmQsIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgZG9fSVJRKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCk7CiAKICNlbmRpZiAvKiBfTTY4S19NQUNIREVQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tb2R1bGUuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tb2R1bGUuaAppbmRleCA1ZjIxZTExLi5lZGZmZTY2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbW9kdWxlLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21vZHVsZS5oCkBAIC0xLDE4ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9NNjhLX01PRFVMRV9ICiAjZGVmaW5lIF9BU01fTTY4S19NT0RVTEVfSAogCi0jaWZkZWYgQ09ORklHX01NVQotCi1zdHJ1Y3QgbW9kX2FyY2hfc3BlY2lmaWMgewotCXN0cnVjdCBtNjhrX2ZpeHVwX2luZm8gKmZpeHVwX3N0YXJ0LCAqZml4dXBfZW5kOwotfTsKLQotI2RlZmluZSBNT0RVTEVfQVJDSF9JTklUIHsJCQkJXAotCS5maXh1cF9zdGFydAkJPSBfX3N0YXJ0X2ZpeHVwLAlcCi0JLmZpeHVwX2VuZAkJPSBfX3N0b3BfZml4dXAsCQlcCi19Ci0KLQogZW51bSBtNjhrX2ZpeHVwX3R5cGUgewogCW02OGtfZml4dXBfbWVtb2Zmc2V0LAogCW02OGtfZml4dXBfdm5vZGVfc2hpZnQsCkBAIC0yMywyNCArMTEsMzEgQEAKIAl2b2lkICphZGRyOwogfTsKIAorc3RydWN0IG1vZF9hcmNoX3NwZWNpZmljIHsKKwlzdHJ1Y3QgbTY4a19maXh1cF9pbmZvICpmaXh1cF9zdGFydCwgKmZpeHVwX2VuZDsKK307CisKKyNpZmRlZiBDT05GSUdfTU1VCisKKyNkZWZpbmUgTU9EVUxFX0FSQ0hfSU5JVCB7CQkJCVwKKwkuZml4dXBfc3RhcnQJCT0gX19zdGFydF9maXh1cCwJXAorCS5maXh1cF9lbmQJCT0gX19zdG9wX2ZpeHVwLAkJXAorfQorCisKICNkZWZpbmUgbTY4a19maXh1cCh0eXBlLCBhZGRyKQkJCVwKIAkiCS5zZWN0aW9uIFwiLm02OGtfZml4dXBcIixcImF3XCJcbiIJXAogCSIJLmxvbmcgIiAjdHlwZSAiLCIgI2FkZHIgIlxuIglcCiAJIgkucHJldmlvdXNcbiIKIAorI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KKwogZXh0ZXJuIHN0cnVjdCBtNjhrX2ZpeHVwX2luZm8gX19zdGFydF9maXh1cFtdLCBfX3N0b3BfZml4dXBbXTsKIAogc3RydWN0IG1vZHVsZTsKIGV4dGVybiB2b2lkIG1vZHVsZV9maXh1cChzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBtNjhrX2ZpeHVwX2luZm8gKnN0YXJ0LAogCQkJIHN0cnVjdCBtNjhrX2ZpeHVwX2luZm8gKmVuZCk7CiAKLSNlbHNlCi0KLXN0cnVjdCBtb2RfYXJjaF9zcGVjaWZpYyB7Ci19OwotCi0jZW5kaWYgLyogQ09ORklHX01NVSAqLwotCiAjZGVmaW5lIEVsZl9TaGRyIEVsZjMyX1NoZHIKICNkZWZpbmUgRWxmX1N5bSBFbGYzMl9TeW0KICNkZWZpbmUgRWxmX0VoZHIgRWxmMzJfRWhkcgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IGYxMTFiMDIuLmQ4ZWY1M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTEwNSw5ICsxMDUsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHVuc2lnbmVkIGxvbmcgcGMsCiAJCQkJdW5zaWduZWQgbG9uZyB1c3ApCiB7Ci0JLyogcmVhZHMgZnJvbSB1c2VyIHNwYWNlICovCi0Jc2V0X2ZzKFVTRVJfRFMpOwotCiAJcmVncy0+cGMgPSBwYzsKIAlyZWdzLT5zciAmPSB+MHgyMDAwOwogCXdydXNwKHVzcCk7CkBAIC0xMjksNyArMTI2LDYgQEAKIAogI2RlZmluZSBzdGFydF90aHJlYWQoX3JlZ3MsIF9wYywgX3VzcCkgICAgICAgICAgICAgICAgICBcCiBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlzZXRfZnMoVVNFUl9EUyk7IC8qIHJlYWRzIGZyb20gdXNlciBzcGFjZSAqLyAgICBcCiAJKF9yZWdzKS0+cGMgPSAoX3BjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCSgoc3RydWN0IHN3aXRjaF9zdGFjayAqKShfcmVncykpWy0xXS5hNiA9IDA7ICAgIFwKIAlyZWZvcm1hdChfcmVncyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vc2lnbmFsLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vc2lnbmFsLmgKaW5kZXggNWJjMDljNy4uNjBlODg2NiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3NpZ25hbC5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zaWduYWwuaApAQCAtMTUwLDcgKzE1MCw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CiAKLSNpZm5kZWYgX191Q2xpbnV4X18KKyNpZm5kZWYgQ09ORklHX0NQVV9IQVNfTk9fQklURklFTERTCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1NJR19CSVRPUFMKIAogc3RhdGljIGlubGluZSB2b2lkIHNpZ2FkZHNldChzaWdzZXRfdCAqc2V0LCBpbnQgX3NpZykKQEAgLTE5OSwxNSArMTk5LDE0IEBACiAJcmV0dXJuIHdvcmQgXiAzMTsKIH0KIAorI2VuZGlmIC8qICFDT05GSUdfQ1BVX0hBU19OT19CSVRGSUVMRFMgKi8KKworI2lmZGVmIF9fdUNsaW51eF9fCisjZGVmaW5lIHB0cmFjZV9zaWduYWxfZGVsaXZlcihyZWdzLCBjb29raWUpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbHNlCiBzdHJ1Y3QgcHRfcmVnczsKIGV4dGVybiB2b2lkIHB0cmFjZV9zaWduYWxfZGVsaXZlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdm9pZCAqY29va2llKTsKLQotI2Vsc2UKLQotI3VuZGVmIF9fSEFWRV9BUkNIX1NJR19CSVRPUFMKLSNkZWZpbmUgcHRyYWNlX3NpZ25hbF9kZWxpdmVyKHJlZ3MsIGNvb2tpZSkgZG8geyB9IHdoaWxlICgwKQotCiAjZW5kaWYgLyogX191Q2xpbnV4X18gKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX002OEtfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCBjY2VhOTI1Li40N2IwMWY0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC0xLDUgKzEsMTkzIEBACi0jaWZkZWYgX191Q2xpbnV4X18KLSNpbmNsdWRlICJzeXN0ZW1fbm8uaCIKKyNpZm5kZWYgX002OEtfU1lTVEVNX0gKKyNkZWZpbmUgX002OEtfU1lTVEVNX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL2VudHJ5Lmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qCisgKiBzd2l0Y2hfdG8obikgc2hvdWxkIHN3aXRjaCB0YXNrcyB0byB0YXNrIHB0ciwgZmlyc3QgY2hlY2tpbmcgdGhhdAorICogcHRyIGlzbid0IHRoZSBjdXJyZW50IHRhc2ssIGluIHdoaWNoIGNhc2UgaXQgZG9lcyBub3RoaW5nLiAgVGhpcworICogYWxzbyBjbGVhcnMgdGhlIFRTLWZsYWcgaWYgdGhlIHRhc2sgd2Ugc3dpdGNoZWQgdG8gaGFzIHVzZWQgdGhlCisgKiBtYXRoIGNvLXByb2Nlc3NvciBsYXRlc3QuCisgKi8KKy8qCisgKiBzd2l0Y2hfdG8oKSBzYXZlcyB0aGUgZXh0cmEgcmVnaXN0ZXJzLCB0aGF0IGFyZSBub3Qgc2F2ZWQKKyAqIGF1dG9tYXRpY2FsbHkgYnkgU0FWRV9TV0lUQ0hfU1RBQ0sgaW4gcmVzdW1lKCksIGllLiBkMC1kNSBhbmQKKyAqIGEwLWExLiBTb21lIG9mIHRoZXNlIGFyZSB1c2VkIGJ5IHNjaGVkdWxlKCkgYW5kIGl0cyBwcmVkZWNlc3NvcnMKKyAqIGFuZCBzbyB3ZSBtaWdodCBnZXQgc2VlIHVuZXhwZWN0ZWQgYmVoYXZpb3JzIHdoZW4gYSB0YXNrIHJldHVybnMKKyAqIHdpdGggdW5leHBlY3RlZCByZWdpc3RlciB2YWx1ZXMuCisgKgorICogc3lzY2FsbCBzdG9yZXMgdGhlc2UgcmVnaXN0ZXJzIGl0c2VsZiBhbmQgbm9uZSBvZiB0aGVtIGFyZSB1c2VkCisgKiBieSBzeXNjYWxsIGFmdGVyIHRoZSBmdW5jdGlvbiBpbiB0aGUgc3lzY2FsbCBoYXMgYmVlbiBjYWxsZWQuCisgKgorICogQmV3YXJlIHRoYXQgcmVzdW1lIG5vdyBleHBlY3RzICpuZXh0IHRvIGJlIGluIGQxIGFuZCB0aGUgb2Zmc2V0IG9mCisgKiB0c3MgdG8gYmUgaW4gYTEuIFRoaXMgc2F2ZXMgYSBmZXcgaW5zdHJ1Y3Rpb25zIGFzIHdlIG5vIGxvbmdlciBoYXZlCisgKiB0byBwdXNoIHRoZW0gb250byB0aGUgc3RhY2sgYW5kIHJlYWQgdGhlbSBiYWNrIHJpZ2h0IGFmdGVyLgorICoKKyAqIDAyLzE3Lzk2IC0gSmVzIFNvcmVuc2VuIChqZHNAa29tLmF1Yy5kaykKKyAqCisgKiBDaGFuZ2VkIDk2LzA5LzE5IGJ5IEFuZHJlYXMgU2Nod2FiCisgKiBwYXNzIHByZXYgaW4gYTAsIG5leHQgaW4gYTEKKyAqLworYXNtbGlua2FnZSB2b2lkIHJlc3VtZSh2b2lkKTsKKyNkZWZpbmUgc3dpdGNoX3RvKHByZXYsbmV4dCxsYXN0KSBkbyB7IFwKKyAgcmVnaXN0ZXIgdm9pZCAqX3ByZXYgX19hc21fXyAoImEwIikgPSAocHJldik7IFwKKyAgcmVnaXN0ZXIgdm9pZCAqX25leHQgX19hc21fXyAoImExIikgPSAobmV4dCk7IFwKKyAgcmVnaXN0ZXIgdm9pZCAqX2xhc3QgX19hc21fXyAoImQxIik7IFwKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oImpic3IgcmVzdW1lIiBcCisJCSAgICAgICA6ICI9YSIgKF9wcmV2KSwgIj1hIiAoX25leHQpLCAiPWQiIChfbGFzdCkgXAorCQkgICAgICAgOiAiMCIgKF9wcmV2KSwgIjEiIChfbmV4dCkgXAorCQkgICAgICAgOiAiZDAiLCAiZDIiLCAiZDMiLCAiZDQiLCAiZDUiKTsgXAorICAobGFzdCkgPSBfbGFzdDsgXAorfSB3aGlsZSAoMCkKKworCisvKgorICogRm9yY2Ugc3RyaWN0IENQVSBvcmRlcmluZy4KKyAqIE5vdCByZWFsbHkgcmVxdWlyZWQgb24gbTY4ay4uLgorICovCisjZGVmaW5lIG5vcCgpCQlkbyB7IGFzbSB2b2xhdGlsZSAoIm5vcCIpOyBiYXJyaWVyKCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIG1iKCkJCWJhcnJpZXIoKQorI2RlZmluZSBybWIoKQkJYmFycmllcigpCisjZGVmaW5lIHdtYigpCQliYXJyaWVyKCkKKyNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQkoKHZvaWQpMCkKKyNkZWZpbmUgc2V0X21iKHZhciwgdmFsdWUpCSh7ICh2YXIpID0gKHZhbHVlKTsgd21iKCk7IH0pCisKKyNkZWZpbmUgc21wX21iKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX3dtYigpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQkoKHZvaWQpMCkKKworI2RlZmluZSB4Y2hnKHB0cix4KSAoKF9fdHlwZW9mX18oKihwdHIpKSlfX3hjaGcoKHVuc2lnbmVkIGxvbmcpKHgpLChwdHIpLHNpemVvZigqKHB0cikpKSkKKworc3RydWN0IF9feGNoZ19kdW1teSB7IHVuc2lnbmVkIGxvbmcgYVsxMDBdOyB9OworI2RlZmluZSBfX3hnKHgpICgodm9sYXRpbGUgc3RydWN0IF9feGNoZ19kdW1teSAqKSh4KSkKKworI2lmbmRlZiBDT05GSUdfUk1XX0lOU05TCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX194Y2hnKHVuc2lnbmVkIGxvbmcgeCwgdm9sYXRpbGUgdm9pZCAqIHB0ciwgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgdG1wOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOgorCQl0bXAgPSAqKHU4ICopcHRyOworCQkqKHU4ICopcHRyID0geDsKKwkJeCA9IHRtcDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0bXAgPSAqKHUxNiAqKXB0cjsKKwkJKih1MTYgKilwdHIgPSB4OworCQl4ID0gdG1wOworCQlicmVhazsKKwljYXNlIDQ6CisJCXRtcCA9ICoodTMyICopcHRyOworCQkqKHUzMiAqKXB0ciA9IHg7CisJCXggPSB0bXA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4geDsKK30KICNlbHNlCi0jaW5jbHVkZSAic3lzdGVtX21tLmgiCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX194Y2hnKHVuc2lnbmVkIGxvbmcgeCwgdm9sYXRpbGUgdm9pZCAqIHB0ciwgaW50IHNpemUpCit7CisJc3dpdGNoIChzaXplKSB7CisJICAgIGNhc2UgMToKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18KKwkJCSgibW92ZWIgJTIsJTBcblx0IgorCQkJICIxOlxuXHQiCisJCQkgImNhc2IgJTAsJTEsJTJcblx0IgorCQkJICJqbmUgMWIiCisJCQkgOiAiPSZkIiAoeCkgOiAiZCIgKHgpLCAibSIgKCpfX3hnKHB0cikpIDogIm1lbW9yeSIpOworCQlicmVhazsKKwkgICAgY2FzZSAyOgorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXworCQkJKCJtb3ZldyAlMiwlMFxuXHQiCisJCQkgIjE6XG5cdCIKKwkJCSAiY2FzdyAlMCwlMSwlMlxuXHQiCisJCQkgImpuZSAxYiIKKwkJCSA6ICI9JmQiICh4KSA6ICJkIiAoeCksICJtIiAoKl9feGcocHRyKSkgOiAibWVtb3J5Iik7CisJCWJyZWFrOworCSAgICBjYXNlIDQ6CisJCV9fYXNtX18gX192b2xhdGlsZV9fCisJCQkoIm1vdmVsICUyLCUwXG5cdCIKKwkJCSAiMTpcblx0IgorCQkJICJjYXNsICUwLCUxLCUyXG5cdCIKKwkJCSAiam5lIDFiIgorCQkJIDogIj0mZCIgKHgpIDogImQiICh4KSwgIm0iICgqX194ZyhwdHIpKSA6ICJtZW1vcnkiKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiB4OworfQogI2VuZGlmCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLWxvY2FsLmg+CisKKyNkZWZpbmUgY21weGNoZzY0X2xvY2FsKHB0ciwgbywgbikgX19jbXB4Y2hnNjRfbG9jYWxfZ2VuZXJpYygocHRyKSwgKG8pLCAobikpCisKKy8qCisgKiBBdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UuICBDb21wYXJlIE9MRCB3aXRoIE1FTSwgaWYgaWRlbnRpY2FsLAorICogc3RvcmUgTkVXIGluIE1FTS4gIFJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZSBpbiBNRU0uICBTdWNjZXNzIGlzCisgKiBpbmRpY2F0ZWQgYnkgY29tcGFyaW5nIFJFVFVSTiB3aXRoIE9MRC4KKyAqLworI2lmZGVmIENPTkZJR19STVdfSU5TTlMKKyNkZWZpbmUgX19IQVZFX0FSQ0hfQ01QWENIRwkxCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NtcHhjaGcodm9sYXRpbGUgdm9pZCAqcCwgdW5zaWduZWQgbG9uZyBvbGQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBuZXcsIGludCBzaXplKQoreworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjYXNiICUwLCUyLCUxIgorCQkJCSAgICAgIDogIj1kIiAob2xkKSwgIj1tIiAoKihjaGFyICopcCkKKwkJCQkgICAgICA6ICJkIiAobmV3KSwgIjAiIChvbGQpLCAibSIgKCooY2hhciAqKXApKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNhc3cgJTAsJTIsJTEiCisJCQkJICAgICAgOiAiPWQiIChvbGQpLCAiPW0iICgqKHNob3J0ICopcCkKKwkJCQkgICAgICA6ICJkIiAobmV3KSwgIjAiIChvbGQpLCAibSIgKCooc2hvcnQgKilwKSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjYXNsICUwLCUyLCUxIgorCQkJCSAgICAgIDogIj1kIiAob2xkKSwgIj1tIiAoKihpbnQgKilwKQorCQkJCSAgICAgIDogImQiIChuZXcpLCAiMCIgKG9sZCksICJtIiAoKihpbnQgKilwKSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gb2xkOworfQorCisjZGVmaW5lIGNtcHhjaGcocHRyLCBvLCBuKQkJCQkJCSAgICBcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksCSAgICBcCisJCQkodW5zaWduZWQgbG9uZykobiksIHNpemVvZigqKHB0cikpKSkKKyNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCQkgICAgXAorCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZygocHRyKSwgKHVuc2lnbmVkIGxvbmcpKG8pLAkgICAgXAorCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCisjZWxzZQorCisvKgorICogY21weGNoZ19sb2NhbCBhbmQgY21weGNoZzY0X2xvY2FsIGFyZSBhdG9taWMgd3J0IGN1cnJlbnQgQ1BVLiBBbHdheXMgbWFrZQorICogdGhlbSBhdmFpbGFibGUuCisgKi8KKyNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCSAgCSAgICAgICBcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnX2xvY2FsX2dlbmVyaWMoKHB0ciksICh1bnNpZ25lZCBsb25nKShvKSxcCisJCQkodW5zaWduZWQgbG9uZykobiksIHNpemVvZigqKHB0cikpKSkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGcuaD4KKworI2VuZGlmCisKKyNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9NNjhLX1NZU1RFTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vc3lzdGVtX21tLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vc3lzdGVtX21tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjAxZjQuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3N5c3RlbV9tbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLSNpZm5kZWYgX002OEtfU1lTVEVNX0gKLSNkZWZpbmUgX002OEtfU1lTVEVNX0gKLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL2VudHJ5Lmg+Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLS8qCi0gKiBzd2l0Y2hfdG8obikgc2hvdWxkIHN3aXRjaCB0YXNrcyB0byB0YXNrIHB0ciwgZmlyc3QgY2hlY2tpbmcgdGhhdAotICogcHRyIGlzbid0IHRoZSBjdXJyZW50IHRhc2ssIGluIHdoaWNoIGNhc2UgaXQgZG9lcyBub3RoaW5nLiAgVGhpcwotICogYWxzbyBjbGVhcnMgdGhlIFRTLWZsYWcgaWYgdGhlIHRhc2sgd2Ugc3dpdGNoZWQgdG8gaGFzIHVzZWQgdGhlCi0gKiBtYXRoIGNvLXByb2Nlc3NvciBsYXRlc3QuCi0gKi8KLS8qCi0gKiBzd2l0Y2hfdG8oKSBzYXZlcyB0aGUgZXh0cmEgcmVnaXN0ZXJzLCB0aGF0IGFyZSBub3Qgc2F2ZWQKLSAqIGF1dG9tYXRpY2FsbHkgYnkgU0FWRV9TV0lUQ0hfU1RBQ0sgaW4gcmVzdW1lKCksIGllLiBkMC1kNSBhbmQKLSAqIGEwLWExLiBTb21lIG9mIHRoZXNlIGFyZSB1c2VkIGJ5IHNjaGVkdWxlKCkgYW5kIGl0cyBwcmVkZWNlc3NvcnMKLSAqIGFuZCBzbyB3ZSBtaWdodCBnZXQgc2VlIHVuZXhwZWN0ZWQgYmVoYXZpb3JzIHdoZW4gYSB0YXNrIHJldHVybnMKLSAqIHdpdGggdW5leHBlY3RlZCByZWdpc3RlciB2YWx1ZXMuCi0gKgotICogc3lzY2FsbCBzdG9yZXMgdGhlc2UgcmVnaXN0ZXJzIGl0c2VsZiBhbmQgbm9uZSBvZiB0aGVtIGFyZSB1c2VkCi0gKiBieSBzeXNjYWxsIGFmdGVyIHRoZSBmdW5jdGlvbiBpbiB0aGUgc3lzY2FsbCBoYXMgYmVlbiBjYWxsZWQuCi0gKgotICogQmV3YXJlIHRoYXQgcmVzdW1lIG5vdyBleHBlY3RzICpuZXh0IHRvIGJlIGluIGQxIGFuZCB0aGUgb2Zmc2V0IG9mCi0gKiB0c3MgdG8gYmUgaW4gYTEuIFRoaXMgc2F2ZXMgYSBmZXcgaW5zdHJ1Y3Rpb25zIGFzIHdlIG5vIGxvbmdlciBoYXZlCi0gKiB0byBwdXNoIHRoZW0gb250byB0aGUgc3RhY2sgYW5kIHJlYWQgdGhlbSBiYWNrIHJpZ2h0IGFmdGVyLgotICoKLSAqIDAyLzE3Lzk2IC0gSmVzIFNvcmVuc2VuIChqZHNAa29tLmF1Yy5kaykKLSAqCi0gKiBDaGFuZ2VkIDk2LzA5LzE5IGJ5IEFuZHJlYXMgU2Nod2FiCi0gKiBwYXNzIHByZXYgaW4gYTAsIG5leHQgaW4gYTEKLSAqLwotYXNtbGlua2FnZSB2b2lkIHJlc3VtZSh2b2lkKTsKLSNkZWZpbmUgc3dpdGNoX3RvKHByZXYsbmV4dCxsYXN0KSBkbyB7IFwKLSAgcmVnaXN0ZXIgdm9pZCAqX3ByZXYgX19hc21fXyAoImEwIikgPSAocHJldik7IFwKLSAgcmVnaXN0ZXIgdm9pZCAqX25leHQgX19hc21fXyAoImExIikgPSAobmV4dCk7IFwKLSAgcmVnaXN0ZXIgdm9pZCAqX2xhc3QgX19hc21fXyAoImQxIik7IFwKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oImpic3IgcmVzdW1lIiBcCi0JCSAgICAgICA6ICI9YSIgKF9wcmV2KSwgIj1hIiAoX25leHQpLCAiPWQiIChfbGFzdCkgXAotCQkgICAgICAgOiAiMCIgKF9wcmV2KSwgIjEiIChfbmV4dCkgXAotCQkgICAgICAgOiAiZDAiLCAiZDIiLCAiZDMiLCAiZDQiLCAiZDUiKTsgXAotICAobGFzdCkgPSBfbGFzdDsgXAotfSB3aGlsZSAoMCkKLQotCi0vKgotICogRm9yY2Ugc3RyaWN0IENQVSBvcmRlcmluZy4KLSAqIE5vdCByZWFsbHkgcmVxdWlyZWQgb24gbTY4ay4uLgotICovCi0jZGVmaW5lIG5vcCgpCQlkbyB7IGFzbSB2b2xhdGlsZSAoIm5vcCIpOyBiYXJyaWVyKCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG1iKCkJCWJhcnJpZXIoKQotI2RlZmluZSBybWIoKQkJYmFycmllcigpCi0jZGVmaW5lIHdtYigpCQliYXJyaWVyKCkKLSNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQkoKHZvaWQpMCkKLSNkZWZpbmUgc2V0X21iKHZhciwgdmFsdWUpCSh7ICh2YXIpID0gKHZhbHVlKTsgd21iKCk7IH0pCi0KLSNkZWZpbmUgc21wX21iKCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX3dtYigpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQkoKHZvaWQpMCkKLQotI2RlZmluZSB4Y2hnKHB0cix4KSAoKF9fdHlwZW9mX18oKihwdHIpKSlfX3hjaGcoKHVuc2lnbmVkIGxvbmcpKHgpLChwdHIpLHNpemVvZigqKHB0cikpKSkKLQotc3RydWN0IF9feGNoZ19kdW1teSB7IHVuc2lnbmVkIGxvbmcgYVsxMDBdOyB9OwotI2RlZmluZSBfX3hnKHgpICgodm9sYXRpbGUgc3RydWN0IF9feGNoZ19kdW1teSAqKSh4KSkKLQotI2lmbmRlZiBDT05GSUdfUk1XX0lOU05TCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX194Y2hnKHVuc2lnbmVkIGxvbmcgeCwgdm9sYXRpbGUgdm9pZCAqIHB0ciwgaW50IHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgdG1wOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0Jc3dpdGNoIChzaXplKSB7Ci0JY2FzZSAxOgotCQl0bXAgPSAqKHU4ICopcHRyOwotCQkqKHU4ICopcHRyID0geDsKLQkJeCA9IHRtcDsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQl0bXAgPSAqKHUxNiAqKXB0cjsKLQkJKih1MTYgKilwdHIgPSB4OwotCQl4ID0gdG1wOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXRtcCA9ICoodTMyICopcHRyOwotCQkqKHUzMiAqKXB0ciA9IHg7Ci0JCXggPSB0bXA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4geDsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX194Y2hnKHVuc2lnbmVkIGxvbmcgeCwgdm9sYXRpbGUgdm9pZCAqIHB0ciwgaW50IHNpemUpCi17Ci0Jc3dpdGNoIChzaXplKSB7Ci0JICAgIGNhc2UgMToKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18KLQkJCSgibW92ZWIgJTIsJTBcblx0IgotCQkJICIxOlxuXHQiCi0JCQkgImNhc2IgJTAsJTEsJTJcblx0IgotCQkJICJqbmUgMWIiCi0JCQkgOiAiPSZkIiAoeCkgOiAiZCIgKHgpLCAibSIgKCpfX3hnKHB0cikpIDogIm1lbW9yeSIpOwotCQlicmVhazsKLQkgICAgY2FzZSAyOgotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCQkJKCJtb3ZldyAlMiwlMFxuXHQiCi0JCQkgIjE6XG5cdCIKLQkJCSAiY2FzdyAlMCwlMSwlMlxuXHQiCi0JCQkgImpuZSAxYiIKLQkJCSA6ICI9JmQiICh4KSA6ICJkIiAoeCksICJtIiAoKl9feGcocHRyKSkgOiAibWVtb3J5Iik7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDQ6Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fCi0JCQkoIm1vdmVsICUyLCUwXG5cdCIKLQkJCSAiMTpcblx0IgotCQkJICJjYXNsICUwLCUxLCUyXG5cdCIKLQkJCSAiam5lIDFiIgotCQkJIDogIj0mZCIgKHgpIDogImQiICh4KSwgIm0iICgqX194ZyhwdHIpKSA6ICJtZW1vcnkiKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB4OwotfQotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLWxvY2FsLmg+Ci0KLSNkZWZpbmUgY21weGNoZzY0X2xvY2FsKHB0ciwgbywgbikgX19jbXB4Y2hnNjRfbG9jYWxfZ2VuZXJpYygocHRyKSwgKG8pLCAobikpCi0KLS8qCi0gKiBBdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UuICBDb21wYXJlIE9MRCB3aXRoIE1FTSwgaWYgaWRlbnRpY2FsLAotICogc3RvcmUgTkVXIGluIE1FTS4gIFJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZSBpbiBNRU0uICBTdWNjZXNzIGlzCi0gKiBpbmRpY2F0ZWQgYnkgY29tcGFyaW5nIFJFVFVSTiB3aXRoIE9MRC4KLSAqLwotI2lmZGVmIENPTkZJR19STVdfSU5TTlMKLSNkZWZpbmUgX19IQVZFX0FSQ0hfQ01QWENIRwkxCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NtcHhjaGcodm9sYXRpbGUgdm9pZCAqcCwgdW5zaWduZWQgbG9uZyBvbGQsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBuZXcsIGludCBzaXplKQotewotCXN3aXRjaCAoc2l6ZSkgewotCWNhc2UgMToKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjYXNiICUwLCUyLCUxIgotCQkJCSAgICAgIDogIj1kIiAob2xkKSwgIj1tIiAoKihjaGFyICopcCkKLQkJCQkgICAgICA6ICJkIiAobmV3KSwgIjAiIChvbGQpLCAibSIgKCooY2hhciAqKXApKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNhc3cgJTAsJTIsJTEiCi0JCQkJICAgICAgOiAiPWQiIChvbGQpLCAiPW0iICgqKHNob3J0ICopcCkKLQkJCQkgICAgICA6ICJkIiAobmV3KSwgIjAiIChvbGQpLCAibSIgKCooc2hvcnQgKilwKSk7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjYXNsICUwLCUyLCUxIgotCQkJCSAgICAgIDogIj1kIiAob2xkKSwgIj1tIiAoKihpbnQgKilwKQotCQkJCSAgICAgIDogImQiIChuZXcpLCAiMCIgKG9sZCksICJtIiAoKihpbnQgKilwKSk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gb2xkOwotfQotCi0jZGVmaW5lIGNtcHhjaGcocHRyLCBvLCBuKQkJCQkJCSAgICBcCi0JKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksCSAgICBcCi0JCQkodW5zaWduZWQgbG9uZykobiksIHNpemVvZigqKHB0cikpKSkKLSNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCQkgICAgXAotCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZygocHRyKSwgKHVuc2lnbmVkIGxvbmcpKG8pLAkgICAgXAotCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCi0jZWxzZQotCi0vKgotICogY21weGNoZ19sb2NhbCBhbmQgY21weGNoZzY0X2xvY2FsIGFyZSBhdG9taWMgd3J0IGN1cnJlbnQgQ1BVLiBBbHdheXMgbWFrZQotICogdGhlbSBhdmFpbGFibGUuCi0gKi8KLSNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCSAgCSAgICAgICBcCi0JKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnX2xvY2FsX2dlbmVyaWMoKHB0ciksICh1bnNpZ25lZCBsb25nKShvKSxcCi0JCQkodW5zaWduZWQgbG9uZykobiksIHNpemVvZigqKHB0cikpKSkKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGcuaD4KLQotI2VuZGlmCi0KLSNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9NNjhLX1NZU1RFTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vc3lzdGVtX25vLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vc3lzdGVtX25vLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTlmOTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3N5c3RlbV9uby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLSNpZm5kZWYgX002OEtOT01NVV9TWVNURU1fSAotI2RlZmluZSBfTTY4S05PTU1VX1NZU1RFTV9ICi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotI2luY2x1ZGUgPGFzbS9lbnRyeS5oPgotCi0vKgotICogc3dpdGNoX3RvKG4pIHNob3VsZCBzd2l0Y2ggdGFza3MgdG8gdGFzayBwdHIsIGZpcnN0IGNoZWNraW5nIHRoYXQKLSAqIHB0ciBpc24ndCB0aGUgY3VycmVudCB0YXNrLCBpbiB3aGljaCBjYXNlIGl0IGRvZXMgbm90aGluZy4gIFRoaXMKLSAqIGFsc28gY2xlYXJzIHRoZSBUUy1mbGFnIGlmIHRoZSB0YXNrIHdlIHN3aXRjaGVkIHRvIGhhcyB1c2VkIHRoZQotICogbWF0aCBjby1wcm9jZXNzb3IgbGF0ZXN0LgotICovCi0vKgotICogc3dpdGNoX3RvKCkgc2F2ZXMgdGhlIGV4dHJhIHJlZ2lzdGVycywgdGhhdCBhcmUgbm90IHNhdmVkCi0gKiBhdXRvbWF0aWNhbGx5IGJ5IFNBVkVfU1dJVENIX1NUQUNLIGluIHJlc3VtZSgpLCBpZS4gZDAtZDUgYW5kCi0gKiBhMC1hMS4gU29tZSBvZiB0aGVzZSBhcmUgdXNlZCBieSBzY2hlZHVsZSgpIGFuZCBpdHMgcHJlZGVjZXNzb3JzCi0gKiBhbmQgc28gd2UgbWlnaHQgZ2V0IHNlZSB1bmV4cGVjdGVkIGJlaGF2aW9ycyB3aGVuIGEgdGFzayByZXR1cm5zCi0gKiB3aXRoIHVuZXhwZWN0ZWQgcmVnaXN0ZXIgdmFsdWVzLgotICoKLSAqIHN5c2NhbGwgc3RvcmVzIHRoZXNlIHJlZ2lzdGVycyBpdHNlbGYgYW5kIG5vbmUgb2YgdGhlbSBhcmUgdXNlZAotICogYnkgc3lzY2FsbCBhZnRlciB0aGUgZnVuY3Rpb24gaW4gdGhlIHN5c2NhbGwgaGFzIGJlZW4gY2FsbGVkLgotICoKLSAqIEJld2FyZSB0aGF0IHJlc3VtZSBub3cgZXhwZWN0cyAqbmV4dCB0byBiZSBpbiBkMSBhbmQgdGhlIG9mZnNldCBvZgotICogdHNzIHRvIGJlIGluIGExLiBUaGlzIHNhdmVzIGEgZmV3IGluc3RydWN0aW9ucyBhcyB3ZSBubyBsb25nZXIgaGF2ZQotICogdG8gcHVzaCB0aGVtIG9udG8gdGhlIHN0YWNrIGFuZCByZWFkIHRoZW0gYmFjayByaWdodCBhZnRlci4KLSAqCi0gKiAwMi8xNy85NiAtIEplcyBTb3JlbnNlbiAoamRzQGtvbS5hdWMuZGspCi0gKgotICogQ2hhbmdlZCA5Ni8wOS8xOSBieSBBbmRyZWFzIFNjaHdhYgotICogcGFzcyBwcmV2IGluIGEwLCBuZXh0IGluIGExLCBvZmZzZXQgb2YgdHNzIGluIGQxLCBhbmQgd2hldGhlcgotICogdGhlIG1tIHN0cnVjdHVyZXMgYXJlIHNoYXJlZCBpbiBkMiAodG8gYXZvaWQgYXRjIGZsdXNoaW5nKS4KLSAqLwotYXNtbGlua2FnZSB2b2lkIHJlc3VtZSh2b2lkKTsKLSNkZWZpbmUgc3dpdGNoX3RvKHByZXYsbmV4dCxsYXN0KQkJCQlcCi17CQkJCQkJCQlcCi0gIHZvaWQgKl9sYXN0OwkJCQkJCQlcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLSAgCSJtb3ZlbAklMSwgJSVhMFxuXHQiCQkJCQlcCi0JIm1vdmVsCSUyLCAlJWExXG5cdCIJCQkJCVwKLQkiamJzciByZXN1bWVcblx0IgkJCQkJXAotCSJtb3ZlbAklJWQxLCAlMFxuXHQiCQkJCQlcCi0gICAgICAgOiAiPWQiIChfbGFzdCkJCQkJCQlcCi0gICAgICAgOiAiZCIgKHByZXYpLCAiZCIgKG5leHQpCQkJCQlcCi0gICAgICAgOiAiY2MiLCAiZDAiLCAiZDEiLCAiZDIiLCAiZDMiLCAiZDQiLCAiZDUiLCAiYTAiLCAiYTEiKTsJXAotICAobGFzdCkgPSBfbGFzdDsJCQkJCQlcCi19Ci0KLSNkZWZpbmUgaXJldCgpIF9fYXNtX18gX192b2xhdGlsZV9fICgicnRlIjogOiA6Im1lbW9yeSIsICJzcCIsICJjYyIpCi0KLS8qCi0gKiBGb3JjZSBzdHJpY3QgQ1BVIG9yZGVyaW5nLgotICogTm90IHJlYWxseSByZXF1aXJlZCBvbiBtNjhrLi4uCi0gKi8KLSNkZWZpbmUgbm9wKCkgIGFzbSB2b2xhdGlsZSAoIm5vcCI6OikKLSNkZWZpbmUgbWIoKSAgIGFzbSB2b2xhdGlsZSAoIiIgICA6IDogOiJtZW1vcnkiKQotI2RlZmluZSBybWIoKSAgYXNtIHZvbGF0aWxlICgiIiAgIDogOiA6Im1lbW9yeSIpCi0jZGVmaW5lIHdtYigpICBhc20gdm9sYXRpbGUgKCIiICAgOiA6IDoibWVtb3J5IikKLSNkZWZpbmUgc2V0X21iKHZhciwgdmFsdWUpCSh7ICh2YXIpID0gKHZhbHVlKTsgd21iKCk7IH0pCi0KLSNkZWZpbmUgc21wX21iKCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX3dtYigpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUoMCkKLQotI2RlZmluZSByZWFkX2JhcnJpZXJfZGVwZW5kcygpICAoKHZvaWQpMCkKLQotI2RlZmluZSB4Y2hnKHB0cix4KSAoKF9fdHlwZW9mX18oKihwdHIpKSlfX3hjaGcoKHVuc2lnbmVkIGxvbmcpKHgpLChwdHIpLHNpemVvZigqKHB0cikpKSkKLQotc3RydWN0IF9feGNoZ19kdW1teSB7IHVuc2lnbmVkIGxvbmcgYVsxMDBdOyB9OwotI2RlZmluZSBfX3hnKHgpICgodm9sYXRpbGUgc3RydWN0IF9feGNoZ19kdW1teSAqKSh4KSkKLQotI2lmbmRlZiBDT05GSUdfUk1XX0lOU05TCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX194Y2hnKHVuc2lnbmVkIGxvbmcgeCwgdm9sYXRpbGUgdm9pZCAqIHB0ciwgaW50IHNpemUpCi17Ci0gIHVuc2lnbmVkIGxvbmcgdG1wLCBmbGFnczsKLQotICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLSAgc3dpdGNoIChzaXplKSB7Ci0gIGNhc2UgMToKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXwotICAgICgibW92ZWIgJTIsJTBcblx0IgotICAgICAibW92ZWIgJTEsJTIiCi0gICAgOiAiPSZkIiAodG1wKSA6ICJkIiAoeCksICJtIiAoKl9feGcocHRyKSkgOiAibWVtb3J5Iik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgMjoKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXwotICAgICgibW92ZXcgJTIsJTBcblx0IgotICAgICAibW92ZXcgJTEsJTIiCi0gICAgOiAiPSZkIiAodG1wKSA6ICJkIiAoeCksICJtIiAoKl9feGcocHRyKSkgOiAibWVtb3J5Iik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgNDoKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXwotICAgICgibW92ZWwgJTIsJTBcblx0IgotICAgICAibW92ZWwgJTEsJTIiCi0gICAgOiAiPSZkIiAodG1wKSA6ICJkIiAoeCksICJtIiAoKl9feGcocHRyKSkgOiAibWVtb3J5Iik7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotICByZXR1cm4gdG1wOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3hjaGcodW5zaWduZWQgbG9uZyB4LCB2b2xhdGlsZSB2b2lkICogcHRyLCBpbnQgc2l6ZSkKLXsKLQlzd2l0Y2ggKHNpemUpIHsKLQkgICAgY2FzZSAxOgotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCQkJKCJtb3ZlYiAlMiwlMFxuXHQiCi0JCQkgIjE6XG5cdCIKLQkJCSAiY2FzYiAlMCwlMSwlMlxuXHQiCi0JCQkgImpuZSAxYiIKLQkJCSA6ICI9JmQiICh4KSA6ICJkIiAoeCksICJtIiAoKl9feGcocHRyKSkgOiAibWVtb3J5Iik7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDI6Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fCi0JCQkoIm1vdmV3ICUyLCUwXG5cdCIKLQkJCSAiMTpcblx0IgotCQkJICJjYXN3ICUwLCUxLCUyXG5cdCIKLQkJCSAiam5lIDFiIgotCQkJIDogIj0mZCIgKHgpIDogImQiICh4KSwgIm0iICgqX194ZyhwdHIpKSA6ICJtZW1vcnkiKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNDoKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18KLQkJCSgibW92ZWwgJTIsJTBcblx0IgotCQkJICIxOlxuXHQiCi0JCQkgImNhc2wgJTAsJTEsJTJcblx0IgotCQkJICJqbmUgMWIiCi0JCQkgOiAiPSZkIiAoeCkgOiAiZCIgKHgpLCAibSIgKCpfX3hnKHB0cikpIDogIm1lbW9yeSIpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHg7Ci19Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGctbG9jYWwuaD4KLQotLyoKLSAqIGNtcHhjaGdfbG9jYWwgYW5kIGNtcHhjaGc2NF9sb2NhbCBhcmUgYXRvbWljIHdydCBjdXJyZW50IENQVS4gQWx3YXlzIG1ha2UKLSAqIHRoZW0gYXZhaWxhYmxlLgotICovCi0jZGVmaW5lIGNtcHhjaGdfbG9jYWwocHRyLCBvLCBuKQkJCQkgIAkgICAgICAgXAotCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZ19sb2NhbF9nZW5lcmljKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksXAotCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCi0jZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy5oPgotCi0jZGVmaW5lIGFyY2hfYWxpZ25fc3RhY2soeCkgKHgpCi0KLQotI2VuZGlmIC8qIF9NNjhLTk9NTVVfU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90cmFwcy5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RyYXBzLmgKaW5kZXggMGJmZmIxNy4uMTUxMDY4ZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RyYXBzLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RyYXBzLmgKQEAgLTIyLDcgKzIyLDYgQEAKIGFzbWxpbmthZ2Ugdm9pZCBhdXRvX2ludGhhbmRsZXIodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgdXNlcl9pbnRoYW5kbGVyKHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIGJhZF9pbnRoYW5kbGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdF92ZWN0b3JzKHZvaWQpOwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9pcnEuYyBiL2FyY2gvbTY4ay9rZXJuZWwvaXJxLmMKaW5kZXggNTQ0Yjg3MS4uYzczOTg4YyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL202OGsva2VybmVsL2lycS5jCkBAIC0yOCwzICsyOCwxMyBAQAogCiAJc2V0X2lycV9yZWdzKG9sZHJlZ3MpOwogfQorCisKKy8qIFRoZSBudW1iZXIgb2Ygc3B1cmlvdXMgaW50ZXJydXB0cyAqLworYXRvbWljX3QgaXJxX2Vycl9jb3VudDsKKworaW50IGFyY2hfc2hvd19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgaW50IHByZWMpCit7CisJc2VxX3ByaW50ZihwLCAiJSpzOiAlMTB1XG4iLCBwcmVjLCAiRVJSIiwgYXRvbWljX3JlYWQoJmlycV9lcnJfY291bnQpKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jIGIvYXJjaC9tNjhrL2tlcm5lbC9tNjhrX2tzeW1zLmMKaW5kZXggMzNmODI3Ni4uMWI3YTE0ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9tNjhrX2tzeW1zLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9tNjhrX2tzeW1zLmMKQEAgLTE0LDggKzE0LDcgQEAKIEVYUE9SVF9TWU1CT0woX19sc2hyZGkzKTsKIEVYUE9SVF9TWU1CT0woX19tdWxkaTMpOwogCi0jaWYgIWRlZmluZWQoX19tYzY4MDIwX18pICYmICFkZWZpbmVkKF9fbWM2ODAzMF9fKSAmJiBcCi0gICAgIWRlZmluZWQoX19tYzY4MDQwX18pICYmICFkZWZpbmVkKF9fbWM2ODA2MF9fKSAmJiAhZGVmaW5lZChfX21jcHUzMl9fKQorI2lmIGRlZmluZWQoQ09ORklHX002ODAwMCkgfHwgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCiAvKgogICogU2ltcGxlciA2OGsgYW5kIENvbGRGaXJlIHBhcnRzIGFsc28gbmVlZCBhIGZldyBvdGhlciBnY2MgZnVuY3Rpb25zLgogICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL21vZHVsZS5jIGIvYXJjaC9tNjhrL2tlcm5lbC9tb2R1bGUuYwppbmRleCA3ZWEyMDNjLi4zNDg0OWM0IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvbW9kdWxlLmMKQEAgLTEsNSArMSwxMjkgQEAKLSNpZmRlZiBDT05GSUdfTU1VCi0jaW5jbHVkZSAibW9kdWxlX21tLmMiCisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50awogI2Vsc2UKLSNpbmNsdWRlICJtb2R1bGVfbm8uYyIKKyNkZWZpbmUgREVCVUdQKGZtdC4uLikKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX01PRFVMRVMKKworaW50IGFwcGx5X3JlbG9jYXRlKEVsZjMyX1NoZHIgKnNlY2hkcnMsCisJCSAgIGNvbnN0IGNoYXIgKnN0cnRhYiwKKwkJICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAorCQkgICB1bnNpZ25lZCBpbnQgcmVsc2VjLAorCQkgICBzdHJ1Y3QgbW9kdWxlICptZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlFbGYzMl9SZWwgKnJlbCA9ICh2b2lkICopc2VjaGRyc1tyZWxzZWNdLnNoX2FkZHI7CisJRWxmMzJfU3ltICpzeW07CisJdWludDMyX3QgKmxvY2F0aW9uOworCisJREVCVUdQKCJBcHBseWluZyByZWxvY2F0ZSBzZWN0aW9uICV1IHRvICV1XG4iLCByZWxzZWMsCisJICAgICAgIHNlY2hkcnNbcmVsc2VjXS5zaF9pbmZvKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2VjaGRyc1tyZWxzZWNdLnNoX3NpemUgLyBzaXplb2YoKnJlbCk7IGkrKykgeworCQkvKiBUaGlzIGlzIHdoZXJlIHRvIG1ha2UgdGhlIGNoYW5nZSAqLworCQlsb2NhdGlvbiA9ICh2b2lkICopc2VjaGRyc1tzZWNoZHJzW3JlbHNlY10uc2hfaW5mb10uc2hfYWRkcgorCQkJKyByZWxbaV0ucl9vZmZzZXQ7CisJCS8qIFRoaXMgaXMgdGhlIHN5bWJvbCBpdCBpcyByZWZlcnJpbmcgdG8uICBOb3RlIHRoYXQgYWxsCisJCSAgIHVuZGVmaW5lZCBzeW1ib2xzIGhhdmUgYmVlbiByZXNvbHZlZC4gICovCisJCXN5bSA9IChFbGYzMl9TeW0gKilzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyCisJCQkrIEVMRjMyX1JfU1lNKHJlbFtpXS5yX2luZm8pOworCisJCXN3aXRjaCAoRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pKSB7CisJCWNhc2UgUl82OEtfMzI6CisJCQkvKiBXZSBhZGQgdGhlIHZhbHVlIGludG8gdGhlIGxvY2F0aW9uIGdpdmVuICovCisJCQkqbG9jYXRpb24gKz0gc3ltLT5zdF92YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFJfNjhLX1BDMzI6CisJCQkvKiBBZGQgdGhlIHZhbHVlLCBzdWJ0cmFjdCBpdHMgcG9zdGl0aW9uICovCisJCQkqbG9jYXRpb24gKz0gc3ltLT5zdF92YWx1ZSAtICh1aW50MzJfdClsb2NhdGlvbjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFVua25vd24gcmVsb2NhdGlvbjogJXVcbiIsCisJCQkgICAgICAgbWUtPm5hbWUsIEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSk7CisJCQlyZXR1cm4gLUVOT0VYRUM7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBhcHBseV9yZWxvY2F0ZV9hZGQoRWxmMzJfU2hkciAqc2VjaGRycywKKwkJICAgICAgIGNvbnN0IGNoYXIgKnN0cnRhYiwKKwkJICAgICAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKKwkJICAgICAgIHVuc2lnbmVkIGludCByZWxzZWMsCisJCSAgICAgICBzdHJ1Y3QgbW9kdWxlICptZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlFbGYzMl9SZWxhICpyZWwgPSAodm9pZCAqKXNlY2hkcnNbcmVsc2VjXS5zaF9hZGRyOworCUVsZjMyX1N5bSAqc3ltOworCXVpbnQzMl90ICpsb2NhdGlvbjsKKworCURFQlVHUCgiQXBwbHlpbmcgcmVsb2NhdGVfYWRkIHNlY3Rpb24gJXUgdG8gJXVcbiIsIHJlbHNlYywKKwkgICAgICAgc2VjaGRyc1tyZWxzZWNdLnNoX2luZm8pOworCWZvciAoaSA9IDA7IGkgPCBzZWNoZHJzW3JlbHNlY10uc2hfc2l6ZSAvIHNpemVvZigqcmVsKTsgaSsrKSB7CisJCS8qIFRoaXMgaXMgd2hlcmUgdG8gbWFrZSB0aGUgY2hhbmdlICovCisJCWxvY2F0aW9uID0gKHZvaWQgKilzZWNoZHJzW3NlY2hkcnNbcmVsc2VjXS5zaF9pbmZvXS5zaF9hZGRyCisJCQkrIHJlbFtpXS5yX29mZnNldDsKKwkJLyogVGhpcyBpcyB0aGUgc3ltYm9sIGl0IGlzIHJlZmVycmluZyB0by4gIE5vdGUgdGhhdCBhbGwKKwkJICAgdW5kZWZpbmVkIHN5bWJvbHMgaGF2ZSBiZWVuIHJlc29sdmVkLiAgKi8KKwkJc3ltID0gKEVsZjMyX1N5bSAqKXNlY2hkcnNbc3ltaW5kZXhdLnNoX2FkZHIKKwkJCSsgRUxGMzJfUl9TWU0ocmVsW2ldLnJfaW5mbyk7CisKKwkJc3dpdGNoIChFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpIHsKKwkJY2FzZSBSXzY4S18zMjoKKwkJCS8qIFdlIGFkZCB0aGUgdmFsdWUgaW50byB0aGUgbG9jYXRpb24gZ2l2ZW4gKi8KKwkJCSpsb2NhdGlvbiA9IHJlbFtpXS5yX2FkZGVuZCArIHN5bS0+c3RfdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBSXzY4S19QQzMyOgorCQkJLyogQWRkIHRoZSB2YWx1ZSwgc3VidHJhY3QgaXRzIHBvc3RpdGlvbiAqLworCQkJKmxvY2F0aW9uID0gcmVsW2ldLnJfYWRkZW5kICsgc3ltLT5zdF92YWx1ZSAtICh1aW50MzJfdClsb2NhdGlvbjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFVua25vd24gcmVsb2NhdGlvbjogJXVcbiIsCisJCQkgICAgICAgbWUtPm5hbWUsIEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSk7CisJCQlyZXR1cm4gLUVOT0VYRUM7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwKKwkJICAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAorCQkgICAgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCW1vZHVsZV9maXh1cChtb2QsIG1vZC0+YXJjaC5maXh1cF9zdGFydCwgbW9kLT5hcmNoLmZpeHVwX2VuZCk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLworCit2b2lkIG1vZHVsZV9maXh1cChzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBtNjhrX2ZpeHVwX2luZm8gKnN0YXJ0LAorCQkgIHN0cnVjdCBtNjhrX2ZpeHVwX2luZm8gKmVuZCkKK3sKKyNpZmRlZiBDT05GSUdfTU1VCisJc3RydWN0IG02OGtfZml4dXBfaW5mbyAqZml4dXA7CisKKwlmb3IgKGZpeHVwID0gc3RhcnQ7IGZpeHVwIDwgZW5kOyBmaXh1cCsrKSB7CisJCXN3aXRjaCAoZml4dXAtPnR5cGUpIHsKKwkJY2FzZSBtNjhrX2ZpeHVwX21lbW9mZnNldDoKKwkJCSoodTMyICopZml4dXAtPmFkZHIgPSBtNjhrX21lbW9mZnNldDsKKwkJCWJyZWFrOworCQljYXNlIG02OGtfZml4dXBfdm5vZGVfc2hpZnQ6CisJCQkqKHUxNiAqKWZpeHVwLT5hZGRyICs9IG02OGtfdmlydF90b19ub2RlX3NoaWZ0OworCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvbW9kdWxlX21tLmMgYi9hcmNoL202OGsva2VybmVsL21vZHVsZV9tbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDZiY2IxLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvbW9kdWxlX21tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZWxmLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmbXQuLi4pCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NT0RVTEVTCi0KLXZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHZtYWxsb2Moc2l6ZSk7Ci19Ci0KLQotLyogRnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfYWxsb2MgKi8KLXZvaWQgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKQotewotCXZmcmVlKG1vZHVsZV9yZWdpb24pOwotfQotCi0vKiBXZSBkb24ndCBuZWVkIGFueXRoaW5nIHNwZWNpYWwuICovCi1pbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLAotCQkJICAgICAgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCQkgICAgICBjaGFyICpzZWNzdHJpbmdzLAotCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbW9kKQotewotCXJldHVybiAwOwotfQotCi1pbnQgYXBwbHlfcmVsb2NhdGUoRWxmMzJfU2hkciAqc2VjaGRycywKLQkJICAgY29uc3QgY2hhciAqc3RydGFiLAotCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCi0JCSAgIHVuc2lnbmVkIGludCByZWxzZWMsCi0JCSAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotCXVuc2lnbmVkIGludCBpOwotCUVsZjMyX1JlbCAqcmVsID0gKHZvaWQgKilzZWNoZHJzW3JlbHNlY10uc2hfYWRkcjsKLQlFbGYzMl9TeW0gKnN5bTsKLQl1aW50MzJfdCAqbG9jYXRpb247Ci0KLQlERUJVR1AoIkFwcGx5aW5nIHJlbG9jYXRlIHNlY3Rpb24gJXUgdG8gJXVcbiIsIHJlbHNlYywKLQkgICAgICAgc2VjaGRyc1tyZWxzZWNdLnNoX2luZm8pOwotCWZvciAoaSA9IDA7IGkgPCBzZWNoZHJzW3JlbHNlY10uc2hfc2l6ZSAvIHNpemVvZigqcmVsKTsgaSsrKSB7Ci0JCS8qIFRoaXMgaXMgd2hlcmUgdG8gbWFrZSB0aGUgY2hhbmdlICovCi0JCWxvY2F0aW9uID0gKHZvaWQgKilzZWNoZHJzW3NlY2hkcnNbcmVsc2VjXS5zaF9pbmZvXS5zaF9hZGRyCi0JCQkrIHJlbFtpXS5yX29mZnNldDsKLQkJLyogVGhpcyBpcyB0aGUgc3ltYm9sIGl0IGlzIHJlZmVycmluZyB0by4gIE5vdGUgdGhhdCBhbGwKLQkJICAgdW5kZWZpbmVkIHN5bWJvbHMgaGF2ZSBiZWVuIHJlc29sdmVkLiAgKi8KLQkJc3ltID0gKEVsZjMyX1N5bSAqKXNlY2hkcnNbc3ltaW5kZXhdLnNoX2FkZHIKLQkJCSsgRUxGMzJfUl9TWU0ocmVsW2ldLnJfaW5mbyk7Ci0KLQkJc3dpdGNoIChFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpIHsKLQkJY2FzZSBSXzY4S18zMjoKLQkJCS8qIFdlIGFkZCB0aGUgdmFsdWUgaW50byB0aGUgbG9jYXRpb24gZ2l2ZW4gKi8KLQkJCSpsb2NhdGlvbiArPSBzeW0tPnN0X3ZhbHVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgUl82OEtfUEMzMjoKLQkJCS8qIEFkZCB0aGUgdmFsdWUsIHN1YnRyYWN0IGl0cyBwb3N0aXRpb24gKi8KLQkJCSpsb2NhdGlvbiArPSBzeW0tPnN0X3ZhbHVlIC0gKHVpbnQzMl90KWxvY2F0aW9uOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogVW5rbm93biByZWxvY2F0aW9uOiAldVxuIiwKLQkJCSAgICAgICBtZS0+bmFtZSwgRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pKTsKLQkJCXJldHVybiAtRU5PRVhFQzsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGYzMl9TaGRyICpzZWNoZHJzLAotCQkgICAgICAgY29uc3QgY2hhciAqc3RydGFiLAotCQkgICAgICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAotCQkgICAgICAgdW5zaWduZWQgaW50IHJlbHNlYywKLQkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotCXVuc2lnbmVkIGludCBpOwotCUVsZjMyX1JlbGEgKnJlbCA9ICh2b2lkICopc2VjaGRyc1tyZWxzZWNdLnNoX2FkZHI7Ci0JRWxmMzJfU3ltICpzeW07Ci0JdWludDMyX3QgKmxvY2F0aW9uOwotCi0JREVCVUdQKCJBcHBseWluZyByZWxvY2F0ZV9hZGQgc2VjdGlvbiAldSB0byAldVxuIiwgcmVsc2VjLAotCSAgICAgICBzZWNoZHJzW3JlbHNlY10uc2hfaW5mbyk7Ci0JZm9yIChpID0gMDsgaSA8IHNlY2hkcnNbcmVsc2VjXS5zaF9zaXplIC8gc2l6ZW9mKCpyZWwpOyBpKyspIHsKLQkJLyogVGhpcyBpcyB3aGVyZSB0byBtYWtlIHRoZSBjaGFuZ2UgKi8KLQkJbG9jYXRpb24gPSAodm9pZCAqKXNlY2hkcnNbc2VjaGRyc1tyZWxzZWNdLnNoX2luZm9dLnNoX2FkZHIKLQkJCSsgcmVsW2ldLnJfb2Zmc2V0OwotCQkvKiBUaGlzIGlzIHRoZSBzeW1ib2wgaXQgaXMgcmVmZXJyaW5nIHRvLiAgTm90ZSB0aGF0IGFsbAotCQkgICB1bmRlZmluZWQgc3ltYm9scyBoYXZlIGJlZW4gcmVzb2x2ZWQuICAqLwotCQlzeW0gPSAoRWxmMzJfU3ltICopc2VjaGRyc1tzeW1pbmRleF0uc2hfYWRkcgotCQkJKyBFTEYzMl9SX1NZTShyZWxbaV0ucl9pbmZvKTsKLQotCQlzd2l0Y2ggKEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSkgewotCQljYXNlIFJfNjhLXzMyOgotCQkJLyogV2UgYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBsb2NhdGlvbiBnaXZlbiAqLwotCQkJKmxvY2F0aW9uID0gcmVsW2ldLnJfYWRkZW5kICsgc3ltLT5zdF92YWx1ZTsKLQkJCWJyZWFrOwotCQljYXNlIFJfNjhLX1BDMzI6Ci0JCQkvKiBBZGQgdGhlIHZhbHVlLCBzdWJ0cmFjdCBpdHMgcG9zdGl0aW9uICovCi0JCQkqbG9jYXRpb24gPSByZWxbaV0ucl9hZGRlbmQgKyBzeW0tPnN0X3ZhbHVlIC0gKHVpbnQzMl90KWxvY2F0aW9uOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogVW5rbm93biByZWxvY2F0aW9uOiAldVxuIiwKLQkJCSAgICAgICBtZS0+bmFtZSwgRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pKTsKLQkJCXJldHVybiAtRU5PRVhFQzsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAotCQkgICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCSAgICBzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci0JbW9kdWxlX2ZpeHVwKG1vZCwgbW9kLT5hcmNoLmZpeHVwX3N0YXJ0LCBtb2QtPmFyY2guZml4dXBfZW5kKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQotewotfQotCi0jZW5kaWYgLyogQ09ORklHX01PRFVMRVMgKi8KLQotdm9pZCBtb2R1bGVfZml4dXAoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbTY4a19maXh1cF9pbmZvICpzdGFydCwKLQkJICBzdHJ1Y3QgbTY4a19maXh1cF9pbmZvICplbmQpCi17Ci0Jc3RydWN0IG02OGtfZml4dXBfaW5mbyAqZml4dXA7Ci0KLQlmb3IgKGZpeHVwID0gc3RhcnQ7IGZpeHVwIDwgZW5kOyBmaXh1cCsrKSB7Ci0JCXN3aXRjaCAoZml4dXAtPnR5cGUpIHsKLQkJY2FzZSBtNjhrX2ZpeHVwX21lbW9mZnNldDoKLQkJCSoodTMyICopZml4dXAtPmFkZHIgPSBtNjhrX21lbW9mZnNldDsKLQkJCWJyZWFrOwotCQljYXNlIG02OGtfZml4dXBfdm5vZGVfc2hpZnQ6Ci0JCQkqKHUxNiAqKWZpeHVwLT5hZGRyICs9IG02OGtfdmlydF90b19ub2RlX3NoaWZ0OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL21vZHVsZV9uby5jIGIvYXJjaC9tNjhrL2tlcm5lbC9tb2R1bGVfbm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExZmZhZS4uMDAwMDAwMAotLS0gYS9hcmNoL202OGsva2VybmVsL21vZHVsZV9uby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9lbGYuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQIHByaW50awotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZtdC4uLikKLSNlbmRpZgotCi12b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQotewotCWlmIChzaXplID09IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiB2bWFsbG9jKHNpemUpOwotfQotCi0KLS8qIEZyZWUgbWVtb3J5IHJldHVybmVkIGZyb20gbW9kdWxlX2FsbG9jICovCi12b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKLXsKLQl2ZnJlZShtb2R1bGVfcmVnaW9uKTsKLX0KLQotLyogV2UgZG9uJ3QgbmVlZCBhbnl0aGluZyBzcGVjaWFsLiAqLwotaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmhkciwKLQkJCSAgICAgIEVsZl9TaGRyICpzZWNoZHJzLAotCQkJICAgICAgY2hhciAqc2Vjc3RyaW5ncywKLQkJCSAgICAgIHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGFwcGx5X3JlbG9jYXRlKEVsZjMyX1NoZHIgKnNlY2hkcnMsCi0JCSAgIGNvbnN0IGNoYXIgKnN0cnRhYiwKLQkJICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAotCQkgICB1bnNpZ25lZCBpbnQgcmVsc2VjLAotCQkgICBzdHJ1Y3QgbW9kdWxlICptZSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlFbGYzMl9SZWwgKnJlbCA9ICh2b2lkICopc2VjaGRyc1tyZWxzZWNdLnNoX2FkZHI7Ci0JRWxmMzJfU3ltICpzeW07Ci0JdWludDMyX3QgKmxvY2F0aW9uOwotCi0JREVCVUdQKCJBcHBseWluZyByZWxvY2F0ZSBzZWN0aW9uICV1IHRvICV1XG4iLCByZWxzZWMsCi0JICAgICAgIHNlY2hkcnNbcmVsc2VjXS5zaF9pbmZvKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2VjaGRyc1tyZWxzZWNdLnNoX3NpemUgLyBzaXplb2YoKnJlbCk7IGkrKykgewotCQkvKiBUaGlzIGlzIHdoZXJlIHRvIG1ha2UgdGhlIGNoYW5nZSAqLwotCQlsb2NhdGlvbiA9ICh2b2lkICopc2VjaGRyc1tzZWNoZHJzW3JlbHNlY10uc2hfaW5mb10uc2hfYWRkcgotCQkJKyByZWxbaV0ucl9vZmZzZXQ7Ci0JCS8qIFRoaXMgaXMgdGhlIHN5bWJvbCBpdCBpcyByZWZlcnJpbmcgdG8uICBOb3RlIHRoYXQgYWxsCi0JCSAgIHVuZGVmaW5lZCBzeW1ib2xzIGhhdmUgYmVlbiByZXNvbHZlZC4gICovCi0JCXN5bSA9IChFbGYzMl9TeW0gKilzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyCi0JCQkrIEVMRjMyX1JfU1lNKHJlbFtpXS5yX2luZm8pOwotCi0JCXN3aXRjaCAoRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pKSB7Ci0JCWNhc2UgUl82OEtfMzI6Ci0JCQkvKiBXZSBhZGQgdGhlIHZhbHVlIGludG8gdGhlIGxvY2F0aW9uIGdpdmVuICovCi0JCQkqbG9jYXRpb24gKz0gc3ltLT5zdF92YWx1ZTsKLQkJCWJyZWFrOwotCQljYXNlIFJfNjhLX1BDMzI6Ci0JCQkvKiBBZGQgdGhlIHZhbHVlLCBzdWJ0cmFjdCBpdHMgcG9zdGl0aW9uICovCi0JCQkqbG9jYXRpb24gKz0gc3ltLT5zdF92YWx1ZSAtICh1aW50MzJfdClsb2NhdGlvbjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFVua25vd24gcmVsb2NhdGlvbjogJXVcbiIsCi0JCQkgICAgICAgbWUtPm5hbWUsIEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSk7Ci0JCQlyZXR1cm4gLUVOT0VYRUM7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBhcHBseV9yZWxvY2F0ZV9hZGQoRWxmMzJfU2hkciAqc2VjaGRycywKLQkJICAgICAgIGNvbnN0IGNoYXIgKnN0cnRhYiwKLQkJICAgICAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKLQkJICAgICAgIHVuc2lnbmVkIGludCByZWxzZWMsCi0JCSAgICAgICBzdHJ1Y3QgbW9kdWxlICptZSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlFbGYzMl9SZWxhICpyZWwgPSAodm9pZCAqKXNlY2hkcnNbcmVsc2VjXS5zaF9hZGRyOwotCUVsZjMyX1N5bSAqc3ltOwotCXVpbnQzMl90ICpsb2NhdGlvbjsKLQotCURFQlVHUCgiQXBwbHlpbmcgcmVsb2NhdGVfYWRkIHNlY3Rpb24gJXUgdG8gJXVcbiIsIHJlbHNlYywKLQkgICAgICAgc2VjaGRyc1tyZWxzZWNdLnNoX2luZm8pOwotCWZvciAoaSA9IDA7IGkgPCBzZWNoZHJzW3JlbHNlY10uc2hfc2l6ZSAvIHNpemVvZigqcmVsKTsgaSsrKSB7Ci0JCS8qIFRoaXMgaXMgd2hlcmUgdG8gbWFrZSB0aGUgY2hhbmdlICovCi0JCWxvY2F0aW9uID0gKHZvaWQgKilzZWNoZHJzW3NlY2hkcnNbcmVsc2VjXS5zaF9pbmZvXS5zaF9hZGRyCi0JCQkrIHJlbFtpXS5yX29mZnNldDsKLQkJLyogVGhpcyBpcyB0aGUgc3ltYm9sIGl0IGlzIHJlZmVycmluZyB0by4gIE5vdGUgdGhhdCBhbGwKLQkJICAgdW5kZWZpbmVkIHN5bWJvbHMgaGF2ZSBiZWVuIHJlc29sdmVkLiAgKi8KLQkJc3ltID0gKEVsZjMyX1N5bSAqKXNlY2hkcnNbc3ltaW5kZXhdLnNoX2FkZHIKLQkJCSsgRUxGMzJfUl9TWU0ocmVsW2ldLnJfaW5mbyk7Ci0KLQkJc3dpdGNoIChFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpIHsKLQkJY2FzZSBSXzY4S18zMjoKLQkJCS8qIFdlIGFkZCB0aGUgdmFsdWUgaW50byB0aGUgbG9jYXRpb24gZ2l2ZW4gKi8KLQkJCSpsb2NhdGlvbiA9IHJlbFtpXS5yX2FkZGVuZCArIHN5bS0+c3RfdmFsdWU7Ci0JCQlicmVhazsKLQkJY2FzZSBSXzY4S19QQzMyOgotCQkJLyogQWRkIHRoZSB2YWx1ZSwgc3VidHJhY3QgaXRzIHBvc3RpdGlvbiAqLwotCQkJKmxvY2F0aW9uID0gcmVsW2ldLnJfYWRkZW5kICsgc3ltLT5zdF92YWx1ZSAtICh1aW50MzJfdClsb2NhdGlvbjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFVua25vd24gcmVsb2NhdGlvbjogJXVcbiIsCi0JCQkgICAgICAgbWUtPm5hbWUsIEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSk7Ci0JCQlyZXR1cm4gLUVOT0VYRUM7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwKLQkJICAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAotCQkgICAgc3RydWN0IG1vZHVsZSAqbWUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci19CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3NfbW0uYyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzc19tbS5jCmluZGV4IGMyYTFmYzIuLjFiYzIyM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzc19tbS5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzc19tbS5jCkBAIC0xODUsNyArMTg1LDcgQEAKIHZvaWQgZmx1c2hfdGhyZWFkKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB6ZXJvID0gMDsKLQlzZXRfZnMoVVNFUl9EUyk7CisKIAljdXJyZW50LT50aHJlYWQuZnMgPSBfX1VTRVJfRFM7CiAJaWYgKCFGUFVfSVNfRU1VKQogCQlhc20gdm9sYXRpbGUgKCIuY2hpcCA2OGsvNjg4ODFcblx0IgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzX25vLmMgYi9hcmNoL202OGsva2VybmVsL3Byb2Nlc3Nfbm8uYwppbmRleCA5Yjg2YWQxLi42OWMxODAzIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3Nfbm8uYworKysgYi9hcmNoL202OGsva2VybmVsL3Byb2Nlc3Nfbm8uYwpAQCAtMTU4LDcgKzE1OCw3IEBACiAjaWZkZWYgQ09ORklHX0ZQVQogCXVuc2lnbmVkIGxvbmcgemVybyA9IDA7CiAjZW5kaWYKLQlzZXRfZnMoVVNFUl9EUyk7CisKIAljdXJyZW50LT50aHJlYWQuZnMgPSBfX1VTRVJfRFM7CiAjaWZkZWYgQ09ORklHX0ZQVQogCWlmICghRlBVX0lTX0VNVSkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHNfbm8uYyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHNfbm8uYwppbmRleCBhNzY4MDA4Li5lNjdiOGM4IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3RyYXBzX25vLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwc19uby5jCkBAIC02MCwxMCArNjAsNiBAQAogCSJNTVUgQ09ORklHVVJBVElPTiBFUlJPUiIKIH07CiAKLXZvaWQgX19pbml0IHRyYXBfaW5pdCh2b2lkKQotewotfQotCiB2b2lkIGRpZV9pZl9rZXJuZWwoY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqZnAsIGludCBucikKIHsKIAlpZiAoIShmcC0+c3IgJiBQU19TKSkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC5sZHNfbm8uUyBiL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC5sZHNfbm8uUwppbmRleCBmNGQ3MTVjLi43ZGM0MDg3IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgubGRzX25vLlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4Lmxkc19uby5TCkBAIC04NCw1MiArODQsNTIgQEAKIAkJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogTm9ybWFsIHN5bWJvbHMgKi8KIAkJLiA9IEFMSUdOKDQpOwogCQlfX3N0YXJ0X19fa3N5bXRhYiA9IC47Ci0JCSooX19rc3ltdGFiKQorCQkqKFNPUlQoX19fa3N5bXRhYisqKSkKIAkJX19zdG9wX19fa3N5bXRhYiA9IC47CiAKIAkJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogR1BMLW9ubHkgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa3N5bXRhYl9ncGwgPSAuOwotCQkqKF9fa3N5bXRhYl9ncGwpCisJCSooU09SVChfX19rc3ltdGFiX2dwbCsqKSkKIAkJX19zdG9wX19fa3N5bXRhYl9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IE5vcm1hbCB1bnVzZWQgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa3N5bXRhYl91bnVzZWQgPSAuOwotCQkqKF9fa3N5bXRhYl91bnVzZWQpCisJCSooU09SVChfX19rc3ltdGFiX3VudXNlZCsqKSkKIAkJX19zdG9wX19fa3N5bXRhYl91bnVzZWQgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1vbmx5IHVudXNlZCBzeW1ib2xzICovCiAJCV9fc3RhcnRfX19rc3ltdGFiX3VudXNlZF9ncGwgPSAuOwotCQkqKF9fa3N5bXRhYl91bnVzZWRfZ3BsKQorCQkqKFNPUlQoX19fa3N5bXRhYl91bnVzZWRfZ3BsKyopKQogCQlfX3N0b3BfX19rc3ltdGFiX3VudXNlZF9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1mdXR1cmUgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa3N5bXRhYl9ncGxfZnV0dXJlID0gLjsKLQkJKihfX2tzeW10YWJfZ3BsX2Z1dHVyZSkKKwkJKihTT1JUKF9fX2tzeW10YWJfZ3BsX2Z1dHVyZSsqKSkKIAkJX19zdG9wX19fa3N5bXRhYl9ncGxfZnV0dXJlID0gLjsKIAogCQkvKiBLZXJuZWwgc3ltYm9sIHRhYmxlOiBOb3JtYWwgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYiA9IC47Ci0JCSooX19rY3JjdGFiKQorCQkqKFNPUlQoX19fa2NyY3RhYisqKSkKIAkJX19zdG9wX19fa2NyY3RhYiA9IC47CiAKIAkJLyogS2VybmVsIHN5bWJvbCB0YWJsZTogR1BMLW9ubHkgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYl9ncGwgPSAuOwotCQkqKF9fa2NyY3RhYl9ncGwpCisJCSooU09SVChfX19rY3JjdGFiX2dwbCsqKSkKIAkJX19zdG9wX19fa2NyY3RhYl9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IE5vcm1hbCB1bnVzZWQgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYl91bnVzZWQgPSAuOwotCQkqKF9fa2NyY3RhYl91bnVzZWQpCisJCSooU09SVChfX19rY3JjdGFiX3VudXNlZCsqKSkKIAkJX19zdG9wX19fa2NyY3RhYl91bnVzZWQgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1vbmx5IHVudXNlZCBzeW1ib2xzICovCiAJCV9fc3RhcnRfX19rY3JjdGFiX3VudXNlZF9ncGwgPSAuOwotCQkqKF9fa2NyY3RhYl91bnVzZWRfZ3BsKQorCQkqKFNPUlQoX19fa2NyY3RhYl91bnVzZWRfZ3BsKyopKQogCQlfX3N0b3BfX19rY3JjdGFiX3VudXNlZF9ncGwgPSAuOwogCiAJCS8qIEtlcm5lbCBzeW1ib2wgdGFibGU6IEdQTC1mdXR1cmUgc3ltYm9scyAqLwogCQlfX3N0YXJ0X19fa2NyY3RhYl9ncGxfZnV0dXJlID0gLjsKLQkJKihfX2tjcmN0YWJfZ3BsX2Z1dHVyZSkKKwkJKihTT1JUKF9fX2tjcmN0YWJfZ3BsX2Z1dHVyZSsqKSkKIAkJX19zdG9wX19fa2NyY3RhYl9ncGxfZnV0dXJlID0gLjsKIAogCQkvKiBLZXJuZWwgc3ltYm9sIHRhYmxlOiBzdHJpbmdzICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL01ha2VmaWxlIGIvYXJjaC9tNjhrL2xpYi9NYWtlZmlsZQppbmRleCBkZjQyMWU1Li4xYTFiZDkwIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvbTY4ay9saWIvTWFrZWZpbGUKQEAgLTksNiArOSw2IEBACiBpZmRlZiBDT05GSUdfTU1VCiBsaWIteQkrPSBzdHJpbmcubyB1YWNjZXNzLm8gY2hlY2tzdW1fbW0ubwogZWxzZQotbGliLXkJKz0gbXVsc2kzLm8gZGl2c2kzLm8gdWRpdnNpMy5vIG1vZHNpMy5vIHVtb2RzaTMubyBkZWxheS5vIGNoZWNrc3VtX25vLm8KK2xpYi15CSs9IG11bHNpMy5vIGRpdnNpMy5vIHVkaXZzaTMubyBtb2RzaTMubyB1bW9kc2kzLm8gY2hlY2tzdW1fbm8ubwogZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi9kZWxheS5jIGIvYXJjaC9tNjhrL2xpYi9kZWxheS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQ1NDcyLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9saWIvZGVsYXkuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKglhcmNoL202OGtub21tdS9saWIvZGVsYXkuYwotICoKLSAqCShDKSBDb3B5cmlnaHQgMjAwNCwgR3JlZyBVbmdlcmVyIDxnZXJnQHNuYXBnZWFyLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vcGFyYW0uaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KLQotRVhQT1JUX1NZTUJPTCh1ZGVsYXkpOwotCi12b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKQotewotCV91ZGVsYXkodXNlY3MpOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL21lbWNweS5jIGIvYXJjaC9tNjhrL2xpYi9tZW1jcHkuYwppbmRleCA2MjE4MmM4Li4wNjQ4ODkzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL21lbWNweS5jCisrKyBiL2FyY2gvbTY4ay9saWIvbWVtY3B5LmMKQEAgLTM0LDggKzM0LDEwIEBACiAJaWYgKHRlbXApIHsKIAkJbG9uZyAqbHRvID0gdG87CiAJCWNvbnN0IGxvbmcgKmxmcm9tID0gZnJvbTsKLSNpZiBkZWZpbmVkKF9fbWM2ODAyMF9fKSB8fCBkZWZpbmVkKF9fbWM2ODAzMF9fKSB8fCBcCi0gICAgZGVmaW5lZChfX21jNjgwNDBfXykgfHwgZGVmaW5lZChfX21jNjgwNjBfXykgfHwgZGVmaW5lZChfX21jcHUzMl9fKQorI2lmIGRlZmluZWQoQ09ORklHX002ODAwMCkgfHwgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCisJCWZvciAoOyB0ZW1wOyB0ZW1wLS0pCisJCQkqbHRvKysgPSAqbGZyb20rKzsKKyNlbHNlCiAJCWFzbSB2b2xhdGlsZSAoCiAJCQkiCW1vdmVsICUyLCUzXG4iCiAJCQkiCWFuZHcgICM3LCUzXG4iCkBAIC01Niw5ICs1OCw2IEBACiAJCQkiCWpwbCAgIDRiIgogCQkJOiAiPWEiIChsZnJvbSksICI9YSIgKGx0byksICI9ZCIgKHRlbXApLCAiPSZkIiAodGVtcDEpCiAJCQk6ICIwIiAobGZyb20pLCAiMSIgKGx0byksICIyIiAodGVtcCkpOwotI2Vsc2UKLQkJZm9yICg7IHRlbXA7IHRlbXAtLSkKLQkJCSpsdG8rKyA9ICpsZnJvbSsrOwogI2VuZGlmCiAJCXRvID0gbHRvOwogCQlmcm9tID0gbGZyb207CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL21lbXNldC5jIGIvYXJjaC9tNjhrL2xpYi9tZW1zZXQuYwppbmRleCBmNjQ5ZTZhLi44YTc2MzlmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL21lbXNldC5jCisrKyBiL2FyY2gvbTY4ay9saWIvbWVtc2V0LmMKQEAgLTMyLDggKzMyLDEwIEBACiAJdGVtcCA9IGNvdW50ID4+IDI7CiAJaWYgKHRlbXApIHsKIAkJbG9uZyAqbHMgPSBzOwotI2lmIGRlZmluZWQoX19tYzY4MDIwX18pIHx8IGRlZmluZWQoX19tYzY4MDMwX18pIHx8IFwKLSAgICBkZWZpbmVkKF9fbWM2ODA0MF9fKSB8fCBkZWZpbmVkKF9fbWM2ODA2MF9fKSB8fCBkZWZpbmVkKF9fbWNwdTMyX18pCisjaWYgZGVmaW5lZChDT05GSUdfTTY4MDAwKSB8fCBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKKwkJZm9yICg7IHRlbXA7IHRlbXAtLSkKKwkJCSpscysrID0gYzsKKyNlbHNlCiAJCXNpemVfdCB0ZW1wMTsKIAkJYXNtIHZvbGF0aWxlICgKIAkJCSIJbW92ZWwgJTEsJTJcbiIKQEAgLTU1LDkgKzU3LDYgQEAKIAkJCSIJanBsICAgMWIiCiAJCQk6ICI9YSIgKGxzKSwgIj1kIiAodGVtcCksICI9JmQiICh0ZW1wMSkKIAkJCTogImQiIChjKSwgIjAiIChscyksICIxIiAodGVtcCkpOwotI2Vsc2UKLQkJZm9yICg7IHRlbXA7IHRlbXAtLSkKLQkJCSpscysrID0gYzsKICNlbmRpZgogCQlzID0gbHM7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi9tdWxkaTMuYyBiL2FyY2gvbTY4ay9saWIvbXVsZGkzLmMKaW5kZXggMDc5YmFmYy4uNzllOTI4YSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2xpYi9tdWxkaTMuYworKysgYi9hcmNoL202OGsvbGliL211bGRpMy5jCkBAIC0xOSwxNyArMTksNyBAQAogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwogCi0jaWYgZGVmaW5lZChfX21jNjgwMjBfXykgfHwgZGVmaW5lZChfX21jNjgwMzBfXykgfHwgXAotICAgIGRlZmluZWQoX19tYzY4MDQwX18pIHx8IGRlZmluZWQoX19tYzY4MDYwX18pIHx8IGRlZmluZWQoX19tY3B1MzJfXykKLQotI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCi0gIF9fYXNtX18gKCJtdWx1JS5sICUzLCUxOiUwIgkJCQkJCVwKLSAgICAgICAgICAgOiAiPWQiICgoVVNJdHlwZSkodzApKSwJCQkJCVwKLSAgICAgICAgICAgICAiPWQiICgoVVNJdHlwZSkodzEpKQkJCQkJXAotICAgICAgICAgICA6ICIlMCIgKChVU0l0eXBlKSh1KSksCQkJCQlcCi0gICAgICAgICAgICAgImRtaSIgKChVU0l0eXBlKSh2KSkpCi0KLSNlbHNlCisjaWYgZGVmaW5lZChDT05GSUdfTTY4MDAwKSB8fCBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKIAogI2RlZmluZSBTSV9UWVBFX1NJWkUgMzIKICNkZWZpbmUgX19CSVRTNCAoU0lfVFlQRV9TSVpFIC8gNCkKQEAgLTYxLDYgKzUxLDE1IEBACiAgICAgKHcwKSA9IF9fbGxfbG93cGFydCAoX194MSkgKiBfX2xsX0IgKyBfX2xsX2xvd3BhcnQgKF9feDApOwkJXAogICB9IHdoaWxlICgwKQogCisjZWxzZQorCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgX19hc21fXyAoIm11bHUlLmwgJTMsJTE6JTAiCQkJCQkJXAorICAgICAgICAgICA6ICI9ZCIgKChVU0l0eXBlKSh3MCkpLAkJCQkJXAorICAgICAgICAgICAgICI9ZCIgKChVU0l0eXBlKSh3MSkpCQkJCQlcCisgICAgICAgICAgIDogIiUwIiAoKFVTSXR5cGUpKHUpKSwJCQkJCVwKKyAgICAgICAgICAgICAiZG1pIiAoKFVTSXR5cGUpKHYpKSkKKwogI2VuZGlmCiAKICNkZWZpbmUgX191bXVsc2lkaTModSwgdikgXApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21tL2luaXRfbm8uYyBiL2FyY2gvbTY4ay9tbS9pbml0X25vLmMKaW5kZXggN2NiZDdiZC4uNTBjZDEyYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL2luaXRfbm8uYworKysgYi9hcmNoL202OGsvbW0vaW5pdF9uby5jCkBAIC00Miw3ICs0Miw3IEBACiAgKiBaRVJPX1BBR0UgaXMgYSBzcGVjaWFsIHBhZ2UgdGhhdCBpcyB1c2VkIGZvciB6ZXJvLWluaXRpYWxpemVkCiAgKiBkYXRhIGFuZCBDT1cuCiAgKi8KLXVuc2lnbmVkIGxvbmcgZW1wdHlfemVyb19wYWdlOwordm9pZCAqZW1wdHlfemVyb19wYWdlOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQ7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfZW5kOwpAQCAtNjIsOCArNjIsOCBAQAogCXVuc2lnbmVkIGxvbmcgZW5kX21lbSAgID0gbWVtb3J5X2VuZCAmIFBBR0VfTUFTSzsKIAl1bnNpZ25lZCBsb25nIHpvbmVzX3NpemVbTUFYX05SX1pPTkVTXSA9IHswLCB9OwogCi0JZW1wdHlfemVyb19wYWdlID0gKHVuc2lnbmVkIGxvbmcpYWxsb2NfYm9vdG1lbV9wYWdlcyhQQUdFX1NJWkUpOwotCW1lbXNldCgodm9pZCAqKWVtcHR5X3plcm9fcGFnZSwgMCwgUEFHRV9TSVpFKTsKKwllbXB0eV96ZXJvX3BhZ2UgPSBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSk7CisJbWVtc2V0KGVtcHR5X3plcm9fcGFnZSwgMCwgUEFHRV9TSVpFKTsKIAogCS8qCiAJICogU2V0IHVwIFNGQy9ERkMgcmVnaXN0ZXJzICh1c2VyIGRhdGEgc3BhY2UpLgpAQCAtMTIwLDcgKzEyMCw4IEBACiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJCXBhZ2VzKys7CiAJfQotCXByaW50ayAoS0VSTl9OT1RJQ0UgIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWRrIGZyZWVkXG4iLCBwYWdlcyAqIChQQUdFX1NJWkUgLyAxMDI0KSk7CisJcHJfbm90aWNlKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsdWsgZnJlZWRcbiIsCisJCSAgcGFnZXMgKiAoUEFHRV9TSVpFIC8gMTAyNCkpOwogfQogI2VuZGlmCiAKQEAgLTE0MSw3ICsxNDIsNyBAQAogCQlmcmVlX3BhZ2UoYWRkcik7CiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJfQotCXByaW50ayhLRVJOX05PVElDRSAiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWxkayBmcmVlZCAoMHgleCAtIDB4JXgpXG4iLAorCXByX25vdGljZSgiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWx1ayBmcmVlZCAoMHgleCAtIDB4JXgpXG4iLAogCQkJKGFkZHIgLSBQQUdFX0FMSUdOKChsb25nKSAmX19pbml0X2JlZ2luKSkgPj4gMTAsCiAJCQkoaW50KShQQUdFX0FMSUdOKCh1bnNpZ25lZCBsb25nKSgmX19pbml0X2JlZ2luKSkpLAogCQkJKGludCkoYWRkciAtIFBBR0VfU0laRSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3BsYXRmb3JtLzUyMDYvY29uZmlnLmMgYi9hcmNoL202OGsvcGxhdGZvcm0vNTIwNi9jb25maWcuYwppbmRleCA5YzMzNTQ2Li42ZmEzZjgwIDEwMDY0NAotLS0gYS9hcmNoL202OGsvcGxhdGZvcm0vNTIwNi9jb25maWcuYworKysgYi9hcmNoL202OGsvcGxhdGZvcm0vNTIwNi9jb25maWcuYwpAQCAtOTgsNiArOTgsMTIgQEAKIAogdm9pZCBfX2luaXQgY29uZmlnX0JTUChjaGFyICpjb21tYW5kcCwgaW50IHNpemUpCiB7CisjaWYgZGVmaW5lZChDT05GSUdfTkVUdGVsKQorCS8qIENvcHkgY29tbWFuZCBsaW5lIGZyb20gRkxBU0ggdG8gbG9jYWwgYnVmZmVyLi4uICovCisJbWVtY3B5KGNvbW1hbmRwLCAoY2hhciAqKSAweGYwMDA0MDAwLCBzaXplKTsKKwljb21tYW5kcFtzaXplLTFdID0gMDsKKyNlbmRpZiAvKiBDT05GSUdfTkVUdGVsICovCisKIAltYWNoX3Jlc2V0ID0gbTUyMDZfY3B1X3Jlc2V0OwogCW01MjA2X3RpbWVyc19pbml0KCk7CiAJbTUyMDZfdWFydHNfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3BsYXRmb3JtLzUyMDZlL01ha2VmaWxlIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzUyMDZlL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWRiMDU2Li4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS81MjA2ZS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBtNjhrbm9tbXUgbGludXgga2VybmVsLgotIwotCi0jCi0jIElmIHlvdSB3YW50IHRvIHBsYXkgd2l0aCB0aGUgSFcgYnJlYWtwb2ludHMgdGhlbiB5b3Ugd2lsbAotIyBuZWVkIHRvIGFkZCBkZWZpbmUgdGhpcywgIHdoaWNoIHdpbGwgZ2l2ZSB5b3UgYSBzdGFjayBiYWNrdHJhY2UKLSMgb24gdGhlIGNvbnNvbGUgcG9ydCB3aGVuZXZlciBhIERCRyBpbnRlcnJ1cHQgb2NjdXJzLiAgWW91IGhhdmUgdG8KLSMgc2V0IHVwIHlvdSBIVyBicmVha3BvaW50cyB0byB0cmlnZ2VyIGEgREJHIGludGVycnVwdDoKLSMKLSMgY2NmbGFncy15IDo9IC1EVFJBUF9EQkdfSU5URVJSVVBUCi0jIGFzZmxhZ3MteSA6PSAtRFRSQVBfREJHX0lOVEVSUlVQVAotIwotCi1hc2ZsYWdzLSQoQ09ORklHX0ZVTExERUJVRykgOj0gLURERUJVR0dFUl9DT01QQVRJQkxFX0NBQ0hFPTEKLQotb2JqLXkgOj0gY29uZmlnLm8gZ3Bpby5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9wbGF0Zm9ybS81MjA2ZS9jb25maWcuYyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS81MjA2ZS9jb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyMzk3OS4uMDAwMDAwMAotLS0gYS9hcmNoL202OGsvcGxhdGZvcm0vNTIwNmUvY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqCWxpbnV4L2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyMDZlL2NvbmZpZy5jCi0gKgotICoJQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIsIEdyZWcgVW5nZXJlciAoZ2VyZ0BzbmFwZ2Vhci5jb20pCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vY29sZGZpcmUuaD4KLSNpbmNsdWRlIDxhc20vbWNmc2ltLmg+Ci0jaW5jbHVkZSA8YXNtL21jZnVhcnQuaD4KLSNpbmNsdWRlIDxhc20vbWNmZG1hLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBzdHJ1Y3QgbWNmX3BsYXRmb3JtX3VhcnQgbTUyMDZlX3VhcnRfcGxhdGZvcm1bXSA9IHsKLQl7Ci0JCS5tYXBiYXNlCT0gTUNGX01CQVIgKyBNQ0ZVQVJUX0JBU0UxLAotCQkuaXJxCQk9IDczLAotCX0sCi0JewotCQkubWFwYmFzZSAJPSBNQ0ZfTUJBUiArIE1DRlVBUlRfQkFTRTIsCi0JCS5pcnEJCT0gNzQsCi0JfSwKLQl7IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtNTIwNmVfdWFydCA9IHsKLQkubmFtZQkJCT0gIm1jZnVhcnQiLAotCS5pZAkJCT0gMCwKLQkuZGV2LnBsYXRmb3JtX2RhdGEJPSBtNTIwNmVfdWFydF9wbGF0Zm9ybSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptNTIwNmVfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJm01MjA2ZV91YXJ0LAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgX19pbml0IG01MjA2ZV91YXJ0X2luaXRfbGluZShpbnQgbGluZSwgaW50IGlycSkKLXsKLQlpZiAobGluZSA9PSAwKSB7Ci0JCXdyaXRlbChNQ0ZTSU1fSUNSX0xFVkVMNiB8IE1DRlNJTV9JQ1JfUFJJMSwgTUNGX01CQVIgKyBNQ0ZTSU1fVUFSVDFJQ1IpOwotCQl3cml0ZWIoaXJxLCBNQ0ZVQVJUX0JBU0UxICsgTUNGVUFSVF9VSVZSKTsKLQkJbWNmX21hcGlycTJpbXIoaXJxLCBNQ0ZJTlRDX1VBUlQwKTsKLQl9IGVsc2UgaWYgKGxpbmUgPT0gMSkgewotCQl3cml0ZWwoTUNGU0lNX0lDUl9MRVZFTDYgfCBNQ0ZTSU1fSUNSX1BSSTIsIE1DRl9NQkFSICsgTUNGU0lNX1VBUlQySUNSKTsKLQkJd3JpdGViKGlycSwgTUNGVUFSVF9CQVNFMiArIE1DRlVBUlRfVUlWUik7Ci0JCW1jZl9tYXBpcnEyaW1yKGlycSwgTUNGSU5UQ19VQVJUMSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbTUyMDZlX3VhcnRzX2luaXQodm9pZCkKLXsKLQljb25zdCBpbnQgbnJsaW5lcyA9IEFSUkFZX1NJWkUobTUyMDZlX3VhcnRfcGxhdGZvcm0pOwotCWludCBsaW5lOwotCi0JZm9yIChsaW5lID0gMDsgKGxpbmUgPCBucmxpbmVzKTsgbGluZSsrKQotCQltNTIwNmVfdWFydF9pbml0X2xpbmUobGluZSwgbTUyMDZlX3VhcnRfcGxhdGZvcm1bbGluZV0uaXJxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgX19pbml0IG01MjA2ZV90aW1lcnNfaW5pdCh2b2lkKQotewotCS8qIFRpbWVyMSBpcyBhbHdheXMgdXNlZCBhcyBzeXN0ZW0gdGltZXIgKi8KLQl3cml0ZWIoTUNGU0lNX0lDUl9BVVRPVkVDIHwgTUNGU0lNX0lDUl9MRVZFTDYgfCBNQ0ZTSU1fSUNSX1BSSTMsCi0JCU1DRl9NQkFSICsgTUNGU0lNX1RJTUVSMUlDUik7Ci0JbWNmX21hcGlycTJpbXIoTUNGX0lSUV9USU1FUiwgTUNGSU5UQ19USU1FUjEpOwotCi0jaWZkZWYgQ09ORklHX0hJR0hQUk9GSUxFCi0JLyogVGltZXIyIGlzIHRvIGJlIHVzZWQgYXMgYSBoaWdoIHNwZWVkIHByb2ZpbGUgdGltZXIgICovCi0Jd3JpdGViKE1DRlNJTV9JQ1JfQVVUT1ZFQyB8IE1DRlNJTV9JQ1JfTEVWRUw3IHwgTUNGU0lNX0lDUl9QUkkzLAotCQlNQ0ZfTUJBUiArIE1DRlNJTV9USU1FUjJJQ1IpOwotCW1jZl9tYXBpcnEyaW1yKE1DRl9JUlFfUFJPRklMRVIsIE1DRklOVENfVElNRVIyKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIG01MjA2ZV9jcHVfcmVzZXQodm9pZCkKLXsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCS8qIFNldCB3YXRjaGRvZyB0byBzb2Z0IHJlc2V0LCBhbmQgZW5hYmxlZCAqLwotCV9fcmF3X3dyaXRlYigweGMwLCBNQ0ZfTUJBUiArIE1DRlNJTV9TWVBDUik7Ci0JZm9yICg7OykKLQkJLyogd2FpdCBmb3Igd2F0Y2hkb2cgdG8gdGltZW91dCAqLzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBfX2luaXQgY29uZmlnX0JTUChjaGFyICpjb21tYW5kcCwgaW50IHNpemUpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfTkVUdGVsKQotCS8qIENvcHkgY29tbWFuZCBsaW5lIGZyb20gRkxBU0ggdG8gbG9jYWwgYnVmZmVyLi4uICovCi0JbWVtY3B5KGNvbW1hbmRwLCAoY2hhciAqKSAweGYwMDA0MDAwLCBzaXplKTsKLQljb21tYW5kcFtzaXplLTFdID0gMDsKLSNlbmRpZiAvKiBDT05GSUdfTkVUdGVsICovCi0KLQltYWNoX3Jlc2V0ID0gbTUyMDZlX2NwdV9yZXNldDsKLQltNTIwNmVfdGltZXJzX2luaXQoKTsKLQltNTIwNmVfdWFydHNfaW5pdCgpOwotCi0JLyogT25seSBzdXBwb3J0IHRoZSBleHRlcm5hbCBpbnRlcnJ1cHRzIG9uIHRoZWlyIHByaW1hcnkgbGV2ZWwgKi8KLQltY2ZfbWFwaXJxMmltcigyNSwgTUNGSU5UQ19FSU5UMSk7Ci0JbWNmX21hcGlycTJpbXIoMjgsIE1DRklOVENfRUlOVDQpOwotCW1jZl9tYXBpcnEyaW1yKDMxLCBNQ0ZJTlRDX0VJTlQ3KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9CU1Aodm9pZCkKLXsKLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhtNTIwNmVfZGV2aWNlcywgQVJSQVlfU0laRShtNTIwNmVfZGV2aWNlcykpOwotCXJldHVybiAwOwotfQotCi1hcmNoX2luaXRjYWxsKGluaXRfQlNQKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9wbGF0Zm9ybS81MjA2ZS9ncGlvLmMgYi9hcmNoL202OGsvcGxhdGZvcm0vNTIwNmUvZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFiNGExLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS81MjA2ZS9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29sZGZpcmUgZ2VuZXJpYyBHUElPIHN1cHBvcnQKLSAqCi0gKiAoQykgQ29weXJpZ2h0IDIwMDksIFN0ZXZlbiBLaW5nIDxzZmtpbmdAZmR3ZGMuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL2NvbGRmaXJlLmg+Ci0jaW5jbHVkZSA8YXNtL21jZnNpbS5oPgotI2luY2x1ZGUgPGFzbS9tY2ZncGlvLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgbWNmX2dwaW9fY2hpcCBtY2ZfZ3Bpb19jaGlwc1tdID0gewotCXsKLQkJLmdwaW9fY2hpcAkJCT0gewotCQkJLmxhYmVsCQkJPSAiUFAiLAotCQkJLnJlcXVlc3QJCT0gbWNmX2dwaW9fcmVxdWVzdCwKLQkJCS5mcmVlCQkJPSBtY2ZfZ3Bpb19mcmVlLAotCQkJLmRpcmVjdGlvbl9pbnB1dAk9IG1jZl9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKLQkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gbWNmX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKLQkJCS5nZXQJCQk9IG1jZl9ncGlvX2dldF92YWx1ZSwKLQkJCS5zZXQJCQk9IG1jZl9ncGlvX3NldF92YWx1ZSwKLQkJCS5uZ3BpbwkJCT0gOCwKLQkJfSwKLQkJLnBkZHIJCQkJPSAodm9pZCBfX2lvbWVtICopIE1DRlNJTV9QQUREUiwKLQkJLnBvZHIJCQkJPSAodm9pZCBfX2lvbWVtICopIE1DRlNJTV9QQURBVCwKLQkJLnBwZHIJCQkJPSAodm9pZCBfX2lvbWVtICopIE1DRlNJTV9QQURBVCwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbWNmX2dwaW9faW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGkgPSAwOwotCXdoaWxlIChpIDwgQVJSQVlfU0laRShtY2ZfZ3Bpb19jaGlwcykpCi0JCSh2b2lkKWdwaW9jaGlwX2FkZCgoc3RydWN0IGdwaW9fY2hpcCAqKSZtY2ZfZ3Bpb19jaGlwc1tpKytdKTsKLQlyZXR1cm4gMDsKLX0KLQotY29yZV9pbml0Y2FsbChtY2ZfZ3Bpb19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9wbGF0Zm9ybS81MjcyL2ludGMuYyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS81MjcyL2ludGMuYwppbmRleCA3ZTcxNWRmLi43MTYwZTYxIDEwMDY0NAotLS0gYS9hcmNoL202OGsvcGxhdGZvcm0vNTI3Mi9pbnRjLmMKKysrIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzUyNzIvaW50Yy5jCkBAIC0xNjIsOCArMTYyLDYgQEAKIHsKIAlpbnQgaXJxLCBlZGdlOwogCi0JaW5pdF92ZWN0b3JzKCk7Ci0KIAkvKiBNYXNrIGFsbCBpbnRlcnJ1cHQgc291cmNlcyAqLwogCXdyaXRlbCgweDg4ODg4ODg4LCBNQ0ZfTUJBUiArIE1DRlNJTV9JQ1IxKTsKIAl3cml0ZWwoMHg4ODg4ODg4OCwgTUNGX01CQVIgKyBNQ0ZTSU1fSUNSMik7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvcGxhdGZvcm0vNjgzMjgvZW50cnkuUyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9lbnRyeS5TCmluZGV4IGY2OGRjZTcuLjI5M2UxZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9lbnRyeS5TCisrKyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9lbnRyeS5TCkBAIC0yMzYsMjcgKzIzNiwyNiBAQAogICogSGFuZGxlciBmb3IgdW5pbml0aWFsaXplZCBhbmQgc3B1cmlvdXMgaW50ZXJydXB0cy4KICAqLwogRU5UUlkoYmFkX2ludGVycnVwdCkKLQlhZGRxbAkjMSxudW1fc3B1cmlvdXMKKwlhZGRxbAkjMSxpcnFfZXJyX2NvdW50CiAJcnRlCiAKIC8qCiAgKiBCZXdhcmUgLSB3aGVuIGVudGVyaW5nIHJlc3VtZSwgcHJldiAodGhlIGN1cnJlbnQgdGFzaykgaXMKLSAqIGluIGEwLCBuZXh0ICh0aGUgbmV3IHRhc2spIGlzIGluIGExLHNvIGRvbid0IGNoYW5nZSB0aGVzZQorICogaW4gYTAsIG5leHQgKHRoZSBuZXcgdGFzaykgaXMgaW4gYTEsIHNvIGRvbid0IGNoYW5nZSB0aGVzZQogICogcmVnaXN0ZXJzIHVudGlsIHRoZWlyIGNvbnRlbnRzIGFyZSBubyBsb25nZXIgbmVlZGVkLgogICovCiBFTlRSWShyZXN1bWUpCiAJbW92ZWwJJWEwLCVkMQkJCQkvKiBzYXZlIHByZXYgdGhyZWFkIGluIGQxICovCiAJbW92ZXcJJXNyLCVhMEAoVEFTS19USFJFQUQrVEhSRUFEX1NSKQkvKiBzYXZlIHNyICovCi0JbW92ZWwJJXVzcCwlYTIJCQkvKiBzYXZlIHVzcCAqLwotCW1vdmVsCSVhMiwlYTBAKFRBU0tfVEhSRUFEK1RIUkVBRF9VU1ApCi0KIAlTQVZFX1NXSVRDSF9TVEFDSwogCW1vdmVsCSVzcCwlYTBAKFRBU0tfVEhSRUFEK1RIUkVBRF9LU1ApIC8qIHNhdmUga2VybmVsIHN0YWNrICovCisJbW92ZWwJJXVzcCwlYTMJCQkvKiBzYXZlIHVzcCAqLworCW1vdmVsCSVhMywlYTBAKFRBU0tfVEhSRUFEK1RIUkVBRF9VU1ApCisKKwltb3ZlbAklYTFAKFRBU0tfVEhSRUFEK1RIUkVBRF9VU1ApLCVhMyAvKiByZXN0b3JlIHVzZXIgc3RhY2sgKi8KKwltb3ZlbAklYTMsJXVzcAogCW1vdmVsCSVhMUAoVEFTS19USFJFQUQrVEhSRUFEX0tTUCksJXNwIC8qIHJlc3RvcmUgbmV3IHRocmVhZCBzdGFjayAqLwogCVJFU1RPUkVfU1dJVENIX1NUQUNLCi0KLQltb3ZlbAklYTFAKFRBU0tfVEhSRUFEK1RIUkVBRF9VU1ApLCVhMCAvKiByZXN0b3JlIHVzZXIgc3RhY2sgKi8KLQltb3ZlbAklYTAsJXVzcAogCW1vdmV3CSVhMUAoVEFTS19USFJFQUQrVEhSRUFEX1NSKSwlc3IJLyogcmVzdG9yZSB0aHJlYWQgc3RhdHVzIHJlZyAqLwogCXJ0cwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvcGxhdGZvcm0vNjgzMjgvaW50cy5jIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzI4L2ludHMuYwppbmRleCBhOTAyODhjLi40YmQ0NTY1IDEwMDY0NAotLS0gYS9hcmNoL202OGsvcGxhdGZvcm0vNjgzMjgvaW50cy5jCisrKyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9pbnRzLmMKQEAgLTcwLDkgKzcwLDYgQEAKIAogZXh0ZXJuIGVfdmVjdG9yICpfcmFtdmVjOwogCi0vKiBUaGUgbnVtYmVyIG9mIHNwdXJpb3VzIGludGVycnVwdHMgKi8KLXZvbGF0aWxlIHVuc2lnbmVkIGludCBudW1fc3B1cmlvdXM7Ci0KIC8qIFRoZSA2OGsgZmFtaWx5IGRpZCBub3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIGRldGVybWluZSB0aGUgc291cmNlCiAgKiBvZiBpbnRlcnJ1cHRzIHVudGlsIGxhdGVyIGluIHRoZSBmYW1pbHkuICBUaGUgRUMwMDAgY29yZSBkb2VzCiAgKiBub3QgcHJvdmlkZSB0aGUgdmVjdG9yIG51bWJlciBvbiB0aGUgc3RhY2ssIHdlIHZlY3RvciBldmVyeXRoaW5nCkBAIC0xNTUsNyArMTUyLDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcga2VybmVsIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZQogICogdGhlIG1hY2hpbmUgdmVjdG9yIHRhYmxlLgogICovCi12b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQordm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCiB7CiAJaW50IGk7CiAKQEAgLTE3Miw2ICsxNjksMTEgQEAKIAlfcmFtdmVjWzY5XSA9IChlX3ZlY3RvcikgaW50aGFuZGxlcjU7CiAJX3JhbXZlY1s3MF0gPSAoZV92ZWN0b3IpIGludGhhbmRsZXI2OwogCV9yYW12ZWNbNzFdID0gKGVfdmVjdG9yKSBpbnRoYW5kbGVyNzsKK30KKwordm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKK3sKKwlpbnQgaTsKIAogCUlWUiA9IDB4NDA7IC8qIFNldCBEcmFnb25CYWxsIElWUiAoaW50ZXJydXB0IGJhc2UpIHRvIDY0ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODM2MC9lbnRyeS5TIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMKaW5kZXggYTA3YjE0Zi4uYWJiYjg5NiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMKKysrIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMKQEAgLTE1NywyNyArMTU3LDI2IEBACiAgKiBIYW5kbGVyIGZvciB1bmluaXRpYWxpemVkIGFuZCBzcHVyaW91cyBpbnRlcnJ1cHRzLgogICovCiBiYWRfaW50ZXJydXB0OgotCWFkZHFsCSMxLG51bV9zcHVyaW91cworCWFkZHFsCSMxLGlycV9lcnJfY291bnQKIAlydGUKIAogLyoKICAqIEJld2FyZSAtIHdoZW4gZW50ZXJpbmcgcmVzdW1lLCBwcmV2ICh0aGUgY3VycmVudCB0YXNrKSBpcwotICogaW4gYTAsIG5leHQgKHRoZSBuZXcgdGFzaykgaXMgaW4gYTEsc28gZG9uJ3QgY2hhbmdlIHRoZXNlCisgKiBpbiBhMCwgbmV4dCAodGhlIG5ldyB0YXNrKSBpcyBpbiBhMSwgc28gZG9uJ3QgY2hhbmdlIHRoZXNlCiAgKiByZWdpc3RlcnMgdW50aWwgdGhlaXIgY29udGVudHMgYXJlIG5vIGxvbmdlciBuZWVkZWQuCiAgKi8KIEVOVFJZKHJlc3VtZSkKIAltb3ZlbAklYTAsJWQxCQkJCS8qIHNhdmUgcHJldiB0aHJlYWQgaW4gZDEgKi8KIAltb3Zldwklc3IsJWEwQChUQVNLX1RIUkVBRCtUSFJFQURfU1IpCS8qIHNhdmUgc3IgKi8KLQltb3ZlbAkldXNwLCVhMgkJCS8qIHNhdmUgdXNwICovCi0JbW92ZWwJJWEyLCVhMEAoVEFTS19USFJFQUQrVEhSRUFEX1VTUCkKLQogCVNBVkVfU1dJVENIX1NUQUNLCiAJbW92ZWwJJXNwLCVhMEAoVEFTS19USFJFQUQrVEhSRUFEX0tTUCkgLyogc2F2ZSBrZXJuZWwgc3RhY2sgKi8KKwltb3ZlbAkldXNwLCVhMwkJCS8qIHNhdmUgdXNwICovCisJbW92ZWwJJWEzLCVhMEAoVEFTS19USFJFQUQrVEhSRUFEX1VTUCkKKworCW1vdmVsCSVhMUAoVEFTS19USFJFQUQrVEhSRUFEX1VTUCksJWEzIC8qIHJlc3RvcmUgdXNlciBzdGFjayAqLworCW1vdmVsCSVhMywldXNwCiAJbW92ZWwJJWExQChUQVNLX1RIUkVBRCtUSFJFQURfS1NQKSwlc3AgLyogcmVzdG9yZSBuZXcgdGhyZWFkIHN0YWNrICovCiAJUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKLQotCW1vdmVsCSVhMUAoVEFTS19USFJFQUQrVEhSRUFEX1VTUCksJWEwIC8qIHJlc3RvcmUgdXNlciBzdGFjayAqLwotCW1vdmVsCSVhMCwldXNwCiAJbW92ZXcJJWExQChUQVNLX1RIUkVBRCtUSFJFQURfU1IpLCVzcgkvKiByZXN0b3JlIHRocmVhZCBzdGF0dXMgcmVnICovCiAJcnRzCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODM2MC9pbnRzLmMgYi9hcmNoL202OGsvcGxhdGZvcm0vNjgzNjAvaW50cy5jCmluZGV4IDRhZjBmNGUuLjdiNDAyMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODM2MC9pbnRzLmMKKysrIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzYwL2ludHMuYwpAQCAtMzQsOSArMzQsNiBAQAogCiBleHRlcm4gdm9pZCAqX3JhbXZlY1tdOwogCi0vKiBUaGUgbnVtYmVyIG9mIHNwdXJpb3VzIGludGVycnVwdHMgKi8KLXZvbGF0aWxlIHVuc2lnbmVkIGludCBudW1fc3B1cmlvdXM7Ci0KIHN0YXRpYyB2b2lkIGludGNfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJcHF1aWNjLT5pbnRyX2NpbXIgfD0gKDEgPDwgZC0+aXJxKTsKQEAgLTYzLDkgKzYwLDggQEAKICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcga2VybmVsIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZQogICogdGhlIHZlY3RvciB0YWJsZS4KICAqLwotdm9pZCBpbml0X0lSUSh2b2lkKQordm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCiB7Ci0JaW50IGk7CiAJaW50IHZiYSA9IChDUE1fVkVDVE9SX0JBU0U8PDQpOwogCiAJLyogc2V0IHVwIHRoZSB2ZWN0b3JzICovCkBAIC0xMzAsNiArMTI2LDExIEBACiAKIAkvKiB0dXJuIG9mZiBhbGwgQ1BNIGludGVycnVwdHMgKi8KIAlwcXVpY2MtPmludHJfY2ltciA9IDB4MDAwMDAwMDA7Cit9CisKK3ZvaWQgaW5pdF9JUlEodm9pZCkKK3sKKwlpbnQgaTsKIAogCWZvciAoaSA9IDA7IChpIDwgTlJfSVJRUyk7IGkrKykgewogCQlpcnFfc2V0X2NoaXAoaSwgJmludGNfaXJxX2NoaXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL2VudHJ5LlMgYi9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvZW50cnkuUwppbmRleCAyN2MyYjAwLi5iZDI3MjQyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvZW50cnkuUworKysgYi9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvZW50cnkuUwpAQCAtMTgyLDIxICsxODIsMjMgQEAKIAogLyoKICAqIEJld2FyZSAtIHdoZW4gZW50ZXJpbmcgcmVzdW1lLCBwcmV2ICh0aGUgY3VycmVudCB0YXNrKSBpcwotICogaW4gYTAsIG5leHQgKHRoZSBuZXcgdGFzaykgaXMgaW4gYTEsc28gZG9uJ3QgY2hhbmdlIHRoZXNlCisgKiBpbiBhMCwgbmV4dCAodGhlIG5ldyB0YXNrKSBpcyBpbiBhMSwgc28gZG9uJ3QgY2hhbmdlIHRoZXNlCiAgKiByZWdpc3RlcnMgdW50aWwgdGhlaXIgY29udGVudHMgYXJlIG5vIGxvbmdlciBuZWVkZWQuCi0gKiBUaGlzIGlzIGFsd2F5cyBjYWxsZWQgaW4gc3VwZXJ2aXNvciBtb2RlLCBzbyBkb24ndCBib3RoZXIgdG8gc2F2ZQotICogYW5kIHJlc3RvcmUgc3I7IHVzZXIncyBwcm9jZXNzIHNyIGlzIGFjdHVhbGx5IGluIHRoZSBzdGFjay4KICAqLwogRU5UUlkocmVzdW1lKQotCW1vdmVsCSVhMCwgJWQxCQkJLyogZ2V0IHByZXYgdGhyZWFkIGluIGQxICovCi0JUkRVU1AKLQltb3ZlbAklYTIsJWEwQChUQVNLX1RIUkVBRCtUSFJFQURfVVNQKQotCisJbW92ZXcJJXNyLCVkMQkJCQkgLyogc2F2ZSBjdXJyZW50IHN0YXR1cyAqLworCW1vdmV3CSVkMSwlYTBAKFRBU0tfVEhSRUFEK1RIUkVBRF9TUikKKwltb3ZlbAklYTAsJWQxCQkJCSAvKiBnZXQgcHJldiB0aHJlYWQgaW4gZDEgKi8KIAlTQVZFX1NXSVRDSF9TVEFDSwogCW1vdmVsCSVzcCwlYTBAKFRBU0tfVEhSRUFEK1RIUkVBRF9LU1ApIC8qIHNhdmUga2VybmVsIHN0YWNrIHBvaW50ZXIgKi8KLQltb3ZlbAklYTFAKFRBU0tfVEhSRUFEK1RIUkVBRF9LU1ApLCVzcCAvKiByZXN0b3JlIG5ldyB0aHJlYWQgc3RhY2sgKi8KLQlSRVNUT1JFX1NXSVRDSF9TVEFDSworCVJEVVNQCQkJCQkgLyogbW92ZWwgJXVzcCwlYTMgKi8KKwltb3ZlbAklYTMsJWEwQChUQVNLX1RIUkVBRCtUSFJFQURfVVNQKSAvKiBzYXZlIHRocmVhZCB1c2VyIHN0YWNrICovCiAKLQltb3ZlbAklYTFAKFRBU0tfVEhSRUFEK1RIUkVBRF9VU1ApLCVhMCAvKiByZXN0b3JlIHRocmVhZCB1c2VyIHN0YWNrICovCi0JV1JVU1AKKwltb3ZlbAklYTFAKFRBU0tfVEhSRUFEK1RIUkVBRF9VU1ApLCVhMyAvKiByZXN0b3JlIHRocmVhZCB1c2VyIHN0YWNrICovCisJV1JVU1AJCQkJCSAvKiBtb3ZlbCAlYTMsJXVzcCAqLworCW1vdmVsCSVhMUAoVEFTS19USFJFQUQrVEhSRUFEX0tTUCksJXNwIC8qIHJlc3RvcmUgbmV3IGtlcm5lbCBzdGFjayAqLworCW1vdmV3CSVhMUAoVEFTS19USFJFQUQrVEhSRUFEX1NSKSwlZDcJIC8qIHJlc3RvcmUgbmV3IHN0YXR1cyAqLworCW1vdmV3CSVkNywlc3IKKwlSRVNUT1JFX1NXSVRDSF9TVEFDSwogCXJ0cworCmRpZmYgLS1naXQgYS9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvaW50Yy0yLmMgYi9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvaW50Yy0yLmMKaW5kZXggNzRiNTVjZi4uOTk1MDkzMyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL2ludGMtMi5jCisrKyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS9pbnRjLTIuYwpAQCAtMTk0LDggKzE5NCw2IEBACiB7CiAJaW50IGlycTsKIAotCWluaXRfdmVjdG9ycygpOwotCiAJLyogTWFzayBhbGwgaW50ZXJydXB0IHNvdXJjZXMgKi8KIAlfX3Jhd193cml0ZWwoMHgxLCBNQ0ZJQ01fSU5UQzAgKyBNQ0ZJTlRDX0lNUkwpOwogI2lmZGVmIE1DRklDTV9JTlRDMQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL2ludGMtc2ltci5jIGIvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL2ludGMtc2ltci5jCmluZGV4IGQ2YTRkOWQuLjY1MGQ1MmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS9pbnRjLXNpbXIuYworKysgYi9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvaW50Yy1zaW1yLmMKQEAgLTE3MSw4ICsxNzEsNiBAQAogewogCWludCBpcnEsIGVpcnE7CiAKLQlpbml0X3ZlY3RvcnMoKTsKLQogCS8qIE1hc2sgYWxsIGludGVycnVwdCBzb3VyY2VzICovCiAJX19yYXdfd3JpdGViKDB4ZmYsIE1DRklOVEMwX1NJTVIpOwogCWlmIChNQ0ZJTlRDMV9TSU1SKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL2ludGMuYyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS9pbnRjLmMKaW5kZXggMGJiYjQxNC4uNWMwYzE1MCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL2ludGMuYworKysgYi9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvaW50Yy5jCkBAIC0xMzksNyArMTM5LDYgQEAKIHsKIAlpbnQgaXJxOwogCi0JaW5pdF92ZWN0b3JzKCk7CiAJbWNmX21hc2tpbXIoMHhmZmZmZmZmZik7CiAKIAlmb3IgKGlycSA9IDA7IChpcnEgPCBOUl9JUlFTKTsgaXJxKyspIHsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS92ZWN0b3JzLmMgYi9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvdmVjdG9ycy5jCmluZGV4IGEyMWQzZjguLjNhN2NjNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS92ZWN0b3JzLmMKKysrIGIvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL3ZlY3RvcnMuYwpAQCAtMzUsMjEgKzM1LDEzIEBACiAKIGV4dGVybiBlX3ZlY3RvcgkqX3JhbXZlYzsKIAotdm9pZCBzZXRfZXZlY3RvcihpbnQgdmVjbnVtLCB2b2lkICgqaGFuZGxlcikodm9pZCkpCi17Ci0JaWYgKHZlY251bSA+PSAwICYmIHZlY251bSA8PSAyNTUpCi0JCV9yYW12ZWNbdmVjbnVtXSA9IGhhbmRsZXI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIC8qIEFzc2VtYmxlciByb3V0aW5lcyAqLwogYXNtbGlua2FnZSB2b2lkIGJ1c2Vycih2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCB0cmFwKHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIHN5c3RlbV9jYWxsKHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIGludGhhbmRsZXIodm9pZCk7CiAKLXZvaWQgX19pbml0IGluaXRfdmVjdG9ycyh2b2lkKQordm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcGNpLWJyaWRnZS5oCmluZGV4IDc0NmRmOTEuLjI0MmJlNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaApAQCAtMTksOSArMTksNiBAQAogCSAqLwogCVBDSV9SRUFTU0lHTl9BTExfUlNSQwk9IDB4MDAwMDAwMDEsCiAKLQkvKiBSZS1hc3NpZ24gYWxsIGJ1cyBudW1iZXJzICovCi0JUENJX1JFQVNTSUdOX0FMTF9CVVMJPSAweDAwMDAwMDAyLAotCiAJLyogRG8gbm90IHRyeSB0byBhc3NpZ24sIGp1c3QgdXNlIGV4aXN0aW5nIHNldHVwICovCiAJUENJX1BST0JFX09OTFkJCT0gMHgwMDAwMDAwNCwKIApAQCAtMTEwLDE2ICsxMDcsNiBAQAogCXJldHVybiBidXMtPnN5c2RhdGE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZV9ub2RlICpwY2lfYnVzX3RvX09GX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc3Q7Ci0KLQlpZiAoYnVzLT5zZWxmKQotCQlyZXR1cm4gcGNpX2RldmljZV90b19PRl9ub2RlKGJ1cy0+c2VsZik7Ci0JaG9zdCA9IHBjaV9idXNfdG9faG9zdChidXMpOwotCXJldHVybiBob3N0ID8gaG9zdC0+ZG4gOiBOVUxMOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBpc2FfdmFkZHJfaXNfaW9wb3J0KHZvaWQgX19pb21lbSAqYWRkcmVzcykKIHsKIAkvKiBObyBzcGVjaWZpYyBJU0EgaGFuZGxpbmcgb24gcHBjMzIgYXQgdGhpcyBzdGFnZSwgaXQKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wY2kuaAppbmRleCBiYTY1Y2Y0Li4xZGQ5ZDZiIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcGNpLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3BjaS5oCkBAIC00MCw4ICs0MCw3IEBACiAgKiBTZXQgdGhpcyB0byAxIGlmIHlvdSB3YW50IHRoZSBrZXJuZWwgdG8gcmUtYXNzaWduIGFsbCBQQ0kKICAqIGJ1cyBudW1iZXJzIChkb24ndCBkbyB0aGF0IG9uIHBwYzY0IHlldCAhKQogICovCi0jZGVmaW5lIHBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKSBcCi0JKHBjaV9oYXNfZmxhZyhQQ0lfUkVBU1NJR05fQUxMX0JVUykpCisjZGVmaW5lIHBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKQkwCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wcm9tLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcHJvbS5oCmluZGV4IGQwODkwZDMuLjliZDAxZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wcm9tLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3Byb20uaApAQCAtMjksMjEgKzI5LDYgQEAKIGV4dGVybiBpbnQgZWFybHlfdWFydGxpdGVfY29uc29sZSh2b2lkKTsKIGV4dGVybiBpbnQgZWFybHlfdWFydDE2NTUwX2NvbnNvbGUodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfUENJCi0vKgotICogUENJIDwtPiBPRiBtYXRjaGluZyBmdW5jdGlvbnMKLSAqIChYWFggc2hvdWxkIHRoZXNlIGJlIGhlcmU/KQotICovCi1zdHJ1Y3QgcGNpX2J1czsKLXN0cnVjdCBwY2lfZGV2OwotZXh0ZXJuIGludCBwY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0JCQkJCXU4ICpidXMsIHU4ICpkZXZmbik7Ci1leHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpwY2lfYnVzZGV2X3RvX09GX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cywKLQkJCQkJCQlpbnQgZGV2Zm4pOwotZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpX2RldmljZV90b19PRl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgcGNpX2NyZWF0ZV9PRl9idXNfbWFwKHZvaWQpOwotI2VuZGlmCi0KIC8qCiAgKiBPRiBhZGRyZXNzIHJldHJlaXZhbCAmIHRyYW5zbGF0aW9uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL21vZHVsZS5jCmluZGV4IDBlNzNmNjYuLjE0MjQyNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9tb2R1bGUuYwpAQCAtMTgsMzcgKzE4LDYgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKLXZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jdm9pZCAqcmV0OwotCXJldCA9IChzaXplID09IDApID8gTlVMTCA6IHZtYWxsb2Moc2l6ZSk7Ci0JcHJfZGVidWcoIm1vZHVsZV9hbGxvYyAoJTA4bHhAJTA4bHgpXG4iLCBzaXplLCAodW5zaWduZWQgbG9uZyBpbnQpcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgdm9pZCAqcmVnaW9uKQotewotCXByX2RlYnVnKCJtb2R1bGVfZnJlZSglcywlMDhseClcbiIsIG1vZHVsZS0+bmFtZSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpcmVnaW9uKTsKLQl2ZnJlZShyZWdpb24pOwotfQotCi1pbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLAotCQkJCUVsZl9TaGRyICpzZWNoZHJzLAotCQkJCWNoYXIgKnNlY3N0cmluZ3MsCi0JCQkJc3RydWN0IG1vZHVsZSAqbW9kKQotewotCXJldHVybiAwOwotfQotCi1pbnQgYXBwbHlfcmVsb2NhdGUoRWxmMzJfU2hkciAqc2VjaGRycywgY29uc3QgY2hhciAqc3RydGFiLAotCXVuc2lnbmVkIGludCBzeW1pbmRleCwgdW5zaWduZWQgaW50IHJlbHNlYywgc3RydWN0IG1vZHVsZSAqbW9kdWxlKQotewotCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBBREQgUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwKLQkJbW9kdWxlLT5uYW1lKTsKLQlyZXR1cm4gLUVOT0VYRUM7Ci19Ci0KIGludCBhcHBseV9yZWxvY2F0ZV9hZGQoRWxmMzJfU2hkciAqc2VjaGRycywgY29uc3QgY2hhciAqc3RydGFiLAogCXVuc2lnbmVkIGludCBzeW1pbmRleCwgdW5zaWduZWQgaW50IHJlbHNlYywgc3RydWN0IG1vZHVsZSAqbW9kdWxlKQogewpAQCAtMTU1LDcgKzEyNCwzIEBACiAJZmx1c2hfZGNhY2hlKCk7CiAJcmV0dXJuIDA7CiB9Ci0KLXZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvcGNpL01ha2VmaWxlIGIvYXJjaC9taWNyb2JsYXplL3BjaS9NYWtlZmlsZQppbmRleCA5ODg5Y2MyLi5kMTExNGZiIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvcGNpL01ha2VmaWxlCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvTWFrZWZpbGUKQEAgLTIsNSArMiw1IEBACiAjIE1ha2VmaWxlCiAjCiAKLW9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2lfMzIubyBwY2ktY29tbW9uLm8gaW5kaXJlY3RfcGNpLm8gaW9tYXAubworb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS1jb21tb24ubyBpbmRpcmVjdF9wY2kubyBpb21hcC5vCiBvYmotJChDT05GSUdfUENJX1hJTElOWCkJKz0geGlsaW54X3BjaS5vCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCmluZGV4IDUzNTk5MDYuLjRjZmFlMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCkBAIC01MCw2ICs1MCwxMSBAQAogCiBzdGF0aWMgc3RydWN0IGRtYV9tYXBfb3BzICpwY2lfZG1hX29wcyA9ICZkbWFfZGlyZWN0X29wczsKIAordW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZTsKK3Vuc2lnbmVkIGxvbmcgcGNpX2RyYW1fb2Zmc2V0Oworc3RhdGljIGludCBwY2lfYnVzX2NvdW50OworCisKIHZvaWQgc2V0X3BjaV9kbWFfb3BzKHN0cnVjdCBkbWFfbWFwX29wcyAqZG1hX29wcykKIHsKIAlwY2lfZG1hX29wcyA9IGRtYV9vcHM7CkBAIC04OSw3ICs5NCw3IEBACiAKIHN0YXRpYyByZXNvdXJjZV9zaXplX3QgcGNpYmlvc19pb19zaXplKGNvbnN0IHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKIHsKLQlyZXR1cm4gaG9zZS0+aW9fcmVzb3VyY2UuZW5kIC0gaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKyAxOworCXJldHVybiByZXNvdXJjZV9zaXplKCZob3NlLT5pb19yZXNvdXJjZSk7CiB9CiAKIGludCBwY2liaW9zX3ZhZGRyX2lzX2lvcG9ydCh2b2lkIF9faW9tZW0gKmFkZHJlc3MpCkBAIC0xNTU4LDYgKzE1NjMsMTEyIEBACiAJCSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBfSU9fQkFTRSk7CiB9CiAKK3N0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpYmlvc19nZXRfcGhiX29mX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CisKKwlyZXR1cm4gb2Zfbm9kZV9nZXQoaG9zZS0+ZG4pOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpYmlvc19zY2FuX3BoYihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBob3NlLT5kbjsKKwl1bnNpZ25lZCBsb25nIGlvX29mZnNldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZob3NlLT5pb19yZXNvdXJjZTsKKworCXByX2RlYnVnKCJQQ0k6IFNjYW5uaW5nIFBIQiAlc1xuIiwKKwkJIG5vZGUgPyBub2RlLT5mdWxsX25hbWUgOiAiPE5PIE5BTUU+Iik7CisKKwkvKiBDcmVhdGUgYW4gZW1wdHkgYnVzIGZvciB0aGUgdG9wbGV2ZWwgKi8KKwlidXMgPSBwY2lfY3JlYXRlX2J1cyhob3NlLT5wYXJlbnQsIGhvc2UtPmZpcnN0X2J1c25vLCBob3NlLT5vcHMsIGhvc2UpOworCWlmIChidXMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBjcmVhdGUgYnVzIGZvciBQQ0kgZG9tYWluICUwNHhcbiIsCisJCSAgICAgICBob3NlLT5nbG9iYWxfbnVtYmVyKTsKKwkJcmV0dXJuOworCX0KKwlidXMtPnNlY29uZGFyeSA9IGhvc2UtPmZpcnN0X2J1c25vOworCWhvc2UtPmJ1cyA9IGJ1czsKKworCS8qIEZpeHVwIElPIHNwYWNlIG9mZnNldCAqLworCWlvX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIGlzYV9pb19iYXNlOworCXJlcy0+c3RhcnQgPSAocmVzLT5zdGFydCArIGlvX29mZnNldCkgJiAweGZmZmZmZmZmdTsKKwlyZXMtPmVuZCA9IChyZXMtPmVuZCArIGlvX29mZnNldCkgJiAweGZmZmZmZmZmdTsKKworCS8qIFdpcmUgdXAgUEhCIGJ1cyByZXNvdXJjZXMgKi8KKwlwY2liaW9zX3NldHVwX3BoYl9yZXNvdXJjZXMoaG9zZSk7CisKKwkvKiBTY2FuIGNoaWxkcmVuICovCisJaG9zZS0+bGFzdF9idXNubyA9IGJ1cy0+c3Vib3JkaW5hdGUgPSBwY2lfc2Nhbl9jaGlsZF9idXMoYnVzKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcGNpYmlvc19pbml0KHZvaWQpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOworCWludCBuZXh0X2J1c25vID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIlBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmVcbiIpOworCisJLyogU2NhbiBhbGwgb2YgdGhlIHJlY29yZGVkIFBDSSBjb250cm9sbGVycy4gICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKSB7CisJCWhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOworCQlwY2liaW9zX3NjYW5fcGhiKGhvc2UpOworCQlwcmludGsoS0VSTl9JTkZPICJjYWxsaW5nIHBjaV9idXNfYWRkX2RldmljZXMoKVxuIik7CisJCXBjaV9idXNfYWRkX2RldmljZXMoaG9zZS0+YnVzKTsKKwkJaWYgKG5leHRfYnVzbm8gPD0gaG9zZS0+bGFzdF9idXNubykKKwkJCW5leHRfYnVzbm8gPSBob3NlLT5sYXN0X2J1c25vICsgMTsKKwl9CisJcGNpX2J1c19jb3VudCA9IG5leHRfYnVzbm87CisKKwkvKiBDYWxsIGNvbW1vbiBjb2RlIHRvIGhhbmRsZSByZXNvdXJjZSBhbGxvY2F0aW9uICovCisJcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkoKTsKKworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwocGNpYmlvc19pbml0KTsKKworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGNpX2J1c190b19ob3NlKGludCBidXMpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKQorCQlpZiAoYnVzID49IGhvc2UtPmZpcnN0X2J1c25vICYmIGJ1cyA8PSBob3NlLT5sYXN0X2J1c25vKQorCQkJcmV0dXJuIGhvc2U7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFByb3ZpZGUgaW5mb3JtYXRpb24gb24gbG9jYXRpb25zIG9mIHZhcmlvdXMgSS9PIHJlZ2lvbnMgaW4gcGh5c2ljYWwKKyAqIG1lbW9yeS4gIERvIHRoaXMgb24gYSBwZXItY2FyZCBiYXNpcyBzbyB0aGF0IHdlIGNob29zZSB0aGUgcmlnaHQKKyAqIHJvb3QgYnJpZGdlLgorICogTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBJTyBvciBtZW1vcnkgYmFzZSBpcyBhIHBoeXNpY2FsIGFkZHJlc3MKKyAqLworCitsb25nIHN5c19wY2ljb25maWdfaW9iYXNlKGxvbmcgd2hpY2gsIHVuc2lnbmVkIGxvbmcgYnVzLCB1bnNpZ25lZCBsb25nIGRldmZuKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlsb25nIHJlc3VsdCA9IC1FT1BOT1RTVVBQOworCisJaG9zZSA9IHBjaV9idXNfdG9faG9zZShidXMpOworCWlmICghaG9zZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKHdoaWNoKSB7CisJY2FzZSBJT0JBU0VfQlJJREdFX05VTUJFUjoKKwkJcmV0dXJuIChsb25nKWhvc2UtPmZpcnN0X2J1c25vOworCWNhc2UgSU9CQVNFX01FTU9SWToKKwkJcmV0dXJuIChsb25nKWhvc2UtPnBjaV9tZW1fb2Zmc2V0OworCWNhc2UgSU9CQVNFX0lPOgorCQlyZXR1cm4gKGxvbmcpaG9zZS0+aW9fYmFzZV9waHlzOworCWNhc2UgSU9CQVNFX0lTQV9JTzoKKwkJcmV0dXJuIChsb25nKWlzYV9pb19iYXNlOworCWNhc2UgSU9CQVNFX0lTQV9NRU06CisJCXJldHVybiAobG9uZylpc2FfbWVtX2Jhc2U7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoKICAqIE51bGwgUENJIGNvbmZpZyBhY2Nlc3MgZnVuY3Rpb25zLCBmb3IgdGhlIGNhc2Ugd2hlbiB3ZSBjYW4ndAogICogZmluZCBhIGhvc2UuCkBAIC0xNjI2LDMgKzE3MzcsNCBAQAogewogCXJldHVybiBwY2lfYnVzX2ZpbmRfY2FwYWJpbGl0eShmYWtlX3BjaV9idXMoaG9zZSwgYnVzKSwgZGV2Zm4sIGNhcCk7CiB9CisKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpXzMyLmMgYi9hcmNoL21pY3JvYmxhemUvcGNpL3BjaV8zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjcyOGE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpXzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotLyoKLSAqIENvbW1vbiBwbWFjL3ByZXAvY2hycCBwY2kgcm91dGluZXMuIC0tIENvcnQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI3VuZGVmIERFQlVHCi0KLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2U7Ci11bnNpZ25lZCBsb25nIHBjaV9kcmFtX29mZnNldDsKLWludCBwY2liaW9zX2Fzc2lnbl9idXNfb2Zmc2V0ID0gMTsKLQotc3RhdGljIHU4ICpwY2lfdG9fT0ZfYnVzX21hcDsKLQotLyogQnkgZGVmYXVsdCwgd2UgZG9uJ3QgcmUtYXNzaWduIGJ1cyBudW1iZXJzLiBXZSBkbyB0aGlzIG9ubHkgb24KLSAqIHNvbWUgcG1hY3MKLSAqLwotc3RhdGljIGludCBwY2lfYXNzaWduX2FsbF9idXNlczsKLQotc3RhdGljIGludCBwY2lfYnVzX2NvdW50OwotCi0vKgotICogRnVuY3Rpb25zIGJlbG93IGFyZSB1c2VkIG9uIE9wZW5GaXJtd2FyZSBtYWNoaW5lcy4KLSAqLwotc3RhdGljIHZvaWQKLW1ha2Vfb25lX25vZGVfbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgdTggcGNpX2J1cykKLXsKLQljb25zdCBpbnQgKmJ1c19yYW5nZTsKLQlpbnQgbGVuOwotCi0JaWYgKHBjaV9idXMgPj0gcGNpX2J1c19jb3VudCkKLQkJcmV0dXJuOwotCWJ1c19yYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiYnVzLXJhbmdlIiwgJmxlbik7Ci0JaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgIgotCQkgICAgICAgImFzc3VtaW5nIGl0IHN0YXJ0cyBhdCAwXG4iLCBub2RlLT5mdWxsX25hbWUpOwotCQlwY2lfdG9fT0ZfYnVzX21hcFtwY2lfYnVzXSA9IDA7Ci0JfSBlbHNlCi0JCXBjaV90b19PRl9idXNfbWFwW3BjaV9idXNdID0gYnVzX3JhbmdlWzBdOwotCi0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShub2RlLCBub2RlKSB7Ci0JCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCAqY2xhc3NfY29kZSwgKnJlZzsKLQotCQljbGFzc19jb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJjbGFzcy1jb2RlIiwgTlVMTCk7Ci0JCWlmICghY2xhc3NfY29kZSB8fAotCQkJKCgqY2xhc3NfY29kZSA+PiA4KSAhPSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSAmJgotCQkJKCpjbGFzc19jb2RlID4+IDgpICE9IFBDSV9DTEFTU19CUklER0VfQ0FSREJVUykpCi0JCQljb250aW51ZTsKLQkJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJyZWciLCBOVUxMKTsKLQkJaWYgKCFyZWcpCi0JCQljb250aW51ZTsKLQkJZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QocGNpX2J1cywgKChyZWdbMF0gPj4gOCkgJiAweGZmKSk7Ci0JCWlmICghZGV2IHx8ICFkZXYtPnN1Ym9yZGluYXRlKSB7Ci0JCQlwY2lfZGV2X3B1dChkZXYpOwotCQkJY29udGludWU7Ci0JCX0KLQkJbWFrZV9vbmVfbm9kZV9tYXAobm9kZSwgZGV2LT5zdWJvcmRpbmF0ZS0+bnVtYmVyKTsKLQkJcGNpX2Rldl9wdXQoZGV2KTsKLQl9Ci19Ci0KLXZvaWQKLXBjaWJpb3NfbWFrZV9PRl9idXNfbWFwKHZvaWQpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwotCXN0cnVjdCBwcm9wZXJ0eSAqbWFwX3Byb3A7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkbjsKLQotCXBjaV90b19PRl9idXNfbWFwID0ga21hbGxvYyhwY2lfYnVzX2NvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjaV90b19PRl9idXNfbWFwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgYWxsb2NhdGUgT0YgYnVzIG1hcCAhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFdlIGZpbGwgdGhlIGJ1cyBtYXAgd2l0aCBpbnZhbGlkIHZhbHVlcywgdGhhdCBoZWxwcwotCSAqIGRlYnVnZ2luZy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGNpX2J1c19jb3VudDsgaSsrKQotCQlwY2lfdG9fT0ZfYnVzX21hcFtpXSA9IDB4ZmY7Ci0KLQkvKiBGb3IgZWFjaCBob3NlLCB3ZSBiZWdpbiBzZWFyY2hpbmcgYnJpZGdlcyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBob3NlLT5kbjsKLQotCQlpZiAoIW5vZGUpCi0JCQljb250aW51ZTsKLQkJbWFrZV9vbmVfbm9kZV9tYXAobm9kZSwgaG9zZS0+Zmlyc3RfYnVzbm8pOwotCX0KLQlkbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7Ci0JbWFwX3Byb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRuLCAicGNpLU9GLWJ1cy1tYXAiLCBOVUxMKTsKLQlpZiAobWFwX3Byb3ApIHsKLQkJQlVHX09OKHBjaV9idXNfY291bnQgPiBtYXBfcHJvcC0+bGVuZ3RoKTsKLQkJbWVtY3B5KG1hcF9wcm9wLT52YWx1ZSwgcGNpX3RvX09GX2J1c19tYXAsIHBjaV9idXNfY291bnQpOwotCX0KLQlvZl9ub2RlX3B1dChkbik7Ci0jaWZkZWYgREVCVUcKLQlwcmludGsoS0VSTl9JTkZPICJQQ0ktPk9GIGJ1cyBtYXA6XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGNpX2J1c19jb3VudDsgaSsrKSB7Ci0JCWlmIChwY2lfdG9fT0ZfYnVzX21hcFtpXSA9PSAweGZmKQotCQkJY29udGludWU7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVkIC0+ICVkXG4iLCBpLCBwY2lfdG9fT0ZfYnVzX21hcFtpXSk7Ci0JfQotI2VuZGlmCi19Ci0KLXR5cGVkZWYgaW50ICgqcGNpX09GX3NjYW5faXRlcmF0b3IpKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgdm9pZCAqZGF0YSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKnNjYW5fT0ZfcGNpX2NoaWxkcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwKLQkJCQkJcGNpX09GX3NjYW5faXRlcmF0b3IgZmlsdGVyLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnN1Yl9ub2RlOwotCi0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShwYXJlbnQsIG5vZGUpIHsKLQkJY29uc3QgdW5zaWduZWQgaW50ICpjbGFzc19jb2RlOwotCi0JCWlmIChmaWx0ZXIobm9kZSwgZGF0YSkpIHsKLQkJCW9mX25vZGVfcHV0KG5vZGUpOwotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQotCQkvKiBGb3IgUENJPC0+UENJIGJyaWRnZXMgb3IgQ2FyZEJ1cyBicmlkZ2VzLCB3ZSBnbyBkb3duCi0JCSAqIE5vdGU6IHNvbWUgT0ZzIGNyZWF0ZSBhIHBhcmVudCBub2RlICJtdWx0aWZ1bmMtZGV2aWNlIiBhcwotCQkgKiBhIGZha2Ugcm9vdCBmb3IgYWxsIGZ1bmN0aW9ucyBvZiBhIG11bHRpLWZ1bmN0aW9uIGRldmljZSwKLQkJICogd2UgZ28gZG93biB0aGVtIGFzIHdlbGwuCi0JCSAqLwotCQljbGFzc19jb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJjbGFzcy1jb2RlIiwgTlVMTCk7Ci0JCWlmICgoIWNsYXNzX2NvZGUgfHwKLQkJCSgoKmNsYXNzX2NvZGUgPj4gOCkgIT0gUENJX0NMQVNTX0JSSURHRV9QQ0kgJiYKLQkJCSgqY2xhc3NfY29kZSA+PiA4KSAhPSBQQ0lfQ0xBU1NfQlJJREdFX0NBUkRCVVMpKSAmJgotCQkJc3RyY21wKG5vZGUtPm5hbWUsICJtdWx0aWZ1bmMtZGV2aWNlIikpCi0JCQljb250aW51ZTsKLQkJc3ViX25vZGUgPSBzY2FuX09GX3BjaV9jaGlsZHMobm9kZSwgZmlsdGVyLCBkYXRhKTsKLQkJaWYgKHN1Yl9ub2RlKSB7Ci0JCQlvZl9ub2RlX3B1dChub2RlKTsKLQkJCXJldHVybiBzdWJfbm9kZTsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqc2Nhbl9PRl9mb3JfcGNpX2RldihzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkZXZmbikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqY25wOwotCWNvbnN0IHUzMiAqcmVnOwotCXVuc2lnbmVkIGludCBwc2l6ZTsKLQotCWZvcl9lYWNoX2NoaWxkX29mX25vZGUocGFyZW50LCBucCkgewotCQlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCAmcHNpemUpOwotCQlpZiAocmVnICYmIHBzaXplID49IDQgJiYgKChyZWdbMF0gPj4gOCkgJiAweGZmKSA9PSBkZXZmbikKLQkJCXJldHVybiBucDsKLQotCQkvKiBOb3RlOiBzb21lIE9GcyBjcmVhdGUgYSBwYXJlbnQgbm9kZSAibXVsdGlmdW5jLWRldmljZSIgYXMKLQkJICogYSBmYWtlIHJvb3QgZm9yIGFsbCBmdW5jdGlvbnMgb2YgYSBtdWx0aS1mdW5jdGlvbiBkZXZpY2UsCi0JCSAqIHdlIGdvIGRvd24gdGhlbSBhcyB3ZWxsLiAqLwotCQlpZiAoIXN0cmNtcChucC0+bmFtZSwgIm11bHRpZnVuYy1kZXZpY2UiKSkgewotCQkJY25wID0gc2Nhbl9PRl9mb3JfcGNpX2RldihucCwgZGV2Zm4pOwotCQkJaWYgKGNucCkKLQkJCQlyZXR1cm4gY25wOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKnNjYW5fT0ZfZm9yX3BjaV9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwgKm5wOwotCi0JLyogQXJlIHdlIGEgcm9vdCBidXMgPyAqLwotCWlmIChidXMtPnNlbGYgPT0gTlVMTCB8fCBidXMtPnBhcmVudCA9PSBOVUxMKSB7Ci0JCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOwotCQlpZiAoaG9zZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiBvZl9ub2RlX2dldChob3NlLT5kbik7Ci0JfQotCi0JLyogbm90IGEgcm9vdCBidXMsIHdlIG5lZWQgdG8gZ2V0IG91ciBwYXJlbnQgKi8KLQlwYXJlbnQgPSBzY2FuX09GX2Zvcl9wY2lfYnVzKGJ1cy0+cGFyZW50KTsKLQlpZiAocGFyZW50ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JLyogbm93IGl0ZXJhdGUgZm9yIGNoaWxkcmVuIGZvciBhIG1hdGNoICovCi0JbnAgPSBzY2FuX09GX2Zvcl9wY2lfZGV2KHBhcmVudCwgYnVzLT5zZWxmLT5kZXZmbik7Ci0Jb2Zfbm9kZV9wdXQocGFyZW50KTsKLQotCXJldHVybiBucDsKLX0KLQotLyoKLSAqIFNjYW5zIHRoZSBPRiB0cmVlIGZvciBhIGRldmljZSBub2RlIG1hdGNoaW5nIGEgUENJIGRldmljZQotICovCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKgotcGNpX2J1c2Rldl90b19PRl9ub2RlKHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwgKm5wOwotCi0JcHJfZGVidWcoInBjaV9idXNkZXZfdG9fT0Zfbm9kZSglZCwweCV4KVxuIiwgYnVzLT5udW1iZXIsIGRldmZuKTsKLQlwYXJlbnQgPSBzY2FuX09GX2Zvcl9wY2lfYnVzKGJ1cyk7Ci0JaWYgKHBhcmVudCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwcl9kZWJ1ZygiIHBhcmVudCBpcyAlc1xuIiwgcGFyZW50ID8gcGFyZW50LT5mdWxsX25hbWUgOiAiPE5VTEw+Iik7Ci0JbnAgPSBzY2FuX09GX2Zvcl9wY2lfZGV2KHBhcmVudCwgZGV2Zm4pOwotCW9mX25vZGVfcHV0KHBhcmVudCk7Ci0JcHJfZGVidWcoIiByZXN1bHQgaXMgJXNcbiIsIG5wID8gbnAtPmZ1bGxfbmFtZSA6ICI8TlVMTD4iKTsKLQotCS8qIFhYWCBtb3N0IGNhbGxlcnMgZG9uJ3QgcmVsZWFzZSB0aGUgcmV0dXJuZWQgbm9kZQotCSAqIG1vc3RseSBiZWNhdXNlIHBwYzY0IGRvZXNuJ3QgaW5jcmVhc2UgdGhlIHJlZmNvdW50LAotCSAqIHdlIG5lZWQgdG8gZml4IHRoYXQuCi0JICovCi0JcmV0dXJuIG5wOwotfQotRVhQT1JUX1NZTUJPTChwY2lfYnVzZGV2X3RvX09GX25vZGUpOwotCi1zdHJ1Y3QgZGV2aWNlX25vZGUqCi1wY2lfZGV2aWNlX3RvX09GX25vZGUoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlyZXR1cm4gcGNpX2J1c2Rldl90b19PRl9ub2RlKGRldi0+YnVzLCBkZXYtPmRldmZuKTsKLX0KLUVYUE9SVF9TWU1CT0wocGNpX2RldmljZV90b19PRl9ub2RlKTsKLQotc3RhdGljIGludAotZmluZF9PRl9wY2lfZGV2aWNlX2ZpbHRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuICgodm9pZCAqKW5vZGUgPT0gZGF0YSk7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIHRoZSBQQ0kgZGV2aWNlIG1hdGNoaW5nIGEgZ2l2ZW4gT0Ygbm9kZQotICovCi1pbnQKLXBjaV9kZXZpY2VfZnJvbV9PRl9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgdTggKmJ1cywgdTggKmRldmZuKQotewotCWNvbnN0IHVuc2lnbmVkIGludCAqcmVnOwotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQotCS8qIE1ha2Ugc3VyZSBpdCdzIHJlYWxseSBhIFBDSSBkZXZpY2UgKi8KLQlob3NlID0gcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKG5vZGUpOwotCWlmICghaG9zZSB8fCAhaG9zZS0+ZG4pCi0JCXJldHVybiAtRU5PREVWOwotCWlmICghc2Nhbl9PRl9wY2lfY2hpbGRzKGhvc2UtPmRuLAotCQkJZmluZF9PRl9wY2lfZGV2aWNlX2ZpbHRlciwgKHZvaWQgKilub2RlKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJyZWciLCBOVUxMKTsKLQlpZiAoIXJlZykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JKmJ1cyA9IChyZWdbMF0gPj4gMTYpICYgMHhmZjsKLQkqZGV2Zm4gPSAoKHJlZ1swXSA+PiA4KSAmIDB4ZmYpOwotCi0JLyogT2ssIGhlcmUgd2UgbmVlZCBzb21lIHR3ZWFrLiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVudW1iZXJlZAotCSAqIGFsbCBidXNzZXMsIHdlIGNhbid0IHJlbHkgb24gdGhlIE9GIGJ1cyBudW1iZXIgYW55IG1vcmUuCi0JICogdGhlIHBjaV90b19PRl9idXNfbWFwIGlzIG5vdCBlbm91Z2ggYXMgc2V2ZXJhbCBQQ0kgYnVzc2VzCi0JICogbWF5IG1hdGNoIHRoZSBzYW1lIE9GIGJ1cyBudW1iZXIuCi0JICovCi0JaWYgKCFwY2lfdG9fT0ZfYnVzX21hcCkKLQkJcmV0dXJuIDA7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikKLQkJaWYgKHBjaV90b19PRl9idXNfbWFwW2Rldi0+YnVzLT5udW1iZXJdID09ICpidXMgJiYKLQkJCQlkZXYtPmRldmZuID09ICpkZXZmbikgewotCQkJKmJ1cyA9IGRldi0+YnVzLT5udW1iZXI7Ci0JCQlwY2lfZGV2X3B1dChkZXYpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCXJldHVybiAtRU5PREVWOwotfQotRVhQT1JUX1NZTUJPTChwY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZSk7Ci0KLS8qIFdlIGNyZWF0ZSB0aGUgInBjaS1PRi1idXMtbWFwIiBwcm9wZXJ0eSBub3cgc28gaXQgYXBwZWFycyBpbiB0aGUKLSAqIC9wcm9jIGRldmljZSB0cmVlCi0gKi8KLXZvaWQgX19pbml0Ci1wY2lfY3JlYXRlX09GX2J1c19tYXAodm9pZCkKLXsKLQlzdHJ1Y3QgcHJvcGVydHkgKm9mX3Byb3A7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkbjsKLQotCW9mX3Byb3AgPSAoc3RydWN0IHByb3BlcnR5ICopIGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCBwcm9wZXJ0eSkgKyBcCi0JCQkJCQkJCQkgMjU2KTsKLQlpZiAoIW9mX3Byb3ApCi0JCXJldHVybjsKLQlkbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7Ci0JaWYgKGRuKSB7Ci0JCW1lbXNldChvZl9wcm9wLCAtMSwgc2l6ZW9mKHN0cnVjdCBwcm9wZXJ0eSkgKyAyNTYpOwotCQlvZl9wcm9wLT5uYW1lID0gInBjaS1PRi1idXMtbWFwIjsKLQkJb2ZfcHJvcC0+bGVuZ3RoID0gMjU2OwotCQlvZl9wcm9wLT52YWx1ZSA9ICZvZl9wcm9wWzFdOwotCQlwcm9tX2FkZF9wcm9wZXJ0eShkbiwgb2ZfcHJvcCk7Ci0JCW9mX25vZGVfcHV0KGRuKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX3NjYW5fcGhiKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKLXsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IGhvc2UtPmRuOwotCXVuc2lnbmVkIGxvbmcgaW9fb2Zmc2V0OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmhvc2UtPmlvX3Jlc291cmNlOwotCi0JcHJfZGVidWcoIlBDSTogU2Nhbm5pbmcgUEhCICVzXG4iLAotCQkgbm9kZSA/IG5vZGUtPmZ1bGxfbmFtZSA6ICI8Tk8gTkFNRT4iKTsKLQotCS8qIENyZWF0ZSBhbiBlbXB0eSBidXMgZm9yIHRoZSB0b3BsZXZlbCAqLwotCWJ1cyA9IHBjaV9jcmVhdGVfYnVzKGhvc2UtPnBhcmVudCwgaG9zZS0+Zmlyc3RfYnVzbm8sIGhvc2UtPm9wcywgaG9zZSk7Ci0JaWYgKGJ1cyA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGNyZWF0ZSBidXMgZm9yIFBDSSBkb21haW4gJTA0eFxuIiwKLQkJICAgICAgIGhvc2UtPmdsb2JhbF9udW1iZXIpOwotCQlyZXR1cm47Ci0JfQotCWJ1cy5kZXYtPm9mX25vZGUgPSBvZl9ub2RlX2dldChub2RlKTsKLQlidXMtPnNlY29uZGFyeSA9IGhvc2UtPmZpcnN0X2J1c25vOwotCWhvc2UtPmJ1cyA9IGJ1czsKLQotCS8qIEZpeHVwIElPIHNwYWNlIG9mZnNldCAqLwotCWlvX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIGlzYV9pb19iYXNlOwotCXJlcy0+c3RhcnQgPSAocmVzLT5zdGFydCArIGlvX29mZnNldCkgJiAweGZmZmZmZmZmdTsKLQlyZXMtPmVuZCA9IChyZXMtPmVuZCArIGlvX29mZnNldCkgJiAweGZmZmZmZmZmdTsKLQotCS8qIFdpcmUgdXAgUEhCIGJ1cyByZXNvdXJjZXMgKi8KLQlwY2liaW9zX3NldHVwX3BoYl9yZXNvdXJjZXMoaG9zZSk7Ci0KLQkvKiBTY2FuIGNoaWxkcmVuICovCi0JaG9zZS0+bGFzdF9idXNubyA9IGJ1cy0+c3Vib3JkaW5hdGUgPSBwY2lfc2Nhbl9jaGlsZF9idXMoYnVzKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcGNpYmlvc19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwotCWludCBuZXh0X2J1c25vID0gMDsKLQotCXByaW50ayhLRVJOX0lORk8gIlBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmVcbiIpOwotCi0JaWYgKHBjaV9mbGFncyAmIFBDSV9SRUFTU0lHTl9BTExfQlVTKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInNldHRpbmcgcGNpX2FzaWduX2FsbF9idXNzZXNcbiIpOwotCQlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7Ci0JfQotCi0JLyogU2NhbiBhbGwgb2YgdGhlIHJlY29yZGVkIFBDSSBjb250cm9sbGVycy4gICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKSB7Ci0JCWlmIChwY2lfYXNzaWduX2FsbF9idXNlcykKLQkJCWhvc2UtPmZpcnN0X2J1c25vID0gbmV4dF9idXNubzsKLQkJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7Ci0JCXBjaWJpb3Nfc2Nhbl9waGIoaG9zZSk7Ci0JCXByaW50ayhLRVJOX0lORk8gImNhbGxpbmcgcGNpX2J1c19hZGRfZGV2aWNlcygpXG4iKTsKLQkJcGNpX2J1c19hZGRfZGV2aWNlcyhob3NlLT5idXMpOwotCQlpZiAocGNpX2Fzc2lnbl9hbGxfYnVzZXMgfHwgbmV4dF9idXNubyA8PSBob3NlLT5sYXN0X2J1c25vKQotCQkJbmV4dF9idXNubyA9IGhvc2UtPmxhc3RfYnVzbm8gKyBcCi0JCQkJCXBjaWJpb3NfYXNzaWduX2J1c19vZmZzZXQ7Ci0JfQotCXBjaV9idXNfY291bnQgPSBuZXh0X2J1c25vOwotCi0JLyogT3BlbkZpcm13YXJlIGJhc2VkIG1hY2hpbmVzIG5lZWQgYSBtYXAgb2YgT0YgYnVzCi0JICogbnVtYmVycyB2cy4ga2VybmVsIGJ1cyBudW1iZXJzIHNpbmNlIHdlIG1heSBoYXZlIHRvCi0JICogcmVtYXAgdGhlbS4KLQkgKi8KLQlpZiAocGNpX2Fzc2lnbl9hbGxfYnVzZXMpCi0JCXBjaWJpb3NfbWFrZV9PRl9idXNfbWFwKCk7Ci0KLQkvKiBDYWxsIGNvbW1vbiBjb2RlIHRvIGhhbmRsZSByZXNvdXJjZSBhbGxvY2F0aW9uICovCi0JcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkoKTsKLQotCXJldHVybiAwOwotfQotCi1zdWJzeXNfaW5pdGNhbGwocGNpYmlvc19pbml0KTsKLQotc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlcioKLXBjaV9idXNfdG9faG9zZShpbnQgYnVzKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkKLQkJaWYgKGJ1cyA+PSBob3NlLT5maXJzdF9idXNubyAmJiBidXMgPD0gaG9zZS0+bGFzdF9idXNubykKLQkJCXJldHVybiBob3NlOwotCXJldHVybiBOVUxMOwotfQotCi0vKiBQcm92aWRlIGluZm9ybWF0aW9uIG9uIGxvY2F0aW9ucyBvZiB2YXJpb3VzIEkvTyByZWdpb25zIGluIHBoeXNpY2FsCi0gKiBtZW1vcnkuICBEbyB0aGlzIG9uIGEgcGVyLWNhcmQgYmFzaXMgc28gdGhhdCB3ZSBjaG9vc2UgdGhlIHJpZ2h0Ci0gKiByb290IGJyaWRnZS4KLSAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgSU8gb3IgbWVtb3J5IGJhc2UgaXMgYSBwaHlzaWNhbCBhZGRyZXNzCi0gKi8KLQotbG9uZyBzeXNfcGNpY29uZmlnX2lvYmFzZShsb25nIHdoaWNoLCB1bnNpZ25lZCBsb25nIGJ1cywgdW5zaWduZWQgbG9uZyBkZXZmbikKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7Ci0JbG9uZyByZXN1bHQgPSAtRU9QTk9UU1VQUDsKLQotCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jc3dpdGNoICh3aGljaCkgewotCWNhc2UgSU9CQVNFX0JSSURHRV9OVU1CRVI6Ci0JCXJldHVybiAobG9uZylob3NlLT5maXJzdF9idXNubzsKLQljYXNlIElPQkFTRV9NRU1PUlk6Ci0JCXJldHVybiAobG9uZylob3NlLT5wY2lfbWVtX29mZnNldDsKLQljYXNlIElPQkFTRV9JTzoKLQkJcmV0dXJuIChsb25nKWhvc2UtPmlvX2Jhc2VfcGh5czsKLQljYXNlIElPQkFTRV9JU0FfSU86Ci0JCXJldHVybiAobG9uZylpc2FfaW9fYmFzZTsKLQljYXNlIElPQkFTRV9JU0FfTUVNOgotCQlyZXR1cm4gKGxvbmcpaXNhX21lbV9iYXNlOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZyBiL2FyY2gvbWlwcy9LY29uZmlnCmluZGV4IDY1M2RhNjIuLjE3N2NkYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnCkBAIC0xODUsNiArMTg1LDcgQEAKIAlzZWxlY3QgQ1NSQ19SNEsKIAlzZWxlY3QgREVGQVVMVF9TR0lfUEFSVElUSU9OIGlmIENQVV9CSUdfRU5ESUFOCiAJc2VsZWN0IEdFTkVSSUNfSVNBX0RNQQorCXNlbGVjdCBIQVZFX1BDU1BLUl9QTEFURk9STQogCXNlbGVjdCBJUlFfQ1BVCiAJc2VsZWN0IEk4MjUzCiAJc2VsZWN0IEk4MjU5CkBAIC0yNjYsNiArMjY3LDcgQEAKIAlzZWxlY3QgQ1NSQ19SNEsKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEdFTkVSSUNfSVNBX0RNQQorCXNlbGVjdCBIQVZFX1BDU1BLUl9QTEFURk9STQogCXNlbGVjdCBJUlFfQ1BVCiAJc2VsZWN0IElSUV9HSUMKIAlzZWxlY3QgSFdfSEFTX1BDSQpAQCAtNjQwLDYgKzY0Miw3IEBACiAJc2VsZWN0IERFRkFVTFRfU0dJX1BBUlRJVElPTiBpZiBDUFVfQklHX0VORElBTgogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgR0VORVJJQ19JU0FfRE1BCisJc2VsZWN0IEhBVkVfUENTUEtSX1BMQVRGT1JNCiAJc2VsZWN0IEhXX0hBU19FSVNBCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgSVJRX0NQVQpAQCAtMjM4OCw2ICsyMzkxLDcgQEAKIGNvbmZpZyBJODI1MwogCWJvb2wKIAlzZWxlY3QgQ0xLU1JDX0k4MjUzCisJc2VsZWN0IENMS0VWVF9JODI1MwogCXNlbGVjdCBNSVBTX0VYVEVSTkFMX1RJTUVSCiAKIGNvbmZpZyBaT05FX0RNQTMyCkBAIC0yNDg5LDIwICsyNDkzLDQgQEAKIAogc291cmNlICJjcnlwdG8vS2NvbmZpZyIKIAotbWVudWNvbmZpZyBWSVJUVUFMSVpBVElPTgotCWJvb2wgIlZpcnR1YWxpemF0aW9uIgotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgdG8gZ2V0IHRvIHNlZSBvcHRpb25zIGZvciB1c2luZyB5b3VyIExpbnV4IGhvc3QgdG8gcnVuIG90aGVyCi0JICBvcGVyYXRpbmcgc3lzdGVtcyBpbnNpZGUgdmlydHVhbCBtYWNoaW5lcyAoZ3Vlc3RzKS4KLQkgIFRoaXMgb3B0aW9uIGFsb25lIGRvZXMgbm90IGFkZCBhbnkga2VybmVsIGNvZGUuCi0KLQkgIElmIHlvdSBzYXkgTiwgYWxsIG9wdGlvbnMgaW4gdGhpcyBzdWJtZW51IHdpbGwgYmUgc2tpcHBlZCBhbmQgZGlzYWJsZWQuCi0KLWlmIFZJUlRVQUxJWkFUSU9OCi0KLXNvdXJjZSBkcml2ZXJzL3ZpcnRpby9LY29uZmlnCi0KLWVuZGlmICMgVklSVFVBTElaQVRJT04KLQogc291cmNlICJsaWIvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jCmluZGV4IDczYjUyOWIuLmNmYWU4MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvc2V0dXAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEZsb3JpYW4gU2NoaXJtZXIgPGpvbHRAdHV4Ym94Lm9yZz4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDYgRmVsaXggRmlldGthdSA8bmJkQG9wZW53cnQub3JnPgotICogIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICogIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICogIENvcHlyaWdodCAoQykgMjAxMCBXYWxkZW1hciBCcm9ka29yYiA8d2J4QG9wZW5hZGsub3JnPgogICogIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEhhdWtlIE1laHJ0ZW5zIDxoYXVrZUBoYXVrZS1tLmRlPgogICoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvdGltZS5jIGIvYXJjaC9taXBzL2NvYmFsdC90aW1lLmMKaW5kZXggMDE2MmY5ZS4uM2JmZjNiOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvYmFsdC90aW1lLmMKKysrIGIvYXJjaC9taXBzL2NvYmFsdC90aW1lLmMKQEAgLTE3LDEwICsxNywxMCBAQAogICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCisjaW5jbHVkZSA8bGludXgvaTgyNTMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNpbmNsdWRlIDxhc20vZ3Q2NDEyMC5oPgotI2luY2x1ZGUgPGFzbS9pODI1My5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAKICNkZWZpbmUgR1Q2NDFYWF9CQVNFX0NMT0NLCTUwMDAwMDAwCS8qIDUwTUh6ICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9tdHgxX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL210eDFfZGVmY29uZmlnCmluZGV4IDM3ODYyYjIuLjgwN2M5N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL210eDFfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL210eDFfZGVmY29uZmlnCkBAIC02NzgsNyArNjc4LDcgQEAKIENPTkZJR19MRURTX1RSSUdHRVJfVElNRVI9eQogQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQ9eQogQ09ORklHX0xFRFNfVFJJR0dFUl9ERUZBVUxUX09OPXkKLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMPXkKIENPTkZJR19SVENfRFJWX1RFU1Q9bQogQ09ORklHX1JUQ19EUlZfRFMxMzA3PW0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mbG9wcHkuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mbG9wcHkuaAppbmRleCBjNWM3YzBlLi40NDU2YzljIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZmxvcHB5LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Zsb3BweS5oCkBAIC0yOSw3ICsyOSw3IEBACiAjZGVmaW5lIEZMT1BQWTBfVFlQRSAJCWZkX2RyaXZlX3R5cGUoMCkKICNkZWZpbmUgRkxPUFBZMV9UWVBFCQlmZF9kcml2ZV90eXBlKDEpCiAKLSNkZWZpbmUgRkRDMQkJCWZkX2dldGZkYWRkcjEoKTsKKyNkZWZpbmUgRkRDMQkJCWZkX2dldGZkYWRkcjEoKQogCiAjZGVmaW5lIE5fRkRDIDEJCQkvKiBkbyB5b3UgKnJlYWxseSogd2FudCBhIHNlY29uZCBjb250cm9sbGVyPyAqLwogI2RlZmluZSBOX0RSSVZFIDgKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pODI1My5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2k4MjUzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZDAxMTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2k4MjUzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogIE1hY2hpbmUgc3BlY2lmaWMgSU8gcG9ydCBhZGRyZXNzIGRlZmluaXRpb24gZm9yIGdlbmVyaWMuCi0gKiAgV3JpdHRlbiBieSBPc2FtdSBUb21pdGEgPHRvbWl0YUBjaW5ldC5jby5qcD4KLSAqLwotI2lmbmRlZiBfX0FTTV9JODI1M19ICi0jZGVmaW5lIF9fQVNNX0k4MjUzX0gKLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLS8qIGk4MjUzQSBQSVQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBJVF9NT0RFCQkweDQzCi0jZGVmaW5lIFBJVF9DSDAJCQkweDQwCi0jZGVmaW5lIFBJVF9DSDIJCQkweDQyCi0KLSNkZWZpbmUgUElUX0xBVENICQlMQVRDSAotCi1leHRlcm4gcmF3X3NwaW5sb2NrX3QgaTgyNTNfbG9jazsKLQotZXh0ZXJuIHZvaWQgc2V0dXBfcGl0X3RpbWVyKHZvaWQpOwotCi0jZGVmaW5lIGluYl9waXQgaW5iX3AKLSNkZWZpbmUgb3V0Yl9waXQgb3V0Yl9wCi0KLSNlbmRpZiAvKiBfX0FTTV9JODI1M19IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvZ3Bpby5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtano0NzQwL2dwaW8uaAppbmRleCA3Yjc0NzAzLi4xYTY0ODJlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qejQ3NDAvZ3Bpby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWp6NDc0MC9ncGlvLmgKQEAgLTI1LDE0ICsyNSwxMyBAQAogICAgIEpaX0dQSU9fRlVOQzMsCiB9OwogCi0KIC8qCiAgVXN1YWxseSBhIGRyaXZlciBmb3IgYSBTb0MgY29tcG9uZW50IGhhcyB0byByZXF1ZXN0IHNldmVyYWwgZ3BpbyBwaW5zIGFuZAogIGNvbmZpZ3VyZSB0aGVtIGFzIGZ1bmNpb24gcGlucy4KICBqel9ncGlvX2J1bGtfcmVxdWVzdCBjYW4gYmUgdXNlZCB0byBlYXNlIHRoaXMgcHJvY2Vzcy4KICBVc3VhbGx5IG9uZSB3b3VsZCBkbyBzb21ldGhpbmcgbGlrZToKIAotIGNvbnN0IHN0YXRpYyBzdHJ1Y3QganpfZ3Bpb19idWxrX3JlcXVlc3QgaTJjX3BpbnNbXSA9IHsKKyBzdGF0aWMgY29uc3Qgc3RydWN0IGp6X2dwaW9fYnVsa19yZXF1ZXN0IGkyY19waW5zW10gPSB7CiAJSlpfR1BJT19CVUxLX1BJTihJMkNfU0RBKSwKIAlKWl9HUElPX0JVTEtfUElOKEkyQ19TQ0spLAogIH07CkBAIC00Nyw4ICs0Niw4IEBACiAKICAgICBqel9ncGlvX2J1bGtfZnJlZShpMmNfcGlucywgQVJSQVlfU0laRShpMmNfcGlucykpOwogCi0KICovCisKIHN0cnVjdCBqel9ncGlvX2J1bGtfcmVxdWVzdCB7CiAJaW50IGdwaW87CiAJY29uc3QgY2hhciAqbmFtZTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zdGFja3RyYWNlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3RhY2t0cmFjZS5oCmluZGV4IDBiZjgyODEuLjc4MGVlMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zdGFja3RyYWNlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N0YWNrdHJhY2UuaApAQCAtNyw2ICs3LDEwIEBACiBleHRlcm4gaW50IHJhd19zaG93X3RyYWNlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdW53aW5kX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3AsCiAJCQkJICB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nICpyYSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB1bndpbmRfc3RhY2tfYnlfYWRkcmVzcyh1bnNpZ25lZCBsb25nIHN0YWNrX3BhZ2UsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqc3AsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBwYywKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nICpyYSk7CiAjZWxzZQogI2RlZmluZSByYXdfc2hvd190cmFjZSAxCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdW53aW5kX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qYXp6L2lycS5jIGIvYXJjaC9taXBzL2phenovaXJxLmMKaW5kZXggMjYwZGY0Ny4uY2E5YmQyMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2phenovaXJxLmMKKysrIGIvYXJjaC9taXBzL2phenovaXJxLmMKQEAgLTcsNiArNyw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTQgLSAyMDAxLCAyMDAzLCAwNyBSYWxmIEJhZWNobGUKICAqLwogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pODI1My5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTE1LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnFfY3B1Lmg+Ci0jaW5jbHVkZSA8YXNtL2k4MjUzLmg+CiAjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2phenouaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTMuYwppbmRleCAzOTEyMjFiLi5iZTRlZTdkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2k4MjUzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pODI1My5jCkBAIC0zLDk2ICszLDE2IEBACiAgKgogICovCiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTgyNTMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCi0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL2k4MjUzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KIAotREVGSU5FX1JBV19TUElOTE9DSyhpODI1M19sb2NrKTsKLUVYUE9SVF9TWU1CT0woaTgyNTNfbG9jayk7Ci0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBQSVQgdGltZXIuCi0gKgotICogVGhpcyBpcyBhbHNvIGNhbGxlZCBhZnRlciByZXN1bWUgdG8gYnJpbmcgdGhlIFBJVCBpbnRvIG9wZXJhdGlvbiBhZ2Fpbi4KLSAqLwotc3RhdGljIHZvaWQgaW5pdF9waXRfdGltZXIoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCi0JCQkgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi17Ci0JcmF3X3NwaW5fbG9jaygmaTgyNTNfbG9jayk7Ci0KLQlzd2l0Y2gobW9kZSkgewotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6Ci0JCS8qIGJpbmFyeSwgbW9kZSAyLCBMU0IvTVNCLCBjaCAwICovCi0JCW91dGJfcCgweDM0LCBQSVRfTU9ERSk7Ci0JCW91dGJfcChMQVRDSCAmIDB4ZmYgLCBQSVRfQ0gwKTsJLyogTFNCICovCi0JCW91dGIoTEFUQ0ggPj4gOCAsIFBJVF9DSDApOwkvKiBNU0IgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgotCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgotCQlpZiAoZXZ0LT5tb2RlID09IENMT0NLX0VWVF9NT0RFX1BFUklPRElDIHx8Ci0JCSAgICBldnQtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCkgewotCQkJb3V0Yl9wKDB4MzAsIFBJVF9NT0RFKTsKLQkJCW91dGJfcCgwLCBQSVRfQ0gwKTsKLQkJCW91dGJfcCgwLCBQSVRfQ0gwKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKLQkJLyogT25lIHNob3Qgc2V0dXAgKi8KLQkJb3V0Yl9wKDB4MzgsIFBJVF9NT0RFKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENMT0NLX0VWVF9NT0RFX1JFU1VNRToKLQkJLyogTm90aGluZyB0byBkbyBoZXJlICovCi0JCWJyZWFrOwotCX0KLQlyYXdfc3Bpbl91bmxvY2soJmk4MjUzX2xvY2spOwotfQotCi0vKgotICogUHJvZ3JhbSB0aGUgbmV4dCBldmVudCBpbiBvbmVzaG90IG1vZGUKLSAqCi0gKiBEZWx0YSBpcyBnaXZlbiBpbiBQSVQgdGlja3MKLSAqLwotc3RhdGljIGludCBwaXRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGRlbHRhLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi17Ci0JcmF3X3NwaW5fbG9jaygmaTgyNTNfbG9jayk7Ci0Jb3V0Yl9wKGRlbHRhICYgMHhmZiAsIFBJVF9DSDApOwkvKiBMU0IgKi8KLQlvdXRiKGRlbHRhID4+IDggLCBQSVRfQ0gwKTsJLyogTVNCICovCi0JcmF3X3NwaW5fdW5sb2NrKCZpODI1M19sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogT24gVVAgdGhlIFBJVCBjYW4gc2VydmUgYWxsIG9mIHRoZSBwb3NzaWJsZSB0aW1lciBmdW5jdGlvbnMuIE9uIFNNUCBzeXN0ZW1zCi0gKiBpdCBjYW4gYmUgc29sZWx5IHVzZWQgZm9yIHRoZSBnbG9iYWwgdGljay4KLSAqCi0gKiBUaGUgcHJvZmlsaW5nIGFuZCB1cGRhdGUgY2FwYWJpbGl0ZXMgYXJlIHN3aXRjaGVkIG9mZiBvbmNlIHRoZSBsb2NhbCBhcGljIGlzCi0gKiByZWdpc3RlcmVkLiBUaGlzIG1lY2hhbmlzbSByZXBsYWNlcyB0aGUgcHJldmlvdXMgI2lmZGVmIExPQ0FMX0FQSUMgLQotICogIXVzaW5nX2FwaWNfdGltZXIgZGVjaXNpb25zIGluIGRvX3RpbWVyX2ludGVycnVwdF9ob29rKCkKLSAqLwotc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgcGl0X2Nsb2NrZXZlbnQgPSB7Ci0JLm5hbWUJCT0gInBpdCIsCi0JLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAotCS5zZXRfbW9kZQk9IGluaXRfcGl0X3RpbWVyLAotCS5zZXRfbmV4dF9ldmVudCA9IHBpdF9uZXh0X2V2ZW50LAotCS5pcnEJCT0gMCwKLX07Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXBpdF9jbG9ja2V2ZW50LmV2ZW50X2hhbmRsZXIoJnBpdF9jbG9ja2V2ZW50KTsKKwlpODI1M19jbG9ja2V2ZW50LmV2ZW50X2hhbmRsZXIoJmk4MjUzX2Nsb2NrZXZlbnQpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMTAzLDI1ICsyMyw5IEBACiAJLm5hbWUgPSAidGltZXIiCiB9OwogCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgY29udmVyc2lvbiBmYWN0b3IgYW5kIHRoZSBtaW4vbWF4IGRlbHRhcyBvZiB0aGUgY2xvY2sgZXZlbnQKLSAqIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrIGV2ZW50IHNvdXJjZSB3aXRoIHRoZSBmcmFtZXdvcmsuCi0gKi8KIHZvaWQgX19pbml0IHNldHVwX3BpdF90aW1lcih2b2lkKQogewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNkID0gJnBpdF9jbG9ja2V2ZW50OwotCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQkvKgotCSAqIFN0YXJ0IHBpdCB3aXRoIHRoZSBib290IGNwdSBtYXNrIGFuZCBtYWtlIGl0IGdsb2JhbCBhZnRlciB0aGUKLQkgKiBJT19BUElDIGhhcyBiZWVuIGluaXRpYWxpemVkLgotCSAqLwotCWNkLT5jcHVtYXNrID0gY3B1bWFza19vZihjcHUpOwotCWNsb2NrZXZlbnRfc2V0X2Nsb2NrKGNkLCBDTE9DS19USUNLX1JBVEUpOwotCWNkLT5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4N0ZGRiwgY2QpOwotCWNkLT5taW5fZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4RiwgY2QpOwotCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShjZCk7Ci0KKwljbG9ja2V2ZW50X2k4MjUzX2luaXQodHJ1ZSk7CiAJc2V0dXBfaXJxKDAsICZpcnEwKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jIGIvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jCmluZGV4IGMwMTg2OTYuLjVjNzRlYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYworKysgYi9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KQEAgLTIxNSwxNCArMjE1LDEzIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGk4MjU5QV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGk4MjU5QV9yZXN1bWUodm9pZCkKIHsKIAlpZiAoaTgyNTlBX2F1dG9fZW9pID49IDApCiAJCWluaXRfODI1OUEoaTgyNTlBX2F1dG9fZW9pKTsKLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpODI1OUFfc2h1dGRvd24oc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGk4MjU5QV9zaHV0ZG93bih2b2lkKQogewogCS8qIFB1dCB0aGUgaTgyNTlBIGludG8gYSBxdWllc2NlbnQgc3RhdGUgdGhhdAogCSAqIHRoZSBrZXJuZWwgaW5pdGlhbGl6YXRpb24gY29kZSBjYW4gZ2V0IGl0CkBAIC0yMzIsMjYgKzIzMSwxNyBAQAogCQlvdXRiKDB4ZmYsIFBJQ19NQVNURVJfSU1SKTsJLyogbWFzayBhbGwgb2YgODI1OUEtMSAqLwogCQlvdXRiKDB4ZmYsIFBJQ19TTEFWRV9JTVIpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0xICovCiAJfQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBpODI1OV9zeXNkZXZfY2xhc3MgPSB7Ci0JLm5hbWUgPSAiaTgyNTkiLAorc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBpODI1OV9zeXNjb3JlX29wcyA9IHsKIAkucmVzdW1lID0gaTgyNTlBX3Jlc3VtZSwKIAkuc2h1dGRvd24gPSBpODI1OUFfc2h1dGRvd24sCiB9OwogCi1zdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2k4MjU5QSA9IHsKLQkuaWQJPSAwLAotCS5jbHMJPSAmaTgyNTlfc3lzZGV2X2NsYXNzLAotfTsKLQogc3RhdGljIGludCBfX2luaXQgaTgyNTlBX2luaXRfc3lzZnModm9pZCkKIHsKLQlpbnQgZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmk4MjU5X3N5c2Rldl9jbGFzcyk7Ci0JaWYgKCFlcnJvcikKLQkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV9pODI1OUEpOwotCXJldHVybiBlcnJvcjsKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmaTgyNTlfc3lzY29yZV9vcHMpOworCXJldHVybiAwOwogfQogCiBkZXZpY2VfaW5pdGNhbGwoaTgyNTlBX2luaXRfc3lzZnMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvbW9kdWxlLmMKaW5kZXggZGQ5NDBiNy4uNGI5MzBhYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL21pcHMva2VybmVsL21vZHVsZS5jCkBAIC00NSwzMCArNDUsMTQgQEAKIHN0YXRpYyBMSVNUX0hFQUQoZGJlX2xpc3QpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhkYmVfbG9jayk7CiAKKyNpZmRlZiBNT0RVTEVfU1RBUlQKIHZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0jaWZkZWYgTU9EVUxFX1NUQVJUCiAJcmV0dXJuIF9fdm1hbGxvY19ub2RlX3JhbmdlKHNpemUsIDEsIE1PRFVMRV9TVEFSVCwgTU9EVUxFX0VORCwKIAkJCQlHRlBfS0VSTkVMLCBQQUdFX0tFUk5FTCwgLTEsCiAJCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLSNlbHNlCi0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHZtYWxsb2Moc2l6ZSk7Cit9CiAjZW5kaWYKLX0KLQotLyogRnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfYWxsb2MgKi8KLXZvaWQgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKQotewotCXZmcmVlKG1vZHVsZV9yZWdpb24pOwotfQotCi1pbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLCBFbGZfU2hkciAqc2VjaGRycywKLQkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsIHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLQlyZXR1cm4gMDsKLX0KIAogc3RhdGljIGludCBhcHBseV9yX21pcHNfbm9uZShzdHJ1Y3QgbW9kdWxlICptZSwgdTMyICpsb2NhdGlvbiwgRWxmX0FkZHIgdikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudC5jIGIvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggYTgyNDQ4NS4uZDBkZWFhYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTUyNyw3ICs1MjcsNyBAQAogCWlmICghbWlwc3BtdV9ldmVudF9zZXRfcGVyaW9kKGV2ZW50LCBod2MsIGlkeCkpCiAJCXJldHVybjsKIAotCWlmIChwZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCAwLCBkYXRhLCByZWdzKSkKKwlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgZGF0YSwgcmVncykpCiAJCW1pcHNwbXUtPmRpc2FibGVfZXZlbnQoaWR4KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50X21pcHN4eC5jIGIvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50X21pcHN4eC5jCmluZGV4IDc1MjY2ZmYuLmU1YWQwOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudF9taXBzeHguYworKysgYi9hcmNoL21pcHMva2VybmVsL3BlcmZfZXZlbnRfbWlwc3h4LmMKQEAgLTM3Nyw2ICszNzcsMjAgQEAKIAkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAogCX0sCiB9LAorW0MoTk9ERSldID0geworCVtDKE9QX1JFQUQpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorCVtDKE9QX1dSSVRFKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKKwlbQyhPUF9QUkVGRVRDSCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCX0sCit9LAogfTsKIAogLyogNzRLIGNvcmUgaGFzIGNvbXBsZXRlbHkgZGlmZmVyZW50IGNhY2hlIGV2ZW50IG1hcC4gKi8KQEAgLTQ4MCw2ICs0OTQsMjAgQEAKIAkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAogCX0sCiB9LAorW0MoTk9ERSldID0geworCVtDKE9QX1JFQUQpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorCVtDKE9QX1dSSVRFKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKKwlbQyhPUF9QUkVGRVRDSCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCX0sCit9LAogfTsKIAogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwppbmRleCBkMjExMmQzLi5jMjhmYmU2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzczLDE4ICszNzMsMTggQEAKIAogCiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCi0vKiB1c2VkIGJ5IHNob3dfYmFja3RyYWNlKCkgKi8KLXVuc2lnbmVkIGxvbmcgdW53aW5kX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3AsCi0JCQkgICB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nICpyYSkKKy8qIGdlbmVyaWMgc3RhY2sgdW53aW5kaW5nIGZ1bmN0aW9uICovCit1bnNpZ25lZCBsb25nIG5vdHJhY2UgdW53aW5kX3N0YWNrX2J5X2FkZHJlc3ModW5zaWduZWQgbG9uZyBzdGFja19wYWdlLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nICpzcCwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwYywKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqcmEpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFja19wYWdlOwogCXN0cnVjdCBtaXBzX2ZyYW1lX2luZm8gaW5mbzsKIAl1bnNpZ25lZCBsb25nIHNpemUsIG9mczsKIAlpbnQgbGVhZjsKIAlleHRlcm4gdm9pZCByZXRfZnJvbV9pcnEodm9pZCk7CiAJZXh0ZXJuIHZvaWQgcmV0X2Zyb21fZXhjZXB0aW9uKHZvaWQpOwogCi0Jc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0YXNrKTsKIAlpZiAoIXN0YWNrX3BhZ2UpCiAJCXJldHVybiAwOwogCkBAIC00NDMsNiArNDQzLDE1IEBACiAJKnJhID0gMDsKIAlyZXR1cm4gX19rZXJuZWxfdGV4dF9hZGRyZXNzKHBjKSA/IHBjIDogMDsKIH0KK0VYUE9SVF9TWU1CT0wodW53aW5kX3N0YWNrX2J5X2FkZHJlc3MpOworCisvKiB1c2VkIGJ5IHNob3dfYmFja3RyYWNlKCkgKi8KK3Vuc2lnbmVkIGxvbmcgdW53aW5kX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3AsCisJCQkgICB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nICpyYSkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YWNrX3BhZ2UgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodGFzayk7CisJcmV0dXJuIHVud2luZF9zdGFja19ieV9hZGRyZXNzKHN0YWNrX3BhZ2UsIHNwLCBwYywgcmEpOworfQogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKaW5kZXggZTliM2FmMi4uYjc1MTdlMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwpAQCAtNTc4LDEyICs1NzgsMTIgQEAKIHsKIAlpZiAoKG9wY29kZSAmIE9QQ09ERSkgPT0gTEwpIHsKIAkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0VNVUxBVElPTl9GQVVMVFMsCi0JCQkJMSwgMCwgcmVncywgMCk7CisJCQkJMSwgcmVncywgMCk7CiAJCXJldHVybiBzaW11bGF0ZV9sbChyZWdzLCBvcGNvZGUpOwogCX0KIAlpZiAoKG9wY29kZSAmIE9QQ09ERSkgPT0gU0MpIHsKIAkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0VNVUxBVElPTl9GQVVMVFMsCi0JCQkJMSwgMCwgcmVncywgMCk7CisJCQkJMSwgcmVncywgMCk7CiAJCXJldHVybiBzaW11bGF0ZV9zYyhyZWdzLCBvcGNvZGUpOwogCX0KIApAQCAtNjAyLDcgKzYwMiw3IEBACiAJCWludCByZCA9IChvcGNvZGUgJiBSRCkgPj4gMTE7CiAJCWludCBydCA9IChvcGNvZGUgJiBSVCkgPj4gMTY7CiAJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLAotCQkJCTEsIDAsIHJlZ3MsIDApOworCQkJCTEsIHJlZ3MsIDApOwogCQlzd2l0Y2ggKHJkKSB7CiAJCWNhc2UgMDoJCS8qIENQVSBudW1iZXIgKi8KIAkJCXJlZ3MtPnJlZ3NbcnRdID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpAQCAtNjQwLDcgKzY0MCw3IEBACiB7CiAJaWYgKChvcGNvZGUgJiBPUENPREUpID09IFNQRUMwICYmIChvcGNvZGUgJiBGVU5DKSA9PSBTWU5DKSB7CiAJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLAotCQkJCTEsIDAsIHJlZ3MsIDApOworCQkJCTEsIHJlZ3MsIDApOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdW5hbGlnbmVkLmMgYi9hcmNoL21pcHMva2VybmVsL3VuYWxpZ25lZC5jCmluZGV4IGNmZWExYWQuLmViMzE5YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdW5hbGlnbmVkLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC91bmFsaWduZWQuYwpAQCAtMTExLDggKzExMSw3IEBACiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAl1bnNpZ25lZCBpbnQgcmVzOwogCi0JcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0VNVUxBVElPTl9GQVVMVFMsCi0JCSAgICAgIDEsIDAsIHJlZ3MsIDApOworCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLCAxLCByZWdzLCAwKTsKIAogCS8qCiAJICogVGhpcyBsb2FkIG5ldmVyIGZhdWx0cy4KQEAgLTUxNyw3ICs1MTYsNyBAQAogCW1tX3NlZ21lbnRfdCBzZWc7CiAKIAlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfQUxJR05NRU5UX0ZBVUxUUywKLQkJCTEsIDAsIHJlZ3MsIHJlZ3MtPmNwMF9iYWR2YWRkcik7CisJCQkxLCByZWdzLCByZWdzLT5jcDBfYmFkdmFkZHIpOwogCS8qCiAJICogRGlkIHdlIGNhdGNoIGEgZmF1bHQgdHJ5aW5nIHRvIGxvYWQgYW4gaW5zdHJ1Y3Rpb24/CiAJICogT3IgYXJlIHdlIHJ1bm5pbmcgaW4gTUlQUzE2IG1vZGU/CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL2RldmljZXMuYyBiL2FyY2gvbWlwcy9sYW50aXEvZGV2aWNlcy5jCmluZGV4IDdiODJjMzQuLjQ0YTM2NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYW50aXEvZGV2aWNlcy5jCisrKyBiL2FyY2gvbWlwcy9sYW50aXEvZGV2aWNlcy5jCkBAIC0xNSwxMSArMTUsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAKICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFudGlxL3h3YXkvZGV2aWNlcy5jIGIvYXJjaC9taXBzL2xhbnRpcS94d2F5L2RldmljZXMuYwppbmRleCBlMDllNzg5Li5kMGUzMmFiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFudGlxL3h3YXkvZGV2aWNlcy5jCisrKyBiL2FyY2gvbWlwcy9sYW50aXEveHdheS9kZXZpY2VzLmMKQEAgLTE2LDExICsxNiw5IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KIAogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tYXRoLWVtdS9jcDFlbXUuYyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9jcDFlbXUuYwppbmRleCBkMzJjYjA1Li5kYmYyZjkzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWF0aC1lbXUvY3AxZW11LmMKKysrIGIvYXJjaC9taXBzL21hdGgtZW11L2NwMWVtdS5jCkBAIC0yNzIsOCArMjcyLDcgQEAKIAl9CiAKICAgICAgIGVtdWw6Ci0JcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0VNVUxBVElPTl9GQVVMVFMsCi0JCQkxLCAwLCB4Y3AsIDApOworCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLCAxLCB4Y3AsIDApOwogCU1JUFNfRlBVX0VNVV9JTkNfU1RBVFMoZW11bGF0ZWQpOwogCXN3aXRjaCAoTUlQU0luc3RfT1BDT0RFKGlyKSkgewogCWNhc2UgbGRjMV9vcDp7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vZmF1bHQuYyBiL2FyY2gvbWlwcy9tbS9mYXVsdC5jCmluZGV4IDEzN2VlNzYuLjkzN2NmMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvbWlwcy9tbS9mYXVsdC5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAkgKiB0aGUgZmF1bHQuCiAJICovCiAJZmF1bHQgPSBoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgYWRkcmVzcywgd3JpdGUgPyBGQVVMVF9GTEFHX1dSSVRFIDogMCk7Ci0JcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTLCAxLCAwLCByZWdzLCBhZGRyZXNzKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMsIDEsIHJlZ3MsIGFkZHJlc3MpOwogCWlmICh1bmxpa2VseShmYXVsdCAmIFZNX0ZBVUxUX0VSUk9SKSkgewogCQlpZiAoZmF1bHQgJiBWTV9GQVVMVF9PT00pCiAJCQlnb3RvIG91dF9vZl9tZW1vcnk7CkBAIC0xNTQsMTIgKzE1NCwxMCBAQAogCQlCVUcoKTsKIAl9CiAJaWYgKGZhdWx0ICYgVk1fRkFVTFRfTUFKT1IpIHsKLQkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSiwKLQkJCQkxLCAwLCByZWdzLCBhZGRyZXNzKTsKKwkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSiwgMSwgcmVncywgYWRkcmVzcyk7CiAJCXRzay0+bWFqX2ZsdCsrOwogCX0gZWxzZSB7Ci0JCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4sCi0JCQkJMSwgMCwgcmVncywgYWRkcmVzcyk7CisJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4sIDEsIHJlZ3MsIGFkZHJlc3MpOwogCQl0c2stPm1pbl9mbHQrKzsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtdGltZS5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS10aW1lLmMKaW5kZXggMTYyMGI4My4uZjhlZTk0NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS10aW1lLmMKKysrIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS10aW1lLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pODI1My5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC0zMSw3ICszMiw2IEBACiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNtdHJlZ3MuaD4KICNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgotI2luY2x1ZGUgPGFzbS9pODI1My5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vY3B1Lmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvb3Byb2ZpbGUvTWFrZWZpbGUgYi9hcmNoL21pcHMvb3Byb2ZpbGUvTWFrZWZpbGUKaW5kZXggNGI5ZDcwNC4uMjlmMmYxMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL29wcm9maWxlL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIAkJb3Byb2ZpbGVmcy5vIG9wcm9maWxlX3N0YXRzLm8gXAogCQl0aW1lcl9pbnQubyApCiAKLW9wcm9maWxlLXkJCQkJOj0gJChEUklWRVJfT0JKUykgY29tbW9uLm8KK29wcm9maWxlLXkJCQkJOj0gJChEUklWRVJfT0JKUykgY29tbW9uLm8gYmFja3RyYWNlLm8KIAogb3Byb2ZpbGUtJChDT05GSUdfQ1BVX01JUFMzMikJCSs9IG9wX21vZGVsX21pcHN4eC5vCiBvcHJvZmlsZS0kKENPTkZJR19DUFVfTUlQUzY0KQkJKz0gb3BfbW9kZWxfbWlwc3h4Lm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9iYWNrdHJhY2UuYyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9iYWNrdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODU0ZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL2JhY2t0cmFjZS5jCkBAIC0wLDAgKzEsMTc1IEBACisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vaW5zdC5oPgorCitzdHJ1Y3Qgc3RhY2tmcmFtZSB7CisJdW5zaWduZWQgbG9uZyBzcDsKKwl1bnNpZ25lZCBsb25nIHBjOworCXVuc2lnbmVkIGxvbmcgcmE7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBnZXRfbWVtKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyAqcmVzdWx0KQoreworCXVuc2lnbmVkIGxvbmcgKmFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyAqKSBhZGRyOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhZGRyLCBzaXplb2YodW5zaWduZWQgbG9uZykpKQorCQlyZXR1cm4gLTE7CisJaWYgKF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMocmVzdWx0LCBhZGRyZXNzLCBzaXplb2YodW5zaWduZWQgbG9uZykpKQorCQlyZXR1cm4gLTM7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGVzZSB0d28gaW5zdHJ1Y3Rpb24gaGVscGVycyB3ZXJlIHRha2VuIGZyb20gcHJvY2Vzcy5jCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3JhX3NhdmVfaW5zKHVuaW9uIG1pcHNfaW5zdHJ1Y3Rpb24gKmlwKQoreworCS8qIHN3IC8gc2QgJHJhLCBvZmZzZXQoJHNwKSAqLworCXJldHVybiAoaXAtPmlfZm9ybWF0Lm9wY29kZSA9PSBzd19vcCB8fCBpcC0+aV9mb3JtYXQub3Bjb2RlID09IHNkX29wKQorCQkmJiBpcC0+aV9mb3JtYXQucnMgPT0gMjkgJiYgaXAtPmlfZm9ybWF0LnJ0ID09IDMxOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19zcF9tb3ZlX2lucyh1bmlvbiBtaXBzX2luc3RydWN0aW9uICppcCkKK3sKKwkvKiBhZGRpdS9kYWRkaXUgc3Asc3AsLWltbSAqLworCWlmIChpcC0+aV9mb3JtYXQucnMgIT0gMjkgfHwgaXAtPmlfZm9ybWF0LnJ0ICE9IDI5KQorCQlyZXR1cm4gMDsKKwlpZiAoaXAtPmlfZm9ybWF0Lm9wY29kZSA9PSBhZGRpdV9vcCB8fCBpcC0+aV9mb3JtYXQub3Bjb2RlID09IGRhZGRpdV9vcCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb29rcyBmb3Igc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRoYXQgbWFyayB0aGUgZW5kIG9mIGEgZnVuY3Rpb24uCisgKiBUaGlzIHVzdWFsbHkgbWVhbnMgd2UgcmFuIGludG8gdGhlIGNvZGUgYXJlYSBvZiB0aGUgcHJldmlvdXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX2VuZF9vZl9mdW5jdGlvbl9tYXJrZXIodW5pb24gbWlwc19pbnN0cnVjdGlvbiAqaXApCit7CisJLyoganIgcmEgKi8KKwlpZiAoaXAtPnJfZm9ybWF0LmZ1bmMgPT0ganJfb3AgJiYgaXAtPnJfZm9ybWF0LnJzID09IDMxKQorCQlyZXR1cm4gMTsKKwkvKiBsdWkgZ3AgKi8KKwlpZiAoaXAtPmlfZm9ybWF0Lm9wY29kZSA9PSBsdWlfb3AgJiYgaXAtPmlfZm9ybWF0LnJ0ID09IDI4KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRPRE8gZm9yIHVzZXJzcGFjZSBzdGFjayB1bndpbmRpbmc6CisgKiAtIGhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgc3RhY2sgaXMgYWRqdXN0ZWQgaW5zaWRlIGEgZnVuY3Rpb24KKyAqICAgICAoZ2VuZXJhbGx5IGRvZXNuJ3QgaGFwcGVuKQorICogLSBmaW5kIG9wdGltYWwgdmFsdWUgZm9yIG1heF9pbnN0cl9jaGVjaworICogLSB0cnkgdG8gZmluZCBhIHdheSB0byBoYW5kbGUgbGVhZiBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIGludCB1bndpbmRfdXNlcl9mcmFtZShzdHJ1Y3Qgc3RhY2tmcmFtZSAqb2xkX2ZyYW1lLAorCQkJCSAgICBjb25zdCB1bnNpZ25lZCBpbnQgbWF4X2luc3RyX2NoZWNrKQoreworCXN0cnVjdCBzdGFja2ZyYW1lIG5ld19mcmFtZSA9ICpvbGRfZnJhbWU7CisJb2ZmX3QgcmFfb2Zmc2V0ID0gMDsKKwlzaXplX3Qgc3RhY2tfc2l6ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKG9sZF9mcmFtZS0+cGMgPT0gMCB8fCBvbGRfZnJhbWUtPnNwID09IDAgfHwgb2xkX2ZyYW1lLT5yYSA9PSAwKQorCQlyZXR1cm4gLTk7CisKKwlmb3IgKGFkZHIgPSBuZXdfZnJhbWUucGM7IChhZGRyICsgbWF4X2luc3RyX2NoZWNrID4gbmV3X2ZyYW1lLnBjKQorCQkmJiAoIXJhX29mZnNldCB8fCAhc3RhY2tfc2l6ZSk7IC0tYWRkcikgeworCQl1bmlvbiBtaXBzX2luc3RydWN0aW9uIGlwOworCisJCWlmIChnZXRfbWVtKGFkZHIsICh1bnNpZ25lZCBsb25nICopICZpcCkpCisJCQlyZXR1cm4gLTExOworCisJCWlmIChpc19zcF9tb3ZlX2lucygmaXApKSB7CisJCQlpbnQgc3RhY2tfYWRqdXN0bWVudCA9IGlwLmlfZm9ybWF0LnNpbW1lZGlhdGU7CisJCQlpZiAoc3RhY2tfYWRqdXN0bWVudCA+IDApCisJCQkJLyogVGhpcyBtYXJrcyB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBmdW5jdGlvbiwKKwkJCQkgICB3aGljaCBtZWFucyB3ZSBvdmVycmFuLiAqLworCQkJCWJyZWFrOworCQkJc3RhY2tfc2l6ZSA9ICh1bnNpZ25lZCkgc3RhY2tfYWRqdXN0bWVudDsKKwkJfSBlbHNlIGlmIChpc19yYV9zYXZlX2lucygmaXApKSB7CisJCQlpbnQgcmFfc2xvdCA9IGlwLmlfZm9ybWF0LnNpbW1lZGlhdGU7CisJCQlpZiAocmFfc2xvdCA8IDApCisJCQkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiAqLworCQkJCWJyZWFrOworCQkJcmFfb2Zmc2V0ID0gcmFfc2xvdDsKKwkJfSBlbHNlIGlmIChpc19lbmRfb2ZfZnVuY3Rpb25fbWFya2VyKCZpcCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIXJhX29mZnNldCB8fCAhc3RhY2tfc2l6ZSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHJhX29mZnNldCkgeworCQluZXdfZnJhbWUucmEgPSBvbGRfZnJhbWUtPnNwICsgcmFfb2Zmc2V0OworCQlpZiAoZ2V0X21lbShuZXdfZnJhbWUucmEsICYobmV3X2ZyYW1lLnJhKSkpCisJCQlyZXR1cm4gLTEzOworCX0KKworCWlmIChzdGFja19zaXplKSB7CisJCW5ld19mcmFtZS5zcCA9IG9sZF9mcmFtZS0+c3AgKyBzdGFja19zaXplOworCQlpZiAoZ2V0X21lbShuZXdfZnJhbWUuc3AsICYobmV3X2ZyYW1lLnNwKSkpCisJCQlyZXR1cm4gLTE0OworCX0KKworCWlmIChuZXdfZnJhbWUuc3AgPiBvbGRfZnJhbWUtPnNwKQorCQlyZXR1cm4gLTI7CisKKwluZXdfZnJhbWUucGMgPSBvbGRfZnJhbWUtPnJhOworCSpvbGRfZnJhbWUgPSBuZXdfZnJhbWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRvX3VzZXJfYmFja3RyYWNlKHVuc2lnbmVkIGxvbmcgbG93X2FkZHIsCisJCQkJICAgICBzdHJ1Y3Qgc3RhY2tmcmFtZSAqZnJhbWUsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgZGVwdGgpCit7CisJY29uc3QgdW5zaWduZWQgaW50IG1heF9pbnN0cl9jaGVjayA9IDUxMjsKKwljb25zdCB1bnNpZ25lZCBsb25nIGhpZ2hfYWRkciA9IGxvd19hZGRyICsgVEhSRUFEX1NJWkU7CisKKwl3aGlsZSAoZGVwdGgtLSAmJiAhdW53aW5kX3VzZXJfZnJhbWUoZnJhbWUsIG1heF9pbnN0cl9jaGVjaykpIHsKKwkJb3Byb2ZpbGVfYWRkX3RyYWNlKGZyYW1lLT5yYSk7CisJCWlmIChmcmFtZS0+c3AgPCBsb3dfYWRkciB8fCBmcmFtZS0+c3AgPiBoaWdoX2FkZHIpCisJCQlicmVhazsKKwl9Cit9CisKKyNpZm5kZWYgQ09ORklHX0tBTExTWU1TCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fa2VybmVsX2JhY2t0cmFjZSh1bnNpZ25lZCBsb25nIGxvd19hZGRyLAorCQkJCSAgICAgICBzdHJ1Y3Qgc3RhY2tmcmFtZSAqZnJhbWUsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBkZXB0aCkgeyB9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRvX2tlcm5lbF9iYWNrdHJhY2UodW5zaWduZWQgbG9uZyBsb3dfYWRkciwKKwkJCQkgICAgICAgc3RydWN0IHN0YWNrZnJhbWUgKmZyYW1lLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGVwdGgpCit7CisJd2hpbGUgKGRlcHRoLS0gJiYgZnJhbWUtPnBjKSB7CisJCWZyYW1lLT5wYyA9IHVud2luZF9zdGFja19ieV9hZGRyZXNzKGxvd19hZGRyLAorCQkJCQkJICAgICYoZnJhbWUtPnNwKSwKKwkJCQkJCSAgICBmcmFtZS0+cGMsCisJCQkJCQkgICAgJihmcmFtZS0+cmEpKTsKKwkJb3Byb2ZpbGVfYWRkX3RyYWNlKGZyYW1lLT5yYSk7CisJfQorfQorI2VuZGlmCisKK3ZvaWQgbm90cmFjZSBvcF9taXBzX2JhY2t0cmFjZShzdHJ1Y3QgcHRfcmVncyAqY29uc3QgcmVncywgdW5zaWduZWQgaW50IGRlcHRoKQoreworCXN0cnVjdCBzdGFja2ZyYW1lIGZyYW1lID0geyAuc3AgPSByZWdzLT5yZWdzWzI5XSwKKwkJCQkgICAgLnBjID0gcmVncy0+Y3AwX2VwYywKKwkJCQkgICAgLnJhID0gcmVncy0+cmVnc1szMV0gfTsKKwljb25zdCBpbnQgdXNlcnNwYWNlID0gdXNlcl9tb2RlKHJlZ3MpOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbG93X2FkZHIgPSBBTElHTihmcmFtZS5zcCwgVEhSRUFEX1NJWkUpOworCisJaWYgKHVzZXJzcGFjZSkKKwkJZG9fdXNlcl9iYWNrdHJhY2UobG93X2FkZHIsICZmcmFtZSwgZGVwdGgpOworCWVsc2UKKwkJZG9fa2VybmVsX2JhY2t0cmFjZShsb3dfYWRkciwgJmZyYW1lLCBkZXB0aCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggZjllYjFhYi4uZDFmMmQ0YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL29wcm9maWxlL2NvbW1vbi5jCisrKyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9jb21tb24uYwpAQCAtMTE1LDYgKzExNSw3IEBACiAJb3BzLT5zdGFydAkJPSBvcF9taXBzX3N0YXJ0OwogCW9wcy0+c3RvcAkJPSBvcF9taXBzX3N0b3A7CiAJb3BzLT5jcHVfdHlwZQkJPSBsbW9kZWwtPmNwdV90eXBlOworCW9wcy0+YmFja3RyYWNlCQk9IG9wX21pcHNfYmFja3RyYWNlOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IHVzaW5nICVzIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuXG4iLAogCSAgICAgICBsbW9kZWwtPmNwdV90eXBlKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9pbXBsLmggYi9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfaW1wbC5oCmluZGV4IGYwNGI1NGYuLjdjMmRhMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9pbXBsLmgKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL29wX2ltcGwuaApAQCAtMzYsNCArMzYsNiBAQAogCXVuc2lnbmVkIGNoYXIgbnVtX2NvdW50ZXJzOwogfTsKIAordm9pZCBvcF9taXBzX2JhY2t0cmFjZShzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsIHVuc2lnbmVkIGludCBkZXB0aCk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2ktcmMzMjQzNC5jIGIvYXJjaC9taXBzL3BjaS9wY2ktcmMzMjQzNC5jCmluZGV4IGYzMTIxOGUuLjc2NDM2MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLXJjMzI0MzQuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS1yYzMyNDM0LmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCXJjMzI0MzRfcGNpYnJpZGdlX2luaXQoKTsKIAogCWlvX21hcF9iYXNlID0gaW9yZW1hcChyYzMyNDM0X3Jlc19wY2lfaW8xLnN0YXJ0LAotCQlyYzMyNDM0X3Jlc19wY2lfaW8xLmVuZCAtIHJjMzI0MzRfcmVzX3BjaV9pbzEuc3RhcnQgKyAxKTsKKwkJCSAgICAgIHJlc291cmNlX3NpemUoJnJjcmMzMjQzNF9yZXNfcGNpX2lvMSkpOwogCiAJaWYgKCFpb19tYXBfYmFzZSkKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS12cjQxeHguYyBiL2FyY2gvbWlwcy9wY2kvcGNpLXZyNDF4eC5jCmluZGV4IDU2NTI1NzEuLjQ0NGI4ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLXZyNDF4eC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLXZyNDF4eC5jCkBAIC0zMDUsNyArMzA1LDcgQEAKIAkJc3RydWN0IHJlc291cmNlICpyZXMgPSB2cjQxeHhfcGNpX2NvbnRyb2xsZXIuaW9fcmVzb3VyY2U7CiAJCW1hc3RlciA9IHNldHVwLT5tYXN0ZXJfaW87CiAJCWlvX21hcF9iYXNlID0gaW9yZW1hcChtYXN0ZXItPmJ1c19iYXNlX2FkZHJlc3MsCi0JCQkJICAgICAgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJCQkJICAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAkJaWYgKCFpb19tYXBfYmFzZSkKIAkJCXJldHVybiAtRUJVU1k7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wb3dlcnR2L2FzaWMvYXNpY19kZXZpY2VzLmMgYi9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL2FzaWNfZGV2aWNlcy5jCmluZGV4IGU1NmZhNjEuLmJjZTE4NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wb3dlcnR2L2FzaWMvYXNpY19kZXZpY2VzLmMKKysrIGIvYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9hc2ljX2RldmljZXMuYwpAQCAtMzk0LDIzICszOTQsMjEgQEAKIAogCS8qIExvb3AgdGhyb3VnaCBsb29raW5nIGZvciByZXNvdXJjZXMgdGhhdCB3YW50IGEgcGFydGljdWxhciBhZGRyZXNzICovCiAJZm9yIChpID0gMDsgZ3BfcmVzb3VyY2VzW2ldLmZsYWdzICE9IDA7IGkrKykgewotCQlpbnQgc2l6ZSA9IGdwX3Jlc291cmNlc1tpXS5lbmQgLSBncF9yZXNvdXJjZXNbaV0uc3RhcnQgKyAxOworCQlpbnQgc2l6ZSA9IHJlc291cmNlX3NpemUoJmdwX3Jlc291cmNlc1tpXSk7CiAJCWlmICgoZ3BfcmVzb3VyY2VzW2ldLnN0YXJ0ICE9IDApICYmCiAJCQkoKGdwX3Jlc291cmNlc1tpXS5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSAhPSAwKSkgewogCQkJcmVzZXJ2ZV9ib290bWVtKGRtYV90b19waHlzKGdwX3Jlc291cmNlc1tpXS5zdGFydCksCiAJCQkJc2l6ZSwgMCk7Ci0JCQl0b3RhbCArPSBncF9yZXNvdXJjZXNbaV0uZW5kIC0KLQkJCQlncF9yZXNvdXJjZXNbaV0uc3RhcnQgKyAxOworCQkJdG90YWwgKz0gcmVzb3VyY2Vfc2l6ZSgmZ3BfcmVzb3VyY2VzW2ldKTsKIAkJCXByX2luZm8oInJlc2VydmUgcmVzb3VyY2UgJXMgYXQgJTA4eCAoJXUgYnl0ZXMpXG4iLAogCQkJCWdwX3Jlc291cmNlc1tpXS5uYW1lLCBncF9yZXNvdXJjZXNbaV0uc3RhcnQsCi0JCQkJZ3BfcmVzb3VyY2VzW2ldLmVuZCAtCi0JCQkJCWdwX3Jlc291cmNlc1tpXS5zdGFydCArIDEpOworCQkJCXJlc291cmNlX3NpemUoJmdwX3Jlc291cmNlc1tpXSkpOwogCQl9CiAJfQogCiAJLyogTG9vcCB0aHJvdWdoIGFzc2lnbmluZyBhZGRyZXNzZXMgZm9yIHRob3NlIHRoYXQgYXJlIGxlZnQgKi8KIAlmb3IgKGkgPSAwOyBncF9yZXNvdXJjZXNbaV0uZmxhZ3MgIT0gMDsgaSsrKSB7Ci0JCWludCBzaXplID0gZ3BfcmVzb3VyY2VzW2ldLmVuZCAtIGdwX3Jlc291cmNlc1tpXS5zdGFydCArIDE7CisJCWludCBzaXplID0gcmVzb3VyY2Vfc2l6ZSgmZ3BfcmVzb3VyY2VzW2ldKTsKIAkJaWYgKChncF9yZXNvdXJjZXNbaV0uc3RhcnQgPT0gMCkgJiYKIAkJCSgoZ3BfcmVzb3VyY2VzW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pICE9IDApKSB7CiAJCQl2b2lkICptZW0gPSBhbGxvY19ib290bWVtX3BhZ2VzKHNpemUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItdGltZS5jIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItdGltZS5jCmluZGV4IDFhOTRjOTguLjYwNzE5MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXRpbWUuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi10aW1lLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMywgMDYgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQogICovCiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvaTgyNTMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0yMCw3ICsyMSw2IEBACiAKICNpbmNsdWRlIDxhc20vY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL2k4MjUzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc25pL3RpbWUuYyBiL2FyY2gvbWlwcy9zbmkvdGltZS5jCmluZGV4IDA5MDRkNGQuLmVjMGJlMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zbmkvdGltZS5jCisrKyBiL2FyY2gvbWlwcy9zbmkvdGltZS5jCkBAIC0xLDExICsxLDExIEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pODI1My5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAKLSNpbmNsdWRlIDxhc20vaTgyNTMuaD4KICNpbmNsdWRlIDxhc20vc25pLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ydGMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDNkNmU2MGQuLjc4MDU2MGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTUsNiArMTUsNyBAQAogICogVXNlciBzcGFjZSBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucwogICovCiAjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL21vZHVsZS5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tb2R1bGUuYwppbmRleCAxOTZhMTExLi4yMTZhZDIzIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW9kdWxlLmMKQEAgLTMyLDM2ICszMiw2IEBACiAjZGVmaW5lIERFQlVHUChmbXQsIC4uLikKICNlbmRpZgogCi0vKgotICogYWxsb2NhdGUgc3RvcmFnZSBmb3IgYSBtb2R1bGUKLSAqLwotdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpZiAoc2l6ZSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdm1hbGxvY19leGVjKHNpemUpOwotfQotCi0vKgotICogZnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfYWxsb2MoKQotICovCi12b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKLXsKLQl2ZnJlZShtb2R1bGVfcmVnaW9uKTsKLX0KLQotLyoKLSAqIGFsbG93IHRoZSBhcmNoIHRvIGZpeCB1cCB0aGUgc2VjdGlvbiB0YWJsZQotICogLSB3ZSBkb24ndCBuZWVkIGFueXRoaW5nIHNwZWNpYWwKLSAqLwotaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmhkciwKLQkJCSAgICAgIEVsZl9TaGRyICpzZWNoZHJzLAotCQkJICAgICAgY2hhciAqc2Vjc3RyaW5ncywKLQkJCSAgICAgIHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgcmVsb2NfcHV0MTYodWludDhfdCAqcCwgdWludDMyX3QgdmFsKQogewogCXBbMF0gPSB2YWwgJiAweGZmOwpAQCAtODEsMjAgKzUxLDYgQEAKIH0KIAogLyoKLSAqIGFwcGx5IGEgUkVMIHJlbG9jYXRpb24KLSAqLwotaW50IGFwcGx5X3JlbG9jYXRlKEVsZjMyX1NoZHIgKnNlY2hkcnMsCi0JCSAgIGNvbnN0IGNoYXIgKnN0cnRhYiwKLQkJICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAotCQkgICB1bnNpZ25lZCBpbnQgcmVsc2VjLAotCQkgICBzdHJ1Y3QgbW9kdWxlICptZSkKLXsKLQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwKLQkgICAgICAgbWUtPm5hbWUpOwotCXJldHVybiAtRU5PRVhFQzsKLX0KLQotLyoKICAqIGFwcGx5IGEgUkVMQSByZWxvY2F0aW9uCiAgKi8KIGludCBhcHBseV9yZWxvY2F0ZV9hZGQoRWxmMzJfU2hkciAqc2VjaGRycywKQEAgLTE5OCwyMCArMTU0LDMgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci0KLS8qCi0gKiBmaW5pc2ggbG9hZGluZyB0aGUgbW9kdWxlCi0gKi8KLWludCBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwKLQkJICAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAotCQkgICAgc3RydWN0IG1vZHVsZSAqbWUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBmaW5pc2ggY2xlYXJpbmcgdGhlIG1vZHVsZQotICovCi12b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQotewotfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC90cmFwcy5jCmluZGV4IGYwM2NiMjcuLmJkM2U1ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL3RyYXBzLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CkBAIC0xNTYsNyArMTU2LDcgQEAKIAogCWNhc2UgRVhDRVBfVFJBUDoKIAljYXNlIEVYQ0VQX1VOSU1QSU5TOgotCQlpZiAoZ2V0X3VzZXIob3Bjb2RlLCAodWludDhfdCBfX3VzZXIgKilyZWdzLT5wYykgIT0gMCkKKwkJaWYgKHByb2JlX2tlcm5lbF9yZWFkKCZvcGNvZGUsICh1OCAqKXJlZ3MtPnBjLCAxKSA8IDApCiAJCQlicmVhazsKIAkJaWYgKG9wY29kZSA9PSAweGZmKSB7CiAJCQlpZiAobm90aWZ5X2RpZShESUVfQlJFQUtQT0lOVCwgc3RyLCByZWdzLCBjb2RlLCAwLCAwKSkKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA2ZjcwMmE2Li4xM2M0ODE0IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC00NCw2ICs0NCw3IEBACiAgIFJPX0RBVEEoUEFHRV9TSVpFKQogCiAgIC8qIHdyaXRlYWJsZSAqLworICBfc2RhdGEgPSAuOyAgICAgLyogU3RhcnQgb2YgcncgZGF0YSBzZWN0aW9uICovCiAgIFJXX0RBVEFfU0VDVElPTigzMiwgUEFHRV9TSVpFLCBUSFJFQURfU0laRSkKICAgX2VkYXRhID0gLjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL21tL2NhY2hlLWRiZy1mbHVzaC1ieS1yZWcuUyBiL2FyY2gvbW4xMDMwMC9tbS9jYWNoZS1kYmctZmx1c2gtYnktcmVnLlMKaW5kZXggNjY1OTE5Zi4uYTc3NWVhNSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL21tL2NhY2hlLWRiZy1mbHVzaC1ieS1yZWcuUworKysgYi9hcmNoL21uMTAzMDAvbW0vY2FjaGUtZGJnLWZsdXNoLWJ5LXJlZy5TCkBAIC0xMjAsMTQgKzEyMCwxNCBAQAogCSMgY29uZGl0aW9uYWxseSBwdXJnZSB0aGlzIGxpbmUgaW4gYWxsIHdheXMKIAltb3YJZDEsKEwxX0NBQ0hFX1dBWURJU1AqMCxhMCkKIAotZGVidWdnZXJfbG9jYWxfY2FjaGVfZmx1c2hpbnZfbm9fZGNhY2hlOgorZGVidWdnZXJfbG9jYWxfY2FjaGVfZmx1c2hpbnZfb25lX25vX2RjYWNoZToKIAkjCiAJIyBub3cgdHJ5IHRvIGZsdXNoIHRoZSBpY2FjaGUKIAkjCiAJbW92CUNIQ1RSLGEwCiAJbW92aHUJKGEwKSxkMAogCWJ0c3QJQ0hDVFJfSUNFTixkMAotCWJlcQltbjEwMzAwX2xvY2FsX2ljYWNoZV9pbnZfcmFuZ2VfcmVnX2VuZAorCWJlcQlkZWJ1Z2dlcl9sb2NhbF9jYWNoZV9mbHVzaGludl9vbmVfZW5kCiAKIAlMT0NBTF9DTElfU0FWRShkMSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9LY29uZmlnIGIvYXJjaC9vcGVucmlzYy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NThiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL0tjb25maWcKQEAgLTAsMCArMSwyMDcgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIERvY3VtZW50YXRpb24va2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK2NvbmZpZyBPUEVOUklTQworCWRlZl9ib29sIHkKKwlzZWxlY3QgT0YKKwlzZWxlY3QgT0ZfRUFSTFlfRkxBVFRSRUUKKwlzZWxlY3QgSEFWRV9NRU1CTE9DSworCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgorICAgICAgICBzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSworCXNlbGVjdCBIQVZFX0dFTkVSSUNfSEFSRElSUVMKKwlzZWxlY3QgR0VORVJJQ19JUlFfQ0hJUAorCXNlbGVjdCBHRU5FUklDX0lSUV9QUk9CRQorCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCisJc2VsZWN0IEdFTkVSSUNfSU9NQVAKKworY29uZmlnIE1NVQorCWRlZl9ib29sIHkKKworY29uZmlnIFdJU0hCT05FX0JVU19CSUdfRU5ESUFOCisJZGVmX2Jvb2wgeQorCitjb25maWcgU1lNQk9MX1BSRUZJWAorICAgICAgICBzdHJpbmcKKyAgICAgICAgZGVmYXVsdCAiIgorCitjb25maWcgSEFWRV9ETUFfQVRUUlMKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBVSUQxNgorCWRlZl9ib29sIHkKKworY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBSV1NFTV9YQ0hHQUREX0FMR09SSVRITQorCWRlZl9ib29sIG4KKworY29uZmlnIEdFTkVSSUNfSFdFSUdIVAorCWRlZl9ib29sIHkKKworY29uZmlnIEdFTkVSSUNfSU9NQVAKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBOT19JT1BPUlQKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBHRU5FUklDX0dQSU8KKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTCisJZGVmX2Jvb2wgeQorCitjb25maWcgVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVAorICAgICAgICBkZWZfYm9vbCB5CisKKyMgRm9yIG5vdywgdXNlIGdlbmVyaWMgY2hlY2tzdW0gZnVuY3Rpb25zCisjVGhlc2UgY2FuIGJlIHJlaW1wbGVtZW50ZWQgaW4gYXNzZW1ibHkgbGF0ZXIgaWYgc28gaW5jbGluZWQKK2NvbmZpZyBHRU5FUklDX0NTVU0KKyAgICAgICAgZGVmX2Jvb2wgeQorCitjb25maWcgR0VORVJJQ19GSU5EX05FWFRfQklUCisJZGVmX2Jvb2wgeQorCitzb3VyY2UgImluaXQvS2NvbmZpZyIKKworCittZW51ICJQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMiCisKK2Nob2ljZQorCXByb21wdCAiU3ViYXJjaGl0ZWN0dXJlIgorCWRlZmF1bHQgT1IxS18xMjAwCisKK2NvbmZpZyBPUjFLXzEyMDAKKwlib29sICJPUjEyMDAiCisJaGVscAorCSAgR2VuZXJpYyBPcGVuUklTQyAxMjAwIGFyY2hpdGVjdHVyZQorCitlbmRjaG9pY2UKKworY29uZmlnIE9QRU5SSVNDX0JVSUxUSU5fRFRCCisgICAgICAgIHN0cmluZyAiQnVpbHRpbiBEVEIiCisgICAgICAgIGRlZmF1bHQgIiIKKworbWVudSAiQ2xhc3MgSUkgSW5zdHJ1Y3Rpb25zIgorCitjb25maWcgT1BFTlJJU0NfSEFWRV9JTlNUX0ZGMQorCWJvb2wgIkhhdmUgaW5zdHJ1Y3Rpb24gbC5mZjEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91ciBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIENsYXNzIElJIGluc3RydWN0aW9uIGwuZmYxCisKK2NvbmZpZyBPUEVOUklTQ19IQVZFX0lOU1RfRkwxCisJYm9vbCAiSGF2ZSBpbnN0cnVjdGlvbiBsLmZsMSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZWxlY3QgdGhpcyBpZiB5b3VyIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgQ2xhc3MgSUkgaW5zdHJ1Y3Rpb24gbC5mbDEKKworY29uZmlnIE9QRU5SSVNDX0hBVkVfSU5TVF9NVUwKKwlib29sICJIYXZlIGluc3RydWN0aW9uIGwubXVsIGZvciBoYXJkd2FyZSBtdWx0aXBseSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZWxlY3QgdGhpcyBpZiB5b3VyIGltcGxlbWVudGF0aW9uIGhhcyBhIGhhcmR3YXJlIG11bHRpcGx5IGluc3RydWN0aW9uCisKK2NvbmZpZyBPUEVOUklTQ19IQVZFX0lOU1RfRElWCisJYm9vbCAiSGF2ZSBpbnN0cnVjdGlvbiBsLmRpdiBmb3IgaGFyZHdhcmUgZGl2aWRlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdXIgaW1wbGVtZW50YXRpb24gaGFzIGEgaGFyZHdhcmUgZGl2aWRlIGluc3RydWN0aW9uCitlbmRtZW51CisKKworc291cmNlICJrZXJuZWwvdGltZS9LY29uZmlnIgorc291cmNlIGtlcm5lbC9LY29uZmlnLmh6Citzb3VyY2Uga2VybmVsL0tjb25maWcucHJlZW1wdAorc291cmNlICJtbS9LY29uZmlnIgorCitjb25maWcgT1BFTlJJU0NfTk9fU1BSX1NSX0RTWAorCWJvb2wgInVzZSBTUFJfU1JfRFNYIHNvZnR3YXJlIGVtdWxhdGlvbiIgaWYgT1IxS18xMjAwCisJZGVmYXVsdCB5CisJaGVscAorCSAgU1BSX1NSX0RTWCBiaXQgaXMgc3RhdHVzIHJlZ2lzdGVyIGJpdCBpbmRpY2F0aW5nIHdoZXRoZXIKKwkgIHRoZSBsYXN0IGV4Y2VwdGlvbiBoYXMgaGFwcGVuZWQgaW4gZGVsYXkgc2xvdC4KKworCSAgT3BlblJJU0MgYXJjaGl0ZWN0dXJlIG1ha2VzIGl0IG9wdGlvbmFsIHRvIGhhdmUgaXQgaW1wbGVtZW50ZWQKKwkgIGluIGhhcmR3YXJlIGFuZCB0aGUgT1IxMjAwIGRvZXMgbm90IGhhdmUgaXQuCisKKwkgIFNheSBOIGhlcmUgaWYgeW91IGtub3cgdGhhdCB5b3VyIE9wZW5SSVNDIHByb2Nlc3NvciBoYXMKKwkgIFNQUl9TUl9EU1ggYml0IGltcGxlbWVudGVkLiBTYXkgWSBpZiB5b3UgYXJlIHVuc3VyZS4KKworY29uZmlnIENNRExJTkUKKyAgICAgICAgc3RyaW5nICJEZWZhdWx0IGtlcm5lbCBjb21tYW5kIHN0cmluZyIKKyAgICAgICAgZGVmYXVsdCAiIgorICAgICAgICBoZWxwCisgICAgICAgICAgT24gc29tZSBhcmNoaXRlY3R1cmVzIHRoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgZm9yIHRoZSBib290IGxvYWRlcgorICAgICAgICAgIHRvIHBhc3MgYXJndW1lbnRzIHRvIHRoZSBrZXJuZWwuIEZvciB0aGVzZSBhcmNoaXRlY3R1cmVzLCB5b3Ugc2hvdWxkCisgICAgICAgICAgc3VwcGx5IHNvbWUgY29tbWFuZC1saW5lIG9wdGlvbnMgYXQgYnVpbGQgdGltZSBieSBlbnRlcmluZyB0aGVtCisgICAgICAgICAgaGVyZS4KKworbWVudSAiRGVidWdnaW5nIG9wdGlvbnMiCisKK2NvbmZpZyBERUJVR19TVEFDS09WRVJGTE9XCisJYm9vbCAiQ2hlY2sgZm9yIGtlcm5lbCBzdGFjayBvdmVyZmxvdyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBNYWtlIGV4dHJhIGNoZWNrcyBmb3Igc3BhY2UgYXZhbGlhYmxlIG9uIHN0YWNrIGluIHNvbWUKKyAgICAgICAgICBjcml0aWNhbCBmdW5jdGlvbnMuIFRoaXMgd2lsbCBjYXVzZSBrZXJuZWwgdG8gcnVuIGEgYml0IHNsb3dlciwKKwkgIGJ1dCB3aWxsIGNhdGNoIG1vc3Qgb2Yga2VybmVsIHN0YWNrIG92ZXJydW5zIGFuZCBleGl0IGdyYWNlZnVseS4KKworCSAgU2F5IFkgaWYgeW91IGFyZSB1bnN1cmUuCisKK2NvbmZpZyBKVU1QX1VQT05fVU5IQU5ETEVEX0VYQ0VQVElPTgorCWJvb2wgIlRyeSB0byBkaWUgZ3JhY2VmdWxseSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBOb3cgdGhpcyBwdXRzIGtlcm5lbCBpbnRvIGluZmluaXRlIGxvb3AgYWZ0ZXIgZmlyc3Qgb29wcy4gVGlsbAorCSAgeW91ciBrZXJuZWwgY3Jhc2hlcyB0aGlzIGRvZXNuJ3QgaGF2ZSBhbnkgaW5mbHVlbmNlLgorCisJICBTYXkgWSBpZiB5b3UgYXJlIHVuc3VyZS4KKworY29uZmlnIE9QRU5SSVNDX0VYQ0VQVElPTl9ERUJVRworCWJvb2wgIlByaW50IHByb2Nlc3NvciBzdGF0ZSBhdCBlYWNoIGV4Y2VwdGlvbiIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiB3aWxsIG1ha2UgeW91ciBrZXJuZWwgdW51c2FibGUgZm9yIGFsbCBidXQga2VybmVsCisJICBkZWJ1Z2dpbmcuCisKKwkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgorCitjb25maWcgT1BFTlJJU0NfRVNSX0VYQ0VQVElPTl9CVUdfQ0hFQ0sKKwlib29sICJDaGVjayBmb3IgcG9zc2libGUgRVNSIGV4Y2VwdGlvbiBidWciCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzb21lIGNoZWNrcyB0aGF0IG1pZ2h0IGV4cG9zZSBzb21lIHByb2JsZW1zCisgICAgICAgICAgaW4ga2VybmVsLgorCisJICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KKworZW5kbWVudQorCitlbmRtZW51CisKK21lbnUgIkV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzIgorCitzb3VyY2UgImZzL0tjb25maWcuYmluZm10IgorCitlbmRtZW51CisKK3NvdXJjZSAibmV0L0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9LY29uZmlnIgorCitzb3VyY2UgImZzL0tjb25maWciCisKK3NvdXJjZSAic2VjdXJpdHkvS2NvbmZpZyIKKworc291cmNlICJjcnlwdG8vS2NvbmZpZyIKKworc291cmNlICJsaWIvS2NvbmZpZyIKKworbWVudSAiS2VybmVsIGhhY2tpbmciCisKK3NvdXJjZSAibGliL0tjb25maWcuZGVidWciCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvTWFrZWZpbGUgYi9hcmNoL29wZW5yaXNjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OGFlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL01ha2VmaWxlCkBAIC0wLDAgKzEsNTUgQEAKKyMgQksgSWQ6ICVGJSAlSSUgJUclICVVJSAlIyUKKyMKKyMgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IHRoZSBnbG9iYWwgbWFrZWZpbGUgc28gdGhhdCB5b3UgY2FuIGFkZCB5b3VyIG93bgorIyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmxhZ3MgYW5kIGRlcGVuZGVuY2llcy4gUmVtZW1iZXIgdG8gZG8gaGF2ZSBhY3Rpb25zCisjIGZvciAiYXJjaGNsZWFuIiBhbmQgImFyY2hkZXAiIGZvciBjbGVhbmluZyB1cCBhbmQgbWFraW5nIGRlcGVuZGVuY2llcyBmb3IKKyMgdGhpcyBhcmNoaXRlY3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTQgYnkgTGludXMgVG9ydmFsZHMKKyMgTW9kaWZpY2F0aW9ucyBmb3IgdGhlIE9wZW5SSVNDIGFyY2hpdGVjdHVyZToKKyMgQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisjIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyMKKyMgQmFzZWQgb246CisjIGFyY2gvaTM4Ni9NYWtlZmlsZQorCitLQlVJTERfREVGQ09ORklHIDo9IG9yMWtzaW1fZGVmY29uZmlnCisKK0xERkxBR1MgICAgICAgICA6PQorT0JKQ09QWUZMQUdTICAgIDo9IC1PIGJpbmFyeSAtUiAubm90ZSAtUiAuY29tbWVudCAtUworTERGTEFHU192bWxpbnV4IDo9CitMSUJHQ0MgCQk6PSAkKHNoZWxsICQoQ0MpICQoS0JVSUxEX0NGTEFHUykgLXByaW50LWxpYmdjYy1maWxlLW5hbWUpCisKK0tCVUlMRF9DRkxBR1MJKz0gLXBpcGUgLWZmaXhlZC1yMTAKKworaWZlcSAoJChDT05GSUdfT1BFTlJJU0NfSEFWRV9JTlNUX01VTCkseSkKKwlLQlVJTERfQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLW1oYXJkLW11bCkKK2Vsc2UKKwlLQlVJTERfQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLW1zb2Z0LW11bCkKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX09QRU5SSVNDX0hBVkVfSU5TVF9ESVYpLHkpCisJS0JVSUxEX0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1taGFyZC1kaXYpCitlbHNlCisJS0JVSUxEX0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tc29mdC1kaXYpCitlbmRpZgorCitoZWFkLXkgCQk6PSBhcmNoL29wZW5yaXNjL2tlcm5lbC9oZWFkLm8gYXJjaC9vcGVucmlzYy9rZXJuZWwvaW5pdF90YXNrLm8KKworY29yZS15CQkrPSBhcmNoL29wZW5yaXNjL2xpYi8gXAorCQkgICBhcmNoL29wZW5yaXNjL2tlcm5lbC8gXAorCQkgICBhcmNoL29wZW5yaXNjL21tLworbGlicy15CQkrPSAkKExJQkdDQykKKworaWZuZXEgJyQoQ09ORklHX09QRU5SSVNDX0JVSUxUSU5fRFRCKScgJyIiJworQlVJTFRJTl9EVEIgOj0geQorZWxzZQorQlVJTFRJTl9EVEIgOj0gbgorZW5kaWYKK2NvcmUtJChCVUlMVElOX0RUQikgKz0gYXJjaC9vcGVucmlzYy9ib290LworCithbGw6IHZtbGludXgKZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvUkVBRE1FLm9wZW5yaXNjIGIvYXJjaC9vcGVucmlzYy9SRUFETUUub3BlbnJpc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmN2VkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvUkVBRE1FLm9wZW5yaXNjCkBAIC0wLDAgKzEsOTkgQEAKK09wZW5SSVNDIExpbnV4Cis9PT09PT09PT09PT09PQorCitUaGlzIGlzIGEgcG9ydCBvZiBMaW51eCB0byB0aGUgT3BlblJJU0MgY2xhc3Mgb2YgbWljcm9wcm9jZXNzb3JzOyB0aGUgaW5pdGlhbAordGFyZ2V0IGFyY2hpdGVjdHVyZSwgc3BlY2lmaWNhbGx5LCBpcyB0aGUgMzItYml0IE9wZW5SSVNDIDEwMDAgZmFtaWx5IChvcjFrKS4KKworRm9yIGluZm9ybWF0aW9uIGFib3V0IE9wZW5SSVNDIHByb2Nlc3NvcnMgYW5kIG9uZ29pbmcgZGV2ZWxvcG1lbnQ6CisKKwl3ZWJzaXRlCQlodHRwOi8vb3BlbnJpc2MubmV0CisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IExpbnV4IG9uIE9wZW5SSVNDLCBwbGVhc2UgY29udGFjdCBTb3V0aCBQb2xlIEFCLgorCisJZW1haWw6CQlpbmZvQHNvdXRocG9sZS5zZQorCisJd2Vic2l0ZToJaHR0cDovL3NvdXRocG9sZS5zZQorCQkJaHR0cDovL3NvdXRocG9sZWNvbnN1bHRpbmcuY29tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCdWlsZCBpbnN0cnVjdGlvbnMgZm9yIE9wZW5SSVNDIHRvb2xjaGFpbiBhbmQgTGludXgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbiBvcmRlciB0byBidWlsZCBhbmQgcnVuIExpbnV4IGZvciBPcGVuUklTQywgeW91J2xsIG5lZWQgYXQgbGVhc3QgYSBiYXNpYwordG9vbGNoYWluIGFuZCwgcGVyaGFwcywgdGhlIGFyY2hpdGVjdHVyYWwgc2ltdWxhdG9yLiAgU3RlcHMgdG8gZ2V0IHRoZXNlIGJpdHMKK2luIHBsYWNlIGFyZSBvdXRsaW5lZCBoZXJlLgorCisxKSAgVGhlIHRvb2xjaGFpbiBjYW4gYmUgb2J0YWluZWQgZnJvbSBvcGVucmlzYy5uZXQuICBJbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nCithIHRvb2xjaGFpbiBjYW4gYmUgZm91bmQgYXQ6CisKK2h0dHA6Ly9vcGVucmlzYy5uZXQvdG9vbGNoYWluLWJ1aWxkLmh0bWwKKworMikgb3Ixa3NpbSAob3B0aW9uYWwpCisKK29yMWtzaW0gaXMgdGhlIGFyY2hpdGVjdHVyYWwgc2ltdWxhdG9yIHdoaWNoIHdpbGwgYWxsb3cgeW91IHRvIGFjdHVhbGx5IHJ1bgoreW91ciBPcGVuUklTQyBMaW51eCBrZXJuZWwgaWYgeW91IGRvbid0IGhhdmUgYW4gT3BlblJJU0MgcHJvY2Vzc29yIGF0IGhhbmQuCisKKwlnaXQgY2xvbmUgZ2l0Oi8vb3BlbnJpc2MubmV0L2pvbmFzL29yMWtzaW0tc3ZuCisKKwljZCBvcjFrc2ltCisJLi9jb25maWd1cmUgLS1wcmVmaXg9JE9QRU5SSVNDX1BSRUZJWAorCW1ha2UKKwltYWtlIGluc3RhbGwKKworMykgIExpbnV4IGtlcm5lbAorCitCdWlsZCB0aGUga2VybmVsIGFzIHVzdWFsCisKKwltYWtlIEFSQ0g9b3BlbnJpc2MgZGVmY29uZmlnCisJbWFrZSBBUkNIPW9wZW5yaXNjCisKKzQpICBSdW4gaW4gYXJjaGl0ZWN0dXJhbCBzaW11bGF0b3IKKworR3JhYiB0aGUgb3Ixa3NpbSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGZpbGUgKGZyb20gdGhlIG9yMWtzaW0gc291cmNlKSBhbmQKK3RvZ2V0aGVyIHdpdGggeW91ciBmcmVzaGx5IGJ1aWx0IHZtbGludXgsIHJ1biB5b3VyIGtlcm5lbCB3aXRoIHRoZSBmb2xsb3dpbmcKK2luY2FudGF0aW9uOgorCisJc2ltIC1mIGFyY2gvb3BlbnJpc2Mvb3Ixa3NpbS5jZmcgdm1saW51eAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGVybWlub2xvZ3kKKz09PT09PT09PT09CisKK0luIHRoZSBjb2RlLCB0aGUgZm9sbG93aW5nIHBhcnRpY2xlcyBhcmUgdXNlZCBvbiBzeW1ib2xzIHRvIGxpbWl0IHRoZSBzY29wZQordG8gbW9yZSBvciBsZXNzIHNwZWNpZmljIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbnM6CisKK29wZW5yaXNjOiB0aGUgT3BlblJJU0MgY2xhc3Mgb2YgcHJvY2Vzc29ycworb3IxazogICAgIHRoZSBPcGVuUklTQyAxMDAwIGZhbWlseSBvZiBwcm9jZXNzb3JzCitvcjEyMDA6ICAgdGhlIE9wZW5SSVNDIDEyMDAgcHJvY2Vzc29yCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIaXN0b3J5Cis9PT09PT09PQorCisxOC4gMTEuIDIwMDMJTWF0amF6IEJyZXNrdmFyIChwaG9lbml4QGJzZW1pLmNvbSkKKwlpbml0aWFsIHBvcnQgb2YgbGludXggdG8gT3BlblJJU0Mvb3IzMiBhcmNoaXRlY3R1cmUuCisgICAgICAgIGFsbCB0aGUgY29yZSBzdHVmZiBpcyBpbXBsZW1lbnRlZCBhbmQgc2VhbXMgdXNhYmxlLgorCiswOC4gMTIuIDIwMDMJTWF0amF6IEJyZXNrdmFyIChwaG9lbml4QGJzZW1pLmNvbSkKKwljb21wbGV0ZSBjaGFuZ2Ugb2YgVExCIG1pc3MgaGFuZGxpbmcuCisJcmV3cml0ZSBvZiBleGNlcHRpb25zIGhhbmRsaW5nLgorCWZ1bGx5IGZ1bmN0aW9uYWwgc2FzaC0zLjYgaW4gZGVmYXVsdCBpbml0cmQuCisJYSBtdWNoIGltcHJvdmVkIHZlcnNpb24gd2l0aCBjaGFuZ2VzIGFsbCBhcm91bmQuCisKKzEwLiAwNC4gMjAwNAlNYXRqYXogQnJlc2t2YXIgKHBob2VuaXhAYnNlbWkuY29tKQorCWFsb3Qgb2YgYnVnZml4ZXMgYWxsIG92ZXIuCisJZXRoZXJuZXQgc3VwcG9ydCwgZnVuY3Rpb25hbCBodHRwIGFuZCB0ZWxuZXQgc2VydmVycy4KKwlydW5uaW5nIG1hbnkgc3RhbmRhcmQgbGludXggYXBwcy4KKworMjYuIDA2LiAyMDA0CU1hdGpheiBCcmVza3ZhciAocGhvZW5peEBic2VtaS5jb20pCisJcG9ydCB0byAyLjYueAorCiszMC4gMTEuIDIwMDQJTWF0amF6IEJyZXNrdmFyIChwaG9lbml4QGJzZW1pLmNvbSkKKwlsb3RzIG9mIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNtZW50cy4KKwlhZGRlZCBvcGVuY29yZXMgZnJhbWVidWZmZXIgZHJpdmVyLgorCiswOS4gMTAuIDIwMTAgICAgSm9uYXMgQm9ubiAoam9uYXNAc291dGhwb2xlLnNlKQorCW1ham9yIHJld3JpdGUgdG8gYnJpbmcgdXAgdG8gcGFyIHdpdGggdXBzdHJlYW0gTGludXggMi42LjM2CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL1RPRE8ub3BlbnJpc2MgYi9hcmNoL29wZW5yaXNjL1RPRE8ub3BlbnJpc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmZWVmOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvVE9ETy5vcGVucmlzYwpAQCAtMCwwICsxLDE2IEBACitUaGUgT3BlblJJU0MgTGludXggcG9ydCBpcyBmdWxseSBmdW5jdGlvbmFsIGFuZCBoYXMgYmVlbiB0cmFja2luZyB1cHN0cmVhbQorc2luY2UgMi42LjM1LiAgVGhlcmUgYXJlLCBob3dldmVyLCByZW1haW5pbmcgaXRlbXMgdG8gYmUgY29tcGxldGVkIHdpdGhpbgordGhlIGNvbWluZyBtb250aHMuICBIZXJlJ3MgYSBsaXN0IG9mIGtub3duLXRvLWJlLWxlc3MtdGhhbi1zdGVsbGFyIGl0ZW1zCit0aGF0IGFyZSBkdWUgZm9yIGludmVzdGlnYXRpb24gc2hvcnRseSwgaS5lLiBvdXIgVE9ETyBsaXN0OgorCistLSBJbXBsZW1lbnQgdGhlIHJlc3Qgb2YgdGhlIERNQSBBUEkuLi4gZG1hX21hcF9zZywgZXRjLgorCistLSBDb25zb2xpZGF0ZSB1c2FnZSBvZiBtZW1ibG9jayBhbmQgYm9vdG1lbS4uLiBtb3ZlIGV2ZXJ5dGhpbmcgb3ZlciB0bworICAgbWVtYmxvY2suCisKKy0tIEZpbmlzaCB0aGUgcmVuYW1pbmcgY2xlYW51cC4uLiB0aGVyZSBhcmUgcmVmZXJlbmNlcyB0byBvcjMyIGluIHRoZSBjb2RlCisgICB3aGljaCB3YXMgYW4gb2xkZXIgbmFtZSBmb3IgdGhlIGFyY2hpdGVjdHVyZS4gIFRoZSBuYW1lIHdlJ3ZlIHNldHRsZWQgb24gaXMKKyAgIG9yMWsgYW5kIHRoaXMgY2hhbmdlIGlzIHNsb3dseSB0cmlja2xpbmcgdGhyb3VnaCB0aGUgc3RhY2suICBGb3IgdGhlIHRpbWUKKyAgIGJlaW5nLCBvcjMyIGlzIGVxdWl2YWxlbnQgdG8gb3Ixay4KKworLS0gSW1wbGVtZW50IG9wdGltaXplZCB2ZXJzaW9uIG9mIG1lbWNweSBhbmQgbWVtc2V0CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL29wZW5yaXNjL2Jvb3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjYTE4NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvYm9vdC9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisKKworaWZuZXEgJyQoQ09ORklHX09QRU5SSVNDX0JVSUxUSU5fRFRCKScgJyIiJworQlVJTFRJTl9EVEIgOj0gJChwYXRzdWJzdCAiJSIsJSwkKENPTkZJR19PUEVOUklTQ19CVUlMVElOX0RUQikpLmR0Yi5vCitlbHNlCitCVUlMVElOX0RUQiA6PQorZW5kaWYKK29iai15ICs9ICQoQlVJTFRJTl9EVEIpCisKK2NsZWFuLWZpbGVzIDo9ICouZHRiLlMKKworI0RUQ19GTEFHUyA/PSAtcCAxMDI0CisKKyQob2JqKS8lLmR0YjogJChzcmMpL2R0cy8lLmR0cworCSQoY2FsbCBjbWQsZHRjKQpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9ib290L2R0cy9vcjFrc2ltLmR0cyBiL2FyY2gvb3BlbnJpc2MvYm9vdC9kdHMvb3Ixa3NpbS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0ZjkwMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvYm9vdC9kdHMvb3Ixa3NpbS5kdHMKQEAgLTAsMCArMSw1MCBAQAorL2R0cy12MS87CisvIHsKKwljb21wYXRpYmxlID0gIm9wZW5jb3JlcyxvcjFrc2ltIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZwaWM+OworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAiY29uc29sZT11YXJ0LG1taW8sMHg5MDAwMDAwMCwxMTUyMDAiOworCX07CisKKwltZW1vcnlAMCB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDIwMDAwMDA+OworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljcHVAMCB7CisJCQljb21wYXRpYmxlID0gIm9wZW5jb3JlcyxvcjEyMDAtcnRsc3ZuNDgxIjsKKwkJCXJlZyA9IDwwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyMDAwMDAwMD47CisJCX07CisJfTsKKworCS8qCisJICogT1IxSyBQSUMgaXMgYnVpbHQgaW50byBDUFUgYW5kIGFjY2Vzc2VkIHZpYSBzcGVjaWFsIHB1cnBvc2UKKwkgKiByZWdpc3RlcnMuICBJdCBpcyBub3QgYWRkcmVzc2FibGUgYW5kLCBoZW5jZSwgaGFzIG5vICdyZWcnCisJICogcHJvcGVydHkuCisJICovCisJcGljOiBwaWMgeworCQljb21wYXRpYmxlID0gIm9wZW5jb3JlcyxvcjFrLXBpYyI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCWludGVycnVwdC1jb250cm9sbGVyOworCX07CisKKwlzZXJpYWwwOiBzZXJpYWxAOTAwMDAwMDAgeworCQljb21wYXRpYmxlID0gIm9wZW5jb3Jlcyx1YXJ0MTY1NTAtcnRsc3ZuMTA1IiwgIm5zMTY1NTBhIjsKKwkJcmVnID0gPDB4OTAwMDAwMDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPDI+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDA+OworCX07CisKKwllbmV0MDogZXRob2NAOTIwMDAwMDAgeworCQljb21wYXRpYmxlID0gIm9wZW5jb3JlcyxldGhtYWMtcnRsc3ZuMzM4IjsKKwkJcmVnID0gPDB4OTIwMDAwMDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPDQ+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9jb25maWdzL29yMWtzaW1fZGVmY29uZmlnIGIvYXJjaC9vcGVucmlzYy9jb25maWdzL29yMWtzaW1fZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTcyYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2NvbmZpZ3Mvb3Ixa3NpbV9kZWZjb25maWcKQEAgLTAsMCArMSw2NSBAQAorQ09ORklHX0NST1NTX0NPTVBJTEU9Im9yMzItbGludXgtIgorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19SRF9HWklQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFBFUlQ9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJGRCBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVEZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKK0NPTkZJR19TTE9CPXkKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX0JMT0NLIGlzIG5vdCBzZXQKK0NPTkZJR19PUEVOUklTQ19CVUlMVElOX0RUQj0ib3Ixa3NpbSIKK0NPTkZJR19OT19IWj15CitDT05GSUdfSFpfMTAwPXkKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfVU5JWD15CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19BRFZBTkNFRD15CisjIENPTkZJR19UQ1BfQ09OR19CSUMgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfQ1VCSUMgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfV0VTVFdPT0QgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfSFRDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZUTVBGUz15CitDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQorIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfTUlDUkVMX1BIWT15CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19FVEhPQz15CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNPXkKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTYyZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMCwwICsxLDY0IEBACitpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQorCitoZWFkZXIteSArPSBzcHJfZGVmcy5oCisKK2dlbmVyaWMteSArPSBhdG9taWMuaAorZ2VuZXJpYy15ICs9IGF1eHZlYy5oCitnZW5lcmljLXkgKz0gYml0c3BlcmxvbmcuaAorZ2VuZXJpYy15ICs9IGJ1Zy5oCitnZW5lcmljLXkgKz0gYnVncy5oCitnZW5lcmljLXkgKz0gY2FjaGVmbHVzaC5oCitnZW5lcmljLXkgKz0gY2hlY2tzdW0uaAorZ2VuZXJpYy15ICs9IGNtcHhjaGcuaAorZ2VuZXJpYy15ICs9IGNtcHhjaGctbG9jYWwuaAorZ2VuZXJpYy15ICs9IGNwdW1hc2suaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAorZ2VuZXJpYy15ICs9IGN1cnJlbnQuaAorZ2VuZXJpYy15ICs9IGRldmljZS5oCitnZW5lcmljLXkgKz0gZGl2NjQuaAorZ2VuZXJpYy15ICs9IGRtYS5oCitnZW5lcmljLXkgKz0gZW1lcmdlbmN5LXJlc3RhcnQuaAorZ2VuZXJpYy15ICs9IGVycm5vLmgKK2dlbmVyaWMteSArPSBmYi5oCitnZW5lcmljLXkgKz0gZmNudGwuaAorZ2VuZXJpYy15ICs9IGZ0cmFjZS5oCitnZW5lcmljLXkgKz0gZnV0ZXguaAorZ2VuZXJpYy15ICs9IGhhcmRpcnEuaAorZ2VuZXJpYy15ICs9IGh3X2lycS5oCitnZW5lcmljLXkgKz0gaW9jdGwuaAorZ2VuZXJpYy15ICs9IGlvY3Rscy5oCitnZW5lcmljLXkgKz0gaXBjYnVmLmgKK2dlbmVyaWMteSArPSBpcnFfcmVncy5oCitnZW5lcmljLXkgKz0ga2RlYnVnLmgKK2dlbmVyaWMteSArPSBrbWFwX3R5cGVzLmgKK2dlbmVyaWMteSArPSBsb2NhbC5oCitnZW5lcmljLXkgKz0gbW1hbi5oCitnZW5lcmljLXkgKz0gbW9kdWxlLmgKK2dlbmVyaWMteSArPSBtc2didWYuaAorZ2VuZXJpYy15ICs9IHBjaS5oCitnZW5lcmljLXkgKz0gcGVyY3B1LmgKK2dlbmVyaWMteSArPSBwb2xsLmgKK2dlbmVyaWMteSArPSBwb3NpeF90eXBlcy5oCitnZW5lcmljLXkgKz0gcmVzb3VyY2UuaAorZ2VuZXJpYy15ICs9IHJtYXAuaAorZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKK2dlbmVyaWMteSArPSBzZWN0aW9ucy5oCitnZW5lcmljLXkgKz0gc2VnbWVudC5oCitnZW5lcmljLXkgKz0gc2VtYnVmLmgKK2dlbmVyaWMteSArPSBzZXR1cC5oCitnZW5lcmljLXkgKz0gc2htYnVmLmgKK2dlbmVyaWMteSArPSBzaG1wYXJhbS5oCitnZW5lcmljLXkgKz0gc2lnaW5mby5oCitnZW5lcmljLXkgKz0gc2lnbmFsLmgKK2dlbmVyaWMteSArPSBzb2NrZXQuaAorZ2VuZXJpYy15ICs9IHNvY2tpb3MuaAorZ2VuZXJpYy15ICs9IHN0YXRmcy5oCitnZW5lcmljLXkgKz0gc3RhdC5oCitnZW5lcmljLXkgKz0gc3RyaW5nLmgKK2dlbmVyaWMteSArPSBzd2FiLmgKK2dlbmVyaWMteSArPSB0ZXJtYml0cy5oCitnZW5lcmljLXkgKz0gdGVybWlvcy5oCitnZW5lcmljLXkgKz0gdG9wb2xvZ3kuaAorZ2VuZXJpYy15ICs9IHR5cGVzLmgKK2dlbmVyaWMteSArPSB1Y29udGV4dC5oCitnZW5lcmljLXkgKz0gdXNlci5oCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2FzbS1vZmZzZXRzLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2FzbS1vZmZzZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3MGVlMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vYXNtLW9mZnNldHMuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8Z2VuZXJhdGVkL2FzbS1vZmZzZXRzLmg+CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2JpdG9wcy5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9iaXRvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWUxMWVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9iaXRvcHMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX0JJVE9QU19ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX0JJVE9QU19ICisKKy8qCisgKiBXaGVyZSB3ZSBoYXZlbid0IHdyaXR0ZW4gYXNzZW1ibHkgdmVyc2lvbnMgeWV0LCB3ZSBmYWxsIGJhY2sgdG8gdGhlCisgKiBnZW5lcmljIGltcGxlbWVudGF0aW9ucy4gIE90aGVyd2lzZSwgd2UgcHVsbCBpbiBvdXIgKGhvcGVmdWxseSkKKyAqIG9wdGltaXplZCB2ZXJzaW9ucy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisvKgorICogY2xlYXJfYml0IG1heSBub3QgaW1wbHkgYSBtZW1vcnkgYmFycmllcgorICovCisjaWZuZGVmIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdAorI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKQlzbXBfbWIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpCXNtcF9tYigpCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9iaXRvcHMvX19mZnMuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmZ6Lmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy9mbHMuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzL19fZmxzLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2ZsczY0Lmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2ZpbmQuaD4KKworI2lmbmRlZiBfTElOVVhfQklUT1BTX0gKKyNlcnJvciBvbmx5IDxsaW51eC9iaXRvcHMuaD4gY2FuIGJlIGluY2x1ZGVkIGRpcmVjdGx5CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMvZmZzLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2h3ZWlnaHQuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvbG9jay5oPgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9ub24tYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2V4dDItYXRvbWljLmg+CisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX0JJVE9QU19IICovCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2JpdG9wcy9fX2Zmcy5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9iaXRvcHMvX19mZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzgzNjhhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9iaXRvcHMvX19mZnMuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX19fRkZTX0gKKyNkZWZpbmUgX19BU01fT1BFTlJJU0NfX19GRlNfSAorCisKKyNpZmRlZiBDT05GSUdfT1BFTlJJU0NfSEFWRV9JTlNUX0ZGMQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19mZnModW5zaWduZWQgbG9uZyB4KQoreworCWludCByZXQ7CisKKwlfX2FzbV9fICgibC5mZjEgJTAsJTEiCisJCSA6ICI9ciIgKHJldCkKKwkJIDogInIiICh4KSk7CisKKwlyZXR1cm4gcmV0LTE7Cit9CisKKyNlbHNlCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL19fZmZzLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNNX09QRU5SSVNDX19fRkZTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vYml0b3BzL19fZmxzLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2JpdG9wcy9fX2Zscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZWNkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2JpdG9wcy9fX2Zscy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfX19GTFNfSAorI2RlZmluZSBfX0FTTV9PUEVOUklTQ19fX0ZMU19ICisKKworI2lmZGVmIENPTkZJR19PUEVOUklTQ19IQVZFX0lOU1RfRkwxCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2Zscyh1bnNpZ25lZCBsb25nIHgpCit7CisJaW50IHJldDsKKworCV9fYXNtX18gKCJsLmZsMSAlMCwlMSIKKwkJIDogIj1yIiAocmV0KQorCQkgOiAiciIgKHgpKTsKKworCXJldHVybiByZXQtMTsKK30KKworI2Vsc2UKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvX19mbHMuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fT1BFTlJJU0NfX19GTFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9iaXRvcHMvZmZzLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2JpdG9wcy9mZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGU0NjI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9iaXRvcHMvZmZzLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19GRlNfSAorI2RlZmluZSBfX0FTTV9PUEVOUklTQ19GRlNfSAorCisjaWZkZWYgQ09ORklHX09QRU5SSVNDX0hBVkVfSU5TVF9GRjEKKworc3RhdGljIGlubGluZSBpbnQgZmZzKGludCB4KQoreworCWludCByZXQ7CisKKwlfX2FzbV9fICgibC5mZjEgJTAsJTEiCisJCSA6ICI9ciIgKHJldCkKKwkJIDogInIiICh4KSk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZWxzZQorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9mZnMuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fT1BFTlJJU0NfRkZTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vYml0b3BzL2Zscy5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9iaXRvcHMvZmxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmYmY5YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vYml0b3BzL2Zscy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfRkxTX0gKKyNkZWZpbmUgX19BU01fT1BFTlJJU0NfRkxTX0gKKworCisjaWZkZWYgQ09ORklHX09QRU5SSVNDX0hBVkVfSU5TVF9GTDEKKworc3RhdGljIGlubGluZSBpbnQgZmxzKGludCB4KQoreworCWludCByZXQ7CisKKwlfX2FzbV9fICgibC5mbDEgJTAsJTEiCisJCSA6ICI9ciIgKHJldCkKKwkJIDogInIiICh4KSk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZWxzZQorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9mbHMuaD4KKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fT1BFTlJJU0NfRkxTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZDE0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9jYWNoZS5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTdhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2NhY2hlLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogT3BlblJJU0MgaW1wbGVtZW50YXRpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19DQUNIRV9ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX0NBQ0hFX0gKKworLyogRklYTUU6IEhvdyBjYW4gd2UgcmVwbGFjZSB0aGVzZSB3aXRoIHZhbHVlcyBmcm9tIHRoZSBDUFUuLi4KKyAqIHRoZXkgc2hvdWxkbid0IGJlIGhhcmQtY29kZWQhCisgKi8KKworI2RlZmluZSBMMV9DQUNIRV9CWVRFUyAxNgorI2RlZmluZSBMMV9DQUNIRV9TSElGVCA0CisKKyNlbmRpZiAvKiBfX0FTTV9PUEVOUklTQ19DQUNIRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2NwdWluZm8uaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vY3B1aW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzMxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2NwdWluZm8uaApAQCAtMCwwICsxLDM0IEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX0NQVUlORk9fSAorI2RlZmluZSBfX0FTTV9PUEVOUklTQ19DUFVJTkZPX0gKKworc3RydWN0IGNwdWluZm8geworCXUzMiBjbG9ja19mcmVxdWVuY3k7CisKKwl1MzIgaWNhY2hlX3NpemU7CisJdTMyIGljYWNoZV9ibG9ja19zaXplOworCisJdTMyIGRjYWNoZV9zaXplOworCXUzMiBkY2FjaGVfYmxvY2tfc2l6ZTsKK307CisKK2V4dGVybiBzdHJ1Y3QgY3B1aW5mbyBjcHVpbmZvOworCisjZW5kaWYgLyogX19BU01fT1BFTlJJU0NfQ1BVSU5GT19IICovCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2RlbGF5LmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2RlbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmOGJmNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vZGVsYXkuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfREVMQVlfSAorI2RlZmluZSBfX0FTTV9PUEVOUklTQ19ERUxBWV9ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZWxheS5oPgorCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MmY4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE9wZW5SSVNDIGltcGxlbWVudGF0aW9uOgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19ETUFfTUFQUElOR19ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX0RNQV9NQVBQSU5HX0gKKworLyoKKyAqIFNlZSBEb2N1bWVudGF0aW9uL1BDSS9QQ0ktRE1BLW1hcHBpbmcudHh0IGFuZAorICogRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dCBmb3IgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgd3JpdHRlbiB3aXRoIHRoZSBpbnRlbnRpb24gb2YgZXZlbnR1YWxseSBtb3Zpbmcgb3ZlcgorICogdG8gbGFyZ2VseSB1c2luZyBhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1jb21tb24uaCBpbiBpdHMgcGxhY2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RtYS1kZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1jb2hlcmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW1jaGVjay5oPgorCisjZGVmaW5lIERNQV9FUlJPUl9DT0RFCQkofihkbWFfYWRkcl90KTB4MCkKKworaW50IGRtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcik7CisKKyNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpIGRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBoLCBmKQorI2RlZmluZSBkbWFfZnJlZV9ub25jb2hlcmVudChkLCBzLCB2LCBoKSBkbWFfZnJlZV9jb2hlcmVudChkLCBzLCB2LCBoKQorCit2b2lkICpvcjFrX2RtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZyk7Cit2b2lkIG9yMWtfZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsCisJCQkgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKTsKK2RtYV9hZGRyX3Qgb3Ixa19tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpOwordm9pZCBvcjFrX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCSAgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJICAgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycyk7Cit2b2lkIG9yMWtfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAorCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKTsKK3ZvaWQgb3Ixa19zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCisJCQkgICAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQoreworCXZvaWQgKm1lbW9yeTsKKworCW1lbW9yeSA9IG9yMWtfZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgZG1hX2hhbmRsZSwgZmxhZyk7CisKKwlkZWJ1Z19kbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCAqZG1hX2hhbmRsZSwgbWVtb3J5KTsKKwlyZXR1cm4gbWVtb3J5OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCit7CisJZGVidWdfZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCBjcHVfYWRkciwgZG1hX2hhbmRsZSk7CisJb3Ixa19kbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIGNwdV9hZGRyLCBkbWFfaGFuZGxlKTsKK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGRtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLAorCQkJCQlzaXplX3Qgc2l6ZSwKKwkJCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWRtYV9hZGRyX3QgYWRkcjsKKworCWttZW1jaGVja19tYXJrX2luaXRpYWxpemVkKHB0ciwgc2l6ZSk7CisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcikpOworCWFkZHIgPSBvcjFrX21hcF9wYWdlKGRldiwgdmlydF90b19wYWdlKHB0ciksCisJCQkgICAgICh1bnNpZ25lZCBsb25nKXB0ciAmIH5QQUdFX01BU0ssIHNpemUsCisJCQkgICAgIGRpciwgTlVMTCk7CisJZGVidWdfZG1hX21hcF9wYWdlKGRldiwgdmlydF90b19wYWdlKHB0ciksCisJCQkgICAodW5zaWduZWQgbG9uZylwdHIgJiB+UEFHRV9NQVNLLCBzaXplLAorCQkJICAgZGlyLCBhZGRyLCB0cnVlKTsKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGFkZHIsCisJCQkJCSAgc2l6ZV90IHNpemUsCisJCQkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXIpKTsKKwlvcjFrX3VubWFwX3BhZ2UoZGV2LCBhZGRyLCBzaXplLCBkaXIsIE5VTEwpOworCWRlYnVnX2RtYV91bm1hcF9wYWdlKGRldiwgYWRkciwgc2l6ZSwgZGlyLCB0cnVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyLAorCQkJCQkgICBzaXplX3Qgc2l6ZSwKKwkJCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXIpKTsKKwlvcjFrX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBhZGRyLCBzaXplLCBkaXIpOworCWRlYnVnX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldiwgYWRkciwgc2l6ZSwgZGlyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgZG1hX2FkZHJfdCBhZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXIpKTsKKwlvcjFrX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBhZGRyLCBzaXplLCBkaXIpOworCWRlYnVnX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgYWRkciwgc2l6ZSwgZGlyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBkbWFfbWFzaykKK3sKKwkvKiBTdXBwb3J0IDMyIGJpdCBETUEgbWFzayBleGNsdXNpdmVseSAqLworCXJldHVybiBkbWFfbWFzayA9PSAweGZmZmZmZmZmVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgZG1hX21hc2spCit7CisJaWYgKCFkZXYtPmRtYV9tYXNrIHx8ICFkbWFfc3VwcG9ydGVkKGRldiwgZG1hX21hc2spKQorCQlyZXR1cm4gLUVJTzsKKworCSpkZXYtPmRtYV9tYXNrID0gZG1hX21hc2s7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBfX0FTTV9PUEVOUklTQ19ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2U2MDNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogT3BlblJJU0MgaW1wbGVtZW50YXRpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19FTEZfSAorI2RlZmluZSBfX0FTTV9PUEVOUklTQ19FTEZfSAorCisvKgorICogRUxGIHJlZ2lzdGVyIGRlZmluaXRpb25zLi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisKKworLyogVGhlIE9SMUsgcmVsb2NhdGlvbiB0eXBlcy4uLiBub3QgYWxsIHJlbGV2YW50IGZvciBtb2R1bGUgbG9hZGVyICovCisjZGVmaW5lIFJfT1IzMl9OT05FCTAKKyNkZWZpbmUgUl9PUjMyXzMyCTEKKyNkZWZpbmUgUl9PUjMyXzE2CTIKKyNkZWZpbmUgUl9PUjMyXzgJMworI2RlZmluZSBSX09SMzJfQ09OU1QJNAorI2RlZmluZSBSX09SMzJfQ09OU1RICTUKKyNkZWZpbmUgUl9PUjMyX0pVTVBUQVJHCTYKKyNkZWZpbmUgUl9PUjMyX1ZUSU5IRVJJVCA3CisjZGVmaW5lIFJfT1IzMl9WVEVOVFJZCTgKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7CisKKy8qCisgKiBOb3RlIHRoYXQgTkdSRUcgaXMgZGVmaW5lZCB0byBFTEZfTkdSRUcgaW4gaW5jbHVkZS9saW51eC9lbGZjb3JlLmgsIGFuZCBpcworICogdGh1cyBleHBvc2VkIHRvIHVzZXItc3BhY2UuCisgKi8KKyNkZWZpbmUgRUxGX05HUkVHIChzaXplb2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QpIC8gc2l6ZW9mKGVsZl9ncmVnX3QpKQordHlwZWRlZiBlbGZfZ3JlZ190IGVsZl9ncmVnc2V0X3RbRUxGX05HUkVHXTsKKworLyogQSBwbGFjZWhvbGRlcjsgT1IzMiBkb2VzIG5vdCBoYXZlIGZwIHN1cHBvcnQgeWVzLCBzbyBubyBmcCByZWdzIGZvciBub3cuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9mcHJlZ3NldF90OworCisvKiBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byBpbmNsdWRlL2xpbnV4L2VsZi5oICovCisjZGVmaW5lIEVNX09SMzIgICAgICAgICAweDg0NzIKKyNkZWZpbmUgRU1fT1BFTlJJU0MgICAgIDkyICAgICAvKiBPcGVuUklTQyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisKKy8qCisgKiBUaGVzZSBhcmUgdXNlZCB0byBzZXQgcGFyYW1ldGVycyBpbiB0aGUgY29yZSBkdW1wcy4KKyAqLworI2RlZmluZSBFTEZfQVJDSAlFTV9PUjMyCisjZGVmaW5lIEVMRl9DTEFTUwlFTEZDTEFTUzMyCisjZGVmaW5lIEVMRl9EQVRBCUVMRkRBVEEyTVNCCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGxvYWQgc29tZXRoaW5nIGZvciB0aGUgd3JvbmcgYXJjaGl0ZWN0dXJlLgorICovCisKKyNkZWZpbmUgZWxmX2NoZWNrX2FyY2goeCkgXAorCSgoKHgpLT5lX21hY2hpbmUgPT0gRU1fT1IzMikgfHwgKCh4KS0+ZV9tYWNoaW5lID09IEVNX09QRU5SSVNDKSkKKworLyogVGhpcyBpcyB0aGUgbG9jYXRpb24gdGhhdCBhbiBFVF9EWU4gcHJvZ3JhbSBpcyBsb2FkZWQgaWYgZXhlYydlZC4gIFR5cGljYWwKKyAgIHVzZSBvZiB0aGlzIGlzIHRvIGludm9rZSAiLi9sZC5zbyBzb21lcHJvZyIgdG8gdGVzdCBvdXQgYSBuZXcgdmVyc2lvbiBvZgorICAgdGhlIGxvYWRlci4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIHByb2dyYW0KKyAgIHRoYXQgaXQgd2lsbCAiZXhlYyIsIGFuZCB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgcm9vbSBmb3IgdGhlIGJyay4gICovCisKKyNkZWZpbmUgRUxGX0VUX0RZTl9CQVNFICAgICAgICAgKDB4MDgwMDAwMDApCisKKy8qCisgKiBFbmFibGUgZHVtcCB1c2luZyByZWdzZXQuCisgKiBUaGlzIGNvdmVycyBhbGwgb2YgZ2VuZXJhbC9EU1AvRlBVIHJlZ3MuCisgKi8KKyNkZWZpbmUgQ09SRV9EVU1QX1VTRV9SRUdTRVQKKworI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRQk4MTkyCisKK2V4dGVybiB2b2lkIGR1bXBfZWxmX3RocmVhZChlbGZfZ3JlZ190ICpkZXN0LCBzdHJ1Y3QgcHRfcmVncyAqcHQpOworI2RlZmluZSBFTEZfQ09SRV9DT1BZX1JFR1MoZGVzdCwgcmVncykgZHVtcF9lbGZfdGhyZWFkKGRlc3QsIHJlZ3MpOworCisvKiBUaGlzIHlpZWxkcyBhIG1hc2sgdGhhdCB1c2VyIHByb2dyYW1zIGNhbiB1c2UgdG8gZmlndXJlIG91dCB3aGF0CisgICBpbnN0cnVjdGlvbiBzZXQgdGhpcyBjcHUgc3VwcG9ydHMuICBUaGlzIGNvdWxkIGJlIGRvbmUgaW4gdXNlcnNwYWNlLAorICAgYnV0IGl0J3Mgbm90IGVhc3ksIGFuZCB3ZSd2ZSBhbHJlYWR5IGRvbmUgaXQgaGVyZS4gICovCisKKyNkZWZpbmUgRUxGX0hXQ0FQCSgwKQorCisvKiBUaGlzIHlpZWxkcyBhIHN0cmluZyB0aGF0IGxkLnNvIHdpbGwgdXNlIHRvIGxvYWQgaW1wbGVtZW50YXRpb24KKyAgIHNwZWNpZmljIGxpYnJhcmllcyBmb3Igb3B0aW1pemF0aW9uLiAgVGhpcyBpcyBtb3JlIHNwZWNpZmljIGluCisgICBpbnRlbnQgdGhhbiBwb2tpbmcgYXQgdW5hbWUgb3IgL3Byb2MvY3B1aW5mby4KKworICAgRm9yIHRoZSBtb21lbnQsIHdlIGhhdmUgb25seSBvcHRpbWl6YXRpb25zIGZvciB0aGUgSW50ZWwgZ2VuZXJhdGlvbnMsCisgICBidXQgdGhhdCBjb3VsZCBjaGFuZ2UuLi4gKi8KKworI2RlZmluZSBFTEZfUExBVEZPUk0JKE5VTEwpCisKKyNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4KSBzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYKQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2ZpeG1hcC5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9maXhtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjczMzQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9maXhtYXAuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX0ZJWE1BUF9ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX0ZJWE1BUF9ICisKKy8qIFdoeSBleGFjdGx5IGRvIHdlIG5lZWQgMiBlbXB0eSBwYWdlcyBiZXR3ZWVuIHRoZSB0b3Agb2YgdGhlIGZpeGVkCisgKiBhZGRyZXNzZXMgYW5kIHRoZSB0b3Agb2YgdmlydHVhbCBtZW1vcnk/ICBTb21ldGhpbmcgaXMgdXNpbmcgdGhhdAorICogbWVtb3J5IHNwYWNlIGJ1dCBub3Qgc3VyZSB3aGF0IHJpZ2h0IG5vdy4uLiBJZiB5b3UgZmluZCBpdCwgbGVhdmUKKyAqIGEgY29tbWVudCBoZXJlLgorICovCisjZGVmaW5lIEZJWEFERFJfVE9QCSgodW5zaWduZWQgbG9uZykgKC0yKlBBR0VfU0laRSkpCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisvKgorICogT24gT3BlblJJU0Mgd2UgdXNlIHRoZXNlIHNwZWNpYWwgZml4ZWRfYWRkcmVzc2VzIGZvciBkb2luZyBpb3JlbWFwCisgKiBlYXJseSBpbiB0aGUgYm9vdCBwcm9jZXNzIGJlZm9yZSBtZW1vcnkgaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuCisgKiBUaGlzIGlzIHVzZWQsIGluIHBhcnRpY3VsYXIsIGJ5IHRoZSBlYXJseSBzZXJpYWwgY29uc29sZSBjb2RlLgorICoKKyAqIEl0J3Mgbm90IHJlYWxseSAnZml4bWFwJywgcGVyIHNlLCBidXQgZml0cyBsb29zZWx5IGludG8gdGhlIHNhbWUKKyAqIHBhcmFkaWdtLgorICovCitlbnVtIGZpeGVkX2FkZHJlc3NlcyB7CisJLyoKKwkgKiBGSVhfSU9SRU1BUCBlbnRyaWVzIGFyZSB1c2VmdWwgZm9yIG1hcHBpbmcgcGh5c2ljYWwgYWRkcmVzcworCSAqIHNwYWNlIGJlZm9yZSBpb3JlbWFwKCkgaXMgdXNlYWJsZSwgZS5nLiByZWFsbHkgZWFybHkgaW4gYm9vdAorCSAqIGJlZm9yZSBrbWFsbG9jKCkgaXMgd29ya2luZy4KKwkgKi8KKyNkZWZpbmUgRklYX05fSU9SRU1BUFMgIDMyCisJRklYX0lPUkVNQVBfQkVHSU4sCisJRklYX0lPUkVNQVBfRU5EID0gRklYX0lPUkVNQVBfQkVHSU4gKyBGSVhfTl9JT1JFTUFQUyAtIDEsCisJX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzCit9OworCisjZGVmaW5lIEZJWEFERFJfU0laRQkJKF9fZW5kX29mX2ZpeGVkX2FkZHJlc3NlcyA8PCBQQUdFX1NISUZUKQorLyogRklYQUREUl9CT1RUT00gbWlnaHQgYmUgYSBiZXR0ZXIgbmFtZSBoZXJlLi4uICovCisjZGVmaW5lIEZJWEFERFJfU1RBUlQJCShGSVhBRERSX1RPUCAtIEZJWEFERFJfU0laRSkKKworI2RlZmluZSBfX2ZpeF90b192aXJ0KHgpCShGSVhBRERSX1RPUCAtICgoeCkgPDwgUEFHRV9TSElGVCkpCisjZGVmaW5lIF9fdmlydF90b19maXgoeCkJKChGSVhBRERSX1RPUCAtICgoeCkmUEFHRV9NQVNLKSkgPj4gUEFHRV9TSElGVCkKKworLyoKKyAqICdpbmRleCB0byBhZGRyZXNzJyB0cmFuc2xhdGlvbi4gSWYgYW55b25lIHRyaWVzIHRvIHVzZSB0aGUgaWR4CisgKiBkaXJlY3RseSB3aXRob3V0IHRyYW5sYXRpb24sIHdlIGNhdGNoIHRoZSBidWcgd2l0aCBhIE5VTEwtZGVmZXJlbmNlCisgKiBrZXJuZWwgb29wcy4gSWxsZWdhbCByYW5nZXMgb2YgaW5jb21pbmcgaW5kaWNlcyBhcmUgY2F1Z2h0IHRvby4KKyAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIGZpeF90b192aXJ0KGNvbnN0IHVuc2lnbmVkIGludCBpZHgpCit7CisJLyoKKwkgKiB0aGlzIGJyYW5jaCBnZXRzIGNvbXBsZXRlbHkgZWxpbWluYXRlZCBhZnRlciBpbmxpbmluZywKKwkgKiBleGNlcHQgd2hlbiBzb21lb25lIHRyaWVzIHRvIHVzZSBmaXhhZGRyIGluZGljZXMgaW4gYW4KKwkgKiBpbGxlZ2FsIHdheS4gKHN1Y2ggYXMgbWl4aW5nIHVwIGFkZHJlc3MgdHlwZXMgb3IgdXNpbmcKKwkgKiBvdXQtb2YtcmFuZ2UgaW5kaWNlcykuCisJICoKKwkgKiBJZiBpdCBkb2Vzbid0IGdldCByZW1vdmVkLCB0aGUgbGlua2VyIHdpbGwgY29tcGxhaW4KKwkgKiBsb3VkbHkgd2l0aCBhIHJlYXNvbmFibHkgY2xlYXIgZXJyb3IgbWVzc2FnZS4uCisJICovCisJaWYgKGlkeCA+PSBfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMpCisJCUJVRygpOworCisJcmV0dXJuIF9fZml4X3RvX3ZpcnQoaWR4KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZpcnRfdG9fZml4KGNvbnN0IHVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJQlVHX09OKHZhZGRyID49IEZJWEFERFJfVE9QIHx8IHZhZGRyIDwgRklYQUREUl9TVEFSVCk7CisJcmV0dXJuIF9fdmlydF90b19maXgodmFkZHIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vZ3Bpby5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwZDE3NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vZ3Bpby5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE9wZW5SSVNDIGltcGxlbWVudGF0aW9uOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKiBldCBhbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfR1BJT19ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX0dQSU9fSAorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CisKKyNpZmRlZiBDT05GSUdfR1BJT0xJQgorCisvKgorICogT3BlblJJU0MgKG9yMWspIGRvZXMgbm90IGhhdmUgb24tY2hpcCBHUElPJ3Mgc28gdGhlcmUgaXMgbm90IHJlYWxseQorICogYW55IHN0YW5kYXJkaXplZCBpbXBsZW1lbnRhdGlvbiB0aGF0IG1ha2VzIHNlbnNlIGhlcmUuICBJZiBwYXNzaW5nCisgKiB0aHJvdWdoIGdwaW9saWIgYmVjb21lcyBhIGJvdHRsZW5lY2sgdGhlbiBpdCBtYXkgbWFrZSBzZW5zZSwgb24gYQorICogY2FzZS1ieS1jYXNlIGJhc2lzLCB0byBpbXBsZW1lbnQgdGhlc2UgaW5saW5lZC9yYXBpZCB2ZXJzaW9ucy4KKyAqCisgKiBKdXN0IGNhbGwgZ3Bpb2xpYi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIF9fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbHVlKQoreworCV9fZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX2NhbnNsZWVwKHVuc2lnbmVkIGludCBncGlvKQoreworCXJldHVybiBfX2dwaW9fY2Fuc2xlZXAoZ3Bpbyk7Cit9CisKKy8qCisgKiBOb3QgaW1wbGVtZW50ZWQsIHlldC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfR1BJT0xJQiAqLworCisjZW5kaWYgLyogX19BU01fT1BFTlJJU0NfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmNTI5OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vaW8uaApAQCAtMCwwICsxLDUxIEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19JT19ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX0lPX0gKKworLyoKKyAqIFBDSTogY2FuIHdlIHJlYWxseSBkbyAwIGhlcmUgaWYgd2UgaGF2ZSBubyBwb3J0IElPPworICovCisjZGVmaW5lIElPX1NQQUNFX0xJTUlUCQkwCisKKy8qIE9wZW5SSVNDIGhhcyBubyBwb3J0IElPICovCisjZGVmaW5lIEhBVkVfQVJDSF9QSU9fU0laRQkxCisjZGVmaW5lIFBJT19SRVNFUlZFRAkJMFgwVUwKKyNkZWZpbmUgUElPX09GRlNFVAkJMAorI2RlZmluZSBQSU9fTUFTSwkJMAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW8uaD4KKworZXh0ZXJuIHZvaWQgX19pb21lbSAqX19pb3JlbWFwKHBoeXNfYWRkcl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCXBncHJvdF90IHByb3QpOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaW9yZW1hcChwaHlzX2FkZHJfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlyZXR1cm4gX19pb3JlbWFwKG9mZnNldCwgc2l6ZSwgUEFHRV9LRVJORUwpOworfQorCisvKiAjZGVmaW5lIF9QQUdFX0NJICAgICAgIDB4MDAyICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaW9yZW1hcF9ub2NhY2hlKHBoeXNfYWRkcl90IG9mZnNldCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmV0dXJuIF9faW9yZW1hcChvZmZzZXQsIHNpemUsCisJCQkgX19wZ3Byb3QocGdwcm90X3ZhbChQQUdFX0tFUk5FTCkgfCBfUEFHRV9DSSkpOworfQorCitleHRlcm4gdm9pZCBpb3VubWFwKHZvaWQgKmFkZHIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2lycS5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjYxMmIxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9pcnEuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX0lSUV9IX18KKyNkZWZpbmUgX19BU01fT1BFTlJJU0NfSVJRX0hfXworCisjZGVmaW5lCU5SX0lSUVMJCTMyCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaXJxLmg+CisKKyNkZWZpbmUgTk9fSVJRCQkoLTEpCisKKyNlbmRpZiAvKiBfX0FTTV9PUEVOUklTQ19JUlFfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2lycWZsYWdzLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4NmM2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fX0FTTV9PUEVOUklTQ19JUlFGTEFHU19ICisjZGVmaW5lIF9fX0FTTV9PUEVOUklTQ19JUlFGTEFHU19ICisKKyNpbmNsdWRlIDxhc20vc3ByX2RlZnMuaD4KKworI2RlZmluZSBBUkNIX0lSUV9ESVNBQkxFRCAgICAgICAgMHgwMAorI2RlZmluZSBBUkNIX0lSUV9FTkFCTEVEICAgICAgICAgKFNQUl9TUl9JRUV8U1BSX1NSX1RFRSkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lycWZsYWdzLmg+CisKKyNlbmRpZiAvKiBfX19BU01fT1BFTlJJU0NfSVJRRkxBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9saW5rYWdlLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL2xpbmthZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjYzODc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9saW5rYWdlLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogT3BlblJJU0MgaW1wbGVtZW50YXRpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19MSU5LQUdFX0gKKyNkZWZpbmUgX19BU01fT1BFTlJJU0NfTElOS0FHRV9ICisKKyNkZWZpbmUgX19BTElHTiAgICAgIC5hbGlnbiAwCisjZGVmaW5lIF9fQUxJR05fU1RSICIuYWxpZ24gMCIKKworI2VuZGlmIC8qIF9fQVNNX09QRU5SSVNDX0xJTktBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9tZW1ibG9jay5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9tZW1ibG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTVhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL21lbWJsb2NrLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogT3BlblJJU0MgaW1wbGVtZW50YXRpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19NRU1CTE9DS19ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX01FTUJMT0NLX0gKKworLyogZW1wdHkgKi8KKworI2VuZGlmIC8qIF9fQVNNX09QRU5SSVNDX01FTUJMT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vbW11LmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL21tdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjliYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL21tdS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE9wZW5SSVNDIGltcGxlbWVudGF0aW9uOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKiBldCBhbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfTU1VX0gKKyNkZWZpbmUgX19BU01fT1BFTlJJU0NfTU1VX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBtbV9jb250ZXh0X3Q7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0YjgxNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX01NVV9DT05URVhUX0gKKyNkZWZpbmUgX19BU01fT1BFTlJJU0NfTU1VX0NPTlRFWFRfSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1faG9va3MuaD4KKworZXh0ZXJuIGludCBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CitleHRlcm4gdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworZXh0ZXJuIHZvaWQgc3dpdGNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQsCisJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKKworI2RlZmluZSBkZWFjdGl2YXRlX21tKHRzaywgbW0pCWRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBhY3RpdmF0ZV9tbShwcmV2LCBuZXh0KSBzd2l0Y2hfbW0oKHByZXYpLCAobmV4dCksIE5VTEwpCisKKy8qIGN1cnJlbnQgYWN0aXZlIHBnZCAtIHRoaXMgaXMgc2ltaWxhciB0byBvdGhlciBwcm9jZXNzb3JzIHBnZAorICogcmVnaXN0ZXJzIGxpa2UgY3IzIG9uIHRoZSBpMzg2CisgKi8KKworZXh0ZXJuIHZvbGF0aWxlIHBnZF90ICpjdXJyZW50X3BnZDsgICAvKiBkZWZpbmVkIGluIGFyY2gvb3BlbnJpc2MvbW0vZmF1bHQuYyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZW50ZXJfbGF6eV90bGIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vbXV0ZXguaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODVhMGNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9tdXRleC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE9wZW5SSVNDIGltcGxlbWVudGF0aW9uOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKiBldCBhbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qCisgKiBQdWxsIGluIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbXV0ZXggZmFzdHBhdGguCisgKgorICogVE9ETzogaW1wbGVtZW50IG9wdGltaXplZCBwcmltaXRpdmVzIGluc3RlYWQsIG9yIGxlYXZlIHRoZSBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbiBpbiBwbGFjZSwgb3IgcGljayB0aGUgYXRvbWljX3hjaGcoKSBiYXNlZCBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbi4gKHNlZSBhc20tZ2VuZXJpYy9tdXRleC14Y2hnLmggZm9yIGRldGFpbHMpCisgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL211dGV4LWRlYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3BhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDQxYjM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9wYWdlLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE9wZW5SSVNDIGltcGxlbWVudGF0aW9uOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKiBldCBhbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfUEFHRV9ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX1BBR0VfSAorCisKKy8qIFBBR0VfU0hJRlQgZGV0ZXJtaW5lcyB0aGUgcGFnZSBzaXplICovCisKKyNkZWZpbmUgUEFHRV9TSElGVCAgICAgIDEzCisjaWZkZWYgX19BU1NFTUJMWV9fCisjZGVmaW5lIFBBR0VfU0laRSAgICAgICAoMSA8PCBQQUdFX1NISUZUKQorI2Vsc2UKKyNkZWZpbmUgUEFHRV9TSVpFICAgICAgICgxVUwgPDwgUEFHRV9TSElGVCkKKyNlbmRpZgorI2RlZmluZSBQQUdFX01BU0sgICAgICAgKH4oUEFHRV9TSVpFLTEpKQorCisjZGVmaW5lIFBBR0VfT0ZGU0VUCTB4YzAwMDAwMDAKKyNkZWZpbmUgS0VSTkVMQkFTRQlQQUdFX09GRlNFVAorCisvKiBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMsIGJ1dCBpdCdzIG5lZWRlZCBieQorICogZHJpdmVycy9vZi9mZHQuYworICovCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNkZWZpbmUgZ2V0X3VzZXJfcGFnZSh2YWRkcikgICAgICAgICAgICBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkKKyNkZWZpbmUgZnJlZV91c2VyX3BhZ2UocGFnZSwgYWRkcikgICAgICBmcmVlX3BhZ2UoYWRkcikKKworI2RlZmluZSBjbGVhcl9wYWdlKHBhZ2UpCW1lbXNldCgocGFnZSksIDAsIFBBR0VfU0laRSkKKyNkZWZpbmUgY29weV9wYWdlKHRvLCBmcm9tKQltZW1jcHkoKHRvKSwgKGZyb20pLCBQQUdFX1NJWkUpCisKKyNkZWZpbmUgY2xlYXJfdXNlcl9wYWdlKHBhZ2UsIHZhZGRyLCBwZykgICAgICAgIGNsZWFyX3BhZ2UocGFnZSkKKyNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykgICAgIGNvcHlfcGFnZSh0bywgZnJvbSkKKworLyoKKyAqIFRoZXNlIGFyZSB1c2VkIHRvIG1ha2UgdXNlIG9mIEMgdHlwZS1jaGVja2luZy4uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIHB0ZTsKK30gcHRlX3Q7Cit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBwZ2Q7Cit9IHBnZF90OwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgcGdwcm90OworfSBwZ3Byb3RfdDsKK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKKworI2RlZmluZSBwdGVfdmFsKHgpCSgoeCkucHRlKQorI2RlZmluZSBwZ2RfdmFsKHgpCSgoeCkucGdkKQorI2RlZmluZSBwZ3Byb3RfdmFsKHgpCSgoeCkucGdwcm90KQorCisjZGVmaW5lIF9fcHRlKHgpCSgocHRlX3QpIHsgKHgpIH0pCisjZGVmaW5lIF9fcGdkKHgpCSgocGdkX3QpIHsgKHgpIH0pCisjZGVmaW5lIF9fcGdwcm90KHgpCSgocGdwcm90X3QpIHsgKHgpIH0pCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1lbW9yeV9zdGFydDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1lbW9yeV9lbmQ7CisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2RlZmluZSBfX3ZhKHgpICgodm9pZCAqKSgodW5zaWduZWQgbG9uZykoeCkgKyBQQUdFX09GRlNFVCkpCisjZGVmaW5lIF9fcGEoeCkgKCh1bnNpZ25lZCBsb25nKSAoeCkgLSBQQUdFX09GRlNFVCkKKworI2RlZmluZSB2aXJ0X3RvX3BmbihrYWRkcikgICAgICAoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgcGZuX3RvX3ZpcnQocGZuKSAgICAgICAgX192YSgocGZuKSA8PCBQQUdFX1NISUZUKQorCisjZGVmaW5lIHZpcnRfdG9fcGFnZShhZGRyKSBcCisJKG1lbV9tYXAgKyAoKCh1bnNpZ25lZCBsb25nKShhZGRyKS1QQUdFX09GRlNFVCkgPj4gUEFHRV9TSElGVCkpCisjZGVmaW5lIHBhZ2VfdG9fdmlydChwYWdlKSBcCisJKCgoKHBhZ2UpIC0gbWVtX21hcCkgPDwgUEFHRV9TSElGVCkgKyBQQUdFX09GRlNFVCkKKworI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkgICAgICAoKGRtYV9hZGRyX3QpcGFnZV90b19wZm4ocGFnZSkgPDwgUEFHRV9TSElGVCkKKworI2RlZmluZSBwZm5fdmFsaWQocGZuKSAgICAgICAgICAoKHBmbikgPCBtYXhfbWFwbnIpCisKKyNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKSAgKCgodm9pZCAqKShrYWRkcikgPj0gKHZvaWQgKilQQUdFX09GRlNFVCkgJiYgXAorCQkJCSgodm9pZCAqKShrYWRkcikgPCAodm9pZCAqKW1lbW9yeV9lbmQpKQorCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKworI2RlZmluZSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MJKFZNX1JFQUQgfCBWTV9XUklURSB8IFZNX0VYRUMgfCBcCisJCQkJIFZNX01BWVJFQUQgfCBWTV9NQVlXUklURSB8IFZNX01BWUVYRUMpCisKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dldG9yZGVyLmg+CisKKyNlbmRpZiAvKiBfX0FTTV9PUEVOUklTQ19QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vcGFyYW0uaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzlhMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9wYXJhbS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE9wZW5SSVNDIGltcGxlbWVudGF0aW9uOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKiBldCBhbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfUEFSQU1fSAorI2RlZmluZSBfX0FTTV9PUEVOUklTQ19QQVJBTV9ICisKKyNkZWZpbmUgRVhFQ19QQUdFU0laRQk4MTkyCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYXJhbS5oPgorCisjZW5kaWYgLyogX19BU01fT1BFTlJJU0NfUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9wZ2FsbG9jLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3BnYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWMzOWVjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE9wZW5SSVNDIGltcGxlbWVudGF0aW9uOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKiBldCBhbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfUEdBTExPQ19ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX1BHQUxMT0NfSAorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworZXh0ZXJuIGludCBtZW1faW5pdF9kb25lOworCisjZGVmaW5lIHBtZF9wb3B1bGF0ZV9rZXJuZWwobW0sIHBtZCwgcHRlKSBcCisJc2V0X3BtZChwbWQsIF9fcG1kKF9LRVJOUEdfVEFCTEUgKyBfX3BhKHB0ZSkpKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG1kX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLAorCQkJCXN0cnVjdCBwYWdlICpwdGUpCit7CisJc2V0X3BtZChwbWQsIF9fcG1kKF9LRVJOUEdfVEFCTEUgKworCQkgICAgICgodW5zaWduZWQgbG9uZylwYWdlX3RvX3BmbihwdGUpIDw8CisJCSAgICAgKHVuc2lnbmVkIGxvbmcpIFBBR0VfU0hJRlQpKSk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhbmQgZnJlZSBwYWdlIHRhYmxlcy4KKyAqLworc3RhdGljIGlubGluZSBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXBnZF90ICpyZXQgPSAocGdkX3QgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisKKwlpZiAocmV0KSB7CisJCW1lbXNldChyZXQsIDAsIFVTRVJfUFRSU19QRVJfUEdEICogc2l6ZW9mKHBnZF90KSk7CisJCW1lbWNweShyZXQgKyBVU0VSX1BUUlNfUEVSX1BHRCwKKwkJICAgICAgIHN3YXBwZXJfcGdfZGlyICsgVVNFUl9QVFJTX1BFUl9QR0QsCisJCSAgICAgICAoUFRSU19QRVJfUEdEIC0gVVNFUl9QVFJTX1BFUl9QR0QpICogc2l6ZW9mKHBnZF90KSk7CisKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2lmIDAKKy8qIEZJWE1FOiBUaGlzIHNlZW1zIHRvIGJlIHRoZSBwcmVmZXJyZWQgc3R5bGUsIGJ1dCB3ZSBhcmUgdXNpbmcKKyAqIGN1cnJlbnRfcGdkIChmcm9tIG1tLT5wZ2QpIHRvIGxvYWQga2VybmVsIHBhZ2VzIHNvIHdlIG5lZWQgaXQKKyAqIGluaXRpYWxpemVkLiAgVGhpcyBuZWVkcyB0byBiZSBsb29rZWQgaW50by4KKyAqLworZXh0ZXJuIGlubGluZSBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXJldHVybiAocGdkX3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIHBnZF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkKQoreworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwZ2QpOworfQorCitleHRlcm4gcHRlX3QgKnB0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBwYWdlICpwdGU7CisJcHRlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQsIDApOworCWlmIChwdGUpCisJCWNsZWFyX3BhZ2UocGFnZV9hZGRyZXNzKHB0ZSkpOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB0ZV90ICpwdGUpCit7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXB0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnB0ZSkKK3sKKwlfX2ZyZWVfcGFnZShwdGUpOworfQorCisKKyNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLCBwdGUsIGFkZHIpIHRsYl9yZW1vdmVfcGFnZSgodGxiKSwgKHB0ZSkpCisjZGVmaW5lIHBtZF9wZ3RhYmxlKHBtZCkgcG1kX3BhZ2UocG1kKQorCisjZGVmaW5lIGNoZWNrX3BndF9jYWNoZSgpICAgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vcGd0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzUwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMCwwICsxLDQ2MyBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogT3BlblJJU0MgaW1wbGVtZW50YXRpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyogb3IzMiBwZ3RhYmxlLmggLSBtYWNyb3MgYW5kIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHBhZ2UgdGFibGVzCisgKgorICogQmFzZWQgb246CisgKiBpbmNsdWRlL2FzbS1jcmlzL3BndGFibGUuaAorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfUEdUQUJMRV9ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX1BHVEFCTEVfSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS1ub3BtZC5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGFzbS9tbXUuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisKKy8qCisgKiBUaGUgTGludXggbWVtb3J5IG1hbmFnZW1lbnQgYXNzdW1lcyBhIHRocmVlLWxldmVsIHBhZ2UgdGFibGUgc2V0dXAuIE9uCisgKiBvcjMyLCB3ZSB1c2UgdGhhdCwgYnV0ICJmb2xkIiB0aGUgbWlkIGxldmVsIGludG8gdGhlIHRvcC1sZXZlbCBwYWdlCisgKiB0YWJsZS4gU2luY2UgdGhlIE1NVSBUTEIgaXMgc29mdHdhcmUgbG9hZGVkIHRocm91Z2ggYW4gaW50ZXJydXB0LCBpdAorICogc3VwcG9ydHMgYW55IHBhZ2UgdGFibGUgc3RydWN0dXJlLCBzbyB3ZSBjb3VsZCBoYXZlIHVzZWQgYSB0aHJlZS1sZXZlbAorICogc2V0dXAsIGJ1dCBmb3IgdGhlIGFtb3VudHMgb2YgbWVtb3J5IHdlIG5vcm1hbGx5IHVzZSwgYSB0d28tbGV2ZWwgaXMKKyAqIHByb2JhYmx5IG1vcmUgZWZmaWNpZW50LgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZnVuY3Rpb25zIGFuZCBkZWZpbmVzIG5lY2Vzc2FyeSB0byBtb2RpZnkgYW5kIHVzZQorICogdGhlIG9yMzIgcGFnZSB0YWJsZSB0cmVlLgorICovCisKK2V4dGVybiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOworCisvKiBDZXJ0YWluIGFyY2hpdGVjdHVyZXMgbmVlZCB0byBkbyBzcGVjaWFsIHRoaW5ncyB3aGVuIHB0ZSdzCisgKiB3aXRoaW4gYSBwYWdlIHRhYmxlIGFyZSBkaXJlY3RseSBtb2RpZmllZC4gIFRodXMsIHRoZSBmb2xsb3dpbmcKKyAqIGhvb2sgaXMgbWFkZSBhdmFpbGFibGUuCisgKi8KKyNkZWZpbmUgc2V0X3B0ZShwdGVwdHIsIHB0ZXZhbCkgKCgqKHB0ZXB0cikpID0gKHB0ZXZhbCkpCisjZGVmaW5lIHNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZXAsIHB0ZXZhbCkgc2V0X3B0ZShwdGVwLCBwdGV2YWwpCisvKgorICogKHBtZHMgYXJlIGZvbGRlZCBpbnRvIHBnZHMgc28gdGhpcyBkb2Vzbid0IGdldCBhY3R1YWxseSBjYWxsZWQsCisgKiBidXQgdGhlIGRlZmluZSBpcyBuZWVkZWQgZm9yIGEgZ2VuZXJpYyBpbmxpbmUgZnVuY3Rpb24uKQorICovCisjZGVmaW5lIHNldF9wbWQocG1kcHRyLCBwbWR2YWwpICgqKHBtZHB0cikgPSBwbWR2YWwpCisKKyNkZWZpbmUgUEdESVJfU0hJRlQJKFBBR0VfU0hJRlQgKyAoUEFHRV9TSElGVC0yKSkKKyNkZWZpbmUgUEdESVJfU0laRQkoMVVMIDw8IFBHRElSX1NISUZUKQorI2RlZmluZSBQR0RJUl9NQVNLCSh+KFBHRElSX1NJWkUtMSkpCisKKy8qCisgKiBlbnRyaWVzIHBlciBwYWdlIGRpcmVjdG9yeSBsZXZlbDogd2UgdXNlIGEgdHdvLWxldmVsLCBzbworICogd2UgZG9uJ3QgcmVhbGx5IGhhdmUgYW55IFBNRCBkaXJlY3RvcnkgcGh5c2ljYWxseS4KKyAqIHBvaW50ZXJzIGFyZSA0IGJ5dGVzIHNvIHdlIGNhbiB1c2UgdGhlIHBhZ2Ugc2l6ZSBhbmQKKyAqIGRpdmlkZSBpdCBieSA0IChzaGlmdCBieSAyKS4KKyAqLworI2RlZmluZSBQVFJTX1BFUl9QVEUJKDFVTCA8PCAoUEFHRV9TSElGVC0yKSkKKworI2RlZmluZSBQVFJTX1BFUl9QR0QJKDFVTCA8PCAoUEFHRV9TSElGVC0yKSkKKworLyogY2FsY3VsYXRlIGhvdyBtYW55IFBHRCBlbnRyaWVzIGEgdXNlci1sZXZlbCBwcm9ncmFtIGNhbiB1c2UKKyAqIHRoZSBmaXJzdCBtYXBwYWJsZSB2aXJ0dWFsIGFkZHJlc3MgaXMgMAorICogKFRBU0tfU0laRSBpcyB0aGUgbWF4aW11bSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UpCisgKi8KKworI2RlZmluZSBVU0VSX1BUUlNfUEVSX1BHRCAgICAgICAoVEFTS19TSVpFL1BHRElSX1NJWkUpCisjZGVmaW5lIEZJUlNUX1VTRVJfQUREUkVTUyAgICAgIDAKKworLyoKKyAqIEtlcm5lbHMgb3duIHZpcnR1YWwgbWVtb3J5IGFyZWEuCisgKi8KKworLyoKKyAqIFRoZSBzaXplIGFuZCBsb2NhdGlvbiBvZiB0aGUgdm1hbGxvYyBhcmVhIGFyZSBjaG9zZW4gc28gdGhhdCBtb2R1bGVzCisgKiBwbGFjZWQgaW4gdGhpcyBhcmVhIGFyZW4ndCBtb3JlIHRoYW4gYSAyOC1iaXQgc2lnbmVkIG9mZnNldCBmcm9tIGFueQorICoga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHRoZXkgbWF5IG5lZWQuICBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyBoYW5kbGluZworICogb2YgdGhlIHJlbG9jYXRpb25zIGZvciBsLmogYW5kIGwuamFsIGluc3RydWN0aW9ucyBhcyB3ZSBkb24ndCBuZWVkIHRvCisgKiBpbnRyb2R1Y2UgYW55IHRyYW1wb2xpbmVzIGZvciByZWFjaGluZyAiZGlzdGFudCIgY29kZS4KKyAqCisgKiA2NCBNQiBvZiB2bWFsbG9jIGFyZWEgaXMgY29tcGFyYWJsZSB0byB3aGF0J3MgYXZhaWxhYmxlIG9uIG90aGVyIGFyY2hlcy4KKyAqLworCisjZGVmaW5lIFZNQUxMT0NfU1RBUlQJKFBBR0VfT0ZGU0VULTB4MDQwMDAwMDApCisjZGVmaW5lIFZNQUxMT0NfRU5ECShQQUdFX09GRlNFVCkKKyNkZWZpbmUgVk1BTExPQ19WTUFERFIoeCkgKCh1bnNpZ25lZCBsb25nKSh4KSkKKworLyogRGVmaW5lIHNvbWUgaGlnaGVyIGxldmVsIGdlbmVyaWMgcGFnZSBhdHRyaWJ1dGVzLgorICoKKyAqIElmIHlvdSBjaGFuZ2UgX1BBR0VfQ0kgZGVmaW5pdGlvbiBiZSBzdXJlIHRvIGNoYW5nZSBpdCBpbgorICogaW8uaCBmb3IgaW9yZW1hcF9ub2NhY2hlKCkgdG9vLgorICovCisKKy8qCisgKiBBbiBPUjMyIFBURSBsb29rcyBsaWtlIHRoaXM6CisgKgorICogfCAgMzEgLi4uIDEwIHwgIDkgIHwgIDggLi4uIDYgIHwgIDUgIHwgIDQgIHwgIDMgIHwgIDIgIHwgIDEgIHwgIDAgIHwKKyAqICBQaHlzIHBnLm51bSAgICBMICAgICBQUCBJbmRleCAgICBEICAgICBBICAgIFdPTSAgIFdCQyAgIENJICAgIENDCisgKgorICogIEwgIDogbGluaworICogIFBQSTogUGFnZSBwcm90ZWN0aW9uIGluZGV4CisgKiAgRCAgOiBEaXJ0eQorICogIEEgIDogQWNjZXNzZWQKKyAqICBXT006IFdlYWtseSBvcmRlcmVkIG1lbW9yeQorICogIFdCQzogV3JpdGUtYmFjayBjYWNoZQorICogIENJIDogQ2FjaGUgaW5oaWJpdAorICogIENDIDogQ2FjaGUgY29oZXJlbnQKKyAqCisgKiBUaGUgcHJvdGVjdGlvbiBiaXRzIGJlbG93IHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBsYXlvdXQgb2YgdGhlIGFjdHVhbAorICogUFRFIGFzIHBlciBhYm92ZQorICovCisKKyNkZWZpbmUgX1BBR0VfQ0MgICAgICAgMHgwMDEgLyogc29mdHdhcmU6IHB0ZSBjb250YWlucyBhIHRyYW5zbGF0aW9uICovCisjZGVmaW5lIF9QQUdFX0NJICAgICAgIDB4MDAyIC8qIGNhY2hlIGluaGliaXQgICAgICAgICAgKi8KKyNkZWZpbmUgX1BBR0VfV0JDICAgICAgMHgwMDQgLyogd3JpdGUgYmFjayBjYWNoZSAgICAgICAqLworI2RlZmluZSBfUEFHRV9GSUxFICAgICAweDAwNCAvKiBzZXQ6IHBhZ2VjYWNoZSwgdW5zZXQ6IHN3YXAgKHdoZW4gIVBSRVNFTlQpICovCisjZGVmaW5lIF9QQUdFX1dPTSAgICAgIDB4MDA4IC8qIHdlYWtseSBvcmRlcmVkIG1lbW9yeSAgKi8KKworI2RlZmluZSBfUEFHRV9BICAgICAgICAweDAxMCAvKiBhY2Nlc3NlZCAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9QQUdFX0QgICAgICAgIDB4MDIwIC8qIGRpcnR5ICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX1BBR0VfVVJFICAgICAgMHgwNDAgLyogdXNlciByZWFkIGVuYWJsZSAgICAgICAqLworI2RlZmluZSBfUEFHRV9VV0UgICAgICAweDA4MCAvKiB1c2VyIHdyaXRlIGVuYWJsZSAgICAgICovCisKKyNkZWZpbmUgX1BBR0VfU1JFICAgICAgMHgxMDAgLyogc3VwZXJ1c2VyIHJlYWQgZW5hYmxlICAqLworI2RlZmluZSBfUEFHRV9TV0UgICAgICAweDIwMCAvKiBzdXBlcnVzZXIgd3JpdGUgZW5hYmxlICovCisjZGVmaW5lIF9QQUdFX0VYRUMgICAgIDB4NDAwIC8qIHNvZnR3YXJlOiBwYWdlIGlzIGV4ZWN1dGFibGUgKi8KKyNkZWZpbmUgX1BBR0VfVV9TSEFSRUQgMHg4MDAgLyogc29mdHdhcmU6IHBhZ2UgaXMgc2hhcmVkIGluIHVzZXIgc3BhY2UgKi8KKworLyogMHgwMDEgaXMgY2FjaGUgY29oZXJlbmN5IGJpdCwgd2hpY2ggc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8KKyAqICAgICAgIDEgLSBmb3IgU01QICh3aGVuIHdlIHN1cHBvcnQgaXQpCisgKiAgICAgICAwIC0gb3RoZXJ3aXNlCisgKgorICogd2UganVzdCByZXVzZSB0aGlzIGJpdCBpbiBzb2Z0d2FyZSBmb3IgX1BBR0VfUFJFU0VOVCBhbmQKKyAqIGZvcmNlIGl0IHRvIDAgd2hlbiBsb2FkaW5nIGl0IGludG8gVExCLgorICovCisjZGVmaW5lIF9QQUdFX1BSRVNFTlQgIF9QQUdFX0NDCisjZGVmaW5lIF9QQUdFX1VTRVIgICAgIF9QQUdFX1VSRQorI2RlZmluZSBfUEFHRV9XUklURSAgICAoX1BBR0VfVVdFIHwgX1BBR0VfU1dFKQorI2RlZmluZSBfUEFHRV9ESVJUWSAgICBfUEFHRV9ECisjZGVmaW5lIF9QQUdFX0FDQ0VTU0VEIF9QQUdFX0EKKyNkZWZpbmUgX1BBR0VfTk9fQ0FDSEUgX1BBR0VfQ0kKKyNkZWZpbmUgX1BBR0VfU0hBUkVEICAgX1BBR0VfVV9TSEFSRUQKKyNkZWZpbmUgX1BBR0VfUkVBRCAgICAgKF9QQUdFX1VSRSB8IF9QQUdFX1NSRSkKKworI2RlZmluZSBfUEFHRV9DSEdfTUFTSwkoUEFHRV9NQVNLIHwgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9ESVJUWSkKKyNkZWZpbmUgX1BBR0VfQkFTRSAgICAgKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9BQ0NFU1NFRCkKKyNkZWZpbmUgX1BBR0VfQUxMICAgICAgKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9BQ0NFU1NFRCkKKyNkZWZpbmUgX0tFUk5QR19UQUJMRSBcCisJKF9QQUdFX0JBU0UgfCBfUEFHRV9TUkUgfCBfUEFHRV9TV0UgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZKQorCisjZGVmaW5lIFBBR0VfTk9ORSAgICAgICBfX3BncHJvdChfUEFHRV9BTEwpCisjZGVmaW5lIFBBR0VfUkVBRE9OTFkgICBfX3BncHJvdChfUEFHRV9BTEwgfCBfUEFHRV9VUkUgfCBfUEFHRV9TUkUpCisjZGVmaW5lIFBBR0VfUkVBRE9OTFlfWCBfX3BncHJvdChfUEFHRV9BTEwgfCBfUEFHRV9VUkUgfCBfUEFHRV9TUkUgfCBfUEFHRV9FWEVDKQorI2RlZmluZSBQQUdFX1NIQVJFRCBcCisJX19wZ3Byb3QoX1BBR0VfQUxMIHwgX1BBR0VfVVJFIHwgX1BBR0VfU1JFIHwgX1BBR0VfVVdFIHwgX1BBR0VfU1dFIFwKKwkJIHwgX1BBR0VfU0hBUkVEKQorI2RlZmluZSBQQUdFX1NIQVJFRF9YIFwKKwlfX3BncHJvdChfUEFHRV9BTEwgfCBfUEFHRV9VUkUgfCBfUEFHRV9TUkUgfCBfUEFHRV9VV0UgfCBfUEFHRV9TV0UgXAorCQkgfCBfUEFHRV9TSEFSRUQgfCBfUEFHRV9FWEVDKQorI2RlZmluZSBQQUdFX0NPUFkgICAgICAgX19wZ3Byb3QoX1BBR0VfQUxMIHwgX1BBR0VfVVJFIHwgX1BBR0VfU1JFKQorI2RlZmluZSBQQUdFX0NPUFlfWCAgICAgX19wZ3Byb3QoX1BBR0VfQUxMIHwgX1BBR0VfVVJFIHwgX1BBR0VfU1JFIHwgX1BBR0VfRVhFQykKKworI2RlZmluZSBQQUdFX0tFUk5FTCBcCisJX19wZ3Byb3QoX1BBR0VfQUxMIHwgX1BBR0VfU1JFIHwgX1BBR0VfU1dFIFwKKwkJIHwgX1BBR0VfU0hBUkVEIHwgX1BBR0VfRElSVFkgfCBfUEFHRV9FWEVDKQorI2RlZmluZSBQQUdFX0tFUk5FTF9STyBcCisJX19wZ3Byb3QoX1BBR0VfQUxMIHwgX1BBR0VfU1JFIFwKKwkJIHwgX1BBR0VfU0hBUkVEIHwgX1BBR0VfRElSVFkgfCBfUEFHRV9FWEVDKQorI2RlZmluZSBQQUdFX0tFUk5FTF9OT0NBQ0hFIFwKKwlfX3BncHJvdChfUEFHRV9BTEwgfCBfUEFHRV9TUkUgfCBfUEFHRV9TV0UgXAorCQkgfCBfUEFHRV9TSEFSRUQgfCBfUEFHRV9ESVJUWSB8IF9QQUdFX0VYRUMgfCBfUEFHRV9DSSkKKworI2RlZmluZSBfX1AwMDAJUEFHRV9OT05FCisjZGVmaW5lIF9fUDAwMQlQQUdFX1JFQURPTkxZX1gKKyNkZWZpbmUgX19QMDEwCVBBR0VfQ09QWQorI2RlZmluZSBfX1AwMTEJUEFHRV9DT1BZX1gKKyNkZWZpbmUgX19QMTAwCVBBR0VfUkVBRE9OTFkKKyNkZWZpbmUgX19QMTAxCVBBR0VfUkVBRE9OTFlfWAorI2RlZmluZSBfX1AxMTAJUEFHRV9DT1BZCisjZGVmaW5lIF9fUDExMQlQQUdFX0NPUFlfWAorCisjZGVmaW5lIF9fUzAwMAlQQUdFX05PTkUKKyNkZWZpbmUgX19TMDAxCVBBR0VfUkVBRE9OTFlfWAorI2RlZmluZSBfX1MwMTAJUEFHRV9TSEFSRUQKKyNkZWZpbmUgX19TMDExCVBBR0VfU0hBUkVEX1gKKyNkZWZpbmUgX19TMTAwCVBBR0VfUkVBRE9OTFkKKyNkZWZpbmUgX19TMTAxCVBBR0VfUkVBRE9OTFlfWAorI2RlZmluZSBfX1MxMTAJUEFHRV9TSEFSRUQKKyNkZWZpbmUgX19TMTExCVBBR0VfU0hBUkVEX1gKKworLyogemVybyBwYWdlIHVzZWQgZm9yIHVuaW5pdGlhbGl6ZWQgc3R1ZmYgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZVsyMDQ4XTsKKyNkZWZpbmUgWkVST19QQUdFKHZhZGRyKSAodmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSkpCisKKy8qIG51bWJlciBvZiBiaXRzIHRoYXQgZml0IGludG8gYSBtZW1vcnkgcG9pbnRlciAqLworI2RlZmluZSBCSVRTX1BFUl9QVFIJCQkoOCpzaXplb2YodW5zaWduZWQgbG9uZykpCisKKy8qIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIGEgcG9pbnRlciBhZGRyZXNzICovCisjZGVmaW5lIFBUUl9NQVNLCQkJKH4oc2l6ZW9mKHZvaWQgKiktMSkpCisKKy8qIHNpemVvZih2b2lkKik9PTE8PFNJWkVPRl9QVFJfTE9HMiAqLworLyogNjQtYml0IG1hY2hpbmVzLCBiZXdhcmUhICBTUkIuICovCisjZGVmaW5lIFNJWkVPRl9QVFJfTE9HMgkJCTIKKworLyogdG8gZmluZCBhbiBlbnRyeSBpbiBhIHBhZ2UtdGFibGUgKi8KKyNkZWZpbmUgUEFHRV9QVFIoYWRkcmVzcykgXAorKCh1bnNpZ25lZCBsb25nKShhZGRyZXNzKT4+KFBBR0VfU0hJRlQtU0laRU9GX1BUUl9MT0cyKSZQVFJfTUFTSyZ+UEFHRV9NQVNLKQorCisvKiB0byBzZXQgdGhlIHBhZ2UtZGlyICovCisjZGVmaW5lIFNFVF9QQUdFX0RJUih0c2ssIHBnZGlyKQorCisjZGVmaW5lIHB0ZV9ub25lKHgpCSghcHRlX3ZhbCh4KSkKKyNkZWZpbmUgcHRlX3ByZXNlbnQoeCkJKHB0ZV92YWwoeCkgJiBfUEFHRV9QUkVTRU5UKQorI2RlZmluZSBwdGVfY2xlYXIobW0sIGFkZHIsIHhwKQlkbyB7IHB0ZV92YWwoKih4cCkpID0gMDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBwbWRfbm9uZSh4KQkoIXBtZF92YWwoeCkpCisjZGVmaW5lCXBtZF9iYWQoeCkJKChwbWRfdmFsKHgpICYgKH5QQUdFX01BU0spKSAhPSBfS0VSTlBHX1RBQkxFKQorI2RlZmluZSBwbWRfcHJlc2VudCh4KQkocG1kX3ZhbCh4KSAmIF9QQUdFX1BSRVNFTlQpCisjZGVmaW5lIHBtZF9jbGVhcih4cCkJZG8geyBwbWRfdmFsKCooeHApKSA9IDA7IH0gd2hpbGUgKDApCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCisgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKSAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsgfQorc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfV1JJVEU7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0VYRUM7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CitzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQorc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKSAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQorc3RhdGljIGlubGluZSBpbnQgcHRlX3NwZWNpYWwocHRlX3QgcHRlKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3NwZWNpYWwocHRlX3QgcHRlKSB7IHJldHVybiBwdGU7IH0KKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkKK3sKKwlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9XUklURSk7CisJcmV0dXJuIHB0ZTsKK30KKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKK3sKKwlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9SRUFEKTsKKwlyZXR1cm4gcHRlOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX0VYRUMpOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX0RJUlRZKTsKKwlyZXR1cm4gcHRlOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfQUNDRVNTRUQpOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9XUklURTsKKwlyZXR1cm4gcHRlOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9SRUFEOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0VYRUM7CisJcmV0dXJuIHB0ZTsKK30KKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0RJUlRZOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9BQ0NFU1NFRDsKKwlyZXR1cm4gcHRlOworfQorCisvKgorICogQ29udmVyc2lvbiBmdW5jdGlvbnM6IGNvbnZlcnQgYSBwYWdlIGFuZCBwcm90ZWN0aW9uIHRvIGEgcGFnZSBlbnRyeSwKKyAqIGFuZCBhIHBhZ2UgZW50cnkgYW5kIHBhZ2UgZGlyZWN0b3J5IHRvIHRoZSBwYWdlIHRoZXkgcmVmZXIgdG8uCisgKi8KKworLyogV2hhdCBhY3R1YWxseSBnb2VzIGFzIGFyZ3VtZW50cyB0byB0aGUgdmFyaW91cyBmdW5jdGlvbnMgaXMgbGVzcyB0aGFuCisgKiBvYnZpb3VzLCBidXQgYSBydWxlIG9mIHRodW1iIGlzIHRoYXQgc3RydWN0IHBhZ2UncyBnb2VzIGFzIHN0cnVjdCBwYWdlICosCisgKiByZWFsbHkgcGh5c2ljYWwgRFJBTSBhZGRyZXNzZXMgYXJlIHVuc2lnbmVkIGxvbmcncywgYW5kIERSQU0gInZpcnR1YWwiCisgKiBhZGRyZXNzZXMgKHRoZSAweGMweHh4eHh4J3MpIGdvZXMgYXMgdm9pZCAqJ3MuCisgKi8KKworc3RhdGljIGlubGluZSBwdGVfdCBfX21rX3B0ZSh2b2lkICpwYWdlLCBwZ3Byb3RfdCBwZ3Byb3QpCit7CisJcHRlX3QgcHRlOworCS8qIHRoZSBQVEUgbmVlZHMgYSBwaHlzaWNhbCBhZGRyZXNzICovCisJcHRlX3ZhbChwdGUpID0gX19wYShwYWdlKSB8IHBncHJvdF92YWwocGdwcm90KTsKKwlyZXR1cm4gcHRlOworfQorCisjZGVmaW5lIG1rX3B0ZShwYWdlLCBwZ3Byb3QpIF9fbWtfcHRlKHBhZ2VfYWRkcmVzcyhwYWdlKSwgKHBncHJvdCkpCisKKyNkZWZpbmUgbWtfcHRlX3BoeXMocGh5c3BhZ2UsIHBncHJvdCkgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXB0ZV90IF9fcHRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQlcCisJcHRlX3ZhbChfX3B0ZSkgPSAocGh5c3BhZ2UpICsgcGdwcm90X3ZhbChwZ3Byb3QpOyAgICAgICAgICAgICAgIFwKKwlfX3B0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbW9kaWZ5KHB0ZV90IHB0ZSwgcGdwcm90X3QgbmV3cHJvdCkKK3sKKwlwdGVfdmFsKHB0ZSkgPSAocHRlX3ZhbChwdGUpICYgX1BBR0VfQ0hHX01BU0spIHwgcGdwcm90X3ZhbChuZXdwcm90KTsKKwlyZXR1cm4gcHRlOworfQorCisKKy8qCisgKiBwdGVfdmFsIHJlZmVycyB0byBhIHBhZ2UgaW4gdGhlIDB4MHh4eHh4eHggcGh5c2ljYWwgRFJBTSBpbnRlcnZhbAorICogX19wdGVfcGFnZShwdGVfdmFsKSByZWZlcnMgdG8gdGhlICJ2aXJ0dWFsIiBEUkFNIGludGVydmFsCisgKiBwdGVfcGFnZW5yIHJlZmVycyB0byB0aGUgcGFnZS1udW1iZXIgY291bnRlZCBzdGFydGluZyBmcm9tIHRoZSB2aXJ0dWFsCisgKiBEUkFNIHN0YXJ0CisgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcHRlX3BhZ2UocHRlX3QgcHRlKQoreworCS8qIHRoZSBQVEUgY29udGFpbnMgYSBwaHlzaWNhbCBhZGRyZXNzICovCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKV9fdmEocHRlX3ZhbChwdGUpICYgUEFHRV9NQVNLKTsKK30KKworI2RlZmluZSBwdGVfcGFnZW5yKHB0ZSkgICAgICAgICAoKF9fcHRlX3BhZ2UocHRlKSAtIFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZUKQorCisvKiBwZXJtYW5lbnQgYWRkcmVzcyBvZiBhIHBhZ2UgKi8KKworI2RlZmluZSBfX3BhZ2VfYWRkcmVzcyhwYWdlKSAoUEFHRV9PRkZTRVQgKyAoKChwYWdlKSAtIG1lbV9tYXApIDw8IFBBR0VfU0hJRlQpKQorI2RlZmluZSBwdGVfcGFnZShwdGUpCQkobWVtX21hcCtwdGVfcGFnZW5yKHB0ZSkpCisKKy8qCisgKiBvbmx5IHRoZSBwdGUncyB0aGVtc2VsdmVzIG5lZWQgdG8gcG9pbnQgdG8gcGh5c2ljYWwgRFJBTSAoc2VlIGFib3ZlKQorICogdGhlIHBhZ2V0YWJsZSBsaW5rcyBhcmUgcHVyZWx5IGhhbmRsZWQgd2l0aGluIHRoZSBrZXJuZWwgU1cgYW5kIHRodXMKKyAqIGRvbid0IG5lZWQgdGhlIF9fcGEgYW5kIF9fdmEgdHJhbnNmb3JtYXRpb25zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcG1kX3NldChwbWRfdCAqcG1kcCwgcHRlX3QgKnB0ZXApCit7CisJcG1kX3ZhbCgqcG1kcCkgPSBfS0VSTlBHX1RBQkxFIHwgKHVuc2lnbmVkIGxvbmcpIHB0ZXA7Cit9CisKKyNkZWZpbmUgcG1kX3BhZ2UocG1kKQkJKHBmbl90b19wYWdlKHBtZF92YWwocG1kKSA+PiBQQUdFX1NISUZUKSkKKyNkZWZpbmUgcG1kX3BhZ2Vfa2VybmVsKHBtZCkgICAgKCh1bnNpZ25lZCBsb25nKSBfX3ZhKHBtZF92YWwocG1kKSAmIFBBR0VfTUFTSykpCisKKy8qIHRvIGZpbmQgYW4gZW50cnkgaW4gYSBwYWdlLXRhYmxlLWRpcmVjdG9yeS4gKi8KKyNkZWZpbmUgcGdkX2luZGV4KGFkZHJlc3MpICAgICAgKChhZGRyZXNzID4+IFBHRElSX1NISUZUKSAmIChQVFJTX1BFUl9QR0QtMSkpCisKKyNkZWZpbmUgX19wZ2Rfb2Zmc2V0KGFkZHJlc3MpICAgcGdkX2luZGV4KGFkZHJlc3MpCisKKyNkZWZpbmUgcGdkX29mZnNldChtbSwgYWRkcmVzcykgKChtbSktPnBnZCtwZ2RfaW5kZXgoYWRkcmVzcykpCisKKy8qIHRvIGZpbmQgYW4gZW50cnkgaW4gYSBrZXJuZWwgcGFnZS10YWJsZS1kaXJlY3RvcnkgKi8KKyNkZWZpbmUgcGdkX29mZnNldF9rKGFkZHJlc3MpIHBnZF9vZmZzZXQoJmluaXRfbW0sIGFkZHJlc3MpCisKKyNkZWZpbmUgX19wbWRfb2Zmc2V0KGFkZHJlc3MpIFwKKwkoKChhZGRyZXNzKSA+PiBQTURfU0hJRlQpICYgKFBUUlNfUEVSX1BNRC0xKSkKKworLyoKKyAqIHRoZSBwdGUgcGFnZSBjYW4gYmUgdGhvdWdodCBvZiBhbiBhcnJheSBsaWtlIHRoaXM6IHB0ZV90W1BUUlNfUEVSX1BURV0KKyAqCisgKiB0aGlzIG1hY3JvIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgcHRlIHBhZ2Ugd2hpY2ggd291bGQKKyAqIGNvbnRyb2wgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVzcworICovCisjZGVmaW5lIF9fcHRlX29mZnNldChhZGRyZXNzKSAgICAgICAgICAgICAgICAgICBcCisJKCgoYWRkcmVzcykgPj4gUEFHRV9TSElGVCkgJiAoUFRSU19QRVJfUFRFIC0gMSkpCisjZGVmaW5lIHB0ZV9vZmZzZXRfa2VybmVsKGRpciwgYWRkcmVzcykgICAgICAgICBcCisJKChwdGVfdCAqKSBwbWRfcGFnZV9rZXJuZWwoKihkaXIpKSArICBfX3B0ZV9vZmZzZXQoYWRkcmVzcykpCisjZGVmaW5lIHB0ZV9vZmZzZXRfbWFwKGRpciwgYWRkcmVzcykJICAgICAgICBcCisJKChwdGVfdCAqKXBhZ2VfYWRkcmVzcyhwbWRfcGFnZSgqKGRpcikpKSArIF9fcHRlX29mZnNldChhZGRyZXNzKSkKKyNkZWZpbmUgcHRlX29mZnNldF9tYXBfbmVzdGVkKGRpciwgYWRkcmVzcykgICAgIFwKKwlwdGVfb2Zmc2V0X21hcChkaXIsIGFkZHJlc3MpCisKKyNkZWZpbmUgcHRlX3VubWFwKHB0ZSkgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBwdGVfdW5tYXBfbmVzdGVkKHB0ZSkgICBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHB0ZV9wZm4oeCkJCSgodW5zaWduZWQgbG9uZykoKCh4KS5wdGUpKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBwZm5fcHRlKHBmbiwgcHJvdCkgIF9fcHRlKCgoKHBmbikgPDwgUEFHRV9TSElGVCkpIHwgcGdwcm90X3ZhbChwcm90KSkKKworI2RlZmluZSBwdGVfRVJST1IoZSkgXAorCXByaW50ayhLRVJOX0VSUiAiJXM6JWQ6IGJhZCBwdGUgJXAoJTA4bHgpLlxuIiwgXAorCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICYoZSksIHB0ZV92YWwoZSkpCisjZGVmaW5lIHBnZF9FUlJPUihlKSBcCisJcHJpbnRrKEtFUk5fRVJSICIlczolZDogYmFkIHBnZCAlcCglMDhseCkuXG4iLCBcCisJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgJihlKSwgcGdkX3ZhbChlKSkKKworZXh0ZXJuIHBnZF90IHN3YXBwZXJfcGdfZGlyW1BUUlNfUEVSX1BHRF07IC8qIGRlZmluZWQgaW4gaGVhZC5TICovCisKKy8qCisgKiBvcjMyIGRvZXNuJ3QgaGF2ZSBhbnkgZXh0ZXJuYWwgTU1VIGluZm86IHRoZSBrZXJuZWwgcGFnZQorICogdGFibGVzIGNvbnRhaW4gYWxsIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24uCisgKgorICogQWN0dWFsbHkgSSBhbSBub3Qgc3VyZSBvbiB3aGF0IHRoaXMgY291bGQgYmUgdXNlZCBmb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZSkKK3sKK30KKworLyogX19QSFhfXyBGSVhNRSwgU1dBUCwgdGhpcyBwcm9iYWJseSBkb2Vzbid0IHdvcmsgKi8KKworLyogRW5jb2RlIGFuZCBkZS1jb2RlIGEgc3dhcCBlbnRyeSAobXVzdCBiZSAhcHRlX25vbmUoZSkgJiYgIXB0ZV9wcmVzZW50KGUpKSAqLworLyogU2luY2UgdGhlIFBBR0VfUFJFU0VOVCBiaXQgaXMgYml0IDQsIHdlIGNhbiB1c2UgdGhlIGJpdHMgYWJvdmUgKi8KKworI2RlZmluZSBfX3N3cF90eXBlKHgpCQkJKCgoeCkudmFsID4+IDUpICYgMHg3ZikKKyNkZWZpbmUgX19zd3Bfb2Zmc2V0KHgpCQkJKCh4KS52YWwgPj4gMTIpCisjZGVmaW5lIF9fc3dwX2VudHJ5KHR5cGUsIG9mZnNldCkgXAorCSgoc3dwX2VudHJ5X3QpIHsgKCh0eXBlKSA8PCA1KSB8ICgob2Zmc2V0KSA8PCAxMikgfSkKKyNkZWZpbmUgX19wdGVfdG9fc3dwX2VudHJ5KHB0ZSkJCSgoc3dwX2VudHJ5X3QpIHsgcHRlX3ZhbChwdGUpIH0pCisjZGVmaW5lIF9fc3dwX2VudHJ5X3RvX3B0ZSh4KQkJKChwdGVfdCkgeyAoeCkudmFsIH0pCisKKy8qIEVuY29kZSBhbmQgZGVjb2RlIGEgbm9ubGluZWFyIGZpbGUgbWFwcGluZyBlbnRyeSAqLworCisjZGVmaW5lIFBURV9GSUxFX01BWF9CSVRTICAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgcHRlX3RvX3Bnb2ZmKHgpCSAgICAgICAgICAgICAgICAocHRlX3ZhbCh4KSA+PiA2KQorI2RlZmluZSBwZ29mZl90b19wdGUoeCkJICAgICAgICAgICAgICAgIF9fcHRlKCgoeCkgPDwgNikgfCBfUEFHRV9GSUxFKQorCisjZGVmaW5lIGtlcm5fYWRkcl92YWxpZChhZGRyKSAgICAgICAgICAgKDEpCisKKyNkZWZpbmUgaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkgICAgICAgICBcCisJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUuaD4KKworLyoKKyAqIE5vIHBhZ2UgdGFibGUgY2FjaGVzIHRvIGluaXRpYWxpc2UKKyAqLworI2RlZmluZSBwZ3RhYmxlX2NhY2hlX2luaXQoKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBpb19yZW1hcF9wYWdlX3JhbmdlCQlyZW1hcF9wYWdlX3JhbmdlCisKK3R5cGVkZWYgcHRlX3QgKnB0ZV9hZGRyX3Q7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBfX0FTTV9PUEVOUklTQ19QR1RBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNTRjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX1BST0NFU1NPUl9ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX1BST0NFU1NPUl9ICisKKyNpbmNsdWRlIDxhc20vc3ByX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworI2RlZmluZSBTVEFDS19UT1AgICAgICAgVEFTS19TSVpFCisjZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCisvKiBLZXJuZWwgYW5kIHVzZXIgU1IgcmVnaXN0ZXIgc2V0dGluZyAqLworI2RlZmluZSBLRVJORUxfU1IgKFNQUl9TUl9ETUUgfCBTUFJfU1JfSU1FIHwgU1BSX1NSX0lDRSBcCisJCSAgIHwgU1BSX1NSX0RDRSB8IFNQUl9TUl9TTSkKKyNkZWZpbmUgVVNFUl9TUiAgIChTUFJfU1JfRE1FIHwgU1BSX1NSX0lNRSB8IFNQUl9TUl9JQ0UgXAorCQkgICB8IFNQUl9TUl9EQ0UgfCBTUFJfU1JfSUVFIHwgU1BSX1NSX1RFRSkKKy8qCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIG1hY3JvIHRoYXQgcmV0dXJucyBjdXJyZW50CisgKiBpbnN0cnVjdGlvbiBwb2ludGVyICgicHJvZ3JhbSBjb3VudGVyIikuCisgKi8KKyNkZWZpbmUgY3VycmVudF90ZXh0X2FkZHIoKSAoeyBfX2xhYmVsX18gX2w7IF9sOiAmJl9sOyB9KQorCisvKgorICogVXNlciBzcGFjZSBwcm9jZXNzIHNpemUuIFRoaXMgaXMgaGFyZGNvZGVkIGludG8gYSBmZXcgcGxhY2VzLAorICogc28gZG9uJ3QgY2hhbmdlIGl0IHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisgKi8KKworI2RlZmluZSBUQVNLX1NJWkUgICAgICAgKDB4ODAwMDAwMDBVTCkKKworLyogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQorICogc3BhY2UgZHVyaW5nIG1tYXAncy4KKyAqLworI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UgICAgICAoVEFTS19TSVpFIC8gOCAqIDMpCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3N0cnVjdCB0YXNrX3N0cnVjdDsKKworc3RydWN0IHRocmVhZF9zdHJ1Y3QgeworfTsKKworLyoKKyAqIEF0IHVzZXItPmtlcm5lbCBlbnRyeSwgdGhlIHB0X3JlZ3Mgc3RydWN0IGlzIHN0YWNrZWQgb24gdGhlIHRvcCBvZiB0aGUKKyAqIGtlcm5lbC1zdGFjay4gIFRoaXMgbWFjcm8gYWxsb3dzIHVzIHRvIGZpbmQgdGhvc2UgcmVncyBmb3IgYSB0YXNrLgorICogTm90aWNlIHRoYXQgc3Vic2VxdWVudCBwdF9yZWdzIHN0YWNraW5ncywgbGlrZSByZWN1cnNpdmUgaW50ZXJydXB0cworICogb2NjdXJyaW5nIHdoaWxlIHdlJ3JlIGluIHRoZSBrZXJuZWwsIHdvbid0IGFmZmVjdCB0aGlzIC0gb25seSB0aGUgZmlyc3QKKyAqIHVzZXItPmtlcm5lbCB0cmFuc2l0aW9uIHJlZ2lzdGVycyBhcmUgcmVhY2hlZCBieSB0aGlzIChpLmUuIG5vdCByZWdzCisgKiBmb3IgcnVubmluZyBzaWduYWwgaGFuZGxlcikKKyAqLworI2RlZmluZSB1c2VyX3JlZ3ModGhyZWFkX2luZm8pICAoKChzdHJ1Y3QgcHRfcmVncyAqKSgodW5zaWduZWQgbG9uZykodGhyZWFkX2luZm8pICsgVEhSRUFEX1NJWkUgLSBTVEFDS19GUkFNRV9PVkVSSEVBRCkpIC0gMSkKKworLyoKKyAqIERpdG8gYnV0IGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzaworICovCisKKyNkZWZpbmUgdGFza19wdF9yZWdzKHRhc2spIHVzZXJfcmVncyh0YXNrX3RocmVhZF9pbmZvKHRhc2spKQorI2RlZmluZSBjdXJyZW50X3JlZ3MoKSB1c2VyX3JlZ3MoY3VycmVudF90aHJlYWRfaW5mbygpKQorCitleHRlcm4gaW5saW5lIHZvaWQgcHJlcGFyZV90b19jb3B5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworfQorCisjZGVmaW5lIElOSVRfU1AgICAgICAgICAoc2l6ZW9mKGluaXRfc3RhY2spICsgKHVuc2lnbmVkIGxvbmcpICZpbml0X3N0YWNrKQorCisjZGVmaW5lIElOSVRfVEhSRUFEICB7IH0KKworCisjZGVmaW5lIEtTVEtfRUlQKHRzaykgICAodGFza19wdF9yZWdzKHRzayktPnBjKTsKKyNkZWZpbmUgS1NUS19FU1AodHNrKSAgICh0YXNrX3B0X3JlZ3ModHNrKS0+c3ApOworCisKK2V4dGVybiBpbnQga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZywgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK3ZvaWQgc3RhcnRfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIG5pcCwgdW5zaWduZWQgbG9uZyBzcCk7Cit2b2lkIHJlbGVhc2VfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKK3Vuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKKy8qCisgKiBGcmVlIGN1cnJlbnQgdGhyZWFkIGRhdGEgc3RydWN0dXJlcyBldGMuLgorICovCisKK2V4dGVybiBpbmxpbmUgdm9pZCBleGl0X3RocmVhZCh2b2lkKQoreworCS8qIE5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZS4gICovCit9CisKKy8qCisgKiBSZXR1cm4gc2F2ZWQgUEMgb2YgYSBibG9ja2VkIHRocmVhZC4gRm9yIG5vdywgdGhpcyBpcyB0aGUgInVzZXIiIFBDCisgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpOworCisjZGVmaW5lIGluaXRfc3RhY2sgICAgICAoaW5pdF90aHJlYWRfdW5pb24uc3RhY2spCisKKyNkZWZpbmUgY3B1X3JlbGF4KCkgICAgIGRvIHsgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworI2VuZGlmIC8qIF9fQVNNX09QRU5SSVNDX1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3Byb20uaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vcHJvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjNmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3Byb20uaApAQCAtMCwwICsxLDc3IEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L29mLmg+CS8qIGxpbnV4L29mLmggZ2V0cyB0byBkZXRlcm1pbmUgI2luY2x1ZGUgb3JkZXJpbmcgKi8KKworI2lmbmRlZiBfQVNNX09QRU5SSVNDX1BST01fSAorI2RlZmluZSBfQVNNX09QRU5SSVNDX1BST01fSAorI2lmZGVmIF9fS0VSTkVMX18KKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2RlZmluZSBIQVZFX0FSQ0hfREVWVFJFRV9GSVhVUFMKKworLyogT3RoZXIgUHJvdG90eXBlcyAqLworZXh0ZXJuIGludCBlYXJseV91YXJ0bGl0ZV9jb25zb2xlKHZvaWQpOworCisvKiBQYXJzZSB0aGUgaWJtLGRtYS13aW5kb3cgcHJvcGVydHkgb2YgYW4gT0Ygbm9kZSBpbnRvIHRoZSBidXNubywgcGh5cyBhbmQKKyAqIHNpemUgcGFyYW1ldGVycy4KKyAqLwordm9pZCBvZl9wYXJzZV9kbWFfd2luZG93KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIGNvbnN0IHZvaWQgKmRtYV93aW5kb3dfcHJvcCwKKwkJdW5zaWduZWQgbG9uZyAqYnVzbm8sIHVuc2lnbmVkIGxvbmcgKnBoeXMsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworCitleHRlcm4gdm9pZCBrZHVtcF9tb3ZlX2RldmljZV90cmVlKHZvaWQpOworCisvKiBDUFUgT0Ygbm9kZSBtYXRjaGluZyAqLworc3RydWN0IGRldmljZV9ub2RlICpvZl9nZXRfY3B1X25vZGUoaW50IGNwdSwgdW5zaWduZWQgaW50ICp0aHJlYWQpOworCisvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCitleHRlcm4gY29uc3Qgdm9pZCAqb2ZfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworCisvKioKKyAqIG9mX2lycV9tYXBfcGNpIC0gUmVzb2x2ZSB0aGUgaW50ZXJydXB0IGZvciBhIFBDSSBkZXZpY2UKKyAqIEBwZGV2Ogl0aGUgZGV2aWNlIHdob3NlIGludGVycnVwdCBpcyB0byBiZSByZXNvbHZlZAorICogQG91dF9pcnE6CXN0cnVjdHVyZSBvZl9pcnEgZmlsbGVkIGJ5IHRoaXMgZnVuY3Rpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBQQ0kgaW50ZXJydXB0IGZvciBhIGdpdmVuIFBDSSBkZXZpY2UuIElmIGEKKyAqIGRldmljZS1ub2RlIGV4aXN0cyBmb3IgYSBnaXZlbiBwY2lfZGV2LCBpdCB3aWxsIHVzZSBub3JtYWwgT0YgdHJlZQorICogd2Fsa2luZy4gSWYgbm90LCBpdCB3aWxsIGltcGxlbWVudCBzdGFuZGFyZCBzd2l6emxpbmcgYW5kIHdhbGsgdXAgdGhlCisgKiBQQ0kgdHJlZSB1bnRpbCBhbiBkZXZpY2Utbm9kZSBpcyBmb3VuZCwgYXQgd2hpY2ggcG9pbnQgaXQgd2lsbCBmaW5pc2gKKyAqIHJlc29sdmluZyB1c2luZyB0aGUgT0YgdHJlZSB3YWxraW5nLgorICovCitzdHJ1Y3QgcGNpX2RldjsKK2V4dGVybiBpbnQgb2ZfaXJxX21hcF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpOworCisvKiBUaGlzIHJvdXRpbmUgaXMgaGVyZSB0byBwcm92aWRlIGNvbXBhdGliaWxpdHkgd2l0aCBob3cgcG93ZXJwYworICogaGFuZGxlcyBJUlEgbWFwcGluZyBmb3IgT0YgZGV2aWNlIG5vZGVzLiAgV2UgcHJlY29tcHV0ZSBhbmQgcGVybWFuZW50bHkKKyAqIHJlZ2lzdGVyIHRoZW0gaW4gdGhlIHBsYXRmb3JtX2RldmljZSBvYmplY3RzLCB3aGVyZWFzIHBvd2VycGMgY29tcHV0ZXMgdGhlbQorICogb24gcmVxdWVzdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlycV9kaXNwb3NlX21hcHBpbmcodW5zaWduZWQgaW50IHZpcnEpCit7Cit9CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9PUEVOUklTQ19QUk9NX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3B0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDUzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX1BUUkFDRV9ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX1BUUkFDRV9ICisKKyNpbmNsdWRlIDxhc20vc3ByX2RlZnMuaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qCisgKiBUaGlzIGlzIHRoZSBsYXlvdXQgb2YgdGhlIHJlZ3NldCByZXR1cm5lZCBieSB0aGUgR0VUUkVHU0VUIHB0cmFjZSBjYWxsCisgKi8KK3N0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0IHsKKwkvKiBHUFIgUjAtUjMxLi4uICovCisJdW5zaWduZWQgbG9uZyBncHJbMzJdOworCXVuc2lnbmVkIGxvbmcgcGM7CisJdW5zaWduZWQgbG9uZyBzcjsKKwl1bnNpZ25lZCBsb25nIHBhZDE7CisJdW5zaWduZWQgbG9uZyBwYWQyOworfTsKKyNlbmRpZgorCisjaWZkZWYgX19LRVJORUxfXworCisvKgorICogTWFrZSBrZXJuZWwgUFRyYWNlL3JlZ2lzdGVyIHN0cnVjdHVyZXMgb3BhcXVlIHRvIHVzZXJzcGFjZS4uLiB1c2Vyc3BhY2UgY2FuCisgKiBhY2Nlc3MgdGhyZWFkIHN0YXRlIHZpYSB0aGUgcmVnc2V0IG1lY2hhbmlzbS4gIFRoaXMgYWxsb3dzIHVzIGEgYml0IG9mCisgKiBmbGV4aWJpbGl0eSBpbiBob3cgd2Ugb3JkZXIgdGhlIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2ssIHBlcm1pdHRpbmcgc29tZQorICogb3B0aW1pemF0aW9ucyBsaWtlIHBhY2tpbmcgY2FsbC1jbG9iYmVyZWQgcmVnaXN0ZXJzIHRvZ2V0aGVyIHNvIHRoYXQKKyAqIHRoZXkgc2hhcmUgYSBjYWNoZWxpbmUgKG5vdCBkb25lIHlldCwgdGhvdWdoLi4uIGZ1dHVyZSBvcHRpbWl6YXRpb24pLgorICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisvKgorICogVGhpcyBzdHJ1Y3QgZGVzY3JpYmVzIGhvdyB0aGUgcmVnaXN0ZXJzIGFyZSBsYWlkIG91dCBvbiB0aGUga2VybmVsIHN0YWNrCisgKiBkdXJpbmcgYSBzeXNjYWxsIG9yIG90aGVyIGtlcm5lbCBlbnRyeS4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBzaG91bGQgYWx3YXlzIGJlIGNhY2hlbGluZSBhbGlnbmVkIG9uIHRoZSBzdGFjay4KKyAqIEZJWE1FOiBJIGRvbid0IHRoaW5rIHRoYXQncyB0aGUgY2FzZSByaWdodCBub3cuICBUaGUgYWxpZ25tZW50IGlzCisgKiB0YWtlbiBjYXJlIG9mIGVsc2V3aGVyZS4uLiBoZWFkLlMsIHByb2Nlc3MuYywgZXRjLgorICovCisKK3N0cnVjdCBwdF9yZWdzIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKiBOYW1lZCByZWdpc3RlcnMgKi8KKwkJCWxvbmcgIHNyOwkvKiBTdG9yZWQgaW4gcGxhY2Ugb2YgcjAgKi8KKwkJCWxvbmcgIHNwOwkvKiByMSAqLworCQl9OworCQlzdHJ1Y3QgeworCQkJLyogT2xkIHN0eWxlICovCisJCQlsb25nIG9mZnNldFsyXTsKKwkJCWxvbmcgZ3Byc1szMF07CisJCX07CisJCXN0cnVjdCB7CisJCQkvKiBOZXcgc3R5bGUgKi8KKwkJCWxvbmcgZ3ByWzMyXTsKKwkJfTsKKwl9OworCWxvbmcgIHBjOworCWxvbmcgIG9yaWdfZ3ByMTE7CS8qIEZvciByZXN0YXJ0aW5nIHN5c3RlbSBjYWxscyAqLworCWxvbmcgIHN5c2NhbGxubzsJLyogU3lzY2FsbCBudW1iZXIgKHVzZWQgYnkgc3RyYWNlKSAqLworCWxvbmcgZHVtbXk7CQkvKiBDaGVhcCBhbGlnbm1lbnQgZml4ICovCit9OworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisvKiBUT0RPOiBSZW5hbWUgdGhpcyB0byBSRURaT05FIGJlY2F1c2UgdGhhdCdzIHdoYXQgaXQgaXMgKi8KKyNkZWZpbmUgU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgIDEyOCAgLyogc2l6ZSBvZiBtaW5pbXVtIHN0YWNrIGZyYW1lICovCisKKyNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQkoKHJlZ3MpLT5wYykKKyNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpCQkJKCgocmVncyktPnNyICYgU1BSX1NSX1NNKSA9PSAwKQorI2RlZmluZSB1c2VyX3N0YWNrX3BvaW50ZXIocmVncykJKCh1bnNpZ25lZCBsb25nKShyZWdzKS0+c3ApCisjZGVmaW5lIHByb2ZpbGVfcGMocmVncykJCWluc3RydWN0aW9uX3BvaW50ZXIocmVncykKKworLyoKKyAqIE9mZnNldHMgdXNlZCBieSAncHRyYWNlJyBzeXN0ZW0gY2FsbCBpbnRlcmZhY2UuCisgKi8KKyNkZWZpbmUgUFRfU1IgICAgICAgICAwCisjZGVmaW5lIFBUX1NQICAgICAgICAgNAorI2RlZmluZSBQVF9HUFIyICAgICAgIDgKKyNkZWZpbmUgUFRfR1BSMyAgICAgICAxMgorI2RlZmluZSBQVF9HUFI0ICAgICAgIDE2CisjZGVmaW5lIFBUX0dQUjUgICAgICAgMjAKKyNkZWZpbmUgUFRfR1BSNiAgICAgICAyNAorI2RlZmluZSBQVF9HUFI3ICAgICAgIDI4CisjZGVmaW5lIFBUX0dQUjggICAgICAgMzIKKyNkZWZpbmUgUFRfR1BSOSAgICAgICAzNgorI2RlZmluZSBQVF9HUFIxMCAgICAgIDQwCisjZGVmaW5lIFBUX0dQUjExICAgICAgNDQKKyNkZWZpbmUgUFRfR1BSMTIgICAgICA0OAorI2RlZmluZSBQVF9HUFIxMyAgICAgIDUyCisjZGVmaW5lIFBUX0dQUjE0ICAgICAgNTYKKyNkZWZpbmUgUFRfR1BSMTUgICAgICA2MAorI2RlZmluZSBQVF9HUFIxNiAgICAgIDY0CisjZGVmaW5lIFBUX0dQUjE3ICAgICAgNjgKKyNkZWZpbmUgUFRfR1BSMTggICAgICA3MgorI2RlZmluZSBQVF9HUFIxOSAgICAgIDc2CisjZGVmaW5lIFBUX0dQUjIwICAgICAgODAKKyNkZWZpbmUgUFRfR1BSMjEgICAgICA4NAorI2RlZmluZSBQVF9HUFIyMiAgICAgIDg4CisjZGVmaW5lIFBUX0dQUjIzICAgICAgOTIKKyNkZWZpbmUgUFRfR1BSMjQgICAgICA5NgorI2RlZmluZSBQVF9HUFIyNSAgICAgIDEwMAorI2RlZmluZSBQVF9HUFIyNiAgICAgIDEwNAorI2RlZmluZSBQVF9HUFIyNyAgICAgIDEwOAorI2RlZmluZSBQVF9HUFIyOCAgICAgIDExMgorI2RlZmluZSBQVF9HUFIyOSAgICAgIDExNgorI2RlZmluZSBQVF9HUFIzMCAgICAgIDEyMAorI2RlZmluZSBQVF9HUFIzMSAgICAgIDEyNAorI2RlZmluZSBQVF9QQwkgICAgICAxMjgKKyNkZWZpbmUgUFRfT1JJR19HUFIxMSAxMzIKKyNkZWZpbmUgUFRfU1lTQ0FMTE5PICAxMzYKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9fQVNNX09QRU5SSVNDX1BUUkFDRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3NlcmlhbC5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBhNDUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zZXJpYWwuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX1NFUklBTF9ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX1NFUklBTF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxhc20vY3B1aW5mby5oPgorCisvKiBUaGVyZSdzIGEgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoaXMgZmlsZSwgYnV0IGl0IGFzc3VtZXMgYSAxLjhNSHogVUFSVCBjbGsuLi4KKyAqIHRoaXMsIG9uIHRoZSBvdGhlciBoYW5kLCBhc3N1bWVzIHRoZSBVQVJUIGNsb2NrIGlzIHRpZWQgdG8gdGhlIHN5c3RlbQorICogY2xvY2suLi4gODI1MF9lYXJseS5jIChlYXJseSA4MjUwIHNlcmlhbCBjb25zb2xlKSBhY3R1YWxseSB1c2VzIHRoaXMsIHNvCisgKiBpdCBuZWVkcyB0byBiZSBjb3JyZWN0IHRvIGdldCB0aGUgZWFybHkgY29uc29sZSB3b3JraW5nLgorICovCisKKyNkZWZpbmUgQkFTRV9CQVVEIChjcHVpbmZvLmNsb2NrX2ZyZXF1ZW5jeS8xNikKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9fQVNNX09QRU5SSVNDX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YTVjNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX1NJR0NPTlRFWFRfSAorI2RlZmluZSBfX0FTTV9PUEVOUklTQ19TSUdDT05URVhUX0gKKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworLyogVGhpcyBzdHJ1Y3QgaXMgc2F2ZWQgYnkgc2V0dXBfZnJhbWUgaW4gc2lnbmFsLmMsIHRvIGtlZXAgdGhlIGN1cnJlbnQKKyAgIGNvbnRleHQgd2hpbGUgYSBzaWduYWwgaGFuZGxlciBpcyBleGVjdXRlZC4gSXQncyByZXN0b3JlZCBieSBzeXNfc2lncmV0dXJuLgorCisgICBUbyBrZWVwIHRoaW5ncyBzaW1wbGUsIHdlIHVzZSBwdF9yZWdzIGhlcmUgZXZlbiB0aG91Z2ggbm9ybWFsbHkgeW91IGp1c3QKKyAgIHNwZWNpZnkgdGhlIGxpc3Qgb2YgcmVncyB0byBzYXZlLiBUaGVuIHdlIGNhbiB1c2UgY29weV9mcm9tX3VzZXIgb24gdGhlCisgICBlbnRpcmUgcmVncyBpbnN0ZWFkIG9mIGEgYnVuY2ggb2YgZ2V0X3VzZXIncyBhcyB3ZWxsLi4uCisqLworCitzdHJ1Y3Qgc2lnY29udGV4dCB7CisJc3RydWN0IHB0X3JlZ3MgcmVnczsgIC8qIG5lZWRzIHRvIGJlIGZpcnN0ICovCisJdW5zaWduZWQgbG9uZyBvbGRtYXNrOworCXVuc2lnbmVkIGxvbmcgdXNwOyAgICAvKiB1c3AgYmVmb3JlIHN0YWNraW5nIHRoaXMgZ3VuayBvbiBpdCAqLworfTsKKworI2VuZGlmIC8qIF9fQVNNX09QRU5SSVNDX1NJR0NPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zcGlubG9jay5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zcGlubG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDBhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogT3BlblJJU0MgaW1wbGVtZW50YXRpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19TUElOTE9DS19ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX1NQSU5MT0NLX0gKKworI2Vycm9yICJvcjMyIGRvZXNuJ3QgZG8gU01QIHlldCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3Nwci5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zcHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2NjYjQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zcHIuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfU1BSX0gKKyNkZWZpbmUgX19BU01fT1BFTlJJU0NfU1BSX0gKKworI2RlZmluZSBtdHNwcihfc3ByLCBfdmFsKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQlcCisJImwubXRzcHIgcjAsJTEsJTAiCQkJCQlcCisJOiA6ICJLIiAoX3NwciksICJyIiAoX3ZhbCkpCisjZGVmaW5lIG10c3ByX29mZihfc3ByLCBfb2ZmLCBfdmFsKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCVwKKwkibC5tdHNwciAlMCwlMSwlMiIJCQkJCVwKKwk6IDogInIiIChfb2ZmKSwgInIiIChfdmFsKSwgIksiIChfc3ByKSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1mc3ByKHVuc2lnbmVkIGxvbmcgYWRkKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCV9fYXNtX18gX192b2xhdGlsZV9fICgibC5tZnNwciAlMCxyMCwlMSIgOiAiPXIiIChyZXQpIDogIksiIChhZGQpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWZzcHJfb2ZmKHVuc2lnbmVkIGxvbmcgYWRkLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImwubWZzcHIgJTAsJTEsJTIiIDogIj1yIiAocmV0KQorCQkJCQkJIDogInIiIChvZmZzZXQpLCAiSyIgKGFkZCkpOworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zcHJfZGVmcy5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zcHJfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYmM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3Nwcl9kZWZzLmgKQEAgLTAsMCArMSw2MDQgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIFNQUiBEZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEYW1qYW4gTGFtcHJldAorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMTAgRW1iZWNvc20gTGltaXRlZAorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBPcGVuUklTQyAxMDAwIEFyY2hpdGVjdHVyYWwgU2ltdWxhdG9yLgorICovCisKKyNpZm5kZWYgU1BSX0RFRlNfX0gKKyNkZWZpbmUgU1BSX0RFRlNfX0gKKworLyogRGVmaW5pdGlvbiBvZiBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXJzIChTUFJzKS4gKi8KKworI2RlZmluZSBNQVhfR1JQUyAoMzIpCisjZGVmaW5lIE1BWF9TUFJTX1BFUl9HUlBfQklUUyAoMTEpCisjZGVmaW5lIE1BWF9TUFJTX1BFUl9HUlAgKDEgPDwgTUFYX1NQUlNfUEVSX0dSUF9CSVRTKQorI2RlZmluZSBNQVhfU1BSUyAoMHgxMDAwMCkKKworLyogQmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBncm91cHMgKi8KKyNkZWZpbmUgU1BSR1JPVVBfU1lTCSgwIDw8IE1BWF9TUFJTX1BFUl9HUlBfQklUUykKKyNkZWZpbmUgU1BSR1JPVVBfRE1NVQkoMSA8PCBNQVhfU1BSU19QRVJfR1JQX0JJVFMpCisjZGVmaW5lIFNQUkdST1VQX0lNTVUJKDIgPDwgTUFYX1NQUlNfUEVSX0dSUF9CSVRTKQorI2RlZmluZSBTUFJHUk9VUF9EQwkoMyA8PCBNQVhfU1BSU19QRVJfR1JQX0JJVFMpCisjZGVmaW5lIFNQUkdST1VQX0lDCSg0IDw8IE1BWF9TUFJTX1BFUl9HUlBfQklUUykKKyNkZWZpbmUgU1BSR1JPVVBfTUFDCSg1IDw8IE1BWF9TUFJTX1BFUl9HUlBfQklUUykKKyNkZWZpbmUgU1BSR1JPVVBfRAkoNiA8PCBNQVhfU1BSU19QRVJfR1JQX0JJVFMpCisjZGVmaW5lIFNQUkdST1VQX1BDCSg3IDw8IE1BWF9TUFJTX1BFUl9HUlBfQklUUykKKyNkZWZpbmUgU1BSR1JPVVBfUE0JKDggPDwgTUFYX1NQUlNfUEVSX0dSUF9CSVRTKQorI2RlZmluZSBTUFJHUk9VUF9QSUMJKDkgPDwgTUFYX1NQUlNfUEVSX0dSUF9CSVRTKQorI2RlZmluZSBTUFJHUk9VUF9UVAkoMTAgPDwgTUFYX1NQUlNfUEVSX0dSUF9CSVRTKQorI2RlZmluZSBTUFJHUk9VUF9GUAkoMTEgPDwgTUFYX1NQUlNfUEVSX0dSUF9CSVRTKQorCisvKiBTeXN0ZW0gY29udHJvbCBhbmQgc3RhdHVzIGdyb3VwICovCisjZGVmaW5lIFNQUl9WUgkJKFNQUkdST1VQX1NZUyArIDApCisjZGVmaW5lIFNQUl9VUFIJCShTUFJHUk9VUF9TWVMgKyAxKQorI2RlZmluZSBTUFJfQ1BVQ0ZHUgkoU1BSR1JPVVBfU1lTICsgMikKKyNkZWZpbmUgU1BSX0RNTVVDRkdSCShTUFJHUk9VUF9TWVMgKyAzKQorI2RlZmluZSBTUFJfSU1NVUNGR1IJKFNQUkdST1VQX1NZUyArIDQpCisjZGVmaW5lIFNQUl9EQ0NGR1IJKFNQUkdST1VQX1NZUyArIDUpCisjZGVmaW5lIFNQUl9JQ0NGR1IJKFNQUkdST1VQX1NZUyArIDYpCisjZGVmaW5lIFNQUl9EQ0ZHUgkoU1BSR1JPVVBfU1lTICsgNykKKyNkZWZpbmUgU1BSX1BDQ0ZHUgkoU1BSR1JPVVBfU1lTICsgOCkKKyNkZWZpbmUgU1BSX05QQyAgICAgICAgIChTUFJHUk9VUF9TWVMgKyAxNikgIC8qIENaIDIxLzA2LzAxICovCisjZGVmaW5lIFNQUl9TUgkJKFNQUkdST1VQX1NZUyArIDE3KSAgLyogQ1ogMjEvMDYvMDEgKi8KKyNkZWZpbmUgU1BSX1BQQyAgICAgICAgIChTUFJHUk9VUF9TWVMgKyAxOCkgIC8qIENaIDIxLzA2LzAxICovCisjZGVmaW5lIFNQUl9GUENTUiAgICAgICAoU1BSR1JPVVBfU1lTICsgMjApICAvKiBDWiAyMS8wNi8wMSAqLworI2RlZmluZSBTUFJfRVBDUl9CQVNFCShTUFJHUk9VUF9TWVMgKyAzMikgIC8qIENaIDIxLzA2LzAxICovCisjZGVmaW5lIFNQUl9FUENSX0xBU1QJKFNQUkdST1VQX1NZUyArIDQ3KSAgLyogQ1ogMjEvMDYvMDEgKi8KKyNkZWZpbmUgU1BSX0VFQVJfQkFTRQkoU1BSR1JPVVBfU1lTICsgNDgpCisjZGVmaW5lIFNQUl9FRUFSX0xBU1QJKFNQUkdST1VQX1NZUyArIDYzKQorI2RlZmluZSBTUFJfRVNSX0JBU0UJKFNQUkdST1VQX1NZUyArIDY0KQorI2RlZmluZSBTUFJfRVNSX0xBU1QJKFNQUkdST1VQX1NZUyArIDc5KQorI2RlZmluZSBTUFJfR1BSX0JBU0UJKFNQUkdST1VQX1NZUyArIDEwMjQpCisKKy8qIERhdGEgTU1VIGdyb3VwICovCisjZGVmaW5lIFNQUl9ETU1VQ1IJKFNQUkdST1VQX0RNTVUgKyAwKQorI2RlZmluZSBTUFJfRFRMQkVJUgkoU1BSR1JPVVBfRE1NVSArIDIpCisjZGVmaW5lIFNQUl9EVExCTVJfQkFTRShXQVkpCShTUFJHUk9VUF9ETU1VICsgMHgyMDAgKyAoV0FZKSAqIDB4MTAwKQorI2RlZmluZSBTUFJfRFRMQk1SX0xBU1QoV0FZKQkoU1BSR1JPVVBfRE1NVSArIDB4MjdmICsgKFdBWSkgKiAweDEwMCkKKyNkZWZpbmUgU1BSX0RUTEJUUl9CQVNFKFdBWSkJKFNQUkdST1VQX0RNTVUgKyAweDI4MCArIChXQVkpICogMHgxMDApCisjZGVmaW5lIFNQUl9EVExCVFJfTEFTVChXQVkpCShTUFJHUk9VUF9ETU1VICsgMHgyZmYgKyAoV0FZKSAqIDB4MTAwKQorCisvKiBJbnN0cnVjdGlvbiBNTVUgZ3JvdXAgKi8KKyNkZWZpbmUgU1BSX0lNTVVDUgkoU1BSR1JPVVBfSU1NVSArIDApCisjZGVmaW5lIFNQUl9JVExCRUlSCShTUFJHUk9VUF9JTU1VICsgMikKKyNkZWZpbmUgU1BSX0lUTEJNUl9CQVNFKFdBWSkJKFNQUkdST1VQX0lNTVUgKyAweDIwMCArIChXQVkpICogMHgxMDApCisjZGVmaW5lIFNQUl9JVExCTVJfTEFTVChXQVkpCShTUFJHUk9VUF9JTU1VICsgMHgyN2YgKyAoV0FZKSAqIDB4MTAwKQorI2RlZmluZSBTUFJfSVRMQlRSX0JBU0UoV0FZKQkoU1BSR1JPVVBfSU1NVSArIDB4MjgwICsgKFdBWSkgKiAweDEwMCkKKyNkZWZpbmUgU1BSX0lUTEJUUl9MQVNUKFdBWSkJKFNQUkdST1VQX0lNTVUgKyAweDJmZiArIChXQVkpICogMHgxMDApCisKKy8qIERhdGEgY2FjaGUgZ3JvdXAgKi8KKyNkZWZpbmUgU1BSX0RDQ1IJKFNQUkdST1VQX0RDICsgMCkKKyNkZWZpbmUgU1BSX0RDQlBSCShTUFJHUk9VUF9EQyArIDEpCisjZGVmaW5lIFNQUl9EQ0JGUgkoU1BSR1JPVVBfREMgKyAyKQorI2RlZmluZSBTUFJfRENCSVIJKFNQUkdST1VQX0RDICsgMykKKyNkZWZpbmUgU1BSX0RDQldSCShTUFJHUk9VUF9EQyArIDQpCisjZGVmaW5lIFNQUl9EQ0JMUgkoU1BSR1JPVVBfREMgKyA1KQorI2RlZmluZSBTUFJfRENSX0JBU0UoV0FZKQkoU1BSR1JPVVBfREMgKyAweDIwMCArIChXQVkpICogMHgyMDApCisjZGVmaW5lIFNQUl9EQ1JfTEFTVChXQVkpCShTUFJHUk9VUF9EQyArIDB4M2ZmICsgKFdBWSkgKiAweDIwMCkKKworLyogSW5zdHJ1Y3Rpb24gY2FjaGUgZ3JvdXAgKi8KKyNkZWZpbmUgU1BSX0lDQ1IJKFNQUkdST1VQX0lDICsgMCkKKyNkZWZpbmUgU1BSX0lDQlBSCShTUFJHUk9VUF9JQyArIDEpCisjZGVmaW5lIFNQUl9JQ0JJUgkoU1BSR1JPVVBfSUMgKyAyKQorI2RlZmluZSBTUFJfSUNCTFIJKFNQUkdST1VQX0lDICsgMykKKyNkZWZpbmUgU1BSX0lDUl9CQVNFKFdBWSkJKFNQUkdST1VQX0lDICsgMHgyMDAgKyAoV0FZKSAqIDB4MjAwKQorI2RlZmluZSBTUFJfSUNSX0xBU1QoV0FZKQkoU1BSR1JPVVBfSUMgKyAweDNmZiArIChXQVkpICogMHgyMDApCisKKy8qIE1BQyBncm91cCAqLworI2RlZmluZSBTUFJfTUFDTE8JKFNQUkdST1VQX01BQyArIDEpCisjZGVmaW5lIFNQUl9NQUNISQkoU1BSR1JPVVBfTUFDICsgMikKKworLyogRGVidWcgZ3JvdXAgKi8KKyNkZWZpbmUgU1BSX0RWUihOKQkoU1BSR1JPVVBfRCArIChOKSkKKyNkZWZpbmUgU1BSX0RDUihOKQkoU1BSR1JPVVBfRCArIDggKyAoTikpCisjZGVmaW5lIFNQUl9ETVIxCShTUFJHUk9VUF9EICsgMTYpCisjZGVmaW5lIFNQUl9ETVIyCShTUFJHUk9VUF9EICsgMTcpCisjZGVmaW5lIFNQUl9EV0NSMAkoU1BSR1JPVVBfRCArIDE4KQorI2RlZmluZSBTUFJfRFdDUjEJKFNQUkdST1VQX0QgKyAxOSkKKyNkZWZpbmUgU1BSX0RTUgkJKFNQUkdST1VQX0QgKyAyMCkKKyNkZWZpbmUgU1BSX0RSUgkJKFNQUkdST1VQX0QgKyAyMSkKKworLyogUGVyZm9ybWFuY2UgY291bnRlcnMgZ3JvdXAgKi8KKyNkZWZpbmUgU1BSX1BDQ1IoTikJKFNQUkdST1VQX1BDICsgKE4pKQorI2RlZmluZSBTUFJfUENNUihOKQkoU1BSR1JPVVBfUEMgKyA4ICsgKE4pKQorCisvKiBQb3dlciBtYW5hZ2VtZW50IGdyb3VwICovCisjZGVmaW5lIFNQUl9QTVIgKFNQUkdST1VQX1BNICsgMCkKKworLyogUElDIGdyb3VwICovCisjZGVmaW5lIFNQUl9QSUNNUiAoU1BSR1JPVVBfUElDICsgMCkKKyNkZWZpbmUgU1BSX1BJQ1BSIChTUFJHUk9VUF9QSUMgKyAxKQorI2RlZmluZSBTUFJfUElDU1IgKFNQUkdST1VQX1BJQyArIDIpCisKKy8qIFRpY2sgVGltZXIgZ3JvdXAgKi8KKyNkZWZpbmUgU1BSX1RUTVIgKFNQUkdST1VQX1RUICsgMCkKKyNkZWZpbmUgU1BSX1RUQ1IgKFNQUkdST1VQX1RUICsgMSkKKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgdGhlIFZlcnNpb24gUmVnaXN0ZXIKKyAqCisgKi8KKyNkZWZpbmUgU1BSX1ZSX1ZFUgkweGZmMDAwMDAwICAvKiBQcm9jZXNzb3IgdmVyc2lvbiAqLworI2RlZmluZSBTUFJfVlJfQ0ZHCTB4MDBmZjAwMDAgIC8qIFByb2Nlc3NvciBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFNQUl9WUl9SRVMJMHgwMDAwZmZjMCAgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU1BSX1ZSX1JFVgkweDAwMDAwMDNmICAvKiBQcm9jZXNzb3IgcmV2aXNpb24gKi8KKworI2RlZmluZSBTUFJfVlJfVkVSX09GRgkyNAorI2RlZmluZSBTUFJfVlJfQ0ZHX09GRgkxNgorI2RlZmluZSBTUFJfVlJfUkVWX09GRgkwCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBVbml0IFByZXNlbnQgUmVnaXN0ZXIKKyAqCisgKi8KKyNkZWZpbmUgU1BSX1VQUl9VUAkgICAweDAwMDAwMDAxICAvKiBVUFIgcHJlc2VudCAqLworI2RlZmluZSBTUFJfVVBSX0RDUAkgICAweDAwMDAwMDAyICAvKiBEYXRhIGNhY2hlIHByZXNlbnQgKi8KKyNkZWZpbmUgU1BSX1VQUl9JQ1AJICAgMHgwMDAwMDAwNCAgLyogSW5zdHJ1Y3Rpb24gY2FjaGUgcHJlc2VudCAqLworI2RlZmluZSBTUFJfVVBSX0RNUAkgICAweDAwMDAwMDA4ICAvKiBEYXRhIE1NVSBwcmVzZW50ICovCisjZGVmaW5lIFNQUl9VUFJfSU1QCSAgIDB4MDAwMDAwMTAgIC8qIEluc3RydWN0aW9uIE1NVSBwcmVzZW50ICovCisjZGVmaW5lIFNQUl9VUFJfTVAJICAgMHgwMDAwMDAyMCAgLyogTUFDIHByZXNlbnQgKi8KKyNkZWZpbmUgU1BSX1VQUl9EVVAJICAgMHgwMDAwMDA0MCAgLyogRGVidWcgdW5pdCBwcmVzZW50ICovCisjZGVmaW5lIFNQUl9VUFJfUENVUAkgICAweDAwMDAwMDgwICAvKiBQZXJmb3JtYW5jZSBjb3VudGVycyB1bml0IHByZXNlbnQgKi8KKyNkZWZpbmUgU1BSX1VQUl9QTVAJICAgMHgwMDAwMDEwMCAgLyogUG93ZXIgbWFuYWdlbWVudCBwcmVzZW50ICovCisjZGVmaW5lIFNQUl9VUFJfUElDUAkgICAweDAwMDAwMjAwICAvKiBQSUMgcHJlc2VudCAqLworI2RlZmluZSBTUFJfVVBSX1RUUAkgICAweDAwMDAwNDAwICAvKiBUaWNrIHRpbWVyIHByZXNlbnQgKi8KKyNkZWZpbmUgU1BSX1VQUl9SRVMJICAgMHgwMGZlMDAwMCAgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU1BSX1VQUl9DVVAJICAgMHhmZjAwMDAwMCAgLyogQ29udGV4dCB1bml0cyBwcmVzZW50ICovCisKKy8qCisgKiBKUEI6IEJpdCBkZWZpbml0aW9ucyBmb3IgdGhlIENQVSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKgorICovCisjZGVmaW5lIFNQUl9DUFVDRkdSX05TR0YgICAweDAwMDAwMDBmICAvKiBOdW1iZXIgb2Ygc2hhZG93IEdQUiBmaWxlcyAqLworI2RlZmluZSBTUFJfQ1BVQ0ZHUl9DR0YJICAgMHgwMDAwMDAxMCAgLyogQ3VzdG9tIEdQUiBmaWxlICovCisjZGVmaW5lIFNQUl9DUFVDRkdSX09CMzJTICAweDAwMDAwMDIwICAvKiBPUkJJUzMyIHN1cHBvcnRlZCAqLworI2RlZmluZSBTUFJfQ1BVQ0ZHUl9PQjY0UyAgMHgwMDAwMDA0MCAgLyogT1JCSVM2NCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1BSX0NQVUNGR1JfT0YzMlMgIDB4MDAwMDAwODAgIC8qIE9SRlBYMzIgc3VwcG9ydGVkICovCisjZGVmaW5lIFNQUl9DUFVDRkdSX09GNjRTICAweDAwMDAwMTAwICAvKiBPUkZQWDY0IHN1cHBvcnRlZCAqLworI2RlZmluZSBTUFJfQ1BVQ0ZHUl9PVjY0UyAgMHgwMDAwMDIwMCAgLyogT1JWRFg2NCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1BSX0NQVUNGR1JfUkVTCSAgIDB4ZmZmZmZjMDAgIC8qIFJlc2VydmVkICovCisKKy8qCisgKiBKUEI6IEJpdCBkZWZpbml0aW9ucyBmb3IgdGhlIERlYnVnIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYW5kIG90aGVyCisgKiBjb25zdGFudHMuCisgKgorICovCisKKyNkZWZpbmUgU1BSX0RDRkdSX05EUCAgICAgIDB4MDAwMDAwMDcgIC8qIE51bWJlciBvZiBtYXRjaHBvaW50cyBtYXNrICovCisjZGVmaW5lIFNQUl9EQ0ZHUl9ORFAxICAgICAweDAwMDAwMDAwICAvKiBPbmUgbWF0Y2hwb2ludCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1BSX0RDRkdSX05EUDIgICAgIDB4MDAwMDAwMDEgIC8qIFR3byBtYXRjaHBvaW50cyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1BSX0RDRkdSX05EUDMgICAgIDB4MDAwMDAwMDIgIC8qIFRocmVlIG1hdGNocG9pbnRzIHN1cHBvcnRlZCAqLworI2RlZmluZSBTUFJfRENGR1JfTkRQNCAgICAgMHgwMDAwMDAwMyAgLyogRm91ciBtYXRjaHBvaW50cyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1BSX0RDRkdSX05EUDUgICAgIDB4MDAwMDAwMDQgIC8qIEZpdmUgbWF0Y2hwb2ludHMgc3VwcG9ydGVkICovCisjZGVmaW5lIFNQUl9EQ0ZHUl9ORFA2ICAgICAweDAwMDAwMDA1ICAvKiBTaXggbWF0Y2hwb2ludHMgc3VwcG9ydGVkICovCisjZGVmaW5lIFNQUl9EQ0ZHUl9ORFA3ICAgICAweDAwMDAwMDA2ICAvKiBTZXZlbiBtYXRjaHBvaW50cyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1BSX0RDRkdSX05EUDggICAgIDB4MDAwMDAwMDcgIC8qIEVpZ2h0IG1hdGNocG9pbnRzIHN1cHBvcnRlZCAqLworI2RlZmluZSBTUFJfRENGR1JfV1BDSSAgICAgMHgwMDAwMDAwOCAgLyogV2F0Y2hwb2ludCBjb3VudGVycyBpbXBsZW1lbnRlZCAqLworCisjZGVmaW5lIE1BVENIUE9JTlRTX1RPX05EUChuKSAoMSA9PSBuID8gU1BSX0RDRkdSX05EUDEgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9PSBuID8gU1BSX0RDRkdSX05EUDIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyA9PSBuID8gU1BSX0RDRkdSX05EUDMgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA9PSBuID8gU1BSX0RDRkdSX05EUDQgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSA9PSBuID8gU1BSX0RDRkdSX05EUDUgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiA9PSBuID8gU1BSX0RDRkdSX05EUDYgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyA9PSBuID8gU1BSX0RDRkdSX05EUDcgOiBTUFJfRENGR1JfTkRQOCkKKyNkZWZpbmUgTUFYX01BVENIUE9JTlRTICA4CisjZGVmaW5lIE1BWF9XQVRDSFBPSU5UUyAgKE1BWF9NQVRDSFBPSU5UUyArIDIpCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBTdXBlcnZpc2lvbiBSZWdpc3RlcgorICoKKyAqLworI2RlZmluZSBTUFJfU1JfU00gICAgICAgICAgMHgwMDAwMDAwMSAgLyogU3VwZXJ2aXNvciBNb2RlICovCisjZGVmaW5lIFNQUl9TUl9URUUgICAgICAgICAweDAwMDAwMDAyICAvKiBUaWNrIHRpbWVyIEV4Y2VwdGlvbiBFbmFibGUgKi8KKyNkZWZpbmUgU1BSX1NSX0lFRSAgICAgICAgIDB4MDAwMDAwMDQgIC8qIEludGVycnVwdCBFeGNlcHRpb24gRW5hYmxlICovCisjZGVmaW5lIFNQUl9TUl9EQ0UgICAgICAgICAweDAwMDAwMDA4ICAvKiBEYXRhIENhY2hlIEVuYWJsZSAqLworI2RlZmluZSBTUFJfU1JfSUNFICAgICAgICAgMHgwMDAwMDAxMCAgLyogSW5zdHJ1Y3Rpb24gQ2FjaGUgRW5hYmxlICovCisjZGVmaW5lIFNQUl9TUl9ETUUgICAgICAgICAweDAwMDAwMDIwICAvKiBEYXRhIE1NVSBFbmFibGUgKi8KKyNkZWZpbmUgU1BSX1NSX0lNRSAgICAgICAgIDB4MDAwMDAwNDAgIC8qIEluc3RydWN0aW9uIE1NVSBFbmFibGUgKi8KKyNkZWZpbmUgU1BSX1NSX0xFRSAgICAgICAgIDB4MDAwMDAwODAgIC8qIExpdHRsZSBFbmRpYW4gRW5hYmxlICovCisjZGVmaW5lIFNQUl9TUl9DRSAgICAgICAgICAweDAwMDAwMTAwICAvKiBDSUQgRW5hYmxlICovCisjZGVmaW5lIFNQUl9TUl9GICAgICAgICAgICAweDAwMDAwMjAwICAvKiBDb25kaXRpb24gRmxhZyAqLworI2RlZmluZSBTUFJfU1JfQ1kgICAgICAgICAgMHgwMDAwMDQwMCAgLyogQ2FycnkgZmxhZyAqLworI2RlZmluZSBTUFJfU1JfT1YgICAgICAgICAgMHgwMDAwMDgwMCAgLyogT3ZlcmZsb3cgZmxhZyAqLworI2RlZmluZSBTUFJfU1JfT1ZFICAgICAgICAgMHgwMDAwMTAwMCAgLyogT3ZlcmZsb3cgZmxhZyBFeGNlcHRpb24gKi8KKyNkZWZpbmUgU1BSX1NSX0RTWCAgICAgICAgIDB4MDAwMDIwMDAgIC8qIERlbGF5IFNsb3QgRXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9TUl9FUEggICAgICAgICAweDAwMDA0MDAwICAvKiBFeGNlcHRpb24gUHJlZml4IEhpZ2ggKi8KKyNkZWZpbmUgU1BSX1NSX0ZPICAgICAgICAgIDB4MDAwMDgwMDAgIC8qIEZpeGVkIG9uZSAqLworI2RlZmluZSBTUFJfU1JfU1VNUkEgICAgICAgMHgwMDAxMDAwMCAgLyogU3VwZXJ2aXNvciBTUFIgcmVhZCBhY2Nlc3MgKi8KKyNkZWZpbmUgU1BSX1NSX1JFUyAgICAgICAgIDB4MGZmZTAwMDAgIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFNQUl9TUl9DSUQgICAgICAgICAweGYwMDAwMDAwICAvKiBDb250ZXh0IElEICovCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBEYXRhIE1NVSBDb250cm9sIFJlZ2lzdGVyCisgKgorICovCisjZGVmaW5lIFNQUl9ETU1VQ1JfUDJTCSAgIDB4MDAwMDAwM2UgIC8qIExldmVsIDIgUGFnZSBTaXplICovCisjZGVmaW5lIFNQUl9ETU1VQ1JfUDFTCSAgIDB4MDAwMDA3YzAgIC8qIExldmVsIDEgUGFnZSBTaXplICovCisjZGVmaW5lIFNQUl9ETU1VQ1JfVkFERFJfV0lEVEgJMHgwMDAwZjgwMCAgLyogVmlydHVhbCBBRERSIFdpZHRoICovCisjZGVmaW5lIFNQUl9ETU1VQ1JfUEFERFJfV0lEVEgJMHgwMDBmMDAwMCAgLyogUGh5c2ljYWwgQUREUiBXaWR0aCAqLworCisvKgorICogQml0IGRlZmluaXRpb25zIGZvciB0aGUgSW5zdHJ1Y3Rpb24gTU1VIENvbnRyb2wgUmVnaXN0ZXIKKyAqCisgKi8KKyNkZWZpbmUgU1BSX0lNTVVDUl9QMlMJICAgMHgwMDAwMDAzZSAgLyogTGV2ZWwgMiBQYWdlIFNpemUgKi8KKyNkZWZpbmUgU1BSX0lNTVVDUl9QMVMJICAgMHgwMDAwMDdjMCAgLyogTGV2ZWwgMSBQYWdlIFNpemUgKi8KKyNkZWZpbmUgU1BSX0lNTVVDUl9WQUREUl9XSURUSAkweDAwMDBmODAwICAvKiBWaXJ0dWFsIEFERFIgV2lkdGggKi8KKyNkZWZpbmUgU1BSX0lNTVVDUl9QQUREUl9XSURUSAkweDAwMGYwMDAwICAvKiBQaHlzaWNhbCBBRERSIFdpZHRoICovCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBEYXRhIFRMQiBNYXRjaCBSZWdpc3RlcgorICoKKyAqLworI2RlZmluZSBTUFJfRFRMQk1SX1YJICAgMHgwMDAwMDAwMSAgLyogVmFsaWQgKi8KKyNkZWZpbmUgU1BSX0RUTEJNUl9QTDEJICAgMHgwMDAwMDAwMiAgLyogUGFnZSBMZXZlbCAxIChpZiAwIHRoZW4gUEwyKSAqLworI2RlZmluZSBTUFJfRFRMQk1SX0NJRAkgICAweDAwMDAwMDNjICAvKiBDb250ZXh0IElEICovCisjZGVmaW5lIFNQUl9EVExCTVJfTFJVCSAgIDB4MDAwMDAwYzAgIC8qIExlYXN0IFJlY2VudGx5IFVzZWQgKi8KKyNkZWZpbmUgU1BSX0RUTEJNUl9WUE4JICAgMHhmZmZmZjAwMCAgLyogVmlydHVhbCBQYWdlIE51bWJlciAqLworCisvKgorICogQml0IGRlZmluaXRpb25zIGZvciB0aGUgRGF0YSBUTEIgVHJhbnNsYXRlIFJlZ2lzdGVyCisgKgorICovCisjZGVmaW5lIFNQUl9EVExCVFJfQ0MJICAgMHgwMDAwMDAwMSAgLyogQ2FjaGUgQ29oZXJlbmN5ICovCisjZGVmaW5lIFNQUl9EVExCVFJfQ0kJICAgMHgwMDAwMDAwMiAgLyogQ2FjaGUgSW5oaWJpdCAqLworI2RlZmluZSBTUFJfRFRMQlRSX1dCQwkgICAweDAwMDAwMDA0ICAvKiBXcml0ZS1CYWNrIENhY2hlICovCisjZGVmaW5lIFNQUl9EVExCVFJfV09NCSAgIDB4MDAwMDAwMDggIC8qIFdlYWtseS1PcmRlcmVkIE1lbW9yeSAqLworI2RlZmluZSBTUFJfRFRMQlRSX0EJICAgMHgwMDAwMDAxMCAgLyogQWNjZXNzZWQgKi8KKyNkZWZpbmUgU1BSX0RUTEJUUl9ECSAgIDB4MDAwMDAwMjAgIC8qIERpcnR5ICovCisjZGVmaW5lIFNQUl9EVExCVFJfVVJFCSAgIDB4MDAwMDAwNDAgIC8qIFVzZXIgUmVhZCBFbmFibGUgKi8KKyNkZWZpbmUgU1BSX0RUTEJUUl9VV0UJICAgMHgwMDAwMDA4MCAgLyogVXNlciBXcml0ZSBFbmFibGUgKi8KKyNkZWZpbmUgU1BSX0RUTEJUUl9TUkUJICAgMHgwMDAwMDEwMCAgLyogU3VwZXJ2aXNvciBSZWFkIEVuYWJsZSAqLworI2RlZmluZSBTUFJfRFRMQlRSX1NXRQkgICAweDAwMDAwMjAwICAvKiBTdXBlcnZpc29yIFdyaXRlIEVuYWJsZSAqLworI2RlZmluZSBTUFJfRFRMQlRSX1BQTgkgICAweGZmZmZmMDAwICAvKiBQaHlzaWNhbCBQYWdlIE51bWJlciAqLworCisvKgorICogQml0IGRlZmluaXRpb25zIGZvciB0aGUgSW5zdHJ1Y3Rpb24gVExCIE1hdGNoIFJlZ2lzdGVyCisgKgorICovCisjZGVmaW5lIFNQUl9JVExCTVJfVgkgICAweDAwMDAwMDAxICAvKiBWYWxpZCAqLworI2RlZmluZSBTUFJfSVRMQk1SX1BMMQkgICAweDAwMDAwMDAyICAvKiBQYWdlIExldmVsIDEgKGlmIDAgdGhlbiBQTDIpICovCisjZGVmaW5lIFNQUl9JVExCTVJfQ0lECSAgIDB4MDAwMDAwM2MgIC8qIENvbnRleHQgSUQgKi8KKyNkZWZpbmUgU1BSX0lUTEJNUl9MUlUJICAgMHgwMDAwMDBjMCAgLyogTGVhc3QgUmVjZW50bHkgVXNlZCAqLworI2RlZmluZSBTUFJfSVRMQk1SX1ZQTgkgICAweGZmZmZmMDAwICAvKiBWaXJ0dWFsIFBhZ2UgTnVtYmVyICovCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBJbnN0cnVjdGlvbiBUTEIgVHJhbnNsYXRlIFJlZ2lzdGVyCisgKgorICovCisjZGVmaW5lIFNQUl9JVExCVFJfQ0MJICAgMHgwMDAwMDAwMSAgLyogQ2FjaGUgQ29oZXJlbmN5ICovCisjZGVmaW5lIFNQUl9JVExCVFJfQ0kJICAgMHgwMDAwMDAwMiAgLyogQ2FjaGUgSW5oaWJpdCAqLworI2RlZmluZSBTUFJfSVRMQlRSX1dCQwkgICAweDAwMDAwMDA0ICAvKiBXcml0ZS1CYWNrIENhY2hlICovCisjZGVmaW5lIFNQUl9JVExCVFJfV09NCSAgIDB4MDAwMDAwMDggIC8qIFdlYWtseS1PcmRlcmVkIE1lbW9yeSAqLworI2RlZmluZSBTUFJfSVRMQlRSX0EJICAgMHgwMDAwMDAxMCAgLyogQWNjZXNzZWQgKi8KKyNkZWZpbmUgU1BSX0lUTEJUUl9ECSAgIDB4MDAwMDAwMjAgIC8qIERpcnR5ICovCisjZGVmaW5lIFNQUl9JVExCVFJfU1hFCSAgIDB4MDAwMDAwNDAgIC8qIFVzZXIgUmVhZCBFbmFibGUgKi8KKyNkZWZpbmUgU1BSX0lUTEJUUl9VWEUJICAgMHgwMDAwMDA4MCAgLyogVXNlciBXcml0ZSBFbmFibGUgKi8KKyNkZWZpbmUgU1BSX0lUTEJUUl9QUE4JICAgMHhmZmZmZjAwMCAgLyogUGh5c2ljYWwgUGFnZSBOdW1iZXIgKi8KKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgRGF0YSBDYWNoZSBDb250cm9sIHJlZ2lzdGVyCisgKgorICovCisjZGVmaW5lIFNQUl9EQ0NSX0VXCSAgIDB4MDAwMDAwZmYgIC8qIEVuYWJsZSB3YXlzICovCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIEluc24gQ2FjaGUgQ29udHJvbCByZWdpc3RlcgorICoKKyAqLworI2RlZmluZSBTUFJfSUNDUl9FVwkgICAweDAwMDAwMGZmICAvKiBFbmFibGUgd2F5cyAqLworCisvKgorICogQml0IGRlZmluaXRpb25zIGZvciBEYXRhIENhY2hlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAqCisgKi8KKworI2RlZmluZSBTUFJfRENDRkdSX05DVwkJMHgwMDAwMDAwNworI2RlZmluZSBTUFJfRENDRkdSX05DUwkJMHgwMDAwMDA3OAorI2RlZmluZSBTUFJfRENDRkdSX0NCUwkJMHgwMDAwMDA4MAorI2RlZmluZSBTUFJfRENDRkdSX0NXUwkJMHgwMDAwMDEwMAorI2RlZmluZSBTUFJfRENDRkdSX0NDUkkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgU1BSX0RDQ0ZHUl9DQklSSQkweDAwMDAwNDAwCisjZGVmaW5lIFNQUl9EQ0NGR1JfQ0JQUkkJMHgwMDAwMDgwMAorI2RlZmluZSBTUFJfRENDRkdSX0NCTFJJCTB4MDAwMDEwMDAKKyNkZWZpbmUgU1BSX0RDQ0ZHUl9DQkZSSQkweDAwMDAyMDAwCisjZGVmaW5lIFNQUl9EQ0NGR1JfQ0JXQlJJCTB4MDAwMDQwMDAKKworI2RlZmluZSBTUFJfRENDRkdSX05DV19PRkYgICAgICAwCisjZGVmaW5lIFNQUl9EQ0NGR1JfTkNTX09GRiAgICAgIDMKKyNkZWZpbmUgU1BSX0RDQ0ZHUl9DQlNfT0ZGCTcKKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgSW5zdHJ1Y3Rpb24gQ2FjaGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICoKKyAqLworI2RlZmluZSBTUFJfSUNDRkdSX05DVwkJMHgwMDAwMDAwNworI2RlZmluZSBTUFJfSUNDRkdSX05DUwkJMHgwMDAwMDA3OAorI2RlZmluZSBTUFJfSUNDRkdSX0NCUwkJMHgwMDAwMDA4MAorI2RlZmluZSBTUFJfSUNDRkdSX0NDUkkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgU1BSX0lDQ0ZHUl9DQklSSQkweDAwMDAwNDAwCisjZGVmaW5lIFNQUl9JQ0NGR1JfQ0JQUkkJMHgwMDAwMDgwMAorI2RlZmluZSBTUFJfSUNDRkdSX0NCTFJJCTB4MDAwMDEwMDAKKworI2RlZmluZSBTUFJfSUNDRkdSX05DV19PRkYgICAgICAwCisjZGVmaW5lIFNQUl9JQ0NGR1JfTkNTX09GRiAgICAgIDMKKyNkZWZpbmUgU1BSX0lDQ0ZHUl9DQlNfT0ZGCTcKKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgRGF0YSBNTVUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICoKKyAqLworCisjZGVmaW5lIFNQUl9ETU1VQ0ZHUl9OVFcJMHgwMDAwMDAwMworI2RlZmluZSBTUFJfRE1NVUNGR1JfTlRTCTB4MDAwMDAwMUMKKyNkZWZpbmUgU1BSX0RNTVVDRkdSX05BRQkweDAwMDAwMEUwCisjZGVmaW5lIFNQUl9ETU1VQ0ZHUl9DUkkJMHgwMDAwMDEwMAorI2RlZmluZSBTUFJfRE1NVUNGR1JfUFJJICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFNQUl9ETU1VQ0ZHUl9URUlSSQkweDAwMDAwNDAwCisjZGVmaW5lIFNQUl9ETU1VQ0ZHUl9IVFIJMHgwMDAwMDgwMAorCisjZGVmaW5lIFNQUl9ETU1VQ0ZHUl9OVFdfT0ZGCTAKKyNkZWZpbmUgU1BSX0RNTVVDRkdSX05UU19PRkYJMgorCisvKgorICogQml0IGRlZmluaXRpb25zIGZvciBJbnN0cnVjdGlvbiBNTVUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICoKKyAqLworCisjZGVmaW5lIFNQUl9JTU1VQ0ZHUl9OVFcJMHgwMDAwMDAwMworI2RlZmluZSBTUFJfSU1NVUNGR1JfTlRTCTB4MDAwMDAwMUMKKyNkZWZpbmUgU1BSX0lNTVVDRkdSX05BRQkweDAwMDAwMEUwCisjZGVmaW5lIFNQUl9JTU1VQ0ZHUl9DUkkJMHgwMDAwMDEwMAorI2RlZmluZSBTUFJfSU1NVUNGR1JfUFJJCTB4MDAwMDAyMDAKKyNkZWZpbmUgU1BSX0lNTVVDRkdSX1RFSVJJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1BSX0lNTVVDRkdSX0hUUgkweDAwMDAwODAwCisKKyNkZWZpbmUgU1BSX0lNTVVDRkdSX05UV19PRkYJMAorI2RlZmluZSBTUFJfSU1NVUNGR1JfTlRTX09GRgkyCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIERlYnVnIENvbnRyb2wgcmVnaXN0ZXJzCisgKgorICovCisjZGVmaW5lIFNQUl9EQ1JfRFAJMHgwMDAwMDAwMSAgLyogRFZSL0RDUiBwcmVzZW50ICovCisjZGVmaW5lIFNQUl9EQ1JfQ0MJMHgwMDAwMDAwZSAgLyogQ29tcGFyZSBjb25kaXRpb24gKi8KKyNkZWZpbmUgU1BSX0RDUl9TQwkweDAwMDAwMDEwICAvKiBTaWduZWQgY29tcGFyZSAqLworI2RlZmluZSBTUFJfRENSX0NUCTB4MDAwMDAwZTAgIC8qIENvbXBhcmUgdG8gKi8KKworLyogQml0IHJlc3VsdHMgd2l0aCBTUFJfRENSX0NDIG1hc2sgKi8KKyNkZWZpbmUgU1BSX0RDUl9DQ19NQVNLRUQgMHgwMDAwMDAwMAorI2RlZmluZSBTUFJfRENSX0NDX0VRVUFMICAweDAwMDAwMDAyCisjZGVmaW5lIFNQUl9EQ1JfQ0NfTEVTUyAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU1BSX0RDUl9DQ19MRVNTRSAgMHgwMDAwMDAwNgorI2RlZmluZSBTUFJfRENSX0NDX0dSRUFUICAweDAwMDAwMDA4CisjZGVmaW5lIFNQUl9EQ1JfQ0NfR1JFQVRFIDB4MDAwMDAwMGEKKyNkZWZpbmUgU1BSX0RDUl9DQ19ORVFVQUwgMHgwMDAwMDAwYworCisvKiBCaXQgcmVzdWx0cyB3aXRoIFNQUl9EQ1JfQ1QgbWFzayAqLworI2RlZmluZSBTUFJfRENSX0NUX0RJU0FCTEVEIDB4MDAwMDAwMDAKKyNkZWZpbmUgU1BSX0RDUl9DVF9JRkVBICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFNQUl9EQ1JfQ1RfTEVBICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTUFJfRENSX0NUX1NFQSAgICAgIDB4MDAwMDAwNjAKKyNkZWZpbmUgU1BSX0RDUl9DVF9MRCAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFNQUl9EQ1JfQ1RfU0QgICAgICAgMHgwMDAwMDBhMAorI2RlZmluZSBTUFJfRENSX0NUX0xTRUEgICAgIDB4MDAwMDAwYzAKKyNkZWZpbmUgU1BSX0RDUl9DVF9MU0QJICAgIDB4MDAwMDAwZTAKKy8qIFNQUl9EQ1JfQ1RfTFNEIGRvZXNuJ3Qgc2VlbSB0byBiZSBpbXBsZW1lbnRlZCBhbnl3aGVyZSBpbiBvcjFrc2ltLiAyMDA0LTEtMzAgSFAgKi8KKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgRGVidWcgTW9kZSAxIHJlZ2lzdGVyCisgKgorICovCisjZGVmaW5lIFNQUl9ETVIxX0NXICAgICAgIDB4MDAwZmZmZmYgIC8qIENoYWluIHJlZ2lzdGVyIHBhaXIgZGF0YSAqLworI2RlZmluZSBTUFJfRE1SMV9DVzBfQU5EICAweDAwMDAwMDAxCisjZGVmaW5lIFNQUl9ETVIxX0NXMF9PUiAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU1BSX0RNUjFfQ1cwICAgICAgKFNQUl9ETVIxX0NXMF9BTkQgfCBTUFJfRE1SMV9DVzBfT1IpCisjZGVmaW5lIFNQUl9ETVIxX0NXMV9BTkQgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU1BSX0RNUjFfQ1cxX09SICAgMHgwMDAwMDAwOAorI2RlZmluZSBTUFJfRE1SMV9DVzEgICAgICAoU1BSX0RNUjFfQ1cxX0FORCB8IFNQUl9ETVIxX0NXMV9PUikKKyNkZWZpbmUgU1BSX0RNUjFfQ1cyX0FORCAgMHgwMDAwMDAxMAorI2RlZmluZSBTUFJfRE1SMV9DVzJfT1IgICAweDAwMDAwMDIwCisjZGVmaW5lIFNQUl9ETVIxX0NXMiAgICAgIChTUFJfRE1SMV9DVzJfQU5EIHwgU1BSX0RNUjFfQ1cyX09SKQorI2RlZmluZSBTUFJfRE1SMV9DVzNfQU5EICAweDAwMDAwMDQwCisjZGVmaW5lIFNQUl9ETVIxX0NXM19PUiAgIDB4MDAwMDAwODAKKyNkZWZpbmUgU1BSX0RNUjFfQ1czICAgICAgKFNQUl9ETVIxX0NXM19BTkQgfCBTUFJfRE1SMV9DVzNfT1IpCisjZGVmaW5lIFNQUl9ETVIxX0NXNF9BTkQgIDB4MDAwMDAxMDAKKyNkZWZpbmUgU1BSX0RNUjFfQ1c0X09SICAgMHgwMDAwMDIwMAorI2RlZmluZSBTUFJfRE1SMV9DVzQgICAgICAoU1BSX0RNUjFfQ1c0X0FORCB8IFNQUl9ETVIxX0NXNF9PUikKKyNkZWZpbmUgU1BSX0RNUjFfQ1c1X0FORCAgMHgwMDAwMDQwMAorI2RlZmluZSBTUFJfRE1SMV9DVzVfT1IgICAweDAwMDAwODAwCisjZGVmaW5lIFNQUl9ETVIxX0NXNSAgICAgIChTUFJfRE1SMV9DVzVfQU5EIHwgU1BSX0RNUjFfQ1c1X09SKQorI2RlZmluZSBTUFJfRE1SMV9DVzZfQU5EICAweDAwMDAxMDAwCisjZGVmaW5lIFNQUl9ETVIxX0NXNl9PUiAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgU1BSX0RNUjFfQ1c2ICAgICAgKFNQUl9ETVIxX0NXNl9BTkQgfCBTUFJfRE1SMV9DVzZfT1IpCisjZGVmaW5lIFNQUl9ETVIxX0NXN19BTkQgIDB4MDAwMDQwMDAKKyNkZWZpbmUgU1BSX0RNUjFfQ1c3X09SICAgMHgwMDAwODAwMAorI2RlZmluZSBTUFJfRE1SMV9DVzcgICAgICAoU1BSX0RNUjFfQ1c3X0FORCB8IFNQUl9ETVIxX0NXN19PUikKKyNkZWZpbmUgU1BSX0RNUjFfQ1c4X0FORCAgMHgwMDAxMDAwMAorI2RlZmluZSBTUFJfRE1SMV9DVzhfT1IgICAweDAwMDIwMDAwCisjZGVmaW5lIFNQUl9ETVIxX0NXOCAgICAgIChTUFJfRE1SMV9DVzhfQU5EIHwgU1BSX0RNUjFfQ1c4X09SKQorI2RlZmluZSBTUFJfRE1SMV9DVzlfQU5EICAweDAwMDQwMDAwCisjZGVmaW5lIFNQUl9ETVIxX0NXOV9PUiAgIDB4MDAwODAwMDAKKyNkZWZpbmUgU1BSX0RNUjFfQ1c5ICAgICAgKFNQUl9ETVIxX0NXOV9BTkQgfCBTUFJfRE1SMV9DVzlfT1IpCisjZGVmaW5lIFNQUl9ETVIxX1JFUzEgICAgICAweDAwMzAwMDAwICAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBTUFJfRE1SMV9TVAkgIDB4MDA0MDAwMDAgIC8qIFNpbmdsZS1zdGVwIHRyYWNlKi8KKyNkZWZpbmUgU1BSX0RNUjFfQlQJICAweDAwODAwMDAwICAvKiBCcmFuY2ggdHJhY2UgKi8KKyNkZWZpbmUgU1BSX0RNUjFfUkVTMgkgIDB4ZmYwMDAwMDAgIC8qIFJlc2VydmVkICovCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIERlYnVnIE1vZGUgMiByZWdpc3Rlci4gQVdUQyBhbmQgV0dCIGNvcnJlY3RlZCBieSBKUEIKKyAqCisgKi8KKyNkZWZpbmUgU1BSX0RNUjJfV0NFMAkgICAweDAwMDAwMDAxICAvKiBXYXRjaHBvaW50IGNvdW50ZXIgMCBlbmFibGUgKi8KKyNkZWZpbmUgU1BSX0RNUjJfV0NFMQkgICAweDAwMDAwMDAyICAvKiBXYXRjaHBvaW50IGNvdW50ZXIgMCBlbmFibGUgKi8KKyNkZWZpbmUgU1BSX0RNUjJfQVdUQwkgICAweDAwMDAwZmZjICAvKiBBc3NpZ24gd2F0Y2hwb2ludHMgdG8gY291bnRlcnMgKi8KKyNkZWZpbmUgU1BSX0RNUjJfQVdUQ19PRkYgICAgICAgICAgIDIgIC8qIEJpdCBvZmZzZXQgdG8gQVdUQyBmaWVsZCAqLworI2RlZmluZSBTUFJfRE1SMl9XR0IJICAgMHgwMDNmZjAwMCAgLyogV2F0Y2hwb2ludHMgZ2VuZXJhdGluZyBicmVha3BvaW50ICovCisjZGVmaW5lIFNQUl9ETVIyX1dHQl9PRkYgICAgICAgICAgIDEyICAvKiBCaXQgb2Zmc2V0IHRvIFdHQiBmaWVsZCAqLworI2RlZmluZSBTUFJfRE1SMl9XQlMJICAgMHhmZmMwMDAwMCAgLyogSlBCOiBXYXRjaHBvaW50IHN0YXR1cyAqLworI2RlZmluZSBTUFJfRE1SMl9XQlNfT0ZGICAgICAgICAgICAyMiAgLyogQml0IG9mZnNldCB0byBXQlMgZmllbGQgKi8KKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgRGVidWcgd2F0Y2hwb2ludCBjb3VudGVyIHJlZ2lzdGVycworICoKKyAqLworI2RlZmluZSBTUFJfRFdDUl9DT1VOVAkgICAgMHgwMDAwZmZmZiAgLyogQ291bnQgKi8KKyNkZWZpbmUgU1BSX0RXQ1JfTUFUQ0gJICAgIDB4ZmZmZjAwMDAgIC8qIE1hdGNoICovCisjZGVmaW5lIFNQUl9EV0NSX01BVENIX09GRiAgICAgICAgICAxNiAgLyogTWF0Y2ggYml0IG9mZnNldCAqLworCisvKgorICogQml0IGRlZmluaXRpb25zIGZvciBEZWJ1ZyBzdG9wIHJlZ2lzdGVyCisgKgorICovCisjZGVmaW5lIFNQUl9EU1JfUlNURQkweDAwMDAwMDAxICAvKiBSZXNldCBleGNlcHRpb24gKi8KKyNkZWZpbmUgU1BSX0RTUl9CVVNFRQkweDAwMDAwMDAyICAvKiBCdXMgZXJyb3IgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EU1JfRFBGRQkweDAwMDAwMDA0ICAvKiBEYXRhIFBhZ2UgRmF1bHQgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EU1JfSVBGRQkweDAwMDAwMDA4ICAvKiBJbnNuIFBhZ2UgRmF1bHQgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EU1JfVFRFCTB4MDAwMDAwMTAgIC8qIFRpY2sgVGltZXIgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EU1JfQUUJMHgwMDAwMDAyMCAgLyogQWxpZ25tZW50IGV4Y2VwdGlvbiAqLworI2RlZmluZSBTUFJfRFNSX0lJRQkweDAwMDAwMDQwICAvKiBJbGxlZ2FsIEluc3RydWN0aW9uIGV4Y2VwdGlvbiAqLworI2RlZmluZSBTUFJfRFNSX0lFCTB4MDAwMDAwODAgIC8qIEludGVycnVwdCBleGNlcHRpb24gKi8KKyNkZWZpbmUgU1BSX0RTUl9ETUUJMHgwMDAwMDEwMCAgLyogRFRMQiBtaXNzIGV4Y2VwdGlvbiAqLworI2RlZmluZSBTUFJfRFNSX0lNRQkweDAwMDAwMjAwICAvKiBJVExCIG1pc3MgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EU1JfUkUJMHgwMDAwMDQwMCAgLyogUmFuZ2UgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EU1JfU0NFCTB4MDAwMDA4MDAgIC8qIFN5c3RlbSBjYWxsIGV4Y2VwdGlvbiAqLworI2RlZmluZSBTUFJfRFNSX0ZQRSAgICAgMHgwMDAwMTAwMCAgLyogRmxvYXRpbmcgUG9pbnQgRXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EU1JfVEUJMHgwMDAwMjAwMCAgLyogVHJhcCBleGNlcHRpb24gKi8KKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgRGVidWcgcmVhc29uIHJlZ2lzdGVyCisgKgorICovCisjZGVmaW5lIFNQUl9EUlJfUlNURQkweDAwMDAwMDAxICAvKiBSZXNldCBleGNlcHRpb24gKi8KKyNkZWZpbmUgU1BSX0RSUl9CVVNFRQkweDAwMDAwMDAyICAvKiBCdXMgZXJyb3IgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EUlJfRFBGRQkweDAwMDAwMDA0ICAvKiBEYXRhIFBhZ2UgRmF1bHQgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EUlJfSVBGRQkweDAwMDAwMDA4ICAvKiBJbnNuIFBhZ2UgRmF1bHQgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EUlJfVFRFCTB4MDAwMDAwMTAgIC8qIFRpY2sgVGltZXIgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EUlJfQUUJMHgwMDAwMDAyMCAgLyogQWxpZ25tZW50IGV4Y2VwdGlvbiAqLworI2RlZmluZSBTUFJfRFJSX0lJRQkweDAwMDAwMDQwICAvKiBJbGxlZ2FsIEluc3RydWN0aW9uIGV4Y2VwdGlvbiAqLworI2RlZmluZSBTUFJfRFJSX0lFCTB4MDAwMDAwODAgIC8qIEludGVycnVwdCBleGNlcHRpb24gKi8KKyNkZWZpbmUgU1BSX0RSUl9ETUUJMHgwMDAwMDEwMCAgLyogRFRMQiBtaXNzIGV4Y2VwdGlvbiAqLworI2RlZmluZSBTUFJfRFJSX0lNRQkweDAwMDAwMjAwICAvKiBJVExCIG1pc3MgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EUlJfUkUJMHgwMDAwMDQwMCAgLyogUmFuZ2UgZXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EUlJfU0NFCTB4MDAwMDA4MDAgIC8qIFN5c3RlbSBjYWxsIGV4Y2VwdGlvbiAqLworI2RlZmluZSBTUFJfRFJSX0ZQRSAgICAgMHgwMDAwMTAwMCAgLyogRmxvYXRpbmcgUG9pbnQgRXhjZXB0aW9uICovCisjZGVmaW5lIFNQUl9EUlJfVEUJMHgwMDAwMjAwMCAgLyogVHJhcCBleGNlcHRpb24gKi8KKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgUGVyZm9ybWFuY2UgY291bnRlcnMgbW9kZSByZWdpc3RlcnMKKyAqCisgKi8KKyNkZWZpbmUgU1BSX1BDTVJfQ1AJMHgwMDAwMDAwMSAgLyogQ291bnRlciBwcmVzZW50ICovCisjZGVmaW5lIFNQUl9QQ01SX1VNUkEJMHgwMDAwMDAwMiAgLyogVXNlciBtb2RlIHJlYWQgYWNjZXNzICovCisjZGVmaW5lIFNQUl9QQ01SX0NJU00JMHgwMDAwMDAwNCAgLyogQ291bnQgaW4gc3VwZXJ2aXNvciBtb2RlICovCisjZGVmaW5lIFNQUl9QQ01SX0NJVU0JMHgwMDAwMDAwOCAgLyogQ291bnQgaW4gdXNlciBtb2RlICovCisjZGVmaW5lIFNQUl9QQ01SX0xBCTB4MDAwMDAwMTAgIC8qIExvYWQgYWNjZXNzIGV2ZW50ICovCisjZGVmaW5lIFNQUl9QQ01SX1NBCTB4MDAwMDAwMjAgIC8qIFN0b3JlIGFjY2VzcyBldmVudCAqLworI2RlZmluZSBTUFJfUENNUl9JRgkweDAwMDAwMDQwICAvKiBJbnN0cnVjdGlvbiBmZXRjaCBldmVudCovCisjZGVmaW5lIFNQUl9QQ01SX0RDTQkweDAwMDAwMDgwICAvKiBEYXRhIGNhY2hlIG1pc3MgZXZlbnQgKi8KKyNkZWZpbmUgU1BSX1BDTVJfSUNNCTB4MDAwMDAxMDAgIC8qIEluc24gY2FjaGUgbWlzcyBldmVudCAqLworI2RlZmluZSBTUFJfUENNUl9JRlMJMHgwMDAwMDIwMCAgLyogSW5zbiBmZXRjaCBzdGFsbCBldmVudCAqLworI2RlZmluZSBTUFJfUENNUl9MU1VTCTB4MDAwMDA0MDAgIC8qIExTVSBzdGFsbCBldmVudCAqLworI2RlZmluZSBTUFJfUENNUl9CUwkweDAwMDAwODAwICAvKiBCcmFuY2ggc3RhbGwgZXZlbnQgKi8KKyNkZWZpbmUgU1BSX1BDTVJfRFRMQk0JMHgwMDAwMTAwMCAgLyogRFRMQiBtaXNzIGV2ZW50ICovCisjZGVmaW5lIFNQUl9QQ01SX0lUTEJNCTB4MDAwMDIwMDAgIC8qIElUTEIgbWlzcyBldmVudCAqLworI2RlZmluZSBTUFJfUENNUl9ERFMJMHgwMDAwNDAwMCAgLyogRGF0YSBkZXBlbmRlbmN5IHN0YWxsIGV2ZW50ICovCisjZGVmaW5lIFNQUl9QQ01SX1dQRQkweDAzZmY4MDAwICAvKiBXYXRjaHBvaW50IGV2ZW50cyAqLworCisvKgorICogQml0IGRlZmluaXRpb25zIGZvciB0aGUgUG93ZXIgbWFuYWdlbWVudCByZWdpc3RlcgorICoKKyAqLworI2RlZmluZSBTUFJfUE1SX1NERgkweDAwMDAwMDBmICAvKiBTbG93IGRvd24gZmFjdG9yICovCisjZGVmaW5lIFNQUl9QTVJfRE1FCTB4MDAwMDAwMTAgIC8qIERvemUgbW9kZSBlbmFibGUgKi8KKyNkZWZpbmUgU1BSX1BNUl9TTUUJMHgwMDAwMDAyMCAgLyogU2xlZXAgbW9kZSBlbmFibGUgKi8KKyNkZWZpbmUgU1BSX1BNUl9EQ0dFCTB4MDAwMDAwNDAgIC8qIER5bmFtaWMgY2xvY2sgZ2F0aW5nIGVuYWJsZSAqLworI2RlZmluZSBTUFJfUE1SX1NVTUUJMHgwMDAwMDA4MCAgLyogU3VzcGVuZCBtb2RlIGVuYWJsZSAqLworCisvKgorICogQml0IGRlZmluaXRpb25zIGZvciBQSUNNUgorICoKKyAqLworI2RlZmluZSBTUFJfUElDTVJfSVVNCTB4ZmZmZmZmZmMgIC8qIEludGVycnVwdCB1bm1hc2sgKi8KKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgUElDUFIKKyAqCisgKi8KKyNkZWZpbmUgU1BSX1BJQ1BSX0lQUklPCTB4ZmZmZmZmZmMgIC8qIEludGVycnVwdCBwcmlvcml0eSAqLworCisvKgorICogQml0IGRlZmluaXRpb25zIGZvciBQSUNTUgorICoKKyAqLworI2RlZmluZSBTUFJfUElDU1JfSVMJMHhmZmZmZmZmZiAgLyogSW50ZXJydXB0IHN0YXR1cyAqLworCisvKgorICogQml0IGRlZmluaXRpb25zIGZvciBUaWNrIFRpbWVyIENvbnRyb2wgUmVnaXN0ZXIKKyAqCisgKi8KKworI2RlZmluZSBTUFJfVFRDUl9DTlQJMHhmZmZmZmZmZiAgLyogQ291bnQsIHRpbWUgcGVyaW9kICovCisjZGVmaW5lIFNQUl9UVE1SX1RQCTB4MGZmZmZmZmYgIC8qIFRpbWUgcGVyaW9kICovCisjZGVmaW5lIFNQUl9UVE1SX0lQCTB4MTAwMDAwMDAgIC8qIEludGVycnVwdCBQZW5kaW5nICovCisjZGVmaW5lIFNQUl9UVE1SX0lFCTB4MjAwMDAwMDAgIC8qIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgU1BSX1RUTVJfREkJMHgwMDAwMDAwMCAgLyogRGlzYWJsZWQgKi8KKyNkZWZpbmUgU1BSX1RUTVJfUlQJMHg0MDAwMDAwMCAgLyogUmVzdGFydCB0aWNrICovCisjZGVmaW5lIFNQUl9UVE1SX1NSICAgICAweDgwMDAwMDAwICAvKiBTaW5nbGUgcnVuICovCisjZGVmaW5lIFNQUl9UVE1SX0NSICAgICAweGMwMDAwMDAwICAvKiBDb250aW51b3VzIHJ1biAqLworI2RlZmluZSBTUFJfVFRNUl9NICAgICAgMHhjMDAwMDAwMCAgLyogVGljayBtb2RlICovCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBGUCBDb250cm9sIFN0YXR1cyBSZWdpc3RlcgorICoKKyAqLworI2RlZmluZSBTUFJfRlBDU1JfRlBFRSAgMHgwMDAwMDAwMSAgLyogRmxvYXRpbmcgUG9pbnQgRXhjZXB0aW9uIEVuYWJsZSAqLworI2RlZmluZSBTUFJfRlBDU1JfUk0gICAgMHgwMDAwMDAwNiAgLyogUm91bmRpbmcgTW9kZSAqLworI2RlZmluZSBTUFJfRlBDU1JfT1ZGICAgMHgwMDAwMDAwOCAgLyogT3ZlcmZsb3cgRmxhZyAqLworI2RlZmluZSBTUFJfRlBDU1JfVU5GICAgMHgwMDAwMDAxMCAgLyogVW5kZXJmbG93IEZsYWcgKi8KKyNkZWZpbmUgU1BSX0ZQQ1NSX1NORiAgIDB4MDAwMDAwMjAgIC8qIFNOQU4gRmxhZyAqLworI2RlZmluZSBTUFJfRlBDU1JfUU5GICAgMHgwMDAwMDA0MCAgLyogUU5BTiBGbGFnICovCisjZGVmaW5lIFNQUl9GUENTUl9aRiAgICAweDAwMDAwMDgwICAvKiBaZXJvIEZsYWcgKi8KKyNkZWZpbmUgU1BSX0ZQQ1NSX0lYRiAgIDB4MDAwMDAxMDAgIC8qIEluZXhhY3QgRmxhZyAqLworI2RlZmluZSBTUFJfRlBDU1JfSVZGICAgMHgwMDAwMDIwMCAgLyogSW52YWxpZCBGbGFnICovCisjZGVmaW5lIFNQUl9GUENTUl9JTkYgICAweDAwMDAwNDAwICAvKiBJbmZpbml0eSBGbGFnICovCisjZGVmaW5lIFNQUl9GUENTUl9EWkYgICAweDAwMDAwODAwICAvKiBEaXZpZGUgQnkgWmVybyBGbGFnICovCisjZGVmaW5lIFNQUl9GUENTUl9BTExGIChTUFJfRlBDU1JfT1ZGIHwgU1BSX0ZQQ1NSX1VORiB8IFNQUl9GUENTUl9TTkYgfCBcCisJCQlTUFJfRlBDU1JfUU5GIHwgU1BSX0ZQQ1NSX1pGIHwgU1BSX0ZQQ1NSX0lYRiB8ICBcCisJCQlTUFJfRlBDU1JfSVZGIHwgU1BSX0ZQQ1NSX0lORiB8IFNQUl9GUENTUl9EWkYpCisKKyNkZWZpbmUgRlBDU1JfUk1fUk4gKDA8PDEpCisjZGVmaW5lIEZQQ1NSX1JNX1JaICgxPDwxKQorI2RlZmluZSBGUENTUl9STV9SSVAgKDI8PDEpCisjZGVmaW5lIEZQQ1NSX1JNX1JJTiAoMzw8MSkKKworLyoKKyAqIGwubm9wIGNvbnN0YW50cworICoKKyAqLworI2RlZmluZSBOT1BfTk9QICAgICAgICAgIDB4MDAwMCAgICAgIC8qIE5vcm1hbCBub3AgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgTk9QX0VYSVQgICAgICAgICAweDAwMDEgICAgICAvKiBFbmQgb2Ygc2ltdWxhdGlvbiAqLworI2RlZmluZSBOT1BfUkVQT1JUICAgICAgIDB4MDAwMiAgICAgIC8qIFNpbXBsZSByZXBvcnQgKi8KKy8qI2RlZmluZSBOT1BfUFJJTlRGICAgICAgIDB4MDAwMyAgICAgICBTaW1wcmludGYgaW5zdHJ1Y3Rpb24gKG9ic29sZXRlKSovCisjZGVmaW5lIE5PUF9QVVRDICAgICAgICAgMHgwMDA0ICAgICAgLyogSlBCOiBTaW1wdXRjIGluc3RydWN0aW9uICovCisjZGVmaW5lIE5PUF9DTlRfUkVTRVQgICAgMHgwMDA1CSAgICAgLyogUmVzZXQgc3RhdGlzdGljcyBjb3VudGVycyAqLworI2RlZmluZSBOT1BfR0VUX1RJQ0tTICAgIDB4MDAwNgkgICAgIC8qIEpQQjogR2V0ICMgdGlja3MgcnVubmluZyAqLworI2RlZmluZSBOT1BfR0VUX1BTICAgICAgIDB4MDAwNyAgICAgIC8qIEpQQjogR2V0IHBpY29zZWNzL2N5Y2xlICovCisjZGVmaW5lIE5PUF9SRVBPUlRfRklSU1QgMHgwNDAwICAgICAgLyogUmVwb3J0IHdpdGggbnVtYmVyICovCisjZGVmaW5lIE5PUF9SRVBPUlRfTEFTVCAgMHgwM2ZmICAgICAgLyogUmVwb3J0IHdpdGggbnVtYmVyICovCisKKyNlbmRpZgkvKiBTUFJfREVGU19fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zeXNjYWxsLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAzMzcwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogT3BlblJJU0MgaW1wbGVtZW50YXRpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19TWVNDQUxMX0hfXworI2RlZmluZSBfX0FTTV9PUEVOUklTQ19TWVNDQUxMX0hfXworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworc3RhdGljIGlubGluZSBpbnQKK3N5c2NhbGxfZ2V0X25yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIHJlZ3MtPnN5c2NhbGxubyA/IHJlZ3MtPnN5c2NhbGxubyA6IC0xOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3N5c2NhbGxfcm9sbGJhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZWdzLT5ncHJbMTFdID0gcmVncy0+b3JpZ19ncHIxMTsKK30KKworc3RhdGljIGlubGluZSBsb25nCitzeXNjYWxsX2dldF9lcnJvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiBJU19FUlJfVkFMVUUocmVncy0+Z3ByWzExXSkgPyByZWdzLT5ncHJbMTFdIDogMDsKK30KKworc3RhdGljIGlubGluZSBsb25nCitzeXNjYWxsX2dldF9yZXR1cm5fdmFsdWUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gcmVncy0+Z3ByWzExXTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzeXNjYWxsX3NldF9yZXR1cm5fdmFsdWUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSBpbnQgZXJyb3IsIGxvbmcgdmFsKQoreworCWlmIChlcnJvcikKKwkJcmVncy0+Z3ByWzExXSA9IC1lcnJvcjsKKwllbHNlCisJCXJlZ3MtPmdwclsxMV0gPSB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3lzY2FsbF9nZXRfYXJndW1lbnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCSAgICAgIHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgbG9uZyAqYXJncykKK3sKKwlCVUdfT04oaSArIG4gPiA2KTsKKworCW1lbWNweShhcmdzLCAmcmVncy0+Z3ByWzMgKyBpXSwgbiAqIHNpemVvZihhcmdzWzBdKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3lzY2FsbF9zZXRfYXJndW1lbnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCSAgICAgIHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgbiwgY29uc3QgdW5zaWduZWQgbG9uZyAqYXJncykKK3sKKwlCVUdfT04oaSArIG4gPiA2KTsKKworCW1lbWNweSgmcmVncy0+Z3ByWzMgKyBpXSwgYXJncywgbiAqIHNpemVvZihhcmdzWzBdKSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zeXNjYWxscy5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zeXNjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YTk3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3N5c2NhbGxzLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogT3BlblJJU0MgaW1wbGVtZW50YXRpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19TWVNDQUxMU19ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX1NZU0NBTExTX0gKKworYXNtbGlua2FnZSBsb25nIHN5c19vcjFrX2F0b21pYyh1bnNpZ25lZCBsb25nIHR5cGUsIHVuc2lnbmVkIGxvbmcgKnYxLAorCQkJCXVuc2lnbmVkIGxvbmcgKnYyKTsKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N5c2NhbGxzLmg+CisKKyNlbmRpZiAvKiBfX0FTTV9PUEVOUklTQ19TWVNDQUxMU19IICovCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3N5c3RlbS5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjY1ODg4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS9zeXN0ZW0uaApAQCAtMCwwICsxLDM1IEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX1NZU1RFTV9ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX1NZU1RFTV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaW5jbHVkZSA8YXNtL3Nwci5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N5c3RlbS5oPgorCisvKiBXZSBwcm9iYWJseSBuZWVkIHRoaXMgZGVmaW5pdGlvbiwgYnV0IHRoZSBnZW5lcmljIHN5c3RlbS5oIHByb3ZpZGVzIGl0CisgKiBhbmQgaXQncyBub3QgdXNlZCBvbiBvdXIgYXJjaCBhbnl3YXkuLi4KKyAqLworLyojZGVmaW5lIG5vcCgpIF9fYXNtX18gX192b2xhdGlsZV9fICgibC5ub3AiOjopKi8KKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0FTTV9PUEVOUklTQ19TWVNURU1fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YThiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE9wZW5SSVNDIGltcGxlbWVudGF0aW9uOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKiBldCBhbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0FTTV9USFJFQURfSU5GT19ICisjZGVmaW5lIF9BU01fVEhSRUFEX0lORk9fSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNlbmRpZgorCisKKy8qIFRIUkVBRF9TSVpFIGlzIHRoZSBzaXplIG9mIHRoZSB0YXNrX3N0cnVjdC9rZXJuZWxfc3RhY2sgY29tYm8uCisgKiBub3JtYWxseSwgdGhlIHN0YWNrIGlzIGZvdW5kIGJ5IGRvaW5nIHNvbWV0aGluZyBsaWtlIHAgKyBUSFJFQURfU0laRQorICogaW4gb3IzMiwgYSBwYWdlIGlzIDgxOTIgYnl0ZXMsIHdoaWNoIHNlZW1zIGxpa2UgYSBzYW5lIHNpemUKKyAqLworCisjZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSIDAKKyNkZWZpbmUgVEhSRUFEX1NJWkUgICAgICAgKFBBR0VfU0laRSA8PCBUSFJFQURfU0laRV9PUkRFUikKKworLyoKKyAqIGxvdyBsZXZlbCB0YXNrIGRhdGEgdGhhdCBlbnRyeS5TIG5lZWRzIGltbWVkaWF0ZSBhY2Nlc3MgdG8KKyAqIC0gdGhpcyBzdHJ1Y3Qgc2hvdWxkIGZpdCBlbnRpcmVseSBpbnNpZGUgb2Ygb25lIGNhY2hlIGxpbmUKKyAqIC0gdGhpcyBzdHJ1Y3Qgc2hhcmVzIHRoZSBzdXBlcnZpc29yIHN0YWNrIHBhZ2VzCisgKiAtIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgY2hhbmdlZCwgdGhlIGFzc2VtYmx5IGNvbnN0YW50cworICogICBtdXN0IGFsc28gYmUgY2hhbmdlZAorICovCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbW1fc2VnbWVudF90OworCitzdHJ1Y3QgdGhyZWFkX2luZm8geworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KKwlfX3UzMgkJCWNwdTsJCS8qIGN1cnJlbnQgQ1BVICovCisJX19zMzIJCQlwcmVlbXB0X2NvdW50OyAvKiAwID0+IHByZWVtcHRhYmxlLCA8MCA9PiBCVUcgKi8KKworCW1tX3NlZ21lbnRfdAkJYWRkcl9saW1pdDsgLyogdGhyZWFkIGFkZHJlc3Mgc3BhY2U6CisJCQkJCSAgICAgICAwLTB4N0ZGRkZGRkYgZm9yIHVzZXItdGhlYWQKKwkJCQkJICAgICAgIDAtMHhGRkZGRkZGRiBmb3Iga2VybmVsLXRocmVhZAorCQkJCQkgICAgICovCisJc3RydWN0IHJlc3RhcnRfYmxvY2sgICAgcmVzdGFydF9ibG9jazsKKwlfX3U4CQkJc3VwZXJ2aXNvcl9zdGFja1swXTsKKworCS8qIHNhdmVkIGNvbnRleHQgZGF0YSAqLworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGtzcDsKK307CisjZW5kaWYKKworLyoKKyAqIG1hY3Jvcy9mdW5jdGlvbnMgZm9yIGdhaW5pbmcgYWNjZXNzIHRvIHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKgorICogcHJlZW1wdF9jb3VudCBuZWVkcyB0byBiZSAxIGluaXRpYWxseSwgdW50aWwgdGhlIHNjaGVkdWxlciBpcyBmdW5jdGlvbmFsLgorICovCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQkJXAorewkJCQkJCQlcCisJLnRhc2sJCT0gJnRzaywJCQkJXAorCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAkJXAorCS5mbGFncwkJPSAwLAkJCQlcCisJLmNwdQkJPSAwLAkJCQlcCisJLnByZWVtcHRfY291bnQJPSAxLAkJCQlcCisJLmFkZHJfbGltaXQJPSBLRVJORUxfRFMsCQkJXAorCS5yZXN0YXJ0X2Jsb2NrICA9IHsJCQkJXAorCQkJICAuZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGwsCVwKKwl9LAkJCQkJCVwKKwkua3NwICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgaW5pdF90aHJlYWRfaW5mbwkoaW5pdF90aHJlYWRfdW5pb24udGhyZWFkX2luZm8pCisKKy8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBDICovCityZWdpc3RlciBzdHJ1Y3QgdGhyZWFkX2luZm8gKmN1cnJlbnRfdGhyZWFkX2luZm9fcmVnIGFzbSgicjEwIik7CisjZGVmaW5lIGN1cnJlbnRfdGhyZWFkX2luZm8oKSAgIChjdXJyZW50X3RocmVhZF9pbmZvX3JlZykKKworI2RlZmluZSBnZXRfdGhyZWFkX2luZm8odGkpIGdldF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQorI2RlZmluZSBwdXRfdGhyZWFkX2luZm8odGkpIHB1dF90YXNrX3N0cnVjdCgodGkpLT50YXNrKQorCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisvKgorICogdGhyZWFkIGluZm9ybWF0aW9uIGZsYWdzCisgKiAgIHRoZXNlIGFyZSBwcm9jZXNzIHN0YXRlIGZsYWdzIHRoYXQgdmFyaW91cyBhc3NlbWJseSBmaWxlcyBtYXkgbmVlZCB0bworICogICBhY2Nlc3MKKyAqICAgLSBwZW5kaW5nIHdvcmstdG8tYmUtZG9uZSBmbGFncyBhcmUgaW4gTFNXCisgKiAgIC0gb3RoZXIgZmxhZ3MgaW4gTVNXCisgKi8KKyNkZWZpbmUgVElGX1NZU0NBTExfVFJBQ0UJMAkvKiBzeXNjYWxsIHRyYWNlIGFjdGl2ZSAqLworI2RlZmluZSBUSUZfTk9USUZZX1JFU1VNRQkxCS8qIHJlc3VtcHRpb24gbm90aWZpY2F0aW9uIHJlcXVlc3RlZCAqLworI2RlZmluZSBUSUZfU0lHUEVORElORwkJMgkvKiBzaWduYWwgcGVuZGluZyAqLworI2RlZmluZSBUSUZfTkVFRF9SRVNDSEVECTMJLyogcmVzY2hlZHVsaW5nIG5lY2Vzc2FyeSAqLworI2RlZmluZSBUSUZfU0lOR0xFU1RFUAkJNAkvKiByZXN0b3JlIHNpbmdsZXN0ZXAgb24gcmV0dXJuIHRvIHVzZXIKKwkJCQkJICogbW9kZQorCQkJCQkgKi8KKyNkZWZpbmUgVElGX1NZU0NBTExfVFJBQ0VQT0lOVCAgOCAgICAgICAvKiBmb3IgZnRyYWNlIHN5c2NhbGwgaW5zdHJ1bWVudGF0aW9uICovCisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sgICAgIDkKKyNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHCTE2CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZwkJCQkJCSAqIFRJRl9ORUVEX1JFU0NIRUQKKwkJCQkJICovCisjZGVmaW5lIFRJRl9NRU1ESUUgICAgICAgICAgICAgIDE3CisKKyNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKKyNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxPDxUSUZfTk9USUZZX1JFU1VNRSkKKyNkZWZpbmUgX1RJRl9TSUdQRU5ESU5HCQkoMTw8VElGX1NJR1BFTkRJTkcpCisjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxPDxUSUZfTkVFRF9SRVNDSEVEKQorI2RlZmluZSBfVElGX1NJTkdMRVNURVAJCSgxPDxUSUZfU0lOR0xFU1RFUCkKKyNkZWZpbmUgX1RJRl9SRVNUT1JFX1NJR01BU0sgICAgICgxPDxUSUZfUkVTVE9SRV9TSUdNQVNLKQorI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCisKKworLyogV29yayB0byBkbyB3aGVuIHJldHVybmluZyBmcm9tIGludGVycnVwdC9leGNlcHRpb24gKi8KKy8qIEZvciBPcGVuUklTQywgdGhpcyBpcyBhbnl0aGluZyBpbiB0aGUgTFNXIG90aGVyIHRoYW4gc3lzY2FsbCB0cmFjZSAqLworI2RlZmluZSBfVElGX1dPUktfTUFTSyAoMHhmZiAmIH4oX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0lOR0xFU1RFUCkpCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX1RIUkVBRF9JTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdGltZXguaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdGltZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM1Y2FkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS90aW1leC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE9wZW5SSVNDIGltcGxlbWVudGF0aW9uOgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19USU1FWF9ICisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX1RJTUVYX0gKKworI2RlZmluZSBnZXRfY3ljbGVzIGdldF9jeWNsZXMKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RpbWV4Lmg+CisjaW5jbHVkZSA8YXNtL3Nwci5oPgorI2luY2x1ZGUgPGFzbS9zcHJfZGVmcy5oPgorCitzdGF0aWMgaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXModm9pZCkKK3sKKwlyZXR1cm4gbWZzcHIoU1BSX1RUQ1IpOworfQorCisvKiBUaGlzIGlzbid0IHJlYWxseSB1c2VkIGFueSBtb3JlICovCisjZGVmaW5lIENMT0NLX1RJQ0tfUkFURSAxMDAwCisKKyNkZWZpbmUgQVJDSF9IQVNfUkVBRF9DVVJSRU5UX1RJTUVSCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS90bGIuaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdGxiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0Mzc2YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdGxiLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogT3BlblJJU0MgaW1wbGVtZW50YXRpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9PUEVOUklTQ19UTEJfSF9fCisjZGVmaW5lIF9fQVNNX09QRU5SSVNDX1RMQl9IX18KKworLyoKKyAqIG9yMzIgZG9lc24ndCBuZWVkIGFueSBzcGVjaWFsIHBlci1wdGUgb3IKKyAqIHBlci12bWEgaGFuZGxpbmcuLgorICovCisjZGVmaW5lIHRsYl9zdGFydF92bWEodGxiLCB2bWEpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdGxiX2VuZF92bWEodGxiLCB2bWEpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX190bGJfcmVtb3ZlX3RsYl9lbnRyeSh0bGIsIHB0ZXAsIGFkZHJlc3MpIGRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSB0bGJfZmx1c2godGxiKSBmbHVzaF90bGJfbW0oKHRsYiktPm1tKQorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy90bGIuaD4KKworI2VuZGlmIC8qIF9fQVNNX09QRU5SSVNDX1RMQl9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdGxiZmx1c2guaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdGxiZmx1c2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJhY2NkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE9wZW5SSVNDIGltcGxlbWVudGF0aW9uOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKiBldCBhbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfVExCRkxVU0hfSAorI2RlZmluZSBfX0FTTV9PUEVOUklTQ19UTEJGTFVTSF9ICisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisvKgorICogIC0gZmx1c2hfdGxiKCkgZmx1c2hlcyB0aGUgY3VycmVudCBtbSBzdHJ1Y3QgVExCcworICogIC0gZmx1c2hfdGxiX2FsbCgpIGZsdXNoZXMgYWxsIHByb2Nlc3NlcyBUTEJzCisgKiAgLSBmbHVzaF90bGJfbW0obW0pIGZsdXNoZXMgdGhlIHNwZWNpZmllZCBtbSBjb250ZXh0IFRMQidzCisgKiAgLSBmbHVzaF90bGJfcGFnZSh2bWEsIHZtYWRkcikgZmx1c2hlcyBvbmUgcGFnZQorICogIC0gZmx1c2hfdGxiX3JhbmdlKG1tLCBzdGFydCwgZW5kKSBmbHVzaGVzIGEgcmFuZ2Ugb2YgcGFnZXMKKyAqLworCit2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCk7Cit2b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7Cit2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpOwordm9pZCBmbHVzaF90bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGVuZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGIodm9pZCkKK3sKKwlmbHVzaF90bGJfbW0oY3VycmVudC0+bW0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCWZsdXNoX3RsYl9yYW5nZShOVUxMLCBzdGFydCwgZW5kKTsKK30KKworI2VuZGlmIC8qIF9fQVNNX09QRU5SSVNDX1RMQkZMVVNIX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxMGU0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0wLDAgKzEsMzU1IEBACisvKgorICogT3BlblJJU0MgTGludXgKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICogZXQgYWwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX09QRU5SSVNDX1VBQ0NFU1NfSAorI2RlZmluZSBfX0FTTV9PUEVOUklTQ19VQUNDRVNTX0gKKworLyoKKyAqIFVzZXIgc3BhY2UgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbnMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworI2RlZmluZSBWRVJJRllfUkVBRAkwCisjZGVmaW5lIFZFUklGWV9XUklURQkxCisKKy8qCisgKiBUaGUgZnMgdmFsdWUgZGV0ZXJtaW5lcyB3aGV0aGVyIGFyZ3VtZW50IHZhbGlkaXR5IGNoZWNraW5nIHNob3VsZCBiZQorICogcGVyZm9ybWVkIG9yIG5vdC4gIElmIGdldF9mcygpID09IFVTRVJfRFMsIGNoZWNraW5nIGlzIHBlcmZvcm1lZCwgd2l0aAorICogZ2V0X2ZzKCkgPT0gS0VSTkVMX0RTLCBjaGVja2luZyBpcyBieXBhc3NlZC4KKyAqCisgKiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGVzZSBtYWNyb3MgYXJlIGdyb3NzbHkgbWlzbmFtZWQuCisgKi8KKworLyogYWRkcl9saW1pdCBpcyB0aGUgbWF4aW11bSBhY2Nlc3NpYmxlIGFkZHJlc3MgZm9yIHRoZSB0YXNrLiB3ZSBtaXN1c2UKKyAqIHRoZSBLRVJORUxfRFMgYW5kIFVTRVJfRFMgdmFsdWVzIHRvIGJvdGggYXNzaWduIGFuZCBjb21wYXJlIHRoZQorICogYWRkcl9saW1pdCB2YWx1ZXMgdGhyb3VnaCB0aGUgZXF1YWxseSBtaXNuYW1lZCBnZXQvc2V0X2ZzIG1hY3Jvcy4KKyAqIChzZWUgYWJvdmUpCisgKi8KKworI2RlZmluZSBLRVJORUxfRFMJKH4wVUwpCisjZGVmaW5lIGdldF9kcygpCShLRVJORUxfRFMpCisKKyNkZWZpbmUgVVNFUl9EUwkJKFRBU0tfU0laRSkKKyNkZWZpbmUgZ2V0X2ZzKCkJKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+YWRkcl9saW1pdCkKKyNkZWZpbmUgc2V0X2ZzKHgpCShjdXJyZW50X3RocmVhZF9pbmZvKCktPmFkZHJfbGltaXQgPSAoeCkpCisKKyNkZWZpbmUgc2VnbWVudF9lcShhLCBiKQkoKGEpID09IChiKSkKKworLyogRW5zdXJlIHRoYXQgdGhlIHJhbmdlIGZyb20gYWRkciB0byBhZGRyK3NpemUgaXMgYWxsIHdpdGhpbiB0aGUgcHJvY2VzcycKKyAqIGFkZHJlc3Mgc3BhY2UKKyAqLworI2RlZmluZSBfX3JhbmdlX29rKGFkZHIsIHNpemUpIChzaXplIDw9IGdldF9mcygpICYmIGFkZHIgPD0gKGdldF9mcygpLXNpemUpKQorCisvKiBFbnN1cmUgdGhhdCBhZGRyIGlzIGJlbG93IHRhc2sncyBhZGRyX2xpbWl0ICovCisjZGVmaW5lIF9fYWRkcl9vayhhZGRyKSAoKHVuc2lnbmVkIGxvbmcpIGFkZHIgPCBnZXRfZnMoKSkKKworI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgXAorCV9fcmFuZ2Vfb2soKHVuc2lnbmVkIGxvbmcpYWRkciwgKHVuc2lnbmVkIGxvbmcpc2l6ZSkKKworLyoKKyAqIFRoZSBleGNlcHRpb24gdGFibGUgY29uc2lzdHMgb2YgcGFpcnMgb2YgYWRkcmVzc2VzOiB0aGUgZmlyc3QgaXMgdGhlCisgKiBhZGRyZXNzIG9mIGFuIGluc3RydWN0aW9uIHRoYXQgaXMgYWxsb3dlZCB0byBmYXVsdCwgYW5kIHRoZSBzZWNvbmQgaXMKKyAqIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoZSBwcm9ncmFtIHNob3VsZCBjb250aW51ZS4gIE5vIHJlZ2lzdGVycyBhcmUKKyAqIG1vZGlmaWVkLCBzbyBpdCBpcyBlbnRpcmVseSB1cCB0byB0aGUgY29udGludWF0aW9uIGNvZGUgdG8gZmlndXJlIG91dAorICogd2hhdCB0byBkby4KKyAqCisgKiBBbGwgdGhlIHJvdXRpbmVzIGJlbG93IHVzZSBiaXRzIG9mIGZpeHVwIGNvZGUgdGhhdCBhcmUgb3V0IG9mIGxpbmUKKyAqIHdpdGggdGhlIG1haW4gaW5zdHJ1Y3Rpb24gcGF0aC4gIFRoaXMgbWVhbnMgd2hlbiBldmVyeXRoaW5nIGlzIHdlbGwsCisgKiB3ZSBkb24ndCBldmVuIGhhdmUgdG8ganVtcCBvdmVyIHRoZW0uICBGdXJ0aGVyLCB0aGV5IGRvIG5vdCBpbnRydWRlCisgKiBvbiBvdXIgY2FjaGUgb3IgdGxiIGVudHJpZXMuCisgKi8KKworc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSB7CisJdW5zaWduZWQgbG9uZyBpbnNuLCBmaXh1cDsKK307CisKKy8qIFJldHVybnMgMCBpZiBleGNlcHRpb24gbm90IGZvdW5kIGFuZCBmaXh1cCBvdGhlcndpc2UuICAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSh1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIHNvcnRfZXhjZXB0aW9uX3RhYmxlKHZvaWQpOworCisvKgorICogVGhlc2UgYXJlIHRoZSBtYWluIHNpbmdsZS12YWx1ZSB0cmFuc2ZlciByb3V0aW5lcy4gIFRoZXkgYXV0b21hdGljYWxseQorICogdXNlIHRoZSByaWdodCBzaXplIGlmIHdlIGp1c3QgaGF2ZSB0aGUgcmlnaHQgcG9pbnRlciB0eXBlLgorICoKKyAqIFRoaXMgZ2V0cyBraW5kIG9mIHVnbHkuIFdlIHdhbnQgdG8gcmV0dXJuIF90d29fIHZhbHVlcyBpbiAiZ2V0X3VzZXIoKSIKKyAqIGFuZCB5ZXQgd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnkgcG9pbnRlcnMsIGJlY2F1c2UgdGhhdCBpcyB0b28gbXVjaAorICogb2YgYSBwZXJmb3JtYW5jZSBpbXBhY3QuIFRodXMgd2UgaGF2ZSBhIGZldyByYXRoZXIgdWdseSBtYWNyb3MgaGVyZSwKKyAqIGFuZCBoaWRlIGFsbCB0aGUgdWdseW5lc3MgZnJvbSB0aGUgdXNlci4KKyAqCisgKiBUaGUgIl9feHh4IiB2ZXJzaW9ucyBvZiB0aGUgdXNlciBhY2Nlc3MgZnVuY3Rpb25zIGFyZSB2ZXJzaW9ucyB0aGF0CisgKiBkbyBub3QgdmVyaWZ5IHRoZSBhZGRyZXNzIHNwYWNlLCB0aGF0IG11c3QgaGF2ZSBiZWVuIGRvbmUgcHJldmlvdXNseQorICogd2l0aCBhIHNlcGFyYXRlICJhY2Nlc3Nfb2soKSIgY2FsbCAodGhpcyBpcyB1c2VkIHdoZW4gd2UgZG8gbXVsdGlwbGUKKyAqIGFjY2Vzc2VzIHRvIHRoZSBzYW1lIGFyZWEgb2YgdXNlciBtZW1vcnkpLgorICoKKyAqIEFzIHdlIHVzZSB0aGUgc2FtZSBhZGRyZXNzIHNwYWNlIGZvciBrZXJuZWwgYW5kIHVzZXIgZGF0YSBvbiB0aGUKKyAqIFBvd2VyUEMsIHdlIGNhbiBqdXN0IGRvIHRoZXNlIGFzIGRpcmVjdCBhc3NpZ25tZW50cy4gIChPZiBjb3Vyc2UsIHRoZQorICogZXhjZXB0aW9uIGhhbmRsaW5nIG1lYW5zIHRoYXQgaXQncyBubyBsb25nZXIgImp1c3QiLi4uKQorICovCisjZGVmaW5lIGdldF91c2VyKHgsIHB0cikgXAorCV9fZ2V0X3VzZXJfY2hlY2soKHgpLCAocHRyKSwgc2l6ZW9mKCoocHRyKSkpCisjZGVmaW5lIHB1dF91c2VyKHgsIHB0cikgXAorCV9fcHV0X3VzZXJfY2hlY2soKF9fdHlwZW9mX18oKihwdHIpKSkoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKKworI2RlZmluZSBfX2dldF91c2VyKHgsIHB0cikgXAorCV9fZ2V0X3VzZXJfbm9jaGVjaygoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKKyNkZWZpbmUgX19wdXRfdXNlcih4LCBwdHIpIFwKKwlfX3B1dF91c2VyX25vY2hlY2soKF9fdHlwZW9mX18oKihwdHIpKSkoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKKworZXh0ZXJuIGxvbmcgX19wdXRfdXNlcl9iYWQodm9pZCk7CisKKyNkZWZpbmUgX19wdXRfdXNlcl9ub2NoZWNrKHgsIHB0ciwgc2l6ZSkJCVwKKyh7CQkJCQkJCVwKKwlsb25nIF9fcHVfZXJyOwkJCQkJXAorCV9fcHV0X3VzZXJfc2l6ZSgoeCksIChwdHIpLCAoc2l6ZSksIF9fcHVfZXJyKTsJXAorCV9fcHVfZXJyOwkJCQkJXAorfSkKKworI2RlZmluZSBfX3B1dF91c2VyX2NoZWNrKHgsIHB0ciwgc2l6ZSkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCWxvbmcgX19wdV9lcnIgPSAtRUZBVUxUOwkJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSAqX19wdV9hZGRyID0gKHB0cik7CQkJCVwKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgX19wdV9hZGRyLCBzaXplKSkJCQlcCisJCV9fcHV0X3VzZXJfc2l6ZSgoeCksIF9fcHVfYWRkciwgKHNpemUpLCBfX3B1X2Vycik7CVwKKwlfX3B1X2VycjsJCQkJCQkJXAorfSkKKworI2RlZmluZSBfX3B1dF91c2VyX3NpemUoeCwgcHRyLCBzaXplLCByZXR2YWwpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJcmV0dmFsID0gMDsJCQkJCQkJXAorCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCisJY2FzZSAxOiBfX3B1dF91c2VyX2FzbSh4LCBwdHIsIHJldHZhbCwgImwuc2IiKTsgYnJlYWs7CQlcCisJY2FzZSAyOiBfX3B1dF91c2VyX2FzbSh4LCBwdHIsIHJldHZhbCwgImwuc2giKTsgYnJlYWs7CQlcCisJY2FzZSA0OiBfX3B1dF91c2VyX2FzbSh4LCBwdHIsIHJldHZhbCwgImwuc3ciKTsgYnJlYWs7CQlcCisJY2FzZSA4OiBfX3B1dF91c2VyX2FzbTIoeCwgcHRyLCByZXR2YWwpOyBicmVhazsJCQlcCisJZGVmYXVsdDogX19wdXRfdXNlcl9iYWQoKTsJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCitzdHJ1Y3QgX19sYXJnZV9zdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgYnVmWzEwMF07Cit9OworI2RlZmluZSBfX20oeCkgKCooc3RydWN0IF9fbGFyZ2Vfc3RydWN0ICopKHgpKQorCisvKgorICogV2UgZG9uJ3QgdGVsbCBnY2MgdGhhdCB3ZSBhcmUgYWNjZXNzaW5nIG1lbW9yeSwgYnV0IHRoaXMgaXMgT0sKKyAqIGJlY2F1c2Ugd2UgZG8gbm90IHdyaXRlIHRvIGFueSBtZW1vcnkgZ2NjIGtub3dzIGFib3V0LCBzbyB0aGVyZQorICogYXJlIG5vIGFsaWFzaW5nIGlzc3Vlcy4KKyAqLworI2RlZmluZSBfX3B1dF91c2VyX2FzbSh4LCBhZGRyLCBlcnIsIG9wKQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkJIjE6CSJvcCIgMCglMiksJTFcbiIJCQlcCisJCSIyOlxuIgkJCQkJCVwKKwkJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCQlcCisJCSIzOglsLmFkZGkgJTAscjAsJTNcbiIJCQlcCisJCSIJbC5qIDJiXG4iCQkJCVwKKwkJIglsLm5vcFxuIgkJCQlcCisJCSIucHJldmlvdXNcbiIJCQkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQlcCisJCSIJLmFsaWduIDJcbiIJCQkJXAorCQkiCS5sb25nIDFiLDNiXG4iCQkJCVwKKwkJIi5wcmV2aW91cyIJCQkJCVwKKwkJOiAiPXIiKGVycikJCQkJCVwKKwkJOiAiciIoeCksICJyIihhZGRyKSwgImkiKC1FRkFVTFQpLCAiMCIoZXJyKSkKKworI2RlZmluZSBfX3B1dF91c2VyX2FzbTIoeCwgYWRkciwgZXJyKQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJCSIxOglsLnN3IDAoJTIpLCUxXG4iCQkJXAorCQkiMjoJbC5zdyA0KCUyKSwlSDFcbiIJCQlcCisJCSIzOlxuIgkJCQkJCVwKKwkJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCQlcCisJCSI0OglsLmFkZGkgJTAscjAsJTNcbiIJCQlcCisJCSIJbC5qIDNiXG4iCQkJCVwKKwkJIglsLm5vcFxuIgkJCQlcCisJCSIucHJldmlvdXNcbiIJCQkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQlcCisJCSIJLmFsaWduIDJcbiIJCQkJXAorCQkiCS5sb25nIDFiLDRiXG4iCQkJCVwKKwkJIgkubG9uZyAyYiw0YlxuIgkJCQlcCisJCSIucHJldmlvdXMiCQkJCQlcCisJCTogIj1yIihlcnIpCQkJCQlcCisJCTogInIiKHgpLCAiciIoYWRkciksICJpIigtRUZBVUxUKSwgIjAiKGVycikpCisKKyNkZWZpbmUgX19nZXRfdXNlcl9ub2NoZWNrKHgsIHB0ciwgc2l6ZSkJCQlcCisoewkJCQkJCQkJXAorCWxvbmcgX19ndV9lcnIsIF9fZ3VfdmFsOwkJCQlcCisJX19nZXRfdXNlcl9zaXplKF9fZ3VfdmFsLCAocHRyKSwgKHNpemUpLCBfX2d1X2Vycik7CVwKKwkoeCkgPSAoX190eXBlb2ZfXygqKHB0cikpKV9fZ3VfdmFsOwkJCVwKKwlfX2d1X2VycjsJCQkJCQlcCit9KQorCisjZGVmaW5lIF9fZ2V0X3VzZXJfY2hlY2soeCwgcHRyLCBzaXplKQkJCQkJXAorKHsJCQkJCQkJCQlcCisJbG9uZyBfX2d1X2VyciA9IC1FRkFVTFQsIF9fZ3VfdmFsID0gMDsJCQkJXAorCWNvbnN0IF9fdHlwZW9mX18oKihwdHIpKSAqIF9fZ3VfYWRkciA9IChwdHIpOwkJCVwKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBfX2d1X2FkZHIsIHNpemUpKQkJCVwKKwkJX19nZXRfdXNlcl9zaXplKF9fZ3VfdmFsLCBfX2d1X2FkZHIsIChzaXplKSwgX19ndV9lcnIpOwlcCisJKHgpID0gKF9fdHlwZW9mX18oKihwdHIpKSlfX2d1X3ZhbDsJCQkJXAorCV9fZ3VfZXJyOwkJCQkJCQlcCit9KQorCitleHRlcm4gbG9uZyBfX2dldF91c2VyX2JhZCh2b2lkKTsKKworI2RlZmluZSBfX2dldF91c2VyX3NpemUoeCwgcHRyLCBzaXplLCByZXR2YWwpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJcmV0dmFsID0gMDsJCQkJCQkJXAorCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCisJY2FzZSAxOiBfX2dldF91c2VyX2FzbSh4LCBwdHIsIHJldHZhbCwgImwubGJ6Iik7IGJyZWFrOwkJXAorCWNhc2UgMjogX19nZXRfdXNlcl9hc20oeCwgcHRyLCByZXR2YWwsICJsLmxoeiIpOyBicmVhazsJCVwKKwljYXNlIDQ6IF9fZ2V0X3VzZXJfYXNtKHgsIHB0ciwgcmV0dmFsLCAibC5sd3oiKTsgYnJlYWs7CQlcCisJY2FzZSA4OiBfX2dldF91c2VyX2FzbTIoeCwgcHRyLCByZXR2YWwpOwkJCVwKKwlkZWZhdWx0OiAoeCkgPSBfX2dldF91c2VyX2JhZCgpOwkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX2dldF91c2VyX2FzbSh4LCBhZGRyLCBlcnIsIG9wKQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQlcCisJCSIxOgkib3AiICUxLDAoJTIpXG4iCQlcCisJCSIyOlxuIgkJCQkJXAorCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJXAorCQkiMzoJbC5hZGRpICUwLHIwLCUzXG4iCQlcCisJCSIJbC5hZGRpICUxLHIwLDBcbiIJCVwKKwkJIglsLmogMmJcbiIJCQlcCisJCSIJbC5ub3BcbiIJCQlcCisJCSIucHJldmlvdXNcbiIJCQkJXAorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJXAorCQkiCS5hbGlnbiAyXG4iCQkJXAorCQkiCS5sb25nIDFiLDNiXG4iCQkJXAorCQkiLnByZXZpb3VzIgkJCQlcCisJCTogIj1yIihlcnIpLCAiPXIiKHgpCQkJXAorCQk6ICJyIihhZGRyKSwgImkiKC1FRkFVTFQpLCAiMCIoZXJyKSkKKworI2RlZmluZSBfX2dldF91c2VyX2FzbTIoeCwgYWRkciwgZXJyKQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJXAorCQkiMToJbC5sd3ogJTEsMCglMilcbiIJCVwKKwkJIjI6CWwubHd6ICVIMSw0KCUyKVxuIgkJXAorCQkiMzpcbiIJCQkJCVwKKwkJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCVwKKwkJIjQ6CWwuYWRkaSAlMCxyMCwlM1xuIgkJXAorCQkiCWwuYWRkaSAlMSxyMCwwXG4iCQlcCisJCSIJbC5hZGRpICVIMSxyMCwwXG4iCQlcCisJCSIJbC5qIDNiXG4iCQkJXAorCQkiCWwubm9wXG4iCQkJXAorCQkiLnByZXZpb3VzXG4iCQkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCVwKKwkJIgkuYWxpZ24gMlxuIgkJCVwKKwkJIgkubG9uZyAxYiw0YlxuIgkJCVwKKwkJIgkubG9uZyAyYiw0YlxuIgkJCVwKKwkJIi5wcmV2aW91cyIJCQkJXAorCQk6ICI9ciIoZXJyKSwgIj0mciIoeCkJCQlcCisJCTogInIiKGFkZHIpLCAiaSIoLUVGQVVMVCksICIwIihlcnIpKQorCisvKiBtb3JlIGNvbXBsZXggcm91dGluZXMgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitfX2NvcHlfdG9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKKyNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgc2l6ZSkgXAorCV9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgc2l6ZSkKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIHNpemUpIFwKKwlfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIHNpemUpCisKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWMgX19jb3B5X3RvX3VzZXIKKyNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyBfX2NvcHlfZnJvbV91c2VyCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwl1bnNpZ25lZCBsb25nIG92ZXI7CisKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKKwkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbik7CisJaWYgKCh1bnNpZ25lZCBsb25nKWZyb20gPCBUQVNLX1NJWkUpIHsKKwkJb3ZlciA9ICh1bnNpZ25lZCBsb25nKWZyb20gKyBuIC0gVEFTS19TSVpFOworCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBuIC0gb3ZlcikgKyBvdmVyOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitjb3B5X3RvX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwl1bnNpZ25lZCBsb25nIG92ZXI7CisKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKQorCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpdG8gPCBUQVNLX1NJWkUpIHsKKwkJb3ZlciA9ICh1bnNpZ25lZCBsb25nKXRvICsgbiAtIFRBU0tfU0laRTsKKwkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbiAtIG92ZXIpICsgb3ZlcjsKKwl9CisJcmV0dXJuIG47Cit9CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9fY2xlYXJfdXNlcih2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOworCitzdGF0aWMgaW5saW5lIF9fbXVzdF9jaGVjayB1bnNpZ25lZCBsb25nCitjbGVhcl91c2VyKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhZGRyLCBzaXplKSkKKwkJcmV0dXJuIF9fY2xlYXJfdXNlcihhZGRyLCBzaXplKTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpYWRkciA8IFRBU0tfU0laRSkgeworCQl1bnNpZ25lZCBsb25nIG92ZXIgPSAodW5zaWduZWQgbG9uZylhZGRyICsgc2l6ZSAtIFRBU0tfU0laRTsKKwkJcmV0dXJuIF9fY2xlYXJfdXNlcihhZGRyLCBzaXplIC0gb3ZlcikgKyBvdmVyOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworZXh0ZXJuIGludCBfX3N0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBsb25nIGNvdW50KTsKKworc3RhdGljIGlubGluZSBsb25nIHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBsb25nIGNvdW50KQoreworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNyYywgMSkpCisJCXJldHVybiBfX3N0cm5jcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBjb3VudCk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHNpemUgb2YgYSBzdHJpbmcgKGluY2x1ZGluZyB0aGUgZW5kaW5nIDApCisgKgorICogUmV0dXJuIDAgZm9yIGVycm9yCisgKi8KKworZXh0ZXJuIGludCBfX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyICpzdHIsIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHRvcCk7CisKKy8qCisgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBhdCBzdHIgKGluY2x1ZGluZyB0aGUgbnVsbCBieXRlKSwKKyAqIG9yIDAgaWYgd2UgaGl0IGEgcGFnZSB3ZSBjYW4ndCBhY2Nlc3MsCisgKiBvciBzb21ldGhpbmcgPiBsZW4gaWYgd2UgZGlkbid0IGZpbmQgYSBudWxsIGJ5dGUuCisgKgorICogVGhlIGB0b3AnIHBhcmFtZXRlciB0byBfX3N0cm5sZW5fdXNlciBpcyB0byBtYWtlIHN1cmUgdGhhdAorICogd2UgY2FuIG5ldmVyIG92ZXJmbG93IGZyb20gdGhlIHVzZXIgYXJlYSBpbnRvIGtlcm5lbCBzcGFjZS4KKyAqLworc3RhdGljIGlubGluZSBsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3RyLCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIHRvcCA9ICh1bnNpZ25lZCBsb25nKWdldF9mcygpOworCXVuc2lnbmVkIGxvbmcgcmVzID0gMDsKKworCWlmIChfX2FkZHJfb2soc3RyKSkKKwkJcmVzID0gX19zdHJubGVuX3VzZXIoc3RyLCBsZW4sIHRvcCk7CisKKwlyZXR1cm4gcmVzOworfQorCisjZGVmaW5lIHN0cmxlbl91c2VyKHN0cikgc3Rybmxlbl91c2VyKHN0ciwgVEFTS19TSVpFLTEpCisKKyNlbmRpZiAvKiBfX0FTTV9PUEVOUklTQ19VQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdW5hbGlnbmVkLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3VuYWxpZ25lZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNDFjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3VuYWxpZ25lZC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE9wZW5SSVNDIGltcGxlbWVudGF0aW9uOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKiBldCBhbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19BU01fT1BFTlJJU0NfVU5BTElHTkVEX0gKKyNkZWZpbmUgX19BU01fT1BFTlJJU0NfVU5BTElHTkVEX0gKKworLyoKKyAqIFRoaXMgaXMgY29waWVkIGZyb20gdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBDLXN0cnVjdAorICogdmFyaWFudCByZXBsYWNlZCB3aXRoIHRoZSBtZW1tb3ZlIHZhcmlhbnQuICBUaGUgR0NDIGNvbXBpbGVyCisgKiBmb3IgdGhlIE9SMzIgYXJjaCBvcHRpbWl6ZXMgdG9vIGFnZ3Jlc3NpdmVseSBmb3IgdGhlIEMtc3RydWN0CisgKiB2YXJpYW50IHRvIHdvcmssIHNvIHVzZSB0aGUgbWVtbW92ZSB2YXJpYW50IGluc3RlYWQuCisgKgorICogSXQgbWF5IGJlIHdvcnRoIGNvbnNpZGVyaW5nIGltcGxlbWVudGluZyB0aGUgdW5hbGlnbmVkIGFjY2VzcworICogZXhjZXB0aW9uIGhhbmRsZXIgYW5kIGFsbG93aW5nIHVuYWxpZ25lZCBhY2Nlc3NlcyAoYWNjZXNzX29rLmgpLi4uCisgKiBub3Qgc3VyZSBpZiBpdCB3b3VsZCBiZSBtdWNoIG9mIGEgcGVyZm9ybWFuY2Ugd2luIHdpdGhvdXQgZnVydGhlcgorICogaW52ZXN0aWdhdGlvbi4KKyAqLworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvbGVfbWVtbW92ZS5oPgorIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvYmVfYnl0ZXNoaWZ0Lmg+CisjIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9nZW5lcmljLmg+CisjIGRlZmluZSBnZXRfdW5hbGlnbmVkCV9fZ2V0X3VuYWxpZ25lZF9sZQorIyBkZWZpbmUgcHV0X3VuYWxpZ25lZAlfX3B1dF91bmFsaWduZWRfbGUKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvYmVfbWVtbW92ZS5oPgorIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvbGVfYnl0ZXNoaWZ0Lmg+CisjIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9nZW5lcmljLmg+CisjIGRlZmluZSBnZXRfdW5hbGlnbmVkCV9fZ2V0X3VuYWxpZ25lZF9iZQorIyBkZWZpbmUgcHV0X3VuYWxpZ25lZAlfX3B1dF91bmFsaWduZWRfYmUKKyNlbHNlCisjIGVycm9yIG5lZWQgdG8gZGVmaW5lIGVuZGlhbmVzcworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FTTV9PUEVOUklTQ19VTkFMSUdORURfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhZjNhYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogT3BlblJJU0MgaW1wbGVtZW50YXRpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqIGV0IGFsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmICFkZWZpbmVkKF9fQVNNX09QRU5SSVNDX1VOSVNURF9IKSB8fCBkZWZpbmVkKF9fU1lTQ0FMTCkKKyNkZWZpbmUgX19BU01fT1BFTlJJU0NfVU5JU1REX0gKKworI2RlZmluZSBfX0FSQ0hfSEFWRV9NTVUKKworI2RlZmluZSBzeXNfbW1hcDIgc3lzX21tYXBfcGdvZmYKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3VuaXN0ZC5oPgorCisjZGVmaW5lIF9fTlJfb3Ixa19hdG9taWMgX19OUl9hcmNoX3NwZWNpZmljX3N5c2NhbGwKK19fU1lTQ0FMTChfX05SX29yMWtfYXRvbWljLCBzeXNfb3Ixa19hdG9taWMpCisKKyNlbmRpZiAvKiBfX0FTTV9PUEVOUklTQ19VTklTVERfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTRjMjcwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworZXh0cmEteQk6PSBoZWFkLm8gdm1saW51eC5sZHMgaW5pdF90YXNrLm8KKworb2JqLXkJOj0gc2V0dXAubyBpZGxlLm8gb3IzMl9rc3ltcy5vIHByb2Nlc3MubyBkbWEubyBcCisJICAgdHJhcHMubyB0aW1lLm8gaXJxLm8gZW50cnkubyBwdHJhY2UubyBzaWduYWwubyBzeXNfb3IzMi5vIFwKKwkgICBzeXNfY2FsbF90YWJsZS5vCisKK29iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KK29iai0kKENPTkZJR19PRikJCSs9IHByb20ubworCitjbGVhbjoKZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2Mva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMjQyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBPcGVuUklTQyBhc20tb2Zmc2V0cy5jCisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgdGhlIE9wZW5SSVNDIGFyY2hpdGVjdHVyZToKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgdXNlZCB0byBnZW5lcmF0ZSBkZWZpbml0aW9ucyBuZWVkZWQgYnkKKyAqIGFzc2VtYmx5IGxhbmd1YWdlIG1vZHVsZXMuCisgKgorICogV2UgdXNlIHRoZSB0ZWNobmlxdWUgdXNlZCBpbiB0aGUgT1NGIE1hY2gga2VybmVsIGNvZGU6CisgKiBnZW5lcmF0ZSBhc20gc3RhdGVtZW50cyBjb250YWluaW5nICNkZWZpbmVzLAorICogY29tcGlsZSB0aGlzIGZpbGUgdG8gYXNzZW1ibGVyLCBhbmQgdGhlbiBleHRyYWN0IHRoZQorICogI2RlZmluZXMgZnJvbSB0aGUgYXNzZW1ibHktbGFuZ3VhZ2Ugb3V0cHV0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2RlZmluZSBERUZJTkUoc3ltLCB2YWwpIFwKKwkJYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbCkpCisKKyNkZWZpbmUgQkxBTksoKSBhc20gdm9sYXRpbGUoIlxuLT4iIDogOiApCisKK2ludCBtYWluKHZvaWQpCit7CisJLyogb2Zmc2V0cyBpbnRvIHRoZSB0YXNrX3N0cnVjdCAqLworCURFRklORShUQVNLX1NUQVRFLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHN0YXRlKSk7CisJREVGSU5FKFRBU0tfRkxBR1MsIG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgZmxhZ3MpKTsKKwlERUZJTkUoVEFTS19QVFJBQ0UsIG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgcHRyYWNlKSk7CisJREVGSU5FKFRBU0tfVEhSRUFELCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZCkpOworCURFRklORShUQVNLX01NLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIG1tKSk7CisJREVGSU5FKFRBU0tfQUNUSVZFX01NLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIGFjdGl2ZV9tbSkpOworCisJLyogb2Zmc2V0cyBpbnRvIHRocmVhZF9pbmZvICovCisJREVGSU5FKFRJX1RBU0ssIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdGFzaykpOworCURFRklORShUSV9GTEFHUywgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBmbGFncykpOworCURFRklORShUSV9QUkVFTVBULCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHByZWVtcHRfY291bnQpKTsKKwlERUZJTkUoVElfS1NQLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGtzcCkpOworCisJREVGSU5FKFBUX1NJWkUsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCisJLyogSW50ZXJydXB0IHJlZ2lzdGVyIGZyYW1lICovCisJREVGSU5FKFNUQUNLX0ZSQU1FX09WRVJIRUFELCBTVEFDS19GUkFNRV9PVkVSSEVBRCk7CisJREVGSU5FKElOVF9GUkFNRV9TSVpFLCBTVEFDS19GUkFNRV9PVkVSSEVBRCArIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCisJREVGSU5FKE5VTV9VU0VSX1NFR01FTlRTLCBUQVNLX1NJWkUgPj4gMjgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvZG1hLmMgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhkM2VlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvZG1hLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBPcGVuUklTQyBMaW51eAorICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIHRoZSBPcGVuUklTQyBhcmNoaXRlY3R1cmU6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRE1BIG1hcHBpbmcgY2FsbGJhY2tzLi4uCisgKiBBcyBhbGxvY19jb2hlcmVudCBpcyB0aGUgb25seSBETUEgY2FsbGJhY2sgYmVpbmcgdXNlZCBjdXJyZW50bHksIHRoYXQncworICogdGhlIG9ubHkgdGhpbmcgaW1wbGVtZW50ZWQgcHJvcGVybHkuICBUaGUgcmVzdCBuZWVkIGxvb2tpbmcgaW50by4uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1kZWJ1Zy5oPgorCisjaW5jbHVkZSA8YXNtL2NwdWluZm8uaD4KKyNpbmNsdWRlIDxhc20vc3ByX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworc3RhdGljIGludCBwYWdlX3NldF9ub2NhY2hlKHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKQoreworCXVuc2lnbmVkIGxvbmcgY2w7CisKKwlwdGVfdmFsKCpwdGUpIHw9IF9QQUdFX0NJOworCisJLyoKKwkgKiBGbHVzaCB0aGUgcGFnZSBvdXQgb2YgdGhlIFRMQiBzbyB0aGF0IHRoZSBuZXcgcGFnZSBmbGFncyBnZXQKKwkgKiBwaWNrZWQgdXAgbmV4dCB0aW1lIHRoZXJlJ3MgYW4gYWNjZXNzCisJICovCisJZmx1c2hfdGxiX3BhZ2UoTlVMTCwgYWRkcik7CisKKwkvKiBGbHVzaCBwYWdlIG91dCBvZiBkY2FjaGUgKi8KKwlmb3IgKGNsID0gX19wYShhZGRyKTsgY2wgPCBfX3BhKG5leHQpOyBjbCArPSBjcHVpbmZvLmRjYWNoZV9ibG9ja19zaXplKQorCQltdHNwcihTUFJfRENCRlIsIGNsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhZ2VfY2xlYXJfbm9jYWNoZShwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKQoreworCXB0ZV92YWwoKnB0ZSkgJj0gfl9QQUdFX0NJOworCisJLyoKKwkgKiBGbHVzaCB0aGUgcGFnZSBvdXQgb2YgdGhlIFRMQiBzbyB0aGF0IHRoZSBuZXcgcGFnZSBmbGFncyBnZXQKKwkgKiBwaWNrZWQgdXAgbmV4dCB0aW1lIHRoZXJlJ3MgYW4gYWNjZXNzCisJICovCisJZmx1c2hfdGxiX3BhZ2UoTlVMTCwgYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jICJjb2hlcmVudCIgbWVtb3J5LCB3aGljaCBmb3IgT3BlblJJU0MgbWVhbnMgc2ltcGx5IHVuY2FjaGVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZWZmZWN0aXZlbHkganVzdCBjYWxscyBfX2dldF9mcmVlX3BhZ2VzLCBzZXRzIHRoZQorICogY2FjaGUtaW5oaWJpdCBiaXQgb24gdGhvc2UgcGFnZXMsIGFuZCBtYWtlcyBzdXJlIHRoYXQgdGhlIHBhZ2VzIGFyZQorICogZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIGJlZm9yZSB0aGV5IGFyZSB1c2VkLgorICoKKyAqLwordm9pZCAqb3Ixa19kbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGdmcCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhOworCXZvaWQgKnBhZ2U7CisJc3RydWN0IG1tX3dhbGsgd2FsayA9IHsKKwkJLnB0ZV9lbnRyeSA9IHBhZ2Vfc2V0X25vY2FjaGUsCisJCS5tbSA9ICZpbml0X21tCisJfTsKKworCXBhZ2UgPSBhbGxvY19wYWdlc19leGFjdChzaXplLCBnZnApOworCWlmICghcGFnZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBUaGlzIGdpdmVzIHVzIHRoZSByZWFsIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHBhZ2UuICovCisJKmRtYV9oYW5kbGUgPSBfX3BhKHBhZ2UpOworCisJdmEgPSAodW5zaWduZWQgbG9uZylwYWdlOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgcGFnZXMsIGNsZWFyaW5nIHRoZSBkY2FjaGUgZm9yCisJICogdGhlbSBhbmQgc2V0dGluZyB0aGUgY2FjaGUtaW5oaWJpdCBiaXQuCisJICovCisJaWYgKHdhbGtfcGFnZV9yYW5nZSh2YSwgdmEgKyBzaXplLCAmd2FsaykpIHsKKwkJZnJlZV9wYWdlc19leGFjdChwYWdlLCBzaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuICh2b2lkICopdmE7Cit9CisKK3ZvaWQgb3Ixa19kbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwKKwkJCSAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCit7CisJdW5zaWduZWQgbG9uZyB2YSA9ICh1bnNpZ25lZCBsb25nKXZhZGRyOworCXN0cnVjdCBtbV93YWxrIHdhbGsgPSB7CisJCS5wdGVfZW50cnkgPSBwYWdlX2NsZWFyX25vY2FjaGUsCisJCS5tbSA9ICZpbml0X21tCisJfTsKKworCS8qIHdhbGtfcGFnZV9yYW5nZSBzaG91bGRuJ3QgYmUgYWJsZSB0byBmYWlsIGhlcmUgKi8KKwlXQVJOX09OKHdhbGtfcGFnZV9yYW5nZSh2YSwgdmEgKyBzaXplLCAmd2FsaykpOworCisJZnJlZV9wYWdlc19leGFjdCh2YWRkciwgc2l6ZSk7Cit9CisKK2RtYV9hZGRyX3Qgb3Ixa19tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJdW5zaWduZWQgbG9uZyBjbDsKKwlkbWFfYWRkcl90IGFkZHIgPSBwYWdlX3RvX3BoeXMocGFnZSkgKyBvZmZzZXQ7CisKKwlzd2l0Y2ggKGRpcikgeworCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJLyogRmx1c2ggdGhlIGRjYWNoZSBmb3IgdGhlIHJlcXVlc3RlZCByYW5nZSAqLworCQlmb3IgKGNsID0gYWRkcjsgY2wgPCBhZGRyICsgc2l6ZTsKKwkJICAgICBjbCArPSBjcHVpbmZvLmRjYWNoZV9ibG9ja19zaXplKQorCQkJbXRzcHIoU1BSX0RDQkZSLCBjbCk7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQkvKiBJbnZhbGlkYXRlIHRoZSBkY2FjaGUgZm9yIHRoZSByZXF1ZXN0ZWQgcmFuZ2UgKi8KKwkJZm9yIChjbCA9IGFkZHI7IGNsIDwgYWRkciArIHNpemU7CisJCSAgICAgY2wgKz0gY3B1aW5mby5kY2FjaGVfYmxvY2tfc2l6ZSkKKwkJCW10c3ByKFNQUl9EQ0JJUiwgY2wpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBOT1RFOiBJZiBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwgdGhlbiB0aGVyZSdzIG5vIG5lZWQgdG8KKwkJICogZmx1c2ggbm9yIGludmFsaWRhdGUgdGhlIGNhY2hlIGhlcmUgYXMgdGhlIGFyZWEgd2lsbCBuZWVkCisJCSAqIHRvIGJlIG1hbnVhbGx5IHN5bmNlZCBhbnl3YXkuCisJCSAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYWRkcjsKK30KKwordm9pZCBvcjFrX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCSAgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJICAgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwkvKiBOb3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4uLiAqLworfQorCit2b2lkIG9yMWtfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAorCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXVuc2lnbmVkIGxvbmcgY2w7CisJZG1hX2FkZHJfdCBhZGRyID0gZG1hX2hhbmRsZTsKKworCS8qIEludmFsaWRhdGUgdGhlIGRjYWNoZSBmb3IgdGhlIHJlcXVlc3RlZCByYW5nZSAqLworCWZvciAoY2wgPSBhZGRyOyBjbCA8IGFkZHIgKyBzaXplOyBjbCArPSBjcHVpbmZvLmRjYWNoZV9ibG9ja19zaXplKQorCQltdHNwcihTUFJfRENCSVIsIGNsKTsKK30KKwordm9pZCBvcjFrX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwl1bnNpZ25lZCBsb25nIGNsOworCWRtYV9hZGRyX3QgYWRkciA9IGRtYV9oYW5kbGU7CisKKwkvKiBGbHVzaCB0aGUgZGNhY2hlIGZvciB0aGUgcmVxdWVzdGVkIHJhbmdlICovCisJZm9yIChjbCA9IGFkZHI7IGNsIDwgYWRkciArIHNpemU7IGNsICs9IGNwdWluZm8uZGNhY2hlX2Jsb2NrX3NpemUpCisJCW10c3ByKFNQUl9EQ0JGUiwgY2wpOworfQorCisvKiBOdW1iZXIgb2YgZW50cmllcyBwcmVhbGxvY2F0ZWQgZm9yIERNQS1BUEkgZGVidWdnaW5nICovCisjZGVmaW5lIFBSRUFMTE9DX0RNQV9ERUJVR19FTlRSSUVTICgxIDw8IDE2KQorCitzdGF0aWMgaW50IF9faW5pdCBkbWFfaW5pdCh2b2lkKQoreworCWRtYV9kZWJ1Z19pbml0KFBSRUFMTE9DX0RNQV9ERUJVR19FTlRSSUVTKTsKKworCXJldHVybiAwOworfQorCitmc19pbml0Y2FsbChkbWFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvZW50cnkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWY5YzM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvZW50cnkuUwpAQCAtMCwwICsxLDExMjggQEAKKy8qCisgKiBPcGVuUklTQyBlbnRyeS5TCisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgdGhlIE9wZW5SSVNDIGFyY2hpdGVjdHVyZToKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA1IEd5b3JneSBKZW5leSA8bm9nQGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3Nwcl9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKworI2RlZmluZSBESVNBQkxFX0lOVEVSUlVQVFModDEsdDIpCQkJXAorCWwubWZzcHIgdDIscjAsU1BSX1NSCQkJCTtcCisJbC5tb3ZoaQl0MSxoaSh+KFNQUl9TUl9JRUV8U1BSX1NSX1RFRSkpCQk7XAorCWwub3JpCXQxLHQxLGxvKH4oU1BSX1NSX0lFRXxTUFJfU1JfVEVFKSkJO1wKKwlsLmFuZCAgIHQyLHQyLHQxCQkJCTtcCisJbC5tdHNwciByMCx0MixTUFJfU1IKKworI2RlZmluZSBFTkFCTEVfSU5URVJSVVBUUyh0MSkJCQkJXAorCWwubWZzcHIJdDEscjAsU1BSX1NSCQkJCTtcCisJbC5vcmkJdDEsdDEsbG8oU1BSX1NSX0lFRXxTUFJfU1JfVEVFKQkJO1wKKwlsLm10c3ByCXIwLHQxLFNQUl9TUgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1bIG1hY3JvcyBdPT09ICovCisKKy8qCisgKiBXZSBuZWVkIHRvIGRpc2FibGUgaW50ZXJydXB0cyBhdCBiZWdpbm5pbmcgb2YgUkVTVE9SRV9BTEwKKyAqIHNpbmNlIGludGVycnVwdCBtaWdodCBjb21lIGluIGFmdGVyIHdlJ3ZlIGxvYWRlZCBFUEMgcmV0dXJuIGFkZHJlc3MKKyAqIGFuZCBvdmVyd3JpdGUgRVBDIHdpdGggYWRkcmVzcyBzb21ld2hlcmUgaW4gUkVTVE9SRV9BTEwKKyAqIHdoaWNoIGlzIG9mIGNvdXJzZSB3cm9uZyEKKyAqLworCisjZGVmaW5lIFJFU1RPUkVfQUxMCQkJCQkJXAorCURJU0FCTEVfSU5URVJSVVBUUyhyMyxyNCkJCQkJO1wKKwlsLmx3eiAgIHIzLFBUX1BDKHIxKQkJCQkJO1wKKwlsLm10c3ByIHIwLHIzLFNQUl9FUENSX0JBU0UJCQkJO1wKKwlsLmx3eiAgIHIzLFBUX1NSKHIxKQkJCQkJO1wKKwlsLm10c3ByIHIwLHIzLFNQUl9FU1JfQkFTRQkJCQk7XAorCWwubHd6ICAgcjIsUFRfR1BSMihyMSkJCQkJCTtcCisJbC5sd3ogICByMyxQVF9HUFIzKHIxKQkJCQkJO1wKKwlsLmx3eiAgIHI0LFBUX0dQUjQocjEpCQkJCQk7XAorCWwubHd6ICAgcjUsUFRfR1BSNShyMSkJCQkJCTtcCisJbC5sd3ogICByNixQVF9HUFI2KHIxKQkJCQkJO1wKKwlsLmx3eiAgIHI3LFBUX0dQUjcocjEpCQkJCQk7XAorCWwubHd6ICAgcjgsUFRfR1BSOChyMSkJCQkJCTtcCisJbC5sd3ogICByOSxQVF9HUFI5KHIxKQkJCQkJO1wKKwlsLmx3eiAgIHIxMCxQVF9HUFIxMChyMSkJCQkJCTtcCisJbC5sd3ogICByMTEsUFRfR1BSMTEocjEpCQkJCQk7XAorCWwubHd6ICAgcjEyLFBUX0dQUjEyKHIxKQkJCQkJO1wKKwlsLmx3eiAgIHIxMyxQVF9HUFIxMyhyMSkJCQkJCTtcCisJbC5sd3ogICByMTQsUFRfR1BSMTQocjEpCQkJCQk7XAorCWwubHd6ICAgcjE1LFBUX0dQUjE1KHIxKQkJCQkJO1wKKwlsLmx3eiAgIHIxNixQVF9HUFIxNihyMSkJCQkJCTtcCisJbC5sd3ogICByMTcsUFRfR1BSMTcocjEpCQkJCQk7XAorCWwubHd6ICAgcjE4LFBUX0dQUjE4KHIxKQkJCQkJO1wKKwlsLmx3eiAgIHIxOSxQVF9HUFIxOShyMSkJCQkJCTtcCisJbC5sd3ogICByMjAsUFRfR1BSMjAocjEpCQkJCQk7XAorCWwubHd6ICAgcjIxLFBUX0dQUjIxKHIxKQkJCQkJO1wKKwlsLmx3eiAgIHIyMixQVF9HUFIyMihyMSkJCQkJCTtcCisJbC5sd3ogICByMjMsUFRfR1BSMjMocjEpCQkJCQk7XAorCWwubHd6ICAgcjI0LFBUX0dQUjI0KHIxKQkJCQkJO1wKKwlsLmx3eiAgIHIyNSxQVF9HUFIyNShyMSkJCQkJCTtcCisJbC5sd3ogICByMjYsUFRfR1BSMjYocjEpCQkJCQk7XAorCWwubHd6ICAgcjI3LFBUX0dQUjI3KHIxKQkJCQkJO1wKKwlsLmx3eiAgIHIyOCxQVF9HUFIyOChyMSkJCQkJCTtcCisJbC5sd3ogICByMjksUFRfR1BSMjkocjEpCQkJCQk7XAorCWwubHd6ICAgcjMwLFBUX0dQUjMwKHIxKQkJCQkJO1wKKwlsLmx3eiAgIHIzMSxQVF9HUFIzMShyMSkJCQkJCTtcCisJbC5sd3ogICByMSxQVF9TUChyMSkJCQkJCTtcCisJbC5yZmUKKworCisjZGVmaW5lIEVYQ0VQVElPTl9FTlRSWShoYW5kbGVyKQkJCQlcCisJLmdsb2JhbAloYW5kbGVyCQkJCQkJO1wKK2hhbmRsZXI6CQkJCQkJCTtcCisJLyogcjEsIEVQQ1IsIEVTUiBhIGFscmVhZHkgc2F2ZWQgKi8JCQk7XAorCWwuc3cJUFRfR1BSMihyMSkscjIJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIzKHIxKSxyMwkJCQkJO1wKKwlsLnN3ICAgIFBUX09SSUdfR1BSMTEocjEpLHIxMQkJCQk7XAorCS8qIHI0IGFscmVhZHkgc2F2ZSAqLwkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjUocjEpLHI1CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSNihyMSkscjYJCQkJCTtcCisJbC5zdyAgICBQVF9HUFI3KHIxKSxyNwkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjgocjEpLHI4CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSOShyMSkscjkJCQkJCTtcCisJLyogcjEwIGFscmVhZHkgc2F2ZWQgKi8JCQkJCTtcCisJbC5zdyAgICBQVF9HUFIxMShyMSkscjExCQkJCQk7XAorCS8qIHIxMiBhbHJlYWR5IHNhdmVkICovCQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMTMocjEpLHIxMwkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjE0KHIxKSxyMTQJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIxNShyMSkscjE1CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMTYocjEpLHIxNgkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjE3KHIxKSxyMTcJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIxOChyMSkscjE4CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMTkocjEpLHIxOQkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjIwKHIxKSxyMjAJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIyMShyMSkscjIxCQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMjIocjEpLHIyMgkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjIzKHIxKSxyMjMJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIyNChyMSkscjI0CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMjUocjEpLHIyNQkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjI2KHIxKSxyMjYJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIyNyhyMSkscjI3CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMjgocjEpLHIyOAkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjI5KHIxKSxyMjkJCQkJCTtcCisJLyogcjMwIGFscmVhZHkgc2F2ZSAqLwkJCQkJO1wKKy8qICAgICAgICBsLnN3ICAgIFBUX0dQUjMwKHIxKSxyMzAqLwkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjMxKHIxKSxyMzEJCQkJCTtcCisJbC5zdyAgICBQVF9TWVNDQUxMTk8ocjEpLHIwCisKKyNkZWZpbmUgVU5IQU5ETEVEX0VYQ0VQVElPTihoYW5kbGVyLHZlY3RvcikJCQlcCisJLmdsb2JhbAloYW5kbGVyCQkJCQkJO1wKK2hhbmRsZXI6CQkJCQkJCTtcCisJLyogcjEsIEVQQ1IsIEVTUiBhbHJlYWR5IHNhdmVkICovCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjIocjEpLHIyCQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMyhyMSkscjMJCQkJCTtcCisJbC5zdyAgICBQVF9PUklHX0dQUjExKHIxKSxyMTEJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjUocjEpLHI1CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSNihyMSkscjYJCQkJCTtcCisJbC5zdyAgICBQVF9HUFI3KHIxKSxyNwkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjgocjEpLHI4CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSOShyMSkscjkJCQkJCTtcCisJLyogcjEwIGFscmVhZHkgc2F2ZWQgKi8JCQkJCTtcCisJbC5zdyAgICBQVF9HUFIxMShyMSkscjExCQkJCQk7XAorCS8qIHIxMiBhbHJlYWR5IHNhdmVkICovCQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMTMocjEpLHIxMwkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjE0KHIxKSxyMTQJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIxNShyMSkscjE1CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMTYocjEpLHIxNgkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjE3KHIxKSxyMTcJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIxOChyMSkscjE4CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMTkocjEpLHIxOQkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjIwKHIxKSxyMjAJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIyMShyMSkscjIxCQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMjIocjEpLHIyMgkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjIzKHIxKSxyMjMJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIyNChyMSkscjI0CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMjUocjEpLHIyNQkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjI2KHIxKSxyMjYJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIyNyhyMSkscjI3CQkJCQk7XAorCWwuc3cgICAgUFRfR1BSMjgocjEpLHIyOAkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjI5KHIxKSxyMjkJCQkJCTtcCisJLyogcjMxIGFscmVhZHkgc2F2ZWQgKi8JCQkJCTtcCisJbC5zdyAgICBQVF9HUFIzMChyMSkscjMwCQkJCQk7XAorLyogICAgICAgIGwuc3cgICAgUFRfR1BSMzEocjEpLHIzMQkqLwkJCQk7XAorCWwuc3cgICAgUFRfU1lTQ0FMTE5PKHIxKSxyMAkJCQk7XAorCWwuYWRkaQlyMyxyMSwwCQkJCQkJO1wKKwkvKiByNCBpcyBleGNlcHRpb24gRUEgKi8JCQkJO1wKKwlsLmFkZGkJcjUscjAsdmVjdG9yCQkJCQk7XAorCWwuamFsCXVuaGFuZGxlZF9leGNlcHRpb24JCQkJO1wKKwkgbC5ub3AJCQkJCQkJO1wKKwlsLmoJX3JldF9mcm9tX2V4Y2VwdGlvbgkJCQk7XAorCSBsLm5vcAorCisvKgorICogTk9URTogb25lIHNob3VsZCBuZXZlciBhc3N1bWUgdGhhdCBTUFJfRVBDLCBTUFJfRVNSLCBTUFJfRUVBUgorICogICAgICAgY29udGFpbiB0aGUgc2FtZSB2YWx1ZXMgYXMgd2hlbiBleGNlcHRpb24gd2UncmUgaGFuZGxpbmcKKyAqCSBvY2N1cmVkLiBpbiBmYWN0IHRoZXkgbmV2ZXIgZG8uIGlmIHlvdSBuZWVkIHRoZW0gdXNlCisgKgkgdmFsdWVzIHNhdmVkIG9uIHN0YWNrIChmb3IgU1BSX0VQQywgU1BSX0VTUikgb3IgY29udGVudAorICogICAgICAgb2YgcjQgKGZvciBTUFJfRUVBUikuIGZvciBkZXRhaWxzIGxvb2sgYXQgRVhDRVBUSU9OX0hBTkRMRSgpCisgKiAgICAgICBpbiAnYXJjaC9vcjMyL2tlcm5lbC9oZWFkLlMnCisgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1bIGV4Y2VwdGlvbnNdID09PSAqLworCisvKiAtLS1bIDB4MTAwOiBSRVNFVCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0VYQ0VQVElPTl9FTlRSWShfdG5nX2tlcm5lbF9zdGFydCkKKwlsLmphbAlfc3RhcnQKKwkgbC5hbmRpIHIwLHIwLDAKKworLyogLS0tWyAweDIwMDogQlVTIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitFWENFUFRJT05fRU5UUlkoX2J1c19mYXVsdF9oYW5kbGVyKQorCS8qIHI0OiBFQSBvZiBmYXVsdCAoc2V0IGJ5IEVYQ0VQVElPTl9IQU5ETEUpICovCisJbC5qYWwgICBkb19idXNfZmF1bHQKKwkgbC5hZGRpICByMyxyMSwwIC8qIHB0X3JlZ3MgKi8KKworCWwuaiAgICAgX3JldF9mcm9tX2V4Y2VwdGlvbgorCSBsLm5vcAorCisvKiAtLS1bIDB4MzAwOiBEYXRhIFBhZ2UgRmF1bHQgZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0VYQ0VQVElPTl9FTlRSWShfZGF0YV9wYWdlX2ZhdWx0X2hhbmRsZXIpCisJLyogc2V0IHVwIHBhcmFtZXRlcnMgZm9yIGRvX3BhZ2VfZmF1bHQgKi8KKwlsLmFkZGkgIHIzLHIxLDAgICAgICAgICAgICAgICAgICAgIC8vIHB0X3JlZ3MKKwkvKiByNCBzZXQgYmUgRVhDRVBUSU9OX0hBTkRMRSAqLyAgIC8vIGVmZmVjdGl2ZSBhZGRyZXNzIG9mIGZhdWx0CisJbC5vcmkgICByNSxyMCwweDMwMCAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gdmVjdG9yCisKKwkvKgorCSAqIF9fUEhYX186IFRPRE8KKwkgKgorCSAqIGFsbCB0aGlzIGNhbiBiZSB3cml0dGVuIG11Y2ggc2ltcGxlci4gbG9vayBhdAorCSAqIERUTEIgbWlzcyBoYW5kbGVyIGluIHRoZSBDT05GSUdfR1VBUkRfUFJPVEVDVEVEX0NPUkUgcGFydAorCSAqLworI2lmZGVmIENPTkZJR19PUEVOUklTQ19OT19TUFJfU1JfRFNYCisJbC5sd3ogICByNixQVF9QQyhyMykgICAgICAgICAgICAgICAgICAvLyBhZGRyZXNzIG9mIGFuIG9mZmVuZGluZyBpbnNuCisJbC5sd3ogICByNiwwKHI2KSAgICAgICAgICAgICAgICAgICAvLyBpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZCBwZgorCisJbC5zcmxpICByNixyNiwyNiAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBvcGNvZGUgZm9yIGp1bXAgaW5zbgorCWwuc2ZlcWkgcjYsMCAgICAgICAgICAgICAgICAgICAgICAgLy8gbC5qCisJbC5iZiAgICA4ZgorCWwuc2ZlcWkgcjYsMSAgICAgICAgICAgICAgICAgICAgICAgLy8gbC5qYWwKKwlsLmJmICAgIDhmCisJbC5zZmVxaSByNiwzICAgICAgICAgICAgICAgICAgICAgICAvLyBsLmJuZgorCWwuYmYgICAgOGYKKwlsLnNmZXFpIHI2LDQgICAgICAgICAgICAgICAgICAgICAgIC8vIGwuYmYKKwlsLmJmICAgIDhmCisJbC5zZmVxaSByNiwweDExICAgICAgICAgICAgICAgICAgICAvLyBsLmpyCisJbC5iZiAgICA4ZgorCWwuc2ZlcWkgcjYsMHgxMiAgICAgICAgICAgICAgICAgICAgLy8gbC5qYWxyCisJbC5iZiAgICA4ZgorCisJbC5ub3AKKworCWwuaiAgICAgOWYKKwlsLm5vcAorODoKKworCWwubHd6ICAgcjYsUFRfUEMocjMpICAgICAgICAgICAgICAgICAgLy8gYWRkcmVzcyBvZiBhbiBvZmZlbmRpbmcgaW5zbgorCWwuYWRkaSAgcjYscjYsNAorCWwubHd6ICAgcjYsMChyNikgICAgICAgICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb24gdGhhdCBjYXVzZWQgcGYKKwlsLnNybGkgIHI2LHI2LDI2ICAgICAgICAgICAgICAgICAgIC8vIGdldCBvcGNvZGUKKzk6CisKKyNlbHNlCisKKwlsLm1mc3ByIHI2LHIwLFNQUl9TUgkJICAgLy8gU1IKKy8vCWwubHd6CXI2LFBUX1NSKHIzKQkJICAgLy8gRVNSCisJbC5hbmRpCXI2LHI2LFNQUl9TUl9EU1gJICAgLy8gY2hlY2sgZm9yIGRlbGF5IHNsb3QgZXhjZXB0aW9uCisJbC5zZmVxaQlyNiwweDEJCQkgICAvLyBleGNlcHRpb24gaGFwcGVuZWQgaW4gZGVsYXkgc2xvdAorCWwuYm5mCTdmCisJbC5sd3oJcjYsUFRfUEMocjMpCQkgICAvLyBhZGRyZXNzIG9mIGFuIG9mZmVuZGluZyBpbnNuCisKKwlsLmFkZGkJcjYscjYsNAkJCSAgIC8vIG9mZmVuZGluZyBpbnNuIGlzIGluIGRlbGF5IHNsb3QKKzc6CisJbC5sd3ogICByNiwwKHI2KSAgICAgICAgICAgICAgICAgICAvLyBpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZCBwZgorCWwuc3JsaSAgcjYscjYsMjYgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgb3Bjb2RlIGZvciB3cml0ZSBhY2Nlc3MKKyNlbmRpZgorCisJbC5zZmdldWkgcjYsMHgzNAkJICAgLy8gY2hlY2sgb3Bjb2RlIGZvciB3cml0ZSBhY2Nlc3MKKwlsLmJuZiAgIDFmCisJbC5zZmxldWkgcjYsMHgzNworCWwuYm5mICAgMWYKKwlsLm9yaSAgIHI2LHIwLDB4MSAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGFjY2VzcworCWwuaiAgICAgMmYKKwlsLm5vcAorMToJbC5vcmkgICByNixyMCwweDAgICAgICAgICAgICAgICAgICAvLyAhd3JpdGUgYWNjZXNzCisyOgorCisJLyogY2FsbCBmYXVsdC5jIGhhbmRsZXIgaW4gb3IzMi9tbS9mYXVsdC5jICovCisJbC5qYWwgICBkb19wYWdlX2ZhdWx0CisJbC5ub3AKKwlsLmogICAgIF9yZXRfZnJvbV9leGNlcHRpb24KKwlsLm5vcAorCisvKiAtLS1bIDB4NDAwOiBJbnNuIFBhZ2UgRmF1bHQgZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0VYQ0VQVElPTl9FTlRSWShfaW5zbl9wYWdlX2ZhdWx0X2hhbmRsZXIpCisJLyogc2V0IHVwIHBhcmFtZXRlcnMgZm9yIGRvX3BhZ2VfZmF1bHQgKi8KKwlsLmFkZGkgIHIzLHIxLDAgICAgICAgICAgICAgICAgICAgIC8vIHB0X3JlZ3MKKwkvKiByNCBzZXQgYmUgRVhDRVBUSU9OX0hBTkRMRSAqLyAgIC8vIGVmZmVjdGl2ZSBhZGRyZXNzIG9mIGZhdWx0CisJbC5vcmkgICByNSxyMCwweDQwMCAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gdmVjdG9yCisJbC5vcmkJcjYscjAsMHgwCQkgICAvLyAhd3JpdGUgYWNjZXNzCisKKwkvKiBjYWxsIGZhdWx0LmMgaGFuZGxlciBpbiBvcjMyL21tL2ZhdWx0LmMgKi8KKwlsLmphbCAgIGRvX3BhZ2VfZmF1bHQKKwlsLm5vcAorCWwuaiAgICAgX3JldF9mcm9tX2V4Y2VwdGlvbgorCWwubm9wCisKKworLyogLS0tWyAweDUwMDogVGltZXIgZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitFWENFUFRJT05fRU5UUlkoX3RpbWVyX2hhbmRsZXIpCisJbC5qYWwJdGltZXJfaW50ZXJydXB0CisJIGwuYWRkaSByMyxyMSwwIC8qIHB0X3JlZ3MgKi8KKworCWwuaiAgICBfcmV0X2Zyb21faW50cgorCSBsLm5vcAorCisvKiAtLS1bIDB4NjAwOiBBbGlnbWVudCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0VYQ0VQVElPTl9FTlRSWShfYWxpZ25tZW50X2hhbmRsZXIpCisJLyogcjQ6IEVBIG9mIGZhdWx0IChzZXQgYnkgRVhDRVBUSU9OX0hBTkRMRSkgKi8KKwlsLmphbCAgIGRvX3VuYWxpZ25lZF9hY2Nlc3MKKwkgbC5hZGRpICByMyxyMSwwIC8qIHB0X3JlZ3MgKi8KKworCWwuaiAgICAgX3JldF9mcm9tX2V4Y2VwdGlvbgorCSBsLm5vcAorCisjaWYgMAorRVhDRVBUSU9OX0VOVFJZKF9hbGlnbWVudF9oYW5kbGVyKQorLy8gICAgICAgIGwubWZzcHIgcjIscjAsU1BSX0VFQVJfQkFTRSAgICAgLyogTG9hZCB0aGUgZWZlY3RpdmUgYWRkcmVzICovCisJbC5hZGRpCXIyLHI0LDAKKy8vICAgICAgICBsLm1mc3ByIHI1LHIwLFNQUl9FUENSX0JBU0UgICAgIC8qIExvYWQgdGhlIGluc24gYWRkcmVzcyAqLworCWwubHd6ICAgcjUsUFRfUEMocjEpCisKKwlsLmx3eiAgIHIzLDAocjUpICAgICAgICAgICAgICAgIC8qIExvYWQgaW5zbiAqLworCWwuc3JsaSAgcjQscjMsMjYgICAgICAgICAgICAgICAgLyogU2hpZnQgbGVmdCB0byBnZXQgdGhlIGluc24gb3Bjb2RlICovCisKKwlsLnNmZXFpIHI0LDB4MDAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBsb2FkL3N0b3JlIGluc24gaXMgaW4gZGVsYXkgc2xvdCAqLworCWwuYmYgICAgam1wCisJbC5zZmVxaSByNCwweDAxCisJbC5iZiAgICBqbXAKKwlsLnNmZXFpIHI0LDB4MDMKKwlsLmJmICAgIGptcAorCWwuc2ZlcWkgcjQsMHgwNAorCWwuYmYgICAgam1wCisJbC5zZmVxaSByNCwweDExCisJbC5iZiAgICBqcgorCWwuc2ZlcWkgcjQsMHgxMgorCWwuYmYgICAganIKKwlsLm5vcAorCWwuaiAgICAgMWYKKwlsLmFkZGkgIHI1LHI1LDQgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBQQyB0byBnZXQgcmV0dXJuIGluc24gYWRkcmVzcyAqLworCitqbXA6CisJbC5zbGxpICByNCxyMyw2ICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNpZ25lZCBleHRlbmRlZCBqdW1wIGxlbmd0aCAqLworCWwuc3JhaSAgcjQscjQsNAorCisJbC5sd3ogICByMyw0KHI1KSAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSByZWFsIGxvYWQvc3RvcmUgaW5zbiAqLworCisJbC5hZGQgICByNSxyNSxyNCAgICAgICAgICAgICAgICAvKiBDYWxjdWxhdGUganVtcCB0YXJnZXQgYWRkcmVzcyAqLworCisJbC5qICAgICAxZgorCWwuc3JsaSAgcjQscjMsMjYgICAgICAgICAgICAgICAgLyogU2hpZnQgbGVmdCB0byBnZXQgdGhlIGluc24gb3Bjb2RlICovCisKK2pyOgorCWwuc2xsaSAgcjQscjMsOSAgICAgICAgICAgICAgICAgLyogU2hpZnQgdG8gZ2V0IHRoZSByZWcgbmIgKi8KKwlsLmFuZGkgIHI0LHI0LDB4N2MKKworCWwubHd6ICAgcjMsNChyNSkgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgcmVhbCBsb2FkL3N0b3JlIGluc24gKi8KKworCWwuYWRkICAgcjQscjQscjEgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUganVtcCByZWdpc3RlciB2YWx1ZSBmcm9tIHRoZSBzdGFjayAqLworCWwubHd6ICAgcjUsMChyNCkKKworCWwuc3JsaSAgcjQscjMsMjYgICAgICAgICAgICAgICAgLyogU2hpZnQgbGVmdCB0byBnZXQgdGhlIGluc24gb3Bjb2RlICovCisKKworMToKKy8vCSAgbC5tdHNwciByMCxyNSxTUFJfRVBDUl9CQVNFCisJbC5zdwlQVF9QQyhyMSkscjUKKworCWwuc2ZlcWkgcjQsMHgyNgorCWwuYmYgICAgbGhzCisJbC5zZmVxaSByNCwweDI1CisJbC5iZiAgICBsaHoKKwlsLnNmZXFpIHI0LDB4MjIKKwlsLmJmICAgIGx3cworCWwuc2ZlcWkgcjQsMHgyMQorCWwuYmYgICAgbHd6CisJbC5zZmVxaSByNCwweDM3CisJbC5iZiAgICBzaAorCWwuc2ZlcWkgcjQsMHgzNQorCWwuYmYgICAgc3cKKwlsLm5vcAorCisxOiAgICAgIGwuaiAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgLyogSSBkb24ndCBrbm93IHdoYXQgdG8gZG8gKi8KKwlsLm5vcAorCitsaHM6ICAgIGwubGJzICAgcjUsMChyMikKKwlsLnNsbGkgIHI1LHI1LDgKKwlsLmxieiAgIHI2LDEocjIpCisJbC5vciAgICByNSxyNSxyNgorCWwuc3JsaSAgcjQscjMsMTkKKwlsLmFuZGkgIHI0LHI0LDB4N2MKKwlsLmFkZCAgIHI0LHI0LHIxCisJbC5qICAgICBhbGlnbl9lbmQKKwlsLnN3ICAgIDAocjQpLHI1CisKK2xoejogICAgbC5sYnogICByNSwwKHIyKQorCWwuc2xsaSAgcjUscjUsOAorCWwubGJ6ICAgcjYsMShyMikKKwlsLm9yICAgIHI1LHI1LHI2CisJbC5zcmxpICByNCxyMywxOQorCWwuYW5kaSAgcjQscjQsMHg3YworCWwuYWRkICAgcjQscjQscjEKKwlsLmogICAgIGFsaWduX2VuZAorCWwuc3cgICAgMChyNCkscjUKKworbHdzOiAgICBsLmxicyAgIHI1LDAocjIpCisJbC5zbGxpICByNSxyNSwyNAorCWwubGJ6ICAgcjYsMShyMikKKwlsLnNsbGkgIHI2LHI2LDE2CisJbC5vciAgICByNSxyNSxyNgorCWwubGJ6ICAgcjYsMihyMikKKwlsLnNsbGkgIHI2LHI2LDgKKwlsLm9yICAgIHI1LHI1LHI2CisJbC5sYnogICByNiwzKHIyKQorCWwub3IgICAgcjUscjUscjYKKwlsLnNybGkgIHI0LHIzLDE5CisJbC5hbmRpICByNCxyNCwweDdjCisJbC5hZGQgICByNCxyNCxyMQorCWwuaiAgICAgYWxpZ25fZW5kCisJbC5zdyAgICAwKHI0KSxyNQorCitsd3o6ICAgIGwubGJ6ICAgcjUsMChyMikKKwlsLnNsbGkgIHI1LHI1LDI0CisJbC5sYnogICByNiwxKHIyKQorCWwuc2xsaSAgcjYscjYsMTYKKwlsLm9yICAgIHI1LHI1LHI2CisJbC5sYnogICByNiwyKHIyKQorCWwuc2xsaSAgcjYscjYsOAorCWwub3IgICAgcjUscjUscjYKKwlsLmxieiAgIHI2LDMocjIpCisJbC5vciAgICByNSxyNSxyNgorCWwuc3JsaSAgcjQscjMsMTkKKwlsLmFuZGkgIHI0LHI0LDB4N2MKKwlsLmFkZCAgIHI0LHI0LHIxCisJbC5qICAgICBhbGlnbl9lbmQKKwlsLnN3ICAgIDAocjQpLHI1CisKK3NoOgorCWwuc3JsaSAgcjQscjMsOQorCWwuYW5kaSAgcjQscjQsMHg3YworCWwuYWRkICAgcjQscjQscjEKKwlsLmx3eiAgIHI1LDAocjQpCisJbC5zYiAgICAxKHIyKSxyNQorCWwuc3JsaSAgcjUscjUsOAorCWwuaiAgICAgYWxpZ25fZW5kCisJbC5zYiAgICAwKHIyKSxyNQorCitzdzoKKwlsLnNybGkgIHI0LHIzLDkKKwlsLmFuZGkgIHI0LHI0LDB4N2MKKwlsLmFkZCAgIHI0LHI0LHIxCisJbC5sd3ogICByNSwwKHI0KQorCWwuc2IgICAgMyhyMikscjUKKwlsLnNybGkgIHI1LHI1LDgKKwlsLnNiICAgIDIocjIpLHI1CisJbC5zcmxpICByNSxyNSw4CisJbC5zYiAgICAxKHIyKSxyNQorCWwuc3JsaSAgcjUscjUsOAorCWwuaiAgICAgYWxpZ25fZW5kCisJbC5zYiAgICAwKHIyKSxyNQorCithbGlnbl9lbmQ6CisJbC5qICAgIF9yZXRfZnJvbV9pbnRyCisJbC5ub3AKKyNlbmRpZgorCisvKiAtLS1bIDB4NzAwOiBJbGxlZ2FsIGluc24gZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0VYQ0VQVElPTl9FTlRSWShfaWxsZWdhbF9pbnN0cnVjdGlvbl9oYW5kbGVyKQorCS8qIHI0OiBFQSBvZiBmYXVsdCAoc2V0IGJ5IEVYQ0VQVElPTl9IQU5ETEUpICovCisJbC5qYWwgICBkb19pbGxlZ2FsX2luc3RydWN0aW9uCisJIGwuYWRkaSAgcjMscjEsMCAvKiBwdF9yZWdzICovCisKKwlsLmogICAgIF9yZXRfZnJvbV9leGNlcHRpb24KKwkgbC5ub3AKKworLyogLS0tWyAweDgwMDogRXh0ZXJuYWwgaW50ZXJydXB0IGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitFWENFUFRJT05fRU5UUlkoX2V4dGVybmFsX2lycV9oYW5kbGVyKQorI2lmZGVmIENPTkZJR19PUEVOUklTQ19FU1JfRVhDRVBUSU9OX0JVR19DSEVDSworCWwubHd6CXI0LFBUX1NSKHIxKQkJLy8gd2VyZSBpbnRlcnJ1cHRzIGVuYWJsZWQgPworCWwuYW5kaQlyNCxyNCxTUFJfU1JfSUVFCisJbC5zZmVxaQlyNCwwCisJbC5ibmYJMWYJCQkvLyBleHQgaXJxIGVuYWJsZWQsIGFsbCBvay4KKwlsLm5vcAorCisJbC5hZGRpICByMSxyMSwtMHg4CisJbC5tb3ZoaSByMyxoaSg0MmYpCisJbC5vcmkJcjMscjMsbG8oNDJmKQorCWwuc3cgICAgMHgwKHIxKSxyMworCWwuamFsICAgcHJpbnRrCisJbC5zdyAgICAweDQocjEpLHI0CisJbC5hZGRpICByMSxyMSwweDgKKworCS5zZWN0aW9uIC5yb2RhdGEsICJhIgorNDI6CisJCS5zdHJpbmcgIlxuXHJFU1IgaW50ZXJydXB0IGJ1ZzogaW4gX2V4dGVybmFsX2lycV9oYW5kbGVyIChFU1IgJXgpXG5cciIKKwkJLmFsaWduIDQKKwkucHJldmlvdXMKKworCWwub3JpCXI0LHI0LFNQUl9TUl9JRUUJLy8gZml4IHRoZSBidWcKKy8vCWwuc3cJUFRfU1IocjEpLHI0CisxOgorI2VuZGlmCisJbC5hZGRpCXIzLHIxLDAKKwlsLm1vdmhpCXI4LGhpKGRvX0lSUSkKKwlsLm9yaQlyOCxyOCxsbyhkb19JUlEpCisJbC5qYWxyIHI4CisJbC5ub3AKKwlsLmogICAgX3JldF9mcm9tX2ludHIKKwlsLm5vcAorCisvKiAtLS1bIDB4OTAwOiBEVExCIG1pc3MgZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogLS0tWyAweGEwMDogSVRMQiBtaXNzIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLVsgMHhiMDA6IFJhbmdlIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworVU5IQU5ETEVEX0VYQ0VQVElPTihfdmVjdG9yXzB4YjAwLDB4YjAwKQorCisvKiAtLS1bIDB4YzAwOiBTeXNjYWxsIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBTeXNjYWxscyBhcmUgYSBzcGVjaWFsIHR5cGUgb2YgZXhjZXB0aW9uIGluIHRoYXQgdGhleSBhcmUKKyAqIF9leHBsaWNpdGx5XyBpbnZva2VkIGJ5IHVzZXJzcGFjZSBhbmQgY2FuIHRoZXJlZm9yZSBiZQorICogaGVsZCB0byBjb25mb3JtIHRvIHRoZSBzYW1lIEFCSSBhcyBub3JtYWwgZnVuY3Rpb25zIHdpdGgKKyAqIHJlc3BlY3QgdG8gd2hldGhlciByZWdpc3RlcnMgYXJlIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGwKKyAqIG9yIG5vdC4KKyAqLworCisvKiBVcG9uIHN5c2NhbGwgZW50cnkgd2UganVzdCBzYXZlIHRoZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzCisgKiBhbmQgbm90IHRoZSBjYWxsLWNsb2JiZXJlZCBvbmVzLgorICovCisKK19zdHJpbmdfc3lzY2FsbF9yZXR1cm46CisJLnN0cmluZyAic3lzY2FsbCByZXR1cm4gJWxkIFxuXHJcMCIKKwkuYWxpZ24gNAorCitFTlRSWShfc3lzX2NhbGxfaGFuZGxlcikKKwkvKiBzeXNjYWxscyBydW4gd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KKwlFTkFCTEVfSU5URVJSVVBUUyhyMjkpCQkvLyBlbmFibGUgaW50ZXJydXB0cywgcjI5IGlzIHRlbXAKKworCS8qIHIxLCBFUENSLCBFU1IgYSBhbHJlYWR5IHNhdmVkICovCisJbC5zdwlQVF9HUFIyKHIxKSxyMgorCS8qIHIzLXI4IG11c3QgYmUgc2F2ZWQgYmVjYXVzZSBzeXNjYWxsIHJlc3RhcnQgcmVsaWVzCisJICogb24gdXMgYmVpbmcgYWJsZSB0byByZXN0YXJ0IHRoZSBzeXNjYWxsIGFyZ3MuLi4gdGVjaG5pY2FsbHkKKwkgKiB0aGV5IHNob3VsZCBiZSBjbG9iYmVyZWQsIG90aGVyd2lzZQorCSAqLworCWwuc3cgICAgUFRfR1BSMyhyMSkscjMKKwkvKiByNCBhbHJlYWR5IHNhdmVkICovCisJLyogcjQgaG9sZHMgdGhlIEVFQVIgYWRkcmVzcyBvZiB0aGUgZmF1bHQsIGxvYWQgdGhlIG9yaWdpbmFsIHI0ICovCisJbC5sd3oJcjQsUFRfR1BSNChyMSkKKwlsLnN3ICAgIFBUX0dQUjUocjEpLHI1CisJbC5zdyAgICBQVF9HUFI2KHIxKSxyNgorCWwuc3cgICAgUFRfR1BSNyhyMSkscjcKKwlsLnN3ICAgIFBUX0dQUjgocjEpLHI4CisJbC5zdyAgICBQVF9HUFI5KHIxKSxyOQorCS8qIHIxMCBhbHJlYWR5IHNhdmVkICovCisJbC5zdyAgICBQVF9HUFIxMShyMSkscjExCisJbC5zdyAgICBQVF9PUklHX0dQUjExKHIxKSxyMTEKKwkvKiByMTIscjEzIGFscmVhZHkgc2F2ZWQgKi8KKworCS8qIHIxNC1yMjggKGV2ZW4pIGFyZW4ndCB0b3VjaGVkIGJ5IHRoZSBzeXNjYWxsIGZhc3QgcGF0aCBiZWxvdworCSAqIHNvIHdlIGRvbid0IG5lZWQgdG8gc2F2ZSB0aGVtLiAgSG93ZXZlciwgdGhlIGZ1bmN0aW9ucyB0aGF0IHJldHVybgorCSAqIHRvIHVzZXJzcGFjZSB2aWEgYSBjYWxsIHRvIHN3aXRjaCgpIERPIG5lZWQgdG8gc2F2ZSB0aGVzZSBiZWNhdXNlCisJICogc3dpdGNoKCkgZWZmZWN0aXZlbHkgY2xvYmJlcnMgdGhlbS4uLiBzYXZpbmcgdGhlc2UgcmVnaXN0ZXJzIGZvcgorCSAqIHN1Y2ggZnVuY3Rpb25zIGlzIGhhbmRsZWQgaW4gdGhlaXIgc3lzY2FsbCB3cmFwcGVycyAoc2VlIGZvcmssIHZmb3JrLAorCSAqIGFuZCBjbG9uZSwgYmVsb3cpLgorCisJLyogcjMwIGlzIHRoZSBvbmx5IHJlZ2lzdGVyIHdlIGNsb2JiZXIgaW4gdGhlIGZhc3QgcGF0aCAqLworCS8qIHIzMCBhbHJlYWR5IHNhdmVkICovCisvKglsLnN3ICAgIFBUX0dQUjMwKHIxKSxyMzAgKi8KKwkvKiBUaGlzIGlzIHVzZWQgYnkgZG9fc2lnbmFsIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGNoZWNrIGZvcgorCSAqIHN5c2NhbGwgcmVzdGFydCBvciBub3QgKi8KKwlsLnN3ICAgIFBUX1NZU0NBTExOTyhyMSkscjExCisKK19zeXNjYWxsX2NoZWNrX3RyYWNlX2VudGVyOgorCS8qIElmIFRJRl9TWVNDQUxMX1RSQUNFIGlzIHNldCwgdGhlbiB3ZSB3YW50IHRvIGRvIHN5c2NhbGwgdHJhY2luZyAqLworCWwubHd6CXIzMCxUSV9GTEFHUyhyMTApCisJbC5hbmRpCXIzMCxyMzAsX1RJRl9TWVNDQUxMX1RSQUNFCisJbC5zZm5lCXIzMCxyMAorCWwuYmYJX3N5c2NhbGxfdHJhY2VfZW50ZXIKKwkgbC5ub3AKKworX3N5c2NhbGxfY2hlY2s6CisJLyogRW5zdXJlIHRoYXQgdGhlIHN5c2NhbGwgbnVtYmVyIGlzIHJlYXNvbmFibGUgKi8KKwlsLnNmZ2V1aSByMTEsX19OUl9zeXNjYWxscworCWwuYmYJX3N5c2NhbGxfYmFkc3lzCisJIGwubm9wCisKK19zeXNjYWxsX2NhbGw6CisJbC5tb3ZoaSByMjksaGkoc3lzX2NhbGxfdGFibGUpCisJbC5vcmkgICByMjkscjI5LGxvKHN5c19jYWxsX3RhYmxlKQorCWwuc2xsaSAgcjExLHIxMSwyCisJbC5hZGQgICByMjkscjI5LHIxMQorCWwubHd6ICAgcjI5LDAocjI5KQorCisJbC5qYWxyICByMjkKKwkgbC5ub3AKKworX3N5c2NhbGxfcmV0dXJuOgorCS8qIEFsbCBzeXNjYWxscyByZXR1cm4gaGVyZS4uLiBqdXN0IHBheSBhdHRlbnRpb24gdG8gcmV0X2Zyb21fZm9yaworCSAqIHdoaWNoIGRvZXMgaXQgaW4gYSByb3VuZC1hYm91dCB3YXkuCisJICovCisJbC5zdyAgICBQVF9HUFIxMShyMSkscjExICAgICAgICAgICAvLyBzYXZlIHJldHVybiB2YWx1ZQorCisjaWYgMAorX3N5c2NhbGxfZGVidWc6CisJbC5tb3ZoaSByMyxoaShfc3RyaW5nX3N5c2NhbGxfcmV0dXJuKQorCWwub3JpICAgcjMscjMsbG8oX3N0cmluZ19zeXNjYWxsX3JldHVybikKKwlsLm9yaSAgIHIyNyxyMCwxCisJbC5zdyAgICAtNChyMSkscjI3CisJbC5zdyAgICAtOChyMSkscjExCisJbC5hZGRpICByMSxyMSwtOAorCWwubW92aGkgcjI3LGhpKHByaW50aykKKwlsLm9yaSAgIHIyNyxyMjcsbG8ocHJpbnRrKQorCWwuamFsciAgcjI3CisJIGwubm9wCisJbC5hZGRpICByMSxyMSw4CisjZW5kaWYKKworX3N5c2NhbGxfY2hlY2tfdHJhY2VfbGVhdmU6CisJLyogcjMwIGlzIGEgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyIHNvIHRoaXMgc2hvdWxkIHN0aWxsIGhvbGQgdGhlCisJICogX1RJRl9TWVNDQUxMX1RSQUNFIGZsYWcgZnJvbSBfc3lzY2FsbF9jaGVja190cmFjZV9lbnRlciBhYm92ZS4uLgorCSAqIF9zeXNjYWxsX3RyYWNlX2xlYXZlIGV4cGVjdHMgc3lzY2FsbCByZXN1bHQgdG8gYmUgaW4gcHRfcmVncy0+cjExLgorCSAqLworCWwuc2ZuZQlyMzAscjAKKwlsLmJmCV9zeXNjYWxsX3RyYWNlX2xlYXZlCisJIGwubm9wCisKKy8qIFRoaXMgaXMgd2hlcmUgdGhlIGV4Y2VwdGlvbi1yZXR1cm4gY29kZSBiZWdpbnMuLi4gaW50ZXJydXB0cyBuZWVkIHRvIGJlCisgKiBkaXNhYmxlZCB0aGUgcmVzdCBvZiB0aGUgd2F5IGhlcmUgYmVjYXVzZSB3ZSBjYW4ndCBhZmZvcmQgdG8gbWlzcyBhbnkKKyAqIGludGVycnVwdHMgdGhhdCBzZXQgTkVFRF9SRVNDSEVEIG9yIFNJR05BTFBFTkRJTkcuLi4gcmVhbGx5IHRydWU/ICovCisKK19zeXNjYWxsX2NoZWNrX3dvcms6CisJLyogSGVyZSB3ZSBuZWVkIHRvIGRpc2FibGUgaW50ZXJydXB0cyAqLworCURJU0FCTEVfSU5URVJSVVBUUyhyMjcscjI5KQorCWwubHd6CXIzMCxUSV9GTEFHUyhyMTApCisJbC5hbmRpCXIzMCxyMzAsX1RJRl9XT1JLX01BU0sKKwlsLnNmbmUJcjMwLHIwCisKKwlsLmJuZglfc3lzY2FsbF9yZXN1bWVfdXNlcnNwYWNlCisJIGwubm9wCisKKwkvKiBXb3JrIHBlbmRpbmcgZm9sbG93cyBhIGRpZmZlcmVudCByZXR1cm4gcGF0aCwgc28gd2UgbmVlZCB0bworCSAqIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgY2FsbC1zYXZlZCByZWdpc3RlcnMgZ2V0IGludG8gcHRfcmVncworCSAqIGJlZm9yZSBicmFuY2hpbmcuLi4KKwkgKi8KKwlsLnN3ICAgIFBUX0dQUjE0KHIxKSxyMTQKKwlsLnN3ICAgIFBUX0dQUjE2KHIxKSxyMTYKKwlsLnN3ICAgIFBUX0dQUjE4KHIxKSxyMTgKKwlsLnN3ICAgIFBUX0dQUjIwKHIxKSxyMjAKKwlsLnN3ICAgIFBUX0dQUjIyKHIxKSxyMjIKKwlsLnN3ICAgIFBUX0dQUjI0KHIxKSxyMjQKKwlsLnN3ICAgIFBUX0dQUjI2KHIxKSxyMjYKKwlsLnN3ICAgIFBUX0dQUjI4KHIxKSxyMjgKKworCS8qIF93b3JrX3BlbmRpbmcgbmVlZHMgdG8gYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLworCWwuaglfd29ya19wZW5kaW5nCisJIGwubm9wCisKK19zeXNjYWxsX3Jlc3VtZV91c2Vyc3BhY2U6CisvLwlFTkFCTEVfSU5URVJSVVBUUyhyMjkpCisKKworLyogVGhpcyBpcyB0aGUgaG90IHBhdGggZm9yIHJldHVybmluZyB0byB1c2Vyc3BhY2UgZnJvbSBhIHN5c2NhbGwuICBJZiB0aGVyZSdzCisgKiB3b3JrIHRvIGJlIGRvbmUgYW5kIHRoZSBicmFuY2ggdG8gX3dvcmtfcGVuZGluZyB3YXMgdGFrZW4gYWJvdmUsIHRoZW4gdGhlCisgKiByZXR1cm4gdG8gdXNlcnNwYWNlIHdpbGwgYmUgZG9uZSB2aWEgdGhlIG5vcm1hbCBleGNlcHRpb24gcmV0dXJuIHBhdGguLi4KKyAqIHRoYXQgcGF0aCByZXN0b3JlcyBfYWxsXyByZWdpc3RlcnMgYW5kIHdpbGwgb3ZlcndyaXRlIHRoZSAiY2xvYmJlcmVkIgorICogcmVnaXN0ZXJzIHdpdGggd2hhdGV2ZXIgZ2FyYmFnZSBpcyBpbiBwdF9yZWdzIC0tIHRoYXQncyBPSyBiZWNhdXNlIHRob3NlCisgKiByZWdpc3RlcnMgYXJlIGNsb2JiZXJlZCBhbnl3YXkgYW5kIGJlY2F1c2UgdGhlIGV4dHJhIHdvcmsgaXMgaW5zaWduaWZpY2FudAorICogaW4gdGhlIGNvbnRleHQgb2YgdGhlIGV4dHJhIHdvcmsgdGhhdCBfd29ya19wZW5kaW5nIGlzIGRvaW5nLgorCisvKiBPbmNlIGFnYWluLCBzeXNjYWxscyBhcmUgc3BlY2lhbCBhbmQgb25seSBndWFyYW50ZWUgdG8gcHJlc2VydmUgdGhlCisgKiBzYW1lIHJlZ2lzdGVycyBhcyBhIG5vcm1hbCBmdW5jdGlvbiBjYWxsICovCisKKy8qIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB0aGUgcmVnaXN0ZXJzIHIxNC1yMjggKGV2ZW4pIGFyZSB1bnRvdWNoZWQgYW5kCisgKiBkb24ndCBuZWVkIHRvIGJlIHJlc3RvcmVkLi4uIGJlIHN1cmUgdGhhdCB0aGF0J3MgcmVhbGx5IHRoZSBjYXNlIQorICovCisKKy8qIFRoaXMgaXMgc3RpbGwgdG9vIG11Y2guLi4gd2Ugc2hvdWxkIG9ubHkgYmUgcmVzdG9yaW5nIHdoYXQgd2UgYWN0dWFsbHkKKyAqIGNsb2JiZXJlZC4uLiB3ZSBzaG91bGQgZXZlbiBiZSB1c2luZyAnc2NyYXRjaCcgKG9kZCkgcmVncyBhYm92ZSBzbyB0aGF0CisgKiB3ZSBkb24ndCBuZWVkIHRvIHJlc3RvcmUgYW55dGhpbmcsIGhhcmRseS4uLgorICovCisKKwlsLmx3eglyMixQVF9HUFIyKHIxKQorCisJLyogUmVzdG9yZSBhcmdzICovCisJLyogcjMtcjggYXJlIHRlY2huaWNhbGx5IGNsb2JiZXJlZCwgYnV0IHN5c2NhbGwgcmVzdGFydCBuZWVkcyB0aGVzZQorCSAqIHRvIGJlIHJlc3RvcmVkLi4uCisJICovCisJbC5sd3oJcjMsUFRfR1BSMyhyMSkKKwlsLmx3eglyNCxQVF9HUFI0KHIxKQorCWwubHd6CXI1LFBUX0dQUjUocjEpCisJbC5sd3oJcjYsUFRfR1BSNihyMSkKKwlsLmx3eglyNyxQVF9HUFI3KHIxKQorCWwubHd6CXI4LFBUX0dQUjgocjEpCisKKwlsLmx3eglyOSxQVF9HUFI5KHIxKQorCWwubHd6CXIxMCxQVF9HUFIxMChyMSkKKwlsLmx3eglyMTEsUFRfR1BSMTEocjEpCisKKwkvKiByMzAgaXMgdGhlIG9ubHkgcmVnaXN0ZXIgd2UgY2xvYmJlciBpbiB0aGUgZmFzdCBwYXRoICovCisJbC5sd3oJcjMwLFBUX0dQUjMwKHIxKQorCisJLyogSGVyZSB3ZSB1c2UgcjEzLXIxOSAob2RkKSBhcyBzY3JhdGNoIHJlZ3MgKi8KKwlsLmx3eiAgIHIxMyxQVF9QQyhyMSkKKwlsLmx3eiAgIHIxNSxQVF9TUihyMSkKKwlsLmx3eglyMSxQVF9TUChyMSkKKwkvKiBJbnRlcnJ1cHRzIG5lZWQgdG8gYmUgZGlzYWJsZWQgZm9yIHNldHRpbmcgRVBDUiBhbmQgRVNSCisJICogc28gdGhhdCBhbm90aGVyIGludGVycnVwdCBkb2Vzbid0IGNvbWUgaW4gaGVyZSBhbmQgY2xvYmJlcgorCSAqIHRoZW0gYmVmb3JlIHdlIGNhbiB1c2UgdGhlbSBmb3Igb3VyIGwucmZlICovCisJRElTQUJMRV9JTlRFUlJVUFRTKHIxNyxyMTkpCisJbC5tdHNwciByMCxyMTMsU1BSX0VQQ1JfQkFTRQorCWwubXRzcHIgcjAscjE1LFNQUl9FU1JfQkFTRQorCWwucmZlCisKKy8qIEVuZCBvZiBob3QgcGF0aCEKKyAqIEtlZXAgdGhlIGJlbG93IHRyYWNpbmcgYW5kIGVycm9yIGhhbmRsaW5nIG91dCBvZiB0aGUgaG90IHBhdGguLi4KKyovCisKK19zeXNjYWxsX3RyYWNlX2VudGVyOgorCS8qIEhlcmUgd2UgcGFzcyBwdF9yZWdzIHRvIGRvX3N5c2NhbGxfdHJhY2VfZW50ZXIuICBNYWtlIHN1cmUKKwkgKiB0aGF0IGZ1bmN0aW9uIGlzIHJlYWxseSBnZXR0aW5nIGFsbCB0aGUgaW5mbyBpdCBuZWVkcyBhcworCSAqIHB0X3JlZ3MgaXNuJ3QgYSBjb21wbGV0ZSBzZXQgb2YgdXNlcnNwYWNlIHJlZ3MsIGp1c3QgdGhlCisJICogb25lcyByZWxldmFudCB0byB0aGUgc3lzY2FsbC4uLgorCSAqCisJICogTm90ZSB1c2Ugb2YgZGVsYXkgc2xvdCBmb3Igc2V0dGluZyBhcmd1bWVudC4KKwkgKi8KKwlsLmphbAlkb19zeXNjYWxsX3RyYWNlX2VudGVyCisJIGwuYWRkaQlyMyxyMSwwCisKKwkvKiBSZXN0b3JlIGFyZ3VtZW50cyAobm90IHByZXNlcnZlZCBhY3Jvc3MgZG9fc3lzY2FsbF90cmFjZV9lbnRlcikKKwkgKiBzbyB0aGF0IHdlIGNhbiBkbyB0aGUgc3lzY2FsbCBmb3IgcmVhbCBhbmQgcmV0dXJuIHRvIHRoZSBzeXNjYWxsCisJICogaG90IHBhdGguCisJICovCisJbC5sd3oJcjExLFBUX1NZU0NBTExOTyhyMSkKKwlsLmx3eglyMyxQVF9HUFIzKHIxKQorCWwubHd6CXI0LFBUX0dQUjQocjEpCisJbC5sd3oJcjUsUFRfR1BSNShyMSkKKwlsLmx3eglyNixQVF9HUFI2KHIxKQorCWwubHd6CXI3LFBUX0dQUjcocjEpCisKKwlsLmoJX3N5c2NhbGxfY2hlY2sKKwkgbC5sd3oJcjgsUFRfR1BSOChyMSkKKworX3N5c2NhbGxfdHJhY2VfbGVhdmU6CisJbC5qYWwJZG9fc3lzY2FsbF90cmFjZV9sZWF2ZQorCSBsLmFkZGkJcjMscjEsMAorCisJbC5qCV9zeXNjYWxsX2NoZWNrX3dvcmsKKwkgbC5ub3AKKworX3N5c2NhbGxfYmFkc3lzOgorCS8qIEhlcmUgd2UgZWZmZWN0aXZlbHkgcHJldGVuZCB0byBoYXZlIGV4ZWN1dGVkIGFuIGltYWdpbmFyeQorCSAqIHN5c2NhbGwgdGhhdCByZXR1cm5zIC1FTk9TWVMgYW5kIHRoZW4gcmV0dXJuIHRvIHRoZSByZWd1bGFyCisJICogc3lzY2FsbCBob3QgcGF0aC4KKwkgKiBOb3RlIHRoYXQgInJldHVybiB2YWx1ZSIgaXMgc2V0IGluIHRoZSBkZWxheSBzbG90Li4uCisJICovCisJbC5qCV9zeXNjYWxsX3JldHVybgorCSBsLmFkZGkJcjExLHIwLC1FTk9TWVMKKworLyoqKioqKiogRU5EIFNZU0NBTEwgSEFORExJTkcgKioqKioqKi8KKworLyogLS0tWyAweGQwMDogVHJhcCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHhkMDAsMHhkMDApCisKKy8qIC0tLVsgMHhlMDA6IFRyYXAgZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworRVhDRVBUSU9OX0VOVFJZKF90cmFwX2hhbmRsZXIpCisJLyogcjQ6IEVBIG9mIGZhdWx0IChzZXQgYnkgRVhDRVBUSU9OX0hBTkRMRSkgKi8KKwlsLmphbCAgIGRvX3RyYXAKKwkgbC5hZGRpICByMyxyMSwwIC8qIHB0X3JlZ3MgKi8KKworCWwuaiAgICAgX3JldF9mcm9tX2V4Y2VwdGlvbgorCSBsLm5vcAorCisvKiAtLS1bIDB4ZjAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1VOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weGYwMCwweGYwMCkKKworLyogLS0tWyAweDEwMDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxMDAwLDB4MTAwMCkKKworLyogLS0tWyAweDExMDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxMTAwLDB4MTEwMCkKKworLyogLS0tWyAweDEyMDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxMjAwLDB4MTIwMCkKKworLyogLS0tWyAweDEzMDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxMzAwLDB4MTMwMCkKKworLyogLS0tWyAweDE0MDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxNDAwLDB4MTQwMCkKKworLyogLS0tWyAweDE1MDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxNTAwLDB4MTUwMCkKKworLyogLS0tWyAweDE2MDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxNjAwLDB4MTYwMCkKKworLyogLS0tWyAweDE3MDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxNzAwLDB4MTcwMCkKKworLyogLS0tWyAweDE4MDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxODAwLDB4MTgwMCkKKworLyogLS0tWyAweDE5MDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxOTAwLDB4MTkwMCkKKworLyogLS0tWyAweDFhMDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxYTAwLDB4MWEwMCkKKworLyogLS0tWyAweDFiMDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxYjAwLDB4MWIwMCkKKworLyogLS0tWyAweDFjMDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxYzAwLDB4MWMwMCkKKworLyogLS0tWyAweDFkMDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxZDAwLDB4MWQwMCkKKworLyogLS0tWyAweDFlMDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxZTAwLDB4MWUwMCkKKworLyogLS0tWyAweDFmMDA6IFJlc2VydmVkIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHgxZjAwLDB4MWYwMCkKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1bIHJldHVybiBdID09PSAqLworCitfd29ya19wZW5kaW5nOgorCS8qCisJICogaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8tPmZsYWdzICYgX1RJRl9ORUVEX1JFU0NIRUQpCisJICogICAgIHNjaGVkdWxlKCk7CisJICovCisJbC5sd3ogICByNSxUSV9GTEFHUyhyMTApCisJbC5hbmRpCXIzLHI1LF9USUZfTkVFRF9SRVNDSEVECisJbC5zZm5laSByMywwCisJbC5ibmYgICBfd29ya19ub3RpZnlzaWcKKwkgbC5ub3AKKwlsLmphbCAgIHNjaGVkdWxlCisJIGwubm9wCisJbC5qCV9yZXN1bWVfdXNlcnNwYWNlCisJIGwubm9wCisKKy8qIEhhbmRsZSBwZW5kaW5nIHNpZ25hbHMgYW5kIG5vdGlmeS1yZXN1bWUgcmVxdWVzdHMuCisgKiBkb19ub3RpZnlfcmVzdW1lIG11c3QgYmUgcGFzc2VkIHRoZSBsYXRlc3QgcHVzaGVkIHB0X3JlZ3MsIG5vdAorICogbmVjZXNzYXJpbHkgdGhlICJ1c2Vyc3BhY2UiIG9uZXMuICBBbHNvLCBwdF9yZWdzLT5zeXNjYWxsbm8KKyAqIG11c3QgYmUgc2V0IHNvIHRoYXQgdGhlIHN5c2NhbGwgcmVzdGFydCBmdW5jdGlvbmFsaXR5IHdvcmtzLgorICovCitfd29ya19ub3RpZnlzaWc6CisJbC5qYWwJZG9fbm90aWZ5X3Jlc3VtZQorCSBsLm9yaQlyMyxyMSwwCQkgIC8qIHB0X3JlZ3MgKi8KKworX3Jlc3VtZV91c2Vyc3BhY2U6CisJRElTQUJMRV9JTlRFUlJVUFRTKHIzLHI0KQorCWwubHd6CXIzLFRJX0ZMQUdTKHIxMCkKKwlsLmFuZGkJcjMscjMsX1RJRl9XT1JLX01BU0sKKwlsLnNmbmVpCXIzLDAKKwlsLmJmCV93b3JrX3BlbmRpbmcKKwkgbC5ub3AKKworX3Jlc3RvcmVfYWxsOgorCVJFU1RPUkVfQUxMCisJLyogVGhpcyByZXR1cm5zIHRvIHVzZXJzcGFjZSBjb2RlICovCisKKworRU5UUlkoX3JldF9mcm9tX2ludHIpCitFTlRSWShfcmV0X2Zyb21fZXhjZXB0aW9uKQorCWwubHd6CXI0LFBUX1NSKHIxKQorCWwuYW5kaQlyMyxyNCxTUFJfU1JfU00KKwlsLnNmZXFpCXIzLDAKKwlsLmJuZglfcmVzdG9yZV9hbGwKKwkgbC5ub3AKKwlsLmoJX3Jlc3VtZV91c2Vyc3BhY2UKKwkgbC5ub3AKKworRU5UUlkocmV0X2Zyb21fZm9yaykKKwlsLmphbAlzY2hlZHVsZV90YWlsCisJIGwubm9wCisKKwkvKiBfc3lzY2FsbF9yZXR1cm5zIGV4cGVjdCByMTEgdG8gY29udGFpbiByZXR1cm4gdmFsdWUgKi8KKwlsLmx3eglyMTEsUFRfR1BSMTEocjEpCisKKwkvKiBUaGUgc3lzY2FsbCBmYXN0IHBhdGggcmV0dXJuIGV4cGVjdHMgY2FsbC1zYXZlZCByZWdpc3RlcnMKKwkgKiByMTItcjI4IHRvIGJlIHVudG91Y2hlZCwgc28gd2UgcmVzdG9yZSB0aGVtIGhlcmUgYXMgdGhleQorCSAqIHdpbGwgaGF2ZSBiZWVuIGVmZmVjdGl2ZWx5IGNsb2JiZXJlZCB3aGVuIGFycml2aW5nIGhlcmUKKwkgKiB2aWEgdGhlIGNhbGwgdG8gc3dpdGNoKCkKKwkgKi8KKwlsLmx3eglyMTIsUFRfR1BSMTIocjEpCisJbC5sd3oJcjE0LFBUX0dQUjE0KHIxKQorCWwubHd6CXIxNixQVF9HUFIxNihyMSkKKwlsLmx3eglyMTgsUFRfR1BSMTgocjEpCisJbC5sd3oJcjIwLFBUX0dQUjIwKHIxKQorCWwubHd6CXIyMixQVF9HUFIyMihyMSkKKwlsLmx3eglyMjQsUFRfR1BSMjQocjEpCisJbC5sd3oJcjI2LFBUX0dQUjI2KHIxKQorCWwubHd6CXIyOCxQVF9HUFIyOChyMSkKKworCWwuaglfc3lzY2FsbF9yZXR1cm4KKwkgbC5ub3AKKworLyogU2luY2Ugc3lzY2FsbHMgZG9uJ3Qgc2F2ZSBjYWxsLWNsb2JiZXJlZCByZWdpc3RlcnMsIHRoZSBhcmdzIHRvCisgKiBrZXJuZWxfdGhyZWFkX2hlbHBlciB3aWxsIG5lZWQgdG8gYmUgcGFzc2VkIHRocm91Z2ggY2FsbGVlLXNhdmVkCisgKiByZWdpc3RlcnMgYW5kIGNvcGllZCB0byB0aGUgcGFyYW1ldGVyIHJlZ2lzdGVycyB3aGVuIHRoZSB0aHJlYWQKKyAqIGJlZ2lucyBydW5uaW5nLgorICoKKyAqIFNlZSBhcmNoL29wZW5yaXNjL2tlcm5lbC9wcm9jZXNzLmM6CisgKiBUaGUgYXJncyBhcmUgcGFzc2VkIGFzIGZvbGxvd3M6CisgKiAgIGFyZzEgKHIzKSA6IHBhc3NlZCBpbiByMjAKKyAqICAgYXJnMiAocjQpIDogcGFzc2VkIGluIHIyMgorICovCisKK0VOVFJZKF9rZXJuZWxfdGhyZWFkX2hlbHBlcikKKwlsLm9yCXIzLHIyMCxyMAorCWwub3IJcjQscjIyLHIwCisJbC5tb3ZoaQlyMzEsaGkoa2VybmVsX3RocmVhZF9oZWxwZXIpCisJbC5vcmkJcjMxLHIzMSxsbyhrZXJuZWxfdGhyZWFkX2hlbHBlcikKKwlsLmpyCXIzMQorCSBsLm5vcAorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09WyBzd2l0Y2ggXSA9PT0gKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBzd2l0Y2hlcyBiZXR3ZWVuIHR3byBkaWZmZXJlbnQgdGFza3MuICBUaGUgcHJvY2VzcworICogc3RhdGUgb2Ygb25lIGlzIHNhdmVkIG9uIGl0cyBrZXJuZWwgc3RhY2suICBUaGVuIHRoZSBzdGF0ZQorICogb2YgdGhlIG90aGVyIGlzIHJlc3RvcmVkIGZyb20gaXRzIGtlcm5lbCBzdGFjay4gIFRoZSBtZW1vcnkKKyAqIG1hbmFnZW1lbnQgaGFyZHdhcmUgaXMgdXBkYXRlZCB0byB0aGUgc2Vjb25kIHByb2Nlc3MncyBzdGF0ZS4KKyAqIEZpbmFsbHksIHdlIGNhbiByZXR1cm4gdG8gdGhlIHNlY29uZCBwcm9jZXNzLCB2aWEgdGhlICdyZXR1cm4nLgorICoKKyAqIE5vdGU6IHRoZXJlIGFyZSB0d28gd2F5cyB0byBnZXQgdG8gdGhlICJnb2luZyBvdXQiIHBvcnRpb24KKyAqIG9mIHRoaXMgY29kZTsgZWl0aGVyIGJ5IGNvbWluZyBpbiB2aWEgdGhlIGVudHJ5IChfc3dpdGNoKQorICogb3IgdmlhICJmb3JrIiB3aGljaCBtdXN0IHNldCB1cCBhbiBlbnZpcm9ubWVudCBlcXVpdmFsZW50CisgKiB0byB0aGUgIl9zd2l0Y2giIHBhdGguICBJZiB5b3UgY2hhbmdlIHRoaXMgKG9yIGluIHBhcnRpY3VsYXIsIHRoZQorICogU0FWRV9SRUdTIG1hY3JvKSwgeW91J2xsIGhhdmUgdG8gY2hhbmdlIHRoZSBmb3JrIGNvZGUgYWxzby4KKyAqLworCisKKy8qIF9zd2l0Y2ggTVVTVCBuZXZlciBsYXkgb24gcGFnZSBib3VuZHJ5LCBjYXVzZSBpdCBydW5zIGZyb20KKyAqIGVmZmVjdGl2ZSBhZGRyZXNzZXMgYW5kIGJlZWluZyBpbnRlcnJ1cHRlZCBieSBpVExCIG1pc3Mgd291bGQga2lsbCBpdC4KKyAqIGRUTEIgbWlzcyBzZWFtcyB0byBuZXZlciBhY2NvdXIgaW4gdGhlIGJhZCBwbGFjZSBzaW5jZSBkYXRhIGFjY2Vzc2VzCisgKiBhcmUgZnJvbSB0YXNrIHN0cnVjdHVyZXMgd2hpY2ggYXJlIGFsd2F5cyBwYWdlIGFsaWduZWQuCisgKgorICogVGhlIHByb2JsZW0gaGFwcGVucyBpbiBSRVNUT1JFX0FMTF9OT19SMTEgd2hlcmUgd2UgZmlyc3Qgc2V0IHRoZSBFUENSCisgKiByZWdpc3RlciwgdGhlbiBsb2FkIHRoZSBwcmV2aW91cyByZWdpc3RlciB2YWx1ZXMgYW5kIG9ubHkgYXQgdGhlIGVuZCBjYWxsCisgKiB0aGUgbC5yZmUgaW5zdHJ1Y3Rpb24uIElmIGdldCBUTEIgbWlzcyBpbiBiZWV0d2VuIHRoZSBFUENSIHJlZ2lzdGVyIGdldHMKKyAqIGdhcmJsZWQgYW5kIHdlIGVuZCB1cCBjYWxsaW5nIGwucmZlIHdpdGggdGhlIHdyb25nIEVQQ1IuIChzYW1lIHByb2JhYmx5CisgKiBob2xkcyBmb3IgRVNSKQorICoKKyAqIFRvIGF2b2lkIHRoaXMgcHJvYmxlbXMgaXQgaXMgc3VmZmljaWVudCB0byBhbGlnbiBfc3dpdGNoIHRvCisgKiBzb21lIG5pY2Ugcm91bmQgbnVtYmVyIHNtYWxsZXIgdGhhbiBpdCdzIHNpemUuLi4KKyAqLworCisvKiBBQkkgcnVsZXMgYXBwbHkgaGVyZS4uLiB3ZSBlaXRoZXIgZW50ZXIgX3N3aXRjaCB2aWEgc2NoZWR1bGUoKSBvciB2aWEKKyAqIGFuIGltYWdpbmFyeSBjYWxsIHRvIHdoaWNoIHdlIHNoYWxsIHJldHVybiBhdCByZXR1cm5fZnJvbV9mb3JrLiAgRWl0aGVyCisgKiB3YXksIHdlIGFyZSBhIGZ1bmN0aW9uIGNhbGwgYW5kIG9ubHkgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgY2FsbGVlLXNhdmVkCisgKiByZWdpc3RlcnMgd2hlbiB3ZSByZXR1cm4uICBBcyBzdWNoLCB3ZSBkb24ndCBuZWVkIHRvIHNhdmUgdGhlIHJlZ2lzdGVycworICogb24gdGhlIHN0YWNrIHRoYXQgd2Ugd29uJ3QgYmUgcmV0dXJuaW5nIGFzIHRoZXkgd2VyZS4uLgorICovCisKKwkuYWxpZ24gMHg0MDAKK0VOVFJZKF9zd2l0Y2gpCisJLyogV2UgZG9uJ3Qgc3RvcmUgU1IgYXMgX3N3aXRjaCBvbmx5IGdldHMgY2FsbGVkIGluIGEgY29udGV4dCB3aGVyZQorCSAqIHRoZSBTUiB3aWxsIGJlIHRoZSBzYW1lIGdvaW5nIGluIGFuZCBjb21pbmcgb3V0Li4uICovCisKKwkvKiBTZXQgdXAgbmV3IHB0X3JlZ3Mgc3RydWN0IGZvciBzYXZpbmcgdGFzayBzdGF0ZSAqLworCWwuYWRkaSAgcjEscjEsLShJTlRfRlJBTUVfU0laRSkKKworCS8qIE5vIG5lZWQgdG8gc3RvcmUgcjEvUFRfU1AgYXMgaXQgZ29lcyBpbnRvIEtTUCBiZWxvdyAqLworCWwuc3cgICAgUFRfR1BSMihyMSkscjIKKwlsLnN3ICAgIFBUX0dQUjkocjEpLHI5CisJLyogVGhpcyBpcyB3cm9uZywgcjEyIHNob3VsZG4ndCBiZSBoZXJlLi4uIGJ1dCBHQ0MgaXMgYnJva2VuIGZvciB0aGUgdGltZSBiZWluZworCSAqIGFuZCBleHBlY3RzIHIxMiB0byBiZSBjYWxsZWUtc2F2ZWQuLi4gKi8KKwlsLnN3ICAgIFBUX0dQUjEyKHIxKSxyMTIKKwlsLnN3ICAgIFBUX0dQUjE0KHIxKSxyMTQKKwlsLnN3ICAgIFBUX0dQUjE2KHIxKSxyMTYKKwlsLnN3ICAgIFBUX0dQUjE4KHIxKSxyMTgKKwlsLnN3ICAgIFBUX0dQUjIwKHIxKSxyMjAKKwlsLnN3ICAgIFBUX0dQUjIyKHIxKSxyMjIKKwlsLnN3ICAgIFBUX0dQUjI0KHIxKSxyMjQKKwlsLnN3ICAgIFBUX0dQUjI2KHIxKSxyMjYKKwlsLnN3ICAgIFBUX0dQUjI4KHIxKSxyMjgKKwlsLnN3ICAgIFBUX0dQUjMwKHIxKSxyMzAKKworCWwuYWRkaQlyMTEscjEwLDAJCQkvKiBTYXZlIG9sZCAnY3VycmVudCcgdG8gJ2xhc3QnIHJldHVybiB2YWx1ZSovCisKKwkvKiBXZSB1c2UgdGhyZWFkX2luZm8tPmtzcCBmb3Igc3RvcmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgYWJvdmUKKwkgKiBzdHJ1Y3R1cmUgc28gdGhhdCB3ZSBjYW4gZ2V0IGJhY2sgdG8gaXQgbGF0ZXIuLi4gd2UgZG9uJ3Qgd2FudAorCSAqIHRvIGxvc2UgdGhlIHZhbHVlIG9mIHRocmVhZF9pbmZvLT5rc3AsIHRob3VnaCwgc28gc3RvcmUgaXQgYXMKKwkgKiBwdF9yZWdzLT5zcCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgcmVzdG9yZSBpdCB3aGVuIHdlIGFyZSBtYWRlCisJICogbGl2ZSBhZ2Fpbi4uLgorCSAqLworCisJLyogU2F2ZSB0aGUgb2xkIHZhbHVlIG9mIHRocmVhZF9pbmZvLT5rc3AgYXMgcHRfcmVncy0+c3AgKi8KKwlsLmx3eglyMjksVElfS1NQKHIxMCkKKwlsLnN3CVBUX1NQKHIxKSxyMjkKKworCS8qIFN3YXAga2VybmVsIHN0YWNrIHBvaW50ZXJzICovCisJbC5zdyAgICBUSV9LU1AocjEwKSxyMQkJCS8qIFNhdmUgb2xkIHN0YWNrIHBvaW50ZXIgKi8KKwlsLm9yCXIxMCxyNCxyMAkJCS8qIFNldCB1cCBuZXcgY3VycmVudF90aHJlYWRfaW5mbyAqLworCWwubHd6ICAgcjEsVElfS1NQKHIxMCkJCQkvKiBMb2FkIG5ldyBzdGFjayBwb2ludGVyICovCisKKwkvKiBSZXN0b3JlIHRoZSBvbGQgdmFsdWUgb2YgdGhyZWFkX2luZm8tPmtzcCAqLworCWwubHd6CXIyOSxQVF9TUChyMSkKKwlsLnN3CVRJX0tTUChyMTApLHIyOQorCisJLyogLi4uYW5kIHJlc3RvcmUgdGhlIHJlZ2lzdGVycywgZXhjZXB0IHIxMSBiZWNhdXNlIHRoZSByZXR1cm4gdmFsdWUKKwkgKiBoYXMgYWxyZWFkeSBiZWVuIHNldCBhYm92ZS4KKwkgKi8KKwlsLmx3eiAgIHIyLFBUX0dQUjIocjEpCisJbC5sd3ogICByOSxQVF9HUFI5KHIxKQorCS8qIE5vIG5lZWQgdG8gcmVzdG9yZSByMTAgKi8KKwkvKiAuLi5hbmQgZG8gbm90IHJlc3RvcmUgcjExICovCisKKwkvKiBUaGlzIGlzIHdyb25nLCByMTIgc2hvdWxkbid0IGJlIGhlcmUuLi4gYnV0IEdDQyBpcyBicm9rZW4gZm9yIHRoZSB0aW1lIGJlaW5nCisJICogYW5kIGV4cGVjdHMgcjEyIHRvIGJlIGNhbGxlZS1zYXZlZC4uLiAqLworCWwubHd6ICAgcjEyLFBUX0dQUjEyKHIxKQorCWwubHd6ICAgcjE0LFBUX0dQUjE0KHIxKQorCWwubHd6ICAgcjE2LFBUX0dQUjE2KHIxKQorCWwubHd6ICAgcjE4LFBUX0dQUjE4KHIxKQorCWwubHd6ICAgcjIwLFBUX0dQUjIwKHIxKQorCWwubHd6ICAgcjIyLFBUX0dQUjIyKHIxKQorCWwubHd6ICAgcjI0LFBUX0dQUjI0KHIxKQorCWwubHd6ICAgcjI2LFBUX0dQUjI2KHIxKQorCWwubHd6ICAgcjI4LFBUX0dQUjI4KHIxKQorCWwubHd6ICAgcjMwLFBUX0dQUjMwKHIxKQorCisJLyogVW53aW5kIHN0YWNrIHRvIHByZS1zd2l0Y2ggc3RhdGUgKi8KKwlsLmFkZGkgIHIxLHIxLChJTlRfRlJBTUVfU0laRSkKKworCS8qIFJldHVybiB2aWEgdGhlIGxpbmstcmVnaXN0ZXIgYmFjayB0byB3aGVyZSB3ZSAnY2FtZSBmcm9tJywgd2hlcmUgdGhhdCBjYW4gYmUKKwkgKiBlaXRoZXIgc2NoZWR1bGUoKSBvciByZXR1cm5fZnJvbV9mb3JrKCkuLi4gKi8KKwlsLmpyCXI5CisJIGwubm9wCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIFRoZXNlIGFsbCB1c2UgdGhlIGRlbGF5IHNsb3QgZm9yIHNldHRpbmcgdGhlIGFyZ3VtZW50IHJlZ2lzdGVyLCBzbyB0aGUKKyAqIGp1bXAgaXMgYWx3YXlzIGhhcHBlbmluZyBhZnRlciB0aGUgbC5hZGRpIGluc3RydWN0aW9uLgorICoKKyAqIFRoZXNlIGFyZSBhbGwganVzdCB3cmFwcGVycyB0aGF0IGRvbid0IHRvdWNoIHRoZSBsaW5rLXJlZ2lzdGVyIHI5LCBzbyB0aGUKKyAqIHJldHVybiBmcm9tIHRoZSAicmVhbCIgc3lzY2FsbCBmdW5jdGlvbiB3aWxsIHJldHVybiBiYWNrIHRvIHRoZSBzeXNjYWxsCisgKiBjb2RlIHRoYXQgZGlkIHRoZSBsLmphbCB0aGF0IGJyb3VnaHQgdXMgaGVyZS4KKyAqLworCisvKiBmb3JrIHJlcXVpcmVzIHRoYXQgd2Ugc2F2ZSBhbGwgdGhlIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgYmVjYXVzZSB0aGV5CisgKiBhcmUgYWxsIGVmZmVjdGl2ZWx5IGNsb2JiZXJlZCBieSB0aGUgY2FsbCB0byBfc3dpdGNoLiAgSGVyZSB3ZSBzdG9yZQorICogYWxsIHRoZSByZWdpc3RlcnMgdGhhdCBhcmVuJ3QgdG91Y2hlZCBieSB0aGUgc3lzY2FsbCBmYXN0IHBhdGggYW5kIHRodXMKKyAqIHdlcmVuJ3Qgc2F2ZWQgdGhlcmUuCisgKi8KKworX2Zvcmtfc2F2ZV9leHRyYV9yZWdzX2FuZF9jYWxsOgorCWwuc3cgICAgUFRfR1BSMTQocjEpLHIxNAorCWwuc3cgICAgUFRfR1BSMTYocjEpLHIxNgorCWwuc3cgICAgUFRfR1BSMTgocjEpLHIxOAorCWwuc3cgICAgUFRfR1BSMjAocjEpLHIyMAorCWwuc3cgICAgUFRfR1BSMjIocjEpLHIyMgorCWwuc3cgICAgUFRfR1BSMjQocjEpLHIyNAorCWwuc3cgICAgUFRfR1BSMjYocjEpLHIyNgorCWwuanIJcjI5CisJIGwuc3cgICAgUFRfR1BSMjgocjEpLHIyOAorCitFTlRSWShzeXNfY2xvbmUpCisJbC5tb3ZoaQlyMjksaGkoX3N5c19jbG9uZSkKKwlsLm9yaQlyMjkscjI5LGxvKF9zeXNfY2xvbmUpCisJbC5qCV9mb3JrX3NhdmVfZXh0cmFfcmVnc19hbmRfY2FsbAorCSBsLmFkZGkJcjcscjEsMAorCitFTlRSWShzeXNfZm9yaykKKwlsLm1vdmhpCXIyOSxoaShfc3lzX2ZvcmspCisJbC5vcmkJcjI5LHIyOSxsbyhfc3lzX2ZvcmspCisJbC5qCV9mb3JrX3NhdmVfZXh0cmFfcmVnc19hbmRfY2FsbAorCSBsLmFkZGkJcjMscjEsMAorCitFTlRSWShzeXNfZXhlY3ZlKQorCWwuaglfc3lzX2V4ZWN2ZQorCSBsLmFkZGkJcjYscjEsMAorCitFTlRSWShzeXNfc2lnYWx0c3RhY2spCisJbC5qCV9zeXNfc2lnYWx0c3RhY2sKKwkgbC5hZGRpCXI1LHIxLDAKKworRU5UUlkoc3lzX3J0X3NpZ3JldHVybikKKwlsLmoJX3N5c19ydF9zaWdyZXR1cm4KKwkgbC5hZGRpCXIzLHIxLDAKKworLyogVGhpcyBpcyBhIGNhdGNoLWFsbCBzeXNjYWxsIGZvciBhdG9taWMgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgT3BlblJJU0MgMTAwMC4KKyAqIFRoZSBmdW5jdGlvbnMgdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgcGFyYW1ldGVycyBkZXBlbmRpbmcgb24gd2hpY2gKKyAqIHBhcnRpY3VsYXIgZmxhdm91ciBvZiBhdG9taWMgeW91IHdhbnQuLi4gcGFyYW1ldGVyIDEgaXMgYSBmbGFnIGlkZW50aWZ5aW5nCisgKiB0aGUgYXRvbWljIGluIHF1ZXN0aW9uLiAgQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlCisgKiBmb2xsb3dpbmcgdmFyaWFudHM6CisgKgorICogWENIRzoKKyAqICBAZmxhZzogMQorICogIEBwdHIxOgorICogIEBwdHIyOgorICogQXRvbWljYWxseSBleGNoYW5nZSB0aGUgdmFsdWVzIGluIHBvaW50ZXJzIDEgYW5kIDIuCisgKgorICovCisKK0VOVFJZKHN5c19vcjFrX2F0b21pYykKKwkvKiBGSVhNRTogVGhpcyBpZ25vcmVzIHIzIGFuZCBhbHdheXMgZG9lcyBhbiBYQ0hHICovCisJRElTQUJMRV9JTlRFUlJVUFRTKHIxNyxyMTkpCisJbC5sd3oJcjMwLDAocjQpCisJbC5sd3oJcjI4LDAocjUpCisJbC5zdwkwKHI0KSxyMjgKKwlsLnN3CTAocjUpLHIzMAorCUVOQUJMRV9JTlRFUlJVUFRTKHIxNykKKwlsLmpyCXI5CisJIGwub3IJcjExLHIwLHIwCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVsgRU9GIF09PT0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2Mva2VybmVsL2hlYWQuUyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL2hlYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzUwMThkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvaGVhZC5TCkBAIC0wLDAgKzEsMTYwNyBAQAorLyoKKyAqIE9wZW5SSVNDIGhlYWQuUworICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIHRoZSBPcGVuUklTQyBhcmNoaXRlY3R1cmU6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL3Nwcl9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisKKyNkZWZpbmUgdG9waHlzKHJkLHJzKQkJCQlcCisJbC5tb3ZoaQlyZCxoaSgtS0VSTkVMQkFTRSkJCTtcCisJbC5hZGQJcmQscmQscnMKKworI2RlZmluZSBDTEVBUl9HUFIoZ3ByKQkJCQlcCisJbC5vciAgICBncHIscjAscjAKKworI2RlZmluZSBMT0FEX1NZTUJPTF8yX0dQUihncHIsc3ltYm9sKQkJXAorCWwubW92aGkgZ3ByLGhpKHN5bWJvbCkJCQk7XAorCWwub3JpICAgZ3ByLGdwcixsbyhzeW1ib2wpCisKKworI2RlZmluZSBVQVJUX0JBU0VfQUREICAgICAgMHg5MDAwMDAwMAorCisjZGVmaW5lIEVYQ0VQVElPTl9TUiAgKFNQUl9TUl9ETUUgfCBTUFJfU1JfSU1FIHwgU1BSX1NSX0RDRSB8IFNQUl9TUl9JQ0UgfCBTUFJfU1JfU00pCisjZGVmaW5lIFNZU0NBTExfU1IgIChTUFJfU1JfRE1FIHwgU1BSX1NSX0lNRSB8IFNQUl9TUl9EQ0UgfCBTUFJfU1JfSUNFIHwgU1BSX1NSX0lFRSB8IFNQUl9TUl9URUUgfCBTUFJfU1JfU00pCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09WyB0bXAgc3RvcmUgbG9jYXRpb25zIF09PT0gKi8KKworLyoKKyAqIGVtZXJnZW5jeV9wcmludCB0ZW1wb3Jhcnkgc3RvcmVzCisgKi8KKyNkZWZpbmUgRU1FUkdFTkNZX1BSSU5UX1NUT1JFX0dQUjQJbC5zdyAgICAweDIwKHIwKSxyNAorI2RlZmluZSBFTUVSR0VOQ1lfUFJJTlRfTE9BRF9HUFI0CWwubHd6ICAgcjQsMHgyMChyMCkKKworI2RlZmluZSBFTUVSR0VOQ1lfUFJJTlRfU1RPUkVfR1BSNQlsLnN3ICAgIDB4MjQocjApLHI1CisjZGVmaW5lIEVNRVJHRU5DWV9QUklOVF9MT0FEX0dQUjUJbC5sd3ogICByNSwweDI0KHIwKQorCisjZGVmaW5lIEVNRVJHRU5DWV9QUklOVF9TVE9SRV9HUFI2CWwuc3cgICAgMHgyOChyMCkscjYKKyNkZWZpbmUgRU1FUkdFTkNZX1BSSU5UX0xPQURfR1BSNglsLmx3eiAgIHI2LDB4MjgocjApCisKKyNkZWZpbmUgRU1FUkdFTkNZX1BSSU5UX1NUT1JFX0dQUjcJbC5zdyAgICAweDJjKHIwKSxyNworI2RlZmluZSBFTUVSR0VOQ1lfUFJJTlRfTE9BRF9HUFI3CWwubHd6ICAgcjcsMHgyYyhyMCkKKworI2RlZmluZSBFTUVSR0VOQ1lfUFJJTlRfU1RPUkVfR1BSOAlsLnN3ICAgIDB4MzAocjApLHI4CisjZGVmaW5lIEVNRVJHRU5DWV9QUklOVF9MT0FEX0dQUjgJbC5sd3ogICByOCwweDMwKHIwKQorCisjZGVmaW5lIEVNRVJHRU5DWV9QUklOVF9TVE9SRV9HUFI5CWwuc3cgICAgMHgzNChyMCkscjkKKyNkZWZpbmUgRU1FUkdFTkNZX1BSSU5UX0xPQURfR1BSOQlsLmx3eiAgIHI5LDB4MzQocjApCisKKworLyoKKyAqIFRMQiBtaXNzIGhhbmRsZXJzIHRlbW9yYXJ5IHN0b3JlcworICovCisjZGVmaW5lIEVYQ0VQVElPTl9TVE9SRV9HUFI5CQlsLnN3ICAgIDB4MTAocjApLHI5CisjZGVmaW5lIEVYQ0VQVElPTl9MT0FEX0dQUjkJCWwubHd6ICAgcjksMHgxMChyMCkKKworI2RlZmluZSBFWENFUFRJT05fU1RPUkVfR1BSMgkJbC5zdyAgICAweDY0KHIwKSxyMgorI2RlZmluZSBFWENFUFRJT05fTE9BRF9HUFIyCQlsLmx3eiAgIHIyLDB4NjQocjApCisKKyNkZWZpbmUgRVhDRVBUSU9OX1NUT1JFX0dQUjMJCWwuc3cgICAgMHg2OChyMCkscjMKKyNkZWZpbmUgRVhDRVBUSU9OX0xPQURfR1BSMwkJbC5sd3ogICByMywweDY4KHIwKQorCisjZGVmaW5lIEVYQ0VQVElPTl9TVE9SRV9HUFI0CQlsLnN3ICAgIDB4NmMocjApLHI0CisjZGVmaW5lIEVYQ0VQVElPTl9MT0FEX0dQUjQJCWwubHd6ICAgcjQsMHg2YyhyMCkKKworI2RlZmluZSBFWENFUFRJT05fU1RPUkVfR1BSNQkJbC5zdyAgICAweDcwKHIwKSxyNQorI2RlZmluZSBFWENFUFRJT05fTE9BRF9HUFI1CQlsLmx3eiAgIHI1LDB4NzAocjApCisKKyNkZWZpbmUgRVhDRVBUSU9OX1NUT1JFX0dQUjYJCWwuc3cgICAgMHg3NChyMCkscjYKKyNkZWZpbmUgRVhDRVBUSU9OX0xPQURfR1BSNgkJbC5sd3ogICByNiwweDc0KHIwKQorCisKKy8qCisgKiBFWENFUFRJT05fSEFORExFIHRlbXBvcmFyeSBzdG9yZXMKKyAqLworCisjZGVmaW5lIEVYQ0VQVElPTl9UX1NUT1JFX0dQUjMwCQlsLnN3ICAgIDB4NzgocjApLHIzMAorI2RlZmluZSBFWENFUFRJT05fVF9MT0FEX0dQUjMwKHJlZykJbC5sd3ogICByZWcsMHg3OChyMCkKKworI2RlZmluZSBFWENFUFRJT05fVF9TVE9SRV9HUFIxMAkJbC5zdyAgICAweDdjKHIwKSxyMTAKKyNkZWZpbmUgRVhDRVBUSU9OX1RfTE9BRF9HUFIxMChyZWcpCWwubHd6ICAgcmVnLDB4N2MocjApCisKKyNkZWZpbmUgRVhDRVBUSU9OX1RfU1RPUkVfU1AJCWwuc3cJMHg4MChyMCkscjEKKyNkZWZpbmUgRVhDRVBUSU9OX1RfTE9BRF9TUChyZWcpCWwubHd6ICAgcmVnLDB4ODAocjApCisKKy8qCisgKiBGb3IgVU5IQU5MREVEX0VYQ0VQVElPTgorICovCisKKyNkZWZpbmUgRVhDRVBUSU9OX1RfU1RPUkVfR1BSMzEJCWwuc3cgICAgMHg4NChyMCkscjMxCisjZGVmaW5lIEVYQ0VQVElPTl9UX0xPQURfR1BSMzEocmVnKQlsLmx3eiAgIHJlZywweDg0KHIwKQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1bIG1hY3JvcyBdPT09ICovCisKKworI2RlZmluZSBHRVRfQ1VSUkVOVF9QR0QocmVnLHQxKQkJCQkJXAorCUxPQURfU1lNQk9MXzJfR1BSKHJlZyxjdXJyZW50X3BnZCkJCQk7XAorCXRvcGh5cyAgKHQxLHJlZykJCQkJCTtcCisJbC5sd3ogICByZWcsMCh0MSkKKworCisvKgorICogRFNDUjogdGhpcyBpcyBhIGNvbW1vbiBob29rIGZvciBoYW5kbGluZyBleGNlcHRpb25zLiBpdCB3aWxsIHNhdmUKKyAqICAgICAgIHRoZSBuZWVkZWQgcmVnaXN0ZXJzLCBzZXQgdXAgc3RhY2sgYW5kIHBvaW50ZXIgdG8gY3VycmVudAorICoJIHRoZW4ganVtcCB0byB0aGUgaGFuZGxlciB3aGlsZSBlbmFibGluZyBNTVUKKyAqCisgKiBQUk1TOiBoYW5kbGVyCS0gYSBmdW5jdGlvbiB0byBqdW1wIHRvLiBpdCBoYXMgdG8gc2F2ZSB0aGUKKyAqCQkJcmVtYWluaW5nIHJlZ2lzdGVycyB0byBrZXJuZWwgc3RhY2ssIGNhbGwKKyAqCQkJYXBwcm9wcmlhdGUgYXJjaC1pbmRlcGVuZGFudCBleGNlcHRpb24gaGFuZGxlcgorICoJCQlhbmQgZmluYWx5IGp1bXAgdG8gcmV0X2Zyb21fZXhjZXB0CisgKgorICogUFJFUTogdW5jaGFuZ2VkIHN0YXRlIGZyb20gdGhlIHRpbWUgZXhjZXB0aW9uIGhhcHBlbmVkCisgKgorICogUE9TVDogU0FWRUQgdGhlIGZvbGxvd2luZyByZWdpc3RlcnMgb3JpZ2luYWwgdmFsdWUKKyAqCSAgICAgICB0byB0aGUgbmV3IGNyZWF0ZWQgZXhjZXB0aW9uIGZyYW1lIHBvaW50ZWQgdG8gYnkgcjEKKyAqCisgKgkgcjEgIC0ga3NwCXBvaW50aW5nIHRvIHRoZSBuZXcgKGV4Y2VwdGlvbikgZnJhbWUKKyAqCSByNCAgLSBFRUFSICAgICBleGNlcHRpb24gRUEKKyAqCSByMTAgLSBjdXJyZW50CXBvaW50aW5nIHRvIGN1cnJlbnRfdGhyZWFkX2luZm8gc3RydWN0CisgKgkgcjEyIC0gc3lzY2FsbCAgMCwgc2luY2Ugd2UgZGlkbid0IGNvbWUgZnJvbSBzeXNjYWxsCisgKgkgcjEzIC0gdGVtcAlpdCBhY3R1YWxseSBjb250YWlucyBuZXcgU1IsIG5vdCBuZWVkZWQgYW55bW9yZQorICoJIHIzMSAtIGhhbmRsZXIJYWRkcmVzcyBvZiB0aGUgaGFuZGxlciB3ZSdsbCBqdW1wIHRvCisgKgorICoJIGhhbmRsZXIgaGFzIHRvIHNhdmUgcmVtYWluaW5nIHJlZ2lzdGVycyB0byB0aGUgZXhjZXB0aW9uCisgKgkga3NwIGZyYW1lICpiZWZvcmUqIHRhaW50aW5nIHRoZW0hCisgKgorICogTk9URTogdGhpcyBmdW5jdGlvbiBpcyBub3QgcmVlbnRyYW50IHBlciBzZS4gcmVlbnRyYW5jeSBpcyBndWFyYW50ZWVkCisgKiAgICAgICBieSBwcm9jZXNzb3IgZGlzYWJsaW5nIGFsbCBleGNlcHRpb25zL2ludGVycnVwdHMgd2hlbiBleGNlcHRpb24KKyAqCSBhY2NvdXJzLgorICoKKyAqIE9QVE06IG5vIG5lZWQgdG8gbWFrZSBpdCBzbyB3YXN0ZWZ1bCB0byBleHRyYWN0IGtzcCB3aGVuIGluIHVzZXIgbW9kZQorICovCisKKyNkZWZpbmUgRVhDRVBUSU9OX0hBTkRMRShoYW5kbGVyKQkJCQlcCisJRVhDRVBUSU9OX1RfU1RPUkVfR1BSMzAJCQkJCTtcCisJbC5tZnNwciByMzAscjAsU1BSX0VTUl9CQVNFCQkJCTtcCisJbC5hbmRpICByMzAscjMwLFNQUl9TUl9TTQkJCQk7XAorCWwuc2ZlcWkgcjMwLDAJCQkJCQk7XAorCUVYQ0VQVElPTl9UX1NUT1JFX0dQUjEwCQkJCQk7XAorCWwuYm5mICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoga2VybmVsX21vZGUgKi8JO1wKKwkgRVhDRVBUSU9OX1RfU1RPUkVfU1AgICAgICAgICAgICAgICAgIC8qIGRlbGF5IHNsb3QgKi8JO1wKKzE6IC8qIHVzZXJfbW9kZTogICAqLwkJCQkJCTtcCisJTE9BRF9TWU1CT0xfMl9HUFIocjEsY3VycmVudF90aHJlYWRfaW5mb19zZXQpCQk7XAorCXRvcGh5cyAgKHIzMCxyMSkJCQkJCTtcCisJLyogcjEwOiBjdXJyZW50X3RocmVhZF9pbmZvICAqLwkJCQk7XAorCWwubHd6ICAgcjEwLDAocjMwKQkJCQkJO1wKKwl0b3BoeXMgIChyMzAscjEwKQkJCQkJO1wKKwlsLmx3eiAgIHIxLChUSV9LU1ApKHIzMCkJCQkJO1wKKwkvKiBmYWxsIHRocm91Z2ggKi8JCQkJCTtcCisyOiAvKiBrZXJuZWxfbW9kZTogKi8JCQkJCQk7XAorCS8qIGNyZWF0ZSBuZXcgc3RhY2sgZnJhbWUsIHNhdmUgb25seSBuZWVkZWQgZ3BycyAqLwk7XAorCS8qIHIxOiBLU1AsIHIxMDogY3VycmVudCwgcjQ6IEVFQVIsIHIzMTogX19wYShLU1ApICovCTtcCisJLyogcjEyOgl0ZW1wLCBzeXNjYWxsIGluZGljYXRvciAqLwkJCTtcCisJbC5hZGRpICByMSxyMSwtKElOVF9GUkFNRV9TSVpFKQkJCQk7XAorCS8qIHIxIGlzIEtTUCwgcjMwIGlzIF9fcGEoS1NQKSAqLwkJCTtcCisJdG9waHlzICAocjMwLHIxKQkJCQkJO1wKKwlsLnN3ICAgIFBUX0dQUjEyKHIzMCkscjEyCQkJCTtcCisJbC5tZnNwciByMTIscjAsU1BSX0VQQ1JfQkFTRQkJCQk7XAorCWwuc3cgICAgUFRfUEMocjMwKSxyMTIJCQkJCTtcCisJbC5tZnNwciByMTIscjAsU1BSX0VTUl9CQVNFCQkJCTtcCisJbC5zdyAgICBQVF9TUihyMzApLHIxMgkJCQkJO1wKKwkvKiBzYXZlIHIzMCAqLwkJCQkJCTtcCisJRVhDRVBUSU9OX1RfTE9BRF9HUFIzMChyMTIpCQkJCTtcCisJbC5zdwlQVF9HUFIzMChyMzApLHIxMgkJCQk7XAorCS8qIHNhdmUgcjEwIGFzIHdhcyBwcmlvciB0byBleGNlcHRpb24gKi8JCTtcCisJRVhDRVBUSU9OX1RfTE9BRF9HUFIxMChyMTIpCQkJCTtcCisJbC5zdwlQVF9HUFIxMChyMzApLHIxMgkJCQk7XAorCS8qIHNhdmUgUFRfU1AgYXMgd2FzIHByaW9yIHRvIGV4Y2VwdGlvbiAqLwkJO1wKKwlFWENFUFRJT05fVF9MT0FEX1NQKHIxMikJCQkJO1wKKwlsLnN3CVBUX1NQKHIzMCkscjEyCQkJCQk7XAorCS8qIHNhdmUgZXhjZXB0aW9uIHI0LCBzZXQgcjQgPSBFQSAqLwkJCTtcCisJbC5zdwlQVF9HUFI0KHIzMCkscjQJCQkJCTtcCisJbC5tZnNwciByNCxyMCxTUFJfRUVBUl9CQVNFCQkJCTtcCisJLyogcjEyID09IDEgaWYgd2UgY29tZSBmcm9tIHN5c2NhbGwgKi8JCQk7XAorCUNMRUFSX0dQUihyMTIpCQkJCQkJO1wKKwkvKiAtLS0tLSB0dXJuIG9uIE1NVSAtLS0tLSAqLwkJCQk7XAorCWwub3JpCXIzMCxyMCwoRVhDRVBUSU9OX1NSKQkJCQk7XAorCWwubXRzcHIJcjAscjMwLFNQUl9FU1JfQkFTRQkJCQk7XAorCS8qIHIzMDoJRUEgYWRkcmVzcyBvZiBoYW5kbGVyICovCQkJO1wKKwlMT0FEX1NZTUJPTF8yX0dQUihyMzAsaGFuZGxlcikJCQkJO1wKKwlsLm10c3ByIHIwLHIzMCxTUFJfRVBDUl9CQVNFCQkJCTtcCisJbC5yZmUKKworLyoKKyAqIHRoaXMgZG9lc24ndCB3b3JrCisgKgorICoKKyAqICNpZmRlZiBDT05GSUdfSlVNUF9VUE9OX1VOSEFORExFRF9FWENFUFRJT04KKyAqICNkZWZpbmUgVU5IQU5ETEVEX0VYQ0VQVElPTihoYW5kbGVyKQkJCQlcCisgKglsLm9yaSAgIHIzLHIwLDB4MQkJCQkJO1wKKyAqCWwubXRzcHIgcjAscjMsU1BSX1NSCQkJCQk7XAorICogICAgICBsLm1vdmhpIHIzLGhpKDB4ZjAwMDAxMDApCQkJCTtcCisgKiAgICAgIGwub3JpICAgcjMscjMsbG8oMHhmMDAwMDEwMCkJCQkJO1wKKyAqCWwuanIJcjMJCQkJCQk7XAorICoJbC5ub3AJMQorICoKKyAqICNlbmRpZgorICovCisKKy8qIERTQ1I6IHRoaXMgaXMgdGhlIHNhbWUgYXMgRVhDRVBUSU9OX0hBTkRMRSgpLCB3ZSBhcmUganVzdAorICogICAgICAgYSBiaXQgbW9yZSBjYXJlZnVsbCAoaWYgd2UgaGF2ZSBhIFBUX1NQIG9yIGN1cnJlbnQgcG9pbnRlcgorICogICAgICAgY29ycnVwdGlvbikgYW5kIHNldCB0aGVtIHVwIGZyb20gJ2N1cnJlbnRfc2V0JworICoKKyAqLworI2RlZmluZSBVTkhBTkRMRURfRVhDRVBUSU9OKGhhbmRsZXIpCQkJCVwKKwlFWENFUFRJT05fVF9TVE9SRV9HUFIzMQkJCQkJO1wKKwlFWENFUFRJT05fVF9TVE9SRV9HUFIxMAkJCQkJO1wKKwlFWENFUFRJT05fVF9TVE9SRV9TUAkJCQkJO1wKKwkvKiB0ZW1wb3Jhcnkgc3RvcmUgcjMsIHI5IGludG8gcjEsIHIxMCAqLwkJO1wKKwlsLmFkZGkJcjEscjMsMHgwCQkJCQk7XAorCWwuYWRkaQlyMTAscjksMHgwCQkJCQk7XAorCS8qIHRoZSBzdHJpbmcgcmVmZXJlbmNlZCBieSByMyBtdXN0IGJlIGxvdyBlbm91Z2ggKi8JO1wKKwlsLmphbAlfZW1lcmdlbmN5X3ByaW50CQkJCTtcCisJbC5vcmkJcjMscjAsbG8oX3N0cmluZ191bmhhbmRsZWRfZXhjZXB0aW9uKQkJO1wKKwlsLm1mc3ByCXIzLHIwLFNQUl9OUEMJCQkJCTtcCisJbC5qYWwJX2VtZXJnZW5jeV9wcmludF9ucgkJCQk7XAorCWwuYW5kaQlyMyxyMywweDFmMDAJCQkJCTtcCisJLyogdGhlIHN0cmluZyByZWZlcmVuY2VkIGJ5IHIzIG11c3QgYmUgbG93IGVub3VnaCAqLwk7XAorCWwuamFsCV9lbWVyZ2VuY3lfcHJpbnQJCQkJO1wKKwlsLm9yaQlyMyxyMCxsbyhfc3RyaW5nX2VwY19wcmVmaXgpCQkJO1wKKwlsLmphbAlfZW1lcmdlbmN5X3ByaW50X25yCQkJCTtcCisJbC5tZnNwcglyMyxyMCxTUFJfRVBDUl9CQVNFCQkJCTtcCisJbC5qYWwJX2VtZXJnZW5jeV9wcmludAkJCQk7XAorCWwub3JpCXIzLHIwLGxvKF9zdHJpbmdfbmwpCQkJCTtcCisJLyogZW5kIG9mIHByaW50aW5nICovCQkJCQk7XAorCWwuYWRkaQlyMyxyMSwweDAJCQkJCTtcCisJbC5hZGRpCXI5LHIxMCwweDAJCQkJCTtcCisJLyogZXh0cmFjdCBjdXJyZW50LCBrc3AgZnJvbSBjdXJyZW50X3NldCAqLwkJO1wKKwlMT0FEX1NZTUJPTF8yX0dQUihyMSxfdW5oYW5kbGVkX3N0YWNrX3RvcCkJCTtcCisJTE9BRF9TWU1CT0xfMl9HUFIocjEwLGluaXRfdGhyZWFkX3VuaW9uKQkJO1wKKwkvKiBjcmVhdGUgbmV3IHN0YWNrIGZyYW1lLCBzYXZlIG9ubHkgbmVlZGVkIGdwcnMgKi8JO1wKKwkvKiByMTogS1NQLCByMTA6IGN1cnJlbnQsIHIzMTogX19wYShLU1ApICovCQk7XAorCS8qIHIxMjoJdGVtcCwgc3lzY2FsbCBpbmRpY2F0b3IsIHIxMyB0ZW1wICovCQk7XAorCWwuYWRkaSAgcjEscjEsLShJTlRfRlJBTUVfU0laRSkJCQkJO1wKKwkvKiByMSBpcyBLU1AsIHIzMSBpcyBfX3BhKEtTUCkgKi8JCQk7XAorCXRvcGh5cyAgKHIzMSxyMSkJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIxMihyMzEpLHIxMgkJCQkJO1wKKwlsLm1mc3ByIHIxMixyMCxTUFJfRVBDUl9CQVNFCQkJCTtcCisJbC5zdyAgICBQVF9QQyhyMzEpLHIxMgkJCQkJO1wKKwlsLm1mc3ByIHIxMixyMCxTUFJfRVNSX0JBU0UJCQkJO1wKKwlsLnN3ICAgIFBUX1NSKHIzMSkscjEyCQkJCQk7XAorCS8qIHNhdmUgcjMxICovCQkJCQkJO1wKKwlFWENFUFRJT05fVF9MT0FEX0dQUjMxKHIxMikJCQkJO1wKKwlsLnN3CVBUX0dQUjMxKHIzMSkscjEyCQkJCQk7XAorCS8qIHNhdmUgcjEwIGFzIHdhcyBwcmlvciB0byBleGNlcHRpb24gKi8JCTtcCisJRVhDRVBUSU9OX1RfTE9BRF9HUFIxMChyMTIpCQkJCTtcCisJbC5zdwlQVF9HUFIxMChyMzEpLHIxMgkJCQkJO1wKKwkvKiBzYXZlIFBUX1NQIGFzIHdhcyBwcmlvciB0byBleGNlcHRpb24gKi8JCQk7XAorCUVYQ0VQVElPTl9UX0xPQURfU1AocjEyKQkJCQk7XAorCWwuc3cJUFRfU1AocjMxKSxyMTIJCQkJCTtcCisJbC5zdyAgICBQVF9HUFIxMyhyMzEpLHIxMwkJCQkJO1wKKwkvKiAtLT4gKi8JCQkJCQk7XAorCS8qIHNhdmUgZXhjZXB0aW9uIHI0LCBzZXQgcjQgPSBFQSAqLwkJCTtcCisJbC5zdwlQVF9HUFI0KHIzMSkscjQJCQkJCTtcCisJbC5tZnNwciByNCxyMCxTUFJfRUVBUl9CQVNFCQkJCTtcCisJLyogcjEyID09IDEgaWYgd2UgY29tZSBmcm9tIHN5c2NhbGwgKi8JCQk7XAorCUNMRUFSX0dQUihyMTIpCQkJCQkJO1wKKwkvKiAtLS0tLSBwbGF5IGEgTU1VIHRyaWNrIC0tLS0tICovCQkJO1wKKwlsLm9yaQlyMzEscjAsKEVYQ0VQVElPTl9TUikJCQkJO1wKKwlsLm10c3ByCXIwLHIzMSxTUFJfRVNSX0JBU0UJCQkJO1wKKwkvKiByMzE6CUVBIGFkZHJlc3Mgb2YgaGFuZGxlciAqLwkJCTtcCisJTE9BRF9TWU1CT0xfMl9HUFIocjMxLGhhbmRsZXIpCQkJCTtcCisJbC5tdHNwciByMCxyMzEsU1BSX0VQQ1JfQkFTRQkJCQk7XAorCWwucmZlCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09WyBleGNlcHRpb25zXSA9PT0gKi8KKworLyogLS0tWyAweDEwMDogUkVTRVQgZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIC5vcmcgMHgxMDAKKwkvKiBKdW1wIHRvIC5pbml0IGNvZGUgYXQgX3N0YXJ0IHdoaWNoIGxpdmVzIGluIHRoZSAuaGVhZCBzZWN0aW9uCisJICogYW5kIHdpbGwgYmUgZGlzY2FyZGVkIGFmdGVyIGJvb3QuCisJICovCisJTE9BRF9TWU1CT0xfMl9HUFIocjQsIF9zdGFydCkKKwl0b3BoeXMJKHIzLHI0KQkJCS8qIE1NVSBkaXNhYmxlZCAqLworCWwuanIJcjMKKwkgbC5ub3AKKworLyogLS0tWyAweDIwMDogQlVTIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIC5vcmcgMHgyMDAKK19kaXNwYXRjaF9idXNfZmF1bHQ6CisJRVhDRVBUSU9OX0hBTkRMRShfYnVzX2ZhdWx0X2hhbmRsZXIpCisKKy8qIC0tLVsgMHgzMDA6IERhdGEgUGFnZSBGYXVsdCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MzAwCitfZGlzcGF0Y2hfZG9fZHBhZ2VfZmF1bHQ6CisvLyAgICAgIHRvdGFseSBkaXNhYmxlIHRpbWVyIGludGVycnVwdAorLy8gCWwubXRzcHIJcjAscjAsU1BSX1RUTVIKKy8vCURFQlVHX1RMQl9QUk9CRSgweDMwMCkKKy8vCUVYQ0VQVElPTl9ERUJVR19WQUxVRV9FUl9FTkFCTEVEKDB4MzAwKQorCUVYQ0VQVElPTl9IQU5ETEUoX2RhdGFfcGFnZV9mYXVsdF9oYW5kbGVyKQorCisvKiAtLS1bIDB4NDAwOiBJbnNuIFBhZ2UgRmF1bHQgZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgLm9yZyAweDQwMAorX2Rpc3BhdGNoX2RvX2lwYWdlX2ZhdWx0OgorLy8gICAgICB0b3RhbHkgZGlzYWJsZSB0aW1lciBpbnRlcnJ1cHQKKy8vCWwubXRzcHIJcjAscjAsU1BSX1RUTVIKKy8vCURFQlVHX1RMQl9QUk9CRSgweDQwMCkKKy8vCUVYQ0VQVElPTl9ERUJVR19WQUxVRV9FUl9FTkFCTEVEKDB4NDAwKQorCUVYQ0VQVElPTl9IQU5ETEUoX2luc25fcGFnZV9mYXVsdF9oYW5kbGVyKQorCisvKiAtLS1bIDB4NTAwOiBUaW1lciBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgLm9yZyAweDUwMAorCUVYQ0VQVElPTl9IQU5ETEUoX3RpbWVyX2hhbmRsZXIpCisKKy8qIC0tLVsgMHg2MDA6IEFsaWdtZW50IGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4NjAwCisJRVhDRVBUSU9OX0hBTkRMRShfYWxpZ25tZW50X2hhbmRsZXIpCisKKy8qIC0tLVsgMHg3MDA6IElsbGVnYWwgaW5zbiBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4NzAwCisJRVhDRVBUSU9OX0hBTkRMRShfaWxsZWdhbF9pbnN0cnVjdGlvbl9oYW5kbGVyKQorCisvKiAtLS1bIDB4ODAwOiBFeHRlcm5hbCBpbnRlcnJ1cHQgZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgLm9yZyAweDgwMAorCUVYQ0VQVElPTl9IQU5ETEUoX2V4dGVybmFsX2lycV9oYW5kbGVyKQorCisvKiAtLS1bIDB4OTAwOiBEVExCIG1pc3MgZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgLm9yZyAweDkwMAorCWwuaglib290X2R0bGJfbWlzc19oYW5kbGVyCisJbC5ub3AKKworLyogLS0tWyAweGEwMDogSVRMQiBtaXNzIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIC5vcmcgMHhhMDAKKwlsLmoJYm9vdF9pdGxiX21pc3NfaGFuZGxlcgorCWwubm9wCisKKy8qIC0tLVsgMHhiMDA6IFJhbmdlIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4YjAwCisJVU5IQU5ETEVEX0VYQ0VQVElPTihfdmVjdG9yXzB4YjAwKQorCisvKiAtLS1bIDB4YzAwOiBTeXNjYWxsIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgLm9yZyAweGMwMAorCUVYQ0VQVElPTl9IQU5ETEUoX3N5c19jYWxsX2hhbmRsZXIpCisKKy8qIC0tLVsgMHhkMDA6IFRyYXAgZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4ZDAwCisJVU5IQU5ETEVEX0VYQ0VQVElPTihfdmVjdG9yXzB4ZDAwKQorCisvKiAtLS1bIDB4ZTAwOiBUcmFwIGV4Y2VwdGlvbiBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgLm9yZyAweGUwMAorLy8JVU5IQU5ETEVEX0VYQ0VQVElPTihfdmVjdG9yXzB4ZTAwKQorCUVYQ0VQVElPTl9IQU5ETEUoX3RyYXBfaGFuZGxlcikKKworLyogLS0tWyAweGYwMDogUmVzZXJ2ZWQgZXhjZXB0aW9uIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIC5vcmcgMHhmMDAKKwlVTkhBTkRMRURfRVhDRVBUSU9OKF92ZWN0b3JfMHhmMDApCisKKy8qIC0tLVsgMHgxMDAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MTAwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDEwMDApCisKKy8qIC0tLVsgMHgxMTAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MTEwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDExMDApCisKKy8qIC0tLVsgMHgxMjAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MTIwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDEyMDApCisKKy8qIC0tLVsgMHgxMzAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MTMwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDEzMDApCisKKy8qIC0tLVsgMHgxNDAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MTQwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDE0MDApCisKKy8qIC0tLVsgMHgxNTAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MTUwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDE1MDApCisKKy8qIC0tLVsgMHgxNjAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MTYwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDE2MDApCisKKy8qIC0tLVsgMHgxNzAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MTcwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDE3MDApCisKKy8qIC0tLVsgMHgxODAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MTgwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDE4MDApCisKKy8qIC0tLVsgMHgxOTAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MTkwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDE5MDApCisKKy8qIC0tLVsgMHgxYTAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MWEwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDFhMDApCisKKy8qIC0tLVsgMHgxYjAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MWIwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDFiMDApCisKKy8qIC0tLVsgMHgxYzAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MWMwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDFjMDApCisKKy8qIC0tLVsgMHgxZDAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MWQwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDFkMDApCisKKy8qIC0tLVsgMHgxZTAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MWUwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDFlMDApCisKKy8qIC0tLVsgMHgxZjAwOiBSZXNlcnZlZCBleGNlcHRpb24gXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAub3JnIDB4MWYwMAorCVVOSEFORExFRF9FWENFUFRJT04oX3ZlY3Rvcl8weDFmMDApCisKKyAgICAub3JnIDB4MjAwMAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09WyBrZXJuZWwgc3RhcnQgXT09PSAqLworCisvKiAgICAudGV4dCovCisKKy8qIFRoaXMgZWFybHkgc3R1ZmYgYmVsb25ncyBpbiBIRUFELCBidXQgc29tZSBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IGRlZmluaXRlbHkKKyAqIGRvbid0Li4uICovCisKKwlfX0hFQUQKKwkuZ2xvYmFsIF9zdGFydAorX3N0YXJ0OgorCS8qCisJICogZW5zdXJlIGEgZGV0ZXJtaW5pc3RpYyBzdGFydAorCSAqLworCisJbC5vcmkJcjMscjAsMHgxCisJbC5tdHNwcglyMCxyMyxTUFJfU1IKKworCUNMRUFSX0dQUihyMSkKKwlDTEVBUl9HUFIocjIpCisJQ0xFQVJfR1BSKHIzKQorCUNMRUFSX0dQUihyNCkKKwlDTEVBUl9HUFIocjUpCisJQ0xFQVJfR1BSKHI2KQorCUNMRUFSX0dQUihyNykKKwlDTEVBUl9HUFIocjgpCisJQ0xFQVJfR1BSKHI5KQorCUNMRUFSX0dQUihyMTApCisJQ0xFQVJfR1BSKHIxMSkKKwlDTEVBUl9HUFIocjEyKQorCUNMRUFSX0dQUihyMTMpCisJQ0xFQVJfR1BSKHIxNCkKKwlDTEVBUl9HUFIocjE1KQorCUNMRUFSX0dQUihyMTYpCisJQ0xFQVJfR1BSKHIxNykKKwlDTEVBUl9HUFIocjE4KQorCUNMRUFSX0dQUihyMTkpCisJQ0xFQVJfR1BSKHIyMCkKKwlDTEVBUl9HUFIocjIxKQorCUNMRUFSX0dQUihyMjIpCisJQ0xFQVJfR1BSKHIyMykKKwlDTEVBUl9HUFIocjI0KQorCUNMRUFSX0dQUihyMjUpCisJQ0xFQVJfR1BSKHIyNikKKwlDTEVBUl9HUFIocjI3KQorCUNMRUFSX0dQUihyMjgpCisJQ0xFQVJfR1BSKHIyOSkKKwlDTEVBUl9HUFIocjMwKQorCUNMRUFSX0dQUihyMzEpCisKKwkvKgorCSAqIHNldCB1cCBpbml0aWFsIGtzcCBhbmQgY3VycmVudAorCSAqLworCUxPQURfU1lNQk9MXzJfR1BSKHIxLGluaXRfdGhyZWFkX3VuaW9uKzB4MjAwMCkJLy8gc2V0dXAga2VybmVsIHN0YWNrCisJTE9BRF9TWU1CT0xfMl9HUFIocjEwLGluaXRfdGhyZWFkX3VuaW9uKQkvLyBzZXR1cCBjdXJyZW50CisJdG9waHlzCShyMzEscjEwKQorCWwuc3cJVElfS1NQKHIzMSksIHIxCisKKwlsLm9yaQlyNCxyMCwweDAKKworCisJLyoKKwkgKiAuZGF0YSBjb250YWlucyBpbml0aWFsaXplZCBkYXRhLAorCSAqIC5ic3MgY29udGFpbnMgdW5pbml0aWFsaXplZCBkYXRhIC0gY2xlYXIgaXQgdXAKKwkgKi8KK2NsZWFyX2JzczoKKwlMT0FEX1NZTUJPTF8yX0dQUihyMjQsIF9fYnNzX3N0YXJ0KQorCUxPQURfU1lNQk9MXzJfR1BSKHIyNiwgX2VuZCkKKwl0b3BoeXMocjI4LHIyNCkKKwl0b3BoeXMocjMwLHIyNikKKwlDTEVBUl9HUFIocjI0KQorCUNMRUFSX0dQUihyMjYpCisxOgorCWwuc3cgICAgKDApKHIyOCkscjAKKwlsLnNmbHR1IHIyOCxyMzAKKwlsLmJmICAgIDFiCisJbC5hZGRpICByMjgscjI4LDQKKworZW5hYmxlX2ljOgorCWwuamFsCV9pY19lbmFibGUKKwkgbC5ub3AKKworZW5hYmxlX2RjOgorCWwuamFsCV9kY19lbmFibGUKKwkgbC5ub3AKKworZmx1c2hfdGxiOgorCS8qCisJICogIEkgTiBWIEEgTCBJIEQgQSBUIEUgICBUIEwgQiAgIGUgbiB0IHIgaSBlIHMKKwkgKi8KKwlMT0FEX1NZTUJPTF8yX0dQUihyNSxTUFJfRFRMQk1SX0JBU0UoMCkpCisJTE9BRF9TWU1CT0xfMl9HUFIocjYsU1BSX0lUTEJNUl9CQVNFKDApKQorCWwuYWRkaQlyNyxyMCwxMjggLyogTWF4aW11bSBudW1iZXIgb2Ygc2V0cyAqLworMToKKwlsLm10c3ByCXI1LHIwLDB4MAorCWwubXRzcHIJcjYscjAsMHgwCisKKwlsLmFkZGkJcjUscjUsMQorCWwuYWRkaQlyNixyNiwxCisJbC5zZmVxCXI3LHIwCisJbC5ibmYJMWIKKwkgbC5hZGRpCXI3LHI3LC0xCisKKworLyogVGhlIE1NVSBuZWVkcyB0byBiZSBlbmFibGVkIGJlZm9yZSBvcjMyX2Vhcmx5X3NldHVwIGlzIGNhbGxlZCAqLworCitlbmFibGVfbW11OgorCS8qCisJICogZW5hYmxlIGRtbXUgJiBpbW11CisJICogU1JbNV0gPSAwLCBTUls2XSA9IDAsIDZ0aCBhbmQgN3RoIGJpdCBvZiBTUiBzZXQgdG8gMAorCSAqLworCWwubWZzcHIJcjMwLHIwLFNQUl9TUgorCWwubW92aGkJcjI4LGhpKFNQUl9TUl9ETUUgfCBTUFJfU1JfSU1FKQorCWwub3JpCXIyOCxyMjgsbG8oU1BSX1NSX0RNRSB8IFNQUl9TUl9JTUUpCisJbC5vcglyMzAscjMwLHIyOAorCWwubXRzcHIJcjAscjMwLFNQUl9TUgorCWwubm9wCisJbC5ub3AKKwlsLm5vcAorCWwubm9wCisJbC5ub3AKKwlsLm5vcAorCWwubm9wCisJbC5ub3AKKwlsLm5vcAorCWwubm9wCisJbC5ub3AKKwlsLm5vcAorCWwubm9wCisJbC5ub3AKKwlsLm5vcAorCWwubm9wCisKKwkvLyByZXNldCB0aGUgc2ltdWxhdGlvbiBjb3VudGVycworCWwubm9wIDUKKworCUxPQURfU1lNQk9MXzJfR1BSKHIyNCwgb3IzMl9lYXJseV9zZXR1cCkKKwlsLmphbHIgcjI0CisJIGwubm9wCisKK2NsZWFyX3JlZ3M6CisJLyoKKwkgKiBjbGVhciBhbGwgR1BSUyB0byBpbmNyZWFzZSBkZXRlcm1pbmlzbQorCSAqLworCUNMRUFSX0dQUihyMikKKwlDTEVBUl9HUFIocjMpCisJQ0xFQVJfR1BSKHI0KQorCUNMRUFSX0dQUihyNSkKKwlDTEVBUl9HUFIocjYpCisJQ0xFQVJfR1BSKHI3KQorCUNMRUFSX0dQUihyOCkKKwlDTEVBUl9HUFIocjkpCisJQ0xFQVJfR1BSKHIxMSkKKwlDTEVBUl9HUFIocjEyKQorCUNMRUFSX0dQUihyMTMpCisJQ0xFQVJfR1BSKHIxNCkKKwlDTEVBUl9HUFIocjE1KQorCUNMRUFSX0dQUihyMTYpCisJQ0xFQVJfR1BSKHIxNykKKwlDTEVBUl9HUFIocjE4KQorCUNMRUFSX0dQUihyMTkpCisJQ0xFQVJfR1BSKHIyMCkKKwlDTEVBUl9HUFIocjIxKQorCUNMRUFSX0dQUihyMjIpCisJQ0xFQVJfR1BSKHIyMykKKwlDTEVBUl9HUFIocjI0KQorCUNMRUFSX0dQUihyMjUpCisJQ0xFQVJfR1BSKHIyNikKKwlDTEVBUl9HUFIocjI3KQorCUNMRUFSX0dQUihyMjgpCisJQ0xFQVJfR1BSKHIyOSkKKwlDTEVBUl9HUFIocjMwKQorCUNMRUFSX0dQUihyMzEpCisKK2p1bXBfc3RhcnRfa2VybmVsOgorCS8qCisJICoganVtcCB0byBrZXJuZWwgZW50cnkgKHN0YXJ0X2tlcm5lbCkKKwkgKi8KKwlMT0FEX1NZTUJPTF8yX0dQUihyMzAsIHN0YXJ0X2tlcm5lbCkKKwlsLmpyICAgIHIzMAorCSBsLm5vcAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09WyBjYWNoZSBdPT09ICovCisKKwkvKiBhbGlnbWVudCBoZXJlIHNvIHdlIGRvbid0IGNoYW5nZSBtZW1vcnkgb2Zmc2V0cyB3aXRoCisJICogbWVtb3J5IGNvbnRyb2xlciBkZWZpbmVkCisJICovCisJLmFsaWduIDB4MjAwMAorCitfaWNfZW5hYmxlOgorCS8qIENoZWNrIGlmIElDIHByZXNlbnQgYW5kIHNraXAgZW5hYmxpbmcgb3RoZXJ3aXNlICovCisJbC5tZnNwciByMjQscjAsU1BSX1VQUgorCWwuYW5kaSAgcjI2LHIyNCxTUFJfVVBSX0lDUAorCWwuc2ZlcSAgcjI2LHIwCisJbC5iZgk5ZgorCWwubm9wCisKKwkvKiBEaXNhYmxlIElDICovCisJbC5tZnNwciByNixyMCxTUFJfU1IKKwlsLmFkZGkgIHI1LHIwLC0xCisJbC54b3JpICByNSxyNSxTUFJfU1JfSUNFCisJbC5hbmQgICByNSxyNixyNQorCWwubXRzcHIgcjAscjUsU1BSX1NSCisKKwkvKiBFc3RhYmxpc2ggY2FjaGUgYmxvY2sgc2l6ZQorCSAgIElmIEJTPTAsIDE2OworCSAgIElmIEJTPTEsIDMyOworCSAgIHIxNCBjb250YWluIGJsb2NrIHNpemUKKwkqLworCWwubWZzcHIgcjI0LHIwLFNQUl9JQ0NGR1IKKwlsLmFuZGkJcjI2LHIyNCxTUFJfSUNDRkdSX0NCUworCWwuc3JsaQlyMjgscjI2LDcKKwlsLm9yaQlyMzAscjAsMTYKKwlsLnNsbAlyMTQscjMwLHIyOAorCisJLyogRXN0YWJsaXNoIG51bWJlciBvZiBjYWNoZSBzZXRzCisJICAgcjE2IGNvbnRhaW5zIG51bWJlciBvZiBjYWNoZSBzZXRzCisJICAgcjI4IGNvbnRhaW5zIGxvZygjIG9mIGNhY2hlIHNldHMpCisJKi8KKwlsLmFuZGkgIHIyNixyMjQsU1BSX0lDQ0ZHUl9OQ1MKKwlsLnNybGkgCXIyOCxyMjYsMworCWwub3JpICAgcjMwLHIwLDEKKwlsLnNsbCAgIHIxNixyMzAscjI4CisKKwkvKiBJbnZhbGlkYXRlIElDICovCisJbC5hZGRpICByNixyMCwwCisJbC5zbGwgICByNSxyMTQscjI4CisvLyAgICAgICAgbC5tdWwgICByNSxyMTQscjE2CisvLwlsLnRyYXAgIDEKKy8vCWwuYWRkaSAgcjUscjAsSUNfU0laRQorMToKKwlsLm10c3ByIHIwLHI2LFNQUl9JQ0JJUgorCWwuc2ZuZSAgcjYscjUKKwlsLmJmICAgIDFiCisJbC5hZGQgICByNixyNixyMTQKKyAvLyAgICAgICBsLmFkZGkgICByNixyNixJQ19MSU5FCisKKwkvKiBFbmFibGUgSUMgKi8KKwlsLm1mc3ByIHI2LHIwLFNQUl9TUgorCWwub3JpICAgcjYscjYsU1BSX1NSX0lDRQorCWwubXRzcHIgcjAscjYsU1BSX1NSCisJbC5ub3AKKwlsLm5vcAorCWwubm9wCisJbC5ub3AKKwlsLm5vcAorCWwubm9wCisJbC5ub3AKKwlsLm5vcAorCWwubm9wCisJbC5ub3AKKzk6CisJbC5qciAgICByOQorCWwubm9wCisKK19kY19lbmFibGU6CisJLyogQ2hlY2sgaWYgREMgcHJlc2VudCBhbmQgc2tpcCBlbmFibGluZyBvdGhlcndpc2UgKi8KKwlsLm1mc3ByIHIyNCxyMCxTUFJfVVBSCisJbC5hbmRpICByMjYscjI0LFNQUl9VUFJfRENQCisJbC5zZmVxICByMjYscjAKKwlsLmJmCTlmCisJbC5ub3AKKworCS8qIERpc2FibGUgREMgKi8KKwlsLm1mc3ByIHI2LHIwLFNQUl9TUgorCWwuYWRkaSAgcjUscjAsLTEKKwlsLnhvcmkgIHI1LHI1LFNQUl9TUl9EQ0UKKwlsLmFuZCAgIHI1LHI2LHI1CisJbC5tdHNwciByMCxyNSxTUFJfU1IKKworCS8qIEVzdGFibGlzaCBjYWNoZSBibG9jayBzaXplCisJICAgSWYgQlM9MCwgMTY7CisJICAgSWYgQlM9MSwgMzI7CisJICAgcjE0IGNvbnRhaW4gYmxvY2sgc2l6ZQorCSovCisJbC5tZnNwciByMjQscjAsU1BSX0RDQ0ZHUgorCWwuYW5kaQlyMjYscjI0LFNQUl9EQ0NGR1JfQ0JTCisJbC5zcmxpCXIyOCxyMjYsNworCWwub3JpCXIzMCxyMCwxNgorCWwuc2xsCXIxNCxyMzAscjI4CisKKwkvKiBFc3RhYmxpc2ggbnVtYmVyIG9mIGNhY2hlIHNldHMKKwkgICByMTYgY29udGFpbnMgbnVtYmVyIG9mIGNhY2hlIHNldHMKKwkgICByMjggY29udGFpbnMgbG9nKCMgb2YgY2FjaGUgc2V0cykKKwkqLworCWwuYW5kaSAgcjI2LHIyNCxTUFJfRENDRkdSX05DUworCWwuc3JsaSAJcjI4LHIyNiwzCisJbC5vcmkgICByMzAscjAsMQorCWwuc2xsICAgcjE2LHIzMCxyMjgKKworCS8qIEludmFsaWRhdGUgREMgKi8KKwlsLmFkZGkgIHI2LHIwLDAKKwlsLnNsbCAgIHI1LHIxNCxyMjgKKzE6CisJbC5tdHNwciByMCxyNixTUFJfRENCSVIKKwlsLnNmbmUgIHI2LHI1CisJbC5iZiAgICAxYgorCWwuYWRkICAgcjYscjYscjE0CisKKwkvKiBFbmFibGUgREMgKi8KKwlsLm1mc3ByIHI2LHIwLFNQUl9TUgorCWwub3JpICAgcjYscjYsU1BSX1NSX0RDRQorCWwubXRzcHIgcjAscjYsU1BSX1NSCis5OgorCWwuanIgICAgcjkKKwlsLm5vcAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVsgcGFnZSB0YWJsZSBtYXNrcyBdPT09ICovCisKKy8qIGJpdCA0IGlzIHVzZWQgaW4gaGFyZHdhcmUgYXMgd3JpdGUgYmFjayBjYWNoZSBiaXQuIHdlIG5ldmVyIHVzZSB0aGlzIGJpdAorICogZXhwbGljaXRseSwgc28gd2UgY2FuIHJldXNlIGl0IGFzIF9QQUdFX0ZJTEUgYml0IGFuZCBtYXNrIGl0IG91dCB3aGVuCisgKiB3cml0aW5nIGludG8gaGFyZHdhcmUgcHRlJ3MKKyAqLworCisjZGVmaW5lIERUTEJfVVBfQ09OVkVSVF9NQVNLICAweDNmYQorI2RlZmluZSBJVExCX1VQX0NPTlZFUlRfTUFTSyAgMHgzYQorCisvKiBmb3IgU01QIHdlJ2QgaGF2ZSAodGhpcyBpcyBhIGJpdCBzdWJ0bGUsIENDIG11c3QgYmUgYWx3YXlzIHNldAorICogZm9yIFNNUCwgYnV0IHNpbmNlIHdlIGhhdmUgX1BBR0VfUFJFU0VOVCBiaXQgYWx3YXlzIGRlZmluZWQKKyAqIHdlIGNhbiBqdXN0IG1vZGlmeSB0aGUgbWFzaykKKyAqLworI2RlZmluZSBEVExCX1NNUF9DT05WRVJUX01BU0sgIDB4M2ZiCisjZGVmaW5lIElUTEJfU01QX0NPTlZFUlRfTUFTSyAgMHgzYgorCisvKiAtLS1bIGJvb3QgZHRsYiBtaXNzIGhhbmRsZXIgXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2Jvb3RfZHRsYl9taXNzX2hhbmRsZXI6CisKKy8qIG1hc2sgZm9yIERUTEJfTVIgcmVnaXN0ZXI6IC0gKDApIHNldHMgViAodmFsaWQpIGJpdCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKDMxLTEyKSBzZXRzIGJpdHMgYmVsb25naW5nIHRvIFZQTiAoMzEtMTIpCisgKi8KKyNkZWZpbmUgRFRMQl9NUl9NQVNLIDB4ZmZmZmYwMDEKKworLyogbWFzayBmb3IgRFRMQl9UUiByZWdpc3RlcjogLSAoMikgc2V0cyBDSSAoY2FjaGUgaW5oaWJpdCkgYml0LAorICoJCQkgICAgICAtICg0KSBzZXRzIEEgKGFjY2VzcykgYml0LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoNSkgc2V0cyBEIChkaXJ0eSkgYml0LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoOCkgc2V0cyBTUkUgKHN1cGVydXNlciByZWFkKSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKDkpIHNldHMgU1dFIChzdXBlcnVzZXIgd3JpdGUpIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoMzEtMTIpIHNldHMgYml0cyBiZWxvbmdpbmcgdG8gVlBOICgzMS0xMikKKyAqLworI2RlZmluZSBEVExCX1RSX01BU0sgMHhmZmZmZjMzMgorCisvKiBUaGVzZSBhcmUgZm9yIG1hc2tpbmcgb3V0IHRoZSBWUE4vUFBOIHZhbHVlIGZyb20gdGhlIE1SL1RSIHJlZ2lzdGVycy4uLgorICogaXQncyBub3QgdGhlIHNhbWUgYXMgdGhlIFBGTiAqLworI2RlZmluZSBWUE5fTUFTSyAweGZmZmZmMDAwCisjZGVmaW5lIFBQTl9NQVNLIDB4ZmZmZmYwMDAKKworCisJRVhDRVBUSU9OX1NUT1JFX0dQUjYKKworI2lmIDAKKwlsLm1mc3ByIHI2LHIwLFNQUl9FU1JfQkFTRQkgICAvLworCWwuYW5kaSAgcjYscjYsU1BSX1NSX1NNICAgICAgICAgICAgLy8gYXJlIHdlIGluIGtlcm5lbCBtb2RlID8KKwlsLnNmZXFpIHI2LDAgICAgICAgICAgICAgICAgICAgICAgIC8vIHI2ID09IDB4MSAtLT4gU00KKwlsLmJmICAgIGV4aXRfd2l0aF9ub19kdHJhbnNsYXRpb24gIC8vCisJbC5ub3AKKyNlbmRpZgorCisJLyogdGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYnkgbW92aW5nIHN0b3Jpbmcgb2YKKwkgKiBub24gcjYgcmVnaXN0ZXJzIGhlcmUsIGFuZCBqdW1waW5nIHI2IHJlc3RvcmUKKwkgKiBpZiBub3QgaW4gc3VwZXJ2aXNvciBtb2RlCisJICovCisKKwlFWENFUFRJT05fU1RPUkVfR1BSMgorCUVYQ0VQVElPTl9TVE9SRV9HUFIzCisJRVhDRVBUSU9OX1NUT1JFX0dQUjQKKwlFWENFUFRJT05fU1RPUkVfR1BSNQorCisJbC5tZnNwciByNCxyMCxTUFJfRUVBUl9CQVNFICAgICAgICAvLyBnZXQgdGhlIG9mZmVuZGluZyBFQQorCitpbW1lZGlhdGVfdHJhbnNsYXRpb246CisJQ0xFQVJfR1BSKHI2KQorCisJbC5zcmxpCXIzLHI0LDB4ZCAgICAgICAgICAgICAgICAgIC8vIHIzIDwtIHI0IC8gODE5MiAoc2V0cyBhcmUgcmVsYXRpdmUgdG8gcGFnZSBzaXplICg4S2IpIE5PVCBWUE4gc2l6ZSAoNEtiKQorCisJbC5tZnNwciByNiwgcjAsIFNQUl9ETU1VQ0ZHUgorCWwuYW5kaQlyNiwgcjYsIFNQUl9ETU1VQ0ZHUl9OVFMKKwlsLnNybGkJcjYsIHI2LCBTUFJfRE1NVUNGR1JfTlRTX09GRgorCWwub3JpCXI1LCByMCwgMHgxCisJbC5zbGwJcjUsIHI1LCByNiAJLy8gcjUgPSBudW1iZXIgRE1NVSBzZXRzCisJbC5hZGRpCXI2LCByNSwgLTEgIAkvLyByNiA9IG5zZXRzIG1hc2sKKwlsLmFuZAlyMiwgcjMsIHI2CS8vIHIyIDwtIHIzICUgTlNFVFNfTUFTSworCisJbC5vciAgICByNixyNixyNCAgICAgICAgICAgICAgICAgICAvLyByNiA8LSByNAorCWwub3JpICAgcjYscjYsfihWUE5fTUFTSykgICAgICAgICAgLy8gcjYgPC0gVlBOIDpWUE4gLnhmZmYgLSBjbGVhciB1cCBsbyhyNikgdG8gMHgqKioqICpmZmYKKwlsLm1vdmhpIHI1LGhpKERUTEJfTVJfTUFTSykgICAgICAgIC8vIHI1IDwtIGZmZmY6MDAwMC54MDAwCisJbC5vcmkgICByNSxyNSxsbyhEVExCX01SX01BU0spICAgICAvLyByNSA8LSBmZmZmOjExMTEueDAwMSAtIGFwcGx5IERUTEJfTVJfTUFTSworCWwuYW5kICAgcjUscjUscjYgICAgICAgICAgICAgICAgICAgLy8gcjUgPC0gVlBOIDpWUE4gLngwMDEgLSB3ZSBoYXZlIERUTEJNUiBlbnRyeQorCWwubXRzcHIgcjIscjUsU1BSX0RUTEJNUl9CQVNFKDApICAgLy8gc2V0IERUTEJNUgorCisJLyogc2V0IHVwIERUTEIgd2l0aCBubyB0cmFuc2xhdGlvbiBmb3IgRUEgPD0gMHhiZmZmZmZmZiAqLworCUxPQURfU1lNQk9MXzJfR1BSKHI2LDB4YmZmZmZmZmYpCisJbC5zZmdldSAgcjYscjQgICAgICAgICAgICAgICAgICAgICAvLyBmbGFnIGlmIHI2ID49IHI0IChpZiAweGJmZmZmZmZmID49IEVBKQorCWwuYmYgICAgIDFmICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ290byBvdXQKKwlsLmFuZCAgICByMyxyNCxyNCAgICAgICAgICAgICAgICAgIC8vIGRlbGF5IHNsb3QgOjogMjQgPC0gcjQgKGlmIGZsYWc9PTEpCisKKwl0b3BoeXMocjMscjQpICAgICAgICAgICAgICAgICAgICAgIC8vIHIzIDwtIFBBCisxOgorCWwub3JpICAgcjMscjMsfihQUE5fTUFTSykgICAgICAgICAgLy8gcjMgPC0gUFBOIDpQUE4gLnhmZmYgLSBjbGVhciB1cCBsbyhyNikgdG8gMHgqKioqICpmZmYKKwlsLm1vdmhpIHI1LGhpKERUTEJfVFJfTUFTSykgICAgICAgIC8vIHI1IDwtIGZmZmY6MDAwMC54MDAwCisJbC5vcmkgICByNSxyNSxsbyhEVExCX1RSX01BU0spICAgICAvLyByNSA8LSBmZmZmOjExMTEueDMzMCAtIGFwcGx5IERUTEJfTVJfTUFTSworCWwuYW5kICAgcjUscjUscjMgICAgICAgICAgICAgICAgICAgLy8gcjUgPC0gUFBOIDpQUE4gLngzMzAgLSB3ZSBoYXZlIERUTEJUUiBlbnRyeQorCWwubXRzcHIgcjIscjUsU1BSX0RUTEJUUl9CQVNFKDApICAgLy8gc2V0IERUTEJUUgorCisJRVhDRVBUSU9OX0xPQURfR1BSNgorCUVYQ0VQVElPTl9MT0FEX0dQUjUKKwlFWENFUFRJT05fTE9BRF9HUFI0CisJRVhDRVBUSU9OX0xPQURfR1BSMworCUVYQ0VQVElPTl9MT0FEX0dQUjIKKworCWwucmZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1IgPC0gRVNSLCBQQyA8LSBFUEMKKworZXhpdF93aXRoX25vX2R0cmFuc2xhdGlvbjoKKwkvKiBFQSBvdXQgb2YgbWVtb3J5IG9yIG5vdCBpbiBzdXBlcnZpc29yIG1vZGUgKi8KKwlFWENFUFRJT05fTE9BRF9HUFI2CisJRVhDRVBUSU9OX0xPQURfR1BSNAorCWwuaglfZGlzcGF0Y2hfYnVzX2ZhdWx0CisKKy8qIC0tLVsgYm9vdCBpdGxiIG1pc3MgaGFuZGxlciBdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworYm9vdF9pdGxiX21pc3NfaGFuZGxlcjoKKworLyogbWFzayBmb3IgSVRMQl9NUiByZWdpc3RlcjogLSBzZXRzIFYgKHZhbGlkKSBiaXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNldHMgYml0cyBiZWxvbmdpbmcgdG8gVlBOICgxNS0xMikKKyAqLworI2RlZmluZSBJVExCX01SX01BU0sgMHhmZmZmZjAwMQorCisvKiBtYXNrIGZvciBJVExCX1RSIHJlZ2lzdGVyOiAtIHNldHMgQSAoYWNjZXNzKSBiaXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNldHMgU1hFIChzdXBlcnVzZXIgZXhlY3V0ZSkgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNldHMgYml0cyBiZWxvbmdpbmcgdG8gVlBOICgxNS0xMikKKyAqLworI2RlZmluZSBJVExCX1RSX01BU0sgMHhmZmZmZjA1MAorCisvKgorI2RlZmluZSBWUE5fTUFTSyAweGZmZmZlMDAwCisjZGVmaW5lIFBQTl9NQVNLIDB4ZmZmZmUwMDAKKyovCisKKworCisJRVhDRVBUSU9OX1NUT1JFX0dQUjIKKwlFWENFUFRJT05fU1RPUkVfR1BSMworCUVYQ0VQVElPTl9TVE9SRV9HUFI0CisJRVhDRVBUSU9OX1NUT1JFX0dQUjUKKwlFWENFUFRJT05fU1RPUkVfR1BSNgorCisjaWYgMAorCWwubWZzcHIgcjYscjAsU1BSX0VTUl9CQVNFICAgICAgICAgLy8KKwlsLmFuZGkgIHI2LHI2LFNQUl9TUl9TTSAgICAgICAgICAgIC8vIGFyZSB3ZSBpbiBrZXJuZWwgbW9kZSA/CisJbC5zZmVxaSByNiwwICAgICAgICAgICAgICAgICAgICAgICAvLyByNiA9PSAweDEgLS0+IFNNCisJbC5iZiAgICBleGl0X3dpdGhfbm9faXRyYW5zbGF0aW9uCisJbC5ub3AKKyNlbmRpZgorCisKKwlsLm1mc3ByIHI0LHIwLFNQUl9FRUFSX0JBU0UgICAgICAgIC8vIGdldCB0aGUgb2ZmZW5kaW5nIEVBCisKK2Vhcmx5ZWFybHk6CisJQ0xFQVJfR1BSKHI2KQorCisJbC5zcmxpICByMyxyNCwweGQgICAgICAgICAgICAgICAgICAvLyByMyA8LSByNCAvIDgxOTIgKHNldHMgYXJlIHJlbGF0aXZlIHRvIHBhZ2Ugc2l6ZSAoOEtiKSBOT1QgVlBOIHNpemUgKDRLYikKKworCWwubWZzcHIgcjYsIHIwLCBTUFJfSU1NVUNGR1IKKwlsLmFuZGkJcjYsIHI2LCBTUFJfSU1NVUNGR1JfTlRTCisJbC5zcmxpCXI2LCByNiwgU1BSX0lNTVVDRkdSX05UU19PRkYKKwlsLm9yaQlyNSwgcjAsIDB4MQorCWwuc2xsCXI1LCByNSwgcjYgCS8vIHI1ID0gbnVtYmVyIElNTVUgc2V0cyBmcm9tIElNTVVDRkdSCisJbC5hZGRpCXI2LCByNSwgLTEgIAkvLyByNiA9IG5zZXRzIG1hc2sKKwlsLmFuZAlyMiwgcjMsIHI2CS8vIHIyIDwtIHIzICUgTlNFVFNfTUFTSworCisJbC5vciAgICByNixyNixyNCAgICAgICAgICAgICAgICAgICAvLyByNiA8LSByNAorCWwub3JpICAgcjYscjYsfihWUE5fTUFTSykgICAgICAgICAgLy8gcjYgPC0gVlBOIDpWUE4gLnhmZmYgLSBjbGVhciB1cCBsbyhyNikgdG8gMHgqKioqICpmZmYKKwlsLm1vdmhpIHI1LGhpKElUTEJfTVJfTUFTSykgICAgICAgIC8vIHI1IDwtIGZmZmY6MDAwMC54MDAwCisJbC5vcmkgICByNSxyNSxsbyhJVExCX01SX01BU0spICAgICAvLyByNSA8LSBmZmZmOjExMTEueDAwMSAtIGFwcGx5IElUTEJfTVJfTUFTSworCWwuYW5kICAgcjUscjUscjYgICAgICAgICAgICAgICAgICAgLy8gcjUgPC0gVlBOIDpWUE4gLngwMDEgLSB3ZSBoYXZlIElUTEJNUiBlbnRyeQorCWwubXRzcHIgcjIscjUsU1BSX0lUTEJNUl9CQVNFKDApICAgLy8gc2V0IElUTEJNUgorCisJLyoKKwkgKiBzZXQgdXAgSVRMQiB3aXRoIG5vIHRyYW5zbGF0aW9uIGZvciBFQSA8PSAweDBmZmZmZmZmCisJICoKKwkgKiB3ZSBuZWVkIHRoaXMgZm9yIGhlYWQuUyBtYXBwaW5nIChFQSA9IFBBKS4gaWYgd2UgbW92ZSBhbGwgZnVuY3Rpb25zCisJICogd2hpY2ggcnVuIHdpdGggbW11IGVuYWJsZWQgaW50byBlbnRyeS5TLCB3ZSBtaWdodCBiZSBhYmxlIHRvIGVsaW1pbmF0ZSB0aGlzLgorCSAqCisJICovCisJTE9BRF9TWU1CT0xfMl9HUFIocjYsMHgwZmZmZmZmZikKKwlsLnNmZ2V1ICByNixyNCAgICAgICAgICAgICAgICAgICAgIC8vIGZsYWcgaWYgcjYgPj0gcjQgKGlmIDB4YjBmZmZmZmYgPj0gRUEpCisJbC5iZiAgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAvLyBnb3RvIG91dAorCWwuYW5kICAgIHIzLHI0LHI0ICAgICAgICAgICAgICAgICAgLy8gZGVsYXkgc2xvdCA6OiAyNCA8LSByNCAoaWYgZmxhZz09MSkKKworCXRvcGh5cyhyMyxyNCkgICAgICAgICAgICAgICAgICAgICAgLy8gcjMgPC0gUEEKKzE6CisJbC5vcmkgICByMyxyMyx+KFBQTl9NQVNLKSAgICAgICAgICAvLyByMyA8LSBQUE4gOlBQTiAueGZmZiAtIGNsZWFyIHVwIGxvKHI2KSB0byAweCoqKiogKmZmZgorCWwubW92aGkgcjUsaGkoSVRMQl9UUl9NQVNLKSAgICAgICAgLy8gcjUgPC0gZmZmZjowMDAwLngwMDAKKwlsLm9yaSAgIHI1LHI1LGxvKElUTEJfVFJfTUFTSykgICAgIC8vIHI1IDwtIGZmZmY6MTExMS54MDUwIC0gYXBwbHkgSVRMQl9NUl9NQVNLCisJbC5hbmQgICByNSxyNSxyMyAgICAgICAgICAgICAgICAgICAvLyByNSA8LSBQUE4gOlBQTiAueDA1MCAtIHdlIGhhdmUgSVRMQlRSIGVudHJ5CisJbC5tdHNwciByMixyNSxTUFJfSVRMQlRSX0JBU0UoMCkgICAvLyBzZXQgSVRMQlRSCisKKwlFWENFUFRJT05fTE9BRF9HUFI2CisJRVhDRVBUSU9OX0xPQURfR1BSNQorCUVYQ0VQVElPTl9MT0FEX0dQUjQKKwlFWENFUFRJT05fTE9BRF9HUFIzCisJRVhDRVBUSU9OX0xPQURfR1BSMgorCisJbC5yZmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTUiA8LSBFU1IsIFBDIDwtIEVQQworCitleGl0X3dpdGhfbm9faXRyYW5zbGF0aW9uOgorCUVYQ0VQVElPTl9MT0FEX0dQUjQKKwlFWENFUFRJT05fTE9BRF9HUFI2CisJbC5qICAgIF9kaXNwYXRjaF9idXNfZmF1bHQKKwlsLm5vcAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKgorICogU3R1ZmYgYmVsb3cgaGVyZSBzaG91bGRuJ3QgZ28gaW50byAuaGVhZCBzZWN0aW9uLi4uIG1heWJlIHRoaXMgc3R1ZmYKKyAqIGNhbiBiZSBtb3ZlZCB0byBlbnRyeS5TID8/PworICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1bIERUTEIgbWlzcyBoYW5kbGVyIF09PT0gKi8KKworLyoKKyAqIENvbW1lbnRzOgorICogICBFeGNlcHRpb24gaGFuZGxlcnMgYXJlIGVudGVyZWQgd2l0aCBNTVUgb2ZmIHNvIHRoZSBmb2xsb3dpbmcgaGFuZGxlcgorICogICBuZWVkcyB0byB1c2UgcGh5c2ljYWwgYWRkcmVzc2luZworICoKKyAqLworCisJLnRleHQKK0VOVFJZKGR0bGJfbWlzc19oYW5kbGVyKQorCUVYQ0VQVElPTl9TVE9SRV9HUFIyCisJRVhDRVBUSU9OX1NUT1JFX0dQUjMKKwlFWENFUFRJT05fU1RPUkVfR1BSNAorCUVYQ0VQVElPTl9TVE9SRV9HUFI1CisJRVhDRVBUSU9OX1NUT1JFX0dQUjYKKwkvKgorCSAqIGdldCBFQSBvZiB0aGUgbWlzcworCSAqLworCWwubWZzcHIJcjIscjAsU1BSX0VFQVJfQkFTRQorCS8qCisJICogcG1kID0gKHBtZF90ICopKGN1cnJlbnRfcGdkICsgcGdkX2luZGV4KGRhZGRyKSk7CisJICovCisJR0VUX0NVUlJFTlRfUEdEKHIzLHI1KQkJLy8gcjMgaXMgY3VycmVudF9wZ2QsIHI1IGlzIHRlbXAKKwlsLnNybGkJcjQscjIsMHgxOAkJLy8gPj4gUEFHRV9TSElGVCArIChQQUdFX1NISUZUIC0gMikKKwlsLnNsbGkJcjQscjQsMHgyCQkvLyB0byBnZXQgYWRkcmVzcyA8PCAyCisJbC5hZGQJcjUscjQscjMJCS8vIHI0IGlzIHBnZF9pbmRleChkYWRkcikKKwkvKgorCSAqIGlmIChwbWRfbm9uZSgqcG1kKSkKKwkgKiAgIGdvdG8gcG1kX25vbmU6CisJICovCisJdG9waHlzCShyNCxyNSkKKwlsLmx3eglyMywweDAocjQpCQkvLyBnZXQgKnBtZCB2YWx1ZQorCWwuc2ZuZQlyMyxyMAorCWwuYm5mCWRfcG1kX25vbmUKKwkgbC5hbmRpCXIzLHIzLH5QQUdFX01BU0sgLy8weDFmZmYJCS8vIH5QQUdFX01BU0sKKwkvKgorCSAqIGlmIChwbWRfYmFkKCpwbWQpKQorCSAqICAgcG1kX2NsZWFyKHBtZCkKKwkgKiAgIGdvdG8gcG1kX2JhZDoKKwkgKi8KKy8vCWwuc2ZlcQlyMyxyMAkJCS8vIGNoZWNrICpwbWQgdmFsdWUKKy8vCWwuYmYJZF9wbWRfZ29vZAorCWwuYWRkaQlyMyxyMCwweGZmZmZlMDAwCS8vIFBBR0VfTUFTSworLy8JbC5qCWRfcG1kX2JhZAorLy8JbC5zdwkweDAocjQpLHIwCQkvLyBjbGVhciBwbWQKK2RfcG1kX2dvb2Q6CisJLyoKKwkgKiBwdGUgPSAqcHRlX29mZnNldChwbWQsIGRhZGRyKTsKKwkgKi8KKwlsLmx3eglyNCwweDAocjQpCQkvLyBnZXQgKipwbWQgdmFsdWUKKwlsLmFuZAlyNCxyNCxyMwkJLy8gJiBQQUdFX01BU0sKKwlsLnNybGkJcjUscjIsMHhkCQkvLyA+PiBQQUdFX1NISUZULCByMiA9PSBFRUFSCisJbC5hbmRpCXIzLHI1LDB4N2ZmCQkvLyAoMVVMIDw8IFBBR0VfU0hJRlQgLSAyKSAtIDEKKwlsLnNsbGkJcjMscjMsMHgyCQkvLyB0byBnZXQgYWRkcmVzcyA8PCAyCisJbC5hZGQJcjMscjMscjQKKwlsLmx3eglyMiwweDAocjMpCQkvLyB0aGlzIGlzIHB0ZSBhdCBsYXN0CisJLyoKKwkgKiBpZiAoIXB0ZV9wcmVzZW50KHB0ZSkpCisJICovCisJbC5hbmRpCXI0LHIyLDB4MQorCWwuc2ZuZQlyNCxyMAkJCS8vIGlzIHB0ZSBwcmVzZW50CisJbC5ibmYJZF9wdGVfbm90X3ByZXNlbnQKKwlsLmFkZGkJcjMscjAsMHhmZmZmZTNmYQkvLyBQQUdFX01BU0sgfCBEVExCX1VQX0NPTlZFUlRfTUFTSworCS8qCisJICogZmlsbCBEVExCIFRSIHJlZ2lzdGVyCisJICovCisJbC5hbmQJcjQscjIscjMJCS8vIGFwcGx5IHRoZSBtYXNrCisJLy8gRGV0ZXJtaW5lIG51bWJlciBvZiBETU1VIHNldHMKKwlsLm1mc3ByIHI2LCByMCwgU1BSX0RNTVVDRkdSCisJbC5hbmRpCXI2LCByNiwgU1BSX0RNTVVDRkdSX05UUworCWwuc3JsaQlyNiwgcjYsIFNQUl9ETU1VQ0ZHUl9OVFNfT0ZGCisJbC5vcmkJcjMsIHIwLCAweDEKKwlsLnNsbAlyMywgcjMsIHI2IAkvLyByMyA9IG51bWJlciBETU1VIHNldHMgRE1NVUNGR1IKKwlsLmFkZGkJcjYsIHIzLCAtMSAgCS8vIHI2ID0gbnNldHMgbWFzaworCWwuYW5kCXI1LCByNSwgcjYJLy8gY2FsYyBvZmZzZXQ6CSAmIChOVU1fVExCX0VOVFJJRVMtMSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL05VTV9UTEJfRU5UUklFUworCWwubXRzcHIJcjUscjQsU1BSX0RUTEJUUl9CQVNFKDApCisJLyoKKwkgKiBmaWxsIERUTEIgTVIgcmVnaXN0ZXIKKwkgKi8KKwlsLm1mc3ByCXIyLHIwLFNQUl9FRUFSX0JBU0UKKwlsLmFkZGkJcjMscjAsMHhmZmZmZTAwMAkvLyBQQUdFX01BU0sKKwlsLmFuZAlyNCxyMixyMwkJLy8gYXBwbHkgUEFHRV9NQVNLIHRvIEVBIChfX1BIWF9fIGRvIHdlIHJlYWxseSBuZWVkIHRoaXM/KQorCWwub3JpCXI0LHI0LDB4MQkJLy8gc2V0IGhhcmR3YXJlIHZhbGlkIGJpdDogRFRCTF9NUiBlbnRyeQorCWwubXRzcHIJcjUscjQsU1BSX0RUTEJNUl9CQVNFKDApCisKKwlFWENFUFRJT05fTE9BRF9HUFIyCisJRVhDRVBUSU9OX0xPQURfR1BSMworCUVYQ0VQVElPTl9MT0FEX0dQUjQKKwlFWENFUFRJT05fTE9BRF9HUFI1CisJRVhDRVBUSU9OX0xPQURfR1BSNgorCWwucmZlCitkX3BtZF9iYWQ6CisJbC5ub3AJMQorCUVYQ0VQVElPTl9MT0FEX0dQUjIKKwlFWENFUFRJT05fTE9BRF9HUFIzCisJRVhDRVBUSU9OX0xPQURfR1BSNAorCUVYQ0VQVElPTl9MT0FEX0dQUjUKKwlFWENFUFRJT05fTE9BRF9HUFI2CisJbC5yZmUKK2RfcG1kX25vbmU6CitkX3B0ZV9ub3RfcHJlc2VudDoKKwlFWENFUFRJT05fTE9BRF9HUFIyCisJRVhDRVBUSU9OX0xPQURfR1BSMworCUVYQ0VQVElPTl9MT0FEX0dQUjQKKwlFWENFUFRJT05fTE9BRF9HUFI1CisJRVhDRVBUSU9OX0xPQURfR1BSNgorCWwuaglfZGlzcGF0Y2hfZG9fZHBhZ2VfZmF1bHQKKwlsLm5vcAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09WyBJVExCIG1pc3MgaGFuZGxlciBdPT09ICovCitFTlRSWShpdGxiX21pc3NfaGFuZGxlcikKKwlFWENFUFRJT05fU1RPUkVfR1BSMgorCUVYQ0VQVElPTl9TVE9SRV9HUFIzCisJRVhDRVBUSU9OX1NUT1JFX0dQUjQKKwlFWENFUFRJT05fU1RPUkVfR1BSNQorCUVYQ0VQVElPTl9TVE9SRV9HUFI2CisJLyoKKwkgKiBnZXQgRUEgb2YgdGhlIG1pc3MKKwkgKi8KKwlsLm1mc3ByCXIyLHIwLFNQUl9FRUFSX0JBU0UKKworCS8qCisJICogcG1kID0gKHBtZF90ICopKGN1cnJlbnRfcGdkICsgcGdkX2luZGV4KGRhZGRyKSk7CisJICoKKwkgKi8KKwlHRVRfQ1VSUkVOVF9QR0QocjMscjUpCQkvLyByMyBpcyBjdXJyZW50X3BnZCwgcjUgaXMgdGVtcAorCWwuc3JsaQlyNCxyMiwweDE4CQkvLyA+PiBQQUdFX1NISUZUICsgKFBBR0VfU0hJRlQgLSAyKQorCWwuc2xsaQlyNCxyNCwweDIJCS8vIHRvIGdldCBhZGRyZXNzIDw8IDIKKwlsLmFkZAlyNSxyNCxyMwkJLy8gcjQgaXMgcGdkX2luZGV4KGRhZGRyKQorCS8qCisJICogaWYgKHBtZF9ub25lKCpwbWQpKQorCSAqICAgZ290byBwbWRfbm9uZToKKwkgKi8KKwl0b3BoeXMJKHI0LHI1KQorCWwubHd6CXIzLDB4MChyNCkJCS8vIGdldCAqcG1kIHZhbHVlCisJbC5zZm5lCXIzLHIwCisJbC5ibmYJaV9wbWRfbm9uZQorCWwuYW5kaQlyMyxyMywweDFmZmYJCS8vIH5QQUdFX01BU0sKKwkvKgorCSAqIGlmIChwbWRfYmFkKCpwbWQpKQorCSAqICAgcG1kX2NsZWFyKHBtZCkKKwkgKiAgIGdvdG8gcG1kX2JhZDoKKwkgKi8KKworLy8JbC5zZmVxCXIzLHIwCQkJLy8gY2hlY2sgKnBtZCB2YWx1ZQorLy8JbC5iZglpX3BtZF9nb29kCisJbC5hZGRpCXIzLHIwLDB4ZmZmZmUwMDAJLy8gUEFHRV9NQVNLCisvLwlsLmoJaV9wbWRfYmFkCisvLwlsLnN3CTB4MChyNCkscjAJCS8vIGNsZWFyIHBtZAorCitpX3BtZF9nb29kOgorCS8qCisJICogcHRlID0gKnB0ZV9vZmZzZXQocG1kLCBpYWRkcik7CisJICoKKwkgKi8KKwlsLmx3eglyNCwweDAocjQpCQkvLyBnZXQgKipwbWQgdmFsdWUKKwlsLmFuZAlyNCxyNCxyMwkJLy8gJiBQQUdFX01BU0sKKwlsLnNybGkJcjUscjIsMHhkCQkvLyA+PiBQQUdFX1NISUZULCByMiA9PSBFRUFSCisJbC5hbmRpCXIzLHI1LDB4N2ZmCQkvLyAoMVVMIDw8IFBBR0VfU0hJRlQgLSAyKSAtIDEKKwlsLnNsbGkJcjMscjMsMHgyCQkvLyB0byBnZXQgYWRkcmVzcyA8PCAyCisJbC5hZGQJcjMscjMscjQKKwlsLmx3eglyMiwweDAocjMpCQkvLyB0aGlzIGlzIHB0ZSBhdCBsYXN0CisJLyoKKwkgKiBpZiAoIXB0ZV9wcmVzZW50KHB0ZSkpCisJICoKKwkgKi8KKwlsLmFuZGkJcjQscjIsMHgxCisJbC5zZm5lCXI0LHIwCQkJLy8gaXMgcHRlIHByZXNlbnQKKwlsLmJuZglpX3B0ZV9ub3RfcHJlc2VudAorCWwuYWRkaQlyMyxyMCwweGZmZmZlMDNhCS8vIFBBR0VfTUFTSyB8IElUTEJfVVBfQ09OVkVSVF9NQVNLCisJLyoKKwkgKiBmaWxsIElUTEIgVFIgcmVnaXN0ZXIKKwkgKi8KKwlsLmFuZAlyNCxyMixyMwkJLy8gYXBwbHkgdGhlIG1hc2sKKwlsLmFuZGkJcjMscjIsMHg3YzAJCS8vIF9QQUdFX0VYRUMgfCBfUEFHRV9TUkUgfCBfUEFHRV9TV0UgfCAgX1BBR0VfVVJFIHwgX1BBR0VfVVdFCisvLwlsLmFuZGkJcjMscjIsMHg0MDAJCS8vIF9QQUdFX0VYRUMKKwlsLnNmZXEJcjMscjAKKwlsLmJmCWl0bGJfdHJfZmlsbCAvL193b3JrYXJvdW5kCisJLy8gRGV0ZXJtaW5lIG51bWJlciBvZiBJTU1VIHNldHMKKwlsLm1mc3ByIHI2LCByMCwgU1BSX0lNTVVDRkdSCisJbC5hbmRpCXI2LCByNiwgU1BSX0lNTVVDRkdSX05UUworCWwuc3JsaQlyNiwgcjYsIFNQUl9JTU1VQ0ZHUl9OVFNfT0ZGCisJbC5vcmkJcjMsIHIwLCAweDEKKwlsLnNsbAlyMywgcjMsIHI2IAkvLyByMyA9IG51bWJlciBJTU1VIHNldHMgSU1NVUNGR1IKKwlsLmFkZGkJcjYsIHIzLCAtMSAgCS8vIHI2ID0gbnNldHMgbWFzaworCWwuYW5kCXI1LCByNSwgcjYJLy8gY2FsYyBvZmZzZXQ6CSAmIChOVU1fVExCX0VOVFJJRVMtMSkKKworLyoKKyAqIF9fUEhYX18gOjogZml4bWUKKyAqIHdlIHNob3VsZCBub3QganVzdCBibGluZGx5IHNldCBleGVjdXRhYmxlIGZsYWdzLAorICogYnV0IGl0IGRvZXMgaGVscCB3aXRoIHBpbmcuIHRoZSBjbGVhbiB3YXkgd291bGQgYmUgdG8gZmluZCBvdXQKKyAqIChhbmQgZml4IGl0KSB3aHkgc3RhY2sgZG9lc24ndCBoYXZlIGV4ZWN1dGlvbiBwZXJtaXNzaW9ucworICovCisKK2l0bGJfdHJfZmlsbF93b3JrYXJvdW5kOgorCWwub3JpCXI0LHI0LDB4YzAJCS8vIHwgKFNQUl9JVExCVFJfVVhFIHwgSVRMQlRSX1NYRSkKK2l0bGJfdHJfZmlsbDoKKwlsLm10c3ByCXI1LHI0LFNQUl9JVExCVFJfQkFTRSgwKQorCS8qCisJICogZmlsbCBEVExCIE1SIHJlZ2lzdGVyCisJICovCisJbC5tZnNwcglyMixyMCxTUFJfRUVBUl9CQVNFCisJbC5hZGRpCXIzLHIwLDB4ZmZmZmUwMDAJLy8gUEFHRV9NQVNLCisJbC5hbmQJcjQscjIscjMJCS8vIGFwcGx5IFBBR0VfTUFTSyB0byBFQSAoX19QSFhfXyBkbyB3ZSByZWFsbHkgbmVlZCB0aGlzPykKKwlsLm9yaQlyNCxyNCwweDEJCS8vIHNldCBoYXJkd2FyZSB2YWxpZCBiaXQ6IERUQkxfTVIgZW50cnkKKwlsLm10c3ByCXI1LHI0LFNQUl9JVExCTVJfQkFTRSgwKQorCisJRVhDRVBUSU9OX0xPQURfR1BSMgorCUVYQ0VQVElPTl9MT0FEX0dQUjMKKwlFWENFUFRJT05fTE9BRF9HUFI0CisJRVhDRVBUSU9OX0xPQURfR1BSNQorCUVYQ0VQVElPTl9MT0FEX0dQUjYKKwlsLnJmZQorCitpX3BtZF9iYWQ6CisJbC5ub3AJMQorCUVYQ0VQVElPTl9MT0FEX0dQUjIKKwlFWENFUFRJT05fTE9BRF9HUFIzCisJRVhDRVBUSU9OX0xPQURfR1BSNAorCUVYQ0VQVElPTl9MT0FEX0dQUjUKKwlFWENFUFRJT05fTE9BRF9HUFI2CisJbC5yZmUKK2lfcG1kX25vbmU6CitpX3B0ZV9ub3RfcHJlc2VudDoKKwlFWENFUFRJT05fTE9BRF9HUFIyCisJRVhDRVBUSU9OX0xPQURfR1BSMworCUVYQ0VQVElPTl9MT0FEX0dQUjQKKwlFWENFUFRJT05fTE9BRF9HUFI1CisJRVhDRVBUSU9OX0xPQURfR1BSNgorCWwuaglfZGlzcGF0Y2hfZG9faXBhZ2VfZmF1bHQKKwlsLm5vcAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09WyBib290IHRsYiBoYW5kbGVycyBdPT09ICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVsgZGVidWdnaW5nIGFpZHMgXT09PSAqLworCisJLmFsaWduIDY0CitfaW1tdV90cmFtcG9saW5lOgorCS5zcGFjZSA2NAorX2ltbXVfdHJhbXBvbGluZV90b3A6CisKKyNkZWZpbmUgVFJBTVBfU0xPVF8wCQkoMHgwKQorI2RlZmluZSBUUkFNUF9TTE9UXzEJCSgweDQpCisjZGVmaW5lIFRSQU1QX1NMT1RfMgkJKDB4OCkKKyNkZWZpbmUgVFJBTVBfU0xPVF8zCQkoMHhjKQorI2RlZmluZSBUUkFNUF9TTE9UXzQJCSgweDEwKQorI2RlZmluZSBUUkFNUF9TTE9UXzUJCSgweDE0KQorI2RlZmluZSBUUkFNUF9GUkFNRV9TSVpFCSgweDE4KQorCitFTlRSWShfaW1tdV90cmFtcG9saW5lX3dvcmthcm91bmQpCisJLy8gcjIgRUVBCisJLy8gcjYgaXMgcGh5c2ljYWwgRUVBCisJdG9waHlzKHI2LHIyKQorCisJTE9BRF9TWU1CT0xfMl9HUFIocjUsX2ltbXVfdHJhbXBvbGluZSkKKwl0b3BoeXMJKHIzLHI1KQkJCS8vIHIzIGlzIHRyYW1wb2xpbmUgKHBoeXNpY2FsKQorCisJTE9BRF9TWU1CT0xfMl9HUFIocjQsMHgxNTAwMDAwMCkKKwlsLnN3CVRSQU1QX1NMT1RfMChyMykscjQKKwlsLnN3CVRSQU1QX1NMT1RfMShyMykscjQKKwlsLnN3CVRSQU1QX1NMT1RfNChyMykscjQKKwlsLnN3CVRSQU1QX1NMT1RfNShyMykscjQKKworCQkJCQkvLyBFUEMgPSBFRUEgLSAweDQKKwlsLmx3eglyNCwweDAocjYpCQkvLyBsb2FkIG9wIEAgRUVBICsgMHgwIChmYyBhZGRyZXNzKQorCWwuc3cJVFJBTVBfU0xPVF8zKHIzKSxyNAkvLyBzdG9yZSBpdCB0byBfaW1tdV90cmFtcG9saW5lX2RhdGEKKwlsLmx3eglyNCwtMHg0KHI2KQkJLy8gbG9hZCBvcCBAIEVFQSAtIDB4NCAoZjggYWRkcmVzcykKKwlsLnN3CVRSQU1QX1NMT1RfMihyMykscjQJLy8gc3RvcmUgaXQgdG8gX2ltbXVfdHJhbXBvbGluZV9kYXRhCisKKwlsLnNybGkgIHI1LHI0LDI2ICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9wY29kZSBmb3Igd3JpdGUgYWNjZXNzCisJbC5zZmVxaSByNSwwICAgICAgICAgICAgICAgICAgICAvLyBsLmoKKwlsLmJmICAgIDBmCisJbC5zZmVxaSByNSwweDExICAgICAgICAgICAgICAgICAvLyBsLmpyCisJbC5iZiAgICAxZgorCWwuc2ZlcWkgcjUsMSAgICAgICAgICAgICAgICAgICAgLy8gbC5qYWwKKwlsLmJmICAgIDJmCisJbC5zZmVxaSByNSwweDEyICAgICAgICAgICAgICAgICAvLyBsLmphbHIKKwlsLmJmICAgIDNmCisJbC5zZmVxaSByNSwzICAgICAgICAgICAgICAgICAgICAvLyBsLmJuZgorCWwuYmYgICAgNGYKKwlsLnNmZXFpIHI1LDQgICAgICAgICAgICAgICAgICAgIC8vIGwuYmYKKwlsLmJmICAgIDVmCis5OToKKwlsLm5vcAorCWwuagk5OWIJCQkvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisJbC5ub3AJMQorCisJLy8gcjIgaXMgRUVBCisJLy8gcjMgaXMgdHJhbXBvbGluZSBhZGRyZXNzIChwaHlzaWNhbCkKKwkvLyByNCBpcyBpbnN0cnVjdGlvbgorCS8vIHI2IGlzIHBoeXNpY2FsKEVFQSkKKwkvLworCS8vIHI1CisKKzI6CS8vIGwuamFsCisKKwkvKiAxOSAyMCBhYSBhYQlsLm1vdmhpIHI5LDB4YWFhYQorCSAqIGE5IDI5IGJiIGJiICBsLm9yaQlyOSwweGJiYmIKKwkgKgorCSAqIHdoZXJlIDB4YWFhYWJiYmIgaXMgRUVBICsgMHg0IHNoaWZ0ZWQgcmlnaHQgMgorCSAqLworCisJbC5hZGRpCXI2LHIyLDB4NAkJLy8gdGhpcyBpcyAweGFhYWFiYmJiCisKKwkJCQkJLy8gbC5tb3ZoaSByOSwweGFhYWEKKwlsLm9yaQlyNSxyMCwweDE5MjAJCS8vIDB4MTkyMCA9PSBsLm1vdmhpIHI5CisJbC5zaAkoVFJBTVBfU0xPVF8wKzB4MCkocjMpLHI1CisJbC5zcmxpCXI1LHI2LDE2CisJbC5zaAkoVFJBTVBfU0xPVF8wKzB4MikocjMpLHI1CisKKwkJCQkJLy8gbC5vcmkgICByOSwweGJiYmIKKwlsLm9yaQlyNSxyMCwweGE5MjkJCS8vIDB4YTkyOSA9PSBsLm9yaSByOQorCWwuc2gJKFRSQU1QX1NMT1RfMSsweDApKHIzKSxyNQorCWwuYW5kaQlyNSxyNiwweGZmZmYKKwlsLnNoCShUUkFNUF9TTE9UXzErMHgyKShyMykscjUKKworCS8qIGZhbHRocm91Z2gsIG5lZWQgdG8gc2V0IHVwIG5ldyBqdW1wIG9mZnNldCAqLworCisKKzA6CS8vIGwuagorCWwuc2xsaQlyNixyNCw2CQkJLy8gb3JpZ2luYWwgb2Zmc2V0IHNoaWZ0ZWQgbGVmdCA2IC0gMgorLy8JbC5zcmxpCXI2LHI2LDYJCQkvLyBvcmlnaW5hbCBvZmZzZXQgc2hpZnRlZCByaWdodCAyCisKKwlsLnNsbGkJcjQscjIsNAkJCS8vIG9sZCBqdW1wIHBvc2l0aW9uOiBFRUEgc2hpZnRlZCBsZWZ0IDQKKy8vCWwuc3JsaQlyNCxyNCw2CQkJLy8gb2xkIGp1bXAgcG9zaXRpb246IHNoaWZ0ZWQgcmlnaHQgMgorCisJbC5hZGRpCXI1LHIzLDB4YwkJLy8gbmV3IGp1bXAgcG9zaXRpb24gKHBoeXNpY2FsKQorCWwuc2xsaQlyNSxyNSw0CQkJLy8gbmV3IGp1bXAgcG9zaXRpb246IHNoaWZ0ZWQgbGVmdCA0CisKKwkvLyBjYWxjdWxhdGUgbmV3IGp1bXAgb2Zmc2V0CisJLy8gbmV3X29mZiA9IG9sZF9vZmYgKyAob2xkX2p1bXAgLSBuZXdfanVtcCkKKworCWwuc3ViCXI1LHI0LHI1CQkvLyBvbGRfanVtcCAtIG5ld19qdW1wCisJbC5hZGQJcjUscjYscjUJCS8vIG9yaWdfb2ZmICsgKG9sZF9qdW1wIC0gbmV3X2p1bXApCisJbC5zcmxpCXI1LHI1LDYJCQkvLyBuZXcgb2Zmc2V0IHNoaWZ0ZWQgcmlnaHQgMgorCisJLy8gcjUgaXMgbmV3IGp1bXAgb2Zmc2V0CisJCQkJCS8vIGwuaiBoYXMgb3Bjb2RlIDB4MC4uLgorCWwuc3cJVFJBTVBfU0xPVF8yKHIzKSxyNQkvLyB3cml0ZSBpdCBiYWNrCisKKwlsLmoJdHJhbXBvbGluZV9vdXQKKwlsLm5vcAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCiszOgkvLyBsLmphbHIKKworCS8qIDE5IDIwIGFhIGFhCWwubW92aGkgcjksMHhhYWFhCisJICogYTkgMjkgYmIgYmIgIGwub3JpCXI5LDB4YmJiYgorCSAqCisJICogd2hlcmUgMHhhYWFhYmJiYiBpcyBFRUEgKyAweDQgc2hpZnRlZCByaWdodCAyCisJICovCisKKwlsLmFkZGkJcjYscjIsMHg0CQkvLyB0aGlzIGlzIDB4YWFhYWJiYmIKKworCQkJCQkvLyBsLm1vdmhpIHI5LDB4YWFhYQorCWwub3JpCXI1LHIwLDB4MTkyMAkJLy8gMHgxOTIwID09IGwubW92aGkgcjkKKwlsLnNoCShUUkFNUF9TTE9UXzArMHgwKShyMykscjUKKwlsLnNybGkJcjUscjYsMTYKKwlsLnNoCShUUkFNUF9TTE9UXzArMHgyKShyMykscjUKKworCQkJCQkvLyBsLm9yaSAgIHI5LDB4YmJiYgorCWwub3JpCXI1LHIwLDB4YTkyOQkJLy8gMHhhOTI5ID09IGwub3JpIHI5CisJbC5zaAkoVFJBTVBfU0xPVF8xKzB4MCkocjMpLHI1CisJbC5hbmRpCXI1LHI2LDB4ZmZmZgorCWwuc2gJKFRSQU1QX1NMT1RfMSsweDIpKHIzKSxyNQorCisJbC5saHoJcjUsKFRSQU1QX1NMT1RfMisweDApKHIzKQkvLyBsb2FkIGhpIHBhcnQgb2YganVtcCBpbnN0cnVjdGlvbgorCWwuYW5kaQlyNSxyNSwweDNmZgkJLy8gY2xlYXIgb3V0IG9wY29kZSBwYXJ0CisJbC5vcmkJcjUscjUsMHg0NDAwCQkvLyBvcGNvZGUgY2hhbmdlZCBmcm9tIGwuamFsciAtPiBsLmpyCisJbC5zaAkoVFJBTVBfU0xPVF8yKzB4MCkocjMpLHI1IC8vIHdyaXRlIGl0IGJhY2sKKworCS8qIGZhbHRocm91Z2ggKi8KKworMToJLy8gbC5qcgorCWwuagl0cmFtcG9saW5lX291dAorCWwubm9wCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKzQ6CS8vIGwuYm5mCis1OgkvLyBsLmJmCisJbC5zbGxpCXI2LHI0LDYJCQkvLyBvcmlnaW5hbCBvZmZzZXQgc2hpZnRlZCBsZWZ0IDYgLSAyCisvLwlsLnNybGkJcjYscjYsNgkJCS8vIG9yaWdpbmFsIG9mZnNldCBzaGlmdGVkIHJpZ2h0IDIKKworCWwuc2xsaQlyNCxyMiw0CQkJLy8gb2xkIGp1bXAgcG9zaXRpb246IEVFQSBzaGlmdGVkIGxlZnQgNAorLy8JbC5zcmxpCXI0LHI0LDYJCQkvLyBvbGQganVtcCBwb3NpdGlvbjogc2hpZnRlZCByaWdodCAyCisKKwlsLmFkZGkJcjUscjMsMHhjCQkvLyBuZXcganVtcCBwb3NpdGlvbiAocGh5c2ljYWwpCisJbC5zbGxpCXI1LHI1LDQJCQkvLyBuZXcganVtcCBwb3NpdGlvbjogc2hpZnRlZCBsZWZ0IDQKKworCS8vIGNhbGN1bGF0ZSBuZXcganVtcCBvZmZzZXQKKwkvLyBuZXdfb2ZmID0gb2xkX29mZiArIChvbGRfanVtcCAtIG5ld19qdW1wKQorCisJbC5hZGQJcjYscjYscjQJCS8vIChvcmlnX29mZiArIG9sZF9qdW1wKQorCWwuc3ViCXI2LHI2LHI1CQkvLyAob3JpZ19vZmYgKyBvbGRfanVtcCkgLSBuZXdfanVtcAorCWwuc3JsaQlyNixyNiw2CQkJLy8gbmV3IG9mZnNldCBzaGlmdGVkIHJpZ2h0IDIKKworCS8vIHI2IGlzIG5ldyBqdW1wIG9mZnNldAorCWwubHd6CXI0LChUUkFNUF9TTE9UXzIrMHgwKShyMykJLy8gbG9hZCBqdW1wIGluc3RydWN0aW9uCisJbC5zcmxpCXI0LHI0LDE2CisJbC5hbmRpCXI0LHI0LDB4ZmMwMAkJLy8gZ2V0IG9wY29kZSBwYXJ0CisJbC5zbGxpCXI0LHI0LDE2CisJbC5vcglyNixyNCxyNgkJLy8gbC5iKG4pZiBuZXcgb2Zmc2V0CisJbC5zdwlUUkFNUF9TTE9UXzIocjMpLHI2CS8vIHdyaXRlIGl0IGJhY2sKKworCS8qIHdlIG5lZWQgdG8gYWRkIGwuaiB0byBFRUEgKyAweDggKi8KKwl0b3BoeXMJKHI0LHIyKQkJCS8vIG1heSBub3QgYmUgbmVlZGVkIChkdWUgdG8gc2hpZnRzIGRvd25fCisJbC5hZGRpCXI0LHI0LCgweDggLSAweDgpCS8vIGp1bXAgdGFyZ2V0ID0gcjIgKyAweDggKGNvbXBlbnNhdGUgZm9yIDB4OCkKKwkJCQkJLy8ganVtcCBwb3NpdGlvbiA9IHI1ICsgMHg4ICgweDggY29tcGVuc2F0ZWQpCisJbC5zdWIJcjQscjQscjUJCS8vIGp1bXAgb2Zmc2V0ID0gdGFyZ2V0IC0gbmV3X3Bvc2l0aW9uICsgMHg4CisKKwlsLnNsbGkJcjQscjQsNAkJCS8vIHRoZSBhbW91bnQgb2YgaW5mbyBpbiBpbWVkaWF0ZSBvZiBqdW1wCisJbC5zcmxpCXI0LHI0LDYJCQkvLyBqdW1wIGluc3RydWN0aW9uIHdpdGggb2Zmc2V0CisJbC5zdwlUUkFNUF9TTE9UXzQocjMpLHI0CS8vIHdyaXRlIGl0IHRvIDR0aCBzbG90CisKKwkvKiBmYWxsdGhyb3VnaCAqLworCit0cmFtcG9saW5lX291dDoKKwkvLyBzZXQgdXAgbmV3IEVQQyB0byBwb2ludCB0byBvdXIgdHJhbXBvbGluZSBjb2RlCisJTE9BRF9TWU1CT0xfMl9HUFIocjUsX2ltbXVfdHJhbXBvbGluZSkKKwlsLm10c3ByCXIwLHI1LFNQUl9FUENSX0JBU0UKKworCS8vIGltbXVfdHJhbXBvbGluZSBpcyAoNHgpIENBQ0hFX0xJTkUgYWxpZ25lZAorCS8vIGFuZCBvbmx5IDYgaW5zdHJ1Y3Rpb25zIGxvbmcsCisJLy8gc28gd2UgbmVlZCB0byBpbnZhbGlkYXRlIG9ubHkgMiBsaW5lcworCisJLyogRXN0YWJsaXNoIGNhY2hlIGJsb2NrIHNpemUKKwkgICBJZiBCUz0wLCAxNjsKKwkgICBJZiBCUz0xLCAzMjsKKwkgICByMTQgY29udGFpbiBibG9jayBzaXplCisJKi8KKwlsLm1mc3ByIHIyMSxyMCxTUFJfSUNDRkdSCisJbC5hbmRpCXIyMSxyMjEsU1BSX0lDQ0ZHUl9DQlMKKwlsLnNybGkJcjIxLHIyMSw3CisJbC5vcmkJcjIzLHIwLDE2CisJbC5zbGwJcjE0LHIyMyxyMjEKKworCWwubXRzcHIJcjAscjUsU1BSX0lDQklSCisJbC5hZGQJcjUscjUscjE0CisJbC5tdHNwcglyMCxyNSxTUFJfSUNCSVIKKworCWwuanIJcjkKKwlsLm5vcAorCisKKy8qCisgKiBEU0NSOiBwcmludHMgYSBzdHJpbmcgcmVmZXJlbmNlZCBieSByMy4KKyAqCisgKiBQUk1TOiByMyAgICAgCS0gYWRkcmVzcyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIG51bGwKKyAqCQkJdGVybWluYXRlZCBzdHJpbmcgdG8gYmUgcHJpbnRlZAorICoKKyAqIFBSRVE6IFVBUlQgYXQgVUFSVF9CQVNFX0FERCBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqCisgKiBQT1NUOiBjYWxsZXIgc2hvdWxkIGJlIGF3YXJlIHRoYXQgcjMsIHI5IGFyZSBjaGFuZ2VkCisgKi8KK0VOVFJZKF9lbWVyZ2VuY3lfcHJpbnQpCisJRU1FUkdFTkNZX1BSSU5UX1NUT1JFX0dQUjQKKwlFTUVSR0VOQ1lfUFJJTlRfU1RPUkVfR1BSNQorCUVNRVJHRU5DWV9QUklOVF9TVE9SRV9HUFI2CisJRU1FUkdFTkNZX1BSSU5UX1NUT1JFX0dQUjcKKzI6CisJbC5sYnoJcjcsMChyMykKKwlsLnNmZXEJcjcscjAKKwlsLmJmCTlmCisJbC5ub3AKKworLy8gcHV0YzoKKwlsLm1vdmhpIHI0LGhpKFVBUlRfQkFTRV9BREQpCisKKwlsLmFkZGkgIHI2LHIwLDB4MjAKKzE6ICAgICAgbC5sYnogICByNSw1KHI0KQorCWwuYW5kaSAgcjUscjUsMHgyMAorCWwuc2ZlcSAgcjUscjYKKwlsLmJuZiAgIDFiCisJbC5ub3AKKworCWwuc2IgICAgMChyNCkscjcKKworCWwuYWRkaSAgcjYscjAsMHg2MAorMTogICAgICBsLmxieiAgIHI1LDUocjQpCisJbC5hbmRpICByNSxyNSwweDYwCisJbC5zZmVxICByNSxyNgorCWwuYm5mICAgMWIKKwlsLm5vcAorCisJLyogbmV4dCBjaGFyYWN0ZXIgKi8KKwlsLmoJMmIKKwlsLmFkZGkJcjMscjMsMHgxCisKKzk6CisJRU1FUkdFTkNZX1BSSU5UX0xPQURfR1BSNworCUVNRVJHRU5DWV9QUklOVF9MT0FEX0dQUjYKKwlFTUVSR0VOQ1lfUFJJTlRfTE9BRF9HUFI1CisJRU1FUkdFTkNZX1BSSU5UX0xPQURfR1BSNAorCWwuanIJcjkKKwlsLm5vcAorCitFTlRSWShfZW1lcmdlbmN5X3ByaW50X25yKQorCUVNRVJHRU5DWV9QUklOVF9TVE9SRV9HUFI0CisJRU1FUkdFTkNZX1BSSU5UX1NUT1JFX0dQUjUKKwlFTUVSR0VOQ1lfUFJJTlRfU1RPUkVfR1BSNgorCUVNRVJHRU5DWV9QUklOVF9TVE9SRV9HUFI3CisJRU1FUkdFTkNZX1BSSU5UX1NUT1JFX0dQUjgKKworCWwuYWRkaQlyOCxyMCwzMgkJLy8gc2hpZnQgcmVnaXN0ZXIKKworMToJLyogcmVtb3ZlIGxlYWRpbmcgemVyb3MgKi8KKwlsLmFkZGkJcjgscjgsLTB4NAorCWwuc3JsCXI3LHIzLHI4CisJbC5hbmRpCXI3LHI3LDB4ZgorCisJLyogZG9uJ3Qgc2tpcCB0aGUgbGFzdCB6ZXJvIGlmIG51bWJlciA9PSAweDAgKi8KKwlsLnNmZXFpCXI4LDB4NAorCWwuYmYJMmYKKwlsLm5vcAorCisJbC5zZmVxCXI3LHIwCisJbC5iZgkxYgorCWwubm9wCisKKzI6CisJbC5zcmwJcjcscjMscjgKKworCWwuYW5kaQlyNyxyNywweGYKKwlsLnNmbHRzCXI4LHIwCisJbC5iZgk5ZgorCisJbC5zZmd0dWkgcjcsMHg5CisJbC5ibmYJOGYKKwlsLm5vcAorCWwuYWRkaQlyNyxyNywweDI3CisKKzg6CisJbC5hZGRpCXI3LHI3LDB4MzAKKy8vIHB1dGM6CisJbC5tb3ZoaSByNCxoaShVQVJUX0JBU0VfQUREKQorCisJbC5hZGRpICByNixyMCwweDIwCisxOiAgICAgIGwubGJ6ICAgcjUsNShyNCkKKwlsLmFuZGkgIHI1LHI1LDB4MjAKKwlsLnNmZXEgIHI1LHI2CisJbC5ibmYgICAxYgorCWwubm9wCisKKwlsLnNiICAgIDAocjQpLHI3CisKKwlsLmFkZGkgIHI2LHIwLDB4NjAKKzE6ICAgICAgbC5sYnogICByNSw1KHI0KQorCWwuYW5kaSAgcjUscjUsMHg2MAorCWwuc2ZlcSAgcjUscjYKKwlsLmJuZiAgIDFiCisJbC5ub3AKKworCS8qIG5leHQgY2hhcmFjdGVyICovCisJbC5qCTJiCisJbC5hZGRpCXI4LHI4LC0weDQKKworOToKKwlFTUVSR0VOQ1lfUFJJTlRfTE9BRF9HUFI4CisJRU1FUkdFTkNZX1BSSU5UX0xPQURfR1BSNworCUVNRVJHRU5DWV9QUklOVF9MT0FEX0dQUjYKKwlFTUVSR0VOQ1lfUFJJTlRfTE9BRF9HUFI1CisJRU1FUkdFTkNZX1BSSU5UX0xPQURfR1BSNAorCWwuanIJcjkKKwlsLm5vcAorCisKKy8qCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seS4KKyAqIEl0IG1lc3NlcyB1cCB0aGUgTGludXggZWFybHkgc2VyaWFsIG91dHB1dAorICogc29tZWhvdywgc28gdXNlIGl0IHNwYXJpbmdseSBhbmQgZXNzZW50aWFsbHkKKyAqIG9ubHkgaWYgeW91IG5lZWQgdG8gZGVidWcgc29tZXRoaW5nIHRoYXQgZ29lcyB3cm9uZworICogYmVmb3JlIExpbnV4IGdldHMgdGhlIGVhcmx5IHNlcmlhbCBnb2luZy4KKyAqCisgKiBGdXJ0aGVybW9yZSwgeW91J2xsIGhhdmUgdG8gbWFrZSBzdXJlIHlvdSBzZXQgdGhlCisgKiBVQVJUX0RFVklTT1IgY29ycmVjdGx5IGFjY29yZGluZyB0byB0aGUgc3lzdGVtCisgKiBjbG9jayByYXRlLgorICoKKyAqCisgKi8KKworCisKKyNkZWZpbmUgU1lTX0NMSyAgICAgICAgICAgIDIwMDAwMDAwCisvLyNkZWZpbmUgU1lTX0NMSyAgICAgICAgICAgIDE4NDMyMDAKKyNkZWZpbmUgT1IzMl9DT05TT0xFX0JBVUQgIDExNTIwMAorI2RlZmluZSBVQVJUX0RJVklTT1IgICAgICAgU1lTX0NMSy8oMTYqT1IzMl9DT05TT0xFX0JBVUQpCisKK0VOVFJZKF9lYXJseV91YXJ0X2luaXQpCisJbC5tb3ZoaQlyMyxoaShVQVJUX0JBU0VfQUREKQorCisJbC5hZGRpCXI0LHIwLDB4NworCWwuc2IJMHgyKHIzKSxyNAorCisJbC5hZGRpCXI0LHIwLDB4MAorCWwuc2IJMHgxKHIzKSxyNAorCisJbC5hZGRpCXI0LHIwLDB4MworCWwuc2IJMHgzKHIzKSxyNAorCisJbC5sYnoJcjUsMyhyMykKKwlsLm9yaQlyNCxyNSwweDgwCisJbC5zYgkweDMocjMpLHI0CisJbC5hZGRpCXI0LHIwLCgoVUFSVF9ESVZJU09SPj44KSAmIDB4MDAwMDAwZmYpCisJbC5zYglVQVJUX0RMTShyMykscjQKKwlsLmFkZGkgIHI0LHIwLCgoVUFSVF9ESVZJU09SKSAmIDB4MDAwMDAwZmYpCisJbC5zYglVQVJUX0RMTChyMykscjQKKwlsLnNiCTB4MyhyMykscjUKKworCWwuanIJcjkKKwlsLm5vcAorCitfc3RyaW5nX2NvcHlpbmdfbGludXg6CisJLnN0cmluZyAiXG5cblxuXG5cblxyQ29weWluZyBMaW51eC4uLiBcMCIKKworX3N0cmluZ19va19ib290aW5nOgorCS5zdHJpbmcgIk9rLCBib290aW5nIHRoZSBrZXJuZWwuXG5cclwwIgorCitfc3RyaW5nX3VuaGFuZGxlZF9leGNlcHRpb246CisJLnN0cmluZyAiXG5cclJ1bmFydW5hcm91bmQ6IFVuaGFuZGxlZCBleGNlcHRpb24gMHhcMCIKKworX3N0cmluZ19lcGNfcHJlZml4OgorCS5zdHJpbmcgIjogRVBDPTB4XDAiCisKK19zdHJpbmdfbmw6CisJLnN0cmluZyAiXG5cclwwIgorCisJLmdsb2JhbAlfc3RyaW5nX2Vzcl9pcnFfYnVnCitfc3RyaW5nX2Vzcl9pcnFfYnVnOgorCS5zdHJpbmcgIlxuXHJFU1IgZXh0ZXJuYWwgaW50ZXJydXB0IGJ1ZywgZm9yIGRldGFpbHMgbG9vayBpbnRvIGVudHJ5LlNcblxyXDAiCisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09WyBwYWdlIGFsaWduZWQgc3RydWN0dXJlcyBdPT09ICovCisKKy8qCisgKiAuZGF0YSBzZWN0aW9uIHNob3VsZCBiZSBwYWdlIGFsaWduZWQKKyAqCShsb29rIGludG8gYXJjaC9vcjMyL2tlcm5lbC92bWxpbnV4LmxkcykKKyAqLworCS5zZWN0aW9uIC5kYXRhLCJhdyIKKwkuYWxpZ24JODE5MgorCS5nbG9iYWwgIGVtcHR5X3plcm9fcGFnZQorZW1wdHlfemVyb19wYWdlOgorCS5zcGFjZSAgODE5MgorCisJLmdsb2JhbCAgc3dhcHBlcl9wZ19kaXIKK3N3YXBwZXJfcGdfZGlyOgorCS5zcGFjZSAgODE5MgorCisJLmdsb2JhbAlfdW5oYW5kbGVkX3N0YWNrCitfdW5oYW5kbGVkX3N0YWNrOgorCS5zcGFjZQk4MTkyCitfdW5oYW5kbGVkX3N0YWNrX3RvcDoKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09WyBFT0YgXT09PSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvaWRsZS5jIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmM1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9pZGxlLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIE9wZW5SSVNDIGlkbGUuYworICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIHRoZSBPcGVuUklTQyBhcmNoaXRlY3R1cmU6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogSWRsZSBkYWVtb24gZm9yIG9yMzIuICBJZGxlIGRhZW1vbiB3aWxsIGhhbmRsZSBhbnkgYWN0aW9uCisgKiB0aGF0IG5lZWRzIHRvIGJlIHRha2VuIHdoZW4gdGhlIHN5c3RlbSBiZWNvbWVzIGlkbGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKwordm9pZCAoKnBvd2Vyc2F2ZSkgKHZvaWQpID0gTlVMTDsKKworc3RhdGljIGlubGluZSB2b2lkIHBtX2lkbGUodm9pZCkKK3sKKwliYXJyaWVyKCk7Cit9CisKK3ZvaWQgY3B1X2lkbGUodm9pZCkKK3sKKwlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKworCS8qIGVuZGxlc3MgaWRsZSBsb29wIHdpdGggbm8gcHJpb3JpdHkgYXQgYWxsICovCisJd2hpbGUgKDEpIHsKKwkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygxKTsKKworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CisJCQljaGVja19wZ3RfY2FjaGUoKTsKKwkJCXJtYigpOworCisJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQkJLyogRG9uJ3QgdHJhY2UgaXJxcyBvZmYgZm9yIGlkbGUgKi8KKwkJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOworCQkJaWYgKCFuZWVkX3Jlc2NoZWQoKSAmJiBwb3dlcnNhdmUgIT0gTlVMTCkKKwkJCQlwb3dlcnNhdmUoKTsKKwkJCXN0YXJ0X2NyaXRpY2FsX3RpbWluZ3MoKTsKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQl9CisKKwkJdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljaygpOworCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJCXNjaGVkdWxlKCk7CisJCXByZWVtcHRfZGlzYWJsZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2Mva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvaW5pdF90YXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3NDRhMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogT3BlblJJU0MgaW5pdF90YXNrLmMKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciB0aGUgT3BlblJJU0MgYXJjaGl0ZWN0dXJlOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KKyNpbmNsdWRlIDxsaW51eC9tcXVldWUuaD4KKworc3RhdGljIHN0cnVjdCBzaWduYWxfc3RydWN0IGluaXRfc2lnbmFscyA9IElOSVRfU0lHTkFMUyhpbml0X3NpZ25hbHMpOworc3RhdGljIHN0cnVjdCBzaWdoYW5kX3N0cnVjdCBpbml0X3NpZ2hhbmQgPSBJTklUX1NJR0hBTkQoaW5pdF9zaWdoYW5kKTsKKworLyoKKyAqIEluaXRpYWwgdGhyZWFkIHN0cnVjdHVyZS4KKyAqCisgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgVEhSRUFEX1NJWkUgYWxpZ25lZCBkdWUgdG8gdGhlCisgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBoYXZpbmcgYSBzcGVjaWFsCisgKiAiaW5pdF90YXNrIiBsaW5rZXIgbWFwIGVudHJ5Li4KKyAqLwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEgPSB7CisJSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spCit9OworCisvKgorICogSW5pdGlhbCB0YXNrIHN0cnVjdHVyZS4KKyAqCisgKiBBbGwgb3RoZXIgdGFzayBzdHJ1Y3RzIHdpbGwgYmUgYWxsb2NhdGVkIG9uIHNsYWJzIGluIGZvcmsuYworICovCitzdHJ1Y3QgdGFza19zdHJ1Y3QgaW5pdF90YXNrID0gSU5JVF9UQVNLKGluaXRfdGFzayk7CitFWFBPUlRfU1lNQk9MKGluaXRfdGFzayk7CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC9pcnEuYyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YjMwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9pcnEuYwpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIE9wZW5SSVNDIGlycS5jCisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgdGhlIE9wZW5SSVNDIGFyY2hpdGVjdHVyZToKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorCisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKworLyogcmVhZCBpbnRlcnJ1cHQgZW5hYmxlZCBzdGF0dXMgKi8KK3Vuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKHZvaWQpCit7CisJcmV0dXJuIG1mc3ByKFNQUl9TUikgJiAoU1BSX1NSX0lFRXxTUFJfU1JfVEVFKTsKK30KK0VYUE9SVF9TWU1CT0woYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKTsKKworLyogc2V0IGludGVycnVwdCBlbmFibGVkIHN0YXR1cyAqLwordm9pZCBhcmNoX2xvY2FsX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJbXRzcHIoU1BSX1NSLCAoKG1mc3ByKFNQUl9TUikgJiB+KFNQUl9TUl9JRUV8U1BSX1NSX1RFRSkpIHwgZmxhZ3MpKTsKK30KK0VYUE9SVF9TWU1CT0woYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSk7CisKKworLyogT1IxSyBQSUMgaW1wbGVtZW50YXRpb24gKi8KKworLyogV2UncmUgYSBjb3VwbGUgb2YgY3ljbGVzIGZhc3RlciB0aGFuIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9ucyB3aXRoCisgKiB0aGVzZSAnZmFzdCcgdmVyc2lvbnMuCisgKi8KKworc3RhdGljIHZvaWQgb3Ixa19waWNfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJbXRzcHIoU1BSX1BJQ01SLCBtZnNwcihTUFJfUElDTVIpICYgfigxVUwgPDwgZGF0YS0+aXJxKSk7Cit9CisKK3N0YXRpYyB2b2lkIG9yMWtfcGljX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJbXRzcHIoU1BSX1BJQ01SLCBtZnNwcihTUFJfUElDTVIpIHwgKDFVTCA8PCBkYXRhLT5pcnEpKTsKK30KKworc3RhdGljIHZvaWQgb3Ixa19waWNfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwkvKiBFREdFLXRyaWdnZXJlZCBpbnRlcnJ1cHRzIG5lZWQgdG8gYmUgYWNrJ2VkIGluIG9yZGVyIHRvIGNsZWFyCisJICogdGhlIGxhdGNoLgorCSAqIExFVkVSLXRyaWdnZXJlZCBpbnRlcnJ1cHRzIGRvIG5vdCBuZWVkIHRvIGJlIGFjaydlZDsgaG93ZXZlciwKKwkgKiBhY2snaW5nIHRoZSBpbnRlcnJ1cHQgaGFzIG5vIGlsbC1lZmZlY3QgYW5kIGlzIHF1aWNrZXIgdGhhbgorCSAqIHRyeWluZyB0byBmaWd1cmUgb3V0IHdoYXQgdHlwZSBpdCBpcy4uLgorCSAqLworCisJLyogVGhlIE9wZW5SSVNDIDEwMDAgc3BlYyBzYXlzIHRvIHdyaXRlIGEgMSB0byB0aGUgYml0IHRvIGFjayB0aGUKKwkgKiBpbnRlcnJ1cHQsIGJ1dCB0aGUgT1IxMjAwIGRvZXMgdGhpcyBiYWNrd2FyZHMgYW5kIHJlcXVpcmVzIGEgMAorCSAqIHRvIGJlIHdyaXR0ZW4uLi4KKwkgKi8KKworI2lmZGVmIENPTkZJR19PUjFLXzEyMDAKKwkvKiBUaGVyZSBhcmUgdHdvIG9kZGl0aWVzIHdpdGggdGhlIE9SMTIwMCBQSUMgaW1wbGVtZW50YXRpb246CisJICogaSkgIExFVkVMLXRyaWdnZXJlZCBpbnRlcnJ1cHRzIGFyZSBsYXRjaGVkIGFuZCBuZWVkIHRvIGJlIGNsZWFyZWQKKwkgKiBpaSkgdGhlIGludGVycnVwdCBsYXRjaCBpcyBjbGVhcmVkIGJ5IHdyaXRpbmcgYSAwIHRvIHRoZSBiaXQsCisJICogICAgIGFzIG9wcG9zZWQgdG8gYSAxIGFzIG1hbmRhdGVkIGJ5IHRoZSBzcGVjCisJICovCisKKwltdHNwcihTUFJfUElDU1IsIG1mc3ByKFNQUl9QSUNTUikgJiB+KDFVTCA8PCBkYXRhLT5pcnEpKTsKKyNlbHNlCisJV0FSTigxLCAiSW50ZXJydXB0IGhhbmRsaW5nIHBvc3NpYmlseSBicm9rZW5cbiIpOworCW10c3ByKFNQUl9QSUNTUiwgKDFVTCA8PCBpcnEpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBvcjFrX3BpY19tYXNrX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJLyogQ29tbWVudHMgZm9yIHBpY19hY2sgYXBwbHkgaGVyZSwgdG9vICovCisKKyNpZmRlZiBDT05GSUdfT1IxS18xMjAwCisJbXRzcHIoU1BSX1BJQ1NSLCBtZnNwcihTUFJfUElDU1IpICYgfigxVUwgPDwgZGF0YS0+aXJxKSk7CisjZWxzZQorCVdBUk4oMSwgIkludGVycnVwdCBoYW5kbGluZyBwb3NzaWJpbHkgYnJva2VuXG4iKTsKKwltdHNwcihTUFJfUElDU1IsICgxVUwgPDwgaXJxKSk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBvcjFrX3BpY19zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCit7CisJLyogVGhlcmUncyBub3RoaW5nIHRvIGRvIGluIHRoZSBQSUMgY29uZmlndXJhdGlvbiB3aGVuIGNoYW5naW5nCisJICogZmxvdyB0eXBlLiAgTGV2ZWwgYW5kIGVkZ2UtdHJpZ2dlcmVkIGludGVycnVwdHMgYXJlIGJvdGgKKwkgKiBzdXBwb3J0ZWQsIGJ1dCBpdCdzIFBJQy1pbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyB3aGljaCB0eXBlCisJICogaXMgaGFuZGxlZC4gKi8KKworCXJldHVybiBpcnFfc2V0dXBfYWx0X2NoaXAoZGF0YSwgZmxvd190eXBlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGljX2dldF9pcnEoaW50IGZpcnN0KQoreworCWludCBpcnE7CisKKwlpcnEgPSBmZnMobWZzcHIoU1BSX1BJQ1NSKSA+PiBmaXJzdCk7CisKKwlyZXR1cm4gaXJxID8gaXJxICsgZmlyc3QgLSAxIDogTk9fSVJROworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb3Ixa19pcnFfaW5pdCh2b2lkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKKwlzdHJ1Y3QgaXJxX2NoaXBfdHlwZSAqY3Q7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIHVudGlsIGV4cGxpY2l0bHkgcmVxdWVzdGVkICovCisJbXRzcHIoU1BSX1BJQ01SLCAoMFVMKSk7CisKKwlnYyA9IGlycV9hbGxvY19nZW5lcmljX2NoaXAoIm9yMWstUElDIiwgMSwgMCwgMCwgaGFuZGxlX2xldmVsX2lycSk7CisJY3QgPSBnYy0+Y2hpcF90eXBlczsKKworCWN0LT5jaGlwLmlycV91bm1hc2sgPSBvcjFrX3BpY191bm1hc2s7CisJY3QtPmNoaXAuaXJxX21hc2sgPSBvcjFrX3BpY19tYXNrOworCWN0LT5jaGlwLmlycV9hY2sgPSBvcjFrX3BpY19hY2s7CisJY3QtPmNoaXAuaXJxX21hc2tfYWNrID0gb3Ixa19waWNfbWFza19hY2s7CisJY3QtPmNoaXAuaXJxX3NldF90eXBlID0gb3Ixa19waWNfc2V0X3R5cGU7CisKKwkvKiBUaGUgT1IxSyBQSUMgY2FuIGhhbmRsZSBib3RoIGxldmVsIGFuZCBlZGdlIHRyaWdnZWQKKwkgKiBpbnRlcnJ1cHRzIGluIHJvdWdobHkgdGhlIHNhbWUgbWFubmVyCisJICovCisjaWYgMAorCS8qIEZJWE1FOiBjaGlwLnR5cGU/Pz8gKi8KKwljdC0+Y2hpcC50eXBlID0gSVJRX1RZUEVfRURHRV9CT1RIIHwgSVJRX1RZUEVfTEVWRUxfTUFTSzsKKyNlbmRpZgorCisJaXJxX3NldHVwX2dlbmVyaWNfY2hpcChnYywgSVJRX01TSyhOUl9JUlFTKSwgMCwKKwkJCSAgICAgICBJUlFfTk9SRVFVRVNULCBJUlFfTEVWRUwgfCBJUlFfTk9QUk9CRSk7Cit9CisKK3ZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCit7CisJb3Ixa19pcnFfaW5pdCgpOworfQorCit2b2lkIF9faXJxX2VudHJ5IGRvX0lSUShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaXJxID0gLTE7CisJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOworCisJaXJxX2VudGVyKCk7CisKKwl3aGlsZSAoKGlycSA9IHBpY19nZXRfaXJxKGlycSArIDEpKSAhPSBOT19JUlEpCisJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOworCisJaXJxX2V4aXQoKTsKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOworfQorCit1bnNpZ25lZCBpbnQgaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKKwkJCQkgICBjb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplKQoreworCXJldHVybiBpbnRzcGVjWzBdOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKTsKZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2Mva2VybmVsL21vZHVsZS5jIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmZjUwZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL21vZHVsZS5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBPcGVuUklTQyBtb2R1bGUuYworICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIHRoZSBPcGVuUklTQyBhcmNoaXRlY3R1cmU6CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKworaW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGYzMl9TaGRyICpzZWNoZHJzLAorCQkgICAgICAgY29uc3QgY2hhciAqc3RydGFiLAorCQkgICAgICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAorCQkgICAgICAgdW5zaWduZWQgaW50IHJlbHNlYywKKwkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm1lKQoreworCXVuc2lnbmVkIGludCBpOworCUVsZjMyX1JlbGEgKnJlbCA9ICh2b2lkICopc2VjaGRyc1tyZWxzZWNdLnNoX2FkZHI7CisJRWxmMzJfU3ltICpzeW07CisJdWludDMyX3QgKmxvY2F0aW9uOworCXVpbnQzMl90IHZhbHVlOworCisJcHJfZGVidWcoIkFwcGx5aW5nIHJlbG9jYXRlIHNlY3Rpb24gJXUgdG8gJXVcbiIsIHJlbHNlYywKKwkJIHNlY2hkcnNbcmVsc2VjXS5zaF9pbmZvKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2VjaGRyc1tyZWxzZWNdLnNoX3NpemUgLyBzaXplb2YoKnJlbCk7IGkrKykgeworCQkvKiBUaGlzIGlzIHdoZXJlIHRvIG1ha2UgdGhlIGNoYW5nZSAqLworCQlsb2NhdGlvbiA9ICh2b2lkICopc2VjaGRyc1tzZWNoZHJzW3JlbHNlY10uc2hfaW5mb10uc2hfYWRkcgorCQkJKyByZWxbaV0ucl9vZmZzZXQ7CisKKwkJLyogVGhpcyBpcyB0aGUgc3ltYm9sIGl0IGlzIHJlZmVycmluZyB0by4gIE5vdGUgdGhhdCBhbGwKKwkJICAgdW5kZWZpbmVkIHN5bWJvbHMgaGF2ZSBiZWVuIHJlc29sdmVkLiAgKi8KKwkJc3ltID0gKEVsZjMyX1N5bSAqKXNlY2hkcnNbc3ltaW5kZXhdLnNoX2FkZHIKKwkJCSsgRUxGMzJfUl9TWU0ocmVsW2ldLnJfaW5mbyk7CisJCXZhbHVlID0gc3ltLT5zdF92YWx1ZSArIHJlbFtpXS5yX2FkZGVuZDsKKworCQlzd2l0Y2ggKEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSkgeworCQljYXNlIFJfT1IzMl8zMjoKKwkJCSpsb2NhdGlvbiA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgUl9PUjMyX0NPTlNUOgorCQkJbG9jYXRpb24gPSAodWludDE2X3QgKilsb2NhdGlvbiArIDE7CisJCQkqKCh1aW50MTZfdCAqKWxvY2F0aW9uKSA9ICh1aW50MTZfdCkgKHZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFJfT1IzMl9DT05TVEg6CisJCQlsb2NhdGlvbiA9ICh1aW50MTZfdCAqKWxvY2F0aW9uICsgMTsKKwkJCSooKHVpbnQxNl90ICopbG9jYXRpb24pID0gKHVpbnQxNl90KSAodmFsdWUgPj4gMTYpOworCQkJYnJlYWs7CisJCWNhc2UgUl9PUjMyX0pVTVBUQVJHOgorCQkJdmFsdWUgLT0gKHVpbnQzMl90KWxvY2F0aW9uOworCQkJdmFsdWUgPj49IDI7CisJCQl2YWx1ZSAmPSAweDAzZmZmZmZmOworCQkJdmFsdWUgfD0gKmxvY2F0aW9uICYgMHhmYzAwMDAwMDsKKwkJCSpsb2NhdGlvbiA9IHZhbHVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIm1vZHVsZSAlczogVW5rbm93biByZWxvY2F0aW9uOiAldVxuIiwKKwkJCSAgICAgICBtZS0+bmFtZSwgRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC9vcjMyX2tzeW1zLmMgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9vcjMyX2tzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjY2Y3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL29yMzJfa3N5bXMuYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogT3BlblJJU0Mgb3IzMl9rc3ltcy5jCisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgdGhlIE9wZW5SSVNDIGFyY2hpdGVjdHVyZToKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorCisjZGVmaW5lIERFQ0xBUkVfRVhQT1JUKG5hbWUpIGV4dGVybiB2b2lkIG5hbWUodm9pZCk7IEVYUE9SVF9TWU1CT0wobmFtZSkKKworLyogY29tcGlsZXIgZ2VuZXJhdGVkIHN5bWJvbHMgKi8KK0RFQ0xBUkVfRVhQT1JUKF9fdWRpdnNpMyk7CitERUNMQVJFX0VYUE9SVChfX2RpdnNpMyk7CitERUNMQVJFX0VYUE9SVChfX3Vtb2RzaTMpOworREVDTEFSRV9FWFBPUlQoX19tb2RzaTMpOworREVDTEFSRV9FWFBPUlQoX19tdWxkaTMpOworREVDTEFSRV9FWFBPUlQoX19hc2hyZGkzKTsKK0RFQ0xBUkVfRVhQT1JUKF9fYXNobGRpMyk7CitERUNMQVJFX0VYUE9SVChfX2xzaHJkaTMpOworCitFWFBPUlRfU1lNQk9MKF9fY29weV90b2Zyb21fdXNlcik7CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9wcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyMDlhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL3Byb2Nlc3MuYwpAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIE9wZW5SSVNDIHByb2Nlc3MuYworICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIHRoZSBPcGVuUklTQyBhcmNoaXRlY3R1cmU6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgcHJvY2VzcyBoYW5kbGluZy4uLgorICovCisKKyNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgorI2luY2x1ZGUgPGxpbnV4L21xdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vc3ByX2RlZnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorCisvKgorICogUG9pbnRlciB0byBDdXJyZW50IHRocmVhZCBpbmZvIHN0cnVjdHVyZS4KKyAqCisgKiBVc2VkIGF0IHVzZXIgc3BhY2UgLT4ga2VybmVsIHRyYW5zaXRpb25zLgorICovCitzdHJ1Y3QgdGhyZWFkX2luZm8gKmN1cnJlbnRfdGhyZWFkX2luZm9fc2V0W05SX0NQVVNdID0geyAmaW5pdF90aHJlYWRfaW5mbywgfTsKKwordm9pZCBtYWNoaW5lX3Jlc3RhcnQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIqKiogTUFDSElORSBSRVNUQVJUICoqKlxuIik7CisJX19hc21fXygibC5ub3AgMSIpOworfQorCisvKgorICogU2ltaWxhciB0byBtYWNoaW5lX3Bvd2VyX29mZiwgYnV0IGRvbid0IHNodXQgb2ZmIHBvd2VyLiAgQWRkIGNvZGUKKyAqIGhlcmUgdG8gZnJlZXplIHRoZSBzeXN0ZW0gZm9yIGUuZy4gcG9zdC1tb3J0ZW0gZGVidWcgcHVycG9zZSB3aGVuCisgKiBwb3NzaWJsZS4gIFRoaXMgaGFsdCBoYXMgbm90aGluZyB0byBkbyB3aXRoIHRoZSBpZGxlIGhhbHQuCisgKi8KK3ZvaWQgbWFjaGluZV9oYWx0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiKioqIE1BQ0hJTkUgSEFMVCAqKipcbiIpOworCV9fYXNtX18oImwubm9wIDEiKTsKK30KKworLyogSWYgb3Igd2hlbiBzb2Z0d2FyZSBwb3dlci1vZmYgaXMgaW1wbGVtZW50ZWQsIGFkZCBjb2RlIGhlcmUuICAqLwordm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIioqKiBNQUNISU5FIFBPV0VSIE9GRiAqKipcbiIpOworCV9fYXNtX18oImwubm9wIDEiKTsKK30KKwordm9pZCAoKnBtX3Bvd2VyX29mZikgKHZvaWQpID0gbWFjaGluZV9wb3dlcl9vZmY7CisKKy8qCisgKiBXaGVuIGEgcHJvY2VzcyBkb2VzIGFuICJleGVjIiwgbWFjaGluZSBzdGF0ZSBsaWtlIEZQVSBhbmQgZGVidWcKKyAqIHJlZ2lzdGVycyBuZWVkIHRvIGJlIHJlc2V0LiAgVGhpcyBpcyBhIGhvb2sgZnVuY3Rpb24gZm9yIHRoYXQuCisgKiBDdXJyZW50bHkgd2UgZG9uJ3QgaGF2ZSBhbnkgc3VjaCBzdGF0ZSB0byByZXNldCwgc28gdGhpcyBpcyBlbXB0eS4KKyAqLwordm9pZCBmbHVzaF90aHJlYWQodm9pZCkKK3sKK30KKwordm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZXh0ZXJuIHZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisJLyogX19QSFhfXyBjbGVhbnVwIHRoaXMgbWVzcyAqLworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworfQorCit1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKXVzZXJfcmVncyh0LT5zdGFjayktPnBjOworfQorCit2b2lkIHJlbGVhc2VfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqZGVhZF90YXNrKQoreworfQorCisvKgorICogQ29weSB0aGUgdGhyZWFkLXNwZWNpZmljIChhcmNoIHNwZWNpZmljKSBpbmZvIGZyb20gdGhlIGN1cnJlbnQKKyAqIHByb2Nlc3MgdG8gdGhlIG5ldyBvbmUgcAorICovCitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCk7CisKK2ludAorY29weV90aHJlYWQodW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgdW5zaWduZWQgbG9uZyB1c3AsCisJICAgIHVuc2lnbmVkIGxvbmcgdW51c2VkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3M7CisJc3RydWN0IHB0X3JlZ3MgKmtyZWdzOworCXVuc2lnbmVkIGxvbmcgc3AgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCkgKyBUSFJFQURfU0laRTsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpOworCXVuc2lnbmVkIGxvbmcgdG9wX29mX2tlcm5lbF9zdGFjazsKKworCXRvcF9vZl9rZXJuZWxfc3RhY2sgPSBzcDsKKworCXAtPnNldF9jaGlsZF90aWQgPSBwLT5jbGVhcl9jaGlsZF90aWQgPSBOVUxMOworCisJLyogQ29weSByZWdpc3RlcnMgKi8KKwkvKiByZWR6b25lICovCisJc3AgLT0gU1RBQ0tfRlJBTUVfT1ZFUkhFQUQ7CisJc3AgLT0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKTsKKwljaGlsZHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKilzcDsKKworCS8qIENvcHkgcGFyZW50IHJlZ2lzdGVycyAqLworCSpjaGlsZHJlZ3MgPSAqcmVnczsKKworCWlmICgoY2hpbGRyZWdzLT5zciAmIFNQUl9TUl9TTSkgPT0gMSkgeworCQkvKiBmb3Iga2VybmVsIHRocmVhZCwgc2V0IGBjdXJyZW50X3RocmVhZF9pbmZvJworCQkgKiBhbmQgc3RhY2twdHIgaW4gbmV3IHRhc2sKKwkJICovCisJCWNoaWxkcmVncy0+c3AgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCkgKyBUSFJFQURfU0laRTsKKwkJY2hpbGRyZWdzLT5ncHJbMTBdID0gKHVuc2lnbmVkIGxvbmcpdGFza190aHJlYWRfaW5mbyhwKTsKKwl9IGVsc2UgeworCQljaGlsZHJlZ3MtPnNwID0gdXNwOworCX0KKworCWNoaWxkcmVncy0+Z3ByWzExXSA9IDA7CS8qIFJlc3VsdCBmcm9tIGZvcmsoKSAqLworCisJLyoKKwkgKiBUaGUgd2F5IHRoaXMgd29ya3MgaXMgdGhhdCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUKKwkgKiBzb21lIHRhc2sgd2lsbCBjYWxsIF9zd2l0Y2ggdG8gc3dpdGNoIHRvIHRoZSBuZXcgdGFzay4KKwkgKiBUaGF0IHdpbGwgcG9wIG9mZiB0aGUgc3RhY2sgZnJhbWUgY3JlYXRlZCBiZWxvdyBhbmQgc3RhcnQKKwkgKiB0aGUgbmV3IHRhc2sgcnVubmluZyBhdCByZXRfZnJvbV9mb3JrLiAgVGhlIG5ldyB0YXNrIHdpbGwKKwkgKiBkbyBzb21lIGhvdXNlIGtlZXBpbmcgYW5kIHRoZW4gcmV0dXJuIGZyb20gdGhlIGZvcmsgb3IgY2xvbmUKKwkgKiBzeXN0ZW0gY2FsbCwgdXNpbmcgdGhlIHN0YWNrIGZyYW1lIGNyZWF0ZWQgYWJvdmUuCisJICovCisJLyogcmVkem9uZSAqLworCXNwIC09IFNUQUNLX0ZSQU1FX09WRVJIRUFEOworCXNwIC09IHNpemVvZihzdHJ1Y3QgcHRfcmVncyk7CisJa3JlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKilzcDsKKworCXRpID0gdGFza190aHJlYWRfaW5mbyhwKTsKKwl0aS0+a3NwID0gc3A7CisKKwkvKiBrcmVncy0+c3AgbXVzdCBzdG9yZSB0aGUgbG9jYXRpb24gb2YgdGhlICdwcmUtc3dpdGNoJyBrZXJuZWwgc3RhY2sKKwkgKiBwb2ludGVyLi4uIGZvciBhIG5ld2x5IGZvcmtlZCBwcm9jZXNzLCB0aGlzIGlzIHNpbXBseSB0aGUgdG9wIG9mCisJICogdGhlIGtlcm5lbCBzdGFjay4KKwkgKi8KKwlrcmVncy0+c3AgPSB0b3Bfb2Zfa2VybmVsX3N0YWNrOworCWtyZWdzLT5ncHJbM10gPSAodW5zaWduZWQgbG9uZyljdXJyZW50OwkvKiBhcmcgdG8gc2NoZWR1bGVfdGFpbCAqLworCWtyZWdzLT5ncHJbMTBdID0gKHVuc2lnbmVkIGxvbmcpdGFza190aHJlYWRfaW5mbyhwKTsKKwlrcmVncy0+Z3ByWzldID0gKHVuc2lnbmVkIGxvbmcpcmV0X2Zyb21fZm9yazsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHVwIGEgdGhyZWFkIGZvciBleGVjdXRpbmcgYSBuZXcgcHJvZ3JhbQorICovCit2b2lkIHN0YXJ0X3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBzcCkKK3sKKwl1bnNpZ25lZCBsb25nIHNyID0gcmVncy0+c3IgJiB+U1BSX1NSX1NNOworCisJc2V0X2ZzKFVTRVJfRFMpOworCW1lbXNldChyZWdzLT5ncHIsIDAsIHNpemVvZihyZWdzLT5ncHIpKTsKKworCXJlZ3MtPnBjID0gcGM7CisJcmVncy0+c3IgPSBzcjsKKwlyZWdzLT5zcCA9IHNwOworCisvKglwcmludGsoInN0YXJ0IHRocmVhZCwga3NwID0gJWx4XG4iLCBjdXJyZW50X3RocmVhZF9pbmZvKCktPmtzcCk7Ki8KK30KKworLyogRmlsbCBpbiB0aGUgZnB1IHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuICAqLworaW50IGR1bXBfZnB1KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBlbGZfZnByZWdzZXRfdCAqIGZwdSkKK3sKKwkvKiBUT0RPICovCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBzdHJ1Y3QgdGhyZWFkX2luZm8gKl9zd2l0Y2goc3RydWN0IHRocmVhZF9pbmZvICpvbGRfdGksCisJCQkJICAgc3RydWN0IHRocmVhZF9pbmZvICpuZXdfdGkpOworCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqb2xkLAorCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGFzdDsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKm5ld190aSwgKm9sZF90aTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogY3VycmVudF9zZXQgaXMgYW4gYXJyYXkgb2Ygc2F2ZWQgY3VycmVudCBwb2ludGVycworCSAqIChvbmUgZm9yIGVhY2ggY3B1KS4gd2UgbmVlZCB0aGVtIGF0IHVzZXItPmtlcm5lbCB0cmFuc2l0aW9uLAorCSAqIHdoaWxlIHdlIHNhdmUgdGhlbSBhdCBrZXJuZWwtPnVzZXIgdHJhbnNpdGlvbgorCSAqLworCW5ld190aSA9IG5ldy0+c3RhY2s7CisJb2xkX3RpID0gb2xkLT5zdGFjazsKKworCWN1cnJlbnRfdGhyZWFkX2luZm9fc2V0W3NtcF9wcm9jZXNzb3JfaWQoKV0gPSBuZXdfdGk7CisJbGFzdCA9IChfc3dpdGNoKG9sZF90aSwgbmV3X3RpKSktPnRhc2s7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gbGFzdDsKK30KKworLyoKKyAqIFdyaXRlIG91dCByZWdpc3RlcnMgaW4gY29yZSBkdW1wIGZvcm1hdCwgYXMgZGVmaW5lZCBieSB0aGUKKyAqIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0CisgKi8KK3ZvaWQgZHVtcF9lbGZfdGhyZWFkKGVsZl9ncmVnX3QgKmRlc3QsIHN0cnVjdCBwdF9yZWdzKiByZWdzKQoreworCWRlc3RbMF0gPSAwOyAvKiByMCAqLworCW1lbWNweShkZXN0KzEsIHJlZ3MtPmdwcisxLCAzMSpzaXplb2YodW5zaWduZWQgbG9uZykpOworCWRlc3RbMzJdID0gcmVncy0+cGM7CisJZGVzdFszM10gPSByZWdzLT5zcjsKKwlkZXN0WzM0XSA9IDA7CisJZGVzdFszNV0gPSAwOworfQorCitleHRlcm4gdm9pZCBfa2VybmVsX3RocmVhZF9oZWxwZXIodm9pZCk7CisKK3ZvaWQgX19ub3JldHVybiBrZXJuZWxfdGhyZWFkX2hlbHBlcihpbnQgKCpmbikgKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlkb19leGl0KGZuKGFyZykpOworfQorCisvKgorICogQ3JlYXRlIGEga2VybmVsIHRocmVhZC4KKyAqLworaW50IGtlcm5lbF90aHJlYWQoaW50ICgqZm4pICh2b2lkICopLCB2b2lkICphcmcsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgcmVnczsKKworCW1lbXNldCgmcmVncywgMCwgc2l6ZW9mKHJlZ3MpKTsKKworCXJlZ3MuZ3ByWzIwXSA9ICh1bnNpZ25lZCBsb25nKWZuOworCXJlZ3MuZ3ByWzIyXSA9ICh1bnNpZ25lZCBsb25nKWFyZzsKKwlyZWdzLnNyID0gbWZzcHIoU1BSX1NSKTsKKwlyZWdzLnBjID0gKHVuc2lnbmVkIGxvbmcpX2tlcm5lbF90aHJlYWRfaGVscGVyOworCisJcmV0dXJuIGRvX2ZvcmsoZmxhZ3MgfCBDTE9ORV9WTSB8IENMT05FX1VOVFJBQ0VELAorCQkgICAgICAgMCwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogc3lzX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0uCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBfc3lzX2V4ZWN2ZShjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwKKwkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqIGNvbnN0IF9fdXNlciAqYXJndiwKKwkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqIGNvbnN0IF9fdXNlciAqZW52cCwKKwkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgZXJyb3I7CisJY2hhciAqZmlsZW5hbWU7CisKKwlmaWxlbmFtZSA9IGdldG5hbWUobmFtZSk7CisJZXJyb3IgPSBQVFJfRVJSKGZpbGVuYW1lKTsKKworCWlmIChJU19FUlIoZmlsZW5hbWUpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gZG9fZXhlY3ZlKGZpbGVuYW1lLCBhcmd2LCBlbnZwLCByZWdzKTsKKwlwdXRuYW1lKGZpbGVuYW1lKTsKKworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKwordW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCS8qIFRPRE8gKi8KKworCXJldHVybiAwOworfQorCitpbnQga2VybmVsX2V4ZWN2ZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqY29uc3QgYXJndltdLCBjaGFyICpjb25zdCBlbnZwW10pCit7CisJcmVnaXN0ZXIgbG9uZyBfX3JlcyBhc20oInIxMSIpID0gX19OUl9leGVjdmU7CisJcmVnaXN0ZXIgbG9uZyBfX2EgYXNtKCJyMyIpID0gKGxvbmcpKGZpbGVuYW1lKTsKKwlyZWdpc3RlciBsb25nIF9fYiBhc20oInI0IikgPSAobG9uZykoYXJndik7CisJcmVnaXN0ZXIgbG9uZyBfX2MgYXNtKCJyNSIpID0gKGxvbmcpKGVudnApOworCV9fYXNtX18gdm9sYXRpbGUgKCJsLnN5cyAxIgorCQkJICA6ICI9ciIgKF9fcmVzKSwgIj1yIihfX2EpLCAiPXIiKF9fYiksICI9ciIoX19jKQorCQkJICA6ICIwIihfX3JlcyksICIxIihfX2EpLCAiMiIoX19iKSwgIjMiKF9fYykKKwkJCSAgOiAicjYiLCAicjciLCAicjgiLCAicjEyIiwgInIxMyIsICJyMTUiLAorCQkJICAgICJyMTciLCAicjE5IiwgInIyMSIsICJyMjMiLCAicjI1IiwgInIyNyIsCisJCQkgICAgInIyOSIsICJyMzEiKTsKKwlfX2FzbV9fIHZvbGF0aWxlICgibC5ub3AiKTsKKwlyZXR1cm4gX19yZXM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9wcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiNThiYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL3Byb20uYwpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIE9wZW5SSVNDIHByb20uYworICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIHRoZSBPcGVuUklTQyBhcmNoaXRlY3R1cmU6CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBwcm9jZWR1cmVzIGZvciBjcmVhdGluZywgYWNjZXNzaW5nIGFuZAorICogaW50ZXJwcmV0aW5nIHRoZSBkZXZpY2UgdHJlZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCitleHRlcm4gY2hhciBjbWRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CisKK3ZvaWQgX19pbml0IGVhcmx5X2luaXRfZHRfYWRkX21lbW9yeV9hcmNoKHU2NCBiYXNlLCB1NjQgc2l6ZSkKK3sKKwlzaXplICY9IFBBR0VfTUFTSzsKKwltZW1ibG9ja19hZGQoYmFzZSwgc2l6ZSk7Cit9CisKK3ZvaWQgKiBfX2luaXQgZWFybHlfaW5pdF9kdF9hbGxvY19tZW1vcnlfYXJjaCh1NjQgc2l6ZSwgdTY0IGFsaWduKQoreworCXJldHVybiBfX3ZhKG1lbWJsb2NrX2FsbG9jKHNpemUsIGFsaWduKSk7Cit9CisKK3ZvaWQgX19pbml0IGVhcmx5X2luaXRfZGV2dHJlZSh2b2lkICpwYXJhbXMpCit7CisJdm9pZCAqYWxsb2M7CisKKwkvKiBTZXR1cCBmbGF0IGRldmljZS10cmVlIHBvaW50ZXIgKi8KKwlpbml0aWFsX2Jvb3RfcGFyYW1zID0gcGFyYW1zOworCisKKwkvKiBSZXRyaWV2ZSB2YXJpb3VzIGluZm9ybWF0aW9ucyBmcm9tIHRoZSAvY2hvc2VuIG5vZGUgb2YgdGhlCisJICogZGV2aWNlLXRyZWUsIGluY2x1ZGluZyB0aGUgcGxhdGZvcm0gdHlwZSwgaW5pdHJkIGxvY2F0aW9uIGFuZAorCSAqIHNpemUsIFRDRSByZXNlcnZlLCBhbmQgbW9yZSAuLi4KKwkgKi8KKwlvZl9zY2FuX2ZsYXRfZHQoZWFybHlfaW5pdF9kdF9zY2FuX2Nob3NlbiwgY21kX2xpbmUpOworCisJLyogU2NhbiBtZW1vcnkgbm9kZXMgYW5kIHJlYnVpbGQgTUVNQkxPQ0tzICovCisJbWVtYmxvY2tfaW5pdCgpOworCW9mX3NjYW5fZmxhdF9kdChlYXJseV9pbml0X2R0X3NjYW5fcm9vdCwgTlVMTCk7CisJb2Zfc2Nhbl9mbGF0X2R0KGVhcmx5X2luaXRfZHRfc2Nhbl9tZW1vcnksIE5VTEwpOworCisJLyogU2F2ZSBjb21tYW5kIGxpbmUgZm9yIC9wcm9jL2NtZGxpbmUgYW5kIHRoZW4gcGFyc2UgcGFyYW1ldGVycyAqLworCXN0cmxjcHkoYm9vdF9jb21tYW5kX2xpbmUsIGNtZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CisKKwltZW1ibG9ja19hbmFseXplKCk7CisKKwkvKiBXZSBtdXN0IGNvcHkgdGhlIGZsYXR0ZW5kIGRldmljZSB0cmVlIGZyb20gaW5pdCBtZW1vcnkgdG8gcmVndWxhcgorCSAqIG1lbW9yeSBiZWNhdXNlIHRoZSBkZXZpY2UgdHJlZSByZWZlcmVuY2VzIHRoZSBzdHJpbmdzIGluIGl0CisJICogZGlyZWN0bHkuCisJICovCisKKwlhbGxvYyA9IF9fdmEobWVtYmxvY2tfYWxsb2MoaW5pdGlhbF9ib290X3BhcmFtcy0+dG90YWxzaXplLCBQQUdFX1NJWkUpKTsKKworCW1lbWNweShhbGxvYywgaW5pdGlhbF9ib290X3BhcmFtcywgaW5pdGlhbF9ib290X3BhcmFtcy0+dG90YWxzaXplKTsKKworCWluaXRpYWxfYm9vdF9wYXJhbXMgPSBhbGxvYzsKK30KKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAordm9pZCBfX2luaXQgZWFybHlfaW5pdF9kdF9zZXR1cF9pbml0cmRfYXJjaCh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQl1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlpbml0cmRfc3RhcnQgPSAodW5zaWduZWQgbG9uZylfX3ZhKHN0YXJ0KTsKKwlpbml0cmRfZW5kID0gKHVuc2lnbmVkIGxvbmcpX192YShlbmQpOworCWluaXRyZF9iZWxvd19zdGFydF9vayA9IDE7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2Mva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvcHRyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2Yjk0YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL3B0cmFjZS5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogT3BlblJJU0MgcHRyYWNlLmMKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciB0aGUgT3BlblJJU0MgYXJjaGl0ZWN0dXJlOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgR3lvcmd5IEplbmV5IDxub2dAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3NldC5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorCisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKgorICogQ29weSB0aGUgdGhyZWFkIHN0YXRlIHRvIGEgcmVnc2V0IHRoYXQgY2FuIGJlIGludGVycHJldGVkIGJ5IHVzZXJzcGFjZS4KKyAqCisgKiBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IG91ciBpbnRlcm5hbCBwdF9yZWdzIHN0cnVjdHVyZSBsb29rcyBsaWtlLiAgVGhlCisgKiBpbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCB3ZSBleHBvcnQgYSBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHRocmVhZCBzdGF0ZQorICogdG8gdXNlcnNwYWNlLiAgQXMgc3VjaCwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVnc2V0IHJlbWFpbnMKKyAqIEFCSSBjb21wYXRpYmxlIGFzIGRlZmluZWQgYnkgdGhlIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0OgorICoKKyAqIChFYWNoIGl0ZW0gaXMgYSAzMi1iaXQgd29yZCkKKyAqIHIwID0gMCAoZXhwb3J0ZWQgZm9yIGNsYXJpdHkpCisgKiAzMSBHUFJTIHIxLXIzMQorICogUEMgKFByb2dyYW0gY291bnRlcikKKyAqIFNSIChTdXBlcnZpc2lvbiByZWdpc3RlcikKKyAqLworc3RhdGljIGludCBnZW5yZWdzX2dldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkgICAgICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkgICAgICAgdm9pZCAqa2J1Ziwgdm9pZCBfX3VzZXIgKiB1YnVmKQoreworCWNvbnN0IHN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRhcmdldCk7CisJaW50IHJldDsKKworCS8qIHIwICovCisJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dF96ZXJvKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLCAwLCA0KTsKKworCWlmICghcmV0KQorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgIHJlZ3MtPmdwcisxLCA0LCA0KjMyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgICZyZWdzLT5wYywgNCozMiwgNCozMyk7CisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAgJnJlZ3MtPnNyLCA0KjMzLCA0KjM0KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dF96ZXJvKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgICAgICAgNCozNCwgLTEpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFNldCB0aGUgdGhyZWFkIHN0YXRlIGZyb20gYSByZWdzZXQgcGFzc2VkIGluIHZpYSBwdHJhY2UKKyAqLworc3RhdGljIGludCBnZW5yZWdzX3NldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkgICAgICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkgICAgICAgY29uc3Qgdm9pZCAqa2J1ZiwgY29uc3Qgdm9pZCBfX3VzZXIgKiB1YnVmKQoreworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRhcmdldCk7CisJaW50IHJldDsKKworCS8qIGlnbm9yZSByMCAqLworCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbl9pZ25vcmUoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsIDAsIDQpOworCS8qIHIxIC0gcjMxICovCisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJIHJlZ3MtPmdwcisxLCA0LCA0KjMyKTsKKwkvKiBQQyAqLworCWlmICghcmV0KQorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJICZyZWdzLT5wYywgNCozMiwgNCozMyk7CisJLyoKKwkgKiBTa2lwIFNSIGFuZCBwYWRkaW5nLi4uIHVzZXJzcGFjZSBpc24ndCBhbGxvd2VkIHRvIGNoYW5nZXMgYml0cyBpbgorCSAqIHRoZSBTdXBlcnZpc2lvbiByZWdpc3RlcgorCSAqLworCWlmICghcmV0KQorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW5faWdub3JlKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkJNCozMywgLTEpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERlZmluZSB0aGUgcmVnaXN0ZXIgc2V0cyBhdmFpbGFibGUgb24gT3BlblJJU0MgdW5kZXIgTGludXgKKyAqLworZW51bSBvcjFrX3JlZ3NldCB7CisJUkVHU0VUX0dFTkVSQUwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0IG9yMWtfcmVnc2V0c1tdID0geworCVtSRUdTRVRfR0VORVJBTF0gPSB7CisJCQkgICAgLmNvcmVfbm90ZV90eXBlID0gTlRfUFJTVEFUVVMsCisJCQkgICAgLm4gPSBFTEZfTkdSRUcsCisJCQkgICAgLnNpemUgPSBzaXplb2YobG9uZyksCisJCQkgICAgLmFsaWduID0gc2l6ZW9mKGxvbmcpLAorCQkJICAgIC5nZXQgPSBnZW5yZWdzX2dldCwKKwkJCSAgICAuc2V0ID0gZ2VucmVnc19zZXQsCisJCQkgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXRfdmlldyB1c2VyX29yMWtfbmF0aXZlX3ZpZXcgPSB7CisJLm5hbWUgPSAib3IxayIsCisJLmVfbWFjaGluZSA9IEVNX09QRU5SSVNDLAorCS5yZWdzZXRzID0gb3Ixa19yZWdzZXRzLAorCS5uID0gQVJSQVlfU0laRShvcjFrX3JlZ3NldHMpLAorfTsKKworY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgKnRhc2tfdXNlcl9yZWdzZXRfdmlldyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuICZ1c2VyX29yMWtfbmF0aXZlX3ZpZXc7Cit9CisKKy8qCisgKiBkb2VzIG5vdCB5ZXQgY2F0Y2ggc2lnbmFscyBzZW50IHdoZW4gdGhlIGNoaWxkIGRpZXMuCisgKiBpbiBleGl0LmMgb3IgaW4gc2lnbmFsLmMuCisgKi8KKworCisvKgorICogQ2FsbGVkIGJ5IGtlcm5lbC9wdHJhY2UuYyB3aGVuIGRldGFjaGluZy4uCisgKgorICogTWFrZSBzdXJlIHRoZSBzaW5nbGUgc3RlcCBiaXQgaXMgbm90IHNldC4KKyAqLwordm9pZCBwdHJhY2VfZGlzYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCXByX2RlYnVnKCJwdHJhY2VfZGlzYWJsZSgpOiBUT0RPXG4iKTsKKworCXVzZXJfZGlzYWJsZV9zaW5nbGVfc3RlcChjaGlsZCk7CisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7Cit9CisKK2xvbmcgYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCSB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocmVxdWVzdCkgeworCWRlZmF1bHQ6CisJCXJldCA9IHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE5vdGlmaWNhdGlvbiBvZiBzeXN0ZW0gY2FsbCBlbnRyeS9leGl0CisgKiAtIHRyaWdnZXJlZCBieSBjdXJyZW50LT53b3JrLnN5c2NhbGxfdHJhY2UKKyAqLworYXNtbGlua2FnZSBsb25nIGRvX3N5c2NhbGxfdHJhY2VfZW50ZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJbG9uZyByZXQgPSAwOworCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpICYmCisJICAgIHRyYWNlaG9va19yZXBvcnRfc3lzY2FsbF9lbnRyeShyZWdzKSkKKwkJLyoKKwkJICogVHJhY2luZyBkZWNpZGVkIHRoaXMgc3lzY2FsbCBzaG91bGQgbm90IGhhcHBlbi4KKwkJICogV2UnbGwgcmV0dXJuIGEgYm9ndXMgY2FsbCBudW1iZXIgdG8gZ2V0IGFuIEVOT1NZUworCQkgKiBlcnJvciwgYnV0IGxlYXZlIHRoZSBvcmlnaW5hbCBudW1iZXIgaW4gPHNvbWV0aGluZz4uCisJCSAqLworCQlyZXQgPSAtMUw7CisKKwkvKiBBcmUgdGhlc2UgcmVncyByaWdodD8/PyAqLworCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSkKKwkJYXVkaXRfc3lzY2FsbF9lbnRyeShhdWRpdF9hcmNoKCksIHJlZ3MtPnN5c2NhbGxubywKKwkJCQkgICAgcmVncy0+Z3ByWzNdLCByZWdzLT5ncHJbNF0sCisJCQkJICAgIHJlZ3MtPmdwcls1XSwgcmVncy0+Z3ByWzZdKTsKKworCXJldHVybiByZXQgPyA6IHJlZ3MtPnN5c2NhbGxubzsKK30KKworYXNtbGlua2FnZSB2b2lkIGRvX3N5c2NhbGxfdHJhY2VfbGVhdmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHN0ZXA7CisKKwlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dCkpCisJCWF1ZGl0X3N5c2NhbGxfZXhpdChBVURJVFNDX1JFU1VMVChyZWdzLT5ncHJbMTFdKSwKKwkJCQkgICByZWdzLT5ncHJbMTFdKTsKKworCXN0ZXAgPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKTsKKwlpZiAoc3RlcCB8fCB0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKKwkJdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2V4aXQocmVncywgc3RlcCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDIyZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvc2V0dXAuYwpAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAqIE9wZW5SSVNDIHNldHVwLmMKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciB0aGUgT3BlblJJU0MgYXJjaGl0ZWN0dXJlOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIGluaXRpYWxpemF0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9jcHVpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisKKyNpbmNsdWRlICJ2bWxpbnV4LmgiCisKK2NoYXIgX19pbml0ZGF0YSBjbWRfbGluZVtDT01NQU5EX0xJTkVfU0laRV0gPSBDT05GSUdfQ01ETElORTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IHNldHVwX21lbW9yeSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9zaXplOworCXVuc2lnbmVkIGxvbmcgcmFtX3N0YXJ0X3BmbjsKKwl1bnNpZ25lZCBsb25nIGZyZWVfcmFtX3N0YXJ0X3BmbjsKKwl1bnNpZ25lZCBsb25nIHJhbV9lbmRfcGZuOworCXBoeXNfYWRkcl90IG1lbW9yeV9zdGFydCwgbWVtb3J5X2VuZDsKKwlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyZWdpb247CisKKwltZW1vcnlfZW5kID0gbWVtb3J5X3N0YXJ0ID0gMDsKKworCS8qIEZpbmQgbWFpbiBtZW1vcnkgd2hlcmUgaXMgdGhlIGtlcm5lbCAqLworCWZvcl9lYWNoX21lbWJsb2NrKG1lbW9yeSwgcmVnaW9uKSB7CisJCW1lbW9yeV9zdGFydCA9IHJlZ2lvbi0+YmFzZTsKKwkJbWVtb3J5X2VuZCA9IHJlZ2lvbi0+YmFzZSArIHJlZ2lvbi0+c2l6ZTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lbW9yeTogMHgleC0weCV4XG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIG1lbW9yeV9zdGFydCwgbWVtb3J5X2VuZCk7CisJfQorCisJaWYgKCFtZW1vcnlfZW5kKSB7CisJCXBhbmljKCJObyBtZW1vcnkhIik7CisJfQorCisJcmFtX3N0YXJ0X3BmbiA9IFBGTl9VUChtZW1vcnlfc3RhcnQpOworCS8qIGZyZWVfcmFtX3N0YXJ0X3BmbiBpcyBmaXJzdCBwYWdlIGFmdGVyIGtlcm5lbCAqLworCWZyZWVfcmFtX3N0YXJ0X3BmbiA9IFBGTl9VUChfX3BhKCZfZW5kKSk7CisJcmFtX2VuZF9wZm4gPSBQRk5fRE9XTihtZW1ibG9ja19lbmRfb2ZfRFJBTSgpKTsKKworCW1heF9wZm4gPSByYW1fZW5kX3BmbjsKKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgYm9vdC10aW1lIGFsbG9jYXRvciAod2l0aCBsb3cgbWVtb3J5IG9ubHkpLgorCSAqCisJICogVGhpcyBtYWtlcyB0aGUgbWVtb3J5IGZyb20gdGhlIGVuZCBvZiB0aGUga2VybmVsIHRvIHRoZSBlbmQgb2YKKwkgKiBSQU0gdXNhYmxlLgorCSAqIGluaXRfYm9vdG1lbSBzZXRzIHRoZSBnbG9iYWwgdmFsdWVzIG1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbi4KKwkgKi8KKwlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW0oZnJlZV9yYW1fc3RhcnRfcGZuLAorCQkJCSAgICByYW1fZW5kX3BmbiAtIHJhbV9zdGFydF9wZm4pOworCWZyZWVfYm9vdG1lbShQRk5fUEhZUyhmcmVlX3JhbV9zdGFydF9wZm4pLAorCQkgICAgIChyYW1fZW5kX3BmbiAtIGZyZWVfcmFtX3N0YXJ0X3BmbikgPDwgUEFHRV9TSElGVCk7CisJcmVzZXJ2ZV9ib290bWVtKFBGTl9QSFlTKGZyZWVfcmFtX3N0YXJ0X3BmbiksIGJvb3RtYXBfc2l6ZSwKKwkJCUJPT1RNRU1fREVGQVVMVCk7CisKKwlmb3JfZWFjaF9tZW1ibG9jayhyZXNlcnZlZCwgcmVnaW9uKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlJlc2VydmVkIC0gMHglMDh4LTB4JTA4eFxuIiwKKwkJICAgICAgICh1MzIpIHJlZ2lvbi0+YmFzZSwgKHUzMikgcmVnaW9uLT5zaXplKTsKKwkJcmVzZXJ2ZV9ib290bWVtKHJlZ2lvbi0+YmFzZSwgcmVnaW9uLT5zaXplLCBCT09UTUVNX0RFRkFVTFQpOworCX0KKworCXJldHVybiByYW1fZW5kX3BmbjsKK30KKworc3RydWN0IGNwdWluZm8gY3B1aW5mbzsKKworc3RhdGljIHZvaWQgcHJpbnRfY3B1aW5mbyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdXByID0gbWZzcHIoU1BSX1VQUik7CisJdW5zaWduZWQgbG9uZyB2ciA9IG1mc3ByKFNQUl9WUik7CisJdW5zaWduZWQgaW50IHZlcnNpb247CisJdW5zaWduZWQgaW50IHJldmlzaW9uOworCisJdmVyc2lvbiA9ICh2ciAmIFNQUl9WUl9WRVIpID4+IDI0OworCXJldmlzaW9uID0gKHZyICYgU1BSX1ZSX1JFVik7CisKKwlwcmludGsoS0VSTl9JTkZPICJDUFU6IE9wZW5SSVNDLSV4IChyZXZpc2lvbiAlZCkgQCVkIE1IelxuIiwKKwkgICAgICAgdmVyc2lvbiwgcmV2aXNpb24sIGNwdWluZm8uY2xvY2tfZnJlcXVlbmN5IC8gMTAwMDAwMCk7CisKKwlpZiAoISh1cHIgJiBTUFJfVVBSX1VQKSkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiLS0gbm8gVVBSIHJlZ2lzdGVyLi4uIHVuYWJsZSB0byBkZXRlY3QgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAodXByICYgU1BSX1VQUl9EQ1ApCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICItLSBkY2FjaGU6ICU0ZCBieXRlcyB0b3RhbCwgJTJkIGJ5dGVzL2xpbmUsICVkIHdheShzKVxuIiwKKwkJICAgICAgIGNwdWluZm8uZGNhY2hlX3NpemUsIGNwdWluZm8uZGNhY2hlX2Jsb2NrX3NpemUsIDEpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiLS0gZGNhY2hlIGRpc2FibGVkXG4iKTsKKwlpZiAodXByICYgU1BSX1VQUl9JQ1ApCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICItLSBpY2FjaGU6ICU0ZCBieXRlcyB0b3RhbCwgJTJkIGJ5dGVzL2xpbmUsICVkIHdheShzKVxuIiwKKwkJICAgICAgIGNwdWluZm8uaWNhY2hlX3NpemUsIGNwdWluZm8uaWNhY2hlX2Jsb2NrX3NpemUsIDEpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiLS0gaWNhY2hlIGRpc2FibGVkXG4iKTsKKworCWlmICh1cHIgJiBTUFJfVVBSX0RNUCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiLS0gZG1tdTogJTRkIGVudHJpZXMsICVsdSB3YXkocylcbiIsCisJCSAgICAgICAxIDw8ICgobWZzcHIoU1BSX0RNTVVDRkdSKSAmIFNQUl9ETU1VQ0ZHUl9OVFMpID4+IDIpLAorCQkgICAgICAgMSArIChtZnNwcihTUFJfRE1NVUNGR1IpICYgU1BSX0RNTVVDRkdSX05UVykpOworCWlmICh1cHIgJiBTUFJfVVBSX0lNUCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiLS0gaW1tdTogJTRkIGVudHJpZXMsICVsdSB3YXkocylcbiIsCisJCSAgICAgICAxIDw8ICgobWZzcHIoU1BSX0lNTVVDRkdSKSAmIFNQUl9JTU1VQ0ZHUl9OVFMpID4+IDIpLAorCQkgICAgICAgMSArIChtZnNwcihTUFJfSU1NVUNGR1IpICYgU1BSX0lNTVVDRkdSX05UVykpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiLS0gYWRkaXRpb25hbCBmZWF0dXJlczpcbiIpOworCWlmICh1cHIgJiBTUFJfVVBSX0RVUCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiLS0gZGVidWcgdW5pdFxuIik7CisJaWYgKHVwciAmIFNQUl9VUFJfUENVUCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiLS0gcGVyZm9ybWFuY2UgY291bnRlcnNcbiIpOworCWlmICh1cHIgJiBTUFJfVVBSX1BNUCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiLS0gcG93ZXIgbWFuYWdlbWVudFxuIik7CisJaWYgKHVwciAmIFNQUl9VUFJfUElDUCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiLS0gUElDXG4iKTsKKwlpZiAodXByICYgU1BSX1VQUl9UVFApCisJCXByaW50ayhLRVJOX0lORk8gIi0tIHRpbWVyXG4iKTsKKwlpZiAodXByICYgU1BSX1VQUl9DVVApCisJCXByaW50ayhLRVJOX0lORk8gIi0tIGN1c3RvbSB1bml0KHMpXG4iKTsKK30KKwordm9pZCBfX2luaXQgc2V0dXBfY3B1aW5mbyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1OworCXVuc2lnbmVkIGxvbmcgaWNjZmdyLCBkY2NmZ3I7CisJdW5zaWduZWQgbG9uZyBjYWNoZV9zZXRfc2l6ZSwgY2FjaGVfd2F5czsKKworCWNwdSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJvcGVuY29yZXMsb3IxMjAwLXJ0bHN2bjQ4MSIpOworCWlmICghY3B1KQorCQlwYW5pYygiTm8gY29tcGF0aWJsZSBDUFUgZm91bmQgaW4gZGV2aWNlIHRyZWUuLi5cbiIpOworCisJaWNjZmdyID0gbWZzcHIoU1BSX0lDQ0ZHUik7CisJY2FjaGVfd2F5cyA9IDEgPDwgKGljY2ZnciAmIFNQUl9JQ0NGR1JfTkNXKTsKKwljYWNoZV9zZXRfc2l6ZSA9IDEgPDwgKChpY2NmZ3IgJiBTUFJfSUNDRkdSX05DUykgPj4gMyk7CisJY3B1aW5mby5pY2FjaGVfYmxvY2tfc2l6ZSA9IDE2IDw8ICgoaWNjZmdyICYgU1BSX0lDQ0ZHUl9DQlMpID4+IDcpOworCWNwdWluZm8uaWNhY2hlX3NpemUgPQorCSAgICBjYWNoZV9zZXRfc2l6ZSAqIGNhY2hlX3dheXMgKiBjcHVpbmZvLmljYWNoZV9ibG9ja19zaXplOworCisJZGNjZmdyID0gbWZzcHIoU1BSX0RDQ0ZHUik7CisJY2FjaGVfd2F5cyA9IDEgPDwgKGRjY2ZnciAmIFNQUl9EQ0NGR1JfTkNXKTsKKwljYWNoZV9zZXRfc2l6ZSA9IDEgPDwgKChkY2NmZ3IgJiBTUFJfRENDRkdSX05DUykgPj4gMyk7CisJY3B1aW5mby5kY2FjaGVfYmxvY2tfc2l6ZSA9IDE2IDw8ICgoZGNjZmdyICYgU1BSX0RDQ0ZHUl9DQlMpID4+IDcpOworCWNwdWluZm8uZGNhY2hlX3NpemUgPQorCSAgICBjYWNoZV9zZXRfc2l6ZSAqIGNhY2hlX3dheXMgKiBjcHVpbmZvLmRjYWNoZV9ibG9ja19zaXplOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsCisJCQkJICZjcHVpbmZvLmNsb2NrX2ZyZXF1ZW5jeSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkRldmljZSB0cmVlIG1pc3NpbmcgQ1BVICdjbG9jay1mcmVxdWVuY3knIHBhcmFtZXRlci4iCisJCSAgICAgICAiQXNzdW1pbmcgZnJlcXVlbmN5IDI1TUhaIgorCQkgICAgICAgIlRoaXMgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IHdhbnQuIik7CisJfQorCisJb2Zfbm9kZV9wdXQoY3B1KTsKKworCXByaW50X2NwdWluZm8oKTsKK30KKworLyoqCisgKiBvcjMyX2Vhcmx5X3NldHVwCisgKgorICogSGFuZGxlcyB0aGUgcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgdGhhdCB0aGlzIGtlcm5lbCBpcyB0byB1c2UKKyAqIGZvciBlc3RhYmxpc2hpbmcgdGhlIGF2YWlsYWJsZSBwbGF0Zm9ybSBkZXZpY2VzLgorICoKKyAqIEZvciBub3csIHRoaXMgaXMgbGltaXRlZCB0byB1c2luZyB0aGUgYnVpbHQtaW4gZGV2aWNlIHRyZWUuICBJbiB0aGUgZnV0dXJlLAorICogaXQgaXMgaW50ZW5kZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlCisgKiB0aGF0IGlzIHBvdGVudGlhbGx5IGJ1aWx0LWluLCBidXQgcG90ZW50aWFsbHkgYWxzbyBwYXNzZWQgaW4gYnkgdGhlCisgKiBib290bG9hZGVyLCBvciBkaXNjb3ZlcmVkIGJ5IHNvbWUgZXF1YWxseSBjbGV2ZXIgbWVhbnMuLi4KKyAqLworCit2b2lkIF9faW5pdCBvcjMyX2Vhcmx5X3NldHVwKHZvaWQpCit7CisKKwllYXJseV9pbml0X2RldnRyZWUoX19kdGJfc3RhcnQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQ29tcGlsZWQtaW4gRkRUIGF0IDB4JXBcbiIsIF9fZHRiX3N0YXJ0KTsKK30KKworc3RhdGljIGludCBfX2luaXQgb3BlbnJpc2NfZGV2aWNlX3Byb2JlKHZvaWQpCit7CisJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworZGV2aWNlX2luaXRjYWxsKG9wZW5yaXNjX2RldmljZV9wcm9iZSk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBleHRyYWN0X3ZhbHVlX2JpdHModW5zaWduZWQgbG9uZyByZWcsCisJCQkJCSAgICAgICBzaG9ydCBiaXRfbnIsIHNob3J0IHdpZHRoKQoreworCXJldHVybiAocmVnID4+IGJpdF9ucikgJiAoMCA8PCB3aWR0aCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBleHRyYWN0X3ZhbHVlKHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJd2hpbGUgKCEobWFzayAmIDB4MSkpIHsKKwkJcmVnID0gcmVnID4+IDE7CisJCW1hc2sgPSBtYXNrID4+IDE7CisJfQorCXJldHVybiBtYXNrICYgcmVnOworfQorCit2b2lkIF9faW5pdCBkZXRlY3RfdW5pdF9jb25maWcodW5zaWduZWQgbG9uZyB1cHIsIHVuc2lnbmVkIGxvbmcgbWFzaywKKwkJCSAgICAgICBjaGFyICp0ZXh0LCB2b2lkICgqZnVuYykgKHZvaWQpKQoreworCWlmICh0ZXh0ICE9IE5VTEwpCisJCXByaW50aygiJXMiLCB0ZXh0KTsKKworCWlmICh1cHIgJiBtYXNrKSB7CisJCWlmIChmdW5jICE9IE5VTEwpCisJCQlmdW5jKCk7CisJCWVsc2UKKwkJCXByaW50aygicHJlc2VudFxuIik7CisJfSBlbHNlCisJCXByaW50aygibm90IHByZXNlbnRcbiIpOworfQorCisvKgorICogY2FsaWJyYXRlX2RlbGF5CisgKgorICogTGlnaHR3ZWlnaHQgY2FsaWJyYXRlX2RlbGF5IGltcGxlbWVudGF0aW9uIHRoYXQgY2FsY3VsYXRlcyBsb29wc19wZXJfamlmZnkKKyAqIGZyb20gdGhlIGNsb2NrIGZyZXF1ZW5jeSBwYXNzZWQgaW4gdmlhIHRoZSBkZXZpY2UgdHJlZQorICoKKyAqLworCit2b2lkIF9fY3B1aW5pdCBjYWxpYnJhdGVfZGVsYXkodm9pZCkKK3sKKwljb25zdCBpbnQgKnZhbDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdSA9IE5VTEw7CisJY3B1ID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgIm9wZW5jb3JlcyxvcjEyMDAtcnRsc3ZuNDgxIik7CisJdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCWlmICghdmFsKQorCQlwYW5pYygibm8gY3B1ICdjbG9jay1mcmVxdWVuY3knIHBhcmFtZXRlciBpbiBkZXZpY2UgdHJlZSIpOworCWxvb3BzX3Blcl9qaWZmeSA9ICp2YWwgLyBIWjsKKwlwcl9jb250KCIlbHUuJTAybHUgQm9nb01JUFMgKGxwaj0lbHUpXG4iLAorCQlsb29wc19wZXJfamlmZnkgLyAoNTAwMDAwIC8gSFopLAorCQkobG9vcHNfcGVyX2ppZmZ5IC8gKDUwMDAgLyBIWikpICUgMTAwLCBsb29wc19wZXJfamlmZnkpOworfQorCit2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCit7CisJdW5zaWduZWQgbG9uZyBtYXhfbG93X3BmbjsKKworCXVuZmxhdHRlbl9kZXZpY2VfdHJlZSgpOworCisJc2V0dXBfY3B1aW5mbygpOworCisJLyogcHJvY2VzcyAxJ3MgaW5pdGlhbCBtZW1vcnkgcmVnaW9uIGlzIHRoZSBrZXJuZWwgY29kZS9kYXRhICovCisJaW5pdF9tbS5zdGFydF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpJl9zdGV4dDsKKwlpbml0X21tLmVuZF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpJl9ldGV4dDsKKwlpbml0X21tLmVuZF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpJl9lZGF0YTsKKwlpbml0X21tLmJyayA9ICh1bnNpZ25lZCBsb25nKSZfZW5kOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisJaW5pdHJkX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpJl9faW5pdHJkX3N0YXJ0OworCWluaXRyZF9lbmQgPSAodW5zaWduZWQgbG9uZykmX19pbml0cmRfZW5kOworCWlmIChpbml0cmRfc3RhcnQgPT0gaW5pdHJkX2VuZCkgeworCQlpbml0cmRfc3RhcnQgPSAwOworCQlpbml0cmRfZW5kID0gMDsKKwl9CisJaW5pdHJkX2JlbG93X3N0YXJ0X29rID0gMTsKKyNlbmRpZgorCisJLyogc2V0dXAgYm9vdG1lbSBhbGxvY2F0b3IgKi8KKwltYXhfbG93X3BmbiA9IHNldHVwX21lbW9yeSgpOworCisJLyogcGFnaW5nX2luaXQoKSBzZXRzIHVwIHRoZSBNTVUgYW5kIG1hcmtzIGFsbCBwYWdlcyBhcyByZXNlcnZlZCAqLworCXBhZ2luZ19pbml0KCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19WVCkgJiYgZGVmaW5lZChDT05GSUdfRFVNTVlfQ09OU09MRSkKKwlpZiAoIWNvbnN3aXRjaHApCisJCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOworI2VuZGlmCisKKwkqY21kbGluZV9wID0gY21kX2xpbmU7CisKKwlwcmludGsoS0VSTl9JTkZPICJPcGVuUklTQyBMaW51eCAtLSBodHRwOi8vb3BlbnJpc2MubmV0XG4iKTsKK30KKworc3RhdGljIGludCBzaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXVuc2lnbmVkIGxvbmcgdnI7CisJaW50IHZlcnNpb24sIHJldmlzaW9uOworCisJdnIgPSBtZnNwcihTUFJfVlIpOworCXZlcnNpb24gPSAodnIgJiBTUFJfVlJfVkVSKSA+PiAyNDsKKwlyZXZpc2lvbiA9IHZyICYgU1BSX1ZSX1JFVjsKKworCXJldHVybiBzZXFfcHJpbnRmKG0sCisJCQkgICJjcHVcdFx0OiBPcGVuUklTQy0leFxuIgorCQkJICAicmV2aXNpb25cdDogJWRcbiIKKwkJCSAgImZyZXF1ZW5jeVx0OiAlbGRcbiIKKwkJCSAgImRjYWNoZSBzaXplXHQ6ICVkIGJ5dGVzXG4iCisJCQkgICJkY2FjaGUgYmxvY2sgc2l6ZVx0OiAlZCBieXRlc1xuIgorCQkJICAiaWNhY2hlIHNpemVcdDogJWQgYnl0ZXNcbiIKKwkJCSAgImljYWNoZSBibG9jayBzaXplXHQ6ICVkIGJ5dGVzXG4iCisJCQkgICJpbW11XHRcdDogJWQgZW50cmllcywgJWx1IHdheXNcbiIKKwkJCSAgImRtbXVcdFx0OiAlZCBlbnRyaWVzLCAlbHUgd2F5c1xuIgorCQkJICAiYm9nb21pcHNcdDogJWx1LiUwMmx1XG4iLAorCQkJICB2ZXJzaW9uLAorCQkJICByZXZpc2lvbiwKKwkJCSAgbG9vcHNfcGVyX2ppZmZ5ICogSFosCisJCQkgIGNwdWluZm8uZGNhY2hlX3NpemUsCisJCQkgIGNwdWluZm8uZGNhY2hlX2Jsb2NrX3NpemUsCisJCQkgIGNwdWluZm8uaWNhY2hlX3NpemUsCisJCQkgIGNwdWluZm8uaWNhY2hlX2Jsb2NrX3NpemUsCisJCQkgIDEgPDwgKChtZnNwcihTUFJfRE1NVUNGR1IpICYgU1BSX0RNTVVDRkdSX05UUykgPj4gMiksCisJCQkgIDEgKyAobWZzcHIoU1BSX0RNTVVDRkdSKSAmIFNQUl9ETU1VQ0ZHUl9OVFcpLAorCQkJICAxIDw8ICgobWZzcHIoU1BSX0lNTVVDRkdSKSAmIFNQUl9JTU1VQ0ZHUl9OVFMpID4+IDIpLAorCQkJICAxICsgKG1mc3ByKFNQUl9JTU1VQ0ZHUikgJiBTUFJfSU1NVUNGR1JfTlRXKSwKKwkJCSAgKGxvb3BzX3Blcl9qaWZmeSAqIEhaKSAvIDUwMDAwMCwKKwkJCSAgKChsb29wc19wZXJfamlmZnkgKiBIWikgLyA1MDAwKSAlIDEwMCk7Cit9CisKK3N0YXRpYyB2b2lkICpjX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICogcG9zKQoreworCS8qIFdlIG9ubHkgaGF2ZSBvbmUgQ1BVLi4uICovCisJcmV0dXJuICpwb3MgPCAxID8gKHZvaWQgKikxIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqIHBvcykKK3sKKwkrKypwb3M7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7Cit9CisKK2NvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0geworCS5zdGFydCA9IGNfc3RhcnQsCisJLm5leHQgPSBjX25leHQsCisJLnN0b3AgPSBjX3N0b3AsCisJLnNob3cgPSBzaG93X2NwdWluZm8sCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9zaWduYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjc1OWM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvc2lnbmFsLmMKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgKiBPcGVuUklTQyBzaWduYWwuYworICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIHRoZSBPcGVuUklTQyBhcmNoaXRlY3R1cmU6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIERFQlVHX1NJRyAwCisKKyNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCisKK2FzbWxpbmthZ2UgbG9uZworX3N5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190ICp1c3MsIHN0YWNrX3QgKnVvc3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiBkb19zaWdhbHRzdGFjayh1c3MsIHVvc3MsIHJlZ3MtPnNwKTsKK30KKworc3RydWN0IHJ0X3NpZ2ZyYW1lIHsKKwlzdHJ1Y3Qgc2lnaW5mbyAqcGluZm87CisJdm9pZCAqcHVjOworCXN0cnVjdCBzaWdpbmZvIGluZm87CisJc3RydWN0IHVjb250ZXh0IHVjOworCXVuc2lnbmVkIGNoYXIgcmV0Y29kZVsxNl07CS8qIHRyYW1wb2xpbmUgY29kZSAqLworfTsKKworc3RhdGljIGludCByZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0ICpzYykKK3sKKwl1bnNpZ25lZCBpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIG9sZF91c3A7CisKKwkvKiBBbHd5cyBtYWtlIGFueSBwZW5kaW5nIHJlc3RhcnRlZCBzeXN0ZW0gY2FsbCByZXR1cm4gLUVJTlRSICovCisJY3VycmVudF90aHJlYWRfaW5mbygpLT5yZXN0YXJ0X2Jsb2NrLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOworCisJLyogcmVzdG9yZSB0aGUgcmVncyBmcm9tICZzYy0+cmVncyAoc2FtZSBhcyBzYywgc2luY2UgcmVncyBpcyBmaXJzdCkKKwkgKiAoc2MgaXMgYWxyZWFkeSBjaGVja2VkIGZvciBWRVJJRllfUkVBRCBzaW5jZSB0aGUgc2lnZnJhbWUgd2FzCisJICogIGNoZWNrZWQgaW4gc3lzX3NpZ3JldHVybiBwcmV2aW91c2x5KQorCSAqLworCisJaWYgKF9fY29weV9mcm9tX3VzZXIocmVncywgc2MsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpKQorCQlnb3RvIGJhZGZyYW1lOworCisJLyogbWFrZSBzdXJlIHRoZSBTTS1iaXQgaXMgY2xlYXJlZCBzbyB1c2VyLW1vZGUgY2Fubm90IGZvb2wgdXMgKi8KKwlyZWdzLT5zciAmPSB+U1BSX1NSX1NNOworCisJLyogcmVzdG9yZSB0aGUgb2xkIFVTUCBhcyBpdCB3YXMgYmVmb3JlIHdlIHN0YWNrZWQgdGhlIHNjIGV0Yy4KKwkgKiAod2UgY2Fubm90IGp1c3QgcG9wIHRoZSBzaWdjb250ZXh0IHNpbmNlIHdlIGFsaWduZWQgdGhlIHNwIGFuZAorCSAqICBzdHVmZiBhZnRlciBwdXNoaW5nIGl0KQorCSAqLworCisJZXJyIHw9IF9fZ2V0X3VzZXIob2xkX3VzcCwgJnNjLT51c3ApOworCisJcmVncy0+c3AgPSBvbGRfdXNwOworCisJLyogVE9ETzogdGhlIG90aGVyIHBvcnRzIHVzZSByZWdzLT5vcmlnX1hYIHRvIGRpc2FibGUgc3lzY2FsbCBjaGVja3MKKwkgKiBhZnRlciB0aGlzIGNvbXBsZXRlcywgYnV0IHdlIGRvbid0IHVzZSB0aGF0IG1lY2hhbmlzbS4gbWF5YmUgd2UgY2FuCisJICogdXNlIGl0IG5vdyA/CisJICovCisKKwlyZXR1cm4gZXJyOworCitiYWRmcmFtZToKKwlyZXR1cm4gMTsKK30KKworYXNtbGlua2FnZSBsb25nIF9zeXNfcnRfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBydF9zaWdmcmFtZSAqZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqKXJlZ3MtPnNwOworCXNpZ3NldF90IHNldDsKKwlzdGFja190IHN0OworCisJLyoKKwkgKiBTaW5jZSB3ZSBzdGFja2VkIHRoZSBzaWduYWwgb24gYSBkd29yZCBib3VuZGFyeSwKKwkgKiB0aGVuIGZyYW1lIHNob3VsZCBiZSBkd29yZCBhbGlnbmVkIGhlcmUuICBJZiBpdCdzCisJICogbm90LCB0aGVuIHRoZSB1c2VyIGlzIHRyeWluZyB0byBtZXNzIHdpdGggdXMuCisJICovCisJaWYgKCgobG9uZylmcmFtZSkgJiAzKQorCQlnb3RvIGJhZGZyYW1lOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJCWdvdG8gYmFkZnJhbWU7CisJaWYgKF9fY29weV9mcm9tX3VzZXIoJnNldCwgJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzaXplb2Yoc2V0KSkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlzaWdkZWxzZXRtYXNrKCZzZXQsIH5fQkxPQ0tBQkxFKTsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwljdXJyZW50LT5ibG9ja2VkID0gc2V0OworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmc3QsICZmcmFtZS0+dWMudWNfc3RhY2ssIHNpemVvZihzdCkpKQorCQlnb3RvIGJhZGZyYW1lOworCS8qIEl0IGlzIG1vcmUgZGlmZmljdWx0IHRvIGF2b2lkIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB0aGFuIHRvCisJICAgY2FsbCBpdCBhbmQgaWdub3JlIGVycm9ycy4gICovCisJZG9fc2lnYWx0c3RhY2soJnN0LCBOVUxMLCByZWdzLT5zcCk7CisKKwlyZXR1cm4gcmVncy0+Z3ByWzExXTsKKworYmFkZnJhbWU6CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHVwIGEgc2lnbmFsIGZyYW1lLgorICovCisKK3N0YXRpYyBpbnQgc2V0dXBfc2lnY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCAqc2MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIHVzcCA9IHJlZ3MtPnNwOworCisJLyogY29weSB0aGUgcmVncy4gdGhleSBhcmUgZmlyc3QgaW4gc2Mgc28gd2UgY2FuIHVzZSBzYyBkaXJlY3RseSAqLworCisJZXJyIHw9IF9fY29weV90b191c2VyKHNjLCByZWdzLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKKworCS8qIHRoZW4gc29tZSBvdGhlciBzdHVmZiAqLworCisJZXJyIHw9IF9fcHV0X3VzZXIobWFzaywgJnNjLT5vbGRtYXNrKTsKKworCWVyciB8PSBfX3B1dF91c2VyKHVzcCwgJnNjLT51c3ApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFsaWduX3NpZ2ZyYW1lKHVuc2lnbmVkIGxvbmcgc3ApCit7CisJcmV0dXJuIHNwICYgfjNVTDsKK30KKworLyoKKyAqIFdvcmsgb3V0IHdoZXJlIHRoZSBzaWduYWwgZnJhbWUgc2hvdWxkIGdvLiAgSXQncyBlaXRoZXIgb24gdGhlIHVzZXIgc3RhY2sKKyAqIG9yIHRoZSBhbHRlcm5hdGUgc3RhY2suCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBzaXplX3QgZnJhbWVfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNwID0gcmVncy0+c3A7CisJaW50IG9uc2lnc3RhY2sgPSBvbl9zaWdfc3RhY2soc3ApOworCisJLyogcmVkem9uZSAqLworCXNwIC09IFNUQUNLX0ZSQU1FX09WRVJIRUFEOworCisJLyogVGhpcyBpcyB0aGUgWC9PcGVuIHNhbmN0aW9uZWQgc2lnbmFsIHN0YWNrIHN3aXRjaGluZy4gICovCisJaWYgKChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTlNUQUNLKSAmJiAhb25zaWdzdGFjaykgeworCQlpZiAoY3VycmVudC0+c2FzX3NzX3NpemUpCisJCQlzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOworCX0KKworCXNwID0gYWxpZ25fc2lnZnJhbWUoc3AgLSBmcmFtZV9zaXplKTsKKworCS8qCisJICogSWYgd2UgYXJlIG9uIHRoZSBhbHRlcm5hdGUgc2lnbmFsIHN0YWNrIGFuZCB3b3VsZCBvdmVyZmxvdyBpdCwgZG9uJ3QuCisJICogUmV0dXJuIGFuIGFsd2F5cy1ib2d1cyBhZGRyZXNzIGluc3RlYWQgc28gd2Ugd2lsbCBkaWUgd2l0aCBTSUdTRUdWLgorCSAqLworCWlmIChvbnNpZ3N0YWNrICYmICFsaWtlbHkob25fc2lnX3N0YWNrKHNwKSkpCisJCXJldHVybiAodm9pZCBfX3VzZXIgKiktMUw7CisKKwlyZXR1cm4gKHZvaWQgX191c2VyICopc3A7Cit9CisKKy8qIGdyYWIgYW5kIHNldHVwIGEgc2lnbmFsIGZyYW1lLgorICoKKyAqIGJhc2ljYWxseSB3ZSBzdGFjayBhIGxvdCBvZiBzdGF0ZSBpbmZvLCBhbmQgYXJyYW5nZSBmb3IgdGhlCisgKiB1c2VyLW1vZGUgcHJvZ3JhbSB0byByZXR1cm4gdG8gdGhlIGtlcm5lbCB1c2luZyBlaXRoZXIgYQorICogdHJhbXBvbGluZSB3aGljaCBwZXJmb3JtcyB0aGUgc3lzY2FsbCBzaWdyZXR1cm4sIG9yIGEgcHJvdmlkZWQKKyAqIHVzZXItbW9kZSB0cmFtcG9saW5lLgorICovCitzdGF0aWMgdm9pZCBzZXR1cF9ydF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCisJCQkgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcnRfc2lnZnJhbWUgKmZyYW1lOworCXVuc2lnbmVkIGxvbmcgcmV0dXJuX2lwOworCWludCBlcnIgPSAwOworCisJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpKTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPmluZm8sICZmcmFtZS0+cGluZm8pOworCWVyciB8PSBfX3B1dF91c2VyKCZmcmFtZS0+dWMsICZmcmFtZS0+cHVjKTsKKworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQorCQllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCBpbmZvKTsKKwlpZiAoZXJyKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIENsZWFyIGFsbCB0aGUgYml0cyBvZiB0aGUgdWNvbnRleHQgd2UgZG9uJ3QgdXNlLiAgKi8KKwllcnIgfD0gX19jbGVhcl91c2VyKCZmcmFtZS0+dWMsIG9mZnNldG9mKHN0cnVjdCB1Y29udGV4dCwgdWNfbWNvbnRleHQpKTsKKwllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcihOVUxMLCAmZnJhbWUtPnVjLnVjX2xpbmspOworCWVyciB8PSBfX3B1dF91c2VyKCh2b2lkICopY3VycmVudC0+c2FzX3NzX3NwLAorCQkJICAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NwKTsKKwllcnIgfD0gX19wdXRfdXNlcihzYXNfc3NfZmxhZ3MocmVncy0+c3ApLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX2ZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT5zYXNfc3Nfc2l6ZSwgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zaXplKTsKKwllcnIgfD0gc2V0dXBfc2lnY29udGV4dCgmZnJhbWUtPnVjLnVjX21jb250ZXh0LCByZWdzLCBzZXQtPnNpZ1swXSk7CisKKwllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzZXQsIHNpemVvZigqc2V0KSk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIHRyYW1wb2xpbmUgLSB0aGUgZGVzaXJlZCByZXR1cm4gaXAgaXMgdGhlIHJldGNvZGUgaXRzZWxmICovCisJcmV0dXJuX2lwID0gKHVuc2lnbmVkIGxvbmcpJmZyYW1lLT5yZXRjb2RlOworCS8qIFRoaXMgaXMgbC5vcmkgcjExLHIwLF9fTlJfc2lncmV0dXJuLCBsLnN5cyAxICovCisJZXJyIHw9IF9fcHV0X3VzZXIoMHhhOTYwLCAoc2hvcnQgKikoZnJhbWUtPnJldGNvZGUgKyAwKSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoX19OUl9ydF9zaWdyZXR1cm4sIChzaG9ydCAqKShmcmFtZS0+cmV0Y29kZSArIDIpKTsKKwllcnIgfD0gX19wdXRfdXNlcigweDIwMDAwMDAxLCAodW5zaWduZWQgbG9uZyAqKShmcmFtZS0+cmV0Y29kZSArIDQpKTsKKwllcnIgfD0gX19wdXRfdXNlcigweDE1MDAwMDAwLCAodW5zaWduZWQgbG9uZyAqKShmcmFtZS0+cmV0Y29kZSArIDgpKTsKKworCWlmIChlcnIpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJLyogVE9ETyB3aGF0IGlzIHRoZSBjdXJyZW50LT5leGVjX2RvbWFpbiBzdHVmZiBhbmQgaW52bWFwID8gKi8KKworCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCisJcmVncy0+cGMgPSAodW5zaWduZWQgbG9uZylrYS0+c2Euc2FfaGFuZGxlcjsgLyogd2hhdCB3ZSBlbnRlciBOT1cgKi8KKwlyZWdzLT5ncHJbOV0gPSAodW5zaWduZWQgbG9uZylyZXR1cm5faXA7ICAgICAvKiB3aGF0IHdlIGVudGVyIExBVEVSICovCisJcmVncy0+Z3ByWzNdID0gKHVuc2lnbmVkIGxvbmcpc2lnOyAgICAgICAgICAgLyogYXJnIDE6IHNpZ25vICovCisJcmVncy0+Z3ByWzRdID0gKHVuc2lnbmVkIGxvbmcpJmZyYW1lLT5pbmZvOyAgLyogYXJnIDI6IChzaWdpbmZvX3QqKSAqLworCXJlZ3MtPmdwcls1XSA9ICh1bnNpZ25lZCBsb25nKSZmcmFtZS0+dWM7ICAgIC8qIGFyZyAzOiB1Y29udGV4dCAqLworCisJLyogYWN0dWFsbHkgbW92ZSB0aGUgdXNwIHRvIHJlZmxlY3QgdGhlIHN0YWNrZWQgZnJhbWUgKi8KKwlyZWdzLT5zcCA9ICh1bnNpZ25lZCBsb25nKWZyYW1lOworCisJcmV0dXJuOworCitnaXZlX3NpZ3NlZ3Y6CisJaWYgKHNpZyA9PSBTSUdTRUdWKQorCQlrYS0+c2Euc2FfaGFuZGxlciA9IFNJR19ERkw7CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2hhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsCisJICAgICAgc2lnaW5mb190ICppbmZvLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCSAgICAgIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CisKKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05FU0hPVCkKKwkJa2EtPnNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOworCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2lnb3JzZXRzKCZjdXJyZW50LT5ibG9ja2VkLCAmY3VycmVudC0+YmxvY2tlZCwgJmthLT5zYS5zYV9tYXNrKTsKKwlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKKwkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLCBzaWcpOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworfQorCisvKgorICogTm90ZSB0aGF0ICdpbml0JyBpcyBhIHNwZWNpYWwgcHJvY2VzczogaXQgZG9lc24ndCBnZXQgc2lnbmFscyBpdCBkb2Vzbid0CisgKiB3YW50IHRvIGhhbmRsZS4gVGh1cyB5b3UgY2Fubm90IGtpbGwgaW5pdCBldmVuIHdpdGggYSBTSUdLSUxMIGV2ZW4gYnkKKyAqIG1pc3Rha2UuCisgKgorICogQWxzbyBub3RlIHRoYXQgdGhlIHJlZ3Mgc3RydWN0dXJlIGdpdmVuIGhlcmUgYXMgYW4gYXJndW1lbnQsIGlzIHRoZSBsYXRlc3QKKyAqIHB1c2hlZCBwdF9yZWdzLiBJdCBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgcHVzaGVkIHJlZ2lzdGVycworICogd2hlbiB0aGUgaW5pdGlhbCB1c2VybW9kZS0+a2VybmVsbW9kZSB0cmFuc2l0aW9uIHRvb2sgcGxhY2UuIFRoZXJlZm9yZQorICogd2UgY2FuIHVzZSB1c2VyX21vZGUocmVncykgdG8gc2VlIGlmIHdlIGNhbWUgZGlyZWN0bHkgZnJvbSBrZXJuZWwgb3IgdXNlcgorICogbW9kZSBiZWxvdy4KKyAqLworCit2b2lkIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzaWdpbmZvX3QgaW5mbzsKKwlpbnQgc2lnbnI7CisJc3RydWN0IGtfc2lnYWN0aW9uIGthOworCisJLyoKKwkgKiBXZSB3YW50IHRoZSBjb21tb24gY2FzZSB0byBnbyBmYXN0LCB3aGljaAorCSAqIGlzIHdoeSB3ZSBtYXkgaW4gY2VydGFpbiBjYXNlcyBnZXQgaGVyZSBmcm9tCisJICoga2VybmVsIG1vZGUuIEp1c3QgcmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcKKwkgKiBpZiBzby4KKwkgKi8KKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJcmV0dXJuOworCisJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CisKKwkvKiBJZiB3ZSBhcmUgY29taW5nIG91dCBvZiBhIHN5c2NhbGwgdGhlbiB3ZSBuZWVkCisJICogdG8gY2hlY2sgaWYgdGhlIHN5c2NhbGwgd2FzIGludGVycnVwdGVkIGFuZCB3YW50cyB0byBiZQorCSAqIHJlc3RhcnRlZCBhZnRlciBoYW5kbGluZyB0aGUgc2lnbmFsLiAgSWYgc28sIHRoZSBvcmlnaW5hbAorCSAqIHN5c2NhbGwgbnVtYmVyIGlzIHB1dCBiYWNrIGludG8gcjExIGFuZCB0aGUgUEMgcmV3b3VuZCB0bworCSAqIHBvaW50IGF0IHRoZSBsLnN5cyBpbnN0cnVjdGlvbiB0aGF0IHJlc3VsdGVkIGluIHRoZQorCSAqIG9yaWdpbmFsIHN5c2NhbGwuICBTeXNjYWxsIHJlc3VsdHMgb3RoZXIgdGhhbiB0aGUgZm91cgorCSAqIGJlbG93IG1lYW4gdGhhdCB0aGUgc3lzY2FsbCBleGVjdXRlZCB0byBjb21wbGV0aW9uIGFuZCBubworCSAqIHJlc3RhcnQgaXMgbmVjZXNzYXJ5LgorCSAqLworCWlmIChyZWdzLT5zeXNjYWxsbm8pIHsKKwkJaW50IHJlc3RhcnQgPSAwOworCisJCXN3aXRjaCAocmVncy0+Z3ByWzExXSkgeworCQljYXNlIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s6CisJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgorCQkJLyogUmVzdGFydCBpZiB0aGVyZSBpcyBubyBzaWduYWwgaGFuZGxlciAqLworCQkJcmVzdGFydCA9IChzaWduciA8PSAwKTsKKwkJCWJyZWFrOworCQljYXNlIC1FUkVTVEFSVFNZUzoKKwkJCS8qIFJlc3RhcnQgaWYgdGhlcmUgbm8gc2lnbmFsIGhhbmRsZXIgb3IKKwkJCSAqIFNBX1JFU1RBUlQgZmxhZyBpcyBzZXQgKi8KKwkJCXJlc3RhcnQgPSAoc2lnbnIgPD0gMCB8fCAoa2Euc2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSk7CisJCQlicmVhazsKKwkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CisJCQkvKiBBbHdheXMgcmVzdGFydCAqLworCQkJcmVzdGFydCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyZXN0YXJ0KSB7CisJCQlpZiAocmVncy0+Z3ByWzExXSA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLKQorCQkJCXJlZ3MtPmdwclsxMV0gPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKKwkJCWVsc2UKKwkJCQlyZWdzLT5ncHJbMTFdID0gcmVncy0+b3JpZ19ncHIxMTsKKwkJCXJlZ3MtPnBjIC09IDQ7CisJCX0gZWxzZSB7CisJCQlyZWdzLT5ncHJbMTFdID0gLUVJTlRSOworCQl9CisJfQorCisJaWYgKHNpZ25yIDw9IDApIHsKKwkJLyogbm8gc2lnbmFsIHRvIGRlbGl2ZXIgc28gd2UganVzdCBwdXQgdGhlIHNhdmVkIHNpZ21hc2sKKwkJICogYmFjayAqLworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOworCQl9CisKKwl9IGVsc2UgewkJLyogc2lnbnIgPiAwICovCisJCXNpZ3NldF90ICpvbGRzZXQ7CisKKwkJaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MgJiBfVElGX1JFU1RPUkVfU0lHTUFTSykKKwkJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCQllbHNlCisJCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKKworCQkvKiBXaGVlISAgQWN0dWFsbHkgZGVsaXZlciB0aGUgc2lnbmFsLiAgKi8KKwkJaGFuZGxlX3NpZ25hbChzaWduciwgJmluZm8sICZrYSwgb2xkc2V0LCByZWdzKTsKKwkJLyogYSBzaWduYWwgd2FzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQ7IHRoZSBzYXZlZAorCQkgKiBzaWdtYXNrIHdpbGwgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgc2lnbmFsIGZyYW1lLAorCQkgKiBhbmQgd2lsbCBiZSByZXN0b3JlZCBieSBzaWdyZXR1cm4sIHNvIHdlIGNhbiBzaW1wbHkKKwkJICogY2xlYXIgdGhlIFRJRl9SRVNUT1JFX1NJR01BU0sgZmxhZyAqLworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCisJCXRyYWNlaG9va19zaWduYWxfaGFuZGxlcihzaWduciwgJmluZm8sICZrYSwgcmVncywKKwkJCQkJIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQorCQlkb19zaWduYWwocmVncyk7CisKKwlpZiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncyAmIF9USUZfTk9USUZZX1JFU1VNRSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfTk9USUZZX1JFU1VNRSk7CisJCXRyYWNlaG9va19ub3RpZnlfcmVzdW1lKHJlZ3MpOworCQlpZiAoY3VycmVudC0+cmVwbGFjZW1lbnRfc2Vzc2lvbl9rZXlyaW5nKQorCQkJa2V5X3JlcGxhY2Vfc2Vzc2lvbl9rZXlyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvc3lzX2NhbGxfdGFibGUuYyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL3N5c19jYWxsX3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmOGNlOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL3N5c19jYWxsX3RhYmxlLmMKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIE9wZW5SSVNDIHN5c19jYWxsX3RhYmxlLmMKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciB0aGUgT3BlblJJU0MgYXJjaGl0ZWN0dXJlOgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXNjYWxscy5oPgorCisjdW5kZWYgX19TWVNDQUxMCisjZGVmaW5lIF9fU1lTQ0FMTChuciwgY2FsbCkgW25yXSA9IChjYWxsKSwKKwordm9pZCAqc3lzX2NhbGxfdGFibGVbX19OUl9zeXNjYWxsc10gPSB7CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorfTsKZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2Mva2VybmVsL3N5c19vcjMyLmMgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9zeXNfb3IzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MDYwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9zeXNfb3IzMi5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBPcGVuUklTQyBzeXNfb3IzMi5jCisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgdGhlIE9wZW5SSVNDIGFyY2hpdGVjdHVyZToKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdmFyaW91cyByYW5kb20gc3lzdGVtIGNhbGxzIHRoYXQKKyAqIGhhdmUgYSBub24tc3RhbmRhcmQgY2FsbGluZyBzZXF1ZW5jZSBvbiBzb21lIHBsYXRmb3Jtcy4KKyAqIFNpbmNlIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBvdXIKKyAqIHZlcnNpb25zIGFyZSBkb25lIGluIHRoZSBtb3N0ICJub3JtYWwiIHdheSBwb3NzaWJsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KKworLyogVGhlc2UgYXJlIHNlY29uZGFyeSBlbnRyeSBwb2ludHMgYXMgdGhlIHByaW1hcnkgZW50cnkgcG9pbnRzIGFyZSBkZWZpbmVkIGluCisgKiBlbnRyeS5TIHdoZXJlIHdlIGFkZCB0aGUgJ3JlZ3MnIHBhcmFtZXRlciB2YWx1ZQorICovCisKK2FzbWxpbmthZ2UgbG9uZyBfc3lzX2Nsb25lKHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3c3AsCisJCQkgICBpbnQgX191c2VyICpwYXJlbnRfdGlkLCBpbnQgX191c2VyICpjaGlsZF90aWQsCisJCQkgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlsb25nIHJldDsKKworCS8qIEZJWE1FOiBJcyBhbGlnbm1lbnQgbmVjZXNzYXJ5PyAqLworCS8qIG5ld3NwID0gQUxJR04obmV3c3AsIDQpOyAqLworCisJaWYgKCFuZXdzcCkKKwkJbmV3c3AgPSByZWdzLT5zcDsKKworCXJldCA9IGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCByZWdzLCAwLCBwYXJlbnRfdGlkLCBjaGlsZF90aWQpOworCisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBpbnQgX3N5c19mb3JrKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmZGVmIENPTkZJR19NTVUKKwlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLT5zcCwgcmVncywgMCwgTlVMTCwgTlVMTCk7CisjZWxzZQorCXJldHVybiAtRUlOVkFMOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC90aW1lLmMgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5NDZlZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL3RpbWUuYwpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIE9wZW5SSVNDIHRpbWUuYworICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIHRoZSBPcGVuUklTQyBhcmNoaXRlY3R1cmU6CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vY3B1aW5mby5oPgorCitzdGF0aWMgaW50IG9wZW5yaXNjX3RpbWVyX3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsCisJCQkJCSBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJdTMyIGM7CisKKwkvKiBSZWFkIDMyLWJpdCBjb3VudGVyIHZhbHVlLCBhZGQgZGVsdGEsIG1hc2sgb2ZmIHRoZSBsb3cgMjggYml0cy4KKwkgKiBXZSdyZSBndWFyYW50ZWVkIGRlbHRhIHdvbid0IGJlIGJpZ2dlciB0aGFuIDI4IGJpdHMgYmVjYXVzZSB0aGUKKwkgKiBnZW5lcmljIHRpbWVrZWVwaW5nIGNvZGUgZW5zdXJlcyB0aGF0IGZvciB1cy4KKwkgKi8KKwljID0gbWZzcHIoU1BSX1RUQ1IpOworCWMgKz0gZGVsdGE7CisJYyAmPSBTUFJfVFRNUl9UUDsKKworCS8qIFNldCBjb3VudGVyIGFuZCBlbmFibGUgaW50ZXJydXB0LgorCSAqIEtlZXAgdGltZXIgaW4gY29udGludW91cyBtb2RlIGFsd2F5cy4KKwkgKi8KKwltdHNwcihTUFJfVFRNUiwgU1BSX1RUTVJfQ1IgfCBTUFJfVFRNUl9JRSB8IGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9wZW5yaXNjX3RpbWVyX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKKwkJcHJfZGVidWcoS0VSTl9JTkZPICIlczogcGVyaW9kaWNcbiIsIF9fZnVuY19fKTsKKwkJQlVHKCk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKKwkJcHJfZGVidWcoS0VSTl9JTkZPICIlczogb25lc2hvdFxuIiwgX19mdW5jX18pOworCQlicmVhazsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwkJcHJfZGVidWcoS0VSTl9JTkZPICIlczogdW51c2VkXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJCXByX2RlYnVnKEtFUk5fSU5GTyAiJXM6IHNodXRkb3duXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgorCQlwcl9kZWJ1ZyhLRVJOX0lORk8gIiVzOiByZXN1bWVcbiIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBUaGlzIGlzIHRoZSBjbG9jayBldmVudCBkZXZpY2UgYmFzZWQgb24gdGhlIE9SMUsgdGljayB0aW1lci4KKyAqIEFzIHRoZSB0aW1lciBpcyBiZWluZyB1c2VkIGFzIGEgY29udGludW91cyBjbG9jay1zb3VyY2UgKHJlcXVpcmVkIGZvciBIUgorICogdGltZXJzKSB3ZSBjYW5ub3QgZW5hYmxlIHRoZSBQRVJJT0RJQyBmZWF0dXJlLiAgVGhlIHRpY2sgdGltZXIgY2FuIHJ1biB1c2luZworICogb25lLXNob3QgZXZlbnRzLCBzbyBubyBwcm9ibGVtLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGNsb2NrZXZlbnRfb3BlbnJpc2NfdGltZXIgPSB7CisJLm5hbWUgPSAib3BlbnJpc2NfdGltZXJfY2xvY2tldmVudCIsCisJLmZlYXR1cmVzID0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKKwkucmF0aW5nID0gMzAwLAorCS5zZXRfbmV4dF9ldmVudCA9IG9wZW5yaXNjX3RpbWVyX3NldF9uZXh0X2V2ZW50LAorCS5zZXRfbW9kZSA9IG9wZW5yaXNjX3RpbWVyX3NldF9tb2RlLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX2Fjayh2b2lkKQoreworCS8qIENsZWFyIHRoZSBJUCBiaXQgYW5kIGRpc2FibGUgZnVydGhlciBpbnRlcnJ1cHRzICovCisJLyogVGhpcyBjYW4gYmUgZG9uZSB2ZXJ5IHNpbXBseS4uLiB3ZSBqdXN0IG5lZWQgdG8ga2VlcCB0aGUgdGltZXIKKwkgICBydW5uaW5nLCBzbyBqdXN0IG1haW50YWluIHRoZSBDUiBiaXRzIHdoaWxlIGNsZWFyaW5nIHRoZSByZXN0CisJICAgb2YgdGhlIHJlZ2lzdGVyCisJICovCisJbXRzcHIoU1BSX1RUTVIsIFNQUl9UVE1SX0NSKTsKK30KKworLyoKKyAqIFRoZSB0aW1lciBpbnRlcnJ1cHQgaXMgbW9zdGx5IGhhbmRsZWQgaW4gZ2VuZXJpYyBjb2RlIG5vd2FkYXlzLi4uIHRoaXMKKyAqIGZ1bmN0aW9uIGp1c3QgYWNrbm93bGVkZ2VzIHRoZSBpbnRlcnJ1cHQgYW5kIGZpcmVzIHRoZSBldmVudCBoYW5kbGVyIHRoYXQKKyAqIGhhcyBiZWVuIHNldCBvbiB0aGUgY2xvY2tldmVudCBkZXZpY2UgYnkgdGhlIGdlbmVyaWMgdGltZSBtYW5hZ2VtZW50IGNvZGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBjYWxsZWQgYnkgdGhlIHRpbWVyIGV4Y2VwdGlvbiBoYW5kbGVyIGFuZCB0aGF0J3MKKyAqIGFsbCB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgbmVlZHMgdG8gZG8uCisgKi8KKworaXJxcmV0dXJuX3QgX19pcnFfZW50cnkgdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAmY2xvY2tldmVudF9vcGVucmlzY190aW1lcjsKKworCXRpbWVyX2FjaygpOworCisJLyoKKwkgKiB1cGRhdGVfcHJvY2Vzc190aW1lcygpIGV4cGVjdHMgdXMgdG8gaGF2ZSBjYWxsZWQgaXJxX2VudGVyKCkuCisJICovCisJaXJxX2VudGVyKCk7CisJZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7CisJaXJxX2V4aXQoKTsKKworCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBfX2luaXQgdm9pZCBvcGVucmlzY19jbG9ja2V2ZW50X2luaXQodm9pZCkKK3sKKwljbG9ja2V2ZW50c19jYWxjX211bHRfc2hpZnQoJmNsb2NrZXZlbnRfb3BlbnJpc2NfdGltZXIsCisJCQkJICAgIGNwdWluZm8uY2xvY2tfZnJlcXVlbmN5LCA0KTsKKworCS8qIFdlIG9ubHkgaGF2ZSAyOCBiaXRzICovCisJY2xvY2tldmVudF9vcGVucmlzY190aW1lci5tYXhfZGVsdGFfbnMgPQorCSAgICBjbG9ja2V2ZW50X2RlbHRhMm5zKCh1MzIpIDB4MGZmZmZmZmYsICZjbG9ja2V2ZW50X29wZW5yaXNjX3RpbWVyKTsKKwljbG9ja2V2ZW50X29wZW5yaXNjX3RpbWVyLm1pbl9kZWx0YV9ucyA9CisJICAgIGNsb2NrZXZlbnRfZGVsdGEybnMoMSwgJmNsb2NrZXZlbnRfb3BlbnJpc2NfdGltZXIpOworCWNsb2NrZXZlbnRfb3BlbnJpc2NfdGltZXIuY3B1bWFzayA9IGNwdW1hc2tfb2YoMCk7CisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZjbG9ja2V2ZW50X29wZW5yaXNjX3RpbWVyKTsKK30KKworLyoqCisgKiBDbG9ja3NvdXJjZTogQmFzZWQgb24gT3BlblJJU0MgdGltZXIvY291bnRlcgorICoKKyAqIFRoaXMgc2V0cyB1cCB0aGUgT3BlblJJU0MgVGljayBUaW1lciBhcyBhIGNsb2NrIHNvdXJjZS4gIFRoZSB0aWNrIHRpbWVyCisgKiBpcyAzMiBiaXRzIHdpZGUgYW5kIHJ1bnMgYXQgdGhlIENQVSBjbG9jayBmcmVxdWVuY3kuCisgKi8KKworc3RhdGljIGN5Y2xlX3Qgb3BlbnJpc2NfdGltZXJfcmVhZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXJldHVybiAoY3ljbGVfdCkgbWZzcHIoU1BSX1RUQ1IpOworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIG9wZW5yaXNjX3RpbWVyID0geworCS5uYW1lID0gIm9wZW5yaXNjX3RpbWVyIiwKKwkucmF0aW5nID0gMjAwLAorCS5yZWFkID0gb3BlbnJpc2NfdGltZXJfcmVhZCwKKwkubWFzayA9IENMT0NLU09VUkNFX01BU0soMzIpLAorCS5mbGFncyA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb3BlbnJpc2NfdGltZXJfaW5pdCh2b2lkKQoreworCWlmIChjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmb3BlbnJpc2NfdGltZXIsIGNwdWluZm8uY2xvY2tfZnJlcXVlbmN5KSkKKwkJcGFuaWMoImZhaWxlZCB0byByZWdpc3RlciBjbG9ja3NvdXJjZSIpOworCisJLyogRW5hYmxlIHRoZSBpbmNyZW1lbnRlcjogJ2NvbnRpbnVvdXMnIG1vZGUgd2l0aCBpbnRlcnJ1cHQgZGlzYWJsZWQgKi8KKwltdHNwcihTUFJfVFRNUiwgU1BSX1RUTVJfQ1IpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQoreworCXUzMiB1cHI7CisKKwl1cHIgPSBtZnNwcihTUFJfVVBSKTsKKwlpZiAoISh1cHIgJiBTUFJfVVBSX1RUUCkpCisJCXBhbmljKCJMaW51eCBub3Qgc3VwcG9ydGVkIG9uIGRldmljZXMgd2l0aG91dCB0aWNrIHRpbWVyIik7CisKKwlvcGVucmlzY190aW1lcl9pbml0KCk7CisJb3BlbnJpc2NfY2xvY2tldmVudF9pbml0KCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvdHJhcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGVjNDRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvdHJhcHMuYwpAQCAtMCwwICsxLDM2NiBAQAorLyoKKyAqIE9wZW5SSVNDIHRyYXBzLmMKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciB0aGUgT3BlblJJU0MgYXJjaGl0ZWN0dXJlOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBIZXJlIHdlIGhhbmRsZSB0aGUgYnJlYWsgdmVjdG9ycyBub3QgdXNlZCBieSB0aGUgc3lzdGVtIGNhbGwKKyAqICBtZWNoYW5pc20sIGFzIHdlbGwgYXMgc29tZSBnZW5lcmFsIHN0YWNrL3JlZ2lzdGVyIGR1bXBpbmcKKyAqICB0aGluZ3MuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworZXh0ZXJuIGNoYXIgX2V0ZXh0LCBfc3RleHQ7CisKK2ludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQgPSAweDE4MDsKKworc3RhdGljIGlubGluZSBpbnQgdmFsaWRfc3RhY2tfcHRyKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGluZm8sIHZvaWQgKnApCit7CisJcmV0dXJuIHAgPiAodm9pZCAqKXRpbmZvICYmIHAgPCAodm9pZCAqKXRpbmZvICsgVEhSRUFEX1NJWkUgLSAzOworfQorCit2b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzdGFjaykKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKmNvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJY29udGV4dCA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKKwkgICAgKCh1bnNpZ25lZCBsb25nKXN0YWNrICYgKH4oVEhSRUFEX1NJWkUgLSAxKSkpOworCisJd2hpbGUgKHZhbGlkX3N0YWNrX3B0cihjb250ZXh0LCBzdGFjaykpIHsKKwkJYWRkciA9ICpzdGFjaysrOworCQlpZiAoX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKSB7CisJCQlwcmludGsoIiBbPCUwOGx4Pl0iLCBhZGRyKTsKKwkJCXByaW50X3N5bWJvbCgiICVzIiwgYWRkcik7CisJCQlwcmludGsoIlxuIik7CisJCX0KKwl9CisJcHJpbnRrKCIgPT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworfQorCisvKiBkaXNwbGF5cyBhIHNob3J0IHN0YWNrIHRyYWNlICovCit2b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICplc3ApCit7CisJdW5zaWduZWQgbG9uZyBhZGRyLCAqc3RhY2s7CisJaW50IGk7CisKKwlpZiAoZXNwID09IE5VTEwpCisJCWVzcCA9ICh1bnNpZ25lZCBsb25nICopJmVzcDsKKworCXN0YWNrID0gZXNwOworCisJcHJpbnRrKCJTdGFjayBkdW1wIFsweCUwOGx4XTpcbiIsICh1bnNpZ25lZCBsb25nKWVzcCk7CisJZm9yIChpID0gMDsgaSA8IGtzdGFja19kZXB0aF90b19wcmludDsgaSsrKSB7CisJCWlmIChrc3RhY2tfZW5kKHN0YWNrKSkKKwkJCWJyZWFrOworCQlpZiAoX19nZXRfdXNlcihhZGRyLCBzdGFjaykpIHsKKwkJCS8qIFRoaXMgbWVzc2FnZSBtYXRjaGVzICJmYWlsaW5nIGFkZHJlc3MiIG1hcmtlZAorCQkJICAgczM5MCBpbiBrc3ltb29wcywgc28gbGluZXMgY29udGFpbmluZyBpdCB3aWxsCisJCQkgICBub3QgYmUgZmlsdGVyZWQgb3V0IGJ5IGtzeW1vb3BzLiAgKi8KKwkJCXByaW50aygiRmFpbGluZyBhZGRyZXNzIDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZylzdGFjayk7CisJCQlicmVhazsKKwkJfQorCQlzdGFjaysrOworCisJCXByaW50aygic3AgKyAlMDJkOiAweCUwOGx4XG4iLCBpICogNCwgYWRkcik7CisJfQorCXByaW50aygiXG4iKTsKKworCXNob3dfdHJhY2UodGFzaywgZXNwKTsKKworCXJldHVybjsKK30KKwordm9pZCBzaG93X3RyYWNlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJLyoKKwkgKiBUT0RPOiBTeXNScS1UIHRyYWNlIGR1bXAuLi4KKwkgKi8KK30KKworLyoKKyAqIFRoZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgYmFja3RyYWNlIGdlbmVyYXRvcgorICovCit2b2lkIGR1bXBfc3RhY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCisJc2hvd19zdGFjayhjdXJyZW50LCAmc3RhY2spOworfQorCit2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpOworCWludCBpbl9rZXJuZWwgPSAxOworCXVuc2lnbmVkIGxvbmcgZXNwOworCisJZXNwID0gKHVuc2lnbmVkIGxvbmcpKCZyZWdzLT5zcCk7CisJaWYgKHVzZXJfbW9kZShyZWdzKSkKKwkJaW5fa2VybmVsID0gMDsKKworCXByaW50aygiQ1BVICM6ICVkXG4iCisJICAgICAgICIgICBQQzogJTA4bHggICAgU1I6ICUwOGx4ICAgIFNQOiAlMDhseFxuIiwKKwkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCByZWdzLT5wYywgcmVncy0+c3IsIHJlZ3MtPnNwKTsKKwlwcmludGsoIkdQUjAwOiAlMDhseCBHUFIwMTogJTA4bHggR1BSMDI6ICUwOGx4IEdQUjAzOiAlMDhseFxuIiwKKwkgICAgICAgMEwsIHJlZ3MtPmdwclsxXSwgcmVncy0+Z3ByWzJdLCByZWdzLT5ncHJbM10pOworCXByaW50aygiR1BSMDQ6ICUwOGx4IEdQUjA1OiAlMDhseCBHUFIwNjogJTA4bHggR1BSMDc6ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5ncHJbNF0sIHJlZ3MtPmdwcls1XSwgcmVncy0+Z3ByWzZdLCByZWdzLT5ncHJbN10pOworCXByaW50aygiR1BSMDg6ICUwOGx4IEdQUjA5OiAlMDhseCBHUFIxMDogJTA4bHggR1BSMTE6ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5ncHJbOF0sIHJlZ3MtPmdwcls5XSwgcmVncy0+Z3ByWzEwXSwgcmVncy0+Z3ByWzExXSk7CisJcHJpbnRrKCJHUFIxMjogJTA4bHggR1BSMTM6ICUwOGx4IEdQUjE0OiAlMDhseCBHUFIxNTogJTA4bHhcbiIsCisJICAgICAgIHJlZ3MtPmdwclsxMl0sIHJlZ3MtPmdwclsxM10sIHJlZ3MtPmdwclsxNF0sIHJlZ3MtPmdwclsxNV0pOworCXByaW50aygiR1BSMTY6ICUwOGx4IEdQUjE3OiAlMDhseCBHUFIxODogJTA4bHggR1BSMTk6ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5ncHJbMTZdLCByZWdzLT5ncHJbMTddLCByZWdzLT5ncHJbMThdLCByZWdzLT5ncHJbMTldKTsKKwlwcmludGsoIkdQUjIwOiAlMDhseCBHUFIyMTogJTA4bHggR1BSMjI6ICUwOGx4IEdQUjIzOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+Z3ByWzIwXSwgcmVncy0+Z3ByWzIxXSwgcmVncy0+Z3ByWzIyXSwgcmVncy0+Z3ByWzIzXSk7CisJcHJpbnRrKCJHUFIyNDogJTA4bHggR1BSMjU6ICUwOGx4IEdQUjI2OiAlMDhseCBHUFIyNzogJTA4bHhcbiIsCisJICAgICAgIHJlZ3MtPmdwclsyNF0sIHJlZ3MtPmdwclsyNV0sIHJlZ3MtPmdwclsyNl0sIHJlZ3MtPmdwclsyN10pOworCXByaW50aygiR1BSMjg6ICUwOGx4IEdQUjI5OiAlMDhseCBHUFIzMDogJTA4bHggR1BSMzE6ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5ncHJbMjhdLCByZWdzLT5ncHJbMjldLCByZWdzLT5ncHJbMzBdLCByZWdzLT5ncHJbMzFdKTsKKwlwcmludGsoIiAgUkVTOiAlMDhseCBvR1BSMTE6ICUwOGx4IHN5c2NhbGxubzogJTA4bHhcbiIsCisJICAgICAgIHJlZ3MtPmdwclsxMV0sIHJlZ3MtPm9yaWdfZ3ByMTEsIHJlZ3MtPnN5c2NhbGxubyk7CisKKwlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHN0YWNrcGFnZT0lMDhseClcbiIsCisJICAgICAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgKHVuc2lnbmVkIGxvbmcpY3VycmVudCk7CisJLyoKKwkgKiBXaGVuIGluLWtlcm5lbCwgd2UgYWxzbyBwcmludCBvdXQgdGhlIHN0YWNrIGFuZCBjb2RlIGF0IHRoZQorCSAqIHRpbWUgb2YgdGhlIGZhdWx0Li4KKwkgKi8KKwlpZiAoaW5fa2VybmVsKSB7CisKKwkJcHJpbnRrKCJcblN0YWNrOiAiKTsKKwkJc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyAqKWVzcCk7CisKKwkJcHJpbnRrKCJcbkNvZGU6ICIpOworCQlpZiAocmVncy0+cGMgPCBQQUdFX09GRlNFVCkKKwkJCWdvdG8gYmFkOworCisJCWZvciAoaSA9IC0yNDsgaSA8IDI0OyBpKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgYzsKKwkJCWlmIChfX2dldF91c2VyKGMsICYoKHVuc2lnbmVkIGNoYXIgKilyZWdzLT5wYylbaV0pKSB7CitiYWQ6CisJCQkJcHJpbnRrKCIgQmFkIFBDIHZhbHVlLiIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoaSA9PSAwKQorCQkJCXByaW50aygiKCUwMngpICIsIGMpOworCQkJZWxzZQorCQkJCXByaW50aygiJTAyeCAiLCBjKTsKKwkJfQorCX0KKwlwcmludGsoIlxuIik7Cit9CisKK3ZvaWQgbm9tbXVfZHVtcF9zdGF0ZShzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJICAgICAgdW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyB2ZWN0b3IpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBzdGFjayA9IHJlZ3MtPnNwOworCisJcHJpbnRrKCJcblxyW25vbW11X2R1bXBfc3RhdGVdIDo6IGVhICVseCwgdmVjdG9yICVseFxuXHIiLCBlYSwgdmVjdG9yKTsKKworCXByaW50aygiQ1BVICM6ICVkXG4iCisJICAgICAgICIgICBQQzogJTA4bHggICAgU1I6ICUwOGx4ICAgIFNQOiAlMDhseFxuIiwKKwkgICAgICAgMCwgcmVncy0+cGMsIHJlZ3MtPnNyLCByZWdzLT5zcCk7CisJcHJpbnRrKCJHUFIwMDogJTA4bHggR1BSMDE6ICUwOGx4IEdQUjAyOiAlMDhseCBHUFIwMzogJTA4bHhcbiIsCisJICAgICAgIDBMLCByZWdzLT5ncHJbMV0sIHJlZ3MtPmdwclsyXSwgcmVncy0+Z3ByWzNdKTsKKwlwcmludGsoIkdQUjA0OiAlMDhseCBHUFIwNTogJTA4bHggR1BSMDY6ICUwOGx4IEdQUjA3OiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+Z3ByWzRdLCByZWdzLT5ncHJbNV0sIHJlZ3MtPmdwcls2XSwgcmVncy0+Z3ByWzddKTsKKwlwcmludGsoIkdQUjA4OiAlMDhseCBHUFIwOTogJTA4bHggR1BSMTA6ICUwOGx4IEdQUjExOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+Z3ByWzhdLCByZWdzLT5ncHJbOV0sIHJlZ3MtPmdwclsxMF0sIHJlZ3MtPmdwclsxMV0pOworCXByaW50aygiR1BSMTI6ICUwOGx4IEdQUjEzOiAlMDhseCBHUFIxNDogJTA4bHggR1BSMTU6ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5ncHJbMTJdLCByZWdzLT5ncHJbMTNdLCByZWdzLT5ncHJbMTRdLCByZWdzLT5ncHJbMTVdKTsKKwlwcmludGsoIkdQUjE2OiAlMDhseCBHUFIxNzogJTA4bHggR1BSMTg6ICUwOGx4IEdQUjE5OiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+Z3ByWzE2XSwgcmVncy0+Z3ByWzE3XSwgcmVncy0+Z3ByWzE4XSwgcmVncy0+Z3ByWzE5XSk7CisJcHJpbnRrKCJHUFIyMDogJTA4bHggR1BSMjE6ICUwOGx4IEdQUjIyOiAlMDhseCBHUFIyMzogJTA4bHhcbiIsCisJICAgICAgIHJlZ3MtPmdwclsyMF0sIHJlZ3MtPmdwclsyMV0sIHJlZ3MtPmdwclsyMl0sIHJlZ3MtPmdwclsyM10pOworCXByaW50aygiR1BSMjQ6ICUwOGx4IEdQUjI1OiAlMDhseCBHUFIyNjogJTA4bHggR1BSMjc6ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5ncHJbMjRdLCByZWdzLT5ncHJbMjVdLCByZWdzLT5ncHJbMjZdLCByZWdzLT5ncHJbMjddKTsKKwlwcmludGsoIkdQUjI4OiAlMDhseCBHUFIyOTogJTA4bHggR1BSMzA6ICUwOGx4IEdQUjMxOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+Z3ByWzI4XSwgcmVncy0+Z3ByWzI5XSwgcmVncy0+Z3ByWzMwXSwgcmVncy0+Z3ByWzMxXSk7CisJcHJpbnRrKCIgIFJFUzogJTA4bHggb0dQUjExOiAlMDhseCBzeXNjYWxsbm86ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5ncHJbMTFdLCByZWdzLT5vcmlnX2dwcjExLCByZWdzLT5zeXNjYWxsbm8pOworCisJcHJpbnRrKCJQcm9jZXNzICVzIChwaWQ6ICVkLCBzdGFja3BhZ2U9JTA4bHgpXG4iLAorCSAgICAgICAoKHN0cnVjdCB0YXNrX3N0cnVjdCAqKShfX3BhKGN1cnJlbnQpKSktPmNvbW0sCisJICAgICAgICgoc3RydWN0IHRhc2tfc3RydWN0ICopKF9fcGEoY3VycmVudCkpKS0+cGlkLAorCSAgICAgICAodW5zaWduZWQgbG9uZyljdXJyZW50KTsKKworCXByaW50aygiXG5TdGFjazogIik7CisJcHJpbnRrKCJTdGFjayBkdW1wIFsweCUwOGx4XTpcbiIsICh1bnNpZ25lZCBsb25nKXN0YWNrKTsKKwlmb3IgKGkgPSAwOyBpIDwga3N0YWNrX2RlcHRoX3RvX3ByaW50OyBpKyspIHsKKwkJaWYgKCgobG9uZylzdGFjayAmIChUSFJFQURfU0laRSAtIDEpKSA9PSAwKQorCQkJYnJlYWs7CisJCXN0YWNrKys7CisKKwkJcHJpbnRrKCIlbHggOjogc3AgKyAlMDJkOiAweCUwOGx4XG4iLCBzdGFjaywgaSAqIDQsCisJCSAgICAgICAqKCh1bnNpZ25lZCBsb25nICopKF9fcGEoc3RhY2spKSkpOworCX0KKwlwcmludGsoIlxuIik7CisKKwlwcmludGsoIkNhbGwgVHJhY2U6ICAgIik7CisJaSA9IDE7CisJd2hpbGUgKCgobG9uZylzdGFjayAmIChUSFJFQURfU0laRSAtIDEpKSAhPSAwKSB7CisJCWFkZHIgPSAqKCh1bnNpZ25lZCBsb25nICopX19wYShzdGFjaykpOworCQlzdGFjaysrOworCisJCWlmIChrZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKSB7CisJCQlpZiAoaSAmJiAoKGkgJSA2KSA9PSAwKSkKKwkJCQlwcmludGsoIlxuICIpOworCQkJcHJpbnRrKCIgWzwlMDhseD5dIiwgYWRkcik7CisJCQlpKys7CisJCX0KKwl9CisJcHJpbnRrKCJcbiIpOworCisJcHJpbnRrKCJcbkNvZGU6ICIpOworCisJZm9yIChpID0gLTI0OyBpIDwgMjQ7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIGM7CisJCWMgPSAoKHVuc2lnbmVkIGNoYXIgKikoX19wYShyZWdzLT5wYykpKVtpXTsKKworCQlpZiAoaSA9PSAwKQorCQkJcHJpbnRrKCIoJTAyeCkgIiwgYyk7CisJCWVsc2UKKwkJCXByaW50aygiJTAyeCAiLCBjKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCisvKiBUaGlzIGlzIG5vcm1hbGx5IHRoZSAnT29wcycgcm91dGluZSAqLwordm9pZCBkaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpCit7CisKKwljb25zb2xlX3ZlcmJvc2UoKTsKKwlwcmludGsoIlxuJXMjOiAlMDRseFxuIiwgc3RyLCBlcnIgJiAweGZmZmYpOworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworI2lmZGVmIENPTkZJR19KVU1QX1VQT05fVU5IQU5ETEVEX0VYQ0VQVElPTgorCXByaW50aygiXG5cblVOSEFORExFRF9FWENFUFRJT046IGVudGVyaW5nIGluZmluaXRlIGxvb3BcbiIpOworCisJLyogc2h1dCBkb3duIGludGVycnVwdHMgKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oImwubm9wICAgMSIpOworCWRvIHt9IHdoaWxlICgxKTsKKyNlbmRpZgorCWRvX2V4aXQoU0lHU0VHVik7Cit9CisKKy8qIFRoaXMgaXMgbm9ybWFsbHkgdGhlICdPb3BzJyByb3V0aW5lICovCit2b2lkIGRpZV9pZl9rZXJuZWwoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpCit7CisJaWYgKHVzZXJfbW9kZShyZWdzKSkKKwkJcmV0dXJuOworCisJZGllKHN0ciwgcmVncywgZXJyKTsKK30KKwordm9pZCB1bmhhbmRsZWRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZWEsIGludCB2ZWN0b3IpCit7CisJcHJpbnRrKCJVbmFibGUgdG8gaGFuZGxlIGV4Y2VwdGlvbiBhdCBFQSA9MHgleCwgdmVjdG9yIDB4JXgiLAorCSAgICAgICBlYSwgdmVjdG9yKTsKKwlkaWUoIk9vcHMiLCByZWdzLCA5KTsKK30KKwordm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCit7CisJLyogTm90aGluZyBuZWVkcyB0byBiZSBkb25lICovCit9CisKK2FzbWxpbmthZ2Ugdm9pZCBkb190cmFwKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJc2lnaW5mb190IGluZm87CisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCWluZm8uc2lfc2lnbm8gPSBTSUdUUkFQOworCWluZm8uc2lfY29kZSA9IFRSQVBfVFJBQ0U7CisJaW5mby5zaV9hZGRyID0gKHZvaWQgKilhZGRyZXNzOworCWZvcmNlX3NpZ19pbmZvKFNJR1RSQVAsICZpbmZvLCBjdXJyZW50KTsKKworCXJlZ3MtPnBjICs9IDQ7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBkb191bmFsaWduZWRfYWNjZXNzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJc2lnaW5mb190IGluZm87CisKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCS8qIFNlbmQgYSBTSUdTRUdWICovCisJCWluZm8uc2lfc2lnbm8gPSBTSUdTRUdWOworCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJLyogaW5mby5zaV9jb2RlIGhhcyBiZWVuIHNldCBhYm92ZSAqLworCQlpbmZvLnNpX2FkZHIgPSAodm9pZCAqKWFkZHJlc3M7CisJCWZvcmNlX3NpZ19pbmZvKFNJR1NFR1YsICZpbmZvLCBjdXJyZW50KTsKKwl9IGVsc2UgeworCQlwcmludGsoIktFUk5FTDogVW5hbGlnbmVkIEFjY2VzcyAweCUuOGx4XG4iLCBhZGRyZXNzKTsKKwkJc2hvd19yZWdpc3RlcnMocmVncyk7CisJCWRpZSgiRGllOiIsIHJlZ3MsIGFkZHJlc3MpOworCX0KKworfQorCithc21saW5rYWdlIHZvaWQgZG9fYnVzX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJc2lnaW5mb190IGluZm87CisKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCS8qIFNlbmQgYSBTSUdCVVMgKi8KKwkJaW5mby5zaV9zaWdubyA9IFNJR0JVUzsKKwkJaW5mby5zaV9lcnJubyA9IDA7CisJCWluZm8uc2lfY29kZSA9IEJVU19BRFJFUlI7CisJCWluZm8uc2lfYWRkciA9ICh2b2lkICopYWRkcmVzczsKKwkJZm9yY2Vfc2lnX2luZm8oU0lHQlVTLCAmaW5mbywgY3VycmVudCk7CisJfSBlbHNlIHsJCS8qIEtlcm5lbCBtb2RlICovCisJCXByaW50aygiS0VSTkVMOiBCdXMgZXJyb3IgKFNJR0JVUykgMHglLjhseFxuIiwgYWRkcmVzcyk7CisJCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCQlkaWUoIkRpZToiLCByZWdzLCBhZGRyZXNzKTsKKwl9Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBkb19pbGxlZ2FsX2luc3RydWN0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJc2lnaW5mb190IGluZm87CisKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCS8qIFNlbmQgYSBTSUdJTEwgKi8KKwkJaW5mby5zaV9zaWdubyA9IFNJR0lMTDsKKwkJaW5mby5zaV9lcnJubyA9IDA7CisJCWluZm8uc2lfY29kZSA9IElMTF9JTExPUEM7CisJCWluZm8uc2lfYWRkciA9ICh2b2lkICopYWRkcmVzczsKKwkJZm9yY2Vfc2lnX2luZm8oU0lHQlVTLCAmaW5mbywgY3VycmVudCk7CisJfSBlbHNlIHsJCS8qIEtlcm5lbCBtb2RlICovCisJCXByaW50aygiS0VSTkVMOiBJbGxlZ2FsIGluc3RydWN0aW9uIChTSUdJTEwpIDB4JS44bHhcbiIsCisJCSAgICAgICBhZGRyZXNzKTsKKwkJc2hvd19yZWdpc3RlcnMocmVncyk7CisJCWRpZSgiRGllOiIsIHJlZ3MsIGFkZHJlc3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2Mva2VybmVsL3ZtbGludXguaCBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL3ZtbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTg0MmEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvdm1saW51eC5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX19PUEVOUklTQ19WTUxJTlVYX0hfCisjZGVmaW5lIF9fT1BFTlJJU0NfVk1MSU5VWF9IXworCitleHRlcm4gY2hhciBfc3RleHQsIF9ldGV4dCwgX2VkYXRhLCBfZW5kOworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorZXh0ZXJuIGNoYXIgX19pbml0cmRfc3RhcnQsIF9faW5pdHJkX2VuZDsKK2V4dGVybiBjaGFyIF9faW5pdHJhbWZzX3N0YXJ0OworI2VuZGlmCisKK2V4dGVybiB1MzIgX19kdGJfc3RhcnRbXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDY5YTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIE9wZW5SSVNDIHZtbGludXgubGRzLlMKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciB0aGUgT3BlblJJU0MgYXJjaGl0ZWN0dXJlOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIGxkIHNjcmlwdCBmb3IgT3BlblJJU0MgYXJjaGl0ZWN0dXJlCisgKi8KKworLyogVE9ETworICoJCS0gY2xlYW4gdXAgX19vZmZzZXQgJiBzdHVmZgorICoJCS0gY2hhbmdlIGFsbCA4MTkyIGFsaWdtZW50IHRvIFBBR0UgISEhCisgKgkJLSByZWNoZWNrIGlmIGFsbCBhbGlnbWVudHMgYXJlIHJlYWxseSBuZWVkZWQKKyAqLworCisjICBkZWZpbmUgTE9BRF9PRkZTRVQgIFBBR0VfT0ZGU0VUCisjICBkZWZpbmUgTE9BRF9CQVNFICAgIFBBR0VfT0ZGU0VUCisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CisKK09VVFBVVF9GT1JNQVQoImVsZjMyLW9yMzIiLCAiZWxmMzItb3IzMiIsICJlbGYzMi1vcjMyIikKK2ppZmZpZXMgPSBqaWZmaWVzXzY0ICsgNDsKKworU0VDVElPTlMKK3sKKyAgICAgICAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgICAgICAgIC4gPSBMT0FEX0JBU0UgOworCisJLyogX3Nfa2VybmVsX3JvIG11c3QgYmUgcGFnZSBhbGlnbmVkICovCisJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJX3Nfa2VybmVsX3JvID0gLjsKKworICAgICAgICAudGV4dCAgICAgICAgICAgICAgICAgICA6IEFUKEFERFIoLnRleHQpIC0gTE9BRF9PRkZTRVQpCisJeworICAgICAgICAgIF9zdGV4dCA9IC47CisJICBURVhUX1RFWFQKKwkgIFNDSEVEX1RFWFQKKwkgIExPQ0tfVEVYVAorCSAgS1BST0JFU19URVhUCisJICBJUlFFTlRSWV9URVhUCisJICAqKC5maXh1cCkKKwkgICooLnRleHQuX18qKQorCSAgX2V0ZXh0ID0gLjsKKwl9CisJLyogVE9ETzogQ2hlY2sgaWYgZml4dXAgYW5kIHRleHQuX18qIGFyZSByZWFsbHkgbmVjZXNzYXJ5CisJICogZml4dXAgaXMgZGVmaW5pdGVseSBuZWNlc3NhcnkKKwkgKi8KKworCV9zZGF0YSA9IC47CisKKwkvKiBQYWdlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgUk9fREFUQV9TRUNUSU9OICovCisJUk9fREFUQV9TRUNUSU9OKFBBR0VfU0laRSkKKwlfZV9rZXJuZWxfcm8gPSAuOworCisJLyogV2hhdGV2ZXIgY29tZXMgYWZ0ZXIgX2Vfa2VybmVsX3JvIGhhZCBiZXR0ZXIgYmUgcGFnZS1hbGlnZW5kLCB0b28gKi8KKworCS8qIDMyIGhlcmUgaXMgY2FjaGVsaW5lIHNpemUuLi4gcmVjaGVjayB0aGlzICovCisJUldfREFUQV9TRUNUSU9OKDMyLCBQQUdFX1NJWkUsIFBBR0VfU0laRSkKKworICAgICAgICBfZWRhdGEgID0gIC47CisKKwlFWENFUFRJT05fVEFCTEUoNCkKKwlOT1RFUworCisJLyogSW5pdCBjb2RlIGFuZCBkYXRhICovCisJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJX19pbml0X2JlZ2luID0gLjsKKworCUhFQURfVEVYVF9TRUNUSU9OCisKKwkvKiBQYWdlIGFsaWduZWQgKi8KKwlJTklUX1RFWFRfU0VDVElPTihQQUdFX1NJWkUpCisKKwkvKiBBbGlnbiBfX3NldHVwX3N0YXJ0IG9uIDE2IGJ5dGUgYm91bmRhcnkgKi8KKwlJTklUX0RBVEFfU0VDVElPTigxNikKKworCVBFUkNQVV9TRUNUSU9OKEwxX0NBQ0hFX0JZVEVTKQorCisgICAgICAgIF9faW5pdF9lbmQgPSAuOworCisJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJLmluaXRyZAkJCTogQVQoQUREUiguaW5pdHJkKSAtIExPQURfT0ZGU0VUKQorCXsKKwkJX19pbml0cmRfc3RhcnQgPSAuOworCQkqKC5pbml0cmQpCisJCV9faW5pdHJkX2VuZCA9IC47CisJCUZJTEwgKDApOworICAgICAgICAgICAgICAgIC4gPSBBTElHTiAoUEFHRV9TSVpFKTsKKwl9CisKKyAgICAgICAgX192bWxpbnV4X2VuZCA9IC47ICAgICAgICAgICAgLyogbGFzdCBhZGRyZXNzIG9mIHRoZSBwaHlzaWNhbCBmaWxlICovCisKKwlCU1NfU0VDVElPTigwLCAwLCAweDIwKQorCisgICAgICAgIF9lbmQgPSAuOworCisJLyogVGhyb3cgaW4gdGhlIGRlYnVnZ2luZyBzZWN0aW9ucyAqLworCVNUQUJTX0RFQlVHCisJRFdBUkZfREVCVUcKKworICAgICAgICAvKiBTZWN0aW9ucyB0byBiZSBkaXNjYXJkZWQgLS0gbXVzdCBiZSBsYXN0ICovCisJRElTQ0FSRFMKK30KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvbGliL01ha2VmaWxlIGIvYXJjaC9vcGVucmlzYy9saWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2ZjY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvbGliL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3Igb3IzMiBzcGVjaWZpYyBsaWJyYXJ5IGZpbGVzLi4KKyMKKworb2JqLXkgID0gc3RyaW5nLm8gZGVsYXkubwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9saWIvZGVsYXkuYyBiL2FyY2gvb3BlbnJpc2MvbGliL2RlbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkOTc0MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvb3BlbnJpc2MvbGliL2RlbGF5LmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIE9wZW5SSVNDIExpbnV4CisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgdGhlIE9wZW5SSVNDIGFyY2hpdGVjdHVyZToKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogUHJlY2lzZSBEZWxheSBMb29wcworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCitpbnQgX19kZXZpbml0IHJlYWRfY3VycmVudF90aW1lcih1bnNpZ25lZCBsb25nICp0aW1lcl92YWx1ZSkKK3sKKwkqdGltZXJfdmFsdWUgPSBtZnNwcihTUFJfVFRDUik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGN5Y2xlcykKK3sKKwljeWNsZXNfdCB0YXJnZXQgPSBnZXRfY3ljbGVzKCkgKyBjeWNsZXM7CisKKwl3aGlsZSAoZ2V0X2N5Y2xlcygpIDwgdGFyZ2V0KQorCQljcHVfcmVsYXgoKTsKK30KK0VYUE9SVF9TWU1CT0woX19kZWxheSk7CisKK2lubGluZSB2b2lkIF9fY29uc3RfdWRlbGF5KHVuc2lnbmVkIGxvbmcgeGxvb3BzKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBsb29wczsKKworCWxvb3BzID0geGxvb3BzICogbG9vcHNfcGVyX2ppZmZ5ICogSFo7CisKKwlfX2RlbGF5KGxvb3BzID4+IDMyKTsKK30KK0VYUE9SVF9TWU1CT0woX19jb25zdF91ZGVsYXkpOworCit2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCit7CisJX19jb25zdF91ZGVsYXkodXNlY3MgKiAweDEwQzdVTCk7IC8qIDIqKjMyIC8gMTAwMDAwMCAocm91bmRlZCB1cCkgKi8KK30KK0VYUE9SVF9TWU1CT0woX191ZGVsYXkpOworCit2b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbnNlY3MpCit7CisJX19jb25zdF91ZGVsYXkobnNlY3MgKiAweDVVTCk7IC8qIDIqKjMyIC8gMTAwMDAwMDAwMCAocm91bmRlZCB1cCkgKi8KK30KK0VYUE9SVF9TWU1CT0woX19uZGVsYXkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9saWIvc3RyaW5nLlMgYi9hcmNoL29wZW5yaXNjL2xpYi9zdHJpbmcuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjVmMDRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9saWIvc3RyaW5nLlMKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBPcGVuUklTQyBzdHJpbmcuUworICoKKyAqIExpbnV4IGFyY2hpdGVjdHVyYWwgcG9ydCBib3Jyb3dpbmcgbGliZXJhbGx5IGZyb20gc2ltaWxhciB3b3JrcyBvZgorICogb3RoZXJzLiAgQWxsIG9yaWdpbmFsIGNvcHlyaWdodHMgYXBwbHkgYXMgcGVyIHRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqIGRlY2xhcmF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIHRoZSBPcGVuUklTQyBhcmNoaXRlY3R1cmU6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWF0amF6IEJyZXNrdmFyIDxwaG9lbml4QGJzZW1pLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworCS8qCisJICogdGhpcyBjYW4gYmUgb3B0aW1pemVkIGJ5IGRvaW5nIGdjYyBpbmxpbmUgYXNzZW1sYnkgd2l0aAorCSAqIHByb3BlciBjb25zdHJhaW50cyAobm8gbmVlZCB0byBzYXZlIGFyZ3MgcmVnaXN0ZXJzLi4uKQorCSAqCisJICovCisKKworLyoKKyAqCisgKiBpbnQgX19jb3B5X3RvZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIHNpemUpOworICoKKyAqIE5PVEU6IGl0IHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIE5PVCBjb3BpZWQgISEhCisgKgorICovCisJLmdsb2JhbAlfX2NvcHlfdG9mcm9tX3VzZXIKK19fY29weV90b2Zyb21fdXNlcjoKKwlsLmFkZGkgIHIxLHIxLC0xMgorCWwuc3cgICAgMChyMSkscjYKKwlsLnN3ICAgIDQocjEpLHI0CisJbC5zdyAgICA4KHIxKSxyMworCisJbC5hZGRpICByMTEscjUsMAorMjogIAlsLnNmZXEgIHIxMSxyMAorCWwuYmYgICAgMWYKKwlsLmFkZGkgIHIxMSxyMTEsLTEKKzg6ICAgIAlsLmxieiAgIHI2LDAocjQpCis5OiAgICAJbC5zYiAgICAwKHIzKSxyNgorCWwuYWRkaSAgcjMscjMsMQorCWwuaiAgICAgMmIKKwlsLmFkZGkgIHI0LHI0LDEKKzE6CisJbC5hZGRpICByMTEscjExLDEgICAgICAgICAgICAgICAvLyByMTEgaG9sZHMgdGhlIHJldHVybiB2YWx1ZQorCisJbC5sd3ogICByNiwwKHIxKQorCWwubHd6ICAgcjQsNChyMSkKKwlsLmx3eiAgIHIzLDgocjEpCisJbC5qciAgICByOQorCWwuYWRkaSAgcjEscjEsMTIKKworCS5zZWN0aW9uIC5maXh1cCwgImF4IgorOTk6CisJCWwuaiAgICAgMWIKKwkJbC5ub3AKKwkucHJldmlvdXMKKworCS5zZWN0aW9uIF9fZXhfdGFibGUsICJhIgorCQkubG9uZyA4YiwgOTliCQkvLyByZWFkIGZhdWx0CisJCS5sb25nIDliLCA5OWIJCS8vIHdyaXRlIGZhdWx0CisJLnByZXZpb3VzCisKKy8qCisgKiB1bnNpZ25lZCBsb25nIGNsZWFyX3VzZXIodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKSA7CisgKgorICogTk9URTogaXQgcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgTk9UIGNsZWFyZWQgISEhCisgKi8KKwkuZ2xvYmFsCV9fY2xlYXJfdXNlcgorX19jbGVhcl91c2VyOgorCWwuYWRkaSAgcjEscjEsLTgKKwlsLnN3ICAgIDAocjEpLHI0CisJbC5zdyAgICA0KHIxKSxyMworCisyOglsLnNmZXEJcjQscjAKKwlsLmJmCTFmCisJbC5hZGRpCXI0LHI0LC0xCis5OglsLnNiCTAocjMpLHIwCisJbC5qCTJiCisJbC5hZGRpICByMyxyMywxCisKKzE6CisJbC5hZGRpICByMTEscjQsMQorCisJbC5sd3oJcjQsMChyMSkKKwlsLmx3eglyMyw0KHIxKQorCWwuanIJcjkKKwlsLmFkZGkJcjEscjEsOAorCisJLnNlY3Rpb24gLmZpeHVwLCAiYXgiCis5OToKKwkJbC5qICAgICAxYgorCQlsLm5vcAorCS5wcmV2aW91cworCisJLnNlY3Rpb24gX19leF90YWJsZSwgImEiCisJCS5sb25nIDliLCA5OWIJCS8vIHdyaXRlIGZhdWx0CisJLnByZXZpb3VzCisKKy8qCisgKiBsb25nIHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBsb25nIGNvdW50KQorICoKKyAqCisgKi8KKwkuZ2xvYmFsCV9fc3RybmNweV9mcm9tX3VzZXIKK19fc3RybmNweV9mcm9tX3VzZXI6CisJbC5hZGRpICByMSxyMSwtMTYKKwlsLnN3ICAgIDAocjEpLHI2CisJbC5zdyAgICA0KHIxKSxyNQorCWwuc3cgICAgOChyMSkscjQKKwlsLnN3ICAgIDEyKHIxKSxyMworCisJbC5hZGRpICByMTEscjUsMAorMjogIAlsLnNmZXEgIHI1LHIwCisJbC5iZiAgICAxZgorCWwuYWRkaSAgcjUscjUsLTEKKzg6ICAgIAlsLmxieiAgIHI2LDAocjQpCisJbC5zZmVxICByNixyMAorCWwuYmYgICAgMWYKKzk6ICAgIAlsLnNiICAgIDAocjMpLHI2CisJbC5hZGRpICByMyxyMywxCisJbC5qICAgICAyYgorCWwuYWRkaSAgcjQscjQsMQorMToKKwlsLmx3eiAgIHI2LDAocjEpCisJbC5hZGRpICByNSxyNSwxCisJbC5zdWIgICByMTEscjExLHI1ICAgICAgICAgICAgICAvLyByMTEgaG9sZHMgdGhlIHJldHVybiB2YWx1ZQorCisJbC5sd3ogICByNiwwKHIxKQorCWwubHd6ICAgcjUsNChyMSkKKwlsLmx3eiAgIHI0LDgocjEpCisJbC5sd3ogICByMywxMihyMSkKKwlsLmpyICAgIHI5CisJbC5hZGRpICByMSxyMSwxNgorCisJLnNlY3Rpb24gLmZpeHVwLCAiYXgiCis5OToKKwkJbC5tb3ZoaSByMTEsaGkoLUVGQVVMVCkKKwkJbC5vcmkgICByMTEscjExLGxvKC1FRkFVTFQpCisKKwkJbC5sd3ogICByNiwwKHIxKQorCQlsLmx3eiAgIHI1LDQocjEpCisJCWwubHd6ICAgcjQsOChyMSkKKwkJbC5sd3ogICByMywxMihyMSkKKwkJbC5qcglyOQorCQlsLmFkZGkgIHIxLHIxLDE2CisJLnByZXZpb3VzCisKKwkuc2VjdGlvbiBfX2V4X3RhYmxlLCAiYSIKKwkJLmxvbmcgOGIsIDk5YgkJLy8gcmVhZCBmYXVsdAorCS5wcmV2aW91cworCisvKgorICogZXh0ZXJuIGludCBfX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyICpzdHIsIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHRvcCk7CisgKgorICoKKyAqIFJUUk46IC0gbGVuZ3RoIG9mIGEgc3RyaW5nIGluY2x1ZGluZyBOVUwgdGVybWluYXRpb24gY2hhcmFjdGVyCisgKiAgICAgICAtIG9uIHBhZ2UgZmF1bHQgMAorICovCisKKwkuZ2xvYmFsIF9fc3Rybmxlbl91c2VyCitfX3N0cm5sZW5fdXNlcjoKKwlsLmFkZGkgIHIxLHIxLC04CisJbC5zdyAgICAwKHIxKSxyNgorCWwuc3cgICAgNChyMSkscjMKKworCWwuYWRkaSAgcjExLHIwLDAKKzI6ICAJbC5zZmVxICByMTEscjQKKwlsLmJmICAgIDFmCisJbC5hZGRpICByMTEscjExLDEKKzg6ICAgIAlsLmxieiAgIHI2LDAocjMpCisJbC5zZmVxICByNixyMAorCWwuYmYgICAgMWYKKwlsLnNmZ2V1IHIzLHI1ICAgICAgICAgICAgICAgICAgLy8gYXJlIHdlIG92ZXIgdGhlIHRvcCA/CisJbC5iZiAgICA5OWYKKwlsLmogICAgIDJiCisJbC5hZGRpICByMyxyMywxCisKKzE6CisJbC5sd3ogICByNiwwKHIxKQorCWwubHd6CXIzLDQocjEpCisJbC5qciAgICByOQorCWwuYWRkaSAgcjEscjEsOAorCisJLnNlY3Rpb24gLmZpeHVwLCAiYXgiCis5OToKKwkJbC5hZGRpICByMTEscjAsMAorCisJCWwubHd6ICAgcjYsMChyMSkKKwkJbC5sd3oJcjMsNChyMSkKKwkJbC5qcglyOQorCQlsLmFkZGkgIHIxLHIxLDgKKwkucHJldmlvdXMKKworCS5zZWN0aW9uIF9fZXhfdGFibGUsICJhIgorCQkubG9uZyA4YiwgOTliCQkvLyByZWFkIGZhdWx0CisJLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL21tL01ha2VmaWxlIGIvYXJjaC9vcGVucmlzYy9tbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjRiYTI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9tbS9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBvcGVucmlzYy1zcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbWVtb3J5IG1hbmFnZXIuCisjCisKK29iai15CTo9IGZhdWx0Lm8gdGxiLm8gaW5pdC5vIGlvcmVtYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9tbS9mYXVsdC5jIGIvYXJjaC9vcGVucmlzYy9tbS9mYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZGNlODIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL21tL2ZhdWx0LmMKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBPcGVuUklTQyBmYXVsdC5jCisgKgorICogTGludXggYXJjaGl0ZWN0dXJhbCBwb3J0IGJvcnJvd2luZyBsaWJlcmFsbHkgZnJvbSBzaW1pbGFyIHdvcmtzIG9mCisgKiBvdGhlcnMuICBBbGwgb3JpZ2luYWwgY29weXJpZ2h0cyBhcHBseSBhcyBwZXIgdGhlIG9yaWdpbmFsIHNvdXJjZQorICogZGVjbGFyYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgdGhlIE9wZW5SSVNDIGFyY2hpdGVjdHVyZToKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc2lnaW5mby5oPgorI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKworI2RlZmluZSBOVU1fVExCX0VOVFJJRVMgNjQKKyNkZWZpbmUgVExCX09GRlNFVChhZGQpICgoKGFkZCkgPj4gUEFHRV9TSElGVCkgJiAoTlVNX1RMQl9FTlRSSUVTLTEpKQorCit1bnNpZ25lZCBsb25nIHB0ZV9taXNzZXM7CS8qIHVwZGF0ZWQgYnkgZG9fcGFnZV9mYXVsdCgpICovCit1bnNpZ25lZCBsb25nIHB0ZV9lcnJvcnM7CS8qIHVwZGF0ZWQgYnkgZG9fcGFnZV9mYXVsdCgpICovCisKKy8qIF9fUEhYX18gOjogLSBjaGVjayB0aGUgdm1hbGxvY19mYXVsdCBpbiBkb19wYWdlX2ZhdWx0KCkKKyAqICAgICAgICAgICAgLSBhbHNvIGxvb2sgaW50byBpbmNsdWRlL2FzbS1vcjMyL21tdV9jb250ZXh0LmgKKyAqLwordm9sYXRpbGUgcGdkX3QgKmN1cnJlbnRfcGdkOworCitleHRlcm4gdm9pZCBkaWUoY2hhciAqLCBzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKKworLyoKKyAqIFRoaXMgcm91dGluZSBoYW5kbGVzIHBhZ2UgZmF1bHRzLiAgSXQgZGV0ZXJtaW5lcyB0aGUgYWRkcmVzcywKKyAqIGFuZCB0aGUgcHJvYmxlbSwgYW5kIHRoZW4gcGFzc2VzIGl0IG9mZiB0byBvbmUgb2YgdGhlIGFwcHJvcHJpYXRlCisgKiByb3V0aW5lcy4KKyAqCisgKiBJZiB0aGlzIHJvdXRpbmUgZGV0ZWN0cyBhIGJhZCBhY2Nlc3MsIGl0IHJldHVybnMgMSwgb3RoZXJ3aXNlIGl0CisgKiByZXR1cm5zIDAuCisgKi8KKworYXNtbGlua2FnZSB2b2lkIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmVjdG9yLCBpbnQgd3JpdGVfYWNjKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXNpZ2luZm9fdCBpbmZvOworCWludCBmYXVsdDsKKworCXRzayA9IGN1cnJlbnQ7CisKKwkvKgorCSAqIFdlIGZhdWx0LWluIGtlcm5lbC1zcGFjZSB2aXJ0dWFsIG1lbW9yeSBvbi1kZW1hbmQuIFRoZQorCSAqICdyZWZlcmVuY2UnIHBhZ2UgdGFibGUgaXMgaW5pdF9tbS5wZ2QuCisJICoKKwkgKiBOT1RFISBXZSBNVVNUIE5PVCB0YWtlIGFueSBsb2NrcyBmb3IgdGhpcyBjYXNlLiBXZSBtYXkKKwkgKiBiZSBpbiBhbiBpbnRlcnJ1cHQgb3IgYSBjcml0aWNhbCByZWdpb24sIGFuZCBzaG91bGQKKwkgKiBvbmx5IGNvcHkgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIG1hc3RlciBwYWdlIHRhYmxlLAorCSAqIG5vdGhpbmcgbW9yZS4KKwkgKgorCSAqIE5PVEUyOiBUaGlzIGlzIGRvbmUgc28gdGhhdCwgd2hlbiB1cGRhdGluZyB0aGUgdm1hbGxvYworCSAqIG1hcHBpbmdzIHdlIGRvbid0IGhhdmUgdG8gd2FsayBhbGwgcHJvY2Vzc2VzIHBnZGlycyBhbmQKKwkgKiBhZGQgdGhlIGhpZ2ggbWFwcGluZ3MgYWxsIGF0IG9uY2UuIEluc3RlYWQgd2UgZG8gaXQgYXMgdGhleQorCSAqIGFyZSB1c2VkLiBIb3dldmVyIHZtYWxsb2MnZWQgcGFnZSBlbnRyaWVzIGhhdmUgdGhlIFBBR0VfR0xPQkFMCisJICogYml0IHNldCBzbyBzb21ldGltZXMgdGhlIFRMQiBjYW4gdXNlIGEgbGluZ2VyaW5nIGVudHJ5LgorCSAqCisJICogVGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBmYXVsdCBoYXBwZW5zIGluIGtlcm5lbCBzcGFjZQorCSAqIGFuZCB0aGF0IHRoZSBmYXVsdCB3YXMgbm90IGEgcHJvdGVjdGlvbiBlcnJvci4KKwkgKi8KKworCWlmIChhZGRyZXNzID49IFZNQUxMT0NfU1RBUlQgJiYKKwkgICAgKHZlY3RvciAhPSAweDMwMCAmJiB2ZWN0b3IgIT0gMHg0MDApICYmCisJICAgICF1c2VyX21vZGUocmVncykpCisJCWdvdG8gdm1hbGxvY19mYXVsdDsKKworCS8qIElmIGV4Y2VwdGlvbnMgd2VyZSBlbmFibGVkLCB3ZSBjYW4gcmVlbmFibGUgdGhlbSBoZXJlICovCisJaWYgKHVzZXJfbW9kZShyZWdzKSkgeworCQkvKiBFeGNlcHRpb24gd2FzIGluIHVzZXJzcGFjZTogcmVlbmFibGUgaW50ZXJydXB0cyAqLworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJfSBlbHNlIHsKKwkJLyogSWYgZXhjZXB0aW9uIHdhcyBpbiBhIHN5c2NhbGwsIHRoZW4gSVJRJ3MgbWF5IGhhdmUKKwkJICogYmVlbiBlbmFibGVkIG9yIGRpc2FibGVkLiAgSWYgdGhleSB3ZXJlIGVuYWJsZWQsCisJCSAqIHJlZW5hYmxlIHRoZW0uCisJCSAqLworCQlpZiAocmVncy0+c3IgJiYgKFNQUl9TUl9JRUUgfCBTUFJfU1JfVEVFKSkKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisKKwltbSA9IHRzay0+bW07CisJaW5mby5zaV9jb2RlID0gU0VHVl9NQVBFUlI7CisKKwkvKgorCSAqIElmIHdlJ3JlIGluIGFuIGludGVycnVwdCBvciBoYXZlIG5vIHVzZXIKKwkgKiBjb250ZXh0LCB3ZSBtdXN0IG5vdCB0YWtlIHRoZSBmYXVsdC4uCisJICovCisKKwlpZiAoaW5faW50ZXJydXB0KCkgfHwgIW1tKQorCQlnb3RvIG5vX2NvbnRleHQ7CisKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOworCisJaWYgKCF2bWEpCisJCWdvdG8gYmFkX2FyZWE7CisKKwlpZiAodm1hLT52bV9zdGFydCA8PSBhZGRyZXNzKQorCQlnb3RvIGdvb2RfYXJlYTsKKworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9HUk9XU0RPV04pKQorCQlnb3RvIGJhZF9hcmVhOworCisJaWYgKHVzZXJfbW9kZShyZWdzKSkgeworCQkvKgorCQkgKiBhY2Nlc3NpbmcgdGhlIHN0YWNrIGJlbG93IHVzcCBpcyBhbHdheXMgYSBidWcuCisJCSAqIHdlIGdldCBwYWdlLWFsaWduZWQgYWRkcmVzc2VzIHNvIHdlIGNhbiBvbmx5IGNoZWNrCisJCSAqIGlmIHdlJ3JlIHdpdGhpbiBhIHBhZ2UgZnJvbSB1c3AsIGJ1dCB0aGF0IG1pZ2h0IGJlCisJCSAqIGVub3VnaCB0byBjYXRjaCBicnV0YWwgZXJyb3JzIGF0IGxlYXN0LgorCQkgKi8KKwkJaWYgKGFkZHJlc3MgKyBQQUdFX1NJWkUgPCByZWdzLT5zcCkKKwkJCWdvdG8gYmFkX2FyZWE7CisJfQorCWlmIChleHBhbmRfc3RhY2sodm1hLCBhZGRyZXNzKSkKKwkJZ290byBiYWRfYXJlYTsKKworCS8qCisJICogT2ssIHdlIGhhdmUgYSBnb29kIHZtX2FyZWEgZm9yIHRoaXMgbWVtb3J5IGFjY2Vzcywgc28KKwkgKiB3ZSBjYW4gaGFuZGxlIGl0Li4KKwkgKi8KKworZ29vZF9hcmVhOgorCWluZm8uc2lfY29kZSA9IFNFR1ZfQUNDRVJSOworCisJLyogZmlyc3QgZG8gc29tZSBwcmVsaW1pbmFyeSBwcm90ZWN0aW9uIGNoZWNrcyAqLworCisJaWYgKHdyaXRlX2FjYykgeworCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCQkJZ290byBiYWRfYXJlYTsKKwl9IGVsc2UgeworCQkvKiBub3QgcHJlc2VudCAqLworCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDKSkpCisJCQlnb3RvIGJhZF9hcmVhOworCX0KKworCS8qIGFyZSB3ZSB0cnlpbmcgdG8gZXhlY3V0ZSBub25leGVjdXRhYmxlIGFyZWEgKi8KKwlpZiAoKHZlY3RvciA9PSAweDQwMCkgJiYgISh2bWEtPnZtX3BhZ2VfcHJvdC5wZ3Byb3QgJiBfUEFHRV9FWEVDKSkKKwkJZ290byBiYWRfYXJlYTsKKworCS8qCisJICogSWYgZm9yIGFueSByZWFzb24gYXQgYWxsIHdlIGNvdWxkbid0IGhhbmRsZSB0aGUgZmF1bHQsCisJICogbWFrZSBzdXJlIHdlIGV4aXQgZ3JhY2VmdWxseSByYXRoZXIgdGhhbiBlbmRsZXNzbHkgcmVkbworCSAqIHRoZSBmYXVsdC4KKwkgKi8KKworCWZhdWx0ID0gaGFuZGxlX21tX2ZhdWx0KG1tLCB2bWEsIGFkZHJlc3MsIHdyaXRlX2FjYyk7CisJaWYgKHVubGlrZWx5KGZhdWx0ICYgVk1fRkFVTFRfRVJST1IpKSB7CisJCWlmIChmYXVsdCAmIFZNX0ZBVUxUX09PTSkKKwkJCWdvdG8gb3V0X29mX21lbW9yeTsKKwkJZWxzZSBpZiAoZmF1bHQgJiBWTV9GQVVMVF9TSUdCVVMpCisJCQlnb3RvIGRvX3NpZ2J1czsKKwkJQlVHKCk7CisJfQorCS8qUkdEIG1vZGVsZWQgb24gQ3JpcyAqLworCWlmIChmYXVsdCAmIFZNX0ZBVUxUX01BSk9SKQorCQl0c2stPm1hal9mbHQrKzsKKwllbHNlCisJCXRzay0+bWluX2ZsdCsrOworCisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlyZXR1cm47CisKKwkvKgorCSAqIFNvbWV0aGluZyB0cmllZCB0byBhY2Nlc3MgbWVtb3J5IHRoYXQgaXNuJ3QgaW4gb3VyIG1lbW9yeSBtYXAuLgorCSAqIEZpeCBpdCwgYnV0IGNoZWNrIGlmIGl0J3Mga2VybmVsIG9yIHVzZXIgZmlyc3QuLgorCSAqLworCitiYWRfYXJlYToKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCitiYWRfYXJlYV9ub3NlbWFwaG9yZToKKworCS8qIFVzZXIgbW9kZSBhY2Nlc3NlcyBqdXN0IGNhdXNlIGEgU0lHU0VHViAqLworCisJaWYgKHVzZXJfbW9kZShyZWdzKSkgeworCQlpbmZvLnNpX3NpZ25vID0gU0lHU0VHVjsKKwkJaW5mby5zaV9lcnJubyA9IDA7CisJCS8qIGluZm8uc2lfY29kZSBoYXMgYmVlbiBzZXQgYWJvdmUgKi8KKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgKilhZGRyZXNzOworCQlmb3JjZV9zaWdfaW5mbyhTSUdTRUdWLCAmaW5mbywgdHNrKTsKKwkJcmV0dXJuOworCX0KKworbm9fY29udGV4dDoKKworCS8qIEFyZSB3ZSBwcmVwYXJlZCB0byBoYW5kbGUgdGhpcyBrZXJuZWwgZmF1bHQ/CisJICoKKwkgKiAoVGhlIGtlcm5lbCBoYXMgdmFsaWQgZXhjZXB0aW9uLXBvaW50cyBpbiB0aGUgc291cmNlCisJICogIHdoZW4gaXQgYWNlc3NlcyB1c2VyLW1lbW9yeS4gV2hlbiBpdCBmYWlscyBpbiBvbmUKKwkgKiAgb2YgdGhvc2UgcG9pbnRzLCB3ZSBmaW5kIGl0IGluIGEgdGFibGUgYW5kIGRvIGEganVtcAorCSAqICB0byBzb21lIGZpeHVwIGNvZGUgdGhhdCBsb2FkcyBhbiBhcHByb3ByaWF0ZSBlcnJvcgorCSAqICBjb2RlKQorCSAqLworCisJeworCQljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICplbnRyeTsKKworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibC5ub3AgNDIiKTsKKworCQlpZiAoKGVudHJ5ID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+cGMpKSAhPSBOVUxMKSB7CisJCQkvKiBBZGp1c3QgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgaW4gdGhlIHN0YWNrZnJhbWUgKi8KKwkJCXJlZ3MtPnBjID0gZW50cnktPmZpeHVwOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyoKKwkgKiBPb3BzLiBUaGUga2VybmVsIHRyaWVkIHRvIGFjY2VzcyBzb21lIGJhZCBwYWdlLiBXZSdsbCBoYXZlIHRvCisJICogdGVybWluYXRlIHRoaW5ncyB3aXRoIGV4dHJlbWUgcHJlanVkaWNlLgorCSAqLworCisJaWYgKCh1bnNpZ25lZCBsb25nKShhZGRyZXNzKSA8IFBBR0VfU0laRSkKKwkJcHJpbnRrKEtFUk5fQUxFUlQKKwkJICAgICAgICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBhY2Nlc3MiKTsKKwlwcmludGsoIiBhdCB2aXJ0dWFsIGFkZHJlc3MgMHglMDhseFxuIiwgYWRkcmVzcyk7CisKKwlkaWUoIk9vcHMiLCByZWdzLCB3cml0ZV9hY2MpOworCisJZG9fZXhpdChTSUdLSUxMKTsKKworCS8qCisJICogV2UgcmFuIG91dCBvZiBtZW1vcnksIG9yIHNvbWUgb3RoZXIgdGhpbmcgaGFwcGVuZWQgdG8gdXMgdGhhdCBtYWRlCisJICogdXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUgcGFnZSBmYXVsdCBncmFjZWZ1bGx5LgorCSAqLworCitvdXRfb2ZfbWVtb3J5OgorCV9fYXNtX18gX192b2xhdGlsZV9fKCJsLm5vcCA0MiIpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsLm5vcCAxIik7CisKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXByaW50aygiVk06IGtpbGxpbmcgcHJvY2VzcyAlc1xuIiwgdHNrLT5jb21tKTsKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKQorCQlkb19leGl0KFNJR0tJTEwpOworCWdvdG8gbm9fY29udGV4dDsKKworZG9fc2lnYnVzOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwkvKgorCSAqIFNlbmQgYSBzaWdidXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSB3ZXJlIGluIGtlcm5lbAorCSAqIG9yIHVzZXIgbW9kZS4KKwkgKi8KKwlpbmZvLnNpX3NpZ25vID0gU0lHQlVTOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSA9IEJVU19BRFJFUlI7CisJaW5mby5zaV9hZGRyID0gKHZvaWQgKilhZGRyZXNzOworCWZvcmNlX3NpZ19pbmZvKFNJR0JVUywgJmluZm8sIHRzayk7CisKKwkvKiBLZXJuZWwgbW9kZT8gSGFuZGxlIGV4Y2VwdGlvbnMgb3IgZGllICovCisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCWdvdG8gbm9fY29udGV4dDsKKwlyZXR1cm47CisKK3ZtYWxsb2NfZmF1bHQ6CisJeworCQkvKgorCQkgKiBTeW5jaHJvbml6ZSB0aGlzIHRhc2sncyB0b3AgbGV2ZWwgcGFnZS10YWJsZQorCQkgKiB3aXRoIHRoZSAncmVmZXJlbmNlJyBwYWdlIHRhYmxlLgorCQkgKgorCQkgKiBVc2UgY3VycmVudF9wZ2QgaW5zdGVhZCBvZiB0c2stPmFjdGl2ZV9tbS0+cGdkCisJCSAqIHNpbmNlIHRoZSBsYXR0ZXIgbWlnaHQgYmUgdW5hdmFpbGFibGUgaWYgdGhpcworCQkgKiBjb2RlIGlzIGV4ZWN1dGVkIGluIGEgbWlzZm9ydHVuYXRlbHkgcnVuIGlycQorCQkgKiAobGlrZSBpbnNpZGUgc2NoZWR1bGUoKSBiZXR3ZWVuIHN3aXRjaF9tbSBhbmQKKwkJICogIHN3aXRjaF90by4uLikuCisJCSAqLworCisJCWludCBvZmZzZXQgPSBwZ2RfaW5kZXgoYWRkcmVzcyk7CisJCXBnZF90ICpwZ2QsICpwZ2RfazsKKwkJcHVkX3QgKnB1ZCwgKnB1ZF9rOworCQlwbWRfdCAqcG1kLCAqcG1kX2s7CisJCXB0ZV90ICpwdGVfazsKKworLyoKKwkJcGh4X3dhcm4oImRvX3BhZ2VfZmF1bHQoKTogdm1hbGxvY19mYXVsdCB3aWxsIG5vdCB3b3JrLCAiCisJCQkgInNpbmNlIGN1cnJlbnRfcGdkIGFzc2lnbiBhIHByb3BlciB2YWx1ZSBzb21ld2hlcmVcbiIKKwkJCSAiYW55aG93IHdlIGRvbid0IG5lZWQgdGhpcyBhdCB0aGUgbW9tZW50XG4iKTsKKworCQlwaHhfbW11KCJ2bWFsbG9jX2ZhdWx0Iik7CisqLworCQlwZ2QgPSAocGdkX3QgKiljdXJyZW50X3BnZCArIG9mZnNldDsKKwkJcGdkX2sgPSBpbml0X21tLnBnZCArIG9mZnNldDsKKworCQkvKiBTaW5jZSB3ZSdyZSB0d28tbGV2ZWwsIHdlIGRvbid0IG5lZWQgdG8gZG8gYm90aAorCQkgKiBzZXRfcGdkIGFuZCBzZXRfcG1kICh0aGV5IGRvIHRoZSBzYW1lIHRoaW5nKS4gSWYKKwkJICogd2UgZ28gdGhyZWUtbGV2ZWwgYXQgc29tZSBwb2ludCwgZG8gdGhlIHJpZ2h0IHRoaW5nCisJCSAqIHdpdGggcGdkX3ByZXNlbnQgYW5kIHNldF9wZ2QgaGVyZS4KKwkJICoKKwkJICogQWxzbywgc2luY2UgdGhlIHZtYWxsb2MgYXJlYSBpcyBnbG9iYWwsIHdlIGRvbid0CisJCSAqIG5lZWQgdG8gY29weSBpbmRpdmlkdWFsIFBURSdzLCBpdCBpcyBlbm91Z2ggdG8KKwkJICogY29weSB0aGUgcGdkIHBvaW50ZXIgaW50byB0aGUgcHRlIHBhZ2Ugb2YgdGhlCisJCSAqIHJvb3QgdGFzay4gSWYgdGhhdCBpcyB0aGVyZSwgd2UnbGwgZmluZCBvdXIgcHRlIGlmCisJCSAqIGl0IGV4aXN0cy4KKwkJICovCisKKwkJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHJlc3MpOworCQlwdWRfayA9IHB1ZF9vZmZzZXQocGdkX2ssIGFkZHJlc3MpOworCQlpZiAoIXB1ZF9wcmVzZW50KCpwdWRfaykpCisJCQlnb3RvIG5vX2NvbnRleHQ7CisKKwkJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHJlc3MpOworCQlwbWRfayA9IHBtZF9vZmZzZXQocHVkX2ssIGFkZHJlc3MpOworCisJCWlmICghcG1kX3ByZXNlbnQoKnBtZF9rKSkKKwkJCWdvdG8gYmFkX2FyZWFfbm9zZW1hcGhvcmU7CisKKwkJc2V0X3BtZChwbWQsICpwbWRfayk7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBhY3R1YWwgUFRFIGV4aXN0cyBhcyB3ZWxsIHRvCisJCSAqIGNhdGNoIGtlcm5lbCB2bWFsbG9jLWFyZWEgYWNjZXNzZXMgdG8gbm9uLW1hcHBlZAorCQkgKiBhZGRyZXNzZXMuIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoaXMgd2lsbCBqdXN0CisJCSAqIHNpbGVudGx5IGxvb3AgZm9yZXZlci4KKwkJICovCisKKwkJcHRlX2sgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWRfaywgYWRkcmVzcyk7CisJCWlmICghcHRlX3ByZXNlbnQoKnB0ZV9rKSkKKwkJCWdvdG8gbm9fY29udGV4dDsKKworCQlyZXR1cm47CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9tbS9pbml0LmMgYi9hcmNoL29wZW5yaXNjL21tL2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTlkY2IyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9tbS9pbml0LmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBPcGVuUklTQyBpZGxlLmMKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciB0aGUgT3BlblJJU0MgYXJjaGl0ZWN0dXJlOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgkvKiBmb3IgaW5pdHJkXyogKi8KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3RsYi5oPgorI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCitpbnQgbWVtX2luaXRfZG9uZTsKKworREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKKworc3RhdGljIHZvaWQgX19pbml0IHpvbmVfc2l6ZXNfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgem9uZXNfc2l6ZVtNQVhfTlJfWk9ORVNdOworCisJLyogQ2xlYXIgdGhlIHpvbmUgc2l6ZXMgKi8KKwltZW1zZXQoem9uZXNfc2l6ZSwgMCwgc2l6ZW9mKHpvbmVzX3NpemUpKTsKKworCS8qCisJICogV2UgdXNlIG9ubHkgWk9ORV9OT1JNQUwKKwkgKi8KKwl6b25lc19zaXplW1pPTkVfTk9STUFMXSA9IG1heF9sb3dfcGZuOworCisJZnJlZV9hcmVhX2luaXQoem9uZXNfc2l6ZSk7Cit9CisKK2V4dGVybiBjb25zdCBjaGFyIF9zX2tlcm5lbF9yb1tdLCBfZV9rZXJuZWxfcm9bXTsKKworLyoKKyAqIE1hcCBhbGwgcGh5c2ljYWwgbWVtb3J5IGludG8ga2VybmVsJ3MgYWRkcmVzcyBzcGFjZS4KKyAqCisgKiBUaGlzIGlzIGV4cGxpY2l0bHkgY29kZWQgZm9yIHR3by1sZXZlbCBwYWdlIHRhYmxlcywgc28gaWYgeW91IG5lZWQKKyAqIHNvbWV0aGluZyBlbHNlIHRoZW4gdGhpcyBuZWVkcyB0byBjaGFuZ2UuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBtYXBfcmFtKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2LCBwLCBlOworCXBncHJvdF90IHByb3Q7CisJcGdkX3QgKnBnZTsKKwlwdWRfdCAqcHVlOworCXBtZF90ICpwbWU7CisJcHRlX3QgKnB0ZTsKKwkvKiBUaGVzZSBtYXJrIGV4dGVudHMgb2YgcmVhZC1vbmx5IGtlcm5lbCBwYWdlcy4uLgorCSAqIC4uLmZyb20gdm1saW51eC5sZHMuUworCSAqLworCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnJlZ2lvbjsKKworCXYgPSBQQUdFX09GRlNFVDsKKworCWZvcl9lYWNoX21lbWJsb2NrKG1lbW9yeSwgcmVnaW9uKSB7CisJCXAgPSAodTMyKSByZWdpb24tPmJhc2UgJiBQQUdFX01BU0s7CisJCWUgPSBwICsgKHUzMikgcmVnaW9uLT5zaXplOworCisJCXYgPSAodTMyKSBfX3ZhKHApOworCQlwZ2UgPSBwZ2Rfb2Zmc2V0X2sodik7CisKKwkJd2hpbGUgKHAgPCBlKSB7CisJCQlpbnQgajsKKwkJCXB1ZSA9IHB1ZF9vZmZzZXQocGdlLCB2KTsKKwkJCXBtZSA9IHBtZF9vZmZzZXQocHVlLCB2KTsKKworCQkJaWYgKCh1MzIpIHB1ZSAhPSAodTMyKSBwZ2UgfHwgKHUzMikgcG1lICE9ICh1MzIpIHBnZSkgeworCQkJCXBhbmljKCIlczogT1IxSyBrZXJuZWwgaGFyZGNvZGVkIGZvciAiCisJCQkJICAgICAgInR3by1sZXZlbCBwYWdlIHRhYmxlcyIsCisJCQkJICAgICBfX2Z1bmNfXyk7CisJCQl9CisKKwkJCS8qIEFsbG9jIG9uZSBwYWdlIGZvciBob2xkaW5nIFBURSdzLi4uICovCisJCQlwdGUgPSAocHRlX3QgKikgYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoUEFHRV9TSVpFKTsKKwkJCXNldF9wbWQocG1lLCBfX3BtZChfS0VSTlBHX1RBQkxFICsgX19wYShwdGUpKSk7CisKKwkJCS8qIEZpbGwgdGhlIG5ld2x5IGFsbG9jYXRlZCBwYWdlIHdpdGggUFRFJ1MgKi8KKwkJCWZvciAoaiA9IDA7IHAgPCBlICYmIGogPCBQVFJTX1BFUl9QR0Q7CisJCQkgICAgIHYgKz0gUEFHRV9TSVpFLCBwICs9IFBBR0VfU0laRSwgaisrLCBwdGUrKykgeworCQkJCWlmICh2ID49ICh1MzIpIF9lX2tlcm5lbF9ybyB8fAorCQkJCSAgICB2IDwgKHUzMikgX3Nfa2VybmVsX3JvKQorCQkJCQlwcm90ID0gUEFHRV9LRVJORUw7CisJCQkJZWxzZQorCQkJCQlwcm90ID0gUEFHRV9LRVJORUxfUk87CisKKwkJCQlzZXRfcHRlKHB0ZSwgbWtfcHRlX3BoeXMocCwgcHJvdCkpOworCQkJfQorCisJCQlwZ2UrKzsKKwkJfQorCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNZW1vcnk6IDB4JXgtMHgleFxuIiwgX19mdW5jX18sCisJCSAgICAgICByZWdpb24tPmJhc2UsIHJlZ2lvbi0+YmFzZSArIHJlZ2lvbi0+c2l6ZSk7CisJfQorfQorCit2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQoreworCWV4dGVybiB2b2lkIHRsYl9pbml0KHZvaWQpOworCisJdW5zaWduZWQgbG9uZyBlbmQ7CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIHVwIHBhZ2luZyBhbmQgUFRFcy5cbiIpOworCisJLyogY2xlYXIgb3V0IHRoZSBpbml0X21tLnBnZCB0aGF0IHdpbGwgY29udGFpbiB0aGUga2VybmVsJ3MgbWFwcGluZ3MgKi8KKworCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QR0Q7IGkrKykKKwkJc3dhcHBlcl9wZ19kaXJbaV0gPSBfX3BnZCgwKTsKKworCS8qIG1ha2Ugc3VyZSB0aGUgY3VycmVudCBwZ2QgdGFibGUgcG9pbnRzIHRvIHNvbWV0aGluZyBzYW5lCisJICogKGV2ZW4gaWYgaXQgaXMgbW9zdCBwcm9iYWJseSBub3QgdXNlZCB1bnRpbCB0aGUgbmV4dAorCSAqICBzd2l0Y2hfbW0pCisJICovCisJY3VycmVudF9wZ2QgPSBpbml0X21tLnBnZDsKKworCWVuZCA9ICh1bnNpZ25lZCBsb25nKV9fdmEobWF4X2xvd19wZm4gKiBQQUdFX1NJWkUpOworCisJbWFwX3JhbSgpOworCisJem9uZV9zaXplc19pbml0KCk7CisKKwkvKiBzZWxmIG1vZGlmeWluZyBjb2RlIDspICovCisJLyogU2luY2UgdGhlIG9sZCBUTEIgbWlzcyBoYW5kbGVyIGhhcyBiZWVuIHJ1bm5pbmcgdXAgdW50aWwgbm93LAorCSAqIHRoZSBrZXJuZWwgcGFnZXMgYXJlIHN0aWxsIGFsbCBSVywgc28gd2UgY2FuIHN0aWxsIG1vZGlmeSB0aGUKKwkgKiB0ZXh0IGRpcmVjdGx5Li4uIGFmdGVyIHRoaXMgY2hhbmdlIGFuZCBhIFRMQiBmbHVzaCwgdGhlIGtlcm5lbAorCSAqIHBhZ2VzIHdpbGwgYmVjb21lIFJPLgorCSAqLworCXsKKwkJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHRsYl9taXNzX2hhbmRsZXI7CisJCWV4dGVybiB1bnNpZ25lZCBsb25nIGl0bGJfbWlzc19oYW5kbGVyOworCisJCXVuc2lnbmVkIGxvbmcgKmR0bGJfdmVjdG9yID0gX192YSgweDkwMCk7CisJCXVuc2lnbmVkIGxvbmcgKml0bGJfdmVjdG9yID0gX192YSgweGEwMCk7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZHRsYl9taXNzX2hhbmRsZXIgJXBcbiIsICZkdGxiX21pc3NfaGFuZGxlcik7CisJCSpkdGxiX3ZlY3RvciA9ICgodW5zaWduZWQgbG9uZykmZHRsYl9taXNzX2hhbmRsZXIgLQorCQkJCSh1bnNpZ25lZCBsb25nKWR0bGJfdmVjdG9yKSA+PiAyOworCisJCXByaW50ayhLRVJOX0lORk8gIml0bGJfbWlzc19oYW5kbGVyICVwXG4iLCAmaXRsYl9taXNzX2hhbmRsZXIpOworCQkqaXRsYl92ZWN0b3IgPSAoKHVuc2lnbmVkIGxvbmcpJml0bGJfbWlzc19oYW5kbGVyIC0KKwkJCQkodW5zaWduZWQgbG9uZylpdGxiX3ZlY3RvcikgPj4gMjsKKwl9CisKKwkvKiBJbnZhbGlkYXRlIGluc3RydWN0aW9uIGNhY2hlcyBhZnRlciBjb2RlIG1vZGlmaWNhdGlvbiAqLworCW10c3ByKFNQUl9JQ0JJUiwgMHg5MDApOworCW10c3ByKFNQUl9JQ0JJUiwgMHhhMDApOworCisJLyogTmV3IFRMQiBtaXNzIGhhbmRsZXJzIGFuZCBrZXJuZWwgcGFnZSB0YWJsZXMgYXJlIGluIG5vdyBwbGFjZS4KKwkgKiBNYWtlIHN1cmUgdGhhdCBwYWdlIGZsYWdzIGdldCB1cGRhdGVkIGZvciBhbGwgcGFnZXMgaW4gVExCIGJ5CisJICogZmx1c2hpbmcgdGhlIFRMQiBhbmQgZm9yY2luZyBhbGwgVExCIGVudHJpZXMgdG8gYmUgcmVjcmVhdGVkCisJICogZnJvbSB0aGVpciBwYWdlIHRhYmxlIGZsYWdzLgorCSAqLworCWZsdXNoX3RsYl9hbGwoKTsKK30KKworLyogUmVmZXJlbmNlcyB0byBzZWN0aW9uIGJvdW5kYXJpZXMgKi8KKworZXh0ZXJuIGNoYXIgX3N0ZXh0LCBfZXRleHQsIF9lZGF0YSwgX19ic3Nfc3RhcnQsIF9lbmQ7CitleHRlcm4gY2hhciBfX2luaXRfYmVnaW4sIF9faW5pdF9lbmQ7CisKK3N0YXRpYyBpbnQgX19pbml0IGZyZWVfcGFnZXNfaW5pdCh2b2lkKQoreworCWludCByZXNlcnZlZHBhZ2VzLCBwZm47CisKKwkvKiB0aGlzIHdpbGwgcHV0IGFsbCBsb3cgbWVtb3J5IG9udG8gdGhlIGZyZWVsaXN0cyAqLworCXRvdGFscmFtX3BhZ2VzID0gZnJlZV9hbGxfYm9vdG1lbSgpOworCisJcmVzZXJ2ZWRwYWdlcyA9IDA7CisJZm9yIChwZm4gPSAwOyBwZm4gPCBtYXhfbG93X3BmbjsgcGZuKyspIHsKKwkJLyoKKwkJICogT25seSBjb3VudCByZXNlcnZlZCBSQU0gcGFnZXMKKwkJICovCisJCWlmIChQYWdlUmVzZXJ2ZWQobWVtX21hcCArIHBmbikpCisJCQlyZXNlcnZlZHBhZ2VzKys7CisJfQorCisJcmV0dXJuIHJlc2VydmVkcGFnZXM7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfbWF4X21hcG5yX2luaXQodm9pZCkKK3sKKwltYXhfbWFwbnIgPSBudW1fcGh5c3BhZ2VzID0gbWF4X2xvd19wZm47Cit9CisKK3ZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCit7CisJaW50IGNvZGVzaXplLCByZXNlcnZlZHBhZ2VzLCBkYXRhc2l6ZSwgaW5pdHNpemU7CisKKwlpZiAoIW1lbV9tYXApCisJCUJVRygpOworCisJc2V0X21heF9tYXBucl9pbml0KCk7CisKKwloaWdoX21lbW9yeSA9ICh2b2lkICopX192YShtYXhfbG93X3BmbiAqIFBBR0VfU0laRSk7CisKKwkvKiBjbGVhciB0aGUgemVyby1wYWdlICovCisJbWVtc2V0KCh2b2lkICopZW1wdHlfemVyb19wYWdlLCAwLCBQQUdFX1NJWkUpOworCisJcmVzZXJ2ZWRwYWdlcyA9IGZyZWVfcGFnZXNfaW5pdCgpOworCisJY29kZXNpemUgPSAodW5zaWduZWQgbG9uZykmX2V0ZXh0IC0gKHVuc2lnbmVkIGxvbmcpJl9zdGV4dDsKKwlkYXRhc2l6ZSA9ICh1bnNpZ25lZCBsb25nKSZfZWRhdGEgLSAodW5zaWduZWQgbG9uZykmX2V0ZXh0OworCWluaXRzaXplID0gKHVuc2lnbmVkIGxvbmcpJl9faW5pdF9lbmQgLSAodW5zaWduZWQgbG9uZykmX19pbml0X2JlZ2luOworCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiTWVtb3J5OiAlbHVrLyVsdWsgYXZhaWxhYmxlICglZGsga2VybmVsIGNvZGUsICVkayByZXNlcnZlZCwgJWRrIGRhdGEsICVkayBpbml0LCAlbGRrIGhpZ2htZW0pXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylucl9mcmVlX3BhZ2VzKCkgPDwgKFBBR0VfU0hJRlQgLSAxMCksCisJICAgICAgIG1heF9tYXBuciA8PCAoUEFHRV9TSElGVCAtIDEwKSwgY29kZXNpemUgPj4gMTAsCisJICAgICAgIHJlc2VydmVkcGFnZXMgPDwgKFBBR0VfU0hJRlQgLSAxMCksIGRhdGFzaXplID4+IDEwLAorCSAgICAgICBpbml0c2l6ZSA+PiAxMCwgKHVuc2lnbmVkIGxvbmcpKDAgPDwgKFBBR0VfU0hJRlQgLSAxMCkpCisJICAgICk7CisKKwlwcmludGsoIm1lbV9pbml0X2RvbmUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuIik7CisJbWVtX2luaXRfZG9uZSA9IDE7CisJcmV0dXJuOworfQorCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECit2b2lkIGZyZWVfaW5pdHJkX21lbSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsCisJICAgICAgIChlbmQgLSBzdGFydCkgPj4gMTApOworCisJZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSBQQUdFX1NJWkUpIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHN0YXJ0KSk7CisJCWluaXRfcGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2Uoc3RhcnQpKTsKKwkJZnJlZV9wYWdlKHN0YXJ0KTsKKwkJdG90YWxyYW1fcGFnZXMrKzsKKwl9Cit9CisjZW5kaWYKKwordm9pZCBmcmVlX2luaXRtZW0odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpKCZfX2luaXRfYmVnaW4pOworCWZvciAoOyBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpKCZfX2luaXRfZW5kKTsgYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGFkZHIpKTsKKwkJaW5pdF9wYWdlX2NvdW50KHZpcnRfdG9fcGFnZShhZGRyKSk7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJdG90YWxyYW1fcGFnZXMrKzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWx1ayBmcmVlZFxuIiwKKwkgICAgICAgKCh1bnNpZ25lZCBsb25nKSZfX2luaXRfZW5kIC0KKwkJKHVuc2lnbmVkIGxvbmcpJl9faW5pdF9iZWdpbikgPj4gMTApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9tbS9pb3JlbWFwLmMgYi9hcmNoL29wZW5yaXNjL21tL2lvcmVtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmIwOGVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9vcGVucmlzYy9tbS9pb3JlbWFwLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBPcGVuUklTQyBpb3JlbWFwLmMKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciB0aGUgT3BlblJJU0MgYXJjaGl0ZWN0dXJlOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKb25hcyBCb25uIDxqb25hc0Bzb3V0aHBvbGUuc2U+CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS9idWcuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKK2V4dGVybiBpbnQgbWVtX2luaXRfZG9uZTsKKworc3RhdGljIHVuc2lnbmVkIGludCBmaXhtYXBzX3VzZWQgX19pbml0ZGF0YTsKKworLyoKKyAqIFJlbWFwIGFuIGFyYml0cmFyeSBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIGludG8gdGhlIGtlcm5lbCB2aXJ0dWFsCisgKiBhZGRyZXNzIHNwYWNlLiBOZWVkZWQgd2hlbiB0aGUga2VybmVsIHdhbnRzIHRvIGFjY2VzcyBoaWdoIGFkZHJlc3NlcworICogZGlyZWN0bHkuCisgKgorICogTk9URSEgV2UgbmVlZCB0byBhbGxvdyBub24tcGFnZS1hbGlnbmVkIG1hcHBpbmdzIHRvbzogd2Ugd2lsbCBvYnZpb3VzbHkKKyAqIGhhdmUgdG8gY29udmVydCB0aGVtIGludG8gYW4gb2Zmc2V0IGluIGEgcGFnZS1hbGlnbmVkIG1hcHBpbmcsIGJ1dCB0aGUKKyAqIGNhbGxlciBzaG91bGRuJ3QgbmVlZCB0byBrbm93IHRoYXQgc21hbGwgZGV0YWlsLgorICovCit2b2lkIF9faW9tZW0gKl9faW5pdF9yZWZvaworX19pb3JlbWFwKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3QgcHJvdCkKK3sKKwlwaHlzX2FkZHJfdCBwOworCXVuc2lnbmVkIGxvbmcgdjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgbGFzdF9hZGRyOworCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEgPSBOVUxMOworCisJLyogRG9uJ3QgYWxsb3cgd3JhcGFyb3VuZCBvciB6ZXJvIHNpemUgKi8KKwlsYXN0X2FkZHIgPSBhZGRyICsgc2l6ZSAtIDE7CisJaWYgKCFzaXplIHx8IGxhc3RfYWRkciA8IGFkZHIpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBNYXBwaW5ncyBoYXZlIHRvIGJlIHBhZ2UtYWxpZ25lZAorCSAqLworCW9mZnNldCA9IGFkZHIgJiB+UEFHRV9NQVNLOworCXAgPSBhZGRyICYgUEFHRV9NQVNLOworCXNpemUgPSBQQUdFX0FMSUdOKGxhc3RfYWRkciArIDEpIC0gcDsKKworCWlmIChsaWtlbHkobWVtX2luaXRfZG9uZSkpIHsKKwkJYXJlYSA9IGdldF92bV9hcmVhKHNpemUsIFZNX0lPUkVNQVApOworCQlpZiAoIWFyZWEpCisJCQlyZXR1cm4gTlVMTDsKKwkJdiA9ICh1bnNpZ25lZCBsb25nKWFyZWEtPmFkZHI7CisJfSBlbHNlIHsKKwkJaWYgKChmaXhtYXBzX3VzZWQgKyAoc2l6ZSA+PiBQQUdFX1NISUZUKSkgPiBGSVhfTl9JT1JFTUFQUykKKwkJCXJldHVybiBOVUxMOworCQl2ID0gZml4X3RvX3ZpcnQoRklYX0lPUkVNQVBfQkVHSU4gKyBmaXhtYXBzX3VzZWQpOworCQlmaXhtYXBzX3VzZWQgKz0gKHNpemUgPj4gUEFHRV9TSElGVCk7CisJfQorCisJaWYgKGlvcmVtYXBfcGFnZV9yYW5nZSh2LCB2ICsgc2l6ZSwgcCwgcHJvdCkpIHsKKwkJaWYgKGxpa2VseShtZW1faW5pdF9kb25lKSkKKwkJCXZmcmVlKGFyZWEtPmFkZHIpOworCQllbHNlCisJCQlmaXhtYXBzX3VzZWQgLT0gKHNpemUgPj4gUEFHRV9TSElGVCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAodm9pZCBfX2lvbWVtICopKG9mZnNldCArIChjaGFyICopdik7Cit9CisKK3ZvaWQgaW91bm1hcCh2b2lkICphZGRyKQoreworCS8qIElmIHRoZSBwYWdlIGlzIGZyb20gdGhlIGZpeG1hcCBwb29sIHRoZW4gd2UganVzdCBjbGVhciBvdXQKKwkgKiB0aGUgZml4bWFwIG1hcHBpbmcuCisJICovCisJaWYgKHVubGlrZWx5KCh1bnNpZ25lZCBsb25nKWFkZHIgPiBGSVhBRERSX1NUQVJUKSkgeworCQkvKiBUaGlzIGlzIGEgYml0IGJyb2tlbi4uLiB3ZSBkb24ndCByZWFsbHkga25vdworCQkgKiBob3cgYmlnIHRoZSBhcmVhIGlzIHNvIGl0J3MgZGlmZmljdWx0IHRvIGtub3cKKwkJICogaG93IG1hbnkgZml4ZWQgcGFnZXMgdG8gaW52YWxpZGF0ZS4uLgorCQkgKiBqdXN0IGZsdXNoIHRsYiBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuLi4KKwkJICogY29uc2lkZXIgdGhpcyBhIEZJWE1FCisJCSAqCisJCSAqIFJlYWxseSB3ZSBzaG91bGQgYmUgY2xlYXJpbmcgb3V0IG9uZSBvciBtb3JlIHBhZ2UKKwkJICogdGFibGUgZW50cmllcyBmb3IgdGhlc2UgdmlydHVhbCBhZGRyZXNzZXMgc28gdGhhdAorCQkgKiBmdXR1cmUgcmVmZXJlbmNlcyBjYXVzZSBhIHBhZ2UgZmF1bHQuLi4gZm9yIG5vdywgd2UKKwkJICogcmVseSBvbiB0d28gdGhpbmdzOgorCQkgKiAgIGkpICB0aGlzIGNvZGUgbmV2ZXIgZ2V0cyBjYWxsZWQgb24ga25vd24gYm9hcmRzCisJCSAqICAgaWkpIGludmFsaWQgYWNjZXNzZXMgdG8gdGhlIGZyZWVkIGFyZWFzIGFyZW4ndCBtYWRlCisJCSAqLworCQlmbHVzaF90bGJfYWxsKCk7CisJCXJldHVybjsKKwl9CisKKwlyZXR1cm4gdmZyZWUoKHZvaWQgKikoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcpYWRkcikpOworfQorCisvKioKKyAqIE9LLCB0aGlzIG9uZSdzIGEgYml0IHRyaWNreS4uLiBpb3JlbWFwIGNhbiBnZXQgY2FsbGVkIGJlZm9yZSBtZW1vcnkgaXMKKyAqIGluaXRpYWxpemVkIChlYXJseSBzZXJpYWwgY29uc29sZSBkb2VzIHRoaXMpIGFuZCB3aWxsIHdhbnQgdG8gYWxsb2MgYSBwYWdlCisgKiBmb3IgaXRzIG1hcHBpbmcuICBObyB1c2Vyc3BhY2UgcGFnZXMgd2lsbCBldmVyIGdldCBhbGxvY2F0ZWQgYmVmb3JlIG1lbW9yeQorICogaXMgaW5pdGlhbGl6ZWQgc28gdGhpcyBhcHBsaWVzIG9ubHkgdG8ga2VybmVsIHBhZ2VzLiAgSW4gdGhlIGV2ZW50IHRoYXQKKyAqIHRoaXMgaXMgY2FsbGVkIGJlZm9yZSBtZW1vcnkgaXMgaW5pdGlhbGl6ZWQgd2UgYWxsb2NhdGUgdGhlIHBhZ2UgdXNpbmcKKyAqIHRoZSBtZW1ibG9jayBpbmZyYXN0cnVjdHVyZS4KKyAqLworCitwdGVfdCBfX2luaXRfcmVmb2sgKnB0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXB0ZV90ICpwdGU7CisKKwlpZiAobGlrZWx5KG1lbV9pbml0X2RvbmUpKSB7CisJCXB0ZSA9IChwdGVfdCAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX1JFUEVBVCk7CisJfSBlbHNlIHsKKwkJcHRlID0gKHB0ZV90ICopIGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKFBBR0VfU0laRSk7CisjaWYgMAorCQkvKiBGSVhNRTogdXNlIG1lbWJsb2NrLi4uICovCisJCXB0ZSA9IChwdGVfdCAqKSBfX3ZhKG1lbWJsb2NrX2FsbG9jKFBBR0VfU0laRSwgUEFHRV9TSVpFKSk7CisjZW5kaWYKKwl9CisKKwlpZiAocHRlKQorCQljbGVhcl9wYWdlKHB0ZSk7CisJcmV0dXJuIHB0ZTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvbW0vdGxiLmMgYi9hcmNoL29wZW5yaXNjL21tL3RsYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjBiODkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL29wZW5yaXNjL21tL3RsYi5jCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogT3BlblJJU0MgdGxiLmMKKyAqCisgKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKKyAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCisgKiBkZWNsYXJhdGlvbi4KKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciB0aGUgT3BlblJJU0MgYXJjaGl0ZWN0dXJlOgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1hdGpheiBCcmVza3ZhciA8cGhvZW5peEBic2VtaS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBKdWxpdXMgQmF4dGVyIDxqdWxpdXMuYmF4dGVyQG9yc29jLnNlPgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vc3ByX2RlZnMuaD4KKworI2RlZmluZSBOT19DT05URVhUIC0xCisKKyNkZWZpbmUgTlVNX0RUTEJfU0VUUyAoMSA8PCAoKG1mc3ByKFNQUl9JTU1VQ0ZHUikgJiBTUFJfSU1NVUNGR1JfTlRTKSA+PiBcCisJCQkgICAgU1BSX0RNTVVDRkdSX05UU19PRkYpKQorI2RlZmluZSBOVU1fSVRMQl9TRVRTICgxIDw8ICgobWZzcHIoU1BSX0lNTVVDRkdSKSAmIFNQUl9JTU1VQ0ZHUl9OVFMpID4+IFwKKwkJCSAgICBTUFJfSU1NVUNGR1JfTlRTX09GRikpCisjZGVmaW5lIERUTEJfT0ZGU0VUKGFkZHIpICgoKGFkZHIpID4+IFBBR0VfU0hJRlQpICYgKE5VTV9EVExCX1NFVFMtMSkpCisjZGVmaW5lIElUTEJfT0ZGU0VUKGFkZHIpICgoKGFkZHIpID4+IFBBR0VfU0hJRlQpICYgKE5VTV9JVExCX1NFVFMtMSkpCisvKgorICogSW52YWxpZGF0ZSBhbGwgVExCIGVudHJpZXMuCisgKgorICogVGhpcyBjb21lcyBkb3duIHRvIHNldHRpbmcgdGhlICd2YWxpZCcgYml0IGZvciBhbGwgeFRMQk1SIHJlZ2lzdGVycyB0byAwLgorICogRWFzaWVzdCB3YXkgdG8gYWNjb21wbGlzaCB0aGlzIGlzIHRvIGp1c3QgemVybyBvdXQgdGhlIHhUTEJNUiByZWdpc3RlcgorICogY29tcGxldGVseS4KKyAqCisgKi8KKwordm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBudW1fdGxiX3NldHM7CisKKwkvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIHNldHMgZm9yIElNTVUuICovCisJLyogRklYTUU6IEFzc3VtcHRpb24gaXMgSSAmIEQgbnNldHMgZXF1YWwuICovCisJbnVtX3RsYl9zZXRzID0gTlVNX0lUTEJfU0VUUzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fdGxiX3NldHM7IGkrKykgeworCQltdHNwcl9vZmYoU1BSX0RUTEJNUl9CQVNFKDApLCBpLCAwKTsKKwkJbXRzcHJfb2ZmKFNQUl9JVExCTVJfQkFTRSgwKSwgaSwgMCk7CisJfQorfQorCisjZGVmaW5lIGhhdmVfZHRsYmVpciAobWZzcHIoU1BSX0RNTVVDRkdSKSAmIFNQUl9ETU1VQ0ZHUl9URUlSSSkKKyNkZWZpbmUgaGF2ZV9pdGxiZWlyIChtZnNwcihTUFJfSU1NVUNGR1IpICYgU1BSX0lNTVVDRkdSX1RFSVJJKQorCisvKgorICogSW52YWxpZGF0ZSBhIHNpbmdsZSBwYWdlLiAgVGhpcyBpcyB3aGF0IHRoZSB4VExCRUlSIHJlZ2lzdGVyIGlzIGZvci4KKyAqCisgKiBUaGVyZSdzIG5vIHBvaW50IGluIGNoZWNraW5nIHRoZSB2bWEgZm9yIFBBR0VfRVhFQyB0byBkZXRlcm1pbmUgd2hldGhlciBpdCdzCisgKiB0aGUgZGF0YSBvciBpbnN0cnVjdGlvbiBUTEIgdGhhdCBzaG91bGQgYmUgZmx1c2hlZC4uLiB0aGF0IHdvdWxkIHRha2UgbW9yZQorICogdGhhbiB0aGUgZmV3IGluc3RydWN0aW9ucyB0aGF0IHRoZSBmb2xsb3dpbmcgY29tcGlsZXMgZG93biB0byEKKyAqCisgKiBUaGUgY2FzZSB3aGVyZSB3ZSBkb24ndCBoYXZlIHRoZSB4VExCRUlSIHJlZ2lzdGVyIHJlYWxseSBvbmx5IHdvcmtzIGZvcgorICogTU1VJ3Mgd2l0aCBhIHNpbmdsZSB3YXkgYW5kIGlzIGhhcmQtY29kZWQgdGhhdCB3YXkuCisgKi8KKworI2RlZmluZSBmbHVzaF9kdGxiX3BhZ2VfZWlyKGFkZHIpIG10c3ByKFNQUl9EVExCRUlSLCBhZGRyKQorI2RlZmluZSBmbHVzaF9kdGxiX3BhZ2Vfbm9fZWlyKGFkZHIpIFwKKwltdHNwcl9vZmYoU1BSX0RUTEJNUl9CQVNFKDApLCBEVExCX09GRlNFVChhZGRyKSwgMCk7CisKKyNkZWZpbmUgZmx1c2hfaXRsYl9wYWdlX2VpcihhZGRyKSBtdHNwcihTUFJfSVRMQkVJUiwgYWRkcikKKyNkZWZpbmUgZmx1c2hfaXRsYl9wYWdlX25vX2VpcihhZGRyKSBcCisJbXRzcHJfb2ZmKFNQUl9JVExCTVJfQkFTRSgwKSwgSVRMQl9PRkZTRVQoYWRkciksIDApOworCit2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaWYgKGhhdmVfZHRsYmVpcikKKwkJZmx1c2hfZHRsYl9wYWdlX2VpcihhZGRyKTsKKwllbHNlCisJCWZsdXNoX2R0bGJfcGFnZV9ub19laXIoYWRkcik7CisKKwlpZiAoaGF2ZV9pdGxiZWlyKQorCQlmbHVzaF9pdGxiX3BhZ2VfZWlyKGFkZHIpOworCWVsc2UKKwkJZmx1c2hfaXRsYl9wYWdlX25vX2VpcihhZGRyKTsKK30KKwordm9pZCBmbHVzaF90bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJaW50IGFkZHI7CisJYm9vbCBkdGxiZWlyOworCWJvb2wgaXRsYmVpcjsKKworCWR0bGJlaXIgPSBoYXZlX2R0bGJlaXI7CisJaXRsYmVpciA9IGhhdmVfaXRsYmVpcjsKKworCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IFBBR0VfU0laRSkgeworCQlpZiAoZHRsYmVpcikKKwkJCWZsdXNoX2R0bGJfcGFnZV9laXIoYWRkcik7CisJCWVsc2UKKwkJCWZsdXNoX2R0bGJfcGFnZV9ub19laXIoYWRkcik7CisKKwkJaWYgKGl0bGJlaXIpCisJCQlmbHVzaF9pdGxiX3BhZ2VfZWlyKGFkZHIpOworCQllbHNlCisJCQlmbHVzaF9pdGxiX3BhZ2Vfbm9fZWlyKGFkZHIpOworCX0KK30KKworLyoKKyAqIEludmFsaWRhdGUgdGhlIHNlbGVjdGVkIG1tIGNvbnRleHQgb25seS4KKyAqCisgKiBGSVhNRTogRHVlIHRvIHNvbWUgYnVnIGhlcmUsIHdlJ3JlIGZsdXNoaW5nIGV2ZXJ5dGhpbmcgZm9yIG5vdy4KKyAqIFRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gbG9vcCBvdmVyIG92ZXIgbW0gYW5kIGNhbGwgZmx1c2hfdGxiX3JhbmdlLgorICovCisKK3ZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCisJLyogV2FzIHNlZWluZyBidWdzIHdpdGggdGhlIG1tIHN0cnVjdCBwYXNzZWQgdG8gdXMuIFNjcmFwcGVkIG1vc3Qgb2YKKwkgICB0aGlzIGZ1bmN0aW9uLiAqLworCS8qIFNldmVyYWwgYXJjaGl0Y3R1cmVzIGRvIHRoaXMgKi8KKwlmbHVzaF90bGJfYWxsKCk7Cit9CisKKy8qIGNhbGxlZCBpbiBzY2hlZHVsZSgpIGp1c3QgYmVmb3JlIGFjdHVhbGx5IGRvaW5nIHRoZSBzd2l0Y2hfdG8gKi8KKwordm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKKwkgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3RzaykKK3sKKwkvKiByZW1lbWJlciB0aGUgcGdkIGZvciB0aGUgZmF1bHQgaGFuZGxlcnMKKwkgKiB0aGlzIGlzIHNpbWlsYXIgdG8gdGhlIHBnZCByZWdpc3RlciBpbiBzb21lIG90aGVyIENQVSdzLgorCSAqIHdlIG5lZWQgb3VyIG93biBjb3B5IG9mIGl0IGJlY2F1c2UgY3VycmVudCBhbmQgYWN0aXZlX21tCisJICogbWlnaHQgYmUgaW52YWxpZCBhdCBwb2ludHMgd2hlcmUgd2Ugc3RpbGwgbmVlZCB0byBkZXJlZmVyCisJICogdGhlIHBnZC4KKwkgKi8KKwljdXJyZW50X3BnZCA9IG5leHQtPnBnZDsKKworCS8qIFdlIGRvbid0IGhhdmUgY29udGV4dCBzdXBwb3J0IGltcGxlbWVudGVkLCBzbyBmbHVzaCBhbGwKKwkgKiBlbnRyaWVzIGJlbG9uZ2luZyB0byBwcmV2aW91cyBtYXAKKwkgKi8KKworCWlmIChwcmV2ICE9IG5leHQpCisJCWZsdXNoX3RsYl9tbShwcmV2KTsKKworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCByZWxhdGVkIGluZm8gZm9yIGEgbmV3IG1tX3N0cnVjdAorICogaW5zdGFuY2UuCisgKi8KKworaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCW1tLT5jb250ZXh0ID0gTk9fQ09OVEVYVDsKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGVkIGJ5IF9fZXhpdF9tbSB0byBkZXN0cm95IHRoZSB1c2VkIE1NVSBjb250ZXh0IGlmIGFueSBiZWZvcmUKKyAqIGRlc3Ryb3lpbmcgdGhlIG1tIGl0c2VsZi4gdGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBsYXN0IHVzZXIgb2YgdGhlIG1tCisgKiBkcm9wcyBpdC4KKyAqLworCit2b2lkIGRlc3Ryb3lfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlmbHVzaF90bGJfbW0obW0pOworCit9CisKKy8qIGNhbGxlZCBvbmNlIGR1cmluZyBWTSBpbml0aWFsaXphdGlvbiwgZnJvbSBpbml0LmMgKi8KKwordm9pZCBfX2luaXQgdGxiX2luaXQodm9pZCkKK3sKKwkvKiBEbyBub3RoaW5nLi4uICovCisJLyogaW52YWxpZGF0ZSB0aGUgZW50aXJlIFRMQiAqLworCS8qIGZsdXNoX3RsYl9hbGwoKTsgKi8KK30KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCmluZGV4IDRlZjczYjAuLjg5MDUzMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApAQCAtMjEwLDcgKzIxMCw3IEBACiAJcmV0dXJuIGRldi0+cGxhdGZvcm1fZGF0YTsKIH0KIAkJCi0jZGVmaW5lIEdFVF9JT0MoZGV2KSAoSEJBX0RBVEEocGFyaXNjX3dhbGtfdHJlZShkZXYpKS0+aW9tbXUpOwkKKyNkZWZpbmUgR0VUX0lPQyhkZXYpIChIQkFfREFUQShwYXJpc2Nfd2Fsa190cmVlKGRldikpLT5pb21tdSkKIAkKIAogI2lmZGVmIENPTkZJR19JT01NVV9DQ0lPCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9tbXpvbmUuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL21tem9uZS5oCmluZGV4IDk2MDhkMmMuLmU2N2ViOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL21tem9uZS5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL21tem9uZS5oCkBAIC0xNCwxMyArMTQsNiBAQAogCiAjZGVmaW5lIE5PREVfREFUQShuaWQpICAgICAgICAgICgmbm9kZV9kYXRhW25pZF0ucGdfZGF0YSkKIAotI2RlZmluZSBub2RlX3N0YXJ0X3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCi0jZGVmaW5lIG5vZGVfZW5kX3BmbihuaWQpCQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JcGdfZGF0YV90ICpfX3BnZGF0ID0gTk9ERV9EQVRBKG5pZCk7CQkJCVwKLQlfX3BnZGF0LT5ub2RlX3N0YXJ0X3BmbiArIF9fcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsJCVwKLX0pCi0KIC8qIFdlIGhhdmUgdGhlc2UgcG9zc2libGUgbWVtb3J5IG1hcCBsYXlvdXRzOgogICogQXN0cm86IDAtMy43NSwgNjcuNzUtNjgsIDQtNjQKICAqIHp4MTogMC0xLCAyNTctMjYwLCA0LTI1NgpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL21vZHVsZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL21vZHVsZS5jCmluZGV4IGNlZGJiYjguLjVlMzRjY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvbW9kdWxlLmMKQEAgLTU0MCwxOCArNTQwLDYgQEAKIAlyZXR1cm4gKEVsZl9BZGRyKXN0dWI7CiB9CiAKLWludCBhcHBseV9yZWxvY2F0ZShFbGZfU2hkciAqc2VjaGRycywKLQkJICAgY29uc3QgY2hhciAqc3RydGFiLAotCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCi0JCSAgIHVuc2lnbmVkIGludCByZWxzZWMsCi0JCSAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotCS8qIHBhcmlzYyBzaG91bGQgbm90IG5lZWQgdGhpcyAuLi4gKi8KLQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwKLQkgICAgICAgbWUtPm5hbWUpOwotCXJldHVybiAtRU5PRVhFQzsKLX0KLQogI2lmbmRlZiBDT05GSUdfNjRCSVQKIGludCBhcHBseV9yZWxvY2F0ZV9hZGQoRWxmX1NoZHIgKnNlY2hkcnMsCiAJCSAgICAgICBjb25zdCBjaGFyICpzdHJ0YWIsCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9tYXRoLWVtdS9kZWNvZGVfZXhjLmMgYi9hcmNoL3BhcmlzYy9tYXRoLWVtdS9kZWNvZGVfZXhjLmMKaW5kZXggMjdhNzQ5Mi4uMDRlNTUwZSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvbWF0aC1lbXUvZGVjb2RlX2V4Yy5jCisrKyBiL2FyY2gvcGFyaXNjL21hdGgtZW11L2RlY29kZV9leGMuYwpAQCAtNTYsNyArNTYsNyBAQAogLyogR2VuZXJhbCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBET0VTVFJBUCAxCiAjZGVmaW5lIE5PVFJBUCAwCi0jZGVmaW5lIFNJR05BTENPREUoc2lnbmFsLCBjb2RlKSAoKHNpZ25hbCkgPDwgMjQgfCAoY29kZSkpOworI2RlZmluZSBTSUdOQUxDT0RFKHNpZ25hbCwgY29kZSkgKChzaWduYWwpIDw8IDI0IHwgKGNvZGUpKQogI2RlZmluZSBjb3Byb3BiaXQJMTw8MzEtMgkvKiBiaXQgcG9zaXRpb24gMiAqLwogI2RlZmluZSBvcGNsYXNzCQk5CS8qIGJpdHMgMjEgJiAyMiAqLwogI2RlZmluZSBmbXQJCTExCS8qIGJpdHMgMTkgJiAyMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwppbmRleCAyNzI5YzY2Li4zNzRjNDc1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwpAQCAtMTM0LDYgKzEzNCw4IEBACiAJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1dfTEVWRUwKIAlzZWxlY3QgSEFWRV9SQ1VfVEFCTEVfRlJFRSBpZiBTTVAKIAlzZWxlY3QgSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTCisJc2VsZWN0IEhBVkVfQlBGX0pJVCBpZiAoUFBDNjQgJiYgTkVUKQorCXNlbGVjdCBIQVZFX0FSQ0hfSlVNUF9MQUJFTAogCiBjb25maWcgRUFSTFlfUFJJTlRLCiAJYm9vbApAQCAtODQxLDcgKzg0Myw3IEBACiAKIGNvbmZpZyBSRUxPQ0FUQUJMRQogCWJvb2wgIkJ1aWxkIGEgcmVsb2NhdGFibGUga2VybmVsIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIEFEVkFOQ0VEX09QVElPTlMgJiYgRkxBVE1FTSAmJiBGU0xfQk9PS0UKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBBRFZBTkNFRF9PUFRJT05TICYmIEZMQVRNRU0gJiYgKEZTTF9CT09LRSB8fCBQUENfNDd4KQogCWhlbHAKIAkgIFRoaXMgYnVpbGRzIGEga2VybmVsIGltYWdlIHRoYXQgaXMgY2FwYWJsZSBvZiBydW5uaW5nIGF0IHRoZQogCSAgbG9jYXRpb24gdGhlIGtlcm5lbCBpcyBsb2FkZWQgYXQgKHNvbWUgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBtYXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKaW5kZXggZTcyZGNmNi4uMDY3Y2I4NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKQEAgLTE2Nyw2ICsxNjcsMTMgQEAKIAkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcgZm9yIGEgbWFjaGluZSB3aXRoIGEgSFZDCiAJICBjb25zb2xlIG9uIHZ0ZXJtIDAuCiAKK2NvbmZpZyBQUENfRUFSTFlfREVCVUdfTFBBUl9IVlNJCisJYm9vbCAiTFBBUiBIVlNJIENvbnNvbGUiCisJZGVwZW5kcyBvbiBQUENfUFNFUklFUworCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcgZm9yIGEgbWFjaGluZSB3aXRoIGEgSFZTSQorCSAgY29uc29sZSBvbiBhIHNwZWNpZmllZCB2dGVybS4KKwogY29uZmlnIFBQQ19FQVJMWV9ERUJVR19HNQogCWJvb2wgIkFwcGxlIEc1IgogCWRlcGVuZHMgb24gUFBDX1BNQUM2NApAQCAtMjUzLDYgKzI2MCwxNCBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIFBQQ19FQVJMWV9ERUJVR19IVlNJX1ZURVJNTk8KKwloZXggInZ0ZXJtIG51bWJlciB0byB1c2Ugd2l0aCBlYXJseSBkZWJ1ZyBIVlNJIgorCWRlcGVuZHMgb24gUFBDX0VBUkxZX0RFQlVHX0xQQVJfSFZTSQorCWRlZmF1bHQgIjB4MzAwMDAwMDAiCisJaGVscAorCSAgWW91IHByb2JhYmx5IHdhbnQgMHgzMDAwMDAwMCBmb3IgeW91ciBmaXJzdCBzZXJpYWwgcG9ydCBhbmQKKwkgIDB4MzAwMDAwMDEgZm9yIHlvdXIgc2Vjb25kIG9uZQorCiBjb25maWcgUFBDX0VBUkxZX0RFQlVHXzQ0eF9QSFlTTE9XCiAJaGV4ICJMb3cgMzIgYml0cyBvZiBlYXJseSBkZWJ1ZyBVQVJUIHBoeXNpY2FsIGFkZHJlc3MiCiAJZGVwZW5kcyBvbiBQUENfRUFSTFlfREVCVUdfNDR4CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggYjcyMTJiNi4uNTdhZjE2ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQpAQCAtNjcsNyArNjcsNyBAQAogTERGTEFHU192bWxpbnV4LSQoQ09ORklHX1BQQzY0KSQoQ09ORklHX1JFTE9DQVRBQkxFKSA6PSAtcGllCiBMREZMQUdTX3ZtbGludXgJOj0gJChMREZMQUdTX3ZtbGludXgteXkpCiAKLUNGTEFHUy0kKENPTkZJR19QUEM2NCkJOj0gLW1taW5pbWFsLXRvYyAtbXRyYWNlYmFjaz1ub25lICAtbWNhbGwtYWl4ZGVzYworQ0ZMQUdTLSQoQ09ORklHX1BQQzY0KQk6PSAtbW1pbmltYWwtdG9jIC1tdHJhY2ViYWNrPW5vIC1tY2FsbC1haXhkZXNjCiBDRkxBR1MtJChDT05GSUdfUFBDMzIpCTo9IC1mZml4ZWQtcjIgLW1tdWx0aXBsZQogS0JVSUxEX0NQUEZMQUdTCSs9IC1JYXJjaC8kKEFSQ0gpCiBLQlVJTERfQUZMQUdTCSs9IC1JYXJjaC8kKEFSQ0gpCkBAIC0xNTQsNyArMTU0LDggQEAKIAkJCQkgICBhcmNoL3Bvd2VycGMvbGliLyBcCiAJCQkJICAgYXJjaC9wb3dlcnBjL3N5c2Rldi8gXAogCQkJCSAgIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvIFwKLQkJCQkgICBhcmNoL3Bvd2VycGMvbWF0aC1lbXUvCisJCQkJICAgYXJjaC9wb3dlcnBjL21hdGgtZW11LyBcCisJCQkJICAgYXJjaC9wb3dlcnBjL25ldC8KIGNvcmUtJChDT05GSUdfWE1PTikJCSs9IGFyY2gvcG93ZXJwYy94bW9uLwogY29yZS0kKENPTkZJR19LVk0pIAkJKz0gYXJjaC9wb3dlcnBjL2t2bS8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvLmdpdGlnbm9yZSBiL2FyY2gvcG93ZXJwYy9ib290Ly5naXRpZ25vcmUKaW5kZXggM2Q4MGMzZS4uMTJkYTc3ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvLmdpdGlnbm9yZQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC8uZ2l0aWdub3JlCkBAIC0xLDUgKzEsNCBAQAogYWRkbm90ZQotZHRjCiBlbXB0eS5jCiBoYWNrLWNvZmYKIGluZmJsb2NrLmMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvLmdpdGlnbm9yZSBiL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjM2Y5NC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWR0Yy1sZXhlci5sZXguYwotZHRjLXBhcnNlci50YWIuYwotZHRjLXBhcnNlci50YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NhbnlvbmxhbmRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jYW55b25sYW5kcy5kdHMKaW5kZXggMjJkZDZhZS4uM2RjNzVkZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NhbnlvbmxhbmRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY2FueW9ubGFuZHMuZHRzCkBAIC0xNDMsNiArMTQzLDExIEBACiAJCQlpbnRlcnJ1cHRzID0gPDB4MWQgMHg0PjsKIAkJfTsKIAorCQlIV1JORzogaHdybmdAMTEwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYW1jYyxwcGM0NjBleC1ybmciLCAicHBjNHh4LXJuZyI7CisJCQlyZWcgPSA8NCAweDAwMTEwMDAwIDB4NTA+OworCQl9OworCiAJCU1BTDA6IG1jbWFsIHsKIAkJCWNvbXBhdGlibGUgPSAiaWJtLG1jbWFsLTQ2MGV4IiwgImlibSxtY21hbDIiOwogCQkJZGNyLXJlZyA9IDwweDE4MCAweDA2Mj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2xhY2llci5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2xhY2llci5kdHMKaW5kZXggZTYxOGZjNC4uMjAwMDA2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dsYWNpZXIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nbGFjaWVyLmR0cwpAQCAtMTMwLDEyICsxMzAsMTggQEAKIAkJfTsKIAogCQlDUllQVE86IGNyeXB0b0AxODAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbWNjLHBwYzQ2MGd0LWNyeXB0byIsICJhbWNjLHBwYzR4eC1jcnlwdG8iOworCQkJY29tcGF0aWJsZSA9ICJhbWNjLHBwYzQ2MGd0LWNyeXB0byIsICJhbWNjLHBwYzQ2MGV4LWNyeXB0byIsCisJCQkJImFtY2MscHBjNHh4LWNyeXB0byI7CiAJCQlyZWcgPSA8NCAweDAwMTgwMDAwIDB4ODA0MDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmVUlDMD47CiAJCQlpbnRlcnJ1cHRzID0gPDB4MWQgMHg0PjsKIAkJfTsKIAorCQlIV1JORzogaHdybmdAMTEwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYW1jYyxwcGM0NjBleC1ybmciLCAicHBjNHh4LXJuZyI7CisJCQlyZWcgPSA8NCAweDAwMTEwMDAwIDB4NTA+OworCQl9OworCiAJCU1BTDA6IG1jbWFsIHsKIAkJCWNvbXBhdGlibGUgPSAiaWJtLG1jbWFsLTQ2MGd0IiwgImlibSxtY21hbDIiOwogCQkJZGNyLXJlZyA9IDwweDE4MCAweDA2Mj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKaW5kZXggMzBjZjBlMC4uNjQ3ZGFmOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cwpAQCAtNjAsNiArNjAsOCBAQAogCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY4LWxvY2FsYnVzIiwgImZzbCxwcTMtbG9jYWxidXMiLAogCQkJICAgICAic2ltcGxlLWJ1cyI7CiAJCXJlZyA9IDwweGUwMDA1MDAwIDB4MTAwMD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwogCiAJCXJhbmdlcyA9IDwweDAgMHgwIDB4ZmUwMDAwMDAgMHgwMjAwMDAwMAogCQkJICAweDEgMHgwIDB4ZjgwMDAwMDAgMHgwMDAwODAwMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDEwcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAxMHJkYi5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzM2I3MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAxMHJkYi5kdHMKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBQMTAxMCBSREIgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworL2luY2x1ZGUvICJwMTAxMHNpLmR0c2kiCisKKy8geworCW1vZGVsID0gImZzbCxQMTAxMFJEQiI7CisJY29tcGF0aWJsZSA9ICJmc2wsUDEwMTBSREIiOworCisJYWxpYXNlcyB7CisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlldGhlcm5ldDAgPSAmZW5ldDA7CisJCWV0aGVybmV0MSA9ICZlbmV0MTsKKwkJZXRoZXJuZXQyID0gJmVuZXQyOworCQlwY2kwID0gJnBjaTA7CisJCXBjaTEgPSAmcGNpMTsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwl9OworCisJaWZjQGZmZTFlMDAwIHsKKwkJLyogTk9SLCBOQU5EIEZsYXNoZXMgYW5kIENQTEQgb24gYm9hcmQgKi8KKwkJcmFuZ2VzID0gPDB4MCAweDAgMHgwIDB4ZWUwMDAwMDAgMHgwMjAwMDAwMAorCQkJICAweDEgMHgwIDB4MCAweGZmODAwMDAwIDB4MDAwMTAwMDAKKwkJCSAgMHgzIDB4MCAweDAgMHhmZmIwMDAwMCAweDAwMDAwMDIwPjsKKworCQlub3JAMCwwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQlyZWcgPSA8MHgwIDB4MCAweDIwMDAwMDA+OworCQkJYmFuay13aWR0aCA9IDwyPjsKKwkJCWRldmljZS13aWR0aCA9IDwxPjsKKworCQkJcGFydGl0aW9uQDQwMDAwIHsKKwkJCQkvKiAyNTZLQiBmb3IgRFRCIEltYWdlICovCisJCQkJcmVnID0gPDB4MDAwNDAwMDAgMHgwMDA0MDAwMD47CisJCQkJbGFiZWwgPSAiTk9SIERUQiBJbWFnZSI7CisJCQl9OworCisJCQlwYXJ0aXRpb25AODAwMDAgeworCQkJCS8qIDcgTUIgZm9yIExpbnV4IEtlcm5lbCBJbWFnZSAqLworCQkJCXJlZyA9IDwweDAwMDgwMDAwIDB4MDA3MDAwMDA+OworCQkJCWxhYmVsID0gIk5PUiBMaW51eCBLZXJuZWwgSW1hZ2UiOworCQkJfTsKKworCQkJcGFydGl0aW9uQDgwMDAwMCB7CisJCQkJLyogMjBNQiBmb3IgSkZGUzIgYmFzZWQgUm9vdCBmaWxlIFN5c3RlbSAqLworCQkJCXJlZyA9IDwweDAwODAwMDAwIDB4MDE0MDAwMDA+OworCQkJCWxhYmVsID0gIk5PUiBKRkZTMiBSb290IEZpbGUgU3lzdGVtIjsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAxZjAwMDAwIHsKKwkJCQkvKiBUaGlzIGxvY2F0aW9uIG11c3Qgbm90IGJlIGFsdGVyZWQgICovCisJCQkJLyogNTEyS0IgZm9yIHUtYm9vdCBCb290bG9hZGVyIEltYWdlICovCisJCQkJLyogNTEyS0IgZm9yIHUtYm9vdCBFbnZpcm9ubWVudCBWYXJpYWJsZXMgKi8KKwkJCQlyZWcgPSA8MHgwMWYwMDAwMCAweDAwMTAwMDAwPjsKKwkJCQlsYWJlbCA9ICJOT1IgVS1Cb290IEltYWdlIjsKKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCQl9OworCisJCW5hbmRAMSwwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxpZmMtbmFuZCI7CisJCQlyZWcgPSA8MHgxIDB4MCAweDEwMDAwPjsKKworCQkJcGFydGl0aW9uQDAgeworCQkJCS8qIFRoaXMgbG9jYXRpb24gbXVzdCBub3QgYmUgYWx0ZXJlZCAgKi8KKwkJCQkvKiAxTUIgZm9yIHUtYm9vdCBCb290bG9hZGVyIEltYWdlICovCisJCQkJcmVnID0gPDB4MCAweDAwMTAwMDAwPjsKKwkJCQlsYWJlbCA9ICJOQU5EIFUtQm9vdCBJbWFnZSI7CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKworCQkJcGFydGl0aW9uQDEwMDAwMCB7CisJCQkJLyogMU1CIGZvciBEVEIgSW1hZ2UgKi8KKwkJCQlyZWcgPSA8MHgwMDEwMDAwMCAweDAwMTAwMDAwPjsKKwkJCQlsYWJlbCA9ICJOQU5EIERUQiBJbWFnZSI7CisJCQl9OworCisJCQlwYXJ0aXRpb25AMjAwMDAwIHsKKwkJCQkvKiA0TUIgZm9yIExpbnV4IEtlcm5lbCBJbWFnZSAqLworCQkJCXJlZyA9IDwweDAwMjAwMDAwIDB4MDA0MDAwMDA+OworCQkJCWxhYmVsID0gIk5BTkQgTGludXggS2VybmVsIEltYWdlIjsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkA2MDAwMDAgeworCQkJCS8qIDRNQiBmb3IgQ29tcHJlc3NlZCBSb290IGZpbGUgU3lzdGVtIEltYWdlICovCisJCQkJcmVnID0gPDB4MDA2MDAwMDAgMHgwMDQwMDAwMD47CisJCQkJbGFiZWwgPSAiTkFORCBDb21wcmVzc2VkIFJGUyBJbWFnZSI7CisJCQl9OworCisJCQlwYXJ0aXRpb25AYTAwMDAwIHsKKwkJCQkvKiAxNU1CIGZvciBKRkZTMiBiYXNlZCBSb290IGZpbGUgU3lzdGVtICovCisJCQkJcmVnID0gPDB4MDBhMDAwMDAgMHgwMGYwMDAwMD47CisJCQkJbGFiZWwgPSAiTkFORCBKRkZTMiBSb290IEZpbGUgU3lzdGVtIjsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAxOTAwMDAwIHsKKwkJCQkvKiA3TUIgZm9yIFVzZXIgQXJlYSAqLworCQkJCXJlZyA9IDwweDAxOTAwMDAwIDB4MDA3MDAwMDA+OworCQkJCWxhYmVsID0gIk5BTkQgVXNlciBhcmVhIjsKKwkJCX07CisJCX07CisKKwkJY3BsZEAzLDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwcmRiLWNwbGQiOworCQkJcmVnID0gPDB4MyAweDAgMHgwMDAwMDIwPjsKKwkJCWJhbmstd2lkdGggPSA8MT47CisJCQlkZXZpY2Utd2lkdGggPSA8MT47CisJCX07CisJfTsKKworCXNvY0BmZmUwMDAwMCB7CisJCXNwaUA3MDAwIHsKKwkJCWZsYXNoQDAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCWNvbXBhdGlibGUgPSAic3BhbnNpb24sczI1c2wxMjgwMSI7CisJCQkJcmVnID0gPDA+OworCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDUwMDAwMDAwPjsKKworCQkJCXBhcnRpdGlvbkAwIHsKKwkJCQkJLyogMU1CIGZvciB1LWJvb3QgQm9vdGxvYWRlciBJbWFnZSAqLworCQkJCQkvKiAxTUIgZm9yIEVudmlyb25tZW50ICovCisJCQkJCXJlZyA9IDwweDAgMHgwMDEwMDAwMD47CisJCQkJCWxhYmVsID0gIlNQSSBGbGFzaCBVLUJvb3QgSW1hZ2UiOworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKworCQkJCXBhcnRpdGlvbkAxMDAwMDAgeworCQkJCQkvKiA1MTJLQiBmb3IgRFRCIEltYWdlICovCisJCQkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDAwODAwMDA+OworCQkJCQlsYWJlbCA9ICJTUEkgRmxhc2ggRFRCIEltYWdlIjsKKwkJCQl9OworCisJCQkJcGFydGl0aW9uQDE4MDAwMCB7CisJCQkJCS8qIDRNQiBmb3IgTGludXggS2VybmVsIEltYWdlICovCisJCQkJCXJlZyA9IDwweDAwMTgwMDAwIDB4MDA0MDAwMDA+OworCQkJCQlsYWJlbCA9ICJTUEkgRmxhc2ggTGludXggS2VybmVsIEltYWdlIjsKKwkJCQl9OworCisJCQkJcGFydGl0aW9uQDU4MDAwMCB7CisJCQkJCS8qIDRNQiBmb3IgQ29tcHJlc3NlZCBSRlMgSW1hZ2UgKi8KKwkJCQkJcmVnID0gPDB4MDA1ODAwMDAgMHgwMDQwMDAwMD47CisJCQkJCWxhYmVsID0gIlNQSSBGbGFzaCBDb21wcmVzc2VkIFJGU0ltYWdlIjsKKwkJCQl9OworCisJCQkJcGFydGl0aW9uQDk4MDAwMCB7CisJCQkJCS8qIDYuNU1CIGZvciBKRkZTMiBiYXNlZCBSRlMgKi8KKwkJCQkJcmVnID0gPDB4MDA5ODAwMDAgMHgwMDY4MDAwMD47CisJCQkJCWxhYmVsID0gIlNQSSBGbGFzaCBKRkZTMiBSRlMiOworCQkJCX07CisJCQl9OworCQl9OworCisJCWNhbjBAMWMwMDAgeworCQkJZnNsLGZsZXhjYW4tY2xvY2stc291cmNlID0gInBsYXRmb3JtIjsKKwkJfTsKKworCQljYW4xQDFkMDAwIHsKKwkJCWZzbCxmbGV4Y2FuLWNsb2NrLXNvdXJjZSA9ICJwbGF0Zm9ybSI7CisJCX07CisKKwkJdXNiQDIyMDAwIHsKKwkJCXBoeV90eXBlID0gInV0bWkiOworCQl9OworCisJCW1kaW9AMjQwMDAgeworCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgeworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MyAxPjsKKwkJCQlyZWcgPSA8MHgxPjsKKwkJCX07CisKKwkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIgMT47CisJCQkJcmVnID0gPDB4MD47CisJCQl9OworCisJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwyIDE+OworCQkJCXJlZyA9IDwweDI+OworCQkJfTsKKwkJfTsKKworCQllbmV0MDogZXRoZXJuZXRAYjAwMDAgeworCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CisJCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKKwkJfTsKKworCQllbmV0MTogZXRoZXJuZXRAYjEwMDAgeworCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CisJCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKKwkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAic2dtaWkiOworCQl9OworCisJCWVuZXQyOiBldGhlcm5ldEBiMjAwMCB7CisJCQlwaHktaGFuZGxlID0gPCZwaHkyPjsKKwkJCXRiaS1oYW5kbGUgPSA8JnRiaTE+OworCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJzZ21paSI7CisJCX07CisJfTsKKworCXBjaTA6IHBjaWVAZmZlMDkwMDAgeworCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzEwMDAwIDB4MCAweDEwMDAwPjsKKwkJcGNpZUAwIHsKKwkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMHgwIDB4MCAweDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDQgMHgxCisJCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4NSAweDEKKwkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHg2IDB4MQorCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDcgMHgxCisJCQk+OworCisJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCisJCQkJICAweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAKKwkJCQkgIDB4MCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgwIDB4MTAwMDAwPjsKKwkJfTsKKwl9OworCisJcGNpMTogcGNpZUBmZmUwYTAwMCB7CisJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAgMCAweDgwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZmZjMDAwMDAgMHgwIDB4MTAwMDA+OworCQlwY2llQDAgeworCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDI+OworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLyogSURTRUwgMHgwICovCisJCQkwMDAwIDB4MCAweDAgMHgxICZtcGljIDB4NCAweDEKKwkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHg1IDB4MQorCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDYgMHgxCisJCQkwMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4NyAweDEKKwkJCT47CisJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCisJCQkJICAweDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAKKwkJCQkgIDB4MCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgwIDB4MTAwMDAwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAxMHNpLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMTBzaS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNTExMDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMTBzaS5kdHNpCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogUDEwMTBzaSBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvZHRzLXYxLzsKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFAxMDEwIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyxQMTAxMEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKwl9OworCisJaWZjQGZmZTFlMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxpZmMiLCAic2ltcGxlLWJ1cyI7CisJCXJlZyA9IDwweDAgMHhmZmUxZTAwMCAwIDB4MjAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAxOSAyPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJfTsKKworCXNvY0BmZmUwMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJZGV2aWNlX3R5cGUgPSAic29jIjsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtaW1tciIsICJzaW1wbGUtYnVzIjsKKwkJcmFuZ2VzID0gPDB4MCAgMHgwIDB4ZmZlMDAwMDAgMHgxMDAwMDA+OworCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KKworCQllY20tbGF3QDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7CisJCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCQlmc2wsbnVtLWxhd3MgPSA8MTI+OworCQl9OworCisJCWVjbUAxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLWVjbSIsICJmc2wsZWNtIjsKKwkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJfTsKKworCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKKwkJfTsKKworCQlpMmNAMzAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgzMDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8NDMgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWRmc3JyOworCQl9OworCisJCWkyY0AzMTAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDMxMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJZGZzcnI7CisJCX07CisKKwkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgeworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgeworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJc3BpQDcwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtZXNwaSI7CisJCQlyZWcgPSA8MHg3MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDU5IDB4Mj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDwxPjsKKwkJfTsKKworCQlncGlvOiBncGlvLWNvbnRyb2xsZXJAZjAwMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZ3BpbyI7CisJCQlyZWcgPSA8MHhmMDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8NDcgMHgyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQl9OworCisJCXNhdGFAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscHEtc2F0YS12MiI7CisJCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWludGVycnVwdHMgPSA8NzQgMHgyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCisJCXNhdGFAMTkwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscHEtc2F0YS12MiI7CisJCQlyZWcgPSA8MHgxOTAwMCAweDEwMDA+OworCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCWludGVycnVwdHMgPSA8NDEgMHgyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCisJCWNhbjBAMWMwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZmxleGNhbi12MS4wIjsKKwkJCXJlZyA9IDwweDFjMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQ4IDB4Mj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWZzbCxmbGV4Y2FuLWNsb2NrLWRpdmlkZXIgPSA8Mj47CisJCX07CisKKwkJY2FuMUAxZDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxmbGV4Y2FuLXYxLjAiOworCQkJcmVnID0gPDB4MWQwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NjEgMHgyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJZnNsLGZsZXhjYW4tY2xvY2stZGl2aWRlciA9IDwyPjsKKwkJfTsKKworCQlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMTAxMC1sMi1jYWNoZS1jb250cm9sbGVyIiwKKwkJCQkJImZzbCxwMTAxNC1sMi1jYWNoZS1jb250cm9sbGVyIjsKKwkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47CisJCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcworCQkJY2FjaGUtc2l6ZSA9IDwweDQwMDAwPjsgLy8gTDIsMjU2SworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDI+OworCQl9OworCisJCWRtYUAyMTMwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7CisJCQlyZWcgPSA8MHgyMTMwMCAweDQ+OworCQkJcmFuZ2VzID0gPDB4MCAweDIxMTAwIDB4MjAwPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkbWEtY2hhbm5lbEAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMTAxMC1kbWEtY2hhbm5lbCIsICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjAgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLWRtYS1jaGFubmVsIiwgImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjEgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMTAxMC1kbWEtY2hhbm5lbCIsICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwyMiAyPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLWRtYS1jaGFubmVsIiwgImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIzIDI+OworCQkJfTsKKwkJfTsKKworCQl1c2JAMjIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wtdXNiMi1kciI7CisJCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDwyOCAweDI+OworCQkJZHJfbW9kZSA9ICJob3N0IjsKKwkJfTsKKworCQltZGlvQDI0MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxldHNlYzItbWRpbyI7CisJCQlyZWcgPSA8MHgyNDAwMCAweDEwMDAgMHhiMDAzMCAweDQ+OworCQl9OworCisJCW1kaW9AMjUwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGV0c2VjMi10YmkiOworCQkJcmVnID0gPDB4MjUwMDAgMHgxMDAwIDB4YjEwMzAgMHg0PjsKKwkJCXRiaTA6IHRiaS1waHlAMTEgeworCQkJCXJlZyA9IDwweDExPjsKKwkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKKwkJCX07CisJCX07CisKKwkJbWRpb0AyNjAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyLXRiaSI7CisJCQlyZWcgPSA8MHgyNjAwMCAweDEwMDAgMHhiMTAzMCAweDQ+OworCQkJdGJpMTogdGJpLXBoeUAxMSB7CisJCQkJcmVnID0gPDB4MTE+OworCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQkJfTsKKwkJfTsKKworCQlzZGhjaUAyZTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxlc2RoYyI7CisJCQlyZWcgPSA8MHgyZTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw3MiAweDg+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlmc2wsc2RoY2ktYXV0by1jbWQxMjsKKwkJfTsKKworCQllbmV0MDogZXRoZXJuZXRAYjAwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyIjsKKwkJCWZzbCxudW1fcnhfcXVldWVzID0gPDB4OD47CisJCQlmc2wsbnVtX3R4X3F1ZXVlcyA9IDwweDg+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCQkJcXVldWUtZ3JvdXBAMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmVnID0gPDB4YjAwMDAgMHgxMDAwPjsKKwkJCQlmc2wscngtYml0LW1hcCA9IDwweGZmPjsKKwkJCQlmc2wsdHgtYml0LW1hcCA9IDwweGZmPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDI5IDIgMzAgMiAzNCAyPjsKKwkJCX07CisKKwkJfTsKKworCQllbmV0MTogZXRoZXJuZXRAYjEwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyIjsKKwkJCWZzbCxudW1fcnhfcXVldWVzID0gPDB4OD47CisJCQlmc2wsbnVtX3R4X3F1ZXVlcyA9IDwweDg+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCQkJcXVldWUtZ3JvdXBAMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmVnID0gPDB4YjEwMDAgMHgxMDAwPjsKKwkJCQlmc2wscngtYml0LW1hcCA9IDwweGZmPjsKKwkJCQlmc2wsdHgtYml0LW1hcCA9IDwweGZmPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM1IDIgMzYgMiA0MCAyPjsKKwkJCX07CisKKwkJfTsKKworCQllbmV0MjogZXRoZXJuZXRAYjIwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyIjsKKwkJCWZzbCxudW1fcnhfcXVldWVzID0gPDB4OD47CisJCQlmc2wsbnVtX3R4X3F1ZXVlcyA9IDwweDg+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCQkJcXVldWUtZ3JvdXBAMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmVnID0gPDB4YjIwMDAgMHgxMDAwPjsKKwkJCQlmc2wscngtYml0LW1hcCA9IDwweGZmPjsKKwkJCQlmc2wsdHgtYml0LW1hcCA9IDwweGZmPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMxIDIgMzIgMiAzMyAyPjsKKwkJCX07CisKKwkJfTsKKworCQltcGljOiBwaWNANDAwMDAgeworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKKwkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7CisJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJCX07CisKKwkJbXNpQDQxNjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLW1zaSIsICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDE2MDAgMHg4MD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhlMCAwCisJCQkJMHhlMSAwCisJCQkJMHhlMiAwCisJCQkJMHhlMyAwCisJCQkJMHhlNCAwCisJCQkJMHhlNSAwCisJCQkJMHhlNiAwCisJCQkJMHhlNyAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCisJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewkvL2dsb2JhbCB1dGlsaXRpZXMgYmxvY2sKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLWd1dHMiOworCQkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKKwkJCWZzbCxoYXMtcnN0Y3I7CisJCX07CisJfTsKKworCXBjaTA6IHBjaWVAZmZlMDkwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMTAxMC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjMiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJcmVnID0gPDAgMHhmZmUwOTAwMCAwIDB4MTAwMD47CisJCWJ1cy1yYW5nZSA9IDwwIDI1NT47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlpbnRlcnJ1cHRzID0gPDE2IDI+OworCX07CisKKwlwY2kxOiBwY2llQGZmZTBhMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4zIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCXJlZyA9IDwwIDB4ZmZlMGEwMDAgMCAweDEwMDA+OworCQlidXMtcmFuZ2UgPSA8MCAyNTU+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMmRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMmRzLmR0cwppbmRleCA0ZjY4NWE3Li4xYmU5NzQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjJkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIyZHMuZHRzCkBAIC0yMDksOCArMjA5LDEwIEBACiAJCQl3bTg3NzY6Y29kZWNAMWEgewogCQkJCWNvbXBhdGlibGUgPSAid2xmLHdtODc3NiI7CiAJCQkJcmVnID0gPDB4MWE+OwotCQkJCS8qIE1DTEsgc291cmNlIGlzIGEgc3RhbmQtYWxvbmUgb3NjaWxsYXRvciAqLwotCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMjI4ODAwMD47CisJCQkJLyoKKwkJCQkgKiBjbG9jay1mcmVxdWVuY3kgd2lsbCBiZSBzZXQgYnkgVS1Cb290IGlmCisJCQkJICogdGhlIGNsb2NrIGlzIGVuYWJsZWQuCisJCQkJICovCiAJCQl9OwogCQl9OwogCkBAIC0yODAsNyArMjgyLDggQEAKIAkJCWNvZGVjLWhhbmRsZSA9IDwmd204Nzc2PjsKIAkJCWZzbCxwbGF5YmFjay1kbWEgPSA8JmRtYTAwPjsKIAkJCWZzbCxjYXB0dXJlLWRtYSA9IDwmZG1hMDE+OwotCQkJZnNsLGZpZm8tZGVwdGggPSA8MTY+OworCQkJZnNsLGZpZm8tZGVwdGggPSA8MTU+OworCQkJZnNsLHNzaS1hc3luY2hyb25vdXM7CiAJCX07CiAKIAkJZG1hQGMzMDAgewpAQCAtNDA5LDcgKzQxMiw2IEBACiAJCQlmc2wsbWFnaWMtcGFja2V0OwogCQkJZnNsLHdha2Utb24tZmlsZXI7CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWZpeGVkLWxpbmsgPSA8MSAxIDEwMDAgMCAwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7CiAJCQlxdWV1ZS1ncm91cEAwewpAQCAtNDM2LDcgKzQzOCw2IEBACiAJCQlmc2wsbnVtX3J4X3F1ZXVlcyA9IDwweDg+OwogCQkJZnNsLG51bV90eF9xdWV1ZXMgPSA8MHg4PjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJZml4ZWQtbGluayA9IDwxIDEgMTAwMCAwIDA+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CiAJCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKIAkJCXF1ZXVlLWdyb3VwQDB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjNyZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIzcmRzLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmE5NmFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIzcmRzLmR0cwpAQCAtMCwwICsxLDU0NiBAQAorLyoKKyAqIFAxMDIzIFJEUyBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAxMC0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBBdXRob3I6IFJveSBaYW5nIDx0aWUtZmVpLnphbmdAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvZHRzLXYxLzsKKworLyB7CisJbW9kZWwgPSAiZnNsLFAxMDIzIjsKKwljb21wYXRpYmxlID0gImZzbCxQMTAyM1JEUyI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZzZXJpYWwwOworCQlzZXJpYWwxID0gJnNlcmlhbDE7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisKKwkJY3J5cHRvID0gJmNyeXB0bzsKKwkJc2VjX2pyMCA9ICZzZWNfanIwOworCQlzZWNfanIxID0gJnNlY19qcjE7CisJCXNlY19qcjIgPSAmc2VjX2pyMjsKKwkJc2VjX2pyMyA9ICZzZWNfanIzOworCQlydGljX2EgPSAmcnRpY19hOworCQlydGljX2IgPSAmcnRpY19iOworCQlydGljX2MgPSAmcnRpY19jOworCQlydGljX2QgPSAmcnRpY19kOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCWNwdTA6IFBvd2VyUEMsUDEwMjNAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDB4MD47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisKKwkJY3B1MTogUG93ZXJQQyxQMTAyM0AxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgxPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwl9OworCisJc29jQGZmNjAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQljb21wYXRpYmxlID0gImZzbCxwMTAyMy1pbW1yIiwgInNpbXBsZS1idXMiOworCQlyYW5nZXMgPSA8MHgwIDB4MCAweGZmNjAwMDAwIDB4MjAwMDAwPjsKKwkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIEZpbGxlZCBvdXQgYnkgdWJvb3QuCisKKwkJZWNtLWxhd0AwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGVjbS1sYXciOworCQkJcmVnID0gPDB4MCAweDEwMDA+OworCQkJZnNsLG51bS1sYXdzID0gPDEyPjsKKwkJfTsKKworCQllY21AMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMTAyMy1lY20iLCAiZnNsLGVjbSI7CisJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMTAyMy1tZW1vcnktY29udHJvbGxlciI7CisJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMj47CisJCX07CisKKwkJaTJjQDMwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MzAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQzIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlkZnNycjsKKwkJCXJ0Y0A2OCB7CisJCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxMzc0IjsKKwkJCQlyZWcgPSA8MHg2OD47CisJCQl9OworCQl9OworCisJCWkyY0AzMTAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDMxMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJZGZzcnI7CisJCX07CisKKwkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgeworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgeworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJc3BpQDcwMDAgeworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxwMTAyMy1lc3BpIiwgImZzbCxtcGM4NTM2LWVzcGkiOworCQkJcmVnID0gPDB4NzAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw1OSAweDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47CisKKwkJCWZzbF9kYXRhZmxhc2hAMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDQ1ZGIwODFkIjsKKwkJCQlyZWcgPSA8MD47CisJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OyAvKiBpbnB1dCBjbG9jayAqLworCQkJCXBhcnRpdGlvbkB1LWJvb3QgeworCQkJCQkvKiA1MTJLQiBmb3IgdS1ib290IEJvb3Rsb2FkZXIgSW1hZ2UgKi8KKwkJCQkJbGFiZWwgPSAidS1ib290LXNwaSI7CisJCQkJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDAwODAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25AZHRiIHsKKwkJCQkJLyogNTEyS0IgZm9yIERUQiBJbWFnZSAqLworCQkJCQlsYWJlbCA9ICJkdGItc3BpIjsKKwkJCQkJcmVnID0gPDB4MDAwODAwMDAgMHgwMDA4MDAwMD47CisJCQkJCXJlYWQtb25seTsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlncGlvOiBncGlvLWNvbnRyb2xsZXJAZjAwMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWdwaW8iOworCQkJcmVnID0gPDB4ZjAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQ3IDB4Mj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJfTsKKworCQlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMTAyMy1sMi1jYWNoZS1jb250cm9sbGVyIjsKKwkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47CisJCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcworCQkJY2FjaGUtc2l6ZSA9IDwweDQwMDAwPjsgLy8gTDIsMjU2SworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDI+OworCQl9OworCisJCWRtYUAyMTMwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEiOworCQkJcmVnID0gPDB4MjEzMDAgMHg0PjsKKwkJCXJhbmdlcyA9IDwweDAgMHgyMTEwMCAweDIwMD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJZG1hLWNoYW5uZWxAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjAgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwyMSAyPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjIgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIzIDI+OworCQkJfTsKKwkJfTsKKworCQl1c2JAMjIwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLXVzYjItZHIiOworCQkJcmVnID0gPDB4MjIwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDwyOCAweDI+OworCQkJZHJfbW9kZSA9ICJob3N0IjsKKwkJCXBoeV90eXBlID0gInVscGkiOworCQl9OworCisJCWNyeXB0bzogY3J5cHRvQDMwMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMiIsICJmc2wsc2VjLXY0LjAiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDMwMDAwIDB4MTAwMDA+OworCQkJcmFuZ2VzID0gPDAgMHgzMDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDw1OCAyPjsKKworCQkJc2VjX2pyMDoganJAMTAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDQ1IDI+OworCQkJfTsKKworCQkJc2VjX2pyMToganJAMjAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDQ1IDI+OworCQkJfTsKKworCQkJc2VjX2pyMjoganJAMzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDMwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDU3IDI+OworCQkJfTsKKworCQkJc2VjX2pyMzoganJANDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDQwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDU3IDI+OworCQkJfTsKKworCQkJcnRpY0A2MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljIiwKKwkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMiOworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCXJlZyA9IDwweDYwMDAgMHgxMDA+OworCQkJCXJhbmdlcyA9IDwweDAgMHg2MTAwIDB4ZTAwPjsKKworCQkJCXJ0aWNfYTogcnRpYy1hQDAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHgwMCAweDIwIDB4MTAwIDB4ODA+OworCQkJCX07CisKKwkJCQlydGljX2I6IHJ0aWMtYkAyMCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKKwkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJCXJlZyA9IDwweDIwIDB4MjAgMHgyMDAgMHg4MD47CisJCQkJfTsKKworCQkJCXJ0aWNfYzogcnRpYy1jQDQwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAorCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4NDAgMHgyMCAweDMwMCAweDgwPjsKKwkJCQl9OworCisJCQkJcnRpY19kOiBydGljLWRANjAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHg2MCAweDIwIDB4NTAwIDB4ODA+OworCQkJCX07CisJCQl9OworCQl9OworCisJCXBvd2VyQGUwMDcweworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1wbWMiLCAiZnNsLG1wYzg1NDgtcG1jIiwKKwkJCSAgICAgICAgICAgICAiZnNsLHAxMDIyLXBtYyI7CisJCQlyZWcgPSA8MHhlMDA3MCAweDIwPjsKKwkJCWV0c2VjMV9jbGs6IHNvYy1jbGtAQjB7CisJCQkJZnNsLHBtY2RyLW1hc2sgPSA8MHgwMDAwMDA4MD47CisJCQl9OworCQkJZXRzZWMyX2Nsazogc29jLWNsa0BCMXsKKwkJCQlmc2wscG1jZHItbWFzayA9IDwweDAwMDAwMDQwPjsKKwkJCX07CisJCQlldHNlYzNfY2xrOiBzb2MtY2xrQEIyeworCQkJCWZzbCxwbWNkci1tYXNrID0gPDB4MDAwMDAwMjA+OworCQkJfTsKKwkJfTsKKworCQltcGljOiBwaWNANDAwMDAgeworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKKwkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7CisJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJCX07CisKKwkJbXNpQDQxNjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLW1zaSIsICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDE2MDAgMHg4MD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhlMCAwCisJCQkJMHhlMSAwCisJCQkJMHhlMiAwCisJCQkJMHhlMyAwCisJCQkJMHhlNCAwCisJCQkJMHhlNSAwCisJCQkJMHhlNiAwCisJCQkJMHhlNyAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCisJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewkvL2dsb2JhbCB1dGlsaXRpZXMgYmxvY2sKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLWd1dHMiOworCQkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKKwkJCWZzbCxoYXMtcnN0Y3I7CisJCX07CisJfTsKKworCWxvY2FsYnVzQGZmNjA1MDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxwMTAyMy1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOworCQlyZWcgPSA8MCAweGZmNjA1MDAwIDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxOSAyPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwkJLyogTk9SIEZsYXNoLCBCQ1NSICovCisJCXJhbmdlcyA9IDwweDAgMHgwIDB4MCAweGVlMDAwMDAwIDB4MDIwMDAwMDAKKwkJCSAgMHgxIDB4MCAweDAgMHhlMDAwMDAwMCAweDAwMDA4MDAwPjsKKworCQlub3JAMCwwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQlyZWcgPSA8MHgwIDB4MCAweDAyMDAwMDAwPjsKKwkJCWJhbmstd2lkdGggPSA8MT47CisJCQlkZXZpY2Utd2lkdGggPSA8MT47CisJCQlwYXJ0aXRpb25AMCB7CisJCQkJbGFiZWwgPSAicmFtZGlzayI7CisJCQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwMWMwMDAwMD47CisJCQl9OworCQkJcGFydGl0aW9uQDFjMDAwMDAgeworCQkJCWxhYmVsID0gImtlcm5lbCI7CisJCQkJcmVnID0gPDB4MDFjMDAwMDAgMHgwMDJlMDAwMD47CisJCQl9OworCQkJcGFydGl0b25AMWVlMDAwMCB7CisJCQkJbGFiZWwgPSAiZHRiIjsKKwkJCQlyZWcgPSA8MHgwMWVlMDAwMCAweDAwMDIwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25AMWYwMDAwMCB7CisJCQkJbGFiZWwgPSAiZmlybXdhcmUiOworCQkJCXJlZyA9IDwweDAxZjAwMDAwIDB4MDAwODAwMDA+OworCQkJCXJlYWQtb25seTsKKwkJCX07CisJCQlwYXJ0aXRpb25AMWY4MDAwMCB7CisJCQkJbGFiZWwgPSAidS1ib290IjsKKwkJCQlyZWcgPSA8MHgwMWY4MDAwMCAweDAwMDgwMDAwPjsKKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCQl9OworCisJCWZwZ2FAMSwwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxwMTAyM3Jkcy1mcGdhIjsKKwkJCXJlZyA9IDwxIDAgMHg4MDAwPjsKKwkJCXJhbmdlcyA9IDwwIDEgMCAweDgwMDA+OworCisJCQliY3NyQDIwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMTAyM3Jkcy1iY3NyIjsKKwkJCQlyZWcgPSA8MHgyMCAweDIwPjsKKwkJCX07CisJCX07CisJfTsKKworCXBjaTA6IHBjaWVAZmY2MGEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMTAyMy1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQljZWxsLWluZGV4ID0gPDE+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCXJlZyA9IDwwIDB4ZmY2MGEwMDAgMCAweDEwMDA+OworCQlidXMtcmFuZ2UgPSA8MCAyNTU+OworCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwIDAgMHhjMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzIwMDAwIDB4MCAweDEwMDAwPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCWludGVycnVwdHMgPSA8MTYgMj47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMj47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwICovCisJCQkJMDAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwMDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTAwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDAwMCAwIDAgNCAmbXBpYyAzIDEKKwkJCQk+OworCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhjMDAwMDAwMAorCQkJCSAgMHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwCisJCQkJICAweDAgMHgyMDAwMDAwMAorCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKKwkJCQkgIDB4MCAweDEwMDAwMD47CisJCX07CisJfTsKKworCXBjaTE6IHBjaWVAZmY2MDkwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMTAyMy1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQljZWxsLWluZGV4ID0gPDI+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCXJlZyA9IDwwIDB4ZmY2MDkwMDAgMCAweDEwMDA+OworCQlidXMtcmFuZ2UgPSA8MCAyNTU+OworCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzEwMDAwIDB4MCAweDEwMDAwPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCWludGVycnVwdHMgPSA8MTYgMj47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMj47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwICovCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCQkwMDAwIDAgMCAyICZtcGljIDUgMQorCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxCisJCQkJMDAwMCAwIDAgNCAmbXBpYyA3IDEKKwkJCQk+OworCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAorCQkJCSAgMHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCisJCQkJICAweDAgMHgyMDAwMDAwMAorCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKKwkJCQkgIDB4MCAweDEwMDAwMD47CisJCX07CisJfTsKKworCXBjaTI6IHBjaWVAZmY2MGIwMDAgeworCQljZWxsLWluZGV4ID0gPDM+OworCQljb21wYXRpYmxlID0gImZzbCxwMTAyMy1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCXJlZyA9IDwwIDB4ZmY2MGIwMDAgMCAweDEwMDA+OworCQlidXMtcmFuZ2UgPSA8MCAyNTU+OworCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDAgMHg4MDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzAwMDAwIDB4MCAweDEwMDAwPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCWludGVycnVwdHMgPSA8MTYgMj47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMj47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwICovCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA4IDEKKwkJCQkwMDAwIDAgMCAyICZtcGljIDkgMQorCQkJCTAwMDAgMCAwIDMgJm1waWMgMTAgMQorCQkJCTAwMDAgMCAwIDQgJm1waWMgMTEgMQorCQkJCT47CisJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCisJCQkJICAweDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAKKwkJCQkgIDB4MCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgwIDB4MTAwMDAwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjA0MHJkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDByZGIuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODRlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDByZGIuZHRzCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogUDIwNDBSREIgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy9pbmNsdWRlLyAicDIwNDBzaS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJmc2wsUDIwNDBSREIiOworCWNvbXBhdGlibGUgPSAiZnNsLFAyMDQwUkRCIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJfTsKKworCXNvYzogc29jQGZmZTAwMDAwMCB7CisJCXNwaUAxMTAwMDAgeworCQkJZmxhc2hAMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixzMjVzbDEyODAxIjsKKwkJCQlyZWcgPSA8MD47CisJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OyAvKiBpbnB1dCBjbG9jayAqLworCQkJCXBhcnRpdGlvbkB1LWJvb3QgeworCQkJCQlsYWJlbCA9ICJ1LWJvb3QiOworCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMTAwMDAwPjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisJCQkJcGFydGl0aW9uQGtlcm5lbCB7CisJCQkJCWxhYmVsID0gImtlcm5lbCI7CisJCQkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDA1MDAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25AZHRiIHsKKwkJCQkJbGFiZWwgPSAiZHRiIjsKKwkJCQkJcmVnID0gPDB4MDA2MDAwMDAgMHgwMDEwMDAwMD47CisJCQkJCXJlYWQtb25seTsKKwkJCQl9OworCQkJCXBhcnRpdGlvbkBmcyB7CisJCQkJCWxhYmVsID0gImZpbGUgc3lzdGVtIjsKKwkJCQkJcmVnID0gPDB4MDA3MDAwMDAgMHgwMDkwMDAwMD47CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJaTJjQDExODAwMCB7CisJCQlsbTc1YkA0OCB7CisJCQkJY29tcGF0aWJsZSA9ICJueHAsbG03NWEiOworCQkJCXJlZyA9IDwweDQ4PjsKKwkJCX07CisJCQllZXByb21ANTAgeworCQkJCWNvbXBhdGlibGUgPSAiYXQyNCwyNGMyNTYiOworCQkJCXJlZyA9IDwweDUwPjsKKwkJCX07CisJCQlydGNANjggeworCQkJCWNvbXBhdGlibGUgPSAicGVyaWNvbSxwdDdjNDMzOCI7CisJCQkJcmVnID0gPDB4Njg+OworCQkJfTsKKwkJfTsKKworCQlpMmNAMTE4MTAwIHsKKwkJCWVlcHJvbUA1MCB7CisJCQkJY29tcGF0aWJsZSA9ICJhdDI0LDI0YzI1NiI7CisJCQkJcmVnID0gPDB4NTA+OworCQkJfTsKKwkJfTsKKworCQl1c2IwOiB1c2JAMjEwMDAwIHsKKwkJCXBoeV90eXBlID0gInV0bWkiOworCQl9OworCisJCXVzYjE6IHVzYkAyMTEwMDAgeworCQkJZHJfbW9kZSA9ICJob3N0IjsKKwkJCXBoeV90eXBlID0gInV0bWkiOworCQl9OworCX07CisKKwlsb2NhbGJ1c0BmZmUxMjQwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUxMjQwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGU4MDAwMDAwIDB4MDgwMDAwMDA+OworCisJCWZsYXNoQDAsMCB7CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQlyZWcgPSA8MCAwIDB4MDgwMDAwMDA+OworCQkJYmFuay13aWR0aCA9IDwyPjsKKwkJCWRldmljZS13aWR0aCA9IDwyPjsKKwkJfTsKKwl9OworCisJcGNpMDogcGNpZUBmZmUyMDAwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUyMDAwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAgMHhjIDB4MDAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMDAwMDAgMHgwIDB4MDAwMTAwMDA+OworCQlwY2llQDAgeworCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMCAweDAwMDEwMDAwPjsKKwkJfTsKKwl9OworCisJcGNpMTogcGNpZUBmZmUyMDEwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUyMDEwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAgMHhlMDAwMDAwMCAweGMgMHgyMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDB4ZiAweGY4MDEwMDAwIDB4MCAweDAwMDEwMDAwPjsKKwkJcGNpZUAwIHsKKwkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDAgMHgyMDAwMDAwMAorCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDAgMHgwMDAxMDAwMD47CisJCX07CisJfTsKKworCXBjaTI6IHBjaWVAZmZlMjAyMDAwIHsKKwkJcmVnID0gPDB4ZiAweGZlMjAyMDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDQwMDAwMDAwIDAgMHgyMDAwMDAwMAorCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmODAyMDAwMCAwIDB4MDAwMTAwMDA+OworCQlwY2llQDAgeworCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMCAweDAwMDEwMDAwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjA0MHNpLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDBzaS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZGJiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDBzaS5kdHNpCkBAIC0wLDAgKzEsNjIzIEBACisvKgorICogUDIwNDAgU2lsaWNvbiBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2R0cy12MS87CisKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFAyMDQwIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQljY3NyID0gJnNvYzsKKworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJc2VyaWFsMiA9ICZzZXJpYWwyOworCQlzZXJpYWwzID0gJnNlcmlhbDM7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisJCXVzYjAgPSAmdXNiMDsKKwkJdXNiMSA9ICZ1c2IxOworCQlkbWEwID0gJmRtYTA7CisJCWRtYTEgPSAmZG1hMTsKKwkJc2RoYyA9ICZzZGhjOworCQltc2kwID0gJm1zaTA7CisJCW1zaTEgPSAmbXNpMTsKKwkJbXNpMiA9ICZtc2kyOworCisJCWNyeXB0byA9ICZjcnlwdG87CisJCXNlY19qcjAgPSAmc2VjX2pyMDsKKwkJc2VjX2pyMSA9ICZzZWNfanIxOworCQlzZWNfanIyID0gJnNlY19qcjI7CisJCXNlY19qcjMgPSAmc2VjX2pyMzsKKwkJcnRpY19hID0gJnJ0aWNfYTsKKwkJcnRpY19iID0gJnJ0aWNfYjsKKwkJcnRpY19jID0gJnJ0aWNfYzsKKwkJcnRpY19kID0gJnJ0aWNfZDsKKwkJc2VjX21vbiA9ICZzZWNfbW9uOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCWNwdTA6IFBvd2VyUEMsZTUwMG1jQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OworCQkJTDJfMDogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHUxOiBQb3dlclBDLGU1MDBtY0AxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MT47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKKwkJCUwyXzE6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1MjogUG93ZXJQQyxlNTAwbWNAMiB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDI+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47CisJCQlMMl8yOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTM6IFBvd2VyUEMsZTUwMG1jQDMgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwzPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzM+OworCQkJTDJfMzogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCX07CisKKwlzb2M6IHNvY0BmZmUwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWRldmljZV90eXBlID0gInNvYyI7CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweGZlMDAwMDAwIDB4MTAwMDAwMD47CisJCXJlZyA9IDwweGYgMHhmZTAwMDAwMCAwIDB4MDAwMDEwMDA+OworCisJCXNvYy1zcmFtLWVycm9yIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNvYy1zcmFtLWVycm9yIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDI5PjsKKwkJfTsKKworCQljb3JlbmV0LWxhd0AwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtbGF3IjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJCWZzbCxudW0tbGF3cyA9IDwzMj47CisJCX07CisKKwkJbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlci12NC41IiwgImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7CisJCQlyZWcgPSA8MHg4MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMz47CisJCX07CisKKwkJY3BjOiBsMy1jYWNoZS1jb250cm9sbGVyQDEwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiZnNsLHA0MDgwLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiY2FjaGUiOworCQkJcmVnID0gPDB4MTAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDI3PjsKKwkJfTsKKworCQljb3JlbmV0LWNmQDE4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtY2YiOworCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDMxPjsKKwkJCWZzbCxjY2YtbnVtLWNzZGlkcyA9IDwzMj47CisJCQlmc2wsY2NmLW51bS1zbm9vcGlkcyA9IDwzMj47CisJCX07CisKKwkJaW9tbXVAMjAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscGFtdS12MS4wIiwgImZzbCxwYW11IjsKKwkJCXJlZyA9IDwweDIwMDAwIDB4NDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTI0IDIgMCAwCisJCQkJMTYgMiAxIDMwPjsKKwkJfTsKKworCQltcGljOiBwaWNANDAwMDAgeworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8ND47CisJCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMiLCAiY2hycCxvcGVuLXBpYyI7CisJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJCX07CisKKwkJbXNpMDogbXNpQDQxNjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKKwkJCXJlZyA9IDwweDQxNjAwIDB4MjAwPjsKKwkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkweGUwIDAgMCAwCisJCQkJMHhlMSAwIDAgMAorCQkJCTB4ZTIgMCAwIDAKKwkJCQkweGUzIDAgMCAwCisJCQkJMHhlNCAwIDAgMAorCQkJCTB4ZTUgMCAwIDAKKwkJCQkweGU2IDAgMCAwCisJCQkJMHhlNyAwIDAgMD47CisJCX07CisKKwkJbXNpMTogbXNpQDQxODAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKKwkJCXJlZyA9IDwweDQxODAwIDB4MjAwPjsKKwkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkweGU4IDAgMCAwCisJCQkJMHhlOSAwIDAgMAorCQkJCTB4ZWEgMCAwIDAKKwkJCQkweGViIDAgMCAwCisJCQkJMHhlYyAwIDAgMAorCQkJCTB4ZWQgMCAwIDAKKwkJCQkweGVlIDAgMCAwCisJCQkJMHhlZiAwIDAgMD47CisJCX07CisKKwkJbXNpMjogbXNpQDQxYTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKKwkJCXJlZyA9IDwweDQxYTAwIDB4MjAwPjsKKwkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkweGYwIDAgMCAwCisJCQkJMHhmMSAwIDAgMAorCQkJCTB4ZjIgMCAwIDAKKwkJCQkweGYzIDAgMCAwCisJCQkJMHhmNCAwIDAgMAorCQkJCTB4ZjUgMCAwIDAKKwkJCQkweGY2IDAgMCAwCisJCQkJMHhmNyAwIDAgMD47CisJCX07CisKKwkJZ3V0czogZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1kZXZpY2UtY29uZmlnLTEuMCI7CisJCQlyZWcgPSA8MHhlMDAwMCAweGUwMD47CisJCQlmc2wsaGFzLXJzdGNyOworCQkJI3NsZWVwLWNlbGxzID0gPDE+OworCQkJZnNsLGxpb2RuLWJpdHMgPSA8MTI+OworCQl9OworCisJCXBpbnM6IGdsb2JhbC11dGlsaXRpZXNAZTBlMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcGluLWNvbnRyb2wtMS4wIjsKKwkJCXJlZyA9IDwweGUwZTAwIDB4MjAwPjsKKwkJCSNzbGVlcC1jZWxscyA9IDwyPjsKKwkJfTsKKworCQljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMS4wIjsKKwkJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCX07CisKKwkJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1yY3BtLTEuMCI7CisJCQlyZWcgPSA8MHhlMjAwMCAweDEwMDA+OworCQkJI3NsZWVwLWNlbGxzID0gPDE+OworCQl9OworCisJCXNmcDogc2ZwQGU4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLXNmcCIsICJmc2wscW9yaXEtc2ZwLTEuMCI7CisJCQlyZWcJICAgPSA8MHhlODAwMCAweDEwMDA+OworCQl9OworCisJCXNlcmRlczogc2VyZGVzQGVhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLXNlcmRlcyI7CisJCQlyZWcJICAgPSA8MHhlYTAwMCAweDEwMDA+OworCQl9OworCisJCWRtYTA6IGRtYUAxMDAzMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOworCQkJcmVnID0gPDB4MTAwMzAwIDB4ND47CisJCQlyYW5nZXMgPSA8MHgwIDB4MTAwMTAwIDB4MjAwPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkbWEtY2hhbm5lbEAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDI4IDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEA4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OworCQkJCWludGVycnVwdHMgPSA8MjkgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDEwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxMDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMwIDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQkJaW50ZXJydXB0cyA9IDwzMSAyIDAgMD47CisJCQl9OworCQl9OworCisJCWRtYTE6IGRtYUAxMDEzMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOworCQkJcmVnID0gPDB4MTAxMzAwIDB4ND47CisJCQlyYW5nZXMgPSA8MHgwIDB4MTAxMTAwIDB4MjAwPjsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQlkbWEtY2hhbm5lbEAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMyIDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEA4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OworCQkJCWludGVycnVwdHMgPSA8MzMgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDEwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxMDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM0IDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQkJaW50ZXJydXB0cyA9IDwzNSAyIDAgMD47CisJCQl9OworCQl9OworCisJCXNwaUAxMTAwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWVzcGkiLCAiZnNsLG1wYzg1MzYtZXNwaSI7CisJCQlyZWcgPSA8MHgxMTAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NTMgMHgyIDAgMD47CisJCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47CisKKwkJfTsKKworCQlzZGhjOiBzZGhjQDExNDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1lc2RoYyIsICJmc2wsZXNkaGMiOworCQkJcmVnID0gPDB4MTE0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQ4IDIgMCAwPjsKKwkJCXNkaGNpLGF1dG8tY21kMTI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCX07CisKKworCQlpMmNAMTE4MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExODAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM4IDIgMCAwPjsKKwkJCWRmc3JyOworCQl9OworCisJCWkyY0AxMTgxMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE4MTAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzggMiAwIDA+OworCQkJZGZzcnI7CisJCX07CisKKwkJaTJjQDExOTAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgxMTkwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwzOSAyIDAgMD47CisJCQlkZnNycjsKKwkJfTsKKworCQlpMmNAMTE5MTAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDM+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExOTEwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM5IDIgMCAwPjsKKwkJCWRmc3JyOworCQl9OworCisJCXNlcmlhbDA6IHNlcmlhbEAxMWM1MDAgeworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFjNTAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzYgMiAwIDA+OworCQl9OworCisJCXNlcmlhbDE6IHNlcmlhbEAxMWM2MDAgeworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFjNjAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzYgMiAwIDA+OworCQl9OworCisJCXNlcmlhbDI6IHNlcmlhbEAxMWQ1MDAgeworCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFkNTAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzcgMiAwIDA+OworCQl9OworCisJCXNlcmlhbDM6IHNlcmlhbEAxMWQ2MDAgeworCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFkNjAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzcgMiAwIDA+OworCQl9OworCisJCWdwaW8wOiBncGlvQDEzMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1ncGlvIiwgImZzbCxxb3JpcS1ncGlvIjsKKwkJCXJlZyA9IDwweDEzMDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw1NSAyIDAgMD47CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJfTsKKworCQl1c2IwOiB1c2JAMjEwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLXVzYjItbXBoIiwKKwkJCQkJImZzbCxtcGM4NXh4LXVzYjItbXBoIiwgImZzbC11c2IyLW1waCI7CisJCQlyZWcgPSA8MHgyMTAwMDAgMHgxMDAwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQ0IDB4MiAwIDA+OworCQkJcG9ydDA7CisJCX07CisKKwkJdXNiMTogdXNiQDIxMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC11c2IyLWRyIiwKKwkJCQkJImZzbCxtcGM4NXh4LXVzYjItZHIiLCAiZnNsLXVzYjItZHIiOworCQkJcmVnID0gPDB4MjExMDAwIDB4MTAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDw0NSAweDIgMCAwPjsKKwkJfTsKKworCQlzYXRhQDIyMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1zYXRhIiwgImZzbCxwcS1zYXRhLXYyIjsKKwkJCXJlZyA9IDwweDIyMDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw2OCAweDIgMCAwPjsKKwkJfTsKKworCQlzYXRhQDIyMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1zYXRhIiwgImZzbCxwcS1zYXRhLXYyIjsKKwkJCXJlZyA9IDwweDIyMTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw2OSAweDIgMCAwPjsKKwkJfTsKKworCQljcnlwdG86IGNyeXB0b0AzMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjIiLCAiZnNsLHNlYy12NC4wIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHgzMDAwMDAgMHgxMDAwMD47CisJCQlyYW5nZXMgPSA8MCAweDMwMDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdHMgPSA8OTIgMiAwIDA+OworCisJCQlzZWNfanIwOiBqckAxMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQkJCWludGVycnVwdHMgPSA8ODggMiAwIDA+OworCQkJfTsKKworCQkJc2VjX2pyMToganJAMjAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg5IDIgMCAwPjsKKwkJCX07CisKKwkJCXNlY19qcjI6IGpyQDMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKKwkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCQlyZWcgPSA8MHgzMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw5MCAyIDAgMD47CisJCQl9OworCisJCQlzZWNfanIzOiBqckA0MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQkJcmVnID0gPDB4NDAwMCAweDEwMDA+OworCQkJCWludGVycnVwdHMgPSA8OTEgMiAwIDA+OworCQkJfTsKKworCQkJcnRpY0A2MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljIiwKKwkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMiOworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCXJlZyA9IDwweDYwMDAgMHgxMDA+OworCQkJCXJhbmdlcyA9IDwweDAgMHg2MTAwIDB4ZTAwPjsKKworCQkJCXJ0aWNfYTogcnRpYy1hQDAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHgwMCAweDIwIDB4MTAwIDB4ODA+OworCQkJCX07CisKKwkJCQlydGljX2I6IHJ0aWMtYkAyMCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKKwkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJCXJlZyA9IDwweDIwIDB4MjAgMHgyMDAgMHg4MD47CisJCQkJfTsKKworCQkJCXJ0aWNfYzogcnRpYy1jQDQwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAorCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4NDAgMHgyMCAweDMwMCAweDgwPjsKKwkJCQl9OworCisJCQkJcnRpY19kOiBydGljLWRANjAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHg2MCAweDIwIDB4NTAwIDB4ODA+OworCQkJCX07CisJCQl9OworCQl9OworCisJCXNlY19tb246IHNlY19tb25AMzE0MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLW1vbiIsICJmc2wsc2VjLXY0LjAtbW9uIjsKKwkJCXJlZyA9IDwweDMxNDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw5MyAyIDAgMD47CisJCX07CisKKwl9OworCisJbG9jYWxidXNAZmZlMTI0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKKwkJaW50ZXJydXB0cyA9IDwyNSAyIDAgMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwl9OworCisJcGNpMDogcGNpZUBmZmUyMDAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OworCQlmc2wsbXNpID0gPCZtc2kwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OworCQlwY2llQDAgeworCQkJcmVnID0gPDAgMCAwIDAgMD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwICovCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0MCAxIDAgMAorCQkJCTAwMDAgMCAwIDIgJm1waWMgMSAxIDAgMAorCQkJCTAwMDAgMCAwIDMgJm1waWMgMiAxIDAgMAorCQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxIDAgMAorCQkJCT47CisJCX07CisJfTsKKworCXBjaTE6IHBjaWVAZmZlMjAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47CisJCWZzbCxtc2kgPSA8Jm1zaTE+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDE0PjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDAgKi8KKwkJCQkwMDAwIDAgMCAxICZtcGljIDQxIDEgMCAwCisJCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEgMCAwCisJCQkJMDAwMCAwIDAgMyAmbXBpYyA2IDEgMCAwCisJCQkJMDAwMCAwIDAgNCAmbXBpYyA3IDEgMCAwCisJCQkJPjsKKwkJfTsKKwl9OworCisJcGNpMjogcGNpZUBmZmUyMDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OworCQlmc2wsbXNpID0gPCZtc2kyPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTM+OworCQlwY2llQDAgeworCQkJcmVnID0gPDAgMCAwIDAgMD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMz47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwICovCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0MiAxIDAgMAorCQkJCTAwMDAgMCAwIDIgJm1waWMgOSAxIDAgMAorCQkJCTAwMDAgMCAwIDMgJm1waWMgMTAgMSAwIDAKKwkJCQkwMDAwIDAgMCA0ICZtcGljIDExIDEgMCAwCisJCQkJPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA0MWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA0MWRzLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWNhZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDQxZHMuZHRzCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogUDMwNDFEUyBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAxMC0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvaW5jbHVkZS8gInAzMDQxc2kuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiZnNsLFAzMDQxRFMiOworCWNvbXBhdGlibGUgPSAiZnNsLFAzMDQxRFMiOworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDI+OworCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwl9OworCisJc29jOiBzb2NAZmZlMDAwMDAwIHsKKwkJc3BpQDExMDAwMCB7CisJCQlmbGFzaEAwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQljb21wYXRpYmxlID0gInNwYW5zaW9uLHMyNXNsMTI4MDEiOworCQkJCXJlZyA9IDwwPjsKKwkJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw0MDAwMDAwMD47IC8qIGlucHV0IGNsb2NrICovCisJCQkJcGFydGl0aW9uQHUtYm9vdCB7CisJCQkJCWxhYmVsID0gInUtYm9vdCI7CisJCQkJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDAxMDAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25Aa2VybmVsIHsKKwkJCQkJbGFiZWwgPSAia2VybmVsIjsKKwkJCQkJcmVnID0gPDB4MDAxMDAwMDAgMHgwMDUwMDAwMD47CisJCQkJCXJlYWQtb25seTsKKwkJCQl9OworCQkJCXBhcnRpdGlvbkBkdGIgeworCQkJCQlsYWJlbCA9ICJkdGIiOworCQkJCQlyZWcgPSA8MHgwMDYwMDAwMCAweDAwMTAwMDAwPjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisJCQkJcGFydGl0aW9uQGZzIHsKKwkJCQkJbGFiZWwgPSAiZmlsZSBzeXN0ZW0iOworCQkJCQlyZWcgPSA8MHgwMDcwMDAwMCAweDAwOTAwMDAwPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlpMmNAMTE4MTAwIHsKKwkJCWVlcHJvbUA1MSB7CisJCQkJY29tcGF0aWJsZSA9ICJhdDI0LDI0YzI1NiI7CisJCQkJcmVnID0gPDB4NTE+OworCQkJfTsKKwkJCWVlcHJvbUA1MiB7CisJCQkJY29tcGF0aWJsZSA9ICJhdDI0LDI0YzI1NiI7CisJCQkJcmVnID0gPDB4NTI+OworCQkJfTsKKwkJfTsKKworCQlpMmNAMTE5MTAwIHsKKwkJCXJ0Y0A2OCB7CisJCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMzMjMyIjsKKwkJCQlyZWcgPSA8MHg2OD47CisJCQkJaW50ZXJydXB0cyA9IDwweDEgMHgxIDAgMD47CisJCQl9OworCQl9OworCX07CisKKwlsb2NhbGJ1c0BmZmUxMjQwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUxMjQwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGU4MDAwMDAwIDB4MDgwMDAwMDAKKwkJCSAgMiAwIDB4ZiAweGZmYTAwMDAwIDB4MDAwNDAwMDAKKwkJCSAgMyAwIDB4ZiAweGZmZGYwMDAwIDB4MDAwMDgwMDA+OworCisJCWZsYXNoQDAsMCB7CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQlyZWcgPSA8MCAwIDB4MDgwMDAwMDA+OworCQkJYmFuay13aWR0aCA9IDwyPjsKKwkJCWRldmljZS13aWR0aCA9IDwyPjsKKwkJfTsKKworCQluYW5kQDIsMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxiYy1mY20tbmFuZCI7CisJCQlyZWcgPSA8MHgyIDB4MCAweDQwMDAwPjsKKworCQkJcGFydGl0aW9uQDAgeworCQkJCWxhYmVsID0gIk5BTkQgVS1Cb290IEltYWdlIjsKKwkJCQlyZWcgPSA8MHgwIDB4MDIwMDAwMDA+OworCQkJCXJlYWQtb25seTsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAyMDAwMDAwIHsKKwkJCQlsYWJlbCA9ICJOQU5EIFJvb3QgRmlsZSBTeXN0ZW0iOworCQkJCXJlZyA9IDwweDAyMDAwMDAwIDB4MTAwMDAwMDA+OworCQkJfTsKKworCQkJcGFydGl0aW9uQDEyMDAwMDAwIHsKKwkJCQlsYWJlbCA9ICJOQU5EIENvbXByZXNzZWQgUkZTIEltYWdlIjsKKwkJCQlyZWcgPSA8MHgxMjAwMDAwMCAweDA4MDAwMDAwPjsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAxYTAwMDAwMCB7CisJCQkJbGFiZWwgPSAiTkFORCBMaW51eCBLZXJuZWwgSW1hZ2UiOworCQkJCXJlZyA9IDwweDFhMDAwMDAwIDB4MDQwMDAwMDA+OworCQkJfTsKKworCQkJcGFydGl0aW9uQDFlMDAwMDAwIHsKKwkJCQlsYWJlbCA9ICJOQU5EIERUQiBJbWFnZSI7CisJCQkJcmVnID0gPDB4MWUwMDAwMDAgMHgwMTAwMDAwMD47CisJCQl9OworCisJCQlwYXJ0aXRpb25AMWYwMDAwMDAgeworCQkJCWxhYmVsID0gIk5BTkQgV3JpdGFibGUgVXNlciBhcmVhIjsKKwkJCQlyZWcgPSA8MHgxZjAwMDAwMCAweDIxMDAwMDAwPjsKKwkJCX07CisJCX07CisKKwkJYm9hcmQtY29udHJvbEAzLDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDFkcy1waXhpcyI7CisJCQlyZWcgPSA8MyAwIDB4MjA+OworCQl9OworCX07CisKKwlwY2kwOiBwY2llQGZmZTIwMDAwMCB7CisJCXJlZyA9IDwweGYgMHhmZTIwMDAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHgwMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmODAwMDAwMCAweDAgMHgwMDAxMDAwMD47CisJCXBjaWVAMCB7CisJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAwIDB4MjAwMDAwMDAKKworCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAwIDB4MDAwMTAwMDA+OworCQl9OworCX07CisKKwlwY2kxOiBwY2llQGZmZTIwMTAwMCB7CisJCXJlZyA9IDwweGYgMHhmZTIwMTAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MCAweGUwMDAwMDAwIDB4YyAweDIwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMTAwMDAgMHgwIDB4MDAwMTAwMDA+OworCQlwY2llQDAgeworCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMCAweDAwMDEwMDAwPjsKKwkJfTsKKwl9OworCisJcGNpMjogcGNpZUBmZmUyMDIwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUyMDIwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAgMHhjIDB4NDAwMDAwMDAgMCAweDIwMDAwMDAwCisJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4ZiAweGY4MDIwMDAwIDAgMHgwMDAxMDAwMD47CisJCXBjaWVAMCB7CisJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAwIDB4MjAwMDAwMDAKKworCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAwIDB4MDAwMTAwMDA+OworCQl9OworCX07CisKKwlwY2kzOiBwY2llQGZmZTIwMzAwMCB7CisJCXJlZyA9IDwweGYgMHhmZTIwMzAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHg2MDAwMDAwMCAwIDB4MjAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMzAwMDAgMCAweDAwMDEwMDAwPjsKKwkJcGNpZUAwIHsKKwkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDAgMHgyMDAwMDAwMAorCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDAgMHgwMDAxMDAwMD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNDFzaS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDQxc2kuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjY5NTgwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDQxc2kuZHRzaQpAQCAtMCwwICsxLDY2MCBAQAorLyoKKyAqIFAzMDQxIFNpbGljb24gRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMTAtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2R0cy12MS87CisKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFAzMDQxIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQljY3NyID0gJnNvYzsKKworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJc2VyaWFsMiA9ICZzZXJpYWwyOworCQlzZXJpYWwzID0gJnNlcmlhbDM7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisJCXBjaTMgPSAmcGNpMzsKKwkJdXNiMCA9ICZ1c2IwOworCQl1c2IxID0gJnVzYjE7CisJCWRtYTAgPSAmZG1hMDsKKwkJZG1hMSA9ICZkbWExOworCQlzZGhjID0gJnNkaGM7CisJCW1zaTAgPSAmbXNpMDsKKwkJbXNpMSA9ICZtc2kxOworCQltc2kyID0gJm1zaTI7CisKKwkJY3J5cHRvID0gJmNyeXB0bzsKKwkJc2VjX2pyMCA9ICZzZWNfanIwOworCQlzZWNfanIxID0gJnNlY19qcjE7CisJCXNlY19qcjIgPSAmc2VjX2pyMjsKKwkJc2VjX2pyMyA9ICZzZWNfanIzOworCQlydGljX2EgPSAmcnRpY19hOworCQlydGljX2IgPSAmcnRpY19iOworCQlydGljX2MgPSAmcnRpY19jOworCQlydGljX2QgPSAmcnRpY19kOworCQlzZWNfbW9uID0gJnNlY19tb247CisKKy8qCisJCXJpbzAgPSAmcmFwaWRpbzA7CisgKi8KKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHUwOiBQb3dlclBDLGU1MDBtY0AwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKKwkJCUwyXzA6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1MTogUG93ZXJQQyxlNTAwbWNAMSB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDE+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CisJCQlMMl8xOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTI6IFBvd2VyUEMsZTUwMG1jQDIgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwyPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzI+OworCQkJTDJfMjogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHUzOiBQb3dlclBDLGU1MDBtY0AzIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8Mz47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zPjsKKwkJCUwyXzM6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwl9OworCisJc29jOiBzb2NAZmZlMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHhmZTAwMDAwMCAweDEwMDAwMDA+OworCQlyZWcgPSA8MHhmIDB4ZmUwMDAwMDAgMCAweDAwMDAxMDAwPjsKKworCQlzb2Mtc3JhbS1lcnJvciB7CisJCQljb21wYXRpYmxlID0gImZzbCxzb2Mtc3JhbS1lcnJvciI7CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyOT47CisJCX07CisKKwkJY29yZW5ldC1sYXdAMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWxhdyI7CisJCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCQlmc2wsbnVtLWxhd3MgPSA8MzI+OworCQl9OworCisJCW1lbW9yeS1jb250cm9sbGVyQDgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNSIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOworCQkJcmVnID0gPDB4ODAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OworCQl9OworCisJCWNwYzogbDMtY2FjaGUtY29udHJvbGxlckAxMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1sMy1jYWNoZS1jb250cm9sbGVyIiwgImZzbCxwNDA4MC1sMy1jYWNoZS1jb250cm9sbGVyIiwgImNhY2hlIjsKKwkJCXJlZyA9IDwweDEwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyNz47CisJCX07CisKKwkJY29yZW5ldC1jZkAxODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWNmIjsKKwkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAzMT47CisJCQlmc2wsY2NmLW51bS1jc2RpZHMgPSA8MzI+OworCQkJZnNsLGNjZi1udW0tc25vb3BpZHMgPSA8MzI+OworCQl9OworCisJCWlvbW11QDIwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHBhbXUtdjEuMCIsICJmc2wscGFtdSI7CisJCQlyZWcgPSA8MHgyMDAwMCAweDQwMDA+OworCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkyNCAyIDAgMAorCQkJCTE2IDIgMSAzMD47CisJCX07CisKKwkJbXBpYzogcGljQDQwMDAwIHsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDQ+OworCQkJcmVnID0gPDB4NDAwMDAgMHg0MDAwMD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljIiwgImNocnAsb3Blbi1waWMiOworCQkJZGV2aWNlX3R5cGUgPSAib3Blbi1waWMiOworCQl9OworCisJCW1zaTA6IG1zaUA0MTYwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7CisJCQlyZWcgPSA8MHg0MTYwMCAweDIwMD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhlMCAwIDAgMAorCQkJCTB4ZTEgMCAwIDAKKwkJCQkweGUyIDAgMCAwCisJCQkJMHhlMyAwIDAgMAorCQkJCTB4ZTQgMCAwIDAKKwkJCQkweGU1IDAgMCAwCisJCQkJMHhlNiAwIDAgMAorCQkJCTB4ZTcgMCAwIDA+OworCQl9OworCisJCW1zaTE6IG1zaUA0MTgwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7CisJCQlyZWcgPSA8MHg0MTgwMCAweDIwMD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhlOCAwIDAgMAorCQkJCTB4ZTkgMCAwIDAKKwkJCQkweGVhIDAgMCAwCisJCQkJMHhlYiAwIDAgMAorCQkJCTB4ZWMgMCAwIDAKKwkJCQkweGVkIDAgMCAwCisJCQkJMHhlZSAwIDAgMAorCQkJCTB4ZWYgMCAwIDA+OworCQl9OworCisJCW1zaTI6IG1zaUA0MWEwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7CisJCQlyZWcgPSA8MHg0MWEwMCAweDIwMD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhmMCAwIDAgMAorCQkJCTB4ZjEgMCAwIDAKKwkJCQkweGYyIDAgMCAwCisJCQkJMHhmMyAwIDAgMAorCQkJCTB4ZjQgMCAwIDAKKwkJCQkweGY1IDAgMCAwCisJCQkJMHhmNiAwIDAgMAorCQkJCTB4ZjcgMCAwIDA+OworCQl9OworCisJCWd1dHM6IGdsb2JhbC11dGlsaXRpZXNAZTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtZGV2aWNlLWNvbmZpZy0xLjAiOworCQkJcmVnID0gPDB4ZTAwMDAgMHhlMDA+OworCQkJZnNsLGhhcy1yc3RjcjsKKwkJCSNzbGVlcC1jZWxscyA9IDwxPjsKKwkJCWZzbCxsaW9kbi1iaXRzID0gPDEyPjsKKwkJfTsKKworCQlwaW5zOiBnbG9iYWwtdXRpbGl0aWVzQGUwZTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXBpbi1jb250cm9sLTEuMCI7CisJCQlyZWcgPSA8MHhlMGUwMCAweDIwMD47CisJCQkjc2xlZXAtY2VsbHMgPSA8Mj47CisJCX07CisKKwkJY2xvY2tnZW46IGdsb2JhbC11dGlsaXRpZXNAZTEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI7CisJCQlyZWcgPSA8MHhlMTAwMCAweDEwMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQl9OworCisJCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcmNwbS0xLjAiOworCQkJcmVnID0gPDB4ZTIwMDAgMHgxMDAwPjsKKwkJCSNzbGVlcC1jZWxscyA9IDwxPjsKKwkJfTsKKworCQlzZnA6IHNmcEBlODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1zZnAiLCAiZnNsLHFvcmlxLXNmcC0xLjAiOworCQkJcmVnCSAgID0gPDB4ZTgwMDAgMHgxMDAwPjsKKwkJfTsKKworCQlzZXJkZXM6IHNlcmRlc0BlYTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1zZXJkZXMiOworCQkJcmVnCSAgID0gPDB4ZWEwMDAgMHgxMDAwPjsKKwkJfTsKKworCQlkbWEwOiBkbWFAMTAwMzAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKKwkJCXJlZyA9IDwweDEwMDMwMCAweDQ+OworCQkJcmFuZ2VzID0gPDB4MCAweDEwMDEwMCAweDIwMD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJZG1hLWNoYW5uZWxAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CisJCQkJaW50ZXJydXB0cyA9IDwyOCAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4ODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDI5IDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJaW50ZXJydXB0cyA9IDwzMCAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OworCQkJCWludGVycnVwdHMgPSA8MzEgMiAwIDA+OworCQkJfTsKKwkJfTsKKworCQlkbWExOiBkbWFAMTAxMzAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKKwkJCXJlZyA9IDwweDEwMTMwMCAweDQ+OworCQkJcmFuZ2VzID0gPDB4MCAweDEwMTEwMCAweDIwMD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJZG1hLWNoYW5uZWxAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CisJCQkJaW50ZXJydXB0cyA9IDwzMiAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4ODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMzIDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJaW50ZXJydXB0cyA9IDwzNCAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OworCQkJCWludGVycnVwdHMgPSA8MzUgMiAwIDA+OworCQkJfTsKKwkJfTsKKworCQlzcGlAMTEwMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1lc3BpIiwgImZzbCxtcGM4NTM2LWVzcGkiOworCQkJcmVnID0gPDB4MTEwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDUzIDB4MiAwIDA+OworCQkJZnNsLGVzcGktbnVtLWNoaXBzZWxlY3RzID0gPDQ+OworCQl9OworCisJCXNkaGM6IHNkaGNAMTE0MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWVzZGhjIiwgImZzbCxlc2RoYyI7CisJCQlyZWcgPSA8MHgxMTQwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NDggMiAwIDA+OworCQkJc2RoY2ksYXV0by1jbWQxMjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJfTsKKworCQlpMmNAMTE4MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExODAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM4IDIgMCAwPjsKKwkJCWRmc3JyOworCQl9OworCisJCWkyY0AxMTgxMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE4MTAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzggMiAwIDA+OworCQkJZGZzcnI7CisJCX07CisKKwkJaTJjQDExOTAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgxMTkwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwzOSAyIDAgMD47CisJCQlkZnNycjsKKwkJfTsKKworCQlpMmNAMTE5MTAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDM+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExOTEwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM5IDIgMCAwPjsKKwkJCWRmc3JyOworCQl9OworCisJCXNlcmlhbDA6IHNlcmlhbEAxMWM1MDAgeworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFjNTAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzYgMiAwIDA+OworCQl9OworCisJCXNlcmlhbDE6IHNlcmlhbEAxMWM2MDAgeworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFjNjAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzYgMiAwIDA+OworCQl9OworCisJCXNlcmlhbDI6IHNlcmlhbEAxMWQ1MDAgeworCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFkNTAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzcgMiAwIDA+OworCQl9OworCisJCXNlcmlhbDM6IHNlcmlhbEAxMWQ2MDAgeworCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFkNjAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzcgMiAwIDA+OworCQl9OworCisJCWdwaW8wOiBncGlvQDEzMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1ncGlvIiwgImZzbCxxb3JpcS1ncGlvIjsKKwkJCXJlZyA9IDwweDEzMDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw1NSAyIDAgMD47CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJfTsKKworCQl1c2IwOiB1c2JAMjEwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXVzYjItbXBoIiwKKwkJCQkJImZzbCxtcGM4NXh4LXVzYjItbXBoIiwgImZzbC11c2IyLW1waCI7CisJCQlyZWcgPSA8MHgyMTAwMDAgMHgxMDAwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQ0IDB4MiAwIDA+OworCQkJcGh5X3R5cGUgPSAidXRtaSI7CisJCQlwb3J0MDsKKwkJfTsKKworCQl1c2IxOiB1c2JAMjExMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXVzYjItZHIiLAorCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1kciIsICJmc2wtdXNiMi1kciI7CisJCQlyZWcgPSA8MHgyMTEwMDAgMHgxMDAwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQ1IDB4MiAwIDA+OworCQkJZHJfbW9kZSA9ICJob3N0IjsKKwkJCXBoeV90eXBlID0gInV0bWkiOworCQl9OworCisJCXNhdGFAMjIwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXNhdGEiLCAiZnNsLHBxLXNhdGEtdjIiOworCQkJcmVnID0gPDB4MjIwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDY4IDB4MiAwIDA+OworCQl9OworCisJCXNhdGFAMjIxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXNhdGEiLCAiZnNsLHBxLXNhdGEtdjIiOworCQkJcmVnID0gPDB4MjIxMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDY5IDB4MiAwIDA+OworCQl9OworCisJCWNyeXB0bzogY3J5cHRvQDMwMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMiIsICJmc2wsc2VjLXY0LjAiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZwkJID0gPDB4MzAwMDAwIDB4MTAwMDA+OworCQkJcmFuZ2VzCQkgPSA8MCAweDMwMDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdHMJID0gPDkyIDIgMCAwPjsKKworCQkJc2VjX2pyMDoganJAMTAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg4IDIgMCAwPjsKKwkJCX07CisKKwkJCXNlY19qcjE6IGpyQDIwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKKwkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw4OSAyIDAgMD47CisJCQl9OworCisJCQlzZWNfanIyOiBqckAzMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQkJcmVnID0gPDB4MzAwMCAweDEwMDA+OworCQkJCWludGVycnVwdHMgPSA8OTAgMiAwIDA+OworCQkJfTsKKworCQkJc2VjX2pyMzoganJANDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDQwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDkxIDIgMCAwPjsKKwkJCX07CisKKwkJCXJ0aWNANjAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYyIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljIjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQlyZWcgPSA8MHg2MDAwIDB4MTAwPjsKKwkJCQlyYW5nZXMgPSA8MHgwIDB4NjEwMCAweGUwMD47CisKKwkJCQlydGljX2E6IHJ0aWMtYUAwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAorCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4MDAgMHgyMCAweDEwMCAweDgwPjsKKwkJCQl9OworCisJCQkJcnRpY19iOiBydGljLWJAMjAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHgyMCAweDIwIDB4MjAwIDB4ODA+OworCQkJCX07CisKKwkJCQlydGljX2M6IHJ0aWMtY0A0MCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKKwkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJCXJlZyA9IDwweDQwIDB4MjAgMHgzMDAgMHg4MD47CisJCQkJfTsKKworCQkJCXJ0aWNfZDogcnRpYy1kQDYwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAorCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4NjAgMHgyMCAweDUwMCAweDgwPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlzZWNfbW9uOiBzZWNfbW9uQDMxNDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1tb24iLCAiZnNsLHNlYy12NC4wLW1vbiI7CisJCQlyZWcgPSA8MHgzMTQwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8OTMgMiAwIDA+OworCQl9OworCX07CisKKy8qCisJcmFwaWRpbzA6IHJhcGlkaW9AZmZlMGMwMDAwCisqLworCisJbG9jYWxidXNAZmZlMTI0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKKwkJaW50ZXJydXB0cyA9IDwyNSAyIDAgMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwl9OworCisJcGNpMDogcGNpZUBmZmUyMDAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OworCQlmc2wsbXNpID0gPCZtc2kwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OworCisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDAgKi8KKwkJCQkwMDAwIDAgMCAxICZtcGljIDQwIDEgMCAwCisJCQkJMDAwMCAwIDAgMiAmbXBpYyAxIDEgMCAwCisJCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEgMCAwCisJCQkJMDAwMCAwIDAgNCAmbXBpYyAzIDEgMCAwCisJCQkJPjsKKwkJfTsKKwl9OworCisJcGNpMTogcGNpZUBmZmUyMDEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWJ1cy1yYW5nZSA9IDwwIDB4ZmY+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MHgxZmNhMDU1PjsKKwkJZnNsLG1zaSA9IDwmbXNpMT47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDE0PjsKKwkJcGNpZUAwIHsKKwkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJCS8qIElEU0VMIDB4MCAqLworCQkJCTAwMDAgMCAwIDEgJm1waWMgNDEgMSAwIDAKKwkJCQkwMDAwIDAgMCAyICZtcGljIDUgMSAwIDAKKwkJCQkwMDAwIDAgMCAzICZtcGljIDYgMSAwIDAKKwkJCQkwMDAwIDAgMCA0ICZtcGljIDcgMSAwIDAKKwkJCQk+OworCQl9OworCX07CisKKwlwY2kyOiBwY2llQGZmZTIwMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47CisJCWZzbCxtc2kgPSA8Jm1zaTI+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMz47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDAgKi8KKwkJCQkwMDAwIDAgMCAxICZtcGljIDQyIDEgMCAwCisJCQkJMDAwMCAwIDAgMiAmbXBpYyA5IDEgMCAwCisJCQkJMDAwMCAwIDAgMyAmbXBpYyAxMCAxIDAgMAorCQkJCTAwMDAgMCAwIDQgJm1waWMgMTEgMSAwIDAKKwkJCQk+OworCQl9OworCX07CisKKwlwY2kzOiBwY2llQGZmZTIwMzAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47CisJCWZzbCxtc2kgPSA8Jm1zaTI+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMj47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDEyPjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDAgKi8KKwkJCQkwMDAwIDAgMCAxICZtcGljIDQzIDEgMCAwCisJCQkJMDAwMCAwIDAgMiAmbXBpYyAwIDEgMCAwCisJCQkJMDAwMCAwIDAgMyAmbXBpYyA0IDEgMCAwCisJCQkJMDAwMCAwIDAgNCAmbXBpYyA4IDEgMCAwCisJCQkJPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MGRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MGRzLmR0cwppbmRleCA5MjdmOTRkLi5lYjExMDk4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A0MDgwZHMuZHRzCkBAIC0zLDI1OCArMyw1MCBAQAogICoKICAqIENvcHlyaWdodCAyMDA5LTIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQlpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mCXRoZSBHTlUgR2VuZXJhbAkgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gInA0MDgwc2kuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAiZnNsLFA0MDgwRFMiOwogCWNvbXBhdGlibGUgPSAiZnNsLFA0MDgwRFMiOwogCSNhZGRyZXNzLWNlbGxzID0gPDI+OwogCSNzaXplLWNlbGxzID0gPDI+OwotCi0JYWxpYXNlcyB7Ci0JCWNjc3IgPSAmc29jOwotCi0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJc2VyaWFsMSA9ICZzZXJpYWwxOwotCQlzZXJpYWwyID0gJnNlcmlhbDI7Ci0JCXNlcmlhbDMgPSAmc2VyaWFsMzsKLQkJcGNpMCA9ICZwY2kwOwotCQlwY2kxID0gJnBjaTE7Ci0JCXBjaTIgPSAmcGNpMjsKLQkJdXNiMCA9ICZ1c2IwOwotCQl1c2IxID0gJnVzYjE7Ci0JCWRtYTAgPSAmZG1hMDsKLQkJZG1hMSA9ICZkbWExOwotCQlzZGhjID0gJnNkaGM7Ci0KLQkJY3J5cHRvID0gJmNyeXB0bzsKLQkJc2VjX2pyMCA9ICZzZWNfanIwOwotCQlzZWNfanIxID0gJnNlY19qcjE7Ci0JCXNlY19qcjIgPSAmc2VjX2pyMjsKLQkJc2VjX2pyMyA9ICZzZWNfanIzOwotCQlydGljX2EgPSAmcnRpY19hOwotCQlydGljX2IgPSAmcnRpY19iOwotCQlydGljX2MgPSAmcnRpY19jOwotCQlydGljX2QgPSAmcnRpY19kOwotCQlzZWNfbW9uID0gJnNlY19tb247Ci0KLQkJcmlvMCA9ICZyYXBpZGlvMDsKLQl9OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQljcHUwOiBQb3dlclBDLDQwODBAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMD47Ci0JCQlMMl8wOiBsMi1jYWNoZSB7Ci0JCQl9OwotCQl9OwotCQljcHUxOiBQb3dlclBDLDQwODBAMSB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDE+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47Ci0JCQlMMl8xOiBsMi1jYWNoZSB7Ci0JCQl9OwotCQl9OwotCQljcHUyOiBQb3dlclBDLDQwODBAMiB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDI+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47Ci0JCQlMMl8yOiBsMi1jYWNoZSB7Ci0JCQl9OwotCQl9OwotCQljcHUzOiBQb3dlclBDLDQwODBAMyB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDM+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47Ci0JCQlMMl8zOiBsMi1jYWNoZSB7Ci0JCQl9OwotCQl9OwotCQljcHU0OiBQb3dlclBDLDQwODBANCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDQ+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfND47Ci0JCQlMMl80OiBsMi1jYWNoZSB7Ci0JCQl9OwotCQl9OwotCQljcHU1OiBQb3dlclBDLDQwODBANSB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDU+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNT47Ci0JCQlMMl81OiBsMi1jYWNoZSB7Ci0JCQl9OwotCQl9OwotCQljcHU2OiBQb3dlclBDLDQwODBANiB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDY+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNj47Ci0JCQlMMl82OiBsMi1jYWNoZSB7Ci0JCQl9OwotCQl9OwotCQljcHU3OiBQb3dlclBDLDQwODBANyB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDc+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNz47Ci0JCQlMMl83OiBsMi1jYWNoZSB7Ci0JCQl9OwotCQl9OwotCX07CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAKIAltZW1vcnkgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCX07CiAKIAlzb2M6IHNvY0BmZmUwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWRldmljZV90eXBlID0gInNvYyI7Ci0JCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7Ci0JCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweGZlMDAwMDAwIDB4MTAwMDAwMD47Ci0JCXJlZyA9IDwweGYgMHhmZTAwMDAwMCAwIDB4MDAwMDEwMDA+OwotCi0JCWNvcmVuZXQtbGF3QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsY29yZW5ldC1sYXciOwotCQkJcmVnID0gPDB4MCAweDEwMDA+OwotCQkJZnNsLG51bS1sYXdzID0gPDMyPjsKLQkJfTsKLQotCQltZW1vcnktY29udHJvbGxlckA4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLW1lbW9yeS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwweDEyIDI+OwotCQl9OwotCi0JCW1lbW9yeS1jb250cm9sbGVyQDkwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4OTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDB4MTIgMj47Ci0JCX07Ci0KLQkJY29yZW5ldC1jZkAxODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWNmIjsKLQkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47Ci0JCQlmc2wsY2NmLW51bS1jc2RpZHMgPSA8MzI+OwotCQkJZnNsLGNjZi1udW0tc25vb3BpZHMgPSA8MzI+OwotCQl9OwotCi0JCWlvbW11QDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLXBhbXUiOwotCQkJcmVnID0gPDB4MjAwMDAgMHgxMDAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDI0IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJbXBpYzogcGljQDQwMDAwIHsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQkJcmVnID0gPDB4NDAwMDAgMHg0MDAwMD47Ci0JCQljb21wYXRpYmxlID0gImNocnAsb3Blbi1waWMiOwotCQkJZGV2aWNlX3R5cGUgPSAib3Blbi1waWMiOwotCQl9OwotCi0JCWRtYTA6IGRtYUAxMDAzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MTAwMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MTAwMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDI4IDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyOSAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTAwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMCAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAyPjsKLQkJCX07Ci0JCX07Ci0KLQkJZG1hMTogZG1hQDEwMTMwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7Ci0JCQlyZWcgPSA8MHgxMDEzMDAgMHg0PjsKLQkJCXJhbmdlcyA9IDwweDAgMHgxMDExMDAgMHgyMDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDA+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzIgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMzIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM0IDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDE4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDI+OwotCQkJfTsKLQkJfTsKLQogCQlzcGlAMTEwMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1lc3BpIiwgImZzbCxtcGM4NTM2LWVzcGkiOwotCQkJcmVnID0gPDB4MTEwMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDUzIDB4Mj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDw0PjsKLQogCQkJZmxhc2hAMCB7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkJI3NpemUtY2VsbHMgPSA8MT47CkBAIC0yODMsMzUgKzc1LDcgQEAKIAkJCX07CiAJCX07CiAKLQkJc2RoYzogc2RoY0AxMTQwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZXNkaGMiLCAiZnNsLGVzZGhjIjsKLQkJCXJlZyA9IDwweDExNDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0OCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJdm9sdGFnZS1yYW5nZXMgPSA8MzMwMCAzMzAwPjsKLQkJCXNkaGNpLGF1dG8tY21kMTI7Ci0JCX07Ci0KLQkJaTJjQDExODAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgxMTgwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzOCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZGZzcnI7Ci0JCX07Ci0KIAkJaTJjQDExODEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgxMTgxMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzOCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZGZzcnI7CiAJCQllZXByb21ANTEgewogCQkJCWNvbXBhdGlibGUgPSAiYXQyNCwyNGMyNTYiOwogCQkJCXJlZyA9IDwweDUxPjsKQEAgLTMyMywxOTggKzg3LDI3IEBACiAJCQlydGNANjggewogCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMzIzMiI7CiAJCQkJcmVnID0gPDB4Njg+OwotCQkJCWludGVycnVwdHMgPSA8MCAweDE+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MHgxIDB4MSAwIDA+OwogCQkJfTsKIAkJfTsKIAotCQlpMmNAMTE5MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDExOTAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM5IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMTE5MTAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDExOTEwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM5IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlzZXJpYWwwOiBzZXJpYWxAMTFjNTAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDExYzUwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM2IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJc2VyaWFsMTogc2VyaWFsQDExYzYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWM2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNiAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCXNlcmlhbDI6IHNlcmlhbEAxMWQ1MDAgewotCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4MTFkNTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8MzcgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlzZXJpYWwzOiBzZXJpYWxAMTFkNjAwIHsKLQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDExZDYwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM3IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJZ3BpbzA6IGdwaW9AMTMwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWdwaW8iOwotCQkJcmVnID0gPDB4MTMwMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDU1IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJfTsKLQogCQl1c2IwOiB1c2JAMjEwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLXVzYjItbXBoIiwKLQkJCQkJImZzbCxtcGM4NXh4LXVzYjItbXBoIiwgImZzbC11c2IyLW1waCI7Ci0JCQlyZWcgPSA8MHgyMTAwMDAgMHgxMDAwPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8NDQgMHgyPjsKIAkJCXBoeV90eXBlID0gInVscGkiOwogCQl9OwogCiAJCXVzYjE6IHVzYkAyMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtdXNiMi1kciIsCi0JCQkJCSJmc2wsbXBjODV4eC11c2IyLWRyIiwgImZzbC11c2IyLWRyIjsKLQkJCXJlZyA9IDwweDIxMTAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDw0NSAweDI+OwogCQkJZHJfbW9kZSA9ICJob3N0IjsKIAkJCXBoeV90eXBlID0gInVscGkiOwogCQl9OwotCi0JCWNyeXB0bzogY3J5cHRvQDMwMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMCI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJcmVnID0gPDB4MzAwMDAwIDB4MTAwMDA+OwotCQkJcmFuZ2VzID0gPDAgMHgzMDAwMDAgMHgxMDAwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8OTIgMj47Ci0KLQkJCXNlY19qcjA6IGpyQDEwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw4OCAyPjsKLQkJCX07Ci0KLQkJCXNlY19qcjE6IGpyQDIwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw4OSAyPjsKLQkJCX07Ci0KLQkJCXNlY19qcjI6IGpyQDMwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHgzMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw5MCAyPjsKLQkJCX07Ci0KLQkJCXNlY19qcjM6IGpyQDQwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHg0MDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw5MSAyPjsKLQkJCX07Ci0KLQkJCXJ0aWNANjAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAtcnRpYyI7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJcmVnID0gPDB4NjAwMCAweDEwMD47Ci0JCQkJcmFuZ2VzID0gPDB4MCAweDYxMDAgMHhlMDA+OwotCi0JCQkJcnRpY19hOiBydGljLWFAMCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKLQkJCQkJcmVnID0gPDB4MDAgMHgyMCAweDEwMCAweDgwPjsKLQkJCQl9OwotCi0JCQkJcnRpY19iOiBydGljLWJAMjAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDIwIDB4MjAgMHgyMDAgMHg4MD47Ci0JCQkJfTsKLQotCQkJCXJ0aWNfYzogcnRpYy1jQDQwIHsKLQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHg0MCAweDIwIDB4MzAwIDB4ODA+OwotCQkJCX07Ci0KLQkJCQlydGljX2Q6IHJ0aWMtZEA2MCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKLQkJCQkJcmVnID0gPDB4NjAgMHgyMCAweDUwMCAweDgwPjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQlzZWNfbW9uOiBzZWNfbW9uQDMxNDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMC1tb24iOwotCQkJcmVnID0gPDB4MzE0MDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8OTMgMj47Ci0JCX07CiAJfTsKIAogCXJhcGlkaW8wOiByYXBpZGlvQGZmZTBjMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wscmFwaWRpby1kZWx0YSI7CiAJCXJlZyA9IDwweGYgMHhmZTBjMDAwMCAwIDB4MjAwMDA+OwotCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGY1MDAwMDAwIDAgMHgwMTAwMDAwMD47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkvKiBlcnJfaXJxIGJlbGxfb3V0Yl9pcnEgYmVsbF9pbmJfaXJxCi0JCQltc2cxX3R4X2lycSBtc2cxX3J4X2lycQltc2cyX3R4X2lycSBtc2cyX3J4X2lycSAqLwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgNTYgMiA1NyAyIDYwIDIgNjEgMiA2MiAyIDYzIDI+OworCQlyYW5nZXMgPSA8MCAwIDB4YyAweDIwMDAwMDAwIDAgMHgwMTAwMDAwMD47CiAJfTsKIAogCWxvY2FsYnVzQGZmZTEyNDAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWVsYmMiLCAiZnNsLGVsYmMiLCAic2ltcGxlLWJ1cyI7CiAJCXJlZyA9IDwweGYgMHhmZTEyNDAwMCAwIDB4MTAwMD47Ci0JCWludGVycnVwdHMgPSA8MjUgMj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQogCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGU4MDAwMDAwIDB4MDgwMDAwMDA+OwogCiAJCWZsYXNoQDAsMCB7CkBAIC01MjYsMzIgKzExOSwxMCBAQAogCX07CiAKIAlwY2kwOiBwY2llQGZmZTIwMDAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLXBjaWUiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCXJlZyA9IDwweGYgMHhmZTIwMDAwMCAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CiAJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHgwMDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmODAwMDAwMCAweDAgMHgwMDAxMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAwIDAgMSAmbXBpYyA0MCAxCi0JCQkwMDAwIDAgMCAyICZtcGljIDEgMQotCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEKLQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxCi0JCQk+OwogCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAogCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDAgMHgyMDAwMDAwMApAQCAtNTYzLDMxICsxMzQsMTAgQEAKIAl9OwogCiAJcGNpMTogcGNpZUBmZmUyMDEwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwogCQlyZWcgPSA8MHhmIDB4ZmUyMDEwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAgMHhjIDB4MjAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmODAxMDAwMCAweDAgMHgwMDAxMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMCAwIDEgJm1waWMgNDEgMQotCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEKLQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxCi0JCQkwMDAwIDAgMCA0ICZtcGljIDcgMQotCQkJPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCiAJCQkJICAwIDB4MjAwMDAwMDAKQEAgLTU5OSwzMSArMTQ5LDEwIEBACiAJfTsKIAogCXBjaTI6IHBjaWVAZmZlMjAyMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJcmVnID0gPDB4ZiAweGZlMjAyMDAwIDAgMHgxMDAwPjsKLQkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDQwMDAwMDAwIDAgMHgyMDAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmODAyMDAwMCAwIDB4MDAwMTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MHgxZmNhMDU1PjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MTYgMj47Ci0JCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwotCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJLyogSURTRUwgMHgwICovCi0JCQkwMDAwIDAgMCAxICZtcGljIDQyIDEKLQkJCTAwMDAgMCAwIDIgJm1waWMgOSAxCi0JCQkwMDAwIDAgMCAzICZtcGljIDEwIDEKLQkJCTAwMDAgMCAwIDQgJm1waWMgMTEgMQotCQkJPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCiAJCQkJICAwIDB4MjAwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MHNpLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBzaS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTA1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBzaS5kdHNpCkBAIC0wLDAgKzEsNjYxIEBACisvKgorICogUDQwODAgU2lsaWNvbiBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAwOS0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvZHRzLXYxLzsKKworLyB7CisJY29tcGF0aWJsZSA9ICJmc2wsUDQwODAiOworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDI+OworCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCisJYWxpYXNlcyB7CisJCWNjc3IgPSAmc29jOworCisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlzZXJpYWwyID0gJnNlcmlhbDI7CisJCXNlcmlhbDMgPSAmc2VyaWFsMzsKKwkJcGNpMCA9ICZwY2kwOworCQlwY2kxID0gJnBjaTE7CisJCXBjaTIgPSAmcGNpMjsKKwkJdXNiMCA9ICZ1c2IwOworCQl1c2IxID0gJnVzYjE7CisJCWRtYTAgPSAmZG1hMDsKKwkJZG1hMSA9ICZkbWExOworCQlzZGhjID0gJnNkaGM7CisJCW1zaTAgPSAmbXNpMDsKKwkJbXNpMSA9ICZtc2kxOworCQltc2kyID0gJm1zaTI7CisKKwkJY3J5cHRvID0gJmNyeXB0bzsKKwkJc2VjX2pyMCA9ICZzZWNfanIwOworCQlzZWNfanIxID0gJnNlY19qcjE7CisJCXNlY19qcjIgPSAmc2VjX2pyMjsKKwkJc2VjX2pyMyA9ICZzZWNfanIzOworCQlydGljX2EgPSAmcnRpY19hOworCQlydGljX2IgPSAmcnRpY19iOworCQlydGljX2MgPSAmcnRpY19jOworCQlydGljX2QgPSAmcnRpY19kOworCQlzZWNfbW9uID0gJnNlY19tb247CisKKwkJcmlvMCA9ICZyYXBpZGlvMDsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHUwOiBQb3dlclBDLDQwODBAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDA+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMD47CisJCQlMMl8wOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTE6IFBvd2VyUEMsNDA4MEAxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MT47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKKwkJCUwyXzE6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1MjogUG93ZXJQQyw0MDgwQDIgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwyPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzI+OworCQkJTDJfMjogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHUzOiBQb3dlclBDLDQwODBAMyB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDM+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47CisJCQlMMl8zOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTQ6IFBvd2VyUEMsNDA4MEA0IHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8ND47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl80PjsKKwkJCUwyXzQ6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1NTogUG93ZXJQQyw0MDgwQDUgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDw1PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzU+OworCQkJTDJfNTogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHU2OiBQb3dlclBDLDQwODBANiB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDY+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNj47CisJCQlMMl82OiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTc6IFBvd2VyUEMsNDA4MEA3IHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8Nz47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl83PjsKKwkJCUwyXzc6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwl9OworCisJc29jOiBzb2NAZmZlMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHhmZTAwMDAwMCAweDEwMDAwMDA+OworCQlyZWcgPSA8MHhmIDB4ZmUwMDAwMDAgMCAweDAwMDAxMDAwPjsKKworCQlzb2Mtc3JhbS1lcnJvciB7CisJCQljb21wYXRpYmxlID0gImZzbCxzb2Mtc3JhbS1lcnJvciI7CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyOT47CisJCX07CisKKwkJY29yZW5ldC1sYXdAMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWxhdyI7CisJCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCQlmc2wsbnVtLWxhd3MgPSA8MzI+OworCQl9OworCisJCW1lbW9yeS1jb250cm9sbGVyQDgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNCIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOworCQkJcmVnID0gPDB4ODAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OworCQl9OworCisJCW1lbW9yeS1jb250cm9sbGVyQDkwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNCIsImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7CisJCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMj47CisJCX07CisKKwkJY3BjOiBsMy1jYWNoZS1jb250cm9sbGVyQDEwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiY2FjaGUiOworCQkJcmVnID0gPDB4MTAwMDAgMHgxMDAwCisJCQkgICAgICAgMHgxMTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjcKKwkJCQkgICAgICAxNiAyIDEgMjY+OworCQl9OworCisJCWNvcmVuZXQtY2ZAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsY29yZW5ldC1jZiI7CisJCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMzE+OworCQkJZnNsLGNjZi1udW0tY3NkaWRzID0gPDMyPjsKKwkJCWZzbCxjY2YtbnVtLXNub29waWRzID0gPDMyPjsKKwkJfTsKKworCQlpb21tdUAyMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwYW11LXYxLjAiLCAiZnNsLHBhbXUiOworCQkJcmVnID0gPDB4MjAwMDAgMHg1MDAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMjQgMiAwIDAKKwkJCQkxNiAyIDEgMzA+OworCQl9OworCisJCW1waWM6IHBpY0A0MDAwMCB7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDw0PjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYyIsICJjaHJwLG9wZW4tcGljIjsKKwkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKKwkJfTsKKworCQltc2kwOiBtc2lANDE2MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDE2MDAgMHgyMDA+OworCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTB4ZTAgMCAwIDAKKwkJCQkweGUxIDAgMCAwCisJCQkJMHhlMiAwIDAgMAorCQkJCTB4ZTMgMCAwIDAKKwkJCQkweGU0IDAgMCAwCisJCQkJMHhlNSAwIDAgMAorCQkJCTB4ZTYgMCAwIDAKKwkJCQkweGU3IDAgMCAwPjsKKwkJfTsKKworCQltc2kxOiBtc2lANDE4MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDE4MDAgMHgyMDA+OworCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTB4ZTggMCAwIDAKKwkJCQkweGU5IDAgMCAwCisJCQkJMHhlYSAwIDAgMAorCQkJCTB4ZWIgMCAwIDAKKwkJCQkweGVjIDAgMCAwCisJCQkJMHhlZCAwIDAgMAorCQkJCTB4ZWUgMCAwIDAKKwkJCQkweGVmIDAgMCAwPjsKKwkJfTsKKworCQltc2kyOiBtc2lANDFhMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDFhMDAgMHgyMDA+OworCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTB4ZjAgMCAwIDAKKwkJCQkweGYxIDAgMCAwCisJCQkJMHhmMiAwIDAgMAorCQkJCTB4ZjMgMCAwIDAKKwkJCQkweGY0IDAgMCAwCisJCQkJMHhmNSAwIDAgMAorCQkJCTB4ZjYgMCAwIDAKKwkJCQkweGY3IDAgMCAwPjsKKwkJfTsKKworCQlndXRzOiBnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWRldmljZS1jb25maWctMS4wIjsKKwkJCXJlZyA9IDwweGUwMDAwIDB4ZTAwPjsKKwkJCWZzbCxoYXMtcnN0Y3I7CisJCQkjc2xlZXAtY2VsbHMgPSA8MT47CisJCQlmc2wsbGlvZG4tYml0cyA9IDwxMj47CisJCX07CisKKwkJcGluczogZ2xvYmFsLXV0aWxpdGllc0BlMGUwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1waW4tY29udHJvbC0xLjAiOworCQkJcmVnID0gPDB4ZTBlMDAgMHgyMDA+OworCQkJI3NsZWVwLWNlbGxzID0gPDI+OworCQl9OworCisJCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0xLjAiOworCQkJcmVnID0gPDB4ZTEwMDAgMHgxMDAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJfTsKKworCQlyY3BtOiBnbG9iYWwtdXRpbGl0aWVzQGUyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXJjcG0tMS4wIjsKKwkJCXJlZyA9IDwweGUyMDAwIDB4MTAwMD47CisJCQkjc2xlZXAtY2VsbHMgPSA8MT47CisJCX07CisKKwkJc2ZwOiBzZnBAZTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtc2ZwIiwgImZzbCxxb3JpcS1zZnAtMS4wIjsKKwkJCXJlZwkgICA9IDwweGU4MDAwIDB4MTAwMD47CisJCX07CisKKwkJc2VyZGVzOiBzZXJkZXNAZWEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtc2VyZGVzIjsKKwkJCXJlZwkgICA9IDwweGVhMDAwIDB4MTAwMD47CisJCX07CisKKwkJZG1hMDogZG1hQDEwMDMwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7CisJCQlyZWcgPSA8MHgxMDAzMDAgMHg0PjsKKwkJCXJhbmdlcyA9IDwweDAgMHgxMDAxMDAgMHgyMDA+OworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRtYS1jaGFubmVsQDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWludGVycnVwdHMgPSA8MjggMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CisJCQkJaW50ZXJydXB0cyA9IDwyOSAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OworCQkJCWludGVycnVwdHMgPSA8MzAgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDE4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMxIDIgMCAwPjsKKwkJCX07CisJCX07CisKKwkJZG1hMTogZG1hQDEwMTMwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7CisJCQlyZWcgPSA8MHgxMDEzMDAgMHg0PjsKKwkJCXJhbmdlcyA9IDwweDAgMHgxMDExMDAgMHgyMDA+OworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRtYS1jaGFubmVsQDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWludGVycnVwdHMgPSA8MzIgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CisJCQkJaW50ZXJydXB0cyA9IDwzMyAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OworCQkJCWludGVycnVwdHMgPSA8MzQgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDE4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM1IDIgMCAwPjsKKwkJCX07CisJCX07CisKKwkJc3BpQDExMDAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZXNwaSIsICJmc2wsbXBjODUzNi1lc3BpIjsKKwkJCXJlZyA9IDwweDExMDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw1MyAweDIgMCAwPjsKKwkJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDw0PjsKKwkJfTsKKworCQlzZGhjOiBzZGhjQDExNDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1lc2RoYyIsICJmc2wsZXNkaGMiOworCQkJcmVnID0gPDB4MTE0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQ4IDIgMCAwPjsKKwkJCXZvbHRhZ2UtcmFuZ2VzID0gPDMzMDAgMzMwMD47CisJCQlzZGhjaSxhdXRvLWNtZDEyOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQl9OworCisJCWkyY0AxMTgwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE4MDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzggMiAwIDA+OworCQkJZGZzcnI7CisJCX07CisKKwkJaTJjQDExODEwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgxMTgxMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47CisJCQlkZnNycjsKKwkJfTsKKworCQlpMmNAMTE5MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDI+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExOTAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM5IDIgMCAwPjsKKwkJCWRmc3JyOworCQl9OworCisJCWkyY0AxMTkxMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE5MTAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OworCQkJZGZzcnI7CisJCX07CisKKwkJc2VyaWFsMDogc2VyaWFsQDExYzUwMCB7CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8MHgxMWM1MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47CisJCX07CisKKwkJc2VyaWFsMTogc2VyaWFsQDExYzYwMCB7CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8MHgxMWM2MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47CisJCX07CisKKwkJc2VyaWFsMjogc2VyaWFsQDExZDUwMCB7CisJCQljZWxsLWluZGV4ID0gPDI+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8MHgxMWQ1MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47CisJCX07CisKKwkJc2VyaWFsMzogc2VyaWFsQDExZDYwMCB7CisJCQljZWxsLWluZGV4ID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8MHgxMWQ2MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47CisJCX07CisKKwkJZ3BpbzA6IGdwaW9AMTMwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWdwaW8iLCAiZnNsLHFvcmlxLWdwaW8iOworCQkJcmVnID0gPDB4MTMwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDU1IDIgMCAwPjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQl9OworCisJCXVzYjA6IHVzYkAyMTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtdXNiMi1tcGgiLAorCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1tcGgiLCAiZnNsLXVzYjItbXBoIjsKKwkJCXJlZyA9IDwweDIxMDAwMCAweDEwMDA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8NDQgMHgyIDAgMD47CisJCX07CisKKwkJdXNiMTogdXNiQDIxMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC11c2IyLWRyIiwKKwkJCQkJImZzbCxtcGM4NXh4LXVzYjItZHIiLCAiZnNsLXVzYjItZHIiOworCQkJcmVnID0gPDB4MjExMDAwIDB4MTAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDw0NSAweDIgMCAwPjsKKwkJfTsKKworCQljcnlwdG86IGNyeXB0b0AzMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDMwMDAwMCAweDEwMDAwPjsKKwkJCXJhbmdlcyA9IDwwIDB4MzAwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDkyIDIgMCAwPjsKKworCQkJc2VjX2pyMDoganJAMTAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg4IDIgMCAwPjsKKwkJCX07CisKKwkJCXNlY19qcjE6IGpyQDIwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDw4OSAyIDAgMD47CisJCQl9OworCisJCQlzZWNfanIyOiBqckAzMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQkJcmVnID0gPDB4MzAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8OTAgMiAwIDA+OworCQkJfTsKKworCQkJc2VjX2pyMzoganJANDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDQwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDkxIDIgMCAwPjsKKwkJCX07CisKKwkJCXJ0aWNANjAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAtcnRpYyI7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmVnID0gPDB4NjAwMCAweDEwMD47CisJCQkJcmFuZ2VzID0gPDB4MCAweDYxMDAgMHhlMDA+OworCisJCQkJcnRpY19hOiBydGljLWFAMCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4MDAgMHgyMCAweDEwMCAweDgwPjsKKwkJCQl9OworCisJCQkJcnRpY19iOiBydGljLWJAMjAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJCXJlZyA9IDwweDIwIDB4MjAgMHgyMDAgMHg4MD47CisJCQkJfTsKKworCQkJCXJ0aWNfYzogcnRpYy1jQDQwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHg0MCAweDIwIDB4MzAwIDB4ODA+OworCQkJCX07CisKKwkJCQlydGljX2Q6IHJ0aWMtZEA2MCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4NjAgMHgyMCAweDUwMCAweDgwPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlzZWNfbW9uOiBzZWNfbW9uQDMxNDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMC1tb24iOworCQkJcmVnID0gPDB4MzE0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8OTMgMiAwIDA+OworCQl9OworCX07CisKKwlyYXBpZGlvMDogcmFwaWRpb0BmZmUwYzAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCWNvbXBhdGlibGUgPSAiZnNsLHJhcGlkaW8tZGVsdGEiOworCQlpbnRlcnJ1cHRzID0gPAorCQkJMTYgMiAxIDExIC8qIGVycl9pcnEgKi8KKwkJCTU2IDIgMCAwICAvKiBiZWxsX291dGJfaXJxICovCisJCQk1NyAyIDAgMCAgLyogYmVsbF9pbmJfaXJxICovCisJCQk2MCAyIDAgMCAgLyogbXNnMV90eF9pcnEgKi8KKwkJCTYxIDIgMCAwICAvKiBtc2cxX3J4X2lycSAqLworCQkJNjIgMiAwIDAgIC8qIG1zZzJfdHhfaXJxICovCisJCQk2MyAyIDAgMD47IC8qIG1zZzJfcnhfaXJxICovCisJfTsKKworCWxvY2FsYnVzQGZmZTEyNDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWVsYmMiLCAiZnNsLGVsYmMiLCAic2ltcGxlLWJ1cyI7CisJCWludGVycnVwdHMgPSA8MjUgMiAwIDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJfTsKKworCXBjaTA6IHBjaWVAZmZlMjAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtcGNpZSI7CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47CisJCWZzbCxtc2kgPSA8Jm1zaTA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDAgKi8KKwkJCQkwMDAwIDAgMCAxICZtcGljIDQwIDEgMCAwCisJCQkJMDAwMCAwIDAgMiAmbXBpYyAxIDEgMCAwCisJCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEgMCAwCisJCQkJMDAwMCAwIDAgNCAmbXBpYyAzIDEgMCAwCisJCQkJPjsKKwkJfTsKKwl9OworCisJcGNpMTogcGNpZUBmZmUyMDEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1wY2llIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47CisJCWZzbCxtc2kgPSA8Jm1zaTE+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDE0PjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDAgKi8KKwkJCQkwMDAwIDAgMCAxICZtcGljIDQxIDEgMCAwCisJCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEgMCAwCisJCQkJMDAwMCAwIDAgMyAmbXBpYyA2IDEgMCAwCisJCQkJMDAwMCAwIDAgNCAmbXBpYyA3IDEgMCAwCisJCQkJPjsKKwkJfTsKKwl9OworCisJcGNpMjogcGNpZUBmZmUyMDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1wY2llIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MHgxZmNhMDU1PjsKKwkJZnNsLG1zaSA9IDwmbXNpMj47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKKwkJcGNpZUAwIHsKKwkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTM+OworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJCS8qIElEU0VMIDB4MCAqLworCQkJCTAwMDAgMCAwIDEgJm1waWMgNDIgMSAwIDAKKwkJCQkwMDAwIDAgMCAyICZtcGljIDkgMSAwIDAKKwkJCQkwMDAwIDAgMCAzICZtcGljIDEwIDEgMCAwCisJCQkJMDAwMCAwIDAgNCAmbXBpYyAxMSAxIDAgMAorCQkJCT47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDUwMjBkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDUwMjBkcy5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2NmUyZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNTAyMGRzLmR0cwpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIFA1MDIwRFMgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMTAtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2luY2x1ZGUvICJwNTAyMHNpLmR0c2kiCisKKy8geworCW1vZGVsID0gImZzbCxQNTAyMERTIjsKKwljb21wYXRpYmxlID0gImZzbCxQNTAyMERTIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJfTsKKworCXNvYzogc29jQGZmZTAwMDAwMCB7CisJCXNwaUAxMTAwMDAgeworCQkJZmxhc2hAMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixzMjVzbDEyODAxIjsKKwkJCQlyZWcgPSA8MD47CisJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OyAvKiBpbnB1dCBjbG9jayAqLworCQkJCXBhcnRpdGlvbkB1LWJvb3QgeworCQkJCQlsYWJlbCA9ICJ1LWJvb3QiOworCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMTAwMDAwPjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisJCQkJcGFydGl0aW9uQGtlcm5lbCB7CisJCQkJCWxhYmVsID0gImtlcm5lbCI7CisJCQkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDA1MDAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25AZHRiIHsKKwkJCQkJbGFiZWwgPSAiZHRiIjsKKwkJCQkJcmVnID0gPDB4MDA2MDAwMDAgMHgwMDEwMDAwMD47CisJCQkJCXJlYWQtb25seTsKKwkJCQl9OworCQkJCXBhcnRpdGlvbkBmcyB7CisJCQkJCWxhYmVsID0gImZpbGUgc3lzdGVtIjsKKwkJCQkJcmVnID0gPDB4MDA3MDAwMDAgMHgwMDkwMDAwMD47CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJaTJjQDExODEwMCB7CisJCQllZXByb21ANTEgeworCQkJCWNvbXBhdGlibGUgPSAiYXQyNCwyNGMyNTYiOworCQkJCXJlZyA9IDwweDUxPjsKKwkJCX07CisJCQllZXByb21ANTIgeworCQkJCWNvbXBhdGlibGUgPSAiYXQyNCwyNGMyNTYiOworCQkJCXJlZyA9IDwweDUyPjsKKwkJCX07CisJCX07CisKKwkJaTJjQDExOTEwMCB7CisJCQlydGNANjggeworCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMzIzMiI7CisJCQkJcmVnID0gPDB4Njg+OworCQkJCWludGVycnVwdHMgPSA8MHgxIDB4MSAwIDA+OworCQkJfTsKKwkJfTsKKwl9OworCisJbG9jYWxidXNAZmZlMTI0MDAwIHsKKwkJcmVnID0gPDB4ZiAweGZlMTI0MDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDAgMCAweGYgMHhlODAwMDAwMCAweDA4MDAwMDAwCisJCQkgIDIgMCAweGYgMHhmZmEwMDAwMCAweDAwMDQwMDAwCisJCQkgIDMgMCAweGYgMHhmZmRmMDAwMCAweDAwMDA4MDAwPjsKKworCQlmbGFzaEAwLDAgeworCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOworCQkJcmVnID0gPDAgMCAweDA4MDAwMDAwPjsKKwkJCWJhbmstd2lkdGggPSA8Mj47CisJCQlkZXZpY2Utd2lkdGggPSA8Mj47CisJCX07CisKKwkJbmFuZEAyLDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGVsYmMtZmNtLW5hbmQiOworCQkJcmVnID0gPDB4MiAweDAgMHg0MDAwMD47CisKKwkJCXBhcnRpdGlvbkAwIHsKKwkJCQlsYWJlbCA9ICJOQU5EIFUtQm9vdCBJbWFnZSI7CisJCQkJcmVnID0gPDB4MCAweDAyMDAwMDAwPjsKKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCisJCQlwYXJ0aXRpb25AMjAwMDAwMCB7CisJCQkJbGFiZWwgPSAiTkFORCBSb290IEZpbGUgU3lzdGVtIjsKKwkJCQlyZWcgPSA8MHgwMjAwMDAwMCAweDEwMDAwMDAwPjsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAxMjAwMDAwMCB7CisJCQkJbGFiZWwgPSAiTkFORCBDb21wcmVzc2VkIFJGUyBJbWFnZSI7CisJCQkJcmVnID0gPDB4MTIwMDAwMDAgMHgwODAwMDAwMD47CisJCQl9OworCisJCQlwYXJ0aXRpb25AMWEwMDAwMDAgeworCQkJCWxhYmVsID0gIk5BTkQgTGludXggS2VybmVsIEltYWdlIjsKKwkJCQlyZWcgPSA8MHgxYTAwMDAwMCAweDA0MDAwMDAwPjsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAxZTAwMDAwMCB7CisJCQkJbGFiZWwgPSAiTkFORCBEVEIgSW1hZ2UiOworCQkJCXJlZyA9IDwweDFlMDAwMDAwIDB4MDEwMDAwMDA+OworCQkJfTsKKworCQkJcGFydGl0aW9uQDFmMDAwMDAwIHsKKwkJCQlsYWJlbCA9ICJOQU5EIFdyaXRhYmxlIFVzZXIgYXJlYSI7CisJCQkJcmVnID0gPDB4MWYwMDAwMDAgMHgyMTAwMDAwMD47CisJCQl9OworCQl9OworCisJCWJvYXJkLWNvbnRyb2xAMywwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwZHMtcGl4aXMiOworCQkJcmVnID0gPDMgMCAweDIwPjsKKwkJfTsKKwl9OworCisJcGNpMDogcGNpZUBmZmUyMDAwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUyMDAwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAgMHhjIDB4MDAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMDAwMDAgMHgwIDB4MDAwMTAwMDA+OworCisJCXBjaWVAMCB7CisJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAwIDB4MjAwMDAwMDAKKworCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAwIDB4MDAwMTAwMDA+OworCQl9OworCX07CisKKwlwY2kxOiBwY2llQGZmZTIwMTAwMCB7CisJCXJlZyA9IDwweGYgMHhmZTIwMTAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MCAweGUwMDAwMDAwIDB4YyAweDIwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMTAwMDAgMHgwIDB4MDAwMTAwMDA+OworCQlwY2llQDAgeworCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMCAweDAwMDEwMDAwPjsKKwkJfTsKKwl9OworCisJcGNpMjogcGNpZUBmZmUyMDIwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUyMDIwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAgMHhjIDB4NDAwMDAwMDAgMCAweDIwMDAwMDAwCisJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4ZiAweGY4MDIwMDAwIDAgMHgwMDAxMDAwMD47CisJCXBjaWVAMCB7CisJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAwIDB4MjAwMDAwMDAKKworCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAwIDB4MDAwMTAwMDA+OworCQl9OworCX07CisKKwlwY2kzOiBwY2llQGZmZTIwMzAwMCB7CisJCXJlZyA9IDwweGYgMHhmZTIwMzAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHg2MDAwMDAwMCAwIDB4MjAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMzAwMDAgMCAweDAwMDEwMDAwPjsKKwkJcGNpZUAwIHsKKwkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDAgMHgyMDAwMDAwMAorCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDAgMHgwMDAxMDAwMD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDUwMjBzaS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A1MDIwc2kuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTYwNDhlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A1MDIwc2kuZHRzaQpAQCAtMCwwICsxLDY1MiBAQAorLyoKKyAqIFA1MDIwIFNpbGljb24gRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMTAtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2R0cy12MS87CisKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFA1MDIwIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQljY3NyID0gJnNvYzsKKworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJc2VyaWFsMiA9ICZzZXJpYWwyOworCQlzZXJpYWwzID0gJnNlcmlhbDM7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisJCXBjaTMgPSAmcGNpMzsKKwkJdXNiMCA9ICZ1c2IwOworCQl1c2IxID0gJnVzYjE7CisJCWRtYTAgPSAmZG1hMDsKKwkJZG1hMSA9ICZkbWExOworCQlzZGhjID0gJnNkaGM7CisJCW1zaTAgPSAmbXNpMDsKKwkJbXNpMSA9ICZtc2kxOworCQltc2kyID0gJm1zaTI7CisKKwkJY3J5cHRvID0gJmNyeXB0bzsKKwkJc2VjX2pyMCA9ICZzZWNfanIwOworCQlzZWNfanIxID0gJnNlY19qcjE7CisJCXNlY19qcjIgPSAmc2VjX2pyMjsKKwkJc2VjX2pyMyA9ICZzZWNfanIzOworCQlydGljX2EgPSAmcnRpY19hOworCQlydGljX2IgPSAmcnRpY19iOworCQlydGljX2MgPSAmcnRpY19jOworCQlydGljX2QgPSAmcnRpY19kOworCQlzZWNfbW9uID0gJnNlY19tb247CisKKy8qCisJCXJpbzAgPSAmcmFwaWRpbzA7CisgKi8KKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHUwOiBQb3dlclBDLGU1NTAwQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OworCQkJTDJfMDogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHUxOiBQb3dlclBDLGU1NTAwQDEgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwxPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OworCQkJTDJfMTogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCX07CisKKwlzb2M6IHNvY0BmZmUwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWRldmljZV90eXBlID0gInNvYyI7CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweGZlMDAwMDAwIDB4MTAwMDAwMD47CisJCXJlZyA9IDwweGYgMHhmZTAwMDAwMCAwIDB4MDAwMDEwMDA+OworCisJCXNvYy1zcmFtLWVycm9yIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNvYy1zcmFtLWVycm9yIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDI5PjsKKwkJfTsKKworCQljb3JlbmV0LWxhd0AwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtbGF3IjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJCWZzbCxudW0tbGF3cyA9IDwzMj47CisJCX07CisKKwkJbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlci12NC41IiwgImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7CisJCQlyZWcgPSA8MHg4MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMz47CisJCX07CisKKwkJbWVtb3J5LWNvbnRyb2xsZXJAOTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlci12NC41IiwgImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7CisJCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMj47CisJCX07CisKKwkJY3BjOiBsMy1jYWNoZS1jb250cm9sbGVyQDEwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiZnNsLHA0MDgwLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiY2FjaGUiOworCQkJcmVnID0gPDB4MTAwMDAgMHgxMDAwCisJCQkgICAgICAgMHgxMTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjcKKwkJCQkgICAgICAxNiAyIDEgMjY+OworCQl9OworCisJCWNvcmVuZXQtY2ZAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsY29yZW5ldC1jZiI7CisJCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMzE+OworCQkJZnNsLGNjZi1udW0tY3NkaWRzID0gPDMyPjsKKwkJCWZzbCxjY2YtbnVtLXNub29waWRzID0gPDMyPjsKKwkJfTsKKworCQlpb21tdUAyMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwYW11LXYxLjAiLCAiZnNsLHBhbXUiOworCQkJcmVnID0gPDB4MjAwMDAgMHg0MDAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMjQgMiAwIDAKKwkJCQkxNiAyIDEgMzA+OworCQl9OworCisJCW1waWM6IHBpY0A0MDAwMCB7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDw0PjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYyIsICJjaHJwLG9wZW4tcGljIjsKKwkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKKwkJfTsKKworCQltc2kwOiBtc2lANDE2MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDE2MDAgMHgyMDA+OworCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTB4ZTAgMCAwIDAKKwkJCQkweGUxIDAgMCAwCisJCQkJMHhlMiAwIDAgMAorCQkJCTB4ZTMgMCAwIDAKKwkJCQkweGU0IDAgMCAwCisJCQkJMHhlNSAwIDAgMAorCQkJCTB4ZTYgMCAwIDAKKwkJCQkweGU3IDAgMCAwPjsKKwkJfTsKKworCQltc2kxOiBtc2lANDE4MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDE4MDAgMHgyMDA+OworCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTB4ZTggMCAwIDAKKwkJCQkweGU5IDAgMCAwCisJCQkJMHhlYSAwIDAgMAorCQkJCTB4ZWIgMCAwIDAKKwkJCQkweGVjIDAgMCAwCisJCQkJMHhlZCAwIDAgMAorCQkJCTB4ZWUgMCAwIDAKKwkJCQkweGVmIDAgMCAwPjsKKwkJfTsKKworCQltc2kyOiBtc2lANDFhMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDFhMDAgMHgyMDA+OworCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTB4ZjAgMCAwIDAKKwkJCQkweGYxIDAgMCAwCisJCQkJMHhmMiAwIDAgMAorCQkJCTB4ZjMgMCAwIDAKKwkJCQkweGY0IDAgMCAwCisJCQkJMHhmNSAwIDAgMAorCQkJCTB4ZjYgMCAwIDAKKwkJCQkweGY3IDAgMCAwPjsKKwkJfTsKKworCQlndXRzOiBnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWRldmljZS1jb25maWctMS4wIjsKKwkJCXJlZyA9IDwweGUwMDAwIDB4ZTAwPjsKKwkJCWZzbCxoYXMtcnN0Y3I7CisJCQkjc2xlZXAtY2VsbHMgPSA8MT47CisJCQlmc2wsbGlvZG4tYml0cyA9IDwxMj47CisJCX07CisKKwkJcGluczogZ2xvYmFsLXV0aWxpdGllc0BlMGUwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1waW4tY29udHJvbC0xLjAiOworCQkJcmVnID0gPDB4ZTBlMDAgMHgyMDA+OworCQkJI3NsZWVwLWNlbGxzID0gPDI+OworCQl9OworCisJCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0xLjAiOworCQkJcmVnID0gPDB4ZTEwMDAgMHgxMDAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJfTsKKworCQlyY3BtOiBnbG9iYWwtdXRpbGl0aWVzQGUyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXJjcG0tMS4wIjsKKwkJCXJlZyA9IDwweGUyMDAwIDB4MTAwMD47CisJCQkjc2xlZXAtY2VsbHMgPSA8MT47CisJCX07CisKKwkJc2ZwOiBzZnBAZTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtc2ZwIiwgImZzbCxxb3JpcS1zZnAtMS4wIjsKKwkJCXJlZwkgICA9IDwweGU4MDAwIDB4MTAwMD47CisJCX07CisKKwkJc2VyZGVzOiBzZXJkZXNAZWEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtc2VyZGVzIjsKKwkJCXJlZwkgICA9IDwweGVhMDAwIDB4MTAwMD47CisJCX07CisKKwkJZG1hMDogZG1hQDEwMDMwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7CisJCQlyZWcgPSA8MHgxMDAzMDAgMHg0PjsKKwkJCXJhbmdlcyA9IDwweDAgMHgxMDAxMDAgMHgyMDA+OworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRtYS1jaGFubmVsQDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWludGVycnVwdHMgPSA8MjggMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CisJCQkJaW50ZXJydXB0cyA9IDwyOSAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OworCQkJCWludGVycnVwdHMgPSA8MzAgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDE4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMxIDIgMCAwPjsKKwkJCX07CisJCX07CisKKwkJZG1hMTogZG1hQDEwMTMwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7CisJCQlyZWcgPSA8MHgxMDEzMDAgMHg0PjsKKwkJCXJhbmdlcyA9IDwweDAgMHgxMDExMDAgMHgyMDA+OworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRtYS1jaGFubmVsQDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWludGVycnVwdHMgPSA8MzIgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CisJCQkJaW50ZXJydXB0cyA9IDwzMyAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OworCQkJCWludGVycnVwdHMgPSA8MzQgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDE4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM1IDIgMCAwPjsKKwkJCX07CisJCX07CisKKwkJc3BpQDExMDAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZXNwaSIsICJmc2wsbXBjODUzNi1lc3BpIjsKKwkJCXJlZyA9IDwweDExMDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw1MyAweDIgMCAwPjsKKwkJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDw0PjsKKwkJfTsKKworCQlzZGhjOiBzZGhjQDExNDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1lc2RoYyIsICJmc2wsZXNkaGMiOworCQkJcmVnID0gPDB4MTE0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQ4IDIgMCAwPjsKKwkJCXNkaGNpLGF1dG8tY21kMTI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCX07CisKKwkJaTJjQDExODAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgxMTgwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47CisJCQlkZnNycjsKKwkJfTsKKworCQlpMmNAMTE4MTAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExODEwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM4IDIgMCAwPjsKKwkJCWRmc3JyOworCQl9OworCisJCWkyY0AxMTkwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE5MDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OworCQkJZGZzcnI7CisJCX07CisKKwkJaTJjQDExOTEwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgxMTkxMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwzOSAyIDAgMD47CisJCQlkZnNycjsKKwkJfTsKKworCQlzZXJpYWwwOiBzZXJpYWxAMTFjNTAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExYzUwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM2IDIgMCAwPjsKKwkJfTsKKworCQlzZXJpYWwxOiBzZXJpYWxAMTFjNjAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExYzYwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM2IDIgMCAwPjsKKwkJfTsKKworCQlzZXJpYWwyOiBzZXJpYWxAMTFkNTAwIHsKKwkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExZDUwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwPjsKKwkJfTsKKworCQlzZXJpYWwzOiBzZXJpYWxAMTFkNjAwIHsKKwkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExZDYwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwPjsKKwkJfTsKKworCQlncGlvMDogZ3Bpb0AxMzAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZ3BpbyIsICJmc2wscW9yaXEtZ3BpbyI7CisJCQlyZWcgPSA8MHgxMzAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NTUgMiAwIDA+OworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCX07CisKKwkJdXNiMDogdXNiQDIxMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC11c2IyLW1waCIsCisJCQkJCSJmc2wsbXBjODV4eC11c2IyLW1waCIsICJmc2wtdXNiMi1tcGgiOworCQkJcmVnID0gPDB4MjEwMDAwIDB4MTAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDw0NCAweDIgMCAwPjsKKwkJCXBoeV90eXBlID0gInV0bWkiOworCQkJcG9ydDA7CisJCX07CisKKwkJdXNiMTogdXNiQDIxMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC11c2IyLWRyIiwKKwkJCQkJImZzbCxtcGM4NXh4LXVzYjItZHIiLCAiZnNsLXVzYjItZHIiOworCQkJcmVnID0gPDB4MjExMDAwIDB4MTAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDw0NSAweDIgMCAwPjsKKwkJCWRyX21vZGUgPSAiaG9zdCI7CisJCQlwaHlfdHlwZSA9ICJ1dG1pIjsKKwkJfTsKKworCQlzYXRhQDIyMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1zYXRhIiwgImZzbCxwcS1zYXRhLXYyIjsKKwkJCXJlZyA9IDwweDIyMDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw2OCAweDIgMCAwPjsKKwkJfTsKKworCQlzYXRhQDIyMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1zYXRhIiwgImZzbCxwcS1zYXRhLXYyIjsKKwkJCXJlZyA9IDwweDIyMTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw2OSAweDIgMCAwPjsKKwkJfTsKKworCQljcnlwdG86IGNyeXB0b0AzMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjIiLCAiZnNsLHNlYy12NC4wIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyZWcJCSA9IDwweDMwMDAwMCAweDEwMDAwPjsKKwkJCXJhbmdlcwkJID0gPDAgMHgzMDAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHRzCSA9IDw5MiAyIDAgMD47CisKKwkJCXNlY19qcjA6IGpyQDEwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKKwkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw4OCAyIDAgMD47CisJCQl9OworCisJCQlzZWNfanIxOiBqckAyMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQkJCWludGVycnVwdHMgPSA8ODkgMiAwIDA+OworCQkJfTsKKworCQkJc2VjX2pyMjoganJAMzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDMwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDkwIDIgMCAwPjsKKwkJCX07CisKKwkJCXNlY19qcjM6IGpyQDQwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKKwkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCQlyZWcgPSA8MHg0MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw5MSAyIDAgMD47CisJCQl9OworCisJCQlydGljQDYwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMiLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYyI7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmVnID0gPDB4NjAwMCAweDEwMD47CisJCQkJcmFuZ2VzID0gPDB4MCAweDYxMDAgMHhlMDA+OworCisJCQkJcnRpY19hOiBydGljLWFAMCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKKwkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJCXJlZyA9IDwweDAwIDB4MjAgMHgxMDAgMHg4MD47CisJCQkJfTsKKworCQkJCXJ0aWNfYjogcnRpYy1iQDIwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAorCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4MjAgMHgyMCAweDIwMCAweDgwPjsKKwkJCQl9OworCisJCQkJcnRpY19jOiBydGljLWNANDAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHg0MCAweDIwIDB4MzAwIDB4ODA+OworCQkJCX07CisKKwkJCQlydGljX2Q6IHJ0aWMtZEA2MCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKKwkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJCXJlZyA9IDwweDYwIDB4MjAgMHg1MDAgMHg4MD47CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJc2VjX21vbjogc2VjX21vbkAzMTQwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItbW9uIiwgImZzbCxzZWMtdjQuMC1tb24iOworCQkJcmVnID0gPDB4MzE0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDkzIDIgMCAwPjsKKwkJfTsKKwl9OworCisvKgorCXJhcGlkaW8wOiByYXBpZGlvQGZmZTBjMDAwMAorKi8KKworCWxvY2FsYnVzQGZmZTEyNDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWVsYmMiLCAiZnNsLGVsYmMiLCAic2ltcGxlLWJ1cyI7CisJCWludGVycnVwdHMgPSA8MjUgMiAwIDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJfTsKKworCXBjaTA6IHBjaWVAZmZlMjAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MHgxZmNhMDU1PjsKKwkJZnNsLG1zaSA9IDwmbXNpMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKKworCQlwY2llQDAgeworCQkJcmVnID0gPDAgMCAwIDAgMD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwICovCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0MCAxIDAgMAorCQkJCTAwMDAgMCAwIDIgJm1waWMgMSAxIDAgMAorCQkJCTAwMDAgMCAwIDMgJm1waWMgMiAxIDAgMAorCQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxIDAgMAorCQkJCT47CisJCX07CisJfTsKKworCXBjaTE6IHBjaWVAZmZlMjAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47CisJCWZzbCxtc2kgPSA8Jm1zaTE+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDE0PjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDAgKi8KKwkJCQkwMDAwIDAgMCAxICZtcGljIDQxIDEgMCAwCisJCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEgMCAwCisJCQkJMDAwMCAwIDAgMyAmbXBpYyA2IDEgMCAwCisJCQkJMDAwMCAwIDAgNCAmbXBpYyA3IDEgMCAwCisJCQkJPjsKKwkJfTsKKwl9OworCisJcGNpMjogcGNpZUBmZmUyMDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OworCQlmc2wsbXNpID0gPCZtc2kyPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTM+OworCQlwY2llQDAgeworCQkJcmVnID0gPDAgMCAwIDAgMD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMz47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwICovCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0MiAxIDAgMAorCQkJCTAwMDAgMCAwIDIgJm1waWMgOSAxIDAgMAorCQkJCTAwMDAgMCAwIDMgJm1waWMgMTAgMSAwIDAKKwkJCQkwMDAwIDAgMCA0ICZtcGljIDExIDEgMCAwCisJCQkJPjsKKwkJfTsKKwl9OworCisJcGNpMzogcGNpZUBmZmUyMDMwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OworCQlmc2wsbXNpID0gPCZtc2kyPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTI+OworCQlwY2llQDAgeworCQkJcmVnID0gPDAgMCAwIDAgMD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMj47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwICovCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0MyAxIDAgMAorCQkJCTAwMDAgMCAwIDIgJm1waWMgMCAxIDAgMAorCQkJCTAwMDAgMCAwIDMgJm1waWMgNCAxIDAgMAorCQkJCTAwMDAgMCAwIDQgJm1waWMgOCAxIDAgMAorCQkJCT47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2VxdW9pYS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2VxdW9pYS5kdHMKaW5kZXggNzM5ZGQwZC4uYjFkMzI5MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NlcXVvaWEuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zZXF1b2lhLmR0cwpAQCAtMTEwLDYgKzExMCwxOCBAQAogCQkJZGNyLXJlZyA9IDwweDAxMCAweDAwMj47CiAJCX07CiAKKwkJQ1JZUFRPOiBjcnlwdG9AZTAxMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhbWNjLHBwYzQ0MGVweC1jcnlwdG8iLCJhbWNjLHBwYzR4eC1jcnlwdG8iOworCQkJcmVnID0gPDAgMHhFMDEwMDAwMCAweDgwNDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzA+OworCQkJaW50ZXJydXB0cyA9IDwweDE3IDB4ND47CisJCX07CisKKwkJcm5nQGUwMTIwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYW1jYyxwcGM0NDBlcHgtcm5nIiwiYW1jYyxwcGM0eHgtcm5nIjsKKwkJCXJlZyA9IDwwIDB4RTAxMjAwMDAgMHgxNTA+OworCQl9OworCiAJCURNQTA6IGRtYSB7CiAJCQljb21wYXRpYmxlID0gImlibSxkbWEtNDQwZXB4IiwgImlibSxkbWEtNHh4IjsKIAkJCWRjci1yZWcgPSA8MHgxMDAgMHgwMjc+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NvY3JhdGVzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zb2NyYXRlcy5kdHMKaW5kZXggZmViNGVmNi4uMzhjMzU0MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NvY3JhdGVzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc29jcmF0ZXMuZHRzCkBAIC0yNDAsNiArMjQwLDggQEAKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQlyZWcgPSA8MHhlMDAwNTAwMCAweDQwPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCWludGVycnVwdHMgPSA8MTkgMj47CiAKIAkJcmFuZ2VzID0gPDAgMCAweGZjMDAwMDAwIDB4MDQwMDAwMDAKIAkJCSAgMiAwIDB4YzgwMDAwMDAgMHgwNDAwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RhaXNoYW4uZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RhaXNoYW4uZHRzCmluZGV4IDA1ODQzOGYuLjE2NTdhZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90YWlzaGFuLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdGFpc2hhbi5kdHMKQEAgLTMzNyw3ICszMzcsNyBAQAogCQkJCXJ4LWZpZm8tc2l6ZSA9IDw0MDk2PjsKIAkJCQl0eC1maWZvLXNpemUgPSA8MjA0OD47CiAJCQkJcGh5LW1vZGUgPSAicmdtaWkiOwotCQkJCXBoeS1tYXAgPSA8MHgwMDAwMDAwMT47CisJCQkJcGh5LWFkZHJlc3MgPSA8MT47CiAJCQkJcmdtaWktZGV2aWNlID0gPCZSR01JSTA+OwogCQkJCXJnbWlpLWNoYW5uZWwgPSA8MD47CiAgCQkJCXptaWktZGV2aWNlID0gPCZaTUlJMD47CkBAIC0zNjEsNyArMzYxLDcgQEAKIAkJCQlyeC1maWZvLXNpemUgPSA8NDA5Nj47CiAJCQkJdHgtZmlmby1zaXplID0gPDIwNDg+OwogCQkJCXBoeS1tb2RlID0gInJnbWlpIjsKLQkJCQlwaHktbWFwID0gPDB4MDAwMDAwMDM+OworCQkJCXBoeS1hZGRyZXNzID0gPDM+OwogCQkJCXJnbWlpLWRldmljZSA9IDwmUkdNSUkwPjsKIAkJCQlyZ21paS1jaGFubmVsID0gPDE+OwogIAkJCQl6bWlpLWRldmljZSA9IDwmWk1JSTA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDAuZHRzCmluZGV4IDE1Y2E3MzEuLjBhNGNlZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0MC5kdHMKQEAgLTI3Nyw2ICsyNzcsNDggQEAKIAkJfTsKIAl9OwogCisJbG9jYWxidXNAZTAwMDUwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtbG9jYWxidXMiLCAiZnNsLHBxMy1sb2NhbGJ1cyIsCisJCQkgICAgICJzaW1wbGUtYnVzIjsKKwkJcmVnID0gPDB4ZTAwMDUwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCWludGVycnVwdHMgPSA8MTkgMj47CisKKwkJcmFuZ2VzID0gPDB4MCAweDAgMHhmZTAwMDAwMCAweDAyMDAwMDAwPjsKKworCQlub3JAMCwwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQlyZWcgPSA8MHgwIDB4MCAweDAyMDAwMDAwPjsKKwkJCWJhbmstd2lkdGggPSA8ND47CisJCQlkZXZpY2Utd2lkdGggPSA8Mj47CisJCQlwYXJ0aXRpb25AMCB7CisJCQkJbGFiZWwgPSAia2VybmVsIjsKKwkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMTgwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25AMTgwMDAwIHsKKwkJCQlsYWJlbCA9ICJyb290IjsKKwkJCQlyZWcgPSA8MHgwMDE4MDAwMCAweDAxZGMwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25AMWY0MDAwMCB7CisJCQkJbGFiZWwgPSAiZW52MSI7CisJCQkJcmVnID0gPDB4MDFmNDAwMDAgMHgwMDA0MDAwMD47CisJCQl9OworCQkJcGFydGl0aW9uQDFmODAwMDAgeworCQkJCWxhYmVsID0gImVudjIiOworCQkJCXJlZyA9IDwweDAxZjgwMDAwIDB4MDAwNDAwMDA+OworCQkJfTsKKwkJCXBhcnRpdGlvbkAxZmMwMDAwIHsKKwkJCQlsYWJlbCA9ICJ1LWJvb3QiOworCQkJCXJlZyA9IDwweDAxZmMwMDAwIDB4MDAwNDAwMDA+OworCQkJCXJlYWQtb25seTsKKwkJCX07CisJCX07CisJfTsKKwogCXBjaTA6IHBjaUBlMDAwODAwMCB7CiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDgtYmlnZmxhc2guZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDgtYmlnZmxhc2guZHRzCmluZGV4IDVkYmIzNmUuLjk0NTJjM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQ4LWJpZ2ZsYXNoLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0OC1iaWdmbGFzaC5kdHMKQEAgLTM0Niw2ICszNDYsOCBAQAogCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CiAJCXJlZyA9IDwweGEwMDA1MDAwIDB4MTAwPjsJLy8gQlJ4LCBPUngsIGV0Yy4KKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCWludGVycnVwdHMgPSA8MTkgMj47CiAKIAkJcmFuZ2VzID0gPAogCQkJMCAweDAgMHhmYzAwMDAwMCAweDA0MDAwMDAwCS8vIE5PUiBGTEFTSCBiYW5rIDEKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQ4LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQ4LmR0cwppbmRleCBhMDUwYWU0Li42MTk3NzZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0OC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDguZHRzCkBAIC0zNDYsNiArMzQ2LDggQEAKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQlyZWcgPSA8MHhlMDAwNTAwMCAweDEwMD47CS8vIEJSeCwgT1J4LCBldGMuCisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwogCiAJCXJhbmdlcyA9IDwKIAkJCTAgMHgwIDB4ZmMwMDAwMDAgMHgwNDAwMDAwMAkvLyBOT1IgRkxBU0ggYmFuayAxCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU2MC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU2MC5kdHMKaW5kZXggMjJlYzM5Yi4uNzY2NWExNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NjAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTYwLmR0cwpAQCAtMzEyLDYgKzMxMiw4IEBACiAJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJcmVnID0gPDB4ZTAwMDUwMDAgMHgxMDA+OwkvLyBCUngsIE9SeCwgZXRjLgorCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJaW50ZXJydXB0cyA9IDwxOSAyPjsKIAogCQlyYW5nZXMgPSA8CiAJCQkwIDB4MCAweGZjMDAwMDAwIDB4MDQwMDAwMDAJLy8gTk9SIEZMQVNIIGJhbmsgMQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hwZWRpdGU1MjAwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy94cGVkaXRlNTIwMC5kdHMKaW5kZXggYTBjZjUzZi4uYzQxYTgwYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hwZWRpdGU1MjAwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveHBlZGl0ZTUyMDAuZHRzCkBAIC0zNzQsNiArMzc0LDggQEAKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQlyZWcgPSA8MHhlZjAwNTAwMCAweDEwMD47CS8vIEJSeCwgT1J4LCBldGMuCisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwogCiAJCXJhbmdlcyA9IDwKIAkJCTAgMHgwIDB4ZmMwMDAwMDAgMHgwNDAwMDAwMAkvLyBOT1IgYm9vdCBmbGFzaApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hwZWRpdGU1MjAwX3htb24uZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hwZWRpdGU1MjAwX3htb24uZHRzCmluZGV4IGM1YjI5NzUuLmMwZWZjYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy94cGVkaXRlNTIwMF94bW9uLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveHBlZGl0ZTUyMDBfeG1vbi5kdHMKQEAgLTM3OCw2ICszNzgsOCBAQAogCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CiAJCXJlZyA9IDwweGVmMDA1MDAwIDB4MTAwPjsJLy8gQlJ4LCBPUngsIGV0Yy4KKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCWludGVycnVwdHMgPSA8MTkgMj47CiAKIAkJcmFuZ2VzID0gPAogCQkJMCAweDAgMHhmODAwMDAwMCAweDA4MDAwMDAwCS8vIE5PUiBib290IGZsYXNoCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC90cmVlYm9vdC1pc3M0eHguYyBiL2FyY2gvcG93ZXJwYy9ib290L3RyZWVib290LWlzczR4eC5jCmluZGV4IGZjYzQ0OTUuLjMyOWU3MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L3RyZWVib290LWlzczR4eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3RyZWVib290LWlzczR4eC5jCkBAIC0zNCw5ICszNCwyOSBAQAogCiBCU1NfU1RBQ0soNDA5Nik7CiAKK3N0YXRpYyB1MzIgaWJtNHh4X21lbXN0YXJ0OworCiBzdGF0aWMgdm9pZCBpc3NfNHh4X2ZpeHVwcyh2b2lkKQogewotCWlibTR4eF9zZHJhbV9maXh1cF9tZW1zaXplKCk7CisJdm9pZCAqbWVtb3J5OworCXUzMiByZWdbM107CisKKwltZW1vcnkgPSBmaW5kZGV2aWNlKCIvbWVtb3J5Iik7CisJaWYgKCFtZW1vcnkpCisJCWZhdGFsKCJDYW4ndCBmaW5kIG1lbW9yeSBub2RlXG4iKTsKKwkvKiBUaGlzIGFzc3VtZXMgI2FkZHJlc3MtY2VsbHMgPSAyLCAjc2l6ZS1jZWxscyA9MSBhbmQgdGhhdCAqLworCWdldHByb3AobWVtb3J5LCAicmVnIiwgcmVnLCBzaXplb2YocmVnKSk7CisJaWYgKHJlZ1syXSkKKwkJLyogSWYgdGhlIGRldmljZSB0cmVlIHNwZWNpZmllcyB0aGUgbWVtb3J5IHJhbmdlLCB1c2UgaXQgKi8KKwkJaWJtNHh4X21lbXN0YXJ0ID0gcmVnWzFdOworCWVsc2UKKwkJLyogb3RoZXJzaXplLCByZWFkIGl0IGZyb20gdGhlIFNEUkFNIGNvbnRyb2xsZXIgKi8KKwkJaWJtNHh4X3NkcmFtX2ZpeHVwX21lbXNpemUoKTsKK30KKworc3RhdGljIHZvaWQgKmlzc180eHhfdm1saW51eF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmV0dXJuICh2b2lkICopaWJtNHh4X21lbXN0YXJ0OwogfQogCiAjZGVmaW5lIFNQUk5fUElSCTB4MTFFCS8qIFByb2Nlc3NvciBJbmRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KQEAgLTQ4LDYgKzY4LDcgQEAKIAogCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGF2YWlsX3JhbSwgMTI4LCA2NCk7CiAJcGxhdGZvcm1fb3BzLmZpeHVwcyA9IGlzc180eHhfZml4dXBzOworCXBsYXRmb3JtX29wcy52bWxpbnV4X2FsbG9jID0gaXNzXzR4eF92bWxpbnV4X2FsbG9jOwogCXBsYXRmb3JtX29wcy5leGl0ID0gaWJtNDR4X2RiY3JfcmVzZXQ7CiAJcGlyX3JlZyA9IG1mc3ByKFNQUk5fUElSKTsKIAlmZHRfc2V0X2Jvb3RfY3B1aWRfcGh5cyhfZHRiX3N0YXJ0LCBwaXJfcmVnKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9pc3M0NzYtc21wX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9pc3M0NzYtc21wX2RlZmNvbmZpZwppbmRleCA5MmY4NjNhLi5hNmViNmFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvaXNzNDc2LXNtcF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2lzczQ3Ni1zbXBfZGVmY29uZmlnCkBAIC0zLDggKzMsOCBAQAogQ09ORklHX0VYUEVSSU1FTlRBTD15CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19TUEFSU0VfSVJRPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX0VYUEVSVD15CkBAIC0yMSwxMCArMjEsMTEgQEAKIENPTkZJR19IWl8xMDA9eQogQ09ORklHX01BVEhfRU1VTEFUSU9OPXkKIENPTkZJR19JUlFfQUxMX0NQVVM9eQotQ09ORklHX1NQQVJTRV9JUlE9eQogQ09ORklHX0NNRExJTkVfQk9PTD15CiBDT05GSUdfQ01ETElORT0icm9vdD0vZGV2L2lzc2JsazAiCiAjIENPTkZJR19QQ0kgaXMgbm90IHNldAorQ09ORklHX0FEVkFOQ0VEX09QVElPTlM9eQorQ09ORklHX1JFTE9DQVRBQkxFPXkKIENPTkZJR19ORVQ9eQogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfVU5JWD15CkBAIC02Nyw3ICs2OCw2IEBACiAjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZPXkKLUNPTkZJR19JTk9USUZZPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19UTVBGUz15CiBDT05GSUdfQ1JBTUZTPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvcGNtMDMwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvcGNtMDMwX2RlZmNvbmZpZwppbmRleCA3ZjdlNGE4Li4yMmU3MTk1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3BjbTAzMF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC9wY20wMzBfZGVmY29uZmlnCkBAIC04NSw3ICs4NSw3IEBACiBDT05GSUdfVVNCX09IQ0lfSENEX1BQQ19PRl9CRT15CiAjIENPTkZJR19VU0JfT0hDSV9IQ0RfUENJIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfU1RPUkFHRT1tCi1DT05GSUdfUlRDX0NMQVNTPW0KK0NPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19EUlZfUENGODU2Mz1tCiBDT05GSUdfRVhUMl9GUz1tCiBDT05GSUdfRVhUM19GUz1tCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3AxMDIzcmRzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvcDEwMjNyZHNfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MGZmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3AxMDIzcmRzX2RlZmNvbmZpZwpAQCAtMCwwICsxLDE3MyBAQAorQ09ORklHX1BQQ184NXh4PXkKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9MgorQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKK0NPTkZJR19BVURJVD15CitDT05GSUdfU1BBUlNFX0lSUT15CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVNfQUxMPXkKK0NPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorQ09ORklHX1AxMDIzX1JEUz15CitDT05GSUdfUVVJQ0NfRU5HSU5FPXkKK0NPTkZJR19RRV9HUElPPXkKK0NPTkZJR19DUE0yPXkKK0NPTkZJR19NUEM4eHh4X0dQSU89eQorQ09ORklHX0hJR0hNRU09eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9NSVNDPW0KK0NPTkZJR19NQVRIX0VNVUxBVElPTj15CitDT05GSUdfU1dJT1RMQj15CitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lFUE9SVEJVUz15CisjIENPTkZJR19QQ0lFQUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSUVBU1BNIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0lfTVNJPXkKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTV9VU0VSPXkKK0NPTkZJR19ORVRfS0VZPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUj15CitDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTPXkKK0NPTkZJR19JUF9ST1VURV9NVUxUSVBBVEg9eQorQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorQ09ORklHX05FVF9JUElQPXkKK0NPTkZJR19JUF9NUk9VVEU9eQorQ09ORklHX0lQX1BJTVNNX1YxPXkKK0NPTkZJR19JUF9QSU1TTV9WMj15CitDT05GSUdfQVJQRD15CitDT05GSUdfSU5FVF9FU1A9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSVBWNj15CitDT05GSUdfSVBfU0NUUD1tCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CitDT05GSUdfQkxLX0RFVl9MT09QPXkKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0xMzEwNzIKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorQ09ORklHX0VFUFJPTV9MRUdBQ1k9eQorQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX0NIUl9ERVZfU1Q9eQorQ09ORklHX0JMS19ERVZfU1I9eQorQ09ORklHX0NIUl9ERVZfU0c9eQorQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKK0NPTkZJR19TQ1NJX0xPR0dJTkc9eQorQ09ORklHX0FUQT15CitDT05GSUdfU0FUQV9GU0w9eQorQ09ORklHX1NBVEFfU0lMMjQ9eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0RVTU1ZPXkKK0NPTkZJR19NQVJWRUxMX1BIWT15CitDT05GSUdfREFWSUNPTV9QSFk9eQorQ09ORklHX0NJQ0FEQV9QSFk9eQorQ09ORklHX1ZJVEVTU0VfUEhZPXkKK0NPTkZJR19GSVhFRF9QSFk9eQorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfRlNfRU5FVD15CitDT05GSUdfRTEwMDBFPXkKK0NPTkZJR19GU0xfUFFfTURJTz15CitDT05GSUdfSU5QVVRfRkZfTUVNTEVTUz1tCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MgorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9MgorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKK0NPTkZJR19TRVJJQUxfODI1MF9ERVRFQ1RfSVJRPXkKK0NPTkZJR19TRVJJQUxfODI1MF9SU0E9eQorQ09ORklHX1NFUklBTF9RRT1tCitDT05GSUdfSFdfUkFORE9NPXkKK0NPTkZJR19OVlJBTT15CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ1BNPW0KK0NPTkZJR19JMkNfTVBDPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD15CitDT05GSUdfU09VTkQ9eQorQ09ORklHX1NORD15CitDT05GSUdfU05EX01JWEVSX09TUz15CitDT05GSUdfU05EX1BDTV9PU1M9eQorIyBDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQSSBpcyBub3Qgc2V0CitDT05GSUdfRURBQz15CitDT05GSUdfRURBQ19NTV9FREFDPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19EUlZfQ01PUz15CitDT05GSUdfRE1BREVWSUNFUz15CitDT05GSUdfRlNMX0RNQT15CisjIENPTkZJR19ORVRfRE1BIGlzIG5vdCBzZXQKK0NPTkZJR19TVEFHSU5HPXkKKyMgQ09ORklHX1NUQUdJTkdfRVhDTFVERV9CVUlMRCBpcyBub3Qgc2V0CitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAorQ09ORklHX0lTTzk2NjBfRlM9bQorQ09ORklHX0pPTElFVD15CitDT05GSUdfWklTT0ZTPXkKK0NPTkZJR19VREZfRlM9bQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19OVEZTX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19UTVBGUz15CitDT05GSUdfQURGU19GUz1tCitDT05GSUdfQUZGU19GUz1tCitDT05GSUdfSEZTX0ZTPW0KK0NPTkZJR19IRlNQTFVTX0ZTPW0KK0NPTkZJR19CRUZTX0ZTPW0KK0NPTkZJR19CRlNfRlM9bQorQ09ORklHX0VGU19GUz1tCitDT05GSUdfQ1JBTUZTPXkKK0NPTkZJR19WWEZTX0ZTPW0KK0NPTkZJR19IUEZTX0ZTPW0KK0NPTkZJR19RTlg0RlNfRlM9bQorQ09ORklHX1NZU1ZfRlM9bQorQ09ORklHX1VGU19GUz1tCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX05GU19WND15CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX05GU0Q9eQorQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CitDT05GSUdfTUFDX1BBUlRJVElPTj15CitDT05GSUdfQ1JDX1QxMERJRj15CitDT05GSUdfRlJBTUVfV0FSTj04MDkyCitDT05GSUdfREVCVUdfRlM9eQorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19WSVJRX0RFQlVHPXkKK0NPTkZJR19DUllQVE9fUENCQz1tCitDT05GSUdfQ1JZUFRPX1NIQTI1Nj15CitDT05GSUdfQ1JZUFRPX1NIQTUxMj15CitDT05GSUdfQ1JZUFRPX0FFUz15CisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L21wYzg2MTBfaHBjZF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L21wYzg2MTBfaHBjZF9kZWZjb25maWcKaW5kZXggMDM2YmZiMi4uMGRiOWJhMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9tcGM4NjEwX2hwY2RfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvbXBjODYxMF9ocGNkX2RlZmNvbmZpZwpAQCAtODksNiArODksMTEgQEAKIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD15CiBDT05GSUdfRkI9eQogQ09ORklHX0ZCX0ZTTF9ESVU9eQorQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0s9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorQ09ORklHX0ZPTlRTPXkKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKIENPTkZJR19TT1VORD15CiBDT05GSUdfU05EPXkKIENPTkZJR19TTkRfTUlYRVJfT1NTPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQzMl9zbXBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDMyX3NtcF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1NjJhNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQzMl9zbXBfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTg3IEBACitDT05GSUdfUFBDXzg1eHg9eQorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz04CitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0FVRElUPXkKK0NPTkZJR19TUEFSU0VfSVJRPXkKK0NPTkZJR19SQ1VfVFJBQ0U9eQorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TX0FMTD15CitDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1BFUkZfRVZFTlRTPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKK0NPTkZJR19NT0RWRVJTSU9OUz15CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CitDT05GSUdfUDIwNDBfUkRCPXkKK0NPTkZJR19QMzA0MV9EUz15CitDT05GSUdfUDQwODBfRFM9eQorQ09ORklHX1A1MDIwX0RTPXkKK0NPTkZJR19ISUdITUVNPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfTUlTQz1tCitDT05GSUdfS0VYRUM9eQorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTMKK0NPTkZJR19GU0xfTEJDPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSUVQT1JUQlVTPXkKKyMgQ09ORklHX1BDSUVBU1BNIGlzIG5vdCBzZXQKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTV9VU0VSPXkKK0NPTkZJR19YRlJNX1NVQl9QT0xJQ1k9eQorQ09ORklHX1hGUk1fU1RBVElTVElDUz15CitDT05GSUdfTkVUX0tFWT15CitDT05GSUdfTkVUX0tFWV9NSUdSQVRFPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUj15CitDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTPXkKK0NPTkZJR19JUF9ST1VURV9NVUxUSVBBVEg9eQorQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorQ09ORklHX05FVF9JUElQPXkKK0NPTkZJR19JUF9NUk9VVEU9eQorQ09ORklHX0lQX1BJTVNNX1YxPXkKK0NPTkZJR19JUF9QSU1TTV9WMj15CitDT05GSUdfQVJQRD15CitDT05GSUdfSU5FVF9BSD15CitDT05GSUdfSU5FVF9FU1A9eQorQ09ORklHX0lORVRfSVBDT01QPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2PXkKK0NPTkZJR19JUF9TQ1RQPW0KK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfTVREPXkKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfUEhZU01BUF9PRj15CitDT05GSUdfTVREX00yNVA4MD15CitDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTEzMTA3MgorQ09ORklHX01JU0NfREVWSUNFUz15CitDT05GSUdfQkxLX0RFVl9TRD15CitDT05GSUdfQ0hSX0RFVl9TVD15CitDT05GSUdfQkxLX0RFVl9TUj15CitDT05GSUdfQ0hSX0RFVl9TRz15CitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQorQ09ORklHX1NDU0lfTE9HR0lORz15CitDT05GSUdfU0NTSV9TWU01M0M4WFhfMj15CitDT05GSUdfQVRBPXkKK0NPTkZJR19TQVRBX0FIQ0k9eQorQ09ORklHX1NBVEFfRlNMPXkKK0NPTkZJR19TQVRBX1NJTDI0PXkKK0NPTkZJR19TQVRBX1NJTD15CitDT05GSUdfUEFUQV9TSUw2ODA9eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX1ZJVEVTU0VfUEhZPXkKK0NPTkZJR19GSVhFRF9QSFk9eQorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfRTEwMDA9eQorQ09ORklHX0UxMDAwRT15CitDT05GSUdfRlNMX1BRX01ESU89eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0VQQVBSX0hWX0JZVEVDSEFOPXkKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFM9eQorQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwX1JTQT15CitDT05GSUdfSFdfUkFORE9NPXkKK0NPTkZJR19OVlJBTT15CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfTVBDPXkKK0NPTkZJR19TUEk9eQorQ09ORklHX1NQSV9HUElPPXkKK0NPTkZJR19TUElfRlNMX1NQST15CitDT05GSUdfU1BJX0ZTTF9FU1BJPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD15CitDT05GSUdfVVNCX0hJRD1tCitDT05GSUdfVVNCPXkKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorQ09ORklHX1VTQl9NT049eQorQ09ORklHX1VTQl9FSENJX0hDRD15CitDT05GSUdfVVNCX0VIQ0lfRlNMPXkKK0NPTkZJR19VU0JfT0hDSV9IQ0Q9eQorQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfQkU9eQorQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfTEU9eQorQ09ORklHX1VTQl9TVE9SQUdFPXkKK0NPTkZJR19NTUM9eQorQ09ORklHX01NQ19TREhDST15CitDT05GSUdfTU1DX1NESENJX09GPXkKK0NPTkZJR19NTUNfU0RIQ0lfT0ZfRVNESEM9eQorQ09ORklHX0VEQUM9eQorQ09ORklHX0VEQUNfTU1fRURBQz15CitDT05GSUdfRURBQ19NUEM4NVhYPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19EUlZfRFMzMjMyPXkKK0NPTkZJR19SVENfRFJWX0NNT1M9eQorQ09ORklHX1VJTz15CitDT05GSUdfU1RBR0lORz15CisjIENPTkZJR19TVEFHSU5HX0VYQ0xVREVfQlVJTEQgaXMgbm90IHNldAorQ09ORklHX1ZJUlRfRFJJVkVSUz15CitDT05GSUdfRlNMX0hWX01BTkFHRVI9eQorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKK0NPTkZJR19JU085NjYwX0ZTPW0KK0NPTkZJR19KT0xJRVQ9eQorQ09ORklHX1pJU09GUz15CitDT05GSUdfVURGX0ZTPW0KK0NPTkZJR19NU0RPU19GUz1tCitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfTlRGU19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfVE1QRlM9eQorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19DUkFNRlM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKK0NPTkZJR19ORlNfVjQ9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19ORlNEPW0KK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorQ09ORklHX01BQ19QQVJUSVRJT049eQorQ09ORklHX05MU19JU084ODU5XzE9eQorQ09ORklHX05MU19VVEY4PW0KK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19ERUJVR19TSElSUT15CitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CitDT05GSUdfREVCVUdfSU5GTz15CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorQ09ORklHX0NSWVBUT19OVUxMPXkKK0NPTkZJR19DUllQVE9fUENCQz1tCitDT05GSUdfQ1JZUFRPX01END15CitDT05GSUdfQ1JZUFRPX1NIQTI1Nj15CitDT05GSUdfQ1JZUFRPX1NIQTUxMj15CitDT05GSUdfQ1JZUFRPX0FFUz15CisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9lNTV4eF9zbXBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDY0X3NtcF9kZWZjb25maWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvcG93ZXJwYy9jb25maWdzL2U1NXh4X3NtcF9kZWZjb25maWcKcmVuYW1lIHRvIGFyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQ2NF9zbXBfZGVmY29uZmlnCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfZGVmY29uZmlnCmluZGV4IDk2Yjg5ZGYuLmZjZDg1ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfZGVmY29uZmlnCkBAIC01LDYgKzUsNyBAQAogQ09ORklHX1BPU0lYX01RVUVVRT15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiBDT05GSUdfQVVESVQ9eQorQ09ORklHX1NQQVJTRV9JUlE9eQogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CkBAIC0yNSw3ICsyNiw5IEBACiBDT05GSUdfTVBDODUzNl9EUz15CiBDT05GSUdfTVBDODV4eF9EUz15CiBDT05GSUdfTVBDODV4eF9SREI9eQorQ09ORklHX1AxMDEwX1JEQj15CiBDT05GSUdfUDEwMjJfRFM9eQorQ09ORklHX1AxMDIzX1JEUz15CiBDT05GSUdfU09DUkFURVM9eQogQ09ORklHX0tTSTg1NjA9eQogQ09ORklHX1hFU19NUEM4NXh4PXkKQEAgLTQ0LDcgKzQ3LDYgQEAKIENPTkZJR19ISUdIX1JFU19USU1FUlM9eQogQ09ORklHX0JJTkZNVF9NSVNDPW0KIENPTkZJR19NQVRIX0VNVUxBVElPTj15Ci1DT05GSUdfU1BBUlNFX0lSUT15CiBDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xMgogQ09ORklHX1BDST15CiBDT05GSUdfUENJX01TST15CkBAIC02NSw4ICs2Nyw2IEBACiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKIENPTkZJR19JUF9QTlBfUkFSUD15CiBDT05GSUdfTkVUX0lQSVA9eQotQ09ORklHX05FVF9JUEdSRT15Ci1DT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVD15CiBDT05GSUdfSVBfTVJPVVRFPXkKIENPTkZJR19JUF9QSU1TTV9WMT15CiBDT05GSUdfSVBfUElNU01fVjI9eQpAQCAtMTI4LDYgKzEyOCwxMCBAQAogQ09ORklHX0ZCPXkKIENPTkZJR19GQl9GU0xfRElVPXkKICMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GT05UUz15CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0ZPTlRfOHgxNj15CiBDT05GSUdfU09VTkQ9eQogQ09ORklHX1NORD15CiAjIENPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJIGlzIG5vdCBzZXQKQEAgLTE3MCw3ICsxNzQsNiBAQAogQ09ORklHX0VYVDJfRlM9eQogQ09ORklHX0VYVDNfRlM9eQogIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKLUNPTkZJR19JTk9USUZZPXkKIENPTkZJR19JU085NjYwX0ZTPW0KIENPTkZJR19KT0xJRVQ9eQogQ09ORklHX1pJU09GUz15CkBAIC0yMDUsNyArMjA4LDYgQEAKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogQ09ORklHX0RFQlVHX0lORk89eQotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX1ZJUlFfREVCVUc9eQogQ09ORklHX0NSWVBUT19QQ0JDPW0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfc21wX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfc21wX2RlZmNvbmZpZwppbmRleCBkZTY1ODQxLi45MDhjOTQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X3NtcF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9zbXBfZGVmY29uZmlnCkBAIC03LDYgKzcsNyBAQAogQ09ORklHX1BPU0lYX01RVUVVRT15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiBDT05GSUdfQVVESVQ9eQorQ09ORklHX1NQQVJTRV9JUlE9eQogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CkBAIC0yOCw2ICsyOSw3IEBACiBDT05GSUdfTVBDODV4eF9EUz15CiBDT05GSUdfTVBDODV4eF9SREI9eQogQ09ORklHX1AxMDIyX0RTPXkKK0NPTkZJR19QMTAyM19SRFM9eQogQ09ORklHX1NPQ1JBVEVTPXkKIENPTkZJR19LU0k4NTYwPXkKIENPTkZJR19YRVNfTVBDODV4eD15CkBAIC00Niw3ICs0OCw2IEBACiBDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKIENPTkZJR19CSU5GTVRfTUlTQz1tCiBDT05GSUdfTUFUSF9FTVVMQVRJT049eQotQ09ORklHX1NQQVJTRV9JUlE9eQogQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTIKIENPTkZJR19QQ0k9eQogQ09ORklHX1BDSV9NU0k9eQpAQCAtNjcsOCArNjgsNiBAQAogQ09ORklHX0lQX1BOUF9CT09UUD15CiBDT05GSUdfSVBfUE5QX1JBUlA9eQogQ09ORklHX05FVF9JUElQPXkKLUNPTkZJR19ORVRfSVBHUkU9eQotQ09ORklHX05FVF9JUEdSRV9CUk9BRENBU1Q9eQogQ09ORklHX0lQX01ST1VURT15CiBDT05GSUdfSVBfUElNU01fVjE9eQogQ09ORklHX0lQX1BJTVNNX1YyPXkKQEAgLTEzMCw2ICsxMjksMTAgQEAKIENPTkZJR19GQj15CiBDT05GSUdfRkJfRlNMX0RJVT15CiAjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CitDT05GSUdfRk9OVFM9eQorQ09ORklHX0ZPTlRfOHg4PXkKK0NPTkZJR19GT05UXzh4MTY9eQogQ09ORklHX1NPVU5EPXkKIENPTkZJR19TTkQ9eQogIyBDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQSSBpcyBub3Qgc2V0CkBAIC0xNzIsNyArMTc1LDYgQEAKIENPTkZJR19FWFQyX0ZTPXkKIENPTkZJR19FWFQzX0ZTPXkKICMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5PVElGWT15CiBDT05GSUdfSVNPOTY2MF9GUz1tCiBDT05GSUdfSk9MSUVUPXkKIENPTkZJR19aSVNPRlM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCmluZGV4IDc2NzM2MDEuLjg0YTY4NWE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCkBAIC0xNzYsMTIgKzE3NiwxOSBAQAogQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKIENPTkZJR19TQ1NJX0NPTlNUQU5UUz15CiBDT05GSUdfU0NTSV9GQ19BVFRSUz15CitDT05GSUdfU0NTSV9TQVNfQVRUUlM9bQorQ09ORklHX1NDU0lfQ1hHQjNfSVNDU0k9bQorQ09ORklHX1NDU0lfQ1hHQjRfSVNDU0k9bQorQ09ORklHX1NDU0lfQk5YMl9JU0NTST1tCitDT05GSUdfQkUySVNDU0k9bQorQ09ORklHX1NDU0lfTVBUMlNBUz1tCiBDT05GSUdfU0NTSV9JQk1WU0NTST15CiBDT05GSUdfU0NTSV9JQk1WRkM9bQogQ09ORklHX1NDU0lfU1lNNTNDOFhYXzI9eQogQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RNQV9BRERSRVNTSU5HX01PREU9MAogQ09ORklHX1NDU0lfSVBSPXkKIENPTkZJR19TQ1NJX1FMQV9GQz1tCitDT05GSUdfU0NTSV9RTEFfSVNDU0k9bQogQ09ORklHX1NDU0lfTFBGQz1tCiBDT05GSUdfQVRBPXkKIENPTkZJR19TQVRBX1NJTDI0PXkKQEAgLTIzNSwxMSArMjQyLDEzIEBACiBDT05GSUdfRTEwMDA9eQogQ09ORklHX0UxMDAwRT15CiBDT05GSUdfVElHT04zPXkKK0NPTkZJR19CTlgyPW0KIENPTkZJR19TUElERVJfTkVUPW0KIENPTkZJR19HRUxJQ19ORVQ9bQogQ09ORklHX0dFTElDX1dJUkVMRVNTPXkKIENPTkZJR19DSEVMU0lPX1QxPW0KIENPTkZJR19DSEVMU0lPX1QzPW0KK0NPTkZJR19DSEVMU0lPX1Q0PW0KIENPTkZJR19FSEVBPW0KIENPTkZJR19JWEdCRT1tCiBDT05GSUdfSVhHQj1tCkBAIC0yNDgsNiArMjU3LDggQEAKIENPTkZJR19ORVRYRU5fTklDPW0KIENPTkZJR19QQVNFTUlfTUFDPXkKIENPTkZJR19NTFg0X0VOPW0KK0NPTkZJR19RTEdFPW0KK0NPTkZJR19CRTJORVQ9bQogQ09ORklHX0lTRVJJRVNfVkVUSD1tCiBDT05GSUdfUFBQPW0KIENPTkZJR19QUFBfQVNZTkM9bQpAQCAtMzMwLDYgKzM0MSw4IEBACiBDT05GSUdfSU5GSU5JQkFORF9VU0VSX0FDQ0VTUz1tCiBDT05GSUdfSU5GSU5JQkFORF9NVEhDQT1tCiBDT05GSUdfSU5GSU5JQkFORF9FSENBPW0KK0NPTkZJR19JTkZJTklCQU5EX0NYR0IzPW0KK0NPTkZJR19JTkZJTklCQU5EX0NYR0I0PW0KIENPTkZJR19NTFg0X0lORklOSUJBTkQ9bQogQ09ORklHX0lORklOSUJBTkRfSVBPSUI9bQogQ09ORklHX0lORklOSUJBTkRfSVBPSUJfQ009eQpAQCAtNDMwLDExICs0NDMsMTIgQEAKIENPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19NQUdJQ19TWVNSUT15CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19MT0NLVVBfREVURUNUT1I9eQorQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogQ09ORklHX0RFQlVHX01VVEVYRVM9eQogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTEFURU5DWVRPUD15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQotQ09ORklHX0lSUVNPRkZfVFJBQ0VSPXkKIENPTkZJR19TQ0hFRF9UUkFDRVI9eQogQ09ORklHX0JMS19ERVZfSU9fVFJBQ0U9eQogQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1c9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcKaW5kZXggNjQ3MjMyMi4uMTg1YzI5MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnCkBAIC0xNDEsNyArMTQxLDcgQEAKICMgQ09ORklHX1VTQl9FSENJX0hDRF9QUENfT0YgaXMgbm90IHNldAogQ09ORklHX1VTQl9PSENJX0hDRD1tCiBDT05GSUdfVVNCX1NUT1JBR0U9bQotQ09ORklHX1JUQ19DTEFTUz1tCitDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfRFJWX1BTMz1tCiBDT05GSUdfRVhUMl9GUz1tCiBDT05GSUdfRVhUM19GUz1tCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnCmluZGV4IGM5ZjIxMmIuLjk2YTU4YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnCkBAIC0xNDgsOCArMTQ4LDggQEAKIENPTkZJR19TQ1NJX0NYR0IzX0lTQ1NJPW0KIENPTkZJR19TQ1NJX0NYR0I0X0lTQ1NJPW0KIENPTkZJR19TQ1NJX0JOWDJfSVNDU0k9bQotQ09ORklHX1NDU0lfQk5YMl9JU0NTST1tCiBDT05GSUdfQkUySVNDU0k9bQorQ09ORklHX1NDU0lfTVBUMlNBUz1tCiBDT05GSUdfU0NTSV9JQk1WU0NTST15CiBDT05GSUdfU0NTSV9JQk1WRkM9bQogQ09ORklHX1NDU0lfU1lNNTNDOFhYXzI9eQpAQCAtMzIxLDYgKzMyMSw4IEBACiBDT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTE9DS1VQX0RFVEVDVE9SPXkKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogQ09ORklHX0xBVEVOQ1lUT1A9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS84MjUzcGl0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vODI1M3BpdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzFjOWMxLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS84MjUzcGl0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qCi0gKiA4MjUzLzgyNTQgUHJvZ3JhbW1hYmxlIEludGVydmFsIFRpbWVyCi0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKaW5kZXggYzBkODQyYy4uZTMwNDQyYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKQEAgLTE3OSw4ICsxNzksOSBAQAogI2RlZmluZSBMT05HX0FTTV9DT05TVCh4KQkJMAogI2VuZGlmCiAKLQotI2RlZmluZSBDUFVfRlRSX0hWTU9ERV8yMDYJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDAwMDgwMDAwMDAwMCkKKyNkZWZpbmUgQ1BVX0ZUUl9IVk1PREUJCQlMT05HX0FTTV9DT05TVCgweDAwMDAwMDAyMDAwMDAwMDApCisjZGVmaW5lIENQVV9GVFJfQVJDSF8yMDEJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDAwMDQwMDAwMDAwMCkKKyNkZWZpbmUgQ1BVX0ZUUl9BUkNIXzIwNgkJTE9OR19BU01fQ09OU1QoMHgwMDAwMDAwODAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0NGQVIJCQlMT05HX0FTTV9DT05TVCgweDAwMDAwMDEwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfSUFCUgkJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDAwMjAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9NTUNSQQkJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDAwNDAwMDAwMDAwMCkKQEAgLTQwMSw5ICs0MDIsMTAgQEAKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1BfVVNFX0RDQlRaIHwgXAogCSAgICBDUFVfRlRSX1NUQ1hfQ0hFQ0tTX0FERFJFU1MpCiAjZGVmaW5lIENQVV9GVFJTX1BQQzk3MAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0xXU1lOQyB8IFwKLQkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAorCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBDUFVfRlRSX0FSQ0hfMjAxIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfQ0FOX05BUCB8IENQVV9GVFJfTU1DUkEgfCBcCi0JICAgIENQVV9GVFJfQ1BfVVNFX0RDQlRaIHwgQ1BVX0ZUUl9TVENYX0NIRUNLU19BRERSRVNTKQorCSAgICBDUFVfRlRSX0NQX1VTRV9EQ0JUWiB8IENQVV9GVFJfU1RDWF9DSEVDS1NfQUREUkVTUyB8IFwKKwkgICAgQ1BVX0ZUUl9IVk1PREUpCiAjZGVmaW5lIENQVV9GVFJTX1BPV0VSNQkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0xXU1lOQyB8IFwKIAkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCkBAIC00MTcsMTMgKzQxOSwxMyBAQAogCSAgICBDUFVfRlRSX0RTQ1IgfCBDUFVfRlRSX1VOQUxJR05FRF9MRF9TVEQgfCBcCiAJICAgIENQVV9GVFJfU1RDWF9DSEVDS1NfQUREUkVTUyB8IENQVV9GVFJfUE9QQ05UQiB8IENQVV9GVFJfQ0ZBUikKICNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI3IChDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTFdTWU5DIHwgXAotCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBDUFVfRlRSX0hWTU9ERV8yMDYgfFwKKwkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgQ1BVX0ZUUl9BUkNIXzIwNiB8XAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCiAJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgXAogCSAgICBDUFVfRlRSX1BVUlIgfCBDUFVfRlRSX1NQVVJSIHwgQ1BVX0ZUUl9SRUFMX0xFIHwgXAogCSAgICBDUFVfRlRSX0RTQ1IgfCBDUFVfRlRSX1NBTyAgfCBDUFVfRlRSX0FTWU1fU01UIHwgXAogCSAgICBDUFVfRlRSX1NUQ1hfQ0hFQ0tTX0FERFJFU1MgfCBDUFVfRlRSX1BPUENOVEIgfCBDUFVfRlRSX1BPUENOVEQgfCBcCi0JICAgIENQVV9GVFJfSUNTV1ggfCBDUFVfRlRSX0NGQVIpCisJICAgIENQVV9GVFJfSUNTV1ggfCBDUFVfRlRSX0NGQVIgfCBDUFVfRlRSX0hWTU9ERSkKICNkZWZpbmUgQ1BVX0ZUUlNfQ0VMTAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0xXU1lOQyB8IFwKIAkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8IFwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kYmVsbC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RiZWxsLmgKaW5kZXggOWM3MGQwYy4uZWZhNzRhYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RiZWxsLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RiZWxsLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vcHBjLW9wY29kZS5oPgogCiAjZGVmaW5lIFBQQ19EQkVMTF9NU0dfQlJEQ0FTVAkoMHgwNDAwMDAwMCkKLSNkZWZpbmUgUFBDX0RCRUxMX1RZUEUoeCkJKCgoeCkgJiAweGYpIDw8IDI4KQorI2RlZmluZSBQUENfREJFTExfVFlQRSh4KQkoKCh4KSAmIDB4ZikgPDwgKDYzLTM2KSkKIGVudW0gcHBjX2RiZWxsIHsKIAlQUENfREJFTEwgPSAwLAkJLyogZG9vcmJlbGwgKi8KIAlQUENfREJFTExfQ1JJVCA9IDEsCS8qIGNyaXRpY2FsIGRvb3JiZWxsICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZWh2X3BpYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Vodl9waWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWUxZjRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Vodl9waWMuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogRUhWX1BJQyBwcml2YXRlIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmUuCisgKgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisjaWZuZGVmIF9fRUhWX1BJQ19IX18KKyNkZWZpbmUgX19FSFZfUElDX0hfXworCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisKKyNkZWZpbmUgTlJfRUhWX1BJQ19JTlRTIDEwMjQKKworI2RlZmluZSBFSFZfUElDX0lORk8obmFtZSkgRUhWX1BJQ18jI25hbWUKKworI2RlZmluZSBFSFZfUElDX1ZFQ1BSSV9QT0xBUklUWV9ORUdBVElWRSAwCisjZGVmaW5lIEVIVl9QSUNfVkVDUFJJX1BPTEFSSVRZX1BPU0lUSVZFIDEKKyNkZWZpbmUgRUhWX1BJQ19WRUNQUklfU0VOU0VfRURHRSAwCisjZGVmaW5lIEVIVl9QSUNfVkVDUFJJX1NFTlNFX0xFVkVMIDB4MgorI2RlZmluZSBFSFZfUElDX1ZFQ1BSSV9QT0xBUklUWV9NQVNLIDB4MQorI2RlZmluZSBFSFZfUElDX1ZFQ1BSSV9TRU5TRV9NQVNLIDB4MgorCitzdHJ1Y3QgZWh2X3BpYyB7CisJLyogVGhlIHJlbWFwcGVyIGZvciB0aGlzIEVIVl9QSUMgKi8KKwlzdHJ1Y3QgaXJxX2hvc3QJKmlycWhvc3Q7CisKKwkvKiBUaGUgImxpbnV4IiBjb250cm9sbGVyIHN0cnVjdCAqLworCXN0cnVjdCBpcnFfY2hpcAloY19pcnE7CisKKwkvKiBjb3JlIGludCBmbGFnICovCisJaW50IGNvcmVpbnRfZmxhZzsKK307CisKK3ZvaWQgZWh2X3BpY19pbml0KHZvaWQpOwordW5zaWduZWQgaW50IGVodl9waWNfZ2V0X2lycSh2b2lkKTsKKworI2VuZGlmIC8qIF9fRUhWX1BJQ19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCAyYjkxN2M2Li4zYmY5Y2NhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC0yNjcsNyArMjY3LDcgQEAKIHN0cnVjdCBsaW51eF9iaW5wcm07CiBleHRlcm4gaW50IGFyY2hfc2V0dXBfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLAogCQkJCSAgICAgICBpbnQgdXNlc19pbnRlcnApOwotI2RlZmluZSBWRFNPX0FVWF9FTlQoYSxiKSBORVdfQVVYX0VOVChhLGIpOworI2RlZmluZSBWRFNPX0FVWF9FTlQoYSxiKSBORVdfQVVYX0VOVChhLGIpCiAKIC8qIDFHQiBmb3IgNjRiaXQsIDhNQiBmb3IgMzJiaXQgKi8KICNkZWZpbmUgU1RBQ0tfUk5EX01BU0sgKGlzXzMyYml0X3Rhc2soKSA/IFwKQEAgLTI5OCw3ICsyOTgsNyBAQAogCU5FV19BVVhfRU5UKEFUX0RDQUNIRUJTSVpFLCBkY2FjaGVfYnNpemUpOwkJCVwKIAlORVdfQVVYX0VOVChBVF9JQ0FDSEVCU0laRSwgaWNhY2hlX2JzaXplKTsJCQlcCiAJTkVXX0FVWF9FTlQoQVRfVUNBQ0hFQlNJWkUsIHVjYWNoZV9ic2l6ZSk7CQkJXAotCVZEU09fQVVYX0VOVChBVF9TWVNJTkZPX0VIRFIsIGN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc29fYmFzZSkJXAorCVZEU09fQVVYX0VOVChBVF9TWVNJTkZPX0VIRFIsIGN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc29fYmFzZSk7CVwKIH0gd2hpbGUgKDApCiAKIC8qIFBvd2VyUEM2NCByZWxvY2F0aW9ucyBkZWZpbmVkIGJ5IHRoZSBBQklzICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZW11bGF0ZWRfb3BzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZW11bGF0ZWRfb3BzLmgKaW5kZXggNDU5MjE2Ny4uMmNjNDFjNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2VtdWxhdGVkX29wcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lbXVsYXRlZF9vcHMuaApAQCAtNzgsMTQgKzc4LDE0IEBACiAjZGVmaW5lIFBQQ19XQVJOX0VNVUxBVEVEKHR5cGUsIHJlZ3MpCQkJCQlcCiAJZG8gewkJCQkJCQkJXAogCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfRU1VTEFUSU9OX0ZBVUxUUywJCVwKLQkJCTEsIDAsIHJlZ3MsIDApOwkJCQkJXAorCQkJMSwgcmVncywgMCk7CQkJCQlcCiAJCV9fUFBDX1dBUk5fRU1VTEFURUQodHlwZSk7CQkJCVwKIAl9IHdoaWxlICgwKQogCiAjZGVmaW5lIFBQQ19XQVJOX0FMSUdOTUVOVCh0eXBlLCByZWdzKQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0FMSUdOTUVOVF9GQVVMVFMsCQlcCi0JCQkxLCAwLCByZWdzLCByZWdzLT5kYXIpOwkJCQlcCisJCQkxLCByZWdzLCByZWdzLT5kYXIpOwkJCQlcCiAJCV9fUFBDX1dBUk5fRU1VTEFURUQodHlwZSk7CQkJCVwKIAl9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXBhcHJfaGNhbGxzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXBhcHJfaGNhbGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiMGMyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lcGFwcl9oY2FsbHMuaApAQCAtMCwwICsxLDUwMiBAQAorLyoKKyAqIGVQQVBSIGhjYWxsIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAyMDA4LTIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBBdXRob3I6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyogQSAiaHlwZXJjYWxsIiBpcyBhbiAic2MgMSIgaW5zdHJ1Y3Rpb24uICBUaGlzIGhlYWRlciBmaWxlIGZpbGUgcHJvdmlkZXMgQworICogd3JhcHBlciBmdW5jdGlvbnMgZm9yIHRoZSBlUEFQUiBoeXBlcnZpc29yIGludGVyZmFjZS4gIEl0IGlzIGludGVkZWQKKyAqIGZvciB1c2UgYnkgTGludXggZGV2aWNlIGRyaXZlcnMgYW5kIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLgorICoKKyAqIFRoZSBoeXBlcmNhbGxzIGFyZSBpbXBsZW1lbnRlZCBhcyBpbmxpbmUgYXNzZW1ibHksIHJhdGhlciB0aGFuIGFzc2VtYmx5CisgKiBsYW5ndWFnZSBmdW5jdGlvbnMgaW4gYSAuUyBmaWxlLCBmb3Igb3B0aW1pemF0aW9uLiAgSXQgYWxsb3dzCisgKiB0aGUgY2FsbGVyIHRvIGlzc3VlIHRoZSBoeXBlcmNhbGwgaW5zdHJ1Y3Rpb24gZGlyZWN0bHksIGltcHJvdmluZyBib3RoCisgKiBwZXJmb3JtYW5jZSBhbmQgbWVtb3J5IGZvb3RwcmludC4KKyAqLworCisjaWZuZGVmIF9FUEFQUl9IQ0FMTFNfSAorI2RlZmluZSBfRVBBUFJfSENBTExTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNkZWZpbmUgRVZfQllURV9DSEFOTkVMX1NFTkQJCTEKKyNkZWZpbmUgRVZfQllURV9DSEFOTkVMX1JFQ0VJVkUJCTIKKyNkZWZpbmUgRVZfQllURV9DSEFOTkVMX1BPTEwJCTMKKyNkZWZpbmUgRVZfSU5UX1NFVF9DT05GSUcJCTQKKyNkZWZpbmUgRVZfSU5UX0dFVF9DT05GSUcJCTUKKyNkZWZpbmUgRVZfSU5UX1NFVF9NQVNLCQkJNgorI2RlZmluZSBFVl9JTlRfR0VUX01BU0sJCQk3CisjZGVmaW5lIEVWX0lOVF9JQUNLCQkJOQorI2RlZmluZSBFVl9JTlRfRU9JCQkJMTAKKyNkZWZpbmUgRVZfSU5UX1NFTkRfSVBJCQkJMTEKKyNkZWZpbmUgRVZfSU5UX1NFVF9UQVNLX1BSSU9SSVRZCTEyCisjZGVmaW5lIEVWX0lOVF9HRVRfVEFTS19QUklPUklUWQkxMworI2RlZmluZSBFVl9ET09SQkVMTF9TRU5ECQkxNAorI2RlZmluZSBFVl9NU0dTTkQJCQkxNQorI2RlZmluZSBFVl9JRExFCQkJCTE2CisKKy8qIHZlbmRvciBJRDogZXBhcHIgKi8KKyNkZWZpbmUgRVZfTE9DQUxfVkVORE9SX0lECQkwCS8qIGZvciBwcml2YXRlIHVzZSAqLworI2RlZmluZSBFVl9FUEFQUl9WRU5ET1JfSUQJCTEKKyNkZWZpbmUgRVZfRlNMX1ZFTkRPUl9JRAkJMgkvKiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciAqLworI2RlZmluZSBFVl9JQk1fVkVORE9SX0lECQkzCS8qIElCTSAqLworI2RlZmluZSBFVl9HSFNfVkVORE9SX0lECQk0CS8qIEdyZWVuIEhpbGxzIFNvZnR3YXJlICovCisjZGVmaW5lIEVWX0VORUFfVkVORE9SX0lECQk1CS8qIEVuZWEgKi8KKyNkZWZpbmUgRVZfV1JfVkVORE9SX0lECQkJNgkvKiBXaW5kIFJpdmVyIFN5c3RlbXMgKi8KKyNkZWZpbmUgRVZfQU1DQ19WRU5ET1JfSUQJCTcJLyogQXBwbGllZCBNaWNybyBDaXJjdWl0cyAqLworI2RlZmluZSBFVl9LVk1fVkVORE9SX0lECQk0MgkvKiBLVk0gKi8KKworLyogVGhlIG1heCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJ5dGUgY2hhbm5lbCBjYW4gc2VuZCBvciByZWNlaXZlIHBlciBjYWxsICovCisjZGVmaW5lIEVWX0JZVEVfQ0hBTk5FTF9NQVhfQllURVMJMTYKKworCisjZGVmaW5lIF9FVl9IQ0FMTF9UT0tFTihpZCwgbnVtKSAoKChpZCkgPDwgMTYpIHwgKG51bSkpCisjZGVmaW5lIEVWX0hDQUxMX1RPS0VOKGhjYWxsX251bSkgX0VWX0hDQUxMX1RPS0VOKEVWX0VQQVBSX1ZFTkRPUl9JRCwgaGNhbGxfbnVtKQorCisvKiBlcGFwciBlcnJvciBjb2RlcyAqLworI2RlZmluZSBFVl9FUEVSTQkJMQkvKiBPcGVyYXRpb24gbm90IHBlcm1pdHRlZCAqLworI2RlZmluZSBFVl9FTk9FTlQJCTIJLyogIEVudHJ5IE5vdCBGb3VuZCAqLworI2RlZmluZSBFVl9FSU8JCQkzCS8qIEkvTyBlcnJvciBvY2N1cmVkICovCisjZGVmaW5lIEVWX0VBR0FJTgkJNAkvKiBUaGUgb3BlcmF0aW9uIGhhZCBpbnN1ZmZpY2llbnQKKwkJCQkJICogcmVzb3VyY2VzIHRvIGNvbXBsZXRlIGFuZCBzaG91bGQgYmUKKwkJCQkJICogcmV0cmllZAorCQkJCQkgKi8KKyNkZWZpbmUgRVZfRU5PTUVNCQk1CS8qIFRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvCisJCQkJCSAqIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRVZfRUZBVUxUCQk2CS8qIEJhZCBndWVzdCBhZGRyZXNzICovCisjZGVmaW5lIEVWX0VOT0RFVgkJNwkvKiBObyBzdWNoIGRldmljZSAqLworI2RlZmluZSBFVl9FSU5WQUwJCTgJLyogQW4gYXJndW1lbnQgc3VwcGxpZWQgdG8gdGhlIGhjYWxsCisJCQkJCSAgIHdhcyBvdXQgb2YgcmFuZ2Ugb3IgaW52YWxpZCAqLworI2RlZmluZSBFVl9JTlRFUk5BTAkJOQkvKiBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cmVkICovCisjZGVmaW5lIEVWX0NPTkZJRwkJMTAJLyogQSBjb25maWd1cmF0aW9uIGVycm9yIHdhcyBkZXRlY3RlZCAqLworI2RlZmluZSBFVl9JTlZBTElEX1NUQVRFCTExCS8qIFRoZSBvYmplY3QgaXMgaW4gYW4gaW52YWxpZCBzdGF0ZSAqLworI2RlZmluZSBFVl9VTklNUExFTUVOVEVECTEyCS8qIFVuaW1wbGVtZW50ZWQgaHlwZXJjYWxsICovCisjZGVmaW5lIEVWX0JVRkZFUl9PVkVSRkxPVwkxMwkvKiBDYWxsZXItc3VwcGxpZWQgYnVmZmVyIHRvbyBzbWFsbCAqLworCisvKgorICogSHlwZXJjYWxsIHJlZ2lzdGVyIGNsb2JiZXIgbGlzdAorICoKKyAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byBkZWZpbmUgdGhlIGxpc3Qgb2YgY2xvYmJlcmVkIHJlZ2lzdGVycyBkdXJpbmcgYQorICogaHlwZXJjYWxsLiAgVGVjaG5pY2FsbHksIHJlZ2lzdGVycyByMCBhbmQgcjMtcjEyIGFyZSBhbHdheXMgY2xvYmJlcmVkLAorICogYnV0IHRoZSBnY2MgaW5saW5lIGFzc2VtYmx5IHN5bnRheCBkb2VzIG5vdCBhbGxvdyB1cyB0byBzcGVjaWZ5IHJlZ2lzdGVycworICogb24gdGhlIGNsb2JiZXIgbGlzdCB0aGF0IGFyZSBhbHNvIG9uIHRoZSBpbnB1dC9vdXRwdXQgbGlzdC4gIFRoZXJlZm9yZSwKKyAqIHRoZSBsaXN0cyBvZiBjbG9iYmVyZWQgcmVnaXN0ZXJzIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiByZWdpc3RlcgorICogcGFybWV0ZXJzICgiK3IiIGFuZCAiPXIiKSBwYXNzZWQgdG8gdGhlIGh5cGVyY2FsbC4KKyAqCisgKiBFYWNoIGFzc2VtYmx5IGJsb2NrIHNob3VsZCB1c2Ugb25lIG9mIHRoZSBIQ0FMTF9DTE9CQkVSU3ggbWFjcm9zLiAgQXMgYQorICogZ2VuZXJhbCBydWxlLCAneCcgaXMgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgYXNzZW1ibHkKKyAqIGJsb2NrICpleGNlcHQqIGZvciByMTEuCisgKgorICogSWYgeW91J3JlIG5vdCBzdXJlLCBqdXN0IHVzZSB0aGUgc21hbGxlc3QgdmFsdWUgb2YgJ3gnIHRoYXQgZG9lcyBub3QKKyAqIGdlbmVyYXRlIGEgY29tcGlsYXRpb24gZXJyb3IuICBCZWNhdXNlIHRoZXNlIGFyZSBzdGF0aWMgaW5saW5lIGZ1bmN0aW9ucywKKyAqIHRoZSBjb21waWxlciB3aWxsIG9ubHkgY2hlY2sgdGhlIGNsb2JiZXIgbGlzdCBmb3IgYSBmdW5jdGlvbiBpZiB5b3UKKyAqIGNvbXBpbGUgY29kZSB0aGF0IGNhbGxzIHRoYXQgZnVuY3Rpb24uCisgKgorICogcjMgYW5kIHIxMSBhcmUgbm90IGluY2x1ZGVkIGluIGFueSBjbG9iYmVycyBsaXN0IGJlY2F1c2UgdGhleSBhcmUgYWx3YXlzCisgKiBsaXN0ZWQgYXMgb3V0cHV0IHJlZ2lzdGVycy4KKyAqCisgKiBYRVIsIENUUiwgYW5kIExSIGFyZSBjdXJyZW50bHkgbGlzdGVkIGFzIGNsb2JiZXJzIGJlY2F1c2UgaXQncyB1bmNlcnRhaW4KKyAqIHdoZXRoZXIgdGhleSB3aWxsIGJlIGNsb2JiZXJlZC4KKyAqCisgKiBOb3RlIHRoYXQgcjExIGNhbiBiZSB1c2VkIGFzIGFuIG91dHB1dCBwYXJhbWV0ZXIuCisqLworCisvKiBMaXN0IG9mIGNvbW1vbiBjbG9iYmVyZWQgcmVnaXN0ZXJzLiAgRG8gbm90IHVzZSB0aGlzIG1hY3JvLiAqLworI2RlZmluZSBFVl9IQ0FMTF9DTE9CQkVSUyAicjAiLCAicjEyIiwgInhlciIsICJjdHIiLCAibHIiLCAiY2MiCisKKyNkZWZpbmUgRVZfSENBTExfQ0xPQkJFUlM4IEVWX0hDQUxMX0NMT0JCRVJTCisjZGVmaW5lIEVWX0hDQUxMX0NMT0JCRVJTNyBFVl9IQ0FMTF9DTE9CQkVSUzgsICJyMTAiCisjZGVmaW5lIEVWX0hDQUxMX0NMT0JCRVJTNiBFVl9IQ0FMTF9DTE9CQkVSUzcsICJyOSIKKyNkZWZpbmUgRVZfSENBTExfQ0xPQkJFUlM1IEVWX0hDQUxMX0NMT0JCRVJTNiwgInI4IgorI2RlZmluZSBFVl9IQ0FMTF9DTE9CQkVSUzQgRVZfSENBTExfQ0xPQkJFUlM1LCAicjciCisjZGVmaW5lIEVWX0hDQUxMX0NMT0JCRVJTMyBFVl9IQ0FMTF9DTE9CQkVSUzQsICJyNiIKKyNkZWZpbmUgRVZfSENBTExfQ0xPQkJFUlMyIEVWX0hDQUxMX0NMT0JCRVJTMywgInI1IgorI2RlZmluZSBFVl9IQ0FMTF9DTE9CQkVSUzEgRVZfSENBTExfQ0xPQkJFUlMyLCAicjQiCisKKworLyoKKyAqIFdlIHVzZSAidWludHB0cl90IiB0byBkZWZpbmUgYSByZWdpc3RlciBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBiZSBhCisgKiAzMi1iaXQgaW50ZWdlciBvbiBhIDMyLWJpdCBwbGF0Zm9ybSwgYW5kIGEgNjQtYml0IGludGVnZXIgb24gYSA2NC1iaXQKKyAqIHBsYXRmb3JtLgorICoKKyAqIEFsbCByZWdpc3RlcnMgYXJlIGVpdGhlciBpbnB1dC9vdXRwdXQgb3Igb3V0cHV0IG9ubHkuICBSZWdpc3RlcnMgdGhhdCBhcmUKKyAqIGluaXRpYWxpemVkIGJlZm9yZSBtYWtpbmcgdGhlIGh5cGVyY2FsbCBhcmUgaW5wdXQvb3V0cHV0LiAgQWxsCisgKiBpbnB1dC9vdXRwdXQgcmVnaXN0ZXJzIGFyZSByZXByZXNlbnRlZCB3aXRoICIrciIuICBPdXRwdXQtb25seSByZWdpc3RlcnMKKyAqIGFyZSByZXByZXNlbnRlZCB3aXRoICI9ciIuICBEbyBub3Qgc3BlY2lmeSBhbnkgdW51c2VkIHJlZ2lzdGVycy4gIFRoZQorICogY2xvYmJlciBsaXN0IHdpbGwgdGVsbCB0aGUgY29tcGlsZXIgdGhhdCB0aGUgaHlwZXJjYWxsIG1vZGlmaWVzIHRob3NlCisgKiByZWdpc3RlcnMsIHdoaWNoIGlzIGdvb2QgZW5vdWdoLgorICovCisKKy8qKgorICogZXZfaW50X3NldF9jb25maWcgLSBjb25maWd1cmUgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQKKyAqIEBpbnRlcnJ1cHQ6IHRoZSBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAY29uZmlnOiBjb25maWd1cmF0aW9uIGZvciB0aGlzIGludGVycnVwdAorICogQHByaW9yaXR5OiBpbnRlcnJ1cHQgcHJpb3JpdHkKKyAqIEBkZXN0aW5hdGlvbjogZGVzdGluYXRpb24gQ1BVIG51bWJlcgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXZfaW50X3NldF9jb25maWcodW5zaWduZWQgaW50IGludGVycnVwdCwKKwl1aW50MzJfdCBjb25maWcsIHVuc2lnbmVkIGludCBwcmlvcml0eSwgdWludDMyX3QgZGVzdGluYXRpb24pCit7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMSBfX2FzbV9fKCJyMTEiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjMgX19hc21fXygicjMiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjQgX19hc21fXygicjQiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjUgX19hc21fXygicjUiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjYgX19hc21fXygicjYiKTsKKworCXIxMSA9IEVWX0hDQUxMX1RPS0VOKEVWX0lOVF9TRVRfQ09ORklHKTsKKwlyMyAgPSBpbnRlcnJ1cHQ7CisJcjQgID0gY29uZmlnOworCXI1ICA9IHByaW9yaXR5OworCXI2ICA9IGRlc3RpbmF0aW9uOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzYyAxIgorCQk6ICIrciIgKHIxMSksICIrciIgKHIzKSwgIityIiAocjQpLCAiK3IiIChyNSksICIrciIgKHI2KQorCQk6IDogRVZfSENBTExfQ0xPQkJFUlM0CisJKTsKKworCXJldHVybiByMzsKK30KKworLyoqCisgKiBldl9pbnRfZ2V0X2NvbmZpZyAtIHJldHVybiB0aGUgY29uZmlnIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0CisgKiBAaW50ZXJydXB0OiB0aGUgaW50ZXJydXB0IG51bWJlcgorICogQGNvbmZpZzogcmV0dXJuZWQgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBpbnRlcnJ1cHQKKyAqIEBwcmlvcml0eTogcmV0dXJuZWQgaW50ZXJydXB0IHByaW9yaXR5CisgKiBAZGVzdGluYXRpb246IHJldHVybmVkIGRlc3RpbmF0aW9uIENQVSBudW1iZXIKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGV2X2ludF9nZXRfY29uZmlnKHVuc2lnbmVkIGludCBpbnRlcnJ1cHQsCisJdWludDMyX3QgKmNvbmZpZywgdW5zaWduZWQgaW50ICpwcmlvcml0eSwgdWludDMyX3QgKmRlc3RpbmF0aW9uKQoreworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMTEgX19hc21fXygicjExIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHIzIF9fYXNtX18oInIzIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI0IF9fYXNtX18oInI0Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI1IF9fYXNtX18oInI1Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI2IF9fYXNtX18oInI2Iik7CisKKwlyMTEgPSBFVl9IQ0FMTF9UT0tFTihFVl9JTlRfR0VUX0NPTkZJRyk7CisJcjMgPSBpbnRlcnJ1cHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNjIDEiCisJCTogIityIiAocjExKSwgIityIiAocjMpLCAiPXIiIChyNCksICI9ciIgKHI1KSwgIj1yIiAocjYpCisJCTogOiBFVl9IQ0FMTF9DTE9CQkVSUzQKKwkpOworCisJKmNvbmZpZyA9IHI0OworCSpwcmlvcml0eSA9IHI1OworCSpkZXN0aW5hdGlvbiA9IHI2OworCisJcmV0dXJuIHIzOworfQorCisvKioKKyAqIGV2X2ludF9zZXRfbWFzayAtIHNldHMgdGhlIG1hc2sgZm9yIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IHNvdXJjZQorICogQGludGVycnVwdDogdGhlIGludGVycnVwdCBudW1iZXIKKyAqIEBtYXNrOiAwPWVuYWJsZSBpbnRlcnJ1cHRzLCAxPWRpc2FibGUgaW50ZXJydXB0cworICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXZfaW50X3NldF9tYXNrKHVuc2lnbmVkIGludCBpbnRlcnJ1cHQsCisJdW5zaWduZWQgaW50IG1hc2spCit7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMSBfX2FzbV9fKCJyMTEiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjMgX19hc21fXygicjMiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjQgX19hc21fXygicjQiKTsKKworCXIxMSA9IEVWX0hDQUxMX1RPS0VOKEVWX0lOVF9TRVRfTUFTSyk7CisJcjMgPSBpbnRlcnJ1cHQ7CisJcjQgPSBtYXNrOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzYyAxIgorCQk6ICIrciIgKHIxMSksICIrciIgKHIzKSwgIityIiAocjQpCisJCTogOiBFVl9IQ0FMTF9DTE9CQkVSUzIKKwkpOworCisJcmV0dXJuIHIzOworfQorCisvKioKKyAqIGV2X2ludF9nZXRfbWFzayAtIHJldHVybnMgdGhlIG1hc2sgZm9yIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IHNvdXJjZQorICogQGludGVycnVwdDogdGhlIGludGVycnVwdCBudW1iZXIKKyAqIEBtYXNrOiByZXR1cm5lZCBtYXNrIGZvciB0aGlzIGludGVycnVwdCAoMD1lbmFibGVkLCAxPWRpc2FibGVkKQorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXZfaW50X2dldF9tYXNrKHVuc2lnbmVkIGludCBpbnRlcnJ1cHQsCisJdW5zaWduZWQgaW50ICptYXNrKQoreworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMTEgX19hc21fXygicjExIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHIzIF9fYXNtX18oInIzIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI0IF9fYXNtX18oInI0Iik7CisKKwlyMTEgPSBFVl9IQ0FMTF9UT0tFTihFVl9JTlRfR0VUX01BU0spOworCXIzID0gaW50ZXJydXB0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzYyAxIgorCQk6ICIrciIgKHIxMSksICIrciIgKHIzKSwgIj1yIiAocjQpCisJCTogOiBFVl9IQ0FMTF9DTE9CQkVSUzIKKwkpOworCisJKm1hc2sgPSByNDsKKworCXJldHVybiByMzsKK30KKworLyoqCisgKiBldl9pbnRfZW9pIC0gc2lnbmFsIHRoZSBlbmQgb2YgaW50ZXJydXB0IHByb2Nlc3NpbmcKKyAqIEBpbnRlcnJ1cHQ6IHRoZSBpbnRlcnJ1cHQgbnVtYmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBzaWduYWxzIHRoZSBlbmQgb2YgcHJvY2Vzc2luZyBmb3IgdGhlIHRoZSBzcGVjaWZpZWQKKyAqIGludGVycnVwdCwgd2hpY2ggbXVzdCBiZSB0aGUgaW50ZXJydXB0IGN1cnJlbnRseSBpbiBzZXJ2aWNlLiBCeQorICogZGVmaW5pdGlvbiwgdGhpcyBpcyBhbHNvIHRoZSBoaWdoZXN0LXByaW9yaXR5IGludGVycnVwdC4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGV2X2ludF9lb2kodW5zaWduZWQgaW50IGludGVycnVwdCkKK3sKKwlyZWdpc3RlciB1aW50cHRyX3QgcjExIF9fYXNtX18oInIxMSIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMyBfX2FzbV9fKCJyMyIpOworCisJcjExID0gRVZfSENBTExfVE9LRU4oRVZfSU5UX0VPSSk7CisJcjMgPSBpbnRlcnJ1cHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNjIDEiCisJCTogIityIiAocjExKSwgIityIiAocjMpCisJCTogOiBFVl9IQ0FMTF9DTE9CQkVSUzEKKwkpOworCisJcmV0dXJuIHIzOworfQorCisvKioKKyAqIGV2X2J5dGVfY2hhbm5lbF9zZW5kIC0gc2VuZCBjaGFyYWN0ZXJzIHRvIGEgYnl0ZSBzdHJlYW0KKyAqIEBoYW5kbGU6IGJ5dGUgc3RyZWFtIGhhbmRsZQorICogQGNvdW50OiAoaW5wdXQpIG51bSBvZiBjaGFycyB0byBzZW5kLCAob3V0cHV0KSBudW0gY2hhcnMgc2VudAorICogQGJ1ZmZlcjogcG9pbnRlciB0byBhIDE2LWJ5dGUgYnVmZmVyCisgKgorICogQGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0IDE2IGJ5dGVzIGxvbmcsIGJlY2F1c2UgYWxsIDE2IGJ5dGVzIHdpbGwgYmUKKyAqIHJlYWQgZnJvbSBtZW1vcnkgaW50byByZWdpc3RlcnMsIGV2ZW4gaWYgY291bnQgPCAxNi4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGV2X2J5dGVfY2hhbm5lbF9zZW5kKHVuc2lnbmVkIGludCBoYW5kbGUsCisJdW5zaWduZWQgaW50ICpjb3VudCwgY29uc3QgY2hhciBidWZmZXJbRVZfQllURV9DSEFOTkVMX01BWF9CWVRFU10pCit7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMSBfX2FzbV9fKCJyMTEiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjMgX19hc21fXygicjMiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjQgX19hc21fXygicjQiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjUgX19hc21fXygicjUiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjYgX19hc21fXygicjYiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjcgX19hc21fXygicjciKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjggX19hc21fXygicjgiKTsKKwljb25zdCB1aW50MzJfdCAqcCA9IChjb25zdCB1aW50MzJfdCAqKSBidWZmZXI7CisKKwlyMTEgPSBFVl9IQ0FMTF9UT0tFTihFVl9CWVRFX0NIQU5ORUxfU0VORCk7CisJcjMgPSBoYW5kbGU7CisJcjQgPSAqY291bnQ7CisJcjUgPSBiZTMyX3RvX2NwdShwWzBdKTsKKwlyNiA9IGJlMzJfdG9fY3B1KHBbMV0pOworCXI3ID0gYmUzMl90b19jcHUocFsyXSk7CisJcjggPSBiZTMyX3RvX2NwdShwWzNdKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLCAiK3IiIChyMyksCisJCSAgIityIiAocjQpLCAiK3IiIChyNSksICIrciIgKHI2KSwgIityIiAocjcpLCAiK3IiIChyOCkKKwkJOiA6IEVWX0hDQUxMX0NMT0JCRVJTNgorCSk7CisKKwkqY291bnQgPSByNDsKKworCXJldHVybiByMzsKK30KKworLyoqCisgKiBldl9ieXRlX2NoYW5uZWxfcmVjZWl2ZSAtIGZldGNoIGNoYXJhY3RlcnMgZnJvbSBhIGJ5dGUgY2hhbm5lbAorICogQGhhbmRsZTogYnl0ZSBjaGFubmVsIGhhbmRsZQorICogQGNvdW50OiAoaW5wdXQpIG1heCBudW0gb2YgY2hhcnMgdG8gcmVjZWl2ZSwgKG91dHB1dCkgbnVtIGNoYXJzIHJlY2VpdmVkCisgKiBAYnVmZmVyOiBwb2ludGVyIHRvIGEgMTYtYnl0ZSBidWZmZXIKKyAqCisgKiBUaGUgc2l6ZSBvZiBAYnVmZmVyIG11c3QgYmUgYXQgbGVhc3QgMTYgYnl0ZXMsIGV2ZW4gaWYgeW91IHJlcXVlc3QgZmV3ZXIKKyAqIHRoYW4gMTYgY2hhcmFjdGVycywgYmVjYXVzZSB3ZSBhbHdheXMgd3JpdGUgMTYgYnl0ZXMgdG8gQGJ1ZmZlci4gIFRoaXMgaXMKKyAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXZfYnl0ZV9jaGFubmVsX3JlY2VpdmUodW5zaWduZWQgaW50IGhhbmRsZSwKKwl1bnNpZ25lZCBpbnQgKmNvdW50LCBjaGFyIGJ1ZmZlcltFVl9CWVRFX0NIQU5ORUxfTUFYX0JZVEVTXSkKK3sKKwlyZWdpc3RlciB1aW50cHRyX3QgcjExIF9fYXNtX18oInIxMSIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMyBfX2FzbV9fKCJyMyIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNCBfX2FzbV9fKCJyNCIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNSBfX2FzbV9fKCJyNSIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNiBfX2FzbV9fKCJyNiIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNyBfX2FzbV9fKCJyNyIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByOCBfX2FzbV9fKCJyOCIpOworCXVpbnQzMl90ICpwID0gKHVpbnQzMl90ICopIGJ1ZmZlcjsKKworCXIxMSA9IEVWX0hDQUxMX1RPS0VOKEVWX0JZVEVfQ0hBTk5FTF9SRUNFSVZFKTsKKwlyMyA9IGhhbmRsZTsKKwlyNCA9ICpjb3VudDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLCAiK3IiIChyMyksICIrciIgKHI0KSwKKwkJICAiPXIiIChyNSksICI9ciIgKHI2KSwgIj1yIiAocjcpLCAiPXIiIChyOCkKKwkJOiA6IEVWX0hDQUxMX0NMT0JCRVJTNgorCSk7CisKKwkqY291bnQgPSByNDsKKwlwWzBdID0gY3B1X3RvX2JlMzIocjUpOworCXBbMV0gPSBjcHVfdG9fYmUzMihyNik7CisJcFsyXSA9IGNwdV90b19iZTMyKHI3KTsKKwlwWzNdID0gY3B1X3RvX2JlMzIocjgpOworCisJcmV0dXJuIHIzOworfQorCisvKioKKyAqIGV2X2J5dGVfY2hhbm5lbF9wb2xsIC0gcmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBieXRlIGNoYW5uZWwgYnVmZmVycworICogQGhhbmRsZTogYnl0ZSBjaGFubmVsIGhhbmRsZQorICogQHJ4X2NvdW50OiByZXR1cm5lZCBjb3VudCBvZiBieXRlcyBpbiByZWNlaXZlIHF1ZXVlCisgKiBAdHhfY291bnQ6IHJldHVybmVkIGNvdW50IG9mIGZyZWUgc3BhY2UgaW4gdHJhbnNtaXQgcXVldWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcG9ydHMgdGhlIGFtb3VudCBvZiBkYXRhIGluIHRoZSByZWNlaXZlIHF1ZXVlIChpLmUuIHRoZQorICogbnVtYmVyIG9mIGJ5dGVzIHlvdSBjYW4gcmVhZCksIGFuZCB0aGUgYW1vdW50IG9mIGZyZWUgc3BhY2UgaW4gdGhlIHRyYW5zbWl0CisgKiBxdWV1ZSAoaS5lLiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSBjYW4gd3JpdGUpLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXZfYnl0ZV9jaGFubmVsX3BvbGwodW5zaWduZWQgaW50IGhhbmRsZSwKKwl1bnNpZ25lZCBpbnQgKnJ4X2NvdW50LAl1bnNpZ25lZCBpbnQgKnR4X2NvdW50KQoreworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMTEgX19hc21fXygicjExIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHIzIF9fYXNtX18oInIzIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI0IF9fYXNtX18oInI0Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI1IF9fYXNtX18oInI1Iik7CisKKwlyMTEgPSBFVl9IQ0FMTF9UT0tFTihFVl9CWVRFX0NIQU5ORUxfUE9MTCk7CisJcjMgPSBoYW5kbGU7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNjIDEiCisJCTogIityIiAocjExKSwgIityIiAocjMpLCAiPXIiIChyNCksICI9ciIgKHI1KQorCQk6IDogRVZfSENBTExfQ0xPQkJFUlMzCisJKTsKKworCSpyeF9jb3VudCA9IHI0OworCSp0eF9jb3VudCA9IHI1OworCisJcmV0dXJuIHIzOworfQorCisvKioKKyAqIGV2X2ludF9pYWNrIC0gYWNrbm93bGVkZ2UgYW4gaW50ZXJydXB0CisgKiBAaGFuZGxlOiBoYW5kbGUgdG8gdGhlIHRhcmdldCBpbnRlcnJ1cHQgY29udHJvbGxlcgorICogQHZlY3RvcjogcmV0dXJuZWQgaW50ZXJydXB0IHZlY3RvcgorICoKKyAqIElmIGhhbmRsZSBpcyB6ZXJvLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV4dCBpbnRlcnJ1cHQgc291cmNlCisgKiBudW1iZXIgdG8gYmUgaGFuZGxlZCBpcnJlc3BlY3RpdmUgb2YgdGhlIGhpZXJhcmNoeSBvciBjYXNjYWRpbmcKKyAqIG9mIGludGVycnVwdCBjb250cm9sbGVycy4gSWYgbm9uLXplcm8sIHNwZWNpZmllcyBhIGhhbmRsZSB0byB0aGUKKyAqIGludGVycnVwdCBjb250cm9sbGVyIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgYWNrbm93bGVkZ2UuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBvciBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBldl9pbnRfaWFjayh1bnNpZ25lZCBpbnQgaGFuZGxlLAorCXVuc2lnbmVkIGludCAqdmVjdG9yKQoreworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMTEgX19hc21fXygicjExIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHIzIF9fYXNtX18oInIzIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI0IF9fYXNtX18oInI0Iik7CisKKwlyMTEgPSBFVl9IQ0FMTF9UT0tFTihFVl9JTlRfSUFDSyk7CisJcjMgPSBoYW5kbGU7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNjIDEiCisJCTogIityIiAocjExKSwgIityIiAocjMpLCAiPXIiIChyNCkKKwkJOiA6IEVWX0hDQUxMX0NMT0JCRVJTMgorCSk7CisKKwkqdmVjdG9yID0gcjQ7CisKKwlyZXR1cm4gcjM7Cit9CisKKy8qKgorICogZXZfZG9vcmJlbGxfc2VuZCAtIHNlbmQgYSBkb29yYmVsbCB0byBhbm90aGVyIHBhcnRpdGlvbgorICogQGhhbmRsZTogZG9vcmJlbGwgc2VuZCBoYW5kbGUKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGV2X2Rvb3JiZWxsX3NlbmQodW5zaWduZWQgaW50IGhhbmRsZSkKK3sKKwlyZWdpc3RlciB1aW50cHRyX3QgcjExIF9fYXNtX18oInIxMSIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMyBfX2FzbV9fKCJyMyIpOworCisJcjExID0gRVZfSENBTExfVE9LRU4oRVZfRE9PUkJFTExfU0VORCk7CisJcjMgPSBoYW5kbGU7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNjIDEiCisJCTogIityIiAocjExKSwgIityIiAocjMpCisJCTogOiBFVl9IQ0FMTF9DTE9CQkVSUzEKKwkpOworCisJcmV0dXJuIHIzOworfQorCisvKioKKyAqIGV2X2lkbGUgLS0gd2FpdCBmb3IgbmV4dCBpbnRlcnJ1cHQgb24gdGhpcyBjb3JlCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBvciBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBldl9pZGxlKHZvaWQpCit7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMSBfX2FzbV9fKCJyMTEiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjMgX19hc21fXygicjMiKTsKKworCXIxMSA9IEVWX0hDQUxMX1RPS0VOKEVWX0lETEUpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzYyAxIgorCQk6ICIrciIgKHIxMSksICI9ciIgKHIzKQorCQk6IDogRVZfSENBTExfQ0xPQkJFUlMxCisJKTsKKworCXJldHVybiByMzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0ZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi02NGUuaAppbmRleCA2ZDUzZjMxLi5hYzEzYWRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0ZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9leGNlcHRpb24tNjRlLmgKQEAgLTQ4LDMwICs0OCwzMyBAQAogI2RlZmluZSBFWF9SMTQJCSg0ICogOCkKICNkZWZpbmUgRVhfUjE1CQkoNSAqIDgpCiAKLS8qIFRoZSBUTEIgbWlzcyBleGNlcHRpb24gdXNlcyBkaWZmZXJlbnQgc2xvdHMgKi8KKy8qCisgKiBUaGUgVExCIG1pc3MgZXhjZXB0aW9uIHVzZXMgZGlmZmVyZW50IHNsb3RzLgorICoKKyAqIFRoZSBib2x0ZWQgdmFyaWFudCB1c2VzIG9ubHkgdGhlIGZpcnN0IHNpeCBmaWVsZHMsCisgKiB3aGljaCBpbiBjb21iaW5hdGlvbiB3aXRoIHBnZCBhbmQga2VybmVsX3BnZCBmaXRzIGluCisgKiBvbmUgNjQtYnl0ZSBjYWNoZSBsaW5lLgorICovCiAKICNkZWZpbmUgRVhfVExCX1IxMAkoIDAgKiA4KQogI2RlZmluZSBFWF9UTEJfUjExCSggMSAqIDgpCi0jZGVmaW5lIEVYX1RMQl9SMTIJKCAyICogOCkKLSNkZWZpbmUgRVhfVExCX1IxMwkoIDMgKiA4KQotI2RlZmluZSBFWF9UTEJfUjE0CSggNCAqIDgpCi0jZGVmaW5lIEVYX1RMQl9SMTUJKCA1ICogOCkKLSNkZWZpbmUgRVhfVExCX1IxNgkoIDYgKiA4KQotI2RlZmluZSBFWF9UTEJfQ1IJKCA3ICogOCkKKyNkZWZpbmUgRVhfVExCX1IxNAkoIDIgKiA4KQorI2RlZmluZSBFWF9UTEJfUjE1CSggMyAqIDgpCisjZGVmaW5lIEVYX1RMQl9SMTYJKCA0ICogOCkKKyNkZWZpbmUgRVhfVExCX0NSCSggNSAqIDgpCisjZGVmaW5lIEVYX1RMQl9SMTIJKCA2ICogOCkKKyNkZWZpbmUgRVhfVExCX1IxMwkoIDcgKiA4KQogI2RlZmluZSBFWF9UTEJfREVBUgkoIDggKiA4KSAvKiBMZXZlbCAwIGFuZCAyIG9ubHkgKi8KICNkZWZpbmUgRVhfVExCX0VTUgkoIDkgKiA4KSAvKiBMZXZlbCAwIGFuZCAyIG9ubHkgKi8KICNkZWZpbmUgRVhfVExCX1NSUjAJKDEwICogOCkKICNkZWZpbmUgRVhfVExCX1NSUjEJKDExICogOCkKLSNkZWZpbmUgRVhfVExCX01NVUNSMAkoMTIgKiA4KSAvKiBMZXZlbCAwICovCi0jZGVmaW5lIEVYX1RMQl9NQVMxCSgxMiAqIDgpIC8qIExldmVsIDAgKi8KLSNkZWZpbmUgRVhfVExCX01BUzIJKDEzICogOCkgLyogTGV2ZWwgMCAqLwogI2lmZGVmIENPTkZJR19CT09LM0VfTU1VX1RMQl9TVEFUUwotI2RlZmluZSBFWF9UTEJfUjgJKDE0ICogOCkKLSNkZWZpbmUgRVhfVExCX1I5CSgxNSAqIDgpCi0jZGVmaW5lIEVYX1RMQl9MUgkoMTYgKiA4KQotI2RlZmluZSBFWF9UTEJfU0laRQkoMTcgKiA4KQorI2RlZmluZSBFWF9UTEJfUjgJKDEyICogOCkKKyNkZWZpbmUgRVhfVExCX1I5CSgxMyAqIDgpCisjZGVmaW5lIEVYX1RMQl9MUgkoMTQgKiA4KQorI2RlZmluZSBFWF9UTEJfU0laRQkoMTUgKiA4KQogI2Vsc2UKLSNkZWZpbmUgRVhfVExCX1NJWkUJKDE0ICogOCkKKyNkZWZpbmUgRVhfVExCX1NJWkUJKDEyICogOCkKICNlbmRpZgogCiAjZGVmaW5lCVNUQVJUX0VYQ0VQVElPTihsYWJlbCkJCQkJCQlcCkBAIC0xNjgsNiArMTcxLDE2IEBACiAJbGQJcjksRVhfVExCX1I5KHIxMik7CQkJCQkgICAgXAogCWxkCXI4LEVYX1RMQl9SOChyMTIpOwkJCQkJICAgIFwKIAltdGxyCXIxNjsKKyNkZWZpbmUgVExCX01JU1NfUFJPTE9HX1NUQVRTX0JPTFRFRAkJCQkJCSAgICBcCisJbWZscglyMTA7CQkJCQkJCSAgICBcCisJc3RkCXI4LFBBQ0FfRVhUTEIrRVhfVExCX1I4KHIxMyk7CQkJCSAgICBcCisJc3RkCXI5LFBBQ0FfRVhUTEIrRVhfVExCX1I5KHIxMyk7CQkJCSAgICBcCisJc3RkCXIxMCxQQUNBX0VYVExCK0VYX1RMQl9MUihyMTMpOworI2RlZmluZSBUTEJfTUlTU19SRVNUT1JFX1NUQVRTX0JPTFRFRAkJCQkJICAgICAgICAgICAgXAorCWxkCXIxNixQQUNBX0VYVExCK0VYX1RMQl9MUihyMTMpOwkJCQkgICAgXAorCWxkCXI5LFBBQ0FfRVhUTEIrRVhfVExCX1I5KHIxMyk7CQkJCSAgICBcCisJbGQJcjgsUEFDQV9FWFRMQitFWF9UTEJfUjgocjEzKTsJCQkJICAgIFwKKwltdGxyCXIxNjsKICNkZWZpbmUgVExCX01JU1NfU1RBVFNfRChuYW1lKQkJCQkJCSAgICBcCiAJYWRkaQlyOSxyMTMsTU1TVEFUX0RTVEFUUytuYW1lOwkJCQkgICAgXAogCWJsCS50bGJfc3RhdF9pbmM7CkBAIC0xODMsMTcgKzE5NiwyMCBAQAogNjE6CWFkZGkJcjkscjEzLE1NU1RBVF9JU1RBVFMrbmFtZTsJCQkJICAgIFwKIDYyOglibAkudGxiX3N0YXRfaW5jOwogI2RlZmluZSBUTEJfTUlTU19TVEFUU19TQVZFX0lORk8JCQkJCSAgICBcCi0Jc3RkCXIxNCxFWF9UTEJfRVNSKHIxMik7CS8qIHNhdmUgRVNSICovCQkJICAgIFwKLQotCisJc3RkCXIxNCxFWF9UTEJfRVNSKHIxMik7CS8qIHNhdmUgRVNSICovCisjZGVmaW5lIFRMQl9NSVNTX1NUQVRTX1NBVkVfSU5GT19CT0xURUQJCQkJCSAgICBcCisJc3RkCXIxNCxQQUNBX0VYVExCK0VYX1RMQl9FU1IocjEzKTsJLyogc2F2ZSBFU1IgKi8KICNlbHNlCiAjZGVmaW5lIFRMQl9NSVNTX1BST0xPR19TVEFUUwogI2RlZmluZSBUTEJfTUlTU19SRVNUT1JFX1NUQVRTCisjZGVmaW5lIFRMQl9NSVNTX1BST0xPR19TVEFUU19CT0xURUQKKyNkZWZpbmUgVExCX01JU1NfUkVTVE9SRV9TVEFUU19CT0xURUQKICNkZWZpbmUgVExCX01JU1NfU1RBVFNfRChuYW1lKQogI2RlZmluZSBUTEJfTUlTU19TVEFUU19JKG5hbWUpCiAjZGVmaW5lIFRMQl9NSVNTX1NUQVRTX1gobmFtZSkKICNkZWZpbmUgVExCX01JU1NfU1RBVFNfWShuYW1lKQogI2RlZmluZSBUTEJfTUlTU19TVEFUU19TQVZFX0lORk8KKyNkZWZpbmUgVExCX01JU1NfU1RBVFNfU0FWRV9JTkZPX0JPTFRFRAogI2VuZGlmCiAKICNkZWZpbmUgU0VUX0lWT1IodmVjdG9yX251bWJlciwgdmVjdG9yX29mZnNldCkJXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi02NHMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9leGNlcHRpb24tNjRzLmgKaW5kZXggZjVkZmUzNC4uODA1N2Y0ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi02NHMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0cy5oCkBAIC02MSwxOSArNjEsMjIgQEAKICNkZWZpbmUgRVhDX0hWCUgKICNkZWZpbmUgRVhDX1NURAogCi0jZGVmaW5lIEVYQ0VQVElPTl9QUk9MT0dfMShhcmVhKQkJCQkJXAorI2RlZmluZSBfX0VYQ0VQVElPTl9QUk9MT0dfMShhcmVhLCBleHRyYSwgdmVjKQkJCQlcCiAJR0VUX1BBQ0EocjEzKTsJCQkJCQkJXAogCXN0ZAlyOSxhcmVhK0VYX1I5KHIxMyk7CS8qIHNhdmUgcjkgLSByMTIgKi8JCVwKIAlzdGQJcjEwLGFyZWErRVhfUjEwKHIxMyk7CQkJCQlcCi0Jc3RkCXIxMSxhcmVhK0VYX1IxMShyMTMpOwkJCQkJXAotCXN0ZAlyMTIsYXJlYStFWF9SMTIocjEzKTsJCQkJCVwKIAlCRUdJTl9GVFJfU0VDVElPTl9ORVNURUQoNjYpOwkJCQkJXAogCW1mc3ByCXIxMCxTUFJOX0NGQVI7CQkJCQkJXAogCXN0ZAlyMTAsYXJlYStFWF9DRkFSKHIxMyk7CQkJCQlcCiAJRU5EX0ZUUl9TRUNUSU9OX05FU1RFRChDUFVfRlRSX0NGQVIsIENQVV9GVFJfQ0ZBUiwgNjYpOwkJXAotCUdFVF9TQ1JBVENIMChyOSk7CQkJCQkJXAotCXN0ZAlyOSxhcmVhK0VYX1IxMyhyMTMpOwkJCQkJXAotCW1mY3IJcjkKKwltZmNyCXI5OwkJCQkJCQlcCisJZXh0cmEodmVjKTsJCQkJCQkJXAorCXN0ZAlyMTEsYXJlYStFWF9SMTEocjEzKTsJCQkJCVwKKwlzdGQJcjEyLGFyZWErRVhfUjEyKHIxMyk7CQkJCQlcCisJR0VUX1NDUkFUQ0gwKHIxMCk7CQkJCQkJXAorCXN0ZAlyMTAsYXJlYStFWF9SMTMocjEzKQorI2RlZmluZSBFWENFUFRJT05fUFJPTE9HXzEoYXJlYSwgZXh0cmEsIHZlYykJCQkJXAorCV9fRVhDRVBUSU9OX1BST0xPR18xKGFyZWEsIGV4dHJhLCB2ZWMpCiAKICNkZWZpbmUgX19FWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCwgaCkJCQkJXAogCWxkCXIxMixQQUNBS0JBU0UocjEzKTsJLyogZ2V0IGhpZ2ggcGFydCBvZiAmbGFiZWwgKi8JXApAQCAtODUsMTMgKzg4LDY1IEBACiAJbXRzcHIJU1BSTl8jI2gjI1NSUjEscjEwOwkJCQkJXAogCWgjI3JmaWQ7CQkJCQkJCVwKIAliCS4JLyogcHJldmVudCBzcGVjdWxhdGl2ZSBleGVjdXRpb24gKi8KLSNkZWZpbmUgRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTXzEobGFiZWwsIGgpIFwKKyNkZWZpbmUgRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTXzEobGFiZWwsIGgpCQkJCVwKIAlfX0VYQ0VQVElPTl9QUk9MT0dfUFNFUklFU18xKGxhYmVsLCBoKQogCi0jZGVmaW5lIEVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhhcmVhLCBsYWJlbCwgaCkJCQlcCi0JRVhDRVBUSU9OX1BST0xPR18xKGFyZWEpOwkJCQkJXAorI2RlZmluZSBFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoYXJlYSwgbGFiZWwsIGgsIGV4dHJhLCB2ZWMpCQlcCisJRVhDRVBUSU9OX1BST0xPR18xKGFyZWEsIGV4dHJhLCB2ZWMpOwkJCQlcCiAJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTXzEobGFiZWwsIGgpOwogCisjZGVmaW5lIF9fS1ZNVEVTVChuKQkJCQkJCQlcCisJbGJ6CXIxMCxIU1RBVEVfSU5fR1VFU1QocjEzKTsJCQlcCisJY21wd2kJcjEwLDA7CQkJCQkJCVwKKwlibmUJZG9fa3ZtXyMjbgorCisjZGVmaW5lIF9fS1ZNX0hBTkRMRVIoYXJlYSwgaCwgbikJCQkJCVwKK2RvX2t2bV8jI246CQkJCQkJCQlcCisJbGQJcjEwLGFyZWErRVhfUjEwKHIxMyk7CQkJCQlcCisJc3R3CXI5LEhTVEFURV9TQ1JBVENIMShyMTMpOwkJCVwKKwlsZAlyOSxhcmVhK0VYX1I5KHIxMyk7CQkJCQlcCisJc3RkCXIxMixIU1RBVEVfU0NSQVRDSDAocjEzKTsJCQlcCisJbGkJcjEyLG47CQkJCQkJCVwKKwliCWt2bXBwY19pbnRlcnJ1cHQKKworI2RlZmluZSBfX0tWTV9IQU5ETEVSX1NLSVAoYXJlYSwgaCwgbikJCQkJCVwKK2RvX2t2bV8jI246CQkJCQkJCQlcCisJY21wd2kJcjEwLEtWTV9HVUVTVF9NT0RFX1NLSVA7CQkJCVwKKwlsZAlyMTAsYXJlYStFWF9SMTAocjEzKTsJCQkJCVwKKwliZXEJODlmOwkJCQkJCQlcCisJc3R3CXI5LEhTVEFURV9TQ1JBVENIMShyMTMpOwkJCVwKKwlsZAlyOSxhcmVhK0VYX1I5KHIxMyk7CQkJCQlcCisJc3RkCXIxMixIU1RBVEVfU0NSQVRDSDAocjEzKTsJCQlcCisJbGkJcjEyLG47CQkJCQkJCVwKKwliCWt2bXBwY19pbnRlcnJ1cHQ7CQkJCQlcCis4OToJbXRvY3JmCTB4ODAscjk7CQkJCQkJXAorCWxkCXI5LGFyZWErRVhfUjkocjEzKTsJCQkJCVwKKwliCWt2bXBwY19za2lwXyMjaCMjaW50ZXJydXB0CisKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSCisjZGVmaW5lIEtWTVRFU1QobikJCQlfX0tWTVRFU1QobikKKyNkZWZpbmUgS1ZNX0hBTkRMRVIoYXJlYSwgaCwgbikJCV9fS1ZNX0hBTkRMRVIoYXJlYSwgaCwgbikKKyNkZWZpbmUgS1ZNX0hBTkRMRVJfU0tJUChhcmVhLCBoLCBuKQlfX0tWTV9IQU5ETEVSX1NLSVAoYXJlYSwgaCwgbikKKworI2Vsc2UKKyNkZWZpbmUgS1ZNVEVTVChuKQorI2RlZmluZSBLVk1fSEFORExFUihhcmVhLCBoLCBuKQorI2RlZmluZSBLVk1fSEFORExFUl9TS0lQKGFyZWEsIGgsIG4pCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTX1BSCisjZGVmaW5lIEtWTVRFU1RfUFIobikJCQlfX0tWTVRFU1QobikKKyNkZWZpbmUgS1ZNX0hBTkRMRVJfUFIoYXJlYSwgaCwgbikJX19LVk1fSEFORExFUihhcmVhLCBoLCBuKQorI2RlZmluZSBLVk1fSEFORExFUl9QUl9TS0lQKGFyZWEsIGgsIG4pCV9fS1ZNX0hBTkRMRVJfU0tJUChhcmVhLCBoLCBuKQorCisjZWxzZQorI2RlZmluZSBLVk1URVNUX1BSKG4pCisjZGVmaW5lIEtWTV9IQU5ETEVSX1BSKGFyZWEsIGgsIG4pCisjZGVmaW5lIEtWTV9IQU5ETEVSX1BSX1NLSVAoYXJlYSwgaCwgbikKKyNlbmRpZgorCisjZGVmaW5lIE5PVEVTVChuKQorCiAvKgogICogVGhlIGNvbW1vbiBleGNlcHRpb24gcHJvbG9nIGlzIHVzZWQgZm9yIGFsbCBleGNlcHQgYSBmZXcgZXhjZXB0aW9ucwogICogc3VjaCBhcyBhIHNlZ21lbnQgbWlzcyBvbiBhIGtlcm5lbCBhZGRyZXNzLiAgV2UgaGF2ZSB0byBiZSBwcmVwYXJlZApAQCAtMTY0LDU3ICsyMTksNTggQEAKIAkuZ2xvYmwgbGFiZWwjI19wU2VyaWVzOwkJCQlcCiBsYWJlbCMjX3BTZXJpZXM6CQkJCQlcCiAJSE1UX01FRElVTTsJCQkJCVwKLQlET19LVk0JdmVjOwkJCQkJXAogCVNFVF9TQ1JBVENIMChyMTMpOwkJLyogc2F2ZSByMTMgKi8JCVwKLQlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWEdFTiwgbGFiZWwjI19jb21tb24sIEVYQ19TVEQpCisJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhHRU4sIGxhYmVsIyNfY29tbW9uLAlcCisJCQkJIEVYQ19TVEQsIEtWTVRFU1RfUFIsIHZlYykKIAogI2RlZmluZSBTVERfRVhDRVBUSU9OX0hWKGxvYywgdmVjLCBsYWJlbCkJCVwKIAkuID0gbG9jOwkJCQkJXAogCS5nbG9ibCBsYWJlbCMjX2h2OwkJCQlcCiBsYWJlbCMjX2h2OgkJCQkJCVwKIAlITVRfTUVESVVNOwkJCQkJXAotCURPX0tWTQl2ZWM7CQkJCQlcCi0JU0VUX1NDUkFUQ0gwKHIxMyk7CS8qIHNhdmUgcjEzICovCQlcCi0JRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhHRU4sIGxhYmVsIyNfY29tbW9uLCBFWENfSFYpCisJU0VUX1NDUkFUQ0gwKHIxMyk7CS8qIHNhdmUgcjEzICovCQkJXAorCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBsYWJlbCMjX2NvbW1vbiwJXAorCQkJCSBFWENfSFYsIEtWTVRFU1QsIHZlYykKIAotI2RlZmluZSBfX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKHZlYywgbGFiZWwsIGgpCQkJXAotCUhNVF9NRURJVU07CQkJCQkJCVwKLQlET19LVk0JdmVjOwkJCQkJCQlcCi0JU0VUX1NDUkFUQ0gwKHIxMyk7ICAgIC8qIHNhdmUgcjEzICovCQkJCVwKLQlHRVRfUEFDQShyMTMpOwkJCQkJCQlcCi0Jc3RkCXI5LFBBQ0FfRVhHRU4rRVhfUjkocjEzKTsJLyogc2F2ZSByOSwgcjEwICovCVwKLQlzdGQJcjEwLFBBQ0FfRVhHRU4rRVhfUjEwKHIxMyk7CQkJCVwKKyNkZWZpbmUgX19TT0ZURU5fVEVTVChoKQkJCQkJCVwKIAlsYnoJcjEwLFBBQ0FTT0ZUSVJRRU4ocjEzKTsJCQkJCVwKLQltZmNyCXI5OwkJCQkJCQlcCiAJY21wd2kJcjEwLDA7CQkJCQkJCVwKLQliZXEJbWFza2VkXyMjaCMjaW50ZXJydXB0OwkJCQkJXAotCUdFVF9TQ1JBVENIMChyMTApOwkJCQkJCVwKLQlzdGQJcjEwLFBBQ0FfRVhHRU4rRVhfUjEzKHIxMyk7CQkJCVwKLQlzdGQJcjExLFBBQ0FfRVhHRU4rRVhfUjExKHIxMyk7CQkJCVwKLQlzdGQJcjEyLFBBQ0FfRVhHRU4rRVhfUjEyKHIxMyk7CQkJCVwKLQlsZAlyMTIsUEFDQUtCQVNFKHIxMyk7CS8qIGdldCBoaWdoIHBhcnQgb2YgJmxhYmVsICovCVwKLQlsZAlyMTAsUEFDQUtNU1IocjEzKTsJLyogZ2V0IE1TUiB2YWx1ZSBmb3Iga2VybmVsICovCVwKLQltZnNwcglyMTEsU1BSTl8jI2gjI1NSUjA7CS8qIHNhdmUgU1JSMCAqLwkJCVwKLQlMT0FEX0hBTkRMRVIocjEyLGxhYmVsIyNfY29tbW9uKQkJCQlcCi0JbXRzcHIJU1BSTl8jI2gjI1NSUjAscjEyOwkJCQkJXAotCW1mc3ByCXIxMixTUFJOXyMjaCMjU1JSMTsJLyogYW5kIFNSUjEgKi8JCQlcCi0JbXRzcHIJU1BSTl8jI2gjI1NSUjEscjEwOwkJCQkJXAotCWgjI3JmaWQ7CQkJCQkJCVwKLQliCS4JLyogcHJldmVudCBzcGVjdWxhdGl2ZSBleGVjdXRpb24gKi8KLSNkZWZpbmUgX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKHZlYywgbGFiZWwsIGgpCQkJXAotCV9fTUFTS0FCTEVfRVhDRVBUSU9OX1BTRVJJRVModmVjLCBsYWJlbCwgaCkKKwliZXEJbWFza2VkXyMjaCMjaW50ZXJydXB0CisjZGVmaW5lIF9TT0ZURU5fVEVTVChoKQlfX1NPRlRFTl9URVNUKGgpCisKKyNkZWZpbmUgU09GVEVOX1RFU1RfUFIodmVjKQkJCQkJCVwKKwlLVk1URVNUX1BSKHZlYyk7CQkJCQkJXAorCV9TT0ZURU5fVEVTVChFWENfU1REKQorCisjZGVmaW5lIFNPRlRFTl9URVNUX0hWKHZlYykJCQkJCQlcCisJS1ZNVEVTVCh2ZWMpOwkJCQkJCQlcCisJX1NPRlRFTl9URVNUKEVYQ19IVikKKworI2RlZmluZSBTT0ZURU5fVEVTVF9IVl8yMDEodmVjKQkJCQkJCVwKKwlLVk1URVNUKHZlYyk7CQkJCQkJCVwKKwlfU09GVEVOX1RFU1QoRVhDX1NURCkKKworI2RlZmluZSBfX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKHZlYywgbGFiZWwsIGgsIGV4dHJhKQkJXAorCUhNVF9NRURJVU07CQkJCQkJCVwKKwlTRVRfU0NSQVRDSDAocjEzKTsgICAgLyogc2F2ZSByMTMgKi8JCQkJXAorCV9fRVhDRVBUSU9OX1BST0xPR18xKFBBQ0FfRVhHRU4sIGV4dHJhLCB2ZWMpOwkJXAorCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFU18xKGxhYmVsIyNfY29tbW9uLCBoKTsKKyNkZWZpbmUgX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKHZlYywgbGFiZWwsIGgsIGV4dHJhKQkJXAorCV9fTUFTS0FCTEVfRVhDRVBUSU9OX1BTRVJJRVModmVjLCBsYWJlbCwgaCwgZXh0cmEpCiAKICNkZWZpbmUgTUFTS0FCTEVfRVhDRVBUSU9OX1BTRVJJRVMobG9jLCB2ZWMsIGxhYmVsKQkJCVwKIAkuID0gbG9jOwkJCQkJCQlcCiAJLmdsb2JsIGxhYmVsIyNfcFNlcmllczsJCQkJCQlcCiBsYWJlbCMjX3BTZXJpZXM6CQkJCQkJCVwKLQlfTUFTS0FCTEVfRVhDRVBUSU9OX1BTRVJJRVModmVjLCBsYWJlbCwgRVhDX1NURCkKKwlfTUFTS0FCTEVfRVhDRVBUSU9OX1BTRVJJRVModmVjLCBsYWJlbCwJCQkJXAorCQkJCSAgICBFWENfU1RELCBTT0ZURU5fVEVTVF9QUikKIAogI2RlZmluZSBNQVNLQUJMRV9FWENFUFRJT05fSFYobG9jLCB2ZWMsIGxhYmVsKQkJCQlcCiAJLiA9IGxvYzsJCQkJCQkJXAogCS5nbG9ibCBsYWJlbCMjX2h2OwkJCQkJCVwKIGxhYmVsIyNfaHY6CQkJCQkJCQlcCi0JX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKHZlYywgbGFiZWwsIEVYQ19IVikKKwlfTUFTS0FCTEVfRVhDRVBUSU9OX1BTRVJJRVModmVjLCBsYWJlbCwJCQkJXAorCQkJCSAgICBFWENfSFYsIFNPRlRFTl9URVNUX0hWKQogCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAjZGVmaW5lIERJU0FCTEVfSU5UUwkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsX2hjYWxscy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2ZzbF9oY2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjJkOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2ZzbF9oY2FsbHMuaApAQCAtMCwwICsxLDY1NSBAQAorLyoKKyAqIEZyZWVzY2FsZSBoeXBlcnZpc29yIGNhbGwgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIEF1dGhvcjogVGltdXIgVGFiaSA8dGltdXJAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEwgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9GU0xfSENBTExTX0gKKyNkZWZpbmUgX0ZTTF9IQ0FMTFNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vZXBhcHJfaGNhbGxzLmg+CisKKyNkZWZpbmUgRkhfQVBJX1ZFUlNJT04JCQkxCisKKyNkZWZpbmUgRkhfRVJSX0dFVF9JTkZPCQkJMQorI2RlZmluZSBGSF9QQVJUSVRJT05fR0VUX0RUUFJPUAkJMgorI2RlZmluZSBGSF9QQVJUSVRJT05fU0VUX0RUUFJPUAkJMworI2RlZmluZSBGSF9QQVJUSVRJT05fUkVTVEFSVAkJNAorI2RlZmluZSBGSF9QQVJUSVRJT05fR0VUX1NUQVRVUwkJNQorI2RlZmluZSBGSF9QQVJUSVRJT05fU1RBUlQJCTYKKyNkZWZpbmUgRkhfUEFSVElUSU9OX1NUT1AJCTcKKyNkZWZpbmUgRkhfUEFSVElUSU9OX01FTUNQWQkJOAorI2RlZmluZSBGSF9ETUFfRU5BQkxFCQkJOQorI2RlZmluZSBGSF9ETUFfRElTQUJMRQkJCTEwCisjZGVmaW5lIEZIX1NFTkRfTk1JCQkJMTEKKyNkZWZpbmUgRkhfVk1QSUNfR0VUX01TSVIJCTEyCisjZGVmaW5lIEZIX1NZU1RFTV9SRVNFVAkJCTEzCisjZGVmaW5lIEZIX0dFVF9DT1JFX1NUQVRFCQkxNAorI2RlZmluZSBGSF9FTlRFUl9OQVAJCQkxNQorI2RlZmluZSBGSF9FWElUX05BUAkJCTE2CisjZGVmaW5lIEZIX0NMQUlNX0RFVklDRQkJCTE3CisjZGVmaW5lIEZIX1BBUlRJVElPTl9TVE9QX0RNQQkJMTgKKworLyogdmVuZG9yIElEOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciAqLworI2RlZmluZSBGSF9IQ0FMTF9UT0tFTihudW0pCQlfRVZfSENBTExfVE9LRU4oRVZfRlNMX1ZFTkRPUl9JRCwgbnVtKQorCisvKgorICogV2UgdXNlICJ1aW50cHRyX3QiIHRvIGRlZmluZSBhIHJlZ2lzdGVyIGJlY2F1c2UgaXQncyBndWFyYW50ZWVkIHRvIGJlIGEKKyAqIDMyLWJpdCBpbnRlZ2VyIG9uIGEgMzItYml0IHBsYXRmb3JtLCBhbmQgYSA2NC1iaXQgaW50ZWdlciBvbiBhIDY0LWJpdAorICogcGxhdGZvcm0uCisgKgorICogQWxsIHJlZ2lzdGVycyBhcmUgZWl0aGVyIGlucHV0L291dHB1dCBvciBvdXRwdXQgb25seS4gIFJlZ2lzdGVycyB0aGF0IGFyZQorICogaW5pdGlhbGl6ZWQgYmVmb3JlIG1ha2luZyB0aGUgaHlwZXJjYWxsIGFyZSBpbnB1dC9vdXRwdXQuICBBbGwKKyAqIGlucHV0L291dHB1dCByZWdpc3RlcnMgYXJlIHJlcHJlc2VudGVkIHdpdGggIityIi4gIE91dHB1dC1vbmx5IHJlZ2lzdGVycworICogYXJlIHJlcHJlc2VudGVkIHdpdGggIj1yIi4gIERvIG5vdCBzcGVjaWZ5IGFueSB1bnVzZWQgcmVnaXN0ZXJzLiAgVGhlCisgKiBjbG9iYmVyIGxpc3Qgd2lsbCB0ZWxsIHRoZSBjb21waWxlciB0aGF0IHRoZSBoeXBlcmNhbGwgbW9kaWZpZXMgdGhvc2UKKyAqIHJlZ2lzdGVycywgd2hpY2ggaXMgZ29vZCBlbm91Z2guCisgKi8KKworLyoqCisgKiBmaF9zZW5kX25taSAtIHNlbmQgTk1JIHRvIHZpcnR1YWwgY3B1KHMpLgorICogQHZjcHVfbWFzazogc2VuZCBOTUkgdG8gdmlydHVhbCBjcHUocykgc3BlY2lmaWVkIGJ5IHRoaXMgbWFzay4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIEVJTlZBTCBmb3IgaW52YWxpZCB2Y3B1X21hc2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZoX3NlbmRfbm1pKHVuc2lnbmVkIGludCB2Y3B1X21hc2spCit7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMSBfX2FzbV9fKCJyMTEiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjMgX19hc21fXygicjMiKTsKKworCXIxMSA9IEZIX0hDQUxMX1RPS0VOKEZIX1NFTkRfTk1JKTsKKwlyMyA9IHZjcHVfbWFzazsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLCAiK3IiIChyMykKKwkJOiA6IEVWX0hDQUxMX0NMT0JCRVJTMQorCSk7CisKKwlyZXR1cm4gcjM7Cit9CisKKy8qIEFyYml0cmFyeSBsaW1pdHMgdG8gYXZvaWQgZXhjZXNzaXZlIG1lbW9yeSBhbGxvY2F0aW9uIGluIGh5cGVydmlzb3IgKi8KKyNkZWZpbmUgRkhfRFRQUk9QX01BWF9QQVRITEVOIDQwOTYKKyNkZWZpbmUgRkhfRFRQUk9QX01BWF9QUk9QTEVOIDMyNzY4CisKKy8qKgorICogZmhfcGFydGl0b25fZ2V0X2R0cHJvcCAtIGdldCBhIHByb3BlcnR5IGZyb20gYSBndWVzdCBkZXZpY2UgdHJlZS4KKyAqIEBoYW5kbGU6IGhhbmRsZSBvZiBwYXJ0aXRpb24gd2hvc2UgZGV2aWNlIHRyZWUgaXMgdG8gYmUgYWNjZXNzZWQKKyAqIEBkdHBhdGhfYWRkcjogcGh5c2ljYWwgYWRkcmVzcyBvZiBkZXZpY2UgdHJlZSBwYXRoIHRvIGFjY2VzcworICogQHByb3BuYW1lX2FkZHI6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgbmFtZSBvZiBwcm9wZXJ0eQorICogQHByb3B2YWx1ZV9hZGRyOiBwaHlzaWNhbCBhZGRyZXNzIG9mIHByb3BlcnR5IHZhbHVlIGJ1ZmZlcgorICogQHByb3B2YWx1ZV9sZW46IGxlbmd0aCBvZiBidWZmZXIgb24gZW50cnksIGxlbmd0aCBvZiBwcm9wZXJ0eSBvbiByZXR1cm4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZoX3BhcnRpdGlvbl9nZXRfZHRwcm9wKGludCBoYW5kbGUsCisJCQkJCQkgICB1aW50NjRfdCBkdHBhdGhfYWRkciwKKwkJCQkJCSAgIHVpbnQ2NF90IHByb3BuYW1lX2FkZHIsCisJCQkJCQkgICB1aW50NjRfdCBwcm9wdmFsdWVfYWRkciwKKwkJCQkJCSAgIHVpbnQzMl90ICpwcm9wdmFsdWVfbGVuKQoreworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMTEgX19hc21fXygicjExIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHIzIF9fYXNtX18oInIzIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI0IF9fYXNtX18oInI0Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI1IF9fYXNtX18oInI1Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI2IF9fYXNtX18oInI2Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI3IF9fYXNtX18oInI3Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI4IF9fYXNtX18oInI4Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI5IF9fYXNtX18oInI5Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMCBfX2FzbV9fKCJyMTAiKTsKKworCXIxMSA9IEZIX0hDQUxMX1RPS0VOKEZIX1BBUlRJVElPTl9HRVRfRFRQUk9QKTsKKwlyMyA9IGhhbmRsZTsKKworI2lmZGVmIENPTkZJR19QSFlTXzY0QklUCisJcjQgPSBkdHBhdGhfYWRkciA+PiAzMjsKKwlyNiA9IHByb3BuYW1lX2FkZHIgPj4gMzI7CisJcjggPSBwcm9wdmFsdWVfYWRkciA+PiAzMjsKKyNlbHNlCisJcjQgPSAwOworCXI2ID0gMDsKKwlyOCA9IDA7CisjZW5kaWYKKwlyNSA9ICh1aW50MzJfdClkdHBhdGhfYWRkcjsKKwlyNyA9ICh1aW50MzJfdClwcm9wbmFtZV9hZGRyOworCXI5ID0gKHVpbnQzMl90KXByb3B2YWx1ZV9hZGRyOworCXIxMCA9ICpwcm9wdmFsdWVfbGVuOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzYyAxIgorCQk6ICIrciIgKHIxMSksCisJCSAgIityIiAocjMpLCAiK3IiIChyNCksICIrciIgKHI1KSwgIityIiAocjYpLCAiK3IiIChyNyksCisJCSAgIityIiAocjgpLCAiK3IiIChyOSksICIrciIgKHIxMCkKKwkJOiA6IEVWX0hDQUxMX0NMT0JCRVJTOAorCSk7CisKKwkqcHJvcHZhbHVlX2xlbiA9IHI0OworCXJldHVybiByMzsKK30KKworLyoqCisgKiBTZXQgYSBwcm9wZXJ0eSBpbiBhIGd1ZXN0IGRldmljZSB0cmVlLgorICogQGhhbmRsZTogaGFuZGxlIG9mIHBhcnRpdGlvbiB3aG9zZSBkZXZpY2UgdHJlZSBpcyB0byBiZSBhY2Nlc3NlZAorICogQGR0cGF0aF9hZGRyOiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRldmljZSB0cmVlIHBhdGggdG8gYWNjZXNzCisgKiBAcHJvcG5hbWVfYWRkcjogcGh5c2ljYWwgYWRkcmVzcyBvZiBuYW1lIG9mIHByb3BlcnR5CisgKiBAcHJvcHZhbHVlX2FkZHI6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgcHJvcGVydHkgdmFsdWUKKyAqIEBwcm9wdmFsdWVfbGVuOiBsZW5ndGggb2YgcHJvcGVydHkKKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZoX3BhcnRpdGlvbl9zZXRfZHRwcm9wKGludCBoYW5kbGUsCisJCQkJCQkgICB1aW50NjRfdCBkdHBhdGhfYWRkciwKKwkJCQkJCSAgIHVpbnQ2NF90IHByb3BuYW1lX2FkZHIsCisJCQkJCQkgICB1aW50NjRfdCBwcm9wdmFsdWVfYWRkciwKKwkJCQkJCSAgIHVpbnQzMl90IHByb3B2YWx1ZV9sZW4pCit7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMSBfX2FzbV9fKCJyMTEiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjMgX19hc21fXygicjMiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjQgX19hc21fXygicjQiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjYgX19hc21fXygicjYiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjggX19hc21fXygicjgiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjUgX19hc21fXygicjUiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjcgX19hc21fXygicjciKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjkgX19hc21fXygicjkiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjEwIF9fYXNtX18oInIxMCIpOworCisJcjExID0gRkhfSENBTExfVE9LRU4oRkhfUEFSVElUSU9OX1NFVF9EVFBST1ApOworCXIzID0gaGFuZGxlOworCisjaWZkZWYgQ09ORklHX1BIWVNfNjRCSVQKKwlyNCA9IGR0cGF0aF9hZGRyID4+IDMyOworCXI2ID0gcHJvcG5hbWVfYWRkciA+PiAzMjsKKwlyOCA9IHByb3B2YWx1ZV9hZGRyID4+IDMyOworI2Vsc2UKKwlyNCA9IDA7CisJcjYgPSAwOworCXI4ID0gMDsKKyNlbmRpZgorCXI1ID0gKHVpbnQzMl90KWR0cGF0aF9hZGRyOworCXI3ID0gKHVpbnQzMl90KXByb3BuYW1lX2FkZHI7CisJcjkgPSAodWludDMyX3QpcHJvcHZhbHVlX2FkZHI7CisJcjEwID0gcHJvcHZhbHVlX2xlbjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLAorCQkgICIrciIgKHIzKSwgIityIiAocjQpLCAiK3IiIChyNSksICIrciIgKHI2KSwgIityIiAocjcpLAorCQkgICIrciIgKHI4KSwgIityIiAocjkpLCAiK3IiIChyMTApCisJCTogOiBFVl9IQ0FMTF9DTE9CQkVSUzgKKwkpOworCisJcmV0dXJuIHIzOworfQorCisvKioKKyAqIGZoX3BhcnRpdGlvbl9yZXN0YXJ0IC0gcmVib290IHRoZSBjdXJyZW50IHBhcnRpdGlvbgorICogQHBhcnRpdGlvbjogcGFydGl0aW9uIElECisgKgorICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHJlYm9vdCBmYWlsZWQuICBEb2VzIG5vdCByZXR1cm4gaWYgaXQgc3VjY2VlZHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZoX3BhcnRpdGlvbl9yZXN0YXJ0KHVuc2lnbmVkIGludCBwYXJ0aXRpb24pCit7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMSBfX2FzbV9fKCJyMTEiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjMgX19hc21fXygicjMiKTsKKworCXIxMSA9IEZIX0hDQUxMX1RPS0VOKEZIX1BBUlRJVElPTl9SRVNUQVJUKTsKKwlyMyA9IHBhcnRpdGlvbjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLCAiK3IiIChyMykKKwkJOiA6IEVWX0hDQUxMX0NMT0JCRVJTMQorCSk7CisKKwlyZXR1cm4gcjM7Cit9CisKKyNkZWZpbmUgRkhfUEFSVElUSU9OX1NUT1BQRUQJMAorI2RlZmluZSBGSF9QQVJUSVRJT05fUlVOTklORwkxCisjZGVmaW5lIEZIX1BBUlRJVElPTl9TVEFSVElORwkyCisjZGVmaW5lIEZIX1BBUlRJVElPTl9TVE9QUElORwkzCisjZGVmaW5lIEZIX1BBUlRJVElPTl9QQVVTSU5HCTQKKyNkZWZpbmUgRkhfUEFSVElUSU9OX1BBVVNFRAk1CisjZGVmaW5lIEZIX1BBUlRJVElPTl9SRVNVTUlORwk2CisKKy8qKgorICogZmhfcGFydGl0aW9uX2dldF9zdGF0dXMgLSBnZXRzIHRoZSBzdGF0dXMgb2YgYSBwYXJ0aXRpb24KKyAqIEBwYXJ0aXRpb246IHBhcnRpdGlvbiBJRAorICogQHN0YXR1czogcmV0dXJuZWQgc3RhdHVzIGNvZGUKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZoX3BhcnRpdGlvbl9nZXRfc3RhdHVzKHVuc2lnbmVkIGludCBwYXJ0aXRpb24sCisJdW5zaWduZWQgaW50ICpzdGF0dXMpCit7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMSBfX2FzbV9fKCJyMTEiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjMgX19hc21fXygicjMiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjQgX19hc21fXygicjQiKTsKKworCXIxMSA9IEZIX0hDQUxMX1RPS0VOKEZIX1BBUlRJVElPTl9HRVRfU1RBVFVTKTsKKwlyMyA9IHBhcnRpdGlvbjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLCAiK3IiIChyMyksICI9ciIgKHI0KQorCQk6IDogRVZfSENBTExfQ0xPQkJFUlMyCisJKTsKKworCSpzdGF0dXMgPSByNDsKKworCXJldHVybiByMzsKK30KKworLyoqCisgKiBmaF9wYXJ0aXRpb25fc3RhcnQgLSBib290cyBhbmQgc3RhcnRzIGV4ZWN1dGlvbiBvZiB0aGUgc3BlY2lmaWVkIHBhcnRpdGlvbgorICogQHBhcnRpdGlvbjogcGFydGl0aW9uIElECisgKiBAZW50cnlfcG9pbnQ6IGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3MgdG8gc3RhcnQgZXhlY3V0aW9uCisgKgorICogVGhlIGh5cGVydmlzb3IgY3JlYXRlcyBhIDEtdG8tMSB2aXJ0dWFsL3BoeXNpY2FsIElNQSBtYXBwaW5nLCBzbyBhdCBib290CisgKiB0aW1lLCBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIGFyZSB0aGUgc2FtZSBhcyBndWVzdCB2aXJ0dWFsIGFkZHJlc3Nlcy4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZoX3BhcnRpdGlvbl9zdGFydCh1bnNpZ25lZCBpbnQgcGFydGl0aW9uLAorCXVpbnQzMl90IGVudHJ5X3BvaW50LCBpbnQgbG9hZCkKK3sKKwlyZWdpc3RlciB1aW50cHRyX3QgcjExIF9fYXNtX18oInIxMSIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMyBfX2FzbV9fKCJyMyIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNCBfX2FzbV9fKCJyNCIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNSBfX2FzbV9fKCJyNSIpOworCisJcjExID0gRkhfSENBTExfVE9LRU4oRkhfUEFSVElUSU9OX1NUQVJUKTsKKwlyMyA9IHBhcnRpdGlvbjsKKwlyNCA9IGVudHJ5X3BvaW50OworCXI1ID0gbG9hZDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLCAiK3IiIChyMyksICIrciIgKHI0KSwgIityIiAocjUpCisJCTogOiBFVl9IQ0FMTF9DTE9CQkVSUzMKKwkpOworCisJcmV0dXJuIHIzOworfQorCisvKioKKyAqIGZoX3BhcnRpdGlvbl9zdG9wIC0gc3RvcHMgYW5vdGhlciBwYXJ0aXRpb24KKyAqIEBwYXJ0aXRpb246IHBhcnRpdGlvbiBJRAorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZmhfcGFydGl0aW9uX3N0b3AodW5zaWduZWQgaW50IHBhcnRpdGlvbikKK3sKKwlyZWdpc3RlciB1aW50cHRyX3QgcjExIF9fYXNtX18oInIxMSIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMyBfX2FzbV9fKCJyMyIpOworCisJcjExID0gRkhfSENBTExfVE9LRU4oRkhfUEFSVElUSU9OX1NUT1ApOworCXIzID0gcGFydGl0aW9uOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzYyAxIgorCQk6ICIrciIgKHIxMSksICIrciIgKHIzKQorCQk6IDogRVZfSENBTExfQ0xPQkJFUlMxCisJKTsKKworCXJldHVybiByMzsKK30KKworLyoqCisgKiBzdHJ1Y3QgZmhfc2dfbGlzdDogZGVmaW5pdGlvbiBvZiB0aGUgZmhfcGFydGl0aW9uX21lbWNweSBTL0cgbGlzdAorICogQHNvdXJjZTogZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyB0byBjb3B5IGZyb20KKyAqIEB0YXJnZXQ6IGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3MgdG8gY29weSB0bworICogQHNpemU6IG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKiBAcmVzZXJ2ZWQ6IHJlc2VydmVkLCBtdXN0IGJlIHplcm8KKyAqCisgKiBUaGUgc2NhdHRlci9nYXRoZXIgbGlzdCBmb3IgZmhfcGFydGl0aW9uX21lbWNweSgpIGlzIGFuIGFycmF5IG9mIHRoZXNlCisgKiBzdHJ1Y3R1cmVzLiAgVGhlIGFycmF5IG11c3QgYmUgZ3Vlc3QgcGh5c2ljYWxseSBjb250aWd1b3VzLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIG11c3QgYmUgYWxpZ25lZCBvbiAzMi1ieXRlIGJvdW5kYXJ5LCBzbyB0aGF0IG5vIHNpbmdsZQorICogc3RydWN1dHVyZSBjYW4gc3BhbiB0d28gcGFnZXMuCisgKi8KK3N0cnVjdCBmaF9zZ19saXN0IHsKKwl1aW50NjRfdCBzb3VyY2U7ICAgLyoqPCBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIHRvIGNvcHkgZnJvbSAqLworCXVpbnQ2NF90IHRhcmdldDsgICAvKio8IGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3MgdG8gY29weSB0byAqLworCXVpbnQ2NF90IHNpemU7ICAgICAvKio8IG51bWJlciBvZiBieXRlcyB0byBjb3B5ICovCisJdWludDY0X3QgcmVzZXJ2ZWQ7IC8qKjwgcmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKTsKKworLyoqCisgKiBmaF9wYXJ0aXRpb25fbWVtY3B5IC0gY29waWVzIGRhdGEgZnJvbSBvbmUgZ3Vlc3QgdG8gYW5vdGhlcgorICogQHNvdXJjZTogdGhlIElEIG9mIHRoZSBwYXJ0aXRpb24gdG8gY29weSBmcm9tCisgKiBAdGFyZ2V0OiB0aGUgSUQgb2YgdGhlIHBhcnRpdGlvbiB0byBjb3B5IHRvCisgKiBAc2dfbGlzdDogZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBvZiBhbiBhcnJheSBvZiAmZmhfc2dfbGlzdCBzdHJ1Y3R1cmVzCisgKiBAY291bnQ6IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBAc2dfbGlzdAorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZmhfcGFydGl0aW9uX21lbWNweSh1bnNpZ25lZCBpbnQgc291cmNlLAorCXVuc2lnbmVkIGludCB0YXJnZXQsIHBoeXNfYWRkcl90IHNnX2xpc3QsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlyZWdpc3RlciB1aW50cHRyX3QgcjExIF9fYXNtX18oInIxMSIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMyBfX2FzbV9fKCJyMyIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNCBfX2FzbV9fKCJyNCIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNSBfX2FzbV9fKCJyNSIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNiBfX2FzbV9fKCJyNiIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNyBfX2FzbV9fKCJyNyIpOworCisJcjExID0gRkhfSENBTExfVE9LRU4oRkhfUEFSVElUSU9OX01FTUNQWSk7CisJcjMgPSBzb3VyY2U7CisJcjQgPSB0YXJnZXQ7CisJcjUgPSAodWludDMyX3QpIHNnX2xpc3Q7CisKKyNpZmRlZiBDT05GSUdfUEhZU182NEJJVAorCXI2ID0gc2dfbGlzdCA+PiAzMjsKKyNlbHNlCisJcjYgPSAwOworI2VuZGlmCisJcjcgPSBjb3VudDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLAorCQkgICIrciIgKHIzKSwgIityIiAocjQpLCAiK3IiIChyNSksICIrciIgKHI2KSwgIityIiAocjcpCisJCTogOiBFVl9IQ0FMTF9DTE9CQkVSUzUKKwkpOworCisJcmV0dXJuIHIzOworfQorCisvKioKKyAqIGZoX2RtYV9lbmFibGUgLSBlbmFibGUgRE1BIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZQorICogQGxpb2RuOiB0aGUgTElPRE4gb2YgdGhlIEkvTyBkZXZpY2UgZm9yIHdoaWNoIHRvIGVuYWJsZSBETUEKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZoX2RtYV9lbmFibGUodW5zaWduZWQgaW50IGxpb2RuKQoreworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMTEgX19hc21fXygicjExIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHIzIF9fYXNtX18oInIzIik7CisKKwlyMTEgPSBGSF9IQ0FMTF9UT0tFTihGSF9ETUFfRU5BQkxFKTsKKwlyMyA9IGxpb2RuOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzYyAxIgorCQk6ICIrciIgKHIxMSksICIrciIgKHIzKQorCQk6IDogRVZfSENBTExfQ0xPQkJFUlMxCisJKTsKKworCXJldHVybiByMzsKK30KKworLyoqCisgKiBmaF9kbWFfZGlzYWJsZSAtIGRpc2FibGUgRE1BIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZQorICogQGxpb2RuOiB0aGUgTElPRE4gb2YgdGhlIEkvTyBkZXZpY2UgZm9yIHdoaWNoIHRvIGRpc2FibGUgRE1BCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBvciBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmaF9kbWFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgbGlvZG4pCit7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMSBfX2FzbV9fKCJyMTEiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjMgX19hc21fXygicjMiKTsKKworCXIxMSA9IEZIX0hDQUxMX1RPS0VOKEZIX0RNQV9ESVNBQkxFKTsKKwlyMyA9IGxpb2RuOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzYyAxIgorCQk6ICIrciIgKHIxMSksICIrciIgKHIzKQorCQk6IDogRVZfSENBTExfQ0xPQkJFUlMxCisJKTsKKworCXJldHVybiByMzsKK30KKworCisvKioKKyAqIGZoX3ZtcGljX2dldF9tc2lyIC0gcmV0dXJucyB0aGUgTVBJQy1NU0kgcmVnaXN0ZXIgdmFsdWUKKyAqIEBpbnRlcnJ1cHQ6IHRoZSBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAbXNpcl92YWw6IHJldHVybmVkIE1QSUMtTVNJIHJlZ2lzdGVyIHZhbHVlCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBvciBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmaF92bXBpY19nZXRfbXNpcih1bnNpZ25lZCBpbnQgaW50ZXJydXB0LAorCXVuc2lnbmVkIGludCAqbXNpcl92YWwpCit7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMSBfX2FzbV9fKCJyMTEiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjMgX19hc21fXygicjMiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjQgX19hc21fXygicjQiKTsKKworCXIxMSA9IEZIX0hDQUxMX1RPS0VOKEZIX1ZNUElDX0dFVF9NU0lSKTsKKwlyMyA9IGludGVycnVwdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLCAiK3IiIChyMyksICI9ciIgKHI0KQorCQk6IDogRVZfSENBTExfQ0xPQkJFUlMyCisJKTsKKworCSptc2lyX3ZhbCA9IHI0OworCisJcmV0dXJuIHIzOworfQorCisvKioKKyAqIGZoX3N5c3RlbV9yZXNldCAtIHJlc2V0IHRoZSBzeXN0ZW0KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZoX3N5c3RlbV9yZXNldCh2b2lkKQoreworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMTEgX19hc21fXygicjExIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHIzIF9fYXNtX18oInIzIik7CisKKwlyMTEgPSBGSF9IQ0FMTF9UT0tFTihGSF9TWVNURU1fUkVTRVQpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzYyAxIgorCQk6ICIrciIgKHIxMSksICI9ciIgKHIzKQorCQk6IDogRVZfSENBTExfQ0xPQkJFUlMxCisJKTsKKworCXJldHVybiByMzsKK30KKworCisvKioKKyAqIGZoX2Vycl9nZXRfaW5mbyAtIGdldCBwbGF0Zm9ybSBlcnJvciBpbmZvcm1hdGlvbgorICogQHF1ZXVlIGlkOgorICogMCBmb3IgZ3Vlc3QgZXJyb3IgZXZlbnQgcXVldWUKKyAqIDEgZm9yIGdsb2JhbCBlcnJvciBldmVudCBxdWV1ZQorICoKKyAqIEBwb2ludGVyIHRvIHN0b3JlIHRoZSBwbGF0Zm9ybSBlcnJvciBkYXRhOgorICogcGxhdGZvcm0gZXJyb3IgZGF0YSBpcyByZXR1cm5lZCBpbiByZWdpc3RlcnMgcjQgLSByMTEKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZoX2Vycl9nZXRfaW5mbyhpbnQgcXVldWUsIHVpbnQzMl90ICpidWZzaXplLAorCXVpbnQzMl90IGFkZHJfaGksIHVpbnQzMl90IGFkZHJfbG8sIGludCBwZWVrKQoreworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMTEgX19hc21fXygicjExIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHIzIF9fYXNtX18oInIzIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI0IF9fYXNtX18oInI0Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI1IF9fYXNtX18oInI1Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI2IF9fYXNtX18oInI2Iik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI3IF9fYXNtX18oInI3Iik7CisKKwlyMTEgPSBGSF9IQ0FMTF9UT0tFTihGSF9FUlJfR0VUX0lORk8pOworCXIzID0gcXVldWU7CisJcjQgPSAqYnVmc2l6ZTsKKwlyNSA9IGFkZHJfaGk7CisJcjYgPSBhZGRyX2xvOworCXI3ID0gcGVlazsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLCAiK3IiIChyMyksICIrciIgKHI0KSwgIityIiAocjUpLCAiK3IiIChyNiksCisJCSAgIityIiAocjcpCisJCTogOiBFVl9IQ0FMTF9DTE9CQkVSUzUKKwkpOworCisJKmJ1ZnNpemUgPSByNDsKKworCXJldHVybiByMzsKK30KKworCisjZGVmaW5lIEZIX1ZDUFVfUlVOCTAKKyNkZWZpbmUgRkhfVkNQVV9JRExFCTEKKyNkZWZpbmUgRkhfVkNQVV9OQVAJMgorCisvKioKKyAqIGZoX2dldF9jb3JlX3N0YXRlIC0gZ2V0IHRoZSBzdGF0ZSBvZiBhIHZjcHUKKyAqCisgKiBAaGFuZGxlOiBoYW5kbGUgb2YgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlIHZjcHUKKyAqIEB2Y3B1OiB2Y3B1IG51bWJlciB3aXRoaW4gdGhlIHBhcnRpdGlvbgorICogQHN0YXRlOnRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2Y3B1LCBzZWUgRkhfVkNQVV8qCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBvciBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmaF9nZXRfY29yZV9zdGF0ZSh1bnNpZ25lZCBpbnQgaGFuZGxlLAorCXVuc2lnbmVkIGludCB2Y3B1LCB1bnNpZ25lZCBpbnQgKnN0YXRlKQoreworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMTEgX19hc21fXygicjExIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHIzIF9fYXNtX18oInIzIik7CisJcmVnaXN0ZXIgdWludHB0cl90IHI0IF9fYXNtX18oInI0Iik7CisKKwlyMTEgPSBGSF9IQ0FMTF9UT0tFTihGSF9HRVRfQ09SRV9TVEFURSk7CisJcjMgPSBoYW5kbGU7CisJcjQgPSB2Y3B1OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzYyAxIgorCQk6ICIrciIgKHIxMSksICIrciIgKHIzKSwgIityIiAocjQpCisJCTogOiBFVl9IQ0FMTF9DTE9CQkVSUzIKKwkpOworCisJKnN0YXRlID0gcjQ7CisJcmV0dXJuIHIzOworfQorCisvKioKKyAqIGZoX2VudGVyX25hcCAtIGVudGVyIG5hcCBvbiBhIHZjcHUKKyAqCisgKiBOb3RlIHRoYXQgdGhvdWdoIHRoZSBBUEkgc3VwcG9ydHMgZW50ZXJpbmcgbmFwIG9uIGEgdmNwdSBvdGhlcgorICogdGhhbiB0aGUgY2FsbGVyLCB0aGlzIG1heSBub3QgYmUgaW1wbG1lbnRlZCBhbmQgbWF5IHJldHVybiBFSU5WQUwuCisgKgorICogQGhhbmRsZTogaGFuZGxlIG9mIHBhcnRpdGlvbiBjb250YWluaW5nIHRoZSB2Y3B1CisgKiBAdmNwdTogdmNwdSBudW1iZXIgd2l0aGluIHRoZSBwYXJ0aXRpb24KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZoX2VudGVyX25hcCh1bnNpZ25lZCBpbnQgaGFuZGxlLCB1bnNpZ25lZCBpbnQgdmNwdSkKK3sKKwlyZWdpc3RlciB1aW50cHRyX3QgcjExIF9fYXNtX18oInIxMSIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMyBfX2FzbV9fKCJyMyIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNCBfX2FzbV9fKCJyNCIpOworCisJcjExID0gRkhfSENBTExfVE9LRU4oRkhfRU5URVJfTkFQKTsKKwlyMyA9IGhhbmRsZTsKKwlyNCA9IHZjcHU7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNjIDEiCisJCTogIityIiAocjExKSwgIityIiAocjMpLCAiK3IiIChyNCkKKwkJOiA6IEVWX0hDQUxMX0NMT0JCRVJTMgorCSk7CisKKwlyZXR1cm4gcjM7Cit9CisKKy8qKgorICogZmhfZXhpdF9uYXAgLSBleGl0IG5hcCBvbiBhIHZjcHUKKyAqIEBoYW5kbGU6IGhhbmRsZSBvZiBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgdmNwdQorICogQHZjcHU6IHZjcHUgbnVtYmVyIHdpdGhpbiB0aGUgcGFydGl0aW9uCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBvciBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmaF9leGl0X25hcCh1bnNpZ25lZCBpbnQgaGFuZGxlLCB1bnNpZ25lZCBpbnQgdmNwdSkKK3sKKwlyZWdpc3RlciB1aW50cHRyX3QgcjExIF9fYXNtX18oInIxMSIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMyBfX2FzbV9fKCJyMyIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByNCBfX2FzbV9fKCJyNCIpOworCisJcjExID0gRkhfSENBTExfVE9LRU4oRkhfRVhJVF9OQVApOworCXIzID0gaGFuZGxlOworCXI0ID0gdmNwdTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLCAiK3IiIChyMyksICIrciIgKHI0KQorCQk6IDogRVZfSENBTExfQ0xPQkJFUlMyCisJKTsKKworCXJldHVybiByMzsKK30KKy8qKgorICogZmhfY2xhaW1fZGV2aWNlIC0gY2xhaW0gYSAiY2xhaW1hYmxlIiBzaGFyZWQgZGV2aWNlCisgKiBAaGFuZGxlOiBmc2wsaHYtZGV2aWNlLWhhbmRsZSBvZiBub2RlIHRvIGNsYWltCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBvciBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmaF9jbGFpbV9kZXZpY2UodW5zaWduZWQgaW50IGhhbmRsZSkKK3sKKwlyZWdpc3RlciB1aW50cHRyX3QgcjExIF9fYXNtX18oInIxMSIpOworCXJlZ2lzdGVyIHVpbnRwdHJfdCByMyBfX2FzbV9fKCJyMyIpOworCisJcjExID0gRkhfSENBTExfVE9LRU4oRkhfQ0xBSU1fREVWSUNFKTsKKwlyMyA9IGhhbmRsZTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic2MgMSIKKwkJOiAiK3IiIChyMTEpLCAiK3IiIChyMykKKwkJOiA6IEVWX0hDQUxMX0NMT0JCRVJTMQorCSk7CisKKwlyZXR1cm4gcjM7Cit9CisKKy8qKgorICogUnVuIGRlZmVycmVkIERNQSBkaXNhYmxpbmcgb24gYSBwYXJ0aXRpb24ncyBwcml2YXRlIGRldmljZXMKKyAqCisgKiBUaGlzIGFwcGxpZXMgdG8gZGV2aWNlcyB3aGljaCBhIHBhcnRpdGlvbiBvd25zIGVpdGhlciBwcml2YXRlbHksCisgKiBvciB3aGljaCBhcmUgY2xhaW1hYmxlIGFuZCBzdGlsbCBhY3RpdmVseSBvd25lZCBieSB0aGF0IHBhcnRpdGlvbiwKKyAqIGFuZCB3aGljaCBkbyBub3QgaGF2ZSB0aGUgbm8tZG1hLWRpc2FibGUgcHJvcGVydHkuCisgKgorICogQGhhbmRsZTogcGFydGl0aW9uIChtdXN0IGJlIHN0b3BwZWQpIHdob3NlIERNQSBpcyB0byBiZSBkaXNhYmxlZAorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZmhfcGFydGl0aW9uX3N0b3BfZG1hKHVuc2lnbmVkIGludCBoYW5kbGUpCit7CisJcmVnaXN0ZXIgdWludHB0cl90IHIxMSBfX2FzbV9fKCJyMTEiKTsKKwlyZWdpc3RlciB1aW50cHRyX3QgcjMgX19hc21fXygicjMiKTsKKworCXIxMSA9IEZIX0hDQUxMX1RPS0VOKEZIX1BBUlRJVElPTl9TVE9QX0RNQSk7CisJcjMgPSBoYW5kbGU7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNjIDEiCisJCTogIityIiAocjExKSwgIityIiAocjMpCisJCTogOiBFVl9IQ0FMTF9DTE9CQkVSUzEKKwkpOworCisJcmV0dXJuIHIzOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmgKaW5kZXggZmQ4MjAxZC4uMWMzMjRmZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaApAQCAtMjksNiArMjksMTAgQEAKICNkZWZpbmUgSF9MT05HX0JVU1lfT1JERVJfMTAwX1NFQwk5OTA1ICAvKiBMb25nIGJ1c3ksIGhpbnQgdGhhdCAxMDBzZWMgXAogCQkJCQkJIGlzIGEgZ29vZCB0aW1lIHRvIHJldHJ5ICovCiAjZGVmaW5lIEhfTE9OR19CVVNZX0VORF9SQU5HRQkJOTkwNSAgLyogRW5kIG9mIGxvbmcgYnVzeSByYW5nZSAqLworCisvKiBJbnRlcm5hbCB2YWx1ZSB1c2VkIGluIGJvb2szc19odiBrdm0gc3VwcG9ydDsgbm90IHJldHVybmVkIHRvIGd1ZXN0cyAqLworI2RlZmluZSBIX1RPT19IQVJECTk5OTkKKwogI2RlZmluZSBIX0hBUkRXQVJFCS0xCS8qIEhhcmR3YXJlIGVycm9yICovCiAjZGVmaW5lIEhfRlVOQ1RJT04JLTIJLyogRnVuY3Rpb24gbm90IHN1cHBvcnRlZCAqLwogI2RlZmluZSBIX1BSSVZJTEVHRQktMwkvKiBDYWxsZXIgbm90IHByaXZpbGVnZWQgKi8KQEAgLTEwMCw2ICsxMDQsNyBAQAogI2RlZmluZSBIX1BBR0VfU0VUX0FDVElWRQlIX1BBR0VfU1RBVEVfQ0hBTkdFCiAjZGVmaW5lIEhfQVZQTgkJCSgxVUw8PCg2My0zMikpCS8qIEFuIGF2cG4gaXMgcHJvdmlkZWQgYXMgYSBzYW5pdHkgdGVzdCAqLwogI2RlZmluZSBIX0FORENPTkQJCSgxVUw8PCg2My0zMykpCisjZGVmaW5lIEhfTE9DQUwJCQkoMVVMPDwoNjMtMzUpKQogI2RlZmluZSBIX0lDQUNIRV9JTlZBTElEQVRFCSgxVUw8PCg2My00MCkpCS8qIGljYmksIGV0Yy4gIChpZ25vcmVkIGZvciBJTyBwYWdlcykgKi8KICNkZWZpbmUgSF9JQ0FDSEVfU1lOQ0hST05JWkUJKDFVTDw8KDYzLTQxKSkJLyogZGNic3QsIGljYmksIGV0YyAoaWdub3JlZCBmb3IgSU8gcGFnZXMgKi8KICNkZWZpbmUgSF9DT0FMRVNDRV9DQU5ECSgxVUw8PCg2My00MikpCS8qIHBhZ2UgaXMgYSBnb29kIGNhbmRpZGF0ZSBmb3IgY29hbGVzY2luZyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2c2kuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odnNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmNjRmMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odnNpLmgKQEAgLTAsMCArMSw5NCBAQAorI2lmbmRlZiBfSFZTSV9ICisjZGVmaW5lIF9IVlNJX0gKKworI2RlZmluZSBWU19EQVRBX1BBQ0tFVF9IRUFERVIgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgVlNfQ09OVFJPTF9QQUNLRVRfSEVBREVSICAgICAgICAweGZlCisjZGVmaW5lIFZTX1FVRVJZX1BBQ0tFVF9IRUFERVIgICAgICAgICAgMHhmZAorI2RlZmluZSBWU19RVUVSWV9SRVNQT05TRV9QQUNLRVRfSEVBREVSIDB4ZmMKKworLyogY29udHJvbCB2ZXJicyAqLworI2RlZmluZSBWU1ZfU0VUX01PREVNX0NUTCAgICAxIC8qIHRvIHNlcnZpY2UgcHJvY2Vzc29yIG9ubHkgKi8KKyNkZWZpbmUgVlNWX01PREVNX0NUTF9VUERBVEUgMiAvKiBmcm9tIHNlcnZpY2UgcHJvY2Vzc29yIG9ubHkgKi8KKyNkZWZpbmUgVlNWX0NMT1NFX1BST1RPQ09MICAgMworCisvKiBxdWVyeSB2ZXJicyAqLworI2RlZmluZSBWU1ZfU0VORF9WRVJTSU9OX05VTUJFUiAxCisjZGVmaW5lIFZTVl9TRU5EX01PREVNX0NUTF9TVEFUVVMgMgorCisvKiB5ZXMsIHRoZXNlIG1hc2tzIGFyZSBub3QgY29uc2VjdXRpdmUuICovCisjZGVmaW5lIEhWU0lfVFNEVFIgMHgwMQorI2RlZmluZSBIVlNJX1RTQ0QgIDB4MjAKKworI2RlZmluZSBIVlNJX01BWF9PVVRHT0lOR19EQVRBIDEyCisjZGVmaW5lIEhWU0lfVkVSU0lPTiAxCisKK3N0cnVjdCBodnNpX2hlYWRlciB7CisJdWludDhfdCAgdHlwZTsKKwl1aW50OF90ICBsZW47CisJdWludDE2X3Qgc2Vxbm87Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaHZzaV9kYXRhIHsKKwlzdHJ1Y3QgaHZzaV9oZWFkZXIgaGRyOworCXVpbnQ4X3QgIGRhdGFbSFZTSV9NQVhfT1VUR09JTkdfREFUQV07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaHZzaV9jb250cm9sIHsKKwlzdHJ1Y3QgaHZzaV9oZWFkZXIgaGRyOworCXVpbnQxNl90IHZlcmI7CisJLyogb3B0aW9uYWwgZGVwZW5kaW5nIG9uIHZlcmI6ICovCisJdWludDMyX3Qgd29yZDsKKwl1aW50MzJfdCBtYXNrOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGh2c2lfcXVlcnkgeworCXN0cnVjdCBodnNpX2hlYWRlciBoZHI7CisJdWludDE2X3QgdmVyYjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgaHZzaV9oZWFkZXIgaGRyOworCXVpbnQxNl90IHZlcmI7CisJdWludDE2X3QgcXVlcnlfc2Vxbm87CisJdW5pb24geworCQl1aW50OF90ICB2ZXJzaW9uOworCQl1aW50MzJfdCBtY3RybF93b3JkOworCX0gdTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIGh2c2kgbGliIHN0cnVjdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBIVlNJX0lOQlVGX1NJWkUJCTI1NQorc3RydWN0IHR0eV9zdHJ1Y3Q7CitzdHJ1Y3QgaHZzaV9wcml2IHsKKwl1bnNpZ25lZCBpbnQJaW5idWZfbGVuOwkvKiBkYXRhIGluIGlucHV0IGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIJaW5idWZbSFZTSV9JTkJVRl9TSVpFXTsKKwl1bnNpZ25lZCBpbnQJaW5idWZfY3VyOwkvKiBDdXJzb3IgaW4gaW5wdXQgYnVmZmVyICovCisJdW5zaWduZWQgaW50CWluYnVmX3BrdGxlbjsJLyogcGFja2V0IGxlbmdodCBmcm9tIGN1cnNvciAqLworCWF0b21pY190CXNlcW5vOwkJLyogcGFja2V0IHNlcXVlbmNlIG51bWJlciAqLworCXVuc2lnbmVkIGludAlvcGVuZWQ6MTsJLyogZHJpdmVyIG9wZW5lZCAqLworCXVuc2lnbmVkIGludAllc3RhYmxpc2hlZDoxOwkvKiBwcm90b2NvbCBlc3RhYmxpc2hlZCAqLworCXVuc2lnbmVkIGludCAJaXNfY29uc29sZToxOwkvKiB1c2VkIGFzIGEga2VybmVsIGNvbnNvbGUgZGV2aWNlICovCisJdW5zaWduZWQgaW50CW1jdHJsX3VwZGF0ZToxOwkvKiBtb2RlbSBjb250cm9sIHVwZGF0ZWQgKi8KKwl1bnNpZ25lZCBzaG9ydAltY3RybDsJCS8qIG1vZGVtIGNvbnRyb2wgKi8KKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwkJLyogdHR5IHN0cnVjdHVyZSAqLworCWludCAoKmdldF9jaGFycykodWludDMyX3QgdGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCk7CisJaW50ICgqcHV0X2NoYXJzKSh1aW50MzJfdCB0ZXJtbm8sIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKKwl1aW50MzJfdAl0ZXJtbm87Cit9OworCisvKiBodnNpIGxpYiBmdW5jdGlvbnMgKi8KK3N0cnVjdCBodmNfc3RydWN0OworZXh0ZXJuIHZvaWQgaHZzaWxpYl9pbml0KHN0cnVjdCBodnNpX3ByaXYgKnB2LAorCQkJIGludCAoKmdldF9jaGFycykodWludDMyX3QgdGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCksCisJCQkgaW50ICgqcHV0X2NoYXJzKSh1aW50MzJfdCB0ZXJtbm8sIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJICBpbnQgY291bnQpLAorCQkJIGludCB0ZXJtbm8sIGludCBpc19jb25zb2xlKTsKK2V4dGVybiBpbnQgaHZzaWxpYl9vcGVuKHN0cnVjdCBodnNpX3ByaXYgKnB2LCBzdHJ1Y3QgaHZjX3N0cnVjdCAqaHApOworZXh0ZXJuIHZvaWQgaHZzaWxpYl9jbG9zZShzdHJ1Y3QgaHZzaV9wcml2ICpwdiwgc3RydWN0IGh2Y19zdHJ1Y3QgKmhwKTsKK2V4dGVybiBpbnQgaHZzaWxpYl9yZWFkX21jdHJsKHN0cnVjdCBodnNpX3ByaXYgKnB2KTsKK2V4dGVybiBpbnQgaHZzaWxpYl93cml0ZV9tY3RybChzdHJ1Y3QgaHZzaV9wcml2ICpwdiwgaW50IGR0cik7CitleHRlcm4gdm9pZCBodnNpbGliX2VzdGFibGlzaChzdHJ1Y3QgaHZzaV9wcml2ICpwdik7CitleHRlcm4gaW50IGh2c2lsaWJfZ2V0X2NoYXJzKHN0cnVjdCBodnNpX3ByaXYgKnB2LCBjaGFyICpidWYsIGludCBjb3VudCk7CitleHRlcm4gaW50IGh2c2lsaWJfcHV0X2NoYXJzKHN0cnVjdCBodnNpX3ByaXYgKnB2LCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCk7CisKKyNlbmRpZiAvKiBfSFZTSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaAppbmRleCAxYzMzZWMxLi44MGZkNGQyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmgKQEAgLTU3LDcgKzU3LDcgQEAKIGV4dGVybiB2b2lkIGZsdXNoX3B0cmFjZV9od19icmVha3BvaW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIAogZXh0ZXJuIHN0cnVjdCBwbXUgcGVyZl9vcHNfYnA7Ci1leHRlcm4gdm9pZCBwdHJhY2VfdHJpZ2dlcmVkKHN0cnVjdCBwZXJmX2V2ZW50ICpicCwgaW50IG5taSwKK2V4dGVybiB2b2lkIHB0cmFjZV90cmlnZ2VyZWQoc3RydWN0IHBlcmZfZXZlbnQgKmJwLAogCQkJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBod19icmVha3BvaW50X2Rpc2FibGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pcnEuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pcnEuaAppbmRleCAxYmZmNTkxLi5jNTdhMjhlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaXJxLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lycS5oCkBAIC0zMzAsNSArMzMwLDcgQEAKIAkJCSAgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdHAsIHZvaWQgKmZ1bmMpOwogZXh0ZXJuIHZvaWQgZG9fSVJRKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAoraW50IGlycV9jaG9vc2VfY3B1KGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKTsKKwogI2VuZGlmIC8qIF9BU01fSVJRX0ggKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc4MGI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19KVU1QX0xBQkVMX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX0pVTVBfTEFCRUxfSAorCisvKgorICogQ29weXJpZ2h0IDIwMTAgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9mZWF0dXJlLWZpeHVwcy5oPgorCisjZGVmaW5lIEpVTVBfRU5UUllfVFlQRQkJc3RyaW5naWZ5X2luX2MoRlRSX0VOVFJZX0xPTkcpCisjZGVmaW5lIEpVTVBfTEFCRUxfTk9QX1NJWkUJNAorCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgYXJjaF9zdGF0aWNfYnJhbmNoKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5KQoreworCWFzbSBnb3RvKCIxOlxuXHQiCisJCSAibm9wXG5cdCIKKwkJICIucHVzaHNlY3Rpb24gX19qdW1wX3RhYmxlLCAgXCJhd1wiXG5cdCIKKwkJICIuYWxpZ24gNFxuXHQiCisJCSBKVU1QX0VOVFJZX1RZUEUgIjFiLCAlbFtsX3llc10sICVjMFxuXHQiCisJCSAiLnBvcHNlY3Rpb24gXG5cdCIKKwkJIDogOiAgImkiIChrZXkpIDogOiBsX3llcyk7CisJcmV0dXJuIGZhbHNlOworbF95ZXM6CisJcmV0dXJuIHRydWU7Cit9CisKKyNpZmRlZiBDT05GSUdfUFBDNjQKK3R5cGVkZWYgdTY0IGp1bXBfbGFiZWxfdDsKKyNlbHNlCit0eXBlZGVmIHUzMiBqdW1wX2xhYmVsX3Q7CisjZW5kaWYKKworc3RydWN0IGp1bXBfZW50cnkgeworCWp1bXBfbGFiZWxfdCBjb2RlOworCWp1bXBfbGFiZWxfdCB0YXJnZXQ7CisJanVtcF9sYWJlbF90IGtleTsKKwlqdW1wX2xhYmVsX3QgcGFkOworfTsKKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19KVU1QX0xBQkVMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm0uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm0uaAppbmRleCBkMmNhNWVkLi5hNGY2Yzg1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bS5oCkBAIC0yMiw2ICsyMiwxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAorLyogU2VsZWN0IHBvd2VycGMgc3BlY2lmaWMgZmVhdHVyZXMgaW4gPGxpbnV4L2t2bS5oPiAqLworI2RlZmluZSBfX0tWTV9IQVZFX1NQQVBSX1RDRQorI2RlZmluZSBfX0tWTV9IQVZFX1BQQ19TTVQKKwogc3RydWN0IGt2bV9yZWdzIHsKIAlfX3U2NCBwYzsKIAlfX3U2NCBjcjsKQEAgLTI3Miw0ICsyNzYsMTUgQEAKICNkZWZpbmUgS1ZNX0lOVEVSUlVQVF9VTlNFVAktMlUKICNkZWZpbmUgS1ZNX0lOVEVSUlVQVF9TRVRfTEVWRUwJLTNVCiAKKy8qIGZvciBLVk1fQ0FQX1NQQVBSX1RDRSAqLworc3RydWN0IGt2bV9jcmVhdGVfc3BhcHJfdGNlIHsKKwlfX3U2NCBsaW9ibjsKKwlfX3UzMiB3aW5kb3dfc2l6ZTsKK307CisKKy8qIGZvciBLVk1fQUxMT0NBVEVfUk1BICovCitzdHJ1Y3Qga3ZtX2FsbG9jYXRlX3JtYSB7CisJX191NjQgcm1hX3NpemU7Cit9OworCiAjZW5kaWYgLyogX19MSU5VWF9LVk1fUE9XRVJQQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2FzbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9hc20uaAppbmRleCAwOTUxYjE3Li43YjFmMGUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2FzbS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYXNtLmgKQEAgLTY0LDggKzY0LDEyIEBACiAjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfUFJPR1JBTQkweDcwMAogI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX0ZQX1VOQVZBSUwJMHg4MDAKICNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9ERUNSRU1FTlRFUgkweDkwMAorI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX0hWX0RFQ1JFTUVOVEVSCTB4OTgwCiAjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfU1lTQ0FMTAkweGMwMAogI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX1RSQUNFCQkweGQwMAorI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX0hfREFUQV9TVE9SQUdFCTB4ZTAwCisjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfSF9JTlNUX1NUT1JBR0UJMHhlMjAKKyNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9IX0VNVUxfQVNTSVNUCTB4ZTQwCiAjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfUEVSRk1PTgkweGYwMAogI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX0FMVElWRUMJMHhmMjAKICNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9WU1gJCTB4ZjQwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaAppbmRleCBkNjJlNzAzLi45OGRhMDEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmgKQEAgLTI0LDIwICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxhc20va3ZtX2Jvb2szc19hc20uaD4KIAotc3RydWN0IGt2bXBwY19zbGIgewotCXU2NCBlc2lkOwotCXU2NCB2c2lkOwotCXU2NCBvcmlnZTsKLQl1NjQgb3JpZ3Y7Ci0JYm9vbCB2YWxpZAk6IDE7Ci0JYm9vbCBLcwkJOiAxOwotCWJvb2wgS3AJCTogMTsKLQlib29sIG54CQk6IDE7Ci0JYm9vbCBsYXJnZQk6IDE7CS8qIFBURXMgYXJlIDE2TUIgKi8KLQlib29sIHRiCQk6IDE7CS8qIDFUQiBzZWdtZW50ICovCi0JYm9vbCBjbGFzcwk6IDE7Ci19OwotCiBzdHJ1Y3Qga3ZtcHBjX2JhdCB7CiAJdTY0IHJhdzsKIAl1MzIgYmVwaTsKQEAgLTY3LDExICs1MywyMiBAQAogI2RlZmluZSBWU0lEX1BPT0xfU0laRQkoU0lEX0NPTlRFWFRTICogMTYpCiAjZW5kaWYKIAorc3RydWN0IGhwdGVfY2FjaGUgeworCXN0cnVjdCBobGlzdF9ub2RlIGxpc3RfcHRlOworCXN0cnVjdCBobGlzdF9ub2RlIGxpc3RfcHRlX2xvbmc7CisJc3RydWN0IGhsaXN0X25vZGUgbGlzdF92cHRlOworCXN0cnVjdCBobGlzdF9ub2RlIGxpc3RfdnB0ZV9sb25nOworCXN0cnVjdCByY3VfaGVhZCByY3VfaGVhZDsKKwl1NjQgaG9zdF92YTsKKwl1NjQgcGZuOworCXVsb25nIHNsb3Q7CisJc3RydWN0IGt2bXBwY19wdGUgcHRlOworfTsKKwogc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyB7CiAJc3RydWN0IGt2bV92Y3B1IHZjcHU7CiAJc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUgKnNoYWRvd192Y3B1OwogCXN0cnVjdCBrdm1wcGNfc2lkX21hcCBzaWRfbWFwW1NJRF9NQVBfTlVNXTsKLQlzdHJ1Y3Qga3ZtcHBjX3NsYiBzbGJbNjRdOwogCXN0cnVjdCB7CiAJCXU2NCBlc2lkOwogCQl1NjQgdnNpZDsKQEAgLTgxLDcgKzc4LDYgQEAKIAlzdHJ1Y3Qga3ZtcHBjX2JhdCBkYmF0WzhdOwogCXU2NCBoaWRbNl07CiAJdTY0IGdxcls4XTsKLQlpbnQgc2xiX25yOwogCXU2NCBzZHIxOwogCXU2NCBoaW9yOwogCXU2NCBtc3JfbWFzazsKQEAgLTkzLDcgKzg5LDEzIEBACiAJdTY0IHZzaWRfbWF4OwogI2VuZGlmCiAJaW50IGNvbnRleHRfaWRbU0lEX0NPTlRFWFRTXTsKLQl1bG9uZyBwcm9nX2ZsYWdzOyAvKiBmbGFncyB0byBpbmplY3Qgd2hlbiBnaXZpbmcgYSA3MDAgdHJhcCAqLworCisJc3RydWN0IGhsaXN0X2hlYWQgaHB0ZV9oYXNoX3B0ZVtIUFRFR19IQVNIX05VTV9QVEVdOworCXN0cnVjdCBobGlzdF9oZWFkIGhwdGVfaGFzaF9wdGVfbG9uZ1tIUFRFR19IQVNIX05VTV9QVEVfTE9OR107CisJc3RydWN0IGhsaXN0X2hlYWQgaHB0ZV9oYXNoX3ZwdGVbSFBURUdfSEFTSF9OVU1fVlBURV07CisJc3RydWN0IGhsaXN0X2hlYWQgaHB0ZV9oYXNoX3ZwdGVfbG9uZ1tIUFRFR19IQVNIX05VTV9WUFRFX0xPTkddOworCWludCBocHRlX2NhY2hlX2NvdW50OworCXNwaW5sb2NrX3QgbW11X2xvY2s7CiB9OwogCiAjZGVmaW5lIENPTlRFWFRfSE9TVAkJMApAQCAtMTEwLDggKzExMiwxMCBAQAogZXh0ZXJuIHZvaWQga3ZtcHBjX21tdV9wdGVfdmZsdXNoKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZwLCB1NjQgdnBfbWFzayk7CiBleHRlcm4gdm9pZCBrdm1wcGNfbW11X3B0ZV9wZmx1c2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyBwYV9zdGFydCwgdWxvbmcgcGFfZW5kKTsKIGV4dGVybiB2b2lkIGt2bXBwY19zZXRfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IG5ld19tc3IpOworZXh0ZXJuIHZvaWQga3ZtcHBjX3NldF9wdnIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgcHZyKTsKIGV4dGVybiB2b2lkIGt2bXBwY19tbXVfYm9vazNzXzY0X2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGV4dGVybiB2b2lkIGt2bXBwY19tbXVfYm9vazNzXzMyX2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK2V4dGVybiB2b2lkIGt2bXBwY19tbXVfYm9vazNzX2h2X2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGV4dGVybiBpbnQga3ZtcHBjX21tdV9tYXBfcGFnZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1wcGNfcHRlICpwdGUpOwogZXh0ZXJuIGludCBrdm1wcGNfbW11X21hcF9zZWdtZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgZWFkZHIpOwogZXh0ZXJuIHZvaWQga3ZtcHBjX21tdV9mbHVzaF9zZWdtZW50cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpAQCAtMTIzLDE5ICsxMjcsMjIgQEAKIGV4dGVybiB2b2lkIGt2bXBwY19tbXVfaW52YWxpZGF0ZV9wdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgaHB0ZV9jYWNoZSAqcHRlKTsKIGV4dGVybiBpbnQga3ZtcHBjX21tdV9ocHRlX3N5c2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBrdm1wcGNfbW11X2hwdGVfc3lzZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQga3ZtcHBjX21tdV9odl9pbml0KHZvaWQpOwogCiBleHRlcm4gaW50IGt2bXBwY19sZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nICplYWRkciwgaW50IHNpemUsIHZvaWQgKnB0ciwgYm9vbCBkYXRhKTsKIGV4dGVybiBpbnQga3ZtcHBjX3N0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgKmVhZGRyLCBpbnQgc2l6ZSwgdm9pZCAqcHRyLCBib29sIGRhdGEpOwogZXh0ZXJuIHZvaWQga3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgaW50IHZlYyk7CitleHRlcm4gdm9pZCBrdm1wcGNfaW5qZWN0X2ludGVycnVwdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCB2ZWMsIHU2NCBmbGFncyk7CiBleHRlcm4gdm9pZCBrdm1wcGNfc2V0X2JhdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1wcGNfYmF0ICpiYXQsCiAJCQkgICBib29sIHVwcGVyLCB1MzIgdmFsKTsKIGV4dGVybiB2b2lkIGt2bXBwY19naXZldXBfZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgbXNyKTsKIGV4dGVybiBpbnQga3ZtcHBjX2VtdWxhdGVfcGFpcmVkX3NpbmdsZShzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogZXh0ZXJuIHBmbl90IGt2bXBwY19nZm5fdG9fcGZuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ2ZuX3QgZ2ZuKTsKIAotZXh0ZXJuIHVsb25nIGt2bXBwY190cmFtcG9saW5lX2xvd21lbTsKLWV4dGVybiB1bG9uZyBrdm1wcGNfdHJhbXBvbGluZV9lbnRlcjsKK2V4dGVybiB2b2lkIGt2bXBwY19oYW5kbGVyX2xvd21lbV90cmFtcG9saW5lKHZvaWQpOworZXh0ZXJuIHZvaWQga3ZtcHBjX2hhbmRsZXJfdHJhbXBvbGluZV9lbnRlcih2b2lkKTsKIGV4dGVybiB2b2lkIGt2bXBwY19ybWNhbGwodWxvbmcgc3JyMCwgdWxvbmcgc3JyMSk7CitleHRlcm4gdm9pZCBrdm1wcGNfaHZfZW50cnlfdHJhbXBvbGluZSh2b2lkKTsKIGV4dGVybiB2b2lkIGt2bXBwY19sb2FkX3VwX2ZwdSh2b2lkKTsKIGV4dGVybiB2b2lkIGt2bXBwY19sb2FkX3VwX2FsdGl2ZWModm9pZCk7CiBleHRlcm4gdm9pZCBrdm1wcGNfbG9hZF91cF92c3godm9pZCk7CkBAIC0xNDcsMTUgKzE1NCwzMiBAQAogCXJldHVybiBjb250YWluZXJfb2YodmNwdSwgc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcywgdmNwdSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdWxvbmcgZHNpc3Iodm9pZCkKK2V4dGVybiB2b2lkIGt2bV9yZXR1cm5fcG9pbnQodm9pZCk7CisKKy8qIEFsc28gYWRkIHN1YmFyY2ggc3BlY2lmaWMgZGVmaW5lcyAqLworCisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfMzJfSEFORExFUgorI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzXzMyLmg+CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSCisjaW5jbHVkZSA8YXNtL2t2bV9ib29rM3NfNjQuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfUFIKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGt2bXBwY19pbnRlcnJ1cHRfb2Zmc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQl1bG9uZyByOwotCWFzbSAoICJtZmRzaXNyICUwICIgOiAiPXIiIChyKSApOwotCXJldHVybiByOworCXJldHVybiB0b19ib29rM3ModmNwdSktPmhpb3I7CiB9CiAKLWV4dGVybiB2b2lkIGt2bV9yZXR1cm5fcG9pbnQodm9pZCk7Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1ICp0b19zdmNwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworc3RhdGljIGlubGluZSB2b2lkIGt2bXBwY191cGRhdGVfaW50X3BlbmRpbmcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJdW5zaWduZWQgbG9uZyBwZW5kaW5nX25vdywgdW5zaWduZWQgbG9uZyBvbGRfcGVuZGluZykKK3sKKwlpZiAocGVuZGluZ19ub3cpCisJCXZjcHUtPmFyY2guc2hhcmVkLT5pbnRfcGVuZGluZyA9IDE7CisJZWxzZSBpZiAob2xkX3BlbmRpbmcpCisJCXZjcHUtPmFyY2guc2hhcmVkLT5pbnRfcGVuZGluZyA9IDA7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBrdm1wcGNfc2V0X2dwcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBudW0sIHVsb25nIHZhbCkKIHsKQEAgLTI0NCw2ICsyNjgsMTIwIEBACiAJcmV0dXJuIHRvX3N2Y3B1KHZjcHUpLT5mYXVsdF9kYXI7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1wcGNfY3JpdGljYWxfc2VjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdWxvbmcgY3JpdF9yYXcgPSB2Y3B1LT5hcmNoLnNoYXJlZC0+Y3JpdGljYWw7CisJdWxvbmcgY3JpdF9yMSA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDEpOworCWJvb2wgY3JpdDsKKworCS8qIFRydW5jYXRlIGNyaXQgaW5kaWNhdG9ycyBpbiAzMiBiaXQgbW9kZSAqLworCWlmICghKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfU0YpKSB7CisJCWNyaXRfcmF3ICY9IDB4ZmZmZmZmZmY7CisJCWNyaXRfcjEgJj0gMHhmZmZmZmZmZjsKKwl9CisKKwkvKiBDcml0aWNhbCBzZWN0aW9uIHdoZW4gY3JpdCA9PSByMSAqLworCWNyaXQgPSAoY3JpdF9yYXcgPT0gY3JpdF9yMSk7CisJLyogLi4uIGFuZCB3ZSdyZSBpbiBzdXBlcnZpc29yIG1vZGUgKi8KKwljcml0ID0gY3JpdCAmJiAhKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfUFIpOworCisJcmV0dXJuIGNyaXQ7Cit9CisjZWxzZSAvKiBDT05GSUdfS1ZNX0JPT0szU19QUiAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcga3ZtcHBjX2ludGVycnVwdF9vZmZzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX3VwZGF0ZV9pbnRfcGVuZGluZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQl1bnNpZ25lZCBsb25nIHBlbmRpbmdfbm93LCB1bnNpZ25lZCBsb25nIG9sZF9wZW5kaW5nKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX3NldF9ncHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgbnVtLCB1bG9uZyB2YWwpCit7CisJdmNwdS0+YXJjaC5ncHJbbnVtXSA9IHZhbDsKK30KKworc3RhdGljIGlubGluZSB1bG9uZyBrdm1wcGNfZ2V0X2dwcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBudW0pCit7CisJcmV0dXJuIHZjcHUtPmFyY2guZ3ByW251bV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1wcGNfc2V0X2NyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIHZhbCkKK3sKKwl2Y3B1LT5hcmNoLmNyID0gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBrdm1wcGNfZ2V0X2NyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdmNwdS0+YXJjaC5jcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGt2bXBwY19zZXRfeGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIHZhbCkKK3sKKwl2Y3B1LT5hcmNoLnhlciA9IHZhbDsKK30KKworc3RhdGljIGlubGluZSB1MzIga3ZtcHBjX2dldF94ZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiB2Y3B1LT5hcmNoLnhlcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGt2bXBwY19zZXRfY3RyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgdmFsKQoreworCXZjcHUtPmFyY2guY3RyID0gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHVsb25nIGt2bXBwY19nZXRfY3RyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdmNwdS0+YXJjaC5jdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1wcGNfc2V0X2xyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgdmFsKQoreworCXZjcHUtPmFyY2gubHIgPSB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWxvbmcga3ZtcHBjX2dldF9scihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIHZjcHUtPmFyY2gubHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1wcGNfc2V0X3BjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgdmFsKQoreworCXZjcHUtPmFyY2gucGMgPSB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWxvbmcga3ZtcHBjX2dldF9wYyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIHZjcHUtPmFyY2gucGM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGt2bXBwY19nZXRfbGFzdF9pbnN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1bG9uZyBwYyA9IGt2bXBwY19nZXRfcGModmNwdSk7CisKKwkvKiBMb2FkIHRoZSBpbnN0cnVjdGlvbiBtYW51YWxseSBpZiBpdCBmYWlsZWQgdG8gZG8gc28gaW4gdGhlCisJICogZXhpdCBwYXRoICovCisJaWYgKHZjcHUtPmFyY2gubGFzdF9pbnN0ID09IEtWTV9JTlNUX0ZFVENIX0ZBSUxFRCkKKwkJa3ZtcHBjX2xkKHZjcHUsICZwYywgc2l6ZW9mKHUzMiksICZ2Y3B1LT5hcmNoLmxhc3RfaW5zdCwgZmFsc2UpOworCisJcmV0dXJuIHZjcHUtPmFyY2gubGFzdF9pbnN0OworfQorCitzdGF0aWMgaW5saW5lIHVsb25nIGt2bXBwY19nZXRfZmF1bHRfZGFyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdmNwdS0+YXJjaC5mYXVsdF9kYXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1wcGNfY3JpdGljYWxfc2VjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKIC8qIE1hZ2ljIHJlZ2lzdGVyIHZhbHVlcyBsb2FkZWQgaW50byByMyBhbmQgcjQgYmVmb3JlIHRoZSAnc2MnIGFzc2VtYmx5CiAgKiBpbnN0cnVjdGlvbiBmb3IgdGhlIE9TSSBoeXBlcmNhbGxzICovCiAjZGVmaW5lIE9TSV9TQ19NQUdJQ19SMwkJCTB4MTEzNzI0RkEKQEAgLTI1MSwxMiArMzg5LDQgQEAKIAogI2RlZmluZSBJTlNfRENCWgkJCTB4N2MwMDA3ZWMKIAotLyogQWxzbyBhZGQgc3ViYXJjaCBzcGVjaWZpYyBkZWZpbmVzICovCi0KLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szU18zMgotI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzXzMyLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzXzY0Lmg+Ci0jZW5kaWYKLQogI2VuZGlmIC8qIF9fQVNNX0tWTV9CT09LM1NfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc182NC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfNjQuaAppbmRleCA0Y2FkZDYxLi5lNDNmZTQyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc182NC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzXzY0LmgKQEAgLTIwLDkgKzIwLDEzIEBACiAjaWZuZGVmIF9fQVNNX0tWTV9CT09LM1NfNjRfSF9fCiAjZGVmaW5lIF9fQVNNX0tWTV9CT09LM1NfNjRfSF9fCiAKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19QUgogc3RhdGljIGlubGluZSBzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSAqdG9fc3ZjcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXJldHVybiAmZ2V0X3BhY2EoKS0+c2hhZG93X3ZjcHU7CiB9CisjZW5kaWYKKworI2RlZmluZSBTUEFQUl9UQ0VfU0hJRlQJCTEyCiAKICNlbmRpZiAvKiBfX0FTTV9LVk1fQk9PSzNTXzY0X0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfYXNtLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc19hc20uaAppbmRleCBkNWE4YTM4Li5lZjdiMzY4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc19hc20uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc19hc20uaApAQCAtNjAsNiArNjAsMzYgQEAKIAogI2Vsc2UgIC8qX19BU1NFTUJMWV9fICovCiAKKy8qCisgKiBUaGlzIHN0cnVjdCBnb2VzIGluIHRoZSBQQUNBIG9uIDY0LWJpdCBwcm9jZXNzb3JzLiAgSXQgaXMgdXNlZAorICogdG8gc3RvcmUgaG9zdCBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHNhdmVkIHdoZW4gd2UgZW50ZXIgYSBndWVzdAorICogYW5kIHJlc3RvcmVkIHdoZW4gd2UgZXhpdCwgYnV0IGlzbid0IHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyCisgKiBndWVzdCBvciB2Y3B1LiAgSXQgYWxzbyBoYXMgc29tZSBzY3JhdGNoIGZpZWxkcyB1c2VkIGJ5IHRoZSBndWVzdAorICogZXhpdCBjb2RlLgorICovCitzdHJ1Y3Qga3ZtcHBjX2hvc3Rfc3RhdGUgeworCXVsb25nIGhvc3RfcjE7CisJdWxvbmcgaG9zdF9yMjsKKwl1bG9uZyBob3N0X21zcjsKKwl1bG9uZyB2bWhhbmRsZXI7CisJdWxvbmcgc2NyYXRjaDA7CisJdWxvbmcgc2NyYXRjaDE7CisJdTggaW5fZ3Vlc3Q7CisKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IVgorCXN0cnVjdCBrdm1fdmNwdSAqa3ZtX3ZjcHU7CisJc3RydWN0IGt2bXBwY192Y29yZSAqa3ZtX3Zjb3JlOworCXVuc2lnbmVkIGxvbmcgeGljc19waHlzOworCXU2NCBkYWJyOworCXU2NCBob3N0X21tY3JbM107CisJdTMyIGhvc3RfcG1jWzhdOworCXU2NCBob3N0X3B1cnI7CisJdTY0IGhvc3Rfc3B1cnI7CisJdTY0IGhvc3RfZHNjcjsKKwl1NjQgZGVjX2V4cGlyZXM7CisjZW5kaWYKK307CisKIHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1IHsKIAl1bG9uZyBncHJbMTRdOwogCXUzMiBjcjsKQEAgLTczLDE3ICsxMDMsMTIgQEAKIAl1bG9uZyBzaGFkb3dfc3JyMTsKIAl1bG9uZyBmYXVsdF9kYXI7CiAKLQl1bG9uZyBob3N0X3IxOwotCXVsb25nIGhvc3RfcjI7Ci0JdWxvbmcgaGFuZGxlcjsKLQl1bG9uZyBzY3JhdGNoMDsKLQl1bG9uZyBzY3JhdGNoMTsKLQl1bG9uZyB2bWhhbmRsZXI7Ci0JdTggaW5fZ3Vlc3Q7Ci0KICNpZmRlZiBDT05GSUdfUFBDX0JPT0szU18zMgogCXUzMiAgICAgc3JbMTZdOwkJCS8qIEd1ZXN0IFNScyAqLworCisJc3RydWN0IGt2bXBwY19ob3N0X3N0YXRlIGhzdGF0ZTsKICNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfNjQKIAl1OCBzbGJfbWF4OwkJCS8qIGhpZ2hlc3QgdXNlZCBndWVzdCBzbGIgZW50cnkgKi8KIAlzdHJ1Y3QgIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9va2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9va2UuaAppbmRleCA5YzliYTNkLi5hOTBlMDkxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2tlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rZS5oCkBAIC05Myw0ICs5Myw4IEBACiAJcmV0dXJuIHZjcHUtPmFyY2guZmF1bHRfZGVhcjsKIH0KIAorc3RhdGljIGlubGluZSB1bG9uZyBrdm1wcGNfZ2V0X21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIHZjcHUtPmFyY2guc2hhcmVkLT5tc3I7Cit9CiAjZW5kaWYgLyogX19BU01fS1ZNX0JPT0tFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9lNTAwLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2U1MDAuaAppbmRleCA3YTJhNTY1Li5hZGJmY2E5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2U1MDAuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2U1MDAuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogQXV0aG9yOiBZdSBMaXUsIDx5dS5saXVAZnJlZXNjYWxlLmNvbT4KICAqCkBAIC0yOSwxNyArMjksMjUgQEAKIAl1MzIgbWFzNzsKIH07CiAKKyNkZWZpbmUgRTUwMF9UTEJfVkFMSUQgMQorI2RlZmluZSBFNTAwX1RMQl9ESVJUWSAyCisKK3N0cnVjdCB0bGJlX3ByaXYgeworCXBmbl90IHBmbjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7IC8qIEU1MDBfVExCXyogKi8KK307CisKK3N0cnVjdCB2Y3B1X2lkX3RhYmxlOworCiBzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCB7CiAJLyogVW5tb2RpZmllZCBjb3B5IG9mIHRoZSBndWVzdCdzIFRMQi4gKi8KLQlzdHJ1Y3QgdGxiZSAqZ3Vlc3RfdGxiW0U1MDBfVExCX05VTV07Ci0JLyogVExCIHRoYXQncyBhY3R1YWxseSB1c2VkIHdoZW4gdGhlIGd1ZXN0IGlzIHJ1bm5pbmcuICovCi0Jc3RydWN0IHRsYmUgKnNoYWRvd190bGJbRTUwMF9UTEJfTlVNXTsKLQkvKiBQYWdlcyB3aGljaCBhcmUgcmVmZXJlbmNlZCBpbiB0aGUgc2hhZG93IFRMQi4gKi8KLQlzdHJ1Y3QgcGFnZSAqKnNoYWRvd19wYWdlc1tFNTAwX1RMQl9OVU1dOworCXN0cnVjdCB0bGJlICpndGxiX2FyY2hbRTUwMF9UTEJfTlVNXTsKIAotCXVuc2lnbmVkIGludCBndWVzdF90bGJfc2l6ZVtFNTAwX1RMQl9OVU1dOwotCXVuc2lnbmVkIGludCBzaGFkb3dfdGxiX3NpemVbRTUwMF9UTEJfTlVNXTsKLQl1bnNpZ25lZCBpbnQgZ3Vlc3RfdGxiX252W0U1MDBfVExCX05VTV07CisJLyogS1ZNIGludGVybmFsIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGd1ZXN0IFRMQiBlbnRyeSAqLworCXN0cnVjdCB0bGJlX3ByaXYgKmd0bGJfcHJpdltFNTAwX1RMQl9OVU1dOworCisJdW5zaWduZWQgaW50IGd0bGJfc2l6ZVtFNTAwX1RMQl9OVU1dOworCXVuc2lnbmVkIGludCBndGxiX252W0U1MDBfVExCX05VTV07CiAKIAl1MzIgaG9zdF9waWRbRTUwMF9QSURfTlVNXTsKIAl1MzIgcGlkW0U1MDBfUElEX05VTV07CkBAIC01Myw2ICs2MSwxMCBAQAogCXUzMiBtYXM1OwogCXUzMiBtYXM2OwogCXUzMiBtYXM3OworCisJLyogdmNwdSBpZCB0YWJsZSAqLworCXN0cnVjdCB2Y3B1X2lkX3RhYmxlICppZHQ7CisKIAl1MzIgbDFjc3IwOwogCXUzMiBsMWNzcjE7CiAJdTMyIGhpZDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IDE4NmYxNTAuLmNjMjJiMjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0yNSwxNSArMjUsMjMgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bV90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bV9wYXJhLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9rdm1fYXNtLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCi0jZGVmaW5lIEtWTV9NQVhfVkNQVVMgMQorI2RlZmluZSBLVk1fTUFYX1ZDUFVTCQlOUl9DUFVTCisjZGVmaW5lIEtWTV9NQVhfVkNPUkVTCQlOUl9DUFVTCiAjZGVmaW5lIEtWTV9NRU1PUllfU0xPVFMgMzIKIC8qIG1lbW9yeSBzbG90cyB0aGF0IGRvZXMgbm90IGV4cG9zZWQgdG8gdXNlcnNwYWNlICovCiAjZGVmaW5lIEtWTV9QUklWQVRFX01FTV9TTE9UUyA0CiAKKyNpZmRlZiBDT05GSUdfS1ZNX01NSU8KICNkZWZpbmUgS1ZNX0NPQUxFU0NFRF9NTUlPX1BBR0VfT0ZGU0VUIDEKKyNlbmRpZgogCiAvKiBXZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCBsYXJnZSBwYWdlcy4gKi8KICNkZWZpbmUgS1ZNX0hQQUdFX0dGTl9TSElGVCh4KQkwCkBAIC01Nyw2ICs2NSwxMCBAQAogc3RydWN0IGt2bV9ydW47CiBzdHJ1Y3Qga3ZtX3ZjcHU7CiAKK3N0cnVjdCBscHBhY2E7CitzdHJ1Y3Qgc2xiX3NoYWRvdzsKK3N0cnVjdCBkdGw7CisKIHN0cnVjdCBrdm1fdm1fc3RhdCB7CiAJdTMyIHJlbW90ZV90bGJfZmx1c2g7CiB9OwpAQCAtMTMzLDkgKzE0NSw3NCBAQAogCX07CiB9OwogCi1zdHJ1Y3Qga3ZtX2FyY2ggeworc3RydWN0IGt2bXBwY19wZ2luZm8geworCXVuc2lnbmVkIGxvbmcgcGZuOworCWF0b21pY190IHJlZmNudDsKIH07CiAKK3N0cnVjdCBrdm1wcGNfc3BhcHJfdGNlX3RhYmxlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGt2bSAqa3ZtOworCXU2NCBsaW9ibjsKKwl1MzIgd2luZG93X3NpemU7CisJc3RydWN0IHBhZ2UgKnBhZ2VzWzBdOworfTsKKworc3RydWN0IGt2bXBwY19ybWFfaW5mbyB7CisJdm9pZAkJKmJhc2VfdmlydDsKKwl1bnNpZ25lZCBsb25nCSBiYXNlX3BmbjsKKwl1bnNpZ25lZCBsb25nCSBucGFnZXM7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWF0b21pY190IAkgdXNlX2NvdW50OworfTsKKworc3RydWN0IGt2bV9hcmNoIHsKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IVgorCXVuc2lnbmVkIGxvbmcgaHB0X3ZpcnQ7CisJdW5zaWduZWQgbG9uZyByYW1fbnBhZ2VzOworCXVuc2lnbmVkIGxvbmcgcmFtX3BzaXplOworCXVuc2lnbmVkIGxvbmcgcmFtX3BvcmRlcjsKKwlzdHJ1Y3Qga3ZtcHBjX3BnaW5mbyAqcmFtX3BnaW5mbzsKKwl1bnNpZ25lZCBpbnQgbHBpZDsKKwl1bnNpZ25lZCBpbnQgaG9zdF9scGlkOworCXVuc2lnbmVkIGxvbmcgaG9zdF9scGNyOworCXVuc2lnbmVkIGxvbmcgc2RyMTsKKwl1bnNpZ25lZCBsb25nIGhvc3Rfc2RyMTsKKwlpbnQgdGxiaWVfbG9jazsKKwlpbnQgbl9ybWFfcGFnZXM7CisJdW5zaWduZWQgbG9uZyBscGNyOworCXVuc2lnbmVkIGxvbmcgcm1vcjsKKwlzdHJ1Y3Qga3ZtcHBjX3JtYV9pbmZvICpybWE7CisJc3RydWN0IGxpc3RfaGVhZCBzcGFwcl90Y2VfdGFibGVzOworCXVuc2lnbmVkIHNob3J0IGxhc3RfdmNwdVtOUl9DUFVTXTsKKwlzdHJ1Y3Qga3ZtcHBjX3Zjb3JlICp2Y29yZXNbS1ZNX01BWF9WQ09SRVNdOworI2VuZGlmIC8qIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWICovCit9OworCisvKgorICogU3RydWN0IGZvciBhIHZpcnR1YWwgY29yZS4KKyAqIE5vdGU6IGVudHJ5X2V4aXRfY291bnQgY29tYmluZXMgYW4gZW50cnkgY291bnQgaW4gdGhlIGJvdHRvbSA4IGJpdHMKKyAqIGFuZCBhbiBleGl0IGNvdW50IGluIHRoZSBuZXh0IDggYml0cy4gIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4KKyAqIGF0b21pY2FsbHkgaW5jcmVtZW50IHRoZSBlbnRyeSBjb3VudCBpZmYgdGhlIGV4aXQgY291bnQgaXMgMAorICogd2l0aG91dCB0YWtpbmcgdGhlIGxvY2suCisgKi8KK3N0cnVjdCBrdm1wcGNfdmNvcmUgeworCWludCBuX3J1bm5hYmxlOworCWludCBuX2Jsb2NrZWQ7CisJaW50IG51bV90aHJlYWRzOworCWludCBlbnRyeV9leGl0X2NvdW50OworCWludCBuX3dva2VuOworCWludCBuYXBfY291bnQ7CisJdTE2IHBjcHU7CisJdTggdmNvcmVfcnVubmluZzsKKwl1OCBpbl9ndWVzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJ1bm5hYmxlX3RocmVhZHM7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworI2RlZmluZSBWQ09SRV9FTlRSWV9DT1VOVCh2YykJKCh2YyktPmVudHJ5X2V4aXRfY291bnQgJiAweGZmKQorI2RlZmluZSBWQ09SRV9FWElUX0NPVU5UKHZjKQkoKHZjKS0+ZW50cnlfZXhpdF9jb3VudCA+PiA4KQorCiBzdHJ1Y3Qga3ZtcHBjX3B0ZSB7CiAJdWxvbmcgZWFkZHI7CiAJdTY0IHZwYWdlOwpAQCAtMTYzLDE2ICsyNDAsMTggQEAKIAlib29sICgqaXNfZGNiejMyKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogfTsKIAotc3RydWN0IGhwdGVfY2FjaGUgewotCXN0cnVjdCBobGlzdF9ub2RlIGxpc3RfcHRlOwotCXN0cnVjdCBobGlzdF9ub2RlIGxpc3RfcHRlX2xvbmc7Ci0Jc3RydWN0IGhsaXN0X25vZGUgbGlzdF92cHRlOwotCXN0cnVjdCBobGlzdF9ub2RlIGxpc3RfdnB0ZV9sb25nOwotCXN0cnVjdCByY3VfaGVhZCByY3VfaGVhZDsKLQl1NjQgaG9zdF92YTsKLQl1NjQgcGZuOwotCXVsb25nIHNsb3Q7Ci0Jc3RydWN0IGt2bXBwY19wdGUgcHRlOworc3RydWN0IGt2bXBwY19zbGIgeworCXU2NCBlc2lkOworCXU2NCB2c2lkOworCXU2NCBvcmlnZTsKKwl1NjQgb3JpZ3Y7CisJYm9vbCB2YWxpZAk6IDE7CisJYm9vbCBLcwkJOiAxOworCWJvb2wgS3AJCTogMTsKKwlib29sIG54CQk6IDE7CisJYm9vbCBsYXJnZQk6IDE7CS8qIFBURXMgYXJlIDE2TUIgKi8KKwlib29sIHRiCQk6IDE7CS8qIDFUQiBzZWdtZW50ICovCisJYm9vbCBjbGFzcwk6IDE7CiB9OwogCiBzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCB7CkBAIC0xODcsNiArMjY2LDkgQEAKIAl1bG9uZyBoaWdobWVtX2hhbmRsZXI7CiAJdWxvbmcgcm1jYWxsOwogCXVsb25nIGhvc3RfcGFjYV9waHlzOworCXN0cnVjdCBrdm1wcGNfc2xiIHNsYls2NF07CisJaW50IHNsYl9tYXg7CQkvKiAxICsgaW5kZXggb2YgbGFzdCB2YWxpZCBlbnRyeSBpbiBzbGJbXSAqLworCWludCBzbGJfbnI7CQkvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiBTTEIgKi8KIAlzdHJ1Y3Qga3ZtcHBjX21tdSBtbXU7CiAjZW5kaWYKIApAQCAtMTk1LDEzICsyNzcsMTkgQEAKIAl1NjQgZnByWzMyXTsKIAl1NjQgZnBzY3I7CiAKKyNpZmRlZiBDT05GSUdfU1BFCisJdWxvbmcgZXZyWzMyXTsKKwl1bG9uZyBzcGVmc2NyOworCXVsb25nIGhvc3Rfc3BlZnNjcjsKKwl1NjQgYWNjOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIAl2ZWN0b3IxMjggdnJbMzJdOwogCXZlY3RvcjEyOCB2c2NyOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVlNYCi0JdTY0IHZzclszMl07CisJdTY0IHZzcls2NF07CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUENfQk9PSzNTCkBAIC0yMDksMjIgKzI5NywyNyBAQAogCXUzMiBxcHJbMzJdOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQk9PS0UKIAl1bG9uZyBwYzsKIAl1bG9uZyBjdHI7CiAJdWxvbmcgbHI7CiAKIAl1bG9uZyB4ZXI7CiAJdTMyIGNyOwotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUFBDX0JPT0szUwotCXVsb25nIHNoYWRvd19tc3I7CiAJdWxvbmcgaGZsYWdzOwogCXVsb25nIGd1ZXN0X293bmVkX2V4dDsKKwl1bG9uZyBwdXJyOworCXVsb25nIHNwdXJyOworCXVsb25nIGRzY3I7CisJdWxvbmcgYW1yOworCXVsb25nIHVhbW9yOworCXUzMiBjdHJsOworCXVsb25nIGRhYnI7CiAjZW5kaWYKIAl1MzIgdnJzYXZlOyAvKiBhbHNvIFVTUFJHMCAqLwogCXUzMiBtbXVjcjsKKwl1bG9uZyBzaGFkb3dfbXNyOwogCXVsb25nIHNwcmc0OwogCXVsb25nIHNwcmc1OwogCXVsb25nIHNwcmc2OwpAQCAtMjQ5LDYgKzM0Miw3IEBACiAJdTMyIHB2cjsKIAogCXUzMiBzaGFkb3dfcGlkOworCXUzMiBzaGFkb3dfcGlkMTsKIAl1MzIgcGlkOwogCXUzMiBzd2FwX3BpZDsKIApAQCAtMjU4LDYgKzM1Miw5IEBACiAJdTMyIGRiY3IxOwogCXUzMiBkYnNyOwogCisJdTY0IG1tY3JbM107CisJdTMyIHBtY1s4XTsKKwogI2lmZGVmIENPTkZJR19LVk1fRVhJVF9USU1JTkcKIAlzdHJ1Y3QgbXV0ZXggZXhpdF90aW1pbmdfbG9jazsKIAlzdHJ1Y3Qga3ZtcHBjX2V4aXRfdGltaW5nIHRpbWluZ19leGl0OwpAQCAtMjcyLDggKzM2OSwxMiBAQAogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZXhpdF90aW1pbmc7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUENfQk9PSzNTCisJdWxvbmcgZmF1bHRfZGFyOworCXUzMiBmYXVsdF9kc2lzcjsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0JPT0tFCi0JdTMyIGxhc3RfaW5zdDsKIAl1bG9uZyBmYXVsdF9kZWFyOwogCXVsb25nIGZhdWx0X2VzcjsKIAl1bG9uZyBxdWV1ZWRfZGVhcjsKQEAgLTI4OCwyNSArMzg5LDQ3IEBACiAJdTggZGNyX2lzX3dyaXRlOwogCXU4IG9zaV9uZWVkZWQ7CiAJdTggb3NpX2VuYWJsZWQ7CisJdTggaGNhbGxfbmVlZGVkOwogCiAJdTMyIGNwcjBfY2ZnYWRkcjsgLyogaG9sZHMgdGhlIGxhc3Qgc2V0IGNwcjBfY2ZnYWRkciAqLwogCiAJc3RydWN0IGhydGltZXIgZGVjX3RpbWVyOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OwogCXU2NCBkZWNfamlmZmllczsKKwl1NjQgZGVjX2V4cGlyZXM7CiAJdW5zaWduZWQgbG9uZyBwZW5kaW5nX2V4Y2VwdGlvbnM7CisJdTE2IGxhc3RfY3B1OworCXU4IGNlZGVkOworCXU4IHByb2RkZWQ7CisJdTMyIGxhc3RfaW5zdDsKKworCXN0cnVjdCBscHBhY2EgKnZwYTsKKwlzdHJ1Y3Qgc2xiX3NoYWRvdyAqc2xiX3NoYWRvdzsKKwlzdHJ1Y3QgZHRsICpkdGw7CisJc3RydWN0IGR0bCAqZHRsX2VuZDsKKworCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjb3JlOworCWludCByZXQ7CisJaW50IHRyYXA7CisJaW50IHN0YXRlOworCWludCBwdGlkOworCXdhaXRfcXVldWVfaGVhZF90IGNwdV9ydW47CisKIAlzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaF9zaGFyZWQgKnNoYXJlZDsKIAl1bnNpZ25lZCBsb25nIG1hZ2ljX3BhZ2VfcGE7IC8qIHBoeXMgYWRkciB0byBtYXAgdGhlIG1hZ2ljIHBhZ2UgdG8gKi8KIAl1bnNpZ25lZCBsb25nIG1hZ2ljX3BhZ2VfZWE7IC8qIGVmZmVjdC4gYWRkciB0byBtYXAgdGhlIG1hZ2ljIHBhZ2UgdG8gKi8KIAotI2lmZGVmIENPTkZJR19QUENfQk9PSzNTCi0Jc3RydWN0IGhsaXN0X2hlYWQgaHB0ZV9oYXNoX3B0ZVtIUFRFR19IQVNIX05VTV9QVEVdOwotCXN0cnVjdCBobGlzdF9oZWFkIGhwdGVfaGFzaF9wdGVfbG9uZ1tIUFRFR19IQVNIX05VTV9QVEVfTE9OR107Ci0Jc3RydWN0IGhsaXN0X2hlYWQgaHB0ZV9oYXNoX3ZwdGVbSFBURUdfSEFTSF9OVU1fVlBURV07Ci0Jc3RydWN0IGhsaXN0X2hlYWQgaHB0ZV9oYXNoX3ZwdGVfbG9uZ1tIUFRFR19IQVNIX05VTV9WUFRFX0xPTkddOwotCWludCBocHRlX2NhY2hlX2NvdW50OwotCXNwaW5sb2NrX3QgbW11X2xvY2s7CisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSFYKKwlzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaF9zaGFyZWQgc2hyZWdzOworCisJc3RydWN0IGxpc3RfaGVhZCBydW5fbGlzdDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJ1bl90YXNrOworCXN0cnVjdCBrdm1fcnVuICprdm1fcnVuOwogI2VuZGlmCiB9OwogCisjZGVmaW5lIEtWTVBQQ19WQ1BVX0JVU1lfSU5fSE9TVAkwCisjZGVmaW5lIEtWTVBQQ19WQ1BVX0JMT0NLRUQJCTEKKyNkZWZpbmUgS1ZNUFBDX1ZDUFVfUlVOTkFCTEUJCTIKKwogI2VuZGlmIC8qIF9fUE9XRVJQQ19LVk1fSE9TVF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fcHBjLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BwYy5oCmluZGV4IDkzNDUyMzguLmQxMjFmNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fcHBjLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wcGMuaApAQCAtMzMsNiArMzMsOSBAQAogI2Vsc2UKICNpbmNsdWRlIDxhc20va3ZtX2Jvb2tlLmg+CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSCisjaW5jbHVkZSA8YXNtL3BhY2EuaD4KKyNlbmRpZgogCiBlbnVtIGVtdWxhdGlvbl9yZXN1bHQgewogCUVNVUxBVEVfRE9ORSwgICAgICAgICAvKiBubyBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KQEAgLTQyLDYgKzQ1LDcgQEAKIAlFTVVMQVRFX0FHQUlOLCAgICAgICAgLyogc29tZXRoaW5nIHdlbnQgd3JvbmcuIGdvIGFnYWluICovCiB9OwogCitleHRlcm4gaW50IGt2bXBwY192Y3B1X3J1bihzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGV4dGVybiBpbnQgX19rdm1wcGNfdmNwdV9ydW4oc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBleHRlcm4gY2hhciBrdm1wcGNfaGFuZGxlcnNfc3RhcnRbXTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGt2bXBwY19oYW5kbGVyX2xlbjsKQEAgLTEwOSw2ICsxMTMsMjcgQEAKIAogZXh0ZXJuIHZvaWQga3ZtcHBjX2NvcmVfZGVzdHJveV9tbXUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGV4dGVybiBpbnQga3ZtcHBjX2t2bV9wdihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworZXh0ZXJuIHZvaWQga3ZtcHBjX21hcF9tYWdpYyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCitleHRlcm4gbG9uZyBrdm1wcGNfYWxsb2NfaHB0KHN0cnVjdCBrdm0gKmt2bSk7CitleHRlcm4gdm9pZCBrdm1wcGNfZnJlZV9ocHQoc3RydWN0IGt2bSAqa3ZtKTsKK2V4dGVybiBsb25nIGt2bXBwY19wcmVwYXJlX3ZybWEoc3RydWN0IGt2bSAqa3ZtLAorCQkJCXN0cnVjdCBrdm1fdXNlcnNwYWNlX21lbW9yeV9yZWdpb24gKm1lbSk7CitleHRlcm4gdm9pZCBrdm1wcGNfbWFwX3ZybWEoc3RydWN0IGt2bSAqa3ZtLAorCQkJICAgIHN0cnVjdCBrdm1fdXNlcnNwYWNlX21lbW9yeV9yZWdpb24gKm1lbSk7CitleHRlcm4gaW50IGt2bXBwY19wc2VyaWVzX2RvX2hjYWxsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CitleHRlcm4gbG9uZyBrdm1fdm1faW9jdGxfY3JlYXRlX3NwYXByX3RjZShzdHJ1Y3Qga3ZtICprdm0sCisJCQkJc3RydWN0IGt2bV9jcmVhdGVfc3BhcHJfdGNlICphcmdzKTsKK2V4dGVybiBsb25nIGt2bV92bV9pb2N0bF9hbGxvY2F0ZV9ybWEoc3RydWN0IGt2bSAqa3ZtLAorCQkJCXN0cnVjdCBrdm1fYWxsb2NhdGVfcm1hICpybWEpOworZXh0ZXJuIHN0cnVjdCBrdm1wcGNfcm1hX2luZm8gKmt2bV9hbGxvY19ybWEodm9pZCk7CitleHRlcm4gdm9pZCBrdm1fcmVsZWFzZV9ybWEoc3RydWN0IGt2bXBwY19ybWFfaW5mbyAqcmkpOworZXh0ZXJuIGludCBrdm1wcGNfY29yZV9pbml0X3ZtKHN0cnVjdCBrdm0gKmt2bSk7CitleHRlcm4gdm9pZCBrdm1wcGNfY29yZV9kZXN0cm95X3ZtKHN0cnVjdCBrdm0gKmt2bSk7CitleHRlcm4gaW50IGt2bXBwY19jb3JlX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sCisJCQkJc3RydWN0IGt2bV91c2Vyc3BhY2VfbWVtb3J5X3JlZ2lvbiAqbWVtKTsKK2V4dGVybiB2b2lkIGt2bXBwY19jb3JlX2NvbW1pdF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQlzdHJ1Y3Qga3ZtX3VzZXJzcGFjZV9tZW1vcnlfcmVnaW9uICptZW0pOwogCiAvKgogICogQ3V0cyBvdXQgaW5zdCBiaXRzIHdpdGggb3JkZXJpbmcgYWNjb3JkaW5nIHRvIHNwZWMuCkBAIC0xNTEsNCArMTc2LDIwIEBACiAKIHZvaWQga3ZtcHBjX3NldF9waWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgcGlkKTsKIAorI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX3NldF94aWNzX3BoeXMoaW50IGNwdSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXBhY2FbY3B1XS5rdm1faHN0YXRlLnhpY3NfcGh5cyA9IGFkZHI7Cit9CisKK2V4dGVybiB2b2lkIGt2bV9ybWFfaW5pdCh2b2lkKTsKKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1wcGNfc2V0X3hpY3NfcGh5cyhpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGFkZHIpCit7fQorCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3JtYV9pbml0KHZvaWQpCit7fQorI2VuZGlmCisKICNlbmRpZiAvKiBfX1BPV0VSUENfS1ZNX1BQQ19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNpby5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2lvLmgKaW5kZXggN2FiODJjOC4uMjdhZjdmOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2lvLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2lvLmgKQEAgLTc2LDcgKzc2LDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZkZXYtPnJlc291cmNlW3Jlc291cmNlX25vXTsKIAlpZiAocmVzLT5zdGFydCA9PSAwIHx8IHJlcy0+ZW5kID09IDAgfHwgcmVzLT5lbmQgPCByZXMtPnN0YXJ0KQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlyZXR1cm4gcmVzb3VyY2Vfc2l6ZShyZXMpOwogfQogCiBleHRlcm4gaW50IG1hY2lvX2VuYWJsZV9kZXZyZXMoc3RydWN0IG1hY2lvX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtaGFzaDY0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWhhc2g2NC5oCmluZGV4IGQ4NjViZDkuLmI0NDVlMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtaGFzaDY0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1oYXNoNjQuaApAQCAtOTAsMTMgKzkwLDE5IEBACiAKICNkZWZpbmUgSFBURV9SX1BQMAkJQVNNX0NPTlNUKDB4ODAwMDAwMDAwMDAwMDAwMCkKICNkZWZpbmUgSFBURV9SX1RTCQlBU01fQ09OU1QoMHg0MDAwMDAwMDAwMDAwMDAwKQorI2RlZmluZSBIUFRFX1JfS0VZX0hJCQlBU01fQ09OU1QoMHgzMDAwMDAwMDAwMDAwMDAwKQogI2RlZmluZSBIUFRFX1JfUlBOX1NISUZUCTEyCi0jZGVmaW5lIEhQVEVfUl9SUE4JCUFTTV9DT05TVCgweDNmZmZmZmZmZmZmZmYwMDApCi0jZGVmaW5lIEhQVEVfUl9GTEFHUwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDNmZikKKyNkZWZpbmUgSFBURV9SX1JQTgkJQVNNX0NPTlNUKDB4MGZmZmZmZmZmZmZmZjAwMCkKICNkZWZpbmUgSFBURV9SX1BQCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAzKQogI2RlZmluZSBIUFRFX1JfTgkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwNCkKKyNkZWZpbmUgSFBURV9SX0cJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDgpCisjZGVmaW5lIEhQVEVfUl9NCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDEwKQorI2RlZmluZSBIUFRFX1JfSQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAyMCkKKyNkZWZpbmUgSFBURV9SX1cJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwNDApCisjZGVmaW5lIEhQVEVfUl9XSU1HCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDc4KQogI2RlZmluZSBIUFRFX1JfQwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDA4MCkKICNkZWZpbmUgSFBURV9SX1IJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAxMDApCisjZGVmaW5lIEhQVEVfUl9LRVlfTE8JCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDBlMDApCiAKICNkZWZpbmUgSFBURV9WXzFUQl9TRUcJCUFTTV9DT05TVCgweDQwMDAwMDAwMDAwMDAwMDApCiAjZGVmaW5lIEhQVEVfVl9WUk1BX01BU0sJQVNNX0NPTlNUKDB4NDAwMWZmZmZmZjAwMDAwMCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUuaAppbmRleCA0MTM4YjIxLi42OThiMzA2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS5oCkBAIC0xMTUsMTQgKzExNSwyNCBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KIAorI2lmZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQorI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KK0RFQ0xBUkVfUEVSX0NQVShpbnQsIG5leHRfdGxiY2FtX2lkeCk7CisjZW5kaWYKKwogc3RhdGljIGlubGluZSBpbnQgbW11X2hhc19mZWF0dXJlKHVuc2lnbmVkIGxvbmcgZmVhdHVyZSkKIHsKIAlyZXR1cm4gKGN1cl9jcHVfc3BlYy0+bW11X2ZlYXR1cmVzICYgZmVhdHVyZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbXVfY2xlYXJfZmVhdHVyZSh1bnNpZ25lZCBsb25nIGZlYXR1cmUpCit7CisJY3VyX2NwdV9zcGVjLT5tbXVfZmVhdHVyZXMgJj0gfmZlYXR1cmU7Cit9CisKIGV4dGVybiB1bnNpZ25lZCBpbnQgX19zdGFydF9fX21tdV9mdHJfZml4dXAsIF9fc3RvcF9fX21tdV9mdHJfZml4dXA7CiAKLS8qIE1NVSBpbml0aWFsaXphdGlvbiAoNjQtYml0IG9ubHkgZm8gbm93KSAqLworLyogTU1VIGluaXRpYWxpemF0aW9uICovCiBleHRlcm4gdm9pZCBlYXJseV9pbml0X21tdSh2b2lkKTsKIGV4dGVybiB2b2lkIGVhcmx5X2luaXRfbW11X3NlY29uZGFyeSh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tem9uZS5oCmluZGV4IGZkM2ZkNTguLjdiNTg5MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXpvbmUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW16b25lLmgKQEAgLTM4LDEzICszOCw2IEBACiAjZGVmaW5lIG1lbW9yeV9ob3RwbHVnX21heCgpIG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkKICNlbmRpZgogCi0vKgotICogRm9sbG93aW5nIGFyZSBtYWNyb3MgdGhhdCBlYWNoIG51bWEgaW1wbG1lbnRhdGlvbiBtdXN0IGRlZmluZS4KLSAqLwotCi0jZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKLSNkZWZpbmUgbm9kZV9lbmRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX2VuZF9wZm4pCi0KICNlbHNlCiAjZGVmaW5lIG1lbW9yeV9ob3RwbHVnX21heCgpIG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkKICNlbmRpZiAvKiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BTZXJpZXNfcmVjb25maWcuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wU2VyaWVzX3JlY29uZmlnLmgKaW5kZXggODlkMmY5OS4uMjNjZDZjYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BTZXJpZXNfcmVjb25maWcuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcFNlcmllc19yZWNvbmZpZy5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCiBleHRlcm4gaW50IHBTZXJpZXNfcmVjb25maWdfbm90aWZpZXJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgcFNlcmllc19yZWNvbmZpZ19ub3RpZmllcl91bnJlZ2lzdGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqKTsKLWV4dGVybiBzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBwU2VyaWVzX3JlY29uZmlnX2NoYWluOworZXh0ZXJuIGludCBwU2VyaWVzX3JlY29uZmlnX25vdGlmeSh1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqcCk7CiAvKiBOb3QgdGhlIGJlc3QgcGxhY2UgdG8gcHV0IHRoaXMsIHdpbGwgYmUgZml4ZWQgd2hlbiB3ZSBtb3ZlIHNvbWUKICAqIG9mIHRoZSBydGFzIHN1c3BlbmQtbWUgc3R1ZmYgdG8gcHNlcmllcyAqLwogZXh0ZXJuIHZvaWQgcFNlcmllc19jb2FsZXNjZV9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKaW5kZXggNzQxMjY3Ni4uNTE2YmZiMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCkBAIC0xMDMsMTEgKzEwMywxMiBAQAogI2VuZGlmIC8qIENPTkZJR19QUENfU1REX01NVV82NCAqLwogCiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKLQlwZ2RfdCAqcGdkOwkJCS8qIEN1cnJlbnQgUEdEICovCi0JcGdkX3QgKmtlcm5lbF9wZ2Q7CQkvKiBLZXJuZWwgUEdEICovCiAJdTY0IGV4Z2VuWzhdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMHg4MCkpKTsKKwkvKiBLZWVwIHBnZCBpbiB0aGUgc2FtZSBjYWNoZWxpbmUgYXMgdGhlIHN0YXJ0IG9mIGV4dGxiICovCisJcGdkX3QgKnBnZCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDB4ODApKSk7IC8qIEN1cnJlbnQgUEdEICovCisJcGdkX3QgKmtlcm5lbF9wZ2Q7CQkvKiBLZXJuZWwgUEdEICovCiAJLyogV2UgY2FuIGhhdmUgdXAgdG8gMyBsZXZlbHMgb2YgcmVlbnRyYW5jeSBpbiB0aGUgVExCIG1pc3MgaGFuZGxlciAqLwotCXU2NCBleHRsYlszXVtFWF9UTEJfU0laRSAvIHNpemVvZih1NjQpXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDB4ODApKSk7CisJdTY0IGV4dGxiWzNdW0VYX1RMQl9TSVpFIC8gc2l6ZW9mKHU2NCldOwogCXU2NCBleG1jWzhdOwkJLyogdXNlZCBmb3IgbWFjaGluZSBjaGVja3MgKi8KIAl1NjQgZXhjcml0WzhdOwkJLyogdXNlZCBmb3IgY3JpdCBpbnRlcnJ1cHRzICovCiAJdTY0IGV4ZGJnWzhdOwkJLyogdXNlZCBmb3IgZGVidWcgaW50ZXJydXB0cyAqLwpAQCAtMTQ3LDkgKzE0OCwxMiBAQAogCXN0cnVjdCBkdGxfZW50cnkgKmR0bF9jdXJyOwkvKiBwb2ludGVyIGNvcnJlc3BvbmRpbmcgdG8gZHRsX3JpZHggKi8KIAogI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTX0hBTkRMRVIKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19QUgogCS8qIFdlIHVzZSB0aGlzIHRvIHN0b3JlIGd1ZXN0IHN0YXRlIGluICovCiAJc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUgc2hhZG93X3ZjcHU7CiAjZW5kaWYKKwlzdHJ1Y3Qga3ZtcHBjX2hvc3Rfc3RhdGUga3ZtX2hzdGF0ZTsKKyNlbmRpZgogfTsKIAogZXh0ZXJuIHN0cnVjdCBwYWNhX3N0cnVjdCAqcGFjYTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLWJyaWRnZS5oCmluZGV4IGI5MGRiZjguLjkwYmQzZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaApAQCAtMTcxLDE1ICsxNzEsOSBAQAogCiAjaWZuZGVmIENPTkZJR19QUEM2NAogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpX2J1c190b19PRl9ub2RlKHN0cnVjdCBwY2lfYnVzICpidXMpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3N0OwotCi0JaWYgKGJ1cy0+c2VsZikKLQkJcmV0dXJuIHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShidXMtPnNlbGYpOwotCWhvc3QgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKLQlyZXR1cm4gaG9zdCA/IGhvc3QtPmRuIDogTlVMTDsKLX0KK2V4dGVybiBpbnQgcGNpX2RldmljZV9mcm9tX09GX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSAgIHU4ICpidXMsIHU4ICpkZXZmbik7CitleHRlcm4gdm9pZCBwY2lfY3JlYXRlX09GX2J1c19tYXAodm9pZCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlzYV92YWRkcl9pc19pb3BvcnQodm9pZCBfX2lvbWVtICphZGRyZXNzKQogewpAQCAtMjIzLDE3ICsyMTcsOCBAQAogLyogR2V0IHRoZSBwb2ludGVyIHRvIGEgZGV2aWNlX25vZGUncyBwY2lfZG4gKi8KICNkZWZpbmUgUENJX0ROKGRuKQkoKHN0cnVjdCBwY2lfZG4gKikgKGRuKS0+ZGF0YSkKIAotZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZmV0Y2hfZGV2X2RuKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgKiB1cGRhdGVfZG5fcGNpX2luZm8oc3RydWN0IGRldmljZV9ub2RlICpkbiwgdm9pZCAqZGF0YSk7CiAKLS8qIEdldCBhIGRldmljZV9ub2RlIGZyb20gYSBwY2lfZGV2LiAgVGhpcyBjb2RlIG11c3QgYmUgZmFzdCBleGNlcHQKLSAqIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBzeXNkYXRhIGlzIGluY29ycmVjdCBhbmQgbmVlZHMgdG8gYmUgZml4ZWQKLSAqIHVwICh0aGlzIHdpbGwgb25seSBoYXBwZW4gb25jZSkuICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpX2RldmljZV90b19PRl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JcmV0dXJuIGRldi0+ZGV2Lm9mX25vZGUgPyBkZXYtPmRldi5vZl9ub2RlIDogZmV0Y2hfZGV2X2RuKGRldik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9kZXZpY2VfZnJvbV9PRl9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkJCSAgdTggKmJ1cywgdTggKmRldmZuKQogewpAQCAtMjQ0LDE0ICsyMjksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpX2J1c190b19PRl9ub2RlKHN0cnVjdCBwY2lfYnVzICpidXMpCi17Ci0JaWYgKGJ1cy0+c2VsZikKLQkJcmV0dXJuIHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShidXMtPnNlbGYpOwotCWVsc2UKLQkJcmV0dXJuIGJ1cy0+ZGV2Lm9mX25vZGU7IC8qIE11c3QgYmUgcm9vdCBidXMgKFBIQikgKi8KLX0KLQogLyoqIEZpbmQgdGhlIGJ1cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRpY2F0ZWQgZGV2aWNlIG5vZGUgKi8KIGV4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqcGNpYmlvc19maW5kX3BjaV9idXMoc3RydWN0IGRldmljZV9ub2RlICpkbik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2kuaAppbmRleCA3ZDc3OTA5Li4xZjUyMjY4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BjaS5oCkBAIC0xNzksOCArMTc5LDcgQEAKIGV4dGVybiBzdHJ1Y3QgcGNpX2RldiAqb2ZfY3JlYXRlX3BjaV9kZXYoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQkJCQlzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgZGV2Zm4pOwogCi1leHRlcm4gdm9pZCBvZl9zY2FuX3BjaV9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAotCQkJCXN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgb2Zfc2Nhbl9wY2lfYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCiBleHRlcm4gdm9pZCBvZl9zY2FuX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBwY2lfYnVzICpidXMpOwogZXh0ZXJuIHZvaWQgb2ZfcmVzY2FuX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBwY2lfYnVzICpidXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUtcHBjNjQuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLXBwYzY0LmgKaW5kZXggODE1NzZlZS4uYzQyMDU2MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUtcHBjNjQuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGd0YWJsZS1wcGM2NC5oCkBAIC0zNTcsNyArMzU3LDggQEAKIC8qCiAgKiBmaW5kX2xpbnV4X3B0ZSByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIGEgbGludXggcHRlIGZvciBhIGdpdmVuCiAgKiBlZmZlY3RpdmUgYWRkcmVzcyBhbmQgZGlyZWN0b3J5LiAgSWYgbm90IGZvdW5kLCBpdCByZXR1cm5zIHplcm8uCi0gKi9zdGF0aWMgaW5saW5lIHB0ZV90ICpmaW5kX2xpbnV4X3B0ZShwZ2RfdCAqcGdkaXIsIHVuc2lnbmVkIGxvbmcgZWEpCisgKi8KK3N0YXRpYyBpbmxpbmUgcHRlX3QgKmZpbmRfbGludXhfcHRlKHBnZF90ICpwZ2RpciwgdW5zaWduZWQgbG9uZyBlYSkKIHsKIAlwZ2RfdCAqcGc7CiAJcHVkX3QgKnB1OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwYy1vcGNvZGUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGMtb3Bjb2RlLmgKaW5kZXggZTQ3MjY1OS4uZTk4MGZhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwYy1vcGNvZGUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjLW9wY29kZS5oCkBAIC03MSw2ICs3MSw0MiBAQAogI2RlZmluZSBQUENfSU5TVF9FUkFUU1gJCQkweDdjMDAwMTI2CiAjZGVmaW5lIFBQQ19JTlNUX0VSQVRTWF9ET1QJCTB4N2MwMDAxMjcKIAorLyogTWlzYyBpbnN0cnVjdGlvbnMgZm9yIEJQRiBjb21waWxlciAqLworI2RlZmluZSBQUENfSU5TVF9MRAkJCTB4ZTgwMDAwMDAKKyNkZWZpbmUgUFBDX0lOU1RfTEhaCQkJMHhhMDAwMDAwMAorI2RlZmluZSBQUENfSU5TVF9MV1oJCQkweDgwMDAwMDAwCisjZGVmaW5lIFBQQ19JTlNUX1NURAkJCTB4ZjgwMDAwMDAKKyNkZWZpbmUgUFBDX0lOU1RfU1REVQkJCTB4ZjgwMDAwMDEKKyNkZWZpbmUgUFBDX0lOU1RfTUZMUgkJCTB4N2MwODAyYTYKKyNkZWZpbmUgUFBDX0lOU1RfTVRMUgkJCTB4N2MwODAzYTYKKyNkZWZpbmUgUFBDX0lOU1RfQ01QV0kJCQkweDJjMDAwMDAwCisjZGVmaW5lIFBQQ19JTlNUX0NNUERJCQkJMHgyYzIwMDAwMAorI2RlZmluZSBQUENfSU5TVF9DTVBMVwkJCTB4N2MwMDAwNDAKKyNkZWZpbmUgUFBDX0lOU1RfQ01QTFdJCQkJMHgyODAwMDAwMAorI2RlZmluZSBQUENfSU5TVF9BRERJCQkJMHgzODAwMDAwMAorI2RlZmluZSBQUENfSU5TVF9BRERJUwkJCTB4M2MwMDAwMDAKKyNkZWZpbmUgUFBDX0lOU1RfQURECQkJMHg3YzAwMDIxNAorI2RlZmluZSBQUENfSU5TVF9TVUIJCQkweDdjMDAwMDUwCisjZGVmaW5lIFBQQ19JTlNUX0JMUgkJCTB4NGU4MDAwMjAKKyNkZWZpbmUgUFBDX0lOU1RfQkxSTAkJCTB4NGU4MDAwMjEKKyNkZWZpbmUgUFBDX0lOU1RfTVVMTFcJCQkweDdjMDAwMWQ2CisjZGVmaW5lIFBQQ19JTlNUX01VTEhXVQkJCTB4N2MwMDAwMTYKKyNkZWZpbmUgUFBDX0lOU1RfTVVMTEkJCQkweDFjMDAwMDAwCisjZGVmaW5lIFBQQ19JTlNUX0RJVldVCQkJMHg3YzAwMDNkNgorI2RlZmluZSBQUENfSU5TVF9STFdJTk0JCQkweDU0MDAwMDAwCisjZGVmaW5lIFBQQ19JTlNUX1JMRElDUgkJCTB4NzgwMDAwMDQKKyNkZWZpbmUgUFBDX0lOU1RfU0xXCQkJMHg3YzAwMDAzMAorI2RlZmluZSBQUENfSU5TVF9TUlcJCQkweDdjMDAwNDMwCisjZGVmaW5lIFBQQ19JTlNUX0FORAkJCTB4N2MwMDAwMzgKKyNkZWZpbmUgUFBDX0lOU1RfQU5ERE9UCQkJMHg3YzAwMDAzOQorI2RlZmluZSBQUENfSU5TVF9PUgkJCTB4N2MwMDAzNzgKKyNkZWZpbmUgUFBDX0lOU1RfQU5ESQkJCTB4NzAwMDAwMDAKKyNkZWZpbmUgUFBDX0lOU1RfT1JJCQkJMHg2MDAwMDAwMAorI2RlZmluZSBQUENfSU5TVF9PUklTCQkJMHg2NDAwMDAwMAorI2RlZmluZSBQUENfSU5TVF9ORUcJCQkweDdjMDAwMGQwCisjZGVmaW5lIFBQQ19JTlNUX0JSQU5DSAkJCTB4NDgwMDAwMDAKKyNkZWZpbmUgUFBDX0lOU1RfQlJBTkNIX0NPTkQJCTB4NDA4MDAwMDAKKwogLyogbWFjcm9zIHRvIGluc2VydCBmaWVsZHMgaW50byBvcGNvZGVzICovCiAjZGVmaW5lIF9fUFBDX1JBKGEpCSgoKGEpICYgMHgxZikgPDwgMTYpCiAjZGVmaW5lIF9fUFBDX1JCKGIpCSgoKGIpICYgMHgxZikgPDwgMTEpCkBAIC04Myw2ICsxMTksMTAgQEAKICNkZWZpbmUgX19QUENfVF9UTEIodCkJKCgodCkgJiAweDMpIDw8IDIxKQogI2RlZmluZSBfX1BQQ19XQyh3KQkoKCh3KSAmIDB4MykgPDwgMjEpCiAjZGVmaW5lIF9fUFBDX1dTKHcpCSgoKHcpICYgMHgxZikgPDwgMTEpCisjZGVmaW5lIF9fUFBDX1NIKHMpCV9fUFBDX1dTKHMpCisjZGVmaW5lIF9fUFBDX01CKHMpCSgoKHMpICYgMHgxZikgPDwgNikKKyNkZWZpbmUgX19QUENfTUUocykJKCgocykgJiAweDFmKSA8PCAxKQorI2RlZmluZSBfX1BQQ19CSShzKQkoKChzKSAmIDB4MWYpIDw8IDE2KQogCiAvKgogICogT25seSB1c2UgdGhlIGxhcnggaGludCBiaXQgb24gNjRiaXQgQ1BVcy4gZTUwMHYxL3YyIGJhc2VkIENQVXMgd2lsbCB0cmVhdCBhCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjX2FzbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwY19hc20uaAppbmRleCAxYjQyMjM4Li4zNjhmNzJmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjX2FzbS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGNfYXNtLmgKQEAgLTE1MCwxOCArMTUwLDIyIEBACiAjZGVmaW5lIFJFU1RfMTZWU1JTVShuLGIsYmFzZSkJUkVTVF84VlNSU1UobixiLGJhc2UpOyBSRVNUXzhWU1JTVShuKzgsYixiYXNlKQogI2RlZmluZSBSRVNUXzMyVlNSU1UobixiLGJhc2UpCVJFU1RfMTZWU1JTVShuLGIsYmFzZSk7IFJFU1RfMTZWU1JTVShuKzE2LGIsYmFzZSkKIAotI2RlZmluZSBTQVZFX0VWUihuLHMsYmFzZSkJZXZtZXJnZWhpIHMscyxuOyBzdHcgcyxUSFJFQURfRVZSMCs0KihuKShiYXNlKQotI2RlZmluZSBTQVZFXzJFVlJTKG4scyxiYXNlKQlTQVZFX0VWUihuLHMsYmFzZSk7IFNBVkVfRVZSKG4rMSxzLGJhc2UpCi0jZGVmaW5lIFNBVkVfNEVWUlMobixzLGJhc2UpCVNBVkVfMkVWUlMobixzLGJhc2UpOyBTQVZFXzJFVlJTKG4rMixzLGJhc2UpCi0jZGVmaW5lIFNBVkVfOEVWUlMobixzLGJhc2UpCVNBVkVfNEVWUlMobixzLGJhc2UpOyBTQVZFXzRFVlJTKG4rNCxzLGJhc2UpCi0jZGVmaW5lIFNBVkVfMTZFVlJTKG4scyxiYXNlKQlTQVZFXzhFVlJTKG4scyxiYXNlKTsgU0FWRV84RVZSUyhuKzgscyxiYXNlKQotI2RlZmluZSBTQVZFXzMyRVZSUyhuLHMsYmFzZSkJU0FWRV8xNkVWUlMobixzLGJhc2UpOyBTQVZFXzE2RVZSUyhuKzE2LHMsYmFzZSkKLSNkZWZpbmUgUkVTVF9FVlIobixzLGJhc2UpCWx3eiBzLFRIUkVBRF9FVlIwKzQqKG4pKGJhc2UpOyBldm1lcmdlbG8gbixzLG4KLSNkZWZpbmUgUkVTVF8yRVZSUyhuLHMsYmFzZSkJUkVTVF9FVlIobixzLGJhc2UpOyBSRVNUX0VWUihuKzEscyxiYXNlKQotI2RlZmluZSBSRVNUXzRFVlJTKG4scyxiYXNlKQlSRVNUXzJFVlJTKG4scyxiYXNlKTsgUkVTVF8yRVZSUyhuKzIscyxiYXNlKQotI2RlZmluZSBSRVNUXzhFVlJTKG4scyxiYXNlKQlSRVNUXzRFVlJTKG4scyxiYXNlKTsgUkVTVF80RVZSUyhuKzQscyxiYXNlKQotI2RlZmluZSBSRVNUXzE2RVZSUyhuLHMsYmFzZSkJUkVTVF84RVZSUyhuLHMsYmFzZSk7IFJFU1RfOEVWUlMobis4LHMsYmFzZSkKLSNkZWZpbmUgUkVTVF8zMkVWUlMobixzLGJhc2UpCVJFU1RfMTZFVlJTKG4scyxiYXNlKTsgUkVTVF8xNkVWUlMobisxNixzLGJhc2UpCisvKgorICogYiA9IGJhc2UgcmVnaXN0ZXIgZm9yIGFkZHJlc3NpbmcsIG8gPSBiYXNlIG9mZnNldCBmcm9tIHJlZ2lzdGVyIG9mIDFzdCBFVlIKKyAqIG4gPSBmaXJzdCBFVlIsIHMgPSBzY3JhdGNoCisgKi8KKyNkZWZpbmUgU0FWRV9FVlIobixzLGIsbykJZXZtZXJnZWhpIHMscyxuOyBzdHcgcyxvKzQqKG4pKGIpCisjZGVmaW5lIFNBVkVfMkVWUlMobixzLGIsbykJU0FWRV9FVlIobixzLGIsbyk7IFNBVkVfRVZSKG4rMSxzLGIsbykKKyNkZWZpbmUgU0FWRV80RVZSUyhuLHMsYixvKQlTQVZFXzJFVlJTKG4scyxiLG8pOyBTQVZFXzJFVlJTKG4rMixzLGIsbykKKyNkZWZpbmUgU0FWRV84RVZSUyhuLHMsYixvKQlTQVZFXzRFVlJTKG4scyxiLG8pOyBTQVZFXzRFVlJTKG4rNCxzLGIsbykKKyNkZWZpbmUgU0FWRV8xNkVWUlMobixzLGIsbykJU0FWRV84RVZSUyhuLHMsYixvKTsgU0FWRV84RVZSUyhuKzgscyxiLG8pCisjZGVmaW5lIFNBVkVfMzJFVlJTKG4scyxiLG8pCVNBVkVfMTZFVlJTKG4scyxiLG8pOyBTQVZFXzE2RVZSUyhuKzE2LHMsYixvKQorI2RlZmluZSBSRVNUX0VWUihuLHMsYixvKQlsd3ogcyxvKzQqKG4pKGIpOyBldm1lcmdlbG8gbixzLG4KKyNkZWZpbmUgUkVTVF8yRVZSUyhuLHMsYixvKQlSRVNUX0VWUihuLHMsYixvKTsgUkVTVF9FVlIobisxLHMsYixvKQorI2RlZmluZSBSRVNUXzRFVlJTKG4scyxiLG8pCVJFU1RfMkVWUlMobixzLGIsbyk7IFJFU1RfMkVWUlMobisyLHMsYixvKQorI2RlZmluZSBSRVNUXzhFVlJTKG4scyxiLG8pCVJFU1RfNEVWUlMobixzLGIsbyk7IFJFU1RfNEVWUlMobis0LHMsYixvKQorI2RlZmluZSBSRVNUXzE2RVZSUyhuLHMsYixvKQlSRVNUXzhFVlJTKG4scyxiLG8pOyBSRVNUXzhFVlJTKG4rOCxzLGIsbykKKyNkZWZpbmUgUkVTVF8zMkVWUlMobixzLGIsbykJUkVTVF8xNkVWUlMobixzLGIsbyk7IFJFU1RfMTZFVlJTKG4rMTYscyxiLG8pCiAKIC8qIE1hY3JvcyB0byBhZGp1c3QgdGhyZWFkIHByaW9yaXR5IGZvciBoYXJkd2FyZSBtdWx0aXRocmVhZGluZyAqLwogI2RlZmluZSBITVRfVkVSWV9MT1cJb3IJMzEsMzEsMzEJIyB2ZXJ5IGxvdyBwcmlvcml0eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IGQ1MGMyYjYuLmViMTFhNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCkBAIC0xNTYsNiArMTU3LDEwIEBACiAjZW5kaWYKIAlzdHJ1Y3QgcHRfcmVncwkqcmVnczsJCS8qIFBvaW50ZXIgdG8gc2F2ZWQgcmVnaXN0ZXIgc3RhdGUgKi8KIAltbV9zZWdtZW50X3QJZnM7CQkvKiBmb3IgZ2V0X2ZzKCkgdmFsaWRhdGlvbiAqLworI2lmZGVmIENPTkZJR19CT09LRQorCS8qIEJvb2tFIGJhc2UgZXhjZXB0aW9uIHNjcmF0Y2ggc3BhY2U7IGFsaWduIG9uIGNhY2hlbGluZSAqLworCXVuc2lnbmVkIGxvbmcJbm9ybXNhdmVbOF0gX19fX2NhY2hlbGluZV9hbGlnbmVkOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BQQzMyCiAJdm9pZAkJKnBnZGlyOwkJLyogcm9vdCBvZiBwYWdlLXRhYmxlIHRyZWUgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb20uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9tLmgKaW5kZXggYzE4OWFhNS4uYjgyMzUzNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb20uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvbS5oCkBAIC0yMiwyMCArMjIsNiBAQAogCiAjZGVmaW5lIEhBVkVfQVJDSF9ERVZUUkVFX0ZJWFVQUwogCi0jaWZkZWYgQ09ORklHX1BQQzMyCi0vKgotICogUENJIDwtPiBPRiBtYXRjaGluZyBmdW5jdGlvbnMKLSAqIChYWFggc2hvdWxkIHRoZXNlIGJlIGhlcmU/KQotICovCi1zdHJ1Y3QgcGNpX2J1czsKLXN0cnVjdCBwY2lfZGV2OwotZXh0ZXJuIGludCBwY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0JCQkJICAgdTgqIGJ1cywgdTgqIGRldmZuKTsKLWV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUqIHBjaV9idXNkZXZfdG9fT0Zfbm9kZShzdHJ1Y3QgcGNpX2J1cyAqLCBpbnQpOwotZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSogcGNpX2RldmljZV90b19PRl9ub2RlKHN0cnVjdCBwY2lfZGV2ICopOwotZXh0ZXJuIHZvaWQgcGNpX2NyZWF0ZV9PRl9idXNfbWFwKHZvaWQpOwotI2VuZGlmCi0KIC8qCiAgKiBPRiBhZGRyZXNzIHJldHJlaXZhbCAmIHRyYW5zbGF0aW9uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaAppbmRleCBjNWNhZTBkLi5lOGFhZjZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oCkBAIC0xODksNiArMTg5LDkgQEAKICNkZWZpbmUgU1BSTl9DVFIJMHgwMDkJLyogQ291bnQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BSTl9EU0NSCTB4MTEKICNkZWZpbmUgU1BSTl9DRkFSCTB4MWMJLyogQ29tZSBGcm9tIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1BSTl9BTVIJMHgxZAkvKiBBdXRob3JpdHkgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBTUFJOX1VBTU9SCTB4OWQJLyogVXNlciBBdXRob3JpdHkgTWFzayBPdmVycmlkZSBSZWdpc3RlciAqLworI2RlZmluZSBTUFJOX0FNT1IJMHgxNWQJLyogQXV0aG9yaXR5IE1hc2sgT3ZlcnJpZGUgUmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BSTl9BQ09QCTB4MUYJLyogQXZhaWxhYmxlIENvcHJvY2Vzc29yIFJlZ2lzdGVyICovCiAjZGVmaW5lIFNQUk5fQ1RSTEYJMHgwODgKICNkZWZpbmUgU1BSTl9DVFJMVAkweDA5OApAQCAtMjMyLDIyICsyMzUsMjggQEAKICNkZWZpbmUgICBMUENSX1ZQTTAJKDF1bCA8PCAoNjMtMCkpCiAjZGVmaW5lICAgTFBDUl9WUE0xCSgxdWwgPDwgKDYzLTEpKQogI2RlZmluZSAgIExQQ1JfSVNMCSgxdWwgPDwgKDYzLTIpKQorI2RlZmluZSAgIExQQ1JfVkNfU0gJKDYzLTIpCiAjZGVmaW5lICAgTFBDUl9EUEZEX1NICSg2My0xMSkKICNkZWZpbmUgICBMUENSX1ZSTUFfTAkoMXVsIDw8ICg2My0xMikpCiAjZGVmaW5lICAgTFBDUl9WUk1BX0xQMAkoMXVsIDw8ICg2My0xNSkpCiAjZGVmaW5lICAgTFBDUl9WUk1BX0xQMQkoMXVsIDw8ICg2My0xNikpCisjZGVmaW5lICAgTFBDUl9WUk1BU0RfU0ggKDYzLTE2KQogI2RlZmluZSAgIExQQ1JfUk1MUyAgICAweDFDMDAwMDAwICAgICAgLyogaW1wbCBkZXBlbmRlbnQgcm1vIGxpbWl0IHNlbCAqLworI2RlZmluZQkgIExQQ1JfUk1MU19TSAkoNjMtMzcpCiAjZGVmaW5lICAgTFBDUl9JTEUgICAgIDB4MDIwMDAwMDAgICAgICAvKiAhSFYgaXJxcyBzZXQgTVNSOkxFICovCiAjZGVmaW5lICAgTFBDUl9QRUNFCTB4MDAwMDcwMDAJLyogcG93ZXJzYXZlIGV4aXQgY2F1c2UgZW5hYmxlICovCiAjZGVmaW5lICAgICBMUENSX1BFQ0UwCTB4MDAwMDQwMDAJLyogZXh0LiBleGNlcHRpb25zIGNhbiBjYXVzZSBleGl0ICovCiAjZGVmaW5lICAgICBMUENSX1BFQ0UxCTB4MDAwMDIwMDAJLyogZGVjcmVtZW50ZXIgY2FuIGNhdXNlIGV4aXQgKi8KICNkZWZpbmUgICAgIExQQ1JfUEVDRTIJMHgwMDAwMTAwMAkvKiBtYWNoaW5lIGNoZWNrIGV0YyBjYW4gY2F1c2UgZXhpdCAqLwogI2RlZmluZSAgIExQQ1JfTUVSCTB4MDAwMDA4MDAJLyogTWVkaWF0ZWQgRXh0ZXJuYWwgRXhjZXB0aW9uICovCisjZGVmaW5lICAgTFBDUl9MUEVTICAgIDB4MDAwMDAwMGMKICNkZWZpbmUgICBMUENSX0xQRVMwICAgMHgwMDAwMDAwOCAgICAgIC8qIExQQVIgRW52IHNlbGVjdG9yIDAgKi8KICNkZWZpbmUgICBMUENSX0xQRVMxICAgMHgwMDAwMDAwNCAgICAgIC8qIExQQVIgRW52IHNlbGVjdG9yIDEgKi8KKyNkZWZpbmUgICBMUENSX0xQRVNfU0gJMgogI2RlZmluZSAgIExQQ1JfUk1JICAgICAweDAwMDAwMDAyICAgICAgLyogcmVhbCBtb2RlIGlzIGNhY2hlIGluaGliaXQgKi8KICNkZWZpbmUgICBMUENSX0hESUNFICAgMHgwMDAwMDAwMSAgICAgIC8qIEh5cCBEZWNyIGVuYWJsZSAoSFYsUFIsRUUpICovCiAjZGVmaW5lIFNQUk5fTFBJRAkweDEzRgkvKiBMb2dpY2FsIFBhcnRpdGlvbiBJZGVudGlmaWVyICovCisjZGVmaW5lICAgTFBJRF9SU1ZECTB4M2ZmCQkvKiBSZXNlcnZlZCBMUElEIGZvciBwYXJ0biBzd2l0Y2hpbmcgKi8KICNkZWZpbmUJU1BSTl9ITUVSCTB4MTUwCS8qIEhhcmR3YXJlIG0/IGVycm9yIHJlY292ZXJ5ICovCiAjZGVmaW5lCVNQUk5fSE1FRVIJMHgxNTEJLyogSGFyZHdhcmUgbT8gZW5hYmxlIGVycm9yIHJlY292ZXJ5ICovCiAjZGVmaW5lCVNQUk5fSEVJUgkweDE1MwkvKiBIeXBlcnZpc29yIEVtdWxhdGVkIEluc3RydWN0aW9uIFJlZ2lzdGVyICovCkBAIC0yOTgsNiArMzA3LDcgQEAKICNkZWZpbmUgU1BSTl9IQVNIMQkweDNEMgkJLyogUHJpbWFyeSBIYXNoIEFkZHJlc3MgUmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BSTl9IQVNIMgkweDNEMwkJLyogU2Vjb25kYXJ5IEhhc2ggQWRkcmVzcyBSZXNnaXN0ZXIgKi8KICNkZWZpbmUgU1BSTl9ISUQwCTB4M0YwCQkvKiBIYXJkd2FyZSBJbXBsZW1lbnRhdGlvbiBSZWdpc3RlciAwICovCisjZGVmaW5lIEhJRDBfSERJQ0VfU0gJKDYzIC0gMjMpCS8qIDk3MCBIREVDIGludGVycnVwdCBlbmFibGUgKi8KICNkZWZpbmUgSElEMF9FTUNQCSgxPDwzMSkJCS8qIEVuYWJsZSBNYWNoaW5lIENoZWNrIHBpbiAqLwogI2RlZmluZSBISUQwX0VCQQkoMTw8MjkpCQkvKiBFbmFibGUgQnVzIEFkZHJlc3MgUGFyaXR5ICovCiAjZGVmaW5lIEhJRDBfRUJECSgxPDwyOCkJCS8qIEVuYWJsZSBCdXMgRGF0YSBQYXJpdHkgKi8KQEAgLTM1Myw2ICszNjMsMTMgQEAKICNkZWZpbmUgU1BSTl9JQUJSMgkweDNGQQkJLyogODN4eCAqLwogI2RlZmluZSBTUFJOX0lCQ1IJMHgxMzUJCS8qIDgzeHggSW5zbiBCcmVha3BvaW50IENvbnRyb2wgUmVnICovCiAjZGVmaW5lIFNQUk5fSElENAkweDNGNAkJLyogOTcwIEhJRDQgKi8KKyNkZWZpbmUgIEhJRDRfTFBFUzAJICgxdWwgPDwgKDYzLTApKSAvKiBMUEFSIGVudi4gc2VsLiBiaXQgMCAqLworI2RlZmluZQkgSElENF9STUxTMl9TSAkgKDYzIC0gMikJLyogUmVhbCBtb2RlIGxpbWl0IGJvdHRvbSAyIGJpdHMgKi8KKyNkZWZpbmUJIEhJRDRfTFBJRDVfU0gJICg2MyAtIDYpCS8qIHBhcnRpdGlvbiBJRCBib3R0b20gNCBiaXRzICovCisjZGVmaW5lCSBISUQ0X1JNT1JfU0gJICg2MyAtIDIyKQkvKiByZWFsIG1vZGUgb2Zmc2V0ICgxNiBiaXRzKSAqLworI2RlZmluZSAgSElENF9MUEVTMQkgKDEgPDwgKDYzLTU3KSkJLyogTFBBUiBlbnYuIHNlbC4gYml0IDEgKi8KKyNkZWZpbmUgIEhJRDRfUk1MUzBfU0gJICg2MyAtIDU4KQkvKiBSZWFsIG1vZGUgbGltaXQgdG9wIGJpdCAqLworI2RlZmluZQkgSElENF9MUElEMV9TSAkgMAkJLyogcGFydGl0aW9uIElEIHRvcCAyIGJpdHMgKi8KICNkZWZpbmUgU1BSTl9ISUQ0X0dFS0tPCTB4M0YzCQkvKiBHZWtrbyBISUQ0ICovCiAjZGVmaW5lIFNQUk5fSElENQkweDNGNgkJLyogOTcwIEhJRDUgKi8KICNkZWZpbmUgU1BSTl9ISUQ2CTB4M0Y5CS8qIEJFIEhJRCA2ICovCkBAIC04MDIsMjggKzgxOSwyOCBAQAogCW1mc3ByCXJYLFNQUk5fU1BSR19QQUNBOwkJCVwKIAlGVFJfU0VDVElPTl9FTFNFX05FU1RFRCg2Nik7CQkJXAogCW1mc3ByCXJYLFNQUk5fU1BSR19IUEFDQTsJCQlcCi0JQUxUX0ZUUl9TRUNUSU9OX0VORF9ORVNURURfSUZDTFIoQ1BVX0ZUUl9IVk1PREVfMjA2LCA2NikKKwlBTFRfRlRSX1NFQ1RJT05fRU5EX05FU1RFRF9JRkNMUihDUFVfRlRSX0hWTU9ERSwgNjYpCiAKICNkZWZpbmUgU0VUX1BBQ0EoclgpCQkJCQlcCiAJQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDY2KTsJCQlcCiAJbXRzcHIJU1BSTl9TUFJHX1BBQ0Esclg7CQkJXAogCUZUUl9TRUNUSU9OX0VMU0VfTkVTVEVEKDY2KTsJCQlcCiAJbXRzcHIJU1BSTl9TUFJHX0hQQUNBLHJYOwkJCVwKLQlBTFRfRlRSX1NFQ1RJT05fRU5EX05FU1RFRF9JRkNMUihDUFVfRlRSX0hWTU9ERV8yMDYsIDY2KQorCUFMVF9GVFJfU0VDVElPTl9FTkRfTkVTVEVEX0lGQ0xSKENQVV9GVFJfSFZNT0RFLCA2NikKIAogI2RlZmluZSBHRVRfU0NSQVRDSDAoclgpCQkJCVwKIAlCRUdJTl9GVFJfU0VDVElPTl9ORVNURUQoNjYpOwkJCVwKIAltZnNwcglyWCxTUFJOX1NQUkdfU0NSQVRDSDA7CQkJXAogCUZUUl9TRUNUSU9OX0VMU0VfTkVTVEVEKDY2KTsJCQlcCiAJbWZzcHIJclgsU1BSTl9TUFJHX0hTQ1JBVENIMDsJCQlcCi0JQUxUX0ZUUl9TRUNUSU9OX0VORF9ORVNURURfSUZDTFIoQ1BVX0ZUUl9IVk1PREVfMjA2LCA2NikKKwlBTFRfRlRSX1NFQ1RJT05fRU5EX05FU1RFRF9JRkNMUihDUFVfRlRSX0hWTU9ERSwgNjYpCiAKICNkZWZpbmUgU0VUX1NDUkFUQ0gwKHJYKQkJCQlcCiAJQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDY2KTsJCQlcCiAJbXRzcHIJU1BSTl9TUFJHX1NDUkFUQ0gwLHJYOwkJCVwKIAlGVFJfU0VDVElPTl9FTFNFX05FU1RFRCg2Nik7CQkJXAogCW10c3ByCVNQUk5fU1BSR19IU0NSQVRDSDAsclg7CQkJXAotCUFMVF9GVFJfU0VDVElPTl9FTkRfTkVTVEVEX0lGQ0xSKENQVV9GVFJfSFZNT0RFXzIwNiwgNjYpCisJQUxUX0ZUUl9TRUNUSU9OX0VORF9ORVNURURfSUZDTFIoQ1BVX0ZUUl9IVk1PREUsIDY2KQogCiAjZWxzZSAvKiBDT05GSUdfUFBDX0JPT0szU182NCAqLwogI2RlZmluZSBHRVRfU0NSQVRDSDAoclgpCW1mc3ByCXJYLFNQUk5fU1BSR19TQ1JBVENIMApAQCAtODcyLDggKzg4OSw4IEBACiAjZGVmaW5lIFNQUk5fU1BSR19XU0NSQVRDSDIJU1BSTl9TUFJHNFcKICNkZWZpbmUgU1BSTl9TUFJHX1JTQ1JBVENIMwlTUFJOX1NQUkc1UgogI2RlZmluZSBTUFJOX1NQUkdfV1NDUkFUQ0gzCVNQUk5fU1BSRzVXCi0jZGVmaW5lIFNQUk5fU1BSR19SU0NSQVRDSF9NQwlTUFJOX1NQUkc2UgotI2RlZmluZSBTUFJOX1NQUkdfV1NDUkFUQ0hfTUMJU1BSTl9TUFJHNlcKKyNkZWZpbmUgU1BSTl9TUFJHX1JTQ1JBVENIX01DCVNQUk5fU1BSRzEKKyNkZWZpbmUgU1BSTl9TUFJHX1dTQ1JBVENIX01DCVNQUk5fU1BSRzEKICNkZWZpbmUgU1BSTl9TUFJHX1JTQ1JBVENINAlTUFJOX1NQUkc3UgogI2RlZmluZSBTUFJOX1NQUkdfV1NDUkFUQ0g0CVNQUk5fU1BSRzdXCiAjaWZkZWYgQ09ORklHX0UyMDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfYm9va2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfYm9va2UuaAppbmRleCAwZjBhZDlmLi45ZWMwYjM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2Jvb2tlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZ19ib29rZS5oCkBAIC0zMTgsNiArMzE4LDcgQEAKICNkZWZpbmUgRVNSX0lMSwkJMHgwMDEwMDAwMAkvKiBJbnN0ci4gQ2FjaGUgTG9ja2luZyAqLwogI2RlZmluZSBFU1JfUFVPCQkweDAwMDQwMDAwCS8qIFVuaW1wbGVtZW50ZWQgT3BlcmF0aW9uIGV4Y2VwdGlvbiAqLwogI2RlZmluZSBFU1JfQk8JCTB4MDAwMjAwMDAJLyogQnl0ZSBPcmRlcmluZyAqLworI2RlZmluZSBFU1JfU1BWCQkweDAwMDAwMDgwCS8qIFNpZ25hbCBQcm9jZXNzaW5nIG9wZXJhdGlvbiAqLwogCiAvKiBCaXQgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byB0aGUgREJDUjAuICovCiAjaWYgZGVmaW5lZChDT05GSUdfNDB4KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Jpby5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Jpby5oCmluZGV4IGQ5MDJhYmQuLmIxZDJkZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yaW8uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmlvLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNkZWZpbmUgQVNNX1BQQ19SSU9fSAogCiBleHRlcm4gdm9pZCBwbGF0Zm9ybV9yaW9faW5pdCh2b2lkKTsKLSNpZmRlZiBDT05GSUdfUkFQSURJTworI2lmZGVmIENPTkZJR19GU0xfUklPCiBleHRlcm4gaW50IGZzbF9yaW9fbWNoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBmc2xfcmlvX21jaGVja19leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIHtyZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc2V0dXAuaAppbmRleCBkYWUxOTM0Li4xODZlMGZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc2V0dXAuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMyw0ICszLDggQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NldHVwLmg+CiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gdm9pZCBwcGNfcHJpbnRrX3Byb2dyZXNzKGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0IGhleCk7CisjZW5kaWYKKwogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19TRVRVUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggMTFlYjQwNC4uMTVhNzBiNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KIAogZXh0ZXJuIGludCBib290X2NwdWlkOwotZXh0ZXJuIGludCBib290X2NwdV9jb3VudDsKK2V4dGVybiBpbnQgc3Bpbm5pbmdfc2Vjb25kYXJpZXM7CiAKIGV4dGVybiB2b2lkIGNwdV9kaWUodm9pZCk7CiAKQEAgLTExOSw3ICsxMTksNiBAQAogLyogZm9yIGlycSBjb250cm9sbGVycyB3aXRoIG9ubHkgYSBzaW5nbGUgaXBpICovCiBleHRlcm4gdm9pZCBzbXBfbXV4ZWRfaXBpX3NldF9kYXRhKGludCBjcHUsIHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBleHRlcm4gdm9pZCBzbXBfbXV4ZWRfaXBpX21lc3NhZ2VfcGFzcyhpbnQgY3B1LCBpbnQgbXNnKTsKLWV4dGVybiB2b2lkIHNtcF9tdXhlZF9pcGlfcmVzZW5kKHZvaWQpOwogZXh0ZXJuIGlycXJldHVybl90IHNtcF9pcGlfZGVtdXgodm9pZCk7CiAKIHZvaWQgc21wX2luaXRfaVNlcmllcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXUuaAppbmRleCBlM2JkYWRhLi5hZTIwY2UxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc211LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtdS5oCkBAIC01NDcsNyArNTQ3LDcgQEAKICAqIChjdXJyZW50bHksIGFmYWlrLCB0aGlzIGNvbmNlcm5zIG9ubHkgdGhlIEZWVCBwYXJ0aXRpb24KICAqICgweDEyKQogICovCi0jZGVmaW5lIFNNVV9VMTZfTUlYKHgpCWxlMTZfdG9fY3B1KHgpOworI2RlZmluZSBTTVVfVTE2X01JWCh4KQlsZTE2X3RvX2NwdSh4KQogI2RlZmluZSBTTVVfVTMyX01JWCh4KSAgKCgoKHgpICYgMHhmZjAwZmYwMHUpID4+IDgpfCgoKHgpICYgMHgwMGZmMDBmZnUpIDw8IDgpKQogCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91ZGJnLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdWRiZy5oCmluZGV4IDU4NTgwZTkuLjkzZTA1ZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91ZGJnLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VkYmcuaApAQCAtNDAsNiArNDAsNyBAQAogCiBleHRlcm4gdm9pZCBfX2luaXQgdWRiZ19lYXJseV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IHVkYmdfaW5pdF9kZWJ1Z19scGFyKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IHVkYmdfaW5pdF9kZWJ1Z19scGFyX2h2c2kodm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgdWRiZ19pbml0X3BtYWNfcmVhbG1vZGUodm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgdWRiZ19pbml0X21hcGxlX3JlYWxtb2RlKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IHVkYmdfaW5pdF9wYXNfcmVhbG1vZGUodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCBlOGI5ODE4Li5jZTRmN2YxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTc2LDYgKzc2LDcgQEAKIG9iai0kKENPTkZJR180NHgpCQkrPSBjcHVfc2V0dXBfNDR4Lm8KIG9iai0kKENPTkZJR19QUENfRlNMX0JPT0szRSkJKz0gY3B1X3NldHVwX2ZzbF9ib29rZS5vIGRiZWxsLm8KIG9iai0kKENPTkZJR19QUENfQk9PSzNFXzY0KQkrPSBkYmVsbC5vCitvYmotJChDT05GSUdfSlVNUF9MQUJFTCkJKz0ganVtcF9sYWJlbC5vCiAKIGV4dHJhLXkJCQkJOj0gaGVhZF8kKENPTkZJR19XT1JEX1NJWkUpLm8KIGV4dHJhLSQoQ09ORklHXzQweCkJCTo9IGhlYWRfNDB4Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAzNmUxYzhhLi41ZjA3OGJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC04Miw2ICs4Miw5IEBACiAJREVGSU5FKEtTUCwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIGtzcCkpOwogCURFRklORShLU1BfTElNSVQsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBrc3BfbGltaXQpKTsKIAlERUZJTkUoUFRfUkVHUywgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIHJlZ3MpKTsKKyNpZmRlZiBDT05GSUdfQk9PS0UKKwlERUZJTkUoVEhSRUFEX05PUk1TQVZFUywgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIG5vcm1zYXZlWzBdKSk7CisjZW5kaWYKIAlERUZJTkUoVEhSRUFEX0ZQRVhDX01PREUsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBmcGV4Y19tb2RlKSk7CiAJREVGSU5FKFRIUkVBRF9GUFIwLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgZnByWzBdKSk7CiAJREVGSU5FKFRIUkVBRF9GUFNDUiwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIGZwc2NyKSk7CkBAIC0xMjgsNiArMTMxLDcgQEAKIAlERUZJTkUoSUNBQ0hFTDFMSU5FU1BFUlBBR0UsIG9mZnNldG9mKHN0cnVjdCBwcGM2NF9jYWNoZXMsIGlsaW5lc19wZXJfcGFnZSkpOwogCS8qIHBhY2EgKi8KIAlERUZJTkUoUEFDQV9TSVpFLCBzaXplb2Yoc3RydWN0IHBhY2Ffc3RydWN0KSk7CisJREVGSU5FKFBBQ0FfTE9DS19UT0tFTiwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBsb2NrX3Rva2VuKSk7CiAJREVGSU5FKFBBQ0FQQUNBSU5ERVgsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgcGFjYV9pbmRleCkpOwogCURFRklORShQQUNBUFJPQ1NUQVJULCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGNwdV9zdGFydCkpOwogCURFRklORShQQUNBS1NBVkUsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwga3N0YWNrKSk7CkBAIC0xODcsNyArMTkxLDkgQEAKIAlERUZJTkUoTFBQQUNBU1JSMSwgb2Zmc2V0b2Yoc3RydWN0IGxwcGFjYSwgc2F2ZWRfc3JyMSkpOwogCURFRklORShMUFBBQ0FBTllJTlQsIG9mZnNldG9mKHN0cnVjdCBscHBhY2EsIGludF9kd29yZC5hbnlfaW50KSk7CiAJREVGSU5FKExQUEFDQURFQ1JJTlQsIG9mZnNldG9mKHN0cnVjdCBscHBhY2EsIGludF9kd29yZC5maWVsZHMuZGVjcl9pbnQpKTsKKwlERUZJTkUoTFBQQUNBX1BNQ0lOVVNFLCBvZmZzZXRvZihzdHJ1Y3QgbHBwYWNhLCBwbWNyZWdzX2luX3VzZSkpOwogCURFRklORShMUFBBQ0FfRFRMSURYLCBvZmZzZXRvZihzdHJ1Y3QgbHBwYWNhLCBkdGxfaWR4KSk7CisJREVGSU5FKExQUEFDQV9ZSUVMRENPVU5ULCBvZmZzZXRvZihzdHJ1Y3QgbHBwYWNhLCB5aWVsZF9jb3VudCkpOwogCURFRklORShQQUNBX0RUTF9SSURYLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGR0bF9yaWR4KSk7CiAjZW5kaWYgLyogQ09ORklHX1BQQ19TVERfTU1VXzY0ICovCiAJREVGSU5FKFBBQ0FFTUVSR1NQLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGVtZXJnZW5jeV9zcCkpOwpAQCAtMTk4LDExICsyMDQsNiBAQAogCURFRklORShQQUNBX1VTRVJfVElNRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCB1c2VyX3RpbWUpKTsKIAlERUZJTkUoUEFDQV9TWVNURU1fVElNRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzeXN0ZW1fdGltZSkpOwogCURFRklORShQQUNBX1RSQVBfU0FWRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCB0cmFwX3NhdmUpKTsKLSNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSCi0JREVGSU5FKFBBQ0FfS1ZNX1NWQ1BVLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNoYWRvd192Y3B1KSk7Ci0JREVGSU5FKFNWQ1BVX1NMQiwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUsIHNsYikpOwotCURFRklORShTVkNQVV9TTEJfTUFYLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwgc2xiX21heCkpOwotI2VuZGlmCiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKIAkvKiBSVEFTICovCkBAIC0zOTcsNjcgKzM5OCwxNjAgQEAKIAlERUZJTkUoVkNQVV9IT1NUX1BJRCwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmhvc3RfcGlkKSk7CiAJREVGSU5FKFZDUFVfR1BSUywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmdwcikpOwogCURFRklORShWQ1BVX1ZSU0FWRSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnZyc2F2ZSkpOworCURFRklORShWQ1BVX0ZQUlMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5mcHIpKTsKKwlERUZJTkUoVkNQVV9GUFNDUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmZwc2NyKSk7CisjaWZkZWYgQ09ORklHX0FMVElWRUMKKwlERUZJTkUoVkNQVV9WUlMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC52cikpOworCURFRklORShWQ1BVX1ZTQ1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC52c2NyKSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVlNYCisJREVGSU5FKFZDUFVfVlNSUywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnZzcikpOworI2VuZGlmCisJREVGSU5FKFZDUFVfWEVSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gueGVyKSk7CisJREVGSU5FKFZDUFVfQ1RSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guY3RyKSk7CisJREVGSU5FKFZDUFVfTFIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5scikpOworCURFRklORShWQ1BVX0NSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guY3IpKTsKKwlERUZJTkUoVkNQVV9QQywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnBjKSk7CisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSFYKKwlERUZJTkUoVkNQVV9NU1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zaHJlZ3MubXNyKSk7CisJREVGSU5FKFZDUFVfU1JSMCwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNocmVncy5zcnIwKSk7CisJREVGSU5FKFZDUFVfU1JSMSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNocmVncy5zcnIxKSk7CisJREVGSU5FKFZDUFVfU1BSRzAsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zaHJlZ3Muc3ByZzApKTsKKwlERUZJTkUoVkNQVV9TUFJHMSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNocmVncy5zcHJnMSkpOworCURFRklORShWQ1BVX1NQUkcyLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc2hyZWdzLnNwcmcyKSk7CisJREVGSU5FKFZDUFVfU1BSRzMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zaHJlZ3Muc3ByZzMpKTsKKyNlbmRpZgogCURFRklORShWQ1BVX1NQUkc0LCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc3ByZzQpKTsKIAlERUZJTkUoVkNQVV9TUFJHNSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNwcmc1KSk7CiAJREVGSU5FKFZDUFVfU1BSRzYsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zcHJnNikpOwogCURFRklORShWQ1BVX1NQUkc3LCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc3ByZzcpKTsKIAlERUZJTkUoVkNQVV9TSEFET1dfUElELCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc2hhZG93X3BpZCkpOworCURFRklORShWQ1BVX1NIQURPV19QSUQxLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc2hhZG93X3BpZDEpKTsKIAlERUZJTkUoVkNQVV9TSEFSRUQsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zaGFyZWQpKTsKIAlERUZJTkUoVkNQVV9TSEFSRURfTVNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaF9zaGFyZWQsIG1zcikpOworCURFRklORShWQ1BVX1NIQURPV19NU1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zaGFkb3dfbXNyKSk7CiAKIAkvKiBib29rM3MgKi8KKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IVgorCURFRklORShLVk1fTFBJRCwgb2Zmc2V0b2Yoc3RydWN0IGt2bSwgYXJjaC5scGlkKSk7CisJREVGSU5FKEtWTV9TRFIxLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtLCBhcmNoLnNkcjEpKTsKKwlERUZJTkUoS1ZNX0hPU1RfTFBJRCwgb2Zmc2V0b2Yoc3RydWN0IGt2bSwgYXJjaC5ob3N0X2xwaWQpKTsKKwlERUZJTkUoS1ZNX0hPU1RfTFBDUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bSwgYXJjaC5ob3N0X2xwY3IpKTsKKwlERUZJTkUoS1ZNX0hPU1RfU0RSMSwgb2Zmc2V0b2Yoc3RydWN0IGt2bSwgYXJjaC5ob3N0X3NkcjEpKTsKKwlERUZJTkUoS1ZNX1RMQklFX0xPQ0ssIG9mZnNldG9mKHN0cnVjdCBrdm0sIGFyY2gudGxiaWVfbG9jaykpOworCURFRklORShLVk1fT05MSU5FX0NQVVMsIG9mZnNldG9mKHN0cnVjdCBrdm0sIG9ubGluZV92Y3B1cy5jb3VudGVyKSk7CisJREVGSU5FKEtWTV9MQVNUX1ZDUFUsIG9mZnNldG9mKHN0cnVjdCBrdm0sIGFyY2gubGFzdF92Y3B1KSk7CisJREVGSU5FKEtWTV9MUENSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtLCBhcmNoLmxwY3IpKTsKKwlERUZJTkUoS1ZNX1JNT1IsIG9mZnNldG9mKHN0cnVjdCBrdm0sIGFyY2gucm1vcikpOworCURFRklORShWQ1BVX0RTSVNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc2hyZWdzLmRzaXNyKSk7CisJREVGSU5FKFZDUFVfREFSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc2hyZWdzLmRhcikpOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM1MKKwlERUZJTkUoVkNQVV9LVk0sIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwga3ZtKSk7CisJREVGSU5FKFZDUFVfVkNQVUlELCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIHZjcHVfaWQpKTsKIAlERUZJTkUoVkNQVV9IT1NUX1JFVElQLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guaG9zdF9yZXRpcCkpOwogCURFRklORShWQ1BVX0hPU1RfTVNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guaG9zdF9tc3IpKTsKLQlERUZJTkUoVkNQVV9TSEFET1dfTVNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc2hhZG93X21zcikpOworCURFRklORShWQ1BVX1BVUlIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5wdXJyKSk7CisJREVGSU5FKFZDUFVfU1BVUlIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zcHVycikpOworCURFRklORShWQ1BVX0RTQ1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kc2NyKSk7CisJREVGSU5FKFZDUFVfQU1SLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guYW1yKSk7CisJREVGSU5FKFZDUFVfVUFNT1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC51YW1vcikpOworCURFRklORShWQ1BVX0NUUkwsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5jdHJsKSk7CisJREVGSU5FKFZDUFVfREFCUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmRhYnIpKTsKIAlERUZJTkUoVkNQVV9UUkFNUE9MSU5FX0xPV01FTSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnRyYW1wb2xpbmVfbG93bWVtKSk7CiAJREVGSU5FKFZDUFVfVFJBTVBPTElORV9FTlRFUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnRyYW1wb2xpbmVfZW50ZXIpKTsKIAlERUZJTkUoVkNQVV9ISUdITUVNX0hBTkRMRVIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5oaWdobWVtX2hhbmRsZXIpKTsKIAlERUZJTkUoVkNQVV9STUNBTEwsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5ybWNhbGwpKTsKIAlERUZJTkUoVkNQVV9IRkxBR1MsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5oZmxhZ3MpKTsKKwlERUZJTkUoVkNQVV9ERUMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kZWMpKTsKKwlERUZJTkUoVkNQVV9ERUNfRVhQSVJFUywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmRlY19leHBpcmVzKSk7CisJREVGSU5FKFZDUFVfUEVORElOR19FWEMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMpKTsKKwlERUZJTkUoVkNQVV9WUEEsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC52cGEpKTsKKwlERUZJTkUoVkNQVV9NTUNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gubW1jcikpOworCURFRklORShWQ1BVX1BNQywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnBtYykpOworCURFRklORShWQ1BVX1NMQiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNsYikpOworCURFRklORShWQ1BVX1NMQl9NQVgsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zbGJfbWF4KSk7CisJREVGSU5FKFZDUFVfU0xCX05SLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc2xiX25yKSk7CisJREVGSU5FKFZDUFVfTEFTVF9DUFUsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5sYXN0X2NwdSkpOworCURFRklORShWQ1BVX0ZBVUxUX0RTSVNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guZmF1bHRfZHNpc3IpKTsKKwlERUZJTkUoVkNQVV9GQVVMVF9EQVIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5mYXVsdF9kYXIpKTsKKwlERUZJTkUoVkNQVV9MQVNUX0lOU1QsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5sYXN0X2luc3QpKTsKKwlERUZJTkUoVkNQVV9UUkFQLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudHJhcCkpOworCURFRklORShWQ1BVX1BUSUQsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5wdGlkKSk7CisJREVGSU5FKFZDT1JFX0VOVFJZX0VYSVQsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNvcmUsIGVudHJ5X2V4aXRfY291bnQpKTsKKwlERUZJTkUoVkNPUkVfTkFQX0NPVU5ULCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3Zjb3JlLCBuYXBfY291bnQpKTsKKwlERUZJTkUoVkNPUkVfSU5fR1VFU1QsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNvcmUsIGluX2d1ZXN0KSk7CiAJREVGSU5FKFZDUFVfU1ZDUFUsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MsIHNoYWRvd192Y3B1KSAtCiAJCQkgICBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzLCB2Y3B1KSk7Ci0JREVGSU5FKFNWQ1BVX0NSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwgY3IpKTsKLQlERUZJTkUoU1ZDUFVfWEVSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwgeGVyKSk7Ci0JREVGSU5FKFNWQ1BVX0NUUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUsIGN0cikpOwotCURFRklORShTVkNQVV9MUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUsIGxyKSk7Ci0JREVGSU5FKFNWQ1BVX1BDLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwgcGMpKTsKLQlERUZJTkUoU1ZDUFVfUjAsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LCBncHJbMF0pKTsKLQlERUZJTkUoU1ZDUFVfUjEsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LCBncHJbMV0pKTsKLQlERUZJTkUoU1ZDUFVfUjIsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LCBncHJbMl0pKTsKLQlERUZJTkUoU1ZDUFVfUjMsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LCBncHJbM10pKTsKLQlERUZJTkUoU1ZDUFVfUjQsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LCBncHJbNF0pKTsKLQlERUZJTkUoU1ZDUFVfUjUsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LCBncHJbNV0pKTsKLQlERUZJTkUoU1ZDUFVfUjYsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LCBncHJbNl0pKTsKLQlERUZJTkUoU1ZDUFVfUjcsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LCBncHJbN10pKTsKLQlERUZJTkUoU1ZDUFVfUjgsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LCBncHJbOF0pKTsKLQlERUZJTkUoU1ZDUFVfUjksIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LCBncHJbOV0pKTsKLQlERUZJTkUoU1ZDUFVfUjEwLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwgZ3ByWzEwXSkpOwotCURFRklORShTVkNQVV9SMTEsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LCBncHJbMTFdKSk7Ci0JREVGSU5FKFNWQ1BVX1IxMiwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUsIGdwclsxMl0pKTsKLQlERUZJTkUoU1ZDUFVfUjEzLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwgZ3ByWzEzXSkpOwotCURFRklORShTVkNQVV9IT1NUX1IxLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwgaG9zdF9yMSkpOwotCURFRklORShTVkNQVV9IT1NUX1IyLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwgaG9zdF9yMikpOwotCURFRklORShTVkNQVV9WTUhBTkRMRVIsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LAotCQkJCQkgdm1oYW5kbGVyKSk7Ci0JREVGSU5FKFNWQ1BVX1NDUkFUQ0gwLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwKLQkJCQkJc2NyYXRjaDApKTsKLQlERUZJTkUoU1ZDUFVfU0NSQVRDSDEsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LAotCQkJCQlzY3JhdGNoMSkpOwotCURFRklORShTVkNQVV9JTl9HVUVTVCwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUsCi0JCQkJCWluX2d1ZXN0KSk7Ci0JREVGSU5FKFNWQ1BVX0ZBVUxUX0RTSVNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwKLQkJCQkJICAgZmF1bHRfZHNpc3IpKTsKLQlERUZJTkUoU1ZDUFVfRkFVTFRfREFSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwKLQkJCQkJIGZhdWx0X2RhcikpOwotCURFRklORShTVkNQVV9MQVNUX0lOU1QsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1LAotCQkJCQkgbGFzdF9pbnN0KSk7Ci0JREVGSU5FKFNWQ1BVX1NIQURPV19TUlIxLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwKLQkJCQkJICAgc2hhZG93X3NycjEpKTsKLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szU18zMgotCURFRklORShTVkNQVV9TUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUsIHNyKSk7Ci0jZW5kaWYKKwlERUZJTkUoVkNQVV9TTEJfRSwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY19zbGIsIG9yaWdlKSk7CisJREVGSU5FKFZDUFVfU0xCX1YsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfc2xiLCBvcmlndikpOworCURFRklORShWQ1BVX1NMQl9TSVpFLCBzaXplb2Yoc3RydWN0IGt2bXBwY19zbGIpKTsKKworI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0CisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfUFIKKyMgZGVmaW5lIFNWQ1BVX0ZJRUxEKHgsIGYpCURFRklORSh4LCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNoYWRvd192Y3B1LmYpKQogI2Vsc2UKKyMgZGVmaW5lIFNWQ1BVX0ZJRUxEKHgsIGYpCisjZW5kaWYKKyMgZGVmaW5lIEhTVEFURV9GSUVMRCh4LCBmKQlERUZJTkUoeCwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBrdm1faHN0YXRlLmYpKQorI2Vsc2UJLyogMzItYml0ICovCisjIGRlZmluZSBTVkNQVV9GSUVMRCh4LCBmKQlERUZJTkUoeCwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUsIGYpKQorIyBkZWZpbmUgSFNUQVRFX0ZJRUxEKHgsIGYpCURFRklORSh4LCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSwgaHN0YXRlLmYpKQorI2VuZGlmCisKKwlTVkNQVV9GSUVMRChTVkNQVV9DUiwgY3IpOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1hFUiwgeGVyKTsKKwlTVkNQVV9GSUVMRChTVkNQVV9DVFIsIGN0cik7CisJU1ZDUFVfRklFTEQoU1ZDUFVfTFIsIGxyKTsKKwlTVkNQVV9GSUVMRChTVkNQVV9QQywgcGMpOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1IwLCBncHJbMF0pOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1IxLCBncHJbMV0pOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1IyLCBncHJbMl0pOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1IzLCBncHJbM10pOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1I0LCBncHJbNF0pOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1I1LCBncHJbNV0pOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1I2LCBncHJbNl0pOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1I3LCBncHJbN10pOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1I4LCBncHJbOF0pOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1I5LCBncHJbOV0pOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1IxMCwgZ3ByWzEwXSk7CisJU1ZDUFVfRklFTEQoU1ZDUFVfUjExLCBncHJbMTFdKTsKKwlTVkNQVV9GSUVMRChTVkNQVV9SMTIsIGdwclsxMl0pOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1IxMywgZ3ByWzEzXSk7CisJU1ZDUFVfRklFTEQoU1ZDUFVfRkFVTFRfRFNJU1IsIGZhdWx0X2RzaXNyKTsKKwlTVkNQVV9GSUVMRChTVkNQVV9GQVVMVF9EQVIsIGZhdWx0X2Rhcik7CisJU1ZDUFVfRklFTEQoU1ZDUFVfTEFTVF9JTlNULCBsYXN0X2luc3QpOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1NIQURPV19TUlIxLCBzaGFkb3dfc3JyMSk7CisjaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfMzIKKwlTVkNQVV9GSUVMRChTVkNQVV9TUiwgc3IpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQzY0CisJU1ZDUFVfRklFTEQoU1ZDUFVfU0xCLCBzbGIpOworCVNWQ1BVX0ZJRUxEKFNWQ1BVX1NMQl9NQVgsIHNsYl9tYXgpOworI2VuZGlmCisKKwlIU1RBVEVfRklFTEQoSFNUQVRFX0hPU1RfUjEsIGhvc3RfcjEpOworCUhTVEFURV9GSUVMRChIU1RBVEVfSE9TVF9SMiwgaG9zdF9yMik7CisJSFNUQVRFX0ZJRUxEKEhTVEFURV9IT1NUX01TUiwgaG9zdF9tc3IpOworCUhTVEFURV9GSUVMRChIU1RBVEVfVk1IQU5ETEVSLCB2bWhhbmRsZXIpOworCUhTVEFURV9GSUVMRChIU1RBVEVfU0NSQVRDSDAsIHNjcmF0Y2gwKTsKKwlIU1RBVEVfRklFTEQoSFNUQVRFX1NDUkFUQ0gxLCBzY3JhdGNoMSk7CisJSFNUQVRFX0ZJRUxEKEhTVEFURV9JTl9HVUVTVCwgaW5fZ3Vlc3QpOworCisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSFYKKwlIU1RBVEVfRklFTEQoSFNUQVRFX0tWTV9WQ1BVLCBrdm1fdmNwdSk7CisJSFNUQVRFX0ZJRUxEKEhTVEFURV9LVk1fVkNPUkUsIGt2bV92Y29yZSk7CisJSFNUQVRFX0ZJRUxEKEhTVEFURV9YSUNTX1BIWVMsIHhpY3NfcGh5cyk7CisJSFNUQVRFX0ZJRUxEKEhTVEFURV9NTUNSLCBob3N0X21tY3IpOworCUhTVEFURV9GSUVMRChIU1RBVEVfUE1DLCBob3N0X3BtYyk7CisJSFNUQVRFX0ZJRUxEKEhTVEFURV9QVVJSLCBob3N0X3B1cnIpOworCUhTVEFURV9GSUVMRChIU1RBVEVfU1BVUlIsIGhvc3Rfc3B1cnIpOworCUhTVEFURV9GSUVMRChIU1RBVEVfRFNDUiwgaG9zdF9kc2NyKTsKKwlIU1RBVEVfRklFTEQoSFNUQVRFX0RBQlIsIGRhYnIpOworCUhTVEFURV9GSUVMRChIU1RBVEVfREVDRVhQLCBkZWNfZXhwaXJlcyk7CisjZW5kaWYgLyogQ09ORklHX0tWTV9CT09LM1NfNjRfSFYgKi8KKworI2Vsc2UgLyogQ09ORklHX1BQQ19CT09LM1MgKi8KIAlERUZJTkUoVkNQVV9DUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmNyKSk7CiAJREVGSU5FKFZDUFVfWEVSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gueGVyKSk7CiAJREVGSU5FKFZDUFVfTFIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5scikpOwpAQCAtNDY3LDcgKzU2MSw3IEBACiAJREVGSU5FKFZDUFVfRkFVTFRfREVBUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmZhdWx0X2RlYXIpKTsKIAlERUZJTkUoVkNQVV9GQVVMVF9FU1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5mYXVsdF9lc3IpKTsKICNlbmRpZiAvKiBDT05GSUdfUFBDX0JPT0szUyAqLwotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0tWTSAqLwogCiAjaWZkZWYgQ09ORklHX0tWTV9HVUVTVAogCURFRklORShLVk1fTUFHSUNfU0NSQVRDSDEsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdV9hcmNoX3NoYXJlZCwKQEAgLTQ5Nyw2ICs1OTEsMTMgQEAKIAlERUZJTkUoVExCQ0FNX01BUzcsIG9mZnNldG9mKHN0cnVjdCB0bGJjYW0sIE1BUzcpKTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfS1ZNKSAmJiBkZWZpbmVkKENPTkZJR19TUEUpCisJREVGSU5FKFZDUFVfRVZSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guZXZyWzBdKSk7CisJREVGSU5FKFZDUFVfQUNDLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guYWNjKSk7CisJREVGSU5FKFZDUFVfU1BFRlNDUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNwZWZzY3IpKTsKKwlERUZJTkUoVkNQVV9IT1NUX1NQRUZTQ1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5ob3N0X3NwZWZzY3IpKTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0tWTV9FWElUX1RJTUlORwogCURFRklORShWQ1BVX1RJTUlOR19FWElUX1RCVSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LAogCQkJCQkJYXJjaC50aW1pbmdfZXhpdC50djMyLnRidSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI3LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjcuUwppbmRleCA0ZjlhOTNmLi43Njc5N2M1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjcuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjcuUwpAQCAtNDUsMTIgKzQ1LDEyIEBACiAJYmxyCiAKIF9faW5pdF9odm1vZGVfMjA2OgotCS8qIERpc2FibGUgQ1BVX0ZUUl9IVk1PREVfMjA2IGFuZCBleGl0IGlmIE1TUjpIViBpcyBub3Qgc2V0ICovCisJLyogRGlzYWJsZSBDUFVfRlRSX0hWTU9ERSBhbmQgZXhpdCBpZiBNU1I6SFYgaXMgbm90IHNldCAqLwogCW1mbXNyCXIzCiAJcmxkaWNsLglyMCxyMyw0LDYzCiAJYm5lbHIKIAlsZAlyNSxDUFVfU1BFQ19GRUFUVVJFUyhyNCkKLQlMT0FEX1JFR19JTU1FRElBVEUocjYsQ1BVX0ZUUl9IVk1PREVfMjA2KQorCUxPQURfUkVHX0lNTUVESUFURShyNixDUFVfRlRSX0hWTU9ERSkKIAl4b3IJcjUscjUscjYKIAlzdGQJcjUsQ1BVX1NQRUNfRkVBVFVSRVMocjQpCiAJYmxyCkBAIC02MSwxOSArNjEsMjMgQEAKIAkgKiAgIExQRVMgPSAwYjAxIChIU1JSMC8xIHVzZWQgZm9yIDB4NTAwKQogCSAqICAgUEVDRSA9IDBiMTExCiAJICogICBEUEZEID0gNAorCSAqICAgSERJQ0UgPSAwCisJICogICBWQyA9IDBiMTAwIChWUE0wPTEsIFZQTTE9MCwgSVNMPTApCisJICogICBWUk1BU0QgPSAwYjEwMDAwIChMPTEsIExQPTAwKQogCSAqCiAJICogT3RoZXIgYml0cyB1bnRvdWNoZWQgZm9yIG5vdwogCSAqLwogCW1mc3ByCXIzLFNQUk5fTFBDUgotCW9yaQlyMyxyMywoTFBDUl9MUEVTMHxMUENSX0xQRVMxKQotCXhvcmkJcjMscjMsIExQQ1JfTFBFUzAKKwlsaQlyNSwxCisJcmxkaW1pCXIzLHI1LCBMUENSX0xQRVNfU0gsIDY0LUxQQ1JfTFBFU19TSC0yCiAJb3JpCXIzLHIzLChMUENSX1BFQ0UwfExQQ1JfUEVDRTF8TFBDUl9QRUNFMikKLQlsaQlyNSw3Ci0Jc2xkaQlyNSxyNSxMUENSX0RQRkRfU0gKLQlhbmRjCXIzLHIzLHI1CiAJbGkJcjUsNAotCXNsZGkJcjUscjUsTFBDUl9EUEZEX1NICi0Jb3IJcjMscjMscjUKKwlybGRpbWkJcjMscjUsIExQQ1JfRFBGRF9TSCwgNjQtTFBDUl9EUEZEX1NILTMKKwljbHJyZGkJcjMscjMsMQkJLyogY2xlYXIgSERJQ0UgKi8KKwlsaQlyNSw0CisJcmxkaW1pCXIzLHI1LCBMUENSX1ZDX1NILCAwCisJbGkJcjUsMHgxMAorCXJsZGltaQlyMyxyNSwgTFBDUl9WUk1BU0RfU0gsIDY0LUxQQ1JfVlJNQVNEX1NILTUKIAltdHNwcglTUFJOX0xQQ1IscjMKIAlpc3luYwogCWJscgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcHBjOTcwLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wcGM5NzAuUwppbmRleCAyN2YyNTA3Li4xMmZhYzhkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wcGM5NzAuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wcGM5NzAuUwpAQCAtNzYsNyArNzYsNyBAQAogCS8qIERvIG5vdGhpbmcgaWYgbm90IHJ1bm5pbmcgaW4gSFYgbW9kZSAqLwogCW1mbXNyCXIwCiAJcmxkaWNsLglyMCxyMCw0LDYzCi0JYmVxbHIKKwliZXEJbm9faHZfbW9kZQogCiAJbWZzcHIJcjAsU1BSTl9ISUQwCiAJbGkJcjExLDUJCQkvKiBjbGVhciBET1pFIGFuZCBTTEVFUCAqLwpAQCAtOTAsNyArOTAsNyBAQAogCS8qIERvIG5vdGhpbmcgaWYgbm90IHJ1bm5pbmcgaW4gSFYgbW9kZSAqLwogCW1mbXNyCXIwCiAJcmxkaWNsLglyMCxyMCw0LDYzCi0JYmVxbHIKKwliZXEJbm9faHZfbW9kZQogCiAJbWZzcHIJcjAsU1BSTl9ISUQwCiAJbGkJcjExLDB4MTUJCS8qIGNsZWFyIERPWkUgYW5kIFNMRUVQICovCkBAIC0xMDksNiArMTA5LDE0IEBACiAJc3luYwogCWlzeW5jCiAKKwkvKiBUcnkgdG8gc2V0IExQRVMgPSAwMSBpbiBISUQ0ICovCisJbWZzcHIJcjAsU1BSTl9ISUQ0CisJY2xybGRpCXIwLHIwLDEJCQkvKiBjbGVhciBMUEVTMCAqLworCW9yaQlyMCxyMCxISUQ0X0xQRVMxCS8qIHNldCBMUEVTMSAqLworCXN5bmMKKwltdHNwcglTUFJOX0hJRDQscjAKKwlpc3luYworCiAJLyogU2F2ZSBhd2F5IGNwdSBzdGF0ZSAqLwogCUxPQURfUkVHX0FERFIocjUsY3B1X3N0YXRlX3N0b3JhZ2UpCiAKQEAgLTExNywxMSArMTI1LDIxIEBACiAJc3RkCXIzLENTX0hJRDAocjUpCiAJbWZzcHIJcjMsU1BSTl9ISUQxCiAJc3RkCXIzLENTX0hJRDEocjUpCi0JbWZzcHIJcjMsU1BSTl9ISUQ0Ci0Jc3RkCXIzLENTX0hJRDQocjUpCisJbWZzcHIJcjQsU1BSTl9ISUQ0CisJc3RkCXI0LENTX0hJRDQocjUpCiAJbWZzcHIJcjMsU1BSTl9ISUQ1CiAJc3RkCXIzLENTX0hJRDUocjUpCiAKKwkvKiBTZWUgaWYgd2Ugc3VjY2Vzc2Z1bGx5IHNldCBMUEVTMSB0byAxOyBpZiBub3Qgd2UgYXJlIGluIEFwcGxlIG1vZGUgKi8KKwlhbmRpLglyNCxyNCxISUQ0X0xQRVMxCisJYm5lbHIKKworbm9faHZfbW9kZToKKwkvKiBEaXNhYmxlIENQVV9GVFJfSFZNT0RFIGFuZCBleGl0LCBzaW5jZSB3ZSBkb24ndCBoYXZlIEhWIG1vZGUgKi8KKwlsZAlyNSxDUFVfU1BFQ19GRUFUVVJFUyhyNCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjYsQ1BVX0ZUUl9IVk1PREUpCisJYW5kYwlyNSxyNSxyNgorCXN0ZAlyNSxDUFVfU1BFQ19GRUFUVVJFUyhyNCkKIAlibHIKIAogLyogQ2FsbGVkIHdpdGggbm8gTU1VIGNvbnRleHQgKHR5cGljYWxseSBNU1I6SVIvRFIgb2ZmKSB0bwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IDM0ZDI3MjIuLjlmYjkzMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKQEAgLTE5NzksNyArMTk3OSw3IEBACiAJCS5wdnJfdmFsdWUJCT0gMHg4MDI0MDAwMCwKIAkJLmNwdV9uYW1lCQk9ICJlNTUwMCIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfRTU1MDAsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSB8IFBQQ19GRUFUVVJFX0hBU19GUFUsCiAJCS5tbXVfZmVhdHVyZXMJCT0gTU1VX0ZUUl9UWVBFX0ZTTF9FIHwgTU1VX0ZUUl9CSUdfUEhZUyB8CiAJCQlNTVVfRlRSX1VTRV9UTEJJTFgsCiAJCS5pY2FjaGVfYnNpemUJCT0gNjQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMKaW5kZXggNGU2ZWU5NC4uY2M2YTlkNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYwpAQCAtMjQyLDEyICsyNDIsOCBAQAogCiAJCXdoaWxlIChwYWNhW2ldLmtleGVjX3N0YXRlIDwgS0VYRUNfU1RBVEVfUkVBTF9NT0RFKSB7CiAJCQliYXJyaWVyKCk7Ci0JCQlpZiAoIWNwdV9wb3NzaWJsZShpKSkgeworCQkJaWYgKCFjcHVfcG9zc2libGUoaSkgfHwgIWNwdV9vbmxpbmUoaSkgfHwgKG1zZWNzIDw9IDApKQogCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCFjcHVfb25saW5lKGkpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9CiAJCQltc2Vjcy0tOwogCQkJbWRlbGF5KDEpOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEuYwppbmRleCBkMjM4YzA4Li40ZjA5NTlmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLmMKQEAgLTE2MSw5ICsxNjEsNyBAQAogCiAJaWYgKHBwY19tZC5kbWFfc2V0X21hc2spCiAJCXJldHVybiBwcGNfbWQuZG1hX3NldF9tYXNrKGRldiwgZG1hX21hc2spOwotCWlmICh1bmxpa2VseShkbWFfb3BzID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTzsKLQlpZiAoZG1hX29wcy0+c2V0X2RtYV9tYXNrICE9IE5VTEwpCisJaWYgKChkbWFfb3BzICE9IE5VTEwpICYmIChkbWFfb3BzLT5zZXRfZG1hX21hc2sgIT0gTlVMTCkpCiAJCXJldHVybiBkbWFfb3BzLT5zZXRfZG1hX21hc2soZGV2LCBkbWFfbWFzayk7CiAJaWYgKCFkZXYtPmRtYV9tYXNrIHx8ICFkbWFfc3VwcG9ydGVkKGRldiwgZG1hX21hc2spKQogCQlyZXR1cm4gLUVJTzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZTUwMC1wbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZTUwMC1wbXUuYwppbmRleCBiMTUwYjUxLi5jYjJlMjk0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2U1MDAtcG11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lNTAwLXBtdS5jCkBAIC03NSw2ICs3NSwxMSBAQAogCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCiAJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJfSwKIAl9LAorCVtDKE5PREUpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJLTEsCQktMSAJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCX0sCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgbnVtX2V2ZW50cyA9IDEyODsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NGUuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NGUuUwppbmRleCBkMjRkNDQwLi40Mjk5ODNjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRlLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0ZS5TCkBAIC0xMjAsNiArMTIwLDEyIEBACiAJc3RkCXIxNCxQQUNBX0VYTUMrRVhfUjE0KHIxMyk7CQkJCSAgICBcCiAJc3RkCXIxNSxQQUNBX0VYTUMrRVhfUjE1KHIxMykKIAorI2RlZmluZSBQUk9MT0dfQURESVRJT05fRE9PUkJFTExfR0VOCQkJCQkgICAgXAorCWxieglyMTEsUEFDQVNPRlRJUlFFTihyMTMpOyAvKiBhcmUgaXJxcyBzb2Z0LWRpc2FibGVkID8gKi8JICAgIFwKKwljbXB3aQljcjAscjExLDA7CQkvKiB5ZXMgLT4gZ28gb3V0IG9mIGxpbmUgKi8JICAgIFwKKwliZXEJbWFza2VkX2Rvb3JiZWxsX2Jvb2szZQorCisKIC8qIENvcmUgZXhjZXB0aW9uIGNvZGUgZm9yIGFsbCBleGNlcHRpb25zIGV4Y2VwdCBUTEIgbWlzc2VzLgogICogWFhYOiBOZWVkcyB0byBtYWtlIFNQUk5fU1BSR19HRU4gZGVwZW5kIG9uIGV4Y2VwdGlvbiB0eXBlCiAgKi8KQEAgLTUyMiw3ICs1MjgsMTMgQEAKIAlNQVNLQUJMRV9FWENFUFRJT04oMHgyNjAsIHBlcmZtb24sIC5wZXJmb3JtYW5jZV9tb25pdG9yX2V4Y2VwdGlvbiwgQUNLX05PTkUpCiAKIC8qIERvb3JiZWxsIGludGVycnVwdCAqLwotCU1BU0tBQkxFX0VYQ0VQVElPTigweDIwNzAsIGRvb3JiZWxsLCAuZG9vcmJlbGxfZXhjZXB0aW9uLCBBQ0tfTk9ORSkKKwlTVEFSVF9FWENFUFRJT04oZG9vcmJlbGwpCisJTk9STUFMX0VYQ0VQVElPTl9QUk9MT0coMHgyMDcwLCBQUk9MT0dfQURESVRJT05fRE9PUkJFTEwpCisJRVhDRVBUSU9OX0NPTU1PTigweDIwNzAsIFBBQ0FfRVhHRU4sIElOVFNfRElTQUJMRV9BTEwpCisJQ0hFQ0tfTkFQUElORygpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWJsCS5kb29yYmVsbF9leGNlcHRpb24KKwliCS5yZXRfZnJvbV9leGNlcHRfbGl0ZQogCiAvKiBEb29yYmVsbCBjcml0aWNhbCBJbnRlcnJ1cHQgKi8KIAlTVEFSVF9FWENFUFRJT04oZG9vcmJlbGxfY3JpdCk7CkBAIC01NDUsOCArNTU3LDE2IEBACiAgKiBBbiBpbnRlcnJ1cHQgY2FtZSBpbiB3aGlsZSBzb2Z0LWRpc2FibGVkOyBjbGVhciBFRSBpbiBTUlIxLAogICogY2xlYXIgcGFjYS0+aGFyZF9lbmFibGVkIGFuZCByZXR1cm4uCiAgKi8KK21hc2tlZF9kb29yYmVsbF9ib29rM2U6CisJbXRjcglyMTAKKwkvKiBSZXNlbmQgdGhlIGRvb3JiZWxsIHRvIGZpcmUgYWdhaW4gd2hlbiBpbnRzIGVuYWJsZWQgKi8KKwltZnNwcglyMTAsU1BSTl9QSVIKKwlQUENfTVNHU05EKHIxMCkKKwliCW1hc2tlZF9pbnRlcnJ1cHRfYm9vazNlX2NvbW1vbgorCiBtYXNrZWRfaW50ZXJydXB0X2Jvb2szZToKIAltdGNyCXIxMAorbWFza2VkX2ludGVycnVwdF9ib29rM2VfY29tbW9uOgogCXN0YglyMTEsUEFDQUhBUkRJUlFFTihyMTMpCiAJbWZzcHIJcjEwLFNQUk5fU1JSMQogCXJsZGljbAlyMTEscjEwLDQ4LDEJCS8qIGNsZWFyIE1TUl9FRSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCmluZGV4IGE4NWY0ODcuLjQxYjAyYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKQEAgLTQwLDcgKzQwLDYgQEAKIAkuZ2xvYmwgc3lzdGVtX3Jlc2V0X3BTZXJpZXM7CiBzeXN0ZW1fcmVzZXRfcFNlcmllczoKIAlITVRfTUVESVVNOwotCURPX0tWTQkweDEwMDsKIAlTRVRfU0NSQVRDSDAocjEzKQogI2lmZGVmIENPTkZJR19QUENfUDdfTkFQCiBCRUdJTl9GVFJfU0VDVElPTgpAQCAtNTAsODIgKzQ5LDczIEBACiAJICogc3RhdGUgbG9zcyBhdCB0aGlzIHRpbWUuCiAJICovCiAJbWZzcHIJcjEzLFNQUk5fU1JSMQotCXJsd2lubQlyMTMscjEzLDQ3LTMxLDMwLDMxCi0JY21wd2kJY3IwLHIxMywxCi0JYm5lCTFmCi0JYgkucG93ZXI3X3dha2V1cF9ub2xvc3MKLTE6CWNtcHdpCWNyMCxyMTMsMgotCWJuZQkxZgotCWIJLnBvd2VyN193YWtldXBfbG9zcworCXJsd2lubS4JcjEzLHIxMyw0Ny0zMSwzMCwzMQorCWJlcQk5ZgorCisJLyogd2FraW5nIHVwIGZyb20gcG93ZXJzYXZlIChuYXApIHN0YXRlICovCisJY21wd2kJY3IxLHIxMywyCiAJLyogVG90YWwgbG9zcyBvZiBIViBzdGF0ZSBpcyBmYXRhbCwgd2UgY291bGQgdHJ5IHRvIHVzZSB0aGUKIAkgKiBQSVIgdG8gbG9jYXRlIGEgUEFDQSwgdGhlbiB1c2UgYW4gZW1lcmdlbmN5IHN0YWNrIGV0Yy4uLgogCSAqIGJ1dCBmb3Igbm93LCBsZXQncyBqdXN0IHN0YXkgc3R1Y2sgaGVyZQogCSAqLwotMToJY21wd2kJY3IwLHIxMywzCi0JYmVxCS4KLUVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0hWTU9ERV8yMDYpCisJYmd0CWNyMSwuCisJR0VUX1BBQ0EocjEzKQorCisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSFYKKwlsYnoJcjAsUEFDQVBST0NTVEFSVChyMTMpCisJY21wd2kJcjAsMHg4MAorCWJuZQkxZgorCWxpCXIwLDAKKwlzdGIJcjAsUEFDQVBST0NTVEFSVChyMTMpCisJYglrdm1fc3RhcnRfZ3Vlc3QKKzE6CisjZW5kaWYKKworCWJlcQljcjEsMmYKKwliCS5wb3dlcjdfd2FrZXVwX25vbG9zcworMjoJYgkucG93ZXI3X3dha2V1cF9sb3NzCis5OgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfSFZNT0RFIHwgQ1BVX0ZUUl9BUkNIXzIwNikKICNlbmRpZiAvKiBDT05GSUdfUFBDX1A3X05BUCAqLwotCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBzeXN0ZW1fcmVzZXRfY29tbW9uLCBFWENfU1REKQorCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBzeXN0ZW1fcmVzZXRfY29tbW9uLCBFWENfU1RELAorCQkJCSBOT1RFU1QsIDB4MTAwKQogCiAJLiA9IDB4MjAwCi1fbWFjaGluZV9jaGVja19wU2VyaWVzOgotCUhNVF9NRURJVU0KLQlET19LVk0JMHgyMDAKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYTUMsIG1hY2hpbmVfY2hlY2tfY29tbW9uLCBFWENfU1REKQorbWFjaGluZV9jaGVja19wU2VyaWVzXzE6CisJLyogVGhpcyBpcyBtb3ZlZCBvdXQgb2YgbGluZSBhcyBpdCBjYW4gYmUgcGF0Y2hlZCBieSBGVywgYnV0CisJICogc29tZSBjb2RlIHBhdGggbWlnaHQgc3RpbGwgd2FudCB0byBicmFuY2ggaW50byB0aGUgb3JpZ2luYWwKKwkgKiB2ZWN0b3IKKwkgKi8KKwliCW1hY2hpbmVfY2hlY2tfcFNlcmllcwogCiAJLiA9IDB4MzAwCiAJLmdsb2JsIGRhdGFfYWNjZXNzX3BTZXJpZXMKIGRhdGFfYWNjZXNzX3BTZXJpZXM6CiAJSE1UX01FRElVTQotCURPX0tWTQkweDMwMAogCVNFVF9TQ1JBVENIMChyMTMpCisjaWZuZGVmIENPTkZJR19QT1dFUjRfT05MWQogQkVHSU5fRlRSX1NFQ1RJT04KLQlHRVRfUEFDQShyMTMpCi0Jc3RkCXI5LFBBQ0FfRVhTTEIrRVhfUjkocjEzKQotCXN0ZAlyMTAsUEFDQV9FWFNMQitFWF9SMTAocjEzKQotCW1mc3ByCXIxMCxTUFJOX0RBUgotCW1mc3ByCXI5LFNQUk5fRFNJU1IKLQlzcmRpCXIxMCxyMTAsNjAKLQlybHdpbWkJcjEwLHI5LDE2LDB4MjAKLQltZmNyCXI5Ci0JY21wd2kJcjEwLDB4MmMKLQliZXEJZG9fc3RhYl9ib2x0ZWRfcFNlcmllcwotCWxkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMChyMTMpCi0Jc3RkCXIxMSxQQUNBX0VYR0VOK0VYX1IxMShyMTMpCi0JbGQJcjExLFBBQ0FfRVhTTEIrRVhfUjkocjEzKQotCXN0ZAlyMTIsUEFDQV9FWEdFTitFWF9SMTIocjEzKQotCUdFVF9TQ1JBVENIMChyMTIpCi0Jc3RkCXIxMCxQQUNBX0VYR0VOK0VYX1IxMChyMTMpCi0Jc3RkCXIxMSxQQUNBX0VYR0VOK0VYX1I5KHIxMykKLQlzdGQJcjEyLFBBQ0FfRVhHRU4rRVhfUjEzKHIxMykKLQlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMShkYXRhX2FjY2Vzc19jb21tb24sIEVYQ19TVEQpCi1GVFJfU0VDVElPTl9FTFNFCi0JRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhHRU4sIGRhdGFfYWNjZXNzX2NvbW1vbiwgRVhDX1NURCkKLUFMVF9NTVVfRlRSX1NFQ1RJT05fRU5EX0lGQ0xSKE1NVV9GVFJfU0xCKQorCWIJZGF0YV9hY2Nlc3NfY2hlY2tfc3RhYgorZGF0YV9hY2Nlc3Nfbm90X3N0YWI6CitFTkRfTU1VX0ZUUl9TRUNUSU9OX0lGQ0xSKE1NVV9GVFJfU0xCKQorI2VuZGlmCisJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhHRU4sIGRhdGFfYWNjZXNzX2NvbW1vbiwgRVhDX1NURCwKKwkJCQkgS1ZNVEVTVF9QUiwgMHgzMDApCiAKIAkuID0gMHgzODAKIAkuZ2xvYmwgZGF0YV9hY2Nlc3Nfc2xiX3BTZXJpZXMKIGRhdGFfYWNjZXNzX3NsYl9wU2VyaWVzOgogCUhNVF9NRURJVU0KLQlET19LVk0JMHgzODAKIAlTRVRfU0NSQVRDSDAocjEzKQotCUdFVF9QQUNBKHIxMykKKwlFWENFUFRJT05fUFJPTE9HXzEoUEFDQV9FWFNMQiwgS1ZNVEVTVF9QUiwgMHgzODApCiAJc3RkCXIzLFBBQ0FfRVhTTEIrRVhfUjMocjEzKQogCW1mc3ByCXIzLFNQUk5fREFSCi0Jc3RkCXI5LFBBQ0FfRVhTTEIrRVhfUjkocjEzKQkvKiBzYXZlIHI5IC0gcjEyICovCi0JbWZjcglyOQogI2lmZGVmIF9fRElTQUJMRURfXwogCS8qIEtlZXAgdGhhdCBhcm91bmQgZm9yIHdoZW4gd2UgcmUtaW1wbGVtZW50IGR5bmFtaWMgVlNJRHMgKi8KIAljbXBkaQlyMywwCiAJYmdlCXNsYl9taXNzX3VzZXJfcHNlcmllcwogI2VuZGlmIC8qIF9fRElTQUJMRURfXyAqLwotCXN0ZAlyMTAsUEFDQV9FWFNMQitFWF9SMTAocjEzKQotCXN0ZAlyMTEsUEFDQV9FWFNMQitFWF9SMTEocjEzKQotCXN0ZAlyMTIsUEFDQV9FWFNMQitFWF9SMTIocjEzKQotCUdFVF9TQ1JBVENIMChyMTApCi0Jc3RkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMyhyMTMpCi0JbWZzcHIJcjEyLFNQUk5fU1JSMQkJLyogYW5kIFNSUjEgKi8KKwltZnNwcglyMTIsU1BSTl9TUlIxCiAjaWZuZGVmIENPTkZJR19SRUxPQ0FUQUJMRQogCWIJLnNsYl9taXNzX3JlYWxtb2RlCiAjZWxzZQpAQCAtMTQ3LDI0ICsxMzcsMTYgQEAKIAkuZ2xvYmwgaW5zdHJ1Y3Rpb25fYWNjZXNzX3NsYl9wU2VyaWVzCiBpbnN0cnVjdGlvbl9hY2Nlc3Nfc2xiX3BTZXJpZXM6CiAJSE1UX01FRElVTQotCURPX0tWTQkweDQ4MAogCVNFVF9TQ1JBVENIMChyMTMpCi0JR0VUX1BBQ0EocjEzKQorCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYU0xCLCBLVk1URVNUX1BSLCAweDQ4MCkKIAlzdGQJcjMsUEFDQV9FWFNMQitFWF9SMyhyMTMpCiAJbWZzcHIJcjMsU1BSTl9TUlIwCQkvKiBTUlIwIGlzIGZhdWx0aW5nIGFkZHJlc3MgKi8KLQlzdGQJcjksUEFDQV9FWFNMQitFWF9SOShyMTMpCS8qIHNhdmUgcjkgLSByMTIgKi8KLQltZmNyCXI5CiAjaWZkZWYgX19ESVNBQkxFRF9fCiAJLyogS2VlcCB0aGF0IGFyb3VuZCBmb3Igd2hlbiB3ZSByZS1pbXBsZW1lbnQgZHluYW1pYyBWU0lEcyAqLwogCWNtcGRpCXIzLDAKIAliZ2UJc2xiX21pc3NfdXNlcl9wc2VyaWVzCiAjZW5kaWYgLyogX19ESVNBQkxFRF9fICovCi0Jc3RkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMChyMTMpCi0Jc3RkCXIxMSxQQUNBX0VYU0xCK0VYX1IxMShyMTMpCi0Jc3RkCXIxMixQQUNBX0VYU0xCK0VYX1IxMihyMTMpCi0JR0VUX1NDUkFUQ0gwKHIxMCkKLQlzdGQJcjEwLFBBQ0FfRVhTTEIrRVhfUjEzKHIxMykKLQltZnNwcglyMTIsU1BSTl9TUlIxCQkvKiBhbmQgU1JSMSAqLworCW1mc3ByCXIxMixTUFJOX1NSUjEKICNpZm5kZWYgQ09ORklHX1JFTE9DQVRBQkxFCiAJYgkuc2xiX21pc3NfcmVhbG1vZGUKICNlbHNlCkBAIC0xODQsMjYgKzE2Niw0NiBAQAogaGFyZHdhcmVfaW50ZXJydXB0X3BTZXJpZXM6CiBoYXJkd2FyZV9pbnRlcnJ1cHRfaHY6CiAJQkVHSU5fRlRSX1NFQ1RJT04KLQkJX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKDB4NTAwLCBoYXJkd2FyZV9pbnRlcnJ1cHQsIEVYQ19TVEQpCisJCV9NQVNLQUJMRV9FWENFUFRJT05fUFNFUklFUygweDUwMiwgaGFyZHdhcmVfaW50ZXJydXB0LAorCQkJCQkgICAgRVhDX0hWLCBTT0ZURU5fVEVTVF9IVikKKwkJS1ZNX0hBTkRMRVIoUEFDQV9FWEdFTiwgRVhDX0hWLCAweDUwMikKIAlGVFJfU0VDVElPTl9FTFNFCi0JCV9NQVNLQUJMRV9FWENFUFRJT05fUFNFUklFUygweDUwMiwgaGFyZHdhcmVfaW50ZXJydXB0LCBFWENfSFYpCi0JQUxUX0ZUUl9TRUNUSU9OX0VORF9JRkNMUihDUFVfRlRSX0hWTU9ERV8yMDYpCisJCV9NQVNLQUJMRV9FWENFUFRJT05fUFNFUklFUygweDUwMCwgaGFyZHdhcmVfaW50ZXJydXB0LAorCQkJCQkgICAgRVhDX1NURCwgU09GVEVOX1RFU1RfSFZfMjAxKQorCQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfU1RELCAweDUwMCkKKwlBTFRfRlRSX1NFQ1RJT05fRU5EX0lGU0VUKENQVV9GVFJfSFZNT0RFIHwgQ1BVX0ZUUl9BUkNIXzIwNikKIAogCVNURF9FWENFUFRJT05fUFNFUklFUygweDYwMCwgMHg2MDAsIGFsaWdubWVudCkKKwlLVk1fSEFORExFUl9QUihQQUNBX0VYR0VOLCBFWENfU1RELCAweDYwMCkKKwogCVNURF9FWENFUFRJT05fUFNFUklFUygweDcwMCwgMHg3MDAsIHByb2dyYW1fY2hlY2spCisJS1ZNX0hBTkRMRVJfUFIoUEFDQV9FWEdFTiwgRVhDX1NURCwgMHg3MDApCisKIAlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHg4MDAsIDB4ODAwLCBmcF91bmF2YWlsYWJsZSkKKwlLVk1fSEFORExFUl9QUihQQUNBX0VYR0VOLCBFWENfU1RELCAweDgwMCkKIAogCU1BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKDB4OTAwLCAweDkwMCwgZGVjcmVtZW50ZXIpCi0JTUFTS0FCTEVfRVhDRVBUSU9OX0hWKDB4OTgwLCAweDk4MCwgZGVjcmVtZW50ZXIpCisJTUFTS0FCTEVfRVhDRVBUSU9OX0hWKDB4OTgwLCAweDk4MiwgZGVjcmVtZW50ZXIpCiAKIAlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHhhMDAsIDB4YTAwLCB0cmFwXzBhKQorCUtWTV9IQU5ETEVSX1BSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4YTAwKQorCiAJU1REX0VYQ0VQVElPTl9QU0VSSUVTKDB4YjAwLCAweGIwMCwgdHJhcF8wYikKKwlLVk1fSEFORExFUl9QUihQQUNBX0VYR0VOLCBFWENfU1RELCAweGIwMCkKIAogCS4gPSAweGMwMAogCS5nbG9ibAlzeXN0ZW1fY2FsbF9wU2VyaWVzCiBzeXN0ZW1fY2FsbF9wU2VyaWVzOgogCUhNVF9NRURJVU0KLQlET19LVk0JMHhjMDAKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSCisJU0VUX1NDUkFUQ0gwKHIxMykKKwlHRVRfUEFDQShyMTMpCisJc3RkCXI5LFBBQ0FfRVhHRU4rRVhfUjkocjEzKQorCXN0ZAlyMTAsUEFDQV9FWEdFTitFWF9SMTAocjEzKQorCW1mY3IJcjkKKwlLVk1URVNUKDB4YzAwKQorCUdFVF9TQ1JBVENIMChyMTMpCisjZW5kaWYKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJY21wZGkJcjAsMHgxZWJlCiAJYmVxLQkxZgpAQCAtMjIwLDYgKzIyMiw4IEBACiAJcmZpZAogCWIJLgkvKiBwcmV2ZW50IHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiAqLwogCisJS1ZNX0hBTkRMRVIoUEFDQV9FWEdFTiwgRVhDX1NURCwgMHhjMDApCisKIC8qIEZhc3QgTEUvQkUgc3dpdGNoIHN5c3RlbSBjYWxsICovCiAxOgltZnNwcglyMTIsU1BSTl9TUlIxCiAJeG9yaQlyMTIscjEyLE1TUl9MRQpAQCAtMjI4LDYgKzIzMiw3IEBACiAJYgkuCiAKIAlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHhkMDAsIDB4ZDAwLCBzaW5nbGVfc3RlcCkKKwlLVk1fSEFORExFUl9QUihQQUNBX0VYR0VOLCBFWENfU1RELCAweGQwMCkKIAogCS8qIEF0IDB4ZT8/PyB3ZSBoYXZlIGEgYnVuY2ggb2YgaHlwZXJ2aXNvciBleGNlcHRpb25zLCB3ZSBicmFuY2gKIAkgKiBvdXQgb2YgbGluZSB0byBoYW5kbGUgdGhlbQpAQCAtMjYyLDMwICsyNjcsOTMgQEAKIAogI2lmZGVmIENPTkZJR19DQkVfUkFTCiAJU1REX0VYQ0VQVElPTl9IVigweDEyMDAsIDB4MTIwMiwgY2JlX3N5c3RlbV9lcnJvcikKKwlLVk1fSEFORExFUl9QUl9TS0lQKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHgxMjAyKQogI2VuZGlmIC8qIENPTkZJR19DQkVfUkFTICovCisKIAlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHgxMzAwLCAweDEzMDAsIGluc3RydWN0aW9uX2JyZWFrcG9pbnQpCisJS1ZNX0hBTkRMRVJfUFJfU0tJUChQQUNBX0VYR0VOLCBFWENfU1RELCAweDEzMDApCisKICNpZmRlZiBDT05GSUdfQ0JFX1JBUwogCVNURF9FWENFUFRJT05fSFYoMHgxNjAwLCAweDE2MDIsIGNiZV9tYWludGVuYW5jZSkKKwlLVk1fSEFORExFUl9QUl9TS0lQKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHgxNjAyKQogI2VuZGlmIC8qIENPTkZJR19DQkVfUkFTICovCisKIAlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHgxNzAwLCAweDE3MDAsIGFsdGl2ZWNfYXNzaXN0KQorCUtWTV9IQU5ETEVSX1BSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4MTcwMCkKKwogI2lmZGVmIENPTkZJR19DQkVfUkFTCiAJU1REX0VYQ0VQVElPTl9IVigweDE4MDAsIDB4MTgwMiwgY2JlX3RoZXJtYWwpCisJS1ZNX0hBTkRMRVJfUFJfU0tJUChQQUNBX0VYR0VOLCBFWENfSFYsIDB4MTgwMikKICNlbmRpZiAvKiBDT05GSUdfQ0JFX1JBUyAqLwogCiAJLiA9IDB4MzAwMAogCiAvKioqIE91dCBvZiBsaW5lIGludGVycnVwdHMgc3VwcG9ydCAqKiovCiAKKwkvKiBtb3ZlZCBmcm9tIDB4MjAwICovCittYWNoaW5lX2NoZWNrX3BTZXJpZXM6CisJLmdsb2JsIG1hY2hpbmVfY2hlY2tfZndubWkKK21hY2hpbmVfY2hlY2tfZndubWk6CisJSE1UX01FRElVTQorCVNFVF9TQ1JBVENIMChyMTMpCQkvKiBzYXZlIHIxMyAqLworCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYTUMsIG1hY2hpbmVfY2hlY2tfY29tbW9uLAorCQkJCSBFWENfU1RELCBLVk1URVNULCAweDIwMCkKKwlLVk1fSEFORExFUl9TS0lQKFBBQ0FfRVhNQywgRVhDX1NURCwgMHgyMDApCisKKyNpZm5kZWYgQ09ORklHX1BPV0VSNF9PTkxZCisJLyogbW92ZWQgZnJvbSAweDMwMCAqLworZGF0YV9hY2Nlc3NfY2hlY2tfc3RhYjoKKwlHRVRfUEFDQShyMTMpCisJc3RkCXI5LFBBQ0FfRVhTTEIrRVhfUjkocjEzKQorCXN0ZAlyMTAsUEFDQV9FWFNMQitFWF9SMTAocjEzKQorCW1mc3ByCXIxMCxTUFJOX0RBUgorCW1mc3ByCXI5LFNQUk5fRFNJU1IKKwlzcmRpCXIxMCxyMTAsNjAKKwlybHdpbWkJcjEwLHI5LDE2LDB4MjAKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19QUgorCWxieglyOSxIU1RBVEVfSU5fR1VFU1QocjEzKQorCXJsd2ltaQlyMTAscjksOCwweDMwMAorI2VuZGlmCisJbWZjcglyOQorCWNtcHdpCXIxMCwweDJjCisJYmVxCWRvX3N0YWJfYm9sdGVkX3BTZXJpZXMKKwltdGNyZgkweDgwLHI5CisJbGQJcjksUEFDQV9FWFNMQitFWF9SOShyMTMpCisJbGQJcjEwLFBBQ0FfRVhTTEIrRVhfUjEwKHIxMykKKwliCWRhdGFfYWNjZXNzX25vdF9zdGFiCitkb19zdGFiX2JvbHRlZF9wU2VyaWVzOgorCXN0ZAlyMTEsUEFDQV9FWFNMQitFWF9SMTEocjEzKQorCXN0ZAlyMTIsUEFDQV9FWFNMQitFWF9SMTIocjEzKQorCUdFVF9TQ1JBVENIMChyMTApCisJc3RkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMyhyMTMpCisJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTXzEoLmRvX3N0YWJfYm9sdGVkLCBFWENfU1REKQorI2VuZGlmIC8qIENPTkZJR19QT1dFUjRfT05MWSAqLworCisJS1ZNX0hBTkRMRVJfUFJfU0tJUChQQUNBX0VYR0VOLCBFWENfU1RELCAweDMwMCkKKwlLVk1fSEFORExFUl9QUl9TS0lQKFBBQ0FfRVhTTEIsIEVYQ19TVEQsIDB4MzgwKQorCUtWTV9IQU5ETEVSX1BSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4NDAwKQorCUtWTV9IQU5ETEVSX1BSKFBBQ0FfRVhTTEIsIEVYQ19TVEQsIDB4NDgwKQorCUtWTV9IQU5ETEVSX1BSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4OTAwKQorCUtWTV9IQU5ETEVSKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHg5ODIpCisKKwkuYWxpZ24JNwogCS8qIG1vdmVkIGZyb20gMHhlMDAgKi8KLQlTVERfRVhDRVBUSU9OX0hWKC4sIDB4ZTAwLCBoX2RhdGFfc3RvcmFnZSkKLQlTVERfRVhDRVBUSU9OX0hWKC4sIDB4ZTIwLCBoX2luc3RyX3N0b3JhZ2UpCi0JU1REX0VYQ0VQVElPTl9IViguLCAweGU0MCwgZW11bGF0aW9uX2Fzc2lzdCkKLQlTVERfRVhDRVBUSU9OX0hWKC4sIDB4ZTYwLCBobWlfZXhjZXB0aW9uKSAvKiBuZWVkIHRvIGZsdXNoIGNhY2hlID8gKi8KKwlTVERfRVhDRVBUSU9OX0hWKC4sIDB4ZTAyLCBoX2RhdGFfc3RvcmFnZSkKKwlLVk1fSEFORExFUl9TS0lQKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHhlMDIpCisJU1REX0VYQ0VQVElPTl9IViguLCAweGUyMiwgaF9pbnN0cl9zdG9yYWdlKQorCUtWTV9IQU5ETEVSKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHhlMjIpCisJU1REX0VYQ0VQVElPTl9IViguLCAweGU0MiwgZW11bGF0aW9uX2Fzc2lzdCkKKwlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfSFYsIDB4ZTQyKQorCVNURF9FWENFUFRJT05fSFYoLiwgMHhlNjIsIGhtaV9leGNlcHRpb24pIC8qIG5lZWQgdG8gZmx1c2ggY2FjaGUgPyAqLworCUtWTV9IQU5ETEVSKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHhlNjIpCiAKIAkvKiBtb3ZlZCBmcm9tIDB4ZjAwICovCiAJU1REX0VYQ0VQVElPTl9QU0VSSUVTKC4sIDB4ZjAwLCBwZXJmb3JtYW5jZV9tb25pdG9yKQorCUtWTV9IQU5ETEVSX1BSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4ZjAwKQogCVNURF9FWENFUFRJT05fUFNFUklFUyguLCAweGYyMCwgYWx0aXZlY191bmF2YWlsYWJsZSkKKwlLVk1fSEFORExFUl9QUihQQUNBX0VYR0VOLCBFWENfU1RELCAweGYyMCkKIAlTVERfRVhDRVBUSU9OX1BTRVJJRVMoLiwgMHhmNDAsIHZzeF91bmF2YWlsYWJsZSkKKwlLVk1fSEFORExFUl9QUihQQUNBX0VYR0VOLCBFWENfU1RELCAweGY0MCkKIAogLyoKICAqIEFuIGludGVycnVwdCBjYW1lIGluIHdoaWxlIHNvZnQtZGlzYWJsZWQ7IGNsZWFyIEVFIGluIFNSUjEsCkBAIC0zMTcsMTQgKzM4NSw2IEBACiAJaHJmaWQKIAliCS4KIAotCS5hbGlnbgk3Ci1kb19zdGFiX2JvbHRlZF9wU2VyaWVzOgotCXN0ZAlyMTEsUEFDQV9FWFNMQitFWF9SMTEocjEzKQotCXN0ZAlyMTIsUEFDQV9FWFNMQitFWF9SMTIocjEzKQotCUdFVF9TQ1JBVENIMChyMTApCi0Jc3RkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMyhyMTMpCi0JRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTXzEoLmRvX3N0YWJfYm9sdGVkLCBFWENfU1REKQotCiAjaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCiAvKgogICogVmVjdG9ycyBmb3IgdGhlIEZXTk1JIG9wdGlvbi4gIFNoYXJlIGNvbW1vbiBjb2RlLgpAQCAtMzM0LDE0ICszOTQsOCBAQAogc3lzdGVtX3Jlc2V0X2Z3bm1pOgogCUhNVF9NRURJVU0KIAlTRVRfU0NSQVRDSDAocjEzKQkJLyogc2F2ZSByMTMgKi8KLQlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWEdFTiwgc3lzdGVtX3Jlc2V0X2NvbW1vbiwgRVhDX1NURCkKLQotCS5nbG9ibCBtYWNoaW5lX2NoZWNrX2Z3bm1pCi0gICAgICAuYWxpZ24gNwotbWFjaGluZV9jaGVja19md25taToKLQlITVRfTUVESVVNCi0JU0VUX1NDUkFUQ0gwKHIxMykJCS8qIHNhdmUgcjEzICovCi0JRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhNQywgbWFjaGluZV9jaGVja19jb21tb24sIEVYQ19TVEQpCisJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhHRU4sIHN5c3RlbV9yZXNldF9jb21tb24sIEVYQ19TVEQsCisJCQkJIE5PVEVTVCwgMHgxMDApCiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BTRVJJRVMgKi8KIApAQCAtMzc2LDcgKzQzMCwxMSBAQAogLyogS1ZNJ3MgdHJhbXBvbGluZSBjb2RlIG5lZWRzIHRvIGJlIGNsb3NlIHRvIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KIAogI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hBTkRMRVIKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19QUgogI2luY2x1ZGUgIi4uL2t2bS9ib29rM3Nfcm1oYW5kbGVycy5TIgorI2Vsc2UKKyNpbmNsdWRlICIuLi9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUyIKKyNlbmRpZgogI2VuZGlmCiAKIAkuYWxpZ24JNwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQ0eC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQ0eC5TCmluZGV4IDVlMTJiNzQuLmY4ZTk3MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80NHguUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDR4LlMKQEAgLTkzLDYgKzkzLDMwIEBACiAKIAlibAllYXJseV9pbml0CiAKKyNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKKwkvKgorCSAqIHIyNSB3aWxsIGNvbnRhaW4gUlBOL0VSUE4gZm9yIHRoZSBzdGFydCBhZGRyZXNzIG9mIG1lbW9yeQorCSAqCisJICogQWRkIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gS0VSTkVMQkFTRSBhbmQgUEFHRV9PRkZTRVQgdG8gdGhlCisJICogc3RhcnQgb2YgcGh5c2ljYWwgbWVtb3J5IHRvIGdldCBrZXJuc3RhcnRfYWRkci4KKwkgKi8KKwlsaXMJcjMsa2VybnN0YXJ0X2FkZHJAaGEKKwlsYQlyMyxrZXJuc3RhcnRfYWRkckBsKHIzKQorCisJbGlzCXI0LEtFUk5FTEJBU0VAaAorCW9yaQlyNCxyNCxLRVJORUxCQVNFQGwKKwlsaXMJcjUsUEFHRV9PRkZTRVRAaAorCW9yaQlyNSxyNSxQQUdFX09GRlNFVEBsCisJc3ViZglyNCxyNSxyNAorCisJcmx3aW5tCXI2LHIyNSwwLDI4LDMxCS8qIEVSUE4gKi8KKwlybHdpbm0JcjcscjI1LDAsMCwzCS8qIFJQTiAtIGFzc3VtaW5nIDI1NiBNQiBwYWdlIHNpemUgKi8KKwlhZGQJcjcscjcscjQKKworCXN0dwlyNiwwKHIzKQorCXN0dwlyNyw0KHIzKQorI2VuZGlmCisKIC8qCiAgKiBEZWNpZGUgd2hhdCBzb3J0IG9mIG1hY2hpbmUgdGhpcyBpcyBhbmQgaW5pdGlhbGl6ZSB0aGUgTU1VLgogICovCkBAIC0xMDAxLDkgKzEwMjUsNiBAQAogCWxpcwlyMyxQQUdFX09GRlNFVEBoCiAJb3JpCXIzLHIzLFBBR0VfT0ZGU0VUQGwKIAotCS8qIEtlcm5lbCBpcyBhdCB0aGUgYmFzZSBvZiBSQU0gKi8KLQlsaSByNCwgMAkJCS8qIExvYWQgdGhlIGtlcm5lbCBwaHlzaWNhbCBhZGRyZXNzICovCi0KIAkvKiBMb2FkIHRoZSBrZXJuZWwgUElEID0gMCAqLwogCWxpCXIwLDAKIAltdHNwcglTUFJOX1BJRCxyMApAQCAtMTAxMyw5ICsxMDM0LDggQEAKIAljbHJyd2kJcjMscjMsMTIJCS8qIE1hc2sgb2ZmIHRoZSBlZmZlY3RpdmUgcGFnZSBudW1iZXIgKi8KIAlvcmkJcjMscjMsUFBDNDd4X1RMQjBfVkFMSUQgfCBQUEM0N3hfVExCMF8yNTZNCiAKLQkvKiBXb3JkIDEgKi8KLQljbHJyd2kJcjQscjQsMTIJCS8qIE1hc2sgb2ZmIHRoZSByZWFsIHBhZ2UgbnVtYmVyICovCi0JCQkJCS8qIEVSUE4gaXMgMCBmb3IgZmlyc3QgNEdCIHBhZ2UgKi8KKwkvKiBXb3JkIDEgLSB1c2UgcjI1LiAgUlBOIGlzIHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCBlbnRyeSAqLworCiAJLyogV29yZCAyICovCiAJbGkJcjUsMAogCW9yaQlyNSxyNSxQUEM0N3hfVExCMl9TX1JXWApAQCAtMTAyNiw3ICsxMDQ2LDcgQEAKIAkvKiBXZSB3cml0ZSB0byB3YXkgMCBhbmQgYm9sdGVkIDAgKi8KIAlsaXMJcjAsMHg4ODAwCiAJdGxid2UJcjMscjAsMAotCXRsYndlCXI0LHIwLDEKKwl0bGJ3ZQlyMjUscjAsMQogCXRsYndlCXI1LHIwLDIKIAogLyoKQEAgLTExMjQsNyArMTE0NCwxMyBAQAogCWxpcwlyNCxpbnRlcnJ1cHRfYmFzZUBoCS8qIElWUFIgb25seSB1c2VzIHRoZSBoaWdoIDE2LWJpdHMgKi8KIAltdHNwcglTUFJOX0lWUFIscjQKIAotCWFkZGlzCXIyMixyMjIsS0VSTkVMQkFTRUBoCisJLyoKKwkgKiBJZiB0aGUga2VybmVsIHdhcyBsb2FkZWQgYXQgYSBub24temVybyAyNTYgTUIgcGFnZSwgd2UgbmVlZCB0bworCSAqIG1hc2sgb2ZmIHRoZSBtb3N0IHNpZ25pZmljYW50IDQgYml0cyB0byBnZXQgdGhlIHJlbGF0aXZlIGFkZHJlc3MKKwkgKiBmcm9tIHRoZSBzdGFydCBvZiBwaHlzaWNhbCBtZW1vcnkKKwkgKi8KKwlybHdpbm0JcjIyLHIyMiwwLDQsMzEKKwlhZGRpcwlyMjIscjIyLFBBR0VfT0ZGU0VUQGgKIAltdGxyCXIyMgogCWlzeW5jCiAJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCmluZGV4IGJhNTA0MDkuLjM1NjRjNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCkBAIC0yNTUsNyArMjU1LDcgQEAKIAltdGN0cglyMjMKIAliY3RybAogCi0zOglMT0FEX1JFR19BRERSKHIzLCBib290X2NwdV9jb3VudCkgLyogRGVjcmVtZW50IGJvb3RfY3B1X2NvdW50ICovCiszOglMT0FEX1JFR19BRERSKHIzLCBzcGlubmluZ19zZWNvbmRhcmllcykgLyogRGVjcmVtZW50IHNwaW5uaW5nX3NlY29uZGFyaWVzICovCiAJbHdhcngJcjQsMCxyMwogCXN1YmkJcjQscjQsMQogCXN0d2N4LglyNCwwLHIzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfYm9va2UuaCBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9ib29rZS5oCmluZGV4IGEwYmYxNTguLmZjOTIxYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9ib29rZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9ib29rZS5oCkBAIC0yMCwzMyArMjAsNDMgQEAKIAlhZGRpCXJlZyxyZWcsdmFsQGwKICNlbmRpZgogCisvKgorICogTWFjcm8gdXNlZCB0byBnZXQgdG8gdGhyZWFkIHNhdmUgcmVnaXN0ZXJzLgorICogTm90ZSB0aGF0IGVudHJpZXMgMC0zIGFyZSB1c2VkIGZvciB0aGUgcHJvbG9nIGNvZGUsIGFuZCB0aGUgcmVtYWluaW5nCisgKiBlbnRyaWVzIGFyZSBhdmFpbGFibGUgZm9yIHNwZWNpZmljIGV4Y2VwdGlvbiB1c2UgaW4gdGhlIGV2ZW50IGEgaGFuZGxlcgorICogcmVxdWlyZXMgbW9yZSB0aGFuIDQgc2NyYXRjaCByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgVEhSRUFEX05PUk1TQVZFKG9mZnNldCkJKFRIUkVBRF9OT1JNU0FWRVMgKyAob2Zmc2V0ICogNCkpCisKICNkZWZpbmUgTk9STUFMX0VYQ0VQVElPTl9QUk9MT0cJCQkJCQkgICAgIFwKLQltdHNwcglTUFJOX1NQUkdfV1NDUkFUQ0gwLHIxMDsvKiBzYXZlIHR3byByZWdpc3RlcnMgdG8gd29yayB3aXRoICovXAotCW10c3ByCVNQUk5fU1BSR19XU0NSQVRDSDEscjExOwkJCQkgICAgIFwKLQltdHNwcglTUFJOX1NQUkdfV1NDUkFUQ0gyLHIxOwkJCQkJICAgICBcCi0JbWZjcglyMTA7CQkJLyogc2F2ZSBDUiBpbiByMTAgZm9yIG5vdwkgICAqL1wKKwltdHNwcglTUFJOX1NQUkdfV1NDUkFUQ0gwLCByMTA7CS8qIHNhdmUgb25lIHJlZ2lzdGVyICovCSAgICAgXAorCW1mc3ByCXIxMCwgU1BSTl9TUFJHX1RIUkVBRDsJCQkJCSAgICAgXAorCXN0dwlyMTEsIFRIUkVBRF9OT1JNU0FWRSgwKShyMTApOwkJCQkgICAgIFwKKwlzdHcJcjEzLCBUSFJFQURfTk9STVNBVkUoMikocjEwKTsJCQkJICAgICBcCisJbWZjcglyMTM7CQkJLyogc2F2ZSBDUiBpbiByMTMgZm9yIG5vdwkgICAqL1wKIAltZnNwcglyMTEsU1BSTl9TUlIxOwkJLyogY2hlY2sgd2hldGhlciB1c2VyIG9yIGtlcm5lbCAgICAqL1wKIAlhbmRpLglyMTEscjExLE1TUl9QUjsJCQkJCQkgICAgIFwKKwltcglyMTEsIHIxOwkJCQkJCSAgICAgXAogCWJlcQkxZjsJCQkJCQkJICAgICBcCi0JbWZzcHIJcjEsU1BSTl9TUFJHX1RIUkVBRDsJLyogaWYgZnJvbSB1c2VyLCBzdGFydCBhdCB0b3Agb2YgICAqL1wKLQlsd3oJcjEsVEhSRUFEX0lORk8tVEhSRUFEKHIxKTsgLyogdGhpcyB0aHJlYWQncyBrZXJuZWwgc3RhY2sgICAqL1wKLQlBTExPQ19TVEFDS19GUkFNRShyMSwgVEhSRUFEX1NJWkUpOwkJCQkgICAgIFwKLTE6CXN1YmkJcjEscjEsSU5UX0ZSQU1FX1NJWkU7CS8qIEFsbG9jYXRlIGFuIGV4Y2VwdGlvbiBmcmFtZSAgICAgKi9cCi0JbXIJcjExLHIxOwkJCQkJCQkgICAgIFwKLQlzdHcJcjEwLF9DQ1IocjExKTsgICAgICAgICAgLyogc2F2ZSB2YXJpb3VzIHJlZ2lzdGVycwkgICAqL1wKKwkvKiBpZiBmcm9tIHVzZXIsIHN0YXJ0IGF0IHRvcCBvZiB0aGlzIHRocmVhZCdzIGtlcm5lbCBzdGFjayAqLyAgICAgICBcCisJbHd6CXIxMSwgVEhSRUFEX0lORk8tVEhSRUFEKHIxMCk7CQkJCSAgICAgXAorCUFMTE9DX1NUQUNLX0ZSQU1FKHIxMSwgVEhSRUFEX1NJWkUpOwkJCQkgICAgIFwKKzEgOglzdWJpCXIxMSwgcjExLCBJTlRfRlJBTUVfU0laRTsgLyogQWxsb2NhdGUgZXhjZXB0aW9uIGZyYW1lICovICAgICBcCisJc3R3CXIxMywgX0NDUihyMTEpOwkJLyogc2F2ZSB2YXJpb3VzIHJlZ2lzdGVycyAqLwkgICAgIFwKIAlzdHcJcjEyLEdQUjEyKHIxMSk7CQkJCQkJICAgICBcCiAJc3R3CXI5LEdQUjkocjExKTsJCQkJCQkgICAgIFwKLQltZnNwcglyMTAsU1BSTl9TUFJHX1JTQ1JBVENIMDsJCQkJCVwKLQlzdHcJcjEwLEdQUjEwKHIxMSk7CQkJCQkJICAgICBcCi0JbWZzcHIJcjEyLFNQUk5fU1BSR19SU0NSQVRDSDE7CQkJCSAgICAgXAorCW1mc3ByCXIxMywgU1BSTl9TUFJHX1JTQ1JBVENIMDsJCQkJICAgICBcCisJc3R3CXIxMywgR1BSMTAocjExKTsJCQkJCSAgICAgXAorCWx3eglyMTIsIFRIUkVBRF9OT1JNU0FWRSgwKShyMTApOwkJCQkgICAgIFwKIAlzdHcJcjEyLEdQUjExKHIxMSk7CQkJCQkJICAgICBcCisJbHd6CXIxMywgVEhSRUFEX05PUk1TQVZFKDIpKHIxMCk7IC8qIHJlc3RvcmUgcjEzICovCQkgICAgIFwKIAltZmxyCXIxMDsJCQkJCQkJICAgICBcCiAJc3R3CXIxMCxfTElOSyhyMTEpOwkJCQkJCSAgICAgXAotCW1mc3ByCXIxMCxTUFJOX1NQUkdfUlNDUkFUQ0gyOwkJCQkgICAgIFwKIAltZnNwcglyMTIsU1BSTl9TUlIwOwkJCQkJCSAgICAgXAotCXN0dwlyMTAsR1BSMShyMTEpOwkJCQkJCSAgICAgXAorCXN0dwlyMSwgR1BSMShyMTEpOwkJCQkJCSAgICAgXAogCW1mc3ByCXI5LFNQUk5fU1JSMTsJCQkJCQkgICAgIFwKLQlzdHcJcjEwLDAocjExKTsJCQkJCQkgICAgIFwKKwlzdHcJcjEsIDAocjExKTsJCQkJCQkgICAgIFwKKwltcglyMSwgcjExOwkJCQkJCSAgICAgXAogCXJsd2lubQlyOSxyOSwwLDE0LDEyOwkJLyogY2xlYXIgTVNSX1dFIChuZWNlc3Nhcnk/KQkgICAqL1wKIAlzdHcJcjAsR1BSMChyMTEpOwkJCQkJCSAgICAgXAogCWxpcwlyMTAsIFNUQUNLX0ZSQU1FX1JFR1NfTUFSS0VSQGhhOy8qIGV4Y2VwdGlvbiBmcmFtZSBtYXJrZXIgKi8gXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCmluZGV4IDVlY2Y1NGMuLjUwODQ1OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMKQEAgLTM0NiwxMSArMzQ2LDEyIEBACiAJLyogRGF0YSBUTEIgRXJyb3IgSW50ZXJydXB0ICovCiAJU1RBUlRfRVhDRVBUSU9OKERhdGFUTEJFcnJvcikKIAltdHNwcglTUFJOX1NQUkdfV1NDUkFUQ0gwLCByMTAgLyogU2F2ZSBzb21lIHdvcmtpbmcgcmVnaXN0ZXJzICovCi0JbXRzcHIJU1BSTl9TUFJHX1dTQ1JBVENIMSwgcjExCi0JbXRzcHIJU1BSTl9TUFJHX1dTQ1JBVENIMiwgcjEyCi0JbXRzcHIJU1BSTl9TUFJHX1dTQ1JBVENIMywgcjEzCi0JbWZjcglyMTEKLQltdHNwcglTUFJOX1NQUkdfV1NDUkFUQ0g0LCByMTEKKwltZnNwcglyMTAsIFNQUk5fU1BSR19USFJFQUQKKwlzdHcJcjExLCBUSFJFQURfTk9STVNBVkUoMCkocjEwKQorCXN0dwlyMTIsIFRIUkVBRF9OT1JNU0FWRSgxKShyMTApCisJc3R3CXIxMywgVEhSRUFEX05PUk1TQVZFKDIpKHIxMCkKKwltZmNyCXIxMworCXN0dwlyMTMsIFRIUkVBRF9OT1JNU0FWRSgzKShyMTApCiAJbWZzcHIJcjEwLCBTUFJOX0RFQVIJCS8qIEdldCBmYXVsdGluZyBhZGRyZXNzICovCiAKIAkvKiBJZiB3ZSBhcmUgZmF1bHRpbmcgYSBrZXJuZWwgYWRkcmVzcywgd2UgaGF2ZSB0byB1c2UgdGhlCkBAIC00MTYsMTEgKzQxNywxMiBAQAogCS8qIFRoZSBiYWlsb3V0LiAgUmVzdG9yZSByZWdpc3RlcnMgdG8gcHJlLWV4Y2VwdGlvbiBjb25kaXRpb25zCiAJICogYW5kIGNhbGwgdGhlIGhlYXZ5d2VpZ2h0cyB0byBoZWxwIHVzIG91dC4KIAkgKi8KLQltZnNwcglyMTEsIFNQUk5fU1BSR19SU0NSQVRDSDQKKwltZnNwcglyMTAsIFNQUk5fU1BSR19USFJFQUQKKwlsd3oJcjExLCBUSFJFQURfTk9STVNBVkUoMykocjEwKQogCW10Y3IJcjExCi0JbWZzcHIJcjEzLCBTUFJOX1NQUkdfUlNDUkFUQ0gzCi0JbWZzcHIJcjEyLCBTUFJOX1NQUkdfUlNDUkFUQ0gyCi0JbWZzcHIJcjExLCBTUFJOX1NQUkdfUlNDUkFUQ0gxCisJbHd6CXIxMywgVEhSRUFEX05PUk1TQVZFKDIpKHIxMCkKKwlsd3oJcjEyLCBUSFJFQURfTk9STVNBVkUoMSkocjEwKQorCWx3eglyMTEsIFRIUkVBRF9OT1JNU0FWRSgwKShyMTApCiAJbWZzcHIJcjEwLCBTUFJOX1NQUkdfUlNDUkFUQ0gwCiAJYglEYXRhU3RvcmFnZQogCkBAIC00MzIsMTEgKzQzNCwxMiBAQAogCSAqLwogCVNUQVJUX0VYQ0VQVElPTihJbnN0cnVjdGlvblRMQkVycm9yKQogCW10c3ByCVNQUk5fU1BSR19XU0NSQVRDSDAsIHIxMCAvKiBTYXZlIHNvbWUgd29ya2luZyByZWdpc3RlcnMgKi8KLQltdHNwcglTUFJOX1NQUkdfV1NDUkFUQ0gxLCByMTEKLQltdHNwcglTUFJOX1NQUkdfV1NDUkFUQ0gyLCByMTIKLQltdHNwcglTUFJOX1NQUkdfV1NDUkFUQ0gzLCByMTMKLQltZmNyCXIxMQotCW10c3ByCVNQUk5fU1BSR19XU0NSQVRDSDQsIHIxMQorCW1mc3ByCXIxMCwgU1BSTl9TUFJHX1RIUkVBRAorCXN0dwlyMTEsIFRIUkVBRF9OT1JNU0FWRSgwKShyMTApCisJc3R3CXIxMiwgVEhSRUFEX05PUk1TQVZFKDEpKHIxMCkKKwlzdHcJcjEzLCBUSFJFQURfTk9STVNBVkUoMikocjEwKQorCW1mY3IJcjEzCisJc3R3CXIxMywgVEhSRUFEX05PUk1TQVZFKDMpKHIxMCkKIAltZnNwcglyMTAsIFNQUk5fU1JSMAkJLyogR2V0IGZhdWx0aW5nIGFkZHJlc3MgKi8KIAogCS8qIElmIHdlIGFyZSBmYXVsdGluZyBhIGtlcm5lbCBhZGRyZXNzLCB3ZSBoYXZlIHRvIHVzZSB0aGUKQEAgLTQ5NiwxMSArNDk5LDEyIEBACiAJLyogVGhlIGJhaWxvdXQuICBSZXN0b3JlIHJlZ2lzdGVycyB0byBwcmUtZXhjZXB0aW9uIGNvbmRpdGlvbnMKIAkgKiBhbmQgY2FsbCB0aGUgaGVhdnl3ZWlnaHRzIHRvIGhlbHAgdXMgb3V0LgogCSAqLwotCW1mc3ByCXIxMSwgU1BSTl9TUFJHX1JTQ1JBVENINAorCW1mc3ByCXIxMCwgU1BSTl9TUFJHX1RIUkVBRAorCWx3eglyMTEsIFRIUkVBRF9OT1JNU0FWRSgzKShyMTApCiAJbXRjcglyMTEKLQltZnNwcglyMTMsIFNQUk5fU1BSR19SU0NSQVRDSDMKLQltZnNwcglyMTIsIFNQUk5fU1BSR19SU0NSQVRDSDIKLQltZnNwcglyMTEsIFNQUk5fU1BSR19SU0NSQVRDSDEKKwlsd3oJcjEzLCBUSFJFQURfTk9STVNBVkUoMikocjEwKQorCWx3eglyMTIsIFRIUkVBRF9OT1JNU0FWRSgxKShyMTApCisJbHd6CXIxMSwgVEhSRUFEX05PUk1TQVZFKDApKHIxMCkKIAltZnNwcglyMTAsIFNQUk5fU1BSR19SU0NSQVRDSDAKIAliCUluc3RydWN0aW9uU3RvcmFnZQogCkBAIC02MjEsMTEgKzYyNSwxMiBAQAogCXRsYndlCiAKIAkvKiBEb25lLi4ucmVzdG9yZSByZWdpc3RlcnMgYW5kIGdldCBvdXQgb2YgaGVyZS4gICovCi0JbWZzcHIJcjExLCBTUFJOX1NQUkdfUlNDUkFUQ0g0CisJbWZzcHIJcjEwLCBTUFJOX1NQUkdfVEhSRUFECisJbHd6CXIxMSwgVEhSRUFEX05PUk1TQVZFKDMpKHIxMCkKIAltdGNyCXIxMQotCW1mc3ByCXIxMywgU1BSTl9TUFJHX1JTQ1JBVENIMwotCW1mc3ByCXIxMiwgU1BSTl9TUFJHX1JTQ1JBVENIMgotCW1mc3ByCXIxMSwgU1BSTl9TUFJHX1JTQ1JBVENIMQorCWx3eglyMTMsIFRIUkVBRF9OT1JNU0FWRSgyKShyMTApCisJbHd6CXIxMiwgVEhSRUFEX05PUk1TQVZFKDEpKHIxMCkKKwlsd3oJcjExLCBUSFJFQURfTk9STVNBVkUoMCkocjEwKQogCW1mc3ByCXIxMCwgU1BSTl9TUFJHX1JTQ1JBVENIMAogCXJmaQkJCQkJLyogRm9yY2UgY29udGV4dCBjaGFuZ2UgKi8KIApAQCAtNjU2LDcgKzY2MSw3IEBACiAJY21waQkwLHI0LDAKIAliZXEJMWYKIAlhZGRpCXI0LHI0LFRIUkVBRAkvKiB3YW50IFRIUkVBRCBvZiBsYXN0X3Rhc2tfdXNlZF9zcGUgKi8KLQlTQVZFXzMyRVZSUygwLHIxMCxyNCkKKwlTQVZFXzMyRVZSUygwLHIxMCxyNCxUSFJFQURfRVZSMCkKIAlldnhvcglldnIxMCwgZXZyMTAsIGV2cjEwCS8qIGNsZWFyIG91dCBldnIxMCAqLwogCWV2bXd1bWlhYSBldnIxMCwgZXZyMTAsIGV2cjEwCS8qIGV2cjEwIDwtIEFDQyA9IDAgKiAwICsgQUNDICovCiAJbGkJcjUsVEhSRUFEX0FDQwpAQCAtNjc2LDcgKzY4MSw3IEBACiAJc3R3CXI0LFRIUkVBRF9VU0VEX1NQRShyNSkKIAlldmxkZHgJZXZyNCxyMTAscjUKIAlldm1yYQlldnI0LGV2cjQKLQlSRVNUXzMyRVZSUygwLHIxMCxyNSkKKwlSRVNUXzMyRVZSUygwLHIxMCxyNSxUSFJFQURfRVZSMCkKICNpZm5kZWYgQ09ORklHX1NNUAogCXN1YmkJcjQscjUsVEhSRUFECiAJc3R3CXI0LGxhc3RfdGFza191c2VkX3NwZUBsKHIzKQpAQCAtNzg3LDEzICs3OTIsMTEgQEAKIAlhZGRpCXIzLHIzLFRIUkVBRAkJLyogd2FudCBUSFJFQUQgb2YgdGFzayAqLwogCWx3eglyNSxQVF9SRUdTKHIzKQogCWNtcGkJMCxyNSwwCi0JU0FWRV8zMkVWUlMoMCwgcjQsIHIzKQorCVNBVkVfMzJFVlJTKDAsIHI0LCByMywgVEhSRUFEX0VWUjApCiAJZXZ4b3IJZXZyNiwgZXZyNiwgZXZyNgkvKiBjbGVhciBvdXQgZXZyNiAqLwogCWV2bXd1bWlhYSBldnI2LCBldnI2LCBldnI2CS8qIGV2cjYgPC0gQUNDID0gMCAqIDAgKyBBQ0MgKi8KIAlsaQlyNCxUSFJFQURfQUNDCiAJZXZzdGRkeAlldnI2LCByNCwgcjMJCS8qIHNhdmUgb2ZmIGFjY3VtdWxhdG9yICovCi0JbWZzcHIJcjYsU1BSTl9TUEVGU0NSCi0Jc3R3CXI2LFRIUkVBRF9TUEVGU0NSKHIzKQkvKiBzYXZlIHNwZWZzY3IgcmVnaXN0ZXIgdmFsdWUgKi8KIAliZXEJMWYKIAlsd3oJcjQsX01TUi1TVEFDS19GUkFNRV9PVkVSSEVBRChyNSkKIAlsaXMJcjMsTVNSX1NQRUBoCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfZTUwMC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX2U1MDAuUwppbmRleCA0N2ExYTk4Li4zZTJiOTVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfZTUwMC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9lNTAwLlMKQEAgLTI2LDYgKzI2LDE3IEBACiAJb3JpCXI0LHI0LF9UTEZfTkFQUElORwkvKiBzbyB3aGVuIHdlIHRha2UgYW4gZXhjZXB0aW9uICovCiAJc3R3CXI0LFRJX0xPQ0FMX0ZMQUdTKHIzKQkvKiBpdCB3aWxsIHJldHVybiB0byBvdXIgY2FsbGVyICovCiAKKyNpZmRlZiBDT05GSUdfRTUwME1DCisJd3J0ZWVpCTEKKzE6CXdhaXQKKworCS8qCisJICogR3VhcmQgYWdhaW5zdCBzcHVyaW91cyB3YWtldXBzIChlLmcuIGZyb20gYSBoeXBlcnZpc29yKSAtLQorCSAqIGFueSByZWFsIGludGVycnVwdCB3aWxsIGNhdXNlIHVzIHRvIHJldHVybiB0byBMUiBkdWUgdG8KKwkgKiBfVExGX05BUFBJTkcuCisJICovCisJYgkxYgorI2Vsc2UKIAkvKiBDaGVjayBpZiB3ZSBjYW4gbmFwIG9yIGRvemUsIHB1dCBISUQwIG1hc2sgaW4gcjMgKi8KIAlsaXMJcjMsMAogQkVHSU5fRlRSX1NFQ1RJT04KQEAgLTcyLDYgKzgzLDcgQEAKIAltdG1zcglyNwogCWlzeW5jCiAyOgliCTJiCisjZW5kaWYgLyogIUU1MDBNQyAqLwogCiAvKgogICogUmV0dXJuIGZyb20gTkFQL0RPWkUgbW9kZSwgcmVzdG9yZSBzb21lIENQVSBzcGVjaWZpYyByZWdpc3RlcnMsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI3LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI3LlMKaW5kZXggZjhmMGJjNy4uM2E3MDg0NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9wb3dlcjcuUwpAQCAtNzMsNyArNzMsNiBAQAogCWIJLgogCiBfR0xPQkFMKHBvd2VyN193YWtldXBfbG9zcykKLQlHRVRfUEFDQShyMTMpCiAJbGQJcjEsUEFDQVIxKHIxMykKIAlSRVNUX05WR1BSUyhyMSkKIAlSRVNUX0dQUigyLCByMSkKQEAgLTg3LDcgKzg2LDYgQEAKIAlyZmlkCiAKIF9HTE9CQUwocG93ZXI3X3dha2V1cF9ub2xvc3MpCi0JR0VUX1BBQ0EocjEzKQogCWxkCXIxLFBBQ0FSMShyMTMpCiAJbGQJcjQsX01TUihyMSkKIAlsZAlyNSxfTklQKHIxKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKaW5kZXggNWI0MjhlMy4uZDI4MWZiNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCkBAIC0xNTcsMTIgKzE1Nyw2IEBACiAJaWYgKGdldF9oYXJkX2VuYWJsZWQoKSkKIAkJcmV0dXJuOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQk9PS0UpICYmIGRlZmluZWQoQ09ORklHX1NNUCkKLQkvKiBDaGVjayBmb3IgcGVuZGluZyBkb29yYmVsbCBpbnRlcnJ1cHRzIGFuZCByZXNlbmQgdG8gb3Vyc2VsZiAqLwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9EQkVMTCkpCi0JCXNtcF9tdXhlZF9pcGlfcmVzZW5kKCk7Ci0jZW5kaWYKLQogCS8qCiAJICogTmVlZCB0byBoYXJkLWVuYWJsZSBpbnRlcnJ1cHRzIGhlcmUuICBTaW5jZSBjdXJyZW50bHkgZGlzYWJsZWQsCiAJICogbm8gbmVlZCB0byB0YWtlIGZ1cnRoZXIgYXNtIHByZWNhdXRpb25zIGFnYWluc3QgcHJlZW1wdGlvbjsgYnV0CkBAIC00NTcsMTEgKzQ1MSwxOCBAQAogCWN1cnRwID0gY3VycmVudF90aHJlYWRfaW5mbygpOwogCWlycXRwID0gc29mdGlycV9jdHhbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKIAlpcnF0cC0+dGFzayA9IGN1cnRwLT50YXNrOworCWlycXRwLT5mbGFncyA9IDA7CiAJY3VycmVudC0+dGhyZWFkLmtzcF9saW1pdCA9ICh1bnNpZ25lZCBsb25nKWlycXRwICsKIAkJCQkgICAgX0FMSUdOX1VQKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pLCAxNik7CiAJY2FsbF9kb19zb2Z0aXJxKGlycXRwKTsKIAljdXJyZW50LT50aHJlYWQua3NwX2xpbWl0ID0gc2F2ZWRfc3BfbGltaXQ7CiAJaXJxdHAtPnRhc2sgPSBOVUxMOworCisJLyogU2V0IGFueSBmbGFnIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgb24gdGhlCisJICogYWx0ZXJuYXRlIHN0YWNrCisJICovCisJaWYgKGlycXRwLT5mbGFncykKKwkJc2V0X2JpdHMoaXJxdHAtPmZsYWdzLCAmY3VydHAtPmZsYWdzKTsKIH0KIAogdm9pZCBkb19zb2Z0aXJxKHZvaWQpCkBAIC03NTAsNyArNzUxLDcgQEAKIAlpZiAoaXJxX3NldHVwX3ZpcnEoaG9zdCwgdmlycSwgaHdpcnEpKQogCQlyZXR1cm4gTk9fSVJROwogCi0JcHJpbnRrKEtFUk5fREVCVUcgImlycTogaXJxICVsdSBvbiBob3N0ICVzIG1hcHBlZCB0byB2aXJ0dWFsIGlycSAldVxuIiwKKwlwcl9kZWJ1ZygiaXJxOiBpcnEgJWx1IG9uIGhvc3QgJXMgbWFwcGVkIHRvIHZpcnR1YWwgaXJxICV1XG4iLAogCQlod2lycSwgaG9zdC0+b2Zfbm9kZSA/IGhvc3QtPm9mX25vZGUtPmZ1bGxfbmFtZSA6ICJudWxsIiwgdmlycSk7CiAKIAlyZXR1cm4gdmlycTsKQEAgLTg4Miw2ICs4ODMsNDEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlycV9maW5kX21hcHBpbmcpOwogCisjaWZkZWYgQ09ORklHX1NNUAoraW50IGlycV9jaG9vc2VfY3B1KGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQoreworCWludCBjcHVpZDsKKworCWlmIChjcHVtYXNrX2VxdWFsKG1hc2ssIGNwdV9hbGxfbWFzaykpIHsKKwkJc3RhdGljIGludCBpcnFfcm92ZXI7CisJCXN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGlycV9yb3Zlcl9sb2NrKTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkvKiBSb3VuZC1yb2JpbiBkaXN0cmlidXRpb24uLi4gKi8KK2RvX3JvdW5kX3JvYmluOgorCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9yb3Zlcl9sb2NrLCBmbGFncyk7CisKKwkJaXJxX3JvdmVyID0gY3B1bWFza19uZXh0KGlycV9yb3ZlciwgY3B1X29ubGluZV9tYXNrKTsKKwkJaWYgKGlycV9yb3ZlciA+PSBucl9jcHVfaWRzKQorCQkJaXJxX3JvdmVyID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOworCisJCWNwdWlkID0gaXJxX3JvdmVyOworCisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfcm92ZXJfbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCWNwdWlkID0gY3B1bWFza19maXJzdF9hbmQobWFzaywgY3B1X29ubGluZV9tYXNrKTsKKwkJaWYgKGNwdWlkID49IG5yX2NwdV9pZHMpCisJCQlnb3RvIGRvX3JvdW5kX3JvYmluOworCX0KKworCXJldHVybiBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdWlkKTsKK30KKyNlbHNlCitpbnQgaXJxX2Nob29zZV9jcHUoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCit7CisJcmV0dXJuIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOworfQorI2VuZGlmCiAKIHVuc2lnbmVkIGludCBpcnFfcmFkaXhfcmV2bWFwX2xvb2t1cChzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QsCiAJCQkJICAgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2p1bXBfbGFiZWwuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvanVtcF9sYWJlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OGQxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2p1bXBfbGFiZWwuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgorI2luY2x1ZGUgPGFzbS9jb2RlLXBhdGNoaW5nLmg+CisKK3ZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybShzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCisJCQkgICAgICAgZW51bSBqdW1wX2xhYmVsX3R5cGUgdHlwZSkKK3sKKwl1MzIgKmFkZHIgPSAodTMyICopKHVuc2lnbmVkIGxvbmcpZW50cnktPmNvZGU7CisKKwlpZiAodHlwZSA9PSBKVU1QX0xBQkVMX0VOQUJMRSkKKwkJcGF0Y2hfYnJhbmNoKGFkZHIsIGVudHJ5LT50YXJnZXQsIDApOworCWVsc2UKKwkJcGF0Y2hfaW5zdHJ1Y3Rpb24oYWRkciwgUFBDX0lOU1RfTk9QKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKaW5kZXggN2VlNTBmMC4uNjY1OGExNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTEyNiw3ICsxMjYsNyBAQAogCS8qIFdlIG1pZ2h0IGhhdmUgZ290IHRoZXNlIHZhbHVlcyB2aWEgdGhlIGNvbW1hbmQgbGluZSBvciB0aGUKIAkgKiBkZXZpY2UgdHJlZSwgZWl0aGVyIHdheSBzYW5pdGlzZSB0aGVtIG5vdy4gKi8KIAotCWNyYXNoX3NpemUgPSBjcmFzaGtfcmVzLmVuZCAtIGNyYXNoa19yZXMuc3RhcnQgKyAxOworCWNyYXNoX3NpemUgPSByZXNvdXJjZV9zaXplKCZjcmFzaGtfcmVzKTsKIAogI2lmbmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKIAlpZiAoY3Jhc2hrX3Jlcy5zdGFydCAhPSBLRFVNUF9LRVJORUxCQVNFKQpAQCAtMjIyLDcgKzIyMiw3IEBACiAKIAlpZiAoY3Jhc2hrX3Jlcy5zdGFydCAhPSAwKSB7CiAJCXByb21fYWRkX3Byb3BlcnR5KG5vZGUsICZjcmFzaGtfYmFzZV9wcm9wKTsKLQkJY3Jhc2hrX3NpemUgPSBjcmFzaGtfcmVzLmVuZCAtIGNyYXNoa19yZXMuc3RhcnQgKyAxOworCQljcmFzaGtfc2l6ZSA9IHJlc291cmNlX3NpemUoJmNyYXNoa19yZXMpOwogCQlwcm9tX2FkZF9wcm9wZXJ0eShub2RlLCAmY3Jhc2hrX3NpemVfcHJvcCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUwppbmRleCBlODlkZjU5Li42MTY5MjFlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUwpAQCAtMzM5LDcgKzMzOSw3IEBACiAjZW5kaWYgLyogQ09ORklHX1BQQ19QQVNFTUkgKi8KIAogCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRX1BNQUM2NAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9GUkVRX1BNQUM2NCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX0ZSRVFfTUFQTEUpCiAvKgogICogU0NPTSBhY2Nlc3MgZnVuY3Rpb25zIGZvciA5NzAgKEZYIG9ubHkgZm9yIG5vdykKICAqCkBAIC00MDgsNyArNDA4LDcgQEAKIAkvKiByZXN0b3JlIGludGVycnVwdHMgKi8KIAltdG1zcmQJcjUsMQogCWJscgotI2VuZGlmIC8qIENPTkZJR19DUFVfRlJFUV9QTUFDNjQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ1BVX0ZSRVFfUE1BQzY0IHx8IENPTkZJR19DUFVfRlJFUV9NQVBMRSAqLwogCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGUuYwppbmRleCA0OWNlZTlkLi5hMWNkNzAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlLmMKQEAgLTMxLDIwICszMSw2IEBACiAKIExJU1RfSEVBRChtb2R1bGVfYnVnX2xpc3QpOwogCi12b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQotewotCWlmIChzaXplID09IDApCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIHZtYWxsb2NfZXhlYyhzaXplKTsKLX0KLQotLyogRnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfYWxsb2MgKi8KLXZvaWQgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKQotewotCXZmcmVlKG1vZHVsZV9yZWdpb24pOwotfQotCiBzdGF0aWMgY29uc3QgRWxmX1NoZHIgKmZpbmRfc2VjdGlvbihjb25zdCBFbGZfRWhkciAqaGRyLAogCQkJCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKIAkJCQkgICAgY29uc3QgY2hhciAqbmFtZSkKQEAgLTkzLDcgKzc5LDMgQEAKIAogCXJldHVybiAwOwogfQotCi12b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQotewotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGVfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlXzMyLmMKaW5kZXggZjgzMjc3My4uMGI2ZDc5NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGVfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZV8zMi5jCkBAIC0xNzQsMTcgKzE3NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhcHBseV9yZWxvY2F0ZShFbGYzMl9TaGRyICpzZWNoZHJzLAotCQkgICBjb25zdCBjaGFyICpzdHJ0YWIsCi0JCSAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKLQkJICAgdW5zaWduZWQgaW50IHJlbHNlYywKLQkJICAgc3RydWN0IG1vZHVsZSAqbW9kdWxlKQotewotCXByaW50ayhLRVJOX0VSUiAiJXM6IE5vbi1BREQgUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwKLQkgICAgICAgbW9kdWxlLT5uYW1lKTsKLQlyZXR1cm4gLUVOT0VYRUM7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IGVudHJ5X21hdGNoZXMoc3RydWN0IHBwY19wbHRfZW50cnkgKmVudHJ5LCBFbGYzMl9BZGRyIHZhbCkKIHsKIAlpZiAoZW50cnktPmp1bXBbMF0gPT0gMHgzZDYwMDAwMCArICgodmFsICsgMHg4MDAwKSA+PiAxNikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZV82NC5jCmluZGV4IDhmYmIxMjUuLjlmNDRhNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGVfNjQuYwpAQCAtMjQzLDE2ICsyNDMsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgYXBwbHlfcmVsb2NhdGUoRWxmNjRfU2hkciAqc2VjaGRycywKLQkJICAgY29uc3QgY2hhciAqc3RydGFiLAotCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCi0JCSAgIHVuc2lnbmVkIGludCByZWxzZWMsCi0JCSAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotCXByaW50ayhLRVJOX0VSUiAiJXM6IE5vbi1BREQgUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwgbWUtPm5hbWUpOwotCXJldHVybiAtRU5PRVhFQzsKLX0KLQogLyogcjIgaXMgdGhlIFRPQyBwb2ludGVyOiBpdCBhY3R1YWxseSBwb2ludHMgMHg4MDAwIGludG8gdGhlIFRPQyAodGhpcwogICAgZ2l2ZXMgdGhlIHZhbHVlIG1heGltdW0gc3BhbiBpbiBhbiBpbnN0cnVjdGlvbiB3aGljaCB1c2VzIGEgc2lnbmVkCiAgICBvZmZzZXQpICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21wYzc0NTAtcG11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21wYzc0NTAtcG11LmMKaW5kZXggMmNjNWUwMy4uZmUyMWI1MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tcGM3NDUwLXBtdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbXBjNzQ1MC1wbXUuYwpAQCAtMzg4LDYgKzM4OCwxMSBAQAogCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCiAJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJfSwKIAl9LAorCVtDKE5PREUpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJfSwKKwl9LAogfTsKIAogc3RydWN0IHBvd2VyX3BtdSBtcGM3NDUwX3BtdSA9IHsKQEAgLTQwNSw3ICs0MTAsNyBAQAogCS5jYWNoZV9ldmVudHMJCT0gJm1wYzc0NTBfY2FjaGVfZXZlbnRzLAogfTsKIAotc3RhdGljIGludCBpbml0X21wYzc0NTBfcG11KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21wYzc0NTBfcG11KHZvaWQpCiB7CiAJaWYgKCFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX2NwdV90eXBlIHx8CiAJICAgIHN0cmNtcChjdXJfY3B1X3NwZWMtPm9wcm9maWxlX2NwdV90eXBlLCAicHBjLzc0NTAiKSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKaW5kZXggZWZlYjg4MS4uMGE1YTg5OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCSAqIGlmIHdlIGRvIGEgR0VUX1BBQ0EoKSBiZWZvcmUgdGhlIGZlYXR1cmUgZml4dXBzIGhhdmUgYmVlbgogCSAqIGFwcGxpZWQKIAkgKi8KLQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfSFZNT0RFXzIwNikpCisJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0hWTU9ERSkpCiAJCW10c3ByKFNQUk5fU1BSR19IUEFDQSwgbG9jYWxfcGFjYSk7CiAjZW5kaWYKIAltdHNwcihTUFJOX1NQUkdfUEFDQSwgbG9jYWxfcGFjYSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCmluZGV4IDg5M2FmMmEuLjAxODc4MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCkBAIC0xMDcsNyArMTA3LDcgQEAKICNpZmRlZiBDT05GSUdfUFBDNjQKIAlyZXR1cm4gaG9zZS0+cGNpX2lvX3NpemU7CiAjZWxzZQotCXJldHVybiBob3NlLT5pb19yZXNvdXJjZS5lbmQgLSBob3NlLT5pb19yZXNvdXJjZS5zdGFydCArIDE7CisJcmV0dXJuIHJlc291cmNlX3NpemUoJmhvc2UtPmlvX3Jlc291cmNlKTsKICNlbmRpZgogfQogCkBAIC0xMDk3LDkgKzEwOTcsNiBAQAogCQlpZiAoZGV2LT5pc19hZGRlZCkKIAkJCWNvbnRpbnVlOwogCi0JCS8qIFNldHVwIE9GIG5vZGUgcG9pbnRlciBpbiB0aGUgZGV2aWNlICovCi0JCWRldi0+ZGV2Lm9mX25vZGUgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKLQogCQkvKiBGaXh1cCBOVU1BIG5vZGUgYXMgaXQgbWF5IG5vdCBiZSBzZXR1cCB5ZXQgYnkgdGhlIGdlbmVyaWMKIAkJICogY29kZSBhbmQgaXMgbmVlZGVkIGJ5IHRoZSBETUEgaW5pdAogCQkgKi8KQEAgLTE2ODUsNiArMTY4MiwxMyBAQAogCXJldHVybiBwY2lfYnVzX2ZpbmRfY2FwYWJpbGl0eShmYWtlX3BjaV9idXMoaG9zZSwgYnVzKSwgZGV2Zm4sIGNhcCk7CiB9CiAKK3N0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpYmlvc19nZXRfcGhiX29mX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CisKKwlyZXR1cm4gb2Zfbm9kZV9nZXQoaG9zZS0+ZG4pOworfQorCiAvKioKICAqIHBjaV9zY2FuX3BoYiAtIEdpdmVuIGEgcGNpX2NvbnRyb2xsZXIsIHNldHVwIGFuZCBzY2FuIHRoZSBQQ0kgYnVzCiAgKiBAaG9zZTogUG9pbnRlciB0byB0aGUgUENJIGhvc3QgY29udHJvbGxlciBpbnN0YW5jZSBzdHJ1Y3R1cmUKQEAgLTE3MDUsNyArMTcwOSw2IEBACiAJCQlob3NlLT5nbG9iYWxfbnVtYmVyKTsKIAkJcmV0dXJuOwogCX0KLQlidXMtPmRldi5vZl9ub2RlID0gb2Zfbm9kZV9nZXQobm9kZSk7CiAJYnVzLT5zZWNvbmRhcnkgPSBob3NlLT5maXJzdF9idXNubzsKIAlob3NlLT5idXMgPSBidXM7CiAKQEAgLTE3MjgsMyArMTczMSwyMSBAQAogCWlmIChtb2RlID09IFBDSV9QUk9CRV9OT1JNQUwpCiAJCWhvc2UtPmxhc3RfYnVzbm8gPSBidXMtPnN1Ym9yZGluYXRlID0gcGNpX3NjYW5fY2hpbGRfYnVzKGJ1cyk7CiB9CisKK3N0YXRpYyB2b2lkIGZpeHVwX2hpZGVfaG9zdF9yZXNvdXJjZV9mc2woc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgaSwgY2xhc3MgPSBkZXYtPmNsYXNzID4+IDg7CisKKwlpZiAoKGNsYXNzID09IFBDSV9DTEFTU19QUk9DRVNTT1JfUE9XRVJQQyB8fAorCSAgICAgY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9PVEhFUikgJiYKKwkJKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX05PUk1BTCkgJiYKKwkJKGRldi0+YnVzLT5wYXJlbnQgPT0gTlVMTCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7CisJCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKKwkJCWRldi0+cmVzb3VyY2VbaV0uZW5kID0gMDsKKwkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAwOworCQl9CisJfQorfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfTU9UT1JPTEEsIFBDSV9BTllfSUQsIGZpeHVwX2hpZGVfaG9zdF9yZXNvdXJjZV9mc2wpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfRlJFRVNDQUxFLCBQQ0lfQU5ZX0lELCBmaXh1cF9oaWRlX2hvc3RfcmVzb3VyY2VfZnNsKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCmluZGV4IGJlZGIzNzAuLmUyZjI0YmFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKQEAgLTUxLDI1ICs1MSw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChpc2FfYnJpZGdlX3BjaWRldik7CiAKIHN0YXRpYyB2b2lkCi1maXh1cF9oaWRlX2hvc3RfcmVzb3VyY2VfZnNsKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JaW50IGksIGNsYXNzID0gZGV2LT5jbGFzcyA+PiA4OwotCi0JaWYgKChjbGFzcyA9PSBQQ0lfQ0xBU1NfUFJPQ0VTU09SX1BPV0VSUEMgfHwKLQkgICAgIGNsYXNzID09IFBDSV9DTEFTU19CUklER0VfT1RIRVIpICYmCi0JCShkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9OT1JNQUwpICYmCi0JCShkZXYtPmJ1cy0+cGFyZW50ID09IE5VTEwpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmVuZCA9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gMDsKLQkJfQotCX0KLX0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX01PVE9ST0xBLCBQQ0lfQU5ZX0lELCBmaXh1cF9oaWRlX2hvc3RfcmVzb3VyY2VfZnNsKTsgCi1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9GUkVFU0NBTEUsIFBDSV9BTllfSUQsIGZpeHVwX2hpZGVfaG9zdF9yZXNvdXJjZV9mc2wpOyAKLQotc3RhdGljIHZvaWQKIGZpeHVwX2NwYzcxMF9wY2k2NChzdHJ1Y3QgcGNpX2RldiogZGV2KQogewogCS8qIEhpZGUgdGhlIFBDSTY0IEJBUnMgZnJvbSB0aGUga2VybmVsIGFzIHRoZWlyIGNvbnRlbnQgZG9lc24ndApAQCAtMTY3LDE1MCArMTQ4LDI2IEBACiAjZW5kaWYKIH0KIAotdHlwZWRlZiBpbnQgKCpwY2lfT0Zfc2Nhbl9pdGVyYXRvcikoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCB2b2lkKiBkYXRhKTsKLQotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSoKLXNjYW5fT0ZfcGNpX2NoaWxkcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwgcGNpX09GX3NjYW5faXRlcmF0b3IgZmlsdGVyLCB2b2lkKiBkYXRhKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUqIHN1Yl9ub2RlOwotCi0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShwYXJlbnQsIG5vZGUpIHsKLQkJY29uc3QgdW5zaWduZWQgaW50ICpjbGFzc19jb2RlOwotCQotCQlpZiAoZmlsdGVyKG5vZGUsIGRhdGEpKSB7Ci0JCQlvZl9ub2RlX3B1dChub2RlKTsKLQkJCXJldHVybiBub2RlOwotCQl9Ci0KLQkJLyogRm9yIFBDSTwtPlBDSSBicmlkZ2VzIG9yIENhcmRCdXMgYnJpZGdlcywgd2UgZ28gZG93bgotCQkgKiBOb3RlOiBzb21lIE9GcyBjcmVhdGUgYSBwYXJlbnQgbm9kZSAibXVsdGlmdW5jLWRldmljZSIgYXMKLQkJICogYSBmYWtlIHJvb3QgZm9yIGFsbCBmdW5jdGlvbnMgb2YgYSBtdWx0aS1mdW5jdGlvbiBkZXZpY2UsCi0JCSAqIHdlIGdvIGRvd24gdGhlbSBhcyB3ZWxsLgotCQkgKi8KLQkJY2xhc3NfY29kZSA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiY2xhc3MtY29kZSIsIE5VTEwpOwotCQlpZiAoKCFjbGFzc19jb2RlIHx8ICgoKmNsYXNzX2NvZGUgPj4gOCkgIT0gUENJX0NMQVNTX0JSSURHRV9QQ0kgJiYKLQkJCSgqY2xhc3NfY29kZSA+PiA4KSAhPSBQQ0lfQ0xBU1NfQlJJREdFX0NBUkRCVVMpKSAmJgotCQkJc3RyY21wKG5vZGUtPm5hbWUsICJtdWx0aWZ1bmMtZGV2aWNlIikpCi0JCQljb250aW51ZTsKLQkJc3ViX25vZGUgPSBzY2FuX09GX3BjaV9jaGlsZHMobm9kZSwgZmlsdGVyLCBkYXRhKTsKLQkJaWYgKHN1Yl9ub2RlKSB7Ci0JCQlvZl9ub2RlX3B1dChub2RlKTsKLQkJCXJldHVybiBzdWJfbm9kZTsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqc2Nhbl9PRl9mb3JfcGNpX2RldihzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkZXZmbikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqY25wOwotCWNvbnN0IHUzMiAqcmVnOwotCXVuc2lnbmVkIGludCBwc2l6ZTsKLQotCWZvcl9lYWNoX2NoaWxkX29mX25vZGUocGFyZW50LCBucCkgewotCQlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCAmcHNpemUpOwotICAgICAgICAgICAgICAgIGlmIChyZWcgJiYgcHNpemUgPj0gNCAmJiAoKHJlZ1swXSA+PiA4KSAmIDB4ZmYpID09IGRldmZuKQotCQkJcmV0dXJuIG5wOwotCi0JCS8qIE5vdGU6IHNvbWUgT0ZzIGNyZWF0ZSBhIHBhcmVudCBub2RlICJtdWx0aWZ1bmMtZGV2aWNlIiBhcwotCQkgKiBhIGZha2Ugcm9vdCBmb3IgYWxsIGZ1bmN0aW9ucyBvZiBhIG11bHRpLWZ1bmN0aW9uIGRldmljZSwKLQkJICogd2UgZ28gZG93biB0aGVtIGFzIHdlbGwuICovCi0gICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobnAtPm5hbWUsICJtdWx0aWZ1bmMtZGV2aWNlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNucCA9IHNjYW5fT0ZfZm9yX3BjaV9kZXYobnAsIGRldmZuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbnApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbnA7Ci0gICAgICAgICAgICAgICAgfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpzY2FuX09GX2Zvcl9wY2lfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsICpucDsKLQotCS8qIEFyZSB3ZSBhIHJvb3QgYnVzID8gKi8KLQlpZiAoYnVzLT5zZWxmID09IE5VTEwgfHwgYnVzLT5wYXJlbnQgPT0gTlVMTCkgewotCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKLQkJaWYgKGhvc2UgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXR1cm4gb2Zfbm9kZV9nZXQoaG9zZS0+ZG4pOwotCX0KLQotCS8qIG5vdCBhIHJvb3QgYnVzLCB3ZSBuZWVkIHRvIGdldCBvdXIgcGFyZW50ICovCi0JcGFyZW50ID0gc2Nhbl9PRl9mb3JfcGNpX2J1cyhidXMtPnBhcmVudCk7Ci0JaWYgKHBhcmVudCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIG5vdyBpdGVyYXRlIGZvciBjaGlsZHJlbiBmb3IgYSBtYXRjaCAqLwotCW5wID0gc2Nhbl9PRl9mb3JfcGNpX2RldihwYXJlbnQsIGJ1cy0+c2VsZi0+ZGV2Zm4pOwotCW9mX25vZGVfcHV0KHBhcmVudCk7Ci0KLQlyZXR1cm4gbnA7Ci19Ci0KLS8qCi0gKiBTY2FucyB0aGUgT0YgdHJlZSBmb3IgYSBkZXZpY2Ugbm9kZSBtYXRjaGluZyBhIFBDSSBkZXZpY2UKLSAqLwotc3RydWN0IGRldmljZV9ub2RlICoKLXBjaV9idXNkZXZfdG9fT0Zfbm9kZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgZGV2Zm4pCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsICpucDsKLQotCXByX2RlYnVnKCJwY2lfYnVzZGV2X3RvX09GX25vZGUoJWQsMHgleClcbiIsIGJ1cy0+bnVtYmVyLCBkZXZmbik7Ci0JcGFyZW50ID0gc2Nhbl9PRl9mb3JfcGNpX2J1cyhidXMpOwotCWlmIChwYXJlbnQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcHJfZGVidWcoIiBwYXJlbnQgaXMgJXNcbiIsIHBhcmVudCA/IHBhcmVudC0+ZnVsbF9uYW1lIDogIjxOVUxMPiIpOwotCW5wID0gc2Nhbl9PRl9mb3JfcGNpX2RldihwYXJlbnQsIGRldmZuKTsKLQlvZl9ub2RlX3B1dChwYXJlbnQpOwotCXByX2RlYnVnKCIgcmVzdWx0IGlzICVzXG4iLCBucCA/IG5wLT5mdWxsX25hbWUgOiAiPE5VTEw+Iik7Ci0KLQkvKiBYWFggbW9zdCBjYWxsZXJzIGRvbid0IHJlbGVhc2UgdGhlIHJldHVybmVkIG5vZGUKLQkgKiBtb3N0bHkgYmVjYXVzZSBwcGM2NCBkb2Vzbid0IGluY3JlYXNlIHRoZSByZWZjb3VudCwKLQkgKiB3ZSBuZWVkIHRvIGZpeCB0aGF0LgotCSAqLwotCXJldHVybiBucDsKLX0KLUVYUE9SVF9TWU1CT0wocGNpX2J1c2Rldl90b19PRl9ub2RlKTsKLQotc3RydWN0IGRldmljZV9ub2RlKgotcGNpX2RldmljZV90b19PRl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JcmV0dXJuIHBjaV9idXNkZXZfdG9fT0Zfbm9kZShkZXYtPmJ1cywgZGV2LT5kZXZmbik7Ci19Ci1FWFBPUlRfU1lNQk9MKHBjaV9kZXZpY2VfdG9fT0Zfbm9kZSk7Ci0KLXN0YXRpYyBpbnQKLWZpbmRfT0ZfcGNpX2RldmljZV9maWx0ZXIoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCB2b2lkKiBkYXRhKQotewotCXJldHVybiAoKHZvaWQgKilub2RlID09IGRhdGEpOwotfQogCiAvKgogICogUmV0dXJucyB0aGUgUENJIGRldmljZSBtYXRjaGluZyBhIGdpdmVuIE9GIG5vZGUKICAqLwotaW50Ci1wY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUsIHU4KiBidXMsIHU4KiBkZXZmbikKK2ludCBwY2lfZGV2aWNlX2Zyb21fT0Zfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHU4ICpidXMsIHU4ICpkZXZmbikKIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgKnJlZzsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2U7Ci0Jc3RydWN0IHBjaV9kZXYqIGRldiA9IE5VTEw7Ci0JCi0JLyogTWFrZSBzdXJlIGl0J3MgcmVhbGx5IGEgUENJIGRldmljZSAqLwotCWhvc2UgPSBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uobm9kZSk7Ci0JaWYgKCFob3NlIHx8ICFob3NlLT5kbikKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwljb25zdCBfX2JlMzIgKnJlZzsKKwlpbnQgc2l6ZTsKKworCS8qIENoZWNrIGlmIGl0IG1pZ2h0IGhhdmUgYSBjaGFuY2UgdG8gYmUgYSBQQ0kgZGV2aWNlICovCisJaWYgKCFwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uobm9kZSkpCiAJCXJldHVybiAtRU5PREVWOwotCWlmICghc2Nhbl9PRl9wY2lfY2hpbGRzKGhvc2UtPmRuLAotCQkJZmluZF9PRl9wY2lfZGV2aWNlX2ZpbHRlciwgKHZvaWQgKilub2RlKSkKKworCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicmVnIiwgJnNpemUpOworCWlmICghcmVnIHx8IHNpemUgPCA1ICogc2l6ZW9mKHUzMikpCiAJCXJldHVybiAtRU5PREVWOwotCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicmVnIiwgTlVMTCk7Ci0JaWYgKCFyZWcpCi0JCXJldHVybiAtRU5PREVWOwotCSpidXMgPSAocmVnWzBdID4+IDE2KSAmIDB4ZmY7Ci0JKmRldmZuID0gKChyZWdbMF0gPj4gOCkgJiAweGZmKTsKKworCSpidXMgPSAoYmUzMl90b19jcHVwKCZyZWdbMF0pID4+IDE2KSAmIDB4ZmY7CisJKmRldmZuID0gKGJlMzJfdG9fY3B1cCgmcmVnWzBdKSA+PiA4KSAmIDB4ZmY7CiAKIAkvKiBPaywgaGVyZSB3ZSBuZWVkIHNvbWUgdHdlYWsuIElmIHdlIGhhdmUgYWxyZWFkeSByZW51bWJlcmVkCiAJICogYWxsIGJ1c3Nlcywgd2UgY2FuJ3QgcmVseSBvbiB0aGUgT0YgYnVzIG51bWJlciBhbnkgbW9yZS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RuLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9kbi5jCmluZGV4IDZiYWFiYzEuLjQ3OGY4ZDc4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9kbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RuLmMKQEAgLTE0Miw1MyArMTQyLDYgQEAKIAl0cmF2ZXJzZV9wY2lfZGV2aWNlcyhkbiwgdXBkYXRlX2RuX3BjaV9pbmZvLCBwaGIpOwogfQogCi0vKgotICogVHJhdmVyc2FsIGZ1bmMgdGhhdCBsb29rcyBmb3IgYSA8YnVzbm8sZGV2ZmNuPiB2YWx1ZS4KLSAqIElmIGZvdW5kLCB0aGUgcGNpX2RuIGlzIHJldHVybmVkICh0aHVzIHRlcm1pbmF0aW5nIHRoZSB0cmF2ZXJzYWwpLgotICovCi1zdGF0aWMgdm9pZCAqaXNfZGV2Zm5fbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCB2b2lkICpkYXRhKQotewotCWludCBidXNubyA9ICgodW5zaWduZWQgbG9uZylkYXRhID4+IDgpICYgMHhmZjsKLQlpbnQgZGV2Zm4gPSAoKHVuc2lnbmVkIGxvbmcpZGF0YSkgJiAweGZmOwotCXN0cnVjdCBwY2lfZG4gKnBjaSA9IGRuLT5kYXRhOwotCi0JaWYgKHBjaSAmJiAoZGV2Zm4gPT0gcGNpLT5kZXZmbikgJiYgKGJ1c25vID09IHBjaS0+YnVzbm8pKQotCQlyZXR1cm4gZG47Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSAic2xvdyIgcGF0aCBmb3IgbG9va2luZyB1cCBhIGRldmljZV9ub2RlIGZyb20gYQotICogcGNpX2Rldi4gIEl0IHdpbGwgaHVudCBmb3IgdGhlIGRldmljZSB1bmRlciBpdHMgcGFyZW50J3MKLSAqIHBoYiBhbmQgdGhlbiB1cGRhdGUgb2Zfbm9kZSBwb2ludGVyLgotICoKLSAqIEl0IG1heSBhbHNvIGRvIGZpeHVwcyBvbiB0aGUgYWN0dWFsIGRldmljZSBzaW5jZSB0aGlzIGhhcHBlbnMKLSAqIG9uIHRoZSBmaXJzdCByZWFkL3dyaXRlLgotICoKLSAqIE5vdGUgdGhhdCBpdCBhbHNvIG11c3QgZGVhbCB3aXRoIGRldmljZXMgdGhhdCBkb24ndCBleGlzdC4KLSAqIEluIHRoaXMgY2FzZSBpdCBtYXkgcHJvYmUgZm9yIHJlYWwgaGFyZHdhcmUgKCJqdXN0IGluIGNhc2UiKQotICogYW5kIGFkZCBhIGRldmljZV9ub2RlIHRvIHRoZSBkZXZpY2UgdHJlZSBpZiBuZWNlc3NhcnkuCi0gKgotICogSXMgdGhpcyBmdW5jdGlvbiBuZWNlc3NhcnkgYW55bW9yZSBub3cgdGhhdCBkZXYtPmRldi5vZl9ub2RlIGlzCi0gKiB1c2VkIHRvIHN0b3JlIHRoZSBub2RlIHBvaW50ZXI/Ci0gKgotICovCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKmZldGNoX2Rldl9kbihzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiID0gZGV2LT5zeXNkYXRhOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0JdW5zaWduZWQgbG9uZyBzZWFyY2h2YWwgPSAoZGV2LT5idXMtPm51bWJlciA8PCA4KSB8IGRldi0+ZGV2Zm47Ci0KLQlpZiAoV0FSTl9PTighcGhiKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkbiA9IHRyYXZlcnNlX3BjaV9kZXZpY2VzKHBoYi0+ZG4sIGlzX2RldmZuX25vZGUsICh2b2lkICopc2VhcmNodmFsKTsKLQlpZiAoZG4pCi0JCWRldi0+ZGV2Lm9mX25vZGUgPSBkbjsKLQlyZXR1cm4gZG47Ci19Ci1FWFBPUlRfU1lNQk9MKGZldGNoX2Rldl9kbik7Ci0KIC8qKiAKICAqIHBjaV9kZXZzX3BoYl9pbml0IC0gSW5pdGlhbGl6ZSBwaGJzIGFuZCBwY2kgZGV2cyB1bmRlciB0aGVtLgogICogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9vZl9zY2FuLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9vZl9zY2FuLmMKaW5kZXggMWU4OWE3Mi4uZmUwYTVhZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfb2Zfc2Nhbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX29mX3NjYW4uYwpAQCAtMjAyLDkgKzIwMiw5IEBACiAgKiB0aGlzIHJvdXRpbmUgaW4gdHVybiBjYWxsIG9mX3NjYW5fYnVzKCkgcmVjdXNpdmVseSB0byBzY2FuIGZvciBtb3JlIGNoaWxkCiAgKiBkZXZpY2VzLgogICovCi12b2lkIF9fZGV2aW5pdCBvZl9zY2FuX3BjaV9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAotCQkJCSAgc3RydWN0IHBjaV9kZXYgKmRldikKK3ZvaWQgX19kZXZpbml0IG9mX3NjYW5fcGNpX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IHBjaV9idXMgKmJ1czsKIAljb25zdCB1MzIgKmJ1c3JhbmdlLCAqcmFuZ2VzOwogCWludCBsZW4sIGksIG1vZGU7CkBAIC0yMzgsNyArMjM4LDYgQEAKIAlidXMtPnByaW1hcnkgPSBkZXYtPmJ1cy0+bnVtYmVyOwogCWJ1cy0+c3Vib3JkaW5hdGUgPSBidXNyYW5nZVsxXTsKIAlidXMtPmJyaWRnZV9jdGwgPSAwOwotCWJ1cy0+ZGV2Lm9mX25vZGUgPSBvZl9ub2RlX2dldChub2RlKTsKIAogCS8qIHBhcnNlIHJhbmdlcyBwcm9wZXJ0eSAqLwogCS8qIFBDSSAjYWRkcmVzcy1jZWxscyA9PSAzIGFuZCAjc2l6ZS1jZWxscyA9PSAyIGFsd2F5cyAqLwpAQCAtMzM1LDkgKzMzNCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCWlmIChkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UgfHwKIAkJICAgIGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0NBUkRCVVMpIHsKLQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKLQkJCWlmIChjaGlsZCkKLQkJCQlvZl9zY2FuX3BjaV9icmlkZ2UoY2hpbGQsIGRldik7CisJCQlvZl9zY2FuX3BjaV9icmlkZ2UoZGV2KTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGVyZl9ldmVudC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggODIyZjYzMC4uMTBhMTQwZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTEyMDcsNyArMTIwNyw3IEBACiAgKiBoZXJlIHNvIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IG9mIGJlaW5nIGludGVycnVwdGVkLgogICovCiBzdGF0aWMgdm9pZCByZWNvcmRfYW5kX3Jlc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1bnNpZ25lZCBsb25nIHZhbCwKLQkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IG5taSkKKwkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1NjQgcGVyaW9kID0gZXZlbnQtPmh3LnNhbXBsZV9wZXJpb2Q7CiAJczY0IHByZXYsIGRlbHRhLCBsZWZ0OwpAQCAtMTI1OCw3ICsxMjU4LDcgQEAKIAkJaWYgKGV2ZW50LT5hdHRyLnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQUREUikKIAkJCXBlcmZfZ2V0X2RhdGFfYWRkcihyZWdzLCAmZGF0YS5hZGRyKTsKIAotCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgbm1pLCAmZGF0YSwgcmVncykpCisJCWlmIChwZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCAmZGF0YSwgcmVncykpCiAJCQlwb3dlcl9wbXVfc3RvcChldmVudCwgMCk7CiAJfQogfQpAQCAtMTM0Niw3ICsxMzQ2LDcgQEAKIAkJaWYgKChpbnQpdmFsIDwgMCkgewogCQkJLyogZXZlbnQgaGFzIG92ZXJmbG93ZWQgKi8KIAkJCWZvdW5kID0gMTsKLQkJCXJlY29yZF9hbmRfcmVzdGFydChldmVudCwgdmFsLCByZWdzLCBubWkpOworCQkJcmVjb3JkX2FuZF9yZXN0YXJ0KGV2ZW50LCB2YWwsIHJlZ3MpOwogCQl9CiAJfQogCkBAIC0xNDA4LDcgKzE0MDgsNyBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLWludCByZWdpc3Rlcl9wb3dlcl9wbXUoc3RydWN0IHBvd2VyX3BtdSAqcG11KQoraW50IF9fY3B1aW5pdCByZWdpc3Rlcl9wb3dlcl9wbXUoc3RydWN0IHBvd2VyX3BtdSAqcG11KQogewogCWlmIChwcG11KQogCQlyZXR1cm4gLUVCVVNZOwkJLyogc29tZXRoaW5nJ3MgYWxyZWFkeSByZWdpc3RlcmVkICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZfZXZlbnRfZnNsX2VtYi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmX2V2ZW50X2ZzbF9lbWIuYwppbmRleCBiMGRjOGY3Li4wYTZkMmE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZfZXZlbnRfZnNsX2VtYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGVyZl9ldmVudF9mc2xfZW1iLmMKQEAgLTU2OCw3ICs1NjgsNyBAQAogICogaGVyZSBzbyB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eSBvZiBiZWluZyBpbnRlcnJ1cHRlZC4KICAqLwogc3RhdGljIHZvaWQgcmVjb3JkX2FuZF9yZXN0YXJ0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdW5zaWduZWQgbG9uZyB2YWwsCi0JCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBubWkpCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdTY0IHBlcmlvZCA9IGV2ZW50LT5ody5zYW1wbGVfcGVyaW9kOwogCXM2NCBwcmV2LCBkZWx0YSwgbGVmdDsKQEAgLTYxNiw3ICs2MTYsNyBAQAogCQlwZXJmX3NhbXBsZV9kYXRhX2luaXQoJmRhdGEsIDApOwogCQlkYXRhLnBlcmlvZCA9IGV2ZW50LT5ody5sYXN0X3BlcmlvZDsKIAotCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgbm1pLCAmZGF0YSwgcmVncykpCisJCWlmIChwZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCAmZGF0YSwgcmVncykpCiAJCQlmc2xfZW1iX3BtdV9zdG9wKGV2ZW50LCAwKTsKIAl9CiB9CkBAIC02NDQsNyArNjQ0LDcgQEAKIAkJCWlmIChldmVudCkgewogCQkJCS8qIGV2ZW50IGhhcyBvdmVyZmxvd2VkICovCiAJCQkJZm91bmQgPSAxOwotCQkJCXJlY29yZF9hbmRfcmVzdGFydChldmVudCwgdmFsLCByZWdzLCBubWkpOworCQkJCXJlY29yZF9hbmRfcmVzdGFydChldmVudCwgdmFsLCByZWdzKTsKIAkJCX0gZWxzZSB7CiAJCQkJLyoKIAkJCQkgKiBEaXNhYmxlZCBjb3VudGVyIGlzIG5lZ2F0aXZlLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjQtcG11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNC1wbXUuYwppbmRleCBlYWQ4YjNjLi5iNGYxZGRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNC1wbXUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNC1wbXUuYwpAQCAtNTg3LDYgKzU4NywxMSBAQAogCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCiAJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJfSwKIAl9LAorCVtDKE5PREUpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJfSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcl9wbXUgcG93ZXI0X3BtdSA9IHsKQEAgLTYwNCw3ICs2MDksNyBAQAogCS5jYWNoZV9ldmVudHMJCT0gJnBvd2VyNF9jYWNoZV9ldmVudHMsCiB9OwogCi1zdGF0aWMgaW50IGluaXRfcG93ZXI0X3BtdSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaW5pdF9wb3dlcjRfcG11KHZvaWQpCiB7CiAJaWYgKCFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX2NwdV90eXBlIHx8CiAJICAgIHN0cmNtcChjdXJfY3B1X3NwZWMtPm9wcm9maWxlX2NwdV90eXBlLCAicHBjNjQvcG93ZXI0IikpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNSstcG11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNSstcG11LmMKaW5kZXggZWNhMGFjNS4uYTg3NTdiYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjUrLXBtdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI1Ky1wbXUuYwpAQCAtNjUzLDYgKzY1MywxMSBAQAogCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAogCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCQl9LAogCX0sCisJW0MoTk9ERSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCQl9LAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBvd2VyX3BtdSBwb3dlcjVwX3BtdSA9IHsKQEAgLTY3Miw3ICs2NzcsNyBAQAogCS5jYWNoZV9ldmVudHMJCT0gJnBvd2VyNXBfY2FjaGVfZXZlbnRzLAogfTsKIAotc3RhdGljIGludCBpbml0X3Bvd2VyNXBfcG11KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3Bvd2VyNXBfcG11KHZvaWQpCiB7CiAJaWYgKCFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX2NwdV90eXBlIHx8CiAJICAgIChzdHJjbXAoY3VyX2NwdV9zcGVjLT5vcHJvZmlsZV9jcHVfdHlwZSwgInBwYzY0L3Bvd2VyNSsiKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjUtcG11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNS1wbXUuYwppbmRleCBkNWZmMGY2Li5lN2YwNmViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNS1wbXUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNS1wbXUuYwpAQCAtNTk1LDYgKzU5NSwxMSBAQAogCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAogCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCQl9LAogCX0sCisJW0MoTk9ERSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCQl9LAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBvd2VyX3BtdSBwb3dlcjVfcG11ID0gewpAQCAtNjEyLDcgKzYxNyw3IEBACiAJLmNhY2hlX2V2ZW50cwkJPSAmcG93ZXI1X2NhY2hlX2V2ZW50cywKIH07CiAKLXN0YXRpYyBpbnQgaW5pdF9wb3dlcjVfcG11KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3Bvd2VyNV9wbXUodm9pZCkKIHsKIAlpZiAoIWN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfY3B1X3R5cGUgfHwKIAkgICAgc3RyY21wKGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfY3B1X3R5cGUsICJwcGM2NC9wb3dlcjUiKSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI2LXBtdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjYtcG11LmMKaW5kZXggMzE2MDM5Mi4uMDNiOTVlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjYtcG11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjYtcG11LmMKQEAgLTUxNiw2ICs1MTYsMTEgQEAKIAkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQkJfSwKIAkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQkJfSwKIAl9LAorCVtDKE5PREUpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJLTEsCQktMQkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQkJfSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcl9wbXUgcG93ZXI2X3BtdSA9IHsKQEAgLTUzNSw3ICs1NDAsNyBAQAogCS5jYWNoZV9ldmVudHMJCT0gJnBvd2VyNl9jYWNoZV9ldmVudHMsCiB9OwogCi1zdGF0aWMgaW50IGluaXRfcG93ZXI2X3BtdSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaW5pdF9wb3dlcjZfcG11KHZvaWQpCiB7CiAJaWYgKCFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX2NwdV90eXBlIHx8CiAJICAgIHN0cmNtcChjdXJfY3B1X3NwZWMtPm9wcm9maWxlX2NwdV90eXBlLCAicHBjNjQvcG93ZXI2IikpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNy1wbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI3LXBtdS5jCmluZGV4IDU5Mzc0MGYuLmRlODNkNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI3LXBtdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI3LXBtdS5jCkBAIC0zNDIsNiArMzQyLDExIEBACiAJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJfSwKIAkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQl9LAogCX0sCisJW0MoTk9ERSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewktMSwJCS0xCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQl9LAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBvd2VyX3BtdSBwb3dlcjdfcG11ID0gewpAQCAtMzYwLDcgKzM2NSw3IEBACiAJLmNhY2hlX2V2ZW50cwkJPSAmcG93ZXI3X2NhY2hlX2V2ZW50cywKIH07CiAKLXN0YXRpYyBpbnQgaW5pdF9wb3dlcjdfcG11KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3Bvd2VyN19wbXUodm9pZCkKIHsKIAlpZiAoIWN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfY3B1X3R5cGUgfHwKIAkgICAgc3RyY21wKGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfY3B1X3R5cGUsICJwcGM2NC9wb3dlcjciKSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjOTcwLXBtdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGM5NzAtcG11LmMKaW5kZXggOWE2ZTA5My4uOGMyMTkwMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGM5NzAtcG11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGM5NzAtcG11LmMKQEAgLTQ2Nyw2ICs0NjcsMTEgQEAKIAkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQl9LAogCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCX0sCiAJfSwKKwlbQyhOT0RFKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CS0xLAkJLTEJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCX0sCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJfcG11IHBwYzk3MF9wbXUgPSB7CkBAIC00ODQsNyArNDg5LDcgQEAKIAkuY2FjaGVfZXZlbnRzCQk9ICZwcGM5NzBfY2FjaGVfZXZlbnRzLAogfTsKIAotc3RhdGljIGludCBpbml0X3BwYzk3MF9wbXUodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcHBjOTcwX3BtdSh2b2lkKQogewogCWlmICghY3VyX2NwdV9zcGVjLT5vcHJvZmlsZV9jcHVfdHlwZSB8fAogCSAgICAoc3RyY21wKGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfY3B1X3R5cGUsICJwcGM2NC85NzAiKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwppbmRleCA5MWU1MmRmLi44ZjUzOTU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwpAQCAtOTYsNiArOTYsNyBAQAogCQlwcmVlbXB0X2VuYWJsZSgpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGZsdXNoX2ZwX3RvX3RocmVhZCk7CiAKIHZvaWQgZW5hYmxlX2tlcm5lbF9mcCh2b2lkKQogewpAQCAtMTQ1LDYgKzE0Niw3IEBACiAJCXByZWVtcHRfZW5hYmxlKCk7CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwoZmx1c2hfYWx0aXZlY190b190aHJlYWQpOwogI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCiAKICNpZmRlZiBDT05GSUdfVlNYCkBAIC0xODYsNiArMTg4LDcgQEAKIAkJcHJlZW1wdF9lbmFibGUoKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChmbHVzaF92c3hfdG9fdGhyZWFkKTsKICNlbmRpZiAvKiBDT05GSUdfVlNYICovCiAKICNpZmRlZiBDT05GSUdfU1BFCkBAIC0yMTMsNiArMjE2LDcgQEAKICNpZmRlZiBDT05GSUdfU01QCiAJCQlCVUdfT04odHNrICE9IGN1cnJlbnQpOwogI2VuZGlmCisJCQl0c2stPnRocmVhZC5zcGVmc2NyID0gbWZzcHIoU1BSTl9TUEVGU0NSKTsKIAkJCWdpdmV1cF9zcGUodHNrKTsKIAkJfQogCQlwcmVlbXB0X2VuYWJsZSgpOwpAQCAtNjUwLDYgKzY1NCw4IEBACiAJcHJpbnRiaXRzKHJlZ3MtPm1zciwgbXNyX2JpdHMpOwogCXByaW50aygiICBDUjogJTA4bHggIFhFUjogJTA4bHhcbiIsIHJlZ3MtPmNjciwgcmVncy0+eGVyKTsKIAl0cmFwID0gVFJBUChyZWdzKTsKKwlpZiAoKHJlZ3MtPnRyYXAgIT0gMHhjMDApICYmIGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0NGQVIpKQorCQlwcmludGsoIkNGQVI6ICJSRUciXG4iLCByZWdzLT5vcmlnX2dwcjMpOwogCWlmICh0cmFwID09IDB4MzAwIHx8IHRyYXAgPT0gMHg2MDApCiAjaWZkZWYgQ09ORklHX1BQQ19BRFZfREVCVUdfUkVHUwogCQlwcmludGsoIkRFQVI6ICJSRUciLCBFU1I6ICJSRUciXG4iLCByZWdzLT5kYXIsIHJlZ3MtPmRzaXNyKTsKQEAgLTgzMSw4ICs4MzcsNiBAQAogCXVuc2lnbmVkIGxvbmcgbG9hZF9hZGRyID0gcmVncy0+Z3ByWzJdOwkvKiBzYXZlZCBieSBFTEZfUExBVF9JTklUICovCiAjZW5kaWYKIAotCXNldF9mcyhVU0VSX0RTKTsKLQogCS8qCiAJICogSWYgd2UgZXhlYyBvdXQgb2YgYSBrZXJuZWwgdGhyZWFkIHRoZW4gdGhyZWFkLnJlZ3Mgd2lsbCBub3QgYmUKIAkgKiBzZXQuICBEbyBpdCBub3cuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IGYyYzkwNmIuLjE3NGUxZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC02OSw2ICs2OSw3IEBACiB1NjQgcHBjNjRfcm1hX3NpemU7CiAjZW5kaWYKIHN0YXRpYyBwaHlzX2FkZHJfdCBmaXJzdF9tZW1ibG9ja19zaXplOworc3RhdGljIGludCBfX2luaXRkYXRhIGJvb3RfY3B1X2NvdW50OwogCiBzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9tZW0oY2hhciAqcCkKIHsKQEAgLTgyLDExICs4MywyOSBAQAogfQogZWFybHlfcGFyYW0oIm1lbSIsIGVhcmx5X3BhcnNlX21lbSk7CiAKKy8qCisgKiBvdmVybGFwc19pbml0cmQgLSBjaGVjayBmb3Igb3ZlcmxhcCB3aXRoIHBhZ2UgYWxpZ25lZCBleHRlbnNpb24gb2YKKyAqIGluaXRyZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb3ZlcmxhcHNfaW5pdHJkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKKwlpZiAoIWluaXRyZF9zdGFydCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4JKHN0YXJ0ICsgc2l6ZSkgPiBfQUxJR05fRE9XTihpbml0cmRfc3RhcnQsIFBBR0VfU0laRSkgJiYKKwkJCXN0YXJ0IDw9IF9BTElHTl9VUChpbml0cmRfZW5kLCBQQUdFX1NJWkUpOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCiAvKioKICAqIG1vdmVfZGV2aWNlX3RyZWUgLSBtb3ZlIHRyZWUgdG8gYW4gdW51c2VkIGFyZWEsIGlmIG5lZWRlZC4KICAqCiAgKiBUaGUgZGV2aWNlIHRyZWUgbWF5IGJlIGFsbG9jYXRlZCBiZXlvbmQgb3VyIG1lbW9yeSBsaW1pdCwgb3IgaW5zaWRlIHRoZQotICogY3Jhc2gga2VybmVsIHJlZ2lvbiBmb3Iga2R1bXAuIElmIHNvLCBtb3ZlIGl0IG91dCBvZiB0aGUgd2F5LgorICogY3Jhc2gga2VybmVsIHJlZ2lvbiBmb3Iga2R1bXAsIG9yIHdpdGhpbiB0aGUgcGFnZSBhbGlnbmVkIHJhbmdlIG9mIGluaXRyZC4KKyAqIElmIHNvLCBtb3ZlIGl0IG91dCBvZiB0aGUgd2F5LgogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgbW92ZV9kZXZpY2VfdHJlZSh2b2lkKQogewpAQCAtOTksNyArMTE4LDggQEAKIAlzaXplID0gYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+dG90YWxzaXplKTsKIAogCWlmICgobWVtb3J5X2xpbWl0ICYmIChzdGFydCArIHNpemUpID4gUEhZU0lDQUxfU1RBUlQgKyBtZW1vcnlfbGltaXQpIHx8Ci0JCQlvdmVybGFwc19jcmFzaGtlcm5lbChzdGFydCwgc2l6ZSkpIHsKKwkJCW92ZXJsYXBzX2NyYXNoa2VybmVsKHN0YXJ0LCBzaXplKSB8fAorCQkJb3ZlcmxhcHNfaW5pdHJkKHN0YXJ0LCBzaXplKSkgewogCQlwID0gX192YShtZW1ibG9ja19hbGxvYyhzaXplLCBQQUdFX1NJWkUpKTsKIAkJbWVtY3B5KHAsIGluaXRpYWxfYm9vdF9wYXJhbXMsIHNpemUpOwogCQlpbml0aWFsX2Jvb3RfcGFyYW1zID0gKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqKXA7CkBAIC01NTUsNyArNTc1LDkgQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAkvKiB0aGVuIHJlc2VydmUgdGhlIGluaXRyZCwgaWYgYW55ICovCiAJaWYgKGluaXRyZF9zdGFydCAmJiAoaW5pdHJkX2VuZCA+IGluaXRyZF9zdGFydCkpCi0JCW1lbWJsb2NrX3Jlc2VydmUoX19wYShpbml0cmRfc3RhcnQpLCBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0KTsKKwkJbWVtYmxvY2tfcmVzZXJ2ZShfQUxJR05fRE9XTihfX3BhKGluaXRyZF9zdGFydCksIFBBR0VfU0laRSksCisJCQlfQUxJR05fVVAoaW5pdHJkX2VuZCwgUEFHRV9TSVpFKSAtCisJCQlfQUxJR05fRE9XTihpbml0cmRfc3RhcnQsIFBBR0VfU0laRSkpOwogI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lOSVRSRCAqLwogCiAjaWZkZWYgQ09ORklHX1BQQzMyCkBAIC03NDgsNiArNzcwLDEzIEBACiAJICovCiAJb2Zfc2Nhbl9mbGF0X2R0KGVhcmx5X2luaXRfZHRfc2Nhbl9jcHVzLCBOVUxMKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfUFBDNjQpCisJLyogV2UnbGwgbGF0ZXIgd2FpdCBmb3Igc2Vjb25kYXJpZXMgdG8gY2hlY2sgaW47IHRoZXJlIGFyZQorCSAqIE5DUFVTLTEgbm9uLWJvb3QgQ1BVcyAgOi0pCisJICovCisJc3Bpbm5pbmdfc2Vjb25kYXJpZXMgPSBib290X2NwdV9jb3VudCAtIDE7CisjZW5kaWYKKwogCURCRygiIDwtIGVhcmx5X2luaXRfZGV2dHJlZSgpXG4iKTsKIH0KIApAQCAtODQxLDE2ICs4NzAsMTQgQEAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgUFNFUklFU19SRUNPTkZJR19BREQ6CiAJCWVyciA9IG9mX2ZpbmlzaF9keW5hbWljX25vZGUobm9kZSk7Ci0JCWlmIChlcnIgPCAwKSB7CisJCWlmIChlcnIgPCAwKQogCQkJcHJpbnRrKEtFUk5fRVJSICJmaW5pc2hfbm9kZSByZXR1cm5lZCAlZFxuIiwgZXJyKTsKLQkJCWVyciA9IE5PVElGWV9CQUQ7Ci0JCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZXJyID0gTk9USUZZX0RPTkU7CisJCWVyciA9IDA7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gZXJyOworCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKGVycik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcHJvbV9yZWNvbmZpZ19uYiA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCmluZGV4IGNiMjIwMjQuLjA1YjdkZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwpAQCAtODgyLDcgKzg4Miw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UCi12b2lkIHB0cmFjZV90cmlnZ2VyZWQoc3RydWN0IHBlcmZfZXZlbnQgKmJwLCBpbnQgbm1pLAordm9pZCBwdHJhY2VfdHJpZ2dlcmVkKHN0cnVjdCBwZXJmX2V2ZW50ICpicCwKIAkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKQEAgLTk3Myw3ICs5NzMsNyBAQAogCQkJCQkJCQkmYXR0ci5icF90eXBlKTsKIAogCXRocmVhZC0+cHRyYWNlX2Jwc1swXSA9IGJwID0gcmVnaXN0ZXJfdXNlcl9od19icmVha3BvaW50KCZhdHRyLAotCQkJCQkJCXB0cmFjZV90cmlnZ2VyZWQsIHRhc2spOworCQkJCQkgICAgICAgcHRyYWNlX3RyaWdnZXJlZCwgTlVMTCwgdGFzayk7CiAJaWYgKElTX0VSUihicCkpIHsKIAkJdGhyZWFkLT5wdHJhY2VfYnBzWzBdID0gTlVMTDsKIAkJcHRyYWNlX3B1dF9icmVha3BvaW50cyh0YXNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy1ydGMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy1ydGMuYwppbmRleCA3NzU3OGMwLi5jNTdjMTkzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMtcnRjLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLXJ0Yy5jCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3J0YXMuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgpAQCAtMjksOSArMzAsMTAgQEAKIAkJfQogCX0gd2hpbGUgKHdhaXRfdGltZSAmJiAoZ2V0X3RiKCkgPCBtYXhfd2FpdF90YikpOwogCi0JaWYgKGVycm9yICE9IDAgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImVycm9yOiByZWFkaW5nIHRoZSBjbG9jayBmYWlsZWQgKCVkKVxuIiwKLQkJCWVycm9yKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9XQVJOSU5HCisJCQkJICAgImVycm9yOiByZWFkaW5nIHRoZSBjbG9jayBmYWlsZWQgKCVkKVxuIiwKKwkJCQkgICBlcnJvcik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNTUsMTkgKzU3LDIxIEBACiAKIAkJd2FpdF90aW1lID0gcnRhc19idXN5X2RlbGF5X3RpbWUoZXJyb3IpOwogCQlpZiAod2FpdF90aW1lKSB7Ci0JCQlpZiAoaW5faW50ZXJydXB0KCkgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKSB7CisJCQlpZiAoaW5faW50ZXJydXB0KCkpIHsKIAkJCQltZW1zZXQocnRjX3RtLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXJyb3I6IHJlYWRpbmcgY2xvY2siCi0JCQkJICAgICAgICIgd291bGQgZGVsYXkgaW50ZXJydXB0XG4iKTsKKwkJCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9XQVJOSU5HCisJCQkJCQkgICAiZXJyb3I6IHJlYWRpbmcgY2xvY2sgIgorCQkJCQkJICAgIndvdWxkIGRlbGF5IGludGVycnVwdFxuIik7CiAJCQkJcmV0dXJuOwkvKiBkZWxheSBub3QgYWxsb3dlZCAqLwogCQkJfQogCQkJbXNsZWVwKHdhaXRfdGltZSk7CiAJCX0KIAl9IHdoaWxlICh3YWl0X3RpbWUgJiYgKGdldF90YigpIDwgbWF4X3dhaXRfdGIpKTsKIAotICAgICAgICBpZiAoZXJyb3IgIT0gMCAmJiBwcmludGtfcmF0ZWxpbWl0KCkpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJlcnJvcjogcmVhZGluZyB0aGUgY2xvY2sgZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnJvcik7CisJaWYgKGVycm9yICE9IDApIHsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fV0FSTklORworCQkJCSAgICJlcnJvcjogcmVhZGluZyB0aGUgY2xvY2sgZmFpbGVkICglZClcbiIsCisJCQkJICAgZXJyb3IpOwogCQlyZXR1cm47CiAgICAgICAgIH0KIApAQCAtOTksOSArMTAzLDEwIEBACiAJCX0KIAl9IHdoaWxlICh3YWl0X3RpbWUgJiYgKGdldF90YigpIDwgbWF4X3dhaXRfdGIpKTsKIAotICAgICAgICBpZiAoZXJyb3IgIT0gMCAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiZXJyb3I6IHNldHRpbmcgdGhlIGNsb2NrIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyb3IpOworCWlmIChlcnJvciAhPSAwKQorCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9XQVJOSU5HCisJCQkJICAgImVycm9yOiBzZXR0aW5nIHRoZSBjbG9jayBmYWlsZWQgKCVkKVxuIiwKKwkJCQkgICBlcnJvcik7CiAKICAgICAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCmluZGV4IDI3MWZmNjMuLjBlMGVhOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vcnRhcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfZmxhc2guYwppbmRleCBiZjVmNWNlLi5lMDM3Yzc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfZmxhc2guYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfZmxhc2guYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3J0YXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCmluZGV4IDc5ZmNhMjYuLmIxZDczOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwpAQCAtMzc1LDYgKzM3NSw5IEBACiAKIGludCB0aHJlYWRzX3Blcl9jb3JlLCB0aHJlYWRzX3NoaWZ0OwogY3B1bWFza190IHRocmVhZHNfY29yZV9tYXNrOworRVhQT1JUX1NZTUJPTF9HUEwodGhyZWFkc19wZXJfY29yZSk7CitFWFBPUlRfU1lNQk9MX0dQTCh0aHJlYWRzX3NoaWZ0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHRocmVhZHNfY29yZV9tYXNrKTsKIAogc3RhdGljIHZvaWQgX19pbml0IGNwdV9pbml0X3RocmVhZF9jb3JlX21hcHMoaW50IHRwYykKIHsKQEAgLTcwNCwyOSArNzA3LDE0IEBACiBhcmNoX2luaXRjYWxsKHBvd2VycGNfZGVidWdmc19pbml0KTsKICNlbmRpZgogCi1zdGF0aWMgaW50IHBwY19kZmx0X2J1c19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKLQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKK3ZvaWQgcHBjX3ByaW50a19wcm9ncmVzcyhjaGFyICpzLCB1bnNpZ25lZCBzaG9ydCBoZXgpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKLQotCS8qIFdlIGFyZSBvbmx5IGludGVyZXRlZCBpbiBkZXZpY2UgYWRkaXRpb24gKi8KLQlpZiAoYWN0aW9uICE9IEJVU19OT1RJRllfQUREX0RFVklDRSkKLQkJcmV0dXJuIDA7Ci0KLQlzZXRfZG1hX29wcyhkZXYsICZkbWFfZGlyZWN0X29wcyk7Ci0KLQlyZXR1cm4gTk9USUZZX0RPTkU7CisJcHJfaW5mbygiJXNcbiIsIHMpOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBwY19kZmx0X3BsYXRfYnVzX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gcHBjX2RmbHRfYnVzX25vdGlmeSwKLQkucHJpb3JpdHkgPSBJTlRfTUFYLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgc2V0dXBfYnVzX25vdGlmaWVyKHZvaWQpCit2b2lkIGFyY2hfc2V0dXBfcGRldl9hcmNoZGF0YShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmcGxhdGZvcm1fYnVzX3R5cGUsICZwcGNfZGZsdF9wbGF0X2J1c19ub3RpZmllcik7Ci0JcmV0dXJuIDA7CisJcGRldi0+YXJjaGRhdGEuZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCXBkZXYtPmRldi5kbWFfbWFzayA9ICZwZGV2LT5hcmNoZGF0YS5kbWFfbWFzazsKKyAJc2V0X2RtYV9vcHMoJnBkZXYtPmRldiwgJmRtYV9kaXJlY3Rfb3BzKTsKIH0KLQotYXJjaF9pbml0Y2FsbChzZXR1cF9idXNfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IDYyMGQ3OTIuLjIwOTEzNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKQEAgLTQ4LDggKzQ4LDggQEAKIAogaW50IGJvb3RfY3B1aWQgPSAtMTsKIEVYUE9SVF9TWU1CT0xfR1BMKGJvb3RfY3B1aWQpOwotaW50IF9faW5pdGRhdGEgYm9vdF9jcHVfY291bnQ7CiBpbnQgYm9vdF9jcHVpZF9waHlzOworRVhQT1JUX1NZTUJPTF9HUEwoYm9vdF9jcHVpZF9waHlzKTsKIAogaW50IHNtcF9od19pbmRleFtOUl9DUFVTXTsKIApAQCAtMTI3LDYgKzEyNyw4IEBACiAJLyogRG8gc29tZSBlYXJseSBpbml0aWFsaXphdGlvbiBiYXNlZCBvbiB0aGUgZmxhdCBkZXZpY2UgdHJlZSAqLwogCWVhcmx5X2luaXRfZGV2dHJlZShfX3ZhKGR0X3B0cikpOwogCisJZWFybHlfaW5pdF9tbXUoKTsKKwogCXByb2JlX21hY2hpbmUoKTsKIAogCXNldHVwX2tkdW1wX3RyYW1wb2xpbmUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwppbmRleCBhODhiZjI3Li5hZWJlZjEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCkBAIC02Myw2ICs2Myw3IEBACiAjaW5jbHVkZSA8YXNtL2tleGVjLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NvZGUtcGF0Y2hpbmcuaD4KKyNpbmNsdWRlIDxhc20va3ZtX3BwYy5oPgogCiAjaW5jbHVkZSAic2V0dXAuaCIKIApAQCAtNzMsNyArNzQsNyBAQAogI2VuZGlmCiAKIGludCBib290X2NwdWlkID0gMDsKLWludCBfX2luaXRkYXRhIGJvb3RfY3B1X2NvdW50OworaW50IF9faW5pdGRhdGEgc3Bpbm5pbmdfc2Vjb25kYXJpZXM7CiB1NjQgcHBjNjRfcGZ0X3NpemU7CiAKIC8qIFBpY2sgZGVmYXVsdHMgc2luY2Ugd2UgbWlnaHQgd2FudCB0byBwYXRjaCBpbnN0cnVjdGlvbnMKQEAgLTI1MywxMSArMjU0LDExIEBACiAJZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7CiAJCW1iKCk7CiAJCUhNVF9sb3coKTsKLQkJaWYgKGJvb3RfY3B1X2NvdW50ID09IDApCisJCWlmIChzcGlubmluZ19zZWNvbmRhcmllcyA9PSAwKQogCQkJYnJlYWs7CiAJCXVkZWxheSgxKTsKIAl9Ci0JREJHKCJib290X2NwdV9jb3VudCA9ICVkXG4iLCBib290X2NwdV9jb3VudCk7CisJREJHKCJzcGlubmluZ19zZWNvbmRhcmllcyA9ICVkXG4iLCBzcGlubmluZ19zZWNvbmRhcmllcyk7CiAKIAlEQkcoIiA8LSBzbXBfcmVsZWFzZV9jcHVzKClcbiIpOwogfQpAQCAtNTgwLDYgKzU4MSw4IEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgTU1VIGNvbnRleHQgbWFuYWdlbWVudCBzdHVmZiAqLwogCW1tdV9jb250ZXh0X2luaXQoKTsKIAorCWt2bV9ybWFfaW5pdCgpOworCiAJcHBjNjRfYm9vdF9tc2coMHgxNSwgIlNldHVwIERvbmUiKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKaW5kZXggYjk2YTNhMC4uNzhiNzZkYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpZmRlZiBDT05GSUdfUFBDNjQKICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgpAQCAtODkyLDExICs4OTMsMTIgQEAKIAlwcmludGsoImJhZGZyYW1lIGluIGhhbmRsZV9ydF9zaWduYWwsIHJlZ3M9JXAgZnJhbWU9JXAgbmV3c3A9JWx4XG4iLAogCSAgICAgICByZWdzLCBmcmFtZSwgbmV3c3ApOwogI2VuZGlmCi0JaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcmludGsoS0VSTl9JTkZPICIlc1slZF06IGJhZCBmcmFtZSBpbiBoYW5kbGVfcnRfc2lnbmFsMzI6ICIKLQkJCSIlcCBuaXAgJTA4bHggbHIgJTA4bHhcbiIsCi0JCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCi0JCQlhZGRyLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOworCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzKQorCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9JTkZPCisJCQkJICAgIiVzWyVkXTogYmFkIGZyYW1lIGluIGhhbmRsZV9ydF9zaWduYWwzMjogIgorCQkJCSAgICIlcCBuaXAgJTA4bHggbHIgJTA4bHhcbiIsCisJCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAorCQkJCSAgIGFkZHIsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CiAKIAlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7CiAJcmV0dXJuIDA7CkBAIC0xMDU4LDExICsxMDYwLDEyIEBACiAJcmV0dXJuIDA7CiAKICBiYWQ6Ci0JaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcmludGsoS0VSTl9JTkZPICIlc1slZF06IGJhZCBmcmFtZSBpbiBzeXNfcnRfc2lncmV0dXJuOiAiCi0JCQkiJXAgbmlwICUwOGx4IGxyICUwOGx4XG4iLAotCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAotCQkJcnRfc2YsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CisJaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMpCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8KKwkJCQkgICAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gc3lzX3J0X3NpZ3JldHVybjogIgorCQkJCSAgICIlcCBuaXAgJTA4bHggbHIgJTA4bHhcbiIsCisJCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAorCQkJCSAgIHJ0X3NmLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOwogCiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwpAQCAtMTE0OSwxMiArMTE1MiwxMiBAQAogCSAqIFdlIGtpbGwgdGhlIHRhc2sgd2l0aCBhIFNJR1NFR1YgaW4gdGhpcyBzaXR1YXRpb24uCiAJICovCiAJaWYgKGRvX3NldGNvbnRleHQoY3R4LCByZWdzLCAxKSkgewotCQlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscyAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9JTkZPICIlc1slZF06IGJhZCBmcmFtZSBpbiAiCi0JCQkJInN5c19kZWJ1Z19zZXRjb250ZXh0OiAlcCBuaXAgJTA4bHggIgotCQkJCSJsciAlMDhseFxuIiwKLQkJCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCi0JCQkJY3R4LCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOworCQlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscykKKwkJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8gIiVzWyVkXTogYmFkIGZyYW1lIGluICIKKwkJCQkJICAgInN5c19kZWJ1Z19zZXRjb250ZXh0OiAlcCBuaXAgJTA4bHggIgorCQkJCQkgICAibHIgJTA4bHhcbiIsCisJCQkJCSAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKKwkJCQkJICAgY3R4LCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOwogCiAJCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKIAkJZ290byBvdXQ7CkBAIC0xMjM2LDExICsxMjM5LDEyIEBACiAJcHJpbnRrKCJiYWRmcmFtZSBpbiBoYW5kbGVfc2lnbmFsLCByZWdzPSVwIGZyYW1lPSVwIG5ld3NwPSVseFxuIiwKIAkgICAgICAgcmVncywgZnJhbWUsIG5ld3NwKTsKICNlbmRpZgotCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gaGFuZGxlX3NpZ25hbDMyOiAiCi0JCQkiJXAgbmlwICUwOGx4IGxyICUwOGx4XG4iLAotCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAotCQkJZnJhbWUsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CisJaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMpCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8KKwkJCQkgICAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gaGFuZGxlX3NpZ25hbDMyOiAiCisJCQkJICAgIiVwIG5pcCAlMDhseCBsciAlMDhseFxuIiwKKwkJCQkgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCisJCQkJICAgZnJhbWUsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CiAKIAlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7CiAJcmV0dXJuIDA7CkBAIC0xMjg4LDExICsxMjkyLDEyIEBACiAJcmV0dXJuIDA7CiAKIGJhZGZyYW1lOgotCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gc3lzX3NpZ3JldHVybjogIgotCQkJIiVwIG5pcCAlMDhseCBsciAlMDhseFxuIiwKLQkJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKLQkJCWFkZHIsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CisJaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMpCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0lORk8KKwkJCQkgICAiJXNbJWRdOiBiYWQgZnJhbWUgaW4gc3lzX3NpZ3JldHVybjogIgorCQkJCSAgICIlcCBuaXAgJTA4bHggbHIgJTA4bHhcbiIsCisJCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAorCQkJCSAgIGFkZHIsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CiAKIAlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYwppbmRleCBkYTk4OWZmLi5lOTFjNzM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CkBAIC0zODAsMTAgKzM4MSwxMCBAQAogCXByaW50aygiYmFkZnJhbWUgaW4gc3lzX3J0X3NpZ3JldHVybiwgcmVncz0lcCB1Yz0lcCAmdWMtPnVjX21jb250ZXh0PSVwXG4iLAogCSAgICAgICByZWdzLCB1YywgJnVjLT51Y19tY29udGV4dCk7CiAjZW5kaWYKLQlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscyAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhyZWdzLT5tc3IgJiBNU1JfNjRCSVQgPyBmbXQ2NCA6IGZtdDMyLAotCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAicnRfc2lncmV0dXJuIiwKLQkJCShsb25nKXVjLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOworCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzKQorCQlwcmludGtfcmF0ZWxpbWl0ZWQocmVncy0+bXNyICYgTVNSXzY0QklUID8gZm10NjQgOiBmbXQzMiwKKwkJCQkgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsICJydF9zaWdyZXR1cm4iLAorCQkJCSAgIChsb25nKXVjLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOwogCiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwpAQCAtNDY4LDEwICs0NjksMTAgQEAKIAlwcmludGsoImJhZGZyYW1lIGluIHNldHVwX3J0X2ZyYW1lLCByZWdzPSVwIGZyYW1lPSVwIG5ld3NwPSVseFxuIiwKIAkgICAgICAgcmVncywgZnJhbWUsIG5ld3NwKTsKICNlbmRpZgotCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJpbnRrKHJlZ3MtPm1zciAmIE1TUl82NEJJVCA/IGZtdDY0IDogZm10MzIsCi0JCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsICJzZXR1cF9ydF9mcmFtZSIsCi0JCQkobG9uZylmcmFtZSwgcmVncy0+bmlwLCByZWdzLT5saW5rKTsKKwlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscykKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKHJlZ3MtPm1zciAmIE1TUl82NEJJVCA/IGZtdDY0IDogZm10MzIsCisJCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAic2V0dXBfcnRfZnJhbWUiLAorCQkJCSAgIChsb25nKWZyYW1lLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmspOwogCiAJZm9yY2Vfc2lnc2VndihzaWduciwgY3VycmVudCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwppbmRleCA4ZWJjNjcwLi5mOTMyZjhhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKQEAgLTIwMiwxNCArMjAyLDYgQEAKIAlzbXBfb3BzLT5jYXVzZV9pcGkoY3B1LCBpbmZvLT5kYXRhKTsKIH0KIAotdm9pZCBzbXBfbXV4ZWRfaXBpX3Jlc2VuZCh2b2lkKQotewotCXN0cnVjdCBjcHVfbWVzc2FnZXMgKmluZm8gPSAmX19nZXRfY3B1X3ZhcihpcGlfbWVzc2FnZSk7Ci0KLQlpZiAoaW5mby0+bWVzc2FnZXMpCi0JCXNtcF9vcHMtPmNhdXNlX2lwaShzbXBfcHJvY2Vzc29yX2lkKCksIGluZm8tPmRhdGEpOwotfQotCiBpcnFyZXR1cm5fdCBzbXBfaXBpX2RlbXV4KHZvaWQpCiB7CiAJc3RydWN0IGNwdV9tZXNzYWdlcyAqaW5mbyA9ICZfX2dldF9jcHVfdmFyKGlwaV9tZXNzYWdlKTsKQEAgLTIzOCwxNSArMjMwLDI2IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BQQ19TTVBfTVVYRURfSVBJICovCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19tZXNzYWdlX3Bhc3MoaW50IGNwdSwgaW50IG1zZykKK3sKKwlpZiAoc21wX29wcy0+bWVzc2FnZV9wYXNzKQorCQlzbXBfb3BzLT5tZXNzYWdlX3Bhc3MoY3B1LCBtc2cpOworI2lmZGVmIENPTkZJR19QUENfU01QX01VWEVEX0lQSQorCWVsc2UKKwkJc21wX211eGVkX2lwaV9tZXNzYWdlX3Bhc3MoY3B1LCBtc2cpOworI2VuZGlmCit9CisKIHZvaWQgc21wX3NlbmRfcmVzY2hlZHVsZShpbnQgY3B1KQogewogCWlmIChsaWtlbHkoc21wX29wcykpCi0JCXNtcF9vcHMtPm1lc3NhZ2VfcGFzcyhjcHUsIFBQQ19NU0dfUkVTQ0hFRFVMRSk7CisJCWRvX21lc3NhZ2VfcGFzcyhjcHUsIFBQQ19NU0dfUkVTQ0hFRFVMRSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzbXBfc2VuZF9yZXNjaGVkdWxlKTsKIAogdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpKGludCBjcHUpCiB7Ci0Jc21wX29wcy0+bWVzc2FnZV9wYXNzKGNwdSwgUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFKTsKKwlkb19tZXNzYWdlX3Bhc3MoY3B1LCBQUENfTVNHX0NBTExfRlVOQ19TSU5HTEUpOwogfQogCiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQpAQCAtMjU0LDcgKzI1Nyw3IEBACiAJdW5zaWduZWQgaW50IGNwdTsKIAogCWZvcl9lYWNoX2NwdShjcHUsIG1hc2spCi0JCXNtcF9vcHMtPm1lc3NhZ2VfcGFzcyhjcHUsIFBQQ19NU0dfQ0FMTF9GVU5DVElPTik7CisJCWRvX21lc3NhZ2VfcGFzcyhjcHUsIFBQQ19NU0dfQ0FMTF9GVU5DVElPTik7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR0dFUikgfHwgZGVmaW5lZChDT05GSUdfS0VYRUMpCkBAIC0yNjgsNyArMjcxLDcgQEAKIAogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQogCQlpZiAoY3B1ICE9IG1lKQotCQkJc21wX29wcy0+bWVzc2FnZV9wYXNzKGNwdSwgUFBDX01TR19ERUJVR0dFUl9CUkVBSyk7CisJCQlkb19tZXNzYWdlX3Bhc3MoY3B1LCBQUENfTVNHX0RFQlVHR0VSX0JSRUFLKTsKIH0KICNlbmRpZgogCkBAIC0zMDMsNiArMzA2LDEwIEBACiBzdGF0aWMgdm9pZCBfX2RldmluaXQgc21wX3N0b3JlX2NwdV9pbmZvKGludCBpZCkKIHsKIAlwZXJfY3B1KGNwdV9wdnIsIGlkKSA9IG1mc3ByKFNQUk5fUFZSKTsKKyNpZmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKKwlwZXJfY3B1KG5leHRfdGxiY2FtX2lkeCwgaWQpCisJCT0gKG1mc3ByKFNQUk5fVExCMUNGRykgJiBUTEJuQ0ZHX05fRU5UUlkpIC0gMTsKKyNlbmRpZgogfQogCiB2b2lkIF9faW5pdCBzbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKaW5kZXggZjMzYWNmZC4uMDNiMjlhNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKQEAgLTU0NCw3ICs1NDQsNyBAQAogCiAjZW5kaWYgLyogMzIgdnMgNjQgYml0ICovCiAKLXZvaWQgc2V0X2lycV93b3JrX3BlbmRpbmcodm9pZCkKK3ZvaWQgYXJjaF9pcnFfd29ya19yYWlzZSh2b2lkKQogewogCXByZWVtcHRfZGlzYWJsZSgpOwogCXNldF9pcnFfd29ya19wZW5kaW5nX2ZsYWcoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwppbmRleCAwZmY0YWI5Li5mMTlkOTc3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2VtdWxhdGVkX29wcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0xOTcsMTIgKzE5OCwxMSBAQAogCQlpZiAoZGllKCJFeGNlcHRpb24gaW4ga2VybmVsIG1vZGUiLCByZWdzLCBzaWducikpCiAJCQlyZXR1cm47CiAJfSBlbHNlIGlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmCi0JCSAgICB1bmhhbmRsZWRfc2lnbmFsKGN1cnJlbnQsIHNpZ25yKSAmJgotCQkgICAgcHJpbnRrX3JhdGVsaW1pdCgpKSB7Ci0JCQlwcmludGsocmVncy0+bXNyICYgTVNSXzY0QklUID8gZm10NjQgOiBmbXQzMiwKLQkJCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHNpZ25yLAotCQkJCWFkZHIsIHJlZ3MtPm5pcCwgcmVncy0+bGluaywgY29kZSk7Ci0JCX0KKwkJICAgdW5oYW5kbGVkX3NpZ25hbChjdXJyZW50LCBzaWducikpIHsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKHJlZ3MtPm1zciAmIE1TUl82NEJJVCA/IGZtdDY0IDogZm10MzIsCisJCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBzaWduciwKKwkJCQkgICBhZGRyLCByZWdzLT5uaXAsIHJlZ3MtPmxpbmssIGNvZGUpOworCX0KIAogCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKIAlpbmZvLnNpX3NpZ25vID0gc2lnbnI7CkBAIC00MjUsNyArNDI1LDcgQEAKIAl1bnNpZ25lZCBsb25nIHJlYXNvbiA9IG1jc3I7CiAJaW50IHJlY292ZXJhYmxlID0gMTsKIAotCWlmIChyZWFzb24gJiBNQ1NSX0JVU19SQkVSUikgeworCWlmIChyZWFzb24gJiBNQ1NSX0xEKSB7CiAJCXJlY292ZXJhYmxlID0gZnNsX3Jpb19tY2hlY2tfZXhjZXB0aW9uKHJlZ3MpOwogCQlpZiAocmVjb3ZlcmFibGUgPT0gMSkKIAkJCWdvdG8gc2lsZW50X291dDsKQEAgLTEzNDIsOSArMTM0Miw4IEBACiAJfSBlbHNlIHsKIAkJLyogZGlkbid0IHJlY29nbml6ZSB0aGUgaW5zdHJ1Y3Rpb24gKi8KIAkJLyogWFhYIHF1aWNrIGhhY2sgZm9yIG5vdzogc2V0IHRoZSBub24tSmF2YSBiaXQgaW4gdGhlIFZTQ1IgKi8KLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5yZWNvZ25pemVkIGFsdGl2ZWMgaW5zdHJ1Y3Rpb24gIgotCQkJICAgICAgICJpbiAlcyBhdCAlbHhcbiIsIGN1cnJlbnQtPmNvbW0sIHJlZ3MtPm5pcCk7CisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUiAiVW5yZWNvZ25pemVkIGFsdGl2ZWMgaW5zdHJ1Y3Rpb24gIgorCQkJCSAgICJpbiAlcyBhdCAlbHhcbiIsIGN1cnJlbnQtPmNvbW0sIHJlZ3MtPm5pcCk7CiAJCWN1cnJlbnQtPnRocmVhZC52c2NyLnVbM10gfD0gMHgxMDAwMDsKIAl9CiB9CkBAIC0xMzg4LDEwICsxMzg3LDcgQEAKIAlpbnQgY29kZSA9IDA7CiAJaW50IGVycjsKIAotCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmIChyZWdzLT5tc3IgJiBNU1JfU1BFKQotCQlnaXZldXBfc3BlKGN1cnJlbnQpOwotCXByZWVtcHRfZW5hYmxlKCk7CisJZmx1c2hfc3BlX3RvX3RocmVhZChjdXJyZW50KTsKIAogCXNwZWZzY3IgPSBjdXJyZW50LT50aHJlYWQuc3BlZnNjcjsKIAlmcGV4Y19tb2RlID0gY3VycmVudC0+dGhyZWFkLmZwZXhjX21vZGU7CkBAIC0xNTQ4LDkgKzE1NDQsOCBAQAogCiB2b2lkIHBwY193YXJuX2VtdWxhdGVkX3ByaW50KGNvbnN0IGNoYXIgKnR5cGUpCiB7Ci0JaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJfd2FybmluZygiJXMgdXNlZCBlbXVsYXRlZCAlcyBpbnN0cnVjdGlvblxuIiwgY3VycmVudC0+Y29tbSwKLQkJCSAgIHR5cGUpOworCXByX3dhcm5fcmF0ZWxpbWl0ZWQoIiVzIHVzZWQgZW11bGF0ZWQgJXMgaW5zdHJ1Y3Rpb25cbiIsIGN1cnJlbnQtPmNvbW0sCisJCQkgICAgdHlwZSk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBwY193YXJuX2VtdWxhdGVkX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdWRiZy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnLmMKaW5kZXggMjNkNjVhYi4uZmFhODJjMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnLmMKQEAgLTMxLDYgKzMxLDkgQEAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfRUFSTFlfREVCVUdfTFBBUikKIAkvKiBGb3IgTFBBUiBtYWNoaW5lcyB0aGF0IGhhdmUgYW4gSFZDIGNvbnNvbGUgb24gdnRlcm0gMCAqLwogCXVkYmdfaW5pdF9kZWJ1Z19scGFyKCk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19QUENfRUFSTFlfREVCVUdfTFBBUl9IVlNJKQorCS8qIEZvciBMUEFSIG1hY2hpbmVzIHRoYXQgaGF2ZSBhbiBIVlNJIGNvbnNvbGUgb24gdnRlcm0gMCAqLworCXVkYmdfaW5pdF9kZWJ1Z19scGFyX2h2c2koKTsKICNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19FQVJMWV9ERUJVR19HNSkKIAkvKiBGb3IgdXNlIG9uIEFwcGxlIEc1IG1hY2hpbmVzICovCiAJdWRiZ19pbml0X3BtYWNfcmVhbG1vZGUoKTsKQEAgLTY4LDYgKzcxLDggQEAKIAogI2lmZGVmIENPTkZJR19QUENfRUFSTFlfREVCVUcKIAljb25zb2xlX2xvZ2xldmVsID0gMTA7CisKKwlyZWdpc3Rlcl9lYXJseV91ZGJnX2NvbnNvbGUoKTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtLzQ0eF90bGIuYyBiL2FyY2gvcG93ZXJwYy9rdm0vNDR4X3RsYi5jCmluZGV4IDVmM2NmZjguLjMzYWE3MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vNDR4X3RsYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vNDR4X3RsYi5jCkBAIC0zODcsOCArMzg3LDEwIEBACiAJfQogfQogCi12b2lkIGt2bXBwY19tbXVfcHJpdl9zd2l0Y2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgdXNlcm1vZGUpCit2b2lkIGt2bXBwY19tbXVfbXNyX25vdGlmeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBvbGRfbXNyKQogeworCWludCB1c2VybW9kZSA9IHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfUFI7CisKIAl2Y3B1LT5hcmNoLnNoYWRvd19waWQgPSAhdXNlcm1vZGU7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9rdm0vS2NvbmZpZwppbmRleCBiN2JhZmY3Li43ODEzM2RlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9LY29uZmlnCkBAIC0yMCw3ICsyMCw2IEBACiAJYm9vbAogCXNlbGVjdCBQUkVFTVBUX05PVElGSUVSUwogCXNlbGVjdCBBTk9OX0lOT0RFUwotCXNlbGVjdCBLVk1fTU1JTwogCiBjb25maWcgS1ZNX0JPT0szU19IQU5ETEVSCiAJYm9vbApAQCAtMjgsMTYgKzI3LDIyIEBACiBjb25maWcgS1ZNX0JPT0szU18zMl9IQU5ETEVSCiAJYm9vbAogCXNlbGVjdCBLVk1fQk9PSzNTX0hBTkRMRVIKKwlzZWxlY3QgS1ZNX01NSU8KIAogY29uZmlnIEtWTV9CT09LM1NfNjRfSEFORExFUgogCWJvb2wKIAlzZWxlY3QgS1ZNX0JPT0szU19IQU5ETEVSCiAKK2NvbmZpZyBLVk1fQk9PSzNTX1BSCisJYm9vbAorCXNlbGVjdCBLVk1fTU1JTworCiBjb25maWcgS1ZNX0JPT0szU18zMgogCXRyaXN0YXRlICJLVk0gc3VwcG9ydCBmb3IgUG93ZXJQQyBib29rM3NfMzIgcHJvY2Vzc29ycyIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBQUENfQk9PSzNTXzMyICYmICFTTVAgJiYgIVBURV82NEJJVAogCXNlbGVjdCBLVk0KIAlzZWxlY3QgS1ZNX0JPT0szU18zMl9IQU5ETEVSCisJc2VsZWN0IEtWTV9CT09LM1NfUFIKIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IHJ1bm5pbmcgdW5tb2RpZmllZCBib29rM3NfMzIgZ3Vlc3Qga2VybmVscwogCSAgaW4gdmlydHVhbCBtYWNoaW5lcyBvbiBib29rM3NfMzIgaG9zdCBwcm9jZXNzb3JzLgpAQCAtNTAsOCArNTUsOCBAQAogY29uZmlnIEtWTV9CT09LM1NfNjQKIAl0cmlzdGF0ZSAiS1ZNIHN1cHBvcnQgZm9yIFBvd2VyUEMgYm9vazNzXzY0IHByb2Nlc3NvcnMiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgUFBDX0JPT0szU182NAotCXNlbGVjdCBLVk0KIAlzZWxlY3QgS1ZNX0JPT0szU182NF9IQU5ETEVSCisJc2VsZWN0IEtWTQogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgcnVubmluZyB1bm1vZGlmaWVkIGJvb2szc182NCBhbmQgYm9vazNzXzMyIGd1ZXN0IGtlcm5lbHMKIAkgIGluIHZpcnR1YWwgbWFjaGluZXMgb24gYm9vazNzXzY0IGhvc3QgcHJvY2Vzc29ycy4KQEAgLTYxLDEwICs2NiwzNCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgS1ZNX0JPT0szU182NF9IVgorCWJvb2wgIktWTSBzdXBwb3J0IGZvciBQT1dFUjcgYW5kIFBQQzk3MCB1c2luZyBoeXBlcnZpc29yIG1vZGUgaW4gaG9zdCIKKwlkZXBlbmRzIG9uIEtWTV9CT09LM1NfNjQKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IHJ1bm5pbmcgdW5tb2RpZmllZCBib29rM3NfNjQgZ3Vlc3Qga2VybmVscyBpbgorCSAgdmlydHVhbCBtYWNoaW5lcyBvbiBQT1dFUjcgYW5kIFBQQzk3MCBwcm9jZXNzb3JzIHRoYXQgaGF2ZQorCSAgaHlwZXJ2aXNvciBtb2RlIGF2YWlsYWJsZSB0byB0aGUgaG9zdC4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIEtWTSB3aWxsIHVzZSB0aGUgaGFyZHdhcmUgdmlydHVhbGl6YXRpb24KKwkgIGZhY2lsaXRpZXMgb2YgUE9XRVI3IChhbmQgbGF0ZXIpIHByb2Nlc3NvcnMsIG1lYW5pbmcgdGhhdAorCSAgZ3Vlc3Qgb3BlcmF0aW5nIHN5c3RlbXMgd2lsbCBydW4gYXQgZnVsbCBoYXJkd2FyZSBzcGVlZAorCSAgdXNpbmcgc3VwZXJ2aXNvciBhbmQgdXNlciBtb2Rlcy4gIEhvd2V2ZXIsIHRoaXMgYWxzbyBtZWFucworCSAgdGhhdCBLVk0gaXMgbm90IHVzYWJsZSB1bmRlciBQb3dlclZNIChwSHlwKSwgaXMgb25seSB1c2FibGUKKwkgIG9uIFBPV0VSNyAob3IgbGF0ZXIpIHByb2Nlc3NvcnMgYW5kIFBQQzk3MC1mYW1pbHkgcHJvY2Vzc29ycywKKwkgIGFuZCBjYW5ub3QgZW11bGF0ZSBhIGRpZmZlcmVudCBwcm9jZXNzb3IgZnJvbSB0aGUgaG9zdCBwcm9jZXNzb3IuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBLVk1fQk9PSzNTXzY0X1BSCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gS1ZNX0JPT0szU182NCAmJiAhS1ZNX0JPT0szU182NF9IVgorCXNlbGVjdCBLVk1fQk9PSzNTX1BSCisKIGNvbmZpZyBLVk1fNDQwCiAJYm9vbCAiS1ZNIHN1cHBvcnQgZm9yIFBvd2VyUEMgNDQwIHByb2Nlc3NvcnMiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgNDR4CiAJc2VsZWN0IEtWTQorCXNlbGVjdCBLVk1fTU1JTwogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgcnVubmluZyB1bm1vZGlmaWVkIDQ0MCBndWVzdCBrZXJuZWxzIGluIHZpcnR1YWwgbWFjaGluZXMgb24KIAkgIDQ0MCBob3N0IHByb2Nlc3NvcnMuCkBAIC04OSw2ICsxMTgsNyBAQAogCWJvb2wgIktWTSBzdXBwb3J0IGZvciBQb3dlclBDIEU1MDAgcHJvY2Vzc29ycyIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBFNTAwCiAJc2VsZWN0IEtWTQorCXNlbGVjdCBLVk1fTU1JTwogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgcnVubmluZyB1bm1vZGlmaWVkIEU1MDAgZ3Vlc3Qga2VybmVscyBpbiB2aXJ0dWFsIG1hY2hpbmVzIG9uCiAJICBFNTAwIGhvc3QgcHJvY2Vzc29ycy4KQEAgLTk5LDYgKzEyOSw1IEBACiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBzb3VyY2UgZHJpdmVycy92aG9zdC9LY29uZmlnCi1zb3VyY2UgZHJpdmVycy92aXJ0aW8vS2NvbmZpZwogCiBlbmRpZiAjIFZJUlRVQUxJWkFUSU9OCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2t2bS9NYWtlZmlsZQppbmRleCA0ZDY4NjM4Li4wODQyOGUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUKQEAgLTM4LDI0ICszOCw0MiBAQAogCWU1MDBfZW11bGF0ZS5vCiBrdm0tb2Jqcy0kKENPTkZJR19LVk1fRTUwMCkgOj0gJChrdm0tZTUwMC1vYmpzKQogCi1rdm0tYm9vazNzXzY0LW9ianMgOj0gXAotCSQoY29tbW9uLW9ianMteSkgXAora3ZtLWJvb2szc182NC1vYmpzLSQoQ09ORklHX0tWTV9CT09LM1NfNjRfUFIpIDo9IFwKKwkuLi8uLi8uLi92aXJ0L2t2bS9jb2FsZXNjZWRfbW1pby5vIFwKIAlmcHUubyBcCiAJYm9vazNzX3BhaXJlZF9zaW5nbGVzLm8gXAotCWJvb2szcy5vIFwKKwlib29rM3NfcHIubyBcCiAJYm9vazNzX2VtdWxhdGUubyBcCiAJYm9vazNzX2ludGVycnVwdHMubyBcCiAJYm9vazNzX21tdV9ocHRlLm8gXAogCWJvb2szc182NF9tbXVfaG9zdC5vIFwKIAlib29rM3NfNjRfbW11Lm8gXAogCWJvb2szc18zMl9tbXUubwota3ZtLW9ianMtJChDT05GSUdfS1ZNX0JPT0szU182NCkgOj0gJChrdm0tYm9vazNzXzY0LW9ianMpCisKK2t2bS1ib29rM3NfNjQtb2Jqcy0kKENPTkZJR19LVk1fQk9PSzNTXzY0X0hWKSA6PSBcCisJYm9vazNzX2h2Lm8gXAorCWJvb2szc19odl9pbnRlcnJ1cHRzLm8gXAorCWJvb2szc182NF9tbXVfaHYubwora3ZtLWJvb2szc182NC1idWlsdGluLW9ianMtJChDT05GSUdfS1ZNX0JPT0szU182NF9IVikgOj0gXAorCWJvb2szc19odl9ybV9tbXUubyBcCisJYm9vazNzXzY0X3Zpb19odi5vIFwKKwlib29rM3NfaHZfYnVpbHRpbi5vCisKK2t2bS1ib29rM3NfNjQtbW9kdWxlLW9ianMgOj0gXAorCS4uLy4uLy4uL3ZpcnQva3ZtL2t2bV9tYWluLm8gXAorCXBvd2VycGMubyBcCisJZW11bGF0ZS5vIFwKKwlib29rM3MubyBcCisJJChrdm0tYm9vazNzXzY0LW9ianMteSkKKwora3ZtLW9ianMtJChDT05GSUdfS1ZNX0JPT0szU182NCkgOj0gJChrdm0tYm9vazNzXzY0LW1vZHVsZS1vYmpzKQogCiBrdm0tYm9vazNzXzMyLW9ianMgOj0gXAogCSQoY29tbW9uLW9ianMteSkgXAogCWZwdS5vIFwKIAlib29rM3NfcGFpcmVkX3NpbmdsZXMubyBcCiAJYm9vazNzLm8gXAorCWJvb2szc19wci5vIFwKIAlib29rM3NfZW11bGF0ZS5vIFwKIAlib29rM3NfaW50ZXJydXB0cy5vIFwKIAlib29rM3NfbW11X2hwdGUubyBcCkBAIC03MCwzICs4OCw0IEBACiBvYmotJChDT05GSUdfS1ZNX0JPT0szU182NCkgKz0ga3ZtLm8KIG9iai0kKENPTkZJR19LVk1fQk9PSzNTXzMyKSArPSBrdm0ubwogCitvYmoteSArPSAkKGt2bS1ib29rM3NfNjQtYnVpbHRpbi1vYmpzLXkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYwppbmRleCAwZjk1YjVjLi5mNjhhMzRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlICJ0cmFjZS5oIgogCiAjaW5jbHVkZSA8YXNtL3JlZy5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgpAQCAtMjgsMjUgKzI3LDE3IEBACiAjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KICNpbmNsdWRlIDxhc20va3ZtX2Jvb2szcy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogCisjaW5jbHVkZSAidHJhY2UuaCIKKwogI2RlZmluZSBWQ1BVX1NUQVQoeCkgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBzdGF0LngpLCBLVk1fU1RBVF9WQ1BVCiAKIC8qICNkZWZpbmUgRVhJVF9ERUJVRyAqLwotLyogI2RlZmluZSBERUJVR19FWFQgKi8KLQotc3RhdGljIGludCBrdm1wcGNfaGFuZGxlX2V4dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGludCBleGl0X25yLAotCQkJICAgICB1bG9uZyBtc3IpOwotCi0vKiBTb21lIGNvbXBhdGliaWxpdHkgZGVmaW5lcyAqLwotI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzMyCi0jZGVmaW5lIE1TUl9VU0VSMzIgTVNSX1VTRVIKLSNkZWZpbmUgTVNSX1VTRVI2NCBNU1JfVVNFUgotI2RlZmluZSBIV19QQUdFX1NJWkUgUEFHRV9TSVpFCi0jZW5kaWYKIAogc3RydWN0IGt2bV9zdGF0c19kZWJ1Z2ZzX2l0ZW0gZGVidWdmc19lbnRyaWVzW10gPSB7CiAJeyAiZXhpdHMiLCAgICAgICBWQ1BVX1NUQVQoc3VtX2V4aXRzKSB9LApAQCAtNzcsMTAwICs2OCwxMSBAQAogewogfQogCi12b2lkIGt2bXBwY19jb3JlX3ZjcHVfbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBjcHUpCi17Ci0jaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfNjQKLQltZW1jcHkodG9fc3ZjcHUodmNwdSktPnNsYiwgdG9fYm9vazNzKHZjcHUpLT5zbGJfc2hhZG93LCBzaXplb2YodG9fc3ZjcHUodmNwdSktPnNsYikpOwotCW1lbWNweSgmZ2V0X3BhY2EoKS0+c2hhZG93X3ZjcHUsIHRvX2Jvb2szcyh2Y3B1KS0+c2hhZG93X3ZjcHUsCi0JICAgICAgIHNpemVvZihnZXRfcGFjYSgpLT5zaGFkb3dfdmNwdSkpOwotCXRvX3N2Y3B1KHZjcHUpLT5zbGJfbWF4ID0gdG9fYm9vazNzKHZjcHUpLT5zbGJfc2hhZG93X21heDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfMzIKLQljdXJyZW50LT50aHJlYWQua3ZtX3NoYWRvd192Y3B1ID0gdG9fYm9vazNzKHZjcHUpLT5zaGFkb3dfdmNwdTsKLSNlbmRpZgotfQotCi12b2lkIGt2bXBwY19jb3JlX3ZjcHVfcHV0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAotCW1lbWNweSh0b19ib29rM3ModmNwdSktPnNsYl9zaGFkb3csIHRvX3N2Y3B1KHZjcHUpLT5zbGIsIHNpemVvZih0b19zdmNwdSh2Y3B1KS0+c2xiKSk7Ci0JbWVtY3B5KHRvX2Jvb2szcyh2Y3B1KS0+c2hhZG93X3ZjcHUsICZnZXRfcGFjYSgpLT5zaGFkb3dfdmNwdSwKLQkgICAgICAgc2l6ZW9mKGdldF9wYWNhKCktPnNoYWRvd192Y3B1KSk7Ci0JdG9fYm9vazNzKHZjcHUpLT5zbGJfc2hhZG93X21heCA9IHRvX3N2Y3B1KHZjcHUpLT5zbGJfbWF4OwotI2VuZGlmCi0KLQlrdm1wcGNfZ2l2ZXVwX2V4dCh2Y3B1LCBNU1JfRlApOwotCWt2bXBwY19naXZldXBfZXh0KHZjcHUsIE1TUl9WRUMpOwotCWt2bXBwY19naXZldXBfZXh0KHZjcHUsIE1TUl9WU1gpOwotfQotCi1zdGF0aWMgdm9pZCBrdm1wcGNfcmVjYWxjX3NoYWRvd19tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXVsb25nIHNtc3IgPSB2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyOwotCi0JLyogR3Vlc3QgTVNSIHZhbHVlcyAqLwotCXNtc3IgJj0gTVNSX0ZFMCB8IE1TUl9GRTEgfCBNU1JfU0YgfCBNU1JfU0UgfCBNU1JfQkUgfCBNU1JfREU7Ci0JLyogUHJvY2VzcyBNU1IgdmFsdWVzICovCi0Jc21zciB8PSBNU1JfTUUgfCBNU1JfUkkgfCBNU1JfSVIgfCBNU1JfRFIgfCBNU1JfUFIgfCBNU1JfRUU7Ci0JLyogRXh0ZXJuYWwgcHJvdmlkZXJzIHRoZSBndWVzdCByZXNlcnZlZCAqLwotCXNtc3IgfD0gKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiB2Y3B1LT5hcmNoLmd1ZXN0X293bmVkX2V4dCk7Ci0JLyogNjQtYml0IFByb2Nlc3MgTVNSIHZhbHVlcyAqLwotI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0Ci0Jc21zciB8PSBNU1JfSVNGIHwgTVNSX0hWOwotI2VuZGlmCi0JdmNwdS0+YXJjaC5zaGFkb3dfbXNyID0gc21zcjsKLX0KLQotdm9pZCBrdm1wcGNfc2V0X21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBtc3IpCi17Ci0JdWxvbmcgb2xkX21zciA9IHZjcHUtPmFyY2guc2hhcmVkLT5tc3I7Ci0KLSNpZmRlZiBFWElUX0RFQlVHCi0JcHJpbnRrKEtFUk5fSU5GTyAiS1ZNOiBTZXQgTVNSIHRvIDB4JWxseFxuIiwgbXNyKTsKLSNlbmRpZgotCi0JbXNyICY9IHRvX2Jvb2szcyh2Y3B1KS0+bXNyX21hc2s7Ci0JdmNwdS0+YXJjaC5zaGFyZWQtPm1zciA9IG1zcjsKLQlrdm1wcGNfcmVjYWxjX3NoYWRvd19tc3IodmNwdSk7Ci0KLQlpZiAobXNyICYgTVNSX1BPVykgewotCQlpZiAoIXZjcHUtPmFyY2gucGVuZGluZ19leGNlcHRpb25zKSB7Ci0JCQlrdm1fdmNwdV9ibG9jayh2Y3B1KTsKLQkJCXZjcHUtPnN0YXQuaGFsdF93YWtldXArKzsKLQotCQkJLyogVW5zZXQgUE9XIGJpdCBhZnRlciB3ZSB3b2tlIHVwICovCi0JCQltc3IgJj0gfk1TUl9QT1c7Ci0JCQl2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyID0gbXNyOwotCQl9Ci0JfQotCi0JaWYgKCh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgKE1TUl9QUnxNU1JfSVJ8TVNSX0RSKSkgIT0KLQkJICAgKG9sZF9tc3IgJiAoTVNSX1BSfE1TUl9JUnxNU1JfRFIpKSkgewotCQlrdm1wcGNfbW11X2ZsdXNoX3NlZ21lbnRzKHZjcHUpOwotCQlrdm1wcGNfbW11X21hcF9zZWdtZW50KHZjcHUsIGt2bXBwY19nZXRfcGModmNwdSkpOwotCi0JCS8qIFByZWxvYWQgbWFnaWMgcGFnZSBzZWdtZW50IHdoZW4gaW4ga2VybmVsIG1vZGUgKi8KLQkJaWYgKCEobXNyICYgTVNSX1BSKSAmJiB2Y3B1LT5hcmNoLm1hZ2ljX3BhZ2VfcGEpIHsKLQkJCXN0cnVjdCBrdm1fdmNwdV9hcmNoICphID0gJnZjcHUtPmFyY2g7Ci0KLQkJCWlmIChtc3IgJiBNU1JfRFIpCi0JCQkJa3ZtcHBjX21tdV9tYXBfc2VnbWVudCh2Y3B1LCBhLT5tYWdpY19wYWdlX2VhKTsKLQkJCWVsc2UKLQkJCQlrdm1wcGNfbW11X21hcF9zZWdtZW50KHZjcHUsIGEtPm1hZ2ljX3BhZ2VfcGEpOwotCQl9Ci0JfQotCi0JLyogUHJlbG9hZCBGUFUgaWYgaXQncyBlbmFibGVkICovCi0JaWYgKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfRlApCi0JCWt2bXBwY19oYW5kbGVfZXh0KHZjcHUsIEJPT0szU19JTlRFUlJVUFRfRlBfVU5BVkFJTCwgTVNSX0ZQKTsKLX0KLQogdm9pZCBrdm1wcGNfaW5qZWN0X2ludGVycnVwdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCB2ZWMsIHU2NCBmbGFncykKIHsKIAl2Y3B1LT5hcmNoLnNoYXJlZC0+c3JyMCA9IGt2bXBwY19nZXRfcGModmNwdSk7CiAJdmNwdS0+YXJjaC5zaGFyZWQtPnNycjEgPSB2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyIHwgZmxhZ3M7Ci0Ja3ZtcHBjX3NldF9wYyh2Y3B1LCB0b19ib29rM3ModmNwdSktPmhpb3IgKyB2ZWMpOworCWt2bXBwY19zZXRfcGModmNwdSwga3ZtcHBjX2ludGVycnVwdF9vZmZzZXQodmNwdSkgKyB2ZWMpOwogCXZjcHUtPmFyY2gubW11LnJlc2V0X21zcih2Y3B1KTsKIH0KIApAQCAtMjA0LDExICsxMDYsMTMgQEAKIHN0YXRpYyB2b2lkIGt2bXBwY19ib29rM3NfZGVxdWV1ZV9pcnFwcmlvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkJICB1bnNpZ25lZCBpbnQgdmVjKQogeworCXVuc2lnbmVkIGxvbmcgb2xkX3BlbmRpbmcgPSB2Y3B1LT5hcmNoLnBlbmRpbmdfZXhjZXB0aW9uczsKKwogCWNsZWFyX2JpdChrdm1wcGNfYm9vazNzX3ZlYzJpcnFwcmlvKHZlYyksCiAJCSAgJnZjcHUtPmFyY2gucGVuZGluZ19leGNlcHRpb25zKTsKIAotCWlmICghdmNwdS0+YXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMpCi0JCXZjcHUtPmFyY2guc2hhcmVkLT5pbnRfcGVuZGluZyA9IDA7CisJa3ZtcHBjX3VwZGF0ZV9pbnRfcGVuZGluZyh2Y3B1LCB2Y3B1LT5hcmNoLnBlbmRpbmdfZXhjZXB0aW9ucywKKwkJCQkgIG9sZF9wZW5kaW5nKTsKIH0KIAogdm9pZCBrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBpbnQgdmVjKQpAQCAtMjI1LDggKzEyOSw4IEBACiAKIHZvaWQga3ZtcHBjX2NvcmVfcXVldWVfcHJvZ3JhbShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIGZsYWdzKQogewotCXRvX2Jvb2szcyh2Y3B1KS0+cHJvZ19mbGFncyA9IGZsYWdzOwotCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LCBCT09LM1NfSU5URVJSVVBUX1BST0dSQU0pOworCS8qIG1pZ2h0IGFzIHdlbGwgZGVsaXZlciB0aGlzIHN0cmFpZ2h0IGF3YXkgKi8KKwlrdm1wcGNfaW5qZWN0X2ludGVycnVwdCh2Y3B1LCBCT09LM1NfSU5URVJSVVBUX1BST0dSQU0sIGZsYWdzKTsKIH0KIAogdm9pZCBrdm1wcGNfY29yZV9xdWV1ZV9kZWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMjY2LDIxICsxNzAsNyBAQAogewogCWludCBkZWxpdmVyID0gMTsKIAlpbnQgdmVjID0gMDsKLQl1bG9uZyBmbGFncyA9IDBVTEw7Ci0JdWxvbmcgY3JpdF9yYXcgPSB2Y3B1LT5hcmNoLnNoYXJlZC0+Y3JpdGljYWw7Ci0JdWxvbmcgY3JpdF9yMSA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDEpOwotCWJvb2wgY3JpdDsKLQotCS8qIFRydW5jYXRlIGNyaXQgaW5kaWNhdG9ycyBpbiAzMiBiaXQgbW9kZSAqLwotCWlmICghKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfU0YpKSB7Ci0JCWNyaXRfcmF3ICY9IDB4ZmZmZmZmZmY7Ci0JCWNyaXRfcjEgJj0gMHhmZmZmZmZmZjsKLQl9Ci0KLQkvKiBDcml0aWNhbCBzZWN0aW9uIHdoZW4gY3JpdCA9PSByMSAqLwotCWNyaXQgPSAoY3JpdF9yYXcgPT0gY3JpdF9yMSk7Ci0JLyogLi4uIGFuZCB3ZSdyZSBpbiBzdXBlcnZpc29yIG1vZGUgKi8KLQljcml0ID0gY3JpdCAmJiAhKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfUFIpOworCWJvb2wgY3JpdCA9IGt2bXBwY19jcml0aWNhbF9zZWN0aW9uKHZjcHUpOwogCiAJc3dpdGNoIChwcmlvcml0eSkgewogCWNhc2UgQk9PSzNTX0lSUVBSSU9fREVDUkVNRU5URVI6CkBAIC0zMTUsNyArMjA1LDYgQEAKIAkJYnJlYWs7CiAJY2FzZSBCT09LM1NfSVJRUFJJT19QUk9HUkFNOgogCQl2ZWMgPSBCT09LM1NfSU5URVJSVVBUX1BST0dSQU07Ci0JCWZsYWdzID0gdG9fYm9vazNzKHZjcHUpLT5wcm9nX2ZsYWdzOwogCQlicmVhazsKIAljYXNlIEJPT0szU19JUlFQUklPX1ZTWDoKIAkJdmVjID0gQk9PSzNTX0lOVEVSUlVQVF9WU1g7CkBAIC0zNDYsNyArMjM1LDcgQEAKICNlbmRpZgogCiAJaWYgKGRlbGl2ZXIpCi0JCWt2bXBwY19pbmplY3RfaW50ZXJydXB0KHZjcHUsIHZlYywgZmxhZ3MpOworCQlrdm1wcGNfaW5qZWN0X2ludGVycnVwdCh2Y3B1LCB2ZWMsIDApOwogCiAJcmV0dXJuIGRlbGl2ZXI7CiB9CkBAIC0zOTIsNjQgKzI4MSw3IEBACiAJfQogCiAJLyogVGVsbCB0aGUgZ3Vlc3QgYWJvdXQgb3VyIGludGVycnVwdCBzdGF0dXMgKi8KLQlpZiAoKnBlbmRpbmcpCi0JCXZjcHUtPmFyY2guc2hhcmVkLT5pbnRfcGVuZGluZyA9IDE7Ci0JZWxzZSBpZiAob2xkX3BlbmRpbmcpCi0JCXZjcHUtPmFyY2guc2hhcmVkLT5pbnRfcGVuZGluZyA9IDA7Ci19Ci0KLXZvaWQga3ZtcHBjX3NldF9wdnIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgcHZyKQotewotCXUzMiBob3N0X3B2cjsKLQotCXZjcHUtPmFyY2guaGZsYWdzICY9IH5CT09LM1NfSEZMQUdfU0xCOwotCXZjcHUtPmFyY2gucHZyID0gcHZyOwotI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0Ci0JaWYgKChwdnIgPj0gMHgzMzAwMDApICYmIChwdnIgPCAweDcwMzMwMDAwKSkgewotCQlrdm1wcGNfbW11X2Jvb2szc182NF9pbml0KHZjcHUpOwotCQl0b19ib29rM3ModmNwdSktPmhpb3IgPSAweGZmZjAwMDAwOwotCQl0b19ib29rM3ModmNwdSktPm1zcl9tYXNrID0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlrdm1wcGNfbW11X2Jvb2szc18zMl9pbml0KHZjcHUpOwotCQl0b19ib29rM3ModmNwdSktPmhpb3IgPSAwOwotCQl0b19ib29rM3ModmNwdSktPm1zcl9tYXNrID0gMHhmZmZmZmZmZlVMTDsKLQl9Ci0KLQkvKiBJZiB3ZSBhcmUgaW4gaHlwZXJ2aXNvciBsZXZlbCBvbiA5NzAsIHdlIGNhbiB0ZWxsIHRoZSBDUFUgdG8KLQkgKiB0cmVhdCBEQ0JaIGFzIDMyIGJ5dGVzIHN0b3JlICovCi0JdmNwdS0+YXJjaC5oZmxhZ3MgJj0gfkJPT0szU19IRkxBR19EQ0JaMzI7Ci0JaWYgKHZjcHUtPmFyY2gubW11LmlzX2RjYnozMih2Y3B1KSAmJiAobWZtc3IoKSAmIE1TUl9IVikgJiYKLQkgICAgIXN0cmNtcChjdXJfY3B1X3NwZWMtPnBsYXRmb3JtLCAicHBjOTcwIikpCi0JCXZjcHUtPmFyY2guaGZsYWdzIHw9IEJPT0szU19IRkxBR19EQ0JaMzI7Ci0KLQkvKiBDZWxsIHBlcmZvcm1zIGJhZGx5IGlmIE1TUl9GRXggYXJlIHNldC4gU28gbGV0J3MgaG9wZSBub2JvZHkKLQkgICByZWFsbHkgbmVlZHMgdGhlbSBpbiBhIFZNIG9uIENlbGwgYW5kIGZvcmNlIGRpc2FibGUgdGhlbS4gKi8KLQlpZiAoIXN0cmNtcChjdXJfY3B1X3NwZWMtPnBsYXRmb3JtLCAicHBjLWNlbGwtYmUiKSkKLQkJdG9fYm9vazNzKHZjcHUpLT5tc3JfbWFzayAmPSB+KE1TUl9GRTAgfCBNU1JfRkUxKTsKLQotI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzMyCi0JLyogMzIgYml0IEJvb2szUyBhbHdheXMgaGFzIDMyIGJ5dGUgZGNieiAqLwotCXZjcHUtPmFyY2guaGZsYWdzIHw9IEJPT0szU19IRkxBR19EQ0JaMzI7Ci0jZW5kaWYKLQotCS8qIE9uIHNvbWUgQ1BVcyB3ZSBjYW4gZXhlY3V0ZSBwYWlyZWQgc2luZ2xlIG9wZXJhdGlvbnMgbmF0aXZlbHkgKi8KLQlhc20gKCAibWZwdnIgJTAiIDogIj1yIihob3N0X3B2cikpOwotCXN3aXRjaCAoaG9zdF9wdnIpIHsKLQljYXNlIDB4MDAwODAyMDA6CS8qIGxvbmVzdGFyIDIuMCAqLwotCWNhc2UgMHgwMDA4ODIwMjoJLyogbG9uZXN0YXIgMi4yICovCi0JY2FzZSAweDcwMDAwMTAwOgkvKiBnZWtrbyAxLjAgKi8KLQljYXNlIDB4MDAwODAxMDA6CS8qIGdla2tvIDIuMCAqLwotCWNhc2UgMHgwMDA4MzIwMzoJLyogZ2Vra28gMi4zYSAqLwotCWNhc2UgMHgwMDA4MzIxMzoJLyogZ2Vra28gMi4zYiAqLwotCWNhc2UgMHgwMDA4MzIwNDoJLyogZ2Vra28gMi40ICovCi0JY2FzZSAweDAwMDgzMjE0OgkvKiBnZWtrbyAyLjRlICg4U0UpIC0gcmV0YWlsIEhXMiAqLwotCWNhc2UgMHgwMDA4NzIwMDoJLyogYnJvYWR3YXkgKi8KLQkJdmNwdS0+YXJjaC5oZmxhZ3MgfD0gQk9PSzNTX0hGTEFHX05BVElWRV9QUzsKLQkJLyogRW5hYmxlIEhJRDIuUFNFIC0gaW4gY2FzZSB3ZSBuZWVkIGl0IGxhdGVyICovCi0JCW10c3ByKFNQUk5fSElEMl9HRUtLTywgbWZzcHIoU1BSTl9ISUQyX0dFS0tPKSB8ICgxIDw8IDI5KSk7Ci0JfQorCWt2bXBwY191cGRhdGVfaW50X3BlbmRpbmcodmNwdSwgKnBlbmRpbmcsIG9sZF9wZW5kaW5nKTsKIH0KIAogcGZuX3Qga3ZtcHBjX2dmbl90b19wZm4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBnZm4pCkBAIC00NzEsNDQgKzMwMyw2IEBACiAJcmV0dXJuIGdmbl90b19wZm4odmNwdS0+a3ZtLCBnZm4pOwogfQogCi0vKiBCb29rM3NfMzIgQ1BVcyBhbHdheXMgaGF2ZSAzMiBieXRlcyBjYWNoZSBsaW5lIHNpemUsIHdoaWNoIExpbnV4IGFzc3VtZXMuIFRvCi0gKiBtYWtlIEJvb2szc18zMiBMaW51eCB3b3JrIG9uIEJvb2szc182NCwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgd2UgdHJhcCBkY2J6IHRvCi0gKiBlbXVsYXRlIDMyIGJ5dGVzIGRjYnogbGVuZ3RoLgotICoKLSAqIFRoZSBCb29rM3NfNjQgaW52ZW50b3JzIGFsc28gcmVhbGl6ZWQgdGhpcyBjYXNlIGFuZCBpbXBsZW1lbnRlZCBhIHNwZWNpYWwgYml0Ci0gKiBpbiB0aGUgSElENSByZWdpc3Rlciwgd2hpY2ggaXMgYSBoeXBlcnZpc29yIHJlc3NvdXJjZS4gVGh1cyB3ZSBjYW4ndCB1c2UgaXQuCi0gKgotICogTXkgYXBwcm9hY2ggaGVyZSBpcyB0byBwYXRjaCB0aGUgZGNieiBpbnN0cnVjdGlvbiBvbiBleGVjdXRpbmcgcGFnZXMuCi0gKi8KLXN0YXRpYyB2b2lkIGt2bXBwY19wYXRjaF9kY2J6KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bXBwY19wdGUgKnB0ZSkKLXsKLQlzdHJ1Y3QgcGFnZSAqaHBhZ2U7Ci0JdTY0IGhwYWdlX29mZnNldDsKLQl1MzIgKnBhZ2U7Ci0JaW50IGk7Ci0KLQlocGFnZSA9IGdmbl90b19wYWdlKHZjcHUtPmt2bSwgcHRlLT5yYWRkciA+PiBQQUdFX1NISUZUKTsKLQlpZiAoaXNfZXJyb3JfcGFnZShocGFnZSkpIHsKLQkJa3ZtX3JlbGVhc2VfcGFnZV9jbGVhbihocGFnZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlocGFnZV9vZmZzZXQgPSBwdGUtPnJhZGRyICYgflBBR0VfTUFTSzsKLQlocGFnZV9vZmZzZXQgJj0gfjB4RkZGVUxMOwotCWhwYWdlX29mZnNldCAvPSA0OwotCi0JZ2V0X3BhZ2UoaHBhZ2UpOwotCXBhZ2UgPSBrbWFwX2F0b21pYyhocGFnZSwgS01fVVNFUjApOwotCi0JLyogcGF0Y2ggZGNieiBpbnRvIHJlc2VydmVkIGluc3RydWN0aW9uLCBzbyB3ZSB0cmFwICovCi0JZm9yIChpPWhwYWdlX29mZnNldDsgaSA8IGhwYWdlX29mZnNldCArIChIV19QQUdFX1NJWkUgLyA0KTsgaSsrKQotCQlpZiAoKHBhZ2VbaV0gJiAweGZmMDAwN2ZmKSA9PSBJTlNfRENCWikKLQkJCXBhZ2VbaV0gJj0gMHhmZmZmZmZmNzsKLQotCWt1bm1hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCXB1dF9wYWdlKGhwYWdlKTsKLX0KLQogc3RhdGljIGludCBrdm1wcGNfeGxhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyBlYWRkciwgYm9vbCBkYXRhLAogCQkJIHN0cnVjdCBrdm1wcGNfcHRlICpwdGUpCiB7CkBAIC02MDYsNTE5ICs0MDAsNiBAQAogCXJldHVybiBFTVVMQVRFX0RPX01NSU87CiB9CiAKLXN0YXRpYyBpbnQga3ZtcHBjX3Zpc2libGVfZ2ZuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ2ZuX3QgZ2ZuKQotewotCXVsb25nIG1wX3BhID0gdmNwdS0+YXJjaC5tYWdpY19wYWdlX3BhOwotCi0JaWYgKHVubGlrZWx5KG1wX3BhKSAmJgotCSAgICB1bmxpa2VseSgobXBfcGEgJiBLVk1fUEFNKSA+PiBQQUdFX1NISUZUID09IGdmbikpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIGt2bV9pc192aXNpYmxlX2dmbih2Y3B1LT5rdm0sIGdmbik7Ci19Ci0KLWludCBrdm1wcGNfaGFuZGxlX3BhZ2VmYXVsdChzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkgICAgdWxvbmcgZWFkZHIsIGludCB2ZWMpCi17Ci0JYm9vbCBkYXRhID0gKHZlYyA9PSBCT09LM1NfSU5URVJSVVBUX0RBVEFfU1RPUkFHRSk7Ci0JaW50IHIgPSBSRVNVTUVfR1VFU1Q7Ci0JaW50IHJlbG9jYXRlZDsKLQlpbnQgcGFnZV9mb3VuZCA9IDA7Ci0Jc3RydWN0IGt2bXBwY19wdGUgcHRlOwotCWJvb2wgaXNfbW1pbyA9IGZhbHNlOwotCWJvb2wgZHIgPSAodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIE1TUl9EUikgPyB0cnVlIDogZmFsc2U7Ci0JYm9vbCBpciA9ICh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgTVNSX0lSKSA/IHRydWUgOiBmYWxzZTsKLQl1NjQgdnNpZDsKLQotCXJlbG9jYXRlZCA9IGRhdGEgPyBkciA6IGlyOwotCi0JLyogUmVzb2x2ZSByZWFsIGFkZHJlc3MgaWYgdHJhbnNsYXRpb24gdHVybmVkIG9uICovCi0JaWYgKHJlbG9jYXRlZCkgewotCQlwYWdlX2ZvdW5kID0gdmNwdS0+YXJjaC5tbXUueGxhdGUodmNwdSwgZWFkZHIsICZwdGUsIGRhdGEpOwotCX0gZWxzZSB7Ci0JCXB0ZS5tYXlfZXhlY3V0ZSA9IHRydWU7Ci0JCXB0ZS5tYXlfcmVhZCA9IHRydWU7Ci0JCXB0ZS5tYXlfd3JpdGUgPSB0cnVlOwotCQlwdGUucmFkZHIgPSBlYWRkciAmIEtWTV9QQU07Ci0JCXB0ZS5lYWRkciA9IGVhZGRyOwotCQlwdGUudnBhZ2UgPSBlYWRkciA+PiAxMjsKLQl9Ci0KLQlzd2l0Y2ggKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiAoTVNSX0RSfE1TUl9JUikpIHsKLQljYXNlIDA6Ci0JCXB0ZS52cGFnZSB8PSAoKHU2NClWU0lEX1JFQUwgPDwgKFNJRF9TSElGVCAtIDEyKSk7Ci0JCWJyZWFrOwotCWNhc2UgTVNSX0RSOgotCWNhc2UgTVNSX0lSOgotCQl2Y3B1LT5hcmNoLm1tdS5lc2lkX3RvX3ZzaWQodmNwdSwgZWFkZHIgPj4gU0lEX1NISUZULCAmdnNpZCk7Ci0KLQkJaWYgKCh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgKE1TUl9EUnxNU1JfSVIpKSA9PSBNU1JfRFIpCi0JCQlwdGUudnBhZ2UgfD0gKCh1NjQpVlNJRF9SRUFMX0RSIDw8IChTSURfU0hJRlQgLSAxMikpOwotCQllbHNlCi0JCQlwdGUudnBhZ2UgfD0gKCh1NjQpVlNJRF9SRUFMX0lSIDw8IChTSURfU0hJRlQgLSAxMikpOwotCQlwdGUudnBhZ2UgfD0gdnNpZDsKLQotCQlpZiAodnNpZCA9PSAtMSkKLQkJCXBhZ2VfZm91bmQgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQlpZiAodmNwdS0+YXJjaC5tbXUuaXNfZGNiejMyKHZjcHUpICYmCi0JICAgKCEodmNwdS0+YXJjaC5oZmxhZ3MgJiBCT09LM1NfSEZMQUdfRENCWjMyKSkpIHsKLQkJLyoKLQkJICogSWYgd2UgZG8gdGhlIGRjYnogaGFjaywgd2UgaGF2ZSB0byBOWCBvbiBldmVyeSBleGVjdXRpb24sCi0JCSAqIHNvIHdlIGNhbiBwYXRjaCB0aGUgZXhlY3V0aW5nIGNvZGUuIFRoaXMgcmVuZGVycyBvdXIgZ3Vlc3QKLQkJICogTlgtbGVzcy4KLQkJICovCi0JCXB0ZS5tYXlfZXhlY3V0ZSA9ICFkYXRhOwotCX0KLQotCWlmIChwYWdlX2ZvdW5kID09IC1FTk9FTlQpIHsKLQkJLyogUGFnZSBub3QgZm91bmQgaW4gZ3Vlc3QgUFRFIGVudHJpZXMgKi8KLQkJdmNwdS0+YXJjaC5zaGFyZWQtPmRhciA9IGt2bXBwY19nZXRfZmF1bHRfZGFyKHZjcHUpOwotCQl2Y3B1LT5hcmNoLnNoYXJlZC0+ZHNpc3IgPSB0b19zdmNwdSh2Y3B1KS0+ZmF1bHRfZHNpc3I7Ci0JCXZjcHUtPmFyY2guc2hhcmVkLT5tc3IgfD0KLQkJCSh0b19zdmNwdSh2Y3B1KS0+c2hhZG93X3NycjEgJiAweDAwMDAwMDAwZjgwMDAwMDBVTEwpOwotCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgdmVjKTsKLQl9IGVsc2UgaWYgKHBhZ2VfZm91bmQgPT0gLUVQRVJNKSB7Ci0JCS8qIFN0b3JhZ2UgcHJvdGVjdGlvbiAqLwotCQl2Y3B1LT5hcmNoLnNoYXJlZC0+ZGFyID0ga3ZtcHBjX2dldF9mYXVsdF9kYXIodmNwdSk7Ci0JCXZjcHUtPmFyY2guc2hhcmVkLT5kc2lzciA9Ci0JCQl0b19zdmNwdSh2Y3B1KS0+ZmF1bHRfZHNpc3IgJiB+RFNJU1JfTk9IUFRFOwotCQl2Y3B1LT5hcmNoLnNoYXJlZC0+ZHNpc3IgfD0gRFNJU1JfUFJPVEZBVUxUOwotCQl2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyIHw9Ci0JCQkodG9fc3ZjcHUodmNwdSktPnNoYWRvd19zcnIxICYgMHgwMDAwMDAwMGY4MDAwMDAwVUxMKTsKLQkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsIHZlYyk7Ci0JfSBlbHNlIGlmIChwYWdlX2ZvdW5kID09IC1FSU5WQUwpIHsKLQkJLyogUGFnZSBub3QgZm91bmQgaW4gZ3Vlc3QgU0xCICovCi0JCXZjcHUtPmFyY2guc2hhcmVkLT5kYXIgPSBrdm1wcGNfZ2V0X2ZhdWx0X2Rhcih2Y3B1KTsKLQkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsIHZlYyArIDB4ODApOwotCX0gZWxzZSBpZiAoIWlzX21taW8gJiYKLQkJICAga3ZtcHBjX3Zpc2libGVfZ2ZuKHZjcHUsIHB0ZS5yYWRkciA+PiBQQUdFX1NISUZUKSkgewotCQkvKiBUaGUgZ3Vlc3QncyBQVEUgaXMgbm90IG1hcHBlZCB5ZXQuIE1hcCBvbiB0aGUgaG9zdCAqLwotCQlrdm1wcGNfbW11X21hcF9wYWdlKHZjcHUsICZwdGUpOwotCQlpZiAoZGF0YSkKLQkJCXZjcHUtPnN0YXQuc3Bfc3RvcmFnZSsrOwotCQllbHNlIGlmICh2Y3B1LT5hcmNoLm1tdS5pc19kY2J6MzIodmNwdSkgJiYKLQkJCSghKHZjcHUtPmFyY2guaGZsYWdzICYgQk9PSzNTX0hGTEFHX0RDQlozMikpKQotCQkJa3ZtcHBjX3BhdGNoX2RjYnoodmNwdSwgJnB0ZSk7Ci0JfSBlbHNlIHsKLQkJLyogTU1JTyAqLwotCQl2Y3B1LT5zdGF0Lm1taW9fZXhpdHMrKzsKLQkJdmNwdS0+YXJjaC5wYWRkcl9hY2Nlc3NlZCA9IHB0ZS5yYWRkcjsKLQkJciA9IGt2bXBwY19lbXVsYXRlX21taW8ocnVuLCB2Y3B1KTsKLQkJaWYgKCByID09IFJFU1VNRV9IT1NUX05WICkKLQkJCXIgPSBSRVNVTUVfSE9TVDsKLQl9Ci0KLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ2V0X2Zwcl9pbmRleChpbnQgaSkKLXsKLSNpZmRlZiBDT05GSUdfVlNYCi0JaSAqPSAyOwotI2VuZGlmCi0JcmV0dXJuIGk7Ci19Ci0KLS8qIEdpdmUgdXAgZXh0ZXJuYWwgcHJvdmlkZXIgKEZQVSwgQWx0aXZlYywgVlNYKSAqLwotdm9pZCBrdm1wcGNfZ2l2ZXVwX2V4dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIG1zcikKLXsKLQlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCA9ICZjdXJyZW50LT50aHJlYWQ7Ci0JdTY0ICp2Y3B1X2ZwciA9IHZjcHUtPmFyY2guZnByOwotI2lmZGVmIENPTkZJR19WU1gKLQl1NjQgKnZjcHVfdnN4ID0gdmNwdS0+YXJjaC52c3I7Ci0jZW5kaWYKLQl1NjQgKnRocmVhZF9mcHIgPSAodTY0Kil0LT5mcHI7Ci0JaW50IGk7Ci0KLQlpZiAoISh2Y3B1LT5hcmNoLmd1ZXN0X293bmVkX2V4dCAmIG1zcikpCi0JCXJldHVybjsKLQotI2lmZGVmIERFQlVHX0VYVAotCXByaW50ayhLRVJOX0lORk8gIkdpdmluZyB1cCBleHQgMHglbHhcbiIsIG1zcik7Ci0jZW5kaWYKLQotCXN3aXRjaCAobXNyKSB7Ci0JY2FzZSBNU1JfRlA6Ci0JCWdpdmV1cF9mcHUoY3VycmVudCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZjcHUtPmFyY2guZnByKTsgaSsrKQotCQkJdmNwdV9mcHJbaV0gPSB0aHJlYWRfZnByW2dldF9mcHJfaW5kZXgoaSldOwotCi0JCXZjcHUtPmFyY2guZnBzY3IgPSB0LT5mcHNjci52YWw7Ci0JCWJyZWFrOwotCWNhc2UgTVNSX1ZFQzoKLSNpZmRlZiBDT05GSUdfQUxUSVZFQwotCQlnaXZldXBfYWx0aXZlYyhjdXJyZW50KTsKLQkJbWVtY3B5KHZjcHUtPmFyY2gudnIsIHQtPnZyLCBzaXplb2YodmNwdS0+YXJjaC52cikpOwotCQl2Y3B1LT5hcmNoLnZzY3IgPSB0LT52c2NyOwotI2VuZGlmCi0JCWJyZWFrOwotCWNhc2UgTVNSX1ZTWDoKLSNpZmRlZiBDT05GSUdfVlNYCi0JCV9fZ2l2ZXVwX3ZzeChjdXJyZW50KTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmNwdS0+YXJjaC52c3IpOyBpKyspCi0JCQl2Y3B1X3ZzeFtpXSA9IHRocmVhZF9mcHJbZ2V0X2Zwcl9pbmRleChpKSArIDFdOwotI2VuZGlmCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotCXZjcHUtPmFyY2guZ3Vlc3Rfb3duZWRfZXh0ICY9IH5tc3I7Ci0JY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmPSB+bXNyOwotCWt2bXBwY19yZWNhbGNfc2hhZG93X21zcih2Y3B1KTsKLX0KLQotc3RhdGljIGludCBrdm1wcGNfcmVhZF9pbnN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQl1bG9uZyBzcnIwID0ga3ZtcHBjX2dldF9wYyh2Y3B1KTsKLQl1MzIgbGFzdF9pbnN0ID0ga3ZtcHBjX2dldF9sYXN0X2luc3QodmNwdSk7Ci0JaW50IHJldDsKLQotCXJldCA9IGt2bXBwY19sZCh2Y3B1LCAmc3JyMCwgc2l6ZW9mKHUzMiksICZsYXN0X2luc3QsIGZhbHNlKTsKLQlpZiAocmV0ID09IC1FTk9FTlQpIHsKLQkJdWxvbmcgbXNyID0gdmNwdS0+YXJjaC5zaGFyZWQtPm1zcjsKLQotCQltc3IgPSBrdm1wcGNfc2V0X2ZpZWxkKG1zciwgMzMsIDMzLCAxKTsKLQkJbXNyID0ga3ZtcHBjX3NldF9maWVsZChtc3IsIDM0LCAzNiwgMCk7Ci0JCXZjcHUtPmFyY2guc2hhcmVkLT5tc3IgPSBrdm1wcGNfc2V0X2ZpZWxkKG1zciwgNDIsIDQ3LCAwKTsKLQkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsIEJPT0szU19JTlRFUlJVUFRfSU5TVF9TVE9SQUdFKTsKLQkJcmV0dXJuIEVNVUxBVEVfQUdBSU47Ci0JfQotCi0JcmV0dXJuIEVNVUxBVEVfRE9ORTsKLX0KLQotc3RhdGljIGludCBrdm1wcGNfY2hlY2tfZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgaW50IGV4aXRfbnIpCi17Ci0KLQkvKiBOZWVkIHRvIGRvIHBhaXJlZCBzaW5nbGUgZW11bGF0aW9uPyAqLwotCWlmICghKHZjcHUtPmFyY2guaGZsYWdzICYgQk9PSzNTX0hGTEFHX1BBSVJFRF9TSU5HTEUpKQotCQlyZXR1cm4gRU1VTEFURV9ET05FOwotCi0JLyogUmVhZCBvdXQgdGhlIGluc3RydWN0aW9uICovCi0JaWYgKGt2bXBwY19yZWFkX2luc3QodmNwdSkgPT0gRU1VTEFURV9ET05FKQotCQkvKiBOZWVkIHRvIGVtdWxhdGUgKi8KLQkJcmV0dXJuIEVNVUxBVEVfRkFJTDsKLQotCXJldHVybiBFTVVMQVRFX0FHQUlOOwotfQotCi0vKiBIYW5kbGUgZXh0ZXJuYWwgcHJvdmlkZXJzIChGUFUsIEFsdGl2ZWMsIFZTWCkgKi8KLXN0YXRpYyBpbnQga3ZtcHBjX2hhbmRsZV9leHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBpbnQgZXhpdF9uciwKLQkJCSAgICAgdWxvbmcgbXNyKQotewotCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0ID0gJmN1cnJlbnQtPnRocmVhZDsKLQl1NjQgKnZjcHVfZnByID0gdmNwdS0+YXJjaC5mcHI7Ci0jaWZkZWYgQ09ORklHX1ZTWAotCXU2NCAqdmNwdV92c3ggPSB2Y3B1LT5hcmNoLnZzcjsKLSNlbmRpZgotCXU2NCAqdGhyZWFkX2ZwciA9ICh1NjQqKXQtPmZwcjsKLQlpbnQgaTsKLQotCS8qIFdoZW4gd2UgaGF2ZSBwYWlyZWQgc2luZ2xlcywgd2UgZW11bGF0ZSBpbiBzb2Z0d2FyZSAqLwotCWlmICh2Y3B1LT5hcmNoLmhmbGFncyAmIEJPT0szU19IRkxBR19QQUlSRURfU0lOR0xFKQotCQlyZXR1cm4gUkVTVU1FX0dVRVNUOwotCi0JaWYgKCEodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIG1zcikpIHsKLQkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsIGV4aXRfbnIpOwotCQlyZXR1cm4gUkVTVU1FX0dVRVNUOwotCX0KLQotCS8qIFdlIGFscmVhZHkgb3duIHRoZSBleHQgKi8KLQlpZiAodmNwdS0+YXJjaC5ndWVzdF9vd25lZF9leHQgJiBtc3IpIHsKLQkJcmV0dXJuIFJFU1VNRV9HVUVTVDsKLQl9Ci0KLSNpZmRlZiBERUJVR19FWFQKLQlwcmludGsoS0VSTl9JTkZPICJMb2FkaW5nIHVwIGV4dCAweCVseFxuIiwgbXNyKTsKLSNlbmRpZgotCi0JY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciB8PSBtc3I7Ci0KLQlzd2l0Y2ggKG1zcikgewotCWNhc2UgTVNSX0ZQOgotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2Y3B1LT5hcmNoLmZwcik7IGkrKykKLQkJCXRocmVhZF9mcHJbZ2V0X2Zwcl9pbmRleChpKV0gPSB2Y3B1X2ZwcltpXTsKLQotCQl0LT5mcHNjci52YWwgPSB2Y3B1LT5hcmNoLmZwc2NyOwotCQl0LT5mcGV4Y19tb2RlID0gMDsKLQkJa3ZtcHBjX2xvYWRfdXBfZnB1KCk7Ci0JCWJyZWFrOwotCWNhc2UgTVNSX1ZFQzoKLSNpZmRlZiBDT05GSUdfQUxUSVZFQwotCQltZW1jcHkodC0+dnIsIHZjcHUtPmFyY2gudnIsIHNpemVvZih2Y3B1LT5hcmNoLnZyKSk7Ci0JCXQtPnZzY3IgPSB2Y3B1LT5hcmNoLnZzY3I7Ci0JCXQtPnZyc2F2ZSA9IC0xOwotCQlrdm1wcGNfbG9hZF91cF9hbHRpdmVjKCk7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSBNU1JfVlNYOgotI2lmZGVmIENPTkZJR19WU1gKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmNwdS0+YXJjaC52c3IpOyBpKyspCi0JCQl0aHJlYWRfZnByW2dldF9mcHJfaW5kZXgoaSkgKyAxXSA9IHZjcHVfdnN4W2ldOwotCQlrdm1wcGNfbG9hZF91cF92c3goKTsKLSNlbmRpZgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0KLQl2Y3B1LT5hcmNoLmd1ZXN0X293bmVkX2V4dCB8PSBtc3I7Ci0KLQlrdm1wcGNfcmVjYWxjX3NoYWRvd19tc3IodmNwdSk7Ci0KLQlyZXR1cm4gUkVTVU1FX0dVRVNUOwotfQotCi1pbnQga3ZtcHBjX2hhbmRsZV9leGl0KHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGV4aXRfbnIpCi17Ci0JaW50IHIgPSBSRVNVTUVfSE9TVDsKLQotCXZjcHUtPnN0YXQuc3VtX2V4aXRzKys7Ci0KLQlydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfVU5LTk9XTjsKLQlydW4tPnJlYWR5X2Zvcl9pbnRlcnJ1cHRfaW5qZWN0aW9uID0gMTsKLQotCXRyYWNlX2t2bV9ib29rM3NfZXhpdChleGl0X25yLCB2Y3B1KTsKLQlrdm1fcmVzY2hlZCh2Y3B1KTsKLQlzd2l0Y2ggKGV4aXRfbnIpIHsKLQljYXNlIEJPT0szU19JTlRFUlJVUFRfSU5TVF9TVE9SQUdFOgotCQl2Y3B1LT5zdGF0LnBmX2luc3RydWMrKzsKLQotI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzMyCi0JCS8qIFdlIHNldCBzZWdtZW50cyBhcyB1bnVzZWQgc2VnbWVudHMgd2hlbiBpbnZhbGlkYXRpbmcgdGhlbS4gU28KLQkJICogdHJlYXQgdGhlIHJlc3BlY3RpdmUgZmF1bHQgYXMgc2VnbWVudCBmYXVsdC4gKi8KLQkJaWYgKHRvX3N2Y3B1KHZjcHUpLT5zcltrdm1wcGNfZ2V0X3BjKHZjcHUpID4+IFNJRF9TSElGVF0KLQkJICAgID09IFNSX0lOVkFMSUQpIHsKLQkJCWt2bXBwY19tbXVfbWFwX3NlZ21lbnQodmNwdSwga3ZtcHBjX2dldF9wYyh2Y3B1KSk7Ci0JCQlyID0gUkVTVU1FX0dVRVNUOwotCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZgotCi0JCS8qIG9ubHkgY2FyZSBhYm91dCBQVEVHIG5vdCBmb3VuZCBlcnJvcnMsIGJ1dCBsZWF2ZSBOWCBhbG9uZSAqLwotCQlpZiAodG9fc3ZjcHUodmNwdSktPnNoYWRvd19zcnIxICYgMHg0MDAwMDAwMCkgewotCQkJciA9IGt2bXBwY19oYW5kbGVfcGFnZWZhdWx0KHJ1biwgdmNwdSwga3ZtcHBjX2dldF9wYyh2Y3B1KSwgZXhpdF9ucik7Ci0JCQl2Y3B1LT5zdGF0LnNwX2luc3RydWMrKzsKLQkJfSBlbHNlIGlmICh2Y3B1LT5hcmNoLm1tdS5pc19kY2J6MzIodmNwdSkgJiYKLQkJCSAgKCEodmNwdS0+YXJjaC5oZmxhZ3MgJiBCT09LM1NfSEZMQUdfRENCWjMyKSkpIHsKLQkJCS8qCi0JCQkgKiBYWFggSWYgd2UgZG8gdGhlIGRjYnogaGFjayB3ZSB1c2UgdGhlIE5YIGJpdCB0byBmbHVzaCZwYXRjaCB0aGUgcGFnZSwKLQkJCSAqICAgICBzbyB3ZSBjYW4ndCB1c2UgdGhlIE5YIGJpdCBpbnNpZGUgdGhlIGd1ZXN0LiBMZXQncyBjcm9zcyBvdXIgZmluZ2VycywKLQkJCSAqICAgICB0aGF0IG5vIGd1ZXN0IHRoYXQgbmVlZHMgdGhlIGRjYnogaGFjayBkb2VzIE5YLgotCQkJICovCi0JCQlrdm1wcGNfbW11X3B0ZV9mbHVzaCh2Y3B1LCBrdm1wcGNfZ2V0X3BjKHZjcHUpLCB+MHhGRkZVTCk7Ci0JCQlyID0gUkVTVU1FX0dVRVNUOwotCQl9IGVsc2UgewotCQkJdmNwdS0+YXJjaC5zaGFyZWQtPm1zciB8PQotCQkJCXRvX3N2Y3B1KHZjcHUpLT5zaGFkb3dfc3JyMSAmIDB4NTgwMDAwMDA7Ci0JCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgZXhpdF9ucik7Ci0JCQlyID0gUkVTVU1FX0dVRVNUOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9EQVRBX1NUT1JBR0U6Ci0JewotCQl1bG9uZyBkYXIgPSBrdm1wcGNfZ2V0X2ZhdWx0X2Rhcih2Y3B1KTsKLQkJdmNwdS0+c3RhdC5wZl9zdG9yYWdlKys7Ci0KLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szU18zMgotCQkvKiBXZSBzZXQgc2VnbWVudHMgYXMgdW51c2VkIHNlZ21lbnRzIHdoZW4gaW52YWxpZGF0aW5nIHRoZW0uIFNvCi0JCSAqIHRyZWF0IHRoZSByZXNwZWN0aXZlIGZhdWx0IGFzIHNlZ21lbnQgZmF1bHQuICovCi0JCWlmICgodG9fc3ZjcHUodmNwdSktPnNyW2RhciA+PiBTSURfU0hJRlRdKSA9PSBTUl9JTlZBTElEKSB7Ci0JCQlrdm1wcGNfbW11X21hcF9zZWdtZW50KHZjcHUsIGRhcik7Ci0JCQlyID0gUkVTVU1FX0dVRVNUOwotCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZgotCi0JCS8qIFRoZSBvbmx5IGNhc2Ugd2UgbmVlZCB0byBoYW5kbGUgaXMgbWlzc2luZyBzaGFkb3cgUFRFcyAqLwotCQlpZiAodG9fc3ZjcHUodmNwdSktPmZhdWx0X2RzaXNyICYgRFNJU1JfTk9IUFRFKSB7Ci0JCQlyID0ga3ZtcHBjX2hhbmRsZV9wYWdlZmF1bHQocnVuLCB2Y3B1LCBkYXIsIGV4aXRfbnIpOwotCQl9IGVsc2UgewotCQkJdmNwdS0+YXJjaC5zaGFyZWQtPmRhciA9IGRhcjsKLQkJCXZjcHUtPmFyY2guc2hhcmVkLT5kc2lzciA9IHRvX3N2Y3B1KHZjcHUpLT5mYXVsdF9kc2lzcjsKLQkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LCBleGl0X25yKTsKLQkJCXIgPSBSRVNVTUVfR1VFU1Q7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9EQVRBX1NFR01FTlQ6Ci0JCWlmIChrdm1wcGNfbW11X21hcF9zZWdtZW50KHZjcHUsIGt2bXBwY19nZXRfZmF1bHRfZGFyKHZjcHUpKSA8IDApIHsKLQkJCXZjcHUtPmFyY2guc2hhcmVkLT5kYXIgPSBrdm1wcGNfZ2V0X2ZhdWx0X2Rhcih2Y3B1KTsKLQkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LAotCQkJCUJPT0szU19JTlRFUlJVUFRfREFUQV9TRUdNRU5UKTsKLQkJfQotCQlyID0gUkVTVU1FX0dVRVNUOwotCQlicmVhazsKLQljYXNlIEJPT0szU19JTlRFUlJVUFRfSU5TVF9TRUdNRU5UOgotCQlpZiAoa3ZtcHBjX21tdV9tYXBfc2VnbWVudCh2Y3B1LCBrdm1wcGNfZ2V0X3BjKHZjcHUpKSA8IDApIHsKLQkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LAotCQkJCUJPT0szU19JTlRFUlJVUFRfSU5TVF9TRUdNRU5UKTsKLQkJfQotCQlyID0gUkVTVU1FX0dVRVNUOwotCQlicmVhazsKLQkvKiBXZSdyZSBnb29kIG9uIHRoZXNlIC0gdGhlIGhvc3QgbWVyZWx5IHdhbnRlZCB0byBnZXQgb3VyIGF0dGVudGlvbiAqLwotCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9ERUNSRU1FTlRFUjoKLQkJdmNwdS0+c3RhdC5kZWNfZXhpdHMrKzsKLQkJciA9IFJFU1VNRV9HVUVTVDsKLQkJYnJlYWs7Ci0JY2FzZSBCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMOgotCQl2Y3B1LT5zdGF0LmV4dF9pbnRyX2V4aXRzKys7Ci0JCXIgPSBSRVNVTUVfR1VFU1Q7Ci0JCWJyZWFrOwotCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9QRVJGTU9OOgotCQlyID0gUkVTVU1FX0dVRVNUOwotCQlicmVhazsKLQljYXNlIEJPT0szU19JTlRFUlJVUFRfUFJPR1JBTToKLQl7Ci0JCWVudW0gZW11bGF0aW9uX3Jlc3VsdCBlcjsKLQkJdWxvbmcgZmxhZ3M7Ci0KLXByb2dyYW1faW50ZXJydXB0OgotCQlmbGFncyA9IHRvX3N2Y3B1KHZjcHUpLT5zaGFkb3dfc3JyMSAmIDB4MWYwMDAwdWxsOwotCi0JCWlmICh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgTVNSX1BSKSB7Ci0jaWZkZWYgRVhJVF9ERUJVRwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNlcnNwYWNlIHRyaWdnZXJlZCAweDcwMCBleGNlcHRpb24gYXQgMHglbHggKDB4JXgpXG4iLCBrdm1wcGNfZ2V0X3BjKHZjcHUpLCBrdm1wcGNfZ2V0X2xhc3RfaW5zdCh2Y3B1KSk7Ci0jZW5kaWYKLQkJCWlmICgoa3ZtcHBjX2dldF9sYXN0X2luc3QodmNwdSkgJiAweGZmMDAwN2ZmKSAhPQotCQkJICAgIChJTlNfRENCWiAmIDB4ZmZmZmZmZjcpKSB7Ci0JCQkJa3ZtcHBjX2NvcmVfcXVldWVfcHJvZ3JhbSh2Y3B1LCBmbGFncyk7Ci0JCQkJciA9IFJFU1VNRV9HVUVTVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXZjcHUtPnN0YXQuZW11bGF0ZWRfaW5zdF9leGl0cysrOwotCQllciA9IGt2bXBwY19lbXVsYXRlX2luc3RydWN0aW9uKHJ1biwgdmNwdSk7Ci0JCXN3aXRjaCAoZXIpIHsKLQkJY2FzZSBFTVVMQVRFX0RPTkU6Ci0JCQlyID0gUkVTVU1FX0dVRVNUX05WOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU1VTEFURV9BR0FJTjoKLQkJCXIgPSBSRVNVTUVfR1VFU1Q7Ci0JCQlicmVhazsKLQkJY2FzZSBFTVVMQVRFX0ZBSUw6Ci0JCQlwcmludGsoS0VSTl9DUklUICIlczogZW11bGF0aW9uIGF0ICVseCBmYWlsZWQgKCUwOHgpXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBrdm1wcGNfZ2V0X3BjKHZjcHUpLCBrdm1wcGNfZ2V0X2xhc3RfaW5zdCh2Y3B1KSk7Ci0JCQlrdm1wcGNfY29yZV9xdWV1ZV9wcm9ncmFtKHZjcHUsIGZsYWdzKTsKLQkJCXIgPSBSRVNVTUVfR1VFU1Q7Ci0JCQlicmVhazsKLQkJY2FzZSBFTVVMQVRFX0RPX01NSU86Ci0JCQlydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfTU1JTzsKLQkJCXIgPSBSRVNVTUVfSE9TVF9OVjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQlVHKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMOgotCQlpZiAodmNwdS0+YXJjaC5vc2lfZW5hYmxlZCAmJgotCQkgICAgKCgodTMyKWt2bXBwY19nZXRfZ3ByKHZjcHUsIDMpKSA9PSBPU0lfU0NfTUFHSUNfUjMpICYmCi0JCSAgICAoKCh1MzIpa3ZtcHBjX2dldF9ncHIodmNwdSwgNCkpID09IE9TSV9TQ19NQUdJQ19SNCkpIHsKLQkJCS8qIE1PTCBoeXBlcmNhbGxzICovCi0JCQl1NjQgKmdwcnMgPSBydW4tPm9zaS5ncHJzOwotCQkJaW50IGk7Ci0KLQkJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9PU0k7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJCQlncHJzW2ldID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgaSk7Ci0JCQl2Y3B1LT5hcmNoLm9zaV9uZWVkZWQgPSAxOwotCQkJciA9IFJFU1VNRV9IT1NUX05WOwotCQl9IGVsc2UgaWYgKCEodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIE1TUl9QUikgJiYKLQkJICAgICgoKHUzMilrdm1wcGNfZ2V0X2dwcih2Y3B1LCAwKSkgPT0gS1ZNX1NDX01BR0lDX1IwKSkgewotCQkJLyogS1ZNIFBWIGh5cGVyY2FsbHMgKi8KLQkJCWt2bXBwY19zZXRfZ3ByKHZjcHUsIDMsIGt2bXBwY19rdm1fcHYodmNwdSkpOwotCQkJciA9IFJFU1VNRV9HVUVTVDsKLQkJfSBlbHNlIHsKLQkJCS8qIEd1ZXN0IHN5c2NhbGxzICovCi0JCQl2Y3B1LT5zdGF0LnN5c2NhbGxfZXhpdHMrKzsKLQkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LCBleGl0X25yKTsKLQkJCXIgPSBSRVNVTUVfR1VFU1Q7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBCT09LM1NfSU5URVJSVVBUX0ZQX1VOQVZBSUw6Ci0JY2FzZSBCT09LM1NfSU5URVJSVVBUX0FMVElWRUM6Ci0JY2FzZSBCT09LM1NfSU5URVJSVVBUX1ZTWDoKLQl7Ci0JCWludCBleHRfbXNyID0gMDsKLQotCQlzd2l0Y2ggKGV4aXRfbnIpIHsKLQkJY2FzZSBCT09LM1NfSU5URVJSVVBUX0ZQX1VOQVZBSUw6IGV4dF9tc3IgPSBNU1JfRlA7ICBicmVhazsKLQkJY2FzZSBCT09LM1NfSU5URVJSVVBUX0FMVElWRUM6ICAgIGV4dF9tc3IgPSBNU1JfVkVDOyBicmVhazsKLQkJY2FzZSBCT09LM1NfSU5URVJSVVBUX1ZTWDogICAgICAgIGV4dF9tc3IgPSBNU1JfVlNYOyBicmVhazsKLQkJfQotCi0JCXN3aXRjaCAoa3ZtcHBjX2NoZWNrX2V4dCh2Y3B1LCBleGl0X25yKSkgewotCQljYXNlIEVNVUxBVEVfRE9ORToKLQkJCS8qIGV2ZXJ5dGhpbmcgb2sgLSBsZXQncyBlbmFibGUgdGhlIGV4dCAqLwotCQkJciA9IGt2bXBwY19oYW5kbGVfZXh0KHZjcHUsIGV4aXRfbnIsIGV4dF9tc3IpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU1VTEFURV9GQUlMOgotCQkJLyogd2UgbmVlZCB0byBlbXVsYXRlIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KLQkJCWdvdG8gcHJvZ3JhbV9pbnRlcnJ1cHQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIG5vdGhpbmcgdG8gd29ycnkgYWJvdXQgLSBnbyBhZ2FpbiAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9BTElHTk1FTlQ6Ci0JCWlmIChrdm1wcGNfcmVhZF9pbnN0KHZjcHUpID09IEVNVUxBVEVfRE9ORSkgewotCQkJdmNwdS0+YXJjaC5zaGFyZWQtPmRzaXNyID0ga3ZtcHBjX2FsaWdubWVudF9kc2lzcih2Y3B1LAotCQkJCWt2bXBwY19nZXRfbGFzdF9pbnN0KHZjcHUpKTsKLQkJCXZjcHUtPmFyY2guc2hhcmVkLT5kYXIgPSBrdm1wcGNfYWxpZ25tZW50X2Rhcih2Y3B1LAotCQkJCWt2bXBwY19nZXRfbGFzdF9pbnN0KHZjcHUpKTsKLQkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LCBleGl0X25yKTsKLQkJfQotCQlyID0gUkVTVU1FX0dVRVNUOwotCQlicmVhazsKLQljYXNlIEJPT0szU19JTlRFUlJVUFRfTUFDSElORV9DSEVDSzoKLQljYXNlIEJPT0szU19JTlRFUlJVUFRfVFJBQ0U6Ci0JCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LCBleGl0X25yKTsKLQkJciA9IFJFU1VNRV9HVUVTVDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogVWdoIC0gYm9yayBoZXJlISBXaGF0IGRpZCB3ZSBnZXQ/ICovCi0JCXByaW50ayhLRVJOX0VNRVJHICJleGl0X25yPTB4JXggfCBwYz0weCVseCB8IG1zcj0weCVseFxuIiwKLQkJCWV4aXRfbnIsIGt2bXBwY19nZXRfcGModmNwdSksIHRvX3N2Y3B1KHZjcHUpLT5zaGFkb3dfc3JyMSk7Ci0JCXIgPSBSRVNVTUVfSE9TVDsKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCX0KLQotCi0JaWYgKCEociAmIFJFU1VNRV9IT1NUKSkgewotCQkvKiBUbyBhdm9pZCBjbG9iYmVyaW5nIGV4aXRfcmVhc29uLCBvbmx5IGNoZWNrIGZvciBzaWduYWxzIGlmCi0JCSAqIHdlIGFyZW4ndCBhbHJlYWR5IGV4aXRpbmcgdG8gdXNlcnNwYWNlIGZvciBzb21lIG90aGVyCi0JCSAqIHJlYXNvbi4gKi8KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0jaWZkZWYgRVhJVF9ERUJVRwotCQkJcHJpbnRrKEtFUk5fRU1FUkcgIktWTTogR29pbmcgYmFjayB0byBob3N0XG4iKTsKLSNlbmRpZgotCQkJdmNwdS0+c3RhdC5zaWduYWxfZXhpdHMrKzsKLQkJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOwotCQkJciA9IC1FSU5UUjsKLQkJfSBlbHNlIHsKLQkJCS8qIEluIGNhc2UgYW4gaW50ZXJydXB0IGNhbWUgaW4gdGhhdCB3YXMgdHJpZ2dlcmVkCi0JCQkgKiBmcm9tIHVzZXJzcGFjZSAobGlrZSBERUMpLCB3ZSBuZWVkIHRvIGNoZWNrIHdoYXQKLQkJCSAqIHRvIGluamVjdCBub3chICovCi0JCQlrdm1wcGNfY29yZV9kZWxpdmVyX2ludGVycnVwdHModmNwdSk7Ci0JCX0KLQl9Ci0KLQl0cmFjZV9rdm1fYm9vazNzX3JlZW50ZXIociwgdmNwdSk7Ci0KLQlyZXR1cm4gcjsKLX0KLQogaW50IGt2bV9hcmNoX3ZjcHVfc2V0dXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXJldHVybiAwOwpAQCAtMTE3OSw2OSArNDYwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfZ2V0X3NyZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3ZtX3NyZWdzICpzcmVncykKLXsKLQlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1M3MgPSB0b19ib29rM3ModmNwdSk7Ci0JaW50IGk7Ci0KLQlzcmVncy0+cHZyID0gdmNwdS0+YXJjaC5wdnI7Ci0KLQlzcmVncy0+dS5zLnNkcjEgPSB0b19ib29rM3ModmNwdSktPnNkcjE7Ci0JaWYgKHZjcHUtPmFyY2guaGZsYWdzICYgQk9PSzNTX0hGTEFHX1NMQikgewotCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCQkJc3JlZ3MtPnUucy5wcGM2NC5zbGJbaV0uc2xiZSA9IHZjcHUzcy0+c2xiW2ldLm9yaWdlIHwgaTsKLQkJCXNyZWdzLT51LnMucHBjNjQuc2xiW2ldLnNsYnYgPSB2Y3B1M3MtPnNsYltpXS5vcmlndjsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQkJc3JlZ3MtPnUucy5wcGMzMi5zcltpXSA9IHZjcHUtPmFyY2guc2hhcmVkLT5zcltpXTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlzcmVncy0+dS5zLnBwYzMyLmliYXRbaV0gPSB2Y3B1M3MtPmliYXRbaV0ucmF3OwotCQkJc3JlZ3MtPnUucy5wcGMzMi5kYmF0W2ldID0gdmNwdTNzLT5kYmF0W2ldLnJhdzsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9zZXRfc3JlZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrdm1fc3JlZ3MgKnNyZWdzKQotewotCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHUzcyA9IHRvX2Jvb2szcyh2Y3B1KTsKLQlpbnQgaTsKLQotCWt2bXBwY19zZXRfcHZyKHZjcHUsIHNyZWdzLT5wdnIpOwotCi0JdmNwdTNzLT5zZHIxID0gc3JlZ3MtPnUucy5zZHIxOwotCWlmICh2Y3B1LT5hcmNoLmhmbGFncyAmIEJPT0szU19IRkxBR19TTEIpIHsKLQkJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKLQkJCXZjcHUtPmFyY2gubW11LnNsYm10ZSh2Y3B1LCBzcmVncy0+dS5zLnBwYzY0LnNsYltpXS5zbGJ2LAotCQkJCQkJICAgIHNyZWdzLT51LnMucHBjNjQuc2xiW2ldLnNsYmUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJCXZjcHUtPmFyY2gubW11Lm10c3Jpbih2Y3B1LCBpLCBzcmVncy0+dS5zLnBwYzMyLnNyW2ldKTsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlrdm1wcGNfc2V0X2JhdCh2Y3B1LCAmKHZjcHUzcy0+aWJhdFtpXSksIGZhbHNlLAotCQkJCSAgICAgICAodTMyKXNyZWdzLT51LnMucHBjMzIuaWJhdFtpXSk7Ci0JCQlrdm1wcGNfc2V0X2JhdCh2Y3B1LCAmKHZjcHUzcy0+aWJhdFtpXSksIHRydWUsCi0JCQkJICAgICAgICh1MzIpKHNyZWdzLT51LnMucHBjMzIuaWJhdFtpXSA+PiAzMikpOwotCQkJa3ZtcHBjX3NldF9iYXQodmNwdSwgJih2Y3B1M3MtPmRiYXRbaV0pLCBmYWxzZSwKLQkJCQkgICAgICAgKHUzMilzcmVncy0+dS5zLnBwYzMyLmRiYXRbaV0pOwotCQkJa3ZtcHBjX3NldF9iYXQodmNwdSwgJih2Y3B1M3MtPmRiYXRbaV0pLCB0cnVlLAotCQkJCSAgICAgICAodTMyKShzcmVncy0+dS5zLnBwYzMyLmRiYXRbaV0gPj4gMzIpKTsKLQkJfQotCX0KLQotCS8qIEZsdXNoIHRoZSBNTVUgYWZ0ZXIgbWVzc2luZyB3aXRoIHRoZSBzZWdtZW50cyAqLwotCWt2bXBwY19tbXVfcHRlX2ZsdXNoKHZjcHUsIDAsIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX2dldF9mcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2ZwdSAqZnB1KQogewogCXJldHVybiAtRU5PVFNVUFA7CkBAIC0xMjk2LDIwMiArNTE0LDMgQEAKIAltdXRleF91bmxvY2soJmt2bS0+c2xvdHNfbG9jayk7CiAJcmV0dXJuIHI7CiB9Ci0KLWludCBrdm1wcGNfY29yZV9jaGVja19wcm9jZXNzb3JfY29tcGF0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBrdm1fdmNwdSAqa3ZtcHBjX2NvcmVfdmNwdV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBpbnQgaWQpCi17Ci0Jc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdV9ib29rM3M7Ci0Jc3RydWN0IGt2bV92Y3B1ICp2Y3B1OwotCWludCBlcnIgPSAtRU5PTUVNOwotCXVuc2lnbmVkIGxvbmcgcDsKLQotCXZjcHVfYm9vazNzID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcykpOwotCWlmICghdmNwdV9ib29rM3MpCi0JCWdvdG8gb3V0OwotCi0JdmNwdV9ib29rM3MtPnNoYWRvd192Y3B1ID0gKHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1ICopCi0JCWt6YWxsb2Moc2l6ZW9mKCp2Y3B1X2Jvb2szcy0+c2hhZG93X3ZjcHUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZjcHVfYm9vazNzLT5zaGFkb3dfdmNwdSkKLQkJZ290byBmcmVlX3ZjcHU7Ci0KLQl2Y3B1ID0gJnZjcHVfYm9vazNzLT52Y3B1OwotCWVyciA9IGt2bV92Y3B1X2luaXQodmNwdSwga3ZtLCBpZCk7Ci0JaWYgKGVycikKLQkJZ290byBmcmVlX3NoYWRvd192Y3B1OwotCi0JcCA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMfF9fR0ZQX1pFUk8pOwotCS8qIHRoZSByZWFsIHNoYXJlZCBwYWdlIGZpbGxzIHRoZSBsYXN0IDRrIG9mIG91ciBwYWdlICovCi0JdmNwdS0+YXJjaC5zaGFyZWQgPSAodm9pZCopKHAgKyBQQUdFX1NJWkUgLSA0MDk2KTsKLQlpZiAoIXApCi0JCWdvdG8gdW5pbml0X3ZjcHU7Ci0KLQl2Y3B1LT5hcmNoLmhvc3RfcmV0aXAgPSBrdm1fcmV0dXJuX3BvaW50OwotCXZjcHUtPmFyY2guaG9zdF9tc3IgPSBtZm1zcigpOwotI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0Ci0JLyogZGVmYXVsdCB0byBib29rM3NfNjQgKDk3MGZ4KSAqLwotCXZjcHUtPmFyY2gucHZyID0gMHgzQzAzMDE7Ci0jZWxzZQotCS8qIGRlZmF1bHQgdG8gYm9vazNzXzMyICg3NTApICovCi0JdmNwdS0+YXJjaC5wdnIgPSAweDg0MjAyOwotI2VuZGlmCi0Ja3ZtcHBjX3NldF9wdnIodmNwdSwgdmNwdS0+YXJjaC5wdnIpOwotCXZjcHVfYm9vazNzLT5zbGJfbnIgPSA2NDsKLQotCS8qIHJlbWVtYmVyIHdoZXJlIHNvbWUgcmVhbC1tb2RlIGhhbmRsZXJzIGFyZSAqLwotCXZjcHUtPmFyY2gudHJhbXBvbGluZV9sb3dtZW0gPSBrdm1wcGNfdHJhbXBvbGluZV9sb3dtZW07Ci0JdmNwdS0+YXJjaC50cmFtcG9saW5lX2VudGVyID0ga3ZtcHBjX3RyYW1wb2xpbmVfZW50ZXI7Ci0JdmNwdS0+YXJjaC5oaWdobWVtX2hhbmRsZXIgPSAodWxvbmcpa3ZtcHBjX2hhbmRsZXJfaGlnaG1lbTsKLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAotCXZjcHUtPmFyY2gucm1jYWxsID0gKih1bG9uZyopa3ZtcHBjX3JtY2FsbDsKLSNlbHNlCi0JdmNwdS0+YXJjaC5ybWNhbGwgPSAodWxvbmcpa3ZtcHBjX3JtY2FsbDsKLSNlbmRpZgotCi0JdmNwdS0+YXJjaC5zaGFkb3dfbXNyID0gTVNSX1VTRVI2NDsKLQotCWVyciA9IGt2bXBwY19tbXVfaW5pdCh2Y3B1KTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byB1bmluaXRfdmNwdTsKLQotCXJldHVybiB2Y3B1OwotCi11bmluaXRfdmNwdToKLQlrdm1fdmNwdV91bmluaXQodmNwdSk7Ci1mcmVlX3NoYWRvd192Y3B1OgotCWtmcmVlKHZjcHVfYm9vazNzLT5zaGFkb3dfdmNwdSk7Ci1mcmVlX3ZjcHU6Ci0JdmZyZWUodmNwdV9ib29rM3MpOwotb3V0OgotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLXZvaWQga3ZtcHBjX2NvcmVfdmNwdV9mcmVlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1X2Jvb2szcyA9IHRvX2Jvb2szcyh2Y3B1KTsKLQotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2Y3B1LT5hcmNoLnNoYXJlZCAmIFBBR0VfTUFTSyk7Ci0Ja3ZtX3ZjcHVfdW5pbml0KHZjcHUpOwotCWtmcmVlKHZjcHVfYm9vazNzLT5zaGFkb3dfdmNwdSk7Ci0JdmZyZWUodmNwdV9ib29rM3MpOwotfQotCi1leHRlcm4gaW50IF9fa3ZtcHBjX3ZjcHVfZW50cnkoc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci1pbnQgX19rdm1wcGNfdmNwdV9ydW4oc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlpbnQgcmV0OwotCWRvdWJsZSBmcHJbMzJdW1RTX0ZQUldJRFRIXTsKLQl1bnNpZ25lZCBpbnQgZnBzY3I7Ci0JaW50IGZwZXhjX21vZGU7Ci0jaWZkZWYgQ09ORklHX0FMVElWRUMKLQl2ZWN0b3IxMjggdnJbMzJdOwotCXZlY3RvcjEyOCB2c2NyOwotCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIodnJzYXZlKTsKLQlpbnQgdXNlZF92cjsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19WU1gKLQlpbnQgdXNlZF92c3I7Ci0jZW5kaWYKLQl1bG9uZyBleHRfbXNyOwotCi0JLyogTm8gbmVlZCB0byBnbyBpbnRvIHRoZSBndWVzdCB3aGVuIGFsbCB3ZSBkbyBpcyBnb2luZyBvdXQgKi8KLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOwotCQlyZXR1cm4gLUVJTlRSOwotCX0KLQotCS8qIFNhdmUgRlBVIHN0YXRlIGluIHN0YWNrICovCi0JaWYgKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfRlApCi0JCWdpdmV1cF9mcHUoY3VycmVudCk7Ci0JbWVtY3B5KGZwciwgY3VycmVudC0+dGhyZWFkLmZwciwgc2l6ZW9mKGN1cnJlbnQtPnRocmVhZC5mcHIpKTsKLQlmcHNjciA9IGN1cnJlbnQtPnRocmVhZC5mcHNjci52YWw7Ci0JZnBleGNfbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcGV4Y19tb2RlOwotCi0jaWZkZWYgQ09ORklHX0FMVElWRUMKLQkvKiBTYXZlIEFsdGl2ZWMgc3RhdGUgaW4gc3RhY2sgKi8KLQl1c2VkX3ZyID0gY3VycmVudC0+dGhyZWFkLnVzZWRfdnI7Ci0JaWYgKHVzZWRfdnIpIHsKLQkJaWYgKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfVkVDKQotCQkJZ2l2ZXVwX2FsdGl2ZWMoY3VycmVudCk7Ci0JCW1lbWNweSh2ciwgY3VycmVudC0+dGhyZWFkLnZyLCBzaXplb2YoY3VycmVudC0+dGhyZWFkLnZyKSk7Ci0JCXZzY3IgPSBjdXJyZW50LT50aHJlYWQudnNjcjsKLQkJdnJzYXZlID0gY3VycmVudC0+dGhyZWFkLnZyc2F2ZTsKLQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19WU1gKLQkvKiBTYXZlIFZTWCBzdGF0ZSBpbiBzdGFjayAqLwotCXVzZWRfdnNyID0gY3VycmVudC0+dGhyZWFkLnVzZWRfdnNyOwotCWlmICh1c2VkX3ZzciAmJiAoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9WU1gpKQotCQkJX19naXZldXBfdnN4KGN1cnJlbnQpOwotI2VuZGlmCi0KLQkvKiBSZW1lbWJlciB0aGUgTVNSIHdpdGggZGlzYWJsZWQgZXh0ZW5zaW9ucyAqLwotCWV4dF9tc3IgPSBjdXJyZW50LT50aHJlYWQucmVncy0+bXNyOwotCi0JLyogWFhYIHdlIGdldCBjYWxsZWQgd2l0aCBpcnEgZGlzYWJsZWQgLSBjaGFuZ2UgdGhhdCEgKi8KLQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0KLQkvKiBQcmVsb2FkIEZQVSBpZiBpdCdzIGVuYWJsZWQgKi8KLQlpZiAodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIE1TUl9GUCkKLQkJa3ZtcHBjX2hhbmRsZV9leHQodmNwdSwgQk9PSzNTX0lOVEVSUlVQVF9GUF9VTkFWQUlMLCBNU1JfRlApOwotCi0JcmV0ID0gX19rdm1wcGNfdmNwdV9lbnRyeShrdm1fcnVuLCB2Y3B1KTsKLQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0KLQljdXJyZW50LT50aHJlYWQucmVncy0+bXNyID0gZXh0X21zcjsKLQotCS8qIE1ha2Ugc3VyZSB3ZSBzYXZlIHRoZSBndWVzdCBGUFUvQWx0aXZlYy9WU1ggc3RhdGUgKi8KLQlrdm1wcGNfZ2l2ZXVwX2V4dCh2Y3B1LCBNU1JfRlApOwotCWt2bXBwY19naXZldXBfZXh0KHZjcHUsIE1TUl9WRUMpOwotCWt2bXBwY19naXZldXBfZXh0KHZjcHUsIE1TUl9WU1gpOwotCi0JLyogUmVzdG9yZSBGUFUgc3RhdGUgZnJvbSBzdGFjayAqLwotCW1lbWNweShjdXJyZW50LT50aHJlYWQuZnByLCBmcHIsIHNpemVvZihjdXJyZW50LT50aHJlYWQuZnByKSk7Ci0JY3VycmVudC0+dGhyZWFkLmZwc2NyLnZhbCA9IGZwc2NyOwotCWN1cnJlbnQtPnRocmVhZC5mcGV4Y19tb2RlID0gZnBleGNfbW9kZTsKLQotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0JLyogUmVzdG9yZSBBbHRpdmVjIHN0YXRlIGZyb20gc3RhY2sgKi8KLQlpZiAodXNlZF92ciAmJiBjdXJyZW50LT50aHJlYWQudXNlZF92cikgewotCQltZW1jcHkoY3VycmVudC0+dGhyZWFkLnZyLCB2ciwgc2l6ZW9mKGN1cnJlbnQtPnRocmVhZC52cikpOwotCQljdXJyZW50LT50aHJlYWQudnNjciA9IHZzY3I7Ci0JCWN1cnJlbnQtPnRocmVhZC52cnNhdmUgPSB2cnNhdmU7Ci0JfQotCWN1cnJlbnQtPnRocmVhZC51c2VkX3ZyID0gdXNlZF92cjsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1ZTWAotCWN1cnJlbnQtPnRocmVhZC51c2VkX3ZzciA9IHVzZWRfdnNyOwotI2VuZGlmCi0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGt2bXBwY19ib29rM3NfaW5pdCh2b2lkKQotewotCWludCByOwotCi0JciA9IGt2bV9pbml0KE5VTEwsIHNpemVvZihzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzKSwgMCwKLQkJICAgICBUSElTX01PRFVMRSk7Ci0KLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlyID0ga3ZtcHBjX21tdV9ocHRlX3N5c2luaXQoKTsKLQotCXJldHVybiByOwotfQotCi1zdGF0aWMgdm9pZCBrdm1wcGNfYm9vazNzX2V4aXQodm9pZCkKLXsKLQlrdm1wcGNfbW11X2hwdGVfc3lzZXhpdCgpOwotCWt2bV9leGl0KCk7Ci19Ci0KLW1vZHVsZV9pbml0KGt2bXBwY19ib29rM3NfaW5pdCk7Ci1tb2R1bGVfZXhpdChrdm1wcGNfYm9vazNzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfbW11LmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXUuYwppbmRleCBkNzg4OWVmLi5jNmQzZTE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXUuYwpAQCAtNDEsMzYgKzQxLDM2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qga3ZtcHBjX3NsYiAqa3ZtcHBjX21tdV9ib29rM3NfNjRfZmluZF9zbGJlKAotCQkJCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHVfYm9vazNzLAorCQkJCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQlndmFfdCBlYWRkcikKIHsKIAlpbnQgaTsKIAl1NjQgZXNpZCA9IEdFVF9FU0lEKGVhZGRyKTsKIAl1NjQgZXNpZF8xdCA9IEdFVF9FU0lEXzFUKGVhZGRyKTsKIAotCWZvciAoaSA9IDA7IGkgPCB2Y3B1X2Jvb2szcy0+c2xiX25yOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgdmNwdS0+YXJjaC5zbGJfbnI7IGkrKykgewogCQl1NjQgY21wX2VzaWQgPSBlc2lkOwogCi0JCWlmICghdmNwdV9ib29rM3MtPnNsYltpXS52YWxpZCkKKwkJaWYgKCF2Y3B1LT5hcmNoLnNsYltpXS52YWxpZCkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICh2Y3B1X2Jvb2szcy0+c2xiW2ldLnRiKQorCQlpZiAodmNwdS0+YXJjaC5zbGJbaV0udGIpCiAJCQljbXBfZXNpZCA9IGVzaWRfMXQ7CiAKLQkJaWYgKHZjcHVfYm9vazNzLT5zbGJbaV0uZXNpZCA9PSBjbXBfZXNpZCkKLQkJCXJldHVybiAmdmNwdV9ib29rM3MtPnNsYltpXTsKKwkJaWYgKHZjcHUtPmFyY2guc2xiW2ldLmVzaWQgPT0gY21wX2VzaWQpCisJCQlyZXR1cm4gJnZjcHUtPmFyY2guc2xiW2ldOwogCX0KIAogCWRwcmludGsoIktWTTogTm8gU0xCIGVudHJ5IGZvdW5kIGZvciAweCVseCBbJWxseCB8ICVsbHhdXG4iLAogCQllYWRkciwgZXNpZCwgZXNpZF8xdCk7Ci0JZm9yIChpID0gMDsgaSA8IHZjcHVfYm9vazNzLT5zbGJfbnI7IGkrKykgewotCSAgICBpZiAodmNwdV9ib29rM3MtPnNsYltpXS52c2lkKQorCWZvciAoaSA9IDA7IGkgPCB2Y3B1LT5hcmNoLnNsYl9ucjsgaSsrKSB7CisJICAgIGlmICh2Y3B1LT5hcmNoLnNsYltpXS52c2lkKQogCQlkcHJpbnRrKCIgICVkOiAlYyVjJWMgJWxseCAlbGx4XG4iLCBpLAotCQkJdmNwdV9ib29rM3MtPnNsYltpXS52YWxpZCA/ICd2JyA6ICcgJywKLQkJCXZjcHVfYm9vazNzLT5zbGJbaV0ubGFyZ2UgPyAnbCcgOiAnICcsCi0JCQl2Y3B1X2Jvb2szcy0+c2xiW2ldLnRiICAgID8gJ3QnIDogJyAnLAotCQkJdmNwdV9ib29rM3MtPnNsYltpXS5lc2lkLAotCQkJdmNwdV9ib29rM3MtPnNsYltpXS52c2lkKTsKKwkJCXZjcHUtPmFyY2guc2xiW2ldLnZhbGlkID8gJ3YnIDogJyAnLAorCQkJdmNwdS0+YXJjaC5zbGJbaV0ubGFyZ2UgPyAnbCcgOiAnICcsCisJCQl2Y3B1LT5hcmNoLnNsYltpXS50YiAgICA/ICd0JyA6ICcgJywKKwkJCXZjcHUtPmFyY2guc2xiW2ldLmVzaWQsCisJCQl2Y3B1LT5hcmNoLnNsYltpXS52c2lkKTsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTgxLDcgKzgxLDcgQEAKIHsKIAlzdHJ1Y3Qga3ZtcHBjX3NsYiAqc2xiOwogCi0Jc2xiID0ga3ZtcHBjX21tdV9ib29rM3NfNjRfZmluZF9zbGJlKHRvX2Jvb2szcyh2Y3B1KSwgZWFkZHIpOworCXNsYiA9IGt2bXBwY19tbXVfYm9vazNzXzY0X2ZpbmRfc2xiZSh2Y3B1LCBlYWRkcik7CiAJaWYgKCFzbGIpCiAJCXJldHVybiAwOwogCkBAIC0xODAsNyArMTgwLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0Jc2xiZSA9IGt2bXBwY19tbXVfYm9vazNzXzY0X2ZpbmRfc2xiZSh2Y3B1X2Jvb2szcywgZWFkZHIpOworCXNsYmUgPSBrdm1wcGNfbW11X2Jvb2szc182NF9maW5kX3NsYmUodmNwdSwgZWFkZHIpOwogCWlmICghc2xiZSkKIAkJZ290byBub19zZWdfZm91bmQ7CiAKQEAgLTMyMCwxMCArMzIwLDEwIEBACiAJZXNpZF8xdCA9IEdFVF9FU0lEXzFUKHJiKTsKIAlzbGJfbnIgPSByYiAmIDB4ZmZmOwogCi0JaWYgKHNsYl9uciA+IHZjcHVfYm9vazNzLT5zbGJfbnIpCisJaWYgKHNsYl9uciA+IHZjcHUtPmFyY2guc2xiX25yKQogCQlyZXR1cm47CiAKLQlzbGJlID0gJnZjcHVfYm9vazNzLT5zbGJbc2xiX25yXTsKKwlzbGJlID0gJnZjcHUtPmFyY2guc2xiW3NsYl9ucl07CiAKIAlzbGJlLT5sYXJnZSA9IChycyAmIFNMQl9WU0lEX0wpID8gMSA6IDA7CiAJc2xiZS0+dGIgICAgPSAocnMgJiBTTEJfVlNJRF9CXzFUKSA/IDEgOiAwOwpAQCAtMzQ0LDM4ICszNDQsMzUgQEAKIAogc3RhdGljIHU2NCBrdm1wcGNfbW11X2Jvb2szc182NF9zbGJtZmVlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHNsYl9ucikKIHsKLQlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1X2Jvb2szcyA9IHRvX2Jvb2szcyh2Y3B1KTsKIAlzdHJ1Y3Qga3ZtcHBjX3NsYiAqc2xiZTsKIAotCWlmIChzbGJfbnIgPiB2Y3B1X2Jvb2szcy0+c2xiX25yKQorCWlmIChzbGJfbnIgPiB2Y3B1LT5hcmNoLnNsYl9ucikKIAkJcmV0dXJuIDA7CiAKLQlzbGJlID0gJnZjcHVfYm9vazNzLT5zbGJbc2xiX25yXTsKKwlzbGJlID0gJnZjcHUtPmFyY2guc2xiW3NsYl9ucl07CiAKIAlyZXR1cm4gc2xiZS0+b3JpZ2U7CiB9CiAKIHN0YXRpYyB1NjQga3ZtcHBjX21tdV9ib29rM3NfNjRfc2xibWZldihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBzbGJfbnIpCiB7Ci0Jc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdV9ib29rM3MgPSB0b19ib29rM3ModmNwdSk7CiAJc3RydWN0IGt2bXBwY19zbGIgKnNsYmU7CiAKLQlpZiAoc2xiX25yID4gdmNwdV9ib29rM3MtPnNsYl9ucikKKwlpZiAoc2xiX25yID4gdmNwdS0+YXJjaC5zbGJfbnIpCiAJCXJldHVybiAwOwogCi0Jc2xiZSA9ICZ2Y3B1X2Jvb2szcy0+c2xiW3NsYl9ucl07CisJc2xiZSA9ICZ2Y3B1LT5hcmNoLnNsYltzbGJfbnJdOwogCiAJcmV0dXJuIHNsYmUtPm9yaWd2OwogfQogCiBzdGF0aWMgdm9pZCBrdm1wcGNfbW11X2Jvb2szc182NF9zbGJpZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBlYSkKIHsKLQlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1X2Jvb2szcyA9IHRvX2Jvb2szcyh2Y3B1KTsKIAlzdHJ1Y3Qga3ZtcHBjX3NsYiAqc2xiZTsKIAogCWRwcmludGsoIktWTSBNTVU6IHNsYmllKDB4JWxseClcbiIsIGVhKTsKIAotCXNsYmUgPSBrdm1wcGNfbW11X2Jvb2szc182NF9maW5kX3NsYmUodmNwdV9ib29rM3MsIGVhKTsKKwlzbGJlID0ga3ZtcHBjX21tdV9ib29rM3NfNjRfZmluZF9zbGJlKHZjcHUsIGVhKTsKIAogCWlmICghc2xiZSkKIAkJcmV0dXJuOwpAQCAtMzg5LDEzICszODYsMTIgQEAKIAogc3RhdGljIHZvaWQga3ZtcHBjX21tdV9ib29rM3NfNjRfc2xiaWEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHVfYm9vazNzID0gdG9fYm9vazNzKHZjcHUpOwogCWludCBpOwogCiAJZHByaW50aygiS1ZNIE1NVTogc2xiaWEoKVxuIik7CiAKLQlmb3IgKGkgPSAxOyBpIDwgdmNwdV9ib29rM3MtPnNsYl9ucjsgaSsrKQotCQl2Y3B1X2Jvb2szcy0+c2xiW2ldLnZhbGlkID0gZmFsc2U7CisJZm9yIChpID0gMTsgaSA8IHZjcHUtPmFyY2guc2xiX25yOyBpKyspCisJCXZjcHUtPmFyY2guc2xiW2ldLnZhbGlkID0gZmFsc2U7CiAKIAlpZiAodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIE1TUl9JUikgewogCQlrdm1wcGNfbW11X2ZsdXNoX3NlZ21lbnRzKHZjcHUpOwpAQCAtNDY0LDcgKzQ2MCw3IEBACiAJdWxvbmcgbXBfZWEgPSB2Y3B1LT5hcmNoLm1hZ2ljX3BhZ2VfZWE7CiAKIAlpZiAodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIChNU1JfRFJ8TVNSX0lSKSkgewotCQlzbGIgPSBrdm1wcGNfbW11X2Jvb2szc182NF9maW5kX3NsYmUodG9fYm9vazNzKHZjcHUpLCBlYSk7CisJCXNsYiA9IGt2bXBwY19tbXVfYm9vazNzXzY0X2ZpbmRfc2xiZSh2Y3B1LCBlYSk7CiAJCWlmIChzbGIpCiAJCQlndnNpZCA9IHNsYi0+dnNpZDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXVfaHYuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X21tdV9odi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjM2EyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXVfaHYuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIENvcHlyaWdodCAyMDEwIFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycC4gPHBhdWx1c0BhdTEuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rdm0uaD4KKyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgorCisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KKyNpbmNsdWRlIDxhc20va3ZtX2Jvb2szcy5oPgorI2luY2x1ZGUgPGFzbS9tbXUtaGFzaDY0Lmg+CisjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorI2luY2x1ZGUgPGFzbS9zeW5jaC5oPgorI2luY2x1ZGUgPGFzbS9wcGMtb3Bjb2RlLmg+CisjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CisKKy8qIEZvciBub3cgdXNlIGZpeGVkLXNpemUgMTZNQiBwYWdlIHRhYmxlICovCisjZGVmaW5lIEhQVF9PUkRFUgkyNAorI2RlZmluZSBIUFRfTlBURUcJKDF1bCA8PCAoSFBUX09SREVSIC0gNykpCS8qIDEyOEIgcGVyIHB0ZWcgKi8KKyNkZWZpbmUgSFBUX0hBU0hfTUFTSwkoSFBUX05QVEVHIC0gMSkKKworLyogUGFnZXMgaW4gdGhlIFZSTUEgYXJlIDE2TUIgcGFnZXMgKi8KKyNkZWZpbmUgVlJNQV9QQUdFX09SREVSCTI0CisjZGVmaW5lIFZSTUFfVlNJRAkweDFmZmZmZmZVTAkvKiAxVEIgVlNJRCByZXNlcnZlZCBmb3IgVlJNQSAqLworCisvKiBQT1dFUjcgaGFzIDEwLWJpdCBMUElEcywgUFBDOTcwIGhhcyA2LWJpdCBMUElEcyAqLworI2RlZmluZSBNQVhfTFBJRF85NzAJNjMKKyNkZWZpbmUgTlJfTFBJRFMJKExQSURfUlNWRCArIDEpCit1bnNpZ25lZCBsb25nIGxwaWRfaW51c2VbQklUU19UT19MT05HUyhOUl9MUElEUyldOworCitsb25nIGt2bXBwY19hbGxvY19ocHQoc3RydWN0IGt2bSAqa3ZtKQoreworCXVuc2lnbmVkIGxvbmcgaHB0OworCXVuc2lnbmVkIGxvbmcgbHBpZDsKKworCWhwdCA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPfF9fR0ZQX1JFUEVBVHxfX0dGUF9OT1dBUk4sCisJCQkgICAgICAgSFBUX09SREVSIC0gUEFHRV9TSElGVCk7CisJaWYgKCFocHQpIHsKKwkJcHJfZXJyKCJrdm1fYWxsb2NfaHB0OiBDb3VsZG4ndCBhbGxvYyBIUFRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJa3ZtLT5hcmNoLmhwdF92aXJ0ID0gaHB0OworCisJZG8geworCQlscGlkID0gZmluZF9maXJzdF96ZXJvX2JpdChscGlkX2ludXNlLCBOUl9MUElEUyk7CisJCWlmIChscGlkID49IE5SX0xQSURTKSB7CisJCQlwcl9lcnIoImt2bV9hbGxvY19ocHQ6IE5vIExQSURzIGZyZWVcbiIpOworCQkJZnJlZV9wYWdlcyhocHQsIEhQVF9PUkRFUiAtIFBBR0VfU0hJRlQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9IHdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KGxwaWQsIGxwaWRfaW51c2UpKTsKKworCWt2bS0+YXJjaC5zZHIxID0gX19wYShocHQpIHwgKEhQVF9PUkRFUiAtIDE4KTsKKwlrdm0tPmFyY2gubHBpZCA9IGxwaWQ7CisKKwlwcl9pbmZvKCJLVk0gZ3Vlc3QgaHRhYiBhdCAlbHgsIExQSUQgJWx4XG4iLCBocHQsIGxwaWQpOworCXJldHVybiAwOworfQorCit2b2lkIGt2bXBwY19mcmVlX2hwdChzdHJ1Y3Qga3ZtICprdm0pCit7CisJY2xlYXJfYml0KGt2bS0+YXJjaC5scGlkLCBscGlkX2ludXNlKTsKKwlmcmVlX3BhZ2VzKGt2bS0+YXJjaC5ocHRfdmlydCwgSFBUX09SREVSIC0gUEFHRV9TSElGVCk7Cit9CisKK3ZvaWQga3ZtcHBjX21hcF92cm1hKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV91c2Vyc3BhY2VfbWVtb3J5X3JlZ2lvbiAqbWVtKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IGt2bS0+YXJjaC5yYW1fbnBhZ2VzOworCXVuc2lnbmVkIGxvbmcgcGZuOworCXVuc2lnbmVkIGxvbmcgKmhwdGU7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCXN0cnVjdCBrdm1wcGNfcGdpbmZvICpwZ2luZm8gPSBrdm0tPmFyY2gucmFtX3BnaW5mbzsKKworCWlmICghcGdpbmZvKQorCQlyZXR1cm47CisKKwkvKiBWUk1BIGNhbid0IGJlID4gMVRCICovCisJaWYgKG5wYWdlcyA+IDF1bCA8PCAoNDAgLSBrdm0tPmFyY2gucmFtX3BvcmRlcikpCisJCW5wYWdlcyA9IDF1bCA8PCAoNDAgLSBrdm0tPmFyY2gucmFtX3BvcmRlcik7CisJLyogQ2FuJ3QgdXNlIG1vcmUgdGhhbiAxIEhQVEUgcGVyIEhQVEVHICovCisJaWYgKG5wYWdlcyA+IEhQVF9OUFRFRykKKwkJbnBhZ2VzID0gSFBUX05QVEVHOworCisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytpKSB7CisJCXBmbiA9IHBnaW5mb1tpXS5wZm47CisJCWlmICghcGZuKQorCQkJYnJlYWs7CisJCS8qIGNhbid0IHVzZSBocHRfaGFzaCBzaW5jZSB2YSA+IDY0IGJpdHMgKi8KKwkJaGFzaCA9IChpIF4gKFZSTUFfVlNJRCBeIChWUk1BX1ZTSUQgPDwgMjUpKSkgJiBIUFRfSEFTSF9NQVNLOworCQkvKgorCQkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgaGFzaCB0YWJsZSBpcyBlbXB0eSBhbmQgbm8KKwkJICogdmNwdXMgYXJlIHVzaW5nIGl0IGF0IHRoaXMgc3RhZ2UuICBTaW5jZSB3ZSBjcmVhdGUKKwkJICogYXQgbW9zdCBvbmUgSFBURSBwZXIgSFBURUcsIHdlIGp1c3QgYXNzdW1lIGVudHJ5IDcKKwkJICogaXMgYXZhaWxhYmxlIGFuZCB1c2UgaXQuCisJCSAqLworCQlocHRlID0gKHVuc2lnbmVkIGxvbmcgKikgKGt2bS0+YXJjaC5ocHRfdmlydCArIChoYXNoIDw8IDcpKTsKKwkJaHB0ZSArPSA3ICogMjsKKwkJLyogSFBURSBsb3cgd29yZCAtIFJQTiwgcHJvdGVjdGlvbiwgZXRjLiAqLworCQlocHRlWzFdID0gKHBmbiA8PCBQQUdFX1NISUZUKSB8IEhQVEVfUl9SIHwgSFBURV9SX0MgfAorCQkJSFBURV9SX00gfCBQUF9SV1hYOworCQl3bWIoKTsKKwkJaHB0ZVswXSA9IEhQVEVfVl8xVEJfU0VHIHwgKFZSTUFfVlNJRCA8PCAoNDAgLSAxNikpIHwKKwkJCShpIDw8IChWUk1BX1BBR0VfT1JERVIgLSAxNikpIHwgSFBURV9WX0JPTFRFRCB8CisJCQlIUFRFX1ZfTEFSR0UgfCBIUFRFX1ZfVkFMSUQ7CisJfQorfQorCitpbnQga3ZtcHBjX21tdV9odl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBob3N0X2xwaWQsIHJzdmRfbHBpZDsKKworCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfSFZNT0RFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQobHBpZF9pbnVzZSwgMCwgc2l6ZW9mKGxwaWRfaW51c2UpKTsKKworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BUkNIXzIwNikpIHsKKwkJaG9zdF9scGlkID0gbWZzcHIoU1BSTl9MUElEKTsJLyogUE9XRVI3ICovCisJCXJzdmRfbHBpZCA9IExQSURfUlNWRDsKKwl9IGVsc2UgeworCQlob3N0X2xwaWQgPSAwOwkJCS8qIFBQQzk3MCAqLworCQlyc3ZkX2xwaWQgPSBNQVhfTFBJRF85NzA7CisJfQorCisJc2V0X2JpdChob3N0X2xwaWQsIGxwaWRfaW51c2UpOworCS8qIHJzdmRfbHBpZCBpcyByZXNlcnZlZCBmb3IgdXNlIGluIHBhcnRpdGlvbiBzd2l0Y2hpbmcgKi8KKwlzZXRfYml0KHJzdmRfbHBpZCwgbHBpZF9pbnVzZSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBrdm1wcGNfbW11X2Rlc3Ryb3koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworfQorCitzdGF0aWMgdm9pZCBrdm1wcGNfbW11X2Jvb2szc182NF9odl9yZXNldF9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWt2bXBwY19zZXRfbXNyKHZjcHUsIE1TUl9TRiB8IE1TUl9NRSk7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX21tdV9ib29rM3NfNjRfaHZfeGxhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBlYWRkciwKKwkJCQlzdHJ1Y3Qga3ZtcHBjX3B0ZSAqZ3B0ZSwgYm9vbCBkYXRhKQoreworCXJldHVybiAtRU5PRU5UOworfQorCit2b2lkIGt2bXBwY19tbXVfYm9vazNzX2h2X2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1wcGNfbW11ICptbXUgPSAmdmNwdS0+YXJjaC5tbXU7CisKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVJDSF8yMDYpKQorCQl2Y3B1LT5hcmNoLnNsYl9uciA9IDMyOwkJLyogUE9XRVI3ICovCisJZWxzZQorCQl2Y3B1LT5hcmNoLnNsYl9uciA9IDY0OworCisJbW11LT54bGF0ZSA9IGt2bXBwY19tbXVfYm9vazNzXzY0X2h2X3hsYXRlOworCW1tdS0+cmVzZXRfbXNyID0ga3ZtcHBjX21tdV9ib29rM3NfNjRfaHZfcmVzZXRfbXNyOworCisJdmNwdS0+YXJjaC5oZmxhZ3MgfD0gQk9PSzNTX0hGTEFHX1NMQjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X3Zpb19odi5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfdmlvX2h2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwZjhjNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X3Zpb19odi5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBQYXVsIE1hY2tlcnJhcywgSUJNIENvcnAuIDxwYXVsdXNAYXUxLmlibS5jb20+CisgKiBDb3B5cmlnaHQgMjAxMSBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbiA8ZHdnQGF1MS5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgorI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KKyNpbmNsdWRlIDxhc20va3ZtX2Jvb2szcy5oPgorI2luY2x1ZGUgPGFzbS9tbXUtaGFzaDY0Lmg+CisjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorI2luY2x1ZGUgPGFzbS9zeW5jaC5oPgorI2luY2x1ZGUgPGFzbS9wcGMtb3Bjb2RlLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKworI2RlZmluZSBUQ0VTX1BFUl9QQUdFCShQQUdFX1NJWkUgLyBzaXplb2YodTY0KSkKKworbG9uZyBrdm1wcGNfaF9wdXRfdGNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBsaW9ibiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBpb2JhLCB1bnNpZ25lZCBsb25nIHRjZSkKK3sKKwlzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LT5rdm07CisJc3RydWN0IGt2bXBwY19zcGFwcl90Y2VfdGFibGUgKnN0dDsKKworCS8qIHVkYmdfcHJpbnRmKCJIX1BVVF9UQ0UoKTogbGlvYm49MHglbHggaW9iYT0weCVseCwgdGNlPTB4JWx4XG4iLCAqLworCS8qIAkgICAgbGlvYm4sIGlvYmEsIHRjZSk7ICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0dCwgJmt2bS0+YXJjaC5zcGFwcl90Y2VfdGFibGVzLCBsaXN0KSB7CisJCWlmIChzdHQtPmxpb2JuID09IGxpb2JuKSB7CisJCQl1bnNpZ25lZCBsb25nIGlkeCA9IGlvYmEgPj4gU1BBUFJfVENFX1NISUZUOworCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCQl1NjQgKnRibDsKKworCQkJLyogdWRiZ19wcmludGYoIkhfUFVUX1RDRTogbGlvYm4gMHglbHggPT4gc3R0PSVwICB3aW5kb3dfc2l6ZT0weCV4XG4iLCAqLworCQkJLyogCSAgICBsaW9ibiwgc3R0LCBzdHQtPndpbmRvd19zaXplKTsgKi8KKwkJCWlmIChpb2JhID49IHN0dC0+d2luZG93X3NpemUpCisJCQkJcmV0dXJuIEhfUEFSQU1FVEVSOworCisJCQlwYWdlID0gc3R0LT5wYWdlc1tpZHggLyBUQ0VTX1BFUl9QQUdFXTsKKwkJCXRibCA9ICh1NjQgKilwYWdlX2FkZHJlc3MocGFnZSk7CisKKwkJCS8qIEZJWE1FOiBOZWVkIHRvIHZhbGlkYXRlIHRoZSBUQ0UgaXRzZWxmICovCisJCQkvKiB1ZGJnX3ByaW50ZigidGNlIEAgJXBcbiIsICZ0YmxbaWR4ICUgVENFU19QRVJfUEFHRV0pOyAqLworCQkJdGJsW2lkeCAlIFRDRVNfUEVSX1BBR0VdID0gdGNlOworCQkJcmV0dXJuIEhfU1VDQ0VTUzsKKwkJfQorCX0KKworCS8qIERpZG4ndCBmaW5kIHRoZSBsaW9ibiwgcHVudCBpdCB0byB1c2Vyc3BhY2UgKi8KKwlyZXR1cm4gSF9UT09fSEFSRDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2V4cG9ydHMuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2V4cG9ydHMuYwppbmRleCAxZGQ1YTFkLi44OGM4ZjI2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19leHBvcnRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfZXhwb3J0cy5jCkBAIC0yMCw4ICsyMCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzLmg+CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY190cmFtcG9saW5lX2VudGVyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY190cmFtcG9saW5lX2xvd21lbSk7CisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSFYKK0VYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY19odl9lbnRyeV90cmFtcG9saW5lKTsKKyNlbHNlCitFWFBPUlRfU1lNQk9MX0dQTChrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2VudGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY19oYW5kbGVyX2xvd21lbV90cmFtcG9saW5lKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY19ybWNhbGwpOwogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtcHBjX2xvYWRfdXBfZnB1KTsKICNpZmRlZiBDT05GSUdfQUxUSVZFQwpAQCAtMzAsMyArMzMsNSBAQAogI2lmZGVmIENPTkZJR19WU1gKIEVYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY19sb2FkX3VwX3ZzeCk7CiAjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzBkN2YxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYwpAQCAtMCwwICsxLDEyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBQYXVsIE1hY2tlcnJhcywgSUJNIENvcnAuIDxwYXVsdXNAYXUxLmlibS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkuIFNVU0UgTGludXggUHJvZHVjdHMgR21iSC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBBdXRob3JzOgorICogICAgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BhdTEuaWJtLmNvbT4KKyAqICAgIEFsZXhhbmRlciBHcmFmIDxhZ3JhZkBzdXNlLmRlPgorICogICAgS2V2aW4gV29sZiA8bWFpbEBrZXZpbi13b2xmLmRlPgorICoKKyAqIERlc2NyaXB0aW9uOiBLVk0gZnVuY3Rpb25zIHNwZWNpZmljIHRvIHJ1bm5pbmcgb24gQm9vayAzUworICogcHJvY2Vzc29ycyBpbiBoeXBlcnZpc29yIG1vZGUgKHNwZWNpZmljYWxseSBQT1dFUjcgYW5kIGxhdGVyKS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGFyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMsCisgKiBieSBBbGV4YW5kZXIgR3JhZiA8YWdyYWZAc3VzZS5kZT4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYW5vbl9pbm9kZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CisKKyNpbmNsdWRlIDxhc20vcmVnLmg+CisjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9rdm1fcHBjLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9ib29rM3MuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vbHBwYWNhLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9jcHV0aHJlYWRzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisKKy8qCisgKiBGb3Igbm93LCBsaW1pdCBtZW1vcnkgdG8gNjRHQiBhbmQgcmVxdWlyZSBpdCB0byBiZSBsYXJnZSBwYWdlcy4KKyAqIFRoaXMgdmFsdWUgaXMgY2hvc2VuIGJlY2F1c2UgaXQgbWFrZXMgdGhlIHJhbV9wZ2luZm8gYXJyYXkgYmUKKyAqIDY0a0IgaW4gc2l6ZSwgd2hpY2ggaXMgYWJvdXQgYXMgbGFyZ2UgYXMgd2Ugd2FudCB0byBiZSB0cnlpbmcKKyAqIHRvIGFsbG9jYXRlIHdpdGgga21hbGxvYy4KKyAqLworI2RlZmluZSBNQVhfTUVNX09SREVSCQkzNgorCisjZGVmaW5lIExBUkdFX1BBR0VfT1JERVIJMjQJLyogMTZNQiBwYWdlcyAqLworCisvKiAjZGVmaW5lIEVYSVRfREVCVUcgKi8KKy8qICNkZWZpbmUgRVhJVF9ERUJVR19TSU1QTEUgKi8KKy8qICNkZWZpbmUgRVhJVF9ERUJVR19JTlQgKi8KKwordm9pZCBrdm1wcGNfY29yZV92Y3B1X2xvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgY3B1KQoreworCWxvY2FsX3BhY2EtPmt2bV9oc3RhdGUua3ZtX3ZjcHUgPSB2Y3B1OworCWxvY2FsX3BhY2EtPmt2bV9oc3RhdGUua3ZtX3Zjb3JlID0gdmNwdS0+YXJjaC52Y29yZTsKK30KKwordm9pZCBrdm1wcGNfY29yZV92Y3B1X3B1dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7Cit9CisKK3N0YXRpYyB2b2lkIGt2bXBwY192Y3B1X2Jsb2NrZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK3N0YXRpYyB2b2lkIGt2bXBwY192Y3B1X3VuYmxvY2tlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCit2b2lkIGt2bXBwY192Y3B1X2Jsb2NrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1NjQgbm93OworCXVuc2lnbmVkIGxvbmcgZGVjX25zZWM7CisKKwlub3cgPSBnZXRfdGIoKTsKKwlpZiAobm93ID49IHZjcHUtPmFyY2guZGVjX2V4cGlyZXMgJiYgIWt2bXBwY19jb3JlX3BlbmRpbmdfZGVjKHZjcHUpKQorCQlrdm1wcGNfY29yZV9xdWV1ZV9kZWModmNwdSk7CisJaWYgKHZjcHUtPmFyY2gucGVuZGluZ19leGNlcHRpb25zKQorCQlyZXR1cm47CisJaWYgKHZjcHUtPmFyY2guZGVjX2V4cGlyZXMgIT0gfih1NjQpMCkgeworCQlkZWNfbnNlYyA9ICh2Y3B1LT5hcmNoLmRlY19leHBpcmVzIC0gbm93KSAqIE5TRUNfUEVSX1NFQyAvCisJCQl0Yl90aWNrc19wZXJfc2VjOworCQlocnRpbWVyX3N0YXJ0KCZ2Y3B1LT5hcmNoLmRlY190aW1lciwga3RpbWVfc2V0KDAsIGRlY19uc2VjKSwKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9SRUwpOworCX0KKworCWt2bXBwY192Y3B1X2Jsb2NrZWQodmNwdSk7CisKKwlrdm1fdmNwdV9ibG9jayh2Y3B1KTsKKwl2Y3B1LT5zdGF0LmhhbHRfd2FrZXVwKys7CisKKwlpZiAodmNwdS0+YXJjaC5kZWNfZXhwaXJlcyAhPSB+KHU2NCkwKQorCQlocnRpbWVyX3RyeV90b19jYW5jZWwoJnZjcHUtPmFyY2guZGVjX3RpbWVyKTsKKworCWt2bXBwY192Y3B1X3VuYmxvY2tlZCh2Y3B1KTsKK30KKwordm9pZCBrdm1wcGNfc2V0X21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBtc3IpCit7CisJdmNwdS0+YXJjaC5zaHJlZ3MubXNyID0gbXNyOworfQorCit2b2lkIGt2bXBwY19zZXRfcHZyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIHB2cikKK3sKKwl2Y3B1LT5hcmNoLnB2ciA9IHB2cjsKK30KKwordm9pZCBrdm1wcGNfZHVtcF9yZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpbnQgcjsKKworCXByX2VycigidmNwdSAlcCAoJWQpOlxuIiwgdmNwdSwgdmNwdS0+dmNwdV9pZCk7CisJcHJfZXJyKCJwYyAgPSAlLjE2bHggIG1zciA9ICUuMTZsbHggIHRyYXAgPSAleFxuIiwKKwkgICAgICAgdmNwdS0+YXJjaC5wYywgdmNwdS0+YXJjaC5zaHJlZ3MubXNyLCB2Y3B1LT5hcmNoLnRyYXApOworCWZvciAociA9IDA7IHIgPCAxNjsgKytyKQorCQlwcl9lcnIoInIlMmQgPSAlLjE2bHggIHIlZCA9ICUuMTZseFxuIiwKKwkJICAgICAgIHIsIGt2bXBwY19nZXRfZ3ByKHZjcHUsIHIpLAorCQkgICAgICAgcisxNiwga3ZtcHBjX2dldF9ncHIodmNwdSwgcisxNikpOworCXByX2VycigiY3RyID0gJS4xNmx4ICBsciAgPSAlLjE2bHhcbiIsCisJICAgICAgIHZjcHUtPmFyY2guY3RyLCB2Y3B1LT5hcmNoLmxyKTsKKwlwcl9lcnIoInNycjAgPSAlLjE2bGx4IHNycjEgPSAlLjE2bGx4XG4iLAorCSAgICAgICB2Y3B1LT5hcmNoLnNocmVncy5zcnIwLCB2Y3B1LT5hcmNoLnNocmVncy5zcnIxKTsKKwlwcl9lcnIoInNwcmcwID0gJS4xNmxseCBzcHJnMSA9ICUuMTZsbHhcbiIsCisJICAgICAgIHZjcHUtPmFyY2guc2hyZWdzLnNwcmcwLCB2Y3B1LT5hcmNoLnNocmVncy5zcHJnMSk7CisJcHJfZXJyKCJzcHJnMiA9ICUuMTZsbHggc3ByZzMgPSAlLjE2bGx4XG4iLAorCSAgICAgICB2Y3B1LT5hcmNoLnNocmVncy5zcHJnMiwgdmNwdS0+YXJjaC5zaHJlZ3Muc3ByZzMpOworCXByX2VycigiY3IgPSAlLjh4ICB4ZXIgPSAlLjE2bHggIGRzaXNyID0gJS44eFxuIiwKKwkgICAgICAgdmNwdS0+YXJjaC5jciwgdmNwdS0+YXJjaC54ZXIsIHZjcHUtPmFyY2guc2hyZWdzLmRzaXNyKTsKKwlwcl9lcnIoImRhciA9ICUuMTZsbHhcbiIsIHZjcHUtPmFyY2guc2hyZWdzLmRhcik7CisJcHJfZXJyKCJmYXVsdCBkYXIgPSAlLjE2bHggZHNpc3IgPSAlLjh4XG4iLAorCSAgICAgICB2Y3B1LT5hcmNoLmZhdWx0X2RhciwgdmNwdS0+YXJjaC5mYXVsdF9kc2lzcik7CisJcHJfZXJyKCJTTEIgKCVkIGVudHJpZXMpOlxuIiwgdmNwdS0+YXJjaC5zbGJfbWF4KTsKKwlmb3IgKHIgPSAwOyByIDwgdmNwdS0+YXJjaC5zbGJfbWF4OyArK3IpCisJCXByX2VycigiICBFU0lEID0gJS4xNmxseCBWU0lEID0gJS4xNmxseFxuIiwKKwkJICAgICAgIHZjcHUtPmFyY2guc2xiW3JdLm9yaWdlLCB2Y3B1LT5hcmNoLnNsYltyXS5vcmlndik7CisJcHJfZXJyKCJscGNyID0gJS4xNmx4IHNkcjEgPSAlLjE2bHggbGFzdF9pbnN0ID0gJS44eFxuIiwKKwkgICAgICAgdmNwdS0+a3ZtLT5hcmNoLmxwY3IsIHZjcHUtPmt2bS0+YXJjaC5zZHIxLAorCSAgICAgICB2Y3B1LT5hcmNoLmxhc3RfaW5zdCk7Cit9CisKK3N0cnVjdCBrdm1fdmNwdSAqa3ZtcHBjX2ZpbmRfdmNwdShzdHJ1Y3Qga3ZtICprdm0sIGludCBpZCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnYsICpyZXQgPSBOVUxMOworCisJbXV0ZXhfbG9jaygma3ZtLT5sb2NrKTsKKwlrdm1fZm9yX2VhY2hfdmNwdShyLCB2LCBrdm0pIHsKKwkJaWYgKHYtPnZjcHVfaWQgPT0gaWQpIHsKKwkJCXJldCA9IHY7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaW5pdF92cGEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgbHBwYWNhICp2cGEpCit7CisJdnBhLT5zaGFyZWRfcHJvYyA9IDE7CisJdnBhLT55aWVsZF9jb3VudCA9IDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRvX2hfcmVnaXN0ZXJfdnBhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2Y3B1aWQsIHVuc2lnbmVkIGxvbmcgdnBhKQoreworCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtPmt2bTsKKwl1bnNpZ25lZCBsb25nIHBnX2luZGV4LCByYSwgbGVuOworCXVuc2lnbmVkIGxvbmcgcGdfb2Zmc2V0OworCXZvaWQgKnZhOworCXN0cnVjdCBrdm1fdmNwdSAqdHZjcHU7CisKKwl0dmNwdSA9IGt2bXBwY19maW5kX3ZjcHUoa3ZtLCB2Y3B1aWQpOworCWlmICghdHZjcHUpCisJCXJldHVybiBIX1BBUkFNRVRFUjsKKworCWZsYWdzID4+PSA2MyAtIDE4OworCWZsYWdzICY9IDc7CisJaWYgKGZsYWdzID09IDAgfHwgZmxhZ3MgPT0gNCkKKwkJcmV0dXJuIEhfUEFSQU1FVEVSOworCWlmIChmbGFncyA8IDQpIHsKKwkJaWYgKHZwYSAmIDB4N2YpCisJCQlyZXR1cm4gSF9QQVJBTUVURVI7CisJCS8qIHJlZ2lzdGVyaW5nIG5ldyBhcmVhOyBjb252ZXJ0IGxvZ2ljYWwgYWRkciB0byByZWFsICovCisJCXBnX2luZGV4ID0gdnBhID4+IGt2bS0+YXJjaC5yYW1fcG9yZGVyOworCQlwZ19vZmZzZXQgPSB2cGEgJiAoa3ZtLT5hcmNoLnJhbV9wc2l6ZSAtIDEpOworCQlpZiAocGdfaW5kZXggPj0ga3ZtLT5hcmNoLnJhbV9ucGFnZXMpCisJCQlyZXR1cm4gSF9QQVJBTUVURVI7CisJCWlmIChrdm0tPmFyY2gucmFtX3BnaW5mb1twZ19pbmRleF0ucGZuID09IDApCisJCQlyZXR1cm4gSF9QQVJBTUVURVI7CisJCXJhID0ga3ZtLT5hcmNoLnJhbV9wZ2luZm9bcGdfaW5kZXhdLnBmbiA8PCBQQUdFX1NISUZUOworCQlyYSB8PSBwZ19vZmZzZXQ7CisJCXZhID0gX192YShyYSk7CisJCWlmIChmbGFncyA8PSAxKQorCQkJbGVuID0gKih1bnNpZ25lZCBzaG9ydCAqKSh2YSArIDQpOworCQllbHNlCisJCQlsZW4gPSAqKHVuc2lnbmVkIGludCAqKSh2YSArIDQpOworCQlpZiAocGdfb2Zmc2V0ICsgbGVuID4ga3ZtLT5hcmNoLnJhbV9wc2l6ZSkKKwkJCXJldHVybiBIX1BBUkFNRVRFUjsKKwkJc3dpdGNoIChmbGFncykgeworCQljYXNlIDE6CQkvKiByZWdpc3RlciBWUEEgKi8KKwkJCWlmIChsZW4gPCA2NDApCisJCQkJcmV0dXJuIEhfUEFSQU1FVEVSOworCQkJdHZjcHUtPmFyY2gudnBhID0gdmE7CisJCQlpbml0X3ZwYSh2Y3B1LCB2YSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgkJLyogcmVnaXN0ZXIgRFRMICovCisJCQlpZiAobGVuIDwgNDgpCisJCQkJcmV0dXJuIEhfUEFSQU1FVEVSOworCQkJaWYgKCF0dmNwdS0+YXJjaC52cGEpCisJCQkJcmV0dXJuIEhfUkVTT1VSQ0U7CisJCQlsZW4gLT0gbGVuICUgNDg7CisJCQl0dmNwdS0+YXJjaC5kdGwgPSB2YTsKKwkJCXR2Y3B1LT5hcmNoLmR0bF9lbmQgPSB2YSArIGxlbjsKKwkJCWJyZWFrOworCQljYXNlIDM6CQkvKiByZWdpc3RlciBTTEIgc2hhZG93IGJ1ZmZlciAqLworCQkJaWYgKGxlbiA8IDgpCisJCQkJcmV0dXJuIEhfUEFSQU1FVEVSOworCQkJaWYgKCF0dmNwdS0+YXJjaC52cGEpCisJCQkJcmV0dXJuIEhfUkVTT1VSQ0U7CisJCQl0dmNwdS0+YXJjaC5zbGJfc2hhZG93ID0gdmE7CisJCQlsZW4gPSAobGVuIC0gMTYpIC8gMTY7CisJCQl0dmNwdS0+YXJjaC5zbGJfc2hhZG93ID0gdmE7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoZmxhZ3MpIHsKKwkJY2FzZSA1OgkJLyogdW5yZWdpc3RlciBWUEEgKi8KKwkJCWlmICh0dmNwdS0+YXJjaC5zbGJfc2hhZG93IHx8IHR2Y3B1LT5hcmNoLmR0bCkKKwkJCQlyZXR1cm4gSF9SRVNPVVJDRTsKKwkJCXR2Y3B1LT5hcmNoLnZwYSA9IE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSA2OgkJLyogdW5yZWdpc3RlciBEVEwgKi8KKwkJCXR2Y3B1LT5hcmNoLmR0bCA9IE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSA3OgkJLyogdW5yZWdpc3RlciBTTEIgc2hhZG93IGJ1ZmZlciAqLworCQkJdHZjcHUtPmFyY2guc2xiX3NoYWRvdyA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gSF9TVUNDRVNTOworfQorCitpbnQga3ZtcHBjX3BzZXJpZXNfZG9faGNhbGwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXVuc2lnbmVkIGxvbmcgcmVxID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgMyk7CisJdW5zaWduZWQgbG9uZyB0YXJnZXQsIHJldCA9IEhfU1VDQ0VTUzsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnR2Y3B1OworCisJc3dpdGNoIChyZXEpIHsKKwljYXNlIEhfQ0VERToKKwkJdmNwdS0+YXJjaC5zaHJlZ3MubXNyIHw9IE1TUl9FRTsKKwkJdmNwdS0+YXJjaC5jZWRlZCA9IDE7CisJCXNtcF9tYigpOworCQlpZiAoIXZjcHUtPmFyY2gucHJvZGRlZCkKKwkJCWt2bXBwY192Y3B1X2Jsb2NrKHZjcHUpOworCQllbHNlCisJCQl2Y3B1LT5hcmNoLnByb2RkZWQgPSAwOworCQlzbXBfbWIoKTsKKwkJdmNwdS0+YXJjaC5jZWRlZCA9IDA7CisJCWJyZWFrOworCWNhc2UgSF9QUk9EOgorCQl0YXJnZXQgPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCA0KTsKKwkJdHZjcHUgPSBrdm1wcGNfZmluZF92Y3B1KHZjcHUtPmt2bSwgdGFyZ2V0KTsKKwkJaWYgKCF0dmNwdSkgeworCQkJcmV0ID0gSF9QQVJBTUVURVI7CisJCQlicmVhazsKKwkJfQorCQl0dmNwdS0+YXJjaC5wcm9kZGVkID0gMTsKKwkJc21wX21iKCk7CisJCWlmICh2Y3B1LT5hcmNoLmNlZGVkKSB7CisJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdmNwdS0+d3EpKSB7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2Y3B1LT53cSk7CisJCQkJdmNwdS0+c3RhdC5oYWx0X3dha2V1cCsrOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgSF9DT05GRVI6CisJCWJyZWFrOworCWNhc2UgSF9SRUdJU1RFUl9WUEE6CisJCXJldCA9IGRvX2hfcmVnaXN0ZXJfdnBhKHZjcHUsIGt2bXBwY19nZXRfZ3ByKHZjcHUsIDQpLAorCQkJCQlrdm1wcGNfZ2V0X2dwcih2Y3B1LCA1KSwKKwkJCQkJa3ZtcHBjX2dldF9ncHIodmNwdSwgNikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gUkVTVU1FX0hPU1Q7CisJfQorCWt2bXBwY19zZXRfZ3ByKHZjcHUsIDMsIHJldCk7CisJdmNwdS0+YXJjaC5oY2FsbF9uZWVkZWQgPSAwOworCXJldHVybiBSRVNVTUVfR1VFU1Q7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX2hhbmRsZV9leGl0KHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCWludCByID0gUkVTVU1FX0hPU1Q7CisKKwl2Y3B1LT5zdGF0LnN1bV9leGl0cysrOworCisJcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX1VOS05PV047CisJcnVuLT5yZWFkeV9mb3JfaW50ZXJydXB0X2luamVjdGlvbiA9IDE7CisJc3dpdGNoICh2Y3B1LT5hcmNoLnRyYXApIHsKKwkvKiBXZSdyZSBnb29kIG9uIHRoZXNlIC0gdGhlIGhvc3QgbWVyZWx5IHdhbnRlZCB0byBnZXQgb3VyIGF0dGVudGlvbiAqLworCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9IVl9ERUNSRU1FTlRFUjoKKwkJdmNwdS0+c3RhdC5kZWNfZXhpdHMrKzsKKwkJciA9IFJFU1VNRV9HVUVTVDsKKwkJYnJlYWs7CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMOgorCQl2Y3B1LT5zdGF0LmV4dF9pbnRyX2V4aXRzKys7CisJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCWJyZWFrOworCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9QRVJGTU9OOgorCQlyID0gUkVTVU1FX0dVRVNUOworCQlicmVhazsKKwljYXNlIEJPT0szU19JTlRFUlJVUFRfUFJPR1JBTToKKwl7CisJCXVsb25nIGZsYWdzOworCQkvKgorCQkgKiBOb3JtYWxseSBwcm9ncmFtIGludGVycnVwdHMgYXJlIGRlbGl2ZXJlZCBkaXJlY3RseQorCQkgKiB0byB0aGUgZ3Vlc3QgYnkgdGhlIGhhcmR3YXJlLCBidXQgd2UgY2FuIGdldCBoZXJlCisJCSAqIGFzIGEgcmVzdWx0IG9mIGEgaHlwZXJ2aXNvciBlbXVsYXRpb24gaW50ZXJydXB0CisJCSAqIChlNDApIGdldHRpbmcgdHVybmVkIGludG8gYSA3MDAgYnkgQk1MIFJUQVMuCisJCSAqLworCQlmbGFncyA9IHZjcHUtPmFyY2guc2hyZWdzLm1zciAmIDB4MWYwMDAwdWxsOworCQlrdm1wcGNfY29yZV9xdWV1ZV9wcm9ncmFtKHZjcHUsIGZsYWdzKTsKKwkJciA9IFJFU1VNRV9HVUVTVDsKKwkJYnJlYWs7CisJfQorCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMOgorCXsKKwkJLyogaGNhbGwgLSBwdW50IHRvIHVzZXJzcGFjZSAqLworCQlpbnQgaTsKKworCQlpZiAodmNwdS0+YXJjaC5zaHJlZ3MubXNyICYgTVNSX1BSKSB7CisJCQkvKiBzYyAxIGZyb20gdXNlcnNwYWNlIC0gcmVmbGVjdCB0byBndWVzdCBzeXNjYWxsICovCisJCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMKTsKKwkJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCQlicmVhazsKKwkJfQorCQlydW4tPnBhcHJfaGNhbGwubnIgPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCAzKTsKKwkJZm9yIChpID0gMDsgaSA8IDk7ICsraSkKKwkJCXJ1bi0+cGFwcl9oY2FsbC5hcmdzW2ldID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgNCArIGkpOworCQlydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfUEFQUl9IQ0FMTDsKKwkJdmNwdS0+YXJjaC5oY2FsbF9uZWVkZWQgPSAxOworCQlyID0gUkVTVU1FX0hPU1Q7CisJCWJyZWFrOworCX0KKwkvKgorCSAqIFdlIGdldCB0aGVzZSBuZXh0IHR3byBpZiB0aGUgZ3Vlc3QgZG9lcyBhIGJhZCByZWFsLW1vZGUgYWNjZXNzLAorCSAqIGFzIHdlIGhhdmUgZW5hYmxlZCBWUk1BICh2aXJ0dWFsaXplZCByZWFsIG1vZGUgYXJlYSkgbW9kZSBpbiB0aGUKKwkgKiBMUENSLiAgV2UganVzdCBnZW5lcmF0ZSBhbiBhcHByb3ByaWF0ZSBEU0kvSVNJIHRvIHRoZSBndWVzdC4KKwkgKi8KKwljYXNlIEJPT0szU19JTlRFUlJVUFRfSF9EQVRBX1NUT1JBR0U6CisJCXZjcHUtPmFyY2guc2hyZWdzLmRzaXNyID0gdmNwdS0+YXJjaC5mYXVsdF9kc2lzcjsKKwkJdmNwdS0+YXJjaC5zaHJlZ3MuZGFyID0gdmNwdS0+YXJjaC5mYXVsdF9kYXI7CisJCWt2bXBwY19pbmplY3RfaW50ZXJydXB0KHZjcHUsIEJPT0szU19JTlRFUlJVUFRfREFUQV9TVE9SQUdFLCAwKTsKKwkJciA9IFJFU1VNRV9HVUVTVDsKKwkJYnJlYWs7CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX0hfSU5TVF9TVE9SQUdFOgorCQlrdm1wcGNfaW5qZWN0X2ludGVycnVwdCh2Y3B1LCBCT09LM1NfSU5URVJSVVBUX0lOU1RfU1RPUkFHRSwKKwkJCQkJMHgwODAwMDAwMCk7CisJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCWJyZWFrOworCS8qCisJICogVGhpcyBvY2N1cnMgaWYgdGhlIGd1ZXN0IGV4ZWN1dGVzIGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24uCisJICogV2UganVzdCBnZW5lcmF0ZSBhIHByb2dyYW0gaW50ZXJydXB0IHRvIHRoZSBndWVzdCwgc2luY2UKKwkgKiB3ZSBkb24ndCBlbXVsYXRlIGFueSBndWVzdCBpbnN0cnVjdGlvbnMgYXQgdGhpcyBzdGFnZS4KKwkgKi8KKwljYXNlIEJPT0szU19JTlRFUlJVUFRfSF9FTVVMX0FTU0lTVDoKKwkJa3ZtcHBjX2NvcmVfcXVldWVfcHJvZ3JhbSh2Y3B1LCAweDgwMDAwKTsKKwkJciA9IFJFU1VNRV9HVUVTVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJa3ZtcHBjX2R1bXBfcmVncyh2Y3B1KTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInRyYXA9MHgleCB8IHBjPTB4JWx4IHwgbXNyPTB4JWxseFxuIiwKKwkJCXZjcHUtPmFyY2gudHJhcCwga3ZtcHBjX2dldF9wYyh2Y3B1KSwKKwkJCXZjcHUtPmFyY2guc2hyZWdzLm1zcik7CisJCXIgPSBSRVNVTUVfSE9TVDsKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCisJaWYgKCEociAmIFJFU1VNRV9IT1NUKSkgeworCQkvKiBUbyBhdm9pZCBjbG9iYmVyaW5nIGV4aXRfcmVhc29uLCBvbmx5IGNoZWNrIGZvciBzaWduYWxzIGlmCisJCSAqIHdlIGFyZW4ndCBhbHJlYWR5IGV4aXRpbmcgdG8gdXNlcnNwYWNlIGZvciBzb21lIG90aGVyCisJCSAqIHJlYXNvbi4gKi8KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKHRzaykpIHsKKwkJCXZjcHUtPnN0YXQuc2lnbmFsX2V4aXRzKys7CisJCQlydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKKwkJCXIgPSAtRUlOVFI7CisJCX0gZWxzZSB7CisJCQlrdm1wcGNfY29yZV9kZWxpdmVyX2ludGVycnVwdHModmNwdSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfZ2V0X3NyZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3ZtX3NyZWdzICpzcmVncykKK3sKKwlpbnQgaTsKKworCXNyZWdzLT5wdnIgPSB2Y3B1LT5hcmNoLnB2cjsKKworCW1lbXNldChzcmVncywgMCwgc2l6ZW9mKHN0cnVjdCBrdm1fc3JlZ3MpKTsKKwlmb3IgKGkgPSAwOyBpIDwgdmNwdS0+YXJjaC5zbGJfbWF4OyBpKyspIHsKKwkJc3JlZ3MtPnUucy5wcGM2NC5zbGJbaV0uc2xiZSA9IHZjcHUtPmFyY2guc2xiW2ldLm9yaWdlOworCQlzcmVncy0+dS5zLnBwYzY0LnNsYltpXS5zbGJ2ID0gdmNwdS0+YXJjaC5zbGJbaV0ub3JpZ3Y7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBrdm1fYXJjaF92Y3B1X2lvY3RsX3NldF9zcmVncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGt2bV9zcmVncyAqc3JlZ3MpCit7CisJaW50IGksIGo7CisKKwlrdm1wcGNfc2V0X3B2cih2Y3B1LCBzcmVncy0+cHZyKTsKKworCWogPSAwOworCWZvciAoaSA9IDA7IGkgPCB2Y3B1LT5hcmNoLnNsYl9ucjsgaSsrKSB7CisJCWlmIChzcmVncy0+dS5zLnBwYzY0LnNsYltpXS5zbGJlICYgU0xCX0VTSURfVikgeworCQkJdmNwdS0+YXJjaC5zbGJbal0ub3JpZ2UgPSBzcmVncy0+dS5zLnBwYzY0LnNsYltpXS5zbGJlOworCQkJdmNwdS0+YXJjaC5zbGJbal0ub3JpZ3YgPSBzcmVncy0+dS5zLnBwYzY0LnNsYltpXS5zbGJ2OworCQkJKytqOworCQl9CisJfQorCXZjcHUtPmFyY2guc2xiX21heCA9IGo7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGt2bXBwY19jb3JlX2NoZWNrX3Byb2Nlc3Nvcl9jb21wYXQodm9pZCkKK3sKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfSFZNT0RFKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0cnVjdCBrdm1fdmNwdSAqa3ZtcHBjX2NvcmVfdmNwdV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBpbnQgaWQpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCWludCBlcnIgPSAtRUlOVkFMOworCWludCBjb3JlOworCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjb3JlOworCisJY29yZSA9IGlkIC8gdGhyZWFkc19wZXJfY29yZTsKKwlpZiAoY29yZSA+PSBLVk1fTUFYX1ZDT1JFUykKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCXZjcHUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX3ZjcHUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZjcHUpCisJCWdvdG8gb3V0OworCisJZXJyID0ga3ZtX3ZjcHVfaW5pdCh2Y3B1LCBrdm0sIGlkKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfdmNwdTsKKworCXZjcHUtPmFyY2guc2hhcmVkID0gJnZjcHUtPmFyY2guc2hyZWdzOworCXZjcHUtPmFyY2gubGFzdF9jcHUgPSAtMTsKKwl2Y3B1LT5hcmNoLm1tY3JbMF0gPSBNTUNSMF9GQzsKKwl2Y3B1LT5hcmNoLmN0cmwgPSBDVFJMX1JVTkxBVENIOworCS8qIGRlZmF1bHQgdG8gaG9zdCBQVlIsIHNpbmNlIHdlIGNhbid0IHNwb29mIGl0ICovCisJdmNwdS0+YXJjaC5wdnIgPSBtZnNwcihTUFJOX1BWUik7CisJa3ZtcHBjX3NldF9wdnIodmNwdSwgdmNwdS0+YXJjaC5wdnIpOworCisJa3ZtcHBjX21tdV9ib29rM3NfaHZfaW5pdCh2Y3B1KTsKKworCS8qCisJICogU29tZSB2Y3B1cyBtYXkgc3RhcnQgb3V0IGluIHN0b3BwZWQgc3RhdGUuICBJZiB3ZSBpbml0aWFsaXplCisJICogdGhlbSB0byBidXN5LWluLWhvc3Qgc3RhdGUgdGhleSB3aWxsIHN0b3Agb3RoZXIgdmNwdXMgaW4gdGhlCisJICogdmNvcmUgZnJvbSBydW5uaW5nLiAgSW5zdGVhZCB3ZSBpbml0aWFsaXplIHRoZW0gdG8gYmxvY2tlZAorCSAqIHN0YXRlLCBlZmZlY3RpdmVseSBjb25zaWRlcmluZyB0aGVtIHRvIGJlIHN0b3BwZWQgdW50aWwgd2UKKwkgKiBzZWUgdGhlIGZpcnN0IHJ1biBpb2N0bCBmb3IgdGhlbS4KKwkgKi8KKwl2Y3B1LT5hcmNoLnN0YXRlID0gS1ZNUFBDX1ZDUFVfQkxPQ0tFRDsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZjcHUtPmFyY2guY3B1X3J1bik7CisKKwltdXRleF9sb2NrKCZrdm0tPmxvY2spOworCXZjb3JlID0ga3ZtLT5hcmNoLnZjb3Jlc1tjb3JlXTsKKwlpZiAoIXZjb3JlKSB7CisJCXZjb3JlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt2bXBwY192Y29yZSksIEdGUF9LRVJORUwpOworCQlpZiAodmNvcmUpIHsKKwkJCUlOSVRfTElTVF9IRUFEKCZ2Y29yZS0+cnVubmFibGVfdGhyZWFkcyk7CisJCQlzcGluX2xvY2tfaW5pdCgmdmNvcmUtPmxvY2spOworCQl9CisJCWt2bS0+YXJjaC52Y29yZXNbY29yZV0gPSB2Y29yZTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOworCisJaWYgKCF2Y29yZSkKKwkJZ290byBmcmVlX3ZjcHU7CisKKwlzcGluX2xvY2soJnZjb3JlLT5sb2NrKTsKKwkrK3Zjb3JlLT5udW1fdGhyZWFkczsKKwkrK3Zjb3JlLT5uX2Jsb2NrZWQ7CisJc3Bpbl91bmxvY2soJnZjb3JlLT5sb2NrKTsKKwl2Y3B1LT5hcmNoLnZjb3JlID0gdmNvcmU7CisKKwlyZXR1cm4gdmNwdTsKKworZnJlZV92Y3B1OgorCWtmcmVlKHZjcHUpOworb3V0OgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3ZvaWQga3ZtcHBjX2NvcmVfdmNwdV9mcmVlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlrdm1fdmNwdV91bmluaXQodmNwdSk7CisJa2ZyZWUodmNwdSk7Cit9CisKK3N0YXRpYyB2b2lkIGt2bXBwY192Y3B1X2Jsb2NrZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjID0gdmNwdS0+YXJjaC52Y29yZTsKKworCXNwaW5fbG9jaygmdmMtPmxvY2spOworCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9CTE9DS0VEOworCSsrdmMtPm5fYmxvY2tlZDsKKwlpZiAodmMtPm5fcnVubmFibGUgPiAwICYmCisJICAgIHZjLT5uX3J1bm5hYmxlICsgdmMtPm5fYmxvY2tlZCA9PSB2Yy0+bnVtX3RocmVhZHMpIHsKKwkJdmNwdSA9IGxpc3RfZmlyc3RfZW50cnkoJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBzdHJ1Y3Qga3ZtX3ZjcHUsCisJCQkJCWFyY2gucnVuX2xpc3QpOworCQl3YWtlX3VwKCZ2Y3B1LT5hcmNoLmNwdV9ydW4pOworCX0KKwlzcGluX3VubG9jaygmdmMtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBrdm1wcGNfdmNwdV91bmJsb2NrZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjID0gdmNwdS0+YXJjaC52Y29yZTsKKworCXNwaW5fbG9jaygmdmMtPmxvY2spOworCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9CVVNZX0lOX0hPU1Q7CisJLS12Yy0+bl9ibG9ja2VkOworCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7Cit9CisKK2V4dGVybiBpbnQgX19rdm1wcGNfdmNvcmVfZW50cnkoc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CitleHRlcm4gdm9pZCB4aWNzX3dha2VfY3B1KGludCBjcHUpOworCitzdGF0aWMgdm9pZCBrdm1wcGNfcmVtb3ZlX3J1bm5hYmxlKHN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjLAorCQkJCSAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnY7CisKKwlpZiAodmNwdS0+YXJjaC5zdGF0ZSAhPSBLVk1QUENfVkNQVV9SVU5OQUJMRSkKKwkJcmV0dXJuOworCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9CVVNZX0lOX0hPU1Q7CisJLS12Yy0+bl9ydW5uYWJsZTsKKwkvKiBkZWNyZW1lbnQgdGhlIHBoeXNpY2FsIHRocmVhZCBpZCBvZiBlYWNoIGZvbGxvd2luZyB2Y3B1ICovCisJdiA9IHZjcHU7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSh2LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMsIGFyY2gucnVuX2xpc3QpCisJCS0tdi0+YXJjaC5wdGlkOworCWxpc3RfZGVsKCZ2Y3B1LT5hcmNoLnJ1bl9saXN0KTsKK30KKworc3RhdGljIHZvaWQga3ZtcHBjX3N0YXJ0X3RocmVhZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaW50IGNwdTsKKwlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKnRwYWNhOworCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjID0gdmNwdS0+YXJjaC52Y29yZTsKKworCWNwdSA9IHZjLT5wY3B1ICsgdmNwdS0+YXJjaC5wdGlkOworCXRwYWNhID0gJnBhY2FbY3B1XTsKKwl0cGFjYS0+a3ZtX2hzdGF0ZS5rdm1fdmNwdSA9IHZjcHU7CisJdHBhY2EtPmt2bV9oc3RhdGUua3ZtX3Zjb3JlID0gdmM7CisJc21wX3dtYigpOworI2lmZGVmIENPTkZJR19QUENfSUNQX05BVElWRQorCWlmICh2Y3B1LT5hcmNoLnB0aWQpIHsKKwkJdHBhY2EtPmNwdV9zdGFydCA9IDB4ODA7CisJCXRwYWNhLT5rdm1faHN0YXRlLmluX2d1ZXN0ID0gS1ZNX0dVRVNUX01PREVfR1VFU1Q7CisJCXdtYigpOworCQl4aWNzX3dha2VfY3B1KGNwdSk7CisJCSsrdmMtPm5fd29rZW47CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGt2bXBwY193YWl0X2Zvcl9uYXAoc3RydWN0IGt2bXBwY192Y29yZSAqdmMpCit7CisJaW50IGk7CisKKwlITVRfbG93KCk7CisJaSA9IDA7CisJd2hpbGUgKHZjLT5uYXBfY291bnQgPCB2Yy0+bl93b2tlbikgeworCQlpZiAoKytpID49IDEwMDAwMDApIHsKKwkJCXByX2Vycigia3ZtcHBjX3dhaXRfZm9yX25hcCB0aW1lb3V0ICVkICVkXG4iLAorCQkJICAgICAgIHZjLT5uYXBfY291bnQsIHZjLT5uX3dva2VuKTsKKwkJCWJyZWFrOworCQl9CisJCWNwdV9yZWxheCgpOworCX0KKwlITVRfbWVkaXVtKCk7Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IHdlIGFyZSBvbiB0aHJlYWQgMCBhbmQgdGhhdCBhbnkgb3RoZXIgdGhyZWFkcyBpbgorICogdGhpcyBjb3JlIGFyZSBvZmYtbGluZS4KKyAqLworc3RhdGljIGludCBvbl9wcmltYXJ5X3RocmVhZCh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaW50IHRociA9IGNwdV90aHJlYWRfaW5fY29yZShjcHUpOworCisJaWYgKHRocikKKwkJcmV0dXJuIDA7CisJd2hpbGUgKCsrdGhyIDwgdGhyZWFkc19wZXJfY29yZSkKKwkJaWYgKGNwdV9vbmxpbmUoY3B1ICsgdGhyKSkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogUnVuIGEgc2V0IG9mIGd1ZXN0IHRocmVhZHMgb24gYSBwaHlzaWNhbCBjb3JlLgorICogQ2FsbGVkIHdpdGggdmMtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBrdm1wcGNfcnVuX2NvcmUoc3RydWN0IGt2bXBwY192Y29yZSAqdmMpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCAqdm5leHQ7CisJbG9uZyByZXQ7CisJdTY0IG5vdzsKKworCS8qIGRvbid0IHN0YXJ0IGlmIGFueSB0aHJlYWRzIGhhdmUgYSBzaWduYWwgcGVuZGluZyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodmNwdSwgJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBhcmNoLnJ1bl9saXN0KQorCQlpZiAoc2lnbmFsX3BlbmRpbmcodmNwdS0+YXJjaC5ydW5fdGFzaykpCisJCQlyZXR1cm4gMDsKKworCS8qCisJICogTWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIG9uIHRocmVhZCAwLCBhbmQgdGhhdAorCSAqIHNlY29uZGFyeSB0aHJlYWRzIGFyZSBvZmZsaW5lLgorCSAqIFhYWCB3ZSBzaG91bGQgYWxzbyBibG9jayBhdHRlbXB0cyB0byBicmluZyBhbnkKKwkgKiBzZWNvbmRhcnkgdGhyZWFkcyBvbmxpbmUuCisJICovCisJaWYgKHRocmVhZHNfcGVyX2NvcmUgPiAxICYmICFvbl9wcmltYXJ5X3RocmVhZCgpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodmNwdSwgJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBhcmNoLnJ1bl9saXN0KQorCQkJdmNwdS0+YXJjaC5yZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXZjLT5uX3dva2VuID0gMDsKKwl2Yy0+bmFwX2NvdW50ID0gMDsKKwl2Yy0+ZW50cnlfZXhpdF9jb3VudCA9IDA7CisJdmMtPnZjb3JlX3J1bm5pbmcgPSAxOworCXZjLT5pbl9ndWVzdCA9IDA7CisJdmMtPnBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2Y3B1LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMsIGFyY2gucnVuX2xpc3QpCisJCWt2bXBwY19zdGFydF90aHJlYWQodmNwdSk7CisJdmNwdSA9IGxpc3RfZmlyc3RfZW50cnkoJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBzdHJ1Y3Qga3ZtX3ZjcHUsCisJCQkJYXJjaC5ydW5fbGlzdCk7CisKKwlzcGluX3VubG9jaygmdmMtPmxvY2spOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJa3ZtX2d1ZXN0X2VudGVyKCk7CisJX19rdm1wcGNfdmNvcmVfZW50cnkoTlVMTCwgdmNwdSk7CisKKwkvKiB3YWl0IGZvciBzZWNvbmRhcnkgdGhyZWFkcyB0byBmaW5pc2ggd3JpdGluZyB0aGVpciBzdGF0ZSB0byBtZW1vcnkgKi8KKwlzcGluX2xvY2soJnZjLT5sb2NrKTsKKwlpZiAodmMtPm5hcF9jb3VudCA8IHZjLT5uX3dva2VuKQorCQlrdm1wcGNfd2FpdF9mb3JfbmFwKHZjKTsKKwkvKiBwcmV2ZW50IG90aGVyIHZjcHUgdGhyZWFkcyBmcm9tIGRvaW5nIGt2bXBwY19zdGFydF90aHJlYWQoKSBub3cgKi8KKwl2Yy0+dmNvcmVfcnVubmluZyA9IDI7CisJc3Bpbl91bmxvY2soJnZjLT5sb2NrKTsKKworCS8qIG1ha2Ugc3VyZSB1cGRhdGVzIHRvIHNlY29uZGFyeSB2Y3B1IHN0cnVjdHMgYXJlIHZpc2libGUgbm93ICovCisJc21wX21iKCk7CisJa3ZtX2d1ZXN0X2V4aXQoKTsKKworCXByZWVtcHRfZW5hYmxlKCk7CisJa3ZtX3Jlc2NoZWQodmNwdSk7CisKKwlub3cgPSBnZXRfdGIoKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZjcHUsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywgYXJjaC5ydW5fbGlzdCkgeworCQkvKiBjYW5jZWwgcGVuZGluZyBkZWMgZXhjZXB0aW9uIGlmIGRlYyBpcyBwb3NpdGl2ZSAqLworCQlpZiAobm93IDwgdmNwdS0+YXJjaC5kZWNfZXhwaXJlcyAmJgorCQkgICAga3ZtcHBjX2NvcmVfcGVuZGluZ19kZWModmNwdSkpCisJCQlrdm1wcGNfY29yZV9kZXF1ZXVlX2RlYyh2Y3B1KTsKKwkJaWYgKCF2Y3B1LT5hcmNoLnRyYXApIHsKKwkJCWlmIChzaWduYWxfcGVuZGluZyh2Y3B1LT5hcmNoLnJ1bl90YXNrKSkgeworCQkJCXZjcHUtPmFyY2gua3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOworCQkJCXZjcHUtPmFyY2gucmV0ID0gLUVJTlRSOworCQkJfQorCQkJY29udGludWU7CQkvKiBkaWRuJ3QgZ2V0IHRvIHJ1biAqLworCQl9CisJCXJldCA9IGt2bXBwY19oYW5kbGVfZXhpdCh2Y3B1LT5hcmNoLmt2bV9ydW4sIHZjcHUsCisJCQkJCSB2Y3B1LT5hcmNoLnJ1bl90YXNrKTsKKwkJdmNwdS0+YXJjaC5yZXQgPSByZXQ7CisJCXZjcHUtPmFyY2gudHJhcCA9IDA7CisJfQorCisJc3Bpbl9sb2NrKCZ2Yy0+bG9jayk7Cisgb3V0OgorCXZjLT52Y29yZV9ydW5uaW5nID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmNwdSwgdm5leHQsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywKKwkJCQkgYXJjaC5ydW5fbGlzdCkgeworCQlpZiAodmNwdS0+YXJjaC5yZXQgIT0gUkVTVU1FX0dVRVNUKSB7CisJCQlrdm1wcGNfcmVtb3ZlX3J1bm5hYmxlKHZjLCB2Y3B1KTsKKwkJCXdha2VfdXAoJnZjcHUtPmFyY2guY3B1X3J1bik7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBrdm1wcGNfcnVuX3ZjcHUoc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpbnQgcHRpZDsKKwlpbnQgd2FpdF9zdGF0ZTsKKwlzdHJ1Y3Qga3ZtcHBjX3Zjb3JlICp2YzsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCS8qIE5vIG5lZWQgdG8gZ28gaW50byB0aGUgZ3Vlc3Qgd2hlbiBhbGwgd2UgZG8gaXMgZ29pbmcgb3V0ICovCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKKwkJcmV0dXJuIC1FSU5UUjsKKwl9CisKKwkvKiBPbiBQUEM5NzAsIGNoZWNrIHRoYXQgd2UgaGF2ZSBhbiBSTUEgcmVnaW9uICovCisJaWYgKCF2Y3B1LT5rdm0tPmFyY2gucm1hICYmIGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FSQ0hfMjAxKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gMDsKKwl2Y3B1LT5hcmNoLnJldCA9IFJFU1VNRV9HVUVTVDsKKwl2Y3B1LT5hcmNoLnRyYXAgPSAwOworCisJZmx1c2hfZnBfdG9fdGhyZWFkKGN1cnJlbnQpOworCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKGN1cnJlbnQpOworCWZsdXNoX3ZzeF90b190aHJlYWQoY3VycmVudCk7CisKKwkvKgorCSAqIFN5bmNocm9uaXplIHdpdGggb3RoZXIgdGhyZWFkcyBpbiB0aGlzIHZpcnR1YWwgY29yZQorCSAqLworCXZjID0gdmNwdS0+YXJjaC52Y29yZTsKKwlzcGluX2xvY2soJnZjLT5sb2NrKTsKKwkvKiBUaGlzIGhhcHBlbnMgdGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBjYWxsZWQgZm9yIGEgdmNwdSAqLworCWlmICh2Y3B1LT5hcmNoLnN0YXRlID09IEtWTVBQQ19WQ1BVX0JMT0NLRUQpCisJCS0tdmMtPm5fYmxvY2tlZDsKKwl2Y3B1LT5hcmNoLnN0YXRlID0gS1ZNUFBDX1ZDUFVfUlVOTkFCTEU7CisJcHRpZCA9IHZjLT5uX3J1bm5hYmxlOworCXZjcHUtPmFyY2gucnVuX3Rhc2sgPSBjdXJyZW50OworCXZjcHUtPmFyY2gua3ZtX3J1biA9IGt2bV9ydW47CisJdmNwdS0+YXJjaC5wdGlkID0gcHRpZDsKKwlsaXN0X2FkZF90YWlsKCZ2Y3B1LT5hcmNoLnJ1bl9saXN0LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMpOworCSsrdmMtPm5fcnVubmFibGU7CisKKwl3YWl0X3N0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXdoaWxlICh2Y3B1LT5hcmNoLnN0YXRlID09IEtWTVBQQ19WQ1BVX1JVTk5BQkxFKSB7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJaWYgKCF2Yy0+dmNvcmVfcnVubmluZykgeworCQkJCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKKwkJCQl2Y3B1LT5hcmNoLnJldCA9IC1FSU5UUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGhhdmUgdG8gd2FpdCBmb3IgdmNvcmUgdG8gc3RvcCBleGVjdXRpbmcgZ3Vlc3QgKi8KKwkJCXdhaXRfc3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKKwkJCXNtcF9zZW5kX3Jlc2NoZWR1bGUodmMtPnBjcHUpOworCQl9CisKKwkJaWYgKCF2Yy0+dmNvcmVfcnVubmluZyAmJgorCQkgICAgdmMtPm5fcnVubmFibGUgKyB2Yy0+bl9ibG9ja2VkID09IHZjLT5udW1fdGhyZWFkcykgeworCQkJLyogd2UgY2FuIHJ1biBub3cgKi8KKwkJCWlmIChrdm1wcGNfcnVuX2NvcmUodmMpKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZjLT52Y29yZV9ydW5uaW5nID09IDEgJiYgVkNPUkVfRVhJVF9DT1VOVCh2YykgPT0gMCkKKwkJCWt2bXBwY19zdGFydF90aHJlYWQodmNwdSk7CisKKwkJLyogd2FpdCBmb3Igb3RoZXIgdGhyZWFkcyB0byBjb21lIGluLCBvciB3YWl0IGZvciB2Y29yZSAqLworCQlwcmVwYXJlX3RvX3dhaXQoJnZjcHUtPmFyY2guY3B1X3J1biwgJndhaXQsIHdhaXRfc3RhdGUpOworCQlzcGluX3VubG9jaygmdmMtPmxvY2spOworCQlzY2hlZHVsZSgpOworCQlmaW5pc2hfd2FpdCgmdmNwdS0+YXJjaC5jcHVfcnVuLCAmd2FpdCk7CisJCXNwaW5fbG9jaygmdmMtPmxvY2spOworCX0KKworCWlmICh2Y3B1LT5hcmNoLnN0YXRlID09IEtWTVBQQ19WQ1BVX1JVTk5BQkxFKQorCQlrdm1wcGNfcmVtb3ZlX3J1bm5hYmxlKHZjLCB2Y3B1KTsKKwlzcGluX3VubG9jaygmdmMtPmxvY2spOworCisJcmV0dXJuIHZjcHUtPmFyY2gucmV0OworfQorCitpbnQga3ZtcHBjX3ZjcHVfcnVuKHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpbnQgcjsKKworCWRvIHsKKwkJciA9IGt2bXBwY19ydW5fdmNwdShydW4sIHZjcHUpOworCisJCWlmIChydW4tPmV4aXRfcmVhc29uID09IEtWTV9FWElUX1BBUFJfSENBTEwgJiYKKwkJICAgICEodmNwdS0+YXJjaC5zaHJlZ3MubXNyICYgTVNSX1BSKSkgeworCQkJciA9IGt2bXBwY19wc2VyaWVzX2RvX2hjYWxsKHZjcHUpOworCQkJa3ZtcHBjX2NvcmVfZGVsaXZlcl9pbnRlcnJ1cHRzKHZjcHUpOworCQl9CisJfSB3aGlsZSAociA9PSBSRVNVTUVfR1VFU1QpOworCXJldHVybiByOworfQorCitzdGF0aWMgbG9uZyBrdm1wcGNfc3R0X25wYWdlcyh1bnNpZ25lZCBsb25nIHdpbmRvd19zaXplKQoreworCXJldHVybiBBTElHTigod2luZG93X3NpemUgPj4gU1BBUFJfVENFX1NISUZUKQorCQkgICAgICogc2l6ZW9mKHU2NCksIFBBR0VfU0laRSkgLyBQQUdFX1NJWkU7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2Vfc3BhcHJfdGNlX3RhYmxlKHN0cnVjdCBrdm1wcGNfc3BhcHJfdGNlX3RhYmxlICpzdHQpCit7CisJc3RydWN0IGt2bSAqa3ZtID0gc3R0LT5rdm07CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZrdm0tPmxvY2spOworCWxpc3RfZGVsKCZzdHQtPmxpc3QpOworCWZvciAoaSA9IDA7IGkgPCBrdm1wcGNfc3R0X25wYWdlcyhzdHQtPndpbmRvd19zaXplKTsgaSsrKQorCQlfX2ZyZWVfcGFnZShzdHQtPnBhZ2VzW2ldKTsKKwlrZnJlZShzdHQpOworCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKKworCWt2bV9wdXRfa3ZtKGt2bSk7Cit9CisKK3N0YXRpYyBpbnQga3ZtX3NwYXByX3RjZV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCit7CisJc3RydWN0IGt2bXBwY19zcGFwcl90Y2VfdGFibGUgKnN0dCA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKHZtZi0+cGdvZmYgPj0ga3ZtcHBjX3N0dF9ucGFnZXMoc3R0LT53aW5kb3dfc2l6ZSkpCisJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CisKKwlwYWdlID0gc3R0LT5wYWdlc1t2bWYtPnBnb2ZmXTsKKwlnZXRfcGFnZShwYWdlKTsKKwl2bWYtPnBhZ2UgPSBwYWdlOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGt2bV9zcGFwcl90Y2Vfdm1fb3BzID0geworCS5mYXVsdCA9IGt2bV9zcGFwcl90Y2VfZmF1bHQsCit9OworCitzdGF0aWMgaW50IGt2bV9zcGFwcl90Y2VfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdm1hLT52bV9vcHMgPSAma3ZtX3NwYXByX3RjZV92bV9vcHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga3ZtX3NwYXByX3RjZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBrdm1wcGNfc3BhcHJfdGNlX3RhYmxlICpzdHQgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlyZWxlYXNlX3NwYXByX3RjZV90YWJsZShzdHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrdm1fc3BhcHJfdGNlX2ZvcHMgPSB7CisJLm1tYXAgICAgICAgICAgID0ga3ZtX3NwYXByX3RjZV9tbWFwLAorCS5yZWxlYXNlCT0ga3ZtX3NwYXByX3RjZV9yZWxlYXNlLAorfTsKKworbG9uZyBrdm1fdm1faW9jdGxfY3JlYXRlX3NwYXByX3RjZShzdHJ1Y3Qga3ZtICprdm0sCisJCQkJICAgc3RydWN0IGt2bV9jcmVhdGVfc3BhcHJfdGNlICphcmdzKQoreworCXN0cnVjdCBrdm1wcGNfc3BhcHJfdGNlX3RhYmxlICpzdHQgPSBOVUxMOworCWxvbmcgbnBhZ2VzOworCWludCByZXQgPSAtRU5PTUVNOworCWludCBpOworCisJLyogQ2hlY2sgdGhpcyBMSU9CTiBoYXNuJ3QgYmVlbiBwcmV2aW91c2x5IGFsbG9jYXRlZCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3R0LCAma3ZtLT5hcmNoLnNwYXByX3RjZV90YWJsZXMsIGxpc3QpIHsKKwkJaWYgKHN0dC0+bGlvYm4gPT0gYXJncy0+bGlvYm4pCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW5wYWdlcyA9IGt2bXBwY19zdHRfbnBhZ2VzKGFyZ3MtPndpbmRvd19zaXplKTsKKworCXN0dCA9IGt6YWxsb2Moc2l6ZW9mKCpzdHQpICsgbnBhZ2VzKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksCisJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghc3R0KQorCQlnb3RvIGZhaWw7CisKKwlzdHQtPmxpb2JuID0gYXJncy0+bGlvYm47CisJc3R0LT53aW5kb3dfc2l6ZSA9IGFyZ3MtPndpbmRvd19zaXplOworCXN0dC0+a3ZtID0ga3ZtOworCisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CisJCXN0dC0+cGFnZXNbaV0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKCFzdHQtPnBhZ2VzW2ldKQorCQkJZ290byBmYWlsOworCX0KKworCWt2bV9nZXRfa3ZtKGt2bSk7CisKKwltdXRleF9sb2NrKCZrdm0tPmxvY2spOworCWxpc3RfYWRkKCZzdHQtPmxpc3QsICZrdm0tPmFyY2guc3BhcHJfdGNlX3RhYmxlcyk7CisKKwltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CisKKwlyZXR1cm4gYW5vbl9pbm9kZV9nZXRmZCgia3ZtLXNwYXByLXRjZSIsICZrdm1fc3BhcHJfdGNlX2ZvcHMsCisJCQkJc3R0LCBPX1JEV1IpOworCitmYWlsOgorCWlmIChzdHQpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKQorCQkJaWYgKHN0dC0+cGFnZXNbaV0pCisJCQkJX19mcmVlX3BhZ2Uoc3R0LT5wYWdlc1tpXSk7CisKKwkJa2ZyZWUoc3R0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogV29yayBvdXQgUk1MUyAocmVhbCBtb2RlIGxpbWl0IHNlbGVjdG9yKSBmaWVsZCB2YWx1ZSBmb3IgYSBnaXZlbiBSTUEgc2l6ZS4KKyAgIEFzc3VtZXMgUE9XRVI3IG9yIFBQQzk3MC4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxwY3Jfcm1scyh1bnNpZ25lZCBsb25nIHJtYV9zaXplKQoreworCXN3aXRjaCAocm1hX3NpemUpIHsKKwljYXNlIDMydWwgPDwgMjA6CS8qIDMyIE1CICovCisJCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BUkNIXzIwNikpCisJCQlyZXR1cm4gODsJLyogb25seSBzdXBwb3J0ZWQgb24gUE9XRVI3ICovCisJCXJldHVybiAtMTsKKwljYXNlIDY0dWwgPDwgMjA6CS8qIDY0IE1CICovCisJCXJldHVybiAzOworCWNhc2UgMTI4dWwgPDwgMjA6CS8qIDEyOCBNQiAqLworCQlyZXR1cm4gNzsKKwljYXNlIDI1NnVsIDw8IDIwOgkvKiAyNTYgTUIgKi8KKwkJcmV0dXJuIDQ7CisJY2FzZSAxdWwgPDwgMzA6CQkvKiAxIEdCICovCisJCXJldHVybiAyOworCWNhc2UgMTZ1bCA8PCAzMDoJLyogMTYgR0IgKi8KKwkJcmV0dXJuIDE7CisJY2FzZSAyNTZ1bCA8PCAzMDoJLyogMjU2IEdCICovCisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQga3ZtX3JtYV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCit7CisJc3RydWN0IGt2bXBwY19ybWFfaW5mbyAqcmkgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmICh2bWYtPnBnb2ZmID49IHJpLT5ucGFnZXMpCisJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CisKKwlwYWdlID0gcGZuX3RvX3BhZ2UocmktPmJhc2VfcGZuICsgdm1mLT5wZ29mZik7CisJZ2V0X3BhZ2UocGFnZSk7CisJdm1mLT5wYWdlID0gcGFnZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBrdm1fcm1hX3ZtX29wcyA9IHsKKwkuZmF1bHQgPSBrdm1fcm1hX2ZhdWx0LAorfTsKKworc3RhdGljIGludCBrdm1fcm1hX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7CisJdm1hLT52bV9vcHMgPSAma3ZtX3JtYV92bV9vcHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga3ZtX3JtYV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBrdm1wcGNfcm1hX2luZm8gKnJpID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJa3ZtX3JlbGVhc2Vfcm1hKHJpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga3ZtX3JtYV9mb3BzID0geworCS5tbWFwICAgICAgICAgICA9IGt2bV9ybWFfbW1hcCwKKwkucmVsZWFzZQk9IGt2bV9ybWFfcmVsZWFzZSwKK307CisKK2xvbmcga3ZtX3ZtX2lvY3RsX2FsbG9jYXRlX3JtYShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fYWxsb2NhdGVfcm1hICpyZXQpCit7CisJc3RydWN0IGt2bXBwY19ybWFfaW5mbyAqcmk7CisJbG9uZyBmZDsKKworCXJpID0ga3ZtX2FsbG9jX3JtYSgpOworCWlmICghcmkpCisJCXJldHVybiAtRU5PTUVNOworCisJZmQgPSBhbm9uX2lub2RlX2dldGZkKCJrdm0tcm1hIiwgJmt2bV9ybWFfZm9wcywgcmksIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJa3ZtX3JlbGVhc2Vfcm1hKHJpKTsKKworCXJldC0+cm1hX3NpemUgPSByaS0+bnBhZ2VzIDw8IFBBR0VfU0hJRlQ7CisJcmV0dXJuIGZkOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmh2YV90b19wYWdlKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZVsxXTsKKwlpbnQgbnBhZ2VzOworCisJbWlnaHRfc2xlZXAoKTsKKworCW5wYWdlcyA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgMSwgMSwgcGFnZSk7CisKKwlpZiAodW5saWtlbHkobnBhZ2VzICE9IDEpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBwYWdlWzBdOworfQorCitpbnQga3ZtcHBjX2NvcmVfcHJlcGFyZV9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQlzdHJ1Y3Qga3ZtX3VzZXJzcGFjZV9tZW1vcnlfcmVnaW9uICptZW0pCit7CisJdW5zaWduZWQgbG9uZyBwc2l6ZSwgcG9yZGVyOworCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2VzLCB0b3RhbHBhZ2VzOworCXVuc2lnbmVkIGxvbmcgcGdfaXg7CisJc3RydWN0IGt2bXBwY19wZ2luZm8gKnBnaW5mbzsKKwl1bnNpZ25lZCBsb25nIGh2YTsKKwlzdHJ1Y3Qga3ZtcHBjX3JtYV9pbmZvICpyaSA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkvKiBGb3Igbm93LCBvbmx5IGFsbG93IDE2TUIgcGFnZXMgKi8KKwlwb3JkZXIgPSBMQVJHRV9QQUdFX09SREVSOworCXBzaXplID0gMXVsIDw8IHBvcmRlcjsKKwlpZiAoKG1lbS0+bWVtb3J5X3NpemUgJiAocHNpemUgLSAxKSkgfHwKKwkgICAgKG1lbS0+Z3Vlc3RfcGh5c19hZGRyICYgKHBzaXplIC0gMSkpKSB7CisJCXByX2VycigiYmFkIG1lbW9yeV9zaXplPSVsbHggQCAlbGx4XG4iLAorCQkgICAgICAgbWVtLT5tZW1vcnlfc2l6ZSwgbWVtLT5ndWVzdF9waHlzX2FkZHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlucGFnZXMgPSBtZW0tPm1lbW9yeV9zaXplID4+IHBvcmRlcjsKKwl0b3RhbHBhZ2VzID0gKG1lbS0+Z3Vlc3RfcGh5c19hZGRyICsgbWVtLT5tZW1vcnlfc2l6ZSkgPj4gcG9yZGVyOworCisJLyogTW9yZSBtZW1vcnkgdGhhbiB3ZSBoYXZlIHNwYWNlIHRvIHRyYWNrPyAqLworCWlmICh0b3RhbHBhZ2VzID4gKDF1bCA8PCAoTUFYX01FTV9PUkRFUiAtIExBUkdFX1BBR0VfT1JERVIpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEbyB3ZSBhbHJlYWR5IGhhdmUgYW4gUk1BIHJlZ2lzdGVyZWQ/ICovCisJaWYgKG1lbS0+Z3Vlc3RfcGh5c19hZGRyID09IDAgJiYga3ZtLT5hcmNoLnJtYSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodG90YWxwYWdlcyA+IGt2bS0+YXJjaC5yYW1fbnBhZ2VzKQorCQlrdm0tPmFyY2gucmFtX25wYWdlcyA9IHRvdGFscGFnZXM7CisKKwkvKiBJcyB0aGlzIG9uZSBvZiBvdXIgcHJlYWxsb2NhdGVkIFJNQXM/ICovCisJaWYgKG1lbS0+Z3Vlc3RfcGh5c19hZGRyID09IDApIHsKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisKKwkJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQl2bWEgPSBmaW5kX3ZtYShjdXJyZW50LT5tbSwgbWVtLT51c2Vyc3BhY2VfYWRkcik7CisJCWlmICh2bWEgJiYgdm1hLT52bV9maWxlICYmCisJCSAgICB2bWEtPnZtX2ZpbGUtPmZfb3AgPT0gJmt2bV9ybWFfZm9wcyAmJgorCQkgICAgbWVtLT51c2Vyc3BhY2VfYWRkciA9PSB2bWEtPnZtX3N0YXJ0KQorCQkJcmkgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJaWYgKCFyaSAmJiBjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BUkNIXzIwMSkpIHsKKwkJCXByX2VycigiQ1BVIHJlcXVpcmVzIGFuIFJNT1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChyaSkgeworCQl1bnNpZ25lZCBsb25nIHJtYV9zaXplOworCQl1bnNpZ25lZCBsb25nIGxwY3I7CisJCWxvbmcgcm1sczsKKworCQlybWFfc2l6ZSA9IHJpLT5ucGFnZXMgPDwgUEFHRV9TSElGVDsKKwkJaWYgKHJtYV9zaXplID4gbWVtLT5tZW1vcnlfc2l6ZSkKKwkJCXJtYV9zaXplID0gbWVtLT5tZW1vcnlfc2l6ZTsKKwkJcm1scyA9IGxwY3Jfcm1scyhybWFfc2l6ZSk7CisJCWlmIChybWxzIDwgMCkgeworCQkJcHJfZXJyKCJDYW4ndCB1c2UgUk1BIG9mIDB4JWx4IGJ5dGVzXG4iLCBybWFfc2l6ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlhdG9taWNfaW5jKCZyaS0+dXNlX2NvdW50KTsKKwkJa3ZtLT5hcmNoLnJtYSA9IHJpOworCQlrdm0tPmFyY2gubl9ybWFfcGFnZXMgPSBybWFfc2l6ZSA+PiBwb3JkZXI7CisKKwkJLyogVXBkYXRlIExQQ1IgYW5kIFJNT1IgKi8KKwkJbHBjciA9IGt2bS0+YXJjaC5scGNyOworCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVJDSF8yMDEpKSB7CisJCQkvKiBQUEM5NzA7IGluc2VydCBSTUxTIHZhbHVlIChzcGxpdCBmaWVsZCkgaW4gSElENCAqLworCQkJbHBjciAmPSB+KCgxdWwgPDwgSElENF9STUxTMF9TSCkgfAorCQkJCSAgKDN1bCA8PCBISUQ0X1JNTFMyX1NIKSk7CisJCQlscGNyIHw9ICgocm1scyA+PiAyKSA8PCBISUQ0X1JNTFMwX1NIKSB8CisJCQkJKChybWxzICYgMykgPDwgSElENF9STUxTMl9TSCk7CisJCQkvKiBSTU9SIGlzIGFsc28gaW4gSElENCAqLworCQkJbHBjciB8PSAoKHJpLT5iYXNlX3BmbiA+PiAoMjYgLSBQQUdFX1NISUZUKSkgJiAweGZmZmYpCisJCQkJPDwgSElENF9STU9SX1NIOworCQl9IGVsc2UgeworCQkJLyogUE9XRVI3ICovCisJCQlscGNyICY9IH4oTFBDUl9WUE0wIHwgTFBDUl9WUk1BX0wpOworCQkJbHBjciB8PSBybWxzIDw8IExQQ1JfUk1MU19TSDsKKwkJCWt2bS0+YXJjaC5ybW9yID0ga3ZtLT5hcmNoLnJtYS0+YmFzZV9wZm4gPDwgUEFHRV9TSElGVDsKKwkJfQorCQlrdm0tPmFyY2gubHBjciA9IGxwY3I7CisJCXByX2luZm8oIlVzaW5nIFJNTyBhdCAlbHggc2l6ZSAlbHggKExQQ1IgPSAlbHgpXG4iLAorCQkJcmktPmJhc2VfcGZuIDw8IFBBR0VfU0hJRlQsIHJtYV9zaXplLCBscGNyKTsKKwl9CisKKwlwZ19peCA9IG1lbS0+Z3Vlc3RfcGh5c19hZGRyID4+IHBvcmRlcjsKKwlwZ2luZm8gPSBrdm0tPmFyY2gucmFtX3BnaW5mbyArIHBnX2l4OworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7ICsraSwgKytwZ19peCkgeworCQlpZiAocmkgJiYgcGdfaXggPCBrdm0tPmFyY2gubl9ybWFfcGFnZXMpIHsKKwkJCXBnaW5mb1tpXS5wZm4gPSByaS0+YmFzZV9wZm4gKworCQkJCShwZ19peCA8PCAocG9yZGVyIC0gUEFHRV9TSElGVCkpOworCQkJY29udGludWU7CisJCX0KKwkJaHZhID0gbWVtLT51c2Vyc3BhY2VfYWRkciArIChpIDw8IHBvcmRlcik7CisJCXBhZ2UgPSBodmFfdG9fcGFnZShodmEpOworCQlpZiAoIXBhZ2UpIHsKKwkJCXByX2Vycigib29wcywgbm8gcGZuIGZvciBodmEgJWx4XG4iLCBodmEpOworCQkJZ290byBlcnI7CisJCX0KKwkJLyogQ2hlY2sgaXQncyBhIDE2TUIgcGFnZSAqLworCQlpZiAoIVBhZ2VIZWFkKHBhZ2UpIHx8CisJCSAgICBjb21wb3VuZF9vcmRlcihwYWdlKSAhPSAoTEFSR0VfUEFHRV9PUkRFUiAtIFBBR0VfU0hJRlQpKSB7CisJCQlwcl9lcnIoInBhZ2UgYXQgJWx4IGlzbid0IDE2TUIgKG89JWQpXG4iLAorCQkJICAgICAgIGh2YSwgY29tcG91bmRfb3JkZXIocGFnZSkpOworCQkJZ290byBlcnI7CisJCX0KKwkJcGdpbmZvW2ldLnBmbiA9IHBhZ2VfdG9fcGZuKHBhZ2UpOworCX0KKworCXJldHVybiAwOworCisgZXJyOgorCXJldHVybiAtRUlOVkFMOworfQorCit2b2lkIGt2bXBwY19jb3JlX2NvbW1pdF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQlzdHJ1Y3Qga3ZtX3VzZXJzcGFjZV9tZW1vcnlfcmVnaW9uICptZW0pCit7CisJaWYgKG1lbS0+Z3Vlc3RfcGh5c19hZGRyID09IDAgJiYgbWVtLT5tZW1vcnlfc2l6ZSAhPSAwICYmCisJICAgICFrdm0tPmFyY2gucm1hKQorCQlrdm1wcGNfbWFwX3ZybWEoa3ZtLCBtZW0pOworfQorCitpbnQga3ZtcHBjX2NvcmVfaW5pdF92bShzdHJ1Y3Qga3ZtICprdm0pCit7CisJbG9uZyByOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gMXVsIDw8IChNQVhfTUVNX09SREVSIC0gTEFSR0VfUEFHRV9PUkRFUik7CisJbG9uZyBlcnIgPSAtRU5PTUVNOworCXVuc2lnbmVkIGxvbmcgbHBjcjsKKworCS8qIEFsbG9jYXRlIGhhc2hlZCBwYWdlIHRhYmxlICovCisJciA9IGt2bXBwY19hbGxvY19ocHQoa3ZtKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlJTklUX0xJU1RfSEVBRCgma3ZtLT5hcmNoLnNwYXByX3RjZV90YWJsZXMpOworCisJa3ZtLT5hcmNoLnJhbV9wZ2luZm8gPSBremFsbG9jKG5wYWdlcyAqIHNpemVvZihzdHJ1Y3Qga3ZtcHBjX3BnaW5mbyksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICgha3ZtLT5hcmNoLnJhbV9wZ2luZm8pIHsKKwkJcHJfZXJyKCJrdm1wcGNfY29yZV9pbml0X3ZtOiBjb3VsZG4ndCBhbGxvYyAlbHUgYnl0ZXNcbiIsCisJCSAgICAgICBucGFnZXMgKiBzaXplb2Yoc3RydWN0IGt2bXBwY19wZ2luZm8pKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlrdm0tPmFyY2gucmFtX25wYWdlcyA9IDA7CisJa3ZtLT5hcmNoLnJhbV9wc2l6ZSA9IDF1bCA8PCBMQVJHRV9QQUdFX09SREVSOworCWt2bS0+YXJjaC5yYW1fcG9yZGVyID0gTEFSR0VfUEFHRV9PUkRFUjsKKwlrdm0tPmFyY2gucm1hID0gTlVMTDsKKwlrdm0tPmFyY2gubl9ybWFfcGFnZXMgPSAwOworCisJa3ZtLT5hcmNoLmhvc3Rfc2RyMSA9IG1mc3ByKFNQUk5fU0RSMSk7CisKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVJDSF8yMDEpKSB7CisJCS8qIFBQQzk3MDsgSElENCBpcyBlZmZlY3RpdmVseSB0aGUgTFBDUiAqLworCQl1bnNpZ25lZCBsb25nIGxwaWQgPSBrdm0tPmFyY2gubHBpZDsKKwkJa3ZtLT5hcmNoLmhvc3RfbHBpZCA9IDA7CisJCWt2bS0+YXJjaC5ob3N0X2xwY3IgPSBscGNyID0gbWZzcHIoU1BSTl9ISUQ0KTsKKwkJbHBjciAmPSB+KCgzIDw8IEhJRDRfTFBJRDFfU0gpIHwgKDB4ZnVsIDw8IEhJRDRfTFBJRDVfU0gpKTsKKwkJbHBjciB8PSAoKGxwaWQgPj4gNCkgPDwgSElENF9MUElEMV9TSCkgfAorCQkJKChscGlkICYgMHhmKSA8PCBISUQ0X0xQSUQ1X1NIKTsKKwl9IGVsc2UgeworCQkvKiBQT1dFUjc7IGluaXQgTFBDUiBmb3IgdmlydHVhbCBSTUEgbW9kZSAqLworCQlrdm0tPmFyY2guaG9zdF9scGlkID0gbWZzcHIoU1BSTl9MUElEKTsKKwkJa3ZtLT5hcmNoLmhvc3RfbHBjciA9IGxwY3IgPSBtZnNwcihTUFJOX0xQQ1IpOworCQlscGNyICY9IExQQ1JfUEVDRSB8IExQQ1JfTFBFUzsKKwkJbHBjciB8PSAoNFVMIDw8IExQQ1JfRFBGRF9TSCkgfCBMUENSX0hESUNFIHwKKwkJCUxQQ1JfVlBNMCB8IExQQ1JfVlJNQV9MOworCX0KKwlrdm0tPmFyY2gubHBjciA9IGxwY3I7CisKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlOgorCWt2bXBwY19mcmVlX2hwdChrdm0pOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQga3ZtcHBjX2NvcmVfZGVzdHJveV92bShzdHJ1Y3Qga3ZtICprdm0pCit7CisJc3RydWN0IGt2bXBwY19wZ2luZm8gKnBnaW5mbzsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlpZiAoa3ZtLT5hcmNoLnJhbV9wZ2luZm8pIHsKKwkJcGdpbmZvID0ga3ZtLT5hcmNoLnJhbV9wZ2luZm87CisJCWt2bS0+YXJjaC5yYW1fcGdpbmZvID0gTlVMTDsKKwkJZm9yIChpID0ga3ZtLT5hcmNoLm5fcm1hX3BhZ2VzOyBpIDwga3ZtLT5hcmNoLnJhbV9ucGFnZXM7ICsraSkKKwkJCWlmIChwZ2luZm9baV0ucGZuKQorCQkJCXB1dF9wYWdlKHBmbl90b19wYWdlKHBnaW5mb1tpXS5wZm4pKTsKKwkJa2ZyZWUocGdpbmZvKTsKKwl9CisJaWYgKGt2bS0+YXJjaC5ybWEpIHsKKwkJa3ZtX3JlbGVhc2Vfcm1hKGt2bS0+YXJjaC5ybWEpOworCQlrdm0tPmFyY2gucm1hID0gTlVMTDsKKwl9CisKKwlrdm1wcGNfZnJlZV9ocHQoa3ZtKTsKKwlXQVJOX09OKCFsaXN0X2VtcHR5KCZrdm0tPmFyY2guc3BhcHJfdGNlX3RhYmxlcykpOworfQorCisvKiBUaGVzZSBhcmUgc3R1YnMgZm9yIG5vdyAqLwordm9pZCBrdm1wcGNfbW11X3B0ZV9wZmx1c2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyBwYV9zdGFydCwgdWxvbmcgcGFfZW5kKQoreworfQorCisvKiBXZSBkb24ndCBuZWVkIHRvIGVtdWxhdGUgYW55IHByaXZpbGVnZWQgaW5zdHJ1Y3Rpb25zIG9yIGRjYnogKi8KK2ludCBrdm1wcGNfY29yZV9lbXVsYXRlX29wKHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbnN0LCBpbnQgKmFkdmFuY2UpCit7CisJcmV0dXJuIEVNVUxBVEVfRkFJTDsKK30KKworaW50IGt2bXBwY19jb3JlX2VtdWxhdGVfbXRzcHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgc3BybiwgaW50IHJzKQoreworCXJldHVybiBFTVVMQVRFX0ZBSUw7Cit9CisKK2ludCBrdm1wcGNfY29yZV9lbXVsYXRlX21mc3ByKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHNwcm4sIGludCBydCkKK3sKKwlyZXR1cm4gRU1VTEFURV9GQUlMOworfQorCitzdGF0aWMgaW50IGt2bXBwY19ib29rM3NfaHZfaW5pdCh2b2lkKQoreworCWludCByOworCisJciA9IGt2bV9pbml0KE5VTEwsIHNpemVvZihzdHJ1Y3Qga3ZtX3ZjcHUpLCAwLCBUSElTX01PRFVMRSk7CisKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0ga3ZtcHBjX21tdV9odl9pbml0KCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQga3ZtcHBjX2Jvb2szc19odl9leGl0KHZvaWQpCit7CisJa3ZtX2V4aXQoKTsKK30KKworbW9kdWxlX2luaXQoa3ZtcHBjX2Jvb2szc19odl9pbml0KTsKK21vZHVsZV9leGl0KGt2bXBwY19ib29rM3NfaHZfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9idWlsdGluLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9idWlsdGluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzMTIwMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X2J1aWx0aW4uYwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycC4gPHBhdWx1c0BhdTEuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KKyNpbmNsdWRlIDxhc20va3ZtX2Jvb2szcy5oPgorCisvKgorICogVGhpcyBtYWludGFpbnMgYSBsaXN0IG9mIFJNQXMgKHJlYWwgbW9kZSBhcmVhcykgZm9yIEtWTSBndWVzdHMgdG8gdXNlLgorICogRWFjaCBSTUEgaGFzIHRvIGJlIHBoeXNpY2FsbHkgY29udGlndW91cyBhbmQgb2YgYSBzaXplIHRoYXQgdGhlCisgKiBoYXJkd2FyZSBzdXBwb3J0cy4gIFBQQzk3MCBhbmQgUE9XRVI3IHN1cHBvcnQgNjRNQiwgMTI4TUIgYW5kIDI1Nk1CLAorICogYW5kIG90aGVyIGxhcmdlciBzaXplcy4gIFNpbmNlIHdlIGFyZSB1bmxpa2VseSB0byBiZSBhbGxvY2F0ZSB0aGF0CisgKiBtdWNoIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkgYWZ0ZXIgdGhlIHN5c3RlbSBpcyB1cCBhbmQgcnVubmluZywKKyAqIHdlIHByZWFsbG9jYXRlIGEgc2V0IG9mIFJNQXMgaW4gZWFybHkgYm9vdCBmb3IgS1ZNIHRvIHVzZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcga3ZtX3JtYV9zaXplID0gNjQgPDwgMjA7CS8qIDY0TUIgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGt2bV9ybWFfY291bnQ7CisKK3N0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlX3JtYV9zaXplKGNoYXIgKnApCit7CisJaWYgKCFwKQorCQlyZXR1cm4gMTsKKworCWt2bV9ybWFfc2l6ZSA9IG1lbXBhcnNlKHAsICZwKTsKKworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImt2bV9ybWFfc2l6ZSIsIGVhcmx5X3BhcnNlX3JtYV9zaXplKTsKKworc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2Vfcm1hX2NvdW50KGNoYXIgKnApCit7CisJaWYgKCFwKQorCQlyZXR1cm4gMTsKKworCWt2bV9ybWFfY291bnQgPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAwKTsKKworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImt2bV9ybWFfY291bnQiLCBlYXJseV9wYXJzZV9ybWFfY291bnQpOworCitzdGF0aWMgc3RydWN0IGt2bXBwY19ybWFfaW5mbyAqcm1hX2luZm87CitzdGF0aWMgTElTVF9IRUFEKGZyZWVfcm1hcyk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJtYV9sb2NrKTsKKworLyogV29yayBvdXQgUk1MUyAocmVhbCBtb2RlIGxpbWl0IHNlbGVjdG9yKSBmaWVsZCB2YWx1ZSBmb3IgYSBnaXZlbiBSTUEgc2l6ZS4KKyAgIEFzc3VtZXMgUE9XRVI3IG9yIFBQQzk3MC4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxwY3Jfcm1scyh1bnNpZ25lZCBsb25nIHJtYV9zaXplKQoreworCXN3aXRjaCAocm1hX3NpemUpIHsKKwljYXNlIDMydWwgPDwgMjA6CS8qIDMyIE1CICovCisJCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BUkNIXzIwNikpCisJCQlyZXR1cm4gODsJLyogb25seSBzdXBwb3J0ZWQgb24gUE9XRVI3ICovCisJCXJldHVybiAtMTsKKwljYXNlIDY0dWwgPDwgMjA6CS8qIDY0IE1CICovCisJCXJldHVybiAzOworCWNhc2UgMTI4dWwgPDwgMjA6CS8qIDEyOCBNQiAqLworCQlyZXR1cm4gNzsKKwljYXNlIDI1NnVsIDw8IDIwOgkvKiAyNTYgTUIgKi8KKwkJcmV0dXJuIDQ7CisJY2FzZSAxdWwgPDwgMzA6CQkvKiAxIEdCICovCisJCXJldHVybiAyOworCWNhc2UgMTZ1bCA8PCAzMDoJLyogMTYgR0IgKi8KKwkJcmV0dXJuIDE7CisJY2FzZSAyNTZ1bCA8PCAzMDoJLyogMjU2IEdCICovCisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9Cit9CisKKy8qCisgKiBDYWxsZWQgYXQgYm9vdCB0aW1lIHdoaWxlIHRoZSBib290bWVtIGFsbG9jYXRvciBpcyBhY3RpdmUsCisgKiB0byBhbGxvY2F0ZSBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeSBmb3IgdGhlIHJlYWwgbWVtb3J5CisgKiBhcmVhcyBmb3IgZ3Vlc3RzLgorICovCit2b2lkIGt2bV9ybWFfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIGosIG5wYWdlczsKKwl2b2lkICpybWE7CisJc3RydWN0IHBhZ2UgKnBnOworCisJLyogT25seSBkbyB0aGlzIG9uIFBQQzk3MCBpbiBIViBtb2RlICovCisJaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9IVk1PREUpIHx8CisJICAgICFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BUkNIXzIwMSkpCisJCXJldHVybjsKKworCWlmICgha3ZtX3JtYV9zaXplIHx8ICFrdm1fcm1hX2NvdW50KQorCQlyZXR1cm47CisKKwkvKiBDaGVjayB0aGF0IHRoZSByZXF1ZXN0ZWQgc2l6ZSBpcyBvbmUgc3VwcG9ydGVkIGluIGhhcmR3YXJlICovCisJaWYgKGxwY3Jfcm1scyhrdm1fcm1hX3NpemUpIDwgMCkgeworCQlwcl9lcnIoIlJNQSBzaXplIG9mIDB4JWx4IG5vdCBzdXBwb3J0ZWRcbiIsIGt2bV9ybWFfc2l6ZSk7CisJCXJldHVybjsKKwl9CisKKwlucGFnZXMgPSBrdm1fcm1hX3NpemUgPj4gUEFHRV9TSElGVDsKKwlybWFfaW5mbyA9IGFsbG9jX2Jvb3RtZW0oa3ZtX3JtYV9jb3VudCAqIHNpemVvZihzdHJ1Y3Qga3ZtcHBjX3JtYV9pbmZvKSk7CisJZm9yIChpID0gMDsgaSA8IGt2bV9ybWFfY291bnQ7ICsraSkgeworCQlybWEgPSBhbGxvY19ib290bWVtX2FsaWduKGt2bV9ybWFfc2l6ZSwga3ZtX3JtYV9zaXplKTsKKwkJcHJfaW5mbygiQWxsb2NhdGVkIEtWTSBSTUEgYXQgJXAgKCVsZCBNQilcbiIsIHJtYSwKKwkJCWt2bV9ybWFfc2l6ZSA+PiAyMCk7CisJCXJtYV9pbmZvW2ldLmJhc2VfdmlydCA9IHJtYTsKKwkJcm1hX2luZm9baV0uYmFzZV9wZm4gPSBfX3BhKHJtYSkgPj4gUEFHRV9TSElGVDsKKwkJcm1hX2luZm9baV0ubnBhZ2VzID0gbnBhZ2VzOworCQlsaXN0X2FkZF90YWlsKCZybWFfaW5mb1tpXS5saXN0LCAmZnJlZV9ybWFzKTsKKwkJYXRvbWljX3NldCgmcm1hX2luZm9baV0udXNlX2NvdW50LCAwKTsKKworCQlwZyA9IHBmbl90b19wYWdlKHJtYV9pbmZvW2ldLmJhc2VfcGZuKTsKKwkJZm9yIChqID0gMDsgaiA8IG5wYWdlczsgKytqKSB7CisJCQlhdG9taWNfaW5jKCZwZy0+X2NvdW50KTsKKwkJCSsrcGc7CisJCX0KKwl9Cit9CisKK3N0cnVjdCBrdm1wcGNfcm1hX2luZm8gKmt2bV9hbGxvY19ybWEodm9pZCkKK3sKKwlzdHJ1Y3Qga3ZtcHBjX3JtYV9pbmZvICpyaTsKKworCXJpID0gTlVMTDsKKwlzcGluX2xvY2soJnJtYV9sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmZyZWVfcm1hcykpIHsKKwkJcmkgPSBsaXN0X2ZpcnN0X2VudHJ5KCZmcmVlX3JtYXMsIHN0cnVjdCBrdm1wcGNfcm1hX2luZm8sIGxpc3QpOworCQlsaXN0X2RlbCgmcmktPmxpc3QpOworCQlhdG9taWNfaW5jKCZyaS0+dXNlX2NvdW50KTsKKwl9CisJc3Bpbl91bmxvY2soJnJtYV9sb2NrKTsKKwlyZXR1cm4gcmk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrdm1fYWxsb2Nfcm1hKTsKKwordm9pZCBrdm1fcmVsZWFzZV9ybWEoc3RydWN0IGt2bXBwY19ybWFfaW5mbyAqcmkpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJpLT51c2VfY291bnQpKSB7CisJCXNwaW5fbG9jaygmcm1hX2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZyaS0+bGlzdCwgJmZyZWVfcm1hcyk7CisJCXNwaW5fdW5sb2NrKCZybWFfbG9jayk7CisKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrdm1fcmVsZWFzZV9ybWEpOworCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9pbnRlcnJ1cHRzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9pbnRlcnJ1cHRzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3YjY3NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X2ludGVycnVwdHMuUwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIENvcHlyaWdodCAyMDExIFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycC4gPHBhdWx1c0BhdTEuaWJtLmNvbT4KKyAqCisgKiBEZXJpdmVkIGZyb20gYm9vazNzX2ludGVycnVwdHMuUywgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgU1VTRSBMaW51eCBQcm9kdWN0cyBHbWJIIDIwMDkKKyAqCisgKiBBdXRob3JzOiBBbGV4YW5kZXIgR3JhZiA8YWdyYWZAc3VzZS5kZT4KKyAqLworCisjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KKyNpbmNsdWRlIDxhc20va3ZtX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9leGNlcHRpb24tNjRzLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1vcGNvZGUuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICBHdWVzdCBlbnRyeSAvIGV4aXQgY29kZSB0aGF0IGlzIGluIGtlcm5lbCBtb2R1bGUgbWVtb3J5ICh2bWFsbG9jKSAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVnaXN0ZXJzOgorICogIHI0OiB2Y3B1IHBvaW50ZXIKKyAqLworX0dMT0JBTChfX2t2bXBwY192Y29yZV9lbnRyeSkKKworCS8qIFdyaXRlIGNvcnJlY3Qgc3RhY2sgZnJhbWUgKi8KKwltZmxyCXIwCisJc3RkCXIwLFBQQ19MUl9TVEtPRkYocjEpCisKKwkvKiBTYXZlIGhvc3Qgc3RhdGUgdG8gdGhlIHN0YWNrICovCisJc3RkdQlyMSwgLVNXSVRDSF9GUkFNRV9TSVpFKHIxKQorCisJLyogU2F2ZSBub24tdm9sYXRpbGUgcmVnaXN0ZXJzIChyMTQgLSByMzEpICovCisJU0FWRV9OVkdQUlMocjEpCisKKwkvKiBTYXZlIGhvc3QgRFNDUiAqLworQkVHSU5fRlRSX1NFQ1RJT04KKwltZnNwcglyMywgU1BSTl9EU0NSCisJc3RkCXIzLCBIU1RBVEVfRFNDUihyMTMpCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKKworCS8qIFNhdmUgaG9zdCBEQUJSICovCisJbWZzcHIJcjMsIFNQUk5fREFCUgorCXN0ZAlyMywgSFNUQVRFX0RBQlIocjEzKQorCisJLyogSGFyZC1kaXNhYmxlIGludGVycnVwdHMgKi8KKwltZm1zciAgIHIxMAorCXN0ZAlyMTAsIEhTVEFURV9IT1NUX01TUihyMTMpCisJcmxkaWNsICByMTAscjEwLDQ4LDEKKwlyb3RsZGkgIHIxMCxyMTAsMTYKKwltdG1zcmQgIHIxMCwxCisKKwkvKiBTYXZlIGhvc3QgUE1VIHJlZ2lzdGVycyBhbmQgbG9hZCBndWVzdCBQTVUgcmVnaXN0ZXJzICovCisJLyogUjQgaXMgbGl2ZSBoZXJlICh2Y3B1IHBvaW50ZXIpIGJ1dCBub3QgcjMgb3IgcjUgKi8KKwlsaQlyMywgMQorCXNsZGkJcjMsIHIzLCAzMQkJLyogTU1DUjBfRkMgKGZyZWV6ZSBjb3VudGVycykgYml0ICovCisJbWZzcHIJcjcsIFNQUk5fTU1DUjAJCS8qIHNhdmUgTU1DUjAgKi8KKwltdHNwcglTUFJOX01NQ1IwLCByMwkJLyogZnJlZXplIGFsbCBjb3VudGVycywgZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJaXN5bmMKKwlsZAlyMywgUEFDQUxQUEFDQVBUUihyMTMpCS8qIGlzIHRoZSBob3N0IHVzaW5nIHRoZSBQTVU/ICovCisJbGJ6CXI1LCBMUFBBQ0FfUE1DSU5VU0UocjMpCisJY21wd2kJcjUsIDAKKwliZXEJMzFmCQkJLyogc2tpcCBpZiBub3QgKi8KKwltZnNwcglyNSwgU1BSTl9NTUNSMQorCW1mc3ByCXI2LCBTUFJOX01NQ1JBCisJc3RkCXI3LCBIU1RBVEVfTU1DUihyMTMpCisJc3RkCXI1LCBIU1RBVEVfTU1DUiArIDgocjEzKQorCXN0ZAlyNiwgSFNUQVRFX01NQ1IgKyAxNihyMTMpCisJbWZzcHIJcjMsIFNQUk5fUE1DMQorCW1mc3ByCXI1LCBTUFJOX1BNQzIKKwltZnNwcglyNiwgU1BSTl9QTUMzCisJbWZzcHIJcjcsIFNQUk5fUE1DNAorCW1mc3ByCXI4LCBTUFJOX1BNQzUKKwltZnNwcglyOSwgU1BSTl9QTUM2CitCRUdJTl9GVFJfU0VDVElPTgorCW1mc3ByCXIxMCwgU1BSTl9QTUM3CisJbWZzcHIJcjExLCBTUFJOX1BNQzgKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjAxKQorCXN0dwlyMywgSFNUQVRFX1BNQyhyMTMpCisJc3R3CXI1LCBIU1RBVEVfUE1DICsgNChyMTMpCisJc3R3CXI2LCBIU1RBVEVfUE1DICsgOChyMTMpCisJc3R3CXI3LCBIU1RBVEVfUE1DICsgMTIocjEzKQorCXN0dwlyOCwgSFNUQVRFX1BNQyArIDE2KHIxMykKKwlzdHcJcjksIEhTVEFURV9QTUMgKyAyMChyMTMpCitCRUdJTl9GVFJfU0VDVElPTgorCXN0dwlyMTAsIEhTVEFURV9QTUMgKyAyNChyMTMpCisJc3R3CXIxMSwgSFNUQVRFX1BNQyArIDI4KHIxMykKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjAxKQorMzE6CisKKwkvKgorCSAqIFB1dCB3aGF0ZXZlciBpcyBpbiB0aGUgZGVjcmVtZW50ZXIgaW50byB0aGUKKwkgKiBoeXBlcnZpc29yIGRlY3JlbWVudGVyLgorCSAqLworCW1mc3ByCXI4LFNQUk5fREVDCisJbWZ0YglyNworCW10c3ByCVNQUk5fSERFQyxyOAorCWV4dHN3CXI4LHI4CisJYWRkCXI4LHI4LHI3CisJc3RkCXI4LEhTVEFURV9ERUNFWFAocjEzKQorCisJLyoKKwkgKiBPbiBQUEM5NzAsIGlmIHRoZSBndWVzdCB2Y3B1IGhhcyBhbiBleHRlcm5hbCBpbnRlcnJ1cHQgcGVuZGluZywKKwkgKiBzZW5kIG91cnNlbHZlcyBhbiBJUEkgc28gYXMgdG8gaW50ZXJydXB0IHRoZSBndWVzdCBvbmNlIGl0CisJICogZW5hYmxlcyBpbnRlcnJ1cHRzLiAgKEl0IG11c3QgaGF2ZSBpbnRlcnJ1cHRzIGRpc2FibGVkLAorCSAqIG90aGVyd2lzZSB3ZSB3b3VsZCBhbHJlYWR5IGhhdmUgZGVsaXZlcmVkIHRoZSBpbnRlcnJ1cHQuKQorCSAqLworQkVHSU5fRlRSX1NFQ1RJT04KKwlsZAlyMCwgVkNQVV9QRU5ESU5HX0VYQyhyNCkKKwlsaQlyNywgKDEgPDwgQk9PSzNTX0lSUVBSSU9fRVhURVJOQUwpCisJb3JpcwlyNywgcjcsICgxIDw8IEJPT0szU19JUlFQUklPX0VYVEVSTkFMX0xFVkVMKUBoCisJYW5kLglyMCwgcjAsIHI3CisJYmVxCTMyZgorCW1yCXIzMSwgcjQKKwlsaHoJcjMsIFBBQ0FQQUNBSU5ERVgocjEzKQorCWJsCXNtcF9zZW5kX3Jlc2NoZWR1bGUKKwlub3AKKwltcglyNCwgcjMxCiszMjoKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjAxKQorCisJLyogSnVtcCB0byBwYXJ0aXRpb24gc3dpdGNoIGNvZGUgKi8KKwlibAkua3ZtcHBjX2h2X2VudHJ5X3RyYW1wb2xpbmUKKwlub3AKKworLyoKKyAqIFdlIHJldHVybiBoZXJlIGluIHZpcnR1YWwgbW9kZSBhZnRlciB0aGUgZ3Vlc3QgZXhpdHMKKyAqIHdpdGggc29tZXRoaW5nIHRoYXQgd2UgY2FuJ3QgaGFuZGxlIGluIHJlYWwgbW9kZS4KKyAqIEludGVycnVwdHMgYXJlIGVuYWJsZWQgYWdhaW4gYXQgdGhpcyBwb2ludC4KKyAqLworCisuZ2xvYmFsIGt2bXBwY19oYW5kbGVyX2hpZ2htZW0KK2t2bXBwY19oYW5kbGVyX2hpZ2htZW06CisKKwkvKgorCSAqIFJlZ2lzdGVyIHVzYWdlIGF0IHRoaXMgcG9pbnQ6CisJICoKKwkgKiBSMSAgICAgICA9IGhvc3QgUjEKKwkgKiBSMiAgICAgICA9IGhvc3QgUjIKKwkgKiBSMTIgICAgICA9IGV4aXQgaGFuZGxlciBpZAorCSAqIFIxMyAgICAgID0gUEFDQQorCSAqLworCisJLyogUmVzdG9yZSBub24tdm9sYXRpbGUgaG9zdCByZWdpc3RlcnMgKHIxNCAtIHIzMSkgKi8KKwlSRVNUX05WR1BSUyhyMSkKKworCWFkZGkgICAgcjEsIHIxLCBTV0lUQ0hfRlJBTUVfU0laRQorCWxkCXIwLCBQUENfTFJfU1RLT0ZGKHIxKQorCW10bHIJcjAKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtX21tdS5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1fbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNmZTZiMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtX21tdS5jCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDEwLTIwMTEgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3JwLiA8cGF1bHVzQGF1MS5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgorI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgorCisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KKyNpbmNsdWRlIDxhc20va3ZtX2Jvb2szcy5oPgorI2luY2x1ZGUgPGFzbS9tbXUtaGFzaDY0Lmg+CisjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorI2luY2x1ZGUgPGFzbS9zeW5jaC5oPgorI2luY2x1ZGUgPGFzbS9wcGMtb3Bjb2RlLmg+CisKKy8qIEZvciBub3cgdXNlIGZpeGVkLXNpemUgMTZNQiBwYWdlIHRhYmxlICovCisjZGVmaW5lIEhQVF9PUkRFUgkyNAorI2RlZmluZSBIUFRfTlBURUcJKDF1bCA8PCAoSFBUX09SREVSIC0gNykpCS8qIDEyOEIgcGVyIHB0ZWcgKi8KKyNkZWZpbmUgSFBUX0hBU0hfTUFTSwkoSFBUX05QVEVHIC0gMSkKKworI2RlZmluZSBIUFRFX1ZfSFZMT0NLCTB4NDBVTAorCitzdGF0aWMgaW5saW5lIGxvbmcgbG9ja19ocHRlKHVuc2lnbmVkIGxvbmcgKmhwdGUsIHVuc2lnbmVkIGxvbmcgYml0cykKK3sKKwl1bnNpZ25lZCBsb25nIHRtcCwgb2xkOworCisJYXNtIHZvbGF0aWxlKCIJbGRhcngJJTAsMCwlMlxuIgorCQkgICAgICIJYW5kLgklMSwlMCwlM1xuIgorCQkgICAgICIJYm5lCTJmXG4iCisJCSAgICAgIglvcmkJJTAsJTAsJTRcbiIKKwkJICAgICAiICBzdGRjeC4JJTAsMCwlMlxuIgorCQkgICAgICIJYmVxKwkyZlxuIgorCQkgICAgICIJbGkJJTEsJTNcbiIKKwkJICAgICAiMjoJaXN5bmMiCisJCSAgICAgOiAiPSZyIiAodG1wKSwgIj0mciIgKG9sZCkKKwkJICAgICA6ICJyIiAoaHB0ZSksICJyIiAoYml0cyksICJpIiAoSFBURV9WX0hWTE9DSykKKwkJICAgICA6ICJjYyIsICJtZW1vcnkiKTsKKwlyZXR1cm4gb2xkID09IDA7Cit9CisKK2xvbmcga3ZtcHBjX2hfZW50ZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkgICAgbG9uZyBwdGVfaW5kZXgsIHVuc2lnbmVkIGxvbmcgcHRlaCwgdW5zaWduZWQgbG9uZyBwdGVsKQoreworCXVuc2lnbmVkIGxvbmcgcG9yZGVyOworCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtPmt2bTsKKwl1bnNpZ25lZCBsb25nIGksIGxwbiwgcGE7CisJdW5zaWduZWQgbG9uZyAqaHB0ZTsKKworCS8qIG9ubHkgaGFuZGxlIDRrLCA2NGsgYW5kIDE2TSBwYWdlcyBmb3Igbm93ICovCisJcG9yZGVyID0gMTI7CisJaWYgKHB0ZWggJiBIUFRFX1ZfTEFSR0UpIHsKKwkJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FSQ0hfMjA2KSAmJgorCQkgICAgKHB0ZWwgJiAweGYwMDApID09IDB4MTAwMCkgeworCQkJLyogNjRrIHBhZ2UgKi8KKwkJCXBvcmRlciA9IDE2OworCQl9IGVsc2UgaWYgKChwdGVsICYgMHhmZjAwMCkgPT0gMCkgeworCQkJLyogMTZNIHBhZ2UgKi8KKwkJCXBvcmRlciA9IDI0OworCQkJLyogbG93ZXN0IEFWQSBiaXQgbXVzdCBiZSAwIGZvciAxNk0gcGFnZXMgKi8KKwkJCWlmIChwdGVoICYgMHg4MCkKKwkJCQlyZXR1cm4gSF9QQVJBTUVURVI7CisJCX0gZWxzZQorCQkJcmV0dXJuIEhfUEFSQU1FVEVSOworCX0KKwlscG4gPSAocHRlbCAmIEhQVEVfUl9SUE4pID4+IGt2bS0+YXJjaC5yYW1fcG9yZGVyOworCWlmIChscG4gPj0ga3ZtLT5hcmNoLnJhbV9ucGFnZXMgfHwgcG9yZGVyID4ga3ZtLT5hcmNoLnJhbV9wb3JkZXIpCisJCXJldHVybiBIX1BBUkFNRVRFUjsKKwlwYSA9IGt2bS0+YXJjaC5yYW1fcGdpbmZvW2xwbl0ucGZuIDw8IFBBR0VfU0hJRlQ7CisJaWYgKCFwYSkKKwkJcmV0dXJuIEhfUEFSQU1FVEVSOworCS8qIENoZWNrIFdJTUcgKi8KKwlpZiAoKHB0ZWwgJiBIUFRFX1JfV0lNRykgIT0gSFBURV9SX00gJiYKKwkgICAgKHB0ZWwgJiBIUFRFX1JfV0lNRykgIT0gKEhQVEVfUl9XIHwgSFBURV9SX0kgfCBIUFRFX1JfTSkpCisJCXJldHVybiBIX1BBUkFNRVRFUjsKKwlwdGVoICY9IH4weDYwVUw7CisJcHRlbCAmPSB+KEhQVEVfUl9QUDAgLSBrdm0tPmFyY2gucmFtX3BzaXplKTsKKwlwdGVsIHw9IHBhOworCWlmIChwdGVfaW5kZXggPj0gKEhQVF9OUFRFRyA8PCAzKSkKKwkJcmV0dXJuIEhfUEFSQU1FVEVSOworCWlmIChsaWtlbHkoKGZsYWdzICYgSF9FWEFDVCkgPT0gMCkpIHsKKwkJcHRlX2luZGV4ICY9IH43VUw7CisJCWhwdGUgPSAodW5zaWduZWQgbG9uZyAqKShrdm0tPmFyY2guaHB0X3ZpcnQgKyAocHRlX2luZGV4IDw8IDQpKTsKKwkJZm9yIChpID0gMDsgOyArK2kpIHsKKwkJCWlmIChpID09IDgpCisJCQkJcmV0dXJuIEhfUFRFR19GVUxMOworCQkJaWYgKCgqaHB0ZSAmIEhQVEVfVl9WQUxJRCkgPT0gMCAmJgorCQkJICAgIGxvY2tfaHB0ZShocHRlLCBIUFRFX1ZfSFZMT0NLIHwgSFBURV9WX1ZBTElEKSkKKwkJCQlicmVhazsKKwkJCWhwdGUgKz0gMjsKKwkJfQorCX0gZWxzZSB7CisJCWkgPSAwOworCQlocHRlID0gKHVuc2lnbmVkIGxvbmcgKikoa3ZtLT5hcmNoLmhwdF92aXJ0ICsgKHB0ZV9pbmRleCA8PCA0KSk7CisJCWlmICghbG9ja19ocHRlKGhwdGUsIEhQVEVfVl9IVkxPQ0sgfCBIUFRFX1ZfVkFMSUQpKQorCQkJcmV0dXJuIEhfUFRFR19GVUxMOworCX0KKwlocHRlWzFdID0gcHRlbDsKKwllaWVpbygpOworCWhwdGVbMF0gPSBwdGVoOworCWFzbSB2b2xhdGlsZSgicHRlc3luYyIgOiA6IDogIm1lbW9yeSIpOworCWF0b21pY19pbmMoJmt2bS0+YXJjaC5yYW1fcGdpbmZvW2xwbl0ucmVmY250KTsKKwl2Y3B1LT5hcmNoLmdwcls0XSA9IHB0ZV9pbmRleCArIGk7CisJcmV0dXJuIEhfU1VDQ0VTUzsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY29tcHV0ZV90bGJpZV9yYih1bnNpZ25lZCBsb25nIHYsIHVuc2lnbmVkIGxvbmcgciwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHB0ZV9pbmRleCkKK3sKKwl1bnNpZ25lZCBsb25nIHJiLCB2YV9sb3c7CisKKwlyYiA9ICh2ICYgfjB4N2ZVTCkgPDwgMTY7CQkvKiBBVkEgZmllbGQgKi8KKwl2YV9sb3cgPSBwdGVfaW5kZXggPj4gMzsKKwlpZiAodiAmIEhQVEVfVl9TRUNPTkRBUlkpCisJCXZhX2xvdyA9IH52YV9sb3c7CisJLyogeG9yIHZzaWQgZnJvbSBBVkEgKi8KKwlpZiAoISh2ICYgSFBURV9WXzFUQl9TRUcpKQorCQl2YV9sb3cgXj0gdiA+PiAxMjsKKwllbHNlCisJCXZhX2xvdyBePSB2ID4+IDI0OworCXZhX2xvdyAmPSAweDdmZjsKKwlpZiAodiAmIEhQVEVfVl9MQVJHRSkgeworCQlyYiB8PSAxOwkJCS8qIEwgZmllbGQgKi8KKwkJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FSQ0hfMjA2KSAmJgorCQkgICAgKHIgJiAweGZmMDAwKSkgeworCQkJLyogbm9uLTE2TUIgbGFyZ2UgcGFnZSwgbXVzdCBiZSA2NGsgKi8KKwkJCS8qIChtYXNrcyBkZXBlbmQgb24gcGFnZSBzaXplKSAqLworCQkJcmIgfD0gMHgxMDAwOwkJLyogcGFnZSBlbmNvZGluZyBpbiBMUCBmaWVsZCAqLworCQkJcmIgfD0gKHZhX2xvdyAmIDB4N2YpIDw8IDE2OyAvKiA3YiBvZiBWQSBpbiBBVkEvTFAgZmllbGQgKi8KKwkJCXJiIHw9ICh2YV9sb3cgJiAweGZlKTsJLyogQVZBTCBmaWVsZCAoUDcgZG9lc24ndCBzZWVtIHRvIGNhcmUpICovCisJCX0KKwl9IGVsc2UgeworCQkvKiA0a0IgcGFnZSAqLworCQlyYiB8PSAodmFfbG93ICYgMHg3ZmYpIDw8IDEyOwkvKiByZW1haW5pbmcgMTFiIG9mIFZBICovCisJfQorCXJiIHw9ICh2ID4+IDU0KSAmIDB4MzAwOwkJLyogQiBmaWVsZCAqLworCXJldHVybiByYjsKK30KKworI2RlZmluZSBMT0NLX1RPS0VOCSgqKHUzMiAqKSgmZ2V0X3BhY2EoKS0+bG9ja190b2tlbikpCisKK3N0YXRpYyBpbmxpbmUgaW50IHRyeV9sb2NrX3RsYmllKHVuc2lnbmVkIGludCAqbG9jaykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wLCBvbGQ7CisJdW5zaWduZWQgaW50IHRva2VuID0gTE9DS19UT0tFTjsKKworCWFzbSB2b2xhdGlsZSgiMTpsd2FyeAklMSwwLCUyXG4iCisJCSAgICAgIgljbXB3aQljcjAsJTEsMFxuIgorCQkgICAgICIJYm5lCTJmXG4iCisJCSAgICAgIiAgc3R3Y3guCSUzLDAsJTJcbiIKKwkJICAgICAiCWJuZS0JMWJcbiIKKwkJICAgICAiICBpc3luY1xuIgorCQkgICAgICIyOiIKKwkJICAgICA6ICI9JnIiICh0bXApLCAiPSZyIiAob2xkKQorCQkgICAgIDogInIiIChsb2NrKSwgInIiICh0b2tlbikKKwkJICAgICA6ICJjYyIsICJtZW1vcnkiKTsKKwlyZXR1cm4gb2xkID09IDA7Cit9CisKK2xvbmcga3ZtcHBjX2hfcmVtb3ZlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJICAgICB1bnNpZ25lZCBsb25nIHB0ZV9pbmRleCwgdW5zaWduZWQgbG9uZyBhdnBuLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgdmEpCit7CisJc3RydWN0IGt2bSAqa3ZtID0gdmNwdS0+a3ZtOworCXVuc2lnbmVkIGxvbmcgKmhwdGU7CisJdW5zaWduZWQgbG9uZyB2LCByLCByYjsKKworCWlmIChwdGVfaW5kZXggPj0gKEhQVF9OUFRFRyA8PCAzKSkKKwkJcmV0dXJuIEhfUEFSQU1FVEVSOworCWhwdGUgPSAodW5zaWduZWQgbG9uZyAqKShrdm0tPmFyY2guaHB0X3ZpcnQgKyAocHRlX2luZGV4IDw8IDQpKTsKKwl3aGlsZSAoIWxvY2tfaHB0ZShocHRlLCBIUFRFX1ZfSFZMT0NLKSkKKwkJY3B1X3JlbGF4KCk7CisJaWYgKChocHRlWzBdICYgSFBURV9WX1ZBTElEKSA9PSAwIHx8CisJICAgICgoZmxhZ3MgJiBIX0FWUE4pICYmIChocHRlWzBdICYgfjB4N2ZVTCkgIT0gYXZwbikgfHwKKwkgICAgKChmbGFncyAmIEhfQU5EQ09ORCkgJiYgKGhwdGVbMF0gJiBhdnBuKSAhPSAwKSkgeworCQlocHRlWzBdICY9IH5IUFRFX1ZfSFZMT0NLOworCQlyZXR1cm4gSF9OT1RfRk9VTkQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgma3ZtLT5vbmxpbmVfdmNwdXMpID09IDEpCisJCWZsYWdzIHw9IEhfTE9DQUw7CisJdmNwdS0+YXJjaC5ncHJbNF0gPSB2ID0gaHB0ZVswXSAmIH5IUFRFX1ZfSFZMT0NLOworCXZjcHUtPmFyY2guZ3ByWzVdID0gciA9IGhwdGVbMV07CisJcmIgPSBjb21wdXRlX3RsYmllX3JiKHYsIHIsIHB0ZV9pbmRleCk7CisJaHB0ZVswXSA9IDA7CisJaWYgKCEoZmxhZ3MgJiBIX0xPQ0FMKSkgeworCQl3aGlsZSghdHJ5X2xvY2tfdGxiaWUoJmt2bS0+YXJjaC50bGJpZV9sb2NrKSkKKwkJCWNwdV9yZWxheCgpOworCQlhc20gdm9sYXRpbGUoInB0ZXN5bmMiIDogOiA6ICJtZW1vcnkiKTsKKwkJYXNtIHZvbGF0aWxlKFBQQ19UTEJJRSglMSwlMCkiOyBlaWVpbzsgdGxic3luYyIKKwkJCSAgICAgOiA6ICJyIiAocmIpLCAiciIgKGt2bS0+YXJjaC5scGlkKSk7CisJCWFzbSB2b2xhdGlsZSgicHRlc3luYyIgOiA6IDogIm1lbW9yeSIpOworCQlrdm0tPmFyY2gudGxiaWVfbG9jayA9IDA7CisJfSBlbHNlIHsKKwkJYXNtIHZvbGF0aWxlKCJwdGVzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJCWFzbSB2b2xhdGlsZSgidGxiaWVsICUwIiA6IDogInIiIChyYikpOworCQlhc20gdm9sYXRpbGUoInB0ZXN5bmMiIDogOiA6ICJtZW1vcnkiKTsKKwl9CisJcmV0dXJuIEhfU1VDQ0VTUzsKK30KKworbG9uZyBrdm1wcGNfaF9idWxrX3JlbW92ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bSAqa3ZtID0gdmNwdS0+a3ZtOworCXVuc2lnbmVkIGxvbmcgKmFyZ3MgPSAmdmNwdS0+YXJjaC5ncHJbNF07CisJdW5zaWduZWQgbG9uZyAqaHAsIHRsYnJiWzRdOworCWxvbmcgaW50IGksIGZvdW5kOworCWxvbmcgaW50IG5faW52YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHJlcSwgcHRlX2luZGV4OworCWxvbmcgaW50IGxvY2FsID0gMDsKKwlsb25nIGludCByZXQgPSBIX1NVQ0NFU1M7CisKKwlpZiAoYXRvbWljX3JlYWQoJmt2bS0+b25saW5lX3ZjcHVzKSA9PSAxKQorCQlsb2NhbCA9IDE7CisJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQlwdGVfaW5kZXggPSBhcmdzW2kgKiAyXTsKKwkJZmxhZ3MgPSBwdGVfaW5kZXggPj4gNTY7CisJCXB0ZV9pbmRleCAmPSAoKDF1bCA8PCA1NikgLSAxKTsKKwkJcmVxID0gZmxhZ3MgPj4gNjsKKwkJZmxhZ3MgJj0gMzsKKwkJaWYgKHJlcSA9PSAzKQorCQkJYnJlYWs7CisJCWlmIChyZXEgIT0gMSB8fCBmbGFncyA9PSAzIHx8CisJCSAgICBwdGVfaW5kZXggPj0gKEhQVF9OUFRFRyA8PCAzKSkgeworCQkJLyogcGFyYW1ldGVyIGVycm9yICovCisJCQlhcmdzW2kgKiAyXSA9ICgoMHhhMCB8IGZsYWdzKSA8PCA1NikgKyBwdGVfaW5kZXg7CisJCQlyZXQgPSBIX1BBUkFNRVRFUjsKKwkJCWJyZWFrOworCQl9CisJCWhwID0gKHVuc2lnbmVkIGxvbmcgKikoa3ZtLT5hcmNoLmhwdF92aXJ0ICsgKHB0ZV9pbmRleCA8PCA0KSk7CisJCXdoaWxlICghbG9ja19ocHRlKGhwLCBIUFRFX1ZfSFZMT0NLKSkKKwkJCWNwdV9yZWxheCgpOworCQlmb3VuZCA9IDA7CisJCWlmIChocFswXSAmIEhQVEVfVl9WQUxJRCkgeworCQkJc3dpdGNoIChmbGFncyAmIDMpIHsKKwkJCWNhc2UgMDoJCS8qIGFic29sdXRlICovCisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgkJLyogYW5kY29uZCAqLworCQkJCWlmICghKGhwWzBdICYgYXJnc1tpICogMiArIDFdKSkKKwkJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgkJLyogQVZQTiAqLworCQkJCWlmICgoaHBbMF0gJiB+MHg3ZlVMKSA9PSBhcmdzW2kgKiAyICsgMV0pCisJCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kKSB7CisJCQlocFswXSAmPSB+SFBURV9WX0hWTE9DSzsKKwkJCWFyZ3NbaSAqIDJdID0gKCgweDkwIHwgZmxhZ3MpIDw8IDU2KSArIHB0ZV9pbmRleDsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIGluc2VydCBSIGFuZCBDIGJpdHMgZnJvbSBQVEUgKi8KKwkJZmxhZ3MgfD0gKGhwWzFdID4+IDUpICYgMHgwYzsKKwkJYXJnc1tpICogMl0gPSAoKDB4ODAgfCBmbGFncykgPDwgNTYpICsgcHRlX2luZGV4OworCQl0bGJyYltuX2ludmFsKytdID0gY29tcHV0ZV90bGJpZV9yYihocFswXSwgaHBbMV0sIHB0ZV9pbmRleCk7CisJCWhwWzBdID0gMDsKKwl9CisJaWYgKG5faW52YWwgPT0gMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghbG9jYWwpIHsKKwkJd2hpbGUoIXRyeV9sb2NrX3RsYmllKCZrdm0tPmFyY2gudGxiaWVfbG9jaykpCisJCQljcHVfcmVsYXgoKTsKKwkJYXNtIHZvbGF0aWxlKCJwdGVzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJCWZvciAoaSA9IDA7IGkgPCBuX2ludmFsOyArK2kpCisJCQlhc20gdm9sYXRpbGUoUFBDX1RMQklFKCUxLCUwKQorCQkJCSAgICAgOiA6ICJyIiAodGxicmJbaV0pLCAiciIgKGt2bS0+YXJjaC5scGlkKSk7CisJCWFzbSB2b2xhdGlsZSgiZWllaW87IHRsYnN5bmM7IHB0ZXN5bmMiIDogOiA6ICJtZW1vcnkiKTsKKwkJa3ZtLT5hcmNoLnRsYmllX2xvY2sgPSAwOworCX0gZWxzZSB7CisJCWFzbSB2b2xhdGlsZSgicHRlc3luYyIgOiA6IDogIm1lbW9yeSIpOworCQlmb3IgKGkgPSAwOyBpIDwgbl9pbnZhbDsgKytpKQorCQkJYXNtIHZvbGF0aWxlKCJ0bGJpZWwgJTAiIDogOiAiciIgKHRsYnJiW2ldKSk7CisJCWFzbSB2b2xhdGlsZSgicHRlc3luYyIgOiA6IDogIm1lbW9yeSIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitsb25nIGt2bXBwY19oX3Byb3RlY3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHB0ZV9pbmRleCwgdW5zaWduZWQgbG9uZyBhdnBuLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHZhKQoreworCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtPmt2bTsKKwl1bnNpZ25lZCBsb25nICpocHRlOworCXVuc2lnbmVkIGxvbmcgdiwgciwgcmI7CisKKwlpZiAocHRlX2luZGV4ID49IChIUFRfTlBURUcgPDwgMykpCisJCXJldHVybiBIX1BBUkFNRVRFUjsKKwlocHRlID0gKHVuc2lnbmVkIGxvbmcgKikoa3ZtLT5hcmNoLmhwdF92aXJ0ICsgKHB0ZV9pbmRleCA8PCA0KSk7CisJd2hpbGUgKCFsb2NrX2hwdGUoaHB0ZSwgSFBURV9WX0hWTE9DSykpCisJCWNwdV9yZWxheCgpOworCWlmICgoaHB0ZVswXSAmIEhQVEVfVl9WQUxJRCkgPT0gMCB8fAorCSAgICAoKGZsYWdzICYgSF9BVlBOKSAmJiAoaHB0ZVswXSAmIH4weDdmVUwpICE9IGF2cG4pKSB7CisJCWhwdGVbMF0gJj0gfkhQVEVfVl9IVkxPQ0s7CisJCXJldHVybiBIX05PVF9GT1VORDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZrdm0tPm9ubGluZV92Y3B1cykgPT0gMSkKKwkJZmxhZ3MgfD0gSF9MT0NBTDsKKwl2ID0gaHB0ZVswXTsKKwlyID0gaHB0ZVsxXSAmIH4oSFBURV9SX1BQMCB8IEhQVEVfUl9QUCB8IEhQVEVfUl9OIHwKKwkJCUhQVEVfUl9LRVlfSEkgfCBIUFRFX1JfS0VZX0xPKTsKKwlyIHw9IChmbGFncyA8PCA1NSkgJiBIUFRFX1JfUFAwOworCXIgfD0gKGZsYWdzIDw8IDQ4KSAmIEhQVEVfUl9LRVlfSEk7CisJciB8PSBmbGFncyAmIChIUFRFX1JfUFAgfCBIUFRFX1JfTiB8IEhQVEVfUl9LRVlfTE8pOworCXJiID0gY29tcHV0ZV90bGJpZV9yYih2LCByLCBwdGVfaW5kZXgpOworCWhwdGVbMF0gPSB2ICYgfkhQVEVfVl9WQUxJRDsKKwlpZiAoIShmbGFncyAmIEhfTE9DQUwpKSB7CisJCXdoaWxlKCF0cnlfbG9ja190bGJpZSgma3ZtLT5hcmNoLnRsYmllX2xvY2spKQorCQkJY3B1X3JlbGF4KCk7CisJCWFzbSB2b2xhdGlsZSgicHRlc3luYyIgOiA6IDogIm1lbW9yeSIpOworCQlhc20gdm9sYXRpbGUoUFBDX1RMQklFKCUxLCUwKSI7IGVpZWlvOyB0bGJzeW5jIgorCQkJICAgICA6IDogInIiIChyYiksICJyIiAoa3ZtLT5hcmNoLmxwaWQpKTsKKwkJYXNtIHZvbGF0aWxlKCJwdGVzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJCWt2bS0+YXJjaC50bGJpZV9sb2NrID0gMDsKKwl9IGVsc2UgeworCQlhc20gdm9sYXRpbGUoInB0ZXN5bmMiIDogOiA6ICJtZW1vcnkiKTsKKwkJYXNtIHZvbGF0aWxlKCJ0bGJpZWwgJTAiIDogOiAiciIgKHJiKSk7CisJCWFzbSB2b2xhdGlsZSgicHRlc3luYyIgOiA6IDogIm1lbW9yeSIpOworCX0KKwlocHRlWzFdID0gcjsKKwllaWVpbygpOworCWhwdGVbMF0gPSB2ICYgfkhQVEVfVl9IVkxPQ0s7CisJYXNtIHZvbGF0aWxlKCJwdGVzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJcmV0dXJuIEhfU1VDQ0VTUzsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmV2ZXJzZV94bGF0ZShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgcmVhbGFkZHIpCit7CisJbG9uZyBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgcnBuOworCisJb2Zmc2V0ID0gcmVhbGFkZHIgJiAoa3ZtLT5hcmNoLnJhbV9wc2l6ZSAtIDEpOworCXJwbiA9IChyZWFsYWRkciAtIG9mZnNldCkgPj4gUEFHRV9TSElGVDsKKwlmb3IgKGkgPSAwOyBpIDwga3ZtLT5hcmNoLnJhbV9ucGFnZXM7ICsraSkKKwkJaWYgKHJwbiA9PSBrdm0tPmFyY2gucmFtX3BnaW5mb1tpXS5wZm4pCisJCQlyZXR1cm4gKGkgPDwgUEFHRV9TSElGVCkgKyBvZmZzZXQ7CisJcmV0dXJuIEhQVEVfUl9SUE47CS8qIGFsbCAxcyBpbiB0aGUgUlBOIGZpZWxkICovCit9CisKK2xvbmcga3ZtcHBjX2hfcmVhZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCSAgIHVuc2lnbmVkIGxvbmcgcHRlX2luZGV4KQoreworCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtPmt2bTsKKwl1bnNpZ25lZCBsb25nICpocHRlLCByOworCWludCBpLCBuID0gMTsKKworCWlmIChwdGVfaW5kZXggPj0gKEhQVF9OUFRFRyA8PCAzKSkKKwkJcmV0dXJuIEhfUEFSQU1FVEVSOworCWlmIChmbGFncyAmIEhfUkVBRF80KSB7CisJCXB0ZV9pbmRleCAmPSB+MzsKKwkJbiA9IDQ7CisJfQorCWZvciAoaSA9IDA7IGkgPCBuOyArK2ksICsrcHRlX2luZGV4KSB7CisJCWhwdGUgPSAodW5zaWduZWQgbG9uZyAqKShrdm0tPmFyY2guaHB0X3ZpcnQgKyAocHRlX2luZGV4IDw8IDQpKTsKKwkJciA9IGhwdGVbMV07CisJCWlmICgoZmxhZ3MgJiBIX1JfWExBVEUpICYmIChocHRlWzBdICYgSFBURV9WX1ZBTElEKSkKKwkJCXIgPSByZXZlcnNlX3hsYXRlKGt2bSwgciAmIEhQVEVfUl9SUE4pIHwKKwkJCQkociAmIH5IUFRFX1JfUlBOKTsKKwkJdmNwdS0+YXJjaC5ncHJbNCArIGkgKiAyXSA9IGhwdGVbMF07CisJCXZjcHUtPmFyY2guZ3ByWzUgKyBpICogMl0gPSByOworCX0KKwlyZXR1cm4gSF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZDMzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKQEAgLTAsMCArMSwxMzQ1IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IDIwMTEgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3JwLiA8cGF1bHVzQGF1MS5pYm0uY29tPgorICoKKyAqIERlcml2ZWQgZnJvbSBib29rM3Nfcm1oYW5kbGVycy5TIGFuZCBvdGhlciBmaWxlcywgd2hpY2ggYXJlOgorICoKKyAqIENvcHlyaWdodCBTVVNFIExpbnV4IFByb2R1Y3RzIEdtYkggMjAwOQorICoKKyAqIEF1dGhvcnM6IEFsZXhhbmRlciBHcmFmIDxhZ3JhZkBzdXNlLmRlPgorICovCisKKyNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9rdm1fYXNtLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbi02NHMuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICBSZWFsIE1vZGUgaGFuZGxlcnMgdGhhdCBuZWVkIHRvIGJlIGluIHRoZSBsaW5lYXIgbWFwcGluZyAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS5nbG9ibAlrdm1wcGNfc2tpcF9pbnRlcnJ1cHQKK2t2bXBwY19za2lwX2ludGVycnVwdDoKKwltZnNwcglyMTMsU1BSTl9TUlIwCisJYWRkaQlyMTMscjEzLDQKKwltdHNwcglTUFJOX1NSUjAscjEzCisJR0VUX1NDUkFUQ0gwKHIxMykKKwlyZmlkCisJYgkuCisKKwkuZ2xvYmwJa3ZtcHBjX3NraXBfSGludGVycnVwdAora3ZtcHBjX3NraXBfSGludGVycnVwdDoKKwltZnNwcglyMTMsU1BSTl9IU1JSMAorCWFkZGkJcjEzLHIxMyw0CisJbXRzcHIJU1BSTl9IU1JSMCxyMTMKKwlHRVRfU0NSQVRDSDAocjEzKQorCWhyZmlkCisJYgkuCisKKy8qCisgKiBDYWxsIGt2bXBwY19oYW5kbGVyX3RyYW1wb2xpbmVfZW50ZXIgaW4gcmVhbCBtb2RlLgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGhhcmQtZGlzYWJsZWQuCisgKgorICogSW5wdXQgUmVnaXN0ZXJzOgorICoKKyAqIExSID0gcmV0dXJuIGFkZHJlc3MgdG8gY29udGludWUgYXQgYWZ0ZXIgZXZlbnR1YWxseSByZS1lbmFibGluZyBNTVUKKyAqLworX0dMT0JBTChrdm1wcGNfaHZfZW50cnlfdHJhbXBvbGluZSkKKwltZm1zcglyMTAKKwlMT0FEX1JFR19BRERSKHI1LCBrdm1wcGNfaHZfZW50cnkpCisJbGkJcjAsTVNSX1JJCisJYW5kYwlyMCxyMTAscjAKKwlsaQlyNixNU1JfSVIgfCBNU1JfRFIKKwlhbmRjCXI2LHIxMCxyNgorCW10bXNyZAlyMCwxCQkvKiBjbGVhciBSSSBpbiBNU1IgKi8KKwltdHNycjAJcjUKKwltdHNycjEJcjYKKwlSRkkKKworI2RlZmluZSBVTE9OR19TSVpFIAkJOAorI2RlZmluZSBWQ1BVX0dQUihuKQkJKFZDUFVfR1BSUyArIChuICogVUxPTkdfU0laRSkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5IGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBYSUNTX1hJUlIJCTQKKyNkZWZpbmUgWElDU19RSVJSCQkweGMKKworLyoKKyAqIFdlIGNvbWUgaW4gaGVyZSB3aGVuIHdha2VuZWQgZnJvbSBuYXAgbW9kZSBvbiBhIHNlY29uZGFyeSBodyB0aHJlYWQuCisgKiBSZWxvY2F0aW9uIGlzIG9mZiBhbmQgbW9zdCByZWdpc3RlciB2YWx1ZXMgYXJlIGxvc3QuCisgKiByMTMgcG9pbnRzIHRvIHRoZSBQQUNBLgorICovCisJLmdsb2JsCWt2bV9zdGFydF9ndWVzdAora3ZtX3N0YXJ0X2d1ZXN0OgorCWxkCXIxLFBBQ0FFTUVSR1NQKHIxMykKKwlzdWJpCXIxLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisKKwkvKiBnZXQgdmNwdSBwb2ludGVyICovCisJbGQJcjQsIEhTVEFURV9LVk1fVkNQVShyMTMpCisKKwkvKiBXZSBnb3QgaGVyZSB3aXRoIGFuIElQSTsgY2xlYXIgaXQgKi8KKwlsZAlyNSwgSFNUQVRFX1hJQ1NfUEhZUyhyMTMpCisJbGkJcjAsIDB4ZmYKKwlsaQlyNiwgWElDU19RSVJSCisJbGkJcjcsIFhJQ1NfWElSUgorCWx3emNpeAlyOCwgcjUsIHI3CQkvKiBhY2sgdGhlIGludGVycnVwdCAqLworCXN5bmMKKwlzdGJjaXgJcjAsIHI1LCByNgkJLyogY2xlYXIgaXQgKi8KKwlzdHdjaXgJcjgsIHI1LCByNwkJLyogRU9JIGl0ICovCisKKy5nbG9iYWwga3ZtcHBjX2h2X2VudHJ5Citrdm1wcGNfaHZfZW50cnk6CisKKwkvKiBSZXF1aXJlZCBzdGF0ZToKKwkgKgorCSAqIFI0ID0gdmNwdSBwb2ludGVyCisJICogTVNSID0gfklSfERSCisJICogUjEzID0gUEFDQQorCSAqIFIxID0gaG9zdCBSMQorCSAqIGFsbCBvdGhlciB2b2xhdGlsZSBHUFJTID0gZnJlZQorCSAqLworCW1mbHIJcjAKKwlzdGQJcjAsIEhTVEFURV9WTUhBTkRMRVIocjEzKQorCisJbGQJcjE0LCBWQ1BVX0dQUihyMTQpKHI0KQorCWxkCXIxNSwgVkNQVV9HUFIocjE1KShyNCkKKwlsZAlyMTYsIFZDUFVfR1BSKHIxNikocjQpCisJbGQJcjE3LCBWQ1BVX0dQUihyMTcpKHI0KQorCWxkCXIxOCwgVkNQVV9HUFIocjE4KShyNCkKKwlsZAlyMTksIFZDUFVfR1BSKHIxOSkocjQpCisJbGQJcjIwLCBWQ1BVX0dQUihyMjApKHI0KQorCWxkCXIyMSwgVkNQVV9HUFIocjIxKShyNCkKKwlsZAlyMjIsIFZDUFVfR1BSKHIyMikocjQpCisJbGQJcjIzLCBWQ1BVX0dQUihyMjMpKHI0KQorCWxkCXIyNCwgVkNQVV9HUFIocjI0KShyNCkKKwlsZAlyMjUsIFZDUFVfR1BSKHIyNSkocjQpCisJbGQJcjI2LCBWQ1BVX0dQUihyMjYpKHI0KQorCWxkCXIyNywgVkNQVV9HUFIocjI3KShyNCkKKwlsZAlyMjgsIFZDUFVfR1BSKHIyOCkocjQpCisJbGQJcjI5LCBWQ1BVX0dQUihyMjkpKHI0KQorCWxkCXIzMCwgVkNQVV9HUFIocjMwKShyNCkKKwlsZAlyMzEsIFZDUFVfR1BSKHIzMSkocjQpCisKKwkvKiBMb2FkIGd1ZXN0IFBNVSByZWdpc3RlcnMgKi8KKwkvKiBSNCBpcyBsaXZlIGhlcmUgKHZjcHUgcG9pbnRlcikgKi8KKwlsaQlyMywgMQorCXNsZGkJcjMsIHIzLCAzMQkJLyogTU1DUjBfRkMgKGZyZWV6ZSBjb3VudGVycykgYml0ICovCisJbXRzcHIJU1BSTl9NTUNSMCwgcjMJCS8qIGZyZWV6ZSBhbGwgY291bnRlcnMsIGRpc2FibGUgaW50cyAqLworCWlzeW5jCisJbHd6CXIzLCBWQ1BVX1BNQyhyNCkJLyogYWx3YXlzIGxvYWQgdXAgZ3Vlc3QgUE1VIHJlZ2lzdGVycyAqLworCWx3eglyNSwgVkNQVV9QTUMgKyA0KHI0KQkvKiB0byBwcmV2ZW50IGluZm9ybWF0aW9uIGxlYWsgKi8KKwlsd3oJcjYsIFZDUFVfUE1DICsgOChyNCkKKwlsd3oJcjcsIFZDUFVfUE1DICsgMTIocjQpCisJbHd6CXI4LCBWQ1BVX1BNQyArIDE2KHI0KQorCWx3eglyOSwgVkNQVV9QTUMgKyAyMChyNCkKK0JFR0lOX0ZUUl9TRUNUSU9OCisJbHd6CXIxMCwgVkNQVV9QTUMgKyAyNChyNCkKKwlsd3oJcjExLCBWQ1BVX1BNQyArIDI4KHI0KQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDEpCisJbXRzcHIJU1BSTl9QTUMxLCByMworCW10c3ByCVNQUk5fUE1DMiwgcjUKKwltdHNwcglTUFJOX1BNQzMsIHI2CisJbXRzcHIJU1BSTl9QTUM0LCByNworCW10c3ByCVNQUk5fUE1DNSwgcjgKKwltdHNwcglTUFJOX1BNQzYsIHI5CitCRUdJTl9GVFJfU0VDVElPTgorCW10c3ByCVNQUk5fUE1DNywgcjEwCisJbXRzcHIJU1BSTl9QTUM4LCByMTEKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjAxKQorCWxkCXIzLCBWQ1BVX01NQ1IocjQpCisJbGQJcjUsIFZDUFVfTU1DUiArIDgocjQpCisJbGQJcjYsIFZDUFVfTU1DUiArIDE2KHI0KQorCW10c3ByCVNQUk5fTU1DUjEsIHI1CisJbXRzcHIJU1BSTl9NTUNSQSwgcjYKKwltdHNwcglTUFJOX01NQ1IwLCByMworCWlzeW5jCisKKwkvKiBMb2FkIHVwIEZQLCBWTVggYW5kIFZTWCByZWdpc3RlcnMgKi8KKwlibAlrdm1wcGNfbG9hZF9mcAorCitCRUdJTl9GVFJfU0VDVElPTgorCS8qIFN3aXRjaCBEU0NSIHRvIGd1ZXN0IHZhbHVlICovCisJbGQJcjUsIFZDUFVfRFNDUihyNCkKKwltdHNwcglTUFJOX0RTQ1IsIHI1CitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKKworCS8qCisJICogU2V0IHRoZSBkZWNyZW1lbnRlciB0byB0aGUgZ3Vlc3QgZGVjcmVtZW50ZXIuCisJICovCisJbGQJcjgsVkNQVV9ERUNfRVhQSVJFUyhyNCkKKwltZnRiCXI3CisJc3ViZglyMyxyNyxyOAorCW10c3ByCVNQUk5fREVDLHIzCisJc3R3CXIzLFZDUFVfREVDKHI0KQorCisJbGQJcjUsIFZDUFVfU1BSRzAocjQpCisJbGQJcjYsIFZDUFVfU1BSRzEocjQpCisJbGQJcjcsIFZDUFVfU1BSRzIocjQpCisJbGQJcjgsIFZDUFVfU1BSRzMocjQpCisJbXRzcHIJU1BSTl9TUFJHMCwgcjUKKwltdHNwcglTUFJOX1NQUkcxLCByNgorCW10c3ByCVNQUk5fU1BSRzIsIHI3CisJbXRzcHIJU1BSTl9TUFJHMywgcjgKKworCS8qIFNhdmUgUjEgaW4gdGhlIFBBQ0EgKi8KKwlzdGQJcjEsIEhTVEFURV9IT1NUX1IxKHIxMykKKworCS8qIEluY3JlbWVudCB5aWVsZCBjb3VudCBpZiB0aGV5IGhhdmUgYSBWUEEgKi8KKwlsZAlyMywgVkNQVV9WUEEocjQpCisJY21wZGkJcjMsIDAKKwliZXEJMjVmCisJbHd6CXI1LCBMUFBBQ0FfWUlFTERDT1VOVChyMykKKwlhZGRpCXI1LCByNSwgMQorCXN0dwlyNSwgTFBQQUNBX1lJRUxEQ09VTlQocjMpCisyNToKKwkvKiBMb2FkIHVwIERBUiBhbmQgRFNJU1IgKi8KKwlsZAlyNSwgVkNQVV9EQVIocjQpCisJbHd6CXI2LCBWQ1BVX0RTSVNSKHI0KQorCW10c3ByCVNQUk5fREFSLCByNQorCW10c3ByCVNQUk5fRFNJU1IsIHI2CisKKwkvKiBTZXQgcGFydGl0aW9uIERBQlIgKi8KKwlsaQlyNSwzCisJbGQJcjYsVkNQVV9EQUJSKHI0KQorCW10c3ByCVNQUk5fREFCUlgscjUKKwltdHNwcglTUFJOX0RBQlIscjYKKworQkVHSU5fRlRSX1NFQ1RJT04KKwkvKiBSZXN0b3JlIEFNUiBhbmQgVUFNT1IsIHNldCBBTU9SIHRvIGFsbCAxcyAqLworCWxkCXI1LFZDUFVfQU1SKHI0KQorCWxkCXI2LFZDUFVfVUFNT1IocjQpCisJbGkJcjcsLTEKKwltdHNwcglTUFJOX0FNUixyNQorCW10c3ByCVNQUk5fVUFNT1IscjYKKwltdHNwcglTUFJOX0FNT1IscjcKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA2KQorCisJLyogQ2xlYXIgb3V0IFNMQiAqLworCWxpCXI2LDAKKwlzbGJtdGUJcjYscjYKKwlzbGJpYQorCXB0ZXN5bmMKKworQkVHSU5fRlRSX1NFQ1RJT04KKwliCTMwZgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDEpCisJLyoKKwkgKiBQT1dFUjcgaG9zdCAtPiBndWVzdCBwYXJ0aXRpb24gc3dpdGNoIGNvZGUuCisJICogV2UgZG9uJ3QgaGF2ZSB0byBsb2NrIGFnYWluc3QgY29uY3VycmVudCB0bGJpZXMsCisJICogYnV0IHdlIGRvIGhhdmUgdG8gY29vcmRpbmF0ZSBhY3Jvc3MgaGFyZHdhcmUgdGhyZWFkcy4KKwkgKi8KKwkvKiBJbmNyZW1lbnQgZW50cnkgY291bnQgaWZmIGV4aXQgY291bnQgaXMgemVyby4gKi8KKwlsZAlyNSxIU1RBVEVfS1ZNX1ZDT1JFKHIxMykKKwlhZGRpCXI5LHI1LFZDT1JFX0VOVFJZX0VYSVQKKzIxOglsd2FyeAlyMywwLHI5CisJY21wd2kJcjMsMHgxMDAJCS8qIGFueSB0aHJlYWRzIHN0YXJ0aW5nIHRvIGV4aXQ/ICovCisJYmdlCXNlY29uZGFyeV90b29fbGF0ZQkvKiBpZiBzbyB3ZSdyZSB0b28gbGF0ZSB0byB0aGUgcGFydHkgKi8KKwlhZGRpCXIzLHIzLDEKKwlzdHdjeC4JcjMsMCxyOQorCWJuZQkyMWIKKworCS8qIFByaW1hcnkgdGhyZWFkIHN3aXRjaGVzIHRvIGd1ZXN0IHBhcnRpdGlvbi4gKi8KKwlsZAlyOSxWQ1BVX0tWTShyNCkJCS8qIHBvaW50ZXIgdG8gc3RydWN0IGt2bSAqLworCWx3eglyNixWQ1BVX1BUSUQocjQpCisJY21wd2kJcjYsMAorCWJuZQkyMGYKKwlsZAlyNixLVk1fU0RSMShyOSkKKwlsd3oJcjcsS1ZNX0xQSUQocjkpCisJbGkJcjAsTFBJRF9SU1ZECQkvKiBzd2l0Y2ggdG8gcmVzZXJ2ZWQgTFBJRCAqLworCW10c3ByCVNQUk5fTFBJRCxyMAorCXB0ZXN5bmMKKwltdHNwcglTUFJOX1NEUjEscjYJCS8qIHN3aXRjaCB0byBwYXJ0aXRpb24gcGFnZSB0YWJsZSAqLworCW10c3ByCVNQUk5fTFBJRCxyNworCWlzeW5jCisJbGkJcjAsMQorCXN0YglyMCxWQ09SRV9JTl9HVUVTVChyNSkJLyogc2lnbmFsIHNlY29uZGFyaWVzIHRvIGNvbnRpbnVlICovCisJYgkxMGYKKworCS8qIFNlY29uZGFyeSB0aHJlYWRzIHdhaXQgZm9yIHByaW1hcnkgdG8gaGF2ZSBkb25lIHBhcnRpdGlvbiBzd2l0Y2ggKi8KKzIwOglsYnoJcjAsVkNPUkVfSU5fR1VFU1QocjUpCisJY21wd2kJcjAsMAorCWJlcQkyMGIKKworCS8qIFNldCBMUENSLiAgU2V0IHRoZSBNRVIgYml0IGlmIHRoZXJlIGlzIGEgcGVuZGluZyBleHRlcm5hbCBpcnEuICovCisxMDoJbGQJcjgsS1ZNX0xQQ1IocjkpCisJbGQJcjAsVkNQVV9QRU5ESU5HX0VYQyhyNCkKKwlsaQlyNywoMSA8PCBCT09LM1NfSVJRUFJJT19FWFRFUk5BTCkKKwlvcmlzCXI3LHI3LCgxIDw8IEJPT0szU19JUlFQUklPX0VYVEVSTkFMX0xFVkVMKUBoCisJYW5kLglyMCxyMCxyNworCWJlcQkxMWYKKwlvcmkJcjgscjgsTFBDUl9NRVIKKzExOgltdHNwcglTUFJOX0xQQ1IscjgKKwlsZAlyOCxLVk1fUk1PUihyOSkKKwltdHNwcglTUFJOX1JNT1IscjgKKwlpc3luYworCisJLyogQ2hlY2sgaWYgSERFQyBleHBpcmVzIHNvb24gKi8KKwltZnNwcglyMyxTUFJOX0hERUMKKwljbXB3aQlyMywxMAorCWxpCXIxMixCT09LM1NfSU5URVJSVVBUX0hWX0RFQ1JFTUVOVEVSCisJbXIJcjkscjQKKwlibHQJaGRlY19zb29uCisKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIFRMQiBpZiB3ZSBjb3VsZCBwb3NzaWJseSBoYXZlIHN0YWxlIFRMQgorCSAqIGVudHJpZXMgZm9yIHRoaXMgcGFydGl0aW9uIG9uIHRoaXMgY29yZSBkdWUgdG8gdGhlIHVzZQorCSAqIG9mIHRsYmllbC4KKwkgKiBYWFggbWF5YmUgb25seSBuZWVkIHRoaXMgb24gcHJpbWFyeSB0aHJlYWQ/CisJICovCisJbGQJcjksVkNQVV9LVk0ocjQpCQkvKiBwb2ludGVyIHRvIHN0cnVjdCBrdm0gKi8KKwlsd3oJcjUsVkNQVV9WQ1BVSUQocjQpCisJbGh6CXI2LFBBQ0FQQUNBSU5ERVgocjEzKQorCXJsZGltaQlyNixyNSwwLDYyCQkvKiBYWFggbWFwIGFzIGlmIHRocmVhZHMgMToxIHA6diAqLworCWxoeglyOCxWQ1BVX0xBU1RfQ1BVKHI0KQorCXNsZGkJcjcscjYsMQkJCS8qIHNlZSBpZiB0aGlzIGlzIHRoZSBzYW1lIHZjcHUgKi8KKwlhZGQJcjcscjcscjkJCS8qIGFzIGxhc3QgcmFuIG9uIHRoaXMgcGNwdSAqLworCWxoeglyMCxLVk1fTEFTVF9WQ1BVKHI3KQorCWNtcHcJcjYscjgJCQkvKiBvbiB0aGUgc2FtZSBjcHUgY29yZSBhcyBsYXN0IHRpbWU/ICovCisJYm5lCTNmCisJY21wdwlyMCxyNQkJCS8qIHNhbWUgdmNwdSBhcyB0aGlzIGNvcmUgbGFzdCByYW4/ICovCisJYmVxCTFmCiszOglzdGgJcjYsVkNQVV9MQVNUX0NQVShyNCkJLyogaWYgbm90LCBpbnZhbGlkYXRlIHBhcnRpdGlvbiBUTEIgKi8KKwlzdGgJcjUsS1ZNX0xBU1RfVkNQVShyNykKKwlsaQlyNiwxMjgKKwltdGN0cglyNgorCWxpCXI3LDB4ODAwCQkvKiBJUyBmaWVsZCA9IDBiMTAgKi8KKwlwdGVzeW5jCisyOgl0bGJpZWwJcjcKKwlhZGRpCXI3LHI3LDB4MTAwMAorCWJkbnoJMmIKKwlwdGVzeW5jCisxOgorCisJLyogU2F2ZSBwdXJyL3NwdXJyICovCisJbWZzcHIJcjUsU1BSTl9QVVJSCisJbWZzcHIJcjYsU1BSTl9TUFVSUgorCXN0ZAlyNSxIU1RBVEVfUFVSUihyMTMpCisJc3RkCXI2LEhTVEFURV9TUFVSUihyMTMpCisJbGQJcjcsVkNQVV9QVVJSKHI0KQorCWxkCXI4LFZDUFVfU1BVUlIocjQpCisJbXRzcHIJU1BSTl9QVVJSLHI3CisJbXRzcHIJU1BSTl9TUFVSUixyOAorCWIJMzFmCisKKwkvKgorCSAqIFBQQzk3MCBob3N0IC0+IGd1ZXN0IHBhcnRpdGlvbiBzd2l0Y2ggY29kZS4KKwkgKiBXZSBoYXZlIHRvIGxvY2sgYWdhaW5zdCBjb25jdXJyZW50IHRsYmllcywKKwkgKiB1c2luZyBuYXRpdmVfdGxiaWVfbG9jayB0byBsb2NrIGFnYWluc3QgaG9zdCB0bGJpZXMKKwkgKiBhbmQga3ZtLT5hcmNoLnRsYmllX2xvY2sgdG8gbG9jayBhZ2FpbnN0IGd1ZXN0IHRsYmllcy4KKwkgKiBXZSBhbHNvIGhhdmUgdG8gaW52YWxpZGF0ZSB0aGUgVExCIHNpbmNlIGl0cworCSAqIGVudHJpZXMgYXJlbid0IHRhZ2dlZCB3aXRoIHRoZSBMUElELgorCSAqLworMzA6CWxkCXI5LFZDUFVfS1ZNKHI0KQkJLyogcG9pbnRlciB0byBzdHJ1Y3Qga3ZtICovCisKKwkvKiBmaXJzdCB0YWtlIG5hdGl2ZV90bGJpZV9sb2NrICovCisJLnNlY3Rpb24gIi50b2MiLCJhdyIKK3RvY190bGJpZV9sb2NrOgorCS50YwluYXRpdmVfdGxiaWVfbG9ja1tUQ10sbmF0aXZlX3RsYmllX2xvY2sKKwkucHJldmlvdXMKKwlsZAlyMyx0b2NfdGxiaWVfbG9ja0B0b2MoMikKKwlsd3oJcjgsUEFDQV9MT0NLX1RPS0VOKHIxMykKKzI0Oglsd2FyeAlyMCwwLHIzCisJY21wd2kJcjAsMAorCWJuZQkyNGIKKwlzdHdjeC4JcjgsMCxyMworCWJuZQkyNGIKKwlpc3luYworCisJbGQJcjcsS1ZNX0xQQ1IocjkpCQkvKiB1c2Uga3ZtLT5hcmNoLmxwY3IgdG8gc3RvcmUgSElENCAqLworCWxpCXIwLDB4MThmCisJcm90bGRpCXIwLHIwLEhJRDRfTFBJRDVfU0gJLyogYWxsIGxwaWQgYml0cyBpbiBISUQ0ID0gMSAqLworCW9yCXIwLHI3LHIwCisJcHRlc3luYworCXN5bmMKKwltdHNwcglTUFJOX0hJRDQscjAJCS8qIHN3aXRjaCB0byByZXNlcnZlZCBMUElEICovCisJaXN5bmMKKwlsaQlyMCwwCisJc3R3CXIwLDAocjMpCQkvKiBkcm9wIG5hdGl2ZV90bGJpZV9sb2NrICovCisKKwkvKiBpbnZhbGlkYXRlIHRoZSB3aG9sZSBUTEIgKi8KKwlsaQlyMCwyNTYKKwltdGN0cglyMAorCWxpCXI2LDAKKzI1Ogl0bGJpZWwJcjYKKwlhZGRpCXI2LHI2LDB4MTAwMAorCWJkbnoJMjViCisJcHRlc3luYworCisJLyogVGFrZSB0aGUgZ3Vlc3QncyB0bGJpZV9sb2NrICovCisJYWRkaQlyMyxyOSxLVk1fVExCSUVfTE9DSworMjQ6CWx3YXJ4CXIwLDAscjMKKwljbXB3aQlyMCwwCisJYm5lCTI0YgorCXN0d2N4LglyOCwwLHIzCisJYm5lCTI0YgorCWlzeW5jCisJbGQJcjYsS1ZNX1NEUjEocjkpCisJbXRzcHIJU1BSTl9TRFIxLHI2CQkvKiBzd2l0Y2ggdG8gcGFydGl0aW9uIHBhZ2UgdGFibGUgKi8KKworCS8qIFNldCB1cCBISUQ0IHdpdGggdGhlIGd1ZXN0J3MgTFBJRCBldGMuICovCisJc3luYworCW10c3ByCVNQUk5fSElENCxyNworCWlzeW5jCisKKwkvKiBkcm9wIHRoZSBndWVzdCdzIHRsYmllX2xvY2sgKi8KKwlsaQlyMCwwCisJc3R3CXIwLDAocjMpCisKKwkvKiBDaGVjayBpZiBIREVDIGV4cGlyZXMgc29vbiAqLworCW1mc3ByCXIzLFNQUk5fSERFQworCWNtcHdpCXIzLDEwCisJbGkJcjEyLEJPT0szU19JTlRFUlJVUFRfSFZfREVDUkVNRU5URVIKKwltcglyOSxyNAorCWJsdAloZGVjX3Nvb24KKworCS8qIEVuYWJsZSBIREVDIGludGVycnVwdHMgKi8KKwltZnNwcglyMCxTUFJOX0hJRDAKKwlsaQlyMywxCisJcmxkaW1pCXIwLHIzLCBISUQwX0hESUNFX1NILCA2NC1ISUQwX0hESUNFX1NILTEKKwlzeW5jCisJbXRzcHIJU1BSTl9ISUQwLHIwCisJbWZzcHIJcjAsU1BSTl9ISUQwCisJbWZzcHIJcjAsU1BSTl9ISUQwCisJbWZzcHIJcjAsU1BSTl9ISUQwCisJbWZzcHIJcjAsU1BSTl9ISUQwCisJbWZzcHIJcjAsU1BSTl9ISUQwCisJbWZzcHIJcjAsU1BSTl9ISUQwCisKKwkvKiBMb2FkIHVwIGd1ZXN0IFNMQiBlbnRyaWVzICovCiszMToJbHd6CXI1LFZDUFVfU0xCX01BWChyNCkKKwljbXB3aQlyNSwwCisJYmVxCTlmCisJbXRjdHIJcjUKKwlhZGRpCXI2LHI0LFZDUFVfU0xCCisxOglsZAlyOCxWQ1BVX1NMQl9FKHI2KQorCWxkCXI5LFZDUFVfU0xCX1YocjYpCisJc2xibXRlCXI5LHI4CisJYWRkaQlyNixyNixWQ1BVX1NMQl9TSVpFCisJYmRuegkxYgorOToKKworCS8qIFJlc3RvcmUgc3RhdGUgb2YgQ1RSTCBydW4gYml0OyBhc3N1bWUgMSBvbiBlbnRyeSAqLworCWx3eglyNSxWQ1BVX0NUUkwocjQpCisJYW5kaS4JcjUscjUsMQorCWJuZQk0ZgorCW1mc3ByCXI2LFNQUk5fQ1RSTEYKKwljbHJyZGkJcjYscjYsMQorCW10c3ByCVNQUk5fQ1RSTFQscjYKKzQ6CisJbGQJcjYsIFZDUFVfQ1RSKHI0KQorCWx3eglyNywgVkNQVV9YRVIocjQpCisKKwltdGN0cglyNgorCW10eGVyCXI3CisKKwkvKiBNb3ZlIFNSUjAgYW5kIFNSUjEgaW50byB0aGUgcmVzcGVjdGl2ZSByZWdzICovCisJbGQJcjYsIFZDUFVfU1JSMChyNCkKKwlsZAlyNywgVkNQVV9TUlIxKHI0KQorCW10c3ByCVNQUk5fU1JSMCwgcjYKKwltdHNwcglTUFJOX1NSUjEsIHI3CisKKwlsZAlyMTAsIFZDUFVfUEMocjQpCisKKwlsZAlyMTEsIFZDUFVfTVNSKHI0KQkvKiByMTAgPSB2Y3B1LT5hcmNoLm1zciAmIH5NU1JfSFYgKi8KKwlybGRpY2wJcjExLCByMTEsIDYzIC0gTVNSX0hWX0xHLCAxCisJcm90bGRpCXIxMSwgcjExLCAxICsgTVNSX0hWX0xHCisJb3JpCXIxMSwgcjExLCBNU1JfTUUKKworZmFzdF9ndWVzdF9yZXR1cm46CisJbXRzcHIJU1BSTl9IU1JSMCxyMTAKKwltdHNwcglTUFJOX0hTUlIxLHIxMQorCisJLyogQWN0aXZhdGUgZ3Vlc3QgbW9kZSwgc28gZmF1bHRzIGdldCBoYW5kbGVkIGJ5IEtWTSAqLworCWxpCXI5LCBLVk1fR1VFU1RfTU9ERV9HVUVTVAorCXN0YglyOSwgSFNUQVRFX0lOX0dVRVNUKHIxMykKKworCS8qIEVudGVyIGd1ZXN0ICovCisKKwlsZAlyNSwgVkNQVV9MUihyNCkKKwlsd3oJcjYsIFZDUFVfQ1IocjQpCisJbXRscglyNQorCW10Y3IJcjYKKworCWxkCXIwLCBWQ1BVX0dQUihyMCkocjQpCisJbGQJcjEsIFZDUFVfR1BSKHIxKShyNCkKKwlsZAlyMiwgVkNQVV9HUFIocjIpKHI0KQorCWxkCXIzLCBWQ1BVX0dQUihyMykocjQpCisJbGQJcjUsIFZDUFVfR1BSKHI1KShyNCkKKwlsZAlyNiwgVkNQVV9HUFIocjYpKHI0KQorCWxkCXI3LCBWQ1BVX0dQUihyNykocjQpCisJbGQJcjgsIFZDUFVfR1BSKHI4KShyNCkKKwlsZAlyOSwgVkNQVV9HUFIocjkpKHI0KQorCWxkCXIxMCwgVkNQVV9HUFIocjEwKShyNCkKKwlsZAlyMTEsIFZDUFVfR1BSKHIxMSkocjQpCisJbGQJcjEyLCBWQ1BVX0dQUihyMTIpKHI0KQorCWxkCXIxMywgVkNQVV9HUFIocjEzKShyNCkKKworCWxkCXI0LCBWQ1BVX0dQUihyNCkocjQpCisKKwlocmZpZAorCWIJLgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGl0IGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBXZSBjb21lIGhlcmUgZnJvbSB0aGUgZmlyc3QtbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXJzLgorICovCisJLmdsb2JsCWt2bXBwY19pbnRlcnJ1cHQKK2t2bXBwY19pbnRlcnJ1cHQ6CisJLyoKKwkgKiBSZWdpc3RlciBjb250ZW50czoKKwkgKiBSMTIJCT0gaW50ZXJydXB0IHZlY3RvcgorCSAqIFIxMwkJPSBQQUNBCisJICogZ3Vlc3QgQ1IsIFIxMiBzYXZlZCBpbiBzaGFkb3cgVkNQVSBTQ1JBVENIMS8wCisJICogZ3Vlc3QgUjEzIHNhdmVkIGluIFNQUk5fU0NSQVRDSDAKKwkgKi8KKwkvKiBhYnVzZSBob3N0X3IyIGFzIHRoaXJkIHNjcmF0Y2ggYXJlYTsgd2UgZ2V0IHIyIGZyb20gUEFDQVRPQyhyMTMpICovCisJc3RkCXI5LCBIU1RBVEVfSE9TVF9SMihyMTMpCisJbGQJcjksIEhTVEFURV9LVk1fVkNQVShyMTMpCisKKwkvKiBTYXZlIHJlZ2lzdGVycyAqLworCisJc3RkCXIwLCBWQ1BVX0dQUihyMCkocjkpCisJc3RkCXIxLCBWQ1BVX0dQUihyMSkocjkpCisJc3RkCXIyLCBWQ1BVX0dQUihyMikocjkpCisJc3RkCXIzLCBWQ1BVX0dQUihyMykocjkpCisJc3RkCXI0LCBWQ1BVX0dQUihyNCkocjkpCisJc3RkCXI1LCBWQ1BVX0dQUihyNSkocjkpCisJc3RkCXI2LCBWQ1BVX0dQUihyNikocjkpCisJc3RkCXI3LCBWQ1BVX0dQUihyNykocjkpCisJc3RkCXI4LCBWQ1BVX0dQUihyOCkocjkpCisJbGQJcjAsIEhTVEFURV9IT1NUX1IyKHIxMykKKwlzdGQJcjAsIFZDUFVfR1BSKHI5KShyOSkKKwlzdGQJcjEwLCBWQ1BVX0dQUihyMTApKHI5KQorCXN0ZAlyMTEsIFZDUFVfR1BSKHIxMSkocjkpCisJbGQJcjMsIEhTVEFURV9TQ1JBVENIMChyMTMpCisJbHd6CXI0LCBIU1RBVEVfU0NSQVRDSDEocjEzKQorCXN0ZAlyMywgVkNQVV9HUFIocjEyKShyOSkKKwlzdHcJcjQsIFZDUFVfQ1IocjkpCisKKwkvKiBSZXN0b3JlIFIxL1IyIHNvIHdlIGNhbiBoYW5kbGUgZmF1bHRzICovCisJbGQJcjEsIEhTVEFURV9IT1NUX1IxKHIxMykKKwlsZAlyMiwgUEFDQVRPQyhyMTMpCisKKwltZnNwcglyMTAsIFNQUk5fU1JSMAorCW1mc3ByCXIxMSwgU1BSTl9TUlIxCisJc3RkCXIxMCwgVkNQVV9TUlIwKHI5KQorCXN0ZAlyMTEsIFZDUFVfU1JSMShyOSkKKwlhbmRpLglyMCwgcjEyLCAyCQkvKiBuZWVkIHRvIHJlYWQgSFNSUjAvMT8gKi8KKwliZXEJMWYKKwltZnNwcglyMTAsIFNQUk5fSFNSUjAKKwltZnNwcglyMTEsIFNQUk5fSFNSUjEKKwljbHJyZGkJcjEyLCByMTIsIDIKKzE6CXN0ZAlyMTAsIFZDUFVfUEMocjkpCisJc3RkCXIxMSwgVkNQVV9NU1IocjkpCisKKwlHRVRfU0NSQVRDSDAocjMpCisJbWZscglyNAorCXN0ZAlyMywgVkNQVV9HUFIocjEzKShyOSkKKwlzdGQJcjQsIFZDUFVfTFIocjkpCisKKwkvKiBVbnNldCBndWVzdCBtb2RlICovCisJbGkJcjAsIEtWTV9HVUVTVF9NT0RFX05PTkUKKwlzdGIJcjAsIEhTVEFURV9JTl9HVUVTVChyMTMpCisKKwlzdHcJcjEyLFZDUFVfVFJBUChyOSkKKworCS8qIFNlZSBpZiB0aGlzIGlzIGEgbGVmdG92ZXIgSERFQyBpbnRlcnJ1cHQgKi8KKwljbXB3aQlyMTIsQk9PSzNTX0lOVEVSUlVQVF9IVl9ERUNSRU1FTlRFUgorCWJuZQkyZgorCW1mc3ByCXIzLFNQUk5fSERFQworCWNtcHdpCXIzLDAKKwliZ2UJaWdub3JlX2hkZWMKKzI6CisJLyogU2VlIGlmIHRoaXMgaXMgc29tZXRoaW5nIHdlIGNhbiBoYW5kbGUgaW4gcmVhbCBtb2RlICovCisJY21wd2kJcjEyLEJPT0szU19JTlRFUlJVUFRfU1lTQ0FMTAorCWJlcQloY2FsbF90cnlfcmVhbF9tb2RlCitoY2FsbF9yZWFsX2NvbnQ6CisKKwkvKiBDaGVjayBmb3IgbWVkaWF0ZWQgaW50ZXJydXB0cyAoY291bGQgYmUgZG9uZSBlYXJsaWVyIHJlYWxseSAuLi4pICovCitCRUdJTl9GVFJfU0VDVElPTgorCWNtcHdpCXIxMixCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMCisJYm5lKwkxZgorCWxkCXI1LFZDUFVfS1ZNKHI5KQorCWxkCXI1LEtWTV9MUENSKHI1KQorCWFuZGkuCXIwLHIxMSxNU1JfRUUKKwliZXEJMWYKKwlhbmRpLglyMCxyNSxMUENSX01FUgorCWJuZQlib3VuY2VfZXh0X2ludGVycnVwdAorMToKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA2KQorCisJLyogU2F2ZSBERUMgKi8KKwltZnNwcglyNSxTUFJOX0RFQworCW1mdGIJcjYKKwlleHRzdwlyNSxyNQorCWFkZAlyNSxyNSxyNgorCXN0ZAlyNSxWQ1BVX0RFQ19FWFBJUkVTKHI5KQorCisJLyogU2F2ZSBIRUlSIChIViBlbXVsYXRpb24gYXNzaXN0IHJlZykgaW4gbGFzdF9pbnN0CisJICAgaWYgdGhpcyBpcyBhbiBIRUkgKEhWIGVtdWxhdGlvbiBpbnRlcnJ1cHQsIGU0MCkgKi8KKwlsaQlyMywtMQorQkVHSU5fRlRSX1NFQ1RJT04KKwljbXB3aQlyMTIsQk9PSzNTX0lOVEVSUlVQVF9IX0VNVUxfQVNTSVNUCisJYm5lCTExZgorCW1mc3ByCXIzLFNQUk5fSEVJUgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDYpCisxMToJc3R3CXIzLFZDUFVfTEFTVF9JTlNUKHI5KQorCisJLyogU2F2ZSBtb3JlIHJlZ2lzdGVyIHN0YXRlICAqLworCW1meGVyCXI1CisJbWZkYXIJcjYKKwltZmRzaXNyCXI3CisJbWZjdHIJcjgKKworCXN0dwlyNSwgVkNQVV9YRVIocjkpCisJc3RkCXI2LCBWQ1BVX0RBUihyOSkKKwlzdHcJcjcsIFZDUFVfRFNJU1IocjkpCisJc3RkCXI4LCBWQ1BVX0NUUihyOSkKKwkvKiBncmFiIEhEQVIgJiBIRFNJU1IgaWYgSFYgZGF0YSBzdG9yYWdlIGludGVycnVwdCAoSERTSSkgKi8KK0JFR0lOX0ZUUl9TRUNUSU9OCisJY21wd2kJcjEyLEJPT0szU19JTlRFUlJVUFRfSF9EQVRBX1NUT1JBR0UKKwliZXEJNmYKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA2KQorNzoJc3RkCXI2LCBWQ1BVX0ZBVUxUX0RBUihyOSkKKwlzdHcJcjcsIFZDUFVfRkFVTFRfRFNJU1IocjkpCisKKwkvKiBTYXZlIGd1ZXN0IENUUkwgcmVnaXN0ZXIsIHNldCBydW5sYXRjaCB0byAxICovCisJbWZzcHIJcjYsU1BSTl9DVFJMRgorCXN0dwlyNixWQ1BVX0NUUkwocjkpCisJYW5kaS4JcjAscjYsMQorCWJuZQk0ZgorCW9yaQlyNixyNiwxCisJbXRzcHIJU1BSTl9DVFJMVCxyNgorNDoKKwkvKiBSZWFkIHRoZSBndWVzdCBTTEIgYW5kIHNhdmUgaXQgYXdheSAqLworCWx3eglyMCxWQ1BVX1NMQl9OUihyOSkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gU0xCICovCisJbXRjdHIJcjAKKwlsaQlyNiwwCisJYWRkaQlyNyxyOSxWQ1BVX1NMQgorCWxpCXI1LDAKKzE6CXNsYm1mZWUJcjgscjYKKwlhbmRpcy4JcjAscjgsU0xCX0VTSURfVkBoCisJYmVxCTJmCisJYWRkCXI4LHI4LHI2CQkvKiBwdXQgaW5kZXggaW4gKi8KKwlzbGJtZmV2CXIzLHI2CisJc3RkCXI4LFZDUFVfU0xCX0UocjcpCisJc3RkCXIzLFZDUFVfU0xCX1YocjcpCisJYWRkaQlyNyxyNyxWQ1BVX1NMQl9TSVpFCisJYWRkaQlyNSxyNSwxCisyOglhZGRpCXI2LHI2LDEKKwliZG56CTFiCisJc3R3CXI1LFZDUFVfU0xCX01BWChyOSkKKworCS8qCisJICogU2F2ZSB0aGUgZ3Vlc3QgUFVSUi9TUFVSUgorCSAqLworQkVHSU5fRlRSX1NFQ1RJT04KKwltZnNwcglyNSxTUFJOX1BVUlIKKwltZnNwcglyNixTUFJOX1NQVVJSCisJbGQJcjcsVkNQVV9QVVJSKHI5KQorCWxkCXI4LFZDUFVfU1BVUlIocjkpCisJc3RkCXI1LFZDUFVfUFVSUihyOSkKKwlzdGQJcjYsVkNQVV9TUFVSUihyOSkKKwlzdWJmCXI1LHI3LHI1CisJc3ViZglyNixyOCxyNgorCisJLyoKKwkgKiBSZXN0b3JlIGhvc3QgUFVSUi9TUFVSUiBhbmQgYWRkIGd1ZXN0IHRpbWVzCisJICogc28gdGhhdCB0aGUgdGltZSBpbiB0aGUgZ3Vlc3QgZ2V0cyBhY2NvdW50ZWQuCisJICovCisJbGQJcjMsSFNUQVRFX1BVUlIocjEzKQorCWxkCXI0LEhTVEFURV9TUFVSUihyMTMpCisJYWRkCXIzLHIzLHI1CisJYWRkCXI0LHI0LHI2CisJbXRzcHIJU1BSTl9QVVJSLHIzCisJbXRzcHIJU1BSTl9TUFVSUixyNAorRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfQVJDSF8yMDEpCisKKwkvKiBDbGVhciBvdXQgU0xCICovCisJbGkJcjUsMAorCXNsYm10ZQlyNSxyNQorCXNsYmlhCisJcHRlc3luYworCitoZGVjX3Nvb246CitCRUdJTl9GVFJfU0VDVElPTgorCWIJMzJmCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwMSkKKwkvKgorCSAqIFBPV0VSNyBndWVzdCAtPiBob3N0IHBhcnRpdGlvbiBzd2l0Y2ggY29kZS4KKwkgKiBXZSBkb24ndCBoYXZlIHRvIGxvY2sgYWdhaW5zdCB0bGJpZXMgYnV0IHdlIGRvCisJICogaGF2ZSB0byBjb29yZGluYXRlIHRoZSBoYXJkd2FyZSB0aHJlYWRzLgorCSAqLworCS8qIEluY3JlbWVudCB0aGUgdGhyZWFkcy1leGl0aW5nLWd1ZXN0IGNvdW50IGluIHRoZSAweGZmMDAKKwkgICBiaXRzIG9mIHZjb3JlLT5lbnRyeV9leGl0X2NvdW50ICovCisJbHdzeW5jCisJbGQJcjUsSFNUQVRFX0tWTV9WQ09SRShyMTMpCisJYWRkaQlyNixyNSxWQ09SRV9FTlRSWV9FWElUCis0MToJbHdhcngJcjMsMCxyNgorCWFkZGkJcjAscjMsMHgxMDAKKwlzdHdjeC4JcjAsMCxyNgorCWJuZQk0MWIKKworCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFuIGludGVycnVwdCB0aGF0IHdlIGhhdmUgdG8gcGFzcworCSAqIHVwIHRvIHRoZSBrZXJuZWwgb3IgcWVtdTsgd2UgY2FuJ3QgaGFuZGxlIGl0IGluIHJlYWwgbW9kZS4KKwkgKiBUaHVzIHdlIGhhdmUgdG8gZG8gYSBwYXJ0aXRpb24gc3dpdGNoLCBzbyB3ZSBoYXZlIHRvCisJICogY29sbGVjdCB0aGUgb3RoZXIgdGhyZWFkcywgaWYgd2UgYXJlIHRoZSBmaXJzdCB0aHJlYWQKKwkgKiB0byB0YWtlIGFuIGludGVycnVwdC4gIFRvIGRvIHRoaXMsIHdlIHNldCB0aGUgSERFQyB0byAwLAorCSAqIHdoaWNoIGNhdXNlcyBhbiBIREVDIGludGVycnVwdCBpbiBhbGwgdGhyZWFkcyB3aXRoaW4gMm5zCisJICogYmVjYXVzZSB0aGUgSERFQyByZWdpc3RlciBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgNCB0aHJlYWRzLgorCSAqIEhvd2V2ZXIsIHdlIGRvbid0IG5lZWQgdG8gYm90aGVyIGlmIHRoaXMgaXMgYW4gSERFQworCSAqIGludGVycnVwdCwgc2luY2UgdGhlIG90aGVyIHRocmVhZHMgd2lsbCBhbHJlYWR5IGJlIG9uIHRoZWlyCisJICogd2F5IGhlcmUgaW4gdGhhdCBjYXNlLgorCSAqLworCWNtcHdpCXIxMixCT09LM1NfSU5URVJSVVBUX0hWX0RFQ1JFTUVOVEVSCisJYmVxCTQwZgorCWNtcHdpCXIzLDB4MTAwCS8qIEFyZSB3ZSB0aGUgZmlyc3QgaGVyZT8gKi8KKwliZ2UJNDBmCisJY21wd2kJcjMsMQorCWJsZQk0MGYKKwlsaQlyMCwwCisJbXRzcHIJU1BSTl9IREVDLHIwCis0MDoKKworCS8qIFNlY29uZGFyeSB0aHJlYWRzIHdhaXQgZm9yIHByaW1hcnkgdG8gZG8gcGFydGl0aW9uIHN3aXRjaCAqLworCWxkCXI0LFZDUFVfS1ZNKHI5KQkJLyogcG9pbnRlciB0byBzdHJ1Y3Qga3ZtICovCisJbGQJcjUsSFNUQVRFX0tWTV9WQ09SRShyMTMpCisJbHd6CXIzLFZDUFVfUFRJRChyOSkKKwljbXB3aQlyMywwCisJYmVxCTE1ZgorCUhNVF9MT1cKKzEzOglsYnoJcjMsVkNPUkVfSU5fR1VFU1QocjUpCisJY21wd2kJcjMsMAorCWJuZQkxM2IKKwlITVRfTUVESVVNCisJYgkxNmYKKworCS8qIFByaW1hcnkgdGhyZWFkIHdhaXRzIGZvciBhbGwgdGhlIHNlY29uZGFyaWVzIHRvIGV4aXQgZ3Vlc3QgKi8KKzE1Oglsd3oJcjMsVkNPUkVfRU5UUllfRVhJVChyNSkKKwlzcndpCXIwLHIzLDgKKwljbHJsZGkJcjMscjMsNTYKKwljbXB3CXIzLHIwCisJYm5lCTE1YgorCWlzeW5jCisKKwkvKiBQcmltYXJ5IHRocmVhZCBzd2l0Y2hlcyBiYWNrIHRvIGhvc3QgcGFydGl0aW9uICovCisJbGQJcjYsS1ZNX0hPU1RfU0RSMShyNCkKKwlsd3oJcjcsS1ZNX0hPU1RfTFBJRChyNCkKKwlsaQlyOCxMUElEX1JTVkQJCS8qIHN3aXRjaCB0byByZXNlcnZlZCBMUElEICovCisJbXRzcHIJU1BSTl9MUElELHI4CisJcHRlc3luYworCW10c3ByCVNQUk5fU0RSMSxyNgkJLyogc3dpdGNoIHRvIHBhcnRpdGlvbiBwYWdlIHRhYmxlICovCisJbXRzcHIJU1BSTl9MUElELHI3CisJaXN5bmMKKwlsaQlyMCwwCisJc3RiCXIwLFZDT1JFX0lOX0dVRVNUKHI1KQorCWxpcwlyOCwweDdmZmYJCS8qIE1BWF9JTlRAaCAqLworCW10c3ByCVNQUk5fSERFQyxyOAorCisxNjoJbGQJcjgsS1ZNX0hPU1RfTFBDUihyNCkKKwltdHNwcglTUFJOX0xQQ1IscjgKKwlpc3luYworCWIJMzNmCisKKwkvKgorCSAqIFBQQzk3MCBndWVzdCAtPiBob3N0IHBhcnRpdGlvbiBzd2l0Y2ggY29kZS4KKwkgKiBXZSBoYXZlIHRvIGxvY2sgYWdhaW5zdCBjb25jdXJyZW50IHRsYmllcywgYW5kCisJICogd2UgaGF2ZSB0byBmbHVzaCB0aGUgd2hvbGUgVExCLgorCSAqLworMzI6CWxkCXI0LFZDUFVfS1ZNKHI5KQkJLyogcG9pbnRlciB0byBzdHJ1Y3Qga3ZtICovCisKKwkvKiBUYWtlIHRoZSBndWVzdCdzIHRsYmllX2xvY2sgKi8KKwlsd3oJcjgsUEFDQV9MT0NLX1RPS0VOKHIxMykKKwlhZGRpCXIzLHI0LEtWTV9UTEJJRV9MT0NLCisyNDoJbHdhcngJcjAsMCxyMworCWNtcHdpCXIwLDAKKwlibmUJMjRiCisJc3R3Y3guCXI4LDAscjMKKwlibmUJMjRiCisJaXN5bmMKKworCWxkCXI3LEtWTV9IT1NUX0xQQ1IocjQpCS8qIHVzZSBrdm0tPmFyY2guaG9zdF9scGNyIGZvciBISUQ0ICovCisJbGkJcjAsMHgxOGYKKwlyb3RsZGkJcjAscjAsSElENF9MUElENV9TSAkvKiBhbGwgbHBpZCBiaXRzIGluIEhJRDQgPSAxICovCisJb3IJcjAscjcscjAKKwlwdGVzeW5jCisJc3luYworCW10c3ByCVNQUk5fSElENCxyMAkJLyogc3dpdGNoIHRvIHJlc2VydmVkIExQSUQgKi8KKwlpc3luYworCWxpCXIwLDAKKwlzdHcJcjAsMChyMykJCS8qIGRyb3AgZ3Vlc3QgdGxiaWVfbG9jayAqLworCisJLyogaW52YWxpZGF0ZSB0aGUgd2hvbGUgVExCICovCisJbGkJcjAsMjU2CisJbXRjdHIJcjAKKwlsaQlyNiwwCisyNToJdGxiaWVsCXI2CisJYWRkaQlyNixyNiwweDEwMDAKKwliZG56CTI1YgorCXB0ZXN5bmMKKworCS8qIHRha2UgbmF0aXZlX3RsYmllX2xvY2sgKi8KKwlsZAlyMyx0b2NfdGxiaWVfbG9ja0B0b2MoMikKKzI0Oglsd2FyeAlyMCwwLHIzCisJY21wd2kJcjAsMAorCWJuZQkyNGIKKwlzdHdjeC4JcjgsMCxyMworCWJuZQkyNGIKKwlpc3luYworCisJbGQJcjYsS1ZNX0hPU1RfU0RSMShyNCkKKwltdHNwcglTUFJOX1NEUjEscjYJCS8qIHN3aXRjaCB0byBob3N0IHBhZ2UgdGFibGUgKi8KKworCS8qIFNldCB1cCBob3N0IEhJRDQgdmFsdWUgKi8KKwlzeW5jCisJbXRzcHIJU1BSTl9ISUQ0LHI3CisJaXN5bmMKKwlsaQlyMCwwCisJc3R3CXIwLDAocjMpCQkvKiBkcm9wIG5hdGl2ZV90bGJpZV9sb2NrICovCisKKwlsaXMJcjgsMHg3ZmZmCQkvKiBNQVhfSU5UQGggKi8KKwltdHNwcglTUFJOX0hERUMscjgKKworCS8qIERpc2FibGUgSERFQyBpbnRlcnJ1cHRzICovCisJbWZzcHIJcjAsU1BSTl9ISUQwCisJbGkJcjMsMAorCXJsZGltaQlyMCxyMywgSElEMF9IRElDRV9TSCwgNjQtSElEMF9IRElDRV9TSC0xCisJc3luYworCW10c3ByCVNQUk5fSElEMCxyMAorCW1mc3ByCXIwLFNQUk5fSElEMAorCW1mc3ByCXIwLFNQUk5fSElEMAorCW1mc3ByCXIwLFNQUk5fSElEMAorCW1mc3ByCXIwLFNQUk5fSElEMAorCW1mc3ByCXIwLFNQUk5fSElEMAorCW1mc3ByCXIwLFNQUk5fSElEMAorCisJLyogbG9hZCBob3N0IFNMQiBlbnRyaWVzICovCiszMzoJbGQJcjgsUEFDQV9TTEJTSEFET1dQVFIocjEzKQorCisJLnJlcHQJU0xCX05VTV9CT0xURUQKKwlsZAlyNSxTTEJTSEFET1dfU0FWRUFSRUEocjgpCisJbGQJcjYsU0xCU0hBRE9XX1NBVkVBUkVBKzgocjgpCisJYW5kaXMuCXI3LHI1LFNMQl9FU0lEX1ZAaAorCWJlcQkxZgorCXNsYm10ZQlyNixyNQorMToJYWRkaQlyOCxyOCwxNgorCS5lbmRyCisKKwkvKiBTYXZlIGFuZCByZXNldCBBTVIgYW5kIFVBTU9SIGJlZm9yZSB0dXJuaW5nIG9uIHRoZSBNTVUgKi8KK0JFR0lOX0ZUUl9TRUNUSU9OCisJbWZzcHIJcjUsU1BSTl9BTVIKKwltZnNwcglyNixTUFJOX1VBTU9SCisJc3RkCXI1LFZDUFVfQU1SKHI5KQorCXN0ZAlyNixWQ1BVX1VBTU9SKHI5KQorCWxpCXI2LDAKKwltdHNwcglTUFJOX0FNUixyNgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDYpCisKKwkvKiBSZXN0b3JlIGhvc3QgREFCUiBhbmQgREFCUlggKi8KKwlsZAlyNSxIU1RBVEVfREFCUihyMTMpCisJbGkJcjYsNworCW10c3ByCVNQUk5fREFCUixyNQorCW10c3ByCVNQUk5fREFCUlgscjYKKworCS8qIFN3aXRjaCBEU0NSIGJhY2sgdG8gaG9zdCB2YWx1ZSAqLworQkVHSU5fRlRSX1NFQ1RJT04KKwltZnNwcglyOCwgU1BSTl9EU0NSCisJbGQJcjcsIEhTVEFURV9EU0NSKHIxMykKKwlzdGQJcjgsIFZDUFVfRFNDUihyNykKKwltdHNwcglTUFJOX0RTQ1IsIHI3CitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKKworCS8qIFNhdmUgbm9uLXZvbGF0aWxlIEdQUnMgKi8KKwlzdGQJcjE0LCBWQ1BVX0dQUihyMTQpKHI5KQorCXN0ZAlyMTUsIFZDUFVfR1BSKHIxNSkocjkpCisJc3RkCXIxNiwgVkNQVV9HUFIocjE2KShyOSkKKwlzdGQJcjE3LCBWQ1BVX0dQUihyMTcpKHI5KQorCXN0ZAlyMTgsIFZDUFVfR1BSKHIxOCkocjkpCisJc3RkCXIxOSwgVkNQVV9HUFIocjE5KShyOSkKKwlzdGQJcjIwLCBWQ1BVX0dQUihyMjApKHI5KQorCXN0ZAlyMjEsIFZDUFVfR1BSKHIyMSkocjkpCisJc3RkCXIyMiwgVkNQVV9HUFIocjIyKShyOSkKKwlzdGQJcjIzLCBWQ1BVX0dQUihyMjMpKHI5KQorCXN0ZAlyMjQsIFZDUFVfR1BSKHIyNCkocjkpCisJc3RkCXIyNSwgVkNQVV9HUFIocjI1KShyOSkKKwlzdGQJcjI2LCBWQ1BVX0dQUihyMjYpKHI5KQorCXN0ZAlyMjcsIFZDUFVfR1BSKHIyNykocjkpCisJc3RkCXIyOCwgVkNQVV9HUFIocjI4KShyOSkKKwlzdGQJcjI5LCBWQ1BVX0dQUihyMjkpKHI5KQorCXN0ZAlyMzAsIFZDUFVfR1BSKHIzMCkocjkpCisJc3RkCXIzMSwgVkNQVV9HUFIocjMxKShyOSkKKworCS8qIFNhdmUgU1BSR3MgKi8KKwltZnNwcglyMywgU1BSTl9TUFJHMAorCW1mc3ByCXI0LCBTUFJOX1NQUkcxCisJbWZzcHIJcjUsIFNQUk5fU1BSRzIKKwltZnNwcglyNiwgU1BSTl9TUFJHMworCXN0ZAlyMywgVkNQVV9TUFJHMChyOSkKKwlzdGQJcjQsIFZDUFVfU1BSRzEocjkpCisJc3RkCXI1LCBWQ1BVX1NQUkcyKHI5KQorCXN0ZAlyNiwgVkNQVV9TUFJHMyhyOSkKKworCS8qIEluY3JlbWVudCB5aWVsZCBjb3VudCBpZiB0aGV5IGhhdmUgYSBWUEEgKi8KKwlsZAlyOCwgVkNQVV9WUEEocjkpCS8qIGRvIHRoZXkgaGF2ZSBhIFZQQT8gKi8KKwljbXBkaQlyOCwgMAorCWJlcQkyNWYKKwlsd3oJcjMsIExQUEFDQV9ZSUVMRENPVU5UKHI4KQorCWFkZGkJcjMsIHIzLCAxCisJc3R3CXIzLCBMUFBBQ0FfWUlFTERDT1VOVChyOCkKKzI1OgorCS8qIFNhdmUgUE1VIHJlZ2lzdGVycyBpZiByZXF1ZXN0ZWQgKi8KKwkvKiByOCBhbmQgY3IwLmVxIGFyZSBsaXZlIGhlcmUgKi8KKwlsaQlyMywgMQorCXNsZGkJcjMsIHIzLCAzMQkJLyogTU1DUjBfRkMgKGZyZWV6ZSBjb3VudGVycykgYml0ICovCisJbWZzcHIJcjQsIFNQUk5fTU1DUjAJCS8qIHNhdmUgTU1DUjAgKi8KKwltdHNwcglTUFJOX01NQ1IwLCByMwkJLyogZnJlZXplIGFsbCBjb3VudGVycywgZGlzYWJsZSBpbnRzICovCisJaXN5bmMKKwliZXEJMjFmCQkJLyogaWYgbm8gVlBBLCBzYXZlIFBNVSBzdHVmZiBhbnl3YXkgKi8KKwlsYnoJcjcsIExQUEFDQV9QTUNJTlVTRShyOCkKKwljbXB3aQlyNywgMAkJCS8qIGRpZCB0aGV5IGFzayBmb3IgUE1VIHN0dWZmIHRvIGJlIHNhdmVkPyAqLworCWJuZQkyMWYKKwlzdGQJcjMsIFZDUFVfTU1DUihyOSkJLyogaWYgbm90LCBzZXQgc2F2ZWQgTU1DUjAgdG8gRkMgKi8KKwliCTIyZgorMjE6CW1mc3ByCXI1LCBTUFJOX01NQ1IxCisJbWZzcHIJcjYsIFNQUk5fTU1DUkEKKwlzdGQJcjQsIFZDUFVfTU1DUihyOSkKKwlzdGQJcjUsIFZDUFVfTU1DUiArIDgocjkpCisJc3RkCXI2LCBWQ1BVX01NQ1IgKyAxNihyOSkKKwltZnNwcglyMywgU1BSTl9QTUMxCisJbWZzcHIJcjQsIFNQUk5fUE1DMgorCW1mc3ByCXI1LCBTUFJOX1BNQzMKKwltZnNwcglyNiwgU1BSTl9QTUM0CisJbWZzcHIJcjcsIFNQUk5fUE1DNQorCW1mc3ByCXI4LCBTUFJOX1BNQzYKK0JFR0lOX0ZUUl9TRUNUSU9OCisJbWZzcHIJcjEwLCBTUFJOX1BNQzcKKwltZnNwcglyMTEsIFNQUk5fUE1DOAorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDEpCisJc3R3CXIzLCBWQ1BVX1BNQyhyOSkKKwlzdHcJcjQsIFZDUFVfUE1DICsgNChyOSkKKwlzdHcJcjUsIFZDUFVfUE1DICsgOChyOSkKKwlzdHcJcjYsIFZDUFVfUE1DICsgMTIocjkpCisJc3R3CXI3LCBWQ1BVX1BNQyArIDE2KHI5KQorCXN0dwlyOCwgVkNQVV9QTUMgKyAyMChyOSkKK0JFR0lOX0ZUUl9TRUNUSU9OCisJc3R3CXIxMCwgVkNQVV9QTUMgKyAyNChyOSkKKwlzdHcJcjExLCBWQ1BVX1BNQyArIDI4KHI5KQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDEpCisyMjoKKwkvKiBzYXZlIEZQIHN0YXRlICovCisJbXIJcjMsIHI5CisJYmwJLmt2bXBwY19zYXZlX2ZwCisKKwkvKiBTZWNvbmRhcnkgdGhyZWFkcyBnbyBvZmYgdG8gdGFrZSBhIG5hcCBvbiBQT1dFUjcgKi8KK0JFR0lOX0ZUUl9TRUNUSU9OCisJbHd6CXIwLFZDUFVfUFRJRChyMykKKwljbXB3aQlyMCwwCisJYm5lCXNlY29uZGFyeV9uYXAKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA2KQorCisJLyoKKwkgKiBSZWxvYWQgREVDLiAgSERFQyBpbnRlcnJ1cHRzIHdlcmUgZGlzYWJsZWQgd2hlbgorCSAqIHdlIHJlbG9hZGVkIHRoZSBob3N0J3MgTFBDUiB2YWx1ZS4KKwkgKi8KKwlsZAlyMywgSFNUQVRFX0RFQ0VYUChyMTMpCisJbWZ0YglyNAorCXN1YmYJcjQsIHI0LCByMworCW10c3ByCVNQUk5fREVDLCByNAorCisJLyogUmVsb2FkIHRoZSBob3N0J3MgUE1VIHJlZ2lzdGVycyAqLworCWxkCXIzLCBQQUNBTFBQQUNBUFRSKHIxMykJLyogaXMgdGhlIGhvc3QgdXNpbmcgdGhlIFBNVT8gKi8KKwlsYnoJcjQsIExQUEFDQV9QTUNJTlVTRShyMykKKwljbXB3aQlyNCwgMAorCWJlcQkyM2YJCQkvKiBza2lwIGlmIG5vdCAqLworCWx3eglyMywgSFNUQVRFX1BNQyhyMTMpCisJbHd6CXI0LCBIU1RBVEVfUE1DICsgNChyMTMpCisJbHd6CXI1LCBIU1RBVEVfUE1DICsgOChyMTMpCisJbHd6CXI2LCBIU1RBVEVfUE1DICsgMTIocjEzKQorCWx3eglyOCwgSFNUQVRFX1BNQyArIDE2KHIxMykKKwlsd3oJcjksIEhTVEFURV9QTUMgKyAyMChyMTMpCitCRUdJTl9GVFJfU0VDVElPTgorCWx3eglyMTAsIEhTVEFURV9QTUMgKyAyNChyMTMpCisJbHd6CXIxMSwgSFNUQVRFX1BNQyArIDI4KHIxMykKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjAxKQorCW10c3ByCVNQUk5fUE1DMSwgcjMKKwltdHNwcglTUFJOX1BNQzIsIHI0CisJbXRzcHIJU1BSTl9QTUMzLCByNQorCW10c3ByCVNQUk5fUE1DNCwgcjYKKwltdHNwcglTUFJOX1BNQzUsIHI4CisJbXRzcHIJU1BSTl9QTUM2LCByOQorQkVHSU5fRlRSX1NFQ1RJT04KKwltdHNwcglTUFJOX1BNQzcsIHIxMAorCW10c3ByCVNQUk5fUE1DOCwgcjExCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwMSkKKwlsZAlyMywgSFNUQVRFX01NQ1IocjEzKQorCWxkCXI0LCBIU1RBVEVfTU1DUiArIDgocjEzKQorCWxkCXI1LCBIU1RBVEVfTU1DUiArIDE2KHIxMykKKwltdHNwcglTUFJOX01NQ1IxLCByNAorCW10c3ByCVNQUk5fTU1DUkEsIHI1CisJbXRzcHIJU1BSTl9NTUNSMCwgcjMKKwlpc3luYworMjM6CisJLyoKKwkgKiBGb3IgZXh0ZXJuYWwgYW5kIG1hY2hpbmUgY2hlY2sgaW50ZXJydXB0cywgd2UgbmVlZAorCSAqIHRvIGNhbGwgdGhlIExpbnV4IGhhbmRsZXIgdG8gcHJvY2VzcyB0aGUgaW50ZXJydXB0LgorCSAqIFdlIGRvIHRoYXQgYnkganVtcGluZyB0byB0aGUgaW50ZXJydXB0IHZlY3RvciBhZGRyZXNzCisJICogd2hpY2ggd2UgaGF2ZSBpbiByMTIuICBUaGUgW2hdcmZpZCBhdCB0aGUgZW5kIG9mIHRoZQorCSAqIGhhbmRsZXIgd2lsbCByZXR1cm4gdG8gdGhlIGJvb2szc19odl9pbnRlcnJ1cHRzLlMgY29kZS4KKwkgKiBGb3Igb3RoZXIgaW50ZXJydXB0cyB3ZSBkbyB0aGUgcmZpZCB0byBnZXQgYmFjaworCSAqIHRvIHRoZSBib29rM3NfaW50ZXJydXB0cy5TIGNvZGUgaGVyZS4KKwkgKi8KKwlsZAlyOCwgSFNUQVRFX1ZNSEFORExFUihyMTMpCisJbGQJcjcsIEhTVEFURV9IT1NUX01TUihyMTMpCisKKwljbXB3aQlyMTIsIEJPT0szU19JTlRFUlJVUFRfRVhURVJOQUwKKwliZXEJMTFmCisJY21wd2kJcjEyLCBCT09LM1NfSU5URVJSVVBUX01BQ0hJTkVfQ0hFQ0sKKworCS8qIFJGSSBpbnRvIHRoZSBoaWdobWVtIGhhbmRsZXIsIG9yIGJyYW5jaCB0byBpbnRlcnJ1cHQgaGFuZGxlciAqLworMTI6CW1mbXNyCXI2CisJbXRjdHIJcjEyCisJbGkJcjAsIE1TUl9SSQorCWFuZGMJcjYsIHI2LCByMAorCW10bXNyZAlyNiwgMQkJCS8qIENsZWFyIFJJIGluIE1TUiAqLworCW10c3JyMAlyOAorCW10c3JyMQlyNworCWJlcWN0cgorCVJGSQorCisxMToKK0JFR0lOX0ZUUl9TRUNUSU9OCisJYgkxMmIKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjAxKQorCW10c3ByCVNQUk5fSFNSUjAsIHI4CisJbXRzcHIJU1BSTl9IU1JSMSwgcjcKKwliYQkweDUwMAorCis2OgltZnNwcglyNixTUFJOX0hEQVIKKwltZnNwcglyNyxTUFJOX0hEU0lTUgorCWIJN2IKKworLyoKKyAqIFRyeSB0byBoYW5kbGUgYW4gaGNhbGwgaW4gcmVhbCBtb2RlLgorICogUmV0dXJucyB0byB0aGUgZ3Vlc3QgaWYgd2UgaGFuZGxlIGl0LCBvciBjb250aW51ZXMgb24gdXAgdG8KKyAqIHRoZSBrZXJuZWwgaWYgd2UgY2FuJ3QgKGkuZS4gaWYgd2UgZG9uJ3QgaGF2ZSBhIGhhbmRsZXIgZm9yCisgKiBpdCwgb3IgaWYgdGhlIGhhbmRsZXIgcmV0dXJucyBIX1RPT19IQVJEKS4KKyAqLworCS5nbG9ibAloY2FsbF90cnlfcmVhbF9tb2RlCitoY2FsbF90cnlfcmVhbF9tb2RlOgorCWxkCXIzLFZDUFVfR1BSKHIzKShyOSkKKwlhbmRpLglyMCxyMTEsTVNSX1BSCisJYm5lCWhjYWxsX3JlYWxfY29udAorCWNscnJkaQlyMyxyMywyCisJY21wbGRpCXIzLGhjYWxsX3JlYWxfdGFibGVfZW5kIC0gaGNhbGxfcmVhbF90YWJsZQorCWJnZQloY2FsbF9yZWFsX2NvbnQKKwlMT0FEX1JFR19BRERSKHI0LCBoY2FsbF9yZWFsX3RhYmxlKQorCWx3engJcjMscjMscjQKKwljbXB3aQlyMywwCisJYmVxCWhjYWxsX3JlYWxfY29udAorCWFkZAlyMyxyMyxyNAorCW10Y3RyCXIzCisJbXIJcjMscjkJCS8qIGdldCB2Y3B1IHBvaW50ZXIgKi8KKwlsZAlyNCxWQ1BVX0dQUihyNCkocjkpCisJYmN0cmwKKwljbXBkaQlyMyxIX1RPT19IQVJECisJYmVxCWhjYWxsX3JlYWxfZmFsbGJhY2sKKwlsZAlyNCxIU1RBVEVfS1ZNX1ZDUFUocjEzKQorCXN0ZAlyMyxWQ1BVX0dQUihyMykocjQpCisJbGQJcjEwLFZDUFVfUEMocjQpCisJbGQJcjExLFZDUFVfTVNSKHI0KQorCWIJZmFzdF9ndWVzdF9yZXR1cm4KKworCS8qIFdlJ3ZlIGF0dGVtcHRlZCBhIHJlYWwgbW9kZSBoY2FsbCwgYnV0IGl0J3MgcHVudGVkIGl0IGJhY2sKKwkgKiB0byB1c2Vyc3BhY2UuICBXZSBuZWVkIHRvIHJlc3RvcmUgc29tZSBjbG9iYmVyZWQgdm9sYXRpbGVzCisJICogYmVmb3JlIHJlc3VtaW5nIHRoZSBwYXNzLWl0LXRvLXFlbXUgcGF0aCAqLworaGNhbGxfcmVhbF9mYWxsYmFjazoKKwlsaQlyMTIsQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMCisJbGQJcjksIEhTVEFURV9LVk1fVkNQVShyMTMpCisJbGQJcjExLCBWQ1BVX01TUihyOSkKKworCWIJaGNhbGxfcmVhbF9jb250CisKKwkuZ2xvYmwJaGNhbGxfcmVhbF90YWJsZQoraGNhbGxfcmVhbF90YWJsZToKKwkubG9uZwkwCQkvKiAwIC0gdW51c2VkICovCisJLmxvbmcJLmt2bXBwY19oX3JlbW92ZSAtIGhjYWxsX3JlYWxfdGFibGUKKwkubG9uZwkua3ZtcHBjX2hfZW50ZXIgLSBoY2FsbF9yZWFsX3RhYmxlCisJLmxvbmcJLmt2bXBwY19oX3JlYWQgLSBoY2FsbF9yZWFsX3RhYmxlCisJLmxvbmcJMAkJLyogMHgxMCAtIEhfQ0xFQVJfTU9EICovCisJLmxvbmcJMAkJLyogMHgxNCAtIEhfQ0xFQVJfUkVGICovCisJLmxvbmcJLmt2bXBwY19oX3Byb3RlY3QgLSBoY2FsbF9yZWFsX3RhYmxlCisJLmxvbmcJMAkJLyogMHgxYyAtIEhfR0VUX1RDRSAqLworCS5sb25nCS5rdm1wcGNfaF9wdXRfdGNlIC0gaGNhbGxfcmVhbF90YWJsZQorCS5sb25nCTAJCS8qIDB4MjQgLSBIX1NFVF9TUFJHMCAqLworCS5sb25nCS5rdm1wcGNfaF9zZXRfZGFiciAtIGhjYWxsX3JlYWxfdGFibGUKKwkubG9uZwkwCQkvKiAweDJjICovCisJLmxvbmcJMAkJLyogMHgzMCAqLworCS5sb25nCTAJCS8qIDB4MzQgKi8KKwkubG9uZwkwCQkvKiAweDM4ICovCisJLmxvbmcJMAkJLyogMHgzYyAqLworCS5sb25nCTAJCS8qIDB4NDAgKi8KKwkubG9uZwkwCQkvKiAweDQ0ICovCisJLmxvbmcJMAkJLyogMHg0OCAqLworCS5sb25nCTAJCS8qIDB4NGMgKi8KKwkubG9uZwkwCQkvKiAweDUwICovCisJLmxvbmcJMAkJLyogMHg1NCAqLworCS5sb25nCTAJCS8qIDB4NTggKi8KKwkubG9uZwkwCQkvKiAweDVjICovCisJLmxvbmcJMAkJLyogMHg2MCAqLworCS5sb25nCTAJCS8qIDB4NjQgKi8KKwkubG9uZwkwCQkvKiAweDY4ICovCisJLmxvbmcJMAkJLyogMHg2YyAqLworCS5sb25nCTAJCS8qIDB4NzAgKi8KKwkubG9uZwkwCQkvKiAweDc0ICovCisJLmxvbmcJMAkJLyogMHg3OCAqLworCS5sb25nCTAJCS8qIDB4N2MgKi8KKwkubG9uZwkwCQkvKiAweDgwICovCisJLmxvbmcJMAkJLyogMHg4NCAqLworCS5sb25nCTAJCS8qIDB4ODggKi8KKwkubG9uZwkwCQkvKiAweDhjICovCisJLmxvbmcJMAkJLyogMHg5MCAqLworCS5sb25nCTAJCS8qIDB4OTQgKi8KKwkubG9uZwkwCQkvKiAweDk4ICovCisJLmxvbmcJMAkJLyogMHg5YyAqLworCS5sb25nCTAJCS8qIDB4YTAgKi8KKwkubG9uZwkwCQkvKiAweGE0ICovCisJLmxvbmcJMAkJLyogMHhhOCAqLworCS5sb25nCTAJCS8qIDB4YWMgKi8KKwkubG9uZwkwCQkvKiAweGIwICovCisJLmxvbmcJMAkJLyogMHhiNCAqLworCS5sb25nCTAJCS8qIDB4YjggKi8KKwkubG9uZwkwCQkvKiAweGJjICovCisJLmxvbmcJMAkJLyogMHhjMCAqLworCS5sb25nCTAJCS8qIDB4YzQgKi8KKwkubG9uZwkwCQkvKiAweGM4ICovCisJLmxvbmcJMAkJLyogMHhjYyAqLworCS5sb25nCTAJCS8qIDB4ZDAgKi8KKwkubG9uZwkwCQkvKiAweGQ0ICovCisJLmxvbmcJMAkJLyogMHhkOCAqLworCS5sb25nCTAJCS8qIDB4ZGMgKi8KKwkubG9uZwkwCQkvKiAweGUwICovCisJLmxvbmcJMAkJLyogMHhlNCAqLworCS5sb25nCTAJCS8qIDB4ZTggKi8KKwkubG9uZwkwCQkvKiAweGVjICovCisJLmxvbmcJMAkJLyogMHhmMCAqLworCS5sb25nCTAJCS8qIDB4ZjQgKi8KKwkubG9uZwkwCQkvKiAweGY4ICovCisJLmxvbmcJMAkJLyogMHhmYyAqLworCS5sb25nCTAJCS8qIDB4MTAwICovCisJLmxvbmcJMAkJLyogMHgxMDQgKi8KKwkubG9uZwkwCQkvKiAweDEwOCAqLworCS5sb25nCTAJCS8qIDB4MTBjICovCisJLmxvbmcJMAkJLyogMHgxMTAgKi8KKwkubG9uZwkwCQkvKiAweDExNCAqLworCS5sb25nCTAJCS8qIDB4MTE4ICovCisJLmxvbmcJMAkJLyogMHgxMWMgKi8KKwkubG9uZwkwCQkvKiAweDEyMCAqLworCS5sb25nCS5rdm1wcGNfaF9idWxrX3JlbW92ZSAtIGhjYWxsX3JlYWxfdGFibGUKK2hjYWxsX3JlYWxfdGFibGVfZW5kOgorCitpZ25vcmVfaGRlYzoKKwltcglyNCxyOQorCWIJZmFzdF9ndWVzdF9yZXR1cm4KKworYm91bmNlX2V4dF9pbnRlcnJ1cHQ6CisJbXIJcjQscjkKKwltdHNwcglTUFJOX1NSUjAscjEwCisJbXRzcHIJU1BSTl9TUlIxLHIxMQorCWxpCXIxMCxCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMCisJTE9BRF9SRUdfSU1NRURJQVRFKHIxMSxNU1JfU0YgfCBNU1JfTUUpOworCWIJZmFzdF9ndWVzdF9yZXR1cm4KKworX0dMT0JBTChrdm1wcGNfaF9zZXRfZGFicikKKwlzdGQJcjQsVkNQVV9EQUJSKHIzKQorCW10c3ByCVNQUk5fREFCUixyNAorCWxpCXIzLDAKKwlibHIKKworc2Vjb25kYXJ5X3Rvb19sYXRlOgorCWxkCXI1LEhTVEFURV9LVk1fVkNPUkUocjEzKQorCUhNVF9MT1cKKzEzOglsYnoJcjMsVkNPUkVfSU5fR1VFU1QocjUpCisJY21wd2kJcjMsMAorCWJuZQkxM2IKKwlITVRfTUVESVVNCisJbGQJcjExLFBBQ0FfU0xCU0hBRE9XUFRSKHIxMykKKworCS5yZXB0CVNMQl9OVU1fQk9MVEVECisJbGQJcjUsU0xCU0hBRE9XX1NBVkVBUkVBKHIxMSkKKwlsZAlyNixTTEJTSEFET1dfU0FWRUFSRUErOChyMTEpCisJYW5kaXMuCXI3LHI1LFNMQl9FU0lEX1ZAaAorCWJlcQkxZgorCXNsYm10ZQlyNixyNQorMToJYWRkaQlyMTEscjExLDE2CisJLmVuZHIKKwliCTUwZgorCitzZWNvbmRhcnlfbmFwOgorCS8qIENsZWFyIGFueSBwZW5kaW5nIElQSSAqLworNTA6CWxkCXI1LCBIU1RBVEVfWElDU19QSFlTKHIxMykKKwlsaQlyMCwgMHhmZgorCWxpCXI2LCBYSUNTX1FJUlIKKwlzdGJjaXgJcjAsIHI1LCByNgorCisJLyogaW5jcmVtZW50IHRoZSBuYXAgY291bnQgYW5kIHRoZW4gZ28gdG8gbmFwIG1vZGUgKi8KKwlsZAlyNCwgSFNUQVRFX0tWTV9WQ09SRShyMTMpCisJYWRkaQlyNCwgcjQsIFZDT1JFX05BUF9DT1VOVAorCWx3c3luYwkJCQkvKiBtYWtlIHByZXZpb3VzIHVwZGF0ZXMgdmlzaWJsZSAqLworNTE6CWx3YXJ4CXIzLCAwLCByNAorCWFkZGkJcjMsIHIzLCAxCisJc3R3Y3guCXIzLCAwLCByNAorCWJuZQk1MWIKKwlpc3luYworCisJbWZzcHIJcjQsIFNQUk5fTFBDUgorCWxpCXIwLCBMUENSX1BFQ0UKKwlhbmRjCXI0LCByNCwgcjAKKwlvcmkJcjQsIHI0LCBMUENSX1BFQ0UwCS8qIGV4aXQgbmFwIG9uIGludGVycnVwdCAqLworCW10c3ByCVNQUk5fTFBDUiwgcjQKKwlsaQlyMCwgMAorCXN0ZAlyMCwgSFNUQVRFX1NDUkFUQ0gwKHIxMykKKwlwdGVzeW5jCisJbGQJcjAsIEhTVEFURV9TQ1JBVENIMChyMTMpCisxOgljbXBkCXIwLCByMAorCWJuZQkxYgorCW5hcAorCWIJLgorCisvKgorICogU2F2ZSBhd2F5IEZQLCBWTVggYW5kIFZTWCByZWdpc3RlcnMuCisgKiByMyA9IHZjcHUgcG9pbnRlcgorICovCitfR0xPQkFMKGt2bXBwY19zYXZlX2ZwKQorCW1mbXNyCXI5CisJb3JpCXI4LHI5LE1TUl9GUAorI2lmZGVmIENPTkZJR19BTFRJVkVDCitCRUdJTl9GVFJfU0VDVElPTgorCW9yaXMJcjgscjgsTVNSX1ZFQ0BoCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BTFRJVkVDKQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZTWAorQkVHSU5fRlRSX1NFQ1RJT04KKwlvcmlzCXI4LHI4LE1TUl9WU1hAaAorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfVlNYKQorI2VuZGlmCisJbXRtc3JkCXI4CisJaXN5bmMKKyNpZmRlZiBDT05GSUdfVlNYCitCRUdJTl9GVFJfU0VDVElPTgorCXJlZyA9IDAKKwkucmVwdAkzMgorCWxpCXI2LHJlZyoxNitWQ1BVX1ZTUlMKKwlzdHh2ZDJ4CXJlZyxyNixyMworCXJlZyA9IHJlZyArIDEKKwkuZW5kcgorRlRSX1NFQ1RJT05fRUxTRQorI2VuZGlmCisJcmVnID0gMAorCS5yZXB0CTMyCisJc3RmZAlyZWcscmVnKjgrVkNQVV9GUFJTKHIzKQorCXJlZyA9IHJlZyArIDEKKwkuZW5kcgorI2lmZGVmIENPTkZJR19WU1gKK0FMVF9GVFJfU0VDVElPTl9FTkRfSUZTRVQoQ1BVX0ZUUl9WU1gpCisjZW5kaWYKKwltZmZzCWZyMAorCXN0ZmQJZnIwLFZDUFVfRlBTQ1IocjMpCisKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworQkVHSU5fRlRSX1NFQ1RJT04KKwlyZWcgPSAwCisJLnJlcHQJMzIKKwlsaQlyNixyZWcqMTYrVkNQVV9WUlMKKwlzdHZ4CXJlZyxyNixyMworCXJlZyA9IHJlZyArIDEKKwkuZW5kcgorCW1mdnNjcgl2cjAKKwlsaQlyNixWQ1BVX1ZTQ1IKKwlzdHZ4CXZyMCxyNixyMworRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQUxUSVZFQykKKyNlbmRpZgorCW1mc3ByCXI2LFNQUk5fVlJTQVZFCisJc3R3CXI2LFZDUFVfVlJTQVZFKHIzKQorCW10bXNyZAlyOQorCWlzeW5jCisJYmxyCisKKy8qCisgKiBMb2FkIHVwIEZQLCBWTVggYW5kIFZTWCByZWdpc3RlcnMKKyAqIHI0ID0gdmNwdSBwb2ludGVyCisgKi8KKwkuZ2xvYmwJa3ZtcHBjX2xvYWRfZnAKK2t2bXBwY19sb2FkX2ZwOgorCW1mbXNyCXI5CisJb3JpCXI4LHI5LE1TUl9GUAorI2lmZGVmIENPTkZJR19BTFRJVkVDCitCRUdJTl9GVFJfU0VDVElPTgorCW9yaXMJcjgscjgsTVNSX1ZFQ0BoCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BTFRJVkVDKQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZTWAorQkVHSU5fRlRSX1NFQ1RJT04KKwlvcmlzCXI4LHI4LE1TUl9WU1hAaAorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfVlNYKQorI2VuZGlmCisJbXRtc3JkCXI4CisJaXN5bmMKKwlsZmQJZnIwLFZDUFVfRlBTQ1IocjQpCisJTVRGU0ZfTChmcjApCisjaWZkZWYgQ09ORklHX1ZTWAorQkVHSU5fRlRSX1NFQ1RJT04KKwlyZWcgPSAwCisJLnJlcHQJMzIKKwlsaQlyNyxyZWcqMTYrVkNQVV9WU1JTCisJbHh2ZDJ4CXJlZyxyNyxyNAorCXJlZyA9IHJlZyArIDEKKwkuZW5kcgorRlRSX1NFQ1RJT05fRUxTRQorI2VuZGlmCisJcmVnID0gMAorCS5yZXB0CTMyCisJbGZkCXJlZyxyZWcqOCtWQ1BVX0ZQUlMocjQpCisJcmVnID0gcmVnICsgMQorCS5lbmRyCisjaWZkZWYgQ09ORklHX1ZTWAorQUxUX0ZUUl9TRUNUSU9OX0VORF9JRlNFVChDUFVfRlRSX1ZTWCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FMVElWRUMKK0JFR0lOX0ZUUl9TRUNUSU9OCisJbGkJcjcsVkNQVV9WU0NSCisJbHZ4CXZyMCxyNyxyNAorCW10dnNjcgl2cjAKKwlyZWcgPSAwCisJLnJlcHQJMzIKKwlsaQlyNyxyZWcqMTYrVkNQVV9WUlMKKwlsdngJcmVnLHI3LHI0CisJcmVnID0gcmVnICsgMQorCS5lbmRyCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BTFRJVkVDKQorI2VuZGlmCisJbHd6CXI3LFZDUFVfVlJTQVZFKHI0KQorCW10c3ByCVNQUk5fVlJTQVZFLHI3CisJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19pbnRlcnJ1cHRzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19pbnRlcnJ1cHRzLlMKaW5kZXggMmYwYmM5Mi4uYzU0YjBlMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaW50ZXJydXB0cy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2ludGVycnVwdHMuUwpAQCAtMjksOCArMjksNyBAQAogI2RlZmluZSBVTE9OR19TSVpFIAkJOAogI2RlZmluZSBGVU5DKG5hbWUpIAkJR0xVRSguLG5hbWUpCiAKLSNkZWZpbmUgR0VUX1NIQURPV19WQ1BVKHJlZykgICAgXAotICAgICAgICBhZGRpICAgIHJlZywgcjEzLCBQQUNBX0tWTV9TVkNQVQorI2RlZmluZSBHRVRfU0hBRE9XX1ZDUFVfUjEzCiAKICNkZWZpbmUgRElTQUJMRV9JTlRFUlJVUFRTCVwKIAltZm1zciAgIHIwOwkJXApAQCAtNDMsOCArNDIsOCBAQAogI2RlZmluZSBVTE9OR19TSVpFICAgICAgICAgICAgICA0CiAjZGVmaW5lIEZVTkMobmFtZSkJCW5hbWUKIAotI2RlZmluZSBHRVRfU0hBRE9XX1ZDUFUocmVnKSAgICBcCi0gICAgICAgIGx3eiAgICAgcmVnLCAoVEhSRUFEICsgVEhSRUFEX0tWTV9TVkNQVSkocjIpCisjZGVmaW5lIEdFVF9TSEFET1dfVkNQVV9SMTMJXAorCWx3eglyMTMsIChUSFJFQUQgKyBUSFJFQURfS1ZNX1NWQ1BVKShyMikKIAogI2RlZmluZSBESVNBQkxFX0lOVEVSUlVQVFMJXAogCW1mbXNyICAgcjA7CQlcCkBAIC04NSw3ICs4NCw3IEBACiAgKiAgcjM6IGt2bV9ydW4gcG9pbnRlcgogICogIHI0OiB2Y3B1IHBvaW50ZXIKICAqLwotX0dMT0JBTChfX2t2bXBwY192Y3B1X2VudHJ5KQorX0dMT0JBTChfX2t2bXBwY192Y3B1X3J1bikKIAoga3ZtX3N0YXJ0X2VudHJ5OgogCS8qIFdyaXRlIGNvcnJlY3Qgc3RhY2sgZnJhbWUgKi8KQEAgLTEwNywxOCArMTA2LDEyIEBACiAJLyogTG9hZCBub24tdm9sYXRpbGUgZ3Vlc3Qgc3RhdGUgZnJvbSB0aGUgdmNwdSAqLwogCVZDUFVfTE9BRF9OVkdQUlMocjQpCiAKLQlHRVRfU0hBRE9XX1ZDUFUocjUpCi0KLQkvKiBTYXZlIFIxL1IyIGluIHRoZSBQQUNBICovCi0JUFBDX1NUTAlyMSwgU1ZDUFVfSE9TVF9SMShyNSkKLQlQUENfU1RMCXIyLCBTVkNQVV9IT1NUX1IyKHI1KQotCi0JLyogWFhYIHN3YXAgaW4vb3V0IG9uIGxvYWQ/ICovCi0JUFBDX0xMCXIzLCBWQ1BVX0hJR0hNRU1fSEFORExFUihyNCkKLQlQUENfU1RMCXIzLCBTVkNQVV9WTUhBTkRMRVIocjUpCi0KIGt2bV9zdGFydF9saWdodHdlaWdodDoKIAorCUdFVF9TSEFET1dfVkNQVV9SMTMKKwlQUENfTEwJcjMsIFZDUFVfSElHSE1FTV9IQU5ETEVSKHI0KQorCVBQQ19TVEwJcjMsIEhTVEFURV9WTUhBTkRMRVIocjEzKQorCiAJUFBDX0xMCXIxMCwgVkNQVV9TSEFET1dfTVNSKHI0KQkvKiByMTAgPSB2Y3B1LT5hcmNoLnNoYWRvd19tc3IgKi8KIAogCURJU0FCTEVfSU5URVJSVVBUUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfbW11X2hwdGUuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX21tdV9ocHRlLmMKaW5kZXggNzk3NTFkOC4uNDFjYjAwMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfbW11X2hwdGUuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19tbXVfaHB0ZS5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgInRyYWNlLmgiCiAKICNpbmNsdWRlIDxhc20va3ZtX3BwYy5oPgogI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzLmg+CkBAIC0yOSw2ICsyOCw4IEBACiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogCisjaW5jbHVkZSAidHJhY2UuaCIKKwogI2RlZmluZSBQVEVfU0laRQkxMgogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmhwdGVfY2FjaGU7CkBAIC01OCwzMCArNTksMzEgQEAKIHZvaWQga3ZtcHBjX21tdV9ocHRlX2NhY2hlX21hcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBocHRlX2NhY2hlICpwdGUpCiB7CiAJdTY0IGluZGV4OworCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHUzcyA9IHRvX2Jvb2szcyh2Y3B1KTsKIAogCXRyYWNlX2t2bV9ib29rM3NfbW11X21hcChwdGUpOwogCi0Jc3Bpbl9sb2NrKCZ2Y3B1LT5hcmNoLm1tdV9sb2NrKTsKKwlzcGluX2xvY2soJnZjcHUzcy0+bW11X2xvY2spOwogCiAJLyogQWRkIHRvIGVQVEUgbGlzdCAqLwogCWluZGV4ID0ga3ZtcHBjX21tdV9oYXNoX3B0ZShwdGUtPnB0ZS5lYWRkcik7Ci0JaGxpc3RfYWRkX2hlYWRfcmN1KCZwdGUtPmxpc3RfcHRlLCAmdmNwdS0+YXJjaC5ocHRlX2hhc2hfcHRlW2luZGV4XSk7CisJaGxpc3RfYWRkX2hlYWRfcmN1KCZwdGUtPmxpc3RfcHRlLCAmdmNwdTNzLT5ocHRlX2hhc2hfcHRlW2luZGV4XSk7CiAKIAkvKiBBZGQgdG8gZVBURV9sb25nIGxpc3QgKi8KIAlpbmRleCA9IGt2bXBwY19tbXVfaGFzaF9wdGVfbG9uZyhwdGUtPnB0ZS5lYWRkcik7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZwdGUtPmxpc3RfcHRlX2xvbmcsCi0JCQkgICAmdmNwdS0+YXJjaC5ocHRlX2hhc2hfcHRlX2xvbmdbaW5kZXhdKTsKKwkJCSAgICZ2Y3B1M3MtPmhwdGVfaGFzaF9wdGVfbG9uZ1tpbmRleF0pOwogCiAJLyogQWRkIHRvIHZQVEUgbGlzdCAqLwogCWluZGV4ID0ga3ZtcHBjX21tdV9oYXNoX3ZwdGUocHRlLT5wdGUudnBhZ2UpOwotCWhsaXN0X2FkZF9oZWFkX3JjdSgmcHRlLT5saXN0X3ZwdGUsICZ2Y3B1LT5hcmNoLmhwdGVfaGFzaF92cHRlW2luZGV4XSk7CisJaGxpc3RfYWRkX2hlYWRfcmN1KCZwdGUtPmxpc3RfdnB0ZSwgJnZjcHUzcy0+aHB0ZV9oYXNoX3ZwdGVbaW5kZXhdKTsKIAogCS8qIEFkZCB0byB2UFRFX2xvbmcgbGlzdCAqLwogCWluZGV4ID0ga3ZtcHBjX21tdV9oYXNoX3ZwdGVfbG9uZyhwdGUtPnB0ZS52cGFnZSk7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZwdGUtPmxpc3RfdnB0ZV9sb25nLAotCQkJICAgJnZjcHUtPmFyY2guaHB0ZV9oYXNoX3ZwdGVfbG9uZ1tpbmRleF0pOworCQkJICAgJnZjcHUzcy0+aHB0ZV9oYXNoX3ZwdGVfbG9uZ1tpbmRleF0pOwogCi0Jc3Bpbl91bmxvY2soJnZjcHUtPmFyY2gubW11X2xvY2spOworCXNwaW5fdW5sb2NrKCZ2Y3B1M3MtPm1tdV9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9wdGVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKQEAgLTkyLDE2ICs5NCwxOCBAQAogCiBzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX3B0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBocHRlX2NhY2hlICpwdGUpCiB7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdTNzID0gdG9fYm9vazNzKHZjcHUpOworCiAJdHJhY2Vfa3ZtX2Jvb2szc19tbXVfaW52YWxpZGF0ZShwdGUpOwogCiAJLyogRGlmZmVyZW50IGZvciAzMiBhbmQgNjQgYml0ICovCiAJa3ZtcHBjX21tdV9pbnZhbGlkYXRlX3B0ZSh2Y3B1LCBwdGUpOwogCi0Jc3Bpbl9sb2NrKCZ2Y3B1LT5hcmNoLm1tdV9sb2NrKTsKKwlzcGluX2xvY2soJnZjcHUzcy0+bW11X2xvY2spOwogCiAJLyogcHRlIGFscmVhZHkgaW52YWxpZGF0ZWQgaW4gYmV0d2Vlbj8gKi8KIAlpZiAoaGxpc3RfdW5oYXNoZWQoJnB0ZS0+bGlzdF9wdGUpKSB7Ci0JCXNwaW5fdW5sb2NrKCZ2Y3B1LT5hcmNoLm1tdV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnZjcHUzcy0+bW11X2xvY2spOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTUsMTQgKzExOSwxNSBAQAogCWVsc2UKIAkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHB0ZS0+cGZuKTsKIAotCXNwaW5fdW5sb2NrKCZ2Y3B1LT5hcmNoLm1tdV9sb2NrKTsKKwlzcGluX3VubG9jaygmdmNwdTNzLT5tbXVfbG9jayk7CiAKLQl2Y3B1LT5hcmNoLmhwdGVfY2FjaGVfY291bnQtLTsKKwl2Y3B1M3MtPmhwdGVfY2FjaGVfY291bnQtLTsKIAljYWxsX3JjdSgmcHRlLT5yY3VfaGVhZCwgZnJlZV9wdGVfcmN1KTsKIH0KIAogc3RhdGljIHZvaWQga3ZtcHBjX21tdV9wdGVfZmx1c2hfYWxsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1M3MgPSB0b19ib29rM3ModmNwdSk7CiAJc3RydWN0IGhwdGVfY2FjaGUgKnB0ZTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKIAlpbnQgaTsKQEAgLTEzMCw3ICsxMzUsNyBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAogCWZvciAoaSA9IDA7IGkgPCBIUFRFR19IQVNIX05VTV9WUFRFX0xPTkc7IGkrKykgewotCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdCA9ICZ2Y3B1LT5hcmNoLmhwdGVfaGFzaF92cHRlX2xvbmdbaV07CisJCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0ID0gJnZjcHUzcy0+aHB0ZV9oYXNoX3ZwdGVfbG9uZ1tpXTsKIAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHRlLCBub2RlLCBsaXN0LCBsaXN0X3ZwdGVfbG9uZykKIAkJCWludmFsaWRhdGVfcHRlKHZjcHUsIHB0ZSk7CkBAIC0xNDEsMTIgKzE0NiwxMyBAQAogCiBzdGF0aWMgdm9pZCBrdm1wcGNfbW11X3B0ZV9mbHVzaF9wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgZ3Vlc3RfZWEpCiB7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdTNzID0gdG9fYm9vazNzKHZjcHUpOwogCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7CiAKIAkvKiBGaW5kIHRoZSBsaXN0IG9mIGVudHJpZXMgaW4gdGhlIG1hcCAqLwotCWxpc3QgPSAmdmNwdS0+YXJjaC5ocHRlX2hhc2hfcHRlW2t2bXBwY19tbXVfaGFzaF9wdGUoZ3Vlc3RfZWEpXTsKKwlsaXN0ID0gJnZjcHUzcy0+aHB0ZV9oYXNoX3B0ZVtrdm1wcGNfbW11X2hhc2hfcHRlKGd1ZXN0X2VhKV07CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAKQEAgLTE2MCwxMiArMTY2LDEzIEBACiAKIHN0YXRpYyB2b2lkIGt2bXBwY19tbXVfcHRlX2ZsdXNoX2xvbmcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyBndWVzdF9lYSkKIHsKKwlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1M3MgPSB0b19ib29rM3ModmNwdSk7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAJc3RydWN0IGhwdGVfY2FjaGUgKnB0ZTsKIAogCS8qIEZpbmQgdGhlIGxpc3Qgb2YgZW50cmllcyBpbiB0aGUgbWFwICovCi0JbGlzdCA9ICZ2Y3B1LT5hcmNoLmhwdGVfaGFzaF9wdGVfbG9uZ1sKKwlsaXN0ID0gJnZjcHUzcy0+aHB0ZV9oYXNoX3B0ZV9sb25nWwogCQkJa3ZtcHBjX21tdV9oYXNoX3B0ZV9sb25nKGd1ZXN0X2VhKV07CiAKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC0yMDMsMTIgKzIxMCwxMyBAQAogLyogRmx1c2ggd2l0aCBtYXNrIDB4ZmZmZmZmZmZmICovCiBzdGF0aWMgdm9pZCBrdm1wcGNfbW11X3B0ZV92Zmx1c2hfc2hvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3Vlc3RfdnApCiB7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdTNzID0gdG9fYm9vazNzKHZjcHUpOwogCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7CiAJdTY0IHZwX21hc2sgPSAweGZmZmZmZmZmZlVMTDsKIAotCWxpc3QgPSAmdmNwdS0+YXJjaC5ocHRlX2hhc2hfdnB0ZVtrdm1wcGNfbW11X2hhc2hfdnB0ZShndWVzdF92cCldOworCWxpc3QgPSAmdmNwdTNzLT5ocHRlX2hhc2hfdnB0ZVtrdm1wcGNfbW11X2hhc2hfdnB0ZShndWVzdF92cCldOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCkBAIC0yMjMsMTIgKzIzMSwxMyBAQAogLyogRmx1c2ggd2l0aCBtYXNrIDB4ZmZmZmZmMDAwICovCiBzdGF0aWMgdm9pZCBrdm1wcGNfbW11X3B0ZV92Zmx1c2hfbG9uZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBndWVzdF92cCkKIHsKKwlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1M3MgPSB0b19ib29rM3ModmNwdSk7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAJc3RydWN0IGhwdGVfY2FjaGUgKnB0ZTsKIAl1NjQgdnBfbWFzayA9IDB4ZmZmZmZmMDAwVUxMOwogCi0JbGlzdCA9ICZ2Y3B1LT5hcmNoLmhwdGVfaGFzaF92cHRlX2xvbmdbCisJbGlzdCA9ICZ2Y3B1M3MtPmhwdGVfaGFzaF92cHRlX2xvbmdbCiAJCWt2bXBwY19tbXVfaGFzaF92cHRlX2xvbmcoZ3Vlc3RfdnApXTsKIAogCXJjdV9yZWFkX2xvY2soKTsKQEAgLTI2MSw2ICsyNzAsNyBAQAogCiB2b2lkIGt2bXBwY19tbXVfcHRlX3BmbHVzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIHBhX3N0YXJ0LCB1bG9uZyBwYV9lbmQpCiB7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdTNzID0gdG9fYm9vazNzKHZjcHUpOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7CiAJaW50IGk7CkBAIC0yNzAsNyArMjgwLDcgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSFBURUdfSEFTSF9OVU1fVlBURV9MT05HOyBpKyspIHsKLQkJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3QgPSAmdmNwdS0+YXJjaC5ocHRlX2hhc2hfdnB0ZV9sb25nW2ldOworCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdCA9ICZ2Y3B1M3MtPmhwdGVfaGFzaF92cHRlX2xvbmdbaV07CiAKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0ZSwgbm9kZSwgbGlzdCwgbGlzdF92cHRlX2xvbmcpCiAJCQlpZiAoKHB0ZS0+cHRlLnJhZGRyID49IHBhX3N0YXJ0KSAmJgpAQCAtMjgzLDEyICsyOTMsMTMgQEAKIAogc3RydWN0IGhwdGVfY2FjaGUgKmt2bXBwY19tbXVfaHB0ZV9jYWNoZV9uZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1M3MgPSB0b19ib29rM3ModmNwdSk7CiAJc3RydWN0IGhwdGVfY2FjaGUgKnB0ZTsKIAogCXB0ZSA9IGttZW1fY2FjaGVfemFsbG9jKGhwdGVfY2FjaGUsIEdGUF9LRVJORUwpOwotCXZjcHUtPmFyY2guaHB0ZV9jYWNoZV9jb3VudCsrOworCXZjcHUzcy0+aHB0ZV9jYWNoZV9jb3VudCsrOwogCi0JaWYgKHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9jb3VudCA9PSBIUFRFR19DQUNIRV9OVU0pCisJaWYgKHZjcHUzcy0+aHB0ZV9jYWNoZV9jb3VudCA9PSBIUFRFR19DQUNIRV9OVU0pCiAJCWt2bXBwY19tbXVfcHRlX2ZsdXNoX2FsbCh2Y3B1KTsKIAogCXJldHVybiBwdGU7CkBAIC0zMDksMTcgKzMyMCwxOSBAQAogCiBpbnQga3ZtcHBjX21tdV9ocHRlX2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCS8qIGluaXQgaHB0ZSBsb29rdXAgaGFzaGVzICovCi0Ja3ZtcHBjX21tdV9ocHRlX2luaXRfaGFzaCh2Y3B1LT5hcmNoLmhwdGVfaGFzaF9wdGUsCi0JCQkJICBBUlJBWV9TSVpFKHZjcHUtPmFyY2guaHB0ZV9oYXNoX3B0ZSkpOwotCWt2bXBwY19tbXVfaHB0ZV9pbml0X2hhc2godmNwdS0+YXJjaC5ocHRlX2hhc2hfcHRlX2xvbmcsCi0JCQkJICBBUlJBWV9TSVpFKHZjcHUtPmFyY2guaHB0ZV9oYXNoX3B0ZV9sb25nKSk7Ci0Ja3ZtcHBjX21tdV9ocHRlX2luaXRfaGFzaCh2Y3B1LT5hcmNoLmhwdGVfaGFzaF92cHRlLAotCQkJCSAgQVJSQVlfU0laRSh2Y3B1LT5hcmNoLmhwdGVfaGFzaF92cHRlKSk7Ci0Ja3ZtcHBjX21tdV9ocHRlX2luaXRfaGFzaCh2Y3B1LT5hcmNoLmhwdGVfaGFzaF92cHRlX2xvbmcsCi0JCQkJICBBUlJBWV9TSVpFKHZjcHUtPmFyY2guaHB0ZV9oYXNoX3ZwdGVfbG9uZykpOworCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHUzcyA9IHRvX2Jvb2szcyh2Y3B1KTsKIAotCXNwaW5fbG9ja19pbml0KCZ2Y3B1LT5hcmNoLm1tdV9sb2NrKTsKKwkvKiBpbml0IGhwdGUgbG9va3VwIGhhc2hlcyAqLworCWt2bXBwY19tbXVfaHB0ZV9pbml0X2hhc2godmNwdTNzLT5ocHRlX2hhc2hfcHRlLAorCQkJCSAgQVJSQVlfU0laRSh2Y3B1M3MtPmhwdGVfaGFzaF9wdGUpKTsKKwlrdm1wcGNfbW11X2hwdGVfaW5pdF9oYXNoKHZjcHUzcy0+aHB0ZV9oYXNoX3B0ZV9sb25nLAorCQkJCSAgQVJSQVlfU0laRSh2Y3B1M3MtPmhwdGVfaGFzaF9wdGVfbG9uZykpOworCWt2bXBwY19tbXVfaHB0ZV9pbml0X2hhc2godmNwdTNzLT5ocHRlX2hhc2hfdnB0ZSwKKwkJCQkgIEFSUkFZX1NJWkUodmNwdTNzLT5ocHRlX2hhc2hfdnB0ZSkpOworCWt2bXBwY19tbXVfaHB0ZV9pbml0X2hhc2godmNwdTNzLT5ocHRlX2hhc2hfdnB0ZV9sb25nLAorCQkJCSAgQVJSQVlfU0laRSh2Y3B1M3MtPmhwdGVfaGFzaF92cHRlX2xvbmcpKTsKKworCXNwaW5fbG9ja19pbml0KCZ2Y3B1M3MtPm1tdV9sb2NrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcHIuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwZDNmMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByLmMKQEAgLTAsMCArMSwxMDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LiBTVVNFIExpbnV4IFByb2R1Y3RzIEdtYkguIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQXV0aG9yczoKKyAqICAgIEFsZXhhbmRlciBHcmFmIDxhZ3JhZkBzdXNlLmRlPgorICogICAgS2V2aW4gV29sZiA8bWFpbEBrZXZpbi13b2xmLmRlPgorICogICAgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BzYW1iYS5vcmc+CisgKgorICogRGVzY3JpcHRpb246CisgKiBGdW5jdGlvbnMgcmVsYXRpbmcgdG8gcnVubmluZyBLVk0gb24gQm9vayAzUyBwcm9jZXNzb3JzIHdoZXJlCisgKiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byBoeXBlcnZpc29yIG1vZGUsIGFuZCB3ZSBydW4gdGhlIGd1ZXN0CisgKiBpbiBwcm9ibGVtIHN0YXRlICh1c2VyIG1vZGUpLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYXJjaC9wb3dlcnBjL2t2bS80NHguYywKKyAqIGJ5IEhvbGxpcyBCbGFuY2hhcmQgPGhvbGxpc2JAdXMuaWJtLmNvbT4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGFzbS9yZWcuaD4KKyNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KKyNpbmNsdWRlIDxhc20va3ZtX2Jvb2szcy5oPgorI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKworI2luY2x1ZGUgInRyYWNlLmgiCisKKy8qICNkZWZpbmUgRVhJVF9ERUJVRyAqLworLyogI2RlZmluZSBERUJVR19FWFQgKi8KKworc3RhdGljIGludCBrdm1wcGNfaGFuZGxlX2V4dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGludCBleGl0X25yLAorCQkJICAgICB1bG9uZyBtc3IpOworCisvKiBTb21lIGNvbXBhdGliaWxpdHkgZGVmaW5lcyAqLworI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzMyCisjZGVmaW5lIE1TUl9VU0VSMzIgTVNSX1VTRVIKKyNkZWZpbmUgTVNSX1VTRVI2NCBNU1JfVVNFUgorI2RlZmluZSBIV19QQUdFX1NJWkUgUEFHRV9TSVpFCisjZW5kaWYKKwordm9pZCBrdm1wcGNfY29yZV92Y3B1X2xvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgY3B1KQoreworI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0CisJbWVtY3B5KHRvX3N2Y3B1KHZjcHUpLT5zbGIsIHRvX2Jvb2szcyh2Y3B1KS0+c2xiX3NoYWRvdywgc2l6ZW9mKHRvX3N2Y3B1KHZjcHUpLT5zbGIpKTsKKwltZW1jcHkoJmdldF9wYWNhKCktPnNoYWRvd192Y3B1LCB0b19ib29rM3ModmNwdSktPnNoYWRvd192Y3B1LAorCSAgICAgICBzaXplb2YoZ2V0X3BhY2EoKS0+c2hhZG93X3ZjcHUpKTsKKwl0b19zdmNwdSh2Y3B1KS0+c2xiX21heCA9IHRvX2Jvb2szcyh2Y3B1KS0+c2xiX3NoYWRvd19tYXg7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzMyCisJY3VycmVudC0+dGhyZWFkLmt2bV9zaGFkb3dfdmNwdSA9IHRvX2Jvb2szcyh2Y3B1KS0+c2hhZG93X3ZjcHU7CisjZW5kaWYKK30KKwordm9pZCBrdm1wcGNfY29yZV92Y3B1X3B1dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisjaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfNjQKKwltZW1jcHkodG9fYm9vazNzKHZjcHUpLT5zbGJfc2hhZG93LCB0b19zdmNwdSh2Y3B1KS0+c2xiLCBzaXplb2YodG9fc3ZjcHUodmNwdSktPnNsYikpOworCW1lbWNweSh0b19ib29rM3ModmNwdSktPnNoYWRvd192Y3B1LCAmZ2V0X3BhY2EoKS0+c2hhZG93X3ZjcHUsCisJICAgICAgIHNpemVvZihnZXRfcGFjYSgpLT5zaGFkb3dfdmNwdSkpOworCXRvX2Jvb2szcyh2Y3B1KS0+c2xiX3NoYWRvd19tYXggPSB0b19zdmNwdSh2Y3B1KS0+c2xiX21heDsKKyNlbmRpZgorCisJa3ZtcHBjX2dpdmV1cF9leHQodmNwdSwgTVNSX0ZQKTsKKwlrdm1wcGNfZ2l2ZXVwX2V4dCh2Y3B1LCBNU1JfVkVDKTsKKwlrdm1wcGNfZ2l2ZXVwX2V4dCh2Y3B1LCBNU1JfVlNYKTsKK30KKworc3RhdGljIHZvaWQga3ZtcHBjX3JlY2FsY19zaGFkb3dfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1bG9uZyBzbXNyID0gdmNwdS0+YXJjaC5zaGFyZWQtPm1zcjsKKworCS8qIEd1ZXN0IE1TUiB2YWx1ZXMgKi8KKwlzbXNyICY9IE1TUl9GRTAgfCBNU1JfRkUxIHwgTVNSX1NGIHwgTVNSX1NFIHwgTVNSX0JFIHwgTVNSX0RFOworCS8qIFByb2Nlc3MgTVNSIHZhbHVlcyAqLworCXNtc3IgfD0gTVNSX01FIHwgTVNSX1JJIHwgTVNSX0lSIHwgTVNSX0RSIHwgTVNSX1BSIHwgTVNSX0VFOworCS8qIEV4dGVybmFsIHByb3ZpZGVycyB0aGUgZ3Vlc3QgcmVzZXJ2ZWQgKi8KKwlzbXNyIHw9ICh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgdmNwdS0+YXJjaC5ndWVzdF9vd25lZF9leHQpOworCS8qIDY0LWJpdCBQcm9jZXNzIE1TUiB2YWx1ZXMgKi8KKyNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAorCXNtc3IgfD0gTVNSX0lTRiB8IE1TUl9IVjsKKyNlbmRpZgorCXZjcHUtPmFyY2guc2hhZG93X21zciA9IHNtc3I7Cit9CisKK3ZvaWQga3ZtcHBjX3NldF9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgbXNyKQoreworCXVsb25nIG9sZF9tc3IgPSB2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyOworCisjaWZkZWYgRVhJVF9ERUJVRworCXByaW50ayhLRVJOX0lORk8gIktWTTogU2V0IE1TUiB0byAweCVsbHhcbiIsIG1zcik7CisjZW5kaWYKKworCW1zciAmPSB0b19ib29rM3ModmNwdSktPm1zcl9tYXNrOworCXZjcHUtPmFyY2guc2hhcmVkLT5tc3IgPSBtc3I7CisJa3ZtcHBjX3JlY2FsY19zaGFkb3dfbXNyKHZjcHUpOworCisJaWYgKG1zciAmIE1TUl9QT1cpIHsKKwkJaWYgKCF2Y3B1LT5hcmNoLnBlbmRpbmdfZXhjZXB0aW9ucykgeworCQkJa3ZtX3ZjcHVfYmxvY2sodmNwdSk7CisJCQl2Y3B1LT5zdGF0LmhhbHRfd2FrZXVwKys7CisKKwkJCS8qIFVuc2V0IFBPVyBiaXQgYWZ0ZXIgd2Ugd29rZSB1cCAqLworCQkJbXNyICY9IH5NU1JfUE9XOworCQkJdmNwdS0+YXJjaC5zaGFyZWQtPm1zciA9IG1zcjsKKwkJfQorCX0KKworCWlmICgodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIChNU1JfUFJ8TVNSX0lSfE1TUl9EUikpICE9CisJCSAgIChvbGRfbXNyICYgKE1TUl9QUnxNU1JfSVJ8TVNSX0RSKSkpIHsKKwkJa3ZtcHBjX21tdV9mbHVzaF9zZWdtZW50cyh2Y3B1KTsKKwkJa3ZtcHBjX21tdV9tYXBfc2VnbWVudCh2Y3B1LCBrdm1wcGNfZ2V0X3BjKHZjcHUpKTsKKworCQkvKiBQcmVsb2FkIG1hZ2ljIHBhZ2Ugc2VnbWVudCB3aGVuIGluIGtlcm5lbCBtb2RlICovCisJCWlmICghKG1zciAmIE1TUl9QUikgJiYgdmNwdS0+YXJjaC5tYWdpY19wYWdlX3BhKSB7CisJCQlzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCAqYSA9ICZ2Y3B1LT5hcmNoOworCisJCQlpZiAobXNyICYgTVNSX0RSKQorCQkJCWt2bXBwY19tbXVfbWFwX3NlZ21lbnQodmNwdSwgYS0+bWFnaWNfcGFnZV9lYSk7CisJCQllbHNlCisJCQkJa3ZtcHBjX21tdV9tYXBfc2VnbWVudCh2Y3B1LCBhLT5tYWdpY19wYWdlX3BhKTsKKwkJfQorCX0KKworCS8qIFByZWxvYWQgRlBVIGlmIGl0J3MgZW5hYmxlZCAqLworCWlmICh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgTVNSX0ZQKQorCQlrdm1wcGNfaGFuZGxlX2V4dCh2Y3B1LCBCT09LM1NfSU5URVJSVVBUX0ZQX1VOQVZBSUwsIE1TUl9GUCk7Cit9CisKK3ZvaWQga3ZtcHBjX3NldF9wdnIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgcHZyKQoreworCXUzMiBob3N0X3B2cjsKKworCXZjcHUtPmFyY2guaGZsYWdzICY9IH5CT09LM1NfSEZMQUdfU0xCOworCXZjcHUtPmFyY2gucHZyID0gcHZyOworI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0CisJaWYgKChwdnIgPj0gMHgzMzAwMDApICYmIChwdnIgPCAweDcwMzMwMDAwKSkgeworCQlrdm1wcGNfbW11X2Jvb2szc182NF9pbml0KHZjcHUpOworCQl0b19ib29rM3ModmNwdSktPmhpb3IgPSAweGZmZjAwMDAwOworCQl0b19ib29rM3ModmNwdSktPm1zcl9tYXNrID0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMOworCX0gZWxzZQorI2VuZGlmCisJeworCQlrdm1wcGNfbW11X2Jvb2szc18zMl9pbml0KHZjcHUpOworCQl0b19ib29rM3ModmNwdSktPmhpb3IgPSAwOworCQl0b19ib29rM3ModmNwdSktPm1zcl9tYXNrID0gMHhmZmZmZmZmZlVMTDsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgaW4gaHlwZXJ2aXNvciBsZXZlbCBvbiA5NzAsIHdlIGNhbiB0ZWxsIHRoZSBDUFUgdG8KKwkgKiB0cmVhdCBEQ0JaIGFzIDMyIGJ5dGVzIHN0b3JlICovCisJdmNwdS0+YXJjaC5oZmxhZ3MgJj0gfkJPT0szU19IRkxBR19EQ0JaMzI7CisJaWYgKHZjcHUtPmFyY2gubW11LmlzX2RjYnozMih2Y3B1KSAmJiAobWZtc3IoKSAmIE1TUl9IVikgJiYKKwkgICAgIXN0cmNtcChjdXJfY3B1X3NwZWMtPnBsYXRmb3JtLCAicHBjOTcwIikpCisJCXZjcHUtPmFyY2guaGZsYWdzIHw9IEJPT0szU19IRkxBR19EQ0JaMzI7CisKKwkvKiBDZWxsIHBlcmZvcm1zIGJhZGx5IGlmIE1TUl9GRXggYXJlIHNldC4gU28gbGV0J3MgaG9wZSBub2JvZHkKKwkgICByZWFsbHkgbmVlZHMgdGhlbSBpbiBhIFZNIG9uIENlbGwgYW5kIGZvcmNlIGRpc2FibGUgdGhlbS4gKi8KKwlpZiAoIXN0cmNtcChjdXJfY3B1X3NwZWMtPnBsYXRmb3JtLCAicHBjLWNlbGwtYmUiKSkKKwkJdG9fYm9vazNzKHZjcHUpLT5tc3JfbWFzayAmPSB+KE1TUl9GRTAgfCBNU1JfRkUxKTsKKworI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzMyCisJLyogMzIgYml0IEJvb2szUyBhbHdheXMgaGFzIDMyIGJ5dGUgZGNieiAqLworCXZjcHUtPmFyY2guaGZsYWdzIHw9IEJPT0szU19IRkxBR19EQ0JaMzI7CisjZW5kaWYKKworCS8qIE9uIHNvbWUgQ1BVcyB3ZSBjYW4gZXhlY3V0ZSBwYWlyZWQgc2luZ2xlIG9wZXJhdGlvbnMgbmF0aXZlbHkgKi8KKwlhc20gKCAibWZwdnIgJTAiIDogIj1yIihob3N0X3B2cikpOworCXN3aXRjaCAoaG9zdF9wdnIpIHsKKwljYXNlIDB4MDAwODAyMDA6CS8qIGxvbmVzdGFyIDIuMCAqLworCWNhc2UgMHgwMDA4ODIwMjoJLyogbG9uZXN0YXIgMi4yICovCisJY2FzZSAweDcwMDAwMTAwOgkvKiBnZWtrbyAxLjAgKi8KKwljYXNlIDB4MDAwODAxMDA6CS8qIGdla2tvIDIuMCAqLworCWNhc2UgMHgwMDA4MzIwMzoJLyogZ2Vra28gMi4zYSAqLworCWNhc2UgMHgwMDA4MzIxMzoJLyogZ2Vra28gMi4zYiAqLworCWNhc2UgMHgwMDA4MzIwNDoJLyogZ2Vra28gMi40ICovCisJY2FzZSAweDAwMDgzMjE0OgkvKiBnZWtrbyAyLjRlICg4U0UpIC0gcmV0YWlsIEhXMiAqLworCWNhc2UgMHgwMDA4NzIwMDoJLyogYnJvYWR3YXkgKi8KKwkJdmNwdS0+YXJjaC5oZmxhZ3MgfD0gQk9PSzNTX0hGTEFHX05BVElWRV9QUzsKKwkJLyogRW5hYmxlIEhJRDIuUFNFIC0gaW4gY2FzZSB3ZSBuZWVkIGl0IGxhdGVyICovCisJCW10c3ByKFNQUk5fSElEMl9HRUtLTywgbWZzcHIoU1BSTl9ISUQyX0dFS0tPKSB8ICgxIDw8IDI5KSk7CisJfQorfQorCisvKiBCb29rM3NfMzIgQ1BVcyBhbHdheXMgaGF2ZSAzMiBieXRlcyBjYWNoZSBsaW5lIHNpemUsIHdoaWNoIExpbnV4IGFzc3VtZXMuIFRvCisgKiBtYWtlIEJvb2szc18zMiBMaW51eCB3b3JrIG9uIEJvb2szc182NCwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgd2UgdHJhcCBkY2J6IHRvCisgKiBlbXVsYXRlIDMyIGJ5dGVzIGRjYnogbGVuZ3RoLgorICoKKyAqIFRoZSBCb29rM3NfNjQgaW52ZW50b3JzIGFsc28gcmVhbGl6ZWQgdGhpcyBjYXNlIGFuZCBpbXBsZW1lbnRlZCBhIHNwZWNpYWwgYml0CisgKiBpbiB0aGUgSElENSByZWdpc3Rlciwgd2hpY2ggaXMgYSBoeXBlcnZpc29yIHJlc3NvdXJjZS4gVGh1cyB3ZSBjYW4ndCB1c2UgaXQuCisgKgorICogTXkgYXBwcm9hY2ggaGVyZSBpcyB0byBwYXRjaCB0aGUgZGNieiBpbnN0cnVjdGlvbiBvbiBleGVjdXRpbmcgcGFnZXMuCisgKi8KK3N0YXRpYyB2b2lkIGt2bXBwY19wYXRjaF9kY2J6KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bXBwY19wdGUgKnB0ZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqaHBhZ2U7CisJdTY0IGhwYWdlX29mZnNldDsKKwl1MzIgKnBhZ2U7CisJaW50IGk7CisKKwlocGFnZSA9IGdmbl90b19wYWdlKHZjcHUtPmt2bSwgcHRlLT5yYWRkciA+PiBQQUdFX1NISUZUKTsKKwlpZiAoaXNfZXJyb3JfcGFnZShocGFnZSkpIHsKKwkJa3ZtX3JlbGVhc2VfcGFnZV9jbGVhbihocGFnZSk7CisJCXJldHVybjsKKwl9CisKKwlocGFnZV9vZmZzZXQgPSBwdGUtPnJhZGRyICYgflBBR0VfTUFTSzsKKwlocGFnZV9vZmZzZXQgJj0gfjB4RkZGVUxMOworCWhwYWdlX29mZnNldCAvPSA0OworCisJZ2V0X3BhZ2UoaHBhZ2UpOworCXBhZ2UgPSBrbWFwX2F0b21pYyhocGFnZSwgS01fVVNFUjApOworCisJLyogcGF0Y2ggZGNieiBpbnRvIHJlc2VydmVkIGluc3RydWN0aW9uLCBzbyB3ZSB0cmFwICovCisJZm9yIChpPWhwYWdlX29mZnNldDsgaSA8IGhwYWdlX29mZnNldCArIChIV19QQUdFX1NJWkUgLyA0KTsgaSsrKQorCQlpZiAoKHBhZ2VbaV0gJiAweGZmMDAwN2ZmKSA9PSBJTlNfRENCWikKKwkJCXBhZ2VbaV0gJj0gMHhmZmZmZmZmNzsKKworCWt1bm1hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCXB1dF9wYWdlKGhwYWdlKTsKK30KKworc3RhdGljIGludCBrdm1wcGNfdmlzaWJsZV9nZm4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBnZm4pCit7CisJdWxvbmcgbXBfcGEgPSB2Y3B1LT5hcmNoLm1hZ2ljX3BhZ2VfcGE7CisKKwlpZiAodW5saWtlbHkobXBfcGEpICYmCisJICAgIHVubGlrZWx5KChtcF9wYSAmIEtWTV9QQU0pID4+IFBBR0VfU0hJRlQgPT0gZ2ZuKSkgeworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4ga3ZtX2lzX3Zpc2libGVfZ2ZuKHZjcHUtPmt2bSwgZ2ZuKTsKK30KKworaW50IGt2bXBwY19oYW5kbGVfcGFnZWZhdWx0KHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSAgICB1bG9uZyBlYWRkciwgaW50IHZlYykKK3sKKwlib29sIGRhdGEgPSAodmVjID09IEJPT0szU19JTlRFUlJVUFRfREFUQV9TVE9SQUdFKTsKKwlpbnQgciA9IFJFU1VNRV9HVUVTVDsKKwlpbnQgcmVsb2NhdGVkOworCWludCBwYWdlX2ZvdW5kID0gMDsKKwlzdHJ1Y3Qga3ZtcHBjX3B0ZSBwdGU7CisJYm9vbCBpc19tbWlvID0gZmFsc2U7CisJYm9vbCBkciA9ICh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgTVNSX0RSKSA/IHRydWUgOiBmYWxzZTsKKwlib29sIGlyID0gKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfSVIpID8gdHJ1ZSA6IGZhbHNlOworCXU2NCB2c2lkOworCisJcmVsb2NhdGVkID0gZGF0YSA/IGRyIDogaXI7CisKKwkvKiBSZXNvbHZlIHJlYWwgYWRkcmVzcyBpZiB0cmFuc2xhdGlvbiB0dXJuZWQgb24gKi8KKwlpZiAocmVsb2NhdGVkKSB7CisJCXBhZ2VfZm91bmQgPSB2Y3B1LT5hcmNoLm1tdS54bGF0ZSh2Y3B1LCBlYWRkciwgJnB0ZSwgZGF0YSk7CisJfSBlbHNlIHsKKwkJcHRlLm1heV9leGVjdXRlID0gdHJ1ZTsKKwkJcHRlLm1heV9yZWFkID0gdHJ1ZTsKKwkJcHRlLm1heV93cml0ZSA9IHRydWU7CisJCXB0ZS5yYWRkciA9IGVhZGRyICYgS1ZNX1BBTTsKKwkJcHRlLmVhZGRyID0gZWFkZHI7CisJCXB0ZS52cGFnZSA9IGVhZGRyID4+IDEyOworCX0KKworCXN3aXRjaCAodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIChNU1JfRFJ8TVNSX0lSKSkgeworCWNhc2UgMDoKKwkJcHRlLnZwYWdlIHw9ICgodTY0KVZTSURfUkVBTCA8PCAoU0lEX1NISUZUIC0gMTIpKTsKKwkJYnJlYWs7CisJY2FzZSBNU1JfRFI6CisJY2FzZSBNU1JfSVI6CisJCXZjcHUtPmFyY2gubW11LmVzaWRfdG9fdnNpZCh2Y3B1LCBlYWRkciA+PiBTSURfU0hJRlQsICZ2c2lkKTsKKworCQlpZiAoKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiAoTVNSX0RSfE1TUl9JUikpID09IE1TUl9EUikKKwkJCXB0ZS52cGFnZSB8PSAoKHU2NClWU0lEX1JFQUxfRFIgPDwgKFNJRF9TSElGVCAtIDEyKSk7CisJCWVsc2UKKwkJCXB0ZS52cGFnZSB8PSAoKHU2NClWU0lEX1JFQUxfSVIgPDwgKFNJRF9TSElGVCAtIDEyKSk7CisJCXB0ZS52cGFnZSB8PSB2c2lkOworCisJCWlmICh2c2lkID09IC0xKQorCQkJcGFnZV9mb3VuZCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWlmICh2Y3B1LT5hcmNoLm1tdS5pc19kY2J6MzIodmNwdSkgJiYKKwkgICAoISh2Y3B1LT5hcmNoLmhmbGFncyAmIEJPT0szU19IRkxBR19EQ0JaMzIpKSkgeworCQkvKgorCQkgKiBJZiB3ZSBkbyB0aGUgZGNieiBoYWNrLCB3ZSBoYXZlIHRvIE5YIG9uIGV2ZXJ5IGV4ZWN1dGlvbiwKKwkJICogc28gd2UgY2FuIHBhdGNoIHRoZSBleGVjdXRpbmcgY29kZS4gVGhpcyByZW5kZXJzIG91ciBndWVzdAorCQkgKiBOWC1sZXNzLgorCQkgKi8KKwkJcHRlLm1heV9leGVjdXRlID0gIWRhdGE7CisJfQorCisJaWYgKHBhZ2VfZm91bmQgPT0gLUVOT0VOVCkgeworCQkvKiBQYWdlIG5vdCBmb3VuZCBpbiBndWVzdCBQVEUgZW50cmllcyAqLworCQl2Y3B1LT5hcmNoLnNoYXJlZC0+ZGFyID0ga3ZtcHBjX2dldF9mYXVsdF9kYXIodmNwdSk7CisJCXZjcHUtPmFyY2guc2hhcmVkLT5kc2lzciA9IHRvX3N2Y3B1KHZjcHUpLT5mYXVsdF9kc2lzcjsKKwkJdmNwdS0+YXJjaC5zaGFyZWQtPm1zciB8PQorCQkJKHRvX3N2Y3B1KHZjcHUpLT5zaGFkb3dfc3JyMSAmIDB4MDAwMDAwMDBmODAwMDAwMFVMTCk7CisJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LCB2ZWMpOworCX0gZWxzZSBpZiAocGFnZV9mb3VuZCA9PSAtRVBFUk0pIHsKKwkJLyogU3RvcmFnZSBwcm90ZWN0aW9uICovCisJCXZjcHUtPmFyY2guc2hhcmVkLT5kYXIgPSBrdm1wcGNfZ2V0X2ZhdWx0X2Rhcih2Y3B1KTsKKwkJdmNwdS0+YXJjaC5zaGFyZWQtPmRzaXNyID0KKwkJCXRvX3N2Y3B1KHZjcHUpLT5mYXVsdF9kc2lzciAmIH5EU0lTUl9OT0hQVEU7CisJCXZjcHUtPmFyY2guc2hhcmVkLT5kc2lzciB8PSBEU0lTUl9QUk9URkFVTFQ7CisJCXZjcHUtPmFyY2guc2hhcmVkLT5tc3IgfD0KKwkJCSh0b19zdmNwdSh2Y3B1KS0+c2hhZG93X3NycjEgJiAweDAwMDAwMDAwZjgwMDAwMDBVTEwpOworCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgdmVjKTsKKwl9IGVsc2UgaWYgKHBhZ2VfZm91bmQgPT0gLUVJTlZBTCkgeworCQkvKiBQYWdlIG5vdCBmb3VuZCBpbiBndWVzdCBTTEIgKi8KKwkJdmNwdS0+YXJjaC5zaGFyZWQtPmRhciA9IGt2bXBwY19nZXRfZmF1bHRfZGFyKHZjcHUpOworCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgdmVjICsgMHg4MCk7CisJfSBlbHNlIGlmICghaXNfbW1pbyAmJgorCQkgICBrdm1wcGNfdmlzaWJsZV9nZm4odmNwdSwgcHRlLnJhZGRyID4+IFBBR0VfU0hJRlQpKSB7CisJCS8qIFRoZSBndWVzdCdzIFBURSBpcyBub3QgbWFwcGVkIHlldC4gTWFwIG9uIHRoZSBob3N0ICovCisJCWt2bXBwY19tbXVfbWFwX3BhZ2UodmNwdSwgJnB0ZSk7CisJCWlmIChkYXRhKQorCQkJdmNwdS0+c3RhdC5zcF9zdG9yYWdlKys7CisJCWVsc2UgaWYgKHZjcHUtPmFyY2gubW11LmlzX2RjYnozMih2Y3B1KSAmJgorCQkJKCEodmNwdS0+YXJjaC5oZmxhZ3MgJiBCT09LM1NfSEZMQUdfRENCWjMyKSkpCisJCQlrdm1wcGNfcGF0Y2hfZGNieih2Y3B1LCAmcHRlKTsKKwl9IGVsc2UgeworCQkvKiBNTUlPICovCisJCXZjcHUtPnN0YXQubW1pb19leGl0cysrOworCQl2Y3B1LT5hcmNoLnBhZGRyX2FjY2Vzc2VkID0gcHRlLnJhZGRyOworCQlyID0ga3ZtcHBjX2VtdWxhdGVfbW1pbyhydW4sIHZjcHUpOworCQlpZiAoIHIgPT0gUkVTVU1FX0hPU1RfTlYgKQorCQkJciA9IFJFU1VNRV9IT1NUOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfZnByX2luZGV4KGludCBpKQoreworI2lmZGVmIENPTkZJR19WU1gKKwlpICo9IDI7CisjZW5kaWYKKwlyZXR1cm4gaTsKK30KKworLyogR2l2ZSB1cCBleHRlcm5hbCBwcm92aWRlciAoRlBVLCBBbHRpdmVjLCBWU1gpICovCit2b2lkIGt2bXBwY19naXZldXBfZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgbXNyKQoreworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0ID0gJmN1cnJlbnQtPnRocmVhZDsKKwl1NjQgKnZjcHVfZnByID0gdmNwdS0+YXJjaC5mcHI7CisjaWZkZWYgQ09ORklHX1ZTWAorCXU2NCAqdmNwdV92c3ggPSB2Y3B1LT5hcmNoLnZzcjsKKyNlbmRpZgorCXU2NCAqdGhyZWFkX2ZwciA9ICh1NjQqKXQtPmZwcjsKKwlpbnQgaTsKKworCWlmICghKHZjcHUtPmFyY2guZ3Vlc3Rfb3duZWRfZXh0ICYgbXNyKSkKKwkJcmV0dXJuOworCisjaWZkZWYgREVCVUdfRVhUCisJcHJpbnRrKEtFUk5fSU5GTyAiR2l2aW5nIHVwIGV4dCAweCVseFxuIiwgbXNyKTsKKyNlbmRpZgorCisJc3dpdGNoIChtc3IpIHsKKwljYXNlIE1TUl9GUDoKKwkJZ2l2ZXVwX2ZwdShjdXJyZW50KTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmNwdS0+YXJjaC5mcHIpOyBpKyspCisJCQl2Y3B1X2ZwcltpXSA9IHRocmVhZF9mcHJbZ2V0X2Zwcl9pbmRleChpKV07CisKKwkJdmNwdS0+YXJjaC5mcHNjciA9IHQtPmZwc2NyLnZhbDsKKwkJYnJlYWs7CisJY2FzZSBNU1JfVkVDOgorI2lmZGVmIENPTkZJR19BTFRJVkVDCisJCWdpdmV1cF9hbHRpdmVjKGN1cnJlbnQpOworCQltZW1jcHkodmNwdS0+YXJjaC52ciwgdC0+dnIsIHNpemVvZih2Y3B1LT5hcmNoLnZyKSk7CisJCXZjcHUtPmFyY2gudnNjciA9IHQtPnZzY3I7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBNU1JfVlNYOgorI2lmZGVmIENPTkZJR19WU1gKKwkJX19naXZldXBfdnN4KGN1cnJlbnQpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2Y3B1LT5hcmNoLnZzcik7IGkrKykKKwkJCXZjcHVfdnN4W2ldID0gdGhyZWFkX2ZwcltnZXRfZnByX2luZGV4KGkpICsgMV07CisjZW5kaWYKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJdmNwdS0+YXJjaC5ndWVzdF9vd25lZF9leHQgJj0gfm1zcjsKKwljdXJyZW50LT50aHJlYWQucmVncy0+bXNyICY9IH5tc3I7CisJa3ZtcHBjX3JlY2FsY19zaGFkb3dfbXNyKHZjcHUpOworfQorCitzdGF0aWMgaW50IGt2bXBwY19yZWFkX2luc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXVsb25nIHNycjAgPSBrdm1wcGNfZ2V0X3BjKHZjcHUpOworCXUzMiBsYXN0X2luc3QgPSBrdm1wcGNfZ2V0X2xhc3RfaW5zdCh2Y3B1KTsKKwlpbnQgcmV0OworCisJcmV0ID0ga3ZtcHBjX2xkKHZjcHUsICZzcnIwLCBzaXplb2YodTMyKSwgJmxhc3RfaW5zdCwgZmFsc2UpOworCWlmIChyZXQgPT0gLUVOT0VOVCkgeworCQl1bG9uZyBtc3IgPSB2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyOworCisJCW1zciA9IGt2bXBwY19zZXRfZmllbGQobXNyLCAzMywgMzMsIDEpOworCQltc3IgPSBrdm1wcGNfc2V0X2ZpZWxkKG1zciwgMzQsIDM2LCAwKTsKKwkJdmNwdS0+YXJjaC5zaGFyZWQtPm1zciA9IGt2bXBwY19zZXRfZmllbGQobXNyLCA0MiwgNDcsIDApOworCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgQk9PSzNTX0lOVEVSUlVQVF9JTlNUX1NUT1JBR0UpOworCQlyZXR1cm4gRU1VTEFURV9BR0FJTjsKKwl9CisKKwlyZXR1cm4gRU1VTEFURV9ET05FOworfQorCitzdGF0aWMgaW50IGt2bXBwY19jaGVja19leHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBpbnQgZXhpdF9ucikKK3sKKworCS8qIE5lZWQgdG8gZG8gcGFpcmVkIHNpbmdsZSBlbXVsYXRpb24/ICovCisJaWYgKCEodmNwdS0+YXJjaC5oZmxhZ3MgJiBCT09LM1NfSEZMQUdfUEFJUkVEX1NJTkdMRSkpCisJCXJldHVybiBFTVVMQVRFX0RPTkU7CisKKwkvKiBSZWFkIG91dCB0aGUgaW5zdHJ1Y3Rpb24gKi8KKwlpZiAoa3ZtcHBjX3JlYWRfaW5zdCh2Y3B1KSA9PSBFTVVMQVRFX0RPTkUpCisJCS8qIE5lZWQgdG8gZW11bGF0ZSAqLworCQlyZXR1cm4gRU1VTEFURV9GQUlMOworCisJcmV0dXJuIEVNVUxBVEVfQUdBSU47Cit9CisKKy8qIEhhbmRsZSBleHRlcm5hbCBwcm92aWRlcnMgKEZQVSwgQWx0aXZlYywgVlNYKSAqLworc3RhdGljIGludCBrdm1wcGNfaGFuZGxlX2V4dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGludCBleGl0X25yLAorCQkJICAgICB1bG9uZyBtc3IpCit7CisJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQgPSAmY3VycmVudC0+dGhyZWFkOworCXU2NCAqdmNwdV9mcHIgPSB2Y3B1LT5hcmNoLmZwcjsKKyNpZmRlZiBDT05GSUdfVlNYCisJdTY0ICp2Y3B1X3ZzeCA9IHZjcHUtPmFyY2gudnNyOworI2VuZGlmCisJdTY0ICp0aHJlYWRfZnByID0gKHU2NCopdC0+ZnByOworCWludCBpOworCisJLyogV2hlbiB3ZSBoYXZlIHBhaXJlZCBzaW5nbGVzLCB3ZSBlbXVsYXRlIGluIHNvZnR3YXJlICovCisJaWYgKHZjcHUtPmFyY2guaGZsYWdzICYgQk9PSzNTX0hGTEFHX1BBSVJFRF9TSU5HTEUpCisJCXJldHVybiBSRVNVTUVfR1VFU1Q7CisKKwlpZiAoISh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgbXNyKSkgeworCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgZXhpdF9ucik7CisJCXJldHVybiBSRVNVTUVfR1VFU1Q7CisJfQorCisJLyogV2UgYWxyZWFkeSBvd24gdGhlIGV4dCAqLworCWlmICh2Y3B1LT5hcmNoLmd1ZXN0X293bmVkX2V4dCAmIG1zcikgeworCQlyZXR1cm4gUkVTVU1FX0dVRVNUOworCX0KKworI2lmZGVmIERFQlVHX0VYVAorCXByaW50ayhLRVJOX0lORk8gIkxvYWRpbmcgdXAgZXh0IDB4JWx4XG4iLCBtc3IpOworI2VuZGlmCisKKwljdXJyZW50LT50aHJlYWQucmVncy0+bXNyIHw9IG1zcjsKKworCXN3aXRjaCAobXNyKSB7CisJY2FzZSBNU1JfRlA6CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZjcHUtPmFyY2guZnByKTsgaSsrKQorCQkJdGhyZWFkX2ZwcltnZXRfZnByX2luZGV4KGkpXSA9IHZjcHVfZnByW2ldOworCisJCXQtPmZwc2NyLnZhbCA9IHZjcHUtPmFyY2guZnBzY3I7CisJCXQtPmZwZXhjX21vZGUgPSAwOworCQlrdm1wcGNfbG9hZF91cF9mcHUoKTsKKwkJYnJlYWs7CisJY2FzZSBNU1JfVkVDOgorI2lmZGVmIENPTkZJR19BTFRJVkVDCisJCW1lbWNweSh0LT52ciwgdmNwdS0+YXJjaC52ciwgc2l6ZW9mKHZjcHUtPmFyY2gudnIpKTsKKwkJdC0+dnNjciA9IHZjcHUtPmFyY2gudnNjcjsKKwkJdC0+dnJzYXZlID0gLTE7CisJCWt2bXBwY19sb2FkX3VwX2FsdGl2ZWMoKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIE1TUl9WU1g6CisjaWZkZWYgQ09ORklHX1ZTWAorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2Y3B1LT5hcmNoLnZzcik7IGkrKykKKwkJCXRocmVhZF9mcHJbZ2V0X2Zwcl9pbmRleChpKSArIDFdID0gdmNwdV92c3hbaV07CisJCWt2bXBwY19sb2FkX3VwX3ZzeCgpOworI2VuZGlmCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCXZjcHUtPmFyY2guZ3Vlc3Rfb3duZWRfZXh0IHw9IG1zcjsKKworCWt2bXBwY19yZWNhbGNfc2hhZG93X21zcih2Y3B1KTsKKworCXJldHVybiBSRVNVTUVfR1VFU1Q7Cit9CisKK2ludCBrdm1wcGNfaGFuZGxlX2V4aXQoc3RydWN0IGt2bV9ydW4gKnJ1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZXhpdF9ucikKK3sKKwlpbnQgciA9IFJFU1VNRV9IT1NUOworCisJdmNwdS0+c3RhdC5zdW1fZXhpdHMrKzsKKworCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9VTktOT1dOOworCXJ1bi0+cmVhZHlfZm9yX2ludGVycnVwdF9pbmplY3Rpb24gPSAxOworCisJdHJhY2Vfa3ZtX2Jvb2szc19leGl0KGV4aXRfbnIsIHZjcHUpOworCWt2bV9yZXNjaGVkKHZjcHUpOworCXN3aXRjaCAoZXhpdF9ucikgeworCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9JTlNUX1NUT1JBR0U6CisJCXZjcHUtPnN0YXQucGZfaW5zdHJ1YysrOworCisjaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfMzIKKwkJLyogV2Ugc2V0IHNlZ21lbnRzIGFzIHVudXNlZCBzZWdtZW50cyB3aGVuIGludmFsaWRhdGluZyB0aGVtLiBTbworCQkgKiB0cmVhdCB0aGUgcmVzcGVjdGl2ZSBmYXVsdCBhcyBzZWdtZW50IGZhdWx0LiAqLworCQlpZiAodG9fc3ZjcHUodmNwdSktPnNyW2t2bXBwY19nZXRfcGModmNwdSkgPj4gU0lEX1NISUZUXQorCQkgICAgPT0gU1JfSU5WQUxJRCkgeworCQkJa3ZtcHBjX21tdV9tYXBfc2VnbWVudCh2Y3B1LCBrdm1wcGNfZ2V0X3BjKHZjcHUpKTsKKwkJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJLyogb25seSBjYXJlIGFib3V0IFBURUcgbm90IGZvdW5kIGVycm9ycywgYnV0IGxlYXZlIE5YIGFsb25lICovCisJCWlmICh0b19zdmNwdSh2Y3B1KS0+c2hhZG93X3NycjEgJiAweDQwMDAwMDAwKSB7CisJCQlyID0ga3ZtcHBjX2hhbmRsZV9wYWdlZmF1bHQocnVuLCB2Y3B1LCBrdm1wcGNfZ2V0X3BjKHZjcHUpLCBleGl0X25yKTsKKwkJCXZjcHUtPnN0YXQuc3BfaW5zdHJ1YysrOworCQl9IGVsc2UgaWYgKHZjcHUtPmFyY2gubW11LmlzX2RjYnozMih2Y3B1KSAmJgorCQkJICAoISh2Y3B1LT5hcmNoLmhmbGFncyAmIEJPT0szU19IRkxBR19EQ0JaMzIpKSkgeworCQkJLyoKKwkJCSAqIFhYWCBJZiB3ZSBkbyB0aGUgZGNieiBoYWNrIHdlIHVzZSB0aGUgTlggYml0IHRvIGZsdXNoJnBhdGNoIHRoZSBwYWdlLAorCQkJICogICAgIHNvIHdlIGNhbid0IHVzZSB0aGUgTlggYml0IGluc2lkZSB0aGUgZ3Vlc3QuIExldCdzIGNyb3NzIG91ciBmaW5nZXJzLAorCQkJICogICAgIHRoYXQgbm8gZ3Vlc3QgdGhhdCBuZWVkcyB0aGUgZGNieiBoYWNrIGRvZXMgTlguCisJCQkgKi8KKwkJCWt2bXBwY19tbXVfcHRlX2ZsdXNoKHZjcHUsIGt2bXBwY19nZXRfcGModmNwdSksIH4weEZGRlVMKTsKKwkJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCX0gZWxzZSB7CisJCQl2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyIHw9CisJCQkJdG9fc3ZjcHUodmNwdSktPnNoYWRvd19zcnIxICYgMHg1ODAwMDAwMDsKKwkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LCBleGl0X25yKTsKKwkJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX0RBVEFfU1RPUkFHRToKKwl7CisJCXVsb25nIGRhciA9IGt2bXBwY19nZXRfZmF1bHRfZGFyKHZjcHUpOworCQl2Y3B1LT5zdGF0LnBmX3N0b3JhZ2UrKzsKKworI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzMyCisJCS8qIFdlIHNldCBzZWdtZW50cyBhcyB1bnVzZWQgc2VnbWVudHMgd2hlbiBpbnZhbGlkYXRpbmcgdGhlbS4gU28KKwkJICogdHJlYXQgdGhlIHJlc3BlY3RpdmUgZmF1bHQgYXMgc2VnbWVudCBmYXVsdC4gKi8KKwkJaWYgKCh0b19zdmNwdSh2Y3B1KS0+c3JbZGFyID4+IFNJRF9TSElGVF0pID09IFNSX0lOVkFMSUQpIHsKKwkJCWt2bXBwY19tbXVfbWFwX3NlZ21lbnQodmNwdSwgZGFyKTsKKwkJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJLyogVGhlIG9ubHkgY2FzZSB3ZSBuZWVkIHRvIGhhbmRsZSBpcyBtaXNzaW5nIHNoYWRvdyBQVEVzICovCisJCWlmICh0b19zdmNwdSh2Y3B1KS0+ZmF1bHRfZHNpc3IgJiBEU0lTUl9OT0hQVEUpIHsKKwkJCXIgPSBrdm1wcGNfaGFuZGxlX3BhZ2VmYXVsdChydW4sIHZjcHUsIGRhciwgZXhpdF9ucik7CisJCX0gZWxzZSB7CisJCQl2Y3B1LT5hcmNoLnNoYXJlZC0+ZGFyID0gZGFyOworCQkJdmNwdS0+YXJjaC5zaGFyZWQtPmRzaXNyID0gdG9fc3ZjcHUodmNwdSktPmZhdWx0X2RzaXNyOworCQkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsIGV4aXRfbnIpOworCQkJciA9IFJFU1VNRV9HVUVTVDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX0RBVEFfU0VHTUVOVDoKKwkJaWYgKGt2bXBwY19tbXVfbWFwX3NlZ21lbnQodmNwdSwga3ZtcHBjX2dldF9mYXVsdF9kYXIodmNwdSkpIDwgMCkgeworCQkJdmNwdS0+YXJjaC5zaGFyZWQtPmRhciA9IGt2bXBwY19nZXRfZmF1bHRfZGFyKHZjcHUpOworCQkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsCisJCQkJQk9PSzNTX0lOVEVSUlVQVF9EQVRBX1NFR01FTlQpOworCQl9CisJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCWJyZWFrOworCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9JTlNUX1NFR01FTlQ6CisJCWlmIChrdm1wcGNfbW11X21hcF9zZWdtZW50KHZjcHUsIGt2bXBwY19nZXRfcGModmNwdSkpIDwgMCkgeworCQkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsCisJCQkJQk9PSzNTX0lOVEVSUlVQVF9JTlNUX1NFR01FTlQpOworCQl9CisJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCWJyZWFrOworCS8qIFdlJ3JlIGdvb2Qgb24gdGhlc2UgLSB0aGUgaG9zdCBtZXJlbHkgd2FudGVkIHRvIGdldCBvdXIgYXR0ZW50aW9uICovCisJY2FzZSBCT09LM1NfSU5URVJSVVBUX0RFQ1JFTUVOVEVSOgorCQl2Y3B1LT5zdGF0LmRlY19leGl0cysrOworCQlyID0gUkVTVU1FX0dVRVNUOworCQlicmVhazsKKwljYXNlIEJPT0szU19JTlRFUlJVUFRfRVhURVJOQUw6CisJCXZjcHUtPnN0YXQuZXh0X2ludHJfZXhpdHMrKzsKKwkJciA9IFJFU1VNRV9HVUVTVDsKKwkJYnJlYWs7CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX1BFUkZNT046CisJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCWJyZWFrOworCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9QUk9HUkFNOgorCXsKKwkJZW51bSBlbXVsYXRpb25fcmVzdWx0IGVyOworCQl1bG9uZyBmbGFnczsKKworcHJvZ3JhbV9pbnRlcnJ1cHQ6CisJCWZsYWdzID0gdG9fc3ZjcHUodmNwdSktPnNoYWRvd19zcnIxICYgMHgxZjAwMDB1bGw7CisKKwkJaWYgKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfUFIpIHsKKyNpZmRlZiBFWElUX0RFQlVHCisJCQlwcmludGsoS0VSTl9JTkZPICJVc2Vyc3BhY2UgdHJpZ2dlcmVkIDB4NzAwIGV4Y2VwdGlvbiBhdCAweCVseCAoMHgleClcbiIsIGt2bXBwY19nZXRfcGModmNwdSksIGt2bXBwY19nZXRfbGFzdF9pbnN0KHZjcHUpKTsKKyNlbmRpZgorCQkJaWYgKChrdm1wcGNfZ2V0X2xhc3RfaW5zdCh2Y3B1KSAmIDB4ZmYwMDA3ZmYpICE9CisJCQkgICAgKElOU19EQ0JaICYgMHhmZmZmZmZmNykpIHsKKwkJCQlrdm1wcGNfY29yZV9xdWV1ZV9wcm9ncmFtKHZjcHUsIGZsYWdzKTsKKwkJCQlyID0gUkVTVU1FX0dVRVNUOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJdmNwdS0+c3RhdC5lbXVsYXRlZF9pbnN0X2V4aXRzKys7CisJCWVyID0ga3ZtcHBjX2VtdWxhdGVfaW5zdHJ1Y3Rpb24ocnVuLCB2Y3B1KTsKKwkJc3dpdGNoIChlcikgeworCQljYXNlIEVNVUxBVEVfRE9ORToKKwkJCXIgPSBSRVNVTUVfR1VFU1RfTlY7CisJCQlicmVhazsKKwkJY2FzZSBFTVVMQVRFX0FHQUlOOgorCQkJciA9IFJFU1VNRV9HVUVTVDsKKwkJCWJyZWFrOworCQljYXNlIEVNVUxBVEVfRkFJTDoKKwkJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBlbXVsYXRpb24gYXQgJWx4IGZhaWxlZCAoJTA4eClcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGt2bXBwY19nZXRfcGModmNwdSksIGt2bXBwY19nZXRfbGFzdF9pbnN0KHZjcHUpKTsKKwkJCWt2bXBwY19jb3JlX3F1ZXVlX3Byb2dyYW0odmNwdSwgZmxhZ3MpOworCQkJciA9IFJFU1VNRV9HVUVTVDsKKwkJCWJyZWFrOworCQljYXNlIEVNVUxBVEVfRE9fTU1JTzoKKwkJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9NTUlPOworCQkJciA9IFJFU1VNRV9IT1NUX05WOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX1NZU0NBTEw6CisJCWlmICh2Y3B1LT5hcmNoLm9zaV9lbmFibGVkICYmCisJCSAgICAoKCh1MzIpa3ZtcHBjX2dldF9ncHIodmNwdSwgMykpID09IE9TSV9TQ19NQUdJQ19SMykgJiYKKwkJICAgICgoKHUzMilrdm1wcGNfZ2V0X2dwcih2Y3B1LCA0KSkgPT0gT1NJX1NDX01BR0lDX1I0KSkgeworCQkJLyogTU9MIGh5cGVyY2FsbHMgKi8KKwkJCXU2NCAqZ3BycyA9IHJ1bi0+b3NpLmdwcnM7CisJCQlpbnQgaTsKKworCQkJcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX09TSTsKKwkJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQkJCWdwcnNbaV0gPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCBpKTsKKwkJCXZjcHUtPmFyY2gub3NpX25lZWRlZCA9IDE7CisJCQlyID0gUkVTVU1FX0hPU1RfTlY7CisJCX0gZWxzZSBpZiAoISh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgTVNSX1BSKSAmJgorCQkgICAgKCgodTMyKWt2bXBwY19nZXRfZ3ByKHZjcHUsIDApKSA9PSBLVk1fU0NfTUFHSUNfUjApKSB7CisJCQkvKiBLVk0gUFYgaHlwZXJjYWxscyAqLworCQkJa3ZtcHBjX3NldF9ncHIodmNwdSwgMywga3ZtcHBjX2t2bV9wdih2Y3B1KSk7CisJCQlyID0gUkVTVU1FX0dVRVNUOworCQl9IGVsc2UgeworCQkJLyogR3Vlc3Qgc3lzY2FsbHMgKi8KKwkJCXZjcHUtPnN0YXQuc3lzY2FsbF9leGl0cysrOworCQkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsIGV4aXRfbnIpOworCQkJciA9IFJFU1VNRV9HVUVTVDsKKwkJfQorCQlicmVhazsKKwljYXNlIEJPT0szU19JTlRFUlJVUFRfRlBfVU5BVkFJTDoKKwljYXNlIEJPT0szU19JTlRFUlJVUFRfQUxUSVZFQzoKKwljYXNlIEJPT0szU19JTlRFUlJVUFRfVlNYOgorCXsKKwkJaW50IGV4dF9tc3IgPSAwOworCisJCXN3aXRjaCAoZXhpdF9ucikgeworCQljYXNlIEJPT0szU19JTlRFUlJVUFRfRlBfVU5BVkFJTDogZXh0X21zciA9IE1TUl9GUDsgIGJyZWFrOworCQljYXNlIEJPT0szU19JTlRFUlJVUFRfQUxUSVZFQzogICAgZXh0X21zciA9IE1TUl9WRUM7IGJyZWFrOworCQljYXNlIEJPT0szU19JTlRFUlJVUFRfVlNYOiAgICAgICAgZXh0X21zciA9IE1TUl9WU1g7IGJyZWFrOworCQl9CisKKwkJc3dpdGNoIChrdm1wcGNfY2hlY2tfZXh0KHZjcHUsIGV4aXRfbnIpKSB7CisJCWNhc2UgRU1VTEFURV9ET05FOgorCQkJLyogZXZlcnl0aGluZyBvayAtIGxldCdzIGVuYWJsZSB0aGUgZXh0ICovCisJCQlyID0ga3ZtcHBjX2hhbmRsZV9leHQodmNwdSwgZXhpdF9uciwgZXh0X21zcik7CisJCQlicmVhazsKKwkJY2FzZSBFTVVMQVRFX0ZBSUw6CisJCQkvKiB3ZSBuZWVkIHRvIGVtdWxhdGUgdGhpcyBpbnN0cnVjdGlvbiAqLworCQkJZ290byBwcm9ncmFtX2ludGVycnVwdDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogbm90aGluZyB0byB3b3JyeSBhYm91dCAtIGdvIGFnYWluICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX0FMSUdOTUVOVDoKKwkJaWYgKGt2bXBwY19yZWFkX2luc3QodmNwdSkgPT0gRU1VTEFURV9ET05FKSB7CisJCQl2Y3B1LT5hcmNoLnNoYXJlZC0+ZHNpc3IgPSBrdm1wcGNfYWxpZ25tZW50X2RzaXNyKHZjcHUsCisJCQkJa3ZtcHBjX2dldF9sYXN0X2luc3QodmNwdSkpOworCQkJdmNwdS0+YXJjaC5zaGFyZWQtPmRhciA9IGt2bXBwY19hbGlnbm1lbnRfZGFyKHZjcHUsCisJCQkJa3ZtcHBjX2dldF9sYXN0X2luc3QodmNwdSkpOworCQkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsIGV4aXRfbnIpOworCQl9CisJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCWJyZWFrOworCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9NQUNISU5FX0NIRUNLOgorCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9UUkFDRToKKwkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsIGV4aXRfbnIpOworCQlyID0gUkVTVU1FX0dVRVNUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVZ2ggLSBib3JrIGhlcmUhIFdoYXQgZGlkIHdlIGdldD8gKi8KKwkJcHJpbnRrKEtFUk5fRU1FUkcgImV4aXRfbnI9MHgleCB8IHBjPTB4JWx4IHwgbXNyPTB4JWx4XG4iLAorCQkJZXhpdF9uciwga3ZtcHBjX2dldF9wYyh2Y3B1KSwgdG9fc3ZjcHUodmNwdSktPnNoYWRvd19zcnIxKTsKKwkJciA9IFJFU1VNRV9IT1NUOworCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorCisKKwlpZiAoIShyICYgUkVTVU1FX0hPU1QpKSB7CisJCS8qIFRvIGF2b2lkIGNsb2JiZXJpbmcgZXhpdF9yZWFzb24sIG9ubHkgY2hlY2sgZm9yIHNpZ25hbHMgaWYKKwkJICogd2UgYXJlbid0IGFscmVhZHkgZXhpdGluZyB0byB1c2Vyc3BhY2UgZm9yIHNvbWUgb3RoZXIKKwkJICogcmVhc29uLiAqLworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKyNpZmRlZiBFWElUX0RFQlVHCisJCQlwcmludGsoS0VSTl9FTUVSRyAiS1ZNOiBHb2luZyBiYWNrIHRvIGhvc3RcbiIpOworI2VuZGlmCisJCQl2Y3B1LT5zdGF0LnNpZ25hbF9leGl0cysrOworCQkJcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7CisJCQlyID0gLUVJTlRSOworCQl9IGVsc2UgeworCQkJLyogSW4gY2FzZSBhbiBpbnRlcnJ1cHQgY2FtZSBpbiB0aGF0IHdhcyB0cmlnZ2VyZWQKKwkJCSAqIGZyb20gdXNlcnNwYWNlIChsaWtlIERFQyksIHdlIG5lZWQgdG8gY2hlY2sgd2hhdAorCQkJICogdG8gaW5qZWN0IG5vdyEgKi8KKwkJCWt2bXBwY19jb3JlX2RlbGl2ZXJfaW50ZXJydXB0cyh2Y3B1KTsKKwkJfQorCX0KKworCXRyYWNlX2t2bV9ib29rM3NfcmVlbnRlcihyLCB2Y3B1KTsKKworCXJldHVybiByOworfQorCitpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9nZXRfc3JlZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrdm1fc3JlZ3MgKnNyZWdzKQoreworCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHUzcyA9IHRvX2Jvb2szcyh2Y3B1KTsKKwlpbnQgaTsKKworCXNyZWdzLT5wdnIgPSB2Y3B1LT5hcmNoLnB2cjsKKworCXNyZWdzLT51LnMuc2RyMSA9IHRvX2Jvb2szcyh2Y3B1KS0+c2RyMTsKKwlpZiAodmNwdS0+YXJjaC5oZmxhZ3MgJiBCT09LM1NfSEZMQUdfU0xCKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCQlzcmVncy0+dS5zLnBwYzY0LnNsYltpXS5zbGJlID0gdmNwdS0+YXJjaC5zbGJbaV0ub3JpZ2UgfCBpOworCQkJc3JlZ3MtPnUucy5wcGM2NC5zbGJbaV0uc2xidiA9IHZjcHUtPmFyY2guc2xiW2ldLm9yaWd2OworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlzcmVncy0+dS5zLnBwYzMyLnNyW2ldID0gdmNwdS0+YXJjaC5zaGFyZWQtPnNyW2ldOworCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXNyZWdzLT51LnMucHBjMzIuaWJhdFtpXSA9IHZjcHUzcy0+aWJhdFtpXS5yYXc7CisJCQlzcmVncy0+dS5zLnBwYzMyLmRiYXRbaV0gPSB2Y3B1M3MtPmRiYXRbaV0ucmF3OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBrdm1fYXJjaF92Y3B1X2lvY3RsX3NldF9zcmVncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGt2bV9zcmVncyAqc3JlZ3MpCit7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdTNzID0gdG9fYm9vazNzKHZjcHUpOworCWludCBpOworCisJa3ZtcHBjX3NldF9wdnIodmNwdSwgc3JlZ3MtPnB2cik7CisKKwl2Y3B1M3MtPnNkcjEgPSBzcmVncy0+dS5zLnNkcjE7CisJaWYgKHZjcHUtPmFyY2guaGZsYWdzICYgQk9PSzNTX0hGTEFHX1NMQikgeworCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQkJdmNwdS0+YXJjaC5tbXUuc2xibXRlKHZjcHUsIHNyZWdzLT51LnMucHBjNjQuc2xiW2ldLnNsYnYsCisJCQkJCQkgICAgc3JlZ3MtPnUucy5wcGM2NC5zbGJbaV0uc2xiZSk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJdmNwdS0+YXJjaC5tbXUubXRzcmluKHZjcHUsIGksIHNyZWdzLT51LnMucHBjMzIuc3JbaV0pOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWt2bXBwY19zZXRfYmF0KHZjcHUsICYodmNwdTNzLT5pYmF0W2ldKSwgZmFsc2UsCisJCQkJICAgICAgICh1MzIpc3JlZ3MtPnUucy5wcGMzMi5pYmF0W2ldKTsKKwkJCWt2bXBwY19zZXRfYmF0KHZjcHUsICYodmNwdTNzLT5pYmF0W2ldKSwgdHJ1ZSwKKwkJCQkgICAgICAgKHUzMikoc3JlZ3MtPnUucy5wcGMzMi5pYmF0W2ldID4+IDMyKSk7CisJCQlrdm1wcGNfc2V0X2JhdCh2Y3B1LCAmKHZjcHUzcy0+ZGJhdFtpXSksIGZhbHNlLAorCQkJCSAgICAgICAodTMyKXNyZWdzLT51LnMucHBjMzIuZGJhdFtpXSk7CisJCQlrdm1wcGNfc2V0X2JhdCh2Y3B1LCAmKHZjcHUzcy0+ZGJhdFtpXSksIHRydWUsCisJCQkJICAgICAgICh1MzIpKHNyZWdzLT51LnMucHBjMzIuZGJhdFtpXSA+PiAzMikpOworCQl9CisJfQorCisJLyogRmx1c2ggdGhlIE1NVSBhZnRlciBtZXNzaW5nIHdpdGggdGhlIHNlZ21lbnRzICovCisJa3ZtcHBjX21tdV9wdGVfZmx1c2godmNwdSwgMCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGt2bXBwY19jb3JlX2NoZWNrX3Byb2Nlc3Nvcl9jb21wYXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGt2bV92Y3B1ICprdm1wcGNfY29yZV92Y3B1X2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGludCBpZCkKK3sKKwlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1X2Jvb2szczsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisJaW50IGVyciA9IC1FTk9NRU07CisJdW5zaWduZWQgbG9uZyBwOworCisJdmNwdV9ib29rM3MgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzKSk7CisJaWYgKCF2Y3B1X2Jvb2szcykKKwkJZ290byBvdXQ7CisKKwl2Y3B1X2Jvb2szcy0+c2hhZG93X3ZjcHUgPSAoc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUgKikKKwkJa3phbGxvYyhzaXplb2YoKnZjcHVfYm9vazNzLT5zaGFkb3dfdmNwdSksIEdGUF9LRVJORUwpOworCWlmICghdmNwdV9ib29rM3MtPnNoYWRvd192Y3B1KQorCQlnb3RvIGZyZWVfdmNwdTsKKworCXZjcHUgPSAmdmNwdV9ib29rM3MtPnZjcHU7CisJZXJyID0ga3ZtX3ZjcHVfaW5pdCh2Y3B1LCBrdm0sIGlkKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfc2hhZG93X3ZjcHU7CisKKwlwID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUx8X19HRlBfWkVSTyk7CisJLyogdGhlIHJlYWwgc2hhcmVkIHBhZ2UgZmlsbHMgdGhlIGxhc3QgNGsgb2Ygb3VyIHBhZ2UgKi8KKwl2Y3B1LT5hcmNoLnNoYXJlZCA9ICh2b2lkKikocCArIFBBR0VfU0laRSAtIDQwOTYpOworCWlmICghcCkKKwkJZ290byB1bmluaXRfdmNwdTsKKworCXZjcHUtPmFyY2guaG9zdF9yZXRpcCA9IGt2bV9yZXR1cm5fcG9pbnQ7CisJdmNwdS0+YXJjaC5ob3N0X21zciA9IG1mbXNyKCk7CisjaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfNjQKKwkvKiBkZWZhdWx0IHRvIGJvb2szc182NCAoOTcwZngpICovCisJdmNwdS0+YXJjaC5wdnIgPSAweDNDMDMwMTsKKyNlbHNlCisJLyogZGVmYXVsdCB0byBib29rM3NfMzIgKDc1MCkgKi8KKwl2Y3B1LT5hcmNoLnB2ciA9IDB4ODQyMDI7CisjZW5kaWYKKwlrdm1wcGNfc2V0X3B2cih2Y3B1LCB2Y3B1LT5hcmNoLnB2cik7CisJdmNwdS0+YXJjaC5zbGJfbnIgPSA2NDsKKworCS8qIHJlbWVtYmVyIHdoZXJlIHNvbWUgcmVhbC1tb2RlIGhhbmRsZXJzIGFyZSAqLworCXZjcHUtPmFyY2gudHJhbXBvbGluZV9sb3dtZW0gPSBfX3BhKGt2bXBwY19oYW5kbGVyX2xvd21lbV90cmFtcG9saW5lKTsKKwl2Y3B1LT5hcmNoLnRyYW1wb2xpbmVfZW50ZXIgPSBfX3BhKGt2bXBwY19oYW5kbGVyX3RyYW1wb2xpbmVfZW50ZXIpOworCXZjcHUtPmFyY2guaGlnaG1lbV9oYW5kbGVyID0gKHVsb25nKWt2bXBwY19oYW5kbGVyX2hpZ2htZW07CisjaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfNjQKKwl2Y3B1LT5hcmNoLnJtY2FsbCA9ICoodWxvbmcqKWt2bXBwY19ybWNhbGw7CisjZWxzZQorCXZjcHUtPmFyY2gucm1jYWxsID0gKHVsb25nKWt2bXBwY19ybWNhbGw7CisjZW5kaWYKKworCXZjcHUtPmFyY2guc2hhZG93X21zciA9IE1TUl9VU0VSNjQ7CisKKwllcnIgPSBrdm1wcGNfbW11X2luaXQodmNwdSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gdW5pbml0X3ZjcHU7CisKKwlyZXR1cm4gdmNwdTsKKwordW5pbml0X3ZjcHU6CisJa3ZtX3ZjcHVfdW5pbml0KHZjcHUpOworZnJlZV9zaGFkb3dfdmNwdToKKwlrZnJlZSh2Y3B1X2Jvb2szcy0+c2hhZG93X3ZjcHUpOworZnJlZV92Y3B1OgorCXZmcmVlKHZjcHVfYm9vazNzKTsKK291dDoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCit2b2lkIGt2bXBwY19jb3JlX3ZjcHVfZnJlZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdV9ib29rM3MgPSB0b19ib29rM3ModmNwdSk7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdmNwdS0+YXJjaC5zaGFyZWQgJiBQQUdFX01BU0spOworCWt2bV92Y3B1X3VuaW5pdCh2Y3B1KTsKKwlrZnJlZSh2Y3B1X2Jvb2szcy0+c2hhZG93X3ZjcHUpOworCXZmcmVlKHZjcHVfYm9vazNzKTsKK30KKworaW50IGt2bXBwY192Y3B1X3J1bihzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWludCByZXQ7CisJZG91YmxlIGZwclszMl1bVFNfRlBSV0lEVEhdOworCXVuc2lnbmVkIGludCBmcHNjcjsKKwlpbnQgZnBleGNfbW9kZTsKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworCXZlY3RvcjEyOCB2clszMl07CisJdmVjdG9yMTI4IHZzY3I7CisJdW5zaWduZWQgbG9uZyB1bmluaXRpYWxpemVkX3Zhcih2cnNhdmUpOworCWludCB1c2VkX3ZyOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZTWAorCWludCB1c2VkX3ZzcjsKKyNlbmRpZgorCXVsb25nIGV4dF9tc3I7CisKKwkvKiBObyBuZWVkIHRvIGdvIGludG8gdGhlIGd1ZXN0IHdoZW4gYWxsIHdlIGRvIGlzIGdvaW5nIG91dCAqLworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7CisJCXJldHVybiAtRUlOVFI7CisJfQorCisJLyogU2F2ZSBGUFUgc3RhdGUgaW4gc3RhY2sgKi8KKwlpZiAoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9GUCkKKwkJZ2l2ZXVwX2ZwdShjdXJyZW50KTsKKwltZW1jcHkoZnByLCBjdXJyZW50LT50aHJlYWQuZnByLCBzaXplb2YoY3VycmVudC0+dGhyZWFkLmZwcikpOworCWZwc2NyID0gY3VycmVudC0+dGhyZWFkLmZwc2NyLnZhbDsKKwlmcGV4Y19tb2RlID0gY3VycmVudC0+dGhyZWFkLmZwZXhjX21vZGU7CisKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworCS8qIFNhdmUgQWx0aXZlYyBzdGF0ZSBpbiBzdGFjayAqLworCXVzZWRfdnIgPSBjdXJyZW50LT50aHJlYWQudXNlZF92cjsKKwlpZiAodXNlZF92cikgeworCQlpZiAoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9WRUMpCisJCQlnaXZldXBfYWx0aXZlYyhjdXJyZW50KTsKKwkJbWVtY3B5KHZyLCBjdXJyZW50LT50aHJlYWQudnIsIHNpemVvZihjdXJyZW50LT50aHJlYWQudnIpKTsKKwkJdnNjciA9IGN1cnJlbnQtPnRocmVhZC52c2NyOworCQl2cnNhdmUgPSBjdXJyZW50LT50aHJlYWQudnJzYXZlOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1ZTWAorCS8qIFNhdmUgVlNYIHN0YXRlIGluIHN0YWNrICovCisJdXNlZF92c3IgPSBjdXJyZW50LT50aHJlYWQudXNlZF92c3I7CisJaWYgKHVzZWRfdnNyICYmIChjdXJyZW50LT50aHJlYWQucmVncy0+bXNyICYgTVNSX1ZTWCkpCisJCQlfX2dpdmV1cF92c3goY3VycmVudCk7CisjZW5kaWYKKworCS8qIFJlbWVtYmVyIHRoZSBNU1Igd2l0aCBkaXNhYmxlZCBleHRlbnNpb25zICovCisJZXh0X21zciA9IGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3I7CisKKwkvKiBQcmVsb2FkIEZQVSBpZiBpdCdzIGVuYWJsZWQgKi8KKwlpZiAodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIE1TUl9GUCkKKwkJa3ZtcHBjX2hhbmRsZV9leHQodmNwdSwgQk9PSzNTX0lOVEVSUlVQVF9GUF9VTkFWQUlMLCBNU1JfRlApOworCisJa3ZtX2d1ZXN0X2VudGVyKCk7CisKKwlyZXQgPSBfX2t2bXBwY192Y3B1X3J1bihrdm1fcnVuLCB2Y3B1KTsKKworCWt2bV9ndWVzdF9leGl0KCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciA9IGV4dF9tc3I7CisKKwkvKiBNYWtlIHN1cmUgd2Ugc2F2ZSB0aGUgZ3Vlc3QgRlBVL0FsdGl2ZWMvVlNYIHN0YXRlICovCisJa3ZtcHBjX2dpdmV1cF9leHQodmNwdSwgTVNSX0ZQKTsKKwlrdm1wcGNfZ2l2ZXVwX2V4dCh2Y3B1LCBNU1JfVkVDKTsKKwlrdm1wcGNfZ2l2ZXVwX2V4dCh2Y3B1LCBNU1JfVlNYKTsKKworCS8qIFJlc3RvcmUgRlBVIHN0YXRlIGZyb20gc3RhY2sgKi8KKwltZW1jcHkoY3VycmVudC0+dGhyZWFkLmZwciwgZnByLCBzaXplb2YoY3VycmVudC0+dGhyZWFkLmZwcikpOworCWN1cnJlbnQtPnRocmVhZC5mcHNjci52YWwgPSBmcHNjcjsKKwljdXJyZW50LT50aHJlYWQuZnBleGNfbW9kZSA9IGZwZXhjX21vZGU7CisKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworCS8qIFJlc3RvcmUgQWx0aXZlYyBzdGF0ZSBmcm9tIHN0YWNrICovCisJaWYgKHVzZWRfdnIgJiYgY3VycmVudC0+dGhyZWFkLnVzZWRfdnIpIHsKKwkJbWVtY3B5KGN1cnJlbnQtPnRocmVhZC52ciwgdnIsIHNpemVvZihjdXJyZW50LT50aHJlYWQudnIpKTsKKwkJY3VycmVudC0+dGhyZWFkLnZzY3IgPSB2c2NyOworCQljdXJyZW50LT50aHJlYWQudnJzYXZlID0gdnJzYXZlOworCX0KKwljdXJyZW50LT50aHJlYWQudXNlZF92ciA9IHVzZWRfdnI7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19WU1gKKwljdXJyZW50LT50aHJlYWQudXNlZF92c3IgPSB1c2VkX3ZzcjsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworaW50IGt2bXBwY19jb3JlX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sCisJCQkJICAgICAgc3RydWN0IGt2bV91c2Vyc3BhY2VfbWVtb3J5X3JlZ2lvbiAqbWVtKQoreworCXJldHVybiAwOworfQorCit2b2lkIGt2bXBwY19jb3JlX2NvbW1pdF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQlzdHJ1Y3Qga3ZtX3VzZXJzcGFjZV9tZW1vcnlfcmVnaW9uICptZW0pCit7Cit9CisKK2ludCBrdm1wcGNfY29yZV9pbml0X3ZtKHN0cnVjdCBrdm0gKmt2bSkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBrdm1wcGNfY29yZV9kZXN0cm95X3ZtKHN0cnVjdCBrdm0gKmt2bSkKK3sKK30KKworc3RhdGljIGludCBrdm1wcGNfYm9vazNzX2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCXIgPSBrdm1faW5pdChOVUxMLCBzaXplb2Yoc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyksIDAsCisJCSAgICAgVEhJU19NT0RVTEUpOworCisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGt2bXBwY19tbXVfaHB0ZV9zeXNpbml0KCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQga3ZtcHBjX2Jvb2szc19leGl0KHZvaWQpCit7CisJa3ZtcHBjX21tdV9ocHRlX3N5c2V4aXQoKTsKKwlrdm1fZXhpdCgpOworfQorCittb2R1bGVfaW5pdChrdm1wcGNfYm9vazNzX2luaXQpOworbW9kdWxlX2V4aXQoa3ZtcHBjX2Jvb2szc19leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3JtaGFuZGxlcnMuUyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3JtaGFuZGxlcnMuUwppbmRleCAxYTFiMzQ0Li5jMWY4NzdjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19ybWhhbmRsZXJzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3Nfcm1oYW5kbGVycy5TCkBAIC0zNiw0MSArMzYsNDQgQEAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfQk9PSzNTXzY0KQogCiAjZGVmaW5lIExPQURfU0hBRE9XX1ZDUFUocmVnKQlHRVRfUEFDQShyZWcpCQkJCQkKLSNkZWZpbmUgU0hBRE9XX1ZDUFVfT0ZGCQlQQUNBX0tWTV9TVkNQVQogI2RlZmluZSBNU1JfTk9JUlEJCU1TUl9LRVJORUwgJiB+KE1TUl9JUiB8IE1TUl9EUikKICNkZWZpbmUgRlVOQyhuYW1lKSAJCUdMVUUoLixuYW1lKQogCitrdm1wcGNfc2tpcF9pbnRlcnJ1cHQ6CisJLyoKKwkgKiBIZXJlIGFsbCBHUFJzIGFyZSB1bmNoYW5nZWQgZnJvbSB3aGVuIHRoZSBpbnRlcnJ1cHQgaGFwcGVuZWQKKwkgKiBleGNlcHQgZm9yIHIxMywgd2hpY2ggaXMgc2F2ZWQgaW4gU1BSR19TQ1JBVENIMC4KKwkgKi8KKwltZnNwcglyMTMsIFNQUk5fU1JSMAorCWFkZGkJcjEzLCByMTMsIDQKKwltdHNwcglTUFJOX1NSUjAsIHIxMworCUdFVF9TQ1JBVENIMChyMTMpCisJcmZpZAorCWIJLgorCitrdm1wcGNfc2tpcF9IaW50ZXJydXB0OgorCS8qCisJICogSGVyZSBhbGwgR1BScyBhcmUgdW5jaGFuZ2VkIGZyb20gd2hlbiB0aGUgaW50ZXJydXB0IGhhcHBlbmVkCisJICogZXhjZXB0IGZvciByMTMsIHdoaWNoIGlzIHNhdmVkIGluIFNQUkdfU0NSQVRDSDAuCisJICovCisJbWZzcHIJcjEzLCBTUFJOX0hTUlIwCisJYWRkaQlyMTMsIHIxMywgNAorCW10c3ByCVNQUk5fSFNSUjAsIHIxMworCUdFVF9TQ1JBVENIMChyMTMpCisJaHJmaWQKKwliCS4KKwogI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0JPT0szU18zMikKIAotI2RlZmluZSBMT0FEX1NIQURPV19WQ1BVKHJlZykJCQkJCQlcCi0JbWZzcHIJcmVnLCBTUFJOX1NQUkdfVEhSRUFEOwkJCQkJXAotCWx3eglyZWcsIFRIUkVBRF9LVk1fU1ZDUFUocmVnKTsJCQkJXAotCS8qIFBQQzMyIGNhbiBoYXZlIGEgTlVMTCBwb2ludGVyIC0gbGV0J3MgY2hlY2sgZm9yIHRoYXQgKi8JXAotCW10c3ByICAgU1BSTl9TUFJHX1NDUkFUQ0gxLCByMTI7CS8qIFNhdmUgcjEyICovCQlcCi0JbWZjcglyMTI7CQkJCQkJCVwKLQljbXB3aQlyZWcsIDA7CQkJCQkJCVwKLQlibmUJMWY7CQkJCQkJCVwKLQltZnNwcglyZWcsIFNQUk5fU1BSR19TQ1JBVENIMDsJCQkJXAotCW10Y3IJcjEyOwkJCQkJCQlcCi0JbWZzcHIJcjEyLCBTUFJOX1NQUkdfU0NSQVRDSDE7CQkJCVwKLQliCWt2bXBwY19yZXN1bWVfXGludG5vOwkJCQkJXAotMTo7CQkJCQkJCQkJXAotCW10Y3IJcjEyOwkJCQkJCQlcCi0JbWZzcHIJcjEyLCBTUFJOX1NQUkdfU0NSQVRDSDE7CQkJCVwKLQl0b3BoeXMocmVnLCByZWcpCi0KLSNkZWZpbmUgU0hBRE9XX1ZDUFVfT0ZGCQkwCiAjZGVmaW5lIE1TUl9OT0lSUQkJTVNSX0tFUk5FTAogI2RlZmluZSBGVU5DKG5hbWUpCQluYW1lCiAKLSNlbmRpZgotCiAubWFjcm8gSU5URVJSVVBUX1RSQU1QT0xJTkUgaW50bm8KIAogLmdsb2JhbCBrdm1wcGNfdHJhbXBvbGluZV9caW50bm8KIGt2bXBwY190cmFtcG9saW5lX1xpbnRubzoKIAotCVNFVF9TQ1JBVENIMChyMTMpCQkvKiBTYXZlIHIxMyAqLworCW10c3ByCVNQUk5fU1BSR19TQ1JBVENIMCwgcjEzCQkvKiBTYXZlIHIxMyAqLwogCiAJLyoKIAkgKiBGaXJzdCB0aGluZyB0byBkbyBpcyB0byBmaW5kIG91dCBpZiB3ZSdyZSBjb21pbmcKQEAgLTc4LDE5ICs4MSwyOCBAQAogCSAqCiAJICogVG8gZGlzdGluZ3Vpc2gsIHdlIGNoZWNrIGEgbWFnaWMgYnl0ZSBpbiB0aGUgUEFDQS9jdXJyZW50CiAJICovCi0JTE9BRF9TSEFET1dfVkNQVShyMTMpCi0JUFBDX1NUTAlyMTIsIChTSEFET1dfVkNQVV9PRkYgKyBTVkNQVV9TQ1JBVENIMCkocjEzKQorCW1mc3ByCXIxMywgU1BSTl9TUFJHX1RIUkVBRAorCWx3eglyMTMsIFRIUkVBRF9LVk1fU1ZDUFUocjEzKQorCS8qIFBQQzMyIGNhbiBoYXZlIGEgTlVMTCBwb2ludGVyIC0gbGV0J3MgY2hlY2sgZm9yIHRoYXQgKi8KKwltdHNwciAgIFNQUk5fU1BSR19TQ1JBVENIMSwgcjEyCQkvKiBTYXZlIHIxMiAqLwogCW1mY3IJcjEyCi0Jc3R3CXIxMiwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1NDUkFUQ0gxKShyMTMpCi0JbGJ6CXIxMiwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX0lOX0dVRVNUKShyMTMpCisJY21wd2kJcjEzLCAwCisJYm5lCTFmCisyOgltdGNyCXIxMgorCW1mc3ByCXIxMiwgU1BSTl9TUFJHX1NDUkFUQ0gxCisJbWZzcHIJcjEzLCBTUFJOX1NQUkdfU0NSQVRDSDAJCS8qIHIxMyA9IG9yaWdpbmFsIHIxMyAqLworCWIJa3ZtcHBjX3Jlc3VtZV9caW50bm8JCS8qIEdldCBiYWNrIG9yaWdpbmFsIGhhbmRsZXIgKi8KKworMToJdG9waHlzKHIxMywgcjEzKQorCXN0dwlyMTIsIEhTVEFURV9TQ1JBVENIMShyMTMpCisJbWZzcHIJcjEyLCBTUFJOX1NQUkdfU0NSQVRDSDEKKwlzdHcJcjEyLCBIU1RBVEVfU0NSQVRDSDAocjEzKQorCWxieglyMTIsIEhTVEFURV9JTl9HVUVTVChyMTMpCiAJY21wd2kJcjEyLCBLVk1fR1VFU1RfTU9ERV9OT05FCiAJYm5lCS4ua3ZtcHBjX2hhbmRsZXJfaGFzbWFnaWNfXGludG5vCiAJLyogTm8gS1ZNIGd1ZXN0PyBUaGVuIGp1bXAgYmFjayB0byB0aGUgTGludXggaGFuZGxlciEgKi8KLQlsd3oJcjEyLCAoU0hBRE9XX1ZDUFVfT0ZGICsgU1ZDUFVfU0NSQVRDSDEpKHIxMykKLQltdGNyCXIxMgotCVBQQ19MTAlyMTIsIChTSEFET1dfVkNQVV9PRkYgKyBTVkNQVV9TQ1JBVENIMCkocjEzKQotCUdFVF9TQ1JBVENIMChyMTMpCQkJLyogcjEzID0gb3JpZ2luYWwgcjEzICovCi0JYglrdm1wcGNfcmVzdW1lX1xpbnRubwkJLyogR2V0IGJhY2sgb3JpZ2luYWwgaGFuZGxlciAqLworCWx3eglyMTIsIEhTVEFURV9TQ1JBVENIMShyMTMpCisJYgkyYgogCiAJLyogTm93IHdlIGtub3cgd2UncmUgaGFuZGxpbmcgYSBLVk0gZ3Vlc3QgKi8KIC4ua3ZtcHBjX2hhbmRsZXJfaGFzbWFnaWNfXGludG5vOgpAQCAtMTEyLDkgKzEyNCw2IEBACiBJTlRFUlJVUFRfVFJBTVBPTElORQlCT09LM1NfSU5URVJSVVBUX0RBVEFfU1RPUkFHRQogSU5URVJSVVBUX1RSQU1QT0xJTkUJQk9PSzNTX0lOVEVSUlVQVF9JTlNUX1NUT1JBR0UKIElOVEVSUlVQVF9UUkFNUE9MSU5FCUJPT0szU19JTlRFUlJVUFRfRVhURVJOQUwKLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAotSU5URVJSVVBUX1RSQU1QT0xJTkUJQk9PSzNTX0lOVEVSUlVQVF9FWFRFUk5BTF9IVgotI2VuZGlmCiBJTlRFUlJVUFRfVFJBTVBPTElORQlCT09LM1NfSU5URVJSVVBUX0FMSUdOTUVOVAogSU5URVJSVVBUX1RSQU1QT0xJTkUJQk9PSzNTX0lOVEVSUlVQVF9QUk9HUkFNCiBJTlRFUlJVUFRfVFJBTVBPTElORQlCT09LM1NfSU5URVJSVVBUX0ZQX1VOQVZBSUwKQEAgLTEyNCwxNCArMTMzLDYgQEAKIElOVEVSUlVQVF9UUkFNUE9MSU5FCUJPT0szU19JTlRFUlJVUFRfUEVSRk1PTgogSU5URVJSVVBUX1RSQU1QT0xJTkUJQk9PSzNTX0lOVEVSUlVQVF9BTFRJVkVDCiAKLS8qIFRob3NlIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiA2NCBiaXQgbWFjaGluZXMgKi8KLQotI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0Ci1JTlRFUlJVUFRfVFJBTVBPTElORQlCT09LM1NfSU5URVJSVVBUX0RBVEFfU0VHTUVOVAotSU5URVJSVVBUX1RSQU1QT0xJTkUJQk9PSzNTX0lOVEVSUlVQVF9JTlNUX1NFR01FTlQKLUlOVEVSUlVQVF9UUkFNUE9MSU5FCUJPT0szU19JTlRFUlJVUFRfVlNYCi0jZW5kaWYKLQogLyoKICAqIEJyaW5nIHVzIGJhY2sgdG8gdGhlIGZhdWx0aW5nIGNvZGUsIGJ1dCBza2lwIHRoZQogICogZmF1bHRpbmcgaW5zdHJ1Y3Rpb24uCkBAIC0xNDMsOCArMTQ0LDggQEAKICAqCiAgKiBSMTIgICAgICAgICAgICA9IGZyZWUKICAqIFIxMyAgICAgICAgICAgID0gU2hhZG93IFZDUFUgKFBBQ0EpCi0gKiBTVkNQVS5TQ1JBVENIMCA9IGd1ZXN0IFIxMgotICogU1ZDUFUuU0NSQVRDSDEgPSBndWVzdCBDUgorICogSFNUQVRFLlNDUkFUQ0gwID0gZ3Vlc3QgUjEyCisgKiBIU1RBVEUuU0NSQVRDSDEgPSBndWVzdCBDUgogICogU1BSR19TQ1JBVENIMCAgPSBndWVzdCBSMTMKICAqCiAgKi8KQEAgLTE1NiwxMyArMTU3LDE0IEBACiAJbXRzcnIwCXIxMgogCiAJLyogQ2xlYW4gdXAgYWxsIHN0YXRlICovCi0JbHd6CXIxMiwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1NDUkFUQ0gxKShyMTMpCisJbHd6CXIxMiwgSFNUQVRFX1NDUkFUQ0gxKHIxMykKIAltdGNyCXIxMgotCVBQQ19MTAlyMTIsIChTSEFET1dfVkNQVV9PRkYgKyBTVkNQVV9TQ1JBVENIMCkocjEzKQorCVBQQ19MTAlyMTIsIEhTVEFURV9TQ1JBVENIMChyMTMpCiAJR0VUX1NDUkFUQ0gwKHIxMykKIAogCS8qIEFuZCBnZXQgYmFjayBpbnRvIHRoZSBjb2RlICovCiAJUkZJCisjZW5kaWYKIAogLyoKICAqIFRoaXMgdHJhbXBvbGluZSBicmluZ3MgdXMgYmFjayB0byBhIHJlYWwgbW9kZSBoYW5kbGVyCkBAIC0yNTEsMTIgKzI1Myw0IEBACiBkZWZpbmVfbG9hZF91cCh2c3gpCiAjZW5kaWYKIAotLmdsb2JhbCBrdm1wcGNfdHJhbXBvbGluZV9sb3dtZW0KLWt2bXBwY190cmFtcG9saW5lX2xvd21lbToKLQlQUENfTE9ORyBrdm1wcGNfaGFuZGxlcl9sb3dtZW1fdHJhbXBvbGluZSAtIENPTkZJR19LRVJORUxfU1RBUlQKLQotLmdsb2JhbCBrdm1wcGNfdHJhbXBvbGluZV9lbnRlcgota3ZtcHBjX3RyYW1wb2xpbmVfZW50ZXI6Ci0JUFBDX0xPTkcga3ZtcHBjX2hhbmRsZXJfdHJhbXBvbGluZV9lbnRlciAtIENPTkZJR19LRVJORUxfU1RBUlQKLQogI2luY2x1ZGUgImJvb2szc19zZWdtZW50LlMiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19zZWdtZW50LlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19zZWdtZW50LlMKaW5kZXggNDUxMjY0Mi4uYWVkMzJlNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3Nfc2VnbWVudC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3NlZ21lbnQuUwpAQCAtMjIsNyArMjIsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19CT09LM1NfNjQpCiAKICNkZWZpbmUgR0VUX1NIQURPV19WQ1BVKHJlZykgICAgXAotCWFkZGkgICAgcmVnLCByMTMsIFBBQ0FfS1ZNX1NWQ1BVCisJbXIJcmVnLCByMTMKIAogI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0JPT0szU18zMikKIApAQCAtNzEsNiArNzEsMTAgQEAKIAkvKiByMyA9IHNoYWRvdyB2Y3B1ICovCiAJR0VUX1NIQURPV19WQ1BVKHIzKQogCisJLyogU2F2ZSBSMS9SMiBpbiB0aGUgUEFDQSAoNjQtYml0KSBvciBzaGFkb3dfdmNwdSAoMzItYml0KSAqLworCVBQQ19TVEwJcjEsIEhTVEFURV9IT1NUX1IxKHIzKQorCVBQQ19TVEwJcjIsIEhTVEFURV9IT1NUX1IyKHIzKQorCiAJLyogTW92ZSBTUlIwIGFuZCBTUlIxIGludG8gdGhlIHJlc3BlY3RpdmUgcmVncyAqLwogCVBQQ19MTCAgcjksIFNWQ1BVX1BDKHIzKQogCW10c3JyMAlyOQpAQCAtNzgsMzYgKzgyLDM2IEBACiAKIAkvKiBBY3RpdmF0ZSBndWVzdCBtb2RlLCBzbyBmYXVsdHMgZ2V0IGhhbmRsZWQgYnkgS1ZNICovCiAJbGkJcjExLCBLVk1fR1VFU1RfTU9ERV9HVUVTVAotCXN0YglyMTEsIFNWQ1BVX0lOX0dVRVNUKHIzKQorCXN0YglyMTEsIEhTVEFURV9JTl9HVUVTVChyMykKIAogCS8qIFN3aXRjaCB0byBndWVzdCBzZWdtZW50LiBUaGlzIGlzIHN1YmFyY2ggc3BlY2lmaWMuICovCiAJTE9BRF9HVUVTVF9TRUdNRU5UUwogCiAJLyogRW50ZXIgZ3Vlc3QgKi8KIAotCVBQQ19MTAlyNCwgKFNWQ1BVX0NUUikocjMpCi0JUFBDX0xMCXI1LCAoU1ZDUFVfTFIpKHIzKQotCWx3eglyNiwgKFNWQ1BVX0NSKShyMykKLQlsd3oJcjcsIChTVkNQVV9YRVIpKHIzKQorCVBQQ19MTAlyNCwgU1ZDUFVfQ1RSKHIzKQorCVBQQ19MTAlyNSwgU1ZDUFVfTFIocjMpCisJbHd6CXI2LCBTVkNQVV9DUihyMykKKwlsd3oJcjcsIFNWQ1BVX1hFUihyMykKIAogCW10Y3RyCXI0CiAJbXRscglyNQogCW10Y3IJcjYKIAltdHhlcglyNwogCi0JUFBDX0xMCXIwLCAoU1ZDUFVfUjApKHIzKQotCVBQQ19MTAlyMSwgKFNWQ1BVX1IxKShyMykKLQlQUENfTEwJcjIsIChTVkNQVV9SMikocjMpCi0JUFBDX0xMCXI0LCAoU1ZDUFVfUjQpKHIzKQotCVBQQ19MTAlyNSwgKFNWQ1BVX1I1KShyMykKLQlQUENfTEwJcjYsIChTVkNQVV9SNikocjMpCi0JUFBDX0xMCXI3LCAoU1ZDUFVfUjcpKHIzKQotCVBQQ19MTAlyOCwgKFNWQ1BVX1I4KShyMykKLQlQUENfTEwJcjksIChTVkNQVV9SOSkocjMpCi0JUFBDX0xMCXIxMCwgKFNWQ1BVX1IxMCkocjMpCi0JUFBDX0xMCXIxMSwgKFNWQ1BVX1IxMSkocjMpCi0JUFBDX0xMCXIxMiwgKFNWQ1BVX1IxMikocjMpCi0JUFBDX0xMCXIxMywgKFNWQ1BVX1IxMykocjMpCisJUFBDX0xMCXIwLCBTVkNQVV9SMChyMykKKwlQUENfTEwJcjEsIFNWQ1BVX1IxKHIzKQorCVBQQ19MTAlyMiwgU1ZDUFVfUjIocjMpCisJUFBDX0xMCXI0LCBTVkNQVV9SNChyMykKKwlQUENfTEwJcjUsIFNWQ1BVX1I1KHIzKQorCVBQQ19MTAlyNiwgU1ZDUFVfUjYocjMpCisJUFBDX0xMCXI3LCBTVkNQVV9SNyhyMykKKwlQUENfTEwJcjgsIFNWQ1BVX1I4KHIzKQorCVBQQ19MTAlyOSwgU1ZDUFVfUjkocjMpCisJUFBDX0xMCXIxMCwgU1ZDUFVfUjEwKHIzKQorCVBQQ19MTAlyMTEsIFNWQ1BVX1IxMShyMykKKwlQUENfTEwJcjEyLCBTVkNQVV9SMTIocjMpCisJUFBDX0xMCXIxMywgU1ZDUFVfUjEzKHIzKQogCiAJUFBDX0xMCXIzLCAoU1ZDUFVfUjMpKHIzKQogCkBAIC0xMjUsNTYgKzEyOSw2MyBAQAogLmdsb2JhbCBrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2V4aXQKIGt2bXBwY19oYW5kbGVyX3RyYW1wb2xpbmVfZXhpdDoKIAorLmdsb2JhbCBrdm1wcGNfaW50ZXJydXB0Citrdm1wcGNfaW50ZXJydXB0OgorCiAJLyogUmVnaXN0ZXIgdXNhZ2UgYXQgdGhpcyBwb2ludDoKIAkgKgogCSAqIFNQUkdfU0NSQVRDSDAgID0gZ3Vlc3QgUjEzCiAJICogUjEyICAgICAgICAgICAgPSBleGl0IGhhbmRsZXIgaWQKLQkgKiBSMTMgICAgICAgICAgICA9IHNoYWRvdyB2Y3B1IC0gU0hBRE9XX1ZDUFVfT0ZGIFs9UEFDQSBvbiBQUEM2NF0KLQkgKiBTVkNQVS5TQ1JBVENIMCA9IGd1ZXN0IFIxMgotCSAqIFNWQ1BVLlNDUkFUQ0gxID0gZ3Vlc3QgQ1IKKwkgKiBSMTMgICAgICAgICAgICA9IHNoYWRvdyB2Y3B1ICgzMi1iaXQpIG9yIFBBQ0EgKDY0LWJpdCkKKwkgKiBIU1RBVEUuU0NSQVRDSDAgPSBndWVzdCBSMTIKKwkgKiBIU1RBVEUuU0NSQVRDSDEgPSBndWVzdCBDUgogCSAqCiAJICovCiAKIAkvKiBTYXZlIHJlZ2lzdGVycyAqLwogCi0JUFBDX1NUTAlyMCwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1IwKShyMTMpCi0JUFBDX1NUTAlyMSwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1IxKShyMTMpCi0JUFBDX1NUTAlyMiwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1IyKShyMTMpCi0JUFBDX1NUTAlyMywgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1IzKShyMTMpCi0JUFBDX1NUTAlyNCwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1I0KShyMTMpCi0JUFBDX1NUTAlyNSwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1I1KShyMTMpCi0JUFBDX1NUTAlyNiwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1I2KShyMTMpCi0JUFBDX1NUTAlyNywgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1I3KShyMTMpCi0JUFBDX1NUTAlyOCwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1I4KShyMTMpCi0JUFBDX1NUTAlyOSwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1I5KShyMTMpCi0JUFBDX1NUTAlyMTAsIChTSEFET1dfVkNQVV9PRkYgKyBTVkNQVV9SMTApKHIxMykKLQlQUENfU1RMCXIxMSwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1IxMSkocjEzKQorCVBQQ19TVEwJcjAsIFNWQ1BVX1IwKHIxMykKKwlQUENfU1RMCXIxLCBTVkNQVV9SMShyMTMpCisJUFBDX1NUTAlyMiwgU1ZDUFVfUjIocjEzKQorCVBQQ19TVEwJcjMsIFNWQ1BVX1IzKHIxMykKKwlQUENfU1RMCXI0LCBTVkNQVV9SNChyMTMpCisJUFBDX1NUTAlyNSwgU1ZDUFVfUjUocjEzKQorCVBQQ19TVEwJcjYsIFNWQ1BVX1I2KHIxMykKKwlQUENfU1RMCXI3LCBTVkNQVV9SNyhyMTMpCisJUFBDX1NUTAlyOCwgU1ZDUFVfUjgocjEzKQorCVBQQ19TVEwJcjksIFNWQ1BVX1I5KHIxMykKKwlQUENfU1RMCXIxMCwgU1ZDUFVfUjEwKHIxMykKKwlQUENfU1RMCXIxMSwgU1ZDUFVfUjExKHIxMykKIAogCS8qIFJlc3RvcmUgUjEvUjIgc28gd2UgY2FuIGhhbmRsZSBmYXVsdHMgKi8KLQlQUENfTEwJcjEsIChTSEFET1dfVkNQVV9PRkYgKyBTVkNQVV9IT1NUX1IxKShyMTMpCi0JUFBDX0xMCXIyLCAoU0hBRE9XX1ZDUFVfT0ZGICsgU1ZDUFVfSE9TVF9SMikocjEzKQorCVBQQ19MTAlyMSwgSFNUQVRFX0hPU1RfUjEocjEzKQorCVBQQ19MTAlyMiwgSFNUQVRFX0hPU1RfUjIocjEzKQogCiAJLyogU2F2ZSBndWVzdCBQQyBhbmQgTVNSICovCisjaWZkZWYgQ09ORklHX1BQQzY0CitCRUdJTl9GVFJfU0VDVElPTgogCWFuZGkuCXIwLHIxMiwweDIKIAliZXEJMWYKIAltZnNwcglyMyxTUFJOX0hTUlIwCiAJbWZzcHIJcjQsU1BSTl9IU1JSMQogCWFuZGkuCXIxMixyMTIsMHgzZmZkCiAJYgkyZgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfSFZNT0RFKQorI2VuZGlmCiAxOgltZnNycjAJcjMKIAltZnNycjEJcjQKIDI6Ci0JUFBDX1NUTAlyMywgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1BDKShyMTMpCi0JUFBDX1NUTAlyNCwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1NIQURPV19TUlIxKShyMTMpCisJUFBDX1NUTAlyMywgU1ZDUFVfUEMocjEzKQorCVBQQ19TVEwJcjQsIFNWQ1BVX1NIQURPV19TUlIxKHIxMykKIAogCS8qIEdldCBzY3JhdGNoJ2VkIG9mZiByZWdpc3RlcnMgKi8KIAlHRVRfU0NSQVRDSDAocjkpCi0JUFBDX0xMCXI4LCAoU0hBRE9XX1ZDUFVfT0ZGICsgU1ZDUFVfU0NSQVRDSDApKHIxMykKLQlsd3oJcjcsIChTSEFET1dfVkNQVV9PRkYgKyBTVkNQVV9TQ1JBVENIMSkocjEzKQorCVBQQ19MTAlyOCwgSFNUQVRFX1NDUkFUQ0gwKHIxMykKKwlsd3oJcjcsIEhTVEFURV9TQ1JBVENIMShyMTMpCiAKLQlQUENfU1RMCXI5LCAoU0hBRE9XX1ZDUFVfT0ZGICsgU1ZDUFVfUjEzKShyMTMpCi0JUFBDX1NUTAlyOCwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1IxMikocjEzKQotCXN0dwlyNywgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX0NSKShyMTMpCisJUFBDX1NUTAlyOSwgU1ZDUFVfUjEzKHIxMykKKwlQUENfU1RMCXI4LCBTVkNQVV9SMTIocjEzKQorCXN0dwlyNywgU1ZDUFVfQ1IocjEzKQogCiAJLyogU2F2ZSBtb3JlIHJlZ2lzdGVyIHN0YXRlICAqLwogCkBAIC0xODQsMTEgKzE5NSwxMSBAQAogCW1mY3RyCXI4CiAJbWZscglyOQogCi0Jc3R3CXI1LCAoU0hBRE9XX1ZDUFVfT0ZGICsgU1ZDUFVfWEVSKShyMTMpCi0JUFBDX1NUTAlyNiwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX0ZBVUxUX0RBUikocjEzKQotCXN0dwlyNywgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX0ZBVUxUX0RTSVNSKShyMTMpCi0JUFBDX1NUTAlyOCwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX0NUUikocjEzKQotCVBQQ19TVEwJcjksIChTSEFET1dfVkNQVV9PRkYgKyBTVkNQVV9MUikocjEzKQorCXN0dwlyNSwgU1ZDUFVfWEVSKHIxMykKKwlQUENfU1RMCXI2LCBTVkNQVV9GQVVMVF9EQVIocjEzKQorCXN0dwlyNywgU1ZDUFVfRkFVTFRfRFNJU1IocjEzKQorCVBQQ19TVEwJcjgsIFNWQ1BVX0NUUihyMTMpCisJUFBDX1NUTAlyOSwgU1ZDUFVfTFIocjEzKQogCiAJLyoKIAkgKiBJbiBvcmRlciBmb3IgdXMgdG8gZWFzaWx5IGdldCB0aGUgbGFzdCBpbnN0cnVjdGlvbiwKQEAgLTIxOCw3ICsyMjksNyBAQAogCS8qIFNldCBndWVzdCBtb2RlIHRvICdqdW1wIG92ZXIgaW5zdHJ1Y3Rpb24nIHNvIGlmIGx3eiBmYXVsdHMKIAkgKiB3ZSdsbCBqdXN0IGNvbnRpbnVlIGF0IHRoZSBuZXh0IElQLiAqLwogCWxpCXI5LCBLVk1fR1VFU1RfTU9ERV9TS0lQCi0Jc3RiCXI5LCAoU0hBRE9XX1ZDUFVfT0ZGICsgU1ZDUFVfSU5fR1VFU1QpKHIxMykKKwlzdGIJcjksIEhTVEFURV9JTl9HVUVTVChyMTMpCiAKIAkvKiAgICAxKSBlbmFibGUgcGFnaW5nIGZvciBkYXRhICovCiAJbWZtc3IJcjkKQEAgLTIzMiwxMyArMjQzLDEzIEBACiAJc3luYwogCiAjZW5kaWYKLQlzdHcJcjAsIChTSEFET1dfVkNQVV9PRkYgKyBTVkNQVV9MQVNUX0lOU1QpKHIxMykKKwlzdHcJcjAsIFNWQ1BVX0xBU1RfSU5TVChyMTMpCiAKIG5vX2xkX2xhc3RfaW5zdDoKIAogCS8qIFVuc2V0IGd1ZXN0IG1vZGUgKi8KIAlsaQlyOSwgS1ZNX0dVRVNUX01PREVfTk9ORQotCXN0YglyOSwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX0lOX0dVRVNUKShyMTMpCisJc3RiCXI5LCBIU1RBVEVfSU5fR1VFU1QocjEzKQogCiAJLyogU3dpdGNoIGJhY2sgdG8gaG9zdCBNTVUgKi8KIAlMT0FEX0hPU1RfU0VHTUVOVFMKQEAgLTI0OCw3ICsyNTksNyBAQAogCSAqIFIxICAgICAgID0gaG9zdCBSMQogCSAqIFIyICAgICAgID0gaG9zdCBSMgogCSAqIFIxMiAgICAgID0gZXhpdCBoYW5kbGVyIGlkCi0JICogUjEzICAgICAgPSBzaGFkb3cgdmNwdSAtIFNIQURPV19WQ1BVX09GRiBbPVBBQ0Egb24gUFBDNjRdCisJICogUjEzICAgICAgPSBzaGFkb3cgdmNwdSAoMzItYml0KSBvciBQQUNBICg2NC1iaXQpCiAJICogU1ZDUFUuKiAgPSBndWVzdCAqCiAJICoKIAkgKi8KQEAgLTI1OCw3ICsyNjksNyBAQAogCW9yaQlyNywgcjcsIE1TUl9JUnxNU1JfRFJ8TVNSX1JJfE1TUl9NRQkvKiBFbmFibGUgcGFnaW5nICovCiAJbXRzcnIxCXI3CiAJLyogTG9hZCBoaWdobWVtIGhhbmRsZXIgYWRkcmVzcyAqLwotCVBQQ19MTAlyOCwgKFNIQURPV19WQ1BVX09GRiArIFNWQ1BVX1ZNSEFORExFUikocjEzKQorCVBQQ19MTAlyOCwgSFNUQVRFX1ZNSEFORExFUihyMTMpCiAJbXRzcnIwCXI4CiAKIAlSRkkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYwppbmRleCA4NDYyYjNhLi5lZTQ1ZmEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiAgKgogICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3CisgKiBDb3B5cmlnaHQgMjAxMC0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCiAgKgogICogQXV0aG9yczogSG9sbGlzIEJsYW5jaGFyZCA8aG9sbGlzYkB1cy5pYm0uY29tPgogICogICAgICAgICAgQ2hyaXN0aWFuIEVocmhhcmR0IDxlaHJoYXJkdEBsaW51eC52bmV0LmlibS5jb20+CkBAIC03OCw2ICs3OSw2MCBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19TUEUKK3ZvaWQga3ZtcHBjX3ZjcHVfZGlzYWJsZV9zcGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXByZWVtcHRfZGlzYWJsZSgpOworCWVuYWJsZV9rZXJuZWxfc3BlKCk7CisJa3ZtcHBjX3NhdmVfZ3Vlc3Rfc3BlKHZjcHUpOworCXZjcHUtPmFyY2guc2hhZG93X21zciAmPSB+TVNSX1NQRTsKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCBrdm1wcGNfdmNwdV9lbmFibGVfc3BlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwllbmFibGVfa2VybmVsX3NwZSgpOworCWt2bXBwY19sb2FkX2d1ZXN0X3NwZSh2Y3B1KTsKKwl2Y3B1LT5hcmNoLnNoYWRvd19tc3IgfD0gTVNSX1NQRTsKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCBrdm1wcGNfdmNwdV9zeW5jX3NwZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaWYgKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfU1BFKSB7CisJCWlmICghKHZjcHUtPmFyY2guc2hhZG93X21zciAmIE1TUl9TUEUpKQorCQkJa3ZtcHBjX3ZjcHVfZW5hYmxlX3NwZSh2Y3B1KTsKKwl9IGVsc2UgaWYgKHZjcHUtPmFyY2guc2hhZG93X21zciAmIE1TUl9TUEUpIHsKKwkJa3ZtcHBjX3ZjcHVfZGlzYWJsZV9zcGUodmNwdSk7CisJfQorfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGt2bXBwY192Y3B1X3N5bmNfc3BlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKK30KKyNlbmRpZgorCisvKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciAiZnVsbCIgTVNSIHdyaXRlcy4gIE5vIG5lZWQgdG8gY2FsbCB0aGlzIGlmIG9ubHkKKyAqIEVFL0NFL01FL0RFL1JJIGFyZSBjaGFuZ2luZy4KKyAqLwordm9pZCBrdm1wcGNfc2V0X21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBuZXdfbXNyKQoreworCXUzMiBvbGRfbXNyID0gdmNwdS0+YXJjaC5zaGFyZWQtPm1zcjsKKworCXZjcHUtPmFyY2guc2hhcmVkLT5tc3IgPSBuZXdfbXNyOworCisJa3ZtcHBjX21tdV9tc3Jfbm90aWZ5KHZjcHUsIG9sZF9tc3IpOworCisJaWYgKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfV0UpIHsKKwkJa3ZtX3ZjcHVfYmxvY2sodmNwdSk7CisJCWt2bXBwY19zZXRfZXhpdF90eXBlKHZjcHUsIEVNVUxBVEVEX01UTVNSV0VfRVhJVFMpOworCX07CisKKwlrdm1wcGNfdmNwdV9zeW5jX3NwZSh2Y3B1KTsKK30KKwogc3RhdGljIHZvaWQga3ZtcHBjX2Jvb2tlX3F1ZXVlX2lycXByaW8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHByaW9yaXR5KQogewpAQCAtMjU3LDYgKzMxMiwxOSBAQAogCQl2Y3B1LT5hcmNoLnNoYXJlZC0+aW50X3BlbmRpbmcgPSAwOwogfQogCitpbnQga3ZtcHBjX3ZjcHVfcnVuKHN0cnVjdCBrdm1fcnVuICprdm1fcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaW50IHJldDsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJa3ZtX2d1ZXN0X2VudGVyKCk7CisJcmV0ID0gX19rdm1wcGNfdmNwdV9ydW4oa3ZtX3J1biwgdmNwdSk7CisJa3ZtX2d1ZXN0X2V4aXQoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKioKICAqIGt2bXBwY19oYW5kbGVfZXhpdAogICoKQEAgLTM0NCwxMCArNDEyLDE2IEBACiAJCXIgPSBSRVNVTUVfR1VFU1Q7CiAJCWJyZWFrOwogCi0JY2FzZSBCT09LRV9JTlRFUlJVUFRfU1BFX1VOQVZBSUw6Ci0JCWt2bXBwY19ib29rZV9xdWV1ZV9pcnFwcmlvKHZjcHUsIEJPT0tFX0lSUVBSSU9fU1BFX1VOQVZBSUwpOworI2lmZGVmIENPTkZJR19TUEUKKwljYXNlIEJPT0tFX0lOVEVSUlVQVF9TUEVfVU5BVkFJTDogeworCQlpZiAodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIE1TUl9TUEUpCisJCQlrdm1wcGNfdmNwdV9lbmFibGVfc3BlKHZjcHUpOworCQllbHNlCisJCQlrdm1wcGNfYm9va2VfcXVldWVfaXJxcHJpbyh2Y3B1LAorCQkJCQkJICAgQk9PS0VfSVJRUFJJT19TUEVfVU5BVkFJTCk7CiAJCXIgPSBSRVNVTUVfR1VFU1Q7CiAJCWJyZWFrOworCX0KIAogCWNhc2UgQk9PS0VfSU5URVJSVVBUX1NQRV9GUF9EQVRBOgogCQlrdm1wcGNfYm9va2VfcXVldWVfaXJxcHJpbyh2Y3B1LCBCT09LRV9JUlFQUklPX1NQRV9GUF9EQVRBKTsKQEAgLTM1OCw2ICs0MzIsMjggQEAKIAkJa3ZtcHBjX2Jvb2tlX3F1ZXVlX2lycXByaW8odmNwdSwgQk9PS0VfSVJRUFJJT19TUEVfRlBfUk9VTkQpOwogCQlyID0gUkVTVU1FX0dVRVNUOwogCQlicmVhazsKKyNlbHNlCisJY2FzZSBCT09LRV9JTlRFUlJVUFRfU1BFX1VOQVZBSUw6CisJCS8qCisJCSAqIEd1ZXN0IHdhbnRzIFNQRSwgYnV0IGhvc3Qga2VybmVsIGRvZXNuJ3Qgc3VwcG9ydCBpdC4gIFNlbmQKKwkJICogYW4gInVuaW1wbGVtZW50ZWQgb3BlcmF0aW9uIiBwcm9ncmFtIGNoZWNrIHRvIHRoZSBndWVzdC4KKwkJICovCisJCWt2bXBwY19jb3JlX3F1ZXVlX3Byb2dyYW0odmNwdSwgRVNSX1BVTyB8IEVTUl9TUFYpOworCQlyID0gUkVTVU1FX0dVRVNUOworCQlicmVhazsKKworCS8qCisJICogVGhlc2UgcmVhbGx5IHNob3VsZCBuZXZlciBoYXBwZW4gd2l0aG91dCBDT05GSUdfU1BFLAorCSAqIGFzIHdlIHNob3VsZCBuZXZlciBlbmFibGUgdGhlIHJlYWwgTVNSW1NQRV0gaW4gdGhlIGd1ZXN0LgorCSAqLworCWNhc2UgQk9PS0VfSU5URVJSVVBUX1NQRV9GUF9EQVRBOgorCWNhc2UgQk9PS0VfSU5URVJSVVBUX1NQRV9GUF9ST1VORDoKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IHVuZXhwZWN0ZWQgU1BFIGludGVycnVwdCAldSBhdCAlMDhseFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBleGl0X25yLCB2Y3B1LT5hcmNoLnBjKTsKKwkJcnVuLT5ody5oYXJkd2FyZV9leGl0X3JlYXNvbiA9IGV4aXRfbnI7CisJCXIgPSBSRVNVTUVfSE9TVDsKKwkJYnJlYWs7CisjZW5kaWYKIAogCWNhc2UgQk9PS0VfSU5URVJSVVBUX0RBVEFfU1RPUkFHRToKIAkJa3ZtcHBjX2NvcmVfcXVldWVfZGF0YV9zdG9yYWdlKHZjcHUsIHZjcHUtPmFyY2guZmF1bHRfZGVhciwKQEAgLTM5Miw2ICs0ODgsMTcgQEAKIAkJZ3BhX3QgZ3BhZGRyOwogCQlnZm5fdCBnZm47CiAKKyNpZmRlZiBDT05GSUdfS1ZNX0U1MDAKKwkJaWYgKCEodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIE1TUl9QUikgJiYKKwkJICAgIChlYWRkciAmIFBBR0VfTUFTSykgPT0gdmNwdS0+YXJjaC5tYWdpY19wYWdlX2VhKSB7CisJCQlrdm1wcGNfbWFwX21hZ2ljKHZjcHUpOworCQkJa3ZtcHBjX2FjY291bnRfZXhpdCh2Y3B1LCBEVExCX1ZJUlRfTUlTU19FWElUUyk7CisJCQlyID0gUkVTVU1FX0dVRVNUOworCisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKIAkJLyogQ2hlY2sgdGhlIGd1ZXN0IFRMQi4gKi8KIAkJZ3RsYl9pbmRleCA9IGt2bXBwY19tbXVfZHRsYl9pbmRleCh2Y3B1LCBlYWRkcik7CiAJCWlmIChndGxiX2luZGV4IDwgMCkgewpAQCAtNTE0LDYgKzYyMSw3IEBACiAKIAl2Y3B1LT5hcmNoLnBjID0gMDsKIAl2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyID0gMDsKKwl2Y3B1LT5hcmNoLnNoYWRvd19tc3IgPSBNU1JfVVNFUiB8IE1TUl9ERSB8IE1TUl9JUyB8IE1TUl9EUzsKIAlrdm1wcGNfc2V0X2dwcih2Y3B1LCAxLCAoMTY8PDIwKSAtIDgpOyAvKiAtOCBmb3IgdGhlIGNhbGxlZS1zYXZlIExSIHNsb3QgKi8KIAogCXZjcHUtPmFyY2guc2hhZG93X3BpZCA9IDE7CkBAIC03NzAsNiArODc4LDI2IEBACiAJcmV0dXJuIC1FTk9UU1VQUDsKIH0KIAoraW50IGt2bXBwY19jb3JlX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sCisJCQkJICAgICAgc3RydWN0IGt2bV91c2Vyc3BhY2VfbWVtb3J5X3JlZ2lvbiAqbWVtKQoreworCXJldHVybiAwOworfQorCit2b2lkIGt2bXBwY19jb3JlX2NvbW1pdF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQlzdHJ1Y3Qga3ZtX3VzZXJzcGFjZV9tZW1vcnlfcmVnaW9uICptZW0pCit7Cit9CisKK2ludCBrdm1wcGNfY29yZV9pbml0X3ZtKHN0cnVjdCBrdm0gKmt2bSkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBrdm1wcGNfY29yZV9kZXN0cm95X3ZtKHN0cnVjdCBrdm0gKmt2bSkKK3sKK30KKwogaW50IF9faW5pdCBrdm1wcGNfYm9va2VfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgaXZvclsxNl07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmggYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmgKaW5kZXggNDkyYmI3MC4uOGUxZmUzMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuaApAQCAtNTIsMjQgKzUyLDE5IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGt2bXBwY19ib29rZV9oYW5kbGVyczsKIAotLyogSGVscGVyIGZ1bmN0aW9uIGZvciAiZnVsbCIgTVNSIHdyaXRlcy4gTm8gbmVlZCB0byBjYWxsIHRoaXMgaWYgb25seSBFRSBpcwotICogY2hhbmdpbmcuICovCi1zdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX3NldF9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgbmV3X21zcikKLXsKLQlpZiAoKG5ld19tc3IgJiBNU1JfUFIpICE9ICh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgTVNSX1BSKSkKLQkJa3ZtcHBjX21tdV9wcml2X3N3aXRjaCh2Y3B1LCBuZXdfbXNyICYgTVNSX1BSKTsKLQotCXZjcHUtPmFyY2guc2hhcmVkLT5tc3IgPSBuZXdfbXNyOwotCi0JaWYgKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfV0UpIHsKLQkJa3ZtX3ZjcHVfYmxvY2sodmNwdSk7Ci0JCWt2bXBwY19zZXRfZXhpdF90eXBlKHZjcHUsIEVNVUxBVEVEX01UTVNSV0VfRVhJVFMpOwotCX07Ci19Cit2b2lkIGt2bXBwY19zZXRfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIG5ld19tc3IpOwordm9pZCBrdm1wcGNfbW11X21zcl9ub3RpZnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgb2xkX21zcik7CiAKIGludCBrdm1wcGNfYm9va2VfZW11bGF0ZV9vcChzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluc3QsIGludCAqYWR2YW5jZSk7CiBpbnQga3ZtcHBjX2Jvb2tlX2VtdWxhdGVfbWZzcHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgc3BybiwgaW50IHJ0KTsKIGludCBrdm1wcGNfYm9va2VfZW11bGF0ZV9tdHNwcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBzcHJuLCBpbnQgcnMpOwogCisvKiBsb3ctbGV2ZWwgYXNtIGNvZGUgdG8gdHJhbnNmZXIgZ3Vlc3Qgc3RhdGUgKi8KK3ZvaWQga3ZtcHBjX2xvYWRfZ3Vlc3Rfc3BlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Cit2b2lkIGt2bXBwY19zYXZlX2d1ZXN0X3NwZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCisvKiBoaWdoLWxldmVsIGZ1bmN0aW9uLCBtYW5hZ2VzIGZsYWdzLCBob3N0IHN0YXRlICovCit2b2lkIGt2bXBwY192Y3B1X2Rpc2FibGVfc3BlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisKICNlbmRpZiAvKiBfX0tWTV9CT09LRV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2VfaW50ZXJydXB0cy5TIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZV9pbnRlcnJ1cHRzLlMKaW5kZXggYjU4Y2NhZS4uNDJmMmZiMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZV9pbnRlcnJ1cHRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZV9pbnRlcnJ1cHRzLlMKQEAgLTEzLDYgKzEzLDcgQEAKICAqIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICAqCiAgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDcKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCiAgKgogICogQXV0aG9yczogSG9sbGlzIEJsYW5jaGFyZCA8aG9sbGlzYkB1cy5pYm0uY29tPgogICovCkBAIC0yNCw4ICsyNSw2IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAotI2RlZmluZSBLVk1QUENfTVNSX01BU0sgKE1TUl9DRXxNU1JfRUV8TVNSX1BSfE1TUl9ERXxNU1JfTUV8TVNSX0lTfE1TUl9EUykKLQogI2RlZmluZSBWQ1BVX0dQUihuKSAgICAgKFZDUFVfR1BSUyArIChuICogNCkpCiAKIC8qIFRoZSBob3N0IHN0YWNrIGxheW91dDogKi8KQEAgLTE5Miw2ICsxOTEsMTIgQEAKIAlsd3oJcjMsIFZDUFVfSE9TVF9QSUQocjQpCiAJbXRzcHIJU1BSTl9QSUQsIHIzCiAKKyNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCisJLyogd2UgY2hlYXQgYW5kIGtub3cgdGhhdCBMaW51eCBkb2Vzbid0IHVzZSBQSUQxIHdoaWNoIGlzIGFsd2F5cyAwICovCisJbGlzCXIzLCAwCisJbXRzcHIJU1BSTl9QSUQxLCByMworI2VuZGlmCisKIAkvKiBSZXN0b3JlIGhvc3QgSVZQUiBiZWZvcmUgcmUtZW5hYmxpbmcgaW50ZXJydXB0cy4gV2UgY2hlYXQgYW5kIGtub3cKIAkgKiB0aGF0IExpbnV4IElWUFIgaXMgYWx3YXlzIDB4YzAwMDAwMDAuICovCiAJbGlzCXIzLCAweGMwMDAKQEAgLTI0MSw2ICsyNDYsMTQgQEAKIGhlYXZ5d2VpZ2h0X2V4aXQ6CiAJLyogTm90IHJldHVybmluZyB0byBndWVzdC4gKi8KIAorI2lmZGVmIENPTkZJR19TUEUKKwkvKiBzYXZlIGd1ZXN0IFNQRUZTQ1IgYW5kIGxvYWQgaG9zdCBTUEVGU0NSICovCisJbWZzcHIJcjksIFNQUk5fU1BFRlNDUgorCXN0dwlyOSwgVkNQVV9TUEVGU0NSKHI0KQorCWx3eglyOSwgVkNQVV9IT1NUX1NQRUZTQ1IocjQpCisJbXRzcHIJU1BSTl9TUEVGU0NSLCByOQorI2VuZGlmCisKIAkvKiBXZSBhbHJlYWR5IHNhdmVkIGd1ZXN0IHZvbGF0aWxlIHJlZ2lzdGVyIHN0YXRlOyBub3cgc2F2ZSB0aGUKIAkgKiBub24tdm9sYXRpbGVzLiAqLwogCXN0dwlyMTUsIFZDUFVfR1BSKHIxNSkocjQpCkBAIC0zNDIsNiArMzU1LDE0IEBACiAJbHd6CXIzMCwgVkNQVV9HUFIocjMwKShyNCkKIAlsd3oJcjMxLCBWQ1BVX0dQUihyMzEpKHI0KQogCisjaWZkZWYgQ09ORklHX1NQRQorCS8qIHNhdmUgaG9zdCBTUEVGU0NSIGFuZCBsb2FkIGd1ZXN0IFNQRUZTQ1IgKi8KKwltZnNwcglyMywgU1BSTl9TUEVGU0NSCisJc3R3CXIzLCBWQ1BVX0hPU1RfU1BFRlNDUihyNCkKKwlsd3oJcjMsIFZDUFVfU1BFRlNDUihyNCkKKwltdHNwcglTUFJOX1NQRUZTQ1IsIHIzCisjZW5kaWYKKwogbGlnaHR3ZWlnaHRfZXhpdDoKIAlzdHcJcjIsIEhPU1RfUjIocjEpCiAKQEAgLTM1MCw2ICszNzEsMTEgQEAKIAlsd3oJcjMsIFZDUFVfU0hBRE9XX1BJRChyNCkKIAltdHNwcglTUFJOX1BJRCwgcjMKIAorI2lmZGVmIENPTkZJR19GU0xfQk9PS0UKKwlsd3oJcjMsIFZDUFVfU0hBRE9XX1BJRDEocjQpCisJbXRzcHIJU1BSTl9QSUQxLCByMworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfNDR4CiAJaWNjY2kJMCwgMCAvKiBYWFggaGFjayAqLwogI2VuZGlmCkBAIC00MDUsMjAgKzQzMSwxNyBAQAogCiAJLyogRmluaXNoIGxvYWRpbmcgZ3Vlc3Qgdm9sYXRpbGVzIGFuZCBqdW1wIHRvIGd1ZXN0LiAqLwogCWx3eglyMywgVkNQVV9DVFIocjQpCisJbHd6CXI1LCBWQ1BVX0NSKHI0KQorCWx3eglyNiwgVkNQVV9QQyhyNCkKKwlsd3oJcjcsIFZDUFVfU0hBRE9XX01TUihyNCkKIAltdGN0cglyMwotCWx3eglyMywgVkNQVV9DUihyNCkKLQltdGNyCXIzCisJbXRjcglyNQorCW10c3JyMAlyNgorCW10c3JyMQlyNwogCWx3eglyNSwgVkNQVV9HUFIocjUpKHI0KQogCWx3eglyNiwgVkNQVV9HUFIocjYpKHI0KQogCWx3eglyNywgVkNQVV9HUFIocjcpKHI0KQogCWx3eglyOCwgVkNQVV9HUFIocjgpKHI0KQotCWx3eglyMywgVkNQVV9QQyhyNCkKLQltdHNycjAJcjMKLQlsd3oJcjMsIFZDUFVfU0hBUkVEKHI0KQotCWx3eglyMywgKFZDUFVfU0hBUkVEX01TUiArIDQpKHIzKQotCW9yaXMJcjMsIHIzLCBLVk1QUENfTVNSX01BU0tAaAotCW9yaQlyMywgcjMsIEtWTVBQQ19NU1JfTUFTS0BsCi0JbXRzcnIxCXIzCiAKIAkvKiBDbGVhciBhbnkgZGVidWcgZXZlbnRzIHdoaWNoIG9jY3VycmVkIHNpbmNlIHdlIGRpc2FibGVkIE1TUltERV0uCiAJICogWFhYIFRoaXMgZ2l2ZXMgdXMgYSAzLWluc3RydWN0aW9uIHdpbmRvdyBpbiB3aGljaCBhIGJyZWFrcG9pbnQKQEAgLTQzMCwzICs0NTMsMjQgQEAKIAlsd3oJcjMsIFZDUFVfR1BSKHIzKShyNCkKIAlsd3oJcjQsIFZDUFVfR1BSKHI0KShyNCkKIAlyZmkKKworI2lmZGVmIENPTkZJR19TUEUKK19HTE9CQUwoa3ZtcHBjX3NhdmVfZ3Vlc3Rfc3BlKQorCWNtcGkJMCxyMywwCisJYmVxbHItCisJU0FWRV8zMkVWUlMoMCwgcjQsIHIzLCBWQ1BVX0VWUikKKwlldnhvciAgIGV2cjYsIGV2cjYsIGV2cjYKKwlldm13dW1pYWEgZXZyNiwgZXZyNiwgZXZyNgorCWxpCXI0LFZDUFVfQUNDCisJZXZzdGRkeCBldnI2LCByNCwgcjMJCS8qIHNhdmUgYWNjICovCisJYmxyCisKK19HTE9CQUwoa3ZtcHBjX2xvYWRfZ3Vlc3Rfc3BlKQorCWNtcGkJMCxyMywwCisJYmVxbHItCisJbGkgICAgICByNCxWQ1BVX0FDQworCWV2bGRkeCAgZXZyNixyNCxyMworCWV2bXJhICAgZXZyNixldnI2CQkvKiBsb2FkIGFjYyAqLworCVJFU1RfMzJFVlJTKDAsIHI0LCByMywgVkNQVV9FVlIpCisJYmxyCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vZTUwMC5jIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwLmMKaW5kZXggMzE4ZGJjNi4uNzk3YTc0NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9lNTAwLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIEF1dGhvcjogWXUgTGl1LCA8eXUubGl1QGZyZWVzY2FsZS5jb20+CiAgKgpAQCAtNDEsNiArNDEsMTEgQEAKIHZvaWQga3ZtcHBjX2NvcmVfdmNwdV9wdXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWt2bXBwY19lNTAwX3RsYl9wdXQodmNwdSk7CisKKyNpZmRlZiBDT05GSUdfU1BFCisJaWYgKHZjcHUtPmFyY2guc2hhZG93X21zciAmIE1TUl9TUEUpCisJCWt2bXBwY192Y3B1X2Rpc2FibGVfc3BlKHZjcHUpOworI2VuZGlmCiB9CiAKIGludCBrdm1wcGNfY29yZV9jaGVja19wcm9jZXNzb3JfY29tcGF0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2U1MDBfZW11bGF0ZS5jIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX2VtdWxhdGUuYwppbmRleCA2OWNkNjY1Li5kNDhhZTM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2U1MDBfZW11bGF0ZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vZTUwMF9lbXVsYXRlLmMKQEAgLTgxLDggKzgxLDEyIEBACiAJCWt2bXBwY19zZXRfcGlkKHZjcHUsIHNwcl92YWwpOwogCQlicmVhazsKIAljYXNlIFNQUk5fUElEMToKKwkJaWYgKHNwcl92YWwgIT0gMCkKKwkJCXJldHVybiBFTVVMQVRFX0ZBSUw7CiAJCXZjcHVfZTUwMC0+cGlkWzFdID0gc3ByX3ZhbDsgYnJlYWs7CiAJY2FzZSBTUFJOX1BJRDI6CisJCWlmIChzcHJfdmFsICE9IDApCisJCQlyZXR1cm4gRU1VTEFURV9GQUlMOwogCQl2Y3B1X2U1MDAtPnBpZFsyXSA9IHNwcl92YWw7IGJyZWFrOwogCWNhc2UgU1BSTl9NQVMwOgogCQl2Y3B1X2U1MDAtPm1hczAgPSBzcHJfdmFsOyBicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vZTUwMF90bGIuYyBiL2FyY2gvcG93ZXJwYy9rdm0vZTUwMF90bGIuYwppbmRleCBiMThmZTM1Li4xM2M0MzJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2U1MDBfdGxiLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX3RsYi5jCkBAIC0yOCw4ICsyOCwxOTYgQEAKIAogI2RlZmluZSB0b19odGxiMV9lc2VsKGVzZWwpICh0bGIxX2VudHJ5X251bSAtIChlc2VsKSAtIDEpCiAKK3N0cnVjdCBpZCB7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJc3RydWN0IGlkICoqcGVudHJ5OworfTsKKworI2RlZmluZSBOVU1fVElEUyAyNTYKKworLyoKKyAqIFRoaXMgdGFibGUgcHJvdmlkZSBtYXBwaW5ncyBmcm9tOgorICogKGd1ZXN0QVMsZ3Vlc3RUSUQsZ3Vlc3RQUikgLS0+IElEIG9mIHBoeXNpY2FsIGNwdQorICogZ3Vlc3RBUwlbMC4uMV0KKyAqIGd1ZXN0VElECVswLi4yNTVdCisgKiBndWVzdFBSCVswLi4xXQorICogSUQJCVsxLi4yNTVdCisgKiBFYWNoIHZjcHUga2VlcHMgb25lIHZjcHVfaWRfdGFibGUuCisgKi8KK3N0cnVjdCB2Y3B1X2lkX3RhYmxlIHsKKwlzdHJ1Y3QgaWQgaWRbMl1bTlVNX1RJRFNdWzJdOworfTsKKworLyoKKyAqIFRoaXMgdGFibGUgcHJvdmlkZSByZXZlcnNlZCBtYXBwaW5ncyBvZiB2Y3B1X2lkX3RhYmxlOgorICogSUQgLS0+IGFkZHJlc3Mgb2YgdmNwdV9pZF90YWJsZSBpdGVtLgorICogRWFjaCBwaHlzaWNhbCBjb3JlIGhhcyBvbmUgcGNwdV9pZF90YWJsZS4KKyAqLworc3RydWN0IHBjcHVfaWRfdGFibGUgeworCXN0cnVjdCBpZCAqZW50cnlbTlVNX1RJRFNdOworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwY3B1X2lkX3RhYmxlLCBwY3B1X3NpZHMpOworCisvKiBUaGlzIHZhcmlhYmxlIGtlZXBzIGxhc3QgdXNlZCBzaGFkb3cgSUQgb24gbG9jYWwgY29yZS4KKyAqIFRoZSB2YWxpZCByYW5nZSBvZiBzaGFkb3cgSUQgaXMgWzEuLjI1NV0gKi8KK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBwY3B1X2xhc3RfdXNlZF9zaWQpOworCiBzdGF0aWMgdW5zaWduZWQgaW50IHRsYjFfZW50cnlfbnVtOwogCisvKgorICogQWxsb2NhdGUgYSBmcmVlIHNoYWRvdyBpZCBhbmQgc2V0dXAgYSB2YWxpZCBzaWQgbWFwcGluZyBpbiBnaXZlbiBlbnRyeS4KKyAqIEEgbWFwcGluZyBpcyBvbmx5IHZhbGlkIHdoZW4gdmNwdV9pZF90YWJsZSBhbmQgcGNwdV9pZF90YWJsZSBhcmUgbWF0Y2guCisgKgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgcHJlZW1wdGlvbiBkaXNhYmxlZCwgYW5kIGtlZXAgaXQgdGhhdCB3YXkgdW50aWwKKyAqIGl0IGhhcyBmaW5pc2hlZCB3aXRoIHRoZSByZXR1cm5lZCBzaGFkb3cgaWQgKGVpdGhlciB3cml0dGVuIGludG8gdGhlCisgKiBUTEIgb3IgYXJjaC5zaGFkb3dfcGlkLCBvciBkaXNjYXJkZWQpLgorICovCitzdGF0aWMgaW5saW5lIGludCBsb2NhbF9zaWRfc2V0dXBfb25lKHN0cnVjdCBpZCAqZW50cnkpCit7CisJdW5zaWduZWQgbG9uZyBzaWQ7CisJaW50IHJldCA9IC0xOworCisJc2lkID0gKysoX19nZXRfY3B1X3ZhcihwY3B1X2xhc3RfdXNlZF9zaWQpKTsKKwlpZiAoc2lkIDwgTlVNX1RJRFMpIHsKKwkJX19nZXRfY3B1X3ZhcihwY3B1X3NpZHMpLmVudHJ5W3NpZF0gPSBlbnRyeTsKKwkJZW50cnktPnZhbCA9IHNpZDsKKwkJZW50cnktPnBlbnRyeSA9ICZfX2dldF9jcHVfdmFyKHBjcHVfc2lkcykuZW50cnlbc2lkXTsKKwkJcmV0ID0gc2lkOworCX0KKworCS8qCisJICogSWYgc2lkID09IE5VTV9USURTLCB3ZSd2ZSBydW4gb3V0IG9mIHNpZHMuICBXZSByZXR1cm4gLTEsIGFuZAorCSAqIHRoZSBjYWxsZXIgd2lsbCBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcgYW5kIHN0YXJ0IG92ZXIuCisJICoKKwkgKiBzaWQgPiBOVU1fVElEUyBpbmRpY2F0ZXMgYSByYWNlLCB3aGljaCB3ZSBkaXNhYmxlIHByZWVtcHRpb24gdG8KKwkgKiBhdm9pZC4KKwkgKi8KKwlXQVJOX09OKHNpZCA+IE5VTV9USURTKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDaGVjayBpZiBnaXZlbiBlbnRyeSBjb250YWluIGEgdmFsaWQgc2hhZG93IGlkIG1hcHBpbmcuCisgKiBBbiBJRCBtYXBwaW5nIGlzIGNvbnNpZGVyZWQgdmFsaWQgb25seSBpZgorICogYm90aCB2Y3B1IGFuZCBwY3B1IGtub3cgdGhpcyBtYXBwaW5nLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIHByZWVtcHRpb24gZGlzYWJsZWQsIGFuZCBrZWVwIGl0IHRoYXQgd2F5IHVudGlsCisgKiBpdCBoYXMgZmluaXNoZWQgd2l0aCB0aGUgcmV0dXJuZWQgc2hhZG93IGlkIChlaXRoZXIgd3JpdHRlbiBpbnRvIHRoZQorICogVExCIG9yIGFyY2guc2hhZG93X3BpZCwgb3IgZGlzY2FyZGVkKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbG9jYWxfc2lkX2xvb2t1cChzdHJ1Y3QgaWQgKmVudHJ5KQoreworCWlmIChlbnRyeSAmJiBlbnRyeS0+dmFsICE9IDAgJiYKKwkgICAgX19nZXRfY3B1X3ZhcihwY3B1X3NpZHMpLmVudHJ5W2VudHJ5LT52YWxdID09IGVudHJ5ICYmCisJICAgIGVudHJ5LT5wZW50cnkgPT0gJl9fZ2V0X2NwdV92YXIocGNwdV9zaWRzKS5lbnRyeVtlbnRyeS0+dmFsXSkKKwkJcmV0dXJuIGVudHJ5LT52YWw7CisJcmV0dXJuIC0xOworfQorCisvKiBJbnZhbGlkYXRlIGFsbCBpZCBtYXBwaW5ncyBvbiBsb2NhbCBjb3JlICovCitzdGF0aWMgaW5saW5lIHZvaWQgbG9jYWxfc2lkX2Rlc3Ryb3lfYWxsKHZvaWQpCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJX19nZXRfY3B1X3ZhcihwY3B1X2xhc3RfdXNlZF9zaWQpID0gMDsKKwltZW1zZXQoJl9fZ2V0X2NwdV92YXIocGNwdV9zaWRzKSwgMCwgc2l6ZW9mKF9fZ2V0X2NwdV92YXIocGNwdV9zaWRzKSkpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkICprdm1wcGNfZTUwMF9pZF90YWJsZV9hbGxvYyhzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwKQoreworCXZjcHVfZTUwMC0+aWR0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZjcHVfaWRfdGFibGUpLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm4gdmNwdV9lNTAwLT5pZHQ7Cit9CisKK3N0YXRpYyB2b2lkIGt2bXBwY19lNTAwX2lkX3RhYmxlX2ZyZWUoc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCkKK3sKKwlrZnJlZSh2Y3B1X2U1MDAtPmlkdCk7Cit9CisKKy8qIEludmFsaWRhdGUgYWxsIG1hcHBpbmdzIG9uIHZjcHUgKi8KK3N0YXRpYyB2b2lkIGt2bXBwY19lNTAwX2lkX3RhYmxlX3Jlc2V0X2FsbChzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwKQoreworCW1lbXNldCh2Y3B1X2U1MDAtPmlkdCwgMCwgc2l6ZW9mKHN0cnVjdCB2Y3B1X2lkX3RhYmxlKSk7CisKKwkvKiBVcGRhdGUgc2hhZG93IHBpZCB3aGVuIG1hcHBpbmdzIGFyZSBjaGFuZ2VkICovCisJa3ZtcHBjX2U1MDBfcmVjYWxjX3NoYWRvd19waWQodmNwdV9lNTAwKTsKK30KKworLyogSW52YWxpZGF0ZSBvbmUgSUQgbWFwcGluZyBvbiB2Y3B1ICovCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX2U1MDBfaWRfdGFibGVfcmVzZXRfb25lKAorCQkJICAgICAgIHN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAsCisJCQkgICAgICAgaW50IGFzLCBpbnQgcGlkLCBpbnQgcHIpCit7CisJc3RydWN0IHZjcHVfaWRfdGFibGUgKmlkdCA9IHZjcHVfZTUwMC0+aWR0OworCisJQlVHX09OKGFzID49IDIpOworCUJVR19PTihwaWQgPj0gTlVNX1RJRFMpOworCUJVR19PTihwciA+PSAyKTsKKworCWlkdC0+aWRbYXNdW3BpZF1bcHJdLnZhbCA9IDA7CisJaWR0LT5pZFthc11bcGlkXVtwcl0ucGVudHJ5ID0gTlVMTDsKKworCS8qIFVwZGF0ZSBzaGFkb3cgcGlkIHdoZW4gbWFwcGluZ3MgYXJlIGNoYW5nZWQgKi8KKwlrdm1wcGNfZTUwMF9yZWNhbGNfc2hhZG93X3BpZCh2Y3B1X2U1MDApOworfQorCisvKgorICogTWFwIGd1ZXN0ICh2Y3B1LEFTLElELFBSKSB0byBwaHlzaWNhbCBjb3JlIHNoYWRvdyBpZC4KKyAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgbG9va3VwIGlmIGEgdmFsaWQgbWFwcGluZyBleGlzdHMsCisgKiBpZiBub3QsIHRoZW4gY3JlYXRlcyBhIG5ldyBvbmUuCisgKgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgcHJlZW1wdGlvbiBkaXNhYmxlZCwgYW5kIGtlZXAgaXQgdGhhdCB3YXkgdW50aWwKKyAqIGl0IGhhcyBmaW5pc2hlZCB3aXRoIHRoZSByZXR1cm5lZCBzaGFkb3cgaWQgKGVpdGhlciB3cml0dGVuIGludG8gdGhlCisgKiBUTEIgb3IgYXJjaC5zaGFkb3dfcGlkLCBvciBkaXNjYXJkZWQpLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGt2bXBwY19lNTAwX2dldF9zaWQoc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCwKKwkJCQkJdW5zaWduZWQgaW50IGFzLCB1bnNpZ25lZCBpbnQgZ2lkLAorCQkJCQl1bnNpZ25lZCBpbnQgcHIsIGludCBhdm9pZF9yZWN1cnNpb24pCit7CisJc3RydWN0IHZjcHVfaWRfdGFibGUgKmlkdCA9IHZjcHVfZTUwMC0+aWR0OworCWludCBzaWQ7CisKKwlCVUdfT04oYXMgPj0gMik7CisJQlVHX09OKGdpZCA+PSBOVU1fVElEUyk7CisJQlVHX09OKHByID49IDIpOworCisJc2lkID0gbG9jYWxfc2lkX2xvb2t1cCgmaWR0LT5pZFthc11bZ2lkXVtwcl0pOworCisJd2hpbGUgKHNpZCA8PSAwKSB7CisJCS8qIE5vIG1hcHBpbmcgeWV0ICovCisJCXNpZCA9IGxvY2FsX3NpZF9zZXR1cF9vbmUoJmlkdC0+aWRbYXNdW2dpZF1bcHJdKTsKKwkJaWYgKHNpZCA8PSAwKSB7CisJCQlfdGxiaWxfYWxsKCk7CisJCQlsb2NhbF9zaWRfZGVzdHJveV9hbGwoKTsKKwkJfQorCisJCS8qIFVwZGF0ZSBzaGFkb3cgcGlkIHdoZW4gbWFwcGluZ3MgYXJlIGNoYW5nZWQgKi8KKwkJaWYgKCFhdm9pZF9yZWN1cnNpb24pCisJCQlrdm1wcGNfZTUwMF9yZWNhbGNfc2hhZG93X3BpZCh2Y3B1X2U1MDApOworCX0KKworCXJldHVybiBzaWQ7Cit9CisKKy8qIE1hcCBndWVzdCBwaWQgdG8gc2hhZG93LgorICogV2UgdXNlIFBJRCB0byBrZWVwIHNoYWRvdyBvZiBjdXJyZW50IGd1ZXN0IG5vbi16ZXJvIFBJRCwKKyAqIGFuZCB1c2UgUElEMSB0byBrZWVwIHNoYWRvdyBvZiBndWVzdCB6ZXJvIFBJRC4KKyAqIFNvIHRoYXQgZ3Vlc3QgdGxiZSB3aXRoIFRJRD0wIGNhbiBiZSBhY2Nlc3NlZCBhdCBhbnkgdGltZSAqLwordm9pZCBrdm1wcGNfZTUwMF9yZWNhbGNfc2hhZG93X3BpZChzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwKQoreworCXByZWVtcHRfZGlzYWJsZSgpOworCXZjcHVfZTUwMC0+dmNwdS5hcmNoLnNoYWRvd19waWQgPSBrdm1wcGNfZTUwMF9nZXRfc2lkKHZjcHVfZTUwMCwKKwkJCWdldF9jdXJfYXMoJnZjcHVfZTUwMC0+dmNwdSksCisJCQlnZXRfY3VyX3BpZCgmdmNwdV9lNTAwLT52Y3B1KSwKKwkJCWdldF9jdXJfcHIoJnZjcHVfZTUwMC0+dmNwdSksIDEpOworCXZjcHVfZTUwMC0+dmNwdS5hcmNoLnNoYWRvd19waWQxID0ga3ZtcHBjX2U1MDBfZ2V0X3NpZCh2Y3B1X2U1MDAsCisJCQlnZXRfY3VyX2FzKCZ2Y3B1X2U1MDAtPnZjcHUpLCAwLAorCQkJZ2V0X2N1cl9wcigmdmNwdV9lNTAwLT52Y3B1KSwgMSk7CisJcHJlZW1wdF9lbmFibGUoKTsKK30KKwogdm9pZCBrdm1wcGNfZHVtcF90bGJzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwID0gdG9fZTUwMCh2Y3B1KTsKQEAgLTQxLDI1ICsyMjksMTQgQEAKIAogCWZvciAodGxic2VsID0gMDsgdGxic2VsIDwgMjsgdGxic2VsKyspIHsKIAkJcHJpbnRrKCJHdWVzdCBUTEIlZDpcbiIsIHRsYnNlbCk7Ci0JCWZvciAoaSA9IDA7IGkgPCB2Y3B1X2U1MDAtPmd1ZXN0X3RsYl9zaXplW3RsYnNlbF07IGkrKykgewotCQkJdGxiZSA9ICZ2Y3B1X2U1MDAtPmd1ZXN0X3RsYlt0bGJzZWxdW2ldOworCQlmb3IgKGkgPSAwOyBpIDwgdmNwdV9lNTAwLT5ndGxiX3NpemVbdGxic2VsXTsgaSsrKSB7CisJCQl0bGJlID0gJnZjcHVfZTUwMC0+Z3RsYl9hcmNoW3RsYnNlbF1baV07CiAJCQlpZiAodGxiZS0+bWFzMSAmIE1BUzFfVkFMSUQpCiAJCQkJcHJpbnRrKCIgR1slZF1bJTNkXSB8ICAlMDhYIHwgJTA4WCB8ICUwOFggfCAlMDhYIHxcbiIsCiAJCQkJCXRsYnNlbCwgaSwgdGxiZS0+bWFzMSwgdGxiZS0+bWFzMiwKIAkJCQkJdGxiZS0+bWFzMywgdGxiZS0+bWFzNyk7CiAJCX0KIAl9Ci0KLQlmb3IgKHRsYnNlbCA9IDA7IHRsYnNlbCA8IDI7IHRsYnNlbCsrKSB7Ci0JCXByaW50aygiU2hhZG93IFRMQiVkOlxuIiwgdGxic2VsKTsKLQkJZm9yIChpID0gMDsgaSA8IHZjcHVfZTUwMC0+c2hhZG93X3RsYl9zaXplW3RsYnNlbF07IGkrKykgewotCQkJdGxiZSA9ICZ2Y3B1X2U1MDAtPnNoYWRvd190bGJbdGxic2VsXVtpXTsKLQkJCWlmICh0bGJlLT5tYXMxICYgTUFTMV9WQUxJRCkKLQkJCQlwcmludGsoIiBTWyVkXVslM2RdIHwgICUwOFggfCAlMDhYIHwgJTA4WCB8ICUwOFggfFxuIiwKLQkJCQkJdGxic2VsLCBpLCB0bGJlLT5tYXMxLCB0bGJlLT5tYXMyLAotCQkJCQl0bGJlLT5tYXMzLCB0bGJlLT5tYXM3KTsKLQkJfQotCX0KIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGxiMF9nZXRfbmV4dF92aWN0aW0oCkBAIC02NywxNiArMjQ0LDE3IEBACiB7CiAJdW5zaWduZWQgaW50IHZpY3RpbTsKIAotCXZpY3RpbSA9IHZjcHVfZTUwMC0+Z3Vlc3RfdGxiX252WzBdKys7Ci0JaWYgKHVubGlrZWx5KHZjcHVfZTUwMC0+Z3Vlc3RfdGxiX252WzBdID49IEtWTV9FNTAwX1RMQjBfV0FZX05VTSkpCi0JCXZjcHVfZTUwMC0+Z3Vlc3RfdGxiX252WzBdID0gMDsKKwl2aWN0aW0gPSB2Y3B1X2U1MDAtPmd0bGJfbnZbMF0rKzsKKwlpZiAodW5saWtlbHkodmNwdV9lNTAwLT5ndGxiX252WzBdID49IEtWTV9FNTAwX1RMQjBfV0FZX05VTSkpCisJCXZjcHVfZTUwMC0+Z3RsYl9udlswXSA9IDA7CiAKIAlyZXR1cm4gdmljdGltOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0bGIxX21heF9zaGFkb3dfc2l6ZSh2b2lkKQogewotCXJldHVybiB0bGIxX2VudHJ5X251bSAtIHRsYmNhbV9pbmRleDsKKwkvKiByZXNlcnZlIG9uZSBlbnRyeSBmb3IgbWFnaWMgcGFnZSAqLworCXJldHVybiB0bGIxX2VudHJ5X251bSAtIHRsYmNhbV9pbmRleCAtIDE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHRsYmVfaXNfd3JpdGFibGUoc3RydWN0IHRsYmUgKnRsYmUpCkBAIC0xMTIsNzIgKzI5MCwxNDkgQEAKIC8qCiAgKiB3cml0aW5nIHNoYWRvdyB0bGIgZW50cnkgdG8gaG9zdCBUTEIKICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fd3JpdGVfaG9zdF90bGJlKHN0cnVjdCB0bGJlICpzdGxiZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3dyaXRlX2hvc3RfdGxiZShzdHJ1Y3QgdGxiZSAqc3RsYmUsIHVpbnQzMl90IG1hczApCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwltdHNwcihTUFJOX01BUzAsIG1hczApOwogCW10c3ByKFNQUk5fTUFTMSwgc3RsYmUtPm1hczEpOwogCW10c3ByKFNQUk5fTUFTMiwgc3RsYmUtPm1hczIpOwogCW10c3ByKFNQUk5fTUFTMywgc3RsYmUtPm1hczMpOwogCW10c3ByKFNQUk5fTUFTNywgc3RsYmUtPm1hczcpOwotCV9fYXNtX18gX192b2xhdGlsZV9fICgidGxid2VcbiIgOiA6ICk7CisJYXNtIHZvbGF0aWxlKCJpc3luYzsgdGxid2UiIDogOiA6ICJtZW1vcnkiKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9ob3N0X3RsYmUoc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCwKLQkJaW50IHRsYnNlbCwgaW50IGVzZWwpCisJCWludCB0bGJzZWwsIGludCBlc2VsLCBzdHJ1Y3QgdGxiZSAqc3RsYmUpCiB7Ci0Jc3RydWN0IHRsYmUgKnN0bGJlID0gJnZjcHVfZTUwMC0+c2hhZG93X3RsYlt0bGJzZWxdW2VzZWxdOwotCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlpZiAodGxic2VsID09IDApIHsKLQkJX193cml0ZV9ob3N0X3RsYmUoc3RsYmUpOworCQlfX3dyaXRlX2hvc3RfdGxiZShzdGxiZSwKKwkJCQkgIE1BUzBfVExCU0VMKDApIHwKKwkJCQkgIE1BUzBfRVNFTChlc2VsICYgKEtWTV9FNTAwX1RMQjBfV0FZX05VTSAtIDEpKSk7CiAJfSBlbHNlIHsKLQkJdW5zaWduZWQgcmVnaXN0ZXIgbWFzMDsKLQotCQltYXMwID0gbWZzcHIoU1BSTl9NQVMwKTsKLQotCQltdHNwcihTUFJOX01BUzAsIE1BUzBfVExCU0VMKDEpIHwgTUFTMF9FU0VMKHRvX2h0bGIxX2VzZWwoZXNlbCkpKTsKLQkJX193cml0ZV9ob3N0X3RsYmUoc3RsYmUpOwotCi0JCW10c3ByKFNQUk5fTUFTMCwgbWFzMCk7CisJCV9fd3JpdGVfaG9zdF90bGJlKHN0bGJlLAorCQkJCSAgTUFTMF9UTEJTRUwoMSkgfAorCQkJCSAgTUFTMF9FU0VMKHRvX2h0bGIxX2VzZWwoZXNlbCkpKTsKIAl9Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOworCXRyYWNlX2t2bV9zdGxiX3dyaXRlKGluZGV4X29mKHRsYnNlbCwgZXNlbCksIHN0bGJlLT5tYXMxLCBzdGxiZS0+bWFzMiwKKwkJCSAgICAgc3RsYmUtPm1hczMsIHN0bGJlLT5tYXM3KTsKK30KKwordm9pZCBrdm1wcGNfbWFwX21hZ2ljKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwID0gdG9fZTUwMCh2Y3B1KTsKKwlzdHJ1Y3QgdGxiZSBtYWdpYzsKKwl1bG9uZyBzaGFyZWRfcGFnZSA9ICgodWxvbmcpdmNwdS0+YXJjaC5zaGFyZWQpICYgUEFHRV9NQVNLOworCXVuc2lnbmVkIGludCBzdGlkOworCXBmbl90IHBmbjsKKworCXBmbiA9IChwZm5fdCl2aXJ0X3RvX3BoeXMoKHZvaWQgKilzaGFyZWRfcGFnZSkgPj4gUEFHRV9TSElGVDsKKwlnZXRfcGFnZShwZm5fdG9fcGFnZShwZm4pKTsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCXN0aWQgPSBrdm1wcGNfZTUwMF9nZXRfc2lkKHZjcHVfZTUwMCwgMCwgMCwgMCwgMCk7CisKKwltYWdpYy5tYXMxID0gTUFTMV9WQUxJRCB8IE1BUzFfVFMgfCBNQVMxX1RJRChzdGlkKSB8CisJCSAgICAgTUFTMV9UU0laRShCT09LM0VfUEFHRVNaXzRLKTsKKwltYWdpYy5tYXMyID0gdmNwdS0+YXJjaC5tYWdpY19wYWdlX2VhIHwgTUFTMl9NOworCW1hZ2ljLm1hczMgPSAocGZuIDw8IFBBR0VfU0hJRlQpIHwKKwkJICAgICBNQVMzX1NXIHwgTUFTM19TUiB8IE1BUzNfVVcgfCBNQVMzX1VSOworCW1hZ2ljLm1hczcgPSBwZm4gPj4gKDMyIC0gUEFHRV9TSElGVCk7CisKKwlfX3dyaXRlX2hvc3RfdGxiZSgmbWFnaWMsIE1BUzBfVExCU0VMKDEpIHwgTUFTMF9FU0VMKHRsYmNhbV9pbmRleCkpOworCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKIHZvaWQga3ZtcHBjX2U1MDBfdGxiX2xvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgY3B1KQogewogCXN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAgPSB0b19lNTAwKHZjcHUpOwotCWludCBpOwotCXVuc2lnbmVkIHJlZ2lzdGVyIG1hczA7CiAKLQkvKiBMb2FkIGFsbCB2YWxpZCBUTEIxIGVudHJpZXMgdG8gcmVkdWNlIGd1ZXN0IHRsYiBtaXNzIGZhdWx0ICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQltYXMwID0gbWZzcHIoU1BSTl9NQVMwKTsKLQlmb3IgKGkgPSAwOyBpIDwgdGxiMV9tYXhfc2hhZG93X3NpemUoKTsgaSsrKSB7Ci0JCXN0cnVjdCB0bGJlICpzdGxiZSA9ICZ2Y3B1X2U1MDAtPnNoYWRvd190bGJbMV1baV07Ci0KLQkJaWYgKGdldF90bGJfdihzdGxiZSkpIHsKLQkJCW10c3ByKFNQUk5fTUFTMCwgTUFTMF9UTEJTRUwoMSkKLQkJCQkJfCBNQVMwX0VTRUwodG9faHRsYjFfZXNlbChpKSkpOwotCQkJX193cml0ZV9ob3N0X3RsYmUoc3RsYmUpOwotCQl9Ci0JfQotCW10c3ByKFNQUk5fTUFTMCwgbWFzMCk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOworCS8qIFNoYWRvdyBQSUQgbWF5IGJlIGV4cGlyZWQgb24gbG9jYWwgY29yZSAqLworCWt2bXBwY19lNTAwX3JlY2FsY19zaGFkb3dfcGlkKHZjcHVfZTUwMCk7CiB9CiAKIHZvaWQga3ZtcHBjX2U1MDBfdGxiX3B1dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JX3RsYmlsX2FsbCgpOworfQorCitzdGF0aWMgdm9pZCBrdm1wcGNfZTUwMF9zdGxiZV9pbnZhbGlkYXRlKHN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAsCisJCQkJCSBpbnQgdGxic2VsLCBpbnQgZXNlbCkKK3sKKwlzdHJ1Y3QgdGxiZSAqZ3RsYmUgPSAmdmNwdV9lNTAwLT5ndGxiX2FyY2hbdGxic2VsXVtlc2VsXTsKKwlzdHJ1Y3QgdmNwdV9pZF90YWJsZSAqaWR0ID0gdmNwdV9lNTAwLT5pZHQ7CisJdW5zaWduZWQgaW50IHByLCB0aWQsIHRzLCBwaWQ7CisJdTMyIHZhbCwgZWFkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRzID0gZ2V0X3RsYl90cyhndGxiZSk7CisJdGlkID0gZ2V0X3RsYl90aWQoZ3RsYmUpOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwkvKiBPbmUgZ3Vlc3QgSUQgbWF5IGJlIG1hcHBlZCB0byB0d28gc2hhZG93IElEcyAqLworCWZvciAocHIgPSAwOyBwciA8IDI7IHByKyspIHsKKwkJLyoKKwkJICogVGhlIHNoYWRvdyBQSUQgY2FuIGhhdmUgYSB2YWxpZCBtYXBwaW5nIG9uIGF0IG1vc3Qgb25lCisJCSAqIGhvc3QgQ1BVLiAgSW4gdGhlIGNvbW1vbiBjYXNlLCBpdCB3aWxsIGJlIHZhbGlkIG9uIHRoaXMKKwkJICogQ1BVLCBpbiB3aGljaCBjYXNlIChmb3IgVExCMCkgd2UgZG8gYSBsb2NhbCBpbnZhbGlkYXRpb24KKwkJICogb2YgdGhlIHNwZWNpZmljIGFkZHJlc3MuCisJCSAqCisJCSAqIElmIHRoZSBzaGFkb3cgUElEIGlzIG5vdCB2YWxpZCBvbiB0aGUgY3VycmVudCBob3N0IENQVSwgb3IKKwkJICogaWYgd2UncmUgaW52YWxpZGF0aW5nIGEgVExCMSBlbnRyeSwgd2UgaW52YWxpZGF0ZSB0aGUKKwkJICogZW50aXJlIHNoYWRvdyBQSUQuCisJCSAqLworCQlpZiAodGxic2VsID09IDEgfHwKKwkJICAgIChwaWQgPSBsb2NhbF9zaWRfbG9va3VwKCZpZHQtPmlkW3RzXVt0aWRdW3ByXSkpIDw9IDApIHsKKwkJCWt2bXBwY19lNTAwX2lkX3RhYmxlX3Jlc2V0X29uZSh2Y3B1X2U1MDAsIHRzLCB0aWQsIHByKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVGhlIGd1ZXN0IGlzIGludmFsaWRhdGluZyBhIFRMQjAgZW50cnkgd2hpY2ggaXMgaW4gYSBQSUQKKwkJICogdGhhdCBoYXMgYSB2YWxpZCBzaGFkb3cgbWFwcGluZyBvbiB0aGlzIGhvc3QgQ1BVLiAgV2UKKwkJICogc2VhcmNoIGhvc3QgVExCMCB0byBpbnZhbGlkYXRlIGl0J3Mgc2hhZG93IFRMQiBlbnRyeSwKKwkJICogc2ltaWxhciB0byBfX3RsYmlsX3ZhIGV4Y2VwdCB0aGF0IHdlIG5lZWQgdG8gbG9vayBpbiBBUzEuCisJCSAqLworCQl2YWwgPSAocGlkIDw8IE1BUzZfU1BJRF9TSElGVCkgfCBNQVM2X1NBUzsKKwkJZWFkZHIgPSBnZXRfdGxiX2VhZGRyKGd0bGJlKTsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkJbXRzcHIoU1BSTl9NQVM2LCB2YWwpOworCQlhc20gdm9sYXRpbGUoInRsYnN4IDAsICVbZWFkZHJdIiA6IDogW2VhZGRyXSAiciIgKGVhZGRyKSk7CisJCXZhbCA9IG1mc3ByKFNQUk5fTUFTMSk7CisJCWlmICh2YWwgJiBNQVMxX1ZBTElEKSB7CisJCQltdHNwcihTUFJOX01BUzEsIHZhbCAmIH5NQVMxX1ZBTElEKTsKKwkJCWFzbSB2b2xhdGlsZSgidGxid2UiKTsKKwkJfQorCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisKKwlwcmVlbXB0X2VuYWJsZSgpOwogfQogCiAvKiBTZWFyY2ggdGhlIGd1ZXN0IFRMQiBmb3IgYSBtYXRjaGluZyBlbnRyeS4gKi8KIHN0YXRpYyBpbnQga3ZtcHBjX2U1MDBfdGxiX2luZGV4KHN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAsCiAJCWd2YV90IGVhZGRyLCBpbnQgdGxic2VsLCB1bnNpZ25lZCBpbnQgcGlkLCBpbnQgYXMpCiB7CisJaW50IHNpemUgPSB2Y3B1X2U1MDAtPmd0bGJfc2l6ZVt0bGJzZWxdOworCWludCBzZXRfYmFzZTsKIAlpbnQgaTsKIAotCS8qIFhYWCBSZXBsYWNlIGxvb3Agd2l0aCBmYW5jeSBkYXRhIHN0cnVjdHVyZXMuICovCi0JZm9yIChpID0gMDsgaSA8IHZjcHVfZTUwMC0+Z3Vlc3RfdGxiX3NpemVbdGxic2VsXTsgaSsrKSB7Ci0JCXN0cnVjdCB0bGJlICp0bGJlID0gJnZjcHVfZTUwMC0+Z3Vlc3RfdGxiW3RsYnNlbF1baV07CisJaWYgKHRsYnNlbCA9PSAwKSB7CisJCWludCBtYXNrID0gc2l6ZSAvIEtWTV9FNTAwX1RMQjBfV0FZX05VTSAtIDE7CisJCXNldF9iYXNlID0gKGVhZGRyID4+IFBBR0VfU0hJRlQpICYgbWFzazsKKwkJc2V0X2Jhc2UgKj0gS1ZNX0U1MDBfVExCMF9XQVlfTlVNOworCQlzaXplID0gS1ZNX0U1MDBfVExCMF9XQVlfTlVNOworCX0gZWxzZSB7CisJCXNldF9iYXNlID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXN0cnVjdCB0bGJlICp0bGJlID0gJnZjcHVfZTUwMC0+Z3RsYl9hcmNoW3RsYnNlbF1bc2V0X2Jhc2UgKyBpXTsKIAkJdW5zaWduZWQgaW50IHRpZDsKIAogCQlpZiAoZWFkZHIgPCBnZXRfdGxiX2VhZGRyKHRsYmUpKQpAQCAtMTk2LDY2ICs0NTEsMzIgQEAKIAkJaWYgKGdldF90bGJfdHModGxiZSkgIT0gYXMgJiYgYXMgIT0gLTEpCiAJCQljb250aW51ZTsKIAotCQlyZXR1cm4gaTsKKwkJcmV0dXJuIHNldF9iYXNlICsgaTsKIAl9CiAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyB2b2lkIGt2bXBwY19lNTAwX3NoYWRvd19yZWxlYXNlKHN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAsCi0JCWludCB0bGJzZWwsIGludCBlc2VsKQorc3RhdGljIGlubGluZSB2b2lkIGt2bXBwY19lNTAwX3ByaXZfc2V0dXAoc3RydWN0IHRsYmVfcHJpdiAqcHJpdiwKKwkJCQkJICBzdHJ1Y3QgdGxiZSAqZ3RsYmUsCisJCQkJCSAgcGZuX3QgcGZuKQogewotCXN0cnVjdCB0bGJlICpzdGxiZSA9ICZ2Y3B1X2U1MDAtPnNoYWRvd190bGJbdGxic2VsXVtlc2VsXTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZjcHVfZTUwMC0+c2hhZG93X3BhZ2VzW3RsYnNlbF1bZXNlbF07CisJcHJpdi0+cGZuID0gcGZuOworCXByaXYtPmZsYWdzID0gRTUwMF9UTEJfVkFMSUQ7CiAKLQlpZiAocGFnZSkgewotCQl2Y3B1X2U1MDAtPnNoYWRvd19wYWdlc1t0bGJzZWxdW2VzZWxdID0gTlVMTDsKLQotCQlpZiAoZ2V0X3RsYl92KHN0bGJlKSkgewotCQkJaWYgKHRsYmVfaXNfd3JpdGFibGUoc3RsYmUpKQotCQkJCWt2bV9yZWxlYXNlX3BhZ2VfZGlydHkocGFnZSk7Ci0JCQllbHNlCi0JCQkJa3ZtX3JlbGVhc2VfcGFnZV9jbGVhbihwYWdlKTsKLQkJfQotCX0KKwlpZiAodGxiZV9pc193cml0YWJsZShndGxiZSkpCisJCXByaXYtPmZsYWdzIHw9IEU1MDBfVExCX0RJUlRZOwogfQogCi1zdGF0aWMgdm9pZCBrdm1wcGNfZTUwMF9zdGxiZV9pbnZhbGlkYXRlKHN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAsCi0JCWludCB0bGJzZWwsIGludCBlc2VsKQorc3RhdGljIGlubGluZSB2b2lkIGt2bXBwY19lNTAwX3ByaXZfcmVsZWFzZShzdHJ1Y3QgdGxiZV9wcml2ICpwcml2KQogewotCXN0cnVjdCB0bGJlICpzdGxiZSA9ICZ2Y3B1X2U1MDAtPnNoYWRvd190bGJbdGxic2VsXVtlc2VsXTsKKwlpZiAocHJpdi0+ZmxhZ3MgJiBFNTAwX1RMQl9WQUxJRCkgeworCQlpZiAocHJpdi0+ZmxhZ3MgJiBFNTAwX1RMQl9ESVJUWSkKKwkJCWt2bV9yZWxlYXNlX3Bmbl9kaXJ0eShwcml2LT5wZm4pOworCQllbHNlCisJCQlrdm1fcmVsZWFzZV9wZm5fY2xlYW4ocHJpdi0+cGZuKTsKIAotCWt2bXBwY19lNTAwX3NoYWRvd19yZWxlYXNlKHZjcHVfZTUwMCwgdGxic2VsLCBlc2VsKTsKLQlzdGxiZS0+bWFzMSA9IDA7Ci0JdHJhY2Vfa3ZtX3N0bGJfaW52YWwoaW5kZXhfb2YodGxic2VsLCBlc2VsKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGt2bXBwY19lNTAwX3RsYjFfaW52YWxpZGF0ZShzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwLAotCQlndmFfdCBlYWRkciwgZ3ZhX3QgZWVuZCwgdTMyIHRpZCkKLXsKLQl1bnNpZ25lZCBpbnQgcGlkID0gdGlkICYgMHhmZjsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCS8qIFhYWCBSZXBsYWNlIGxvb3Agd2l0aCBmYW5jeSBkYXRhIHN0cnVjdHVyZXMuICovCi0JZm9yIChpID0gMDsgaSA8IHZjcHVfZTUwMC0+Z3Vlc3RfdGxiX3NpemVbMV07IGkrKykgewotCQlzdHJ1Y3QgdGxiZSAqc3RsYmUgPSAmdmNwdV9lNTAwLT5zaGFkb3dfdGxiWzFdW2ldOwotCQl1bnNpZ25lZCBpbnQgdGlkOwotCi0JCWlmICghZ2V0X3RsYl92KHN0bGJlKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChlZW5kIDwgZ2V0X3RsYl9lYWRkcihzdGxiZSkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoZWFkZHIgPiBnZXRfdGxiX2VuZChzdGxiZSkpCi0JCQljb250aW51ZTsKLQotCQl0aWQgPSBnZXRfdGxiX3RpZChzdGxiZSk7Ci0JCWlmICh0aWQgJiYgKHRpZCAhPSBwaWQpKQotCQkJY29udGludWU7Ci0KLQkJa3ZtcHBjX2U1MDBfc3RsYmVfaW52YWxpZGF0ZSh2Y3B1X2U1MDAsIDEsIGkpOwotCQl3cml0ZV9ob3N0X3RsYmUodmNwdV9lNTAwLCAxLCBpKTsKKwkJcHJpdi0+ZmxhZ3MgPSAwOwogCX0KIH0KIApAQCAtMjczLDcgKzQ5NCw3IEBACiAJdHNpemVkID0gKHZjcHVfZTUwMC0+bWFzNCA+PiA3KSAmIDB4MWY7CiAKIAl2Y3B1X2U1MDAtPm1hczAgPSBNQVMwX1RMQlNFTCh0bGJzZWwpIHwgTUFTMF9FU0VMKHZpY3RpbSkKLQkJfCBNQVMwX05WKHZjcHVfZTUwMC0+Z3Vlc3RfdGxiX252W3RsYnNlbF0pOworCQl8IE1BUzBfTlYodmNwdV9lNTAwLT5ndGxiX252W3RsYnNlbF0pOwogCXZjcHVfZTUwMC0+bWFzMSA9IE1BUzFfVkFMSUQgfCAoYXMgPyBNQVMxX1RTIDogMCkKIAkJfCBNQVMxX1RJRCh2Y3B1X2U1MDAtPnBpZFtwaWRzZWxdKQogCQl8IE1BUzFfVFNJWkUodHNpemVkKTsKQEAgLTI4Niw1NiArNTA3LDE1NCBAQAogCXZjcHVfZTUwMC0+bWFzNyA9IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1wcGNfZTUwMF9zaGFkb3dfbWFwKHN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAsCi0JdTY0IGd2YWRkciwgZ2ZuX3QgZ2ZuLCBzdHJ1Y3QgdGxiZSAqZ3RsYmUsIGludCB0bGJzZWwsIGludCBlc2VsKQorc3RhdGljIGlubGluZSB2b2lkIGt2bXBwY19lNTAwX3NldHVwX3N0bGJlKHN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAsCisJCQkJCSAgIHN0cnVjdCB0bGJlICpndGxiZSwgaW50IHRzaXplLAorCQkJCQkgICBzdHJ1Y3QgdGxiZV9wcml2ICpwcml2LAorCQkJCQkgICB1NjQgZ3ZhZGRyLCBzdHJ1Y3QgdGxiZSAqc3RsYmUpCiB7Ci0Jc3RydWN0IHBhZ2UgKm5ld19wYWdlOwotCXN0cnVjdCB0bGJlICpzdGxiZTsKLQlocGFfdCBocGFkZHI7CisJcGZuX3QgcGZuID0gcHJpdi0+cGZuOworCXVuc2lnbmVkIGludCBzdGlkOwogCi0Jc3RsYmUgPSAmdmNwdV9lNTAwLT5zaGFkb3dfdGxiW3RsYnNlbF1bZXNlbF07CisJc3RpZCA9IGt2bXBwY19lNTAwX2dldF9zaWQodmNwdV9lNTAwLCBnZXRfdGxiX3RzKGd0bGJlKSwKKwkJCQkgICBnZXRfdGxiX3RpZChndGxiZSksCisJCQkJICAgZ2V0X2N1cl9wcigmdmNwdV9lNTAwLT52Y3B1KSwgMCk7CiAKLQkvKiBHZXQgcmVmZXJlbmNlIHRvIG5ldyBwYWdlLiAqLwotCW5ld19wYWdlID0gZ2ZuX3RvX3BhZ2UodmNwdV9lNTAwLT52Y3B1Lmt2bSwgZ2ZuKTsKLQlpZiAoaXNfZXJyb3JfcGFnZShuZXdfcGFnZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBnZXQgZ3Vlc3QgcGFnZSBmb3IgZ2ZuICVseCFcbiIsCi0JCQkJKGxvbmcpZ2ZuKTsKLQkJa3ZtX3JlbGVhc2VfcGFnZV9jbGVhbihuZXdfcGFnZSk7Ci0JCXJldHVybjsKLQl9Ci0JaHBhZGRyID0gcGFnZV90b19waHlzKG5ld19wYWdlKTsKLQotCS8qIERyb3AgcmVmZXJlbmNlIHRvIG9sZCBwYWdlLiAqLwotCWt2bXBwY19lNTAwX3NoYWRvd19yZWxlYXNlKHZjcHVfZTUwMCwgdGxic2VsLCBlc2VsKTsKLQotCXZjcHVfZTUwMC0+c2hhZG93X3BhZ2VzW3RsYnNlbF1bZXNlbF0gPSBuZXdfcGFnZTsKLQotCS8qIEZvcmNlIFRTPTEgSVBST1Q9MCBUU0laRT00S0IgZm9yIGFsbCBndWVzdCBtYXBwaW5ncy4gKi8KLQlzdGxiZS0+bWFzMSA9IE1BUzFfVFNJWkUoQk9PSzNFX1BBR0VTWl80SykKLQkJfCBNQVMxX1RJRChnZXRfdGxiX3RpZChndGxiZSkpIHwgTUFTMV9UUyB8IE1BUzFfVkFMSUQ7CisJLyogRm9yY2UgVFM9MSBJUFJPVD0wIGZvciBhbGwgZ3Vlc3QgbWFwcGluZ3MuICovCisJc3RsYmUtPm1hczEgPSBNQVMxX1RTSVpFKHRzaXplKQorCQl8IE1BUzFfVElEKHN0aWQpIHwgTUFTMV9UUyB8IE1BUzFfVkFMSUQ7CiAJc3RsYmUtPm1hczIgPSAoZ3ZhZGRyICYgTUFTMl9FUE4pCiAJCXwgZTUwMF9zaGFkb3dfbWFzMl9hdHRyaWIoZ3RsYmUtPm1hczIsCiAJCQkJdmNwdV9lNTAwLT52Y3B1LmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfUFIpOwotCXN0bGJlLT5tYXMzID0gKGhwYWRkciAmIE1BUzNfUlBOKQorCXN0bGJlLT5tYXMzID0gKChwZm4gPDwgUEFHRV9TSElGVCkgJiBNQVMzX1JQTikKIAkJfCBlNTAwX3NoYWRvd19tYXMzX2F0dHJpYihndGxiZS0+bWFzMywKIAkJCQl2Y3B1X2U1MDAtPnZjcHUuYXJjaC5zaGFyZWQtPm1zciAmIE1TUl9QUik7Ci0Jc3RsYmUtPm1hczcgPSAoaHBhZGRyID4+IDMyKSAmIE1BUzdfUlBOOworCXN0bGJlLT5tYXM3ID0gKHBmbiA+PiAoMzIgLSBQQUdFX1NISUZUKSkgJiBNQVM3X1JQTjsKK30KIAotCXRyYWNlX2t2bV9zdGxiX3dyaXRlKGluZGV4X29mKHRsYnNlbCwgZXNlbCksIHN0bGJlLT5tYXMxLCBzdGxiZS0+bWFzMiwKLQkJCSAgICAgc3RsYmUtPm1hczMsIHN0bGJlLT5tYXM3KTsKKworc3RhdGljIGlubGluZSB2b2lkIGt2bXBwY19lNTAwX3NoYWRvd19tYXAoc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCwKKwl1NjQgZ3ZhZGRyLCBnZm5fdCBnZm4sIHN0cnVjdCB0bGJlICpndGxiZSwgaW50IHRsYnNlbCwgaW50IGVzZWwsCisJc3RydWN0IHRsYmUgKnN0bGJlKQoreworCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3Q7CisJdW5zaWduZWQgbG9uZyBwZm4sIGh2YTsKKwlpbnQgcGZubWFwID0gMDsKKwlpbnQgdHNpemUgPSBCT09LM0VfUEFHRVNaXzRLOworCXN0cnVjdCB0bGJlX3ByaXYgKnByaXY7CisKKwkvKgorCSAqIFRyYW5zbGF0ZSBndWVzdCBwaHlzaWNhbCB0byB0cnVlIHBoeXNpY2FsLCBhY3F1aXJpbmcKKwkgKiBhIHBhZ2UgcmVmZXJlbmNlIGlmIGl0IGlzIG5vcm1hbCwgbm9uLXJlc2VydmVkIG1lbW9yeS4KKwkgKgorCSAqIGdmbl90b19tZW1zbG90KCkgbXVzdCBzdWNjZWVkIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvdWxkbid0CisJICogaGF2ZSBnb3R0ZW4gdGhpcyBmYXIuICBFdmVudHVhbGx5IHdlIHNob3VsZCBqdXN0IHBhc3MgdGhlIHNsb3QKKwkgKiBwb2ludGVyIHRocm91Z2ggZnJvbSB0aGUgZmlyc3QgbG9va3VwLgorCSAqLworCXNsb3QgPSBnZm5fdG9fbWVtc2xvdCh2Y3B1X2U1MDAtPnZjcHUua3ZtLCBnZm4pOworCWh2YSA9IGdmbl90b19odmFfbWVtc2xvdChzbG90LCBnZm4pOworCisJaWYgKHRsYnNlbCA9PSAxKSB7CisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwkJdm1hID0gZmluZF92bWEoY3VycmVudC0+bW0sIGh2YSk7CisJCWlmICh2bWEgJiYgaHZhID49IHZtYS0+dm1fc3RhcnQgJiYKKwkJICAgICh2bWEtPnZtX2ZsYWdzICYgVk1fUEZOTUFQKSkgeworCQkJLyoKKwkJCSAqIFRoaXMgVk1BIGlzIGEgcGh5c2ljYWxseSBjb250aWd1b3VzIHJlZ2lvbiAoZS5nLgorCQkJICogL2Rldi9tZW0pIHRoYXQgYnlwYXNzZXMgbm9ybWFsIExpbnV4IHBhZ2UKKwkJCSAqIG1hbmFnZW1lbnQuICBGaW5kIHRoZSBvdmVybGFwIGJldHdlZW4gdGhlCisJCQkgKiB2bWEgYW5kIHRoZSBtZW1zbG90LgorCQkJICovCisKKwkJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKwkJCXVuc2lnbmVkIGxvbmcgc2xvdF9zdGFydCwgc2xvdF9lbmQ7CisKKwkJCXBmbm1hcCA9IDE7CisKKwkJCXN0YXJ0ID0gdm1hLT52bV9wZ29mZjsKKwkJCWVuZCA9IHN0YXJ0ICsKKwkJCSAgICAgICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUKTsKKworCQkJcGZuID0gc3RhcnQgKyAoKGh2YSAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpOworCisJCQlzbG90X3N0YXJ0ID0gcGZuIC0gKGdmbiAtIHNsb3QtPmJhc2VfZ2ZuKTsKKwkJCXNsb3RfZW5kID0gc2xvdF9zdGFydCArIHNsb3QtPm5wYWdlczsKKworCQkJaWYgKHN0YXJ0IDwgc2xvdF9zdGFydCkKKwkJCQlzdGFydCA9IHNsb3Rfc3RhcnQ7CisJCQlpZiAoZW5kID4gc2xvdF9lbmQpCisJCQkJZW5kID0gc2xvdF9lbmQ7CisKKwkJCXRzaXplID0gKGd0bGJlLT5tYXMxICYgTUFTMV9UU0laRV9NQVNLKSA+PgorCQkJCU1BUzFfVFNJWkVfU0hJRlQ7CisKKwkJCS8qCisJCQkgKiBlNTAwIGRvZXNuJ3QgaW1wbGVtZW50IHRoZSBsb3dlc3QgdHNpemUgYml0LAorCQkJICogb3IgMUsgcGFnZXMuCisJCQkgKi8KKwkJCXRzaXplID0gbWF4KEJPT0szRV9QQUdFU1pfNEssIHRzaXplICYgfjEpOworCisJCQkvKgorCQkJICogTm93IGZpbmQgdGhlIGxhcmdlc3QgdHNpemUgKHVwIHRvIHdoYXQgdGhlIGd1ZXN0CisJCQkgKiByZXF1ZXN0ZWQpIHRoYXQgd2lsbCBjb3ZlciBnZm4sIHN0YXkgd2l0aGluIHRoZQorCQkJICogcmFuZ2UsIGFuZCBmb3Igd2hpY2ggZ2ZuIGFuZCBwZm4gYXJlIG11dHVhbGx5CisJCQkgKiBhbGlnbmVkLgorCQkJICovCisKKwkJCWZvciAoOyB0c2l6ZSA+IEJPT0szRV9QQUdFU1pfNEs7IHRzaXplIC09IDIpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGdmbl9zdGFydCwgZ2ZuX2VuZCwgdHNpemVfcGFnZXM7CisJCQkJdHNpemVfcGFnZXMgPSAxIDw8ICh0c2l6ZSAtIDIpOworCisJCQkJZ2ZuX3N0YXJ0ID0gZ2ZuICYgfih0c2l6ZV9wYWdlcyAtIDEpOworCQkJCWdmbl9lbmQgPSBnZm5fc3RhcnQgKyB0c2l6ZV9wYWdlczsKKworCQkJCWlmIChnZm5fc3RhcnQgKyBwZm4gLSBnZm4gPCBzdGFydCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGdmbl9lbmQgKyBwZm4gLSBnZm4gPiBlbmQpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgoZ2ZuICYgKHRzaXplX3BhZ2VzIC0gMSkpICE9CisJCQkJICAgIChwZm4gJiAodHNpemVfcGFnZXMgLSAxKSkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJZ3ZhZGRyICY9IH4oKHRzaXplX3BhZ2VzIDw8IFBBR0VfU0hJRlQpIC0gMSk7CisJCQkJcGZuICY9IH4odHNpemVfcGFnZXMgLSAxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJfQorCisJaWYgKGxpa2VseSghcGZubWFwKSkgeworCQlwZm4gPSBnZm5fdG9fcGZuX21lbXNsb3QodmNwdV9lNTAwLT52Y3B1Lmt2bSwgc2xvdCwgZ2ZuKTsKKwkJaWYgKGlzX2Vycm9yX3BmbihwZm4pKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGdldCByZWFsIHBhZ2UgZm9yIGdmbiAlbHghXG4iLAorCQkJCQkobG9uZylnZm4pOworCQkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBEcm9wIG9sZCBwcml2IGFuZCBzZXR1cCBuZXcgb25lLiAqLworCXByaXYgPSAmdmNwdV9lNTAwLT5ndGxiX3ByaXZbdGxic2VsXVtlc2VsXTsKKwlrdm1wcGNfZTUwMF9wcml2X3JlbGVhc2UocHJpdik7CisJa3ZtcHBjX2U1MDBfcHJpdl9zZXR1cChwcml2LCBndGxiZSwgcGZuKTsKKworCWt2bXBwY19lNTAwX3NldHVwX3N0bGJlKHZjcHVfZTUwMCwgZ3RsYmUsIHRzaXplLCBwcml2LCBndmFkZHIsIHN0bGJlKTsKIH0KIAogLyogWFhYIG9ubHkgbWFwIHRoZSBvbmUtb25lIGNhc2UsIGZvciBub3cgdXNlIFRMQjAgKi8KLXN0YXRpYyBpbnQga3ZtcHBjX2U1MDBfc3RsYmVfbWFwKHN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAsCi0JCWludCB0bGJzZWwsIGludCBlc2VsKQorc3RhdGljIGludCBrdm1wcGNfZTUwMF90bGIwX21hcChzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwLAorCQkJCWludCBlc2VsLCBzdHJ1Y3QgdGxiZSAqc3RsYmUpCiB7CiAJc3RydWN0IHRsYmUgKmd0bGJlOwogCi0JZ3RsYmUgPSAmdmNwdV9lNTAwLT5ndWVzdF90bGJbdGxic2VsXVtlc2VsXTsKKwlndGxiZSA9ICZ2Y3B1X2U1MDAtPmd0bGJfYXJjaFswXVtlc2VsXTsKIAogCWt2bXBwY19lNTAwX3NoYWRvd19tYXAodmNwdV9lNTAwLCBnZXRfdGxiX2VhZGRyKGd0bGJlKSwKIAkJCWdldF90bGJfcmFkZHIoZ3RsYmUpID4+IFBBR0VfU0hJRlQsCi0JCQlndGxiZSwgdGxic2VsLCBlc2VsKTsKKwkJCWd0bGJlLCAwLCBlc2VsLCBzdGxiZSk7CiAKIAlyZXR1cm4gZXNlbDsKIH0KQEAgLTM0NCw1MyArNjYzLDM3IEBACiAgKiB0aGUgc2hhZG93IFRMQi4gKi8KIC8qIFhYWCBmb3IgYm90aCBvbmUtb25lIGFuZCBvbmUtdG8tbWFueSAsIGZvciBub3cgdXNlIFRMQjEgKi8KIHN0YXRpYyBpbnQga3ZtcHBjX2U1MDBfdGxiMV9tYXAoc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCwKLQkJdTY0IGd2YWRkciwgZ2ZuX3QgZ2ZuLCBzdHJ1Y3QgdGxiZSAqZ3RsYmUpCisJCXU2NCBndmFkZHIsIGdmbl90IGdmbiwgc3RydWN0IHRsYmUgKmd0bGJlLCBzdHJ1Y3QgdGxiZSAqc3RsYmUpCiB7CiAJdW5zaWduZWQgaW50IHZpY3RpbTsKIAotCXZpY3RpbSA9IHZjcHVfZTUwMC0+Z3Vlc3RfdGxiX252WzFdKys7CisJdmljdGltID0gdmNwdV9lNTAwLT5ndGxiX252WzFdKys7CiAKLQlpZiAodW5saWtlbHkodmNwdV9lNTAwLT5ndWVzdF90bGJfbnZbMV0gPj0gdGxiMV9tYXhfc2hhZG93X3NpemUoKSkpCi0JCXZjcHVfZTUwMC0+Z3Vlc3RfdGxiX252WzFdID0gMDsKKwlpZiAodW5saWtlbHkodmNwdV9lNTAwLT5ndGxiX252WzFdID49IHRsYjFfbWF4X3NoYWRvd19zaXplKCkpKQorCQl2Y3B1X2U1MDAtPmd0bGJfbnZbMV0gPSAwOwogCi0Ja3ZtcHBjX2U1MDBfc2hhZG93X21hcCh2Y3B1X2U1MDAsIGd2YWRkciwgZ2ZuLCBndGxiZSwgMSwgdmljdGltKTsKKwlrdm1wcGNfZTUwMF9zaGFkb3dfbWFwKHZjcHVfZTUwMCwgZ3ZhZGRyLCBnZm4sIGd0bGJlLCAxLCB2aWN0aW0sIHN0bGJlKTsKIAogCXJldHVybiB2aWN0aW07CiB9CiAKLS8qIEludmFsaWRhdGUgYWxsIGd1ZXN0IGtlcm5lbCBtYXBwaW5ncyB3aGVuIGVudGVyIHVzZXJtb2RlLAotICogc28gdGhhdCB3aGVuIHRoZXkgZmF1bHQgYmFjayBpbiB0aGV5IHdpbGwgZ2V0IHRoZQotICogcHJvcGVyIHBlcm1pc3Npb24gYml0cy4gKi8KLXZvaWQga3ZtcHBjX21tdV9wcml2X3N3aXRjaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCB1c2VybW9kZSkKK3ZvaWQga3ZtcHBjX21tdV9tc3Jfbm90aWZ5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIG9sZF9tc3IpCiB7Ci0JaWYgKHVzZXJtb2RlKSB7Ci0JCXN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAgPSB0b19lNTAwKHZjcHUpOwotCQlpbnQgaTsKKwlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwID0gdG9fZTUwMCh2Y3B1KTsKIAotCQkvKiBYWFggUmVwbGFjZSBsb29wIHdpdGggZmFuY3kgZGF0YSBzdHJ1Y3R1cmVzLiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgdGxiMV9tYXhfc2hhZG93X3NpemUoKTsgaSsrKQotCQkJa3ZtcHBjX2U1MDBfc3RsYmVfaW52YWxpZGF0ZSh2Y3B1X2U1MDAsIDEsIGkpOwotCi0JCV90bGJpbF9hbGwoKTsKLQl9CisJLyogUmVjYWxjIHNoYWRvdyBwaWQgc2luY2UgTVNSIGNoYW5nZXMgKi8KKwlrdm1wcGNfZTUwMF9yZWNhbGNfc2hhZG93X3BpZCh2Y3B1X2U1MDApOwogfQogCi1zdGF0aWMgaW50IGt2bXBwY19lNTAwX2d0bGJlX2ludmFsaWRhdGUoc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCwKLQkJaW50IHRsYnNlbCwgaW50IGVzZWwpCitzdGF0aWMgaW5saW5lIGludCBrdm1wcGNfZTUwMF9ndGxiZV9pbnZhbGlkYXRlKAorCQkJCXN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAsCisJCQkJaW50IHRsYnNlbCwgaW50IGVzZWwpCiB7Ci0Jc3RydWN0IHRsYmUgKmd0bGJlID0gJnZjcHVfZTUwMC0+Z3Vlc3RfdGxiW3RsYnNlbF1bZXNlbF07CisJc3RydWN0IHRsYmUgKmd0bGJlID0gJnZjcHVfZTUwMC0+Z3RsYl9hcmNoW3RsYnNlbF1bZXNlbF07CiAKIAlpZiAodW5saWtlbHkoZ2V0X3RsYl9pcHJvdChndGxiZSkpKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAodGxic2VsID09IDEpIHsKLQkJa3ZtcHBjX2U1MDBfdGxiMV9pbnZhbGlkYXRlKHZjcHVfZTUwMCwgZ2V0X3RsYl9lYWRkcihndGxiZSksCi0JCQkJZ2V0X3RsYl9lbmQoZ3RsYmUpLAotCQkJCWdldF90bGJfdGlkKGd0bGJlKSk7Ci0JfSBlbHNlIHsKLQkJa3ZtcHBjX2U1MDBfc3RsYmVfaW52YWxpZGF0ZSh2Y3B1X2U1MDAsIHRsYnNlbCwgZXNlbCk7Ci0JfQotCiAJZ3RsYmUtPm1hczEgPSAwOwogCiAJcmV0dXJuIDA7CkBAIC00MDEsMTMgKzcwNCwxNCBAQAogCWludCBlc2VsOwogCiAJaWYgKHZhbHVlICYgTU1VQ1NSMF9UTEIwRkkpCi0JCWZvciAoZXNlbCA9IDA7IGVzZWwgPCB2Y3B1X2U1MDAtPmd1ZXN0X3RsYl9zaXplWzBdOyBlc2VsKyspCisJCWZvciAoZXNlbCA9IDA7IGVzZWwgPCB2Y3B1X2U1MDAtPmd0bGJfc2l6ZVswXTsgZXNlbCsrKQogCQkJa3ZtcHBjX2U1MDBfZ3RsYmVfaW52YWxpZGF0ZSh2Y3B1X2U1MDAsIDAsIGVzZWwpOwogCWlmICh2YWx1ZSAmIE1NVUNTUjBfVExCMUZJKQotCQlmb3IgKGVzZWwgPSAwOyBlc2VsIDwgdmNwdV9lNTAwLT5ndWVzdF90bGJfc2l6ZVsxXTsgZXNlbCsrKQorCQlmb3IgKGVzZWwgPSAwOyBlc2VsIDwgdmNwdV9lNTAwLT5ndGxiX3NpemVbMV07IGVzZWwrKykKIAkJCWt2bXBwY19lNTAwX2d0bGJlX2ludmFsaWRhdGUodmNwdV9lNTAwLCAxLCBlc2VsKTsKIAotCV90bGJpbF9hbGwoKTsKKwkvKiBJbnZhbGlkYXRlIGFsbCB2Y3B1IGlkIG1hcHBpbmdzICovCisJa3ZtcHBjX2U1MDBfaWRfdGFibGVfcmVzZXRfYWxsKHZjcHVfZTUwMCk7CiAKIAlyZXR1cm4gRU1VTEFURV9ET05FOwogfQpAQCAtNDI4LDcgKzczMiw3IEBACiAKIAlpZiAoaWEpIHsKIAkJLyogaW52YWxpZGF0ZSBhbGwgZW50cmllcyAqLwotCQlmb3IgKGVzZWwgPSAwOyBlc2VsIDwgdmNwdV9lNTAwLT5ndWVzdF90bGJfc2l6ZVt0bGJzZWxdOyBlc2VsKyspCisJCWZvciAoZXNlbCA9IDA7IGVzZWwgPCB2Y3B1X2U1MDAtPmd0bGJfc2l6ZVt0bGJzZWxdOyBlc2VsKyspCiAJCQlrdm1wcGNfZTUwMF9ndGxiZV9pbnZhbGlkYXRlKHZjcHVfZTUwMCwgdGxic2VsLCBlc2VsKTsKIAl9IGVsc2UgewogCQllYSAmPSAweGZmZmZmMDAwOwpAQCAtNDM4LDcgKzc0Miw4IEBACiAJCQlrdm1wcGNfZTUwMF9ndGxiZV9pbnZhbGlkYXRlKHZjcHVfZTUwMCwgdGxic2VsLCBlc2VsKTsKIAl9CiAKLQlfdGxiaWxfYWxsKCk7CisJLyogSW52YWxpZGF0ZSBhbGwgdmNwdSBpZCBtYXBwaW5ncyAqLworCWt2bXBwY19lNTAwX2lkX3RhYmxlX3Jlc2V0X2FsbCh2Y3B1X2U1MDApOwogCiAJcmV0dXJuIEVNVUxBVEVfRE9ORTsKIH0KQEAgLTQ1Miw5ICs3NTcsOSBAQAogCXRsYnNlbCA9IGdldF90bGJfdGxic2VsKHZjcHVfZTUwMCk7CiAJZXNlbCA9IGdldF90bGJfZXNlbCh2Y3B1X2U1MDAsIHRsYnNlbCk7CiAKLQlndGxiZSA9ICZ2Y3B1X2U1MDAtPmd1ZXN0X3RsYlt0bGJzZWxdW2VzZWxdOworCWd0bGJlID0gJnZjcHVfZTUwMC0+Z3RsYl9hcmNoW3RsYnNlbF1bZXNlbF07CiAJdmNwdV9lNTAwLT5tYXMwICY9IH5NQVMwX05WKH4wKTsKLQl2Y3B1X2U1MDAtPm1hczAgfD0gTUFTMF9OVih2Y3B1X2U1MDAtPmd1ZXN0X3RsYl9udlt0bGJzZWxdKTsKKwl2Y3B1X2U1MDAtPm1hczAgfD0gTUFTMF9OVih2Y3B1X2U1MDAtPmd0bGJfbnZbdGxic2VsXSk7CiAJdmNwdV9lNTAwLT5tYXMxID0gZ3RsYmUtPm1hczE7CiAJdmNwdV9lNTAwLT5tYXMyID0gZ3RsYmUtPm1hczI7CiAJdmNwdV9lNTAwLT5tYXMzID0gZ3RsYmUtPm1hczM7CkBAIC00NzcsMTQgKzc4MiwxNCBAQAogCWZvciAodGxic2VsID0gMDsgdGxic2VsIDwgMjsgdGxic2VsKyspIHsKIAkJZXNlbCA9IGt2bXBwY19lNTAwX3RsYl9pbmRleCh2Y3B1X2U1MDAsIGVhLCB0bGJzZWwsIHBpZCwgYXMpOwogCQlpZiAoZXNlbCA+PSAwKSB7Ci0JCQlndGxiZSA9ICZ2Y3B1X2U1MDAtPmd1ZXN0X3RsYlt0bGJzZWxdW2VzZWxdOworCQkJZ3RsYmUgPSAmdmNwdV9lNTAwLT5ndGxiX2FyY2hbdGxic2VsXVtlc2VsXTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCiAJaWYgKGd0bGJlKSB7CiAJCXZjcHVfZTUwMC0+bWFzMCA9IE1BUzBfVExCU0VMKHRsYnNlbCkgfCBNQVMwX0VTRUwoZXNlbCkKLQkJCXwgTUFTMF9OVih2Y3B1X2U1MDAtPmd1ZXN0X3RsYl9udlt0bGJzZWxdKTsKKwkJCXwgTUFTMF9OVih2Y3B1X2U1MDAtPmd0bGJfbnZbdGxic2VsXSk7CiAJCXZjcHVfZTUwMC0+bWFzMSA9IGd0bGJlLT5tYXMxOwogCQl2Y3B1X2U1MDAtPm1hczIgPSBndGxiZS0+bWFzMjsKIAkJdmNwdV9lNTAwLT5tYXMzID0gZ3RsYmUtPm1hczM7CkBAIC00OTcsNyArODAyLDcgQEAKIAkJdmljdGltID0gKHRsYnNlbCA9PSAwKSA/IHRsYjBfZ2V0X25leHRfdmljdGltKHZjcHVfZTUwMCkgOiAwOwogCiAJCXZjcHVfZTUwMC0+bWFzMCA9IE1BUzBfVExCU0VMKHRsYnNlbCkgfCBNQVMwX0VTRUwodmljdGltKQotCQkJfCBNQVMwX05WKHZjcHVfZTUwMC0+Z3Vlc3RfdGxiX252W3RsYnNlbF0pOworCQkJfCBNQVMwX05WKHZjcHVfZTUwMC0+Z3RsYl9udlt0bGJzZWxdKTsKIAkJdmNwdV9lNTAwLT5tYXMxID0gKHZjcHVfZTUwMC0+bWFzNiAmIE1BUzZfU1BJRDApCiAJCQl8ICh2Y3B1X2U1MDAtPm1hczYgJiAoTUFTNl9TQVMgPyBNQVMxX1RTIDogMCkpCiAJCQl8ICh2Y3B1X2U1MDAtPm1hczQgJiBNQVM0X1RTSVpFRCh+MCkpOwpAQCAtNTE0LDIzICs4MTksMTYgQEAKIGludCBrdm1wcGNfZTUwMF9lbXVsX3RsYndlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwID0gdG9fZTUwMCh2Y3B1KTsKLQl1NjQgZWFkZHI7Ci0JdTY0IHJhZGRyOwotCXUzMiB0aWQ7CiAJc3RydWN0IHRsYmUgKmd0bGJlOwotCWludCB0bGJzZWwsIGVzZWwsIHN0bGJzZWwsIHNlc2VsOworCWludCB0bGJzZWwsIGVzZWw7CiAKIAl0bGJzZWwgPSBnZXRfdGxiX3RsYnNlbCh2Y3B1X2U1MDApOwogCWVzZWwgPSBnZXRfdGxiX2VzZWwodmNwdV9lNTAwLCB0bGJzZWwpOwogCi0JZ3RsYmUgPSAmdmNwdV9lNTAwLT5ndWVzdF90bGJbdGxic2VsXVtlc2VsXTsKKwlndGxiZSA9ICZ2Y3B1X2U1MDAtPmd0bGJfYXJjaFt0bGJzZWxdW2VzZWxdOwogCi0JaWYgKGdldF90bGJfdihndGxiZSkgJiYgdGxic2VsID09IDEpIHsKLQkJZWFkZHIgPSBnZXRfdGxiX2VhZGRyKGd0bGJlKTsKLQkJdGlkID0gZ2V0X3RsYl90aWQoZ3RsYmUpOwotCQlrdm1wcGNfZTUwMF90bGIxX2ludmFsaWRhdGUodmNwdV9lNTAwLCBlYWRkciwKLQkJCQlnZXRfdGxiX2VuZChndGxiZSksIHRpZCk7Ci0JfQorCWlmIChnZXRfdGxiX3YoZ3RsYmUpKQorCQlrdm1wcGNfZTUwMF9zdGxiZV9pbnZhbGlkYXRlKHZjcHVfZTUwMCwgdGxic2VsLCBlc2VsKTsKIAogCWd0bGJlLT5tYXMxID0gdmNwdV9lNTAwLT5tYXMxOwogCWd0bGJlLT5tYXMyID0gdmNwdV9lNTAwLT5tYXMyOwpAQCAtNTQyLDYgKzg0MCwxMiBAQAogCiAJLyogSW52YWxpZGF0ZSBzaGFkb3cgbWFwcGluZ3MgZm9yIHRoZSBhYm91dC10by1iZS1jbG9iYmVyZWQgVExCRS4gKi8KIAlpZiAodGxiZV9pc19ob3N0X3NhZmUodmNwdSwgZ3RsYmUpKSB7CisJCXN0cnVjdCB0bGJlIHN0bGJlOworCQlpbnQgc3RsYnNlbCwgc2VzZWw7CisJCXU2NCBlYWRkcjsKKwkJdTY0IHJhZGRyOworCisJCXByZWVtcHRfZGlzYWJsZSgpOwogCQlzd2l0Y2ggKHRsYnNlbCkgewogCQljYXNlIDA6CiAJCQkvKiBUTEIwICovCkBAIC01NDksNyArODUzLDcgQEAKIAkJCWd0bGJlLT5tYXMxIHw9IE1BUzFfVFNJWkUoQk9PSzNFX1BBR0VTWl80Syk7CiAKIAkJCXN0bGJzZWwgPSAwOwotCQkJc2VzZWwgPSBrdm1wcGNfZTUwMF9zdGxiZV9tYXAodmNwdV9lNTAwLCAwLCBlc2VsKTsKKwkJCXNlc2VsID0ga3ZtcHBjX2U1MDBfdGxiMF9tYXAodmNwdV9lNTAwLCBlc2VsLCAmc3RsYmUpOwogCiAJCQlicmVhazsKIApAQCAtNTY0LDEzICs4NjgsMTQgQEAKIAkJCSAqIGFyZSBtYXBwZWQgb24gdGhlIGZseS4gKi8KIAkJCXN0bGJzZWwgPSAxOwogCQkJc2VzZWwgPSBrdm1wcGNfZTUwMF90bGIxX21hcCh2Y3B1X2U1MDAsIGVhZGRyLAotCQkJCQlyYWRkciA+PiBQQUdFX1NISUZULCBndGxiZSk7CisJCQkJCXJhZGRyID4+IFBBR0VfU0hJRlQsIGd0bGJlLCAmc3RsYmUpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKIAkJCUJVRygpOwogCQl9Ci0JCXdyaXRlX2hvc3RfdGxiZSh2Y3B1X2U1MDAsIHN0bGJzZWwsIHNlc2VsKTsKKwkJd3JpdGVfaG9zdF90bGJlKHZjcHVfZTUwMCwgc3RsYnNlbCwgc2VzZWwsICZzdGxiZSk7CisJCXByZWVtcHRfZW5hYmxlKCk7CiAJfQogCiAJa3ZtcHBjX3NldF9leGl0X3R5cGUodmNwdSwgRU1VTEFURURfVExCV0VfRVhJVFMpOwpAQCAtNjEwLDcgKzkxNSw3IEBACiB7CiAJc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCA9IHRvX2U1MDAodmNwdSk7CiAJc3RydWN0IHRsYmUgKmd0bGJlID0KLQkJJnZjcHVfZTUwMC0+Z3Vlc3RfdGxiW3RsYnNlbF9vZihpbmRleCldW2VzZWxfb2YoaW5kZXgpXTsKKwkJJnZjcHVfZTUwMC0+Z3RsYl9hcmNoW3RsYnNlbF9vZihpbmRleCldW2VzZWxfb2YoaW5kZXgpXTsKIAl1NjQgcGdtYXNrID0gZ2V0X3RsYl9ieXRlcyhndGxiZSkgLSAxOwogCiAJcmV0dXJuIGdldF90bGJfcmFkZHIoZ3RsYmUpIHwgKGVhZGRyICYgcGdtYXNrKTsKQEAgLTYxOCwzOCArOTIzLDM3IEBACiAKIHZvaWQga3ZtcHBjX21tdV9kZXN0cm95KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwID0gdG9fZTUwMCh2Y3B1KTsKLQlpbnQgdGxic2VsLCBpOwotCi0JZm9yICh0bGJzZWwgPSAwOyB0bGJzZWwgPCAyOyB0bGJzZWwrKykKLQkJZm9yIChpID0gMDsgaSA8IHZjcHVfZTUwMC0+Z3Vlc3RfdGxiX3NpemVbdGxic2VsXTsgaSsrKQotCQkJa3ZtcHBjX2U1MDBfc2hhZG93X3JlbGVhc2UodmNwdV9lNTAwLCB0bGJzZWwsIGkpOwotCi0JLyogZGlzY2FyZCBhbGwgZ3Vlc3QgbWFwcGluZyAqLwotCV90bGJpbF9hbGwoKTsKIH0KIAogdm9pZCBrdm1wcGNfbW11X21hcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBlYWRkciwgZ3BhX3QgZ3BhZGRyLAogCQkJdW5zaWduZWQgaW50IGluZGV4KQogewogCXN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAgPSB0b19lNTAwKHZjcHUpOworCXN0cnVjdCB0bGJlX3ByaXYgKnByaXY7CisJc3RydWN0IHRsYmUgKmd0bGJlLCBzdGxiZTsKIAlpbnQgdGxic2VsID0gdGxic2VsX29mKGluZGV4KTsKIAlpbnQgZXNlbCA9IGVzZWxfb2YoaW5kZXgpOwogCWludCBzdGxic2VsLCBzZXNlbDsKIAorCWd0bGJlID0gJnZjcHVfZTUwMC0+Z3RsYl9hcmNoW3RsYnNlbF1bZXNlbF07CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAlzd2l0Y2ggKHRsYnNlbCkgewogCWNhc2UgMDoKIAkJc3RsYnNlbCA9IDA7CiAJCXNlc2VsID0gZXNlbDsKKwkJcHJpdiA9ICZ2Y3B1X2U1MDAtPmd0bGJfcHJpdltzdGxic2VsXVtzZXNlbF07CisKKwkJa3ZtcHBjX2U1MDBfc2V0dXBfc3RsYmUodmNwdV9lNTAwLCBndGxiZSwgQk9PSzNFX1BBR0VTWl80SywKKwkJCQkJcHJpdiwgZWFkZHIsICZzdGxiZSk7CiAJCWJyZWFrOwogCiAJY2FzZSAxOiB7CiAJCWdmbl90IGdmbiA9IGdwYWRkciA+PiBQQUdFX1NISUZUOwotCQlzdHJ1Y3QgdGxiZSAqZ3RsYmUKLQkJCT0gJnZjcHVfZTUwMC0+Z3Vlc3RfdGxiW3RsYnNlbF1bZXNlbF07CiAKIAkJc3RsYnNlbCA9IDE7Ci0JCXNlc2VsID0ga3ZtcHBjX2U1MDBfdGxiMV9tYXAodmNwdV9lNTAwLCBlYWRkciwgZ2ZuLCBndGxiZSk7CisJCXNlc2VsID0ga3ZtcHBjX2U1MDBfdGxiMV9tYXAodmNwdV9lNTAwLCBlYWRkciwgZ2ZuLAorCQkJCQkgICAgIGd0bGJlLCAmc3RsYmUpOwogCQlicmVhazsKIAl9CiAKQEAgLTY1Nyw3ICs5NjEsOSBAQAogCQlCVUcoKTsKIAkJYnJlYWs7CiAJfQotCXdyaXRlX2hvc3RfdGxiZSh2Y3B1X2U1MDAsIHN0bGJzZWwsIHNlc2VsKTsKKworCXdyaXRlX2hvc3RfdGxiZSh2Y3B1X2U1MDAsIHN0bGJzZWwsIHNlc2VsLCAmc3RsYmUpOworCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKIGludCBrdm1wcGNfZTUwMF90bGJfc2VhcmNoKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKQEAgLTY3OSw4ICs5ODUsMTAgQEAKIHsKIAlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwID0gdG9fZTUwMCh2Y3B1KTsKIAotCXZjcHVfZTUwMC0+cGlkWzBdID0gdmNwdS0+YXJjaC5zaGFkb3dfcGlkID0KLQkJdmNwdS0+YXJjaC5waWQgPSBwaWQ7CisJaWYgKHZjcHUtPmFyY2gucGlkICE9IHBpZCkgeworCQl2Y3B1X2U1MDAtPnBpZFswXSA9IHZjcHUtPmFyY2gucGlkID0gcGlkOworCQlrdm1wcGNfZTUwMF9yZWNhbGNfc2hhZG93X3BpZCh2Y3B1X2U1MDApOworCX0KIH0KIAogdm9pZCBrdm1wcGNfZTUwMF90bGJfc2V0dXAoc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCkKQEAgLTY4OCwxNCArOTk2LDE0IEBACiAJc3RydWN0IHRsYmUgKnRsYmU7CiAKIAkvKiBJbnNlcnQgbGFyZ2UgaW5pdGlhbCBtYXBwaW5nIGZvciBndWVzdC4gKi8KLQl0bGJlID0gJnZjcHVfZTUwMC0+Z3Vlc3RfdGxiWzFdWzBdOworCXRsYmUgPSAmdmNwdV9lNTAwLT5ndGxiX2FyY2hbMV1bMF07CiAJdGxiZS0+bWFzMSA9IE1BUzFfVkFMSUQgfCBNQVMxX1RTSVpFKEJPT0szRV9QQUdFU1pfMjU2TSk7CiAJdGxiZS0+bWFzMiA9IDA7CiAJdGxiZS0+bWFzMyA9IEU1MDBfVExCX1NVUEVSX1BFUk1fTUFTSzsKIAl0bGJlLT5tYXM3ID0gMDsKIAogCS8qIDRLIG1hcCBmb3Igc2VyaWFsIG91dHB1dC4gVXNlZCBieSBrZXJuZWwgd3JhcHBlci4gKi8KLQl0bGJlID0gJnZjcHVfZTUwMC0+Z3Vlc3RfdGxiWzFdWzFdOworCXRsYmUgPSAmdmNwdV9lNTAwLT5ndGxiX2FyY2hbMV1bMV07CiAJdGxiZS0+bWFzMSA9IE1BUzFfVkFMSUQgfCBNQVMxX1RTSVpFKEJPT0szRV9QQUdFU1pfNEspOwogCXRsYmUtPm1hczIgPSAoMHhlMDAwNDUwMCAmIDB4RkZGRkYwMDApIHwgTUFTMl9JIHwgTUFTMl9HOwogCXRsYmUtPm1hczMgPSAoMHhlMDAwNDUwMCAmIDB4RkZGRkYwMDApIHwgRTUwMF9UTEJfU1VQRVJfUEVSTV9NQVNLOwpAQCAtNzA2LDY4ICsxMDE0LDY0IEBACiB7CiAJdGxiMV9lbnRyeV9udW0gPSBtZnNwcihTUFJOX1RMQjFDRkcpICYgMHhGRkY7CiAKLQl2Y3B1X2U1MDAtPmd1ZXN0X3RsYl9zaXplWzBdID0gS1ZNX0U1MDBfVExCMF9TSVpFOwotCXZjcHVfZTUwMC0+Z3Vlc3RfdGxiWzBdID0KKwl2Y3B1X2U1MDAtPmd0bGJfc2l6ZVswXSA9IEtWTV9FNTAwX1RMQjBfU0laRTsKKwl2Y3B1X2U1MDAtPmd0bGJfYXJjaFswXSA9CiAJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bGJlKSAqIEtWTV9FNTAwX1RMQjBfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHZjcHVfZTUwMC0+Z3Vlc3RfdGxiWzBdID09IE5VTEwpCisJaWYgKHZjcHVfZTUwMC0+Z3RsYl9hcmNoWzBdID09IE5VTEwpCiAJCWdvdG8gZXJyX291dDsKIAotCXZjcHVfZTUwMC0+c2hhZG93X3RsYl9zaXplWzBdID0gS1ZNX0U1MDBfVExCMF9TSVpFOwotCXZjcHVfZTUwMC0+c2hhZG93X3RsYlswXSA9Ci0JCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bGJlKSAqIEtWTV9FNTAwX1RMQjBfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHZjcHVfZTUwMC0+c2hhZG93X3RsYlswXSA9PSBOVUxMKQorCXZjcHVfZTUwMC0+Z3RsYl9zaXplWzFdID0gS1ZNX0U1MDBfVExCMV9TSVpFOworCXZjcHVfZTUwMC0+Z3RsYl9hcmNoWzFdID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHRsYmUpICogS1ZNX0U1MDBfVExCMV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAodmNwdV9lNTAwLT5ndGxiX2FyY2hbMV0gPT0gTlVMTCkKIAkJZ290byBlcnJfb3V0X2d1ZXN0MDsKIAotCXZjcHVfZTUwMC0+Z3Vlc3RfdGxiX3NpemVbMV0gPSBLVk1fRTUwMF9UTEIxX1NJWkU7Ci0JdmNwdV9lNTAwLT5ndWVzdF90bGJbMV0gPQotCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgdGxiZSkgKiBLVk1fRTUwMF9UTEIxX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICh2Y3B1X2U1MDAtPmd1ZXN0X3RsYlsxXSA9PSBOVUxMKQotCQlnb3RvIGVycl9vdXRfc2hhZG93MDsKLQotCXZjcHVfZTUwMC0+c2hhZG93X3RsYl9zaXplWzFdID0gdGxiMV9lbnRyeV9udW07Ci0JdmNwdV9lNTAwLT5zaGFkb3dfdGxiWzFdID0KLQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHRsYmUpICogdGxiMV9lbnRyeV9udW0sIEdGUF9LRVJORUwpOwotCWlmICh2Y3B1X2U1MDAtPnNoYWRvd190bGJbMV0gPT0gTlVMTCkKKwl2Y3B1X2U1MDAtPmd0bGJfcHJpdlswXSA9IChzdHJ1Y3QgdGxiZV9wcml2ICopCisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bGJlX3ByaXYpICogS1ZNX0U1MDBfVExCMF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAodmNwdV9lNTAwLT5ndGxiX3ByaXZbMF0gPT0gTlVMTCkKIAkJZ290byBlcnJfb3V0X2d1ZXN0MTsKKwl2Y3B1X2U1MDAtPmd0bGJfcHJpdlsxXSA9IChzdHJ1Y3QgdGxiZV9wcml2ICopCisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bGJlX3ByaXYpICogS1ZNX0U1MDBfVExCMV9TSVpFLCBHRlBfS0VSTkVMKTsKIAotCXZjcHVfZTUwMC0+c2hhZG93X3BhZ2VzWzBdID0gKHN0cnVjdCBwYWdlICoqKQotCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIEtWTV9FNTAwX1RMQjBfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHZjcHVfZTUwMC0+c2hhZG93X3BhZ2VzWzBdID09IE5VTEwpCi0JCWdvdG8gZXJyX291dF9zaGFkb3cxOworCWlmICh2Y3B1X2U1MDAtPmd0bGJfcHJpdlsxXSA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXRfcHJpdjA7CiAKLQl2Y3B1X2U1MDAtPnNoYWRvd19wYWdlc1sxXSA9IChzdHJ1Y3QgcGFnZSAqKikKLQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiB0bGIxX2VudHJ5X251bSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHZjcHVfZTUwMC0+c2hhZG93X3BhZ2VzWzFdID09IE5VTEwpCi0JCWdvdG8gZXJyX291dF9wYWdlMDsKKwlpZiAoa3ZtcHBjX2U1MDBfaWRfdGFibGVfYWxsb2ModmNwdV9lNTAwKSA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXRfcHJpdjE7CiAKIAkvKiBJbml0IFRMQiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCiAJdmNwdV9lNTAwLT50bGIwY2ZnID0gbWZzcHIoU1BSTl9UTEIwQ0ZHKSAmIH4weGZmZlVMOwotCXZjcHVfZTUwMC0+dGxiMGNmZyB8PSB2Y3B1X2U1MDAtPmd1ZXN0X3RsYl9zaXplWzBdOworCXZjcHVfZTUwMC0+dGxiMGNmZyB8PSB2Y3B1X2U1MDAtPmd0bGJfc2l6ZVswXTsKIAl2Y3B1X2U1MDAtPnRsYjFjZmcgPSBtZnNwcihTUFJOX1RMQjFDRkcpICYgfjB4ZmZmVUw7Ci0JdmNwdV9lNTAwLT50bGIxY2ZnIHw9IHZjcHVfZTUwMC0+Z3Vlc3RfdGxiX3NpemVbMV07CisJdmNwdV9lNTAwLT50bGIxY2ZnIHw9IHZjcHVfZTUwMC0+Z3RsYl9zaXplWzFdOwogCiAJcmV0dXJuIDA7CiAKLWVycl9vdXRfcGFnZTA6Ci0Ja2ZyZWUodmNwdV9lNTAwLT5zaGFkb3dfcGFnZXNbMF0pOwotZXJyX291dF9zaGFkb3cxOgotCWtmcmVlKHZjcHVfZTUwMC0+c2hhZG93X3RsYlsxXSk7CitlcnJfb3V0X3ByaXYxOgorCWtmcmVlKHZjcHVfZTUwMC0+Z3RsYl9wcml2WzFdKTsKK2Vycl9vdXRfcHJpdjA6CisJa2ZyZWUodmNwdV9lNTAwLT5ndGxiX3ByaXZbMF0pOwogZXJyX291dF9ndWVzdDE6Ci0Ja2ZyZWUodmNwdV9lNTAwLT5ndWVzdF90bGJbMV0pOwotZXJyX291dF9zaGFkb3cwOgotCWtmcmVlKHZjcHVfZTUwMC0+c2hhZG93X3RsYlswXSk7CisJa2ZyZWUodmNwdV9lNTAwLT5ndGxiX2FyY2hbMV0pOwogZXJyX291dF9ndWVzdDA6Ci0Ja2ZyZWUodmNwdV9lNTAwLT5ndWVzdF90bGJbMF0pOworCWtmcmVlKHZjcHVfZTUwMC0+Z3RsYl9hcmNoWzBdKTsKIGVycl9vdXQ6CiAJcmV0dXJuIC0xOwogfQogCiB2b2lkIGt2bXBwY19lNTAwX3RsYl91bmluaXQoc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCkKIHsKLQlrZnJlZSh2Y3B1X2U1MDAtPnNoYWRvd19wYWdlc1sxXSk7Ci0Ja2ZyZWUodmNwdV9lNTAwLT5zaGFkb3dfcGFnZXNbMF0pOwotCWtmcmVlKHZjcHVfZTUwMC0+c2hhZG93X3RsYlsxXSk7Ci0Ja2ZyZWUodmNwdV9lNTAwLT5ndWVzdF90bGJbMV0pOwotCWtmcmVlKHZjcHVfZTUwMC0+c2hhZG93X3RsYlswXSk7Ci0Ja2ZyZWUodmNwdV9lNTAwLT5ndWVzdF90bGJbMF0pOworCWludCBzdGxic2VsLCBpOworCisJLyogcmVsZWFzZSBhbGwgcHJpdnMgKi8KKwlmb3IgKHN0bGJzZWwgPSAwOyBzdGxic2VsIDwgMjsgc3RsYnNlbCsrKQorCQlmb3IgKGkgPSAwOyBpIDwgdmNwdV9lNTAwLT5ndGxiX3NpemVbc3RsYnNlbF07IGkrKykgeworCQkJc3RydWN0IHRsYmVfcHJpdiAqcHJpdiA9CisJCQkJJnZjcHVfZTUwMC0+Z3RsYl9wcml2W3N0bGJzZWxdW2ldOworCQkJa3ZtcHBjX2U1MDBfcHJpdl9yZWxlYXNlKHByaXYpOworCQl9CisKKwlrdm1wcGNfZTUwMF9pZF90YWJsZV9mcmVlKHZjcHVfZTUwMCk7CisJa2ZyZWUodmNwdV9lNTAwLT5ndGxiX2FyY2hbMV0pOworCWtmcmVlKHZjcHVfZTUwMC0+Z3RsYl9hcmNoWzBdKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vZTUwMF90bGIuaCBiL2FyY2gvcG93ZXJwYy9rdm0vZTUwMF90bGIuaAppbmRleCA0NTg5NDZiLi41OWI4OGU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2U1MDBfdGxiLmgKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX3RsYi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBBdXRob3I6IFl1IExpdSwgeXUubGl1QGZyZWVzY2FsZS5jb20KICAqCkBAIC01NSw2ICs1NSw3IEBACiBleHRlcm4gaW50IGt2bXBwY19lNTAwX3RsYl9pbml0KHN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICopOwogZXh0ZXJuIHZvaWQga3ZtcHBjX2U1MDBfdGxiX3VuaW5pdChzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqKTsKIGV4dGVybiB2b2lkIGt2bXBwY19lNTAwX3RsYl9zZXR1cChzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqKTsKK2V4dGVybiB2b2lkIGt2bXBwY19lNTAwX3JlY2FsY19zaGFkb3dfcGlkKHN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICopOwogCiAvKiBUTEIgaGVscGVyIGZ1bmN0aW9ucyAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X3RsYl9zaXplKGNvbnN0IHN0cnVjdCB0bGJlICp0bGJlKQpAQCAtMTEwLDYgKzExMSwxNiBAQAogCXJldHVybiB2Y3B1LT5hcmNoLnBpZCAmIDB4ZmY7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9jdXJfYXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiAhISh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgKE1TUl9JUyB8IE1TUl9EUykpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfY3VyX3ByKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gISEodmNwdS0+YXJjaC5zaGFyZWQtPm1zciAmIE1TUl9QUik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9jdXJfc3BpZCgKIAkJY29uc3Qgc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKaW5kZXggNjE2ZGQ1MS4uYTEwN2M5YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9rdm1fcHBjLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2NwdXRocmVhZHMuaD4KICNpbmNsdWRlICJ0aW1pbmcuaCIKICNpbmNsdWRlICIuLi9tbS9tbXVfZGVjbC5oIgogCkBAIC0zOCw4ICszOSwxMiBAQAogCiBpbnQga3ZtX2FyY2hfdmNwdV9ydW5uYWJsZShzdHJ1Y3Qga3ZtX3ZjcHUgKnYpCiB7CisjaWZuZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWCiAJcmV0dXJuICEodi0+YXJjaC5zaGFyZWQtPm1zciAmIE1TUl9XRSkgfHwKIAkgICAgICAgISEodi0+YXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMpOworI2Vsc2UKKwlyZXR1cm4gISh2LT5hcmNoLmNlZGVkKSB8fCAhISh2LT5hcmNoLnBlbmRpbmdfZXhjZXB0aW9ucyk7CisjZW5kaWYKIH0KIAogaW50IGt2bXBwY19rdm1fcHYoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtNzMsNyArNzgsOCBAQAogCX0KIAljYXNlIEhDX1ZFTkRPUl9LVk0gfCBLVk1fSENfRkVBVFVSRVM6CiAJCXIgPSBIQ19FVl9TVUNDRVNTOwotI2lmIGRlZmluZWQoQ09ORklHX1BQQ19CT09LM1MpIC8qIFhYWCBNaXNzaW5nIG1hZ2ljIHBhZ2Ugb24gQm9va0UgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QUENfQk9PSzNTKSB8fCBkZWZpbmVkKENPTkZJR19LVk1fRTUwMCkKKwkJLyogWFhYIE1pc3NpbmcgbWFnaWMgcGFnZSBvbiA0NHggKi8KIAkJcjIgfD0gKDEgPDwgS1ZNX0ZFQVRVUkVfTUFHSUNfUEFHRSk7CiAjZW5kaWYKIApAQCAtMTQ3LDcgKzE1Myw3IEBACiAKIGludCBrdm1fYXJjaF9pbml0X3ZtKHN0cnVjdCBrdm0gKmt2bSkKIHsKLQlyZXR1cm4gMDsKKwlyZXR1cm4ga3ZtcHBjX2NvcmVfaW5pdF92bShrdm0pOwogfQogCiB2b2lkIGt2bV9hcmNoX2Rlc3Ryb3lfdm0oc3RydWN0IGt2bSAqa3ZtKQpAQCAtMTYzLDYgKzE2OSw5IEBACiAJCWt2bS0+dmNwdXNbaV0gPSBOVUxMOwogCiAJYXRvbWljX3NldCgma3ZtLT5vbmxpbmVfdmNwdXMsIDApOworCisJa3ZtcHBjX2NvcmVfZGVzdHJveV92bShrdm0pOworCiAJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOwogfQogCkBAIC0xODAsMTAgKzE4OSwxMyBAQAogI2Vsc2UKIAljYXNlIEtWTV9DQVBfUFBDX1NFR1NUQVRFOgogI2VuZGlmCi0JY2FzZSBLVk1fQ0FQX1BQQ19QQUlSRURfU0lOR0xFUzoKIAljYXNlIEtWTV9DQVBfUFBDX1VOU0VUX0lSUToKIAljYXNlIEtWTV9DQVBfUFBDX0lSUV9MRVZFTDoKIAljYXNlIEtWTV9DQVBfRU5BQkxFX0NBUDoKKwkJciA9IDE7CisJCWJyZWFrOworI2lmbmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IVgorCWNhc2UgS1ZNX0NBUF9QUENfUEFJUkVEX1NJTkdMRVM6CiAJY2FzZSBLVk1fQ0FQX1BQQ19PU0k6CiAJY2FzZSBLVk1fQ0FQX1BQQ19HRVRfUFZJTkZPOgogCQlyID0gMTsKQEAgLTE5MSw2ICsyMDMsMjEgQEAKIAljYXNlIEtWTV9DQVBfQ09BTEVTQ0VEX01NSU86CiAJCXIgPSBLVk1fQ09BTEVTQ0VEX01NSU9fUEFHRV9PRkZTRVQ7CiAJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSFYKKwljYXNlIEtWTV9DQVBfU1BBUFJfVENFOgorCQlyID0gMTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX1BQQ19TTVQ6CisJCXIgPSB0aHJlYWRzX3Blcl9jb3JlOworCQlicmVhazsKKwljYXNlIEtWTV9DQVBfUFBDX1JNQToKKwkJciA9IDE7CisJCS8qIFBQQzk3MCByZXF1aXJlcyBhbiBSTUEgKi8KKwkJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FSQ0hfMjAxKSkKKwkJCXIgPSAyOworCQlicmVhazsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCXIgPSAwOwogCQlicmVhazsKQEAgLTIxMSw3ICsyMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3ZtX3VzZXJzcGFjZV9tZW1vcnlfcmVnaW9uICptZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VyX2FsbG9jKQogewotCXJldHVybiAwOworCXJldHVybiBrdm1wcGNfY29yZV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBtZW0pOwogfQogCiB2b2lkIGt2bV9hcmNoX2NvbW1pdF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKQEAgLTIxOSw3ICsyNDYsNyBAQAogICAgICAgICAgICAgICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCBvbGQsCiAgICAgICAgICAgICAgICBpbnQgdXNlcl9hbGxvYykKIHsKLSAgICAgICByZXR1cm47CisJa3ZtcHBjX2NvcmVfY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBtZW0pOwogfQogCiAKQEAgLTI4Nyw2ICszMTQsNyBAQAogCWhydGltZXJfaW5pdCgmdmNwdS0+YXJjaC5kZWNfdGltZXIsIENMT0NLX1JFQUxUSU1FLCBIUlRJTUVSX01PREVfQUJTKTsKIAl0YXNrbGV0X2luaXQoJnZjcHUtPmFyY2gudGFza2xldCwga3ZtcHBjX2RlY3JlbWVudGVyX2Z1bmMsICh1bG9uZyl2Y3B1KTsKIAl2Y3B1LT5hcmNoLmRlY190aW1lci5mdW5jdGlvbiA9IGt2bXBwY19kZWNyZW1lbnRlcl93YWtldXA7CisJdmNwdS0+YXJjaC5kZWNfZXhwaXJlcyA9IH4odTY0KTA7CiAKICNpZmRlZiBDT05GSUdfS1ZNX0VYSVRfVElNSU5HCiAJbXV0ZXhfaW5pdCgmdmNwdS0+YXJjaC5leGl0X3RpbWluZ19sb2NrKTsKQEAgLTMxMyw2ICszNDEsNyBAQAogCW10c3ByKFNQUk5fVlJTQVZFLCB2Y3B1LT5hcmNoLnZyc2F2ZSk7CiAjZW5kaWYKIAlrdm1wcGNfY29yZV92Y3B1X2xvYWQodmNwdSwgY3B1KTsKKwl2Y3B1LT5jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiB9CiAKIHZvaWQga3ZtX2FyY2hfdmNwdV9wdXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMzIxLDYgKzM1MCw3IEBACiAjaWZkZWYgQ09ORklHX0JPT0tFCiAJdmNwdS0+YXJjaC52cnNhdmUgPSBtZnNwcihTUFJOX1ZSU0FWRSk7CiAjZW5kaWYKKwl2Y3B1LT5jcHUgPSAtMTsKIH0KIAogaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X2d1ZXN0X2RlYnVnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKQEAgLTQ5MiwxNSArNTIyLDE4IEBACiAJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQogCQkJa3ZtcHBjX3NldF9ncHIodmNwdSwgaSwgZ3Byc1tpXSk7CiAJCXZjcHUtPmFyY2gub3NpX25lZWRlZCA9IDA7CisJfSBlbHNlIGlmICh2Y3B1LT5hcmNoLmhjYWxsX25lZWRlZCkgeworCQlpbnQgaTsKKworCQlrdm1wcGNfc2V0X2dwcih2Y3B1LCAzLCBydW4tPnBhcHJfaGNhbGwucmV0KTsKKwkJZm9yIChpID0gMDsgaSA8IDk7ICsraSkKKwkJCWt2bXBwY19zZXRfZ3ByKHZjcHUsIDQgKyBpLCBydW4tPnBhcHJfaGNhbGwuYXJnc1tpXSk7CisJCXZjcHUtPmFyY2guaGNhbGxfbmVlZGVkID0gMDsKIAl9CiAKIAlrdm1wcGNfY29yZV9kZWxpdmVyX2ludGVycnVwdHModmNwdSk7CiAKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWt2bV9ndWVzdF9lbnRlcigpOwotCXIgPSBfX2t2bXBwY192Y3B1X3J1bihydW4sIHZjcHUpOwotCWt2bV9ndWVzdF9leGl0KCk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOworCXIgPSBrdm1wcGNfdmNwdV9ydW4ocnVuLCB2Y3B1KTsKIAogCWlmICh2Y3B1LT5zaWdzZXRfYWN0aXZlKQogCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNpZ3NhdmVkLCBOVUxMKTsKQEAgLTUxOCw2ICs1NTEsOCBAQAogCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ2Y3B1LT53cSkpIHsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2Y3B1LT53cSk7CiAJCXZjcHUtPnN0YXQuaGFsdF93YWtldXArKzsKKwl9IGVsc2UgaWYgKHZjcHUtPmNwdSAhPSAtMSkgeworCQlzbXBfc2VuZF9yZXNjaGVkdWxlKHZjcHUtPmNwdSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC02MzMsNiArNjY4LDI5IEBACiAKIAkJYnJlYWs7CiAJfQorI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWCisJY2FzZSBLVk1fQ1JFQVRFX1NQQVBSX1RDRTogeworCQlzdHJ1Y3Qga3ZtX2NyZWF0ZV9zcGFwcl90Y2UgY3JlYXRlX3RjZTsKKwkJc3RydWN0IGt2bSAqa3ZtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNyZWF0ZV90Y2UsIGFyZ3AsIHNpemVvZihjcmVhdGVfdGNlKSkpCisJCQlnb3RvIG91dDsKKwkJciA9IGt2bV92bV9pb2N0bF9jcmVhdGVfc3BhcHJfdGNlKGt2bSwgJmNyZWF0ZV90Y2UpOworCQlnb3RvIG91dDsKKwl9CisKKwljYXNlIEtWTV9BTExPQ0FURV9STUE6IHsKKwkJc3RydWN0IGt2bSAqa3ZtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCQlzdHJ1Y3Qga3ZtX2FsbG9jYXRlX3JtYSBybWE7CisKKwkJciA9IGt2bV92bV9pb2N0bF9hbGxvY2F0ZV9ybWEoa3ZtLCAmcm1hKTsKKwkJaWYgKHIgPj0gMCAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJnJtYSwgc2l6ZW9mKHJtYSkpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKyNlbmRpZiAvKiBDT05GSUdfS1ZNX0JPT0szU182NF9IViAqLworCiAJZGVmYXVsdDoKIAkJciA9IC1FTk9UVFk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS90aW1pbmcuYyBiL2FyY2gvcG93ZXJwYy9rdm0vdGltaW5nLmMKaW5kZXggMzE5MTc3ZC4uMDdiNjExMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS90aW1pbmcuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL3RpbWluZy5jCkBAIC01NiwxNSArNTYsNiBAQAogewogCXU2NCBvbGQ7CiAKLQlkb19kaXYoZHVyYXRpb24sIHRiX3RpY2tzX3Blcl91c2VjKTsKLQlpZiAodW5saWtlbHkoZHVyYXRpb24gPiAweEZGRkZGRkZGKSkgewotCQlwcmludGsoS0VSTl9FUlIiJXMgLSBkdXJhdGlvbiB0b28gYmlnIC0+IG92ZXJmbG93IgotCQkJIiBkdXJhdGlvbiAlbGxkIHR5cGUgJWQgZXhpdCAjJWRcbiIsCi0JCQlfX2Z1bmNfXywgZHVyYXRpb24sIHR5cGUsCi0JCQl2Y3B1LT5hcmNoLnRpbWluZ19jb3VudF90eXBlW3R5cGVdKTsKLQkJcmV0dXJuOwotCX0KLQogCW11dGV4X2xvY2soJnZjcHUtPmFyY2guZXhpdF90aW1pbmdfbG9jayk7CiAKIAl2Y3B1LT5hcmNoLnRpbWluZ19jb3VudF90eXBlW3R5cGVdKys7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL3RyYWNlLmggYi9hcmNoL3Bvd2VycGMva3ZtL3RyYWNlLmgKaW5kZXggM2FjYTFiMC4uYjEzNWQzZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS90cmFjZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vdHJhY2UuaApAQCAtMTAzLDcgKzEwMyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICBCb29rM1MgdHJhY2UgcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szUworI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTX1BSCiAKIFRSQUNFX0VWRU5UKGt2bV9ib29rM3NfZXhpdCwKIAlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgZXhpdF9uciwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KSwKQEAgLTI1Miw3ICsyNTIsNyBAQAogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKLQkJX19lbnRyeS0+Y291bnQJCT0gdmNwdS0+YXJjaC5ocHRlX2NhY2hlX2NvdW50OworCQlfX2VudHJ5LT5jb3VudAkJPSB0b19ib29rM3ModmNwdSktPmhwdGVfY2FjaGVfY291bnQ7CiAJCV9fZW50cnktPnAxCQk9IHAxOwogCQlfX2VudHJ5LT5wMgkJPSBwMjsKIAkJX19lbnRyeS0+dHlwZQkJPSB0eXBlOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tLzQ0eF9tbXUuYyBiL2FyY2gvcG93ZXJwYy9tbS80NHhfbW11LmMKaW5kZXggMDI0YWNhYi4uZjYwZTAwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tLzQ0eF9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vNDR4X21tdS5jCkBAIC0xODYsMTAgKzE4NiwxMSBAQAogdW5zaWduZWQgbG9uZyBfX2luaXQgbW11X21hcGluX3JhbSh1bnNpZ25lZCBsb25nIHRvcCkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBtZW1zdGFydCA9IG1lbXN0YXJ0X2FkZHIgJiB+KFBQQ19QSU5fU0laRSAtIDEpOwogCiAJLyogUGluIGluIGVub3VnaCBUTEJzIHRvIGNvdmVyIGFueSBsb3dtZW0gbm90IGNvdmVyZWQgYnkgdGhlCiAJICogaW5pdGlhbCAyNTZNIG1hcHBpbmcgZXN0YWJsaXNoZWQgaW4gaGVhZF80NHguUyAqLwotCWZvciAoYWRkciA9IFBQQ19QSU5fU0laRTsgYWRkciA8IGxvd21lbV9lbmRfYWRkcjsKKwlmb3IgKGFkZHIgPSBtZW1zdGFydCArIFBQQ19QSU5fU0laRTsgYWRkciA8IGxvd21lbV9lbmRfYWRkcjsKIAkgICAgIGFkZHIgKz0gUFBDX1BJTl9TSVpFKSB7CiAJCWlmIChtbXVfaGFzX2ZlYXR1cmUoTU1VX0ZUUl9UWVBFXzQ3eCkpCiAJCQlwcGM0N3hfcGluX3RsYihhZGRyICsgUEFHRV9PRkZTRVQsIGFkZHIpOwpAQCAtMjE4LDE5ICsyMTksMjUgQEAKIHZvaWQgc2V0dXBfaW5pdGlhbF9tZW1vcnlfbGltaXQocGh5c19hZGRyX3QgZmlyc3RfbWVtYmxvY2tfYmFzZSwKIAkJCQlwaHlzX2FkZHJfdCBmaXJzdF9tZW1ibG9ja19zaXplKQogeworCXU2NCBzaXplOworCisjaWZuZGVmIENPTkZJR19SRUxPQ0FUQUJMRQogCS8qIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IHRoZSBmaXJzdCBNRU1CTE9DSyBub3QgbWFwcGluZyAwCiAJICogcGh5c2ljYWwgb24gdGhvc2UgcHJvY2Vzc29ycwogCSAqLwogCUJVR19PTihmaXJzdF9tZW1ibG9ja19iYXNlICE9IDApOworI2VuZGlmCiAKIAkvKiA0NHggaGFzIGEgMjU2TSBUTEIgZW50cnkgcGlubmVkIGF0IGJvb3QgKi8KLQltZW1ibG9ja19zZXRfY3VycmVudF9saW1pdChtaW5fdCh1NjQsIGZpcnN0X21lbWJsb2NrX3NpemUsIFBQQ19QSU5fU0laRSkpOworCXNpemUgPSAobWluX3QodTY0LCBmaXJzdF9tZW1ibG9ja19zaXplLCBQUENfUElOX1NJWkUpKTsKKwltZW1ibG9ja19zZXRfY3VycmVudF9saW1pdChmaXJzdF9tZW1ibG9ja19iYXNlICsgc2l6ZSk7CiB9CiAKICNpZmRlZiBDT05GSUdfU01QCiB2b2lkIF9fY3B1aW5pdCBtbXVfaW5pdF9zZWNvbmRhcnkoaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBtZW1zdGFydCA9IG1lbXN0YXJ0X2FkZHIgJiB+KFBQQ19QSU5fU0laRSAtIDEpOwogCiAJLyogUGluIGluIGVub3VnaCBUTEJzIHRvIGNvdmVyIGFueSBsb3dtZW0gbm90IGNvdmVyZWQgYnkgdGhlCiAJICogaW5pdGlhbCAyNTZNIG1hcHBpbmcgZXN0YWJsaXNoZWQgaW4gaGVhZF80NHguUwpAQCAtMjQxLDcgKzI0OCw3IEBACiAJICogc3RhY2suIGN1cnJlbnQgKHIyKSBpc24ndCBpbml0aWFsaXplZCwgc21wX3Byb2Nlc3Nvcl9pZCgpCiAJICogd2lsbCBub3Qgd29yaywgY3VycmVudCB0aHJlYWQgaW5mbyBpc24ndCBhY2Nlc3NpYmxlLCAuLi4KIAkgKi8KLQlmb3IgKGFkZHIgPSBQUENfUElOX1NJWkU7IGFkZHIgPCBsb3dtZW1fZW5kX2FkZHI7CisJZm9yIChhZGRyID0gbWVtc3RhcnQgKyBQUENfUElOX1NJWkU7IGFkZHIgPCBsb3dtZW1fZW5kX2FkZHI7CiAJICAgICBhZGRyICs9IFBQQ19QSU5fU0laRSkgewogCQlpZiAobW11X2hhc19mZWF0dXJlKE1NVV9GVFJfVFlQRV80N3gpKQogCQkJcHBjNDd4X3Bpbl90bGIoYWRkciArIFBBR0VfT0ZGU0VULCBhZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jIGIvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKaW5kZXggNTRmNGZiOS4uNWVmZThjOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0xNzMsNyArMTc0LDcgQEAKIAkJZGllKCJXZWlyZCBwYWdlIGZhdWx0IiwgcmVncywgU0lHU0VHVik7CiAJfQogCi0JcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTLCAxLCAwLCByZWdzLCBhZGRyZXNzKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMsIDEsIHJlZ3MsIGFkZHJlc3MpOwogCiAJLyogV2hlbiBydW5uaW5nIGluIHRoZSBrZXJuZWwgd2UgZXhwZWN0IGZhdWx0cyB0byBvY2N1ciBvbmx5IHRvCiAJICogYWRkcmVzc2VzIGluIHVzZXIgc3BhY2UuICBBbGwgb3RoZXIgZmF1bHRzIHJlcHJlc2VudCBlcnJvcnMgaW4gdGhlCkBAIC0zMTksNyArMzIwLDcgQEAKIAl9CiAJaWYgKHJldCAmIFZNX0ZBVUxUX01BSk9SKSB7CiAJCWN1cnJlbnQtPm1hal9mbHQrKzsKLQkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSiwgMSwgMCwKKwkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSiwgMSwKIAkJCQkgICAgIHJlZ3MsIGFkZHJlc3MpOwogI2lmZGVmIENPTkZJR19QUENfU01MUEFSCiAJCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0NNTykpIHsKQEAgLTMzMCw3ICszMzEsNyBAQAogI2VuZGlmCiAJfSBlbHNlIHsKIAkJY3VycmVudC0+bWluX2ZsdCsrOwotCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUlOLCAxLCAwLAorCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUlOLCAxLAogCQkJCSAgICAgcmVncywgYWRkcmVzcyk7CiAJfQogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CkBAIC0zNDYsMTEgKzM0NywxMCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoaXNfZXhlYyAmJiAoZXJyb3JfY29kZSAmIERTSVNSX1BST1RGQVVMVCkKLQkgICAgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcmludGsoS0VSTl9DUklUICJrZXJuZWwgdHJpZWQgdG8gZXhlY3V0ZSBOWC1wcm90ZWN0ZWQiCi0JCSAgICAgICAiIHBhZ2UgKCVseCkgLSBleHBsb2l0IGF0dGVtcHQ/ICh1aWQ6ICVkKVxuIiwKLQkJICAgICAgIGFkZHJlc3MsIGN1cnJlbnRfdWlkKCkpOworCWlmIChpc19leGVjICYmIChlcnJvcl9jb2RlICYgRFNJU1JfUFJPVEZBVUxUKSkKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fQ1JJVCAia2VybmVsIHRyaWVkIHRvIGV4ZWN1dGUgTlgtcHJvdGVjdGVkIgorCQkJCSAgICIgcGFnZSAoJWx4KSAtIGV4cGxvaXQgYXR0ZW1wdD8gKHVpZDogJWQpXG4iLAorCQkJCSAgIGFkZHJlc3MsIGN1cnJlbnRfdWlkKCkpOwogCiAJcmV0dXJuIFNJR1NFR1Y7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKaW5kZXggZGZkNzY0OC4uOTAwMzliYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2RlZmluZSBIUFRFX0xPQ0tfQklUIDMKIAotc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sobmF0aXZlX3RsYmllX2xvY2spOworREVGSU5FX1JBV19TUElOTE9DSyhuYXRpdmVfdGxiaWVfbG9jayk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYmllKHVuc2lnbmVkIGxvbmcgdmEsIGludCBwc2l6ZSwgaW50IHNzaXplKQogewpAQCAtNTEsNyArNTEsNyBAQAogCQl2YSAmPSB+MHhmZmZ1bDsKIAkJdmEgfD0gc3NpemUgPDwgODsKIAkJYXNtIHZvbGF0aWxlKEFTTV9GVFJfSUZDTFIoInRsYmllICUwLDAiLCBQUENfVExCSUUoJTEsJTApLCAlMikKLQkJCSAgICAgOiA6ICJyIiAodmEpLCAiciIoMCksICJpIiAoQ1BVX0ZUUl9IVk1PREVfMjA2KQorCQkJICAgICA6IDogInIiICh2YSksICJyIigwKSwgImkiIChDUFVfRlRSX0FSQ0hfMjA2KQogCQkJICAgICA6ICJtZW1vcnkiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTYxLDcgKzYxLDcgQEAKIAkJdmEgfD0gc3NpemUgPDwgODsKIAkJdmEgfD0gMTsgLyogTCAqLwogCQlhc20gdm9sYXRpbGUoQVNNX0ZUUl9JRkNMUigidGxiaWUgJTAsMSIsIFBQQ19UTEJJRSglMSwlMCksICUyKQotCQkJICAgICA6IDogInIiICh2YSksICJyIigwKSwgImkiIChDUFVfRlRSX0hWTU9ERV8yMDYpCisJCQkgICAgIDogOiAiciIgKHZhKSwgInIiKDApLCAiaSIgKENQVV9GVFJfQVJDSF8yMDYpCiAJCQkgICAgIDogIm1lbW9yeSIpOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYwppbmRleCBkNjViNTkxLi5jNzdmZWY1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKQEAgLTE5MSw1MyArMTkxLDYgQEAKIAkJcmV0dXJuIF9fdmEobWVtYmxvY2tfYWxsb2MoUEFHRV9TSVpFLCBQQUdFX1NJWkUpKTsKIH0KIAotLyogRnJlZSB1cCBub3ctdW51c2VkIG1lbW9yeSAqLwotc3RhdGljIHZvaWQgZnJlZV9zZWModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JdW5zaWduZWQgbG9uZyBjbnQgPSAwOwotCi0Jd2hpbGUgKHN0YXJ0IDwgZW5kKSB7Ci0JCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShzdGFydCkpOwotCQlpbml0X3BhZ2VfY291bnQodmlydF90b19wYWdlKHN0YXJ0KSk7Ci0JCWZyZWVfcGFnZShzdGFydCk7Ci0JCWNudCsrOwotCQlzdGFydCArPSBQQUdFX1NJWkU7Ci0gCX0KLQlpZiAoY250KSB7Ci0JCXByaW50aygiICVsZGsgJXMiLCBjbnQgPDwgKFBBR0VfU0hJRlQgLSAxMCksIG5hbWUpOwotCQl0b3RhbHJhbV9wYWdlcyArPSBjbnQ7Ci0JfQotfQotCi12b2lkIGZyZWVfaW5pdG1lbSh2b2lkKQotewotI2RlZmluZSBGUkVFU0VDKFRZUEUpIFwKLQlmcmVlX3NlYygodW5zaWduZWQgbG9uZykoJl9fICMjIFRZUEUgIyMgX2JlZ2luKSwgXAotCQkgKHVuc2lnbmVkIGxvbmcpKCZfXyAjIyBUWVBFICMjIF9lbmQpLCBcCi0JCSAjVFlQRSk7Ci0KLQlwcmludGsgKCJGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiIpOwotCUZSRUVTRUMoaW5pdCk7Ci0gCXByaW50aygiXG4iKTsKLQlwcGNfbWQucHJvZ3Jlc3MgPSBOVUxMOwotI3VuZGVmIEZSRUVTRUMKLX0KLQotI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAotdm9pZCBmcmVlX2luaXRyZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0JaWYgKHN0YXJ0IDwgZW5kKQotCQlwcmludGsgKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsIChlbmQgLSBzdGFydCkgPj4gMTApOwotCWZvciAoOyBzdGFydCA8IGVuZDsgc3RhcnQgKz0gUEFHRV9TSVpFKSB7Ci0JCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShzdGFydCkpOwotCQlpbml0X3BhZ2VfY291bnQodmlydF90b19wYWdlKHN0YXJ0KSk7Ci0JCWZyZWVfcGFnZShzdGFydCk7Ci0JCXRvdGFscmFtX3BhZ2VzKys7Ci0JfQotfQotI2VuZGlmCi0KLQogI2lmZGVmIENPTkZJR184eHggLyogTm8gOHh4IHNwZWNpZmljIC5jIGZpbGUgdG8gcHV0IHRoYXQgaW4gLi4uICovCiB2b2lkIHNldHVwX2luaXRpYWxfbWVtb3J5X2xpbWl0KHBoeXNfYWRkcl90IGZpcnN0X21lbWJsb2NrX2Jhc2UsCiAJCQkJcGh5c19hZGRyX3QgZmlyc3RfbWVtYmxvY2tfc2l6ZSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jCmluZGV4IDYzNzRiMjEuLmU5NGI1N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYwpAQCAtODMsMzYgKzgzLDYgQEAKIHBoeXNfYWRkcl90IGtlcm5zdGFydF9hZGRyOwogRVhQT1JUX1NZTUJPTF9HUEwoa2VybnN0YXJ0X2FkZHIpOwogCi12b2lkIGZyZWVfaW5pdG1lbSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQotCWFkZHIgPSAodW5zaWduZWQgbG9uZylfX2luaXRfYmVnaW47Ci0JZm9yICg7IGFkZHIgPCAodW5zaWduZWQgbG9uZylfX2luaXRfZW5kOyBhZGRyICs9IFBBR0VfU0laRSkgewotCQltZW1zZXQoKHZvaWQgKilhZGRyLCBQT0lTT05fRlJFRV9JTklUTUVNLCBQQUdFX1NJWkUpOwotCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpOwotCQlpbml0X3BhZ2VfY291bnQodmlydF90b19wYWdlKGFkZHIpKTsKLQkJZnJlZV9wYWdlKGFkZHIpOwotCQl0b3RhbHJhbV9wYWdlcysrOwotCX0KLQlwcmludGsgKCJGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiAlbHVrIGZyZWVkXG4iLAotCQkoKHVuc2lnbmVkIGxvbmcpX19pbml0X2VuZCAtICh1bnNpZ25lZCBsb25nKV9faW5pdF9iZWdpbikgPj4gMTApOwotfQotCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECi12b2lkIGZyZWVfaW5pdHJkX21lbSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlpZiAoc3RhcnQgPCBlbmQpCi0JCXByaW50ayAoIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWxkayBmcmVlZFxuIiwgKGVuZCAtIHN0YXJ0KSA+PiAxMCk7Ci0JZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSBQQUdFX1NJWkUpIHsKLQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHN0YXJ0KSk7Ci0JCWluaXRfcGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2Uoc3RhcnQpKTsKLQkJZnJlZV9wYWdlKHN0YXJ0KTsKLQkJdG90YWxyYW1fcGFnZXMrKzsKLQl9Ci19Ci0jZW5kaWYKLQogc3RhdGljIHZvaWQgcGdkX2N0b3Iodm9pZCAqYWRkcikKIHsKIAltZW1zZXQoYWRkciwgMCwgUEdEX1RBQkxFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21lbS5jIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCmluZGV4IDU3ZTU0NWIuLmM3ODFiYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKQEAgLTI0OSw3ICsyNDksNyBAQAogICovCiB2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdG90YWxfcmFtID0gbWVtYmxvY2tfcGh5c19tZW1fc2l6ZSgpOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9yYW0gPSBtZW1ibG9ja19waHlzX21lbV9zaXplKCk7CiAJcGh5c19hZGRyX3QgdG9wX29mX3JhbSA9IG1lbWJsb2NrX2VuZF9vZl9EUkFNKCk7CiAJdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107CiAKQEAgLTI2OSw3ICsyNjksNyBAQAogCWttYXBfcHJvdCA9IFBBR0VfS0VSTkVMOwogI2VuZGlmIC8qIENPTkZJR19ISUdITUVNICovCiAKLQlwcmludGsoS0VSTl9ERUJVRyAiVG9wIG9mIFJBTTogMHglbGx4LCBUb3RhbCBSQU06IDB4JWx4XG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJUb3Agb2YgUkFNOiAweCVsbHgsIFRvdGFsIFJBTTogMHglbGx4XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXRvcF9vZl9yYW0sIHRvdGFsX3JhbSk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIk1lbW9yeSBob2xlIHNpemU6ICVsZE1CXG4iLAogCSAgICAgICAobG9uZyBpbnQpKCh0b3Bfb2ZfcmFtIC0gdG90YWxfcmFtKSA+PiAyMCkpOwpAQCAtMzM3LDggKzMzNyw5IEBACiAKIAkJaGlnaG1lbV9tYXBuciA9IGxvd21lbV9lbmRfYWRkciA+PiBQQUdFX1NISUZUOwogCQlmb3IgKHBmbiA9IGhpZ2htZW1fbWFwbnI7IHBmbiA8IG1heF9tYXBucjsgKytwZm4pIHsKKwkJCXBoeXNfYWRkcl90IHBhZGRyID0gKHBoeXNfYWRkcl90KXBmbiA8PCBQQUdFX1NISUZUOwogCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwotCQkJaWYgKG1lbWJsb2NrX2lzX3Jlc2VydmVkKHBmbiA8PCBQQUdFX1NISUZUKSkKKwkJCWlmIChtZW1ibG9ja19pc19yZXNlcnZlZChwYWRkcikpCiAJCQkJY29udGludWU7CiAJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKIAkJCWluaXRfcGFnZV9jb3VudChwYWdlKTsKQEAgLTM1Miw2ICszNTMsMTUgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX1BQQ19GU0xfQk9PSzNFKSAmJiAhZGVmaW5lZChDT05GSUdfU01QKQorCS8qCisJICogSWYgc21wIGlzIGVuYWJsZWQsIG5leHRfdGxiY2FtX2lkeCBpcyBpbml0aWFsaXplZCBpbiB0aGUgY3B1IHVwCisJICogZnVuY3Rpb25zLi4uLiBkbyBpdCBoZXJlIGZvciB0aGUgbm9uLXNtcCBjYXNlLgorCSAqLworCXBlcl9jcHUobmV4dF90bGJjYW1faWR4LCBzbXBfcHJvY2Vzc29yX2lkKCkpID0KKwkJKG1mc3ByKFNQUk5fVExCMUNGRykgJiBUTEJuQ0ZHX05fRU5UUlkpIC0gMTsKKyNlbmRpZgorCiAJcHJpbnRrKEtFUk5fSU5GTyAiTWVtb3J5OiAlbHVrLyVsdWsgYXZhaWxhYmxlICglbHVrIGtlcm5lbCBjb2RlLCAiCiAJICAgICAgICIlbHVrIHJlc2VydmVkLCAlbHVrIGRhdGEsICVsdWsgYnNzLCAlbHVrIGluaXQpXG4iLAogCQlucl9mcmVlX3BhZ2VzKCkgPDwgKFBBR0VfU0hJRlQtMTApLApAQCAtMzgyLDYgKzM5Miw0NCBAQAogCW1lbV9pbml0X2RvbmUgPSAxOwogfQogCit2b2lkIGZyZWVfaW5pdG1lbSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCXBwY19tZC5wcm9ncmVzcyA9IHBwY19wcmludGtfcHJvZ3Jlc3M7CisKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpX19pbml0X2JlZ2luOworCWZvciAoOyBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpX19pbml0X2VuZDsgYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJbWVtc2V0KCh2b2lkICopYWRkciwgUE9JU09OX0ZSRUVfSU5JVE1FTSwgUEFHRV9TSVpFKTsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGFkZHIpKTsKKwkJaW5pdF9wYWdlX2NvdW50KHZpcnRfdG9fcGFnZShhZGRyKSk7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJdG90YWxyYW1fcGFnZXMrKzsKKwl9CisJcHJfaW5mbygiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWx1ayBmcmVlZFxuIiwKKwkJKCh1bnNpZ25lZCBsb25nKV9faW5pdF9lbmQgLQorCQkodW5zaWduZWQgbG9uZylfX2luaXRfYmVnaW4pID4+IDEwKTsKK30KKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAordm9pZCBfX2luaXQgZnJlZV9pbml0cmRfbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCWlmIChzdGFydCA+PSBlbmQpCisJCXJldHVybjsKKworCXN0YXJ0ID0gX0FMSUdOX0RPV04oc3RhcnQsIFBBR0VfU0laRSk7CisJZW5kID0gX0FMSUdOX1VQKGVuZCwgUEFHRV9TSVpFKTsKKwlwcl9pbmZvKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsIChlbmQgLSBzdGFydCkgPj4gMTApOworCisJZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSBQQUdFX1NJWkUpIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHN0YXJ0KSk7CisJCWluaXRfcGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2Uoc3RhcnQpKTsKKwkJZnJlZV9wYWdlKHN0YXJ0KTsKKwkJdG90YWxyYW1fcGFnZXMrKzsKKwl9Cit9CisjZW5kaWYKKwogLyoKICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBwYWdlIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IHRoZSBrZXJuZWwuCiAgKiBJdCBqdXN0IG1hcmtzIHRoZSBwYWdlIGFzIG5vdCBpLWNhY2hlIGNsZWFuLiAgV2UgZG8gdGhlIGktY2FjaGUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfaGFzaDMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX2hhc2gzMi5jCmluZGV4IDI3Yjg2M2MuLjlhNDQ1ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS90bGJfaGFzaDMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9oYXNoMzIuYwpAQCAtMTc3LDMgKzE3Nyw3IEBACiAJZmx1c2hfcmFuZ2Uodm1hLT52bV9tbSwgc3RhcnQsIGVuZCk7CiB9CiBFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9yYW5nZSk7CisKK3ZvaWQgX19pbml0IGVhcmx5X2luaXRfbW11KHZvaWQpCit7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX2xvd182NGUuUyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCmluZGV4IGFmMDg5MjIuLjRlYmIzNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCkBAIC0zMCw2ICszMCwyMTIgQEAKICNkZWZpbmUgVlBURV9QR0RfU0hJRlQJKFZQVEVfUFVEX1NISUZUICsgUFVEX0lOREVYX1NJWkUpCiAjZGVmaW5lIFZQVEVfSU5ERVhfU0laRSAoVlBURV9QR0RfU0hJRlQgKyBQR0RfSU5ERVhfU0laRSkKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUTEIgbWlzcyBoYW5kbGluZyBmb3IgQm9vazNFIHdpdGggYSBib2x0ZWQgbGluZWFyIG1hcHBpbmcgICAgICAgICAgKgorICogTm8gdmlydHVhbCBwYWdlIHRhYmxlLCBubyBuZXN0ZWQgVExCIG1pc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLm1hY3JvIHRsYl9wcm9sb2dfYm9sdGVkIGFkZHIKKwltdHNwcglTUFJOX1NQUkdfVExCX1NDUkFUQ0gscjEzCisJbWZzcHIJcjEzLFNQUk5fU1BSR19QQUNBCisJc3RkCXIxMCxQQUNBX0VYVExCK0VYX1RMQl9SMTAocjEzKQorCW1mY3IJcjEwCisJc3RkCXIxMSxQQUNBX0VYVExCK0VYX1RMQl9SMTEocjEzKQorCXN0ZAlyMTYsUEFDQV9FWFRMQitFWF9UTEJfUjE2KHIxMykKKwltZnNwcglyMTYsXGFkZHIJCS8qIGdldCBmYXVsdGluZyBhZGRyZXNzICovCisJc3RkCXIxNCxQQUNBX0VYVExCK0VYX1RMQl9SMTQocjEzKQorCWxkCXIxNCxQQUNBUEdEKHIxMykKKwlzdGQJcjE1LFBBQ0FfRVhUTEIrRVhfVExCX1IxNShyMTMpCisJc3RkCXIxMCxQQUNBX0VYVExCK0VYX1RMQl9DUihyMTMpCisJVExCX01JU1NfUFJPTE9HX1NUQVRTX0JPTFRFRAorLmVuZG0KKworLm1hY3JvIHRsYl9lcGlsb2dfYm9sdGVkCisJbGQJcjE0LFBBQ0FfRVhUTEIrRVhfVExCX0NSKHIxMykKKwlsZAlyMTAsUEFDQV9FWFRMQitFWF9UTEJfUjEwKHIxMykKKwlsZAlyMTEsUEFDQV9FWFRMQitFWF9UTEJfUjExKHIxMykKKwltdGNyCXIxNAorCWxkCXIxNCxQQUNBX0VYVExCK0VYX1RMQl9SMTQocjEzKQorCWxkCXIxNSxQQUNBX0VYVExCK0VYX1RMQl9SMTUocjEzKQorCVRMQl9NSVNTX1JFU1RPUkVfU1RBVFNfQk9MVEVECisJbGQJcjE2LFBBQ0FfRVhUTEIrRVhfVExCX1IxNihyMTMpCisJbWZzcHIJcjEzLFNQUk5fU1BSR19UTEJfU0NSQVRDSAorLmVuZG0KKworLyogRGF0YSBUTEIgbWlzcyAqLworCVNUQVJUX0VYQ0VQVElPTihkYXRhX3RsYl9taXNzX2JvbHRlZCkKKwl0bGJfcHJvbG9nX2JvbHRlZCBTUFJOX0RFQVIKKworCS8qIFdlIG5lZWQgX1BBR0VfUFJFU0VOVCBhbmQgIF9QQUdFX0FDQ0VTU0VEIHNldCAqLworCisJLyogV2UgZG8gdGhlIHVzZXIva2VybmVsIHRlc3QgZm9yIHRoZSBQSUQgaGVyZSBhbG9uZyB3aXRoIHRoZSBSVyB0ZXN0CisJICovCisJLyogV2UgcHJlLXRlc3Qgc29tZSBjb21iaW5hdGlvbiBvZiBwZXJtaXNzaW9ucyB0byBhdm9pZCBkb3VibGUKKwkgKiBmYXVsdHM6CisJICoKKwkgKiBXZSBtb3ZlIHRoZSBFU1I6U1QgYml0IGludG8gdGhlIHBvc2l0aW9uIG9mIF9QQUdFX0JBUF9TVyBpbiB0aGUgUFRFCisJICogRVNSX1NUICAgaXMgMHgwMDgwMDAwMAorCSAqIF9QQUdFX0JBUF9TVyBpcyAweDAwMDAwMDEwCisJICogU28gdGhlIHNoaWZ0IGlzID4+IDE5LiBUaGlzIHRlc3RzIGZvciBzdXBlcnZpc29yIHdyaXRlYWJpbGl0eS4KKwkgKiBJZiB0aGUgcGFnZSBoYXBwZW5zIHRvIGJlIHN1cGVydmlzb3Igd3JpdGVhYmxlIGFuZCBub3QgdXNlcgorCSAqIHdyaXRlYWJsZSwgd2Ugd2lsbCB0YWtlIGEgbmV3IGZhdWx0IGxhdGVyLCBidXQgdGhhdCBzaG91bGQgYmUKKwkgKiBhIHJhcmUgZW5vdWdoIGNhc2UuCisJICoKKwkgKiBXZSBhbHNvIG1vdmUgRVNSX1NUIGluIF9QQUdFX0RJUlRZIHBvc2l0aW9uCisJICogX1BBR0VfRElSVFkgaXMgMHgwMDAwMTAwMCBzbyB0aGUgc2hpZnQgaXMgPj4gMTEKKwkgKgorCSAqIE1BUzEgaXMgcHJlc2V0IGZvciBhbGwgd2UgbmVlZCBleGNlcHQgZm9yIFRJRCB0aGF0IG5lZWRzIHRvCisJICogYmUgY2xlYXJlZCBmb3Iga2VybmVsIHRyYW5zbGF0aW9ucworCSAqLworCisJbWZzcHIJcjExLFNQUk5fRVNSCisKKwlzcmRpCXIxNSxyMTYsNjAJCS8qIGdldCByZWdpb24gKi8KKwlybGRpY2wuCXIxMCxyMTYsNjQtUEdUQUJMRV9FQUREUl9TSVpFLFBHVEFCTEVfRUFERFJfU0laRSs0CisJYm5lLQlkdGxiX21pc3NfZmF1bHRfYm9sdGVkCisKKwlybHdpbm0JcjEwLHIxMSwzMi0xOSwyNywyNworCXJsd2ltaQlyMTAscjExLDMyLTE2LDE5LDE5CisJY21wd2kJcjE1LDAKKwlvcmkJcjEwLHIxMCxfUEFHRV9QUkVTRU5UCisJb3JpcwlyMTEscjEwLF9QQUdFX0FDQ0VTU0VEQGgKKworCVRMQl9NSVNTX1NUQVRTX1NBVkVfSU5GT19CT0xURUQKKwlibmUJdGxiX21pc3Nfa2VybmVsX2JvbHRlZAorCit0bGJfbWlzc19jb21tb25fYm9sdGVkOgorLyoKKyAqIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIFRMQiBtaXNzIGhhbmRsZXIgZm9yIGJvbHRlZC1saW5lYXIuCisgKiBXZSBhcmUgZW50ZXJlZCB3aXRoOgorICoKKyAqIHIxNiA9IGZhdWx0aW5nIGFkZHJlc3MKKyAqIHIxNSA9IGNyYXAgKGZyZWUgdG8gdXNlKQorICogcjE0ID0gcGFnZSB0YWJsZSBiYXNlCisgKiByMTMgPSBQQUNBCisgKiByMTEgPSBQVEUgcGVybWlzc2lvbiBtYXNrCisgKiByMTAgPSBjcmFwIChmcmVlIHRvIHVzZSkKKyAqLworCXJsZGljbAlyMTUscjE2LDY0LVBHRElSX1NISUZUKzMsNjQtUEdEX0lOREVYX1NJWkUtMworCWNtcGxkaQljcjAscjE0LDAKKwljbHJyZGkJcjE1LHIxNSwzCisJYmVxCXRsYl9taXNzX2ZhdWx0X2JvbHRlZAorCitCRUdJTl9NTVVfRlRSX1NFQ1RJT04KKwkvKiBTZXQgdGhlIFRMQiByZXNlcnZhdGlvbiBhbmQgc2VhcmNoIGZvciBleGlzdGluZyBlbnRyeS4gVGhlbiBsb2FkCisJICogdGhlIGVudHJ5LgorCSAqLworCVBQQ19UTEJTUlhfRE9UKDAscjE2KQorCWxkeAlyMTQscjE0LHIxNQorCWJlcQlub3JtYWxfdGxiX21pc3NfZG9uZQorTU1VX0ZUUl9TRUNUSU9OX0VMU0UKKwlsZHgJcjE0LHIxNCxyMTUKK0FMVF9NTVVfRlRSX1NFQ1RJT05fRU5EX0lGU0VUKE1NVV9GVFJfVVNFX1RMQlJTUlYpCisKKyNpZm5kZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKKwlybGRpY2wJcjE1LHIxNiw2NC1QVURfU0hJRlQrMyw2NC1QVURfSU5ERVhfU0laRS0zCisJY2xycmRpCXIxNSxyMTUsMworCisJY21wbGRpCWNyMCxyMTQsMAorCWJlcQl0bGJfbWlzc19mYXVsdF9ib2x0ZWQKKworCWxkeAlyMTQscjE0LHIxNQorI2VuZGlmIC8qIENPTkZJR19QUENfNjRLX1BBR0VTICovCisKKwlybGRpY2wJcjE1LHIxNiw2NC1QTURfU0hJRlQrMyw2NC1QTURfSU5ERVhfU0laRS0zCisJY2xycmRpCXIxNSxyMTUsMworCisJY21wbGRpCWNyMCxyMTQsMAorCWJlcQl0bGJfbWlzc19mYXVsdF9ib2x0ZWQKKworCWxkeAlyMTQscjE0LHIxNQorCisJcmxkaWNsCXIxNSxyMTYsNjQtUEFHRV9TSElGVCszLDY0LVBURV9JTkRFWF9TSVpFLTMKKwljbHJyZGkJcjE1LHIxNSwzCisKKwljbXBsZGkJY3IwLHIxNCwwCisJYmVxCXRsYl9taXNzX2ZhdWx0X2JvbHRlZAorCisJbGR4CXIxNCxyMTQscjE1CisKKwkvKiBDaGVjayBpZiByZXF1aXJlZCBwZXJtaXNzaW9ucyBhcmUgbWV0ICovCisJYW5kYy4JcjE1LHIxMSxyMTQKKwlybGRpY3IJcjE1LHIxNCw2NC0oUFRFX1JQTl9TSElGVC1QQUdFX1NISUZUKSw2My1QQUdFX1NISUZUCisJYm5lLQl0bGJfbWlzc19mYXVsdF9ib2x0ZWQKKworCS8qIE5vdyB3ZSBidWlsZCB0aGUgTUFTOgorCSAqCisJICogTUFTIDAgICA6CUZ1bGx5IHNldHVwIHdpdGggZGVmYXVsdHMgaW4gTUFTNCBhbmQgVExCbkNGRworCSAqIE1BUyAxICAgOglBbG1vc3QgZnVsbHkgc2V0dXAKKwkgKiAgICAgICAgICAgICAgIC0gUElEIGFscmVhZHkgdXBkYXRlZCBieSBjYWxsZXIgaWYgbmVjZXNzYXJ5CisJICogICAgICAgICAgICAgICAtIFRTSVpFIG5lZWQgY2hhbmdlIGlmICFiYXNlIHBhZ2Ugc2l6ZSwgbm90CisJICogICAgICAgICAgICAgICAgIHlldCBpbXBsZW1lbnRlZCBmb3Igbm93CisJICogTUFTIDIgICA6CURlZmF1bHRzIG5vdCB1c2VmdWwsIG5lZWQgdG8gYmUgcmVkb25lCisJICogTUFTIDMrNyA6CU5lZWRzIHRvIGJlIGRvbmUKKwkgKi8KKwljbHJyZGkJcjExLHIxNiwxMgkJLyogQ2xlYXIgbG93IGNyYXAgaW4gRUEgKi8KKwljbHJsZGkJcjE1LHIxNSwxMgkJLyogQ2xlYXIgY3JhcCBhdCB0aGUgdG9wICovCisJcmx3aW1pCXIxMSxyMTQsMzItMTksMjcsMzEJLyogSW5zZXJ0IFdJTUdFICovCisJcmx3aW1pCXIxNSxyMTQsMzItOCwyMiwyNQkvKiBNb3ZlIGluIFUgYml0cyAqLworCW10c3ByCVNQUk5fTUFTMixyMTEKKwlhbmRpLglyMTEscjE0LF9QQUdFX0RJUlRZCisJcmx3aW1pCXIxNSxyMTQsMzItMiwyNiwzMQkvKiBNb3ZlIGluIEJBUCBiaXRzICovCisKKwkvKiBNYXNrIG91dCBTVyBhbmQgVVcgaWYgIURJUlRZIChYWFggb3B0aW1pemUgdGhpcyAhKSAqLworCWJuZQkxZgorCWxpCXIxMSxNQVMzX1NXfE1BUzNfVVcKKwlhbmRjCXIxNSxyMTUscjExCisxOgorCW10c3ByCVNQUk5fTUFTN19NQVMzLHIxNQorCXRsYndlCisKKwlUTEJfTUlTU19TVEFUU19YKE1NU1RBVF9UTEJfTUlTU19OT1JNX09LKQorCXRsYl9lcGlsb2dfYm9sdGVkCisJcmZpCisKK2l0bGJfbWlzc19rZXJuZWxfYm9sdGVkOgorCWxpCXIxMSxfUEFHRV9QUkVTRU5UfF9QQUdFX0JBUF9TWAkvKiBCYXNlIHBlcm0gKi8KKwlvcmlzCXIxMSxyMTEsX1BBR0VfQUNDRVNTRURAaAordGxiX21pc3Nfa2VybmVsX2JvbHRlZDoKKwltZnNwcglyMTAsU1BSTl9NQVMxCisJbGQJcjE0LFBBQ0FfS0VSTkVMUEdEKHIxMykKKwljbXBsZGkJY3IwLHIxNSw4CQkvKiBDaGVjayBmb3Igdm1hbGxvYyByZWdpb24gKi8KKwlybHdpbm0JcjEwLHIxMCwwLDE2LDEJCS8qIENsZWFyIFRJRCAqLworCW10c3ByCVNQUk5fTUFTMSxyMTAKKwliZXErCXRsYl9taXNzX2NvbW1vbl9ib2x0ZWQKKwordGxiX21pc3NfZmF1bHRfYm9sdGVkOgorCS8qIFdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgd2FzIGFuIGluc3RydWN0aW9uIG1pc3MgKi8KKwlhbmRpLglyMTAscjExLF9QQUdFX0VYRUN8X1BBR0VfQkFQX1NYCisJYm5lCWl0bGJfbWlzc19mYXVsdF9ib2x0ZWQKK2R0bGJfbWlzc19mYXVsdF9ib2x0ZWQ6CisJVExCX01JU1NfU1RBVFNfRChNTVNUQVRfVExCX01JU1NfTk9STV9GQVVMVCkKKwl0bGJfZXBpbG9nX2JvbHRlZAorCWIJZXhjX2RhdGFfc3RvcmFnZV9ib29rM2UKK2l0bGJfbWlzc19mYXVsdF9ib2x0ZWQ6CisJVExCX01JU1NfU1RBVFNfSShNTVNUQVRfVExCX01JU1NfTk9STV9GQVVMVCkKKwl0bGJfZXBpbG9nX2JvbHRlZAorCWIJZXhjX2luc3RydWN0aW9uX3N0b3JhZ2VfYm9vazNlCisKKy8qIEluc3RydWN0aW9uIFRMQiBtaXNzICovCisJU1RBUlRfRVhDRVBUSU9OKGluc3RydWN0aW9uX3RsYl9taXNzX2JvbHRlZCkKKwl0bGJfcHJvbG9nX2JvbHRlZCBTUFJOX1NSUjAKKworCXJsZGljbC4JcjEwLHIxNiw2NC1QR1RBQkxFX0VBRERSX1NJWkUsUEdUQUJMRV9FQUREUl9TSVpFKzQKKwlzcmRpCXIxNSxyMTYsNjAJCS8qIGdldCByZWdpb24gKi8KKwlUTEJfTUlTU19TVEFUU19TQVZFX0lORk9fQk9MVEVECisJYm5lLQlpdGxiX21pc3NfZmF1bHRfYm9sdGVkCisKKwlsaQlyMTEsX1BBR0VfUFJFU0VOVHxfUEFHRV9FWEVDCS8qIEJhc2UgcGVybSAqLworCisJLyogV2UgZG8gdGhlIHVzZXIva2VybmVsIHRlc3QgZm9yIHRoZSBQSUQgaGVyZSBhbG9uZyB3aXRoIHRoZSBSVyB0ZXN0CisJICovCisKKwljbXBsZGkJY3IwLHIxNSwwCQkJLyogQ2hlY2sgZm9yIHVzZXIgcmVnaW9uICovCisJb3JpcwlyMTEscjExLF9QQUdFX0FDQ0VTU0VEQGgKKwliZXEJdGxiX21pc3NfY29tbW9uX2JvbHRlZAorCWIJaXRsYl9taXNzX2tlcm5lbF9ib2x0ZWQKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYwppbmRleCAwYmRhZDNhLi5kMzJlYzY0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgpAQCAtMTAyLDYgKzEwMywxMiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKKyNpZmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKKy8qIG5leHRfdGxiY2FtX2lkeCBpcyB1c2VkIHRvIHJvdW5kLXJvYmluIHRsYmNhbSBlbnRyeSBhc3NpZ25tZW50ICovCitERUZJTkVfUEVSX0NQVShpbnQsIG5leHRfdGxiY2FtX2lkeCk7CitFWFBPUlRfUEVSX0NQVV9TWU1CT0wobmV4dF90bGJjYW1faWR4KTsKKyNlbmRpZgorCiAvKgogICogQmFzZSBUTEIgZmx1c2hpbmcgb3BlcmF0aW9uczoKICAqCkBAIC0yNjYsNiArMjczLDE3IEBACiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKKyNpZmRlZiBDT05GSUdfUFBDXzQ3eAordm9pZCBfX2luaXQgZWFybHlfaW5pdF9tbXVfNDd4KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKwlpZiAob2ZfZ2V0X2ZsYXRfZHRfcHJvcChyb290LCAiY29vcGVyYXRpdmUtcGFydGl0aW9uIiwgTlVMTCkpCisJCW1tdV9jbGVhcl9mZWF0dXJlKE1NVV9GVFJfVVNFX1RMQklWQVhfQkNBU1QpOworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KK30KKyNlbmRpZiAvKiBDT05GSUdfUFBDXzQ3eCAqLworCiAvKgogICogRmx1c2gga2VybmVsIFRMQiBlbnRyaWVzIGluIHRoZSBnaXZlbiByYW5nZQogICovCkBAIC00NDMsMTQgKzQ2MSwyNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfbW11X2h0dyh2b2lkKQorc3RhdGljIHZvaWQgX19wYXRjaF9leGNlcHRpb24oaW50IGV4YywgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCWV4dGVybiB1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2Jhc2VfYm9vazNlOwotCWV4dGVybiB1bnNpZ25lZCBpbnQgZXhjX2RhdGFfdGxiX21pc3NfaHR3X2Jvb2szZTsKLQlleHRlcm4gdW5zaWduZWQgaW50IGV4Y19pbnN0cnVjdGlvbl90bGJfbWlzc19odHdfYm9vazNlOworIAl1bnNpZ25lZCBpbnQgKmliYXNlID0gJmludGVycnVwdF9iYXNlX2Jvb2szZTsKKyAKKwkvKiBPdXIgZXhjZXB0aW9ucyB2ZWN0b3JzIHN0YXJ0IHdpdGggYSBOT1AgYW5kIC10aGVuLSBhIGJyYW5jaAorCSAqIHRvIGRlYWwgd2l0aCBzaW5nbGUgc3RlcHBpbmcgZnJvbSB1c2Vyc3BhY2Ugd2hpY2ggc3RvcHMgb24KKwkgKiB0aGUgc2Vjb25kIGluc3RydWN0aW9uLiBUaHVzIHdlIG5lZWQgdG8gcGF0Y2ggdGhlIHNlY29uZAorCSAqIGluc3RydWN0aW9uIG9mIHRoZSBleGNlcHRpb24sIG5vdCB0aGUgZmlyc3Qgb25lCisJICovCiAKLQl1bnNpZ25lZCBpbnQgKmliYXNlID0gJmludGVycnVwdF9iYXNlX2Jvb2szZTsKKwlwYXRjaF9icmFuY2goaWJhc2UgKyAoZXhjIC8gNCkgKyAxLCBhZGRyLCAwKTsKK30KIAorI2RlZmluZSBwYXRjaF9leGNlcHRpb24oZXhjLCBuYW1lKSBkbyB7IFwKKwlleHRlcm4gdW5zaWduZWQgaW50IG5hbWU7IFwKKwlfX3BhdGNoX2V4Y2VwdGlvbigoZXhjKSwgKHVuc2lnbmVkIGxvbmcpJm5hbWUpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBzZXR1cF9tbXVfaHR3KHZvaWQpCit7CiAJLyogQ2hlY2sgaWYgSFcgdGFibGV3YWxrIGlzIHByZXNlbnQsIGFuZCBpZiB5ZXMsIGVuYWJsZSBpdCBieToKIAkgKgogCSAqIC0gcGF0Y2hpbmcgdGhlIFRMQiBtaXNzIGhhbmRsZXJzIHRvIGJyYW5jaCB0byB0aGUKQEAgLTQ2MiwxOSArNDkzLDEyIEBACiAKIAlpZiAoKHRsYjBjZmcgJiBUTEJuQ0ZHX0lORCkgJiYKIAkgICAgKHRsYjBjZmcgJiBUTEJuQ0ZHX1BUKSkgewotCQkvKiBPdXIgZXhjZXB0aW9ucyB2ZWN0b3JzIHN0YXJ0IHdpdGggYSBOT1AgYW5kIC10aGVuLSBhIGJyYW5jaAotCQkgKiB0byBkZWFsIHdpdGggc2luZ2xlIHN0ZXBwaW5nIGZyb20gdXNlcnNwYWNlIHdoaWNoIHN0b3BzIG9uCi0JCSAqIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24uIFRodXMgd2UgbmVlZCB0byBwYXRjaCB0aGUgc2Vjb25kCi0JCSAqIGluc3RydWN0aW9uIG9mIHRoZSBleGNlcHRpb24sIG5vdCB0aGUgZmlyc3Qgb25lCi0JCSAqLwotCQlwYXRjaF9icmFuY2goaWJhc2UgKyAoMHgxYzAgLyA0KSArIDEsCi0JCQkgICAgICh1bnNpZ25lZCBsb25nKSZleGNfZGF0YV90bGJfbWlzc19odHdfYm9vazNlLCAwKTsKLQkJcGF0Y2hfYnJhbmNoKGliYXNlICsgKDB4MWUwIC8gNCkgKyAxLAotCQkJICAgICAodW5zaWduZWQgbG9uZykmZXhjX2luc3RydWN0aW9uX3RsYl9taXNzX2h0d19ib29rM2UsIDApOworCQlwYXRjaF9leGNlcHRpb24oMHgxYzAsIGV4Y19kYXRhX3RsYl9taXNzX2h0d19ib29rM2UpOworCQlwYXRjaF9leGNlcHRpb24oMHgxZTAsIGV4Y19pbnN0cnVjdGlvbl90bGJfbWlzc19odHdfYm9vazNlKTsKIAkJYm9vazNlX2h0d19lbmFibGVkID0gMTsKIAl9Ci0JcHJfaW5mbygiTU1VOiBCb29rM0UgUGFnZSBUYWJsZXMgJXNcbiIsCi0JCWJvb2szZV9odHdfZW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworCXByX2luZm8oIk1NVTogQm9vazNFIEhXIHRhYmxld2FsayAlc1xuIiwKKwkJYm9vazNlX2h0d19lbmFibGVkID8gImVuYWJsZWQiIDogIm5vdCBzdXBwb3J0ZWQiKTsKIH0KIAogLyoKQEAgLTU0OSw2ICs1NzMsOSBAQAogCQkvKiBsaW1pdCBtZW1vcnkgc28gd2UgZG9udCBoYXZlIGxpbmVhciBmYXVsdHMgKi8KIAkJbWVtYmxvY2tfZW5mb3JjZV9tZW1vcnlfbGltaXQobGluZWFyX21hcF90b3ApOwogCQltZW1ibG9ja19hbmFseXplKCk7CisKKwkJcGF0Y2hfZXhjZXB0aW9uKDB4MWMwLCBleGNfZGF0YV90bGJfbWlzc19ib2x0ZWRfYm9vazNlKTsKKwkJcGF0Y2hfZXhjZXB0aW9uKDB4MWUwLCBleGNfaW5zdHJ1Y3Rpb25fdGxiX21pc3NfYm9sdGVkX2Jvb2szZSk7CiAJfQogI2VuZGlmCiAKQEAgLTU4NCw0ICs2MTEsMTEgQEAKIAkvKiBGaW5hbGx5IGxpbWl0IHN1YnNlcXVlbnQgYWxsb2NhdGlvbnMgKi8KIAltZW1ibG9ja19zZXRfY3VycmVudF9saW1pdChmaXJzdF9tZW1ibG9ja19iYXNlICsgcHBjNjRfcm1hX3NpemUpOwogfQorI2Vsc2UgLyogISBDT05GSUdfUFBDNjQgKi8KK3ZvaWQgX19pbml0IGVhcmx5X2luaXRfbW11KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BQQ180N3gKKwllYXJseV9pbml0X21tdV80N3goKTsKKyNlbmRpZgorfQogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL25ldC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9uZXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2YjM5NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9uZXQvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACisjCisjIEFyY2gtc3BlY2lmaWMgbmV0d29yayBtb2R1bGVzCisjCitvYmotJChDT05GSUdfQlBGX0pJVCkgKz0gYnBmX2ppdF82NC5vIGJwZl9qaXRfY29tcC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXQuaCBiL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMWFiNWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXQuaApAQCAtMCwwICsxLDIyNyBAQAorLyogYnBmX2ppdC5oOiBCUEYgSklUIGNvbXBpbGVyIGZvciBQUEM2NAorICoKKyAqIENvcHlyaWdodCAyMDExIE1hdHQgRXZhbnMgPG1hdHRAb3psYWJzLm9yZz4sIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfQlBGX0pJVF9ICisjZGVmaW5lIF9CUEZfSklUX0gKKworI2RlZmluZSBCUEZfUFBDX1NUQUNLX0xPQ0FMUwkzMgorI2RlZmluZSBCUEZfUFBDX1NUQUNLX0JBU0lDCSg0OCs2NCkKKyNkZWZpbmUgQlBGX1BQQ19TVEFDS19TQVZFCSgxOCo4KQorI2RlZmluZSBCUEZfUFBDX1NUQUNLRlJBTUUJKEJQRl9QUENfU1RBQ0tfQkFTSUMrQlBGX1BQQ19TVEFDS19MT0NBTFMrIFwKKwkJCQkgQlBGX1BQQ19TVEFDS19TQVZFKQorI2RlZmluZSBCUEZfUFBDX1NMT1dQQVRIX0ZSQU1FCSg0OCs2NCkKKworLyoKKyAqIEdlbmVyYXRlZCBjb2RlIHJlZ2lzdGVyIHVzYWdlOgorICoKKyAqIEFzIG5vcm1hbCBQUEMgQyBBQkkgKGUuZy4gcjE9c3AsIHIyPVRPQyksIHdpdGg6CisgKgorICogc2tiCQlyMwkoRW50cnkgcGFyYW1ldGVyKQorICogQSByZWdpc3RlcglyNAorICogWCByZWdpc3RlcglyNQorICogYWRkciBwYXJhbQlyNgorICogcjctcjEwCXNjcmF0Y2gKKyAqIHNrYi0+ZGF0YQlyMTQKKyAqIHNrYiBoZWFkbGVuCXIxNQkoc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuKQorICogbVswXQkJcjE2CisgKiBtWy4uLl0JLi4uCisgKiBtWzE1XQlyMzEKKyAqLworI2RlZmluZSByX3NrYgkJMworI2RlZmluZSByX3JldAkJMworI2RlZmluZSByX0EJCTQKKyNkZWZpbmUgcl9YCQk1CisjZGVmaW5lIHJfYWRkcgkJNgorI2RlZmluZSByX3NjcmF0Y2gxCTcKKyNkZWZpbmUgcl9ECQkxNAorI2RlZmluZSByX0hMCQkxNQorI2RlZmluZSByX00JCTE2CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qCisgKiBBc3NlbWJseSBoZWxwZXJzIGZyb20gYXJjaC9wb3dlcnBjL25ldC9icGZfaml0LlM6CisgKi8KK2V4dGVybiB1OCBza19sb2FkX3dvcmRbXSwgc2tfbG9hZF9oYWxmW10sIHNrX2xvYWRfYnl0ZVtdLCBza19sb2FkX2J5dGVfbXNoW107CisKKyNkZWZpbmUgRlVOQ1RJT05fREVTQ1JfU0laRQkyNAorCisvKgorICogMTYtYml0IGltbWVkaWF0ZSBoZWxwZXIgbWFjcm9zOiBIQSgpIGlzIGZvciB1c2Ugd2l0aCBzaWduLWV4dGVuZGluZyBpbnN0cnMKKyAqIChlLmcuIExELCBBRERJKS4gIElmIHRoZSBib3R0b20gMTYgYml0cyBpcyAiLXZlIiwgYWRkIGFub3RoZXIgYml0IGludG8gdGhlCisgKiB0b3AgaGFsZiB0byBuZWdhdGUgdGhlIGVmZmVjdCAoaS5lLiAweGZmZmYgKyAxID0gMHgoMSkwMDAwKS4KKyAqLworI2RlZmluZSBJTU1fSChpKQkJKCh1aW50cHRyX3QpKGkpPj4xNikKKyNkZWZpbmUgSU1NX0hBKGkpCQkoKCh1aW50cHRyX3QpKGkpPj4xNikgKwkJCSAgICAgIFwKKwkJCQkgKCgodWludHB0cl90KShpKSAmIDB4ODAwMCkgPj4gMTUpKQorI2RlZmluZSBJTU1fTChpKQkJKCh1aW50cHRyX3QpKGkpICYgMHhmZmZmKQorCisjZGVmaW5lIFBMQU5UX0lOU1RSKGQsIGlkeCwgaW5zdHIpCQkJCQkgICAgICBcCisJZG8geyBpZiAoZCkgeyAoZClbaWR4XSA9IGluc3RyOyB9IGlkeCsrOyB9IHdoaWxlICgwKQorI2RlZmluZSBFTUlUKGluc3RyKQkJUExBTlRfSU5TVFIoaW1hZ2UsIGN0eC0+aWR4LCBpbnN0cikKKworI2RlZmluZSBQUENfTk9QKCkJCUVNSVQoUFBDX0lOU1RfTk9QKQorI2RlZmluZSBQUENfQkxSKCkJCUVNSVQoUFBDX0lOU1RfQkxSKQorI2RlZmluZSBQUENfQkxSTCgpCQlFTUlUKFBQQ19JTlNUX0JMUkwpCisjZGVmaW5lIFBQQ19NVExSKHIpCQlFTUlUKFBQQ19JTlNUX01UTFIgfCBfX1BQQ19SVChyKSkKKyNkZWZpbmUgUFBDX0FEREkoZCwgYSwgaSkJRU1JVChQUENfSU5TVF9BRERJIHwgX19QUENfUlQoZCkgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SQShhKSB8IElNTV9MKGkpKQorI2RlZmluZSBQUENfTVIoZCwgYSkJCVBQQ19PUihkLCBhLCBhKQorI2RlZmluZSBQUENfTEkociwgaSkJCVBQQ19BRERJKHIsIDAsIGkpCisjZGVmaW5lIFBQQ19BRERJUyhkLCBhLCBpKQlFTUlUKFBQQ19JTlNUX0FERElTIHwJCQkgICAgICBcCisJCQkJICAgICBfX1BQQ19SUyhkKSB8IF9fUFBDX1JBKGEpIHwgSU1NX0woaSkpCisjZGVmaW5lIFBQQ19MSVMociwgaSkJCVBQQ19BRERJUyhyLCAwLCBpKQorI2RlZmluZSBQUENfU1REKHIsIGJhc2UsIGkpCUVNSVQoUFBDX0lOU1RfU1REIHwgX19QUENfUlMocikgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SQShiYXNlKSB8ICgoaSkgJiAweGZmZmMpKQorCisjZGVmaW5lIFBQQ19MRChyLCBiYXNlLCBpKQlFTUlUKFBQQ19JTlNUX0xEIHwgX19QUENfUlQocikgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SQShiYXNlKSB8IElNTV9MKGkpKQorI2RlZmluZSBQUENfTFdaKHIsIGJhc2UsIGkpCUVNSVQoUFBDX0lOU1RfTFdaIHwgX19QUENfUlQocikgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SQShiYXNlKSB8IElNTV9MKGkpKQorI2RlZmluZSBQUENfTEhaKHIsIGJhc2UsIGkpCUVNSVQoUFBDX0lOU1RfTEhaIHwgX19QUENfUlQocikgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SQShiYXNlKSB8IElNTV9MKGkpKQorLyogQ29udmVuaWVuY2UgaGVscGVycyBmb3IgdGhlIGFib3ZlIHdpdGggJ2Zhcicgb2Zmc2V0czogKi8KKyNkZWZpbmUgUFBDX0xEX09GRlMociwgYmFzZSwgaSkgZG8geyBpZiAoKGkpIDwgMzI3NjgpIFBQQ19MRChyLCBiYXNlLCBpKTsgICAgIFwKKwkJZWxzZSB7CVBQQ19BRERJUyhyLCBiYXNlLCBJTU1fSEEoaSkpOwkJCSAgICAgIFwKKwkJCVBQQ19MRChyLCByLCBJTU1fTChpKSk7IH0gfSB3aGlsZSgwKQorCisjZGVmaW5lIFBQQ19MV1pfT0ZGUyhyLCBiYXNlLCBpKSBkbyB7IGlmICgoaSkgPCAzMjc2OCkgUFBDX0xXWihyLCBiYXNlLCBpKTsgICBcCisJCWVsc2UgewlQUENfQURESVMociwgYmFzZSwgSU1NX0hBKGkpKTsJCQkgICAgICBcCisJCQlQUENfTFdaKHIsIHIsIElNTV9MKGkpKTsgfSB9IHdoaWxlKDApCisKKyNkZWZpbmUgUFBDX0xIWl9PRkZTKHIsIGJhc2UsIGkpIGRvIHsgaWYgKChpKSA8IDMyNzY4KSBQUENfTEhaKHIsIGJhc2UsIGkpOyAgIFwKKwkJZWxzZSB7CVBQQ19BRERJUyhyLCBiYXNlLCBJTU1fSEEoaSkpOwkJCSAgICAgIFwKKwkJCVBQQ19MSFoociwgciwgSU1NX0woaSkpOyB9IH0gd2hpbGUoMCkKKworI2RlZmluZSBQUENfQ01QV0koYSwgaSkJCUVNSVQoUFBDX0lOU1RfQ01QV0kgfCBfX1BQQ19SQShhKSB8IElNTV9MKGkpKQorI2RlZmluZSBQUENfQ01QREkoYSwgaSkJCUVNSVQoUFBDX0lOU1RfQ01QREkgfCBfX1BQQ19SQShhKSB8IElNTV9MKGkpKQorI2RlZmluZSBQUENfQ01QTFdJKGEsIGkpCUVNSVQoUFBDX0lOU1RfQ01QTFdJIHwgX19QUENfUkEoYSkgfCBJTU1fTChpKSkKKyNkZWZpbmUgUFBDX0NNUExXKGEsIGIpCQlFTUlUKFBQQ19JTlNUX0NNUExXIHwgX19QUENfUkEoYSkgfCBfX1BQQ19SQihiKSkKKworI2RlZmluZSBQUENfU1VCKGQsIGEsIGIpCUVNSVQoUFBDX0lOU1RfU1VCIHwgX19QUENfUlQoZCkgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SQihhKSB8IF9fUFBDX1JBKGIpKQorI2RlZmluZSBQUENfQUREKGQsIGEsIGIpCUVNSVQoUFBDX0lOU1RfQUREIHwgX19QUENfUlQoZCkgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SQShhKSB8IF9fUFBDX1JCKGIpKQorI2RlZmluZSBQUENfTVVMKGQsIGEsIGIpCUVNSVQoUFBDX0lOU1RfTVVMTFcgfCBfX1BQQ19SVChkKSB8CSAgICAgIFwKKwkJCQkgICAgIF9fUFBDX1JBKGEpIHwgX19QUENfUkIoYikpCisjZGVmaW5lIFBQQ19NVUxIV1UoZCwgYSwgYikJRU1JVChQUENfSU5TVF9NVUxIV1UgfCBfX1BQQ19SVChkKSB8CSAgICAgIFwKKwkJCQkgICAgIF9fUFBDX1JBKGEpIHwgX19QUENfUkIoYikpCisjZGVmaW5lIFBQQ19NVUxJKGQsIGEsIGkpCUVNSVQoUFBDX0lOU1RfTVVMTEkgfCBfX1BQQ19SVChkKSB8CSAgICAgIFwKKwkJCQkgICAgIF9fUFBDX1JBKGEpIHwgSU1NX0woaSkpCisjZGVmaW5lIFBQQ19ESVZXVShkLCBhLCBiKQlFTUlUKFBQQ19JTlNUX0RJVldVIHwgX19QUENfUlQoZCkgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SQShhKSB8IF9fUFBDX1JCKGIpKQorI2RlZmluZSBQUENfQU5EKGQsIGEsIGIpCUVNSVQoUFBDX0lOU1RfQU5EIHwgX19QUENfUkEoZCkgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SUyhhKSB8IF9fUFBDX1JCKGIpKQorI2RlZmluZSBQUENfQU5ESShkLCBhLCBpKQlFTUlUKFBQQ19JTlNUX0FOREkgfCBfX1BQQ19SQShkKSB8CSAgICAgIFwKKwkJCQkgICAgIF9fUFBDX1JTKGEpIHwgSU1NX0woaSkpCisjZGVmaW5lIFBQQ19BTkRfRE9UKGQsIGEsIGIpCUVNSVQoUFBDX0lOU1RfQU5ERE9UIHwgX19QUENfUkEoZCkgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SUyhhKSB8IF9fUFBDX1JCKGIpKQorI2RlZmluZSBQUENfT1IoZCwgYSwgYikJCUVNSVQoUFBDX0lOU1RfT1IgfCBfX1BQQ19SQShkKSB8CSAgICAgIFwKKwkJCQkgICAgIF9fUFBDX1JTKGEpIHwgX19QUENfUkIoYikpCisjZGVmaW5lIFBQQ19PUkkoZCwgYSwgaSkJRU1JVChQUENfSU5TVF9PUkkgfCBfX1BQQ19SQShkKSB8CSAgICAgIFwKKwkJCQkgICAgIF9fUFBDX1JTKGEpIHwgSU1NX0woaSkpCisjZGVmaW5lIFBQQ19PUklTKGQsIGEsIGkpCUVNSVQoUFBDX0lOU1RfT1JJUyB8IF9fUFBDX1JBKGQpIHwJICAgICAgXAorCQkJCSAgICAgX19QUENfUlMoYSkgfCBJTU1fTChpKSkKKyNkZWZpbmUgUFBDX1NMVyhkLCBhLCBzKQlFTUlUKFBQQ19JTlNUX1NMVyB8IF9fUFBDX1JBKGQpIHwJICAgICAgXAorCQkJCSAgICAgX19QUENfUlMoYSkgfCBfX1BQQ19SQihzKSkKKyNkZWZpbmUgUFBDX1NSVyhkLCBhLCBzKQlFTUlUKFBQQ19JTlNUX1NSVyB8IF9fUFBDX1JBKGQpIHwJICAgICAgXAorCQkJCSAgICAgX19QUENfUlMoYSkgfCBfX1BQQ19SQihzKSkKKy8qIHNsd2kgPSBybHdpbm0gUngsIFJ5LCBuLCAwLCAzMS1uICovCisjZGVmaW5lIFBQQ19TTFdJKGQsIGEsIGkpCUVNSVQoUFBDX0lOU1RfUkxXSU5NIHwgX19QUENfUkEoZCkgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SUyhhKSB8IF9fUFBDX1NIKGkpIHwJICAgICAgXAorCQkJCSAgICAgX19QUENfTUIoMCkgfCBfX1BQQ19NRSgzMS0oaSkpKQorLyogc3J3aSA9IHJsd2lubSBSeCwgUnksIDMyLW4sIG4sIDMxICovCisjZGVmaW5lIFBQQ19TUldJKGQsIGEsIGkpCUVNSVQoUFBDX0lOU1RfUkxXSU5NIHwgX19QUENfUkEoZCkgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SUyhhKSB8IF9fUFBDX1NIKDMyLShpKSkgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19NQihpKSB8IF9fUFBDX01FKDMxKSkKKy8qIHNsZGkgPSBybGRpY3IgUngsIFJ5LCBuLCA2My1uICovCisjZGVmaW5lIFBQQ19TTERJKGQsIGEsIGkpCUVNSVQoUFBDX0lOU1RfUkxESUNSIHwgX19QUENfUkEoZCkgfAkgICAgICBcCisJCQkJICAgICBfX1BQQ19SUyhhKSB8IF9fUFBDX1NIKGkpIHwJICAgICAgXAorCQkJCSAgICAgX19QUENfTUIoNjMtKGkpKSB8ICgoKGkpICYgMHgyMCkgPj4gNCkpCisjZGVmaW5lIFBQQ19ORUcoZCwgYSkJCUVNSVQoUFBDX0lOU1RfTkVHIHwgX19QUENfUlQoZCkgfCBfX1BQQ19SQShhKSkKKworLyogTG9uZyBqdW1wOyAodW5jb25kaXRpb25hbCAnYnJhbmNoJykgKi8KKyNkZWZpbmUgUFBDX0pNUChkZXN0KQkJRU1JVChQUENfSU5TVF9CUkFOQ0ggfAkJCSAgICAgIFwKKwkJCQkgICAgICgoKGRlc3QpIC0gKGN0eC0+aWR4ICogNCkpICYgMHgwM2ZmZmZmYykpCisvKiAiY29uZCIgaGVyZSBjb3ZlcnMgQk86QkkgZmllbGRzLiAqLworI2RlZmluZSBQUENfQkNDX1NIT1JUKGNvbmQsIGRlc3QpCUVNSVQoUFBDX0lOU1RfQlJBTkNIX0NPTkQgfAkgICAgICBcCisJCQkJCSAgICAgKCgoY29uZCkgJiAweDNmZikgPDwgMTYpIHwJICAgICAgXAorCQkJCQkgICAgICgoKGRlc3QpIC0gKGN0eC0+aWR4ICogNCkpICYgICAgIFwKKwkJCQkJICAgICAgMHhmZmZjKSkKKyNkZWZpbmUgUFBDX0xJMzIoZCwgaSkJCWRvIHsgUFBDX0xJKGQsIElNTV9MKGkpKTsJCSAgICAgIFwKKwkJaWYgKCh1MzIpKHVpbnRwdHJfdCkoaSkgPj0gMzI3NjgpIHsJCQkgICAgICBcCisJCQlQUENfQURESVMoZCwgZCwgSU1NX0hBKGkpKTsJCQkgICAgICBcCisJCX0gfSB3aGlsZSgwKQorI2RlZmluZSBQUENfTEk2NChkLCBpKQkJZG8gewkJCQkJICAgICAgXAorCQlpZiAoISgodWludHB0cl90KShpKSAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkpCQkgICAgICBcCisJCQlQUENfTEkzMihkLCBpKTsJCQkJCSAgICAgIFwKKwkJZWxzZSB7CQkJCQkJCSAgICAgIFwKKwkJCVBQQ19MSVMoZCwgKCh1aW50cHRyX3QpKGkpID4+IDQ4KSk7CQkgICAgICBcCisJCQlpZiAoKHVpbnRwdHJfdCkoaSkgJiAweDAwMDBmZmZmMDAwMDAwMDBVTEwpCSAgICAgIFwKKwkJCQlQUENfT1JJKGQsIGQsCQkJCSAgICAgIFwKKwkJCQkJKCh1aW50cHRyX3QpKGkpID4+IDMyKSAmIDB4ZmZmZik7ICAgICBcCisJCQlQUENfU0xESShkLCBkLCAzMik7CQkJCSAgICAgIFwKKwkJCWlmICgodWludHB0cl90KShpKSAmIDB4MDAwMDAwMDBmZmZmMDAwMFVMTCkJICAgICAgXAorCQkJCVBQQ19PUklTKGQsIGQsCQkJCSAgICAgIFwKKwkJCQkJICgodWludHB0cl90KShpKSA+PiAxNikgJiAweGZmZmYpOyAgICBcCisJCQlpZiAoKHVpbnRwdHJfdCkoaSkgJiAweDAwMDAwMDAwMDAwMGZmZmZVTEwpCSAgICAgIFwKKwkJCQlQUENfT1JJKGQsIGQsICh1aW50cHRyX3QpKGkpICYgMHhmZmZmKTsJICAgICAgXAorCQl9IH0gd2hpbGUgKDApOworCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfbmVhcmJyYW5jaChpbnQgb2Zmc2V0KQoreworCXJldHVybiAob2Zmc2V0IDwgMzI3NjgpICYmIChvZmZzZXQgPj0gLTMyNzY4KTsKK30KKworLyoKKyAqIFRoZSBmbHkgaW4gdGhlIG9pbnRtZW50IG9mIGNvZGUgc2l6ZSBjaGFuZ2luZyBmcm9tIHBhc3MgdG8gcGFzcyBpcworICogYXZvaWRlZCBieSBwYWRkaW5nIHRoZSBzaG9ydCBicmFuY2ggY2FzZSB3aXRoIGEgTk9QLgkgSWYgY29kZSBzaXplIGRpZmZlcnMKKyAqIHdpdGggZGlmZmVyZW50IGJyYW5jaCByZWFjaGVzIHdlIHdpbGwgaGF2ZSB0aGUgaXNzdWUgb2YgY29kZSBtb3ZpbmcgZnJvbQorICogb25lIHBhc3MgdG8gdGhlIG5leHQgYW5kIHdpbGwgbmVlZCBhIGZldyBwYXNzZXMgdG8gY29udmVyZ2Ugb24gYSBzdGFibGUKKyAqIHN0YXRlLgorICovCisjZGVmaW5lIFBQQ19CQ0MoY29uZCwgZGVzdCkJZG8gewkJCQkJICAgICAgXAorCQlpZiAoaXNfbmVhcmJyYW5jaCgoZGVzdCkgLSAoY3R4LT5pZHggKiA0KSkpIHsJCSAgICAgIFwKKwkJCVBQQ19CQ0NfU0hPUlQoY29uZCwgZGVzdCk7CQkJICAgICAgXAorCQkJUFBDX05PUCgpOwkJCQkJICAgICAgXAorCQl9IGVsc2UgewkJCQkJCSAgICAgIFwKKwkJCS8qIEZsaXAgdGhlICdUIG9yIEYnIGJpdCB0byBpbnZlcnQgY29tcGFyaXNvbiAqLyAgICAgIFwKKwkJCVBQQ19CQ0NfU0hPUlQoY29uZCBeIENPTkRfQ01QX1RSVUUsIChjdHgtPmlkeCsyKSo0KTsgIFwKKwkJCVBQQ19KTVAoZGVzdCk7CQkJCQkgICAgICBcCisJCX0gfSB3aGlsZSgwKQorCisvKiBUbyBjcmVhdGUgYSBicmFuY2ggY29uZGl0aW9uLCBzZWxlY3QgYSBiaXQgb2YgY3IwLi4uICovCisjZGVmaW5lIENSMF9MVAkJMAorI2RlZmluZSBDUjBfR1QJCTEKKyNkZWZpbmUgQ1IwX0VRCQkyCisvKiAuLi5hbmQgbW9kaWZ5IEJPWzNdICovCisjZGVmaW5lIENPTkRfQ01QX1RSVUUJMHgxMDAKKyNkZWZpbmUgQ09ORF9DTVBfRkFMU0UJMHgwMDAKKy8qIFRvZ2V0aGVyLCB0aGV5IG1ha2UgYWxsIHJlcXVpcmVkIGNvbXBhcmlzb25zOiAqLworI2RlZmluZSBDT05EX0dUCQkoQ1IwX0dUIHwgQ09ORF9DTVBfVFJVRSkKKyNkZWZpbmUgQ09ORF9HRQkJKENSMF9MVCB8IENPTkRfQ01QX0ZBTFNFKQorI2RlZmluZSBDT05EX0VRCQkoQ1IwX0VRIHwgQ09ORF9DTVBfVFJVRSkKKyNkZWZpbmUgQ09ORF9ORQkJKENSMF9FUSB8IENPTkRfQ01QX0ZBTFNFKQorI2RlZmluZSBDT05EX0xUCQkoQ1IwX0xUIHwgQ09ORF9DTVBfVFJVRSkKKworI2RlZmluZSBTRUVOX0RBVEFSRUYgMHgxMDAwMCAvKiBtaWdodCBjYWxsIGV4dGVybmFsIGhlbHBlcnMgKi8KKyNkZWZpbmUgU0VFTl9YUkVHICAgIDB4MjAwMDAgLyogWCByZWcgaXMgdXNlZCAqLworI2RlZmluZSBTRUVOX01FTSAgICAgMHg0MDAwMCAvKiBTRUVOX01FTSsoMTw8bikgPSB1c2UgbWVtW25dIGZvciB0ZW1wb3JhcnkKKwkJCSAgICAgICogc3RvcmFnZSAqLworI2RlZmluZSBTRUVOX01FTV9NU0sgMHgwZmZmZgorCitzdHJ1Y3QgY29kZWdlbl9jb250ZXh0IHsKKwl1bnNpZ25lZCBpbnQgc2VlbjsKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCBwY19yZXQwOyAvKiBicGYgaW5kZXggb2YgZmlyc3QgUkVUICMwIGluc3RydWN0aW9uIChpZiBhbnkpICovCit9OworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfNjQuUyBiL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDUwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfNjQuUwpAQCAtMCwwICsxLDEzOCBAQAorLyogYnBmX2ppdC5TOiBQYWNrZXQvaGVhZGVyIGFjY2VzcyBoZWxwZXIgZnVuY3Rpb25zCisgKiBmb3IgUFBDNjQgQlBGIGNvbXBpbGVyLgorICoKKyAqIENvcHlyaWdodCAyMDExIE1hdHQgRXZhbnMgPG1hdHRAb3psYWJzLm9yZz4sIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KKyNpbmNsdWRlICJicGZfaml0LmgiCisKKy8qCisgKiBBbGwgb2YgdGhlc2Ugcm91dGluZXMgYXJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIGdlbmVyYXRlZCBjb2RlLAorICogd2hvc2UgcmVnaXN0ZXIgdXNhZ2UgaXM6CisgKgorICogcjMJCXNrYgorICogcjQscjUJQSxYCisgKiByNgkJKioqIGFkZHJlc3MgcGFyYW1ldGVyIHRvIGhlbHBlciAqKioKKyAqIHI3LXIxMAlzY3JhdGNoCisgKiByMTQJCXNrYi0+ZGF0YQorICogcjE1CQlza2IgaGVhZGxlbgorICogcjE2LTMxCU1bXQorICovCisKKy8qCisgKiBUbyBjb25zaWRlcjogVGhlc2UgaGVscGVycyBhcmUgc28gc21hbGwgaXQgY291bGQgYmUgYmV0dGVyIHRvIGp1c3QKKyAqIGdlbmVyYXRlIHRoZW0gaW5saW5lLiAgSW5saW5lIGNvZGUgY2FuIGRvIHRoZSBzaW1wbGUgaGVhZGxlbiBjaGVjaworICogdGhlbiBicmFuY2ggZGlyZWN0bHkgdG8gc2xvd19wYXRoX1hYWCBpZiByZXF1aXJlZC4gIChJbiBmYWN0LCBjb3VsZAorICogbG9hZCBhIHNwYXJlIEdQUiB3aXRoIHRoZSBhZGRyZXNzIG9mIHNsb3dfcGF0aF9nZW5lcmljIGFuZCBwYXNzIHNpemUKKyAqIGFzIGFuIGFyZ3VtZW50LCBtYWtpbmcgdGhlIGNhbGwgc2l0ZSBhIG10bHIsIGxpIGFuZCBibGxyLikKKyAqCisgKiBUZWNobmljYWxseSwgdGhlICJpcyBhZGRyIDwgMCIgY2hlY2sgaXMgdW5uZWNlc3NhcnkgJiBzbG93aW5nIGRvd24KKyAqIHRoZSBBQlMgcGF0aCwgYXMgaXQncyBzdGF0aWNhbGx5IGNoZWNrZWQgb24gZ2VuZXJhdGlvbi4KKyAqLworCS5nbG9ibAlza19sb2FkX3dvcmQKK3NrX2xvYWRfd29yZDoKKwljbXBkaQlyX2FkZHIsIDAKKwlibHQJYnBmX2Vycm9yCisJLyogQXJlIHdlIGFjY2Vzc2luZyBwYXN0IGhlYWRsZW4/ICovCisJc3ViaQlyX3NjcmF0Y2gxLCByX0hMLCA0CisJY21wZAlyX3NjcmF0Y2gxLCByX2FkZHIKKwlibHQJYnBmX3Nsb3dfcGF0aF93b3JkCisJLyogTm9wZSwganVzdCBoaXR0aW5nIHRoZSBoZWFkZXIuICBjcjAgaGVyZSBpcyBlcSBvciBndCEgKi8KKwlsd3p4CXJfQSwgcl9ELCByX2FkZHIKKwkvKiBXaGVuIGJpZyBlbmRpYW4gd2UgZG9uJ3QgbmVlZCB0byBieXRlc3dhcC4gKi8KKwlibHIJLyogUmV0dXJuIHN1Y2Nlc3MsIGNyMCAhPSBMVCAqLworCisJLmdsb2JsCXNrX2xvYWRfaGFsZgorc2tfbG9hZF9oYWxmOgorCWNtcGRpCXJfYWRkciwgMAorCWJsdAlicGZfZXJyb3IKKwlzdWJpCXJfc2NyYXRjaDEsIHJfSEwsIDIKKwljbXBkCXJfc2NyYXRjaDEsIHJfYWRkcgorCWJsdAlicGZfc2xvd19wYXRoX2hhbGYKKwlsaHp4CXJfQSwgcl9ELCByX2FkZHIKKwlibHIKKworCS5nbG9ibAlza19sb2FkX2J5dGUKK3NrX2xvYWRfYnl0ZToKKwljbXBkaQlyX2FkZHIsIDAKKwlibHQJYnBmX2Vycm9yCisJY21wZAlyX0hMLCByX2FkZHIKKwlibGUJYnBmX3Nsb3dfcGF0aF9ieXRlCisJbGJ6eAlyX0EsIHJfRCwgcl9hZGRyCisJYmxyCisKKy8qCisgKiBCUEZfU19MRFhfQl9NU0g6IGxkeGIgIDQqKFtvZmZzZXRdJjB4ZikKKyAqIHJfYWRkciBpcyB0aGUgb2Zmc2V0IHZhbHVlLCBhbHJlYWR5IGtub3duIHBvc2l0aXZlCisgKi8KKwkuZ2xvYmwgc2tfbG9hZF9ieXRlX21zaAorc2tfbG9hZF9ieXRlX21zaDoKKwljbXBkCXJfSEwsIHJfYWRkcgorCWJsZQlicGZfc2xvd19wYXRoX2J5dGVfbXNoCisJbGJ6eAlyX1gsIHJfRCwgcl9hZGRyCisJcmx3aW5tCXJfWCwgcl9YLCAyLCAzMi00LTIsIDMxLTIKKwlibHIKKworYnBmX2Vycm9yOgorCS8qIEVudGVyZWQgd2l0aCBjcjAgPSBsdCAqLworCWxpCXIzLCAwCisJLyogR2VuZXJhdGVkIGNvZGUgd2lsbCAnYmx0IGVwaWxvZ3VlJywgcmV0dXJuaW5nIDAuICovCisJYmxyCisKKy8qIENhbGwgb3V0IHRvIHNrYl9jb3B5X2JpdHM6CisgKiBXZSdsbCBuZWVkIHRvIGJhY2sgdXAgb3VyIHZvbGF0aWxlIHJlZ3MgZmlyc3Q7IHdlIGhhdmUKKyAqIGxvY2FsIHZhcmlhYmxlIHNwYWNlIGF0IHIxKyhCUEZfUFBDX1NUQUNLX0JBU0lDKS4KKyAqIEFsbG9jYXRlIGEgbmV3IHN0YWNrIGZyYW1lIGhlcmUgdG8gcmVtYWluIEFCSS1jb21wbGlhbnQgaW4KKyAqIHN0YXNoaW5nIExSLgorICovCisjZGVmaW5lIGJwZl9zbG93X3BhdGhfY29tbW9uKFNJWkUpCQkJCVwKKwltZmxyCXIwOwkJCQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQkJCVwKKwkvKiBSMyBnb2VzIGluIHBhcmFtZXRlciBzcGFjZSBvZiBjYWxsZXIncyBmcmFtZSAqLwlcCisJc3RkCXJfc2tiLCAoQlBGX1BQQ19TVEFDS0ZSQU1FKzQ4KShyMSk7CQlcCisJc3RkCXJfQSwgKEJQRl9QUENfU1RBQ0tfQkFTSUMrKDAqOCkpKHIxKTsJCVwKKwlzdGQJcl9YLCAoQlBGX1BQQ19TVEFDS19CQVNJQysoMSo4KSkocjEpOwkJXAorCWFkZGkJcjUsIHIxLCBCUEZfUFBDX1NUQUNLX0JBU0lDKygyKjgpOwkJXAorCXN0ZHUJcjEsIC1CUEZfUFBDX1NMT1dQQVRIX0ZSQU1FKHIxKTsJCVwKKwkvKiBSMyA9IHJfc2tiLCBhcyBwYXNzZWQgKi8JCQkJXAorCW1yCXI0LCByX2FkZHI7CQkJCQlcCisJbGkJcjYsIFNJWkU7CQkJCQlcCisJYmwJc2tiX2NvcHlfYml0czsJCQkJCVwKKwkvKiBSMyA9IDAgb24gc3VjY2VzcyAqLwkJCQkJXAorCWFkZGkJcjEsIHIxLCBCUEZfUFBDX1NMT1dQQVRIX0ZSQU1FOwkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCQkJXAorCWxkCXJfQSwgKEJQRl9QUENfU1RBQ0tfQkFTSUMrKDAqOCkpKHIxKTsJCVwKKwlsZAlyX1gsIChCUEZfUFBDX1NUQUNLX0JBU0lDKygxKjgpKShyMSk7CQlcCisJbXRscglyMDsJCQkJCQlcCisJY21wZGkJcjMsIDA7CQkJCQkJXAorCWJsdAlicGZfZXJyb3I7CS8qIGNyMCA9IExUICovCQkJXAorCWxkCXJfc2tiLCAoQlBGX1BQQ19TVEFDS0ZSQU1FKzQ4KShyMSk7CQlcCisJLyogR3JlYXQgc3VjY2VzcyEgKi8KKworYnBmX3Nsb3dfcGF0aF93b3JkOgorCWJwZl9zbG93X3BhdGhfY29tbW9uKDQpCisJLyogRGF0YSB2YWx1ZSBpcyBvbiBzdGFjaywgYW5kIGNyMCAhPSBMVCAqLworCWx3eglyX0EsIEJQRl9QUENfU1RBQ0tfQkFTSUMrKDIqOCkocjEpCisJYmxyCisKK2JwZl9zbG93X3BhdGhfaGFsZjoKKwlicGZfc2xvd19wYXRoX2NvbW1vbigyKQorCWxoeglyX0EsIEJQRl9QUENfU1RBQ0tfQkFTSUMrKDIqOCkocjEpCisJYmxyCisKK2JwZl9zbG93X3BhdGhfYnl0ZToKKwlicGZfc2xvd19wYXRoX2NvbW1vbigxKQorCWxieglyX0EsIEJQRl9QUENfU1RBQ0tfQkFTSUMrKDIqOCkocjEpCisJYmxyCisKK2JwZl9zbG93X3BhdGhfYnl0ZV9tc2g6CisJYnBmX3Nsb3dfcGF0aF9jb21tb24oMSkKKwlsYnoJcl9YLCBCUEZfUFBDX1NUQUNLX0JBU0lDKygyKjgpKHIxKQorCXJsd2lubQlyX1gsIHJfWCwgMiwgMzItNC0yLCAzMS0yCisJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jIGIvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0X2NvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzYxOWQzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0X2NvbXAuYwpAQCAtMCwwICsxLDY5NCBAQAorLyogYnBmX2ppdF9jb21wLmM6IEJQRiBKSVQgY29tcGlsZXIgZm9yIFBQQzY0CisgKgorICogQ29weXJpZ2h0IDIwMTEgTWF0dCBFdmFucyA8bWF0dEBvemxhYnMub3JnPiwgSUJNIENvcnBvcmF0aW9uCisgKgorICogQmFzZWQgb24gdGhlIHg4NiBCUEYgY29tcGlsZXIsIGJ5IEVyaWMgRHVtYXpldCAoZXJpYy5kdW1hemV0QGdtYWlsLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorI2luY2x1ZGUgImJwZl9qaXQuaCIKKworI2lmbmRlZiBfX0JJR19FTkRJQU4KKy8qIFRoZXJlIGFyZSBlbmRpYW5uZXNzIGFzc3VtcHRpb25zIGhlcmVpbi4gKi8KKyNlcnJvciAiTGl0dGxlLWVuZGlhbiBQUEMgbm90IHN1cHBvcnRlZCBpbiBCUEYgY29tcGlsZXIiCisjZW5kaWYKKworaW50IGJwZl9qaXRfZW5hYmxlIF9fcmVhZF9tb3N0bHk7CisKKworc3RhdGljIGlubGluZSB2b2lkIGJwZl9mbHVzaF9pY2FjaGUodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCkKK3sKKwlzbXBfd21iKCk7CisJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKXN0YXJ0LCAodW5zaWduZWQgbG9uZyllbmQpOworfQorCitzdGF0aWMgdm9pZCBicGZfaml0X2J1aWxkX3Byb2xvZ3VlKHN0cnVjdCBza19maWx0ZXIgKmZwLCB1MzIgKmltYWdlLAorCQkJCSAgIHN0cnVjdCBjb2RlZ2VuX2NvbnRleHQgKmN0eCkKK3sKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3Qgc29ja19maWx0ZXIgKmZpbHRlciA9IGZwLT5pbnNuczsKKworCWlmIChjdHgtPnNlZW4gJiAoU0VFTl9NRU0gfCBTRUVOX0RBVEFSRUYpKSB7CisJCS8qIE1ha2Ugc3RhY2tmcmFtZSAqLworCQlpZiAoY3R4LT5zZWVuICYgU0VFTl9EQVRBUkVGKSB7CisJCQkvKiBJZiB3ZSBjYWxsIGFueSBoZWxwZXJzIChmb3IgbG9hZHMpLCBzYXZlIExSICovCisJCQlFTUlUKFBQQ19JTlNUX01GTFIgfCBfX1BQQ19SVCgwKSk7CisJCQlQUENfU1REKDAsIDEsIDE2KTsKKworCQkJLyogQmFjayB1cCBub24tdm9sYXRpbGUgcmVncy4gKi8KKwkJCVBQQ19TVEQocl9ELCAxLCAtKDgqKDMyLXJfRCkpKTsKKwkJCVBQQ19TVEQocl9ITCwgMSwgLSg4KigzMi1yX0hMKSkpOworCQl9CisJCWlmIChjdHgtPnNlZW4gJiBTRUVOX01FTSkgeworCQkJLyoKKwkJCSAqIENvbmRpdGlvbmFsbHkgc2F2ZSByZWdzIHIxNS1yMzEgYXMgc29tZSB3aWxsIGJlIHVzZWQKKwkJCSAqIGZvciBNW10gZGF0YS4KKwkJCSAqLworCQkJZm9yIChpID0gcl9NOyBpIDwgKHJfTSsxNik7IGkrKykgeworCQkJCWlmIChjdHgtPnNlZW4gJiAoMSA8PCAoaS1yX00pKSkKKwkJCQkJUFBDX1NURChpLCAxLCAtKDgqKDMyLWkpKSk7CisJCQl9CisJCX0KKwkJRU1JVChQUENfSU5TVF9TVERVIHwgX19QUENfUlMoMSkgfCBfX1BQQ19SQSgxKSB8CisJCSAgICAgKC1CUEZfUFBDX1NUQUNLRlJBTUUgJiAweGZmZmMpKTsKKwl9CisKKwlpZiAoY3R4LT5zZWVuICYgU0VFTl9EQVRBUkVGKSB7CisJCS8qCisJCSAqIElmIHRoaXMgZmlsdGVyIG5lZWRzIHRvIGFjY2VzcyBza2IgZGF0YSwKKwkJICogcHJlcGFyZSByX0QgYW5kIHJfSEw6CisJCSAqICByX0hMID0gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuCisJCSAqICByX0QJID0gc2tiLT5kYXRhCisJCSAqLworCQlQUENfTFdaX09GRlMocl9zY3JhdGNoMSwgcl9za2IsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLAorCQkJCQkJCSBkYXRhX2xlbikpOworCQlQUENfTFdaX09GRlMocl9ITCwgcl9za2IsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBsZW4pKTsKKwkJUFBDX1NVQihyX0hMLCByX0hMLCByX3NjcmF0Y2gxKTsKKwkJUFBDX0xEX09GRlMocl9ELCByX3NrYiwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRhdGEpKTsKKwl9CisKKwlpZiAoY3R4LT5zZWVuICYgU0VFTl9YUkVHKSB7CisJCS8qCisJCSAqIFRPRE86IENvdWxkIGFsc28gZGV0ZWN0IHdoZXRoZXIgZmlyc3QgaW5zdHIuIHNldHMgWCBhbmQKKwkJICogYXZvaWQgdGhpcyAoYXMgYmVsb3csIHdpdGggQSkuCisJCSAqLworCQlQUENfTEkocl9YLCAwKTsKKwl9CisKKwlzd2l0Y2ggKGZpbHRlclswXS5jb2RlKSB7CisJY2FzZSBCUEZfU19SRVRfSzoKKwljYXNlIEJQRl9TX0xEX1dfTEVOOgorCWNhc2UgQlBGX1NfQU5DX1BST1RPQ09MOgorCWNhc2UgQlBGX1NfQU5DX0lGSU5ERVg6CisJY2FzZSBCUEZfU19BTkNfTUFSSzoKKwljYXNlIEJQRl9TX0FOQ19SWEhBU0g6CisJY2FzZSBCUEZfU19BTkNfQ1BVOgorCWNhc2UgQlBGX1NfQU5DX1FVRVVFOgorCWNhc2UgQlBGX1NfTERfV19BQlM6CisJY2FzZSBCUEZfU19MRF9IX0FCUzoKKwljYXNlIEJQRl9TX0xEX0JfQUJTOgorCQkvKiBmaXJzdCBpbnN0cnVjdGlvbiBzZXRzIEEgcmVnaXN0ZXIgKG9yIGlzIFJFVCAnY29uc3RhbnQnKSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBtYWtlIHN1cmUgd2UgZG9udCBsZWFrIGtlcm5lbCBpbmZvcm1hdGlvbiB0byB1c2VyICovCisJCVBQQ19MSShyX0EsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgYnBmX2ppdF9idWlsZF9lcGlsb2d1ZSh1MzIgKmltYWdlLCBzdHJ1Y3QgY29kZWdlbl9jb250ZXh0ICpjdHgpCit7CisJaW50IGk7CisKKwlpZiAoY3R4LT5zZWVuICYgKFNFRU5fTUVNIHwgU0VFTl9EQVRBUkVGKSkgeworCQlQUENfQURESSgxLCAxLCBCUEZfUFBDX1NUQUNLRlJBTUUpOworCQlpZiAoY3R4LT5zZWVuICYgU0VFTl9EQVRBUkVGKSB7CisJCQlQUENfTEQoMCwgMSwgMTYpOworCQkJUFBDX01UTFIoMCk7CisJCQlQUENfTEQocl9ELCAxLCAtKDgqKDMyLXJfRCkpKTsKKwkJCVBQQ19MRChyX0hMLCAxLCAtKDgqKDMyLXJfSEwpKSk7CisJCX0KKwkJaWYgKGN0eC0+c2VlbiAmIFNFRU5fTUVNKSB7CisJCQkvKiBSZXN0b3JlIGFueSBzYXZlZCBub24tdm9sIHJlZ2lzdGVycyAqLworCQkJZm9yIChpID0gcl9NOyBpIDwgKHJfTSsxNik7IGkrKykgeworCQkJCWlmIChjdHgtPnNlZW4gJiAoMSA8PCAoaS1yX00pKSkKKwkJCQkJUFBDX0xEKGksIDEsIC0oOCooMzItaSkpKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBUaGUgUkVUcyBoYXZlIGxlZnQgYSByZXR1cm4gdmFsdWUgaW4gUjMuICovCisKKwlQUENfQkxSKCk7Cit9CisKKy8qIEFzc2VtYmxlIHRoZSBib2R5IGNvZGUgYmV0d2VlbiB0aGUgcHJvbG9ndWUgJiBlcGlsb2d1ZS4gKi8KK3N0YXRpYyBpbnQgYnBmX2ppdF9idWlsZF9ib2R5KHN0cnVjdCBza19maWx0ZXIgKmZwLCB1MzIgKmltYWdlLAorCQkJICAgICAgc3RydWN0IGNvZGVnZW5fY29udGV4dCAqY3R4LAorCQkJICAgICAgdW5zaWduZWQgaW50ICphZGRycykKK3sKKwljb25zdCBzdHJ1Y3Qgc29ja19maWx0ZXIgKmZpbHRlciA9IGZwLT5pbnNuczsKKwlpbnQgZmxlbiA9IGZwLT5sZW47CisJdTggKmZ1bmM7CisJdW5zaWduZWQgaW50IHRydWVfY29uZDsKKwlpbnQgaTsKKworCS8qIFN0YXJ0IG9mIGVwaWxvZ3VlIGNvZGUgKi8KKwl1bnNpZ25lZCBpbnQgZXhpdF9hZGRyID0gYWRkcnNbZmxlbl07CisKKwlmb3IgKGkgPSAwOyBpIDwgZmxlbjsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBLID0gZmlsdGVyW2ldLms7CisKKwkJLyoKKwkJICogYWRkcnNbXSBtYXBzIGEgQlBGIGJ5dGVjb2RlIGFkZHJlc3MgaW50byBhIHJlYWwgb2Zmc2V0IGZyb20KKwkJICogdGhlIHN0YXJ0IG9mIHRoZSBib2R5IGNvZGUuCisJCSAqLworCQlhZGRyc1tpXSA9IGN0eC0+aWR4ICogNDsKKworCQlzd2l0Y2ggKGZpbHRlcltpXS5jb2RlKSB7CisJCQkvKioqIEFMVSBvcHMgKioqLworCQljYXNlIEJQRl9TX0FMVV9BRERfWDogLyogQSArPSBYOyAqLworCQkJY3R4LT5zZWVuIHw9IFNFRU5fWFJFRzsKKwkJCVBQQ19BREQocl9BLCByX0EsIHJfWCk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19BTFVfQUREX0s6IC8qIEEgKz0gSzsgKi8KKwkJCWlmICghSykKKwkJCQlicmVhazsKKwkJCVBQQ19BRERJKHJfQSwgcl9BLCBJTU1fTChLKSk7CisJCQlpZiAoSyA+PSAzMjc2OCkKKwkJCQlQUENfQURESVMocl9BLCByX0EsIElNTV9IQShLKSk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19BTFVfU1VCX1g6IC8qIEEgLT0gWDsgKi8KKwkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CisJCQlQUENfU1VCKHJfQSwgcl9BLCByX1gpOworCQkJYnJlYWs7CisJCWNhc2UgQlBGX1NfQUxVX1NVQl9LOiAvKiBBIC09IEsgKi8KKwkJCWlmICghSykKKwkJCQlicmVhazsKKwkJCVBQQ19BRERJKHJfQSwgcl9BLCBJTU1fTCgtSykpOworCQkJaWYgKEsgPj0gMzI3NjgpCisJCQkJUFBDX0FERElTKHJfQSwgcl9BLCBJTU1fSEEoLUspKTsKKwkJCWJyZWFrOworCQljYXNlIEJQRl9TX0FMVV9NVUxfWDogLyogQSAqPSBYOyAqLworCQkJY3R4LT5zZWVuIHw9IFNFRU5fWFJFRzsKKwkJCVBQQ19NVUwocl9BLCByX0EsIHJfWCk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19BTFVfTVVMX0s6IC8qIEEgKj0gSyAqLworCQkJaWYgKEsgPCAzMjc2OCkKKwkJCQlQUENfTVVMSShyX0EsIHJfQSwgSyk7CisJCQllbHNlIHsKKwkJCQlQUENfTEkzMihyX3NjcmF0Y2gxLCBLKTsKKwkJCQlQUENfTVVMKHJfQSwgcl9BLCByX3NjcmF0Y2gxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJQRl9TX0FMVV9ESVZfWDogLyogQSAvPSBYOyAqLworCQkJY3R4LT5zZWVuIHw9IFNFRU5fWFJFRzsKKwkJCVBQQ19DTVBXSShyX1gsIDApOworCQkJaWYgKGN0eC0+cGNfcmV0MCAhPSAtMSkgeworCQkJCVBQQ19CQ0MoQ09ORF9FUSwgYWRkcnNbY3R4LT5wY19yZXQwXSk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogRXhpdCwgcmV0dXJuaW5nIDA7IGZpcnN0IHBhc3MgaGl0cyBoZXJlCisJCQkJICogKGxvbmdlciB3b3JzdC1jYXNlIGNvZGUgc2l6ZSkuCisJCQkJICovCisJCQkJUFBDX0JDQ19TSE9SVChDT05EX05FLCAoY3R4LT5pZHgqNCkrMTIpOworCQkJCVBQQ19MSShyX3JldCwgMCk7CisJCQkJUFBDX0pNUChleGl0X2FkZHIpOworCQkJfQorCQkJUFBDX0RJVldVKHJfQSwgcl9BLCByX1gpOworCQkJYnJlYWs7CisJCWNhc2UgQlBGX1NfQUxVX0RJVl9LOiAvKiBBID0gcmVjaXByb2NhbF9kaXZpZGUoQSwgSyk7ICovCisJCQlQUENfTEkzMihyX3NjcmF0Y2gxLCBLKTsKKwkJCS8qIFRvcCAzMiBiaXRzIG9mIDY0Yml0IHJlc3VsdCAtPiBBICovCisJCQlQUENfTVVMSFdVKHJfQSwgcl9BLCByX3NjcmF0Y2gxKTsKKwkJCWJyZWFrOworCQljYXNlIEJQRl9TX0FMVV9BTkRfWDoKKwkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CisJCQlQUENfQU5EKHJfQSwgcl9BLCByX1gpOworCQkJYnJlYWs7CisJCWNhc2UgQlBGX1NfQUxVX0FORF9LOgorCQkJaWYgKCFJTU1fSChLKSkKKwkJCQlQUENfQU5ESShyX0EsIHJfQSwgSyk7CisJCQllbHNlIHsKKwkJCQlQUENfTEkzMihyX3NjcmF0Y2gxLCBLKTsKKwkJCQlQUENfQU5EKHJfQSwgcl9BLCByX3NjcmF0Y2gxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJQRl9TX0FMVV9PUl9YOgorCQkJY3R4LT5zZWVuIHw9IFNFRU5fWFJFRzsKKwkJCVBQQ19PUihyX0EsIHJfQSwgcl9YKTsKKwkJCWJyZWFrOworCQljYXNlIEJQRl9TX0FMVV9PUl9LOgorCQkJaWYgKElNTV9MKEspKQorCQkJCVBQQ19PUkkocl9BLCByX0EsIElNTV9MKEspKTsKKwkJCWlmIChLID49IDY1NTM2KQorCQkJCVBQQ19PUklTKHJfQSwgcl9BLCBJTU1fSChLKSk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19BTFVfTFNIX1g6IC8qIEEgPDw9IFg7ICovCisJCQljdHgtPnNlZW4gfD0gU0VFTl9YUkVHOworCQkJUFBDX1NMVyhyX0EsIHJfQSwgcl9YKTsKKwkJCWJyZWFrOworCQljYXNlIEJQRl9TX0FMVV9MU0hfSzoKKwkJCWlmIChLID09IDApCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJUFBDX1NMV0kocl9BLCByX0EsIEspOworCQkJYnJlYWs7CisJCWNhc2UgQlBGX1NfQUxVX1JTSF9YOiAvKiBBID4+PSBYOyAqLworCQkJY3R4LT5zZWVuIHw9IFNFRU5fWFJFRzsKKwkJCVBQQ19TUlcocl9BLCByX0EsIHJfWCk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19BTFVfUlNIX0s6IC8qIEEgPj49IEs7ICovCisJCQlpZiAoSyA9PSAwKQorCQkJCWJyZWFrOworCQkJZWxzZQorCQkJCVBQQ19TUldJKHJfQSwgcl9BLCBLKTsKKwkJCWJyZWFrOworCQljYXNlIEJQRl9TX0FMVV9ORUc6CisJCQlQUENfTkVHKHJfQSwgcl9BKTsKKwkJCWJyZWFrOworCQljYXNlIEJQRl9TX1JFVF9LOgorCQkJUFBDX0xJMzIocl9yZXQsIEspOworCQkJaWYgKCFLKSB7CisJCQkJaWYgKGN0eC0+cGNfcmV0MCA9PSAtMSkKKwkJCQkJY3R4LT5wY19yZXQwID0gaTsKKwkJCX0KKwkJCS8qCisJCQkgKiBJZiB0aGlzIGlzbid0IHRoZSB2ZXJ5IGxhc3QgaW5zdHJ1Y3Rpb24sIGJyYW5jaCB0bworCQkJICogdGhlIGVwaWxvZ3VlIGlmIHdlJ3ZlIHN0dWZmIHRvIGNsZWFuIHVwLiAgT3RoZXJ3aXNlLAorCQkJICogaWYgdGhlcmUncyBub3RoaW5nIHRvIHRpZHksIGp1c3QgcmV0dXJuLiAgSWYgd2UgL2FyZS8KKwkJCSAqIHRoZSBsYXN0IGluc3RydWN0aW9uLCB3ZSdyZSBhYm91dCB0byBmYWxsIHRocm91Z2ggdG8KKwkJCSAqIHRoZSBlcGlsb2d1ZSB0byByZXR1cm4uCisJCQkgKi8KKwkJCWlmIChpICE9IGZsZW4gLSAxKSB7CisJCQkJLyoKKwkJCQkgKiBOb3RlOiAnc2VlbicgaXMgcHJvcGVybHkgdmFsaWQgb25seSBvbiBwYXNzCisJCQkJICogIzIuCUJvdGggcGFydHMgb2YgdGhpcyBjb25kaXRpb25hbCBhcmUgdGhlCisJCQkJICogc2FtZSBpbnN0cnVjdGlvbiBzaXplIHRob3VnaCwgbWVhbmluZyB0aGUKKwkJCQkgKiBmaXJzdCBwYXNzIHdpbGwgc3RpbGwgY29ycmVjdGx5IGRldGVybWluZSB0aGUKKwkJCQkgKiBjb2RlIHNpemUvYWRkcmVzc2VzLgorCQkJCSAqLworCQkJCWlmIChjdHgtPnNlZW4pCisJCQkJCVBQQ19KTVAoZXhpdF9hZGRyKTsKKwkJCQllbHNlCisJCQkJCVBQQ19CTFIoKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJQRl9TX1JFVF9BOgorCQkJUFBDX01SKHJfcmV0LCByX0EpOworCQkJaWYgKGkgIT0gZmxlbiAtIDEpIHsKKwkJCQlpZiAoY3R4LT5zZWVuKQorCQkJCQlQUENfSk1QKGV4aXRfYWRkcik7CisJCQkJZWxzZQorCQkJCQlQUENfQkxSKCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19NSVNDX1RBWDogLyogWCA9IEEgKi8KKwkJCVBQQ19NUihyX1gsIHJfQSk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19NSVNDX1RYQTogLyogQSA9IFggKi8KKwkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CisJCQlQUENfTVIocl9BLCByX1gpOworCQkJYnJlYWs7CisKKwkJCS8qKiogQ29uc3RhbnQgbG9hZHMvTVtdIGFjY2VzcyAqKiovCisJCWNhc2UgQlBGX1NfTERfSU1NOiAvKiBBID0gSyAqLworCQkJUFBDX0xJMzIocl9BLCBLKTsKKwkJCWJyZWFrOworCQljYXNlIEJQRl9TX0xEWF9JTU06IC8qIFggPSBLICovCisJCQlQUENfTEkzMihyX1gsIEspOworCQkJYnJlYWs7CisJCWNhc2UgQlBGX1NfTERfTUVNOiAvKiBBID0gbWVtW0tdICovCisJCQlQUENfTVIocl9BLCByX00gKyAoSyAmIDB4ZikpOworCQkJY3R4LT5zZWVuIHw9IFNFRU5fTUVNIHwgKDE8PChLICYgMHhmKSk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19MRFhfTUVNOiAvKiBYID0gbWVtW0tdICovCisJCQlQUENfTVIocl9YLCByX00gKyAoSyAmIDB4ZikpOworCQkJY3R4LT5zZWVuIHw9IFNFRU5fTUVNIHwgKDE8PChLICYgMHhmKSk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19TVDogLyogbWVtW0tdID0gQSAqLworCQkJUFBDX01SKHJfTSArIChLICYgMHhmKSwgcl9BKTsKKwkJCWN0eC0+c2VlbiB8PSBTRUVOX01FTSB8ICgxPDwoSyAmIDB4ZikpOworCQkJYnJlYWs7CisJCWNhc2UgQlBGX1NfU1RYOiAvKiBtZW1bS10gPSBYICovCisJCQlQUENfTVIocl9NICsgKEsgJiAweGYpLCByX1gpOworCQkJY3R4LT5zZWVuIHw9IFNFRU5fWFJFRyB8IFNFRU5fTUVNIHwgKDE8PChLICYgMHhmKSk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19MRF9XX0xFTjogLyoJQSA9IHNrYi0+bGVuOyAqLworCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSAhPSA0KTsKKwkJCVBQQ19MV1pfT0ZGUyhyX0EsIHJfc2tiLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19MRFhfV19MRU46IC8qIFggPSBza2ItPmxlbjsgKi8KKwkJCVBQQ19MV1pfT0ZGUyhyX1gsIHJfc2tiLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSk7CisJCQlicmVhazsKKworCQkJLyoqKiBBbmNpbGxhcnkgaW5mbyBsb2FkcyAqKiovCisKKwkJCS8qIE5vbmUgb2YgdGhlIEJQRl9TX0FOQyogY29kZXMgYXBwZWFyIHRvIGJlIHBhc3NlZCBieQorCQkJICogc2tfY2hrX2ZpbHRlcigpLiAgVGhlIGludGVycHJldGVyIGFuZCB0aGUgeDg2IEJQRgorCQkJICogY29tcGlsZXIgaW1wbGVtZW50IHRoZW0gc28gd2UgZG8gdG9vIC0tIHRoZXkgbWF5IGJlCisJCQkgKiBwbGFudGVkIGluIGZ1dHVyZS4KKwkJCSAqLworCQljYXNlIEJQRl9TX0FOQ19QUk9UT0NPTDogLyogQSA9IG50b2hzKHNrYi0+cHJvdG9jb2wpOyAqLworCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwKKwkJCQkJCSAgcHJvdG9jb2wpICE9IDIpOworCQkJUFBDX0xIWl9PRkZTKHJfQSwgcl9za2IsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLAorCQkJCQkJCSAgcHJvdG9jb2wpKTsKKwkJCS8qIG50b2hzIGlzIGEgTk9QIHdpdGggQkUgbG9hZHMuICovCisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19BTkNfSUZJTkRFWDoKKwkJCVBQQ19MRF9PRkZTKHJfc2NyYXRjaDEsIHJfc2tiLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwKKwkJCQkJCQkJZGV2KSk7CisJCQlQUENfQ01QREkocl9zY3JhdGNoMSwgMCk7CisJCQlpZiAoY3R4LT5wY19yZXQwICE9IC0xKSB7CisJCQkJUFBDX0JDQyhDT05EX0VRLCBhZGRyc1tjdHgtPnBjX3JldDBdKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogRXhpdCwgcmV0dXJuaW5nIDA7IGZpcnN0IHBhc3MgaGl0cyBoZXJlLiAqLworCQkJCVBQQ19CQ0NfU0hPUlQoQ09ORF9ORSwgKGN0eC0+aWR4KjQpKzEyKTsKKwkJCQlQUENfTEkocl9yZXQsIDApOworCQkJCVBQQ19KTVAoZXhpdF9hZGRyKTsKKwkJCX0KKwkJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IG5ldF9kZXZpY2UsCisJCQkJCQkgIGlmaW5kZXgpICE9IDQpOworCQkJUFBDX0xXWl9PRkZTKHJfQSwgcl9zY3JhdGNoMSwKKwkJCQkgICAgIG9mZnNldG9mKHN0cnVjdCBuZXRfZGV2aWNlLCBpZmluZGV4KSk7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU19BTkNfTUFSSzoKKwkJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIG1hcmspICE9IDQpOworCQkJUFBDX0xXWl9PRkZTKHJfQSwgcl9za2IsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLAorCQkJCQkJCSAgbWFyaykpOworCQkJYnJlYWs7CisJCWNhc2UgQlBGX1NfQU5DX1JYSEFTSDoKKwkJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIHJ4aGFzaCkgIT0gNCk7CisJCQlQUENfTFdaX09GRlMocl9BLCByX3NrYiwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsCisJCQkJCQkJICByeGhhc2gpKTsKKwkJCWJyZWFrOworCQljYXNlIEJQRl9TX0FOQ19RVUVVRToKKwkJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsCisJCQkJCQkgIHF1ZXVlX21hcHBpbmcpICE9IDIpOworCQkJUFBDX0xIWl9PRkZTKHJfQSwgcl9za2IsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLAorCQkJCQkJCSAgcXVldWVfbWFwcGluZykpOworCQkJYnJlYWs7CisJCWNhc2UgQlBGX1NfQU5DX0NQVToKKyNpZmRlZiBDT05GSUdfU01QCisJCQkvKgorCQkJICogUEFDQSBwdHIgaXMgcjEzOgorCQkJICogcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSA9IGxvY2FsX3BhY2EtPnBhY2FfaW5kZXgKKwkJCSAqLworCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsCisJCQkJCQkgIHBhY2FfaW5kZXgpICE9IDIpOworCQkJUFBDX0xIWl9PRkZTKHJfQSwgMTMsCisJCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHBhY2FfaW5kZXgpKTsKKyNlbHNlCisJCQlQUENfTEkocl9BLCAwKTsKKyNlbmRpZgorCQkJYnJlYWs7CisKKwkJCS8qKiogQWJzb2x1dGUgbG9hZHMgZnJvbSBwYWNrZXQgaGVhZGVyL2RhdGEgKioqLworCQljYXNlIEJQRl9TX0xEX1dfQUJTOgorCQkJZnVuYyA9IHNrX2xvYWRfd29yZDsKKwkJCWdvdG8gY29tbW9uX2xvYWQ7CisJCWNhc2UgQlBGX1NfTERfSF9BQlM6CisJCQlmdW5jID0gc2tfbG9hZF9oYWxmOworCQkJZ290byBjb21tb25fbG9hZDsKKwkJY2FzZSBCUEZfU19MRF9CX0FCUzoKKwkJCWZ1bmMgPSBza19sb2FkX2J5dGU7CisJCWNvbW1vbl9sb2FkOgorCQkJLyoKKwkJCSAqIExvYWQgZnJvbSBbS10uICBSZWZlcmVuY2Ugd2l0aCB0aGUgKG5lZ2F0aXZlKQorCQkJICogU0tGX05FVF9PRkYvU0tGX0xMX09GRiBvZmZzZXRzIGlzIHVuc3VwcG9ydGVkLgorCQkJICovCisJCQljdHgtPnNlZW4gfD0gU0VFTl9EQVRBUkVGOworCQkJaWYgKChpbnQpSyA8IDApCisJCQkJcmV0dXJuIC1FTk9UU1VQUDsKKwkJCVBQQ19MSTY0KHJfc2NyYXRjaDEsIGZ1bmMpOworCQkJUFBDX01UTFIocl9zY3JhdGNoMSk7CisJCQlQUENfTEkzMihyX2FkZHIsIEspOworCQkJUFBDX0JMUkwoKTsKKwkJCS8qCisJCQkgKiBIZWxwZXIgcmV0dXJucyAnbHQnIGNvbmRpdGlvbiBvbiBlcnJvciwgYW5kIGFuCisJCQkgKiBhcHByb3ByaWF0ZSByZXR1cm4gdmFsdWUgaW4gcjMKKwkJCSAqLworCQkJUFBDX0JDQyhDT05EX0xULCBleGl0X2FkZHIpOworCQkJYnJlYWs7CisKKwkJCS8qKiogSW5kaXJlY3QgbG9hZHMgZnJvbSBwYWNrZXQgaGVhZGVyL2RhdGEgKioqLworCQljYXNlIEJQRl9TX0xEX1dfSU5EOgorCQkJZnVuYyA9IHNrX2xvYWRfd29yZDsKKwkJCWdvdG8gY29tbW9uX2xvYWRfaW5kOworCQljYXNlIEJQRl9TX0xEX0hfSU5EOgorCQkJZnVuYyA9IHNrX2xvYWRfaGFsZjsKKwkJCWdvdG8gY29tbW9uX2xvYWRfaW5kOworCQljYXNlIEJQRl9TX0xEX0JfSU5EOgorCQkJZnVuYyA9IHNrX2xvYWRfYnl0ZTsKKwkJY29tbW9uX2xvYWRfaW5kOgorCQkJLyoKKwkJCSAqIExvYWQgZnJvbSBbWCArIEtdLiAgTmVnYXRpdmUgb2Zmc2V0cyBhcmUgdGVzdGVkIGZvcgorCQkJICogaW4gdGhlIGhlbHBlciBmdW5jdGlvbnMsIGFuZCByZXN1bHQgaW4gYSAncmV0IDAnLgorCQkJICovCisJCQljdHgtPnNlZW4gfD0gU0VFTl9EQVRBUkVGIHwgU0VFTl9YUkVHOworCQkJUFBDX0xJNjQocl9zY3JhdGNoMSwgZnVuYyk7CisJCQlQUENfTVRMUihyX3NjcmF0Y2gxKTsKKwkJCVBQQ19BRERJKHJfYWRkciwgcl9YLCBJTU1fTChLKSk7CisJCQlpZiAoSyA+PSAzMjc2OCkKKwkJCQlQUENfQURESVMocl9hZGRyLCByX2FkZHIsIElNTV9IQShLKSk7CisJCQlQUENfQkxSTCgpOworCQkJLyogSWYgZXJyb3IsIGNyMC5MVCBzZXQgKi8KKwkJCVBQQ19CQ0MoQ09ORF9MVCwgZXhpdF9hZGRyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQlBGX1NfTERYX0JfTVNIOgorCQkJLyoKKwkJCSAqIHg4NiB2ZXJzaW9uIGRyb3BzIHBhY2tldCAoUkVUIDApIHdoZW4gSzwwLCB3aGVyZWFzCisJCQkgKiBpbnRlcnByZXRlciBkb2VzIGFsbG93IEs8MCAoX19sb2FkX3BvaW50ZXIsIHNwZWNpYWwKKwkJCSAqIGFuY2lsbGFyeSBkYXRhKS4gIGNvbW1vbl9sb2FkIHJldHVybnMgRU5PVFNVUFAgaWYgSzwwLAorCQkJICogc28gd2UgZmFsbCBiYWNrIHRvIGludGVycHJldGVyICYgZmlsdGVyIHdvcmtzLgorCQkJICovCisJCQlmdW5jID0gc2tfbG9hZF9ieXRlX21zaDsKKwkJCWdvdG8gY29tbW9uX2xvYWQ7CisJCQlicmVhazsKKworCQkJLyoqKiBKdW1wIGFuZCBicmFuY2hlcyAqKiovCisJCWNhc2UgQlBGX1NfSk1QX0pBOgorCQkJaWYgKEsgIT0gMCkKKwkJCQlQUENfSk1QKGFkZHJzW2kgKyAxICsgS10pOworCQkJYnJlYWs7CisKKwkJY2FzZSBCUEZfU19KTVBfSkdUX0s6CisJCWNhc2UgQlBGX1NfSk1QX0pHVF9YOgorCQkJdHJ1ZV9jb25kID0gQ09ORF9HVDsKKwkJCWdvdG8gY29uZF9icmFuY2g7CisJCWNhc2UgQlBGX1NfSk1QX0pHRV9LOgorCQljYXNlIEJQRl9TX0pNUF9KR0VfWDoKKwkJCXRydWVfY29uZCA9IENPTkRfR0U7CisJCQlnb3RvIGNvbmRfYnJhbmNoOworCQljYXNlIEJQRl9TX0pNUF9KRVFfSzoKKwkJY2FzZSBCUEZfU19KTVBfSkVRX1g6CisJCQl0cnVlX2NvbmQgPSBDT05EX0VROworCQkJZ290byBjb25kX2JyYW5jaDsKKwkJY2FzZSBCUEZfU19KTVBfSlNFVF9LOgorCQljYXNlIEJQRl9TX0pNUF9KU0VUX1g6CisJCQl0cnVlX2NvbmQgPSBDT05EX05FOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCWNvbmRfYnJhbmNoOgorCQkJLyogc2FtZSB0YXJnZXRzLCBjYW4gYXZvaWQgZG9pbmcgdGhlIHRlc3QgOikgKi8KKwkJCWlmIChmaWx0ZXJbaV0uanQgPT0gZmlsdGVyW2ldLmpmKSB7CisJCQkJaWYgKGZpbHRlcltpXS5qdCA+IDApCisJCQkJCVBQQ19KTVAoYWRkcnNbaSArIDEgKyBmaWx0ZXJbaV0uanRdKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc3dpdGNoIChmaWx0ZXJbaV0uY29kZSkgeworCQkJY2FzZSBCUEZfU19KTVBfSkdUX1g6CisJCQljYXNlIEJQRl9TX0pNUF9KR0VfWDoKKwkJCWNhc2UgQlBGX1NfSk1QX0pFUV9YOgorCQkJCWN0eC0+c2VlbiB8PSBTRUVOX1hSRUc7CisJCQkJUFBDX0NNUExXKHJfQSwgcl9YKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlBGX1NfSk1QX0pTRVRfWDoKKwkJCQljdHgtPnNlZW4gfD0gU0VFTl9YUkVHOworCQkJCVBQQ19BTkRfRE9UKHJfc2NyYXRjaDEsIHJfQSwgcl9YKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlBGX1NfSk1QX0pFUV9LOgorCQkJY2FzZSBCUEZfU19KTVBfSkdUX0s6CisJCQljYXNlIEJQRl9TX0pNUF9KR0VfSzoKKwkJCQlpZiAoSyA8IDMyNzY4KQorCQkJCQlQUENfQ01QTFdJKHJfQSwgSyk7CisJCQkJZWxzZSB7CisJCQkJCVBQQ19MSTMyKHJfc2NyYXRjaDEsIEspOworCQkJCQlQUENfQ01QTFcocl9BLCByX3NjcmF0Y2gxKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEJQRl9TX0pNUF9KU0VUX0s6CisJCQkJaWYgKEsgPCAzMjc2OCkKKwkJCQkJLyogUFBDX0FOREkgaXMgL29ubHkvIGRvdC1mb3JtICovCisJCQkJCVBQQ19BTkRJKHJfc2NyYXRjaDEsIHJfQSwgSyk7CisJCQkJZWxzZSB7CisJCQkJCVBQQ19MSTMyKHJfc2NyYXRjaDEsIEspOworCQkJCQlQUENfQU5EX0RPVChyX3NjcmF0Y2gxLCByX0EsCisJCQkJCQkgICAgcl9zY3JhdGNoMSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJLyogU29tZXRpbWVzIGJyYW5jaGVzIGFyZSBjb25zdHJ1Y3RlZCAiYmFja3dhcmQiLCB3aXRoCisJCQkgKiB0aGUgZmFsc2UgcGF0aCBiZWluZyB0aGUgYnJhbmNoIGFuZCB0cnVlIHBhdGggYmVpbmcKKwkJCSAqIGEgZmFsbHRocm91Z2ggdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCisJCQkgKi8KKwkJCWlmIChmaWx0ZXJbaV0uanQgPT0gMCkKKwkJCQkvKiBTd2FwIHRoZSBzZW5zZSBvZiB0aGUgYnJhbmNoICovCisJCQkJUFBDX0JDQyh0cnVlX2NvbmQgXiBDT05EX0NNUF9UUlVFLAorCQkJCQlhZGRyc1tpICsgMSArIGZpbHRlcltpXS5qZl0pOworCQkJZWxzZSB7CisJCQkJUFBDX0JDQyh0cnVlX2NvbmQsIGFkZHJzW2kgKyAxICsgZmlsdGVyW2ldLmp0XSk7CisJCQkJaWYgKGZpbHRlcltpXS5qZiAhPSAwKQorCQkJCQlQUENfSk1QKGFkZHJzW2kgKyAxICsgZmlsdGVyW2ldLmpmXSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFRoZSBmaWx0ZXIgY29udGFpbnMgc29tZXRoaW5nIGNydWVsICYgdW51c3VhbC4KKwkJCSAqIFdlIGRvbid0IGhhbmRsZSBpdCwgYnV0IGFsc28gdGhlcmUgc2hvdWxkbid0IGJlCisJCQkgKiBhbnl0aGluZyBtaXNzaW5nIGZyb20gb3VyIGxpc3QuCisJCQkgKi8KKwkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQkJcHJfZXJyKCJCUEYgZmlsdGVyIG9wY29kZSAlMDR4IChAJWQpIHVuc3VwcG9ydGVkXG4iLAorCQkJCSAgICAgICBmaWx0ZXJbaV0uY29kZSwgaSk7CisJCQlyZXR1cm4gLUVOT1RTVVBQOworCQl9CisKKwl9CisJLyogU2V0IGVuZC1vZi1ib2R5LWNvZGUgYWRkcmVzcyBmb3IgZXhpdC4gKi8KKwlhZGRyc1tpXSA9IGN0eC0+aWR4ICogNDsKKworCXJldHVybiAwOworfQorCit2b2lkIGJwZl9qaXRfY29tcGlsZShzdHJ1Y3Qgc2tfZmlsdGVyICpmcCkKK3sKKwl1bnNpZ25lZCBpbnQgcHJvZ2xlbjsKKwl1bnNpZ25lZCBpbnQgYWxsb2NsZW47CisJdTMyICppbWFnZSA9IE5VTEw7CisJdTMyICpjb2RlX2Jhc2U7CisJdW5zaWduZWQgaW50ICphZGRyczsKKwlzdHJ1Y3QgY29kZWdlbl9jb250ZXh0IGNnY3R4OworCWludCBwYXNzOworCWludCBmbGVuID0gZnAtPmxlbjsKKworCWlmICghYnBmX2ppdF9lbmFibGUpCisJCXJldHVybjsKKworCWFkZHJzID0ga3phbGxvYygoZmxlbisxKSAqIHNpemVvZigqYWRkcnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWRkcnMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUaGVyZSBhcmUgbXVsdGlwbGUgYXNzZW1ibHkgcGFzc2VzIGFzIHRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsIGNoYW5nZQorCSAqIHNpemUgYXMgaXQgc2V0dGxlcyBkb3duLCBmaWd1cmluZyBvdXQgdGhlIG1heCBicmFuY2ggb2Zmc2V0cy9leGl0CisJICogcGF0aHMgcmVxdWlyZWQuCisJICoKKwkgKiBUaGUgcmFuZ2Ugb2Ygc3RhbmRhcmQgY29uZGl0aW9uYWwgYnJhbmNoZXMgaXMgKy8tIDMyS2J5dGVzLglTaW5jZQorCSAqIEJQRl9NQVhJTlNOUyA9IDQwOTYsIHdlIGNhbiBvbmx5IGp1bXAgZnJvbSAod29yc3QgY2FzZSkgc3RhcnQgdG8KKwkgKiBmaW5pc2ggd2l0aCA4IGJ5dGVzL2luc3RydWN0aW9uLiAgTm90IGZlYXNpYmxlLCBzbyBsb25nIGp1bXBzIGFyZQorCSAqIHVzZWQsIGRpc3RpbmN0IGZyb20gc2hvcnQgYnJhbmNoZXMuCisJICoKKwkgKiBDdXJyZW50OgorCSAqCisJICogRm9yIG5vdywgYm90aCBicmFuY2ggdHlwZXMgYXNzZW1ibGUgdG8gMiB3b3JkcyAoc2hvcnQgYnJhbmNoZXMgcGFkZGVkCisJICogd2l0aCBhIE5PUCk7IHRoaXMgaXMgbGVzcyBlZmZpY2llbnQsIGJ1dCBhc3NlbWJseSB3aWxsIGFsd2F5cyBjb21wbGV0ZQorCSAqIGFmdGVyIGV4YWN0bHkgMyBwYXNzZXM6CisJICoKKwkgKiBGaXJzdCBwYXNzOiBObyBjb2RlIGJ1ZmZlcjsgUHJvZ3JhbSBpcyAiZmF1eC1nZW5lcmF0ZWQiIC0tIG5vIGNvZGUKKwkgKiBlbWl0dGVkIGJ1dCBtYXhpbXVtIHNpemUgb2Ygb3V0cHV0IGRldGVybWluZWQgKGFuZCBhZGRyc1tdIGZpbGxlZAorCSAqIGluKS4JIEFsc28sIHdlIG5vdGUgd2hldGhlciB3ZSB1c2UgTVtdLCB3aGV0aGVyIHdlIHVzZSBza2IgZGF0YSwgZXRjLgorCSAqIEFsbCBnZW5lcmF0aW9uIGNob2ljZXMgYXNzdW1lZCB0byBiZSAnd29yc3QtY2FzZScsIGUuZy4gYnJhbmNoZXMgYWxsCisJICogZmFyICgyIGluc3RydWN0aW9ucyksIHJldHVybiBwYXRoIGNvZGUgcmVkdWN0aW9uIG5vdCBhdmFpbGFibGUsIGV0Yy4KKwkgKgorCSAqIFNlY29uZCBwYXNzOiBDb2RlIGJ1ZmZlciBhbGxvY2F0ZWQgd2l0aCBzaXplIGRldGVybWluZWQgcHJldmlvdXNseS4KKwkgKiBQcm9sb2d1ZSBnZW5lcmF0ZWQgdG8gc3VwcG9ydCBmZWF0dXJlcyB3ZSBoYXZlIHNlZW4gdXNlZC4gIEV4aXQgcGF0aHMKKwkgKiBkZXRlcm1pbmVkIGFuZCBhZGRyc1tdIGlzIGZpbGxlZCBpbiBhZ2FpbiwgYXMgY29kZSBtYXkgYmUgc2xpZ2h0bHkKKwkgKiBzbWFsbGVyIGFzIGEgcmVzdWx0LgorCSAqCisJICogVGhpcmQgcGFzczogQ29kZSBnZW5lcmF0ZWQgJ2ZvciByZWFsJywgYW5kIGJyYW5jaCBkZXN0aW5hdGlvbnMKKwkgKiBkZXRlcm1pbmVkIGZyb20gbm93LWFjY3VyYXRlIGFkZHJzW10gbWFwLgorCSAqCisJICogSWRlYWw6CisJICoKKwkgKiBJZiB3ZSBvcHRpbWlzZSB0aGlzLCBuZWFyIGJyYW5jaGVzIHdpbGwgYmUgc2hvcnRlci4JT24gdGhlCisJICogZmlyc3QgYXNzZW1ibHkgcGFzcywgd2Ugc2hvdWxkIGVyciBvbiB0aGUgc2lkZSBvZiBjYXV0aW9uIGFuZAorCSAqIGdlbmVyYXRlIHRoZSBiaWdnZXN0IGNvZGUuICBPbiBzdWJzZXF1ZW50IHBhc3NlcywgYnJhbmNoZXMgd2lsbCBiZQorCSAqIGdlbmVyYXRlZCBzaG9ydCBvciBsb25nIGFuZCBjb2RlIHNpemUgd2lsbCByZWR1Y2UuICBXaXRoIHNtYWxsZXIKKwkgKiBjb2RlLCBtb3JlIGJyYW5jaGVzIG1heSBmYWxsIGludG8gdGhlIHNob3J0IGNhdGVnb3J5LCBhbmQgY29kZSB3aWxsCisJICogcmVkdWNlIG1vcmUuCisJICoKKwkgKiBGaW5hbGx5LCBpZiB3ZSBzZWUgb25lIHBhc3MgZ2VuZXJhdGUgY29kZSB0aGUgc2FtZSBzaXplIGFzIHRoZQorCSAqIHByZXZpb3VzIHBhc3Mgd2UgaGF2ZSBjb252ZXJnZWQgYW5kIHNob3VsZCBub3cgZ2VuZXJhdGUgY29kZSBmb3IKKwkgKiByZWFsLiAgQWxsb2NhdGluZyBhdCB0aGUgZW5kIHdpbGwgYWxzbyBzYXZlIHRoZSBtZW1vcnkgdGhhdCB3b3VsZAorCSAqIG90aGVyd2lzZSBiZSB3YXN0ZWQgYnkgdGhlIChzbWFsbCkgY3VycmVudCBjb2RlIHNocmlua2FnZS4KKwkgKiBQcmVmZXJhYmx5LCB3ZSBzaG91bGQgZG8gYSBzbWFsbCBudW1iZXIgb2YgcGFzc2VzIChlLmcuIDUpIGFuZCBpZiB3ZQorCSAqIGhhdmVuJ3QgY29udmVyZ2VkIGJ5IHRoZW4sIGdldCBpbXBhdGllbnQgYW5kIGZvcmNlIGNvZGUgdG8gZ2VuZXJhdGUKKwkgKiBhcy1pcywgZXZlbiBpZiB0aGUgb2RkIGJyYW5jaCB3b3VsZCBiZSBsZWZ0IGxvbmcuICBUaGUgY2hhbmNlcyBvZiBhCisJICogbG9uZyBqdW1wIGFyZSB0aW55IHdpdGggYWxsIGJ1dCB0aGUgbW9zdCBlbm9ybW91cyBvZiBCUEYgZmlsdGVyCisJICogaW5wdXRzLCBzbyB3ZSBzaG91bGQgdXN1YWxseSBjb252ZXJnZSBvbiB0aGUgdGhpcmQgcGFzcy4KKwkgKi8KKworCWNnY3R4LmlkeCA9IDA7CisJY2djdHguc2VlbiA9IDA7CisJY2djdHgucGNfcmV0MCA9IC0xOworCS8qIFNjb3V0aW5nIGZhdXgtZ2VuZXJhdGUgcGFzcyAwICovCisJaWYgKGJwZl9qaXRfYnVpbGRfYm9keShmcCwgMCwgJmNnY3R4LCBhZGRycykpCisJCS8qIFdlIGhpdCBzb21ldGhpbmcgaWxsZWdhbCBvciB1bnN1cHBvcnRlZC4gKi8KKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFByZXRlbmQgdG8gYnVpbGQgcHJvbG9ndWUsIGdpdmVuIHRoZSBmZWF0dXJlcyB3ZSd2ZSBzZWVuLiAgVGhpcyB3aWxsCisJICogdXBkYXRlIGN0Z3R4LmlkeCBhcyBpdCBwcmV0ZW5kcyB0byBvdXRwdXQgaW5zdHJ1Y3Rpb25zLCB0aGVuIHdlIGNhbgorCSAqIGNhbGN1bGF0ZSB0b3RhbCBzaXplIGZyb20gaWR4LgorCSAqLworCWJwZl9qaXRfYnVpbGRfcHJvbG9ndWUoZnAsIDAsICZjZ2N0eCk7CisJYnBmX2ppdF9idWlsZF9lcGlsb2d1ZSgwLCAmY2djdHgpOworCisJcHJvZ2xlbiA9IGNnY3R4LmlkeCAqIDQ7CisJYWxsb2NsZW4gPSBwcm9nbGVuICsgRlVOQ1RJT05fREVTQ1JfU0laRTsKKwlpbWFnZSA9IG1vZHVsZV9hbGxvYyhtYXhfdCh1bnNpZ25lZCBpbnQsIGFsbG9jbGVuLAorCQkJCSAgIHNpemVvZihzdHJ1Y3Qgd29ya19zdHJ1Y3QpKSk7CisJaWYgKCFpbWFnZSkKKwkJZ290byBvdXQ7CisKKwljb2RlX2Jhc2UgPSBpbWFnZSArIChGVU5DVElPTl9ERVNDUl9TSVpFLzQpOworCisJLyogQ29kZSBnZW5lcmF0aW9uIHBhc3NlcyAxLTIgKi8KKwlmb3IgKHBhc3MgPSAxOyBwYXNzIDwgMzsgcGFzcysrKSB7CisJCS8qIE5vdyBidWlsZCB0aGUgcHJvbG9ndWUsIGJvZHkgY29kZSAmIGVwaWxvZ3VlIGZvciByZWFsLiAqLworCQljZ2N0eC5pZHggPSAwOworCQlicGZfaml0X2J1aWxkX3Byb2xvZ3VlKGZwLCBjb2RlX2Jhc2UsICZjZ2N0eCk7CisJCWJwZl9qaXRfYnVpbGRfYm9keShmcCwgY29kZV9iYXNlLCAmY2djdHgsIGFkZHJzKTsKKwkJYnBmX2ppdF9idWlsZF9lcGlsb2d1ZShjb2RlX2Jhc2UsICZjZ2N0eCk7CisKKwkJaWYgKGJwZl9qaXRfZW5hYmxlID4gMSkKKwkJCXByX2luZm8oIlBhc3MgJWQ6IHNocmluayA9ICVkLCBzZWVuID0gMHgleFxuIiwgcGFzcywKKwkJCQlwcm9nbGVuIC0gKGNnY3R4LmlkeCAqIDQpLCBjZ2N0eC5zZWVuKTsKKwl9CisKKwlpZiAoYnBmX2ppdF9lbmFibGUgPiAxKQorCQlwcl9pbmZvKCJmbGVuPSVkIHByb2dsZW49JXUgcGFzcz0lZCBpbWFnZT0lcFxuIiwKKwkJICAgICAgIGZsZW4sIHByb2dsZW4sIHBhc3MsIGltYWdlKTsKKworCWlmIChpbWFnZSkgeworCQlpZiAoYnBmX2ppdF9lbmFibGUgPiAxKQorCQkJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJKSVQgY29kZTogIiwKKwkJCQkgICAgICAgRFVNUF9QUkVGSVhfQUREUkVTUywKKwkJCQkgICAgICAgMTYsIDEsIGNvZGVfYmFzZSwKKwkJCQkgICAgICAgcHJvZ2xlbiwgZmFsc2UpOworCisJCWJwZl9mbHVzaF9pY2FjaGUoY29kZV9iYXNlLCBjb2RlX2Jhc2UgKyAocHJvZ2xlbi80KSk7CisJCS8qIEZ1bmN0aW9uIGRlc2NyaXB0b3IgbmFzdGluZXNzOiBBZGRyZXNzICsgVE9DICovCisJCSgodTY0ICopaW1hZ2UpWzBdID0gKHU2NCljb2RlX2Jhc2U7CisJCSgodTY0ICopaW1hZ2UpWzFdID0gbG9jYWxfcGFjYS0+a2VybmVsX3RvYzsKKwkJZnAtPmJwZl9mdW5jID0gKHZvaWQgKilpbWFnZTsKKwl9CitvdXQ6CisJa2ZyZWUoYWRkcnMpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgaml0X2ZyZWVfZGVmZXIoc3RydWN0IHdvcmtfc3RydWN0ICphcmcpCit7CisJbW9kdWxlX2ZyZWUoTlVMTCwgYXJnKTsKK30KKworLyogcnVuIGZyb20gc29mdGlycSwgd2UgbXVzdCB1c2UgYSB3b3JrX3N0cnVjdCB0byBjYWxsCisgKiBtb2R1bGVfZnJlZSgpIGZyb20gcHJvY2VzcyBjb250ZXh0CisgKi8KK3ZvaWQgYnBmX2ppdF9mcmVlKHN0cnVjdCBza19maWx0ZXIgKmZwKQoreworCWlmIChmcC0+YnBmX2Z1bmMgIT0gc2tfcnVuX2ZpbHRlcikgeworCQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmsgPSAoc3RydWN0IHdvcmtfc3RydWN0ICopZnAtPmJwZl9mdW5jOworCisJCUlOSVRfV09SSyh3b3JrLCBqaXRfZnJlZV9kZWZlcik7CisJCXNjaGVkdWxlX3dvcmsod29yayk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvS2NvbmZpZwppbmRleCA0N2VhMWJlLi45MGY0NDk2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvS2NvbmZpZwpAQCAtNTUsMTQgKzU1LDYgQEAKIAogCSAgSXQgaXMgc2FmZSB0byBzYXkgJ1knIGhlcmUKIAotY29uZmlnIFBQQ19NUEM1MjAwX0dQSU8KLQlib29sICJNUEM1MjAwIEdQSU8gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBQQ19NUEM1Mnh4Ci0Jc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCi0Jc2VsZWN0IEdFTkVSSUNfR1BJTwotCWhlbHAKLQkgIEVuYWJsZSBncGlvbGliIHN1cHBvcnQgZm9yIG1wYzUyMDAgYmFzZWQgYm9hcmRzCi0KIGNvbmZpZyBQUENfTVBDNTIwMF9MUEJGSUZPCiAJdHJpc3RhdGUgIk1QQzUyMDAgTG9jYWxQbHVzIGJ1cyBGSUZPIGRyaXZlciIKIAlkZXBlbmRzIG9uIFBQQ19NUEM1Mnh4CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvTWFrZWZpbGUKaW5kZXggMmJjOGNkMC4uNGU2MjQ4NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9NYWtlZmlsZQpAQCAtMTQsNSArMTQsNCBAQAogCW9iai0kKENPTkZJR19QTSkJKz0gbGl0ZTUyMDBfc2xlZXAubyBsaXRlNTIwMF9wbS5vCiBlbmRpZgogCi1vYmotJChDT05GSUdfUFBDX01QQzUyMDBfR1BJTykJKz0gbXBjNTJ4eF9ncGlvLm8KIG9iai0kKENPTkZJR19QUENfTVBDNTIwMF9MUEJGSUZPKQkrPSBtcGM1Mnh4X2xwYmZpZm8ubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3Bpby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzU3ZDFkLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKgotICogTVBDNTJ4eCBncGlvIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTYXNjaGEgSGF1ZXIgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+LCBQZW5ndXRyb25peAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLQotI2luY2x1ZGUgPGFzbS9ncGlvLmg+Ci0jaW5jbHVkZSA8YXNtL21wYzUyeHguaD4KLSNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdwaW9fbG9jayk7Ci0KLXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwIHsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwIG1tY2hpcDsKLQl1bnNpZ25lZCBpbnQgc2hhZG93X2R2bzsKLQl1bnNpZ25lZCBpbnQgc2hhZG93X2dwaW9lOwotCXVuc2lnbmVkIGludCBzaGFkb3dfZGRyOwotfTsKLQotLyoKLSAqIEdQSU8gTElCIEFQSSBpbXBsZW1lbnRhdGlvbiBmb3Igd2FrZXVwIEdQSU9zLgotICoKLSAqIFRoZXJlJ3MgYSBtYXhpbXVtIG9mIDggd2FrZXVwIEdQSU9zLiBXaGljaCBvZiB0aGVzZSBhcmUgYXZhaWxhYmxlCi0gKiBmb3IgdXNlIGRlcGVuZHMgb24geW91ciBib2FyZCBzZXR1cC4KLSAqCi0gKiAwIC0+IEdQSU9fV0tVUF83Ci0gKiAxIC0+IEdQSU9fV0tVUF82Ci0gKiAyIC0+IFBTQzZfMQotICogMyAtPiBQU0M2XzAKLSAqIDQgLT4gRVRIXzE3Ci0gKiA1IC0+IFBTQzNfOQotICogNiAtPiBQU0MyXzQKLSAqIDcgLT4gUFNDMV80Ci0gKgotICovCi1zdGF0aWMgaW50IG1wYzUyeHhfd2t1cF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCi17Ci0Jc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOwotCXN0cnVjdCBtcGM1Mnh4X2dwaW9fd2t1cCBfX2lvbWVtICpyZWdzID0gbW1fZ2MtPnJlZ3M7Ci0JdW5zaWduZWQgaW50IHJldDsKLQotCXJldCA9IChpbl84KCZyZWdzLT53a3VwX2l2YWwpID4+ICg3IC0gZ3BpbykpICYgMTsKLQotCXByX2RlYnVnKCIlczogZ3BpbzogJWQgcmV0OiAlZFxuIiwgX19mdW5jX18sIGdwaW8sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9fbXBjNTJ4eF93a3VwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKLXsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYyA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7Ci0Jc3RydWN0IG1wYzUyeHhfZ3Bpb2NoaXAgKmNoaXAgPSBjb250YWluZXJfb2YobW1fZ2MsCi0JCQlzdHJ1Y3QgbXBjNTJ4eF9ncGlvY2hpcCwgbW1jaGlwKTsKLQlzdHJ1Y3QgbXBjNTJ4eF9ncGlvX3drdXAgX19pb21lbSAqcmVncyA9IG1tX2djLT5yZWdzOwotCi0JaWYgKHZhbCkKLQkJY2hpcC0+c2hhZG93X2R2byB8PSAxIDw8ICg3IC0gZ3Bpbyk7Ci0JZWxzZQotCQljaGlwLT5zaGFkb3dfZHZvICY9IH4oMSA8PCAoNyAtIGdwaW8pKTsKLQotCW91dF84KCZyZWdzLT53a3VwX2R2bywgY2hpcC0+c2hhZG93X2R2byk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tcGM1Mnh4X3drdXBfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7Ci0KLQlfX21wYzUyeHhfd2t1cF9ncGlvX3NldChnYywgZ3BpbywgdmFsKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCi0JcHJfZGVidWcoIiVzOiBncGlvOiAlZCB2YWw6ICVkXG4iLCBfX2Z1bmNfXywgZ3BpbywgdmFsKTsKLX0KLQotc3RhdGljIGludCBtcGM1Mnh4X3drdXBfZ3Bpb19kaXJfaW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQotewotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKLQlzdHJ1Y3QgbXBjNTJ4eF9ncGlvY2hpcCAqY2hpcCA9IGNvbnRhaW5lcl9vZihtbV9nYywKLQkJCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwLCBtbWNoaXApOwotCXN0cnVjdCBtcGM1Mnh4X2dwaW9fd2t1cCBfX2lvbWVtICpyZWdzID0gbW1fZ2MtPnJlZ3M7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQotCS8qIHNldCB0aGUgZGlyZWN0aW9uICovCi0JY2hpcC0+c2hhZG93X2RkciAmPSB+KDEgPDwgKDcgLSBncGlvKSk7Ci0Jb3V0XzgoJnJlZ3MtPndrdXBfZGRyLCBjaGlwLT5zaGFkb3dfZGRyKTsKLQotCS8qIGFuZCBlbmFibGUgdGhlIHBpbiAqLwotCWNoaXAtPnNoYWRvd19ncGlvZSB8PSAxIDw8ICg3IC0gZ3Bpbyk7Ci0Jb3V0XzgoJnJlZ3MtPndrdXBfZ3Bpb2UsIGNoaXAtPnNoYWRvd19ncGlvZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1tcGM1Mnh4X3drdXBfZ3Bpb19kaXJfb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKLXsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYyA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7Ci0Jc3RydWN0IG1wYzUyeHhfZ3Bpb193a3VwIF9faW9tZW0gKnJlZ3MgPSBtbV9nYy0+cmVnczsKLQlzdHJ1Y3QgbXBjNTJ4eF9ncGlvY2hpcCAqY2hpcCA9IGNvbnRhaW5lcl9vZihtbV9nYywKLQkJCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwLCBtbWNoaXApOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7Ci0KLQlfX21wYzUyeHhfd2t1cF9ncGlvX3NldChnYywgZ3BpbywgdmFsKTsKLQotCS8qIFRoZW4gc2V0IGRpcmVjdGlvbiAqLwotCWNoaXAtPnNoYWRvd19kZHIgfD0gMSA8PCAoNyAtIGdwaW8pOwotCW91dF84KCZyZWdzLT53a3VwX2RkciwgY2hpcC0+c2hhZG93X2Rkcik7Ci0KLQkvKiBGaW5hbGx5IGVuYWJsZSB0aGUgcGluICovCi0JY2hpcC0+c2hhZG93X2dwaW9lIHw9IDEgPDwgKDcgLSBncGlvKTsKLQlvdXRfOCgmcmVncy0+d2t1cF9ncGlvZSwgY2hpcC0+c2hhZG93X2dwaW9lKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCi0JcHJfZGVidWcoIiVzOiBncGlvOiAlZCB2YWw6ICVkXG4iLCBfX2Z1bmNfXywgZ3BpbywgdmFsKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtcGM1Mnh4X3drdXBfZ3Bpb2NoaXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCi17Ci0Jc3RydWN0IG1wYzUyeHhfZ3Bpb2NoaXAgKmNoaXA7Ci0Jc3RydWN0IG1wYzUyeHhfZ3Bpb193a3VwIF9faW9tZW0gKnJlZ3M7Ci0Jc3RydWN0IGdwaW9fY2hpcCAqZ2M7Ci0JaW50IHJldDsKLQotCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwotCWlmICghY2hpcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlnYyA9ICZjaGlwLT5tbWNoaXAuZ2M7Ci0KLQlnYy0+bmdwaW8gICAgICAgICAgICA9IDg7Ci0JZ2MtPmRpcmVjdGlvbl9pbnB1dCAgPSBtcGM1Mnh4X3drdXBfZ3Bpb19kaXJfaW47Ci0JZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBtcGM1Mnh4X3drdXBfZ3Bpb19kaXJfb3V0OwotCWdjLT5nZXQgICAgICAgICAgICAgID0gbXBjNTJ4eF93a3VwX2dwaW9fZ2V0OwotCWdjLT5zZXQgICAgICAgICAgICAgID0gbXBjNTJ4eF93a3VwX2dwaW9fc2V0OwotCi0JcmV0ID0gb2ZfbW1fZ3Bpb2NoaXBfYWRkKG9mZGV2LT5kZXYub2Zfbm9kZSwgJmNoaXAtPm1tY2hpcCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJlZ3MgPSBjaGlwLT5tbWNoaXAucmVnczsKLQljaGlwLT5zaGFkb3dfZ3Bpb2UgPSBpbl84KCZyZWdzLT53a3VwX2dwaW9lKTsKLQljaGlwLT5zaGFkb3dfZGRyID0gaW5fOCgmcmVncy0+d2t1cF9kZHIpOwotCWNoaXAtPnNoYWRvd19kdm8gPSBpbl84KCZyZWdzLT53a3VwX2R2byk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtcGM1Mnh4X2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKLXsKLQlyZXR1cm4gLUVCVVNZOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1Mnh4X3drdXBfZ3Bpb2NoaXBfbWF0Y2hbXSA9IHsKLQl7Ci0JCS5jb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLWdwaW8td2t1cCIsCi0JfSwKLQl7fQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXBjNTJ4eF93a3VwX2dwaW9jaGlwX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJncGlvX3drdXAiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXBjNTJ4eF93a3VwX2dwaW9jaGlwX21hdGNoLAotCX0sCi0JLnByb2JlID0gbXBjNTJ4eF93a3VwX2dwaW9jaGlwX3Byb2JlLAotCS5yZW1vdmUgPSBtcGM1Mnh4X2dwaW9jaGlwX3JlbW92ZSwKLX07Ci0KLS8qCi0gKiBHUElPIExJQiBBUEkgaW1wbGVtZW50YXRpb24gZm9yIHNpbXBsZSBHUElPcwotICoKLSAqIFRoZXJlJ3MgYSBtYXhpbXVtIG9mIDMyIHNpbXBsZSBHUElPcy4gV2hpY2ggb2YgdGhlc2UgYXJlIGF2YWlsYWJsZQotICogZm9yIHVzZSBkZXBlbmRzIG9uIHlvdXIgYm9hcmQgc2V0dXAuCi0gKiBUaGUgbnVtYmVyaW5nIHJlZmxlY3RzIHRoZSBiaXQgbnVtYmVyaW5nIGluIHRoZSBwb3J0IHJlZ2lzdGVyczoKLSAqCi0gKiAgMC4uMSAgPiByZXNlcnZlZAotICogIDIuLjMgID4gSVJEQQotICogIDQuLjcgID4gRVRIUgotICogIDguLjExID4gcmVzZXJ2ZWQKLSAqIDEyLi4xNSA+IFVTQgotICogMTYuLjE3ID4gcmVzZXJ2ZWQKLSAqIDE4Li4yMyA+IFBTQzMKLSAqIDI0Li4yNyA+IFBTQzIKLSAqIDI4Li4zMSA+IFBTQzEKLSAqLwotc3RhdGljIGludCBtcGM1Mnh4X3NpbXBsZV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCi17Ci0Jc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOwotCXN0cnVjdCBtcGM1Mnh4X2dwaW8gX19pb21lbSAqcmVncyA9IG1tX2djLT5yZWdzOwotCXVuc2lnbmVkIGludCByZXQ7Ci0KLQlyZXQgPSAoaW5fYmUzMigmcmVncy0+c2ltcGxlX2l2YWwpID4+ICgzMSAtIGdwaW8pKSAmIDE7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9fbXBjNTJ4eF9zaW1wbGVfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQotewotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKLQlzdHJ1Y3QgbXBjNTJ4eF9ncGlvY2hpcCAqY2hpcCA9IGNvbnRhaW5lcl9vZihtbV9nYywKLQkJCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwLCBtbWNoaXApOwotCXN0cnVjdCBtcGM1Mnh4X2dwaW8gX19pb21lbSAqcmVncyA9IG1tX2djLT5yZWdzOwotCi0JaWYgKHZhbCkKLQkJY2hpcC0+c2hhZG93X2R2byB8PSAxIDw8ICgzMSAtIGdwaW8pOwotCWVsc2UKLQkJY2hpcC0+c2hhZG93X2R2byAmPSB+KDEgPDwgKDMxIC0gZ3BpbykpOwotCW91dF9iZTMyKCZyZWdzLT5zaW1wbGVfZHZvLCBjaGlwLT5zaGFkb3dfZHZvKTsKLX0KLQotc3RhdGljIHZvaWQKLW1wYzUyeHhfc2ltcGxlX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCi0JX19tcGM1Mnh4X3NpbXBsZV9ncGlvX3NldChnYywgZ3BpbywgdmFsKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCi0JcHJfZGVidWcoIiVzOiBncGlvOiAlZCB2YWw6ICVkXG4iLCBfX2Z1bmNfXywgZ3BpbywgdmFsKTsKLX0KLQotc3RhdGljIGludCBtcGM1Mnh4X3NpbXBsZV9ncGlvX2Rpcl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCi17Ci0Jc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOwotCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwICpjaGlwID0gY29udGFpbmVyX29mKG1tX2djLAotCQkJc3RydWN0IG1wYzUyeHhfZ3Bpb2NoaXAsIG1tY2hpcCk7Ci0Jc3RydWN0IG1wYzUyeHhfZ3BpbyBfX2lvbWVtICpyZWdzID0gbW1fZ2MtPnJlZ3M7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQotCS8qIHNldCB0aGUgZGlyZWN0aW9uICovCi0JY2hpcC0+c2hhZG93X2RkciAmPSB+KDEgPDwgKDMxIC0gZ3BpbykpOwotCW91dF9iZTMyKCZyZWdzLT5zaW1wbGVfZGRyLCBjaGlwLT5zaGFkb3dfZGRyKTsKLQotCS8qIGFuZCBlbmFibGUgdGhlIHBpbiAqLwotCWNoaXAtPnNoYWRvd19ncGlvZSB8PSAxIDw8ICgzMSAtIGdwaW8pOwotCW91dF9iZTMyKCZyZWdzLT5zaW1wbGVfZ3Bpb2UsIGNoaXAtPnNoYWRvd19ncGlvZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1tcGM1Mnh4X3NpbXBsZV9ncGlvX2Rpcl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQotewotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKLQlzdHJ1Y3QgbXBjNTJ4eF9ncGlvY2hpcCAqY2hpcCA9IGNvbnRhaW5lcl9vZihtbV9nYywKLQkJCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwLCBtbWNoaXApOwotCXN0cnVjdCBtcGM1Mnh4X2dwaW8gX19pb21lbSAqcmVncyA9IG1tX2djLT5yZWdzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7Ci0KLQkvKiBGaXJzdCBzZXQgaW5pdGlhbCB2YWx1ZSAqLwotCV9fbXBjNTJ4eF9zaW1wbGVfZ3Bpb19zZXQoZ2MsIGdwaW8sIHZhbCk7Ci0KLQkvKiBUaGVuIHNldCBkaXJlY3Rpb24gKi8KLQljaGlwLT5zaGFkb3dfZGRyIHw9IDEgPDwgKDMxIC0gZ3Bpbyk7Ci0Jb3V0X2JlMzIoJnJlZ3MtPnNpbXBsZV9kZHIsIGNoaXAtPnNoYWRvd19kZHIpOwotCi0JLyogRmluYWxseSBlbmFibGUgdGhlIHBpbiAqLwotCWNoaXAtPnNoYWRvd19ncGlvZSB8PSAxIDw8ICgzMSAtIGdwaW8pOwotCW91dF9iZTMyKCZyZWdzLT5zaW1wbGVfZ3Bpb2UsIGNoaXAtPnNoYWRvd19ncGlvZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQotCXByX2RlYnVnKCIlczogZ3BpbzogJWQgdmFsOiAlZFxuIiwgX19mdW5jX18sIGdwaW8sIHZhbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgbXBjNTJ4eF9zaW1wbGVfZ3Bpb2NoaXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCi17Ci0Jc3RydWN0IG1wYzUyeHhfZ3Bpb2NoaXAgKmNoaXA7Ci0Jc3RydWN0IGdwaW9fY2hpcCAqZ2M7Ci0Jc3RydWN0IG1wYzUyeHhfZ3BpbyBfX2lvbWVtICpyZWdzOwotCWludCByZXQ7Ci0KLQljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNoaXApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZ2MgPSAmY2hpcC0+bW1jaGlwLmdjOwotCi0JZ2MtPm5ncGlvICAgICAgICAgICAgPSAzMjsKLQlnYy0+ZGlyZWN0aW9uX2lucHV0ICA9IG1wYzUyeHhfc2ltcGxlX2dwaW9fZGlyX2luOwotCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gbXBjNTJ4eF9zaW1wbGVfZ3Bpb19kaXJfb3V0OwotCWdjLT5nZXQgICAgICAgICAgICAgID0gbXBjNTJ4eF9zaW1wbGVfZ3Bpb19nZXQ7Ci0JZ2MtPnNldCAgICAgICAgICAgICAgPSBtcGM1Mnh4X3NpbXBsZV9ncGlvX3NldDsKLQotCXJldCA9IG9mX21tX2dwaW9jaGlwX2FkZChvZmRldi0+ZGV2Lm9mX25vZGUsICZjaGlwLT5tbWNoaXApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZWdzID0gY2hpcC0+bW1jaGlwLnJlZ3M7Ci0JY2hpcC0+c2hhZG93X2dwaW9lID0gaW5fYmUzMigmcmVncy0+c2ltcGxlX2dwaW9lKTsKLQljaGlwLT5zaGFkb3dfZGRyID0gaW5fYmUzMigmcmVncy0+c2ltcGxlX2Rkcik7Ci0JY2hpcC0+c2hhZG93X2R2byA9IGluX2JlMzIoJnJlZ3MtPnNpbXBsZV9kdm8pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzUyeHhfc2ltcGxlX2dwaW9jaGlwX21hdGNoW10gPSB7Ci0JewotCQkuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1ncGlvIiwKLQl9LAotCXt9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtcGM1Mnh4X3NpbXBsZV9ncGlvY2hpcF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiZ3BpbyIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtcGM1Mnh4X3NpbXBsZV9ncGlvY2hpcF9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IG1wYzUyeHhfc2ltcGxlX2dwaW9jaGlwX3Byb2JlLAotCS5yZW1vdmUgPSBtcGM1Mnh4X2dwaW9jaGlwX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1wYzUyeHhfZ3Bpb19pbml0KHZvaWQpCi17Ci0JaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXBjNTJ4eF93a3VwX2dwaW9jaGlwX2RyaXZlcikpCi0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlZ2lzdGVyIHdha2V1cCBHUElPIGRyaXZlclxuIik7Ci0KLQlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtcGM1Mnh4X3NpbXBsZV9ncGlvY2hpcF9kcml2ZXIpKQotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBzaW1wbGUgR1BJTyBkcml2ZXJcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyogTWFrZSBzdXJlIHdlIGdldCBpbml0aWFsaXNlZCBiZWZvcmUgYW55b25lIGVsc2UgdHJpZXMgdG8gdXNlIHVzICovCi1zdWJzeXNfaW5pdGNhbGwobXBjNTJ4eF9ncGlvX2luaXQpOwotCi0vKiBObyBleGl0IGNhbGwgYXQgdGhlIG1vbWVudCBhcyB3ZSBjYW5ub3QgdW5yZWdpc3RlciBvZiBncGlvIGNoaXBzICovCi0KLU1PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIE1QQzUyeHggZ3BpbyBkcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jCmluZGV4IGRhMTEwYmQuLjVmNWU2OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jCkBAIC0yNjQsNyArMjY0LDcgQEAKIAkJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+ZmxhZ3MpOwogCQlvdXRfYmUzMigmcGNpX3JlZ3MtPml3MGJ0YXIsCiAJCSAgICAgICAgIE1QQzUyeHhfUENJX0lXQlRBUl9UUkFOU0xBVElPTihyZXMtPnN0YXJ0LCByZXMtPnN0YXJ0LAotCQkgICAgICAgICAgICAgICAgICByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKSk7CisJCQkJCQkJcmVzb3VyY2Vfc2l6ZShyZXMpKSk7CiAJCWl3Y3IwID0gTVBDNTJ4eF9QQ0lfSVdDUl9FTkFCTEUgfCBNUEM1Mnh4X1BDSV9JV0NSX01FTTsKIAkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKQogCQkJaXdjcjAgfD0gTVBDNTJ4eF9QQ0lfSVdDUl9SRUFEX01VTFRJOwpAQCAtMjc4LDcgKzI3OCw3IEBACiAJCSAgICAgICAgIHJlcy0+c3RhcnQsIHJlcy0+ZW5kLCByZXMtPmZsYWdzKTsKIAkJb3V0X2JlMzIoJnBjaV9yZWdzLT5pdzFidGFyLAogCQkgICAgICAgICBNUEM1Mnh4X1BDSV9JV0JUQVJfVFJBTlNMQVRJT04ocmVzLT5zdGFydCwgcmVzLT5zdGFydCwKLQkJICAgICAgICAgICAgICAgICAgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSkpOworCQkJCQkJCXJlc291cmNlX3NpemUocmVzKSkpOwogCQlpd2NyMSA9IE1QQzUyeHhfUENJX0lXQ1JfRU5BQkxFIHwgTVBDNTJ4eF9QQ0lfSVdDUl9NRU07CiAJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKIAkJCWl3Y3IxIHw9IE1QQzUyeHhfUENJX0lXQ1JfUkVBRF9NVUxUSTsKQEAgLTMwMCw3ICszMDAsNyBAQAogCW91dF9iZTMyKCZwY2lfcmVncy0+aXcyYnRhciwKIAkgICAgICAgICBNUEM1Mnh4X1BDSV9JV0JUQVJfVFJBTlNMQVRJT04oaG9zZS0+aW9fYmFzZV9waHlzLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMtPnN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKSk7CisJCQkJCQlyZXNvdXJjZV9zaXplKHJlcykpKTsKIAlpd2NyMiA9IE1QQzUyeHhfUENJX0lXQ1JfRU5BQkxFIHwgTVBDNTJ4eF9QQ0lfSVdDUl9JTzsKIAogCS8qIFNldCBhbGwgdGhlIElXQ1IgZmllbGRzIGF0IG9uY2U7IHRoZXkncmUgaW4gdGhlIHNhbWUgcmVnICovCkBAIC00MDIsNyArNDAyLDcgQEAKIAogCWhvc2UtPm9wcyA9ICZtcGM1Mnh4X3BjaV9vcHM7CiAKLQlwY2lfcmVncyA9IGlvcmVtYXAocnNyYy5zdGFydCwgcnNyYy5lbmQgLSByc3JjLnN0YXJ0ICsgMSk7CisJcGNpX3JlZ3MgPSBpb3JlbWFwKHJzcmMuc3RhcnQsIHJlc291cmNlX3NpemUoJnJzcmMpKTsKIAlpZiAoIXBjaV9yZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L2ttODN4eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L2ttODN4eC5jCmluZGV4IGEyYjliOWUuLmY4ZmEyZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9rbTgzeHguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgva204M3h4LmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCQkJCQlfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuOwogCQkJfQotCQkJYmFzZSA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXMuZW5kIC0gcmVzLnN0YXJ0ICsgMSk7CisJCQliYXNlID0gaW9yZW1hcChyZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJnJlcykpOwogCiAJCQkvKgogCQkJICogSU1NUiArIDB4MTRBOFs0OjVdID0gMTEgKGNsayBkZWxheSBmb3IgVUNDIDIpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jCmluZGV4IGVjMGI0MDFiLi45M2U2MGYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYwpAQCAtNjgsNyArNjgsNyBAQAogCQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwogCiAJCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOwotCQliY3NyX3JlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzLmVuZCAtIHJlcy5zdGFydCArMSk7CisJCWJjc3JfcmVncyA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZXMpKTsKIAkJb2Zfbm9kZV9wdXQobnApOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9tZHMuYwppbmRleCBkMGE2MzRiLi5jMWIxZGM1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9tZHMuYwpAQCAtNTMsNyArNTMsNyBAQAogCQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwogCiAJCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOwotCQliY3NyX3JlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzLmVuZCAtIHJlcy5zdGFydCArIDEpOworCQliY3NyX3JlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CiAJCW9mX25vZGVfcHV0KG5wKTsKIAl9CiAJaWYgKCFiY3NyX3JlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X21kcy5jCmluZGV4IDA5ZTlkNmYuLjgxYzA1MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X21kcy5jCkBAIC03Niw3ICs3Niw3IEBACiAJCXN0cnVjdCByZXNvdXJjZSByZXM7CiAKIAkJb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7Ci0JCWJjc3JfcmVncyA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXMuZW5kIC0gcmVzLnN0YXJ0ICsxKTsKKwkJYmNzcl9yZWdzID0gaW9yZW1hcChyZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJnJlcykpOwogCQlvZl9ub2RlX3B1dChucCk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMKaW5kZXggMmM2NDE2NC4uMWFkNzQ4YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3VzYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC91c2IuYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJCW9mX25vZGVfcHV0KG5wKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JdXNiX3JlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzLmVuZCAtIHJlcy5zdGFydCArIDEpOworCXVzYl9yZWdzID0gaW9yZW1hcChyZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJnJlcykpOwogCiAJLyogVXNpbmcgb24tY2hpcCBQSFkgKi8KIAlpZiAocHJvcCAmJiAoIXN0cmNtcChwcm9wLCAidXRtaV93aWRlIikgfHwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcKaW5kZXggYjY5NzZlMS4uNDk4NTM0YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcKQEAgLTY3LDYgKzY3LDE2IEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTVBDODV4eCBSREIgKFAyMDIwIFJEQikgYm9hcmQKIAorY29uZmlnIFAxMDEwX1JEQgorCWJvb2wgIkZyZWVzY2FsZSBQMTAxMFJEQiIKKwlzZWxlY3QgREVGQVVMVF9VSU1BR0UKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM4NXh4IFJEQiAoUDEwMTAgUkRCKSBib2FyZAorCisJICBQMTAxMFJEQiBjb250YWlucyBQMTAxMFNpLCB3aGljaCBwcm92aWRlcyBDUFUgcGVyZm9ybWFuY2UgdXAgdG8gODAwCisJICBNSHogYW5kIDE2MDAgRE1JUFMsIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBhbmQgZmFzdGVyIGludGVyZmFjZXMKKwkgIChERFIzLzNMLCBTQVRBIElJLCBhbmQgUENJICBFeHByZXNzKS4KKwogY29uZmlnIFAxMDIyX0RTCiAJYm9vbCAiRnJlZXNjYWxlIFAxMDIyIERTIgogCXNlbGVjdCBERUZBVUxUX1VJTUFHRQpAQCAtNzUsNiArODUsMTIgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgUDEwMjJEUyByZWZlcmVuY2UgYm9hcmQuCiAKK2NvbmZpZyBQMTAyM19SRFMKKwlib29sICJGcmVlc2NhbGUgUDEwMjMgUkRTIgorCXNlbGVjdCBERUZBVUxUX1VJTUFHRQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFAxMDIzIFJEUyBib2FyZAorCiBjb25maWcgU09DUkFURVMKIAlib29sICJTb2NyYXRlcyIKIAlzZWxlY3QgREVGQVVMVF9VSU1BR0UKQEAgLTE1NSw2ICsxNzEsMTggQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBXaW5kIFJpdmVyIFNCQzg1NjAgYm9hcmQKIAorY29uZmlnIFAyMDQwX1JEQgorCWJvb2wgIkZyZWVzY2FsZSBQMjA0MCBSREIiCisJc2VsZWN0IERFRkFVTFRfVUlNQUdFCisJc2VsZWN0IFBQQ19FNTAwTUMKKwlzZWxlY3QgUEhZU182NEJJVAorCXNlbGVjdCBTV0lPVExCCisJc2VsZWN0IE1QQzh4eHhfR1BJTworCXNlbGVjdCBIQVNfUkFQSURJTworCXNlbGVjdCBQUENfRVBBUFJfSFZfUElDCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUDIwNDAgUkRCIGJvYXJkCisKIGNvbmZpZyBQMzA0MV9EUwogCWJvb2wgIkZyZWVzY2FsZSBQMzA0MSBEUyIKIAlzZWxlY3QgREVGQVVMVF9VSU1BR0UKQEAgLTE2Myw2ICsxOTEsNyBAQAogCXNlbGVjdCBTV0lPVExCCiAJc2VsZWN0IE1QQzh4eHhfR1BJTwogCXNlbGVjdCBIQVNfUkFQSURJTworCXNlbGVjdCBQUENfRVBBUFJfSFZfUElDCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUDMwNDEgRFMgYm9hcmQKIApAQCAtMTc0LDYgKzIwMyw3IEBACiAJc2VsZWN0IFNXSU9UTEIKIAlzZWxlY3QgTVBDOHh4eF9HUElPCiAJc2VsZWN0IEhBU19SQVBJRElPCisJc2VsZWN0IFBQQ19FUEFQUl9IVl9QSUMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBQNDA4MCBEUyBib2FyZAogCkBAIC0xODgsNiArMjE4LDcgQEAKIAlzZWxlY3QgU1dJT1RMQgogCXNlbGVjdCBNUEM4eHh4X0dQSU8KIAlzZWxlY3QgSEFTX1JBUElESU8KKwlzZWxlY3QgUFBDX0VQQVBSX0hWX1BJQwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFA1MDIwIERTIGJvYXJkCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZQppbmRleCBkZDcwZGI3Li5hOTcxYjMyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCkBAIC0xMCw3ICsxMCwxMCBAQAogb2JqLSQoQ09ORklHX01QQzg1eHhfRFMpICArPSBtcGM4NXh4X2RzLm8KIG9iai0kKENPTkZJR19NUEM4NXh4X01EUykgKz0gbXBjODV4eF9tZHMubwogb2JqLSQoQ09ORklHX01QQzg1eHhfUkRCKSArPSBtcGM4NXh4X3JkYi5vCitvYmotJChDT05GSUdfUDEwMTBfUkRCKSAgICs9IHAxMDEwcmRiLm8KIG9iai0kKENPTkZJR19QMTAyMl9EUykgICAgKz0gcDEwMjJfZHMubworb2JqLSQoQ09ORklHX1AxMDIzX1JEUykgICArPSBwMTAyM19yZHMubworb2JqLSQoQ09ORklHX1AyMDQwX1JEQikgICArPSBwMjA0MF9yZGIubyBjb3JlbmV0X2RzLm8KIG9iai0kKENPTkZJR19QMzA0MV9EUykgICAgKz0gcDMwNDFfZHMubyBjb3JlbmV0X2RzLm8KIG9iai0kKENPTkZJR19QNDA4MF9EUykgICAgKz0gcDQwODBfZHMubyBjb3JlbmV0X2RzLm8KIG9iai0kKENPTkZJR19QNTAyMF9EUykgICAgKz0gcDUwMjBfZHMubyBjb3JlbmV0X2RzLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb3JlbmV0X2RzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29yZW5ldF9kcy5jCmluZGV4IDJhYjMzOGMuLjgwMmFkMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb3JlbmV0X2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2NvcmVuZXRfZHMuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBNYWludGFpbmVkIGJ5IEt1bWFyIEdhbGEgKHNlZSBNQUlOVEFJTkVSUyBmb3IgY29udGFjdCBpbmZvcm1hdGlvbikKICAqCi0gKiBDb3B5cmlnaHQgMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOS0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CiAjaW5jbHVkZSA8bW0vbW11X2RlY2wuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS91ZGJnLmg+CkBAIC02MSwxMCArNjIsNiBAQAogCW1waWNfaW5pdChtcGljKTsKIH0KIAotI2lmZGVmIENPTkZJR19QQ0kKLXN0YXRpYyBpbnQgcHJpbWFyeV9waGJfYWRkcjsKLSNlbmRpZgotCiAvKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQogICovCkBAIC04NSwxOCArODIsMTkgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSQotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wscDQwODAtcGNpZSIpIHsKLQkJc3RydWN0IHJlc291cmNlIHJzcmM7Ci0JCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyc3JjKTsKLQkJaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gcHJpbWFyeV9waGJfYWRkcikKLQkJCWZzbF9hZGRfYnJpZGdlKG5wLCAxKTsKLQkJZWxzZQorCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgInBjaSIpIHsKKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLHA0MDgwLXBjaWUiKSB8fAorCQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wscW9yaXEtcGNpZS12Mi4yIikpIHsKIAkJCWZzbF9hZGRfYnJpZGdlKG5wLCAwKTsKLQotCQlob3NlID0gcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKG5wKTsKLQkJbWF4ID0gbWluKG1heCwgaG9zZS0+ZG1hX3dpbmRvd19iYXNlX2N1ciArCi0JCQkJaG9zZS0+ZG1hX3dpbmRvd19zaXplKTsKKwkJCWhvc2UgPSBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2UobnApOworCQkJbWF4ID0gbWluKG1heCwgaG9zZS0+ZG1hX3dpbmRvd19iYXNlX2N1ciArCisJCQkJCWhvc2UtPmRtYV93aW5kb3dfc2l6ZSk7CisJCX0KIAl9CisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwlwY2lfZGV2c19waGJfaW5pdCgpOworI2VuZGlmCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TV0lPVExCCkBAIC0xMTYsNiArMTE0LDE5IEBACiAJewogCQkuY29tcGF0aWJsZQk9ICJmc2wscmFwaWRpby1kZWx0YSIsCiAJfSwKKwl7CisJCS5jb21wYXRpYmxlCT0gImZzbCxwNDA4MC1wY2llIiwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUJPSAiZnNsLHFvcmlxLXBjaWUtdjIuMiIsCisJfSwKKwkvKiBUaGUgZm9sbG93aW5nIHR3byBhcmUgZm9yIHRoZSBGcmVlc2NhbGUgaHlwZXJ2aXNvciAqLworCXsKKwkJLm5hbWUJCT0gImh5cGVydmlzb3IiLAorCX0sCisJeworCQkubmFtZQkJPSAiaGFuZGxlcyIsCisJfSwKIAl7fQogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2RzLmMKaW5kZXggYzdiOTdmNy4uMWI5YThjZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9kcy5jCkBAIC04Myw3ICs4Myw4IEBACiAJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLE1QQzg1NzJEUy1DQU1QIikpIHsKIAkJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfAotCQkJTVBJQ19CSUdfRU5ESUFOIHwgTVBJQ19CUk9LRU5fRlJSX05JUlFTLAorCQkJTVBJQ19CSUdfRU5ESUFOIHwgTVBJQ19CUk9LRU5fRlJSX05JUlFTIHwKKwkJCU1QSUNfU0lOR0xFX0RFU1RfQ1BVLAogCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCX0gZWxzZSB7CiAJCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9yZGIuYwppbmRleCAwODhmMzBiLi5mNWZmOTExIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9yZGIuYwpAQCAtNTgsMTAgKzU4LDExIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsODVYWFJEQi1DQU1QIikpIHsKKwlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsTVBDODVYWFJEQi1DQU1QIikpIHsKIAkJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfAotCQkJTVBJQ19CSUdfRU5ESUFOIHwgTVBJQ19CUk9LRU5fRlJSX05JUlFTLAorCQkJTVBJQ19CSUdfRU5ESUFOIHwgTVBJQ19CUk9LRU5fRlJSX05JUlFTIHwKKwkJCU1QSUNfU0lOR0xFX0RFU1RfQ1BVLAogCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCX0gZWxzZSB7CiAJCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDEwcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMTByZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzM4N2ZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDEwcmRiLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBQMTAxMFJEQiBCb2FyZCBTZXR1cAorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8bW0vbW11X2RlY2wuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL21waWMuaD4KKworI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKwordm9pZCBfX2luaXQgcDEwMTBfcmRiX3BpY19pbml0KHZvaWQpCit7CisJc3RydWN0IG1waWMgKm1waWM7CisJc3RydWN0IHJlc291cmNlIHI7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm9wZW4tcGljIik7CisJaWYgKG5wID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBvcGVuLXBpYyBub2RlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIG1waWMgcmVnaXN0ZXIgc3BhY2VcbiIpOworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybjsKKwl9CisKKwltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwgTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8CisJICBNUElDX0JJR19FTkRJQU4gfCBNUElDX0JST0tFTl9GUlJfTklSUVMgfCBNUElDX1NJTkdMRV9ERVNUX0NQVSwKKwkgIDAsIDI1NiwgIiBPcGVuUElDICAiKTsKKworCUJVR19PTihtcGljID09IE5VTEwpOworCW9mX25vZGVfcHV0KG5wKTsKKworCW1waWNfaW5pdChtcGljKTsKKworfQorCisKKy8qCisgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwMTAxMF9yZGJfc2V0dXBfYXJjaCh2b2lkKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworI2VuZGlmCisKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoInAxMDEwX3JkYl9zZXR1cF9hcmNoKCkiLCAwKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKwlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSB7CisJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxwMTAxMC1wY2llIikpCisJCQlmc2xfYWRkX2JyaWRnZShucCwgMCk7CisJfQorCisjZW5kaWYKKworCXByaW50ayhLRVJOX0lORk8gIlAxMDEwIFJEQiBib2FyZCBmcm9tIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBwMTAxMHJkYl9pZHNbXSA9IHsKKwl7IC50eXBlID0gInNvYyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCisJe30sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwMTAxMHJkYl9wdWJsaXNoX2RldmljZXModm9pZCkKK3sKKwlyZXR1cm4gb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIHAxMDEwcmRiX2lkcywgTlVMTCk7Cit9CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChwMTAxMF9yZGIsIHAxMDEwcmRiX3B1Ymxpc2hfZGV2aWNlcyk7CittYWNoaW5lX2FyY2hfaW5pdGNhbGwocDEwMTBfcmRiLCBzd2lvdGxiX3NldHVwX2J1c19ub3RpZmllcik7CisKKy8qCisgKiBDYWxsZWQgdmVyeSBlYXJseSwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKKyAqLworc3RhdGljIGludCBfX2luaXQgcDEwMTBfcmRiX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOworCisJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFAxMDEwUkRCIikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitkZWZpbmVfbWFjaGluZShwMTAxMF9yZGIpIHsKKwkubmFtZQkJCT0gIlAxMDEwIFJEQiIsCisJLnByb2JlCQkJPSBwMTAxMF9yZGJfcHJvYmUsCisJLnNldHVwX2FyY2gJCT0gcDEwMTBfcmRiX3NldHVwX2FyY2gsCisJLmluaXRfSVJRCQk9IHAxMDEwX3JkYl9waWNfaW5pdCwKKyNpZmRlZiBDT05GSUdfUENJCisJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorI2VuZGlmCisJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAorCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LAorCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyMl9kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKaW5kZXggN2ViNWM0MC4uMjY2YjNhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKQEAgLTEyOSw2ICsxMjksNyBAQAogc3RhdGljIHZvaWQgcDEwMjJkc19zZXRfbW9uaXRvcl9wb3J0KGludCBtb25pdG9yX3BvcnQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpwaXhpc19ub2RlOworCXZvaWQgX19pb21lbSAqcGl4aXM7CiAJdTggX19pb21lbSAqYnJkY2ZnMTsKIAogCXBpeGlzX25vZGUgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLHAxMDIyZHMtcGl4aXMiKTsKQEAgLTEzNywxMiArMTM4LDEyIEBACiAJCXJldHVybjsKIAl9CiAKLQlicmRjZmcxID0gb2ZfaW9tYXAocGl4aXNfbm9kZSwgMCk7Ci0JaWYgKCFicmRjZmcxKSB7CisJcGl4aXMgPSBvZl9pb21hcChwaXhpc19ub2RlLCAwKTsKKwlpZiAoIXBpeGlzKSB7CiAJCXByX2VycigicDEwMjJkczogY291bGQgbm90IG1hcCBuZ1BJWElTIHJlZ2lzdGVyc1xuIik7CiAJCXJldHVybjsKIAl9Ci0JYnJkY2ZnMSArPSA5OwkvKiBCUkRDRkcxIGlzIGF0IG9mZnNldCA5IGluIHRoZSBuZ1BJWElTICovCisJYnJkY2ZnMSA9IHBpeGlzICsgOTsJLyogQlJEQ0ZHMSBpcyBhdCBvZmZzZXQgOSBpbiB0aGUgbmdQSVhJUyAqLwogCiAJc3dpdGNoIChtb25pdG9yX3BvcnQpIHsKIAljYXNlIDA6IC8qIERWSSAqLwpAQCAtMTU4LDYgKzE1OSw4IEBACiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJwMTAyMmRzOiB1bnN1cHBvcnRlZCBtb25pdG9yIHBvcnQgJWlcbiIsIG1vbml0b3JfcG9ydCk7CiAJfQorCisJaW91bm1hcChwaXhpcyk7CiB9CiAKIC8qKgpAQCAtMTkyLDggKzE5NSwxMyBAQAogCWRvX2Rpdih0ZW1wLCBwaXhjbG9jayk7CiAJZnJlcSA9IHRlbXA7CiAKLQkvKiBwaXhjbGsgaXMgdGhlIHJhdGlvIG9mIHRoZSBwbGF0Zm9ybSBjbG9jayB0byB0aGUgcGl4ZWwgY2xvY2sgKi8KKwkvKgorCSAqICdweGNsaycgaXMgdGhlIHJhdGlvIG9mIHRoZSBwbGF0Zm9ybSBjbG9jayB0byB0aGUgcGl4ZWwgY2xvY2suCisJICogVGhpcyBudW1iZXIgaXMgcHJvZ3JhbW1lZCBpbnRvIHRoZSBDTEtEVkRSIHJlZ2lzdGVyLCBhbmQgdGhlIHZhbGlkCisJICogcmFuZ2Ugb2YgdmFsdWVzIGlzIDItMjU1LgorCSAqLwogCXB4Y2xrID0gRElWX1JPVU5EX0NMT1NFU1QoZnNsX2dldF9zeXNfZnJlcSgpLCBmcmVxKTsKKwlweGNsayA9IGNsYW1wX3QodTMyLCBweGNsaywgMiwgMjU1KTsKIAogCS8qIERpc2FibGUgdGhlIHBpeGVsIGNsb2NrLCBhbmQgc2V0IGl0IHRvIG5vbi1pbnZlcnRlZCBhbmQgbm8gZGVsYXkgKi8KIAljbHJiaXRzMzIoJmd1dHMtPmNsa2R2ZHIsCkBAIC0yMDEsNiArMjA5LDggQEAKIAogCS8qIEVuYWJsZSB0aGUgY2xvY2sgYW5kIHNldCB0aGUgcHhjbGsgKi8KIAlzZXRiaXRzMzIoJmd1dHMtPmNsa2R2ZHIsIENMS0RWRFJfUFhDS0VOIHwgKHB4Y2xrIDw8IDE2KSk7CisKKwlpb3VubWFwKGd1dHMpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyM19yZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyM19yZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzVlMGIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIzX3Jkcy5jCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTAtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIEF1dGhvcjogUm95IFphbmcgPHRpZS1mZWkuemFuZ0BmcmVlc2NhbGUuY29tPgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUDEwMjMgUkRTIEJvYXJkIFNldHVwCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8bW0vbW11X2RlY2wuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL21waWMuaD4KKworI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQorICoKKyAqLworI2lmZGVmIENPTkZJR19TTVAKK3ZvaWQgX19pbml0IG1wYzg1eHhfc21wX2luaXQodm9pZCk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfcmRzX3NldHVwX2FyY2godm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJaWYgKHBwY19tZC5wcm9ncmVzcykKKwkJcHBjX21kLnByb2dyZXNzKCJwMTAyM19yZHNfc2V0dXBfYXJjaCgpIiwgMCk7CisKKwkvKiBNYXAgQkNTUiBhcmVhICovCisJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiYmNzciIpOworCWlmIChucCAhPSBOVUxMKSB7CisJCXN0YXRpYyB1OCBfX2lvbWVtICpiY3NyX3JlZ3M7CisKKwkJYmNzcl9yZWdzID0gb2ZfaW9tYXAobnAsIDApOworCQlvZl9ub2RlX3B1dChucCk7CisKKwkJaWYgKCFiY3NyX3JlZ3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJCQ1NSOiBGYWlsZWQgdG8gbWFwIGJjc3IgcmVnaXN0ZXIgc3BhY2VcbiIpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworI2RlZmluZSBCQ1NSMTVfSTJDX0JVUzBfU0VHX0NMUgkJMHgwNworI2RlZmluZSBCQ1NSMTVfSTJDX0JVUzBfU0VHMgkJMHgwMgorLyoKKyAqIE5vdGU6IEFjY2Vzc2luZyBleGNsdXNpdmVseSBpMmMgZGV2aWNlcy4KKyAqCisgKiBUaGUgaTJjIGNvbnRyb2xsZXIgc2VsZWN0cyBpbml0aWFsbHkgSUQgRUVQUk9NIGluIHRoZSB1LWJvb3Q7CisgKiBidXQgaWYgbWVudSBjb25maWd1cmF0aW9uIHNlbGVjdHMgUlRDIHN1cHBvcnQgaW4gdGhlIGtlcm5lbCwKKyAqIHRoZSBpMmMgY29udHJvbGxlciBzd2l0Y2hlcyB0byBzZWxlY3QgUlRDIGNoaXAgaW4gdGhlIGtlcm5lbC4KKyAqLworI2lmZGVmIENPTkZJR19SVENfQ0xBU1MKKwkJCS8qIEVuYWJsZSBSVEMgY2hpcCBvbiB0aGUgc2VnbWVudCAjMiBvZiBpMmMgKi8KKwkJCWNscmJpdHM4KCZiY3NyX3JlZ3NbMTVdLCBCQ1NSMTVfSTJDX0JVUzBfU0VHX0NMUik7CisJCQlzZXRiaXRzOCgmYmNzcl9yZWdzWzE1XSwgQkNTUjE1X0kyQ19CVVMwX1NFRzIpOworI2VuZGlmCisKKwkJCWlvdW5tYXAoYmNzcl9yZWdzKTsKKwkJfQorCX0KKworI2lmZGVmIENPTkZJR19QQ0kKKwlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsICJwY2kiLCAiZnNsLHAxMDIzLXBjaWUiKQorCQlmc2xfYWRkX2JyaWRnZShucCwgMCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TTVAKKwltcGM4NXh4X3NtcF9pbml0KCk7CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcDEwMjNfaWRzW10gPSB7CisJeyAudHlwZSA9ICJzb2MiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAic29jIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAorCXt9LAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBwMTAyM19wdWJsaXNoX2RldmljZXModm9pZCkKK3sKKwlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgcDEwMjNfaWRzLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCittYWNoaW5lX2RldmljZV9pbml0Y2FsbChwMTAyM19yZHMsIHAxMDIzX3B1Ymxpc2hfZGV2aWNlcyk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM4NXh4X3Jkc19waWNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBtcGljICptcGljOworCXN0cnVjdCByZXNvdXJjZSByOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCisJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAib3Blbi1waWMiKTsKKwlpZiAoIW5wKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGZpbmQgb3Blbi1waWMgbm9kZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG1hcCBtcGljIHJlZ2lzdGVyIHNwYWNlXG4iKTsKKwkJb2Zfbm9kZV9wdXQobnApOworCQlyZXR1cm47CisJfQorCisJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCisJCU1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4gfAorCQlNUElDX0JST0tFTl9GUlJfTklSUVMgfCBNUElDX1NJTkdMRV9ERVNUX0NQVSwKKwkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOworCisJQlVHX09OKG1waWMgPT0gTlVMTCk7CisJb2Zfbm9kZV9wdXQobnApOworCisJbXBpY19pbml0KG1waWMpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwMTAyM19yZHNfcHJvYmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisKKwlyZXR1cm4gb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsUDEwMjNSRFMiKTsKKworfQorCitkZWZpbmVfbWFjaGluZShwMTAyM19yZHMpIHsKKwkubmFtZQkJCT0gIlAxMDIzIFJEUyIsCisJLnByb2JlCQkJPSBwMTAyM19yZHNfcHJvYmUsCisJLnNldHVwX2FyY2gJCT0gbXBjODV4eF9yZHNfc2V0dXBfYXJjaCwKKwkuaW5pdF9JUlEJCT0gbXBjODV4eF9yZHNfcGljX2luaXQsCisJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAorCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LAorCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAorI2lmZGVmIENPTkZJR19QQ0kKKwkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisjZW5kaWYKK307CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMjA0MF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMjA0MF9yZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmI1NmFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AyMDQwX3JkYi5jCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBQMjA0MCBSREIgU2V0dXAKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxtbS9tbXVfZGVjbC5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vbXBpYy5oPgorCisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CisjaW5jbHVkZSA8YXNtL2Vodl9waWMuaD4KKworI2luY2x1ZGUgImNvcmVuZXRfZHMuaCIKKworLyoKKyAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAorICovCitzdGF0aWMgaW50IF9faW5pdCBwMjA0MF9yZGJfcHJvYmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisjaWZkZWYgQ09ORklHX1NNUAorCWV4dGVybiBzdHJ1Y3Qgc21wX29wc190IHNtcF84NXh4X29wczsKKyNlbmRpZgorCisJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFAyMDQwUkRCIikpCisJCXJldHVybiAxOworCisJLyogQ2hlY2sgaWYgd2UncmUgcnVubmluZyB1bmRlciB0aGUgRnJlZXNjYWxlIGh5cGVydmlzb3IgKi8KKwlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsUDIwNDBSREItaHYiKSkgeworCQlwcGNfbWQuaW5pdF9JUlEgPSBlaHZfcGljX2luaXQ7CisJCXBwY19tZC5nZXRfaXJxID0gZWh2X3BpY19nZXRfaXJxOworCQlwcGNfbWQucmVzdGFydCA9IGZzbF9odl9yZXN0YXJ0OworCQlwcGNfbWQucG93ZXJfb2ZmID0gZnNsX2h2X2hhbHQ7CisJCXBwY19tZC5oYWx0ID0gZnNsX2h2X2hhbHQ7CisjaWZkZWYgQ09ORklHX1NNUAorCQkvKgorCQkgKiBEaXNhYmxlIHRoZSB0aW1lYmFzZSBzeW5jIG9wZXJhdGlvbnMgYmVjYXVzZSB3ZSBjYW4ndCB3cml0ZQorCQkgKiB0byB0aGUgdGltZWJhc2UgcmVnaXN0ZXJzIHVuZGVyIHRoZSBoeXBlcnZpc29yLgorCQkgICovCisJCXNtcF84NXh4X29wcy5naXZlX3RpbWViYXNlID0gTlVMTDsKKwkJc21wXzg1eHhfb3BzLnRha2VfdGltZWJhc2UgPSBOVUxMOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitkZWZpbmVfbWFjaGluZShwMjA0MF9yZGIpIHsKKwkubmFtZQkJCT0gIlAyMDQwIFJEQiIsCisJLnByb2JlCQkJPSBwMjA0MF9yZGJfcHJvYmUsCisJLnNldHVwX2FyY2gJCT0gY29yZW5ldF9kc19zZXR1cF9hcmNoLAorCS5pbml0X0lSUQkJPSBjb3JlbmV0X2RzX3BpY19pbml0LAorI2lmZGVmIENPTkZJR19QQ0kKKwkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisjZW5kaWYKKwkuZ2V0X2lycQkJPSBtcGljX2dldF9jb3JlaW50X2lycSwKKwkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKKwkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKKwkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKKwkucG93ZXJfc2F2ZQkJPSBlNTAwX2lkbGUsCit9OworCittYWNoaW5lX2RldmljZV9pbml0Y2FsbChwMjA0MF9yZGIsIGNvcmVuZXRfZHNfcHVibGlzaF9kZXZpY2VzKTsKKworI2lmZGVmIENPTkZJR19TV0lPVExCCittYWNoaW5lX2FyY2hfaW5pdGNhbGwocDIwNDBfcmRiLCBzd2lvdGxiX3NldHVwX2J1c19ub3RpZmllcik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMzA0MV9kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AzMDQxX2RzLmMKaW5kZXggMGVkNTJlMS4uOTZkOTlhMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AzMDQxX2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AzMDQxX2RzLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlIDxhc20vZWh2X3BpYy5oPgogCiAjaW5jbHVkZSAiY29yZW5ldF9kcy5oIgogCkBAIC0zOSw4ICs0MCwzMiBAQAogc3RhdGljIGludCBfX2luaXQgcDMwNDFfZHNfcHJvYmUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisjaWZkZWYgQ09ORklHX1NNUAorCWV4dGVybiBzdHJ1Y3Qgc21wX29wc190IHNtcF84NXh4X29wczsKKyNlbmRpZgogCi0JcmV0dXJuIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFAzMDQxRFMiKTsKKwlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsUDMwNDFEUyIpKQorCQlyZXR1cm4gMTsKKworCS8qIENoZWNrIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgdGhlIEZyZWVzY2FsZSBoeXBlcnZpc29yICovCisJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFAzMDQxRFMtaHYiKSkgeworCQlwcGNfbWQuaW5pdF9JUlEgPSBlaHZfcGljX2luaXQ7CisJCXBwY19tZC5nZXRfaXJxID0gZWh2X3BpY19nZXRfaXJxOworCQlwcGNfbWQucmVzdGFydCA9IGZzbF9odl9yZXN0YXJ0OworCQlwcGNfbWQucG93ZXJfb2ZmID0gZnNsX2h2X2hhbHQ7CisJCXBwY19tZC5oYWx0ID0gZnNsX2h2X2hhbHQ7CisjaWZkZWYgQ09ORklHX1NNUAorCQkvKgorCQkgKiBEaXNhYmxlIHRoZSB0aW1lYmFzZSBzeW5jIG9wZXJhdGlvbnMgYmVjYXVzZSB3ZSBjYW4ndCB3cml0ZQorCQkgKiB0byB0aGUgdGltZWJhc2UgcmVnaXN0ZXJzIHVuZGVyIHRoZSBoeXBlcnZpc29yLgorCQkgICovCisJCXNtcF84NXh4X29wcy5naXZlX3RpbWViYXNlID0gTlVMTDsKKwkJc21wXzg1eHhfb3BzLnRha2VfdGltZWJhc2UgPSBOVUxMOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOwogfQogCiBkZWZpbmVfbWFjaGluZShwMzA0MV9kcykgewpAQCAtNTUsNiArODAsNyBAQAogCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LAogCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAogCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAorCS5wb3dlcl9zYXZlCQk9IGU1MDBfaWRsZSwKIH07CiAKIG1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHAzMDQxX2RzLCBjb3JlbmV0X2RzX3B1Ymxpc2hfZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDQwODBfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wNDA4MF9kcy5jCmluZGV4IDg0MTcwNDYuLmQxYjIxZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wNDA4MF9kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wNDA4MF9kcy5jCkBAIC0yOSwzMSArMjksNDIgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlIDxhc20vZWh2X3BpYy5oPgogCiAjaW5jbHVkZSAiY29yZW5ldF9kcy5oIgogCi0jaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIGludCBwcmltYXJ5X3BoYl9hZGRyOwotI2VuZGlmCi0KIC8qCiAgKiBDYWxsZWQgdmVyeSBlYXJseSwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKICAqLwogc3RhdGljIGludCBfX2luaXQgcDQwODBfZHNfcHJvYmUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisjaWZkZWYgQ09ORklHX1NNUAorCWV4dGVybiBzdHJ1Y3Qgc21wX29wc190IHNtcF84NXh4X29wczsKKyNlbmRpZgogCi0JaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFA0MDgwRFMiKSkgewotI2lmZGVmIENPTkZJR19QQ0kKLQkJLyogdHJlYXQgUENJZTEgYXMgcHJpbWFyeSwKLQkJICogc2hvdWxkbid0IG1hdHRlciBhcyB3ZSBoYXZlIG5vIElTQSBvbiB0aGUgYm9hcmQKLQkJICovCi0JCXByaW1hcnlfcGhiX2FkZHIgPSAweDAwMDA7CisJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFA0MDgwRFMiKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBDaGVjayBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIHRoZSBGcmVlc2NhbGUgaHlwZXJ2aXNvciAqLworCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxQNDA4MERTLWh2IikpIHsKKwkJcHBjX21kLmluaXRfSVJRID0gZWh2X3BpY19pbml0OworCQlwcGNfbWQuZ2V0X2lycSA9IGVodl9waWNfZ2V0X2lycTsKKwkJcHBjX21kLnJlc3RhcnQgPSBmc2xfaHZfcmVzdGFydDsKKwkJcHBjX21kLnBvd2VyX29mZiA9IGZzbF9odl9oYWx0OworCQlwcGNfbWQuaGFsdCA9IGZzbF9odl9oYWx0OworI2lmZGVmIENPTkZJR19TTVAKKwkJLyoKKwkJICogRGlzYWJsZSB0aGUgdGltZWJhc2Ugc3luYyBvcGVyYXRpb25zIGJlY2F1c2Ugd2UgY2FuJ3Qgd3JpdGUKKwkJICogdG8gdGhlIHRpbWViYXNlIHJlZ2lzdGVycyB1bmRlciB0aGUgaHlwZXJ2aXNvci4KKwkJICAqLworCQlzbXBfODV4eF9vcHMuZ2l2ZV90aW1lYmFzZSA9IE5VTEw7CisJCXNtcF84NXh4X29wcy50YWtlX3RpbWViYXNlID0gTlVMTDsKICNlbmRpZgogCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQlyZXR1cm4gMDsKIAl9CisKKwlyZXR1cm4gMDsKIH0KIAogZGVmaW5lX21hY2hpbmUocDQwODBfZHMpIHsKQEAgLTY4LDcgKzc5LDEwIEBACiAJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCiAJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCiAJLnByb2dyZXNzCQk9IHVkYmdfcHJvZ3Jlc3MsCisJLnBvd2VyX3NhdmUJCT0gZTUwMF9pZGxlLAogfTsKIAogbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwocDQwODBfZHMsIGNvcmVuZXRfZHNfcHVibGlzaF9kZXZpY2VzKTsKKyNpZmRlZiBDT05GSUdfU1dJT1RMQgogbWFjaGluZV9hcmNoX2luaXRjYWxsKHA0MDgwX2RzLCBzd2lvdGxiX3NldHVwX2J1c19ub3RpZmllcik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wNTAyMF9kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3A1MDIwX2RzLmMKaW5kZXggNzQ2N2I3MS4uZThjYmE1MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3A1MDIwX2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3A1MDIwX2RzLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlIDxhc20vZWh2X3BpYy5oPgogCiAjaW5jbHVkZSAiY29yZW5ldF9kcy5oIgogCkBAIC0zOSw4ICs0MCwzMiBAQAogc3RhdGljIGludCBfX2luaXQgcDUwMjBfZHNfcHJvYmUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisjaWZkZWYgQ09ORklHX1NNUAorCWV4dGVybiBzdHJ1Y3Qgc21wX29wc190IHNtcF84NXh4X29wczsKKyNlbmRpZgogCi0JcmV0dXJuIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFA1MDIwRFMiKTsKKwlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsUDUwMjBEUyIpKQorCQlyZXR1cm4gMTsKKworCS8qIENoZWNrIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgdGhlIEZyZWVzY2FsZSBoeXBlcnZpc29yICovCisJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFA1MDIwRFMtaHYiKSkgeworCQlwcGNfbWQuaW5pdF9JUlEgPSBlaHZfcGljX2luaXQ7CisJCXBwY19tZC5nZXRfaXJxID0gZWh2X3BpY19nZXRfaXJxOworCQlwcGNfbWQucmVzdGFydCA9IGZzbF9odl9yZXN0YXJ0OworCQlwcGNfbWQucG93ZXJfb2ZmID0gZnNsX2h2X2hhbHQ7CisJCXBwY19tZC5oYWx0ID0gZnNsX2h2X2hhbHQ7CisjaWZkZWYgQ09ORklHX1NNUAorCQkvKgorCQkgKiBEaXNhYmxlIHRoZSB0aW1lYmFzZSBzeW5jIG9wZXJhdGlvbnMgYmVjYXVzZSB3ZSBjYW4ndCB3cml0ZQorCQkgKiB0byB0aGUgdGltZWJhc2UgcmVnaXN0ZXJzIHVuZGVyIHRoZSBoeXBlcnZpc29yLgorCQkgICovCisJCXNtcF84NXh4X29wcy5naXZlX3RpbWViYXNlID0gTlVMTDsKKwkJc21wXzg1eHhfb3BzLnRha2VfdGltZWJhc2UgPSBOVUxMOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOwogfQogCiBkZWZpbmVfbWFjaGluZShwNTAyMF9kcykgewpAQCAtNjAsNiArODUsMTEgQEAKIAkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKIAkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKIAkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwkucG93ZXJfc2F2ZQkJPSBib29rM2VfaWRsZSwKKyNlbHNlCisJLnBvd2VyX3NhdmUJCT0gZTUwMF9pZGxlLAorI2VuZGlmCiB9OwogCiBtYWNoaW5lX2RldmljZV9pbml0Y2FsbChwNTAyMF9kcywgY29yZW5ldF9kc19wdWJsaXNoX2RldmljZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMKaW5kZXggZDJkZmQ0Ni4uMDljZWQ3MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jCkBAIC0yODUsNyArMjg1LDcgQEAKIAogCXByaW50ayhLRVJOX0lORk8gInNiYzg1NjA6IEZvdW5kIEJSU1RDUiBhdCBpL28gMHgleFxuIiwgcmVzLnN0YXJ0KTsKIAotCWJyc3RjciA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXMuZW5kIC0gcmVzLnN0YXJ0KTsKKwlicnN0Y3IgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CiAJaWYoIWJyc3RjcikKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAic2JjODU2MDogaW9yZW1hcCBvZiBicnN0Y3IgZmFpbGVkLlxuIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuYwppbmRleCBkNmE5M2ExLi41YjliOTAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NtcC5jCkBAIC0yLDcgKzIsNyBAQAogICogQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CiAgKiAJICAgS3VtYXIgR2FsYSA8Z2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZz4KICAqCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqIENvcHlyaWdodCAyMDA2LTIwMDgsIDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC0xMTEsMTQgKzExMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdAotc21wXzg1eHhfc2V0dXBfY3B1KGludCBjcHVfbnIpCi17Ci0JbXBpY19zZXR1cF90aGlzX2NwdSgpOwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9EQkVMTCkpCi0JCWRvb3JiZWxsX3NldHVwX3RoaXNfY3B1KCk7Ci19Ci0KIHN0cnVjdCBzbXBfb3BzX3Qgc21wXzg1eHhfb3BzID0gewogCS5raWNrX2NwdSA9IHNtcF84NXh4X2tpY2tfY3B1LAogI2lmZGVmIENPTkZJR19LRVhFQwpAQCAtMjI0LDI0ICsyMTYsMzYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfS0VYRUMgKi8KIAorc3RhdGljIHZvaWQgX19pbml0CitzbXBfODV4eF9zZXR1cF9jcHUoaW50IGNwdV9ucikKK3sKKwlpZiAoc21wXzg1eHhfb3BzLnByb2JlID09IHNtcF9tcGljX3Byb2JlKQorCQltcGljX3NldHVwX3RoaXNfY3B1KCk7CisKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfREJFTEwpKQorCQlkb29yYmVsbF9zZXR1cF90aGlzX2NwdSgpOworfQorCiB2b2lkIF9faW5pdCBtcGM4NXh4X3NtcF9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAorCXNtcF84NXh4X29wcy5zZXR1cF9jcHUgPSBzbXBfODV4eF9zZXR1cF9jcHU7CisKIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJvcGVuLXBpYyIpOwogCWlmIChucCkgewogCQlzbXBfODV4eF9vcHMucHJvYmUgPSBzbXBfbXBpY19wcm9iZTsKLQkJc21wXzg1eHhfb3BzLnNldHVwX2NwdSA9IHNtcF84NXh4X3NldHVwX2NwdTsKIAkJc21wXzg1eHhfb3BzLm1lc3NhZ2VfcGFzcyA9IHNtcF9tcGljX21lc3NhZ2VfcGFzczsKIAl9CiAKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfREJFTEwpKSB7Ci0JCXNtcF84NXh4X29wcy5tZXNzYWdlX3Bhc3MgPSBzbXBfbXV4ZWRfaXBpX21lc3NhZ2VfcGFzczsKKwkJLyoKKwkJICogSWYgbGVmdCBOVUxMLCAubWVzc2FnZV9wYXNzIGRlZmF1bHRzIHRvCisJCSAqIHNtcF9tdXhlZF9pcGlfbWVzc2FnZV9wYXNzCisJCSAqLwogCQlzbXBfODV4eF9vcHMuY2F1c2VfaXBpID0gZG9vcmJlbGxfY2F1c2VfaXBpOwogCX0KIAotCUJVR19PTighc21wXzg1eHhfb3BzLm1lc3NhZ2VfcGFzcyk7Ci0KIAlzbXBfb3BzID0gJnNtcF84NXh4X29wczsKIAogI2lmZGVmIENPTkZJR19LRVhFQwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3hlc19tcGM4NXh4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgveGVzX21wYzg1eHguYwppbmRleCAwMTI1NjA0Li5hOWRjNWU3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgveGVzX21wYzg1eHguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgveGVzX21wYzg1eHguYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWwyX2Jhc2UgPSBpb3JlbWFwKHJbMF0uc3RhcnQsIHJbMF0uZW5kIC0gclswXS5zdGFydCArIDEpOworCQlsMl9iYXNlID0gaW9yZW1hcChyWzBdLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyWzBdKSk7CiAKIAkJeGVzX21wYzg1eHhfY29uZmlndXJlX2wyKGwyX2Jhc2UpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4NjEwX2hwY2QuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4NjEwX2hwY2QuYwppbmRleCBhODk2NTExLi43NGUwMThlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODYxMF9ocGNkLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2MTBfaHBjZC5jCkBAIC0zOSwxMiArMzksMTkgQEAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L3NpbXBsZV9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2ZzbF9ndXRzLmg+CiAKICNpbmNsdWRlICJtcGM4Nnh4LmgiCiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBpeGlzX25vZGU7CiBzdGF0aWMgdW5zaWduZWQgY2hhciAqcGl4aXNfYmRjZmcwLCAqcGl4aXNfYXJjaDsKIAorLyogRElVIFBpeGVsIENsb2NrIGJpdHMgb2YgdGhlIENMS0RWRFIgR2xvYmFsIFV0aWxpdGllcyByZWdpc3RlciAqLworI2RlZmluZSBDTEtEVkRSX1BYQ0tFTgkJMHg4MDAwMDAwMAorI2RlZmluZSBDTEtEVkRSX1BYQ0tJTlYJCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ0xLRFZEUl9QWENLRExZCQkweDA2MDAwMDAwCisjZGVmaW5lIENMS0RWRFJfUFhDTEtfTUFTSwkweDAwMUYwMDAwCisKICNpZmRlZiBDT05GSUdfU1VTUEVORAogc3RhdGljIGlycXJldHVybl90IG1wYzg2MTBfc3c5X2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQogewpAQCAtMjA1LDcyICsyMTIsNTQgQEAKIAkJCSAgICAgYmRjZmdbbW9uaXRvcl9wb3J0XSk7CiB9CiAKKy8qKgorICogbXBjODYxMGhwY2Rfc2V0X3BpeGVsX2Nsb2NrOiBwcm9ncmFtIHRoZSBESVUncyBjbG9jaworICoKKyAqIEBwaXhjbG9jazogdGhlIHdhdmVsZW5ndGgsIGluIHBpY29zZWNvbmRzLCBvZiB0aGUgY2xvY2sKKyAqLwogdm9pZCBtcGM4NjEwaHBjZF9zZXRfcGl4ZWxfY2xvY2sodW5zaWduZWQgaW50IHBpeGNsb2NrKQogewotCXUzMiBfX2lvbWVtICpjbGtkdmRyOwotCXUzMiB0ZW1wOwotCS8qIHZhcmlhYmxlcyBmb3IgcGl4ZWwgY2xvY2sgY2FsY3MgKi8KLQl1bG9uZyAgYmVzdHZhbCwgYmVzdGZyZXEsIHNwZWVkX2NjYiwgbWlucGl4Y2xvY2ssIG1heHBpeGNsb2NrOwotCXVsb25nIHBpeHZhbDsKLQlsb25nIGVycjsKLQlpbnQgaTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmd1dHNfbnAgPSBOVUxMOworCXN0cnVjdCBjY3NyX2d1dHNfODZ4eCBfX2lvbWVtICpndXRzOworCXVuc2lnbmVkIGxvbmcgZnJlcTsKKwl1NjQgdGVtcDsKKwl1MzIgcHhjbGs7CiAKLQljbGtkdmRyID0gaW9yZW1hcChnZXRfaW1tcmJhc2UoKSArIDB4ZTA4MDAsIHNpemVvZih1MzIpKTsKLQlpZiAoIWNsa2R2ZHIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnI6IGNhbid0IG1hcCBjbG9jayBkaXZpZGVyIHJlZ2lzdGVyIVxuIik7CisJLyogTWFwIHRoZSBnbG9iYWwgdXRpbGl0aWVzIHJlZ2lzdGVycy4gKi8KKwlndXRzX25wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxtcGM4NjEwLWd1dHMiKTsKKwlpZiAoIWd1dHNfbnApIHsKKwkJcHJfZXJyKCJtcGM4NjEwaHBjZDogbWlzc2luZyBnbG9iYWwgdXRpbHRpZXMgZGV2aWNlIG5vZGVcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JLyogUGl4ZWwgQ2xvY2sgY29uZmlndXJhdGlvbiAqLwotCXNwZWVkX2NjYiA9IGZzbF9nZXRfc3lzX2ZyZXEoKTsKLQotCS8qIENhbGN1bGF0ZSB0aGUgcGl4ZWwgY2xvY2sgd2l0aCB0aGUgc21hbGxlc3QgZXJyb3IgKi8KLQkvKiBjYWxjdWxhdGUgdGhlIGZvbGxvd2luZyBpbiBzdGVwcyB0byBhdm9pZCBvdmVyZmxvdyAqLwotCXByX2RlYnVnKCJESVUgcGl4Y2xvY2sgaW4gcHMgLSAlZFxuIiwgcGl4Y2xvY2spOwotCXRlbXAgPSAxMDAwMDAwMDAwL3BpeGNsb2NrOwotCXRlbXAgKj0gMTAwMDsKLQlwaXhjbG9jayA9IHRlbXA7Ci0JcHJfZGVidWcoIkRJVSBwaXhjbG9jayBmcmVxIC0gJXVcbiIsIHBpeGNsb2NrKTsKLQotCXRlbXAgPSBwaXhjbG9jayAqIDUgLyAxMDA7Ci0JcHJfZGVidWcoImRldmlhdGlvbiA9ICVkXG4iLCB0ZW1wKTsKLQltaW5waXhjbG9jayA9IHBpeGNsb2NrIC0gdGVtcDsKLQltYXhwaXhjbG9jayA9IHBpeGNsb2NrICsgdGVtcDsKLQlwcl9kZWJ1ZygiRElVIG1pbnBpeGNsb2NrIC0gJWx1XG4iLCBtaW5waXhjbG9jayk7Ci0JcHJfZGVidWcoIkRJVSBtYXhwaXhjbG9jayAtICVsdVxuIiwgbWF4cGl4Y2xvY2spOwotCXBpeHZhbCA9IHNwZWVkX2NjYi9waXhjbG9jazsKLQlwcl9kZWJ1ZygiRElVIHBpeHZhbCA9ICVsdVxuIiwgcGl4dmFsKTsKLQotCWVyciA9IDEwMDAwMDAwMDsKLQliZXN0dmFsID0gcGl4dmFsOwotCXByX2RlYnVnKCJESVUgYmVzdHZhbCA9ICVsdVxuIiwgYmVzdHZhbCk7Ci0KLQliZXN0ZnJlcSA9IDA7Ci0JZm9yIChpID0gLTE7IGkgPD0gMTsgaSsrKSB7Ci0JCXRlbXAgPSBzcGVlZF9jY2IgLyAoKHBpeHZhbCtpKSArIDEpOwotCQlwcl9kZWJ1ZygiRElVIHRlc3QgcGl4dmFsIGk9ICVkLCBwaXh2YWw9JWx1LCB0ZW1wIGZyZXEuID0gJXVcbiIsCi0JCQkJCQkJaSwgcGl4dmFsLCB0ZW1wKTsKLQkJaWYgKCh0ZW1wIDwgbWlucGl4Y2xvY2spIHx8ICh0ZW1wID4gbWF4cGl4Y2xvY2spKQotCQkJcHJfZGVidWcoIkRJVSBleGNlZWRzIG1vbml0b3IgcmFuZ2UgKCVsdSB0byAlbHUpXG4iLAotCQkJCW1pbnBpeGNsb2NrLCBtYXhwaXhjbG9jayk7Ci0JCWVsc2UgaWYgKGFicyh0ZW1wIC0gcGl4Y2xvY2spIDwgZXJyKSB7Ci0JCSAgcHJfZGVidWcoIkVudGVyZWQgdGhlIGVsc2UgaWYgYmxvY2sgJWRcbiIsIGkpOwotCQkJZXJyID0gYWJzKHRlbXAgLSBwaXhjbG9jayk7Ci0JCQliZXN0dmFsID0gcGl4dmFsK2k7Ci0JCQliZXN0ZnJlcSA9IHRlbXA7Ci0JCX0KKwlndXRzID0gb2ZfaW9tYXAoZ3V0c19ucCwgMCk7CisJb2Zfbm9kZV9wdXQoZ3V0c19ucCk7CisJaWYgKCFndXRzKSB7CisJCXByX2VycigibXBjODYxMGhwY2Q6IGNvdWxkIG5vdCBtYXAgZ2xvYmFsIHV0aWx0aWVzIGRldmljZVxuIik7CisJCXJldHVybjsKIAl9CiAKLQlwcl9kZWJ1ZygiRElVIGNob3NlID0gJWx4XG4iLCBiZXN0dmFsKTsKLQlwcl9kZWJ1ZygiRElVIGVycm9yID0gJWxkXG4gTm9tUGl4Q2xrICIsIGVycik7Ci0JcHJfZGVidWcoIkRJVTogQmVzdCBGcmVxID0gJWx4XG4iLCBiZXN0ZnJlcSk7Ci0JLyogTW9kaWZ5IFBYQ0xLIGluIEdVVFMgQ0xLRFZEUiAqLwotCXByX2RlYnVnKCJESVU6IEN1cnJlbnQgdmFsdWUgb2YgQ0xLRFZEUiA9IDB4JTA4eFxuIiwgKCpjbGtkdmRyKSk7Ci0JdGVtcCA9ICgqY2xrZHZkcikgJiAweDIwMDBGRkZGOwotCSpjbGtkdmRyID0gdGVtcDsJCS8qIHR1cm4gb2ZmIGNsb2NrICovCi0JKmNsa2R2ZHIgPSB0ZW1wIHwgMHg4MDAwMDAwMCB8ICgoKGJlc3R2YWwpICYgMHgxRikgPDwgMTYpOwotCXByX2RlYnVnKCJESVU6IE1vZGlmaWVkIHZhbHVlIG9mIENMS0RWRFIgPSAweCUwOHhcbiIsICgqY2xrZHZkcikpOwotCWlvdW5tYXAoY2xrZHZkcik7CisJLyogQ29udmVydCBwaXhjbG9jayBmcm9tIGEgd2F2ZWxlbmd0aCB0byBhIGZyZXF1ZW5jeSAqLworCXRlbXAgPSAxMDAwMDAwMDAwMDAwVUxMOworCWRvX2Rpdih0ZW1wLCBwaXhjbG9jayk7CisJZnJlcSA9IHRlbXA7CisKKwkvKgorCSAqICdweGNsaycgaXMgdGhlIHJhdGlvIG9mIHRoZSBwbGF0Zm9ybSBjbG9jayB0byB0aGUgcGl4ZWwgY2xvY2suCisJICogT24gdGhlIE1QQzg2MTAsIHRoZSB2YWx1ZSBwcm9ncmFtbWVkIGludG8gQ0xLRFZEUiBpcyB0aGUgcmF0aW8KKwkgKiBtaW51cyBvbmUuICBUaGUgdmFsaWQgcmFuZ2Ugb2YgdmFsdWVzIGlzIDItMzEuCisJICovCisJcHhjbGsgPSBESVZfUk9VTkRfQ0xPU0VTVChmc2xfZ2V0X3N5c19mcmVxKCksIGZyZXEpIC0gMTsKKwlweGNsayA9IGNsYW1wX3QodTMyLCBweGNsaywgMiwgMzEpOworCisJLyogRGlzYWJsZSB0aGUgcGl4ZWwgY2xvY2ssIGFuZCBzZXQgaXQgdG8gbm9uLWludmVydGVkIGFuZCBubyBkZWxheSAqLworCWNscmJpdHMzMigmZ3V0cy0+Y2xrZHZkciwKKwkJICBDTEtEVkRSX1BYQ0tFTiB8IENMS0RWRFJfUFhDS0RMWSB8IENMS0RWRFJfUFhDTEtfTUFTSyk7CisKKwkvKiBFbmFibGUgdGhlIGNsb2NrIGFuZCBzZXQgdGhlIHB4Y2xrICovCisJc2V0Yml0czMyKCZndXRzLT5jbGtkdmRyLCBDTEtEVkRSX1BYQ0tFTiB8IChweGNsayA8PCAxNikpOworCisJaW91bm1hcChndXRzKTsKIH0KIAogc3NpemVfdCBtcGM4NjEwaHBjZF9zaG93X21vbml0b3JfcG9ydChpbnQgbW9uaXRvcl9wb3J0LCBjaGFyICpidWYpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKaW5kZXggZjk3MGNhMi4uZDBhZjdmYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZwpAQCAtNzgsNiArNzgsMTAgQEAKIAlib29sCiAJZGVmYXVsdCBuCiAKK2NvbmZpZyBQUENfRVBBUFJfSFZfUElDCisJYm9vbAorCWRlZmF1bHQgbgorCiBjb25maWcgTVBJQ19XRUlSRAogCWJvb2wKIAlkZWZhdWx0IG4KQEAgLTI2Niw3ICsyNzAsNyBAQAogCiBjb25maWcgUVVJQ0NfRU5HSU5FCiAJYm9vbCAiRnJlZXNjYWxlIFFVSUNDIEVuZ2luZSAoUUUpIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBGU0xfU09DCisJZGVwZW5kcyBvbiBGU0xfU09DICYmIFBQQzMyCiAJc2VsZWN0IFBQQ19MSUJfUkhFQVAKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCmluZGV4IDIxNjViNjUuLmUwNmUzOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCkBAIC0xLDcgKzEsNiBAQAogY29uZmlnIFBQQzY0CiAJYm9vbCAiNjQtYml0IGtlcm5lbCIKIAlkZWZhdWx0IG4KLQlzZWxlY3QgUFBDX0hBVkVfUE1VX1NVUFBPUlQKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoZXRoZXIgYSAzMi1iaXQgb3IgYSA2NC1iaXQga2VybmVsCiAJICB3aWxsIGJlIGJ1aWx0LgpAQCAtNjksNiArNjgsNyBAQAogY29uZmlnIFBQQ19CT09LM1NfNjQKIAlib29sICJTZXJ2ZXIgcHJvY2Vzc29ycyIKIAlzZWxlY3QgUFBDX0ZQVQorCXNlbGVjdCBQUENfSEFWRV9QTVVfU1VQUE9SVAogCiBjb25maWcgUFBDX0JPT0szRV82NAogCWJvb2wgIkVtYmVkZGVkIHByb2Nlc3NvcnMiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FtaWdhb25lL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FtaWdhb25lL0tjb25maWcKaW5kZXggMDIyNDc2Ny4uMTI4ZGUyNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9hbWlnYW9uZS9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvYW1pZ2FvbmUvS2NvbmZpZwpAQCAtOCw3ICs4LDcgQEAKIAlzZWxlY3QgTk9UX0NPSEVSRU5UX0NBQ0hFCiAJc2VsZWN0IENIRUNLX0NBQ0hFX0NPSEVSRU5DWQogCXNlbGVjdCBERUZBVUxUX1VJTUFHRQotCXNlbGVjdCBQQ1NQS1JfUExBVEZPUk0KKwlzZWxlY3QgSEFWRV9QQ1NQS1JfUExBVEZPUk0KIAloZWxwCiAJU2VsZWN0IEFtaWdhT25lIGZvciB0aGUgZm9sbG93aW5nIG1hY2hpbmVzOgogCS0gQW1pZ2FPbmUgU0UvVGVyb24gQ1ggKEczIG9ubHkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2VsbGViX3NjY19lcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2VsbGViX3NjY19lcGNpLmMKaW5kZXggMDViMGRiMy4uODQ0YzBmYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NlbGxlYl9zY2NfZXBjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jZWxsZWJfc2NjX2VwY2kuYwpAQCAtMzkzLDE5ICszOTMsMTkgQEAKIAogCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIDAsICZyKSkKIAkJZ290byBlcnJvcjsKLQlob3NlLT5jZmdfYWRkciA9IGlvcmVtYXAoci5zdGFydCwgKHIuZW5kIC0gci5zdGFydCArIDEpKTsKKwlob3NlLT5jZmdfYWRkciA9IGlvcmVtYXAoci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcikpOwogCWlmICghaG9zZS0+Y2ZnX2FkZHIpCiAJCWdvdG8gZXJyb3I7CiAJcHJfZGVidWcoIkVQQ0k6IGNmZ19hZGRyIG1hcCAweCUwMTZsbHgtPjB4JTAxNmx4ICsgMHglMDE2bGx4XG4iLAotCQkgci5zdGFydCwgKHVuc2lnbmVkIGxvbmcpaG9zZS0+Y2ZnX2FkZHIsIChyLmVuZCAtIHIuc3RhcnQgKyAxKSk7CisJCSByLnN0YXJ0LCAodW5zaWduZWQgbG9uZylob3NlLT5jZmdfYWRkciwgcmVzb3VyY2Vfc2l6ZSgmcikpOwogCiAJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uobm9kZSwgMiwgJnIpKQogCQlnb3RvIGVycm9yOwotCWhvc2UtPmNmZ19kYXRhID0gaW9yZW1hcChyLnN0YXJ0LCAoci5lbmQgLSByLnN0YXJ0ICsgMSkpOworCWhvc2UtPmNmZ19kYXRhID0gaW9yZW1hcChyLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyKSk7CiAJaWYgKCFob3NlLT5jZmdfZGF0YSkKIAkJZ290byBlcnJvcjsKIAlwcl9kZWJ1ZygiRVBDSTogY2ZnX2RhdGEgbWFwIDB4JTAxNmxseC0+MHglMDE2bHggKyAweCUwMTZsbHhcbiIsCi0JCSByLnN0YXJ0LCAodW5zaWduZWQgbG9uZylob3NlLT5jZmdfZGF0YSwgKHIuZW5kIC0gci5zdGFydCArIDEpKTsKKwkJIHIuc3RhcnQsICh1bnNpZ25lZCBsb25nKWhvc2UtPmNmZ19kYXRhLCByZXNvdXJjZV9zaXplKCZyKSk7CiAKIAlob3NlLT5vcHMgPSAmY2VsbGViX2VwY2lfb3BzOwogCWNlbGxlYl9lcGNpX2luaXQoaG9zZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2VsbGViX3NjY19wY2lleC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NlbGxlYl9zY2NfcGNpZXguYwppbmRleCBhODgxYmJlLi5hZTc5MGFjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2VsbGViX3NjY19wY2lleC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jZWxsZWJfc2NjX3BjaWV4LmMKQEAgLTQ5NCw3ICs0OTQsNyBAQAogCQlwcl9lcnIoIlBDSUVYQzpGYWlsZWQgdG8gZ2V0IGNvbmZpZyByZXNvdXJjZS5cbiIpOwogCQlyZXR1cm4gMTsKIAl9Ci0JcGhiLT5jZmdfYWRkciA9IGlvcmVtYXAoci5zdGFydCwgci5lbmQgLSByLnN0YXJ0ICsgMSk7CisJcGhiLT5jZmdfYWRkciA9IGlvcmVtYXAoci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcikpOwogCWlmICghcGhiLT5jZmdfYWRkcikgewogCQlwcl9lcnIoIlBDSUVYQzpGYWlsZWQgdG8gcmVtYXAgU01NSU8gcmVnaW9uLlxuIik7CiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMKaW5kZXggZjQ2NWQ0Ny4uNGU1YzkxNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAkJcmV0dXJuIHJldDsKIAlpZiAocGh5cykKIAkJKnBoeXMgPSByZXNvdXJjZS5zdGFydDsKLQlsZW4gPSByZXNvdXJjZS5lbmQgLSByZXNvdXJjZS5zdGFydCArIDE7CisJbGVuID0gcmVzb3VyY2Vfc2l6ZSgmcmVzb3VyY2UpOwogCSp2aXJ0ID0gaW9yZW1hcChyZXNvdXJjZS5zdGFydCwgbGVuKTsKIAlpZiAoISp2aXJ0KQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCmluZGV4IDNjN2MzZjguLmZiNTljNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwpAQCAtMTg1MCw5ICsxODUwLDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzcHVmc19tZmNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK3N0YXRpYyBpbnQgc3B1ZnNfbWZjX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYykKIHsKLQlyZXR1cm4gc3B1ZnNfbWZjX2ZsdXNoKGZpbGUsIE5VTEwpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCWludCBlcnIgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCWlmICghZXJyKSB7CisJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwkJZXJyID0gc3B1ZnNfbWZjX2ZsdXNoKGZpbGUsIE5VTEwpOworCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwl9CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBzcHVmc19tZmNfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKaW5kZXggODU2ZTljMy4uZTQ4MWY2YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKQEAgLTYxMSwxNSArNjExLDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzcHVmc190eXBlOwogCi1sb25nIHNwdWZzX2NyZWF0ZShzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgdW5zaWduZWQgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSwKLQkJCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCkKK2xvbmcgc3B1ZnNfY3JlYXRlKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCXVuc2lnbmVkIGludCBmbGFncywgbW9kZV90IG1vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gLUVJTlZBTDsKIAkvKiBjaGVjayBpZiB3ZSBhcmUgb24gc3B1ZnMgKi8KLQlpZiAobmQtPnBhdGguZGVudHJ5LT5kX3NiLT5zX3R5cGUgIT0gJnNwdWZzX3R5cGUpCisJaWYgKHBhdGgtPmRlbnRyeS0+ZF9zYi0+c190eXBlICE9ICZzcHVmc190eXBlKQogCQlnb3RvIG91dDsKIAogCS8qIGRvbid0IGFjY2VwdCB1bmRlZmluZWQgZmxhZ3MgKi8KQEAgLTYyNywzMyArNjI2LDI3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogb25seSB0aHJlYWRzIGNhbiBiZSB1bmRlcm5lYXRoIGEgZ2FuZyAqLwotCWlmIChuZC0+cGF0aC5kZW50cnkgIT0gbmQtPnBhdGguZGVudHJ5LT5kX3NiLT5zX3Jvb3QpIHsKKwlpZiAocGF0aC0+ZGVudHJ5ICE9IHBhdGgtPmRlbnRyeS0+ZF9zYi0+c19yb290KSB7CiAJCWlmICgoZmxhZ3MgJiBTUFVfQ1JFQVRFX0dBTkcpIHx8Ci0JCSAgICAhU1BVRlNfSShuZC0+cGF0aC5kZW50cnktPmRfaW5vZGUpLT5pX2dhbmcpCisJCSAgICAhU1BVRlNfSShwYXRoLT5kZW50cnktPmRfaW5vZGUpLT5pX2dhbmcpCiAJCQlnb3RvIG91dDsKIAl9CiAKLQlkZW50cnkgPSBsb29rdXBfY3JlYXRlKG5kLCAxKTsKLQlyZXQgPSBQVFJfRVJSKGRlbnRyeSk7Ci0JaWYgKElTX0VSUihkZW50cnkpKQotCQlnb3RvIG91dF9kaXI7Ci0KIAltb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAKIAlpZiAoZmxhZ3MgJiBTUFVfQ1JFQVRFX0dBTkcpCi0JCXJldCA9IHNwdWZzX2NyZWF0ZV9nYW5nKG5kLT5wYXRoLmRlbnRyeS0+ZF9pbm9kZSwKLQkJCQkJIGRlbnRyeSwgbmQtPnBhdGgubW50LCBtb2RlKTsKKwkJcmV0ID0gc3B1ZnNfY3JlYXRlX2dhbmcocGF0aC0+ZGVudHJ5LT5kX2lub2RlLAorCQkJCQkgZGVudHJ5LCBwYXRoLT5tbnQsIG1vZGUpOwogCWVsc2UKLQkJcmV0ID0gc3B1ZnNfY3JlYXRlX2NvbnRleHQobmQtPnBhdGguZGVudHJ5LT5kX2lub2RlLAotCQkJCQkgICAgZGVudHJ5LCBuZC0+cGF0aC5tbnQsIGZsYWdzLCBtb2RlLAorCQlyZXQgPSBzcHVmc19jcmVhdGVfY29udGV4dChwYXRoLT5kZW50cnktPmRfaW5vZGUsCisJCQkJCSAgICBkZW50cnksIHBhdGgtPm1udCwgZmxhZ3MsIG1vZGUsCiAJCQkJCSAgICBmaWxwKTsKIAlpZiAocmV0ID49IDApCi0JCWZzbm90aWZ5X21rZGlyKG5kLT5wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5KTsKKwkJZnNub3RpZnlfbWtkaXIocGF0aC0+ZGVudHJ5LT5kX2lub2RlLCBkZW50cnkpOwogCXJldHVybiByZXQ7CiAKLW91dF9kaXI6Ci0JbXV0ZXhfdW5sb2NrKCZuZC0+cGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogb3V0OgorCW11dGV4X3VubG9jaygmcGF0aC0+ZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCmluZGV4IGM0NDhiYWMuLjA5OTI0NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCkBAIC0yNDgsNyArMjQ4LDcgQEAKIC8qIHN5c3RlbSBjYWxsIGltcGxlbWVudGF0aW9uICovCiBleHRlcm4gc3RydWN0IHNwdWZzX2NhbGxzIHNwdWZzX2NhbGxzOwogbG9uZyBzcHVmc19ydW5fc3B1KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKm5wYywgdTMyICpzdGF0dXMpOwotbG9uZyBzcHVmc19jcmVhdGUoc3RydWN0IG5hbWVpZGF0YSAqbmQsIHVuc2lnbmVkIGludCBmbGFncywKK2xvbmcgc3B1ZnNfY3JlYXRlKHN0cnVjdCBwYXRoICpuZCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQltb2RlX3QgbW9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogLyogRUxGIGNvcmVkdW1wIGNhbGxiYWNrcyBmb3Igd3JpdGluZyBTUFUgRUxGIG5vdGVzICovCiBleHRlcm4gaW50IHNwdWZzX2NvcmVkdW1wX2V4dHJhX25vdGVzX3NpemUodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3lzY2FsbHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zeXNjYWxscy5jCmluZGV4IGEzZDJjZTUuLjYwOWUwMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zeXNjYWxscy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zeXNjYWxscy5jCkBAIC02MiwyMSArNjIsMTcgQEAKIHN0YXRpYyBsb25nIGRvX3NwdV9jcmVhdGUoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCW1vZGVfdCBtb2RlLCBzdHJ1Y3QgZmlsZSAqbmVpZ2hib3IpCiB7Ci0JY2hhciAqdG1wOworCXN0cnVjdCBwYXRoIHBhdGg7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCWludCByZXQ7CiAKLQl0bXAgPSBnZXRuYW1lKHBhdGhuYW1lKTsKLQlyZXQgPSBQVFJfRVJSKHRtcCk7Ci0JaWYgKCFJU19FUlIodG1wKSkgewotCQlzdHJ1Y3QgbmFtZWlkYXRhIG5kOwotCi0JCXJldCA9IGtlcm5fcGF0aF9wYXJlbnQodG1wLCAmbmQpOwotCQlpZiAoIXJldCkgewotCQkJbmQuZmxhZ3MgfD0gTE9PS1VQX09QRU4gfCBMT09LVVBfQ1JFQVRFOwotCQkJcmV0ID0gc3B1ZnNfY3JlYXRlKCZuZCwgZmxhZ3MsIG1vZGUsIG5laWdoYm9yKTsKLQkJCXBhdGhfcHV0KCZuZC5wYXRoKTsKLQkJfQotCQlwdXRuYW1lKHRtcCk7CisJZGVudHJ5ID0gdXNlcl9wYXRoX2NyZWF0ZShBVF9GRENXRCwgcGF0aG5hbWUsICZwYXRoLCAxKTsKKwlyZXQgPSBQVFJfRVJSKGRlbnRyeSk7CisJaWYgKCFJU19FUlIoZGVudHJ5KSkgeworCQlyZXQgPSBzcHVmc19jcmVhdGUoJnBhdGgsIGRlbnRyeSwgZmxhZ3MsIG1vZGUsIG5laWdoYm9yKTsKKwkJbXV0ZXhfdW5sb2NrKCZwYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJCWRwdXQoZGVudHJ5KTsKKwkJcGF0aF9wdXQoJnBhdGgpOwogCX0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCmluZGV4IGJjMGIwZWYuLmQzY2RhYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIFBQQ19DSFJQCiAJYm9vbCAiQ29tbW9uIEhhcmR3YXJlIFJlZmVyZW5jZSBQbGF0Zm9ybSAoQ0hSUCkgYmFzZWQgbWFjaGluZXMiCiAJZGVwZW5kcyBvbiA2eHgKKwlzZWxlY3QgSEFWRV9QQ1NQS1JfUExBVEZPUk0KIAlzZWxlY3QgTVBJQwogCXNlbGVjdCBQUENfSTgyNTkKIAlzZWxlY3QgUFBDX0lORElSRUNUX1BDSQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCmluZGV4IDhmNjdhMzkuLjNmNjU0NDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAJb2Zfbm9kZV9wdXQobnApOwotCUh5ZHJhID0gaW9yZW1hcChyLnN0YXJ0LCByLmVuZC1yLnN0YXJ0KTsKKwlIeWRyYSA9IGlvcmVtYXAoci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcikpOwogCXByaW50aygiSHlkcmEgTWFjIEkvTyBhdCAlbGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXIuc3RhcnQpOwogCXByaW50aygiSHlkcmEgRmVhdHVyZV9Db250cm9sIHdhcyAleCIsCiAJICAgICAgIGluX2xlMzIoJkh5ZHJhLT5GZWF0dXJlX0NvbnRyb2wpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9leGNlcHRpb24uUyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9leGNlcHRpb24uUwppbmRleCAyOWMwMmYzLi5mNTE5ZWUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZXhjZXB0aW9uLlMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2V4Y2VwdGlvbi5TCkBAIC0xNjcsNyArMTY3LDcgQEAKIAlzdGQJcjEyLFBBQ0FfRVhHRU4rRVhfUjEzKHIxMykKIAlFWENFUFRJT05fUFJPTE9HX0lTRVJJRVNfMQogRlRSX1NFQ1RJT05fRUxTRQotCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYR0VOKQorCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYR0VOLCBOT1RFU1QsIDApCiAJRVhDRVBUSU9OX1BST0xPR19JU0VSSUVTXzEKIEFMVF9NTVVfRlRSX1NFQ1RJT05fRU5EX0lGQ0xSKE1NVV9GVFJfU0xCKQogCWIJZGF0YV9hY2Nlc3NfY29tbW9uCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZXhjZXB0aW9uLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZXhjZXB0aW9uLmgKaW5kZXggYmFlM2ZiYS4uNTAyNzFiNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2V4Y2VwdGlvbi5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9leGNlcHRpb24uaApAQCAtMzksNyArMzksNyBAQAogbGFiZWwjI19pU2VyaWVzOgkJCQkJCQlcCiAJSE1UX01FRElVTTsJCQkJCQkJXAogCW10c3ByCVNQUk5fU1BSR19TQ1JBVENIMCxyMTM7CS8qIHNhdmUgcjEzICovCQkJXAotCUVYQ0VQVElPTl9QUk9MT0dfMShhcmVhKTsJCQkJCVwKKwlFWENFUFRJT05fUFJPTE9HXzEoYXJlYSwgTk9URVNULCAwKTsJCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfSVNFUklFU18xOwkJCQkJXAogCWIJbGFiZWwjI19jb21tb24KIApAQCAtNDgsNyArNDgsNyBAQAogbGFiZWwjI19pU2VyaWVzOgkJCQkJCQlcCiAJSE1UX01FRElVTTsJCQkJCQkJXAogCW10c3ByCVNQUk5fU1BSR19TQ1JBVENIMCxyMTM7CS8qIHNhdmUgcjEzICovCQkJXAotCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYR0VOKTsJCQkJCVwKKwlFWENFUFRJT05fUFJPTE9HXzEoUEFDQV9FWEdFTiwgTk9URVNULCAwKTsJCQlcCiAJbGJ6CXIxMCxQQUNBU09GVElSUUVOKHIxMyk7CQkJCQlcCiAJY21wd2kJMCxyMTAsMDsJCQkJCQlcCiAJYmVxLQlsYWJlbCMjX2lTZXJpZXNfbWFza2VkOwkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NtcC5jCmluZGV4IGUzMjY1YWQuLjJkZjQ4YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc21wLmMKQEAgLTc1LDcgKzc1LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzbXBfb3BzX3QgaVNlcmllc19zbXBfb3BzID0gewotCS5tZXNzYWdlX3Bhc3MgPSBzbXBfbXV4ZWRfaXBpX21lc3NhZ2VfcGFzcywKKwkubWVzc2FnZV9wYXNzID0gTlVMTCwJLyogVXNlIHNtcF9tdXhlZF9pcGlfbWVzc2FnZV9wYXNzICovCiAJLmNhdXNlX2lwaSAgICA9IHNtcF9pU2VyaWVzX2NhdXNlX2lwaSwKIAkucHJvYmUgICAgICAgID0gc21wX2lTZXJpZXNfcHJvYmUsCiAJLmtpY2tfY3B1ICAgICA9IHNtcF9pU2VyaWVzX2tpY2tfY3B1LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jCmluZGV4IGZlMzRjM2QuLjViMzM4OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMKQEAgLTMzOCwzNSArMzM4LDE2IEBACiAjaWZkZWYgQ09ORklHX0VEQUMKIC8qCiAgKiBSZWdpc3RlciBhIHBsYXRmb3JtIGRldmljZSBmb3IgQ1BDOTI1IG1lbW9yeSBjb250cm9sbGVyIG9uCi0gKiBNb3Rvcm9sYSBBVENBLTYxMDEgYmxhZGUuCisgKiBhbGwgYm9hcmRzIHdpdGggVTNIIChDUEM5MjUpIGJyaWRnZS4KICAqLwotI2RlZmluZSBNQVBMRV9DUEM5MjVfTU9ERUwJIk1vdG9yb2xhLEFUQ0EtNjEwMSIKIHN0YXRpYyBpbnQgX19pbml0IG1hcGxlX2NwYzkyNV9lZGFjX3NldHVwKHZvaWQpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKIAlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQljb25zdCB1bnNpZ25lZCBjaGFyICptb2RlbDsKIAlpbnQgcmV0OwotCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwotCWlmICghbnApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCByb290IG5vZGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JbW9kZWwgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKW9mX2dldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7Ci0JaWYgKCFtb2RlbCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFiZWwgdG8gZ2V0IG1vZGVsIGluZm9cbiIsIF9fZnVuY19fKTsKLQkJb2Zfbm9kZV9wdXQobnApOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyZXQgPSBzdHJjbXAobW9kZWwsIE1BUExFX0NQQzkyNV9NT0RFTCk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotCi0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gMDsKKwl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKm1lbTsKKwl1MzIgcmV2OwogCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAibWVtb3J5LWNvbnRyb2xsZXIiKTsKIAlpZiAoIW5wKSB7CkBAIC0zODQsNiArMzY1LDIyIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCW1lbSA9IGlvcmVtYXAoci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcikpOworCWlmICghbWVtKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBtYXAgbWVtb3J5LWNvbnRyb2xsZXIgbWVtb3J5XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV2ID0gX19yYXdfcmVhZGwobWVtKTsKKwlpb3VubWFwKG1lbSk7CisKKwlpZiAocmV2IDwgMHgzNCB8fCByZXYgPiAweDNmKSB7IC8qIFUzSCAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBOb24tQ1BDOTI1KFUzSCkgYnJpZGdlIHJldmlzaW9uOiAlMDJ4XG4iLAorCQkJX19mdW5jX18sIHJldik7CisJCXJldHVybiAwOworCX0KKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJjcGM5MjVfZWRhYyIsIDAsICZyLCAxKTsKIAlpZiAoSVNfRVJSKHBkZXYpKQogCQlyZXR1cm4gUFRSX0VSUihwZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2RtYV9saWIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2RtYV9saWIuYwppbmRleCAzMjFhOWIzLi43NTYxMjNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9kbWFfbGliLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZG1hX2xpYi5jCkBAIC01NzYsNyArNTc2LDcgQEAKIAkJcmVzLnN0YXJ0ID0gMHhmZDgwMDAwMDsKIAkJcmVzLmVuZCA9IHJlcy5zdGFydCArIDB4MTAwMDsKIAl9Ci0JZG1hX3N0YXR1cyA9IF9faW9yZW1hcChyZXMuc3RhcnQsIHJlcy5lbmQtcmVzLnN0YXJ0LCAwKTsKKwlkbWFfc3RhdHVzID0gX19pb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSwgMCk7CiAJcGNpX2Rldl9wdXQoaW9iX3BkZXYpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9UWENIOyBpKyspCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL252cmFtLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL252cmFtLmMKaW5kZXggYjFjZGNmOS4uNjk1NDQzYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9udnJhbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbnZyYW0uYwpAQCAtNTgwLDEwICs1ODAsMTAgQEAKIAkvKiBUcnkgdG8gb2J0YWluIGFuIGFkZHJlc3MgKi8KIAlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkcCwgMCwgJnIxKSA9PSAwKSB7CiAJCW52cmFtX25hZGRycyA9IDE7Ci0JCXMxID0gKHIxLmVuZCAtIHIxLnN0YXJ0KSArIDE7CisJCXMxID0gcmVzb3VyY2Vfc2l6ZSgmcjEpOwogCQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkcCwgMSwgJnIyKSA9PSAwKSB7CiAJCQludnJhbV9uYWRkcnMgPSAyOwotCQkJczIgPSAocjIuZW5kIC0gcjIuc3RhcnQpICsgMTsKKwkJCXMyID0gcmVzb3VyY2Vfc2l6ZSgmcjIpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwppbmRleCBmMzNlMDhkLi40MWE4MGE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgogCiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0yMzUsNyArMjM2LDcgQEAKIAogCWlmIChvZmZzZXQgPj0gMHgxMDApCiAJCXJldHVybiAgUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOwotCW5wID0gcGNpX2J1c2Rldl90b19PRl9ub2RlKGJ1cywgZGV2Zm4pOworCW5wID0gb2ZfcGNpX2ZpbmRfY2hpbGRfZGV2aWNlKGJ1cy0+ZGV2Lm9mX25vZGUsIGRldmZuKTsKIAlpZiAobnAgPT0gTlVMTCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIApAQCAtODM4LDggKzgzOSw3IEBACiAJICogaW50byBjZmdfYWRkcgogCSAqLwogCWhvc2UtPmNmZ19kYXRhID0gaW9yZW1hcChjZmdfcmVzLnN0YXJ0LCAweDAyMDAwMDAwKTsKLQlob3NlLT5jZmdfYWRkciA9IGlvcmVtYXAoc2VsZl9yZXMuc3RhcnQsCi0JCQkJIHNlbGZfcmVzLmVuZCAtIHNlbGZfcmVzLnN0YXJ0ICsgMSk7CisJaG9zZS0+Y2ZnX2FkZHIgPSBpb3JlbWFwKHNlbGZfcmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZzZWxmX3JlcykpOwogCiAJLyoKIAkgKiAvaHQgbm9kZSBkb2Vzbid0IGV4cG9zZSBhICJyYW5nZXMiIHByb3BlcnR5LCB3ZSByZWFkIHRoZSByZWdpc3RlcgpAQCAtMTMyMyw4ICsxMzIzLDcgQEAKIAkJICovCiAJCWlmIChyLT5zdGFydCA+PSAweGYwMDAwMDAwICYmIHItPnN0YXJ0IDwgMHhmMzAwMDAwMCkKIAkJCWNvbnRpbnVlOwotCQlpZiAoIXJlZ2lvbiB8fCAoci0+ZW5kIC0gci0+c3RhcnQpID4KLQkJICAgIChyZWdpb24tPmVuZCAtIHJlZ2lvbi0+c3RhcnQpKQorCQlpZiAoIXJlZ2lvbiB8fCByZXNvdXJjZV9zaXplKHIpID4gcmVzb3VyY2Vfc2l6ZShyZWdpb24pKQogCQkJcmVnaW9uID0gcjsKIAl9CiAJLyogTm90aGluZyBmb3VuZCwgYmFpbCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCmluZGV4IGFhNDUyODEuLmEwMjhmMDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKQEAgLTM1NSw5ICszNTUsNiBAQAogc3RhdGljIGludCBwbWFjX2xhdGVfaW5pdCh2b2lkKQogewogCWluaXRpYWxpemluZyA9IDA7Ci0JLyogdGhpcyBpcyB1ZGJnICh3aGljaCBpcyBfX2luaXQpIGFuZCB3ZSBjYW4gbGF0ZXIgdXNlIGl0IGR1cmluZwotCSAqIGNwdSBob3RwbHVnIChpbiBzbXBfY29yZTk5X2tpY2tfY3B1KSAqLwotCXBwY19tZC5wcm9ncmVzcyA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiBtYWNoaW5lX2xhdGVfaW5pdGNhbGwocG93ZXJtYWMsIHBtYWNfbGF0ZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCmluZGV4IGRiMDkyZDcuLmQxNWZjYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAKIC8qIFBvd2VyU3VyZ2Utc3R5bGUgTWFjcyAqLwogc3RydWN0IHNtcF9vcHNfdCBwc3VyZ2Vfc21wX29wcyA9IHsKLQkubWVzc2FnZV9wYXNzCT0gc21wX211eGVkX2lwaV9tZXNzYWdlX3Bhc3MsCisJLm1lc3NhZ2VfcGFzcwk9IE5VTEwsCS8qIFVzZSBzbXBfbXV4ZWRfaXBpX21lc3NhZ2VfcGFzcyAqLwogCS5jYXVzZV9pcGkJPSBzbXBfcHN1cmdlX2NhdXNlX2lwaSwKIAkucHJvYmUJCT0gc21wX3BzdXJnZV9wcm9iZSwKIAkua2lja19jcHUJPSBzbXBfcHN1cmdlX2tpY2tfY3B1LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy90aW1lLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3RpbWUuYwppbmRleCA0ODIxMWNhLi4xMWM5ZmNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3RpbWUuYwpAQCAtMjc0LDcgKzI3NCw3IEBACiAJCXJldHVybiAwOwogCX0KIAlvZl9ub2RlX3B1dCh2aWFzKTsKLQl2aWEgPSBpb3JlbWFwKHJzcmMuc3RhcnQsIHJzcmMuZW5kIC0gcnNyYy5zdGFydCArIDEpOworCXZpYSA9IGlvcmVtYXAocnNyYy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcnNyYykpOwogCWlmICh2aWEgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBtYXAgVklBIGZvciB0aW1lciBjYWxpYnJhdGlvbiAhXG4iKTsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3ByZXAvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHJlcC9LY29uZmlnCmluZGV4IGJmODMzMGUuLmYwNTM2YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHJlcC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHJlcC9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIFBQQ19QUkVQCiAJYm9vbCAiUG93ZXJQQyBSZWZlcmVuY2UgUGxhdGZvcm0gKFBSZVApIGJhc2VkIG1hY2hpbmVzIgogCWRlcGVuZHMgb24gNnh4ICYmIEJST0tFTgorCXNlbGVjdCBIQVZFX1BDU1BLUl9QTEFURk9STQogCXNlbGVjdCBNUElDCiAJc2VsZWN0IFBQQ19JODI1OQogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCmluZGV4IDcxYWY0YzUuLjA1Y2Y0NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIFBQQ19QU0VSSUVTCiAJZGVwZW5kcyBvbiBQUEM2NCAmJiBQUENfQk9PSzNTCiAJYm9vbCAiSUJNIHBTZXJpZXMgJiBuZXcgKFBPV0VSNS1iYXNlZCkgaVNlcmllcyIKKwlzZWxlY3QgSEFWRV9QQ1NQS1JfUExBVEZPUk0KIAlzZWxlY3QgTVBJQwogCXNlbGVjdCBQQ0lfTVNJCiAJc2VsZWN0IFBQQ19YSUNTCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZGxwYXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kbHBhci5jCmluZGV4IDU3Y2ViOTIuLmU5YmUyNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kbHBhci5jCkBAIC0yNjIsMTIgKzI2MiwxMSBAQAogCWlmICghZG4tPnBhcmVudCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyYyA9IGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnBTZXJpZXNfcmVjb25maWdfY2hhaW4sCi0JCQkJCSAgUFNFUklFU19SRUNPTkZJR19BREQsIGRuKTsKLQlpZiAocmMgPT0gTk9USUZZX0JBRCkgeworCXJjID0gcFNlcmllc19yZWNvbmZpZ19ub3RpZnkoUFNFUklFU19SRUNPTkZJR19BREQsIGRuKTsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWRkIGRldmljZSBub2RlICVzXG4iLAogCQkgICAgICAgZG4tPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiAtRU5PTUVNOyAvKiBGb3Igbm93LCBzYWZlIHRvIGFzc3VtZSBrbWFsbG9jIGZhaWx1cmUgKi8KKwkJcmV0dXJuIHJjOwogCX0KIAogCW9mX2F0dGFjaF9ub2RlKGRuKTsKQEAgLTI5Nyw4ICsyOTYsNyBAQAogCQlyZW1vdmVfcHJvY19lbnRyeShkbi0+cGRlLT5uYW1lLCBwYXJlbnQtPnBkZSk7CiAjZW5kaWYKIAotCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnBTZXJpZXNfcmVjb25maWdfY2hhaW4sCi0JCQkgICAgUFNFUklFU19SRUNPTkZJR19SRU1PVkUsIGRuKTsKKwlwU2VyaWVzX3JlY29uZmlnX25vdGlmeShQU0VSSUVTX1JFQ09ORklHX1JFTU9WRSwgZG4pOwogCW9mX2RldGFjaF9ub2RlKGRuKTsKIAlvZl9ub2RlX3B1dChkbik7IC8qIE11c3QgZGVjcmVtZW50IHRoZSByZWZjb3VudCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLWNwdS5jCmluZGV4IDQ2ZjEzYTMuLmJjMDI4ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLWNwdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLWNwdS5jCkBAIC0zMzAsMjEgKzMzMCwxNyBAQAogc3RhdGljIGludCBwc2VyaWVzX3NtcF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpub2RlKQogewotCWludCBlcnIgPSBOT1RJRllfT0s7CisJaW50IGVyciA9IDA7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgUFNFUklFU19SRUNPTkZJR19BREQ6Ci0JCWlmIChwc2VyaWVzX2FkZF9wcm9jZXNzb3Iobm9kZSkpCi0JCQllcnIgPSBOT1RJRllfQkFEOworCQllcnIgPSBwc2VyaWVzX2FkZF9wcm9jZXNzb3Iobm9kZSk7CiAJCWJyZWFrOwogCWNhc2UgUFNFUklFU19SRUNPTkZJR19SRU1PVkU6CiAJCXBzZXJpZXNfcmVtb3ZlX3Byb2Nlc3Nvcihub2RlKTsKIAkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyID0gTk9USUZZX0RPTkU7Ci0JCWJyZWFrOwogCX0KLQlyZXR1cm4gZXJyOworCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKGVycik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcHNlcmllc19zbXBfbmIgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1tZW1vcnkuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLW1lbW9yeS5jCmluZGV4IDMzODY3ZWMuLjExZDhlMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLW1lbW9yeS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLW1lbW9yeS5jCkBAIC0xMiw2ICsxMiw4IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KKwogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3BTZXJpZXNfcmVjb25maWcuaD4KQEAgLTIwLDI0ICsyMiwyNSBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X21lbWJsb2NrX3NpemUodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXVuc2lnbmVkIGludCBtZW1ibG9ja19zaXplID0gMDsKKwl1bnNpZ25lZCBpbnQgbWVtYmxvY2tfc2l6ZSA9IE1JTl9NRU1PUllfQkxPQ0tfU0laRTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAogCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sZHluYW1pYy1yZWNvbmZpZ3VyYXRpb24tbWVtb3J5Iik7CiAJaWYgKG5wKSB7Ci0JCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnNpemU7CisJCWNvbnN0IF9fYmU2NCAqc2l6ZTsKIAogCQlzaXplID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLGxtYi1zaXplIiwgTlVMTCk7Ci0JCW1lbWJsb2NrX3NpemUgPSBzaXplID8gKnNpemUgOiAwOwotCisJCWlmIChzaXplKQorCQkJbWVtYmxvY2tfc2l6ZSA9IGJlNjRfdG9fY3B1cChzaXplKTsKIAkJb2Zfbm9kZV9wdXQobnApOwotCX0gZWxzZSB7CisJfSBlbHNlICBpZiAobWFjaGluZV9pcyhwc2VyaWVzKSkgeworCQkvKiBUaGlzIGZhbGxiYWNrIHJlYWxseSBvbmx5IGFwcGxpZXMgdG8gcHNlcmllcyAqLwogCQl1bnNpZ25lZCBpbnQgbWVtemVyb19zaXplID0gMDsKLQkJY29uc3QgdW5zaWduZWQgaW50ICpyZWdzOwogCiAJCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9tZW1vcnlAMCIpOwogCQlpZiAobnApIHsKLQkJCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKLQkJCW1lbXplcm9fc2l6ZSA9IHJlZ3MgPyByZWdzWzNdIDogMDsKKwkJCWlmICghb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpKQorCQkJCW1lbXplcm9fc2l6ZSA9IHJlc291cmNlX3NpemUoJnIpOwogCQkJb2Zfbm9kZV9wdXQobnApOwogCQl9CiAKQEAgLTUwLDE2ICs1MywyMSBAQAogCQkJc3ByaW50ZihidWYsICIvbWVtb3J5QCV4IiwgbWVtemVyb19zaXplKTsKIAkJCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoYnVmKTsKIAkJCWlmIChucCkgewotCQkJCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKLQkJCQltZW1ibG9ja19zaXplID0gcmVncyA/IHJlZ3NbM10gOiAwOworCQkJCWlmICghb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpKQorCQkJCQltZW1ibG9ja19zaXplID0gcmVzb3VyY2Vfc2l6ZSgmcik7CiAJCQkJb2Zfbm9kZV9wdXQobnApOwogCQkJfQogCQl9CiAJfQotCiAJcmV0dXJuIG1lbWJsb2NrX3NpemU7CiB9CiAKKy8qIFdBUk5JTkc6IFRoaXMgaXMgZ29pbmcgdG8gb3ZlcnJpZGUgdGhlIGdlbmVyaWMgZGVmaW5pdGlvbiB3aGVuZXZlcgorICogcHNlcmllcyBpcyBidWlsdC1pbiByZWdhcmRsZXNzIG9mIHdoYXQgcGxhdGZvcm0gaXMgYWN0aXZlIGF0IGJvb3QKKyAqIHRpbWUuIFRoaXMgaXMgZmluZSBmb3Igbm93IGFzIHRoaXMgaXMgdGhlIG9ubHkgIm9wdGlvbiIgYW5kIGl0CisgKiBzaG91bGQgd29yayBldmVyeXdoZXJlLiBJZiBub3QsIHdlJ2xsIGhhdmUgdG8gdHVybiB0aGlzIGludG8gYQorICogcHBjX21kLiBjYWxsYmFjaworICovCiB1bnNpZ25lZCBsb25nIG1lbW9yeV9ibG9ja19zaXplX2J5dGVzKHZvaWQpCiB7CiAJcmV0dXJuIGdldF9tZW1ibG9ja19zaXplKCk7CkBAIC0xOTcsMjcgKzIwNSwyMSBAQAogc3RhdGljIGludCBwc2VyaWVzX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpub2RlKQogewotCWludCBlcnIgPSBOT1RJRllfT0s7CisJaW50IGVyciA9IDA7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgUFNFUklFU19SRUNPTkZJR19BREQ6Ci0JCWlmIChwc2VyaWVzX2FkZF9tZW1vcnkobm9kZSkpCi0JCQllcnIgPSBOT1RJRllfQkFEOworCQllcnIgPSBwc2VyaWVzX2FkZF9tZW1vcnkobm9kZSk7CiAJCWJyZWFrOwogCWNhc2UgUFNFUklFU19SRUNPTkZJR19SRU1PVkU6Ci0JCWlmIChwc2VyaWVzX3JlbW92ZV9tZW1vcnkobm9kZSkpCi0JCQllcnIgPSBOT1RJRllfQkFEOworCQllcnIgPSBwc2VyaWVzX3JlbW92ZV9tZW1vcnkobm9kZSk7CiAJCWJyZWFrOwogCWNhc2UgUFNFUklFU19EUkNPTkZfTUVNX0FERDoKIAljYXNlIFBTRVJJRVNfRFJDT05GX01FTV9SRU1PVkU6Ci0JCWlmIChwc2VyaWVzX2RyY29uZl9tZW1vcnkobm9kZSwgYWN0aW9uKSkKLQkJCWVyciA9IE5PVElGWV9CQUQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVyciA9IE5PVElGWV9ET05FOworCQllcnIgPSBwc2VyaWVzX2RyY29uZl9tZW1vcnkobm9kZSwgYWN0aW9uKTsKIAkJYnJlYWs7CiAJfQotCXJldHVybiBlcnI7CisJcmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oZXJyKTsKIH0KIAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwc2VyaWVzX21lbV9uYiA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNvbnNvbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNvbnNvbGUuYwppbmRleCAzZjZhODliLi4wNDFlODdjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZjb25zb2xlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Y29uc29sZS5jCkBAIC03Myw3ICs3Myw3IEBACiAJaWYgKHJldCA9PSBIX1NVQ0NFU1MpCiAJCXJldHVybiBjb3VudDsKIAlpZiAocmV0ID09IEhfQlVTWSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUFHQUlOOwogCXJldHVybiAtRUlPOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwppbmRleCAzOWU2ZTBhLi5mNzIwNWQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKQEAgLTUyLDE5NyArNTIsNiBAQAogCiBleHRlcm4gdm9pZCBwU2VyaWVzX2ZpbmRfc2VyaWFsX3BvcnQodm9pZCk7CiAKLQotc3RhdGljIGludCB2dGVybW5vOwkvKiB2aXJ0dWFsIHRlcm1pbmFsIyBmb3IgdWRiZyAgKi8KLQotI2RlZmluZSBfX0FMSUdORURfXyBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhzaXplb2YobG9uZykpKSkKLXN0YXRpYyB2b2lkIHVkYmdfaHZzaV9wdXRjKGNoYXIgYykKLXsKLQkvKiBwYWNrZXQncyBzZXFubyBpc24ndCB1c2VkIGFueXdheXMgKi8KLQl1aW50OF90IHBhY2tldFtdIF9fQUxJR05FRF9fID0geyAweGZmLCA1LCAwLCAwLCBjIH07Ci0JaW50IHJjOwotCi0JaWYgKGMgPT0gJ1xuJykKLQkJdWRiZ19odnNpX3B1dGMoJ1xyJyk7Ci0KLQlkbyB7Ci0JCXJjID0gcGxwYXJfcHV0X3Rlcm1fY2hhcih2dGVybW5vLCBzaXplb2YocGFja2V0KSwgcGFja2V0KTsKLQl9IHdoaWxlIChyYyA9PSBIX0JVU1kpOwotfQotCi1zdGF0aWMgbG9uZyBodnNpX3VkYmdfYnVmX2xlbjsKLXN0YXRpYyB1aW50OF90IGh2c2lfdWRiZ19idWZbMjU2XTsKLQotc3RhdGljIGludCB1ZGJnX2h2c2lfZ2V0Y19wb2xsKHZvaWQpCi17Ci0JdW5zaWduZWQgY2hhciBjaDsKLQlpbnQgcmMsIGk7Ci0KLQlpZiAoaHZzaV91ZGJnX2J1Zl9sZW4gPT0gMCkgewotCQlyYyA9IHBscGFyX2dldF90ZXJtX2NoYXIodnRlcm1ubywgJmh2c2lfdWRiZ19idWZfbGVuLCBodnNpX3VkYmdfYnVmKTsKLQkJaWYgKHJjICE9IEhfU1VDQ0VTUyB8fCBodnNpX3VkYmdfYnVmWzBdICE9IDB4ZmYpIHsKLQkJCS8qIGJhZCByZWFkIG9yIG5vbi1kYXRhIHBhY2tldCAqLwotCQkJaHZzaV91ZGJnX2J1Zl9sZW4gPSAwOwotCQl9IGVsc2UgewotCQkJLyogcmVtb3ZlIHRoZSBwYWNrZXQgaGVhZGVyICovCi0JCQlmb3IgKGkgPSA0OyBpIDwgaHZzaV91ZGJnX2J1Zl9sZW47IGkrKykKLQkJCQlodnNpX3VkYmdfYnVmW2ktNF0gPSBodnNpX3VkYmdfYnVmW2ldOwotCQkJaHZzaV91ZGJnX2J1Zl9sZW4gLT0gNDsKLQkJfQotCX0KLQotCWlmIChodnNpX3VkYmdfYnVmX2xlbiA8PSAwIHx8IGh2c2lfdWRiZ19idWZfbGVuID4gMjU2KSB7Ci0JCS8qIG5vIGRhdGEgcmVhZHkgKi8KLQkJaHZzaV91ZGJnX2J1Zl9sZW4gPSAwOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JY2ggPSBodnNpX3VkYmdfYnVmWzBdOwotCS8qIHNoaWZ0IHJlbWFpbmluZyBkYXRhIGRvd24gKi8KLQlmb3IgKGkgPSAxOyBpIDwgaHZzaV91ZGJnX2J1Zl9sZW47IGkrKykgewotCQlodnNpX3VkYmdfYnVmW2ktMV0gPSBodnNpX3VkYmdfYnVmW2ldOwotCX0KLQlodnNpX3VkYmdfYnVmX2xlbi0tOwotCi0JcmV0dXJuIGNoOwotfQotCi1zdGF0aWMgaW50IHVkYmdfaHZzaV9nZXRjKHZvaWQpCi17Ci0JaW50IGNoOwotCWZvciAoOzspIHsKLQkJY2ggPSB1ZGJnX2h2c2lfZ2V0Y19wb2xsKCk7Ci0JCWlmIChjaCA9PSAtMSkgewotCQkJLyogVGhpcyBzaG91bGRuJ3QgYmUgbmVlZGVkLi4uYnV0Li4uICovCi0JCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGRlbGF5OwotCQkJZm9yIChkZWxheT0wOyBkZWxheSA8IDIwMDAwMDA7IGRlbGF5KyspCi0JCQkJOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGNoOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB1ZGJnX3B1dGNMUChjaGFyIGMpCi17Ci0JY2hhciBidWZbMTZdOwotCXVuc2lnbmVkIGxvbmcgcmM7Ci0KLQlpZiAoYyA9PSAnXG4nKQotCQl1ZGJnX3B1dGNMUCgnXHInKTsKLQotCWJ1ZlswXSA9IGM7Ci0JZG8gewotCQlyYyA9IHBscGFyX3B1dF90ZXJtX2NoYXIodnRlcm1ubywgMSwgYnVmKTsKLQl9IHdoaWxlKHJjID09IEhfQlVTWSk7Ci19Ci0KLS8qIEJ1ZmZlcmVkIGNoYXJzIGdldGMgKi8KLXN0YXRpYyBsb25nIGluYnVmbGVuOwotc3RhdGljIGxvbmcgaW5idWZbMl07CS8qIG11c3QgYmUgMiBsb25ncyAqLwotCi1zdGF0aWMgaW50IHVkYmdfZ2V0Y19wb2xsTFAodm9pZCkKLXsKLQkvKiBUaGUgaW50ZXJmYWNlIGlzIHRyaWNreSBiZWNhdXNlIGl0IG1heSByZXR1cm4gdXAgdG8gMTYgY2hhcnMuCi0JICogV2Ugc2F2ZSB0aGVtIHN0YXRpY2FsbHkgZm9yIGZ1dHVyZSBjYWxscyB0byB1ZGJnX2dldGMoKS4KLQkgKi8KLQljaGFyIGNoLCAqYnVmID0gKGNoYXIgKilpbmJ1ZjsKLQlpbnQgaTsKLQlsb25nIHJjOwotCWlmIChpbmJ1ZmxlbiA9PSAwKSB7Ci0JCS8qIGdldCBzb21lIG1vcmUgY2hhcnMuICovCi0JCWluYnVmbGVuID0gMDsKLQkJcmMgPSBwbHBhcl9nZXRfdGVybV9jaGFyKHZ0ZXJtbm8sICZpbmJ1ZmxlbiwgYnVmKTsKLQkJaWYgKHJjICE9IEhfU1VDQ0VTUykKLQkJCWluYnVmbGVuID0gMDsJLyogb3RoZXJ3aXNlIGluYnVmbGVuIGlzIGdhcmJhZ2UgKi8KLQl9Ci0JaWYgKGluYnVmbGVuIDw9IDAgfHwgaW5idWZsZW4gPiAxNikgewotCQkvKiBDYXRjaCBlcnJvciBjYXNlIGFzIHdlbGwgYXMgb3RoZXIgb2RkaXRpZXMgKGNvcnJ1cHRpb24pICovCi0JCWluYnVmbGVuID0gMDsKLQkJcmV0dXJuIC0xOwotCX0KLQljaCA9IGJ1ZlswXTsKLQlmb3IgKGkgPSAxOyBpIDwgaW5idWZsZW47IGkrKykJLyogc2h1ZmZsZSB0aGVtIGRvd24uICovCi0JCWJ1ZltpLTFdID0gYnVmW2ldOwotCWluYnVmbGVuLS07Ci0JcmV0dXJuIGNoOwotfQotCi1zdGF0aWMgaW50IHVkYmdfZ2V0Y0xQKHZvaWQpCi17Ci0JaW50IGNoOwotCWZvciAoOzspIHsKLQkJY2ggPSB1ZGJnX2dldGNfcG9sbExQKCk7Ci0JCWlmIChjaCA9PSAtMSkgewotCQkJLyogVGhpcyBzaG91bGRuJ3QgYmUgbmVlZGVkLi4uYnV0Li4uICovCi0JCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGRlbGF5OwotCQkJZm9yIChkZWxheT0wOyBkZWxheSA8IDIwMDAwMDA7IGRlbGF5KyspCi0JCQkJOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGNoOwotCQl9Ci0JfQotfQotCi0vKiBjYWxsIHRoaXMgZnJvbSBlYXJseV9pbml0KCkgZm9yIGEgd29ya2luZyBkZWJ1ZyBjb25zb2xlIG9uCi0gKiB2dGVybSBjYXBhYmxlIExQQVIgbWFjaGluZXMKLSAqLwotdm9pZCBfX2luaXQgdWRiZ19pbml0X2RlYnVnX2xwYXIodm9pZCkKLXsKLQl2dGVybW5vID0gMDsKLQl1ZGJnX3B1dGMgPSB1ZGJnX3B1dGNMUDsKLQl1ZGJnX2dldGMgPSB1ZGJnX2dldGNMUDsKLQl1ZGJnX2dldGNfcG9sbCA9IHVkYmdfZ2V0Y19wb2xsTFA7Ci0KLQlyZWdpc3Rlcl9lYXJseV91ZGJnX2NvbnNvbGUoKTsKLX0KLQotLyogcmV0dXJucyAwIGlmIGNvdWxkbid0IGZpbmQgb3IgdXNlIC9jaG9zZW4vc3Rkb3V0IGFzIGNvbnNvbGUgKi8KLXZvaWQgX19pbml0IGZpbmRfdWRiZ192dGVybSh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3Rkb3V0X25vZGU7Ci0JY29uc3QgdTMyICp0ZXJtbm87Ci0JY29uc3QgY2hhciAqbmFtZTsKLQotCS8qIGZpbmQgdGhlIGJvb3QgY29uc29sZSBmcm9tIC9jaG9zZW4vc3Rkb3V0ICovCi0JaWYgKCFvZl9jaG9zZW4pCi0JCXJldHVybjsKLQluYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7Ci0JaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCXN0ZG91dF9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgobmFtZSk7Ci0JaWYgKCFzdGRvdXRfbm9kZSkKLQkJcmV0dXJuOwotCW5hbWUgPSBvZl9nZXRfcHJvcGVydHkoc3Rkb3V0X25vZGUsICJuYW1lIiwgTlVMTCk7Ci0JaWYgKCFuYW1lKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInN0ZG91dCBub2RlIG1pc3NpbmcgJ25hbWUnIHByb3BlcnR5IVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIENoZWNrIGlmIGl0J3MgYSB2aXJ0dWFsIHRlcm1pbmFsICovCi0JaWYgKHN0cm5jbXAobmFtZSwgInZ0eSIsIDMpICE9IDApCi0JCWdvdG8gb3V0OwotCXRlcm1ubyA9IG9mX2dldF9wcm9wZXJ0eShzdGRvdXRfbm9kZSwgInJlZyIsIE5VTEwpOwotCWlmICh0ZXJtbm8gPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0JdnRlcm1ubyA9IHRlcm1ub1swXTsKLQotCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzdGRvdXRfbm9kZSwgImh2dGVybTEiKSkgewotCQl1ZGJnX3B1dGMgPSB1ZGJnX3B1dGNMUDsKLQkJdWRiZ19nZXRjID0gdWRiZ19nZXRjTFA7Ci0JCXVkYmdfZ2V0Y19wb2xsID0gdWRiZ19nZXRjX3BvbGxMUDsKLQkJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJodmMiLCB0ZXJtbm9bMF0gJiAweGZmLCBOVUxMKTsKLQl9IGVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHN0ZG91dF9ub2RlLCAiaHZ0ZXJtLXByb3RvY29sIikpIHsKLQkJdnRlcm1ubyA9IHRlcm1ub1swXTsKLQkJdWRiZ19wdXRjID0gdWRiZ19odnNpX3B1dGM7Ci0JCXVkYmdfZ2V0YyA9IHVkYmdfaHZzaV9nZXRjOwotCQl1ZGJnX2dldGNfcG9sbCA9IHVkYmdfaHZzaV9nZXRjX3BvbGw7Ci0JCWFkZF9wcmVmZXJyZWRfY29uc29sZSgiaHZzaSIsIHRlcm1ub1swXSAmIDB4ZmYsIE5VTEwpOwotCX0KLW91dDoKLQlvZl9ub2RlX3B1dChzdGRvdXRfbm9kZSk7Ci19Ci0KIHZvaWQgdnBhX2luaXQoaW50IGNwdSkKIHsKIAlpbnQgaHdjcHUgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BzZXJpZXMuaAppbmRleCBlOWY2ZDI4Li4yNGM3MTYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wc2VyaWVzLmgKQEAgLTQ3LDcgKzQ3LDggQEAKIC8qIFBvd2Vyb24gZmxhZyB1c2VkIGZvciBlbmFibGluZyBhdXRvIHVwcyByZXN0YXJ0ICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBydGFzX3Bvd2Vyb25fYXV0bzsKIAotZXh0ZXJuIHZvaWQgZmluZF91ZGJnX3Z0ZXJtKHZvaWQpOworLyogUHJvdmlkZWQgYnkgSFZDIFZJTyAqLworZXh0ZXJuIHZvaWQgaHZjX3Zpb19pbml0X2Vhcmx5KHZvaWQpOwogCiAvKiBEeW5hbWljIGxvZ2ljYWwgUGFydGl0aW9uaW5nL01vYmlsaXR5ICovCiBleHRlcm4gdm9pZCBkbHBhcl9mcmVlX2NjX25vZGVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yZWNvbmZpZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKaW5kZXggMWRlMmNiYi4uMTY4NjUxYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAlyZXR1cm4gcGFyZW50OwogfQogCi1CTE9DS0lOR19OT1RJRklFUl9IRUFEKHBTZXJpZXNfcmVjb25maWdfY2hhaW4pOworc3RhdGljIEJMT0NLSU5HX05PVElGSUVSX0hFQUQocFNlcmllc19yZWNvbmZpZ19jaGFpbik7CiAKIGludCBwU2VyaWVzX3JlY29uZmlnX25vdGlmaWVyX3JlZ2lzdGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCiB7CkBAIC0xMDksNiArMTA5LDE0IEBACiAJYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmcFNlcmllc19yZWNvbmZpZ19jaGFpbiwgbmIpOwogfQogCitpbnQgcFNlcmllc19yZWNvbmZpZ19ub3RpZnkodW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKnApCit7CisJaW50IGVyciA9IGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnBTZXJpZXNfcmVjb25maWdfY2hhaW4sCisJCQkJCQlhY3Rpb24sIHApOworCisJcmV0dXJuIG5vdGlmaWVyX3RvX2Vycm5vKGVycik7Cit9CisKIHN0YXRpYyBpbnQgcFNlcmllc19yZWNvbmZpZ19hZGRfbm9kZShjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3BsaXN0KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CkBAIC0xMzIsMTEgKzE0MCw5IEBACiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKLQllcnIgPSBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZwU2VyaWVzX3JlY29uZmlnX2NoYWluLAotCQkJCSAgUFNFUklFU19SRUNPTkZJR19BREQsIG5wKTsKLQlpZiAoZXJyID09IE5PVElGWV9CQUQpIHsKKwllcnIgPSBwU2VyaWVzX3JlY29uZmlnX25vdGlmeShQU0VSSUVTX1JFQ09ORklHX0FERCwgbnApOworCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWRkIGRldmljZSBub2RlICVzXG4iLCBwYXRoKTsKLQkJZXJyID0gLUVOT01FTTsgLyogRm9yIG5vdywgc2FmZSB0byBhc3N1bWUga21hbGxvYyBmYWlsdXJlICovCiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKQEAgLTE3Myw4ICsxNzksNyBAQAogCiAJcmVtb3ZlX25vZGVfcHJvY19lbnRyaWVzKG5wKTsKIAotCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnBTZXJpZXNfcmVjb25maWdfY2hhaW4sCi0JCQkgICAgUFNFUklFU19SRUNPTkZJR19SRU1PVkUsIG5wKTsKKwlwU2VyaWVzX3JlY29uZmlnX25vdGlmeShQU0VSSUVTX1JFQ09ORklHX1JFTU9WRSwgbnApOwogCW9mX2RldGFjaF9ub2RlKG5wKTsKIAogCW9mX25vZGVfcHV0KHBhcmVudCk7CkBAIC00NzIsMTEgKzQ3NywxMCBAQAogCQllbHNlCiAJCQlhY3Rpb24gPSBQU0VSSUVTX0RSQ09ORl9NRU1fUkVNT1ZFOwogCi0JCXJjID0gYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmcFNlcmllc19yZWNvbmZpZ19jaGFpbiwKLQkJCQkJCSAgYWN0aW9uLCB2YWx1ZSk7Ci0JCWlmIChyYyA9PSBOT1RJRllfQkFEKSB7Ci0JCQlyYyA9IHByb21fdXBkYXRlX3Byb3BlcnR5KG5wLCBvbGRwcm9wLCBuZXdwcm9wKTsKLQkJCXJldHVybiAtRU5PTUVNOworCQlyYyA9IHBTZXJpZXNfcmVjb25maWdfbm90aWZ5KGFjdGlvbiwgdmFsdWUpOworCQlpZiAocmMpIHsKKwkJCXByb21fdXBkYXRlX3Byb3BlcnR5KG5wLCBvbGRwcm9wLCBuZXdwcm9wKTsKKwkJCXJldHVybiByYzsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwppbmRleCA1OTNhY2NlLi5kMDBlNTI5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwpAQCAtNTEyLDkgKzUxMiwxMCBAQAogewogCXByX2RlYnVnKCIgLT4gcFNlcmllc19pbml0X2Vhcmx5KClcbiIpOwogCisjaWZkZWYgQ09ORklHX0hWQ19DT05TT0xFCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCi0JCWZpbmRfdWRiZ192dGVybSgpOwotCisJCWh2Y192aW9faW5pdF9lYXJseSgpOworI2VuZGlmCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfREFCUikpCiAJCXBwY19tZC5zZXRfZGFiciA9IHBzZXJpZXNfc2V0X2RhYnI7CiAJZWxzZSBpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9YREFCUikpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMKaW5kZXggZmJmZmQ3ZS4uMTY3MmRiMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYwpAQCAtNDQsNyArNDQsNiBAQAogI2luY2x1ZGUgPGFzbS9tcGljLmg+CiAjaW5jbHVkZSA8YXNtL3Zkc29fZGF0YXBhZ2UuaD4KICNpbmNsdWRlIDxhc20vY3B1dGhyZWFkcy5oPgotI2luY2x1ZGUgPGFzbS9tcGljLmg+CiAjaW5jbHVkZSA8YXNtL3hpY3MuaD4KIAogI2luY2x1ZGUgInBscGFyX3dyYXBwZXJzLmgiCkBAIC0yMDcsNyArMjA2LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc21wX29wc190IHBTZXJpZXNfeGljc19zbXBfb3BzID0gewotCS5tZXNzYWdlX3Bhc3MJPSBzbXBfbXV4ZWRfaXBpX21lc3NhZ2VfcGFzcywKKwkubWVzc2FnZV9wYXNzCT0gTlVMTCwJLyogVXNlIHNtcF9tdXhlZF9pcGlfbWVzc2FnZV9wYXNzICovCiAJLmNhdXNlX2lwaQk9IE5VTEwsCS8qIEZpbGxlZCBhdCBydW50aW1lIGJ5IHhpY3Nfc21wX3Byb2JlKCkgKi8KIAkucHJvYmUJCT0geGljc19zbXBfcHJvYmUsCiAJLmtpY2tfY3B1CT0gc21wX3BTZXJpZXNfa2lja19jcHUsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3NtcC5jCmluZGV4IDlkMjBmYTkuLjcxYmQxMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3NtcC5jCkBAIC03NSw3ICs3NSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc21wX29wc190IGEyX3NtcF9vcHMgPSB7Ci0JLm1lc3NhZ2VfcGFzcwk9IHNtcF9tdXhlZF9pcGlfbWVzc2FnZV9wYXNzLAorCS5tZXNzYWdlX3Bhc3MJPSBOVUxMLAkvKiBVc2Ugc21wX211eGVkX2lwaV9tZXNzYWdlX3Bhc3MgKi8KIAkuY2F1c2VfaXBpCT0gZG9vcmJlbGxfY2F1c2VfaXBpLAogCS5wcm9iZQkJPSBzbXBfYTJfcHJvYmUsCiAJLmtpY2tfY3B1CT0gc21wX2EyX2tpY2tfY3B1LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKaW5kZXggMGVmYTk5MC4uY2Y3MzZjYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCiBtcGljLW1zaS1vYmotJChDT05GSUdfUENJX01TSSkJKz0gbXBpY19tc2kubyBtcGljX3UzbXNpLm8gbXBpY19wYXNlbWlfbXNpLm8KIG9iai0kKENPTkZJR19NUElDKQkJKz0gbXBpYy5vICQobXBpYy1tc2ktb2JqLXkpCitvYmotJChDT05GSUdfUFBDX0VQQVBSX0hWX1BJQykJKz0gZWh2X3BpYy5vCiBmc2wtbXNpLW9iai0kKENPTkZJR19QQ0lfTVNJKQkrPSBmc2xfbXNpLm8KIG9iai0kKENPTkZJR19QUENfTVNJX0JJVE1BUCkJKz0gbXNpX2JpdG1hcC5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKaW5kZXggYmQwZDU0MC4uMjY1ZjBmMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQliYW5rLT5zaXplID0gcmVzb3VyY2UuZW5kIC0gcmVzb3VyY2Uuc3RhcnQgKyAxOworCWJhbmstPnNpemUgPSByZXNvdXJjZV9zaXplKCZyZXNvdXJjZSk7CiAKIAlpZiAoYmFuay0+c2l6ZSA9PSAwKSB7CiAJCWRldl9lcnIoJmRldmljZS0+ZGV2LCAiTm8gRERSMiBtZW1vcnkgZm91bmQgZm9yICVzJWRcbiIsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtMS5jCmluZGV4IDM1MDc4N2MuLjVkN2Q1OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtMS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtMS5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVuZDsKIAotCWNwaWNfcmVnID0gaW9yZW1hcChyZXMuc3RhcnQsIHJlcy5lbmQgLSByZXMuc3RhcnQgKyAxKTsKKwljcGljX3JlZyA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZXMpKTsKIAlpZiAoY3BpY19yZWcgPT0gTlVMTCkKIAkJZ290byBlbmQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG1fY29tbW9uLmMKaW5kZXggMmI2OWFhMC4uZDU1ZDBhZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG1fY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG1fY29tbW9uLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCQkJbWF4ID0gci5lbmQ7CiAKIAkJcmhfYXR0YWNoX3JlZ2lvbigmY3BtX211cmFtX2luZm8sIHIuc3RhcnQgLSBtdXJhbV9wYmFzZSwKLQkJICAgICAgICAgICAgICAgICByLmVuZCAtIHIuc3RhcnQgKyAxKTsKKwkJCQkgcmVzb3VyY2Vfc2l6ZSgmcikpOwogCX0KIAogCW11cmFtX3ZiYXNlID0gaW9yZW1hcChtdXJhbV9wYmFzZSwgbWF4IC0gbXVyYW1fcGJhc2UgKyAxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydF9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKaW5kZXggOGU5ZTA2YS4uNGYyNjgwZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCQkJCQkgREFSVE1BUF9SUE5NQVNLKTsKIAogCS8qIE1hcCBpbiBEQVJUIHJlZ2lzdGVycyAqLwotCWRhcnQgPSBpb3JlbWFwKHIuc3RhcnQsIHIuZW5kIC0gci5zdGFydCArIDEpOworCWRhcnQgPSBpb3JlbWFwKHIuc3RhcnQsIHJlc291cmNlX3NpemUoJnIpKTsKIAlpZiAoZGFydCA9PSBOVUxMKQogCQlwYW5pYygiREFSVDogQ2Fubm90IG1hcCByZWdpc3RlcnMhIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZWh2X3BpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9laHZfcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxYTVkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZWh2X3BpYy5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogIERyaXZlciBmb3IgZVBBUFIgRW1iZWRkZWQgSHlwZXJ2aXNvciBQSUMKKyAqCisgKiAgQ29weXJpZ2h0IDIwMDgtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqICBBdXRob3I6IEFzaGlzaCBLYWxyYSA8YXNoaXNoLmthbHJhQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2Vodl9waWMuaD4KKyNpbmNsdWRlIDxhc20vZnNsX2hjYWxscy5oPgorCisjaW5jbHVkZSAiLi4vLi4vLi4va2VybmVsL2lycS9zZXR0aW5ncy5oIgorCitzdGF0aWMgc3RydWN0IGVodl9waWMgKmdsb2JhbF9laHZfcGljOworc3RhdGljIERFRklORV9TUElOTE9DSyhlaHZfcGljX2xvY2spOworCitzdGF0aWMgdTMyIGh3aXJxX2ludHNwZWNbTlJfRUhWX1BJQ19JTlRTXTsKK3N0YXRpYyB1MzIgX19pb21lbSAqbXBpY19wZXJjcHVfYmFzZV92YWRkcjsKKworI2RlZmluZSBJUlFfVFlQRV9NUElDX0RJUkVDVCA0CisjZGVmaW5lIE1QSUNfRU9JICAweDAwQjAKKworLyoKKyAqIExpbnV4IGRlc2NyaXB0b3IgbGV2ZWwgY2FsbGJhY2tzCisgKi8KKwordm9pZCBlaHZfcGljX3VubWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQoreworCXVuc2lnbmVkIGludCBzcmMgPSB2aXJxX3RvX2h3KGQtPmlycSk7CisKKwlldl9pbnRfc2V0X21hc2soc3JjLCAwKTsKK30KKwordm9pZCBlaHZfcGljX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1bnNpZ25lZCBpbnQgc3JjID0gdmlycV90b19odyhkLT5pcnEpOworCisJZXZfaW50X3NldF9tYXNrKHNyYywgMSk7Cit9CisKK3ZvaWQgZWh2X3BpY19lbmRfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1bnNpZ25lZCBpbnQgc3JjID0gdmlycV90b19odyhkLT5pcnEpOworCisJZXZfaW50X2VvaShzcmMpOworfQorCit2b2lkIGVodl9waWNfZGlyZWN0X2VuZF9pcnEoc3RydWN0IGlycV9kYXRhICpkKQoreworCW91dF9iZTMyKG1waWNfcGVyY3B1X2Jhc2VfdmFkZHIgKyBNUElDX0VPSSAvIDQsIDApOworfQorCitpbnQgZWh2X3BpY19zZXRfYWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpkLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCwKKwkJCSBib29sIGZvcmNlKQoreworCXVuc2lnbmVkIGludCBzcmMgPSB2aXJxX3RvX2h3KGQtPmlycSk7CisJdW5zaWduZWQgaW50IGNvbmZpZywgcHJpbywgY3B1X2Rlc3Q7CisJaW50IGNwdWlkID0gaXJxX2Nob29zZV9jcHUoZGVzdCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlaHZfcGljX2xvY2ssIGZsYWdzKTsKKwlldl9pbnRfZ2V0X2NvbmZpZyhzcmMsICZjb25maWcsICZwcmlvLCAmY3B1X2Rlc3QpOworCWV2X2ludF9zZXRfY29uZmlnKHNyYywgY29uZmlnLCBwcmlvLCBjcHVpZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWh2X3BpY19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBlaHZfcGljX3R5cGVfdG9fdmVjcHJpKHVuc2lnbmVkIGludCB0eXBlKQoreworCS8qIE5vdyBjb252ZXJ0IHNlbnNlIHZhbHVlICovCisKKwlzd2l0Y2ggKHR5cGUgJiBJUlFfVFlQRV9TRU5TRV9NQVNLKSB7CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJcmV0dXJuIEVIVl9QSUNfSU5GTyhWRUNQUklfU0VOU0VfRURHRSkgfAorCQkgICAgICAgRUhWX1BJQ19JTkZPKFZFQ1BSSV9QT0xBUklUWV9QT1NJVElWRSk7CisKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJcmV0dXJuIEVIVl9QSUNfSU5GTyhWRUNQUklfU0VOU0VfRURHRSkgfAorCQkgICAgICAgRUhWX1BJQ19JTkZPKFZFQ1BSSV9QT0xBUklUWV9ORUdBVElWRSk7CisKKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6CisJCXJldHVybiBFSFZfUElDX0lORk8oVkVDUFJJX1NFTlNFX0xFVkVMKSB8CisJCSAgICAgICBFSFZfUElDX0lORk8oVkVDUFJJX1BPTEFSSVRZX1BPU0lUSVZFKTsKKworCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgorCWRlZmF1bHQ6CisJCXJldHVybiBFSFZfUElDX0lORk8oVkVDUFJJX1NFTlNFX0xFVkVMKSB8CisJCSAgICAgICBFSFZfUElDX0lORk8oVkVDUFJJX1BPTEFSSVRZX05FR0FUSVZFKTsKKwl9Cit9CisKK2ludCBlaHZfcGljX3NldF9pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCit7CisJdW5zaWduZWQgaW50IHNyYyA9IHZpcnFfdG9faHcoZC0+aXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhkLT5pcnEpOworCXVuc2lnbmVkIGludCB2ZWNwcmksIHZvbGQsIHZuZXcsIHByaW8sIGNwdV9kZXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZmxvd190eXBlID09IElSUV9UWVBFX05PTkUpCisJCWZsb3dfdHlwZSA9IElSUV9UWVBFX0xFVkVMX0xPVzsKKworCWlycV9zZXR0aW5nc19jbHJfbGV2ZWwoZGVzYyk7CisJaXJxX3NldHRpbmdzX3NldF90cmlnZ2VyX21hc2soZGVzYywgZmxvd190eXBlKTsKKwlpZiAoZmxvd190eXBlICYgKElSUV9UWVBFX0xFVkVMX0hJR0ggfCBJUlFfVFlQRV9MRVZFTF9MT1cpKQorCQlpcnFfc2V0dGluZ3Nfc2V0X2xldmVsKGRlc2MpOworCisJdmVjcHJpID0gZWh2X3BpY190eXBlX3RvX3ZlY3ByaShmbG93X3R5cGUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVodl9waWNfbG9jaywgZmxhZ3MpOworCWV2X2ludF9nZXRfY29uZmlnKHNyYywgJnZvbGQsICZwcmlvLCAmY3B1X2Rlc3QpOworCXZuZXcgPSB2b2xkICYgfihFSFZfUElDX0lORk8oVkVDUFJJX1BPTEFSSVRZX01BU0spIHwKKwkJCUVIVl9QSUNfSU5GTyhWRUNQUklfU0VOU0VfTUFTSykpOworCXZuZXcgfD0gdmVjcHJpOworCisJLyoKKwkgKiBUT0RPIDogQWRkIHNwZWNpZmljIGludGVyZmFjZSBjYWxsIGZvciBwbGF0Zm9ybSB0byBzZXQKKwkgKiBpbmRpdmlkdWFsIGludGVycnVwdCBwcmlvcml0aWVzLgorCSAqIHBsYXRmb3JtIGN1cnJlbnRseSB1c2luZyBzdGF0aWMvZGVmYXVsdCBwcmlvcml0eSBmb3IgYWxsIGludHMKKwkgKi8KKworCXByaW8gPSA4OworCisJZXZfaW50X3NldF9jb25maWcoc3JjLCB2ZWNwcmksIHByaW8sIGNwdV9kZXN0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVodl9waWNfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGVodl9waWNfaXJxX2NoaXAgPSB7CisJLmlycV9tYXNrCT0gZWh2X3BpY19tYXNrX2lycSwKKwkuaXJxX3VubWFzawk9IGVodl9waWNfdW5tYXNrX2lycSwKKwkuaXJxX2VvaQk9IGVodl9waWNfZW5kX2lycSwKKwkuaXJxX3NldF90eXBlCT0gZWh2X3BpY19zZXRfaXJxX3R5cGUsCit9OworCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGVodl9waWNfZGlyZWN0X2VvaV9pcnFfY2hpcCA9IHsKKwkuaXJxX21hc2sJPSBlaHZfcGljX21hc2tfaXJxLAorCS5pcnFfdW5tYXNrCT0gZWh2X3BpY191bm1hc2tfaXJxLAorCS5pcnFfZW9pCT0gZWh2X3BpY19kaXJlY3RfZW5kX2lycSwKKwkuaXJxX3NldF90eXBlCT0gZWh2X3BpY19zZXRfaXJxX3R5cGUsCit9OworCisvKiBSZXR1cm4gYW4gaW50ZXJydXB0IHZlY3RvciBvciBOT19JUlEgaWYgbm8gaW50ZXJydXB0IGlzIHBlbmRpbmcuICovCit1bnNpZ25lZCBpbnQgZWh2X3BpY19nZXRfaXJxKHZvaWQpCit7CisJaW50IGlycTsKKworCUJVR19PTihnbG9iYWxfZWh2X3BpYyA9PSBOVUxMKTsKKworCWlmIChnbG9iYWxfZWh2X3BpYy0+Y29yZWludF9mbGFnKQorCQlpcnEgPSBtZnNwcihTUFJOX0VQUik7IC8qIGlmIGNvcmUgaW50IG1vZGUgKi8KKwllbHNlCisJCWV2X2ludF9pYWNrKDAsICZpcnEpOyAvKiBsZWdhY3kgbW9kZSAqLworCisJaWYgKGlycSA9PSAweEZGRkYpICAgIC8qIDB4RkZGRiAtLT4gbm8gaXJxIGlzIHBlbmRpbmcgKi8KKwkJcmV0dXJuIE5PX0lSUTsKKworCS8qCisJICogdGhpcyB3aWxsIGFsc28gc2V0dXAgcmV2bWFwW10gaW4gdGhlIHNsb3cgcGF0aCBmb3IgdGhlIGZpcnN0CisJICogdGltZSwgbmV4dCBjYWxscyB3aWxsIGFsd2F5cyB1c2UgZmFzdCBwYXRoIGJ5IGluZGV4aW5nIHJldm1hcAorCSAqLworCXJldHVybiBpcnFfbGluZWFyX3Jldm1hcChnbG9iYWxfZWh2X3BpYy0+aXJxaG9zdCwgaXJxKTsKK30KKworc3RhdGljIGludCBlaHZfcGljX2hvc3RfbWF0Y2goc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJLyogRXhhY3QgbWF0Y2gsIHVubGVzcyBlaHZfcGljIG5vZGUgaXMgTlVMTCAqLworCXJldHVybiBoLT5vZl9ub2RlID09IE5VTEwgfHwgaC0+b2Zfbm9kZSA9PSBub2RlOworfQorCitzdGF0aWMgaW50IGVodl9waWNfaG9zdF9tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCSBpcnFfaHdfbnVtYmVyX3QgaHcpCit7CisJc3RydWN0IGVodl9waWMgKmVodl9waWMgPSBoLT5ob3N0X2RhdGE7CisJc3RydWN0IGlycV9jaGlwICpjaGlwOworCisJLyogRGVmYXVsdCBjaGlwICovCisJY2hpcCA9ICZlaHZfcGljLT5oY19pcnE7CisKKwlpZiAobXBpY19wZXJjcHVfYmFzZV92YWRkcikKKwkJaWYgKGh3aXJxX2ludHNwZWNbaHddICYgSVJRX1RZUEVfTVBJQ19ESVJFQ1QpCisJCQljaGlwID0gJmVodl9waWNfZGlyZWN0X2VvaV9pcnFfY2hpcDsKKworCWlycV9zZXRfY2hpcF9kYXRhKHZpcnEsIGNoaXApOworCS8qCisJICogdXNpbmcgaGFuZGxlX2Zhc3Rlb2lfaXJxIGFzIG91ciBpcnEgaGFuZGxlciwgdGhpcyB3aWxsCisJICogb25seSBjYWxsIHRoZSBlb2kgY2FsbGJhY2sgYW5kIHN1aXRhYmxlIGZvciB0aGUgTVBJQworCSAqIGNvbnRyb2xsZXIgd2hpY2ggc2V0IElTUi9JUFIgYXV0b21hdGljYWxseSBhbmQgY2xlYXIgdGhlCisJICogaGlnaGVzdCBwcmlvcml0eSBhY3RpdmUgaW50ZXJydXB0IGluIElTUi9JUFIgd2hlbiB3ZSBkbworCSAqIGEgc3BlY2lmaWMgZW9pCisJICovCisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsIGNoaXAsIGhhbmRsZV9mYXN0ZW9pX2lycSk7CisKKwkvKiBTZXQgZGVmYXVsdCBpcnEgdHlwZSAqLworCWlycV9zZXRfaXJxX3R5cGUodmlycSwgSVJRX1RZUEVfTk9ORSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlaHZfcGljX2hvc3RfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAorCQkJICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCSAgIGlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLCB1bnNpZ25lZCBpbnQgKm91dF9mbGFncykKKworeworCS8qCisJICogaW50ZXJydXB0IHNlbnNlIHZhbHVlcyBjb21pbmcgZnJvbSB0aGUgZ3Vlc3QgZGV2aWNlIHRyZWUKKwkgKiBpbnRlcnJ1cHQgc3BlY2lmaWVycyBjYW4gaGF2ZSBmb3VyIHBvc3NpYmxlIHNlbnNlIGFuZAorCSAqIGxldmVsIGVuY29kaW5nIGluZm9ybWF0aW9uIGFuZCB0aGV5IG5lZWQgdG8KKwkgKiBiZSB0cmFuc2xhdGVkIGJldHdlZW4gZmlybXdhcmUgdHlwZSAmIGxpbnV4IHR5cGUuCisJICovCisKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBtYXBfb2Zfc2Vuc2VzX3RvX2xpbnV4X2lycXR5cGVbNF0gPSB7CisJCUlSUV9UWVBFX0VER0VfRkFMTElORywKKwkJSVJRX1RZUEVfRURHRV9SSVNJTkcsCisJCUlSUV9UWVBFX0xFVkVMX0xPVywKKwkJSVJRX1RZUEVfTEVWRUxfSElHSCwKKwl9OworCisJKm91dF9od2lycSA9IGludHNwZWNbMF07CisJaWYgKGludHNpemUgPiAxKSB7CisJCWh3aXJxX2ludHNwZWNbaW50c3BlY1swXV0gPSBpbnRzcGVjWzFdOworCQkqb3V0X2ZsYWdzID0gbWFwX29mX3NlbnNlc190b19saW51eF9pcnF0eXBlW2ludHNwZWNbMV0gJgorCQkJCQkJCX5JUlFfVFlQRV9NUElDX0RJUkVDVF07CisJfSBlbHNlIHsKKwkJKm91dF9mbGFncyA9IElSUV9UWVBFX05PTkU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2hvc3Rfb3BzIGVodl9waWNfaG9zdF9vcHMgPSB7CisJLm1hdGNoID0gZWh2X3BpY19ob3N0X21hdGNoLAorCS5tYXAgPSBlaHZfcGljX2hvc3RfbWFwLAorCS54bGF0ZSA9IGVodl9waWNfaG9zdF94bGF0ZSwKK307CisKK3ZvaWQgX19pbml0IGVodl9waWNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpucDI7CisJc3RydWN0IGVodl9waWMgKmVodl9waWM7CisJaW50IGNvcmVpbnRfZmxhZyA9IDE7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJlcGFwcixodi1waWMiKTsKKwlpZiAoIW5wKSB7CisJCXByX2VycigiZWh2X3BpY19pbml0OiBjb3VsZCBub3QgZmluZCBlcGFwcixodi1waWMgbm9kZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIW9mX2ZpbmRfcHJvcGVydHkobnAsICJoYXMtZXh0ZXJuYWwtcHJveHkiLCBOVUxMKSkKKwkJY29yZWludF9mbGFnID0gMDsKKworCWVodl9waWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZWh2X3BpYyksIEdGUF9LRVJORUwpOworCWlmICghZWh2X3BpYykgeworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybjsKKwl9CisKKwllaHZfcGljLT5pcnFob3N0ID0gaXJxX2FsbG9jX2hvc3QobnAsIElSUV9IT1NUX01BUF9MSU5FQVIsCisJCU5SX0VIVl9QSUNfSU5UUywgJmVodl9waWNfaG9zdF9vcHMsIDApOworCisJaWYgKCFlaHZfcGljLT5pcnFob3N0KSB7CisJCW9mX25vZGVfcHV0KG5wKTsKKwkJcmV0dXJuOworCX0KKworCW5wMiA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsaHYtbXBpYy1wZXItY3B1Iik7CisJaWYgKG5wMikgeworCQltcGljX3BlcmNwdV9iYXNlX3ZhZGRyID0gb2ZfaW9tYXAobnAyLCAwKTsKKwkJaWYgKCFtcGljX3BlcmNwdV9iYXNlX3ZhZGRyKQorCQkJcHJfZXJyKCJlaHZfcGljX2luaXQ6IG9mX2lvbWFwIGZhaWxlZFxuIik7CisKKwkJb2Zfbm9kZV9wdXQobnAyKTsKKwl9CisKKwllaHZfcGljLT5pcnFob3N0LT5ob3N0X2RhdGEgPSBlaHZfcGljOworCWVodl9waWMtPmhjX2lycSA9IGVodl9waWNfaXJxX2NoaXA7CisJZWh2X3BpYy0+aGNfaXJxLmlycV9zZXRfYWZmaW5pdHkgPSBlaHZfcGljX3NldF9hZmZpbml0eTsKKwllaHZfcGljLT5jb3JlaW50X2ZsYWcgPSBjb3JlaW50X2ZsYWc7CisKKwlnbG9iYWxfZWh2X3BpYyA9IGVodl9waWM7CisJaXJxX3NldF9kZWZhdWx0X2hvc3QoZ2xvYmFsX2Vodl9waWMtPmlycWhvc3QpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYwppbmRleCAwNjA4YjE2Li5kOTE3NTczIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYwpAQCAtMTk2LDkgKzE5Niw2IEBACiAJb3V0X2JlMzIoJmxiYy0+bHRlY2NyLCBMVEVDQ1JfQ0xFQVIpOwogCW91dF9iZTMyKCZsYmMtPmx0ZWRyLCBMVEVEUl9FTkFCTEUpOwogCi0JLyogRW5hYmxlIGludGVycnVwdHMgZm9yIGFueSBkZXRlY3RlZCBldmVudHMgKi8KLQlvdXRfYmUzMigmbGJjLT5sdGVpciwgTFRFSVJfRU5BQkxFKTsKLQogCS8qIFNldCB0aGUgbW9uaXRvciB0aW1lb3V0IHZhbHVlIHRvIHRoZSBtYXhpbXVtIGZvciBlcnJhdHVtIEEwMDEgKi8KIAlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgImZzbCxlbGJjIikpCiAJCWNscnNldGJpdHNfYmUzMigmbGJjLT5sYmNyLCBMQkNSX0JNVCwgTEJDUl9CTVRQUyk7CkBAIC0zMjIsNiArMzE5LDkgQEAKIAkJZ290byBlcnI7CiAJfQogCisJLyogRW5hYmxlIGludGVycnVwdHMgZm9yIGFueSBkZXRlY3RlZCBldmVudHMgKi8KKwlvdXRfYmUzMigmZnNsX2xiY19jdHJsX2Rldi0+cmVncy0+bHRlaXIsIExURUlSX0VOQUJMRSk7CisKIAlyZXR1cm4gMDsKIAogZXJyOgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYwppbmRleCA5MmU3ODMzLi40MTlhNzcyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIAotCW1zaS0+bXNpX3JlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzLmVuZCAtIHJlcy5zdGFydCArIDEpOworCW1zaS0+bXNpX3JlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CiAJaWYgKCFtc2ktPm1zaV9yZWdzKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiaW9yZW1hcCBwcm9ibGVtIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3Jfb3V0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYwppbmRleCA2OGNhOTI5Li4zYmJhOGJkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYwpAQCAtMzgsMTAgKzM4LDE3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBxdWlya19mc2xfcGNpZV9oZWFkZXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKKwl1OCBwcm9naWY7CisKIAkvKiBpZiB3ZSBhcmVuJ3QgYSBQQ0llIGRvbid0IGJvdGhlciAqLwogCWlmICghcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKSkKIAkJcmV0dXJuOwogCisJLyogaWYgd2UgYXJlbid0IGluIGhvc3QgbW9kZSBkb24ndCBib3RoZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19QUk9HLCAmcHJvZ2lmKTsKKwlpZiAocHJvZ2lmICYgMHgxKQorCQlyZXR1cm47CisKIAlkZXYtPmNsYXNzID0gUENJX0NMQVNTX0JSSURHRV9QQ0kgPDwgODsKIAlmc2xfcGNpZV9idXNfZml4dXAgPSAxOwogCXJldHVybjsKQEAgLTY0LDcgKzcxLDcgQEAKIHsKIAlyZXNvdXJjZV9zaXplX3QgcGNpX2FkZHIgPSByZXMtPnN0YXJ0IC0gb2Zmc2V0OwogCXJlc291cmNlX3NpemVfdCBwaHlzX2FkZHIgPSByZXMtPnN0YXJ0OwotCXJlc291cmNlX3NpemVfdCBzaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlyZXNvdXJjZV9zaXplX3Qgc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAl1MzIgZmxhZ3MgPSAweDgwMDQ0MDAwOyAvKiBlbmFibGUgJiBtZW0gUi9XICovCiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTEwOCw3ICsxMTUsNyBAQAogCWNoYXIgKm5hbWUgPSBob3NlLT5kbi0+ZnVsbF9uYW1lOwogCiAJcHJfZGVidWcoIlBDSSBtZW1vcnkgbWFwIHN0YXJ0IDB4JTAxNmxseCwgc2l6ZSAweCUwMTZsbHhcbiIsCi0JCSAgICAodTY0KXJzcmMtPnN0YXJ0LCAodTY0KXJzcmMtPmVuZCAtICh1NjQpcnNyYy0+c3RhcnQgKyAxKTsKKwkJICh1NjQpcnNyYy0+c3RhcnQsICh1NjQpcmVzb3VyY2Vfc2l6ZShyc3JjKSk7CiAKIAlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoaG9zZS0+ZG4sICJmc2wscW9yaXEtcGNpZS12Mi4yIikpIHsKIAkJd2luX2lkeCA9IDI7CkBAIC0xMTYsNyArMTIzLDcgQEAKIAkJZW5kX2lkeCA9IDM7CiAJfQogCi0JcGNpID0gaW9yZW1hcChyc3JjLT5zdGFydCwgcnNyYy0+ZW5kIC0gcnNyYy0+c3RhcnQgKyAxKTsKKwlwY2kgPSBpb3JlbWFwKHJzcmMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJzcmMpKTsKIAlpZiAoIXBjaSkgewogCSAgICBkZXZfZXJyKGhvc2UtPnBhcmVudCwgIlVuYWJsZSB0byBtYXAgQVRNVSByZWdpc3RlcnNcbiIpOwogCSAgICByZXR1cm47CkBAIC0xNTMsOSArMTYwLDkgQEAKIAkJfSBlbHNlIHsKIAkJCXByX2RlYnVnKCJQQ0kgSU8gcmVzb3VyY2Ugc3RhcnQgMHglMDE2bGx4LCBzaXplIDB4JTAxNmxseCwgIgogCQkJCSAicGh5IGJhc2UgMHglMDE2bGx4LlxuIiwKLQkJCQkodTY0KWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LAotCQkJCSh1NjQpaG9zZS0+aW9fcmVzb3VyY2UuZW5kIC0gKHU2NClob3NlLT5pb19yZXNvdXJjZS5zdGFydCArIDEsCi0JCQkJKHU2NClob3NlLT5pb19iYXNlX3BoeXMpOworCQkJCSAodTY0KWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LAorCQkJCSAodTY0KXJlc291cmNlX3NpemUoJmhvc2UtPmlvX3Jlc291cmNlKSwKKwkJCQkgKHU2NClob3NlLT5pb19iYXNlX3BoeXMpOwogCQkJb3V0X2JlMzIoJnBjaS0+cG93W2pdLnBvdGFyLCAoaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgPj4gMTIpKTsKIAkJCW91dF9iZTMyKCZwY2ktPnBvd1tqXS5wb3RlYXIsIDApOwogCQkJb3V0X2JlMzIoJnBjaS0+cG93W2pdLnBvd2JhciwgKGhvc2UtPmlvX2Jhc2VfcGh5cyA+PiAxMikpOwpAQCAtMzIzLDYgKzMzMCw3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogCXN0cnVjdCByZXNvdXJjZSByc3JjOwogCWNvbnN0IGludCAqYnVzX3JhbmdlOworCXU4IHByb2dpZjsKIAogCWlmICghb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShkZXYpKSB7CiAJCXByX3dhcm5pbmcoIiVzOiBkaXNhYmxlZFxuIiwgZGV2LT5mdWxsX25hbWUpOwpAQCAtMzUzLDYgKzM2MSwxOCBAQAogCiAJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIHJzcmMuc3RhcnQsIHJzcmMuc3RhcnQgKyAweDQsCiAJCVBQQ19JTkRJUkVDVF9UWVBFX0JJR19FTkRJQU4pOworCisJZWFybHlfcmVhZF9jb25maWdfYnl0ZShob3NlLCAwLCAwLCBQQ0lfQ0xBU1NfUFJPRywgJnByb2dpZik7CisJaWYgKChwcm9naWYgJiAxKSA9PSAxKSB7CisJCS8qIHVubWFwIGNmZ19kYXRhICYgY2ZnX2FkZHIgc2VwYXJhdGVseSBpZiBub3Qgb24gc2FtZSBwYWdlICovCisJCWlmICgoKHVuc2lnbmVkIGxvbmcpaG9zZS0+Y2ZnX2RhdGEgJiBQQUdFX01BU0spICE9CisJCSAgICAoKHVuc2lnbmVkIGxvbmcpaG9zZS0+Y2ZnX2FkZHIgJiBQQUdFX01BU0spKQorCQkJaW91bm1hcChob3NlLT5jZmdfZGF0YSk7CisJCWlvdW5tYXAoaG9zZS0+Y2ZnX2FkZHIpOworCQlwY2liaW9zX2ZyZWVfY29udHJvbGxlcihob3NlKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc2V0dXBfcGNpX2NtZChob3NlKTsKIAogCS8qIGNoZWNrIFBDSSBleHByZXNzIGxpbmsgc3RhdHVzICovCkBAIC0zODAsNzAgKzQwMCwxMSBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODU0OEUsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NDgsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NDNFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NTQzLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NTQ3RSwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODU0NUUsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NDUsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NjlFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NTY5LCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NTY4RSwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODU2OCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODU2N0UsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NjcsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1MzNFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NTMzLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NTQ0RSwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODU0NCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODU3MkUsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NzIsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1MzZFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NTM2LCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NjQxLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NjQxRCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODYxMCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDEwMTFFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMTAxMSwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDEwMTNFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMTAxMywgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDEwMjBFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMTAyMCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDEwMjFFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMTAyMSwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDEwMjJFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMTAyMiwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDIwMTBFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMjAxMCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDIwMjBFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMjAyMCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDIwNDBFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMjA0MCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDMwNDFFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMzA0MSwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDQwNDBFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QNDA0MCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDQwODBFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QNDA4MCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDUwMTBFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QNTAxMCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDUwMjBFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QNTAyMCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKICNlbmRpZiAvKiBDT05GSUdfRlNMX1NPQ19CT09LRSB8fCBDT05GSUdfUFBDXzg2eHggKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1BQQ184M3h4KSB8fCBkZWZpbmVkKENPTkZJR19QUENfTVBDNTEyeCkKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODMwOCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODMxNEUsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzgzMTQsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzgzMTVFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4MzE1LCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4Mzc3RSwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODM3NywgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODM3OEUsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzgzNzgsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9GUkVFU0NBTEUsIFBDSV9BTllfSUQsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfODN4eCkgfHwgZGVmaW5lZChDT05GSUdfUFBDX01QQzUxMngpCiBzdHJ1Y3QgbXBjODN4eF9wY2llX3ByaXYgewogCXZvaWQgX19pb21lbSAqY2ZnX3R5cGUwOwogCXZvaWQgX19pb21lbSAqY2ZnX3R5cGUxOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uYwppbmRleCA1YjIwNmEyLi4yZGU4NTUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uYwpAQCAtMjgzLDIzICsyODMsMjQgQEAKICNpZmRlZiBDT05GSUdfRTUwMAogaW50IGZzbF9yaW9fbWNoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICplbnRyeSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyByZWFzb24gPSBtZnNwcihTUFJOX01DU1IpOworCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgcmVhc29uOwogCi0JaWYgKHJlYXNvbiAmIE1DU1JfQlVTX1JCRVJSKSB7Ci0JCXJlYXNvbiA9IGluX2JlMzIoKHUzMiAqKShyaW9fcmVnc193aW4gKyBSSU9fTFRMRURDU1IpKTsKLQkJaWYgKHJlYXNvbiAmIChSSU9fTFRMRURDU1JfSUVSIHwgUklPX0xUTEVEQ1NSX1BSVCkpIHsKLQkJCS8qIENoZWNrIGlmIHdlIGFyZSBwcmVwYXJlZCB0byBoYW5kbGUgdGhpcyBmYXVsdCAqLwotCQkJZW50cnkgPSBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlcyhyZWdzLT5uaXApOwotCQkJaWYgKGVudHJ5KSB7Ci0JCQkJcHJfZGVidWcoIlJJTzogJXMgLSBNQyBFeGNlcHRpb24gaGFuZGxlZFxuIiwKLQkJCQkJIF9fZnVuY19fKTsKLQkJCQlvdXRfYmUzMigodTMyICopKHJpb19yZWdzX3dpbiArIFJJT19MVExFRENTUiksCi0JCQkJCSAwKTsKLQkJCQlyZWdzLT5tc3IgfD0gTVNSX1JJOwotCQkJCXJlZ3MtPm5pcCA9IGVudHJ5LT5maXh1cDsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KKwlpZiAoIXJpb19yZWdzX3dpbikKKwkJcmV0dXJuIDA7CisKKwlyZWFzb24gPSBpbl9iZTMyKCh1MzIgKikocmlvX3JlZ3Nfd2luICsgUklPX0xUTEVEQ1NSKSk7CisJaWYgKHJlYXNvbiAmIChSSU9fTFRMRURDU1JfSUVSIHwgUklPX0xUTEVEQ1NSX1BSVCkpIHsKKwkJLyogQ2hlY2sgaWYgd2UgYXJlIHByZXBhcmVkIHRvIGhhbmRsZSB0aGlzIGZhdWx0ICovCisJCWVudHJ5ID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+bmlwKTsKKwkJaWYgKGVudHJ5KSB7CisJCQlwcl9kZWJ1ZygiUklPOiAlcyAtIE1DIEV4Y2VwdGlvbiBoYW5kbGVkXG4iLAorCQkJCSBfX2Z1bmNfXyk7CisJCQlvdXRfYmUzMigodTMyICopKHJpb19yZWdzX3dpbiArIFJJT19MVExFRENTUiksCisJCQkJIDApOworCQkJcmVncy0+bXNyIHw9IE1TUl9SSTsKKwkJCXJlZ3MtPm5pcCA9IGVudHJ5LT5maXh1cDsKKwkJCXJldHVybiAxOwogCQl9CiAJfQogCkBAIC0xNTIzLDcgKzE1MjQsNyBAQAogCXBvcnQtPnByaXYgPSBwcml2OwogCXBvcnQtPnBoeXNfZWZwdHIgPSAweDEwMDsKIAotCXByaXYtPnJlZ3Nfd2luID0gaW9yZW1hcChyZWdzLnN0YXJ0LCByZWdzLmVuZCAtIHJlZ3Muc3RhcnQgKyAxKTsKKwlwcml2LT5yZWdzX3dpbiA9IGlvcmVtYXAocmVncy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVncykpOwogCXJpb19yZWdzX3dpbiA9IHByaXYtPnJlZ3Nfd2luOwogCiAJLyogUHJvYmUgdGhlIG1hc3RlciBwb3J0IHBoeSB0eXBlICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jCmluZGV4IDE5ZTUwMTUuLjI2NTMxM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KICNpbmNsdWRlIDxtbS9tbXVfZGVjbC5oPgogI2luY2x1ZGUgPGFzbS9jcG0yLmg+CisjaW5jbHVkZSA8YXNtL2ZzbF9oY2FsbHMuaD4JLyogRm9yIHRoZSBGcmVlc2NhbGUgaHlwZXJ2aXNvciAqLwogCiBleHRlcm4gdm9pZCBpbml0X2ZjY19pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvKik7CiBleHRlcm4gdm9pZCBpbml0X2ZlY19pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvKik7CkBAIC0yNTIsMyArMjUzLDI5IEBACiBzdHJ1Y3QgcGxhdGZvcm1fZGl1X2RhdGFfb3BzIGRpdV9vcHM7CiBFWFBPUlRfU1lNQk9MKGRpdV9vcHMpOwogI2VuZGlmCisKKy8qCisgKiBSZXN0YXJ0IHRoZSBjdXJyZW50IHBhcnRpdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBwcGNfbWQucmVzdGFydCBmdW5jdGlvbiBwb2ludGVyLAorICogdG8gaW5pdGlhdGUgYSBwYXJ0aXRpb24gcmVzdGFydCB3aGVuIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgdGhlIEZyZWVzY2FsZQorICogaHlwZXJ2aXNvci4KKyAqLwordm9pZCBmc2xfaHZfcmVzdGFydChjaGFyICpjbWQpCit7CisJcHJfaW5mbygiaHYgcmVzdGFydFxuIik7CisJZmhfcGFydGl0aW9uX3Jlc3RhcnQoLTEpOworfQorCisvKgorICogSGFsdCB0aGUgY3VycmVudCBwYXJ0aXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgcHBjX21kLnBvd2VyX29mZiBhbmQgcHBjX21kLmhhbHQKKyAqIGZ1bmN0aW9uIHBvaW50ZXJzLCB0byBzaHV0IGRvd24gdGhlIHBhcnRpdGlvbiB3aGVuIHdlJ3JlIHJ1bm5pbmcgdW5kZXIKKyAqIHRoZSBGcmVlc2NhbGUgaHlwZXJ2aXNvci4KKyAqLwordm9pZCBmc2xfaHZfaGFsdCh2b2lkKQoreworCXByX2luZm8oImh2IGV4aXRcbiIpOworCWZoX3BhcnRpdGlvbl9zdG9wKC0xKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmgKaW5kZXggNTM2MDk0OC4uMmVjZTAyYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmgKQEAgLTM2LDUgKzM2LDggQEAKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGl1X2RhdGFfb3BzIGRpdV9vcHM7CiAjZW5kaWYKIAordm9pZCBmc2xfaHZfcmVzdGFydChjaGFyICpjbWQpOwordm9pZCBmc2xfaHZfaGFsdCh2b2lkKTsKKwogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaXBpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9pcGljLmMKaW5kZXggNzM2N2QxNy4uOTVkYTg5NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9pcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9pcGljLmMKQEAgLTczNiw3ICs3MzYsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpcGljLT5yZWdzID0gaW9yZW1hcChyZXMuc3RhcnQsIHJlcy5lbmQgLSByZXMuc3RhcnQgKyAxKTsKKwlpcGljLT5yZWdzID0gaW9yZW1hcChyZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJnJlcykpOwogCiAJaXBpYy0+aXJxaG9zdC0+aG9zdF9kYXRhID0gaXBpYzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tbWlvX252cmFtLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21taW9fbnZyYW0uYwppbmRleCBkZGM4NzdhLi42OWY1ODE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21taW9fbnZyYW0uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21taW9fbnZyYW0uYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAludnJhbV9hZGRyID0gci5zdGFydDsKLQltbWlvX252cmFtX2xlbiA9IHIuZW5kIC0gci5zdGFydCArIDE7CisJbW1pb19udnJhbV9sZW4gPSByZXNvdXJjZV9zaXplKCZyKTsKIAlpZiAoICghbW1pb19udnJhbV9sZW4pIHx8ICghbnZyYW1fYWRkcikgKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm52cmFtOiBhZGRyZXNzIG9yIGxlbmd0aCBpcyAwXG4iKTsKIAkJcmV0ID0gLUVJTzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmMKaW5kZXggMjA5MjRmMi4uMjJlNDhlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0Jc2l1X3JlZyA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXMuZW5kIC0gcmVzLnN0YXJ0ICsgMSk7CisJc2l1X3JlZyA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZXMpKTsKIAlpZiAoc2l1X3JlZyA9PSBOVUxMKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwppbmRleCAzYThkZTViLi5kNWQzZmYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KQEAgLTU5Nyw0MiArNTk4LDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19NUElDX1UzX0hUX0lSUVMgKi8KIAotI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyBpbnQgaXJxX2Nob29zZV9jcHUoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCi17Ci0JaW50IGNwdWlkOwotCi0JaWYgKGNwdW1hc2tfZXF1YWwobWFzaywgY3B1X2FsbF9tYXNrKSkgewotCQlzdGF0aWMgaW50IGlycV9yb3ZlciA9IDA7Ci0JCXN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGlycV9yb3Zlcl9sb2NrKTsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQkvKiBSb3VuZC1yb2JpbiBkaXN0cmlidXRpb24uLi4gKi8KLQlkb19yb3VuZF9yb2JpbjoKLQkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZpcnFfcm92ZXJfbG9jaywgZmxhZ3MpOwotCi0JCWlycV9yb3ZlciA9IGNwdW1hc2tfbmV4dChpcnFfcm92ZXIsIGNwdV9vbmxpbmVfbWFzayk7Ci0JCWlmIChpcnFfcm92ZXIgPj0gbnJfY3B1X2lkcykKLQkJCWlycV9yb3ZlciA9IGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKTsKLQotCQljcHVpZCA9IGlycV9yb3ZlcjsKLQotCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX3JvdmVyX2xvY2ssIGZsYWdzKTsKLQl9IGVsc2UgewotCQljcHVpZCA9IGNwdW1hc2tfZmlyc3RfYW5kKG1hc2ssIGNwdV9vbmxpbmVfbWFzayk7Ci0JCWlmIChjcHVpZCA+PSBucl9jcHVfaWRzKQotCQkJZ290byBkb19yb3VuZF9yb2JpbjsKLQl9Ci0KLQlyZXR1cm4gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHVpZCk7Ci19Ci0jZWxzZQotc3RhdGljIGludCBpcnFfY2hvb3NlX2NwdShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKLXsKLQlyZXR1cm4gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7Ci19Ci0jZW5kaWYKLQogLyogRmluZCBhbiBtcGljIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGxpbnV4IGludGVycnVwdCAqLwogc3RhdGljIHN0cnVjdCBtcGljICptcGljX2ZpbmQodW5zaWduZWQgaW50IGlycSkKIHsKQEAgLTg0OCw3ICs4MTMsNyBAQAogCXN0cnVjdCBtcGljICptcGljID0gbXBpY19mcm9tX2lycV9kYXRhKGQpOwogCXVuc2lnbmVkIGludCBzcmMgPSB2aXJxX3RvX2h3KGQtPmlycSkgLSBtcGljLT50aW1lcl92ZWNzWzBdOwogCi0JREJHKCIlczogZW5hYmxlX3RtOiAlZCAodG0gJWQpXG4iLCBtcGljLT5uYW1lLCBpcnEsIHNyYyk7CisJREJHKCIlczogZW5hYmxlX3RtOiAlZCAodG0gJWQpXG4iLCBtcGljLT5uYW1lLCBkLT5pcnEsIHNyYyk7CiAJbXBpY190bV93cml0ZShzcmMsIG1waWNfdG1fcmVhZChzcmMpICYgfk1QSUNfVkVDUFJJX01BU0spOwogCW1waWNfdG1fcmVhZChzcmMpOwogfQpAQCAtMTY0OCw5ICsxNjEzLDggQEAKIAkJcmV0dXJuIE5PX0lSUTsKIAl9CiAJaWYgKHVubGlrZWx5KG1waWMtPnByb3RlY3RlZCAmJiB0ZXN0X2JpdChzcmMsIG1waWMtPnByb3RlY3RlZCkpKSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogR290IHByb3RlY3RlZCBzb3VyY2UgJWQgIVxuIiwKLQkJCSAgICAgICBtcGljLT5uYW1lLCAoaW50KXNyYyk7CisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcgIiVzOiBHb3QgcHJvdGVjdGVkIHNvdXJjZSAlZCAhXG4iLAorCQkJCSAgIG1waWMtPm5hbWUsIChpbnQpc3JjKTsKIAkJbXBpY19lb2kobXBpYyk7CiAJCXJldHVybiBOT19JUlE7CiAJfQpAQCAtMTY4OCw5ICsxNjUyLDggQEAKIAkJcmV0dXJuIE5PX0lSUTsKIAl9CiAJaWYgKHVubGlrZWx5KG1waWMtPnByb3RlY3RlZCAmJiB0ZXN0X2JpdChzcmMsIG1waWMtPnByb3RlY3RlZCkpKSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogR290IHByb3RlY3RlZCBzb3VyY2UgJWQgIVxuIiwKLQkJCSAgICAgICBtcGljLT5uYW1lLCAoaW50KXNyYyk7CisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcgIiVzOiBHb3QgcHJvdGVjdGVkIHNvdXJjZSAlZCAhXG4iLAorCQkJCSAgIG1waWMtPm5hbWUsIChpbnQpc3JjKTsKIAkJcmV0dXJuIE5PX0lSUTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF91ZGJnLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfdWRiZy5jCmluZGV4IDI3OTJkYzguLjUwYTgxMzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF91ZGJnLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3VkYmcuYwpAQCAtMTI1LDExICsxMjUsMTEgQEAKIAogCW9mX25vZGVfcHV0KG5wKTsKIAotCW1wc2NfYmFzZSA9IGlvcmVtYXAoclswXS5zdGFydCwgclswXS5lbmQgLSByWzBdLnN0YXJ0ICsgMSk7CisJbXBzY19iYXNlID0gaW9yZW1hcChyWzBdLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyWzBdKSk7CiAJaWYgKCFtcHNjX2Jhc2UpCiAJCXJldHVybjsKIAotCW1wc2NfaW50cl9jYXVzZSA9IGlvcmVtYXAoclsxXS5zdGFydCwgclsxXS5lbmQgLSByWzFdLnN0YXJ0ICsgMSk7CisJbXBzY19pbnRyX2NhdXNlID0gaW9yZW1hcChyWzFdLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyWzFdKSk7CiAJaWYgKCFtcHNjX2ludHJfY2F1c2UpIHsKIAkJaW91bm1hcChtcHNjX2Jhc2UpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5jCmluZGV4IDE1NmFhN2QuLjJlYzRmM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkJaWYgKHBwYzR4eF9zZXR1cF9vbmVfcGNpX1BNTShob3NlLCByZWcsCiAJCQkJCSAgICAgcmVzLT5zdGFydCwKIAkJCQkJICAgICByZXMtPnN0YXJ0IC0gaG9zZS0+cGNpX21lbV9vZmZzZXQsCi0JCQkJCSAgICAgcmVzLT5lbmQgKyAxIC0gcmVzLT5zdGFydCwKKwkJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcyksCiAJCQkJCSAgICAgcmVzLT5mbGFncywKIAkJCQkJICAgICBqKSA9PSAwKSB7CiAJCQlqKys7CkBAIC0yOTAsNyArMjkwLDcgQEAKIAkJCQkJICAgICB2b2lkIF9faW9tZW0gKnJlZywKIAkJCQkJICAgICBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKLQlyZXNvdXJjZV9zaXplX3Qgc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJcmVzb3VyY2Vfc2l6ZV90IHNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAJdTMyIHNhOwogCiAJLyogQ2FsY3VsYXRlIHdpbmRvdyBzaXplICovCkBAIC0zNDksNyArMzQ5LDcgQEAKIAlidXNfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkobnAsICJidXMtcmFuZ2UiLCBOVUxMKTsKIAogCS8qIE1hcCByZWdpc3RlcnMgKi8KLQlyZWcgPSBpb3JlbWFwKHJzcmNfcmVnLnN0YXJ0LCByc3JjX3JlZy5lbmQgKyAxIC0gcnNyY19yZWcuc3RhcnQpOworCXJlZyA9IGlvcmVtYXAocnNyY19yZWcuc3RhcnQsIHJlc291cmNlX3NpemUoJnJzcmNfcmVnKSk7CiAJaWYgKHJlZyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IG1hcCByZWdpc3RlcnMgISIsIG5wLT5mdWxsX25hbWUpOwogCQlnb3RvIGZhaWw7CkBAIC00NjUsNyArNDY1LDcgQEAKIAkJaWYgKHBwYzR4eF9zZXR1cF9vbmVfcGNpeF9QT00oaG9zZSwgcmVnLAogCQkJCQkgICAgICByZXMtPnN0YXJ0LAogCQkJCQkgICAgICByZXMtPnN0YXJ0IC0gaG9zZS0+cGNpX21lbV9vZmZzZXQsCi0JCQkJCSAgICAgIHJlcy0+ZW5kICsgMSAtIHJlcy0+c3RhcnQsCisJCQkJCSAgICAgIHJlc291cmNlX3NpemUocmVzKSwKIAkJCQkJICAgICAgcmVzLT5mbGFncywKIAkJCQkJICAgICAgaikgPT0gMCkgewogCQkJaisrOwpAQCAtNDkyLDcgKzQ5Miw3IEBACiAJCQkJCSAgICAgIGludCBiaWdfcGltLAogCQkJCQkgICAgICBpbnQgZW5hYmxlX21zaV9ob2xlKQogewotCXJlc291cmNlX3NpemVfdCBzaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlyZXNvdXJjZV9zaXplX3Qgc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAl1MzIgc2E7CiAKIAkvKiBSQU0gaXMgYWx3YXlzIGF0IDAgKi8KQEAgLTU1NSw3ICs1NTUsNyBAQAogCWJ1c19yYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShucCwgImJ1cy1yYW5nZSIsIE5VTEwpOwogCiAJLyogTWFwIHJlZ2lzdGVycyAqLwotCXJlZyA9IGlvcmVtYXAocnNyY19yZWcuc3RhcnQsIHJzcmNfcmVnLmVuZCArIDEgLSByc3JjX3JlZy5zdGFydCk7CisJcmVnID0gaW9yZW1hcChyc3JjX3JlZy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcnNyY19yZWcpKTsKIAlpZiAocmVnID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgbWFwIHJlZ2lzdGVycyAhIiwgbnAtPmZ1bGxfbmFtZSk7CiAJCWdvdG8gZmFpbDsKQEAgLTY1MCwxMiArNjUwLDc0IEBACiAJaW50ICgqY29yZV9pbml0KShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIAlpbnQgKCpwb3J0X2luaXRfaHcpKHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCk7CiAJaW50ICgqc2V0dXBfdXRsKShzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpOworCXZvaWQgKCpjaGVja19saW5rKShzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpOwogfTsKIAogc3RhdGljIHN0cnVjdCBwcGM0eHhfcGNpZXhfaHdvcHMgKnBwYzR4eF9wY2lleF9od29wczsKIAogI2lmZGVmIENPTkZJR180NHgKIAorc3RhdGljIGludCBfX2luaXQgcHBjNHh4X3BjaWV4X3dhaXRfb25fc2RyKHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCwKKwkJCQkJICAgdW5zaWduZWQgaW50IHNkcl9vZmZzZXQsCisJCQkJCSAgIHVuc2lnbmVkIGludCBtYXNrLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgdmFsdWUsCisJCQkJCSAgIGludCB0aW1lb3V0X21zKQoreworCXUzMiB2YWw7CisKKwl3aGlsZSh0aW1lb3V0X21zLS0pIHsKKwkJdmFsID0gbWZkY3JpKFNEUjAsIHBvcnQtPnNkcl9iYXNlICsgc2RyX29mZnNldCk7CisJCWlmICgodmFsICYgbWFzaykgPT0gdmFsdWUpIHsKKwkJCXByX2RlYnVnKCJQQ0lFJWQ6IFdhaXQgb24gU0RSICV4IHN1Y2Nlc3Mgd2l0aCB0bSAlZCAoJTA4eClcbiIsCisJCQkJIHBvcnQtPmluZGV4LCBzZHJfb2Zmc2V0LCB0aW1lb3V0X21zLCB2YWwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbXNsZWVwKDEpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBwYzR4eF9wY2lleF9wb3J0X3Jlc2V0X3NkcihzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpCit7CisJLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUgKi8KKwlpZiAocHBjNHh4X3BjaWV4X3dhaXRfb25fc2RyKHBvcnQsIFBFU0RSbl9SQ1NTVFMsIDEgPDwgMjAsIDAsIDEwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0lFJWQ6IFBHUlNUIGZhaWxlZFxuIiwKKwkJICAgICAgIHBvcnQtPmluZGV4KTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBwYzR4eF9wY2lleF9jaGVja19saW5rX3NkcihzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiUENJRSVkOiBDaGVja2luZyBsaW5rLi4uXG4iLCBwb3J0LT5pbmRleCk7CisKKwkvKiBDaGVjayBmb3IgY2FyZCBwcmVzZW5jZSBkZXRlY3QgaWYgc3VwcG9ydGVkLCBpZiBub3QsIGp1c3Qgd2FpdCBmb3IKKwkgKiBsaW5rIHVuY29uZGl0aW9uYWxseS4KKwkgKgorCSAqIG5vdGUgdGhhdCB3ZSBkb24ndCBmYWlsIGlmIHRoZXJlIGlzIG5vIGxpbmssIHdlIGp1c3QgZmlsdGVyIG91dAorCSAqIGNvbmZpZyBzcGFjZSBhY2Nlc3Nlcy4gVGhhdCB3YXksIGl0IHdpbGwgYmUgZWFzaWVyIHRvIGltcGxlbWVudAorCSAqIGhvdHBsdWcgbGF0ZXIgb24uCisJICovCisJaWYgKCFwb3J0LT5oYXNfaWJwcmUgfHwKKwkgICAgIXBwYzR4eF9wY2lleF93YWl0X29uX3Nkcihwb3J0LCBQRVNEUm5fTE9PUCwKKwkJCQkgICAgICAxIDw8IDI4LCAxIDw8IDI4LCAxMDApKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJQQ0lFJWQ6IERldmljZSBkZXRlY3RlZCwgd2FpdGluZyBmb3IgbGluay4uLlxuIiwKKwkJICAgICAgIHBvcnQtPmluZGV4KTsKKwkJaWYgKHBwYzR4eF9wY2lleF93YWl0X29uX3Nkcihwb3J0LCBQRVNEUm5fTE9PUCwKKwkJCQkJICAgICAweDEwMDAsIDB4MTAwMCwgMjAwMCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIlBDSUUlZDogTGluayB1cCBmYWlsZWRcbiIsIHBvcnQtPmluZGV4KTsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIlBDSUUlZDogbGluayBpcyB1cCAhXG4iLCBwb3J0LT5pbmRleCk7CisJCQlwb3J0LT5saW5rID0gMTsKKwkJfQorCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJQQ0lFJWQ6IE5vIGRldmljZSBkZXRlY3RlZC5cbiIsIHBvcnQtPmluZGV4KTsKK30KKwogLyogQ2hlY2sgdmFyaW91cyByZXNldCBiaXRzIG9mIHRoZSA0NDBTUGUgUENJZSBjb3JlICovCiBzdGF0aWMgaW50IF9faW5pdCBwcGM0NDBzcGVfcGNpZXhfY2hlY2tfcmVzZXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKQEAgLTgwNiw3ICs4NjgsNyBAQAogCWRjcmlfY2xyc2V0KFNEUjAsIHBvcnQtPnNkcl9iYXNlICsgUEVTRFJuX1JDU1NFVCwKIAkJCSgxIDw8IDI0KSB8ICgxIDw8IDE2KSwgMSA8PCAxMik7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcHBjNHh4X3BjaWV4X3BvcnRfcmVzZXRfc2RyKHBvcnQpOwogfQogCiBzdGF0aWMgaW50IHBwYzQ0MHNwZUFfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKQEAgLTg1Niw2ICs5MTgsNyBAQAogCS5jb3JlX2luaXQJPSBwcGM0NDBzcGVfcGNpZXhfY29yZV9pbml0LAogCS5wb3J0X2luaXRfaHcJPSBwcGM0NDBzcGVBX3BjaWV4X2luaXRfcG9ydF9odywKIAkuc2V0dXBfdXRsCT0gcHBjNDQwc3BlQV9wY2lleF9pbml0X3V0bCwKKwkuY2hlY2tfbGluawk9IHBwYzR4eF9wY2lleF9jaGVja19saW5rX3NkciwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcHBjNHh4X3BjaWV4X2h3b3BzIHBwYzQ0MHNwZUJfcGNpZV9od29wcyBfX2luaXRkYXRhID0KQEAgLTg2Myw2ICs5MjYsNyBAQAogCS5jb3JlX2luaXQJPSBwcGM0NDBzcGVfcGNpZXhfY29yZV9pbml0LAogCS5wb3J0X2luaXRfaHcJPSBwcGM0NDBzcGVCX3BjaWV4X2luaXRfcG9ydF9odywKIAkuc2V0dXBfdXRsCT0gcHBjNDQwc3BlQl9wY2lleF9pbml0X3V0bCwKKwkuY2hlY2tfbGluawk9IHBwYzR4eF9wY2lleF9jaGVja19saW5rX3NkciwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHBwYzQ2MGV4X3BjaWV4X2NvcmVfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQpAQCAtOTQ0LDcgKzEwMDgsNyBAQAogCiAJcG9ydC0+aGFzX2licHJlID0gMTsKIAotCXJldHVybiAwOworCXJldHVybiBwcGM0eHhfcGNpZXhfcG9ydF9yZXNldF9zZHIocG9ydCk7CiB9CiAKIHN0YXRpYyBpbnQgcHBjNDYwZXhfcGNpZXhfaW5pdF91dGwoc3RydWN0IHBwYzR4eF9wY2lleF9wb3J0ICpwb3J0KQpAQCAtOTcyLDYgKzEwMzYsNyBAQAogCS5jb3JlX2luaXQJPSBwcGM0NjBleF9wY2lleF9jb3JlX2luaXQsCiAJLnBvcnRfaW5pdF9odwk9IHBwYzQ2MGV4X3BjaWV4X2luaXRfcG9ydF9odywKIAkuc2V0dXBfdXRsCT0gcHBjNDYwZXhfcGNpZXhfaW5pdF91dGwsCisJLmNoZWNrX2xpbmsJPSBwcGM0eHhfcGNpZXhfY2hlY2tfbGlua19zZHIsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBwcGM0NjBzeF9wY2lleF9jb3JlX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKQEAgLTEwNzUsNyArMTE0MCw3IEBACiAKIAlwb3J0LT5oYXNfaWJwcmUgPSAxOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBwYzR4eF9wY2lleF9wb3J0X3Jlc2V0X3Nkcihwb3J0KTsKIH0KIAogc3RhdGljIGludCBwcGM0NjBzeF9wY2lleF9pbml0X3V0bChzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpCkBAIC0xMDg5LDYgKzExNTQsNyBAQAogCS5jb3JlX2luaXQJPSBwcGM0NjBzeF9wY2lleF9jb3JlX2luaXQsCiAJLnBvcnRfaW5pdF9odwk9IHBwYzQ2MHN4X3BjaWV4X2luaXRfcG9ydF9odywKIAkuc2V0dXBfdXRsCT0gcHBjNDYwc3hfcGNpZXhfaW5pdF91dGwsCisJLmNoZWNrX2xpbmsJPSBwcGM0eHhfcGNpZXhfY2hlY2tfbGlua19zZHIsCiB9OwogCiAjZW5kaWYgLyogQ09ORklHXzQ0eCAqLwpAQCAtMTE1NCw3ICsxMjIwLDcgQEAKIAogCXBvcnQtPmhhc19pYnByZSA9IDE7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcHBjNHh4X3BjaWV4X3BvcnRfcmVzZXRfc2RyKHBvcnQpOwogfQogCiBzdGF0aWMgaW50IHBwYzQwNWV4X3BjaWV4X2luaXRfdXRsKHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKQEAgLTExODMsMTEgKzEyNDksMTEgQEAKIAkuY29yZV9pbml0CT0gcHBjNDA1ZXhfcGNpZXhfY29yZV9pbml0LAogCS5wb3J0X2luaXRfaHcJPSBwcGM0MDVleF9wY2lleF9pbml0X3BvcnRfaHcsCiAJLnNldHVwX3V0bAk9IHBwYzQwNWV4X3BjaWV4X2luaXRfdXRsLAorCS5jaGVja19saW5rCT0gcHBjNHh4X3BjaWV4X2NoZWNrX2xpbmtfc2RyLAogfTsKIAogI2VuZGlmIC8qIENPTkZJR180MHggKi8KIAotCiAvKiBDaGVjayB0aGF0IHRoZSBjb3JlIGhhcyBiZWVuIGluaXRpZWQgYW5kIGlmIG5vdCwgZG8gaXQgKi8KIHN0YXRpYyBpbnQgX19pbml0IHBwYzR4eF9wY2lleF9jaGVja19jb3JlX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKQEAgLTEyNjEsMjYgKzEzMjcsNiBAQAogCWRjcl93cml0ZShwb3J0LT5kY3JzLCBEQ1JPX1BFR1BMX01TR01TSywgMCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHBwYzR4eF9wY2lleF93YWl0X29uX3NkcihzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBzZHJfb2Zmc2V0LAotCQkJCQkgICB1bnNpZ25lZCBpbnQgbWFzaywKLQkJCQkJICAgdW5zaWduZWQgaW50IHZhbHVlLAotCQkJCQkgICBpbnQgdGltZW91dF9tcykKLXsKLQl1MzIgdmFsOwotCi0Jd2hpbGUodGltZW91dF9tcy0tKSB7Ci0JCXZhbCA9IG1mZGNyaShTRFIwLCBwb3J0LT5zZHJfYmFzZSArIHNkcl9vZmZzZXQpOwotCQlpZiAoKHZhbCAmIG1hc2spID09IHZhbHVlKSB7Ci0JCQlwcl9kZWJ1ZygiUENJRSVkOiBXYWl0IG9uIFNEUiAleCBzdWNjZXNzIHdpdGggdG0gJWQgKCUwOHgpXG4iLAotCQkJCSBwb3J0LT5pbmRleCwgc2RyX29mZnNldCwgdGltZW91dF9tcywgdmFsKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCW1zbGVlcCgxKTsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBwcGM0eHhfcGNpZXhfcG9ydF9pbml0KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKIHsKIAlpbnQgcmMgPSAwOwpAQCAtMTI5MSw0MCArMTMzNyw4IEBACiAJaWYgKHJjICE9IDApCiAJCXJldHVybiByYzsKIAotCXByaW50ayhLRVJOX0lORk8gIlBDSUUlZDogQ2hlY2tpbmcgbGluay4uLlxuIiwKLQkgICAgICAgcG9ydC0+aW5kZXgpOwotCi0JLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUgKi8KLQlpZiAocHBjNHh4X3BjaWV4X3dhaXRfb25fc2RyKHBvcnQsIFBFU0RSbl9SQ1NTVFMsIDEgPDwgMjAsIDAsIDEwKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0lFJWQ6IFBHUlNUIGZhaWxlZFxuIiwKLQkJICAgICAgIHBvcnQtPmluZGV4KTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIENoZWNrIGZvciBjYXJkIHByZXNlbmNlIGRldGVjdCBpZiBzdXBwb3J0ZWQsIGlmIG5vdCwganVzdCB3YWl0IGZvcgotCSAqIGxpbmsgdW5jb25kaXRpb25hbGx5LgotCSAqCi0JICogbm90ZSB0aGF0IHdlIGRvbid0IGZhaWwgaWYgdGhlcmUgaXMgbm8gbGluaywgd2UganVzdCBmaWx0ZXIgb3V0Ci0JICogY29uZmlnIHNwYWNlIGFjY2Vzc2VzLiBUaGF0IHdheSwgaXQgd2lsbCBiZSBlYXNpZXIgdG8gaW1wbGVtZW50Ci0JICogaG90cGx1ZyBsYXRlciBvbi4KLQkgKi8KLQlpZiAoIXBvcnQtPmhhc19pYnByZSB8fAotCSAgICAhcHBjNHh4X3BjaWV4X3dhaXRfb25fc2RyKHBvcnQsIFBFU0RSbl9MT09QLAotCQkJCSAgICAgIDEgPDwgMjgsIDEgPDwgMjgsIDEwMCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgIlBDSUUlZDogRGV2aWNlIGRldGVjdGVkLCB3YWl0aW5nIGZvciBsaW5rLi4uXG4iLAotCQkgICAgICAgcG9ydC0+aW5kZXgpOwotCQlpZiAocHBjNHh4X3BjaWV4X3dhaXRfb25fc2RyKHBvcnQsIFBFU0RSbl9MT09QLAotCQkJCQkgICAgIDB4MTAwMCwgMHgxMDAwLCAyMDAwKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiUENJRSVkOiBMaW5rIHVwIGZhaWxlZFxuIiwgcG9ydC0+aW5kZXgpOwotCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAiUENJRSVkOiBsaW5rIGlzIHVwICFcbiIsIHBvcnQtPmluZGV4KTsKLQkJCXBvcnQtPmxpbmsgPSAxOwotCQl9Ci0JfSBlbHNlCi0JCXByaW50ayhLRVJOX0lORk8gIlBDSUUlZDogTm8gZGV2aWNlIGRldGVjdGVkLlxuIiwgcG9ydC0+aW5kZXgpOworCWlmIChwcGM0eHhfcGNpZXhfaHdvcHMtPmNoZWNrX2xpbmspCisJCXBwYzR4eF9wY2lleF9od29wcy0+Y2hlY2tfbGluayhwb3J0KTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBtYXBwaW5nOiBkaXNhYmxlIGFsbCByZWdpb25zIGFuZCBjb25maWd1cmUKQEAgLTEzNDcsMTQgKzEzNjEsMTcgQEAKIAkvKgogCSAqIENoZWNrIGZvciBWQzAgYWN0aXZlIGFuZCBhc3NlcnQgUkRZLgogCSAqLwotCWlmIChwb3J0LT5saW5rICYmCi0JICAgIHBwYzR4eF9wY2lleF93YWl0X29uX3Nkcihwb3J0LCBQRVNEUm5fUkNTU1RTLAotCQkJCSAgICAgMSA8PCAxNiwgMSA8PCAxNiwgNTAwMCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJRSVkOiBWQzAgbm90IGFjdGl2ZVxuIiwgcG9ydC0+aW5kZXgpOwotCQlwb3J0LT5saW5rID0gMDsKKwlpZiAocG9ydC0+c2RyX2Jhc2UpIHsKKwkJaWYgKHBvcnQtPmxpbmsgJiYKKwkJICAgIHBwYzR4eF9wY2lleF93YWl0X29uX3Nkcihwb3J0LCBQRVNEUm5fUkNTU1RTLAorCQkJCQkgICAgIDEgPDwgMTYsIDEgPDwgMTYsIDUwMDApKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJQQ0lFJWQ6IFZDMCBub3QgYWN0aXZlXG4iLCBwb3J0LT5pbmRleCk7CisJCQlwb3J0LT5saW5rID0gMDsKKwkJfQorCisJCWRjcmlfY2xyc2V0KFNEUjAsIHBvcnQtPnNkcl9iYXNlICsgUEVTRFJuX1JDU1NFVCwgMCwgMSA8PCAyMCk7CiAJfQogCi0JZGNyaV9jbHJzZXQoU0RSMCwgcG9ydC0+c2RyX2Jhc2UgKyBQRVNEUm5fUkNTU0VULCAwLCAxIDw8IDIwKTsKIAltc2xlZXAoMTAwKTsKIAogCXJldHVybiAwOwpAQCAtMTYwNCw3ICsxNjIxLDcgQEAKIAkJaWYgKHBwYzR4eF9zZXR1cF9vbmVfcGNpZXhfUE9NKHBvcnQsIGhvc2UsIG1iYXNlLAogCQkJCQkgICAgICAgcmVzLT5zdGFydCwKIAkJCQkJICAgICAgIHJlcy0+c3RhcnQgLSBob3NlLT5wY2lfbWVtX29mZnNldCwKLQkJCQkJICAgICAgIHJlcy0+ZW5kICsgMSAtIHJlcy0+c3RhcnQsCisJCQkJCSAgICAgICByZXNvdXJjZV9zaXplKHJlcyksCiAJCQkJCSAgICAgICByZXMtPmZsYWdzLAogCQkJCQkgICAgICAgaikgPT0gMCkgewogCQkJaisrOwpAQCAtMTYzOSw3ICsxNjU2LDcgQEAKIAkJCQkJICAgICAgIHZvaWQgX19pb21lbSAqbWJhc2UsCiAJCQkJCSAgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKLQlyZXNvdXJjZV9zaXplX3Qgc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJcmVzb3VyY2Vfc2l6ZV90IHNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAJdTY0IHNhOwogCiAJaWYgKHBvcnQtPmVuZHBvaW50KSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZV9pYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWVfaWMuYwppbmRleCBiMmFjZGEwLi4xOGU3NWNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZV9pYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlX2ljLmMKQEAgLTM0Nyw3ICszNDcsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JcWVfaWMtPnJlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzLmVuZCAtIHJlcy5zdGFydCArIDEpOworCXFlX2ljLT5yZWdzID0gaW9yZW1hcChyZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJnJlcykpOwogCiAJcWVfaWMtPmlycWhvc3QtPmhvc3RfZGF0YSA9IHFlX2ljOwogCXFlX2ljLT5oY19pcnEgPSBxZV9pY19pcnFfY2hpcDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlX2lvLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZV9pby5jCmluZGV4IDc3ZTQ5MzQuLmZkMWE2YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlX2lvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWVfaW8uYwpAQCAtNDEsNyArNDEsNyBAQAogCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JcGFyX2lvID0gaW9yZW1hcChyZXMuc3RhcnQsIHJlcy5lbmQgLSByZXMuc3RhcnQgKyAxKTsKKwlwYXJfaW8gPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CiAKIAludW1fcG9ydHMgPSBvZl9nZXRfcHJvcGVydHkobnAsICJudW0tcG9ydHMiLCBOVUxMKTsKIAlpZiAobnVtX3BvcnRzKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1uYXRpdmUuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3AtbmF0aXZlLmMKaW5kZXggMWYxNWFkNC4uNTBlMzJhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1uYXRpdmUuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW5hdGl2ZS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTI0LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3hpY3MuaD4KKyNpbmNsdWRlIDxhc20va3ZtX3BwYy5oPgogCiBzdHJ1Y3QgaWNwX2lwbCB7CiAJdW5pb24gewpAQCAtMTM5LDYgKzE0MSwxMiBAQAogCWljcF9uYXRpdmVfc2V0X3FpcnIoY3B1LCBJUElfUFJJT1JJVFkpOwogfQogCit2b2lkIHhpY3Nfd2FrZV9jcHUoaW50IGNwdSkKK3sKKwlpY3BfbmF0aXZlX3NldF9xaXJyKGNwdSwgSVBJX1BSSU9SSVRZKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhpY3Nfd2FrZV9jcHUpOworCiBzdGF0aWMgaXJxcmV0dXJuX3QgaWNwX25hdGl2ZV9pcGlfYWN0aW9uKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpAQCAtMTg1LDYgKzE5Myw3IEBACiAJfQogCiAJaWNwX25hdGl2ZV9yZWdzW2NwdV0gPSBpb3JlbWFwKGFkZHIsIHNpemUpOworCWt2bXBwY19zZXRfeGljc19waHlzKGNwdSwgYWRkcik7CiAJaWYgKCFpY3BfbmF0aXZlX3JlZ3NbY3B1XSkgewogCQlwcl93YXJuaW5nKCJpY3BfbmF0aXZlOiBGYWlsZWQgaW9yZW1hcCBmb3IgQ1BVICVkLCAiCiAJCQkgICAiaW50ZXJydXB0IHNlcnZlciAjMHgleCwgYWRkciAlI2x4XG4iLApAQCAtMjQ3LDcgKzI1Niw3IEBACiAJCQlyZXR1cm4gLTE7CiAJCX0KIAotCQlpZiAoaWNwX25hdGl2ZV9tYXBfb25lX2NwdSgqaW5keCwgci5zdGFydCwgci5lbmQgLSByLnN0YXJ0KSkKKwkJaWYgKGljcF9uYXRpdmVfbWFwX29uZV9jcHUoKmluZHgsIHIuc3RhcnQsIHJlc291cmNlX3NpemUoJnIpKSkKIAkJCXJldHVybiAtMTsKIAogCQkoKmluZHgpKys7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvS2NvbmZpZyBiL2FyY2gvczM5MC9LY29uZmlnCmluZGV4IDlmYWIyYWEuLmMwM2ZlZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9LY29uZmlnCisrKyBiL2FyY2gvczM5MC9LY29uZmlnCkBAIC04OSw2ICs4OSw3IEBACiAJc2VsZWN0IEhBVkVfR0VUX1VTRVJfUEFHRVNfRkFTVAogCXNlbGVjdCBIQVZFX0FSQ0hfTVVURVhfQ1BVX1JFTEFYCiAJc2VsZWN0IEhBVkVfQVJDSF9KVU1QX0xBQkVMIGlmICFNQVJDSF9HNQorCXNlbGVjdCBIQVZFX1JDVV9UQUJMRV9GUkVFIGlmIFNNUAogCXNlbGVjdCBBUkNIX0lOTElORV9TUElOX1RSWUxPQ0sKIAlzZWxlY3QgQVJDSF9JTkxJTkVfU1BJTl9UUllMT0NLX0JICiAJc2VsZWN0IEFSQ0hfSU5MSU5FX1NQSU5fTE9DSwpAQCAtNTc4LDYgKzU3OSw3IEBACiAJZGVmX2Jvb2wgeQogCXByb21wdCAiczM5MCBndWVzdCBzdXBwb3J0IGZvciBLVk0gKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiA2NEJJVCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgVklSVFVBTElaQVRJT04KIAlzZWxlY3QgVklSVElPCiAJc2VsZWN0IFZJUlRJT19SSU5HCiAJc2VsZWN0IFZJUlRJT19DT05TT0xFCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL2hlYWQzMS5TIGIvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9oZWFkMzEuUwppbmRleCAyYTU1MjNhLi5lOGM5ZTE4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL2hlYWQzMS5TCisrKyBiL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvaGVhZDMxLlMKQEAgLTcsMTQgKzcsMTQgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgInNpemVzLmgiCiAKIF9fSEVBRAotCS5nbG9ibAlzdGFydHVwX2NvbnRpbnVlCi1zdGFydHVwX2NvbnRpbnVlOgorRU5UUlkoc3RhcnR1cF9jb250aW51ZSkKIAliYXNyCSVyMTMsMAkJCSMgZ2V0IGJhc2UKIC5MUEcxOgogCSMgc2V0dXAgc3RhY2sKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvaGVhZDY0LlMgYi9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL2hlYWQ2NC5TCmluZGV4IDI5ODJjYjEuLmY4NmE0ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvaGVhZDY0LlMKKysrIGIvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9oZWFkNjQuUwpAQCAtNywxNCArNywxNCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSAic2l6ZXMuaCIKIAogX19IRUFECi0JLmdsb2JsCXN0YXJ0dXBfY29udGludWUKLXN0YXJ0dXBfY29udGludWU6CitFTlRSWShzdGFydHVwX2NvbnRpbnVlKQogCWJhc3IJJXIxMywwCQkJIyBnZXQgYmFzZQogLkxQRzE6CiAJIyBzZXR1cCBzdGFjawpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jCmluZGV4IDVlZDhkNjQuLjAzMTdhMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTI1Nl9zMzkwLmMKQEAgLTEsMTUgKzEsMTIgQEAKIC8qCiAgKiBDcnlwdG9ncmFwaGljIEFQSS4KICAqCi0gKiBzMzkwIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTSEEyNTYgU2VjdXJlIEhhc2ggQWxnb3JpdGhtLgorICogczM5MCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0hBMjU2IGFuZCBTSEEyMjQgU2VjdXJlIEhhc2ggQWxnb3JpdGhtLgogICoKICAqIHMzOTAgVmVyc2lvbjoKLSAqICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA1LDIwMDcKKyAqICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA1LDIwMTEKICAqICAgQXV0aG9yKHMpOiBKYW4gR2xhdWJlciAoamFuZ0BkZS5pYm0uY29tKQogICoKLSAqIERlcml2ZWQgZnJvbSAiY3J5cHRvL3NoYTI1Nl9nZW5lcmljLmMiCi0gKiBhbmQgImFyY2gvczM5MC9jcnlwdG8vc2hhMV9zMzkwLmMiCi0gKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCiAgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCkBAIC02NSw3ICs2Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2hhc2hfYWxnIGFsZyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hhc2hfYWxnIHNoYTI1Nl9hbGcgPSB7CiAJLmRpZ2VzdHNpemUJPQlTSEEyNTZfRElHRVNUX1NJWkUsCiAJLmluaXQJCT0Jc2hhMjU2X2luaXQsCiAJLnVwZGF0ZQkJPQlzMzkwX3NoYV91cGRhdGUsCkBAIC04NCwyMiArODEsNjkgQEAKIAl9CiB9OwogCi1zdGF0aWMgaW50IHNoYTI1Nl9zMzkwX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgc2hhMjI0X2luaXQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCiB7CisJc3RydWN0IHMzOTBfc2hhX2N0eCAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJc2N0eC0+c3RhdGVbMF0gPSBTSEEyMjRfSDA7CisJc2N0eC0+c3RhdGVbMV0gPSBTSEEyMjRfSDE7CisJc2N0eC0+c3RhdGVbMl0gPSBTSEEyMjRfSDI7CisJc2N0eC0+c3RhdGVbM10gPSBTSEEyMjRfSDM7CisJc2N0eC0+c3RhdGVbNF0gPSBTSEEyMjRfSDQ7CisJc2N0eC0+c3RhdGVbNV0gPSBTSEEyMjRfSDU7CisJc2N0eC0+c3RhdGVbNl0gPSBTSEEyMjRfSDY7CisJc2N0eC0+c3RhdGVbN10gPSBTSEEyMjRfSDc7CisJc2N0eC0+Y291bnQgPSAwOworCXNjdHgtPmZ1bmMgPSBLSU1EX1NIQV8yNTY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgc2hhMjI0X2FsZyA9IHsKKwkuZGlnZXN0c2l6ZQk9CVNIQTIyNF9ESUdFU1RfU0laRSwKKwkuaW5pdAkJPQlzaGEyMjRfaW5pdCwKKwkudXBkYXRlCQk9CXMzOTBfc2hhX3VwZGF0ZSwKKwkuZmluYWwJCT0JczM5MF9zaGFfZmluYWwsCisJLmV4cG9ydAkJPQlzaGEyNTZfZXhwb3J0LAorCS5pbXBvcnQJCT0Jc2hhMjU2X2ltcG9ydCwKKwkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHMzOTBfc2hhX2N0eCksCisJLnN0YXRlc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMjU2X3N0YXRlKSwKKwkuYmFzZQkJPQl7CisJCS5jcmFfbmFtZQk9CSJzaGEyMjQiLAorCQkuY3JhX2RyaXZlcl9uYW1lPQkic2hhMjI0LXMzOTAiLAorCQkuY3JhX3ByaW9yaXR5CT0JQ1JZUFRfUzM5MF9QUklPUklUWSwKKwkJLmNyYV9mbGFncwk9CUNSWVBUT19BTEdfVFlQRV9TSEFTSCwKKwkJLmNyYV9ibG9ja3NpemUJPQlTSEEyMjRfQkxPQ0tfU0laRSwKKwkJLmNyYV9tb2R1bGUJPQlUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaGEyNTZfczM5MF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwogCWlmICghY3J5cHRfczM5MF9mdW5jX2F2YWlsYWJsZShLSU1EX1NIQV8yNTYsIENSWVBUX1MzOTBfTVNBKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9zaGFzaCgmYWxnKTsKKwlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfc2hhc2goJnNoYTI1Nl9hbGcpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfc2hhc2goJnNoYTIyNF9hbGcpOworCWlmIChyZXQgPCAwKQorCQljcnlwdG9fdW5yZWdpc3Rlcl9zaGFzaCgmc2hhMjU2X2FsZyk7CitvdXQ6CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNoYTI1Nl9zMzkwX2Zpbmkodm9pZCkKIHsKLQljcnlwdG9fdW5yZWdpc3Rlcl9zaGFzaCgmYWxnKTsKKwljcnlwdG9fdW5yZWdpc3Rlcl9zaGFzaCgmc2hhMjI0X2FsZyk7CisJY3J5cHRvX3VucmVnaXN0ZXJfc2hhc2goJnNoYTI1Nl9hbGcpOwogfQogCiBtb2R1bGVfaW5pdChzaGEyNTZfczM5MF9pbml0KTsKIG1vZHVsZV9leGl0KHNoYTI1Nl9zMzkwX2ZpbmkpOwogCiBNT0RVTEVfQUxJQVMoInNoYTI1NiIpOworTU9EVUxFX0FMSUFTKCJzaGEyMjQiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU0hBMjU2IFNlY3VyZSBIYXNoIEFsZ29yaXRobSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTSEEyNTYgYW5kIFNIQTIyNCBTZWN1cmUgSGFzaCBBbGdvcml0aG0iKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcnFmbGFncy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKaW5kZXggODY1ZDZkOC4uMzhmZGY0NSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKQEAgLTI5LDQyICsyOSw0MiBAQAogfSkKIAogLyogc2V0IHN5c3RlbSBtYXNrLiAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fYXJjaF9sb2NhbF9pcnFfc3NtKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgaW5saW5lIG5vdHJhY2Ugdm9pZCBfX2FyY2hfbG9jYWxfaXJxX3NzbSh1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCWFzbSB2b2xhdGlsZSgic3NtICAgJTAiIDogOiAiUSIgKGZsYWdzKSA6ICJtZW1vcnkiKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfc2F2ZV9mbGFncyh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKHZvaWQpCiB7CiAJcmV0dXJuIF9fYXJjaF9sb2NhbF9pcnFfc3Rvc20oMHgwMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX2lycV9zYXZlKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX2lycV9zYXZlKHZvaWQpCiB7CiAJcmV0dXJuIF9fYXJjaF9sb2NhbF9pcnFfc3Ruc20oMHhmYyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2Ugdm9pZCBhcmNoX2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCiB7CiAJYXJjaF9sb2NhbF9pcnFfc2F2ZSgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfZW5hYmxlKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2Ugdm9pZCBhcmNoX2xvY2FsX2lycV9lbmFibGUodm9pZCkKIHsKIAlfX2FyY2hfbG9jYWxfaXJxX3N0b3NtKDB4MDMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCV9fYXJjaF9sb2NhbF9pcnFfc3NtKGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGFyY2hfaXJxc19kaXNhYmxlZF9mbGFncyh1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBub3RyYWNlIGJvb2wgYXJjaF9pcnFzX2Rpc2FibGVkX2ZsYWdzKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJcmV0dXJuICEoZmxhZ3MgJiAoM1VMIDw8IChCSVRTX1BFUl9MT05HIC0gOCkpKTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGFyY2hfaXJxc19kaXNhYmxlZCh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIGJvb2wgYXJjaF9pcnFzX2Rpc2FibGVkKHZvaWQpCiB7CiAJcmV0dXJuIGFyY2hfaXJxc19kaXNhYmxlZF9mbGFncyhhcmNoX2xvY2FsX3NhdmVfZmxhZ3MoKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IGNlZjdkYmYuLjAwZmYwMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC05Myw5ICs5Myw3IEBACiAJX191MzIJc2Nhb2w7CQkJLyogMHgwMDY0ICovCiAJX191OAlyZXNlcnZlZDY4WzRdOwkJLyogMHgwMDY4ICovCiAJX191MzIJdG9kcHI7CQkJLyogMHgwMDZjICovCi0JX191OAlyZXNlcnZlZDcwWzE2XTsJCS8qIDB4MDA3MCAqLwotCV9fdTY0CWdtc29yOwkJCS8qIDB4MDA4MCAqLwotCV9fdTY0CWdtc2xtOwkJCS8qIDB4MDA4OCAqLworCV9fdTgJcmVzZXJ2ZWQ3MFszMl07CQkvKiAweDAwNzAgKi8KIAlwc3dfdAlncHN3OwkJCS8qIDB4MDA5MCAqLwogCV9fdTY0CWdnMTQ7CQkJLyogMHgwMGEwICovCiAJX191NjQJZ2cxNTsJCQkvKiAweDAwYTggKi8KQEAgLTEzOCw2ICsxMzYsNyBAQAogCXUzMiBpbnN0cnVjdGlvbl9jaHNjOwogCXUzMiBpbnN0cnVjdGlvbl9zdHNpOwogCXUzMiBpbnN0cnVjdGlvbl9zdGZsOworCXUzMiBpbnN0cnVjdGlvbl90cHJvdDsKIAl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9zZW5zZTsKIAl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9lbWVyZ2VuY3k7CiAJdTMyIGluc3RydWN0aW9uX3NpZ3Bfc3RvcDsKQEAgLTE3NSw2ICsxNzQsMTAgQEAKIAlfX3UzMiBhZGRyZXNzOwogfTsKIAorc3RydWN0IGt2bV9zMzkwX2VtZXJnX2luZm8geworCV9fdTE2IGNvZGU7Cit9OworCiBzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAl1NjQJdHlwZTsKQEAgLTE4Miw2ICsxODUsNyBAQAogCQlzdHJ1Y3Qga3ZtX3MzOTBfaW9faW5mbyBpbzsKIAkJc3RydWN0IGt2bV9zMzkwX2V4dF9pbmZvIGV4dDsKIAkJc3RydWN0IGt2bV9zMzkwX3BnbV9pbmZvIHBnbTsKKwkJc3RydWN0IGt2bV9zMzkwX2VtZXJnX2luZm8gZW1lcmc7CiAJCXN0cnVjdCBrdm1fczM5MF9wcmVmaXhfaW5mbyBwcmVmaXg7CiAJfTsKIH07CkBAIC0yMjYsNiArMjMwLDcgQEAKIAkJc3RydWN0IGNwdWlkCWNwdV9pZDsKIAkJdTY0CQlzdGlkcF9kYXRhOwogCX07CisJc3RydWN0IGdtYXAgKmdtYXA7CiB9OwogCiBzdHJ1Y3Qga3ZtX3ZtX3N0YXQgewpAQCAtMjM2LDYgKzI0MSw3IEBACiAJc3RydWN0IHNjYV9ibG9jayAqc2NhOwogCWRlYnVnX2luZm9fdCAqZGJmOwogCXN0cnVjdCBrdm1fczM5MF9mbG9hdF9pbnRlcnJ1cHQgZmxvYXRfaW50OworCXN0cnVjdCBnbWFwICpnbWFwOwogfTsKIAogZXh0ZXJuIGludCBzaWU2NGEoc3RydWN0IGt2bV9zMzkwX3NpZV9ibG9jayAqLCB1bnNpZ25lZCBsb25nICopOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xpbmthZ2UuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9saW5rYWdlLmgKaW5kZXggMjkxYzJkMC4uZmM4YTgyOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xpbmthZ2UuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbGlua2FnZS5oCkBAIC0xLDYgKzEsOSBAQAogI2lmbmRlZiBfX0FTTV9MSU5LQUdFX0gKICNkZWZpbmUgX19BU01fTElOS0FHRV9ICiAKLS8qIE5vdGhpbmcgdG8gc2VlIGhlcmUuLi4gKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKworI2RlZmluZSBfX0FMSUdOIC5hbGlnbiA0LCAweDA3CisjZGVmaW5lIF9fQUxJR05fU1RSIF9fc3RyaW5naWZ5KF9fQUxJR04pCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmgKaW5kZXggMjI4Y2YwYi4uZjI2MjgwZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oCkBAIC0yNjgsNyArMjY4LDcgQEAKIAlfX3U2NAl2ZHNvX3Blcl9jcHVfZGF0YTsJCS8qIDB4MDM1OCAqLwogCV9fdTY0CW1hY2hpbmVfZmxhZ3M7CQkJLyogMHgwMzYwICovCiAJX191NjQJZnRyYWNlX2Z1bmM7CQkJLyogMHgwMzY4ICovCi0JX191NjQJc2llX2hvb2s7CQkJLyogMHgwMzcwICovCisJX191NjQJZ21hcDsJCQkJLyogMHgwMzcwICovCiAJX191NjQJY21mX2hwcDsJCQkvKiAweDAzNzggKi8KIAogCS8qIEludGVycnVwdCByZXNwb25zZSBibG9jay4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXUuaAppbmRleCA4MmQwODQ3Li40NTA2NzkxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdS5oCkBAIC02LDYgKzYsNyBAQAogCXVuc2lnbmVkIGludCBmbHVzaF9tbTsKIAlzcGlubG9ja190IGxpc3RfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBndGFibGVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGdtYXBfbGlzdDsKIAl1bnNpZ25lZCBsb25nIGFzY2VfYml0czsKIAl1bnNpZ25lZCBsb25nIGFzY2VfbGltaXQ7CiAJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7CkBAIC0xNyw2ICsxOCw3IEBACiAKICNkZWZpbmUgSU5JVF9NTV9DT05URVhUKG5hbWUpCQkJCQkJICAgICAgXAogCS5jb250ZXh0Lmxpc3RfbG9jayAgICA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKG5hbWUuY29udGV4dC5saXN0X2xvY2spLCBcCi0JLmNvbnRleHQucGd0YWJsZV9saXN0ID0gTElTVF9IRUFEX0lOSVQobmFtZS5jb250ZXh0LnBndGFibGVfbGlzdCksCisJLmNvbnRleHQucGd0YWJsZV9saXN0ID0gTElTVF9IRUFEX0lOSVQobmFtZS5jb250ZXh0LnBndGFibGVfbGlzdCksICAgIFwKKwkuY29udGV4dC5nbWFwX2xpc3QgPSBMSVNUX0hFQURfSU5JVChuYW1lLmNvbnRleHQuZ21hcF9saXN0KSwKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGdhbGxvYy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BnYWxsb2MuaAppbmRleCBmNjMxNGFmLi44ZWVmOWI1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGdhbGxvYy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKQEAgLTE3LDE1ICsxNywxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKLSNkZWZpbmUgY2hlY2tfcGd0X2NhY2hlKCkJZG8ge30gd2hpbGUgKDApCi0KIHVuc2lnbmVkIGxvbmcgKmNyc3RfdGFibGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqKTsKIHZvaWQgY3JzdF90YWJsZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyAqKTsKLXZvaWQgY3JzdF90YWJsZV9mcmVlX3JjdShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcgKik7CiAKLXVuc2lnbmVkIGxvbmcgKnBhZ2VfdGFibGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqKTsKK3Vuc2lnbmVkIGxvbmcgKnBhZ2VfdGFibGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKTsKIHZvaWQgcGFnZV90YWJsZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyAqKTsKLXZvaWQgcGFnZV90YWJsZV9mcmVlX3JjdShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcgKik7CisjaWZkZWYgQ09ORklHX0hBVkVfUkNVX1RBQkxFX0ZSRUUKK3ZvaWQgcGFnZV90YWJsZV9mcmVlX3JjdShzdHJ1Y3QgbW11X2dhdGhlciAqLCB1bnNpZ25lZCBsb25nICopOwordm9pZCBfX3RsYl9yZW1vdmVfdGFibGUodm9pZCAqX3RhYmxlKTsKKyNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfdGFibGUodW5zaWduZWQgbG9uZyAqcywgdW5zaWduZWQgbG9uZyB2YWwsIHNpemVfdCBuKQogewpAQCAtMTE1LDYgKzExNSw3IEBACiB7CiAJc3Bpbl9sb2NrX2luaXQoJm1tLT5jb250ZXh0Lmxpc3RfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJm1tLT5jb250ZXh0LnBndGFibGVfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm1tLT5jb250ZXh0LmdtYXBfbGlzdCk7CiAJcmV0dXJuIChwZ2RfdCAqKSBjcnN0X3RhYmxlX2FsbG9jKG1tKTsKIH0KICNkZWZpbmUgcGdkX2ZyZWUobW0sIHBnZCkgY3JzdF90YWJsZV9mcmVlKG1tLCAodW5zaWduZWQgbG9uZyAqKSBwZ2QpCkBAIC0xMzMsOCArMTM0LDggQEAKIC8qCiAgKiBwYWdlIHRhYmxlIGVudHJ5IGFsbG9jYXRpb24vZnJlZSByb3V0aW5lcy4KICAqLwotI2RlZmluZSBwdGVfYWxsb2Nfb25lX2tlcm5lbChtbSwgdm1hZGRyKSAoKHB0ZV90ICopIHBhZ2VfdGFibGVfYWxsb2MobW0pKQotI2RlZmluZSBwdGVfYWxsb2Nfb25lKG1tLCB2bWFkZHIpICgocHRlX3QgKikgcGFnZV90YWJsZV9hbGxvYyhtbSkpCisjZGVmaW5lIHB0ZV9hbGxvY19vbmVfa2VybmVsKG1tLCB2bWFkZHIpICgocHRlX3QgKikgcGFnZV90YWJsZV9hbGxvYyhtbSwgdm1hZGRyKSkKKyNkZWZpbmUgcHRlX2FsbG9jX29uZShtbSwgdm1hZGRyKSAoKHB0ZV90ICopIHBhZ2VfdGFibGVfYWxsb2MobW0sIHZtYWRkcikpCiAKICNkZWZpbmUgcHRlX2ZyZWVfa2VybmVsKG1tLCBwdGUpIHBhZ2VfdGFibGVfZnJlZShtbSwgKHVuc2lnbmVkIGxvbmcgKikgcHRlKQogI2RlZmluZSBwdGVfZnJlZShtbSwgcHRlKSBwYWdlX3RhYmxlX2ZyZWUobW0sICh1bnNpZ25lZCBsb25nICopIHB0ZSkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IGU0ZWZhY2YuLjUxOWViNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMjkzLDE5ICsyOTMsNiBAQAogICogc3dhcCBwdGUgaXMgMTAxMSBhbmQgMDAwMSwgMDAxMSwgMDEwMSwgMDExMSBhcmUgaW52YWxpZC4KICAqLwogCi0vKiBQYWdlIHN0YXR1cyB0YWJsZSBiaXRzIGZvciB2aXJ0dWFsaXphdGlvbiAqLwotI2RlZmluZSBSQ1BfQUNDX0JJVFMJMHhmMDAwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgUkNQX0ZQX0JJVAkweDA4MDAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBSQ1BfUENMX0JJVAkweDAwODAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBSQ1BfSFJfQklUCTB4MDA0MDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFJDUF9IQ19CSVQJMHgwMDIwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgUkNQX0dSX0JJVAkweDAwMDQwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBSQ1BfR0NfQklUCTB4MDAwMjAwMDAwMDAwMDAwMFVMCi0KLS8qIFVzZXIgZGlydHkgLyByZWZlcmVuY2VkIGJpdCBmb3IgS1ZNJ3MgbWlncmF0aW9uIGZlYXR1cmUgKi8KLSNkZWZpbmUgS1ZNX1VSX0JJVAkweDAwMDA4MDAwMDAwMDAwMDBVTAotI2RlZmluZSBLVk1fVUNfQklUCTB4MDAwMDQwMDAwMDAwMDAwMFVMCi0KICNpZm5kZWYgX19zMzkweF9fCiAKIC8qIEJpdHMgaW4gdGhlIHNlZ21lbnQgdGFibGUgYWRkcmVzcy1zcGFjZS1jb250cm9sLWVsZW1lbnQgKi8KQEAgLTMyNSw2ICszMTIsMTkgQEAKICNkZWZpbmUgX1NFR01FTlRfRU5UUlkJCShfU0VHTUVOVF9FTlRSWV9QVEwpCiAjZGVmaW5lIF9TRUdNRU5UX0VOVFJZX0VNUFRZCShfU0VHTUVOVF9FTlRSWV9JTlYpCiAKKy8qIFBhZ2Ugc3RhdHVzIHRhYmxlIGJpdHMgZm9yIHZpcnR1YWxpemF0aW9uICovCisjZGVmaW5lIFJDUF9BQ0NfQklUUwkweGYwMDAwMDAwVUwKKyNkZWZpbmUgUkNQX0ZQX0JJVAkweDA4MDAwMDAwVUwKKyNkZWZpbmUgUkNQX1BDTF9CSVQJMHgwMDgwMDAwMFVMCisjZGVmaW5lIFJDUF9IUl9CSVQJMHgwMDQwMDAwMFVMCisjZGVmaW5lIFJDUF9IQ19CSVQJMHgwMDIwMDAwMFVMCisjZGVmaW5lIFJDUF9HUl9CSVQJMHgwMDA0MDAwMFVMCisjZGVmaW5lIFJDUF9HQ19CSVQJMHgwMDAyMDAwMFVMCisKKy8qIFVzZXIgZGlydHkgLyByZWZlcmVuY2VkIGJpdCBmb3IgS1ZNJ3MgbWlncmF0aW9uIGZlYXR1cmUgKi8KKyNkZWZpbmUgS1ZNX1VSX0JJVAkweDAwMDA4MDAwVUwKKyNkZWZpbmUgS1ZNX1VDX0JJVAkweDAwMDA0MDAwVUwKKwogI2Vsc2UgLyogX19zMzkweF9fICovCiAKIC8qIEJpdHMgaW4gdGhlIHNlZ21lbnQvcmVnaW9uIHRhYmxlIGFkZHJlc3Mtc3BhY2UtY29udHJvbC1lbGVtZW50ICovCkBAIC0zNjcsNiArMzY3LDE5IEBACiAjZGVmaW5lIF9TRUdNRU5UX0VOVFJZX0xBUkdFCTB4NDAwCS8qIFNURS1mb3JtYXQgY29udHJvbCwgbGFyZ2UgcGFnZSAgICovCiAjZGVmaW5lIF9TRUdNRU5UX0VOVFJZX0NPCTB4MTAwCS8qIGNoYW5nZS1yZWNvcmRpbmcgb3ZlcnJpZGUgICAqLwogCisvKiBQYWdlIHN0YXR1cyB0YWJsZSBiaXRzIGZvciB2aXJ0dWFsaXphdGlvbiAqLworI2RlZmluZSBSQ1BfQUNDX0JJVFMJMHhmMDAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgUkNQX0ZQX0JJVAkweDA4MDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBSQ1BfUENMX0JJVAkweDAwODAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBSQ1BfSFJfQklUCTB4MDA0MDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFJDUF9IQ19CSVQJMHgwMDIwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgUkNQX0dSX0JJVAkweDAwMDQwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBSQ1BfR0NfQklUCTB4MDAwMjAwMDAwMDAwMDAwMFVMCisKKy8qIFVzZXIgZGlydHkgLyByZWZlcmVuY2VkIGJpdCBmb3IgS1ZNJ3MgbWlncmF0aW9uIGZlYXR1cmUgKi8KKyNkZWZpbmUgS1ZNX1VSX0JJVAkweDAwMDA4MDAwMDAwMDAwMDBVTAorI2RlZmluZSBLVk1fVUNfQklUCTB4MDAwMDQwMDAwMDAwMDAwMFVMCisKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KIAogLyoKQEAgLTY0MSw2ICs2NTQsNDggQEAKICNlbmRpZgogfQogCisvKioKKyAqIHN0cnVjdCBnbWFwX3N0cnVjdCAtIGd1ZXN0IGFkZHJlc3Mgc3BhY2UKKyAqIEBtbTogcG9pbnRlciB0byB0aGUgcGFyZW50IG1tX3N0cnVjdAorICogQHRhYmxlOiBwb2ludGVyIHRvIHRoZSBwYWdlIGRpcmVjdG9yeQorICogQGNyc3RfbGlzdDogbGlzdCBvZiBhbGwgY3JzdCB0YWJsZXMgdXNlZCBpbiB0aGUgZ3Vlc3QgYWRkcmVzcyBzcGFjZQorICovCitzdHJ1Y3QgZ21hcCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXVuc2lnbmVkIGxvbmcgKnRhYmxlOworCXN0cnVjdCBsaXN0X2hlYWQgY3JzdF9saXN0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgZ21hcF9ybWFwIC0gcmV2ZXJzZSBtYXBwaW5nIGZvciBzZWdtZW50IHRhYmxlIGVudHJpZXMKKyAqIEBuZXh0OiBwb2ludGVyIHRvIHRoZSBuZXh0IGdtYXBfcm1hcCBzdHJ1Y3R1cmUgaW4gdGhlIGxpc3QKKyAqIEBlbnRyeTogcG9pbnRlciB0byBhIHNlZ21lbnQgdGFibGUgZW50cnkKKyAqLworc3RydWN0IGdtYXBfcm1hcCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGxvbmcgKmVudHJ5OworfTsKKworLyoqCisgKiBzdHJ1Y3QgZ21hcF9wZ3RhYmxlIC0gZ21hcCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBhIHBhZ2UgdGFibGUKKyAqIEB2bWFkZHI6IGFkZHJlc3Mgb2YgdGhlIDFNQiBzZWdtZW50IGluIHRoZSBwcm9jZXNzIHZpcnR1YWwgbWVtb3J5CisgKiBAbWFwcGVyOiBsaXN0IG9mIHNlZ21lbnQgdGFibGUgZW50cmllcyBtYXBpbmcgYSBwYWdlIHRhYmxlCisgKi8KK3N0cnVjdCBnbWFwX3BndGFibGUgeworCXVuc2lnbmVkIGxvbmcgdm1hZGRyOworCXN0cnVjdCBsaXN0X2hlYWQgbWFwcGVyOworfTsKKworc3RydWN0IGdtYXAgKmdtYXBfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pOwordm9pZCBnbWFwX2ZyZWUoc3RydWN0IGdtYXAgKmdtYXApOwordm9pZCBnbWFwX2VuYWJsZShzdHJ1Y3QgZ21hcCAqZ21hcCk7Cit2b2lkIGdtYXBfZGlzYWJsZShzdHJ1Y3QgZ21hcCAqZ21hcCk7CitpbnQgZ21hcF9tYXBfc2VnbWVudChzdHJ1Y3QgZ21hcCAqZ21hcCwgdW5zaWduZWQgbG9uZyBmcm9tLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgdG8sIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKK2ludCBnbWFwX3VubWFwX3NlZ21lbnQoc3RydWN0IGdtYXAgKmdtYXAsIHVuc2lnbmVkIGxvbmcgdG8sIHVuc2lnbmVkIGxvbmcgbGVuKTsKK3Vuc2lnbmVkIGxvbmcgZ21hcF9mYXVsdCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBnbWFwICopOworCiAvKgogICogQ2VydGFpbiBhcmNoaXRlY3R1cmVzIG5lZWQgdG8gZG8gc3BlY2lhbCB0aGluZ3Mgd2hlbiBQVEVzCiAgKiB3aXRoaW4gYSBwYWdlIHRhYmxlIGFyZSBkaXJlY3RseSBtb2RpZmllZC4gIFRodXMsIHRoZSBmb2xsb3dpbmcKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCAxMzAwYzMwLi41NWRmY2M4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC04MCw2ICs4MCw3IEBACiAJbW1fc2VnbWVudF90IG1tX3NlZ21lbnQ7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgcHJvdF9hZGRyOyAgICAgICAgLyogYWRkcmVzcyBvZiBwcm90ZWN0aW9uLWV4Y2VwLiAgICAgKi8KICAgICAgICAgdW5zaWduZWQgaW50IHRyYXBfbm87CisJdW5zaWduZWQgbG9uZyBnbWFwX2FkZHI7CS8qIGFkZHJlc3Mgb2YgbGFzdCBnbWFwIGZhdWx0LiAqLwogCXN0cnVjdCBwZXJfcmVncyBwZXJfdXNlcjsJLyogVXNlciBzcGVjaWZpZWQgUEVSIHJlZ2lzdGVycyAqLwogCXN0cnVjdCBwZXJfZXZlbnQgcGVyX2V2ZW50OwkvKiBDYXVzZSBvZiB0aGUgbGFzdCBQRVIgdHJhcCAqLwogICAgICAgICAvKiBwZmF1bHRfd2FpdCBpcyB1c2VkIHRvIGJsb2NrIHRoZSBwcm9jZXNzIG9uIGEgcGZhdWx0IGV2ZW50ICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3FkaW8uaAppbmRleCAzNTBlN2VlLi4xNWM5NzYyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9xZGlvLmgKQEAgLTEzOSwxMTAgKzEzOSw0NyBAQAogCXN0cnVjdCBzbGliZSBzbGliZVtRRElPX01BWF9CVUZGRVJTX1BFUl9RXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCgyMDQ4KSkpOwogCi0vKioKLSAqIHN0cnVjdCBzYmFsX2ZsYWdzIC0gc3RvcmFnZSBibG9jayBhZGRyZXNzIGxpc3QgZmxhZ3MKLSAqIEBsYXN0OiBsYXN0IGVudHJ5Ci0gKiBAY29udDogY29udGlndW91cyBzdG9yYWdlCi0gKiBAZnJhZzogZnJhZ21lbnRhdGlvbgotICovCi1zdHJ1Y3Qgc2JhbF9mbGFncyB7Ci0JdTgJOiAxOwotCXU4IGxhc3QgOiAxOwotCXU4IGNvbnQgOiAxOwotCXU4CTogMTsKLQl1OCBmcmFnIDogMjsKLQl1OAk6IDI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyNkZWZpbmUgU0JBTF9FRkxBR1NfTEFTVF9FTlRSWQkJMHg0MAorI2RlZmluZSBTQkFMX0VGTEFHU19DT05USUdVT1VTCQkweDIwCisjZGVmaW5lIFNCQUxfRUZMQUdTX0ZJUlNUX0ZSQUcJCTB4MDQKKyNkZWZpbmUgU0JBTF9FRkxBR1NfTUlERExFX0ZSQUcJCTB4MDgKKyNkZWZpbmUgU0JBTF9FRkxBR1NfTEFTVF9GUkFHCQkweDBjCisjZGVmaW5lIFNCQUxfRUZMQUdTX01BU0sJCTB4NmYKIAotI2RlZmluZSBTQkFMX0ZMQUdTX0ZJUlNUX0ZSQUcJCTB4MDQwMDAwMDBVTAotI2RlZmluZSBTQkFMX0ZMQUdTX01JRERMRV9GUkFHCQkweDA4MDAwMDAwVUwKLSNkZWZpbmUgU0JBTF9GTEFHU19MQVNUX0ZSQUcJCTB4MGMwMDAwMDBVTAotI2RlZmluZSBTQkFMX0ZMQUdTX0xBU1RfRU5UUlkJCTB4NDAwMDAwMDBVTAotI2RlZmluZSBTQkFMX0ZMQUdTX0NPTlRJR1VPVVMJCTB4MjAwMDAwMDBVTAotCi0jZGVmaW5lIFNCQUxfRkxBR1MwX0RBVEFfQ09OVElOVUFUSU9OCTB4MjBVTAorI2RlZmluZSBTQkFMX1NGTEFHUzBfUENJX1JFUQkJMHg0MAorI2RlZmluZSBTQkFMX1NGTEFHUzBfREFUQV9DT05USU5VQVRJT04JMHgyMAogCiAvKiBBd2Vzb21lIE9wZW5GQ1AgZXh0ZW5zaW9ucyAqLwotI2RlZmluZSBTQkFMX0ZMQUdTMF9UWVBFX1NUQVRVUwkJMHgwMFVMCi0jZGVmaW5lIFNCQUxfRkxBR1MwX1RZUEVfV1JJVEUJCTB4MDhVTAotI2RlZmluZSBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQJCTB4MTBVTAotI2RlZmluZSBTQkFMX0ZMQUdTMF9UWVBFX1dSSVRFX1JFQUQJMHgxOFVMCi0jZGVmaW5lIFNCQUxfRkxBR1MwX01PUkVfU0JBTFMJCTB4MDRVTAotI2RlZmluZSBTQkFMX0ZMQUdTMF9DT01NQU5ECQkweDAyVUwKLSNkZWZpbmUgU0JBTF9GTEFHUzBfTEFTVF9TQkFMCQkweDAwVUwKLSNkZWZpbmUgU0JBTF9GTEFHUzBfT05MWV9TQkFMCQlTQkFMX0ZMQUdTMF9DT01NQU5ECi0jZGVmaW5lIFNCQUxfRkxBR1MwX01JRERMRV9TQkFMCQlTQkFMX0ZMQUdTMF9NT1JFX1NCQUxTCi0jZGVmaW5lIFNCQUxfRkxBR1MwX0ZJUlNUX1NCQUwgU0JBTF9GTEFHUzBfTU9SRV9TQkFMUyB8IFNCQUxfRkxBR1MwX0NPTU1BTkQKLSNkZWZpbmUgU0JBTF9GTEFHUzBfUENJCQkJMHg0MAotCi0vKioKLSAqIHN0cnVjdCBzYmFsX3NiYWxmXzAgLSBzYmFsIGZsYWdzIGZvciBzYmFsZSAwCi0gKiBAcGNpOiBQQ0kgaW5kaWNhdG9yCi0gKiBAY29udDogZGF0YSBjb250aW51YXRpb24KLSAqIEBzYnR5cGU6IHN0b3JhZ2UtYmxvY2sgdHlwZSAoRkNQKQotICovCi1zdHJ1Y3Qgc2JhbF9zYmFsZl8wIHsKLQl1OAkgIDogMTsKLQl1OCBwY2kJICA6IDE7Ci0JdTggY29udCAgIDogMTsKLQl1OCBzYnR5cGUgOiAyOwotCXU4CSAgOiAzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qKgotICogc3RydWN0IHNiYWxfc2JhbGZfMSAtIHNiYWwgZmxhZ3MgZm9yIHNiYWxlIDEKLSAqIEBrZXk6IHN0b3JhZ2Uga2V5Ci0gKi8KLXN0cnVjdCBzYmFsX3NiYWxmXzEgewotCXU4ICAgICA6IDQ7Ci0JdTgga2V5IDogNDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKioKLSAqIHN0cnVjdCBzYmFsX3NiYWxmXzE0IC0gc2JhbCBmbGFncyBmb3Igc2JhbGUgMTQKLSAqIEBlcnJpZHg6IGVycm9yIGluZGV4Ci0gKi8KLXN0cnVjdCBzYmFsX3NiYWxmXzE0IHsKLQl1OAkgIDogNDsKLQl1OCBlcnJpZHggOiA0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qKgotICogc3RydWN0IHNiYWxfc2JhbGZfMTUgLSBzYmFsIGZsYWdzIGZvciBzYmFsZSAxNQotICogQHJlYXNvbjogcmVhc29uIGZvciBlcnJvciBzdGF0ZQotICovCi1zdHJ1Y3Qgc2JhbF9zYmFsZl8xNSB7Ci0JdTggcmVhc29uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qKgotICogdW5pb24gc2JhbF9zYmFsZiAtIHN0b3JhZ2UgYmxvY2sgYWRkcmVzcyBsaXN0IGZsYWdzCi0gKiBAaTA6IHNiYWxmMAotICogQGkxOiBzYmFsZjEKLSAqIEBpMTQ6IHNiYWxmMTQKLSAqIEBpMTU6IHNibGFmMTUKLSAqIEB2YWx1ZTogcmF3IHZhbHVlCi0gKi8KLXVuaW9uIHNiYWxfc2JhbGYgewotCXN0cnVjdCBzYmFsX3NiYWxmXzAgIGkwOwotCXN0cnVjdCBzYmFsX3NiYWxmXzEgIGkxOwotCXN0cnVjdCBzYmFsX3NiYWxmXzE0IGkxNDsKLQlzdHJ1Y3Qgc2JhbF9zYmFsZl8xNSBpMTU7Ci0JdTggdmFsdWU7Ci19OworI2RlZmluZSBTQkFMX1NGTEFHUzBfVFlQRV9TVEFUVVMJMHgwMAorI2RlZmluZSBTQkFMX1NGTEFHUzBfVFlQRV9XUklURQkJMHgwOAorI2RlZmluZSBTQkFMX1NGTEFHUzBfVFlQRV9SRUFECQkweDEwCisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9UWVBFX1dSSVRFX1JFQUQJMHgxOAorI2RlZmluZSBTQkFMX1NGTEFHUzBfTU9SRV9TQkFMUwkJMHgwNAorI2RlZmluZSBTQkFMX1NGTEFHUzBfQ09NTUFORAkJMHgwMgorI2RlZmluZSBTQkFMX1NGTEFHUzBfTEFTVF9TQkFMCQkweDAwCisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9PTkxZX1NCQUwJCVNCQUxfU0ZMQUdTMF9DT01NQU5ECisjZGVmaW5lIFNCQUxfU0ZMQUdTMF9NSURETEVfU0JBTAlTQkFMX1NGTEFHUzBfTU9SRV9TQkFMUworI2RlZmluZSBTQkFMX1NGTEFHUzBfRklSU1RfU0JBTCAoU0JBTF9TRkxBR1MwX01PUkVfU0JBTFMgfCBTQkFMX1NGTEFHUzBfQ09NTUFORCkKIAogLyoqCiAgKiBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAtIFNCQUwgZW50cnkKLSAqIEBmbGFnczogZmxhZ3MKKyAqIEBlZmxhZ3M6IFNCQUwgZW50cnkgZmxhZ3MKKyAqIEBzY291bnQ6IFNCQUwgY291bnQKKyAqIEBzZmxhZ3M6IHdob2xlIFNCQUwgZmxhZ3MKICAqIEBsZW5ndGg6IGxlbmd0aAogICogQGFkZHI6IGFkZHJlc3MKICovCiBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCB7Ci0JdTMyIGZsYWdzOworCXU4IGVmbGFnczsKKwkvKiBwcml2YXRlOiAqLworCXU4IHJlczE7CisJLyogcHVibGljOiAqLworCXU4IHNjb3VudDsKKwl1OCBzZmxhZ3M7CiAJdTMyIGxlbmd0aDsKICNpZmRlZiBDT05GSUdfMzJCSVQKIAkvKiBwcml2YXRlOiAqLwotCXZvaWQgKnJlc2VydmVkOworCXZvaWQgKnJlczI7CiAJLyogcHVibGljOiAqLwogI2VuZGlmCiAJdm9pZCAqYWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggYWQxMzgyZi4uMWE1ZGJiNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTk0LDYgKzk0LDcgQEAKICNkZWZpbmUgVElGX1NZU0NBTExfQVVESVQJOQkvKiBzeXNjYWxsIGF1ZGl0aW5nIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfU0VDQ09NUAkJMTAJLyogc2VjdXJlIGNvbXB1dGluZyAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRVBPSU5UCTExCS8qIHN5c2NhbGwgdHJhY2Vwb2ludCBpbnN0cnVtZW50YXRpb24gKi8KKyNkZWZpbmUgVElGX1NJRQkJCTEyCS8qIGd1ZXN0IGV4ZWN1dGlvbiBhY3RpdmUgKi8KICNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHCTE2CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZwogCQkJCQkgICBUSUZfTkVFRF9SRVNDSEVEICovCiAjZGVmaW5lIFRJRl8zMUJJVAkJMTcJLyogMzJiaXQgcHJvY2VzcyAqLwpAQCAtMTEzLDYgKzExNCw3IEBACiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMTw8VElGX1NZU0NBTExfQVVESVQpCiAjZGVmaW5lIF9USUZfU0VDQ09NUAkJKDE8PFRJRl9TRUNDT01QKQogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0VQT0lOVAkoMTw8VElGX1NZU0NBTExfVFJBQ0VQT0lOVCkKKyNkZWZpbmUgX1RJRl9TSUUJCSgxPDxUSUZfU0lFKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCiAjZGVmaW5lIF9USUZfMzFCSVQJCSgxPDxUSUZfMzFCSVQpCiAjZGVmaW5lIF9USUZfU0lOR0xFX1NURVAJKDE8PFRJRl9GUkVFWkUpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGxiLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGxiLmgKaW5kZXggNzdlZWU1NC4uYzY4N2EyYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYi5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGIuaApAQCAtMjYsNjcgKzI2LDYwIEBACiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAogc3RydWN0IG1tdV9nYXRoZXIgewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworI2lmZGVmIENPTkZJR19IQVZFX1JDVV9UQUJMRV9GUkVFCisJc3RydWN0IG1tdV90YWJsZV9iYXRjaCAqYmF0Y2g7CisjZW5kaWYKIAl1bnNpZ25lZCBpbnQgZnVsbG1tOwotCXVuc2lnbmVkIGludCBucl9wdGVzOwotCXVuc2lnbmVkIGludCBucl9weGRzOwotCXVuc2lnbmVkIGludCBtYXg7Ci0Jdm9pZCAqKmFycmF5OwotCXZvaWQgKmxvY2FsWzhdOworCXVuc2lnbmVkIGludCBuZWVkX2ZsdXNoOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9fdGxiX2FsbG9jX3BhZ2Uoc3RydWN0IG1tdV9nYXRoZXIgKnRsYikKLXsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9OT1dBSVQgfCBfX0dGUF9OT1dBUk4sIDApOworI2lmZGVmIENPTkZJR19IQVZFX1JDVV9UQUJMRV9GUkVFCitzdHJ1Y3QgbW11X3RhYmxlX2JhdGNoIHsKKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKKwl1bnNpZ25lZCBpbnQJCW5yOworCXZvaWQJCQkqdGFibGVzWzBdOworfTsKIAotCWlmIChhZGRyKSB7Ci0JCXRsYi0+YXJyYXkgPSAodm9pZCAqKSBhZGRyOwotCQl0bGItPm1heCA9IFBBR0VfU0laRSAvIHNpemVvZih2b2lkICopOwotCX0KLX0KKyNkZWZpbmUgTUFYX1RBQkxFX0JBVENICQlcCisJKChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IG1tdV90YWJsZV9iYXRjaCkpIC8gc2l6ZW9mKHZvaWQgKikpCisKK2V4dGVybiB2b2lkIHRsYl90YWJsZV9mbHVzaChzdHJ1Y3QgbW11X2dhdGhlciAqdGxiKTsKK2V4dGVybiB2b2lkIHRsYl9yZW1vdmVfdGFibGUoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgdm9pZCAqdGFibGUpOworI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0bGJfZ2F0aGVyX21tdShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLAogCQkJCSAgc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJICB1bnNpZ25lZCBpbnQgZnVsbF9tbV9mbHVzaCkKIHsKIAl0bGItPm1tID0gbW07Ci0JdGxiLT5tYXggPSBBUlJBWV9TSVpFKHRsYi0+bG9jYWwpOwotCXRsYi0+YXJyYXkgPSB0bGItPmxvY2FsOwogCXRsYi0+ZnVsbG1tID0gZnVsbF9tbV9mbHVzaDsKKwl0bGItPm5lZWRfZmx1c2ggPSAwOworI2lmZGVmIENPTkZJR19IQVZFX1JDVV9UQUJMRV9GUkVFCisJdGxiLT5iYXRjaCA9IE5VTEw7CisjZW5kaWYKIAlpZiAodGxiLT5mdWxsbW0pCiAJCV9fdGxiX2ZsdXNoX21tKG1tKTsKLQllbHNlCi0JCV9fdGxiX2FsbG9jX3BhZ2UodGxiKTsKLQl0bGItPm5yX3B0ZXMgPSAwOwotCXRsYi0+bnJfcHhkcyA9IHRsYi0+bWF4OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGxiX2ZsdXNoX21tdShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiKQogewotCWlmICghdGxiLT5mdWxsbW0gJiYgKHRsYi0+bnJfcHRlcyA+IDAgfHwgdGxiLT5ucl9weGRzIDwgdGxiLT5tYXgpKQotCQlfX3RsYl9mbHVzaF9tbSh0bGItPm1tKTsKLQl3aGlsZSAodGxiLT5ucl9wdGVzID4gMCkKLQkJcGFnZV90YWJsZV9mcmVlX3JjdSh0bGItPm1tLCB0bGItPmFycmF5Wy0tdGxiLT5ucl9wdGVzXSk7Ci0Jd2hpbGUgKHRsYi0+bnJfcHhkcyA8IHRsYi0+bWF4KQotCQljcnN0X3RhYmxlX2ZyZWVfcmN1KHRsYi0+bW0sIHRsYi0+YXJyYXlbdGxiLT5ucl9weGRzKytdKTsKKwlpZiAoIXRsYi0+bmVlZF9mbHVzaCkKKwkJcmV0dXJuOworCXRsYi0+bmVlZF9mbHVzaCA9IDA7CisJX190bGJfZmx1c2hfbW0odGxiLT5tbSk7CisjaWZkZWYgQ09ORklHX0hBVkVfUkNVX1RBQkxFX0ZSRUUKKwl0bGJfdGFibGVfZmx1c2godGxiKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGxiX2ZpbmlzaF9tbXUoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXRsYl9mbHVzaF9tbXUodGxiKTsKLQotCXJjdV90YWJsZV9mcmVlbGlzdF9maW5pc2goKTsKLQotCS8qIGtlZXAgdGhlIHBhZ2UgdGFibGUgY2FjaGUgd2l0aGluIGJvdW5kcyAqLwotCWNoZWNrX3BndF9jYWNoZSgpOwotCi0JaWYgKHRsYi0+YXJyYXkgIT0gdGxiLT5sb2NhbCkKLQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdGxiLT5hcnJheSwgMCk7CiB9CiAKIC8qCkBAIC0xMTIsMTIgKzEwNSwxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwZ3RhYmxlX3QgcHRlLAogCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlpZiAoIXRsYi0+ZnVsbG1tKSB7Ci0JCXRsYi0+YXJyYXlbdGxiLT5ucl9wdGVzKytdID0gcHRlOwotCQlpZiAodGxiLT5ucl9wdGVzID49IHRsYi0+bnJfcHhkcykKLQkJCXRsYl9mbHVzaF9tbXUodGxiKTsKLQl9IGVsc2UKLQkJcGFnZV90YWJsZV9mcmVlKHRsYi0+bW0sICh1bnNpZ25lZCBsb25nICopIHB0ZSk7CisjaWZkZWYgQ09ORklHX0hBVkVfUkNVX1RBQkxFX0ZSRUUKKwlpZiAoIXRsYi0+ZnVsbG1tKQorCQlyZXR1cm4gcGFnZV90YWJsZV9mcmVlX3JjdSh0bGIsICh1bnNpZ25lZCBsb25nICopIHB0ZSk7CisjZW5kaWYKKwlwYWdlX3RhYmxlX2ZyZWUodGxiLT5tbSwgKHVuc2lnbmVkIGxvbmcgKikgcHRlKTsKIH0KIAogLyoKQEAgLTEzMywxMiArMTI1LDExIEBACiAjaWZkZWYgX19zMzkweF9fCiAJaWYgKHRsYi0+bW0tPmNvbnRleHQuYXNjZV9saW1pdCA8PSAoMVVMIDw8IDMxKSkKIAkJcmV0dXJuOwotCWlmICghdGxiLT5mdWxsbW0pIHsKLQkJdGxiLT5hcnJheVstLXRsYi0+bnJfcHhkc10gPSBwbWQ7Ci0JCWlmICh0bGItPm5yX3B0ZXMgPj0gdGxiLT5ucl9weGRzKQotCQkJdGxiX2ZsdXNoX21tdSh0bGIpOwotCX0gZWxzZQotCQljcnN0X3RhYmxlX2ZyZWUodGxiLT5tbSwgKHVuc2lnbmVkIGxvbmcgKikgcG1kKTsKKyNpZmRlZiBDT05GSUdfSEFWRV9SQ1VfVEFCTEVfRlJFRQorCWlmICghdGxiLT5mdWxsbW0pCisJCXJldHVybiB0bGJfcmVtb3ZlX3RhYmxlKHRsYiwgcG1kKTsKKyNlbmRpZgorCWNyc3RfdGFibGVfZnJlZSh0bGItPm1tLCAodW5zaWduZWQgbG9uZyAqKSBwbWQpOwogI2VuZGlmCiB9CiAKQEAgLTE1NSwxMiArMTQ2LDExIEBACiAjaWZkZWYgX19zMzkweF9fCiAJaWYgKHRsYi0+bW0tPmNvbnRleHQuYXNjZV9saW1pdCA8PSAoMVVMIDw8IDQyKSkKIAkJcmV0dXJuOwotCWlmICghdGxiLT5mdWxsbW0pIHsKLQkJdGxiLT5hcnJheVstLXRsYi0+bnJfcHhkc10gPSBwdWQ7Ci0JCWlmICh0bGItPm5yX3B0ZXMgPj0gdGxiLT5ucl9weGRzKQotCQkJdGxiX2ZsdXNoX21tdSh0bGIpOwotCX0gZWxzZQotCQljcnN0X3RhYmxlX2ZyZWUodGxiLT5tbSwgKHVuc2lnbmVkIGxvbmcgKikgcHVkKTsKKyNpZmRlZiBDT05GSUdfSEFWRV9SQ1VfVEFCTEVfRlJFRQorCWlmICghdGxiLT5mdWxsbW0pCisJCXJldHVybiB0bGJfcmVtb3ZlX3RhYmxlKHRsYiwgcHVkKTsKKyNlbmRpZgorCWNyc3RfdGFibGVfZnJlZSh0bGItPm1tLCAodW5zaWduZWQgbG9uZyAqKSBwdWQpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggYjdhNGYyZS4uMzA0NDQ1MyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKQEAgLTgwLDcgKzgwLDcgQEAKIAkgKiBvbiBhbGwgY3B1cyBpbnN0ZWFkIG9mIGRvaW5nIGEgbG9jYWwgZmx1c2ggaWYgdGhlIG1tCiAJICogb25seSByYW4gb24gdGhlIGxvY2FsIGNwdS4KIAkgKi8KLQlpZiAoTUFDSElORV9IQVNfSURURSkKKwlpZiAoTUFDSElORV9IQVNfSURURSAmJiBsaXN0X2VtcHR5KCZtbS0+Y29udGV4dC5nbWFwX2xpc3QpKQogCQlfX3RsYl9mbHVzaF9pZHRlKCh1bnNpZ25lZCBsb25nKSBtbS0+cGdkIHwKIAkJCQkgbW0tPmNvbnRleHQuYXNjZV9iaXRzKTsKIAllbHNlCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggZWRmYmQxNy4uMDVkOGYzOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJREVGSU5FKF9fTENfRlBfQ1JFR19TQVZFX0FSRUEsIG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgZnB0X2NyZWdfc2F2ZV9hcmVhKSk7CiAJREVGSU5FKF9fTENfTEFTVF9CUkVBSywgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBicmVha2luZ19ldmVudF9hZGRyKSk7CiAJREVGSU5FKF9fTENfVkRTT19QRVJfQ1BVLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIHZkc29fcGVyX2NwdV9kYXRhKSk7Ci0JREVGSU5FKF9fTENfU0lFX0hPT0ssIG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgc2llX2hvb2spKTsKKwlERUZJTkUoX19MQ19HTUFQLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGdtYXApKTsKIAlERUZJTkUoX19MQ19DTUZfSFBQLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGNtZl9ocHApKTsKICNlbmRpZiAvKiBDT05GSUdfMzJCSVQgKi8KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9iYXNlLlMKaW5kZXggMTVlNDZjYS4uMjA5OTM4YyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9iYXNlLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9iYXNlLlMKQEAgLTYsMTMgKzYsMTMgQEAKICAqCQkgTWljaGFlbCBIb2x6aGV1IDxob2x6aGV1QGRlLmlibS5jb20+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKICNpZmRlZiBDT05GSUdfNjRCSVQKIAotCS5nbG9ibAlzMzkwX2Jhc2VfbWNja19oYW5kbGVyCi1zMzkwX2Jhc2VfbWNja19oYW5kbGVyOgorRU5UUlkoczM5MF9iYXNlX21jY2tfaGFuZGxlcikKIAliYXNyCSVyMTMsMAogMDoJbGcJJXIxNSxfX0xDX1BBTklDX1NUQUNLCSMgbG9hZCBwYW5pYyBzdGFjawogCWFnaGkJJXIxNSwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKQEAgLTI2LDEzICsyNiwxMyBAQAogCWxwc3dlCV9fTENfTUNLX09MRF9QU1cKIAogCS5zZWN0aW9uIC5ic3MKKwkuYWxpZ24gOAogCS5nbG9ibAlzMzkwX2Jhc2VfbWNja19oYW5kbGVyX2ZuCiBzMzkwX2Jhc2VfbWNja19oYW5kbGVyX2ZuOgogCS5xdWFkCTAKIAkucHJldmlvdXMKIAotCS5nbG9ibAlzMzkwX2Jhc2VfZXh0X2hhbmRsZXIKLXMzOTBfYmFzZV9leHRfaGFuZGxlcjoKK0VOVFJZKHMzOTBfYmFzZV9leHRfaGFuZGxlcikKIAlzdG1nCSVyMCwlcjE1LF9fTENfU0FWRV9BUkVBCiAJYmFzcgklcjEzLDAKIDA6CWFnaGkJJXIxNSwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKQEAgLTQ2LDEzICs0NiwxMyBAQAogCWxwc3dlCV9fTENfRVhUX09MRF9QU1cKIAogCS5zZWN0aW9uIC5ic3MKKwkuYWxpZ24gOAogCS5nbG9ibCBzMzkwX2Jhc2VfZXh0X2hhbmRsZXJfZm4KIHMzOTBfYmFzZV9leHRfaGFuZGxlcl9mbjoKIAkucXVhZAkwCiAJLnByZXZpb3VzCiAKLQkuZ2xvYmwJczM5MF9iYXNlX3BnbV9oYW5kbGVyCi1zMzkwX2Jhc2VfcGdtX2hhbmRsZXI6CitFTlRSWShzMzkwX2Jhc2VfcGdtX2hhbmRsZXIpCiAJc3RtZwklcjAsJXIxNSxfX0xDX1NBVkVfQVJFQQogCWJhc3IJJXIxMywwCiAwOglhZ2hpCSVyMTUsLVNUQUNLX0ZSQU1FX09WRVJIRUFECkBAIC03MCw2ICs3MCw3IEBACiAJLnF1YWQJMHgwMDAyMDAwMTgwMDAwMDAwLDB4MDAwMDAwMDAwMDAwMDAwMCArIHMzOTBfYmFzZV9wZ21faGFuZGxlcgogCiAJLnNlY3Rpb24gLmJzcworCS5hbGlnbiA4CiAJLmdsb2JsIHMzOTBfYmFzZV9wZ21faGFuZGxlcl9mbgogczM5MF9iYXNlX3BnbV9oYW5kbGVyX2ZuOgogCS5xdWFkCTAKQEAgLTc3LDggKzc4LDcgQEAKIAogI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAKLQkuZ2xvYmwJczM5MF9iYXNlX21jY2tfaGFuZGxlcgotczM5MF9iYXNlX21jY2tfaGFuZGxlcjoKK0VOVFJZKHMzOTBfYmFzZV9tY2NrX2hhbmRsZXIpCiAJYmFzcgklcjEzLDAKIDA6CWwJJXIxNSxfX0xDX1BBTklDX1NUQUNLCSMgbG9hZCBwYW5pYyBzdGFjawogCWFoaQklcjE1LC1TVEFDS19GUkFNRV9PVkVSSEVBRApAQCAtOTMsMTMgKzkzLDEzIEBACiAyOgkubG9uZwlzMzkwX2Jhc2VfbWNja19oYW5kbGVyX2ZuCiAKIAkuc2VjdGlvbiAuYnNzCisJLmFsaWduIDQKIAkuZ2xvYmwJczM5MF9iYXNlX21jY2tfaGFuZGxlcl9mbgogczM5MF9iYXNlX21jY2tfaGFuZGxlcl9mbjoKIAkubG9uZwkwCiAJLnByZXZpb3VzCiAKLQkuZ2xvYmwJczM5MF9iYXNlX2V4dF9oYW5kbGVyCi1zMzkwX2Jhc2VfZXh0X2hhbmRsZXI6CitFTlRSWShzMzkwX2Jhc2VfZXh0X2hhbmRsZXIpCiAJc3RtCSVyMCwlcjE1LF9fTENfU0FWRV9BUkVBCiAJYmFzcgklcjEzLDAKIDA6CWFoaQklcjE1LC1TVEFDS19GUkFNRV9PVkVSSEVBRApAQCAtMTE1LDEzICsxMTUsMTMgQEAKIDI6CS5sb25nCXMzOTBfYmFzZV9leHRfaGFuZGxlcl9mbgogCiAJLnNlY3Rpb24gLmJzcworCS5hbGlnbiA0CiAJLmdsb2JsCXMzOTBfYmFzZV9leHRfaGFuZGxlcl9mbgogczM5MF9iYXNlX2V4dF9oYW5kbGVyX2ZuOgogCS5sb25nCTAKIAkucHJldmlvdXMKIAotCS5nbG9ibAlzMzkwX2Jhc2VfcGdtX2hhbmRsZXIKLXMzOTBfYmFzZV9wZ21faGFuZGxlcjoKK0VOVFJZKHMzOTBfYmFzZV9wZ21faGFuZGxlcikKIAlzdG0JJXIwLCVyMTUsX19MQ19TQVZFX0FSRUEKIAliYXNyCSVyMTMsMAogMDoJYWhpCSVyMTUsLVNUQUNLX0ZSQU1FX09WRVJIRUFECkBAIC0xNDIsNiArMTQyLDcgQEAKIAkubG9uZwkweDAwMGEwMDAwLDB4MDAwMDAwMDAgKyBzMzkwX2Jhc2VfcGdtX2hhbmRsZXIKIAogCS5zZWN0aW9uIC5ic3MKKwkuYWxpZ24gNAogCS5nbG9ibAlzMzkwX2Jhc2VfcGdtX2hhbmRsZXJfZm4KIHMzOTBfYmFzZV9wZ21faGFuZGxlcl9mbjoKIAkubG9uZwkwCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKaW5kZXggMWY1ZWI3OC4uMDhhYjlhYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwpAQCAtNyw4NiArNyw3NCBAQAogKgkJVGhvbWFzIFNwYXR6aWVyICh0c3BhdEBkZS5pYm0uY29tKQogKi8KIAotCS5nbG9ibAlzeXMzMl9leGl0X3dyYXBwZXIKLXN5czMyX2V4aXRfd3JhcHBlcjoKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKK0VOVFJZKHN5czMyX2V4aXRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWpnCXN5c19leGl0CQkjIGJyYW5jaCB0byBzeXNfZXhpdAogCi0JLmdsb2JsCXN5czMyX3JlYWRfd3JhcHBlcgotc3lzMzJfcmVhZF93cmFwcGVyOgorRU5UUlkoc3lzMzJfcmVhZF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgogCWxsZ2ZyCSVyNCwlcjQJCQkjIHNpemVfdAogCWpnCXN5czMyX3JlYWQJCSMgYnJhbmNoIHRvIHN5c19yZWFkCiAKLQkuZ2xvYmwJc3lzMzJfd3JpdGVfd3JhcHBlcgotc3lzMzJfd3JpdGVfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3dyaXRlX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCiAJbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90CiAJamcJc3lzMzJfd3JpdGUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfb3Blbl93cmFwcGVyCi1zeXMzMl9vcGVuX3dyYXBwZXI6CitFTlRSWShzeXMzMl9vcGVuX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlsZ2ZyCSVyNCwlcjQJCQkjIGludAogCWpnCXN5c19vcGVuCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2Nsb3NlX3dyYXBwZXIKLXN5czMyX2Nsb3NlX3dyYXBwZXI6CitFTlRSWShzeXMzMl9jbG9zZV93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWpnCXN5c19jbG9zZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9jcmVhdF93cmFwcGVyCi1zeXMzMl9jcmVhdF93cmFwcGVyOgorRU5UUlkoc3lzMzJfY3JlYXRfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlsZ2ZyCSVyMywlcjMJCQkjIGludAogCWpnCXN5c19jcmVhdAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9saW5rX3dyYXBwZXIKLXN5czMyX2xpbmtfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2xpbmtfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKIAlqZwlzeXNfbGluawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl91bmxpbmtfd3JhcHBlcgotc3lzMzJfdW5saW5rX3dyYXBwZXI6CitFTlRSWShzeXMzMl91bmxpbmtfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlqZwlzeXNfdW5saW5rCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2NoZGlyX3dyYXBwZXIKLXN5czMyX2NoZGlyX3dyYXBwZXI6CitFTlRSWShzeXMzMl9jaGRpcl93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgogCWpnCXN5c19jaGRpcgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl90aW1lX3dyYXBwZXIKLXN5czMyX3RpbWVfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3RpbWVfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBpbnQgKgogCWpnCWNvbXBhdF9zeXNfdGltZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9ta25vZF93cmFwcGVyCi1zeXMzMl9ta25vZF93cmFwcGVyOgorRU5UUlkoc3lzMzJfbWtub2Rfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlsZ2ZyCSVyMywlcjMJCQkjIGludAogCWxsZ2ZyCSVyNCwlcjQJCQkjIGRldgogCWpnCXN5c19ta25vZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9jaG1vZF93cmFwcGVyCi1zeXMzMl9jaG1vZF93cmFwcGVyOgorRU5UUlkoc3lzMzJfY2htb2Rfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlsbGdmcgklcjMsJXIzCQkJIyBtb2RlX3QKIAlqZwlzeXNfY2htb2QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfbGNob3duMTZfd3JhcHBlcgotc3lzMzJfbGNob3duMTZfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2xjaG93bjE2X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCiAJbGxnZnIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90CiAJbGxnZnIJJXI0LCVyNAkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90CiAJamcJc3lzMzJfbGNob3duMTYJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfbHNlZWtfd3JhcHBlcgotc3lzMzJfbHNlZWtfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2xzZWVrX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGdmcgklcjMsJXIzCQkJIyBvZmZfdAogCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGludApAQCAtOTQsOCArODIsNyBAQAogCiAjc3lzMzJfZ2V0cGlkX3dyYXBwZXIJCQkJIyB2b2lkCiAKLQkuZ2xvYmwJc3lzMzJfbW91bnRfd3JhcHBlcgotc3lzMzJfbW91bnRfd3JhcHBlcjoKK0VOVFJZKHN5czMyX21vdW50X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCiAJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCiAJbGxndHIJJXI0LCVyNAkJCSMgY2hhciAqCkBAIC0xMDMsMTAyICs5MCw4NSBAQAogCWxsZ3RyCSVyNiwlcjYJCQkjIHZvaWQgKgogCWpnCWNvbXBhdF9zeXNfbW91bnQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9vbGR1bW91bnRfd3JhcHBlcgotc3lzMzJfb2xkdW1vdW50X3dyYXBwZXI6CitFTlRSWShzeXMzMl9vbGR1bW91bnRfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKIAlqZwlzeXNfb2xkdW1vdW50CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3NldHVpZDE2X3dyYXBwZXIKLXN5czMyX3NldHVpZDE2X3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXR1aWQxNl93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdAogCWpnCXN5czMyX3NldHVpZDE2CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCiAjc3lzMzJfZ2V0dWlkMTZfd3JhcHBlcgkJCSMgdm9pZAogCi0JLmdsb2JsCXN5czMyX3B0cmFjZV93cmFwcGVyCi1zeXMzMl9wdHJhY2Vfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3B0cmFjZV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgbG9uZwogCWxnZnIJJXIzLCVyMwkJCSMgbG9uZwogCWxsZ3RyCSVyNCwlcjQJCQkjIGxvbmcKIAlsbGdmcgklcjUsJXI1CQkJIyBsb25nCiAJamcJY29tcGF0X3N5c19wdHJhY2UJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9hbGFybV93cmFwcGVyCi1zeXMzMl9hbGFybV93cmFwcGVyOgorRU5UUlkoc3lzMzJfYWxhcm1fd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlqZwlzeXNfYWxhcm0JCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c191dGltZV93cmFwcGVyCi1jb21wYXRfc3lzX3V0aW1lX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3V0aW1lX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF91dGltYnVmICoKIAlqZwljb21wYXRfc3lzX3V0aW1lCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfYWNjZXNzX3dyYXBwZXIKLXN5czMyX2FjY2Vzc193cmFwcGVyOgorRU5UUlkoc3lzMzJfYWNjZXNzX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlqZwlzeXNfYWNjZXNzCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX25pY2Vfd3JhcHBlcgotc3lzMzJfbmljZV93cmFwcGVyOgorRU5UUlkoc3lzMzJfbmljZV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJamcJc3lzX25pY2UJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKICNzeXMzMl9zeW5jX3dyYXBwZXIJCQkjIHZvaWQKIAotCS5nbG9ibAlzeXMzMl9raWxsX3dyYXBwZXIKLXN5czMyX2tpbGxfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2tpbGxfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJamcJc3lzX2tpbGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfcmVuYW1lX3dyYXBwZXIKLXN5czMyX3JlbmFtZV93cmFwcGVyOgorRU5UUlkoc3lzMzJfcmVuYW1lX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCiAJbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCiAJamcJc3lzX3JlbmFtZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9ta2Rpcl93cmFwcGVyCi1zeXMzMl9ta2Rpcl93cmFwcGVyOgorRU5UUlkoc3lzMzJfbWtkaXJfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlsZ2ZyCSVyMywlcjMJCQkjIGludAogCWpnCXN5c19ta2RpcgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9ybWRpcl93cmFwcGVyCi1zeXMzMl9ybWRpcl93cmFwcGVyOgorRU5UUlkoc3lzMzJfcm1kaXJfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlqZwlzeXNfcm1kaXIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfZHVwX3dyYXBwZXIKLXN5czMyX2R1cF93cmFwcGVyOgorRU5UUlkoc3lzMzJfZHVwX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJamcJc3lzX2R1cAkJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfcGlwZV93cmFwcGVyCi1zeXMzMl9waXBlX3dyYXBwZXI6CitFTlRSWShzeXMzMl9waXBlX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgdTMyICoKIAlqZwlzeXNfcGlwZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAljb21wYXRfc3lzX3RpbWVzX3dyYXBwZXIKLWNvbXBhdF9zeXNfdGltZXNfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfdGltZXNfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgY29tcGF0X3RtcyAqCiAJamcJY29tcGF0X3N5c190aW1lcwkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2Jya193cmFwcGVyCi1zeXMzMl9icmtfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2Jya193cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKIAlqZwlzeXNfYnJrCQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9zZXRnaWQxNl93cmFwcGVyCi1zeXMzMl9zZXRnaWQxNl93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2V0Z2lkMTZfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QKIAlqZwlzeXMzMl9zZXRnaWQxNgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAogI3N5czMyX2dldGdpZDE2X3dyYXBwZXIJCQkjIHZvaWQKIAotCS5nbG9ibCBzeXMzMl9zaWduYWxfd3JhcHBlcgotc3lzMzJfc2lnbmFsX3dyYXBwZXI6CitFTlRSWShzeXMzMl9zaWduYWxfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIF9fc2lnaGFuZGxlcl90CiAJamcJc3lzX3NpZ25hbApAQCAtMjA3LDU1ICsxNzcsNDYgQEAKIAogI3N5czMyX2dldGVnaWQxNl93cmFwcGVyCQkjIHZvaWQKIAotCS5nbG9ibAlzeXMzMl9hY2N0X3dyYXBwZXIKLXN5czMyX2FjY3Rfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2FjY3Rfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKIAlqZwlzeXNfYWNjdAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl91bW91bnRfd3JhcHBlcgotc3lzMzJfdW1vdW50X3dyYXBwZXI6CitFTlRSWShzeXMzMl91bW91bnRfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKIAlsZ2ZyCSVyMywlcjMJCQkjIGludAogCWpnCXN5c191bW91bnQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19pb2N0bF93cmFwcGVyCi1jb21wYXRfc3lzX2lvY3RsX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX2lvY3RsX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50CiAJbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgaW50CiAJamcJY29tcGF0X3N5c19pb2N0bAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfZmNudGxfd3JhcHBlcgotY29tcGF0X3N5c19mY250bF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19mY250bF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAogCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKIAlqZwljb21wYXRfc3lzX2ZjbnRsCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfc2V0cGdpZF93cmFwcGVyCi1zeXMzMl9zZXRwZ2lkX3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXRwZ2lkX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAogCWxnZnIJJXIzLCVyMwkJCSMgcGlkX3QKIAlqZwlzeXNfc2V0cGdpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl91bWFza193cmFwcGVyCi1zeXMzMl91bWFza193cmFwcGVyOgorRU5UUlkoc3lzMzJfdW1hc2tfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWpnCXN5c191bWFzawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9jaHJvb3Rfd3JhcHBlcgotc3lzMzJfY2hyb290X3dyYXBwZXI6CitFTlRSWShzeXMzMl9jaHJvb3Rfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKIAlqZwlzeXNfY2hyb290CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsIHN5czMyX3VzdGF0X3dyYXBwZXIKLXN5czMyX3VzdGF0X3dyYXBwZXI6CitFTlRSWShzeXMzMl91c3RhdF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIGRldl90CiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHVzdGF0ICoKIAlqZwljb21wYXRfc3lzX3VzdGF0CiAKLQkuZ2xvYmwJc3lzMzJfZHVwMl93cmFwcGVyCi1zeXMzMl9kdXAyX3dyYXBwZXI6CitFTlRSWShzeXMzMl9kdXAyX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50CiAJamcJc3lzX2R1cDIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCkBAIC0yNjYsMjYyICsyMjcsMjIwIEBACiAKICNzeXMzMl9zZXRzaWRfd3JhcHBlcgkJCSMgdm9pZAogCi0JLmdsb2JsCXN5czMyX3NpZ2FjdGlvbl93cmFwcGVyCi1zeXMzMl9zaWdhY3Rpb25fd3JhcHBlcjoKK0VOVFJZKHN5czMyX3NpZ2FjdGlvbl93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgY29uc3Qgc3RydWN0IG9sZF9zaWdhY3Rpb24gKgogCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBvbGRfc2lnYWN0aW9uMzIgKgogCWpnCXN5czMyX3NpZ2FjdGlvbgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9zZXRyZXVpZDE2X3dyYXBwZXIKLXN5czMyX3NldHJldWlkMTZfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3NldHJldWlkMTZfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKIAlsbGdmcgklcjMsJXIzCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKIAlqZwlzeXMzMl9zZXRyZXVpZDE2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfc2V0cmVnaWQxNl93cmFwcGVyCi1zeXMzMl9zZXRyZWdpZDE2X3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXRyZWdpZDE2X3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90CiAJbGxnZnIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90CiAJamcJc3lzMzJfc2V0cmVnaWQxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsIHN5c19zaWdzdXNwZW5kX3dyYXBwZXIKLXN5c19zaWdzdXNwZW5kX3dyYXBwZXI6CitFTlRSWShzeXNfc2lnc3VzcGVuZF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlsbGdmcgklcjQsJXI0CQkJIyBvbGRfc2lnc2V0X3QKIAlqZwlzeXNfc2lnc3VzcGVuZAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfc2lncGVuZGluZ193cmFwcGVyCi1jb21wYXRfc3lzX3NpZ3BlbmRpbmdfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfc2lncGVuZGluZ193cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbXBhdF9vbGRfc2lnc2V0X3QgKgogCWpnCWNvbXBhdF9zeXNfc2lncGVuZGluZwkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3NldGhvc3RuYW1lX3dyYXBwZXIKLXN5czMyX3NldGhvc3RuYW1lX3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXRob3N0bmFtZV93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJamcJc3lzX3NldGhvc3RuYW1lCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfc2V0cmxpbWl0X3dyYXBwZXIKLWNvbXBhdF9zeXNfc2V0cmxpbWl0X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3NldHJsaW1pdF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBybGltaXRfZW11MzEgKgogCWpnCWNvbXBhdF9zeXNfc2V0cmxpbWl0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19vbGRfZ2V0cmxpbWl0X3dyYXBwZXIKLWNvbXBhdF9zeXNfb2xkX2dldHJsaW1pdF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19vbGRfZ2V0cmxpbWl0X3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHJsaW1pdF9lbXUzMSAqCiAJamcJY29tcGF0X3N5c19vbGRfZ2V0cmxpbWl0ICMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19nZXRybGltaXRfd3JhcHBlcgotY29tcGF0X3N5c19nZXRybGltaXRfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfZ2V0cmxpbWl0X3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHJsaW1pdF9lbXUzMSAqCiAJamcJY29tcGF0X3N5c19nZXRybGltaXQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9tbWFwMl93cmFwcGVyCi1zeXMzMl9tbWFwMl93cmFwcGVyOgorRU5UUlkoc3lzMzJfbW1hcDJfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxICoKIAlqZwlzeXMzMl9tbWFwMgkJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19nZXRydXNhZ2Vfd3JhcHBlcgotY29tcGF0X3N5c19nZXRydXNhZ2Vfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfZ2V0cnVzYWdlX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgcnVzYWdlX2VtdTMxICoKIAlqZwljb21wYXRfc3lzX2dldHJ1c2FnZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5X3dyYXBwZXIKLWNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX2dldHRpbWVvZmRheV93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCB0aW1ldmFsX2VtdTMxICoKIAlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgdGltZXpvbmUgKgogCWpnCWNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19zZXR0aW1lb2ZkYXlfd3JhcHBlcgotY29tcGF0X3N5c19zZXR0aW1lb2ZkYXlfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfc2V0dGltZW9mZGF5X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IHRpbWV2YWxfZW11MzEgKgogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCB0aW1lem9uZSAqCiAJamcJY29tcGF0X3N5c19zZXR0aW1lb2ZkYXkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9nZXRncm91cHMxNl93cmFwcGVyCi1zeXMzMl9nZXRncm91cHMxNl93cmFwcGVyOgorRU5UUlkoc3lzMzJfZ2V0Z3JvdXBzMTZfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAqCiAJamcJc3lzMzJfZ2V0Z3JvdXBzMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9zZXRncm91cHMxNl93cmFwcGVyCi1zeXMzMl9zZXRncm91cHMxNl93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2V0Z3JvdXBzMTZfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAqCiAJamcJc3lzMzJfc2V0Z3JvdXBzMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9zeW1saW5rX3dyYXBwZXIKLXN5czMyX3N5bWxpbmtfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3N5bWxpbmtfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKIAlqZwlzeXNfc3ltbGluawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9yZWFkbGlua193cmFwcGVyCi1zeXMzMl9yZWFkbGlua193cmFwcGVyOgorRU5UUlkoc3lzMzJfcmVhZGxpbmtfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKIAlsZ2ZyCSVyNCwlcjQJCQkjIGludAogCWpnCXN5c19yZWFkbGluawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl91c2VsaWJfd3JhcHBlcgotc3lzMzJfdXNlbGliX3dyYXBwZXI6CitFTlRSWShzeXMzMl91c2VsaWJfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlqZwlzeXNfdXNlbGliCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3N3YXBvbl93cmFwcGVyCi1zeXMzMl9zd2Fwb25fd3JhcHBlcjoKK0VOVFJZKHN5czMyX3N3YXBvbl93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJamcJc3lzX3N3YXBvbgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9yZWJvb3Rfd3JhcHBlcgotc3lzMzJfcmVib290X3dyYXBwZXI6CitFTlRSWShzeXMzMl9yZWJvb3Rfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgaW50CiAJbGxndHIJJXI1LCVyNQkJCSMgdm9pZCAqCiAJamcJc3lzX3JlYm9vdAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlvbGQzMl9yZWFkZGlyX3dyYXBwZXIKLW9sZDMyX3JlYWRkaXJfd3JhcHBlcjoKK0VOVFJZKG9sZDMyX3JlYWRkaXJfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyB2b2lkICoKIAlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBpbnQKIAlqZwljb21wYXRfc3lzX29sZF9yZWFkZGlyCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJb2xkMzJfbW1hcF93cmFwcGVyCi1vbGQzMl9tbWFwX3dyYXBwZXI6CitFTlRSWShvbGQzMl9tbWFwX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IG1tYXBfYXJnX3N0cnVjdF9lbXUzMSAqCiAJamcJb2xkMzJfbW1hcAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9tdW5tYXBfd3JhcHBlcgotc3lzMzJfbXVubWFwX3dyYXBwZXI6CitFTlRSWShzeXMzMl9tdW5tYXBfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCiAJbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90CiAJamcJc3lzX211bm1hcAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl90cnVuY2F0ZV93cmFwcGVyCi1zeXMzMl90cnVuY2F0ZV93cmFwcGVyOgorRU5UUlkoc3lzMzJfdHJ1bmNhdGVfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlsZ2ZyCSVyMywlcjMJCQkjIGxvbmcKIAlqZwlzeXNfdHJ1bmNhdGUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfZnRydW5jYXRlX3dyYXBwZXIKLXN5czMyX2Z0cnVuY2F0ZV93cmFwcGVyOgorRU5UUlkoc3lzMzJfZnRydW5jYXRlX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwogCWpnCXN5c19mdHJ1bmNhdGUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfZmNobW9kX3dyYXBwZXIKLXN5czMyX2ZjaG1vZF93cmFwcGVyOgorRU5UUlkoc3lzMzJfZmNobW9kX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxnZnIJJXIzLCVyMwkJCSMgbW9kZV90CiAJamcJc3lzX2ZjaG1vZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9mY2hvd24xNl93cmFwcGVyCi1zeXMzMl9mY2hvd24xNl93cmFwcGVyOgorRU5UUlkoc3lzMzJfZmNob3duMTZfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGdmcgklcjMsJXIzCQkJIyBjb21wYXRfdWlkX3QKIAlsbGdmcgklcjQsJXI0CQkJIyBjb21wYXRfdWlkX3QKIAlqZwlzeXMzMl9mY2hvd24xNgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9nZXRwcmlvcml0eV93cmFwcGVyCi1zeXMzMl9nZXRwcmlvcml0eV93cmFwcGVyOgorRU5UUlkoc3lzMzJfZ2V0cHJpb3JpdHlfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJamcJc3lzX2dldHByaW9yaXR5CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3NldHByaW9yaXR5X3dyYXBwZXIKLXN5czMyX3NldHByaW9yaXR5X3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXRwcmlvcml0eV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlsZ2ZyCSVyNCwlcjQJCQkjIGludAogCWpnCXN5c19zZXRwcmlvcml0eQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAljb21wYXRfc3lzX3N0YXRmc193cmFwcGVyCi1jb21wYXRfc3lzX3N0YXRmc193cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19zdGF0ZnNfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKIAlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3N0YXRmcyAqCiAJamcJY29tcGF0X3N5c19zdGF0ZnMJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAljb21wYXRfc3lzX2ZzdGF0ZnNfd3JhcHBlcgotY29tcGF0X3N5c19mc3RhdGZzX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX2ZzdGF0ZnNfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3N0YXRmcyAqCiAJamcJY29tcGF0X3N5c19mc3RhdGZzCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19zb2NrZXRjYWxsX3dyYXBwZXIKLWNvbXBhdF9zeXNfc29ja2V0Y2FsbF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19zb2NrZXRjYWxsX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyB1MzIgKgogCWpnCWNvbXBhdF9zeXNfc29ja2V0Y2FsbAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3N5c2xvZ193cmFwcGVyCi1zeXMzMl9zeXNsb2dfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3N5c2xvZ193cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCiAJbGdmcgklcjQsJXI0CQkJIyBpbnQKIAlqZwlzeXNfc3lzbG9nCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfc2V0aXRpbWVyX3dyYXBwZXIKLWNvbXBhdF9zeXNfc2V0aXRpbWVyX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3NldGl0aW1lcl93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGl0aW1lcnZhbF9lbXUzMSAqCiAJbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGl0aW1lcnZhbF9lbXUzMSAqCiAJamcJY29tcGF0X3N5c19zZXRpdGltZXIJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAljb21wYXRfc3lzX2dldGl0aW1lcl93cmFwcGVyCi1jb21wYXRfc3lzX2dldGl0aW1lcl93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19nZXRpdGltZXJfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBpdGltZXJ2YWxfZW11MzEgKgogCWpnCWNvbXBhdF9zeXNfZ2V0aXRpbWVyCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19uZXdzdGF0X3dyYXBwZXIKLWNvbXBhdF9zeXNfbmV3c3RhdF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19uZXdzdGF0X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHN0YXRfZW11MzEgKgogCWpnCWNvbXBhdF9zeXNfbmV3c3RhdAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfbmV3bHN0YXRfd3JhcHBlcgotY29tcGF0X3N5c19uZXdsc3RhdF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19uZXdsc3RhdF93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzdGF0X2VtdTMxICoKIAlqZwljb21wYXRfc3lzX25ld2xzdGF0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19uZXdmc3RhdF93cmFwcGVyCi1jb21wYXRfc3lzX25ld2ZzdGF0X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX25ld2ZzdGF0X3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHN0YXRfZW11MzEgKgogCWpnCWNvbXBhdF9zeXNfbmV3ZnN0YXQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAogI3N5czMyX3ZoYW5ndXBfd3JhcHBlcgkJCSMgdm9pZAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfd2FpdDRfd3JhcHBlcgotY29tcGF0X3N5c193YWl0NF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c193YWl0NF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgcGlkX3QKIAlsbGd0cgklcjMsJXIzCQkJIyB1bnNpZ25lZCBpbnQgKgogCWxnZnIJJXI0LCVyNAkJCSMgaW50CiAJbGxndHIJJXI1LCVyNQkJCSMgc3RydWN0IHJ1c2FnZSAqCiAJamcJY29tcGF0X3N5c193YWl0NAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3N3YXBvZmZfd3JhcHBlcgotc3lzMzJfc3dhcG9mZl93cmFwcGVyOgorRU5UUlkoc3lzMzJfc3dhcG9mZl93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgogCWpnCXN5c19zd2Fwb2ZmCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfc3lzaW5mb193cmFwcGVyCi1jb21wYXRfc3lzX3N5c2luZm9fd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfc3lzaW5mb193cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBzeXNpbmZvX2VtdTMxICoKIAlqZwljb21wYXRfc3lzX3N5c2luZm8JIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9pcGNfd3JhcHBlcgotc3lzMzJfaXBjX3dyYXBwZXI6CitFTlRSWShzeXMzMl9pcGNfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1aW50CiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlsZ2ZyCSVyNCwlcjQJCQkjIGludApAQCAtNTI5LDggKzQ0OCw3IEBACiAJbGxnZnIJJXI2LCVyNgkJCSMgdTMyCiAJamcJc3lzMzJfaXBjCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2ZzeW5jX3dyYXBwZXIKLXN5czMyX2ZzeW5jX3dyYXBwZXI6CitFTlRSWShzeXMzMl9mc3luY193cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWpnCXN5c19mc3luYwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIApAQCAtNTM4LDk3ICs0NTYsODEgQEAKIAogI3N5czMyX2Nsb25lX3dyYXBwZXIJCQkjIGRvbmUgaW4gY2xvbmVfZ2x1ZQogCi0JLmdsb2JsCXN5czMyX3NldGRvbWFpbm5hbWVfd3JhcHBlcgotc3lzMzJfc2V0ZG9tYWlubmFtZV93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2V0ZG9tYWlubmFtZV93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJamcJc3lzX3NldGRvbWFpbm5hbWUJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9uZXd1bmFtZV93cmFwcGVyCi1zeXMzMl9uZXd1bmFtZV93cmFwcGVyOgorRU5UUlkoc3lzMzJfbmV3dW5hbWVfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgbmV3X3V0c25hbWUgKgogCWpnCXN5c19uZXd1bmFtZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAljb21wYXRfc3lzX2FkanRpbWV4X3dyYXBwZXIKLWNvbXBhdF9zeXNfYWRqdGltZXhfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfYWRqdGltZXhfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWV4ICoKIAlqZwljb21wYXRfc3lzX2FkanRpbWV4CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfbXByb3RlY3Rfd3JhcHBlcgotc3lzMzJfbXByb3RlY3Rfd3JhcHBlcjoKK0VOVFJZKHN5czMyX21wcm90ZWN0X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZyAoYWN0dWFsbHkgcG9pbnRlcgogCWxsZ2ZyCSVyMywlcjMJCQkjIHNpemVfdAogCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKIAlqZwlzeXNfbXByb3RlY3QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19zaWdwcm9jbWFza193cmFwcGVyCi1jb21wYXRfc3lzX3NpZ3Byb2NtYXNrX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3NpZ3Byb2NtYXNrX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjb21wYXRfb2xkX3NpZ3NldF90ICoKIAlsbGd0cgklcjQsJXI0CQkJIyBjb21wYXRfb2xkX3NpZ3NldF90ICoKIAlqZwljb21wYXRfc3lzX3NpZ3Byb2NtYXNrCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5c19pbml0X21vZHVsZV93cmFwcGVyCi1zeXNfaW5pdF9tb2R1bGVfd3JhcHBlcjoKK0VOVFJZKHN5c19pbml0X21vZHVsZV93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIHZvaWQgKgogCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKIAlsbGd0cgklcjQsJXI0CQkJIyBjaGFyICoKIAlqZwlzeXNfaW5pdF9tb2R1bGUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzX2RlbGV0ZV9tb2R1bGVfd3JhcHBlcgotc3lzX2RlbGV0ZV9tb2R1bGVfd3JhcHBlcjoKK0VOVFJZKHN5c19kZWxldGVfbW9kdWxlX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50CiAJamcJc3lzX2RlbGV0ZV9tb2R1bGUJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9xdW90YWN0bF93cmFwcGVyCi1zeXMzMl9xdW90YWN0bF93cmFwcGVyOgorRU5UUlkoc3lzMzJfcXVvdGFjdGxfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKIAlsbGdmcgklcjQsJXI0CQkJIyBxaWRfdAogCWxsZ3RyCSVyNSwlcjUJCQkjIGNhZGRyX3QKIAlqZwlzeXNfcXVvdGFjdGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfZ2V0cGdpZF93cmFwcGVyCi1zeXMzMl9nZXRwZ2lkX3dyYXBwZXI6CitFTlRSWShzeXMzMl9nZXRwZ2lkX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAogCWpnCXN5c19nZXRwZ2lkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2ZjaGRpcl93cmFwcGVyCi1zeXMzMl9mY2hkaXJfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2ZjaGRpcl93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWpnCXN5c19mY2hkaXIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfYmRmbHVzaF93cmFwcGVyCi1zeXMzMl9iZGZsdXNoX3dyYXBwZXI6CitFTlRSWShzeXMzMl9iZGZsdXNoX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsZ2ZyCSVyMywlcjMJCQkjIGxvbmcKIAlqZwlzeXNfYmRmbHVzaAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9zeXNmc193cmFwcGVyCi1zeXMzMl9zeXNmc193cmFwcGVyOgorRU5UUlkoc3lzMzJfc3lzZnNfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKIAlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCiAJamcJc3lzX3N5c2ZzCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3BlcnNvbmFsaXR5X3dyYXBwZXIKLXN5czMyX3BlcnNvbmFsaXR5X3dyYXBwZXI6CitFTlRSWShzeXMzMl9wZXJzb25hbGl0eV93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWpnCXN5c19zMzkwX3BlcnNvbmFsaXR5CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfc2V0ZnN1aWQxNl93cmFwcGVyCi1zeXMzMl9zZXRmc3VpZDE2X3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXRmc3VpZDE2X3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90CiAJamcJc3lzMzJfc2V0ZnN1aWQxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3NldGZzZ2lkMTZfd3JhcHBlcgotc3lzMzJfc2V0ZnNnaWQxNl93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2V0ZnNnaWQxNl93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdAogCWpnCXN5czMyX3NldGZzZ2lkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9sbHNlZWtfd3JhcHBlcgotc3lzMzJfbGxzZWVrX3dyYXBwZXI6CitFTlRSWShzeXMzMl9sbHNlZWtfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCiAJbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwpAQCAtNjM2LDE1ICs1MzgsMTMgQEAKIAlsbGdmcgklcjYsJXI2CQkJIyB1bnNpZ25lZCBpbnQKIAlqZwlzeXNfbGxzZWVrCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2dldGRlbnRzX3dyYXBwZXIKLXN5czMyX2dldGRlbnRzX3dyYXBwZXI6CitFTlRSWShzeXMzMl9nZXRkZW50c193cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIHZvaWQgKgogCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGludAogCWpnCWNvbXBhdF9zeXNfZ2V0ZGVudHMJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAljb21wYXRfc3lzX3NlbGVjdF93cmFwcGVyCi1jb21wYXRfc3lzX3NlbGVjdF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19zZWxlY3Rfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNvbXBhdF9mZF9zZXQgKgogCWxsZ3RyCSVyNCwlcjQJCQkjIGNvbXBhdF9mZF9zZXQgKgpAQCAtNjUyLDExMiArNTUyLDk0IEBACiAJbGxndHIJJXI2LCVyNgkJCSMgc3RydWN0IGNvbXBhdF90aW1ldmFsICoKIAlqZwljb21wYXRfc3lzX3NlbGVjdAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2Zsb2NrX3dyYXBwZXIKLXN5czMyX2Zsb2NrX3dyYXBwZXI6CitFTlRSWShzeXMzMl9mbG9ja193cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAogCWpnCXN5c19mbG9jawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9tc3luY193cmFwcGVyCi1zeXMzMl9tc3luY193cmFwcGVyOgorRU5UUlkoc3lzMzJfbXN5bmNfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCiAJbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90CiAJbGdmcgklcjQsJXI0CQkJIyBpbnQKIAlqZwlzeXNfbXN5bmMJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19yZWFkdl93cmFwcGVyCi1jb21wYXRfc3lzX3JlYWR2X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3JlYWR2X3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjICoKIAlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCiAJamcJY29tcGF0X3N5c19yZWFkdgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfd3JpdGV2X3dyYXBwZXIKLWNvbXBhdF9zeXNfd3JpdGV2X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3dyaXRldl93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyAqCiAJbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwogCWpnCWNvbXBhdF9zeXNfd3JpdGV2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfZ2V0c2lkX3dyYXBwZXIKLXN5czMyX2dldHNpZF93cmFwcGVyOgorRU5UUlkoc3lzMzJfZ2V0c2lkX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAogCWpnCXN5c19nZXRzaWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfZmRhdGFzeW5jX3dyYXBwZXIKLXN5czMyX2ZkYXRhc3luY193cmFwcGVyOgorRU5UUlkoc3lzMzJfZmRhdGFzeW5jX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJamcJc3lzX2ZkYXRhc3luYwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9tbG9ja193cmFwcGVyCi1zeXMzMl9tbG9ja193cmFwcGVyOgorRU5UUlkoc3lzMzJfbWxvY2tfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCiAJbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90CiAJamcJc3lzX21sb2NrCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX211bmxvY2tfd3JhcHBlcgotc3lzMzJfbXVubG9ja193cmFwcGVyOgorRU5UUlkoc3lzMzJfbXVubG9ja193cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKIAlsbGdmcgklcjMsJXIzCQkJIyBzaXplX3QKIAlqZwlzeXNfbXVubG9jawkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9tbG9ja2FsbF93cmFwcGVyCi1zeXMzMl9tbG9ja2FsbF93cmFwcGVyOgorRU5UUlkoc3lzMzJfbWxvY2thbGxfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWpnCXN5c19tbG9ja2FsbAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAogI3N5czMyX211bmxvY2thbGxfd3JhcHBlcgkJIyB2b2lkCiAKLQkuZ2xvYmwJc3lzMzJfc2NoZWRfc2V0cGFyYW1fd3JhcHBlcgotc3lzMzJfc2NoZWRfc2V0cGFyYW1fd3JhcHBlcjoKK0VOVFJZKHN5czMyX3NjaGVkX3NldHBhcmFtX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzY2hlZF9wYXJhbSAqCiAJamcJc3lzX3NjaGVkX3NldHBhcmFtCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfc2NoZWRfZ2V0cGFyYW1fd3JhcHBlcgotc3lzMzJfc2NoZWRfZ2V0cGFyYW1fd3JhcHBlcjoKK0VOVFJZKHN5czMyX3NjaGVkX2dldHBhcmFtX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzY2hlZF9wYXJhbSAqCiAJamcJc3lzX3NjaGVkX2dldHBhcmFtCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfc2NoZWRfc2V0c2NoZWR1bGVyX3dyYXBwZXIKLXN5czMyX3NjaGVkX3NldHNjaGVkdWxlcl93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2NoZWRfc2V0c2NoZWR1bGVyX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IHNjaGVkX3BhcmFtICoKIAlqZwlzeXNfc2NoZWRfc2V0c2NoZWR1bGVyCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfc2NoZWRfZ2V0c2NoZWR1bGVyX3dyYXBwZXIKLXN5czMyX3NjaGVkX2dldHNjaGVkdWxlcl93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2NoZWRfZ2V0c2NoZWR1bGVyX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAogCWpnCXN5c19zY2hlZF9nZXRzY2hlZHVsZXIJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAogI3N5czMyX3NjaGVkX3lpZWxkX3dyYXBwZXIJCSMgdm9pZAogCi0JLmdsb2JsCXN5czMyX3NjaGVkX2dldF9wcmlvcml0eV9tYXhfd3JhcHBlcgotc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heF93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJamcJc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9zY2hlZF9nZXRfcHJpb3JpdHlfbWluX3dyYXBwZXIKLXN5czMyX3NjaGVkX2dldF9wcmlvcml0eV9taW5fd3JhcHBlcjoKK0VOVFJZKHN5czMyX3NjaGVkX2dldF9wcmlvcml0eV9taW5fd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWpnCXN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfc2NoZWRfcnJfZ2V0X2ludGVydmFsX3dyYXBwZXIKLXN5czMyX3NjaGVkX3JyX2dldF9pbnRlcnZhbF93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2NoZWRfcnJfZ2V0X2ludGVydmFsX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgogCWpnCXN5czMyX3NjaGVkX3JyX2dldF9pbnRlcnZhbAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfbmFub3NsZWVwX3dyYXBwZXIKLWNvbXBhdF9zeXNfbmFub3NsZWVwX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX25hbm9zbGVlcF93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgogCWpnCWNvbXBhdF9zeXNfbmFub3NsZWVwCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX21yZW1hcF93cmFwcGVyCi1zeXMzMl9tcmVtYXBfd3JhcHBlcjoKK0VOVFJZKHN5czMyX21yZW1hcF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKIAlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCiAJbGxnZnIJJXI0LCVyNAkJCSMgdW5zaWduZWQgbG9uZwpAQCAtNzY1LDUwICs2NDcsNDMgQEAKIAlsbGdmcgklcjYsJXI2CQkJIyB1bnNpZ25lZCBsb25nCiAJamcJc3lzX21yZW1hcAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9zZXRyZXN1aWQxNl93cmFwcGVyCi1zeXMzMl9zZXRyZXN1aWQxNl93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2V0cmVzdWlkMTZfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKIAlsbGdmcgklcjMsJXIzCQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKIAlsbGdmcgklcjQsJXI0CQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QKIAlqZwlzeXMzMl9zZXRyZXN1aWQxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2dldHJlc3VpZDE2X3dyYXBwZXIKLXN5czMyX2dldHJlc3VpZDE2X3dyYXBwZXI6CitFTlRSWShzeXMzMl9nZXRyZXN1aWQxNl93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdCAqCiAJbGxndHIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX3VpZF9lbXUzMV90ICoKIAlsbGd0cgklcjQsJXI0CQkJIyBfX2tlcm5lbF9vbGRfdWlkX2VtdTMxX3QgKgogCWpnCXN5czMyX2dldHJlc3VpZDE2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfcG9sbF93cmFwcGVyCi1zeXMzMl9wb2xsX3dyYXBwZXI6CitFTlRSWShzeXMzMl9wb2xsX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IHBvbGxmZCAqCiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50CiAJbGdmcgklcjQsJXI0CQkJIyBsb25nCiAJamcJc3lzX3BvbGwJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19uZnNzZXJ2Y3RsX3dyYXBwZXIKLWNvbXBhdF9zeXNfbmZzc2VydmN0bF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19uZnNzZXJ2Y3RsX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X25mc2N0bF9hcmcqCiAJbGxndHIJJXI0LCVyNAkJCSMgdW5pb24gY29tcGF0X25mc2N0bF9yZXMqCiAJamcJY29tcGF0X3N5c19uZnNzZXJ2Y3RsCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfc2V0cmVzZ2lkMTZfd3JhcHBlcgotc3lzMzJfc2V0cmVzZ2lkMTZfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3NldHJlc2dpZDE2X3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90CiAJbGxnZnIJJXIzLCVyMwkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90CiAJbGxnZnIJJXI0LCVyNAkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90CiAJamcJc3lzMzJfc2V0cmVzZ2lkMTYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9nZXRyZXNnaWQxNl93cmFwcGVyCi1zeXMzMl9nZXRyZXNnaWQxNl93cmFwcGVyOgorRU5UUlkoc3lzMzJfZ2V0cmVzZ2lkMTZfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBfX2tlcm5lbF9vbGRfZ2lkX2VtdTMxX3QgKgogCWxsZ3RyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdCAqCiAJbGxndHIJJXI0LCVyNAkJCSMgX19rZXJuZWxfb2xkX2dpZF9lbXUzMV90ICoKIAlqZwlzeXMzMl9nZXRyZXNnaWQxNgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3ByY3RsX3dyYXBwZXIKLXN5czMyX3ByY3RsX3dyYXBwZXI6CitFTlRSWShzeXMzMl9wcmN0bF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwogCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKQEAgLTgxOCw1MSArNjkzLDQ0IEBACiAKICNzeXMzMl9ydF9zaWdyZXR1cm5fd3JhcHBlcgkJIyBkb25lIGluIHJ0X3NpZ3JldHVybl9nbHVlCiAKLQkuZ2xvYmwJc3lzMzJfcnRfc2lnYWN0aW9uX3dyYXBwZXIKLXN5czMyX3J0X3NpZ2FjdGlvbl93cmFwcGVyOgorRU5UUlkoc3lzMzJfcnRfc2lnYWN0aW9uX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uX2VtdTMxICoKIAlsbGd0cgklcjQsJXI0CQkJIyBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uX2VtdTMxICoKIAlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKIAlqZwlzeXMzMl9ydF9zaWdhY3Rpb24JIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9ydF9zaWdwcm9jbWFza193cmFwcGVyCi1zeXMzMl9ydF9zaWdwcm9jbWFza193cmFwcGVyOgorRU5UUlkoc3lzMzJfcnRfc2lncHJvY21hc2tfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIG9sZF9zaWdzZXRfZW11MzEgKgogCWxsZ3RyCSVyNCwlcjQJCQkjIG9sZF9zaWdzZXRfZW11MzEgKgogCWxsZ2ZyCSVyNSwlcjUJCQkjIHNpemVfdAogCWpnCXN5czMyX3J0X3NpZ3Byb2NtYXNrCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfcnRfc2lncGVuZGluZ193cmFwcGVyCi1zeXMzMl9ydF9zaWdwZW5kaW5nX3dyYXBwZXI6CitFTlRSWShzeXMzMl9ydF9zaWdwZW5kaW5nX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgc2lnc2V0X2VtdTMxICoKIAlsbGdmcgklcjMsJXIzCQkJIyBzaXplX3QKIAlqZwlzeXMzMl9ydF9zaWdwZW5kaW5nCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19ydF9zaWd0aW1lZHdhaXRfd3JhcHBlcgotY29tcGF0X3N5c19ydF9zaWd0aW1lZHdhaXRfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfcnRfc2lndGltZWR3YWl0X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY29uc3Qgc2lnc2V0X2VtdTMxX3QgKgogCWxsZ3RyCSVyMywlcjMJCQkjIHNpZ2luZm9fZW11MzFfdCAqCiAJbGxndHIJJXI0LCVyNAkJCSMgY29uc3Qgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCiAJbGxnZnIJJXI1LCVyNQkJCSMgc2l6ZV90CiAJamcJY29tcGF0X3N5c19ydF9zaWd0aW1lZHdhaXQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9ydF9zaWdxdWV1ZWluZm9fd3JhcHBlcgotc3lzMzJfcnRfc2lncXVldWVpbmZvX3dyYXBwZXI6CitFTlRSWShzeXMzMl9ydF9zaWdxdWV1ZWluZm9fd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJbGxndHIJJXI0LCVyNAkJCSMgc2lnaW5mb19lbXUzMV90ICoKIAlqZwlzeXMzMl9ydF9zaWdxdWV1ZWluZm8JIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibCBjb21wYXRfc3lzX3J0X3NpZ3N1c3BlbmRfd3JhcHBlcgotY29tcGF0X3N5c19ydF9zaWdzdXNwZW5kX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3J0X3NpZ3N1c3BlbmRfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb21wYXRfc2lnc2V0X3QgKgogCWxsZ2ZyCSVyMywlcjMJCQkjIGNvbXBhdF9zaXplX3QKIAlqZwljb21wYXRfc3lzX3J0X3NpZ3N1c3BlbmQKIAotCS5nbG9ibAlzeXMzMl9wcmVhZDY0X3dyYXBwZXIKLXN5czMyX3ByZWFkNjRfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3ByZWFkNjRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKIAlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKQEAgLTg3MCw4ICs3MzgsNyBAQAogCWxsZ2ZyCSVyNiwlcjYJCQkjIHUzMgogCWpnCXN5czMyX3ByZWFkNjQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfcHdyaXRlNjRfd3JhcHBlcgotc3lzMzJfcHdyaXRlNjRfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3B3cml0ZTY0X3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCiAJbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90CkBAIC04NzksMzkgKzc0NiwzMyBAQAogCWxsZ2ZyCSVyNiwlcjYJCQkjIHUzMgogCWpnCXN5czMyX3B3cml0ZTY0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2Nob3duMTZfd3JhcHBlcgotc3lzMzJfY2hvd24xNl93cmFwcGVyOgorRU5UUlkoc3lzMzJfY2hvd24xNl93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgogCWxsZ2ZyCSVyMywlcjMJCQkjIF9fa2VybmVsX29sZF91aWRfZW11MzFfdAogCWxsZ2ZyCSVyNCwlcjQJCQkjIF9fa2VybmVsX29sZF9naWRfZW11MzFfdAogCWpnCXN5czMyX2Nob3duMTYJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfZ2V0Y3dkX3dyYXBwZXIKLXN5czMyX2dldGN3ZF93cmFwcGVyOgorRU5UUlkoc3lzMzJfZ2V0Y3dkX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwogCWpnCXN5c19nZXRjd2QJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfY2FwZ2V0X3dyYXBwZXIKLXN5czMyX2NhcGdldF93cmFwcGVyOgorRU5UUlkoc3lzMzJfY2FwZ2V0X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY2FwX3VzZXJfaGVhZGVyX3QKIAlsbGd0cgklcjMsJXIzCQkJIyBjYXBfdXNlcl9kYXRhX3QKIAlqZwlzeXNfY2FwZ2V0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2NhcHNldF93cmFwcGVyCi1zeXMzMl9jYXBzZXRfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2NhcHNldF93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNhcF91c2VyX2hlYWRlcl90CiAJbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2FwX3VzZXJfZGF0YV90CiAJamcJc3lzX2NhcHNldAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibCBzeXMzMl9zaWdhbHRzdGFja193cmFwcGVyCi1zeXMzMl9zaWdhbHRzdGFja193cmFwcGVyOgorRU5UUlkoc3lzMzJfc2lnYWx0c3RhY2tfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBzdGFja19lbXUzMV90ICoKIAlsbGd0cgklcjMsJXIzCQkJIyBzdGFja19lbXUzMV90ICoKIAlqZwlzeXMzMl9zaWdhbHRzdGFjawogCi0JLmdsb2JsCXN5czMyX3NlbmRmaWxlX3dyYXBwZXIKLXN5czMyX3NlbmRmaWxlX3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZW5kZmlsZV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlsbGd0cgklcjQsJXI0CQkJIyBfX2tlcm5lbF9vZmZfZW11MzFfdCAqCkBAIC05MjAsMjIgKzc4MSwxOSBAQAogCiAjc3lzMzJfdmZvcmtfd3JhcHBlcgkJCSMgZG9uZSBpbiB2Zm9ya19nbHVlCiAKLQkuZ2xvYmwJc3lzMzJfdHJ1bmNhdGU2NF93cmFwcGVyCi1zeXMzMl90cnVuY2F0ZTY0X3dyYXBwZXI6CitFTlRSWShzeXMzMl90cnVuY2F0ZTY0X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwogCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKIAlqZwlzeXMzMl90cnVuY2F0ZTY0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfZnRydW5jYXRlNjRfd3JhcHBlcgotc3lzMzJfZnRydW5jYXRlNjRfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2Z0cnVuY2F0ZTY0X3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwogCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKIAlqZwlzeXMzMl9mdHJ1bmNhdGU2NAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsIHN5czMyX2xjaG93bl93cmFwcGVyCi1zeXMzMl9sY2hvd25fd3JhcHBlcjoKK0VOVFJZKHN5czMyX2xjaG93bl93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgogCWxsZ2ZyCSVyMywlcjMJCQkjIHVpZF90CiAJbGxnZnIJJXI0LCVyNAkJCSMgZ2lkX3QKQEAgLTk0NiwxNTYgKzgwNCwxMzEgQEAKICNzeXMzMl9nZXRldWlkX3dyYXBwZXIJCQkjIHZvaWQKICNzeXMzMl9nZXRlZ2lkX3dyYXBwZXIJCQkjIHZvaWQKIAotCS5nbG9ibCBzeXMzMl9zZXRyZXVpZF93cmFwcGVyCi1zeXMzMl9zZXRyZXVpZF93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2V0cmV1aWRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1aWRfdAogCWxsZ2ZyCSVyMywlcjMJCQkjIHVpZF90CiAJamcJc3lzX3NldHJldWlkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsIHN5czMyX3NldHJlZ2lkX3dyYXBwZXIKLXN5czMyX3NldHJlZ2lkX3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXRyZWdpZF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIGdpZF90CiAJbGxnZnIJJXIzLCVyMwkJCSMgZ2lkX3QKIAlqZwlzeXNfc2V0cmVnaWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfZ2V0Z3JvdXBzX3dyYXBwZXIKLXN5czMyX2dldGdyb3Vwc193cmFwcGVyOgorRU5UUlkoc3lzMzJfZ2V0Z3JvdXBzX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBnaWRfdCAqCiAJamcJc3lzX2dldGdyb3VwcwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9zZXRncm91cHNfd3JhcHBlcgotc3lzMzJfc2V0Z3JvdXBzX3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXRncm91cHNfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGdpZF90ICoKIAlqZwlzeXNfc2V0Z3JvdXBzCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsIHN5czMyX2ZjaG93bl93cmFwcGVyCi1zeXMzMl9mY2hvd25fd3JhcHBlcjoKK0VOVFJZKHN5czMyX2ZjaG93bl93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWxsZ2ZyCSVyMywlcjMJCQkjIHVpZF90CiAJbGxnZnIJJXI0LCVyNAkJCSMgZ2lkX3QKIAlqZwlzeXNfZmNob3duCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsIHN5czMyX3NldHJlc3VpZF93cmFwcGVyCi1zeXMzMl9zZXRyZXN1aWRfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3NldHJlc3VpZF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVpZF90CiAJbGxnZnIJJXIzLCVyMwkJCSMgdWlkX3QKIAlsbGdmcgklcjQsJXI0CQkJIyB1aWRfdAogCWpnCXN5c19zZXRyZXN1aWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwgc3lzMzJfZ2V0cmVzdWlkX3dyYXBwZXIKLXN5czMyX2dldHJlc3VpZF93cmFwcGVyOgorRU5UUlkoc3lzMzJfZ2V0cmVzdWlkX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgdWlkX3QgKgogCWxsZ3RyCSVyMywlcjMJCQkjIHVpZF90ICoKIAlsbGd0cgklcjQsJXI0CQkJIyB1aWRfdCAqCiAJamcJc3lzX2dldHJlc3VpZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibCBzeXMzMl9zZXRyZXNnaWRfd3JhcHBlcgotc3lzMzJfc2V0cmVzZ2lkX3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXRyZXNnaWRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyBnaWRfdAogCWxsZ2ZyCSVyMywlcjMJCQkjIGdpZF90CiAJbGxnZnIJJXI0LCVyNAkJCSMgZ2lkX3QKIAlqZwlzeXNfc2V0cmVzZ2lkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsIHN5czMyX2dldHJlc2dpZF93cmFwcGVyCi1zeXMzMl9nZXRyZXNnaWRfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2dldHJlc2dpZF93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGdpZF90ICoKIAlsbGd0cgklcjMsJXIzCQkJIyBnaWRfdCAqCiAJbGxndHIJJXI0LCVyNAkJCSMgZ2lkX3QgKgogCWpnCXN5c19nZXRyZXNnaWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwgc3lzMzJfY2hvd25fd3JhcHBlcgotc3lzMzJfY2hvd25fd3JhcHBlcjoKK0VOVFJZKHN5czMyX2Nob3duX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCiAJbGxnZnIJJXIzLCVyMwkJCSMgdWlkX3QKIAlsbGdmcgklcjQsJXI0CQkJIyBnaWRfdAogCWpnCXN5c19jaG93bgkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibCBzeXMzMl9zZXR1aWRfd3JhcHBlcgotc3lzMzJfc2V0dWlkX3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXR1aWRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1aWRfdAogCWpnCXN5c19zZXR1aWQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwgc3lzMzJfc2V0Z2lkX3dyYXBwZXIKLXN5czMyX3NldGdpZF93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2V0Z2lkX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgZ2lkX3QKIAlqZwlzeXNfc2V0Z2lkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsIHN5czMyX3NldGZzdWlkX3dyYXBwZXIKLXN5czMyX3NldGZzdWlkX3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXRmc3VpZF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVpZF90CiAJamcJc3lzX3NldGZzdWlkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsIHN5czMyX3NldGZzZ2lkX3dyYXBwZXIKLXN5czMyX3NldGZzZ2lkX3dyYXBwZXI6CitFTlRSWShzeXMzMl9zZXRmc2dpZF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIGdpZF90CiAJamcJc3lzX3NldGZzZ2lkCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3Bpdm90X3Jvb3Rfd3JhcHBlcgotc3lzMzJfcGl2b3Rfcm9vdF93cmFwcGVyOgorRU5UUlkoc3lzMzJfcGl2b3Rfcm9vdF93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgogCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgogCWpnCXN5c19waXZvdF9yb290CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX21pbmNvcmVfd3JhcHBlcgotc3lzMzJfbWluY29yZV93cmFwcGVyOgorRU5UUlkoc3lzMzJfbWluY29yZV93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKIAlsbGdmcgklcjMsJXIzCQkJIyBzaXplX3QKIAlsbGd0cgklcjQsJXI0CQkJIyB1bnNpZ25lZCBjaGFyICoKIAlqZwlzeXNfbWluY29yZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9tYWR2aXNlX3dyYXBwZXIKLXN5czMyX21hZHZpc2Vfd3JhcHBlcjoKK0VOVFJZKHN5czMyX21hZHZpc2Vfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCiAJbGxnZnIJJXIzLCVyMwkJCSMgc2l6ZV90CiAJbGdmcgklcjQsJXI0CQkJIyBpbnQKIAlqZwlzeXNfbWFkdmlzZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9nZXRkZW50czY0X3dyYXBwZXIKLXN5czMyX2dldGRlbnRzNjRfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2dldGRlbnRzNjRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyB2b2lkICoKIAlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBpbnQKIAlqZwlzeXNfZ2V0ZGVudHM2NAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAljb21wYXRfc3lzX2ZjbnRsNjRfd3JhcHBlcgotY29tcGF0X3N5c19mY250bDY0X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX2ZjbnRsNjRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCiAJamcJY29tcGF0X3N5c19mY250bDY0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfc3RhdDY0X3dyYXBwZXIKLXN5czMyX3N0YXQ2NF93cmFwcGVyOgorRU5UUlkoc3lzMzJfc3RhdDY0X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHN0YXQ2NCAqCiAJamcJc3lzMzJfc3RhdDY0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2xzdGF0NjRfd3JhcHBlcgotc3lzMzJfbHN0YXQ2NF93cmFwcGVyOgorRU5UUlkoc3lzMzJfbHN0YXQ2NF93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzdGF0NjQgKgogCWpnCXN5czMyX2xzdGF0NjQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfc3RpbWVfd3JhcHBlcgotc3lzMzJfc3RpbWVfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3N0aW1lX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgbG9uZyAqCiAJamcJY29tcGF0X3N5c19zdGltZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3N5c2N0bF93cmFwcGVyCi1zeXMzMl9zeXNjdGxfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3N5c2N0bF93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIgCQkjIHN0cnVjdCBjb21wYXRfc3lzY3RsX2FyZ3MgKgogCWpnCWNvbXBhdF9zeXNfc3lzY3RsCiAKLQkuZ2xvYmwJc3lzMzJfZnN0YXQ2NF93cmFwcGVyCi1zeXMzMl9mc3RhdDY0X3dyYXBwZXI6CitFTlRSWShzeXMzMl9mc3RhdDY0X3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZwogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBzdGF0NjQgKgogCWpnCXN5czMyX2ZzdGF0NjQJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19mdXRleF93cmFwcGVyCi1jb21wYXRfc3lzX2Z1dGV4X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX2Z1dGV4X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgdTMyICoKIAlsZ2ZyCSVyMywlcjMJCQkjIGludAogCWxnZnIJJXI0LCVyNAkJCSMgaW50CkBAIC0xMTA1LDggKzkzOCw3IEBACiAJc3RnCSVyMCwxNjAoJXIxNSkKIAlqZwljb21wYXRfc3lzX2Z1dGV4CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfc2V0eGF0dHJfd3JhcHBlcgotc3lzMzJfc2V0eGF0dHJfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3NldHhhdHRyX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCiAJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCiAJbGxndHIJJXI0LCVyNAkJCSMgdm9pZCAqCkBAIC0xMTE0LDggKzk0Niw3IEBACiAJbGdmcgklcjYsJXI2CQkJIyBpbnQKIAlqZwlzeXNfc2V0eGF0dHIKIAotCS5nbG9ibAlzeXMzMl9sc2V0eGF0dHJfd3JhcHBlcgotc3lzMzJfbHNldHhhdHRyX3dyYXBwZXI6CitFTlRSWShzeXMzMl9sc2V0eGF0dHJfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKIAlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKIAlsbGd0cgklcjQsJXI0CQkJIyB2b2lkICoKQEAgLTExMjMsOCArOTU0LDcgQEAKIAlsZ2ZyCSVyNiwlcjYJCQkjIGludAogCWpnCXN5c19sc2V0eGF0dHIKIAotCS5nbG9ibAlzeXMzMl9mc2V0eGF0dHJfd3JhcHBlcgotc3lzMzJfZnNldHhhdHRyX3dyYXBwZXI6CitFTlRSWShzeXMzMl9mc2V0eGF0dHJfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgogCWxsZ3RyCSVyNCwlcjQJCQkjIHZvaWQgKgpAQCAtMTEzMiwxMjQgKzk2MiwxMDYgQEAKIAlsZ2ZyCSVyNiwlcjYJCQkjIGludAogCWpnCXN5c19mc2V0eGF0dHIKIAotCS5nbG9ibAlzeXMzMl9nZXR4YXR0cl93cmFwcGVyCi1zeXMzMl9nZXR4YXR0cl93cmFwcGVyOgorRU5UUlkoc3lzMzJfZ2V0eGF0dHJfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKIAlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKIAlsbGd0cgklcjQsJXI0CQkJIyB2b2lkICoKIAlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKIAlqZwlzeXNfZ2V0eGF0dHIKIAotCS5nbG9ibAlzeXMzMl9sZ2V0eGF0dHJfd3JhcHBlcgotc3lzMzJfbGdldHhhdHRyX3dyYXBwZXI6CitFTlRSWShzeXMzMl9sZ2V0eGF0dHJfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKIAlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKIAlsbGd0cgklcjQsJXI0CQkJIyB2b2lkICoKIAlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKIAlqZwlzeXNfbGdldHhhdHRyCiAKLQkuZ2xvYmwJc3lzMzJfZmdldHhhdHRyX3dyYXBwZXIKLXN5czMyX2ZnZXR4YXR0cl93cmFwcGVyOgorRU5UUlkoc3lzMzJfZmdldHhhdHRyX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKIAlsbGd0cgklcjQsJXI0CQkJIyB2b2lkICoKIAlsbGdmcgklcjUsJXI1CQkJIyBzaXplX3QKIAlqZwlzeXNfZmdldHhhdHRyCiAKLQkuZ2xvYmwJc3lzMzJfbGlzdHhhdHRyX3dyYXBwZXIKLXN5czMyX2xpc3R4YXR0cl93cmFwcGVyOgorRU5UUlkoc3lzMzJfbGlzdHhhdHRyX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCiAJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCiAJbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90CiAJamcJc3lzX2xpc3R4YXR0cgogCi0JLmdsb2JsCXN5czMyX2xsaXN0eGF0dHJfd3JhcHBlcgotc3lzMzJfbGxpc3R4YXR0cl93cmFwcGVyOgorRU5UUlkoc3lzMzJfbGxpc3R4YXR0cl93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgogCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgogCWxsZ2ZyCSVyNCwlcjQJCQkjIHNpemVfdAogCWpnCXN5c19sbGlzdHhhdHRyCiAKLQkuZ2xvYmwJc3lzMzJfZmxpc3R4YXR0cl93cmFwcGVyCi1zeXMzMl9mbGlzdHhhdHRyX3dyYXBwZXI6CitFTlRSWShzeXMzMl9mbGlzdHhhdHRyX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKIAlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKIAlqZwlzeXNfZmxpc3R4YXR0cgogCi0JLmdsb2JsCXN5czMyX3JlbW92ZXhhdHRyX3dyYXBwZXIKLXN5czMyX3JlbW92ZXhhdHRyX3dyYXBwZXI6CitFTlRSWShzeXMzMl9yZW1vdmV4YXR0cl93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgogCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgogCWpnCXN5c19yZW1vdmV4YXR0cgogCi0JLmdsb2JsCXN5czMyX2xyZW1vdmV4YXR0cl93cmFwcGVyCi1zeXMzMl9scmVtb3ZleGF0dHJfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2xyZW1vdmV4YXR0cl93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgogCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgogCWpnCXN5c19scmVtb3ZleGF0dHIKIAotCS5nbG9ibAlzeXMzMl9mcmVtb3ZleGF0dHJfd3JhcHBlcgotc3lzMzJfZnJlbW92ZXhhdHRyX3dyYXBwZXI6CitFTlRSWShzeXMzMl9mcmVtb3ZleGF0dHJfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgogCWpnCXN5c19mcmVtb3ZleGF0dHIKIAotCS5nbG9ibAlzeXMzMl9zY2hlZF9zZXRhZmZpbml0eV93cmFwcGVyCi1zeXMzMl9zY2hlZF9zZXRhZmZpbml0eV93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2NoZWRfc2V0YWZmaW5pdHlfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAogCWxsZ3RyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcgKgogCWpnCWNvbXBhdF9zeXNfc2NoZWRfc2V0YWZmaW5pdHkKIAotCS5nbG9ibAlzeXMzMl9zY2hlZF9nZXRhZmZpbml0eV93cmFwcGVyCi1zeXMzMl9zY2hlZF9nZXRhZmZpbml0eV93cmFwcGVyOgorRU5UUlkoc3lzMzJfc2NoZWRfZ2V0YWZmaW5pdHlfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAogCWxsZ3RyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcgKgogCWpnCWNvbXBhdF9zeXNfc2NoZWRfZ2V0YWZmaW5pdHkKIAotCS5nbG9ibAlzeXMzMl9leGl0X2dyb3VwX3dyYXBwZXIKLXN5czMyX2V4aXRfZ3JvdXBfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2V4aXRfZ3JvdXBfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWpnCXN5c19leGl0X2dyb3VwCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3NldF90aWRfYWRkcmVzc193cmFwcGVyCi1zeXMzMl9zZXRfdGlkX2FkZHJlc3Nfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3NldF90aWRfYWRkcmVzc193cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGludCAqCiAJamcJc3lzX3NldF90aWRfYWRkcmVzcwkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5c19lcG9sbF9jcmVhdGVfd3JhcHBlcgotc3lzX2Vwb2xsX2NyZWF0ZV93cmFwcGVyOgorRU5UUlkoc3lzX2Vwb2xsX2NyZWF0ZV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJamcJc3lzX2Vwb2xsX2NyZWF0ZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5c19lcG9sbF9jdGxfd3JhcHBlcgotc3lzX2Vwb2xsX2N0bF93cmFwcGVyOgorRU5UUlkoc3lzX2Vwb2xsX2N0bF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlsZ2ZyCSVyNCwlcjQJCQkjIGludAogCWxsZ3RyCSVyNSwlcjUJCQkjIHN0cnVjdCBlcG9sbF9ldmVudCAqCiAJamcJc3lzX2Vwb2xsX2N0bAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXNfZXBvbGxfd2FpdF93cmFwcGVyCi1zeXNfZXBvbGxfd2FpdF93cmFwcGVyOgorRU5UUlkoc3lzX2Vwb2xsX3dhaXRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBlcG9sbF9ldmVudCAqCiAJbGdmcgklcjQsJXI0CQkJIyBpbnQKIAlsZ2ZyCSVyNSwlcjUJCQkjIGludAogCWpnCXN5c19lcG9sbF93YWl0CQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2xvb2t1cF9kY29va2llX3dyYXBwZXIKLXN5czMyX2xvb2t1cF9kY29va2llX3dyYXBwZXI6CitFTlRSWShzeXMzMl9sb29rdXBfZGNvb2tpZV93cmFwcGVyKQogCXNsbGcJJXIyLCVyMiwzMgkJIyBnZXQgaGlnaCB3b3JkIG9mIDY0Yml0IGRjb29raWUKIAlvcgklcjIsJXIzCQkJIyBnZXQgbG93IHdvcmQgb2YgNjRiaXQgZGNvb2tpZQogCWxsZ3RyCSVyMywlcjQJCQkjIGNoYXIgKgogCWxsZ2ZyCSVyNCwlcjUJCQkjIHNpemVfdAogCWpnCXN5c19sb29rdXBfZGNvb2tpZQogCi0JLmdsb2JsCXN5czMyX2ZhZHZpc2U2NF93cmFwcGVyCi1zeXMzMl9mYWR2aXNlNjRfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2ZhZHZpc2U2NF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJc2xsZwklcjMsJXIzLDMyCQkjIGdldCBoaWdoIHdvcmQgb2YgNjRiaXQgbG9mZl90CiAJb3IJJXIzLCVyNAkJCSMgZ2V0IGxvdyB3b3JkIG9mIDY0Yml0IGxvZmZfdApAQCAtMTI1Nyw4MSArMTA2OSw2OCBAQAogCWxnZnIJJXI1LCVyNgkJCSMgaW50CiAJamcJc3lzMzJfZmFkdmlzZTY0CiAKLQkuZ2xvYmwJc3lzMzJfZmFkdmlzZTY0XzY0X3dyYXBwZXIKLXN5czMyX2ZhZHZpc2U2NF82NF93cmFwcGVyOgorRU5UUlkoc3lzMzJfZmFkdmlzZTY0XzY0X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzICoKIAlqZwlzeXMzMl9mYWR2aXNlNjRfNjQKIAotCS5nbG9ibAlzeXMzMl9jbG9ja19zZXR0aW1lX3dyYXBwZXIKLXN5czMyX2Nsb2NrX3NldHRpbWVfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2Nsb2NrX3NldHRpbWVfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGNsb2NraWRfdCAoaW50KQogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgogCWpnCWNvbXBhdF9zeXNfY2xvY2tfc2V0dGltZQogCi0JLmdsb2JsCXN5czMyX2Nsb2NrX2dldHRpbWVfd3JhcHBlcgotc3lzMzJfY2xvY2tfZ2V0dGltZV93cmFwcGVyOgorRU5UUlkoc3lzMzJfY2xvY2tfZ2V0dGltZV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgY2xvY2tpZF90IChpbnQpCiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCiAJamcJY29tcGF0X3N5c19jbG9ja19nZXR0aW1lCiAKLQkuZ2xvYmwJc3lzMzJfY2xvY2tfZ2V0cmVzX3dyYXBwZXIKLXN5czMyX2Nsb2NrX2dldHJlc193cmFwcGVyOgorRU5UUlkoc3lzMzJfY2xvY2tfZ2V0cmVzX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBjbG9ja2lkX3QgKGludCkKIAlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKIAlqZwljb21wYXRfc3lzX2Nsb2NrX2dldHJlcwogCi0JLmdsb2JsCXN5czMyX2Nsb2NrX25hbm9zbGVlcF93cmFwcGVyCi1zeXMzMl9jbG9ja19uYW5vc2xlZXBfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2Nsb2NrX25hbm9zbGVlcF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgY2xvY2tpZF90IChpbnQpCiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKIAlsbGd0cgklcjUsJXI1CQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjICoKIAlqZwljb21wYXRfc3lzX2Nsb2NrX25hbm9zbGVlcAogCi0JLmdsb2JsCXN5czMyX3RpbWVyX2NyZWF0ZV93cmFwcGVyCi1zeXMzMl90aW1lcl9jcmVhdGVfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3RpbWVyX2NyZWF0ZV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgdGltZXJfdCAoaW50KQogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfc2lnZXZlbnQgKgogCWxsZ3RyCSVyNCwlcjQJCQkjIHRpbWVyX3QgKgogCWpnCWNvbXBhdF9zeXNfdGltZXJfY3JlYXRlCiAKLQkuZ2xvYmwJc3lzMzJfdGltZXJfc2V0dGltZV93cmFwcGVyCi1zeXMzMl90aW1lcl9zZXR0aW1lX3dyYXBwZXI6CitFTlRSWShzeXMzMl90aW1lcl9zZXR0aW1lX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyB0aW1lcl90IChpbnQpCiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgKgogCWxsZ3RyCSVyNSwlcjUJCQkjIHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyAqCiAJamcJY29tcGF0X3N5c190aW1lcl9zZXR0aW1lCiAKLQkuZ2xvYmwJc3lzMzJfdGltZXJfZ2V0dGltZV93cmFwcGVyCi1zeXMzMl90aW1lcl9nZXR0aW1lX3dyYXBwZXI6CitFTlRSWShzeXMzMl90aW1lcl9nZXR0aW1lX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyB0aW1lcl90IChpbnQpCiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjICoKIAlqZwljb21wYXRfc3lzX3RpbWVyX2dldHRpbWUKIAotCS5nbG9ibAlzeXMzMl90aW1lcl9nZXRvdmVycnVuX3dyYXBwZXIKLXN5czMyX3RpbWVyX2dldG92ZXJydW5fd3JhcHBlcjoKK0VOVFJZKHN5czMyX3RpbWVyX2dldG92ZXJydW5fd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIHRpbWVyX3QgKGludCkKIAlqZwlzeXNfdGltZXJfZ2V0b3ZlcnJ1bgogCi0JLmdsb2JsCXN5czMyX3RpbWVyX2RlbGV0ZV93cmFwcGVyCi1zeXMzMl90aW1lcl9kZWxldGVfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3RpbWVyX2RlbGV0ZV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgdGltZXJfdCAoaW50KQogCWpnCXN5c190aW1lcl9kZWxldGUKIAotCS5nbG9ibAlzeXMzMl9pb19zZXR1cF93cmFwcGVyCi1zeXMzMl9pb19zZXR1cF93cmFwcGVyOgorRU5UUlkoc3lzMzJfaW9fc2V0dXBfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyB1MzIgKgogCWpnCWNvbXBhdF9zeXNfaW9fc2V0dXAKIAotCS5nbG9ibAlzeXMzMl9pb19kZXN0cm95X3dyYXBwZXIKLXN5czMyX2lvX2Rlc3Ryb3lfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2lvX2Rlc3Ryb3lfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyAoYWlvX2NvbnRleHRfdCkgdTMyCiAJamcJc3lzX2lvX2Rlc3Ryb3kKIAotCS5nbG9ibAlzeXMzMl9pb19nZXRldmVudHNfd3JhcHBlcgotc3lzMzJfaW9fZ2V0ZXZlbnRzX3dyYXBwZXI6CitFTlRSWShzeXMzMl9pb19nZXRldmVudHNfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyAoYWlvX2NvbnRleHRfdCkgdTMyCiAJbGdmcgklcjMsJXIzCQkJIyBsb25nCiAJbGdmcgklcjQsJXI0CQkJIyBsb25nCkBAIC0xMzM5LDQ5ICsxMTM4LDQyIEBACiAJbGxndHIJJXI2LCVyNgkJCSMgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCiAJamcJY29tcGF0X3N5c19pb19nZXRldmVudHMKIAotCS5nbG9ibAlzeXMzMl9pb19zdWJtaXRfd3JhcHBlcgotc3lzMzJfaW9fc3VibWl0X3dyYXBwZXI6CitFTlRSWShzeXMzMl9pb19zdWJtaXRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyAoYWlvX2NvbnRleHRfdCkgdTMyCiAJbGdmcgklcjMsJXIzCQkJIyBsb25nCiAJbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGlvY2IgKioKIAlqZwljb21wYXRfc3lzX2lvX3N1Ym1pdAogCi0JLmdsb2JsCXN5czMyX2lvX2NhbmNlbF93cmFwcGVyCi1zeXMzMl9pb19jYW5jZWxfd3JhcHBlcjoKK0VOVFJZKHN5czMyX2lvX2NhbmNlbF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIChhaW9fY29udGV4dF90KSB1MzIKIAlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgaW9jYiAqCiAJbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGlvX2V2ZW50ICoKIAlqZwlzeXNfaW9fY2FuY2VsCiAKLQkuZ2xvYmwgY29tcGF0X3N5c19zdGF0ZnM2NF93cmFwcGVyCi1jb21wYXRfc3lzX3N0YXRmczY0X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3N0YXRmczY0X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCiAJbGxnZnIJJXIzLCVyMwkJCSMgY29tcGF0X3NpemVfdAogCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBjb21wYXRfc3RhdGZzNjQgKgogCWpnCWNvbXBhdF9zeXNfc3RhdGZzNjQKIAotCS5nbG9ibCBjb21wYXRfc3lzX2ZzdGF0ZnM2NF93cmFwcGVyCi1jb21wYXRfc3lzX2ZzdGF0ZnM2NF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19mc3RhdGZzNjRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQgZmQKIAlsbGdmcgklcjMsJXIzCQkJIyBjb21wYXRfc2l6ZV90CiAJbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCAqCiAJamcJY29tcGF0X3N5c19mc3RhdGZzNjQKIAotCS5nbG9ibAljb21wYXRfc3lzX21xX29wZW5fd3JhcHBlcgotY29tcGF0X3N5c19tcV9vcGVuX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX21xX29wZW5fd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBjaGFyICoKIAlsZ2ZyCSVyMywlcjMJCQkjIGludAogCWxsZ2ZyCSVyNCwlcjQJCQkjIG1vZGVfdAogCWxsZ3RyCSVyNSwlcjUJCQkjIHN0cnVjdCBjb21wYXRfbXFfYXR0ciAqCiAJamcJY29tcGF0X3N5c19tcV9vcGVuCiAKLQkuZ2xvYmwJc3lzMzJfbXFfdW5saW5rX3dyYXBwZXIKLXN5czMyX21xX3VubGlua193cmFwcGVyOgorRU5UUlkoc3lzMzJfbXFfdW5saW5rX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCiAJamcJc3lzX21xX3VubGluawogCi0JLmdsb2JsCWNvbXBhdF9zeXNfbXFfdGltZWRzZW5kX3dyYXBwZXIKLWNvbXBhdF9zeXNfbXFfdGltZWRzZW5kX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX21xX3RpbWVkc2VuZF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgbXFkX3QKIAlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKIAlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKQEAgLTEzODksOCArMTE4MSw3IEBACiAJbGxndHIJJXI2LCVyNgkJCSMgY29uc3Qgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCiAJamcJY29tcGF0X3N5c19tcV90aW1lZHNlbmQKIAotCS5nbG9ibAljb21wYXRfc3lzX21xX3RpbWVkcmVjZWl2ZV93cmFwcGVyCi1jb21wYXRfc3lzX21xX3RpbWVkcmVjZWl2ZV93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmVfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIG1xZF90CiAJbGxndHIJJXIzLCVyMwkJCSMgY2hhciAqCiAJbGxnZnIJJXI0LCVyNAkJCSMgc2l6ZV90CkBAIC0xMzk4LDIxICsxMTg5LDE4IEBACiAJbGxndHIJJXI2LCVyNgkJCSMgY29uc3Qgc3RydWN0IGNvbXBhdF90aW1lc3BlYyAqCiAJamcJY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmUKIAotCS5nbG9ibAljb21wYXRfc3lzX21xX25vdGlmeV93cmFwcGVyCi1jb21wYXRfc3lzX21xX25vdGlmeV93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19tcV9ub3RpZnlfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIG1xZF90CiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9zaWdldmVudCAqCiAJamcJY29tcGF0X3N5c19tcV9ub3RpZnkKIAotCS5nbG9ibAljb21wYXRfc3lzX21xX2dldHNldGF0dHJfd3JhcHBlcgotY29tcGF0X3N5c19tcV9nZXRzZXRhdHRyX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX21xX2dldHNldGF0dHJfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIG1xZF90CiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9tcV9hdHRyICoKIAlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgY29tcGF0X21xX2F0dHIgKgogCWpnCWNvbXBhdF9zeXNfbXFfZ2V0c2V0YXR0cgogCi0JLmdsb2JsCWNvbXBhdF9zeXNfYWRkX2tleV93cmFwcGVyCi1jb21wYXRfc3lzX2FkZF9rZXlfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfYWRkX2tleV93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgogCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgogCWxsZ3RyCSVyNCwlcjQJCQkjIGNvbnN0IHZvaWQgKgpAQCAtMTQyMCwxNiArMTIwOCwxNCBAQAogCWxsZ2ZyCSVyNiwlcjYJCQkjIChrZXlfc2VyaWFsX3QpIHUzMgogCWpnCXN5c19hZGRfa2V5CiAKLQkuZ2xvYmwJY29tcGF0X3N5c19yZXF1ZXN0X2tleV93cmFwcGVyCi1jb21wYXRfc3lzX3JlcXVlc3Rfa2V5X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3JlcXVlc3Rfa2V5X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY29uc3QgY2hhciAqCiAJbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCiAJbGxndHIJJXI0LCVyNAkJCSMgY29uc3Qgdm9pZCAqCiAJbGxnZnIJJXI1LCVyNQkJCSMgKGtleV9zZXJpYWxfdCkgdTMyCiAJamcJc3lzX3JlcXVlc3Rfa2V5CiAKLQkuZ2xvYmwJc3lzMzJfcmVtYXBfZmlsZV9wYWdlc193cmFwcGVyCi1zeXMzMl9yZW1hcF9maWxlX3BhZ2VzX3dyYXBwZXI6CitFTlRSWShzeXMzMl9yZW1hcF9maWxlX3BhZ2VzX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZwogCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGxvbmcKIAlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCkBAIC0xNDM3LDggKzEyMjMsNyBAQAogCWxsZ2ZyCSVyNiwlcjYJCQkjIHVuc2lnbmVkIGxvbmcKIAlqZwlzeXNfcmVtYXBfZmlsZV9wYWdlcwogCi0JLmdsb2JsCWNvbXBhdF9zeXNfd2FpdGlkX3dyYXBwZXIKLWNvbXBhdF9zeXNfd2FpdGlkX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3dhaXRpZF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGdmcgklcjMsJXIzCQkJIyBwaWRfdAogCWxsZ3RyCSVyNCwlcjQJCQkjIHNpZ2luZm9fZW11MzFfdCAqCkBAIC0xNDQ2LDY1ICsxMjMxLDU2IEBACiAJbGxndHIJJXI2LCVyNgkJCSMgc3RydWN0IHJ1c2FnZV9lbXUzMSAqCiAJamcJY29tcGF0X3N5c193YWl0aWQKIAotCS5nbG9ibAljb21wYXRfc3lzX2tleGVjX2xvYWRfd3JhcHBlcgotY29tcGF0X3N5c19rZXhlY19sb2FkX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX2tleGVjX2xvYWRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgbG9uZwogCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBrZXhlY19zZWdtZW50ICoKIAlsbGdmcgklcjUsJXI1CQkJIyB1bnNpZ25lZCBsb25nCiAJamcJY29tcGF0X3N5c19rZXhlY19sb2FkCiAKLQkuZ2xvYmwJc3lzX2lvcHJpb19zZXRfd3JhcHBlcgotc3lzX2lvcHJpb19zZXRfd3JhcHBlcjoKK0VOVFJZKHN5c19pb3ByaW9fc2V0X3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsZ2ZyCSVyMywlcjMJCQkjIGludAogCWxnZnIJJXI0LCVyNAkJCSMgaW50CiAJamcJc3lzX2lvcHJpb19zZXQKIAotCS5nbG9ibAlzeXNfaW9wcmlvX2dldF93cmFwcGVyCi1zeXNfaW9wcmlvX2dldF93cmFwcGVyOgorRU5UUlkoc3lzX2lvcHJpb19nZXRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJamcJc3lzX2lvcHJpb19nZXQKIAotCS5nbG9ibAlzeXNfaW5vdGlmeV9hZGRfd2F0Y2hfd3JhcHBlcgotc3lzX2lub3RpZnlfYWRkX3dhdGNoX3dyYXBwZXI6CitFTlRSWShzeXNfaW5vdGlmeV9hZGRfd2F0Y2hfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgogCWxsZ2ZyCSVyNCwlcjQJCQkjIHUzMgogCWpnCXN5c19pbm90aWZ5X2FkZF93YXRjaAogCi0JLmdsb2JsCXN5c19pbm90aWZ5X3JtX3dhdGNoX3dyYXBwZXIKLXN5c19pbm90aWZ5X3JtX3dhdGNoX3dyYXBwZXI6CitFTlRSWShzeXNfaW5vdGlmeV9ybV93YXRjaF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxnZnIJJXIzLCVyMwkJCSMgdTMyCiAJamcJc3lzX2lub3RpZnlfcm1fd2F0Y2gKIAotCS5nbG9ibCBjb21wYXRfc3lzX29wZW5hdF93cmFwcGVyCi1jb21wYXRfc3lzX29wZW5hdF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19vcGVuYXRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKIAlsZ2ZyCSVyNCwlcjQJCQkjIGludAogCWxnZnIJJXI1LCVyNQkJCSMgaW50CiAJamcJY29tcGF0X3N5c19vcGVuYXQKIAotCS5nbG9ibCBzeXNfbWtkaXJhdF93cmFwcGVyCi1zeXNfbWtkaXJhdF93cmFwcGVyOgorRU5UUlkoc3lzX21rZGlyYXRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgogCWxnZnIJJXI0LCVyNAkJCSMgaW50CiAJamcJc3lzX21rZGlyYXQKIAotCS5nbG9ibCBzeXNfbWtub2RhdF93cmFwcGVyCi1zeXNfbWtub2RhdF93cmFwcGVyOgorRU5UUlkoc3lzX21rbm9kYXRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgogCWxnZnIJJXI0LCVyNAkJCSMgaW50CiAJbGxnZnIJJXI1LCVyNQkJCSMgdW5zaWduZWQgaW50CiAJamcJc3lzX21rbm9kYXQKIAotCS5nbG9ibCBzeXNfZmNob3duYXRfd3JhcHBlcgotc3lzX2ZjaG93bmF0X3dyYXBwZXI6CitFTlRSWShzeXNfZmNob3duYXRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgogCWxsZ2ZyCSVyNCwlcjQJCQkjIHVpZF90CkBAIC0xNTEyLDM4ICsxMjg4LDMzIEBACiAJbGdmcgklcjYsJXI2CQkJIyBpbnQKIAlqZwlzeXNfZmNob3duYXQKIAotCS5nbG9ibCBjb21wYXRfc3lzX2Z1dGltZXNhdF93cmFwcGVyCi1jb21wYXRfc3lzX2Z1dGltZXNhdF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19mdXRpbWVzYXRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKIAlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgdGltZXZhbCAqCiAJamcJY29tcGF0X3N5c19mdXRpbWVzYXQKIAotCS5nbG9ibCBzeXMzMl9mc3RhdGF0NjRfd3JhcHBlcgotc3lzMzJfZnN0YXRhdDY0X3dyYXBwZXI6CitFTlRSWShzeXMzMl9mc3RhdGF0NjRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjaGFyICoKIAlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3Qgc3RhdDY0ICoKIAlsZ2ZyCSVyNSwlcjUJCQkjIGludAogCWpnCXN5czMyX2ZzdGF0YXQ2NAogCi0JLmdsb2JsIHN5c191bmxpbmthdF93cmFwcGVyCi1zeXNfdW5saW5rYXRfd3JhcHBlcjoKK0VOVFJZKHN5c191bmxpbmthdF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCiAJbGdmcgklcjQsJXI0CQkJIyBpbnQKIAlqZwlzeXNfdW5saW5rYXQKIAotCS5nbG9ibCBzeXNfcmVuYW1lYXRfd3JhcHBlcgotc3lzX3JlbmFtZWF0X3dyYXBwZXI6CitFTlRSWShzeXNfcmVuYW1lYXRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgKgogCWxnZnIJJXI0LCVyNAkJCSMgaW50CiAJbGxndHIJJXI1LCVyNQkJCSMgY29uc3QgY2hhciAqCiAJamcJc3lzX3JlbmFtZWF0CiAKLQkuZ2xvYmwgc3lzX2xpbmthdF93cmFwcGVyCi1zeXNfbGlua2F0X3dyYXBwZXI6CitFTlRSWShzeXNfbGlua2F0X3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKIAlsZ2ZyCSVyNCwlcjQJCQkjIGludApAQCAtMTU1MSwzNyArMTMyMiwzMiBAQAogCWxnZnIJJXI2LCVyNgkJCSMgaW50CiAJamcJc3lzX2xpbmthdAogCi0JLmdsb2JsIHN5c19zeW1saW5rYXRfd3JhcHBlcgotc3lzX3N5bWxpbmthdF93cmFwcGVyOgorRU5UUlkoc3lzX3N5bWxpbmthdF93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIGNvbnN0IGNoYXIgKgogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJbGxndHIJJXI0LCVyNAkJCSMgY29uc3QgY2hhciAqCiAJamcJc3lzX3N5bWxpbmthdAogCi0JLmdsb2JsIHN5c19yZWFkbGlua2F0X3dyYXBwZXIKLXN5c19yZWFkbGlua2F0X3dyYXBwZXI6CitFTlRSWShzeXNfcmVhZGxpbmthdF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCiAJbGxndHIJJXI0LCVyNAkJCSMgY2hhciAqCiAJbGdmcgklcjUsJXI1CQkJIyBpbnQKIAlqZwlzeXNfcmVhZGxpbmthdAogCi0JLmdsb2JsIHN5c19mY2htb2RhdF93cmFwcGVyCi1zeXNfZmNobW9kYXRfd3JhcHBlcjoKK0VOVFJZKHN5c19mY2htb2RhdF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgY29uc3QgY2hhciAqCiAJbGxnZnIJJXI0LCVyNAkJCSMgbW9kZV90CiAJamcJc3lzX2ZjaG1vZGF0CiAKLQkuZ2xvYmwgc3lzX2ZhY2Nlc3NhdF93cmFwcGVyCi1zeXNfZmFjY2Vzc2F0X3dyYXBwZXI6CitFTlRSWShzeXNfZmFjY2Vzc2F0X3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjb25zdCBjaGFyICoKIAlsZ2ZyCSVyNCwlcjQJCQkjIGludAogCWpnCXN5c19mYWNjZXNzYXQKIAotCS5nbG9ibCBjb21wYXRfc3lzX3BzZWxlY3Q2X3dyYXBwZXIKLWNvbXBhdF9zeXNfcHNlbGVjdDZfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfcHNlbGVjdDZfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGZkX3NldCAqCiAJbGxndHIJJXI0LCVyNAkJCSMgZmRfc2V0ICoKQEAgLTE1OTEsOCArMTM1Nyw3IEBACiAJc3RnCSVyMCwxNjAoJXIxNSkKIAlqZwljb21wYXRfc3lzX3BzZWxlY3Q2CiAKLQkuZ2xvYmwgY29tcGF0X3N5c19wcG9sbF93cmFwcGVyCi1jb21wYXRfc3lzX3Bwb2xsX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3Bwb2xsX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IHBvbGxmZCAqCiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50CiAJbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IHRpbWVzcGVjICoKQEAgLTE2MDAsMjYgKzEzNjUsMjIgQEAKIAlsbGdmcgklcjYsJXI2CQkJIyBzaXplX3QKIAlqZwljb21wYXRfc3lzX3Bwb2xsCiAKLQkuZ2xvYmwgc3lzX3Vuc2hhcmVfd3JhcHBlcgotc3lzX3Vuc2hhcmVfd3JhcHBlcjoKK0VOVFJZKHN5c191bnNoYXJlX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgbG9uZwogCWpnCXN5c191bnNoYXJlCiAKLQkuZ2xvYmwgY29tcGF0X3N5c19zZXRfcm9idXN0X2xpc3Rfd3JhcHBlcgotY29tcGF0X3N5c19zZXRfcm9idXN0X2xpc3Rfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfc2V0X3JvYnVzdF9saXN0X3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgc3RydWN0IGNvbXBhdF9yb2J1c3RfbGlzdF9oZWFkICoKIAlsbGdmcgklcjMsJXIzCQkJIyBzaXplX3QKIAlqZwljb21wYXRfc3lzX3NldF9yb2J1c3RfbGlzdAogCi0JLmdsb2JsIGNvbXBhdF9zeXNfZ2V0X3JvYnVzdF9saXN0X3dyYXBwZXIKLWNvbXBhdF9zeXNfZ2V0X3JvYnVzdF9saXN0X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX2dldF9yb2J1c3RfbGlzdF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgY29tcGF0X3VwdHJfdF90ICoKIAlsbGd0cgklcjQsJXI0CQkJIyBjb21wYXRfc2l6ZV90ICoKIAlqZwljb21wYXRfc3lzX2dldF9yb2J1c3RfbGlzdAogCi0JLmdsb2JsIHN5c19zcGxpY2Vfd3JhcHBlcgotc3lzX3NwbGljZV93cmFwcGVyOgorRU5UUlkoc3lzX3NwbGljZV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgbG9mZl90ICoKIAlsZ2ZyCSVyNCwlcjQJCQkjIGludApAQCAtMTYyOSw4ICsxMzkwLDcgQEAKIAlzdGcJJXIwLDE2MCglcjE1KQogCWpnCXN5c19zcGxpY2UKIAotCS5nbG9ibAlzeXNfc3luY19maWxlX3JhbmdlX3dyYXBwZXIKLXN5c19zeW5jX2ZpbGVfcmFuZ2Vfd3JhcHBlcjoKK0VOVFJZKHN5c19zeW5jX2ZpbGVfcmFuZ2Vfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCXNsbGcJJXIzLCVyMywzMgkJIyBnZXQgaGlnaCB3b3JkIG9mIDY0Yml0IGxvZmZfdAogCW9yCSVyMywlcjQJCQkjIGdldCBsb3cgd29yZCBvZiA2NGJpdCBsb2ZmX3QKQEAgLTE2MzksMzEgKzEzOTksMjcgQEAKIAlsbGdmCSVyNSwxNjQoJXIxNSkJCSMgdW5zaWduZWQgaW50CiAJamcJc3lzX3N5bmNfZmlsZV9yYW5nZQogCi0JLmdsb2JsCXN5c190ZWVfd3JhcHBlcgotc3lzX3RlZV93cmFwcGVyOgorRU5UUlkoc3lzX3RlZV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlsbGdmcgklcjQsJXI0CQkJIyBzaXplX3QKIAlsbGdmcgklcjUsJXI1CQkJIyB1bnNpZ25lZCBpbnQKIAlqZwlzeXNfdGVlCiAKLQkuZ2xvYmwgY29tcGF0X3N5c192bXNwbGljZV93cmFwcGVyCi1jb21wYXRfc3lzX3Ztc3BsaWNlX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3Ztc3BsaWNlX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGd0cgklcjMsJXIzCQkJIyBjb21wYXRfaW92ZWMgKgogCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGludAogCWxsZ2ZyCSVyNSwlcjUJCQkjIHVuc2lnbmVkIGludAogCWpnCWNvbXBhdF9zeXNfdm1zcGxpY2UKIAotCS5nbG9ibAlzeXNfZ2V0Y3B1X3dyYXBwZXIKLXN5c19nZXRjcHVfd3JhcHBlcjoKK0VOVFJZKHN5c19nZXRjcHVfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyB1bnNpZ25lZCAqCiAJbGxndHIJJXIzLCVyMwkJCSMgdW5zaWduZWQgKgogCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBnZXRjcHVfY2FjaGUgKgogCWpnCXN5c19nZXRjcHUKIAotCS5nbG9ibAljb21wYXRfc3lzX2Vwb2xsX3B3YWl0X3dyYXBwZXIKLWNvbXBhdF9zeXNfZXBvbGxfcHdhaXRfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfZXBvbGxfcHdhaXRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIHN0cnVjdCBjb21wYXRfZXBvbGxfZXZlbnQgKgogCWxnZnIJJXI0LCVyNAkJCSMgaW50CkBAIC0xNjczLDM0ICsxNDI5LDI5IEBACiAJc3RnCSVyMCwxNjAoJXIxNSkKIAlqZwljb21wYXRfc3lzX2Vwb2xsX3B3YWl0CiAKLQkuZ2xvYmwJY29tcGF0X3N5c191dGltZXNfd3JhcHBlcgotY29tcGF0X3N5c191dGltZXNfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfdXRpbWVzX3dyYXBwZXIpCiAJbGxndHIJJXIyLCVyMgkJCSMgY2hhciAqCiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF90aW1ldmFsICoKIAlqZwljb21wYXRfc3lzX3V0aW1lcwogCi0JLmdsb2JsCWNvbXBhdF9zeXNfdXRpbWVuc2F0X3dyYXBwZXIKLWNvbXBhdF9zeXNfdXRpbWVuc2F0X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3V0aW1lbnNhdF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNoYXIgKgogCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgKgogCWxnZnIJJXI1LCVyNQkJCSMgaW50CiAJamcJY29tcGF0X3N5c191dGltZW5zYXQKIAotCS5nbG9ibAljb21wYXRfc3lzX3NpZ25hbGZkX3dyYXBwZXIKLWNvbXBhdF9zeXNfc2lnbmFsZmRfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfc2lnbmFsZmRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNvbXBhdF9zaWdzZXRfdCAqCiAJbGxnZnIJJXI0LCVyNAkJCSMgY29tcGF0X3NpemVfdAogCWpnCWNvbXBhdF9zeXNfc2lnbmFsZmQKIAotCS5nbG9ibAlzeXNfZXZlbnRmZF93cmFwcGVyCi1zeXNfZXZlbnRmZF93cmFwcGVyOgorRU5UUlkoc3lzX2V2ZW50ZmRfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBpbnQKIAlqZwlzeXNfZXZlbnRmZAogCi0JLmdsb2JsCXN5c19mYWxsb2NhdGVfd3JhcHBlcgotc3lzX2ZhbGxvY2F0ZV93cmFwcGVyOgorRU5UUlkoc3lzX2ZhbGxvY2F0ZV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlzbGxnCSVyNCwlcjQsMzIJCSMgZ2V0IGhpZ2ggd29yZCBvZiA2NGJpdCBsb2ZmX3QKQEAgLTE3MDksOTQgKzE0NjAsODAgQEAKIAlsCSVyNSwxNjQoJXIxNSkJCSMgZ2V0IGxvdyB3b3JkIG9mIDY0Yml0IGxvZmZfdAogCWpnCXN5c19mYWxsb2NhdGUKIAotCS5nbG9ibAlzeXNfdGltZXJmZF9jcmVhdGVfd3JhcHBlcgotc3lzX3RpbWVyZmRfY3JlYXRlX3dyYXBwZXI6CitFTlRSWShzeXNfdGltZXJmZF9jcmVhdGVfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJamcJc3lzX3RpbWVyZmRfY3JlYXRlCiAKLQkuZ2xvYmwJY29tcGF0X3N5c190aW1lcmZkX3NldHRpbWVfd3JhcHBlcgotY29tcGF0X3N5c190aW1lcmZkX3NldHRpbWVfd3JhcHBlcjoKK0VOVFJZKGNvbXBhdF9zeXNfdGltZXJmZF9zZXR0aW1lX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsZ2ZyCSVyMywlcjMJCQkjIGludAogCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyAqCiAJbGxndHIJJXI1LCVyNQkJCSMgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjICoKIAlqZwljb21wYXRfc3lzX3RpbWVyZmRfc2V0dGltZQogCi0JLmdsb2JsCWNvbXBhdF9zeXNfdGltZXJmZF9nZXR0aW1lX3dyYXBwZXIKLWNvbXBhdF9zeXNfdGltZXJmZF9nZXR0aW1lX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3RpbWVyZmRfZ2V0dGltZV93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjICoKIAlqZwljb21wYXRfc3lzX3RpbWVyZmRfZ2V0dGltZQogCi0JLmdsb2JsIGNvbXBhdF9zeXNfc2lnbmFsZmQ0X3dyYXBwZXIKLWNvbXBhdF9zeXNfc2lnbmFsZmQ0X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3NpZ25hbGZkNF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgY29tcGF0X3NpZ3NldF90ICoKIAlsbGdmcgklcjQsJXI0CQkJIyBjb21wYXRfc2l6ZV90CiAJbGdmcgklcjUsJXI1CQkJIyBpbnQKIAlqZwljb21wYXRfc3lzX3NpZ25hbGZkNAogCi0JLmdsb2JsIHN5c19ldmVudGZkMl93cmFwcGVyCi1zeXNfZXZlbnRmZDJfd3JhcHBlcjoKK0VOVFJZKHN5c19ldmVudGZkMl93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGludAogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJamcJc3lzX2V2ZW50ZmQyCiAKLQkuZ2xvYmwJc3lzX2lub3RpZnlfaW5pdDFfd3JhcHBlcgotc3lzX2lub3RpZnlfaW5pdDFfd3JhcHBlcjoKK0VOVFJZKHN5c19pbm90aWZ5X2luaXQxX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlqZwlzeXNfaW5vdGlmeV9pbml0MQogCi0JLmdsb2JsCXN5c19waXBlMl93cmFwcGVyCi1zeXNfcGlwZTJfd3JhcHBlcjoKK0VOVFJZKHN5c19waXBlMl93cmFwcGVyKQogCWxsZ3RyCSVyMiwlcjIJCQkjIHUzMiAqCiAJbGdmcgklcjMsJXIzCQkJIyBpbnQKIAlqZwlzeXNfcGlwZTIJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzX2R1cDNfd3JhcHBlcgotc3lzX2R1cDNfd3JhcHBlcjoKK0VOVFJZKHN5c19kdXAzX3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50CiAJbGdmcgklcjQsJXI0CQkJIyBpbnQKIAlqZwlzeXNfZHVwMwkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXNfZXBvbGxfY3JlYXRlMV93cmFwcGVyCi1zeXNfZXBvbGxfY3JlYXRlMV93cmFwcGVyOgorRU5UUlkoc3lzX2Vwb2xsX2NyZWF0ZTFfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWpnCXN5c19lcG9sbF9jcmVhdGUxCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzMzJfcmVhZGFoZWFkX3dyYXBwZXIKLXN5czMyX3JlYWRhaGVhZF93cmFwcGVyOgorRU5UUlkoc3lzMzJfcmVhZGFoZWFkX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsbGdmcgklcjMsJXIzCQkJIyB1MzIKIAlsbGdmcgklcjQsJXI0CQkJIyB1MzIKIAlsZ2ZyCSVyNSwlcjUJCQkjIHMzMgogCWpnCXN5czMyX3JlYWRhaGVhZAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9zZW5kZmlsZTY0X3dyYXBwZXIKLXN5czMyX3NlbmRmaWxlNjRfd3JhcHBlcjoKK0VOVFJZKHN5czMyX3NlbmRmaWxlNjRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJbGxndHIJJXI0LCVyNAkJCSMgY29tcGF0X2xvZmZfdCAqCiAJbGdmcgklcjUsJXI1CQkJIyBzMzIKIAlqZwlzeXMzMl9zZW5kZmlsZTY0CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzX3RraWxsX3dyYXBwZXIKLXN5c190a2lsbF93cmFwcGVyOgorRU5UUlkoc3lzX3RraWxsX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBwaWRfdAogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJamcJc3lzX3RraWxsCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5c190Z2tpbGxfd3JhcHBlcgotc3lzX3Rna2lsbF93cmFwcGVyOgorRU5UUlkoc3lzX3Rna2lsbF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgcGlkX3QKIAlsZ2ZyCSVyMywlcjMJCQkjIHBpZF90CiAJbGdmcgklcjQsJXI0CQkJIyBpbnQKIAlqZwlzeXNfdGdraWxsCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfa2V5Y3RsX3dyYXBwZXIKLWNvbXBhdF9zeXNfa2V5Y3RsX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX2tleWN0bF93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHUzMgogCWxsZ2ZyCSVyMywlcjMJCQkjIHUzMgogCWxsZ2ZyCSVyNCwlcjQJCQkjIHUzMgpAQCAtMTgwNCw4ICsxNTQxLDcgQEAKIAlsbGdmcgklcjYsJXI2CQkJIyB1MzIKIAlqZwljb21wYXRfc3lzX2tleWN0bAkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfcHJlYWR2X3dyYXBwZXIKLWNvbXBhdF9zeXNfcHJlYWR2X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3ByZWFkdl93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKIAlsbGd0cgklcjMsJXIzCQkJIyBjb21wYXRfaW92ZWMgKgogCWxsZ2ZyCSVyNCwlcjQJCQkjIHVuc2lnbmVkIGxvbmcKQEAgLTE4MTMsOCArMTU0OSw3IEBACiAJbGxnZnIJJXI2LCVyNgkJCSMgdTMyCiAJamcJY29tcGF0X3N5c19wcmVhZHYJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAljb21wYXRfc3lzX3B3cml0ZXZfd3JhcHBlcgotY29tcGF0X3N5c19wd3JpdGV2X3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3B3cml0ZXZfd3JhcHBlcikKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCiAJbGxndHIJJXIzLCVyMwkJCSMgY29tcGF0X2lvdmVjICoKIAlsbGdmcgklcjQsJXI0CQkJIyB1bnNpZ25lZCBsb25nCkBAIC0xODIyLDE2ICsxNTU3LDE0IEBACiAJbGxnZnIJJXI2LCVyNgkJCSMgdTMyCiAJamcJY29tcGF0X3N5c19wd3JpdGV2CSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJY29tcGF0X3N5c19ydF90Z3NpZ3F1ZXVlaW5mb193cmFwcGVyCi1jb21wYXRfc3lzX3J0X3Rnc2lncXVldWVpbmZvX3dyYXBwZXI6CitFTlRSWShjb21wYXRfc3lzX3J0X3Rnc2lncXVldWVpbmZvX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBjb21wYXRfcGlkX3QKIAlsZ2ZyCSVyMywlcjMJCQkjIGNvbXBhdF9waWRfdAogCWxnZnIJJXI0LCVyNAkJCSMgaW50CiAJbGxndHIJJXI1LCVyNQkJCSMgc3RydWN0IGNvbXBhdF9zaWdpbmZvICoKIAlqZwljb21wYXRfc3lzX3J0X3Rnc2lncXVldWVpbmZvX3dyYXBwZXIgIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXNfcGVyZl9ldmVudF9vcGVuX3dyYXBwZXIKLXN5c19wZXJmX2V2ZW50X29wZW5fd3JhcHBlcjoKK0VOVFJZKHN5c19wZXJmX2V2ZW50X29wZW5fd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjb25zdCBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICoKIAlsZ2ZyCSVyMywlcjMJCQkjIHBpZF90CiAJbGdmcgklcjQsJXI0CQkJIyBpbnQKQEAgLTE4MzksMjkgKzE1NzIsMjUgQEAKIAlsbGdmcgklcjYsJXI2CQkJIyB1bnNpZ25lZCBsb25nCiAJamcJc3lzX3BlcmZfZXZlbnRfb3BlbgkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5c19jbG9uZV93cmFwcGVyCi1zeXNfY2xvbmVfd3JhcHBlcjoKK0VOVFJZKHN5c19jbG9uZV93cmFwcGVyKQogCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKIAlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCiAJbGxndHIJJXI0LCVyNAkJCSMgaW50ICoKIAlsbGd0cgklcjUsJXI1CQkJIyBpbnQgKgogCWpnCXN5c19jbG9uZQkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXMzMl9leGVjdmVfd3JhcHBlcgotc3lzMzJfZXhlY3ZlX3dyYXBwZXI6CitFTlRSWShzeXMzMl9leGVjdmVfd3JhcHBlcikKIAlsbGd0cgklcjIsJXIyCQkJIyBjaGFyICoKIAlsbGd0cgklcjMsJXIzCQkJIyBjb21wYXRfdXB0cl90ICoKIAlsbGd0cgklcjQsJXI0CQkJIyBjb21wYXRfdXB0cl90ICoKIAlqZwlzeXMzMl9leGVjdmUJCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKLQkuZ2xvYmwJc3lzX2Zhbm90aWZ5X2luaXRfd3JhcHBlcgotc3lzX2Zhbm90aWZ5X2luaXRfd3JhcHBlcjoKK0VOVFJZKHN5c19mYW5vdGlmeV9pbml0X3dyYXBwZXIpCiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50CiAJamcJc3lzX2Zhbm90aWZ5X2luaXQJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXNfZmFub3RpZnlfbWFya193cmFwcGVyCi1zeXNfZmFub3RpZnlfbWFya193cmFwcGVyOgorRU5UUlkoc3lzX2Zhbm90aWZ5X21hcmtfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ2ZyCSVyMywlcjMJCQkjIHVuc2lnbmVkIGludAogCXNsbGcJJXI0LCVyNCwzMgkJIyBnZXQgaGlnaCB3b3JkIG9mIDY0Yml0IG1hc2sKQEAgLTE4NzAsMTYgKzE1OTksMTQgQEAKIAlsbGd0CSVyNiwxNjQoJXIxNSkJCSMgY2hhciAqCiAJamcJc3lzX2Zhbm90aWZ5X21hcmsJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXNfcHJsaW1pdDY0X3dyYXBwZXIKLXN5c19wcmxpbWl0NjRfd3JhcHBlcjoKK0VOVFJZKHN5c19wcmxpbWl0NjRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIHBpZF90CiAJbGxnZnIJJXIzLCVyMwkJCSMgdW5zaWduZWQgaW50CiAJbGxndHIJJXI0LCVyNAkJCSMgY29uc3Qgc3RydWN0IHJsaW1pdDY0IF9fdXNlciAqCiAJbGxndHIJJXI1LCVyNQkJCSMgc3RydWN0IHJsaW1pdDY0IF9fdXNlciAqCiAJamcJc3lzX3BybGltaXQ2NAkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKIAotCS5nbG9ibAlzeXNfbmFtZV90b19oYW5kbGVfYXRfd3JhcHBlcgotc3lzX25hbWVfdG9faGFuZGxlX2F0X3dyYXBwZXI6CitFTlRSWShzeXNfbmFtZV90b19oYW5kbGVfYXRfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxsZ3RyCSVyMywlcjMJCQkjIGNvbnN0IGNoYXIgX191c2VyICoKIAlsbGd0cgklcjQsJXI0CQkJIyBzdHJ1Y3QgZmlsZV9oYW5kbGUgX191c2VyICoKQEAgLTE4ODcsMjEgKzE2MTQsMTggQEAKIAlsZ2ZyCSVyNiwlcjYJCQkjIGludAogCWpnCXN5c19uYW1lX3RvX2hhbmRsZV9hdAogCi0JLmdsb2JsCWNvbXBhdF9zeXNfb3Blbl9ieV9oYW5kbGVfYXRfd3JhcHBlcgotY29tcGF0X3N5c19vcGVuX2J5X2hhbmRsZV9hdF93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19vcGVuX2J5X2hhbmRsZV9hdF93cmFwcGVyKQogCWxnZnIJJXIyLCVyMgkJCSMgaW50CiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IGZpbGVfaGFuZGxlIF9fdXNlciAqCiAJbGdmcgklcjQsJXI0CQkJIyBpbnQKIAlqZwljb21wYXRfc3lzX29wZW5fYnlfaGFuZGxlX2F0CiAKLQkuZ2xvYmwJY29tcGF0X3N5c19jbG9ja19hZGp0aW1lX3dyYXBwZXIKLWNvbXBhdF9zeXNfY2xvY2tfYWRqdGltZV93cmFwcGVyOgorRU5UUlkoY29tcGF0X3N5c19jbG9ja19hZGp0aW1lX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBjbG9ja2lkX3QgKGludCkKIAlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgY29tcGF0X3RpbWV4IF9fdXNlciAqCiAJamcJY29tcGF0X3N5c19jbG9ja19hZGp0aW1lCiAKLQkuZ2xvYmwJc3lzX3N5bmNmc193cmFwcGVyCi1zeXNfc3luY2ZzX3dyYXBwZXI6CitFTlRSWShzeXNfc3luY2ZzX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlqZwlzeXNfc3luY2ZzCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUwppbmRleCAwNDc2MTc0Li4zZWFiN2NmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCkBAIC05LDggKzksOCBAQAogICoJCSBIZWlrbyBDYXJzdGVucyA8aGVpa28uY2Fyc3RlbnNAZGUuaWJtLmNvbT4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgpAQCAtMTk3LDggKzE5Nyw3IEBACiAgKiBSZXR1cm5zOgogICogIGdwcjIgPSBwcmV2CiAgKi8KLQkuZ2xvYmwJX19zd2l0Y2hfdG8KLV9fc3dpdGNoX3RvOgorRU5UUlkoX19zd2l0Y2hfdG8pCiAJYmFzcgklcjEsMAogMDoJbAklcjQsX19USFJFQURfaW5mbyglcjIpCQkjIGdldCB0aHJlYWRfaW5mbyBvZiBwcmV2CiAJbAklcjUsX19USFJFQURfaW5mbyglcjMpCQkjIGdldCB0aHJlYWRfaW5mbyBvZiBuZXh0CkBAIC0yMjQsOCArMjIzLDcgQEAKICAqIGFyZSBleGVjdXRlZCB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4KICAqLwogCi0JLmdsb2JsCXN5c3RlbV9jYWxsCi1zeXN0ZW1fY2FsbDoKK0VOVFJZKHN5c3RlbV9jYWxsKQogCXN0cHQJX19MQ19TWU5DX0VOVEVSX1RJTUVSCiBzeXNjX3NhdmVhbGw6CiAJU0FWRV9BTExfU1ZDIF9fTENfU1ZDX09MRF9QU1csX19MQ19TQVZFX0FSRUEKQEAgLTM4OCw4ICszODYsNyBAQAogIwogIyBhIG5ldyBwcm9jZXNzIGV4aXRzIHRoZSBrZXJuZWwgd2l0aCByZXRfZnJvbV9mb3JrCiAjCi0JLmdsb2JsCXJldF9mcm9tX2ZvcmsKLXJldF9mcm9tX2Zvcms6CitFTlRSWShyZXRfZnJvbV9mb3JrKQogCWwJJXIxMyxfX0xDX1NWQ19ORVdfUFNXKzQKIAlsCSVyMTIsX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKIAl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgZm9ya2luZyBhIGtlcm5lbCB0aHJlYWQgPwpAQCAtNDA1LDggKzQwMiw3IEBACiAjIGtlcm5lbF9leGVjdmUgZnVuY3Rpb24gbmVlZHMgdG8gZGVhbCB3aXRoIHB0X3JlZ3MgdGhhdCBpcyBub3QKICMgYXQgdGhlIHVzdWFsIHBsYWNlCiAjCi0JLmdsb2JsCWtlcm5lbF9leGVjdmUKLWtlcm5lbF9leGVjdmU6CitFTlRSWShrZXJuZWxfZXhlY3ZlKQogCXN0bQklcjEyLCVyMTUsNDgoJXIxNSkKIAlscgklcjE0LCVyMTUKIAlsCSVyMTMsX19MQ19TVkNfTkVXX1BTVys0CkBAIC00MzgsOCArNDM0LDcgQEAKICAqIFByb2dyYW0gY2hlY2sgaGFuZGxlciByb3V0aW5lCiAgKi8KIAotCS5nbG9ibAlwZ21fY2hlY2tfaGFuZGxlcgotcGdtX2NoZWNrX2hhbmRsZXI6CitFTlRSWShwZ21fY2hlY2tfaGFuZGxlcikKIC8qCiAgKiBGaXJzdCB3ZSBuZWVkIHRvIGNoZWNrIGZvciBhIHNwZWNpYWwgY2FzZToKICAqIFNpbmdsZSBzdGVwcGluZyBhbiBpbnN0cnVjdGlvbiB0aGF0IGRpc2FibGVzIHRoZSBQRVIgZXZlbnQgbWFzayB3aWxsCkBAIC01NjUsOCArNTYwLDcgQEAKICAqIElPIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUKICAqLwogCi0JLmdsb2JsIGlvX2ludF9oYW5kbGVyCi1pb19pbnRfaGFuZGxlcjoKK0VOVFJZKGlvX2ludF9oYW5kbGVyKQogCXN0Y2sJX19MQ19JTlRfQ0xPQ0sKIAlzdHB0CV9fTENfQVNZTkNfRU5URVJfVElNRVIKIAlTQVZFX0FMTF9BU1lOQyBfX0xDX0lPX09MRF9QU1csX19MQ19TQVZFX0FSRUErMTYKQEAgLTcwMyw4ICs2OTcsNyBAQAogICogRXh0ZXJuYWwgaW50ZXJydXB0IGhhbmRsZXIgcm91dGluZQogICovCiAKLQkuZ2xvYmwJZXh0X2ludF9oYW5kbGVyCi1leHRfaW50X2hhbmRsZXI6CitFTlRSWShleHRfaW50X2hhbmRsZXIpCiAJc3RjawlfX0xDX0lOVF9DTE9DSwogCXN0cHQJX19MQ19BU1lOQ19FTlRFUl9USU1FUgogCVNBVkVfQUxMX0FTWU5DIF9fTENfRVhUX09MRF9QU1csX19MQ19TQVZFX0FSRUErMTYKQEAgLTczMSw4ICs3MjQsNyBAQAogICogTWFjaGluZSBjaGVjayBoYW5kbGVyIHJvdXRpbmVzCiAgKi8KIAotCS5nbG9ibCBtY2NrX2ludF9oYW5kbGVyCi1tY2NrX2ludF9oYW5kbGVyOgorRU5UUlkobWNja19pbnRfaGFuZGxlcikKIAlzdGNrCV9fTENfTUNDS19DTE9DSwogCXNwdAlfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEJIyByZXZhbGlkYXRlIGNwdSB0aW1lcgogCWxtCSVyMCwlcjE1LF9fTENfR1BSRUdTX1NBVkVfQVJFQQkjIHJldmFsaWRhdGUgZ3BycwpAQCAtODE4LDggKzgxMCw3IEBACiAgKi8KICNpZmRlZiBDT05GSUdfU01QCiAJX19DUFVJTklUCi0JLmdsb2JsIHJlc3RhcnRfaW50X2hhbmRsZXIKLXJlc3RhcnRfaW50X2hhbmRsZXI6CitFTlRSWShyZXN0YXJ0X2ludF9oYW5kbGVyKQogCWJhc3IJJXIxLDAKIHJlc3RhcnRfYmFzZToKIAlzcHQJcmVzdGFydF92dGltZS1yZXN0YXJ0X2Jhc2UoJXIxKQpAQCAtODQ4LDggKzgzOSw3IEBACiAvKgogICogSWYgd2UgZG8gbm90IHJ1biB3aXRoIFNNUCBlbmFibGVkLCBsZXQgdGhlIG5ldyBDUFUgY3Jhc2ggLi4uCiAgKi8KLQkuZ2xvYmwgcmVzdGFydF9pbnRfaGFuZGxlcgotcmVzdGFydF9pbnRfaGFuZGxlcjoKK0VOVFJZKHJlc3RhcnRfaW50X2hhbmRsZXIpCiAJYmFzcgklcjEsMAogcmVzdGFydF9iYXNlOgogCWxwc3cJcmVzdGFydF9jcmFzaC1yZXN0YXJ0X2Jhc2UoJXIxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5oIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5oCmluZGV4IDE3YTZmODMuLjY2NzI5ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuaAorKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LmgKQEAgLTUsMTAgKzUsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAotdHlwZWRlZiB2b2lkIHBnbV9jaGVja19oYW5kbGVyX3Qoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZywgdW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gcGdtX2NoZWNrX2hhbmRsZXJfdCAqcGdtX2NoZWNrX3RhYmxlWzEyOF07Ci1wZ21fY2hlY2tfaGFuZGxlcl90IGRvX3Byb3RlY3Rpb25fZXhjZXB0aW9uOwotcGdtX2NoZWNrX2hhbmRsZXJfdCBkb19kYXRfZXhjZXB0aW9uOwordm9pZCBkb19wcm90ZWN0aW9uX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqLCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgZG9fZGF0X2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqLCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgZG9fYXNjZV9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKiwgbG9uZywgdW5zaWduZWQgbG9uZyk7CiAKIGV4dGVybiBpbnQgc3lzY3RsX3VzZXJwcm9jZXNzX2RlYnVnOwogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCmluZGV4IGQ2MTk2N2UuLjdhMGZkNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCkBAIC05LDggKzksOCBAQAogICoJCSBIZWlrbyBDYXJzdGVucyA8aGVpa28uY2Fyc3RlbnNAZGUuaWJtLmNvbT4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgpAQCAtNTYsMTUgKzU2LDI4IEBACiAJCSBfVElGX01DQ0tfUEVORElORykKIF9USUZfU1lTQ0FMTCA9IChfVElGX1NZU0NBTExfVFJBQ0U+PjggfCBfVElGX1NZU0NBTExfQVVESVQ+PjggfCBcCiAJCV9USUZfU0VDQ09NUD4+OCB8IF9USUZfU1lTQ0FMTF9UUkFDRVBPSU5UPj44KQorX1RJRl9FWElUX1NJRSA9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05FRURfUkVTQ0hFRCB8IF9USUZfTUNDS19QRU5ESU5HKQogCiAjZGVmaW5lIEJBU0VEKG5hbWUpIG5hbWUtc3lzdGVtX2NhbGwoJXIxMykKIAorCS5tYWNybyBTUFAgbmV3cHAKKyNpZiBkZWZpbmVkKENPTkZJR19LVk0pIHx8IGRlZmluZWQoQ09ORklHX0tWTV9NT0RVTEUpCisJdG0JX19MQ19NQUNISU5FX0ZMQUdTKzYsMHgyMAkjIE1BQ0hJTkVfRkxBR19TUFAKKwlqegkuKzgKKwkuaW5zbglzLDB4YjI4MDAwMDAsXG5ld3BwCisjZW5kaWYKKwkuZW5kbQorCiAJLm1hY3JvCUhBTkRMRV9TSUVfSU5URVJDRVBUCiAjaWYgZGVmaW5lZChDT05GSUdfS1ZNKSB8fCBkZWZpbmVkKENPTkZJR19LVk1fTU9EVUxFKQotCWxnCSVyMyxfX0xDX1NJRV9IT09LCi0JbHRncgklcjMsJXIzCisJdG0JX19USV9mbGFncys2KCVyMTIpLF9USUZfU0lFPj44CiAJanoJMGYKLQliYXNyCSVyMTQsJXIzCisJU1BQCV9fTENfQ01GX0hQUAkJCSMgc2V0IGhvc3QgaWQKKwljbGMJU1BfUFNXKzgoOCwlcjE1KSxCQVNFRCguTHNpZV9sb29wKQorCWpsCTBmCisJY2xjCVNQX1BTVys4KDgsJXIxNSksQkFTRUQoLkxzaWVfZG9uZSkKKwlqaGUJMGYKKwltdmMJU1BfUFNXKzgoOCwlcjE1KSxCQVNFRCguTHNpZV9sb29wKQogMDoKICNlbmRpZgogCS5lbmRtCkBAIC0yMDYsOCArMjE5LDcgQEAKICAqIFJldHVybnM6CiAgKiAgZ3ByMiA9IHByZXYKICAqLwotCS5nbG9ibAlfX3N3aXRjaF90bwotX19zd2l0Y2hfdG86CitFTlRSWShfX3N3aXRjaF90bykKIAlsZwklcjQsX19USFJFQURfaW5mbyglcjIpCQkjIGdldCB0aHJlYWRfaW5mbyBvZiBwcmV2CiAJbGcJJXI1LF9fVEhSRUFEX2luZm8oJXIzKQkJIyBnZXQgdGhyZWFkX2luZm8gb2YgbmV4dAogCXRtCV9fVElfZmxhZ3MrNyglcjQpLF9USUZfTUNDS19QRU5ESU5HICMgbWFjaGluZSBjaGVjayBwZW5kaW5nPwpAQCAtMjMyLDggKzI0NCw3IEBACiAgKiBhcmUgZXhlY3V0ZWQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCiAgKi8KIAotCS5nbG9ibAlzeXN0ZW1fY2FsbAotc3lzdGVtX2NhbGw6CitFTlRSWShzeXN0ZW1fY2FsbCkKIAlzdHB0CV9fTENfU1lOQ19FTlRFUl9USU1FUgogc3lzY19zYXZlYWxsOgogCVNBVkVfQUxMX1NWQyBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBCkBAIC0zOTUsOCArNDA2LDcgQEAKICMKICMgYSBuZXcgcHJvY2VzcyBleGl0cyB0aGUga2VybmVsIHdpdGggcmV0X2Zyb21fZm9yawogIwotCS5nbG9ibAlyZXRfZnJvbV9mb3JrCi1yZXRfZnJvbV9mb3JrOgorRU5UUlkocmV0X2Zyb21fZm9yaykKIAlsZwklcjEzLF9fTENfU1ZDX05FV19QU1crOAogCWxnCSVyMTIsX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKIAl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgZm9ya2luZyBhIGtlcm5lbCB0aHJlYWQgPwpAQCAtNDExLDggKzQyMSw3IEBACiAjIGtlcm5lbF9leGVjdmUgZnVuY3Rpb24gbmVlZHMgdG8gZGVhbCB3aXRoIHB0X3JlZ3MgdGhhdCBpcyBub3QKICMgYXQgdGhlIHVzdWFsIHBsYWNlCiAjCi0JLmdsb2JsCWtlcm5lbF9leGVjdmUKLWtlcm5lbF9leGVjdmU6CitFTlRSWShrZXJuZWxfZXhlY3ZlKQogCXN0bWcJJXIxMiwlcjE1LDk2KCVyMTUpCiAJbGdyCSVyMTQsJXIxNQogCWFnaGkJJXIxNSwtU1BfU0laRQpAQCAtNDQyLDggKzQ1MSw3IEBACiAgKiBQcm9ncmFtIGNoZWNrIGhhbmRsZXIgcm91dGluZQogICovCiAKLQkuZ2xvYmwJcGdtX2NoZWNrX2hhbmRsZXIKLXBnbV9jaGVja19oYW5kbGVyOgorRU5UUlkocGdtX2NoZWNrX2hhbmRsZXIpCiAvKgogICogRmlyc3Qgd2UgbmVlZCB0byBjaGVjayBmb3IgYSBzcGVjaWFsIGNhc2U6CiAgKiBTaW5nbGUgc3RlcHBpbmcgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBkaXNhYmxlcyB0aGUgUEVSIGV2ZW50IG1hc2sgd2lsbApAQCAtNDY1LDYgKzQ3Myw3IEBACiAJeGMJU1BfSUxDKDQsJXIxNSksU1BfSUxDKCVyMTUpCiAJbXZjCVNQX1BTVygxNiwlcjE1KSxfX0xDX1BHTV9PTERfUFNXCiAJbGcJJXIxMixfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAorCUhBTkRMRV9TSUVfSU5URVJDRVBUCiAJdG0JU1BfUFNXKzEoJXIxNSksMHgwMQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPwogCWp6CXBnbV9ub192dGltZQogCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19TWU5DX0VOVEVSX1RJTUVSLF9fTENfVVNFUl9USU1FUgpAQCAtNDcyLDcgKzQ4MSw2IEBACiAJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19TWU5DX0VOVEVSX1RJTUVSCiAJTEFTVF9CUkVBSwogcGdtX25vX3Z0aW1lOgotCUhBTkRMRV9TSUVfSU5URVJDRVBUCiAJc3RnCSVyMTEsU1BfQVJHUyglcjE1KQogCWxnZgklcjMsX19MQ19QR01fSUxDCSMgbG9hZCBwcm9ncmFtIGludGVycnVwdGlvbiBjb2RlCiAJbGcJJXI0LF9fTENfVFJBTlNfRVhDX0NPREUKQEAgLTUwNyw2ICs1MTUsNyBAQAogCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NBVkVfQVJFQQogCW12YwlTUF9QU1coMTYsJXIxNSksX19MQ19QR01fT0xEX1BTVwogCWxnCSVyMTIsX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwlIQU5ETEVfU0lFX0lOVEVSQ0VQVAogCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KIAlqeglwZ21fbm9fdnRpbWUyCiAJVVBEQVRFX1ZUSU1FIF9fTENfRVhJVF9USU1FUixfX0xDX1NZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCkBAIC01MTQsNyArNTIzLDYgQEAKIAltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX1NZTkNfRU5URVJfVElNRVIKIAlMQVNUX0JSRUFLCiBwZ21fbm9fdnRpbWUyOgotCUhBTkRMRV9TSUVfSU5URVJDRVBUCiAJbGcJJXIxLF9fVElfdGFzayglcjEyKQogCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBrZXJuZWwgcGVyIGV2ZW50ID8KIAlqeglrZXJuZWxfcGVyCkBAIC01NzEsMTQgKzU3OSwxNCBAQAogLyoKICAqIElPIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUKICAqLwotCS5nbG9ibCBpb19pbnRfaGFuZGxlcgotaW9faW50X2hhbmRsZXI6CitFTlRSWShpb19pbnRfaGFuZGxlcikKIAlzdGNrCV9fTENfSU5UX0NMT0NLCiAJc3RwdAlfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCiAJU0FWRV9BTExfQVNZTkMgX19MQ19JT19PTERfUFNXLF9fTENfU0FWRV9BUkVBKzQwCiAJQ1JFQVRFX1NUQUNLX0ZSQU1FIF9fTENfU0FWRV9BUkVBKzQwCiAJbXZjCVNQX1BTVygxNiwlcjE1KSwwKCVyMTIpCSMgbW92ZSB1c2VyIFBTVyB0byBzdGFjawogCWxnCSVyMTIsX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwlIQU5ETEVfU0lFX0lOVEVSQ0VQVAogCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KIAlqeglpb19ub192dGltZQogCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19BU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKQEAgLTU4Niw3ICs1OTQsNiBAQAogCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfQVNZTkNfRU5URVJfVElNRVIKIAlMQVNUX0JSRUFLCiBpb19ub192dGltZToKLQlIQU5ETEVfU0lFX0lOVEVSQ0VQVAogCVRSQUNFX0lSUVNfT0ZGCiAJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGFkZHJlc3Mgb2YgcmVnaXN0ZXItc2F2ZSBhcmVhCiAJYnJhc2wJJXIxNCxkb19JUlEJCSMgY2FsbCBzdGFuZGFyZCBpcnEgaGFuZGxlcgpAQCAtNzA2LDE0ICs3MTMsMTQgQEAKIC8qCiAgKiBFeHRlcm5hbCBpbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lCiAgKi8KLQkuZ2xvYmwJZXh0X2ludF9oYW5kbGVyCi1leHRfaW50X2hhbmRsZXI6CitFTlRSWShleHRfaW50X2hhbmRsZXIpCiAJc3RjawlfX0xDX0lOVF9DTE9DSwogCXN0cHQJX19MQ19BU1lOQ19FTlRFUl9USU1FUgogCVNBVkVfQUxMX0FTWU5DIF9fTENfRVhUX09MRF9QU1csX19MQ19TQVZFX0FSRUErNDAKIAlDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19TQVZFX0FSRUErNDAKIAltdmMJU1BfUFNXKDE2LCVyMTUpLDAoJXIxMikJIyBtb3ZlIHVzZXIgUFNXIHRvIHN0YWNrCiAJbGcJJXIxMixfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAorCUhBTkRMRV9TSUVfSU5URVJDRVBUCiAJdG0JU1BfUFNXKzEoJXIxNSksMHgwMQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPwogCWp6CWV4dF9ub192dGltZQogCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19BU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKQEAgLTcyMSw3ICs3MjgsNiBAQAogCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfQVNZTkNfRU5URVJfVElNRVIKIAlMQVNUX0JSRUFLCiBleHRfbm9fdnRpbWU6Ci0JSEFORExFX1NJRV9JTlRFUkNFUFQKIAlUUkFDRV9JUlFTX09GRgogCWxnaGkJJXIxLDQwOTYKIAlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgYWRkcmVzcyBvZiByZWdpc3Rlci1zYXZlIGFyZWEKQEAgLTczNiw4ICs3NDIsNyBAQAogLyoKICAqIE1hY2hpbmUgY2hlY2sgaGFuZGxlciByb3V0aW5lcwogICovCi0JLmdsb2JsIG1jY2tfaW50X2hhbmRsZXIKLW1jY2tfaW50X2hhbmRsZXI6CitFTlRSWShtY2NrX2ludF9oYW5kbGVyKQogCXN0Y2sJX19MQ19NQ0NLX0NMT0NLCiAJbGEJJXIxLDQwOTUJCSMgcmV2YWxpZGF0ZSByMQogCXNwdAlfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEtNDA5NSglcjEpCSMgcmV2YWxpZGF0ZSBjcHUgdGltZXIKQEAgLTc4NSw2ICs3OTAsNyBAQAogCWxnCSVyMTIsX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKIAl0bQlfX0xDX01DQ0tfQ09ERSsyLDB4MDgJIyBtd3Agb2Ygb2xkIHBzdyB2YWxpZD8KIAlqbm8JbWNja19ub192dGltZQkJIyBubyAtPiBubyB0aW1lciB1cGRhdGUKKwlIQU5ETEVfU0lFX0lOVEVSQ0VQVAogCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KIAlqegltY2NrX25vX3Z0aW1lCiAJVVBEQVRFX1ZUSU1FIF9fTENfRVhJVF9USU1FUixfX0xDX01DQ0tfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCkBAIC04MDQsNyArODEwLDYgQEAKIAlzdG9zbQlfX1NGX0VNUFRZKCVyMTUpLDB4MDQJIyB0dXJuIGRhdCBvbgogCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX01DQ0tfUEVORElORwogCWpubwltY2NrX3JldHVybgotCUhBTkRMRV9TSUVfSU5URVJDRVBUCiAJVFJBQ0VfSVJRU19PRkYKIAlicmFzbAklcjE0LHMzOTBfaGFuZGxlX21jY2sKIAlUUkFDRV9JUlFTX09OCkBAIC04MjMsOCArODI4LDcgQEAKICAqLwogI2lmZGVmIENPTkZJR19TTVAKIAlfX0NQVUlOSVQKLQkuZ2xvYmwgcmVzdGFydF9pbnRfaGFuZGxlcgotcmVzdGFydF9pbnRfaGFuZGxlcjoKK0VOVFJZKHJlc3RhcnRfaW50X2hhbmRsZXIpCiAJYmFzcgklcjEsMAogcmVzdGFydF9iYXNlOgogCXNwdAlyZXN0YXJ0X3Z0aW1lLXJlc3RhcnRfYmFzZSglcjEpCkBAIC04NTEsOCArODU1LDcgQEAKIC8qCiAgKiBJZiB3ZSBkbyBub3QgcnVuIHdpdGggU01QIGVuYWJsZWQsIGxldCB0aGUgbmV3IENQVSBjcmFzaCAuLi4KICAqLwotCS5nbG9ibCByZXN0YXJ0X2ludF9oYW5kbGVyCi1yZXN0YXJ0X2ludF9oYW5kbGVyOgorRU5UUlkocmVzdGFydF9pbnRfaGFuZGxlcikKIAliYXNyCSVyMSwwCiByZXN0YXJ0X2Jhc2U6CiAJbHBzd2UJcmVzdGFydF9jcmFzaC1yZXN0YXJ0X2Jhc2UoJXIxKQpAQCAtMTAzNiw2ICsxMDM5LDU2IEBACiAuTGNyaXRpY2FsX2VuZDoKIAkJLnF1YWQJX19jcml0aWNhbF9lbmQKIAorI2lmIGRlZmluZWQoQ09ORklHX0tWTSkgfHwgZGVmaW5lZChDT05GSUdfS1ZNX01PRFVMRSkKKy8qCisgKiBzaWU2NGEgY2FsbGluZyBjb252ZW50aW9uOgorICogJXIyIHBvaW50ZXIgdG8gc2llIGNvbnRyb2wgYmxvY2sKKyAqICVyMyBndWVzdCByZWdpc3RlciBzYXZlIGFyZWEKKyAqLworRU5UUlkoc2llNjRhKQorCXN0bWcJJXI2LCVyMTQsX19TRl9HUFJTKCVyMTUpCSMgc2F2ZSBrZXJuZWwgcmVnaXN0ZXJzCisJc3RnCSVyMixfX1NGX0VNUFRZKCVyMTUpCQkjIHNhdmUgY29udHJvbCBibG9jayBwb2ludGVyCisJc3RnCSVyMyxfX1NGX0VNUFRZKzgoJXIxNSkJCSMgc2F2ZSBndWVzdCByZWdpc3RlciBzYXZlIGFyZWEKKwlsbWcJJXIwLCVyMTMsMCglcjMpCQkJIyBsb2FkIGd1ZXN0IGdwcnMgMC0xMworCWxnCSVyMTQsX19MQ19USFJFQURfSU5GTwkJIyBwb2ludGVyIHRocmVhZF9pbmZvIHN0cnVjdAorCW9pCV9fVElfZmxhZ3MrNiglcjE0KSxfVElGX1NJRT4+OAorc2llX2xvb3A6CisJbGcJJXIxNCxfX0xDX1RIUkVBRF9JTkZPCQkjIHBvaW50ZXIgdGhyZWFkX2luZm8gc3RydWN0CisJdG0JX19USV9mbGFncys3KCVyMTQpLF9USUZfRVhJVF9TSUUKKwlqbnoJc2llX2V4aXQKKwlsZwklcjE0LF9fU0ZfRU1QVFkoJXIxNSkJCSMgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlcgorCVNQUAlfX1NGX0VNUFRZKCVyMTUpCQkjIHNldCBndWVzdCBpZAorCXNpZQkwKCVyMTQpCitzaWVfZG9uZToKKwlTUFAJX19MQ19DTUZfSFBQCQkJIyBzZXQgaG9zdCBpZAorCWxnCSVyMTQsX19MQ19USFJFQURfSU5GTwkJIyBwb2ludGVyIHRocmVhZF9pbmZvIHN0cnVjdAorc2llX2V4aXQ6CisJbmkJX19USV9mbGFncys2KCVyMTQpLDI1NS0oX1RJRl9TSUU+PjgpCisJbGcJJXIxNCxfX1NGX0VNUFRZKzgoJXIxNSkJCSMgbG9hZCBndWVzdCByZWdpc3RlciBzYXZlIGFyZWEKKwlzdG1nCSVyMCwlcjEzLDAoJXIxNCkJCSMgc2F2ZSBndWVzdCBncHJzIDAtMTMKKwlsbWcJJXI2LCVyMTQsX19TRl9HUFJTKCVyMTUpCSMgcmVzdG9yZSBrZXJuZWwgcmVnaXN0ZXJzCisJbGdoaQklcjIsMAorCWJyCSVyMTQKK3NpZV9mYXVsdDoKKwlsZwklcjE0LF9fTENfVEhSRUFEX0lORk8JCSMgcG9pbnRlciB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwluaQlfX1RJX2ZsYWdzKzYoJXIxNCksMjU1LShfVElGX1NJRT4+OCkKKwlsZwklcjE0LF9fU0ZfRU1QVFkrOCglcjE1KQkJIyBsb2FkIGd1ZXN0IHJlZ2lzdGVyIHNhdmUgYXJlYQorCXN0bWcJJXIwLCVyMTMsMCglcjE0KQkJIyBzYXZlIGd1ZXN0IGdwcnMgMC0xMworCWxtZwklcjYsJXIxNCxfX1NGX0dQUlMoJXIxNSkJIyByZXN0b3JlIGtlcm5lbCByZWdpc3RlcnMKKwlsZ2hpCSVyMiwtRUZBVUxUCisJYnIJJXIxNAorCisJLmFsaWduCTgKKy5Mc2llX2xvb3A6CisJLnF1YWQJc2llX2xvb3AKKy5Mc2llX2RvbmU6CisJLnF1YWQJc2llX2RvbmUKKworCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLnF1YWQJc2llX2xvb3Asc2llX2ZhdWx0CisJLnByZXZpb3VzCisjZW5kaWYKKwogCQkuc2VjdGlvbiAucm9kYXRhLCAiYSIKICNkZWZpbmUgU1lTQ0FMTChlc2EsZXNhbWUsZW11KQkubG9uZyBlc2FtZQogCS5nbG9ibAlzeXNfY2FsbF90YWJsZQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQuUwppbmRleCBmYjMxN2JmLi4yZDc4MWJhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQuUwpAQCAtMjIsNiArMjIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0zODMsOCArMzg0LDcgQEAKICMgZG9lc24ndCBuZWVkIGEgYnVpbHRpbiBpcGwgcmVjb3JkLgogIwogCS5vcmcJMHg4MDAKLQkuZ2xvYmwJc3RhcnQKLXN0YXJ0OgorRU5UUlkoc3RhcnQpCiAJc3RtCSVyMCwlcjE1LDB4MDdiMAkJIyBzdG9yZSByZWdpc3RlcnMKIAliYXNyCSVyMTIsJXIwCiAuYmFzZToKQEAgLTQ0OCw4ICs0NDgsNyBAQAogIyBvciBsaW5sb2FkIG9yIFNBTElQTAogIwogCS5vcmcJMHgxMDAwMAotCS5nbG9ibAlzdGFydHVwCi1zdGFydHVwOgorRU5UUlkoc3RhcnR1cCkKIAliYXNyCSVyMTMsMAkJCSMgZ2V0IGJhc2UKIC5MUEcwOgogCXhjCTB4MjAwKDI1NiksMHgyMDAJIyBwYXJ0aWFsbHkgY2xlYXIgbG93Y29yZQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkMzEuUyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDMxLlMKaW5kZXggYjhmOGRjMS4uZjIxOTU0YiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkMzEuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQzMS5TCkBAIC0xMSwxMyArMTEsMTMgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCiBfX0hFQUQKLQkuZ2xvYmwJc3RhcnR1cF9jb250aW51ZQotc3RhcnR1cF9jb250aW51ZToKK0VOVFJZKHN0YXJ0dXBfY29udGludWUpCiAJYmFzcgklcjEzLDAJCQkjIGdldCBiYXNlCiAuTFBHMToKIApAQCAtNDUsNyArNDUsNyBAQAogCQkJCQkjIHZpcnR1YWwgYW5kIG5ldmVyIHJldHVybiAuLi4KIAkuYWxpZ24JOAogLkxlbnRyeToubG9uZwkweDAwMDgwMDAwLDB4ODAwMDAwMDAgKyBfc3RleHQKLS5MY3RsOgkubG9uZwkweDA0YjUwMDAyCQkjIGNyMDogdmFyaW91cyB0aGluZ3MKKy5MY3RsOgkubG9uZwkweDA0YjUwMDAwCQkjIGNyMDogdmFyaW91cyB0aGluZ3MKIAkubG9uZwkwCQkJIyBjcjE6IHByaW1hcnkgc3BhY2Ugc2VnbWVudCB0YWJsZQogCS5sb25nCS5MZHVjdAkJCSMgY3IyOiBkaXNwYXRjaGFibGUgdW5pdCBjb250cm9sIHRhYmxlCiAJLmxvbmcJMAkJCSMgY3IzOiBpbnN0cnVjdGlvbiBhdXRob3JpemF0aW9uCkBAIC03OCw4ICs3OCw3IEBACiAuTGJhc2VfY2M6CiAJLmxvbmcJc2NoZWRfY2xvY2tfYmFzZV9jYwogCi0JLmdsb2JsCV9laGVhZAotX2VoZWFkOgorRU5UUlkoX2VoZWFkKQogCiAjaWZkZWYgQ09ORklHX1NIQVJFRF9LRVJORUwKIAkub3JnCTB4MTAwMDAwIC0gMHgxMTAwMAkjIGhlYWQubyBlbmRzIGF0IDB4MTEwMDAKQEAgLTg4LDggKzg3LDggQEAKICMKICMgc3RhcnR1cC1jb2RlLCBydW5uaW5nIGluIGFic29sdXRlIGFkZHJlc3NpbmcgbW9kZQogIwotCS5nbG9ibAlfc3RleHQKLV9zdGV4dDoJYmFzcgklcjEzLDAJCQkjIGdldCBiYXNlCitFTlRSWShfc3RleHQpCisJYmFzcgklcjEzLDAJCQkjIGdldCBiYXNlCiAuTFBHMzoKICMgY2hlY2sgY29udHJvbCByZWdpc3RlcnMKIAlzdGN0bAklYzAsJWMxNSwwKCVyMTUpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUwppbmRleCBjZGVmNjg3Li5hZTVkNDkyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMKQEAgLTExLDEzICsxMSwxMyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIF9fSEVBRAotCS5nbG9ibAlzdGFydHVwX2NvbnRpbnVlCi1zdGFydHVwX2NvbnRpbnVlOgorRU5UUlkoc3RhcnR1cF9jb250aW51ZSkKIAlsYXJsCSVyMSxzY2hlZF9jbG9ja19iYXNlX2NjCiAJbXZjCTAoOCwlcjEpLF9fTENfTEFTVF9VUERBVEVfQ0xPQ0sKIAlsYXJsCSVyMTMsLkxQRzEJCSMgZ2V0IGJhc2UKQEAgLTQ2LDcgKzQ2LDcgQEAKIAkuYWxpZ24JMTYKIC5MUEcxOgogLkxlbnRyeToucXVhZAkweDAwMDAwMDAxODAwMDAwMDAsX3N0ZXh0Ci0uTGN0bDoJLnF1YWQJMHgwNDM1MDAwMgkJIyBjcjA6IHZhcmlvdXMgdGhpbmdzCisuTGN0bDoJLnF1YWQJMHgwNDA0MDAwMAkJIyBjcjA6IEFGUCByZWdpc3RlcnMgJiBzZWNvbmRhcnkgc3BhY2UKIAkucXVhZAkwCQkJIyBjcjE6IHByaW1hcnkgc3BhY2Ugc2VnbWVudCB0YWJsZQogCS5xdWFkCS5MZHVjdAkJCSMgY3IyOiBkaXNwYXRjaGFibGUgdW5pdCBjb250cm9sIHRhYmxlCiAJLnF1YWQJMAkJCSMgY3IzOiBpbnN0cnVjdGlvbiBhdXRob3JpemF0aW9uCkBAIC03Niw4ICs3Niw3IEBACiAJLmxvbmcJMHg4MDAwMDAwMCwwLDAsMAkjIGludmFsaWQgYWNjZXNzLWxpc3QgZW50cmllcwogCS5lbmRyCiAKLQkuZ2xvYmwJX2VoZWFkCi1fZWhlYWQ6CitFTlRSWShfZWhlYWQpCiAKICNpZmRlZiBDT05GSUdfU0hBUkVEX0tFUk5FTAogCS5vcmcJMHgxMDAwMDAgLSAweDExMDAwCSMgaGVhZC5vIGVuZHMgYXQgMHgxMTAwMApAQCAtODYsOCArODUsOCBAQAogIwogIyBzdGFydHVwLWNvZGUsIHJ1bm5pbmcgaW4gYWJzb2x1dGUgYWRkcmVzc2luZyBtb2RlCiAjCi0JLmdsb2JsCV9zdGV4dAotX3N0ZXh0OgliYXNyCSVyMTMsMAkJCSMgZ2V0IGJhc2UKK0VOVFJZKF9zdGV4dCkKKwliYXNyCSVyMTMsMAkJCSMgZ2V0IGJhc2UKIC5MUEczOgogIyBjaGVjayBjb250cm9sIHJlZ2lzdGVycwogCXN0Y3RnCSVjMCwlYzE1LDAoJXIxNSkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaXJxLmMgYi9hcmNoL3MzOTAva2VybmVsL2lycS5jCmluZGV4IGUzMjY0ZjYuLjFmNDA1MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9pcnEuYwpAQCAtODgsMTUgKzg4LDYgQEAKIH0KIAogLyoKLSAqIEZvciBjb21wYXRpYmlsdHkgb25seS4gUy8zOTAgc3BlY2lmaWMgc2V0dXAgb2YgaW50ZXJydXB0cyBldCBhbC4gaXMgZG9uZQotICogbXVjaCBsYXRlciBpbiBpbml0X2NoYW5uZWxfc3Vic3lzdGVtKCkuCi0gKi8KLXZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCi17Ci0JLyogbm90aGluZy4uLiAqLwotfQotCi0vKgogICogU3dpdGNoIHRvIHRoZSBhc3luY2hyb25vdXMgaW50ZXJydXB0IHN0YWNrIGZvciBzb2Z0aXJxIGV4ZWN1dGlvbi4KICAqLwogYXNtbGlua2FnZSB2b2lkIGRvX3NvZnRpcnEodm9pZCkKQEAgLTE0NCwyOCArMTM1LDQ1IEBACiAjZW5kaWYKIAogLyoKLSAqIGV4dF9pbnRfaGFzaFtpbmRleF0gaXMgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0IGZvciBhbGwgZXh0ZXJuYWwgaW50ZXJydXB0cwotICogdGhhdCBoYXNoIHRvIHRoaXMgaW5kZXguIFdpdGggdGhlIGN1cnJlbnQgc2V0IG9mIGV4dGVybmFsIGludGVycnVwdHMKLSAqICgweDEyMDIgZXh0ZXJuYWwgY2FsbCwgMHgxMDA0IGNwdSB0aW1lciwgMHgyNDAxIGh3YyBjb25zb2xlLCAweDQwMDAKLSAqIGl1Y3YgYW5kIDB4MjYwMyBwZmF1bHQpIHRoaXMgaXMgYWx3YXlzIHRoZSBmaXJzdCBlbGVtZW50LgorICogZXh0X2ludF9oYXNoW2luZGV4XSBpcyB0aGUgbGlzdCBoZWFkIGZvciBhbGwgZXh0ZXJuYWwgaW50ZXJydXB0cyB0aGF0IGhhc2gKKyAqIHRvIHRoaXMgaW5kZXguCiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGV4dF9pbnRfaGFzaFsyNTZdOwogCiBzdHJ1Y3QgZXh0X2ludF9pbmZvIHsKLQlzdHJ1Y3QgZXh0X2ludF9pbmZvICpuZXh0OwogCWV4dF9pbnRfaGFuZGxlcl90IGhhbmRsZXI7CiAJdTE2IGNvZGU7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogfTsKIAotc3RhdGljIHN0cnVjdCBleHRfaW50X2luZm8gKmV4dF9pbnRfaGFzaFsyNTZdOworLyogZXh0X2ludF9oYXNoX2xvY2sgcHJvdGVjdHMgdGhlIGhhbmRsZXIgbGlzdHMgZm9yIGV4dGVybmFsIGludGVycnVwdHMgKi8KK0RFRklORV9TUElOTE9DSyhleHRfaW50X2hhc2hfbG9jayk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2V4dGVybmFsX2ludGVycnVwdHModm9pZCkKK3sKKwlpbnQgaWR4OworCisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKGV4dF9pbnRfaGFzaCk7IGlkeCsrKQorCQlJTklUX0xJU1RfSEVBRCgmZXh0X2ludF9oYXNoW2lkeF0pOworfQogCiBzdGF0aWMgaW5saW5lIGludCBleHRfaGFzaCh1MTYgY29kZSkKIHsKIAlyZXR1cm4gKGNvZGUgKyAoY29kZSA+PiA5KSkgJiAweGZmOwogfQogCitzdGF0aWMgdm9pZCBleHRfaW50X2hhc2hfdXBkYXRlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgZXh0X2ludF9pbmZvICpwID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBleHRfaW50X2luZm8sIHJjdSk7CisKKwlrZnJlZShwKTsKK30KKwogaW50IHJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdCh1MTYgY29kZSwgZXh0X2ludF9oYW5kbGVyX3QgaGFuZGxlcikKIHsKIAlzdHJ1Y3QgZXh0X2ludF9pbmZvICpwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGluZGV4OwogCiAJcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0FUT01JQyk7CkBAIC0xNzQsMzMgKzE4MiwyNyBAQAogCXAtPmNvZGUgPSBjb2RlOwogCXAtPmhhbmRsZXIgPSBoYW5kbGVyOwogCWluZGV4ID0gZXh0X2hhc2goY29kZSk7Ci0JcC0+bmV4dCA9IGV4dF9pbnRfaGFzaFtpbmRleF07Ci0JZXh0X2ludF9oYXNoW2luZGV4XSA9IHA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXh0X2ludF9oYXNoX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF9yY3UoJnAtPmVudHJ5LCAmZXh0X2ludF9oYXNoW2luZGV4XSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXh0X2ludF9oYXNoX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KTsKIAogaW50IHVucmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KHUxNiBjb2RlLCBleHRfaW50X2hhbmRsZXJfdCBoYW5kbGVyKQogewotCXN0cnVjdCBleHRfaW50X2luZm8gKnAsICpxOwotCWludCBpbmRleDsKKwlzdHJ1Y3QgZXh0X2ludF9pbmZvICpwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGluZGV4ID0gZXh0X2hhc2goY29kZSk7CiAKLQlpbmRleCA9IGV4dF9oYXNoKGNvZGUpOwotCXEgPSBOVUxMOwotCXAgPSBleHRfaW50X2hhc2hbaW5kZXhdOwotCXdoaWxlIChwKSB7Ci0JCWlmIChwLT5jb2RlID09IGNvZGUgJiYgcC0+aGFuZGxlciA9PSBoYW5kbGVyKQotCQkJYnJlYWs7Ci0JCXEgPSBwOwotCQlwID0gcC0+bmV4dDsKLQl9Ci0JaWYgKCFwKQotCQlyZXR1cm4gLUVOT0VOVDsKLQlpZiAocSkKLQkJcS0+bmV4dCA9IHAtPm5leHQ7Ci0JZWxzZQotCQlleHRfaW50X2hhc2hbaW5kZXhdID0gcC0+bmV4dDsKLQlrZnJlZShwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXh0X2ludF9oYXNoX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwLCAmZXh0X2ludF9oYXNoW2luZGV4XSwgZW50cnkpCisJCWlmIChwLT5jb2RlID09IGNvZGUgJiYgcC0+aGFuZGxlciA9PSBoYW5kbGVyKSB7CisJCQlsaXN0X2RlbF9yY3UoJnAtPmVudHJ5KTsKKwkJCWNhbGxfcmN1KCZwLT5yY3UsIGV4dF9pbnRfaGFzaF91cGRhdGUpOworCQl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXh0X2ludF9oYXNoX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQpOwpAQCAtMjI0LDE1ICsyMjYsMjIgQEAKIAlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0VYVEVSTkFMX0lOVEVSUlVQVF0rKzsKIAlpZiAoY29kZSAhPSAweDEwMDQpCiAJCV9fZ2V0X2NwdV92YXIoczM5MF9pZGxlKS5ub2h6X2RlbGF5ID0gMTsKKwogCWluZGV4ID0gZXh0X2hhc2goY29kZSk7Ci0JZm9yIChwID0gZXh0X2ludF9oYXNoW2luZGV4XTsgcDsgcCA9IHAtPm5leHQpIHsKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocCwgJmV4dF9pbnRfaGFzaFtpbmRleF0sIGVudHJ5KQogCQlpZiAobGlrZWx5KHAtPmNvZGUgPT0gY29kZSkpCiAJCQlwLT5oYW5kbGVyKGV4dF9pbnRfY29kZSwgcGFyYW0zMiwgcGFyYW02NCk7Ci0JfQorCXJjdV9yZWFkX3VubG9jaygpOwogCWlycV9leGl0KCk7CiAJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKIH0KIAordm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKK3sKKwlpbml0X2V4dGVybmFsX2ludGVycnVwdHMoKTsKK30KKwogc3RhdGljIERFRklORV9TUElOTE9DSyhzY19pcnFfbG9jayk7CiBzdGF0aWMgaW50IHNjX2lycV9yZWZjb3VudDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9tY291bnQuUyBiL2FyY2gvczM5MC9rZXJuZWwvbWNvdW50LlMKaW5kZXggMWU2YTU1Ny4uN2UyYzM4YiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9tY291bnQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL21jb3VudC5TCkBAIC01LDIxICs1LDE5IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIAkuc2VjdGlvbiAua3Byb2Jlcy50ZXh0LCAiYXgiCiAKLQkuZ2xvYmwgZnRyYWNlX3N0dWIKLWZ0cmFjZV9zdHViOgorRU5UUlkoZnRyYWNlX3N0dWIpCiAJYnIJJXIxNAogCi0JLmdsb2JsIF9tY291bnQKLV9tY291bnQ6CitFTlRSWShfbWNvdW50KQogI2lmZGVmIENPTkZJR19EWU5BTUlDX0ZUUkFDRQogCWJyCSVyMTQKIAotCS5nbG9ibCBmdHJhY2VfY2FsbGVyCi1mdHJhY2VfY2FsbGVyOgorRU5UUlkoZnRyYWNlX2NhbGxlcikKICNlbmRpZgogCXN0bQklcjIsJXI1LDE2KCVyMTUpCiAJYnJhcwklcjEsMmYKQEAgLTQxLDggKzM5LDcgQEAKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCiAJbAklcjIsMTAwKCVyMTUpCiAJbAklcjMsMTUyKCVyMTUpCi0JLmdsb2JsCWZ0cmFjZV9ncmFwaF9jYWxsZXIKLWZ0cmFjZV9ncmFwaF9jYWxsZXI6CitFTlRSWShmdHJhY2VfZ3JhcGhfY2FsbGVyKQogIyBUaGUgYnJhcyBpbnN0cnVjdGlvbiBnZXRzIHJ1bnRpbWUgcGF0Y2hlZCB0byBjYWxsIHByZXBhcmVfZnRyYWNlX3JldHVybi4KICMgU2VlIGZ0cmFjZV9lbmFibGVfZnRyYWNlX2dyYXBoX2NhbGxlci4gVGhlIHBhdGNoZWQgaW5zdHJ1Y3Rpb24gaXM6CiAjCWJyYXMJJXIxNCxwcmVwYXJlX2Z0cmFjZV9yZXR1cm4KQEAgLTU2LDggKzUzLDcgQEAKIAogI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKIAotCS5nbG9ibAlyZXR1cm5fdG9faGFuZGxlcgotcmV0dXJuX3RvX2hhbmRsZXI6CitFTlRSWShyZXR1cm5fdG9faGFuZGxlcikKIAlzdG0JJXIyLCVyNSwxNiglcjE1KQogCXN0CSVyMTQsNTYoJXIxNSkKIAlscgklcjAsJXIxNQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9tY291bnQ2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9tY291bnQ2NC5TCmluZGV4IGU3MzY2NzIuLmY3MGNhZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvbWNvdW50NjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL21jb3VudDY0LlMKQEAgLTUsMjEgKzUsMTkgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogCS5zZWN0aW9uIC5rcHJvYmVzLnRleHQsICJheCIKIAotCS5nbG9ibCBmdHJhY2Vfc3R1YgotZnRyYWNlX3N0dWI6CitFTlRSWShmdHJhY2Vfc3R1YikKIAlicgklcjE0CiAKLQkuZ2xvYmwgX21jb3VudAotX21jb3VudDoKK0VOVFJZKF9tY291bnQpCiAjaWZkZWYgQ09ORklHX0RZTkFNSUNfRlRSQUNFCiAJYnIJJXIxNAogCi0JLmdsb2JsIGZ0cmFjZV9jYWxsZXIKLWZ0cmFjZV9jYWxsZXI6CitFTlRSWShmdHJhY2VfY2FsbGVyKQogI2VuZGlmCiAJbGFybAklcjEsZnVuY3Rpb25fdHJhY2Vfc3RvcAogCWljbQklcjEsMHhmLDAoJXIxKQpAQCAtMzcsOCArMzUsNyBAQAogI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKIAlsZwklcjIsMTY4KCVyMTUpCiAJbGcJJXIzLDI3MiglcjE1KQotCS5nbG9ibAlmdHJhY2VfZ3JhcGhfY2FsbGVyCi1mdHJhY2VfZ3JhcGhfY2FsbGVyOgorRU5UUlkoZnRyYWNlX2dyYXBoX2NhbGxlcikKICMgVGhlIGJyYXMgaW5zdHJ1Y3Rpb24gZ2V0cyBydW50aW1lIHBhdGNoZWQgdG8gY2FsbCBwcmVwYXJlX2Z0cmFjZV9yZXR1cm4uCiAjIFNlZSBmdHJhY2VfZW5hYmxlX2Z0cmFjZV9ncmFwaF9jYWxsZXIuIFRoZSBwYXRjaGVkIGluc3RydWN0aW9uIGlzOgogIwlicmFzCSVyMTQscHJlcGFyZV9mdHJhY2VfcmV0dXJuCkBAIC01Miw4ICs0OSw3IEBACiAKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCiAKLQkuZ2xvYmwJcmV0dXJuX3RvX2hhbmRsZXIKLXJldHVybl90b19oYW5kbGVyOgorRU5UUlkocmV0dXJuX3RvX2hhbmRsZXIpCiAJc3RtZwklcjIsJXI1LDMyKCVyMTUpCiAJbGdyCSVyMSwlcjE1CiAJYWdoaQklcjE1LC0xNjAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3MzOTAva2VybmVsL21vZHVsZS5jCmluZGV4IGY3MTY3ZWUuLmRmY2IzNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9tb2R1bGUuYwpAQCAtNDUsMTMgKzQ1LDYgQEAKICNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMjAKICNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAotdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpZiAoc2l6ZSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdm1hbGxvYyhzaXplKTsKLX0KLQogLyogRnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfYWxsb2MgKi8KIHZvaWQgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKQogewpAQCAtMTc2LDE1ICsxNjksNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQKLWFwcGx5X3JlbG9jYXRlKEVsZl9TaGRyICpzZWNoZHJzLCBjb25zdCBjaGFyICpzdHJ0YWIsIHVuc2lnbmVkIGludCBzeW1pbmRleCwKLQkgICAgICAgdW5zaWduZWQgaW50IHJlbHNlYywgc3RydWN0IG1vZHVsZSAqbWUpCi17Ci0JcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFJFTE9DQVRJT04gdW5zdXBwb3J0ZWRcbiIsCi0JICAgICAgIG1lLT5uYW1lKTsKLQlyZXR1cm4gLUVOT0VYRUM7Ci19Ci0KIHN0YXRpYyBpbnQKIGFwcGx5X3JlbGEoRWxmX1JlbGEgKnJlbGEsIEVsZl9BZGRyIGJhc2UsIEVsZl9TeW0gKnN5bXRhYiwgCiAJICAgc3RydWN0IG1vZHVsZSAqbWUpCkBAIC00MDksNyArMzkzLDMgQEAKIAltZS0+YXJjaC5zeW1pbmZvID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KLQotdm9pZCBtb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcmVpcGwuUyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGwuUwppbmRleCBjYjg5OWQ5Li4zMDNkOTYxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbC5TCkBAIC02LDE0ICs2LDE1IEBACiAgKiAgICBBdXRob3Iocyk6IEhvbGdlciBTbW9saW5za2kgKEhvbGdlci5TbW9saW5za2lAZGUuaWJtLmNvbSkKICAqLwogCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjCiAjIGRvX3JlaXBsX2FzbQogIyBQYXJhbWV0ZXI6IHIyID0gc2NoaWQgb2YgcmVpcGwgZGV2aWNlCiAjCi0JCS5nbG9ibAlkb19yZWlwbF9hc20KLWRvX3JlaXBsX2FzbToJYmFzcgklcjEzLDAKK0VOVFJZKGRvX3JlaXBsX2FzbSkKKwkJYmFzcgklcjEzLDAKIC5McGcwOgkJbHBzdwkuTG5ld3Bzdy0uTHBnMCglcjEzKQogLkxwZzE6CQkjIGRvIHN0b3JlIHN0YXR1cyBvZiBhbGwgcmVnaXN0ZXJzCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMKaW5kZXggOWVhYmJjOS4uNzhlYjdjZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMKQEAgLTQsNiArNCw3IEBACiAgKgkJIERlbmlzIEpvc2VwaCBCYXJyb3csCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogIwpAQCAtMTEsOCArMTIsOCBAQAogIyBQYXJhbWV0ZXI6IHIyID0gc2NoaWQgb2YgcmVpcGwgZGV2aWNlCiAjCiAKLQkJLmdsb2JsCWRvX3JlaXBsX2FzbQotZG9fcmVpcGxfYXNtOgliYXNyCSVyMTMsMAorRU5UUlkoZG9fcmVpcGxfYXNtKQorCQliYXNyCSVyMTMsMAogLkxwZzA6CQlscHN3ZQkuTG5ld3Bzdy0uTHBnMCglcjEzKQogLkxwZzE6CQkjIGRvIHN0b3JlIHN0YXR1cyBvZiBhbGwgcmVnaXN0ZXJzCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMgYi9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCmluZGV4IDNiNDU2YjguLmM5MWQ3MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwpAQCAtOCw2ICs4LDggQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKwogLyoKICAqIG1vdmVzIHRoZSBuZXcga2VybmVsIHRvIGl0cyBkZXN0aW5hdGlvbi4uLgogICogJXIyID0gcG9pbnRlciB0byBmaXJzdCBraW1hZ2VfZW50cnlfdApAQCAtMjIsOCArMjQsNyBAQAogICovCiAKIAkudGV4dAotCS5nbG9ibAkJcmVsb2NhdGVfa2VybmVsCi0JcmVsb2NhdGVfa2VybmVsOgorRU5UUlkocmVsb2NhdGVfa2VybmVsKQogCQliYXNyCSVyMTMsMAkJIyBiYXNlIGFkZHJlc3MKIAkuYmFzZToKIAkJc3Ruc20Jc3lzX21zay0uYmFzZSglcjEzKSwweGZiCSMgZGlzYWJsZSBEQVQKQEAgLTExMiw2ICsxMTMsNyBAQAogCQkuYnl0ZQkwCiAJCS5hbGlnbgk4CiAJcmVsb2NhdGVfa2VybmVsX2VuZDoKKwkuYWxpZ24gOAogCS5nbG9ibAlyZWxvY2F0ZV9rZXJuZWxfbGVuCiAJcmVsb2NhdGVfa2VybmVsX2xlbjoKIAkJLnF1YWQJcmVsb2NhdGVfa2VybmVsX2VuZCAtIHJlbG9jYXRlX2tlcm5lbApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWw2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWw2NC5TCmluZGV4IDFmOWVhMjAuLjdjM2NlNTggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsNjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbDY0LlMKQEAgLTgsNiArOCw4IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKIC8qCiAgKiBtb3ZlcyB0aGUgbmV3IGtlcm5lbCB0byBpdHMgZGVzdGluYXRpb24uLi4KICAqICVyMiA9IHBvaW50ZXIgdG8gZmlyc3Qga2ltYWdlX2VudHJ5X3QKQEAgLTIzLDggKzI1LDcgQEAKICAqLwogCiAJLnRleHQKLQkuZ2xvYmwJCXJlbG9jYXRlX2tlcm5lbAotCXJlbG9jYXRlX2tlcm5lbDoKK0VOVFJZKHJlbG9jYXRlX2tlcm5lbCkKIAkJYmFzcgklcjEzLDAJCSMgYmFzZSBhZGRyZXNzCiAJLmJhc2U6CiAJCXN0bnNtCXN5c19tc2stLmJhc2UoJXIxMyksMHhmYgkjIGRpc2FibGUgREFUCkBAIC0xMTUsNiArMTE2LDcgQEAKIAkJLmJ5dGUJMAogCQkuYWxpZ24JOAogCXJlbG9jYXRlX2tlcm5lbF9lbmQ6CisJLmFsaWduIDgKIAkuZ2xvYmwJcmVsb2NhdGVfa2VybmVsX2xlbgogCXJlbG9jYXRlX2tlcm5lbF9sZW46CiAJCS5xdWFkCXJlbG9jYXRlX2tlcm5lbF9lbmQgLSByZWxvY2F0ZV9rZXJuZWwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvczM5MF9rc3ltcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zMzkwX2tzeW1zLmMKaW5kZXggNjU2ZmNiYi4uNTdiNTM2NiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zMzkwX2tzeW1zLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zMzkwX2tzeW1zLmMKQEAgLTEsNiArMSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSA8YXNtL2Z0cmFjZS5oPgogCiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgogRVhQT1JUX1NZTUJPTChfbWNvdW50KTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0tWTSkgfHwgZGVmaW5lZChDT05GSUdfS1ZNX01PRFVMRSkKK0VYUE9SVF9TWU1CT0woc2llNjRhKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zY2xwLlMgYi9hcmNoL3MzOTAva2VybmVsL3NjbHAuUwppbmRleCAyZTgyZmRkLi45NTc5MmQ4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NjbHAuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3NjbHAuUwpAQCAtOCw2ICs4LDggQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKwogTENfRVhUX05FV19QU1cJCT0gMHg1OAkJCSMgYWRkciBvZiBleHQgaW50IGhhbmRsZXIKIExDX0VYVF9ORVdfUFNXXzY0CT0gMHgxYjAJCQkjIGFkZHIgb2YgZXh0IGludCBoYW5kbGVyIDY0IGJpdAogTENfRVhUX0lOVF9QQVJBTQk9IDB4ODAJCQkjIGFkZHIgb2YgZXh0IGludCBwYXJhbWV0ZXIKQEAgLTI2MCw4ICsyNjIsNyBAQAogIyAgIFIyCT0gMCBvbiBzdWNjZXNzLCAxIG9uIGZhaWx1cmUKICMKIAotCS5nbG9ibCBfc2NscF9wcmludF9lYXJseQotX3NjbHBfcHJpbnRfZWFybHk6CitFTlRSWShfc2NscF9wcmludF9lYXJseSkKIAlzdG0JJXI2LCVyMTUsMjQoJXIxNSkJCSMgc2F2ZSByZWdpc3RlcnMKIAlhaGkJJXIxNSwtOTYJCQkjIGNyZWF0ZSBzdGFjayBmcmFtZQogI2lmZGVmIENPTkZJR182NEJJVApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKaW5kZXggNTI0MjBkMi4uYTZkODVjMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAogCW1lbXNldCgmcGFybXMub3J2YWxzLCAwLCBzaXplb2YocGFybXMub3J2YWxzKSk7CiAJbWVtc2V0KCZwYXJtcy5hbmR2YWxzLCAweGZmLCBzaXplb2YocGFybXMuYW5kdmFscykpOwotCXBhcm1zLm9ydmFsc1tjcl0gPSAxIDw8IGJpdDsKKwlwYXJtcy5vcnZhbHNbY3JdID0gMVVMIDw8IGJpdDsKIAlvbl9lYWNoX2NwdShzbXBfY3RsX2JpdF9jYWxsYmFjaywgJnBhcm1zLCAxKTsKIH0KIEVYUE9SVF9TWU1CT0woc21wX2N0bF9zZXRfYml0KTsKQEAgLTI3Niw3ICsyNzYsNyBAQAogCiAJbWVtc2V0KCZwYXJtcy5vcnZhbHMsIDAsIHNpemVvZihwYXJtcy5vcnZhbHMpKTsKIAltZW1zZXQoJnBhcm1zLmFuZHZhbHMsIDB4ZmYsIHNpemVvZihwYXJtcy5hbmR2YWxzKSk7Ci0JcGFybXMuYW5kdmFsc1tjcl0gPSB+KDFMIDw8IGJpdCk7CisJcGFybXMuYW5kdmFsc1tjcl0gPSB+KDFVTCA8PCBiaXQpOwogCW9uX2VhY2hfY3B1KHNtcF9jdGxfYml0X2NhbGxiYWNrLCAmcGFybXMsIDEpOwogfQogRVhQT1JUX1NZTUJPTChzbXBfY3RsX2NsZWFyX2JpdCk7CkBAIC02NTQsNyArNjU0LDggQEAKIAkvKiBkaXNhYmxlIGFsbCBleHRlcm5hbCBpbnRlcnJ1cHRzICovCiAJY3JfcGFybXMub3J2YWxzWzBdID0gMDsKIAljcl9wYXJtcy5hbmR2YWxzWzBdID0gfigxIDw8IDE1IHwgMSA8PCAxNCB8IDEgPDwgMTMgfCAxIDw8IDExIHwKLQkJCQkxIDw8IDEwIHwgMSA8PAk5IHwgMSA8PCAgNiB8IDEgPDwgIDQpOworCQkJCTEgPDwgMTAgfCAxIDw8CTkgfCAxIDw8ICA2IHwgMSA8PCAgNSB8CisJCQkJMSA8PCAgNCk7CiAJLyogZGlzYWJsZSBhbGwgSS9PIGludGVycnVwdHMgKi8KIAljcl9wYXJtcy5vcnZhbHNbNl0gPSAwOwogCWNyX3Bhcm1zLmFuZHZhbHNbNl0gPSB+KDEgPDwgMzEgfCAxIDw8IDMwIHwgMSA8PCAyOSB8IDEgPDwgMjggfApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zd2l0Y2hfY3B1LlMgYi9hcmNoL3MzOTAva2VybmVsL3N3aXRjaF9jcHUuUwppbmRleCAyMDUzMGRkLi5iZmUwNzBiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3N3aXRjaF9jcHUuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3N3aXRjaF9jcHUuUwpAQCAtNSw2ICs1LDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKQEAgLTE2LDkgKzE3LDcgQEAKICMJICAgICAlcjYgLSBkZXN0aW5hdGlvbiBjcHUKIAogCS5zZWN0aW9uIC50ZXh0Ci0JLmFsaWduIDQKLQkuZ2xvYmwgc21wX3N3aXRjaF90b19jcHUKLXNtcF9zd2l0Y2hfdG9fY3B1OgorRU5UUlkoc21wX3N3aXRjaF90b19jcHUpCiAJc3RtCSVyNiwlcjE1LF9fU0ZfR1BSUyglcjE1KQogCWxyCSVyMSwlcjE1CiAJYWhpCSVyMTUsLVNUQUNLX0ZSQU1FX09WRVJIRUFECkBAIC0zMyw4ICszMiw3IEBACiAJYnJjCTIsMmIJCQkvKiBidXN5LCB0cnkgYWdhaW4gKi8KIDM6CWoJM2IKIAotCS5nbG9ibAlzbXBfcmVzdGFydF9jcHUKLXNtcF9yZXN0YXJ0X2NwdToKK0VOVFJZKHNtcF9yZXN0YXJ0X2NwdSkKIAliYXNyCSVyMTMsMAogMDoJbGEJJXIxLC5ncHJyZWdzX2FkZHItMGIoJXIxMykKIAlsCSVyMSwwKCVyMSkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3dpdGNoX2NwdTY0LlMgYi9hcmNoL3MzOTAva2VybmVsL3N3aXRjaF9jcHU2NC5TCmluZGV4IDViZTNmNDMuLmZjYzQyZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc3dpdGNoX2NwdTY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zd2l0Y2hfY3B1NjQuUwpAQCAtNSw2ICs1LDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKQEAgLTE2LDkgKzE3LDcgQEAKICMJICAgICAlcjYgLSBkZXN0aW5hdGlvbiBjcHUKIAogCS5zZWN0aW9uIC50ZXh0Ci0JLmFsaWduIDQKLQkuZ2xvYmwgc21wX3N3aXRjaF90b19jcHUKLXNtcF9zd2l0Y2hfdG9fY3B1OgorRU5UUlkoc21wX3N3aXRjaF90b19jcHUpCiAJc3RtZwklcjYsJXIxNSxfX1NGX0dQUlMoJXIxNSkKIAlsZ3IJJXIxLCVyMTUKIAlhZ2hpCSVyMTUsLVNUQUNLX0ZSQU1FX09WRVJIRUFECkBAIC0zMSw4ICszMCw3IEBACiAJYnJjCTIsMmIJCQkvKiBidXN5LCB0cnkgYWdhaW4gKi8KIDM6CWoJM2IKIAotCS5nbG9ibAlzbXBfcmVzdGFydF9jcHUKLXNtcF9yZXN0YXJ0X2NwdToKK0VOVFJZKHNtcF9yZXN0YXJ0X2NwdSkKIAlsYXJsCSVyMSwuZ3BycmVncwogCWxtZwklcjAsJXIxNSwwKCVyMSkKIDE6CXNpZ3AJJXIwLCVyNSxfX1NJR1BfU0VOU0UJLyogV2FpdCBmb3IgY2FsbGluZyBDUFUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3dzdXNwX2FzbTY0LlMgYi9hcmNoL3MzOTAva2VybmVsL3N3c3VzcF9hc202NC5TCmluZGV4IDFmMDY2ZTQuLjUxYmNkYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc3dzdXNwX2FzbTY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zd3N1c3BfYXNtNjQuUwpAQCAtNyw2ICs3LDcgQEAKICAqCSAgICAgIE1pY2hhZWwgSG9semhldSA8aG9semhldUBsaW51eC52bmV0LmlibS5jb20+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KQEAgLTIyLDkgKzIzLDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gcnVucyB3aXRoIGRpc2FibGVkIGludGVycnVwdHMuCiAgKi8KIAkuc2VjdGlvbiAudGV4dAotCS5hbGlnbgk0Ci0JLmdsb2JsIHN3c3VzcF9hcmNoX3N1c3BlbmQKLXN3c3VzcF9hcmNoX3N1c3BlbmQ6CitFTlRSWShzd3N1c3BfYXJjaF9zdXNwZW5kKQogCXN0bWcJJXI2LCVyMTUsX19TRl9HUFJTKCVyMTUpCiAJbGdyCSVyMSwlcjE1CiAJYWdoaQklcjE1LC1TVEFDS19GUkFNRV9PVkVSSEVBRApAQCAtMTEyLDggKzExMSw3IEBACiAgKiBUaGVuIHdlIHJldHVybiB0byB0aGUgZnVuY3Rpb24gdGhhdCBjYWxsZWQgc3dzdXNwX2FyY2hfc3VzcGVuZCgpLgogICogc3dzdXNwX2FyY2hfcmVzdW1lKCkgcnVucyB3aXRoIGRpc2FibGVkIGludGVycnVwdHMuCiAgKi8KLQkuZ2xvYmwgc3dzdXNwX2FyY2hfcmVzdW1lCi1zd3N1c3BfYXJjaF9yZXN1bWU6CitFTlRSWShzd3N1c3BfYXJjaF9yZXN1bWUpCiAJc3RtZwklcjYsJXIxNSxfX1NGX0dQUlMoJXIxNSkKIAlsZ3IJJXIxLCVyMTUKIAlhZ2hpCSVyMTUsLVNUQUNLX0ZSQU1FX09WRVJIRUFECmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKaW5kZXggYTY1ZDJlOC4uZTkzNzJjNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvdHJhY2Vob29rLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtNDMsMTQgKzQzLDEwIEBACiAjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CiAjaW5jbHVkZSAiZW50cnkuaCIKIAotcGdtX2NoZWNrX2hhbmRsZXJfdCAqcGdtX2NoZWNrX3RhYmxlWzEyOF07Cit2b2lkICgqcGdtX2NoZWNrX3RhYmxlWzEyOF0pKHN0cnVjdCBwdF9yZWdzICosIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogCiBpbnQgc2hvd191bmhhbmRsZWRfc2lnbmFsczsKIAotZXh0ZXJuIHBnbV9jaGVja19oYW5kbGVyX3QgZG9fcHJvdGVjdGlvbl9leGNlcHRpb247Ci1leHRlcm4gcGdtX2NoZWNrX2hhbmRsZXJfdCBkb19kYXRfZXhjZXB0aW9uOwotZXh0ZXJuIHBnbV9jaGVja19oYW5kbGVyX3QgZG9fYXNjZV9leGNlcHRpb247Ci0KICNkZWZpbmUgc3RhY2tfcG9pbnRlciAoeyB2b2lkICoqc3A7IGFzbSgibGEgJTAsMCgxNSkiIDogIj0mZCIgKHNwKSk7IHNwOyB9KQogCiAjaWZuZGVmIENPTkZJR182NEJJVApAQCAtMzI5LDEwICszMjUsMTcgQEAKIAogdm9pZCBfX2twcm9iZXMgZG9fcGVyX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJc2lnaW5mb190IGluZm87CisKIAlpZiAobm90aWZ5X2RpZShESUVfU1NURVAsICJzc3RlcCIsIHJlZ3MsIDAsIDAsIFNJR1RSQVApID09IE5PVElGWV9TVE9QKQogCQlyZXR1cm47Ci0JaWYgKHRyYWNlaG9va19jb25zaWRlcl9mYXRhbF9zaWduYWwoY3VycmVudCwgU0lHVFJBUCkpCi0JCWZvcmNlX3NpZyhTSUdUUkFQLCBjdXJyZW50KTsKKwlpZiAoIWN1cnJlbnQtPnB0cmFjZSkKKwkJcmV0dXJuOworCWluZm8uc2lfc2lnbm8gPSBTSUdUUkFQOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSA9IFRSQVBfSFdCS1BUOworCWluZm8uc2lfYWRkciA9ICh2b2lkICopIGN1cnJlbnQtPnRocmVhZC5wZXJfZXZlbnQuYWRkcmVzczsKKwlmb3JjZV9zaWdfaW5mbyhTSUdUUkFQLCAmaW5mbywgY3VycmVudCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRlZmF1bHRfdHJhcF9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIHBnbV9pbnRfY29kZSwKQEAgLTQyNSw5ICs0MjgsMTMgQEAKIAkJaWYgKGdldF91c2VyKCooKF9fdTE2ICopIG9wY29kZSksIChfX3UxNiBfX3VzZXIgKikgbG9jYXRpb24pKQogCQkJcmV0dXJuOwogCQlpZiAoKigoX191MTYgKikgb3Bjb2RlKSA9PSBTMzkwX0JSRUFLUE9JTlRfVTE2KSB7Ci0JCQlpZiAodHJhY2Vob29rX2NvbnNpZGVyX2ZhdGFsX3NpZ25hbChjdXJyZW50LCBTSUdUUkFQKSkKLQkJCQlmb3JjZV9zaWcoU0lHVFJBUCwgY3VycmVudCk7Ci0JCQllbHNlCisJCQlpZiAoY3VycmVudC0+cHRyYWNlKSB7CisJCQkJaW5mby5zaV9zaWdubyA9IFNJR1RSQVA7CisJCQkJaW5mby5zaV9lcnJubyA9IDA7CisJCQkJaW5mby5zaV9jb2RlID0gVFJBUF9CUktQVDsKKwkJCQlpbmZvLnNpX2FkZHIgPSBsb2NhdGlvbjsKKwkJCQlmb3JjZV9zaWdfaW5mbyhTSUdUUkFQLCAmaW5mbywgY3VycmVudCk7CisJCQl9IGVsc2UKIAkJCQlzaWduYWwgPSBTSUdJTEw7CiAjaWZkZWYgQ09ORklHX01BVEhFTVUKIAkJfSBlbHNlIGlmIChvcGNvZGVbMF0gPT0gMHhiMykgewpAQCAtNDg5LDkgKzQ5Niw4IEBACiAKIAogI2lmZGVmIENPTkZJR19NQVRIRU1VCi1hc21saW5rYWdlIHZvaWQgc3BlY2lmaWNhdGlvbl9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCWxvbmcgcGdtX2ludF9jb2RlLAotCQkJCQl1bnNpZ25lZCBsb25nIHRyYW5zX2V4Y19jb2RlKQordm9pZCBzcGVjaWZpY2F0aW9uX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBwZ21faW50X2NvZGUsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfZXhjX2NvZGUpCiB7CiAgICAgICAgIF9fdTggb3Bjb2RlWzZdOwogCV9fdTE2IF9fdXNlciAqbG9jYXRpb24gPSBOVUxMOwpAQCAtNjQ4LDcgKzY1NCw3IEBACiAJZG9fdHJhcChwZ21faW50X2NvZGUsIFNJR0lMTCwgInNwYWNlIHN3aXRjaCBldmVudCIsIHJlZ3MsICZpbmZvKTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIF9fa3Byb2JlcyBrZXJuZWxfc3RhY2tfb3ZlcmZsb3coc3RydWN0IHB0X3JlZ3MgKiByZWdzKQordm9pZCBfX2twcm9iZXMga2VybmVsX3N0YWNrX292ZXJmbG93KHN0cnVjdCBwdF9yZWdzICogcmVncykKIHsKIAlidXN0X3NwaW5sb2NrcygxKTsKIAlwcmludGsoIktlcm5lbCBzdGFjayBvdmVyZmxvdy5cbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9LY29uZmlnIGIvYXJjaC9zMzkwL2t2bS9LY29uZmlnCmluZGV4IGY2NmExYmQuLmEyMTYzNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vS2NvbmZpZworKysgYi9hcmNoL3MzOTAva3ZtL0tjb25maWcKQEAgLTM3LDYgKzM3LDUgQEAKICMgT0ssIGl0J3MgYSBsaXR0bGUgY291bnRlci1pbnR1aXRpdmUgdG8gZG8gdGhpcywgYnV0IGl0IHB1dHMgaXQgbmVhdGx5IHVuZGVyCiAjIHRoZSB2aXJ0dWFsaXphdGlvbiBtZW51Lgogc291cmNlIGRyaXZlcnMvdmhvc3QvS2NvbmZpZwotc291cmNlIGRyaXZlcnMvdmlydGlvL0tjb25maWcKIAogZW5kaWYgIyBWSVJUVUFMSVpBVElPTgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9NYWtlZmlsZSBiL2FyY2gvczM5MC9rdm0vTWFrZWZpbGUKaW5kZXggODYwZDI2NS4uMzk3NTcyMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAva3ZtL01ha2VmaWxlCkBAIC0xMCw1ICsxMCw1IEBACiAKIGNjZmxhZ3MteSA6PSAtSXZpcnQva3ZtIC1JYXJjaC9zMzkwL2t2bQogCi1rdm0tb2JqcyA6PSAkKGNvbW1vbi1vYmpzKSBrdm0tczM5MC5vIHNpZTY0YS5vIGludGVyY2VwdC5vIGludGVycnVwdC5vIHByaXYubyBzaWdwLm8gZGlhZy5vCitrdm0tb2JqcyA6PSAkKGNvbW1vbi1vYmpzKSBrdm0tczM5MC5vIGludGVyY2VwdC5vIGludGVycnVwdC5vIHByaXYubyBzaWdwLm8gZGlhZy5vCiBvYmotJChDT05GSUdfS1ZNKSArPSBrdm0ubwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9nYWNjZXNzLmggYi9hcmNoL3MzOTAva3ZtL2dhY2Nlc3MuaAppbmRleCAwM2M3MTZhLi5jODZmNmFlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2dhY2Nlc3MuaAorKysgYi9hcmNoL3MzOTAva3ZtL2dhY2Nlc3MuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBnYWNjZXNzLmggLSAgYWNjZXNzIGd1ZXN0IG1lbW9yeQorICogYWNjZXNzLmggLSAgYWNjZXNzIGd1ZXN0IG1lbW9yeQogICoKICAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwOCwyMDA5CiAgKgpAQCAtMjIsMjAgKzIyLDEzIEBACiAJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGd1ZXN0YWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIHByZWZpeCAgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+cHJlZml4OwotCXVuc2lnbmVkIGxvbmcgb3JpZ2luICA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nbXNvcjsKLQl1bnNpZ25lZCBsb25nIG1lbXNpemUgPSBrdm1fczM5MF92Y3B1X2dldF9tZW1zaXplKHZjcHUpOwogCiAJaWYgKGd1ZXN0YWRkciA8IDIgKiBQQUdFX1NJWkUpCiAJCWd1ZXN0YWRkciArPSBwcmVmaXg7CiAJZWxzZSBpZiAoKGd1ZXN0YWRkciA+PSBwcmVmaXgpICYmIChndWVzdGFkZHIgPCBwcmVmaXggKyAyICogUEFHRV9TSVpFKSkKIAkJZ3Vlc3RhZGRyIC09IHByZWZpeDsKIAotCWlmIChndWVzdGFkZHIgPiBtZW1zaXplKQotCQlyZXR1cm4gKHZvaWQgX191c2VyIF9fZm9yY2UgKikgRVJSX1BUUigtRUZBVUxUKTsKLQotCWd1ZXN0YWRkciArPSBvcmlnaW47Ci0KLQlyZXR1cm4gKHZvaWQgX191c2VyICopIGd1ZXN0YWRkcjsKKwlyZXR1cm4gKHZvaWQgX191c2VyICopIGdtYXBfZmF1bHQoZ3Vlc3RhZGRyLCB2Y3B1LT5hcmNoLmdtYXApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBnZXRfZ3Vlc3RfdTY0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBndWVzdGFkZHIsCkBAIC0xNDEsMTEgKzEzNCwxMSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBfX2NvcHlfdG9fZ3Vlc3Rfc2xvdyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZ3Vlc3RkZXN0LAotCQkJCSAgICAgICBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCisJCQkJICAgICAgIHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpbnQgcmM7CiAJdW5zaWduZWQgbG9uZyBpOwotCWNvbnN0IHU4ICpkYXRhID0gZnJvbTsKKwl1OCAqZGF0YSA9IGZyb207CiAKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCXJjID0gcHV0X2d1ZXN0X3U4KHZjcHUsIGd1ZXN0ZGVzdCsrLCAqKGRhdGErKykpOwpAQCAtMTU1LDEyICsxNDgsOTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgX19jb3B5X3RvX2d1ZXN0X2Zhc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGd1ZXN0ZGVzdCwKKwkJCQkgICAgICAgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCWludCByOworCXZvaWQgX191c2VyICp1cHRyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWlmIChndWVzdGRlc3QgKyBuIDwgZ3Vlc3RkZXN0KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIHNpbXBsZSBjYXNlOiBhbGwgd2l0aGluIG9uZSBzZWdtZW50IHRhYmxlIGVudHJ5PyAqLworCWlmICgoZ3Vlc3RkZXN0ICYgUE1EX01BU0spID09ICgoZ3Vlc3RkZXN0K24pICYgUE1EX01BU0spKSB7CisJCXVwdHIgPSAodm9pZCBfX3VzZXIgKikgZ21hcF9mYXVsdChndWVzdGRlc3QsIHZjcHUtPmFyY2guZ21hcCk7CisKKwkJaWYgKElTX0VSUigodm9pZCBfX2ZvcmNlICopIHVwdHIpKQorCQkJcmV0dXJuIFBUUl9FUlIoKHZvaWQgX19mb3JjZSAqKSB1cHRyKTsKKworCQlyID0gY29weV90b191c2VyKHVwdHIsIGZyb20sIG4pOworCisJCWlmIChyKQorCQkJciA9IC1FRkFVTFQ7CisKKwkJZ290byBvdXQ7CisJfQorCisJLyogY29weSBmaXJzdCBzZWdtZW50ICovCisJdXB0ciA9ICh2b2lkIF9fdXNlciAqKWdtYXBfZmF1bHQoZ3Vlc3RkZXN0LCB2Y3B1LT5hcmNoLmdtYXApOworCisJaWYgKElTX0VSUigodm9pZCBfX2ZvcmNlICopIHVwdHIpKQorCQlyZXR1cm4gUFRSX0VSUigodm9pZCBfX2ZvcmNlICopIHVwdHIpOworCisJc2l6ZSA9IFBNRF9TSVpFIC0gKGd1ZXN0ZGVzdCAmIH5QTURfTUFTSyk7CisKKwlyID0gY29weV90b191c2VyKHVwdHIsIGZyb20sIHNpemUpOworCisJaWYgKHIpIHsKKwkJciA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKwlmcm9tICs9IHNpemU7CisJbiAtPSBzaXplOworCWd1ZXN0ZGVzdCArPSBzaXplOworCisJLyogY29weSBmdWxsIHNlZ21lbnRzICovCisJd2hpbGUgKG4gPj0gUE1EX1NJWkUpIHsKKwkJdXB0ciA9ICh2b2lkIF9fdXNlciAqKWdtYXBfZmF1bHQoZ3Vlc3RkZXN0LCB2Y3B1LT5hcmNoLmdtYXApOworCisJCWlmIChJU19FUlIoKHZvaWQgX19mb3JjZSAqKSB1cHRyKSkKKwkJCXJldHVybiBQVFJfRVJSKCh2b2lkIF9fZm9yY2UgKikgdXB0cik7CisKKwkJciA9IGNvcHlfdG9fdXNlcih1cHRyLCBmcm9tLCBQTURfU0laRSk7CisKKwkJaWYgKHIpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJZnJvbSArPSBQTURfU0laRTsKKwkJbiAtPSBQTURfU0laRTsKKwkJZ3Vlc3RkZXN0ICs9IFBNRF9TSVpFOworCX0KKworCS8qIGNvcHkgdGhlIHRhaWwgc2VnbWVudCAqLworCWlmIChuKSB7CisJCXVwdHIgPSAodm9pZCBfX3VzZXIgKilnbWFwX2ZhdWx0KGd1ZXN0ZGVzdCwgdmNwdS0+YXJjaC5nbWFwKTsKKworCQlpZiAoSVNfRVJSKCh2b2lkIF9fZm9yY2UgKikgdXB0cikpCisJCQlyZXR1cm4gUFRSX0VSUigodm9pZCBfX2ZvcmNlICopIHVwdHIpOworCisJCXIgPSBjb3B5X3RvX3VzZXIodXB0ciwgZnJvbSwgbik7CisKKwkJaWYgKHIpCisJCQlyID0gLUVGQVVMVDsKKwl9CitvdXQ6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNvcHlfdG9fZ3Vlc3RfYWJzb2x1dGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCQkgdW5zaWduZWQgbG9uZyBndWVzdGRlc3QsCisJCQkJCSB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJcmV0dXJuIF9fY29weV90b19ndWVzdF9mYXN0KHZjcHUsIGd1ZXN0ZGVzdCwgZnJvbSwgbik7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGNvcHlfdG9fZ3Vlc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGd1ZXN0ZGVzdCwKLQkJCQljb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCisJCQkJdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCXVuc2lnbmVkIGxvbmcgcHJlZml4ICA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5wcmVmaXg7Ci0JdW5zaWduZWQgbG9uZyBvcmlnaW4gID0gdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdtc29yOwotCXVuc2lnbmVkIGxvbmcgbWVtc2l6ZSA9IGt2bV9zMzkwX3ZjcHVfZ2V0X21lbXNpemUodmNwdSk7CiAKIAlpZiAoKGd1ZXN0ZGVzdCA8IDIgKiBQQUdFX1NJWkUpICYmIChndWVzdGRlc3QgKyBuID4gMiAqIFBBR0VfU0laRSkpCiAJCWdvdG8gc2xvd3BhdGg7CkBAIC0xNzcsMTUgKzI1Myw3IEBACiAJZWxzZSBpZiAoKGd1ZXN0ZGVzdCA+PSBwcmVmaXgpICYmIChndWVzdGRlc3QgPCBwcmVmaXggKyAyICogUEFHRV9TSVpFKSkKIAkJZ3Vlc3RkZXN0IC09IHByZWZpeDsKIAotCWlmIChndWVzdGRlc3QgKyBuID4gbWVtc2l6ZSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoZ3Vlc3RkZXN0ICsgbiA8IGd1ZXN0ZGVzdCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlndWVzdGRlc3QgKz0gb3JpZ2luOwotCi0JcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgZ3Vlc3RkZXN0LCBmcm9tLCBuKTsKKwlyZXR1cm4gX19jb3B5X3RvX2d1ZXN0X2Zhc3QodmNwdSwgZ3Vlc3RkZXN0LCBmcm9tLCBuKTsKIHNsb3dwYXRoOgogCXJldHVybiBfX2NvcHlfdG9fZ3Vlc3Rfc2xvdyh2Y3B1LCBndWVzdGRlc3QsIGZyb20sIG4pOwogfQpAQCAtMjA2LDEyICsyNzQsOTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgX19jb3B5X2Zyb21fZ3Vlc3RfZmFzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHZvaWQgKnRvLAorCQkJCQkgdW5zaWduZWQgbG9uZyBndWVzdHNyYywKKwkJCQkJIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlpbnQgcjsKKwl2b2lkIF9fdXNlciAqdXB0cjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlpZiAoZ3Vlc3RzcmMgKyBuIDwgZ3Vlc3RzcmMpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogc2ltcGxlIGNhc2U6IGFsbCB3aXRoaW4gb25lIHNlZ21lbnQgdGFibGUgZW50cnk/ICovCisJaWYgKChndWVzdHNyYyAmIFBNRF9NQVNLKSA9PSAoKGd1ZXN0c3JjK24pICYgUE1EX01BU0spKSB7CisJCXVwdHIgPSAodm9pZCBfX3VzZXIgKikgZ21hcF9mYXVsdChndWVzdHNyYywgdmNwdS0+YXJjaC5nbWFwKTsKKworCQlpZiAoSVNfRVJSKCh2b2lkIF9fZm9yY2UgKikgdXB0cikpCisJCQlyZXR1cm4gUFRSX0VSUigodm9pZCBfX2ZvcmNlICopIHVwdHIpOworCisJCXIgPSBjb3B5X2Zyb21fdXNlcih0bywgdXB0ciwgbik7CisKKwkJaWYgKHIpCisJCQlyID0gLUVGQVVMVDsKKworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBjb3B5IGZpcnN0IHNlZ21lbnQgKi8KKwl1cHRyID0gKHZvaWQgX191c2VyICopZ21hcF9mYXVsdChndWVzdHNyYywgdmNwdS0+YXJjaC5nbWFwKTsKKworCWlmIChJU19FUlIoKHZvaWQgX19mb3JjZSAqKSB1cHRyKSkKKwkJcmV0dXJuIFBUUl9FUlIoKHZvaWQgX19mb3JjZSAqKSB1cHRyKTsKKworCXNpemUgPSBQTURfU0laRSAtIChndWVzdHNyYyAmIH5QTURfTUFTSyk7CisKKwlyID0gY29weV9mcm9tX3VzZXIodG8sIHVwdHIsIHNpemUpOworCisJaWYgKHIpIHsKKwkJciA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKwl0byArPSBzaXplOworCW4gLT0gc2l6ZTsKKwlndWVzdHNyYyArPSBzaXplOworCisJLyogY29weSBmdWxsIHNlZ21lbnRzICovCisJd2hpbGUgKG4gPj0gUE1EX1NJWkUpIHsKKwkJdXB0ciA9ICh2b2lkIF9fdXNlciAqKWdtYXBfZmF1bHQoZ3Vlc3RzcmMsIHZjcHUtPmFyY2guZ21hcCk7CisKKwkJaWYgKElTX0VSUigodm9pZCBfX2ZvcmNlICopIHVwdHIpKQorCQkJcmV0dXJuIFBUUl9FUlIoKHZvaWQgX19mb3JjZSAqKSB1cHRyKTsKKworCQlyID0gY29weV9mcm9tX3VzZXIodG8sIHVwdHIsIFBNRF9TSVpFKTsKKworCQlpZiAocikgeworCQkJciA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQl0byArPSBQTURfU0laRTsKKwkJbiAtPSBQTURfU0laRTsKKwkJZ3Vlc3RzcmMgKz0gUE1EX1NJWkU7CisJfQorCisJLyogY29weSB0aGUgdGFpbCBzZWdtZW50ICovCisJaWYgKG4pIHsKKwkJdXB0ciA9ICh2b2lkIF9fdXNlciAqKWdtYXBfZmF1bHQoZ3Vlc3RzcmMsIHZjcHUtPmFyY2guZ21hcCk7CisKKwkJaWYgKElTX0VSUigodm9pZCBfX2ZvcmNlICopIHVwdHIpKQorCQkJcmV0dXJuIFBUUl9FUlIoKHZvaWQgX19mb3JjZSAqKSB1cHRyKTsKKworCQlyID0gY29weV9mcm9tX3VzZXIodG8sIHVwdHIsIG4pOworCisJCWlmIChyKQorCQkJciA9IC1FRkFVTFQ7CisJfQorb3V0OgorCXJldHVybiByOworfQorCitzdGF0aWMgaW5saW5lIGludCBjb3B5X2Zyb21fZ3Vlc3RfYWJzb2x1dGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB2b2lkICp0bywKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBndWVzdHNyYywKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBuKQoreworCXJldHVybiBfX2NvcHlfZnJvbV9ndWVzdF9mYXN0KHZjcHUsIHRvLCBndWVzdHNyYywgbik7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGNvcHlfZnJvbV9ndWVzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHZvaWQgKnRvLAogCQkJCSAgdW5zaWduZWQgbG9uZyBndWVzdHNyYywgdW5zaWduZWQgbG9uZyBuKQogewogCXVuc2lnbmVkIGxvbmcgcHJlZml4ICA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5wcmVmaXg7Ci0JdW5zaWduZWQgbG9uZyBvcmlnaW4gID0gdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdtc29yOwotCXVuc2lnbmVkIGxvbmcgbWVtc2l6ZSA9IGt2bV9zMzkwX3ZjcHVfZ2V0X21lbXNpemUodmNwdSk7CiAKIAlpZiAoKGd1ZXN0c3JjIDwgMiAqIFBBR0VfU0laRSkgJiYgKGd1ZXN0c3JjICsgbiA+IDIgKiBQQUdFX1NJWkUpKQogCQlnb3RvIHNsb3dwYXRoOwpAQCAtMjI4LDUyICszNzksOCBAQAogCWVsc2UgaWYgKChndWVzdHNyYyA+PSBwcmVmaXgpICYmIChndWVzdHNyYyA8IHByZWZpeCArIDIgKiBQQUdFX1NJWkUpKQogCQlndWVzdHNyYyAtPSBwcmVmaXg7CiAKLQlpZiAoZ3Vlc3RzcmMgKyBuID4gbWVtc2l6ZSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoZ3Vlc3RzcmMgKyBuIDwgZ3Vlc3RzcmMpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JZ3Vlc3RzcmMgKz0gb3JpZ2luOwotCi0JcmV0dXJuIGNvcHlfZnJvbV91c2VyKHRvLCAodm9pZCBfX3VzZXIgKikgZ3Vlc3RzcmMsIG4pOworCXJldHVybiBfX2NvcHlfZnJvbV9ndWVzdF9mYXN0KHZjcHUsIHRvLCBndWVzdHNyYywgbik7CiBzbG93cGF0aDoKIAlyZXR1cm4gX19jb3B5X2Zyb21fZ3Vlc3Rfc2xvdyh2Y3B1LCB0bywgZ3Vlc3RzcmMsIG4pOwogfQotCi1zdGF0aWMgaW5saW5lIGludCBjb3B5X3RvX2d1ZXN0X2Fic29sdXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgZ3Vlc3RkZXN0LAotCQkJCQkgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQotewotCXVuc2lnbmVkIGxvbmcgb3JpZ2luICA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nbXNvcjsKLQl1bnNpZ25lZCBsb25nIG1lbXNpemUgPSBrdm1fczM5MF92Y3B1X2dldF9tZW1zaXplKHZjcHUpOwotCi0JaWYgKGd1ZXN0ZGVzdCArIG4gPiBtZW1zaXplKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChndWVzdGRlc3QgKyBuIDwgZ3Vlc3RkZXN0KQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWd1ZXN0ZGVzdCArPSBvcmlnaW47Ci0KLQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBndWVzdGRlc3QsIGZyb20sIG4pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjb3B5X2Zyb21fZ3Vlc3RfYWJzb2x1dGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB2b2lkICp0bywKLQkJCQkJICAgdW5zaWduZWQgbG9uZyBndWVzdHNyYywKLQkJCQkJICAgdW5zaWduZWQgbG9uZyBuKQotewotCXVuc2lnbmVkIGxvbmcgb3JpZ2luICA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nbXNvcjsKLQl1bnNpZ25lZCBsb25nIG1lbXNpemUgPSBrdm1fczM5MF92Y3B1X2dldF9tZW1zaXplKHZjcHUpOwotCi0JaWYgKGd1ZXN0c3JjICsgbiA+IG1lbXNpemUpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGd1ZXN0c3JjICsgbiA8IGd1ZXN0c3JjKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWd1ZXN0c3JjICs9IG9yaWdpbjsKLQotCXJldHVybiBjb3B5X2Zyb21fdXNlcih0bywgKHZvaWQgX191c2VyICopIGd1ZXN0c3JjLCBuKTsKLX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9pbnRlcmNlcHQuYyBiL2FyY2gvczM5MC9rdm0vaW50ZXJjZXB0LmMKaW5kZXggZjdiNmRmNC4uYzdjNTE4OSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9pbnRlcmNlcHQuYworKysgYi9hcmNoL3MzOTAva3ZtL2ludGVyY2VwdC5jCkBAIC0xMDUsNiArMTA1LDcgQEAKIAlbMHhhZV0gPSBrdm1fczM5MF9oYW5kbGVfc2lncCwKIAlbMHhiMl0gPSBrdm1fczM5MF9oYW5kbGVfYjIsCiAJWzB4YjddID0gaGFuZGxlX2xjdGwsCisJWzB4ZTVdID0ga3ZtX3MzOTBfaGFuZGxlX2U1LAogCVsweGViXSA9IGhhbmRsZV9sY3RsZywKIH07CiAKQEAgLTE1OSwyMiArMTYwLDQyIEBACiAKIHN0YXRpYyBpbnQgaGFuZGxlX3ZhbGlkaXR5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwl1bnNpZ25lZCBsb25nIHZtYWRkcjsKIAlpbnQgdml3aHkgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBiID4+IDE2OwogCWludCByYzsKIAogCXZjcHUtPnN0YXQuZXhpdF92YWxpZGl0eSsrOwotCWlmICgodml3aHkgPT0gMHgzNykgJiYgKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5wcmVmaXgKLQkJPD0ga3ZtX3MzOTBfdmNwdV9nZXRfbWVtc2l6ZSh2Y3B1KSAtIDIqUEFHRV9TSVpFKSkgewotCQlyYyA9IGZhdWx0X2luX3BhZ2VzX3dyaXRlYWJsZSgoY2hhciBfX3VzZXIgKikKLQkJCSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z21zb3IgKwotCQkJIHZjcHUtPmFyY2guc2llX2Jsb2NrLT5wcmVmaXgsCi0JCQkgMipQQUdFX1NJWkUpOwotCQlpZiAocmMpCisJaWYgKHZpd2h5ID09IDB4MzcpIHsKKwkJdm1hZGRyID0gZ21hcF9mYXVsdCh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+cHJlZml4LAorCQkJCSAgICB2Y3B1LT5hcmNoLmdtYXApOworCQlpZiAoSVNfRVJSX1ZBTFVFKHZtYWRkcikpIHsKKwkJCXJjID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyYyA9IGZhdWx0X2luX3BhZ2VzX3dyaXRlYWJsZSgoY2hhciBfX3VzZXIgKikgdm1hZGRyLAorCQkJIFBBR0VfU0laRSk7CisJCWlmIChyYykgewogCQkJLyogdXNlciB3aWxsIHJlY2VpdmUgc2lnc2VndiwgZXhpdCB0byB1c2VyICovCiAJCQlyYyA9IC1FT1BOT1RTVVBQOworCQkJZ290byBvdXQ7CisJCX0KKwkJdm1hZGRyID0gZ21hcF9mYXVsdCh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+cHJlZml4ICsgUEFHRV9TSVpFLAorCQkJCSAgICB2Y3B1LT5hcmNoLmdtYXApOworCQlpZiAoSVNfRVJSX1ZBTFVFKHZtYWRkcikpIHsKKwkJCXJjID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyYyA9IGZhdWx0X2luX3BhZ2VzX3dyaXRlYWJsZSgoY2hhciBfX3VzZXIgKikgdm1hZGRyLAorCQkJIFBBR0VfU0laRSk7CisJCWlmIChyYykgeworCQkJLyogdXNlciB3aWxsIHJlY2VpdmUgc2lnc2VndiwgZXhpdCB0byB1c2VyICovCisJCQlyYyA9IC1FT1BOT1RTVVBQOworCQkJZ290byBvdXQ7CisJCX0KIAl9IGVsc2UKIAkJcmMgPSAtRU9QTk9UU1VQUDsKIAorb3V0OgogCWlmIChyYykKIAkJVkNQVV9FVkVOVCh2Y3B1LCAyLCAidW5oYW5kbGVkIHZhbGlkaXR5IGludGVyY2VwdCBjb2RlICVkIiwKIAkJCSAgIHZpd2h5KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vaW50ZXJydXB0LmMgYi9hcmNoL3MzOTAva3ZtL2ludGVycnVwdC5jCmluZGV4IDM1YzIxYmYuLmM5YWViNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vaW50ZXJydXB0LmMKKysrIGIvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYwpAQCAtMTI4LDYgKzEyOCwxMCBAQAogCQlpZiAocmMgPT0gLUVGQVVMVCkKIAkJCWV4Y2VwdGlvbiA9IDE7CiAKKwkJcmMgPSBwdXRfZ3Vlc3RfdTE2KHZjcHUsIF9fTENfQ1BVX0FERFJFU1MsIGludGktPmVtZXJnLmNvZGUpOworCQlpZiAocmMgPT0gLUVGQVVMVCkKKwkJCWV4Y2VwdGlvbiA9IDE7CisKIAkJcmMgPSBjb3B5X3RvX2d1ZXN0KHZjcHUsIF9fTENfRVhUX09MRF9QU1csCiAJCQkgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LCBzaXplb2YocHN3X3QpKTsKIAkJaWYgKHJjID09IC1FRkFVTFQpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMgYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKaW5kZXggMzBjYTg1Yy4uZjE3Mjk2ZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCisrKyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYwpAQCAtNjIsNiArNjIsNyBAQAogCXsgImluc3RydWN0aW9uX2Noc2MiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fY2hzYykgfSwKIAl7ICJpbnN0cnVjdGlvbl9zdHNpIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3N0c2kpIH0sCiAJeyAiaW5zdHJ1Y3Rpb25fc3RmbCIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9zdGZsKSB9LAorCXsgImluc3RydWN0aW9uX3Rwcm90IiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3Rwcm90KSB9LAogCXsgImluc3RydWN0aW9uX3NpZ3Bfc2Vuc2UiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc2lncF9zZW5zZSkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zaWdwX2VtZXJnZW5jeSIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9zaWdwX2VtZXJnZW5jeSkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zaWdwX3N0b3AiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc2lncF9zdG9wKSB9LApAQCAtMTg5LDcgKzE5MCwxMyBAQAogCWRlYnVnX3JlZ2lzdGVyX3ZpZXcoa3ZtLT5hcmNoLmRiZiwgJmRlYnVnX3NwcmludGZfdmlldyk7CiAJVk1fRVZFTlQoa3ZtLCAzLCAiJXMiLCAidm0gY3JlYXRlZCIpOwogCisJa3ZtLT5hcmNoLmdtYXAgPSBnbWFwX2FsbG9jKGN1cnJlbnQtPm1tKTsKKwlpZiAoIWt2bS0+YXJjaC5nbWFwKQorCQlnb3RvIG91dF9ub2dtYXA7CisKIAlyZXR1cm4gMDsKK291dF9ub2dtYXA6CisJZGVidWdfdW5yZWdpc3Rlcihrdm0tPmFyY2guZGJmKTsKIG91dF9ub2RiZjoKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpKGt2bS0+YXJjaC5zY2EpKTsKIG91dF9lcnI6CkBAIC0yMzQsMTEgKzI0MSwxMyBAQAogCWt2bV9mcmVlX3ZjcHVzKGt2bSk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKShrdm0tPmFyY2guc2NhKSk7CiAJZGVidWdfdW5yZWdpc3Rlcihrdm0tPmFyY2guZGJmKTsKKwlnbWFwX2ZyZWUoa3ZtLT5hcmNoLmdtYXApOwogfQogCiAvKiBTZWN0aW9uOiB2Y3B1IHJlbGF0ZWQgKi8KIGludCBrdm1fYXJjaF92Y3B1X2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCXZjcHUtPmFyY2guZ21hcCA9IHZjcHUtPmt2bS0+YXJjaC5nbWFwOwogCXJldHVybiAwOwogfQogCkBAIC0yODQsOCArMjkzLDcgQEAKIAogaW50IGt2bV9hcmNoX3ZjcHVfc2V0dXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCWF0b21pY19zZXQoJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5jcHVmbGFncywgQ1BVU1RBVF9aQVJDSCk7Ci0Jc2V0X2JpdChLVk1fUkVRX01NVV9SRUxPQUQsICZ2Y3B1LT5yZXF1ZXN0cyk7CisJYXRvbWljX3NldCgmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmNwdWZsYWdzLCBDUFVTVEFUX1pBUkNIIHwgQ1BVU1RBVF9TTSk7CiAJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjYiAgID0gNjsKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNhICAgPSAweEMxMDAyMDAxVTsKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZmFjICAgPSAoaW50KSAobG9uZykgZmFjaWxpdGllczsKQEAgLTQ1Myw2ICs0NjEsNyBAQAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJa3ZtX2d1ZXN0X2VudGVyKCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOworCWdtYXBfZW5hYmxlKHZjcHUtPmFyY2guZ21hcCk7CiAJVkNQVV9FVkVOVCh2Y3B1LCA2LCAiZW50ZXJpbmcgc2llIGZsYWdzICV4IiwKIAkJICAgYXRvbWljX3JlYWQoJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5jcHVmbGFncykpOwogCWlmIChzaWU2NGEodmNwdS0+YXJjaC5zaWVfYmxvY2ssIHZjcHUtPmFyY2guZ3Vlc3RfZ3BycykpIHsKQEAgLTQ2MSw2ICs0NzAsNyBAQAogCX0KIAlWQ1BVX0VWRU5UKHZjcHUsIDYsICJleGl0IHNpZSBpY3B0Y29kZSAlZCIsCiAJCSAgIHZjcHUtPmFyY2guc2llX2Jsb2NrLT5pY3B0Y29kZSk7CisJZ21hcF9kaXNhYmxlKHZjcHUtPmFyY2guZ21hcCk7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlrdm1fZ3Vlc3RfZXhpdCgpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKQEAgLTQ3NCwxNyArNDg0LDYgQEAKIAlzaWdzZXRfdCBzaWdzYXZlZDsKIAogcmVydW5fdmNwdToKLQlpZiAodmNwdS0+cmVxdWVzdHMpCi0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS1ZNX1JFUV9NTVVfUkVMT0FELCAmdmNwdS0+cmVxdWVzdHMpKQotCQkJa3ZtX3MzOTBfdmNwdV9zZXRfbWVtKHZjcHUpOwotCi0JLyogdmVyaWZ5LCB0aGF0IG1lbW9yeSBoYXMgYmVlbiByZWdpc3RlcmVkICovCi0JaWYgKCF2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z21zbG0pIHsKLQkJdmNwdV9wdXQodmNwdSk7Ci0JCVZDUFVfRVZFTlQodmNwdSwgMywgIiVzIiwgIm5vIG1lbW9yeSByZWdpc3RlcmVkIHRvIHJ1biB2Y3B1Iik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWlmICh2Y3B1LT5zaWdzZXRfYWN0aXZlKQogCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnZjcHUtPnNpZ3NldCwgJnNpZ3NhdmVkKTsKIApAQCAtNTQ1LDcgKzU0NCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IF9fZ3Vlc3Rjb3B5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGd1ZXN0ZGVzdCwgY29uc3Qgdm9pZCAqZnJvbSwKK3N0YXRpYyBpbnQgX19ndWVzdGNvcHkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3Vlc3RkZXN0LCB2b2lkICpmcm9tLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBuLCBpbnQgcHJlZml4KQogewogCWlmIChwcmVmaXgpCkBAIC01NjIsNyArNTYxLDcgQEAKICAqLwogaW50IGt2bV9zMzkwX3ZjcHVfc3RvcmVfc3RhdHVzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewotCWNvbnN0IHVuc2lnbmVkIGNoYXIgYXJjaG1vZGUgPSAxOworCXVuc2lnbmVkIGNoYXIgYXJjaG1vZGUgPSAxOwogCWludCBwcmVmaXg7CiAKIAlpZiAoYWRkciA9PSBLVk1fUzM5MF9TVE9SRV9TVEFUVVNfTk9BRERSKSB7CkBAIC02ODAsMTAgKzY3OSwxMCBAQAogCWlmIChtZW0tPmd1ZXN0X3BoeXNfYWRkcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAobWVtLT51c2Vyc3BhY2VfYWRkciAmIChQQUdFX1NJWkUgLSAxKSkKKwlpZiAobWVtLT51c2Vyc3BhY2VfYWRkciAmIDB4ZmZmZmZ1bCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAobWVtLT5tZW1vcnlfc2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkKKwlpZiAobWVtLT5tZW1vcnlfc2l6ZSAmIDB4ZmZmZmZ1bCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIXVzZXJfYWxsb2MpCkBAIC02OTcsMTUgKzY5NiwxNCBAQAogCQkJCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3Qgb2xkLAogCQkJCWludCB1c2VyX2FsbG9jKQogewotCWludCBpOwotCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKwlpbnQgcmM7CiAKLQkvKiByZXF1ZXN0IHVwZGF0ZSBvZiBzaWUgY29udHJvbCBibG9jayBmb3IgYWxsIGF2YWlsYWJsZSB2Y3B1cyAqLwotCWt2bV9mb3JfZWFjaF92Y3B1KGksIHZjcHUsIGt2bSkgewotCQlpZiAodGVzdF9hbmRfc2V0X2JpdChLVk1fUkVRX01NVV9SRUxPQUQsICZ2Y3B1LT5yZXF1ZXN0cykpCi0JCQljb250aW51ZTsKLQkJa3ZtX3MzOTBfaW5qZWN0X3NpZ3Bfc3RvcCh2Y3B1LCBBQ1RJT05fUkVMT0FEVkNQVV9PTl9TVE9QKTsKLQl9CisKKwlyYyA9IGdtYXBfbWFwX3NlZ21lbnQoa3ZtLT5hcmNoLmdtYXAsIG1lbS0+dXNlcnNwYWNlX2FkZHIsCisJCW1lbS0+Z3Vlc3RfcGh5c19hZGRyLCBtZW0tPm1lbW9yeV9zaXplKTsKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImt2bS1zMzkwOiBmYWlsZWQgdG8gY29tbWl0IG1lbW9yeSByZWdpb25cbiIpOworCXJldHVybjsKIH0KIAogdm9pZCBrdm1fYXJjaF9mbHVzaF9zaGFkb3coc3RydWN0IGt2bSAqa3ZtKQpAQCAtNzMxLDYgKzcyOSw3IEBACiAJfQogCW1lbWNweShmYWNpbGl0aWVzLCBTMzkwX2xvd2NvcmUuc3RmbGVfZmFjX2xpc3QsIDE2KTsKIAlmYWNpbGl0aWVzWzBdICY9IDB4ZmYwMGZmZjNmNDdjMDAwMFVMTDsKKwlmYWNpbGl0aWVzWzFdICY9IDB4MjAxYzAwMDAwMDAwMDAwMFVMTDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oCmluZGV4IGE3Yjc1ODYuLjk5YjBiNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaAorKysgYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmgKQEAgLTU4LDM1ICs1OCw5IEBACiBpbnQga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTE2IGNvZGUpOwogaW50IGt2bV9zMzkwX2luamVjdF9zaWdwX3N0b3Aoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgYWN0aW9uKTsKIAotc3RhdGljIGlubGluZSBsb25nIGt2bV9zMzkwX3ZjcHVfZ2V0X21lbXNpemUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXJldHVybiB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z21zbG0KLQkJLSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z21zb3IKLQkJLSBWSVJUSU9ERVNDU1BBQ0UgKyAxdWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fczM5MF92Y3B1X3NldF9tZW0oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCWludCBpZHg7Ci0Jc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtOwotCXN0cnVjdCBrdm1fbWVtc2xvdHMgKm1lbXNsb3RzOwotCi0JaWR4ID0gc3JjdV9yZWFkX2xvY2soJnZjcHUtPmt2bS0+c3JjdSk7Ci0JbWVtc2xvdHMgPSBrdm1fbWVtc2xvdHModmNwdS0+a3ZtKTsKLQotCW1lbSA9ICZtZW1zbG90cy0+bWVtc2xvdHNbMF07Ci0KLQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z21zb3IgPSBtZW0tPnVzZXJzcGFjZV9hZGRyOwotCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5nbXNsbSA9Ci0JCW1lbS0+dXNlcnNwYWNlX2FkZHIgKwotCQkobWVtLT5ucGFnZXMgPDwgUEFHRV9TSElGVCkgKwotCQlWSVJUSU9ERVNDU1BBQ0UgLSAxdWw7Ci0KLQlzcmN1X3JlYWRfdW5sb2NrKCZ2Y3B1LT5rdm0tPnNyY3UsIGlkeCk7Ci19Ci0KIC8qIGltcGxlbWVudGVkIGluIHByaXYuYyAqLwogaW50IGt2bV9zMzkwX2hhbmRsZV9iMihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworaW50IGt2bV9zMzkwX2hhbmRsZV9lNShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiAvKiBpbXBsZW1lbnRlZCBpbiBzaWdwLmMgKi8KIGludCBrdm1fczM5MF9oYW5kbGVfc2lncChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9wcml2LmMgYi9hcmNoL3MzOTAva3ZtL3ByaXYuYwppbmRleCA3M2M0N2JkLi4zOTE2MjYzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL3ByaXYuYworKysgYi9hcmNoL3MzOTAva3ZtL3ByaXYuYwpAQCAtMzI2LDMgKzMyNiw1MiBAQAogCX0KIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3Rwcm90KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpbnQgYmFzZTEgPSAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmlwYiAmIDB4ZjAwMDAwMDApID4+IDI4OworCWludCBkaXNwMSA9ICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBiICYgMHgwZmZmMDAwMCkgPj4gMTY7CisJaW50IGJhc2UyID0gKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5pcGIgJiAweGYwMDApID4+IDEyOworCWludCBkaXNwMiA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5pcGIgJiAweDBmZmY7CisJdTY0IGFkZHJlc3MxID0gZGlzcDEgKyBiYXNlMSA/IHZjcHUtPmFyY2guZ3Vlc3RfZ3Byc1tiYXNlMV0gOiAwOworCXU2NCBhZGRyZXNzMiA9IGRpc3AyICsgYmFzZTIgPyB2Y3B1LT5hcmNoLmd1ZXN0X2dwcnNbYmFzZTJdIDogMDsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKworCXZjcHUtPnN0YXQuaW5zdHJ1Y3Rpb25fdHByb3QrKzsKKworCS8qIHdlIG9ubHkgaGFuZGxlIHRoZSBMaW51eCBtZW1vcnkgZGV0ZWN0aW9uIGNhc2U6CisJICogYWNjZXNzIGtleSA9PSAwCisJICogZ3Vlc3QgREFUID09IG9mZgorCSAqIGV2ZXJ5dGhpbmcgZWxzZSBnb2VzIHRvIHVzZXJzcGFjZS4gKi8KKwlpZiAoYWRkcmVzczIgJiAweGYwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3Lm1hc2sgJiBQU1dfTUFTS19EQVQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCisJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXZtYSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLAorCQkJKHVuc2lnbmVkIGxvbmcpIF9fZ3Vlc3RhZGRyX3RvX3VzZXIodmNwdSwgYWRkcmVzczEpKTsKKwlpZiAoIXZtYSkgeworCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9BRERSRVNTSU5HKTsKKwl9CisKKwl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdy5tYXNrICY9IH4oM3VsIDw8IDQ0KTsKKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpICYmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkpCisJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3Lm1hc2sgfD0gKDF1bCA8PCA0NCk7CisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSAmJiAhKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSkKKwkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3cubWFzayB8PSAoMnVsIDw8IDQ0KTsKKworCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBrdm1fczM5MF9oYW5kbGVfZTUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCS8qIEZvciBlNXh4Li4uIGluc3RydWN0aW9ucyB3ZSBvbmx5IGhhbmRsZSBUUFJPVCAqLworCWlmICgodmNwdS0+YXJjaC5zaWVfYmxvY2stPmlwYSAmIDB4MDBmZikgPT0gMHgwMSkKKwkJcmV0dXJuIGhhbmRsZV90cHJvdCh2Y3B1KTsKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vc2llNjRhLlMgYi9hcmNoL3MzOTAva3ZtL3NpZTY0YS5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjBlMDQxLi4wMDAwMDAwCi0tLSBhL2FyY2gvczM5MC9rdm0vc2llNjRhLlMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogc2llNjRhLlMgLSBsb3cgbGV2ZWwgc2llIGNhbGwKLSAqCi0gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDgsMjAxMAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICh2ZXJzaW9uIDIgb25seSkKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqICAgIEF1dGhvcihzKTogSGVpa28gQ2Fyc3RlbnMgPGhlaWtvLmNhcnN0ZW5zQGRlLmlibS5jb20+Ci0gKgkJIENocmlzdGlhbiBFaHJoYXJkdCA8ZWhyaGFyZHRAbGludXgudm5ldC5pYm0uY29tPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLQotX1RJRl9FWElUX1NJRSA9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05FRURfUkVTQ0hFRCB8IF9USUZfTUNDS19QRU5ESU5HKQotCi0vKgotICogb2Zmc2V0cyBpbnRvIHN0YWNrZnJhbWUKLSAqIFNQXwk9IG9mZnNldHMgaW50byBzdGFjayBzaWU2NCBpcyBjYWxsZWQgd2l0aAotICogU1BJXyA9IG9mZnNldHMgaW50byBpcnEgc3RhY2sKLSAqLwotU1BfR1JFR1MgPSBfX1NGX0VNUFRZCi1TUF9IT09LICA9IF9fU0ZfRU1QVFkrOAotU1BfR1BQCSA9IF9fU0ZfRU1QVFkrMTYKLVNQSV9QU1cgID0gU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX1BTVwotCi0KLQkubWFjcm8gU1BQIG5ld3BwCi0JdG0JX19MQ19NQUNISU5FX0ZMQUdTKzYsMHgyMAkjIE1BQ0hJTkVfRkxBR19TUFAKLQlqegkwZgotCS5pbnNuCXMsMHhiMjgwMDAwMCxcbmV3cHAKLTA6Ci0JLmVuZG0KLQotc2llX2lycV9oYW5kbGVyOgotCVNQUAlfX0xDX0NNRl9IUFAJCQkjIHNldCBob3N0IGlkCi0JbGFybAklcjIsc2llX2luc3QKLQljbGcJJXIyLFNQSV9QU1crOCgwLCVyMTUpCQkjIGludGVyY2VwdGVkIHNpZQotCWpuZQkxZgotCXhjCV9fTENfU0lFX0hPT0soOCksX19MQ19TSUVfSE9PSwotCWxnCSVyMixfX0xDX1RIUkVBRF9JTkZPCQkjIHBvaW50ZXIgdGhyZWFkX2luZm8gc3RydWN0Ci0JdG0JX19USV9mbGFncys3KCVyMiksX1RJRl9FWElUX1NJRQotCWp6CTBmCi0JbGFybAklcjIsc2llX2V4aXQJCQkjIHdvcmsgcGVuZGluZywgbGVhdmUgc2llCi0Jc3RnCSVyMixTUElfUFNXKzgoMCwlcjE1KQotCWJyCSVyMTQKLTA6CWxhcmwJJXIyLHNpZV9yZWVudGVyCQkJIyByZS1lbnRlciB3aXRoIGd1ZXN0IGlkCi0Jc3RnCSVyMixTUElfUFNXKzgoMCwlcjE1KQotMToJYnIJJXIxNAotCi0vKgotICogc2llNjRhIGNhbGxpbmcgY29udmVudGlvbjoKLSAqICVyMiBwb2ludGVyIHRvIHNpZSBjb250cm9sIGJsb2NrCi0gKiAlcjMgZ3Vlc3QgcmVnaXN0ZXIgc2F2ZSBhcmVhCi0gKi8KLQkuZ2xvYmwJc2llNjRhCi1zaWU2NGE6Ci0Jc3RnCSVyMyxTUF9HUkVHUyglcjE1KQkJIyBzYXZlIGd1ZXN0IHJlZ2lzdGVyIHNhdmUgYXJlYQotCXN0bWcJJXI2LCVyMTQsX19TRl9HUFJTKCVyMTUpCSMgc2F2ZSByZWdpc3RlcnMgb24gZW50cnkKLQlsZ3IJJXIxNCwlcjIJCQkjIHBvaW50ZXIgdG8gc2llIGNvbnRyb2wgYmxvY2sKLQlsYXJsCSVyNSxzaWVfaXJxX2hhbmRsZXIKLQlzdGcJJXIyLFNQX0dQUCglcjE1KQotCXN0ZwklcjUsU1BfSE9PSyglcjE1KQkJIyBzYXZlIGhvb2sgdGFyZ2V0Ci0JbG1nCSVyMCwlcjEzLDAoJXIzKQkJCSMgbG9hZCBndWVzdCBncHJzIDAtMTMKLXNpZV9yZWVudGVyOgotCW12YwlfX0xDX1NJRV9IT09LKDgpLFNQX0hPT0soJXIxNSkKLQlTUFAJU1BfR1BQKCVyMTUpCQkJIyBzZXQgZ3Vlc3QgaWQKLXNpZV9pbnN0OgotCXNpZQkwKCVyMTQpCi0JeGMJX19MQ19TSUVfSE9PSyg4KSxfX0xDX1NJRV9IT09LCi0JU1BQCV9fTENfQ01GX0hQUAkJCSMgc2V0IGhvc3QgaWQKLXNpZV9leGl0OgotCWxnCSVyMTQsU1BfR1JFR1MoJXIxNSkKLQlzdG1nCSVyMCwlcjEzLDAoJXIxNCkJCSMgc2F2ZSBndWVzdCBncHJzIDAtMTMKLQlsZ2hpCSVyMiwwCi0JbG1nCSVyNiwlcjE0LF9fU0ZfR1BSUyglcjE1KQotCWJyCSVyMTQKLQotc2llX2VycjoKLQl4YwlfX0xDX1NJRV9IT09LKDgpLF9fTENfU0lFX0hPT0sKLQlTUFAJX19MQ19DTUZfSFBQCQkJIyBzZXQgaG9zdCBpZAotCWxnCSVyMTQsU1BfR1JFR1MoJXIxNSkKLQlzdG1nCSVyMCwlcjEzLDAoJXIxNCkJCSMgc2F2ZSBndWVzdCBncHJzIDAtMTMKLQlsZ2hpCSVyMiwtRUZBVUxUCi0JbG1nCSVyNiwlcjE0LF9fU0ZfR1BSUyglcjE1KQotCWJyCSVyMTQKLQotCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCi0JLnF1YWQJc2llX2luc3Qsc2llX2VycgotCS5wcmV2aW91cwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9zaWdwLmMgYi9hcmNoL3MzOTAva3ZtL3NpZ3AuYwppbmRleCA3MDIyNzZmLi5kNmE1MGMxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL3NpZ3AuYworKysgYi9hcmNoL3MzOTAva3ZtL3NpZ3AuYwpAQCAtMTg5LDEwICsxODksOCBAQAogCiAJLyogbWFrZSBzdXJlIHRoYXQgdGhlIG5ldyB2YWx1ZSBpcyB2YWxpZCBtZW1vcnkgKi8KIAlhZGRyZXNzID0gYWRkcmVzcyAmIDB4N2ZmZmUwMDB1OwotCWlmICgoY29weV9mcm9tX3VzZXIoJnRtcCwgKHZvaWQgX191c2VyICopCi0JCShhZGRyZXNzICsgdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdtc29yKSAsIDEpKSB8fAotCSAgIChjb3B5X2Zyb21fdXNlcigmdG1wLCAodm9pZCBfX3VzZXIgKikoYWRkcmVzcyArCi0JCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z21zb3IgKyBQQUdFX1NJWkUpLCAxKSkpIHsKKwlpZiAoY29weV9mcm9tX2d1ZXN0X2Fic29sdXRlKHZjcHUsICZ0bXAsIGFkZHJlc3MsIDEpIHx8CisJICAgY29weV9mcm9tX2d1ZXN0X2Fic29sdXRlKHZjcHUsICZ0bXAsIGFkZHJlc3MgKyBQQUdFX1NJWkUsIDEpKSB7CiAJCSpyZWcgfD0gU0lHUF9TVEFUX0lOVkFMSURfUEFSQU1FVEVSOwogCQlyZXR1cm4gMTsgLyogaW52YWxpZCBwYXJhbWV0ZXIgKi8KIAl9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL3Fybm5kLlMgYi9hcmNoL3MzOTAvbGliL3Fybm5kLlMKaW5kZXggZWIxZGY2My4uZDMyMTMyOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi9xcm5uZC5TCisrKyBiL2FyY2gvczM5MC9saWIvcXJubmQuUwpAQCAtMSw1ICsxLDcgQEAKICMgUy8zOTAgX191ZGl2X3Fybm5kCiAKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKICMgcjIgOiAmX19yCiAjIHIzIDogdXBwZXIgaGFsZiBvZiA2NCBiaXQgd29yZCBuCiAjIHI0IDogbG93ZXIgaGFsZiBvZiA2NCBiaXQgd29yZCBuCkBAIC04LDggKzEwLDcgQEAKICMgdGhlIHF1b3RpZW50IHEgaXMgdG8gYmUgcmV0dXJuZWQKIAogCS50ZXh0Ci0JLmdsb2JsIF9fdWRpdl9xcm5uZAotX191ZGl2X3Fybm5kOgorRU5UUlkoX191ZGl2X3Fybm5kKQogCXN0ICAgICVyMiwyNCglcjE1KQkgICMgc3RvcmUgcG9pbnRlciB0byByZW1pbmRlciBmb3IgbGF0ZXIKIAlsciAgICAlcjAsJXIzCQkgICMgcmVsb2FkIG4KIAlsciAgICAlcjEsJXI0CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vZmF1bHQuYyBiL2FyY2gvczM5MC9tbS9mYXVsdC5jCmluZGV4IGZlMTAzZTguLjk1NjRmYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvczM5MC9tbS9mYXVsdC5jCkBAIC0yOTksMTMgKzI5OSwyOCBAQAogCQlnb3RvIG91dDsKIAogCWFkZHJlc3MgPSB0cmFuc19leGNfY29kZSAmIF9fRkFJTF9BRERSX01BU0s7Ci0JcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTLCAxLCAwLCByZWdzLCBhZGRyZXNzKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMsIDEsIHJlZ3MsIGFkZHJlc3MpOwogCWZsYWdzID0gRkFVTFRfRkxBR19BTExPV19SRVRSWTsKIAlpZiAoYWNjZXNzID09IFZNX1dSSVRFIHx8ICh0cmFuc19leGNfY29kZSAmIHN0b3JlX2luZGljYXRpb24pID09IDB4NDAwKQogCQlmbGFncyB8PSBGQVVMVF9GTEFHX1dSSVRFOwotcmV0cnk6CiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCisjaWZkZWYgQ09ORklHX1BHU1RFCisJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKGN1cnJlbnQsIFRJRl9TSUUpICYmIFMzOTBfbG93Y29yZS5nbWFwKSB7CisJCWFkZHJlc3MgPSBnbWFwX2ZhdWx0KGFkZHJlc3MsCisJCQkJICAgICAoc3RydWN0IGdtYXAgKikgUzM5MF9sb3djb3JlLmdtYXApOworCQlpZiAoYWRkcmVzcyA9PSAtRUZBVUxUKSB7CisJCQlmYXVsdCA9IFZNX0ZBVUxUX0JBRE1BUDsKKwkJCWdvdG8gb3V0X3VwOworCQl9CisJCWlmIChhZGRyZXNzID09IC1FTk9NRU0pIHsKKwkJCWZhdWx0ID0gVk1fRkFVTFRfT09NOworCQkJZ290byBvdXRfdXA7CisJCX0KKwl9CisjZW5kaWYKKworcmV0cnk6CiAJZmF1bHQgPSBWTV9GQVVMVF9CQURNQVA7CiAJdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOwogCWlmICghdm1hKQpAQCAtMzQ1LDE3ICszNjAsMTggQEAKIAlpZiAoZmxhZ3MgJiBGQVVMVF9GTEFHX0FMTE9XX1JFVFJZKSB7CiAJCWlmIChmYXVsdCAmIFZNX0ZBVUxUX01BSk9SKSB7CiAJCQl0c2stPm1hal9mbHQrKzsKLQkJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NQUosIDEsIDAsCisJCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKLCAxLAogCQkJCSAgICAgIHJlZ3MsIGFkZHJlc3MpOwogCQl9IGVsc2UgewogCQkJdHNrLT5taW5fZmx0Kys7Ci0JCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUlOLCAxLCAwLAorCQkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTiwgMSwKIAkJCQkgICAgICByZWdzLCBhZGRyZXNzKTsKIAkJfQogCQlpZiAoZmF1bHQgJiBWTV9GQVVMVF9SRVRSWSkgewogCQkJLyogQ2xlYXIgRkFVTFRfRkxBR19BTExPV19SRVRSWSB0byBhdm9pZCBhbnkgcmlzawogCQkJICogb2Ygc3RhcnZhdGlvbi4gKi8KIAkJCWZsYWdzICY9IH5GQVVMVF9GTEFHX0FMTE9XX1JFVFJZOworCQkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCQkJZ290byByZXRyeTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9zMzkwL21tL2h1Z2V0bGJwYWdlLmMKaW5kZXggYTRkODU2ZC4uNTk3YmIyZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9zMzkwL21tL2h1Z2V0bGJwYWdlLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAlpZiAoTUFDSElORV9IQVNfSFBBR0UpCiAJCXJldHVybiAwOwogCi0JcHRlcCA9IChwdGVfdCAqKSBwdGVfYWxsb2Nfb25lKCZpbml0X21tLCBhZGRyZXNzKTsKKwlwdGVwID0gKHB0ZV90ICopIHB0ZV9hbGxvY19vbmUoJmluaXRfbW0sIGFkZHIpOwogCWlmICghcHRlcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCmluZGV4IGIwOTc2M2YuLjJhZGIyMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3F1aWNrbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0yNCw5NCArMjUsMTIgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KIAotc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCB7Ci0Jc3RydWN0IHJjdV9oZWFkIHJjdTsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKLQl1bnNpZ25lZCBpbnQgcGd0X2luZGV4OwotCXVuc2lnbmVkIGludCBjcnN0X2luZGV4OwotCXVuc2lnbmVkIGxvbmcgKnRhYmxlWzBdOwotfTsKLQotI2RlZmluZSBSQ1VfRlJFRUxJU1RfU0laRSBcCi0JKChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCkpIFwKLQkgIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCAqLCByY3VfdGFibGVfZnJlZWxpc3QpOwotCi1zdGF0aWMgdm9pZCBfX3BhZ2VfdGFibGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyAqdGFibGUpOwotCi1zdGF0aWMgc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCAqcmN1X3RhYmxlX2ZyZWVsaXN0X2dldChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLQlzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICoqYmF0Y2hwID0gJl9fZ2V0X2NwdV92YXIocmN1X3RhYmxlX2ZyZWVsaXN0KTsKLQlzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICpiYXRjaCA9ICpiYXRjaHA7Ci0KLQlpZiAoYmF0Y2gpCi0JCXJldHVybiBiYXRjaDsKLQliYXRjaCA9IChzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKLQlpZiAoYmF0Y2gpIHsKLQkJYmF0Y2gtPm1tID0gbW07Ci0JCWJhdGNoLT5wZ3RfaW5kZXggPSAwOwotCQliYXRjaC0+Y3JzdF9pbmRleCA9IFJDVV9GUkVFTElTVF9TSVpFOwotCQkqYmF0Y2hwID0gYmF0Y2g7Ci0JfQotCXJldHVybiBiYXRjaDsKLX0KLQotc3RhdGljIHZvaWQgcmN1X3RhYmxlX2ZyZWVsaXN0X2NhbGxiYWNrKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICpiYXRjaCA9Ci0JCWNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0LCByY3UpOwotCi0Jd2hpbGUgKGJhdGNoLT5wZ3RfaW5kZXggPiAwKQotCQlfX3BhZ2VfdGFibGVfZnJlZShiYXRjaC0+bW0sIGJhdGNoLT50YWJsZVstLWJhdGNoLT5wZ3RfaW5kZXhdKTsKLQl3aGlsZSAoYmF0Y2gtPmNyc3RfaW5kZXggPCBSQ1VfRlJFRUxJU1RfU0laRSkKLQkJY3JzdF90YWJsZV9mcmVlKGJhdGNoLT5tbSwgYmF0Y2gtPnRhYmxlW2JhdGNoLT5jcnN0X2luZGV4KytdKTsKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJhdGNoKTsKLX0KLQotdm9pZCByY3VfdGFibGVfZnJlZWxpc3RfZmluaXNoKHZvaWQpCi17Ci0Jc3RydWN0IHJjdV90YWJsZV9mcmVlbGlzdCAqKmJhdGNocCA9ICZnZXRfY3B1X3ZhcihyY3VfdGFibGVfZnJlZWxpc3QpOwotCXN0cnVjdCByY3VfdGFibGVfZnJlZWxpc3QgKmJhdGNoID0gKmJhdGNocDsKLQotCWlmICghYmF0Y2gpCi0JCWdvdG8gb3V0OwotCWNhbGxfcmN1KCZiYXRjaC0+cmN1LCByY3VfdGFibGVfZnJlZWxpc3RfY2FsbGJhY2spOwotCSpiYXRjaHAgPSBOVUxMOwotb3V0OgotCXB1dF9jcHVfdmFyKHJjdV90YWJsZV9mcmVlbGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNtcF9zeW5jKHZvaWQgKmFyZykKLXsKLX0KLQogI2lmbmRlZiBDT05GSUdfNjRCSVQKICNkZWZpbmUgQUxMT0NfT1JERVIJMQotI2RlZmluZSBUQUJMRVNfUEVSX1BBR0UJNAotI2RlZmluZSBGUkFHX01BU0sJMTVVTAotI2RlZmluZSBTRUNPTkRfSEFMVkVTCTEwVUwKLQotdm9pZCBjbGVhcl90YWJsZV9wZ3N0ZXModW5zaWduZWQgbG9uZyAqdGFibGUpCi17Ci0JY2xlYXJfdGFibGUodGFibGUsIF9QQUdFX1RZUEVfRU1QVFksIFBBR0VfU0laRS80KTsKLQltZW1zZXQodGFibGUgKyAyNTYsIDAsIFBBR0VfU0laRS80KTsKLQljbGVhcl90YWJsZSh0YWJsZSArIDUxMiwgX1BBR0VfVFlQRV9FTVBUWSwgUEFHRV9TSVpFLzQpOwotCW1lbXNldCh0YWJsZSArIDc2OCwgMCwgUEFHRV9TSVpFLzQpOwotfQotCisjZGVmaW5lIEZSQUdfTUFTSwkweDBmCiAjZWxzZQogI2RlZmluZSBBTExPQ19PUkRFUgkyCi0jZGVmaW5lIFRBQkxFU19QRVJfUEFHRQkyCi0jZGVmaW5lIEZSQUdfTUFTSwkzVUwKLSNkZWZpbmUgU0VDT05EX0hBTFZFUwkyVUwKLQotdm9pZCBjbGVhcl90YWJsZV9wZ3N0ZXModW5zaWduZWQgbG9uZyAqdGFibGUpCi17Ci0JY2xlYXJfdGFibGUodGFibGUsIF9QQUdFX1RZUEVfRU1QVFksIFBBR0VfU0laRS8yKTsKLQltZW1zZXQodGFibGUgKyAyNTYsIDAsIFBBR0VfU0laRS8yKTsKLX0KLQorI2RlZmluZSBGUkFHX01BU0sJMHgwMwogI2VuZGlmCiAKIHVuc2lnbmVkIGxvbmcgVk1BTExPQ19TVEFSVCA9IFZNQUxMT0NfRU5EIC0gVk1BTExPQ19TSVpFOwpAQCAtMTQwLDI5ICs1OSw2IEBACiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdGFibGUsIEFMTE9DX09SREVSKTsKIH0KIAotdm9pZCBjcnN0X3RhYmxlX2ZyZWVfcmN1KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nICp0YWJsZSkKLXsKLQlzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICpiYXRjaDsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmIChhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA8IDIgJiYKLQkgICAgY3B1bWFza19lcXVhbChtbV9jcHVtYXNrKG1tKSwgY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpKSkgewotCQljcnN0X3RhYmxlX2ZyZWUobW0sIHRhYmxlKTsKLQkJZ290byBvdXQ7Ci0JfQotCWJhdGNoID0gcmN1X3RhYmxlX2ZyZWVsaXN0X2dldChtbSk7Ci0JaWYgKCFiYXRjaCkgewotCQlzbXBfY2FsbF9mdW5jdGlvbihzbXBfc3luYywgTlVMTCwgMSk7Ci0JCWNyc3RfdGFibGVfZnJlZShtbSwgdGFibGUpOwotCQlnb3RvIG91dDsKLQl9Ci0JYmF0Y2gtPnRhYmxlWy0tYmF0Y2gtPmNyc3RfaW5kZXhdID0gdGFibGU7Ci0JaWYgKGJhdGNoLT5wZ3RfaW5kZXggPj0gYmF0Y2gtPmNyc3RfaW5kZXgpCi0JCXJjdV90YWJsZV9mcmVlbGlzdF9maW5pc2goKTsKLW91dDoKLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotCiAjaWZkZWYgQ09ORklHXzY0QklUCiBpbnQgY3JzdF90YWJsZV91cGdyYWRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGxpbWl0KQogewpAQCAtMjM4LDEyNCArMTM0LDU0OSBAQAogfQogI2VuZGlmCiAKLS8qCi0gKiBwYWdlIHRhYmxlIGVudHJ5IGFsbG9jYXRpb24vZnJlZSByb3V0aW5lcy4KKyNpZmRlZiBDT05GSUdfUEdTVEUKKworLyoqCisgKiBnbWFwX2FsbG9jIC0gYWxsb2NhdGUgYSBndWVzdCBhZGRyZXNzIHNwYWNlCisgKiBAbW06IHBvaW50ZXIgdG8gdGhlIHBhcmVudCBtbV9zdHJ1Y3QKKyAqCisgKiBSZXR1cm5zIGEgZ3Vlc3QgYWRkcmVzcyBzcGFjZSBzdHJ1Y3R1cmUuCiAgKi8KLXVuc2lnbmVkIGxvbmcgKnBhZ2VfdGFibGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCitzdHJ1Y3QgZ21hcCAqZ21hcF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgZ21hcCAqZ21hcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nICp0YWJsZTsKKworCWdtYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ21hcCksIEdGUF9LRVJORUwpOworCWlmICghZ21hcCkKKwkJZ290byBvdXQ7CisJSU5JVF9MSVNUX0hFQUQoJmdtYXAtPmNyc3RfbGlzdCk7CisJZ21hcC0+bW0gPSBtbTsKKwlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgQUxMT0NfT1JERVIpOworCWlmICghcGFnZSkKKwkJZ290byBvdXRfZnJlZTsKKwlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmZ21hcC0+Y3JzdF9saXN0KTsKKwl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopIHBhZ2VfdG9fcGh5cyhwYWdlKTsKKwljcnN0X3RhYmxlX2luaXQodGFibGUsIF9SRUdJT04xX0VOVFJZX0VNUFRZKTsKKwlnbWFwLT50YWJsZSA9IHRhYmxlOworCWxpc3RfYWRkKCZnbWFwLT5saXN0LCAmbW0tPmNvbnRleHQuZ21hcF9saXN0KTsKKwlyZXR1cm4gZ21hcDsKKworb3V0X2ZyZWU6CisJa2ZyZWUoZ21hcCk7CitvdXQ6CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnbWFwX2FsbG9jKTsKKworc3RhdGljIGludCBnbWFwX3VubGlua19zZWdtZW50KHN0cnVjdCBnbWFwICpnbWFwLCB1bnNpZ25lZCBsb25nICp0YWJsZSkKK3sKKwlzdHJ1Y3QgZ21hcF9wZ3RhYmxlICptcDsKKwlzdHJ1Y3QgZ21hcF9ybWFwICpybWFwOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKCp0YWJsZSAmIF9TRUdNRU5UX0VOVFJZX0lOVikKKwkJcmV0dXJuIDA7CisJcGFnZSA9IHBmbl90b19wYWdlKCp0YWJsZSA+PiBQQUdFX1NISUZUKTsKKwltcCA9IChzdHJ1Y3QgZ21hcF9wZ3RhYmxlICopIHBhZ2UtPmluZGV4OworCWxpc3RfZm9yX2VhY2hfZW50cnkocm1hcCwgJm1wLT5tYXBwZXIsIGxpc3QpIHsKKwkJaWYgKHJtYXAtPmVudHJ5ICE9IHRhYmxlKQorCQkJY29udGludWU7CisJCWxpc3RfZGVsKCZybWFwLT5saXN0KTsKKwkJa2ZyZWUocm1hcCk7CisJCWJyZWFrOworCX0KKwkqdGFibGUgPSBfU0VHTUVOVF9FTlRSWV9JTlYgfCBfU0VHTUVOVF9FTlRSWV9STyB8IG1wLT52bWFkZHI7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGdtYXBfZmx1c2hfdGxiKHN0cnVjdCBnbWFwICpnbWFwKQoreworCWlmIChNQUNISU5FX0hBU19JRFRFKQorCQlfX3RsYl9mbHVzaF9pZHRlKCh1bnNpZ25lZCBsb25nKSBnbWFwLT50YWJsZSB8CisJCQkJIF9BU0NFX1RZUEVfUkVHSU9OMSk7CisJZWxzZQorCQlfX3RsYl9mbHVzaF9nbG9iYWwoKTsKK30KKworLyoqCisgKiBnbWFwX2ZyZWUgLSBmcmVlIGEgZ3Vlc3QgYWRkcmVzcyBzcGFjZQorICogQGdtYXA6IHBvaW50ZXIgdG8gdGhlIGd1ZXN0IGFkZHJlc3Mgc3BhY2Ugc3RydWN0dXJlCisgKi8KK3ZvaWQgZ21hcF9mcmVlKHN0cnVjdCBnbWFwICpnbWFwKQoreworCXN0cnVjdCBwYWdlICpwYWdlLCAqbmV4dDsKKwl1bnNpZ25lZCBsb25nICp0YWJsZTsKKwlpbnQgaTsKKworCisJLyogRmx1c2ggdGxiLiAqLworCWlmIChNQUNISU5FX0hBU19JRFRFKQorCQlfX3RsYl9mbHVzaF9pZHRlKCh1bnNpZ25lZCBsb25nKSBnbWFwLT50YWJsZSB8CisJCQkJIF9BU0NFX1RZUEVfUkVHSU9OMSk7CisJZWxzZQorCQlfX3RsYl9mbHVzaF9nbG9iYWwoKTsKKworCS8qIEZyZWUgYWxsIHNlZ21lbnQgJiByZWdpb24gdGFibGVzLiAqLworCWRvd25fcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFnZSwgbmV4dCwgJmdtYXAtPmNyc3RfbGlzdCwgbHJ1KSB7CisJCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikgcGFnZV90b19waHlzKHBhZ2UpOworCQlpZiAoKCp0YWJsZSAmIF9SRUdJT05fRU5UUllfVFlQRV9NQVNLKSA9PSAwKQorCQkJLyogUmVtb3ZlIGdtYXAgcm1hcCBzdHJ1Y3R1cmVzIGZvciBzZWdtZW50IHRhYmxlLiAqLworCQkJZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX1BNRDsgaSsrLCB0YWJsZSsrKQorCQkJCWdtYXBfdW5saW5rX3NlZ21lbnQoZ21hcCwgdGFibGUpOworCQlfX2ZyZWVfcGFnZXMocGFnZSwgQUxMT0NfT1JERVIpOworCX0KKwl1cF9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOworCWxpc3RfZGVsKCZnbWFwLT5saXN0KTsKKwlrZnJlZShnbWFwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdtYXBfZnJlZSk7CisKKy8qKgorICogZ21hcF9lbmFibGUgLSBzd2l0Y2ggcHJpbWFyeSBzcGFjZSB0byB0aGUgZ3Vlc3QgYWRkcmVzcyBzcGFjZQorICogQGdtYXA6IHBvaW50ZXIgdG8gdGhlIGd1ZXN0IGFkZHJlc3Mgc3BhY2Ugc3RydWN0dXJlCisgKi8KK3ZvaWQgZ21hcF9lbmFibGUoc3RydWN0IGdtYXAgKmdtYXApCit7CisJLyogTG9hZCBwcmltYXJ5IHNwYWNlIHBhZ2UgdGFibGUgb3JpZ2luLiAqLworCVMzOTBfbG93Y29yZS51c2VyX2FzY2UgPSBfQVNDRV9UWVBFX1JFR0lPTjEgfCBfQVNDRV9UQUJMRV9MRU5HVEggfAorCQkJCSBfQVNDRV9VU0VSX0JJVFMgfCBfX3BhKGdtYXAtPnRhYmxlKTsKKwlhc20gdm9sYXRpbGUoImxjdGxnIDEsMSwlMFxuIiA6IDogIm0iIChTMzkwX2xvd2NvcmUudXNlcl9hc2NlKSApOworCVMzOTBfbG93Y29yZS5nbWFwID0gKHVuc2lnbmVkIGxvbmcpIGdtYXA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnbWFwX2VuYWJsZSk7CisKKy8qKgorICogZ21hcF9kaXNhYmxlIC0gc3dpdGNoIGJhY2sgdG8gdGhlIHN0YW5kYXJkIHByaW1hcnkgYWRkcmVzcyBzcGFjZQorICogQGdtYXA6IHBvaW50ZXIgdG8gdGhlIGd1ZXN0IGFkZHJlc3Mgc3BhY2Ugc3RydWN0dXJlCisgKi8KK3ZvaWQgZ21hcF9kaXNhYmxlKHN0cnVjdCBnbWFwICpnbWFwKQoreworCS8qIExvYWQgcHJpbWFyeSBzcGFjZSBwYWdlIHRhYmxlIG9yaWdpbi4gKi8KKwlTMzkwX2xvd2NvcmUudXNlcl9hc2NlID0KKwkJZ21hcC0+bW0tPmNvbnRleHQuYXNjZV9iaXRzIHwgX19wYShnbWFwLT5tbS0+cGdkKTsKKwlhc20gdm9sYXRpbGUoImxjdGxnIDEsMSwlMFxuIiA6IDogIm0iIChTMzkwX2xvd2NvcmUudXNlcl9hc2NlKSApOworCVMzOTBfbG93Y29yZS5nbWFwID0gMFVMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ21hcF9kaXNhYmxlKTsKKworc3RhdGljIGludCBnbWFwX2FsbG9jX3RhYmxlKHN0cnVjdCBnbWFwICpnbWFwLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnRhYmxlLCB1bnNpZ25lZCBsb25nIGluaXQpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyAqbmV3OworCisJcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwsIEFMTE9DX09SREVSKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCW5ldyA9ICh1bnNpZ25lZCBsb25nICopIHBhZ2VfdG9fcGh5cyhwYWdlKTsKKwljcnN0X3RhYmxlX2luaXQobmV3LCBpbml0KTsKKwlkb3duX3JlYWQoJmdtYXAtPm1tLT5tbWFwX3NlbSk7CisJaWYgKCp0YWJsZSAmIF9SRUdJT05fRU5UUllfSU5WKSB7CisJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZnbWFwLT5jcnN0X2xpc3QpOworCQkqdGFibGUgPSAodW5zaWduZWQgbG9uZykgbmV3IHwgX1JFR0lPTl9FTlRSWV9MRU5HVEggfAorCQkJKCp0YWJsZSAmIF9SRUdJT05fRU5UUllfVFlQRV9NQVNLKTsKKwl9IGVsc2UKKwkJX19mcmVlX3BhZ2VzKHBhZ2UsIEFMTE9DX09SREVSKTsKKwl1cF9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOworCXJldHVybiAwOworfQorCisvKioKKyAqIGdtYXBfdW5tYXBfc2VnbWVudCAtIHVubWFwIHNlZ21lbnQgZnJvbSB0aGUgZ3Vlc3QgYWRkcmVzcyBzcGFjZQorICogQGdtYXA6IHBvaW50ZXIgdG8gdGhlIGd1ZXN0IGFkZHJlc3Mgc3BhY2Ugc3RydWN0dXJlCisgKiBAYWRkcjogYWRkcmVzcyBpbiB0aGUgZ3Vlc3QgYWRkcmVzcyBzcGFjZQorICogQGxlbjogbGVuZ3RoIG9mIHRoZSBtZW1vcnkgYXJlYSB0byB1bm1hcAorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgdW5tYXAgc3VjY2VkZWQsIC1FSU5WQUwgaWYgbm90LgorICovCitpbnQgZ21hcF91bm1hcF9zZWdtZW50KHN0cnVjdCBnbWFwICpnbWFwLCB1bnNpZ25lZCBsb25nIHRvLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nICp0YWJsZTsKKwl1bnNpZ25lZCBsb25nIG9mZjsKKwlpbnQgZmx1c2g7CisKKwlpZiAoKHRvIHwgbGVuKSAmIChQTURfU0laRSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobGVuID09IDAgfHwgdG8gKyBsZW4gPCB0bykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmbHVzaCA9IDA7CisJZG93bl9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOworCWZvciAob2ZmID0gMDsgb2ZmIDwgbGVuOyBvZmYgKz0gUE1EX1NJWkUpIHsKKwkJLyogV2FsayB0aGUgZ3Vlc3QgYWRkciBzcGFjZSBwYWdlIHRhYmxlICovCisJCXRhYmxlID0gZ21hcC0+dGFibGUgKyAoKCh0byArIG9mZikgPj4gNTMpICYgMHg3ZmYpOworCQlpZiAoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9JTlYpCisJCQlyZXR1cm4gMDsKKwkJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX09SSUdJTik7CisJCXRhYmxlID0gdGFibGUgKyAoKCh0byArIG9mZikgPj4gNDIpICYgMHg3ZmYpOworCQlpZiAoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9JTlYpCisJCQlyZXR1cm4gMDsKKwkJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX09SSUdJTik7CisJCXRhYmxlID0gdGFibGUgKyAoKCh0byArIG9mZikgPj4gMzEpICYgMHg3ZmYpOworCQlpZiAoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9JTlYpCisJCQlyZXR1cm4gMDsKKwkJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX09SSUdJTik7CisJCXRhYmxlID0gdGFibGUgKyAoKCh0byArIG9mZikgPj4gMjApICYgMHg3ZmYpOworCisJCS8qIENsZWFyIHNlZ21lbnQgdGFibGUgZW50cnkgaW4gZ3Vlc3QgYWRkcmVzcyBzcGFjZS4gKi8KKwkJZmx1c2ggfD0gZ21hcF91bmxpbmtfc2VnbWVudChnbWFwLCB0YWJsZSk7CisJCSp0YWJsZSA9IF9TRUdNRU5UX0VOVFJZX0lOVjsKKwl9CisJdXBfcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKKwlpZiAoZmx1c2gpCisJCWdtYXBfZmx1c2hfdGxiKGdtYXApOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ21hcF91bm1hcF9zZWdtZW50KTsKKworLyoqCisgKiBnbWFwX21tYXBfc2VnbWVudCAtIG1hcCBhIHNlZ21lbnQgdG8gdGhlIGd1ZXN0IGFkZHJlc3Mgc3BhY2UKKyAqIEBnbWFwOiBwb2ludGVyIHRvIHRoZSBndWVzdCBhZGRyZXNzIHNwYWNlIHN0cnVjdHVyZQorICogQGZyb206IHNvdXJjZSBhZGRyZXNzIGluIHRoZSBwYXJlbnQgYWRkcmVzcyBzcGFjZQorICogQHRvOiB0YXJnZXQgYWRkcmVzcyBpbiB0aGUgZ3Vlc3QgYWRkcmVzcyBzcGFjZQorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgbW1hcCBzdWNjZWRlZCwgLUVJTlZBTCBvciAtRU5PTUVNIGlmIG5vdC4KKyAqLworaW50IGdtYXBfbWFwX3NlZ21lbnQoc3RydWN0IGdtYXAgKmdtYXAsIHVuc2lnbmVkIGxvbmcgZnJvbSwKKwkJICAgICB1bnNpZ25lZCBsb25nIHRvLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nICp0YWJsZTsKKwl1bnNpZ25lZCBsb25nIG9mZjsKKwlpbnQgZmx1c2g7CisKKwlpZiAoKGZyb20gfCB0byB8IGxlbikgJiAoUE1EX1NJWkUgLSAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGxlbiA9PSAwIHx8IGZyb20gKyBsZW4gPiBQR0RJUl9TSVpFIHx8CisJICAgIGZyb20gKyBsZW4gPCBmcm9tIHx8IHRvICsgbGVuIDwgdG8pCisJCXJldHVybiAtRUlOVkFMOworCisJZmx1c2ggPSAwOworCWRvd25fcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKKwlmb3IgKG9mZiA9IDA7IG9mZiA8IGxlbjsgb2ZmICs9IFBNRF9TSVpFKSB7CisJCS8qIFdhbGsgdGhlIGdtYXAgYWRkcmVzcyBzcGFjZSBwYWdlIHRhYmxlICovCisJCXRhYmxlID0gZ21hcC0+dGFibGUgKyAoKCh0byArIG9mZikgPj4gNTMpICYgMHg3ZmYpOworCQlpZiAoKCp0YWJsZSAmIF9SRUdJT05fRU5UUllfSU5WKSAmJgorCQkgICAgZ21hcF9hbGxvY190YWJsZShnbWFwLCB0YWJsZSwgX1JFR0lPTjJfRU5UUllfRU1QVFkpKQorCQkJZ290byBvdXRfdW5tYXA7CisJCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9PUklHSU4pOworCQl0YWJsZSA9IHRhYmxlICsgKCgodG8gKyBvZmYpID4+IDQyKSAmIDB4N2ZmKTsKKwkJaWYgKCgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX0lOVikgJiYKKwkJICAgIGdtYXBfYWxsb2NfdGFibGUoZ21hcCwgdGFibGUsIF9SRUdJT04zX0VOVFJZX0VNUFRZKSkKKwkJCWdvdG8gb3V0X3VubWFwOworCQl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopKCp0YWJsZSAmIF9SRUdJT05fRU5UUllfT1JJR0lOKTsKKwkJdGFibGUgPSB0YWJsZSArICgoKHRvICsgb2ZmKSA+PiAzMSkgJiAweDdmZik7CisJCWlmICgoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9JTlYpICYmCisJCSAgICBnbWFwX2FsbG9jX3RhYmxlKGdtYXAsIHRhYmxlLCBfU0VHTUVOVF9FTlRSWV9FTVBUWSkpCisJCQlnb3RvIG91dF91bm1hcDsKKwkJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSAoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9PUklHSU4pOworCQl0YWJsZSA9IHRhYmxlICsgKCgodG8gKyBvZmYpID4+IDIwKSAmIDB4N2ZmKTsKKworCQkvKiBTdG9yZSAnZnJvbScgYWRkcmVzcyBpbiBhbiBpbnZhbGlkIHNlZ21lbnQgdGFibGUgZW50cnkuICovCisJCWZsdXNoIHw9IGdtYXBfdW5saW5rX3NlZ21lbnQoZ21hcCwgdGFibGUpOworCQkqdGFibGUgPSBfU0VHTUVOVF9FTlRSWV9JTlYgfCBfU0VHTUVOVF9FTlRSWV9STyB8IChmcm9tICsgb2ZmKTsKKwl9CisJdXBfcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKKwlpZiAoZmx1c2gpCisJCWdtYXBfZmx1c2hfdGxiKGdtYXApOworCXJldHVybiAwOworCitvdXRfdW5tYXA6CisJdXBfcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKKwlnbWFwX3VubWFwX3NlZ21lbnQoZ21hcCwgdG8sIGxlbik7CisJcmV0dXJuIC1FTk9NRU07Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnbWFwX21hcF9zZWdtZW50KTsKKwordW5zaWduZWQgbG9uZyBnbWFwX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IGdtYXAgKmdtYXApCit7CisJdW5zaWduZWQgbG9uZyAqdGFibGUsIHZtYWRkciwgc2VnbWVudDsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3QgZ21hcF9wZ3RhYmxlICptcDsKKwlzdHJ1Y3QgZ21hcF9ybWFwICpybWFwOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCBwYWdlICpwYWdlOworCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCisJY3VycmVudC0+dGhyZWFkLmdtYXBfYWRkciA9IGFkZHJlc3M7CisJbW0gPSBnbWFwLT5tbTsKKwkvKiBXYWxrIHRoZSBnbWFwIGFkZHJlc3Mgc3BhY2UgcGFnZSB0YWJsZSAqLworCXRhYmxlID0gZ21hcC0+dGFibGUgKyAoKGFkZHJlc3MgPj4gNTMpICYgMHg3ZmYpOworCWlmICh1bmxpa2VseSgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX0lOVikpCisJCXJldHVybiAtRUZBVUxUOworCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9PUklHSU4pOworCXRhYmxlID0gdGFibGUgKyAoKGFkZHJlc3MgPj4gNDIpICYgMHg3ZmYpOworCWlmICh1bmxpa2VseSgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX0lOVikpCisJCXJldHVybiAtRUZBVUxUOworCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9PUklHSU4pOworCXRhYmxlID0gdGFibGUgKyAoKGFkZHJlc3MgPj4gMzEpICYgMHg3ZmYpOworCWlmICh1bmxpa2VseSgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX0lOVikpCisJCXJldHVybiAtRUZBVUxUOworCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9PUklHSU4pOworCXRhYmxlID0gdGFibGUgKyAoKGFkZHJlc3MgPj4gMjApICYgMHg3ZmYpOworCisJLyogQ29udmVydCB0aGUgZ21hcCBhZGRyZXNzIHRvIGFuIG1tIGFkZHJlc3MuICovCisJc2VnbWVudCA9ICp0YWJsZTsKKwlpZiAobGlrZWx5KCEoc2VnbWVudCAmIF9TRUdNRU5UX0VOVFJZX0lOVikpKSB7CisJCXBhZ2UgPSBwZm5fdG9fcGFnZShzZWdtZW50ID4+IFBBR0VfU0hJRlQpOworCQltcCA9IChzdHJ1Y3QgZ21hcF9wZ3RhYmxlICopIHBhZ2UtPmluZGV4OworCQlyZXR1cm4gbXAtPnZtYWRkciB8IChhZGRyZXNzICYgflBNRF9NQVNLKTsKKwl9IGVsc2UgaWYgKHNlZ21lbnQgJiBfU0VHTUVOVF9FTlRSWV9STykgeworCQl2bWFkZHIgPSBzZWdtZW50ICYgX1NFR01FTlRfRU5UUllfT1JJR0lOOworCQl2bWEgPSBmaW5kX3ZtYShtbSwgdm1hZGRyKTsKKwkJaWYgKCF2bWEgfHwgdm1hLT52bV9zdGFydCA+IHZtYWRkcikKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIFdhbGsgdGhlIHBhcmVudCBtbSBwYWdlIHRhYmxlICovCisJCXBnZCA9IHBnZF9vZmZzZXQobW0sIHZtYWRkcik7CisJCXB1ZCA9IHB1ZF9hbGxvYyhtbSwgcGdkLCB2bWFkZHIpOworCQlpZiAoIXB1ZCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlwbWQgPSBwbWRfYWxsb2MobW0sIHB1ZCwgdm1hZGRyKTsKKwkJaWYgKCFwbWQpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKCFwbWRfcHJlc2VudCgqcG1kKSAmJgorCQkgICAgX19wdGVfYWxsb2MobW0sIHZtYSwgcG1kLCB2bWFkZHIpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCS8qIHBtZCBub3cgcG9pbnRzIHRvIGEgdmFsaWQgc2VnbWVudCB0YWJsZSBlbnRyeS4gKi8KKwkJcm1hcCA9IGttYWxsb2Moc2l6ZW9mKCpybWFwKSwgR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOworCQlpZiAoIXJtYXApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJLyogTGluayBnbWFwIHNlZ21lbnQgdGFibGUgZW50cnkgbG9jYXRpb24gdG8gcGFnZSB0YWJsZS4gKi8KKwkJcGFnZSA9IHBtZF9wYWdlKCpwbWQpOworCQltcCA9IChzdHJ1Y3QgZ21hcF9wZ3RhYmxlICopIHBhZ2UtPmluZGV4OworCQlybWFwLT5lbnRyeSA9IHRhYmxlOworCQlsaXN0X2FkZCgmcm1hcC0+bGlzdCwgJm1wLT5tYXBwZXIpOworCQkvKiBTZXQgZ21hcCBzZWdtZW50IHRhYmxlIGVudHJ5IHRvIHBhZ2UgdGFibGUuICovCisJCSp0YWJsZSA9IHBtZF92YWwoKnBtZCkgJiBQQUdFX01BU0s7CisJCXJldHVybiB2bWFkZHIgfCAoYWRkcmVzcyAmIH5QTURfTUFTSyk7CisJfQorCXJldHVybiAtRUZBVUxUOworCit9CitFWFBPUlRfU1lNQk9MX0dQTChnbWFwX2ZhdWx0KTsKKwordm9pZCBnbWFwX3VubWFwX25vdGlmaWVyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nICp0YWJsZSkKK3sKKwlzdHJ1Y3QgZ21hcF9ybWFwICpybWFwLCAqbmV4dDsKKwlzdHJ1Y3QgZ21hcF9wZ3RhYmxlICptcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgZmx1c2g7CisKKwlmbHVzaCA9IDA7CisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlwYWdlID0gcGZuX3RvX3BhZ2UoX19wYSh0YWJsZSkgPj4gUEFHRV9TSElGVCk7CisJbXAgPSAoc3RydWN0IGdtYXBfcGd0YWJsZSAqKSBwYWdlLT5pbmRleDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocm1hcCwgbmV4dCwgJm1wLT5tYXBwZXIsIGxpc3QpIHsKKwkJKnJtYXAtPmVudHJ5ID0KKwkJCV9TRUdNRU5UX0VOVFJZX0lOViB8IF9TRUdNRU5UX0VOVFJZX1JPIHwgbXAtPnZtYWRkcjsKKwkJbGlzdF9kZWwoJnJtYXAtPmxpc3QpOworCQlrZnJlZShybWFwKTsKKwkJZmx1c2ggPSAxOworCX0KKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJaWYgKGZsdXNoKQorCQlfX3RsYl9mbHVzaF9nbG9iYWwoKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICpwYWdlX3RhYmxlX2FsbG9jX3Bnc3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgdm1hZGRyKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGxvbmcgKnRhYmxlOwotCXVuc2lnbmVkIGxvbmcgYml0czsKKwlzdHJ1Y3QgZ21hcF9wZ3RhYmxlICptcDsKIAotCWJpdHMgPSAobW0tPmNvbnRleHQuaGFzX3Bnc3RlKSA/IDNVTCA6IDFVTDsKKwlwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMfF9fR0ZQX1JFUEVBVCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gTlVMTDsKKwltcCA9IGttYWxsb2Moc2l6ZW9mKCptcCksIEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKKwlpZiAoIW1wKSB7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcGd0YWJsZV9wYWdlX2N0b3IocGFnZSk7CisJbXAtPnZtYWRkciA9IHZtYWRkciAmIFBNRF9NQVNLOworCUlOSVRfTElTVF9IRUFEKCZtcC0+bWFwcGVyKTsKKwlwYWdlLT5pbmRleCA9ICh1bnNpZ25lZCBsb25nKSBtcDsKKwlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIDMpOworCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikgcGFnZV90b19waHlzKHBhZ2UpOworCWNsZWFyX3RhYmxlKHRhYmxlLCBfUEFHRV9UWVBFX0VNUFRZLCBQQUdFX1NJWkUvMik7CisJY2xlYXJfdGFibGUodGFibGUgKyBQVFJTX1BFUl9QVEUsIDAsIFBBR0VfU0laRS8yKTsKKwlyZXR1cm4gdGFibGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYWdlX3RhYmxlX2ZyZWVfcGdzdGUodW5zaWduZWQgbG9uZyAqdGFibGUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGdtYXBfcGd0YWJsZSAqbXA7CisKKwlwYWdlID0gcGZuX3RvX3BhZ2UoX19wYSh0YWJsZSkgPj4gUEFHRV9TSElGVCk7CisJbXAgPSAoc3RydWN0IGdtYXBfcGd0YWJsZSAqKSBwYWdlLT5pbmRleDsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJm1wLT5tYXBwZXIpKTsKKwlwZ3RhYmxlX3BhZ2VfY3RvcihwYWdlKTsKKwlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIC0xKTsKKwlrZnJlZShtcCk7CisJX19mcmVlX3BhZ2UocGFnZSk7Cit9CisKKyNlbHNlIC8qIENPTkZJR19QR1NURSAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKnBhZ2VfdGFibGVfYWxsb2NfcGdzdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJCQkgICAgdW5zaWduZWQgbG9uZyB2bWFkZHIpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYWdlX3RhYmxlX2ZyZWVfcGdzdGUodW5zaWduZWQgbG9uZyAqdGFibGUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbWFwX3VubWFwX25vdGlmaWVyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgKnRhYmxlKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX1BHU1RFICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF0b21pY194b3JfYml0cyhhdG9taWNfdCAqdiwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJdW5zaWduZWQgaW50IG9sZCwgbmV3OworCisJZG8geworCQlvbGQgPSBhdG9taWNfcmVhZCh2KTsKKwkJbmV3ID0gb2xkIF4gYml0czsKKwl9IHdoaWxlIChhdG9taWNfY21weGNoZyh2LCBvbGQsIG5ldykgIT0gb2xkKTsKKwlyZXR1cm4gbmV3OworfQorCisvKgorICogcGFnZSB0YWJsZSBlbnRyeSBhbGxvY2F0aW9uL2ZyZWUgcm91dGluZXMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgKnBhZ2VfdGFibGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgdm1hZGRyKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgKnRhYmxlOworCXVuc2lnbmVkIGludCBtYXNrLCBiaXQ7CisKKwlpZiAobW1faGFzX3Bnc3RlKG1tKSkKKwkJcmV0dXJuIHBhZ2VfdGFibGVfYWxsb2NfcGdzdGUobW0sIHZtYWRkcik7CisJLyogQWxsb2NhdGUgZnJhZ21lbnRzIG9mIGEgNEsgcGFnZSBhcyAxSy8ySyBwYWdlIHRhYmxlICovCiAJc3Bpbl9sb2NrX2JoKCZtbS0+Y29udGV4dC5saXN0X2xvY2spOwotCXBhZ2UgPSBOVUxMOworCW1hc2sgPSBGUkFHX01BU0s7CiAJaWYgKCFsaXN0X2VtcHR5KCZtbS0+Y29udGV4dC5wZ3RhYmxlX2xpc3QpKSB7CiAJCXBhZ2UgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtbS0+Y29udGV4dC5wZ3RhYmxlX2xpc3QsCiAJCQkJCXN0cnVjdCBwYWdlLCBscnUpOwotCQlpZiAoKHBhZ2UtPmZsYWdzICYgRlJBR19NQVNLKSA9PSAoKDFVTCA8PCBUQUJMRVNfUEVSX1BBR0UpIC0gMSkpCi0JCQlwYWdlID0gTlVMTDsKKwkJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSBwYWdlX3RvX3BoeXMocGFnZSk7CisJCW1hc2sgPSBhdG9taWNfcmVhZCgmcGFnZS0+X21hcGNvdW50KTsKKwkJbWFzayA9IG1hc2sgfCAobWFzayA+PiA0KTsKIAl9Ci0JaWYgKCFwYWdlKSB7CisJaWYgKChtYXNrICYgRlJBR19NQVNLKSA9PSBGUkFHX01BU0spIHsKIAkJc3Bpbl91bmxvY2tfYmgoJm1tLT5jb250ZXh0Lmxpc3RfbG9jayk7CiAJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKIAkJaWYgKCFwYWdlKQogCQkJcmV0dXJuIE5VTEw7CiAJCXBndGFibGVfcGFnZV9jdG9yKHBhZ2UpOwotCQlwYWdlLT5mbGFncyAmPSB+RlJBR19NQVNLOworCQlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIDEpOwogCQl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopIHBhZ2VfdG9fcGh5cyhwYWdlKTsKLQkJaWYgKG1tLT5jb250ZXh0Lmhhc19wZ3N0ZSkKLQkJCWNsZWFyX3RhYmxlX3Bnc3Rlcyh0YWJsZSk7Ci0JCWVsc2UKLQkJCWNsZWFyX3RhYmxlKHRhYmxlLCBfUEFHRV9UWVBFX0VNUFRZLCBQQUdFX1NJWkUpOworCQljbGVhcl90YWJsZSh0YWJsZSwgX1BBR0VfVFlQRV9FTVBUWSwgUEFHRV9TSVpFKTsKIAkJc3Bpbl9sb2NrX2JoKCZtbS0+Y29udGV4dC5saXN0X2xvY2spOwogCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmbW0tPmNvbnRleHQucGd0YWJsZV9saXN0KTsKKwl9IGVsc2UgeworCQlmb3IgKGJpdCA9IDE7IG1hc2sgJiBiaXQ7IGJpdCA8PD0gMSkKKwkJCXRhYmxlICs9IFBUUlNfUEVSX1BURTsKKwkJbWFzayA9IGF0b21pY194b3JfYml0cygmcGFnZS0+X21hcGNvdW50LCBiaXQpOworCQlpZiAoKG1hc2sgJiBGUkFHX01BU0spID09IEZSQUdfTUFTSykKKwkJCWxpc3RfZGVsKCZwYWdlLT5scnUpOwogCX0KLQl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopIHBhZ2VfdG9fcGh5cyhwYWdlKTsKLQl3aGlsZSAocGFnZS0+ZmxhZ3MgJiBiaXRzKSB7Ci0JCXRhYmxlICs9IDI1NjsKLQkJYml0cyA8PD0gMTsKLQl9Ci0JcGFnZS0+ZmxhZ3MgfD0gYml0czsKLQlpZiAoKHBhZ2UtPmZsYWdzICYgRlJBR19NQVNLKSA9PSAoKDFVTCA8PCBUQUJMRVNfUEVSX1BBR0UpIC0gMSkpCi0JCWxpc3RfbW92ZV90YWlsKCZwYWdlLT5scnUsICZtbS0+Y29udGV4dC5wZ3RhYmxlX2xpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZtbS0+Y29udGV4dC5saXN0X2xvY2spOwogCXJldHVybiB0YWJsZTsKIH0KIAotc3RhdGljIHZvaWQgX19wYWdlX3RhYmxlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgKnRhYmxlKQotewotCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgYml0czsKLQotCWJpdHMgPSAoKHVuc2lnbmVkIGxvbmcpIHRhYmxlKSAmIDE1OwotCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikoKCh1bnNpZ25lZCBsb25nKSB0YWJsZSkgXiBiaXRzKTsKLQlwYWdlID0gcGZuX3RvX3BhZ2UoX19wYSh0YWJsZSkgPj4gUEFHRV9TSElGVCk7Ci0JcGFnZS0+ZmxhZ3MgXj0gYml0czsKLQlpZiAoIShwYWdlLT5mbGFncyAmIEZSQUdfTUFTSykpIHsKLQkJcGd0YWJsZV9wYWdlX2R0b3IocGFnZSk7Ci0JCV9fZnJlZV9wYWdlKHBhZ2UpOwotCX0KLX0KLQogdm9pZCBwYWdlX3RhYmxlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgKnRhYmxlKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgYml0czsKKwl1bnNpZ25lZCBpbnQgYml0LCBtYXNrOwogCi0JYml0cyA9IChtbS0+Y29udGV4dC5oYXNfcGdzdGUpID8gM1VMIDogMVVMOwotCWJpdHMgPDw9IChfX3BhKHRhYmxlKSAmIChQQUdFX1NJWkUgLSAxKSkgLyAyNTYgLyBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJaWYgKG1tX2hhc19wZ3N0ZShtbSkpIHsKKwkJZ21hcF91bm1hcF9ub3RpZmllcihtbSwgdGFibGUpOworCQlyZXR1cm4gcGFnZV90YWJsZV9mcmVlX3Bnc3RlKHRhYmxlKTsKKwl9CisJLyogRnJlZSAxSy8ySyBwYWdlIHRhYmxlIGZyYWdtZW50IG9mIGEgNEsgcGFnZSAqLwogCXBhZ2UgPSBwZm5fdG9fcGFnZShfX3BhKHRhYmxlKSA+PiBQQUdFX1NISUZUKTsKKwliaXQgPSAxIDw8ICgoX19wYSh0YWJsZSkgJiB+UEFHRV9NQVNLKS8oUFRSU19QRVJfUFRFKnNpemVvZihwdGVfdCkpKTsKIAlzcGluX2xvY2tfYmgoJm1tLT5jb250ZXh0Lmxpc3RfbG9jayk7Ci0JcGFnZS0+ZmxhZ3MgXj0gYml0czsKLQlpZiAocGFnZS0+ZmxhZ3MgJiBGUkFHX01BU0spIHsKLQkJLyogUGFnZSBub3cgaGFzIHNvbWUgZnJlZSBwZ3RhYmxlIGZyYWdtZW50cy4gKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZwYWdlLT5scnUpKQotCQkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsICZtbS0+Y29udGV4dC5wZ3RhYmxlX2xpc3QpOwotCQlwYWdlID0gTlVMTDsKLQl9IGVsc2UKLQkJLyogQWxsIGZyYWdtZW50cyBvZiB0aGUgNEsgcGFnZSBoYXZlIGJlZW4gZnJlZWQuICovCisJaWYgKChhdG9taWNfcmVhZCgmcGFnZS0+X21hcGNvdW50KSAmIEZSQUdfTUFTSykgIT0gRlJBR19NQVNLKQogCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKKwltYXNrID0gYXRvbWljX3hvcl9iaXRzKCZwYWdlLT5fbWFwY291bnQsIGJpdCk7CisJaWYgKG1hc2sgJiBGUkFHX01BU0spCisJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZtbS0+Y29udGV4dC5wZ3RhYmxlX2xpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZtbS0+Y29udGV4dC5saXN0X2xvY2spOwotCWlmIChwYWdlKSB7CisJaWYgKG1hc2sgPT0gMCkgewogCQlwZ3RhYmxlX3BhZ2VfZHRvcihwYWdlKTsKKwkJYXRvbWljX3NldCgmcGFnZS0+X21hcGNvdW50LCAtMSk7CiAJCV9fZnJlZV9wYWdlKHBhZ2UpOwogCX0KIH0KIAotdm9pZCBwYWdlX3RhYmxlX2ZyZWVfcmN1KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nICp0YWJsZSkKLXsKLQlzdHJ1Y3QgcmN1X3RhYmxlX2ZyZWVsaXN0ICpiYXRjaDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIGJpdHM7CisjaWZkZWYgQ09ORklHX0hBVkVfUkNVX1RBQkxFX0ZSRUUKIAotCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmIChhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA8IDIgJiYKLQkgICAgY3B1bWFza19lcXVhbChtbV9jcHVtYXNrKG1tKSwgY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpKSkgewotCQlwYWdlX3RhYmxlX2ZyZWUobW0sIHRhYmxlKTsKLQkJZ290byBvdXQ7CitzdGF0aWMgdm9pZCBfX3BhZ2VfdGFibGVfZnJlZV9yY3Uodm9pZCAqdGFibGUsIHVuc2lnbmVkIGJpdCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmIChiaXQgPT0gRlJBR19NQVNLKQorCQlyZXR1cm4gcGFnZV90YWJsZV9mcmVlX3Bnc3RlKHRhYmxlKTsKKwkvKiBGcmVlIDFLLzJLIHBhZ2UgdGFibGUgZnJhZ21lbnQgb2YgYSA0SyBwYWdlICovCisJcGFnZSA9IHBmbl90b19wYWdlKF9fcGEodGFibGUpID4+IFBBR0VfU0hJRlQpOworCWlmIChhdG9taWNfeG9yX2JpdHMoJnBhZ2UtPl9tYXBjb3VudCwgYml0KSA9PSAwKSB7CisJCXBndGFibGVfcGFnZV9kdG9yKHBhZ2UpOworCQlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIC0xKTsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CiAJfQotCWJhdGNoID0gcmN1X3RhYmxlX2ZyZWVsaXN0X2dldChtbSk7Ci0JaWYgKCFiYXRjaCkgewotCQlzbXBfY2FsbF9mdW5jdGlvbihzbXBfc3luYywgTlVMTCwgMSk7Ci0JCXBhZ2VfdGFibGVfZnJlZShtbSwgdGFibGUpOwotCQlnb3RvIG91dDsKK30KKwordm9pZCBwYWdlX3RhYmxlX2ZyZWVfcmN1KHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHVuc2lnbmVkIGxvbmcgKnRhYmxlKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGludCBiaXQsIG1hc2s7CisKKwltbSA9IHRsYi0+bW07CisJaWYgKG1tX2hhc19wZ3N0ZShtbSkpIHsKKwkJZ21hcF91bm1hcF9ub3RpZmllcihtbSwgdGFibGUpOworCQl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopIChfX3BhKHRhYmxlKSB8IEZSQUdfTUFTSyk7CisJCXRsYl9yZW1vdmVfdGFibGUodGxiLCB0YWJsZSk7CisJCXJldHVybjsKIAl9Ci0JYml0cyA9IChtbS0+Y29udGV4dC5oYXNfcGdzdGUpID8gM1VMIDogMVVMOwotCWJpdHMgPDw9IChfX3BhKHRhYmxlKSAmIChQQUdFX1NJWkUgLSAxKSkgLyAyNTYgLyBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJYml0ID0gMSA8PCAoKF9fcGEodGFibGUpICYgflBBR0VfTUFTSykgLyAoUFRSU19QRVJfUFRFKnNpemVvZihwdGVfdCkpKTsKIAlwYWdlID0gcGZuX3RvX3BhZ2UoX19wYSh0YWJsZSkgPj4gUEFHRV9TSElGVCk7CiAJc3Bpbl9sb2NrX2JoKCZtbS0+Y29udGV4dC5saXN0X2xvY2spOwotCS8qIERlbGF5ZWQgZnJlZWluZyB3aXRoIHJjdSBwcmV2ZW50cyByZXVzZSBvZiBwZ3RhYmxlIGZyYWdtZW50cyAqLwotCWxpc3RfZGVsX2luaXQoJnBhZ2UtPmxydSk7CisJaWYgKChhdG9taWNfcmVhZCgmcGFnZS0+X21hcGNvdW50KSAmIEZSQUdfTUFTSykgIT0gRlJBR19NQVNLKQorCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKKwltYXNrID0gYXRvbWljX3hvcl9iaXRzKCZwYWdlLT5fbWFwY291bnQsIGJpdCB8IChiaXQgPDwgNCkpOworCWlmIChtYXNrICYgRlJBR19NQVNLKQorCQlsaXN0X2FkZF90YWlsKCZwYWdlLT5scnUsICZtbS0+Y29udGV4dC5wZ3RhYmxlX2xpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZtbS0+Y29udGV4dC5saXN0X2xvY2spOwotCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikoKCh1bnNpZ25lZCBsb25nKSB0YWJsZSkgfCBiaXRzKTsKLQliYXRjaC0+dGFibGVbYmF0Y2gtPnBndF9pbmRleCsrXSA9IHRhYmxlOwotCWlmIChiYXRjaC0+cGd0X2luZGV4ID49IGJhdGNoLT5jcnN0X2luZGV4KQotCQlyY3VfdGFibGVfZnJlZWxpc3RfZmluaXNoKCk7Ci1vdXQ6Ci0JcHJlZW1wdF9lbmFibGUoKTsKKwl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopIChfX3BhKHRhYmxlKSB8IChiaXQgPDwgNCkpOworCXRsYl9yZW1vdmVfdGFibGUodGxiLCB0YWJsZSk7CiB9CiAKK3ZvaWQgX190bGJfcmVtb3ZlX3RhYmxlKHZvaWQgKl90YWJsZSkKK3sKKwl2b2lkICp0YWJsZSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSBfdGFibGUgJiBQQUdFX01BU0spOworCXVuc2lnbmVkIHR5cGUgPSAodW5zaWduZWQgbG9uZykgX3RhYmxlICYgflBBR0VfTUFTSzsKKworCWlmICh0eXBlKQorCQlfX3BhZ2VfdGFibGVfZnJlZV9yY3UodGFibGUsIHR5cGUpOworCWVsc2UKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdGFibGUsIEFMTE9DX09SREVSKTsKK30KKworI2VuZGlmCisKIC8qCiAgKiBzd2l0Y2ggb24gcGdzdGVzIGZvciBpdHMgdXNlcnNwYWNlIHByb2Nlc3MgKGZvciBrdm0pCiAgKi8KQEAgLTM2OSw3ICs2OTAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIERvIHdlIGhhdmUgcGdzdGVzPyBpZiB5ZXMsIHdlIGFyZSBkb25lICovCi0JaWYgKHRzay0+bW0tPmNvbnRleHQuaGFzX3Bnc3RlKQorCWlmIChtbV9oYXNfcGdzdGUodHNrLT5tbSkpCiAJCXJldHVybiAwOwogCiAJLyogbGV0cyBjaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0byByZXBsYWNlIHRoZSBtbSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL3ZtZW0uYyBiL2FyY2gvczM5MC9tbS92bWVtLmMKaW5kZXggOGMxOTcwZC4uNzgxZmY1MSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL3ZtZW0uYworKysgYi9hcmNoL3MzOTAvbW0vdm1lbS5jCkBAIC02MSwxMiArNjEsMTIgQEAKIAlyZXR1cm4gcG1kOwogfQogCi1zdGF0aWMgcHRlX3QgX19yZWYgKnZtZW1fcHRlX2FsbG9jKHZvaWQpCitzdGF0aWMgcHRlX3QgX19yZWYgKnZtZW1fcHRlX2FsbG9jKHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAlwdGVfdCAqcHRlOwogCiAJaWYgKHNsYWJfaXNfYXZhaWxhYmxlKCkpCi0JCXB0ZSA9IChwdGVfdCAqKSBwYWdlX3RhYmxlX2FsbG9jKCZpbml0X21tKTsKKwkJcHRlID0gKHB0ZV90ICopIHBhZ2VfdGFibGVfYWxsb2MoJmluaXRfbW0sIGFkZHJlc3MpOwogCWVsc2UKIAkJcHRlID0gYWxsb2NfYm9vdG1lbShQVFJTX1BFUl9QVEUgKiBzaXplb2YocHRlX3QpKTsKIAlpZiAoIXB0ZSkKQEAgLTEyMCw3ICsxMjAsNyBAQAogCQl9CiAjZW5kaWYKIAkJaWYgKHBtZF9ub25lKCpwbV9kaXIpKSB7Ci0JCQlwdF9kaXIgPSB2bWVtX3B0ZV9hbGxvYygpOworCQkJcHRfZGlyID0gdm1lbV9wdGVfYWxsb2MoYWRkcmVzcyk7CiAJCQlpZiAoIXB0X2RpcikKIAkJCQlnb3RvIG91dDsKIAkJCXBtZF9wb3B1bGF0ZSgmaW5pdF9tbSwgcG1fZGlyLCBwdF9kaXIpOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAKIAkJcG1fZGlyID0gcG1kX29mZnNldChwdV9kaXIsIGFkZHJlc3MpOwogCQlpZiAocG1kX25vbmUoKnBtX2RpcikpIHsKLQkJCXB0X2RpciA9IHZtZW1fcHRlX2FsbG9jKCk7CisJCQlwdF9kaXIgPSB2bWVtX3B0ZV9hbGxvYyhhZGRyZXNzKTsKIAkJCWlmICghcHRfZGlyKQogCQkJCWdvdG8gb3V0OwogCQkJcG1kX3BvcHVsYXRlKCZpbml0X21tLCBwbV9kaXIsIHB0X2Rpcik7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvb3Byb2ZpbGUvaW5pdC5jIGIvYXJjaC9zMzkwL29wcm9maWxlL2luaXQuYwppbmRleCA1OTk1ZTliLi42ZWZjMThiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvb3Byb2ZpbGUvaW5pdC5jCisrKyBiL2FyY2gvczM5MC9vcHJvZmlsZS9pbml0LmMKQEAgLTEzLDggKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogCiAjaW5jbHVkZSAiLi4vLi4vLi4vZHJpdmVycy9vcHJvZmlsZS9vcHJvZi5oIgpAQCAtMjUsNyArMjMsNyBAQAogCiAjaW5jbHVkZSAiaHdzYW1wbGVyLmgiCiAKLSNkZWZpbmUgREVGQVVMVF9JTlRFUlZBTAk0MDk2CisjZGVmaW5lIERFRkFVTFRfSU5URVJWQUwJNDEyNzUxOAogCiAjZGVmaW5lIERFRkFVTFRfU0RCVF9CTE9DS1MJMQogI2RlZmluZSBERUZBVUxUX1NEQl9CTE9DS1MJNTExCkBAIC0xNTEsNiArMTQ5LDEyIEBACiAJaWYgKG9wcm9maWxlX21heF9pbnRlcnZhbCA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qIFRoZSBpbml0aWFsIHZhbHVlIHNob3VsZCBiZSBzYW5lICovCisJaWYgKG9wcm9maWxlX2h3X2ludGVydmFsIDwgb3Byb2ZpbGVfbWluX2ludGVydmFsKQorCQlvcHJvZmlsZV9od19pbnRlcnZhbCA9IG9wcm9maWxlX21pbl9pbnRlcnZhbDsKKwlpZiAob3Byb2ZpbGVfaHdfaW50ZXJ2YWwgPiBvcHJvZmlsZV9tYXhfaW50ZXJ2YWwpCisJCW9wcm9maWxlX2h3X2ludGVydmFsID0gb3Byb2ZpbGVfbWF4X2ludGVydmFsOworCiAJaWYgKG9wcm9maWxlX3RpbWVyX2luaXQob3BzKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2NvcmUva2VybmVsL21vZHVsZS5jIGIvYXJjaC9zY29yZS9rZXJuZWwvbW9kdWxlLmMKaW5kZXggNGRlOGQ0Ny4uNDY5ZTNiNiAxMDA2NDQKLS0tIGEvYXJjaC9zY29yZS9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9zY29yZS9rZXJuZWwvbW9kdWxlLmMKQEAgLTI3LDIzICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCi12b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBzaXplID8gdm1hbGxvYyhzaXplKSA6IE5VTEw7Ci19Ci0KLS8qIEZyZWUgbWVtb3J5IHJldHVybmVkIGZyb20gbW9kdWxlX2FsbG9jICovCi12b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKLXsKLQl2ZnJlZShtb2R1bGVfcmVnaW9uKTsKLX0KLQotaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmhkciwgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCQljaGFyICpzZWNzdHJpbmdzLCBzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIGludCBhcHBseV9yZWxvY2F0ZShFbGZfU2hkciAqc2VjaGRycywgY29uc3QgY2hhciAqc3RydGFiLAogCQl1bnNpZ25lZCBpbnQgc3ltaW5kZXgsIHVuc2lnbmVkIGludCByZWxpbmRleCwKIAkJc3RydWN0IG1vZHVsZSAqbWUpCkBAIC0xNDYsNiArMTI5LDkgQEAKIAkJdW5zaWduZWQgaW50IHN5bWluZGV4LCB1bnNpZ25lZCBpbnQgcmVsc2VjLAogCQlzdHJ1Y3QgbW9kdWxlICptZSkKIHsKKwkvKiBOb24tc3RhbmRhcmQgcmV0dXJuIHZhbHVlLi4uIG1vc3Qgb3RoZXIgYXJjaCdzIHJldHVybiAtRU5PRVhFQworCSAqIGZvciBhbiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHZhcmlhbnQKKwkgKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU0LDEyICsxNDAsMyBAQAogewogCXJldHVybiBOVUxMOwogfQotCi0vKiBQdXQgaW4gZGJlIGxpc3QgaWYgbmVjZXNzYXJ5LiAqLwotaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLCBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKLQkJc3RydWN0IG1vZHVsZSAqbWUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpIHt9CmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcgYi9hcmNoL3NoL0tjb25maWcKaW5kZXggZjAzMzM4Yy4uNzQ4ZmYxOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtMzQ4LDYgKzM0OCw3IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKKwlzZWxlY3QgVVNCX09IQ0lfU0ggaWYgVVNCX09IQ0lfSENECiAJaGVscAogCSAgU2VsZWN0IFNINzcyMCBpZiB5b3UgaGF2ZSBhIFNIMy1EU1AgU0g3NzIwIENQVS4KIApAQCAtMzU3LDYgKzM1OCw3IEBACiAJc2VsZWN0IENQVV9IQVNfRFNQCiAJc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKIAlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKKwlzZWxlY3QgVVNCX09IQ0lfU0ggaWYgVVNCX09IQ0lfSENECiAJaGVscAogCSAgU2VsZWN0IFNINzcyMSBpZiB5b3UgaGF2ZSBhIFNIMy1EU1AgU0g3NzIxIENQVS4KIApAQCAtNDQwLDYgKzQ0Miw3IEBACiAJYm9vbCAiU3VwcG9ydCBTSDc3NjMgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0QQogCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQorCXNlbGVjdCBVU0JfT0hDSV9TSCBpZiBVU0JfT0hDSV9IQ0QKIAloZWxwCiAJICBTZWxlY3QgU0g3NzYzIGlmIHlvdSBoYXZlIGEgU0g0QSBTSDc3NjMoUjVTNzc2MzEpIENQVS4KIApAQCAtNDY3LDcgKzQ3MCw5IEBACiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUIGlmIFNNUAogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQorCXNlbGVjdCBVU0JfT0hDSV9TSCBpZiBVU0JfT0hDSV9IQ0QKIAlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKKwlzZWxlY3QgVVNCX0VIQ0lfU0ggaWYgVVNCX0VIQ0lfSENECiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSFgzCiAJYm9vbCAiU3VwcG9ydCBTSC1YMyBwcm9jZXNzb3IiCkBAIC04OTIsMjAgKzg5Nyw0IEBACiAKIHNvdXJjZSAiY3J5cHRvL0tjb25maWciCiAKLW1lbnVjb25maWcgVklSVFVBTElaQVRJT04KLQlib29sICJWaXJ0dWFsaXphdGlvbiIKLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCi0JICBTYXkgWSBoZXJlIHRvIGdldCB0byBzZWUgb3B0aW9ucyBmb3IgdXNpbmcgeW91ciBMaW51eCBob3N0IHRvIHJ1biBvdGhlcgotCSAgb3BlcmF0aW5nIHN5c3RlbXMgaW5zaWRlIHZpcnR1YWwgbWFjaGluZXMgKGd1ZXN0cykuCi0JICBUaGlzIG9wdGlvbiBhbG9uZSBkb2VzIG5vdCBhZGQgYW55IGtlcm5lbCBjb2RlLgotCi0JICBJZiB5b3Ugc2F5IE4sIGFsbCBvcHRpb25zIGluIHRoaXMgc3VibWVudSB3aWxsIGJlIHNraXBwZWQgYW5kIGRpc2FibGVkLgotCi1pZiBWSVJUVUFMSVpBVElPTgotCi1zb3VyY2UgZHJpdmVycy92aXJ0aW8vS2NvbmZpZwotCi1lbmRpZiAjIFZJUlRVQUxJWkFUSU9OCi0KIHNvdXJjZSAibGliL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMKaW5kZXggOTY5NDIxZi4uMWRjOTI0YiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJX19yYXdfd3JpdGV3KDAsIEZQR0FfTENEUkVHKTsKIH0KIAotY29uc3Qgc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgYXAzMjVyeGFfbGNkY19tb2Rlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgYXAzMjVyeGFfbGNkY19tb2Rlc1tdID0gewogCXsKIAkJLm5hbWUgPSAiTEIwNzBXVjEiLAogCQkueHJlcyA9IDgwMCwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYwppbmRleCAzYTMyNzQxLi5iMjRkNjlkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9yOGE2NjU5Ny5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9yZW5lc2FzX3VzYmhzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3RzYzIwMDcuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CkBAIC0yMzIsOCArMjMzLDU0IEBACiAJLnJlc291cmNlCT0gdXNiMV9jb21tb25fcmVzb3VyY2VzLAogfTsKIAorLyoKKyAqIFVTQkhTCisgKi8KK3N0YXRpYyBpbnQgdXNiaHNfZ2V0X2lkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKEdQSU9fUFRCMyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVuZXNhc191c2Joc19wbGF0Zm9ybV9pbmZvIHVzYmhzX2luZm8gPSB7CisJLnBsYXRmb3JtX2NhbGxiYWNrID0geworCQkuZ2V0X2lkCQk9IHVzYmhzX2dldF9pZCwKKwl9LAorCS5kcml2ZXJfcGFyYW0gPSB7CisJCS5idXN3YWl0X2J3YWl0CQk9IDQsCisJCS5kZXRlY3Rpb25fZGVsYXkJPSA1LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYmhzX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHhhNGQ5MDAwMCwKKwkJLmVuZAk9IDB4YTRkOTAxMjQgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gNjYsCisJCS5lbmQJPSA2NiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHVzYmhzX2RldmljZSA9IHsKKwkubmFtZQk9ICJyZW5lc2FzX3VzYmhzIiwKKwkuaWQJPSAxLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzawkJPSBOVUxMLCAgICAgICAgIC8qICBub3QgdXNlIGRtYSAqLworCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmdXNiaHNfaW5mbywKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1c2Joc19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHVzYmhzX3Jlc291cmNlcywKKwkuYXJjaGRhdGEgPSB7CisJCS5od2Jsa19pZCA9IEhXQkxLX1VTQjEsCisJfSwKK307CisKIC8qIExDREMgKi8KLWNvbnN0IHN0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIGVjb3ZlY19sY2RfbW9kZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlIGVjb3ZlY19sY2RfbW9kZXNbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJQYW5lbCIsCiAJCS54cmVzCQk9IDgwMCwKQEAgLTI0OCw3ICsyOTUsNyBAQAogCX0sCiB9OwogCi1jb25zdCBzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBlY292ZWNfZHZpX21vZGVzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSBlY292ZWNfZHZpX21vZGVzW10gPSB7CiAJewogCQkubmFtZQkJPSAiRFZJIiwKIAkJLnhyZXMJCT0gMTI4MCwKQEAgLTg5Nyw2ICs5NDQsNyBAQAogCSZzaF9ldGhfZGV2aWNlLAogCSZ1c2IwX2hvc3RfZGV2aWNlLAogCSZ1c2IxX2NvbW1vbl9kZXZpY2UsCisJJnVzYmhzX2RldmljZSwKIAkmbGNkY19kZXZpY2UsCiAJJmNldTBfZGV2aWNlLAogCSZjZXUxX2RldmljZSwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gta2ZyMnIwOS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1rZnIycjA5L3NldHVwLmMKaW5kZXggOGI0YWJiYi4uZjY1MjcxYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1rZnIycjA5L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1rZnIycjA5L3NldHVwLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCX0sCiB9OwogCi1jb25zdCBzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBrZnIycjA5X2xjZGNfbW9kZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlIGtmcjJyMDlfbGNkY19tb2Rlc1tdID0gewogCXsKIAkJLm5hbWUgPSAiVFgwN0QzNFZNMEFBQSIsCiAJCS54cmVzID0gMjQwLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9zZXR1cC5jCmluZGV4IDE4NGZkZTEuLjJkNGM5YzggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtbWlnb3Ivc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLW1pZ29yL3NldHVwLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogCX0KIH07CiAKLWNvbnN0IHN0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIG1pZ29yX2xjZF9tb2Rlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgbWlnb3JfbGNkX21vZGVzW10gPSB7CiAJewogI2lmIGRlZmluZWQoQ09ORklHX1NIX01JR09SX1JUQV9XVkdBKQogCQkubmFtZSA9ICJMQjA3MFdWMSIsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3MjQvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jCmluZGV4IDEyMzU3NjcuLmQwMDc1NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIH07CiAKIC8qIExDREMgKi8KLWNvbnN0IHN0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIGxjZGNfNzIwcF9tb2Rlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgbGNkY183MjBwX21vZGVzW10gPSB7CiAJewogCQkubmFtZQkJPSAiTEIwNzBXVjEiLAogCQkuc3luYwkJPSAwLCAvKiBoc3luYyBhbmQgdnN5bmMgYXJlIGFjdGl2ZSBsb3cgKi8KQEAgLTE2MCw3ICsxNjAsNyBAQAogCX0sCiB9OwogCi1jb25zdCBzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBsY2RjX3ZnYV9tb2Rlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgbGNkY192Z2FfbW9kZXNbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJMQjA3MFdWMSIsCiAJCS5zeW5jCQk9IDAsIC8qIGhzeW5jIGFuZCB2c3luYyBhcmUgYWN0aXZlIGxvdyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQppbmRleCA3ODBlMDgzLi4yM2JjODQ5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtMjcsOCArMjcsNiBAQAogCQkJJChDT05GSUdfQk9PVF9MSU5LX09GRlNFVCldJykKIGVuZGlmCiAKLUxJQkdDQwk6PSAkKHNoZWxsICQoQ0MpICQoS0JVSUxEX0NGTEFHUykgLXByaW50LWxpYmdjYy1maWxlLW5hbWUpCi0KIGlmZXEgKCQoQ09ORklHX01DT1VOVCkseSkKIE9SSUdfQ0ZMQUdTIDo9ICQoS0JVSUxEX0NGTEFHUykKIEtCVUlMRF9DRkxBR1MgPSAkKHN1YnN0IC1wZywgLCAkKE9SSUdfQ0ZMQUdTKSkKQEAgLTM3LDcgKzM1LDI1IEBACiBMREZMQUdTX3ZtbGludXggOj0gLS1vZm9ybWF0ICQobGQtYmZkKSAtVHRleHQgJChJTUFHRV9PRkZTRVQpIC1lIHN0YXJ0dXAgXAogCQkgICAtVCAkKG9iaikvLi4vLi4va2VybmVsL3ZtbGludXgubGRzCiAKLSQob2JqKS92bWxpbnV4OiAkKE9CSkVDVFMpICQob2JqKS9waWdneS5vICQoTElCR0NDKSBGT1JDRQorIworIyBQdWxsIGluIHRoZSBuZWNlc3NhcnkgbGliZ2NjIGJpdHMgZnJvbSB0aGUgaW4ta2VybmVsIGltcGxlbWVudGF0aW9uLgorIworbGliMWZ1bmNzLSQoQ09ORklHX1NVUEVSSDMyKQk6PSBhc2hpZnRydC5TIGFzaGxkaTMuYyBhc2hyc2kzLlMgYXNobHNpMy5TIFwKKwkJCQkgICBsc2hyc2kzLlMKK2xpYjFmdW5jcy1vYmoJCQk6PSBcCisJJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChhZGRwcmVmaXggJChvYmopLywgJChsaWIxZnVuY3MteSkpKSkKKworbGliMWZ1bmNzLWRpcgkJOj0gJChzcmN0cmVlKS9hcmNoLyQoU1JDQVJDSCkvbGliCitpZmVxICgkKEJJVFMpLDY0KQorCWxpYjFmdW5jcy1kaXIgCTo9ICQoYWRkc3VmZml4ICQoQklUUyksICQobGliMWZ1bmNzLWRpcikpCitlbmRpZgorCitLQlVJTERfQ0ZMQUdTICs9IC1JJChsaWIxZnVuY3MtZGlyKQorCiskKGFkZHByZWZpeCAkKG9iaikvLCQobGliMWZ1bmNzLXkpKTogJChvYmopLyU6ICQobGliMWZ1bmNzLWRpcikvJSBGT1JDRQorCSQoY2FsbCBjbWQsc2hpcHBlZCkKKworJChvYmopL3ZtbGludXg6ICQoT0JKRUNUUykgJChvYmopL3BpZ2d5Lm8gJChsaWIxZnVuY3Mtb2JqKSBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQogCUA6CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaDc3NTdsY3JfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NoNzc1N2xjcl9kZWZjb25maWcKaW5kZXggMzNkZGIxMy4uY2ZkZTk4ZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NoNzc1N2xjcl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoNzc1N2xjcl9kZWZjb25maWcKQEAgLTksNyArOSw2IEBACiBDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TX0FMTD15CiBDT05GSUdfU0xBQj15CkBAIC0zOSw4ICszOCw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfTTI1UDgwPXkKQEAgLTU2LDE4ICs1MywxOSBAQAogIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfTU9VU0VfUFMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfU0hfU0NJPXkKIENPTkZJR19TRVJJQUxfU0hfU0NJX05SX1VBUlRTPTMKIENPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEU9eQotIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKIENPTkZJR19TUEk9eQogQ09ORklHX1NQSV9TSD15CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci1DT05GSUdfTUZEX1NIX01PQklMRV9TREhJPXkKIENPTkZJR19VU0I9eQogQ09ORklHX1VTQl9FSENJX0hDRD15CitDT05GSUdfVVNCX0VIQ0lfU0g9eQogQ09ORklHX1VTQl9PSENJX0hDRD15CitDT05GSUdfVVNCX09IQ0lfU0g9eQogQ09ORklHX1VTQl9TVE9SQUdFPXkKIENPTkZJR19NTUM9eQogQ09ORklHX01NQ19TREhJPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvdGl0YW5fZGVmY29uZmlnCmluZGV4IDBmNTU4OTEuLmUyY2JkOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3RpdGFuX2RlZmNvbmZpZwpAQCAtMjI3LDcgKzIyNyw3IEBACiBDT05GSUdfVVNCX1NFUklBTF9HRU5FUklDPXkKIENPTkZJR19VU0JfU0VSSUFMX0FSSzMxMTY9bQogQ09ORklHX1VTQl9TRVJJQUxfUEwyMzAzPW0KLUNPTkZJR19SVENfQ0xBU1M9bQorQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9TSD1tCiBDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUM19GUz15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2NtcHhjaGctZ3JiLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2NtcHhjaGctZ3JiLmgKaW5kZXggNDY3NmJmNS4uZjg0OGRlYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9jbXB4Y2hnLWdyYi5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vY21weGNoZy1ncmIuaApAQCAtMTUsOCArMTUsOSBAQAogCQkiICAgbW92LmwgICAlMiwgICBAJTEgICAgIFxuXHQiIC8qIHN0b3JlIG5ldyB2YWx1ZSAqLwogCQkiMTogbW92ICAgICByMSwgICByMTUgICAgIFxuXHQiIC8qIExPR09VVCAqLwogCQk6ICI9JnIiIChyZXR2YWwpLAotCQkgICIrciIgIChtKQotCQk6ICJyIiAgICh2YWwpCisJCSAgIityIiAgKG0pLAorCQkgICIrciIgICh2YWwpCQkvKiBpbmhpYml0IHIxNSBvdmVybG9hZGluZyAqLworCQk6CiAJCTogIm1lbW9yeSIsICJyMCIsICJyMSIpOwogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTM2LDggKzM3LDkgQEAKIAkJIiAgIG1vdi5iICAgJTIsICAgQCUxICAgICBcblx0IiAvKiBzdG9yZSBuZXcgdmFsdWUgKi8KIAkJIjE6IG1vdiAgICAgcjEsICAgcjE1ICAgICBcblx0IiAvKiBMT0dPVVQgKi8KIAkJOiAiPSZyIiAocmV0dmFsKSwKLQkJICAiK3IiICAobSkKLQkJOiAiciIgICAodmFsKQorCQkgICIrciIgIChtKSwKKwkJICAiK3IiICAodmFsKQkJLyogaW5oaWJpdCByMTUgb3ZlcmxvYWRpbmcgKi8KKwkJOgogCQk6ICJtZW1vcnkiICwgInIwIiwgInIxIik7CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNTQsMTMgKzU2LDE0IEBACiAJCSIgICBub3AgICAgICAgICAgICAgICAgICAgXG5cdCIKIAkJIiAgIG1vdiAgICByMTUsICAgcjEgICAgICBcblx0IiAvKiByMSA9IHNhdmVkIHNwICovCiAJCSIgICBtb3YgICAgIy04LCAgIHIxNSAgICAgXG5cdCIgLyogTE9HSU4gKi8KLQkJIiAgIG1vdi5sICBAJTEsICAgJTAgICAgICBcblx0IiAvKiBsb2FkICBvbGQgdmFsdWUgKi8KLQkJIiAgIGNtcC9lcSAgJTAsICAgJTIgICAgICBcblx0IgorCQkiICAgbW92LmwgIEAlMywgICAlMCAgICAgIFxuXHQiIC8qIGxvYWQgIG9sZCB2YWx1ZSAqLworCQkiICAgY21wL2VxICAlMCwgICAlMSAgICAgIFxuXHQiCiAJCSIgICBiZiAgICAgICAgICAgIDFmICAgICAgXG5cdCIgLyogaWYgbm90IGVxdWFsICovCi0JCSIgICBtb3YubCAgICUzLCAgIEAlMSAgICAgXG5cdCIgLyogc3RvcmUgbmV3IHZhbHVlICovCisJCSIgICBtb3YubCAgICUyLCAgIEAlMyAgICAgXG5cdCIgLyogc3RvcmUgbmV3IHZhbHVlICovCiAJCSIxOiBtb3YgICAgIHIxLCAgIHIxNSAgICAgXG5cdCIgLyogTE9HT1VUICovCi0JCTogIj0mciIgKHJldHZhbCkKLQkJOiAgInIiICAobSksICJyIiAgKG9sZCksICJyIiAgKG5ldykKKwkJOiAiPSZyIiAocmV0dmFsKSwKKwkJICAiK3IiICAob2xkKSwgIityIiAgKG5ldykgLyogb2xkIG9yIG5ldyBjYW4gYmUgcjE1ICovCisJCTogICJyIiAgKG0pCiAJCTogIm1lbW9yeSIgLCAicjAiLCAicjEiLCAidCIpOwogCiAJcmV0dXJuIHJldHZhbDsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vZGVsYXkuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vZGVsYXkuaAppbmRleCA0YjE2YmY5Li45NjcwZTEyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2RlbGF5LmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9kZWxheS5oCkBAIC0xLDI2ICsxIEBACi0jaWZuZGVmIF9fQVNNX1NIX0RFTEFZX0gKLSNkZWZpbmUgX19BU01fU0hfREVMQVlfSAotCi0vKgotICogQ29weXJpZ2h0IChDKSAxOTkzIExpbnVzIFRvcnZhbGRzCi0gKgotICogRGVsYXkgcm91dGluZXMgY2FsbGluZyBmdW5jdGlvbnMgaW4gYXJjaC9zaC9saWIvZGVsYXkuYwotICovCi0KLWV4dGVybiB2b2lkIF9fYmFkX3VkZWxheSh2b2lkKTsKLWV4dGVybiB2b2lkIF9fYmFkX25kZWxheSh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7Ci1leHRlcm4gdm9pZCBfX25kZWxheSh1bnNpZ25lZCBsb25nIG5zZWNzKTsKLWV4dGVybiB2b2lkIF9fY29uc3RfdWRlbGF5KHVuc2lnbmVkIGxvbmcgeGxvb3BzKTsKLWV4dGVybiB2b2lkIF9fZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcyk7Ci0KLSNkZWZpbmUgdWRlbGF5KG4pIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKLQkoKG4pID4gMjAwMDAgPyBfX2JhZF91ZGVsYXkoKSA6IF9fY29uc3RfdWRlbGF5KChuKSAqIDB4MTBjNnVsKSkgOiBcCi0JX191ZGVsYXkobikpCi0KLSNkZWZpbmUgbmRlbGF5KG4pIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKLQkoKG4pID4gMjAwMDAgPyBfX2JhZF9uZGVsYXkoKSA6IF9fY29uc3RfdWRlbGF5KChuKSAqIDV1bCkpIDogXAotCV9fbmRlbGF5KG4pKQotCi0jZW5kaWYgLyogX19BU01fU0hfREVMQVlfSCAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9tbXpvbmUuaAppbmRleCA4ODg3YmFmLi4xNWE4NDk2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL21tem9uZS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vbW16b25lLmgKQEAgLTksMTAgKzksNiBAQAogZXh0ZXJuIHN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW107CiAjZGVmaW5lIE5PREVfREFUQShuaWQpCQkobm9kZV9kYXRhW25pZF0pCiAKLSNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQotI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuICsgXAotCQkJCSBOT0RFX0RBVEEobmlkKS0+bm9kZV9zcGFubmVkX3BhZ2VzKQotCiBzdGF0aWMgaW5saW5lIGludCBwZm5fdG9fbmlkKHVuc2lnbmVkIGxvbmcgcGZuKQogewogCWludCBuaWQ7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvcl82NC5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wcm9jZXNzb3JfNjQuaAppbmRleCAyYTU0MWRkLi5lMjVjNGM3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvcl82NC5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcHJvY2Vzc29yXzY0LmgKQEAgLTE1MCw3ICsxNTAsNiBAQAogI2RlZmluZSBTUl9VU0VSIChTUl9NTVUgfCBTUl9GRCkKIAogI2RlZmluZSBzdGFydF90aHJlYWQoX3JlZ3MsIG5ld19wYywgbmV3X3NwKQkJCVwKLQlzZXRfZnMoVVNFUl9EUyk7CQkJCQlcCiAJX3JlZ3MtPnNyID0gU1JfVVNFUjsJLyogVXNlciBtb2RlLiAqLwkJXAogCV9yZWdzLT5wYyA9IG5ld19wYyAtIDQ7CS8qIENvbXBlbnNhdGUgc3lzY2FsbCBleGl0ICovCVwKIAlfcmVncy0+cGMgfD0gMTsJCS8qIFNldCBTSG1lZGlhICEgKi8JCVwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3MjQuaCBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3MjQuaAppbmRleCAzZGFlZjhlLi5jYmM0N2U2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzI0LmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzcyNC5oCkBAIC0yOTgsNiArMjk4LDE0IEBACiAJU0hETUFfU0xBVkVfU0NJRjRfUlgsCiAJU0hETUFfU0xBVkVfU0NJRjVfVFgsCiAJU0hETUFfU0xBVkVfU0NJRjVfUlgsCisJU0hETUFfU0xBVkVfVVNCMEQwX1RYLAorCVNIRE1BX1NMQVZFX1VTQjBEMF9SWCwKKwlTSERNQV9TTEFWRV9VU0IwRDFfVFgsCisJU0hETUFfU0xBVkVfVVNCMEQxX1JYLAorCVNIRE1BX1NMQVZFX1VTQjFEMF9UWCwKKwlTSERNQV9TTEFWRV9VU0IxRDBfUlgsCisJU0hETUFfU0xBVkVfVVNCMUQxX1RYLAorCVNIRE1BX1NMQVZFX1VTQjFEMV9SWCwKIAlTSERNQV9TTEFWRV9TREhJMF9UWCwKIAlTSERNQV9TTEFWRV9TREhJMF9SWCwKIAlTSERNQV9TTEFWRV9TREhJMV9UWCwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcGVyZl9ldmVudC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wZXJmX2V2ZW50LmMKaW5kZXggNzQ4OTU1ZC4uZmE0ZjcyNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wZXJmX2V2ZW50LmMKQEAgLTE4MCw2ICsxODAsMjEgQEAKIAkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCiAJCX0sCiAJfSwKKworCVsgQyhOT0RFKSBdID0geworCQlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCQl9LAorCQlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwkJfSwKKwkJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJCX0sCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgc2g3NzUwX2V2ZW50X21hcChpbnQgZXZlbnQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9wZXJmX2V2ZW50LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9wZXJmX2V2ZW50LmMKaW5kZXggMTdlNmJlYi4uODRhMmMzOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3BlcmZfZXZlbnQuYwpAQCAtMjA1LDYgKzIwNSwyMSBAQAogCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKIAkJfSwKIAl9LAorCisJWyBDKE5PREUpIF0gPSB7CisJCVsgQyhPUF9SRUFEKSBdID0geworCQkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJCX0sCisJCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCQl9LAorCQlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwkJfSwKKwl9LAogfTsKIAogc3RhdGljIGludCBzaDRhX2V2ZW50X21hcChpbnQgZXZlbnQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjQuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCmluZGV4IDAzMzNmZTkuLjEzNGEzOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCkBAIC05Myw2ICs5Myw0NiBAQAogCQkuY2hjcgkJPSBETV9JTkMgfCBTTV9GSVggfCAweDgwMCB8IFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4MzYsCiAJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IwRDBfVFgsCisJCS5hZGRyCQk9IDB4QTREODAxMDAsCisJCS5jaGNyCQk9IERNX0ZJWCB8IFNNX0lOQyB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4NzMsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IwRDBfUlgsCisJCS5hZGRyCQk9IDB4QTREODAxMDAsCisJCS5jaGNyCQk9IERNX0lOQyB8IFNNX0ZJWCB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4NzMsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IwRDFfVFgsCisJCS5hZGRyCQk9IDB4QTREODAxMjAsCisJCS5jaGNyCQk9IERNX0ZJWCB8IFNNX0lOQyB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4NzcsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IwRDFfUlgsCisJCS5hZGRyCQk9IDB4QTREODAxMjAsCisJCS5jaGNyCQk9IERNX0lOQyB8IFNNX0ZJWCB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4NzcsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IxRDBfVFgsCisJCS5hZGRyCQk9IDB4QTREOTAxMDAsCisJCS5jaGNyCQk9IERNX0ZJWCB8IFNNX0lOQyB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4YWIsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IxRDBfUlgsCisJCS5hZGRyCQk9IDB4QTREOTAxMDAsCisJCS5jaGNyCQk9IERNX0lOQyB8IFNNX0ZJWCB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4YWIsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IxRDFfVFgsCisJCS5hZGRyCQk9IDB4QTREOTAxMjAsCisJCS5jaGNyCQk9IERNX0ZJWCB8IFNNX0lOQyB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4YWYsCisJfSwgeworCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9VU0IxRDFfUlgsCisJCS5hZGRyCQk9IDB4QTREOTAxMjAsCisJCS5jaGNyCQk9IERNX0lOQyB8IFNNX0ZJWCB8IDB4ODAwIHwgVFNfSU5ERVgyVkFMKFhNSVRfU1pfMzJCSVQpLAorCQkubWlkX3JpZAk9IDB4YWYsCisJfSwgewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9TREhJMF9UWCwKIAkJLmFkZHIJCT0gMHgwNGNlMDAzMCwKIAkJLmNoY3IJCT0gRE1fRklYIHwgU01fSU5DIHwgMHg4MDAgfCBUU19JTkRFWDJWQUwoWE1JVF9TWl8xNkJJVCksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3NTcuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc1Ny5jCmluZGV4IDQyM2RhYmYuLmU5MTVkZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc1Ny5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc1Ny5jCkBAIC0xODMsNyArMTgzLDcgQEAKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1NDSUYyX1JYLAogCQkuYWRkcgkJPSAweDFmNGIwMDE0LAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCiAJCS5taWRfcmlkCT0gMHgyMiwKIAl9LApAQCAtMTk3LDcgKzE5Nyw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9TQ0lGM19SWCwKIAkJLmFkZHIJCT0gMHgxZjRjMDAxNCwKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4MmEsCiAJfSwKQEAgLTIxMSw3ICsyMTEsNyBAQAogCXsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfU0NJRjRfUlgsCiAJCS5hZGRyCQk9IDB4MWY0ZDAwMTQsCi0JCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CisJCS5jaGNyCQk9IERNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweDQyLAogCX0sCkBAIC0yMjgsNyArMjI4LDcgQEAKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1JJSUMwX1JYLAogCQkuYWRkcgkJPSAweDFlNTAwMDEzLAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCiAJCS5taWRfcmlkCT0gMHgyMiwKIAl9LApAQCAtMjQyLDcgKzI0Miw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDMV9SWCwKIAkJLmFkZHIJCT0gMHgxZTUxMDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4MmEsCiAJfSwKQEAgLTI1Niw3ICsyNTYsNyBAQAogCXsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfUklJQzJfUlgsCiAJCS5hZGRyCQk9IDB4MWU1MjAwMTMsCi0JCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CisJCS5jaGNyCQk9IERNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweGEyLAogCX0sCkBAIC0yNjUsMTIgKzI2NSwxMiBAQAogCQkuYWRkcgkJPSAweDFlNTMwMDEyLAogCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCi0JCS5taWRfcmlkCT0gMHhhYiwKKwkJLm1pZF9yaWQJPSAweGE5LAogCX0sCiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDM19SWCwKIAkJLmFkZHIJCT0gMHgxZTUzMDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4YWYsCiAJfSwKQEAgLTI3OSwxNCArMjc5LDE0IEBACiAJCS5hZGRyCQk9IDB4MWU1NDAwMTIsCiAJCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKLQkJLm1pZF9yaWQJPSAweGMxLAorCQkubWlkX3JpZAk9IDB4YzUsCiAJfSwKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1JJSUM0X1JYLAogCQkuYWRkcgkJPSAweDFlNTQwMDEzLAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCi0JCS5taWRfcmlkCT0gMHhjMiwKKwkJLm1pZF9yaWQJPSAweGM2LAogCX0sCiB9OwogCkBAIC0zMDEsNyArMzAxLDcgQEAKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1JJSUM1X1JYLAogCQkuYWRkcgkJPSAweDFlNTUwMDEzLAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCiAJCS5taWRfcmlkCT0gMHgyMiwKIAl9LApAQCAtMzE1LDcgKzMxNSw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDNl9SWCwKIAkJLmFkZHIJCT0gMHgxZTU2MDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4MmEsCiAJfSwKQEAgLTMyOSw3ICszMjksNyBAQAogCXsKIAkJLnNsYXZlX2lkCT0gU0hETUFfU0xBVkVfUklJQzdfUlgsCiAJCS5hZGRyCQk9IDB4MWU1NzAwMTMsCi0JCS5jaGNyCQk9IFNNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CisJCS5jaGNyCQk9IERNX0lOQyB8IDB4ODAwIHwgMHg0MDAwMDAwMCB8CiAJCQkJICBUU19JTkRFWDJWQUwoWE1JVF9TWl84QklUKSwKIAkJLm1pZF9yaWQJPSAweDQyLAogCX0sCkBAIC0zNDMsNyArMzQzLDcgQEAKIAl7CiAJCS5zbGF2ZV9pZAk9IFNIRE1BX1NMQVZFX1JJSUM4X1JYLAogCQkuYWRkcgkJPSAweDFlNTgwMDEzLAotCQkuY2hjcgkJPSBTTV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAorCQkuY2hjcgkJPSBETV9JTkMgfCAweDgwMCB8IDB4NDAwMDAwMDAgfAogCQkJCSAgVFNfSU5ERVgyVkFMKFhNSVRfU1pfOEJJVCksCiAJCS5taWRfcmlkCT0gMHg0NiwKIAl9LApAQCAtMzU3LDcgKzM1Nyw3IEBACiAJewogCQkuc2xhdmVfaWQJPSBTSERNQV9TTEFWRV9SSUlDOV9SWCwKIAkJLmFkZHIJCT0gMHgxZTU5MDAxMywKLQkJLmNoY3IJCT0gU01fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKKwkJLmNoY3IJCT0gRE1fSU5DIHwgMHg4MDAgfCAweDQwMDAwMDAwIHwKIAkJCQkgIFRTX0lOREVYMlZBTChYTUlUX1NaXzhCSVQpLAogCQkubWlkX3JpZAk9IDB4NTIsCiAJfSwKQEAgLTY1OSw2ICs2NTksNTQgQEAKIAkucmVzb3VyY2UJPSBzcGkwX3Jlc291cmNlcywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiX2VoY2lfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweGZlNGYxMDAwLAorCQkuZW5kCT0gMHhmZTRmMTBmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDU3LAorCQkuZW5kCT0gNTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB1c2JfZWhjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX2VoY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2ID0geworCQkuZG1hX21hc2sgPSAmdXNiX2VoY2lfZGV2aWNlLmRldi5jb2hlcmVudF9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1c2JfZWhjaV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHVzYl9laGNpX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiX29oY2lfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweGZlNGYxODAwLAorCQkuZW5kCT0gMHhmZTRmMThmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDU3LAorCQkuZW5kCT0gNTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB1c2Jfb2hjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX29oY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2ID0geworCQkuZG1hX21hc2sgPSAmdXNiX29oY2lfZGV2aWNlLmRldi5jb2hlcmVudF9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1c2Jfb2hjaV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHVzYl9vaGNpX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3NTdfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNjaWYyX2RldmljZSwKIAkmc2NpZjNfZGV2aWNlLApAQCAtNjcwLDYgKzcxOCw4IEBACiAJJmRtYTJfZGV2aWNlLAogCSZkbWEzX2RldmljZSwKIAkmc3BpMF9kZXZpY2UsCisJJnVzYl9laGNpX2RldmljZSwKKwkmdXNiX29oY2lfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2g3NzU3X2RldmljZXNfc2V0dXAodm9pZCkKQEAgLTEwMzksMTMgKzEwODksMTMgQEAKIAogLyogU3VwcG9ydCBmb3IgZXh0ZXJuYWwgaW50ZXJydXB0IHBpbnMgaW4gSVJRIG1vZGUgKi8KIHN0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IHZlY3RvcnNfaXJxMDEyM1tdIF9faW5pdGRhdGEgPSB7Ci0JSU5UQ19WRUNUKElSUTAsIDB4MjQwKSwgSU5UQ19WRUNUKElSUTEsIDB4MjgwKSwKLQlJTlRDX1ZFQ1QoSVJRMiwgMHgyYzApLCBJTlRDX1ZFQ1QoSVJRMywgMHgzMDApLAorCUlOVENfVkVDVChJUlEwLCAweDIwMCksIElOVENfVkVDVChJUlExLCAweDI0MCksCisJSU5UQ19WRUNUKElSUTIsIDB4MjgwKSwgSU5UQ19WRUNUKElSUTMsIDB4MmMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IHZlY3RvcnNfaXJxNDU2N1tdIF9faW5pdGRhdGEgPSB7Ci0JSU5UQ19WRUNUKElSUTQsIDB4MzQwKSwgSU5UQ19WRUNUKElSUTUsIDB4MzgwKSwKLQlJTlRDX1ZFQ1QoSVJRNiwgMHgzYzApLCBJTlRDX1ZFQ1QoSVJRNywgMHgyMDApLAorCUlOVENfVkVDVChJUlE0LCAweDMwMCksIElOVENfVkVDVChJUlE1LCAweDM0MCksCisJSU5UQ19WRUNUKElSUTYsIDB4MzgwKSwgSU5UQ19WRUNUKElSUTcsIDB4M2MwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y19zZW5zZV9yZWcgc2Vuc2VfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKQEAgLTEwNzksMTQgKzExMjksMTQgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IHZlY3RvcnNfaXJsNDU2N1tdIF9faW5pdGRhdGEgPSB7Ci0JSU5UQ19WRUNUKElSTDRfTExMTCwgMHhiMDApLCBJTlRDX1ZFQ1QoSVJMNF9MTExILCAweGIyMCksCi0JSU5UQ19WRUNUKElSTDRfTExITCwgMHhiNDApLCBJTlRDX1ZFQ1QoSVJMNF9MTEhILCAweGI2MCksCi0JSU5UQ19WRUNUKElSTDRfTEhMTCwgMHhiODApLCBJTlRDX1ZFQ1QoSVJMNF9MSExILCAweGJhMCksCi0JSU5UQ19WRUNUKElSTDRfTEhITCwgMHhiYzApLCBJTlRDX1ZFQ1QoSVJMNF9MSEhILCAweGJlMCksCi0JSU5UQ19WRUNUKElSTDRfSExMTCwgMHhjMDApLCBJTlRDX1ZFQ1QoSVJMNF9ITExILCAweGMyMCksCi0JSU5UQ19WRUNUKElSTDRfSExITCwgMHhjNDApLCBJTlRDX1ZFQ1QoSVJMNF9ITEhILCAweGM2MCksCi0JSU5UQ19WRUNUKElSTDRfSEhMTCwgMHhjODApLCBJTlRDX1ZFQ1QoSVJMNF9ISExILCAweGNhMCksCi0JSU5UQ19WRUNUKElSTDRfSEhITCwgMHhjYzApLAorCUlOVENfVkVDVChJUkw0X0xMTEwsIDB4MjAwKSwgSU5UQ19WRUNUKElSTDRfTExMSCwgMHgyMjApLAorCUlOVENfVkVDVChJUkw0X0xMSEwsIDB4MjQwKSwgSU5UQ19WRUNUKElSTDRfTExISCwgMHgyNjApLAorCUlOVENfVkVDVChJUkw0X0xITEwsIDB4MjgwKSwgSU5UQ19WRUNUKElSTDRfTEhMSCwgMHgyYTApLAorCUlOVENfVkVDVChJUkw0X0xISEwsIDB4MmMwKSwgSU5UQ19WRUNUKElSTDRfTEhISCwgMHgyZTApLAorCUlOVENfVkVDVChJUkw0X0hMTEwsIDB4MzAwKSwgSU5UQ19WRUNUKElSTDRfSExMSCwgMHgzMjApLAorCUlOVENfVkVDVChJUkw0X0hMSEwsIDB4MzQwKSwgSU5UQ19WRUNUKElSTDRfSExISCwgMHgzNjApLAorCUlOVENfVkVDVChJUkw0X0hITEwsIDB4MzgwKSwgSU5UQ19WRUNUKElSTDRfSEhMSCwgMHgzYTApLAorCUlOVENfVkVDVChJUkw0X0hISEwsIDB4M2MwKSwKIH07CiAKIHN0YXRpYyBERUNMQVJFX0lOVENfREVTQyhpbnRjX2Rlc2NfaXJsMDEyMywgInNoNzc1Ny1pcmwwMTIzIiwgdmVjdG9yc19pcmwwMTIzLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL3BtX3J1bnRpbWUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9wbV9ydW50aW1lLmMKaW5kZXggNjRjODA3Yy4uYmYyODBjOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL3BtX3J1bnRpbWUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2htb2JpbGUvcG1fcnVudGltZS5jCkBAIC0yNTYsNyArMjU2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGRldl9wb3dlcl9kb21haW4gZGVmYXVsdF9wb3dlcl9kb21haW4gPSB7CitzdGF0aWMgc3RydWN0IGRldl9wbV9kb21haW4gZGVmYXVsdF9wbV9kb21haW4gPSB7CiAJLm9wcyA9IHsKIAkJLnJ1bnRpbWVfc3VzcGVuZCA9IGRlZmF1bHRfcGxhdGZvcm1fcnVudGltZV9zdXNwZW5kLAogCQkucnVudGltZV9yZXN1bWUgPSBkZWZhdWx0X3BsYXRmb3JtX3J1bnRpbWVfcmVzdW1lLApAQCAtMjg1LDcgKzI4NSw3IEBACiAJCWh3YmxrX2Rpc2FibGUoaHdibGtfaW5mbywgaHdibGspOwogCQkvKiBtYWtlIHN1cmUgZHJpdmVyIHJlLWluaXRzIGl0c2VsZiBvbmNlICovCiAJCV9fc2V0X2JpdChQREVWX0FSQ0hEQVRBX0ZMQUdfSU5JVCwgJnBkZXYtPmFyY2hkYXRhLmZsYWdzKTsKLQkJZGV2LT5wd3JfZG9tYWluID0gJmRlZmF1bHRfcG93ZXJfZG9tYWluOworCQlkZXYtPnBtX2RvbWFpbiA9ICZkZWZhdWx0X3BtX2RvbWFpbjsKIAkJYnJlYWs7CiAJLyogVE9ETzogYWRkIEJVU19OT1RJRllfQklORF9EUklWRVIgYW5kIGluY3JlYXNlIGlkbGUgY291bnQgKi8KIAljYXNlIEJVU19OT1RJRllfQk9VTkRfRFJJVkVSOgpAQCAtMjk5LDcgKzI5OSw3IEBACiAJCV9fc2V0X2JpdChQREVWX0FSQ0hEQVRBX0ZMQUdfSU5JVCwgJnBkZXYtPmFyY2hkYXRhLmZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSBCVVNfTk9USUZZX0RFTF9ERVZJQ0U6Ci0JCWRldi0+cHdyX2RvbWFpbiA9IE5VTEw7CisJCWRldi0+cG1fZG9tYWluID0gTlVMTDsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaW9fdHJhcHBlZC5jIGIvYXJjaC9zaC9rZXJuZWwvaW9fdHJhcHBlZC5jCmluZGV4IDMyYzM4NWUuLjBmNjJmNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2lvX3RyYXBwZWQuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pb190cmFwcGVkLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAogCWZvciAoayA9IDA7IGsgPCB0aW9wLT5udW1fcmVzb3VyY2VzOyBrKyspIHsKIAkJcmVzID0gdGlvcC0+cmVzb3VyY2UgKyBrOwotCQlsZW4gKz0gcm91bmR1cCgocmVzLT5lbmQgLSByZXMtPnN0YXJ0KSArIDEsIFBBR0VfU0laRSk7CisJCWxlbiArPSByb3VuZHVwKHJlc291cmNlX3NpemUocmVzKSwgUEFHRV9TSVpFKTsKIAkJZmxhZ3MgfD0gcmVzLT5mbGFnczsKIAl9CiAKQEAgLTg1LDcgKzg1LDcgQEAKIAkJICAgICAgICh1bnNpZ25lZCBsb25nKSh0aW9wLT52aXJ0X2Jhc2UgKyBsZW4pLAogCQkgICAgICAgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8gPyAiaW8iIDogIm1taW8iLAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVzLT5zdGFydCk7Ci0JCWxlbiArPSByb3VuZHVwKChyZXMtPmVuZCAtIHJlcy0+c3RhcnQpICsgMSwgUEFHRV9TSVpFKTsKKwkJbGVuICs9IHJvdW5kdXAocmVzb3VyY2Vfc2l6ZShyZXMpLCBQQUdFX1NJWkUpOwogCX0KIAogCXRpb3AtPm1hZ2ljID0gSU9fVFJBUFBFRF9NQUdJQzsKQEAgLTEyOCw3ICsxMjgsNyBAQAogCQkJCXJldHVybiB0aW9wLT52aXJ0X2Jhc2UgKyB2b2ZmczsKIAkJCX0KIAotCQkJbGVuID0gKHJlcy0+ZW5kIC0gcmVzLT5zdGFydCkgKyAxOworCQkJbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCQkJdm9mZnMgKz0gcm91bmR1cChsZW4sIFBBR0VfU0laRSk7CiAJCX0KIAl9CkBAIC0xNzMsNyArMTczLDcgQEAKIAogCWZvciAoayA9IDA7IGsgPCB0aW9wLT5udW1fcmVzb3VyY2VzOyBrKyspIHsKIAkJcmVzID0gdGlvcC0+cmVzb3VyY2UgKyBrOwotCQlsZW4gPSByb3VuZHVwKChyZXMtPmVuZCAtIHJlcy0+c3RhcnQpICsgMSwgUEFHRV9TSVpFKTsKKwkJbGVuID0gcm91bmR1cChyZXNvdXJjZV9zaXplKHJlcyksIFBBR0VfU0laRSk7CiAJCWlmIChhZGRyZXNzIDwgKHZhZGRyICsgbGVuKSkKIAkJCXJldHVybiByZXMtPnN0YXJ0ICsgKGFkZHJlc3MgLSB2YWRkcik7CiAJCXZhZGRyICs9IGxlbjsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2lycS5jIGIvYXJjaC9zaC9rZXJuZWwvaXJxLmMKaW5kZXggOTE5NzExMC4uYTNlZTkxOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvaXJxLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTI2OCw5ICsyNjksOCBAQAogCQkJdW5zaWduZWQgaW50IG5ld2NwdSA9IGNwdW1hc2tfYW55X2FuZChkYXRhLT5hZmZpbml0eSwKIAkJCQkJCQkgICAgICBjcHVfb25saW5lX21hc2spOwogCQkJaWYgKG5ld2NwdSA+PSBucl9jcHVfaWRzKSB7Ci0JCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiSVJRJXUgbm8gbG9uZ2VyIGFmZmluZSB0byBDUFUldVxuIiwKLQkJCQkJICAgICAgIGlycSwgY3B1KTsKKwkJCQlwcl9pbmZvX3JhdGVsaW1pdGVkKCJJUlEldSBubyBsb25nZXIgYWZmaW5lIHRvIENQVSV1XG4iLAorCQkJCQkJICAgIGlycSwgY3B1KTsKIAogCQkJCWNwdW1hc2tfc2V0YWxsKGRhdGEtPmFmZmluaXR5KTsKIAkJCQluZXdjcHUgPSBjcHVtYXNrX2FueV9hbmQoZGF0YS0+YWZmaW5pdHksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL3NoL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKaW5kZXggZTJhM2FmMy4uYzVhMzNmMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCisrKyBiL2FyY2gvc2gva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJaWYgKGNyYXNoa19yZXMuZW5kID09IGNyYXNoa19yZXMuc3RhcnQpCiAJCWdvdG8gZGlzYWJsZTsKIAotCWNyYXNoX3NpemUgPSBQQUdFX0FMSUdOKGNyYXNoa19yZXMuZW5kIC0gY3Jhc2hrX3Jlcy5zdGFydCArIDEpOworCWNyYXNoX3NpemUgPSBQQUdFX0FMSUdOKHJlc291cmNlX3NpemUoJmNyYXNoa19yZXMpKTsKIAlpZiAoIWNyYXNoa19yZXMuc3RhcnQpIHsKIAkJdW5zaWduZWQgbG9uZyBtYXggPSBtZW1ibG9ja19lbmRfb2ZfRFJBTSgpIC0gbWVtb3J5X2xpbWl0OwogCQljcmFzaGtfcmVzLnN0YXJ0ID0gX19tZW1ibG9ja19hbGxvY19iYXNlKGNyYXNoX3NpemUsIFBBR0VfU0laRSwgbWF4KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL21vZHVsZS5jIGIvYXJjaC9zaC9rZXJuZWwvbW9kdWxlLmMKaW5kZXggMTliMWY4OC4uMWI1MjVkZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvbW9kdWxlLmMKQEAgLTM0LDMwICszNCw2IEBACiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGFzbS9kd2FyZi5oPgogCi12b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQotewotCWlmIChzaXplID09IDApCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIHZtYWxsb2NfZXhlYyhzaXplKTsKLX0KLQotCi0vKiBGcmVlIG1lbW9yeSByZXR1cm5lZCBmcm9tIG1vZHVsZV9hbGxvYyAqLwotdm9pZCBtb2R1bGVfZnJlZShzdHJ1Y3QgbW9kdWxlICptb2QsIHZvaWQgKm1vZHVsZV9yZWdpb24pCi17Ci0JdmZyZWUobW9kdWxlX3JlZ2lvbik7Ci19Ci0KLS8qIFdlIGRvbid0IG5lZWQgYW55dGhpbmcgc3BlY2lhbC4gKi8KLWludCBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsCi0JCQkgICAgICBFbGZfU2hkciAqc2VjaGRycywKLQkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsCi0JCQkgICAgICBzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIGludCBhcHBseV9yZWxvY2F0ZV9hZGQoRWxmMzJfU2hkciAqc2VjaGRycywKIAkJICAgY29uc3QgY2hhciAqc3RydGFiLAogCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCkBAIC0xMzMsMTcgKzEwOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhcHBseV9yZWxvY2F0ZShFbGYzMl9TaGRyICpzZWNoZHJzLAotCQkgICAgICAgY29uc3QgY2hhciAqc3RydGFiLAotCQkgICAgICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAotCQkgICAgICAgdW5zaWduZWQgaW50IHJlbHNlYywKLQkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBSRUwgUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwKLQkgICAgICAgbWUtPm5hbWUpOwotCXJldHVybiAtRU5PRVhFQzsKLX0KLQogaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAogCQkgICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCiAJCSAgICBzdHJ1Y3QgbW9kdWxlICptZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3NfMzIuYyBiL2FyY2gvc2gva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCBiNDczZjBjLi5hYWY2ZDU5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzc18zMi5jCkBAIC0xMDIsOCArMTAyLDYgQEAKIHZvaWQgc3RhcnRfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIG5ld19wYywKIAkJICB1bnNpZ25lZCBsb25nIG5ld19zcCkKIHsKLQlzZXRfZnMoVVNFUl9EUyk7Ci0KIAlyZWdzLT5wciA9IDA7CiAJcmVncy0+c3IgPSBTUl9GRDsKIAlyZWdzLT5wYyA9IG5ld19wYzsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3B0cmFjZV8zMi5jIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlXzMyLmMKaW5kZXggM2Q3YjIwOS4uOTJiM2MyNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcHRyYWNlXzMyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlXzMyLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBwdHJhY2VfdHJpZ2dlcmVkKHN0cnVjdCBwZXJmX2V2ZW50ICpicCwgaW50IG5taSwKK3ZvaWQgcHRyYWNlX3RyaWdnZXJlZChzdHJ1Y3QgcGVyZl9ldmVudCAqYnAsCiAJCSAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHI7CkBAIC05MSw3ICs5MSw4IEBACiAJCWF0dHIuYnBfbGVuID0gSFdfQlJFQUtQT0lOVF9MRU5fMjsKIAkJYXR0ci5icF90eXBlID0gSFdfQlJFQUtQT0lOVF9SOwogCi0JCWJwID0gcmVnaXN0ZXJfdXNlcl9od19icmVha3BvaW50KCZhdHRyLCBwdHJhY2VfdHJpZ2dlcmVkLCB0c2spOworCQlicCA9IHJlZ2lzdGVyX3VzZXJfaHdfYnJlYWtwb2ludCgmYXR0ciwgcHRyYWNlX3RyaWdnZXJlZCwKKwkJCQkJCSBOVUxMLCB0c2spOwogCQlpZiAoSVNfRVJSKGJwKSkKIAkJCXJldHVybiBQVFJfRVJSKGJwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdHJhcHNfMzIuYyBiL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMKaW5kZXggYjUxYTE3MS4uZDkwMDZmOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdHJhcHNfMzIuYworKysgYi9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jCkBAIC0zOTMsNyArMzkzLDcgQEAKIAkgKi8KIAlpZiAoIWV4cGVjdGVkKSB7CiAJCXVuYWxpZ25lZF9maXh1cHNfbm90aWZ5KGN1cnJlbnQsIGluc3RydWN0aW9uLCByZWdzKTsKLQkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0FMSUdOTUVOVF9GQVVMVFMsIDEsIDAsCisJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19BTElHTk1FTlRfRkFVTFRTLCAxLAogCQkJICAgICAgcmVncywgYWRkcmVzcyk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwc182NC5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHNfNjQuYwppbmRleCA2NzEzY2E5Li42NzExMGJlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90cmFwc182NC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RyYXBzXzY0LmMKQEAgLTQzNCw3ICs0MzQsNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0FMSUdOTUVOVF9GQVVMVFMsIDEsIDAsIHJlZ3MsIGFkZHJlc3MpOworCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19BTElHTk1FTlRfRkFVTFRTLCAxLCByZWdzLCBhZGRyZXNzKTsKIAogCWRlc3RyZWcgPSAob3Bjb2RlID4+IDQpICYgMHgzZjsKIAlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CkBAIC01MTIsNyArNTEyLDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19BTElHTk1FTlRfRkFVTFRTLCAxLCAwLCByZWdzLCBhZGRyZXNzKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfQUxJR05NRU5UX0ZBVUxUUywgMSwgcmVncywgYWRkcmVzcyk7CiAKIAlzcmNyZWcgPSAob3Bjb2RlID4+IDQpICYgMHgzZjsKIAlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CkBAIC01ODgsNyArNTg4LDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLCAxLCAwLCByZWdzLCBhZGRyZXNzKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfRU1VTEFUSU9OX0ZBVUxUUywgMSwgcmVncywgYWRkcmVzcyk7CiAKIAlkZXN0cmVnID0gKG9wY29kZSA+PiA0KSAmIDB4M2Y7CiAJaWYgKHVzZXJfbW9kZShyZWdzKSkgewpAQCAtNjY1LDcgKzY2NSw3IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfRU1VTEFUSU9OX0ZBVUxUUywgMSwgMCwgcmVncywgYWRkcmVzcyk7CisJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0VNVUxBVElPTl9GQVVMVFMsIDEsIHJlZ3MsIGFkZHJlc3MpOwogCiAJc3JjcmVnID0gKG9wY29kZSA+PiA0KSAmIDB4M2Y7CiAJaWYgKHVzZXJfbW9kZShyZWdzKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMgYi9hcmNoL3NoL21hdGgtZW11L21hdGguYwppbmRleCBmNzZhNTA5Li45NzcxOTUyIDEwMDY0NAotLS0gYS9hcmNoL3NoL21hdGgtZW11L21hdGguYworKysgYi9hcmNoL3NoL21hdGgtZW11L21hdGguYwpAQCAtNjIwLDcgKzYyMCw3IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCXN0cnVjdCBzaF9mcHVfc29mdF9zdHJ1Y3QgKmZwdSA9ICYodHNrLT50aHJlYWQueHN0YXRlLT5zb2Z0ZnB1KTsKIAotCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLCAxLCAwLCByZWdzLCAwKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfRU1VTEFUSU9OX0ZBVUxUUywgMSwgcmVncywgMCk7CiAKIAlpZiAoISh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1VTRURGUFUpKSB7CiAJCS8qIGluaXRpYWxpemUgb25jZS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vYWxpZ25tZW50LmMgYi9hcmNoL3NoL21tL2FsaWdubWVudC5jCmluZGV4IGIyNTk1YjguLjYyMGZhN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vYWxpZ25tZW50LmMKKysrIGIvYXJjaC9zaC9tbS9hbGlnbm1lbnQuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlIDxhc20vYWxpZ25tZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCkBAIC05NSwxMyArOTYsMTMgQEAKIHZvaWQgdW5hbGlnbmVkX2ZpeHVwc19ub3RpZnkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGluc25fc2l6ZV90IGluc24sCiAJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWlmICh1c2VyX21vZGUocmVncykgJiYgKHNlX3VzZXJtb2RlICYgVU1fV0FSTikgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcl9ub3RpY2UoIkZpeGluZyB1cCB1bmFsaWduZWQgdXNlcnNwYWNlIGFjY2VzcyAiCisJaWYgKHVzZXJfbW9kZShyZWdzKSAmJiAoc2VfdXNlcm1vZGUgJiBVTV9XQVJOKSkKKwkJcHJfbm90aWNlX3JhdGVsaW1pdGVkKCJGaXhpbmcgdXAgdW5hbGlnbmVkIHVzZXJzcGFjZSBhY2Nlc3MgIgogCQkJICAiaW4gXCIlc1wiIHBpZD0lZCBwYz0weCVwIGlucz0weCUwNGh4XG4iLAogCQkJICB0c2stPmNvbW0sIHRhc2tfcGlkX25yKHRzayksCiAJCQkgICh2b2lkICopaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSwgaW5zbik7Ci0JZWxzZSBpZiAoc2Vfa2Vybm1vZGVfd2FybiAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByX25vdGljZSgiRml4aW5nIHVwIHVuYWxpZ25lZCBrZXJuZWwgYWNjZXNzICIKKwllbHNlIGlmIChzZV9rZXJubW9kZV93YXJuKQorCQlwcl9ub3RpY2VfcmF0ZWxpbWl0ZWQoIkZpeGluZyB1cCB1bmFsaWduZWQga2VybmVsIGFjY2VzcyAiCiAJCQkgICJpbiBcIiVzXCIgcGlkPSVkIHBjPTB4JXAgaW5zPTB4JTA0aHhcbiIsCiAJCQkgIHRzay0+Y29tbSwgdGFza19waWRfbnIodHNrKSwKIAkJCSAgKHZvaWQgKilpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpLCBpbnNuKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY2FjaGUtZGVidWdmcy5jIGIvYXJjaC9zaC9tbS9jYWNoZS1kZWJ1Z2ZzLmMKaW5kZXggNTI0MTE0Ni4uMTE1NzI1MSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jYWNoZS1kZWJ1Z2ZzLmMKKysrIGIvYXJjaC9zaC9tbS9jYWNoZS1kZWJ1Z2ZzLmMKQEAgLTI2LDkgKzI2LDkgQEAKIHsKIAl1bnNpZ25lZCBpbnQgY2FjaGVfdHlwZSA9ICh1bnNpZ25lZCBpbnQpZmlsZS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY2FjaGVfaW5mbyAqY2FjaGU7Ci0JdW5zaWduZWQgaW50IHdheXNpemUsIHdheSwgY2FjaGVfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGNjciwgYmFzZTsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBhZGRyc3RhcnQgPSAwOworCXVuc2lnbmVkIGludCB3YXlzaXplLCB3YXk7CisJdW5zaWduZWQgbG9uZyBjY3I7CisJdW5zaWduZWQgbG9uZyBhZGRyc3RhcnQgPSAwOwogCiAJLyoKIAkgKiBHbyB1bmNhY2hlZCBpbW1lZGlhdGVseSBzbyB3ZSBkb24ndCBza2V3IHRoZSByZXN1bHRzIGFueQpAQCAtNDUsMjggKzQ1LDEzIEBACiAJfQogCiAJaWYgKGNhY2hlX3R5cGUgPT0gQ0FDSEVfVFlQRV9EQ0FDSEUpIHsKLQkJYmFzZSA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVk7CisJCWFkZHJzdGFydCA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVk7CiAJCWNhY2hlID0gJmN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlOwogCX0gZWxzZSB7Ci0JCWJhc2UgPSBDQUNIRV9JQ19BRERSRVNTX0FSUkFZOworCQlhZGRyc3RhcnQgPSBDQUNIRV9JQ19BRERSRVNTX0FSUkFZOwogCQljYWNoZSA9ICZjdXJyZW50X2NwdV9kYXRhLmljYWNoZTsKIAl9CiAKLQkvKgotCSAqIER1ZSB0byB0aGUgYW1vdW50IG9mIGRhdGEgd3JpdHRlbiBvdXQgKGRlcGVuZGluZyBvbiB0aGUgY2FjaGUgc2l6ZSksCi0JICogd2UgbWF5IGJlIGl0ZXJhdGVkIG92ZXIgbXVsdGlwbGUgdGltZXMuIEluIHRoaXMgY2FzZSwga2VlcCB0cmFjayBvZgotCSAqIHRoZSBlbnRyeSBwb3NpdGlvbiBpbiBhZGRyc3RhcnQsIGFuZCByZXdpbmQgaXQgd2hlbiB3ZSd2ZSBoaXQgdGhlCi0JICogZW5kIG9mIHRoZSBjYWNoZS4KLQkgKgotCSAqIExpa2V3aXNlLCB0aGUgc2FtZSBjb2RlIGlzIHVzZWQgZm9yIG11bHRpcGxlIGNhY2hlcywgc28gY2FyZSBtdXN0Ci0JICogYmUgdGFrZW4gZm9yIGJvdW5jaW5nIGFkZHJzdGFydCBiYWNrIGFuZCBmb3J0aCBzbyB0aGUgYXBwcm9wcmlhdGUKLQkgKiBjYWNoZSBpcyBoaXQuCi0JICovCi0JY2FjaGVfc2l6ZSA9IGNhY2hlLT53YXlzICogY2FjaGUtPnNldHMgKiBjYWNoZS0+bGluZXN6OwotCWlmICgoKGFkZHJzdGFydCAmIDB4ZmYwMDAwMDApICE9IGJhc2UpIHx8Ci0JICAgICAoYWRkcnN0YXJ0ICYgMHgwMGZmZmZmZikgPiBjYWNoZV9zaXplKQotCQlhZGRyc3RhcnQgPSBiYXNlOwotCiAJd2F5c2l6ZSA9IGNhY2hlLT5zZXRzOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vZmF1bHRfMzIuYyBiL2FyY2gvc2gvbW0vZmF1bHRfMzIuYwppbmRleCBkNGMzNGQ3Li43YmViZDA0IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2ZhdWx0XzMyLmMKKysrIGIvYXJjaC9zaC9tbS9mYXVsdF8zMi5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAlpZiAoKHJlZ3MtPnNyICYgU1JfSU1BU0spICE9IFNSX0lNQVNLKQogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKLQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMsIDEsIDAsIHJlZ3MsIGFkZHJlc3MpOworCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUywgMSwgcmVncywgYWRkcmVzcyk7CiAKIAkvKgogCSAqIElmIHdlJ3JlIGluIGFuIGludGVycnVwdCwgaGF2ZSBubyB1c2VyIGNvbnRleHQgb3IgYXJlIHJ1bm5pbmcKQEAgLTIxMCwxMSArMjEwLDExIEBACiAJfQogCWlmIChmYXVsdCAmIFZNX0ZBVUxUX01BSk9SKSB7CiAJCXRzay0+bWFqX2ZsdCsrOwotCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKLCAxLCAwLAorCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKLCAxLAogCQkJCSAgICAgcmVncywgYWRkcmVzcyk7CiAJfSBlbHNlIHsKIAkJdHNrLT5taW5fZmx0Kys7Ci0JCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4sIDEsIDAsCisJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4sIDEsCiAJCQkJICAgICByZWdzLCBhZGRyZXNzKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vdGxiZmx1c2hfNjQuYyBiL2FyY2gvc2gvbW0vdGxiZmx1c2hfNjQuYwppbmRleCA3ZjU4MTBmLi5lMzQzMGUwIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL3RsYmZsdXNoXzY0LmMKKysrIGIvYXJjaC9zaC9tbS90bGJmbHVzaF82NC5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkvKiBOb3QgYW4gSU8gYWRkcmVzcywgc28gcmVlbmFibGUgaW50ZXJydXB0cyAqLwogCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUywgMSwgMCwgcmVncywgYWRkcmVzcyk7CisJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTLCAxLCByZWdzLCBhZGRyZXNzKTsKIAogCS8qCiAJICogSWYgd2UncmUgaW4gYW4gaW50ZXJydXB0IG9yIGhhdmUgbm8gdXNlcgpAQCAtMjAwLDExICsyMDAsMTEgQEAKIAogCWlmIChmYXVsdCAmIFZNX0ZBVUxUX01BSk9SKSB7CiAJCXRzay0+bWFqX2ZsdCsrOwotCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKLCAxLCAwLAorCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKLCAxLAogCQkJCSAgICAgcmVncywgYWRkcmVzcyk7CiAJfSBlbHNlIHsKIAkJdHNrLT5taW5fZmx0Kys7Ci0JCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4sIDEsIDAsCisJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4sIDEsCiAJCQkJICAgICByZWdzLCBhZGRyZXNzKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvS2NvbmZpZyBiL2FyY2gvc3BhcmMvS2NvbmZpZwppbmRleCBhZjMyZTE3Li4xMDc0ZGRkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL0tjb25maWcKKysrIGIvYXJjaC9zcGFyYy9LY29uZmlnCkBAIC0yNiw3ICsyNiw2IEBACiAJc2VsZWN0IEhBVkVfRE1BX0FQSV9ERUJVRwogCXNlbGVjdCBIQVZFX0FSQ0hfSlVNUF9MQUJFTAogCXNlbGVjdCBIQVZFX0dFTkVSSUNfSEFSRElSUVMKLQlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19ERVBSRUNBVEVECiAJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cKIAlzZWxlY3QgVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaWYgU01QCiAKQEAgLTQyLDYgKzQxLDcgQEAKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVAogCXNlbGVjdCBIQVZFX0tSRVRQUk9CRVMKIAlzZWxlY3QgSEFWRV9LUFJPQkVTCisJc2VsZWN0IEhBVkVfUkNVX1RBQkxFX0ZSRUUgaWYgU01QCiAJc2VsZWN0IEhBVkVfTUVNQkxPQ0sKIAlzZWxlY3QgSEFWRV9TWVNDQUxMX1dSQVBQRVJTCiAJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKQEAgLTgyLDEwICs4Miw2IEBACiAJYm9vbAogCWRlZmF1bHQgeSBpZiBTUEFSQzY0CiAKLWNvbmZpZyBRVUlDS0xJU1QKLQlib29sCi0JZGVmYXVsdCB5IGlmIFNQQVJDNjQKLQogY29uZmlnIFNUQUNLVFJBQ0VfU1VQUE9SVAogCWJvb2wKIAlkZWZhdWx0IHkgaWYgU1BBUkM2NApAQCAtNTI4LDYgKzUyNCwyMyBAQAogY29uZmlnIFBDSV9TWVNDQUxMCiAJZGVmX2Jvb2wgUENJCiAKK2NvbmZpZyBQQ0lDX1BDSQorCWJvb2wKKwlkZXBlbmRzIG9uIFBDSSAmJiBTUEFSQzMyICYmICFTUEFSQ19MRU9OCisJZGVmYXVsdCB5CisKK2NvbmZpZyBMRU9OX1BDSQorCWJvb2wKKwlkZXBlbmRzIG9uIFBDSSAmJiBTUEFSQ19MRU9OCisJZGVmYXVsdCB5CisKK2NvbmZpZyBHUlBDSTIKKwlib29sICJHUlBDSTIgSG9zdCBCcmlkZ2UgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIExFT05fUENJCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHRoZSBHUlBDSTIgSG9zdCBCcmlkZ2UgRHJpdmVyLgorCiBzb3VyY2UgImRyaXZlcnMvcGNpL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9wY21jaWEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZWxmXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2VsZl82NC5oCmluZGV4IGU2Nzg4MDMuLmNmYTljZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZWxmXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9lbGZfNjQuaApAQCAtMTg2LDcgKzE4Niw3IEBACiAJcmV0dXJuIGNhcDsKIH0KIAotI2RlZmluZSBFTEZfSFdDQVAJc3BhcmM2NF9lbGZfaHdjYXAoKTsKKyNkZWZpbmUgRUxGX0hXQ0FQCXNwYXJjNjRfZWxmX2h3Y2FwKCkKIAogLyogVGhpcyB5aWVsZHMgYSBzdHJpbmcgdGhhdCBsZC5zbyB3aWxsIHVzZSB0byBsb2FkIGltcGxlbWVudGF0aW9uCiAgICBzcGVjaWZpYyBsaWJyYXJpZXMgZm9yIG9wdGltaXphdGlvbi4gIFRoaXMgaXMgbW9yZSBzcGVjaWZpYyBpbgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzMyLmgKaW5kZXggNDgyYzc5ZS4uNzQ0MDkxNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Zsb3BweV8zMi5oCkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJcmV0dXJuIHN1bl9mZGMtPmRhdGFfODIwNzI7CiAJY2FzZSA3OiAvKiBGRF9ESVIgKi8KIAkJcmV0dXJuIHN1bl9yZWFkX2RpcigpOwotCX07CisJfQogCXBhbmljKCJzdW5fODIwNzJfZmRfaW5iOiBIb3cgZGlkIEkgZ2V0IGhlcmU/Iik7CiB9CiAKQEAgLTE2MSw3ICsxNjEsNyBAQAogCWNhc2UgNDogLyogRkRfU1RBVFVTICovCiAJCXN1bl9mZGMtPnN0YXR1c184MjA3MiA9IHZhbHVlOwogCQlicmVhazsKLQl9OworCX0KIAlyZXR1cm47CiB9CiAKQEAgLTE4Niw3ICsxODYsNyBAQAogCQlyZXR1cm4gc3VuX2ZkYy0+ZGF0YV84MjA3NzsKIAljYXNlIDc6IC8qIEZEX0RJUiAqLwogCQlyZXR1cm4gc3VuX3JlYWRfZGlyKCk7Ci0JfTsKKwl9CiAJcGFuaWMoInN1bl84MjA3N19mZF9pbmI6IEhvdyBkaWQgSSBnZXQgaGVyZT8iKTsKIH0KIApAQCAtMjEyLDcgKzIxMiw3IEBACiAJY2FzZSAzOiAvKiBGRF9URFIgKi8KIAkJc3VuX2ZkYy0+dGFwZWN0bF84MjA3NyA9IHZhbHVlOwogCQlicmVhazsKLQl9OworCX0KIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Zsb3BweV82NC5oCmluZGV4IDY1OTdjZTguLmJjZWYxZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfNjQuaApAQCAtMTExLDcgKzExMSw3IEBACiAJY2FzZSA3OiAvKiBGRF9ESVIgKi8KIAkJLyogWFhYOiBJcyBEQ0wgb24gMHg4MCBpbiBzdW40bT8gKi8KIAkJcmV0dXJuIHNidXNfcmVhZGIoJnN1bl9mZGMtPmRpcl84MjA3Nyk7Ci0JfTsKKwl9CiAJcGFuaWMoInN1bl84MjA3Ml9mZF9pbmI6IEhvdyBkaWQgSSBnZXQgaGVyZT8iKTsKIH0KIApAQCAtMTM1LDcgKzEzNSw3IEBACiAJY2FzZSA0OiAvKiBGRF9TVEFUVVMgKi8KIAkJc2J1c193cml0ZWIodmFsdWUsICZzdW5fZmRjLT5zdGF0dXNfODIwNzcpOwogCQlicmVhazsKLQl9OworCX0KIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3NfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3NfMzIuaAppbmRleCBkNGQwNzExLi4xNDg0ODkwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFmbGFnc18zMi5oCkBAIC0xOCw3ICsxOCw3IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX2lycV9zYXZlKHZvaWQpOwogZXh0ZXJuIHZvaWQgYXJjaF9sb2NhbF9pcnFfZW5hYmxlKHZvaWQpOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yNiwxNyArMjYsMTcgQEAKIAlyZXR1cm4gZmxhZ3M7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2Ugdm9pZCBhcmNoX2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCiB7CiAJYXJjaF9sb2NhbF9pcnFfc2F2ZSgpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgYXJjaF9pcnFzX2Rpc2FibGVkX2ZsYWdzKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgYm9vbCBhcmNoX2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlyZXR1cm4gKGZsYWdzICYgUFNSX1BJTCkgIT0gMDsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGFyY2hfaXJxc19kaXNhYmxlZCh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIGJvb2wgYXJjaF9pcnFzX2Rpc2FibGVkKHZvaWQpCiB7CiAJcmV0dXJuIGFyY2hfaXJxc19kaXNhYmxlZF9mbGFncyhhcmNoX2xvY2FsX3NhdmVfZmxhZ3MoKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzXzY0LmgKaW5kZXggYWFiOTY5Yy4uMjNjZDI3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFmbGFnc182NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3NfNjQuaApAQCAtMTQsNyArMTQsNyBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKHZvaWQpCitzdGF0aWMgaW5saW5lIG5vdHJhY2UgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yNiw3ICsyNiw3IEBACiAJcmV0dXJuIGZsYWdzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCQkid3JwcgklMCwgJSVwaWwiCkBAIC0zNiw3ICszNiw3IEBACiAJKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIndycHIJJTAsICUlcGlsIgpAQCAtNDYsNyArNDYsNyBAQAogCSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9lbmFibGUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCQkid3JwcgkwLCAlJXBpbCIKQEAgLTU2LDE3ICs1NiwxNyBAQAogCSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFyY2hfaXJxc19kaXNhYmxlZF9mbGFncyh1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBub3RyYWNlIGludCBhcmNoX2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlyZXR1cm4gKGZsYWdzID4gMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFyY2hfaXJxc19kaXNhYmxlZCh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIGludCBhcmNoX2lycXNfZGlzYWJsZWQodm9pZCkKIHsKIAlyZXR1cm4gYXJjaF9pcnFzX2Rpc2FibGVkX2ZsYWdzKGFyY2hfbG9jYWxfc2F2ZV9mbGFncygpKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfaXJxX3NhdmUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfaXJxX3NhdmUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCB0bXA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbGVvbi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uLmgKaW5kZXggNmJkYWYxZS4uYTRlNDU3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uLmgKQEAgLTMxOCw2ICszMTgsOSBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBsZW9uX2J1aWxkX2RldmljZV9pcnEodW5zaWduZWQgaW50IHJlYWxfaXJxLAogCQkJCQkgICBpcnFfZmxvd19oYW5kbGVyX3QgZmxvd19oYW5kbGVyLAogCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgZG9fYWNrKTsKK2V4dGVybiB2b2lkIGxlb25fdXBkYXRlX3ZpcnFfaGFuZGxpbmcodW5zaWduZWQgaW50IHZpcnEsCisJCQkgICAgICBpcnFfZmxvd19oYW5kbGVyX3QgZmxvd19oYW5kbGVyLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGRvX2Fjayk7CiBleHRlcm4gdm9pZCBsZW9uX2NsZWFyX2Nsb2NrX2lycSh2b2lkKTsKIGV4dGVybiB2b2lkIGxlb25fbG9hZF9wcm9maWxlX2lycShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgbGltaXQpOwogZXh0ZXJuIHZvaWQgbGVvbl9pbml0X3RpbWVycyhpcnFfaGFuZGxlcl90IGNvdW50ZXJfZm4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uX3BjaS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uX3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjRiMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2xlb25fcGNpLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIGFzbS9sZW9uX3BjaS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEFlcm9mbGV4IEdhaXNsZXIgQUIsIERhbmllbCBIZWxsc3Ryb20KKyAqLworCisjaWZuZGVmIF9BU01fTEVPTl9QQ0lfSF8KKyNkZWZpbmUgX0FTTV9MRU9OX1BDSV9IXworCisvKiBQQ0kgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworc3RydWN0IGxlb25fcGNpX2luZm8geworCXN0cnVjdCBwY2lfb3BzICpvcHM7CisJc3RydWN0IHJlc291cmNlCWlvX3NwYWNlOworCXN0cnVjdCByZXNvdXJjZQltZW1fc3BhY2U7CisJaW50ICgqbWFwX2lycSkoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKTsKK307CisKK2V4dGVybiB2b2lkIGxlb25fcGNpX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYsCisJCQkJc3RydWN0IGxlb25fcGNpX2luZm8gKmluZm8pOworCisjZW5kaWYgLyogX0FTTV9MRU9OX1BDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tbXpvbmUuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbW16b25lLmgKaW5kZXggZThjNjQ4Ny4uOTlkOWI5ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tbXpvbmUuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21tem9uZS5oCkBAIC04LDggKzgsNiBAQAogZXh0ZXJuIHN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW107CiAKICNkZWZpbmUgTk9ERV9EQVRBKG5pZCkJCShub2RlX2RhdGFbbmlkXSkKLSNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQotI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfZW5kX3BmbikKIAogZXh0ZXJuIGludCBudW1hX2NwdV9sb29rdXBfdGFibGVbXTsKIGV4dGVybiBjcHVtYXNrX3QgbnVtYV9jcHVtYXNrX2xvb2t1cF90YWJsZVtdOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2lfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpXzMyLmgKaW5kZXggMzMyYWM5YS4uMDI5MzlhYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2lfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaV8zMi5oCkBAIC00MiwxMiArNDIsMzMgQEAKIH0KICNlbmRpZgogCi1zdHJ1Y3QgZGV2aWNlX25vZGU7Ci1leHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpwY2lfZGV2aWNlX3RvX09GX25vZGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCisjaWZuZGVmIENPTkZJR19MRU9OX1BDSQogLyogZ2VuZXJpYyBwY2kgc3R1ZmYgKi8KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wY2kuaD4KKyNlbHNlCisvKgorICogT24gTEVPTiBQQ0kgTWVtb3J5IHNwYWNlIGlzIG1hcHBlZCAxOjEgd2l0aCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlLgorICoKKyAqIEkvTyBzcGFjZSBpcyBsb2NhdGVkIGF0IGxvdyA2NEtieXRlcyBpbiBQQ0kgSS9PIHNwYWNlLiBUaGUgSS9PIGFkZHJlc3NlcworICogYXJlIGNvbnZlcnRlZCBpbnRvIENQVSBhZGRyZXNzZXMgdG8gdmlydHVhbCBhZGRyZXNzZXMgdGhhdCBhcmUgbWFwcGVkIHdpdGgKKyAqIE1NVSB0byB0aGUgUENJIEhvc3QgUENJIEkvTyBzcGFjZSB3aW5kb3cgd2hpY2ggYXJlIHRyYW5zbGF0ZWQgdG8gdGhlIGxvdworICogNjRLYnl0ZXMgYnkgdGhlIEhvc3QgY29udHJvbGxlci4KKyAqLworCitleHRlcm4gdm9pZAorcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24sCisJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CisKK2V4dGVybiB2b2lkCitwY2liaW9zX2J1c190b19yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKKwkJCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uKTsKKworc3RhdGljIGlubGluZSBpbnQgcGNpX2dldF9sZWdhY3lfaWRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gUENJX0lSUV9OT05FOworfQorI2VuZGlmCiAKICNlbmRpZiAvKiBfX1NQQVJDX1BDSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaV82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2lfNjQuaAppbmRleCA5NDhiNjg2Li4yNjE0ZDk2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaV82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpXzY0LmgKQEAgLTkxLDkgKzkxLDYgQEAKIAlyZXR1cm4gUENJX0lSUV9OT05FOwogfQogCi1zdHJ1Y3QgZGV2aWNlX25vZGU7Ci1leHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpwY2lfZGV2aWNlX3RvX09GX25vZGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotCiAjZGVmaW5lIEhBVkVfQVJDSF9QQ0lfUkVTT1VSQ0VfVE9fVVNFUgogZXh0ZXJuIHZvaWQgcGNpX3Jlc291cmNlX3RvX3VzZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwKIAkJCQkgY29uc3Qgc3RydWN0IHJlc291cmNlICpyc3JjLApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2ljLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaWMuaAppbmRleCA3ZWI1ZDc4Li42Njc2Y2JjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaWMuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaWMuaApAQCAtMjksNyArMjksNyBAQAogCWludAkJCXBjaWNfaW1kaW07CiB9OwogCi0jaWZkZWYgQ09ORklHX1BDSQorI2lmZGVmIENPTkZJR19QQ0lDX1BDSQogZXh0ZXJuIGludCBwY2ljX3ByZXNlbnQodm9pZCk7CiBleHRlcm4gaW50IHBjaWNfcHJvYmUodm9pZCk7CiBleHRlcm4gdm9pZCBwY2lfdGltZV9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wZ2FsbG9jXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BnYWxsb2NfNjQuaAppbmRleCA0ZTVlMDg3Li40MGIyZDdhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BnYWxsb2NfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BnYWxsb2NfNjQuaApAQCAtNSw3ICs1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3F1aWNrbGlzdC5oPgogCiAjaW5jbHVkZSA8YXNtL3NwaXRmaXJlLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWRhdGEuaD4KQEAgLTE0LDcxICsxMywxMTQgQEAKIAogLyogUGFnZSB0YWJsZSBhbGxvY2F0aW9uL2ZyZWVpbmcuICovCiAKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqcGd0YWJsZV9jYWNoZTsKKwogc3RhdGljIGlubGluZSBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCXJldHVybiBxdWlja2xpc3RfYWxsb2MoMCwgR0ZQX0tFUk5FTCwgTlVMTCk7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MocGd0YWJsZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZ2RfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCkKIHsKLQlxdWlja2xpc3RfZnJlZSgwLCBOVUxMLCBwZ2QpOworCWttZW1fY2FjaGVfZnJlZShwZ3RhYmxlX2NhY2hlLCBwZ2QpOwogfQogCiAjZGVmaW5lIHB1ZF9wb3B1bGF0ZShNTSwgUFVELCBQTUQpCXB1ZF9zZXQoUFVELCBQTUQpCiAKIHN0YXRpYyBpbmxpbmUgcG1kX3QgKnBtZF9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlyZXR1cm4gcXVpY2tsaXN0X2FsbG9jKDAsIEdGUF9LRVJORUwsIE5VTEwpOworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKHBndGFibGVfY2FjaGUsCisJCQkJR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcG1kX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQpCiB7Ci0JcXVpY2tsaXN0X2ZyZWUoMCwgTlVMTCwgcG1kKTsKKwlrbWVtX2NhY2hlX2ZyZWUocGd0YWJsZV9jYWNoZSwgcG1kKTsKIH0KIAogc3RhdGljIGlubGluZSBwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCXJldHVybiBxdWlja2xpc3RfYWxsb2MoMCwgR0ZQX0tFUk5FTCwgTlVMTCk7CisJcmV0dXJuIChwdGVfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfUkVQRUFUIHwgX19HRlBfWkVSTyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgcGd0YWJsZV90IHB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl2b2lkICpwZzsKKwlwdGVfdCAqcHRlOwogCi0JcGcgPSBxdWlja2xpc3RfYWxsb2MoMCwgR0ZQX0tFUk5FTCwgTlVMTCk7Ci0JaWYgKCFwZykKKwlwdGUgPSBwdGVfYWxsb2Nfb25lX2tlcm5lbChtbSwgYWRkcmVzcyk7CisJaWYgKCFwdGUpCiAJCXJldHVybiBOVUxMOwotCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGcpOworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocHRlKTsKIAlwZ3RhYmxlX3BhZ2VfY3RvcihwYWdlKTsKIAlyZXR1cm4gcGFnZTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcHRlX3QgKnB0ZSkKIHsKLQlxdWlja2xpc3RfZnJlZSgwLCBOVUxMLCBwdGUpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwdGUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBndGFibGVfdCBwdGVwYWdlKQogewogCXBndGFibGVfcGFnZV9kdG9yKHB0ZXBhZ2UpOwotCXF1aWNrbGlzdF9mcmVlX3BhZ2UoMCwgTlVMTCwgcHRlcGFnZSk7CisJX19mcmVlX3BhZ2UocHRlcGFnZSk7CiB9CiAKLQogI2RlZmluZSBwbWRfcG9wdWxhdGVfa2VybmVsKE1NLCBQTUQsIFBURSkJcG1kX3NldChQTUQsIFBURSkKICNkZWZpbmUgcG1kX3BvcHVsYXRlKE1NLFBNRCxQVEVfUEFHRSkJCVwKIAlwbWRfcG9wdWxhdGVfa2VybmVsKE1NLFBNRCxwYWdlX2FkZHJlc3MoUFRFX1BBR0UpKQogI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKIAotc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3BndF9jYWNoZSh2b2lkKQorI2RlZmluZSBjaGVja19wZ3RfY2FjaGUoKQlkbyB7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZ3RhYmxlX2ZyZWUodm9pZCAqdGFibGUsIGJvb2wgaXNfcGFnZSkKIHsKLQlxdWlja2xpc3RfdHJpbSgwLCBOVUxMLCAyNSwgMTYpOworCWlmIChpc19wYWdlKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdGFibGUpOworCWVsc2UKKwkJa21lbV9jYWNoZV9mcmVlKHBndGFibGVfY2FjaGUsIHRhYmxlKTsKIH0KIAotI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIsIHB0ZSwgYWRkcikJcHRlX2ZyZWUoKHRsYiktPm1tLCBwdGUpCi0jZGVmaW5lIF9fcG1kX2ZyZWVfdGxiKHRsYiwgcG1kLCBhZGRyKQlwbWRfZnJlZSgodGxiKS0+bW0sIHBtZCkKKyNpZmRlZiBDT05GSUdfU01QCisKK3N0cnVjdCBtbXVfZ2F0aGVyOworZXh0ZXJuIHZvaWQgdGxiX3JlbW92ZV90YWJsZShzdHJ1Y3QgbW11X2dhdGhlciAqLCB2b2lkICopOworCitzdGF0aWMgaW5saW5lIHZvaWQgcGd0YWJsZV9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCB2b2lkICp0YWJsZSwgYm9vbCBpc19wYWdlKQoreworCXVuc2lnbmVkIGxvbmcgcGdmID0gKHVuc2lnbmVkIGxvbmcpdGFibGU7CisJaWYgKGlzX3BhZ2UpCisJCXBnZiB8PSAweDFVTDsKKwl0bGJfcmVtb3ZlX3RhYmxlKHRsYiwgKHZvaWQgKilwZ2YpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX190bGJfcmVtb3ZlX3RhYmxlKHZvaWQgKl90YWJsZSkKK3sKKwl2b2lkICp0YWJsZSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKV90YWJsZSAmIH4weDFVTCk7CisJYm9vbCBpc19wYWdlID0gZmFsc2U7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpX3RhYmxlICYgMHgxVUwpCisJCWlzX3BhZ2UgPSB0cnVlOworCXBndGFibGVfZnJlZSh0YWJsZSwgaXNfcGFnZSk7Cit9CisjZWxzZSAvKiBDT05GSUdfU01QICovCitzdGF0aWMgaW5saW5lIHZvaWQgcGd0YWJsZV9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCB2b2lkICp0YWJsZSwgYm9vbCBpc19wYWdlKQoreworCXBndGFibGVfZnJlZSh0YWJsZSwgaXNfcGFnZSk7Cit9CisjZW5kaWYgLyogIUNPTkZJR19TTVAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIF9fcHRlX2ZyZWVfdGxiKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHN0cnVjdCBwYWdlICpwdGVwYWdlLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXBndGFibGVfcGFnZV9kdG9yKHB0ZXBhZ2UpOworCXBndGFibGVfZnJlZV90bGIodGxiLCBwYWdlX2FkZHJlc3MocHRlcGFnZSksIHRydWUpOworfQorCisjZGVmaW5lIF9fcG1kX2ZyZWVfdGxiKHRsYiwgcG1kLCBhZGRyKQkJICAgICAgXAorCXBndGFibGVfZnJlZV90bGIodGxiLCBwbWQsIGZhbHNlKQogCiAjZW5kaWYgLyogX1NQQVJDNjRfUEdBTExPQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BndGFibGVfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGd0YWJsZV82NC5oCmluZGV4IDFlMDNjNWEuLmFkZjg5MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGd0YWJsZV82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGd0YWJsZV82NC5oCkBAIC05NSw2ICs5NSwxMCBAQAogLyogUFRFIGJpdHMgd2hpY2ggYXJlIHRoZSBzYW1lIGluIFNVTjRVIGFuZCBTVU40ViBmb3JtYXQuICAqLwogI2RlZmluZSBfUEFHRV9WQUxJRAkgIF9BQygweDgwMDAwMDAwMDAwMDAwMDAsVUwpIC8qIFZhbGlkIFRURSAgICAgICAgICAgICovCiAjZGVmaW5lIF9QQUdFX1IJICAJICBfQUMoMHg4MDAwMDAwMDAwMDAwMDAwLFVMKSAvKiBLZWVwIHJlZiBiaXQgdXB0b2RhdGUqLworI2RlZmluZSBfUEFHRV9TUEVDSUFMICAgICBfQUMoMHgwMjAwMDAwMDAwMDAwMDAwLFVMKSAvKiBTcGVjaWFsIHBhZ2UgICAgICAgICAqLworCisvKiBBZHZlcnRpc2Ugc3VwcG9ydCBmb3IgX1BBR0VfU1BFQ0lBTCAqLworI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU1BFQ0lBTAogCiAvKiBTVU40VSBwdGUgYml0cy4uLiAqLwogI2RlZmluZSBfUEFHRV9TWjRNQl80VQkgIF9BQygweDYwMDAwMDAwMDAwMDAwMDAsVUwpIC8qIDRNQiBQYWdlICAgICAgICAgICAgICovCkBAIC0xMDQsNiArMTA4LDcgQEAKICNkZWZpbmUgX1BBR0VfTkZPXzRVCSAgX0FDKDB4MTAwMDAwMDAwMDAwMDAwMCxVTCkgLyogTm8gRmF1bHQgT25seSAgICAgICAgKi8KICNkZWZpbmUgX1BBR0VfSUVfNFUJICBfQUMoMHgwODAwMDAwMDAwMDAwMDAwLFVMKSAvKiBJbnZlcnQgRW5kaWFubmVzcyAgICAqLwogI2RlZmluZSBfUEFHRV9TT0ZUMl80VQkgIF9BQygweDA3RkMwMDAwMDAwMDAwMDAsVUwpIC8qIFNvZnR3YXJlIGJpdHMsIHNldCAyICovCisjZGVmaW5lIF9QQUdFX1NQRUNJQUxfNFUgIF9BQygweDAyMDAwMDAwMDAwMDAwMDAsVUwpIC8qIFNwZWNpYWwgcGFnZSAgICAgICAgICovCiAjZGVmaW5lIF9QQUdFX1JFUzFfNFUJICBfQUMoMHgwMDAyMDAwMDAwMDAwMDAwLFVMKSAvKiBSZXNlcnZlZCAgICAgICAgICAgICAqLwogI2RlZmluZSBfUEFHRV9TWjMyTUJfNFUJICBfQUMoMHgwMDAxMDAwMDAwMDAwMDAwLFVMKSAvKiAoUGFudGhlcikgMzJNQiBwYWdlICAqLwogI2RlZmluZSBfUEFHRV9TWjI1Nk1CXzRVICBfQUMoMHgyMDAxMDAwMDAwMDAwMDAwLFVMKSAvKiAoUGFudGhlcikgMjU2TUIgcGFnZSAqLwpAQCAtMTMzLDYgKzEzOCw3IEBACiAjZGVmaW5lIF9QQUdFX0FDQ0VTU0VEXzRWIF9BQygweDEwMDAwMDAwMDAwMDAwMDAsVUwpIC8qIEFjY2Vzc2VkIChyZWYnZCkgICAgICovCiAjZGVmaW5lIF9QQUdFX1JFQURfNFYJICBfQUMoMHgwODAwMDAwMDAwMDAwMDAwLFVMKSAvKiBSZWFkYWJsZSBTVyBCaXQgICAgICAqLwogI2RlZmluZSBfUEFHRV9XUklURV80VgkgIF9BQygweDA0MDAwMDAwMDAwMDAwMDAsVUwpIC8qIFdyaXRhYmxlIFNXIEJpdCAgICAgICovCisjZGVmaW5lIF9QQUdFX1NQRUNJQUxfNFYgIF9BQygweDAyMDAwMDAwMDAwMDAwMDAsVUwpIC8qIFNwZWNpYWwgcGFnZSAgICAgICAgICovCiAjZGVmaW5lIF9QQUdFX1BBRERSXzRWCSAgX0FDKDB4MDBGRkZGRkZGRkZGRTAwMCxVTCkgLyogcGFkZHJbNTU6MTNdICAgICAgICAgKi8KICNkZWZpbmUgX1BBR0VfSUVfNFYJICBfQUMoMHgwMDAwMDAwMDAwMDAxMDAwLFVMKSAvKiBJbnZlcnQgRW5kaWFubmVzcyAgICAqLwogI2RlZmluZSBfUEFHRV9FXzRWCSAgX0FDKDB4MDAwMDAwMDAwMDAwMDgwMCxVTCkgLyogc2lkZS1FZmZlY3QgICAgICAgICAgKi8KQEAgLTMwMiwxMCArMzA4LDEwIEBACiAJOiAiPXIiIChtYXNrKSwgIj1yIiAodG1wKQogCTogImkiIChfUEFHRV9QQUREUl80VSB8IF9QQUdFX01PRElGSUVEXzRVIHwgX1BBR0VfQUNDRVNTRURfNFUgfAogCSAgICAgICBfUEFHRV9DUF80VSB8IF9QQUdFX0NWXzRVIHwgX1BBR0VfRV80VSB8IF9QQUdFX1BSRVNFTlRfNFUgfAotCSAgICAgICBfUEFHRV9TWkJJVFNfNFUpLAorCSAgICAgICBfUEFHRV9TWkJJVFNfNFUgfCBfUEFHRV9TUEVDSUFMKSwKIAkgICJpIiAoX1BBR0VfUEFERFJfNFYgfCBfUEFHRV9NT0RJRklFRF80ViB8IF9QQUdFX0FDQ0VTU0VEXzRWIHwKIAkgICAgICAgX1BBR0VfQ1BfNFYgfCBfUEFHRV9DVl80ViB8IF9QQUdFX0VfNFYgfCBfUEFHRV9QUkVTRU5UXzRWIHwKLQkgICAgICAgX1BBR0VfU1pCSVRTXzRWKSk7CisJICAgICAgIF9QQUdFX1NaQklUU180ViB8IF9QQUdFX1NQRUNJQUwpKTsKIAogCXJldHVybiBfX3B0ZSgocHRlX3ZhbChwdGUpICYgbWFzaykgfCAocGdwcm90X3ZhbChwcm90KSAmIH5tYXNrKSk7CiB9CkBAIC01MDIsNiArNTA4LDcgQEAKIAogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtzcGVjaWFsKHB0ZV90IHB0ZSkKIHsKKwlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfU1BFQ0lBTDsKIAlyZXR1cm4gcHRlOwogfQogCkBAIC02MDcsOSArNjE0LDkgQEAKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwdGVfc3BlY2lhbChwdGVfdCBwdGUpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHRlX3NwZWNpYWwocHRlX3QgcHRlKQogewotCXJldHVybiAwOworCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9TUEVDSUFMOwogfQogCiAjZGVmaW5lIHBtZF9zZXQocG1kcCwgcHRlcCkJXApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggYzdhZDNmZS4uYjkyOGIzMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC0yMDUsNiArMjA1LDcgQEAKIH0gd2hpbGUgKDApCiAjZGVmaW5lIHVzZXJfbW9kZShyZWdzKSAoISgocmVncyktPnRzdGF0ZSAmIFRTVEFURV9QUklWKSkKICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT50cGMpCisjZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXJfc2V0KHJlZ3MsIHZhbCkgKChyZWdzKS0+dHBjID0gKHZhbCkpCiAjZGVmaW5lIHVzZXJfc3RhY2tfcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT51X3JlZ3NbVVJFR19GUF0pCiAjZGVmaW5lIHJlZ3NfcmV0dXJuX3ZhbHVlKHJlZ3MpICgocmVncyktPnVfcmVnc1tVUkVHX0kwXSkKICNpZmRlZiBDT05GSUdfU01QCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zeXN0ZW1fMzIuaAppbmRleCA0N2E3ZTg2Li5hYmExNjA5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV8zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzMyLmgKQEAgLTIyMCw3ICsyMjAsNyBAQAogCXN3aXRjaCAoc2l6ZSkgewogCWNhc2UgNDoKIAkJcmV0dXJuIHhjaGdfdTMyKHB0ciwgeCk7Ci0JfTsKKwl9CiAJX194Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKCk7CiAJcmV0dXJuIHg7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zeXN0ZW1fNjQuaAppbmRleCAzYzk2ZDNiLi4xMGJjYWJjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzY0LmgKQEAgLTIzNCw3ICsyMzQsNyBAQAogCQlyZXR1cm4geGNoZzMyKHB0ciwgeCk7CiAJY2FzZSA4OgogCQlyZXR1cm4geGNoZzY0KHB0ciwgeCk7Ci0JfTsKKwl9CiAJX194Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKCk7CiAJcmV0dXJuIHg7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc3BhcmMva2VybmVsL01ha2VmaWxlCmluZGV4IDljZmYyNzAuLmI5MGI0YTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL01ha2VmaWxlCkBAIC03Myw3ICs3Myw5IEBACiAKIG9iai15ICAgICAgICAgICAgICAgICAgICAgKz0gZG1hLm8KIAotb2JqLSQoQ09ORklHX1NQQVJDMzJfUENJKSArPSBwY2ljLm8KK29iai0kKENPTkZJR19QQ0lDX1BDSSkgICAgKz0gcGNpYy5vCitvYmotJChDT05GSUdfTEVPTl9QQ0kpICAgICs9IGxlb25fcGNpLm8KK29iai0kKENPTkZJR19HUlBDSTIpICAgICAgKz0gbGVvbl9wY2lfZ3JwY2kyLm8KIAogb2JqLSQoQ09ORklHX1NNUCkgICAgICAgICArPSB0cmFtcG9saW5lXyQoQklUUykubyBzbXBfJChCSVRTKS5vCiBvYmotJChDT05GSUdfU1BBUkMzMl9TTVApICs9IHN1bjRtX3NtcC5vIHN1bjRkX3NtcC5vIGxlb25fc21wLm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2FwYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvYXBjLmMKaW5kZXggMWUzNGYyOS4uY2FlZjlkZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvYXBjLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvYXBjLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jCmluZGV4IDg1MDVlMGEuLmFjZjUxNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXBhbmljKCJDYW4ndCBzZXQgQVVYSU8gcmVnaXN0ZXIgb24gdGhpcyBtYWNoaW5lLiIpOwotCX07CisJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1eGlvX2xvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woc2V0X2F1eGlvKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2NobWMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2NobWMuYwppbmRleCA2NjhjN2JlLi41ZjQ1MDI2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9jaG1jLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvY2htYy5jCkBAIC02NjQsNyArNjY0LDcgQEAKIAljYXNlIDB4MDoKIAkJYnAtPmludGVybGVhdmUgPSAxNjsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAkvKiBVS1sxMF0gaXMgcmVzZXJ2ZWQsIGFuZCBVS1sxMV0gaXMgbm90IHNldCBmb3IgdGhlIFNEUkFNCiAJICogYmFuayBzaXplIGRlZmluaXRpb24uCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUwppbmRleCA4MzQxOTYzLi5mNDQ1ZTk4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMKQEAgLTIyOSw3ICsyMjksNyBAQAogI2lmZGVmIENPTkZJR19TTVAKIAkuZ2xvYmwJcGF0Y2htZV9tYXliZV9zbXBfbXNnCiAKLQljbXAJJWw3LCAxMgorCWNtcAklbDcsIDExCiBwYXRjaG1lX21heWJlX3NtcF9tc2c6CiAJYmd1CW1heWJlX3NtcDRtX21zZwogCSBub3AKQEAgLTI5Myw3ICsyOTMsNyBAQAogCVdSSVRFX1BBVVNFCiAJd3IJJWw0LCBQU1JfRVQsICVwc3IKIAlXUklURV9QQVVTRQotCXNsbAklbzIsIDI4LCAlbzIJCSEgc2hpZnQgZm9yIHNpbXBsZXIgY2hlY2tzIGJlbG93CisJc3JsCSVvMywgMjgsICVvMgkJISBzaGlmdCBmb3Igc2ltcGxlciBjaGVja3MgYmVsb3cKIG1heWJlX3NtcDRtX21zZ19jaGVja19zaW5nbGU6CiAJYW5kY2MJJW8yLCAweDEsICVnMAogCWJlcSxhCW1heWJlX3NtcDRtX21zZ19jaGVja19tYXNrCkBAIC0xNjA0LDcgKzE2MDQsNyBAQAogCXJldGwKIAkgbm9wCiAKLSNpZmRlZiBDT05GSUdfUENJCisjaWZkZWYgQ09ORklHX1BDSUNfUENJCiAjaW5jbHVkZSA8YXNtL3BjaWMuaD4KIAogCS5hbGlnbgk0CkBAIC0xNjUwLDcgKzE2NTAsNyBAQAogCSByZAklcHNyLCAlbDAKIAkud29yZAkwCiAKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCisjZW5kaWYgLyogQ09ORklHX1BDSUNfUENJICovCiAKIAkuZ2xvYmwJZmx1c2h3X2FsbAogZmx1c2h3X2FsbDoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKaW5kZXggMWM5YzgwYS4uNmZmY2NkNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKQEAgLTIyOCw3ICsyMjgsNyBAQAogCX0KIAogCXBhICY9IFBBR0VfTUFTSzsKLQlzcGFyY19tYXBpb3JhbmdlKGJ1cywgcGEsIHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCXNwYXJjX21hcGlvcmFuZ2UoYnVzLCBwYSwgcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAogCXJldHVybiAodm9pZCBfX2lvbWVtICopKHVuc2lnbmVkIGxvbmcpKHJlcy0+c3RhcnQgKyBvZmZzZXQpOwogfQpAQCAtMjQwLDcgKzI0MCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBwbGVuOwogCi0JcGxlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJcGxlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAlCVUdfT04oKHBsZW4gJiAoUEFHRV9TSVpFLTEpKSAhPSAwKTsKIAlzcGFyY191bm1hcGlvcmFuZ2UocmVzLT5zdGFydCwgcGxlbik7CiAJcmVsZWFzZV9yZXNvdXJjZShyZXMpOwpAQCAtMzMxLDkgKzMzMSw5IEBACiAJfQogCiAJbiA9IFBBR0VfQUxJR04obik7Ci0JaWYgKChyZXMtPmVuZC1yZXMtPnN0YXJ0KSsxICE9IG4pIHsKKwlpZiAocmVzb3VyY2Vfc2l6ZShyZXMpICE9IG4pIHsKIAkJcHJpbnRrKCJzYnVzX2ZyZWVfY29uc2lzdGVudDogcmVnaW9uIDB4JWx4IGFza2VkIDB4JXp4XG4iLAotCQkgICAgKGxvbmcpKChyZXMtPmVuZC1yZXMtPnN0YXJ0KSsxKSwgbik7CisJCSAgICAobG9uZylyZXNvdXJjZV9zaXplKHJlcyksIG4pOwogCQlyZXR1cm47CiAJfQogCkBAIC01MDQsOSArNTA0LDkgQEAKIAl9CiAKIAluID0gUEFHRV9BTElHTihuKTsKLQlpZiAoKHJlcy0+ZW5kLXJlcy0+c3RhcnQpKzEgIT0gbikgeworCWlmIChyZXNvdXJjZV9zaXplKHJlcykgIT0gbikgewogCQlwcmludGsoInBjaV9mcmVlX2NvbnNpc3RlbnQ6IHJlZ2lvbiAweCVseCBhc2tlZCAweCVseFxuIiwKLQkJICAgIChsb25nKSgocmVzLT5lbmQtcmVzLT5zdGFydCkrMSksIChsb25nKW4pOworCQkgICAgKGxvbmcpcmVzb3VyY2Vfc2l6ZShyZXMpLCAobG9uZyluKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9rZXJuZWwuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fa2VybmVsLmMKaW5kZXggMmY1MzhhYy4uZDE3MjU1YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9rZXJuZWwuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX2tlcm5lbC5jCkBAIC0yMzYsNiArMjM2LDIxIEBACiAJcmV0dXJuIGxlb25fYnVpbGRfZGV2aWNlX2lycShyZWFsX2lycSwgaGFuZGxlX3NpbXBsZV9pcnEsICJlZGdlIiwgMCk7CiB9CiAKK3ZvaWQgbGVvbl91cGRhdGVfdmlycV9oYW5kbGluZyh1bnNpZ25lZCBpbnQgdmlycSwKKwkJCSAgICAgIGlycV9mbG93X2hhbmRsZXJfdCBmbG93X2hhbmRsZXIsCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgZG9fYWNrKQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9ICh1bnNpZ25lZCBsb25nKWlycV9nZXRfY2hpcF9kYXRhKHZpcnEpOworCisJbWFzayAmPSB+TEVPTl9ET19BQ0tfSFc7CisJaWYgKGRvX2FjaykKKwkJbWFzayB8PSBMRU9OX0RPX0FDS19IVzsKKworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHZpcnEsICZsZW9uX2lycSwKKwkJCQkgICAgICBmbG93X2hhbmRsZXIsIG5hbWUpOworCWlycV9zZXRfY2hpcF9kYXRhKHZpcnEsICh2b2lkICopbWFzayk7Cit9CisKIHZvaWQgX19pbml0IGxlb25faW5pdF90aW1lcnMoaXJxX2hhbmRsZXJfdCBjb3VudGVyX2ZuKQogewogCWludCBpcnEsIGVpcnE7CkBAIC0zNjEsNiArMzc2LDIyIEBACiAJCXByb21faGFsdCgpOwogCX0KIAorI2lmZGVmIENPTkZJR19TTVAKKwl7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJLyoKKwkJICogSW4gU01QLCBzdW40bSBhZGRzIGEgSVBJIGhhbmRsZXIgdG8gSVJRIHRyYXAgaGFuZGxlciB0aGF0CisJCSAqIExFT04gbmV2ZXIgbXVzdCB0YWtlLCBzdW40ZCBhbmQgTEVPTiBvdmVyd3JpdGVzIHRoZSBicmFuY2gKKwkJICogd2l0aCBhIE5PUC4KKwkJICovCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJcGF0Y2htZV9tYXliZV9zbXBfbXNnWzBdID0gMHgwMTAwMDAwMDsgLyogTk9QIG91dCB0aGUgYnJhbmNoICovCisJCWxvY2FsX2ZsdXNoX2NhY2hlX2FsbCgpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorI2VuZGlmCisKIAlMRU9OM19CWVBBU1NfU1RPUkVfUEEoJmxlb24zX2dwdGltZXJfcmVncy0+ZVtsZW9uM19ncHRpbWVyX2lkeF0uY3RybCwKIAkJCSAgICAgIExFT04zX0dQVElNRVJfRU4gfAogCQkJICAgICAgTEVPTjNfR1BUSU1FUl9STCB8CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGE5YTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIGxlb25fcGNpLmM6IExFT04gSG9zdCBQQ0kgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBZXJvZmxleCBHYWlzbGVyIEFCLCBEYW5pZWwgSGVsbHN0cm9tCisgKgorICogQ29kZSBpcyBwYXJ0aWFsbHkgZGVyaXZlZCBmcm9tIHBjaWMuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vbGVvbi5oPgorI2luY2x1ZGUgPGFzbS9sZW9uX3BjaS5oPgorCisvKiBUaGUgTEVPTiBhcmNoaXRlY3R1cmUgZG9lcyBub3QgcmVseSBvbiBhIEJJT1Mgb3IgYm9vdGxvYWRlciB0byBzZXR1cAorICogUENJIGZvciB1cy4gVGhlIExpbnV4IGdlbmVyaWMgcm91dGluZXMgYXJlIHVzZWQgdG8gc2V0dXAgcmVzb3VyY2VzLAorICogcmVzZXQgdmFsdWVzIG9mIGNvbmZ1cmF0aW9uLXNwYWNlIHJlZ2lzdGVycyBzZXR0aW5ncyBhZSBwcmVzZXZlZC4KKyAqLwordm9pZCBsZW9uX3BjaV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2LCBzdHJ1Y3QgbGVvbl9wY2lfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqcm9vdF9idXM7CisKKwlyb290X2J1cyA9IHBjaV9zY2FuX2J1c19wYXJlbnRlZCgmb2ZkZXYtPmRldiwgMCwgaW5mby0+b3BzLCBpbmZvKTsKKwlpZiAocm9vdF9idXMpIHsKKwkJcm9vdF9idXMtPnJlc291cmNlWzBdID0gJmluZm8tPmlvX3NwYWNlOworCQlyb290X2J1cy0+cmVzb3VyY2VbMV0gPSAmaW5mby0+bWVtX3NwYWNlOworCQlyb290X2J1cy0+cmVzb3VyY2VbMl0gPSBOVUxMOworCisJCS8qIEluaXQgYWxsIFBDSSBkZXZpY2VzIGludG8gUENJIHRyZWUgKi8KKwkJcGNpX2J1c19hZGRfZGV2aWNlcyhyb290X2J1cyk7CisKKwkJLyogU2V0dXAgSVJRcyBvZiBhbGwgZGV2aWNlcyB1c2luZyBjdXN0b20gcm91dGluZXMgKi8KKwkJcGNpX2ZpeHVwX2lycXMocGNpX2NvbW1vbl9zd2l6emxlLCBpbmZvLT5tYXBfaXJxKTsKKworCQkvKiBBc3NpZ24gZGV2aWNlcyB3aXRoIHJlc291cmNlcyAqLworCQlwY2lfYXNzaWduX3VuYXNzaWduZWRfcmVzb3VyY2VzKCk7CisJfQorfQorCisvKiBQQ0kgTWVtb3J5IGFuZCBQcmVmZXRjaGFibGUgTWVtb3J5IGlzIGRpcmVjdC1tYXBwZWQuIEhvd2V2ZXIgSS9PIFNwYWNlIGlzCisgKiBhY2Nlc3NlZCB0aHJvdWdoIGEgV2luZG93IHdoaWNoIGlzIHRyYW5zbGF0ZWQgdG8gbG93IDY0S0IgaW4gUENJIHNwYWNlLCB0aGUKKyAqIGZpcnN0IDRLQiBpcyBub3QgdXNlZCBzbyA2MEtCIGlzIGF2YWlsYWJsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgZ2VuZXJpYyBjb2RlIHRvIHRyYW5zbGF0ZSByZXNvdXJjZSBhZGRyZXNzZXMgaW50bworICogUENJIGFkZHJlc3Nlcy4KKyAqLwordm9pZCBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbiwKKwkJCSAgICAgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJc3RydWN0IGxlb25fcGNpX2luZm8gKmluZm8gPSBkZXYtPmJ1cy0+c3lzZGF0YTsKKworCXJlZ2lvbi0+c3RhcnQgPSByZXMtPnN0YXJ0OworCXJlZ2lvbi0+ZW5kID0gcmVzLT5lbmQ7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJcmVnaW9uLT5zdGFydCAtPSAoaW5mby0+aW9fc3BhY2Uuc3RhcnQgLSAweDEwMDApOworCQlyZWdpb24tPmVuZCAtPSAoaW5mby0+aW9fc3BhY2Uuc3RhcnQgLSAweDEwMDApOworCX0KK30KK0VYUE9SVF9TWU1CT0wocGNpYmlvc19yZXNvdXJjZV90b19idXMpOworCisvKiBzZWUgcGNpYmlvc19yZXNvdXJjZV90b19idXMoKSBjb21tZW50ICovCit2b2lkIHBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJICAgICBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbikKK3sKKwlzdHJ1Y3QgbGVvbl9wY2lfaW5mbyAqaW5mbyA9IGRldi0+YnVzLT5zeXNkYXRhOworCisJcmVzLT5zdGFydCA9IHJlZ2lvbi0+c3RhcnQ7CisJcmVzLT5lbmQgPSByZWdpb24tPmVuZDsKKworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQlyZXMtPnN0YXJ0ICs9IChpbmZvLT5pb19zcGFjZS5zdGFydCAtIDB4MTAwMCk7CisJCXJlcy0+ZW5kICs9IChpbmZvLT5pb19zcGFjZS5zdGFydCAtIDB4MTAwMCk7CisJfQorfQorRVhQT1JUX1NZTUJPTChwY2liaW9zX2J1c190b19yZXNvdXJjZSk7CisKK3ZvaWQgX19kZXZpbml0IHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpwYnVzKQoreworCXN0cnVjdCBsZW9uX3BjaV9pbmZvICppbmZvID0gcGJ1cy0+c3lzZGF0YTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCWludCBpLCBoYXNfaW8sIGhhc19tZW07CisJdTE2IGNtZDsKKworCS8qIEdlbmVyaWMgUENJIGJ1cyBwcm9iaW5nIHNldHMgdGhlc2UgdG8gcG9pbnQgYXQKKwkgKiAmaW97cG9ydCxtZW19X3Jlc291Y2Ugd2hpY2ggaXMgd3JvbmcgZm9yIHVzLgorCSAqLworCWlmIChwYnVzLT5zZWxmID09IE5VTEwpIHsKKwkJcGJ1cy0+cmVzb3VyY2VbMF0gPSAmaW5mby0+aW9fc3BhY2U7CisJCXBidXMtPnJlc291cmNlWzFdID0gJmluZm8tPm1lbV9zcGFjZTsKKwkJcGJ1cy0+cmVzb3VyY2VbMl0gPSBOVUxMOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcGJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJLyoKKwkJICogV2UgY2FuIG5vdCByZWx5IG9uIHRoYXQgdGhlIGJvb3Rsb2FkZXIgaGFzIGVuYWJsZWQgSS9PCisJCSAqIG9yIG1lbW9yeSBhY2Nlc3MgdG8gUENJIGRldmljZXMuIEluc3RlYWQgd2UgZW5hYmxlIGl0IGhlcmUKKwkJICogaWYgdGhlIGRldmljZSBoYXMgQkFScyBvZiByZXNwZWN0aXZlIHR5cGUuCisJCSAqLworCQloYXNfaW8gPSBoYXNfbWVtID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBmID0gZGV2LT5yZXNvdXJjZVtpXS5mbGFnczsKKwkJCWlmIChmICYgSU9SRVNPVVJDRV9JTykKKwkJCQloYXNfaW8gPSAxOworCQkJZWxzZSBpZiAoZiAmIElPUkVTT1VSQ0VfTUVNKQorCQkJCWhhc19tZW0gPSAxOworCQl9CisJCS8qIFJPTSBCQVJzIGFyZSBtYXBwZWQgaW50byAzMi1iaXQgbWVtb3J5IHNwYWNlICovCisJCWlmIChkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmVuZCAhPSAwKSB7CisJCQlkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzIHw9CisJCQkJCQkJSU9SRVNPVVJDRV9ST01fRU5BQkxFOworCQkJaGFzX21lbSA9IDE7CisJCX0KKwkJcGNpX2J1c19yZWFkX2NvbmZpZ193b3JkKHBidXMsIGRldi0+ZGV2Zm4sIFBDSV9DT01NQU5ELCAmY21kKTsKKwkJaWYgKGhhc19pbyAmJiAhKGNtZCAmIFBDSV9DT01NQU5EX0lPKSkgeworI2lmZGVmIENPTkZJR19QQ0lfREVCVUcKKwkJCXByaW50ayhLRVJOX0lORk8gIkxFT05QQ0k6IEVuYWJsaW5nIEkvTyBmb3IgZGV2ICVzXG4iLAorCQkJCQkgcGNpX25hbWUoZGV2KSk7CisjZW5kaWYKKwkJCWNtZCB8PSBQQ0lfQ09NTUFORF9JTzsKKwkJCXBjaV9idXNfd3JpdGVfY29uZmlnX3dvcmQocGJ1cywgZGV2LT5kZXZmbiwgUENJX0NPTU1BTkQsCisJCQkJCQkJCQljbWQpOworCQl9CisJCWlmIChoYXNfbWVtICYmICEoY21kICYgUENJX0NPTU1BTkRfTUVNT1JZKSkgeworI2lmZGVmIENPTkZJR19QQ0lfREVCVUcKKwkJCXByaW50ayhLRVJOX0lORk8gIkxFT05QQ0k6IEVuYWJsaW5nIE1FTU9SWSBmb3IgZGV2IgorCQkJCQkgIiVzXG4iLCBwY2lfbmFtZShkZXYpKTsKKyNlbmRpZgorCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKKwkJCXBjaV9idXNfd3JpdGVfY29uZmlnX3dvcmQocGJ1cywgZGV2LT5kZXZmbiwgUENJX0NPTU1BTkQsCisJCQkJCQkJCQljbWQpOworCQl9CisJfQorfQorCisvKgorICogT3RoZXIgYXJjaHMgcGFyc2UgYXJndW1lbnRzIGhlcmUuCisgKi8KK2NoYXIgKiBfX2RldmluaXQgcGNpYmlvc19zZXR1cChjaGFyICpzdHIpCit7CisJcmV0dXJuIHN0cjsKK30KKworcmVzb3VyY2Vfc2l6ZV90IHBjaWJpb3NfYWxpZ25fcmVzb3VyY2Uodm9pZCAqZGF0YSwgY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJcmVzb3VyY2Vfc2l6ZV90IHNpemUsIHJlc291cmNlX3NpemVfdCBhbGlnbikKK3sKKwlyZXR1cm4gcmVzLT5zdGFydDsKK30KKworaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKK3sKKwlyZXR1cm4gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBtYXNrKTsKK30KKworc3RydWN0IGRldmljZV9ub2RlICpwY2lfZGV2aWNlX3RvX09GX25vZGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJLyoKKwkgKiBDdXJyZW50bHkgdGhlIE9wZW5Cb290IG5vZGVzIGFyZSBub3QgY29ubmVjdGVkIHdpdGggdGhlIFBDSSBkZXZpY2UsCisJICogdGhpcyBpcyBiZWNhdXNlIHRoZSBMRU9OIFBST00gZG9lcyBub3QgY3JlYXRlIFBDSSBub2Rlcy4gRXZlbnR1YWxseQorCSAqIHRoaXMgd2lsbCBjaGFuZ2UgYW5kIHRoZSBzYW1lIGFwcHJvYWNoIGFzIHBjaWMuYyBjYW4gYmUgdXNlZCB0bworCSAqIG1hdGNoIFBST00gbm9kZXMgd2l0aCBwY2kgZGV2aWNlcy4KKwkgKi8KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wocGNpX2RldmljZV90b19PRl9ub2RlKTsKKwordm9pZCBfX2RldmluaXQgcGNpYmlvc191cGRhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpcnEpCit7CisjaWZkZWYgQ09ORklHX1BDSV9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJMRU9OUENJOiBBc3NpZ25pbmcgSVJRICUwMmQgdG8gJXNcbiIsIGlycSwKKwkJcGNpX25hbWUoZGV2KSk7CisjZW5kaWYKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGlycSk7Cit9CisKKy8qIGluL291dCByb3V0aW5lcyB0YWtlbiBmcm9tIHBjaWMuYworICoKKyAqIFRoaXMgcHJvYmFibHkgYmVsb25ncyBoZXJlIHJhdGhlciB0aGFuIGlvcG9ydC5jIGJlY2F1c2UKKyAqIHdlIGRvIG5vdCB3YW50IHRoaXMgY3J1ZCBsaW5rZWQgaW50byBTQnVzIGtlcm5lbHMuCisgKiBBbHNvLCB0aGluayBmb3IgYSBtb21lbnQgYWJvdXQgbGlrZXMgb2YgZmxvcHB5LmMgdGhhdAorICogaW5jbHVkZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgcGFydHMuIFRoZXkgbWF5IHdhbnQgdG8gcmVkZWZpbmUgaW5zL291dHMuCisgKgorICogV2UgZG8gbm90IHVzZSBob3JyaWJsZSBtYWNyb3MgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8KKyAqIGFkdmFuY2UgcG9pbnRlciBieSBzaXplb2Yoc2l6ZSkuCisgKi8KK3ZvaWQgb3V0c2IodW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJd2hpbGUgKGNvdW50KSB7CisJCWNvdW50IC09IDE7CisJCW91dGIoKihjb25zdCBjaGFyICopc3JjLCBhZGRyKTsKKwkJc3JjICs9IDE7CisJCS8qIGFkZHIgKz0gMTsgKi8KKwl9Cit9CitFWFBPUlRfU1lNQk9MKG91dHNiKTsKKwordm9pZCBvdXRzdyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl3aGlsZSAoY291bnQpIHsKKwkJY291bnQgLT0gMjsKKwkJb3V0dygqKGNvbnN0IHNob3J0ICopc3JjLCBhZGRyKTsKKwkJc3JjICs9IDI7CisJCS8qIGFkZHIgKz0gMjsgKi8KKwl9Cit9CitFWFBPUlRfU1lNQk9MKG91dHN3KTsKKwordm9pZCBvdXRzbCh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl3aGlsZSAoY291bnQpIHsKKwkJY291bnQgLT0gNDsKKwkJb3V0bCgqKGNvbnN0IGxvbmcgKilzcmMsIGFkZHIpOworCQlzcmMgKz0gNDsKKwkJLyogYWRkciArPSA0OyAqLworCX0KK30KK0VYUE9SVF9TWU1CT0wob3V0c2wpOworCit2b2lkIGluc2IodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJd2hpbGUgKGNvdW50KSB7CisJCWNvdW50IC09IDE7CisJCSoodW5zaWduZWQgY2hhciAqKWRzdCA9IGluYihhZGRyKTsKKwkJZHN0ICs9IDE7CisJCS8qIGFkZHIgKz0gMTsgKi8KKwl9Cit9CitFWFBPUlRfU1lNQk9MKGluc2IpOworCit2b2lkIGluc3codW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJd2hpbGUgKGNvdW50KSB7CisJCWNvdW50IC09IDI7CisJCSoodW5zaWduZWQgc2hvcnQgKilkc3QgPSBpbncoYWRkcik7CisJCWRzdCArPSAyOworCQkvKiBhZGRyICs9IDI7ICovCisJfQorfQorRVhQT1JUX1NZTUJPTChpbnN3KTsKKwordm9pZCBpbnNsKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXdoaWxlIChjb3VudCkgeworCQljb3VudCAtPSA0OworCQkvKgorCQkgKiBYWFggSSBhbSBzdXJlIHdlIGFyZSBpbiBmb3IgYW4gdW5hbGlnbmVkIHRyYXAgaGVyZS4KKwkJICovCisJCSoodW5zaWduZWQgbG9uZyAqKWRzdCA9IGlubChhZGRyKTsKKwkJZHN0ICs9IDQ7CisJCS8qIGFkZHIgKz0gNDsgKi8KKwl9Cit9CitFWFBPUlRfU1lNQk9MKGluc2wpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2lfZ3JwY2kyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaV9ncnBjaTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGRjMDkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2lfZ3JwY2kyLmMKQEAgLTAsMCArMSw4OTcgQEAKKy8qCisgKiBsZW9uX3BjaV9ncnBjaTIuYzogR1JQQ0kyIEhvc3QgUENJIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBZXJvZmxleCBHYWlzbGVyIEFCLCBEYW5pZWwgSGVsbHN0cm9tCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9sZW9uLmg+CisjaW5jbHVkZSA8YXNtL3ZhZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9sZW9uX3BjaS5oPgorCisjaW5jbHVkZSAiaXJxLmgiCisKK3N0cnVjdCBncnBjaTJfYmFyY2ZnIHsKKwl1bnNpZ25lZCBsb25nIHBjaWFkcjsJLyogUENJIFNwYWNlIEFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nIGFoYmFkcjsJLyogUENJIEJhc2UgYWRkcmVzcyBtYXBwZWQgdG8gdGhpcyBBSEIgYWRkciAqLworfTsKKworLyogRGV2aWNlIE5vZGUgQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICogIC0gYmFyY2ZncyAgICA6IEN1c3RvbSBDb25maWd1cmF0aW9uIG9mIEhvc3QncyA2IHRhcmdldCBCQVJzCisgKiAgLSBpcnFfbWFzayAgIDogTGltaXQgd2hpY2ggUENJIGludGVycnVwdHMgYXJlIGVuYWJsZWQKKyAqICAtIGRvX3Jlc2V0ICAgOiBGb3JjZSBQQ0kgUmVzZXQgb24gc3RhcnR1cAorICoKKyAqIGJhcmNmZ3MKKyAqID09PT09PT0KKyAqCisgKiBPcHRpb25hbCBjdXN0b20gVGFyZ2V0IEJBUiBjb25maWd1cmF0aW9uIChzZWUgc3RydWN0IGdycGNpMl9iYXJjZmcpLiBBbGwKKyAqIGFkZHJlc3NlcyBhcmUgcGh5c2ljYWwuIEFycmF5IGFsd2F5cyBjb250YWlucyA2IGVsZW1lbnRzIChsZW49Mio0KjYgYnl0ZXMpCisgKgorICogLTEgbWVhbnMgbm90IGNvbmZpZ3VyZWQgKGxldCBob3N0IGRyaXZlciBkbyBkZWZhdWx0IHNldHVwKS4KKyAqCisgKiBbaSoyKzBdID0gUENJIEFkZHJlc3Mgb2YgQkFSW2ldIG9uIHRhcmdldCBpbnRlcmZhY2UKKyAqIFtpKjIrMV0gPSBBY2Nlc3NpbmcgUENJIGFkZHJlc3Mgb2YgQkFSW2ldIHJlc3VsdCBpbiB0aGlzIEFNQkEgYWRkcmVzcworICoKKyAqCisgKiBpcnFfbWFzaworICogPT09PT09PT0KKyAqCisgKiBMaW1pdCB3aGljaCBQQ0kgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4gMD1EaXNhYmxlLCAxPUVuYWJsZS4gQnkgZGVmYXVsdAorICogYWxsIGFyZSBlbmFibGVkLiBVc2UgdGhpcyB3aGVuIFBDSSBpbnRlcnJ1cHQgcGlucyBhcmUgZmxvYXRpbmcgb24gUENCLgorICogaW50LCBsZW49NC4KKyAqICBiaXQwID0gUENJIElOVEEjCisgKiAgYml0MSA9IFBDSSBJTlRCIworICogIGJpdDIgPSBQQ0kgSU5UQyMKKyAqICBiaXQzID0gUENJIElOVEQjCisgKgorICoKKyAqIHJlc2V0CisgKiA9PT09PQorICoKKyAqIEZvcmNlIFBDSSByZXNldCBvbiBzdGFydHVwLiBpbnQsIGxlbj00CisgKi8KKworLyogRW5hYmxlIERlYnVnZ2luZyBDb25maWd1cmF0aW9uIFNwYWNlIEFjY2VzcyAqLworI3VuZGVmIEdSUENJMl9ERUJVR19DRkdBQ0NFU1MKKworLyoKKyAqIEdSUENJMiBBUEIgUmVnaXN0ZXIgTUFQCisgKi8KK3N0cnVjdCBncnBjaTJfcmVncyB7CisJdW5zaWduZWQgaW50IGN0cmw7CQkvKiAweDAwIENvbnRyb2wgKi8KKwl1bnNpZ25lZCBpbnQgc3RzX2NhcDsJCS8qIDB4MDQgU3RhdHVzIC8gQ2FwYWJpbGl0aWVzICovCisJaW50IHJlczE7CQkJLyogMHgwOCAqLworCXVuc2lnbmVkIGludCBpb19tYXA7CQkvKiAweDBDIEkvTyBNYXAgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBkbWFfY3RybDsJCS8qIDB4MTAgRE1BICovCisJdW5zaWduZWQgaW50IGRtYV9iZGJhc2U7CS8qIDB4MTQgRE1BICovCisJaW50IHJlczJbMl07CQkJLyogMHgxOCAqLworCXVuc2lnbmVkIGludCBiYXJzWzZdOwkJLyogMHgyMCByZWFkLW9ubHkgUENJIEJBUnMgKi8KKwlpbnQgcmVzM1syXTsJCQkvKiAweDM4ICovCisJdW5zaWduZWQgaW50IGFoYm1zdF9tYXBbMTZdOwkvKiAweDQwIEFIQi0+UENJIE1hcCBwZXIgQUhCIE1hc3RlciAqLworCisJLyogUENJIFRyYWNlIEJ1ZmZlciBSZWdpc3RlcnMgKE9QVElPTkFMKSAqLworCXVuc2lnbmVkIGludCB0X2N0cmw7CQkvKiAweDgwICovCisJdW5zaWduZWQgaW50IHRfY250OwkJLyogMHg4NCAqLworCXVuc2lnbmVkIGludCB0X2FkcGF0OwkJLyogMHg4OCAqLworCXVuc2lnbmVkIGludCB0X2FkbWFzazsJCS8qIDB4OEMgKi8KKwl1bnNpZ25lZCBpbnQgdF9zaWdwYXQ7CQkvKiAweDkwICovCisJdW5zaWduZWQgaW50IHRfc2lnbWFzazsJCS8qIDB4OTQgKi8KKwl1bnNpZ25lZCBpbnQgdF9hZHN0YXRlOwkJLyogMHg5OCAqLworCXVuc2lnbmVkIGludCB0X3NpZ3N0YXRlOwkvKiAweDlDICovCit9OworCisjZGVmaW5lIFJFR0xPQUQoYSkJKGJlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKCYoYSkpKSkKKyNkZWZpbmUgUkVHU1RPUkUoYSwgdikJKF9fcmF3X3dyaXRlbChjcHVfdG9fYmUzMih2KSwgJihhKSkpCisKKyNkZWZpbmUgQ1RSTF9CVVNfQklUIDE2CisKKyNkZWZpbmUgQ1RSTF9SRVNFVCAoMTw8MzEpCisjZGVmaW5lIENUUkxfU0kgKDE8PDI3KQorI2RlZmluZSBDVFJMX1BFICgxPDwyNikKKyNkZWZpbmUgQ1RSTF9FSSAoMTw8MjUpCisjZGVmaW5lIENUUkxfRVIgKDE8PDI0KQorI2RlZmluZSBDVFJMX0JVUyAoMHhmZjw8Q1RSTF9CVVNfQklUKQorI2RlZmluZSBDVFJMX0hPU1RJTlQgMHhmCisKKyNkZWZpbmUgU1RTX0hPU1RfQklUCTMxCisjZGVmaW5lIFNUU19NU1RfQklUCTMwCisjZGVmaW5lIFNUU19UQVJfQklUCTI5CisjZGVmaW5lIFNUU19ETUFfQklUCTI4CisjZGVmaW5lIFNUU19ESV9CSVQJMjcKKyNkZWZpbmUgU1RTX0hJX0JJVAkyNgorI2RlZmluZSBTVFNfSVJRTU9ERV9CSVQJMjQKKyNkZWZpbmUgU1RTX1RSQUNFX0JJVAkyMworI2RlZmluZSBTVFNfQ0ZHRVJSVkFMSURfQklUIDIwCisjZGVmaW5lIFNUU19DRkdFUlJfQklUCTE5CisjZGVmaW5lIFNUU19JTlRUWVBFX0JJVAkxMgorI2RlZmluZSBTVFNfSU5UU1RTX0JJVAk4CisjZGVmaW5lIFNUU19GREVQVEhfQklUCTIKKyNkZWZpbmUgU1RTX0ZOVU1fQklUCTAKKworI2RlZmluZSBTVFNfSE9TVAkoMTw8U1RTX0hPU1RfQklUKQorI2RlZmluZSBTVFNfTVNUCQkoMTw8U1RTX01TVF9CSVQpCisjZGVmaW5lIFNUU19UQVIJCSgxPDxTVFNfVEFSX0JJVCkKKyNkZWZpbmUgU1RTX0RNQQkJKDE8PFNUU19ETUFfQklUKQorI2RlZmluZSBTVFNfREkJCSgxPDxTVFNfRElfQklUKQorI2RlZmluZSBTVFNfSEkJCSgxPDxTVFNfSElfQklUKQorI2RlZmluZSBTVFNfSVJRTU9ERQkoMHgzPDxTVFNfSVJRTU9ERV9CSVQpCisjZGVmaW5lIFNUU19UUkFDRQkoMTw8U1RTX1RSQUNFX0JJVCkKKyNkZWZpbmUgU1RTX0NGR0VSUlZBTElECSgxPDxTVFNfQ0ZHRVJSVkFMSURfQklUKQorI2RlZmluZSBTVFNfQ0ZHRVJSCSgxPDxTVFNfQ0ZHRVJSX0JJVCkKKyNkZWZpbmUgU1RTX0lOVFRZUEUJKDB4M2Y8PFNUU19JTlRUWVBFX0JJVCkKKyNkZWZpbmUgU1RTX0lOVFNUUwkoMHhmPDxTVFNfSU5UU1RTX0JJVCkKKyNkZWZpbmUgU1RTX0ZERVBUSAkoMHg3PDxTVFNfRkRFUFRIX0JJVCkKKyNkZWZpbmUgU1RTX0ZOVU0JKDB4Mzw8U1RTX0ZOVU1fQklUKQorCisjZGVmaW5lIFNUU19JU1lTRVJSCSgxPDwxNykKKyNkZWZpbmUgU1RTX0lETUEJKDE8PDE2KQorI2RlZmluZSBTVFNfSURNQUVSUgkoMTw8MTUpCisjZGVmaW5lIFNUU19JTVNUQUJSVAkoMTw8MTQpCisjZGVmaW5lIFNUU19JVEdUQUJSVAkoMTw8MTMpCisjZGVmaW5lIFNUU19JUEFSRVJSCSgxPDwxMikKKworI2RlZmluZSBTVFNfRVJSX0lSUSAoU1RTX0lTWVNFUlIgfCBTVFNfSU1TVEFCUlQgfCBTVFNfSVRHVEFCUlQgfCBTVFNfSVBBUkVSUikKKworc3RydWN0IGdycGNpMl9iZF9jaGFuIHsKKwl1bnNpZ25lZCBpbnQgY3RybDsJLyogMHgwMCBETUEgQ29udHJvbCAqLworCXVuc2lnbmVkIGludCBuY2hhbjsJLyogMHgwNCBOZXh0IERNQSBDaGFubmVsIEFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgbmJkOwkvKiAweDA4IE5leHQgRGF0YSBEZXNjcmlwdG9yIGluIGNoYW4gKi8KKwl1bnNpZ25lZCBpbnQgcmVzOwkvKiAweDBDIFJlc2VydmVkICovCit9OworCisjZGVmaW5lIEJEX0NIQU5fRU4JCTB4ODAwMDAwMDAKKyNkZWZpbmUgQkRfQ0hBTl9UWVBFCQkweDAwMzAwMDAwCisjZGVmaW5lIEJEX0NIQU5fQkRDTlQJCTB4MDAwMGZmZmYKKyNkZWZpbmUgQkRfQ0hBTl9FTl9CSVQJCTMxCisjZGVmaW5lIEJEX0NIQU5fVFlQRV9CSVQJMjAKKyNkZWZpbmUgQkRfQ0hBTl9CRENOVF9CSVQJMAorCitzdHJ1Y3QgZ3JwY2kyX2JkX2RhdGEgeworCXVuc2lnbmVkIGludCBjdHJsOwkvKiAweDAwIERNQSBEYXRhIENvbnRyb2wgKi8KKwl1bnNpZ25lZCBpbnQgcGNpX2FkcjsJLyogMHgwNCBQQ0kgU3RhcnQgQWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBhaGJfYWRyOwkvKiAweDA4IEFIQiBTdGFydCBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IG5leHQ7CS8qIDB4MEMgTmV4dCBEYXRhIERlc2NyaXB0b3IgaW4gY2hhbiAqLworfTsKKworI2RlZmluZSBCRF9EQVRBX0VOCQkweDgwMDAwMDAwCisjZGVmaW5lIEJEX0RBVEFfSUUJCTB4NDAwMDAwMDAKKyNkZWZpbmUgQkRfREFUQV9EUgkJMHgyMDAwMDAwMAorI2RlZmluZSBCRF9EQVRBX1RZUEUJCTB4MDAzMDAwMDAKKyNkZWZpbmUgQkRfREFUQV9FUgkJMHgwMDA4MDAwMAorI2RlZmluZSBCRF9EQVRBX0xFTgkJMHgwMDAwZmZmZgorI2RlZmluZSBCRF9EQVRBX0VOX0JJVAkJMzEKKyNkZWZpbmUgQkRfREFUQV9JRV9CSVQJCTMwCisjZGVmaW5lIEJEX0RBVEFfRFJfQklUCQkyOQorI2RlZmluZSBCRF9EQVRBX1RZUEVfQklUCTIwCisjZGVmaW5lIEJEX0RBVEFfRVJfQklUCQkxOQorI2RlZmluZSBCRF9EQVRBX0xFTl9CSVQJCTAKKworLyogR1JQQ0kyIENhcGFiaWxpdHkgKi8KK3N0cnVjdCBncnBjaTJfY2FwX2ZpcnN0IHsKKwl1bnNpZ25lZCBpbnQgY3RybDsKKwl1bnNpZ25lZCBpbnQgcGNpMmFoYl9tYXBbNl07CisJdW5zaWduZWQgaW50IGV4dDJhaGJfbWFwOworCXVuc2lnbmVkIGludCBpb19tYXA7CisJdW5zaWduZWQgaW50IHBjaWJhcl9zaXplWzZdOworfTsKKyNkZWZpbmUgQ0FQOV9DVFJMX09GUyAwCisjZGVmaW5lIENBUDlfQkFSX09GUyAweDQKKyNkZWZpbmUgQ0FQOV9JT01BUF9PRlMgMHgyMAorI2RlZmluZSBDQVA5X0JBUlNJWkVfT0ZTIDB4MjQKKworc3RydWN0IGdycGNpMl9wcml2IHsKKwlzdHJ1Y3QgbGVvbl9wY2lfaW5mbwlpbmZvOyAvKiBtdXN0IGJlIG9uIHRvcCBvZiB0aGlzIHN0cnVjdHVyZSAqLworCXN0cnVjdCBncnBjaTJfcmVncwkqcmVnczsKKwljaGFyCQkJaXJxOworCWNoYXIJCQlpcnFfbW9kZTsgLyogSVJRIE1vZGUgZnJvbSBDQVBTVFMgUkVHICovCisJY2hhcgkJCWJ0X2VuYWJsZWQ7CisJY2hhcgkJCWRvX3Jlc2V0OworCWNoYXIJCQlpcnFfbWFzazsKKwl1MzIJCQlwY2lpZDsgLyogUENJIElEIG9mIEhvc3QgKi8KKwl1bnNpZ25lZCBjaGFyCQlpcnFfbWFwWzRdOworCisJLyogVmlydHVhbCBJUlEgbnVtYmVycyAqLworCXVuc2lnbmVkIGludAkJdmlycV9lcnI7CisJdW5zaWduZWQgaW50CQl2aXJxX2RtYTsKKworCS8qIEFIQiBQQ0kgV2luZG93cyAqLworCXVuc2lnbmVkIGxvbmcJCXBjaV9hcmVhOwkvKiBNRU1PUlkgKi8KKwl1bnNpZ25lZCBsb25nCQlwY2lfYXJlYV9lbmQ7CisJdW5zaWduZWQgbG9uZwkJcGNpX2lvOwkJLyogSS9PICovCisJdW5zaWduZWQgbG9uZwkJcGNpX2NvbmY7CS8qIENPTkZJR1VSQVRJT04gKi8KKwl1bnNpZ25lZCBsb25nCQlwY2lfY29uZl9lbmQ7CisJdW5zaWduZWQgbG9uZwkJcGNpX2lvX3ZhOworCisJc3RydWN0IGdycGNpMl9iYXJjZmcJdGd0YmFyc1s2XTsKK307CisKK0RFRklORV9TUElOTE9DSyhncnBjaTJfZGV2X2xvY2spOworc3RydWN0IGdycGNpMl9wcml2ICpncnBjaTJwcml2OworCitpbnQgZ3JwY2kyX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCXN0cnVjdCBncnBjaTJfcHJpdiAqcHJpdiA9IGRldi0+YnVzLT5zeXNkYXRhOworCWludCBpcnFfZ3JvdXA7CisKKwkvKiBVc2UgZGVmYXVsdCBJUlEgZGVjb2Rpbmcgb24gUENJIEJVUzAgYWNjb3JkaW5nIHNsb3QgbnVtYmVyaW5nICovCisJaXJxX2dyb3VwID0gc2xvdCAmIDB4MzsKKwlwaW4gPSAoKHBpbiAtIDEpICsgaXJxX2dyb3VwKSAmIDB4MzsKKworCXJldHVybiBwcml2LT5pcnFfbWFwW3Bpbl07Cit9CisKK3N0YXRpYyBpbnQgZ3JwY2kyX2NmZ19yMzIoc3RydWN0IGdycGNpMl9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgYnVzLAorCQkJCXVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCB1MzIgKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgKnBjaV9jb25mOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHRtcDsKKworCWlmICh3aGVyZSAmIDB4MykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYnVzID09IDAgJiYgUENJX1NMT1QoZGV2Zm4pICE9IDApCisJCWRldmZuICs9ICgweDggKiA2KTsKKworCS8qIFNlbGVjdCBidXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3JwY2kyX2Rldl9sb2NrLCBmbGFncyk7CisJUkVHU1RPUkUocHJpdi0+cmVncy0+Y3RybCwgKFJFR0xPQUQocHJpdi0+cmVncy0+Y3RybCkgJiB+KDB4ZmYgPDwgMTYpKSB8CisJCQkJICAgKGJ1cyA8PCAxNikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdycGNpMl9kZXZfbG9jaywgZmxhZ3MpOworCisJLyogY2xlYXIgb2xkIHN0YXR1cyAqLworCVJFR1NUT1JFKHByaXYtPnJlZ3MtPnN0c19jYXAsIChTVFNfQ0ZHRVJSIHwgU1RTX0NGR0VSUlZBTElEKSk7CisKKwlwY2lfY29uZiA9ICh1bnNpZ25lZCBpbnQgKikgKHByaXYtPnBjaV9jb25mIHwKKwkJCQkJCShkZXZmbiA8PCA4KSB8ICh3aGVyZSAmIDB4ZmMpKTsKKwl0bXAgPSBMRU9OM19CWVBBU1NfTE9BRF9QQShwY2lfY29uZik7CisKKwkvKiBXYWl0IHVudGlsIEdSUENJMiBzaWduYWxzIHRoYXQgQ0ZHIGFjY2VzcyBpcyBkb25lLCBpdCBzaG91bGQgYmUKKwkgKiBkb25lIGluc3RhbnRhbmVvdXNseSB1bmxlc3MgYSBETUEgb3BlcmF0aW9uIGlzIG9uZ29pbmcuLi4KKwkgKi8KKwl3aGlsZSAoKFJFR0xPQUQocHJpdi0+cmVncy0+c3RzX2NhcCkgJiBTVFNfQ0ZHRVJSVkFMSUQpID09IDApCisJCTsKKworCWlmIChSRUdMT0FEKHByaXYtPnJlZ3MtPnN0c19jYXApICYgU1RTX0NGR0VSUikgeworCQkqdmFsID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgeworCQkvKiBCdXMgYWx3YXlzIGxpdHRsZSBlbmRpYW4gKHVuYWZmZWN0ZWQgYnkgYnl0ZS1zd2FwcGluZykgKi8KKwkJKnZhbCA9IGZsaXBfZHdvcmQodG1wKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncnBjaTJfY2ZnX3IxNihzdHJ1Y3QgZ3JwY2kyX3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBidXMsCisJCQkJdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIHUzMiAqdmFsKQoreworCXUzMiB2OworCWludCByZXQ7CisKKwlpZiAod2hlcmUgJiAweDEpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IGdycGNpMl9jZmdfcjMyKHByaXYsIGJ1cywgZGV2Zm4sIHdoZXJlICYgfjB4MywgJnYpOworCSp2YWwgPSAweGZmZmYgJiAodiA+PiAoOCAqICh3aGVyZSAmIDB4MykpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdycGNpMl9jZmdfcjgoc3RydWN0IGdycGNpMl9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgYnVzLAorCQkJCXVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCB1MzIgKnZhbCkKK3sKKwl1MzIgdjsKKwlpbnQgcmV0OworCisJcmV0ID0gZ3JwY2kyX2NmZ19yMzIocHJpdiwgYnVzLCBkZXZmbiwgd2hlcmUgJiB+MHgzLCAmdik7CisJKnZhbCA9IDB4ZmYgJiAodiA+PiAoOCAqICh3aGVyZSAmIDMpKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdycGNpMl9jZmdfdzMyKHN0cnVjdCBncnBjaTJfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGJ1cywKKwkJCQl1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgdTMyIHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgKnBjaV9jb25mOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAod2hlcmUgJiAweDMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSAhPSAwKQorCQlkZXZmbiArPSAoMHg4ICogNik7CisKKwkvKiBTZWxlY3QgYnVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdycGNpMl9kZXZfbG9jaywgZmxhZ3MpOworCVJFR1NUT1JFKHByaXYtPnJlZ3MtPmN0cmwsIChSRUdMT0FEKHByaXYtPnJlZ3MtPmN0cmwpICYgfigweGZmIDw8IDE2KSkgfAorCQkJCSAgIChidXMgPDwgMTYpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncnBjaTJfZGV2X2xvY2ssIGZsYWdzKTsKKworCS8qIGNsZWFyIG9sZCBzdGF0dXMgKi8KKwlSRUdTVE9SRShwcml2LT5yZWdzLT5zdHNfY2FwLCAoU1RTX0NGR0VSUiB8IFNUU19DRkdFUlJWQUxJRCkpOworCisJcGNpX2NvbmYgPSAodW5zaWduZWQgaW50ICopIChwcml2LT5wY2lfY29uZiB8CisJCQkJCQkoZGV2Zm4gPDwgOCkgfCAod2hlcmUgJiAweGZjKSk7CisJTEVPTjNfQllQQVNTX1NUT1JFX1BBKHBjaV9jb25mLCBmbGlwX2R3b3JkKHZhbCkpOworCisJLyogV2FpdCB1bnRpbCBHUlBDSTIgc2lnbmFscyB0aGF0IENGRyBhY2Nlc3MgaXMgZG9uZSwgaXQgc2hvdWxkIGJlCisJICogZG9uZSBpbnN0YW50YW5lb3VzbHkgdW5sZXNzIGEgRE1BIG9wZXJhdGlvbiBpcyBvbmdvaW5nLi4uCisJICovCisJd2hpbGUgKChSRUdMT0FEKHByaXYtPnJlZ3MtPnN0c19jYXApICYgU1RTX0NGR0VSUlZBTElEKSA9PSAwKQorCQk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncnBjaTJfY2ZnX3cxNihzdHJ1Y3QgZ3JwY2kyX3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBidXMsCisJCQkJdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIHUzMiB2YWwpCit7CisJaW50IHJldDsKKwl1MzIgdjsKKworCWlmICh3aGVyZSAmIDB4MSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gZ3JwY2kyX2NmZ19yMzIocHJpdiwgYnVzLCBkZXZmbiwgd2hlcmUmfjMsICZ2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXYgPSAodiAmIH4oMHhmZmZmIDw8ICg4ICogKHdoZXJlICYgMHgzKSkpKSB8CisJICAgICgoMHhmZmZmICYgdmFsKSA8PCAoOCAqICh3aGVyZSAmIDB4MykpKTsKKwlyZXR1cm4gZ3JwY2kyX2NmZ193MzIocHJpdiwgYnVzLCBkZXZmbiwgd2hlcmUgJiB+MHgzLCB2KTsKK30KKworc3RhdGljIGludCBncnBjaTJfY2ZnX3c4KHN0cnVjdCBncnBjaTJfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGJ1cywKKwkJCQl1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgdTMyIHZhbCkKK3sKKwlpbnQgcmV0OworCXUzMiB2OworCisJcmV0ID0gZ3JwY2kyX2NmZ19yMzIocHJpdiwgYnVzLCBkZXZmbiwgd2hlcmUgJiB+MHgzLCAmdik7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCXYgPSAodiAmIH4oMHhmZiA8PCAoOCAqICh3aGVyZSAmIDB4MykpKSkgfAorCSAgICAoKDB4ZmYgJiB2YWwpIDw8ICg4ICogKHdoZXJlICYgMHgzKSkpOworCXJldHVybiBncnBjaTJfY2ZnX3czMihwcml2LCBidXMsIGRldmZuLCB3aGVyZSAmIH4weDMsIHYpOworfQorCisvKiBSZWFkIGZyb20gQ29uZmlndXJhdGlvbiBTcGFjZS4gV2hlbiBlbnRlcmluZyBoZXJlIHRoZSBQQ0kgbGF5ZXIgaGFzIHRha2VuCisgKiB0aGUgcGNpX2xvY2sgc3BpbmxvY2sgYW5kIElSUSBpcyBvZmYuCisgKi8KK3N0YXRpYyBpbnQgZ3JwY2kyX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQoreworCXN0cnVjdCBncnBjaTJfcHJpdiAqcHJpdiA9IGdycGNpMnByaXY7CisJdW5zaWduZWQgaW50IGJ1c25vID0gYnVzLT5udW1iZXI7CisJaW50IHJldDsKKworCWlmIChQQ0lfU0xPVChkZXZmbikgPiAxNSB8fCAoUENJX1NMT1QoZGV2Zm4pID09IDAgJiYgYnVzbm8gPT0gMCkpIHsKKwkJKnZhbCA9IH4wOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDE6CisJCXJldCA9IGdycGNpMl9jZmdfcjgocHJpdiwgYnVzbm8sIGRldmZuLCB3aGVyZSwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyZXQgPSBncnBjaTJfY2ZnX3IxNihwcml2LCBidXNubywgZGV2Zm4sIHdoZXJlLCB2YWwpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXJldCA9IGdycGNpMl9jZmdfcjMyKHByaXYsIGJ1c25vLCBkZXZmbiwgd2hlcmUsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworI2lmZGVmIEdSUENJMl9ERUJVR19DRkdBQ0NFU1MKKwlwcmludGsoS0VSTl9JTkZPICJncnBjaTJfcmVhZF9jb25maWc6IFslMDJ4OiUwMng6JXhdIG9mcz0lZCB2YWw9JXggIgorCQkic2l6ZT0lZFxuIiwgYnVzbm8sIFBDSV9TTE9UKGRldmZuKSwgUENJX0ZVTkMoZGV2Zm4pLCB3aGVyZSwKKwkJKnZhbCwgc2l6ZSk7CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFdyaXRlIHRvIENvbmZpZ3VyYXRpb24gU3BhY2UuIFdoZW4gZW50ZXJpbmcgaGVyZSB0aGUgUENJIGxheWVyIGhhcyB0YWtlbgorICogdGhlIHBjaV9sb2NrIHNwaW5sb2NrIGFuZCBJUlEgaXMgb2ZmLgorICovCitzdGF0aWMgaW50IGdycGNpMl93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCit7CisJc3RydWN0IGdycGNpMl9wcml2ICpwcml2ID0gZ3JwY2kycHJpdjsKKwl1bnNpZ25lZCBpbnQgYnVzbm8gPSBidXMtPm51bWJlcjsKKworCWlmIChQQ0lfU0xPVChkZXZmbikgPiAxNSB8fCAoUENJX1NMT1QoZGV2Zm4pID09IDAgJiYgYnVzbm8gPT0gMCkpCisJCXJldHVybiAwOworCisjaWZkZWYgR1JQQ0kyX0RFQlVHX0NGR0FDQ0VTUworCXByaW50ayhLRVJOX0lORk8gImdycGNpMl93cml0ZV9jb25maWc6IFslMDJ4OiUwMng6JXhdIG9mcz0lZCBzaXplPSVkICIKKwkJInZhbD0leFxuIiwgYnVzbm8sIFBDSV9TTE9UKGRldmZuKSwgUENJX0ZVTkMoZGV2Zm4pLAorCQl3aGVyZSwgc2l6ZSwgdmFsKTsKKyNlbmRpZgorCisJc3dpdGNoIChzaXplKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSAxOgorCQlyZXR1cm4gZ3JwY2kyX2NmZ193OChwcml2LCBidXNubywgZGV2Zm4sIHdoZXJlLCB2YWwpOworCWNhc2UgMjoKKwkJcmV0dXJuIGdycGNpMl9jZmdfdzE2KHByaXYsIGJ1c25vLCBkZXZmbiwgd2hlcmUsIHZhbCk7CisJY2FzZSA0OgorCQlyZXR1cm4gZ3JwY2kyX2NmZ193MzIocHJpdiwgYnVzbm8sIGRldmZuLCB3aGVyZSwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX29wcyBncnBjaTJfb3BzID0geworCS5yZWFkID0JCWdycGNpMl9yZWFkX2NvbmZpZywKKwkud3JpdGUgPQlncnBjaTJfd3JpdGVfY29uZmlnLAorfTsKKworLyogR0VOSVJRIElSUSBjaGlwIGltcGxlbWVudGF0aW9uIGZvciBHUlBDSTIgaXJxbW9kZT0wLi4yLiBJbiBjb25maWd1cmF0aW9uCisgKiAzIHdoZXJlIGFsbCBQQ0kgSW50ZXJydXB0cyBoYXMgYSBzZXBhcmF0ZSBJUlEgb24gdGhlIHN5c3RlbSBJUlEgY29udHJvbGxlcgorICogdGhpcyBpcyBub3QgbmVlZGVkIGFuZCB0aGUgc3RhbmRhcmQgSVJRIGNvbnRyb2xsZXIgY2FuIGJlIHVzZWQuCisgKi8KKworc3RhdGljIHZvaWQgZ3JwY2kyX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpcnFpZHg7CisJc3RydWN0IGdycGNpMl9wcml2ICpwcml2ID0gZ3JwY2kycHJpdjsKKworCWlycWlkeCA9ICh1bnNpZ25lZCBpbnQpZGF0YS0+Y2hpcF9kYXRhIC0gMTsKKwlpZiAoaXJxaWR4ID4gMykgLyogb25seSBtYXNrIFBDSSBpbnRlcnJ1cHRzIGhlcmUgKi8KKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdycGNpMl9kZXZfbG9jaywgZmxhZ3MpOworCVJFR1NUT1JFKHByaXYtPnJlZ3MtPmN0cmwsIFJFR0xPQUQocHJpdi0+cmVncy0+Y3RybCkgJiB+KDEgPDwgaXJxaWR4KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3JwY2kyX2Rldl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGdycGNpMl91bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpcnFpZHg7CisJc3RydWN0IGdycGNpMl9wcml2ICpwcml2ID0gZ3JwY2kycHJpdjsKKworCWlycWlkeCA9ICh1bnNpZ25lZCBpbnQpZGF0YS0+Y2hpcF9kYXRhIC0gMTsKKwlpZiAoaXJxaWR4ID4gMykgLyogb25seSB1bm1hc2sgUENJIGludGVycnVwdHMgaGVyZSAqLworCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3JwY2kyX2Rldl9sb2NrLCBmbGFncyk7CisJUkVHU1RPUkUocHJpdi0+cmVncy0+Y3RybCwgUkVHTE9BRChwcml2LT5yZWdzLT5jdHJsKSB8ICgxIDw8IGlycWlkeCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdycGNpMl9kZXZfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdycGNpMl9zdGFydHVwX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJZ3JwY2kyX3VubWFza19pcnEoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdycGNpMl9zaHV0ZG93bl9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCWdycGNpMl9tYXNrX2lycShkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBncnBjaTJfaXJxID0geworCS5uYW1lCQk9ICJncnBjaTIiLAorCS5pcnFfc3RhcnR1cAk9IGdycGNpMl9zdGFydHVwX2lycSwKKwkuaXJxX3NodXRkb3duCT0gZ3JwY2kyX3NodXRkb3duX2lycSwKKwkuaXJxX21hc2sJPSBncnBjaTJfbWFza19pcnEsCisJLmlycV91bm1hc2sJPSBncnBjaTJfdW5tYXNrX2lycSwKK307CisKKy8qIEhhbmRsZSBvbmUgb3IgbXVsdGlwbGUgSVJRcyBmcm9tIHRoZSBQQ0kgY29yZSAqLworc3RhdGljIHZvaWQgZ3JwY2kyX3BjaV9mbG93X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGdycGNpMl9wcml2ICpwcml2ID0gZ3JwY2kycHJpdjsKKwlpbnQgaSwgYWNrID0gMDsKKwl1bnNpZ25lZCBpbnQgY3RybCwgc3RzX2NhcCwgcGNpX2ludHM7CisKKwljdHJsID0gUkVHTE9BRChwcml2LT5yZWdzLT5jdHJsKTsKKwlzdHNfY2FwID0gUkVHTE9BRChwcml2LT5yZWdzLT5zdHNfY2FwKTsKKworCS8qIEVycm9yIEludGVycnVwdD8gKi8KKwlpZiAoc3RzX2NhcCAmIFNUU19FUlJfSVJRKSB7CisJCWdlbmVyaWNfaGFuZGxlX2lycShwcml2LT52aXJxX2Vycik7CisJCWFjayA9IDE7CisJfQorCisJLyogUENJIEludGVycnVwdD8gKi8KKwlwY2lfaW50cyA9ICgofnN0c19jYXApID4+IFNUU19JTlRTVFNfQklUKSAmIGN0cmwgJiBDVFJMX0hPU1RJTlQ7CisJaWYgKHBjaV9pbnRzKSB7CisJCS8qIENhbGwgcmVzcGVjdGl2ZSBQQ0kgSW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJaWYgKHBjaV9pbnRzICYgKDEgPDwgaSkpCisJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHByaXYtPmlycV9tYXBbaV0pOworCQl9CisJCWFjayA9IDE7CisJfQorCisJLyoKKwkgKiBEZWNvZGUgRE1BIEludGVycnVwdCBvbmx5IHdoZW4gc2hhcmVkIHdpdGggRXJyIGFuZCBQQ0kgSU5UWCMsIHdoZW4KKwkgKiB0aGUgRE1BIGlzIGEgdW5pcXVlIElSUSB0aGUgRE1BIGludGVycnVwdHMgZG9lc24ndCBlbmQgdXAgaGVyZSwgdGhleQorCSAqIGdvZXMgZGlyZWN0bHkgdG8gRE1BIElTUi4KKwkgKi8KKwlpZiAoKHByaXYtPmlycV9tb2RlID09IDApICYmIChzdHNfY2FwICYgKFNUU19JRE1BIHwgU1RTX0lETUFFUlIpKSkgeworCQlnZW5lcmljX2hhbmRsZV9pcnEocHJpdi0+dmlycV9kbWEpOworCQlhY2sgPSAxOworCX0KKworCS8qCisJICogQ2FsbCAiZmlyc3QgbGV2ZWwiIElSUSBjaGlwIGVuZC1vZi1pcnEgaGFuZGxlci4gSXQgd2lsbCBBQ0sgTEVPTiBJUlEKKwkgKiBDb250cm9sbGVyLCB0aGlzIG11c3QgYmUgZG9uZSBhZnRlciBJUlEgc291cmNlcyBoYXZlIGJlZW4gaGFuZGxlZCB0bworCSAqIGF2b2lkIGRvdWJsZSBJUlEgZ2VuZXJhdGlvbgorCSAqLworCWlmIChhY2spCisJCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKK30KKworLyogQ3JlYXRlIGEgdmlydHVhbCBJUlEgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ3JwY2kyX2J1aWxkX2RldmljZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgdmlycSA9IDAsIHBpbDsKKworCXBpbCA9IDEgPDwgODsKKwl2aXJxID0gaXJxX2FsbG9jKGlycSwgcGlsKTsKKwlpZiAodmlycSA9PSAwKQorCQlnb3RvIG91dDsKKworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHZpcnEsICZncnBjaTJfaXJxLCBoYW5kbGVfc2ltcGxlX2lycSwKKwkJCQkgICAgICAicGNpbHZsIik7CisJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgKHZvaWQgKilpcnEpOworCitvdXQ6CisJcmV0dXJuIHZpcnE7Cit9CisKK3ZvaWQgZ3JwY2kyX2h3X2luaXQoc3RydWN0IGdycGNpMl9wcml2ICpwcml2KQoreworCXUzMiBhaGJhZHIsIHBjaWFkciwgYmFyX3N6LCBjYXBwdHIsIGlvX21hcCwgZGF0YTsKKwlzdHJ1Y3QgZ3JwY2kyX3JlZ3MgKnJlZ3MgPSBwcml2LT5yZWdzOworCWludCBpOworCXN0cnVjdCBncnBjaTJfYmFyY2ZnICpiYXJjZmcgPSBwcml2LT50Z3RiYXJzOworCisJLyogUmVzZXQgYW55IGVhcmxpZXIgc2V0dXAgKi8KKwlpZiAocHJpdi0+ZG9fcmVzZXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiR1JQQ0kyOiBSZXNldHRpbmcgUENJIGJ1c1xuIik7CisJCVJFR1NUT1JFKHJlZ3MtPmN0cmwsIENUUkxfUkVTRVQpOworCQlzc2xlZXAoMSk7IC8qIFdhaXQgZm9yIGJvYXJkcyB0byBzZXR0bGUgKi8KKwl9CisJUkVHU1RPUkUocmVncy0+Y3RybCwgMCk7CisJUkVHU1RPUkUocmVncy0+c3RzX2NhcCwgfjApOyAvKiBDbGVhciBTdGF0dXMgKi8KKwlSRUdTVE9SRShyZWdzLT5kbWFfY3RybCwgMCk7CisJUkVHU1RPUkUocmVncy0+ZG1hX2JkYmFzZSwgMCk7CisKKwkvKiBUcmFuc2xhdGUgSS9PIGFjY2Vzc2VzIHRvIDAsIEkvTyBTcGFjZSBhbHdheXMgQCBQQ0kgbG93IDY0S2J5dGVzICovCisJUkVHU1RPUkUocmVncy0+aW9fbWFwLCBSRUdMT0FEKHJlZ3MtPmlvX21hcCkgJiAweDAwMDBmZmZmKTsKKworCS8qIHNldCAxOjEgbWFwcGluZyBiZXR3ZWVuIEFIQiAtPiBQQ0kgbWVtb3J5IHNwYWNlLCBmb3IgYWxsIE1hc3RlcnMKKwkgKiBFYWNoIEFIQiBtYXN0ZXIgaGFzIGl0J3Mgb3duIG1hcHBpbmcgcmVnaXN0ZXJzLiBNYXggMTYgQUhCIG1hc3RlcnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCVJFR1NUT1JFKHJlZ3MtPmFoYm1zdF9tYXBbaV0sIHByaXYtPnBjaV9hcmVhKTsKKworCS8qIEdldCB0aGUgR1JQQ0kyIEhvc3QgUENJIElEICovCisJZ3JwY2kyX2NmZ19yMzIocHJpdiwgMCwgMCwgUENJX1ZFTkRPUl9JRCwgJnByaXYtPnBjaWlkKTsKKworCS8qIEdldCBhZGRyZXNzIHRvIGZpcnN0IChhbHdheXMgZGVmaW5lZCkgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KKwlncnBjaTJfY2ZnX3I4KHByaXYsIDAsIDAsIFBDSV9DQVBBQklMSVRZX0xJU1QsICZjYXBwdHIpOworCisJLyogRW5hYmxlL0Rpc2FibGUgQnl0ZSB0d2lzdGluZyAqLworCWdycGNpMl9jZmdfcjMyKHByaXYsIDAsIDAsIGNhcHB0citDQVA5X0lPTUFQX09GUywgJmlvX21hcCk7CisJaW9fbWFwID0gKGlvX21hcCAmIH4weDEpIHwgKHByaXYtPmJ0X2VuYWJsZWQgPyAxIDogMCk7CisJZ3JwY2kyX2NmZ193MzIocHJpdiwgMCwgMCwgY2FwcHRyK0NBUDlfSU9NQVBfT0ZTLCBpb19tYXApOworCisJLyogU2V0dXAgdGhlIEhvc3QncyBQQ0kgVGFyZ2V0IEJBUnMgZm9yIG90aGVyIHBlcmlwaGVyYWxzIHRvIGFjY2VzcywKKwkgKiBhbmQgZG8gRE1BIHRvIHRoZSBob3N0J3MgbWVtb3J5LiBUaGUgdGFyZ2V0IEJBUnMgY2FuIGJlIHNpemVkIGFuZAorCSAqIGVuYWJsZWQgaW5kaXZpZHVhbGx5LgorCSAqCisJICogVXNlciBtYXkgc2V0IGN1c3RvbSB0YXJnZXQgQkFScywgYnV0IGRlZmF1bHQgaXM6CisJICogVGhlIGZpcnN0IEJBUnMgaXMgdXNlZCB0byBtYXAga2VybmVsIGxvdyAoRE1BIGlzIHBhcnQgb2Ygbm9ybWFsCisJICogcmVnaW9uIG9uIHNwYXJjIHdoaWNoIGlzIFNSTU1VX01BWE1FTSBiaWcpIG1haW4gbWVtb3J5IDE6MSB0byB0aGUKKwkgKiBQQ0kgYnVzLCB0aGUgb3RoZXIgQkFScyBhcmUgZGlzYWJsZWQuIFdlIGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBCQVIKKwkgKiBpcyBhbHdheXMgYXZhaWxhYmxlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKGJhcmNmZ1tpXS5wY2lhZHIgIT0gfjAgJiYgYmFyY2ZnW2ldLmFoYmFkciAhPSB+MCkgeworCQkJLyogVGFyZ2V0IEJBUnMgbXVzdCBoYXZlIHRoZSBwcm9wZXIgYWxpZ25tZW50ICovCisJCQlhaGJhZHIgPSBiYXJjZmdbaV0uYWhiYWRyOworCQkJcGNpYWRyID0gYmFyY2ZnW2ldLnBjaWFkcjsKKwkJCWJhcl9zeiA9ICgocGNpYWRyIC0gMSkgJiB+cGNpYWRyKSArIDE7CisJCX0gZWxzZSB7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJLyogTWFwIG1haW4gbWVtb3J5ICovCisJCQkJYmFyX3N6ID0gMHhmMDAwMDAwODsgLyogMjU2TUIgcHJlZmV0Y2hhYmxlICovCisJCQkJYWhiYWRyID0gMHhmMDAwMDAwMCAmICh1MzIpX19wYShQQUdFX0FMSUdOKAorCQkJCQkodW5zaWduZWQgbG9uZykgJl9lbmQpKTsKKwkJCQlwY2lhZHIgPSBhaGJhZHI7CisJCQl9IGVsc2UgeworCQkJCWJhcl9zeiA9IDA7CisJCQkJYWhiYWRyID0gMDsKKwkJCQlwY2lhZHIgPSAwOworCQkJfQorCQl9CisJCWdycGNpMl9jZmdfdzMyKHByaXYsIDAsIDAsIGNhcHB0citDQVA5X0JBUlNJWkVfT0ZTK2kqNCwgYmFyX3N6KTsKKwkJZ3JwY2kyX2NmZ193MzIocHJpdiwgMCwgMCwgUENJX0JBU0VfQUREUkVTU18wK2kqNCwgcGNpYWRyKTsKKwkJZ3JwY2kyX2NmZ193MzIocHJpdiwgMCwgMCwgY2FwcHRyK0NBUDlfQkFSX09GUytpKjQsIGFoYmFkcik7CisJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgVEdUIEJBUlslZF06IDB4JTA4eCAoUENJKS0+IDB4JTA4eFxuIiwKKwkJCWksIHBjaWFkciwgYWhiYWRyKTsKKwl9CisKKwkvKiBzZXQgYXMgYnVzIG1hc3RlciBhbmQgZW5hYmxlIHBjaSBtZW1vcnkgcmVzcG9uc2VzICovCisJZ3JwY2kyX2NmZ19yMzIocHJpdiwgMCwgMCwgUENJX0NPTU1BTkQsICZkYXRhKTsKKwlkYXRhIHw9IChQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIpOworCWdycGNpMl9jZmdfdzMyKHByaXYsIDAsIDAsIFBDSV9DT01NQU5ELCBkYXRhKTsKKworCS8qIEVuYWJsZSBFcnJvciByZXNwb25lIChDUFUtVFJBUCkgb24gaWxsZWdhbCBtZW1vcnkgYWNjZXNzLiAqLworCVJFR1NUT1JFKHJlZ3MtPmN0cmwsIENUUkxfRVIgfCBDVFJMX1BFKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGdycGNpMl9qdW1wX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICphcmcpCit7CisJcHJpbnRrKEtFUk5fRVJSICJHUlBDSTI6IEp1bXAgSVJRIGhhcHBlbmVkXG4iKTsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKy8qIEhhbmRsZSBHUlBDSTIgRXJyb3IgSW50ZXJydXB0ICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZ3JwY2kyX2Vycl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBncnBjaTJfcHJpdiAqcHJpdiA9IGFyZzsKKwlzdHJ1Y3QgZ3JwY2kyX3JlZ3MgKnJlZ3MgPSBwcml2LT5yZWdzOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBSRUdMT0FEKHJlZ3MtPnN0c19jYXApOworCWlmICgoc3RhdHVzICYgU1RTX0VSUl9JUlEpID09IDApCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlmIChzdGF0dXMgJiBTVFNfSVBBUkVSUikKKwkJcHJpbnRrKEtFUk5fRVJSICJHUlBDSTI6IFBhcml0eSBFcnJvclxuIik7CisKKwlpZiAoc3RhdHVzICYgU1RTX0lUR1RBQlJUKQorCQlwcmludGsoS0VSTl9FUlIgIkdSUENJMjogVGFyZ2V0IEFib3J0XG4iKTsKKworCWlmIChzdGF0dXMgJiBTVFNfSU1TVEFCUlQpCisJCXByaW50ayhLRVJOX0VSUiAiR1JQQ0kyOiBNYXN0ZXIgQWJvcnRcbiIpOworCisJaWYgKHN0YXR1cyAmIFNUU19JU1lTRVJSKQorCQlwcmludGsoS0VSTl9FUlIgIkdSUENJMjogU3lzdGVtIEVycm9yXG4iKTsKKworCS8qIENsZWFyIGhhbmRsZWQgSU5UIFRZUEUgSVJRcyAqLworCVJFR1NUT1JFKHJlZ3MtPnN0c19jYXAsIHN0YXR1cyAmIFNUU19FUlJfSVJRKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZ3JwY2kyX29mX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQoreworCXN0cnVjdCBncnBjaTJfcmVncyAqcmVnczsKKwlzdHJ1Y3QgZ3JwY2kyX3ByaXYgKnByaXY7CisJaW50IGVyciwgaSwgbGVuOworCWNvbnN0IGludCAqdG1wOworCXVuc2lnbmVkIGludCBjYXBhYmlsaXR5OworCisJaWYgKGdycGNpMnByaXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJHUlBDSTI6IG9ubHkgb25lIEdSUENJMiBjb3JlIHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChvZmRldi0+bnVtX3Jlc291cmNlcyA8IDMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJHUlBDSTI6IG5vdCBlbm91Z2ggQVBCL0FIQiByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBGaW5kIERldmljZSBBZGRyZXNzICovCisJcmVncyA9IG9mX2lvcmVtYXAoJm9mZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCSAgcmVzb3VyY2Vfc2l6ZSgmb2ZkZXYtPnJlc291cmNlWzBdKSwKKwkJCSAgImdybGliLWdycGNpMiByZWdzIik7CisJaWYgKHJlZ3MgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkdSUENJMjogaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgd2UncmUgaW4gSG9zdCBTbG90IGFuZCB0aGF0IHdlIGNhbiBhY3QgYXMgYSBIb3N0IEJyaWRnZQorCSAqIGFuZCBub3Qgb25seSBhcyB0YXJnZXQuCisJICovCisJY2FwYWJpbGl0eSA9IFJFR0xPQUQocmVncy0+c3RzX2NhcCk7CisJaWYgKChjYXBhYmlsaXR5ICYgU1RTX0hPU1QpIHx8ICEoY2FwYWJpbGl0eSAmIFNUU19NU1QpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkdSUENJMjogbm90IGluIGhvc3Qgc3lzdGVtIHNsb3RcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycjE7CisJfQorCisJcHJpdiA9IGdycGNpMnByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ3JwY2kyX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZ3JwY2kycHJpdiA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyMTsKKwl9CisJbWVtc2V0KGdycGNpMnByaXYsIDAsIHNpemVvZigqZ3JwY2kycHJpdikpOworCXByaXYtPnJlZ3MgPSByZWdzOworCXByaXYtPmlycSA9IG9mZGV2LT5hcmNoZGF0YS5pcnFzWzBdOyAvKiBCQVNFIElSUSAqLworCXByaXYtPmlycV9tb2RlID0gKGNhcGFiaWxpdHkgJiBTVFNfSVJRTU9ERSkgPj4gU1RTX0lSUU1PREVfQklUOworCisJcHJpbnRrKEtFUk5fSU5GTyAiR1JQQ0kyOiBob3N0IGZvdW5kIGF0ICVwLCBpcnElZFxuIiwgcmVncywgcHJpdi0+aXJxKTsKKworCS8qIEJ5dGUgdHdpc3Rpbmcgc2hvdWxkIGJlIG1hZGUgY29uZmlndXJhYmxlIGZyb20ga2VybmVsIGNvbW1hbmQgbGluZSAqLworCXByaXYtPmJ0X2VuYWJsZWQgPSAxOworCisJLyogTGV0IHVzZXIgZG8gY3VzdG9tIFRhcmdldCBCQVIgYXNzaWdubWVudCAqLworCXRtcCA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+ZGV2Lm9mX25vZGUsICJiYXJjZmciLCAmbGVuKTsKKwlpZiAodG1wICYmIChsZW4gPT0gMio0KjYpKQorCQltZW1jcHkocHJpdi0+dGd0YmFycywgdG1wLCAyKjQqNik7CisJZWxzZQorCQltZW1zZXQocHJpdi0+dGd0YmFycywgLTEsIDIqNCo2KTsKKworCS8qIExpbWl0IElSUSB1bm1hc2tpbmcgaW4gaXJxX21vZGUgMiBhbmQgMyAqLworCXRtcCA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+ZGV2Lm9mX25vZGUsICJpcnFfbWFzayIsICZsZW4pOworCWlmICh0bXAgJiYgKGxlbiA9PSA0KSkKKwkJcHJpdi0+ZG9fcmVzZXQgPSAqdG1wOworCWVsc2UKKwkJcHJpdi0+aXJxX21hc2sgPSAweGY7CisKKwkvKiBPcHRpb25hbCBQQ0kgcmVzZXQuIEZvcmNlIFBDSSByZXNldCBvbiBzdGFydHVwICovCisJdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KG9mZGV2LT5kZXYub2Zfbm9kZSwgInJlc2V0IiwgJmxlbik7CisJaWYgKHRtcCAmJiAobGVuID09IDQpKQorCQlwcml2LT5kb19yZXNldCA9ICp0bXA7CisJZWxzZQorCQlwcml2LT5kb19yZXNldCA9IDA7CisKKwkvKiBGaW5kIFBDSSBNZW1vcnksIEkvTyBhbmQgQ29uZmlndXJhdGlvbiBTcGFjZSBXaW5kb3dzICovCisJcHJpdi0+cGNpX2FyZWEgPSBvZmRldi0+cmVzb3VyY2VbMV0uc3RhcnQ7CisJcHJpdi0+cGNpX2FyZWFfZW5kID0gb2ZkZXYtPnJlc291cmNlWzFdLmVuZCsxOworCXByaXYtPnBjaV9pbyA9IG9mZGV2LT5yZXNvdXJjZVsyXS5zdGFydDsKKwlwcml2LT5wY2lfY29uZiA9IG9mZGV2LT5yZXNvdXJjZVsyXS5zdGFydCArIDB4MTAwMDA7CisJcHJpdi0+cGNpX2NvbmZfZW5kID0gcHJpdi0+cGNpX2NvbmYgKyAweDEwMDAwOworCXByaXYtPnBjaV9pb192YSA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAocHJpdi0+cGNpX2lvLCAweDEwMDAwKTsKKwlpZiAoIXByaXYtPnBjaV9pb192YSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycjI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTworCQkiR1JQQ0kyOiBNRU1PUlkgU1BBQ0UgWzB4JTA4bHggLSAweCUwOGx4XVxuIgorCQkiICAgICAgICBJL08gICAgU1BBQ0UgWzB4JTA4bHggLSAweCUwOGx4XVxuIgorCQkiICAgICAgICBDT05GSUcgU1BBQ0UgWzB4JTA4bHggLSAweCUwOGx4XVxuIiwKKwkJcHJpdi0+cGNpX2FyZWEsIHByaXYtPnBjaV9hcmVhX2VuZC0xLAorCQlwcml2LT5wY2lfaW8sIHByaXYtPnBjaV9jb25mLTEsCisJCXByaXYtPnBjaV9jb25mLCBwcml2LT5wY2lfY29uZl9lbmQtMSk7CisKKwkvKgorCSAqIEkvTyBTcGFjZSByZXNvdXJjZXMgaW4gSS9PIFdpbmRvdyBtYXBwZWQgaW50byBWaXJ0dWFsIEFkciBTcGFjZQorCSAqIFdlIG5ldmVyIHVzZSBsb3cgNEtCIGJlY2F1c2Ugc29tZSBkZXZpY2VzIHNlZW0gaGF2ZSBwcm9ibGVtcyB1c2luZworCSAqIGFkZHJlc3MgMC4KKwkgKi8KKwltZW1zZXQoJnByaXYtPmluZm8uaW9fc3BhY2UsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwlwcml2LT5pbmZvLmlvX3NwYWNlLm5hbWUgPSAiR1JQQ0kyIFBDSSBJL08gU3BhY2UiOworCXByaXYtPmluZm8uaW9fc3BhY2Uuc3RhcnQgPSBwcml2LT5wY2lfaW9fdmEgKyAweDEwMDA7CisJcHJpdi0+aW5mby5pb19zcGFjZS5lbmQgPSBwcml2LT5wY2lfaW9fdmEgKyAweDEwMDAwIC0gMTsKKwlwcml2LT5pbmZvLmlvX3NwYWNlLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKworCS8qCisJICogR1JQQ0kyIGhhcyBubyBwcmVmZXRjaGFibGUgbWVtb3J5LCBtYXAgZXZlcnl0aGluZyBhcworCSAqIG5vbi1wcmVmZXRjaGFibGUgbWVtb3J5CisJICovCisJbWVtc2V0KCZwcml2LT5pbmZvLm1lbV9zcGFjZSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCXByaXYtPmluZm8ubWVtX3NwYWNlLm5hbWUgPSAiR1JQQ0kyIFBDSSBNRU0gU3BhY2UiOworCXByaXYtPmluZm8ubWVtX3NwYWNlLnN0YXJ0ID0gcHJpdi0+cGNpX2FyZWE7CisJcHJpdi0+aW5mby5tZW1fc3BhY2UuZW5kID0gcHJpdi0+cGNpX2FyZWFfZW5kIC0gMTsKKwlwcml2LT5pbmZvLm1lbV9zcGFjZS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCisJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmcHJpdi0+aW5mby5tZW1fc3BhY2UpIDwgMCkKKwkJZ290byBlcnIzOworCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZwcml2LT5pbmZvLmlvX3NwYWNlKSA8IDApCisJCWdvdG8gZXJyNDsKKworCWdycGNpMl9od19pbml0KHByaXYpOworCisJLyoKKwkgKiBHZXQgUENJIEludGVycnVwdCB0byBTeXN0ZW0gSVJRIG1hcHBpbmcgYW5kIHNldHVwIElSUSBoYW5kbGluZworCSAqIEVycm9yIElSUSBhbHdheXMgb24gUENJIElOVEEuCisJICovCisJaWYgKHByaXYtPmlycV9tb2RlIDwgMikgeworCQkvKiBBbGwgUENJIGludGVycnVwdHMgYXJlIHNoYXJlZCB1c2luZyB0aGUgc2FtZSBzeXN0ZW0gSVJRICovCisJCWxlb25fdXBkYXRlX3ZpcnFfaGFuZGxpbmcocHJpdi0+aXJxLCBncnBjaTJfcGNpX2Zsb3dfaXJxLAorCQkJCQkgInBjaWx2bCIsIDApOworCisJCXByaXYtPmlycV9tYXBbMF0gPSBncnBjaTJfYnVpbGRfZGV2aWNlX2lycSgxKTsKKwkJcHJpdi0+aXJxX21hcFsxXSA9IGdycGNpMl9idWlsZF9kZXZpY2VfaXJxKDIpOworCQlwcml2LT5pcnFfbWFwWzJdID0gZ3JwY2kyX2J1aWxkX2RldmljZV9pcnEoMyk7CisJCXByaXYtPmlycV9tYXBbM10gPSBncnBjaTJfYnVpbGRfZGV2aWNlX2lycSg0KTsKKworCQlwcml2LT52aXJxX2VyciA9IGdycGNpMl9idWlsZF9kZXZpY2VfaXJxKDUpOworCQlpZiAocHJpdi0+aXJxX21vZGUgJiAxKQorCQkJcHJpdi0+dmlycV9kbWEgPSBvZmRldi0+YXJjaGRhdGEuaXJxc1sxXTsKKwkJZWxzZQorCQkJcHJpdi0+dmlycV9kbWEgPSBncnBjaTJfYnVpbGRfZGV2aWNlX2lycSg2KTsKKworCQkvKiBFbmFibGUgSVJRcyBvbiBMRU9OIElSUSBjb250cm9sbGVyICovCisJCWVyciA9IHJlcXVlc3RfaXJxKHByaXYtPmlycSwgZ3JwY2kyX2p1bXBfaW50ZXJydXB0LCAwLAorCQkJCQkiR1JQQ0kyX0pVTVAiLCBwcml2KTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX0VSUiAiR1JQQ0kyOiBFUlIgSVJRIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwl9IGVsc2UgeworCQkvKiBBbGwgUENJIGludGVycnVwdHMgaGF2ZSBhbiB1bmlxdWUgSVJRIGludGVycnVwdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkvKiBNYWtlIExFT04gSVJRIGxheWVyIGhhbmRsZSBsZXZlbCBJUlEgYnkgYWNraW5nICovCisJCQlsZW9uX3VwZGF0ZV92aXJxX2hhbmRsaW5nKG9mZGV2LT5hcmNoZGF0YS5pcnFzW2ldLAorCQkJCQkJIGhhbmRsZV9mYXN0ZW9pX2lycSwgInBjaWx2bCIsCisJCQkJCQkgMSk7CisJCQlwcml2LT5pcnFfbWFwW2ldID0gb2ZkZXYtPmFyY2hkYXRhLmlycXNbaV07CisJCX0KKwkJcHJpdi0+dmlycV9lcnIgPSBwcml2LT5pcnFfbWFwWzBdOworCQlpZiAocHJpdi0+aXJxX21vZGUgJiAxKQorCQkJcHJpdi0+dmlycV9kbWEgPSBvZmRldi0+YXJjaGRhdGEuaXJxc1s0XTsKKwkJZWxzZQorCQkJcHJpdi0+dmlycV9kbWEgPSBwcml2LT5pcnFfbWFwWzBdOworCisJCS8qIFVubWFzayBhbGwgUENJIGludGVycnVwdHMsIHJlcXVlc3RfaXJxIHdpbGwgbm90IGRvIHRoYXQgKi8KKwkJUkVHU1RPUkUocmVncy0+Y3RybCwgUkVHTE9BRChyZWdzLT5jdHJsKXwocHJpdi0+aXJxX21hc2smMHhmKSk7CisJfQorCisJLyogU2V0dXAgSVJRIGhhbmRsZXIgZm9yIG5vbi1jb25maWd1cmF0aW9uIHNwYWNlIGFjY2VzcyBlcnJvcnMgKi8KKwllcnIgPSByZXF1ZXN0X2lycShwcml2LT52aXJxX2VyciwgZ3JwY2kyX2Vycl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJCSJHUlBDSTJfRVJSIiwgcHJpdik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiR1JQQ0kyOiBFUlIgVklSUSByZXF1ZXN0IGZhaWxlZDogJWRcbiIsIGVycik7CisJCWdvdG8gZXJyNTsKKwl9CisKKwkvKgorCSAqIEVuYWJsZSBFcnJvciBJbnRlcnJ1cHRzLiBQQ0kgaW50ZXJydXB0cyBhcmUgdW5tYXNrZWQgb25jZSByZXF1ZXN0X2lycQorCSAqIGlzIGNhbGxlZCBieSB0aGUgUENJIERldmljZSBkcml2ZXJzCisJICovCisJUkVHU1RPUkUocmVncy0+Y3RybCwgUkVHTE9BRChyZWdzLT5jdHJsKSB8IENUUkxfRUkgfCBDVFJMX1NJKTsKKworCS8qIEluaXQgY29tbW9uIGxheWVyIGFuZCBzY2FuIGJ1c2VzICovCisJcHJpdi0+aW5mby5vcHMgPSAmZ3JwY2kyX29wczsKKwlwcml2LT5pbmZvLm1hcF9pcnEgPSBncnBjaTJfbWFwX2lycTsKKwlsZW9uX3BjaV9pbml0KG9mZGV2LCAmcHJpdi0+aW5mbyk7CisKKwlyZXR1cm4gMDsKKworZXJyNToKKwlyZWxlYXNlX3Jlc291cmNlKCZwcml2LT5pbmZvLmlvX3NwYWNlKTsKK2VycjQ6CisJcmVsZWFzZV9yZXNvdXJjZSgmcHJpdi0+aW5mby5tZW1fc3BhY2UpOworZXJyMzoKKwllcnIgPSAtRU5PTUVNOworCWlvdW5tYXAoKHZvaWQgKilwcml2LT5wY2lfaW9fdmEpOworZXJyMjoKKwlrZnJlZShwcml2KTsKK2VycjE6CisJb2ZfaW91bm1hcCgmb2ZkZXYtPnJlc291cmNlWzBdLCByZWdzLAorCQlyZXNvdXJjZV9zaXplKCZvZmRldi0+cmVzb3VyY2VbMF0pKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBncnBjaTJfb2ZfbWF0Y2hbXSA9IHsKKwl7CisJIC5uYW1lID0gIkdBSVNMRVJfR1JQQ0kyIiwKKwkgfSwKKwl7CisJIC5uYW1lID0gIjAxXzA3YyIsCisJIH0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBncnBjaTJfb2ZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImdycGNpMiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBncnBjaTJfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBncnBjaTJfb2ZfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBncnBjaTJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdycGNpMl9vZl9kcml2ZXIpOworfQorCitzdWJzeXNfaW5pdGNhbGwoZ3JwY2kyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9tb2R1bGUuYwppbmRleCA4ZDM0OGM0Li5kYTBjNmM3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9tb2R1bGUuYwpAQCAtNjgsMTIgKzY4LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBGcmVlIG1lbW9yeSByZXR1cm5lZCBmcm9tIG1vZHVsZV9jb3JlX2FsbG9jL21vZHVsZV9pbml0X2FsbG9jICovCi12b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKLXsKLQl2ZnJlZShtb2R1bGVfcmVnaW9uKTsKLX0KLQogLyogTWFrZSBnZW5lcmljIGNvZGUgaWdub3JlIFNUVF9SRUdJU1RFUiBkdW1teSB1bmRlZmluZWQgc3ltYm9scy4gICovCiBpbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLAogCQkJICAgICAgRWxmX1NoZHIgKnNlY2hkcnMsCkBAIC0xMDcsMTcgKzEwMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhcHBseV9yZWxvY2F0ZShFbGZfU2hkciAqc2VjaGRycywKLQkJICAgY29uc3QgY2hhciAqc3RydGFiLAotCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCi0JCSAgIHVuc2lnbmVkIGludCByZWxzZWMsCi0JCSAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBub24tQUREIFJFTE9DQVRJT04gdW5zdXBwb3J0ZWRcbiIsCi0JICAgICAgIG1lLT5uYW1lKTsKLQlyZXR1cm4gLUVOT0VYRUM7Ci19Ci0KIGludCBhcHBseV9yZWxvY2F0ZV9hZGQoRWxmX1NoZHIgKnNlY2hkcnMsCiAJCSAgICAgICBjb25zdCBjaGFyICpzdHJ0YWIsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCkBAIC0yMTQsNyArMTk3LDcgQEAKIAkJCSAgICAgICBtZS0+bmFtZSwKIAkJCSAgICAgICAoaW50KSAoRUxGX1JfVFlQRShyZWxbaV0ucl9pbmZvKSAmIDB4ZmYpKTsKIAkJCXJldHVybiAtRU5PRVhFQzsKLQkJfTsKKwkJfQogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTIzOSwxNSArMjIyLDQgQEAKIAogCXJldHVybiAwOwogfQotI2Vsc2UKLWludCBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotICAgICAgICByZXR1cm4gMDsKLX0KICNlbmRpZiAvKiBDT05GSUdfU1BBUkM2NCAqLwotCi12b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQotewotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwppbmRleCA3MTNkYzkxLi4xZTk0Zjk0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJZGV2LT5zeXNkYXRhID0gbm9kZTsKIAlkZXYtPmRldi5wYXJlbnQgPSBidXMtPmJyaWRnZTsKIAlkZXYtPmRldi5idXMgPSAmcGNpX2J1c190eXBlOwotCWRldi0+ZGV2Lm9mX25vZGUgPSBub2RlOworCWRldi0+ZGV2Lm9mX25vZGUgPSBvZl9ub2RlX2dldChub2RlKTsKIAlkZXYtPmRldmZuID0gZGV2Zm47CiAJZGV2LT5tdWx0aWZ1bmN0aW9uID0gMDsJCS8qIG1heWJlIGEgbGllPyAqLwogCXNldF9wY2llX3BvcnRfdHlwZShkZXYpOwpAQCAtODIwLDExICs4MjAsOSBAQAogCXVuc2lnbmVkIGxvbmcgc3BhY2Vfc2l6ZSwgdXNlcl9vZmZzZXQsIHVzZXJfc2l6ZTsKIAogCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKSB7Ci0JCXNwYWNlX3NpemUgPSAocGJtLT5pb19zcGFjZS5lbmQgLQotCQkJICAgICAgcGJtLT5pb19zcGFjZS5zdGFydCkgKyAxOworCQlzcGFjZV9zaXplID0gcmVzb3VyY2Vfc2l6ZSgmcGJtLT5pb19zcGFjZSk7CiAJfSBlbHNlIHsKLQkJc3BhY2Vfc2l6ZSA9IChwYm0tPm1lbV9zcGFjZS5lbmQgLQotCQkJICAgICAgcGJtLT5tZW1fc3BhY2Uuc3RhcnQpICsgMTsKKwkJc3BhY2Vfc2l6ZSA9IHJlc291cmNlX3NpemUoJnBibS0+bWVtX3NwYWNlKTsKIAl9CiAKIAkvKiBNYWtlIHN1cmUgdGhlIHJlcXVlc3QgaXMgaW4gcmFuZ2UuICovCkBAIC0xMDIxLDEyICsxMDE5LDYgQEAKIH0KICNlbmRpZiAvKiAhKENPTkZJR19QQ0lfTVNJKSAqLwogCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKnBjaV9kZXZpY2VfdG9fT0Zfbm9kZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlyZXR1cm4gcGRldi0+ZGV2Lm9mX25vZGU7Ci19Ci1FWFBPUlRfU1lNQk9MKHBjaV9kZXZpY2VfdG9fT0Zfbm9kZSk7Ci0KIHN0YXRpYyB2b2lkIGFsaV9zb3VuZF9kbWFfaGFjayhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHNldF9iaXQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmFsaV9pc2FfYnJpZGdlOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2NvbW1vbi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2NvbW1vbi5jCmluZGV4IDZlMzg3NGIuLmE2ODk1OTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9jb21tb24uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfY29tbW9uLmMKQEAgLTI4MSw3ICsyODEsNyBAQAogCWNhc2UgNDoKIAkJKnZhbHVlID0gcmV0ICYgMHhmZmZmZmZmZjsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAogCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CkBAIC00NTYsNyArNDU2LDcgQEAKIAogCQlkZWZhdWx0OgogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAl9CiAKIAlpZiAoIXNhd19pbyB8fCAhc2F3X21lbSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jCmluZGV4IDI4M2ZiYzMuLmYwMzBiMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zY2hpem8uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc2NoaXpvLmMKQEAgLTI2NCw3ICsyNjQsNyBAQAogCQlkZWZhdWx0OgogCQkJdHlwZV9zdHJpbmcgPSAiRUNDIEVycm9yIjsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAJCXByaW50aygiJXM6IElPTU1VIEVycm9yLCB0eXBlWyVzXVxuIiwKIAkJICAgICAgIHBibS0+bmFtZSwgdHlwZV9zdHJpbmcpOwogCkBAIC0zMTksNyArMzE5LDcgQEAKIAkJCWRlZmF1bHQ6CiAJCQkJdHlwZV9zdHJpbmcgPSAiRUNDIEVycm9yIjsKIAkJCQlicmVhazsKLQkJCX07CisJCQl9CiAJCQlwcmludGsoIiVzOiBJT01NVSBUQUcoJWQpW2Vycm9yKCVzKSBjdHgoJXgpIHdyKCVkKSBzdHIoJWQpICIKIAkJCSAgICAgICAic3ooJWRLKSB2cGcoJTA4bHgpXVxuIiwKIAkJCSAgICAgICBwYm0tPm5hbWUsIGksIHR5cGVfc3RyaW5nLApAQCAtMTMyOCw3ICsxMzI4LDcgQEAKIAlkZWZhdWx0OgogCQljaGlwc2V0X25hbWUgPSAiU0NISVpPIjsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAkvKiBGb3IgU0NISVpPLCB0aHJlZSBPQlAgcmVnczoKIAkgKiAxKSBQQk0gY29udHJvbGxlciByZWdzCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKaW5kZXggOTQ4NjAxYS4uYTE5ZjA0MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwpAQCAtODg1LDE0ICs4ODUsNiBAQAogCXJldHVybiAtRU5YSU87CiB9CiAKLXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpX2RldmljZV90b19PRl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwYyA9IHBkZXYtPnN5c2RhdGE7Ci0KLQlyZXR1cm4gcGMtPnByb21fbm9kZTsKLX0KLUVYUE9SVF9TWU1CT0wocGNpX2RldmljZV90b19PRl9ub2RlKTsKLQogLyoKICAqIFRoaXMgcHJvYmFibHkgYmVsb25ncyBoZXJlIHJhdGhlciB0aGFuIGlvcG9ydC5jIGJlY2F1c2UKICAqIHdlIGRvIG5vdCB3YW50IHRoaXMgY3J1ZCBsaW5rZWQgaW50byBTQnVzIGtlcm5lbHMuCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggMmNiMGUxYy4uNjJhMDM0MyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMjQ2LDYgKzI0NiwyMCBAQAogCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKIAl9LAogfSwKK1tDKE5PREUpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpICBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcmNfcG11IHVsdHJhM19wbXUgPSB7CkBAIC0zNjEsNiArMzc1LDIwIEBACiAJCVsgQyhSRVNVTFRfTUlTUykgICBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAogCX0sCiB9LAorW0MoTk9ERSldID0geworCVtDKE9QX1JFQUQpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbQyhSRVNVTFRfTUlTUykgIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCit9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyY19wbXUgbmlhZ2FyYTFfcG11ID0gewpAQCAtNDczLDYgKzUwMSwyMCBAQAogCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKIAl9LAogfSwKK1tDKE5PREUpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpICBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSB7IENBQ0hFX09QX1VOU1VQUE9SVEVEIH0sCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0geyBDQUNIRV9PUF9VTlNVUFBPUlRFRCB9LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IHsgQ0FDSEVfT1BfVU5TVVBQT1JURUQgfSwKKwl9LAorfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcmNfcG11IG5pYWdhcmEyX3BtdSA9IHsKQEAgLTEyNzcsNyArMTMxOSw3IEBACiAJCWlmICghc3BhcmNfcGVyZl9ldmVudF9zZXRfcGVyaW9kKGV2ZW50LCBod2MsIGlkeCkpCiAJCQljb250aW51ZTsKIAotCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgMSwgJmRhdGEsIHJlZ3MpKQorCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgJmRhdGEsIHJlZ3MpKQogCQkJc3BhcmNfcG11X3N0b3AoZXZlbnQsIDApOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9pcnF0cmFucy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9pcnF0cmFucy5jCmluZGV4IDU3MGI5OGYuLjQwZTQ5MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21faXJxdHJhbnMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2lycXRyYW5zLmMKQEAgLTY5NCw3ICs2OTQsNyBAQAogCQljYXNlIDM6CiAJCQlpY2xyID0gcmVnX2Jhc2UgKyBTWVNJT19JQ0xSX1NMT1QzOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAogCQlpY2xyICs9ICgodW5zaWduZWQgbG9uZylzYnVzX2xldmVsIC0gMVVMKSAqIDhVTDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wc3ljaG9fY29tbW9uLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wc3ljaG9fY29tbW9uLmMKaW5kZXggZmUyYWY2Ni4uOGRiNDhlOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BzeWNob19jb21tb24uYwpAQCAtMjI4LDcgKzIyOCw3IEBACiAJCWRlZmF1bHQ6CiAJCQl0eXBlX3N0ciA9ICJFQ0MgRXJyb3IiOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSU9NTVUgRXJyb3IsIHR5cGVbJXNdXG4iLAogCQkgICAgICAgcGJtLT5uYW1lLCB0eXBlX3N0cik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NidXMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NidXMuYwppbmRleCAyY2EzMmQxLi5hMTYxYjljIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zYnVzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2J1cy5jCkBAIC05Nyw3ICs5Nyw3IEBACiAKIAlkZWZhdWx0OgogCQlyZXR1cm47Ci0JfTsKKwl9CiAKIAl2YWwgPSB1cGFfcmVhZHEoY2ZnX3JlZyk7CiAJaWYgKHZhbCAmICgxVUwgPDwgMTRVTCkpIHsKQEAgLTI0NCw3ICsyNDQsNyBAQAogCQljYXNlIDM6CiAJCQlpY2xyID0gcmVnX2Jhc2UgKyBTWVNJT19JQ0xSX1NMT1QzOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAogCQlpY2xyICs9ICgodW5zaWduZWQgbG9uZylzYnVzX2xldmVsIC0gMVVMKSAqIDhVTDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF8zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfMzIuYwppbmRleCAzMjQ5ZDNmLi5kMjZlMWY2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF8zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzMyLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCWRlZmF1bHQ6CiAJCXByaW50aygiVU5LTk9XTiFcbiIpOwogCQlicmVhazsKLQl9OworCX0KIAogI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCiAJY29uc3dpdGNocCA9ICZkdW1teV9jb247CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfNjQuYwppbmRleCBmM2I2ODUwLi5jNGRkMDk5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzY0LmMKQEAgLTIwOSw3ICsyMDksNyBAQAogCQlkZWZhdWx0OgogCQkJcHJvbV9wcmludGYoIlVua25vd24gY3B1IHR5cGUsIGhhbHRpbmcuXG4iKTsKIAkJCXByb21faGFsdCgpOwotCQl9OworCQl9CiAKIAkJKih1bnNpZ25lZCBpbnQgKikgKGFkZHIgKyAgMCkgPSBpbnNuc1swXTsKIAkJd21iKCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF8zMi5jCmluZGV4IGQ1YjM5NTguLjIxYjEyNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF8zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF8zMi5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkJcHJpbnRrKCJVTktOT1dOIVxuIik7CiAJCUJVRygpOwogCQlicmVhazsKLQl9OworCX0KIH0KIAogdm9pZCBjcHVfcGFuaWModm9pZCkKQEAgLTM3NCw3ICszNzQsNyBAQAogCQlwcmludGsoIlVOS05PV04hXG4iKTsKIAkJQlVHKCk7CiAJCWJyZWFrOwotCX07CisJfQogfQogCiAvKiBTZXQgdGhpcyB1cCBlYXJseSBzbyB0aGF0IHRoaW5ncyBsaWtlIHRoZSBzY2hlZHVsZXIgY2FuIGluaXQKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCQlwcmludGsoIlVOS05PV04hXG4iKTsKIAkJQlVHKCk7CiAJCWJyZWFrOwotCX07CisJfQogCiAJaWYgKCFyZXQpIHsKIAkJY3B1bWFza19zZXRfY3B1KGNwdSwgJnNtcF9jb21tZW5jZWRfbWFzayk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9pcnEuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N1bjRkX2lycS5jCmluZGV4IGE5ZWE2MGUuLjFkMTNjNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRkX2lycS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N1bjRkX2lycS5jCkBAIC0xMDMsMTAgKzEwMyw5IEBACiAKIAlzYmlsID0gKHNidXNsIDw8IDIpOwogCS8qIExvb3AgZm9yIGVhY2ggcGVuZGluZyBTQkkgKi8KLQlmb3IgKHNiaW5vID0gMDsgYnVzX21hc2s7IHNiaW5vKyspIHsKKwlmb3IgKHNiaW5vID0gMDsgYnVzX21hc2s7IHNiaW5vKyssIGJ1c19tYXNrID4+PSAxKSB7CiAJCXVuc2lnbmVkIGludCBpZHgsIG1hc2s7CiAKLQkJYnVzX21hc2sgPj49IDE7CiAJCWlmICghKGJ1c19tYXNrICYgMSkpCiAJCQljb250aW51ZTsKIAkJLyogWFhYIFRoaXMgc2VlbXMgdG8gQUNLIHRoZSBpcnEgdHdpY2UuICBhY3F1aXJlX3NiaSgpCkBAIC0xMTgsMTkgKzExNywxNiBAQAogCQltYXNrICY9ICgweGYgPDwgc2JpbCk7CiAKIAkJLyogTG9vcCBmb3IgZWFjaCBwZW5kaW5nIFNCSSBzbG90ICovCi0JCWlkeCA9IDA7CiAJCXNsb3QgPSAoMSA8PCBzYmlsKTsKLQkJd2hpbGUgKG1hc2sgIT0gMCkgeworCQlmb3IgKGlkeCA9IDA7IG1hc2sgIT0gMDsgaWR4KyssIHNsb3QgPDw9IDEpIHsKIAkJCXVuc2lnbmVkIGludCBwaWw7CiAJCQlzdHJ1Y3QgaXJxX2J1Y2tldCAqcDsKIAotCQkJaWR4Kys7Ci0JCQlzbG90IDw8PSAxOwogCQkJaWYgKCEobWFzayAmIHNsb3QpKQogCQkJCWNvbnRpbnVlOwogCiAJCQltYXNrICY9IH5zbG90OwotCQkJcGlsID0gc3VuNGRfZW5jb2RlX2lycShzYmlubywgc2JpbCwgaWR4KTsKKwkJCXBpbCA9IHN1bjRkX2VuY29kZV9pcnEoc2Jpbm8sIHNidXNsLCBpZHgpOwogCiAJCQlwID0gaXJxX21hcFtwaWxdOwogCQkJd2hpbGUgKHApIHsKQEAgLTIxOCwxMCArMjE0LDEwIEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnN1bjRkX2ltc2tfbG9jaywgZmxhZ3MpOwotCWNjX3NldF9pbXNrX290aGVyKGNwdWlkLCBjY19nZXRfaW1za19vdGhlcihjcHVpZCkgfCB+KDEgPDwgcmVhbF9pcnEpKTsKKwljY19zZXRfaW1za19vdGhlcihjcHVpZCwgY2NfZ2V0X2ltc2tfb3RoZXIoY3B1aWQpICYgfigxIDw8IHJlYWxfaXJxKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3VuNGRfaW1za19sb2NrLCBmbGFncyk7CiAjZWxzZQotCWNjX3NldF9pbXNrKGNjX2dldF9pbXNrKCkgfCB+KDEgPDwgcmVhbF9pcnEpKTsKKwljY19zZXRfaW1zayhjY19nZXRfaW1zaygpICYgfigxIDw8IHJlYWxfaXJxKSk7CiAjZW5kaWYKIH0KIApAQCAtMjk5LDU4ICsyOTUsMTkgQEAKIAl9CiB9CiAKLXVuc2lnbmVkIGludCBzdW40ZF9idWlsZF9kZXZpY2VfaXJxKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlYWxfaXJxKQordW5zaWduZWQgaW50IF9zdW40ZF9idWlsZF9kZXZpY2VfaXJxKHVuc2lnbmVkIGludCByZWFsX2lycSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBib2FyZCkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb3AtPmRldi5vZl9ub2RlOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW9fdW5pdCwgKnNiaSA9IGRwLT5wYXJlbnQ7Ci0JY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzOwogCXN0cnVjdCBzdW40ZF9oYW5kbGVyX2RhdGEgKmhhbmRsZXJfZGF0YTsKLQl1bnNpZ25lZCBpbnQgcGlsOwogCXVuc2lnbmVkIGludCBpcnE7Ci0JaW50IGJvYXJkLCBzbG90OwotCWludCBzYnVzbDsKLQotCWlycSA9IDA7Ci0Jd2hpbGUgKHNiaSkgewotCQlpZiAoIXN0cmNtcChzYmktPm5hbWUsICJzYmkiKSkKLQkJCWJyZWFrOwotCi0JCXNiaSA9IHNiaS0+cGFyZW50OwotCX0KLQlpZiAoIXNiaSkKLQkJZ290byBlcnJfb3V0OwotCi0JcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCWlmICghcmVncykKLQkJZ290byBlcnJfb3V0OwotCi0Jc2xvdCA9IHJlZ3MtPndoaWNoX2lvOwotCi0JLyoKLQkgKiAgSWYgU0JJJ3MgcGFyZW50IGlzIG5vdCBpby11bml0IG9yIHRoZSBpby11bml0IGxhY2tzCi0JICogYSAiYm9hcmQjIiBwcm9wZXJ0eSwgc29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuCi0JICovCi0JaWYgKCFzYmktPnBhcmVudCB8fCBzdHJjbXAoc2JpLT5wYXJlbnQtPm5hbWUsICJpby11bml0IikpIHsKLQkJcHJpbnRrKCIlczogRXJyb3IsIHBhcmVudCBpcyBub3QgaW8tdW5pdC5cbiIsIHNiaS0+ZnVsbF9uYW1lKTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQlpb191bml0ID0gc2JpLT5wYXJlbnQ7Ci0JYm9hcmQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoaW9fdW5pdCwgImJvYXJkIyIsIC0xKTsKLQlpZiAoYm9hcmQgPT0gLTEpIHsKLQkJcHJpbnRrKCIlczogRXJyb3IsIGxhY2tzIGJvYXJkIyBwcm9wZXJ0eS5cbiIsIGlvX3VuaXQtPmZ1bGxfbmFtZSk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlzYnVzbCA9IHBpbF90b19zYnVzW3JlYWxfaXJxXTsKLQlpZiAoc2J1c2wpCi0JCXBpbCA9IHN1bjRkX2VuY29kZV9pcnEoYm9hcmQsIHNidXNsLCBzbG90KTsKLQllbHNlCi0JCXBpbCA9IHJlYWxfaXJxOwogCiAJaXJxID0gaXJxX2FsbG9jKHJlYWxfaXJxLCBwaWwpOwotCWlmIChpcnEgPT0gMCkKKwlpZiAoaXJxID09IDApIHsKKwkJcHJvbV9wcmludGYoIklSUTogYWxsb2NhdGUgZm9yICVkICVkICVkIGZhaWxlZFxuIiwKKwkJCXJlYWxfaXJxLCBwaWwsIGJvYXJkKTsKIAkJZ290byBlcnJfb3V0OworCX0KIAogCWhhbmRsZXJfZGF0YSA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7CiAJaWYgKHVubGlrZWx5KGhhbmRsZXJfZGF0YSkpCkBAIC0zNjgsOSArMzI1LDgwIEBACiAJaXJxX3NldF9oYW5kbGVyX2RhdGEoaXJxLCBoYW5kbGVyX2RhdGEpOwogCiBlcnJfb3V0OgotCXJldHVybiByZWFsX2lycTsKKwlyZXR1cm4gaXJxOwogfQogCisKKwordW5zaWduZWQgaW50IHN1bjRkX2J1aWxkX2RldmljZV9pcnEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVhbF9pcnEpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmJvYXJkX3BhcmVudCwgKmJ1cyA9IGRwLT5wYXJlbnQ7CisJY2hhciAqYnVzX2Nvbm5lY3Rpb247CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzOworCXVuc2lnbmVkIGludCBwaWw7CisJdW5zaWduZWQgaW50IGlycTsKKwlpbnQgYm9hcmQsIHNsb3Q7CisJaW50IHNidXNsOworCisJaXJxID0gcmVhbF9pcnE7CisJd2hpbGUgKGJ1cykgeworCQlpZiAoIXN0cmNtcChidXMtPm5hbWUsICJzYmkiKSkgeworCQkJYnVzX2Nvbm5lY3Rpb24gPSAiaW8tdW5pdCI7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghc3RyY21wKGJ1cy0+bmFtZSwgImJvb3RidXMiKSkgeworCQkJYnVzX2Nvbm5lY3Rpb24gPSAiY3B1LXVuaXQiOworCQkJYnJlYWs7CisJCX0KKworCQlidXMgPSBidXMtPnBhcmVudDsKKwl9CisJaWYgKCFidXMpCisJCWdvdG8gZXJyX291dDsKKworCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXJlZ3MpCisJCWdvdG8gZXJyX291dDsKKworCXNsb3QgPSByZWdzLT53aGljaF9pbzsKKworCS8qCisJICogSWYgQnVzIG5vZGVzIHBhcmVudCBpcyBub3QgaW8tdW5pdC9jcHUtdW5pdCBvciB0aGUgaW8tdW5pdC9jcHUtdW5pdAorCSAqIGxhY2tzIGEgImJvYXJkIyIgcHJvcGVydHksIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLgorCSAqLworCWlmICghYnVzLT5wYXJlbnQgfHwgc3RyY21wKGJ1cy0+cGFyZW50LT5uYW1lLCBidXNfY29ubmVjdGlvbikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IsIHBhcmVudCBpcyBub3QgJXMuXG4iLAorCQkJYnVzLT5mdWxsX25hbWUsIGJ1c19jb25uZWN0aW9uKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlib2FyZF9wYXJlbnQgPSBidXMtPnBhcmVudDsKKwlib2FyZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChib2FyZF9wYXJlbnQsICJib2FyZCMiLCAtMSk7CisJaWYgKGJvYXJkID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yLCBsYWNrcyBib2FyZCMgcHJvcGVydHkuXG4iLAorCQkJYm9hcmRfcGFyZW50LT5mdWxsX25hbWUpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJc2J1c2wgPSBwaWxfdG9fc2J1c1tyZWFsX2lycV07CisJaWYgKHNidXNsKQorCQlwaWwgPSBzdW40ZF9lbmNvZGVfaXJxKGJvYXJkLCBzYnVzbCwgc2xvdCk7CisJZWxzZQorCQlwaWwgPSByZWFsX2lycTsKKworCWlycSA9IF9zdW40ZF9idWlsZF9kZXZpY2VfaXJxKHJlYWxfaXJxLCBwaWwsIGJvYXJkKTsKK2Vycl9vdXQ6CisJcmV0dXJuIGlycTsKK30KKwordW5zaWduZWQgaW50IHN1bjRkX2J1aWxkX3RpbWVyX2lycSh1bnNpZ25lZCBpbnQgYm9hcmQsIHVuc2lnbmVkIGludCByZWFsX2lycSkKK3sKKwlyZXR1cm4gX3N1bjRkX2J1aWxkX2RldmljZV9pcnEocmVhbF9pcnEsIHJlYWxfaXJxLCBib2FyZCk7Cit9CisKKwogc3RhdGljIHZvaWQgX19pbml0IHN1bjRkX2ZpeHVwX3RyYXBfdGFibGUodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfU01QCkBAIC00MDIsNiArNDMwLDcgQEAKIAl1bnNpZ25lZCBpbnQgaXJxOwogCWNvbnN0IHUzMiAqcmVnOwogCWludCBlcnI7CisJaW50IGJvYXJkOwogCiAJZHAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiY3B1LXVuaXQiKTsKIAlpZiAoIWRwKSB7CkBAIC00MTQsMTIgKzQ0MywxOSBAQAogCSAqIGJvb3RidXMuCiAJICovCiAJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7Ci0Jb2Zfbm9kZV9wdXQoZHApOwogCWlmICghcmVnKSB7CiAJCXByb21fcHJpbnRmKCJzdW40ZF9pbml0X3RpbWVyczogTm8gcmVnIHByb3BlcnR5XG4iKTsKIAkJcHJvbV9oYWx0KCk7CiAJfQogCisJYm9hcmQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJib2FyZCMiLCAtMSk7CisJaWYgKGJvYXJkID09IC0xKSB7CisJCXByb21fcHJpbnRmKCJzdW40ZF9pbml0X3RpbWVyczogTm8gYm9hcmQjIHByb3BlcnR5IG9uIGNwdS11bml0XG4iKTsKKwkJcHJvbV9oYWx0KCk7CisJfQorCisJb2Zfbm9kZV9wdXQoZHApOworCiAJcmVzLnN0YXJ0ID0gcmVnWzFdOwogCXJlcy5lbmQgPSByZWdbMl0gLSAxOwogCXJlcy5mbGFncyA9IHJlZ1swXSAmIDB4ZmY7CkBAIC00MzQsNyArNDcwLDcgQEAKIAogCW1hc3Rlcl9sMTBfY291bnRlciA9ICZzdW40ZF90aW1lcnMtPmwxMF9jdXJfY291bnQ7CiAKLQlpcnEgPSBzdW40ZF9idWlsZF9kZXZpY2VfaXJxKE5VTEwsIFNVTjREX1RJTUVSX0lSUSk7CisJaXJxID0gc3VuNGRfYnVpbGRfdGltZXJfaXJxKGJvYXJkLCBTVU40RF9USU1FUl9JUlEpOwogCWVyciA9IHJlcXVlc3RfaXJxKGlycSwgY291bnRlcl9mbiwgSVJRRl9USU1FUiwgInRpbWVyIiwgTlVMTCk7CiAJaWYgKGVycikgewogCQlwcm9tX3ByaW50Zigic3VuNGRfaW5pdF90aW1lcnM6IHJlcXVlc3RfaXJxKCkgZmFpbGVkIHdpdGggJWRcbiIsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmMzMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYwppbmRleCA2ZGIxOGM2Li4xNzBjZDhlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmMzMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyYzMyLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9TWVM7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gLUVOT1NZUzsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKaW5kZXggOTYwODJkMy4uOTA4YjQ3YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKQEAgLTQ2MCw3ICs0NjAsNyBAQAogCQlkZWZhdWx0OgogCQkJZXJyID0gLUVOT1NZUzsKIAkJCWdvdG8gb3V0OwotCQl9OworCQl9CiAJfQogCWlmIChjYWxsIDw9IE1TR0NUTCkgewogCQlzd2l0Y2ggKGNhbGwpIHsKQEAgLTQ4MSw3ICs0ODEsNyBAQAogCQlkZWZhdWx0OgogCQkJZXJyID0gLUVOT1NZUzsKIAkJCWdvdG8gb3V0OwotCQl9OworCQl9CiAJfQogCWlmIChjYWxsIDw9IFNITUNUTCkgewogCQlzd2l0Y2ggKGNhbGwpIHsKQEAgLTUwNyw3ICs1MDcsNyBAQAogCQlkZWZhdWx0OgogCQkJZXJyID0gLUVOT1NZUzsKIAkJCWdvdG8gb3V0OwotCQl9OworCQl9CiAJfSBlbHNlIHsKIAkJZXJyID0gLUVOT1NZUzsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMKaW5kZXggMmI4ZDU0Yi4uMWRiNmIxOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYwpAQCAtNzA4LDcgKzcwOCw3IEBACiAJY2FzZSBDTE9DS19FVlRfTU9ERV9VTlVTRUQ6CiAJCVdBUk5fT04oMSk7CiAJCWJyZWFrOwotCX07CisJfQogfQogCiBzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBzcGFyYzY0X2Nsb2NrZXZlbnQgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYwppbmRleCAxZWQ1NDdiLi4wY2JkYWE0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKQEAgLTE4MDQsNyArMTgwNCw3IEBACiAJCXJldHVybiAid2FybmluZyByZXN1bWFibGUiOwogCWRlZmF1bHQ6CiAJCXJldHVybiAidW5rbm93biI7Ci0JfTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHN1bjR2X2xvZ19lcnJvcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHN1bjR2X2Vycm9yX2VudHJ5ICplbnQsIGludCBjcHUsIGNvbnN0IGNoYXIgKnBmeCwgYXRvbWljX3QgKm9jbnQpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF8zMi5jCmluZGV4IDQ0OTFmNGMuLjdlZmJiMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF8zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF8zMi5jCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBhZGRyID0gY29tcHV0ZV9lZmZlY3RpdmVfYWRkcmVzcyhyZWdzLCBpbnNuKTsKIAkJaW50IGVycjsKIAotCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfQUxJR05NRU5UX0ZBVUxUUywgMSwgMCwgcmVncywgYWRkcik7CisJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19BTElHTk1FTlRfRkFVTFRTLCAxLCByZWdzLCBhZGRyKTsKIAkJc3dpdGNoIChkaXIpIHsKIAkJY2FzZSBsb2FkOgogCQkJZXJyID0gZG9faW50X2xvYWQoZmV0Y2hfcmVnX2FkZHIoKChpbnNuPj4yNSkmMHgxZiksCkBAIC0zMzgsNyArMzM4LDcgQEAKIAkJfQogCiAJCWFkZHIgPSBjb21wdXRlX2VmZmVjdGl2ZV9hZGRyZXNzKHJlZ3MsIGluc24pOwotCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfQUxJR05NRU5UX0ZBVUxUUywgMSwgMCwgcmVncywgYWRkcik7CisJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19BTElHTk1FTlRfRkFVTFRTLCAxLCByZWdzLCBhZGRyKTsKIAkJc3dpdGNoKGRpcikgewogCQljYXNlIGxvYWQ6CiAJCQllcnIgPSBkb19pbnRfbG9hZChmZXRjaF9yZWdfYWRkcigoKGluc24+PjI1KSYweDFmKSwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKaW5kZXggYzc1MmM0Yy4uMzVjZmYxNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKQEAgLTIxMSw3ICsyMTEsNyBAQAogCQlkZWZhdWx0OgogCQkJQlVHKCk7CiAJCQlicmVhazsKLQkJfTsKKwkJfQogCX0KIAlyZXR1cm4gX19kb19pbnRfc3RvcmUoZHN0X2FkZHIsIHNpemUsIHNyY192YWwsIGFzaSk7CiB9CkBAIC0zMTcsNyArMzE3LDcgQEAKIAogCQlhZGRyID0gY29tcHV0ZV9lZmZlY3RpdmVfYWRkcmVzcyhyZWdzLCBpbnNuLAogCQkJCQkJICgoaW5zbiA+PiAyNSkgJiAweDFmKSk7Ci0JCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19BTElHTk1FTlRfRkFVTFRTLCAxLCAwLCByZWdzLCBhZGRyKTsKKwkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0FMSUdOTUVOVF9GQVVMVFMsIDEsIHJlZ3MsIGFkZHIpOwogCQlzd2l0Y2ggKGFzaSkgewogCQljYXNlIEFTSV9OTDoKIAkJY2FzZSBBU0lfQUlVUEw6CkBAIC0zMjgsNyArMzI4LDcgQEAKIAkJY2FzZSBBU0lfU05GTDoKIAkJCWFzaSAmPSB+MHgwODsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAJCXN3aXRjaCAoZGlyKSB7CiAJCWNhc2UgbG9hZDoKIAkJCXJlZ19hZGRyID0gZmV0Y2hfcmVnX2FkZHIoKChpbnNuPj4yNSkmMHgxZiksIHJlZ3MpOwpAQCAtMzUxLDcgKzM1MSw3IEBACiAJCQkJZGVmYXVsdDoKIAkJCQkJQlVHKCk7CiAJCQkJCWJyZWFrOwotCQkJCX07CisJCQkJfQogCQkJCSpyZWdfYWRkciA9IHZhbF9pbjsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMzg0LDcgKzM4NCw3IEBACiAJaW50IHJldCwgaSwgcmQgPSAoKGluc24gPj4gMjUpICYgMHgxZik7CiAJaW50IGZyb21fa2VybmVsID0gKHJlZ3MtPnRzdGF0ZSAmIFRTVEFURV9QUklWKSAhPSAwOwogCSAgICAgICAgICAgICAgICAgICAgICAgIAotCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLCAxLCAwLCByZWdzLCAwKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfRU1VTEFUSU9OX0ZBVUxUUywgMSwgcmVncywgMCk7CiAJaWYgKGluc24gJiAweDIwMDApIHsKIAkJbWF5YmVfZmx1c2hfd2luZG93cygwLCAwLCByZCwgZnJvbV9rZXJuZWwpOwogCQl2YWx1ZSA9IHNpZ25fZXh0ZW5kX2ltbTEzKGluc24pOwpAQCAtNDMxLDcgKzQzMSw3IEBACiAJaW50IGFzaSA9IGRlY29kZV9hc2koaW5zbiwgcmVncyk7CiAJaW50IGZsYWcgPSAoZnJlZyA8IDMyKSA/IEZQUlNfREwgOiBGUFJTX0RVOwogCi0JcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0VNVUxBVElPTl9GQVVMVFMsIDEsIDAsIHJlZ3MsIDApOworCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLCAxLCByZWdzLCAwKTsKIAogCXNhdmVfYW5kX2NsZWFyX2ZwdSgpOwogCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+eGZzclswXSAmPSB+MHgxYzAwMDsKQEAgLTU1NCw3ICs1NTQsNyBAQAogCWludCBmcm9tX2tlcm5lbCA9IChyZWdzLT50c3RhdGUgJiBUU1RBVEVfUFJJVikgIT0gMDsKIAl1bnNpZ25lZCBsb25nICpyZWc7CiAJICAgICAgICAgICAgICAgICAgICAgICAgCi0JcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0VNVUxBVElPTl9GQVVMVFMsIDEsIDAsIHJlZ3MsIDApOworCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLCAxLCByZWdzLCAwKTsKIAogCW1heWJlX2ZsdXNoX3dpbmRvd3MoMCwgMCwgcmQsIGZyb21fa2VybmVsKTsKIAlyZWcgPSBmZXRjaF9yZWdfYWRkcihyZCwgcmVncyk7CkBAIC01ODYsNyArNTg2LDcgQEAKIAogCWlmICh0c3RhdGUgJiBUU1RBVEVfUFJJVikKIAkJZGllX2lmX2tlcm5lbCgibGRkZm1uYSBmcm9tIGtlcm5lbCIsIHJlZ3MpOwotCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19BTElHTk1FTlRfRkFVTFRTLCAxLCAwLCByZWdzLCBzZmFyKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfQUxJR05NRU5UX0ZBVUxUUywgMSwgcmVncywgc2Zhcik7CiAJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkKIAkJcGMgPSAodTMyKXBjOwogCWlmIChnZXRfdXNlcihpbnNuLCAodTMyIF9fdXNlciAqKSBwYykgIT0gLUVGQVVMVCkgewpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAKIAlpZiAodHN0YXRlICYgVFNUQVRFX1BSSVYpCiAJCWRpZV9pZl9rZXJuZWwoInN0ZGZtbmEgZnJvbSBrZXJuZWwiLCByZWdzKTsKLQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfQUxJR05NRU5UX0ZBVUxUUywgMSwgMCwgcmVncywgc2Zhcik7CisJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0FMSUdOTUVOVF9GQVVMVFMsIDEsIHJlZ3MsIHNmYXIpOwogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkpCiAJCXBjID0gKHUzMilwYzsKIAlpZiAoZ2V0X3VzZXIoaW5zbiwgKHUzMiBfX3VzZXIgKikgcGMpICE9IC1FRkFVTFQpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3VzMmVfY3B1ZnJlcS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdXMyZV9jcHVmcmVxLmMKaW5kZXggNTMxZDU0Zi4uNDg5ZmMxNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdXMyZV9jcHVmcmVxLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdXMyZV9jcHVmcmVxLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCiAJZGVmYXVsdDoKIAkJQlVHKCk7Ci0JfTsKKwl9CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGluZGV4X3RvX2Rpdmlzb3IodW5zaWduZWQgaW50IGluZGV4KQpAQCAtMTk5LDcgKzE5OSw3IEBACiAKIAlkZWZhdWx0OgogCQlCVUcoKTsKLQl9OworCX0KIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZXN0YXJfdG9fZGl2aXNvcih1bnNpZ25lZCBsb25nIGVzdGFyKQpAQCAtMjI0LDcgKzIyNCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwotCX07CisJfQogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3VzM19jcHVmcmVxLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC91czNfY3B1ZnJlcS5jCmluZGV4IDlhOGNlYjcuLmViMTYyNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3VzM19jcHVmcmVxLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdXMzX2NwdWZyZXEuYwpAQCAtNzEsNyArNzEsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKLQl9OworCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMjUsNyArMTI1LDcgQEAKIAogCWRlZmF1bHQ6CiAJCUJVRygpOwotCX07CisJfQogCiAJcmVnID0gcmVhZF9zYWZhcmlfY2ZnKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Zpb2hzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC92aW9ocy5jCmluZGV4IGFhNmFjNzAuLjI5MzQ4ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Zpb2hzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdmlvaHMuYwpAQCAtMzYzLDcgKzM2Myw3IEBACiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKLQl9OworCX0KIH0KIAogc3RhdGljIGludCBwcm9jZXNzX2F0dHIoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqcGt0KQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlzZW11bC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdmlzZW11bC5jCmluZGV4IDlkZmQyZWIuLjMyYjYyNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Zpc2VtdWwuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC92aXNlbXVsLmMKQEAgLTMzNCw3ICszMzQsNyBAQAogCQlsZWZ0ID0gZWRnZTMyX3RhYl9sWyhyczEgPj4gMikgJiAweDFdLmxlZnQ7CiAJCXJpZ2h0ID0gZWRnZTMyX3RhYl9sWyhyczIgPj4gMikgJiAweDFdLnJpZ2h0OwogCQlicmVhazsKLQl9OworCX0KIAogCWlmICgocnMxICYgfjB4N1VMKSA9PSAocnMyICYgfjB4N1VMKSkKIAkJcmRfdmFsID0gcmlnaHQgJiBsZWZ0OwpAQCAtMzYwLDcgKzM2MCw3IEBACiAJCXRzdGF0ZSA9IHJlZ3MtPnRzdGF0ZSAmIH4oVFNUQVRFX1hDQyB8IFRTVEFURV9JQ0MpOwogCQlyZWdzLT50c3RhdGUgPSB0c3RhdGUgfCAoY2NyIDw8IDMyVUwpOwogCX0KLQl9OworCX0KIH0KIAogc3RhdGljIHZvaWQgYXJyYXkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnNuLCB1bnNpZ25lZCBpbnQgb3BmKQpAQCAtMzkyLDcgKzM5Miw3IEBACiAKIAljYXNlIEFSUkFZMzJfT1BGOgogCQlyZF92YWwgPDw9IDI7Ci0JfTsKKwl9CiAKIAlzdG9yZV9yZWcocmVncywgcmRfdmFsLCBSRChpbnNuKSk7CiB9CkBAIC01NzcsNyArNTc3LDcgQEAKIAkJKmZwZF9yZWdhZGRyKGYsIFJEKGluc24pKSA9IHJkX3ZhbDsKIAkJYnJlYWs7CiAJfQotCX07CisJfQogfQogCiBzdGF0aWMgdm9pZCBwbXVsKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgaW5zbiwgdW5zaWduZWQgaW50IG9wZikKQEAgLTY5Myw3ICs2OTMsNyBAQAogCQkqZnBkX3JlZ2FkZHIoZiwgUkQoaW5zbikpID0gcmRfdmFsOwogCQlicmVhazsKIAl9Ci0JfTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHBjbXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnNuLCB1bnNpZ25lZCBpbnQgb3BmKQpAQCAtNzg2LDcgKzc4Niw3IEBACiAJCQkJcmRfdmFsIHw9IDEgPDwgaTsKIAkJfQogCQlicmVhazsKLQl9OworCX0KIAogCW1heWJlX2ZsdXNoX3dpbmRvd3MoMCwgMCwgUkQoaW5zbiksIDApOwogCXN0b3JlX3JlZyhyZWdzLCByZF92YWwsIFJEKGluc24pKTsKQEAgLTgwMiw3ICs4MDIsNyBAQAogCiAJQlVHX09OKHJlZ3MtPnRzdGF0ZSAmIFRTVEFURV9QUklWKTsKIAotCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLCAxLCAwLCByZWdzLCAwKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfRU1VTEFUSU9OX0ZBVUxUUywgMSwgcmVncywgMCk7CiAKIAlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVQpKQogCQlwYyA9ICh1MzIpcGM7CkBAIC04ODUsNyArODg1LDcgQEAKIAljYXNlIEJTSFVGRkxFX09QRjoKIAkJYnNodWZmbGUocmVncywgaW5zbik7CiAJCWJyZWFrOwotCX07CisJfQogCiAJcmVncy0+dHBjID0gcmVncy0+dG5wYzsKIAlyZWdzLT50bnBjICs9IDQ7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21hdGgtZW11L21hdGhfMzIuYyBiL2FyY2gvc3BhcmMvbWF0aC1lbXUvbWF0aF8zMi5jCmluZGV4IGEzZmNjZGUuLmFhNGQ1NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbWF0aC1lbXUvbWF0aF8zMi5jCisrKyBiL2FyY2gvc3BhcmMvbWF0aC1lbXUvbWF0aF8zMi5jCkBAIC0xNjQsNyArMTY0LDcgQEAKIAlpbnQgcmV0Y29kZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtZSBhbGwgc3VjY2VlZCAqLwogCXVuc2lnbmVkIGxvbmcgaW5zbjsKIAotCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLCAxLCAwLCByZWdzLCAwKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfRU1VTEFUSU9OX0ZBVUxUUywgMSwgcmVncywgMCk7CiAKICNpZmRlZiBERUJVR19NQVRIRU1VCiAJcHJpbnRrKCJJbiBkb19tYXRoZW11KCkuLi4gcGMgaXMgJTA4bHhcbiIsIHJlZ3MtPnBjKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbWF0aC1lbXUvbWF0aF82NC5jIGIvYXJjaC9zcGFyYy9tYXRoLWVtdS9tYXRoXzY0LmMKaW5kZXggNTZkMmM0NC4uZTU3NWJkMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tYXRoLWVtdS9tYXRoXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9tYXRoLWVtdS9tYXRoXzY0LmMKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAJaWYgKHRzdGF0ZSAmIFRTVEFURV9QUklWKQogCQlkaWVfaWZfa2VybmVsKCJ1bmZpbmlzaGVkL3VuaW1wbGVtZW50ZWQgRlBvcCBmcm9tIGtlcm5lbCIsIHJlZ3MpOwotCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19FTVVMQVRJT05fRkFVTFRTLCAxLCAwLCByZWdzLCAwKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfRU1VTEFUSU9OX0ZBVUxUUywgMSwgcmVncywgMCk7CiAJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkKIAkJcGMgPSAodTMyKXBjOwogCWlmIChnZXRfdXNlcihpbnNuLCAodTMyIF9fdXNlciAqKSBwYykgIT0gLUVGQVVMVCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9NYWtlZmlsZSBiL2FyY2gvc3BhcmMvbW0vTWFrZWZpbGUKaW5kZXggNzk4MzZhNy4uZTNjZGEyMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjL21tL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogYXNmbGFncy15IDo9IC1hbnNpCiBjY2ZsYWdzLXkgOj0gLVdlcnJvcgogCi1vYmotJChDT05GSUdfU1BBUkM2NCkgICArPSB1bHRyYS5vIHRsYi5vIHRzYi5vCitvYmotJChDT05GSUdfU1BBUkM2NCkgICArPSB1bHRyYS5vIHRsYi5vIHRzYi5vIGd1cC5vCiBvYmoteSAgICAgICAgICAgICAgICAgICArPSBmYXVsdF8kKEJJVFMpLm8KIG9iai15ICAgICAgICAgICAgICAgICAgICs9IGluaXRfJChCSVRTKS5vCiBvYmotJChDT05GSUdfU1BBUkMzMikgICArPSBsb2FkbW11Lm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYyBiL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYwppbmRleCBiMTBhYzRkLi5hYTFjMWIxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2ZhdWx0XzMyLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9mYXVsdF8zMi5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIAogCWRlZmF1bHQ6CiAJCWJyZWFrOwotCX07CisJfQogCiAJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YgKHJlZ3MpKTsKIAlyZWdzLnBjID0gcGM7CkBAIC0yNTEsNyArMjUxLDcgQEAKICAgICAgICAgaWYgKGluX2F0b21pYygpIHx8ICFtbSkKICAgICAgICAgICAgICAgICBnb3RvIG5vX2NvbnRleHQ7CiAKLQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMsIDEsIDAsIHJlZ3MsIGFkZHJlc3MpOworCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUywgMSwgcmVncywgYWRkcmVzcyk7CiAKIAlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAKQEAgLTMwMSwxMiArMzAxLDEwIEBACiAJfQogCWlmIChmYXVsdCAmIFZNX0ZBVUxUX01BSk9SKSB7CiAJCWN1cnJlbnQtPm1hal9mbHQrKzsKLQkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSiwgMSwgMCwKLQkJCSAgICAgIHJlZ3MsIGFkZHJlc3MpOworCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKLCAxLCByZWdzLCBhZGRyZXNzKTsKIAl9IGVsc2UgewogCQljdXJyZW50LT5taW5fZmx0Kys7Ci0JCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4sIDEsIDAsCi0JCQkgICAgICByZWdzLCBhZGRyZXNzKTsKKwkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTiwgMSwgcmVncywgYWRkcmVzcyk7CiAJfQogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9mYXVsdF82NC5jIGIvYXJjaC9zcGFyYy9tbS9mYXVsdF82NC5jCmluZGV4IGY5MmNlNTYuLjUwNGMwNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vZmF1bHRfNjQuYworKysgYi9hcmNoL3NwYXJjL21tL2ZhdWx0XzY0LmMKQEAgLTMyNSw3ICszMjUsNyBAQAogCWlmIChpbl9hdG9taWMoKSB8fCAhbW0pCiAJCWdvdG8gaW50cl9vcl9ub19tbTsKIAotCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUywgMSwgMCwgcmVncywgYWRkcmVzcyk7CisJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTLCAxLCByZWdzLCBhZGRyZXNzKTsKIAogCWlmICghZG93bl9yZWFkX3RyeWxvY2soJm1tLT5tbWFwX3NlbSkpIHsKIAkJaWYgKChyZWdzLT50c3RhdGUgJiBUU1RBVEVfUFJJVikgJiYKQEAgLTQzMywxMiArNDMzLDEwIEBACiAJfQogCWlmIChmYXVsdCAmIFZNX0ZBVUxUX01BSk9SKSB7CiAJCWN1cnJlbnQtPm1hal9mbHQrKzsKLQkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSiwgMSwgMCwKLQkJCSAgICAgIHJlZ3MsIGFkZHJlc3MpOworCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKLCAxLCByZWdzLCBhZGRyZXNzKTsKIAl9IGVsc2UgewogCQljdXJyZW50LT5taW5fZmx0Kys7Ci0JCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4sIDEsIDAsCi0JCQkgICAgICByZWdzLCBhZGRyZXNzKTsKKwkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTiwgMSwgcmVncywgYWRkcmVzcyk7CiAJfQogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vZ3VwLmMgYi9hcmNoL3NwYXJjL21tL2d1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ODZiNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL21tL2d1cC5jCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogTG9ja2xlc3MgZ2V0X3VzZXJfcGFnZXNfZmFzdCBmb3Igc3BhcmMsIGNyaWJiZWQgZnJvbSBwb3dlcnBjCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5pY2sgUGlnZ2luCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm92ZWxsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Ztc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKy8qCisgKiBUaGUgcGVyZm9ybWFuY2UgY3JpdGljYWwgbGVhZiBmdW5jdGlvbnMgYXJlIG1hZGUgbm9pbmxpbmUgb3RoZXJ3aXNlIGdjYworICogaW5saW5lcyBldmVyeXRoaW5nIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gd2hpY2ggcmVzdWx0cyBpbiB0b28gbXVjaAorICogcmVnaXN0ZXIgcHJlc3N1cmUuCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgZ3VwX3B0ZV9yYW5nZShwbWRfdCBwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBlbmQsIGludCB3cml0ZSwgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50ICpucikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2ssIHJlc3VsdDsKKwlwdGVfdCAqcHRlcDsKKworCWlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7CisJCXJlc3VsdCA9IF9QQUdFX1BSRVNFTlRfNFZ8X1BBR0VfUF80VjsKKwkJaWYgKHdyaXRlKQorCQkJcmVzdWx0IHw9IF9QQUdFX1dSSVRFXzRWOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IF9QQUdFX1BSRVNFTlRfNFV8X1BBR0VfUF80VTsKKwkJaWYgKHdyaXRlKQorCQkJcmVzdWx0IHw9IF9QQUdFX1dSSVRFXzRVOworCX0KKwltYXNrID0gcmVzdWx0IHwgX1BBR0VfU1BFQ0lBTDsKKworCXB0ZXAgPSBwdGVfb2Zmc2V0X2tlcm5lbCgmcG1kLCBhZGRyKTsKKwlkbyB7CisJCXN0cnVjdCBwYWdlICpwYWdlLCAqaGVhZDsKKwkJcHRlX3QgcHRlID0gKnB0ZXA7CisKKwkJaWYgKChwdGVfdmFsKHB0ZSkgJiBtYXNrKSAhPSByZXN1bHQpCisJCQlyZXR1cm4gMDsKKwkJVk1fQlVHX09OKCFwZm5fdmFsaWQocHRlX3BmbihwdGUpKSk7CisKKwkJLyogVGhlIGh1Z2VwYWdlIGNhc2UgaXMgc2ltcGxpZmllZCBvbiBzcGFyYzY0IGJlY2F1c2UKKwkJICogd2UgZW5jb2RlIHRoZSBzdWItcGFnZSBwZm4gb2Zmc2V0cyBpbnRvIHRoZQorCQkgKiBodWdlcGFnZSBQVEVzLiAgV2UgY291bGQgb3B0aW1pemUgdGhpcyBpbiB0aGUgZnV0dXJlCisJCSAqIHVzZSBwYWdlX2NhY2hlX2FkZF9zcGVjdWxhdGl2ZSgpIGZvciB0aGUgaHVnZXBhZ2UgY2FzZS4KKwkJICovCisJCXBhZ2UgPSBwdGVfcGFnZShwdGUpOworCQloZWFkID0gY29tcG91bmRfaGVhZChwYWdlKTsKKwkJaWYgKCFwYWdlX2NhY2hlX2dldF9zcGVjdWxhdGl2ZShoZWFkKSkKKwkJCXJldHVybiAwOworCQlpZiAodW5saWtlbHkocHRlX3ZhbChwdGUpICE9IHB0ZV92YWwoKnB0ZXApKSkgeworCQkJcHV0X3BhZ2UoaGVhZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXBhZ2VzWypucl0gPSBwYWdlOworCQkoKm5yKSsrOworCX0gd2hpbGUgKHB0ZXArKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGd1cF9wbWRfcmFuZ2UocHVkX3QgcHVkLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAorCQlpbnQgd3JpdGUsIHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCAqbnIpCit7CisJdW5zaWduZWQgbG9uZyBuZXh0OworCXBtZF90ICpwbWRwOworCisJcG1kcCA9IHBtZF9vZmZzZXQoJnB1ZCwgYWRkcik7CisJZG8geworCQlwbWRfdCBwbWQgPSAqcG1kcDsKKworCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChwbWRfbm9uZShwbWQpKQorCQkJcmV0dXJuIDA7CisJCWlmICghZ3VwX3B0ZV9yYW5nZShwbWQsIGFkZHIsIG5leHQsIHdyaXRlLCBwYWdlcywgbnIpKQorCQkJcmV0dXJuIDA7CisJfSB3aGlsZSAocG1kcCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ3VwX3B1ZF9yYW5nZShwZ2RfdCBwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCisJCWludCB3cml0ZSwgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50ICpucikKK3sKKwl1bnNpZ25lZCBsb25nIG5leHQ7CisJcHVkX3QgKnB1ZHA7CisKKwlwdWRwID0gcHVkX29mZnNldCgmcGdkLCBhZGRyKTsKKwlkbyB7CisJCXB1ZF90IHB1ZCA9ICpwdWRwOworCisJCW5leHQgPSBwdWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJaWYgKHB1ZF9ub25lKHB1ZCkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFndXBfcG1kX3JhbmdlKHB1ZCwgYWRkciwgbmV4dCwgd3JpdGUsIHBhZ2VzLCBucikpCisJCQlyZXR1cm4gMDsKKwl9IHdoaWxlIChwdWRwKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGdldF91c2VyX3BhZ2VzX2Zhc3QodW5zaWduZWQgbG9uZyBzdGFydCwgaW50IG5yX3BhZ2VzLCBpbnQgd3JpdGUsCisJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJdW5zaWduZWQgbG9uZyBhZGRyLCBsZW4sIGVuZDsKKwl1bnNpZ25lZCBsb25nIG5leHQ7CisJcGdkX3QgKnBnZHA7CisJaW50IG5yID0gMDsKKworCXN0YXJ0ICY9IFBBR0VfTUFTSzsKKwlhZGRyID0gc3RhcnQ7CisJbGVuID0gKHVuc2lnbmVkIGxvbmcpIG5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQ7CisJZW5kID0gc3RhcnQgKyBsZW47CisKKwkvKgorCSAqIFhYWDogYmF0Y2ggLyBsaW1pdCAnbnInLCB0byBhdm9pZCBsYXJnZSBpcnEgb2ZmIGxhdGVuY3kKKwkgKiBuZWVkcyBzb21lIGluc3RydW1lbnRpbmcgdG8gZGV0ZXJtaW5lIHRoZSBjb21tb24gc2l6ZXMgdXNlZCBieQorCSAqIGltcG9ydGFudCB3b3JrbG9hZHMgKGVnLiBEQjIpLCBhbmQgd2hldGhlciBsaW1pdGluZyB0aGUgYmF0Y2ggc2l6ZQorCSAqIHdpbGwgZGVjcmVhc2UgcGVyZm9ybWFuY2UuCisJICoKKwkgKiBJdCBzZWVtcyBsaWtlIHdlJ3JlIGluIHRoZSBjbGVhciBmb3IgdGhlIG1vbWVudC4gRGlyZWN0LUlPIGlzCisJICogdGhlIG1haW4gZ3V5IHRoYXQgYmF0Y2hlcyB1cCBsb3RzIG9mIGdldF91c2VyX3BhZ2VzLCBhbmQgZXZlbgorCSAqIHRoZXkgYXJlIGxpbWl0ZWQgdG8gNjQtYXQtYS10aW1lIHdoaWNoIGlzIG5vdCBzbyBtYW55LgorCSAqLworCS8qCisJICogVGhpcyBkb2Vzbid0IHByZXZlbnQgcGFnZXRhYmxlIHRlYXJkb3duLCBidXQgZG9lcyBwcmV2ZW50CisJICogdGhlIHBhZ2V0YWJsZXMgZnJvbSBiZWluZyBmcmVlZCBvbiBzcGFyYy4KKwkgKgorCSAqIFNvIGxvbmcgYXMgd2UgYXRvbWljYWxseSBsb2FkIHBhZ2UgdGFibGUgcG9pbnRlcnMgdmVyc3VzIHRlYXJkb3duLAorCSAqIHdlIGNhbiBmb2xsb3cgdGhlIGFkZHJlc3MgZG93biB0byB0aGUgdGhlIHBhZ2UgYW5kIHRha2UgYSByZWYgb24gaXQuCisJICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCXBnZHAgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKTsKKwlkbyB7CisJCXBnZF90IHBnZCA9ICpwZ2RwOworCisJCW5leHQgPSBwZ2RfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJaWYgKHBnZF9ub25lKHBnZCkpCisJCQlnb3RvIHNsb3c7CisJCWlmICghZ3VwX3B1ZF9yYW5nZShwZ2QsIGFkZHIsIG5leHQsIHdyaXRlLCBwYWdlcywgJm5yKSkKKwkJCWdvdG8gc2xvdzsKKwl9IHdoaWxlIChwZ2RwKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlWTV9CVUdfT04obnIgIT0gKGVuZCAtIHN0YXJ0KSA+PiBQQUdFX1NISUZUKTsKKwlyZXR1cm4gbnI7CisKKwl7CisJCWludCByZXQ7CisKK3Nsb3c6CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKworCQkvKiBUcnkgdG8gZ2V0IHRoZSByZW1haW5pbmcgcGFnZXMgd2l0aCBnZXRfdXNlcl9wYWdlcyAqLworCQlzdGFydCArPSBuciA8PCBQQUdFX1NISUZUOworCQlwYWdlcyArPSBucjsKKworCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIG1tLCBzdGFydCwKKwkJCShlbmQgLSBzdGFydCkgPj4gUEFHRV9TSElGVCwgd3JpdGUsIDAsIHBhZ2VzLCBOVUxMKTsKKwkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKworCQkvKiBIYXZlIHRvIGJlIGEgYml0IGNhcmVmdWwgd2l0aCByZXR1cm4gdmFsdWVzICovCisJCWlmIChuciA+IDApIHsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldCA9IG5yOworCQkJZWxzZQorCQkJCXJldCArPSBucjsKKwkJfQorCisJCXJldHVybiByZXQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9pbml0XzMyLmMgYi9hcmNoL3NwYXJjL21tL2luaXRfMzIuYwppbmRleCBjYTIxNzMyLi43YjAwZGU2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2luaXRfMzIuYworKysgYi9hcmNoL3NwYXJjL21tL2luaXRfMzIuYwpAQCAtMzQwLDcgKzM0MCw3IEBACiAJCXByb21fcHJpbnRmKCJwYWdpbmdfaW5pdDogc3BhcmNfY3B1X21vZGVsID0gJWRcbiIsIHNwYXJjX2NwdV9tb2RlbCk7CiAJCXByb21fcHJpbnRmKCJwYWdpbmdfaW5pdDogSGFsdGluZy4uLlxuIik7CiAJCXByb21faGFsdCgpOwotCX07CisJfQogCiAJLyogSW5pdGlhbGl6ZSB0aGUgcHJvdGVjdGlvbiBtYXAgd2l0aCBub24tY29uc3RhbnQsIE1NVSBkZXBlbmRlbnQgdmFsdWVzLiAqLwogCXByb3RlY3Rpb25fbWFwWzBdID0gUEFHRV9OT05FOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMgYi9hcmNoL3NwYXJjL21tL2luaXRfNjQuYwppbmRleCBlMTBjZDAzLi4zZmQ4ZTE4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2luaXRfNjQuYworKysgYi9hcmNoL3NwYXJjL21tL2luaXRfNjQuYwpAQCAtMTYyNSw3ICsxNjI1LDcgQEAKIAkJa3RzYl9kZXNjclswXS5wZ3N6X2lkeCA9IEhWX1BHU1pfSURYXzRNQjsKIAkJa3RzYl9kZXNjclswXS5wZ3N6X21hc2sgPSBIVl9QR1NaX01BU0tfNE1COwogCQlicmVhazsKLQl9OworCX0KIAogCWt0c2JfZGVzY3JbMF0uYXNzb2MgPSAxOwogCWt0c2JfZGVzY3JbMF0ubnVtX3R0ZXMgPSBLRVJORUxfVFNCX05FTlRSSUVTOwpAQCAtMjI2Niw3ICsyMjY2LDcgQEAKIAkJCXJldHVybiBfUEFHRV9TWjUxMktfNFY7CiAJCWNhc2UgNCAqIDEwMjQgKiAxMDI0OgogCQkJcmV0dXJuIF9QQUdFX1NaNE1CXzRWOwotCQl9OworCQl9CiAJfSBlbHNlIHsKIAkJc3dpdGNoIChzeikgewogCQljYXNlIDggKiAxMDI0OgpAQCAtMjI3OCw3ICsyMjc4LDcgQEAKIAkJCXJldHVybiBfUEFHRV9TWjUxMktfNFU7CiAJCWNhc2UgNCAqIDEwMjQgKiAxMDI0OgogCQkJcmV0dXJuIF9QQUdFX1NaNE1CXzRVOwotCQl9OworCQl9CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2xlb25fbW0uYyBiL2FyY2gvc3BhcmMvbW0vbGVvbl9tbS5jCmluZGV4IGMwZTAxMjkuLmU0ODVhNjggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vbGVvbl9tbS5jCisrKyBiL2FyY2gvc3BhcmMvbW0vbGVvbl9tbS5jCkBAIC0yMjYsNyArMjI2LDcgQEAKICAqIExlb24yIGFuZCBMZW9uMyBkaWZmZXIgaW4gdGhlaXIgd2F5IG9mIHRlbGxpbmcgY2FjaGUgaW5mb3JtYXRpb24KICAqCiAgKi8KLWludCBsZW9uX2ZsdXNoX25lZWRlZCh2b2lkKQoraW50IF9faW5pdCBsZW9uX2ZsdXNoX25lZWRlZCh2b2lkKQogewogCWludCBmbHVzaF9uZWVkZWQgPSAtMTsKIAl1bnNpZ25lZCBpbnQgc3NpemUsIHNldHM7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL3NybW11LmMgYi9hcmNoL3NwYXJjL21tL3NybW11LmMKaW5kZXggZmUwOWZkOC4uY2JlZjc0ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9zcm1tdS5jCisrKyBiL2FyY2gvc3BhcmMvbW0vc3JtbXUuYwpAQCAtMTY2NSw3ICsxNjY1LDcgQEAKIAlkZWZhdWx0OgogCQlzcm1tdV9tb2R0eXBlID0gU3dpZnRfb2s7CiAJCWJyZWFrOwotCX07CisJfQogCiAJQlRGSVhVUFNFVF9DQUxMKGZsdXNoX2NhY2hlX2FsbCwgc3dpZnRfZmx1c2hfY2FjaGVfYWxsLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoZmx1c2hfY2FjaGVfbW0sIHN3aWZ0X2ZsdXNoX2NhY2hlX21tLCBCVEZJWFVQQ0FMTF9OT1JNKTsKQEAgLTIwNjksNyArMjA2OSw3IEBACiAJCQkvKiBTb21lIG90aGVyIEN5cHJlc3MgcmV2aXNpb24sIGFzc3VtZSBhIDYwNS4gKi8KIAkJCWluaXRfY3lwcmVzc182MDUobW9kX3Jldik7CiAJCQlicmVhazsKLQkJfTsKKwkJfQogCQlyZXR1cm47CiAJfQogCQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9zdW40Yy5jIGIvYXJjaC9zcGFyYy9tbS9zdW40Yy5jCmluZGV4IGEyMzUwYjUuLjFjZjRmMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vc3VuNGMuYworKysgYi9hcmNoL3NwYXJjL21tL3N1bjRjLmMKQEAgLTMxOCw3ICszMTgsNyBAQAogCQlwcm9tX3ByaW50ZigicHJvYmVfdmFjOiBEaWRuJ3QgZXhwZWN0IHZhYy1saW5lc2l6ZSBvZiAlZCwgaGFsdGluZ1xuIiwKIAkJCSAgICBzdW40Y192YWNpbmZvLmxpbmVzaXplKTsKIAkJcHJvbV9oYWx0KCk7Ci0JfTsKKwl9CiAKIAlzdW40Y19mbHVzaF9hbGwoKTsKIAlzdW40Y19lbmFibGVfdmFjKCk7CkBAIC0zNjQsNyArMzY0LDcgQEAKIAkJCXByb21fcHJpbnRmKCJVbmhhbmRsZWQgbnVtYmVyIG9mIHNlZ21hcHM6ICVkXG4iLAogCQkJCSAgICBudW1fc2VnbWFwcyk7CiAJCQlwcm9tX2hhbHQoKTsKLQl9OworCX0KIAlzd2l0Y2ggKG51bV9jb250ZXh0cykgewogCQljYXNlIDg6CiAJCQkvKiBEZWZhdWx0LCBub3RoaW5nIHRvIGRvLiAqLwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJCQlwcm9tX3ByaW50ZigiVW5oYW5kbGVkIG51bWJlciBvZiBjb250ZXh0czogJWRcbiIsCiAJCQkJICAgIG51bV9jb250ZXh0cyk7CiAJCQlwcm9tX2hhbHQoKTsKLQl9OworCX0KIAogCWlmIChzdW40Y192YWNpbmZvLmRvX2h3Zmx1c2hlcyAhPSAwKSB7CiAJCVBBVENIX0lOU04odmFjX2h3Zmx1c2hfcGF0Y2gxX29uLCB2YWNfaHdmbHVzaF9wYXRjaDEpOwpAQCAtMzk0LDcgKzM5NCw3IEBACiAJCQlwcm9tX3ByaW50ZigiSW1wb3NzaWJsZSBWQUMgbGluZXNpemUgJWQsIGhhbHRpbmcuLi5cbiIsCiAJCQkJICAgIHN1bjRjX3ZhY2luZm8ubGluZXNpemUpOwogCQkJcHJvbV9oYWx0KCk7Ci0JCX07CisJCX0KIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vdHNiLmMgYi9hcmNoL3NwYXJjL21tL3RzYi5jCmluZGV4IDk0ODQ2MTUuLjUzNjQxMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vdHNiLmMKKysrIGIvYXJjaC9zcGFyYy9tbS90c2IuYwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiVFNCWyVzOiVkXTogSW1wb3NzaWJsZSBUU0Igc2l6ZSAlbHUsIGtpbGxpbmcgcHJvY2Vzcy5cbiIsCiAJCSAgICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHRzYl9ieXRlcyk7CiAJCWRvX2V4aXQoU0lHU0VHVik7Ci0JfTsKKwl9CiAJdHRlIHw9IHB0ZV9zel9iaXRzKHBhZ2Vfc3opOwogCiAJaWYgKHRsYl90eXBlID09IGNoZWV0YWhfcGx1cyB8fCB0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7CkBAIC0yMTUsNyArMjE1LDcgQEAKICNlbmRpZgogCQlkZWZhdWx0OgogCQkJQlVHKCk7Ci0JCX07CisJCX0KIAkJaHAtPmFzc29jID0gMTsKIAkJaHAtPm51bV90dGVzID0gdHNiX2J5dGVzIC8gMTY7CiAJCWhwLT5jdHhfaWR4ID0gMDsKQEAgLTIzMCwxMiArMjMwLDE0IEBACiAjZW5kaWYKIAkJZGVmYXVsdDoKIAkJCUJVRygpOwotCQl9OworCQl9CiAJCWhwLT50c2JfYmFzZSA9IHRzYl9wYWRkcjsKIAkJaHAtPnJlc3YgPSAwOwogCX0KIH0KIAorc3RydWN0IGttZW1fY2FjaGUgKnBndGFibGVfY2FjaGUgX19yZWFkX21vc3RseTsKKwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp0c2JfY2FjaGVzWzhdIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICp0c2JfY2FjaGVfbmFtZXNbOF0gPSB7CkBAIC0yNTMsNiArMjU1LDE1IEBACiB7CiAJdW5zaWduZWQgbG9uZyBpOwogCisJcGd0YWJsZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJwZ3RhYmxlX2NhY2hlIiwKKwkJCQkJICBQQUdFX1NJWkUsIFBBR0VfU0laRSwKKwkJCQkJICAwLAorCQkJCQkgIF9jbGVhcl9wYWdlKTsKKwlpZiAoIXBndGFibGVfY2FjaGUpIHsKKwkJcHJvbV9wcmludGYoInBndGFibGVfY2FjaGVfaW5pdCgpOiBDb3VsZCBub3QgY3JlYXRlIVxuIik7CisJCXByb21faGFsdCgpOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBzaXplID0gODE5MiA8PCBpOwogCQljb25zdCBjaGFyICpuYW1lID0gdHNiX2NhY2hlX25hbWVzW2ldOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL2NvbnNvbGVfMzIuYyBiL2FyY2gvc3BhcmMvcHJvbS9jb25zb2xlXzMyLmMKaW5kZXggYjA1ZTNkYi4uYTAwZjQ3YiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL2NvbnNvbGVfMzIuYworKysgYi9hcmNoL3NwYXJjL3Byb20vY29uc29sZV8zMi5jCkBAIC0zOCw3ICszOCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwotCX07CisJfQogCXJlc3RvcmVfY3VycmVudCgpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByb21fbG9jaywgZmxhZ3MpOwogCXJldHVybiBpOyAvKiBVZ2gsIHdlIGNvdWxkIHNwaW4gZm9yZXZlciBvbiB1bnN1cHBvcnRlZCBwcm9tcyA7KCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL2luaXRfMzIuYyBiL2FyY2gvc3BhcmMvcHJvbS9pbml0XzMyLmMKaW5kZXggMGE2MDFiMy4uMjZjNjRjZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL2luaXRfMzIuYworKysgYi9hcmNoL3NwYXJjL3Byb20vaW5pdF8zMi5jCkBAIC01Myw3ICs1Myw3IEBACiAJCQkgICAgcm9tdmVjLT5wdl9yb212ZXJzKTsKIAkJcHJvbV9oYWx0KCk7CiAJCWJyZWFrOwotCX07CisJfQogCiAJcHJvbV9yZXYgPSByb212ZWMtPnB2X3BsdWdpbl9yZXZpc2lvbjsKIAlwcm9tX3ByZXYgPSByb212ZWMtPnB2X3ByaW50cmV2OwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL21wLmMgYi9hcmNoL3NwYXJjL3Byb20vbXAuYwppbmRleCA5N2M0NGM5Li4wZGE4MjU2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL3Byb20vbXAuYworKysgYi9hcmNoL3NwYXJjL3Byb20vbXAuYwpAQCAtMzUsNyArMzUsNyBAQAogCWNhc2UgUFJPTV9WMzoKIAkJcmV0ID0gKCoocm9tdmVjLT52M19jcHVzdGFydCkpKGNwdW5vZGUsIChpbnQpIGN0YWJsZV9yZWcsIGN0eCwgcGMpOwogCQlicmVhazsKLQl9OworCX0KIAlyZXN0b3JlX2N1cnJlbnQoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcm9tX2xvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2NvbmZpZ3MvdGlsZWd4X2RlZmNvbmZpZyBiL2FyY2gvdGlsZS9jb25maWdzL3RpbGVneF9kZWZjb25maWcKaW5kZXggMDlmMWM3Zi4uMmFkNzNmYiAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2NvbmZpZ3MvdGlsZWd4X2RlZmNvbmZpZworKysgYi9hcmNoL3RpbGUvY29uZmlncy90aWxlZ3hfZGVmY29uZmlnCkBAIC0xNDc5LDcgKzE0NzksNiBAQAogQ09ORklHX05GU19VU0VfS0VSTkVMX0ROUz15CiAjIENPTkZJR19ORlNfVVNFX05FV19JRE1BUFBFUiBpcyBub3Qgc2V0CiBDT05GSUdfTkZTRD1tCi1DT05GSUdfTkZTRF9ERVBSRUNBVEVEPXkKIENPTkZJR19ORlNEX1YyX0FDTD15CiBDT05GSUdfTkZTRF9WMz15CiBDT05GSUdfTkZTRF9WM19BQ0w9eQpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL21tem9uZS5oCmluZGV4IGM2MzQ0YzQuLjlkM2RiY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9tbXpvbmUuaAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbW16b25lLmgKQEAgLTQwLDE3ICs0MCw2IEBACiAJcmV0dXJuIGhpZ2hiaXRzX3RvX25vZGVbX19wZm5fdG9faGlnaGJpdHMocGZuKV07CiB9CiAKLS8qCi0gKiBGb2xsb3dpbmcgYXJlIG1hY3JvcyB0aGF0IGVhY2ggbnVtYSBpbXBsbWVudGF0aW9uIG11c3QgZGVmaW5lLgotICovCi0KLSNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQotI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkJCQkJCVwKLSh7CQkJCQkJCQkJXAotCXBnX2RhdGFfdCAqX19wZ2RhdCA9IE5PREVfREFUQShuaWQpOwkJCQlcCi0JX19wZ2RhdC0+bm9kZV9zdGFydF9wZm4gKyBfX3BnZGF0LT5ub2RlX3NwYW5uZWRfcGFnZXM7CQlcCi19KQotCiAjZGVmaW5lIGtlcm5fYWRkcl92YWxpZChrYWRkcikJdmlydF9hZGRyX3ZhbGlkKCh2b2lkICopa2FkZHIpCiAKIHN0YXRpYyBpbmxpbmUgaW50IHBmbl92YWxpZChpbnQgcGZuKQpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvdGlsZS9rZXJuZWwvbW9kdWxlLmMKaW5kZXggZjY4ZGY2OS4uMjhmYTZlYyAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL3RpbGUva2VybmVsL21vZHVsZS5jCkBAIC05OCwyNSArOTgsNiBAQAogCSAqLwogfQogCi0vKiBXZSBkb24ndCBuZWVkIGFueXRoaW5nIHNwZWNpYWwuICovCi1pbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLAotCQkJICAgICAgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCQkgICAgICBjaGFyICpzZWNzdHJpbmdzLAotCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbW9kKQotewotCXJldHVybiAwOwotfQotCi1pbnQgYXBwbHlfcmVsb2NhdGUoRWxmX1NoZHIgKnNlY2hkcnMsCi0JCSAgIGNvbnN0IGNoYXIgKnN0cnRhYiwKLQkJICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAotCQkgICB1bnNpZ25lZCBpbnQgcmVsc2VjLAotCQkgICBzdHJ1Y3QgbW9kdWxlICptZSkKLXsKLQlwcl9lcnIoIm1vZHVsZSAlczogLnJlbCByZWxvY2F0aW9uIHVuc3VwcG9ydGVkXG4iLCBtZS0+bmFtZSk7Ci0JcmV0dXJuIC1FTk9FWEVDOwotfQotCiAjaWZkZWYgX190aWxlZ3hfXwogLyoKICAqIFZhbGlkYXRlIHRoYXQgdGhlIGhpZ2ggMTYgYml0cyBvZiAidmFsdWUiIGlzIGp1c3QgdGhlIHNpZ24tZXh0ZW5zaW9uIG9mCkBAIC0yNDksMTUgKzIzMCwzIEBACiAJfQogCXJldHVybiAwOwogfQotCi1pbnQgbW9kdWxlX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICpoZHIsCi0JCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKLQkJICAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotCS8qIEZJWE1FOiBwZXJoYXBzIHJlbW92ZSB0aGUgIndyaXRhYmxlIiBiaXQgZnJvbSB0aGUgVExCPyAqLwotCXJldHVybiAwOwotfQotCi12b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQotewotfQpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC90aWxlL2tlcm5lbC9zZXR1cC5jCmluZGV4IDZjZGM5YmEuLjVmODVkOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3RpbGUva2VybmVsL3NldHVwLmMKQEAgLTU1Myw4ICs1NTMsNyBAQAogCiAjaWZkZWYgQ09ORklHX0tFWEVDCiAJaWYgKGNyYXNoa19yZXMuc3RhcnQgIT0gY3Jhc2hrX3Jlcy5lbmQpCi0JCXJlc2VydmVfYm9vdG1lbShjcmFzaGtfcmVzLnN0YXJ0LAotCQkJY3Jhc2hrX3Jlcy5lbmQgLSBjcmFzaGtfcmVzLnN0YXJ0ICsgMSwgMCk7CisJCXJlc2VydmVfYm9vdG1lbShjcmFzaGtfcmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZjcmFzaGtfcmVzKSwgMCk7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2t2bS9LY29uZmlnIGIvYXJjaC90aWxlL2t2bS9LY29uZmlnCmluZGV4IGI4OGY5YzAuLjY2OWZjZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rdm0vS2NvbmZpZworKysgYi9hcmNoL3RpbGUva3ZtL0tjb25maWcKQEAgLTMzLDYgKzMzLDUgQEAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIHNvdXJjZSBkcml2ZXJzL3Zob3N0L0tjb25maWcKLXNvdXJjZSBkcml2ZXJzL3ZpcnRpby9LY29uZmlnCiAKIGVuZGlmICMgVklSVFVBTElaQVRJT04KZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZy54ODYgYi9hcmNoL3VtL0tjb25maWcueDg2CmluZGV4IDhhYWU0MjkuLmQzMWVjZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZy54ODYKKysrIGIvYXJjaC91bS9LY29uZmlnLng4NgpAQCAtMSwzICsxLDUgQEAKK21haW5tZW51ICJVc2VyIE1vZGUgTGludXgvJFNVQkFSQ0ggJEtFUk5FTFZFUlNJT04gS2VybmVsIENvbmZpZ3VyYXRpb24iCisKIHNvdXJjZSAiYXJjaC91bS9LY29uZmlnLmNvbW1vbiIKIAogbWVudSAiVU1MLXNwZWNpZmljIG9wdGlvbnMiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKaW5kZXggMjVlMTk2NS4uZDQxOTFmZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYwpAQCAtNTQzLDExICs1NDMsMTAgQEAKIAkJICAgIGNvbnN0IHN0cnVjdCBjaGFuX29wdHMgKm9wdHMsIGNoYXIgKiplcnJvcl9vdXQpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMgPSAmbGluZS0+Y2hhbl9saXN0OwotCXN0cnVjdCBjaGFuICpuZXcsICpjaGFuOworCXN0cnVjdCBjaGFuICpuZXc7CiAJY2hhciAqaW4sICpvdXQ7CiAKIAlpZiAoIWxpc3RfZW1wdHkoY2hhbnMpKSB7Ci0JCWNoYW4gPSBsaXN0X2VudHJ5KGNoYW5zLT5uZXh0LCBzdHJ1Y3QgY2hhbiwgbGlzdCk7CiAJCWZyZWVfY2hhbihjaGFucywgMCk7CiAJCUlOSVRfTElTVF9IRUFEKGNoYW5zKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvY293X3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9jb3dfdXNlci5jCmluZGV4IDkzZjIyN2EuLjljYmI0MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jb3dfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9jb3dfdXNlci5jCkBAIC0xODYsNyArMTg2LDExIEBACiAJCXN0cmNhdCh0bywgIi8iKTsKIAkJc3RyY2F0KHRvLCBmcm9tKTsKIAl9Ci0JY2hkaXIoc2F2ZV9jd2QpOworCWlmIChjaGRpcihzYXZlX2N3ZCkpIHsKKwkJY293X3ByaW50ZigiYWJzb2x1dGl6ZSA6IENhbid0IGNkIHRvICclcycgLSAiCisJCQkgICAiZXJybm8gPSAlZFxuIiwgc2F2ZV9jd2QsIGVycm5vKTsKKwkJcmV0dXJuIC0xOworCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jCmluZGV4IGI1NmY4ZTAuLjg0ZGNlM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvaGFyZGRvZ191c2VyLmMKQEAgLTMyLDcgKzMyLDcgQEAKIHsKIAlzdHJ1Y3QgZG9nX2RhdGEgZGF0YTsKIAlpbnQgaW5fZmRzWzJdLCBvdXRfZmRzWzJdLCBwaWQsIG4sIGVycjsKLQljaGFyIHBpZF9idWZbc2l6ZW9mKCJubm5ublwwIildLCBjOworCWNoYXIgcGlkX2J1ZltzaXplb2YoIm5ubm5ubm5cMCIpXSwgYzsKIAljaGFyICpwaWRfYXJnc1tdID0geyAiL3Vzci9iaW4vdW1sX3dhdGNoZG9nIiwgIi1waWQiLCBwaWRfYnVmLCBOVUxMIH07CiAJY2hhciAqbWNvbnNvbGVfYXJnc1tdID0geyAiL3Vzci9iaW4vdW1sX3dhdGNoZG9nIiwgIi1tY29uc29sZSIsIE5VTEwsCiAJCQkJICBOVUxMIH07CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwppbmRleCAzNWRkMGI4Li5kNTFjNDA0IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKQEAgLTE3NiwxMCArMTc2LDkgQEAKIHsKIAlzdHJ1Y3QgbGluZSAqbGluZSA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZXJyOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxpbmUtPmxvY2ssIGZsYWdzKTsKLQllcnIgPSBmbHVzaF9idWZmZXIobGluZSk7CisJZmx1c2hfYnVmZmVyKGxpbmUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpbmUtPmxvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYwppbmRleCA0N2QwYzM3Li4yMjc0NWI0IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYwpAQCAtMjYyLDYgKzI2MiwxNSBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIHVtbF9uZXRfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXVtbF9uZXRfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIHVtbF9uZXRfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewpAQCAtMzY0LDYgKzM3Myw5IEBACiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCiAJLm5kb19jaGFuZ2VfbXR1IAk9IHVtbF9uZXRfY2hhbmdlX210dSwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyID0gdW1sX25ldF9wb2xsX2NvbnRyb2xsZXIsCisjZW5kaWYKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbmV0X3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9uZXRfdXNlci5jCmluZGV4IDk0MTVkZDkuLjUyMDExODggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9uZXRfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9uZXRfdXNlci5jCkBAIC0yMjgsNyArMjI4LDEwIEBACiAJCSAgICAgICAiYnVmZmVyXG4iKTsKIAogCXBpZCA9IGNoYW5nZV90cmFtcChhcmd2LCBvdXRwdXQsIG91dHB1dF9sZW4pOwotCWlmIChwaWQgPCAwKSByZXR1cm47CisJaWYgKHBpZCA8IDApIHsKKwkJa2ZyZWUob3V0cHV0KTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChvdXRwdXQgIT0gTlVMTCkgewogCQlwcmludGsoIiVzIiwgb3V0cHV0KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYwppbmRleCBhMWMyZDJjLi5jYmFjZmM0IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkJICAgICAgICJidWZmZXJcbiIpOwogCQlvc19raWxsX3Byb2Nlc3MocGlkLCAxKTsKIAkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXRfZnJlZTsKKwkJZ290byBvdXRfY2xvc2U7CiAJfQogCiAJY2xvc2UoZmRzWzFdKTsKQEAgLTExMiw3ICsxMTIsNiBAQAogCWVyciA9IGhlbHBlcl93YWl0KHBpZCk7CiAJY2xvc2UoZmRzWzBdKTsKIAotb3V0X2ZyZWU6CiAJa2ZyZWUob3V0cHV0KTsKIAlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2RlbGF5LmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL2RlbGF5LmgKaW5kZXggYzcxZTMyYi4uOGE1NTc2ZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9kZWxheS5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9hc20vZGVsYXkuaApAQCAtMSwyMCArMSwxOCBAQAogI2lmbmRlZiBfX1VNX0RFTEFZX0gKICNkZWZpbmUgX19VTV9ERUxBWV9ICiAKLSNkZWZpbmUgTUlMTElPTiAxMDAwMDAwCi0KIC8qIFVuZGVmaW5lZCBvbiBwdXJwb3NlICovCiBleHRlcm4gdm9pZCBfX2JhZF91ZGVsYXkodm9pZCk7CitleHRlcm4gdm9pZCBfX2JhZF9uZGVsYXkodm9pZCk7CiAKIGV4dGVybiB2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpOworZXh0ZXJuIHZvaWQgX19uZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CiBleHRlcm4gdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpOwogCiAjZGVmaW5lIHVkZWxheShuKSAoKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pICYmIChuKSA+IDIwMDAwKSA/IFwKIAlfX2JhZF91ZGVsYXkoKSA6IF9fdWRlbGF5KG4pKQogCi0vKiBJdCBhcHBlYXJzIHRoYXQgbmRlbGF5IGlzIG5vdCB1c2VkIGF0IGFsbCBmb3IgVU1MLCBhbmQgaGFzIG5ldmVyIGJlZW4KLSAqIGltcGxlbWVudGVkLiAqLwotZXh0ZXJuIHZvaWQgX191bmltcGxlbWVudGVkX25kZWxheSh2b2lkKTsKLSNkZWZpbmUgbmRlbGF5KG4pIF9fdW5pbXBsZW1lbnRlZF9uZGVsYXkoKQorI2RlZmluZSBuZGVsYXkobikgKChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSAmJiAobikgPiAyMDAwMCkgPyBcCisJX19iYWRfbmRlbGF5KCkgOiBfX25kZWxheShuKSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BlcmNwdS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9wZXJjcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmU3NTA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9wZXJjcHUuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX19VTV9QRVJDUFVfSAorI2RlZmluZSBfX1VNX1BFUkNQVV9ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZXJjcHUuaD4KKworI2VuZGlmIC8qIF9fVU1fUEVSQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL2V4ZWMuYyBiL2FyY2gvdW0va2VybmVsL2V4ZWMuYwppbmRleCAwOWJkN2I1Li45MzlhNGE2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9leGVjLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvZXhlYy5jCkBAIC0zOCw3ICszOCw2IEBACiAKIHZvaWQgc3RhcnRfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVpcCwgdW5zaWduZWQgbG9uZyBlc3ApCiB7Ci0Jc2V0X2ZzKFVTRVJfRFMpOwogCVBUX1JFR1NfSVAocmVncykgPSBlaXA7CiAJUFRfUkVHU19TUChyZWdzKSA9IGVzcDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3JlYm9vdC5jIGIvYXJjaC91bS9rZXJuZWwvcmVib290LmMKaW5kZXggODY5YmVjOS4uNGQ5M2RmZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC91bS9rZXJuZWwvcmVib290LmMKQEAgLTIwLDkgKzIwLDggQEAKIAkJb3Nfa2lsbF9wdHJhY2VkX3Byb2Nlc3ModXNlcnNwYWNlX3BpZFswXSwgMSk7CiAJZWxzZSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKLQkJaW50IHBpZCwgbWU7CisJCWludCBwaWQ7CiAKLQkJbWUgPSBvc19nZXRwaWQoKTsKIAkJZm9yX2VhY2hfcHJvY2VzcyhwKSB7CiAJCQlpZiAocC0+bW0gPT0gTlVMTCkKIAkJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUgYi9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlCmluZGV4IGQ2NmYwMzguLmIzM2Y0ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZQpAQCAtMywxMCArMywxMiBAQAogIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAjCiAKLW9iai15ID0gYWlvLm8gZWxmX2F1eC5vIGV4ZWN2cC5vIGZpbGUubyBoZWxwZXIubyBpcnEubyBtYWluLm8gbWVtLm8gcHJvY2Vzcy5vIFwKK29iai15ID0gYWlvLm8gZXhlY3ZwLm8gZmlsZS5vIGhlbHBlci5vIGlycS5vIG1haW4ubyBtZW0ubyBwcm9jZXNzLm8gXAogCXJlZ2lzdGVycy5vIHNpZ2lvLm8gc2lnbmFsLm8gc3RhcnRfdXAubyB0aW1lLm8gdHR5Lm8gdWFjY2Vzcy5vIFwKIAl1bWlkLm8gdGxzLm8gdXNlcl9zeW1zLm8gdXRpbC5vIGRyaXZlcnMvIHN5cy0kKFNVQkFSQ0gpLyBza2FzLwogCitvYmotJChDT05GSUdfQVJDSF9SRVVTRV9IT1NUX1ZTWVNDQUxMX0FSRUEpICs9IGVsZl9hdXgubworCiBVU0VSX09CSlMgOj0gJCh1c2VyLW9ianMteSkgYWlvLm8gZWxmX2F1eC5vIGV4ZWN2cC5vIGZpbGUubyBoZWxwZXIubyBpcnEubyBcCiAJbWFpbi5vIG1lbS5vIHByb2Nlc3MubyByZWdpc3RlcnMubyBzaWdpby5vIHNpZ25hbC5vIHN0YXJ0X3VwLm8gdGltZS5vIFwKIAl0dHkubyB0bHMubyB1YWNjZXNzLm8gdW1pZC5vIHV0aWwubwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9lbGZfYXV4LmMgYi9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYwppbmRleCA2MDg3ODRkLi45NTMzMjM3IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYwpAQCAtMTQsMTYgKzE0LDExIEBACiAjaW5jbHVkZSAibWVtX3VzZXIuaCIKICNpbmNsdWRlIDxrZXJuX2NvbnN0YW50cy5oPgogCi0vKiBVc2UgdGhlIG9uZSBmcm9tIHRoZSBrZXJuZWwgLSB0aGUgaG9zdCBtYXkgbWlzcyBpdCwgaWYgaGF2aW5nIG9sZCBoZWFkZXJzLiAqLwotI2lmIFVNX0VMRl9DTEFTUyA9PSBVTV9FTEZDTEFTUzMyCiB0eXBlZGVmIEVsZjMyX2F1eHZfdCBlbGZfYXV4dl90OwotI2Vsc2UKLXR5cGVkZWYgRWxmNjRfYXV4dl90IGVsZl9hdXh2X3Q7Ci0jZW5kaWYKIAogLyogVGhlc2UgYXJlIGluaXRpYWxpemVkIHZlcnkgZWFybHkgaW4gYm9vdCBhbmQgbmV2ZXIgY2hhbmdlZCAqLwogY2hhciAqIGVsZl9hdXhfcGxhdGZvcm07Ci1sb25nIGVsZl9hdXhfaHdjYXA7CitleHRlcm4gbG9uZyBlbGZfYXV4X2h3Y2FwOwogdW5zaWduZWQgbG9uZyB2c3lzY2FsbF9laGRyOwogdW5zaWduZWQgbG9uZyB2c3lzY2FsbF9lbmQ7CiB1bnNpZ25lZCBsb25nIF9fa2VybmVsX3ZzeXNjYWxsOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKaW5kZXggYjZiMTA5Ni4uZmVmZjIyZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCkBAIC0yOCwxNCArMjgsMTQgQEAKIHsKIAlzdHJ1Y3QgaGVscGVyX2RhdGEgKmRhdGEgPSBhcmc7CiAJY2hhciAqKmFyZ3YgPSBkYXRhLT5hcmd2OwotCWludCBlcnI7CisJaW50IGVyciwgcmV0OwogCiAJaWYgKGRhdGEtPnByZV9leGVjICE9IE5VTEwpCiAJCSgqZGF0YS0+cHJlX2V4ZWMpKGRhdGEtPnByZV9kYXRhKTsKIAllcnIgPSBleGVjdnBfbm9hbGxvYyhkYXRhLT5idWYsIGFyZ3ZbMF0sIGFyZ3YpOwogCiAJLyogSWYgdGhlIGV4ZWMgc3VjY2VlZHMsIHdlIGRvbid0IGdldCBoZXJlICovCi0Jd3JpdGUoZGF0YS0+ZmQsICZlcnIsIHNpemVvZihlcnIpKTsKKwlDQVRDSF9FSU5UUihyZXQgPSB3cml0ZShkYXRhLT5mZCwgJmVyciwgc2l6ZW9mKGVycikpKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9tYWluLmMgYi9hcmNoL3VtL29zLUxpbnV4L21haW4uYwppbmRleCBmYjJhOTdhLi44NDcxYjgxIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L21haW4uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L21haW4uYwpAQCAtMjEsNiArMjEsOCBAQAogI2RlZmluZSBTVEFDS1NJWkUgKDggKiAxMDI0ICogMTAyNCkKICNkZWZpbmUgVEhSRUFEX05BTUVfTEVOICgyNTYpCiAKK2xvbmcgZWxmX2F1eF9od2NhcDsKKwogc3RhdGljIHZvaWQgc2V0X3N0a2xpbSh2b2lkKQogewogCXN0cnVjdCBybGltaXQgbGltOwpAQCAtMTQzLDcgKzE0NSw5IEBACiAJaW5zdGFsbF9mYXRhbF9oYW5kbGVyKFNJR0lOVCk7CiAJaW5zdGFsbF9mYXRhbF9oYW5kbGVyKFNJR1RFUk0pOwogCisjaWZkZWYgQ09ORklHX0FSQ0hfUkVVU0VfSE9TVF9WU1lTQ0FMTF9BUkVBCiAJc2Nhbl9lbGZfYXV4KGVudnApOworI2VuZGlmCiAKIAlkb191bWxfaW5pdGNhbGxzKCk7CiAJcmV0ID0gbGludXhfbWFpbihhcmdjLCBhcmd2KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvbWVtLmMgYi9hcmNoL3VtL29zLUxpbnV4L21lbS5jCmluZGV4IGU2OTYxNDQuLjYyODc4Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvbWVtLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9tZW0uYwpAQCAtMTc2LDcgKzE3Niw3IEBACiAKIAlmaW5kX3RlbXBkaXIoKTsKIAlpZiAoKHRlbXBkaXIgPT0gTlVMTCkgfHwgKHN0cmxlbih0ZW1wZGlyKSA+PSBNQVhQQVRITEVOKSkKLQkJcmV0dXJuIC0xOworCQlnb3RvIG91dDsKIAogCWlmICh0ZW1wbGF0ZVswXSAhPSAnLycpCiAJCXN0cmNweSh0ZW1wbmFtZSwgdGVtcGRpcik7CkBAIC0xOTEsMTMgKzE5MSwxNSBAQAogCX0KIAlpZiAoZG9fdW5saW5rICYmICh1bmxpbmsodGVtcG5hbWUpIDwgMCkpIHsKIAkJcGVycm9yKCJ1bmxpbmsiKTsKLQkJZ290byBvdXQ7CisJCWdvdG8gY2xvc2U7CiAJfQogCWlmIChvdXRfdGVtcG5hbWUpIHsKIAkJKm91dF90ZW1wbmFtZSA9IHRlbXBuYW1lOwogCX0gZWxzZQogCQlmcmVlKHRlbXBuYW1lKTsKIAlyZXR1cm4gZmQ7CitjbG9zZToKKwljbG9zZShmZCk7CiBvdXQ6CiAJZnJlZSh0ZW1wbmFtZSk7CiAJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC91c2VyX3N5bXMuYyBiL2FyY2gvdW0vb3MtTGludXgvdXNlcl9zeW1zLmMKaW5kZXggMDVmNWVhOC4uNDVmZmU0NiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC91c2VyX3N5bXMuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jCkBAIC0xMTMsMyArMTEzLDggQEAKIAogZXh0ZXJuIGxvbmcgX19ndWFyZCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CiBFWFBPUlRfU1lNQk9MKF9fZ3VhcmQpOworCisjaWZkZWYgX0ZPUlRJRllfU09VUkNFCitleHRlcm4gaW50IF9fc3ByaW50Zl9jaGsoY2hhciAqc3RyLCBpbnQgZmxhZywgc2l6ZV90IHN0cmxlbiwgY29uc3QgY2hhciAqZm9ybWF0KTsKK0VYUE9SVF9TWU1CT0woX19zcHJpbnRmX2Noayk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUgYi9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlCmluZGV4IGIxZGE5MWMuLjM5MjNjZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZQpAQCAtNCwxMSArNCwxMiBAQAogCiBvYmoteSA9IGJ1Zy5vIGJ1Z3MubyBjaGVja3N1bS5vIGRlbGF5Lm8gZmF1bHQubyBrc3ltcy5vIGxkdC5vIHB0cmFjZS5vIFwKIAlwdHJhY2VfdXNlci5vIHNldGptcC5vIHNpZ25hbC5vIHN0dWIubyBzdHViX3NlZ3YubyBzeXNjYWxscy5vIHN5c3JxLm8gXAotCXN5c19jYWxsX3RhYmxlLm8gdGxzLm8gYXRvbWljNjRfY3g4XzMyLm8KKwlzeXNfY2FsbF90YWJsZS5vIHRscy5vIGF0b21pYzY0X2N4OF8zMi5vIG1lbS5vCiAKIG9iai0kKENPTkZJR19CSU5GTVRfRUxGKSArPSBlbGZjb3JlLm8KIAotc3ViYXJjaC1vYmoteSA9IGxpYi9zZW1hcGhvcmVfMzIubyBsaWIvc3RyaW5nXzMyLm8KK3N1YmFyY2gtb2JqLXkgPSBsaWIvc3RyaW5nXzMyLm8KK3N1YmFyY2gtb2JqLSQoQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNKSArPSBsaWIvcndzZW0ubwogc3ViYXJjaC1vYmotJChDT05GSUdfSElHSE1FTSkgKz0gbW0vaGlnaG1lbV8zMi5vCiBzdWJhcmNoLW9iai0kKENPTkZJR19NT0RVTEVTKSArPSBrZXJuZWwvbW9kdWxlLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9hc20vZWxmLmggYi9hcmNoL3VtL3N5cy1pMzg2L2FzbS9lbGYuaAppbmRleCBkOTY0YTQxLi40MjMwNTU1IDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L2FzbS9lbGYuaAorKysgYi9hcmNoL3VtL3N5cy1pMzg2L2FzbS9lbGYuaApAQCAtMTA1LDYgKzEwNSw4IEBACiAjZGVmaW5lIEZJWEFERFJfVVNFUl9TVEFSVCAgICAgIFZTWVNDQUxMX0JBU0UKICNkZWZpbmUgRklYQUREUl9VU0VSX0VORCAgICAgICAgVlNZU0NBTExfRU5ECiAKKyNkZWZpbmUgX19IQVZFX0FSQ0hfR0FURV9BUkVBIDEKKwogLyoKICAqIEFyY2hpdGVjdHVyZS1uZXV0cmFsIEFUXyB2YWx1ZXMgaW4gMC0xNywgbGVhdmUgc29tZSByb29tCiAgKiBmb3IgbW9yZSBvZiB0aGVtLCBzdGFydCB0aGUgeDg2LXNwZWNpZmljIG9uZXMgYXQgMzIuCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2RlbGF5LmMgYi9hcmNoL3VtL3N5cy1pMzg2L2RlbGF5LmMKaW5kZXggZDYyM2UwNy4uZjNmZTFhNiAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9kZWxheS5jCisrKyBiL2FyY2gvdW0vc3lzLWkzODYvZGVsYXkuYwpAQCAtMSwyOSArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSaWNoYXJkIFdlaW5iZXJnZXIgPHJpY2hyZEBub2QuYXQ+CisgKiBNb3N0bHkgY29waWVkIGZyb20gYXJjaC94ODYvbGliL2RlbGF5LmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgogCi12b2lkIF9fZGVsYXkodW5zaWduZWQgbG9uZyB0aW1lKQordm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCiB7Ci0JLyogU3RvbGVuIGZyb20gdGhlIGkzODYgX19sb29wX2RlbGF5ICovCi0JaW50IGQwOwotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiXHRqbXAgMWZcbiIKKwlhc20gdm9sYXRpbGUoCisJCSJ0ZXN0ICUwLCUwXG4iCisJCSJqeiAzZlxuIgorCQkiam1wIDFmXG4iCisKIAkJIi5hbGlnbiAxNlxuIgotCQkiMTpcdGptcCAyZlxuIgorCQkiMTogam1wIDJmXG4iCisKIAkJIi5hbGlnbiAxNlxuIgotCQkiMjpcdGRlY2wgJTBcblx0am5zIDJiIgotCQk6Ij0mYSIgKGQwKQotCQk6IjAiICh0aW1lKSk7CisJCSIyOiBkZWMgJTBcbiIKKwkJIiBqbnogMmJcbiIKKwkJIjM6IGRlYyAlMFxuIgorCisJCTogLyogd2UgZG9uJ3QgbmVlZCBvdXRwdXQgKi8KKwkJOiAiYSIgKGxvb3BzKQorCSk7CiB9CitFWFBPUlRfU1lNQk9MKF9fZGVsYXkpOworCitpbmxpbmUgdm9pZCBfX2NvbnN0X3VkZWxheSh1bnNpZ25lZCBsb25nIHhsb29wcykKK3sKKwlpbnQgZDA7CisKKwl4bG9vcHMgKj0gNDsKKwlhc20oIm11bGwgJSVlZHgiCisJCTogIj1kIiAoeGxvb3BzKSwgIj0mYSIgKGQwKQorCQk6ICIxIiAoeGxvb3BzKSwgIjAiCisJCShsb29wc19wZXJfamlmZnkgKiAoSFovNCkpKTsKKworCV9fZGVsYXkoKyt4bG9vcHMpOworfQorRVhQT1JUX1NZTUJPTChfX2NvbnN0X3VkZWxheSk7CiAKIHZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKIHsKLQlpbnQgaSwgbjsKLQotCW4gPSAobG9vcHNfcGVyX2ppZmZ5ICogSFogKiB1c2VjcykgLyBNSUxMSU9OOwotICAgICAgICBmb3IoaT0wO2k8bjtpKyspCi0gICAgICAgICAgICAgICAgY3B1X3JlbGF4KCk7CisJX19jb25zdF91ZGVsYXkodXNlY3MgKiAweDAwMDAxMGM3KTsgLyogMioqMzIgLyAxMDAwMDAwIChyb3VuZGVkIHVwKSAqLwogfQotCiBFWFBPUlRfU1lNQk9MKF9fdWRlbGF5KTsKKwordm9pZCBfX25kZWxheSh1bnNpZ25lZCBsb25nIG5zZWNzKQoreworCV9fY29uc3RfdWRlbGF5KG5zZWNzICogMHgwMDAwNSk7IC8qIDIqKjMyIC8gMTAwMDAwMDAwMCAocm91bmRlZCB1cCkgKi8KK30KK0VYUE9SVF9TWU1CT0woX19uZGVsYXkpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9tZW0uYyBiL2FyY2gvdW0vc3lzLWkzODYvbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5OTAwYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vc3lzLWkzODYvbWVtLmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSaWNoYXJkIFdlaW5iZXJnZXIgPHJpY2hyZEBub2QuYXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9tbWFuLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgZ2F0ZV92bWE7CisKK3N0YXRpYyBpbnQgX19pbml0IGdhdGVfdm1hX2luaXQodm9pZCkKK3sKKwlpZiAoIUZJWEFERFJfVVNFUl9TVEFSVCkKKwkJcmV0dXJuIDA7CisKKwlnYXRlX3ZtYS52bV9tbSA9IE5VTEw7CisJZ2F0ZV92bWEudm1fc3RhcnQgPSBGSVhBRERSX1VTRVJfU1RBUlQ7CisJZ2F0ZV92bWEudm1fZW5kID0gRklYQUREUl9VU0VSX0VORDsKKwlnYXRlX3ZtYS52bV9mbGFncyA9IFZNX1JFQUQgfCBWTV9NQVlSRUFEIHwgVk1fRVhFQyB8IFZNX01BWUVYRUM7CisJZ2F0ZV92bWEudm1fcGFnZV9wcm90ID0gX19QMTAxOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIHZEU08gZ2V0cyBpbnRvIGV2ZXJ5IGNvcmUgZHVtcC4KKwkgKiBEdW1waW5nIGl0cyBjb250ZW50cyBtYWtlcyBwb3N0LW1vcnRlbSBmdWxseSBpbnRlcnByZXRhYmxlIGxhdGVyCisJICogd2l0aG91dCBtYXRjaGluZyB1cCB0aGUgc2FtZSBrZXJuZWwgYW5kIGhhcmR3YXJlIGNvbmZpZyB0byBzZWUKKwkgKiB3aGF0IFBDIHZhbHVlcyBtZWFudC4KKwkgKi8KKwlnYXRlX3ZtYS52bV9mbGFncyB8PSBWTV9BTFdBWVNEVU1QOworCisJcmV0dXJuIDA7Cit9CitfX2luaXRjYWxsKGdhdGVfdm1hX2luaXQpOworCitzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmdldF9nYXRlX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlyZXR1cm4gRklYQUREUl9VU0VSX1NUQVJUID8gJmdhdGVfdm1hIDogTlVMTDsKK30KKworaW50IGluX2dhdGVfYXJlYV9ub19tbSh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaWYgKCFGSVhBRERSX1VTRVJfU1RBUlQpCisJCXJldHVybiAwOworCisJaWYgKChhZGRyID49IEZJWEFERFJfVVNFUl9TVEFSVCkgJiYgKGFkZHIgPCBGSVhBRERSX1VTRVJfRU5EKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGluX2dhdGVfYXJlYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gZ2V0X2dhdGVfdm1hKG1tKTsKKworCWlmICghdm1hKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAoYWRkciA+PSB2bWEtPnZtX3N0YXJ0KSAmJiAoYWRkciA8IHZtYS0+dm1fZW5kKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2lnbmFsLmMgYi9hcmNoL3VtL3N5cy1pMzg2L3NpZ25hbC5jCmluZGV4IDEyOTY0NzMuLjg5YTQ2NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2lnbmFsLmMKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9zaWduYWwuYwpAQCAtNTgsNyArNTgsNyBAQAogCXVuc2lnbmVkIGxvbmcgcmV0ID0gMHhmZmZmMDAwMDsKIAlpbnQgaTsKIAotI2RlZmluZSBGUFJFR19BRERSKGYsIG4pCSgoY2hhciAqKSYoZiktPnN0X3NwYWNlICsgKG4pICogMTYpOworI2RlZmluZSBGUFJFR19BRERSKGYsIG4pCSgoY2hhciAqKSYoZiktPnN0X3NwYWNlICsgKG4pICogMTYpCiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCWlmICh0d2QgJiAweDEpIHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZSBiL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZQppbmRleCBjMWVhOWViLi5iZDRkMWQzIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L01ha2VmaWxlCkBAIC00LDEyICs0LDE0IEBACiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICMKIAotb2JqLXkgPSBidWcubyBidWdzLm8gZGVsYXkubyBmYXVsdC5vIGxkdC5vIG1lbS5vIHB0cmFjZS5vIHB0cmFjZV91c2VyLm8gXAorb2JqLXkgPSBidWcubyBidWdzLm8gZGVsYXkubyBmYXVsdC5vIGxkdC5vIHB0cmFjZS5vIHB0cmFjZV91c2VyLm8gbWVtLm8gXAogCXNldGptcC5vIHNpZ25hbC5vIHN0dWIubyBzdHViX3NlZ3YubyBzeXNjYWxscy5vIHN5c2NhbGxfdGFibGUubyBcCiAJc3lzcnEubyBrc3ltcy5vIHRscy5vCiAKK29iai15ICs9IHZkc28vCisKIHN1YmFyY2gtb2JqLXkgPSBsaWIvY3N1bS1wYXJ0aWFsXzY0Lm8gbGliL21lbWNweV82NC5vIGxpYi90aHVua182NC5vIFwKLQkJbGliL3J3c2VtXzY0Lm8KKwkJbGliL3J3c2VtLm8KIHN1YmFyY2gtb2JqLSQoQ09ORklHX01PRFVMRVMpICs9IGtlcm5lbC9tb2R1bGUubwogCiBsZHQteSA9IC4uL3N5cy1pMzg2L2xkdC5vCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL2VsZi5oIGIvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9lbGYuaAppbmRleCBkNmQ1YWYzLi4xMWEyYmZiIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL2VsZi5oCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9hc20vZWxmLmgKQEAgLTExOSw0ICsxMTksMTQgQEAKIAogI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIGRvIDsgd2hpbGUoMCkKIAorI2RlZmluZSBfX0hBVkVfQVJDSF9HQVRFX0FSRUEgMQorI2RlZmluZSBBUkNIX0hBU19TRVRVUF9BRERJVElPTkFMX1BBR0VTIDEKK3N0cnVjdCBsaW51eF9iaW5wcm07CitleHRlcm4gaW50IGFyY2hfc2V0dXBfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLAorCWludCB1c2VzX2ludGVycCk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHVtX3Zkc29fYWRkcjsKKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSIDMzCisjZGVmaW5lIEFSQ0hfRExJTkZPCU5FV19BVVhfRU5UKEFUX1NZU0lORk9fRUhEUiwgdW1fdmRzb19hZGRyKQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9kZWxheS5jIGIvYXJjaC91bS9zeXMteDg2XzY0L2RlbGF5LmMKaW5kZXggZGVlNWJlNi4uZjNmZTFhNiAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L2RlbGF5LmMKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L2RlbGF5LmMKQEAgLTEsMzAgKzEsNjAgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqIENvcGllZCBmcm9tIGFyY2gveDg2XzY0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmljaGFyZCBXZWluYmVyZ2VyIDxyaWNocmRAbm9kLmF0PgorICogTW9zdGx5IGNvcGllZCBmcm9tIGFyY2gveDg2L2xpYi9kZWxheS5jCiAgKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CiAKIHZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQogewotCXVuc2lnbmVkIGxvbmcgaTsKKwlhc20gdm9sYXRpbGUoCisJCSJ0ZXN0ICUwLCUwXG4iCisJCSJqeiAzZlxuIgorCQkiam1wIDFmXG4iCiAKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgbG9vcHM7IGkrKykKLSAgICAgICAgICAgICAgICBjcHVfcmVsYXgoKTsKKwkJIi5hbGlnbiAxNlxuIgorCQkiMTogam1wIDJmXG4iCisKKwkJIi5hbGlnbiAxNlxuIgorCQkiMjogZGVjICUwXG4iCisJCSIgam56IDJiXG4iCisJCSIzOiBkZWMgJTBcbiIKKworCQk6IC8qIHdlIGRvbid0IG5lZWQgb3V0cHV0ICovCisJCTogImEiIChsb29wcykKKwkpOwogfQorRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKKworaW5saW5lIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB4bG9vcHMpCit7CisJaW50IGQwOworCisJeGxvb3BzICo9IDQ7CisJYXNtKCJtdWxsICUlZWR4IgorCQk6ICI9ZCIgKHhsb29wcyksICI9JmEiIChkMCkKKwkJOiAiMSIgKHhsb29wcyksICIwIgorCQkobG9vcHNfcGVyX2ppZmZ5ICogKEhaLzQpKSk7CisKKwlfX2RlbGF5KCsreGxvb3BzKTsKK30KK0VYUE9SVF9TWU1CT0woX19jb25zdF91ZGVsYXkpOwogCiB2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCiB7Ci0JdW5zaWduZWQgbG9uZyBpLCBuOwotCi0JbiA9IChsb29wc19wZXJfamlmZnkgKiBIWiAqIHVzZWNzKSAvIE1JTExJT047Ci0gICAgICAgIGZvcihpPTA7aTxuO2krKykKLSAgICAgICAgICAgICAgICBjcHVfcmVsYXgoKTsKKwlfX2NvbnN0X3VkZWxheSh1c2VjcyAqIDB4MDAwMDEwYzcpOyAvKiAyKiozMiAvIDEwMDAwMDAgKHJvdW5kZWQgdXApICovCiB9Ci0KIEVYUE9SVF9TWU1CT0woX191ZGVsYXkpOworCit2b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbnNlY3MpCit7CisJX19jb25zdF91ZGVsYXkobnNlY3MgKiAweDAwMDA1KTsgLyogMioqMzIgLyAxMDAwMDAwMDAwIChyb3VuZGVkIHVwKSAqLworfQorRVhQT1JUX1NZTUJPTChfX25kZWxheSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvbWVtLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvbWVtLmMKaW5kZXggM2Y4ZGY4YS4uNTQ2NTE4NyAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L21lbS5jCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9tZW0uYwpAQCAtMSwxNiArMSwyNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCiAjaW5jbHVkZSAibGludXgvbW0uaCIKICNpbmNsdWRlICJhc20vcGFnZS5oIgogI2luY2x1ZGUgImFzbS9tbWFuLmgiCiAKLXVuc2lnbmVkIGxvbmcgdm1fc3RhY2tfZmxhZ3MgPSBfX1ZNX1NUQUNLX0ZMQUdTOwotdW5zaWduZWQgbG9uZyB2bV9zdGFja19mbGFnczMyID0gX19WTV9TVEFDS19GTEFHUzsKLXVuc2lnbmVkIGxvbmcgdm1fZGF0YV9kZWZhdWx0X2ZsYWdzID0gX19WTV9EQVRBX0RFRkFVTFRfRkxBR1M7Ci11bnNpZ25lZCBsb25nIHZtX2RhdGFfZGVmYXVsdF9mbGFnczMyID0gX19WTV9EQVRBX0RFRkFVTFRfRkxBR1M7Ci11bnNpZ25lZCBsb25nIHZtX2ZvcmNlX2V4ZWMzMiA9IFBST1RfRVhFQzsKK2NvbnN0IGNoYXIgKmFyY2hfdm1hX25hbWUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaWYgKHZtYS0+dm1fbW0gJiYgdm1hLT52bV9zdGFydCA9PSB1bV92ZHNvX2FkZHIpCisJCXJldHVybiAiW3Zkc29dIjsKIAorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmdldF9nYXRlX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGluX2dhdGVfYXJlYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiAwOworfQorCitpbnQgaW5fZ2F0ZV9hcmVhX25vX21tKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3ZtLWZsYWdzLmggYi9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC92bS1mbGFncy5oCmluZGV4IDMyMTNlZGYuLjM5NzhlNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3ZtLWZsYWdzLmgKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvdm0tZmxhZ3MuaApAQCAtNywyNyArNyw5IEBACiAjaWZuZGVmIF9fVk1fRkxBR1NfWDg2XzY0X0gKICNkZWZpbmUgX19WTV9GTEFHU19YODZfNjRfSAogCi0jZGVmaW5lIF9fVk1fREFUQV9ERUZBVUxUX0ZMQUdTCShWTV9SRUFEIHwgVk1fV1JJVEUgfCBWTV9FWEVDIHwgXAotCQkJCSBWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlFWEVDKQotI2RlZmluZSBfX1ZNX1NUQUNLX0ZMQUdTIAkoVk1fR1JPV1NET1dOIHwgVk1fUkVBRCB8IFZNX1dSSVRFIHwgXAotCQkJCSBWTV9FWEVDIHwgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgXAotCQkJCSBWTV9NQVlFWEVDKQotCi1leHRlcm4gdW5zaWduZWQgbG9uZyB2bV9zdGFja19mbGFncywgdm1fc3RhY2tfZmxhZ3MzMjsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHZtX2RhdGFfZGVmYXVsdF9mbGFncywgdm1fZGF0YV9kZWZhdWx0X2ZsYWdzMzI7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyB2bV9mb3JjZV9leGVjMzI7Ci0KLSNpZmRlZiBUSUZfSUEzMgotI2RlZmluZSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MgXAotCSh0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKSA/IHZtX2RhdGFfZGVmYXVsdF9mbGFnczMyIDogXAotCSAgdm1fZGF0YV9kZWZhdWx0X2ZsYWdzKQotCi0jZGVmaW5lIFZNX1NUQUNLX0RFRkFVTFRfRkxBR1MgXAotCSh0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKSA/IHZtX3N0YWNrX2ZsYWdzMzIgOiB2bV9zdGFja19mbGFncykKLSNlbmRpZgotCi0jZGVmaW5lIFZNX0RBVEFfREVGQVVMVF9GTEFHUyB2bV9kYXRhX2RlZmF1bHRfZmxhZ3MKLQotI2RlZmluZSBWTV9TVEFDS19ERUZBVUxUX0ZMQUdTIHZtX3N0YWNrX2ZsYWdzCisjZGVmaW5lIFZNX0RBVEFfREVGQVVMVF9GTEFHUyAoVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQyB8IFwKKwlWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlFWEVDKQorI2RlZmluZSBWTV9TVEFDS19ERUZBVUxUX0ZMQUdTIChWTV9HUk9XU0RPV04gfCBWTV9SRUFEIHwgVk1fV1JJVEUgfCBcCisJVk1fRVhFQyB8IFZNX01BWVJFQUQgfCBWTV9NQVlXUklURSB8IFZNX01BWUVYRUMpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vTWFrZWZpbGUgYi9hcmNoL3VtL3N5cy14ODZfNjQvdmRzby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGZmZTZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vTWFrZWZpbGUKQEAgLTAsMCArMSw5MCBAQAorIworIyBCdWlsZGluZyB2RFNPIGltYWdlcyBmb3IgeDg2LgorIworCitWRFNPNjQteQkJOj0geQorCit2ZHNvLWluc3RhbGwtJChWRFNPNjQteSkJKz0gdmRzby5zbworCisKKyMgZmlsZXMgdG8gbGluayBpbnRvIHRoZSB2ZHNvCit2b2Jqcy15IDo9IHZkc28tbm90ZS5vIHVtX3Zkc28ubworCisjIGZpbGVzIHRvIGxpbmsgaW50byBrZXJuZWwKK29iai0kKFZEU082NC15KQkJCSs9IHZkc28ubyB2bWEubworCit2b2JqcyA6PSAkKGZvcmVhY2ggRiwkKHZvYmpzLXkpLCQob2JqKS8kRikKKworJChvYmopL3Zkc28ubzogJChvYmopL3Zkc28uc28KKwordGFyZ2V0cyArPSB2ZHNvLnNvIHZkc28uc28uZGJnIHZkc28ubGRzICQodm9ianMteSkKKworZXhwb3J0IENQUEZMQUdTX3Zkc28ubGRzICs9IC1QIC1DCisKK1ZEU09fTERGTEFHU192ZHNvLmxkcyA9IC1tNjQgLVdsLC1zb25hbWU9bGludXgtdmRzby5zby4xIFwKKyAgICAgICAtV2wsLXosbWF4LXBhZ2Utc2l6ZT00MDk2IC1XbCwteixjb21tb24tcGFnZS1zaXplPTQwOTYKKworJChvYmopL3Zkc28ubzogJChzcmMpL3Zkc28uUyAkKG9iaikvdmRzby5zbworCiskKG9iaikvdmRzby5zby5kYmc6ICQoc3JjKS92ZHNvLmxkcyAkKHZvYmpzKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHZkc28pCisKKyQob2JqKS8lLnNvOiBPQkpDT1BZRkxBR1MgOj0gLVMKKyQob2JqKS8lLnNvOiAkKG9iaikvJS5zby5kYmcgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQorCisjCisjIERvbid0IG9taXQgZnJhbWUgcG9pbnRlcnMgZm9yIGVhc2Ugb2YgdXNlcnNwYWNlIGRlYnVnZ2luZywgYnV0IGRvCisjIG9wdGltaXplIHNpYmxpbmcgY2FsbHMuCisjCitDRkwgOj0gJChQUk9GSUxJTkcpIC1tY21vZGVsPXNtYWxsIC1mUElDIC1PMiAtZmFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgXAorICAgICAgICQoZmlsdGVyIC1nJSwkKEtCVUlMRF9DRkxBR1MpKSAkKGNhbGwgY2Mtb3B0aW9uLCAtZm5vLXN0YWNrLXByb3RlY3RvcikgXAorICAgICAgIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mb3B0aW1pemUtc2libGluZy1jYWxscworCiskKHZvYmpzKTogS0JVSUxEX0NGTEFHUyArPSAkKENGTCkKKworIworIyB2RFNPIGNvZGUgcnVucyBpbiB1c2Vyc3BhY2UgYW5kIC1wZyBkb2Vzbid0IGhlbHAgd2l0aCBwcm9maWxpbmcgYW55d2F5LgorIworQ0ZMQUdTX1JFTU9WRV92ZHNvLW5vdGUubyA9IC1wZworQ0ZMQUdTX1JFTU9WRV91bV92ZHNvLm8gPSAtcGcKKwordGFyZ2V0cyArPSB2ZHNvLXN5bXMubGRzCitvYmotJChWRFNPNjQteSkJCQkrPSB2ZHNvLXN5bXMubGRzCisKKyMKKyMgTWF0Y2ggc3ltYm9scyBpbiB0aGUgRFNPIHRoYXQgbG9vayBsaWtlIFZEU08qOyBwcm9kdWNlIGEgZmlsZSBvZiBjb25zdGFudHMuCisjCitzZWQtdmRzb3N5bSA6PSAtZSAncy9eMDAqLzAvJyBcCisJLWUgJ3MvXlwoWzAtOWEtZkEtRl0qXCkgLiBcKFZEU09bYS16QS1aMC05X10qXCkkJC9cMiA9IDB4XDE7L3AnCitxdWlldF9jbWRfdmRzb3N5bSA9IFZEU09TWU0gJEAKK2RlZmluZSBjbWRfdmRzb3N5bQorCSQoTk0pICQ8IHwgTENfQUxMPUMgc2VkIC1uICQoc2VkLXZkc29zeW0pIHwgTENfQUxMPUMgc29ydCA+ICRACitlbmRlZgorCiskKG9iaikvJS1zeW1zLmxkczogJChvYmopLyUuc28uZGJnIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdmRzb3N5bSkKKworIworIyBUaGUgRFNPIGltYWdlcyBhcmUgYnVpbHQgdXNpbmcgYSBzcGVjaWFsIGxpbmtlciBzY3JpcHQuCisjCitxdWlldF9jbWRfdmRzbyA9IFZEU08gICAgJEAKKyAgICAgIGNtZF92ZHNvID0gJChDQykgLW5vc3RkbGliIC1vICRAIFwKKwkJICAgICAgICQoVkRTT19MREZMQUdTKSAkKFZEU09fTERGTEFHU18kKGZpbHRlciAlLmxkcywkKF5GKSkpIFwKKwkJICAgICAgIC1XbCwtVCwkKGZpbHRlciAlLmxkcywkXikgJChmaWx0ZXIgJS5vLCReKSAmJiBcCisJCSBzaCAkKHNyY3RyZWUpLyQoc3JjKS9jaGVja3VuZGVmLnNoICckKE5NKScgJyRAJworCitWRFNPX0xERkxBR1MgPSAtZlBJQyAtc2hhcmVkICQoY2FsbCBjYy1sZG9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKK0dDT1ZfUFJPRklMRSA6PSBuCisKKyMKKyMgSW5zdGFsbCB0aGUgdW5zdHJpcHBlZCBjb3B5IG9mIHZkc28qLnNvIGxpc3RlZCBpbiAkKHZkc28taW5zdGFsbC15KS4KKyMKK3F1aWV0X2NtZF92ZHNvX2luc3RhbGwgPSBJTlNUQUxMICRACisgICAgICBjbWRfdmRzb19pbnN0YWxsID0gY3AgJChvYmopLyRALmRiZyAkKE1PRExJQikvdmRzby8kQAorJCh2ZHNvLWluc3RhbGwteSk6ICUuc286ICQob2JqKS8lLnNvLmRiZyBGT1JDRQorCUBta2RpciAtcCAkKE1PRExJQikvdmRzbworCSQoY2FsbCBjbWQsdmRzb19pbnN0YWxsKQorCitQSE9OWSArPSB2ZHNvX2luc3RhbGwgJCh2ZHNvLWluc3RhbGwteSkKK3Zkc29faW5zdGFsbDogJCh2ZHNvLWluc3RhbGwteSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL2NoZWNrdW5kZWYuc2ggYi9hcmNoL3VtL3N5cy14ODZfNjQvdmRzby9jaGVja3VuZGVmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTkwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvdmRzby9jaGVja3VuZGVmLnNoCkBAIC0wLDAgKzEsMTAgQEAKKyMhL2Jpbi9zaAorbm09IiQxIgorZmlsZT0iJDIiCiskbm0gIiRmaWxlIiB8IGdyZXAgJ14gKlUnID4gL2Rldi9udWxsIDI+JjEKK2lmIFsgJD8gLWVxIDEgXTsgdGhlbgorICAgIGV4aXQgMAorZWxzZQorICAgIGVjaG8gIiRmaWxlOiB1bmRlZmluZWQgc3ltYm9scyBmb3VuZCIgPiYyCisgICAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdW1fdmRzby5jIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdW1fdmRzby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDQxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvdmRzby91bV92ZHNvLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSaWNoYXJkIFdlaW5iZXJnZXIgPHJpY2hyZEBub2QuYXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHZEU08gdHVybnMgYWxsIGNhbGxzIGludG8gYSBzeXNjYWxsIHNvIHRoYXQgVU1MIGNhbiB0cmFwIHRoZW0uCisgKi8KKworCisvKiBEaXNhYmxlIHByb2ZpbGluZyBmb3IgdXNlcnNwYWNlIGNvZGUgKi8KKyNkZWZpbmUgRElTQUJMRV9CUkFOQ0hfUFJPRklMSU5HCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZ2V0Y3B1Lmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCitpbnQgX192ZHNvX2Nsb2NrX2dldHRpbWUoY2xvY2tpZF90IGNsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCWxvbmcgcmV0OworCisJYXNtKCJzeXNjYWxsIiA6ICI9YSIgKHJldCkgOgorCQkiMCIgKF9fTlJfY2xvY2tfZ2V0dGltZSksICJEIiAoY2xvY2spLCAiUyIgKHRzKSA6ICJtZW1vcnkiKTsKKworCXJldHVybiByZXQ7Cit9CitpbnQgY2xvY2tfZ2V0dGltZShjbG9ja2lkX3QsIHN0cnVjdCB0aW1lc3BlYyAqKQorCV9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3Zkc29fY2xvY2tfZ2V0dGltZSIpKSk7CisKK2ludCBfX3Zkc29fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IHRpbWV6b25lICp0eikKK3sKKwlsb25nIHJldDsKKworCWFzbSgic3lzY2FsbCIgOiAiPWEiIChyZXQpIDoKKwkJIjAiIChfX05SX2dldHRpbWVvZmRheSksICJEIiAodHYpLCAiUyIgKHR6KSA6ICJtZW1vcnkiKTsKKworCXJldHVybiByZXQ7Cit9CitpbnQgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICosIHN0cnVjdCB0aW1lem9uZSAqKQorCV9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3Zkc29fZ2V0dGltZW9mZGF5IikpKTsKKwordGltZV90IF9fdmRzb190aW1lKHRpbWVfdCAqdCkKK3sKKwlsb25nIHNlY3M7CisKKwlhc20gdm9sYXRpbGUoInN5c2NhbGwiCisJCTogIj1hIiAoc2VjcykKKwkJOiAiMCIgKF9fTlJfdGltZSksICJEIiAodCkgOiAiY2MiLCAicjExIiwgImN4IiwgIm1lbW9yeSIpOworCisJcmV0dXJuIHNlY3M7Cit9CitpbnQgdGltZSh0aW1lX3QgKnQpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3Zkc29fdGltZSIpKSk7CisKK2xvbmcKK19fdmRzb19nZXRjcHUodW5zaWduZWQgKmNwdSwgdW5zaWduZWQgKm5vZGUsIHN0cnVjdCBnZXRjcHVfY2FjaGUgKnVudXNlZCkKK3sKKwkvKgorCSAqIFVNTCBkb2VzIG5vdCBzdXBwb3J0IFNNUCwgd2UgY2FuIGNoZWF0IGhlcmUuIDopCisJICovCisKKwlpZiAoY3B1KQorCQkqY3B1ID0gMDsKKwlpZiAobm9kZSkKKwkJKm5vZGUgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2xvbmcgZ2V0Y3B1KHVuc2lnbmVkICpjcHUsIHVuc2lnbmVkICpub2RlLCBzdHJ1Y3QgZ2V0Y3B1X2NhY2hlICp0Y2FjaGUpCisJX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fdmRzb19nZXRjcHUiKSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby1sYXlvdXQubGRzLlMgYi9hcmNoL3VtL3N5cy14ODZfNjQvdmRzby92ZHNvLWxheW91dC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzRhMmNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby1sYXlvdXQubGRzLlMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpbmtlciBzY3JpcHQgZm9yIHZEU08uICBUaGlzIGlzIGFuIEVMRiBzaGFyZWQgb2JqZWN0IHByZWxpbmtlZCB0bworICogaXRzIHZpcnR1YWwgYWRkcmVzcywgYW5kIHdpdGggb25seSBvbmUgcmVhZC1vbmx5IHNlZ21lbnQuCisgKiBUaGlzIHNjcmlwdCBjb250cm9scyBpdHMgbGF5b3V0LgorICovCisKK1NFQ1RJT05TCit7CisJLiA9IFZEU09fUFJFTElOSyArIFNJWkVPRl9IRUFERVJTOworCisJLmhhc2gJCTogeyAqKC5oYXNoKSB9CQkJOnRleHQKKwkuZ251Lmhhc2gJOiB7ICooLmdudS5oYXNoKSB9CisJLmR5bnN5bQkJOiB7ICooLmR5bnN5bSkgfQorCS5keW5zdHIJCTogeyAqKC5keW5zdHIpIH0KKwkuZ251LnZlcnNpb24JOiB7ICooLmdudS52ZXJzaW9uKSB9CisJLmdudS52ZXJzaW9uX2QJOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKwkuZ251LnZlcnNpb25fcgk6IHsgKiguZ251LnZlcnNpb25fcikgfQorCisJLm5vdGUJCTogeyAqKC5ub3RlLiopIH0JCTp0ZXh0CTpub3RlCisKKwkuZWhfZnJhbWVfaGRyCTogeyAqKC5laF9mcmFtZV9oZHIpIH0JCTp0ZXh0CTplaF9mcmFtZV9oZHIKKwkuZWhfZnJhbWUJOiB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQk6dGV4dAorCisJLmR5bmFtaWMJOiB7ICooLmR5bmFtaWMpIH0JCTp0ZXh0CTpkeW5hbWljCisKKwkucm9kYXRhCQk6IHsgKigucm9kYXRhKikgfQkJOnRleHQKKwkuZGF0YQkJOiB7CisJICAgICAgKiguZGF0YSopCisJICAgICAgKiguc2RhdGEqKQorCSAgICAgICooLmdvdC5wbHQpICooLmdvdCkKKwkgICAgICAqKC5nbnUubGlua29uY2UuZC4qKQorCSAgICAgICooLmJzcyopCisJICAgICAgKiguZHluYnNzKikKKwkgICAgICAqKC5nbnUubGlua29uY2UuYi4qKQorCX0KKworCS5hbHRpbnN0cnVjdGlvbnMJOiB7ICooLmFsdGluc3RydWN0aW9ucykgfQorCS5hbHRpbnN0cl9yZXBsYWNlbWVudAk6IHsgKiguYWx0aW5zdHJfcmVwbGFjZW1lbnQpIH0KKworCS8qCisJICogQWxpZ24gdGhlIGFjdHVhbCBjb2RlIHdlbGwgYXdheSBmcm9tIHRoZSBub24taW5zdHJ1Y3Rpb24gZGF0YS4KKwkgKiBUaGlzIGlzIHRoZSBiZXN0IHRoaW5nIGZvciB0aGUgSS1jYWNoZS4KKwkgKi8KKwkuID0gQUxJR04oMHgxMDApOworCisJLnRleHQJCTogeyAqKC50ZXh0KikgfQkJCTp0ZXh0CT0weDkwOTA5MDkwCit9CisKKy8qCisgKiBWZXJ5IG9sZCB2ZXJzaW9ucyBvZiBsZCBkbyBub3QgcmVjb2duaXplIHRoaXMgbmFtZSB0b2tlbjsgdXNlIHRoZSBjb25zdGFudC4KKyAqLworI2RlZmluZSBQVF9HTlVfRUhfRlJBTUUJMHg2NDc0ZTU1MAorCisvKgorICogV2UgbXVzdCBzdXBwbHkgdGhlIEVMRiBwcm9ncmFtIGhlYWRlcnMgZXhwbGljaXRseSB0byBnZXQganVzdCBvbmUKKyAqIFBUX0xPQUQgc2VnbWVudCwgYW5kIHNldCB0aGUgZmxhZ3MgZXhwbGljaXRseSB0byBtYWtlIHNlZ21lbnRzIHJlYWQtb25seS4KKyAqLworUEhEUlMKK3sKKwl0ZXh0CQlQVF9MT0FECQlGTEFHUyg1KSBGSUxFSERSIFBIRFJTOyAvKiBQRl9SfFBGX1ggKi8KKwlkeW5hbWljCQlQVF9EWU5BTUlDCUZMQUdTKDQpOwkJLyogUEZfUiAqLworCW5vdGUJCVBUX05PVEUJCUZMQUdTKDQpOwkJLyogUEZfUiAqLworCWVoX2ZyYW1lX2hkcglQVF9HTlVfRUhfRlJBTUU7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvdmRzby92ZHNvLW5vdGUuUyBiL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3Zkc28tbm90ZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YTA3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvdmRzby92ZHNvLW5vdGUuUwpAQCAtMCwwICsxLDEyIEBACisvKgorICogVGhpcyBzdXBwbGllcyAubm90ZS4qIHNlY3Rpb25zIHRvIGdvIGludG8gdGhlIFBUX05PVEUgaW5zaWRlIHRoZSB2RFNPIHRleHQuCisgKiBIZXJlIHdlIGNhbiBzdXBwbHkgc29tZSBpbmZvcm1hdGlvbiB1c2VmdWwgdG8gdXNlcmxhbmQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3V0cy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9lbGZub3RlLmg+CisKK0VMRk5PVEVfU1RBUlQoTGludXgsIDAsICJhIikKKwkubG9uZyBMSU5VWF9WRVJTSU9OX0NPREUKK0VMRk5PVEVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvdmRzby92ZHNvLlMgYi9hcmNoL3VtL3N5cy14ODZfNjQvdmRzby92ZHNvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4MmMxNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3Zkc28uUwpAQCAtMCwwICsxLDEwIEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCitfX0lOSVREQVRBCisKKwkuZ2xvYmwgdmRzb19zdGFydCwgdmRzb19lbmQKK3Zkc29fc3RhcnQ6CisJLmluY2JpbiAiYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby5zbyIKK3Zkc29fZW5kOgorCitfX0ZJTklUCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvdmRzby92ZHNvLmxkcy5TIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTZiMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby5sZHMuUwpAQCAtMCwwICsxLDMyIEBACisvKgorICogTGlua2VyIHNjcmlwdCBmb3IgNjQtYml0IHZEU08uCisgKiBXZSAjaW5jbHVkZSB0aGUgZmlsZSB0byBkZWZpbmUgdGhlIGxheW91dCBkZXRhaWxzLgorICogSGVyZSB3ZSBvbmx5IGNob29zZSB0aGUgcHJlbGlua2VkIHZpcnR1YWwgYWRkcmVzcy4KKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdmVyc2lvbiBzY3JpcHQgZ2l2aW5nIHRoZSB1c2VyLWV4cG9ydGVkIHN5bWJvbHMgaW4KKyAqIHRoZSBEU08uICBXZSBjYW4gZGVmaW5lIGxvY2FsIHN5bWJvbHMgaGVyZSBjYWxsZWQgVkRTTyogdG8gbWFrZSB0aGVpcgorICogdmFsdWVzIHZpc2libGUgdXNpbmcgdGhlIGFzbS14ODYvdmRzby5oIG1hY3JvcyBmcm9tIHRoZSBrZXJuZWwgcHJvcGVyLgorICovCisKKyNkZWZpbmUgVkRTT19QUkVMSU5LIDB4ZmZmZmZmZmZmZjcwMDAwMAorI2luY2x1ZGUgInZkc28tbGF5b3V0Lmxkcy5TIgorCisvKgorICogVGhpcyBjb250cm9scyB3aGF0IHVzZXJsYW5kIHN5bWJvbHMgd2UgZXhwb3J0IGZyb20gdGhlIHZEU08uCisgKi8KK1ZFUlNJT04geworCUxJTlVYXzIuNiB7CisJZ2xvYmFsOgorCQljbG9ja19nZXR0aW1lOworCQlfX3Zkc29fY2xvY2tfZ2V0dGltZTsKKwkJZ2V0dGltZW9mZGF5OworCQlfX3Zkc29fZ2V0dGltZW9mZGF5OworCQlnZXRjcHU7CisJCV9fdmRzb19nZXRjcHU7CisJCXRpbWU7CisJCV9fdmRzb190aW1lOworCWxvY2FsOiAqOworCX07Cit9CisKK1ZEU082NF9QUkVMSU5LID0gVkRTT19QUkVMSU5LOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdm1hLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvdmRzby92bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDk1YzhkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdm1hLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSaWNoYXJkIFdlaW5iZXJnZXIgPHJpY2hyZEBub2QuYXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKwordW5zaWduZWQgaW50IF9fcmVhZF9tb3N0bHkgdmRzb19lbmFibGVkID0gMTsKK3Vuc2lnbmVkIGxvbmcgdW1fdmRzb19hZGRyOworCitleHRlcm4gdW5zaWduZWQgbG9uZyB0YXNrX3NpemU7CitleHRlcm4gY2hhciB2ZHNvX3N0YXJ0W10sIHZkc29fZW5kW107CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqKnZkc29wOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3Zkc28odm9pZCkKK3sKKwlzdHJ1Y3QgcGFnZSAqdW1fdmRzbzsKKworCUJVR19PTih2ZHNvX2VuZCAtIHZkc29fc3RhcnQgPiBQQUdFX1NJWkUpOworCisJdW1fdmRzb19hZGRyID0gdGFza19zaXplIC0gUEFHRV9TSVpFOworCisJdmRzb3AgPSBrbWFsbG9jKEdGUF9LRVJORUwsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSk7CisJaWYgKCF2ZHNvcCkKKwkJZ290byBvb207CisKKwl1bV92ZHNvID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXVtX3Zkc28pIHsKKwkJa2ZyZWUodmRzb3ApOworCisJCWdvdG8gb29tOworCX0KKworCWNvcHlfcGFnZShwYWdlX2FkZHJlc3ModW1fdmRzbyksIHZkc29fc3RhcnQpOworCSp2ZHNvcCA9IHVtX3Zkc287CisKKwlyZXR1cm4gMDsKKworb29tOgorCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGFsbG9jYXRlIHZkc29cbiIpOworCXZkc29fZW5hYmxlZCA9IDA7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KK3N1YnN5c19pbml0Y2FsbChpbml0X3Zkc28pOworCitpbnQgYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sIGludCB1c2VzX2ludGVycCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisKKwlpZiAoIXZkc29fZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCisJZXJyID0gaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcobW0sIHVtX3Zkc29fYWRkciwgUEFHRV9TSVpFLAorCQlWTV9SRUFEfFZNX0VYRUN8CisJCVZNX01BWVJFQUR8Vk1fTUFZV1JJVEV8Vk1fTUFZRVhFQ3wKKwkJVk1fQUxXQVlTRFVNUCwKKwkJdmRzb3ApOworCisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIvS2NvbmZpZyBiL2FyY2gvdW5pY29yZTMyL0tjb25maWcKaW5kZXggZDNhMzAzMi4uZTU3ZGNjZSAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIvS2NvbmZpZworKysgYi9hcmNoL3VuaWNvcmUzMi9LY29uZmlnCkBAIC0yMzEsMTAgKzIzMSw2IEBACiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIE5CMDkxNiBQV00gY29udHJvbGxlcnMKIAotY29uZmlnIFBVVjNfUlRDCi0JdHJpc3RhdGUgIlBLVW5pdHkgdjMgUlRDIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiAhQVJDSF9GUEdBCi0KIGlmIFBVVjNfTkIwOTE2CiAKIG1lbnUgIlBLVW5pdHkgTmV0Qm9vay0wOTE2IEZlYXR1cmVzIgpkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIvTWFrZWZpbGUgYi9hcmNoL3VuaWNvcmUzMi9NYWtlZmlsZQppbmRleCA3NmE4YmVlLi42YWY0YmM0IDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9NYWtlZmlsZQorKysgYi9hcmNoL3VuaWNvcmUzMi9NYWtlZmlsZQpAQCAtNDAsNDIgKzQwLDEwIEBACiAKIGxpYnMteQkJCSs9IGFyY2gvdW5pY29yZTMyL2xpYi8KIAotQVNNX0dFTkVSQVRFRF9ESVIJOj0gJChzcmN0cmVlKS9hcmNoL3VuaWNvcmUzMi9pbmNsdWRlL2dlbmVyYXRlZAotTElOVVhJTkNMVURFCQkrPSAtSSQoQVNNX0dFTkVSQVRFRF9ESVIpCi0KLUFTTV9HRU5FUklDX0hFQURFUlMJOj0gYXRvbWljLmggYXV4dmVjLmgKLUFTTV9HRU5FUklDX0hFQURFUlMJKz0gYml0c3BlcmxvbmcuaCBidWcuaCBidWdzLmgKLUFTTV9HRU5FUklDX0hFQURFUlMJKz0gY3B1dGltZS5oIGN1cnJlbnQuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSBkZXZpY2UuaCBkaXY2NC5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IGVtZXJnZW5jeS1yZXN0YXJ0LmggZXJybm8uaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSBmYi5oIGZjbnRsLmggZnRyYWNlLmggZnV0ZXguaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSBoYXJkaXJxLmggaHdfaXJxLmgKLUFTTV9HRU5FUklDX0hFQURFUlMJKz0gaW9jdGwuaCBpb2N0bHMuaCBpcGNidWYuaCBpcnFfcmVncy5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IGtkZWJ1Zy5oIGttYXBfdHlwZXMuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSBsb2NhbC5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IG1tYW4uaCBtb2R1bGUuaCBtc2didWYuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSBwYXJhbS5oIHBhcnBvcnQuaCBwZXJjcHUuaCBwb2xsLmggcG9zaXhfdHlwZXMuaAotQVNNX0dFTkVSSUNfSEVBREVSUwkrPSByZXNvdXJjZS5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IHNjYXR0ZXJsaXN0Lmggc2VjdGlvbnMuaCBzZWdtZW50Lmggc2VtYnVmLmggc2VyaWFsLmgKLUFTTV9HRU5FUklDX0hFQURFUlMJKz0gc2V0dXAuaCBzaG1idWYuaCBzaG1wYXJhbS5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IHNpZ2luZm8uaCBzaWduYWwuaCBzaXplcy5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IHNvY2tldC5oIHNvY2tpb3MuaCBzdGF0Lmggc3RhdGZzLmggc3dhYi5oIHN5c2NhbGxzLmgKLUFTTV9HRU5FUklDX0hFQURFUlMJKz0gdGVybWJpdHMuaCB0ZXJtaW9zLmggdG9wb2xvZ3kuaCB0eXBlcy5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IHVjb250ZXh0LmggdW5hbGlnbmVkLmggdXNlci5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IHZnYS5oCi1BU01fR0VORVJJQ19IRUFERVJTCSs9IHhvci5oCi0KLWFyY2hwcmVwYXJlOgotaWZuZXEgKCQoQVNNX0dFTkVSQVRFRF9ESVIpLCAkKHdpbGRjYXJkICQoQVNNX0dFTkVSQVRFRF9ESVIpKSkKLQkkKFEpbWtkaXIgLXAgJChBU01fR0VORVJBVEVEX0RJUikvYXNtCi0JJChRKSQoZm9yZWFjaCBhLCAkKEFTTV9HRU5FUklDX0hFQURFUlMpLAlcCi0JCWVjaG8gJyNpbmNsdWRlIDxhc20tZ2VuZXJpYy8kYT4nCVwKLQkJCT4gJChBU01fR0VORVJBVEVEX0RJUikvYXNtLyRhOyApCi1lbmRpZgotCiBib290CQkJOj0gYXJjaC91bmljb3JlMzIvYm9vdAogCi0jIERlZmF1bHQgdGFyZ2V0IHdoZW4gZXhlY3V0aW5nIHBsYWluIG1ha2UKKyMgRGVmYXVsdCBkZWZjb25maWcgYW5kIHRhcmdldCB3aGVuIGV4ZWN1dGluZyBwbGFpbiBtYWtlCitLQlVJTERfREVGQ09ORklHCTo9ICQoQVJDSClfZGVmY29uZmlnCiBLQlVJTERfSU1BR0UJCTo9IHpJbWFnZQogCiBhbGw6CSQoS0JVSUxEX0lNQUdFKQpAQCAtODMsOCArNTEsNiBAQAogekltYWdlIEltYWdlIHVJbWFnZTogdm1saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJChib290KS8kQAogCi1NUlBST1BFUl9ESVJTCQkrPSAkKEFTTV9HRU5FUkFURURfRElSKQotCiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQogCmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL3VuaWNvcmUzMi9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggOTUzNzM0Mi4uYjA5NTRhMiAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvdW5pY29yZTMyL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtNTksNyArNTksNyBAQAogIyBXZSBub3cgaGF2ZSBhIFBJQyBkZWNvbXByZXNzb3IgaW1wbGVtZW50YXRpb24uICBEZWNvbXByZXNzb3JzIHJ1bm5pbmcKICMgZnJvbSBSQU0gc2hvdWxkIG5vdCBkZWZpbmUgWlRFWFRBRERSLiAgRGVjb21wcmVzc29ycyBydW5uaW5nIGRpcmVjdGx5CiAjIGZyb20gUk9NIG9yIEZsYXNoIG11c3QgZGVmaW5lIFpURVhUQUREUiAocHJlZmVyYWJseSB2aWEgdGhlIGNvbmZpZykKLVpURVhUQUREUgk6PSAwCitaVEVYVEFERFIJOj0gMHgwMzAwMDAwMAogWkJTU0FERFIJOj0gQUxJR04oNCkKIAogU0VERkxBR1NfbGRzCT0gcy9URVhUX1NUQVJULyQoWlRFWFRBRERSKS87cy9CU1NfU1RBUlQvJChaQlNTQUREUikvCmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9jb25maWdzL2RlYnVnX2RlZmNvbmZpZyBiL2FyY2gvdW5pY29yZTMyL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWZiZGU5Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW5pY29yZTMyL2NvbmZpZ3MvZGVidWdfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLSMjIyBHZW5lcmFsIHNldHVwCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19MT0NBTFZFUlNJT049Ii1kZWJ1ZyIKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19QT1NJWF9NUVVFVUU9eQotQ09ORklHX0hPVFBMVUc9eQotIwlJbml0aWFsIFJBTSBmaWxlc3lzdGVtIGFuZCBSQU0gZGlzayAoaW5pdHJhbWZzL2luaXRyZCkgc3VwcG9ydAotI0NPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9ImFyY2gvdW5pY29yZS9yYW1mcy9yYW1mc19jb25maWciCi0KLSMjIyBFbmFibGUgbG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLUNPTkZJR19NT0RVTEVTPW4KLUNPTkZJR19NT0RVTEVfVU5MT0FEPXkKLQotIyMjIFN5c3RlbSBUeXBlCi1DT05GSUdfQVJDSF9QVVYzPXkKLSMJQm9hcmQgU2VsZWN0aW9uCi1DT05GSUdfUFVWM19OQjA5MTY9eQotIwlQcm9jZXNzb3IgRmVhdHVyZXMKLUNPTkZJR19DUFVfRENBQ0hFX0xJTkVfRElTQUJMRT15Ci1DT05GSUdfQ1BVX1RMQl9TSU5HTEVfRU5UUllfRElTQUJMRT1uCi0KLSMjIyBCdXMgc3VwcG9ydAotQ09ORklHX1BDST15Ci1DT05GSUdfUENJX0xFR0FDWT1uCi0KLSMjIyBCb290IG9wdGlvbnMKLSMJZm9yIGRlYnVnLCBhZGRpbmc6IGVhcmx5cHJpbnRrPW9jZCxrZWVwIGluaXRjYWxsX2RlYnVnCi0jCW90aGVycyBzdXBwb3J0OiB0ZXN0X3N1c3BlbmQ9bWVtIHJvb3Q9L2Rldi9zZGEKLSMJaGliZXJuYXRlIHN1cHBvcnQ6IHJlc3VtZT0vZGV2L3NkYTMKLUNPTkZJR19DTURMSU5FPSJlYXJseXByaW50az1vY2Qsa2VlcCBpZ25vcmVfbG9nbGV2ZWwiCi0jIFRPRE86IG1lbT01MTJNIHZpZGVvPXVuaWZiOjEwMjR4NjAwLTE2QDc1Ci0jIGZvciBuZnM6IHJvb3Q9L2Rldi9uZnMgcncgbmZzcm9vdD0xOTIuMTY4LjEwLjg4Oi9ob21lL3VkYi9uZnMvLHJzaXplPTEwMjQsd3NpemU9MTAyNAotIwlpcD0xOTIuMTY4LjEwLjgzOjE5Mi4xNjguMTAuODg6MTkyLjE2OC4xMC4xOjI1NS4yNTUuMjU1LjA6OmV0aDA6b2ZmCi1DT05GSUdfQ01ETElORV9GT1JDRT15Ci0KLSMjIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKLUNPTkZJR19QTT15Ci1DT05GSUdfSElCRVJOQVRJT049eQotQ09ORklHX1BNX1NURF9QQVJUSVRJT049Ii9kZXYvc2RhMyIKLUNPTkZJR19DUFVfRlJFUT1uCi1DT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFPXkKLQotIyMjIE5ldHdvcmtpbmcgc3VwcG9ydAotQ09ORklHX05FVD15Ci0jCU5ldHdvcmtpbmcgb3B0aW9ucwotQ09ORklHX1BBQ0tFVD1tCi1DT05GSUdfVU5JWD1tCi0jCVRDUC9JUCBuZXR3b3JraW5nCi1DT05GSUdfSU5FVD15Ci1DT05GSUdfSVBfTVVMVElDQVNUPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQVjY9bgotIwlXaXJlbGVzcwotQ09ORklHX1dJUkVMRVNTPXkKLUNPTkZJR19XSVJFTEVTU19FWFQ9eQotQ09ORklHX01BQzgwMjExPW0KLQotIyMjIFBLVW5pdHkgU29DIEZlYXR1cmVzCi1DT05GSUdfVVNCX1dMQU5fSEVEX0FRMz1uCi1DT05GSUdfVVNCX0NNTUJfSU5OT0ZJREVJPW4KLUNPTkZJR19JMkNfQkFUVEVSWV9CUTI3MjAwPW4KLUNPTkZJR19JMkNfRUVQUk9NX0FUMjQ9bgotQ09ORklHX0xDRF9CQUNLTElHSFQ9bgotCi1DT05GSUdfUFVWM19SVEM9eQotQ09ORklHX1BVVjNfVU1BTD15Ci1DT05GSUdfUFVWM19NVVNCPW4KLUNPTkZJR19QVVYzX0FDOTc9bgotQ09ORklHX1BVVjNfTkFORD1uCi1DT05GSUdfUFVWM19NTUM9bgotQ09ORklHX1BVVjNfVUFSVD1uCi0KLSMjIyBEZXZpY2UgRHJpdmVycwotIwlNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2UgKE1URCkgc3VwcG9ydAotQ09ORklHX01URD1tCi1DT05GSUdfTVREX1VCST1tCi1DT05GSUdfTVREX1BBUlRJVElPTlM9eQotQ09ORklHX01URF9DSEFSPW0KLUNPTkZJR19NVERfQkxLREVWUz1tCi0jCVJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCi1DT05GSUdfTVREX0NGST1tCi1DT05GSUdfTVREX0pFREVDUFJPQkU9bQotQ09ORklHX01URF9DRklfQU1EU1REPW0KLSMJTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwotQ09ORklHX01URF9QSFlTTUFQPW0KLQotIwlCbG9jayBkZXZpY2VzCi1DT05GSUdfQkxLX0RFVl9MT09QPW0KLQotIwlTQ1NJIGRldmljZSBzdXBwb3J0Ci1DT05GSUdfU0NTST15Ci1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfQkxLX0RFVl9TUj1tCi1DT05GSUdfQ0hSX0RFVl9TRz1tCi0KLSMJU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi1DT05GSUdfQVRBPXkKLUNPTkZJR19TQVRBX1ZJQT15Ci0KLSMJTmV0d29yayBkZXZpY2Ugc3VwcG9ydAotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTkVUREVWXzEwMDA9eQotIwlXaXJlbGVzcyBMQU4KLUNPTkZJR19XTEFOXzgwMjExPW4KLUNPTkZJR19SVDJYMDA9bgotQ09ORklHX1JUNzNVU0I9bgotCi0jCUlucHV0IGRldmljZSBzdXBwb3J0Ci1DT05GSUdfSU5QVVRfRVZERVY9bQotIwlLZXlib2FyZHMKLUNPTkZJR19LRVlCT0FSRF9HUElPPW0KLQotIwlJMkMgc3VwcG9ydAotQ09ORklHX0kyQz15Ci1DT05GSUdfSTJDX1BVVjM9eQotCi0jCUhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAotI0NPTkZJR19TRU5TT1JTX0xNNzU9bQotIwlHZW5lcmljIFRoZXJtYWwgc3lzZnMgZHJpdmVyCi0jQ09ORklHX1RIRVJNQUw9bQotI0NPTkZJR19USEVSTUFMX0hXTU9OPXkKLQotIwlNdWx0aW1lZGlhIHN1cHBvcnQKLUNPTkZJR19NRURJQV9TVVBQT1JUPW4KLUNPTkZJR19WSURFT19ERVY9bgotQ09ORklHX1VTQl9WSURFT19DTEFTUz1uCi0KLSMJR3JhcGhpY3Mgc3VwcG9ydAotQ09ORklHX0ZCPXkKLUNPTkZJR19GQl9QVVYzX1VOSUdGWD15Ci0jCUNvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotQ09ORklHX1ZHQV9DT05TT0xFPW4KLUNPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKLUNPTkZJR19GT05UUz15Ci1DT05GSUdfRk9OVF84eDg9eQotQ09ORklHX0ZPTlRfOHgxNj15Ci0jCUJvb3R1cCBsb2dvCi1DT05GSUdfTE9HTz1uCi0KLSMJU291bmQgY2FyZCBzdXBwb3J0Ci1DT05GSUdfU09VTkQ9bQotIwlBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLUNPTkZJR19TTkQ9bQotQ09ORklHX1NORF9NSVhFUl9PU1M9bQotQ09ORklHX1NORF9QQ01fT1NTPW0KLQotIwlVU0Igc3VwcG9ydAotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9bgotQ09ORklHX1VTQj1uCi1DT05GSUdfVVNCX0RFVklDRUZTPW4KLUNPTkZJR19VU0JfUFJJTlRFUj1uCi1DT05GSUdfVVNCX1NUT1JBR0U9bgotIwlJbnZlbnRyYSBIaWdoc3BlZWQgRHVhbCBSb2xlIENvbnRyb2xsZXIKLUNPTkZJR19VU0JfTVVTQl9IRFJDPW4KLQotIwlMRUQgU3VwcG9ydAotQ09ORklHX05FV19MRURTPXkKLUNPTkZJR19MRURTX0NMQVNTPXkKLUNPTkZJR19MRURTX0dQSU89eQotIwlMRUQgVHJpZ2dlcnMKLUNPTkZJR19MRURTX1RSSUdHRVJTPXkKLUNPTkZJR19MRURTX1RSSUdHRVJfVElNRVI9eQotQ09ORklHX0xFRFNfVFJJR0dFUl9JREVfRElTSz15Ci1DT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVD15Ci0KLSMJUmVhbCBUaW1lIENsb2NrCi1DT05GSUdfUlRDX0xJQj1tCi1DT05GSUdfUlRDX0NMQVNTPW0KLQotIyMjIEZpbGUgc3lzdGVtcwotQ09ORklHX0VYVDJfRlM9bQotQ09ORklHX0VYVDNfRlM9eQotQ09ORklHX0VYVDRfRlM9eQotQ09ORklHX0ZVU0VfRlM9bQotIwlDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi1DT05GSUdfSVNPOTY2MF9GUz1tCi1DT05GSUdfSk9MSUVUPXkKLUNPTkZJR19VREZfRlM9bQotIwlET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi1DT05GSUdfVkZBVF9GUz1tCi0jCVBzZXVkbyBmaWxlc3lzdGVtcwotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jCU1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLUNPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKLUNPTkZJR19KRkZTMl9GUz1tCi1DT05GSUdfVUJJRlNfRlM9bQotIwlOZXR3b3JrIEZpbGUgU3lzdGVtcwotQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLUNPTkZJR19ST09UX05GUz15Ci0jCVBhcnRpdGlvbiBUeXBlcwotQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLSMJTmF0aXZlIGxhbmd1YWdlIHN1cHBvcnQKLUNPTkZJR19OTFM9eQotQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQotQ09ORklHX05MU19DT0RFUEFHRV85MzY9bQotQ09ORklHX05MU19JU084ODU5XzE9bQotQ09ORklHX05MU19VVEY4PW0KLQotIyMjIEtlcm5lbCBoYWNraW5nCi1DT05GSUdfRlJBTUVfV0FSTj04MDk2Ci1DT05GSUdfTUFHSUNfU1lTUlE9eQotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci1DT05GSUdfUFJPVkVfTE9DS0lORz1uCi1DT05GSUdfREVCVUdfQlVHVkVSQk9TRT15Ci1DT05GSUdfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfREVCVUdfTEw9eQotCmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9jb25maWdzL3VuaWNvcmUzMl9kZWZjb25maWcgYi9hcmNoL3VuaWNvcmUzMi9jb25maWdzL3VuaWNvcmUzMl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkZDMxOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW5pY29yZTMyL2NvbmZpZ3MvdW5pY29yZTMyX2RlZmNvbmZpZwpAQCAtMCwwICsxLDIxNSBAQAorIyMjIEdlbmVyYWwgc2V0dXAKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0xPQ0FMVkVSU0lPTj0iLXVuaWNvcmUzMiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX0hPVFBMVUc9eQorIwlJbml0aWFsIFJBTSBmaWxlc3lzdGVtIGFuZCBSQU0gZGlzayAoaW5pdHJhbWZzL2luaXRyZCkgc3VwcG9ydAorI0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9ImFyY2gvdW5pY29yZS9yYW1mcy9yYW1mc19jb25maWciCisKKyMjIyBFbmFibGUgbG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKK0NPTkZJR19NT0RVTEVTPW4KK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKworIyMjIFN5c3RlbSBUeXBlCitDT05GSUdfQVJDSF9QVVYzPXkKKyMJQm9hcmQgU2VsZWN0aW9uCitDT05GSUdfUFVWM19OQjA5MTY9eQorIwlQcm9jZXNzb3IgRmVhdHVyZXMKK0NPTkZJR19DUFVfRENBQ0hFX0xJTkVfRElTQUJMRT15CitDT05GSUdfQ1BVX1RMQl9TSU5HTEVfRU5UUllfRElTQUJMRT1uCisKKyMjIyBCdXMgc3VwcG9ydAorQ09ORklHX1BDST15CitDT05GSUdfUENJX0xFR0FDWT1uCisKKyMjIyBCb290IG9wdGlvbnMKKyMJZm9yIGRlYnVnLCBhZGRpbmc6IGVhcmx5cHJpbnRrPW9jZCxrZWVwIGluaXRjYWxsX2RlYnVnCisjCW90aGVycyBzdXBwb3J0OiB0ZXN0X3N1c3BlbmQ9bWVtIHJvb3Q9L2Rldi9zZGEKKyMJaGliZXJuYXRlIHN1cHBvcnQ6IHJlc3VtZT0vZGV2L3NkYTMKK0NPTkZJR19DTURMSU5FPSJlYXJseXByaW50az1vY2Qsa2VlcCBpZ25vcmVfbG9nbGV2ZWwiCisjIFRPRE86IG1lbT01MTJNIHZpZGVvPXVuaWZiOjEwMjR4NjAwLTE2QDc1CisjIGZvciBuZnM6IHJvb3Q9L2Rldi9uZnMgcncgbmZzcm9vdD0xOTIuMTY4LjEwLjg4Oi9ob21lL3VkYi9uZnMvLHJzaXplPTEwMjQsd3NpemU9MTAyNAorIwlpcD0xOTIuMTY4LjEwLjgzOjE5Mi4xNjguMTAuODg6MTkyLjE2OC4xMC4xOjI1NS4yNTUuMjU1LjA6OmV0aDA6b2ZmCitDT05GSUdfQ01ETElORV9GT1JDRT15CisKKyMjIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKK0NPTkZJR19QTT15CitDT05GSUdfSElCRVJOQVRJT049eQorQ09ORklHX1BNX1NURF9QQVJUSVRJT049Ii9kZXYvc2RhMyIKK0NPTkZJR19DUFVfRlJFUT1uCitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFPXkKKworIyMjIE5ldHdvcmtpbmcgc3VwcG9ydAorQ09ORklHX05FVD15CisjCU5ldHdvcmtpbmcgb3B0aW9ucworQ09ORklHX1BBQ0tFVD1tCitDT05GSUdfVU5JWD1tCisjCVRDUC9JUCBuZXR3b3JraW5nCitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQVjY9bgorIwlXaXJlbGVzcworQ09ORklHX1dJUkVMRVNTPXkKK0NPTkZJR19XSVJFTEVTU19FWFQ9eQorQ09ORklHX01BQzgwMjExPW0KKworIyMjIFBLVW5pdHkgU29DIEZlYXR1cmVzCitDT05GSUdfVVNCX1dMQU5fSEVEX0FRMz1uCitDT05GSUdfVVNCX0NNTUJfSU5OT0ZJREVJPW4KK0NPTkZJR19JMkNfQkFUVEVSWV9CUTI3MjAwPW4KK0NPTkZJR19JMkNfRUVQUk9NX0FUMjQ9bgorQ09ORklHX0xDRF9CQUNLTElHSFQ9bgorCitDT05GSUdfUFVWM19VTUFMPXkKK0NPTkZJR19QVVYzX01VU0I9bgorQ09ORklHX1BVVjNfQUM5Nz1uCitDT05GSUdfUFVWM19OQU5EPW4KK0NPTkZJR19QVVYzX01NQz1uCitDT05GSUdfUFVWM19VQVJUPW4KKworIyMjIERldmljZSBEcml2ZXJzCisjCU1lbW9yeSBUZWNobm9sb2d5IERldmljZSAoTVREKSBzdXBwb3J0CitDT05GSUdfTVREPW0KK0NPTkZJR19NVERfVUJJPW0KK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX0NIQVI9bQorQ09ORklHX01URF9CTEtERVZTPW0KKyMJUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKK0NPTkZJR19NVERfQ0ZJPW0KK0NPTkZJR19NVERfSkVERUNQUk9CRT1tCitDT05GSUdfTVREX0NGSV9BTURTVEQ9bQorIwlNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCitDT05GSUdfTVREX1BIWVNNQVA9bQorCisjCUJsb2NrIGRldmljZXMKK0NPTkZJR19CTEtfREVWX0xPT1A9bQorCisjCVNDU0kgZGV2aWNlIHN1cHBvcnQKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19CTEtfREVWX1NSPW0KK0NPTkZJR19DSFJfREVWX1NHPW0KKworIwlTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKK0NPTkZJR19BVEE9eQorQ09ORklHX1NBVEFfVklBPXkKKworIwlOZXR3b3JrIGRldmljZSBzdXBwb3J0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19ORVRERVZfMTAwMD15CisjCVdpcmVsZXNzIExBTgorQ09ORklHX1dMQU5fODAyMTE9bgorQ09ORklHX1JUMlgwMD1uCitDT05GSUdfUlQ3M1VTQj1uCisKKyMJSW5wdXQgZGV2aWNlIHN1cHBvcnQKK0NPTkZJR19JTlBVVF9FVkRFVj1tCisjCUtleWJvYXJkcworQ09ORklHX0tFWUJPQVJEX0dQSU89bQorCisjCUkyQyBzdXBwb3J0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfUFVWMz15CisKKyMJSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjQ09ORklHX1NFTlNPUlNfTE03NT1tCisjCUdlbmVyaWMgVGhlcm1hbCBzeXNmcyBkcml2ZXIKKyNDT05GSUdfVEhFUk1BTD1tCisjQ09ORklHX1RIRVJNQUxfSFdNT049eQorCisjCU11bHRpbWVkaWEgc3VwcG9ydAorQ09ORklHX01FRElBX1NVUFBPUlQ9bgorQ09ORklHX1ZJREVPX0RFVj1uCitDT05GSUdfVVNCX1ZJREVPX0NMQVNTPW4KKworIwlHcmFwaGljcyBzdXBwb3J0CitDT05GSUdfRkI9eQorQ09ORklHX0ZCX1BVVjNfVU5JR0ZYPXkKKyMJQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CitDT05GSUdfVkdBX0NPTlNPTEU9bgorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorQ09ORklHX0ZPTlRTPXkKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKKyMJQm9vdHVwIGxvZ28KK0NPTkZJR19MT0dPPW4KKworIwlTb3VuZCBjYXJkIHN1cHBvcnQKK0NPTkZJR19TT1VORD1tCisjCUFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQorQ09ORklHX1NORD1tCitDT05GSUdfU05EX01JWEVSX09TUz1tCitDT05GSUdfU05EX1BDTV9PU1M9bQorCisjCVVTQiBzdXBwb3J0CitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD1uCitDT05GSUdfVVNCPW4KK0NPTkZJR19VU0JfREVWSUNFRlM9bgorQ09ORklHX1VTQl9QUklOVEVSPW4KK0NPTkZJR19VU0JfU1RPUkFHRT1uCisjCUludmVudHJhIEhpZ2hzcGVlZCBEdWFsIFJvbGUgQ29udHJvbGxlcgorQ09ORklHX1VTQl9NVVNCX0hEUkM9bgorCisjCUxFRCBTdXBwb3J0CitDT05GSUdfTkVXX0xFRFM9eQorQ09ORklHX0xFRFNfQ0xBU1M9eQorQ09ORklHX0xFRFNfR1BJTz15CisjCUxFRCBUcmlnZ2VycworQ09ORklHX0xFRFNfVFJJR0dFUlM9eQorQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj15CitDT05GSUdfTEVEU19UUklHR0VSX0lERV9ESVNLPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPXkKKworIwlSZWFsIFRpbWUgQ2xvY2sKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19EUlZfUFVWMz15CisKKyMjIyBGaWxlIHN5c3RlbXMKK0NPTkZJR19FWFQyX0ZTPW0KK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQ0X0ZTPXkKK0NPTkZJR19GVVNFX0ZTPW0KKyMJQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworQ09ORklHX0lTTzk2NjBfRlM9bQorQ09ORklHX0pPTElFVD15CitDT05GSUdfVURGX0ZTPW0KKyMJRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworQ09ORklHX1ZGQVRfRlM9bQorIwlQc2V1ZG8gZmlsZXN5c3RlbXMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIwlNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCitDT05GSUdfTUlTQ19GSUxFU1lTVEVNUz15CitDT05GSUdfSkZGUzJfRlM9bQorQ09ORklHX1VCSUZTX0ZTPW0KKyMJTmV0d29yayBGaWxlIFN5c3RlbXMKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CitDT05GSUdfUk9PVF9ORlM9eQorIwlQYXJ0aXRpb24gVHlwZXMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjCU5hdGl2ZSBsYW5ndWFnZSBzdXBwb3J0CitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTM2PW0KK0NPTkZJR19OTFNfSVNPODg1OV8xPW0KK0NPTkZJR19OTFNfVVRGOD1tCisKKyMjIyBLZXJuZWwgaGFja2luZworQ09ORklHX0ZSQU1FX1dBUk49ODA5NgorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX1BST1ZFX0xPQ0tJTkc9bgorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RFQlVHX0xMPXkKKwpkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC91bmljb3JlMzIvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGIyMDBmZGEuLmNhMTEzZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW5pY29yZTMyL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3VuaWNvcmUzMi9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsMiArMSw2MSBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KIAorZ2VuZXJpYy15ICs9IGF0b21pYy5oCitnZW5lcmljLXkgKz0gYXV4dmVjLmgKK2dlbmVyaWMteSArPSBiaXRzcGVybG9uZy5oCitnZW5lcmljLXkgKz0gYnVnLmgKK2dlbmVyaWMteSArPSBidWdzLmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKK2dlbmVyaWMteSArPSBjdXJyZW50LmgKK2dlbmVyaWMteSArPSBkZXZpY2UuaAorZ2VuZXJpYy15ICs9IGRpdjY0LmgKK2dlbmVyaWMteSArPSBlbWVyZ2VuY3ktcmVzdGFydC5oCitnZW5lcmljLXkgKz0gZXJybm8uaAorZ2VuZXJpYy15ICs9IGZiLmgKK2dlbmVyaWMteSArPSBmY250bC5oCitnZW5lcmljLXkgKz0gZnRyYWNlLmgKK2dlbmVyaWMteSArPSBmdXRleC5oCitnZW5lcmljLXkgKz0gaGFyZGlycS5oCitnZW5lcmljLXkgKz0gaHdfaXJxLmgKK2dlbmVyaWMteSArPSBpb2N0bC5oCitnZW5lcmljLXkgKz0gaW9jdGxzLmgKK2dlbmVyaWMteSArPSBpcGNidWYuaAorZ2VuZXJpYy15ICs9IGlycV9yZWdzLmgKK2dlbmVyaWMteSArPSBrZGVidWcuaAorZ2VuZXJpYy15ICs9IGttYXBfdHlwZXMuaAorZ2VuZXJpYy15ICs9IGxvY2FsLmgKK2dlbmVyaWMteSArPSBtbWFuLmgKK2dlbmVyaWMteSArPSBtb2R1bGUuaAorZ2VuZXJpYy15ICs9IG1zZ2J1Zi5oCitnZW5lcmljLXkgKz0gcGFyYW0uaAorZ2VuZXJpYy15ICs9IHBhcnBvcnQuaAorZ2VuZXJpYy15ICs9IHBlcmNwdS5oCitnZW5lcmljLXkgKz0gcG9sbC5oCitnZW5lcmljLXkgKz0gcG9zaXhfdHlwZXMuaAorZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKK2dlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCitnZW5lcmljLXkgKz0gc2VjdGlvbnMuaAorZ2VuZXJpYy15ICs9IHNlZ21lbnQuaAorZ2VuZXJpYy15ICs9IHNlbWJ1Zi5oCitnZW5lcmljLXkgKz0gc2VyaWFsLmgKK2dlbmVyaWMteSArPSBzZXR1cC5oCitnZW5lcmljLXkgKz0gc2htYnVmLmgKK2dlbmVyaWMteSArPSBzaG1wYXJhbS5oCitnZW5lcmljLXkgKz0gc2lnaW5mby5oCitnZW5lcmljLXkgKz0gc2lnbmFsLmgKK2dlbmVyaWMteSArPSBzaXplcy5oCitnZW5lcmljLXkgKz0gc29ja2V0LmgKK2dlbmVyaWMteSArPSBzb2NraW9zLmgKK2dlbmVyaWMteSArPSBzdGF0LmgKK2dlbmVyaWMteSArPSBzdGF0ZnMuaAorZ2VuZXJpYy15ICs9IHN3YWIuaAorZ2VuZXJpYy15ICs9IHN5c2NhbGxzLmgKK2dlbmVyaWMteSArPSB0ZXJtYml0cy5oCitnZW5lcmljLXkgKz0gdGVybWlvcy5oCitnZW5lcmljLXkgKz0gdG9wb2xvZ3kuaAorZ2VuZXJpYy15ICs9IHR5cGVzLmgKK2dlbmVyaWMteSArPSB1Y29udGV4dC5oCitnZW5lcmljLXkgKz0gdW5hbGlnbmVkLmgKK2dlbmVyaWMteSArPSB1c2VyLmgKK2dlbmVyaWMteSArPSB2Z2EuaAorZ2VuZXJpYy15ICs9IHhvci5oCmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZWMyM2EyZi4uYWViMGYxOCAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTYsNyArMTYsNiBAQAogb2JqLSQoQ09ORklHX0FSQ0hfUFVWMykJCSs9IGNsb2NrLm8gaXJxLm8gdGltZS5vCiAKIG9iai0kKENPTkZJR19QVVYzX0dQSU8pCQkrPSBncGlvLm8KLW9iai0kKENPTkZJR19QVVYzX1JUQykJCSs9IHJ0Yy5vCiBvYmotJChDT05GSUdfUFVWM19QV00pCQkrPSBwd20ubwogb2JqLSQoQ09ORklHX1BVVjNfUE0pCQkrPSBwbS5vIHNsZWVwLm8KIG9iai0kKENPTkZJR19ISUJFUk5BVElPTikJKz0gaGliZXJuYXRlLm8gaGliZXJuYXRlX2FzbS5vCmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggM2U1YTM4ZC4uOGZiZTg1NyAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9tb2R1bGUuYwpAQCAtMzcsMTkgKzM3LDYgQEAKIAlyZXR1cm4gX192bWFsbG9jX2FyZWEoYXJlYSwgR0ZQX0tFUk5FTCwgUEFHRV9LRVJORUxfRVhFQyk7CiB9CiAKLXZvaWQgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kdWxlLCB2b2lkICpyZWdpb24pCi17Ci0JdmZyZWUocmVnaW9uKTsKLX0KLQotaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmhkciwKLQkJCSAgICAgIEVsZl9TaGRyICpzZWNoZHJzLAotCQkJICAgICAgY2hhciAqc2Vjc3RyaW5ncywKLQkJCSAgICAgIHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQogaW50CiBhcHBseV9yZWxvY2F0ZShFbGYzMl9TaGRyICpzZWNoZHJzLCBjb25zdCBjaGFyICpzdHJ0YWIsIHVuc2lnbmVkIGludCBzeW1pbmRleCwKIAkgICAgICAgdW5zaWduZWQgaW50IHJlbGluZGV4LCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpCkBAIC0xMjgsMjUgKzExNSwzIEBACiAJfQogCXJldHVybiAwOwogfQotCi1pbnQKLWFwcGx5X3JlbG9jYXRlX2FkZChFbGYzMl9TaGRyICpzZWNoZHJzLCBjb25zdCBjaGFyICpzdHJ0YWIsCi0JCSAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwgdW5zaWduZWQgaW50IHJlbHNlYywKLQkJICAgc3RydWN0IG1vZHVsZSAqbW9kdWxlKQotewotCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBBREQgUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwKLQkgICAgICAgbW9kdWxlLT5uYW1lKTsKLQlyZXR1cm4gLUVOT0VYRUM7Ci19Ci0KLWludAotbW9kdWxlX2ZpbmFsaXplKGNvbnN0IEVsZjMyX0VoZHIgKmhkciwgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCXN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpCi17Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvcnRjLmMgYi9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvcnRjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYWQ3MGIuLjAwMDAwMDAKLS0tIGEvYXJjaC91bmljb3JlMzIva2VybmVsL3J0Yy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvcnRjLmMKLSAqCi0gKiBDb2RlIHNwZWNpZmljIHRvIFBLVW5pdHkgU29DIGFuZCBVbmlDb3JlIElTQQotICoKLSAqCU1haW50YWluZWQgYnkgR1VBTiBYdWUtdGFvIDxneHRAbXByYy5wa3UuZWR1LmNuPgotICoJQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgR3VhbiBYdWV0YW8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9ydGMuaD4KLSNpbmNsdWRlIDxsaW51eC9iY2QuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2cyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqcHV2M19ydGNfbWVtOwotCi1zdGF0aWMgaW50IHB1djNfcnRjX2FsYXJtbm8gPSBJUlFfUlRDQWxhcm07Ci1zdGF0aWMgaW50IHB1djNfcnRjX3RpY2tubyAgPSBJUlFfUlRDOwotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHB1djNfcnRjX3BpZV9sb2NrKTsKLQotLyogSVJRIEhhbmRsZXJzICovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBwdXYzX3J0Y19hbGFybWlycShpbnQgaXJxLCB2b2lkICppZCkKLXsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcmRldiA9IGlkOwotCi0Jd3JpdGVsKHJlYWRsKFJUQ19SVFNSKSB8IFJUQ19SVFNSX0FMLCBSVENfUlRTUik7Ci0JcnRjX3VwZGF0ZV9pcnEocmRldiwgMSwgUlRDX0FGIHwgUlRDX0lSUUYpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHB1djNfcnRjX3RpY2tpcnEoaW50IGlycSwgdm9pZCAqaWQpCi17Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJkZXYgPSBpZDsKLQotCXdyaXRlbChyZWFkbChSVENfUlRTUikgfCBSVENfUlRTUl9IWiwgUlRDX1JUU1IpOwotCXJ0Y191cGRhdGVfaXJxKHJkZXYsIDEsIFJUQ19QRiB8IFJUQ19JUlFGKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qIFVwZGF0ZSBjb250cm9sIHJlZ2lzdGVycyAqLwotc3RhdGljIHZvaWQgcHV2M19ydGNfc2V0YWllKGludCB0bykKLXsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JcHJfZGVidWcoIiVzOiBhaWU9JWRcbiIsIF9fZnVuY19fLCB0byk7Ci0KLQl0bXAgPSByZWFkbChSVENfUlRTUikgJiB+UlRDX1JUU1JfQUxFOwotCi0JaWYgKHRvKQotCQl0bXAgfD0gUlRDX1JUU1JfQUxFOwotCi0Jd3JpdGVsKHRtcCwgUlRDX1JUU1IpOwotfQotCi1zdGF0aWMgaW50IHB1djNfcnRjX3NldHBpZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBlbmFibGVkKQotewotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBpZT0lZFxuIiwgX19mdW5jX18sIGVuYWJsZWQpOwotCi0Jc3Bpbl9sb2NrX2lycSgmcHV2M19ydGNfcGllX2xvY2spOwotCXRtcCA9IHJlYWRsKFJUQ19SVFNSKSAmIH5SVENfUlRTUl9IWkU7Ci0KLQlpZiAoZW5hYmxlZCkKLQkJdG1wIHw9IFJUQ19SVFNSX0haRTsKLQotCXdyaXRlbCh0bXAsIFJUQ19SVFNSKTsKLQlzcGluX3VubG9ja19pcnEoJnB1djNfcnRjX3BpZV9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBUaW1lIHJlYWQvd3JpdGUgKi8KLQotc3RhdGljIGludCBwdXYzX3J0Y19nZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCi17Ci0JcnRjX3RpbWVfdG9fdG0ocmVhZGwoUlRDX1JDTlIpLCBydGNfdG0pOwotCi0JcHJfZGVidWcoInJlYWQgdGltZSAlMDJ4LiUwMnguJTAyeCAlMDJ4LyUwMngvJTAyeFxuIiwKLQkJIHJ0Y190bS0+dG1feWVhciwgcnRjX3RtLT50bV9tb24sIHJ0Y190bS0+dG1fbWRheSwKLQkJIHJ0Y190bS0+dG1faG91ciwgcnRjX3RtLT50bV9taW4sIHJ0Y190bS0+dG1fc2VjKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB1djNfcnRjX3NldHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXVuc2lnbmVkIGxvbmcgcnRjX2NvdW50ID0gMDsKLQotCXByX2RlYnVnKCJzZXQgdGltZSAlMDJkLiUwMmQuJTAyZCAlMDJkLyUwMmQvJTAyZFxuIiwKLQkJIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKLQkJIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKLQotCXJ0Y190bV90b190aW1lKHRtLCAmcnRjX2NvdW50KTsKLQl3cml0ZWwocnRjX2NvdW50LCBSVENfUkNOUik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdXYzX3J0Y19nZXRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQotewotCXN0cnVjdCBydGNfdGltZSAqYWxtX3RtID0gJmFscm0tPnRpbWU7Ci0KLQlydGNfdGltZV90b190bShyZWFkbChSVENfUlRBUiksIGFsbV90bSk7Ci0KLQlhbHJtLT5lbmFibGVkID0gcmVhZGwoUlRDX1JUU1IpICYgUlRDX1JUU1JfQUxFOwotCi0JcHJfZGVidWcoInJlYWQgYWxhcm0gJTAyeCAlMDJ4LiUwMnguJTAyeCAlMDJ4LyUwMngvJTAyeFxuIiwKLQkJIGFscm0tPmVuYWJsZWQsCi0JCSBhbG1fdG0tPnRtX3llYXIsIGFsbV90bS0+dG1fbW9uLCBhbG1fdG0tPnRtX21kYXksCi0JCSBhbG1fdG0tPnRtX2hvdXIsIGFsbV90bS0+dG1fbWluLCBhbG1fdG0tPnRtX3NlYyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdXYzX3J0Y19zZXRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQotewotCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsKLQl1bnNpZ25lZCBsb25nIHJ0Y2FsYXJtX2NvdW50ID0gMDsKLQotCXByX2RlYnVnKCJwdXYzX3J0Y19zZXRhbGFybTogJWQsICUwMngvJTAyeC8lMDJ4ICUwMnguJTAyeC4lMDJ4XG4iLAotCQkgYWxybS0+ZW5hYmxlZCwKLQkJIHRtLT50bV9tZGF5ICYgMHhmZiwgdG0tPnRtX21vbiAmIDB4ZmYsIHRtLT50bV95ZWFyICYgMHhmZiwKLQkJIHRtLT50bV9ob3VyICYgMHhmZiwgdG0tPnRtX21pbiAmIDB4ZmYsIHRtLT50bV9zZWMpOwotCi0JcnRjX3RtX3RvX3RpbWUodG0sICZydGNhbGFybV9jb3VudCk7Ci0Jd3JpdGVsKHJ0Y2FsYXJtX2NvdW50LCBSVENfUlRBUik7Ci0KLQlwdXYzX3J0Y19zZXRhaWUoYWxybS0+ZW5hYmxlZCk7Ci0KLQlpZiAoYWxybS0+ZW5hYmxlZCkKLQkJZW5hYmxlX2lycV93YWtlKHB1djNfcnRjX2FsYXJtbm8pOwotCWVsc2UKLQkJZGlzYWJsZV9pcnFfd2FrZShwdXYzX3J0Y19hbGFybW5vKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB1djNfcnRjX3Byb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKLXsKLQlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX0lSUVx0OiAlc1xuIiwKLQkJICAgICAocmVhZGwoUlRDX1JUU1IpICYgUlRDX1JUU1JfSFpFKSA/ICJ5ZXMiIDogIm5vIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHV2M19ydGNfb3BlbihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBydGNfZGV2aWNlICpydGNfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlcXVlc3RfaXJxKHB1djNfcnRjX2FsYXJtbm8sIHB1djNfcnRjX2FsYXJtaXJxLAotCQkJICBJUlFGX0RJU0FCTEVELCAgInBrdW5pdHktcnRjIGFsYXJtIiwgcnRjX2Rldik7Ci0KLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAiSVJRJWQgZXJyb3IgJWRcbiIsIHB1djNfcnRjX2FsYXJtbm8sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gcmVxdWVzdF9pcnEocHV2M19ydGNfdGlja25vLCBwdXYzX3J0Y190aWNraXJxLAotCQkJICBJUlFGX0RJU0FCTEVELCAgInBrdW5pdHktcnRjIHRpY2siLCBydGNfZGV2KTsKLQotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICJJUlElZCBlcnJvciAlZFxuIiwgcHV2M19ydGNfdGlja25vLCByZXQpOwotCQlnb3RvIHRpY2tfZXJyOwotCX0KLQotCXJldHVybiByZXQ7Ci0KLSB0aWNrX2VycjoKLQlmcmVlX2lycShwdXYzX3J0Y19hbGFybW5vLCBydGNfZGV2KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBwdXYzX3J0Y19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCS8qIGRvIG5vdCBjbGVhciBBSUUgaGVyZSwgaXQgbWF5IGJlIG5lZWRlZCBmb3Igd2FrZSAqLwotCi0JcHV2M19ydGNfc2V0cGllKGRldiwgMCk7Ci0JZnJlZV9pcnEocHV2M19ydGNfYWxhcm1ubywgcnRjX2Rldik7Ci0JZnJlZV9pcnEocHV2M19ydGNfdGlja25vLCBydGNfZGV2KTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHB1djNfcnRjb3BzID0gewotCS5vcGVuCQk9IHB1djNfcnRjX29wZW4sCi0JLnJlbGVhc2UJPSBwdXYzX3J0Y19yZWxlYXNlLAotCS5yZWFkX3RpbWUJPSBwdXYzX3J0Y19nZXR0aW1lLAotCS5zZXRfdGltZQk9IHB1djNfcnRjX3NldHRpbWUsCi0JLnJlYWRfYWxhcm0JPSBwdXYzX3J0Y19nZXRhbGFybSwKLQkuc2V0X2FsYXJtCT0gcHV2M19ydGNfc2V0YWxhcm0sCi0JLnByb2MJICAgICAgICA9IHB1djNfcnRjX3Byb2MsCi19OwotCi1zdGF0aWMgdm9pZCBwdXYzX3J0Y19lbmFibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IGVuKQotewotCWlmICghZW4pIHsKLQkJd3JpdGVsKHJlYWRsKFJUQ19SVFNSKSAmIH5SVENfUlRTUl9IWkUsIFJUQ19SVFNSKTsKLQl9IGVsc2UgewotCQkvKiByZS1lbmFibGUgdGhlIGRldmljZSwgYW5kIGNoZWNrIGl0IGlzIG9rICovCi0KLQkJaWYgKChyZWFkbChSVENfUlRTUikgJiBSVENfUlRTUl9IWkUpID09IDApIHsKLQkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJydGMgZGlzYWJsZWQsIHJlLWVuYWJsaW5nXG4iKTsKLQkJCXdyaXRlbChyZWFkbChSVENfUlRTUikgfCBSVENfUlRTUl9IWkUsIFJUQ19SVFNSKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBwdXYzX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKLQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKLQotCXB1djNfcnRjX3NldHBpZSgmZGV2LT5kZXYsIDApOwotCXB1djNfcnRjX3NldGFpZSgwKTsKLQotCXJlbGVhc2VfcmVzb3VyY2UocHV2M19ydGNfbWVtKTsKLQlrZnJlZShwdXYzX3J0Y19tZW0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHV2M19ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCByZXQ7Ci0KLQlwcl9kZWJ1ZygiJXM6IHByb2JlPSVwXG4iLCBfX2Z1bmNfXywgcGRldik7Ci0KLQkvKiBmaW5kIHRoZSBJUlFzICovCi0KLQlwdXYzX3J0Y190aWNrbm8gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOwotCWlmIChwdXYzX3J0Y190aWNrbm8gPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSBmb3IgcnRjIHRpY2tcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQlwdXYzX3J0Y19hbGFybW5vID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAocHV2M19ydGNfYWxhcm1ubyA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaXJxIGZvciBhbGFybVxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCXByX2RlYnVnKCJQS1VuaXR5X3J0YzogdGljayBpcnEgJWQsIGFsYXJtIGlycSAlZFxuIiwKLQkJIHB1djNfcnRjX3RpY2tubywgcHV2M19ydGNfYWxhcm1ubyk7Ci0KLQkvKiBnZXQgdGhlIG1lbW9yeSByZWdpb24gKi8KLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5IHJlZ2lvbiByZXNvdXJjZVxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCXB1djNfcnRjX21lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LAotCQkJCQkgcmVzLT5lbmQtcmVzLT5zdGFydCsxLAotCQkJCQkgcGRldi0+bmFtZSk7Ci0KLQlpZiAocHV2M19ydGNfbWVtID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlc2VydmUgbWVtb3J5IHJlZ2lvblxuIik7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyX25vcmVzOwotCX0KLQotCXB1djNfcnRjX2VuYWJsZShwZGV2LCAxKTsKLQotCS8qIHJlZ2lzdGVyIFJUQyBhbmQgZXhpdCAqLwotCi0JcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigicGt1bml0eSIsICZwZGV2LT5kZXYsICZwdXYzX3J0Y29wcywKLQkJCQkgIFRISVNfTU9EVUxFKTsKLQotCWlmIChJU19FUlIocnRjKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgYXR0YWNoIHJ0Y1xuIik7Ci0JCXJldCA9IFBUUl9FUlIocnRjKTsKLQkJZ290byBlcnJfbm9ydGM7Ci0JfQotCi0JLyogcGxhdGZvcm0gc2V0dXAgY29kZSBzaG91bGQgaGF2ZSBoYW5kbGVkIHRoaXM7IHNpZ2ggKi8KLQlpZiAoIWRldmljZV9jYW5fd2FrZXVwKCZwZGV2LT5kZXYpKQotCQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOwotCXJldHVybiAwOwotCi0gZXJyX25vcnRjOgotCXB1djNfcnRjX2VuYWJsZShwZGV2LCAwKTsKLQlyZWxlYXNlX3Jlc291cmNlKHB1djNfcnRjX21lbSk7Ci0KLSBlcnJfbm9yZXM6Ci0JcmV0dXJuIHJldDsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotCi0vKiBSVEMgUG93ZXIgbWFuYWdlbWVudCBjb250cm9sICovCi0KLXN0YXRpYyBpbnQgdGljbnRfc2F2ZTsKLQotc3RhdGljIGludCBwdXYzX3J0Y19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQkvKiBzYXZlIFJUQVIgZm9yIGFueW9uZSB1c2luZyBwZXJpb2RpYyBpbnRlcnJ1cHRzICovCi0JdGljbnRfc2F2ZSA9IHJlYWRsKFJUQ19SVEFSKTsKLQlwdXYzX3J0Y19lbmFibGUocGRldiwgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHV2M19ydGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcHV2M19ydGNfZW5hYmxlKHBkZXYsIDEpOwotCXdyaXRlbCh0aWNudF9zYXZlLCBSVENfUlRBUik7Ci0JcmV0dXJuIDA7Ci19Ci0jZWxzZQotI2RlZmluZSBwdXYzX3J0Y19zdXNwZW5kIE5VTEwKLSNkZWZpbmUgcHV2M19ydGNfcmVzdW1lICBOVUxMCi0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHV2M19ydGNkcnYgPSB7Ci0JLnByb2JlCQk9IHB1djNfcnRjX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocHV2M19ydGNfcmVtb3ZlKSwKLQkuc3VzcGVuZAk9IHB1djNfcnRjX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBwdXYzX3J0Y19yZXN1bWUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gIlBLVW5pdHktdjMtUlRDIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfQotfTsKLQotc3RhdGljIGNoYXIgX19pbml0ZGF0YSBiYW5uZXJbXSA9ICJQS1VuaXR5LXYzIFJUQywgKGMpIDIwMDkgUEtVbml0eSBDby5cbiI7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHB1djNfcnRjX2luaXQodm9pZCkKLXsKLQlwcmludGsoYmFubmVyKTsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwdXYzX3J0Y2Rydik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwdXYzX3J0Y19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnB1djNfcnRjZHJ2KTsKLX0KLQotbW9kdWxlX2luaXQocHV2M19ydGNfaW5pdCk7Ci1tb2R1bGVfZXhpdChwdXYzX3J0Y19leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJSVEMgRHJpdmVyIGZvciB0aGUgUEtVbml0eSB2MyBjaGlwIik7Ci1NT0RVTEVfQVVUSE9SKCJIdSBEb25nbGlhbmciKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA5YmY3ZjdhLi43N2U0MDdlIDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMzAsNyArMzAsNyBAQAogCUhFQURfVEVYVF9TRUNUSU9OCiAJSU5JVF9URVhUX1NFQ1RJT04oUEFHRV9TSVpFKQogCUlOSVRfREFUQV9TRUNUSU9OKDE2KQotCVBFUkNQVShMMV9DQUNIRV9CWVRFUywgUEFHRV9TSVpFKQorCVBFUkNQVV9TRUNUSU9OKEwxX0NBQ0hFX0JZVEVTKQogCV9faW5pdF9lbmQgPSAuOwogCiAJX3N0ZXh0ID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcgYi9hcmNoL3g4Ni9LY29uZmlnCmluZGV4IGRhMzQ5NzIuLjc4ZmU1N2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZwpAQCAtMjAsNiArMjAsNyBAQAogCXNlbGVjdCBIQVZFX1VOU1RBQkxFX1NDSEVEX0NMT0NLCiAJc2VsZWN0IEhBVkVfSURFCiAJc2VsZWN0IEhBVkVfT1BST0ZJTEUKKwlzZWxlY3QgSEFWRV9QQ1NQS1JfUExBVEZPUk0KIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUwogCXNlbGVjdCBIQVZFX0lSUV9XT1JLCiAJc2VsZWN0IEhBVkVfSU9SRU1BUF9QUk9UCkBAIC03MCw2ICs3MSw3IEBACiAJc2VsZWN0IElSUV9GT1JDRURfVEhSRUFESU5HCiAJc2VsZWN0IFVTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlmIFNNUAogCXNlbGVjdCBIQVZFX0JQRl9KSVQgaWYgKFg4Nl82NCAmJiBORVQpCisJc2VsZWN0IENMS0VWVF9JODI1MwogCiBjb25maWcgSU5TVFJVQ1RJT05fREVDT0RFUgogCWRlZl9ib29sIChLUFJPQkVTIHx8IFBFUkZfRVZFTlRTKQpAQCAtOTMsNiArOTUsMTAgQEAKIGNvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTCiAJZGVmX2Jvb2wgeQogCitjb25maWcgQVJDSF9DTE9DS1NPVVJDRV9EQVRBCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gWDg2XzY0CisKIGNvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFg4Nl82NCB8fCAoWDg2XzMyICYmIFg4Nl9MT0NBTF9BUElDKQpAQCAtMzg0LDEyICszOTAsMjEgQEAKIAkgIFRoaXMgb3B0aW9uIGNvbXBpbGVzIGluIHN1cHBvcnQgZm9yIHRoZSBDRTQxMDAgU09DIGZvciBzZXR0b3AKIAkgIGJveGVzIGFuZCBtZWRpYSBkZXZpY2VzLgogCitjb25maWcgWDg2X0lOVEVMX01JRAorCWJvb2wgIkludGVsIE1JRCBwbGF0Zm9ybSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWDg2XzMyCisJZGVwZW5kcyBvbiBYODZfRVhURU5ERURfUExBVEZPUk0KKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdG8gYnVpbGQgYSBrZXJuZWwgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIEludGVsIE1JRCBwbGF0Zm9ybQorCSAgc3lzdGVtcyB3aGljaCBkbyBub3QgaGF2ZSB0aGUgUENJIGxlZ2FjeSBpbnRlcmZhY2VzIChNb29yZXN0b3duLAorCSAgTWVkZmllbGQpLiBJZiB5b3UgYXJlIGJ1aWxkaW5nIGZvciBhIFBDIGNsYXNzIHN5c3RlbSBzYXkgTiBoZXJlLgorCitpZiBYODZfSU5URUxfTUlECisKIGNvbmZpZyBYODZfTVJTVAogICAgICAgIGJvb2wgIk1vb3Jlc3Rvd24gTUlEIHBsYXRmb3JtIgogCWRlcGVuZHMgb24gUENJCiAJZGVwZW5kcyBvbiBQQ0lfR09BTlkKLQlkZXBlbmRzIG9uIFg4Nl8zMgotCWRlcGVuZHMgb24gWDg2X0VYVEVOREVEX1BMQVRGT1JNCiAJZGVwZW5kcyBvbiBYODZfSU9fQVBJQwogCXNlbGVjdCBBUEJfVElNRVIKIAlzZWxlY3QgSTJDCkBAIC00MDQsNiArNDE5LDggQEAKIAkgIG5vciBzdGFuZGFyZCBsZWdhY3kgcmVwbGFjZW1lbnQgZGV2aWNlcy9mZWF0dXJlcy4gZS5nLiBNb29yZXN0b3duIGRvZXMKIAkgIG5vdCBjb250YWluIGk4MjU5LCBpODI1NCwgSFBFVCwgbGVnYWN5IEJJT1MsIG1vc3Qgb2YgdGhlIGlvIHBvcnRzLgogCitlbmRpZgorCiBjb25maWcgWDg2X1JEQzMyMVgKIAlib29sICJSREMgUi0zMjF4IFNvQyIKIAlkZXBlbmRzIG9uIFg4Nl8zMgpAQCAtNTEyLDYgKzUyOSwxOCBAQAogCiBpZiBQQVJBVklSVF9HVUVTVAogCitjb25maWcgUEFSQVZJUlRfVElNRV9BQ0NPVU5USU5HCisJYm9vbCAiUGFyYXZpcnR1YWwgc3RlYWwgdGltZSBhY2NvdW50aW5nIgorCXNlbGVjdCBQQVJBVklSVAorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgZmluZSBncmFudWxhcml0eSB0YXNrIHN0ZWFsIHRpbWUKKwkgIGFjY291bnRpbmcuIFRpbWUgc3BlbnQgZXhlY3V0aW5nIG90aGVyIHRhc2tzIGluIHBhcmFsbGVsIHdpdGgKKwkgIHRoZSBjdXJyZW50IHZDUFUgaXMgZGlzY291bnRlZCBmcm9tIHRoZSB2Q1BVIHBvd2VyLiBUbyBhY2NvdW50IGZvcgorCSAgdGhhdCwgdGhlcmUgY2FuIGJlIGEgc21hbGwgcGVyZm9ybWFuY2UgaW1wYWN0LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4gaGVyZS4KKwogc291cmNlICJhcmNoL3g4Ni94ZW4vS2NvbmZpZyIKIAogY29uZmlnIEtWTV9DTE9DSwpAQCAtNjE3LDYgKzY0Niw3IEBACiBjb25maWcgQVBCX1RJTUVSCiAgICAgICAgZGVmX2Jvb2wgeSBpZiBNUlNUCiAgICAgICAgcHJvbXB0ICJMYW5nd2VsbCBBUEIgVGltZXIgU3VwcG9ydCIgaWYgWDg2X01SU1QKKyAgICAgICBzZWxlY3QgRFdfQVBCX1RJTUVSCiAgICAgICAgaGVscAogICAgICAgICAgQVBCIHRpbWVyIGlzIHRoZSByZXBsYWNlbWVudCBmb3IgODI1NCwgSFBFVCBvbiBYODYgTUlEIHBsYXRmb3Jtcy4KICAgICAgICAgIFRoZSBBUEJUIHByb3ZpZGVzIGEgc3RhYmxlIHRpbWUgYmFzZSBvbiBTTVAKQEAgLTY4MCwzMyArNzEwLDYgQEAKIAkgIENhbGdhcnkgYW55d2F5LCBwYXNzICdpb21tdT1jYWxnYXJ5JyBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKLWNvbmZpZyBBTURfSU9NTVUKLQlib29sICJBTUQgSU9NTVUgc3VwcG9ydCIKLQlzZWxlY3QgU1dJT1RMQgotCXNlbGVjdCBQQ0lfTVNJCi0Jc2VsZWN0IFBDSV9JT1YKLQlkZXBlbmRzIG9uIFg4Nl82NCAmJiBQQ0kgJiYgQUNQSQotCS0tLWhlbHAtLS0KLQkgIFdpdGggdGhpcyBvcHRpb24geW91IGNhbiBlbmFibGUgc3VwcG9ydCBmb3IgQU1EIElPTU1VIGhhcmR3YXJlIGluCi0JICB5b3VyIHN5c3RlbS4gQW4gSU9NTVUgaXMgYSBoYXJkd2FyZSBjb21wb25lbnQgd2hpY2ggcHJvdmlkZXMKLQkgIHJlbWFwcGluZyBvZiBETUEgbWVtb3J5IGFjY2Vzc2VzIGZyb20gZGV2aWNlcy4gV2l0aCBhbiBBTUQgSU9NTVUgeW91Ci0JICBjYW4gaXNvbGF0ZSB0aGUgdGhlIERNQSBtZW1vcnkgb2YgZGlmZmVyZW50IGRldmljZXMgYW5kIHByb3RlY3QgdGhlCi0JICBzeXN0ZW0gZnJvbSBtaXNiZWhhdmluZyBkZXZpY2UgZHJpdmVycyBvciBoYXJkd2FyZS4KLQotCSAgWW91IGNhbiBmaW5kIG91dCBpZiB5b3VyIHN5c3RlbSBoYXMgYW4gQU1EIElPTU1VIGlmIHlvdSBsb29rIGludG8KLQkgIHlvdXIgQklPUyBmb3IgYW4gb3B0aW9uIHRvIGVuYWJsZSBpdCBvciBpZiB5b3UgaGF2ZSBhbiBJVlJTIEFDUEkKLQkgIHRhYmxlLgotCi1jb25maWcgQU1EX0lPTU1VX1NUQVRTCi0JYm9vbCAiRXhwb3J0IEFNRCBJT01NVSBzdGF0aXN0aWNzIHRvIGRlYnVnZnMiCi0JZGVwZW5kcyBvbiBBTURfSU9NTVUKLQlzZWxlY3QgREVCVUdfRlMKLQktLS1oZWxwLS0tCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIGNvZGUgaW4gdGhlIEFNRCBJT01NVSBkcml2ZXIgdG8gY29sbGVjdCB2YXJpb3VzCi0JICBzdGF0aXN0aWNzIGFib3V0IHdoYXRzIGhhcHBlbmluZyBpbiB0aGUgZHJpdmVyIGFuZCBleHBvcnRzIHRoYXQKLQkgIGluZm9ybWF0aW9uIHRvIHVzZXJzcGFjZSB2aWEgZGVidWdmcy4KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KICMgbmVlZCB0aGlzIGFsd2F5cyBzZWxlY3RlZCBieSBJT01NVSBmb3IgdGhlIFZJQSB3b3JrYXJvdW5kCiBjb25maWcgU1dJT1RMQgogCWRlZl9ib29sIHkgaWYgWDg2XzY0CkBAIC03MjAsOSArNzIzLDYgQEAKIGNvbmZpZyBJT01NVV9IRUxQRVIKIAlkZWZfYm9vbCAoQ0FMR0FSWV9JT01NVSB8fCBHQVJUX0lPTU1VIHx8IFNXSU9UTEIgfHwgQU1EX0lPTU1VKQogCi1jb25maWcgSU9NTVVfQVBJCi0JZGVmX2Jvb2wgKEFNRF9JT01NVSB8fCBETUFSKQotCiBjb25maWcgTUFYU01QCiAJYm9vbCAiRW5hYmxlIE1heGltdW0gbnVtYmVyIG9mIFNNUCBQcm9jZXNzb3JzIGFuZCBOVU1BIE5vZGVzIgogCWRlcGVuZHMgb24gWDg2XzY0ICYmIFNNUCAmJiBERUJVR19LRVJORUwgJiYgRVhQRVJJTUVOVEFMCkBAIC0xMTcwLDcgKzExNzAsNyBAQAogY29uZmlnIEFNRF9OVU1BCiAJZGVmX2Jvb2wgeQogCXByb21wdCAiT2xkIHN0eWxlIEFNRCBPcHRlcm9uIE5VTUEgZGV0ZWN0aW9uIgotCWRlcGVuZHMgb24gTlVNQSAmJiBQQ0kKKwlkZXBlbmRzIG9uIFg4Nl82NCAmJiBOVU1BICYmIFBDSQogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBBTUQgTlVNQSBub2RlIHRvcG9sb2d5IGRldGVjdGlvbi4gIFlvdSBzaG91bGQgc2F5IFkgaGVyZSBpZgogCSAgeW91IGhhdmUgYSBtdWx0aSBwcm9jZXNzb3IgQU1EIHN5c3RlbS4gVGhpcyB1c2VzIGFuIG9sZCBtZXRob2QgdG8KQEAgLTE3MzcsOCArMTczNyw4IEBACiAJICBtYWNoaW5lcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLgogCiAJICBJbiBvcmRlciB0byB1c2UgQVBNLCB5b3Ugd2lsbCBuZWVkIHN1cHBvcnRpbmcgc29mdHdhcmUuIEZvciBsb2NhdGlvbgotCSAgYW5kIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9wb3dlci9wbS50eHQ+IGFuZCB0aGUKLQkgIEJhdHRlcnkgUG93ZXJlZCBMaW51eCBtaW5pLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgYW5kIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9wb3dlci9hcG0tYWNwaS50eHQ+CisJICBhbmQgdGhlIEJhdHRlcnkgUG93ZXJlZCBMaW51eCBtaW5pLUhPV1RPLCBhdmFpbGFibGUgZnJvbQogCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KIAogCSAgVGhpcyBkcml2ZXIgZG9lcyBub3Qgc3BpbiBkb3duIGRpc2sgZHJpdmVzIChzZWUgdGhlIGhkcGFybSg4KQpAQCAtMTk0Miw1NSArMTk0Miw2IEBACiAKIAkgIFlvdSBzaG91bGQgc2F5IE4gdW5sZXNzIHlvdSBrbm93IHlvdSBuZWVkIHRoaXMuCiAKLWNvbmZpZyBETUFSCi0JYm9vbCAiU3VwcG9ydCBmb3IgRE1BIFJlbWFwcGluZyBEZXZpY2VzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gUENJX01TSSAmJiBBQ1BJICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIERNQSByZW1hcHBpbmcgKERNQVIpIGRldmljZXMgc3VwcG9ydCBlbmFibGVzIGluZGVwZW5kZW50IGFkZHJlc3MKLQkgIHRyYW5zbGF0aW9ucyBmb3IgRGlyZWN0IE1lbW9yeSBBY2Nlc3MgKERNQSkgZnJvbSBkZXZpY2VzLgotCSAgVGhlc2UgRE1BIHJlbWFwcGluZyBkZXZpY2VzIGFyZSByZXBvcnRlZCB2aWEgQUNQSSB0YWJsZXMKLQkgIGFuZCBpbmNsdWRlIFBDSSBkZXZpY2Ugc2NvcGUgY292ZXJlZCBieSB0aGVzZSBETUEKLQkgIHJlbWFwcGluZyBkZXZpY2VzLgotCi1jb25maWcgRE1BUl9ERUZBVUxUX09OCi0JZGVmX2Jvb2wgeQotCXByb21wdCAiRW5hYmxlIERNQSBSZW1hcHBpbmcgRGV2aWNlcyBieSBkZWZhdWx0IgotCWRlcGVuZHMgb24gRE1BUgotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBhIERNQVIgZGV2aWNlIGF0IGJvb3QgdGltZSBpZgotCSAgb25lIGlzIGZvdW5kLiBJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc2VsZWN0ZWQsIERNQVIgc3VwcG9ydCBjYW4KLQkgIGJlIGVuYWJsZWQgYnkgcGFzc2luZyBpbnRlbF9pb21tdT1vbiB0byB0aGUga2VybmVsLiBJdCBpcwotCSAgcmVjb21tZW5kZWQgeW91IHNheSBOIGhlcmUgd2hpbGUgdGhlIERNQVIgY29kZSByZW1haW5zCi0JICBleHBlcmltZW50YWwuCi0KLWNvbmZpZyBETUFSX0JST0tFTl9HRlhfV0EKLQlib29sICJXb3JrYXJvdW5kIGJyb2tlbiBncmFwaGljcyBkcml2ZXJzIChnb2luZyBhd2F5IHNvb24pIgotCWRlcGVuZHMgb24gRE1BUiAmJiBCUk9LRU4KLQktLS1oZWxwLS0tCi0JICBDdXJyZW50IEdyYXBoaWNzIGRyaXZlcnMgdGVuZCB0byB1c2UgcGh5c2ljYWwgYWRkcmVzcwotCSAgZm9yIERNQSBhbmQgYXZvaWQgdXNpbmcgRE1BIEFQSXMuIFNldHRpbmcgdGhpcyBjb25maWcKLQkgIG9wdGlvbiBwZXJtaXRzIHRoZSBJT01NVSBkcml2ZXIgdG8gc2V0IGEgdW5pdHkgbWFwIGZvcgotCSAgYWxsIHRoZSBPUy12aXNpYmxlIG1lbW9yeS4gSGVuY2UgdGhlIGRyaXZlciBjYW4gY29udGludWUKLQkgIHRvIHVzZSBwaHlzaWNhbCBhZGRyZXNzZXMgZm9yIERNQSwgYXQgbGVhc3QgdW50aWwgdGhpcwotCSAgb3B0aW9uIGlzIHJlbW92ZWQgaW4gdGhlIDIuNi4zMiBrZXJuZWwuCi0KLWNvbmZpZyBETUFSX0ZMT1BQWV9XQQotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIERNQVIKLQktLS1oZWxwLS0tCi0JICBGbG9wcHkgZGlzayBkcml2ZXJzIGFyZSBrbm93biB0byBieXBhc3MgRE1BIEFQSSBjYWxscwotCSAgdGhlcmVieSBmYWlsaW5nIHRvIHdvcmsgd2hlbiBJT01NVSBpcyBlbmFibGVkLiBUaGlzCi0JICB3b3JrYXJvdW5kIHdpbGwgc2V0dXAgYSAxOjEgbWFwcGluZyBmb3IgdGhlIGZpcnN0Ci0JICAxNk1pQiB0byBtYWtlIGZsb3BweSAoYW4gSVNBIGRldmljZSkgd29yay4KLQotY29uZmlnIElOVFJfUkVNQVAKLQlib29sICJTdXBwb3J0IGZvciBJbnRlcnJ1cHQgUmVtYXBwaW5nIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gWDg2XzY0ICYmIFg4Nl9JT19BUElDICYmIFBDSV9NU0kgJiYgQUNQSSAmJiBFWFBFUklNRU5UQUwKLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0cyBJbnRlcnJ1cHQgcmVtYXBwaW5nIGZvciBJTy1BUElDIGFuZCBNU0kgZGV2aWNlcy4KLQkgIFRvIHVzZSB4MmFwaWMgbW9kZSBpbiB0aGUgQ1BVJ3Mgd2hpY2ggc3VwcG9ydCB4MkFQSUMgZW5oYW5jZW1lbnRzIG9yCi0JICB0byBzdXBwb3J0IHBsYXRmb3JtcyB3aXRoIENQVSdzIGhhdmluZyA+IDggYml0IEFQSUMgSUQsIHNheSBZLgotCiBzb3VyY2UgImRyaXZlcnMvcGNpL3BjaWUvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZy5jcHUgYi9hcmNoL3g4Ni9LY29uZmlnLmNwdQppbmRleCA2YTdjZmRmLi5lM2NhN2UwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnLmNwdQorKysgYi9hcmNoL3g4Ni9LY29uZmlnLmNwdQpAQCAtMzEyLDYgKzMxMiw5IEBACiBjb25maWcgQ01QWENIR19MT0NBTAogCWRlZl9ib29sIFg4Nl82NCB8fCAoWDg2XzMyICYmICFNMzg2KQogCitjb25maWcgQ01QWENIR19ET1VCTEUKKwlkZWZfYm9vbCB5CisKIGNvbmZpZyBYODZfTDFfQ0FDSEVfU0hJRlQKIAlpbnQKIAlkZWZhdWx0ICI3IiBpZiBNUEVOVElVTTQgfHwgTVBTQwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9NYWtlZmlsZSBiL2FyY2gveDg2L2Jvb3QvTWFrZWZpbGUKaW5kZXggZjdjYjA4Ni4uOTUzNjVhOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9ib290L01ha2VmaWxlCkBAIC05LDEyICs5LDYgQEAKICMgQ2hhbmdlZCBieSBtYW55LCBtYW55IGNvbnRyaWJ1dG9ycyBvdmVyIHRoZSB5ZWFycy4KICMKIAotIyBST09UX0RFViBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgcm9vdC1kZXZpY2Ugd2hlbiBtYWtpbmcgdGhlIGltYWdlLgotIyBUaGlzIGNhbiBiZSBlaXRoZXIgRkxPUFBZLCBDVVJSRU5ULCAvZGV2L3h4eHggb3IgZW1wdHksIGluIHdoaWNoIGNhc2UKLSMgdGhlIGRlZmF1bHQgb2YgRkxPUFBZIGlzIHVzZWQgYnkgJ2J1aWxkJy4KLQotUk9PVF9ERVYJOj0gQ1VSUkVOVAotCiAjIElmIHlvdSB3YW50IHRvIHByZXNldCB0aGUgU1ZHQSBtb2RlLCB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSBhbmQKICMgc2V0IFNWR0FfTU9ERSB0byB3aGF0ZXZlciBudW1iZXIgeW91IHdhbnQuCiAjIFNldCBpdCB0byAtRFNWR0FfTU9ERT1OT1JNQUxfVkdBIGlmIHlvdSBqdXN0IHdhbnQgdGhlIEVHQS9WR0EgbW9kZS4KQEAgLTc1LDggKzY5LDcgQEAKICQob2JqKS9iekltYWdlOiBhc2ZsYWdzLXkgIDo9ICQoU1ZHQV9NT0RFKQogCiBxdWlldF9jbWRfaW1hZ2UgPSBCVUlMRCAgICRACi1jbWRfaW1hZ2UgPSAkKG9iaikvdG9vbHMvYnVpbGQgJChvYmopL3NldHVwLmJpbiAkKG9iaikvdm1saW51eC5iaW4gXAotCSQoUk9PVF9ERVYpID4gJEAKK2NtZF9pbWFnZSA9ICQob2JqKS90b29scy9idWlsZCAkKG9iaikvc2V0dXAuYmluICQob2JqKS92bWxpbnV4LmJpbiA+ICRACiAKICQob2JqKS9iekltYWdlOiAkKG9iaikvc2V0dXAuYmluICQob2JqKS92bWxpbnV4LmJpbiAkKG9iaikvdG9vbHMvYnVpbGQgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxpbWFnZSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvdG9vbHMvYnVpbGQuYyBiL2FyY2gveDg2L2Jvb3QvdG9vbHMvYnVpbGQuYwppbmRleCBlZTNhNGVhLi5mZGM2MGEwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L3Rvb2xzL2J1aWxkLmMKKysrIGIvYXJjaC94ODYvYm9vdC90b29scy9idWlsZC5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAogc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKIHsKLQlkaWUoIlVzYWdlOiBidWlsZCBzZXR1cCBzeXN0ZW0gW3Jvb3RkZXZdIFs+IGltYWdlXSIpOworCWRpZSgiVXNhZ2U6IGJ1aWxkIHNldHVwIHN5c3RlbSBbPiBpbWFnZV0iKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKQEAgLTEzOCwzOSArMTM4LDE0IEBACiAJdW5zaWduZWQgaW50IGksIHN6LCBzZXR1cF9zZWN0b3JzOwogCWludCBjOwogCXUzMiBzeXNfc2l6ZTsKLQl1OCBtYWpvcl9yb290LCBtaW5vcl9yb290OwogCXN0cnVjdCBzdGF0IHNiOwogCUZJTEUgKmZpbGU7CiAJaW50IGZkOwogCXZvaWQgKmtlcm5lbDsKIAl1MzIgY3JjID0gMHhmZmZmZmZmZlVMOwogCi0JaWYgKChhcmdjIDwgMykgfHwgKGFyZ2MgPiA0KSkKKwlpZiAoYXJnYyAhPSAzKQogCQl1c2FnZSgpOwotCWlmIChhcmdjID4gMykgewotCQlpZiAoIXN0cmNtcChhcmd2WzNdLCAiQ1VSUkVOVCIpKSB7Ci0JCQlpZiAoc3RhdCgiLyIsICZzYikpIHsKLQkJCQlwZXJyb3IoIi8iKTsKLQkJCQlkaWUoIkNvdWxkbid0IHN0YXQgLyIpOwotCQkJfQotCQkJbWFqb3Jfcm9vdCA9IG1ham9yKHNiLnN0X2Rldik7Ci0JCQltaW5vcl9yb290ID0gbWlub3Ioc2Iuc3RfZGV2KTsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlszXSwgIkZMT1BQWSIpKSB7Ci0JCQlpZiAoc3RhdChhcmd2WzNdLCAmc2IpKSB7Ci0JCQkJcGVycm9yKGFyZ3ZbM10pOwotCQkJCWRpZSgiQ291bGRuJ3Qgc3RhdCByb290IGRldmljZS4iKTsKLQkJCX0KLQkJCW1ham9yX3Jvb3QgPSBtYWpvcihzYi5zdF9yZGV2KTsKLQkJCW1pbm9yX3Jvb3QgPSBtaW5vcihzYi5zdF9yZGV2KTsKLQkJfSBlbHNlIHsKLQkJCW1ham9yX3Jvb3QgPSAwOwotCQkJbWlub3Jfcm9vdCA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQltYWpvcl9yb290ID0gREVGQVVMVF9NQUpPUl9ST09UOwotCQltaW5vcl9yb290ID0gREVGQVVMVF9NSU5PUl9ST09UOwotCX0KLQlmcHJpbnRmKHN0ZGVyciwgIlJvb3QgZGV2aWNlIGlzICglZCwgJWQpXG4iLCBtYWpvcl9yb290LCBtaW5vcl9yb290KTsKIAogCS8qIENvcHkgdGhlIHNldHVwIGNvZGUgKi8KIAlmaWxlID0gZm9wZW4oYXJndlsxXSwgInIiKTsKQEAgLTE5Myw4ICsxNjgsOCBAQAogCW1lbXNldChidWYrYywgMCwgaS1jKTsKIAogCS8qIFNldCB0aGUgZGVmYXVsdCByb290IGRldmljZSAqLwotCWJ1Zls1MDhdID0gbWlub3Jfcm9vdDsKLQlidWZbNTA5XSA9IG1ham9yX3Jvb3Q7CisJYnVmWzUwOF0gPSBERUZBVUxUX01JTk9SX1JPT1Q7CisJYnVmWzUwOV0gPSBERUZBVUxUX01BSk9SX1JPT1Q7CiAKIAlmcHJpbnRmKHN0ZGVyciwgIlNldHVwIGlzICVkIGJ5dGVzIChwYWRkZWQgdG8gJWQgYnl0ZXMpLlxuIiwgYywgaSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9naGFzaC1jbG11bG5pLWludGVsX2dsdWUuYyBiL2FyY2gveDg2L2NyeXB0by9naGFzaC1jbG11bG5pLWludGVsX2dsdWUuYwppbmRleCA3YTZlNjhlLi45NzZhYTY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vZ2hhc2gtY2xtdWxuaS1pbnRlbF9nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL2doYXNoLWNsbXVsbmktaW50ZWxfZ2x1ZS5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAljcnlwdG9fYWhhc2hfc2V0X2ZsYWdzKHRmbSwgY3J5cHRvX2FoYXNoX2dldF9mbGFncyhjaGlsZCkKIAkJCSAgICAgICAmIENSWVBUT19URk1fUkVTX01BU0spOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBnaGFzaF9hc3luY19pbml0X3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaWEzMi9pYTMyX3NpZ25hbC5jIGIvYXJjaC94ODYvaWEzMi9pYTMyX3NpZ25hbC5jCmluZGV4IDU4OGE3YWEuLjY1NTc3NjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2lhMzIvaWEzMl9zaWduYWwuYworKysgYi9hcmNoL3g4Ni9pYTMyL2lhMzJfc2lnbmFsLmMKQEAgLTEyNywxNSArMTI3LDE3IEBACiAKIGFzbWxpbmthZ2UgbG9uZyBzeXMzMl9zaWdzdXNwZW5kKGludCBoaXN0b3J5MCwgaW50IGhpc3RvcnkxLCBvbGRfc2lnc2V0X3QgbWFzaykKIHsKLQltYXNrICY9IF9CTE9DS0FCTEU7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2lnc2V0X3QgYmxvY2tlZDsKKwogCWN1cnJlbnQtPnNhdmVkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOwotCXNpZ2luaXRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIG1hc2spOwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCW1hc2sgJj0gX0JMT0NLQUJMRTsKKwlzaWdpbml0c2V0KCZibG9ja2VkLCBtYXNrKTsKKwlzZXRfY3VycmVudF9ibG9ja2VkKCZibG9ja2VkKTsKIAogCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwogCXNjaGVkdWxlKCk7CisKIAlzZXRfcmVzdG9yZV9zaWdtYXNrKCk7CiAJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KQEAgLTI3OSwxMCArMjgxLDcgQEAKIAkJZ290byBiYWRmcmFtZTsKIAogCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNldF9jdXJyZW50X2Jsb2NrZWQoJnNldCk7CiAKIAlpZiAoaWEzMl9yZXN0b3JlX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT5zYywgJmF4KSkKIAkJZ290byBiYWRmcmFtZTsKQEAgLTMwOCwxMCArMzA3LDcgQEAKIAkJZ290byBiYWRmcmFtZTsKIAogCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNldF9jdXJyZW50X2Jsb2NrZWQoJnNldCk7CiAKIAlpZiAoaWEzMl9yZXN0b3JlX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCwgJmF4KSkKIAkJZ290byBiYWRmcmFtZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMgYi9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TCmluZGV4IGMxODcwZGQuLmEwZTg2NmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKKysrIGIvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJQ0ZJX1JFTF9PRkZTRVQgcmlwLDAKIAlwdXNocV9jZmkgJXJheAogCWNsZAotCVNBVkVfQVJHUyAwLDAsMQorCVNBVkVfQVJHUyAwLDEsMAogIAkvKiBubyBuZWVkIHRvIGRvIGFuIGFjY2Vzc19vayBjaGVjayBoZXJlIGJlY2F1c2UgcmJwIGhhcyBiZWVuCiAgCSAgIDMyYml0IHplcm8gZXh0ZW5kZWQgKi8gCiAxOgltb3ZsCSglcmJwKSwlZWJwCkBAIC0xNzMsNyArMTczLDcgQEAKIAlhbmRsICAkfjB4MjAwLEVGTEFHUy1SMTEoJXJzcCkgCiAJbW92bAlSSVAtUjExKCVyc3ApLCVlZHgJCS8qIFVzZXIgJWVpcCAqLwogCUNGSV9SRUdJU1RFUiByaXAscmR4Ci0JUkVTVE9SRV9BUkdTIDEsMjQsMSwxLDEsMQorCVJFU1RPUkVfQVJHUyAwLDI0LDAsMCwwLDAKIAl4b3JxCSVyOCwlcjgKIAl4b3JxCSVyOSwlcjkKIAl4b3JxCSVyMTAsJXIxMApAQCAtMjg5LDcgKzI4OSw3IEBACiAJICogZGlzYWJsZWQgaXJxcyBhbmQgaGVyZSB3ZSBlbmFibGUgaXQgc3RyYWlnaHQgYWZ0ZXIgZW50cnk6CiAJICovCiAJRU5BQkxFX0lOVEVSUlVQVFMoQ0xCUl9OT05FKQotCVNBVkVfQVJHUyA4LDEsMQorCVNBVkVfQVJHUyA4LDAsMAogCW1vdmwgCSVlYXgsJWVheAkvKiB6ZXJvIGV4dGVuc2lvbiAqLwogCW1vdnEJJXJheCxPUklHX1JBWC1BUkdPRkZTRVQoJXJzcCkKIAltb3ZxCSVyY3gsUklQLUFSR09GRlNFVCglcnNwKQpAQCAtMzI4LDcgKzMyOCw3IEBACiAJam56IHN5c3JldGxfYXVkaXQKIHN5c3JldGxfZnJvbV9zeXNfY2FsbDoKIAlhbmRsICR+VFNfQ09NUEFULFRJX3N0YXR1cyglcjEwKQotCVJFU1RPUkVfQVJHUyAxLC1BUkdfU0tJUCwxLDEsMQorCVJFU1RPUkVfQVJHUyAwLC1BUkdfU0tJUCwwLDAsMAogCW1vdmwgUklQLUFSR09GRlNFVCglcnNwKSwlZWN4CiAJQ0ZJX1JFR0lTVEVSIHJpcCxyY3gKIAltb3ZsIEVGTEFHUy1BUkdPRkZTRVQoJXJzcCksJXIxMWQJCkBAIC00MTksNyArNDE5LDcgQEAKIAljbGQKIAkvKiBub3RlIHRoZSByZWdpc3RlcnMgYXJlIG5vdCB6ZXJvIGV4dGVuZGVkIHRvIHRoZSBzZi4KIAkgICB0aGlzIGNvdWxkIGJlIGEgcHJvYmxlbS4gKi8KLQlTQVZFX0FSR1MgMCwwLDEKKwlTQVZFX0FSR1MgMCwxLDAKIAlHRVRfVEhSRUFEX0lORk8oJXIxMCkKIAlvcmwgICAkVFNfQ09NUEFULFRJX3N0YXR1cyglcjEwKQogCXRlc3RsICRfVElGX1dPUktfU1lTQ0FMTF9FTlRSWSxUSV9mbGFncyglcjEwKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUtYXNtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaAppbmRleCA5NGQ0MjBiLi40NTU0Y2M2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaApAQCAtMTcsOCArMTcsOCBAQAogCiAubWFjcm8gYWx0aW5zdHJ1Y3Rpb25fZW50cnkgb3JpZyBhbHQgZmVhdHVyZSBvcmlnX2xlbiBhbHRfbGVuCiAJLmFsaWduIDgKLQkucXVhZCBcb3JpZwotCS5xdWFkIFxhbHQKKwkubG9uZyBcb3JpZyAtIC4KKwkubG9uZyBcYWx0IC0gLgogCS53b3JkIFxmZWF0dXJlCiAJLmJ5dGUgXG9yaWdfbGVuCiAJLmJ5dGUgXGFsdF9sZW4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oCmluZGV4IGJmNTM1ZjkuLjIzZmI2ZDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaApAQCAtNDMsOCArNDMsOCBAQAogI2VuZGlmCiAKIHN0cnVjdCBhbHRfaW5zdHIgewotCXU4ICppbnN0cjsJCS8qIG9yaWdpbmFsIGluc3RydWN0aW9uICovCi0JdTggKnJlcGxhY2VtZW50OworCXMzMiBpbnN0cl9vZmZzZXQ7CS8qIG9yaWdpbmFsIGluc3RydWN0aW9uICovCisJczMyIHJlcGxfb2Zmc2V0OwkvKiBvZmZzZXQgdG8gcmVwbGFjZW1lbnQgaW5zdHJ1Y3Rpb24gKi8KIAl1MTYgY3B1aWQ7CQkvKiBjcHVpZCBiaXQgc2V0IGZvciByZXBsYWNlbWVudCAqLwogCXU4ICBpbnN0cmxlbjsJCS8qIGxlbmd0aCBvZiBvcmlnaW5hbCBpbnN0cnVjdGlvbiAqLwogCXU4ICByZXBsYWNlbWVudGxlbjsJLyogbGVuZ3RoIG9mIG5ldyBpbnN0cnVjdGlvbiwgPD0gaW5zdHJsZW4gKi8KQEAgLTg0LDggKzg0LDggQEAKICAgICAgICI2NjE6XG5cdCIgb2xkaW5zdHIgIlxuNjYyOlxuIgkJCQkJXAogICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsXCJhXCJcbiIJCQkJXAogICAgICAgX0FTTV9BTElHTiAiXG4iCQkJCQkJCVwKLSAgICAgIF9BU01fUFRSICI2NjFiXG4iCQkJCS8qIGxhYmVsICAgICAgICAgICAqLwlcCi0gICAgICBfQVNNX1BUUiAiNjYzZlxuIgkJCQkvKiBuZXcgaW5zdHJ1Y3Rpb24gKi8JXAorICAgICAgIgkgLmxvbmcgNjYxYiAtIC5cbiIJCQkvKiBsYWJlbCAgICAgICAgICAgKi8JXAorICAgICAgIgkgLmxvbmcgNjYzZiAtIC5cbiIJCQkvKiBuZXcgaW5zdHJ1Y3Rpb24gKi8JXAogICAgICAgIgkgLndvcmQgIiBfX3N0cmluZ2lmeShmZWF0dXJlKSAiXG4iCS8qIGZlYXR1cmUgYml0ICAgICAqLwlcCiAgICAgICAiCSAuYnl0ZSA2NjJiLTY2MWJcbiIJCQkvKiBzb3VyY2VsZW4gICAgICAgKi8JXAogICAgICAgIgkgLmJ5dGUgNjY0Zi02NjNmXG4iCQkJLyogcmVwbGFjZW1lbnRsZW4gICovCVwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdV9wcm90by5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11X3Byb3RvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDk1ZWIuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11X3Byb3RvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgotICogQXV0aG9yOiBKb2VyZyBSb2VkZWwgPGpvZXJnLnJvZWRlbEBhbWQuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKLSAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQotICovCi0KLSNpZm5kZWYgX0FTTV9YODZfQU1EX0lPTU1VX1BST1RPX0gKLSNkZWZpbmUgX0FTTV9YODZfQU1EX0lPTU1VX1BST1RPX0gKLQotI2luY2x1ZGUgPGFzbS9hbWRfaW9tbXVfdHlwZXMuaD4KLQotZXh0ZXJuIGludCBhbWRfaW9tbXVfaW5pdF9kbWFfb3BzKHZvaWQpOwotZXh0ZXJuIGludCBhbWRfaW9tbXVfaW5pdF9wYXNzdGhyb3VnaCh2b2lkKTsKLWV4dGVybiBpcnFyZXR1cm5fdCBhbWRfaW9tbXVfaW50X3RocmVhZChpbnQgaXJxLCB2b2lkICpkYXRhKTsKLWV4dGVybiBpcnFyZXR1cm5fdCBhbWRfaW9tbXVfaW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSk7Ci1leHRlcm4gdm9pZCBhbWRfaW9tbXVfYXBwbHlfZXJyYXR1bV82Myh1MTYgZGV2aWQpOwotZXh0ZXJuIHZvaWQgYW1kX2lvbW11X3Jlc2V0X2NtZF9idWZmZXIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpOwotZXh0ZXJuIGludCBhbWRfaW9tbXVfaW5pdF9kZXZpY2VzKHZvaWQpOwotZXh0ZXJuIHZvaWQgYW1kX2lvbW11X3VuaW5pdF9kZXZpY2VzKHZvaWQpOwotZXh0ZXJuIHZvaWQgYW1kX2lvbW11X2luaXRfbm90aWZpZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBhbWRfaW9tbXVfaW5pdF9hcGkodm9pZCk7Ci0jaWZuZGVmIENPTkZJR19BTURfSU9NTVVfU1RBVFMKLQotc3RhdGljIGlubGluZSB2b2lkIGFtZF9pb21tdV9zdGF0c19pbml0KHZvaWQpIHsgfQotCi0jZW5kaWYgLyogIUNPTkZJR19BTURfSU9NTVVfU1RBVFMgKi8KLQotc3RhdGljIGlubGluZSBib29sIGlzX3JkODkwX2lvbW11KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXJldHVybiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVRJKSAmJgotCSAgICAgICAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUkQ4OTBfSU9NTVUpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaW9tbXVfZmVhdHVyZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTY0IGYpCi17Ci0JaWYgKCEoaW9tbXUtPmNhcCAmICgxIDw8IElPTU1VX0NBUF9FRlIpKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuICEhKGlvbW11LT5mZWF0dXJlcyAmIGYpOwotfQotCi0jZW5kaWYgLyogX0FTTV9YODZfQU1EX0lPTU1VX1BST1RPX0ggICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfaW9tbXVfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdV90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5ODI5Li4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdV90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCi0gKiBBdXRob3I6IEpvZXJnIFJvZWRlbCA8am9lcmcucm9lZGVsQGFtZC5jb20+Ci0gKiAgICAgICAgIExlbyBEdXJhbiA8bGVvLmR1cmFuQGFtZC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAotICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotI2lmbmRlZiBfQVNNX1g4Nl9BTURfSU9NTVVfVFlQRVNfSAotI2RlZmluZSBfQVNNX1g4Nl9BTURfSU9NTVVfVFlQRVNfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCi0vKgotICogTWF4aW11bSBudW1iZXIgb2YgSU9NTVVzIHN1cHBvcnRlZAotICovCi0jZGVmaW5lIE1BWF9JT01NVVMJMzIKLQotLyoKLSAqIHNvbWUgc2l6ZSBjYWxjdWxhdGlvbiBjb25zdGFudHMKLSAqLwotI2RlZmluZSBERVZfVEFCTEVfRU5UUllfU0laRQkJMzIKLSNkZWZpbmUgQUxJQVNfVEFCTEVfRU5UUllfU0laRQkJMgotI2RlZmluZSBSTE9PS1VQX1RBQkxFX0VOVFJZX1NJWkUJKHNpemVvZih2b2lkICopKQotCi0vKiBMZW5ndGggb2YgdGhlIE1NSU8gcmVnaW9uIGZvciB0aGUgQU1EIElPTU1VICovCi0jZGVmaW5lIE1NSU9fUkVHSU9OX0xFTkdUSCAgICAgICAweDQwMDAKLQotLyogQ2FwYWJpbGl0eSBvZmZzZXRzIHVzZWQgYnkgdGhlIGRyaXZlciAqLwotI2RlZmluZSBNTUlPX0NBUF9IRFJfT0ZGU0VUCTB4MDAKLSNkZWZpbmUgTU1JT19SQU5HRV9PRkZTRVQJMHgwYwotI2RlZmluZSBNTUlPX01JU0NfT0ZGU0VUCTB4MTAKLQotLyogTWFza3MsIHNoaWZ0cyBhbmQgbWFjcm9zIHRvIHBhcnNlIHRoZSBkZXZpY2UgcmFuZ2UgY2FwYWJpbGl0eSAqLwotI2RlZmluZSBNTUlPX1JBTkdFX0xEX01BU0sJMHhmZjAwMDAwMAotI2RlZmluZSBNTUlPX1JBTkdFX0ZEX01BU0sJMHgwMGZmMDAwMAotI2RlZmluZSBNTUlPX1JBTkdFX0JVU19NQVNLCTB4MDAwMGZmMDAKLSNkZWZpbmUgTU1JT19SQU5HRV9MRF9TSElGVAkyNAotI2RlZmluZSBNTUlPX1JBTkdFX0ZEX1NISUZUCTE2Ci0jZGVmaW5lIE1NSU9fUkFOR0VfQlVTX1NISUZUCTgKLSNkZWZpbmUgTU1JT19HRVRfTEQoeCkgICgoKHgpICYgTU1JT19SQU5HRV9MRF9NQVNLKSA+PiBNTUlPX1JBTkdFX0xEX1NISUZUKQotI2RlZmluZSBNTUlPX0dFVF9GRCh4KSAgKCgoeCkgJiBNTUlPX1JBTkdFX0ZEX01BU0spID4+IE1NSU9fUkFOR0VfRkRfU0hJRlQpCi0jZGVmaW5lIE1NSU9fR0VUX0JVUyh4KSAoKCh4KSAmIE1NSU9fUkFOR0VfQlVTX01BU0spID4+IE1NSU9fUkFOR0VfQlVTX1NISUZUKQotI2RlZmluZSBNTUlPX01TSV9OVU0oeCkJKCh4KSAmIDB4MWYpCi0KLS8qIEZsYWcgbWFza3MgZm9yIHRoZSBBTUQgSU9NTVUgZXhjbHVzaW9uIHJhbmdlICovCi0jZGVmaW5lIE1NSU9fRVhDTF9FTkFCTEVfTUFTSyAweDAxVUxMCi0jZGVmaW5lIE1NSU9fRVhDTF9BTExPV19NQVNLICAweDAyVUxMCi0KLS8qIFVzZWQgb2Zmc2V0cyBpbnRvIHRoZSBNTUlPIHNwYWNlICovCi0jZGVmaW5lIE1NSU9fREVWX1RBQkxFX09GRlNFVCAgIDB4MDAwMAotI2RlZmluZSBNTUlPX0NNRF9CVUZfT0ZGU0VUICAgICAweDAwMDgKLSNkZWZpbmUgTU1JT19FVlRfQlVGX09GRlNFVCAgICAgMHgwMDEwCi0jZGVmaW5lIE1NSU9fQ09OVFJPTF9PRkZTRVQgICAgIDB4MDAxOAotI2RlZmluZSBNTUlPX0VYQ0xfQkFTRV9PRkZTRVQgICAweDAwMjAKLSNkZWZpbmUgTU1JT19FWENMX0xJTUlUX09GRlNFVCAgMHgwMDI4Ci0jZGVmaW5lIE1NSU9fRVhUX0ZFQVRVUkVTCTB4MDAzMAotI2RlZmluZSBNTUlPX0NNRF9IRUFEX09GRlNFVAkweDIwMDAKLSNkZWZpbmUgTU1JT19DTURfVEFJTF9PRkZTRVQJMHgyMDA4Ci0jZGVmaW5lIE1NSU9fRVZUX0hFQURfT0ZGU0VUCTB4MjAxMAotI2RlZmluZSBNTUlPX0VWVF9UQUlMX09GRlNFVAkweDIwMTgKLSNkZWZpbmUgTU1JT19TVEFUVVNfT0ZGU0VUCTB4MjAyMAotCi0KLS8qIEV4dGVuZGVkIEZlYXR1cmUgQml0cyAqLwotI2RlZmluZSBGRUFUVVJFX1BSRUZFVENICSgxVUxMPDwwKQotI2RlZmluZSBGRUFUVVJFX1BQUgkJKDFVTEw8PDEpCi0jZGVmaW5lIEZFQVRVUkVfWDJBUElDCQkoMVVMTDw8MikKLSNkZWZpbmUgRkVBVFVSRV9OWAkJKDFVTEw8PDMpCi0jZGVmaW5lIEZFQVRVUkVfR1QJCSgxVUxMPDw0KQotI2RlZmluZSBGRUFUVVJFX0lBCQkoMVVMTDw8NikKLSNkZWZpbmUgRkVBVFVSRV9HQQkJKDFVTEw8PDcpCi0jZGVmaW5lIEZFQVRVUkVfSEUJCSgxVUxMPDw4KQotI2RlZmluZSBGRUFUVVJFX1BDCQkoMVVMTDw8OSkKLQotLyogTU1JTyBzdGF0dXMgYml0cyAqLwotI2RlZmluZSBNTUlPX1NUQVRVU19DT01fV0FJVF9JTlRfTUFTSwkweDA0Ci0KLS8qIGV2ZW50IGxvZ2dpbmcgY29uc3RhbnRzICovCi0jZGVmaW5lIEVWRU5UX0VOVFJZX1NJWkUJMHgxMAotI2RlZmluZSBFVkVOVF9UWVBFX1NISUZUCTI4Ci0jZGVmaW5lIEVWRU5UX1RZUEVfTUFTSwkJMHhmCi0jZGVmaW5lIEVWRU5UX1RZUEVfSUxMX0RFVgkweDEKLSNkZWZpbmUgRVZFTlRfVFlQRV9JT19GQVVMVAkweDIKLSNkZWZpbmUgRVZFTlRfVFlQRV9ERVZfVEFCX0VSUgkweDMKLSNkZWZpbmUgRVZFTlRfVFlQRV9QQUdFX1RBQl9FUlIJMHg0Ci0jZGVmaW5lIEVWRU5UX1RZUEVfSUxMX0NNRAkweDUKLSNkZWZpbmUgRVZFTlRfVFlQRV9DTURfSEFSRF9FUlIJMHg2Ci0jZGVmaW5lIEVWRU5UX1RZUEVfSU9UTEJfSU5WX1RPCTB4NwotI2RlZmluZSBFVkVOVF9UWVBFX0lOVl9ERVZfUkVRCTB4OAotI2RlZmluZSBFVkVOVF9ERVZJRF9NQVNLCTB4ZmZmZgotI2RlZmluZSBFVkVOVF9ERVZJRF9TSElGVAkwCi0jZGVmaW5lIEVWRU5UX0RPTUlEX01BU0sJMHhmZmZmCi0jZGVmaW5lIEVWRU5UX0RPTUlEX1NISUZUCTAKLSNkZWZpbmUgRVZFTlRfRkxBR1NfTUFTSwkweGZmZgotI2RlZmluZSBFVkVOVF9GTEFHU19TSElGVAkweDEwCi0KLS8qIGZlYXR1cmUgY29udHJvbCBiaXRzICovCi0jZGVmaW5lIENPTlRST0xfSU9NTVVfRU4gICAgICAgIDB4MDBVTEwKLSNkZWZpbmUgQ09OVFJPTF9IVF9UVU5fRU4gICAgICAgMHgwMVVMTAotI2RlZmluZSBDT05UUk9MX0VWVF9MT0dfRU4gICAgICAweDAyVUxMCi0jZGVmaW5lIENPTlRST0xfRVZUX0lOVF9FTiAgICAgIDB4MDNVTEwKLSNkZWZpbmUgQ09OVFJPTF9DT01XQUlUX0VOICAgICAgMHgwNFVMTAotI2RlZmluZSBDT05UUk9MX1BBU1NQV19FTiAgICAgICAweDA4VUxMCi0jZGVmaW5lIENPTlRST0xfUkVTUEFTU1BXX0VOICAgIDB4MDlVTEwKLSNkZWZpbmUgQ09OVFJPTF9DT0hFUkVOVF9FTiAgICAgMHgwYVVMTAotI2RlZmluZSBDT05UUk9MX0lTT0NfRU4gICAgICAgICAweDBiVUxMCi0jZGVmaW5lIENPTlRST0xfQ01EQlVGX0VOICAgICAgIDB4MGNVTEwKLSNkZWZpbmUgQ09OVFJPTF9QUEZMT0dfRU4gICAgICAgMHgwZFVMTAotI2RlZmluZSBDT05UUk9MX1BQRklOVF9FTiAgICAgICAweDBlVUxMCi0KLS8qIGNvbW1hbmQgc3BlY2lmaWMgZGVmaW5lcyAqLwotI2RlZmluZSBDTURfQ09NUExfV0FJVCAgICAgICAgICAweDAxCi0jZGVmaW5lIENNRF9JTlZfREVWX0VOVFJZICAgICAgIDB4MDIKLSNkZWZpbmUgQ01EX0lOVl9JT01NVV9QQUdFUwkweDAzCi0jZGVmaW5lIENNRF9JTlZfSU9UTEJfUEFHRVMJMHgwNAotI2RlZmluZSBDTURfSU5WX0FMTAkJMHgwOAotCi0jZGVmaW5lIENNRF9DT01QTF9XQUlUX1NUT1JFX01BU0sJMHgwMQotI2RlZmluZSBDTURfQ09NUExfV0FJVF9JTlRfTUFTSwkJMHgwMgotI2RlZmluZSBDTURfSU5WX0lPTU1VX1BBR0VTX1NJWkVfTUFTSwkweDAxCi0jZGVmaW5lIENNRF9JTlZfSU9NTVVfUEFHRVNfUERFX01BU0sJMHgwMgotCi0jZGVmaW5lIENNRF9JTlZfSU9NTVVfQUxMX1BBR0VTX0FERFJFU1MJMHg3ZmZmZmZmZmZmZmZmZmZmVUxMCi0KLS8qIG1hY3JvcyBhbmQgZGVmaW5pdGlvbnMgZm9yIGRldmljZSB0YWJsZSBlbnRyaWVzICovCi0jZGVmaW5lIERFVl9FTlRSWV9WQUxJRCAgICAgICAgIDB4MDAKLSNkZWZpbmUgREVWX0VOVFJZX1RSQU5TTEFUSU9OICAgMHgwMQotI2RlZmluZSBERVZfRU5UUllfSVIgICAgICAgICAgICAweDNkCi0jZGVmaW5lIERFVl9FTlRSWV9JVyAgICAgICAgICAgIDB4M2UKLSNkZWZpbmUgREVWX0VOVFJZX05PX1BBR0VfRkFVTFQJMHg2MgotI2RlZmluZSBERVZfRU5UUllfRVggICAgICAgICAgICAweDY3Ci0jZGVmaW5lIERFVl9FTlRSWV9TWVNNR1QxICAgICAgIDB4NjgKLSNkZWZpbmUgREVWX0VOVFJZX1NZU01HVDIgICAgICAgMHg2OQotI2RlZmluZSBERVZfRU5UUllfSU5JVF9QQVNTICAgICAweGI4Ci0jZGVmaW5lIERFVl9FTlRSWV9FSU5UX1BBU1MgICAgIDB4YjkKLSNkZWZpbmUgREVWX0VOVFJZX05NSV9QQVNTICAgICAgMHhiYQotI2RlZmluZSBERVZfRU5UUllfTElOVDBfUEFTUyAgICAweGJlCi0jZGVmaW5lIERFVl9FTlRSWV9MSU5UMV9QQVNTICAgIDB4YmYKLSNkZWZpbmUgREVWX0VOVFJZX01PREVfTUFTSwkweDA3Ci0jZGVmaW5lIERFVl9FTlRSWV9NT0RFX1NISUZUCTB4MDkKLQotLyogY29uc3RhbnRzIHRvIGNvbmZpZ3VyZSB0aGUgY29tbWFuZCBidWZmZXIgKi8KLSNkZWZpbmUgQ01EX0JVRkZFUl9TSVpFICAgIDgxOTIKLSNkZWZpbmUgQ01EX0JVRkZFUl9VTklOSVRJQUxJWkVEIDEKLSNkZWZpbmUgQ01EX0JVRkZFUl9FTlRSSUVTIDUxMgotI2RlZmluZSBNTUlPX0NNRF9TSVpFX1NISUZUIDU2Ci0jZGVmaW5lIE1NSU9fQ01EX1NJWkVfNTEyICgweDlVTEwgPDwgTU1JT19DTURfU0laRV9TSElGVCkKLQotLyogY29uc3RhbnRzIGZvciBldmVudCBidWZmZXIgaGFuZGxpbmcgKi8KLSNkZWZpbmUgRVZUX0JVRkZFUl9TSVpFCQk4MTkyIC8qIDUxMiBlbnRyaWVzICovCi0jZGVmaW5lIEVWVF9MRU5fTUFTSwkJKDB4OVVMTCA8PCA1NikKLQotI2RlZmluZSBQQUdFX01PREVfTk9ORSAgICAweDAwCi0jZGVmaW5lIFBBR0VfTU9ERV8xX0xFVkVMIDB4MDEKLSNkZWZpbmUgUEFHRV9NT0RFXzJfTEVWRUwgMHgwMgotI2RlZmluZSBQQUdFX01PREVfM19MRVZFTCAweDAzCi0jZGVmaW5lIFBBR0VfTU9ERV80X0xFVkVMIDB4MDQKLSNkZWZpbmUgUEFHRV9NT0RFXzVfTEVWRUwgMHgwNQotI2RlZmluZSBQQUdFX01PREVfNl9MRVZFTCAweDA2Ci0KLSNkZWZpbmUgUE1fTEVWRUxfU0hJRlQoeCkJKDEyICsgKCh4KSAqIDkpKQotI2RlZmluZSBQTV9MRVZFTF9TSVpFKHgpCSgoKHgpIDwgNikgPyBcCi0JCQkJICAoKDFVTEwgPDwgUE1fTEVWRUxfU0hJRlQoKHgpKSkgLSAxKTogXAotCQkJCSAgICgweGZmZmZmZmZmZmZmZmZmZmZVTEwpKQotI2RlZmluZSBQTV9MRVZFTF9JTkRFWCh4LCBhKQkoKChhKSA+PiBQTV9MRVZFTF9TSElGVCgoeCkpKSAmIDB4MWZmVUxMKQotI2RlZmluZSBQTV9MRVZFTF9FTkMoeCkJCSgoKHgpIDw8IDkpICYgMHhlMDBVTEwpCi0jZGVmaW5lIFBNX0xFVkVMX1BERSh4LCBhKQkoKGEpIHwgUE1fTEVWRUxfRU5DKCh4KSkgfCBcCi0JCQkJIElPTU1VX1BURV9QIHwgSU9NTVVfUFRFX0lSIHwgSU9NTVVfUFRFX0lXKQotI2RlZmluZSBQTV9QVEVfTEVWRUwocHRlKQkoKChwdGUpID4+IDkpICYgMHg3VUxMKQotCi0jZGVmaW5lIFBNX01BUF80awkJMAotI2RlZmluZSBQTV9BRERSX01BU0sJCTB4MDAwZmZmZmZmZmZmZjAwMFVMTAotI2RlZmluZSBQTV9NQVBfTUFTSyhsdmwpCShQTV9BRERSX01BU0sgJiBcCi0JCQkJKH4oKDFVTEwgPDwgKDEyICsgKChsdmwpICogOSkpKSAtIDEpKSkKLSNkZWZpbmUgUE1fQUxJR05FRChsdmwsIGFkZHIpCSgoUE1fTUFQX01BU0sobHZsKSAmIChhZGRyKSkgPT0gKGFkZHIpKQotCi0vKgotICogUmV0dXJucyB0aGUgcGFnZSB0YWJsZSBsZXZlbCB0byB1c2UgZm9yIGEgZ2l2ZW4gcGFnZSBzaXplCi0gKiBQYWdlc2l6ZSBpcyBleHBlY3RlZCB0byBiZSBhIHBvd2VyLW9mLXR3bwotICovCi0jZGVmaW5lIFBBR0VfU0laRV9MRVZFTChwYWdlc2l6ZSkgXAotCQkoKF9fZmZzKHBhZ2VzaXplKSAtIDEyKSAvIDkpCi0vKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHB0ZXMgdG8gdXNlIGZvciBhIGdpdmVuIHBhZ2Ugc2l6ZQotICogUGFnZXNpemUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBwb3dlci1vZi10d28KLSAqLwotI2RlZmluZSBQQUdFX1NJWkVfUFRFX0NPVU5UKHBhZ2VzaXplKSBcCi0JCSgxVUxMIDw8ICgoX19mZnMocGFnZXNpemUpIC0gMTIpICUgOSkpCi0KLS8qCi0gKiBBbGlnbnMgYSBnaXZlbiBpby12aXJ0dWFsIGFkZHJlc3MgdG8gYSBnaXZlbiBwYWdlIHNpemUKLSAqIFBhZ2VzaXplIGlzIGV4cGVjdGVkIHRvIGJlIGEgcG93ZXItb2YtdHdvCi0gKi8KLSNkZWZpbmUgUEFHRV9TSVpFX0FMSUdOKGFkZHJlc3MsIHBhZ2VzaXplKSBcCi0JCSgoYWRkcmVzcykgJiB+KChwYWdlc2l6ZSkgLSAxKSkKLS8qCi0gKiBDcmVhdGVzIGFuIElPTU1VIFBURSBmb3IgYW4gYWRkcmVzcyBhbiBhIGdpdmVuIHBhZ2VzaXplCi0gKiBUaGUgUFRFIGhhcyBubyBwZXJtaXNzaW9uIGJpdHMgc2V0Ci0gKiBQYWdlc2l6ZSBpcyBleHBlY3RlZCB0byBiZSBhIHBvd2VyLW9mLXR3byBsYXJnZXIgdGhhbiA0MDk2Ci0gKi8KLSNkZWZpbmUgUEFHRV9TSVpFX1BURShhZGRyZXNzLCBwYWdlc2l6ZSkJCVwKLQkJKCgoYWRkcmVzcykgfCAoKHBhZ2VzaXplKSAtIDEpKSAmCVwKLQkJICh+KHBhZ2VzaXplID4+IDEpKSAmIFBNX0FERFJfTUFTSykKLQotLyoKLSAqIFRha2VzIGEgUFRFIHZhbHVlIHdpdGggbW9kZT0weDA3IGFuZCByZXR1cm5zIHRoZSBwYWdlIHNpemUgaXQgbWFwcwotICovCi0jZGVmaW5lIFBURV9QQUdFX1NJWkUocHRlKSBcCi0JKDFVTEwgPDwgKDEgKyBmZnooKChwdGUpIHwgMHhmZmZVTEwpKSkpCi0KLSNkZWZpbmUgSU9NTVVfUFRFX1AgICgxVUxMIDw8IDApCi0jZGVmaW5lIElPTU1VX1BURV9UViAoMVVMTCA8PCAxKQotI2RlZmluZSBJT01NVV9QVEVfVSAgKDFVTEwgPDwgNTkpCi0jZGVmaW5lIElPTU1VX1BURV9GQyAoMVVMTCA8PCA2MCkKLSNkZWZpbmUgSU9NTVVfUFRFX0lSICgxVUxMIDw8IDYxKQotI2RlZmluZSBJT01NVV9QVEVfSVcgKDFVTEwgPDwgNjIpCi0KLSNkZWZpbmUgRFRFX0ZMQUdfSU9UTEIJMHgwMQotCi0jZGVmaW5lIElPTU1VX1BBR0VfTUFTSyAoKCgxVUxMIDw8IDUyKSAtIDEpICYgfjB4ZmZmVUxMKQotI2RlZmluZSBJT01NVV9QVEVfUFJFU0VOVChwdGUpICgocHRlKSAmIElPTU1VX1BURV9QKQotI2RlZmluZSBJT01NVV9QVEVfUEFHRShwdGUpIChwaHlzX3RvX3ZpcnQoKHB0ZSkgJiBJT01NVV9QQUdFX01BU0spKQotI2RlZmluZSBJT01NVV9QVEVfTU9ERShwdGUpICgoKHB0ZSkgPj4gOSkgJiAweDA3KQotCi0jZGVmaW5lIElPTU1VX1BST1RfTUFTSyAweDAzCi0jZGVmaW5lIElPTU1VX1BST1RfSVIgMHgwMQotI2RlZmluZSBJT01NVV9QUk9UX0lXIDB4MDIKLQotLyogSU9NTVUgY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIElPTU1VX0NBUF9JT1RMQiAgIDI0Ci0jZGVmaW5lIElPTU1VX0NBUF9OUENBQ0hFIDI2Ci0jZGVmaW5lIElPTU1VX0NBUF9FRlIgICAgIDI3Ci0KLSNkZWZpbmUgTUFYX0RPTUFJTl9JRCA2NTUzNgotCi0vKiBGSVhNRTogbW92ZSB0aGlzIG1hY3JvIHRvIDxsaW51eC9wY2kuaD4gKi8KLSNkZWZpbmUgUENJX0JVUyh4KSAoKCh4KSA+PiA4KSAmIDB4ZmYpCi0KLS8qIFByb3RlY3Rpb24gZG9tYWluIGZsYWdzICovCi0jZGVmaW5lIFBEX0RNQV9PUFNfTUFTSwkJKDFVTCA8PCAwKSAvKiBkb21haW4gdXNlZCBmb3IgZG1hX29wcyAqLwotI2RlZmluZSBQRF9ERUZBVUxUX01BU0sJCSgxVUwgPDwgMSkgLyogZG9tYWluIGlzIGEgZGVmYXVsdCBkbWFfb3BzCi0JCQkJCSAgICAgIGRvbWFpbiBmb3IgYW4gSU9NTVUgKi8KLSNkZWZpbmUgUERfUEFTU1RIUk9VR0hfTUFTSwkoMVVMIDw8IDIpIC8qIGRvbWFpbiBoYXMgbm8gcGFnZQotCQkJCQkgICAgICB0cmFuc2xhdGlvbiAqLwotCi1leHRlcm4gYm9vbCBhbWRfaW9tbXVfZHVtcDsKLSNkZWZpbmUgRFVNUF9wcmludGsoZm9ybWF0LCBhcmcuLi4pCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoYW1kX2lvbW11X2R1bXApCQkJCQkJXAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiQU1ELVZpOiAiIGZvcm1hdCwgIyMgYXJnKTsJXAotCX0gd2hpbGUoMCk7Ci0KLS8qIGdsb2JhbCBmbGFnIGlmIElPTU1VcyBjYWNoZSBub24tcHJlc2VudCBlbnRyaWVzICovCi1leHRlcm4gYm9vbCBhbWRfaW9tbXVfbnBfY2FjaGU7Ci0vKiBPbmx5IHRydWUgaWYgYWxsIElPTU1VcyBzdXBwb3J0IGRldmljZSBJT1RMQnMgKi8KLWV4dGVybiBib29sIGFtZF9pb21tdV9pb3RsYl9zdXA7Ci0KLS8qCi0gKiBNYWtlIGl0ZXJhdGluZyBvdmVyIGFsbCBJT01NVXMgZWFzaWVyCi0gKi8KLSNkZWZpbmUgZm9yX2VhY2hfaW9tbXUoaW9tbXUpIFwKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KChpb21tdSksICZhbWRfaW9tbXVfbGlzdCwgbGlzdCkKLSNkZWZpbmUgZm9yX2VhY2hfaW9tbXVfc2FmZShpb21tdSwgbmV4dCkgXAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSgoaW9tbXUpLCAobmV4dCksICZhbWRfaW9tbXVfbGlzdCwgbGlzdCkKLQotI2RlZmluZSBBUEVSVFVSRV9SQU5HRV9TSElGVAkyNwkvKiAxMjggTUIgKi8KLSNkZWZpbmUgQVBFUlRVUkVfUkFOR0VfU0laRQkoMVVMTCA8PCBBUEVSVFVSRV9SQU5HRV9TSElGVCkKLSNkZWZpbmUgQVBFUlRVUkVfUkFOR0VfUEFHRVMJKEFQRVJUVVJFX1JBTkdFX1NJWkUgPj4gUEFHRV9TSElGVCkKLSNkZWZpbmUgQVBFUlRVUkVfTUFYX1JBTkdFUwkzMgkvKiBhbGxvd3MgNEdCIG9mIERNQSBhZGRyZXNzIHNwYWNlICovCi0jZGVmaW5lIEFQRVJUVVJFX1JBTkdFX0lOREVYKGEpCSgoYSkgPj4gQVBFUlRVUkVfUkFOR0VfU0hJRlQpCi0jZGVmaW5lIEFQRVJUVVJFX1BBR0VfSU5ERVgoYSkJKCgoYSkgPj4gMjEpICYgMHgzZlVMTCkKLQotLyoKLSAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGdlbmVyaWMgZGF0YSBmb3IgIElPTU1VIHByb3RlY3Rpb24gZG9tYWlucwotICogaW5kZXBlbmRlbnQgb2YgdGhlaXIgdXNlLgotICovCi1zdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgIC8qIGZvciBsaXN0IG9mIGFsbCBwcm90ZWN0aW9uIGRvbWFpbnMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9saXN0OyAvKiBMaXN0IG9mIGFsbCBkZXZpY2VzIGluIHRoaXMgZG9tYWluICovCi0Jc3BpbmxvY2tfdCBsb2NrOwkvKiBtb3N0bHkgdXNlZCB0byBsb2NrIHRoZSBwYWdlIHRhYmxlKi8KLQlzdHJ1Y3QgbXV0ZXggYXBpX2xvY2s7CS8qIHByb3RlY3QgcGFnZSB0YWJsZXMgaW4gdGhlIGlvbW11LWFwaSBwYXRoICovCi0JdTE2IGlkOwkJCS8qIHRoZSBkb21haW4gaWQgd3JpdHRlbiB0byB0aGUgZGV2aWNlIHRhYmxlICovCi0JaW50IG1vZGU7CQkvKiBwYWdpbmcgbW9kZSAoMC02IGxldmVscykgKi8KLQl1NjQgKnB0X3Jvb3Q7CQkvKiBwYWdlIHRhYmxlIHJvb3QgcG9pbnRlciAqLwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIGZsYWdzIHRvIGZpbmQgb3V0IHR5cGUgb2YgZG9tYWluICovCi0JYm9vbCB1cGRhdGVkOwkJLyogY29tcGxldGUgZG9tYWluIGZsdXNoIHJlcXVpcmVkICovCi0JdW5zaWduZWQgZGV2X2NudDsJLyogZGV2aWNlcyBhc3NpZ25lZCB0byB0aGlzIGRvbWFpbiAqLwotCXVuc2lnbmVkIGRldl9pb21tdVtNQVhfSU9NTVVTXTsgLyogcGVyLUlPTU1VIHJlZmVyZW5jZSBjb3VudCAqLwotCXZvaWQgKnByaXY7CQkvKiBwcml2YXRlIGRhdGEgKi8KLQotfTsKLQotLyoKLSAqIFRoaXMgc3RydWN0IGNvbnRhaW5zIGRldmljZSBzcGVjaWZpYyBkYXRhIGZvciB0aGUgSU9NTVUKLSAqLwotc3RydWN0IGlvbW11X2Rldl9kYXRhIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkgIC8qIEZvciBkb21haW4tPmRldl9saXN0ICovCi0Jc3RydWN0IGRldmljZSAqZGV2OwkJICAvKiBEZXZpY2UgdGhpcyBkYXRhIGJlbG9uZyB0byAqLwotCXN0cnVjdCBkZXZpY2UgKmFsaWFzOwkJICAvKiBUaGUgQWxpYXMgRGV2aWNlICovCi0Jc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW47IC8qIERvbWFpbiB0aGUgZGV2aWNlIGlzIGJvdW5kIHRvICovCi0JYXRvbWljX3QgYmluZDsJCQkgIC8qIERvbWFpbiBhdHRhY2ggcmV2ZXJlbnQgY291bnQgKi8KLX07Ci0KLS8qCi0gKiBGb3IgZHluYW1pYyBncm93dGggdGhlIGFwZXJ0dXJlIHNpemUgaXMgc3BsaXQgaW50byByYW5nZXMgb2YgMTI4TUIgb2YKLSAqIERNQSBhZGRyZXNzIHNwYWNlIGVhY2guIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgb25lIHN1Y2ggcmFuZ2UuCi0gKi8KLXN0cnVjdCBhcGVydHVyZV9yYW5nZSB7Ci0KLQkvKiBhZGRyZXNzIGFsbG9jYXRpb24gYml0bWFwICovCi0JdW5zaWduZWQgbG9uZyAqYml0bWFwOwotCi0JLyoKLQkgKiBBcnJheSBvZiBQVEUgcGFnZXMgZm9yIHRoZSBhcGVydHVyZS4gSW4gdGhpcyBhcnJheSB3ZSBzYXZlIGFsbCB0aGUKLQkgKiBsZWFmIHBhZ2VzIG9mIHRoZSBkb21haW4gcGFnZSB0YWJsZSB1c2VkIGZvciB0aGUgYXBlcnR1cmUuIFRoaXMgd2F5Ci0JICogd2UgZG9uJ3QgbmVlZCB0byB3YWxrIHRoZSBwYWdlIHRhYmxlIHRvIGZpbmQgYSBzcGVjaWZpYyBQVEUuIFdlIGNhbgotCSAqIGp1c3QgY2FsY3VsYXRlIGl0cyBhZGRyZXNzIGluIGNvbnN0YW50IHRpbWUuCi0JICovCi0JdTY0ICpwdGVfcGFnZXNbNjRdOwotCi0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci19OwotCi0vKgotICogRGF0YSBjb250YWluZXIgZm9yIGEgZG1hX29wcyBzcGVjaWZpYyBwcm90ZWN0aW9uIGRvbWFpbgotICovCi1zdHJ1Y3QgZG1hX29wc19kb21haW4gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCS8qIGdlbmVyaWMgcHJvdGVjdGlvbiBkb21haW4gaW5mb3JtYXRpb24gKi8KLQlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gZG9tYWluOwotCi0JLyogc2l6ZSBvZiB0aGUgYXBlcnR1cmUgZm9yIHRoZSBtYXBwaW5ncyAqLwotCXVuc2lnbmVkIGxvbmcgYXBlcnR1cmVfc2l6ZTsKLQotCS8qIGFkZHJlc3Mgd2Ugc3RhcnQgdG8gc2VhcmNoIGZvciBmcmVlIGFkZHJlc3NlcyAqLwotCXVuc2lnbmVkIGxvbmcgbmV4dF9hZGRyZXNzOwotCi0JLyogYWRkcmVzcyBzcGFjZSByZWxldmFudCBkYXRhICovCi0Jc3RydWN0IGFwZXJ0dXJlX3JhbmdlICphcGVydHVyZVtBUEVSVFVSRV9NQVhfUkFOR0VTXTsKLQotCS8qIFRoaXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIFRMQiBuZWVkcyB0byBiZSBmbHVzaGVkICovCi0JYm9vbCBuZWVkX2ZsdXNoOwotCi0JLyoKLQkgKiBpZiB0aGlzIGlzIGEgcHJlYWxsb2NhdGVkIGRvbWFpbiwga2VlcCB0aGUgZGV2aWNlIGZvciB3aGljaCBpdCB3YXMKLQkgKiBwcmVhbGxvY2F0ZWQgaW4gdGhpcyB2YXJpYWJsZQotCSAqLwotCXUxNiB0YXJnZXRfZGV2OwotfTsKLQotLyoKLSAqIFN0cnVjdHVyZSB3aGVyZSB3ZSBzYXZlIGluZm9ybWF0aW9uIGFib3V0IG9uZSBoYXJkd2FyZSBBTUQgSU9NTVUgaW4gdGhlCi0gKiBzeXN0ZW0uCi0gKi8KLXN0cnVjdCBhbWRfaW9tbXUgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCS8qIEluZGV4IHdpdGhpbiB0aGUgSU9NTVUgYXJyYXkgKi8KLQlpbnQgaW5kZXg7Ci0KLQkvKiBsb2NrcyB0aGUgYWNjZXNzZXMgdG8gdGhlIGhhcmR3YXJlICovCi0Jc3BpbmxvY2tfdCBsb2NrOwotCi0JLyogUG9pbnRlciB0byBQQ0kgZGV2aWNlIG9mIHRoaXMgSU9NTVUgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCi0JLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBNTUlPIHNwYWNlICovCi0JdTY0IG1taW9fcGh5czsKLQkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgTU1JTyBzcGFjZSAqLwotCXU4ICptbWlvX2Jhc2U7Ci0KLQkvKiBjYXBhYmlsaXRpZXMgb2YgdGhhdCBJT01NVSByZWFkIGZyb20gQUNQSSAqLwotCXUzMiBjYXA7Ci0KLQkvKiBmbGFncyByZWFkIGZyb20gYWNwaSB0YWJsZSAqLwotCXU4IGFjcGlfZmxhZ3M7Ci0KLQkvKiBFeHRlbmRlZCBmZWF0dXJlcyAqLwotCXU2NCBmZWF0dXJlczsKLQotCS8qCi0JICogQ2FwYWJpbGl0eSBwb2ludGVyLiBUaGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIElPTU1VIHBlciBQQ0kKLQkgKiBkZXZpY2UgZnVuY3Rpb24gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgQU1EIElPTU1VIGNhcGFiaWxpdHkKLQkgKiBwb2ludGVycy4KLQkgKi8KLQl1MTYgY2FwX3B0cjsKLQotCS8qIHBjaSBkb21haW4gb2YgdGhpcyBJT01NVSAqLwotCXUxNiBwY2lfc2VnOwotCi0JLyogZmlyc3QgZGV2aWNlIHRoaXMgSU9NTVUgaGFuZGxlcy4gcmVhZCBmcm9tIFBDSSAqLwotCXUxNiBmaXJzdF9kZXZpY2U7Ci0JLyogbGFzdCBkZXZpY2UgdGhpcyBJT01NVSBoYW5kbGVzLiByZWFkIGZyb20gUENJICovCi0JdTE2IGxhc3RfZGV2aWNlOwotCi0JLyogc3RhcnQgb2YgZXhjbHVzaW9uIHJhbmdlIG9mIHRoYXQgSU9NTVUgKi8KLQl1NjQgZXhjbHVzaW9uX3N0YXJ0OwotCS8qIGxlbmd0aCBvZiBleGNsdXNpb24gcmFuZ2Ugb2YgdGhhdCBJT01NVSAqLwotCXU2NCBleGNsdXNpb25fbGVuZ3RoOwotCi0JLyogY29tbWFuZCBidWZmZXIgdmlydHVhbCBhZGRyZXNzICovCi0JdTggKmNtZF9idWY7Ci0JLyogc2l6ZSBvZiBjb21tYW5kIGJ1ZmZlciAqLwotCXUzMiBjbWRfYnVmX3NpemU7Ci0KLQkvKiBzaXplIG9mIGV2ZW50IGJ1ZmZlciAqLwotCXUzMiBldnRfYnVmX3NpemU7Ci0JLyogZXZlbnQgYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyAqLwotCXU4ICpldnRfYnVmOwotCS8qIE1TSSBudW1iZXIgZm9yIGV2ZW50IGludGVycnVwdCAqLwotCXUxNiBldnRfbXNpX251bTsKLQotCS8qIHRydWUgaWYgaW50ZXJydXB0cyBmb3IgdGhpcyBJT01NVSBhcmUgYWxyZWFkeSBlbmFibGVkICovCi0JYm9vbCBpbnRfZW5hYmxlZDsKLQotCS8qIGlmIG9uZSwgd2UgbmVlZCB0byBzZW5kIGEgY29tcGxldGlvbiB3YWl0IGNvbW1hbmQgKi8KLQlib29sIG5lZWRfc3luYzsKLQotCS8qIGRlZmF1bHQgZG1hX29wcyBkb21haW4gZm9yIHRoYXQgSU9NTVUgKi8KLQlzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRlZmF1bHRfZG9tOwotCi0JLyoKLQkgKiBXZSBjYW4ndCByZWx5IG9uIHRoZSBCSU9TIHRvIHJlc3RvcmUgYWxsIHZhbHVlcyBvbiByZWluaXQsIHNvIHdlCi0JICogbmVlZCB0byBzdGFzaCB0aGVtCi0JICovCi0KLQkvKiBUaGUgaW9tbXUgQkFSICovCi0JdTMyIHN0b3JlZF9hZGRyX2xvOwotCXUzMiBzdG9yZWRfYWRkcl9oaTsKLQotCS8qCi0JICogRWFjaCBpb21tdSBoYXMgNiBsMXMsIGVhY2ggb2Ygd2hpY2ggaXMgZG9jdW1lbnRlZCBhcyBoYXZpbmcgMHgxMgotCSAqIHJlZ2lzdGVycwotCSAqLwotCXUzMiBzdG9yZWRfbDFbNl1bMHgxMl07Ci0KLQkvKiBUaGUgbDIgaW5kaXJlY3QgcmVnaXN0ZXJzICovCi0JdTMyIHN0b3JlZF9sMlsweDgzXTsKLX07Ci0KLS8qCi0gKiBMaXN0IHdpdGggYWxsIElPTU1VcyBpbiB0aGUgc3lzdGVtLiBUaGlzIGxpc3QgaXMgbm90IGxvY2tlZCBiZWNhdXNlIGl0IGlzCi0gKiBvbmx5IHdyaXR0ZW4gYW5kIHJlYWQgYXQgZHJpdmVyIGluaXRpYWxpemF0aW9uIG9yIHN1c3BlbmQgdGltZQotICovCi1leHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhbWRfaW9tbXVfbGlzdDsKLQotLyoKLSAqIEFycmF5IHdpdGggcG9pbnRlcnMgdG8gZWFjaCBJT01NVSBzdHJ1Y3QKLSAqIFRoZSBpbmRpY2VzIGFyZSByZWZlcmVuY2VkIGluIHRoZSBwcm90ZWN0aW9uIGRvbWFpbnMKLSAqLwotZXh0ZXJuIHN0cnVjdCBhbWRfaW9tbXUgKmFtZF9pb21tdXNbTUFYX0lPTU1VU107Ci0KLS8qIE51bWJlciBvZiBJT01NVXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtICovCi1leHRlcm4gaW50IGFtZF9pb21tdXNfcHJlc2VudDsKLQotLyoKLSAqIERlY2xhcmF0aW9ucyBmb3IgdGhlIGdsb2JhbCBsaXN0IG9mIGFsbCBwcm90ZWN0aW9uIGRvbWFpbnMKLSAqLwotZXh0ZXJuIHNwaW5sb2NrX3QgYW1kX2lvbW11X3BkX2xvY2s7Ci1leHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhbWRfaW9tbXVfcGRfbGlzdDsKLQotLyoKLSAqIFN0cnVjdHVyZSBkZWZpbmluZyBvbmUgZW50cnkgaW4gdGhlIGRldmljZSB0YWJsZQotICovCi1zdHJ1Y3QgZGV2X3RhYmxlX2VudHJ5IHsKLQl1MzIgZGF0YVs4XTsKLX07Ci0KLS8qCi0gKiBPbmUgZW50cnkgZm9yIHVuaXR5IG1hcHBpbmdzIHBhcnNlZCBvdXQgb2YgdGhlIEFDUEkgdGFibGUuCi0gKi8KLXN0cnVjdCB1bml0eV9tYXBfZW50cnkgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCS8qIHN0YXJ0aW5nIGRldmljZSBpZCB0aGlzIGVudHJ5IGlzIHVzZWQgZm9yIChpbmNsdWRpbmcpICovCi0JdTE2IGRldmlkX3N0YXJ0OwotCS8qIGVuZCBkZXZpY2UgaWQgdGhpcyBlbnRyeSBpcyB1c2VkIGZvciAoaW5jbHVkaW5nKSAqLwotCXUxNiBkZXZpZF9lbmQ7Ci0KLQkvKiBzdGFydCBhZGRyZXNzIHRvIHVuaXR5IG1hcCAoaW5jbHVkaW5nKSAqLwotCXU2NCBhZGRyZXNzX3N0YXJ0OwotCS8qIGVuZCBhZGRyZXNzIHRvIHVuaXR5IG1hcCAoaW5jbHVkaW5nKSAqLwotCXU2NCBhZGRyZXNzX2VuZDsKLQotCS8qIHJlcXVpcmVkIHByb3RlY3Rpb24gKi8KLQlpbnQgcHJvdDsKLX07Ci0KLS8qCi0gKiBMaXN0IG9mIGFsbCB1bml0eSBtYXBwaW5ncy4gSXQgaXMgbm90IGxvY2tlZCBiZWNhdXNlIGFzIHJ1bnRpbWUgaXQgaXMgb25seQotICogcmVhZC4gSXQgaXMgY3JlYXRlZCBhdCBBQ1BJIHRhYmxlIHBhcnNpbmcgdGltZS4KLSAqLwotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYW1kX2lvbW11X3VuaXR5X21hcDsKLQotLyoKLSAqIERhdGEgc3RydWN0dXJlcyBmb3IgZGV2aWNlIGhhbmRsaW5nCi0gKi8KLQotLyoKLSAqIERldmljZSB0YWJsZSB1c2VkIGJ5IGhhcmR3YXJlLiBSZWFkIGFuZCB3cml0ZSBhY2Nlc3NlcyBieSBzb2Z0d2FyZSBhcmUKLSAqIGxvY2tlZCB3aXRoIHRoZSBhbWRfaW9tbXVfcGRfdGFibGUgbG9jay4KLSAqLwotZXh0ZXJuIHN0cnVjdCBkZXZfdGFibGVfZW50cnkgKmFtZF9pb21tdV9kZXZfdGFibGU7Ci0KLS8qCi0gKiBBbGlhcyB0YWJsZSB0byBmaW5kIHJlcXVlc3RvciBpZHMgdG8gZGV2aWNlIGlkcy4gTm90IGxvY2tlZCBiZWNhdXNlIG9ubHkKLSAqIHJlYWQgb24gcnVudGltZS4KLSAqLwotZXh0ZXJuIHUxNiAqYW1kX2lvbW11X2FsaWFzX3RhYmxlOwotCi0vKgotICogUmV2ZXJzZSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgSU9NTVUgd2hpY2ggdHJhbnNsYXRlcyBhIHNwZWNpZmljIGRldmljZS4KLSAqLwotZXh0ZXJuIHN0cnVjdCBhbWRfaW9tbXUgKiphbWRfaW9tbXVfcmxvb2t1cF90YWJsZTsKLQotLyogc2l6ZSBvZiB0aGUgZG1hX29wcyBhcGVydHVyZSBhcyBwb3dlciBvZiAyICovCi1leHRlcm4gdW5zaWduZWQgYW1kX2lvbW11X2FwZXJ0dXJlX29yZGVyOwotCi0vKiBsYXJnZXN0IFBDSSBkZXZpY2UgaWQgd2UgZXhwZWN0IHRyYW5zbGF0aW9uIHJlcXVlc3RzIGZvciAqLwotZXh0ZXJuIHUxNiBhbWRfaW9tbXVfbGFzdF9iZGY7Ci0KLS8qIGFsbG9jYXRpb24gYml0bWFwIGZvciBkb21haW4gaWRzICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyAqYW1kX2lvbW11X3BkX2FsbG9jX2JpdG1hcDsKLQotLyoKLSAqIElmIHRydWUsIHRoZSBhZGRyZXNzZXMgd2lsbCBiZSBmbHVzaGVkIG9uIHVubWFwIHRpbWUsIG5vdCB3aGVuCi0gKiB0aGV5IGFyZSByZXVzZWQKLSAqLwotZXh0ZXJuIGJvb2wgYW1kX2lvbW11X3VubWFwX2ZsdXNoOwotCi0vKiB0YWtlcyBidXMgYW5kIGRldmljZS9mdW5jdGlvbiBhbmQgcmV0dXJucyB0aGUgZGV2aWNlIGlkCi0gKiBGSVhNRTogc2hvdWxkIHRoYXQgYmUgaW4gZ2VuZXJpYyBQQ0kgY29kZT8gKi8KLXN0YXRpYyBpbmxpbmUgdTE2IGNhbGNfZGV2aWQodTggYnVzLCB1OCBkZXZmbikKLXsKLQlyZXR1cm4gKCgodTE2KWJ1cykgPDwgOCkgfCBkZXZmbjsKLX0KLQotI2lmZGVmIENPTkZJR19BTURfSU9NTVVfU1RBVFMKLQotc3RydWN0IF9faW9tbXVfY291bnRlciB7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50OwotCXU2NCB2YWx1ZTsKLX07Ci0KLSNkZWZpbmUgREVDTEFSRV9TVEFUU19DT1VOVEVSKG5tKSBcCi0Jc3RhdGljIHN0cnVjdCBfX2lvbW11X2NvdW50ZXIgbm0gPSB7CVwKLQkJLm5hbWUgPSAjbm0sCQkJXAotCX0KLQotI2RlZmluZSBJTkNfU1RBVFNfQ09VTlRFUihuYW1lKQkJbmFtZS52YWx1ZSArPSAxCi0jZGVmaW5lIEFERF9TVEFUU19DT1VOVEVSKG5hbWUsIHgpCW5hbWUudmFsdWUgKz0gKHgpCi0jZGVmaW5lIFNVQl9TVEFUU19DT1VOVEVSKG5hbWUsIHgpCW5hbWUudmFsdWUgLT0gKHgpCi0KLSNlbHNlIC8qIENPTkZJR19BTURfSU9NTVVfU1RBVFMgKi8KLQotI2RlZmluZSBERUNMQVJFX1NUQVRTX0NPVU5URVIobmFtZSkKLSNkZWZpbmUgSU5DX1NUQVRTX0NPVU5URVIobmFtZSkKLSNkZWZpbmUgQUREX1NUQVRTX0NPVU5URVIobmFtZSwgeCkKLSNkZWZpbmUgU1VCX1NUQVRTX0NPVU5URVIobmFtZSwgeCkKLQotI2VuZGlmIC8qIENPTkZJR19BTURfSU9NTVVfU1RBVFMgKi8KLQotI2VuZGlmIC8qIF9BU01fWDg2X0FNRF9JT01NVV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGJfdGltZXIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwYl90aW1lci5oCmluZGV4IDJmZWZhNTAuLjBhY2JhYzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwYl90aW1lci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwYl90aW1lci5oCkBAIC0xOCwyNCArMTgsNiBAQAogCiAjaWZkZWYgQ09ORklHX0FQQl9USU1FUgogCi0vKiBMYW5nd2VsbCBEVyBBUEIgdGltZXIgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEFQQlRNUl9OX0xPQURfQ09VTlQgICAgMHgwMAotI2RlZmluZSBBUEJUTVJfTl9DVVJSRU5UX1ZBTFVFIDB4MDQKLSNkZWZpbmUgQVBCVE1SX05fQ09OVFJPTCAgICAgICAweDA4Ci0jZGVmaW5lIEFQQlRNUl9OX0VPSSAgICAgICAgICAgMHgwYwotI2RlZmluZSBBUEJUTVJfTl9JTlRfU1RBVFVTICAgIDB4MTAKLQotI2RlZmluZSBBUEJUTVJTX0lOVF9TVEFUVVMgICAgIDB4YTAKLSNkZWZpbmUgQVBCVE1SU19FT0kgICAgICAgICAgICAweGE0Ci0jZGVmaW5lIEFQQlRNUlNfUkFXX0lOVF9TVEFUVVMgMHhhOAotI2RlZmluZSBBUEJUTVJTX0NPTVBfVkVSU0lPTiAgIDB4YWMKLSNkZWZpbmUgQVBCVE1SU19SRUdfU0laRSAgICAgICAweDE0Ci0KLS8qIHJlZ2lzdGVyIGJpdHMgKi8KLSNkZWZpbmUgQVBCVE1SX0NPTlRST0xfRU5BQkxFICAoMTw8MCkKLSNkZWZpbmUgQVBCVE1SX0NPTlRST0xfTU9ERV9QRVJJT0RJQyAgICgxPDwxKSAvKjE6IHBlcmlvZGljIDA6ZnJlZSBydW5uaW5nICovCi0jZGVmaW5lIEFQQlRNUl9DT05UUk9MX0lOVCAgICAgKDE8PDIpCi0KIC8qIGRlZmF1bHQgbWVtb3J5IG1hcHBlZCByZWdpc3RlciBiYXNlICovCiAjZGVmaW5lIExOV19TQ1VfQUREUiAgICAgICAgICAgMHhGRjEwMDAwMAogI2RlZmluZSBMTldfRVhUX1RJTUVSX09GRlNFVCAgIDB4MUI4MDAKQEAgLTQzLDE0ICsyNSwxMyBAQAogI2RlZmluZSBMTldfRVhUX1RJTUVSX1BHT0ZGU0VUICAgICAgICAgMHg4MDAKIAogLyogQVBCVCBjbG9jayBzcGVlZCByYW5nZSBmcm9tIFBDTEsgdG8gZmFicmljIGJhc2UsIDI1LTEwME1IeiAqLwotI2RlZmluZSBBUEJUX01BWF9GUkVRICAgICAgICAgIDUwCi0jZGVmaW5lIEFQQlRfTUlOX0ZSRVEgICAgICAgICAgMQorI2RlZmluZSBBUEJUX01BWF9GUkVRICAgICAgICAgIDUwMDAwMDAwCisjZGVmaW5lIEFQQlRfTUlOX0ZSRVEgICAgICAgICAgMTAwMDAwMAogI2RlZmluZSBBUEJUX01NQVBfU0laRSAgICAgICAgIDEwMjQKIAogI2RlZmluZSBBUEJUX0RFVl9VU0VEICAxCiAKIGV4dGVybiB2b2lkIGFwYnRfdGltZV9pbml0KHZvaWQpOwotZXh0ZXJuIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmdsb2JhbF9jbG9ja19ldmVudDsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGFwYnRfcXVpY2tfY2FsaWJyYXRlKHZvaWQpOwogZXh0ZXJuIGludCBhcmNoX3NldHVwX2FwYnRfaXJxcyhpbnQgaXJxLCBpbnQgdHJpZ2dlciwgaW50IG1hc2ssIGludCBjcHUpOwogZXh0ZXJuIHZvaWQgYXBidF9zZXR1cF9zZWNvbmRhcnlfY2xvY2sodm9pZCk7CkBAIC02Miw3ICs0Myw3IEBACiAjZWxzZSAvKiBDT05GSUdfQVBCX1RJTUVSICovCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhcGJ0X3F1aWNrX2NhbGlicmF0ZSh2b2lkKSB7cmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcGJ0X3RpbWVfaW5pdCh2b2lkKSB7cmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcGJ0X3RpbWVfaW5pdCh2b2lkKSB7IH0KIAogI2VuZGlmCiAjZW5kaWYgLyogQVNNX1g4Nl9BUEJUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FzbS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXNtLmgKaW5kZXggYjNlZDFlMS4uOTQxMmQ2NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXNtLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXNtLmgKQEAgLTMsOSArMywxMSBAQAogCiAjaWZkZWYgX19BU1NFTUJMWV9fCiAjIGRlZmluZSBfX0FTTV9GT1JNKHgpCXgKKyMgZGVmaW5lIF9fQVNNX0ZPUk1fQ09NTUEoeCkgeCwKICMgZGVmaW5lIF9fQVNNX0VYX1NFQwkuc2VjdGlvbiBfX2V4X3RhYmxlLCAiYSIKICNlbHNlCiAjIGRlZmluZSBfX0FTTV9GT1JNKHgpCSIgIiAjeCAiICIKKyMgZGVmaW5lIF9fQVNNX0ZPUk1fQ09NTUEoeCkgIiAiICN4ICIsIgogIyBkZWZpbmUgX19BU01fRVhfU0VDCSIgLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgogI2VuZGlmCiAKQEAgLTE1LDcgKzE3LDggQEAKICMgZGVmaW5lIF9fQVNNX1NFTChhLGIpIF9fQVNNX0ZPUk0oYikKICNlbmRpZgogCi0jZGVmaW5lIF9fQVNNX1NJWkUoaW5zdCkJX19BU01fU0VMKGluc3QjI2wsIGluc3QjI3EpCisjZGVmaW5lIF9fQVNNX1NJWkUoaW5zdCwgLi4uKQlfX0FTTV9TRUwoaW5zdCMjbCMjX19WQV9BUkdTX18sIFwKKwkJCQkJICBpbnN0IyNxIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgX19BU01fUkVHKHJlZykJCV9fQVNNX1NFTChlIyNyZWcsIHIjI3JlZykKIAogI2RlZmluZSBfQVNNX1BUUglfX0FTTV9TRUwoLmxvbmcsIC5xdWFkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY2FsbGluZy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY2FsbGluZy5oCmluZGV4IDMwYWY1YTguLmE5ZTNhNzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NhbGxpbmcuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jYWxsaW5nLmgKQEAgLTQ2LDYgKzQ2LDcgQEAKIAogKi8KIAorI2luY2x1ZGUgImR3YXJmMi5oIgogCiAvKgogICogNjQtYml0IHN5c3RlbSBjYWxsIHN0YWNrIGZyYW1lIGxheW91dCBkZWZpbmVzIGFuZCBoZWxwZXJzLCBmb3IKQEAgLTg0LDcyICs4NSw1NyBAQAogI2RlZmluZSBBUkdPRkZTRVQJUjExCiAjZGVmaW5lIFNXRlJBTUUJCU9SSUdfUkFYCiAKLQkubWFjcm8gU0FWRV9BUkdTIGFkZHNraXA9MCwgbm9yY3g9MCwgbm9yODkxMDExPTAKKwkubWFjcm8gU0FWRV9BUkdTIGFkZHNraXA9MCwgc2F2ZV9yY3g9MSwgc2F2ZV9yODkxMDExPTEKIAlzdWJxICAkOSo4K1xhZGRza2lwLCAlcnNwCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUCTkqOCtcYWRkc2tpcAotCW1vdnEgICVyZGksIDgqOCglcnNwKQotCUNGSV9SRUxfT0ZGU0VUCXJkaSwgOCo4Ci0JbW92cSAgJXJzaSwgNyo4KCVyc3ApCi0JQ0ZJX1JFTF9PRkZTRVQJcnNpLCA3KjgKLQltb3ZxICAlcmR4LCA2KjgoJXJzcCkKLQlDRklfUkVMX09GRlNFVAlyZHgsIDYqOAotCS5pZiBcbm9yY3gKLQkuZWxzZQotCW1vdnEgICVyY3gsIDUqOCglcnNwKQotCUNGSV9SRUxfT0ZGU0VUCXJjeCwgNSo4CisJbW92cV9jZmkgcmRpLCA4KjgKKwltb3ZxX2NmaSByc2ksIDcqOAorCW1vdnFfY2ZpIHJkeCwgNio4CisKKwkuaWYgXHNhdmVfcmN4CisJbW92cV9jZmkgcmN4LCA1KjgKIAkuZW5kaWYKLQltb3ZxICAlcmF4LCA0KjgoJXJzcCkKLQlDRklfUkVMX09GRlNFVAlyYXgsIDQqOAotCS5pZiBcbm9yODkxMDExCi0JLmVsc2UKLQltb3ZxICAlcjgsIDMqOCglcnNwKQotCUNGSV9SRUxfT0ZGU0VUCXI4LCAgMyo4Ci0JbW92cSAgJXI5LCAyKjgoJXJzcCkKLQlDRklfUkVMX09GRlNFVAlyOSwgIDIqOAotCW1vdnEgICVyMTAsIDEqOCglcnNwKQotCUNGSV9SRUxfT0ZGU0VUCXIxMCwgMSo4Ci0JbW92cSAgJXIxMSwgKCVyc3ApCi0JQ0ZJX1JFTF9PRkZTRVQJcjExLCAwKjgKKworCW1vdnFfY2ZpIHJheCwgNCo4CisKKwkuaWYgXHNhdmVfcjg5MTAxMQorCW1vdnFfY2ZpIHI4LCAgMyo4CisJbW92cV9jZmkgcjksICAyKjgKKwltb3ZxX2NmaSByMTAsIDEqOAorCW1vdnFfY2ZpIHIxMSwgMCo4CiAJLmVuZGlmCisKIAkuZW5kbQogCiAjZGVmaW5lIEFSR19TS0lQCSg5KjgpCiAKLQkubWFjcm8gUkVTVE9SRV9BUkdTIHNraXByYXg9MCwgYWRkc2tpcD0wLCBza2lwcmN4PTAsIHNraXByMTE9MCwgXAotCQkJICAgIHNraXByODkxMD0wLCBza2lwcmR4PTAKLQkuaWYgXHNraXByMTEKLQkuZWxzZQotCW1vdnEgKCVyc3ApLCAlcjExCi0JQ0ZJX1JFU1RPUkUgcjExCisJLm1hY3JvIFJFU1RPUkVfQVJHUyByc3Rvcl9yYXg9MSwgYWRkc2tpcD0wLCByc3Rvcl9yY3g9MSwgcnN0b3JfcjExPTEsIFwKKwkJCSAgICByc3Rvcl9yODkxMD0xLCByc3Rvcl9yZHg9MQorCS5pZiBccnN0b3JfcjExCisJbW92cV9jZmlfcmVzdG9yZSAwKjgsIHIxMQogCS5lbmRpZgotCS5pZiBcc2tpcHI4OTEwCi0JLmVsc2UKLQltb3ZxIDEqOCglcnNwKSwgJXIxMAotCUNGSV9SRVNUT1JFIHIxMAotCW1vdnEgMio4KCVyc3ApLCAlcjkKLQlDRklfUkVTVE9SRSByOQotCW1vdnEgMyo4KCVyc3ApLCAlcjgKLQlDRklfUkVTVE9SRSByOAorCisJLmlmIFxyc3Rvcl9yODkxMAorCW1vdnFfY2ZpX3Jlc3RvcmUgMSo4LCByMTAKKwltb3ZxX2NmaV9yZXN0b3JlIDIqOCwgcjkKKwltb3ZxX2NmaV9yZXN0b3JlIDMqOCwgcjgKIAkuZW5kaWYKLQkuaWYgXHNraXByYXgKLQkuZWxzZQotCW1vdnEgNCo4KCVyc3ApLCAlcmF4Ci0JQ0ZJX1JFU1RPUkUgcmF4CisKKwkuaWYgXHJzdG9yX3JheAorCW1vdnFfY2ZpX3Jlc3RvcmUgNCo4LCByYXgKIAkuZW5kaWYKLQkuaWYgXHNraXByY3gKLQkuZWxzZQotCW1vdnEgNSo4KCVyc3ApLCAlcmN4Ci0JQ0ZJX1JFU1RPUkUgcmN4CisKKwkuaWYgXHJzdG9yX3JjeAorCW1vdnFfY2ZpX3Jlc3RvcmUgNSo4LCByY3gKIAkuZW5kaWYKLQkuaWYgXHNraXByZHgKLQkuZWxzZQotCW1vdnEgNio4KCVyc3ApLCAlcmR4Ci0JQ0ZJX1JFU1RPUkUgcmR4CisKKwkuaWYgXHJzdG9yX3JkeAorCW1vdnFfY2ZpX3Jlc3RvcmUgNio4LCByZHgKIAkuZW5kaWYKLQltb3ZxIDcqOCglcnNwKSwgJXJzaQotCUNGSV9SRVNUT1JFIHJzaQotCW1vdnEgOCo4KCVyc3ApLCAlcmRpCi0JQ0ZJX1JFU1RPUkUgcmRpCisKKwltb3ZxX2NmaV9yZXN0b3JlIDcqOCwgcnNpCisJbW92cV9jZmlfcmVzdG9yZSA4KjgsIHJkaQorCiAJLmlmIEFSR19TS0lQK1xhZGRza2lwID4gMAogCWFkZHEgJEFSR19TS0lQK1xhZGRza2lwLCAlcnNwCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUCS0oQVJHX1NLSVArXGFkZHNraXApCkBAIC0xNzYsMzMgKzE2MiwyMSBAQAogCS5tYWNybyBTQVZFX1JFU1QKIAlzdWJxICRSRVNUX1NLSVAsICVyc3AKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQJUkVTVF9TS0lQCi0JbW92cSAlcmJ4LCA1KjgoJXJzcCkKLQlDRklfUkVMX09GRlNFVAlyYngsIDUqOAotCW1vdnEgJXJicCwgNCo4KCVyc3ApCi0JQ0ZJX1JFTF9PRkZTRVQJcmJwLCA0KjgKLQltb3ZxICVyMTIsIDMqOCglcnNwKQotCUNGSV9SRUxfT0ZGU0VUCXIxMiwgMyo4Ci0JbW92cSAlcjEzLCAyKjgoJXJzcCkKLQlDRklfUkVMX09GRlNFVAlyMTMsIDIqOAotCW1vdnEgJXIxNCwgMSo4KCVyc3ApCi0JQ0ZJX1JFTF9PRkZTRVQJcjE0LCAxKjgKLQltb3ZxICVyMTUsICglcnNwKQotCUNGSV9SRUxfT0ZGU0VUCXIxNSwgMCo4CisJbW92cV9jZmkgcmJ4LCA1KjgKKwltb3ZxX2NmaSByYnAsIDQqOAorCW1vdnFfY2ZpIHIxMiwgMyo4CisJbW92cV9jZmkgcjEzLCAyKjgKKwltb3ZxX2NmaSByMTQsIDEqOAorCW1vdnFfY2ZpIHIxNSwgMCo4CiAJLmVuZG0KIAogCS5tYWNybyBSRVNUT1JFX1JFU1QKLQltb3ZxICglcnNwKSwgICAgICVyMTUKLQlDRklfUkVTVE9SRSByMTUKLQltb3ZxIDEqOCglcnNwKSwgICVyMTQKLQlDRklfUkVTVE9SRSByMTQKLQltb3ZxIDIqOCglcnNwKSwgICVyMTMKLQlDRklfUkVTVE9SRSByMTMKLQltb3ZxIDMqOCglcnNwKSwgICVyMTIKLQlDRklfUkVTVE9SRSByMTIKLQltb3ZxIDQqOCglcnNwKSwgICVyYnAKLQlDRklfUkVTVE9SRSByYnAKLQltb3ZxIDUqOCglcnNwKSwgICVyYngKLQlDRklfUkVTVE9SRSByYngKKwltb3ZxX2NmaV9yZXN0b3JlIDAqOCwgcjE1CisJbW92cV9jZmlfcmVzdG9yZSAxKjgsIHIxNAorCW1vdnFfY2ZpX3Jlc3RvcmUgMio4LCByMTMKKwltb3ZxX2NmaV9yZXN0b3JlIDMqOCwgcjEyCisJbW92cV9jZmlfcmVzdG9yZSA0KjgsIHJicAorCW1vdnFfY2ZpX3Jlc3RvcmUgNSo4LCByYngKIAlhZGRxICRSRVNUX1NLSVAsICVyc3AKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQJLShSRVNUX1NLSVApCiAJLmVuZG0KQEAgLTIxNCw3ICsxODgsNyBAQAogCiAJLm1hY3JvIFJFU1RPUkVfQUxMIGFkZHNraXA9MAogCVJFU1RPUkVfUkVTVAotCVJFU1RPUkVfQVJHUyAwLCBcYWRkc2tpcAorCVJFU1RPUkVfQVJHUyAxLCBcYWRkc2tpcAogCS5lbmRtCiAKIAkubWFjcm8gaWNlYnAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Nsb2Nrc291cmNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZGJiYjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8qIHg4Ni1zcGVjaWZpYyBjbG9ja3NvdXJjZSBhZGRpdGlvbnMgKi8KKworI2lmbmRlZiBfQVNNX1g4Nl9DTE9DS1NPVVJDRV9ICisjZGVmaW5lIF9BU01fWDg2X0NMT0NLU09VUkNFX0gKKworI2lmZGVmIENPTkZJR19YODZfNjQKKworI2RlZmluZSBWQ0xPQ0tfTk9ORSAwICAvKiBObyB2RFNPIGNsb2NrIGF2YWlsYWJsZS4JKi8KKyNkZWZpbmUgVkNMT0NLX1RTQyAgMSAgLyogdkRTTyBzaG91bGQgdXNlIHZyZWFkX3RzYy4JKi8KKyNkZWZpbmUgVkNMT0NLX0hQRVQgMiAgLyogdkRTTyBzaG91bGQgdXNlIHZyZWFkX2hwZXQuCSovCisKK3N0cnVjdCBhcmNoX2Nsb2Nrc291cmNlX2RhdGEgeworCWludCB2Y2xvY2tfbW9kZTsKK307CisKKyNlbmRpZiAvKiBDT05GSUdfWDg2XzY0ICovCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9DTE9DS1NPVVJDRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzMyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzMyLmgKaW5kZXggMjg0YTZlOC4uM2RlYjcyNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ18zMi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfMzIuaApAQCAtMjgwLDQgKzI4MCw1MiBAQAogCiAjZW5kaWYKIAorI2RlZmluZSBjbXB4Y2hnOGIocHRyLCBvMSwgbzIsIG4xLCBuMikJCQkJXAorKHsJCQkJCQkJCVwKKwljaGFyIF9fcmV0OwkJCQkJCVwKKwlfX3R5cGVvZl9fKG8yKSBfX2R1bW15OwkJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX29sZDEgPSAobzEpOwkJCVwKKwlfX3R5cGVvZl9fKG8yKSBfX29sZDIgPSAobzIpOwkJCQlcCisJX190eXBlb2ZfXygqKHB0cikpIF9fbmV3MSA9IChuMSk7CQkJXAorCV9fdHlwZW9mX18obzIpIF9fbmV3MiA9IChuMik7CQkJCVwKKwlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggImNtcHhjaGc4YiAlMjsgc2V0eiAlMSIJXAorCQkgICAgICAgOiAiPWQiKF9fZHVtbXkpLCAiPWEiIChfX3JldCksICIrbSIgKCpwdHIpXAorCQkgICAgICAgOiAiYSIgKF9fb2xkMSksICJkIihfX29sZDIpLAkJXAorCQkgICAgICAgICAiYiIgKF9fbmV3MSksICJjIiAoX19uZXcyKQkJXAorCQkgICAgICAgOiAibWVtb3J5Iik7CQkJCVwKKwlfX3JldDsgfSkKKworCisjZGVmaW5lIGNtcHhjaGc4Yl9sb2NhbChwdHIsIG8xLCBvMiwgbjEsIG4yKQkJCVwKKyh7CQkJCQkJCQlcCisJY2hhciBfX3JldDsJCQkJCQlcCisJX190eXBlb2ZfXyhvMikgX19kdW1teTsJCQkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX19vbGQxID0gKG8xKTsJCQlcCisJX190eXBlb2ZfXyhvMikgX19vbGQyID0gKG8yKTsJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX25ldzEgPSAobjEpOwkJCVwKKwlfX3R5cGVvZl9fKG8yKSBfX25ldzIgPSAobjIpOwkJCQlcCisJYXNtIHZvbGF0aWxlKCJjbXB4Y2hnOGIgJTI7IHNldHogJTEiCQkJXAorCQkgICAgICAgOiAiPWQiKF9fZHVtbXkpLCAiPWEiKF9fcmV0KSwgIittIiAoKnB0cilcCisJCSAgICAgICA6ICJhIiAoX19vbGQpLCAiZCIoX19vbGQyKSwJCVwKKwkJICAgICAgICAgImIiIChfX25ldzEpLCAiYyIgKF9fbmV3MiksCQlcCisJCSAgICAgICA6ICJtZW1vcnkiKTsJCQkJXAorCV9fcmV0OyB9KQorCisKKyNkZWZpbmUgY21weGNoZ19kb3VibGUocHRyLCBvMSwgbzIsIG4xLCBuMikJCQkJXAorKHsJCQkJCQkJCQlcCisJQlVJTERfQlVHX09OKHNpemVvZigqKHB0cikpICE9IDQpOwkJCQlcCisJVk1fQlVHX09OKCh1bnNpZ25lZCBsb25nKShwdHIpICUgOCk7CQkJCVwKKwljbXB4Y2hnOGIoKHB0ciksIChvMSksIChvMiksIChuMSksIChuMikpOwkJCVwKK30pCisKKyNkZWZpbmUgY21weGNoZ19kb3VibGVfbG9jYWwocHRyLCBvMSwgbzIsIG4xLCBuMikJCQlcCisoewkJCQkJCQkJCVwKKyAgICAgICBCVUlMRF9CVUdfT04oc2l6ZW9mKCoocHRyKSkgIT0gNCk7CQkJCVwKKyAgICAgICBWTV9CVUdfT04oKHVuc2lnbmVkIGxvbmcpKHB0cikgJSA4KTsJCQkJXAorICAgICAgIGNtcHhjaGcxNmJfbG9jYWwoKHB0ciksIChvMSksIChvMiksIChuMSksIChuMikpOwkJCVwKK30pCisKKyNkZWZpbmUgc3lzdGVtX2hhc19jbXB4Y2hnX2RvdWJsZSgpIGNwdV9oYXNfY3g4CisKICNlbmRpZiAvKiBfQVNNX1g4Nl9DTVBYQ0hHXzMyX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfNjQuaAppbmRleCA0MjNhZTU4Li43Y2Y1YzBhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ182NC5oCkBAIC0xNTEsNCArMTUxLDQ5IEBACiAJY21weGNoZ19sb2NhbCgocHRyKSwgKG8pLCAobikpOwkJCQkJXAogfSkKIAorI2RlZmluZSBjbXB4Y2hnMTZiKHB0ciwgbzEsIG8yLCBuMSwgbjIpCQkJCVwKKyh7CQkJCQkJCQlcCisJY2hhciBfX3JldDsJCQkJCQlcCisJX190eXBlb2ZfXyhvMikgX19qdW5rOwkJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX29sZDEgPSAobzEpOwkJCVwKKwlfX3R5cGVvZl9fKG8yKSBfX29sZDIgPSAobzIpOwkJCQlcCisJX190eXBlb2ZfXygqKHB0cikpIF9fbmV3MSA9IChuMSk7CQkJXAorCV9fdHlwZW9mX18obzIpIF9fbmV3MiA9IChuMik7CQkJCVwKKwlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggImNtcHhjaGcxNmIgJTI7c2V0eiAlMSIJXAorCQkgICAgICAgOiAiPWQiKF9fanVuayksICI9YSIoX19yZXQpLCAiK20iICgqcHRyKQlcCisJCSAgICAgICA6ICJiIihfX25ldzEpLCAiYyIoX19uZXcyKSwJCVwKKwkJICAgICAgICAgImEiKF9fb2xkMSksICJkIihfX29sZDIpKTsJCVwKKwlfX3JldDsgfSkKKworCisjZGVmaW5lIGNtcHhjaGcxNmJfbG9jYWwocHRyLCBvMSwgbzIsIG4xLCBuMikJCQlcCisoewkJCQkJCQkJXAorCWNoYXIgX19yZXQ7CQkJCQkJXAorCV9fdHlwZW9mX18obzIpIF9fanVuazsJCQkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX19vbGQxID0gKG8xKTsJCQlcCisJX190eXBlb2ZfXyhvMikgX19vbGQyID0gKG8yKTsJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX25ldzEgPSAobjEpOwkJCVwKKwlfX3R5cGVvZl9fKG8yKSBfX25ldzIgPSAobjIpOwkJCQlcCisJYXNtIHZvbGF0aWxlKCJjbXB4Y2hnMTZiICUyO3NldHogJTEiCQkJXAorCQkgICAgICAgOiAiPWQiKF9fanVuayksICI9YSIoX19yZXQpLCAiK20iICgqcHRyKQlcCisJCSAgICAgICA6ICJiIihfX25ldzEpLCAiYyIoX19uZXcyKSwJCVwKKwkJICAgICAgICAgImEiKF9fb2xkMSksICJkIihfX29sZDIpKTsJCVwKKwlfX3JldDsgfSkKKworI2RlZmluZSBjbXB4Y2hnX2RvdWJsZShwdHIsIG8xLCBvMiwgbjEsIG4yKQkJCQlcCisoewkJCQkJCQkJCVwKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKCoocHRyKSkgIT0gOCk7CQkJCVwKKwlWTV9CVUdfT04oKHVuc2lnbmVkIGxvbmcpKHB0cikgJSAxNik7CQkJCVwKKwljbXB4Y2hnMTZiKChwdHIpLCAobzEpLCAobzIpLCAobjEpLCAobjIpKTsJCQlcCit9KQorCisjZGVmaW5lIGNtcHhjaGdfZG91YmxlX2xvY2FsKHB0ciwgbzEsIG8yLCBuMSwgbjIpCQkJXAorKHsJCQkJCQkJCQlcCisJQlVJTERfQlVHX09OKHNpemVvZigqKHB0cikpICE9IDgpOwkJCQlcCisJVk1fQlVHX09OKCh1bnNpZ25lZCBsb25nKShwdHIpICUgMTYpOwkJCQlcCisJY21weGNoZzE2Yl9sb2NhbCgocHRyKSwgKG8xKSwgKG8yKSwgKG4xKSwgKG4yKSk7CQlcCit9KQorCisjZGVmaW5lIHN5c3RlbV9oYXNfY21weGNoZ19kb3VibGUoKSBjcHVfaGFzX2N4MTYKKwogI2VuZGlmIC8qIF9BU01fWDg2X0NNUFhDSEdfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCmluZGV4IDcxY2MzODAuLjQyNThhYWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKQEAgLTI4OCw2ICsyODgsOCBAQAogI2RlZmluZSBjcHVfaGFzX2h5cGVydmlzb3IJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0hZUEVSVklTT1IpCiAjZGVmaW5lIGNwdV9oYXNfcGNsbXVscWRxCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QQ0xNVUxRRFEpCiAjZGVmaW5lIGNwdV9oYXNfcGVyZmN0cl9jb3JlCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QRVJGQ1RSX0NPUkUpCisjZGVmaW5lIGNwdV9oYXNfY3g4CQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQ1g4KQorI2RlZmluZSBjcHVfaGFzX2N4MTYJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9DWDE2KQogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lOVkxQRykgfHwgZGVmaW5lZChDT05GSUdfWDg2XzY0KQogIyBkZWZpbmUgY3B1X2hhc19pbnZscGcJCTEKQEAgLTMzMSw4ICszMzMsOCBAQAogCQkJICIyOlxuIgogCQkJICIuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLFwiYVwiXG4iCiAJCQkgX0FTTV9BTElHTiAiXG4iCi0JCQkgX0FTTV9QVFIgIjFiXG4iCi0JCQkgX0FTTV9QVFIgIjBcbiIgCS8qIG5vIHJlcGxhY2VtZW50ICovCisJCQkgIiAubG9uZyAxYiAtIC5cbiIKKwkJCSAiIC5sb25nIDBcbiIJCS8qIG5vIHJlcGxhY2VtZW50ICovCiAJCQkgIiAud29yZCAlUDBcbiIJCS8qIGZlYXR1cmUgYml0ICovCiAJCQkgIiAuYnl0ZSAyYiAtIDFiXG4iCS8qIHNvdXJjZSBsZW4gKi8KIAkJCSAiIC5ieXRlIDBcbiIJCS8qIHJlcGxhY2VtZW50IGxlbiAqLwpAQCAtMzQ5LDggKzM1MSw4IEBACiAJCQkgICAgICIyOlxuIgogCQkJICAgICAiLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucyxcImFcIlxuIgogCQkJICAgICBfQVNNX0FMSUdOICJcbiIKLQkJCSAgICAgX0FTTV9QVFIgIjFiXG4iCi0JCQkgICAgIF9BU01fUFRSICIzZlxuIgorCQkJICAgICAiIC5sb25nIDFiIC0gLlxuIgorCQkJICAgICAiIC5sb25nIDNmIC0gLlxuIgogCQkJICAgICAiIC53b3JkICVQMVxuIgkJLyogZmVhdHVyZSBiaXQgKi8KIAkJCSAgICAgIiAuYnl0ZSAyYiAtIDFiXG4iCQkvKiBzb3VyY2UgbGVuICovCiAJCQkgICAgICIgLmJ5dGUgNGYgLSAzZlxuIgkJLyogcmVwbGFjZW1lbnQgbGVuICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kZWxheS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZGVsYXkuaAppbmRleCA0MDlhNjQ5Li45YjNiNGYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kZWxheS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2RlbGF5LmgKQEAgLTEsMzAgKzEsNyBAQAogI2lmbmRlZiBfQVNNX1g4Nl9ERUxBWV9ICiAjZGVmaW5lIF9BU01fWDg2X0RFTEFZX0gKIAotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5MyBMaW51cyBUb3J2YWxkcwotICoKLSAqIERlbGF5IHJvdXRpbmVzIGNhbGxpbmcgZnVuY3Rpb25zIGluIGFyY2gveDg2L2xpYi9kZWxheS5jCi0gKi8KLQotLyogVW5kZWZpbmVkIGZ1bmN0aW9ucyB0byBnZXQgY29tcGlsZS10aW1lIGVycm9ycyAqLwotZXh0ZXJuIHZvaWQgX19iYWRfdWRlbGF5KHZvaWQpOwotZXh0ZXJuIHZvaWQgX19iYWRfbmRlbGF5KHZvaWQpOwotCi1leHRlcm4gdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKLWV4dGVybiB2b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbnNlY3MpOwotZXh0ZXJuIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB4bG9vcHMpOwotZXh0ZXJuIHZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKTsKLQotLyogMHgxMGM3IGlzIDIqKjMyIC8gMTAwMDAwMCAocm91bmRlZCB1cCkgKi8KLSNkZWZpbmUgdWRlbGF5KG4pIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKLQkoKG4pID4gMjAwMDAgPyBfX2JhZF91ZGVsYXkoKSA6IF9fY29uc3RfdWRlbGF5KChuKSAqIDB4MTBjN3VsKSkgOiBcCi0JX191ZGVsYXkobikpCi0KLS8qIDB4NSBpcyAyKiozMiAvIDEwMDAwMDAwMDAgKHJvdW5kZWQgdXApICovCi0jZGVmaW5lIG5kZWxheShuKSAoX19idWlsdGluX2NvbnN0YW50X3AobikgPyBcCi0JKChuKSA+IDIwMDAwID8gX19iYWRfbmRlbGF5KCkgOiBfX2NvbnN0X3VkZWxheSgobikgKiA1dWwpKSA6IFwKLQlfX25kZWxheShuKSkKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZWxheS5oPgogCiB2b2lkIHVzZV90c2NfZGVsYXkodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VudHJ5X2FyY2guaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VudHJ5X2FyY2guaAppbmRleCAxY2Q2ZDI2Li4wYmFhNjI4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbnRyeV9hcmNoLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZW50cnlfYXJjaC5oCkBAIC01Myw4ICs1Myw0IEBACiBCVUlMRF9JTlRFUlJVUFQodGhyZXNob2xkX2ludGVycnVwdCxUSFJFU0hPTERfQVBJQ19WRUNUT1IpCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19YODZfTUNFCi1CVUlMRF9JTlRFUlJVUFQobWNlX3NlbGZfaW50ZXJydXB0LE1DRV9TRUxGX1ZFQ1RPUikKLSNlbmRpZgotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZpeG1hcC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZml4bWFwLmgKaW5kZXggNDcyOWIyYi4uNDYwYzc0ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZml4bWFwLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZml4bWFwLmgKQEAgLTc4LDYgKzc4LDcgQEAKIAlWU1lTQ0FMTF9MQVNUX1BBR0UsCiAJVlNZU0NBTExfRklSU1RfUEFHRSA9IFZTWVNDQUxMX0xBU1RfUEFHRQogCQkJICAgICsgKChWU1lTQ0FMTF9FTkQtVlNZU0NBTExfU1RBUlQpID4+IFBBR0VfU0hJRlQpIC0gMSwKKwlWVkFSX1BBR0UsCiAJVlNZU0NBTExfSFBFVCwKICNlbmRpZgogCUZJWF9EQkdQX0JBU0UsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mcmFtZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZnJhbWUuaAppbmRleCAyYzZmYzllLi4zYjYyOWY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mcmFtZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZyYW1lLmgKQEAgLTEsNSArMSw2IEBACiAjaWZkZWYgX19BU1NFTUJMWV9fCiAKKyNpbmNsdWRlIDxhc20vYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2R3YXJmMi5oPgogCiAvKiBUaGUgYW5ub3RhdGlvbiBoaWRlcyB0aGUgZnJhbWUgZnJvbSB0aGUgdW53aW5kZXIgYW5kIG1ha2VzIGl0IGxvb2sKQEAgLTcsMTMgKzgsMTMgQEAKICAgIGZyYW1lIHBvaW50ZXIgbGF0ZXIgKi8KICNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgogCS5tYWNybyBGUkFNRQotCXB1c2hsX2NmaSAlZWJwCi0JQ0ZJX1JFTF9PRkZTRVQgZWJwLDAKLQltb3ZsICVlc3AsJWVicAorCV9fQVNNX1NJWkUocHVzaCxfY2ZpKQklX19BU01fUkVHKGJwKQorCUNGSV9SRUxfT0ZGU0VUCQlfX0FTTV9SRUcoYnApLCAwCisJX19BU01fU0laRShtb3YpCQklX19BU01fUkVHKHNwKSwgJV9fQVNNX1JFRyhicCkKIAkuZW5kbQogCS5tYWNybyBFTkRGUkFNRQotCXBvcGxfY2ZpICVlYnAKLQlDRklfUkVTVE9SRSBlYnAKKwlfX0FTTV9TSVpFKHBvcCxfY2ZpKQklX19BU01fUkVHKGJwKQorCUNGSV9SRVNUT1JFCQlfX0FTTV9SRUcoYnApCiAJLmVuZG0KICNlbHNlCiAJLm1hY3JvIEZSQU1FCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19pcnEuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h3X2lycS5oCmluZGV4IGJiOWVmZTguLjEzZjU1MDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h3X2lycS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h3X2lycS5oCkBAIC0zNCw3ICszNCw2IEBACiBleHRlcm4gdm9pZCBzcHVyaW91c19pbnRlcnJ1cHQodm9pZCk7CiBleHRlcm4gdm9pZCB0aGVybWFsX2ludGVycnVwdCh2b2lkKTsKIGV4dGVybiB2b2lkIHJlc2NoZWR1bGVfaW50ZXJydXB0KHZvaWQpOwotZXh0ZXJuIHZvaWQgbWNlX3NlbGZfaW50ZXJydXB0KHZvaWQpOwogCiBleHRlcm4gdm9pZCBpbnZhbGlkYXRlX2ludGVycnVwdCh2b2lkKTsKIGV4dGVybiB2b2lkIGludmFsaWRhdGVfaW50ZXJydXB0MCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2k4MjUzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pODI1My5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWFhYTkxLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2k4MjUzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaWZuZGVmIF9BU01fWDg2X0k4MjUzX0gKLSNkZWZpbmUgX0FTTV9YODZfSTgyNTNfSAotCi0vKiBpODI1M0EgUElUIHJlZ2lzdGVycyAqLwotI2RlZmluZSBQSVRfTU9ERQkJMHg0MwotI2RlZmluZSBQSVRfQ0gwCQkJMHg0MAotI2RlZmluZSBQSVRfQ0gyCQkJMHg0MgotCi0jZGVmaW5lIFBJVF9MQVRDSAlMQVRDSAotCi1leHRlcm4gcmF3X3NwaW5sb2NrX3QgaTgyNTNfbG9jazsKLQotZXh0ZXJuIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmdsb2JhbF9jbG9ja19ldmVudDsKLQotZXh0ZXJuIHZvaWQgc2V0dXBfcGl0X3RpbWVyKHZvaWQpOwotCi0jZGVmaW5lIGluYl9waXQJCWluYl9wCi0jZGVmaW5lIG91dGJfcGl0CW91dGJfcAotCi0jZW5kaWYgLyogX0FTTV9YODZfSTgyNTNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxX3ZlY3RvcnMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycV92ZWN0b3JzLmgKaW5kZXggNmU5NzZlZS4uZjlhMzIwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxX3ZlY3RvcnMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFfdmVjdG9ycy5oCkBAIC0xNyw3ICsxNyw4IEBACiAgKiAgVmVjdG9ycyAgIDAgLi4uICAzMSA6IHN5c3RlbSB0cmFwcyBhbmQgZXhjZXB0aW9ucyAtIGhhcmRjb2RlZCBldmVudHMKICAqICBWZWN0b3JzICAzMiAuLi4gMTI3IDogZGV2aWNlIGludGVycnVwdHMKICAqICBWZWN0b3IgIDEyOCAgICAgICAgIDogbGVnYWN5IGludDgwIHN5c2NhbGwgaW50ZXJmYWNlCi0gKiAgVmVjdG9ycyAxMjkgLi4uIElOVkFMSURBVEVfVExCX1ZFQ1RPUl9TVEFSVC0xIDogZGV2aWNlIGludGVycnVwdHMKKyAqICBWZWN0b3IgIDIwNCAgICAgICAgIDogbGVnYWN5IHg4Nl82NCB2c3lzY2FsbCBlbXVsYXRpb24KKyAqICBWZWN0b3JzIDEyOSAuLi4gSU5WQUxJREFURV9UTEJfVkVDVE9SX1NUQVJULTEgZXhjZXB0IDIwNCA6IGRldmljZSBpbnRlcnJ1cHRzCiAgKiAgVmVjdG9ycyBJTlZBTElEQVRFX1RMQl9WRUNUT1JfU1RBUlQgLi4uIDI1NSA6IHNwZWNpYWwgaW50ZXJydXB0cwogICoKICAqIDY0LWJpdCB4ODYgaGFzIHBlciBDUFUgSURUIHRhYmxlcywgMzItYml0IGhhcyBvbmUgc2hhcmVkIElEVCB0YWJsZS4KQEAgLTUwLDYgKzUxLDkgQEAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAjIGRlZmluZSBTWVNDQUxMX1ZFQ1RPUgkJCTB4ODAKICNlbmRpZgorI2lmZGVmIENPTkZJR19YODZfNjQKKyMgZGVmaW5lIFZTWVNDQUxMX0VNVV9WRUNUT1IJCTB4Y2MKKyNlbmRpZgogCiAvKgogICogVmVjdG9ycyAweDMwLTB4M2YgYXJlIHVzZWQgZm9yIElTQSBpbnRlcnJ1cHRzLgpAQCAtMTA5LDExICsxMTMsNiBAQAogCiAjZGVmaW5lIFVWX0JBVV9NRVNTQUdFCQkJMHhmNQogCi0vKgotICogU2VsZiBJUEkgdmVjdG9yIGZvciBtYWNoaW5lIGNoZWNrcwotICovCi0jZGVmaW5lIE1DRV9TRUxGX1ZFQ1RPUgkJCTB4ZjQKLQogLyogWGVuIHZlY3RvciBjYWxsYmFjayB0byByZWNlaXZlIGV2ZW50cyBpbiBhIEhWTSBkb21haW4gKi8KICNkZWZpbmUgWEVOX0hWTV9FVlRDSE5fQ0FMTEJBQ0sJCTB4ZjMKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKaW5kZXggNTc0NWNlOC4uYmJhM2NmOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCkBAIC02MCwyMyArNjAsMjQgQEAKICNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KICNlbHNlCiAjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfc2F2ZV9mbGFncyh2b2lkKQogewogCXJldHVybiBuYXRpdmVfc2F2ZV9mbCgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCW5hdGl2ZV9yZXN0b3JlX2ZsKGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKIHsKIAluYXRpdmVfaXJxX2Rpc2FibGUoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQorc3RhdGljIGlubGluZSBub3RyYWNlIHZvaWQgYXJjaF9sb2NhbF9pcnFfZW5hYmxlKHZvaWQpCiB7CiAJbmF0aXZlX2lycV9lbmFibGUoKTsKIH0KQEAgLTEwMiw3ICsxMDMsNyBAQAogLyoKICAqIEZvciBzcGlubG9ja3MsIGV0YzoKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfaXJxX3NhdmUodm9pZCkKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfaXJxX3NhdmUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKCk7CiAJYXJjaF9sb2NhbF9pcnFfZGlzYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmgKaW5kZXggMDA0OTIxMS4uNjA0MGQxMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCkBAIC0yMjksMzcgKzIyOSw2IEBACiAJdW5zaWduZWQgbG9uZyBlbmQ7CiB9OwogCi1zdHJ1Y3QgZGVjb2RlX2NhY2hlIHsKLQl1OCB0d29ieXRlOwotCXU4IGI7Ci0JdTggaW50ZXJjZXB0OwotCXU4IGxvY2tfcHJlZml4OwotCXU4IHJlcF9wcmVmaXg7Ci0JdTggb3BfYnl0ZXM7Ci0JdTggYWRfYnl0ZXM7Ci0JdTggcmV4X3ByZWZpeDsKLQlzdHJ1Y3Qgb3BlcmFuZCBzcmM7Ci0Jc3RydWN0IG9wZXJhbmQgc3JjMjsKLQlzdHJ1Y3Qgb3BlcmFuZCBkc3Q7Ci0JYm9vbCBoYXNfc2VnX292ZXJyaWRlOwotCXU4IHNlZ19vdmVycmlkZTsKLQl1bnNpZ25lZCBpbnQgZDsKLQlpbnQgKCpleGVjdXRlKShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCk7Ci0JaW50ICgqY2hlY2tfcGVybSkoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpOwotCXVuc2lnbmVkIGxvbmcgcmVnc1tOUl9WQ1BVX1JFR1NdOwotCXVuc2lnbmVkIGxvbmcgZWlwOwotCS8qIG1vZHJtICovCi0JdTggbW9kcm07Ci0JdTggbW9kcm1fbW9kOwotCXU4IG1vZHJtX3JlZzsKLQl1OCBtb2RybV9ybTsKLQl1OCBtb2RybV9zZWc7Ci0JYm9vbCByaXBfcmVsYXRpdmU7Ci0Jc3RydWN0IGZldGNoX2NhY2hlIGZldGNoOwotCXN0cnVjdCByZWFkX2NhY2hlIGlvX3JlYWQ7Ci0Jc3RydWN0IHJlYWRfY2FjaGUgbWVtX3JlYWQ7Ci19OwotCiBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCB7CiAJc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzOwogCkBAIC0yODAsNyArMjQ5LDM1IEBACiAJc3RydWN0IHg4Nl9leGNlcHRpb24gZXhjZXB0aW9uOwogCiAJLyogZGVjb2RlIGNhY2hlICovCi0Jc3RydWN0IGRlY29kZV9jYWNoZSBkZWNvZGU7CisJdTggdHdvYnl0ZTsKKwl1OCBiOworCXU4IGludGVyY2VwdDsKKwl1OCBsb2NrX3ByZWZpeDsKKwl1OCByZXBfcHJlZml4OworCXU4IG9wX2J5dGVzOworCXU4IGFkX2J5dGVzOworCXU4IHJleF9wcmVmaXg7CisJc3RydWN0IG9wZXJhbmQgc3JjOworCXN0cnVjdCBvcGVyYW5kIHNyYzI7CisJc3RydWN0IG9wZXJhbmQgZHN0OworCWJvb2wgaGFzX3NlZ19vdmVycmlkZTsKKwl1OCBzZWdfb3ZlcnJpZGU7CisJdW5zaWduZWQgaW50IGQ7CisJaW50ICgqZXhlY3V0ZSkoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpOworCWludCAoKmNoZWNrX3Blcm0pKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KTsKKwkvKiBtb2RybSAqLworCXU4IG1vZHJtOworCXU4IG1vZHJtX21vZDsKKwl1OCBtb2RybV9yZWc7CisJdTggbW9kcm1fcm07CisJdTggbW9kcm1fc2VnOworCWJvb2wgcmlwX3JlbGF0aXZlOworCXVuc2lnbmVkIGxvbmcgX2VpcDsKKwkvKiBGaWVsZHMgYWJvdmUgcmVncyBhcmUgY2xlYXJlZCB0b2dldGhlci4gKi8KKwl1bnNpZ25lZCBsb25nIHJlZ3NbTlJfVkNQVV9SRUdTXTsKKwlzdHJ1Y3QgZmV0Y2hfY2FjaGUgZmV0Y2g7CisJc3RydWN0IHJlYWRfY2FjaGUgaW9fcmVhZDsKKwlzdHJ1Y3QgcmVhZF9jYWNoZSBtZW1fcmVhZDsKIH07CiAKIC8qIFJlcGVhdCBTdHJpbmcgT3BlcmF0aW9uIFByZWZpeCAqLwpAQCAtMzczLDYgKzM3MCw1IEBACiBpbnQgZW11bGF0b3JfdGFza19zd2l0Y2goc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCiAJCQkgdTE2IHRzc19zZWxlY3RvciwgaW50IHJlYXNvbiwKIAkJCSBib29sIGhhc19lcnJvcl9jb2RlLCB1MzIgZXJyb3JfY29kZSk7Ci1pbnQgZW11bGF0ZV9pbnRfcmVhbChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsIGludCBpcnEpOworaW50IGVtdWxhdGVfaW50X3JlYWwoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBpcnEpOwogI2VuZGlmIC8qIF9BU01fWDg2X0tWTV9YODZfRU1VTEFURV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCBkMmFjOGUyLi5kZDUxYzgzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTQ4LDcgKzQ4LDcgQEAKIAkofih1bnNpZ25lZCBsb25nKShYODZfQ1I0X1ZNRSB8IFg4Nl9DUjRfUFZJIHwgWDg2X0NSNF9UU0QgfCBYODZfQ1I0X0RFXAogCQkJICB8IFg4Nl9DUjRfUFNFIHwgWDg2X0NSNF9QQUUgfCBYODZfQ1I0X01DRSAgICAgXAogCQkJICB8IFg4Nl9DUjRfUEdFIHwgWDg2X0NSNF9QQ0UgfCBYODZfQ1I0X09TRlhTUiAgXAotCQkJICB8IFg4Nl9DUjRfT1NYU0FWRSBcCisJCQkgIHwgWDg2X0NSNF9PU1hTQVZFIHwgWDg2X0NSNF9TTUVQIHwgWDg2X0NSNF9SRFdSR1NGUyBcCiAJCQkgIHwgWDg2X0NSNF9PU1hNTUVYQ1BUIHwgWDg2X0NSNF9WTVhFKSkKIAogI2RlZmluZSBDUjhfUkVTRVJWRURfQklUUyAofih1bnNpZ25lZCBsb25nKVg4Nl9DUjhfVFBSKQpAQCAtMjA1LDYgKzIwNSw3IEBACiAJCXVuc2lnbmVkIGludmFsaWQ6MTsKIAkJdW5zaWduZWQgbnhlOjE7CiAJCXVuc2lnbmVkIGNyMF93cDoxOworCQl1bnNpZ25lZCBzbWVwX2FuZG5vdF93cDoxOwogCX07CiB9OwogCkBAIC0yMjcsMTUgKzIyOCwxNyBAQAogCSAqIGluIHRoaXMgc2hhZG93IHBhZ2UuCiAJICovCiAJREVDTEFSRV9CSVRNQVAoc2xvdF9iaXRtYXAsIEtWTV9NRU1PUllfU0xPVFMgKyBLVk1fUFJJVkFURV9NRU1fU0xPVFMpOwotCWJvb2wgbXVsdGltYXBwZWQ7ICAgICAgICAgLyogTW9yZSB0aGFuIG9uZSBwYXJlbnRfcHRlPyAqLwogCWJvb2wgdW5zeW5jOwogCWludCByb290X2NvdW50OyAgICAgICAgICAvKiBDdXJyZW50bHkgc2VydmluZyBhcyBhY3RpdmUgcm9vdCAqLwogCXVuc2lnbmVkIGludCB1bnN5bmNfY2hpbGRyZW47Ci0JdW5pb24gewotCQl1NjQgKnBhcmVudF9wdGU7ICAgICAgICAgICAgICAgLyogIW11bHRpbWFwcGVkICovCi0JCXN0cnVjdCBobGlzdF9oZWFkIHBhcmVudF9wdGVzOyAvKiBtdWx0aW1hcHBlZCwga3ZtX3B0ZV9jaGFpbiAqLwotCX07CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcHRlczsJLyogUmV2ZXJzZSBtYXBwaW5nIGZvciBwYXJlbnRfcHRlICovCiAJREVDTEFSRV9CSVRNQVAodW5zeW5jX2NoaWxkX2JpdG1hcCwgNTEyKTsKKworI2lmZGVmIENPTkZJR19YODZfMzIKKwlpbnQgY2xlYXJfc3B0ZV9jb3VudDsKKyNlbmRpZgorCisJc3RydWN0IHJjdV9oZWFkIHJjdTsKIH07CiAKIHN0cnVjdCBrdm1fcHZfbW11X29wX2J1ZmZlciB7CkBAIC0yNjksOCArMjcyLDYgQEAKIAlncGFfdCAoKmd2YV90b19ncGEpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLCB1MzIgYWNjZXNzLAogCQkJICAgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pOwogCWdwYV90ICgqdHJhbnNsYXRlX2dwYSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCBncGEsIHUzMiBhY2Nlc3MpOwotCXZvaWQgKCpwcmVmZXRjaF9wYWdlKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkgICAgICBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpwYWdlKTsKIAlpbnQgKCpzeW5jX3BhZ2UpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCSBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCk7CiAJdm9pZCAoKmludmxwZykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEpOwpAQCAtMzQ2LDggKzM0Nyw3IEBACiAJICogcHV0IGl0IGhlcmUgdG8gYXZvaWQgYWxsb2NhdGlvbiAqLwogCXN0cnVjdCBrdm1fcHZfbW11X29wX2J1ZmZlciBtbXVfb3BfYnVmZmVyOwogCi0Jc3RydWN0IGt2bV9tbXVfbWVtb3J5X2NhY2hlIG1tdV9wdGVfY2hhaW5fY2FjaGU7Ci0Jc3RydWN0IGt2bV9tbXVfbWVtb3J5X2NhY2hlIG1tdV9ybWFwX2Rlc2NfY2FjaGU7CisJc3RydWN0IGt2bV9tbXVfbWVtb3J5X2NhY2hlIG1tdV9wdGVfbGlzdF9kZXNjX2NhY2hlOwogCXN0cnVjdCBrdm1fbW11X21lbW9yeV9jYWNoZSBtbXVfcGFnZV9jYWNoZTsKIAlzdHJ1Y3Qga3ZtX21tdV9tZW1vcnlfY2FjaGUgbW11X3BhZ2VfaGVhZGVyX2NhY2hlOwogCkBAIC0zOTMsNiArMzkzLDE1IEBACiAJdW5zaWduZWQgaW50IGh3X3RzY19raHo7CiAJdW5zaWduZWQgaW50IHRpbWVfb2Zmc2V0OwogCXN0cnVjdCBwYWdlICp0aW1lX3BhZ2U7CisKKwlzdHJ1Y3QgeworCQl1NjQgbXNyX3ZhbDsKKwkJdTY0IGxhc3Rfc3RlYWw7CisJCXU2NCBhY2N1bV9zdGVhbDsKKwkJc3RydWN0IGdmbl90b19odmFfY2FjaGUgc3RpbWU7CisJCXN0cnVjdCBrdm1fc3RlYWxfdGltZSBzdGVhbDsKKwl9IHN0OworCiAJdTY0IGxhc3RfZ3Vlc3RfdHNjOwogCXU2NCBsYXN0X2tlcm5lbF9uczsKIAl1NjQgbGFzdF90c2NfbnNlYzsKQEAgLTQxOSw2ICs0MjgsMTEgQEAKIAl1NjQgbWNnX2N0bDsKIAl1NjQgKm1jZV9iYW5rczsKIAorCS8qIENhY2hlIE1NSU8gaW5mbyAqLworCXU2NCBtbWlvX2d2YTsKKwl1bnNpZ25lZCBhY2Nlc3M7CisJZ2ZuX3QgbW1pb19nZm47CisKIAkvKiB1c2VkIGZvciBndWVzdCBzaW5nbGUgc3RlcHBpbmcgb3ZlciB0aGUgZ2l2ZW4gY29kZSBwb3NpdGlvbiAqLwogCXVuc2lnbmVkIGxvbmcgc2luZ2xlc3RlcF9yaXA7CiAKQEAgLTQ0MSw2ICs0NTUsNyBAQAogCXVuc2lnbmVkIGludCBuX3VzZWRfbW11X3BhZ2VzOwogCXVuc2lnbmVkIGludCBuX3JlcXVlc3RlZF9tbXVfcGFnZXM7CiAJdW5zaWduZWQgaW50IG5fbWF4X21tdV9wYWdlczsKKwl1bnNpZ25lZCBpbnQgaW5kaXJlY3Rfc2hhZG93X3BhZ2VzOwogCWF0b21pY190IGludmxwZ19jb3VudGVyOwogCXN0cnVjdCBobGlzdF9oZWFkIG1tdV9wYWdlX2hhc2hbS1ZNX05VTV9NTVVfUEFHRVNdOwogCS8qCkBAIC00NzcsNiArNDkyLDggQEAKIAl1NjQgaHZfZ3Vlc3Rfb3NfaWQ7CiAJdTY0IGh2X2h5cGVyY2FsbDsKIAorCWF0b21pY190IHJlYWRlcl9jb3VudGVyOworCiAJI2lmZGVmIENPTkZJR19LVk1fTU1VX0FVRElUCiAJaW50IGF1ZGl0X3BvaW50OwogCSNlbmRpZgpAQCAtNTU5LDcgKzU3Niw3IEBACiAJdm9pZCAoKmRlY2FjaGVfY3I0X2d1ZXN0X2JpdHMpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAJdm9pZCAoKnNldF9jcjApKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjApOwogCXZvaWQgKCpzZXRfY3IzKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IzKTsKLQl2b2lkICgqc2V0X2NyNCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyNCk7CisJaW50ICgqc2V0X2NyNCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyNCk7CiAJdm9pZCAoKnNldF9lZmVyKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBlZmVyKTsKIAl2b2lkICgqZ2V0X2lkdCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgZGVzY19wdHIgKmR0KTsKIAl2b2lkICgqc2V0X2lkdCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgZGVzY19wdHIgKmR0KTsKQEAgLTYzNiw3ICs2NTMsNiBAQAogdm9pZCBrdm1fbW11X2Rlc3Ryb3koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGludCBrdm1fbW11X2NyZWF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogaW50IGt2bV9tbXVfc2V0dXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKLXZvaWQga3ZtX21tdV9zZXRfbm9ucHJlc2VudF9wdGVzKHU2NCB0cmFwX3B0ZSwgdTY0IG5vdHJhcF9wdGUpOwogdm9pZCBrdm1fbW11X3NldF9tYXNrX3B0ZXModTY0IHVzZXJfbWFzaywgdTY0IGFjY2Vzc2VkX21hc2ssCiAJCXU2NCBkaXJ0eV9tYXNrLCB1NjQgbnhfbWFzaywgdTY0IHhfbWFzayk7CiAKQEAgLTgzMCwxMSArODQ2LDEyIEBACiBhc21saW5rYWdlIHZvaWQga3ZtX3NwdXJpb3VzX2ZhdWx0KHZvaWQpOwogZXh0ZXJuIGJvb2wga3ZtX3JlYm9vdGluZzsKIAotI2RlZmluZSBfX2t2bV9oYW5kbGVfZmF1bHRfb25fcmVib290KGluc24pIFwKKyNkZWZpbmUgX19fX2t2bV9oYW5kbGVfZmF1bHRfb25fcmVib290KGluc24sIGNsZWFudXBfaW5zbikJXAogCSI2NjY6ICIgaW5zbiAiXG5cdCIgXAogCSI2Njg6IFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCSIucHVzaHNlY3Rpb24gLmZpeHVwLCBcImF4XCIgXG4iIFwKIAkiNjY3OiBcblx0IiBcCisJY2xlYW51cF9pbnNuICJcblx0IgkJICAgICAgXAogCSJjbXBiICQwLCBrdm1fcmVib290aW5nIFxuXHQiCSAgICAgIFwKIAkiam5lIDY2OGIgXG5cdCIgICAgICAJCSAgICAgIFwKIAlfX0FTTV9TSVpFKHB1c2gpICIgJDY2NmIgXG5cdCIJICAgICAgXApAQCAtODQ0LDYgKzg2MSw5IEBACiAJX0FTTV9QVFIgIiA2NjZiLCA2NjdiIFxuXHQiIFwKIAkiLnBvcHNlY3Rpb24iCiAKKyNkZWZpbmUgX19rdm1faGFuZGxlX2ZhdWx0X29uX3JlYm9vdChpbnNuKQkJXAorCV9fX19rdm1faGFuZGxlX2ZhdWx0X29uX3JlYm9vdChpbnNuLCAiIikKKwogI2RlZmluZSBLVk1fQVJDSF9XQU5UX01NVV9OT1RJRklFUgogaW50IGt2bV91bm1hcF9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSk7CiBpbnQga3ZtX2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1fcGFyYS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX3BhcmEuaAppbmRleCBhNDI3YmY3Li43MzRjMzc2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1fcGFyYS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9wYXJhLmgKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogI2RlZmluZSBLVk1fRkVBVFVSRV9DTE9DS1NPVVJDRTIgICAgICAgIDMKICNkZWZpbmUgS1ZNX0ZFQVRVUkVfQVNZTkNfUEYJCTQKKyNkZWZpbmUgS1ZNX0ZFQVRVUkVfU1RFQUxfVElNRQkJNQogCiAvKiBUaGUgbGFzdCA4IGJpdHMgYXJlIHVzZWQgdG8gaW5kaWNhdGUgaG93IHRvIGludGVycHJldCB0aGUgZmxhZ3MgZmllbGQKICAqIGluIHB2Y2xvY2sgc3RydWN0dXJlLiBJZiBubyBiaXRzIGFyZSBzZXQsIGFsbCBmbGFncyBhcmUgaWdub3JlZC4KQEAgLTMwLDEwICszMSwyMyBAQAogI2RlZmluZSBNU1JfS1ZNX1dBTExfQ0xPQ0sgIDB4MTEKICNkZWZpbmUgTVNSX0tWTV9TWVNURU1fVElNRSAweDEyCiAKKyNkZWZpbmUgS1ZNX01TUl9FTkFCTEVEIDEKIC8qIEN1c3RvbSBNU1JzIGZhbGxzIGluIHRoZSByYW5nZSAweDRiNTY0ZDAwLTB4NGI1NjRkZmYgKi8KICNkZWZpbmUgTVNSX0tWTV9XQUxMX0NMT0NLX05FVyAgMHg0YjU2NGQwMAogI2RlZmluZSBNU1JfS1ZNX1NZU1RFTV9USU1FX05FVyAweDRiNTY0ZDAxCiAjZGVmaW5lIE1TUl9LVk1fQVNZTkNfUEZfRU4gMHg0YjU2NGQwMgorI2RlZmluZSBNU1JfS1ZNX1NURUFMX1RJTUUgIDB4NGI1NjRkMDMKKworc3RydWN0IGt2bV9zdGVhbF90aW1lIHsKKwlfX3U2NCBzdGVhbDsKKwlfX3UzMiB2ZXJzaW9uOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHBhZFsxMl07Cit9OworCisjZGVmaW5lIEtWTV9TVEVBTF9BTElHTk1FTlRfQklUUyA1CisjZGVmaW5lIEtWTV9TVEVBTF9WQUxJRF9CSVRTICgoLTFVTEwgPDwgKEtWTV9TVEVBTF9BTElHTk1FTlRfQklUUyArIDEpKSkKKyNkZWZpbmUgS1ZNX1NURUFMX1JFU0VSVkVEX01BU0sgKCgoMSA8PCBLVk1fU1RFQUxfQUxJR05NRU5UX0JJVFMpIC0gMSApIDw8IDEpCiAKICNkZWZpbmUgS1ZNX01BWF9NTVVfT1BfQkFUQ0ggICAgICAgICAgIDMyCiAKQEAgLTE3OCw2ICsxOTIsNyBAQAogdm9pZCBrdm1fYXN5bmNfcGZfdGFza193YWl0KHUzMiB0b2tlbik7CiB2b2lkIGt2bV9hc3luY19wZl90YXNrX3dha2UodTMyIHRva2VuKTsKIHUzMiBrdm1fcmVhZF9hbmRfcmVzZXRfcGZfcmVhc29uKHZvaWQpOworZXh0ZXJuIHZvaWQga3ZtX2Rpc2FibGVfc3RlYWxfdGltZSh2b2lkKTsKICNlbHNlCiAjZGVmaW5lIGt2bV9ndWVzdF9pbml0KCkgZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBrdm1fYXN5bmNfcGZfdGFza193YWl0KFQpIGRvIHt9IHdoaWxlKDApCkBAIC0xODYsNiArMjAxLDExIEBACiB7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1fZGlzYWJsZV9zdGVhbF90aW1lKHZvaWQpCit7CisJcmV0dXJuOworfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9sZ3Vlc3RfaGNhbGwuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2xndWVzdF9oY2FsbC5oCmluZGV4IGI2MGYyOTIuLjg3OWZkN2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2xndWVzdF9oY2FsbC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2xndWVzdF9oY2FsbC5oCkBAIC02MSw2ICs2MSw3IEBACiAJCSAgICAgOiAibWVtb3J5Iik7CiAJcmV0dXJuIGNhbGw7CiB9CisvKjoqLwogCiAvKiBDYW4ndCB1c2Ugb3VyIG1pbigpIG1hY3JvIGhlcmU6IG5lZWRzIHRvIGJlIGEgY29uc3RhbnQgKi8KICNkZWZpbmUgTEdVRVNUX0lSUVMgKE5SX0lSUVMgPCAzMiA/IE5SX0lSUVM6IDMyKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tY2UuaAppbmRleCAwMjE5NzlhLi43MTZiNDhhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tY2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tY2UuaApAQCAtOCw2ICs4LDcgQEAKICAqIE1hY2hpbmUgQ2hlY2sgc3VwcG9ydCBmb3IgeDg2CiAgKi8KIAorLyogTUNHX0NBUCByZWdpc3RlciBkZWZpbmVzICovCiAjZGVmaW5lIE1DR19CQU5LQ05UX01BU0sJMHhmZiAgICAgICAgIC8qIE51bWJlciBvZiBCYW5rcyAqLwogI2RlZmluZSBNQ0dfQ1RMX1AJCSgxVUxMPDw4KSAgICAvKiBNQ0dfQ1RMIHJlZ2lzdGVyIGF2YWlsYWJsZSAqLwogI2RlZmluZSBNQ0dfRVhUX1AJCSgxVUxMPDw5KSAgICAvKiBFeHRlbmRlZCByZWdpc3RlcnMgYXZhaWxhYmxlICovCkBAIC0xNywxMCArMTgsMTIgQEAKICNkZWZpbmUgTUNHX0VYVF9DTlQoYykJCSgoKGMpICYgTUNHX0VYVF9DTlRfTUFTSykgPj4gTUNHX0VYVF9DTlRfU0hJRlQpCiAjZGVmaW5lIE1DR19TRVJfUAkgCSgxVUxMPDwyNCkgICAvKiBNQ0EgcmVjb3ZlcnkvbmV3IHN0YXR1cyBiaXRzICovCiAKKy8qIE1DR19TVEFUVVMgcmVnaXN0ZXIgZGVmaW5lcyAqLwogI2RlZmluZSBNQ0dfU1RBVFVTX1JJUFYgICgxVUxMPDwwKSAgIC8qIHJlc3RhcnQgaXAgdmFsaWQgKi8KICNkZWZpbmUgTUNHX1NUQVRVU19FSVBWICAoMVVMTDw8MSkgICAvKiBpcCBwb2ludHMgdG8gY29ycmVjdCBpbnN0cnVjdGlvbiAqLwogI2RlZmluZSBNQ0dfU1RBVFVTX01DSVAgICgxVUxMPDwyKSAgIC8qIG1hY2hpbmUgY2hlY2sgaW4gcHJvZ3Jlc3MgKi8KIAorLyogTUNpX1NUQVRVUyByZWdpc3RlciBkZWZpbmVzICovCiAjZGVmaW5lIE1DSV9TVEFUVVNfVkFMICAgKDFVTEw8PDYzKSAgLyogdmFsaWQgZXJyb3IgKi8KICNkZWZpbmUgTUNJX1NUQVRVU19PVkVSICAoMVVMTDw8NjIpICAvKiBwcmV2aW91cyBlcnJvcnMgbG9zdCAqLwogI2RlZmluZSBNQ0lfU1RBVFVTX1VDICAgICgxVUxMPDw2MSkgIC8qIHVuY29ycmVjdGVkIGVycm9yICovCkBAIC0zMSwxMiArMzQsMTQgQEAKICNkZWZpbmUgTUNJX1NUQVRVU19TCSAoMVVMTDw8NTYpICAvKiBTaWduYWxlZCBtYWNoaW5lIGNoZWNrICovCiAjZGVmaW5lIE1DSV9TVEFUVVNfQVIJICgxVUxMPDw1NSkgIC8qIEFjdGlvbiByZXF1aXJlZCAqLwogCi0vKiBNSVNDIHJlZ2lzdGVyIGRlZmluZXMgKi8KLSNkZWZpbmUgTUNNX0FERFJfU0VHT0ZGICAwCS8qIHNlZ21lbnQgb2Zmc2V0ICovCi0jZGVmaW5lIE1DTV9BRERSX0xJTkVBUiAgMQkvKiBsaW5lYXIgYWRkcmVzcyAqLwotI2RlZmluZSBNQ01fQUREUl9QSFlTCSAyCS8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KLSNkZWZpbmUgTUNNX0FERFJfTUVNCSAzCS8qIG1lbW9yeSBhZGRyZXNzICovCi0jZGVmaW5lIE1DTV9BRERSX0dFTkVSSUMgNwkvKiBnZW5lcmljICovCisvKiBNQ2lfTUlTQyByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIE1DSV9NSVNDX0FERFJfTFNCKG0pCSgobSkgJiAweDNmKQorI2RlZmluZSBNQ0lfTUlTQ19BRERSX01PREUobSkJKCgobSkgPj4gNikgJiA3KQorI2RlZmluZSAgTUNJX01JU0NfQUREUl9TRUdPRkYJMAkvKiBzZWdtZW50IG9mZnNldCAqLworI2RlZmluZSAgTUNJX01JU0NfQUREUl9MSU5FQVIJMQkvKiBsaW5lYXIgYWRkcmVzcyAqLworI2RlZmluZSAgTUNJX01JU0NfQUREUl9QSFlTCTIJLyogcGh5c2ljYWwgYWRkcmVzcyAqLworI2RlZmluZSAgTUNJX01JU0NfQUREUl9NRU0JMwkvKiBtZW1vcnkgYWRkcmVzcyAqLworI2RlZmluZSAgTUNJX01JU0NfQUREUl9HRU5FUklDCTcJLyogZ2VuZXJpYyAqLwogCiAvKiBDVEwyIHJlZ2lzdGVyIGRlZmluZXMgKi8KICNkZWZpbmUgTUNJX0NUTDJfQ01DSV9FTgkJKDFVTEwgPDwgMzApCkBAIC0xNDQsNyArMTQ5LDcgQEAKIAogdm9pZCBtY2Vfc2V0dXAoc3RydWN0IG1jZSAqbSk7CiB2b2lkIG1jZV9sb2coc3RydWN0IG1jZSAqbSk7Ci1ERUNMQVJFX1BFUl9DUFUoc3RydWN0IHN5c19kZXZpY2UsIG1jZV9kZXYpOworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBzeXNfZGV2aWNlLCBtY2Vfc3lzZGV2KTsKIAogLyoKICAqIE1heGltdW0gYmFua3MgbnVtYmVyLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWVtYmxvY2suaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21lbWJsb2NrLmgKaW5kZXggMTlhZTE0Yi4uMGNkMzgwMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWVtYmxvY2suaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tZW1ibG9jay5oCkBAIC00LDcgKzQsNiBAQAogI2RlZmluZSBBUkNIX0RJU0NBUkRfTUVNQkxPQ0sKIAogdTY0IG1lbWJsb2NrX3g4Nl9maW5kX2luX3JhbmdlX3NpemUodTY0IHN0YXJ0LCB1NjQgKnNpemVwLCB1NjQgYWxpZ24pOwotdm9pZCBtZW1ibG9ja194ODZfdG9fYm9vdG1lbSh1NjQgc3RhcnQsIHU2NCBlbmQpOwogCiB2b2lkIG1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHU2NCBzdGFydCwgdTY0IGVuZCwgY2hhciAqbmFtZSk7CiB2b2lkIG1lbWJsb2NrX3g4Nl9mcmVlX3JhbmdlKHU2NCBzdGFydCwgdTY0IGVuZCk7CkBAIC0xOSw1ICsxOCw2IEBACiB1NjQgbWVtYmxvY2tfeDg2X2ZpbmRfaW5fcmFuZ2Vfbm9kZShpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBlbmQsIHU2NCBzaXplLCB1NjQgYWxpZ24pOwogdTY0IG1lbWJsb2NrX3g4Nl9mcmVlX21lbW9yeV9pbl9yYW5nZSh1NjQgYWRkciwgdTY0IGxpbWl0KTsKIHU2NCBtZW1ibG9ja194ODZfbWVtb3J5X2luX3JhbmdlKHU2NCBhZGRyLCB1NjQgbGltaXQpOworYm9vbCBtZW1ibG9ja194ODZfY2hlY2tfcmVzZXJ2ZWRfc2l6ZSh1NjQgKmFkZHJwLCB1NjQgKnNpemVwLCB1NjQgYWxpZ24pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV8zMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzMyLmgKaW5kZXggNWU4M2E0MS4uNTU3MjhlMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzMyLmgKQEAgLTM0LDMxICszNCwyMCBAQAogICogICAgNjRHYiAvIDQwOTZieXRlcy9wYWdlID0gMTY3NzcyMTYgcGFnZXMKICAqLwogI2RlZmluZSBNQVhfTlJfUEFHRVMgMTY3NzcyMTYKLSNkZWZpbmUgTUFYX0VMRU1FTlRTIDEwMjQKLSNkZWZpbmUgUEFHRVNfUEVSX0VMRU1FTlQgKE1BWF9OUl9QQUdFUy9NQVhfRUxFTUVOVFMpCisjZGVmaW5lIE1BWF9TRUNUSU9OUyAxMDI0CisjZGVmaW5lIFBBR0VTX1BFUl9TRUNUSU9OIChNQVhfTlJfUEFHRVMvTUFYX1NFQ1RJT05TKQogCiBleHRlcm4gczggcGh5c25vZGVfbWFwW107CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pCiB7CiAjaWZkZWYgQ09ORklHX05VTUEKLQlyZXR1cm4oKGludCkgcGh5c25vZGVfbWFwWyhwZm4pIC8gUEFHRVNfUEVSX0VMRU1FTlRdKTsKKwlyZXR1cm4oKGludCkgcGh5c25vZGVfbWFwWyhwZm4pIC8gUEFHRVNfUEVSX1NFQ1RJT05dKTsKICNlbHNlCiAJcmV0dXJuIDA7CiAjZW5kaWYKIH0KIAotLyoKLSAqIEZvbGxvd2luZyBhcmUgbWFjcm9zIHRoYXQgZWFjaCBudW1hIGltcGxtZW50YXRpb24gbXVzdCBkZWZpbmUuCi0gKi8KLQotI2RlZmluZSBub2RlX3N0YXJ0X3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCi0jZGVmaW5lIG5vZGVfZW5kX3BmbihuaWQpCQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JcGdfZGF0YV90ICpfX3BnZGF0ID0gTk9ERV9EQVRBKG5pZCk7CQkJCVwKLQlfX3BnZGF0LT5ub2RlX3N0YXJ0X3BmbiArIF9fcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsJCVwKLX0pCi0KIHN0YXRpYyBpbmxpbmUgaW50IHBmbl92YWxpZChpbnQgcGZuKQogewogCWludCBuaWQgPSBwZm5fdG9fbmlkKHBmbik7CkBAIC02OCw2ICs1Nyw4IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgZWFybHlfcGZuX3ZhbGlkKHBmbikJcGZuX3ZhbGlkKChwZm4pKQorCiAjZW5kaWYgLyogQ09ORklHX0RJU0NPTlRJR01FTSAqLwogCiAjaWZkZWYgQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tem9uZV82NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzY0LmgKaW5kZXggYjNmODhkNy4uMTI5ZDlhYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW16b25lXzY0LmgKQEAgLTEzLDggKzEzLDUgQEAKIAogI2RlZmluZSBOT0RFX0RBVEEobmlkKQkJKG5vZGVfZGF0YVtuaWRdKQogCi0jZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKLSNkZWZpbmUgbm9kZV9lbmRfcGZuKG5pZCkgICAgICAgKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbiArCVwKLQkJCQkgTk9ERV9EQVRBKG5pZCktPm5vZGVfc3Bhbm5lZF9wYWdlcykKICNlbmRpZgogI2VuZGlmIC8qIF9BU01fWDg2X01NWk9ORV82NF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCmluZGV4IDQ4NWI0ZjEuLmQ1MjYwOWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCkBAIC0yNTksNiArMjU5LDkgQEAKICNkZWZpbmUgTVNSX0lBMzJfVEVNUEVSQVRVUkVfVEFSR0VUCTB4MDAwMDAxYTIKIAogI2RlZmluZSBNU1JfSUEzMl9FTkVSR1lfUEVSRl9CSUFTCTB4MDAwMDAxYjAKKyNkZWZpbmUgRU5FUkdZX1BFUkZfQklBU19QRVJGT1JNQU5DRQkwCisjZGVmaW5lIEVORVJHWV9QRVJGX0JJQVNfTk9STUFMCQk2CisjZGVmaW5lIEVORVJHWV9QRVJGX0JJQVNfUE9XRVJTQVZFCTE1CiAKICNkZWZpbmUgTVNSX0lBMzJfUEFDS0FHRV9USEVSTV9TVEFUVVMJCTB4MDAwMDAxYjEKIApAQCAtNDM4LDYgKzQ0MSwxOCBAQAogI2RlZmluZSBNU1JfSUEzMl9WTVhfVk1DU19FTlVNICAgICAgICAgIDB4MDAwMDA0OGEKICNkZWZpbmUgTVNSX0lBMzJfVk1YX1BST0NCQVNFRF9DVExTMiAgICAweDAwMDAwNDhiCiAjZGVmaW5lIE1TUl9JQTMyX1ZNWF9FUFRfVlBJRF9DQVAgICAgICAgMHgwMDAwMDQ4YworI2RlZmluZSBNU1JfSUEzMl9WTVhfVFJVRV9QSU5CQVNFRF9DVExTICAweDAwMDAwNDhkCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9UUlVFX1BST0NCQVNFRF9DVExTIDB4MDAwMDA0OGUKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX1RSVUVfRVhJVF9DVExTICAgICAgMHgwMDAwMDQ4ZgorI2RlZmluZSBNU1JfSUEzMl9WTVhfVFJVRV9FTlRSWV9DVExTICAgICAweDAwMDAwNDkwCisKKy8qIFZNWF9CQVNJQyBiaXRzIGFuZCBiaXRtYXNrcyAqLworI2RlZmluZSBWTVhfQkFTSUNfVk1DU19TSVpFX1NISUZUCTMyCisjZGVmaW5lIFZNWF9CQVNJQ182NAkJMHgwMDAxMDAwMDAwMDAwMDAwTExVCisjZGVmaW5lIFZNWF9CQVNJQ19NRU1fVFlQRV9TSElGVAk1MAorI2RlZmluZSBWTVhfQkFTSUNfTUVNX1RZUEVfTUFTSwkweDAwM2MwMDAwMDAwMDAwMDBMTFUKKyNkZWZpbmUgVk1YX0JBU0lDX01FTV9UWVBFX1dCCTZMTFUKKyNkZWZpbmUgVk1YX0JBU0lDX0lOT1VUCQkweDAwNDAwMDAwMDAwMDAwMDBMTFUKIAogLyogQU1ELVYgTVNScyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaAppbmRleCBlYmJjNGQ4Li5hN2QyZGI5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKQEAgLTIzMCw2ICsyMzAsMTUgQEAKIAlyZXR1cm4gUFZPUF9DQUxMMCh1bnNpZ25lZCBsb25nIGxvbmcsIHB2X3RpbWVfb3BzLnNjaGVkX2Nsb2NrKTsKIH0KIAorc3RydWN0IGp1bXBfbGFiZWxfa2V5OworZXh0ZXJuIHN0cnVjdCBqdW1wX2xhYmVsX2tleSBwYXJhdmlydF9zdGVhbF9lbmFibGVkOworZXh0ZXJuIHN0cnVjdCBqdW1wX2xhYmVsX2tleSBwYXJhdmlydF9zdGVhbF9ycV9lbmFibGVkOworCitzdGF0aWMgaW5saW5lIHU2NCBwYXJhdmlydF9zdGVhbF9jbG9jayhpbnQgY3B1KQoreworCXJldHVybiBQVk9QX0NBTEwxKHU2NCwgcHZfdGltZV9vcHMuc3RlYWxfY2xvY2ssIGNwdSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIHBhcmF2aXJ0X3JlYWRfcG1jKGludCBjb3VudGVyKQogewogCXJldHVybiBQVk9QX0NBTEwxKHU2NCwgcHZfY3B1X29wcy5yZWFkX3BtYywgY291bnRlcik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnRfdHlwZXMuaAppbmRleCA4Mjg4NTA5Li4yYzc2NTIxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0X3R5cGVzLmgKQEAgLTg5LDYgKzg5LDcgQEAKIAogc3RydWN0IHB2X3RpbWVfb3BzIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgKCpzY2hlZF9jbG9jaykodm9pZCk7CisJdW5zaWduZWQgbG9uZyBsb25nICgqc3RlYWxfY2xvY2spKGludCBjcHUpOwogCXVuc2lnbmVkIGxvbmcgKCpnZXRfdHNjX2toeikodm9pZCk7CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJjcHUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmNwdS5oCmluZGV4IGEwYTk3NzkuLjM0NzBjOWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmNwdS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmNwdS5oCkBAIC0zODgsMTIgKzM4OCw5IEBACiAjZGVmaW5lIF9fdGhpc19jcHVfeG9yXzEocGNwLCB2YWwpCXBlcmNwdV90b19vcCgieG9yIiwgKHBjcCksIHZhbCkKICNkZWZpbmUgX190aGlzX2NwdV94b3JfMihwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJ4b3IiLCAocGNwKSwgdmFsKQogI2RlZmluZSBfX3RoaXNfY3B1X3hvcl80KHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoInhvciIsIChwY3ApLCB2YWwpCi0vKgotICogR2VuZXJpYyBmYWxsYmFjayBvcGVyYXRpb25zIGZvciBfX3RoaXNfY3B1X3hjaGdfWzEtNF0gYXJlIG9rYXkgYW5kIG11Y2gKLSAqIGZhc3RlciB0aGFuIGFuIHhjaGcgd2l0aCBmb3JjZWQgbG9jayBzZW1hbnRpY3MuCi0gKi8KLSNkZWZpbmUgX190aGlzX2NwdV94Y2hnXzgocGNwLCBudmFsKQlwZXJjcHVfeGNoZ19vcChwY3AsIG52YWwpCi0jZGVmaW5lIF9fdGhpc19jcHVfY21weGNoZ184KHBjcCwgb3ZhbCwgbnZhbCkJcGVyY3B1X2NtcHhjaGdfb3AocGNwLCBvdmFsLCBudmFsKQorI2RlZmluZSBfX3RoaXNfY3B1X3hjaGdfMShwY3AsIHZhbCkJcGVyY3B1X3hjaGdfb3AocGNwLCB2YWwpCisjZGVmaW5lIF9fdGhpc19jcHVfeGNoZ18yKHBjcCwgdmFsKQlwZXJjcHVfeGNoZ19vcChwY3AsIHZhbCkKKyNkZWZpbmUgX190aGlzX2NwdV94Y2hnXzQocGNwLCB2YWwpCXBlcmNwdV94Y2hnX29wKHBjcCwgdmFsKQogCiAjZGVmaW5lIHRoaXNfY3B1X3JlYWRfMShwY3ApCQlwZXJjcHVfZnJvbV9vcCgibW92IiwgKHBjcCksICJtIihwY3ApKQogI2RlZmluZSB0aGlzX2NwdV9yZWFkXzIocGNwKQkJcGVyY3B1X2Zyb21fb3AoIm1vdiIsIChwY3ApLCAibSIocGNwKSkKQEAgLTQ4NSw2ICs0ODIsOCBAQAogI2RlZmluZSBfX3RoaXNfY3B1X29yXzgocGNwLCB2YWwpCXBlcmNwdV90b19vcCgib3IiLCAocGNwKSwgdmFsKQogI2RlZmluZSBfX3RoaXNfY3B1X3hvcl84KHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoInhvciIsIChwY3ApLCB2YWwpCiAjZGVmaW5lIF9fdGhpc19jcHVfYWRkX3JldHVybl84KHBjcCwgdmFsKSBwZXJjcHVfYWRkX3JldHVybl9vcChwY3AsIHZhbCkKKyNkZWZpbmUgX190aGlzX2NwdV94Y2hnXzgocGNwLCBudmFsKQlwZXJjcHVfeGNoZ19vcChwY3AsIG52YWwpCisjZGVmaW5lIF9fdGhpc19jcHVfY21weGNoZ184KHBjcCwgb3ZhbCwgbnZhbCkJcGVyY3B1X2NtcHhjaGdfb3AocGNwLCBvdmFsLCBudmFsKQogCiAjZGVmaW5lIHRoaXNfY3B1X3JlYWRfOChwY3ApCQlwZXJjcHVfZnJvbV9vcCgibW92IiwgKHBjcCksICJtIihwY3ApKQogI2RlZmluZSB0aGlzX2NwdV93cml0ZV84KHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoIm1vdiIsIChwY3ApLCB2YWwpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmgKaW5kZXggZDlkNGRhZTMuLjA5NGZiMzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmgKQEAgLTE1Miw2ICsxNTIsMTEgQEAKIAkocmVncyktPmJwID0gY2FsbGVyX2ZyYW1lX3BvaW50ZXIoKTsJCQlcCiAJKHJlZ3MpLT5jcyA9IF9fS0VSTkVMX0NTOwkJCQlcCiAJcmVncy0+ZmxhZ3MgPSAwOwkJCQkJXAorCWFzbSB2b2xhdGlsZSgJCQkJCQlcCisJCV9BU01fTU9WICIlJSJfQVNNX1NQICIsICUwXG4iCQkJXAorCQk6ICI9bSIgKChyZWdzKS0+c3ApCQkJCVwKKwkJOjogIm1lbW9yeSIJCQkJCVwKKwkpOwkJCQkJCQlcCiB9CiAKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50X3A0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50X3A0LmgKaW5kZXggNTZmZDllMy4uNGY3ZTY3ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyZl9ldmVudF9wNC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmZfZXZlbnRfcDQuaApAQCAtMTAyLDYgKzEwMiwxNCBAQAogI2RlZmluZSBQNF9DT05GSUdfSFQJCQkoMVVMTCA8PCBQNF9DT05GSUdfSFRfU0hJRlQpCiAKIC8qCisgKiBJZiBhbiBldmVudCBoYXMgYWxpYXMgaXQgc2hvdWxkIGJlIG1hcmtlZAorICogd2l0aCBhIHNwZWNpYWwgYml0LiAoRG9uJ3QgZm9yZ2V0IHRvIGNoZWNrCisgKiBQNF9QRUJTX0NPTkZJR19NQVNLIGFuZCByZWxhdGVkIGJpdHMgb24KKyAqIG1vZGlmaWNhdGlvbi4pCisgKi8KKyNkZWZpbmUgUDRfQ09ORklHX0FMSUFTQUJMRQkJKDEgPDwgOSkKKworLyoKICAqIFRoZSBiaXRzIHdlIGFsbG93IHRvIHBhc3MgZm9yIFJBVyBldmVudHMKICAqLwogI2RlZmluZSBQNF9DT05GSUdfTUFTS19FU0NSCQlcCkBAIC0xMjMsNiArMTMxLDMxIEBACiAJKHA0X2NvbmZpZ19wYWNrX2VzY3IoUDRfQ09ORklHX01BU0tfRVNDUikpCXwgXAogCShwNF9jb25maWdfcGFja19jY2NyKFA0X0NPTkZJR19NQVNLX0NDQ1IpKQogCisvKgorICogSW4gY2FzZSBvZiBldmVudCBhbGlhc2luZyB3ZSBuZWVkIHRvIHByZXNlcnZlIHNvbWUKKyAqIGNhbGxlciBiaXRzLCBvdGhlcndpc2UgdGhlIG1hcHBpbmcgd29uJ3QgYmUgY29tcGxldGUuCisgKi8KKyNkZWZpbmUgUDRfQ09ORklHX0VWRU5UX0FMSUFTX01BU0sJCQkgIFwKKwkocDRfY29uZmlnX3BhY2tfZXNjcihQNF9DT05GSUdfTUFTS19FU0NSKQl8IFwKKwkgcDRfY29uZmlnX3BhY2tfY2NjcihQNF9DQ0NSX0VER0UJCXwgXAorCQkJICAgICBQNF9DQ0NSX1RIUkVTSE9MRF9NQVNLCXwgXAorCQkJICAgICBQNF9DQ0NSX0NPTVBMRU1FTlQJCXwgXAorCQkJICAgICBQNF9DQ0NSX0NPTVBBUkUpKQorCisjZGVmaW5lICBQNF9DT05GSUdfRVZFTlRfQUxJQVNfSU1NVVRBQkxFX0JJVFMJCSAgXAorCSgoUDRfQ09ORklHX0hUKQkJCQkJfCBcCisJIHA0X2NvbmZpZ19wYWNrX2VzY3IoUDRfRVNDUl9UMF9PUwkJfCBcCisJCQkgICAgIFA0X0VTQ1JfVDBfVVNSCQl8IFwKKwkJCSAgICAgUDRfRVNDUl9UMV9PUwkJfCBcCisJCQkgICAgIFA0X0VTQ1JfVDFfVVNSKQkJfCBcCisJIHA0X2NvbmZpZ19wYWNrX2NjY3IoUDRfQ0NDUl9PVkYJCXwgXAorCQkJICAgICBQNF9DQ0NSX0NBU0NBREUJCXwgXAorCQkJICAgICBQNF9DQ0NSX0ZPUkNFX09WRgkJfCBcCisJCQkgICAgIFA0X0NDQ1JfVEhSRUFEX0FOWQkJfCBcCisJCQkgICAgIFA0X0NDQ1JfT1ZGX1BNSV9UMAkJfCBcCisJCQkgICAgIFA0X0NDQ1JfT1ZGX1BNSV9UMQkJfCBcCisJCQkgICAgIFA0X0NPTkZJR19BTElBU0FCTEUpKQorCiBzdGF0aWMgaW5saW5lIGJvb2wgcDRfaXNfZXZlbnRfY2FzY2FkZWQodTY0IGNvbmZpZykKIHsKIAl1MzIgY2NjciA9IHA0X2NvbmZpZ191bnBhY2tfY2Njcihjb25maWcpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oCmluZGV4IGQ1NjE4N2MuLjAxMzI4NmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmgKQEAgLTEwNyw3ICsxMDcsOCBAQAogI2RlZmluZSBfX1BBR0VfS0VSTkVMX05PQ0FDSEUJCShfX1BBR0VfS0VSTkVMIHwgX1BBR0VfUENEIHwgX1BBR0VfUFdUKQogI2RlZmluZSBfX1BBR0VfS0VSTkVMX1VDX01JTlVTCQkoX19QQUdFX0tFUk5FTCB8IF9QQUdFX1BDRCkKICNkZWZpbmUgX19QQUdFX0tFUk5FTF9WU1lTQ0FMTAkJKF9fUEFHRV9LRVJORUxfUlggfCBfUEFHRV9VU0VSKQotI2RlZmluZSBfX1BBR0VfS0VSTkVMX1ZTWVNDQUxMX05PQ0FDSEUJKF9fUEFHRV9LRVJORUxfVlNZU0NBTEwgfCBfUEFHRV9QQ0QgfCBfUEFHRV9QV1QpCisjZGVmaW5lIF9fUEFHRV9LRVJORUxfVlZBUgkJKF9fUEFHRV9LRVJORUxfUk8gfCBfUEFHRV9VU0VSKQorI2RlZmluZSBfX1BBR0VfS0VSTkVMX1ZWQVJfTk9DQUNIRQkoX19QQUdFX0tFUk5FTF9WVkFSIHwgX1BBR0VfUENEIHwgX1BBR0VfUFdUKQogI2RlZmluZSBfX1BBR0VfS0VSTkVMX0xBUkdFCQkoX19QQUdFX0tFUk5FTCB8IF9QQUdFX1BTRSkKICNkZWZpbmUgX19QQUdFX0tFUk5FTF9MQVJHRV9OT0NBQ0hFCShfX1BBR0VfS0VSTkVMIHwgX1BBR0VfQ0FDSEVfVUMgfCBfUEFHRV9QU0UpCiAjZGVmaW5lIF9fUEFHRV9LRVJORUxfTEFSR0VfRVhFQwkoX19QQUdFX0tFUk5FTF9FWEVDIHwgX1BBR0VfUFNFKQpAQCAtMTI5LDcgKzEzMCw4IEBACiAjZGVmaW5lIFBBR0VfS0VSTkVMX0xBUkdFX05PQ0FDSEUJX19wZ3Byb3QoX19QQUdFX0tFUk5FTF9MQVJHRV9OT0NBQ0hFKQogI2RlZmluZSBQQUdFX0tFUk5FTF9MQVJHRV9FWEVDCQlfX3BncHJvdChfX1BBR0VfS0VSTkVMX0xBUkdFX0VYRUMpCiAjZGVmaW5lIFBBR0VfS0VSTkVMX1ZTWVNDQUxMCQlfX3BncHJvdChfX1BBR0VfS0VSTkVMX1ZTWVNDQUxMKQotI2RlZmluZSBQQUdFX0tFUk5FTF9WU1lTQ0FMTF9OT0NBQ0hFCV9fcGdwcm90KF9fUEFHRV9LRVJORUxfVlNZU0NBTExfTk9DQUNIRSkKKyNkZWZpbmUgUEFHRV9LRVJORUxfVlZBUgkJX19wZ3Byb3QoX19QQUdFX0tFUk5FTF9WVkFSKQorI2RlZmluZSBQQUdFX0tFUk5FTF9WVkFSX05PQ0FDSEUJX19wZ3Byb3QoX19QQUdFX0tFUk5FTF9WVkFSX05PQ0FDSEUpCiAKICNkZWZpbmUgUEFHRV9LRVJORUxfSU8JCQlfX3BncHJvdChfX1BBR0VfS0VSTkVMX0lPKQogI2RlZmluZSBQQUdFX0tFUk5FTF9JT19OT0NBQ0hFCQlfX3BncHJvdChfX1BBR0VfS0VSTkVMX0lPX05PQ0FDSEUpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3ItZmxhZ3MuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci1mbGFncy5oCmluZGV4IDU5YWI0ZGYuLjJkZGRiMzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci1mbGFncy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci1mbGFncy5oCkBAIC01OSw2ICs1OSw3IEBACiAjZGVmaW5lIFg4Nl9DUjRfT1NGWFNSCTB4MDAwMDAyMDAgLyogZW5hYmxlIGZhc3QgRlBVIHNhdmUgYW5kIHJlc3RvcmUgKi8KICNkZWZpbmUgWDg2X0NSNF9PU1hNTUVYQ1BUIDB4MDAwMDA0MDAgLyogZW5hYmxlIHVubWFza2VkIFNTRSBleGNlcHRpb25zICovCiAjZGVmaW5lIFg4Nl9DUjRfVk1YRQkweDAwMDAyMDAwIC8qIGVuYWJsZSBWTVggdmlydHVhbGl6YXRpb24gKi8KKyNkZWZpbmUgWDg2X0NSNF9SRFdSR1NGUyAweDAwMDEwMDAwIC8qIGVuYWJsZSBSRFdSR1NGUyBzdXBwb3J0ICovCiAjZGVmaW5lIFg4Nl9DUjRfT1NYU0FWRSAweDAwMDQwMDAwIC8qIGVuYWJsZSB4c2F2ZSBhbmQgeHJlc3RvcmUgKi8KICNkZWZpbmUgWDg2X0NSNF9TTUVQCTB4MDAxMDAwMDAgLyogZW5hYmxlIFNNRVAgc3VwcG9ydCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9tLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9tLmgKaW5kZXggOTcxZTBiNC4uZGYxMjg3MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvbS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb20uaApAQCAtMzAsMTcgKzMwLDYgQEAKIGV4dGVybiB2b2lkIHg4Nl9hZGRfaXJxX2RvbWFpbnModm9pZCk7CiB2b2lkIF9fY3B1aW5pdCB4ODZfb2ZfcGNpX2luaXQodm9pZCk7CiB2b2lkIHg4Nl9kdGJfaW5pdCh2b2lkKTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBjaV9kZXZpY2VfdG9fT0Zfbm9kZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlyZXR1cm4gcGRldiA/IHBkZXYtPmRldi5vZl9ub2RlIDogTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBjaV9idXNfdG9fT0Zfbm9kZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCXJldHVybiBwY2lfZGV2aWNlX3RvX09GX25vZGUoYnVzLT5zZWxmKTsKLX0KLQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfZHRiKHU2NCBkYXRhKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB4ODZfYWRkX2lycV9kb21haW5zKHZvaWQpIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oCmluZGV4IDMxZDg0YWMuLmE1MThjMGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B2Y2xvY2suaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdmNsb2NrLmgKQEAgLTIyLDYgKzIyLDggQEAKIAl1NjQgcHJvZHVjdDsKICNpZmRlZiBfX2kzODZfXwogCXUzMiB0bXAxLCB0bXAyOworI2Vsc2UKKwl1bG9uZyB0bXA7CiAjZW5kaWYKIAogCWlmIChzaGlmdCA8IDApCkBAIC00Miw4ICs0NCwxMSBAQAogCQk6ICJhIiAoKHUzMilkZWx0YSksICIxIiAoKHUzMikoZGVsdGEgPj4gMzIpKSwgIjIiIChtdWxfZnJhYykgKTsKICNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKIAlfX2FzbV9fICgKLQkJIm11bCAlJXJkeCA7IHNocmQgJDMyLCUlcmR4LCUlcmF4IgotCQk6ICI9YSIgKHByb2R1Y3QpIDogIjAiIChkZWx0YSksICJkIiAoKHU2NCltdWxfZnJhYykgKTsKKwkJIm11bCAlW211bF9mcmFjXSA7IHNocmQgJDMyLCAlW2hpXSwgJVtsb10iCisJCTogW2xvXSI9YSIocHJvZHVjdCksCisJCSAgW2hpXSI9ZCIodG1wKQorCQk6ICIwIihkZWx0YSksCisJCSAgW211bF9mcmFjXSJybSIoKHU2NCltdWxfZnJhYykpOwogI2Vsc2UKICNlcnJvciBpbXBsZW1lbnQgbWUhCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3J3bG9jay5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcndsb2NrLmgKaW5kZXggNmE4YzBkNi4uYTUzNzBhMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcndsb2NrLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcndsb2NrLmgKQEAgLTEsNyArMSw0OCBAQAogI2lmbmRlZiBfQVNNX1g4Nl9SV0xPQ0tfSAogI2RlZmluZSBfQVNNX1g4Nl9SV0xPQ0tfSAogCi0jZGVmaW5lIFJXX0xPQ0tfQklBUwkJIDB4MDEwMDAwMDAKKyNpbmNsdWRlIDxhc20vYXNtLmg+CisKKyNpZiBDT05GSUdfTlJfQ1BVUyA8PSAyMDQ4CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCit0eXBlZGVmIHVuaW9uIHsKKwlzMzIgbG9jazsKKwlzMzIgd3JpdGU7Cit9IGFyY2hfcndsb2NrX3Q7CisjZW5kaWYKKworI2RlZmluZSBSV19MT0NLX0JJQVMJCTB4MDAxMDAwMDAKKyNkZWZpbmUgUkVBRF9MT0NLX1NJWkUoaW5zbikJX19BU01fRk9STShpbnNuIyNsKQorI2RlZmluZSBSRUFEX0xPQ0tfQVRPTUlDKG4pCWF0b21pY18jI24KKyNkZWZpbmUgV1JJVEVfTE9DS19BREQobikJX19BU01fRk9STV9DT01NQShhZGRsIG4pCisjZGVmaW5lIFdSSVRFX0xPQ0tfU1VCKG4pCV9fQVNNX0ZPUk1fQ09NTUEoc3VibCBuKQorI2RlZmluZSBXUklURV9MT0NLX0NNUAkJUldfTE9DS19CSUFTCisKKyNlbHNlIC8qIENPTkZJR19OUl9DUFVTID4gMjA0OCAqLworCisjaW5jbHVkZSA8bGludXgvY29uc3QuaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3R5cGVkZWYgdW5pb24geworCXM2NCBsb2NrOworCXN0cnVjdCB7CisJCXUzMiByZWFkOworCQlzMzIgd3JpdGU7CisJfTsKK30gYXJjaF9yd2xvY2tfdDsKKyNlbmRpZgorCisjZGVmaW5lIFJXX0xPQ0tfQklBUwkJKF9BQygxLEwpIDw8IDMyKQorI2RlZmluZSBSRUFEX0xPQ0tfU0laRShpbnNuKQlfX0FTTV9GT1JNKGluc24jI3EpCisjZGVmaW5lIFJFQURfTE9DS19BVE9NSUMobikJYXRvbWljNjRfIyNuCisjZGVmaW5lIFdSSVRFX0xPQ0tfQUREKG4pCV9fQVNNX0ZPUk0oaW5jbCkKKyNkZWZpbmUgV1JJVEVfTE9DS19TVUIobikJX19BU01fRk9STShkZWNsKQorI2RlZmluZSBXUklURV9MT0NLX0NNUAkJMQorCisjZW5kaWYgLyogQ09ORklHX05SX0NQVVMgKi8KKworI2RlZmluZSBfX0FSQ0hfUldfTE9DS19VTkxPQ0tFRAkJeyBSV19MT0NLX0JJQVMgfQogCiAvKiBBY3R1YWwgY29kZSBpcyBpbiBhc20vc3BpbmxvY2suaCBvciBpbiBhcmNoL3g4Ni9saWIvcndsb2NrLlMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2VnbWVudC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2VnbWVudC5oCmluZGV4IGNkODRmNzIuLjVlNjQxNzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NlZ21lbnQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZWdtZW50LmgKQEAgLTE2Miw3ICsxNjIsNyBAQAogI2RlZmluZSBHRFRfRU5UUllfREVGQVVMVF9VU0VSMzJfQ1MgNAogI2RlZmluZSBHRFRfRU5UUllfREVGQVVMVF9VU0VSX0RTIDUKICNkZWZpbmUgR0RUX0VOVFJZX0RFRkFVTFRfVVNFUl9DUyA2Ci0jZGVmaW5lIF9fVVNFUjMyX0NTICAgKEdEVF9FTlRSWV9ERUZBVUxUX1VTRVIzMl9DUyAqIDggKyAzKQorI2RlZmluZSBfX1VTRVIzMl9DUyAgIChHRFRfRU5UUllfREVGQVVMVF9VU0VSMzJfQ1MqOCszKQogI2RlZmluZSBfX1VTRVIzMl9EUwlfX1VTRVJfRFMKIAogI2RlZmluZSBHRFRfRU5UUllfVFNTIDgJLyogbmVlZHMgdHdvIGVudHJpZXMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NtcGJvb3RfaG9va3MuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NtcGJvb3RfaG9va3MuaAppbmRleCA3MjViNzc4Li40OWFkZmQ3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXBib290X2hvb2tzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wYm9vdF9ob29rcy5oCkBAIC0xMCw3ICsxMCwxMSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc21wYm9vdF9zZXR1cF93YXJtX3Jlc2V0X3ZlY3Rvcih1bnNpZ25lZCBsb25nIHN0YXJ0X2VpcCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CiAJQ01PU19XUklURSgweGEsIDB4Zik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKIAlsb2NhbF9mbHVzaF90bGIoKTsKIAlwcl9kZWJ1ZygiMS5cbiIpOwogCSooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcGh5c190b192aXJ0KGFwaWMtPnRyYW1wb2xpbmVfcGh5c19oaWdoKSkgPQpAQCAtMjMsNiArMjcsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc21wYm9vdF9yZXN0b3JlX3dhcm1fcmVzZXRfdmVjdG9yKHZvaWQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwogCS8qCiAJICogSW5zdGFsbCB3cml0YWJsZSBwYWdlIDAgZW50cnkgdG8gc2V0IEJJT1MgZGF0YSBhcmVhLgogCSAqLwpAQCAtMzIsNyArMzgsOSBAQAogCSAqIFBhcmFub2lkOiAgU2V0IHdhcm0gcmVzZXQgY29kZSBhbmQgdmVjdG9yIGhlcmUgYmFjawogCSAqIHRvIGRlZmF1bHQgdmFsdWVzLgogCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOwogCUNNT1NfV1JJVEUoMCwgMHhmKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOwogCiAJKigodm9sYXRpbGUgdTMyICopcGh5c190b192aXJ0KGFwaWMtPnRyYW1wb2xpbmVfcGh5c19sb3cpKSA9IDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9jay5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaAppbmRleCAzMDg5ZjcwLi5lOWU1MWY3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9jay5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKQEAgLTIsNyArMiw2IEBACiAjZGVmaW5lIF9BU01fWDg2X1NQSU5MT0NLX0gKIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vcndsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KQEAgLTIzNCw3ICsyMzMsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBhcmNoX3JlYWRfY2FuX2xvY2soYXJjaF9yd2xvY2tfdCAqbG9jaykKIHsKLQlyZXR1cm4gKGludCkobG9jayktPmxvY2sgPiAwOworCXJldHVybiBsb2NrLT5sb2NrID4gMDsKIH0KIAogLyoqCkBAIC0yNDMsMTIgKzI0MiwxMiBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBhcmNoX3dyaXRlX2Nhbl9sb2NrKGFyY2hfcndsb2NrX3QgKmxvY2spCiB7Ci0JcmV0dXJuIChsb2NrKS0+bG9jayA9PSBSV19MT0NLX0JJQVM7CisJcmV0dXJuIGxvY2stPndyaXRlID09IFdSSVRFX0xPQ0tfQ01QOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZWFkX2xvY2soYXJjaF9yd2xvY2tfdCAqcncpCiB7Ci0JYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICIgc3VibCAkMSwoJTApXG5cdCIKKwlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggUkVBRF9MT0NLX1NJWkUoZGVjKSAiICglMClcblx0IgogCQkgICAgICJqbnMgMWZcbiIKIAkJICAgICAiY2FsbCBfX3JlYWRfbG9ja19mYWlsZWRcblx0IgogCQkgICAgICIxOlxuIgpAQCAtMjU3LDQ3ICsyNTYsNTUgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfd3JpdGVfbG9jayhhcmNoX3J3bG9ja190ICpydykKIHsKLQlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggIiBzdWJsICUxLCglMClcblx0IgorCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCBXUklURV9MT0NLX1NVQiglMSkgIiglMClcblx0IgogCQkgICAgICJqeiAxZlxuIgogCQkgICAgICJjYWxsIF9fd3JpdGVfbG9ja19mYWlsZWRcblx0IgogCQkgICAgICIxOlxuIgotCQkgICAgIDo6TE9DS19QVFJfUkVHIChydyksICJpIiAoUldfTE9DS19CSUFTKSA6ICJtZW1vcnkiKTsKKwkJICAgICA6OkxPQ0tfUFRSX1JFRyAoJnJ3LT53cml0ZSksICJpIiAoUldfTE9DS19CSUFTKQorCQkgICAgIDogIm1lbW9yeSIpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhcmNoX3JlYWRfdHJ5bG9jayhhcmNoX3J3bG9ja190ICpsb2NrKQogewotCWF0b21pY190ICpjb3VudCA9IChhdG9taWNfdCAqKWxvY2s7CisJUkVBRF9MT0NLX0FUT01JQyh0KSAqY291bnQgPSAoUkVBRF9MT0NLX0FUT01JQyh0KSAqKWxvY2s7CiAKLQlpZiAoYXRvbWljX2RlY19yZXR1cm4oY291bnQpID49IDApCisJaWYgKFJFQURfTE9DS19BVE9NSUMoZGVjX3JldHVybikoY291bnQpID49IDApCiAJCXJldHVybiAxOwotCWF0b21pY19pbmMoY291bnQpOworCVJFQURfTE9DS19BVE9NSUMoaW5jKShjb3VudCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFyY2hfd3JpdGVfdHJ5bG9jayhhcmNoX3J3bG9ja190ICpsb2NrKQogewotCWF0b21pY190ICpjb3VudCA9IChhdG9taWNfdCAqKWxvY2s7CisJYXRvbWljX3QgKmNvdW50ID0gKGF0b21pY190ICopJmxvY2stPndyaXRlOwogCi0JaWYgKGF0b21pY19zdWJfYW5kX3Rlc3QoUldfTE9DS19CSUFTLCBjb3VudCkpCisJaWYgKGF0b21pY19zdWJfYW5kX3Rlc3QoV1JJVEVfTE9DS19DTVAsIGNvdW50KSkKIAkJcmV0dXJuIDE7Ci0JYXRvbWljX2FkZChSV19MT0NLX0JJQVMsIGNvdW50KTsKKwlhdG9taWNfYWRkKFdSSVRFX0xPQ0tfQ01QLCBjb3VudCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3JlYWRfdW5sb2NrKGFyY2hfcndsb2NrX3QgKnJ3KQogewotCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCAiaW5jbCAlMCIgOiIrbSIgKHJ3LT5sb2NrKSA6IDogIm1lbW9yeSIpOworCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCBSRUFEX0xPQ0tfU0laRShpbmMpICIgJTAiCisJCSAgICAgOiIrbSIgKHJ3LT5sb2NrKSA6IDogIm1lbW9yeSIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF93cml0ZV91bmxvY2soYXJjaF9yd2xvY2tfdCAqcncpCiB7Ci0JYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICJhZGRsICUxLCAlMCIKLQkJICAgICA6ICIrbSIgKHJ3LT5sb2NrKSA6ICJpIiAoUldfTE9DS19CSUFTKSA6ICJtZW1vcnkiKTsKKwlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggV1JJVEVfTE9DS19BREQoJTEpICIlMCIKKwkJICAgICA6ICIrbSIgKHJ3LT53cml0ZSkgOiAiaSIgKFJXX0xPQ0tfQklBUykgOiAibWVtb3J5Iik7CiB9CiAKICNkZWZpbmUgYXJjaF9yZWFkX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIGFyY2hfcmVhZF9sb2NrKGxvY2spCiAjZGVmaW5lIGFyY2hfd3JpdGVfbG9ja19mbGFncyhsb2NrLCBmbGFncykgYXJjaF93cml0ZV9sb2NrKGxvY2spCiAKKyN1bmRlZiBSRUFEX0xPQ0tfU0laRQorI3VuZGVmIFJFQURfTE9DS19BVE9NSUMKKyN1bmRlZiBXUklURV9MT0NLX0FERAorI3VuZGVmIFdSSVRFX0xPQ0tfU1VCCisjdW5kZWYgV1JJVEVfTE9DS19DTVAKKwogI2RlZmluZSBhcmNoX3NwaW5fcmVsYXgobG9jaykJY3B1X3JlbGF4KCkKICNkZWZpbmUgYXJjaF9yZWFkX3JlbGF4KGxvY2spCWNwdV9yZWxheCgpCiAjZGVmaW5lIGFyY2hfd3JpdGVfcmVsYXgobG9jaykJY3B1X3JlbGF4KCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oCmluZGV4IGRjYjQ4YjIuLjdjN2E0ODYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaApAQCAtMTEsMTAgKzExLDYgQEAKIAogI2RlZmluZSBfX0FSQ0hfU1BJTl9MT0NLX1VOTE9DS0VECXsgMCB9CiAKLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQgbG9jazsKLX0gYXJjaF9yd2xvY2tfdDsKLQotI2RlZmluZSBfX0FSQ0hfUldfTE9DS19VTkxPQ0tFRAkJeyBSV19MT0NLX0JJQVMgfQorI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KIAogI2VuZGlmIC8qIF9BU01fWDg2X1NQSU5MT0NLX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RpbWUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RpbWUuaAppbmRleCA3YmRlYzRlLi45MmI4YWVjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aW1lLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdGltZS5oCkBAIC0xLDEwICsxLDEyIEBACiAjaWZuZGVmIF9BU01fWDg2X1RJTUVfSAogI2RlZmluZSBfQVNNX1g4Nl9USU1FX0gKIAotZXh0ZXJuIHZvaWQgaHBldF90aW1lX2luaXQodm9pZCk7Ci0KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGFzbS9tYzE0NjgxOHJ0Yy5oPgogCitleHRlcm4gdm9pZCBocGV0X3RpbWVfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHRpbWVfaW5pdCh2b2lkKTsKIAorZXh0ZXJuIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmdsb2JhbF9jbG9ja19ldmVudDsKKwogI2VuZGlmIC8qIF9BU01fWDg2X1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdHJhcHMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmgKaW5kZXggMDMxMGRhNi4uMmJhZTBhNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdHJhcHMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90cmFwcy5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfQVNNX1g4Nl9UUkFQU19ICiAjZGVmaW5lIF9BU01fWDg2X1RSQVBTX0gKIAorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKwogI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgogI2luY2x1ZGUgPGFzbS9zaWdpbmZvLmg+CQkJLyogVFJBUF9UUkFDRSwgLi4uICovCiAKQEAgLTM4LDYgKzQwLDcgQEAKIGFzbWxpbmthZ2Ugdm9pZCBtYWNoaW5lX2NoZWNrKHZvaWQpOwogI2VuZGlmIC8qIENPTkZJR19YODZfTUNFICovCiBhc21saW5rYWdlIHZvaWQgc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcih2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBlbXVsYXRlX3ZzeXNjYWxsKHZvaWQpOwogCiBkb3RyYXBsaW5rYWdlIHZvaWQgZG9fZGl2aWRlX2Vycm9yKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwogZG90cmFwbGlua2FnZSB2b2lkIGRvX2RlYnVnKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwpAQCAtNjQsNiArNjcsNyBAQAogZG90cmFwbGlua2FnZSB2b2lkIGRvX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7CiAjZW5kaWYKIGRvdHJhcGxpbmthZ2Ugdm9pZCBkb19zaW1kX2NvcHJvY2Vzc29yX2Vycm9yKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworZG90cmFwbGlua2FnZSB2b2lkIGRvX2VtdWxhdGVfdnN5c2NhbGwoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7CiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogZG90cmFwbGlua2FnZSB2b2lkIGRvX2lyZXRfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RzYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdHNjLmgKaW5kZXggOWRiNTU4My4uODNlMmVmZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdHNjLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdHNjLmgKQEAgLTUxLDEwICs1MSw2IEBACiBleHRlcm4gaW50IGNoZWNrX3RzY191bnN0YWJsZSh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG5hdGl2ZV9jYWxpYnJhdGVfdHNjKHZvaWQpOwogCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotZXh0ZXJuIGN5Y2xlc190IHZyZWFkX3RzYyh2b2lkKTsKLSNlbmRpZgotCiAvKgogICogQm9vdC10aW1lIGNoZWNrIHdoZXRoZXIgdGhlIFRTQ3MgYXJlIHN5bmNocm9uaXplZCBhY3Jvc3MKICAqIGFsbCBDUFVzL2NvcmVzOgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDk5ZGRkMTQuLjM2MzYxYmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTU1NSw2ICs1NTUsOSBAQAogCiAjZW5kaWYgLyogQ09ORklHX1g4Nl9XUF9XT1JLU19PSyAqLwogCitleHRlcm4gdW5zaWduZWQgbG9uZworY29weV9mcm9tX3VzZXJfbm1pKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKTsKKwogLyoKICAqIG1vdnNsIGNhbiBiZSBzbG93IHdoZW4gc291cmNlIGFuZCBkZXN0IGFyZSBub3QgYm90aCA4LWJ5dGUgYWxpZ25lZAogICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9iYXUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2JhdS5oCmluZGV4IGEyOTFjNDAuLjM3ZDM2OTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2JhdS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2JhdS5oCkBAIC02Nyw3ICs2Nyw3IEBACiAgKiAgd2UncmUgdXNpbmcgNjU1dXMsIHNpbWlsYXIgdG8gVVYxOiA2NSB1bml0cyBvZiAxMHVzCiAgKi8KICNkZWZpbmUgVVYxX0lOVERfU09GVF9BQ0tfVElNRU9VVF9QRVJJT0QgKDlVTCkKLSNkZWZpbmUgVVYyX0lOVERfU09GVF9BQ0tfVElNRU9VVF9QRVJJT0QgKDY1KjEwVUwpCisjZGVmaW5lIFVWMl9JTlREX1NPRlRfQUNLX1RJTUVPVVRfUEVSSU9EICgxNVVMKQogCiAjZGVmaW5lIFVWX0lOVERfU09GVF9BQ0tfVElNRU9VVF9QRVJJT0QJKGlzX3V2MV9odWIoKSA/CQkJXAogCQlVVjFfSU5URF9TT0ZUX0FDS19USU1FT1VUX1BFUklPRCA6CQkJXApAQCAtMTA2LDEyICsxMDYsMjAgQEAKICNkZWZpbmUgRFNfU09VUkNFX1RJTUVPVVQJCTMKIC8qCiAgKiBiaXRzIHB1dCB0b2dldGhlciBmcm9tIEhSUF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMC8xLzIKLSAqIHZhbHVlcyAxIGFuZCA1IHdpbGwgbm90IG9jY3VyCisgKiB2YWx1ZXMgMSBhbmQgMyB3aWxsIG5vdCBvY2N1cgorICogICAgICAgIERlY29kZWQgbWVhbmluZyAgICAgICAgICAgICAgRVJST1IgIEJVU1kgICAgQVVYIEVSUgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLSAgIC0tLS0tICAgLS0tLS0tLQorICogSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgMCAgICAgICAgMAorICogQlVTWSAoYWN0aXZlKSAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgMSAgICAgICAgMAorICogU1cgQWNrIFRpbWVvdXQgKGRlc3RpbmF0aW9uKSAgICAgICAgIDEgICAgICAgMCAgICAgICAgMAorICogU1cgQWNrIElOVEQgcmVqZWN0ZWQgKHN0cm9uZyBOQUNLKSAgIDEgICAgICAgMCAgICAgICAgMQorICogU291cmNlIFNpZGUgVGltZSBPdXQgRGV0ZWN0ZWQgICAgICAgIDEgICAgICAgMSAgICAgICAgMAorICogRGVzdGluYXRpb24gU2lkZSBQVVQgRmFpbGVkICAgICAgICAgIDEgICAgICAgMSAgICAgICAgMQogICovCiAjZGVmaW5lIFVWMkhfREVTQ19JRExFCQkJMAotI2RlZmluZSBVVjJIX0RFU0NfREVTVF9USU1FT1VUCQkyCi0jZGVmaW5lIFVWMkhfREVTQ19ERVNUX1NUUk9OR19OQUNLCTMKLSNkZWZpbmUgVVYySF9ERVNDX0JVU1kJCQk0CisjZGVmaW5lIFVWMkhfREVTQ19CVVNZCQkJMgorI2RlZmluZSBVVjJIX0RFU0NfREVTVF9USU1FT1VUCQk0CisjZGVmaW5lIFVWMkhfREVTQ19ERVNUX1NUUk9OR19OQUNLCTUKICNkZWZpbmUgVVYySF9ERVNDX1NPVVJDRV9USU1FT1VUCTYKICNkZWZpbmUgVVYySF9ERVNDX0RFU1RfUFVUX0VSUgkJNwogCkBAIC0xODMsNyArMTkxLDcgQEAKICAqICdiYXNlX2Rlc3RfbmFzaWQnIGZpZWxkIG9mIHRoZSBoZWFkZXIgY29ycmVzcG9uZHMgdG8gdGhlCiAgKiBkZXN0aW5hdGlvbiBub2RlSUQgYXNzb2NpYXRlZCB3aXRoIHRoYXQgc3BlY2lmaWVkIGJpdC4KICAqLwotc3RydWN0IGJhdV90YXJnX2h1Ym1hc2sgeworc3RydWN0IHBubWFzayB7CiAJdW5zaWduZWQgbG9uZwkJYml0c1tCSVRTX1RPX0xPTkdTKFVWX0RJU1RSSUJVVElPTl9TSVpFKV07CiB9OwogCkBAIC0zMTQsNyArMzIyLDcgQEAKICAqIFNob3VsZCBiZSA2NCBieXRlcwogICovCiBzdHJ1Y3QgYmF1X2Rlc2MgewotCXN0cnVjdCBiYXVfdGFyZ19odWJtYXNrCWRpc3RyaWJ1dGlvbjsKKwlzdHJ1Y3QgcG5tYXNrCQkJZGlzdHJpYnV0aW9uOwogCS8qCiAJICogbWVzc2FnZSB0ZW1wbGF0ZSwgY29uc2lzdGluZyBvZiBoZWFkZXIgYW5kIHBheWxvYWQ6CiAJICovCkBAIC00ODgsNiArNDk2LDcgQEAKIAlzdHJ1Y3QgYmF1X2NvbnRyb2wJKnV2aHViX21hc3RlcjsKIAlzdHJ1Y3QgYmF1X2NvbnRyb2wJKnNvY2tldF9tYXN0ZXI7CiAJc3RydWN0IHB0Y19zdGF0cwkqc3RhdHA7CisJY3B1bWFza190CQkqY3B1bWFzazsKIAl1bnNpZ25lZCBsb25nCQl0aW1lb3V0X2ludGVydmFsOwogCXVuc2lnbmVkIGxvbmcJCXNldF9iYXVfb25fdGltZTsKIAlhdG9taWNfdAkJYWN0aXZlX2Rlc2NyaXB0b3JfY291bnQ7CkBAIC01MjYsOTAgKzUzNSw5MCBAQAogCXN0cnVjdCBodWJfYW5kX3Bub2RlCSp0aHA7CiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX21tcl91djJfc3RhdHVzKHZvaWQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9tbXJfdXYyX3N0YXR1cyh2b2lkKQogewogCXJldHVybiByZWFkX2xtbXIoVVYySF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMik7CiB9CiAKLXN0YXRpYyB2b2lkIHdyaXRlX21tcl9kYXRhX2Jyb2FkY2FzdChpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbW1yX2ltYWdlKQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX21tcl9kYXRhX2Jyb2FkY2FzdChpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbW1yX2ltYWdlKQogewogCXdyaXRlX2dtbXIocG5vZGUsIFVWSF9CQVVfREFUQV9CUk9BRENBU1QsIG1tcl9pbWFnZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdyaXRlX21tcl9kZXNjcmlwdG9yX2Jhc2UoaW50IHBub2RlLCB1bnNpZ25lZCBsb25nIG1tcl9pbWFnZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9tbXJfZGVzY3JpcHRvcl9iYXNlKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXJfaW1hZ2UpCiB7CiAJd3JpdGVfZ21tcihwbm9kZSwgVVZIX0xCX0JBVV9TQl9ERVNDUklQVE9SX0JBU0UsIG1tcl9pbWFnZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdyaXRlX21tcl9hY3RpdmF0aW9uKHVuc2lnbmVkIGxvbmcgaW5kZXgpCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbW1yX2FjdGl2YXRpb24odW5zaWduZWQgbG9uZyBpbmRleCkKIHsKIAl3cml0ZV9sbW1yKFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9DT05UUk9MLCBpbmRleCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdyaXRlX2dtbXJfYWN0aXZhdGlvbihpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbW1yX2ltYWdlKQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2dtbXJfYWN0aXZhdGlvbihpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbW1yX2ltYWdlKQogewogCXdyaXRlX2dtbXIocG5vZGUsIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9DT05UUk9MLCBtbXJfaW1hZ2UpOwogfQogCi1zdGF0aWMgdm9pZCB3cml0ZV9tbXJfcGF5bG9hZF9maXJzdChpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbW1yX2ltYWdlKQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX21tcl9wYXlsb2FkX2ZpcnN0KGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXJfaW1hZ2UpCiB7CiAJd3JpdGVfZ21tcihwbm9kZSwgVVZIX0xCX0JBVV9JTlREX1BBWUxPQURfUVVFVUVfRklSU1QsIG1tcl9pbWFnZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdyaXRlX21tcl9wYXlsb2FkX3RhaWwoaW50IHBub2RlLCB1bnNpZ25lZCBsb25nIG1tcl9pbWFnZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9tbXJfcGF5bG9hZF90YWlsKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXJfaW1hZ2UpCiB7CiAJd3JpdGVfZ21tcihwbm9kZSwgVVZIX0xCX0JBVV9JTlREX1BBWUxPQURfUVVFVUVfVEFJTCwgbW1yX2ltYWdlKTsKIH0KIAotc3RhdGljIHZvaWQgd3JpdGVfbW1yX3BheWxvYWRfbGFzdChpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbW1yX2ltYWdlKQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX21tcl9wYXlsb2FkX2xhc3QoaW50IHBub2RlLCB1bnNpZ25lZCBsb25nIG1tcl9pbWFnZSkKIHsKIAl3cml0ZV9nbW1yKHBub2RlLCBVVkhfTEJfQkFVX0lOVERfUEFZTE9BRF9RVUVVRV9MQVNULCBtbXJfaW1hZ2UpOwogfQogCi1zdGF0aWMgdm9pZCB3cml0ZV9tbXJfbWlzY19jb250cm9sKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXJfaW1hZ2UpCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbW1yX21pc2NfY29udHJvbChpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbW1yX2ltYWdlKQogewogCXdyaXRlX2dtbXIocG5vZGUsIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MLCBtbXJfaW1hZ2UpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX21tcl9taXNjX2NvbnRyb2woaW50IHBub2RlKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfbW1yX21pc2NfY29udHJvbChpbnQgcG5vZGUpCiB7CiAJcmV0dXJuIHJlYWRfZ21tcihwbm9kZSwgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0wpOwogfQogCi1zdGF0aWMgdm9pZCB3cml0ZV9tbXJfc3dfYWNrKHVuc2lnbmVkIGxvbmcgbXIpCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbW1yX3N3X2Fjayh1bnNpZ25lZCBsb25nIG1yKQogewogCXV2X3dyaXRlX2xvY2FsX21tcihVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfQUxJQVMsIG1yKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9tbXJfc3dfYWNrKHZvaWQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9tbXJfc3dfYWNrKHZvaWQpCiB7CiAJcmV0dXJuIHJlYWRfbG1tcihVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0UpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX2dtbXJfc3dfYWNrKGludCBwbm9kZSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2dtbXJfc3dfYWNrKGludCBwbm9kZSkKIHsKIAlyZXR1cm4gcmVhZF9nbW1yKHBub2RlLCBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0UpOwogfQogCi1zdGF0aWMgdm9pZCB3cml0ZV9tbXJfZGF0YV9jb25maWcoaW50IHBub2RlLCB1bnNpZ25lZCBsb25nIG1yKQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX21tcl9kYXRhX2NvbmZpZyhpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbXIpCiB7CiAJdXZfd3JpdGVfZ2xvYmFsX21tcjY0KHBub2RlLCBVVkhfQkFVX0RBVEFfQ09ORklHLCBtcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGJhdV91dmh1Yl9pc3NldChpbnQgdXZodWIsIHN0cnVjdCBiYXVfdGFyZ19odWJtYXNrICpkc3RwKQorc3RhdGljIGlubGluZSBpbnQgYmF1X3V2aHViX2lzc2V0KGludCB1dmh1Yiwgc3RydWN0IHBubWFzayAqZHN0cCkKIHsKIAlyZXR1cm4gY29uc3RhbnRfdGVzdF9iaXQodXZodWIsICZkc3RwLT5iaXRzWzBdKTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiYXVfdXZodWJfc2V0KGludCBwbm9kZSwgc3RydWN0IGJhdV90YXJnX2h1Ym1hc2sgKmRzdHApCitzdGF0aWMgaW5saW5lIHZvaWQgYmF1X3V2aHViX3NldChpbnQgcG5vZGUsIHN0cnVjdCBwbm1hc2sgKmRzdHApCiB7CiAJX19zZXRfYml0KHBub2RlLCAmZHN0cC0+Yml0c1swXSk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgYmF1X3V2aHVic19jbGVhcihzdHJ1Y3QgYmF1X3RhcmdfaHVibWFzayAqZHN0cCwKK3N0YXRpYyBpbmxpbmUgdm9pZCBiYXVfdXZodWJzX2NsZWFyKHN0cnVjdCBwbm1hc2sgKmRzdHAsCiAJCQkJICAgIGludCBuYml0cykKIHsKIAliaXRtYXBfemVybygmZHN0cC0+Yml0c1swXSwgbmJpdHMpOwogfQotc3RhdGljIGlubGluZSBpbnQgYmF1X3V2aHViX3dlaWdodChzdHJ1Y3QgYmF1X3RhcmdfaHVibWFzayAqZHN0cCkKK3N0YXRpYyBpbmxpbmUgaW50IGJhdV91dmh1Yl93ZWlnaHQoc3RydWN0IHBubWFzayAqZHN0cCkKIHsKIAlyZXR1cm4gYml0bWFwX3dlaWdodCgodW5zaWduZWQgbG9uZyAqKSZkc3RwLT5iaXRzWzBdLAogCQkJCVVWX0RJU1RSSUJVVElPTl9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X21tcnMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X21tcnMuaAppbmRleCA0YmU1MmM4Li4xMDQ3NGZiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9tbXJzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfbW1ycy5oCkBAIC02MSwxNjg5ICs2MSwyMDE2IEBACiAvKiBDb21wYXQ6IGlmIHRoaXMgI2RlZmluZSBpcyBwcmVzZW50LCBVViBoZWFkZXJzIHN1cHBvcnQgVVYyICovCiAjZGVmaW5lIFVWMl9IVUJfSVNfU1VQUE9SVEVECTEKIAotLyogS0FCSSBjb21wYXQ6IGlmIHRoaXMgI2RlZmluZSBpcyBwcmVzZW50LCBLQUJJIGhhY2tzIGFyZSBwcmVzZW50ICovCi0jZGVmaW5lIFVWMl9IVUJfS0FCSV9IQUNLUwkxCi0KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBVVkhfQkFVX0RBVEFfQlJPQURDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgVVZIX0JBVV9EQVRBX0JST0FEQ0FTVCAweDYxNjg4VUwKLSNkZWZpbmUgVVZIX0JBVV9EQVRBX0JST0FEQ0FTVF8zMiAweDQ0MAorI2RlZmluZSBVVkhfQkFVX0RBVEFfQlJPQURDQVNUCQkJCTB4NjE2ODhVTAorI2RlZmluZSBVVkhfQkFVX0RBVEFfQlJPQURDQVNUXzMyCQkJMHg0NDAKIAotI2RlZmluZSBVVkhfQkFVX0RBVEFfQlJPQURDQVNUX0VOQUJMRV9TSEZUIDAKLSNkZWZpbmUgVVZIX0JBVV9EQVRBX0JST0FEQ0FTVF9FTkFCTEVfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDFVTAorI2RlZmluZSBVVkhfQkFVX0RBVEFfQlJPQURDQVNUX0VOQUJMRV9TSEZUCQkwCisjZGVmaW5lIFVWSF9CQVVfREFUQV9CUk9BRENBU1RfRU5BQkxFX01BU0sJCTB4MDAwMDAwMDAwMDAwMDAwMVVMCiAKIHVuaW9uIHV2aF9iYXVfZGF0YV9icm9hZGNhc3RfdSB7Ci0gICAgdW5zaWduZWQgbG9uZwl2OwotICAgIHN0cnVjdCB1dmhfYmF1X2RhdGFfYnJvYWRjYXN0X3MgewotCXVuc2lnbmVkIGxvbmcJZW5hYmxlIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF8xXzYzOiA2MzsgIC8qICAgICovCi0gICAgfSBzOworCXVuc2lnbmVkIGxvbmcJdjsKKwlzdHJ1Y3QgdXZoX2JhdV9kYXRhX2Jyb2FkY2FzdF9zIHsKKwkJdW5zaWduZWQgbG9uZwllbmFibGU6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMV82Mzo2MzsKKwl9IHM7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVWSF9CQVVfREFUQV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9CQVVfREFUQV9DT05GSUcgMHg2MTY4MFVMCi0jZGVmaW5lIFVWSF9CQVVfREFUQV9DT05GSUdfMzIgMHg0MzgKKyNkZWZpbmUgVVZIX0JBVV9EQVRBX0NPTkZJRwkJCQkweDYxNjgwVUwKKyNkZWZpbmUgVVZIX0JBVV9EQVRBX0NPTkZJR18zMgkJCQkweDQzOAogCi0jZGVmaW5lIFVWSF9CQVVfREFUQV9DT05GSUdfVkVDVE9SX1NIRlQgMAotI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX1ZFQ1RPUl9NQVNLIDB4MDAwMDAwMDAwMDAwMDBmZlVMCi0jZGVmaW5lIFVWSF9CQVVfREFUQV9DT05GSUdfRE1fU0hGVCA4Ci0jZGVmaW5lIFVWSF9CQVVfREFUQV9DT05GSUdfRE1fTUFTSyAweDAwMDAwMDAwMDAwMDA3MDBVTAotI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX0RFU1RNT0RFX1NIRlQgMTEKLSNkZWZpbmUgVVZIX0JBVV9EQVRBX0NPTkZJR19ERVNUTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDAwMDgwMFVMCi0jZGVmaW5lIFVWSF9CQVVfREFUQV9DT05GSUdfU1RBVFVTX1NIRlQgMTIKLSNkZWZpbmUgVVZIX0JBVV9EQVRBX0NPTkZJR19TVEFUVVNfTUFTSyAweDAwMDAwMDAwMDAwMDEwMDBVTAotI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX1BfU0hGVCAxMwotI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX1BfTUFTSyAweDAwMDAwMDAwMDAwMDIwMDBVTAotI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX1RfU0hGVCAxNQotI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX1RfTUFTSyAweDAwMDAwMDAwMDAwMDgwMDBVTAotI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX01fU0hGVCAxNgotI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX01fTUFTSyAweDAwMDAwMDAwMDAwMTAwMDBVTAotI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX0FQSUNfSURfU0hGVCAzMgotI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX0FQSUNfSURfTUFTSyAweGZmZmZmZmZmMDAwMDAwMDBVTAorI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX1ZFQ1RPUl9TSEZUCQkJMAorI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX0RNX1NIRlQJCQk4CisjZGVmaW5lIFVWSF9CQVVfREFUQV9DT05GSUdfREVTVE1PREVfU0hGVAkJMTEKKyNkZWZpbmUgVVZIX0JBVV9EQVRBX0NPTkZJR19TVEFUVVNfU0hGVAkJCTEyCisjZGVmaW5lIFVWSF9CQVVfREFUQV9DT05GSUdfUF9TSEZUCQkJMTMKKyNkZWZpbmUgVVZIX0JBVV9EQVRBX0NPTkZJR19UX1NIRlQJCQkxNQorI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX01fU0hGVAkJCTE2CisjZGVmaW5lIFVWSF9CQVVfREFUQV9DT05GSUdfQVBJQ19JRF9TSEZUCQkzMgorI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX1ZFQ1RPUl9NQVNLCQkJMHgwMDAwMDAwMDAwMDAwMGZmVUwKKyNkZWZpbmUgVVZIX0JBVV9EQVRBX0NPTkZJR19ETV9NQVNLCQkJMHgwMDAwMDAwMDAwMDAwNzAwVUwKKyNkZWZpbmUgVVZIX0JBVV9EQVRBX0NPTkZJR19ERVNUTU9ERV9NQVNLCQkweDAwMDAwMDAwMDAwMDA4MDBVTAorI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX1NUQVRVU19NQVNLCQkJMHgwMDAwMDAwMDAwMDAxMDAwVUwKKyNkZWZpbmUgVVZIX0JBVV9EQVRBX0NPTkZJR19QX01BU0sJCQkweDAwMDAwMDAwMDAwMDIwMDBVTAorI2RlZmluZSBVVkhfQkFVX0RBVEFfQ09ORklHX1RfTUFTSwkJCTB4MDAwMDAwMDAwMDAwODAwMFVMCisjZGVmaW5lIFVWSF9CQVVfREFUQV9DT05GSUdfTV9NQVNLCQkJMHgwMDAwMDAwMDAwMDEwMDAwVUwKKyNkZWZpbmUgVVZIX0JBVV9EQVRBX0NPTkZJR19BUElDX0lEX01BU0sJCTB4ZmZmZmZmZmYwMDAwMDAwMFVMCiAKIHVuaW9uIHV2aF9iYXVfZGF0YV9jb25maWdfdSB7Ci0gICAgdW5zaWduZWQgbG9uZwl2OwotICAgIHN0cnVjdCB1dmhfYmF1X2RhdGFfY29uZmlnX3MgewotCXVuc2lnbmVkIGxvbmcJdmVjdG9yXyAgOiAgODsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlkbSAgICAgICA6ICAzOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWRlc3Rtb2RlIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJc3RhdHVzICAgOiAgMTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwlwICAgICAgICA6ICAxOyAgLyogUk8gKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfMTQgIDogIDE7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJdCAgICAgICAgOiAgMTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwltICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfMTdfMzE6IDE1OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWFwaWNfaWQgIDogMzI7ICAvKiBSVyAqLwotICAgIH0gczsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9iYXVfZGF0YV9jb25maWdfcyB7CisJCXVuc2lnbmVkIGxvbmcJdmVjdG9yXzo4OwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZG06MzsJCQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlkZXN0bW9kZToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJc3RhdHVzOjE7CQkJLyogUk8gKi8KKwkJdW5zaWduZWQgbG9uZwlwOjE7CQkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8xNDoxOworCQl1bnNpZ25lZCBsb25nCXQ6MTsJCQkJLyogUk8gKi8KKwkJdW5zaWduZWQgbG9uZwltOjE7CQkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8xN18zMToxNTsKKwkJdW5zaWduZWQgbG9uZwlhcGljX2lkOjMyOwkJCS8qIFJXICovCisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICBVVkhfRVZFTlRfT0NDVVJSRUQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfRVZFTlRfT0NDVVJSRUQwIDB4NzAwMDBVTAotI2RlZmluZSBVVkhfRVZFTlRfT0NDVVJSRUQwXzMyIDB4NWU4CisjZGVmaW5lIFVWSF9FVkVOVF9PQ0NVUlJFRDAJCQkJMHg3MDAwMFVMCisjZGVmaW5lIFVWSF9FVkVOVF9PQ0NVUlJFRDBfMzIJCQkJMHg1ZTgKIAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9IQ0VSUl9TSEZUIDAKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSENFUlJfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDFVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9HUjBfSENFUlJfU0hGVCAxCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0dSMF9IQ0VSUl9NQVNLIDB4MDAwMDAwMDAwMDAwMDAwMlVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0dSMV9IQ0VSUl9TSEZUIDIKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0hDRVJSX01BU0sgMHgwMDAwMDAwMDAwMDAwMDA0VUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEhfSENFUlJfU0hGVCAzCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xIX0hDRVJSX01BU0sgMHgwMDAwMDAwMDAwMDAwMDA4VUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUkhfSENFUlJfU0hGVCA0Ci0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1JIX0hDRVJSX01BU0sgMHgwMDAwMDAwMDAwMDAwMDEwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfWE5fSENFUlJfU0hGVCA1Ci0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1hOX0hDRVJSX01BU0sgMHgwMDAwMDAwMDAwMDAwMDIwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfU0lfSENFUlJfU0hGVCA2Ci0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1NJX0hDRVJSX01BU0sgMHgwMDAwMDAwMDAwMDAwMDQwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfQU9FUlIwX1NIRlQgNwotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9BT0VSUjBfTUFTSyAweDAwMDAwMDAwMDAwMDAwODBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9HUjBfQU9FUlIwX1NIRlQgOAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9HUjBfQU9FUlIwX01BU0sgMHgwMDAwMDAwMDAwMDAwMTAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0FPRVJSMF9TSEZUIDkKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0FPRVJSMF9NQVNLIDB4MDAwMDAwMDAwMDAwMDIwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xIX0FPRVJSMF9TSEZUIDEwCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xIX0FPRVJSMF9NQVNLIDB4MDAwMDAwMDAwMDAwMDQwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1JIX0FPRVJSMF9TSEZUIDExCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1JIX0FPRVJSMF9NQVNLIDB4MDAwMDAwMDAwMDAwMDgwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1hOX0FPRVJSMF9TSEZUIDEyCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1hOX0FPRVJSMF9NQVNLIDB4MDAwMDAwMDAwMDAwMTAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1NJX0FPRVJSMF9TSEZUIDEzCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1NJX0FPRVJSMF9NQVNLIDB4MDAwMDAwMDAwMDAwMjAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0FPRVJSMV9TSEZUIDE0Ci0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0FPRVJSMV9NQVNLIDB4MDAwMDAwMDAwMDAwNDAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0dSMF9BT0VSUjFfU0hGVCAxNQotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9HUjBfQU9FUlIxX01BU0sgMHgwMDAwMDAwMDAwMDA4MDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0FPRVJSMV9TSEZUIDE2Ci0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0dSMV9BT0VSUjFfTUFTSyAweDAwMDAwMDAwMDAwMTAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MSF9BT0VSUjFfU0hGVCAxNwotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MSF9BT0VSUjFfTUFTSyAweDAwMDAwMDAwMDAwMjAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SSF9BT0VSUjFfU0hGVCAxOAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SSF9BT0VSUjFfTUFTSyAweDAwMDAwMDAwMDAwNDAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9YTl9BT0VSUjFfU0hGVCAxOQotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9YTl9BT0VSUjFfTUFTSyAweDAwMDAwMDAwMDAwODAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9TSV9BT0VSUjFfU0hGVCAyMAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9TSV9BT0VSUjFfTUFTSyAweDAwMDAwMDAwMDAxMDAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SSF9WUElfSU5UX1NIRlQgMjEKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUkhfVlBJX0lOVF9NQVNLIDB4MDAwMDAwMDAwMDIwMDAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1NZU1RFTV9TSFVURE9XTl9JTlRfU0hGVCAyMgotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9TWVNURU1fU0hVVERPV05fSU5UX01BU0sgMHgwMDAwMDAwMDAwNDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8wX1NIRlQgMjMKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8wX01BU0sgMHgwMDAwMDAwMDAwODAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xX1NIRlQgMjQKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xX01BU0sgMHgwMDAwMDAwMDAxMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8yX1NIRlQgMjUKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8yX01BU0sgMHgwMDAwMDAwMDAyMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8zX1NIRlQgMjYKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8zX01BU0sgMHgwMDAwMDAwMDA0MDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF80X1NIRlQgMjcKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF80X01BU0sgMHgwMDAwMDAwMDA4MDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF81X1NIRlQgMjgKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF81X01BU0sgMHgwMDAwMDAwMDEwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF82X1NIRlQgMjkKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF82X01BU0sgMHgwMDAwMDAwMDIwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF83X1NIRlQgMzAKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF83X01BU0sgMHgwMDAwMDAwMDQwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF84X1NIRlQgMzEKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF84X01BU0sgMHgwMDAwMDAwMDgwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF85X1NIRlQgMzIKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF85X01BU0sgMHgwMDAwMDAwMTAwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xMF9TSEZUIDMzCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTBfTUFTSyAweDAwMDAwMDAyMDAwMDAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzExX1NIRlQgMzQKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xMV9NQVNLIDB4MDAwMDAwMDQwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTJfU0hGVCAzNQotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzEyX01BU0sgMHgwMDAwMDAwODAwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xM19TSEZUIDM2Ci0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTNfTUFTSyAweDAwMDAwMDEwMDAwMDAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzE0X1NIRlQgMzcKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xNF9NQVNLIDB4MDAwMDAwMjAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTVfU0hGVCAzOAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzE1X01BU0sgMHgwMDAwMDA0MDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTDFfTk1JX0lOVF9TSEZUIDM5Ci0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0wxX05NSV9JTlRfTUFTSyAweDAwMDAwMDgwMDAwMDAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9TVE9QX0NMT0NLX1NIRlQgNDAKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfU1RPUF9DTE9DS19NQVNLIDB4MDAwMDAxMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0FTSUNfVE9fTDFfU0hGVCA0MQotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9BU0lDX1RPX0wxX01BU0sgMHgwMDAwMDIwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTDFfVE9fQVNJQ19TSEZUIDQyCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0wxX1RPX0FTSUNfTUFTSyAweDAwMDAwNDAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MVENfSU5UX1NIRlQgNDMKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTFRDX0lOVF9NQVNLIDB4MDAwMDA4MDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xBX1NFUV9UUklHR0VSX1NIRlQgNDQKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEFfU0VRX1RSSUdHRVJfTUFTSyAweDAwMDAxMDAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9JUElfSU5UX1NIRlQgNDUKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfSVBJX0lOVF9NQVNLIDB4MDAwMDIwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0VYVElPX0lOVDBfU0hGVCA0NgotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9FWFRJT19JTlQwX01BU0sgMHgwMDAwNDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfRVhUSU9fSU5UMV9TSEZUIDQ3Ci0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0VYVElPX0lOVDFfTUFTSyAweDAwMDA4MDAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9FWFRJT19JTlQyX1NIRlQgNDgKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfRVhUSU9fSU5UMl9NQVNLIDB4MDAwMTAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0VYVElPX0lOVDNfU0hGVCA0OQotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9FWFRJT19JTlQzX01BU0sgMHgwMDAyMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUFJPRklMRV9JTlRfU0hGVCA1MAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9QUk9GSUxFX0lOVF9NQVNLIDB4MDAwNDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1JUQzBfU0hGVCA1MQotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SVEMwX01BU0sgMHgwMDA4MDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUlRDMV9TSEZUIDUyCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1JUQzFfTUFTSyAweDAwMTAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SVEMyX1NIRlQgNTMKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUlRDMl9NQVNLIDB4MDAyMDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1JUQzNfU0hGVCA1NAotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SVEMzX01BU0sgMHgwMDQwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfQkFVX0RBVEFfU0hGVCA1NQotI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9CQVVfREFUQV9NQVNLIDB4MDA4MDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1BPV0VSX01BTkFHRU1FTlRfUkVRX1NIRlQgNTYKLSNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUE9XRVJfTUFOQUdFTUVOVF9SRVFfTUFTSyAweDAxMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9IQ0VSUl9TSEZUCQkwCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0dSMF9IQ0VSUl9TSEZUCQkxCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0dSMV9IQ0VSUl9TSEZUCQkyCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xIX0hDRVJSX1NIRlQJCTMKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUkhfSENFUlJfU0hGVAkJNAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9YTl9IQ0VSUl9TSEZUCQk1CisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1NJX0hDRVJSX1NIRlQJCTYKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfQU9FUlIwX1NIRlQJCTcKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfR1IwX0FPRVJSMF9TSEZUCQk4CisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0dSMV9BT0VSUjBfU0hGVAkJOQorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MSF9BT0VSUjBfU0hGVAkJMTAKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUkhfQU9FUlIwX1NIRlQJCTExCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1hOX0FPRVJSMF9TSEZUCQkxMgorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9TSV9BT0VSUjBfU0hGVAkJMTMKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfQU9FUlIxX1NIRlQJCTE0CisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0dSMF9BT0VSUjFfU0hGVAkJMTUKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0FPRVJSMV9TSEZUCQkxNgorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MSF9BT0VSUjFfU0hGVAkJMTcKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUkhfQU9FUlIxX1NIRlQJCTE4CisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1hOX0FPRVJSMV9TSEZUCQkxOQorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9TSV9BT0VSUjFfU0hGVAkJMjAKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUkhfVlBJX0lOVF9TSEZUCQkyMQorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9TWVNURU1fU0hVVERPV05fSU5UX1NIRlQJMjIKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8wX1NIRlQJCTIzCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMV9TSEZUCQkyNAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzJfU0hGVAkJMjUKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8zX1NIRlQJCTI2CisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfNF9TSEZUCQkyNworI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzVfU0hGVAkJMjgKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF82X1NIRlQJCTI5CisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfN19TSEZUCQkzMAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzhfU0hGVAkJMzEKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF85X1NIRlQJCTMyCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTBfU0hGVAkJMzMKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xMV9TSEZUCQkzNAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzEyX1NIRlQJCTM1CisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTNfU0hGVAkJMzYKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xNF9TSEZUCQkzNworI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzE1X1NIRlQJCTM4CisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0wxX05NSV9JTlRfU0hGVAkJMzkKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfU1RPUF9DTE9DS19TSEZUCQk0MAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9BU0lDX1RPX0wxX1NIRlQJCTQxCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0wxX1RPX0FTSUNfU0hGVAkJNDIKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTFRDX0lOVF9TSEZUCQk0MworI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQV9TRVFfVFJJR0dFUl9TSEZUCTQ0CisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0lQSV9JTlRfU0hGVAkJNDUKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfRVhUSU9fSU5UMF9TSEZUCQk0NgorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9FWFRJT19JTlQxX1NIRlQJCTQ3CisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0VYVElPX0lOVDJfU0hGVAkJNDgKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfRVhUSU9fSU5UM19TSEZUCQk0OQorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9QUk9GSUxFX0lOVF9TSEZUCQk1MAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SVEMwX1NIRlQJCQk1MQorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SVEMxX1NIRlQJCQk1MgorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SVEMyX1NIRlQJCQk1MworI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SVEMzX1NIRlQJCQk1NAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9CQVVfREFUQV9TSEZUCQk1NQorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9QT1dFUl9NQU5BR0VNRU5UX1JFUV9TSEZUCTU2CisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0hDRVJSX01BU0sJCTB4MDAwMDAwMDAwMDAwMDAwMVVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0dSMF9IQ0VSUl9NQVNLCQkweDAwMDAwMDAwMDAwMDAwMDJVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9HUjFfSENFUlJfTUFTSwkJMHgwMDAwMDAwMDAwMDAwMDA0VUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEhfSENFUlJfTUFTSwkJMHgwMDAwMDAwMDAwMDAwMDA4VUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUkhfSENFUlJfTUFTSwkJMHgwMDAwMDAwMDAwMDAwMDEwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfWE5fSENFUlJfTUFTSwkJMHgwMDAwMDAwMDAwMDAwMDIwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfU0lfSENFUlJfTUFTSwkJMHgwMDAwMDAwMDAwMDAwMDQwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfQU9FUlIwX01BU0sJCTB4MDAwMDAwMDAwMDAwMDA4MFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0dSMF9BT0VSUjBfTUFTSwkJMHgwMDAwMDAwMDAwMDAwMTAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0FPRVJSMF9NQVNLCQkweDAwMDAwMDAwMDAwMDAyMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MSF9BT0VSUjBfTUFTSwkJMHgwMDAwMDAwMDAwMDAwNDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUkhfQU9FUlIwX01BU0sJCTB4MDAwMDAwMDAwMDAwMDgwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1hOX0FPRVJSMF9NQVNLCQkweDAwMDAwMDAwMDAwMDEwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9TSV9BT0VSUjBfTUFTSwkJMHgwMDAwMDAwMDAwMDAyMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfQU9FUlIxX01BU0sJCTB4MDAwMDAwMDAwMDAwNDAwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0dSMF9BT0VSUjFfTUFTSwkJMHgwMDAwMDAwMDAwMDA4MDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0FPRVJSMV9NQVNLCQkweDAwMDAwMDAwMDAwMTAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MSF9BT0VSUjFfTUFTSwkJMHgwMDAwMDAwMDAwMDIwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUkhfQU9FUlIxX01BU0sJCTB4MDAwMDAwMDAwMDA0MDAwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX1hOX0FPRVJSMV9NQVNLCQkweDAwMDAwMDAwMDAwODAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9TSV9BT0VSUjFfTUFTSwkJMHgwMDAwMDAwMDAwMTAwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfUkhfVlBJX0lOVF9NQVNLCQkweDAwMDAwMDAwMDAyMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9TWVNURU1fU0hVVERPV05fSU5UX01BU0sJMHgwMDAwMDAwMDAwNDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8wX01BU0sJCTB4MDAwMDAwMDAwMDgwMDAwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMV9NQVNLCQkweDAwMDAwMDAwMDEwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzJfTUFTSwkJMHgwMDAwMDAwMDAyMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8zX01BU0sJCTB4MDAwMDAwMDAwNDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfNF9NQVNLCQkweDAwMDAwMDAwMDgwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzVfTUFTSwkJMHgwMDAwMDAwMDEwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF82X01BU0sJCTB4MDAwMDAwMDAyMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfN19NQVNLCQkweDAwMDAwMDAwNDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzhfTUFTSwkJMHgwMDAwMDAwMDgwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF85X01BU0sJCTB4MDAwMDAwMDEwMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTBfTUFTSwkJMHgwMDAwMDAwMjAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xMV9NQVNLCQkweDAwMDAwMDA0MDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzEyX01BU0sJCTB4MDAwMDAwMDgwMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTNfTUFTSwkJMHgwMDAwMDAxMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xNF9NQVNLCQkweDAwMDAwMDIwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzE1X01BU0sJCTB4MDAwMDAwNDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0wxX05NSV9JTlRfTUFTSwkJMHgwMDAwMDA4MDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfU1RPUF9DTE9DS19NQVNLCQkweDAwMDAwMTAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9BU0lDX1RPX0wxX01BU0sJCTB4MDAwMDAyMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0wxX1RPX0FTSUNfTUFTSwkJMHgwMDAwMDQwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfTFRDX0lOVF9NQVNLCQkweDAwMDAwODAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9MQV9TRVFfVFJJR0dFUl9NQVNLCTB4MDAwMDEwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0lQSV9JTlRfTUFTSwkJMHgwMDAwMjAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfRVhUSU9fSU5UMF9NQVNLCQkweDAwMDA0MDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9FWFRJT19JTlQxX01BU0sJCTB4MDAwMDgwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfRVZFTlRfT0NDVVJSRUQwX0VYVElPX0lOVDJfTUFTSwkJMHgwMDAxMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9FVkVOVF9PQ0NVUlJFRDBfRVhUSU9fSU5UM19NQVNLCQkweDAwMDIwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9QUk9GSUxFX0lOVF9NQVNLCQkweDAwMDQwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SVEMwX01BU0sJCQkweDAwMDgwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SVEMxX01BU0sJCQkweDAwMTAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SVEMyX01BU0sJCQkweDAwMjAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9SVEMzX01BU0sJCQkweDAwNDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9CQVVfREFUQV9NQVNLCQkweDAwODAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0VWRU5UX09DQ1VSUkVEMF9QT1dFUl9NQU5BR0VNRU5UX1JFUV9NQVNLCTB4MDEwMDAwMDAwMDAwMDAwMFVMCiAKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSENFUlJfU0hGVCAwCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0hDRVJSX01BU0sgMHgwMDAwMDAwMDAwMDAwMDAxVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfUVBfSENFUlJfU0hGVCAxCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1FQX0hDRVJSX01BU0sgMHgwMDAwMDAwMDAwMDAwMDAyVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfUkhfSENFUlJfU0hGVCAyCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1JIX0hDRVJSX01BU0sgMHgwMDAwMDAwMDAwMDAwMDA0VUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEgwX0hDRVJSX1NIRlQgMwotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MSDBfSENFUlJfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDhVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MSDFfSENFUlJfU0hGVCA0Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xIMV9IQ0VSUl9NQVNLIDB4MDAwMDAwMDAwMDAwMDAxMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0dSMF9IQ0VSUl9TSEZUIDUKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfR1IwX0hDRVJSX01BU0sgMHgwMDAwMDAwMDAwMDAwMDIwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0hDRVJSX1NIRlQgNgotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9HUjFfSENFUlJfTUFTSyAweDAwMDAwMDAwMDAwMDAwNDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9OSTBfSENFUlJfU0hGVCA3Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX05JMF9IQ0VSUl9NQVNLIDB4MDAwMDAwMDAwMDAwMDA4MFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX05JMV9IQ0VSUl9TSEZUIDgKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTkkxX0hDRVJSX01BU0sgMHgwMDAwMDAwMDAwMDAwMTAwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfQU9FUlIwX1NIRlQgOQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9BT0VSUjBfTUFTSyAweDAwMDAwMDAwMDAwMDAyMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9RUF9BT0VSUjBfU0hGVCAxMAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9RUF9BT0VSUjBfTUFTSyAweDAwMDAwMDAwMDAwMDA0MDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9SSF9BT0VSUjBfU0hGVCAxMQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9SSF9BT0VSUjBfTUFTSyAweDAwMDAwMDAwMDAwMDA4MDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MSDBfQU9FUlIwX1NIRlQgMTIKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEgwX0FPRVJSMF9NQVNLIDB4MDAwMDAwMDAwMDAwMTAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xIMV9BT0VSUjBfU0hGVCAxMwotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MSDFfQU9FUlIwX01BU0sgMHgwMDAwMDAwMDAwMDAyMDAwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfR1IwX0FPRVJSMF9TSEZUIDE0Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0dSMF9BT0VSUjBfTUFTSyAweDAwMDAwMDAwMDAwMDQwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9HUjFfQU9FUlIwX1NIRlQgMTUKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0FPRVJSMF9NQVNLIDB4MDAwMDAwMDAwMDAwODAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1hCX0FPRVJSMF9TSEZUIDE2Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1hCX0FPRVJSMF9NQVNLIDB4MDAwMDAwMDAwMDAxMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1JUX0FPRVJSMF9TSEZUIDE3Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1JUX0FPRVJSMF9NQVNLIDB4MDAwMDAwMDAwMDAyMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX05JMF9BT0VSUjBfU0hGVCAxOAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9OSTBfQU9FUlIwX01BU0sgMHgwMDAwMDAwMDAwMDQwMDAwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTkkxX0FPRVJSMF9TSEZUIDE5Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX05JMV9BT0VSUjBfTUFTSyAweDAwMDAwMDAwMDAwODAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9BT0VSUjFfU0hGVCAyMAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9BT0VSUjFfTUFTSyAweDAwMDAwMDAwMDAxMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9RUF9BT0VSUjFfU0hGVCAyMQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9RUF9BT0VSUjFfTUFTSyAweDAwMDAwMDAwMDAyMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9SSF9BT0VSUjFfU0hGVCAyMgotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9SSF9BT0VSUjFfTUFTSyAweDAwMDAwMDAwMDA0MDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MSDBfQU9FUlIxX1NIRlQgMjMKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEgwX0FPRVJSMV9NQVNLIDB4MDAwMDAwMDAwMDgwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xIMV9BT0VSUjFfU0hGVCAyNAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MSDFfQU9FUlIxX01BU0sgMHgwMDAwMDAwMDAxMDAwMDAwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfR1IwX0FPRVJSMV9TSEZUIDI1Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0dSMF9BT0VSUjFfTUFTSyAweDAwMDAwMDAwMDIwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9HUjFfQU9FUlIxX1NIRlQgMjYKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0FPRVJSMV9NQVNLIDB4MDAwMDAwMDAwNDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1hCX0FPRVJSMV9TSEZUIDI3Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1hCX0FPRVJSMV9NQVNLIDB4MDAwMDAwMDAwODAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1JUX0FPRVJSMV9TSEZUIDI4Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1JUX0FPRVJSMV9NQVNLIDB4MDAwMDAwMDAxMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX05JMF9BT0VSUjFfU0hGVCAyOQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9OSTBfQU9FUlIxX01BU0sgMHgwMDAwMDAwMDIwMDAwMDAwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTkkxX0FPRVJSMV9TSEZUIDMwCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX05JMV9BT0VSUjFfTUFTSyAweDAwMDAwMDAwNDAwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9TWVNURU1fU0hVVERPV05fSU5UX1NIRlQgMzEKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfU1lTVEVNX1NIVVRET1dOX0lOVF9NQVNLIDB4MDAwMDAwMDA4MDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMF9TSEZUIDMyCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMF9NQVNLIDB4MDAwMDAwMDEwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMV9TSEZUIDMzCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMV9NQVNLIDB4MDAwMDAwMDIwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMl9TSEZUIDM0Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMl9NQVNLIDB4MDAwMDAwMDQwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfM19TSEZUIDM1Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfM19NQVNLIDB4MDAwMDAwMDgwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfNF9TSEZUIDM2Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfNF9NQVNLIDB4MDAwMDAwMTAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfNV9TSEZUIDM3Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfNV9NQVNLIDB4MDAwMDAwMjAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfNl9TSEZUIDM4Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfNl9NQVNLIDB4MDAwMDAwNDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfN19TSEZUIDM5Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfN19NQVNLIDB4MDAwMDAwODAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfOF9TSEZUIDQwCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfOF9NQVNLIDB4MDAwMDAxMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfOV9TSEZUIDQxCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfOV9NQVNLIDB4MDAwMDAyMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTBfU0hGVCA0MgotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzEwX01BU0sgMHgwMDAwMDQwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xMV9TSEZUIDQzCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTFfTUFTSyAweDAwMDAwODAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzEyX1NIRlQgNDQKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xMl9NQVNLIDB4MDAwMDEwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTNfU0hGVCA0NQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzEzX01BU0sgMHgwMDAwMjAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xNF9TSEZUIDQ2Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTRfTUFTSyAweDAwMDA0MDAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzE1X1NIRlQgNDcKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xNV9NQVNLIDB4MDAwMDgwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0wxX05NSV9JTlRfU0hGVCA0OAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MMV9OTUlfSU5UX01BU0sgMHgwMDAxMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfU1RPUF9DTE9DS19TSEZUIDQ5Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1NUT1BfQ0xPQ0tfTUFTSyAweDAwMDIwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9BU0lDX1RPX0wxX1NIRlQgNTAKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfQVNJQ19UT19MMV9NQVNLIDB4MDAwNDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0wxX1RPX0FTSUNfU0hGVCA1MQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MMV9UT19BU0lDX01BU0sgMHgwMDA4MDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEFfU0VRX1RSSUdHRVJfU0hGVCA1MgotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQV9TRVFfVFJJR0dFUl9NQVNLIDB4MDAxMDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0lQSV9JTlRfU0hGVCA1MwotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9JUElfSU5UX01BU0sgMHgwMDIwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfRVhUSU9fSU5UMF9TSEZUIDU0Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0VYVElPX0lOVDBfTUFTSyAweDAwNDAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9FWFRJT19JTlQxX1NIRlQgNTUKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfRVhUSU9fSU5UMV9NQVNLIDB4MDA4MDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0VYVElPX0lOVDJfU0hGVCA1NgotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9FWFRJT19JTlQyX01BU0sgMHgwMTAwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfRVhUSU9fSU5UM19TSEZUIDU3Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0VYVElPX0lOVDNfTUFTSyAweDAyMDAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9QUk9GSUxFX0lOVF9TSEZUIDU4Ci0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1BST0ZJTEVfSU5UX01BU0sgMHgwNDAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSENFUlJfU0hGVAkJMAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9RUF9IQ0VSUl9TSEZUCQkxCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1JIX0hDRVJSX1NIRlQJCTIKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEgwX0hDRVJSX1NIRlQJCTMKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEgxX0hDRVJSX1NIRlQJCTQKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfR1IwX0hDRVJSX1NIRlQJCTUKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0hDRVJSX1NIRlQJCTYKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTkkwX0hDRVJSX1NIRlQJCTcKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTkkxX0hDRVJSX1NIRlQJCTgKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfQU9FUlIwX1NIRlQJCTkKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfUVBfQU9FUlIwX1NIRlQJCTEwCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1JIX0FPRVJSMF9TSEZUCQkxMQorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MSDBfQU9FUlIwX1NIRlQJCTEyCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xIMV9BT0VSUjBfU0hGVAkJMTMKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfR1IwX0FPRVJSMF9TSEZUCQkxNAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9HUjFfQU9FUlIwX1NIRlQJCTE1CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1hCX0FPRVJSMF9TSEZUCQkxNgorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9SVF9BT0VSUjBfU0hGVAkJMTcKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTkkwX0FPRVJSMF9TSEZUCQkxOAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9OSTFfQU9FUlIwX1NIRlQJCTE5CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0FPRVJSMV9TSEZUCQkyMAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9RUF9BT0VSUjFfU0hGVAkJMjEKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfUkhfQU9FUlIxX1NIRlQJCTIyCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xIMF9BT0VSUjFfU0hGVAkJMjMKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEgxX0FPRVJSMV9TSEZUCQkyNAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9HUjBfQU9FUlIxX1NIRlQJCTI1CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0dSMV9BT0VSUjFfU0hGVAkJMjYKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfWEJfQU9FUlIxX1NIRlQJCTI3CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1JUX0FPRVJSMV9TSEZUCQkyOAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9OSTBfQU9FUlIxX1NIRlQJCTI5CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX05JMV9BT0VSUjFfU0hGVAkJMzAKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfU1lTVEVNX1NIVVRET1dOX0lOVF9TSEZUCTMxCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMF9TSEZUCQkzMgorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzFfU0hGVAkJMzMKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8yX1NIRlQJCTM0CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfM19TSEZUCQkzNQorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzRfU0hGVAkJMzYKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF81X1NIRlQJCTM3CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfNl9TSEZUCQkzOAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzdfU0hGVAkJMzkKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF84X1NIRlQJCTQwCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfOV9TSEZUCQk0MQorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzEwX1NIRlQJCTQyCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTFfU0hGVAkJNDMKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xMl9TSEZUCQk0NAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzEzX1NIRlQJCTQ1CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTRfU0hGVAkJNDYKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xNV9TSEZUCQk0NworI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MMV9OTUlfSU5UX1NIRlQJCTQ4CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1NUT1BfQ0xPQ0tfU0hGVAkJNDkKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfQVNJQ19UT19MMV9TSEZUCQk1MAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MMV9UT19BU0lDX1NIRlQJCTUxCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xBX1NFUV9UUklHR0VSX1NIRlQJNTIKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfSVBJX0lOVF9TSEZUCQk1MworI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9FWFRJT19JTlQwX1NIRlQJCTU0CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0VYVElPX0lOVDFfU0hGVAkJNTUKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfRVhUSU9fSU5UMl9TSEZUCQk1NgorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9FWFRJT19JTlQzX1NIRlQJCTU3CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1BST0ZJTEVfSU5UX1NIRlQJCTU4CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0hDRVJSX01BU0sJCTB4MDAwMDAwMDAwMDAwMDAwMVVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1FQX0hDRVJSX01BU0sJCTB4MDAwMDAwMDAwMDAwMDAwMlVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1JIX0hDRVJSX01BU0sJCTB4MDAwMDAwMDAwMDAwMDAwNFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xIMF9IQ0VSUl9NQVNLCQkweDAwMDAwMDAwMDAwMDAwMDhVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MSDFfSENFUlJfTUFTSwkJMHgwMDAwMDAwMDAwMDAwMDEwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfR1IwX0hDRVJSX01BU0sJCTB4MDAwMDAwMDAwMDAwMDAyMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0dSMV9IQ0VSUl9NQVNLCQkweDAwMDAwMDAwMDAwMDAwNDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9OSTBfSENFUlJfTUFTSwkJMHgwMDAwMDAwMDAwMDAwMDgwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTkkxX0hDRVJSX01BU0sJCTB4MDAwMDAwMDAwMDAwMDEwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0FPRVJSMF9NQVNLCQkweDAwMDAwMDAwMDAwMDAyMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9RUF9BT0VSUjBfTUFTSwkJMHgwMDAwMDAwMDAwMDAwNDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfUkhfQU9FUlIwX01BU0sJCTB4MDAwMDAwMDAwMDAwMDgwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xIMF9BT0VSUjBfTUFTSwkJMHgwMDAwMDAwMDAwMDAxMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEgxX0FPRVJSMF9NQVNLCQkweDAwMDAwMDAwMDAwMDIwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9HUjBfQU9FUlIwX01BU0sJCTB4MDAwMDAwMDAwMDAwNDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0dSMV9BT0VSUjBfTUFTSwkJMHgwMDAwMDAwMDAwMDA4MDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfWEJfQU9FUlIwX01BU0sJCTB4MDAwMDAwMDAwMDAxMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1JUX0FPRVJSMF9NQVNLCQkweDAwMDAwMDAwMDAwMjAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9OSTBfQU9FUlIwX01BU0sJCTB4MDAwMDAwMDAwMDA0MDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX05JMV9BT0VSUjBfTUFTSwkJMHgwMDAwMDAwMDAwMDgwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfQU9FUlIxX01BU0sJCTB4MDAwMDAwMDAwMDEwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX1FQX0FPRVJSMV9NQVNLCQkweDAwMDAwMDAwMDAyMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9SSF9BT0VSUjFfTUFTSwkJMHgwMDAwMDAwMDAwNDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEgwX0FPRVJSMV9NQVNLCQkweDAwMDAwMDAwMDA4MDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MSDFfQU9FUlIxX01BU0sJCTB4MDAwMDAwMDAwMTAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0dSMF9BT0VSUjFfTUFTSwkJMHgwMDAwMDAwMDAyMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfR1IxX0FPRVJSMV9NQVNLCQkweDAwMDAwMDAwMDQwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9YQl9BT0VSUjFfTUFTSwkJMHgwMDAwMDAwMDA4MDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfUlRfQU9FUlIxX01BU0sJCTB4MDAwMDAwMDAxMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX05JMF9BT0VSUjFfTUFTSwkJMHgwMDAwMDAwMDIwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTkkxX0FPRVJSMV9NQVNLCQkweDAwMDAwMDAwNDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9TWVNURU1fU0hVVERPV05fSU5UX01BU0sJMHgwMDAwMDAwMDgwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8wX01BU0sJCTB4MDAwMDAwMDEwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMV9NQVNLCQkweDAwMDAwMDAyMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzJfTUFTSwkJMHgwMDAwMDAwNDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8zX01BU0sJCTB4MDAwMDAwMDgwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfNF9NQVNLCQkweDAwMDAwMDEwMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzVfTUFTSwkJMHgwMDAwMDAyMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF82X01BU0sJCTB4MDAwMDAwNDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfN19NQVNLCQkweDAwMDAwMDgwMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzhfTUFTSwkJMHgwMDAwMDEwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF85X01BU0sJCTB4MDAwMDAyMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTBfTUFTSwkJMHgwMDAwMDQwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xMV9NQVNLCQkweDAwMDAwODAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzEyX01BU0sJCTB4MDAwMDEwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0xCX0lSUV9JTlRfMTNfTUFTSwkJMHgwMDAwMjAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEJfSVJRX0lOVF8xNF9NQVNLCQkweDAwMDA0MDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9MQl9JUlFfSU5UXzE1X01BU0sJCTB4MDAwMDgwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0wxX05NSV9JTlRfTUFTSwkJMHgwMDAxMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfU1RPUF9DTE9DS19NQVNLCQkweDAwMDIwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9BU0lDX1RPX0wxX01BU0sJCTB4MDAwNDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0wxX1RPX0FTSUNfTUFTSwkJMHgwMDA4MDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfTEFfU0VRX1RSSUdHRVJfTUFTSwkweDAwMTAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9JUElfSU5UX01BU0sJCTB4MDAyMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0VYVElPX0lOVDBfTUFTSwkJMHgwMDQwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfRVhUSU9fSU5UMV9NQVNLCQkweDAwODAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMF9FWFRJT19JTlQyX01BU0sJCTB4MDEwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQwX0VYVElPX0lOVDNfTUFTSwkJMHgwMjAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDBfUFJPRklMRV9JTlRfTUFTSwkJMHgwNDAwMDAwMDAwMDAwMDAwVUwKIAogdW5pb24gdXZoX2V2ZW50X29jY3VycmVkMF91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2MWhfZXZlbnRfb2NjdXJyZWQwX3MgewotCXVuc2lnbmVkIGxvbmcJbGJfaGNlcnIgICAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWdyMF9oY2VyciAgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlncjFfaGNlcnIgICAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJbGhfaGNlcnIgICAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCXJoX2hjZXJyICAgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwl4bl9oY2VyciAgICAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJc2lfaGNlcnIgICAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2FvZXJyMCAgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlncjBfYW9lcnIwICAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJZ3IxX2FvZXJyMCAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWxoX2FvZXJyMCAgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlyaF9hb2VycjAgICAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJeG5fYW9lcnIwICAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCXNpX2FvZXJyMCAgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlsYl9hb2VycjEgICAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJZ3IwX2FvZXJyMSAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWdyMV9hb2VycjEgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlsaF9hb2VycjEgICAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJcmhfYW9lcnIxICAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCXhuX2FvZXJyMSAgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlzaV9hb2VycjEgICAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJcmhfdnBpX2ludCAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCXN5c3RlbV9zaHV0ZG93bl9pbnQgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8xICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMiAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzMgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF80ICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfNSAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzYgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF83ICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfOCAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzkgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8xMCAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMTEgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzEyICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8xMyAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMTQgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzE1ICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJbDFfbm1pX2ludCAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCXN0b3BfY2xvY2sgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlhc2ljX3RvX2wxICAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJbDFfdG9fYXNpYyAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWx0Y19pbnQgICAgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlsYV9zZXFfdHJpZ2dlciAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJaXBpX2ludCAgICAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWV4dGlvX2ludDAgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlleHRpb19pbnQxICAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJZXh0aW9faW50MiAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWV4dGlvX2ludDMgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlwcm9maWxlX2ludCAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjMCAgICAgICAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCXJ0YzEgICAgICAgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlydGMyICAgICAgICAgICAgICAgICA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjMyAgICAgICAgICAgICAgICAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCWJhdV9kYXRhICAgICAgICAgICAgIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlwb3dlcl9tYW5hZ2VtZW50X3JlcSA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF81N182MyAgICAgICAgICAgOiAgNzsgIC8qICAgICovCi0gICAgfSBzMTsKLSAgICBzdHJ1Y3QgdXYyaF9ldmVudF9vY2N1cnJlZDBfcyB7Ci0JdW5zaWduZWQgbG9uZwlsYl9oY2VyciAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcXBfaGNlcnIgICAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJoX2hjZXJyICAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlsaDBfaGNlcnIgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbGgxX2hjZXJyICAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWdyMF9oY2VyciAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlncjFfaGNlcnIgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbmkwX2hjZXJyICAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCW5pMV9oY2VyciAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlsYl9hb2VycjAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcXBfYW9lcnIwICAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJoX2FvZXJyMCAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlsaDBfYW9lcnIwICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbGgxX2FvZXJyMCAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWdyMF9hb2VycjAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlncjFfYW9lcnIwICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJeGJfYW9lcnIwICAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJ0X2FvZXJyMCAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwluaTBfYW9lcnIwICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbmkxX2FvZXJyMCAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2FvZXJyMSAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlxcF9hb2VycjEgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcmhfYW9lcnIxICAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWxoMF9hb2VycjEgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlsaDFfYW9lcnIxICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZ3IwX2FvZXJyMSAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWdyMV9hb2VycjEgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwl4Yl9hb2VycjEgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRfYW9lcnIxICAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCW5pMF9hb2VycjEgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwluaTFfYW9lcnIxICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJc3lzdGVtX3NodXRkb3duX2ludCA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMCAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzEgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8yICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMyAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzQgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF81ICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfNiAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzcgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF84ICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfOSAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzEwICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8xMSAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMTIgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzEzICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8xNCAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMTUgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlsMV9ubWlfaW50ICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJc3RvcF9jbG9jayAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWFzaWNfdG9fbDEgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlsMV90b19hc2ljICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbGFfc2VxX3RyaWdnZXIgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWlwaV9pbnQgICAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlleHRpb19pbnQwICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZXh0aW9faW50MSAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWV4dGlvX2ludDIgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlleHRpb19pbnQzICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcHJvZmlsZV9pbnQgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfNTlfNjMgICAgICAgICAgOiAgNTsgIC8qICAgICovCi0gICAgfSBzMjsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2MWhfZXZlbnRfb2NjdXJyZWQwX3MgeworCQl1bnNpZ25lZCBsb25nCWxiX2hjZXJyOjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWdyMF9oY2VycjoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlncjFfaGNlcnI6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJbGhfaGNlcnI6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJcmhfaGNlcnI6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJeG5faGNlcnI6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJc2lfaGNlcnI6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJbGJfYW9lcnIwOjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWdyMF9hb2VycjA6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJZ3IxX2FvZXJyMDoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlsaF9hb2VycjA6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJcmhfYW9lcnIwOjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCXhuX2FvZXJyMDoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlzaV9hb2VycjA6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJbGJfYW9lcnIxOjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWdyMF9hb2VycjE6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJZ3IxX2FvZXJyMToxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlsaF9hb2VycjE6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJcmhfYW9lcnIxOjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCXhuX2FvZXJyMToxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlzaV9hb2VycjE6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJcmhfdnBpX2ludDoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlzeXN0ZW1fc2h1dGRvd25faW50OjE7CQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8wOjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMToxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzI6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8zOjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfNDoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzU6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF82OjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfNzoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50Xzg6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF85OjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMTA6MTsJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzExOjE7CQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8xMjoxOwkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMTM6MTsJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzE0OjE7CQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8xNToxOwkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWwxX25taV9pbnQ6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJc3RvcF9jbG9jazoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlhc2ljX3RvX2wxOjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWwxX3RvX2FzaWM6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJbHRjX2ludDoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlsYV9zZXFfdHJpZ2dlcjoxOwkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWlwaV9pbnQ6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJZXh0aW9faW50MDoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlleHRpb19pbnQxOjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCWV4dGlvX2ludDI6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJZXh0aW9faW50MzoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlwcm9maWxlX2ludDoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlydGMwOjE7CQkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlydGMxOjE7CQkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlydGMyOjE7CQkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlydGMzOjE7CQkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwliYXVfZGF0YToxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlwb3dlcl9tYW5hZ2VtZW50X3JlcToxOwkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNTdfNjM6NzsKKwl9IHMxOworCXN0cnVjdCB1djJoX2V2ZW50X29jY3VycmVkMF9zIHsKKwkJdW5zaWduZWQgbG9uZwlsYl9oY2VycjoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcXBfaGNlcnI6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJoX2hjZXJyOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsaDBfaGNlcnI6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWxoMV9oY2VycjoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZ3IwX2hjZXJyOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlncjFfaGNlcnI6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCW5pMF9oY2VycjoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbmkxX2hjZXJyOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsYl9hb2VycjA6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXFwX2FvZXJyMDoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcmhfYW9lcnIwOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsaDBfYW9lcnIwOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsaDFfYW9lcnIwOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlncjBfYW9lcnIwOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlncjFfYW9lcnIwOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwl4Yl9hb2VycjA6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJ0X2FvZXJyMDoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbmkwX2FvZXJyMDoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbmkxX2FvZXJyMDoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbGJfYW9lcnIxOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlxcF9hb2VycjE6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJoX2FvZXJyMToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbGgwX2FvZXJyMToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbGgxX2FvZXJyMToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZ3IwX2FvZXJyMToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZ3IxX2FvZXJyMToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJeGJfYW9lcnIxOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlydF9hb2VycjE6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCW5pMF9hb2VycjE6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCW5pMV9hb2VycjE6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXN5c3RlbV9zaHV0ZG93bl9pbnQ6MTsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8wOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzE6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMjoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8zOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzQ6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfNToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF82OjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50Xzc6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfODoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF85OjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzEwOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMTE6MTsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8xMjoxOwkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsYl9pcnFfaW50XzEzOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWxiX2lycV9pbnRfMTQ6MTsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbGJfaXJxX2ludF8xNToxOwkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsMV9ubWlfaW50OjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlzdG9wX2Nsb2NrOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlhc2ljX3RvX2wxOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsMV90b19hc2ljOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlsYV9zZXFfdHJpZ2dlcjoxOwkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlpcGlfaW50OjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlleHRpb19pbnQwOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlleHRpb19pbnQxOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlleHRpb19pbnQyOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlleHRpb19pbnQzOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlwcm9maWxlX2ludDoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF81OV82Mzo1OworCX0gczI7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgIFVWSF9FVkVOVF9PQ0NVUlJFRDBfQUxJQVMgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9FVkVOVF9PQ0NVUlJFRDBfQUxJQVMgMHgwMDAwMDAwMDAwMDcwMDA4VUwKLSNkZWZpbmUgVVZIX0VWRU5UX09DQ1VSUkVEMF9BTElBU18zMiAweDVmMAorI2RlZmluZSBVVkhfRVZFTlRfT0NDVVJSRUQwX0FMSUFTCQkJMHgwMDAwMDAwMDAwMDcwMDA4VUwKKyNkZWZpbmUgVVZIX0VWRU5UX09DQ1VSUkVEMF9BTElBU18zMgkJCTB4NWYwCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUcgMHg2MWIwMFVMCisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHCQkJCTB4NjFiMDBVTAogCi0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX1ZFQ1RPUl9TSEZUIDAKLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfVkVDVE9SX01BU0sgMHgwMDAwMDAwMDAwMDAwMGZmVUwKLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfRE1fU0hGVCA4Ci0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX0RNX01BU0sgMHgwMDAwMDAwMDAwMDAwNzAwVUwKLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfREVTVE1PREVfU0hGVCAxMQotI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQwX0NPTkZJR19ERVNUTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDAwMDgwMFVMCi0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX1NUQVRVU19TSEZUIDEyCi0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX1NUQVRVU19NQVNLIDB4MDAwMDAwMDAwMDAwMTAwMFVMCi0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX1BfU0hGVCAxMwotI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQwX0NPTkZJR19QX01BU0sgMHgwMDAwMDAwMDAwMDAyMDAwVUwKLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfVF9TSEZUIDE1Ci0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX1RfTUFTSyAweDAwMDAwMDAwMDAwMDgwMDBVTAotI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQwX0NPTkZJR19NX1NIRlQgMTYKLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfTV9NQVNLIDB4MDAwMDAwMDAwMDAxMDAwMFVMCi0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX0FQSUNfSURfU0hGVCAzMgotI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQwX0NPTkZJR19BUElDX0lEX01BU0sgMHhmZmZmZmZmZjAwMDAwMDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfVkVDVE9SX1NIRlQJCTAKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfRE1fU0hGVAkJCTgKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfREVTVE1PREVfU0hGVAkJMTEKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfU1RBVFVTX1NIRlQJCTEyCisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX1BfU0hGVAkJCTEzCisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX1RfU0hGVAkJCTE1CisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX01fU0hGVAkJCTE2CisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX0FQSUNfSURfU0hGVAkJMzIKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfVkVDVE9SX01BU0sJCTB4MDAwMDAwMDAwMDAwMDBmZlVMCisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDBfQ09ORklHX0RNX01BU0sJCQkweDAwMDAwMDAwMDAwMDA3MDBVTAorI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQwX0NPTkZJR19ERVNUTU9ERV9NQVNLCQkweDAwMDAwMDAwMDAwMDA4MDBVTAorI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQwX0NPTkZJR19TVEFUVVNfTUFTSwkJMHgwMDAwMDAwMDAwMDAxMDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfUF9NQVNLCQkJMHgwMDAwMDAwMDAwMDAyMDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfVF9NQVNLCQkJMHgwMDAwMDAwMDAwMDA4MDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfTV9NQVNLCQkJMHgwMDAwMDAwMDAwMDEwMDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMF9DT05GSUdfQVBJQ19JRF9NQVNLCQkweGZmZmZmZmZmMDAwMDAwMDBVTAogCiB1bmlvbiB1dmhfZ3IwX3RsYl9pbnQwX2NvbmZpZ191IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9ncjBfdGxiX2ludDBfY29uZmlnX3MgewotCXVuc2lnbmVkIGxvbmcJdmVjdG9yXyAgOiAgODsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlkbSAgICAgICA6ICAzOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWRlc3Rtb2RlIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJc3RhdHVzICAgOiAgMTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwlwICAgICAgICA6ICAxOyAgLyogUk8gKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfMTQgIDogIDE7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJdCAgICAgICAgOiAgMTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwltICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfMTdfMzE6IDE1OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWFwaWNfaWQgIDogMzI7ICAvKiBSVyAqLwotICAgIH0gczsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9ncjBfdGxiX2ludDBfY29uZmlnX3MgeworCQl1bnNpZ25lZCBsb25nCXZlY3Rvcl86ODsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWRtOjM7CQkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZGVzdG1vZGU6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXN0YXR1czoxOwkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJcDoxOwkJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTQ6MTsKKwkJdW5zaWduZWQgbG9uZwl0OjE7CQkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJbToxOwkJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTdfMzE6MTU7CisJCXVuc2lnbmVkIGxvbmcJYXBpY19pZDozMjsJCQkvKiBSVyAqLworCX0gczsKIH07CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUcgMHg2MWI0MFVMCisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHCQkJCTB4NjFiNDBVTAogCi0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX1ZFQ1RPUl9TSEZUIDAKLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfVkVDVE9SX01BU0sgMHgwMDAwMDAwMDAwMDAwMGZmVUwKLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfRE1fU0hGVCA4Ci0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX0RNX01BU0sgMHgwMDAwMDAwMDAwMDAwNzAwVUwKLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfREVTVE1PREVfU0hGVCAxMQotI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQxX0NPTkZJR19ERVNUTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDAwMDgwMFVMCi0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX1NUQVRVU19TSEZUIDEyCi0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX1NUQVRVU19NQVNLIDB4MDAwMDAwMDAwMDAwMTAwMFVMCi0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX1BfU0hGVCAxMwotI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQxX0NPTkZJR19QX01BU0sgMHgwMDAwMDAwMDAwMDAyMDAwVUwKLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfVF9TSEZUIDE1Ci0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX1RfTUFTSyAweDAwMDAwMDAwMDAwMDgwMDBVTAotI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQxX0NPTkZJR19NX1NIRlQgMTYKLSNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfTV9NQVNLIDB4MDAwMDAwMDAwMDAxMDAwMFVMCi0jZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX0FQSUNfSURfU0hGVCAzMgotI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQxX0NPTkZJR19BUElDX0lEX01BU0sgMHhmZmZmZmZmZjAwMDAwMDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfVkVDVE9SX1NIRlQJCTAKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfRE1fU0hGVAkJCTgKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfREVTVE1PREVfU0hGVAkJMTEKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfU1RBVFVTX1NIRlQJCTEyCisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX1BfU0hGVAkJCTEzCisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX1RfU0hGVAkJCTE1CisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX01fU0hGVAkJCTE2CisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX0FQSUNfSURfU0hGVAkJMzIKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfVkVDVE9SX01BU0sJCTB4MDAwMDAwMDAwMDAwMDBmZlVMCisjZGVmaW5lIFVWSF9HUjBfVExCX0lOVDFfQ09ORklHX0RNX01BU0sJCQkweDAwMDAwMDAwMDAwMDA3MDBVTAorI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQxX0NPTkZJR19ERVNUTU9ERV9NQVNLCQkweDAwMDAwMDAwMDAwMDA4MDBVTAorI2RlZmluZSBVVkhfR1IwX1RMQl9JTlQxX0NPTkZJR19TVEFUVVNfTUFTSwkJMHgwMDAwMDAwMDAwMDAxMDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfUF9NQVNLCQkJMHgwMDAwMDAwMDAwMDAyMDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfVF9NQVNLCQkJMHgwMDAwMDAwMDAwMDA4MDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfTV9NQVNLCQkJMHgwMDAwMDAwMDAwMDEwMDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfSU5UMV9DT05GSUdfQVBJQ19JRF9NQVNLCQkweGZmZmZmZmZmMDAwMDAwMDBVTAogCiB1bmlvbiB1dmhfZ3IwX3RsYl9pbnQxX2NvbmZpZ191IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9ncjBfdGxiX2ludDFfY29uZmlnX3MgewotCXVuc2lnbmVkIGxvbmcJdmVjdG9yXyAgOiAgODsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlkbSAgICAgICA6ICAzOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWRlc3Rtb2RlIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJc3RhdHVzICAgOiAgMTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwlwICAgICAgICA6ICAxOyAgLyogUk8gKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfMTQgIDogIDE7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJdCAgICAgICAgOiAgMTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwltICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfMTdfMzE6IDE1OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWFwaWNfaWQgIDogMzI7ICAvKiBSVyAqLwotICAgIH0gczsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9ncjBfdGxiX2ludDFfY29uZmlnX3MgeworCQl1bnNpZ25lZCBsb25nCXZlY3Rvcl86ODsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWRtOjM7CQkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZGVzdG1vZGU6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXN0YXR1czoxOwkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJcDoxOwkJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTQ6MTsKKwkJdW5zaWduZWQgbG9uZwl0OjE7CQkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJbToxOwkJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTdfMzE6MTU7CisJCXVuc2lnbmVkIGxvbmcJYXBpY19pZDozMjsJCQkvKiBSVyAqLworCX0gczsKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIFVWSF9HUjBfVExCX01NUl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgVVYxSF9HUjBfVExCX01NUl9DT05UUk9MIDB4NDAxMDgwVUwKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MIDB4YzAxMDgwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX0NPTlRST0wgKGlzX3V2MV9odWIoKSA/CQkJCVwKKwkJCVVWMUhfR1IwX1RMQl9NTVJfQ09OVFJPTCA6CQkJXAorCQkJVVYySF9HUjBfVExCX01NUl9DT05UUk9MKQorCisjZGVmaW5lIFVWSF9HUjBfVExCX01NUl9DT05UUk9MX0lOREVYX1NIRlQJCTAKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX0NPTlRST0xfTUVNX1NFTF9TSEZUCQkxMgorI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfQ09OVFJPTF9BVVRPX1ZBTElEX0VOX1NIRlQJMTYKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX0NPTlRST0xfTU1SX0hBU0hfSU5ERVhfRU5fU0hGVAkyMAorI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NTVJfV1JJVEVfU0hGVAkJMzAKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX0NPTlRST0xfTU1SX1JFQURfU0hGVAkJMzEKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX0NPTlRST0xfSU5ERVhfTUFTSwkJMHgwMDAwMDAwMDAwMDAwZmZmVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX0NPTlRST0xfTUVNX1NFTF9NQVNLCQkweDAwMDAwMDAwMDAwMDMwMDBVTAorI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfQ09OVFJPTF9BVVRPX1ZBTElEX0VOX01BU0sJMHgwMDAwMDAwMDAwMDEwMDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX0NPTlRST0xfTU1SX0hBU0hfSU5ERVhfRU5fTUFTSwkweDAwMDAwMDAwMDAxMDAwMDBVTAorI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NTVJfV1JJVEVfTUFTSwkJMHgwMDAwMDAwMDQwMDAwMDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX0NPTlRST0xfTU1SX1JFQURfTUFTSwkJMHgwMDAwMDAwMDgwMDAwMDAwVUwKKworI2RlZmluZSBVVjFIX0dSMF9UTEJfTU1SX0NPTlRST0xfSU5ERVhfU0hGVAkJMAorI2RlZmluZSBVVjFIX0dSMF9UTEJfTU1SX0NPTlRST0xfTUVNX1NFTF9TSEZUCQkxMgorI2RlZmluZSBVVjFIX0dSMF9UTEJfTU1SX0NPTlRST0xfQVVUT19WQUxJRF9FTl9TSEZUCTE2CisjZGVmaW5lIFVWMUhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NTVJfSEFTSF9JTkRFWF9FTl9TSEZUCTIwCisjZGVmaW5lIFVWMUhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NTVJfV1JJVEVfU0hGVAkJMzAKKyNkZWZpbmUgVVYxSF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9SRUFEX1NIRlQJCTMxCisjZGVmaW5lIFVWMUhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NTVJfSU5KX0NPTl9TSEZUCTQ4CisjZGVmaW5lIFVWMUhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NTVJfSU5KX1RMQlJBTV9TSEZUCTUyCisjZGVmaW5lIFVWMUhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NTVJfSU5KX1RMQlBHU0laRV9TSEZUCTU0CisjZGVmaW5lIFVWMUhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NTVJfSU5KX1RMQlJSRUdfU0hGVAk1NgorI2RlZmluZSBVVjFIX0dSMF9UTEJfTU1SX0NPTlRST0xfTU1SX0lOSl9UTEJMUlVWX1NIRlQJNjAKKyNkZWZpbmUgVVYxSF9HUjBfVExCX01NUl9DT05UUk9MX0lOREVYX01BU0sJCTB4MDAwMDAwMDAwMDAwMGZmZlVMCisjZGVmaW5lIFVWMUhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NRU1fU0VMX01BU0sJCTB4MDAwMDAwMDAwMDAwMzAwMFVMCisjZGVmaW5lIFVWMUhfR1IwX1RMQl9NTVJfQ09OVFJPTF9BVVRPX1ZBTElEX0VOX01BU0sJMHgwMDAwMDAwMDAwMDEwMDAwVUwKKyNkZWZpbmUgVVYxSF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9IQVNIX0lOREVYX0VOX01BU0sJMHgwMDAwMDAwMDAwMTAwMDAwVUwKKyNkZWZpbmUgVVYxSF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9XUklURV9NQVNLCQkweDAwMDAwMDAwNDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0dSMF9UTEJfTU1SX0NPTlRST0xfTU1SX1JFQURfTUFTSwkJMHgwMDAwMDAwMDgwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9JTkpfQ09OX01BU0sJMHgwMDAxMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9JTkpfVExCUkFNX01BU0sJMHgwMDEwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9JTkpfVExCUEdTSVpFX01BU0sJMHgwMDQwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9JTkpfVExCUlJFR19NQVNLCTB4MDEwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NTVJfSU5KX1RMQkxSVVZfTUFTSwkweDEwMDAwMDAwMDAwMDAwMDBVTAorCisjZGVmaW5lIFVWMkhfR1IwX1RMQl9NTVJfQ09OVFJPTF9JTkRFWF9TSEZUCQkwCisjZGVmaW5lIFVWMkhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NRU1fU0VMX1NIRlQJCTEyCisjZGVmaW5lIFVWMkhfR1IwX1RMQl9NTVJfQ09OVFJPTF9BVVRPX1ZBTElEX0VOX1NIRlQJMTYKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9IQVNIX0lOREVYX0VOX1NIRlQJMjAKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9XUklURV9TSEZUCQkzMAorI2RlZmluZSBVVjJIX0dSMF9UTEJfTU1SX0NPTlRST0xfTU1SX1JFQURfU0hGVAkJMzEKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9PUF9ET05FX1NIRlQJMzIKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9JTkpfQ09OX1NIRlQJNDgKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9JTkpfVExCUkFNX1NIRlQJNTIKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MX0lOREVYX01BU0sJCTB4MDAwMDAwMDAwMDAwMGZmZlVMCisjZGVmaW5lIFVWMkhfR1IwX1RMQl9NTVJfQ09OVFJPTF9NRU1fU0VMX01BU0sJCTB4MDAwMDAwMDAwMDAwMzAwMFVMCisjZGVmaW5lIFVWMkhfR1IwX1RMQl9NTVJfQ09OVFJPTF9BVVRPX1ZBTElEX0VOX01BU0sJMHgwMDAwMDAwMDAwMDEwMDAwVUwKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9IQVNIX0lOREVYX0VOX01BU0sJMHgwMDAwMDAwMDAwMTAwMDAwVUwKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9XUklURV9NQVNLCQkweDAwMDAwMDAwNDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0dSMF9UTEJfTU1SX0NPTlRST0xfTU1SX1JFQURfTUFTSwkJMHgwMDAwMDAwMDgwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9PUF9ET05FX01BU0sJMHgwMDAwMDAwMTAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9JTkpfQ09OX01BU0sJMHgwMDAxMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9DT05UUk9MX01NUl9JTkpfVExCUkFNX01BU0sJMHgwMDEwMDAwMDAwMDAwMDAwVUwKKwordW5pb24gdXZoX2dyMF90bGJfbW1yX2NvbnRyb2xfdSB7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfZ3IwX3RsYl9tbXJfY29udHJvbF9zIHsKKwkJdW5zaWduZWQgbG9uZwlpbmRleDoxMjsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCW1lbV9zZWw6MjsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTRfMTU6MjsKKwkJdW5zaWduZWQgbG9uZwlhdXRvX3ZhbGlkX2VuOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTdfMTk6MzsKKwkJdW5zaWduZWQgbG9uZwltbXJfaGFzaF9pbmRleF9lbjoxOwkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzIxXzI5Ojk7CisJCXVuc2lnbmVkIGxvbmcJbW1yX3dyaXRlOjE7CQkJLyogV1AgKi8KKwkJdW5zaWduZWQgbG9uZwltbXJfcmVhZDoxOwkJCS8qIFdQICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8zMl82MzozMjsKKwl9IHM7CisJc3RydWN0IHV2MWhfZ3IwX3RsYl9tbXJfY29udHJvbF9zIHsKKwkJdW5zaWduZWQgbG9uZwlpbmRleDoxMjsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCW1lbV9zZWw6MjsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTRfMTU6MjsKKwkJdW5zaWduZWQgbG9uZwlhdXRvX3ZhbGlkX2VuOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTdfMTk6MzsKKwkJdW5zaWduZWQgbG9uZwltbXJfaGFzaF9pbmRleF9lbjoxOwkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzIxXzI5Ojk7CisJCXVuc2lnbmVkIGxvbmcJbW1yX3dyaXRlOjE7CQkJLyogV1AgKi8KKwkJdW5zaWduZWQgbG9uZwltbXJfcmVhZDoxOwkJCS8qIFdQICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8zMl80NzoxNjsKKwkJdW5zaWduZWQgbG9uZwltbXJfaW5qX2NvbjoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF80OV81MTozOworCQl1bnNpZ25lZCBsb25nCW1tcl9pbmpfdGxicmFtOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNTM6MTsKKwkJdW5zaWduZWQgbG9uZwltbXJfaW5qX3RsYnBnc2l6ZToxOwkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzU1OjE7CisJCXVuc2lnbmVkIGxvbmcJbW1yX2lual90bGJycmVnOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNTdfNTk6MzsKKwkJdW5zaWduZWQgbG9uZwltbXJfaW5qX3RsYmxydXY6MTsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF82MV82MzozOworCX0gczE7CisJc3RydWN0IHV2MmhfZ3IwX3RsYl9tbXJfY29udHJvbF9zIHsKKwkJdW5zaWduZWQgbG9uZwlpbmRleDoxMjsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCW1lbV9zZWw6MjsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTRfMTU6MjsKKwkJdW5zaWduZWQgbG9uZwlhdXRvX3ZhbGlkX2VuOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTdfMTk6MzsKKwkJdW5zaWduZWQgbG9uZwltbXJfaGFzaF9pbmRleF9lbjoxOwkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzIxXzI5Ojk7CisJCXVuc2lnbmVkIGxvbmcJbW1yX3dyaXRlOjE7CQkJLyogV1AgKi8KKwkJdW5zaWduZWQgbG9uZwltbXJfcmVhZDoxOwkJCS8qIFdQICovCisJCXVuc2lnbmVkIGxvbmcJbW1yX29wX2RvbmU6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMzNfNDc6MTU7CisJCXVuc2lnbmVkIGxvbmcJbW1yX2lual9jb246MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDlfNTE6MzsKKwkJdW5zaWduZWQgbG9uZwltbXJfaW5qX3RsYnJhbToxOwkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzUzXzYzOjExOworCX0gczI7Cit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgVVZIX0dSMF9UTEJfTU1SX1JFQURfREFUQV9ISSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIFVWMUhfR1IwX1RMQl9NTVJfUkVBRF9EQVRBX0hJIDB4NDAxMGEwVUwKKyNkZWZpbmUgVVYySF9HUjBfVExCX01NUl9SRUFEX0RBVEFfSEkgMHhjMDEwYTBVTAorI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfUkVBRF9EQVRBX0hJIChpc191djFfaHViKCkgPwkJCVwKKwkJCVVWMUhfR1IwX1RMQl9NTVJfUkVBRF9EQVRBX0hJIDoJCQlcCisJCQlVVjJIX0dSMF9UTEJfTU1SX1JFQURfREFUQV9ISSkKKworI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfUkVBRF9EQVRBX0hJX1BGTl9TSEZUCQkwCisjZGVmaW5lIFVWSF9HUjBfVExCX01NUl9SRUFEX0RBVEFfSElfR0FBX1NIRlQJCTQxCisjZGVmaW5lIFVWSF9HUjBfVExCX01NUl9SRUFEX0RBVEFfSElfRElSVFlfU0hGVAkJNDMKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX1JFQURfREFUQV9ISV9MQVJHRVJfU0hGVAk0NAorI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfUkVBRF9EQVRBX0hJX1BGTl9NQVNLCQkweDAwMDAwMWZmZmZmZmZmZmZVTAorI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfUkVBRF9EQVRBX0hJX0dBQV9NQVNLCQkweDAwMDAwNjAwMDAwMDAwMDBVTAorI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfUkVBRF9EQVRBX0hJX0RJUlRZX01BU0sJCTB4MDAwMDA4MDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWSF9HUjBfVExCX01NUl9SRUFEX0RBVEFfSElfTEFSR0VSX01BU0sJMHgwMDAwMTAwMDAwMDAwMDAwVUwKKwordW5pb24gdXZoX2dyMF90bGJfbW1yX3JlYWRfZGF0YV9oaV91IHsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9ncjBfdGxiX21tcl9yZWFkX2RhdGFfaGlfcyB7CisJCXVuc2lnbmVkIGxvbmcJcGZuOjQxOwkJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCWdhYToyOwkJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCWRpcnR5OjE7CQkJLyogUk8gKi8KKwkJdW5zaWduZWQgbG9uZwlsYXJnZXI6MTsJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDVfNjM6MTk7CisJfSBzOworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgIFVWSF9HUjBfVExCX01NUl9SRUFEX0RBVEFfTE8gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBVVjFIX0dSMF9UTEJfTU1SX1JFQURfREFUQV9MTyAweDQwMTBhOFVMCisjZGVmaW5lIFVWMkhfR1IwX1RMQl9NTVJfUkVBRF9EQVRBX0xPIDB4YzAxMGE4VUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX1JFQURfREFUQV9MTyAoaXNfdXYxX2h1YigpID8JCQlcCisJCQlVVjFIX0dSMF9UTEJfTU1SX1JFQURfREFUQV9MTyA6CQkJXAorCQkJVVYySF9HUjBfVExCX01NUl9SRUFEX0RBVEFfTE8pCisKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX1JFQURfREFUQV9MT19WUE5fU0hGVAkJMAorI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfUkVBRF9EQVRBX0xPX0FTSURfU0hGVAkJMzkKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX1JFQURfREFUQV9MT19WQUxJRF9TSEZUCQk2MworI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfUkVBRF9EQVRBX0xPX1ZQTl9NQVNLCQkweDAwMDAwMDdmZmZmZmZmZmZVTAorI2RlZmluZSBVVkhfR1IwX1RMQl9NTVJfUkVBRF9EQVRBX0xPX0FTSURfTUFTSwkJMHg3ZmZmZmY4MDAwMDAwMDAwVUwKKyNkZWZpbmUgVVZIX0dSMF9UTEJfTU1SX1JFQURfREFUQV9MT19WQUxJRF9NQVNLCQkweDgwMDAwMDAwMDAwMDAwMDBVTAorCit1bmlvbiB1dmhfZ3IwX3RsYl9tbXJfcmVhZF9kYXRhX2xvX3UgeworCXVuc2lnbmVkIGxvbmcJdjsKKwlzdHJ1Y3QgdXZoX2dyMF90bGJfbW1yX3JlYWRfZGF0YV9sb19zIHsKKwkJdW5zaWduZWQgbG9uZwl2cG46Mzk7CQkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJYXNpZDoyNDsJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCXZhbGlkOjE7CQkJLyogUk8gKi8KKwl9IHM7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHIDB4NjFmMDBVTAorI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJRwkJCQkweDYxZjAwVUwKIAotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19WRUNUT1JfU0hGVCAwCi0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX1ZFQ1RPUl9NQVNLIDB4MDAwMDAwMDAwMDAwMDBmZlVMCi0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX0RNX1NIRlQgOAotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19ETV9NQVNLIDB4MDAwMDAwMDAwMDAwMDcwMFVMCi0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX0RFU1RNT0RFX1NIRlQgMTEKLSNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMF9DT05GSUdfREVTVE1PREVfTUFTSyAweDAwMDAwMDAwMDAwMDA4MDBVTAotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19TVEFUVVNfU0hGVCAxMgotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19TVEFUVVNfTUFTSyAweDAwMDAwMDAwMDAwMDEwMDBVTAotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19QX1NIRlQgMTMKLSNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMF9DT05GSUdfUF9NQVNLIDB4MDAwMDAwMDAwMDAwMjAwMFVMCi0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX1RfU0hGVCAxNQotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19UX01BU0sgMHgwMDAwMDAwMDAwMDA4MDAwVUwKLSNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMF9DT05GSUdfTV9TSEZUIDE2Ci0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX01fTUFTSyAweDAwMDAwMDAwMDAwMTAwMDBVTAotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19BUElDX0lEX1NIRlQgMzIKLSNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMF9DT05GSUdfQVBJQ19JRF9NQVNLIDB4ZmZmZmZmZmYwMDAwMDAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX1ZFQ1RPUl9TSEZUCQkwCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX0RNX1NIRlQJCQk4CisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX0RFU1RNT0RFX1NIRlQJCTExCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX1NUQVRVU19TSEZUCQkxMgorI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19QX1NIRlQJCQkxMworI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19UX1NIRlQJCQkxNQorI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19NX1NIRlQJCQkxNgorI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19BUElDX0lEX1NIRlQJCTMyCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX1ZFQ1RPUl9NQVNLCQkweDAwMDAwMDAwMDAwMDAwZmZVTAorI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQwX0NPTkZJR19ETV9NQVNLCQkJMHgwMDAwMDAwMDAwMDAwNzAwVUwKKyNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMF9DT05GSUdfREVTVE1PREVfTUFTSwkJMHgwMDAwMDAwMDAwMDAwODAwVUwKKyNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMF9DT05GSUdfU1RBVFVTX01BU0sJCTB4MDAwMDAwMDAwMDAwMTAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX1BfTUFTSwkJCTB4MDAwMDAwMDAwMDAwMjAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX1RfTUFTSwkJCTB4MDAwMDAwMDAwMDAwODAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX01fTUFTSwkJCTB4MDAwMDAwMDAwMDAxMDAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDBfQ09ORklHX0FQSUNfSURfTUFTSwkJMHhmZmZmZmZmZjAwMDAwMDAwVUwKIAogdW5pb24gdXZoX2dyMV90bGJfaW50MF9jb25maWdfdSB7Ci0gICAgdW5zaWduZWQgbG9uZwl2OwotICAgIHN0cnVjdCB1dmhfZ3IxX3RsYl9pbnQwX2NvbmZpZ19zIHsKLQl1bnNpZ25lZCBsb25nCXZlY3Rvcl8gIDogIDg7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZG0gICAgICAgOiAgMzsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlkZXN0bW9kZSA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXN0YXR1cyAgIDogIDE7ICAvKiBSTyAqLwotCXVuc2lnbmVkIGxvbmcJcCAgICAgICAgOiAgMTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzE0ICA6ICAxOyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCXQgICAgICAgIDogIDE7ICAvKiBSTyAqLwotCXVuc2lnbmVkIGxvbmcJbSAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzE3XzMxOiAxNTsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwlhcGljX2lkICA6IDMyOyAgLyogUlcgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfZ3IxX3RsYl9pbnQwX2NvbmZpZ19zIHsKKwkJdW5zaWduZWQgbG9uZwl2ZWN0b3JfOjg7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlkbTozOwkJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWRlc3Rtb2RlOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlzdGF0dXM6MTsJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCXA6MTsJCQkJLyogUk8gKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzE0OjE7CisJCXVuc2lnbmVkIGxvbmcJdDoxOwkJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCW06MTsJCQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzE3XzMxOjE1OworCQl1bnNpZ25lZCBsb25nCWFwaWNfaWQ6MzI7CQkJLyogUlcgKi8KKwl9IHM7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHIDB4NjFmNDBVTAorI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJRwkJCQkweDYxZjQwVUwKIAotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19WRUNUT1JfU0hGVCAwCi0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX1ZFQ1RPUl9NQVNLIDB4MDAwMDAwMDAwMDAwMDBmZlVMCi0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX0RNX1NIRlQgOAotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19ETV9NQVNLIDB4MDAwMDAwMDAwMDAwMDcwMFVMCi0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX0RFU1RNT0RFX1NIRlQgMTEKLSNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMV9DT05GSUdfREVTVE1PREVfTUFTSyAweDAwMDAwMDAwMDAwMDA4MDBVTAotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19TVEFUVVNfU0hGVCAxMgotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19TVEFUVVNfTUFTSyAweDAwMDAwMDAwMDAwMDEwMDBVTAotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19QX1NIRlQgMTMKLSNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMV9DT05GSUdfUF9NQVNLIDB4MDAwMDAwMDAwMDAwMjAwMFVMCi0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX1RfU0hGVCAxNQotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19UX01BU0sgMHgwMDAwMDAwMDAwMDA4MDAwVUwKLSNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMV9DT05GSUdfTV9TSEZUIDE2Ci0jZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX01fTUFTSyAweDAwMDAwMDAwMDAwMTAwMDBVTAotI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19BUElDX0lEX1NIRlQgMzIKLSNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMV9DT05GSUdfQVBJQ19JRF9NQVNLIDB4ZmZmZmZmZmYwMDAwMDAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX1ZFQ1RPUl9TSEZUCQkwCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX0RNX1NIRlQJCQk4CisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX0RFU1RNT0RFX1NIRlQJCTExCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX1NUQVRVU19TSEZUCQkxMgorI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19QX1NIRlQJCQkxMworI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19UX1NIRlQJCQkxNQorI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19NX1NIRlQJCQkxNgorI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19BUElDX0lEX1NIRlQJCTMyCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX1ZFQ1RPUl9NQVNLCQkweDAwMDAwMDAwMDAwMDAwZmZVTAorI2RlZmluZSBVVkhfR1IxX1RMQl9JTlQxX0NPTkZJR19ETV9NQVNLCQkJMHgwMDAwMDAwMDAwMDAwNzAwVUwKKyNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMV9DT05GSUdfREVTVE1PREVfTUFTSwkJMHgwMDAwMDAwMDAwMDAwODAwVUwKKyNkZWZpbmUgVVZIX0dSMV9UTEJfSU5UMV9DT05GSUdfU1RBVFVTX01BU0sJCTB4MDAwMDAwMDAwMDAwMTAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX1BfTUFTSwkJCTB4MDAwMDAwMDAwMDAwMjAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX1RfTUFTSwkJCTB4MDAwMDAwMDAwMDAwODAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX01fTUFTSwkJCTB4MDAwMDAwMDAwMDAxMDAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX0lOVDFfQ09ORklHX0FQSUNfSURfTUFTSwkJMHhmZmZmZmZmZjAwMDAwMDAwVUwKIAogdW5pb24gdXZoX2dyMV90bGJfaW50MV9jb25maWdfdSB7Ci0gICAgdW5zaWduZWQgbG9uZwl2OwotICAgIHN0cnVjdCB1dmhfZ3IxX3RsYl9pbnQxX2NvbmZpZ19zIHsKLQl1bnNpZ25lZCBsb25nCXZlY3Rvcl8gIDogIDg7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZG0gICAgICAgOiAgMzsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlkZXN0bW9kZSA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXN0YXR1cyAgIDogIDE7ICAvKiBSTyAqLwotCXVuc2lnbmVkIGxvbmcJcCAgICAgICAgOiAgMTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzE0ICA6ICAxOyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCXQgICAgICAgIDogIDE7ICAvKiBSTyAqLwotCXVuc2lnbmVkIGxvbmcJbSAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzE3XzMxOiAxNTsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwlhcGljX2lkICA6IDMyOyAgLyogUlcgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfZ3IxX3RsYl9pbnQxX2NvbmZpZ19zIHsKKwkJdW5zaWduZWQgbG9uZwl2ZWN0b3JfOjg7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlkbTozOwkJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWRlc3Rtb2RlOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlzdGF0dXM6MTsJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCXA6MTsJCQkJLyogUk8gKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzE0OjE7CisJCXVuc2lnbmVkIGxvbmcJdDoxOwkJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCW06MTsJCQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzE3XzMxOjE1OworCQl1bnNpZ25lZCBsb25nCWFwaWNfaWQ6MzI7CQkJLyogUlcgKi8KKwl9IHM7Cit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBVVkhfR1IxX1RMQl9NTVJfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIFVWMUhfR1IxX1RMQl9NTVJfQ09OVFJPTCAweDgwMTA4MFVMCisjZGVmaW5lIFVWMkhfR1IxX1RMQl9NTVJfQ09OVFJPTCAweDEwMDEwODBVTAorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfQ09OVFJPTCAoaXNfdXYxX2h1YigpID8JCQkJXAorCQkJVVYxSF9HUjFfVExCX01NUl9DT05UUk9MIDoJCQlcCisJCQlVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0wpCisKKyNkZWZpbmUgVVZIX0dSMV9UTEJfTU1SX0NPTlRST0xfSU5ERVhfU0hGVAkJMAorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfQ09OVFJPTF9NRU1fU0VMX1NIRlQJCTEyCisjZGVmaW5lIFVWSF9HUjFfVExCX01NUl9DT05UUk9MX0FVVE9fVkFMSURfRU5fU0hGVAkxNgorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfQ09OVFJPTF9NTVJfSEFTSF9JTkRFWF9FTl9TSEZUCTIwCisjZGVmaW5lIFVWSF9HUjFfVExCX01NUl9DT05UUk9MX01NUl9XUklURV9TSEZUCQkzMAorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfQ09OVFJPTF9NTVJfUkVBRF9TSEZUCQkzMQorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfQ09OVFJPTF9JTkRFWF9NQVNLCQkweDAwMDAwMDAwMDAwMDBmZmZVTAorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfQ09OVFJPTF9NRU1fU0VMX01BU0sJCTB4MDAwMDAwMDAwMDAwMzAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX01NUl9DT05UUk9MX0FVVE9fVkFMSURfRU5fTUFTSwkweDAwMDAwMDAwMDAwMTAwMDBVTAorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfQ09OVFJPTF9NTVJfSEFTSF9JTkRFWF9FTl9NQVNLCTB4MDAwMDAwMDAwMDEwMDAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX01NUl9DT05UUk9MX01NUl9XUklURV9NQVNLCQkweDAwMDAwMDAwNDAwMDAwMDBVTAorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfQ09OVFJPTF9NTVJfUkVBRF9NQVNLCQkweDAwMDAwMDAwODAwMDAwMDBVTAorCisjZGVmaW5lIFVWMUhfR1IxX1RMQl9NTVJfQ09OVFJPTF9JTkRFWF9TSEZUCQkwCisjZGVmaW5lIFVWMUhfR1IxX1RMQl9NTVJfQ09OVFJPTF9NRU1fU0VMX1NIRlQJCTEyCisjZGVmaW5lIFVWMUhfR1IxX1RMQl9NTVJfQ09OVFJPTF9BVVRPX1ZBTElEX0VOX1NIRlQJMTYKKyNkZWZpbmUgVVYxSF9HUjFfVExCX01NUl9DT05UUk9MX01NUl9IQVNIX0lOREVYX0VOX1NIRlQJMjAKKyNkZWZpbmUgVVYxSF9HUjFfVExCX01NUl9DT05UUk9MX01NUl9XUklURV9TSEZUCQkzMAorI2RlZmluZSBVVjFIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX1JFQURfU0hGVAkJMzEKKyNkZWZpbmUgVVYxSF9HUjFfVExCX01NUl9DT05UUk9MX01NUl9JTkpfQ09OX1NIRlQJNDgKKyNkZWZpbmUgVVYxSF9HUjFfVExCX01NUl9DT05UUk9MX01NUl9JTkpfVExCUkFNX1NIRlQJNTIKKyNkZWZpbmUgVVYxSF9HUjFfVExCX01NUl9DT05UUk9MX01NUl9JTkpfVExCUEdTSVpFX1NIRlQJNTQKKyNkZWZpbmUgVVYxSF9HUjFfVExCX01NUl9DT05UUk9MX01NUl9JTkpfVExCUlJFR19TSEZUCTU2CisjZGVmaW5lIFVWMUhfR1IxX1RMQl9NTVJfQ09OVFJPTF9NTVJfSU5KX1RMQkxSVVZfU0hGVAk2MAorI2RlZmluZSBVVjFIX0dSMV9UTEJfTU1SX0NPTlRST0xfSU5ERVhfTUFTSwkJMHgwMDAwMDAwMDAwMDAwZmZmVUwKKyNkZWZpbmUgVVYxSF9HUjFfVExCX01NUl9DT05UUk9MX01FTV9TRUxfTUFTSwkJMHgwMDAwMDAwMDAwMDAzMDAwVUwKKyNkZWZpbmUgVVYxSF9HUjFfVExCX01NUl9DT05UUk9MX0FVVE9fVkFMSURfRU5fTUFTSwkweDAwMDAwMDAwMDAwMTAwMDBVTAorI2RlZmluZSBVVjFIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX0hBU0hfSU5ERVhfRU5fTUFTSwkweDAwMDAwMDAwMDAxMDAwMDBVTAorI2RlZmluZSBVVjFIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX1dSSVRFX01BU0sJCTB4MDAwMDAwMDA0MDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfR1IxX1RMQl9NTVJfQ09OVFJPTF9NTVJfUkVBRF9NQVNLCQkweDAwMDAwMDAwODAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX0lOSl9DT05fTUFTSwkweDAwMDEwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX0lOSl9UTEJSQU1fTUFTSwkweDAwMTAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX0lOSl9UTEJQR1NJWkVfTUFTSwkweDAwNDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX0lOSl9UTEJSUkVHX01BU0sJMHgwMTAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9HUjFfVExCX01NUl9DT05UUk9MX01NUl9JTkpfVExCTFJVVl9NQVNLCTB4MTAwMDAwMDAwMDAwMDAwMFVMCisKKyNkZWZpbmUgVVYySF9HUjFfVExCX01NUl9DT05UUk9MX0lOREVYX1NIRlQJCTAKKyNkZWZpbmUgVVYySF9HUjFfVExCX01NUl9DT05UUk9MX01FTV9TRUxfU0hGVAkJMTIKKyNkZWZpbmUgVVYySF9HUjFfVExCX01NUl9DT05UUk9MX0FVVE9fVkFMSURfRU5fU0hGVAkxNgorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX0hBU0hfSU5ERVhfRU5fU0hGVAkyMAorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX1dSSVRFX1NIRlQJCTMwCisjZGVmaW5lIFVWMkhfR1IxX1RMQl9NTVJfQ09OVFJPTF9NTVJfUkVBRF9TSEZUCQkzMQorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX09QX0RPTkVfU0hGVAkzMgorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX0lOSl9DT05fU0hGVAk0OAorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX0lOSl9UTEJSQU1fU0hGVAk1MgorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0xfSU5ERVhfTUFTSwkJMHgwMDAwMDAwMDAwMDAwZmZmVUwKKyNkZWZpbmUgVVYySF9HUjFfVExCX01NUl9DT05UUk9MX01FTV9TRUxfTUFTSwkJMHgwMDAwMDAwMDAwMDAzMDAwVUwKKyNkZWZpbmUgVVYySF9HUjFfVExCX01NUl9DT05UUk9MX0FVVE9fVkFMSURfRU5fTUFTSwkweDAwMDAwMDAwMDAwMTAwMDBVTAorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX0hBU0hfSU5ERVhfRU5fTUFTSwkweDAwMDAwMDAwMDAxMDAwMDBVTAorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX1dSSVRFX01BU0sJCTB4MDAwMDAwMDA0MDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfR1IxX1RMQl9NTVJfQ09OVFJPTF9NTVJfUkVBRF9NQVNLCQkweDAwMDAwMDAwODAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX09QX0RPTkVfTUFTSwkweDAwMDAwMDAxMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX0lOSl9DT05fTUFTSwkweDAwMDEwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX0NPTlRST0xfTU1SX0lOSl9UTEJSQU1fTUFTSwkweDAwMTAwMDAwMDAwMDAwMDBVTAorCit1bmlvbiB1dmhfZ3IxX3RsYl9tbXJfY29udHJvbF91IHsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9ncjFfdGxiX21tcl9jb250cm9sX3MgeworCQl1bnNpZ25lZCBsb25nCWluZGV4OjEyOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbWVtX3NlbDoyOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8xNF8xNToyOworCQl1bnNpZ25lZCBsb25nCWF1dG9fdmFsaWRfZW46MTsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8xN18xOTozOworCQl1bnNpZ25lZCBsb25nCW1tcl9oYXNoX2luZGV4X2VuOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMjFfMjk6OTsKKwkJdW5zaWduZWQgbG9uZwltbXJfd3JpdGU6MTsJCQkvKiBXUCAqLworCQl1bnNpZ25lZCBsb25nCW1tcl9yZWFkOjE7CQkJLyogV1AgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzMyXzYzOjMyOworCX0gczsKKwlzdHJ1Y3QgdXYxaF9ncjFfdGxiX21tcl9jb250cm9sX3MgeworCQl1bnNpZ25lZCBsb25nCWluZGV4OjEyOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbWVtX3NlbDoyOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8xNF8xNToyOworCQl1bnNpZ25lZCBsb25nCWF1dG9fdmFsaWRfZW46MTsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8xN18xOTozOworCQl1bnNpZ25lZCBsb25nCW1tcl9oYXNoX2luZGV4X2VuOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMjFfMjk6OTsKKwkJdW5zaWduZWQgbG9uZwltbXJfd3JpdGU6MTsJCQkvKiBXUCAqLworCQl1bnNpZ25lZCBsb25nCW1tcl9yZWFkOjE7CQkJLyogV1AgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzMyXzQ3OjE2OworCQl1bnNpZ25lZCBsb25nCW1tcl9pbmpfY29uOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzQ5XzUxOjM7CisJCXVuc2lnbmVkIGxvbmcJbW1yX2lual90bGJyYW06MTsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF81MzoxOworCQl1bnNpZ25lZCBsb25nCW1tcl9pbmpfdGxicGdzaXplOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNTU6MTsKKwkJdW5zaWduZWQgbG9uZwltbXJfaW5qX3RsYnJyZWc6MTsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF81N181OTozOworCQl1bnNpZ25lZCBsb25nCW1tcl9pbmpfdGxibHJ1djoxOwkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzYxXzYzOjM7CisJfSBzMTsKKwlzdHJ1Y3QgdXYyaF9ncjFfdGxiX21tcl9jb250cm9sX3MgeworCQl1bnNpZ25lZCBsb25nCWluZGV4OjEyOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbWVtX3NlbDoyOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8xNF8xNToyOworCQl1bnNpZ25lZCBsb25nCWF1dG9fdmFsaWRfZW46MTsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8xN18xOTozOworCQl1bnNpZ25lZCBsb25nCW1tcl9oYXNoX2luZGV4X2VuOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMjFfMjk6OTsKKwkJdW5zaWduZWQgbG9uZwltbXJfd3JpdGU6MTsJCQkvKiBXUCAqLworCQl1bnNpZ25lZCBsb25nCW1tcl9yZWFkOjE7CQkJLyogV1AgKi8KKwkJdW5zaWduZWQgbG9uZwltbXJfb3BfZG9uZToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8zM180NzoxNTsKKwkJdW5zaWduZWQgbG9uZwltbXJfaW5qX2NvbjoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF80OV81MTozOworCQl1bnNpZ25lZCBsb25nCW1tcl9pbmpfdGxicmFtOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNTNfNjM6MTE7CisJfSBzMjsKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBVVkhfR1IxX1RMQl9NTVJfUkVBRF9EQVRBX0hJICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgVVYxSF9HUjFfVExCX01NUl9SRUFEX0RBVEFfSEkgMHg4MDEwYTBVTAorI2RlZmluZSBVVjJIX0dSMV9UTEJfTU1SX1JFQURfREFUQV9ISSAweDEwMDEwYTBVTAorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfUkVBRF9EQVRBX0hJIChpc191djFfaHViKCkgPwkJCVwKKwkJCVVWMUhfR1IxX1RMQl9NTVJfUkVBRF9EQVRBX0hJIDoJCQlcCisJCQlVVjJIX0dSMV9UTEJfTU1SX1JFQURfREFUQV9ISSkKKworI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfUkVBRF9EQVRBX0hJX1BGTl9TSEZUCQkwCisjZGVmaW5lIFVWSF9HUjFfVExCX01NUl9SRUFEX0RBVEFfSElfR0FBX1NIRlQJCTQxCisjZGVmaW5lIFVWSF9HUjFfVExCX01NUl9SRUFEX0RBVEFfSElfRElSVFlfU0hGVAkJNDMKKyNkZWZpbmUgVVZIX0dSMV9UTEJfTU1SX1JFQURfREFUQV9ISV9MQVJHRVJfU0hGVAk0NAorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfUkVBRF9EQVRBX0hJX1BGTl9NQVNLCQkweDAwMDAwMWZmZmZmZmZmZmZVTAorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfUkVBRF9EQVRBX0hJX0dBQV9NQVNLCQkweDAwMDAwNjAwMDAwMDAwMDBVTAorI2RlZmluZSBVVkhfR1IxX1RMQl9NTVJfUkVBRF9EQVRBX0hJX0RJUlRZX01BU0sJCTB4MDAwMDA4MDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX01NUl9SRUFEX0RBVEFfSElfTEFSR0VSX01BU0sJMHgwMDAwMTAwMDAwMDAwMDAwVUwKKwordW5pb24gdXZoX2dyMV90bGJfbW1yX3JlYWRfZGF0YV9oaV91IHsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9ncjFfdGxiX21tcl9yZWFkX2RhdGFfaGlfcyB7CisJCXVuc2lnbmVkIGxvbmcJcGZuOjQxOwkJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCWdhYToyOwkJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCWRpcnR5OjE7CQkJLyogUk8gKi8KKwkJdW5zaWduZWQgbG9uZwlsYXJnZXI6MTsJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDVfNjM6MTk7CisJfSBzOworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgIFVWSF9HUjFfVExCX01NUl9SRUFEX0RBVEFfTE8gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBVVjFIX0dSMV9UTEJfTU1SX1JFQURfREFUQV9MTyAweDgwMTBhOFVMCisjZGVmaW5lIFVWMkhfR1IxX1RMQl9NTVJfUkVBRF9EQVRBX0xPIDB4MTAwMTBhOFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX01NUl9SRUFEX0RBVEFfTE8gKGlzX3V2MV9odWIoKSA/CQkJXAorCQkJVVYxSF9HUjFfVExCX01NUl9SRUFEX0RBVEFfTE8gOgkJCVwKKwkJCVVWMkhfR1IxX1RMQl9NTVJfUkVBRF9EQVRBX0xPKQorCisjZGVmaW5lIFVWSF9HUjFfVExCX01NUl9SRUFEX0RBVEFfTE9fVlBOX1NIRlQJCTAKKyNkZWZpbmUgVVZIX0dSMV9UTEJfTU1SX1JFQURfREFUQV9MT19BU0lEX1NIRlQJCTM5CisjZGVmaW5lIFVWSF9HUjFfVExCX01NUl9SRUFEX0RBVEFfTE9fVkFMSURfU0hGVAkJNjMKKyNkZWZpbmUgVVZIX0dSMV9UTEJfTU1SX1JFQURfREFUQV9MT19WUE5fTUFTSwkJMHgwMDAwMDA3ZmZmZmZmZmZmVUwKKyNkZWZpbmUgVVZIX0dSMV9UTEJfTU1SX1JFQURfREFUQV9MT19BU0lEX01BU0sJCTB4N2ZmZmZmODAwMDAwMDAwMFVMCisjZGVmaW5lIFVWSF9HUjFfVExCX01NUl9SRUFEX0RBVEFfTE9fVkFMSURfTUFTSwkJMHg4MDAwMDAwMDAwMDAwMDAwVUwKKwordW5pb24gdXZoX2dyMV90bGJfbW1yX3JlYWRfZGF0YV9sb191IHsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9ncjFfdGxiX21tcl9yZWFkX2RhdGFfbG9fcyB7CisJCXVuc2lnbmVkIGxvbmcJdnBuOjM5OwkJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCWFzaWQ6MjQ7CQkJLyogUk8gKi8KKwkJdW5zaWduZWQgbG9uZwl2YWxpZDoxOwkJCS8qIFJPICovCisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVZIX0lOVF9DTVBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfSU5UX0NNUEIgMHgyMjA4MFVMCisjZGVmaW5lIFVWSF9JTlRfQ01QQgkJCQkJMHgyMjA4MFVMCiAKLSNkZWZpbmUgVVZIX0lOVF9DTVBCX1JFQUxfVElNRV9DTVBCX1NIRlQgMAotI2RlZmluZSBVVkhfSU5UX0NNUEJfUkVBTF9USU1FX0NNUEJfTUFTSyAweDAwZmZmZmZmZmZmZmZmZmZVTAorI2RlZmluZSBVVkhfSU5UX0NNUEJfUkVBTF9USU1FX0NNUEJfU0hGVAkJMAorI2RlZmluZSBVVkhfSU5UX0NNUEJfUkVBTF9USU1FX0NNUEJfTUFTSwkJMHgwMGZmZmZmZmZmZmZmZmZmVUwKIAogdW5pb24gdXZoX2ludF9jbXBiX3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXZoX2ludF9jbXBiX3MgewotCXVuc2lnbmVkIGxvbmcJcmVhbF90aW1lX2NtcGIgOiA1NjsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzU2XzYzICAgICA6ICA4OyAgLyogICAgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfaW50X2NtcGJfcyB7CisJCXVuc2lnbmVkIGxvbmcJcmVhbF90aW1lX2NtcGI6NTY7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNTZfNjM6ODsKKwl9IHM7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVkhfSU5UX0NNUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9JTlRfQ01QQyAweDIyMTAwVUwKKyNkZWZpbmUgVVZIX0lOVF9DTVBDCQkJCQkweDIyMTAwVUwKIAotI2RlZmluZSBVVjFIX0lOVF9DTVBDX1JFQUxfVElNRV9DTVBDX1NIRlQJMAotI2RlZmluZSBVVjJIX0lOVF9DTVBDX1JFQUxfVElNRV9DTVBDX1NIRlQJMAotI2RlZmluZSBVVkhfSU5UX0NNUENfUkVBTF9USU1FX0NNUENfU0hGVAkoaXNfdXYxX2h1YigpID8JCVwKLQkJCVVWMUhfSU5UX0NNUENfUkVBTF9USU1FX0NNUENfU0hGVCA6CVwKLQkJCVVWMkhfSU5UX0NNUENfUkVBTF9USU1FX0NNUENfU0hGVCkKLSNkZWZpbmUgVVYxSF9JTlRfQ01QQ19SRUFMX1RJTUVfQ01QQ19NQVNLCTB4ZmZmZmZmZmZmZmZmZmZVTAotI2RlZmluZSBVVjJIX0lOVF9DTVBDX1JFQUxfVElNRV9DTVBDX01BU0sJMHhmZmZmZmZmZmZmZmZmZlVMCi0jZGVmaW5lIFVWSF9JTlRfQ01QQ19SRUFMX1RJTUVfQ01QQ19NQVNLCShpc191djFfaHViKCkgPwkJXAotCQkJVVYxSF9JTlRfQ01QQ19SRUFMX1RJTUVfQ01QQ19NQVNLIDoJXAotCQkJVVYySF9JTlRfQ01QQ19SRUFMX1RJTUVfQ01QQ19NQVNLKQorI2RlZmluZSBVVkhfSU5UX0NNUENfUkVBTF9USU1FX0NNUENfU0hGVAkJMAorI2RlZmluZSBVVkhfSU5UX0NNUENfUkVBTF9USU1FX0NNUENfTUFTSwkJMHhmZmZmZmZmZmZmZmZmZlVMCiAKIHVuaW9uIHV2aF9pbnRfY21wY191IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9pbnRfY21wY19zIHsKLQl1bnNpZ25lZCBsb25nCXJlYWxfdGltZV9jbXBjIDogNTY7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF81Nl82MyAgICAgOiAgODsgIC8qICAgICovCi0gICAgfSBzOworCXVuc2lnbmVkIGxvbmcJdjsKKwlzdHJ1Y3QgdXZoX2ludF9jbXBjX3MgeworCQl1bnNpZ25lZCBsb25nCXJlYWxfdGltZV9jbXBjOjU2OwkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzU2XzYzOjg7CisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVZIX0lOVF9DTVBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfSU5UX0NNUEQgMHgyMjE4MFVMCisjZGVmaW5lIFVWSF9JTlRfQ01QRAkJCQkJMHgyMjE4MFVMCiAKLSNkZWZpbmUgVVYxSF9JTlRfQ01QRF9SRUFMX1RJTUVfQ01QRF9TSEZUCTAKLSNkZWZpbmUgVVYySF9JTlRfQ01QRF9SRUFMX1RJTUVfQ01QRF9TSEZUCTAKLSNkZWZpbmUgVVZIX0lOVF9DTVBEX1JFQUxfVElNRV9DTVBEX1NIRlQJKGlzX3V2MV9odWIoKSA/CQlcCi0JCQlVVjFIX0lOVF9DTVBEX1JFQUxfVElNRV9DTVBEX1NIRlQgOglcCi0JCQlVVjJIX0lOVF9DTVBEX1JFQUxfVElNRV9DTVBEX1NIRlQpCi0jZGVmaW5lIFVWMUhfSU5UX0NNUERfUkVBTF9USU1FX0NNUERfTUFTSwkweGZmZmZmZmZmZmZmZmZmVUwKLSNkZWZpbmUgVVYySF9JTlRfQ01QRF9SRUFMX1RJTUVfQ01QRF9NQVNLCTB4ZmZmZmZmZmZmZmZmZmZVTAotI2RlZmluZSBVVkhfSU5UX0NNUERfUkVBTF9USU1FX0NNUERfTUFTSwkoaXNfdXYxX2h1YigpID8JCVwKLQkJCVVWMUhfSU5UX0NNUERfUkVBTF9USU1FX0NNUERfTUFTSyA6CVwKLQkJCVVWMkhfSU5UX0NNUERfUkVBTF9USU1FX0NNUERfTUFTSykKKyNkZWZpbmUgVVZIX0lOVF9DTVBEX1JFQUxfVElNRV9DTVBEX1NIRlQJCTAKKyNkZWZpbmUgVVZIX0lOVF9DTVBEX1JFQUxfVElNRV9DTVBEX01BU0sJCTB4ZmZmZmZmZmZmZmZmZmZVTAogCiB1bmlvbiB1dmhfaW50X2NtcGRfdSB7Ci0gICAgdW5zaWduZWQgbG9uZwl2OwotICAgIHN0cnVjdCB1dmhfaW50X2NtcGRfcyB7Ci0JdW5zaWduZWQgbG9uZwlyZWFsX3RpbWVfY21wZCA6IDU2OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfNTZfNjMgICAgIDogIDg7ICAvKiAgICAqLwotICAgIH0gczsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9pbnRfY21wZF9zIHsKKwkJdW5zaWduZWQgbG9uZwlyZWFsX3RpbWVfY21wZDo1NjsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF81Nl82Mzo4OworCX0gczsKIH07CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVWSF9JUElfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgVVZIX0lQSV9JTlQgMHg2MDUwMFVMCi0jZGVmaW5lIFVWSF9JUElfSU5UXzMyIDB4MzQ4CisjZGVmaW5lIFVWSF9JUElfSU5UCQkJCQkweDYwNTAwVUwKKyNkZWZpbmUgVVZIX0lQSV9JTlRfMzIJCQkJCTB4MzQ4CiAKLSNkZWZpbmUgVVZIX0lQSV9JTlRfVkVDVE9SX1NIRlQgMAotI2RlZmluZSBVVkhfSVBJX0lOVF9WRUNUT1JfTUFTSyAweDAwMDAwMDAwMDAwMDAwZmZVTAotI2RlZmluZSBVVkhfSVBJX0lOVF9ERUxJVkVSWV9NT0RFX1NIRlQgOAotI2RlZmluZSBVVkhfSVBJX0lOVF9ERUxJVkVSWV9NT0RFX01BU0sgMHgwMDAwMDAwMDAwMDAwNzAwVUwKLSNkZWZpbmUgVVZIX0lQSV9JTlRfREVTVE1PREVfU0hGVCAxMQotI2RlZmluZSBVVkhfSVBJX0lOVF9ERVNUTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDAwMDgwMFVMCi0jZGVmaW5lIFVWSF9JUElfSU5UX0FQSUNfSURfU0hGVCAxNgotI2RlZmluZSBVVkhfSVBJX0lOVF9BUElDX0lEX01BU0sgMHgwMDAwZmZmZmZmZmYwMDAwVUwKLSNkZWZpbmUgVVZIX0lQSV9JTlRfU0VORF9TSEZUIDYzCi0jZGVmaW5lIFVWSF9JUElfSU5UX1NFTkRfTUFTSyAweDgwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVkhfSVBJX0lOVF9WRUNUT1JfU0hGVAkJCQkwCisjZGVmaW5lIFVWSF9JUElfSU5UX0RFTElWRVJZX01PREVfU0hGVAkJCTgKKyNkZWZpbmUgVVZIX0lQSV9JTlRfREVTVE1PREVfU0hGVAkJCTExCisjZGVmaW5lIFVWSF9JUElfSU5UX0FQSUNfSURfU0hGVAkJCTE2CisjZGVmaW5lIFVWSF9JUElfSU5UX1NFTkRfU0hGVAkJCQk2MworI2RlZmluZSBVVkhfSVBJX0lOVF9WRUNUT1JfTUFTSwkJCQkweDAwMDAwMDAwMDAwMDAwZmZVTAorI2RlZmluZSBVVkhfSVBJX0lOVF9ERUxJVkVSWV9NT0RFX01BU0sJCQkweDAwMDAwMDAwMDAwMDA3MDBVTAorI2RlZmluZSBVVkhfSVBJX0lOVF9ERVNUTU9ERV9NQVNLCQkJMHgwMDAwMDAwMDAwMDAwODAwVUwKKyNkZWZpbmUgVVZIX0lQSV9JTlRfQVBJQ19JRF9NQVNLCQkJMHgwMDAwZmZmZmZmZmYwMDAwVUwKKyNkZWZpbmUgVVZIX0lQSV9JTlRfU0VORF9NQVNLCQkJCTB4ODAwMDAwMDAwMDAwMDAwMFVMCiAKIHVuaW9uIHV2aF9pcGlfaW50X3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXZoX2lwaV9pbnRfcyB7Ci0JdW5zaWduZWQgbG9uZwl2ZWN0b3JfICAgICAgIDogIDg7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZGVsaXZlcnlfbW9kZSA6ICAzOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWRlc3Rtb2RlICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzEyXzE1ICAgIDogIDQ7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJYXBpY19pZCAgICAgICA6IDMyOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfNDhfNjIgICAgOiAxNTsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwlzZW5kICAgICAgICAgIDogIDE7ICAvKiBXUCAqLwotICAgIH0gczsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9pcGlfaW50X3MgeworCQl1bnNpZ25lZCBsb25nCXZlY3Rvcl86ODsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWRlbGl2ZXJ5X21vZGU6MzsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZGVzdG1vZGU6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTJfMTU6NDsKKwkJdW5zaWduZWQgbG9uZwlhcGljX2lkOjMyOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF80OF82MjoxNTsKKwkJdW5zaWduZWQgbG9uZwlzZW5kOjE7CQkJCS8qIFdQICovCisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgVVZIX0xCX0JBVV9JTlREX1BBWUxPQURfUVVFVUVfRklSU1QgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfUEFZTE9BRF9RVUVVRV9GSVJTVCAweDMyMDA1MFVMCi0jZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX0ZJUlNUXzMyIDB4OWMwCisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX0ZJUlNUCQkweDMyMDA1MFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX0ZJUlNUXzMyCQkweDljMAogCiAjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX0ZJUlNUX0FERFJFU1NfU0hGVCA0Ci0jZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX0ZJUlNUX0FERFJFU1NfTUFTSyAweDAwMDAwN2ZmZmZmZmZmZjBVTAogI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfUEFZTE9BRF9RVUVVRV9GSVJTVF9OT0RFX0lEX1NIRlQgNDkKKyNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1BBWUxPQURfUVVFVUVfRklSU1RfQUREUkVTU19NQVNLIDB4MDAwMDA3ZmZmZmZmZmZmMFVMCiAjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX0ZJUlNUX05PREVfSURfTUFTSyAweDdmZmUwMDAwMDAwMDAwMDBVTAogCiB1bmlvbiB1dmhfbGJfYmF1X2ludGRfcGF5bG9hZF9xdWV1ZV9maXJzdF91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9sYl9iYXVfaW50ZF9wYXlsb2FkX3F1ZXVlX2ZpcnN0X3MgewotCXVuc2lnbmVkIGxvbmcJcnN2ZF8wXzM6ICA0OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWFkZHJlc3MgOiAzOTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzQzXzQ4OiAgNjsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwlub2RlX2lkIDogMTQ7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF82MyA6ICAxOyAgLyogICAgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfbGJfYmF1X2ludGRfcGF5bG9hZF9xdWV1ZV9maXJzdF9zIHsKKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzBfMzo0OworCQl1bnNpZ25lZCBsb25nCWFkZHJlc3M6Mzk7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzQzXzQ4OjY7CisJCXVuc2lnbmVkIGxvbmcJbm9kZV9pZDoxNDsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNjM6MTsKKwl9IHM7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgVVZIX0xCX0JBVV9JTlREX1BBWUxPQURfUVVFVUVfTEFTVCAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX0xBU1QgMHgzMjAwNjBVTAotI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfUEFZTE9BRF9RVUVVRV9MQVNUXzMyIDB4OWM4CisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX0xBU1QJCTB4MzIwMDYwVUwKKyNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1BBWUxPQURfUVVFVUVfTEFTVF8zMgkJMHg5YzgKIAotI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfUEFZTE9BRF9RVUVVRV9MQVNUX0FERFJFU1NfU0hGVCA0Ci0jZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX0xBU1RfQUREUkVTU19NQVNLIDB4MDAwMDA3ZmZmZmZmZmZmMFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX0xBU1RfQUREUkVTU19TSEZUCTQKKyNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1BBWUxPQURfUVVFVUVfTEFTVF9BRERSRVNTX01BU0sJMHgwMDAwMDdmZmZmZmZmZmYwVUwKIAogdW5pb24gdXZoX2xiX2JhdV9pbnRkX3BheWxvYWRfcXVldWVfbGFzdF91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9sYl9iYXVfaW50ZF9wYXlsb2FkX3F1ZXVlX2xhc3RfcyB7Ci0JdW5zaWduZWQgbG9uZwlyc3ZkXzBfMzogIDQ7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJYWRkcmVzcyA6IDM5OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfNDNfNjM6IDIxOyAgLyogICAgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfbGJfYmF1X2ludGRfcGF5bG9hZF9xdWV1ZV9sYXN0X3MgeworCQl1bnNpZ25lZCBsb25nCXJzdmRfMF8zOjQ7CisJCXVuc2lnbmVkIGxvbmcJYWRkcmVzczozOTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDNfNjM6MjE7CisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX1RBSUwgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfUEFZTE9BRF9RVUVVRV9UQUlMIDB4MzIwMDcwVUwKLSNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1BBWUxPQURfUVVFVUVfVEFJTF8zMiAweDlkMAorI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfUEFZTE9BRF9RVUVVRV9UQUlMCQkweDMyMDA3MFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX1RBSUxfMzIJCTB4OWQwCiAKLSNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1BBWUxPQURfUVVFVUVfVEFJTF9BRERSRVNTX1NIRlQgNAotI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfUEFZTE9BRF9RVUVVRV9UQUlMX0FERFJFU1NfTUFTSyAweDAwMDAwN2ZmZmZmZmZmZjBVTAorI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfUEFZTE9BRF9RVUVVRV9UQUlMX0FERFJFU1NfU0hGVAk0CisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9QQVlMT0FEX1FVRVVFX1RBSUxfQUREUkVTU19NQVNLCTB4MDAwMDA3ZmZmZmZmZmZmMFVMCiAKIHVuaW9uIHV2aF9sYl9iYXVfaW50ZF9wYXlsb2FkX3F1ZXVlX3RhaWxfdSB7Ci0gICAgdW5zaWduZWQgbG9uZwl2OwotICAgIHN0cnVjdCB1dmhfbGJfYmF1X2ludGRfcGF5bG9hZF9xdWV1ZV90YWlsX3MgewotCXVuc2lnbmVkIGxvbmcJcnN2ZF8wXzM6ICA0OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWFkZHJlc3MgOiAzOTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzQzXzYzOiAyMTsgIC8qICAgICovCi0gICAgfSBzOworCXVuc2lnbmVkIGxvbmcJdjsKKwlzdHJ1Y3QgdXZoX2xiX2JhdV9pbnRkX3BheWxvYWRfcXVldWVfdGFpbF9zIHsKKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzBfMzo0OworCQl1bnNpZ25lZCBsb25nCWFkZHJlc3M6Mzk7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzQzXzYzOjIxOworCX0gczsKIH07CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRSAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFIDB4MzIwMDgwVUwKLSNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFXzMyIDB4YTY4CisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRQkJMHgzMjAwODBVTAorI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfMzIJCTB4YTY4CiAKICNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1BFTkRJTkdfMF9TSEZUIDAKLSNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1BFTkRJTkdfMF9NQVNLIDB4MDAwMDAwMDAwMDAwMDAwMVVMCiAjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9QRU5ESU5HXzFfU0hGVCAxCi0jZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9QRU5ESU5HXzFfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDJVTAogI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfUEVORElOR18yX1NIRlQgMgotI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfUEVORElOR18yX01BU0sgMHgwMDAwMDAwMDAwMDAwMDA0VUwKICNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1BFTkRJTkdfM19TSEZUIDMKLSNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1BFTkRJTkdfM19NQVNLIDB4MDAwMDAwMDAwMDAwMDAwOFVMCiAjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9QRU5ESU5HXzRfU0hGVCA0Ci0jZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9QRU5ESU5HXzRfTUFTSyAweDAwMDAwMDAwMDAwMDAwMTBVTAogI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfUEVORElOR181X1NIRlQgNQotI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfUEVORElOR181X01BU0sgMHgwMDAwMDAwMDAwMDAwMDIwVUwKICNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1BFTkRJTkdfNl9TSEZUIDYKLSNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1BFTkRJTkdfNl9NQVNLIDB4MDAwMDAwMDAwMDAwMDA0MFVMCiAjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9QRU5ESU5HXzdfU0hGVCA3Ci0jZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9QRU5ESU5HXzdfTUFTSyAweDAwMDAwMDAwMDAwMDAwODBVTAogI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfVElNRU9VVF8wX1NIRlQgOAotI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfVElNRU9VVF8wX01BU0sgMHgwMDAwMDAwMDAwMDAwMTAwVUwKICNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1RJTUVPVVRfMV9TSEZUIDkKLSNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1RJTUVPVVRfMV9NQVNLIDB4MDAwMDAwMDAwMDAwMDIwMFVMCiAjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9USU1FT1VUXzJfU0hGVCAxMAotI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfVElNRU9VVF8yX01BU0sgMHgwMDAwMDAwMDAwMDAwNDAwVUwKICNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1RJTUVPVVRfM19TSEZUIDExCi0jZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9USU1FT1VUXzNfTUFTSyAweDAwMDAwMDAwMDAwMDA4MDBVTAogI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfVElNRU9VVF80X1NIRlQgMTIKLSNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1RJTUVPVVRfNF9NQVNLIDB4MDAwMDAwMDAwMDAwMTAwMFVMCiAjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9USU1FT1VUXzVfU0hGVCAxMwotI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfVElNRU9VVF81X01BU0sgMHgwMDAwMDAwMDAwMDAyMDAwVUwKICNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1RJTUVPVVRfNl9TSEZUIDE0Ci0jZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9USU1FT1VUXzZfTUFTSyAweDAwMDAwMDAwMDAwMDQwMDBVTAogI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfVElNRU9VVF83X1NIRlQgMTUKKyNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1BFTkRJTkdfMF9NQVNLIDB4MDAwMDAwMDAwMDAwMDAwMVVMCisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9QRU5ESU5HXzFfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDJVTAorI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfUEVORElOR18yX01BU0sgMHgwMDAwMDAwMDAwMDAwMDA0VUwKKyNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1BFTkRJTkdfM19NQVNLIDB4MDAwMDAwMDAwMDAwMDAwOFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9QRU5ESU5HXzRfTUFTSyAweDAwMDAwMDAwMDAwMDAwMTBVTAorI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfUEVORElOR181X01BU0sgMHgwMDAwMDAwMDAwMDAwMDIwVUwKKyNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1BFTkRJTkdfNl9NQVNLIDB4MDAwMDAwMDAwMDAwMDA0MFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9QRU5ESU5HXzdfTUFTSyAweDAwMDAwMDAwMDAwMDAwODBVTAorI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfVElNRU9VVF8wX01BU0sgMHgwMDAwMDAwMDAwMDAwMTAwVUwKKyNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1RJTUVPVVRfMV9NQVNLIDB4MDAwMDAwMDAwMDAwMDIwMFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9USU1FT1VUXzJfTUFTSyAweDAwMDAwMDAwMDAwMDA0MDBVTAorI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfVElNRU9VVF8zX01BU0sgMHgwMDAwMDAwMDAwMDAwODAwVUwKKyNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1RJTUVPVVRfNF9NQVNLIDB4MDAwMDAwMDAwMDAwMTAwMFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9USU1FT1VUXzVfTUFTSyAweDAwMDAwMDAwMDAwMDIwMDBVTAorI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfVElNRU9VVF82X01BU0sgMHgwMDAwMDAwMDAwMDA0MDAwVUwKICNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX1RJTUVPVVRfN19NQVNLIDB4MDAwMDAwMDAwMDAwODAwMFVMCiAKIHVuaW9uIHV2aF9sYl9iYXVfaW50ZF9zb2Z0d2FyZV9hY2tub3dsZWRnZV91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9sYl9iYXVfaW50ZF9zb2Z0d2FyZV9hY2tub3dsZWRnZV9zIHsKLQl1bnNpZ25lZCBsb25nCXBlbmRpbmdfMCA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJcGVuZGluZ18xIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlwZW5kaW5nXzIgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCXBlbmRpbmdfMyA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJcGVuZGluZ180IDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwlwZW5kaW5nXzUgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCXBlbmRpbmdfNiA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJcGVuZGluZ183IDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwl0aW1lb3V0XzAgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCXRpbWVvdXRfMSA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJdGltZW91dF8yIDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwl0aW1lb3V0XzMgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCXRpbWVvdXRfNCA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJdGltZW91dF81IDogIDE7ICAvKiBSVywgVzFDICovCi0JdW5zaWduZWQgbG9uZwl0aW1lb3V0XzYgOiAgMTsgIC8qIFJXLCBXMUMgKi8KLQl1bnNpZ25lZCBsb25nCXRpbWVvdXRfNyA6ICAxOyAgLyogUlcsIFcxQyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF8xNl82MzogNDg7ICAvKiAgICAqLwotICAgIH0gczsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9sYl9iYXVfaW50ZF9zb2Z0d2FyZV9hY2tub3dsZWRnZV9zIHsKKwkJdW5zaWduZWQgbG9uZwlwZW5kaW5nXzA6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJcGVuZGluZ18xOjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCXBlbmRpbmdfMjoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlwZW5kaW5nXzM6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJcGVuZGluZ180OjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCXBlbmRpbmdfNToxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwlwZW5kaW5nXzY6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJcGVuZGluZ183OjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCXRpbWVvdXRfMDoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwl0aW1lb3V0XzE6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJdGltZW91dF8yOjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCXRpbWVvdXRfMzoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwl0aW1lb3V0XzQ6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJdGltZW91dF81OjE7CQkJLyogUlcsIFcxQyAqLworCQl1bnNpZ25lZCBsb25nCXRpbWVvdXRfNjoxOwkJCS8qIFJXLCBXMUMgKi8KKwkJdW5zaWduZWQgbG9uZwl0aW1lb3V0Xzc6MTsJCQkvKiBSVywgVzFDICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8xNl82Mzo0ODsKKwl9IHM7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfQUxJQVMgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9BTElBUyAweDAwMDAwMDAwMDAzMjAwODhVTAotI2RlZmluZSBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0VfQUxJQVNfMzIgMHhhNzAKKyNkZWZpbmUgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFX0FMSUFTCTB4MDAwMDAwMDAwMDMyMDA4OFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfSU5URF9TT0ZUV0FSRV9BQ0tOT1dMRURHRV9BTElBU18zMgkweGE3MAogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MIDB4MzIwMTcwVUwKLSNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfMzIgMHhhMTAKKyNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0wJCQkJMHgzMjAxNzBVTAorI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF8zMgkJCTB4YTEwCiAKLSNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfUkVKRUNUSU9OX0RFTEFZX1NIRlQgMAotI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9SRUpFQ1RJT05fREVMQVlfTUFTSyAweDAwMDAwMDAwMDAwMDAwZmZVTAotI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9BUElDX01PREVfU0hGVCA4Ci0jZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX0FQSUNfTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDAwMDEwMFVMCi0jZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX0ZPUkNFX0JST0FEQ0FTVF9TSEZUIDkKLSNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfRk9SQ0VfQlJPQURDQVNUX01BU0sgMHgwMDAwMDAwMDAwMDAwMjAwVUwKLSNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfRk9SQ0VfTE9DS19OT1BfU0hGVCAxMAotI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9GT1JDRV9MT0NLX05PUF9NQVNLIDB4MDAwMDAwMDAwMDAwMDQwMFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX1JFSkVDVElPTl9ERUxBWV9TSEZUCTAKKyNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfQVBJQ19NT0RFX1NIRlQJCTgKKyNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfRk9SQ0VfQlJPQURDQVNUX1NIRlQJOQorI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9GT1JDRV9MT0NLX05PUF9TSEZUCTEwCiAjZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX1FQSV9BR0VOVF9QUkVTRU5DRV9WRUNUT1JfU0hGVCAxMQotI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9RUElfQUdFTlRfUFJFU0VOQ0VfVkVDVE9SX01BU0sgMHgwMDAwMDAwMDAwMDAzODAwVUwKICNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfREVTQ1JJUFRPUl9GRVRDSF9NT0RFX1NIRlQgMTQKLSNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfREVTQ1JJUFRPUl9GRVRDSF9NT0RFX01BU0sgMHgwMDAwMDAwMDAwMDA0MDAwVUwKICNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX0lOVERfU09GVF9BQ0tfTU9ERV9TSEZUIDE1Ci0jZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9JTlREX1NPRlRfQUNLX01PREVfTUFTSyAweDAwMDAwMDAwMDAwMDgwMDBVTAogI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9JTlREX1NPRlRfQUNLX1RJTUVPVVRfUEVSSU9EX1NIRlQgMTYKLSNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfSU5URF9TT0ZUX0FDS19USU1FT1VUX1BFUklPRF9NQVNLIDB4MDAwMDAwMDAwMDBmMDAwMFVMCiAjZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9EVUFMX01BUFBJTkdfTU9ERV9TSEZUIDIwCi0jZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9EVUFMX01BUFBJTkdfTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDEwMDAwMFVMCiAjZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX1ZHQV9JT19QT1JUX0RFQ09ERV9FTkFCTEVfU0hGVCAyMQotI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9WR0FfSU9fUE9SVF9ERUNPREVfRU5BQkxFX01BU0sgMHgwMDAwMDAwMDAwMjAwMDAwVUwKICNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfVkdBX0lPX1BPUlRfMTZfQklUX0RFQ09ERV9TSEZUIDIyCi0jZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX1ZHQV9JT19QT1JUXzE2X0JJVF9ERUNPREVfTUFTSyAweDAwMDAwMDAwMDA0MDAwMDBVTAogI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9TVVBQUkVTU19ERVNUX1JFR0lTVFJBVElPTl9TSEZUIDIzCi0jZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX1NVUFBSRVNTX0RFU1RfUkVHSVNUUkFUSU9OX01BU0sgMHgwMDAwMDAwMDAwODAwMDAwVUwKICNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfUFJPR1JBTU1FRF9JTklUSUFMX1BSSU9SSVRZX1NIRlQgMjQKLSNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfUFJPR1JBTU1FRF9JTklUSUFMX1BSSU9SSVRZX01BU0sgMHgwMDAwMDAwMDA3MDAwMDAwVUwKICNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfVVNFX0lOQ09NSU5HX1BSSU9SSVRZX1NIRlQgMjcKLSNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfVVNFX0lOQ09NSU5HX1BSSU9SSVRZX01BU0sgMHgwMDAwMDAwMDA4MDAwMDAwVUwKICNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX1BST0dSQU1NRURfSU5JVElBTF9QUklPUklUWV9TSEZUIDI4CisjZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX1JFSkVDVElPTl9ERUxBWV9NQVNLCTB4MDAwMDAwMDAwMDAwMDBmZlVMCisjZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX0FQSUNfTU9ERV9NQVNLCQkweDAwMDAwMDAwMDAwMDAxMDBVTAorI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9GT1JDRV9CUk9BRENBU1RfTUFTSwkweDAwMDAwMDAwMDAwMDAyMDBVTAorI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9GT1JDRV9MT0NLX05PUF9NQVNLCTB4MDAwMDAwMDAwMDAwMDQwMFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX1FQSV9BR0VOVF9QUkVTRU5DRV9WRUNUT1JfTUFTSyAweDAwMDAwMDAwMDAwMDM4MDBVTAorI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9ERVNDUklQVE9SX0ZFVENIX01PREVfTUFTSyAweDAwMDAwMDAwMDAwMDQwMDBVTAorI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9FTkFCTEVfSU5URF9TT0ZUX0FDS19NT0RFX01BU0sgMHgwMDAwMDAwMDAwMDA4MDAwVUwKKyNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfSU5URF9TT0ZUX0FDS19USU1FT1VUX1BFUklPRF9NQVNLIDB4MDAwMDAwMDAwMDBmMDAwMFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9EVUFMX01BUFBJTkdfTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDEwMDAwMFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfTUlTQ19DT05UUk9MX1ZHQV9JT19QT1JUX0RFQ09ERV9FTkFCTEVfTUFTSyAweDAwMDAwMDAwMDAyMDAwMDBVTAorI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9WR0FfSU9fUE9SVF8xNl9CSVRfREVDT0RFX01BU0sgMHgwMDAwMDAwMDAwNDAwMDAwVUwKKyNkZWZpbmUgVVZIX0xCX0JBVV9NSVNDX0NPTlRST0xfU1VQUFJFU1NfREVTVF9SRUdJU1RSQVRJT05fTUFTSyAweDAwMDAwMDAwMDA4MDAwMDBVTAorI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9QUk9HUkFNTUVEX0lOSVRJQUxfUFJJT1JJVFlfTUFTSyAweDAwMDAwMDAwMDcwMDAwMDBVTAorI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9VU0VfSU5DT01JTkdfUFJJT1JJVFlfTUFTSyAweDAwMDAwMDAwMDgwMDAwMDBVTAogI2RlZmluZSBVVkhfTEJfQkFVX01JU0NfQ09OVFJPTF9FTkFCTEVfUFJPR1JBTU1FRF9JTklUSUFMX1BSSU9SSVRZX01BU0sgMHgwMDAwMDAwMDEwMDAwMDAwVUwKIAotI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfUkVKRUNUSU9OX0RFTEFZX1NIRlQgMAotI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfUkVKRUNUSU9OX0RFTEFZX01BU0sgMHgwMDAwMDAwMDAwMDAwMGZmVUwKLSNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0FQSUNfTU9ERV9TSEZUIDgKLSNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0FQSUNfTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDAwMDEwMFVMCi0jZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9GT1JDRV9CUk9BRENBU1RfU0hGVCA5Ci0jZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9GT1JDRV9CUk9BRENBU1RfTUFTSyAweDAwMDAwMDAwMDAwMDAyMDBVTAotI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfRk9SQ0VfTE9DS19OT1BfU0hGVCAxMAotI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfRk9SQ0VfTE9DS19OT1BfTUFTSyAweDAwMDAwMDAwMDAwMDA0MDBVTAorI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfUkVKRUNUSU9OX0RFTEFZX1NIRlQJMAorI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfQVBJQ19NT0RFX1NIRlQJCTgKKyNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0ZPUkNFX0JST0FEQ0FTVF9TSEZUCTkKKyNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0ZPUkNFX0xPQ0tfTk9QX1NIRlQJMTAKICNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX1FQSV9BR0VOVF9QUkVTRU5DRV9WRUNUT1JfU0hGVCAxMQotI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfUVBJX0FHRU5UX1BSRVNFTkNFX1ZFQ1RPUl9NQVNLIDB4MDAwMDAwMDAwMDAwMzgwMFVMCiAjZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9ERVNDUklQVE9SX0ZFVENIX01PREVfU0hGVCAxNAotI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfREVTQ1JJUFRPUl9GRVRDSF9NT0RFX01BU0sgMHgwMDAwMDAwMDAwMDA0MDAwVUwKICNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9JTlREX1NPRlRfQUNLX01PREVfU0hGVCAxNQotI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX0lOVERfU09GVF9BQ0tfTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDAwODAwMFVMCiAjZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9JTlREX1NPRlRfQUNLX1RJTUVPVVRfUEVSSU9EX1NIRlQgMTYKLSNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0lOVERfU09GVF9BQ0tfVElNRU9VVF9QRVJJT0RfTUFTSyAweDAwMDAwMDAwMDAwZjAwMDBVTAogI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX0RVQUxfTUFQUElOR19NT0RFX1NIRlQgMjAKLSNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9EVUFMX01BUFBJTkdfTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDEwMDAwMFVMCiAjZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9WR0FfSU9fUE9SVF9ERUNPREVfRU5BQkxFX1NIRlQgMjEKLSNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX1ZHQV9JT19QT1JUX0RFQ09ERV9FTkFCTEVfTUFTSyAweDAwMDAwMDAwMDAyMDAwMDBVTAogI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfVkdBX0lPX1BPUlRfMTZfQklUX0RFQ09ERV9TSEZUIDIyCi0jZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9WR0FfSU9fUE9SVF8xNl9CSVRfREVDT0RFX01BU0sgMHgwMDAwMDAwMDAwNDAwMDAwVUwKICNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX1NVUFBSRVNTX0RFU1RfUkVHSVNUUkFUSU9OX1NIRlQgMjMKLSNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX1NVUFBSRVNTX0RFU1RfUkVHSVNUUkFUSU9OX01BU0sgMHgwMDAwMDAwMDAwODAwMDAwVUwKICNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX1BST0dSQU1NRURfSU5JVElBTF9QUklPUklUWV9TSEZUIDI0Ci0jZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9QUk9HUkFNTUVEX0lOSVRJQUxfUFJJT1JJVFlfTUFTSyAweDAwMDAwMDAwMDcwMDAwMDBVTAogI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfVVNFX0lOQ09NSU5HX1BSSU9SSVRZX1NIRlQgMjcKLSNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX1VTRV9JTkNPTUlOR19QUklPUklUWV9NQVNLIDB4MDAwMDAwMDAwODAwMDAwMFVMCiAjZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9FTkFCTEVfUFJPR1JBTU1FRF9JTklUSUFMX1BSSU9SSVRZX1NIRlQgMjgKKyNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0ZVTl9TSEZUCQk0OAorI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfUkVKRUNUSU9OX0RFTEFZX01BU0sJMHgwMDAwMDAwMDAwMDAwMGZmVUwKKyNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0FQSUNfTU9ERV9NQVNLCQkweDAwMDAwMDAwMDAwMDAxMDBVTAorI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfRk9SQ0VfQlJPQURDQVNUX01BU0sJMHgwMDAwMDAwMDAwMDAwMjAwVUwKKyNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0ZPUkNFX0xPQ0tfTk9QX01BU0sJMHgwMDAwMDAwMDAwMDAwNDAwVUwKKyNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX1FQSV9BR0VOVF9QUkVTRU5DRV9WRUNUT1JfTUFTSyAweDAwMDAwMDAwMDAwMDM4MDBVTAorI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfREVTQ1JJUFRPUl9GRVRDSF9NT0RFX01BU0sgMHgwMDAwMDAwMDAwMDA0MDAwVUwKKyNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9JTlREX1NPRlRfQUNLX01PREVfTUFTSyAweDAwMDAwMDAwMDAwMDgwMDBVTAorI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfSU5URF9TT0ZUX0FDS19USU1FT1VUX1BFUklPRF9NQVNLIDB4MDAwMDAwMDAwMDBmMDAwMFVMCisjZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9FTkFCTEVfRFVBTF9NQVBQSU5HX01PREVfTUFTSyAweDAwMDAwMDAwMDAxMDAwMDBVTAorI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfVkdBX0lPX1BPUlRfREVDT0RFX0VOQUJMRV9NQVNLIDB4MDAwMDAwMDAwMDIwMDAwMFVMCisjZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9WR0FfSU9fUE9SVF8xNl9CSVRfREVDT0RFX01BU0sgMHgwMDAwMDAwMDAwNDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX1NVUFBSRVNTX0RFU1RfUkVHSVNUUkFUSU9OX01BU0sgMHgwMDAwMDAwMDAwODAwMDAwVUwKKyNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX1BST0dSQU1NRURfSU5JVElBTF9QUklPUklUWV9NQVNLIDB4MDAwMDAwMDAwNzAwMDAwMFVMCisjZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9VU0VfSU5DT01JTkdfUFJJT1JJVFlfTUFTSyAweDAwMDAwMDAwMDgwMDAwMDBVTAogI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX1BST0dSQU1NRURfSU5JVElBTF9QUklPUklUWV9NQVNLIDB4MDAwMDAwMDAxMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfTEJfQkFVX01JU0NfQ09OVFJPTF9GVU5fU0hGVCA0OAotI2RlZmluZSBVVjFIX0xCX0JBVV9NSVNDX0NPTlRST0xfRlVOX01BU0sgMHhmZmZmMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9MQl9CQVVfTUlTQ19DT05UUk9MX0ZVTl9NQVNLCQkweGZmZmYwMDAwMDAwMDAwMDBVTAogCi0jZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9SRUpFQ1RJT05fREVMQVlfU0hGVCAwCi0jZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9SRUpFQ1RJT05fREVMQVlfTUFTSyAweDAwMDAwMDAwMDAwMDAwZmZVTAotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfQVBJQ19NT0RFX1NIRlQgOAotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfQVBJQ19NT0RFX01BU0sgMHgwMDAwMDAwMDAwMDAwMTAwVUwKLSNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX0ZPUkNFX0JST0FEQ0FTVF9TSEZUIDkKLSNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX0ZPUkNFX0JST0FEQ0FTVF9NQVNLIDB4MDAwMDAwMDAwMDAwMDIwMFVMCi0jZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9GT1JDRV9MT0NLX05PUF9TSEZUIDEwCi0jZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9GT1JDRV9MT0NLX05PUF9NQVNLIDB4MDAwMDAwMDAwMDAwMDQwMFVMCisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9SRUpFQ1RJT05fREVMQVlfU0hGVAkwCisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9BUElDX01PREVfU0hGVAkJOAorI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRk9SQ0VfQlJPQURDQVNUX1NIRlQJOQorI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRk9SQ0VfTE9DS19OT1BfU0hGVAkxMAogI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfUVBJX0FHRU5UX1BSRVNFTkNFX1ZFQ1RPUl9TSEZUIDExCi0jZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9RUElfQUdFTlRfUFJFU0VOQ0VfVkVDVE9SX01BU0sgMHgwMDAwMDAwMDAwMDAzODAwVUwKICNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX0RFU0NSSVBUT1JfRkVUQ0hfTU9ERV9TSEZUIDE0Ci0jZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9ERVNDUklQVE9SX0ZFVENIX01PREVfTUFTSyAweDAwMDAwMDAwMDAwMDQwMDBVTAogI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX0lOVERfU09GVF9BQ0tfTU9ERV9TSEZUIDE1Ci0jZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9FTkFCTEVfSU5URF9TT0ZUX0FDS19NT0RFX01BU0sgMHgwMDAwMDAwMDAwMDA4MDAwVUwKICNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX0lOVERfU09GVF9BQ0tfVElNRU9VVF9QRVJJT0RfU0hGVCAxNgotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfSU5URF9TT0ZUX0FDS19USU1FT1VUX1BFUklPRF9NQVNLIDB4MDAwMDAwMDAwMDBmMDAwMFVMCiAjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9FTkFCTEVfRFVBTF9NQVBQSU5HX01PREVfU0hGVCAyMAotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX0RVQUxfTUFQUElOR19NT0RFX01BU0sgMHgwMDAwMDAwMDAwMTAwMDAwVUwKICNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX1ZHQV9JT19QT1JUX0RFQ09ERV9FTkFCTEVfU0hGVCAyMQotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfVkdBX0lPX1BPUlRfREVDT0RFX0VOQUJMRV9NQVNLIDB4MDAwMDAwMDAwMDIwMDAwMFVMCiAjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9WR0FfSU9fUE9SVF8xNl9CSVRfREVDT0RFX1NIRlQgMjIKLSNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX1ZHQV9JT19QT1JUXzE2X0JJVF9ERUNPREVfTUFTSyAweDAwMDAwMDAwMDA0MDAwMDBVTAogI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfU1VQUFJFU1NfREVTVF9SRUdJU1RSQVRJT05fU0hGVCAyMwotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfU1VQUFJFU1NfREVTVF9SRUdJU1RSQVRJT05fTUFTSyAweDAwMDAwMDAwMDA4MDAwMDBVTAogI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfUFJPR1JBTU1FRF9JTklUSUFMX1BSSU9SSVRZX1NIRlQgMjQKLSNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX1BST0dSQU1NRURfSU5JVElBTF9QUklPUklUWV9NQVNLIDB4MDAwMDAwMDAwNzAwMDAwMFVMCiAjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9VU0VfSU5DT01JTkdfUFJJT1JJVFlfU0hGVCAyNwotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfVVNFX0lOQ09NSU5HX1BSSU9SSVRZX01BU0sgMHgwMDAwMDAwMDA4MDAwMDAwVUwKICNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9QUk9HUkFNTUVEX0lOSVRJQUxfUFJJT1JJVFlfU0hGVCAyOAotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX1BST0dSQU1NRURfSU5JVElBTF9QUklPUklUWV9NQVNLIDB4MDAwMDAwMDAxMDAwMDAwMFVMCiAjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9FTkFCTEVfQVVUT01BVElDX0FQSUNfTU9ERV9TRUxFQ1RJT05fU0hGVCAyOQotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX0FVVE9NQVRJQ19BUElDX01PREVfU0VMRUNUSU9OX01BU0sgMHgwMDAwMDAwMDIwMDAwMDAwVUwKLSNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX0FQSUNfTU9ERV9TVEFUVVNfU0hGVCAzMAotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfQVBJQ19NT0RFX1NUQVRVU19NQVNLIDB4MDAwMDAwMDA0MDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9BUElDX01PREVfU1RBVFVTX1NIRlQJMzAKICNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX1NVUFBSRVNTX0lOVEVSUlVQVFNfVE9fU0VMRl9TSEZUIDMxCi0jZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9TVVBQUkVTU19JTlRFUlJVUFRTX1RPX1NFTEZfTUFTSyAweDAwMDAwMDAwODAwMDAwMDBVTAogI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX0xPQ0tfQkFTRURfU1lTVEVNX0ZMVVNIX1NIRlQgMzIKLSNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9MT0NLX0JBU0VEX1NZU1RFTV9GTFVTSF9NQVNLIDB4MDAwMDAwMDEwMDAwMDAwMFVMCiAjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9FTkFCTEVfRVhURU5ERURfU0JfU1RBVFVTX1NIRlQgMzMKLSNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9FWFRFTkRFRF9TQl9TVEFUVVNfTUFTSyAweDAwMDAwMDAyMDAwMDAwMDBVTAogI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfU1VQUFJFU1NfSU5UX1BSSU9fVURUX1RPX1NFTEZfU0hGVCAzNAotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfU1VQUFJFU1NfSU5UX1BSSU9fVURUX1RPX1NFTEZfTUFTSyAweDAwMDAwMDA0MDAwMDAwMDBVTAogI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfVVNFX0xFR0FDWV9ERVNDUklQVE9SX0ZPUk1BVFNfU0hGVCAzNQorI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRlVOX1NIRlQJCTQ4CisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9SRUpFQ1RJT05fREVMQVlfTUFTSwkweDAwMDAwMDAwMDAwMDAwZmZVTAorI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfQVBJQ19NT0RFX01BU0sJCTB4MDAwMDAwMDAwMDAwMDEwMFVMCisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9GT1JDRV9CUk9BRENBU1RfTUFTSwkweDAwMDAwMDAwMDAwMDAyMDBVTAorI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRk9SQ0VfTE9DS19OT1BfTUFTSwkweDAwMDAwMDAwMDAwMDA0MDBVTAorI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfUVBJX0FHRU5UX1BSRVNFTkNFX1ZFQ1RPUl9NQVNLIDB4MDAwMDAwMDAwMDAwMzgwMFVMCisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9ERVNDUklQVE9SX0ZFVENIX01PREVfTUFTSyAweDAwMDAwMDAwMDAwMDQwMDBVTAorI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX0lOVERfU09GVF9BQ0tfTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDAwODAwMFVMCisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9JTlREX1NPRlRfQUNLX1RJTUVPVVRfUEVSSU9EX01BU0sgMHgwMDAwMDAwMDAwMGYwMDAwVUwKKyNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9EVUFMX01BUFBJTkdfTU9ERV9NQVNLIDB4MDAwMDAwMDAwMDEwMDAwMFVMCisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9WR0FfSU9fUE9SVF9ERUNPREVfRU5BQkxFX01BU0sgMHgwMDAwMDAwMDAwMjAwMDAwVUwKKyNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX1ZHQV9JT19QT1JUXzE2X0JJVF9ERUNPREVfTUFTSyAweDAwMDAwMDAwMDA0MDAwMDBVTAorI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfU1VQUFJFU1NfREVTVF9SRUdJU1RSQVRJT05fTUFTSyAweDAwMDAwMDAwMDA4MDAwMDBVTAorI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfUFJPR1JBTU1FRF9JTklUSUFMX1BSSU9SSVRZX01BU0sgMHgwMDAwMDAwMDA3MDAwMDAwVUwKKyNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX1VTRV9JTkNPTUlOR19QUklPUklUWV9NQVNLIDB4MDAwMDAwMDAwODAwMDAwMFVMCisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9FTkFCTEVfUFJPR1JBTU1FRF9JTklUSUFMX1BSSU9SSVRZX01BU0sgMHgwMDAwMDAwMDEwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX0VOQUJMRV9BVVRPTUFUSUNfQVBJQ19NT0RFX1NFTEVDVElPTl9NQVNLIDB4MDAwMDAwMDAyMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9BUElDX01PREVfU1RBVFVTX01BU0sJMHgwMDAwMDAwMDQwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX1NVUFBSRVNTX0lOVEVSUlVQVFNfVE9fU0VMRl9NQVNLIDB4MDAwMDAwMDA4MDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9FTkFCTEVfTE9DS19CQVNFRF9TWVNURU1fRkxVU0hfTUFTSyAweDAwMDAwMDAxMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRU5BQkxFX0VYVEVOREVEX1NCX1NUQVRVU19NQVNLIDB4MDAwMDAwMDIwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9TVVBQUkVTU19JTlRfUFJJT19VRFRfVE9fU0VMRl9NQVNLIDB4MDAwMDAwMDQwMDAwMDAwMFVMCiAjZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9VU0VfTEVHQUNZX0RFU0NSSVBUT1JfRk9STUFUU19NQVNLIDB4MDAwMDAwMDgwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfTEJfQkFVX01JU0NfQ09OVFJPTF9GVU5fU0hGVCA0OAotI2RlZmluZSBVVjJIX0xCX0JBVV9NSVNDX0NPTlRST0xfRlVOX01BU0sgMHhmZmZmMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9MQl9CQVVfTUlTQ19DT05UUk9MX0ZVTl9NQVNLCQkweGZmZmYwMDAwMDAwMDAwMDBVTAogCiB1bmlvbiB1dmhfbGJfYmF1X21pc2NfY29udHJvbF91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9sYl9iYXVfbWlzY19jb250cm9sX3MgewotCXVuc2lnbmVkIGxvbmcJcmVqZWN0aW9uX2RlbGF5ICAgICAgICAgICAgICAgICAgICA6ICA4OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWFwaWNfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlmb3JjZV9icm9hZGNhc3QgICAgICAgICAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZm9yY2VfbG9ja19ub3AgICAgICAgICAgICAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXFwaV9hZ2VudF9wcmVzZW5jZV92ZWN0b3IgICAgICAgICAgOiAgMzsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlkZXNjcmlwdG9yX2ZldGNoX21vZGUgICAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlX2ludGRfc29mdF9hY2tfbW9kZSAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWludGRfc29mdF9hY2tfdGltZW91dF9wZXJpb2QgICAgICAgOiAgNDsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwllbmFibGVfZHVhbF9tYXBwaW5nX21vZGUgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJdmdhX2lvX3BvcnRfZGVjb2RlX2VuYWJsZSAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXZnYV9pb19wb3J0XzE2X2JpdF9kZWNvZGUgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlzdXBwcmVzc19kZXN0X3JlZ2lzdHJhdGlvbiAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcHJvZ3JhbW1lZF9pbml0aWFsX3ByaW9yaXR5ICAgICAgICA6ICAzOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXVzZV9pbmNvbWluZ19wcmlvcml0eSAgICAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwllbmFibGVfcHJvZ3JhbW1lZF9pbml0aWFsX3ByaW9yaXR5IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF8yOV82MyAgICA6IDM1OwotICAgIH0gczsKLSAgICBzdHJ1Y3QgdXYxaF9sYl9iYXVfbWlzY19jb250cm9sX3MgewotCXVuc2lnbmVkIGxvbmcJcmVqZWN0aW9uX2RlbGF5ICAgICAgICAgICAgICAgICAgICA6ICA4OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWFwaWNfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlmb3JjZV9icm9hZGNhc3QgICAgICAgICAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZm9yY2VfbG9ja19ub3AgICAgICAgICAgICAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXFwaV9hZ2VudF9wcmVzZW5jZV92ZWN0b3IgICAgICAgICAgOiAgMzsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlkZXNjcmlwdG9yX2ZldGNoX21vZGUgICAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlX2ludGRfc29mdF9hY2tfbW9kZSAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWludGRfc29mdF9hY2tfdGltZW91dF9wZXJpb2QgICAgICAgOiAgNDsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwllbmFibGVfZHVhbF9tYXBwaW5nX21vZGUgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJdmdhX2lvX3BvcnRfZGVjb2RlX2VuYWJsZSAgICAgICAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXZnYV9pb19wb3J0XzE2X2JpdF9kZWNvZGUgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlzdXBwcmVzc19kZXN0X3JlZ2lzdHJhdGlvbiAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcHJvZ3JhbW1lZF9pbml0aWFsX3ByaW9yaXR5ICAgICAgICA6ICAzOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXVzZV9pbmNvbWluZ19wcmlvcml0eSAgICAgICAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwllbmFibGVfcHJvZ3JhbW1lZF9pbml0aWFsX3ByaW9yaXR5IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF8yOV80NyAgICAgICAgICAgICAgICAgICAgICAgICA6IDE5OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWZ1biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxNjsgIC8qIFJXICovCi0gICAgfSBzMTsKLSAgICBzdHJ1Y3QgdXYyaF9sYl9iYXVfbWlzY19jb250cm9sX3MgewotCXVuc2lnbmVkIGxvbmcJcmVqZWN0aW9uX2RlbGF5ICAgICAgICAgICAgICAgICAgICAgIDogIDg7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJYXBpY19tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZm9yY2VfYnJvYWRjYXN0ICAgICAgICAgICAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZm9yY2VfbG9ja19ub3AgICAgICAgICAgICAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcXBpX2FnZW50X3ByZXNlbmNlX3ZlY3RvciAgICAgICAgICAgIDogIDM7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZGVzY3JpcHRvcl9mZXRjaF9tb2RlICAgICAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlX2ludGRfc29mdF9hY2tfbW9kZSAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJaW50ZF9zb2Z0X2Fja190aW1lb3V0X3BlcmlvZCAgICAgICAgIDogIDQ7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlX2R1YWxfbWFwcGluZ19tb2RlICAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJdmdhX2lvX3BvcnRfZGVjb2RlX2VuYWJsZSAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJdmdhX2lvX3BvcnRfMTZfYml0X2RlY29kZSAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJc3VwcHJlc3NfZGVzdF9yZWdpc3RyYXRpb24gICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcHJvZ3JhbW1lZF9pbml0aWFsX3ByaW9yaXR5ICAgICAgICAgIDogIDM7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJdXNlX2luY29taW5nX3ByaW9yaXR5ICAgICAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlX3Byb2dyYW1tZWRfaW5pdGlhbF9wcmlvcml0eSAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlX2F1dG9tYXRpY19hcGljX21vZGVfc2VsZWN0aW9uIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJYXBpY19tb2RlX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIDogIDE7ICAvKiBSTyAqLwotCXVuc2lnbmVkIGxvbmcJc3VwcHJlc3NfaW50ZXJydXB0c190b19zZWxmICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlX2xvY2tfYmFzZWRfc3lzdGVtX2ZsdXNoICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlX2V4dGVuZGVkX3NiX3N0YXR1cyAgICAgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJc3VwcHJlc3NfaW50X3ByaW9fdWR0X3RvX3NlbGYgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJdXNlX2xlZ2FjeV9kZXNjcmlwdG9yX2Zvcm1hdHMgICAgICAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF8zNl80NyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMTI7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJZnVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMTY7ICAvKiBSVyAqLwotICAgIH0gczI7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfbGJfYmF1X21pc2NfY29udHJvbF9zIHsKKwkJdW5zaWduZWQgbG9uZwlyZWplY3Rpb25fZGVsYXk6ODsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJYXBpY19tb2RlOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlmb3JjZV9icm9hZGNhc3Q6MTsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZm9yY2VfbG9ja19ub3A6MTsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcXBpX2FnZW50X3ByZXNlbmNlX3ZlY3RvcjozOwkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWRlc2NyaXB0b3JfZmV0Y2hfbW9kZToxOwkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWVuYWJsZV9pbnRkX3NvZnRfYWNrX21vZGU6MTsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlpbnRkX3NvZnRfYWNrX3RpbWVvdXRfcGVyaW9kOjQ7CS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZW5hYmxlX2R1YWxfbWFwcGluZ19tb2RlOjE7CS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJdmdhX2lvX3BvcnRfZGVjb2RlX2VuYWJsZToxOwkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXZnYV9pb19wb3J0XzE2X2JpdF9kZWNvZGU6MTsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlzdXBwcmVzc19kZXN0X3JlZ2lzdHJhdGlvbjoxOwkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXByb2dyYW1tZWRfaW5pdGlhbF9wcmlvcml0eTozOwkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXVzZV9pbmNvbWluZ19wcmlvcml0eToxOwkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWVuYWJsZV9wcm9ncmFtbWVkX2luaXRpYWxfcHJpb3JpdHk6MTsvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMjlfNjM6MzU7CisJfSBzOworCXN0cnVjdCB1djFoX2xiX2JhdV9taXNjX2NvbnRyb2xfcyB7CisJCXVuc2lnbmVkIGxvbmcJcmVqZWN0aW9uX2RlbGF5Ojg7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWFwaWNfbW9kZToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZm9yY2VfYnJvYWRjYXN0OjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWZvcmNlX2xvY2tfbm9wOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXFwaV9hZ2VudF9wcmVzZW5jZV92ZWN0b3I6MzsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlkZXNjcmlwdG9yX2ZldGNoX21vZGU6MTsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwllbmFibGVfaW50ZF9zb2Z0X2Fja19tb2RlOjE7CS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJaW50ZF9zb2Z0X2Fja190aW1lb3V0X3BlcmlvZDo0OwkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWVuYWJsZV9kdWFsX21hcHBpbmdfbW9kZToxOwkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXZnYV9pb19wb3J0X2RlY29kZV9lbmFibGU6MTsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwl2Z2FfaW9fcG9ydF8xNl9iaXRfZGVjb2RlOjE7CS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJc3VwcHJlc3NfZGVzdF9yZWdpc3RyYXRpb246MTsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlwcm9ncmFtbWVkX2luaXRpYWxfcHJpb3JpdHk6MzsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwl1c2VfaW5jb21pbmdfcHJpb3JpdHk6MTsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwllbmFibGVfcHJvZ3JhbW1lZF9pbml0aWFsX3ByaW9yaXR5OjE7LyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzI5XzQ3OjE5OworCQl1bnNpZ25lZCBsb25nCWZ1bjoxNjsJCQkJLyogUlcgKi8KKwl9IHMxOworCXN0cnVjdCB1djJoX2xiX2JhdV9taXNjX2NvbnRyb2xfcyB7CisJCXVuc2lnbmVkIGxvbmcJcmVqZWN0aW9uX2RlbGF5Ojg7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWFwaWNfbW9kZToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZm9yY2VfYnJvYWRjYXN0OjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWZvcmNlX2xvY2tfbm9wOjE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXFwaV9hZ2VudF9wcmVzZW5jZV92ZWN0b3I6MzsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlkZXNjcmlwdG9yX2ZldGNoX21vZGU6MTsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwllbmFibGVfaW50ZF9zb2Z0X2Fja19tb2RlOjE7CS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJaW50ZF9zb2Z0X2Fja190aW1lb3V0X3BlcmlvZDo0OwkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWVuYWJsZV9kdWFsX21hcHBpbmdfbW9kZToxOwkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXZnYV9pb19wb3J0X2RlY29kZV9lbmFibGU6MTsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwl2Z2FfaW9fcG9ydF8xNl9iaXRfZGVjb2RlOjE7CS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJc3VwcHJlc3NfZGVzdF9yZWdpc3RyYXRpb246MTsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlwcm9ncmFtbWVkX2luaXRpYWxfcHJpb3JpdHk6MzsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwl1c2VfaW5jb21pbmdfcHJpb3JpdHk6MTsJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwllbmFibGVfcHJvZ3JhbW1lZF9pbml0aWFsX3ByaW9yaXR5OjE7LyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwllbmFibGVfYXV0b21hdGljX2FwaWNfbW9kZV9zZWxlY3Rpb246MTsvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWFwaWNfbW9kZV9zdGF0dXM6MTsJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJc3VwcHJlc3NfaW50ZXJydXB0c190b19zZWxmOjE7CS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZW5hYmxlX2xvY2tfYmFzZWRfc3lzdGVtX2ZsdXNoOjE7LyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwllbmFibGVfZXh0ZW5kZWRfc2Jfc3RhdHVzOjE7CS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJc3VwcHJlc3NfaW50X3ByaW9fdWR0X3RvX3NlbGY6MTsvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXVzZV9sZWdhY3lfZGVzY3JpcHRvcl9mb3JtYXRzOjE7LyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzM2XzQ3OjEyOworCQl1bnNpZ25lZCBsb25nCWZ1bjoxNjsJCQkJLyogUlcgKi8KKwl9IHMyOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fQ09OVFJPTCAweDMyMDAyMFVMCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9DT05UUk9MXzMyIDB4OWE4CisjZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9DT05UUk9MCQkweDMyMDAyMFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9DT05UUk9MXzMyCQkweDlhOAogCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9DT05UUk9MX0lOREVYX1NIRlQgMAotI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fQ09OVFJPTF9JTkRFWF9NQVNLIDB4MDAwMDAwMDAwMDAwMDAzZlVMCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9DT05UUk9MX1BVU0hfU0hGVCA2MgotI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fQ09OVFJPTF9QVVNIX01BU0sgMHg0MDAwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVZIX0xCX0JBVV9TQl9BQ1RJVkFUSU9OX0NPTlRST0xfSU5JVF9TSEZUIDYzCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9DT05UUk9MX0lOSVRfTUFTSyAweDgwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fQ09OVFJPTF9JTkRFWF9TSEZUCTAKKyNkZWZpbmUgVVZIX0xCX0JBVV9TQl9BQ1RJVkFUSU9OX0NPTlRST0xfUFVTSF9TSEZUCTYyCisjZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9DT05UUk9MX0lOSVRfU0hGVAk2MworI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fQ09OVFJPTF9JTkRFWF9NQVNLCTB4MDAwMDAwMDAwMDAwMDAzZlVMCisjZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9DT05UUk9MX1BVU0hfTUFTSwkweDQwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fQ09OVFJPTF9JTklUX01BU0sJMHg4MDAwMDAwMDAwMDAwMDAwVUwKIAogdW5pb24gdXZoX2xiX2JhdV9zYl9hY3RpdmF0aW9uX2NvbnRyb2xfdSB7Ci0gICAgdW5zaWduZWQgbG9uZwl2OwotICAgIHN0cnVjdCB1dmhfbGJfYmF1X3NiX2FjdGl2YXRpb25fY29udHJvbF9zIHsKLQl1bnNpZ25lZCBsb25nCWluZGV4IDogIDY7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF82XzYxOiA1NjsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwlwdXNoICA6ICAxOyAgLyogV1AgKi8KLQl1bnNpZ25lZCBsb25nCWluaXQgIDogIDE7ICAvKiBXUCAqLwotICAgIH0gczsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9sYl9iYXVfc2JfYWN0aXZhdGlvbl9jb250cm9sX3MgeworCQl1bnNpZ25lZCBsb25nCWluZGV4OjY7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzZfNjE6NTY7CisJCXVuc2lnbmVkIGxvbmcJcHVzaDoxOwkJCQkvKiBXUCAqLworCQl1bnNpZ25lZCBsb25nCWluaXQ6MTsJCQkJLyogV1AgKi8KKwl9IHM7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgVVZIX0xCX0JBVV9TQl9BQ1RJVkFUSU9OX1NUQVRVU18wICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMCAweDMyMDAzMFVMCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMF8zMiAweDliMAorI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fU1RBVFVTXzAJCTB4MzIwMDMwVUwKKyNkZWZpbmUgVVZIX0xCX0JBVV9TQl9BQ1RJVkFUSU9OX1NUQVRVU18wXzMyCQkweDliMAogCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMF9TVEFUVVNfU0hGVCAwCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMF9TVEFUVVNfTUFTSyAweGZmZmZmZmZmZmZmZmZmZmZVTAorI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fU1RBVFVTXzBfU1RBVFVTX1NIRlQJMAorI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fU1RBVFVTXzBfU1RBVFVTX01BU0sJMHhmZmZmZmZmZmZmZmZmZmZmVUwKIAogdW5pb24gdXZoX2xiX2JhdV9zYl9hY3RpdmF0aW9uX3N0YXR1c18wX3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXZoX2xiX2JhdV9zYl9hY3RpdmF0aW9uX3N0YXR1c18wX3MgewotCXVuc2lnbmVkIGxvbmcJc3RhdHVzIDogNjQ7ICAvKiBSVyAqLwotICAgIH0gczsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9sYl9iYXVfc2JfYWN0aXZhdGlvbl9zdGF0dXNfMF9zIHsKKwkJdW5zaWduZWQgbG9uZwlzdGF0dXM6NjQ7CQkJLyogUlcgKi8KKwl9IHM7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgVVZIX0xCX0JBVV9TQl9BQ1RJVkFUSU9OX1NUQVRVU18xICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMSAweDMyMDA0MFVMCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMV8zMiAweDliOAorI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fU1RBVFVTXzEJCTB4MzIwMDQwVUwKKyNkZWZpbmUgVVZIX0xCX0JBVV9TQl9BQ1RJVkFUSU9OX1NUQVRVU18xXzMyCQkweDliOAogCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMV9TVEFUVVNfU0hGVCAwCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMV9TVEFUVVNfTUFTSyAweGZmZmZmZmZmZmZmZmZmZmZVTAorI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fU1RBVFVTXzFfU1RBVFVTX1NIRlQJMAorI2RlZmluZSBVVkhfTEJfQkFVX1NCX0FDVElWQVRJT05fU1RBVFVTXzFfU1RBVFVTX01BU0sJMHhmZmZmZmZmZmZmZmZmZmZmVUwKIAogdW5pb24gdXZoX2xiX2JhdV9zYl9hY3RpdmF0aW9uX3N0YXR1c18xX3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXZoX2xiX2JhdV9zYl9hY3RpdmF0aW9uX3N0YXR1c18xX3MgewotCXVuc2lnbmVkIGxvbmcJc3RhdHVzIDogNjQ7ICAvKiBSVyAqLwotICAgIH0gczsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9sYl9iYXVfc2JfYWN0aXZhdGlvbl9zdGF0dXNfMV9zIHsKKwkJdW5zaWduZWQgbG9uZwlzdGF0dXM6NjQ7CQkJLyogUlcgKi8KKwl9IHM7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICBVVkhfTEJfQkFVX1NCX0RFU0NSSVBUT1JfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfREVTQ1JJUFRPUl9CQVNFIDB4MzIwMDEwVUwKLSNkZWZpbmUgVVZIX0xCX0JBVV9TQl9ERVNDUklQVE9SX0JBU0VfMzIgMHg5YTAKKyNkZWZpbmUgVVZIX0xCX0JBVV9TQl9ERVNDUklQVE9SX0JBU0UJCQkweDMyMDAxMFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfU0JfREVTQ1JJUFRPUl9CQVNFXzMyCQkweDlhMAogCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfREVTQ1JJUFRPUl9CQVNFX1BBR0VfQUREUkVTU19TSEZUIDEyCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfREVTQ1JJUFRPUl9CQVNFX1BBR0VfQUREUkVTU19NQVNLIDB4MDAwMDA3ZmZmZmZmZjAwMFVMCi0jZGVmaW5lIFVWSF9MQl9CQVVfU0JfREVTQ1JJUFRPUl9CQVNFX05PREVfSURfU0hGVCA0OQotI2RlZmluZSBVVkhfTEJfQkFVX1NCX0RFU0NSSVBUT1JfQkFTRV9OT0RFX0lEX01BU0sgMHg3ZmZlMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVZIX0xCX0JBVV9TQl9ERVNDUklQVE9SX0JBU0VfUEFHRV9BRERSRVNTX1NIRlQJMTIKKyNkZWZpbmUgVVZIX0xCX0JBVV9TQl9ERVNDUklQVE9SX0JBU0VfTk9ERV9JRF9TSEZUCTQ5CisjZGVmaW5lIFVWSF9MQl9CQVVfU0JfREVTQ1JJUFRPUl9CQVNFX1BBR0VfQUREUkVTU19NQVNLCTB4MDAwMDA3ZmZmZmZmZjAwMFVMCisjZGVmaW5lIFVWSF9MQl9CQVVfU0JfREVTQ1JJUFRPUl9CQVNFX05PREVfSURfTUFTSwkweDdmZmUwMDAwMDAwMDAwMDBVTAogCiB1bmlvbiB1dmhfbGJfYmF1X3NiX2Rlc2NyaXB0b3JfYmFzZV91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9sYl9iYXVfc2JfZGVzY3JpcHRvcl9iYXNlX3MgewotCXVuc2lnbmVkIGxvbmcJcnN2ZF8wXzExICAgIDogMTI7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJcGFnZV9hZGRyZXNzIDogMzE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF80M180OCAgIDogIDY7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJbm9kZV9pZCAgICAgIDogMTQ7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF82MyAgICAgIDogIDE7ICAvKiAgICAqLwotICAgIH0gczsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9sYl9iYXVfc2JfZGVzY3JpcHRvcl9iYXNlX3MgeworCQl1bnNpZ25lZCBsb25nCXJzdmRfMF8xMToxMjsKKwkJdW5zaWduZWQgbG9uZwlwYWdlX2FkZHJlc3M6MzE7CQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDNfNDg6NjsKKwkJdW5zaWduZWQgbG9uZwlub2RlX2lkOjE0OwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF82MzoxOworCX0gczsKIH07CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVWSF9OT0RFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgVVZIX05PREVfSUQgMHgwVUwKKyNkZWZpbmUgVVZIX05PREVfSUQJCQkJCTB4MFVMCiAKLSNkZWZpbmUgVVZIX05PREVfSURfRk9SQ0UxX1NIRlQgMAotI2RlZmluZSBVVkhfTk9ERV9JRF9GT1JDRTFfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDFVTAotI2RlZmluZSBVVkhfTk9ERV9JRF9NQU5VRkFDVFVSRVJfU0hGVCAxCi0jZGVmaW5lIFVWSF9OT0RFX0lEX01BTlVGQUNUVVJFUl9NQVNLIDB4MDAwMDAwMDAwMDAwMGZmZVVMCi0jZGVmaW5lIFVWSF9OT0RFX0lEX1BBUlRfTlVNQkVSX1NIRlQgMTIKLSNkZWZpbmUgVVZIX05PREVfSURfUEFSVF9OVU1CRVJfTUFTSyAweDAwMDAwMDAwMGZmZmYwMDBVTAotI2RlZmluZSBVVkhfTk9ERV9JRF9SRVZJU0lPTl9TSEZUIDI4Ci0jZGVmaW5lIFVWSF9OT0RFX0lEX1JFVklTSU9OX01BU0sgMHgwMDAwMDAwMGYwMDAwMDAwVUwKLSNkZWZpbmUgVVZIX05PREVfSURfTk9ERV9JRF9TSEZUIDMyCi0jZGVmaW5lIFVWSF9OT0RFX0lEX05PREVfSURfTUFTSyAweDAwMDA3ZmZmMDAwMDAwMDBVTAorI2RlZmluZSBVVkhfTk9ERV9JRF9GT1JDRTFfU0hGVAkJCQkwCisjZGVmaW5lIFVWSF9OT0RFX0lEX01BTlVGQUNUVVJFUl9TSEZUCQkJMQorI2RlZmluZSBVVkhfTk9ERV9JRF9QQVJUX05VTUJFUl9TSEZUCQkJMTIKKyNkZWZpbmUgVVZIX05PREVfSURfUkVWSVNJT05fU0hGVAkJCTI4CisjZGVmaW5lIFVWSF9OT0RFX0lEX05PREVfSURfU0hGVAkJCTMyCisjZGVmaW5lIFVWSF9OT0RFX0lEX0ZPUkNFMV9NQVNLCQkJCTB4MDAwMDAwMDAwMDAwMDAwMVVMCisjZGVmaW5lIFVWSF9OT0RFX0lEX01BTlVGQUNUVVJFUl9NQVNLCQkJMHgwMDAwMDAwMDAwMDAwZmZlVUwKKyNkZWZpbmUgVVZIX05PREVfSURfUEFSVF9OVU1CRVJfTUFTSwkJCTB4MDAwMDAwMDAwZmZmZjAwMFVMCisjZGVmaW5lIFVWSF9OT0RFX0lEX1JFVklTSU9OX01BU0sJCQkweDAwMDAwMDAwZjAwMDAwMDBVTAorI2RlZmluZSBVVkhfTk9ERV9JRF9OT0RFX0lEX01BU0sJCQkweDAwMDA3ZmZmMDAwMDAwMDBVTAogCi0jZGVmaW5lIFVWMUhfTk9ERV9JRF9GT1JDRTFfU0hGVCAwCi0jZGVmaW5lIFVWMUhfTk9ERV9JRF9GT1JDRTFfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDFVTAotI2RlZmluZSBVVjFIX05PREVfSURfTUFOVUZBQ1RVUkVSX1NIRlQgMQotI2RlZmluZSBVVjFIX05PREVfSURfTUFOVUZBQ1RVUkVSX01BU0sgMHgwMDAwMDAwMDAwMDAwZmZlVUwKLSNkZWZpbmUgVVYxSF9OT0RFX0lEX1BBUlRfTlVNQkVSX1NIRlQgMTIKLSNkZWZpbmUgVVYxSF9OT0RFX0lEX1BBUlRfTlVNQkVSX01BU0sgMHgwMDAwMDAwMDBmZmZmMDAwVUwKLSNkZWZpbmUgVVYxSF9OT0RFX0lEX1JFVklTSU9OX1NIRlQgMjgKLSNkZWZpbmUgVVYxSF9OT0RFX0lEX1JFVklTSU9OX01BU0sgMHgwMDAwMDAwMGYwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9OT0RFX0lEX05PREVfSURfU0hGVCAzMgotI2RlZmluZSBVVjFIX05PREVfSURfTk9ERV9JRF9NQVNLIDB4MDAwMDdmZmYwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfTk9ERV9JRF9OT0RFU19QRVJfQklUX1NIRlQgNDgKLSNkZWZpbmUgVVYxSF9OT0RFX0lEX05PREVTX1BFUl9CSVRfTUFTSyAweDAwN2YwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjFIX05PREVfSURfTklfUE9SVF9TSEZUIDU2Ci0jZGVmaW5lIFVWMUhfTk9ERV9JRF9OSV9QT1JUX01BU0sgMHgwZjAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9OT0RFX0lEX0ZPUkNFMV9TSEZUCQkJMAorI2RlZmluZSBVVjFIX05PREVfSURfTUFOVUZBQ1RVUkVSX1NIRlQJCQkxCisjZGVmaW5lIFVWMUhfTk9ERV9JRF9QQVJUX05VTUJFUl9TSEZUCQkJMTIKKyNkZWZpbmUgVVYxSF9OT0RFX0lEX1JFVklTSU9OX1NIRlQJCQkyOAorI2RlZmluZSBVVjFIX05PREVfSURfTk9ERV9JRF9TSEZUCQkJMzIKKyNkZWZpbmUgVVYxSF9OT0RFX0lEX05PREVTX1BFUl9CSVRfU0hGVAkJCTQ4CisjZGVmaW5lIFVWMUhfTk9ERV9JRF9OSV9QT1JUX1NIRlQJCQk1NgorI2RlZmluZSBVVjFIX05PREVfSURfRk9SQ0UxX01BU0sJCQkweDAwMDAwMDAwMDAwMDAwMDFVTAorI2RlZmluZSBVVjFIX05PREVfSURfTUFOVUZBQ1RVUkVSX01BU0sJCQkweDAwMDAwMDAwMDAwMDBmZmVVTAorI2RlZmluZSBVVjFIX05PREVfSURfUEFSVF9OVU1CRVJfTUFTSwkJCTB4MDAwMDAwMDAwZmZmZjAwMFVMCisjZGVmaW5lIFVWMUhfTk9ERV9JRF9SRVZJU0lPTl9NQVNLCQkJMHgwMDAwMDAwMGYwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9OT0RFX0lEX05PREVfSURfTUFTSwkJCTB4MDAwMDdmZmYwMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfTk9ERV9JRF9OT0RFU19QRVJfQklUX01BU0sJCQkweDAwN2YwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX05PREVfSURfTklfUE9SVF9NQVNLCQkJMHgwZjAwMDAwMDAwMDAwMDAwVUwKIAotI2RlZmluZSBVVjJIX05PREVfSURfRk9SQ0UxX1NIRlQgMAotI2RlZmluZSBVVjJIX05PREVfSURfRk9SQ0UxX01BU0sgMHgwMDAwMDAwMDAwMDAwMDAxVUwKLSNkZWZpbmUgVVYySF9OT0RFX0lEX01BTlVGQUNUVVJFUl9TSEZUIDEKLSNkZWZpbmUgVVYySF9OT0RFX0lEX01BTlVGQUNUVVJFUl9NQVNLIDB4MDAwMDAwMDAwMDAwMGZmZVVMCi0jZGVmaW5lIFVWMkhfTk9ERV9JRF9QQVJUX05VTUJFUl9TSEZUIDEyCi0jZGVmaW5lIFVWMkhfTk9ERV9JRF9QQVJUX05VTUJFUl9NQVNLIDB4MDAwMDAwMDAwZmZmZjAwMFVMCi0jZGVmaW5lIFVWMkhfTk9ERV9JRF9SRVZJU0lPTl9TSEZUIDI4Ci0jZGVmaW5lIFVWMkhfTk9ERV9JRF9SRVZJU0lPTl9NQVNLIDB4MDAwMDAwMDBmMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfTk9ERV9JRF9OT0RFX0lEX1NIRlQgMzIKLSNkZWZpbmUgVVYySF9OT0RFX0lEX05PREVfSURfTUFTSyAweDAwMDA3ZmZmMDAwMDAwMDBVTAotI2RlZmluZSBVVjJIX05PREVfSURfTk9ERVNfUEVSX0JJVF9TSEZUIDUwCi0jZGVmaW5lIFVWMkhfTk9ERV9JRF9OT0RFU19QRVJfQklUX01BU0sgMHgwMWZjMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgVVYySF9OT0RFX0lEX05JX1BPUlRfU0hGVCA1NwotI2RlZmluZSBVVjJIX05PREVfSURfTklfUE9SVF9NQVNLIDB4M2UwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfTk9ERV9JRF9GT1JDRTFfU0hGVAkJCTAKKyNkZWZpbmUgVVYySF9OT0RFX0lEX01BTlVGQUNUVVJFUl9TSEZUCQkJMQorI2RlZmluZSBVVjJIX05PREVfSURfUEFSVF9OVU1CRVJfU0hGVAkJCTEyCisjZGVmaW5lIFVWMkhfTk9ERV9JRF9SRVZJU0lPTl9TSEZUCQkJMjgKKyNkZWZpbmUgVVYySF9OT0RFX0lEX05PREVfSURfU0hGVAkJCTMyCisjZGVmaW5lIFVWMkhfTk9ERV9JRF9OT0RFU19QRVJfQklUX1NIRlQJCQk1MAorI2RlZmluZSBVVjJIX05PREVfSURfTklfUE9SVF9TSEZUCQkJNTcKKyNkZWZpbmUgVVYySF9OT0RFX0lEX0ZPUkNFMV9NQVNLCQkJMHgwMDAwMDAwMDAwMDAwMDAxVUwKKyNkZWZpbmUgVVYySF9OT0RFX0lEX01BTlVGQUNUVVJFUl9NQVNLCQkJMHgwMDAwMDAwMDAwMDAwZmZlVUwKKyNkZWZpbmUgVVYySF9OT0RFX0lEX1BBUlRfTlVNQkVSX01BU0sJCQkweDAwMDAwMDAwMGZmZmYwMDBVTAorI2RlZmluZSBVVjJIX05PREVfSURfUkVWSVNJT05fTUFTSwkJCTB4MDAwMDAwMDBmMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfTk9ERV9JRF9OT0RFX0lEX01BU0sJCQkweDAwMDA3ZmZmMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX05PREVfSURfTk9ERVNfUEVSX0JJVF9NQVNLCQkJMHgwMWZjMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9OT0RFX0lEX05JX1BPUlRfTUFTSwkJCTB4M2UwMDAwMDAwMDAwMDAwMFVMCiAKIHVuaW9uIHV2aF9ub2RlX2lkX3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXZoX25vZGVfaWRfcyB7Ci0JdW5zaWduZWQgbG9uZwlmb3JjZTEgICAgICAgIDogIDE7ICAvKiBSTyAqLwotCXVuc2lnbmVkIGxvbmcJbWFudWZhY3R1cmVyICA6IDExOyAgLyogUk8gKi8KLQl1bnNpZ25lZCBsb25nCXBhcnRfbnVtYmVyICAgOiAxNjsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwlyZXZpc2lvbiAgICAgIDogIDQ7ICAvKiBSTyAqLwotCXVuc2lnbmVkIGxvbmcJbm9kZV9pZCAgICAgICA6IDE1OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfNDdfNjMgICAgOiAxNzsKLSAgICB9IHM7Ci0gICAgc3RydWN0IHV2MWhfbm9kZV9pZF9zIHsKLQl1bnNpZ25lZCBsb25nCWZvcmNlMSAgICAgICAgOiAgMTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwltYW51ZmFjdHVyZXIgIDogMTE7ICAvKiBSTyAqLwotCXVuc2lnbmVkIGxvbmcJcGFydF9udW1iZXIgICA6IDE2OyAgLyogUk8gKi8KLQl1bnNpZ25lZCBsb25nCXJldmlzaW9uICAgICAgOiAgNDsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwlub2RlX2lkICAgICAgIDogMTU7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF80NyAgICAgICA6ICAxOyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCW5vZGVzX3Blcl9iaXQgOiAgNzsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzU1ICAgICAgIDogIDE7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJbmlfcG9ydCAgICAgICA6ICA0OyAgLyogUk8gKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfNjBfNjMgICAgOiAgNDsgIC8qICAgICovCi0gICAgfSBzMTsKLSAgICBzdHJ1Y3QgdXYyaF9ub2RlX2lkX3MgewotCXVuc2lnbmVkIGxvbmcJZm9yY2UxICAgICAgICA6ICAxOyAgLyogUk8gKi8KLQl1bnNpZ25lZCBsb25nCW1hbnVmYWN0dXJlciAgOiAxMTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwlwYXJ0X251bWJlciAgIDogMTY7ICAvKiBSTyAqLwotCXVuc2lnbmVkIGxvbmcJcmV2aXNpb24gICAgICA6ICA0OyAgLyogUk8gKi8KLQl1bnNpZ25lZCBsb25nCW5vZGVfaWQgICAgICAgOiAxNTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzQ3XzQ5ICAgIDogIDM7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJbm9kZXNfcGVyX2JpdCA6ICA3OyAgLyogUk8gKi8KLQl1bnNpZ25lZCBsb25nCW5pX3BvcnQgICAgICAgOiAgNTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzYyXzYzICAgIDogIDI7ICAvKiAgICAqLwotICAgIH0gczI7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfbm9kZV9pZF9zIHsKKwkJdW5zaWduZWQgbG9uZwlmb3JjZTE6MTsJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCW1hbnVmYWN0dXJlcjoxMTsJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJcGFydF9udW1iZXI6MTY7CQkJLyogUk8gKi8KKwkJdW5zaWduZWQgbG9uZwlyZXZpc2lvbjo0OwkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJbm9kZV9pZDoxNTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDdfNjM6MTc7CisJfSBzOworCXN0cnVjdCB1djFoX25vZGVfaWRfcyB7CisJCXVuc2lnbmVkIGxvbmcJZm9yY2UxOjE7CQkJLyogUk8gKi8KKwkJdW5zaWduZWQgbG9uZwltYW51ZmFjdHVyZXI6MTE7CQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCXBhcnRfbnVtYmVyOjE2OwkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJcmV2aXNpb246NDsJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCW5vZGVfaWQ6MTU7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzQ3OjE7CisJCXVuc2lnbmVkIGxvbmcJbm9kZXNfcGVyX2JpdDo3OwkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzU1OjE7CisJCXVuc2lnbmVkIGxvbmcJbmlfcG9ydDo0OwkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF82MF82Mzo0OworCX0gczE7CisJc3RydWN0IHV2Mmhfbm9kZV9pZF9zIHsKKwkJdW5zaWduZWQgbG9uZwlmb3JjZTE6MTsJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCW1hbnVmYWN0dXJlcjoxMTsJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJcGFydF9udW1iZXI6MTY7CQkJLyogUk8gKi8KKwkJdW5zaWduZWQgbG9uZwlyZXZpc2lvbjo0OwkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJbm9kZV9pZDoxNTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDdfNDk6MzsKKwkJdW5zaWduZWQgbG9uZwlub2Rlc19wZXJfYml0Ojc7CQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCW5pX3BvcnQ6NTsJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNjJfNjM6MjsKKwl9IHMyOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgIFVWSF9OT0RFX1BSRVNFTlRfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfTk9ERV9QUkVTRU5UX1RBQkxFIDB4MTQwMFVMCi0jZGVmaW5lIFVWSF9OT0RFX1BSRVNFTlRfVEFCTEVfREVQVEggMTYKKyNkZWZpbmUgVVZIX05PREVfUFJFU0VOVF9UQUJMRQkJCQkweDE0MDBVTAorI2RlZmluZSBVVkhfTk9ERV9QUkVTRU5UX1RBQkxFX0RFUFRICQkJMTYKIAotI2RlZmluZSBVVkhfTk9ERV9QUkVTRU5UX1RBQkxFX05PREVTX1NIRlQgMAotI2RlZmluZSBVVkhfTk9ERV9QUkVTRU5UX1RBQkxFX05PREVTX01BU0sgMHhmZmZmZmZmZmZmZmZmZmZmVUwKKyNkZWZpbmUgVVZIX05PREVfUFJFU0VOVF9UQUJMRV9OT0RFU19TSEZUCQkwCisjZGVmaW5lIFVWSF9OT0RFX1BSRVNFTlRfVEFCTEVfTk9ERVNfTUFTSwkJMHhmZmZmZmZmZmZmZmZmZmZmVUwKIAogdW5pb24gdXZoX25vZGVfcHJlc2VudF90YWJsZV91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9ub2RlX3ByZXNlbnRfdGFibGVfcyB7Ci0JdW5zaWduZWQgbG9uZwlub2RlcyA6IDY0OyAgLyogUlcgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfbm9kZV9wcmVzZW50X3RhYmxlX3MgeworCQl1bnNpZ25lZCBsb25nCW5vZGVzOjY0OwkJCS8qIFJXICovCisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMF9NTVIgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzBfTU1SIDB4MTYwMDBjOFVMCisjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMF9NTVIJMHgxNjAwMGM4VUwKIAogI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzBfTU1SX0JBU0VfU0hGVCAyNAotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzBfTU1SX0JBU0VfTUFTSyAweDAwMDAwMDAwZmYwMDAwMDBVTAogI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzBfTU1SX01fQUxJQVNfU0hGVCA0OAotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzBfTU1SX01fQUxJQVNfTUFTSyAweDAwMWYwMDAwMDAwMDAwMDBVTAogI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzBfTU1SX0VOQUJMRV9TSEZUIDYzCisjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMF9NTVJfQkFTRV9NQVNLIDB4MDAwMDAwMDBmZjAwMDAwMFVMCisjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMF9NTVJfTV9BTElBU19NQVNLIDB4MDAxZjAwMDAwMDAwMDAwMFVMCiAjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMF9NTVJfRU5BQkxFX01BU0sgMHg4MDAwMDAwMDAwMDAwMDAwVUwKIAogdW5pb24gdXZoX3JoX2dhbV9hbGlhczIxMF9vdmVybGF5X2NvbmZpZ18wX21tcl91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9yaF9nYW1fYWxpYXMyMTBfb3ZlcmxheV9jb25maWdfMF9tbXJfcyB7Ci0JdW5zaWduZWQgbG9uZwlyc3ZkXzBfMjM6IDI0OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWJhc2UgICAgOiAgODsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzMyXzQ3OiAxNjsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwltX2FsaWFzIDogIDU7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF81M182MjogMTA7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlICA6ICAxOyAgLyogUlcgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfcmhfZ2FtX2FsaWFzMjEwX292ZXJsYXlfY29uZmlnXzBfbW1yX3MgeworCQl1bnNpZ25lZCBsb25nCXJzdmRfMF8yMzoyNDsKKwkJdW5zaWduZWQgbG9uZwliYXNlOjg7CQkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8zMl80NzoxNjsKKwkJdW5zaWduZWQgbG9uZwltX2FsaWFzOjU7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzUzXzYyOjEwOworCQl1bnNpZ25lZCBsb25nCWVuYWJsZToxOwkJCS8qIFJXICovCisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMV9NTVIgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzFfTU1SIDB4MTYwMDBkOFVMCisjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMV9NTVIJMHgxNjAwMGQ4VUwKIAogI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzFfTU1SX0JBU0VfU0hGVCAyNAotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzFfTU1SX0JBU0VfTUFTSyAweDAwMDAwMDAwZmYwMDAwMDBVTAogI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzFfTU1SX01fQUxJQVNfU0hGVCA0OAotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzFfTU1SX01fQUxJQVNfTUFTSyAweDAwMWYwMDAwMDAwMDAwMDBVTAogI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzFfTU1SX0VOQUJMRV9TSEZUIDYzCisjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMV9NTVJfQkFTRV9NQVNLIDB4MDAwMDAwMDBmZjAwMDAwMFVMCisjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMV9NTVJfTV9BTElBU19NQVNLIDB4MDAxZjAwMDAwMDAwMDAwMFVMCiAjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMV9NTVJfRU5BQkxFX01BU0sgMHg4MDAwMDAwMDAwMDAwMDAwVUwKIAogdW5pb24gdXZoX3JoX2dhbV9hbGlhczIxMF9vdmVybGF5X2NvbmZpZ18xX21tcl91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9yaF9nYW1fYWxpYXMyMTBfb3ZlcmxheV9jb25maWdfMV9tbXJfcyB7Ci0JdW5zaWduZWQgbG9uZwlyc3ZkXzBfMjM6IDI0OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWJhc2UgICAgOiAgODsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzMyXzQ3OiAxNjsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwltX2FsaWFzIDogIDU7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF81M182MjogMTA7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlICA6ICAxOyAgLyogUlcgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfcmhfZ2FtX2FsaWFzMjEwX292ZXJsYXlfY29uZmlnXzFfbW1yX3MgeworCQl1bnNpZ25lZCBsb25nCXJzdmRfMF8yMzoyNDsKKwkJdW5zaWduZWQgbG9uZwliYXNlOjg7CQkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8zMl80NzoxNjsKKwkJdW5zaWduZWQgbG9uZwltX2FsaWFzOjU7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzUzXzYyOjEwOworCQl1bnNpZ25lZCBsb25nCWVuYWJsZToxOwkJCS8qIFJXICovCisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMl9NTVIgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzJfTU1SIDB4MTYwMDBlOFVMCisjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMl9NTVIJMHgxNjAwMGU4VUwKIAogI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzJfTU1SX0JBU0VfU0hGVCAyNAotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzJfTU1SX0JBU0VfTUFTSyAweDAwMDAwMDAwZmYwMDAwMDBVTAogI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzJfTU1SX01fQUxJQVNfU0hGVCA0OAotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzJfTU1SX01fQUxJQVNfTUFTSyAweDAwMWYwMDAwMDAwMDAwMDBVTAogI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX09WRVJMQVlfQ09ORklHXzJfTU1SX0VOQUJMRV9TSEZUIDYzCisjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMl9NTVJfQkFTRV9NQVNLIDB4MDAwMDAwMDBmZjAwMDAwMFVMCisjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMl9NTVJfTV9BTElBU19NQVNLIDB4MDAxZjAwMDAwMDAwMDAwMFVMCiAjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfT1ZFUkxBWV9DT05GSUdfMl9NTVJfRU5BQkxFX01BU0sgMHg4MDAwMDAwMDAwMDAwMDAwVUwKIAogdW5pb24gdXZoX3JoX2dhbV9hbGlhczIxMF9vdmVybGF5X2NvbmZpZ18yX21tcl91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2aF9yaF9nYW1fYWxpYXMyMTBfb3ZlcmxheV9jb25maWdfMl9tbXJfcyB7Ci0JdW5zaWduZWQgbG9uZwlyc3ZkXzBfMjM6IDI0OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWJhc2UgICAgOiAgODsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzMyXzQ3OiAxNjsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwltX2FsaWFzIDogIDU7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF81M182MjogMTA7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlICA6ICAxOyAgLyogUlcgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfcmhfZ2FtX2FsaWFzMjEwX292ZXJsYXlfY29uZmlnXzJfbW1yX3MgeworCQl1bnNpZ25lZCBsb25nCXJzdmRfMF8yMzoyNDsKKwkJdW5zaWduZWQgbG9uZwliYXNlOjg7CQkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8zMl80NzoxNjsKKwkJdW5zaWduZWQgbG9uZwltX2FsaWFzOjU7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzUzXzYyOjEwOworCQl1bnNpZ25lZCBsb25nCWVuYWJsZToxOwkJCS8qIFJXICovCisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgVVZIX1JIX0dBTV9BTElBUzIxMF9SRURJUkVDVF9DT05GSUdfMF9NTVIgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX1JFRElSRUNUX0NPTkZJR18wX01NUiAweDE2MDAwZDBVTAorI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX1JFRElSRUNUX0NPTkZJR18wX01NUgkweDE2MDAwZDBVTAogCiAjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfUkVESVJFQ1RfQ09ORklHXzBfTU1SX0RFU1RfQkFTRV9TSEZUIDI0CiAjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfUkVESVJFQ1RfQ09ORklHXzBfTU1SX0RFU1RfQkFTRV9NQVNLIDB4MDAwMDNmZmZmZjAwMDAwMFVMCiAKIHVuaW9uIHV2aF9yaF9nYW1fYWxpYXMyMTBfcmVkaXJlY3RfY29uZmlnXzBfbW1yX3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXZoX3JoX2dhbV9hbGlhczIxMF9yZWRpcmVjdF9jb25maWdfMF9tbXJfcyB7Ci0JdW5zaWduZWQgbG9uZwlyc3ZkXzBfMjMgOiAyNDsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwlkZXN0X2Jhc2UgOiAyMjsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzQ2XzYzOiAxODsgIC8qICAgICovCi0gICAgfSBzOworCXVuc2lnbmVkIGxvbmcJdjsKKwlzdHJ1Y3QgdXZoX3JoX2dhbV9hbGlhczIxMF9yZWRpcmVjdF9jb25maWdfMF9tbXJfcyB7CisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8wXzIzOjI0OworCQl1bnNpZ25lZCBsb25nCWRlc3RfYmFzZToyMjsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDZfNjM6MTg7CisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgVVZIX1JIX0dBTV9BTElBUzIxMF9SRURJUkVDVF9DT05GSUdfMV9NTVIgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX1JFRElSRUNUX0NPTkZJR18xX01NUiAweDE2MDAwZTBVTAorI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX1JFRElSRUNUX0NPTkZJR18xX01NUgkweDE2MDAwZTBVTAogCiAjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfUkVESVJFQ1RfQ09ORklHXzFfTU1SX0RFU1RfQkFTRV9TSEZUIDI0CiAjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfUkVESVJFQ1RfQ09ORklHXzFfTU1SX0RFU1RfQkFTRV9NQVNLIDB4MDAwMDNmZmZmZjAwMDAwMFVMCiAKIHVuaW9uIHV2aF9yaF9nYW1fYWxpYXMyMTBfcmVkaXJlY3RfY29uZmlnXzFfbW1yX3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXZoX3JoX2dhbV9hbGlhczIxMF9yZWRpcmVjdF9jb25maWdfMV9tbXJfcyB7Ci0JdW5zaWduZWQgbG9uZwlyc3ZkXzBfMjMgOiAyNDsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwlkZXN0X2Jhc2UgOiAyMjsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzQ2XzYzOiAxODsgIC8qICAgICovCi0gICAgfSBzOworCXVuc2lnbmVkIGxvbmcJdjsKKwlzdHJ1Y3QgdXZoX3JoX2dhbV9hbGlhczIxMF9yZWRpcmVjdF9jb25maWdfMV9tbXJfcyB7CisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8wXzIzOjI0OworCQl1bnNpZ25lZCBsb25nCWRlc3RfYmFzZToyMjsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDZfNjM6MTg7CisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgVVZIX1JIX0dBTV9BTElBUzIxMF9SRURJUkVDVF9DT05GSUdfMl9NTVIgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX1JFRElSRUNUX0NPTkZJR18yX01NUiAweDE2MDAwZjBVTAorI2RlZmluZSBVVkhfUkhfR0FNX0FMSUFTMjEwX1JFRElSRUNUX0NPTkZJR18yX01NUgkweDE2MDAwZjBVTAogCiAjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfUkVESVJFQ1RfQ09ORklHXzJfTU1SX0RFU1RfQkFTRV9TSEZUIDI0CiAjZGVmaW5lIFVWSF9SSF9HQU1fQUxJQVMyMTBfUkVESVJFQ1RfQ09ORklHXzJfTU1SX0RFU1RfQkFTRV9NQVNLIDB4MDAwMDNmZmZmZjAwMDAwMFVMCiAKIHVuaW9uIHV2aF9yaF9nYW1fYWxpYXMyMTBfcmVkaXJlY3RfY29uZmlnXzJfbW1yX3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXZoX3JoX2dhbV9hbGlhczIxMF9yZWRpcmVjdF9jb25maWdfMl9tbXJfcyB7Ci0JdW5zaWduZWQgbG9uZwlyc3ZkXzBfMjMgOiAyNDsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwlkZXN0X2Jhc2UgOiAyMjsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzQ2XzYzOiAxODsgIC8qICAgICovCi0gICAgfSBzOworCXVuc2lnbmVkIGxvbmcJdjsKKwlzdHJ1Y3QgdXZoX3JoX2dhbV9hbGlhczIxMF9yZWRpcmVjdF9jb25maWdfMl9tbXJfcyB7CisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8wXzIzOjI0OworCQl1bnNpZ25lZCBsb25nCWRlc3RfYmFzZToyMjsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDZfNjM6MTg7CisJfSBzOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgIFVWSF9SSF9HQU1fQ09ORklHX01NUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfUkhfR0FNX0NPTkZJR19NTVIgMHgxNjAwMDAwVUwKKyNkZWZpbmUgVVZIX1JIX0dBTV9DT05GSUdfTU1SCQkJCTB4MTYwMDAwMFVMCiAKLSNkZWZpbmUgVVZIX1JIX0dBTV9DT05GSUdfTU1SX01fU0tUX1NIRlQgMAotI2RlZmluZSBVVkhfUkhfR0FNX0NPTkZJR19NTVJfTV9TS1RfTUFTSyAweDAwMDAwMDAwMDAwMDAwM2ZVTAotI2RlZmluZSBVVkhfUkhfR0FNX0NPTkZJR19NTVJfTl9TS1RfU0hGVCA2Ci0jZGVmaW5lIFVWSF9SSF9HQU1fQ09ORklHX01NUl9OX1NLVF9NQVNLIDB4MDAwMDAwMDAwMDAwMDNjMFVMCisjZGVmaW5lIFVWSF9SSF9HQU1fQ09ORklHX01NUl9NX1NLVF9TSEZUCQkwCisjZGVmaW5lIFVWSF9SSF9HQU1fQ09ORklHX01NUl9OX1NLVF9TSEZUCQk2CisjZGVmaW5lIFVWSF9SSF9HQU1fQ09ORklHX01NUl9NX1NLVF9NQVNLCQkweDAwMDAwMDAwMDAwMDAwM2ZVTAorI2RlZmluZSBVVkhfUkhfR0FNX0NPTkZJR19NTVJfTl9TS1RfTUFTSwkJMHgwMDAwMDAwMDAwMDAwM2MwVUwKIAotI2RlZmluZSBVVjFIX1JIX0dBTV9DT05GSUdfTU1SX01fU0tUX1NIRlQgMAotI2RlZmluZSBVVjFIX1JIX0dBTV9DT05GSUdfTU1SX01fU0tUX01BU0sgMHgwMDAwMDAwMDAwMDAwMDNmVUwKLSNkZWZpbmUgVVYxSF9SSF9HQU1fQ09ORklHX01NUl9OX1NLVF9TSEZUIDYKLSNkZWZpbmUgVVYxSF9SSF9HQU1fQ09ORklHX01NUl9OX1NLVF9NQVNLIDB4MDAwMDAwMDAwMDAwMDNjMFVMCi0jZGVmaW5lIFVWMUhfUkhfR0FNX0NPTkZJR19NTVJfTU1JT0xfQ0ZHX1NIRlQgMTIKLSNkZWZpbmUgVVYxSF9SSF9HQU1fQ09ORklHX01NUl9NTUlPTF9DRkdfTUFTSyAweDAwMDAwMDAwMDAwMDEwMDBVTAorI2RlZmluZSBVVjFIX1JIX0dBTV9DT05GSUdfTU1SX01fU0tUX1NIRlQJCTAKKyNkZWZpbmUgVVYxSF9SSF9HQU1fQ09ORklHX01NUl9OX1NLVF9TSEZUCQk2CisjZGVmaW5lIFVWMUhfUkhfR0FNX0NPTkZJR19NTVJfTU1JT0xfQ0ZHX1NIRlQJCTEyCisjZGVmaW5lIFVWMUhfUkhfR0FNX0NPTkZJR19NTVJfTV9TS1RfTUFTSwkJMHgwMDAwMDAwMDAwMDAwMDNmVUwKKyNkZWZpbmUgVVYxSF9SSF9HQU1fQ09ORklHX01NUl9OX1NLVF9NQVNLCQkweDAwMDAwMDAwMDAwMDAzYzBVTAorI2RlZmluZSBVVjFIX1JIX0dBTV9DT05GSUdfTU1SX01NSU9MX0NGR19NQVNLCQkweDAwMDAwMDAwMDAwMDEwMDBVTAogCi0jZGVmaW5lIFVWMkhfUkhfR0FNX0NPTkZJR19NTVJfTV9TS1RfU0hGVCAwCi0jZGVmaW5lIFVWMkhfUkhfR0FNX0NPTkZJR19NTVJfTV9TS1RfTUFTSyAweDAwMDAwMDAwMDAwMDAwM2ZVTAotI2RlZmluZSBVVjJIX1JIX0dBTV9DT05GSUdfTU1SX05fU0tUX1NIRlQgNgotI2RlZmluZSBVVjJIX1JIX0dBTV9DT05GSUdfTU1SX05fU0tUX01BU0sgMHgwMDAwMDAwMDAwMDAwM2MwVUwKKyNkZWZpbmUgVVYySF9SSF9HQU1fQ09ORklHX01NUl9NX1NLVF9TSEZUCQkwCisjZGVmaW5lIFVWMkhfUkhfR0FNX0NPTkZJR19NTVJfTl9TS1RfU0hGVAkJNgorI2RlZmluZSBVVjJIX1JIX0dBTV9DT05GSUdfTU1SX01fU0tUX01BU0sJCTB4MDAwMDAwMDAwMDAwMDAzZlVMCisjZGVmaW5lIFVWMkhfUkhfR0FNX0NPTkZJR19NTVJfTl9TS1RfTUFTSwkJMHgwMDAwMDAwMDAwMDAwM2MwVUwKIAogdW5pb24gdXZoX3JoX2dhbV9jb25maWdfbW1yX3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXZoX3JoX2dhbV9jb25maWdfbW1yX3MgewotCXVuc2lnbmVkIGxvbmcJbV9za3QgICAgIDogIDY7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbl9za3QgICAgIDogIDQ7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF8xMF82MyAgICA6IDU0OwotICAgIH0gczsKLSAgICBzdHJ1Y3QgdXYxaF9yaF9nYW1fY29uZmlnX21tcl9zIHsKLQl1bnNpZ25lZCBsb25nCW1fc2t0ICAgICA6ICA2OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCW5fc2t0ICAgICA6ICA0OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfMTBfMTE6ICAyOyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCW1taW9sX2NmZyA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfMTNfNjM6IDUxOyAgLyogICAgKi8KLSAgICB9IHMxOwotICAgIHN0cnVjdCB1djJoX3JoX2dhbV9jb25maWdfbW1yX3MgewotCXVuc2lnbmVkIGxvbmcJbV9za3QgOiAgNjsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwluX3NrdCA6ICA0OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfMTBfNjM6IDU0OyAgLyogICAgKi8KLSAgICB9IHMyOworCXVuc2lnbmVkIGxvbmcJdjsKKwlzdHJ1Y3QgdXZoX3JoX2dhbV9jb25maWdfbW1yX3MgeworCQl1bnNpZ25lZCBsb25nCW1fc2t0OjY7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwluX3NrdDo0OwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8xMF82Mzo1NDsKKwl9IHM7CisJc3RydWN0IHV2MWhfcmhfZ2FtX2NvbmZpZ19tbXJfcyB7CisJCXVuc2lnbmVkIGxvbmcJbV9za3Q6NjsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCW5fc2t0OjQ7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzEwXzExOjI7CisJCXVuc2lnbmVkIGxvbmcJbW1pb2xfY2ZnOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzEzXzYzOjUxOworCX0gczE7CisJc3RydWN0IHV2MmhfcmhfZ2FtX2NvbmZpZ19tbXJfcyB7CisJCXVuc2lnbmVkIGxvbmcJbV9za3Q6NjsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCW5fc2t0OjQ7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzEwXzYzOjU0OworCX0gczI7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgVVZIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9SSF9HQU1fR1JVX09WRVJMQVlfQ09ORklHX01NUiAweDE2MDAwMTBVTAorI2RlZmluZSBVVkhfUkhfR0FNX0dSVV9PVkVSTEFZX0NPTkZJR19NTVIJCTB4MTYwMDAxMFVMCiAKLSNkZWZpbmUgVVZIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX0JBU0VfU0hGVCAyOAotI2RlZmluZSBVVkhfUkhfR0FNX0dSVV9PVkVSTEFZX0NPTkZJR19NTVJfQkFTRV9NQVNLIDB4MDAwMDNmZmZmMDAwMDAwMFVMCisjZGVmaW5lIFVWSF9SSF9HQU1fR1JVX09WRVJMQVlfQ09ORklHX01NUl9CQVNFX1NIRlQJMjgKKyNkZWZpbmUgVVZIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX0JBU0VfTUFTSwkweDAwMDAzZmZmZjAwMDAwMDBVTAogCi0jZGVmaW5lIFVWMUhfUkhfR0FNX0dSVV9PVkVSTEFZX0NPTkZJR19NTVJfQkFTRV9TSEZUIDI4Ci0jZGVmaW5lIFVWMUhfUkhfR0FNX0dSVV9PVkVSTEFZX0NPTkZJR19NTVJfQkFTRV9NQVNLIDB4MDAwMDNmZmZmMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfUkhfR0FNX0dSVV9PVkVSTEFZX0NPTkZJR19NTVJfR1I0X1NIRlQgNDgKLSNkZWZpbmUgVVYxSF9SSF9HQU1fR1JVX09WRVJMQVlfQ09ORklHX01NUl9HUjRfTUFTSyAweDAwMDEwMDAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjFIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX05fR1JVX1NIRlQgNTIKLSNkZWZpbmUgVVYxSF9SSF9HQU1fR1JVX09WRVJMQVlfQ09ORklHX01NUl9OX0dSVV9NQVNLIDB4MDBmMDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfUkhfR0FNX0dSVV9PVkVSTEFZX0NPTkZJR19NTVJfRU5BQkxFX1NIRlQgNjMKLSNkZWZpbmUgVVYxSF9SSF9HQU1fR1JVX09WRVJMQVlfQ09ORklHX01NUl9FTkFCTEVfTUFTSyAweDgwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX0JBU0VfU0hGVAkyOAorI2RlZmluZSBVVjFIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX0dSNF9TSEZUCTQ4CisjZGVmaW5lIFVWMUhfUkhfR0FNX0dSVV9PVkVSTEFZX0NPTkZJR19NTVJfTl9HUlVfU0hGVAk1MgorI2RlZmluZSBVVjFIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX0VOQUJMRV9TSEZUCTYzCisjZGVmaW5lIFVWMUhfUkhfR0FNX0dSVV9PVkVSTEFZX0NPTkZJR19NTVJfQkFTRV9NQVNLCTB4MDAwMDNmZmZmMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfUkhfR0FNX0dSVV9PVkVSTEFZX0NPTkZJR19NTVJfR1I0X01BU0sJMHgwMDAxMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9SSF9HQU1fR1JVX09WRVJMQVlfQ09ORklHX01NUl9OX0dSVV9NQVNLCTB4MDBmMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfUkhfR0FNX0dSVV9PVkVSTEFZX0NPTkZJR19NTVJfRU5BQkxFX01BU0sJMHg4MDAwMDAwMDAwMDAwMDAwVUwKIAotI2RlZmluZSBVVjJIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX0JBU0VfU0hGVCAyOAotI2RlZmluZSBVVjJIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX0JBU0VfTUFTSyAweDAwMDAzZmZmZjAwMDAwMDBVTAotI2RlZmluZSBVVjJIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX05fR1JVX1NIRlQgNTIKLSNkZWZpbmUgVVYySF9SSF9HQU1fR1JVX09WRVJMQVlfQ09ORklHX01NUl9OX0dSVV9NQVNLIDB4MDBmMDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfUkhfR0FNX0dSVV9PVkVSTEFZX0NPTkZJR19NTVJfRU5BQkxFX1NIRlQgNjMKLSNkZWZpbmUgVVYySF9SSF9HQU1fR1JVX09WRVJMQVlfQ09ORklHX01NUl9FTkFCTEVfTUFTSyAweDgwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX0JBU0VfU0hGVAkyOAorI2RlZmluZSBVVjJIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX05fR1JVX1NIRlQJNTIKKyNkZWZpbmUgVVYySF9SSF9HQU1fR1JVX09WRVJMQVlfQ09ORklHX01NUl9FTkFCTEVfU0hGVAk2MworI2RlZmluZSBVVjJIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX0JBU0VfTUFTSwkweDAwMDAzZmZmZjAwMDAwMDBVTAorI2RlZmluZSBVVjJIX1JIX0dBTV9HUlVfT1ZFUkxBWV9DT05GSUdfTU1SX05fR1JVX01BU0sJMHgwMGYwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9SSF9HQU1fR1JVX09WRVJMQVlfQ09ORklHX01NUl9FTkFCTEVfTUFTSwkweDgwMDAwMDAwMDAwMDAwMDBVTAogCiB1bmlvbiB1dmhfcmhfZ2FtX2dydV9vdmVybGF5X2NvbmZpZ19tbXJfdSB7Ci0gICAgdW5zaWduZWQgbG9uZwl2OwotICAgIHN0cnVjdCB1dmhfcmhfZ2FtX2dydV9vdmVybGF5X2NvbmZpZ19tbXJfcyB7Ci0JdW5zaWduZWQgbG9uZwlyc3ZkXzBfMjc6IDI4OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWJhc2UgICA6IDE4OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfNDZfNjIgICAgOiAxNzsKLQl1bnNpZ25lZCBsb25nCWVuYWJsZSA6ICAxOyAgLyogUlcgKi8KLSAgICB9IHM7Ci0gICAgc3RydWN0IHV2MWhfcmhfZ2FtX2dydV9vdmVybGF5X2NvbmZpZ19tbXJfcyB7Ci0JdW5zaWduZWQgbG9uZwlyc3ZkXzBfMjc6IDI4OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWJhc2UgICA6IDE4OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfNDZfNDc6ICAyOyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWdyNCAgICA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfNDlfNTE6ICAzOyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCW5fZ3J1ICA6ICA0OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfNTZfNjI6ICA3OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWVuYWJsZSA6ICAxOyAgLyogUlcgKi8KLSAgICB9IHMxOwotICAgIHN0cnVjdCB1djJoX3JoX2dhbV9ncnVfb3ZlcmxheV9jb25maWdfbW1yX3MgewotCXVuc2lnbmVkIGxvbmcJcnN2ZF8wXzI3OiAyODsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwliYXNlICAgOiAxODsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzQ2XzUxOiAgNjsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwluX2dydSAgOiAgNDsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzU2XzYyOiAgNzsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwllbmFibGUgOiAgMTsgIC8qIFJXICovCi0gICAgfSBzMjsKKwl1bnNpZ25lZCBsb25nCXY7CisJc3RydWN0IHV2aF9yaF9nYW1fZ3J1X292ZXJsYXlfY29uZmlnX21tcl9zIHsKKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzBfMjc6Mjg7CisJCXVuc2lnbmVkIGxvbmcJYmFzZToxODsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDZfNjI6MTc7CisJCXVuc2lnbmVkIGxvbmcJZW5hYmxlOjE7CQkJLyogUlcgKi8KKwl9IHM7CisJc3RydWN0IHV2MWhfcmhfZ2FtX2dydV9vdmVybGF5X2NvbmZpZ19tbXJfcyB7CisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8wXzI3OjI4OworCQl1bnNpZ25lZCBsb25nCWJhc2U6MTg7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzQ2XzQ3OjI7CisJCXVuc2lnbmVkIGxvbmcJZ3I0OjE7CQkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF80OV81MTozOworCQl1bnNpZ25lZCBsb25nCW5fZ3J1OjQ7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzU2XzYyOjc7CisJCXVuc2lnbmVkIGxvbmcJZW5hYmxlOjE7CQkJLyogUlcgKi8KKwl9IHMxOworCXN0cnVjdCB1djJoX3JoX2dhbV9ncnVfb3ZlcmxheV9jb25maWdfbW1yX3MgeworCQl1bnNpZ25lZCBsb25nCXJzdmRfMF8yNzoyODsKKwkJdW5zaWduZWQgbG9uZwliYXNlOjE4OwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF80Nl81MTo2OworCQl1bnNpZ25lZCBsb25nCW5fZ3J1OjQ7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzU2XzYyOjc7CisJCXVuc2lnbmVkIGxvbmcJZW5hYmxlOjE7CQkJLyogUlcgKi8KKwl9IHMyOwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgVVZIX1JIX0dBTV9NTUlPSF9PVkVSTEFZX0NPTkZJR19NTVIgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBVVkhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUiAweDE2MDAwMzBVTAorI2RlZmluZSBVVkhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUgkJMHgxNjAwMDMwVUwKIAotI2RlZmluZSBVVjFIX1JIX0dBTV9NTUlPSF9PVkVSTEFZX0NPTkZJR19NTVJfQkFTRV9TSEZUIDMwCi0jZGVmaW5lIFVWMUhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUl9CQVNFX01BU0sgMHgwMDAwM2ZmZmMwMDAwMDAwVUwKLSNkZWZpbmUgVVYxSF9SSF9HQU1fTU1JT0hfT1ZFUkxBWV9DT05GSUdfTU1SX01fSU9fU0hGVCA0NgotI2RlZmluZSBVVjFIX1JIX0dBTV9NTUlPSF9PVkVSTEFZX0NPTkZJR19NTVJfTV9JT19NQVNLIDB4MDAwZmMwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUl9OX0lPX1NIRlQgNTIKLSNkZWZpbmUgVVYxSF9SSF9HQU1fTU1JT0hfT1ZFUkxBWV9DT05GSUdfTU1SX05fSU9fTUFTSyAweDAwZjAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX1JIX0dBTV9NTUlPSF9PVkVSTEFZX0NPTkZJR19NTVJfQkFTRV9TSEZUCTMwCisjZGVmaW5lIFVWMUhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUl9NX0lPX1NIRlQJNDYKKyNkZWZpbmUgVVYxSF9SSF9HQU1fTU1JT0hfT1ZFUkxBWV9DT05GSUdfTU1SX05fSU9fU0hGVAk1MgogI2RlZmluZSBVVjFIX1JIX0dBTV9NTUlPSF9PVkVSTEFZX0NPTkZJR19NTVJfRU5BQkxFX1NIRlQgNjMKKyNkZWZpbmUgVVYxSF9SSF9HQU1fTU1JT0hfT1ZFUkxBWV9DT05GSUdfTU1SX0JBU0VfTUFTSwkweDAwMDAzZmZmYzAwMDAwMDBVTAorI2RlZmluZSBVVjFIX1JIX0dBTV9NTUlPSF9PVkVSTEFZX0NPTkZJR19NTVJfTV9JT19NQVNLCTB4MDAwZmMwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMUhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUl9OX0lPX01BU0sJMHgwMGYwMDAwMDAwMDAwMDAwVUwKICNkZWZpbmUgVVYxSF9SSF9HQU1fTU1JT0hfT1ZFUkxBWV9DT05GSUdfTU1SX0VOQUJMRV9NQVNLIDB4ODAwMDAwMDAwMDAwMDAwMFVMCiAKLSNkZWZpbmUgVVYySF9SSF9HQU1fTU1JT0hfT1ZFUkxBWV9DT05GSUdfTU1SX0JBU0VfU0hGVCAyNwotI2RlZmluZSBVVjJIX1JIX0dBTV9NTUlPSF9PVkVSTEFZX0NPTkZJR19NTVJfQkFTRV9NQVNLIDB4MDAwMDNmZmZmODAwMDAwMFVMCi0jZGVmaW5lIFVWMkhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUl9NX0lPX1NIRlQgNDYKLSNkZWZpbmUgVVYySF9SSF9HQU1fTU1JT0hfT1ZFUkxBWV9DT05GSUdfTU1SX01fSU9fTUFTSyAweDAwMGZjMDAwMDAwMDAwMDBVTAotI2RlZmluZSBVVjJIX1JIX0dBTV9NTUlPSF9PVkVSTEFZX0NPTkZJR19NTVJfTl9JT19TSEZUIDUyCi0jZGVmaW5lIFVWMkhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUl9OX0lPX01BU0sgMHgwMGYwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9SSF9HQU1fTU1JT0hfT1ZFUkxBWV9DT05GSUdfTU1SX0JBU0VfU0hGVAkyNworI2RlZmluZSBVVjJIX1JIX0dBTV9NTUlPSF9PVkVSTEFZX0NPTkZJR19NTVJfTV9JT19TSEZUCTQ2CisjZGVmaW5lIFVWMkhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUl9OX0lPX1NIRlQJNTIKICNkZWZpbmUgVVYySF9SSF9HQU1fTU1JT0hfT1ZFUkxBWV9DT05GSUdfTU1SX0VOQUJMRV9TSEZUIDYzCisjZGVmaW5lIFVWMkhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUl9CQVNFX01BU0sJMHgwMDAwM2ZmZmY4MDAwMDAwVUwKKyNkZWZpbmUgVVYySF9SSF9HQU1fTU1JT0hfT1ZFUkxBWV9DT05GSUdfTU1SX01fSU9fTUFTSwkweDAwMGZjMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjJIX1JIX0dBTV9NTUlPSF9PVkVSTEFZX0NPTkZJR19NTVJfTl9JT19NQVNLCTB4MDBmMDAwMDAwMDAwMDAwMFVMCiAjZGVmaW5lIFVWMkhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUl9FTkFCTEVfTUFTSyAweDgwMDAwMDAwMDAwMDAwMDBVTAogCiB1bmlvbiB1dmhfcmhfZ2FtX21taW9oX292ZXJsYXlfY29uZmlnX21tcl91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2MWhfcmhfZ2FtX21taW9oX292ZXJsYXlfY29uZmlnX21tcl9zIHsKLQl1bnNpZ25lZCBsb25nCXJzdmRfMF8yOTogMzA7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJYmFzZSAgIDogMTY7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbV9pbyAgIDogIDY7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbl9pbyAgIDogIDQ7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF81Nl82MjogIDc7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlIDogIDE7ICAvKiBSVyAqLwotICAgIH0gczE7Ci0gICAgc3RydWN0IHV2MmhfcmhfZ2FtX21taW9oX292ZXJsYXlfY29uZmlnX21tcl9zIHsKLQl1bnNpZ25lZCBsb25nCXJzdmRfMF8yNjogMjc7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJYmFzZSAgIDogMTk7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbV9pbyAgIDogIDY7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJbl9pbyAgIDogIDQ7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF81Nl82MjogIDc7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlIDogIDE7ICAvKiBSVyAqLwotICAgIH0gczI7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1djFoX3JoX2dhbV9tbWlvaF9vdmVybGF5X2NvbmZpZ19tbXJfcyB7CisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8wXzI5OjMwOworCQl1bnNpZ25lZCBsb25nCWJhc2U6MTY7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwltX2lvOjY7CQkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJbl9pbzo0OwkJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNTZfNjI6NzsKKwkJdW5zaWduZWQgbG9uZwllbmFibGU6MTsJCQkvKiBSVyAqLworCX0gczE7CisJc3RydWN0IHV2MmhfcmhfZ2FtX21taW9oX292ZXJsYXlfY29uZmlnX21tcl9zIHsKKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzBfMjY6Mjc7CisJCXVuc2lnbmVkIGxvbmcJYmFzZToxOTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCW1faW86NjsJCQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwluX2lvOjQ7CQkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF81Nl82Mjo3OworCQl1bnNpZ25lZCBsb25nCWVuYWJsZToxOwkJCS8qIFJXICovCisJfSBzMjsKIH07CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICBVVkhfUkhfR0FNX01NUl9PVkVSTEFZX0NPTkZJR19NTVIgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgVVZIX1JIX0dBTV9NTVJfT1ZFUkxBWV9DT05GSUdfTU1SIDB4MTYwMDAyOFVMCisjZGVmaW5lIFVWSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUgkJMHgxNjAwMDI4VUwKIAotI2RlZmluZSBVVkhfUkhfR0FNX01NUl9PVkVSTEFZX0NPTkZJR19NTVJfQkFTRV9TSEZUIDI2Ci0jZGVmaW5lIFVWSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9CQVNFX01BU0sgMHgwMDAwM2ZmZmZjMDAwMDAwVUwKKyNkZWZpbmUgVVZIX1JIX0dBTV9NTVJfT1ZFUkxBWV9DT05GSUdfTU1SX0JBU0VfU0hGVAkyNgorI2RlZmluZSBVVkhfUkhfR0FNX01NUl9PVkVSTEFZX0NPTkZJR19NTVJfQkFTRV9NQVNLCTB4MDAwMDNmZmZmYzAwMDAwMFVMCiAKLSNkZWZpbmUgVVYxSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9CQVNFX1NIRlQgMjYKLSNkZWZpbmUgVVYxSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9CQVNFX01BU0sgMHgwMDAwM2ZmZmZjMDAwMDAwVUwKKyNkZWZpbmUgVVYxSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9CQVNFX1NIRlQJMjYKICNkZWZpbmUgVVYxSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9EVUFMX0hVQl9TSEZUIDQ2CisjZGVmaW5lIFVWMUhfUkhfR0FNX01NUl9PVkVSTEFZX0NPTkZJR19NTVJfRU5BQkxFX1NIRlQJNjMKKyNkZWZpbmUgVVYxSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9CQVNFX01BU0sJMHgwMDAwM2ZmZmZjMDAwMDAwVUwKICNkZWZpbmUgVVYxSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9EVUFMX0hVQl9NQVNLIDB4MDAwMDQwMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFVWMUhfUkhfR0FNX01NUl9PVkVSTEFZX0NPTkZJR19NTVJfRU5BQkxFX1NIRlQgNjMKLSNkZWZpbmUgVVYxSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9FTkFCTEVfTUFTSyAweDgwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBVVjFIX1JIX0dBTV9NTVJfT1ZFUkxBWV9DT05GSUdfTU1SX0VOQUJMRV9NQVNLCTB4ODAwMDAwMDAwMDAwMDAwMFVMCiAKLSNkZWZpbmUgVVYySF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9CQVNFX1NIRlQgMjYKLSNkZWZpbmUgVVYySF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9CQVNFX01BU0sgMHgwMDAwM2ZmZmZjMDAwMDAwVUwKLSNkZWZpbmUgVVYySF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9FTkFCTEVfU0hGVCA2MwotI2RlZmluZSBVVjJIX1JIX0dBTV9NTVJfT1ZFUkxBWV9DT05GSUdfTU1SX0VOQUJMRV9NQVNLIDB4ODAwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfUkhfR0FNX01NUl9PVkVSTEFZX0NPTkZJR19NTVJfQkFTRV9TSEZUCTI2CisjZGVmaW5lIFVWMkhfUkhfR0FNX01NUl9PVkVSTEFZX0NPTkZJR19NTVJfRU5BQkxFX1NIRlQJNjMKKyNkZWZpbmUgVVYySF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9CQVNFX01BU0sJMHgwMDAwM2ZmZmZjMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUl9FTkFCTEVfTUFTSwkweDgwMDAwMDAwMDAwMDAwMDBVTAogCiB1bmlvbiB1dmhfcmhfZ2FtX21tcl9vdmVybGF5X2NvbmZpZ19tbXJfdSB7Ci0gICAgdW5zaWduZWQgbG9uZwl2OwotICAgIHN0cnVjdCB1dmhfcmhfZ2FtX21tcl9vdmVybGF5X2NvbmZpZ19tbXJfcyB7Ci0JdW5zaWduZWQgbG9uZwlyc3ZkXzBfMjU6IDI2OyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCWJhc2UgICAgIDogMjA7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF80Nl82MiAgICA6IDE3OwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlICAgOiAgMTsgIC8qIFJXICovCi0gICAgfSBzOwotICAgIHN0cnVjdCB1djFoX3JoX2dhbV9tbXJfb3ZlcmxheV9jb25maWdfbW1yX3MgewotCXVuc2lnbmVkIGxvbmcJcnN2ZF8wXzI1OiAyNjsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwliYXNlICAgICA6IDIwOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCWR1YWxfaHViIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF80N182MjogMTY7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlICAgOiAgMTsgIC8qIFJXICovCi0gICAgfSBzMTsKLSAgICBzdHJ1Y3QgdXYyaF9yaF9nYW1fbW1yX292ZXJsYXlfY29uZmlnX21tcl9zIHsKLQl1bnNpZ25lZCBsb25nCXJzdmRfMF8yNTogMjY7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJYmFzZSAgIDogMjA7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF80Nl82MjogMTc7ICAvKiAgICAqLwotCXVuc2lnbmVkIGxvbmcJZW5hYmxlIDogIDE7ICAvKiBSVyAqLwotICAgIH0gczI7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfcmhfZ2FtX21tcl9vdmVybGF5X2NvbmZpZ19tbXJfcyB7CisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8wXzI1OjI2OworCQl1bnNpZ25lZCBsb25nCWJhc2U6MjA7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzQ2XzYyOjE3OworCQl1bnNpZ25lZCBsb25nCWVuYWJsZToxOwkJCS8qIFJXICovCisJfSBzOworCXN0cnVjdCB1djFoX3JoX2dhbV9tbXJfb3ZlcmxheV9jb25maWdfbW1yX3MgeworCQl1bnNpZ25lZCBsb25nCXJzdmRfMF8yNToyNjsKKwkJdW5zaWduZWQgbG9uZwliYXNlOjIwOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZHVhbF9odWI6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfNDdfNjI6MTY7CisJCXVuc2lnbmVkIGxvbmcJZW5hYmxlOjE7CQkJLyogUlcgKi8KKwl9IHMxOworCXN0cnVjdCB1djJoX3JoX2dhbV9tbXJfb3ZlcmxheV9jb25maWdfbW1yX3MgeworCQl1bnNpZ25lZCBsb25nCXJzdmRfMF8yNToyNjsKKwkJdW5zaWduZWQgbG9uZwliYXNlOjIwOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF80Nl82MjoxNzsKKwkJdW5zaWduZWQgbG9uZwllbmFibGU6MTsJCQkvKiBSVyAqLworCX0gczI7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVWSF9SVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWSF9SVEMgMHgzNDAwMDBVTAorI2RlZmluZSBVVkhfUlRDCQkJCQkJMHgzNDAwMDBVTAogCi0jZGVmaW5lIFVWSF9SVENfUkVBTF9USU1FX0NMT0NLX1NIRlQgMAotI2RlZmluZSBVVkhfUlRDX1JFQUxfVElNRV9DTE9DS19NQVNLIDB4MDBmZmZmZmZmZmZmZmZmZlVMCisjZGVmaW5lIFVWSF9SVENfUkVBTF9USU1FX0NMT0NLX1NIRlQJCQkwCisjZGVmaW5lIFVWSF9SVENfUkVBTF9USU1FX0NMT0NLX01BU0sJCQkweDAwZmZmZmZmZmZmZmZmZmZVTAogCiB1bmlvbiB1dmhfcnRjX3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXZoX3J0Y19zIHsKLQl1bnNpZ25lZCBsb25nCXJlYWxfdGltZV9jbG9jayA6IDU2OyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXJzdmRfNTZfNjMgICAgICA6ICA4OyAgLyogICAgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfcnRjX3MgeworCQl1bnNpZ25lZCBsb25nCXJlYWxfdGltZV9jbG9jazo1NjsJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF81Nl82Mzo4OworCX0gczsKIH07CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgVVZIX1JUQzFfSU5UX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJRyAweDYxNWMwVUwKKyNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJRwkJCQkweDYxNWMwVUwKIAotI2RlZmluZSBVVkhfUlRDMV9JTlRfQ09ORklHX1ZFQ1RPUl9TSEZUIDAKLSNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19WRUNUT1JfTUFTSyAweDAwMDAwMDAwMDAwMDAwZmZVTAotI2RlZmluZSBVVkhfUlRDMV9JTlRfQ09ORklHX0RNX1NIRlQgOAotI2RlZmluZSBVVkhfUlRDMV9JTlRfQ09ORklHX0RNX01BU0sgMHgwMDAwMDAwMDAwMDAwNzAwVUwKLSNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19ERVNUTU9ERV9TSEZUIDExCi0jZGVmaW5lIFVWSF9SVEMxX0lOVF9DT05GSUdfREVTVE1PREVfTUFTSyAweDAwMDAwMDAwMDAwMDA4MDBVTAotI2RlZmluZSBVVkhfUlRDMV9JTlRfQ09ORklHX1NUQVRVU19TSEZUIDEyCi0jZGVmaW5lIFVWSF9SVEMxX0lOVF9DT05GSUdfU1RBVFVTX01BU0sgMHgwMDAwMDAwMDAwMDAxMDAwVUwKLSNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19QX1NIRlQgMTMKLSNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19QX01BU0sgMHgwMDAwMDAwMDAwMDAyMDAwVUwKLSNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19UX1NIRlQgMTUKLSNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19UX01BU0sgMHgwMDAwMDAwMDAwMDA4MDAwVUwKLSNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19NX1NIRlQgMTYKLSNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19NX01BU0sgMHgwMDAwMDAwMDAwMDEwMDAwVUwKLSNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19BUElDX0lEX1NIRlQgMzIKLSNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19BUElDX0lEX01BU0sgMHhmZmZmZmZmZjAwMDAwMDAwVUwKKyNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19WRUNUT1JfU0hGVAkJCTAKKyNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19ETV9TSEZUCQkJOAorI2RlZmluZSBVVkhfUlRDMV9JTlRfQ09ORklHX0RFU1RNT0RFX1NIRlQJCTExCisjZGVmaW5lIFVWSF9SVEMxX0lOVF9DT05GSUdfU1RBVFVTX1NIRlQJCQkxMgorI2RlZmluZSBVVkhfUlRDMV9JTlRfQ09ORklHX1BfU0hGVAkJCTEzCisjZGVmaW5lIFVWSF9SVEMxX0lOVF9DT05GSUdfVF9TSEZUCQkJMTUKKyNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19NX1NIRlQJCQkxNgorI2RlZmluZSBVVkhfUlRDMV9JTlRfQ09ORklHX0FQSUNfSURfU0hGVAkJMzIKKyNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19WRUNUT1JfTUFTSwkJCTB4MDAwMDAwMDAwMDAwMDBmZlVMCisjZGVmaW5lIFVWSF9SVEMxX0lOVF9DT05GSUdfRE1fTUFTSwkJCTB4MDAwMDAwMDAwMDAwMDcwMFVMCisjZGVmaW5lIFVWSF9SVEMxX0lOVF9DT05GSUdfREVTVE1PREVfTUFTSwkJMHgwMDAwMDAwMDAwMDAwODAwVUwKKyNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19TVEFUVVNfTUFTSwkJCTB4MDAwMDAwMDAwMDAwMTAwMFVMCisjZGVmaW5lIFVWSF9SVEMxX0lOVF9DT05GSUdfUF9NQVNLCQkJMHgwMDAwMDAwMDAwMDAyMDAwVUwKKyNkZWZpbmUgVVZIX1JUQzFfSU5UX0NPTkZJR19UX01BU0sJCQkweDAwMDAwMDAwMDAwMDgwMDBVTAorI2RlZmluZSBVVkhfUlRDMV9JTlRfQ09ORklHX01fTUFTSwkJCTB4MDAwMDAwMDAwMDAxMDAwMFVMCisjZGVmaW5lIFVWSF9SVEMxX0lOVF9DT05GSUdfQVBJQ19JRF9NQVNLCQkweGZmZmZmZmZmMDAwMDAwMDBVTAogCiB1bmlvbiB1dmhfcnRjMV9pbnRfY29uZmlnX3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXZoX3J0YzFfaW50X2NvbmZpZ19zIHsKLQl1bnNpZ25lZCBsb25nCXZlY3Rvcl8gIDogIDg7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJZG0gICAgICAgOiAgMzsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlkZXN0bW9kZSA6ICAxOyAgLyogUlcgKi8KLQl1bnNpZ25lZCBsb25nCXN0YXR1cyAgIDogIDE7ICAvKiBSTyAqLwotCXVuc2lnbmVkIGxvbmcJcCAgICAgICAgOiAgMTsgIC8qIFJPICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzE0ICA6ICAxOyAgLyogICAgKi8KLQl1bnNpZ25lZCBsb25nCXQgICAgICAgIDogIDE7ICAvKiBSTyAqLwotCXVuc2lnbmVkIGxvbmcJbSAgICAgICAgOiAgMTsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzE3XzMxOiAxNTsgIC8qICAgICovCi0JdW5zaWduZWQgbG9uZwlhcGljX2lkICA6IDMyOyAgLyogUlcgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfcnRjMV9pbnRfY29uZmlnX3MgeworCQl1bnNpZ25lZCBsb25nCXZlY3Rvcl86ODsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCWRtOjM7CQkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJZGVzdG1vZGU6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXN0YXR1czoxOwkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJcDoxOwkJCQkvKiBSTyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTQ6MTsKKwkJdW5zaWduZWQgbG9uZwl0OjE7CQkJCS8qIFJPICovCisJCXVuc2lnbmVkIGxvbmcJbToxOwkJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJzdmRfMTdfMzE6MTU7CisJCXVuc2lnbmVkIGxvbmcJYXBpY19pZDozMjsJCQkvKiBSVyAqLworCX0gczsKIH07CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVWSF9TQ1JBVENINSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgVVZIX1NDUkFUQ0g1IDB4MmQwMjAwVUwKLSNkZWZpbmUgVVZIX1NDUkFUQ0g1XzMyIDB4Nzc4CisjZGVmaW5lIFVWSF9TQ1JBVENINQkJCQkJMHgyZDAyMDBVTAorI2RlZmluZSBVVkhfU0NSQVRDSDVfMzIJCQkJCTB4Nzc4CiAKLSNkZWZpbmUgVVZIX1NDUkFUQ0g1X1NDUkFUQ0g1X1NIRlQgMAotI2RlZmluZSBVVkhfU0NSQVRDSDVfU0NSQVRDSDVfTUFTSyAweGZmZmZmZmZmZmZmZmZmZmZVTAorI2RlZmluZSBVVkhfU0NSQVRDSDVfU0NSQVRDSDVfU0hGVAkJCTAKKyNkZWZpbmUgVVZIX1NDUkFUQ0g1X1NDUkFUQ0g1X01BU0sJCQkweGZmZmZmZmZmZmZmZmZmZmZVTAogCiB1bmlvbiB1dmhfc2NyYXRjaDVfdSB7Ci0gICAgdW5zaWduZWQgbG9uZwl2OwotICAgIHN0cnVjdCB1dmhfc2NyYXRjaDVfcyB7Ci0JdW5zaWduZWQgbG9uZwlzY3JhdGNoNSA6IDY0OyAgLyogUlcsIFcxQ1MgKi8KLSAgICB9IHM7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1dmhfc2NyYXRjaDVfcyB7CisJCXVuc2lnbmVkIGxvbmcJc2NyYXRjaDU6NjQ7CQkJLyogUlcsIFcxQ1MgKi8KKwl9IHM7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVWMkhfRVZFTlRfT0NDVVJSRUQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyIDB4NzAxMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl8zMiAweGI2OAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMgkJCQkweDcwMTAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfMzIJCQkJMHhiNjgKIAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMF9TSEZUIDAKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzBfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDFVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMV9TSEZUIDEKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzFfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDJVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMl9TSEZUIDIKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzJfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDRVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfM19TSEZUIDMKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzNfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDhVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfNF9TSEZUIDQKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzRfTUFTSyAweDAwMDAwMDAwMDAwMDAwMTBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfNV9TSEZUIDUKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzVfTUFTSyAweDAwMDAwMDAwMDAwMDAwMjBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfNl9TSEZUIDYKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzZfTUFTSyAweDAwMDAwMDAwMDAwMDAwNDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfN19TSEZUIDcKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzdfTUFTSyAweDAwMDAwMDAwMDAwMDAwODBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfOF9TSEZUIDgKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzhfTUFTSyAweDAwMDAwMDAwMDAwMDAxMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfOV9TSEZUIDkKLSNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzlfTUFTSyAweDAwMDAwMDAwMDAwMDAyMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTBfU0hGVCAxMAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTBfTUFTSyAweDAwMDAwMDAwMDAwMDA0MDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTFfU0hGVCAxMQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTFfTUFTSyAweDAwMDAwMDAwMDAwMDA4MDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTJfU0hGVCAxMgotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTJfTUFTSyAweDAwMDAwMDAwMDAwMDEwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTNfU0hGVCAxMwotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTNfTUFTSyAweDAwMDAwMDAwMDAwMDIwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTRfU0hGVCAxNAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTRfTUFTSyAweDAwMDAwMDAwMDAwMDQwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTVfU0hGVCAxNQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTVfTUFTSyAweDAwMDAwMDAwMDAwMDgwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTZfU0hGVCAxNgotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTZfTUFTSyAweDAwMDAwMDAwMDAwMTAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTdfU0hGVCAxNwotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTdfTUFTSyAweDAwMDAwMDAwMDAwMjAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMThfU0hGVCAxOAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMThfTUFTSyAweDAwMDAwMDAwMDAwNDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTlfU0hGVCAxOQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTlfTUFTSyAweDAwMDAwMDAwMDAwODAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjBfU0hGVCAyMAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjBfTUFTSyAweDAwMDAwMDAwMDAxMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjFfU0hGVCAyMQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjFfTUFTSyAweDAwMDAwMDAwMDAyMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjJfU0hGVCAyMgotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjJfTUFTSyAweDAwMDAwMDAwMDA0MDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjNfU0hGVCAyMwotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjNfTUFTSyAweDAwMDAwMDAwMDA4MDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjRfU0hGVCAyNAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjRfTUFTSyAweDAwMDAwMDAwMDEwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjVfU0hGVCAyNQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjVfTUFTSyAweDAwMDAwMDAwMDIwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjZfU0hGVCAyNgotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjZfTUFTSyAweDAwMDAwMDAwMDQwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjdfU0hGVCAyNwotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjdfTUFTSyAweDAwMDAwMDAwMDgwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjhfU0hGVCAyOAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjhfTUFTSyAweDAwMDAwMDAwMTAwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjlfU0hGVCAyOQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjlfTUFTSyAweDAwMDAwMDAwMjAwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMzBfU0hGVCAzMAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMzBfTUFTSyAweDAwMDAwMDAwNDAwMDAwMDBVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMzFfU0hGVCAzMQotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMzFfTUFTSyAweDAwMDAwMDAwODAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMF9TSEZUCQkJMAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMV9TSEZUCQkJMQorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMl9TSEZUCQkJMgorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfM19TSEZUCQkJMworI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfNF9TSEZUCQkJNAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfNV9TSEZUCQkJNQorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfNl9TSEZUCQkJNgorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfN19TSEZUCQkJNworI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfOF9TSEZUCQkJOAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfOV9TSEZUCQkJOQorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTBfU0hGVAkJMTAKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzExX1NIRlQJCTExCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18xMl9TSEZUCQkxMgorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTNfU0hGVAkJMTMKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzE0X1NIRlQJCTE0CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18xNV9TSEZUCQkxNQorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTZfU0hGVAkJMTYKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzE3X1NIRlQJCTE3CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18xOF9TSEZUCQkxOAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTlfU0hGVAkJMTkKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzIwX1NIRlQJCTIwCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18yMV9TSEZUCQkyMQorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjJfU0hGVAkJMjIKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzIzX1NIRlQJCTIzCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18yNF9TSEZUCQkyNAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjVfU0hGVAkJMjUKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzI2X1NIRlQJCTI2CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18yN19TSEZUCQkyNworI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjhfU0hGVAkJMjgKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzI5X1NIRlQJCTI5CisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18zMF9TSEZUCQkzMAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMzFfU0hGVAkJMzEKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzBfTUFTSwkJCTB4MDAwMDAwMDAwMDAwMDAwMVVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18xX01BU0sJCQkweDAwMDAwMDAwMDAwMDAwMDJVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMl9NQVNLCQkJMHgwMDAwMDAwMDAwMDAwMDA0VUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzNfTUFTSwkJCTB4MDAwMDAwMDAwMDAwMDAwOFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ180X01BU0sJCQkweDAwMDAwMDAwMDAwMDAwMTBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfNV9NQVNLCQkJMHgwMDAwMDAwMDAwMDAwMDIwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzZfTUFTSwkJCTB4MDAwMDAwMDAwMDAwMDA0MFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ183X01BU0sJCQkweDAwMDAwMDAwMDAwMDAwODBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfOF9NQVNLCQkJMHgwMDAwMDAwMDAwMDAwMTAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzlfTUFTSwkJCTB4MDAwMDAwMDAwMDAwMDIwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18xMF9NQVNLCQkweDAwMDAwMDAwMDAwMDA0MDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTFfTUFTSwkJMHgwMDAwMDAwMDAwMDAwODAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzEyX01BU0sJCTB4MDAwMDAwMDAwMDAwMTAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18xM19NQVNLCQkweDAwMDAwMDAwMDAwMDIwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTRfTUFTSwkJMHgwMDAwMDAwMDAwMDA0MDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzE1X01BU0sJCTB4MDAwMDAwMDAwMDAwODAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18xNl9NQVNLCQkweDAwMDAwMDAwMDAwMTAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMTdfTUFTSwkJMHgwMDAwMDAwMDAwMDIwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzE4X01BU0sJCTB4MDAwMDAwMDAwMDA0MDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18xOV9NQVNLCQkweDAwMDAwMDAwMDAwODAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjBfTUFTSwkJMHgwMDAwMDAwMDAwMTAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzIxX01BU0sJCTB4MDAwMDAwMDAwMDIwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18yMl9NQVNLCQkweDAwMDAwMDAwMDA0MDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjNfTUFTSwkJMHgwMDAwMDAwMDAwODAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzI0X01BU0sJCTB4MDAwMDAwMDAwMTAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18yNV9NQVNLCQkweDAwMDAwMDAwMDIwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjZfTUFTSwkJMHgwMDAwMDAwMDA0MDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzI3X01BU0sJCTB4MDAwMDAwMDAwODAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18yOF9NQVNLCQkweDAwMDAwMDAwMTAwMDAwMDBVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9SVENfMjlfTUFTSwkJMHgwMDAwMDAwMDIwMDAwMDAwVUwKKyNkZWZpbmUgVVYySF9FVkVOVF9PQ0NVUlJFRDJfUlRDXzMwX01BU0sJCTB4MDAwMDAwMDA0MDAwMDAwMFVMCisjZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX1JUQ18zMV9NQVNLCQkweDAwMDAwMDAwODAwMDAwMDBVTAogCiB1bmlvbiB1djJoX2V2ZW50X29jY3VycmVkMl91IHsKLSAgICB1bnNpZ25lZCBsb25nCXY7Ci0gICAgc3RydWN0IHV2MmhfZXZlbnRfb2NjdXJyZWQyX3MgewotCXVuc2lnbmVkIGxvbmcJcnRjXzAgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzEgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzIgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzMgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzQgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzUgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzYgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzcgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzggIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzkgIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzEwIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzExIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzEyIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzEzIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzE0IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzE1IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzE2IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzE3IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzE4IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzE5IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzIwIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzIxIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzIyIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzIzIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzI0IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzI1IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzI2IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzI3IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzI4IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzI5IDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzMwIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnRjXzMxIDogIDE7ICAvKiBSVyAqLwotCXVuc2lnbmVkIGxvbmcJcnN2ZF8zMl82MzogMzI7ICAvKiAgICAqLwotICAgIH0gczE7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1djJoX2V2ZW50X29jY3VycmVkMl9zIHsKKwkJdW5zaWduZWQgbG9uZwlydGNfMDoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnRjXzE6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJ0Y18yOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlydGNfMzoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnRjXzQ6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJ0Y181OjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlydGNfNjoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnRjXzc6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJ0Y184OjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlydGNfOToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnRjXzEwOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlydGNfMTE6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJ0Y18xMjoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnRjXzEzOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlydGNfMTQ6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJ0Y18xNToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnRjXzE2OjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlydGNfMTc6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJ0Y18xODoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnRjXzE5OjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlydGNfMjA6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJ0Y18yMToxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnRjXzIyOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlydGNfMjM6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJ0Y18yNDoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnRjXzI1OjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlydGNfMjY6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJ0Y18yNzoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnRjXzI4OjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlydGNfMjk6MTsJCQkvKiBSVyAqLworCQl1bnNpZ25lZCBsb25nCXJ0Y18zMDoxOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnRjXzMxOjE7CQkJLyogUlcgKi8KKwkJdW5zaWduZWQgbG9uZwlyc3ZkXzMyXzYzOjMyOworCX0gczE7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgIFVWMkhfRVZFTlRfT0NDVVJSRUQyX0FMSUFTICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWMkhfRVZFTlRfT0NDVVJSRUQyX0FMSUFTIDB4NzAxMDhVTAotI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9BTElBU18zMiAweGI3MAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9BTElBUwkJCTB4NzAxMDhVTAorI2RlZmluZSBVVjJIX0VWRU5UX09DQ1VSUkVEMl9BTElBU18zMgkJCTB4YjcwCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICBVVjJIX0xCX0JBVV9TQl9BQ1RJVkFUSU9OX1NUQVRVU18yICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgVVYySF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMiAweDMyMDEzMFVMCi0jZGVmaW5lIFVWMkhfTEJfQkFVX1NCX0FDVElWQVRJT05fU1RBVFVTXzJfMzIgMHg5ZjAKKyNkZWZpbmUgVVYySF9MQl9CQVVfU0JfQUNUSVZBVElPTl9TVEFUVVNfMgkJMHgzMjAxMzBVTAorI2RlZmluZSBVVjJIX0xCX0JBVV9TQl9BQ1RJVkFUSU9OX1NUQVRVU18yXzMyCQkweDlmMAogCiAjZGVmaW5lIFVWMkhfTEJfQkFVX1NCX0FDVElWQVRJT05fU1RBVFVTXzJfQVVYX0VSUk9SX1NIRlQgMAogI2RlZmluZSBVVjJIX0xCX0JBVV9TQl9BQ1RJVkFUSU9OX1NUQVRVU18yX0FVWF9FUlJPUl9NQVNLIDB4ZmZmZmZmZmZmZmZmZmZmZlVMCiAKIHVuaW9uIHV2MmhfbGJfYmF1X3NiX2FjdGl2YXRpb25fc3RhdHVzXzJfdSB7Ci0gICAgdW5zaWduZWQgbG9uZwl2OwotICAgIHN0cnVjdCB1djJoX2xiX2JhdV9zYl9hY3RpdmF0aW9uX3N0YXR1c18yX3MgewotCXVuc2lnbmVkIGxvbmcJYXV4X2Vycm9yIDogNjQ7ICAvKiBSVyAqLwotICAgIH0gczE7CisJdW5zaWduZWQgbG9uZwl2OworCXN0cnVjdCB1djJoX2xiX2JhdV9zYl9hY3RpdmF0aW9uX3N0YXR1c18yX3MgeworCQl1bnNpZ25lZCBsb25nCWF1eF9lcnJvcjo2NDsJCQkvKiBSVyAqLworCX0gczE7CiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICBVVjFIX0xCX1RBUkdFVF9QSFlTSUNBTF9BUElDX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFVWMUhfTEJfVEFSR0VUX1BIWVNJQ0FMX0FQSUNfSURfTUFTSyAweDMyMDEzMFVMCi0jZGVmaW5lIFVWMUhfTEJfVEFSR0VUX1BIWVNJQ0FMX0FQSUNfSURfTUFTS18zMiAweDlmMAorI2RlZmluZSBVVjFIX0xCX1RBUkdFVF9QSFlTSUNBTF9BUElDX0lEX01BU0sJCTB4MzIwMTMwVUwKKyNkZWZpbmUgVVYxSF9MQl9UQVJHRVRfUEhZU0lDQUxfQVBJQ19JRF9NQVNLXzMyCQkweDlmMAogCiAjZGVmaW5lIFVWMUhfTEJfVEFSR0VUX1BIWVNJQ0FMX0FQSUNfSURfTUFTS19CSVRfRU5BQkxFU19TSEZUIDAKICNkZWZpbmUgVVYxSF9MQl9UQVJHRVRfUEhZU0lDQUxfQVBJQ19JRF9NQVNLX0JJVF9FTkFCTEVTX01BU0sgMHgwMDAwMDAwMGZmZmZmZmZmVUwKIAogdW5pb24gdXYxaF9sYl90YXJnZXRfcGh5c2ljYWxfYXBpY19pZF9tYXNrX3UgewotICAgIHVuc2lnbmVkIGxvbmcJdjsKLSAgICBzdHJ1Y3QgdXYxaF9sYl90YXJnZXRfcGh5c2ljYWxfYXBpY19pZF9tYXNrX3MgewotCXVuc2lnbmVkIGxvbmcJYml0X2VuYWJsZXMgOiAzMjsgIC8qIFJXICovCi0JdW5zaWduZWQgbG9uZwlyc3ZkXzMyXzYzICA6IDMyOyAgLyogICAgKi8KLSAgICB9IHMxOworCXVuc2lnbmVkIGxvbmcJdjsKKwlzdHJ1Y3QgdXYxaF9sYl90YXJnZXRfcGh5c2ljYWxfYXBpY19pZF9tYXNrX3MgeworCQl1bnNpZ25lZCBsb25nCWJpdF9lbmFibGVzOjMyOwkJCS8qIFJXICovCisJCXVuc2lnbmVkIGxvbmcJcnN2ZF8zMl82MzozMjsKKwl9IHMxOwogfTsKIAogCi0jZW5kaWYgLyogX19BU01fVVZfTU1SU19YODZfSF9fICovCisjZW5kaWYgLyogX0FTTV9YODZfVVZfVVZfTU1SU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92Z3RvZC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmd0b2QuaAppbmRleCA2NDZiNGMxLi44MTUyODViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92Z3RvZC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZndG9kLmgKQEAgLTExLDEwICsxMSw5IEBACiAJdGltZV90CQl3YWxsX3RpbWVfc2VjOwogCXUzMgkJd2FsbF90aW1lX25zZWM7CiAKLQlpbnQJCXN5c2N0bF9lbmFibGVkOwogCXN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CiAJc3RydWN0IHsgLyogZXh0cmFjdCBvZiBhIGNsb2Nrc291cmNlIHN0cnVjdCAqLwotCQljeWNsZV90ICgqdnJlYWQpKHZvaWQpOworCQlpbnQgdmNsb2NrX21vZGU7CiAJCWN5Y2xlX3QJY3ljbGVfbGFzdDsKIAkJY3ljbGVfdAltYXNrOwogCQl1MzIJbXVsdDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdm14LmgKaW5kZXggODQ0NzFiOC4uMmNhZjI5MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdm14LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdm14LmgKQEAgLTEzMiw2ICsxMzIsOCBAQAogCUdVRVNUX0lBMzJfUEFUX0hJR0gJCT0gMHgwMDAwMjgwNSwKIAlHVUVTVF9JQTMyX0VGRVIJCQk9IDB4MDAwMDI4MDYsCiAJR1VFU1RfSUEzMl9FRkVSX0hJR0gJCT0gMHgwMDAwMjgwNywKKwlHVUVTVF9JQTMyX1BFUkZfR0xPQkFMX0NUUkwJPSAweDAwMDAyODA4LAorCUdVRVNUX0lBMzJfUEVSRl9HTE9CQUxfQ1RSTF9ISUdIPSAweDAwMDAyODA5LAogCUdVRVNUX1BEUFRSMCAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAyODBhLAogCUdVRVNUX1BEUFRSMF9ISUdIICAgICAgICAgICAgICAgPSAweDAwMDAyODBiLAogCUdVRVNUX1BEUFRSMSAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAyODBjLApAQCAtMTQ0LDYgKzE0Niw4IEBACiAJSE9TVF9JQTMyX1BBVF9ISUdICQk9IDB4MDAwMDJjMDEsCiAJSE9TVF9JQTMyX0VGRVIJCQk9IDB4MDAwMDJjMDIsCiAJSE9TVF9JQTMyX0VGRVJfSElHSAkJPSAweDAwMDAyYzAzLAorCUhPU1RfSUEzMl9QRVJGX0dMT0JBTF9DVFJMCT0gMHgwMDAwMmMwNCwKKwlIT1NUX0lBMzJfUEVSRl9HTE9CQUxfQ1RSTF9ISUdICT0gMHgwMDAwMmMwNSwKIAlQSU5fQkFTRURfVk1fRVhFQ19DT05UUk9MICAgICAgID0gMHgwMDAwNDAwMCwKIAlDUFVfQkFTRURfVk1fRVhFQ19DT05UUk9MICAgICAgID0gMHgwMDAwNDAwMiwKIAlFWENFUFRJT05fQklUTUFQICAgICAgICAgICAgICAgID0gMHgwMDAwNDAwNCwKQEAgLTQyNiw0ICs0MzAsNDMgQEAKIAl1NjQgdmFsdWU7CiB9IF9fYWxpZ25lZCgxNik7CiAKKy8qCisgKiBFeGl0IFF1YWxpZmljYXRpb25zIGZvciBlbnRyeSBmYWlsdXJlIGR1cmluZyBvciBhZnRlciBsb2FkaW5nIGd1ZXN0IHN0YXRlCisgKi8KKyNkZWZpbmUgRU5UUllfRkFJTF9ERUZBVUxUCQkwCisjZGVmaW5lIEVOVFJZX0ZBSUxfUERQVEUJCTIKKyNkZWZpbmUgRU5UUllfRkFJTF9OTUkJCQkzCisjZGVmaW5lIEVOVFJZX0ZBSUxfVk1DU19MSU5LX1BUUgk0CisKKy8qCisgKiBWTS1pbnN0cnVjdGlvbiBlcnJvciBudW1iZXJzCisgKi8KK2VudW0gdm1faW5zdHJ1Y3Rpb25fZXJyb3JfbnVtYmVyIHsKKwlWTVhFUlJfVk1DQUxMX0lOX1ZNWF9ST09UX09QRVJBVElPTiA9IDEsCisJVk1YRVJSX1ZNQ0xFQVJfSU5WQUxJRF9BRERSRVNTID0gMiwKKwlWTVhFUlJfVk1DTEVBUl9WTVhPTl9QT0lOVEVSID0gMywKKwlWTVhFUlJfVk1MQVVOQ0hfTk9OQ0xFQVJfVk1DUyA9IDQsCisJVk1YRVJSX1ZNUkVTVU1FX05PTkxBVU5DSEVEX1ZNQ1MgPSA1LAorCVZNWEVSUl9WTVJFU1VNRV9BRlRFUl9WTVhPRkYgPSA2LAorCVZNWEVSUl9FTlRSWV9JTlZBTElEX0NPTlRST0xfRklFTEQgPSA3LAorCVZNWEVSUl9FTlRSWV9JTlZBTElEX0hPU1RfU1RBVEVfRklFTEQgPSA4LAorCVZNWEVSUl9WTVBUUkxEX0lOVkFMSURfQUREUkVTUyA9IDksCisJVk1YRVJSX1ZNUFRSTERfVk1YT05fUE9JTlRFUiA9IDEwLAorCVZNWEVSUl9WTVBUUkxEX0lOQ09SUkVDVF9WTUNTX1JFVklTSU9OX0lEID0gMTEsCisJVk1YRVJSX1VOU1VQUE9SVEVEX1ZNQ1NfQ09NUE9ORU5UID0gMTIsCisJVk1YRVJSX1ZNV1JJVEVfUkVBRF9PTkxZX1ZNQ1NfQ09NUE9ORU5UID0gMTMsCisJVk1YRVJSX1ZNWE9OX0lOX1ZNWF9ST09UX09QRVJBVElPTiA9IDE1LAorCVZNWEVSUl9FTlRSWV9JTlZBTElEX0VYRUNVVElWRV9WTUNTX1BPSU5URVIgPSAxNiwKKwlWTVhFUlJfRU5UUllfTk9OTEFVTkNIRURfRVhFQ1VUSVZFX1ZNQ1MgPSAxNywKKwlWTVhFUlJfRU5UUllfRVhFQ1VUSVZFX1ZNQ1NfUE9JTlRFUl9OT1RfVk1YT05fUE9JTlRFUiA9IDE4LAorCVZNWEVSUl9WTUNBTExfTk9OQ0xFQVJfVk1DUyA9IDE5LAorCVZNWEVSUl9WTUNBTExfSU5WQUxJRF9WTV9FWElUX0NPTlRST0xfRklFTERTID0gMjAsCisJVk1YRVJSX1ZNQ0FMTF9JTkNPUlJFQ1RfTVNFR19SRVZJU0lPTl9JRCA9IDIyLAorCVZNWEVSUl9WTVhPRkZfVU5ERVJfRFVBTF9NT05JVE9SX1RSRUFUTUVOVF9PRl9TTUlTX0FORF9TTU0gPSAyMywKKwlWTVhFUlJfVk1DQUxMX0lOVkFMSURfU01NX01PTklUT1JfRkVBVFVSRVMgPSAyNCwKKwlWTVhFUlJfRU5UUllfSU5WQUxJRF9WTV9FWEVDVVRJT05fQ09OVFJPTF9GSUVMRFNfSU5fRVhFQ1VUSVZFX1ZNQ1MgPSAyNSwKKwlWTVhFUlJfRU5UUllfRVZFTlRTX0JMT0NLRURfQllfTU9WX1NTID0gMjYsCisJVk1YRVJSX0lOVkFMSURfT1BFUkFORF9UT19JTlZFUFRfSU5WVlBJRCA9IDI4LAorfTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92c3lzY2FsbC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdnN5c2NhbGwuaAppbmRleCBkNTU1OTczLi42MDEwNzA3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92c3lzY2FsbC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZzeXNjYWxsLmgKQEAgLTE2LDEwICsxNiw2IEBACiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KIAotLyogRGVmaW5pdGlvbnMgZm9yIENPTkZJR19HRU5FUklDX1RJTUUgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgX192c3lzY2FsbF9mbiBcCi0JX19hdHRyaWJ1dGVfXyAoKHVudXNlZCwgX19zZWN0aW9uX18oIi52c3lzY2FsbF9mbiIpKSkgbm90cmFjZQotCiAjZGVmaW5lIFZHRVRDUFVfUkRUU0NQCTEKICNkZWZpbmUgVkdFVENQVV9MU0wJMgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92dmFyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92dmFyLmgKaW5kZXggMzQxYjM1NS4uZGU2NTZhYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdnZhci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Z2YXIuaApAQCAtMTAsMTUgKzEwLDE0IEBACiAgKiBJbiBub3JtYWwga2VybmVsIGNvZGUsIHRoZXkgYXJlIHVzZWQgbGlrZSBhbnkgb3RoZXIgdmFyaWFibGUuCiAgKiBJbiB1c2VyIGNvZGUsIHRoZXkgYXJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIFZWQVIgbWFjcm8uCiAgKgotICogRWFjaCBvZiB0aGVzZSB2YXJpYWJsZXMgbGl2ZXMgaW4gdGhlIHZzeXNjYWxsIHBhZ2UsIGFuZCBlYWNoCi0gKiBvbmUgbmVlZHMgYSB1bmlxdWUgb2Zmc2V0IHdpdGhpbiB0aGUgbGl0dGxlIHBpZWNlIG9mIHRoZSBwYWdlCi0gKiByZXNlcnZlZCBmb3IgdnZhcnMuICBTcGVjaWZ5IHRoYXQgb2Zmc2V0IGluIERFQ0xBUkVfVlZBUi4KLSAqIChUaGVyZSBhcmUgODk2IGJ5dGVzIGF2YWlsYWJsZS4gIElmIHlvdSBtZXNzIHVwLCB0aGUgbGlua2VyIHdpbGwKLSAqIGNhdGNoIGl0LikKKyAqIFRoZXNlIHZhcmlhYmxlcyBsaXZlIGluIGEgcGFnZSBvZiBrZXJuZWwgZGF0YSB0aGF0IGhhcyBhbiBleHRyYSBSTworICogbWFwcGluZyBmb3IgdXNlcnNwYWNlLiAgRWFjaCB2YXJpYWJsZSBuZWVkcyBhIHVuaXF1ZSBvZmZzZXQgd2l0aGluCisgKiB0aGF0IHBhZ2U7IHNwZWNpZnkgdGhhdCBvZmZzZXQgd2l0aCB0aGUgREVDTEFSRV9WVkFSIG1hY3JvLiAgKElmCisgKiB5b3UgbWVzcyB1cCwgdGhlIGxpbmtlciB3aWxsIGNhdGNoIGl0LikKICAqLwogCi0vKiBPZmZzZXQgb2YgdmFycyB3aXRoaW4gdnN5c2NhbGwgcGFnZSAqLwotI2RlZmluZSBWU1lTQ0FMTF9WQVJTX09GRlNFVCAoMzA3MiArIDEyOCkKKy8qIEJhc2UgYWRkcmVzcyBvZiB2dmFycy4gIFRoaXMgaXMgbm90IEFCSS4gKi8KKyNkZWZpbmUgVlZBUl9BRERSRVNTICgtMTAqMTAyNCoxMDI0IC0gNDA5NikKIAogI2lmIGRlZmluZWQoX19WVkFSX0tFUk5FTF9MRFMpCiAKQEAgLTI2LDE3ICsyNSwxNyBAQAogICogcmlnaHQgcGxhY2UuCiAgKi8KICNkZWZpbmUgREVDTEFSRV9WVkFSKG9mZnNldCwgdHlwZSwgbmFtZSkgXAotCUVNSVRfVlZBUihuYW1lLCBWU1lTQ0FMTF9WQVJTX09GRlNFVCArIG9mZnNldCkKKwlFTUlUX1ZWQVIobmFtZSwgb2Zmc2V0KQogCiAjZWxzZQogCiAjZGVmaW5lIERFQ0xBUkVfVlZBUihvZmZzZXQsIHR5cGUsIG5hbWUpCQkJCVwKIAlzdGF0aWMgdHlwZSBjb25zdCAqIGNvbnN0IHZ2YXJhZGRyXyAjIyBuYW1lID0JCQlcCi0JCSh2b2lkICopKFZTWVNDQUxMX1NUQVJUICsgVlNZU0NBTExfVkFSU19PRkZTRVQgKyAob2Zmc2V0KSk7CisJCSh2b2lkICopKFZWQVJfQUREUkVTUyArIChvZmZzZXQpKTsKIAogI2RlZmluZSBERUZJTkVfVlZBUih0eXBlLCBuYW1lKQkJCQkJCVwKLQl0eXBlIF9fdnZhcl8gIyMgbmFtZQkJCQkJCVwKLQlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIudnN5c2NhbGxfdmFyXyIgI25hbWUpLCBhbGlnbmVkKDE2KSkpCisJdHlwZSBuYW1lCQkJCQkJCVwKKwlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIudnZhcl8iICNuYW1lKSwgYWxpZ25lZCgxNikpKQogCiAjZGVmaW5lIFZWQVIobmFtZSkgKCp2dmFyYWRkcl8gIyMgbmFtZSkKIApAQCAtNDUsOCArNDQsNyBAQAogLyogREVDTEFSRV9WVkFSKG9mZnNldCwgdHlwZSwgbmFtZSkgKi8KIAogREVDTEFSRV9WVkFSKDAsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcsIGppZmZpZXMpCi1ERUNMQVJFX1ZWQVIoOCwgaW50LCB2Z2V0Y3B1X21vZGUpCitERUNMQVJFX1ZWQVIoMTYsIGludCwgdmdldGNwdV9tb2RlKQogREVDTEFSRV9WVkFSKDEyOCwgc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YSwgdnN5c2NhbGxfZ3RvZF9kYXRhKQogCiAjdW5kZWYgREVDTEFSRV9WVkFSCi0jdW5kZWYgVlNZU0NBTExfVkFSU19PRkZTRVQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9oeXBlcmNhbGwuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9oeXBlcmNhbGwuaAppbmRleCBkMjQwZWE5Li40MTc3NzdkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJjYWxsLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVyY2FsbC5oCkBAIC0zOSw2ICszOSw4IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy94ZW4uaD4KKwogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIApAQCAtNDU5LDYgKzQ2MSw4IEBACiB7CiAJbWNsLT5vcCA9IF9fSFlQRVJWSVNPUl9mcHVfdGFza3N3aXRjaDsKIAltY2wtPmFyZ3NbMF0gPSBzZXQ7CisKKwl0cmFjZV94ZW5fbWNfZW50cnkobWNsLCAxKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC00NzUsNiArNDc5LDggQEAKIAkJbWNsLT5hcmdzWzJdID0gbmV3X3ZhbC5wdGUgPj4gMzI7CiAJCW1jbC0+YXJnc1szXSA9IGZsYWdzOwogCX0KKworCXRyYWNlX3hlbl9tY19lbnRyeShtY2wsIHNpemVvZihuZXdfdmFsKSA9PSBzaXplb2YobG9uZykgPyAzIDogNCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNDg1LDYgKzQ5MSw4IEBACiAJbWNsLT5hcmdzWzBdID0gY21kOwogCW1jbC0+YXJnc1sxXSA9ICh1bnNpZ25lZCBsb25nKXVvcDsKIAltY2wtPmFyZ3NbMl0gPSBjb3VudDsKKworCXRyYWNlX3hlbl9tY19lbnRyeShtY2wsIDMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTUwNCw2ICs1MTIsOCBAQAogCQltY2wtPmFyZ3NbM10gPSBmbGFnczsKIAkJbWNsLT5hcmdzWzRdID0gZG9taWQ7CiAJfQorCisJdHJhY2VfeGVuX21jX2VudHJ5KG1jbCwgc2l6ZW9mKG5ld192YWwpID09IHNpemVvZihsb25nKSA/IDQgOiA1KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC01MjAsNiArNTMwLDggQEAKIAkJbWNsLT5hcmdzWzJdID0gZGVzYy5hOwogCQltY2wtPmFyZ3NbM10gPSBkZXNjLmI7CiAJfQorCisJdHJhY2VfeGVuX21jX2VudHJ5KG1jbCwgc2l6ZW9mKG1hZGRyKSA9PSBzaXplb2YobG9uZykgPyAyIDogNCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNTI4LDYgKzU0MCw4IEBACiAJbWNsLT5vcCA9IF9fSFlQRVJWSVNPUl9tZW1vcnlfb3A7CiAJbWNsLT5hcmdzWzBdID0gY21kOwogCW1jbC0+YXJnc1sxXSA9ICh1bnNpZ25lZCBsb25nKWFyZzsKKworCXRyYWNlX3hlbl9tY19lbnRyeShtY2wsIDIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTUzOSw2ICs1NTMsOCBAQAogCW1jbC0+YXJnc1sxXSA9IGNvdW50OwogCW1jbC0+YXJnc1syXSA9ICh1bnNpZ25lZCBsb25nKXN1Y2Nlc3NfY291bnQ7CiAJbWNsLT5hcmdzWzNdID0gZG9taWQ7CisKKwl0cmFjZV94ZW5fbWNfZW50cnkobWNsLCA0KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC01NTAsNiArNTY2LDggQEAKIAltY2wtPmFyZ3NbMV0gPSBjb3VudDsKIAltY2wtPmFyZ3NbMl0gPSAodW5zaWduZWQgbG9uZylzdWNjZXNzX2NvdW50OwogCW1jbC0+YXJnc1szXSA9IGRvbWlkOworCisJdHJhY2VfeGVuX21jX2VudHJ5KG1jbCwgNCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNTU4LDYgKzU3Niw4IEBACiAJbWNsLT5vcCA9IF9fSFlQRVJWSVNPUl9zZXRfZ2R0OwogCW1jbC0+YXJnc1swXSA9ICh1bnNpZ25lZCBsb25nKWZyYW1lczsKIAltY2wtPmFyZ3NbMV0gPSBlbnRyaWVzOworCisJdHJhY2VfeGVuX21jX2VudHJ5KG1jbCwgMik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNTY3LDYgKzU4Nyw4IEBACiAJbWNsLT5vcCA9IF9fSFlQRVJWSVNPUl9zdGFja19zd2l0Y2g7CiAJbWNsLT5hcmdzWzBdID0gc3M7CiAJbWNsLT5hcmdzWzFdID0gZXNwOworCisJdHJhY2VfeGVuX21jX2VudHJ5KG1jbCwgMik7CiB9CiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9YRU5fSFlQRVJDQUxMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9wY2kuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9wY2kuaAppbmRleCA0ZmJkYTlhLi45NjhkNTdkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vcGNpLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL3BjaS5oCkBAIC0xNCwxMyArMTQsMTQgQEAKIH0KICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1hFTl9ET00wKQotdm9pZCBfX2luaXQgeGVuX3NldHVwX3BpcnFzKHZvaWQpOworaW50IF9faW5pdCBwY2lfeGVuX2luaXRpYWxfZG9tYWluKHZvaWQpOwogaW50IHhlbl9maW5kX2RldmljZV9kb21haW5fb3duZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgeGVuX3JlZ2lzdGVyX2RldmljZV9kb21haW5fb3duZXIoc3RydWN0IHBjaV9kZXYgKmRldiwgdWludDE2X3QgZG9tYWluKTsKIGludCB4ZW5fdW5yZWdpc3Rlcl9kZXZpY2VfZG9tYWluX293bmVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgeGVuX3NldHVwX3BpcnFzKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQgcGNpX3hlbl9pbml0aWFsX2RvbWFpbih2b2lkKQogeworCXJldHVybiAtMTsKIH0KIHN0YXRpYyBpbmxpbmUgaW50IHhlbl9maW5kX2RldmljZV9kb21haW5fb3duZXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi90cmFjZV90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL3RyYWNlX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlMTg3NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi90cmFjZV90eXBlcy5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX0FTTV9YRU5fVFJBQ0VfVFlQRVNfSAorI2RlZmluZSBfQVNNX1hFTl9UUkFDRV9UWVBFU19ICisKK2VudW0geGVuX21jX2ZsdXNoX3JlYXNvbiB7CisJWEVOX01DX0ZMX05PTkUsCQkvKiBleHBsaWNpdCBmbHVzaCAqLworCVhFTl9NQ19GTF9CQVRDSCwJLyogb3V0IG9mIGh5cGVyY2FsbCBzcGFjZSAqLworCVhFTl9NQ19GTF9BUkdTLAkJLyogb3V0IG9mIGFyZ3VtZW50IHNwYWNlICovCisJWEVOX01DX0ZMX0NBTExCQUNLLAkvKiBvdXQgb2YgY2FsbGJhY2sgc3BhY2UgKi8KK307CisKK2VudW0geGVuX21jX2V4dGVuZF9hcmdzIHsKKwlYRU5fTUNfWEVfT0ssCisJWEVOX01DX1hFX0JBRF9PUCwKKwlYRU5fTUNfWEVfTk9fU1BBQ0UKK307Cit0eXBlZGVmIHZvaWQgKCp4ZW5fbWNfY2FsbGJhY2tfZm5fdCkodm9pZCAqKTsKKworI2VuZGlmCS8qIF9BU01fWEVOX1RSQUNFX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQppbmRleCA5MGIwNmQ0Li4wNDEwNTU3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCkBAIC0yNCwxNyArMjQsMTIgQEAKIG5vc3RhY2twIDo9ICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKQogQ0ZMQUdTX3ZzeXNjYWxsXzY0Lm8JOj0gJChQUk9GSUxJTkcpIC1nMCAkKG5vc3RhY2twKQogQ0ZMQUdTX2hwZXQubwkJOj0gJChub3N0YWNrcCkKLUNGTEFHU192cmVhZF90c2NfNjQubwk6PSAkKG5vc3RhY2twKQogQ0ZMQUdTX3BhcmF2aXJ0Lm8JOj0gJChub3N0YWNrcCkKIEdDT1ZfUFJPRklMRV92c3lzY2FsbF82NC5vCTo9IG4KIEdDT1ZfUFJPRklMRV9ocGV0Lm8JCTo9IG4KIEdDT1ZfUFJPRklMRV90c2MubwkJOj0gbgotR0NPVl9QUk9GSUxFX3ZyZWFkX3RzY182NC5vCTo9IG4KIEdDT1ZfUFJPRklMRV9wYXJhdmlydC5vCQk6PSBuCiAKLSMgdnJlYWRfdHNjXzY0IGlzIGhvdCBhbmQgc2hvdWxkIGJlIGZ1bGx5IG9wdGltaXplZDoKLUNGTEFHU19SRU1PVkVfdnJlYWRfdHNjXzY0Lm8gPSAtcGcgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzCi0KIG9iai15CQkJOj0gcHJvY2Vzc18kKEJJVFMpLm8gc2lnbmFsLm8gZW50cnlfJChCSVRTKS5vCiBvYmoteQkJCSs9IHRyYXBzLm8gaXJxLm8gaXJxXyQoQklUUykubyBkdW1wc3RhY2tfJChCSVRTKS5vCiBvYmoteQkJCSs9IHRpbWUubyBpb3BvcnQubyBsZHQubyBkdW1wc3RhY2subwpAQCAtNDMsNyArMzgsOCBAQAogb2JqLXkJCQkrPSBwcm9iZV9yb21zLm8KIG9iai0kKENPTkZJR19YODZfMzIpCSs9IHN5c19pMzg2XzMyLm8gaTM4Nl9rc3ltc18zMi5vCiBvYmotJChDT05GSUdfWDg2XzY0KQkrPSBzeXNfeDg2XzY0Lm8geDg2NjRfa3N5bXNfNjQubwotb2JqLSQoQ09ORklHX1g4Nl82NCkJKz0gc3lzY2FsbF82NC5vIHZzeXNjYWxsXzY0Lm8gdnJlYWRfdHNjXzY0Lm8KK29iai0kKENPTkZJR19YODZfNjQpCSs9IHN5c2NhbGxfNjQubyB2c3lzY2FsbF82NC5vCitvYmotJChDT05GSUdfWDg2XzY0KQkrPSB2c3lzY2FsbF9lbXVfNjQubwogb2JqLXkJCQkrPSBib290ZmxhZy5vIGU4MjAubwogb2JqLXkJCQkrPSBwY2ktZG1hLm8gcXVpcmtzLm8gdG9wb2xvZ3kubyBrZGVidWdmcy5vCiBvYmoteQkJCSs9IGFsdGVybmF0aXZlLm8gaTgyNTMubyBwY2ktbm9tbXUubyBod19icmVha3BvaW50Lm8KQEAgLTEyMyw3ICsxMTksNiBAQAogCiAJb2JqLSQoQ09ORklHX0dBUlRfSU9NTVUpCSs9IGFtZF9nYXJ0XzY0Lm8gYXBlcnR1cmVfNjQubwogCW9iai0kKENPTkZJR19DQUxHQVJZX0lPTU1VKQkrPSBwY2ktY2FsZ2FyeV82NC5vIHRjZV82NC5vCi0Jb2JqLSQoQ09ORklHX0FNRF9JT01NVSkJCSs9IGFtZF9pb21tdV9pbml0Lm8gYW1kX2lvbW11Lm8KIAogCW9iai0kKENPTkZJR19QQ0lfTU1DT05GSUcpCSs9IG1tY29uZi1mYW0xMGhfNjQubwogCW9iai15CQkJCSs9IHZzbXBfNjQubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLlMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuUwppbmRleCBlYWQyMWI2Li5iNGZkODM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuUwpAQCAtMjgsNiArMjgsOCBAQAogcG1vZGVfY3I0OgkubG9uZwkwCS8qIFNhdmVkICVjcjQgKi8KIHBtb2RlX2VmZXI6CS5xdWFkCTAJLyogU2F2ZWQgRUZFUiAqLwogcG1vZGVfZ2R0OgkucXVhZAkwCitwbW9kZV9taXNjX2VuOgkucXVhZAkwCS8qIFNhdmVkIE1JU0NfRU5BQkxFIE1TUiAqLworcG1vZGVfYmVoYXZpb3I6CS5sb25nCTAJLyogV2FrZXVwIGJlaGF2aW9yIGZsYWdzICovCiByZWFsbW9kZV9mbGFnczoJLmxvbmcJMAogcmVhbF9tYWdpYzoJLmxvbmcJMAogdHJhbXBvbGluZV9zZWdtZW50Ogkud29yZCAwCkBAIC05MSw2ICs5MywxOCBAQAogCS8qIENhbGwgdGhlIEMgY29kZSAqLwogCWNhbGxsCW1haW4KIAorCS8qIFJlc3RvcmUgTUlTQ19FTkFCTEUgYmVmb3JlIGVudGVyaW5nIHByb3RlY3RlZCBtb2RlLCBpbiBjYXNlCisJICAgQklPUyBkZWNpZGVkIHRvIGNsZWFyIFhEX0RJU0FCTEUgZHVyaW5nIFMzLiAqLworCW1vdmwJcG1vZGVfYmVoYXZpb3IsICVlYXgKKwlidGwJJFdBS0VVUF9CRUhBVklPUl9SRVNUT1JFX01JU0NfRU5BQkxFLCAlZWF4CisJam5jCTFmCisKKwltb3ZsCXBtb2RlX21pc2NfZW4sICVlYXgKKwltb3ZsCXBtb2RlX21pc2NfZW4gKyA0LCAlZWR4CisJbW92bAkkTVNSX0lBMzJfTUlTQ19FTkFCTEUsICVlY3gKKwl3cm1zcgorMToKKwogCS8qIERvIGFueSBvdGhlciBzdHVmZi4uLiAqLwogCiAjaWZuZGVmIENPTkZJR182NEJJVApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLmggYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuaAppbmRleCBlMTgyOGMwLi45N2EyOWUxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS93YWtldXAuaApAQCAtMjEsNiArMjEsOSBAQAogCXUzMiBwbW9kZV9lZmVyX2xvdzsJLyogUHJvdGVjdGVkIG1vZGUgRUZFUiAqLwogCXUzMiBwbW9kZV9lZmVyX2hpZ2g7CiAJdTY0IHBtb2RlX2dkdDsKKwl1MzIgcG1vZGVfbWlzY19lbl9sb3c7CS8qIFByb3RlY3RlZCBtb2RlIE1JU0NfRU5BQkxFICovCisJdTMyIHBtb2RlX21pc2NfZW5faGlnaDsKKwl1MzIgcG1vZGVfYmVoYXZpb3I7CS8qIFdha2V1cCByb3V0aW5lIGJlaGF2aW9yIGZsYWdzICovCiAJdTMyIHJlYWxtb2RlX2ZsYWdzOwogCXUzMiByZWFsX21hZ2ljOwogCXUxNiB0cmFtcG9saW5lX3NlZ21lbnQ7CS8qIHNlZ21lbnQgd2l0aCB0cmFtcG9saW5lIGNvZGUsIDY0LWJpdCBvbmx5ICovCkBAIC0zOSw0ICs0Miw3IEBACiAjZGVmaW5lIFdBS0VVUF9IRUFERVJfU0lHTkFUVVJFIDB4NTFlZTExMTEKICNkZWZpbmUgV0FLRVVQX0VORF9TSUdOQVRVUkUJMHg2NWEyMmM4MgogCisvKiBXYWtldXAgYmVoYXZpb3IgYml0cyAqLworI2RlZmluZSBXQUtFVVBfQkVIQVZJT1JfUkVTVE9SRV9NSVNDX0VOQUJMRSAgICAgMAorCiAjZW5kaWYgLyogQVJDSF9YODZfS0VSTkVMX0FDUElfUk1fV0FLRVVQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCmluZGV4IDE4YTg1N2IuLjEwM2I2YWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYwpAQCAtNzcsNiArNzcsMTIgQEAKIAogCWhlYWRlci0+cG1vZGVfY3IwID0gcmVhZF9jcjAoKTsKIAloZWFkZXItPnBtb2RlX2NyNCA9IHJlYWRfY3I0X3NhZmUoKTsKKwloZWFkZXItPnBtb2RlX2JlaGF2aW9yID0gMDsKKwlpZiAoIXJkbXNyX3NhZmUoTVNSX0lBMzJfTUlTQ19FTkFCTEUsCisJCQkmaGVhZGVyLT5wbW9kZV9taXNjX2VuX2xvdywKKwkJCSZoZWFkZXItPnBtb2RlX21pc2NfZW5faGlnaCkpCisJCWhlYWRlci0+cG1vZGVfYmVoYXZpb3IgfD0KKwkJCSgxIDw8IFdBS0VVUF9CRUhBVklPUl9SRVNUT1JFX01JU0NfRU5BQkxFKTsKIAloZWFkZXItPnJlYWxtb2RlX2ZsYWdzID0gYWNwaV9yZWFsbW9kZV9mbGFnczsKIAloZWFkZXItPnJlYWxfbWFnaWMgPSAweDEyMzQ1Njc4OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYyBiL2FyY2gveDg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jCmluZGV4IGE4MWYyZDUuLmM2MzgyMjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vbWNlLmg+CiAjaW5jbHVkZSA8YXNtL25taS5oPgotI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0yNTAsNyArMjQ5LDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBhbHRfaW5zdHIgX19hbHRfaW5zdHJ1Y3Rpb25zW10sIF9fYWx0X2luc3RydWN0aW9uc19lbmRbXTsKIGV4dGVybiBzMzIgX19zbXBfbG9ja3NbXSwgX19zbXBfbG9ja3NfZW5kW107Ci1leHRlcm4gY2hhciBfX3ZzeXNjYWxsXzA7CiB2b2lkICp0ZXh0X3Bva2VfZWFybHkodm9pZCAqYWRkciwgY29uc3Qgdm9pZCAqb3Bjb2RlLCBzaXplX3QgbGVuKTsKIAogLyogUmVwbGFjZSBpbnN0cnVjdGlvbnMgd2l0aCBiZXR0ZXIgYWx0ZXJuYXRpdmVzIGZvciB0aGlzIENQVSB0eXBlLgpAQCAtMjYzLDYgKzI2MSw3IEBACiAJCQkJCSBzdHJ1Y3QgYWx0X2luc3RyICplbmQpCiB7CiAJc3RydWN0IGFsdF9pbnN0ciAqYTsKKwl1OCAqaW5zdHIsICpyZXBsYWNlbWVudDsKIAl1OCBpbnNuYnVmW01BWF9QQVRDSF9MRU5dOwogCiAJRFBSSU5USygiJXM6IGFsdCB0YWJsZSAlcCAtPiAlcFxuIiwgX19mdW5jX18sIHN0YXJ0LCBlbmQpOwpAQCAtMjc2LDI1ICsyNzUsMjMgQEAKIAkgKiBvcmRlci4KIAkgKi8KIAlmb3IgKGEgPSBzdGFydDsgYSA8IGVuZDsgYSsrKSB7Ci0JCXU4ICppbnN0ciA9IGEtPmluc3RyOworCQlpbnN0ciA9ICh1OCAqKSZhLT5pbnN0cl9vZmZzZXQgKyBhLT5pbnN0cl9vZmZzZXQ7CisJCXJlcGxhY2VtZW50ID0gKHU4ICopJmEtPnJlcGxfb2Zmc2V0ICsgYS0+cmVwbF9vZmZzZXQ7CiAJCUJVR19PTihhLT5yZXBsYWNlbWVudGxlbiA+IGEtPmluc3RybGVuKTsKIAkJQlVHX09OKGEtPmluc3RybGVuID4gc2l6ZW9mKGluc25idWYpKTsKIAkJQlVHX09OKGEtPmNwdWlkID49IE5DQVBJTlRTKjMyKTsKIAkJaWYgKCFib290X2NwdV9oYXMoYS0+Y3B1aWQpKQogCQkJY29udGludWU7Ci0jaWZkZWYgQ09ORklHX1g4Nl82NAotCQkvKiB2c3lzY2FsbCBjb2RlIGlzIG5vdCBtYXBwZWQgeWV0LiByZXNvbHZlIGl0IG1hbnVhbGx5LiAqLwotCQlpZiAoaW5zdHIgPj0gKHU4ICopVlNZU0NBTExfU1RBUlQgJiYgaW5zdHIgPCAodTgqKVZTWVNDQUxMX0VORCkgewotCQkJaW5zdHIgPSBfX3ZhKGluc3RyIC0gKHU4KilWU1lTQ0FMTF9TVEFSVCArICh1OCopX19wYV9zeW1ib2woJl9fdnN5c2NhbGxfMCkpOwotCQkJRFBSSU5USygiJXM6IHZzeXNjYWxsIGZpeHVwOiAlcCA9PiAlcFxuIiwKLQkJCQlfX2Z1bmNfXywgYS0+aW5zdHIsIGluc3RyKTsKLQkJfQotI2VuZGlmCi0JCW1lbWNweShpbnNuYnVmLCBhLT5yZXBsYWNlbWVudCwgYS0+cmVwbGFjZW1lbnRsZW4pOworCisJCW1lbWNweShpbnNuYnVmLCByZXBsYWNlbWVudCwgYS0+cmVwbGFjZW1lbnRsZW4pOworCisJCS8qIDB4ZTggaXMgYSByZWxhdGl2ZSBqdW1wOyBmaXggdGhlIG9mZnNldC4gKi8KIAkJaWYgKCppbnNuYnVmID09IDB4ZTggJiYgYS0+cmVwbGFjZW1lbnRsZW4gPT0gNSkKLQkJICAgICooczMyICopKGluc25idWYgKyAxKSArPSBhLT5yZXBsYWNlbWVudCAtIGEtPmluc3RyOworCQkgICAgKihzMzIgKikoaW5zbmJ1ZiArIDEpICs9IHJlcGxhY2VtZW50IC0gaW5zdHI7CisKIAkJYWRkX25vcHMoaW5zbmJ1ZiArIGEtPnJlcGxhY2VtZW50bGVuLAogCQkJIGEtPmluc3RybGVuIC0gYS0+cmVwbGFjZW1lbnRsZW4pOworCiAJCXRleHRfcG9rZV9lYXJseShpbnN0ciwgaW5zbmJ1ZiwgYS0+aW5zdHJsZW4pOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4Y2JlYi4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCi0gKiBBdXRob3I6IEpvZXJnIFJvZWRlbCA8am9lcmcucm9lZGVsQGFtZC5jb20+Ci0gKiAgICAgICAgIExlbyBEdXJhbiA8bGVvLmR1cmFuQGFtZC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAotICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS1hdHMuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pb21tdS1oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL3Byb3RvLmg+Ci0jaW5jbHVkZSA8YXNtL2lvbW11Lmg+Ci0jaW5jbHVkZSA8YXNtL2dhcnQuaD4KLSNpbmNsdWRlIDxhc20vYW1kX2lvbW11X3Byb3RvLmg+Ci0jaW5jbHVkZSA8YXNtL2FtZF9pb21tdV90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9hbWRfaW9tbXUuaD4KLQotI2RlZmluZSBDTURfU0VUX1RZUEUoY21kLCB0KSAoKGNtZCktPmRhdGFbMV0gfD0gKCh0KSA8PCAyOCkpCi0KLSNkZWZpbmUgTE9PUF9USU1FT1VUCTEwMDAwMAotCi1zdGF0aWMgREVGSU5FX1JXTE9DSyhhbWRfaW9tbXVfZGV2dGFibGVfbG9jayk7Ci0KLS8qIEEgbGlzdCBvZiBwcmVhbGxvY2F0ZWQgcHJvdGVjdGlvbiBkb21haW5zICovCi1zdGF0aWMgTElTVF9IRUFEKGlvbW11X3BkX2xpc3QpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhpb21tdV9wZF9saXN0X2xvY2spOwotCi0vKgotICogRG9tYWluIGZvciB1bnRyYW5zbGF0ZWQgZGV2aWNlcyAtIG9ubHkgYWxsb2NhdGVkCi0gKiBpZiBpb21tdT1wdCBwYXNzZWQgb24ga2VybmVsIGNtZCBsaW5lLgotICovCi1zdGF0aWMgc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpwdF9kb21haW47Ci0KLXN0YXRpYyBzdHJ1Y3QgaW9tbXVfb3BzIGFtZF9pb21tdV9vcHM7Ci0KLS8qCi0gKiBnZW5lcmFsIHN0cnVjdCB0byBtYW5hZ2UgY29tbWFuZHMgc2VuZCB0byBhbiBJT01NVQotICovCi1zdHJ1Y3QgaW9tbXVfY21kIHsKLQl1MzIgZGF0YVs0XTsKLX07Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9kb21haW4oc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEhlbHBlciBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGlubGluZSB1MTYgZ2V0X2RldmljZV9pZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7Ci0KLQlyZXR1cm4gY2FsY19kZXZpZChwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4pOwotfQotCi1zdGF0aWMgc3RydWN0IGlvbW11X2Rldl9kYXRhICpnZXRfZGV2X2RhdGEoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBkZXYtPmFyY2hkYXRhLmlvbW11OwotfQotCi0vKgotICogSW4gdGhpcyBmdW5jdGlvbiB0aGUgbGlzdCBvZiBwcmVhbGxvY2F0ZWQgcHJvdGVjdGlvbiBkb21haW5zIGlzIHRyYXZlcnNlZCB0bwotICogZmluZCB0aGUgZG9tYWluIGZvciBhIHNwZWNpZmljIGRldmljZQotICovCi1zdGF0aWMgc3RydWN0IGRtYV9vcHNfZG9tYWluICpmaW5kX3Byb3RlY3Rpb25fZG9tYWluKHUxNiBkZXZpZCkKLXsKLQlzdHJ1Y3QgZG1hX29wc19kb21haW4gKmVudHJ5LCAqcmV0ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUxNiBhbGlhcyA9IGFtZF9pb21tdV9hbGlhc190YWJsZVtkZXZpZF07Ci0KLQlpZiAobGlzdF9lbXB0eSgmaW9tbXVfcGRfbGlzdCkpCi0JCXJldHVybiBOVUxMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11X3BkX2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmlvbW11X3BkX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGVudHJ5LT50YXJnZXRfZGV2ID09IGRldmlkIHx8Ci0JCSAgICBlbnRyeS0+dGFyZ2V0X2RldiA9PSBhbGlhcykgewotCQkJcmV0ID0gZW50cnk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11X3BkX2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBkcml2ZXIgZ290IGEgdmFsaWQgZGV2aWNlIGZyb20gdGhlIGNhbGxlciB0bwotICogYXZvaWQgZGVyZWZlcmVuY2luZyBpbnZhbGlkIHBvaW50ZXJzLgotICovCi1zdGF0aWMgYm9vbCBjaGVja19kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXUxNiBkZXZpZDsKLQotCWlmICghZGV2IHx8ICFkZXYtPmRtYV9tYXNrKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBObyBkZXZpY2Ugb3Igbm8gUENJIGRldmljZSAqLwotCWlmIChkZXYtPmJ1cyAhPSAmcGNpX2J1c190eXBlKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlkZXZpZCA9IGdldF9kZXZpY2VfaWQoZGV2KTsKLQotCS8qIE91dCBvZiBvdXIgc2NvcGU/ICovCi0JaWYgKGRldmlkID4gYW1kX2lvbW11X2xhc3RfYmRmKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAoYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IGlvbW11X2luaXRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXUxNiBkZXZpZCwgYWxpYXM7Ci0KLQlpZiAoZGV2LT5hcmNoZGF0YS5pb21tdSkKLQkJcmV0dXJuIDA7Ci0KLQlkZXZfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkZXZfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghZGV2X2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGV2X2RhdGEtPmRldiA9IGRldjsKLQotCWRldmlkID0gZ2V0X2RldmljZV9pZChkZXYpOwotCWFsaWFzID0gYW1kX2lvbW11X2FsaWFzX3RhYmxlW2RldmlkXTsKLQlwZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoUENJX0JVUyhhbGlhcyksIGFsaWFzICYgMHhmZik7Ci0JaWYgKHBkZXYpCi0JCWRldl9kYXRhLT5hbGlhcyA9ICZwZGV2LT5kZXY7Ci0KLQlhdG9taWNfc2V0KCZkZXZfZGF0YS0+YmluZCwgMCk7Ci0KLQlkZXYtPmFyY2hkYXRhLmlvbW11ID0gZGV2X2RhdGE7Ci0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV91bmluaXRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlrZnJlZShkZXYtPmFyY2hkYXRhLmlvbW11KTsKLX0KLQotdm9pZCBfX2luaXQgYW1kX2lvbW11X3VuaW5pdF9kZXZpY2VzKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwotCi0JZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7Ci0KLQkJaWYgKCFjaGVja19kZXZpY2UoJnBkZXYtPmRldikpCi0JCQljb250aW51ZTsKLQotCQlpb21tdV91bmluaXRfZGV2aWNlKCZwZGV2LT5kZXYpOwotCX0KLX0KLQotaW50IF9faW5pdCBhbWRfaW9tbXVfaW5pdF9kZXZpY2VzKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwotCWludCByZXQgPSAwOwotCi0JZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7Ci0KLQkJaWYgKCFjaGVja19kZXZpY2UoJnBkZXYtPmRldikpCi0JCQljb250aW51ZTsKLQotCQlyZXQgPSBpb21tdV9pbml0X2RldmljZSgmcGRldi0+ZGV2KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLW91dF9mcmVlOgotCi0JYW1kX2lvbW11X3VuaW5pdF9kZXZpY2VzKCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotI2lmZGVmIENPTkZJR19BTURfSU9NTVVfU1RBVFMKLQotLyoKLSAqIEluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHN0YXRpc3RpY3MgY29sbGVjdGlvbgotICovCi0KLURFQ0xBUkVfU1RBVFNfQ09VTlRFUihjb21wbF93YWl0KTsKLURFQ0xBUkVfU1RBVFNfQ09VTlRFUihjbnRfbWFwX3NpbmdsZSk7Ci1ERUNMQVJFX1NUQVRTX0NPVU5URVIoY250X3VubWFwX3NpbmdsZSk7Ci1ERUNMQVJFX1NUQVRTX0NPVU5URVIoY250X21hcF9zZyk7Ci1ERUNMQVJFX1NUQVRTX0NPVU5URVIoY250X3VubWFwX3NnKTsKLURFQ0xBUkVfU1RBVFNfQ09VTlRFUihjbnRfYWxsb2NfY29oZXJlbnQpOwotREVDTEFSRV9TVEFUU19DT1VOVEVSKGNudF9mcmVlX2NvaGVyZW50KTsKLURFQ0xBUkVfU1RBVFNfQ09VTlRFUihjcm9zc19wYWdlKTsKLURFQ0xBUkVfU1RBVFNfQ09VTlRFUihkb21haW5fZmx1c2hfc2luZ2xlKTsKLURFQ0xBUkVfU1RBVFNfQ09VTlRFUihkb21haW5fZmx1c2hfYWxsKTsKLURFQ0xBUkVfU1RBVFNfQ09VTlRFUihhbGxvY2VkX2lvX21lbSk7Ci1ERUNMQVJFX1NUQVRTX0NPVU5URVIodG90YWxfbWFwX3JlcXVlc3RzKTsKLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKnN0YXRzX2RpcjsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZV9mZmx1c2g7Ci0KLXN0YXRpYyB2b2lkIGFtZF9pb21tdV9zdGF0c19hZGQoc3RydWN0IF9faW9tbXVfY291bnRlciAqY250KQotewotCWlmIChzdGF0c19kaXIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JY250LT5kZW50ID0gZGVidWdmc19jcmVhdGVfdTY0KGNudC0+bmFtZSwgMDQ0NCwgc3RhdHNfZGlyLAotCQkJCSAgICAgICAmY250LT52YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFtZF9pb21tdV9zdGF0c19pbml0KHZvaWQpCi17Ci0Jc3RhdHNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJhbWQtaW9tbXUiLCBOVUxMKTsKLQlpZiAoc3RhdHNfZGlyID09IE5VTEwpCi0JCXJldHVybjsKLQotCWRlX2ZmbHVzaCAgPSBkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJmdWxsZmx1c2giLCAwNDQ0LCBzdGF0c19kaXIsCi0JCQkJCSAodTMyICopJmFtZF9pb21tdV91bm1hcF9mbHVzaCk7Ci0KLQlhbWRfaW9tbXVfc3RhdHNfYWRkKCZjb21wbF93YWl0KTsKLQlhbWRfaW9tbXVfc3RhdHNfYWRkKCZjbnRfbWFwX3NpbmdsZSk7Ci0JYW1kX2lvbW11X3N0YXRzX2FkZCgmY250X3VubWFwX3NpbmdsZSk7Ci0JYW1kX2lvbW11X3N0YXRzX2FkZCgmY250X21hcF9zZyk7Ci0JYW1kX2lvbW11X3N0YXRzX2FkZCgmY250X3VubWFwX3NnKTsKLQlhbWRfaW9tbXVfc3RhdHNfYWRkKCZjbnRfYWxsb2NfY29oZXJlbnQpOwotCWFtZF9pb21tdV9zdGF0c19hZGQoJmNudF9mcmVlX2NvaGVyZW50KTsKLQlhbWRfaW9tbXVfc3RhdHNfYWRkKCZjcm9zc19wYWdlKTsKLQlhbWRfaW9tbXVfc3RhdHNfYWRkKCZkb21haW5fZmx1c2hfc2luZ2xlKTsKLQlhbWRfaW9tbXVfc3RhdHNfYWRkKCZkb21haW5fZmx1c2hfYWxsKTsKLQlhbWRfaW9tbXVfc3RhdHNfYWRkKCZhbGxvY2VkX2lvX21lbSk7Ci0JYW1kX2lvbW11X3N0YXRzX2FkZCgmdG90YWxfbWFwX3JlcXVlc3RzKTsKLX0KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogSW50ZXJydXB0IGhhbmRsaW5nIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBkdW1wX2R0ZV9lbnRyeSh1MTYgZGV2aWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQotCQlwcl9lcnIoIkFNRC1WaTogRFRFWyVkXTogJTA4eFxuIiwgaSwKLQkJCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbaV0pOwotfQotCi1zdGF0aWMgdm9pZCBkdW1wX2NvbW1hbmQodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCi17Ci0Jc3RydWN0IGlvbW11X2NtZCAqY21kID0gcGh5c190b192aXJ0KHBoeXNfYWRkcik7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQotCQlwcl9lcnIoIkFNRC1WaTogQ01EWyVkXTogJTA4eFxuIiwgaSwgY21kLT5kYXRhW2ldKTsKLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfcHJpbnRfZXZlbnQoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHZvaWQgKl9fZXZ0KQotewotCXUzMiAqZXZlbnQgPSBfX2V2dDsKLQlpbnQgdHlwZSAgPSAoZXZlbnRbMV0gPj4gRVZFTlRfVFlQRV9TSElGVCkgICYgRVZFTlRfVFlQRV9NQVNLOwotCWludCBkZXZpZCA9IChldmVudFswXSA+PiBFVkVOVF9ERVZJRF9TSElGVCkgJiBFVkVOVF9ERVZJRF9NQVNLOwotCWludCBkb21pZCA9IChldmVudFsxXSA+PiBFVkVOVF9ET01JRF9TSElGVCkgJiBFVkVOVF9ET01JRF9NQVNLOwotCWludCBmbGFncyA9IChldmVudFsxXSA+PiBFVkVOVF9GTEFHU19TSElGVCkgJiBFVkVOVF9GTEFHU19NQVNLOwotCXU2NCBhZGRyZXNzID0gKHU2NCkoKCh1NjQpZXZlbnRbM10pIDw8IDMyKSB8IGV2ZW50WzJdOwotCi0JcHJpbnRrKEtFUk5fRVJSICJBTUQtVmk6IEV2ZW50IGxvZ2dlZCBbIik7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIEVWRU5UX1RZUEVfSUxMX0RFVjoKLQkJcHJpbnRrKCJJTExFR0FMX0RFVl9UQUJMRV9FTlRSWSBkZXZpY2U9JTAyeDolMDJ4LiV4ICIKLQkJICAgICAgICJhZGRyZXNzPTB4JTAxNmxseCBmbGFncz0weCUwNHhdXG4iLAotCQkgICAgICAgUENJX0JVUyhkZXZpZCksIFBDSV9TTE9UKGRldmlkKSwgUENJX0ZVTkMoZGV2aWQpLAotCQkgICAgICAgYWRkcmVzcywgZmxhZ3MpOwotCQlkdW1wX2R0ZV9lbnRyeShkZXZpZCk7Ci0JCWJyZWFrOwotCWNhc2UgRVZFTlRfVFlQRV9JT19GQVVMVDoKLQkJcHJpbnRrKCJJT19QQUdFX0ZBVUxUIGRldmljZT0lMDJ4OiUwMnguJXggIgotCQkgICAgICAgImRvbWFpbj0weCUwNHggYWRkcmVzcz0weCUwMTZsbHggZmxhZ3M9MHglMDR4XVxuIiwKLQkJICAgICAgIFBDSV9CVVMoZGV2aWQpLCBQQ0lfU0xPVChkZXZpZCksIFBDSV9GVU5DKGRldmlkKSwKLQkJICAgICAgIGRvbWlkLCBhZGRyZXNzLCBmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgRVZFTlRfVFlQRV9ERVZfVEFCX0VSUjoKLQkJcHJpbnRrKCJERVZfVEFCX0hBUkRXQVJFX0VSUk9SIGRldmljZT0lMDJ4OiUwMnguJXggIgotCQkgICAgICAgImFkZHJlc3M9MHglMDE2bGx4IGZsYWdzPTB4JTA0eF1cbiIsCi0JCSAgICAgICBQQ0lfQlVTKGRldmlkKSwgUENJX1NMT1QoZGV2aWQpLCBQQ0lfRlVOQyhkZXZpZCksCi0JCSAgICAgICBhZGRyZXNzLCBmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgRVZFTlRfVFlQRV9QQUdFX1RBQl9FUlI6Ci0JCXByaW50aygiUEFHRV9UQUJfSEFSRFdBUkVfRVJST1IgZGV2aWNlPSUwMng6JTAyeC4leCAiCi0JCSAgICAgICAiZG9tYWluPTB4JTA0eCBhZGRyZXNzPTB4JTAxNmxseCBmbGFncz0weCUwNHhdXG4iLAotCQkgICAgICAgUENJX0JVUyhkZXZpZCksIFBDSV9TTE9UKGRldmlkKSwgUENJX0ZVTkMoZGV2aWQpLAotCQkgICAgICAgZG9taWQsIGFkZHJlc3MsIGZsYWdzKTsKLQkJYnJlYWs7Ci0JY2FzZSBFVkVOVF9UWVBFX0lMTF9DTUQ6Ci0JCXByaW50aygiSUxMRUdBTF9DT01NQU5EX0VSUk9SIGFkZHJlc3M9MHglMDE2bGx4XVxuIiwgYWRkcmVzcyk7Ci0JCWR1bXBfY29tbWFuZChhZGRyZXNzKTsKLQkJYnJlYWs7Ci0JY2FzZSBFVkVOVF9UWVBFX0NNRF9IQVJEX0VSUjoKLQkJcHJpbnRrKCJDT01NQU5EX0hBUkRXQVJFX0VSUk9SIGFkZHJlc3M9MHglMDE2bGx4ICIKLQkJICAgICAgICJmbGFncz0weCUwNHhdXG4iLCBhZGRyZXNzLCBmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgRVZFTlRfVFlQRV9JT1RMQl9JTlZfVE86Ci0JCXByaW50aygiSU9UTEJfSU5WX1RJTUVPVVQgZGV2aWNlPSUwMng6JTAyeC4leCAiCi0JCSAgICAgICAiYWRkcmVzcz0weCUwMTZsbHhdXG4iLAotCQkgICAgICAgUENJX0JVUyhkZXZpZCksIFBDSV9TTE9UKGRldmlkKSwgUENJX0ZVTkMoZGV2aWQpLAotCQkgICAgICAgYWRkcmVzcyk7Ci0JCWJyZWFrOwotCWNhc2UgRVZFTlRfVFlQRV9JTlZfREVWX1JFUToKLQkJcHJpbnRrKCJJTlZBTElEX0RFVklDRV9SRVFVRVNUIGRldmljZT0lMDJ4OiUwMnguJXggIgotCQkgICAgICAgImFkZHJlc3M9MHglMDE2bGx4IGZsYWdzPTB4JTA0eF1cbiIsCi0JCSAgICAgICBQQ0lfQlVTKGRldmlkKSwgUENJX1NMT1QoZGV2aWQpLCBQQ0lfRlVOQyhkZXZpZCksCi0JCSAgICAgICBhZGRyZXNzLCBmbGFncyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiVU5LTk9XTiB0eXBlPTB4JTAyeF1cbiIsIHR5cGUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfcG9sbF9ldmVudHMoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCi17Ci0JdTMyIGhlYWQsIHRhaWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCi0JaGVhZCA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0VWVF9IRUFEX09GRlNFVCk7Ci0JdGFpbCA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0VWVF9UQUlMX09GRlNFVCk7Ci0KLQl3aGlsZSAoaGVhZCAhPSB0YWlsKSB7Ci0JCWlvbW11X3ByaW50X2V2ZW50KGlvbW11LCBpb21tdS0+ZXZ0X2J1ZiArIGhlYWQpOwotCQloZWFkID0gKGhlYWQgKyBFVkVOVF9FTlRSWV9TSVpFKSAlIGlvbW11LT5ldnRfYnVmX3NpemU7Ci0JfQotCi0Jd3JpdGVsKGhlYWQsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0VWVF9IRUFEX09GRlNFVCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotfQotCi1pcnFyZXR1cm5fdCBhbWRfaW9tbXVfaW50X3RocmVhZChpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OwotCi0JZm9yX2VhY2hfaW9tbXUoaW9tbXUpCi0JCWlvbW11X3BvbGxfZXZlbnRzKGlvbW11KTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotaXJxcmV0dXJuX3QgYW1kX2lvbW11X2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBJT01NVSBjb21tYW5kIHF1ZXVpbmcgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgd2FpdF9vbl9zZW0odm9sYXRpbGUgdTY0ICpzZW0pCi17Ci0JaW50IGkgPSAwOwotCi0Jd2hpbGUgKCpzZW0gPT0gMCAmJiBpIDwgTE9PUF9USU1FT1VUKSB7Ci0JCXVkZWxheSgxKTsKLQkJaSArPSAxOwotCX0KLQotCWlmIChpID09IExPT1BfVElNRU9VVCkgewotCQlwcl9hbGVydCgiQU1ELVZpOiBDb21wbGV0aW9uLVdhaXQgbG9vcCB0aW1lZCBvdXRcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY29weV9jbWRfdG9fYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LAotCQkJICAgICAgIHN0cnVjdCBpb21tdV9jbWQgKmNtZCwKLQkJCSAgICAgICB1MzIgdGFpbCkKLXsKLQl1OCAqdGFyZ2V0OwotCi0JdGFyZ2V0ID0gaW9tbXUtPmNtZF9idWYgKyB0YWlsOwotCXRhaWwgICA9ICh0YWlsICsgc2l6ZW9mKCpjbWQpKSAlIGlvbW11LT5jbWRfYnVmX3NpemU7Ci0KLQkvKiBDb3B5IGNvbW1hbmQgdG8gYnVmZmVyICovCi0JbWVtY3B5KHRhcmdldCwgY21kLCBzaXplb2YoKmNtZCkpOwotCi0JLyogVGVsbCB0aGUgSU9NTVUgYWJvdXQgaXQgKi8KLQl3cml0ZWwodGFpbCwgaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fQ01EX1RBSUxfT0ZGU0VUKTsKLX0KLQotc3RhdGljIHZvaWQgYnVpbGRfY29tcGxldGlvbl93YWl0KHN0cnVjdCBpb21tdV9jbWQgKmNtZCwgdTY0IGFkZHJlc3MpCi17Ci0JV0FSTl9PTihhZGRyZXNzICYgMHg3VUxMKTsKLQotCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7Ci0JY21kLT5kYXRhWzBdID0gbG93ZXJfMzJfYml0cyhfX3BhKGFkZHJlc3MpKSB8IENNRF9DT01QTF9XQUlUX1NUT1JFX01BU0s7Ci0JY21kLT5kYXRhWzFdID0gdXBwZXJfMzJfYml0cyhfX3BhKGFkZHJlc3MpKTsKLQljbWQtPmRhdGFbMl0gPSAxOwotCUNNRF9TRVRfVFlQRShjbWQsIENNRF9DT01QTF9XQUlUKTsKLX0KLQotc3RhdGljIHZvaWQgYnVpbGRfaW52X2R0ZShzdHJ1Y3QgaW9tbXVfY21kICpjbWQsIHUxNiBkZXZpZCkKLXsKLQltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOwotCWNtZC0+ZGF0YVswXSA9IGRldmlkOwotCUNNRF9TRVRfVFlQRShjbWQsIENNRF9JTlZfREVWX0VOVFJZKTsKLX0KLQotc3RhdGljIHZvaWQgYnVpbGRfaW52X2lvbW11X3BhZ2VzKHN0cnVjdCBpb21tdV9jbWQgKmNtZCwgdTY0IGFkZHJlc3MsCi0JCQkJICBzaXplX3Qgc2l6ZSwgdTE2IGRvbWlkLCBpbnQgcGRlKQotewotCXU2NCBwYWdlczsKLQlpbnQgczsKLQotCXBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGFkZHJlc3MsIHNpemUsIFBBR0VfU0laRSk7Ci0JcyAgICAgPSAwOwotCi0JaWYgKHBhZ2VzID4gMSkgewotCQkvKgotCQkgKiBJZiB3ZSBoYXZlIHRvIGZsdXNoIG1vcmUgdGhhbiBvbmUgcGFnZSwgZmx1c2ggYWxsCi0JCSAqIFRMQiBlbnRyaWVzIGZvciB0aGlzIGRvbWFpbgotCQkgKi8KLQkJYWRkcmVzcyA9IENNRF9JTlZfSU9NTVVfQUxMX1BBR0VTX0FERFJFU1M7Ci0JCXMgPSAxOwotCX0KLQotCWFkZHJlc3MgJj0gUEFHRV9NQVNLOwotCi0JbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKLQljbWQtPmRhdGFbMV0gfD0gZG9taWQ7Ci0JY21kLT5kYXRhWzJdICA9IGxvd2VyXzMyX2JpdHMoYWRkcmVzcyk7Ci0JY21kLT5kYXRhWzNdICA9IHVwcGVyXzMyX2JpdHMoYWRkcmVzcyk7Ci0JQ01EX1NFVF9UWVBFKGNtZCwgQ01EX0lOVl9JT01NVV9QQUdFUyk7Ci0JaWYgKHMpIC8qIHNpemUgYml0IC0gd2UgZmx1c2ggbW9yZSB0aGFuIG9uZSA0a2IgcGFnZSAqLwotCQljbWQtPmRhdGFbMl0gfD0gQ01EX0lOVl9JT01NVV9QQUdFU19TSVpFX01BU0s7Ci0JaWYgKHBkZSkgLyogUERFIGJpdCAtIHdlIHdhbid0IGZsdXNoIGV2ZXJ5dGhpbmcgbm90IG9ubHkgdGhlIFBURXMgKi8KLQkJY21kLT5kYXRhWzJdIHw9IENNRF9JTlZfSU9NTVVfUEFHRVNfUERFX01BU0s7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ1aWxkX2ludl9pb3RsYl9wYWdlcyhzdHJ1Y3QgaW9tbXVfY21kICpjbWQsIHUxNiBkZXZpZCwgaW50IHFkZXAsCi0JCQkJICB1NjQgYWRkcmVzcywgc2l6ZV90IHNpemUpCi17Ci0JdTY0IHBhZ2VzOwotCWludCBzOwotCi0JcGFnZXMgPSBpb21tdV9udW1fcGFnZXMoYWRkcmVzcywgc2l6ZSwgUEFHRV9TSVpFKTsKLQlzICAgICA9IDA7Ci0KLQlpZiAocGFnZXMgPiAxKSB7Ci0JCS8qCi0JCSAqIElmIHdlIGhhdmUgdG8gZmx1c2ggbW9yZSB0aGFuIG9uZSBwYWdlLCBmbHVzaCBhbGwKLQkJICogVExCIGVudHJpZXMgZm9yIHRoaXMgZG9tYWluCi0JCSAqLwotCQlhZGRyZXNzID0gQ01EX0lOVl9JT01NVV9BTExfUEFHRVNfQUREUkVTUzsKLQkJcyA9IDE7Ci0JfQotCi0JYWRkcmVzcyAmPSBQQUdFX01BU0s7Ci0KLQltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOwotCWNtZC0+ZGF0YVswXSAgPSBkZXZpZDsKLQljbWQtPmRhdGFbMF0gfD0gKHFkZXAgJiAweGZmKSA8PCAyNDsKLQljbWQtPmRhdGFbMV0gID0gZGV2aWQ7Ci0JY21kLT5kYXRhWzJdICA9IGxvd2VyXzMyX2JpdHMoYWRkcmVzcyk7Ci0JY21kLT5kYXRhWzNdICA9IHVwcGVyXzMyX2JpdHMoYWRkcmVzcyk7Ci0JQ01EX1NFVF9UWVBFKGNtZCwgQ01EX0lOVl9JT1RMQl9QQUdFUyk7Ci0JaWYgKHMpCi0JCWNtZC0+ZGF0YVsyXSB8PSBDTURfSU5WX0lPTU1VX1BBR0VTX1NJWkVfTUFTSzsKLX0KLQotc3RhdGljIHZvaWQgYnVpbGRfaW52X2FsbChzdHJ1Y3QgaW9tbXVfY21kICpjbWQpCi17Ci0JbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKLQlDTURfU0VUX1RZUEUoY21kLCBDTURfSU5WX0FMTCk7Ci19Ci0KLS8qCi0gKiBXcml0ZXMgdGhlIGNvbW1hbmQgdG8gdGhlIElPTU1VcyBjb21tYW5kIGJ1ZmZlciBhbmQgaW5mb3JtcyB0aGUKLSAqIGhhcmR3YXJlIGFib3V0IHRoZSBuZXcgY29tbWFuZC4KLSAqLwotc3RhdGljIGludCBpb21tdV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCBzdHJ1Y3QgaW9tbXVfY21kICpjbWQpCi17Ci0JdTMyIGxlZnQsIHRhaWwsIGhlYWQsIG5leHRfdGFpbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JV0FSTl9PTihpb21tdS0+Y21kX2J1Zl9zaXplICYgQ01EX0JVRkZFUl9VTklOSVRJQUxJWkVEKTsKLQotYWdhaW46Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0KLQloZWFkICAgICAgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19DTURfSEVBRF9PRkZTRVQpOwotCXRhaWwgICAgICA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9UQUlMX09GRlNFVCk7Ci0JbmV4dF90YWlsID0gKHRhaWwgKyBzaXplb2YoKmNtZCkpICUgaW9tbXUtPmNtZF9idWZfc2l6ZTsKLQlsZWZ0ICAgICAgPSAoaGVhZCAtIG5leHRfdGFpbCkgJSBpb21tdS0+Y21kX2J1Zl9zaXplOwotCi0JaWYgKGxlZnQgPD0gMikgewotCQlzdHJ1Y3QgaW9tbXVfY21kIHN5bmNfY21kOwotCQl2b2xhdGlsZSB1NjQgc2VtID0gMDsKLQkJaW50IHJldDsKLQotCQlidWlsZF9jb21wbGV0aW9uX3dhaXQoJnN5bmNfY21kLCAodTY0KSZzZW0pOwotCQljb3B5X2NtZF90b19idWZmZXIoaW9tbXUsICZzeW5jX2NtZCwgdGFpbCk7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoKHJldCA9IHdhaXRfb25fc2VtKCZzZW0pKSAhPSAwKQotCQkJcmV0dXJuIHJldDsKLQotCQlnb3RvIGFnYWluOwotCX0KLQotCWNvcHlfY21kX3RvX2J1ZmZlcihpb21tdSwgY21kLCB0YWlsKTsKLQotCS8qIFdlIG5lZWQgdG8gc3luYyBub3cgdG8gbWFrZSBzdXJlIGFsbCBjb21tYW5kcyBhcmUgcHJvY2Vzc2VkICovCi0JaW9tbXUtPm5lZWRfc3luYyA9IHRydWU7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHF1ZXVlcyBhIGNvbXBsZXRpb24gd2FpdCBjb21tYW5kIGludG8gdGhlIGNvbW1hbmQKLSAqIGJ1ZmZlciBvZiBhbiBJT01NVQotICovCi1zdGF0aWMgaW50IGlvbW11X2NvbXBsZXRpb25fd2FpdChzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKLXsKLQlzdHJ1Y3QgaW9tbXVfY21kIGNtZDsKLQl2b2xhdGlsZSB1NjQgc2VtID0gMDsKLQlpbnQgcmV0OwotCi0JaWYgKCFpb21tdS0+bmVlZF9zeW5jKQotCQlyZXR1cm4gMDsKLQotCWJ1aWxkX2NvbXBsZXRpb25fd2FpdCgmY21kLCAodTY0KSZzZW0pOwotCi0JcmV0ID0gaW9tbXVfcXVldWVfY29tbWFuZChpb21tdSwgJmNtZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiB3YWl0X29uX3NlbSgmc2VtKTsKLX0KLQotc3RhdGljIGludCBpb21tdV9mbHVzaF9kdGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHUxNiBkZXZpZCkKLXsKLQlzdHJ1Y3QgaW9tbXVfY21kIGNtZDsKLQotCWJ1aWxkX2ludl9kdGUoJmNtZCwgZGV2aWQpOwotCi0JcmV0dXJuIGlvbW11X3F1ZXVlX2NvbW1hbmQoaW9tbXUsICZjbWQpOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV9mbHVzaF9kdGVfYWxsKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQotewotCXUzMiBkZXZpZDsKLQotCWZvciAoZGV2aWQgPSAwOyBkZXZpZCA8PSAweGZmZmY7ICsrZGV2aWQpCi0JCWlvbW11X2ZsdXNoX2R0ZShpb21tdSwgZGV2aWQpOwotCi0JaW9tbXVfY29tcGxldGlvbl93YWl0KGlvbW11KTsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gdXNlcyBoZWF2eSBsb2NraW5nIGFuZCBtYXkgZGlzYWJsZSBpcnFzIGZvciBzb21lIHRpbWUuIEJ1dAotICogdGhpcyBpcyBubyBpc3N1ZSBiZWNhdXNlIGl0IGlzIG9ubHkgY2FsbGVkIGR1cmluZyByZXN1bWUuCi0gKi8KLXN0YXRpYyB2b2lkIGlvbW11X2ZsdXNoX3RsYl9hbGwoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCi17Ci0JdTMyIGRvbV9pZDsKLQotCWZvciAoZG9tX2lkID0gMDsgZG9tX2lkIDw9IDB4ZmZmZjsgKytkb21faWQpIHsKLQkJc3RydWN0IGlvbW11X2NtZCBjbWQ7Ci0JCWJ1aWxkX2ludl9pb21tdV9wYWdlcygmY21kLCAwLCBDTURfSU5WX0lPTU1VX0FMTF9QQUdFU19BRERSRVNTLAotCQkJCSAgICAgIGRvbV9pZCwgMSk7Ci0JCWlvbW11X3F1ZXVlX2NvbW1hbmQoaW9tbXUsICZjbWQpOwotCX0KLQotCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbW11X2ZsdXNoX2FsbChzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKLXsKLQlzdHJ1Y3QgaW9tbXVfY21kIGNtZDsKLQotCWJ1aWxkX2ludl9hbGwoJmNtZCk7Ci0KLQlpb21tdV9xdWV1ZV9jb21tYW5kKGlvbW11LCAmY21kKTsKLQlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOwotfQotCi12b2lkIGlvbW11X2ZsdXNoX2FsbF9jYWNoZXMoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCi17Ci0JaWYgKGlvbW11X2ZlYXR1cmUoaW9tbXUsIEZFQVRVUkVfSUEpKSB7Ci0JCWlvbW11X2ZsdXNoX2FsbChpb21tdSk7Ci0JfSBlbHNlIHsKLQkJaW9tbXVfZmx1c2hfZHRlX2FsbChpb21tdSk7Ci0JCWlvbW11X2ZsdXNoX3RsYl9hbGwoaW9tbXUpOwotCX0KLX0KLQotLyoKLSAqIENvbW1hbmQgc2VuZCBmdW5jdGlvbiBmb3IgZmx1c2hpbmcgb24tZGV2aWNlIFRMQgotICovCi1zdGF0aWMgaW50IGRldmljZV9mbHVzaF9pb3RsYihzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBhZGRyZXNzLCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKLQlzdHJ1Y3QgaW9tbXVfY21kIGNtZDsKLQl1MTYgZGV2aWQ7Ci0JaW50IHFkZXA7Ci0KLQlxZGVwICA9IHBjaV9hdHNfcXVldWVfZGVwdGgocGRldik7Ci0JZGV2aWQgPSBnZXRfZGV2aWNlX2lkKGRldik7Ci0JaW9tbXUgPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtkZXZpZF07Ci0KLQlidWlsZF9pbnZfaW90bGJfcGFnZXMoJmNtZCwgZGV2aWQsIHFkZXAsIGFkZHJlc3MsIHNpemUpOwotCi0JcmV0dXJuIGlvbW11X3F1ZXVlX2NvbW1hbmQoaW9tbXUsICZjbWQpOwotfQotCi0vKgotICogQ29tbWFuZCBzZW5kIGZ1bmN0aW9uIGZvciBpbnZhbGlkYXRpbmcgYSBkZXZpY2UgdGFibGUgZW50cnkKLSAqLwotc3RhdGljIGludCBkZXZpY2VfZmx1c2hfZHRlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQl1MTYgZGV2aWQ7Ci0JaW50IHJldDsKLQotCXBkZXYgID0gdG9fcGNpX2RldihkZXYpOwotCWRldmlkID0gZ2V0X2RldmljZV9pZChkZXYpOwotCWlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOwotCi0JcmV0ID0gaW9tbXVfZmx1c2hfZHRlKGlvbW11LCBkZXZpZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChwY2lfYXRzX2VuYWJsZWQocGRldikpCi0JCXJldCA9IGRldmljZV9mbHVzaF9pb3RsYihkZXYsIDAsIH4wVUwpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFRMQiBpbnZhbGlkYXRpb24gZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGZyb20gdGhlIG1hcHBpbmcgZnVuY3Rpb25zLgotICogSXQgaW52YWxpZGF0ZXMgYSBzaW5nbGUgUFRFIGlmIHRoZSByYW5nZSB0byBmbHVzaCBpcyB3aXRoaW4gYSBzaW5nbGUKLSAqIHBhZ2UuIE90aGVyd2lzZSBpdCBmbHVzaGVzIHRoZSB3aG9sZSBUTEIgb2YgdGhlIElPTU1VLgotICovCi1zdGF0aWMgdm9pZCBfX2RvbWFpbl9mbHVzaF9wYWdlcyhzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiwKLQkJCQkgdTY0IGFkZHJlc3MsIHNpemVfdCBzaXplLCBpbnQgcGRlKQotewotCXN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGE7Ci0Jc3RydWN0IGlvbW11X2NtZCBjbWQ7Ci0JaW50IHJldCA9IDAsIGk7Ci0KLQlidWlsZF9pbnZfaW9tbXVfcGFnZXMoJmNtZCwgYWRkcmVzcywgc2l6ZSwgZG9tYWluLT5pZCwgcGRlKTsKLQotCWZvciAoaSA9IDA7IGkgPCBhbWRfaW9tbXVzX3ByZXNlbnQ7ICsraSkgewotCQlpZiAoIWRvbWFpbi0+ZGV2X2lvbW11W2ldKQotCQkJY29udGludWU7Ci0KLQkJLyoKLQkJICogRGV2aWNlcyBvZiB0aGlzIGRvbWFpbiBhcmUgYmVoaW5kIHRoaXMgSU9NTVUKLQkJICogV2UgbmVlZCBhIFRMQiBmbHVzaAotCQkgKi8KLQkJcmV0IHw9IGlvbW11X3F1ZXVlX2NvbW1hbmQoYW1kX2lvbW11c1tpXSwgJmNtZCk7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfZGF0YSwgJmRvbWFpbi0+ZGV2X2xpc3QsIGxpc3QpIHsKLQkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldl9kYXRhLT5kZXYpOwotCi0JCWlmICghcGNpX2F0c19lbmFibGVkKHBkZXYpKQotCQkJY29udGludWU7Ci0KLQkJcmV0IHw9IGRldmljZV9mbHVzaF9pb3RsYihkZXZfZGF0YS0+ZGV2LCBhZGRyZXNzLCBzaXplKTsKLQl9Ci0KLQlXQVJOX09OKHJldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvbWFpbl9mbHVzaF9wYWdlcyhzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiwKLQkJCSAgICAgICB1NjQgYWRkcmVzcywgc2l6ZV90IHNpemUpCi17Ci0JX19kb21haW5fZmx1c2hfcGFnZXMoZG9tYWluLCBhZGRyZXNzLCBzaXplLCAwKTsKLX0KLQotLyogRmx1c2ggdGhlIHdob2xlIElPL1RMQiBmb3IgYSBnaXZlbiBwcm90ZWN0aW9uIGRvbWFpbiAqLwotc3RhdGljIHZvaWQgZG9tYWluX2ZsdXNoX3RsYihzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKLXsKLQlfX2RvbWFpbl9mbHVzaF9wYWdlcyhkb21haW4sIDAsIENNRF9JTlZfSU9NTVVfQUxMX1BBR0VTX0FERFJFU1MsIDApOwotfQotCi0vKiBGbHVzaCB0aGUgd2hvbGUgSU8vVExCIGZvciBhIGdpdmVuIHByb3RlY3Rpb24gZG9tYWluIC0gaW5jbHVkaW5nIFBERSAqLwotc3RhdGljIHZvaWQgZG9tYWluX2ZsdXNoX3RsYl9wZGUoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCi17Ci0JX19kb21haW5fZmx1c2hfcGFnZXMoZG9tYWluLCAwLCBDTURfSU5WX0lPTU1VX0FMTF9QQUdFU19BRERSRVNTLCAxKTsKLX0KLQotc3RhdGljIHZvaWQgZG9tYWluX2ZsdXNoX2NvbXBsZXRlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGFtZF9pb21tdXNfcHJlc2VudDsgKytpKSB7Ci0JCWlmICghZG9tYWluLT5kZXZfaW9tbXVbaV0pCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiBEZXZpY2VzIG9mIHRoaXMgZG9tYWluIGFyZSBiZWhpbmQgdGhpcyBJT01NVQotCQkgKiBXZSBuZWVkIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24gb2YgYWxsIGNvbW1hbmRzLgotCQkgKi8KLQkJaW9tbXVfY29tcGxldGlvbl93YWl0KGFtZF9pb21tdXNbaV0pOwotCX0KLX0KLQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBmbHVzaGVzIHRoZSBEVEVzIGZvciBhbGwgZGV2aWNlcyBpbiBkb21haW4KLSAqLwotc3RhdGljIHZvaWQgZG9tYWluX2ZsdXNoX2RldmljZXMoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCi17Ci0Jc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfZGF0YSwgJmRvbWFpbi0+ZGV2X2xpc3QsIGxpc3QpCi0JCWRldmljZV9mbHVzaF9kdGUoZGV2X2RhdGEtPmRldik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSB1c2VkIHRoZSBjcmVhdGUgdGhlIHBhZ2UgdGFibGUgbWFwcGluZ3MgZm9yCi0gKiB1bml0eSBtYXBwZWQgcmVnaW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgYW5vdGhlciBsZXZlbCB0byBhbiBJTyBwYWdlIHRhYmxlLiBBZGRpbmcKLSAqIGFub3RoZXIgbGV2ZWwgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBhZGRyZXNzIHNwYWNlIGJ5IDkgYml0cyB0byBhIHNpemUgdXAKLSAqIHRvIDY0IGJpdHMuCi0gKi8KLXN0YXRpYyBib29sIGluY3JlYXNlX2FkZHJlc3Nfc3BhY2Uoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4sCi0JCQkJICAgZ2ZwX3QgZ2ZwKQotewotCXU2NCAqcHRlOwotCi0JaWYgKGRvbWFpbi0+bW9kZSA9PSBQQUdFX01PREVfNl9MRVZFTCkKLQkJLyogYWRkcmVzcyBzcGFjZSBhbHJlYWR5IDY0IGJpdCBsYXJnZSAqLwotCQlyZXR1cm4gZmFsc2U7Ci0KLQlwdGUgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShnZnApOwotCWlmICghcHRlKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkqcHRlICAgICAgICAgICAgID0gUE1fTEVWRUxfUERFKGRvbWFpbi0+bW9kZSwKLQkJCQkJdmlydF90b19waHlzKGRvbWFpbi0+cHRfcm9vdCkpOwotCWRvbWFpbi0+cHRfcm9vdCAgPSBwdGU7Ci0JZG9tYWluLT5tb2RlICAgICs9IDE7Ci0JZG9tYWluLT51cGRhdGVkICA9IHRydWU7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHU2NCAqYWxsb2NfcHRlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluLAotCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplLAotCQkgICAgICB1NjQgKipwdGVfcGFnZSwKLQkJICAgICAgZ2ZwX3QgZ2ZwKQotewotCWludCBsZXZlbCwgZW5kX2x2bDsKLQl1NjQgKnB0ZSwgKnBhZ2U7Ci0KLQlCVUdfT04oIWlzX3Bvd2VyX29mXzIocGFnZV9zaXplKSk7Ci0KLQl3aGlsZSAoYWRkcmVzcyA+IFBNX0xFVkVMX1NJWkUoZG9tYWluLT5tb2RlKSkKLQkJaW5jcmVhc2VfYWRkcmVzc19zcGFjZShkb21haW4sIGdmcCk7Ci0KLQlsZXZlbCAgID0gZG9tYWluLT5tb2RlIC0gMTsKLQlwdGUgICAgID0gJmRvbWFpbi0+cHRfcm9vdFtQTV9MRVZFTF9JTkRFWChsZXZlbCwgYWRkcmVzcyldOwotCWFkZHJlc3MgPSBQQUdFX1NJWkVfQUxJR04oYWRkcmVzcywgcGFnZV9zaXplKTsKLQllbmRfbHZsID0gUEFHRV9TSVpFX0xFVkVMKHBhZ2Vfc2l6ZSk7Ci0KLQl3aGlsZSAobGV2ZWwgPiBlbmRfbHZsKSB7Ci0JCWlmICghSU9NTVVfUFRFX1BSRVNFTlQoKnB0ZSkpIHsKLQkJCXBhZ2UgPSAodTY0ICopZ2V0X3plcm9lZF9wYWdlKGdmcCk7Ci0JCQlpZiAoIXBhZ2UpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQkqcHRlID0gUE1fTEVWRUxfUERFKGxldmVsLCB2aXJ0X3RvX3BoeXMocGFnZSkpOwotCQl9Ci0KLQkJLyogTm8gbGV2ZWwgc2tpcHBpbmcgc3VwcG9ydCB5ZXQgKi8KLQkJaWYgKFBNX1BURV9MRVZFTCgqcHRlKSAhPSBsZXZlbCkKLQkJCXJldHVybiBOVUxMOwotCi0JCWxldmVsIC09IDE7Ci0KLQkJcHRlID0gSU9NTVVfUFRFX1BBR0UoKnB0ZSk7Ci0KLQkJaWYgKHB0ZV9wYWdlICYmIGxldmVsID09IGVuZF9sdmwpCi0JCQkqcHRlX3BhZ2UgPSBwdGU7Ci0KLQkJcHRlID0gJnB0ZVtQTV9MRVZFTF9JTkRFWChsZXZlbCwgYWRkcmVzcyldOwotCX0KLQotCXJldHVybiBwdGU7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGVyZSBpcyBhIFBURSBmb3IgYSBnaXZlbiBkbWEgYWRkcmVzcy4gSWYKLSAqIHRoZXJlIGlzIG9uZSwgaXQgcmV0dXJucyB0aGUgcG9pbnRlciB0byBpdC4KLSAqLwotc3RhdGljIHU2NCAqZmV0Y2hfcHRlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCi17Ci0JaW50IGxldmVsOwotCXU2NCAqcHRlOwotCi0JaWYgKGFkZHJlc3MgPiBQTV9MRVZFTF9TSVpFKGRvbWFpbi0+bW9kZSkpCi0JCXJldHVybiBOVUxMOwotCi0JbGV2ZWwgICA9ICBkb21haW4tPm1vZGUgLSAxOwotCXB0ZSAgICAgPSAmZG9tYWluLT5wdF9yb290W1BNX0xFVkVMX0lOREVYKGxldmVsLCBhZGRyZXNzKV07Ci0KLQl3aGlsZSAobGV2ZWwgPiAwKSB7Ci0KLQkJLyogTm90IFByZXNlbnQgKi8KLQkJaWYgKCFJT01NVV9QVEVfUFJFU0VOVCgqcHRlKSkKLQkJCXJldHVybiBOVUxMOwotCi0JCS8qIExhcmdlIFBURSAqLwotCQlpZiAoUE1fUFRFX0xFVkVMKCpwdGUpID09IDB4MDcpIHsKLQkJCXVuc2lnbmVkIGxvbmcgcHRlX21hc2ssIF9fcHRlOwotCi0JCQkvKgotCQkJICogSWYgd2UgaGF2ZSBhIHNlcmllcyBvZiBsYXJnZSBQVEVzLCBtYWtlCi0JCQkgKiBzdXJlIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG9uZS4KLQkJCSAqLwotCQkJcHRlX21hc2sgPSBQVEVfUEFHRV9TSVpFKCpwdGUpOwotCQkJcHRlX21hc2sgPSB+KChQQUdFX1NJWkVfUFRFX0NPVU5UKHB0ZV9tYXNrKSA8PCAzKSAtIDEpOwotCQkJX19wdGUgICAgPSAoKHVuc2lnbmVkIGxvbmcpcHRlKSAmIHB0ZV9tYXNrOwotCi0JCQlyZXR1cm4gKHU2NCAqKV9fcHRlOwotCQl9Ci0KLQkJLyogTm8gbGV2ZWwgc2tpcHBpbmcgc3VwcG9ydCB5ZXQgKi8KLQkJaWYgKFBNX1BURV9MRVZFTCgqcHRlKSAhPSBsZXZlbCkKLQkJCXJldHVybiBOVUxMOwotCi0JCWxldmVsIC09IDE7Ci0KLQkJLyogV2FsayB0byB0aGUgbmV4dCBsZXZlbCAqLwotCQlwdGUgPSBJT01NVV9QVEVfUEFHRSgqcHRlKTsKLQkJcHRlID0gJnB0ZVtQTV9MRVZFTF9JTkRFWChsZXZlbCwgYWRkcmVzcyldOwotCX0KLQotCXJldHVybiBwdGU7Ci19Ci0KLS8qCi0gKiBHZW5lcmljIG1hcHBpbmcgZnVuY3Rpb25zLiBJdCBtYXBzIGEgcGh5c2ljYWwgYWRkcmVzcyBpbnRvIGEgRE1BCi0gKiBhZGRyZXNzIHNwYWNlLiBJdCBhbGxvY2F0ZXMgdGhlIHBhZ2UgdGFibGUgcGFnZXMgaWYgbmVjZXNzYXJ5LgotICogSW4gdGhlIGZ1dHVyZSBpdCBjYW4gYmUgZXh0ZW5kZWQgdG8gYSBnZW5lcmljIG1hcHBpbmcgZnVuY3Rpb24KLSAqIHN1cHBvcnRpbmcgYWxsIGZlYXR1cmVzIG9mIEFNRCBJT01NVSBwYWdlIHRhYmxlcyBsaWtlIGxldmVsIHNraXBwaW5nCi0gKiBhbmQgZnVsbCA2NCBiaXQgYWRkcmVzcyBzcGFjZXMuCi0gKi8KLXN0YXRpYyBpbnQgaW9tbXVfbWFwX3BhZ2Uoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb20sCi0JCQkgIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCi0JCQkgIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAotCQkJICBpbnQgcHJvdCwKLQkJCSAgdW5zaWduZWQgbG9uZyBwYWdlX3NpemUpCi17Ci0JdTY0IF9fcHRlLCAqcHRlOwotCWludCBpLCBjb3VudDsKLQotCWlmICghKHByb3QgJiBJT01NVV9QUk9UX01BU0spKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJ1c19hZGRyICA9IFBBR0VfQUxJR04oYnVzX2FkZHIpOwotCXBoeXNfYWRkciA9IFBBR0VfQUxJR04ocGh5c19hZGRyKTsKLQljb3VudCAgICAgPSBQQUdFX1NJWkVfUFRFX0NPVU5UKHBhZ2Vfc2l6ZSk7Ci0JcHRlICAgICAgID0gYWxsb2NfcHRlKGRvbSwgYnVzX2FkZHIsIHBhZ2Vfc2l6ZSwgTlVMTCwgR0ZQX0tFUk5FTCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKLQkJaWYgKElPTU1VX1BURV9QUkVTRU5UKHB0ZVtpXSkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKHBhZ2Vfc2l6ZSA+IFBBR0VfU0laRSkgewotCQlfX3B0ZSA9IFBBR0VfU0laRV9QVEUocGh5c19hZGRyLCBwYWdlX3NpemUpOwotCQlfX3B0ZSB8PSBQTV9MRVZFTF9FTkMoNykgfCBJT01NVV9QVEVfUCB8IElPTU1VX1BURV9GQzsKLQl9IGVsc2UKLQkJX19wdGUgPSBwaHlzX2FkZHIgfCBJT01NVV9QVEVfUCB8IElPTU1VX1BURV9GQzsKLQotCWlmIChwcm90ICYgSU9NTVVfUFJPVF9JUikKLQkJX19wdGUgfD0gSU9NTVVfUFRFX0lSOwotCWlmIChwcm90ICYgSU9NTVVfUFJPVF9JVykKLQkJX19wdGUgfD0gSU9NTVVfUFRFX0lXOwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCi0JCXB0ZVtpXSA9IF9fcHRlOwotCi0JdXBkYXRlX2RvbWFpbihkb20pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlvbW11X3VubWFwX3BhZ2Uoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb20sCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdW5tYXBfc2l6ZSwgdW5tYXBwZWQ7Ci0JdTY0ICpwdGU7Ci0KLQlCVUdfT04oIWlzX3Bvd2VyX29mXzIocGFnZV9zaXplKSk7Ci0KLQl1bm1hcHBlZCA9IDA7Ci0KLQl3aGlsZSAodW5tYXBwZWQgPCBwYWdlX3NpemUpIHsKLQotCQlwdGUgPSBmZXRjaF9wdGUoZG9tLCBidXNfYWRkcik7Ci0KLQkJaWYgKCFwdGUpIHsKLQkJCS8qCi0JCQkgKiBObyBQVEUgZm9yIHRoaXMgYWRkcmVzcwotCQkJICogbW92ZSBmb3J3YXJkIGluIDRrYiBzdGVwcwotCQkJICovCi0JCQl1bm1hcF9zaXplID0gUEFHRV9TSVpFOwotCQl9IGVsc2UgaWYgKFBNX1BURV9MRVZFTCgqcHRlKSA9PSAwKSB7Ci0JCQkvKiA0a2IgUFRFIGZvdW5kIGZvciB0aGlzIGFkZHJlc3MgKi8KLQkJCXVubWFwX3NpemUgPSBQQUdFX1NJWkU7Ci0JCQkqcHRlICAgICAgID0gMFVMTDsKLQkJfSBlbHNlIHsKLQkJCWludCBjb3VudCwgaTsKLQotCQkJLyogTGFyZ2UgUFRFIGZvdW5kIHdoaWNoIG1hcHMgdGhpcyBhZGRyZXNzICovCi0JCQl1bm1hcF9zaXplID0gUFRFX1BBR0VfU0laRSgqcHRlKTsKLQkJCWNvdW50ICAgICAgPSBQQUdFX1NJWkVfUFRFX0NPVU5UKHVubWFwX3NpemUpOwotCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCQkJcHRlW2ldID0gMFVMTDsKLQkJfQotCi0JCWJ1c19hZGRyICA9IChidXNfYWRkciAmIH4odW5tYXBfc2l6ZSAtIDEpKSArIHVubWFwX3NpemU7Ci0JCXVubWFwcGVkICs9IHVubWFwX3NpemU7Ci0JfQotCi0JQlVHX09OKCFpc19wb3dlcl9vZl8yKHVubWFwcGVkKSk7Ci0KLQlyZXR1cm4gdW5tYXBwZWQ7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBhIHNwZWNpZmljIHVuaXR5IG1hcHBpbmcgZW50cnkgaXMgbmVlZGVkIGZvcgotICogdGhpcyBzcGVjaWZpYyBJT01NVS4KLSAqLwotc3RhdGljIGludCBpb21tdV9mb3JfdW5pdHlfbWFwKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LAotCQkJICAgICAgIHN0cnVjdCB1bml0eV9tYXBfZW50cnkgKmVudHJ5KQotewotCXUxNiBiZGYsIGk7Ci0KLQlmb3IgKGkgPSBlbnRyeS0+ZGV2aWRfc3RhcnQ7IGkgPD0gZW50cnktPmRldmlkX2VuZDsgKytpKSB7Ci0JCWJkZiA9IGFtZF9pb21tdV9hbGlhc190YWJsZVtpXTsKLQkJaWYgKGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2JkZl0gPT0gaW9tbXUpCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgYXBwbGllcyB0aGUgbWFwcGluZyB0byB0aGUgcGFnZSB0YWJsZSBvZiB0aGUKLSAqIGRtYV9vcHMgZG9tYWluLgotICovCi1zdGF0aWMgaW50IGRtYV9vcHNfdW5pdHlfbWFwKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX2RvbSwKLQkJCSAgICAgc3RydWN0IHVuaXR5X21hcF9lbnRyeSAqZSkKLXsKLQl1NjQgYWRkcjsKLQlpbnQgcmV0OwotCi0JZm9yIChhZGRyID0gZS0+YWRkcmVzc19zdGFydDsgYWRkciA8IGUtPmFkZHJlc3NfZW5kOwotCSAgICAgYWRkciArPSBQQUdFX1NJWkUpIHsKLQkJcmV0ID0gaW9tbXVfbWFwX3BhZ2UoJmRtYV9kb20tPmRvbWFpbiwgYWRkciwgYWRkciwgZS0+cHJvdCwKLQkJCQkgICAgIFBBR0VfU0laRSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCQkvKgotCQkgKiBpZiB1bml0eSBtYXBwaW5nIGlzIGluIGFwZXJ0dXJlIHJhbmdlIG1hcmsgdGhlIHBhZ2UKLQkJICogYXMgYWxsb2NhdGVkIGluIHRoZSBhcGVydHVyZQotCQkgKi8KLQkJaWYgKGFkZHIgPCBkbWFfZG9tLT5hcGVydHVyZV9zaXplKQotCQkJX19zZXRfYml0KGFkZHIgPj4gUEFHRV9TSElGVCwKLQkJCQkgIGRtYV9kb20tPmFwZXJ0dXJlWzBdLT5iaXRtYXApOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogSW5pdCB0aGUgdW5pdHkgbWFwcGluZ3MgZm9yIGEgc3BlY2lmaWMgSU9NTVUgaW4gdGhlIHN5c3RlbQotICoKLSAqIEJhc2ljYWxseSBpdGVyYXRlcyBvdmVyIGFsbCB1bml0eSBtYXBwaW5nIGVudHJpZXMgYW5kIGFwcGxpZXMgdGhlbSB0bwotICogdGhlIGRlZmF1bHQgZG9tYWluIERNQSBvZiB0aGF0IElPTU1VIGlmIG5lY2Vzc2FyeS4KLSAqLwotc3RhdGljIGludCBpb21tdV9pbml0X3VuaXR5X21hcHBpbmdzKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQotewotCXN0cnVjdCB1bml0eV9tYXBfZW50cnkgKmVudHJ5OwotCWludCByZXQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmYW1kX2lvbW11X3VuaXR5X21hcCwgbGlzdCkgewotCQlpZiAoIWlvbW11X2Zvcl91bml0eV9tYXAoaW9tbXUsIGVudHJ5KSkKLQkJCWNvbnRpbnVlOwotCQlyZXQgPSBkbWFfb3BzX3VuaXR5X21hcChpb21tdS0+ZGVmYXVsdF9kb20sIGVudHJ5KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBJbml0cyB0aGUgdW5pdHkgbWFwcGluZ3MgcmVxdWlyZWQgZm9yIGEgc3BlY2lmaWMgZGV2aWNlCi0gKi8KLXN0YXRpYyBpbnQgaW5pdF91bml0eV9tYXBwaW5nc19mb3JfZGV2aWNlKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX2RvbSwKLQkJCQkJICB1MTYgZGV2aWQpCi17Ci0Jc3RydWN0IHVuaXR5X21hcF9lbnRyeSAqZTsKLQlpbnQgcmV0OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmYW1kX2lvbW11X3VuaXR5X21hcCwgbGlzdCkgewotCQlpZiAoIShkZXZpZCA+PSBlLT5kZXZpZF9zdGFydCAmJiBkZXZpZCA8PSBlLT5kZXZpZF9lbmQpKQotCQkJY29udGludWU7Ci0JCXJldCA9IGRtYV9vcHNfdW5pdHlfbWFwKGRtYV9kb20sIGUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGUgbmV4dCBmdW5jdGlvbnMgYmVsb25nIHRvIHRoZSBhZGRyZXNzIGFsbG9jYXRvciBmb3IgdGhlIGRtYV9vcHMKLSAqIGludGVyZmFjZSBmdW5jdGlvbnMuIFRoZXkgd29yayBsaWtlIHRoZSBhbGxvY2F0b3JzIGluIHRoZSBvdGhlciBJT01NVQotICogZHJpdmVycy4gSXRzIGJhc2ljYWxseSBhIGJpdG1hcCB3aGljaCBtYXJrcyB0aGUgYWxsb2NhdGVkIHBhZ2VzIGluCi0gKiB0aGUgYXBlcnR1cmUuIE1heWJlIGl0IGNvdWxkIGJlIGVuaGFuY2VkIGluIHRoZSBmdXR1cmUgdG8gYSBtb3JlCi0gKiBlZmZpY2llbnQgYWxsb2NhdG9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVGhlIGFkZHJlc3MgYWxsb2NhdG9yIGNvcmUgZnVuY3Rpb25zLgotICoKLSAqIGNhbGxlZCB3aXRoIGRvbWFpbi0+bG9jayBoZWxkCi0gKi8KLQotLyoKLSAqIFVzZWQgdG8gcmVzZXJ2ZSBhZGRyZXNzIHJhbmdlcyBpbiB0aGUgYXBlcnR1cmUgKGUuZy4gZm9yIGV4Y2x1c2lvbgotICogcmFuZ2VzLgotICovCi1zdGF0aWMgdm9pZCBkbWFfb3BzX3Jlc2VydmVfYWRkcmVzc2VzKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGFnZSwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgcGFnZXMpCi17Ci0JdW5zaWduZWQgaW50IGksIGxhc3RfcGFnZSA9IGRvbS0+YXBlcnR1cmVfc2l6ZSA+PiBQQUdFX1NISUZUOwotCi0JaWYgKHN0YXJ0X3BhZ2UgKyBwYWdlcyA+IGxhc3RfcGFnZSkKLQkJcGFnZXMgPSBsYXN0X3BhZ2UgLSBzdGFydF9wYWdlOwotCi0JZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IHN0YXJ0X3BhZ2UgKyBwYWdlczsgKytpKSB7Ci0JCWludCBpbmRleCA9IGkgLyBBUEVSVFVSRV9SQU5HRV9QQUdFUzsKLQkJaW50IHBhZ2UgID0gaSAlIEFQRVJUVVJFX1JBTkdFX1BBR0VTOwotCQlfX3NldF9iaXQocGFnZSwgZG9tLT5hcGVydHVyZVtpbmRleF0tPmJpdG1hcCk7Ci0JfQotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBhIG5ldyBhcGVydHVyZSByYW5nZSB0byBhbiBleGlzdGluZwotICogYXBlcnR1cmUgaW4gY2FzZSBvZiBkbWFfb3BzIGRvbWFpbiBhbGxvY2F0aW9uIG9yIGFkZHJlc3MgYWxsb2NhdGlvbgotICogZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBhbGxvY19uZXdfcmFuZ2Uoc3RydWN0IGRtYV9vcHNfZG9tYWluICpkbWFfZG9tLAotCQkJICAgYm9vbCBwb3B1bGF0ZSwgZ2ZwX3QgZ2ZwKQotewotCWludCBpbmRleCA9IGRtYV9kb20tPmFwZXJ0dXJlX3NpemUgPj4gQVBFUlRVUkVfUkFOR0VfU0hJRlQ7Ci0Jc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7Ci0JdW5zaWduZWQgbG9uZyBpOwotCi0jaWZkZWYgQ09ORklHX0lPTU1VX1NUUkVTUwotCXBvcHVsYXRlID0gZmFsc2U7Ci0jZW5kaWYKLQotCWlmIChpbmRleCA+PSBBUEVSVFVSRV9NQVhfUkFOR0VTKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcGVydHVyZV9yYW5nZSksIGdmcCk7Ci0JaWYgKCFkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdLT5iaXRtYXAgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShnZnApOwotCWlmICghZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdLT5iaXRtYXApCi0JCWdvdG8gb3V0X2ZyZWU7Ci0KLQlkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0tPm9mZnNldCA9IGRtYV9kb20tPmFwZXJ0dXJlX3NpemU7Ci0KLQlpZiAocG9wdWxhdGUpIHsKLQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZTsKLQkJaW50IGksIG51bV9wdGVzID0gQVBFUlRVUkVfUkFOR0VfUEFHRVMgLyA1MTI7Ci0JCXU2NCAqcHRlLCAqcHRlX3BhZ2U7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG51bV9wdGVzOyArK2kpIHsKLQkJCXB0ZSA9IGFsbG9jX3B0ZSgmZG1hX2RvbS0+ZG9tYWluLCBhZGRyZXNzLCBQQUdFX1NJWkUsCi0JCQkJCSZwdGVfcGFnZSwgZ2ZwKTsKLQkJCWlmICghcHRlKQotCQkJCWdvdG8gb3V0X2ZyZWU7Ci0KLQkJCWRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XS0+cHRlX3BhZ2VzW2ldID0gcHRlX3BhZ2U7Ci0KLQkJCWFkZHJlc3MgKz0gQVBFUlRVUkVfUkFOR0VfU0laRSAvIDY0OwotCQl9Ci0JfQotCi0JZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSArPSBBUEVSVFVSRV9SQU5HRV9TSVpFOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgZXhjbHVzaW9uIHJhbmdlIGlmIG5lY2Vzc2FyeSAqLwotCWZvcl9lYWNoX2lvbW11KGlvbW11KSB7Ci0JCWlmIChpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ICYmCi0JCSAgICBpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ID49IGRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XS0+b2Zmc2V0Ci0JCSAgICAmJiBpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0IDwgZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSkgewotCQkJdW5zaWduZWQgbG9uZyBzdGFydHBhZ2U7Ci0JCQlpbnQgcGFnZXMgPSBpb21tdV9udW1fcGFnZXMoaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCwKLQkJCQkJCSAgICBpb21tdS0+ZXhjbHVzaW9uX2xlbmd0aCwKLQkJCQkJCSAgICBQQUdFX1NJWkUpOwotCQkJc3RhcnRwYWdlID0gaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCA+PiBQQUdFX1NISUZUOwotCQkJZG1hX29wc19yZXNlcnZlX2FkZHJlc3NlcyhkbWFfZG9tLCBzdGFydHBhZ2UsIHBhZ2VzKTsKLQkJfQotCX0KLQotCS8qCi0JICogQ2hlY2sgZm9yIGFyZWFzIGFscmVhZHkgbWFwcGVkIGFzIHByZXNlbnQgaW4gdGhlIG5ldyBhcGVydHVyZQotCSAqIHJhbmdlIGFuZCBtYXJrIHRob3NlIHBhZ2VzIGFzIHJlc2VydmVkIGluIHRoZSBhbGxvY2F0b3IuIFN1Y2gKLQkgKiBtYXBwaW5ncyBtYXkgYWxyZWFkeSBleGlzdCBhcyBhIHJlc3VsdCBvZiByZXF1ZXN0ZWQgdW5pdHkKLQkgKiBtYXBwaW5ncyBmb3IgZGV2aWNlcy4KLQkgKi8KLQlmb3IgKGkgPSBkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0tPm9mZnNldDsKLQkgICAgIGkgPCBkbWFfZG9tLT5hcGVydHVyZV9zaXplOwotCSAgICAgaSArPSBQQUdFX1NJWkUpIHsKLQkJdTY0ICpwdGUgPSBmZXRjaF9wdGUoJmRtYV9kb20tPmRvbWFpbiwgaSk7Ci0JCWlmICghcHRlIHx8ICFJT01NVV9QVEVfUFJFU0VOVCgqcHRlKSkKLQkJCWNvbnRpbnVlOwotCi0JCWRtYV9vcHNfcmVzZXJ2ZV9hZGRyZXNzZXMoZG1hX2RvbSwgaSA8PCBQQUdFX1NISUZULCAxKTsKLQl9Ci0KLQl1cGRhdGVfZG9tYWluKCZkbWFfZG9tLT5kb21haW4pOwotCi0JcmV0dXJuIDA7Ci0KLW91dF9mcmVlOgotCXVwZGF0ZV9kb21haW4oJmRtYV9kb20tPmRvbWFpbik7Ci0KLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdLT5iaXRtYXApOwotCi0Ja2ZyZWUoZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdKTsKLQlkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0gPSBOVUxMOwotCi0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9vcHNfYXJlYV9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tLAotCQkJCQl1bnNpZ25lZCBpbnQgcGFnZXMsCi0JCQkJCXVuc2lnbmVkIGxvbmcgYWxpZ25fbWFzaywKLQkJCQkJdTY0IGRtYV9tYXNrLAotCQkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0KQotewotCXVuc2lnbmVkIGxvbmcgbmV4dF9iaXQgPSBkb20tPm5leHRfYWRkcmVzcyAlIEFQRVJUVVJFX1JBTkdFX1NJWkU7Ci0JaW50IG1heF9pbmRleCA9IGRvbS0+YXBlcnR1cmVfc2l6ZSA+PiBBUEVSVFVSRV9SQU5HRV9TSElGVDsKLQlpbnQgaSA9IHN0YXJ0ID4+IEFQRVJUVVJFX1JBTkdFX1NISUZUOwotCXVuc2lnbmVkIGxvbmcgYm91bmRhcnlfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAtMTsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OwotCi0JbmV4dF9iaXQgPj49IFBBR0VfU0hJRlQ7Ci0KLQlib3VuZGFyeV9zaXplID0gQUxJR04oZG1hX2dldF9zZWdfYm91bmRhcnkoZGV2KSArIDEsCi0JCQlQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7Ci0KLQlmb3IgKDtpIDwgbWF4X2luZGV4OyArK2kpIHsKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBkb20tPmFwZXJ0dXJlW2ldLT5vZmZzZXQgPj4gUEFHRV9TSElGVDsKLQotCQlpZiAoZG9tLT5hcGVydHVyZVtpXS0+b2Zmc2V0ID49IGRtYV9tYXNrKQotCQkJYnJlYWs7Ci0KLQkJbGltaXQgPSBpb21tdV9kZXZpY2VfbWF4X2luZGV4KEFQRVJUVVJFX1JBTkdFX1BBR0VTLCBvZmZzZXQsCi0JCQkJCSAgICAgICBkbWFfbWFzayA+PiBQQUdFX1NISUZUKTsKLQotCQlhZGRyZXNzID0gaW9tbXVfYXJlYV9hbGxvYyhkb20tPmFwZXJ0dXJlW2ldLT5iaXRtYXAsCi0JCQkJCSAgIGxpbWl0LCBuZXh0X2JpdCwgcGFnZXMsIDAsCi0JCQkJCSAgICBib3VuZGFyeV9zaXplLCBhbGlnbl9tYXNrKTsKLQkJaWYgKGFkZHJlc3MgIT0gLTEpIHsKLQkJCWFkZHJlc3MgPSBkb20tPmFwZXJ0dXJlW2ldLT5vZmZzZXQgKwotCQkJCSAgKGFkZHJlc3MgPDwgUEFHRV9TSElGVCk7Ci0JCQlkb20tPm5leHRfYWRkcmVzcyA9IGFkZHJlc3MgKyAocGFnZXMgPDwgUEFHRV9TSElGVCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCW5leHRfYml0ID0gMDsKLQl9Ci0KLQlyZXR1cm4gYWRkcmVzczsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX29wc19hbGxvY19hZGRyZXNzZXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICAgIHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBwYWdlcywKLQkJCQkJICAgICB1bnNpZ25lZCBsb25nIGFsaWduX21hc2ssCi0JCQkJCSAgICAgdTY0IGRtYV9tYXNrKQotewotCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLQotI2lmZGVmIENPTkZJR19JT01NVV9TVFJFU1MKLQlkb20tPm5leHRfYWRkcmVzcyA9IDA7Ci0JZG9tLT5uZWVkX2ZsdXNoID0gdHJ1ZTsKLSNlbmRpZgotCi0JYWRkcmVzcyA9IGRtYV9vcHNfYXJlYV9hbGxvYyhkZXYsIGRvbSwgcGFnZXMsIGFsaWduX21hc2ssCi0JCQkJICAgICBkbWFfbWFzaywgZG9tLT5uZXh0X2FkZHJlc3MpOwotCi0JaWYgKGFkZHJlc3MgPT0gLTEpIHsKLQkJZG9tLT5uZXh0X2FkZHJlc3MgPSAwOwotCQlhZGRyZXNzID0gZG1hX29wc19hcmVhX2FsbG9jKGRldiwgZG9tLCBwYWdlcywgYWxpZ25fbWFzaywKLQkJCQkJICAgICBkbWFfbWFzaywgMCk7Ci0JCWRvbS0+bmVlZF9mbHVzaCA9IHRydWU7Ci0JfQotCi0JaWYgKHVubGlrZWx5KGFkZHJlc3MgPT0gLTEpKQotCQlhZGRyZXNzID0gRE1BX0VSUk9SX0NPREU7Ci0KLQlXQVJOX09OKChhZGRyZXNzICsgKFBBR0VfU0laRSpwYWdlcykpID4gZG9tLT5hcGVydHVyZV9zaXplKTsKLQotCXJldHVybiBhZGRyZXNzOwotfQotCi0vKgotICogVGhlIGFkZHJlc3MgZnJlZSBmdW5jdGlvbi4KLSAqCi0gKiBjYWxsZWQgd2l0aCBkb21haW4tPmxvY2sgaGVsZAotICovCi1zdGF0aWMgdm9pZCBkbWFfb3BzX2ZyZWVfYWRkcmVzc2VzKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKLQkJCQkgICB1bnNpZ25lZCBpbnQgcGFnZXMpCi17Ci0JdW5zaWduZWQgaSA9IGFkZHJlc3MgPj4gQVBFUlRVUkVfUkFOR0VfU0hJRlQ7Ci0Jc3RydWN0IGFwZXJ0dXJlX3JhbmdlICpyYW5nZSA9IGRvbS0+YXBlcnR1cmVbaV07Ci0KLQlCVUdfT04oaSA+PSBBUEVSVFVSRV9NQVhfUkFOR0VTIHx8IHJhbmdlID09IE5VTEwpOwotCi0jaWZkZWYgQ09ORklHX0lPTU1VX1NUUkVTUwotCWlmIChpIDwgNCkKLQkJcmV0dXJuOwotI2VuZGlmCi0KLQlpZiAoYWRkcmVzcyA+PSBkb20tPm5leHRfYWRkcmVzcykKLQkJZG9tLT5uZWVkX2ZsdXNoID0gdHJ1ZTsKLQotCWFkZHJlc3MgPSAoYWRkcmVzcyAlIEFQRVJUVVJFX1JBTkdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7Ci0KLQliaXRtYXBfY2xlYXIocmFuZ2UtPmJpdG1hcCwgYWRkcmVzcywgcGFnZXMpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlIG5leHQgZnVuY3Rpb25zIGJlbG9uZyB0byB0aGUgZG9tYWluIGFsbG9jYXRpb24uIEEgZG9tYWluIGlzCi0gKiBhbGxvY2F0ZWQgZm9yIGV2ZXJ5IElPTU1VIGFzIHRoZSBkZWZhdWx0IGRvbWFpbi4gSWYgZGV2aWNlIGlzb2xhdGlvbgotICogaXMgZW5hYmxlZCwgZXZlcnkgZGV2aWNlIGdldCBpdHMgb3duIGRvbWFpbi4gVGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nCi0gKiBhYm91dCBkb21haW5zIGlzIHRoZSBwYWdlIHRhYmxlIG1hcHBpbmcgdGhlIERNQSBhZGRyZXNzIHNwYWNlIHRoZXkKLSAqIGNvbnRhaW4uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBwcm90ZWN0aW9uIGRvbWFpbiB0byB0aGUgZ2xvYmFsIHByb3RlY3Rpb24gZG9tYWluIGxpc3QKLSAqLwotc3RhdGljIHZvaWQgYWRkX2RvbWFpbl90b19saXN0KHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYW1kX2lvbW11X3BkX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZCgmZG9tYWluLT5saXN0LCAmYW1kX2lvbW11X3BkX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFtZF9pb21tdV9wZF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgYSBwcm90ZWN0aW9uIGRvbWFpbiB0byB0aGUgZ2xvYmFsCi0gKiBwcm90ZWN0aW9uIGRvbWFpbiBsaXN0Ci0gKi8KLXN0YXRpYyB2b2lkIGRlbF9kb21haW5fZnJvbV9saXN0KHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYW1kX2lvbW11X3BkX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2RlbCgmZG9tYWluLT5saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbWRfaW9tbXVfcGRfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdTE2IGRvbWFpbl9pZF9hbGxvYyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGlkOwotCi0Jd3JpdGVfbG9ja19pcnFzYXZlKCZhbWRfaW9tbXVfZGV2dGFibGVfbG9jaywgZmxhZ3MpOwotCWlkID0gZmluZF9maXJzdF96ZXJvX2JpdChhbWRfaW9tbXVfcGRfYWxsb2NfYml0bWFwLCBNQVhfRE9NQUlOX0lEKTsKLQlCVUdfT04oaWQgPT0gMCk7Ci0JaWYgKGlkID4gMCAmJiBpZCA8IE1BWF9ET01BSU5fSUQpCi0JCV9fc2V0X2JpdChpZCwgYW1kX2lvbW11X3BkX2FsbG9jX2JpdG1hcCk7Ci0JZWxzZQotCQlpZCA9IDA7Ci0Jd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gaWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvbWFpbl9pZF9mcmVlKGludCBpZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jd3JpdGVfbG9ja19pcnFzYXZlKCZhbWRfaW9tbXVfZGV2dGFibGVfbG9jaywgZmxhZ3MpOwotCWlmIChpZCA+IDAgJiYgaWQgPCBNQVhfRE9NQUlOX0lEKQotCQlfX2NsZWFyX2JpdChpZCwgYW1kX2lvbW11X3BkX2FsbG9jX2JpdG1hcCk7Ci0Jd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfcGFnZXRhYmxlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQotewotCWludCBpLCBqOwotCXU2NCAqcDEsICpwMiwgKnAzOwotCi0JcDEgPSBkb21haW4tPnB0X3Jvb3Q7Ci0KLQlpZiAoIXAxKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTEyOyArK2kpIHsKLQkJaWYgKCFJT01NVV9QVEVfUFJFU0VOVChwMVtpXSkpCi0JCQljb250aW51ZTsKLQotCQlwMiA9IElPTU1VX1BURV9QQUdFKHAxW2ldKTsKLQkJZm9yIChqID0gMDsgaiA8IDUxMjsgKytqKSB7Ci0JCQlpZiAoIUlPTU1VX1BURV9QUkVTRU5UKHAyW2pdKSkKLQkJCQljb250aW51ZTsKLQkJCXAzID0gSU9NTVVfUFRFX1BBR0UocDJbal0pOwotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXAzKTsKLQkJfQotCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwMik7Ci0JfQotCi0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXAxKTsKLQotCWRvbWFpbi0+cHRfcm9vdCA9IE5VTEw7Ci19Ci0KLS8qCi0gKiBGcmVlIGEgZG9tYWluLCBvbmx5IHVzZWQgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdGhlCi0gKiBhbGxvY2F0aW9uIHBhdGggYW5kIHdlIG5lZWQgdG8gZnJlZSBhbiBhbHJlYWR5IGFsbG9jYXRlZCBwYWdlIHRhYmxlCi0gKi8KLXN0YXRpYyB2b2lkIGRtYV9vcHNfZG9tYWluX2ZyZWUoc3RydWN0IGRtYV9vcHNfZG9tYWluICpkb20pCi17Ci0JaW50IGk7Ci0KLQlpZiAoIWRvbSkKLQkJcmV0dXJuOwotCi0JZGVsX2RvbWFpbl9mcm9tX2xpc3QoJmRvbS0+ZG9tYWluKTsKLQotCWZyZWVfcGFnZXRhYmxlKCZkb20tPmRvbWFpbik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVBFUlRVUkVfTUFYX1JBTkdFUzsgKytpKSB7Ci0JCWlmICghZG9tLT5hcGVydHVyZVtpXSkKLQkJCWNvbnRpbnVlOwotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZG9tLT5hcGVydHVyZVtpXS0+Yml0bWFwKTsKLQkJa2ZyZWUoZG9tLT5hcGVydHVyZVtpXSk7Ci0JfQotCi0Ja2ZyZWUoZG9tKTsKLX0KLQotLyoKLSAqIEFsbG9jYXRlcyBhIG5ldyBwcm90ZWN0aW9uIGRvbWFpbiB1c2FibGUgZm9yIHRoZSBkbWFfb3BzIGZ1bmN0aW9ucy4KLSAqIEl0IGFsc28gaW5pdGlhbGl6ZXMgdGhlIHBhZ2UgdGFibGUgYW5kIHRoZSBhZGRyZXNzIGFsbG9jYXRvciBkYXRhCi0gKiBzdHJ1Y3R1cmVzIHJlcXVpcmVkIGZvciB0aGUgZG1hX29wcyBpbnRlcmZhY2UKLSAqLwotc3RhdGljIHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX29wc19kb21haW5fYWxsb2Modm9pZCkKLXsKLQlzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9kb207Ci0KLQlkbWFfZG9tID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRtYV9vcHNfZG9tYWluKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkbWFfZG9tKQotCQlyZXR1cm4gTlVMTDsKLQotCXNwaW5fbG9ja19pbml0KCZkbWFfZG9tLT5kb21haW4ubG9jayk7Ci0KLQlkbWFfZG9tLT5kb21haW4uaWQgPSBkb21haW5faWRfYWxsb2MoKTsKLQlpZiAoZG1hX2RvbS0+ZG9tYWluLmlkID09IDApCi0JCWdvdG8gZnJlZV9kbWFfZG9tOwotCUlOSVRfTElTVF9IRUFEKCZkbWFfZG9tLT5kb21haW4uZGV2X2xpc3QpOwotCWRtYV9kb20tPmRvbWFpbi5tb2RlID0gUEFHRV9NT0RFXzJfTEVWRUw7Ci0JZG1hX2RvbS0+ZG9tYWluLnB0X3Jvb3QgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQlkbWFfZG9tLT5kb21haW4uZmxhZ3MgPSBQRF9ETUFfT1BTX01BU0s7Ci0JZG1hX2RvbS0+ZG9tYWluLnByaXYgPSBkbWFfZG9tOwotCWlmICghZG1hX2RvbS0+ZG9tYWluLnB0X3Jvb3QpCi0JCWdvdG8gZnJlZV9kbWFfZG9tOwotCi0JZG1hX2RvbS0+bmVlZF9mbHVzaCA9IGZhbHNlOwotCWRtYV9kb20tPnRhcmdldF9kZXYgPSAweGZmZmY7Ci0KLQlhZGRfZG9tYWluX3RvX2xpc3QoJmRtYV9kb20tPmRvbWFpbik7Ci0KLQlpZiAoYWxsb2NfbmV3X3JhbmdlKGRtYV9kb20sIHRydWUsIEdGUF9LRVJORUwpKQotCQlnb3RvIGZyZWVfZG1hX2RvbTsKLQotCS8qCi0JICogbWFyayB0aGUgZmlyc3QgcGFnZSBhcyBhbGxvY2F0ZWQgc28gd2UgbmV2ZXIgcmV0dXJuIDAgYXMKLQkgKiBhIHZhbGlkIGRtYS1hZGRyZXNzLiBTbyB3ZSBjYW4gdXNlIDAgYXMgZXJyb3IgdmFsdWUKLQkgKi8KLQlkbWFfZG9tLT5hcGVydHVyZVswXS0+Yml0bWFwWzBdID0gMTsKLQlkbWFfZG9tLT5uZXh0X2FkZHJlc3MgPSAwOwotCi0KLQlyZXR1cm4gZG1hX2RvbTsKLQotZnJlZV9kbWFfZG9tOgotCWRtYV9vcHNfZG9tYWluX2ZyZWUoZG1hX2RvbSk7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIGxpdHRsZSBoZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciBhIGdpdmVuIHByb3RlY3Rpb24gZG9tYWluIGlzIGEKLSAqIGRtYV9vcHMgZG9tYWluCi0gKi8KLXN0YXRpYyBib29sIGRtYV9vcHNfZG9tYWluKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQotewotCXJldHVybiBkb21haW4tPmZsYWdzICYgUERfRE1BX09QU19NQVNLOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfZHRlX2VudHJ5KHUxNiBkZXZpZCwgc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4sIGJvb2wgYXRzKQotewotCXU2NCBwdGVfcm9vdCA9IHZpcnRfdG9fcGh5cyhkb21haW4tPnB0X3Jvb3QpOwotCXUzMiBmbGFncyA9IDA7Ci0KLQlwdGVfcm9vdCB8PSAoZG9tYWluLT5tb2RlICYgREVWX0VOVFJZX01PREVfTUFTSykKLQkJICAgIDw8IERFVl9FTlRSWV9NT0RFX1NISUZUOwotCXB0ZV9yb290IHw9IElPTU1VX1BURV9JUiB8IElPTU1VX1BURV9JVyB8IElPTU1VX1BURV9QIHwgSU9NTVVfUFRFX1RWOwotCi0JaWYgKGF0cykKLQkJZmxhZ3MgfD0gRFRFX0ZMQUdfSU9UTEI7Ci0KLQlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhWzNdIHw9IGZsYWdzOwotCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMl0gID0gZG9tYWluLT5pZDsKLQlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhWzFdICA9IHVwcGVyXzMyX2JpdHMocHRlX3Jvb3QpOwotCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMF0gID0gbG93ZXJfMzJfYml0cyhwdGVfcm9vdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFyX2R0ZV9lbnRyeSh1MTYgZGV2aWQpCi17Ci0JLyogcmVtb3ZlIGVudHJ5IGZyb20gdGhlIGRldmljZSB0YWJsZSBzZWVuIGJ5IHRoZSBoYXJkd2FyZSAqLwotCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMF0gPSBJT01NVV9QVEVfUCB8IElPTU1VX1BURV9UVjsKLQlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhWzFdID0gMDsKLQlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhWzJdID0gMDsKLQotCWFtZF9pb21tdV9hcHBseV9lcnJhdHVtXzYzKGRldmlkKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCi17Ci0Jc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YTsKLQlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlib29sIGF0cyA9IGZhbHNlOwotCXUxNiBkZXZpZDsKLQotCWRldmlkICAgID0gZ2V0X2RldmljZV9pZChkZXYpOwotCWlvbW11ICAgID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOwotCWRldl9kYXRhID0gZ2V0X2Rldl9kYXRhKGRldik7Ci0JcGRldiAgICAgPSB0b19wY2lfZGV2KGRldik7Ci0KLQlpZiAoYW1kX2lvbW11X2lvdGxiX3N1cCkKLQkJYXRzID0gcGNpX2F0c19lbmFibGVkKHBkZXYpOwotCi0JLyogVXBkYXRlIGRhdGEgc3RydWN0dXJlcyAqLwotCWRldl9kYXRhLT5kb21haW4gPSBkb21haW47Ci0JbGlzdF9hZGQoJmRldl9kYXRhLT5saXN0LCAmZG9tYWluLT5kZXZfbGlzdCk7Ci0Jc2V0X2R0ZV9lbnRyeShkZXZpZCwgZG9tYWluLCBhdHMpOwotCi0JLyogRG8gcmVmZXJlbmNlIGNvdW50aW5nICovCi0JZG9tYWluLT5kZXZfaW9tbXVbaW9tbXUtPmluZGV4XSArPSAxOwotCWRvbWFpbi0+ZGV2X2NudCAgICAgICAgICAgICAgICAgKz0gMTsKLQotCS8qIEZsdXNoIHRoZSBEVEUgZW50cnkgKi8KLQlkZXZpY2VfZmx1c2hfZHRlKGRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX2RldGFjaChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YTsKLQlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKLQl1MTYgZGV2aWQ7Ci0KLQlkZXZpZCAgICA9IGdldF9kZXZpY2VfaWQoZGV2KTsKLQlpb21tdSAgICA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2RldmlkXTsKLQlkZXZfZGF0YSA9IGdldF9kZXZfZGF0YShkZXYpOwotCi0JLyogZGVjcmVhc2UgcmVmZXJlbmNlIGNvdW50ZXJzICovCi0JZGV2X2RhdGEtPmRvbWFpbi0+ZGV2X2lvbW11W2lvbW11LT5pbmRleF0gLT0gMTsKLQlkZXZfZGF0YS0+ZG9tYWluLT5kZXZfY250ICAgICAgICAgICAgICAgICAtPSAxOwotCi0JLyogVXBkYXRlIGRhdGEgc3RydWN0dXJlcyAqLwotCWRldl9kYXRhLT5kb21haW4gPSBOVUxMOwotCWxpc3RfZGVsKCZkZXZfZGF0YS0+bGlzdCk7Ci0JY2xlYXJfZHRlX2VudHJ5KGRldmlkKTsKLQotCS8qIEZsdXNoIHRoZSBEVEUgZW50cnkgKi8KLQlkZXZpY2VfZmx1c2hfZHRlKGRldik7Ci19Ci0KLS8qCi0gKiBJZiBhIGRldmljZSBpcyBub3QgeWV0IGFzc29jaWF0ZWQgd2l0aCBhIGRvbWFpbiwgdGhpcyBmdW5jdGlvbiBkb2VzCi0gKiBhc3NpZ25zIGl0IHZpc2libGUgZm9yIHRoZSBoYXJkd2FyZQotICovCi1zdGF0aWMgaW50IF9fYXR0YWNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKLXsKLQlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhLCAqYWxpYXNfZGF0YTsKLQlpbnQgcmV0OwotCi0JZGV2X2RhdGEgICA9IGdldF9kZXZfZGF0YShkZXYpOwotCWFsaWFzX2RhdGEgPSBnZXRfZGV2X2RhdGEoZGV2X2RhdGEtPmFsaWFzKTsKLQotCWlmICghYWxpYXNfZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBsb2NrIGRvbWFpbiAqLwotCXNwaW5fbG9jaygmZG9tYWluLT5sb2NrKTsKLQotCS8qIFNvbWUgc2FuaXR5IGNoZWNrcyAqLwotCXJldCA9IC1FQlVTWTsKLQlpZiAoYWxpYXNfZGF0YS0+ZG9tYWluICE9IE5VTEwgJiYKLQkgICAgYWxpYXNfZGF0YS0+ZG9tYWluICE9IGRvbWFpbikKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JaWYgKGRldl9kYXRhLT5kb21haW4gIT0gTlVMTCAmJgotCSAgICBkZXZfZGF0YS0+ZG9tYWluICE9IGRvbWFpbikKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JLyogRG8gcmVhbCBhc3NpZ25tZW50ICovCi0JaWYgKGRldl9kYXRhLT5hbGlhcyAhPSBkZXYpIHsKLQkJYWxpYXNfZGF0YSA9IGdldF9kZXZfZGF0YShkZXZfZGF0YS0+YWxpYXMpOwotCQlpZiAoYWxpYXNfZGF0YS0+ZG9tYWluID09IE5VTEwpCi0JCQlkb19hdHRhY2goZGV2X2RhdGEtPmFsaWFzLCBkb21haW4pOwotCi0JCWF0b21pY19pbmMoJmFsaWFzX2RhdGEtPmJpbmQpOwotCX0KLQotCWlmIChkZXZfZGF0YS0+ZG9tYWluID09IE5VTEwpCi0JCWRvX2F0dGFjaChkZXYsIGRvbWFpbik7Ci0KLQlhdG9taWNfaW5jKCZkZXZfZGF0YS0+YmluZCk7Ci0KLQlyZXQgPSAwOwotCi1vdXRfdW5sb2NrOgotCi0JLyogcmVhZHkgKi8KLQlzcGluX3VubG9jaygmZG9tYWluLT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBJZiBhIGRldmljZSBpcyBub3QgeWV0IGFzc29jaWF0ZWQgd2l0aCBhIGRvbWFpbiwgdGhpcyBmdW5jdGlvbiBkb2VzCi0gKiBhc3NpZ25zIGl0IHZpc2libGUgZm9yIHRoZSBoYXJkd2FyZQotICovCi1zdGF0aWMgaW50IGF0dGFjaF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAotCQkJIHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKLQotCWlmIChhbWRfaW9tbXVfaW90bGJfc3VwKQotCQlwY2lfZW5hYmxlX2F0cyhwZGV2LCBQQUdFX1NISUZUKTsKLQotCXdyaXRlX2xvY2tfaXJxc2F2ZSgmYW1kX2lvbW11X2RldnRhYmxlX2xvY2ssIGZsYWdzKTsKLQlyZXQgPSBfX2F0dGFjaF9kZXZpY2UoZGV2LCBkb21haW4pOwotCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZhbWRfaW9tbXVfZGV2dGFibGVfbG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBXZSBtaWdodCBib290IGludG8gYSBjcmFzaC1rZXJuZWwgaGVyZS4gVGhlIGNyYXNoZWQga2VybmVsCi0JICogbGVmdCB0aGUgY2FjaGVzIGluIHRoZSBJT01NVSBkaXJ0eS4gU28gd2UgaGF2ZSB0byBmbHVzaAotCSAqIGhlcmUgdG8gZXZpY3QgYWxsIGRpcnR5IHN0dWZmLgotCSAqLwotCWRvbWFpbl9mbHVzaF90bGJfcGRlKGRvbWFpbik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogUmVtb3ZlcyBhIGRldmljZSBmcm9tIGEgcHJvdGVjdGlvbiBkb21haW4gKHVubG9ja2VkKQotICovCi1zdGF0aWMgdm9pZCBfX2RldGFjaF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGEgPSBnZXRfZGV2X2RhdGEoZGV2KTsKLQlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmFsaWFzX2RhdGE7Ci0Jc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW47Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCUJVR19PTighZGV2X2RhdGEtPmRvbWFpbik7Ci0KLQlkb21haW4gPSBkZXZfZGF0YS0+ZG9tYWluOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGRldl9kYXRhLT5hbGlhcyAhPSBkZXYpIHsKLQkJYWxpYXNfZGF0YSA9IGdldF9kZXZfZGF0YShkZXZfZGF0YS0+YWxpYXMpOwotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYWxpYXNfZGF0YS0+YmluZCkpCi0JCQlkb19kZXRhY2goZGV2X2RhdGEtPmFsaWFzKTsKLQl9Ci0KLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2X2RhdGEtPmJpbmQpKQotCQlkb19kZXRhY2goZGV2KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBJZiB3ZSBydW4gaW4gcGFzc3Rocm91Z2ggbW9kZSB0aGUgZGV2aWNlIG11c3QgYmUgYXNzaWduZWQgdG8gdGhlCi0JICogcGFzc3Rocm91Z2ggZG9tYWluIGlmIGl0IGlzIGRldGFjaGVkIGZyb20gYW55IG90aGVyIGRvbWFpbi4KLQkgKiBNYWtlIHN1cmUgd2UgY2FuIGRlYXNzaWduIGZyb20gdGhlIHB0X2RvbWFpbiBpdHNlbGYuCi0JICovCi0JaWYgKGlvbW11X3Bhc3NfdGhyb3VnaCAmJgotCSAgICAoZGV2X2RhdGEtPmRvbWFpbiA9PSBOVUxMICYmIGRvbWFpbiAhPSBwdF9kb21haW4pKQotCQlfX2F0dGFjaF9kZXZpY2UoZGV2LCBwdF9kb21haW4pOwotfQotCi0vKgotICogUmVtb3ZlcyBhIGRldmljZSBmcm9tIGEgcHJvdGVjdGlvbiBkb21haW4gKHdpdGggZGV2dGFibGVfbG9jayBoZWxkKQotICovCi1zdGF0aWMgdm9pZCBkZXRhY2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogbG9jayBkZXZpY2UgdGFibGUgKi8KLQl3cml0ZV9sb2NrX2lycXNhdmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7Ci0JX19kZXRhY2hfZGV2aWNlKGRldik7Ci0Jd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoYW1kX2lvbW11X2lvdGxiX3N1cCAmJiBwY2lfYXRzX2VuYWJsZWQocGRldikpCi0JCXBjaV9kaXNhYmxlX2F0cyhwZGV2KTsKLX0KLQotLyoKLSAqIEZpbmQgb3V0IHRoZSBwcm90ZWN0aW9uIGRvbWFpbiBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gUENJIGRldmljZS4gVGhpcwotICogd2lsbCBnaXZlIHVzIHRoZSBwb2ludGVyIHRvIHRoZSBwYWdlIHRhYmxlIHJvb3QgZm9yIGV4YW1wbGUuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbl9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbTsKLQlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhLCAqYWxpYXNfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUxNiBkZXZpZDsKLQotCWRldmlkICAgICAgPSBnZXRfZGV2aWNlX2lkKGRldik7Ci0JZGV2X2RhdGEgICA9IGdldF9kZXZfZGF0YShkZXYpOwotCWFsaWFzX2RhdGEgPSBnZXRfZGV2X2RhdGEoZGV2X2RhdGEtPmFsaWFzKTsKLQlpZiAoIWFsaWFzX2RhdGEpCi0JCXJldHVybiBOVUxMOwotCi0JcmVhZF9sb2NrX2lycXNhdmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7Ci0JZG9tID0gZGV2X2RhdGEtPmRvbWFpbjsKLQlpZiAoZG9tID09IE5VTEwgJiYKLQkgICAgYWxpYXNfZGF0YS0+ZG9tYWluICE9IE5VTEwpIHsKLQkJX19hdHRhY2hfZGV2aWNlKGRldiwgYWxpYXNfZGF0YS0+ZG9tYWluKTsKLQkJZG9tID0gYWxpYXNfZGF0YS0+ZG9tYWluOwotCX0KLQotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gZG9tOwotfQotCi1zdGF0aWMgaW50IGRldmljZV9jaGFuZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7Ci0JdTE2IGRldmlkOwotCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluOwotCXN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX2RvbWFpbjsKLQlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFjaGVja19kZXZpY2UoZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQlkZXZpZCAgPSBnZXRfZGV2aWNlX2lkKGRldik7Ci0JaW9tbXUgID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIEJVU19OT1RJRllfVU5CT1VORF9EUklWRVI6Ci0KLQkJZG9tYWluID0gZG9tYWluX2Zvcl9kZXZpY2UoZGV2KTsKLQotCQlpZiAoIWRvbWFpbikKLQkJCWdvdG8gb3V0OwotCQlpZiAoaW9tbXVfcGFzc190aHJvdWdoKQotCQkJYnJlYWs7Ci0JCWRldGFjaF9kZXZpY2UoZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBCVVNfTk9USUZZX0FERF9ERVZJQ0U6Ci0KLQkJaW9tbXVfaW5pdF9kZXZpY2UoZGV2KTsKLQotCQlkb21haW4gPSBkb21haW5fZm9yX2RldmljZShkZXYpOwotCi0JCS8qIGFsbG9jYXRlIGEgcHJvdGVjdGlvbiBkb21haW4gaWYgYSBkZXZpY2UgaXMgYWRkZWQgKi8KLQkJZG1hX2RvbWFpbiA9IGZpbmRfcHJvdGVjdGlvbl9kb21haW4oZGV2aWQpOwotCQlpZiAoZG1hX2RvbWFpbikKLQkJCWdvdG8gb3V0OwotCQlkbWFfZG9tYWluID0gZG1hX29wc19kb21haW5fYWxsb2MoKTsKLQkJaWYgKCFkbWFfZG9tYWluKQotCQkJZ290byBvdXQ7Ci0JCWRtYV9kb21haW4tPnRhcmdldF9kZXYgPSBkZXZpZDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXVfcGRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkX3RhaWwoJmRtYV9kb21haW4tPmxpc3QsICZpb21tdV9wZF9saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXVfcGRfbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQkJYnJlYWs7Ci0JY2FzZSBCVVNfTk9USUZZX0RFTF9ERVZJQ0U6Ci0KLQkJaW9tbXVfdW5pbml0X2RldmljZShkZXYpOwotCi0JZGVmYXVsdDoKLQkJZ290byBvdXQ7Ci0JfQotCi0JZGV2aWNlX2ZsdXNoX2R0ZShkZXYpOwotCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7Ci0KLW91dDoKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBkZXZpY2VfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBkZXZpY2VfY2hhbmdlX25vdGlmaWVyLAotfTsKLQotdm9pZCBhbWRfaW9tbXVfaW5pdF9ub3RpZmllcih2b2lkKQotewotCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmcGNpX2J1c190eXBlLCAmZGV2aWNlX25iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlIG5leHQgZnVuY3Rpb25zIGJlbG9uZyB0byB0aGUgZG1hX29wcyBtYXBwaW5nL3VubWFwcGluZyBjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIEluIHRoZSBkbWFfb3BzIHBhdGggd2Ugb25seSBoYXZlIHRoZSBzdHJ1Y3QgZGV2aWNlLiBUaGlzIGZ1bmN0aW9uCi0gKiBmaW5kcyB0aGUgY29ycmVzcG9uZGluZyBJT01NVSwgdGhlIHByb3RlY3Rpb24gZG9tYWluIGFuZCB0aGUKLSAqIHJlcXVlc3RvciBpZCBmb3IgYSBnaXZlbiBkZXZpY2UuCi0gKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCB5ZXQgYXNzb2NpYXRlZCB3aXRoIGEgZG9tYWluIHRoaXMgaXMgYWxzbyBkb25lCi0gKiBpbiB0aGlzIGZ1bmN0aW9uLgotICovCi1zdGF0aWMgc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpnZXRfZG9tYWluKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbjsKLQlzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9kb207Ci0JdTE2IGRldmlkID0gZ2V0X2RldmljZV9pZChkZXYpOwotCi0JaWYgKCFjaGVja19kZXZpY2UoZGV2KSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQlkb21haW4gPSBkb21haW5fZm9yX2RldmljZShkZXYpOwotCWlmIChkb21haW4gIT0gTlVMTCAmJiAhZG1hX29wc19kb21haW4oZG9tYWluKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKLQotCWlmIChkb21haW4gIT0gTlVMTCkKLQkJcmV0dXJuIGRvbWFpbjsKLQotCS8qIERldmljZSBub3QgYm91bnQgeWV0IC0gYmluZCBpdCAqLwotCWRtYV9kb20gPSBmaW5kX3Byb3RlY3Rpb25fZG9tYWluKGRldmlkKTsKLQlpZiAoIWRtYV9kb20pCi0JCWRtYV9kb20gPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtkZXZpZF0tPmRlZmF1bHRfZG9tOwotCWF0dGFjaF9kZXZpY2UoZGV2LCAmZG1hX2RvbS0+ZG9tYWluKTsKLQlEVU1QX3ByaW50aygiVXNpbmcgcHJvdGVjdGlvbiBkb21haW4gJWQgZm9yIGRldmljZSAlc1xuIiwKLQkJICAgIGRtYV9kb20tPmRvbWFpbi5pZCwgZGV2X25hbWUoZGV2KSk7Ci0KLQlyZXR1cm4gJmRtYV9kb20tPmRvbWFpbjsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2RldmljZV90YWJsZShzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKLXsKLQlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfZGF0YSwgJmRvbWFpbi0+ZGV2X2xpc3QsIGxpc3QpIHsKLQkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldl9kYXRhLT5kZXYpOwotCQl1MTYgZGV2aWQgPSBnZXRfZGV2aWNlX2lkKGRldl9kYXRhLT5kZXYpOwotCQlzZXRfZHRlX2VudHJ5KGRldmlkLCBkb21haW4sIHBjaV9hdHNfZW5hYmxlZChwZGV2KSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfZG9tYWluKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQotewotCWlmICghZG9tYWluLT51cGRhdGVkKQotCQlyZXR1cm47Ci0KLQl1cGRhdGVfZGV2aWNlX3RhYmxlKGRvbWFpbik7Ci0KLQlkb21haW5fZmx1c2hfZGV2aWNlcyhkb21haW4pOwotCWRvbWFpbl9mbHVzaF90bGJfcGRlKGRvbWFpbik7Ci0KLQlkb21haW4tPnVwZGF0ZWQgPSBmYWxzZTsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gZmV0Y2hlcyB0aGUgUFRFIGZvciBhIGdpdmVuIGFkZHJlc3MgaW4gdGhlIGFwZXJ0dXJlCi0gKi8KLXN0YXRpYyB1NjQqIGRtYV9vcHNfZ2V0X3B0ZShzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRvbSwKLQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCi17Ci0Jc3RydWN0IGFwZXJ0dXJlX3JhbmdlICphcGVydHVyZTsKLQl1NjQgKnB0ZSwgKnB0ZV9wYWdlOwotCi0JYXBlcnR1cmUgPSBkb20tPmFwZXJ0dXJlW0FQRVJUVVJFX1JBTkdFX0lOREVYKGFkZHJlc3MpXTsKLQlpZiAoIWFwZXJ0dXJlKQotCQlyZXR1cm4gTlVMTDsKLQotCXB0ZSA9IGFwZXJ0dXJlLT5wdGVfcGFnZXNbQVBFUlRVUkVfUEFHRV9JTkRFWChhZGRyZXNzKV07Ci0JaWYgKCFwdGUpIHsKLQkJcHRlID0gYWxsb2NfcHRlKCZkb20tPmRvbWFpbiwgYWRkcmVzcywgUEFHRV9TSVpFLCAmcHRlX3BhZ2UsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWFwZXJ0dXJlLT5wdGVfcGFnZXNbQVBFUlRVUkVfUEFHRV9JTkRFWChhZGRyZXNzKV0gPSBwdGVfcGFnZTsKLQl9IGVsc2UKLQkJcHRlICs9IFBNX0xFVkVMX0lOREVYKDAsIGFkZHJlc3MpOwotCi0JdXBkYXRlX2RvbWFpbigmZG9tLT5kb21haW4pOwotCi0JcmV0dXJuIHB0ZTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIGdlbmVyaWMgbWFwIGZ1bmN0aW9uLiBJdCBtYXBzIG9uZSA0a2IgcGFnZSBhdCBwYWRkciB0bwotICogdGhlIGdpdmVuIGFkZHJlc3MgaW4gdGhlIERNQSBhZGRyZXNzIHNwYWNlIGZvciB0aGUgZG9tYWluLgotICovCi1zdGF0aWMgZG1hX2FkZHJfdCBkbWFfb3BzX2RvbWFpbl9tYXAoc3RydWN0IGRtYV9vcHNfZG9tYWluICpkb20sCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCi0JCQkJICAgICBwaHlzX2FkZHJfdCBwYWRkciwKLQkJCQkgICAgIGludCBkaXJlY3Rpb24pCi17Ci0JdTY0ICpwdGUsIF9fcHRlOwotCi0JV0FSTl9PTihhZGRyZXNzID4gZG9tLT5hcGVydHVyZV9zaXplKTsKLQotCXBhZGRyICY9IFBBR0VfTUFTSzsKLQotCXB0ZSAgPSBkbWFfb3BzX2dldF9wdGUoZG9tLCBhZGRyZXNzKTsKLQlpZiAoIXB0ZSkKLQkJcmV0dXJuIERNQV9FUlJPUl9DT0RFOwotCi0JX19wdGUgPSBwYWRkciB8IElPTU1VX1BURV9QIHwgSU9NTVVfUFRFX0ZDOwotCi0JaWYgKGRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQotCQlfX3B0ZSB8PSBJT01NVV9QVEVfSVI7Ci0JZWxzZSBpZiAoZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKLQkJX19wdGUgfD0gSU9NTVVfUFRFX0lXOwotCWVsc2UgaWYgKGRpcmVjdGlvbiA9PSBETUFfQklESVJFQ1RJT05BTCkKLQkJX19wdGUgfD0gSU9NTVVfUFRFX0lSIHwgSU9NTVVfUFRFX0lXOwotCi0JV0FSTl9PTigqcHRlKTsKLQotCSpwdGUgPSBfX3B0ZTsKLQotCXJldHVybiAoZG1hX2FkZHJfdClhZGRyZXNzOwotfQotCi0vKgotICogVGhlIGdlbmVyaWMgdW5tYXBwaW5nIGZ1bmN0aW9uIGZvciBvbiBwYWdlIGluIHRoZSBETUEgYWRkcmVzcyBzcGFjZS4KLSAqLwotc3RhdGljIHZvaWQgZG1hX29wc19kb21haW5fdW5tYXAoc3RydWN0IGRtYV9vcHNfZG9tYWluICpkb20sCi0JCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKLXsKLQlzdHJ1Y3QgYXBlcnR1cmVfcmFuZ2UgKmFwZXJ0dXJlOwotCXU2NCAqcHRlOwotCi0JaWYgKGFkZHJlc3MgPj0gZG9tLT5hcGVydHVyZV9zaXplKQotCQlyZXR1cm47Ci0KLQlhcGVydHVyZSA9IGRvbS0+YXBlcnR1cmVbQVBFUlRVUkVfUkFOR0VfSU5ERVgoYWRkcmVzcyldOwotCWlmICghYXBlcnR1cmUpCi0JCXJldHVybjsKLQotCXB0ZSAgPSBhcGVydHVyZS0+cHRlX3BhZ2VzW0FQRVJUVVJFX1BBR0VfSU5ERVgoYWRkcmVzcyldOwotCWlmICghcHRlKQotCQlyZXR1cm47Ci0KLQlwdGUgKz0gUE1fTEVWRUxfSU5ERVgoMCwgYWRkcmVzcyk7Ci0KLQlXQVJOX09OKCEqcHRlKTsKLQotCSpwdGUgPSAwVUxMOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBjb250YWlucyBjb21tb24gY29kZSBmb3IgbWFwcGluZyBvZiBhIHBoeXNpY2FsbHkKLSAqIGNvbnRpZ3VvdXMgbWVtb3J5IHJlZ2lvbiBpbnRvIERNQSBhZGRyZXNzIHNwYWNlLiBJdCBpcyB1c2VkIGJ5IGFsbAotICogbWFwcGluZyBmdW5jdGlvbnMgcHJvdmlkZWQgd2l0aCB0aGlzIElPTU1VIGRyaXZlci4KLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGRvbWFpbiBsb2NrIGhlbGQuCi0gKi8KLXN0YXRpYyBkbWFfYWRkcl90IF9fbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRtYV9vcHNfZG9tYWluICpkbWFfZG9tLAotCQkJICAgICAgIHBoeXNfYWRkcl90IHBhZGRyLAotCQkJICAgICAgIHNpemVfdCBzaXplLAotCQkJICAgICAgIGludCBkaXIsCi0JCQkgICAgICAgYm9vbCBhbGlnbiwKLQkJCSAgICAgICB1NjQgZG1hX21hc2spCi17Ci0JZG1hX2FkZHJfdCBvZmZzZXQgPSBwYWRkciAmIH5QQUdFX01BU0s7Ci0JZG1hX2FkZHJfdCBhZGRyZXNzLCBzdGFydCwgcmV0OwotCXVuc2lnbmVkIGludCBwYWdlczsKLQl1bnNpZ25lZCBsb25nIGFsaWduX21hc2sgPSAwOwotCWludCBpOwotCi0JcGFnZXMgPSBpb21tdV9udW1fcGFnZXMocGFkZHIsIHNpemUsIFBBR0VfU0laRSk7Ci0JcGFkZHIgJj0gUEFHRV9NQVNLOwotCi0JSU5DX1NUQVRTX0NPVU5URVIodG90YWxfbWFwX3JlcXVlc3RzKTsKLQotCWlmIChwYWdlcyA+IDEpCi0JCUlOQ19TVEFUU19DT1VOVEVSKGNyb3NzX3BhZ2UpOwotCi0JaWYgKGFsaWduKQotCQlhbGlnbl9tYXNrID0gKDFVTCA8PCBnZXRfb3JkZXIoc2l6ZSkpIC0gMTsKLQotcmV0cnk6Ci0JYWRkcmVzcyA9IGRtYV9vcHNfYWxsb2NfYWRkcmVzc2VzKGRldiwgZG1hX2RvbSwgcGFnZXMsIGFsaWduX21hc2ssCi0JCQkJCSAgZG1hX21hc2spOwotCWlmICh1bmxpa2VseShhZGRyZXNzID09IERNQV9FUlJPUl9DT0RFKSkgewotCQkvKgotCQkgKiBzZXR0aW5nIG5leHRfYWRkcmVzcyBoZXJlIHdpbGwgbGV0IHRoZSBhZGRyZXNzCi0JCSAqIGFsbG9jYXRvciBvbmx5IHNjYW4gdGhlIG5ldyBhbGxvY2F0ZWQgcmFuZ2UgaW4gdGhlCi0JCSAqIGZpcnN0IHJ1bi4gVGhpcyBpcyBhIHNtYWxsIG9wdGltaXphdGlvbi4KLQkJICovCi0JCWRtYV9kb20tPm5leHRfYWRkcmVzcyA9IGRtYV9kb20tPmFwZXJ0dXJlX3NpemU7Ci0KLQkJaWYgKGFsbG9jX25ld19yYW5nZShkbWFfZG9tLCBmYWxzZSwgR0ZQX0FUT01JQykpCi0JCQlnb3RvIG91dDsKLQotCQkvKgotCQkgKiBhcGVydHVyZSB3YXMgc3VjY2Vzc2Z1bGx5IGVubGFyZ2VkIGJ5IDEyOCBNQiwgdHJ5Ci0JCSAqIGFsbG9jYXRpb24gYWdhaW4KLQkJICovCi0JCWdvdG8gcmV0cnk7Ci0JfQotCi0Jc3RhcnQgPSBhZGRyZXNzOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgKytpKSB7Ci0JCXJldCA9IGRtYV9vcHNfZG9tYWluX21hcChkbWFfZG9tLCBzdGFydCwgcGFkZHIsIGRpcik7Ci0JCWlmIChyZXQgPT0gRE1BX0VSUk9SX0NPREUpCi0JCQlnb3RvIG91dF91bm1hcDsKLQotCQlwYWRkciArPSBQQUdFX1NJWkU7Ci0JCXN0YXJ0ICs9IFBBR0VfU0laRTsKLQl9Ci0JYWRkcmVzcyArPSBvZmZzZXQ7Ci0KLQlBRERfU1RBVFNfQ09VTlRFUihhbGxvY2VkX2lvX21lbSwgc2l6ZSk7Ci0KLQlpZiAodW5saWtlbHkoZG1hX2RvbS0+bmVlZF9mbHVzaCAmJiAhYW1kX2lvbW11X3VubWFwX2ZsdXNoKSkgewotCQlkb21haW5fZmx1c2hfdGxiKCZkbWFfZG9tLT5kb21haW4pOwotCQlkbWFfZG9tLT5uZWVkX2ZsdXNoID0gZmFsc2U7Ci0JfSBlbHNlIGlmICh1bmxpa2VseShhbWRfaW9tbXVfbnBfY2FjaGUpKQotCQlkb21haW5fZmx1c2hfcGFnZXMoJmRtYV9kb20tPmRvbWFpbiwgYWRkcmVzcywgc2l6ZSk7Ci0KLW91dDoKLQlyZXR1cm4gYWRkcmVzczsKLQotb3V0X3VubWFwOgotCi0JZm9yICgtLWk7IGkgPj0gMDsgLS1pKSB7Ci0JCXN0YXJ0IC09IFBBR0VfU0laRTsKLQkJZG1hX29wc19kb21haW5fdW5tYXAoZG1hX2RvbSwgc3RhcnQpOwotCX0KLQotCWRtYV9vcHNfZnJlZV9hZGRyZXNzZXMoZG1hX2RvbSwgYWRkcmVzcywgcGFnZXMpOwotCi0JcmV0dXJuIERNQV9FUlJPUl9DT0RFOwotfQotCi0vKgotICogRG9lcyB0aGUgcmV2ZXJzZSBvZiB0aGUgX19tYXBfc2luZ2xlIGZ1bmN0aW9uLiBNdXN0IGJlIGNhbGxlZCB3aXRoCi0gKiB0aGUgZG9tYWluIGxvY2sgaGVsZCB0b28KLSAqLwotc3RhdGljIHZvaWQgX191bm1hcF9zaW5nbGUoc3RydWN0IGRtYV9vcHNfZG9tYWluICpkbWFfZG9tLAotCQkJICAgZG1hX2FkZHJfdCBkbWFfYWRkciwKLQkJCSAgIHNpemVfdCBzaXplLAotCQkJICAgaW50IGRpcikKLXsKLQlkbWFfYWRkcl90IGZsdXNoX2FkZHI7Ci0JZG1hX2FkZHJfdCBpLCBzdGFydDsKLQl1bnNpZ25lZCBpbnQgcGFnZXM7Ci0KLQlpZiAoKGRtYV9hZGRyID09IERNQV9FUlJPUl9DT0RFKSB8fAotCSAgICAoZG1hX2FkZHIgKyBzaXplID4gZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSkpCi0JCXJldHVybjsKLQotCWZsdXNoX2FkZHIgPSBkbWFfYWRkcjsKLQlwYWdlcyA9IGlvbW11X251bV9wYWdlcyhkbWFfYWRkciwgc2l6ZSwgUEFHRV9TSVpFKTsKLQlkbWFfYWRkciAmPSBQQUdFX01BU0s7Ci0Jc3RhcnQgPSBkbWFfYWRkcjsKLQotCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgKytpKSB7Ci0JCWRtYV9vcHNfZG9tYWluX3VubWFwKGRtYV9kb20sIHN0YXJ0KTsKLQkJc3RhcnQgKz0gUEFHRV9TSVpFOwotCX0KLQotCVNVQl9TVEFUU19DT1VOVEVSKGFsbG9jZWRfaW9fbWVtLCBzaXplKTsKLQotCWRtYV9vcHNfZnJlZV9hZGRyZXNzZXMoZG1hX2RvbSwgZG1hX2FkZHIsIHBhZ2VzKTsKLQotCWlmIChhbWRfaW9tbXVfdW5tYXBfZmx1c2ggfHwgZG1hX2RvbS0+bmVlZF9mbHVzaCkgewotCQlkb21haW5fZmx1c2hfcGFnZXMoJmRtYV9kb20tPmRvbWFpbiwgZmx1c2hfYWRkciwgc2l6ZSk7Ci0JCWRtYV9kb20tPm5lZWRfZmx1c2ggPSBmYWxzZTsKLQl9Ci19Ci0KLS8qCi0gKiBUaGUgZXhwb3J0ZWQgbWFwX3NpbmdsZSBmdW5jdGlvbiBmb3IgZG1hX29wcy4KLSAqLwotc3RhdGljIGRtYV9hZGRyX3QgbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKLQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKLQkJCSAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW47Ci0JZG1hX2FkZHJfdCBhZGRyOwotCXU2NCBkbWFfbWFzazsKLQlwaHlzX2FkZHJfdCBwYWRkciA9IHBhZ2VfdG9fcGh5cyhwYWdlKSArIG9mZnNldDsKLQotCUlOQ19TVEFUU19DT1VOVEVSKGNudF9tYXBfc2luZ2xlKTsKLQotCWRvbWFpbiA9IGdldF9kb21haW4oZGV2KTsKLQlpZiAoUFRSX0VSUihkb21haW4pID09IC1FSU5WQUwpCi0JCXJldHVybiAoZG1hX2FkZHJfdClwYWRkcjsKLQllbHNlIGlmIChJU19FUlIoZG9tYWluKSkKLQkJcmV0dXJuIERNQV9FUlJPUl9DT0RFOwotCi0JZG1hX21hc2sgPSAqZGV2LT5kbWFfbWFzazsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKLQotCWFkZHIgPSBfX21hcF9zaW5nbGUoZGV2LCBkb21haW4tPnByaXYsIHBhZGRyLCBzaXplLCBkaXIsIGZhbHNlLAotCQkJICAgIGRtYV9tYXNrKTsKLQlpZiAoYWRkciA9PSBETUFfRVJST1JfQ09ERSkKLQkJZ290byBvdXQ7Ci0KLQlkb21haW5fZmx1c2hfY29tcGxldGUoZG9tYWluKTsKLQotb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGFkZHI7Ci19Ci0KLS8qCi0gKiBUaGUgZXhwb3J0ZWQgdW5tYXBfc2luZ2xlIGZ1bmN0aW9uIGZvciBkbWFfb3BzLgotICovCi1zdGF0aWMgdm9pZCB1bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsCi0JCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW47Ci0KLQlJTkNfU1RBVFNfQ09VTlRFUihjbnRfdW5tYXBfc2luZ2xlKTsKLQotCWRvbWFpbiA9IGdldF9kb21haW4oZGV2KTsKLQlpZiAoSVNfRVJSKGRvbWFpbikpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKLQotCV9fdW5tYXBfc2luZ2xlKGRvbWFpbi0+cHJpdiwgZG1hX2FkZHIsIHNpemUsIGRpcik7Ci0KLQlkb21haW5fZmx1c2hfY29tcGxldGUoZG9tYWluKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwotfQotCi0vKgotICogVGhpcyBpcyBhIHNwZWNpYWwgbWFwX3NnIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQgaWYgd2Ugc2hvdWxkIG1hcCBhCi0gKiBkZXZpY2Ugd2hpY2ggaXMgbm90IGhhbmRsZWQgYnkgYW4gQU1EIElPTU1VIGluIHRoZSBzeXN0ZW0uCi0gKi8KLXN0YXRpYyBpbnQgbWFwX3NnX25vX2lvbW11KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCi0JCQkgICBpbnQgbmVsZW1zLCBpbnQgZGlyKQotewotCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3NnKHNnbGlzdCwgcywgbmVsZW1zLCBpKSB7Ci0JCXMtPmRtYV9hZGRyZXNzID0gKGRtYV9hZGRyX3Qpc2dfcGh5cyhzKTsKLQkJcy0+ZG1hX2xlbmd0aCAgPSBzLT5sZW5ndGg7Ci0JfQotCi0JcmV0dXJuIG5lbGVtczsKLX0KLQotLyoKLSAqIFRoZSBleHBvcnRlZCBtYXBfc2cgZnVuY3Rpb24gZm9yIGRtYV9vcHMgKGhhbmRsZXMgc2NhdHRlci1nYXRoZXIKLSAqIGxpc3RzKS4KLSAqLwotc3RhdGljIGludCBtYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKLQkJICBpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCi0JCSAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbjsKLQlpbnQgaTsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnM7Ci0JcGh5c19hZGRyX3QgcGFkZHI7Ci0JaW50IG1hcHBlZF9lbGVtcyA9IDA7Ci0JdTY0IGRtYV9tYXNrOwotCi0JSU5DX1NUQVRTX0NPVU5URVIoY250X21hcF9zZyk7Ci0KLQlkb21haW4gPSBnZXRfZG9tYWluKGRldik7Ci0JaWYgKFBUUl9FUlIoZG9tYWluKSA9PSAtRUlOVkFMKQotCQlyZXR1cm4gbWFwX3NnX25vX2lvbW11KGRldiwgc2dsaXN0LCBuZWxlbXMsIGRpcik7Ci0JZWxzZSBpZiAoSVNfRVJSKGRvbWFpbikpCi0JCXJldHVybiAwOwotCi0JZG1hX21hc2sgPSAqZGV2LT5kbWFfbWFzazsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKLQotCWZvcl9lYWNoX3NnKHNnbGlzdCwgcywgbmVsZW1zLCBpKSB7Ci0JCXBhZGRyID0gc2dfcGh5cyhzKTsKLQotCQlzLT5kbWFfYWRkcmVzcyA9IF9fbWFwX3NpbmdsZShkZXYsIGRvbWFpbi0+cHJpdiwKLQkJCQkJICAgICAgcGFkZHIsIHMtPmxlbmd0aCwgZGlyLCBmYWxzZSwKLQkJCQkJICAgICAgZG1hX21hc2spOwotCi0JCWlmIChzLT5kbWFfYWRkcmVzcykgewotCQkJcy0+ZG1hX2xlbmd0aCA9IHMtPmxlbmd0aDsKLQkJCW1hcHBlZF9lbGVtcysrOwotCQl9IGVsc2UKLQkJCWdvdG8gdW5tYXA7Ci0JfQotCi0JZG9tYWluX2ZsdXNoX2NvbXBsZXRlKGRvbWFpbik7Ci0KLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiBtYXBwZWRfZWxlbXM7Ci11bm1hcDoKLQlmb3JfZWFjaF9zZyhzZ2xpc3QsIHMsIG1hcHBlZF9lbGVtcywgaSkgewotCQlpZiAocy0+ZG1hX2FkZHJlc3MpCi0JCQlfX3VubWFwX3NpbmdsZShkb21haW4tPnByaXYsIHMtPmRtYV9hZGRyZXNzLAotCQkJCSAgICAgICBzLT5kbWFfbGVuZ3RoLCBkaXIpOwotCQlzLT5kbWFfYWRkcmVzcyA9IHMtPmRtYV9sZW5ndGggPSAwOwotCX0KLQotCW1hcHBlZF9lbGVtcyA9IDA7Ci0KLQlnb3RvIG91dDsKLX0KLQotLyoKLSAqIFRoZSBleHBvcnRlZCBtYXBfc2cgZnVuY3Rpb24gZm9yIGRtYV9vcHMgKGhhbmRsZXMgc2NhdHRlci1nYXRoZXIKLSAqIGxpc3RzKS4KLSAqLwotc3RhdGljIHZvaWQgdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKLQkJICAgICBpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCi0JCSAgICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbjsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnM7Ci0JaW50IGk7Ci0KLQlJTkNfU1RBVFNfQ09VTlRFUihjbnRfdW5tYXBfc2cpOwotCi0JZG9tYWluID0gZ2V0X2RvbWFpbihkZXYpOwotCWlmIChJU19FUlIoZG9tYWluKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwotCi0JZm9yX2VhY2hfc2coc2dsaXN0LCBzLCBuZWxlbXMsIGkpIHsKLQkJX191bm1hcF9zaW5nbGUoZG9tYWluLT5wcml2LCBzLT5kbWFfYWRkcmVzcywKLQkJCSAgICAgICBzLT5kbWFfbGVuZ3RoLCBkaXIpOwotCQlzLT5kbWFfYWRkcmVzcyA9IHMtPmRtYV9sZW5ndGggPSAwOwotCX0KLQotCWRvbWFpbl9mbHVzaF9jb21wbGV0ZShkb21haW4pOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiBUaGUgZXhwb3J0ZWQgYWxsb2NfY29oZXJlbnQgZnVuY3Rpb24gZm9yIGRtYV9vcHMuCi0gKi8KLXN0YXRpYyB2b2lkICphbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCQkJICAgIGRtYV9hZGRyX3QgKmRtYV9hZGRyLCBnZnBfdCBmbGFnKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jdm9pZCAqdmlydF9hZGRyOwotCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluOwotCXBoeXNfYWRkcl90IHBhZGRyOwotCXU2NCBkbWFfbWFzayA9IGRldi0+Y29oZXJlbnRfZG1hX21hc2s7Ci0KLQlJTkNfU1RBVFNfQ09VTlRFUihjbnRfYWxsb2NfY29oZXJlbnQpOwotCi0JZG9tYWluID0gZ2V0X2RvbWFpbihkZXYpOwotCWlmIChQVFJfRVJSKGRvbWFpbikgPT0gLUVJTlZBTCkgewotCQl2aXJ0X2FkZHIgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoZmxhZywgZ2V0X29yZGVyKHNpemUpKTsKLQkJKmRtYV9hZGRyID0gX19wYSh2aXJ0X2FkZHIpOwotCQlyZXR1cm4gdmlydF9hZGRyOwotCX0gZWxzZSBpZiAoSVNfRVJSKGRvbWFpbikpCi0JCXJldHVybiBOVUxMOwotCi0JZG1hX21hc2sgID0gZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKLQlmbGFnICAgICAmPSB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9ETUEzMik7Ci0JZmxhZyAgICAgfD0gX19HRlBfWkVSTzsKLQotCXZpcnRfYWRkciA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFnLCBnZXRfb3JkZXIoc2l6ZSkpOwotCWlmICghdmlydF9hZGRyKQotCQlyZXR1cm4gTlVMTDsKLQotCXBhZGRyID0gdmlydF90b19waHlzKHZpcnRfYWRkcik7Ci0KLQlpZiAoIWRtYV9tYXNrKQotCQlkbWFfbWFzayA9ICpkZXYtPmRtYV9tYXNrOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwotCi0JKmRtYV9hZGRyID0gX19tYXBfc2luZ2xlKGRldiwgZG9tYWluLT5wcml2LCBwYWRkciwKLQkJCQkgc2l6ZSwgRE1BX0JJRElSRUNUSU9OQUwsIHRydWUsIGRtYV9tYXNrKTsKLQotCWlmICgqZG1hX2FkZHIgPT0gRE1BX0VSUk9SX0NPREUpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JZG9tYWluX2ZsdXNoX2NvbXBsZXRlKGRvbWFpbik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiB2aXJ0X2FkZHI7Ci0KLW91dF9mcmVlOgotCi0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2aXJ0X2FkZHIsIGdldF9vcmRlcihzaXplKSk7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIFRoZSBleHBvcnRlZCBmcmVlX2NvaGVyZW50IGZ1bmN0aW9uIGZvciBkbWFfb3BzLgotICovCi1zdGF0aWMgdm9pZCBmcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkgIHZvaWQgKnZpcnRfYWRkciwgZG1hX2FkZHJfdCBkbWFfYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluOwotCi0JSU5DX1NUQVRTX0NPVU5URVIoY250X2ZyZWVfY29oZXJlbnQpOwotCi0JZG9tYWluID0gZ2V0X2RvbWFpbihkZXYpOwotCWlmIChJU19FUlIoZG9tYWluKSkKLQkJZ290byBmcmVlX21lbTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKLQotCV9fdW5tYXBfc2luZ2xlKGRvbWFpbi0+cHJpdiwgZG1hX2FkZHIsIHNpemUsIERNQV9CSURJUkVDVElPTkFMKTsKLQotCWRvbWFpbl9mbHVzaF9jb21wbGV0ZShkb21haW4pOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7Ci0KLWZyZWVfbWVtOgotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdmlydF9hZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIERNQSBsYXllciB0byBmaW5kIG91dCBpZiB3ZSBjYW4gaGFuZGxlIGEKLSAqIHBhcnRpY3VsYXIgZGV2aWNlLiBJdCBpcyBwYXJ0IG9mIHRoZSBkbWFfb3BzLgotICovCi1zdGF0aWMgaW50IGFtZF9pb21tdV9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCi17Ci0JcmV0dXJuIGNoZWNrX2RldmljZShkZXYpOwotfQotCi0vKgotICogVGhlIGZ1bmN0aW9uIGZvciBwcmUtYWxsb2NhdGluZyBwcm90ZWN0aW9uIGRvbWFpbnMuCi0gKgotICogSWYgdGhlIGRyaXZlciBjb3JlIGluZm9ybXMgdGhlIERNQSBsYXllciBpZiBhIGRyaXZlciBncmFicyBhIGRldmljZQotICogd2UgZG9uJ3QgbmVlZCB0byBwcmVhbGxvY2F0ZSB0aGUgcHJvdGVjdGlvbiBkb21haW5zIGFueW1vcmUuCi0gKiBGb3Igbm93IHdlIGhhdmUgdG8uCi0gKi8KLXN0YXRpYyB2b2lkIHByZWFsbG9jX3Byb3RlY3Rpb25fZG9tYWlucyh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCXN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX2RvbTsKLQl1MTYgZGV2aWQ7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikgewotCi0JCS8qIERvIHdlIGhhbmRsZSB0aGlzIGRldmljZT8gKi8KLQkJaWYgKCFjaGVja19kZXZpY2UoJmRldi0+ZGV2KSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIElzIHRoZXJlIGFscmVhZHkgYW55IGRvbWFpbiBmb3IgaXQ/ICovCi0JCWlmIChkb21haW5fZm9yX2RldmljZSgmZGV2LT5kZXYpKQotCQkJY29udGludWU7Ci0KLQkJZGV2aWQgPSBnZXRfZGV2aWNlX2lkKCZkZXYtPmRldik7Ci0KLQkJZG1hX2RvbSA9IGRtYV9vcHNfZG9tYWluX2FsbG9jKCk7Ci0JCWlmICghZG1hX2RvbSkKLQkJCWNvbnRpbnVlOwotCQlpbml0X3VuaXR5X21hcHBpbmdzX2Zvcl9kZXZpY2UoZG1hX2RvbSwgZGV2aWQpOwotCQlkbWFfZG9tLT50YXJnZXRfZGV2ID0gZGV2aWQ7Ci0KLQkJYXR0YWNoX2RldmljZSgmZGV2LT5kZXYsICZkbWFfZG9tLT5kb21haW4pOwotCi0JCWxpc3RfYWRkX3RhaWwoJmRtYV9kb20tPmxpc3QsICZpb21tdV9wZF9saXN0KTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZG1hX21hcF9vcHMgYW1kX2lvbW11X2RtYV9vcHMgPSB7Ci0JLmFsbG9jX2NvaGVyZW50ID0gYWxsb2NfY29oZXJlbnQsCi0JLmZyZWVfY29oZXJlbnQgPSBmcmVlX2NvaGVyZW50LAotCS5tYXBfcGFnZSA9IG1hcF9wYWdlLAotCS51bm1hcF9wYWdlID0gdW5tYXBfcGFnZSwKLQkubWFwX3NnID0gbWFwX3NnLAotCS51bm1hcF9zZyA9IHVubWFwX3NnLAotCS5kbWFfc3VwcG9ydGVkID0gYW1kX2lvbW11X2RtYV9zdXBwb3J0ZWQsCi19OwotCi0vKgotICogVGhlIGZ1bmN0aW9uIHdoaWNoIGNsdWVzIHRoZSBBTUQgSU9NTVUgZHJpdmVyIGludG8gZG1hX29wcy4KLSAqLwotCi12b2lkIF9faW5pdCBhbWRfaW9tbXVfaW5pdF9hcGkodm9pZCkKLXsKLQlyZWdpc3Rlcl9pb21tdSgmYW1kX2lvbW11X29wcyk7Ci19Ci0KLWludCBfX2luaXQgYW1kX2lvbW11X2luaXRfZG1hX29wcyh2b2lkKQotewotCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OwotCWludCByZXQ7Ci0KLQkvKgotCSAqIGZpcnN0IGFsbG9jYXRlIGEgZGVmYXVsdCBwcm90ZWN0aW9uIGRvbWFpbiBmb3IgZXZlcnkgSU9NTVUgd2UKLQkgKiBmb3VuZCBpbiB0aGUgc3lzdGVtLiBEZXZpY2VzIG5vdCBhc3NpZ25lZCB0byBhbnkgb3RoZXIKLQkgKiBwcm90ZWN0aW9uIGRvbWFpbiB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBkZWZhdWx0IG9uZS4KLQkgKi8KLQlmb3JfZWFjaF9pb21tdShpb21tdSkgewotCQlpb21tdS0+ZGVmYXVsdF9kb20gPSBkbWFfb3BzX2RvbWFpbl9hbGxvYygpOwotCQlpZiAoaW9tbXUtPmRlZmF1bHRfZG9tID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJaW9tbXUtPmRlZmF1bHRfZG9tLT5kb21haW4uZmxhZ3MgfD0gUERfREVGQVVMVF9NQVNLOwotCQlyZXQgPSBpb21tdV9pbml0X3VuaXR5X21hcHBpbmdzKGlvbW11KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZnJlZV9kb21haW5zOwotCX0KLQotCS8qCi0JICogUHJlLWFsbG9jYXRlIHRoZSBwcm90ZWN0aW9uIGRvbWFpbnMgZm9yIGVhY2ggZGV2aWNlLgotCSAqLwotCXByZWFsbG9jX3Byb3RlY3Rpb25fZG9tYWlucygpOwotCi0JaW9tbXVfZGV0ZWN0ZWQgPSAxOwotCXN3aW90bGIgPSAwOwotCi0JLyogTWFrZSB0aGUgZHJpdmVyIGZpbmFsbHkgdmlzaWJsZSB0byB0aGUgZHJpdmVycyAqLwotCWRtYV9vcHMgPSAmYW1kX2lvbW11X2RtYV9vcHM7Ci0KLQlhbWRfaW9tbXVfc3RhdHNfaW5pdCgpOwotCi0JcmV0dXJuIDA7Ci0KLWZyZWVfZG9tYWluczoKLQotCWZvcl9lYWNoX2lvbW11KGlvbW11KSB7Ci0JCWlmIChpb21tdS0+ZGVmYXVsdF9kb20pCi0JCQlkbWFfb3BzX2RvbWFpbl9mcmVlKGlvbW11LT5kZWZhdWx0X2RvbSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYmVsb25nIHRvIHRoZSBleHBvcnRlZCBpbnRlcmZhY2Ugb2YgQU1EIElPTU1VCi0gKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGFjY2VzcyB0byBsb3dlciBsZXZlbCBmdW5jdGlvbnMgb2YgdGhlIElPTU1VCi0gKiBsaWtlIHByb3RlY3Rpb24gZG9tYWluIGhhbmRsaW5nIGFuZCBhc3NpZ25lbWVudCBvZiBkZXZpY2VzIHRvIGRvbWFpbnMKLSAqIHdoaWNoIGlzIG5vdCBwb3NzaWJsZSB3aXRoIHRoZSBkbWFfb3BzIGludGVyZmFjZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGNsZWFudXBfZG9tYWluKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQotewotCXN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGEsICpuZXh0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl3cml0ZV9sb2NrX2lycXNhdmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2X2RhdGEsIG5leHQsICZkb21haW4tPmRldl9saXN0LCBsaXN0KSB7Ci0JCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRldl9kYXRhLT5kZXY7Ci0KLQkJX19kZXRhY2hfZGV2aWNlKGRldik7Ci0JCWF0b21pY19zZXQoJmRldl9kYXRhLT5iaW5kLCAwKTsKLQl9Ci0KLQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYW1kX2lvbW11X2RldnRhYmxlX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcHJvdGVjdGlvbl9kb21haW5fZnJlZShzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKLXsKLQlpZiAoIWRvbWFpbikKLQkJcmV0dXJuOwotCi0JZGVsX2RvbWFpbl9mcm9tX2xpc3QoZG9tYWluKTsKLQotCWlmIChkb21haW4tPmlkKQotCQlkb21haW5faWRfZnJlZShkb21haW4tPmlkKTsKLQotCWtmcmVlKGRvbWFpbik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKnByb3RlY3Rpb25fZG9tYWluX2FsbG9jKHZvaWQpCi17Ci0Jc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW47Ci0KLQlkb21haW4gPSBremFsbG9jKHNpemVvZigqZG9tYWluKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkb21haW4pCi0JCXJldHVybiBOVUxMOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmRvbWFpbi0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmZG9tYWluLT5hcGlfbG9jayk7Ci0JZG9tYWluLT5pZCA9IGRvbWFpbl9pZF9hbGxvYygpOwotCWlmICghZG9tYWluLT5pZCkKLQkJZ290byBvdXRfZXJyOwotCUlOSVRfTElTVF9IRUFEKCZkb21haW4tPmRldl9saXN0KTsKLQotCWFkZF9kb21haW5fdG9fbGlzdChkb21haW4pOwotCi0JcmV0dXJuIGRvbWFpbjsKLQotb3V0X2VycjoKLQlrZnJlZShkb21haW4pOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgYW1kX2lvbW11X2RvbWFpbl9pbml0KHN0cnVjdCBpb21tdV9kb21haW4gKmRvbSkKLXsKLQlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbjsKLQotCWRvbWFpbiA9IHByb3RlY3Rpb25fZG9tYWluX2FsbG9jKCk7Ci0JaWYgKCFkb21haW4pCi0JCWdvdG8gb3V0X2ZyZWU7Ci0KLQlkb21haW4tPm1vZGUgICAgPSBQQUdFX01PREVfM19MRVZFTDsKLQlkb21haW4tPnB0X3Jvb3QgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIWRvbWFpbi0+cHRfcm9vdCkKLQkJZ290byBvdXRfZnJlZTsKLQotCWRvbS0+cHJpdiA9IGRvbWFpbjsKLQotCXJldHVybiAwOwotCi1vdXRfZnJlZToKLQlwcm90ZWN0aW9uX2RvbWFpbl9mcmVlKGRvbWFpbik7Ci0KLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgYW1kX2lvbW11X2RvbWFpbl9kZXN0cm95KHN0cnVjdCBpb21tdV9kb21haW4gKmRvbSkKLXsKLQlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiA9IGRvbS0+cHJpdjsKLQotCWlmICghZG9tYWluKQotCQlyZXR1cm47Ci0KLQlpZiAoZG9tYWluLT5kZXZfY250ID4gMCkKLQkJY2xlYW51cF9kb21haW4oZG9tYWluKTsKLQotCUJVR19PTihkb21haW4tPmRldl9jbnQgIT0gMCk7Ci0KLQlmcmVlX3BhZ2V0YWJsZShkb21haW4pOwotCi0JcHJvdGVjdGlvbl9kb21haW5fZnJlZShkb21haW4pOwotCi0JZG9tLT5wcml2ID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgYW1kX2lvbW11X2RldGFjaF9kZXZpY2Uoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tLAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7Ci0Jc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7Ci0JdTE2IGRldmlkOwotCi0JaWYgKCFjaGVja19kZXZpY2UoZGV2KSkKLQkJcmV0dXJuOwotCi0JZGV2aWQgPSBnZXRfZGV2aWNlX2lkKGRldik7Ci0KLQlpZiAoZGV2X2RhdGEtPmRvbWFpbiAhPSBOVUxMKQotCQlkZXRhY2hfZGV2aWNlKGRldik7Ci0KLQlpb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2RldmlkXTsKLQlpZiAoIWlvbW11KQotCQlyZXR1cm47Ci0KLQlkZXZpY2VfZmx1c2hfZHRlKGRldik7Ci0JaW9tbXVfY29tcGxldGlvbl93YWl0KGlvbW11KTsKLX0KLQotc3RhdGljIGludCBhbWRfaW9tbXVfYXR0YWNoX2RldmljZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb20sCi0JCQkJICAgc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluID0gZG9tLT5wcml2OwotCXN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGE7Ci0Jc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7Ci0JaW50IHJldDsKLQl1MTYgZGV2aWQ7Ci0KLQlpZiAoIWNoZWNrX2RldmljZShkZXYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldl9kYXRhID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKLQotCWRldmlkID0gZ2V0X2RldmljZV9pZChkZXYpOwotCi0JaW9tbXUgPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtkZXZpZF07Ci0JaWYgKCFpb21tdSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZGV2X2RhdGEtPmRvbWFpbikKLQkJZGV0YWNoX2RldmljZShkZXYpOwotCi0JcmV0ID0gYXR0YWNoX2RldmljZShkZXYsIGRvbWFpbik7Ci0KLQlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhbWRfaW9tbXVfbWFwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbSwgdW5zaWduZWQgbG9uZyBpb3ZhLAotCQkJIHBoeXNfYWRkcl90IHBhZGRyLCBpbnQgZ2ZwX29yZGVyLCBpbnQgaW9tbXVfcHJvdCkKLXsKLQl1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZSA9IDB4MTAwMFVMIDw8IGdmcF9vcmRlcjsKLQlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiA9IGRvbS0+cHJpdjsKLQlpbnQgcHJvdCA9IDA7Ci0JaW50IHJldDsKLQotCWlmIChpb21tdV9wcm90ICYgSU9NTVVfUkVBRCkKLQkJcHJvdCB8PSBJT01NVV9QUk9UX0lSOwotCWlmIChpb21tdV9wcm90ICYgSU9NTVVfV1JJVEUpCi0JCXByb3QgfD0gSU9NTVVfUFJPVF9JVzsKLQotCW11dGV4X2xvY2soJmRvbWFpbi0+YXBpX2xvY2spOwotCXJldCA9IGlvbW11X21hcF9wYWdlKGRvbWFpbiwgaW92YSwgcGFkZHIsIHByb3QsIHBhZ2Vfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZkb21haW4tPmFwaV9sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYW1kX2lvbW11X3VubWFwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbSwgdW5zaWduZWQgbG9uZyBpb3ZhLAotCQkJICAgaW50IGdmcF9vcmRlcikKLXsKLQlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiA9IGRvbS0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZSwgdW5tYXBfc2l6ZTsKLQotCXBhZ2Vfc2l6ZSAgPSAweDEwMDBVTCA8PCBnZnBfb3JkZXI7Ci0KLQltdXRleF9sb2NrKCZkb21haW4tPmFwaV9sb2NrKTsKLQl1bm1hcF9zaXplID0gaW9tbXVfdW5tYXBfcGFnZShkb21haW4sIGlvdmEsIHBhZ2Vfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZkb21haW4tPmFwaV9sb2NrKTsKLQotCWRvbWFpbl9mbHVzaF90bGJfcGRlKGRvbWFpbik7Ci0KLQlyZXR1cm4gZ2V0X29yZGVyKHVubWFwX3NpemUpOwotfQotCi1zdGF0aWMgcGh5c19hZGRyX3QgYW1kX2lvbW11X2lvdmFfdG9fcGh5cyhzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb20sCi0JCQkJCSAgdW5zaWduZWQgbG9uZyBpb3ZhKQotewotCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluID0gZG9tLT5wcml2OwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0X21hc2s7Ci0JcGh5c19hZGRyX3QgcGFkZHI7Ci0JdTY0ICpwdGUsIF9fcHRlOwotCi0JcHRlID0gZmV0Y2hfcHRlKGRvbWFpbiwgaW92YSk7Ci0KLQlpZiAoIXB0ZSB8fCAhSU9NTVVfUFRFX1BSRVNFTlQoKnB0ZSkpCi0JCXJldHVybiAwOwotCi0JaWYgKFBNX1BURV9MRVZFTCgqcHRlKSA9PSAwKQotCQlvZmZzZXRfbWFzayA9IFBBR0VfU0laRSAtIDE7Ci0JZWxzZQotCQlvZmZzZXRfbWFzayA9IFBURV9QQUdFX1NJWkUoKnB0ZSkgLSAxOwotCi0JX19wdGUgPSAqcHRlICYgUE1fQUREUl9NQVNLOwotCXBhZGRyID0gKF9fcHRlICYgfm9mZnNldF9tYXNrKSB8IChpb3ZhICYgb2Zmc2V0X21hc2spOwotCi0JcmV0dXJuIHBhZGRyOwotfQotCi1zdGF0aWMgaW50IGFtZF9pb21tdV9kb21haW5faGFzX2NhcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgY2FwKQotewotCXN3aXRjaCAoY2FwKSB7Ci0JY2FzZSBJT01NVV9DQVBfQ0FDSEVfQ09IRVJFTkNZOgotCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpb21tdV9vcHMgYW1kX2lvbW11X29wcyA9IHsKLQkuZG9tYWluX2luaXQgPSBhbWRfaW9tbXVfZG9tYWluX2luaXQsCi0JLmRvbWFpbl9kZXN0cm95ID0gYW1kX2lvbW11X2RvbWFpbl9kZXN0cm95LAotCS5hdHRhY2hfZGV2ID0gYW1kX2lvbW11X2F0dGFjaF9kZXZpY2UsCi0JLmRldGFjaF9kZXYgPSBhbWRfaW9tbXVfZGV0YWNoX2RldmljZSwKLQkubWFwID0gYW1kX2lvbW11X21hcCwKLQkudW5tYXAgPSBhbWRfaW9tbXVfdW5tYXAsCi0JLmlvdmFfdG9fcGh5cyA9IGFtZF9pb21tdV9pb3ZhX3RvX3BoeXMsCi0JLmRvbWFpbl9oYXNfY2FwID0gYW1kX2lvbW11X2RvbWFpbl9oYXNfY2FwLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlIG5leHQgZnVuY3Rpb25zIGRvIGEgYmFzaWMgaW5pdGlhbGl6YXRpb24gb2YgSU9NTVUgZm9yIHBhc3MgdGhyb3VnaAotICogbW9kZQotICoKLSAqIEluIHBhc3N0aHJvdWdoIG1vZGUgdGhlIElPTU1VIGlzIGluaXRpYWxpemVkIGFuZCBlbmFibGVkIGJ1dCBub3QgdXNlZCBmb3IKLSAqIERNQS1BUEkgdHJhbnNsYXRpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgX19pbml0IGFtZF9pb21tdV9pbml0X3Bhc3N0aHJvdWdoKHZvaWQpCi17Ci0Jc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7Ci0JdTE2IGRldmlkOwotCi0JLyogYWxsb2NhdGUgcGFzc3Rocm91Z2ggZG9tYWluICovCi0JcHRfZG9tYWluID0gcHJvdGVjdGlvbl9kb21haW5fYWxsb2MoKTsKLQlpZiAoIXB0X2RvbWFpbikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwdF9kb21haW4tPm1vZGUgfD0gUEFHRV9NT0RFX05PTkU7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikgewotCQlpZiAoIWNoZWNrX2RldmljZSgmZGV2LT5kZXYpKQotCQkJY29udGludWU7Ci0KLQkJZGV2aWQgPSBnZXRfZGV2aWNlX2lkKCZkZXYtPmRldik7Ci0KLQkJaW9tbXUgPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtkZXZpZF07Ci0JCWlmICghaW9tbXUpCi0JCQljb250aW51ZTsKLQotCQlhdHRhY2hfZGV2aWNlKCZkZXYtPmRldiwgcHRfZG9tYWluKTsKLQl9Ci0KLQlwcl9pbmZvKCJBTUQtVmk6IEluaXRpYWxpemVkIGZvciBQYXNzdGhyb3VnaCBNb2RlXG4iKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11X2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE3OWMyMS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11X2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KLSAqIEF1dGhvcjogSm9lcmcgUm9lZGVsIDxqb2VyZy5yb2VkZWxAYW1kLmNvbT4KLSAqICAgICAgICAgTGVvIER1cmFuIDxsZW8uZHVyYW5AYW1kLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tc2kuaD4KLSNpbmNsdWRlIDxhc20vcGNpLWRpcmVjdC5oPgotI2luY2x1ZGUgPGFzbS9hbWRfaW9tbXVfcHJvdG8uaD4KLSNpbmNsdWRlIDxhc20vYW1kX2lvbW11X3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2FtZF9pb21tdS5oPgotI2luY2x1ZGUgPGFzbS9pb21tdS5oPgotI2luY2x1ZGUgPGFzbS9nYXJ0Lmg+Ci0jaW5jbHVkZSA8YXNtL3g4Nl9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvbW11X3RhYmxlLmg+Ci0vKgotICogZGVmaW5pdGlvbnMgZm9yIHRoZSBBQ1BJIHNjYW5uaW5nIGNvZGUKLSAqLwotI2RlZmluZSBJVlJTX0hFQURFUl9MRU5HVEggNDgKLQotI2RlZmluZSBBQ1BJX0lWSERfVFlQRSAgICAgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgQUNQSV9JVk1EX1RZUEVfQUxMICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEFDUElfSVZNRF9UWVBFICAgICAgICAgICAgICAgICAgMHgyMQotI2RlZmluZSBBQ1BJX0lWTURfVFlQRV9SQU5HRSAgICAgICAgICAgIDB4MjIKLQotI2RlZmluZSBJVkhEX0RFVl9BTEwgICAgICAgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgSVZIRF9ERVZfU0VMRUNUICAgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIElWSERfREVWX1NFTEVDVF9SQU5HRV9TVEFSVCAgICAgMHgwMwotI2RlZmluZSBJVkhEX0RFVl9SQU5HRV9FTkQgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgSVZIRF9ERVZfQUxJQVMgICAgICAgICAgICAgICAgICAweDQyCi0jZGVmaW5lIElWSERfREVWX0FMSUFTX1JBTkdFICAgICAgICAgICAgMHg0MwotI2RlZmluZSBJVkhEX0RFVl9FWFRfU0VMRUNUICAgICAgICAgICAgIDB4NDYKLSNkZWZpbmUgSVZIRF9ERVZfRVhUX1NFTEVDVF9SQU5HRSAgICAgICAweDQ3Ci0KLSNkZWZpbmUgSVZIRF9GTEFHX0hUX1RVTl9FTl9NQVNLICAgICAgICAweDAxCi0jZGVmaW5lIElWSERfRkxBR19QQVNTUFdfRU5fTUFTSyAgICAgICAgMHgwMgotI2RlZmluZSBJVkhEX0ZMQUdfUkVTUEFTU1BXX0VOX01BU0sgICAgIDB4MDQKLSNkZWZpbmUgSVZIRF9GTEFHX0lTT0NfRU5fTUFTSyAgICAgICAgICAweDA4Ci0KLSNkZWZpbmUgSVZNRF9GTEFHX0VYQ0xfUkFOR0UgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIElWTURfRkxBR19VTklUWV9NQVAgICAgICAgICAgICAgMHgwMQotCi0jZGVmaW5lIEFDUElfREVWRkxBR19JTklUUEFTUyAgICAgICAgICAgMHgwMQotI2RlZmluZSBBQ1BJX0RFVkZMQUdfRVhUSU5UICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgQUNQSV9ERVZGTEFHX05NSSAgICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIEFDUElfREVWRkxBR19TWVNNR1QxICAgICAgICAgICAgMHgxMAotI2RlZmluZSBBQ1BJX0RFVkZMQUdfU1lTTUdUMiAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgQUNQSV9ERVZGTEFHX0xJTlQwICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIEFDUElfREVWRkxBR19MSU5UMSAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBBQ1BJX0RFVkZMQUdfQVRTRElTICAgICAgICAgICAgIDB4MTAwMDAwMDAKLQotLyoKLSAqIEFDUEkgdGFibGUgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGVzZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGxhaWQgb3ZlciB0aGUgdGFibGUgdG8gcGFyc2UgdGhlIGltcG9ydGFudCB2YWx1ZXMKLSAqIG91dCBvZiBpdC4KLSAqLwotCi0vKgotICogc3RydWN0dXJlIGRlc2NyaWJpbmcgb25lIElPTU1VIGluIHRoZSBBQ1BJIHRhYmxlLiBUeXBpY2FsbHkgZm9sbG93ZWQgYnkgb25lCi0gKiBvciBtb3JlIGl2aGRfZW50cnlzLgotICovCi1zdHJ1Y3QgaXZoZF9oZWFkZXIgewotCXU4IHR5cGU7Ci0JdTggZmxhZ3M7Ci0JdTE2IGxlbmd0aDsKLQl1MTYgZGV2aWQ7Ci0JdTE2IGNhcF9wdHI7Ci0JdTY0IG1taW9fcGh5czsKLQl1MTYgcGNpX3NlZzsKLQl1MTYgaW5mbzsKLQl1MzIgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQSBkZXZpY2UgZW50cnkgZGVzY3JpYmluZyB3aGljaCBkZXZpY2VzIGEgc3BlY2lmaWMgSU9NTVUgdHJhbnNsYXRlcyBhbmQKLSAqIHdoaWNoIHJlcXVlc3RvciBpZHMgdGhleSB1c2UuCi0gKi8KLXN0cnVjdCBpdmhkX2VudHJ5IHsKLQl1OCB0eXBlOwotCXUxNiBkZXZpZDsKLQl1OCBmbGFnczsKLQl1MzIgZXh0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIEFuIEFNRCBJT01NVSBtZW1vcnkgZGVmaW5pdGlvbiBzdHJ1Y3R1cmUuIEl0IGRlZmluZXMgdGhpbmdzIGxpa2UgZXhjbHVzaW9uCi0gKiByYW5nZXMgZm9yIGRldmljZXMgYW5kIHJlZ2lvbnMgdGhhdCBzaG91bGQgYmUgdW5pdHkgbWFwcGVkLgotICovCi1zdHJ1Y3QgaXZtZF9oZWFkZXIgewotCXU4IHR5cGU7Ci0JdTggZmxhZ3M7Ci0JdTE2IGxlbmd0aDsKLQl1MTYgZGV2aWQ7Ci0JdTE2IGF1eDsKLQl1NjQgcmVzdjsKLQl1NjQgcmFuZ2Vfc3RhcnQ7Ci0JdTY0IHJhbmdlX2xlbmd0aDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLWJvb2wgYW1kX2lvbW11X2R1bXA7Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBhbWRfaW9tbXVfZGV0ZWN0ZWQ7Ci1zdGF0aWMgYm9vbCBfX2luaXRkYXRhIGFtZF9pb21tdV9kaXNhYmxlZDsKLQotdTE2IGFtZF9pb21tdV9sYXN0X2JkZjsJCQkvKiBsYXJnZXN0IFBDSSBkZXZpY2UgaWQgd2UgaGF2ZQotCQkJCQkgICB0byBoYW5kbGUgKi8KLUxJU1RfSEVBRChhbWRfaW9tbXVfdW5pdHlfbWFwKTsJCS8qIGEgbGlzdCBvZiByZXF1aXJlZCB1bml0eSBtYXBwaW5ncwotCQkJCQkgICB3ZSBmaW5kIGluIEFDUEkgKi8KLWJvb2wgYW1kX2lvbW11X3VubWFwX2ZsdXNoOwkJLyogaWYgdHJ1ZSwgZmx1c2ggb24gZXZlcnkgdW5tYXAgKi8KLQotTElTVF9IRUFEKGFtZF9pb21tdV9saXN0KTsJCS8qIGxpc3Qgb2YgYWxsIEFNRCBJT01NVXMgaW4gdGhlCi0JCQkJCSAgIHN5c3RlbSAqLwotCi0vKiBBcnJheSB0byBhc3NpZ24gaW5kaWNlcyB0byBJT01NVXMqLwotc3RydWN0IGFtZF9pb21tdSAqYW1kX2lvbW11c1tNQVhfSU9NTVVTXTsKLWludCBhbWRfaW9tbXVzX3ByZXNlbnQ7Ci0KLS8qIElPTU1VcyBoYXZlIGEgbm9uLXByZXNlbnQgY2FjaGU/ICovCi1ib29sIGFtZF9pb21tdV9ucF9jYWNoZSBfX3JlYWRfbW9zdGx5OwotYm9vbCBhbWRfaW9tbXVfaW90bGJfc3VwIF9fcmVhZF9tb3N0bHkgPSB0cnVlOwotCi0vKgotICogVGhlIEFDUEkgdGFibGUgcGFyc2luZyBmdW5jdGlvbnMgc2V0IHRoaXMgdmFyaWFibGUgb24gYW4gZXJyb3IKLSAqLwotc3RhdGljIGludCBfX2luaXRkYXRhIGFtZF9pb21tdV9pbml0X2VycjsKLQotLyoKLSAqIExpc3Qgb2YgcHJvdGVjdGlvbiBkb21haW5zIC0gdXNlZCBkdXJpbmcgcmVzdW1lCi0gKi8KLUxJU1RfSEVBRChhbWRfaW9tbXVfcGRfbGlzdCk7Ci1zcGlubG9ja190IGFtZF9pb21tdV9wZF9sb2NrOwotCi0vKgotICogUG9pbnRlciB0byB0aGUgZGV2aWNlIHRhYmxlIHdoaWNoIGlzIHNoYXJlZCBieSBhbGwgQU1EIElPTU1VcwotICogaXQgaXMgaW5kZXhlZCBieSB0aGUgUENJIGRldmljZSBpZCBvciB0aGUgSFQgdW5pdCBpZCBhbmQgY29udGFpbnMKLSAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkb21haW4gdGhlIGRldmljZSBiZWxvbmdzIHRvIGFzIHdlbGwgYXMgdGhlCi0gKiBwYWdlIHRhYmxlIHJvb3QgcG9pbnRlci4KLSAqLwotc3RydWN0IGRldl90YWJsZV9lbnRyeSAqYW1kX2lvbW11X2Rldl90YWJsZTsKLQotLyoKLSAqIFRoZSBhbGlhcyB0YWJsZSBpcyBhIGRyaXZlciBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyB0aGUKLSAqIG1hcHBpbmdzIG9mIHRoZSBQQ0kgZGV2aWNlIGlkcyB0byB0aGUgYWN0dWFsIHJlcXVlc3RvciBpZHMgb24gdGhlIElPTU1VLgotICogTW9yZSB0aGFuIG9uZSBkZXZpY2UgY2FuIHNoYXJlIHRoZSBzYW1lIHJlcXVlc3RvciBpZC4KLSAqLwotdTE2ICphbWRfaW9tbXVfYWxpYXNfdGFibGU7Ci0KLS8qCi0gKiBUaGUgcmxvb2t1cCB0YWJsZSBpcyB1c2VkIHRvIGZpbmQgdGhlIElPTU1VIHdoaWNoIGlzIHJlc3BvbnNpYmxlCi0gKiBmb3IgYSBzcGVjaWZpYyBkZXZpY2UuIEl0IGlzIGFsc28gaW5kZXhlZCBieSB0aGUgUENJIGRldmljZSBpZC4KLSAqLwotc3RydWN0IGFtZF9pb21tdSAqKmFtZF9pb21tdV9ybG9va3VwX3RhYmxlOwotCi0vKgotICogQU1EIElPTU1VIGFsbG93cyB1cCB0byAyXjE2IGRpZmZlcmVuZCBwcm90ZWN0aW9uIGRvbWFpbnMuIFRoaXMgaXMgYSBiaXRtYXAKLSAqIHRvIGtub3cgd2hpY2ggb25lcyBhcmUgYWxyZWFkeSBpbiB1c2UuCi0gKi8KLXVuc2lnbmVkIGxvbmcgKmFtZF9pb21tdV9wZF9hbGxvY19iaXRtYXA7Ci0KLXN0YXRpYyB1MzIgZGV2X3RhYmxlX3NpemU7CS8qIHNpemUgb2YgdGhlIGRldmljZSB0YWJsZSAqLwotc3RhdGljIHUzMiBhbGlhc190YWJsZV9zaXplOwkvKiBzaXplIG9mIHRoZSBhbGlhcyB0YWJsZSAqLwotc3RhdGljIHUzMiBybG9va3VwX3RhYmxlX3NpemU7CS8qIHNpemUgaWYgdGhlIHJsb29rdXAgdGFibGUgKi8KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gZmx1c2hlcyBhbGwgaW50ZXJuYWwgY2FjaGVzIG9mCi0gKiB0aGUgSU9NTVUgdXNlZCBieSB0aGlzIGRyaXZlci4KLSAqLwotZXh0ZXJuIHZvaWQgaW9tbXVfZmx1c2hfYWxsX2NhY2hlcyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbGFzdF9kZXZpZCh1MTYgZGV2aWQpCi17Ci0JaWYgKGRldmlkID4gYW1kX2lvbW11X2xhc3RfYmRmKQotCQlhbWRfaW9tbXVfbGFzdF9iZGYgPSBkZXZpZDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRibF9zaXplKGludCBlbnRyeV9zaXplKQotewotCXVuc2lnbmVkIHNoaWZ0ID0gUEFHRV9TSElGVCArCi0JCQkgZ2V0X29yZGVyKCgoaW50KWFtZF9pb21tdV9sYXN0X2JkZiArIDEpICogZW50cnlfc2l6ZSk7Ci0KLQlyZXR1cm4gMVVMIDw8IHNoaWZ0OwotfQotCi0vKiBBY2Nlc3MgdG8gbDEgYW5kIGwyIGluZGV4ZWQgcmVnaXN0ZXIgc3BhY2VzICovCi0KLXN0YXRpYyB1MzIgaW9tbXVfcmVhZF9sMShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTE2IGwxLCB1OCBhZGRyZXNzKQotewotCXUzMiB2YWw7Ci0KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIDB4ZjgsIChhZGRyZXNzIHwgbDEgPDwgMTYpKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgMHhmYywgJnZhbCk7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfd3JpdGVfbDEoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHUxNiBsMSwgdTggYWRkcmVzcywgdTMyIHZhbCkKLXsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIDB4ZjgsIChhZGRyZXNzIHwgbDEgPDwgMTYgfCAxIDw8IDMxKSk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChpb21tdS0+ZGV2LCAweGZjLCB2YWwpOwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgMHhmOCwgKGFkZHJlc3MgfCBsMSA8PCAxNikpOwotfQotCi1zdGF0aWMgdTMyIGlvbW11X3JlYWRfbDIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHU4IGFkZHJlc3MpCi17Ci0JdTMyIHZhbDsKLQotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgMHhmMCwgYWRkcmVzcyk7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIDB4ZjQsICZ2YWwpOwotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbW11X3dyaXRlX2wyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCB1OCBhZGRyZXNzLCB1MzIgdmFsKQotewotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgMHhmMCwgKGFkZHJlc3MgfCAxIDw8IDgpKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIDB4ZjQsIHZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQU1EIElPTU1VIE1NSU8gcmVnaXN0ZXIgc3BhY2UgaGFuZGxpbmcgZnVuY3Rpb25zCi0gKgotICogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHByb2dyYW0gdGhlIElPTU1VIGRldmljZSByZWdpc3RlcnMgaW4KLSAqIE1NSU8gc3BhY2UgcmVxdWlyZWQgZm9yIHRoYXQgZHJpdmVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVGhpcyBmdW5jdGlvbiBzZXQgdGhlIGV4Y2x1c2lvbiByYW5nZSBpbiB0aGUgSU9NTVUuIERNQSBhY2Nlc3NlcyB0byB0aGUKLSAqIGV4Y2x1c2lvbiByYW5nZSBhcmUgcGFzc2VkIHRocm91Z2ggdW50cmFuc2xhdGVkCi0gKi8KLXN0YXRpYyB2b2lkIGlvbW11X3NldF9leGNsdXNpb25fcmFuZ2Uoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCi17Ci0JdTY0IHN0YXJ0ID0gaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCAmIFBBR0VfTUFTSzsKLQl1NjQgbGltaXQgPSAoc3RhcnQgKyBpb21tdS0+ZXhjbHVzaW9uX2xlbmd0aCkgJiBQQUdFX01BU0s7Ci0JdTY0IGVudHJ5OwotCi0JaWYgKCFpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0KQotCQlyZXR1cm47Ci0KLQllbnRyeSA9IHN0YXJ0IHwgTU1JT19FWENMX0VOQUJMRV9NQVNLOwotCW1lbWNweV90b2lvKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0VYQ0xfQkFTRV9PRkZTRVQsCi0JCQkmZW50cnksIHNpemVvZihlbnRyeSkpOwotCi0JZW50cnkgPSBsaW1pdDsKLQltZW1jcHlfdG9pbyhpb21tdS0+bW1pb19iYXNlICsgTU1JT19FWENMX0xJTUlUX09GRlNFVCwKLQkJCSZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7Ci19Ci0KLS8qIFByb2dyYW1zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgdGFibGUgaW50byB0aGUgSU9NTVUgaGFyZHdhcmUgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBpb21tdV9zZXRfZGV2aWNlX3RhYmxlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQotewotCXU2NCBlbnRyeTsKLQotCUJVR19PTihpb21tdS0+bW1pb19iYXNlID09IE5VTEwpOwotCi0JZW50cnkgPSB2aXJ0X3RvX3BoeXMoYW1kX2lvbW11X2Rldl90YWJsZSk7Ci0JZW50cnkgfD0gKGRldl90YWJsZV9zaXplID4+IDEyKSAtIDE7Ci0JbWVtY3B5X3RvaW8oaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fREVWX1RBQkxFX09GRlNFVCwKLQkJCSZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7Ci19Ci0KLS8qIEdlbmVyaWMgZnVuY3Rpb25zIHRvIGVuYWJsZS9kaXNhYmxlIGNlcnRhaW4gZmVhdHVyZXMgb2YgdGhlIElPTU1VLiAqLwotc3RhdGljIHZvaWQgaW9tbXVfZmVhdHVyZV9lbmFibGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHU4IGJpdCkKLXsKLQl1MzIgY3RybDsKLQotCWN0cmwgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19DT05UUk9MX09GRlNFVCk7Ci0JY3RybCB8PSAoMSA8PCBiaXQpOwotCXdyaXRlbChjdHJsLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19DT05UUk9MX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbW11X2ZlYXR1cmVfZGlzYWJsZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTggYml0KQotewotCXUzMiBjdHJsOwotCi0JY3RybCA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NPTlRST0xfT0ZGU0VUKTsKLQljdHJsICY9IH4oMSA8PCBiaXQpOwotCXdyaXRlbChjdHJsLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19DT05UUk9MX09GRlNFVCk7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGVuYWJsZSB0aGUgaGFyZHdhcmUgKi8KLXN0YXRpYyB2b2lkIGlvbW11X2VuYWJsZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKLXsKLQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZlYXRfc3RyW10gPSB7Ci0JCSJQcmVGIiwgIlBQUiIsICJYMkFQSUMiLCAiTlgiLCAiR1QiLCAiWzVdIiwKLQkJIklBIiwgIkdBIiwgIkhFIiwgIlBDIiwgTlVMTAotCX07Ci0JaW50IGk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJBTUQtVmk6IEVuYWJsaW5nIElPTU1VIGF0ICVzIGNhcCAweCVoeCIsCi0JICAgICAgIGRldl9uYW1lKCZpb21tdS0+ZGV2LT5kZXYpLCBpb21tdS0+Y2FwX3B0cik7Ci0KLQlpZiAoaW9tbXUtPmNhcCAmICgxIDw8IElPTU1VX0NBUF9FRlIpKSB7Ci0JCXByaW50ayhLRVJOX0NPTlQgIiBleHRlbmRlZCBmZWF0dXJlczogIik7Ci0JCWZvciAoaSA9IDA7IGZlYXRfc3RyW2ldOyArK2kpCi0JCQlpZiAoaW9tbXVfZmVhdHVyZShpb21tdSwgKDFVTEwgPDwgaSkpKQotCQkJCXByaW50ayhLRVJOX0NPTlQgIiAlcyIsIGZlYXRfc3RyW2ldKTsKLQl9Ci0JcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKLQotCWlvbW11X2ZlYXR1cmVfZW5hYmxlKGlvbW11LCBDT05UUk9MX0lPTU1VX0VOKTsKLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfZGlzYWJsZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKLXsKLQkvKiBEaXNhYmxlIGNvbW1hbmQgYnVmZmVyICovCi0JaW9tbXVfZmVhdHVyZV9kaXNhYmxlKGlvbW11LCBDT05UUk9MX0NNREJVRl9FTik7Ci0KLQkvKiBEaXNhYmxlIGV2ZW50IGxvZ2dpbmcgYW5kIGV2ZW50IGludGVycnVwdHMgKi8KLQlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfRVZUX0lOVF9FTik7Ci0JaW9tbXVfZmVhdHVyZV9kaXNhYmxlKGlvbW11LCBDT05UUk9MX0VWVF9MT0dfRU4pOwotCi0JLyogRGlzYWJsZSBJT01NVSBoYXJkd2FyZSBpdHNlbGYgKi8KLQlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfSU9NTVVfRU4pOwotfQotCi0vKgotICogbWFwcGluZyBhbmQgdW5tYXBwaW5nIGZ1bmN0aW9ucyBmb3IgdGhlIElPTU1VIE1NSU8gc3BhY2UuIEVhY2ggQU1EIElPTU1VIGluCi0gKiB0aGUgc3lzdGVtIGhhcyBvbmUuCi0gKi8KLXN0YXRpYyB1OCAqIF9faW5pdCBpb21tdV9tYXBfbW1pb19zcGFjZSh1NjQgYWRkcmVzcykKLXsKLQl1OCAqcmV0OwotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYWRkcmVzcywgTU1JT19SRUdJT05fTEVOR1RILCAiYW1kX2lvbW11IikpIHsKLQkJcHJfZXJyKCJBTUQtVmk6IENhbiBub3QgcmVzZXJ2ZSBtZW1vcnkgcmVnaW9uICVsbHggZm9yIG1taW9cbiIsCi0JCQlhZGRyZXNzKTsKLQkJcHJfZXJyKCJBTUQtVmk6IFRoaXMgaXMgYSBCSU9TIGJ1Zy4gUGxlYXNlIGNvbnRhY3QgeW91ciBoYXJkd2FyZSB2ZW5kb3JcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXQgPSBpb3JlbWFwX25vY2FjaGUoYWRkcmVzcywgTU1JT19SRUdJT05fTEVOR1RIKTsKLQlpZiAocmV0ICE9IE5VTEwpCi0JCXJldHVybiByZXQ7Ci0KLQlyZWxlYXNlX21lbV9yZWdpb24oYWRkcmVzcywgTU1JT19SRUdJT05fTEVOR1RIKTsKLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgaW9tbXVfdW5tYXBfbW1pb19zcGFjZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKLXsKLQlpZiAoaW9tbXUtPm1taW9fYmFzZSkKLQkJaW91bm1hcChpb21tdS0+bW1pb19iYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oaW9tbXUtPm1taW9fcGh5cywgTU1JT19SRUdJT05fTEVOR1RIKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGUgZnVuY3Rpb25zIGJlbG93IGJlbG9uZyB0byB0aGUgZmlyc3QgcGFzcyBvZiBBTUQgSU9NTVUgQUNQSSB0YWJsZQotICogcGFyc2luZy4gSW4gdGhpcyBwYXNzIHdlIHRyeSB0byBmaW5kIG91dCB0aGUgaGlnaGVzdCBkZXZpY2UgaWQgdGhpcwotICogY29kZSBoYXMgdG8gaGFuZGxlLiBVcG9uIHRoaXMgaW5mb3JtYXRpb24gdGhlIHNpemUgb2YgdGhlIHNoYXJlZCBkYXRhCi0gKiBzdHJ1Y3R1cmVzIGlzIGRldGVybWluZWQgbGF0ZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIGdpdmVuIElWSEQgZW50cnkKLSAqLwotc3RhdGljIGlubGluZSBpbnQgaXZoZF9lbnRyeV9sZW5ndGgodTggKml2aGQpCi17Ci0JcmV0dXJuIDB4MDQgPDwgKCppdmhkID4+IDYpOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbGFzdCBkZXZpY2UgaWQgdGhlIElPTU1VIGhhcyB0byBoYW5kbGUgZnJvbSB0aGUgUENJCi0gKiBjYXBhYmlsaXR5IGhlYWRlciBmb3IgdGhpcyBJT01NVQotICovCi1zdGF0aWMgaW50IF9faW5pdCBmaW5kX2xhc3RfZGV2aWRfb25fcGNpKGludCBidXMsIGludCBkZXYsIGludCBmbiwgaW50IGNhcF9wdHIpCi17Ci0JdTMyIGNhcDsKLQotCWNhcCA9IHJlYWRfcGNpX2NvbmZpZyhidXMsIGRldiwgZm4sIGNhcF9wdHIrTU1JT19SQU5HRV9PRkZTRVQpOwotCXVwZGF0ZV9sYXN0X2RldmlkKGNhbGNfZGV2aWQoTU1JT19HRVRfQlVTKGNhcCksIE1NSU9fR0VUX0xEKGNhcCkpKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQWZ0ZXIgcmVhZGluZyB0aGUgaGlnaGVzdCBkZXZpY2UgaWQgZnJvbSB0aGUgSU9NTVUgUENJIGNhcGFiaWxpdHkgaGVhZGVyCi0gKiB0aGlzIGZ1bmN0aW9uIGxvb2tzIGlmIHRoZXJlIGlzIGEgaGlnaGVyIGRldmljZSBpZCBkZWZpbmVkIGluIHRoZSBBQ1BJIHRhYmxlCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGZpbmRfbGFzdF9kZXZpZF9mcm9tX2l2aGQoc3RydWN0IGl2aGRfaGVhZGVyICpoKQotewotCXU4ICpwID0gKHZvaWQgKiloLCAqZW5kID0gKHZvaWQgKiloOwotCXN0cnVjdCBpdmhkX2VudHJ5ICpkZXY7Ci0KLQlwICs9IHNpemVvZigqaCk7Ci0JZW5kICs9IGgtPmxlbmd0aDsKLQotCWZpbmRfbGFzdF9kZXZpZF9vbl9wY2koUENJX0JVUyhoLT5kZXZpZCksCi0JCQlQQ0lfU0xPVChoLT5kZXZpZCksCi0JCQlQQ0lfRlVOQyhoLT5kZXZpZCksCi0JCQloLT5jYXBfcHRyKTsKLQotCXdoaWxlIChwIDwgZW5kKSB7Ci0JCWRldiA9IChzdHJ1Y3QgaXZoZF9lbnRyeSAqKXA7Ci0JCXN3aXRjaCAoZGV2LT50eXBlKSB7Ci0JCWNhc2UgSVZIRF9ERVZfU0VMRUNUOgotCQljYXNlIElWSERfREVWX1JBTkdFX0VORDoKLQkJY2FzZSBJVkhEX0RFVl9BTElBUzoKLQkJY2FzZSBJVkhEX0RFVl9FWFRfU0VMRUNUOgotCQkJLyogYWxsIHRoZSBhYm92ZSBzdWJmaWVsZCB0eXBlcyByZWZlciB0byBkZXZpY2UgaWRzICovCi0JCQl1cGRhdGVfbGFzdF9kZXZpZChkZXYtPmRldmlkKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJcCArPSBpdmhkX2VudHJ5X2xlbmd0aChwKTsKLQl9Ci0KLQlXQVJOX09OKHAgIT0gZW5kKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogSXRlcmF0ZSBvdmVyIGFsbCBJVkhEIGVudHJpZXMgaW4gdGhlIEFDUEkgdGFibGUgYW5kIGZpbmQgdGhlIGhpZ2hlc3QgZGV2aWNlCi0gKiBpZCB3aGljaCB3ZSBuZWVkIHRvIGhhbmRsZS4gVGhpcyBpcyB0aGUgZmlyc3Qgb2YgdGhyZWUgZnVuY3Rpb25zIHdoaWNoIHBhcnNlCi0gKiB0aGUgQUNQSSB0YWJsZS4gU28gd2UgY2hlY2sgdGhlIGNoZWNrc3VtIGhlcmUuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGZpbmRfbGFzdF9kZXZpZF9hY3BpKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCi17Ci0JaW50IGk7Ci0JdTggY2hlY2tzdW0gPSAwLCAqcCA9ICh1OCAqKXRhYmxlLCAqZW5kID0gKHU4ICopdGFibGU7Ci0Jc3RydWN0IGl2aGRfaGVhZGVyICpoOwotCi0JLyoKLQkgKiBWYWxpZGF0ZSBjaGVja3N1bSBoZXJlIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gaXQgd2hlbgotCSAqIHdlIGFjdHVhbGx5IHBhcnNlIHRoZSB0YWJsZQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCB0YWJsZS0+bGVuZ3RoOyArK2kpCi0JCWNoZWNrc3VtICs9IHBbaV07Ci0JaWYgKGNoZWNrc3VtICE9IDApIHsKLQkJLyogQUNQSSB0YWJsZSBjb3JydXB0ICovCi0JCWFtZF9pb21tdV9pbml0X2VyciA9IC1FTk9ERVY7Ci0JCXJldHVybiAwOwotCX0KLQotCXAgKz0gSVZSU19IRUFERVJfTEVOR1RIOwotCi0JZW5kICs9IHRhYmxlLT5sZW5ndGg7Ci0Jd2hpbGUgKHAgPCBlbmQpIHsKLQkJaCA9IChzdHJ1Y3QgaXZoZF9oZWFkZXIgKilwOwotCQlzd2l0Y2ggKGgtPnR5cGUpIHsKLQkJY2FzZSBBQ1BJX0lWSERfVFlQRToKLQkJCWZpbmRfbGFzdF9kZXZpZF9mcm9tX2l2aGQoaCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCXAgKz0gaC0+bGVuZ3RoOwotCX0KLQlXQVJOX09OKHAgIT0gZW5kKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGJlbG9uZyB0aGUgdGhlIGNvZGUgcGF0aCB3aGljaCBwYXJzZXMgdGhlIEFDUEkgdGFibGUKLSAqIHRoZSBzZWNvbmQgdGltZS4gSW4gdGhpcyBBQ1BJIHBhcnNpbmcgaXRlcmF0aW9uIHdlIGFsbG9jYXRlIElPTU1VIHNwZWNpZmljCi0gKiBkYXRhIHN0cnVjdHVyZXMsIGluaXRpYWxpemUgdGhlIGRldmljZS9hbGlhcy9ybG9va3VwIHRhYmxlIGFuZCBhbHNvCi0gKiBiYXNpY2FsbHkgaW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBBbGxvY2F0ZXMgdGhlIGNvbW1hbmQgYnVmZmVyLiBUaGlzIGJ1ZmZlciBpcyBwZXIgQU1EIElPTU1VLiBXZSBjYW4KLSAqIHdyaXRlIGNvbW1hbmRzIHRvIHRoYXQgYnVmZmVyIGxhdGVyIGFuZCB0aGUgSU9NTVUgd2lsbCBleGVjdXRlIHRoZW0KLSAqIGFzeW5jaHJvbm91c2x5Ci0gKi8KLXN0YXRpYyB1OCAqIF9faW5pdCBhbGxvY19jb21tYW5kX2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKLXsKLQl1OCAqY21kX2J1ZiA9ICh1OCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCi0JCQlnZXRfb3JkZXIoQ01EX0JVRkZFUl9TSVpFKSk7Ci0KLQlpZiAoY21kX2J1ZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWlvbW11LT5jbWRfYnVmX3NpemUgPSBDTURfQlVGRkVSX1NJWkUgfCBDTURfQlVGRkVSX1VOSU5JVElBTElaRUQ7Ci0KLQlyZXR1cm4gY21kX2J1ZjsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBjb21tYW5kIGJ1ZmZlciBpZiB0aGUgSU9NTVUgc3RvcHBlZCBmZXRjaGluZwotICogY29tbWFuZHMgZnJvbSBpdC4KLSAqLwotdm9pZCBhbWRfaW9tbXVfcmVzZXRfY21kX2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKLXsKLQlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfQ01EQlVGX0VOKTsKLQotCXdyaXRlbCgweDAwLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19DTURfSEVBRF9PRkZTRVQpOwotCXdyaXRlbCgweDAwLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19DTURfVEFJTF9PRkZTRVQpOwotCi0JaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfQ01EQlVGX0VOKTsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBjb21tYW5kIGJ1ZmZlciBhZGRyZXNzIHRvIHRoZSBoYXJkd2FyZSBhbmQKLSAqIGVuYWJsZXMgaXQuCi0gKi8KLXN0YXRpYyB2b2lkIGlvbW11X2VuYWJsZV9jb21tYW5kX2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKLXsKLQl1NjQgZW50cnk7Ci0KLQlCVUdfT04oaW9tbXUtPmNtZF9idWYgPT0gTlVMTCk7Ci0KLQllbnRyeSA9ICh1NjQpdmlydF90b19waHlzKGlvbW11LT5jbWRfYnVmKTsKLQllbnRyeSB8PSBNTUlPX0NNRF9TSVpFXzUxMjsKLQotCW1lbWNweV90b2lvKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9CVUZfT0ZGU0VULAotCQkgICAgJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKLQotCWFtZF9pb21tdV9yZXNldF9jbWRfYnVmZmVyKGlvbW11KTsKLQlpb21tdS0+Y21kX2J1Zl9zaXplICY9IH4oQ01EX0JVRkZFUl9VTklOSVRJQUxJWkVEKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGZyZWVfY29tbWFuZF9idWZmZXIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCi17Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpb21tdS0+Y21kX2J1ZiwKLQkJICAgZ2V0X29yZGVyKGlvbW11LT5jbWRfYnVmX3NpemUgJiB+KENNRF9CVUZGRVJfVU5JTklUSUFMSVpFRCkpKTsKLX0KLQotLyogYWxsb2NhdGVzIHRoZSBtZW1vcnkgd2hlcmUgdGhlIElPTU1VIHdpbGwgbG9nIGl0cyBldmVudHMgdG8gKi8KLXN0YXRpYyB1OCAqIF9faW5pdCBhbGxvY19ldmVudF9idWZmZXIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCi17Ci0JaW9tbXUtPmV2dF9idWYgPSAodTggKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAotCQkJCQkJZ2V0X29yZGVyKEVWVF9CVUZGRVJfU0laRSkpOwotCi0JaWYgKGlvbW11LT5ldnRfYnVmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JaW9tbXUtPmV2dF9idWZfc2l6ZSA9IEVWVF9CVUZGRVJfU0laRTsKLQotCXJldHVybiBpb21tdS0+ZXZ0X2J1ZjsKLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfZW5hYmxlX2V2ZW50X2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKLXsKLQl1NjQgZW50cnk7Ci0KLQlCVUdfT04oaW9tbXUtPmV2dF9idWYgPT0gTlVMTCk7Ci0KLQllbnRyeSA9ICh1NjQpdmlydF90b19waHlzKGlvbW11LT5ldnRfYnVmKSB8IEVWVF9MRU5fTUFTSzsKLQotCW1lbWNweV90b2lvKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0VWVF9CVUZfT0ZGU0VULAotCQkgICAgJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKLQotCS8qIHNldCBoZWFkIGFuZCB0YWlsIHRvIHplcm8gbWFudWFsbHkgKi8KLQl3cml0ZWwoMHgwMCwgaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fRVZUX0hFQURfT0ZGU0VUKTsKLQl3cml0ZWwoMHgwMCwgaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fRVZUX1RBSUxfT0ZGU0VUKTsKLQotCWlvbW11X2ZlYXR1cmVfZW5hYmxlKGlvbW11LCBDT05UUk9MX0VWVF9MT0dfRU4pOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZnJlZV9ldmVudF9idWZmZXIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCi17Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpb21tdS0+ZXZ0X2J1ZiwgZ2V0X29yZGVyKEVWVF9CVUZGRVJfU0laRSkpOwotfQotCi0vKiBzZXRzIGEgc3BlY2lmaWMgYml0IGluIHRoZSBkZXZpY2UgdGFibGUgZW50cnkuICovCi1zdGF0aWMgdm9pZCBzZXRfZGV2X2VudHJ5X2JpdCh1MTYgZGV2aWQsIHU4IGJpdCkKLXsKLQlpbnQgaSA9IChiaXQgPj4gNSkgJiAweDA3OwotCWludCBfYml0ID0gYml0ICYgMHgxZjsKLQotCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbaV0gfD0gKDEgPDwgX2JpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2Rldl9lbnRyeV9iaXQodTE2IGRldmlkLCB1OCBiaXQpCi17Ci0JaW50IGkgPSAoYml0ID4+IDUpICYgMHgwNzsKLQlpbnQgX2JpdCA9IGJpdCAmIDB4MWY7Ci0KLQlyZXR1cm4gKGFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbaV0gJiAoMSA8PCBfYml0KSkgPj4gX2JpdDsKLX0KLQotCi12b2lkIGFtZF9pb21tdV9hcHBseV9lcnJhdHVtXzYzKHUxNiBkZXZpZCkKLXsKLQlpbnQgc3lzbWd0OwotCi0Jc3lzbWd0ID0gZ2V0X2Rldl9lbnRyeV9iaXQoZGV2aWQsIERFVl9FTlRSWV9TWVNNR1QxKSB8Ci0JCSAoZ2V0X2Rldl9lbnRyeV9iaXQoZGV2aWQsIERFVl9FTlRSWV9TWVNNR1QyKSA8PCAxKTsKLQotCWlmIChzeXNtZ3QgPT0gMHgwMSkKLQkJc2V0X2Rldl9lbnRyeV9iaXQoZGV2aWQsIERFVl9FTlRSWV9JVyk7Ci19Ci0KLS8qIFdyaXRlcyB0aGUgc3BlY2lmaWMgSU9NTVUgZm9yIGEgZGV2aWNlIGludG8gdGhlIHJsb29rdXAgdGFibGUgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfaW9tbXVfZm9yX2RldmljZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTE2IGRldmlkKQotewotCWFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2RldmlkXSA9IGlvbW11OwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgZGV2aWNlIHNwZWNpZmljIGZsYWdzIHJlYWQgZnJvbSB0aGUgQUNQSQotICogdGFibGUgYW5kIHNldHMgdXAgdGhlIGRldmljZSB0YWJsZSBlbnRyeSB3aXRoIHRoYXQgaW5mb3JtYXRpb24KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHNldF9kZXZfZW50cnlfZnJvbV9hY3BpKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LAotCQkJCQkgICB1MTYgZGV2aWQsIHUzMiBmbGFncywgdTMyIGV4dF9mbGFncykKLXsKLQlpZiAoZmxhZ3MgJiBBQ1BJX0RFVkZMQUdfSU5JVFBBU1MpCi0JCXNldF9kZXZfZW50cnlfYml0KGRldmlkLCBERVZfRU5UUllfSU5JVF9QQVNTKTsKLQlpZiAoZmxhZ3MgJiBBQ1BJX0RFVkZMQUdfRVhUSU5UKQotCQlzZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX0VJTlRfUEFTUyk7Ci0JaWYgKGZsYWdzICYgQUNQSV9ERVZGTEFHX05NSSkKLQkJc2V0X2Rldl9lbnRyeV9iaXQoZGV2aWQsIERFVl9FTlRSWV9OTUlfUEFTUyk7Ci0JaWYgKGZsYWdzICYgQUNQSV9ERVZGTEFHX1NZU01HVDEpCi0JCXNldF9kZXZfZW50cnlfYml0KGRldmlkLCBERVZfRU5UUllfU1lTTUdUMSk7Ci0JaWYgKGZsYWdzICYgQUNQSV9ERVZGTEFHX1NZU01HVDIpCi0JCXNldF9kZXZfZW50cnlfYml0KGRldmlkLCBERVZfRU5UUllfU1lTTUdUMik7Ci0JaWYgKGZsYWdzICYgQUNQSV9ERVZGTEFHX0xJTlQwKQotCQlzZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX0xJTlQwX1BBU1MpOwotCWlmIChmbGFncyAmIEFDUElfREVWRkxBR19MSU5UMSkKLQkJc2V0X2Rldl9lbnRyeV9iaXQoZGV2aWQsIERFVl9FTlRSWV9MSU5UMV9QQVNTKTsKLQotCWFtZF9pb21tdV9hcHBseV9lcnJhdHVtXzYzKGRldmlkKTsKLQotCXNldF9pb21tdV9mb3JfZGV2aWNlKGlvbW11LCBkZXZpZCk7Ci19Ci0KLS8qCi0gKiBSZWFkcyB0aGUgZGV2aWNlIGV4Y2x1c2lvbiByYW5nZSBmcm9tIEFDUEkgYW5kIGluaXRpYWxpemUgSU9NTVUgd2l0aAotICogaXQKLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHNldF9kZXZpY2VfZXhjbHVzaW9uX3JhbmdlKHUxNiBkZXZpZCwgc3RydWN0IGl2bWRfaGVhZGVyICptKQotewotCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOwotCi0JaWYgKCEobS0+ZmxhZ3MgJiBJVk1EX0ZMQUdfRVhDTF9SQU5HRSkpCi0JCXJldHVybjsKLQotCWlmIChpb21tdSkgewotCQkvKgotCQkgKiBXZSBvbmx5IGNhbiBjb25maWd1cmUgZXhjbHVzaW9uIHJhbmdlcyBwZXIgSU9NTVUsIG5vdAotCQkgKiBwZXIgZGV2aWNlLiBCdXQgd2UgY2FuIGVuYWJsZSB0aGUgZXhjbHVzaW9uIHJhbmdlIHBlcgotCQkgKiBkZXZpY2UuIFRoaXMgaXMgZG9uZSBoZXJlCi0JCSAqLwotCQlzZXRfZGV2X2VudHJ5X2JpdChtLT5kZXZpZCwgREVWX0VOVFJZX0VYKTsKLQkJaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCA9IG0tPnJhbmdlX3N0YXJ0OwotCQlpb21tdS0+ZXhjbHVzaW9uX2xlbmd0aCA9IG0tPnJhbmdlX2xlbmd0aDsKLQl9Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHNvbWUgaW1wb3J0YW50IGRhdGEgZnJvbSB0aGUgSU9NTVUgUENJIHNwYWNlIGFuZAotICogaW5pdGlhbGl6ZXMgdGhlIGRyaXZlciBkYXRhIHN0cnVjdHVyZSB3aXRoIGl0LiBJdCByZWFkcyB0aGUgaGFyZHdhcmUKLSAqIGNhcGFiaWxpdGllcyBhbmQgdGhlIGZpcnN0L2xhc3QgZGV2aWNlIGVudHJpZXMKLSAqLwotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaW9tbXVfZnJvbV9wY2koc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCi17Ci0JaW50IGNhcF9wdHIgPSBpb21tdS0+Y2FwX3B0cjsKLQl1MzIgcmFuZ2UsIG1pc2MsIGxvdywgaGlnaDsKLQlpbnQgaSwgajsKLQotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpb21tdS0+ZGV2LCBjYXBfcHRyICsgTU1JT19DQVBfSERSX09GRlNFVCwKLQkJCSAgICAgICZpb21tdS0+Y2FwKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgY2FwX3B0ciArIE1NSU9fUkFOR0VfT0ZGU0VULAotCQkJICAgICAgJnJhbmdlKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgY2FwX3B0ciArIE1NSU9fTUlTQ19PRkZTRVQsCi0JCQkgICAgICAmbWlzYyk7Ci0KLQlpb21tdS0+Zmlyc3RfZGV2aWNlID0gY2FsY19kZXZpZChNTUlPX0dFVF9CVVMocmFuZ2UpLAotCQkJCQkgTU1JT19HRVRfRkQocmFuZ2UpKTsKLQlpb21tdS0+bGFzdF9kZXZpY2UgPSBjYWxjX2RldmlkKE1NSU9fR0VUX0JVUyhyYW5nZSksCi0JCQkJCU1NSU9fR0VUX0xEKHJhbmdlKSk7Ci0JaW9tbXUtPmV2dF9tc2lfbnVtID0gTU1JT19NU0lfTlVNKG1pc2MpOwotCi0JaWYgKCEoaW9tbXUtPmNhcCAmICgxIDw8IElPTU1VX0NBUF9JT1RMQikpKQotCQlhbWRfaW9tbXVfaW90bGJfc3VwID0gZmFsc2U7Ci0KLQkvKiByZWFkIGV4dGVuZGVkIGZlYXR1cmUgYml0cyAqLwotCWxvdyAgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19FWFRfRkVBVFVSRVMpOwotCWhpZ2ggPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19FWFRfRkVBVFVSRVMgKyA0KTsKLQotCWlvbW11LT5mZWF0dXJlcyA9ICgodTY0KWhpZ2ggPDwgMzIpIHwgbG93OwotCi0JaWYgKCFpc19yZDg5MF9pb21tdShpb21tdS0+ZGV2KSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBTb21lIHJkODkwIHN5c3RlbXMgbWF5IG5vdCBiZSBmdWxseSByZWNvbmZpZ3VyZWQgYnkgdGhlIEJJT1MsIHNvCi0JICogaXQncyBuZWNlc3NhcnkgZm9yIHVzIHRvIHN0b3JlIHRoaXMgaW5mb3JtYXRpb24gc28gaXQgY2FuIGJlCi0JICogcmVwcm9ncmFtbWVkIG9uIHJlc3VtZQotCSAqLwotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIGlvbW11LT5jYXBfcHRyICsgNCwKLQkJCSAgICAgICZpb21tdS0+c3RvcmVkX2FkZHJfbG8pOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpb21tdS0+ZGV2LCBpb21tdS0+Y2FwX3B0ciArIDgsCi0JCQkgICAgICAmaW9tbXUtPnN0b3JlZF9hZGRyX2hpKTsKLQotCS8qIExvdyBiaXQgbG9ja3Mgd3JpdGVzIHRvIGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KLQlpb21tdS0+c3RvcmVkX2FkZHJfbG8gJj0gfjE7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgMHgxMjsgaisrKQotCQkJaW9tbXUtPnN0b3JlZF9sMVtpXVtqXSA9IGlvbW11X3JlYWRfbDEoaW9tbXUsIGksIGopOwotCi0JZm9yIChpID0gMDsgaSA8IDB4ODM7IGkrKykKLQkJaW9tbXUtPnN0b3JlZF9sMltpXSA9IGlvbW11X3JlYWRfbDIoaW9tbXUsIGkpOwotfQotCi0vKgotICogVGFrZXMgYSBwb2ludGVyIHRvIGFuIEFNRCBJT01NVSBlbnRyeSBpbiB0aGUgQUNQSSB0YWJsZSBhbmQKLSAqIGluaXRpYWxpemVzIHRoZSBoYXJkd2FyZSBhbmQgb3VyIGRhdGEgc3RydWN0dXJlcyB3aXRoIGl0LgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9pb21tdV9mcm9tX2FjcGkoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsCi0JCQkJCXN0cnVjdCBpdmhkX2hlYWRlciAqaCkKLXsKLQl1OCAqcCA9ICh1OCAqKWg7Ci0JdTggKmVuZCA9IHAsIGZsYWdzID0gMDsKLQl1MTYgZGV2X2ksIGRldmlkID0gMCwgZGV2aWRfc3RhcnQgPSAwLCBkZXZpZF90byA9IDA7Ci0JdTMyIGV4dF9mbGFncyA9IDA7Ci0JYm9vbCBhbGlhcyA9IGZhbHNlOwotCXN0cnVjdCBpdmhkX2VudHJ5ICplOwotCi0JLyoKLQkgKiBGaXJzdCBzYXZlIHRoZSByZWNvbW1lbmRlZCBmZWF0dXJlIGVuYWJsZSBiaXRzIGZyb20gQUNQSQotCSAqLwotCWlvbW11LT5hY3BpX2ZsYWdzID0gaC0+ZmxhZ3M7Ci0KLQkvKgotCSAqIERvbmUuIE5vdyBwYXJzZSB0aGUgZGV2aWNlIGVudHJpZXMKLQkgKi8KLQlwICs9IHNpemVvZihzdHJ1Y3QgaXZoZF9oZWFkZXIpOwotCWVuZCArPSBoLT5sZW5ndGg7Ci0KLQotCXdoaWxlIChwIDwgZW5kKSB7Ci0JCWUgPSAoc3RydWN0IGl2aGRfZW50cnkgKilwOwotCQlzd2l0Y2ggKGUtPnR5cGUpIHsKLQkJY2FzZSBJVkhEX0RFVl9BTEw6Ci0KLQkJCURVTVBfcHJpbnRrKCIgIERFVl9BTExcdFx0XHQgZmlyc3QgZGV2aWQ6ICUwMng6JTAyeC4leCIKLQkJCQkgICAgIiBsYXN0IGRldmljZSAlMDJ4OiUwMnguJXggZmxhZ3M6ICUwMnhcbiIsCi0JCQkJICAgIFBDSV9CVVMoaW9tbXUtPmZpcnN0X2RldmljZSksCi0JCQkJICAgIFBDSV9TTE9UKGlvbW11LT5maXJzdF9kZXZpY2UpLAotCQkJCSAgICBQQ0lfRlVOQyhpb21tdS0+Zmlyc3RfZGV2aWNlKSwKLQkJCQkgICAgUENJX0JVUyhpb21tdS0+bGFzdF9kZXZpY2UpLAotCQkJCSAgICBQQ0lfU0xPVChpb21tdS0+bGFzdF9kZXZpY2UpLAotCQkJCSAgICBQQ0lfRlVOQyhpb21tdS0+bGFzdF9kZXZpY2UpLAotCQkJCSAgICBlLT5mbGFncyk7Ci0KLQkJCWZvciAoZGV2X2kgPSBpb21tdS0+Zmlyc3RfZGV2aWNlOwotCQkJCQlkZXZfaSA8PSBpb21tdS0+bGFzdF9kZXZpY2U7ICsrZGV2X2kpCi0JCQkJc2V0X2Rldl9lbnRyeV9mcm9tX2FjcGkoaW9tbXUsIGRldl9pLAotCQkJCQkJCWUtPmZsYWdzLCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIElWSERfREVWX1NFTEVDVDoKLQotCQkJRFVNUF9wcmludGsoIiAgREVWX1NFTEVDVFx0XHRcdCBkZXZpZDogJTAyeDolMDJ4LiV4ICIKLQkJCQkgICAgImZsYWdzOiAlMDJ4XG4iLAotCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKLQkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAotCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCi0JCQkJICAgIGUtPmZsYWdzKTsKLQotCQkJZGV2aWQgPSBlLT5kZXZpZDsKLQkJCXNldF9kZXZfZW50cnlfZnJvbV9hY3BpKGlvbW11LCBkZXZpZCwgZS0+ZmxhZ3MsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVZIRF9ERVZfU0VMRUNUX1JBTkdFX1NUQVJUOgotCi0JCQlEVU1QX3ByaW50aygiICBERVZfU0VMRUNUX1JBTkdFX1NUQVJUXHQgIgotCQkJCSAgICAiZGV2aWQ6ICUwMng6JTAyeC4leCBmbGFnczogJTAyeFxuIiwKLQkJCQkgICAgUENJX0JVUyhlLT5kZXZpZCksCi0JCQkJICAgIFBDSV9TTE9UKGUtPmRldmlkKSwKLQkJCQkgICAgUENJX0ZVTkMoZS0+ZGV2aWQpLAotCQkJCSAgICBlLT5mbGFncyk7Ci0KLQkJCWRldmlkX3N0YXJ0ID0gZS0+ZGV2aWQ7Ci0JCQlmbGFncyA9IGUtPmZsYWdzOwotCQkJZXh0X2ZsYWdzID0gMDsKLQkJCWFsaWFzID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJY2FzZSBJVkhEX0RFVl9BTElBUzoKLQotCQkJRFVNUF9wcmludGsoIiAgREVWX0FMSUFTXHRcdFx0IGRldmlkOiAlMDJ4OiUwMnguJXggIgotCQkJCSAgICAiZmxhZ3M6ICUwMnggZGV2aWRfdG86ICUwMng6JTAyeC4leFxuIiwKLQkJCQkgICAgUENJX0JVUyhlLT5kZXZpZCksCi0JCQkJICAgIFBDSV9TTE9UKGUtPmRldmlkKSwKLQkJCQkgICAgUENJX0ZVTkMoZS0+ZGV2aWQpLAotCQkJCSAgICBlLT5mbGFncywKLQkJCQkgICAgUENJX0JVUyhlLT5leHQgPj4gOCksCi0JCQkJICAgIFBDSV9TTE9UKGUtPmV4dCA+PiA4KSwKLQkJCQkgICAgUENJX0ZVTkMoZS0+ZXh0ID4+IDgpKTsKLQotCQkJZGV2aWQgPSBlLT5kZXZpZDsKLQkJCWRldmlkX3RvID0gZS0+ZXh0ID4+IDg7Ci0JCQlzZXRfZGV2X2VudHJ5X2Zyb21fYWNwaShpb21tdSwgZGV2aWQgICAsIGUtPmZsYWdzLCAwKTsKLQkJCXNldF9kZXZfZW50cnlfZnJvbV9hY3BpKGlvbW11LCBkZXZpZF90bywgZS0+ZmxhZ3MsIDApOwotCQkJYW1kX2lvbW11X2FsaWFzX3RhYmxlW2RldmlkXSA9IGRldmlkX3RvOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVZIRF9ERVZfQUxJQVNfUkFOR0U6Ci0KLQkJCURVTVBfcHJpbnRrKCIgIERFVl9BTElBU19SQU5HRVx0XHQgIgotCQkJCSAgICAiZGV2aWQ6ICUwMng6JTAyeC4leCBmbGFnczogJTAyeCAiCi0JCQkJICAgICJkZXZpZF90bzogJTAyeDolMDJ4LiV4XG4iLAotCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKLQkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAotCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCi0JCQkJICAgIGUtPmZsYWdzLAotCQkJCSAgICBQQ0lfQlVTKGUtPmV4dCA+PiA4KSwKLQkJCQkgICAgUENJX1NMT1QoZS0+ZXh0ID4+IDgpLAotCQkJCSAgICBQQ0lfRlVOQyhlLT5leHQgPj4gOCkpOwotCi0JCQlkZXZpZF9zdGFydCA9IGUtPmRldmlkOwotCQkJZmxhZ3MgPSBlLT5mbGFnczsKLQkJCWRldmlkX3RvID0gZS0+ZXh0ID4+IDg7Ci0JCQlleHRfZmxhZ3MgPSAwOwotCQkJYWxpYXMgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVZIRF9ERVZfRVhUX1NFTEVDVDoKLQotCQkJRFVNUF9wcmludGsoIiAgREVWX0VYVF9TRUxFQ1RcdFx0IGRldmlkOiAlMDJ4OiUwMnguJXggIgotCQkJCSAgICAiZmxhZ3M6ICUwMnggZXh0OiAlMDh4XG4iLAotCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKLQkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAotCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCi0JCQkJICAgIGUtPmZsYWdzLCBlLT5leHQpOwotCi0JCQlkZXZpZCA9IGUtPmRldmlkOwotCQkJc2V0X2Rldl9lbnRyeV9mcm9tX2FjcGkoaW9tbXUsIGRldmlkLCBlLT5mbGFncywKLQkJCQkJCWUtPmV4dCk7Ci0JCQlicmVhazsKLQkJY2FzZSBJVkhEX0RFVl9FWFRfU0VMRUNUX1JBTkdFOgotCi0JCQlEVU1QX3ByaW50aygiICBERVZfRVhUX1NFTEVDVF9SQU5HRVx0IGRldmlkOiAiCi0JCQkJICAgICIlMDJ4OiUwMnguJXggZmxhZ3M6ICUwMnggZXh0OiAlMDh4XG4iLAotCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKLQkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAotCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCi0JCQkJICAgIGUtPmZsYWdzLCBlLT5leHQpOwotCi0JCQlkZXZpZF9zdGFydCA9IGUtPmRldmlkOwotCQkJZmxhZ3MgPSBlLT5mbGFnczsKLQkJCWV4dF9mbGFncyA9IGUtPmV4dDsKLQkJCWFsaWFzID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJY2FzZSBJVkhEX0RFVl9SQU5HRV9FTkQ6Ci0KLQkJCURVTVBfcHJpbnRrKCIgIERFVl9SQU5HRV9FTkRcdFx0IGRldmlkOiAlMDJ4OiUwMnguJXhcbiIsCi0JCQkJICAgIFBDSV9CVVMoZS0+ZGV2aWQpLAotCQkJCSAgICBQQ0lfU0xPVChlLT5kZXZpZCksCi0JCQkJICAgIFBDSV9GVU5DKGUtPmRldmlkKSk7Ci0KLQkJCWRldmlkID0gZS0+ZGV2aWQ7Ci0JCQlmb3IgKGRldl9pID0gZGV2aWRfc3RhcnQ7IGRldl9pIDw9IGRldmlkOyArK2Rldl9pKSB7Ci0JCQkJaWYgKGFsaWFzKSB7Ci0JCQkJCWFtZF9pb21tdV9hbGlhc190YWJsZVtkZXZfaV0gPSBkZXZpZF90bzsKLQkJCQkJc2V0X2Rldl9lbnRyeV9mcm9tX2FjcGkoaW9tbXUsCi0JCQkJCQlkZXZpZF90bywgZmxhZ3MsIGV4dF9mbGFncyk7Ci0JCQkJfQotCQkJCXNldF9kZXZfZW50cnlfZnJvbV9hY3BpKGlvbW11LCBkZXZfaSwKLQkJCQkJCQlmbGFncywgZXh0X2ZsYWdzKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQlwICs9IGl2aGRfZW50cnlfbGVuZ3RoKHApOwotCX0KLX0KLQotLyogSW5pdGlhbGl6ZXMgdGhlIGRldmljZS0+aW9tbXUgbWFwcGluZyBmb3IgdGhlIGRyaXZlciAqLwotc3RhdGljIGludCBfX2luaXQgaW5pdF9pb21tdV9kZXZpY2VzKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQotewotCXUxNiBpOwotCi0JZm9yIChpID0gaW9tbXUtPmZpcnN0X2RldmljZTsgaSA8PSBpb21tdS0+bGFzdF9kZXZpY2U7ICsraSkKLQkJc2V0X2lvbW11X2Zvcl9kZXZpY2UoaW9tbXUsIGkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBmcmVlX2lvbW11X29uZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKLXsKLQlmcmVlX2NvbW1hbmRfYnVmZmVyKGlvbW11KTsKLQlmcmVlX2V2ZW50X2J1ZmZlcihpb21tdSk7Ci0JaW9tbXVfdW5tYXBfbW1pb19zcGFjZShpb21tdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBmcmVlX2lvbW11X2FsbCh2b2lkKQotewotCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCAqbmV4dDsKLQotCWZvcl9lYWNoX2lvbW11X3NhZmUoaW9tbXUsIG5leHQpIHsKLQkJbGlzdF9kZWwoJmlvbW11LT5saXN0KTsKLQkJZnJlZV9pb21tdV9vbmUoaW9tbXUpOwotCQlrZnJlZShpb21tdSk7Ci0JfQotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBjbHVlcyB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIG9uZSBJT01NVQotICogdG9nZXRoZXIgYW5kIGFsc28gYWxsb2NhdGVzIHRoZSBjb21tYW5kIGJ1ZmZlciBhbmQgcHJvZ3JhbXMgdGhlCi0gKiBoYXJkd2FyZS4gSXQgZG9lcyBOT1QgZW5hYmxlIHRoZSBJT01NVS4gVGhpcyBpcyBkb25lIGFmdGVyd2FyZHMuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfaW9tbXVfb25lKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCBzdHJ1Y3QgaXZoZF9oZWFkZXIgKmgpCi17Ci0Jc3Bpbl9sb2NrX2luaXQoJmlvbW11LT5sb2NrKTsKLQotCS8qIEFkZCBJT01NVSB0byBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQlsaXN0X2FkZF90YWlsKCZpb21tdS0+bGlzdCwgJmFtZF9pb21tdV9saXN0KTsKLQlpb21tdS0+aW5kZXggICAgICAgICAgICAgPSBhbWRfaW9tbXVzX3ByZXNlbnQrKzsKLQotCWlmICh1bmxpa2VseShpb21tdS0+aW5kZXggPj0gTUFYX0lPTU1VUykpIHsKLQkJV0FSTigxLCAiQU1ELVZpOiBTeXN0ZW0gaGFzIG1vcmUgSU9NTVVzIHRoYW4gc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JfQotCi0JLyogSW5kZXggaXMgZmluZSAtIGFkZCBJT01NVSB0byB0aGUgYXJyYXkgKi8KLQlhbWRfaW9tbXVzW2lvbW11LT5pbmRleF0gPSBpb21tdTsKLQotCS8qCi0JICogQ29weSBkYXRhIGZyb20gQUNQSSB0YWJsZSBlbnRyeSB0byB0aGUgaW9tbXUgc3RydWN0Ci0JICovCi0JaW9tbXUtPmRldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KFBDSV9CVVMoaC0+ZGV2aWQpLCBoLT5kZXZpZCAmIDB4ZmYpOwotCWlmICghaW9tbXUtPmRldikKLQkJcmV0dXJuIDE7Ci0KLQlpb21tdS0+Y2FwX3B0ciA9IGgtPmNhcF9wdHI7Ci0JaW9tbXUtPnBjaV9zZWcgPSBoLT5wY2lfc2VnOwotCWlvbW11LT5tbWlvX3BoeXMgPSBoLT5tbWlvX3BoeXM7Ci0JaW9tbXUtPm1taW9fYmFzZSA9IGlvbW11X21hcF9tbWlvX3NwYWNlKGgtPm1taW9fcGh5cyk7Ci0JaWYgKCFpb21tdS0+bW1pb19iYXNlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlvbW11LT5jbWRfYnVmID0gYWxsb2NfY29tbWFuZF9idWZmZXIoaW9tbXUpOwotCWlmICghaW9tbXUtPmNtZF9idWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaW9tbXUtPmV2dF9idWYgPSBhbGxvY19ldmVudF9idWZmZXIoaW9tbXUpOwotCWlmICghaW9tbXUtPmV2dF9idWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaW9tbXUtPmludF9lbmFibGVkID0gZmFsc2U7Ci0KLQlpbml0X2lvbW11X2Zyb21fcGNpKGlvbW11KTsKLQlpbml0X2lvbW11X2Zyb21fYWNwaShpb21tdSwgaCk7Ci0JaW5pdF9pb21tdV9kZXZpY2VzKGlvbW11KTsKLQotCWlmIChpb21tdS0+Y2FwICYgKDFVTCA8PCBJT01NVV9DQVBfTlBDQUNIRSkpCi0JCWFtZF9pb21tdV9ucF9jYWNoZSA9IHRydWU7Ci0KLQlyZXR1cm4gcGNpX2VuYWJsZV9kZXZpY2UoaW9tbXUtPmRldik7Ci19Ci0KLS8qCi0gKiBJdGVyYXRlcyBvdmVyIGFsbCBJT01NVSBlbnRyaWVzIGluIHRoZSBBQ1BJIHRhYmxlLCBhbGxvY2F0ZXMgdGhlCi0gKiBJT01NVSBzdHJ1Y3R1cmUgYW5kIGluaXRpYWxpemVzIGl0IHdpdGggaW5pdF9pb21tdV9vbmUoKQotICovCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2lvbW11X2FsbChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKQotewotCXU4ICpwID0gKHU4ICopdGFibGUsICplbmQgPSAodTggKil0YWJsZTsKLQlzdHJ1Y3QgaXZoZF9oZWFkZXIgKmg7Ci0Jc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7Ci0JaW50IHJldDsKLQotCWVuZCArPSB0YWJsZS0+bGVuZ3RoOwotCXAgKz0gSVZSU19IRUFERVJfTEVOR1RIOwotCi0Jd2hpbGUgKHAgPCBlbmQpIHsKLQkJaCA9IChzdHJ1Y3QgaXZoZF9oZWFkZXIgKilwOwotCQlzd2l0Y2ggKCpwKSB7Ci0JCWNhc2UgQUNQSV9JVkhEX1RZUEU6Ci0KLQkJCURVTVBfcHJpbnRrKCJkZXZpY2U6ICUwMng6JTAyeC4lMDF4IGNhcDogJTA0eCAiCi0JCQkJICAgICJzZWc6ICVkIGZsYWdzOiAlMDF4IGluZm8gJTA0eFxuIiwKLQkJCQkgICAgUENJX0JVUyhoLT5kZXZpZCksIFBDSV9TTE9UKGgtPmRldmlkKSwKLQkJCQkgICAgUENJX0ZVTkMoaC0+ZGV2aWQpLCBoLT5jYXBfcHRyLAotCQkJCSAgICBoLT5wY2lfc2VnLCBoLT5mbGFncywgaC0+aW5mbyk7Ci0JCQlEVU1QX3ByaW50aygiICAgICAgIG1taW8tYWRkcjogJTAxNmxseFxuIiwKLQkJCQkgICAgaC0+bW1pb19waHlzKTsKLQotCQkJaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYW1kX2lvbW11KSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoaW9tbXUgPT0gTlVMTCkgewotCQkJCWFtZF9pb21tdV9pbml0X2VyciA9IC1FTk9NRU07Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCXJldCA9IGluaXRfaW9tbXVfb25lKGlvbW11LCBoKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlhbWRfaW9tbXVfaW5pdF9lcnIgPSByZXQ7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCXAgKz0gaC0+bGVuZ3RoOwotCi0JfQotCVdBUk5fT04ocCAhPSBlbmQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaW5pdGlhbGl6ZSB0aGUgTVNJIGludGVycnVwdHMgZm9yIGFsbCBJT01NVXMKLSAqIGluIHRoZSBzeXN0ZW0uIEl0cyBhIGJpdCBjaGFsbGVuZ2luZyBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlCi0gKiBJT01NVXMgcGVyIFBDSSBCREYgYnV0IHdlIGNhbiBjYWxsIHBjaV9lbmFibGVfbXNpKHgpIG9ubHkgb25jZSBwZXIKLSAqIHBjaV9kZXYuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgaW9tbXVfc2V0dXBfbXNpKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQotewotCWludCByOwotCi0JaWYgKHBjaV9lbmFibGVfbXNpKGlvbW11LT5kZXYpKQotCQlyZXR1cm4gMTsKLQotCXIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpb21tdS0+ZGV2LT5pcnEsCi0JCQkJIGFtZF9pb21tdV9pbnRfaGFuZGxlciwKLQkJCQkgYW1kX2lvbW11X2ludF90aHJlYWQsCi0JCQkJIDAsICJBTUQtVmkiLAotCQkJCSBpb21tdS0+ZGV2KTsKLQotCWlmIChyKSB7Ci0JCXBjaV9kaXNhYmxlX21zaShpb21tdS0+ZGV2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaW9tbXUtPmludF9lbmFibGVkID0gdHJ1ZTsKLQlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9FVlRfSU5UX0VOKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlvbW11X2luaXRfbXNpKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQotewotCWlmIChpb21tdS0+aW50X2VuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoaW9tbXUtPmRldiwgUENJX0NBUF9JRF9NU0kpKQotCQlyZXR1cm4gaW9tbXVfc2V0dXBfbXNpKGlvbW11KTsKLQotCXJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoZSBuZXh0IGZ1bmN0aW9ucyBiZWxvbmcgdG8gdGhlIHRoaXJkIHBhc3Mgb2YgcGFyc2luZyB0aGUgQUNQSQotICogdGFibGUuIEluIHRoaXMgbGFzdCBwYXNzIHRoZSBtZW1vcnkgbWFwcGluZyByZXF1aXJlbWVudHMgYXJlCi0gKiBnYXRoZXJlZCAobGlrZSBleGNsdXNpb24gYW5kIHVuaXR5IG1hcHBpbmcgcmVhbmdlcykuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBmcmVlX3VuaXR5X21hcHModm9pZCkKLXsKLQlzdHJ1Y3QgdW5pdHlfbWFwX2VudHJ5ICplbnRyeSwgKm5leHQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsICZhbWRfaW9tbXVfdW5pdHlfbWFwLCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0JCWtmcmVlKGVudHJ5KTsKLQl9Ci19Ci0KLS8qIGNhbGxlZCB3aGVuIHdlIGZpbmQgYW4gZXhjbHVzaW9uIHJhbmdlIGRlZmluaXRpb24gaW4gQUNQSSAqLwotc3RhdGljIGludCBfX2luaXQgaW5pdF9leGNsdXNpb25fcmFuZ2Uoc3RydWN0IGl2bWRfaGVhZGVyICptKQotewotCWludCBpOwotCi0Jc3dpdGNoIChtLT50eXBlKSB7Ci0JY2FzZSBBQ1BJX0lWTURfVFlQRToKLQkJc2V0X2RldmljZV9leGNsdXNpb25fcmFuZ2UobS0+ZGV2aWQsIG0pOwotCQlicmVhazsKLQljYXNlIEFDUElfSVZNRF9UWVBFX0FMTDoKLQkJZm9yIChpID0gMDsgaSA8PSBhbWRfaW9tbXVfbGFzdF9iZGY7ICsraSkKLQkJCXNldF9kZXZpY2VfZXhjbHVzaW9uX3JhbmdlKGksIG0pOwotCQlicmVhazsKLQljYXNlIEFDUElfSVZNRF9UWVBFX1JBTkdFOgotCQlmb3IgKGkgPSBtLT5kZXZpZDsgaSA8PSBtLT5hdXg7ICsraSkKLQkJCXNldF9kZXZpY2VfZXhjbHVzaW9uX3JhbmdlKGksIG0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogY2FsbGVkIGZvciB1bml0eSBtYXAgQUNQSSBkZWZpbml0aW9uICovCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X3VuaXR5X21hcF9yYW5nZShzdHJ1Y3QgaXZtZF9oZWFkZXIgKm0pCi17Ci0Jc3RydWN0IHVuaXR5X21hcF9lbnRyeSAqZSA9IDA7Ci0JY2hhciAqczsKLQotCWUgPSBremFsbG9jKHNpemVvZigqZSksIEdGUF9LRVJORUwpOwotCWlmIChlID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3dpdGNoIChtLT50eXBlKSB7Ci0JZGVmYXVsdDoKLQkJa2ZyZWUoZSk7Ci0JCXJldHVybiAwOwotCWNhc2UgQUNQSV9JVk1EX1RZUEU6Ci0JCXMgPSAiSVZNRF9UWVBFaVx0XHRcdCI7Ci0JCWUtPmRldmlkX3N0YXJ0ID0gZS0+ZGV2aWRfZW5kID0gbS0+ZGV2aWQ7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9JVk1EX1RZUEVfQUxMOgotCQlzID0gIklWTURfVFlQRV9BTExcdFx0IjsKLQkJZS0+ZGV2aWRfc3RhcnQgPSAwOwotCQllLT5kZXZpZF9lbmQgPSBhbWRfaW9tbXVfbGFzdF9iZGY7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9JVk1EX1RZUEVfUkFOR0U6Ci0JCXMgPSAiSVZNRF9UWVBFX1JBTkdFXHRcdCI7Ci0JCWUtPmRldmlkX3N0YXJ0ID0gbS0+ZGV2aWQ7Ci0JCWUtPmRldmlkX2VuZCA9IG0tPmF1eDsKLQkJYnJlYWs7Ci0JfQotCWUtPmFkZHJlc3Nfc3RhcnQgPSBQQUdFX0FMSUdOKG0tPnJhbmdlX3N0YXJ0KTsKLQllLT5hZGRyZXNzX2VuZCA9IGUtPmFkZHJlc3Nfc3RhcnQgKyBQQUdFX0FMSUdOKG0tPnJhbmdlX2xlbmd0aCk7Ci0JZS0+cHJvdCA9IG0tPmZsYWdzID4+IDE7Ci0KLQlEVU1QX3ByaW50aygiJXMgZGV2aWRfc3RhcnQ6ICUwMng6JTAyeC4leCBkZXZpZF9lbmQ6ICUwMng6JTAyeC4leCIKLQkJICAgICIgcmFuZ2Vfc3RhcnQ6ICUwMTZsbHggcmFuZ2VfZW5kOiAlMDE2bGx4IGZsYWdzOiAleFxuIiwgcywKLQkJICAgIFBDSV9CVVMoZS0+ZGV2aWRfc3RhcnQpLCBQQ0lfU0xPVChlLT5kZXZpZF9zdGFydCksCi0JCSAgICBQQ0lfRlVOQyhlLT5kZXZpZF9zdGFydCksIFBDSV9CVVMoZS0+ZGV2aWRfZW5kKSwKLQkJICAgIFBDSV9TTE9UKGUtPmRldmlkX2VuZCksIFBDSV9GVU5DKGUtPmRldmlkX2VuZCksCi0JCSAgICBlLT5hZGRyZXNzX3N0YXJ0LCBlLT5hZGRyZXNzX2VuZCwgbS0+ZmxhZ3MpOwotCi0JbGlzdF9hZGRfdGFpbCgmZS0+bGlzdCwgJmFtZF9pb21tdV91bml0eV9tYXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGl0ZXJhdGVzIG92ZXIgYWxsIG1lbW9yeSBkZWZpbml0aW9ucyB3ZSBmaW5kIGluIHRoZSBBQ1BJIHRhYmxlICovCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X21lbW9yeV9kZWZpbml0aW9ucyhzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKQotewotCXU4ICpwID0gKHU4ICopdGFibGUsICplbmQgPSAodTggKil0YWJsZTsKLQlzdHJ1Y3QgaXZtZF9oZWFkZXIgKm07Ci0KLQllbmQgKz0gdGFibGUtPmxlbmd0aDsKLQlwICs9IElWUlNfSEVBREVSX0xFTkdUSDsKLQotCXdoaWxlIChwIDwgZW5kKSB7Ci0JCW0gPSAoc3RydWN0IGl2bWRfaGVhZGVyICopcDsKLQkJaWYgKG0tPmZsYWdzICYgSVZNRF9GTEFHX0VYQ0xfUkFOR0UpCi0JCQlpbml0X2V4Y2x1c2lvbl9yYW5nZShtKTsKLQkJZWxzZSBpZiAobS0+ZmxhZ3MgJiBJVk1EX0ZMQUdfVU5JVFlfTUFQKQotCQkJaW5pdF91bml0eV9tYXBfcmFuZ2UobSk7Ci0KLQkJcCArPSBtLT5sZW5ndGg7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBJbml0IHRoZSBkZXZpY2UgdGFibGUgdG8gbm90IGFsbG93IERNQSBhY2Nlc3MgZm9yIGRldmljZXMgYW5kCi0gKiBzdXBwcmVzcyBhbGwgcGFnZSBmYXVsdHMKLSAqLwotc3RhdGljIHZvaWQgaW5pdF9kZXZpY2VfdGFibGUodm9pZCkKLXsKLQl1MTYgZGV2aWQ7Ci0KLQlmb3IgKGRldmlkID0gMDsgZGV2aWQgPD0gYW1kX2lvbW11X2xhc3RfYmRmOyArK2RldmlkKSB7Ci0JCXNldF9kZXZfZW50cnlfYml0KGRldmlkLCBERVZfRU5UUllfVkFMSUQpOwotCQlzZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX1RSQU5TTEFUSU9OKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbW11X2luaXRfZmxhZ3Moc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCi17Ci0JaW9tbXUtPmFjcGlfZmxhZ3MgJiBJVkhEX0ZMQUdfSFRfVFVOX0VOX01BU0sgPwotCQlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9IVF9UVU5fRU4pIDoKLQkJaW9tbXVfZmVhdHVyZV9kaXNhYmxlKGlvbW11LCBDT05UUk9MX0hUX1RVTl9FTik7Ci0KLQlpb21tdS0+YWNwaV9mbGFncyAmIElWSERfRkxBR19QQVNTUFdfRU5fTUFTSyA/Ci0JCWlvbW11X2ZlYXR1cmVfZW5hYmxlKGlvbW11LCBDT05UUk9MX1BBU1NQV19FTikgOgotCQlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfUEFTU1BXX0VOKTsKLQotCWlvbW11LT5hY3BpX2ZsYWdzICYgSVZIRF9GTEFHX1JFU1BBU1NQV19FTl9NQVNLID8KLQkJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfUkVTUEFTU1BXX0VOKSA6Ci0JCWlvbW11X2ZlYXR1cmVfZGlzYWJsZShpb21tdSwgQ09OVFJPTF9SRVNQQVNTUFdfRU4pOwotCi0JaW9tbXUtPmFjcGlfZmxhZ3MgJiBJVkhEX0ZMQUdfSVNPQ19FTl9NQVNLID8KLQkJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfSVNPQ19FTikgOgotCQlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfSVNPQ19FTik7Ci0KLQkvKgotCSAqIG1ha2UgSU9NTVUgbWVtb3J5IGFjY2Vzc2VzIGNhY2hlIGNvaGVyZW50Ci0JICovCi0JaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfQ09IRVJFTlRfRU4pOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV9hcHBseV9yZXN1bWVfcXVpcmtzKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQotewotCWludCBpLCBqOwotCXUzMiBpb2NfZmVhdHVyZV9jb250cm9sOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQotCS8qIFJEODkwIEJJT1NlcyBtYXkgbm90IGhhdmUgY29tcGxldGVseSByZWNvbmZpZ3VyZWQgdGhlIGlvbW11ICovCi0JaWYgKCFpc19yZDg5MF9pb21tdShpb21tdS0+ZGV2KSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBGaXJzdCwgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgaW9tbXUgaXMgZW5hYmxlZC4gVGhpcyBpcwotCSAqIGNvbnRyb2xsZWQgYnkgYSByZWdpc3RlciBpbiB0aGUgbm9ydGhicmlkZ2UKLQkgKi8KLQlwZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoaW9tbXUtPmRldi0+YnVzLT5udW1iZXIsIFBDSV9ERVZGTigwLCAwKSk7Ci0KLQlpZiAoIXBkZXYpCi0JCXJldHVybjsKLQotCS8qIFNlbGVjdCBOb3J0aGJyaWRnZSBpbmRpcmVjdCByZWdpc3RlciAweDc1IGFuZCBlbmFibGUgd3JpdGluZyAqLwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg2MCwgMHg3NSB8ICgxIDw8IDcpKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg2NCwgJmlvY19mZWF0dXJlX2NvbnRyb2wpOwotCi0JLyogRW5hYmxlIHRoZSBpb21tdSAqLwotCWlmICghKGlvY19mZWF0dXJlX2NvbnRyb2wgJiAweDEpKQotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NjQsIGlvY19mZWF0dXJlX2NvbnRyb2wgfCAxKTsKLQotCXBjaV9kZXZfcHV0KHBkZXYpOwotCi0JLyogUmVzdG9yZSB0aGUgaW9tbXUgQkFSICovCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChpb21tdS0+ZGV2LCBpb21tdS0+Y2FwX3B0ciArIDQsCi0JCQkgICAgICAgaW9tbXUtPnN0b3JlZF9hZGRyX2xvKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIGlvbW11LT5jYXBfcHRyICsgOCwKLQkJCSAgICAgICBpb21tdS0+c3RvcmVkX2FkZHJfaGkpOwotCi0JLyogUmVzdG9yZSB0aGUgbDEgaW5kaXJlY3QgcmVncyBmb3IgZWFjaCBvZiB0aGUgNiBsMXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgMHgxMjsgaisrKQotCQkJaW9tbXVfd3JpdGVfbDEoaW9tbXUsIGksIGosIGlvbW11LT5zdG9yZWRfbDFbaV1bal0pOwotCi0JLyogUmVzdG9yZSB0aGUgbDIgaW5kaXJlY3QgcmVncyAqLwotCWZvciAoaSA9IDA7IGkgPCAweDgzOyBpKyspCi0JCWlvbW11X3dyaXRlX2wyKGlvbW11LCBpLCBpb21tdS0+c3RvcmVkX2wyW2ldKTsKLQotCS8qIExvY2sgUENJIHNldHVwIHJlZ2lzdGVycyAqLwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgaW9tbXUtPmNhcF9wdHIgKyA0LAotCQkJICAgICAgIGlvbW11LT5zdG9yZWRfYWRkcl9sbyB8IDEpOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBmaW5hbGx5IGVuYWJsZXMgYWxsIElPTU1VcyBmb3VuZCBpbiB0aGUgc3lzdGVtIGFmdGVyCi0gKiB0aGV5IGhhdmUgYmVlbiBpbml0aWFsaXplZAotICovCi1zdGF0aWMgdm9pZCBlbmFibGVfaW9tbXVzKHZvaWQpCi17Ci0Jc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7Ci0KLQlmb3JfZWFjaF9pb21tdShpb21tdSkgewotCQlpb21tdV9kaXNhYmxlKGlvbW11KTsKLQkJaW9tbXVfaW5pdF9mbGFncyhpb21tdSk7Ci0JCWlvbW11X3NldF9kZXZpY2VfdGFibGUoaW9tbXUpOwotCQlpb21tdV9lbmFibGVfY29tbWFuZF9idWZmZXIoaW9tbXUpOwotCQlpb21tdV9lbmFibGVfZXZlbnRfYnVmZmVyKGlvbW11KTsKLQkJaW9tbXVfc2V0X2V4Y2x1c2lvbl9yYW5nZShpb21tdSk7Ci0JCWlvbW11X2luaXRfbXNpKGlvbW11KTsKLQkJaW9tbXVfZW5hYmxlKGlvbW11KTsKLQkJaW9tbXVfZmx1c2hfYWxsX2NhY2hlcyhpb21tdSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBkaXNhYmxlX2lvbW11cyh2b2lkKQotewotCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OwotCi0JZm9yX2VhY2hfaW9tbXUoaW9tbXUpCi0JCWlvbW11X2Rpc2FibGUoaW9tbXUpOwotfQotCi0vKgotICogU3VzcGVuZC9SZXN1bWUgc3VwcG9ydAotICogZGlzYWJsZSBzdXNwZW5kIHVudGlsIHJlYWwgcmVzdW1lIGltcGxlbWVudGVkCi0gKi8KLQotc3RhdGljIHZvaWQgYW1kX2lvbW11X3Jlc3VtZSh2b2lkKQotewotCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OwotCi0JZm9yX2VhY2hfaW9tbXUoaW9tbXUpCi0JCWlvbW11X2FwcGx5X3Jlc3VtZV9xdWlya3MoaW9tbXUpOwotCi0JLyogcmUtbG9hZCB0aGUgaGFyZHdhcmUgKi8KLQllbmFibGVfaW9tbXVzKCk7Ci0KLQkvKgotCSAqIHdlIGhhdmUgdG8gZmx1c2ggYWZ0ZXIgdGhlIElPTU1VcyBhcmUgZW5hYmxlZCBiZWNhdXNlIGEKLQkgKiBkaXNhYmxlZCBJT01NVSB3aWxsIG5ldmVyIGV4ZWN1dGUgdGhlIGNvbW1hbmRzIHdlIHNlbmQKLQkgKi8KLQlmb3JfZWFjaF9pb21tdShpb21tdSkKLQkJaW9tbXVfZmx1c2hfYWxsX2NhY2hlcyhpb21tdSk7Ci19Ci0KLXN0YXRpYyBpbnQgYW1kX2lvbW11X3N1c3BlbmQodm9pZCkKLXsKLQkvKiBkaXNhYmxlIElPTU1VcyB0byBnbyBvdXQgb2YgdGhlIHdheSBmb3IgQklPUyAqLwotCWRpc2FibGVfaW9tbXVzKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBhbWRfaW9tbXVfc3lzY29yZV9vcHMgPSB7Ci0JLnN1c3BlbmQgPSBhbWRfaW9tbXVfc3VzcGVuZCwKLQkucmVzdW1lID0gYW1kX2lvbW11X3Jlc3VtZSwKLX07Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSBjb3JlIGluaXQgZnVuY3Rpb24gZm9yIEFNRCBJT01NVSBoYXJkd2FyZSBpbiB0aGUgc3lzdGVtLgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgZ2VuZXJpYyB4ODYgRE1BIGxheWVyIGluaXRpYWxpemF0aW9uCi0gKiBjb2RlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gYmFzaWNhbGx5IHBhcnNlcyB0aGUgQUNQSSB0YWJsZSBmb3IgQU1EIElPTU1VIChJVlJTKQotICogdGhyZWUgdGltZXM6Ci0gKgotICoJMSBwYXNzKSBGaW5kIHRoZSBoaWdoZXN0IFBDSSBkZXZpY2UgaWQgdGhlIGRyaXZlciBoYXMgdG8gaGFuZGxlLgotICoJCVVwb24gdGhpcyBpbmZvcm1hdGlvbiB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGlzCi0gKgkJZGV0ZXJtaW5lZCB0aGF0IG5lZWRzIHRvIGJlIGFsbG9jYXRlZC4KLSAqCi0gKgkyIHBhc3MpIEluaXRpYWxpemUgdGhlIGRhdGEgc3RydWN0dXJlcyBqdXN0IGFsbG9jYXRlZCB3aXRoIHRoZQotICoJCWluZm9ybWF0aW9uIGluIHRoZSBBQ1BJIHRhYmxlIGFib3V0IGF2YWlsYWJsZSBBTUQgSU9NTVVzCi0gKgkJaW4gdGhlIHN5c3RlbS4gSXQgYWxzbyBtYXBzIHRoZSBQQ0kgZGV2aWNlcyBpbiB0aGUKLSAqCQlzeXN0ZW0gdG8gc3BlY2lmaWMgSU9NTVVzCi0gKgotICoJMyBwYXNzKSBBZnRlciB0aGUgYmFzaWMgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgYW5kCi0gKgkJaW5pdGlhbGl6ZWQgd2UgdXBkYXRlIHRoZW0gd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBtZW1vcnkKLSAqCQlyZW1hcHBpbmcgcmVxdWlyZW1lbnRzIHBhcnNlZCBvdXQgb2YgdGhlIEFDUEkgdGFibGUgaW4KLSAqCQl0aGlzIGxhc3QgcGFzcy4KLSAqCi0gKiBBZnRlciB0aGF0IHRoZSBoYXJkd2FyZSBpcyBpbml0aWFsaXplZCBhbmQgcmVhZHkgdG8gZ28uIEluIHRoZSBsYXN0Ci0gKiBzdGVwIHdlIGRvIHNvbWUgTGludXggc3BlY2lmaWMgdGhpbmdzIGxpa2UgcmVnaXN0ZXJpbmcgdGhlIGRyaXZlciBpbgotICogdGhlIGRtYV9vcHMgaW50ZXJmYWNlIGFuZCBpbml0aWFsaXppbmcgdGhlIHN1c3BlbmQvcmVzdW1lIHN1cHBvcnQKLSAqIGZ1bmN0aW9ucy4gRmluYWxseSBpdCBwcmludHMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCBBTUQgSU9NTVVzIGFuZAotICogdGhlIGRyaXZlciBzdGF0ZSBhbmQgZW5hYmxlcyB0aGUgaGFyZHdhcmUuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGFtZF9pb21tdV9pbml0KHZvaWQpCi17Ci0JaW50IGksIHJldCA9IDA7Ci0KLQkvKgotCSAqIEZpcnN0IHBhcnNlIEFDUEkgdGFibGVzIHRvIGZpbmQgdGhlIGxhcmdlc3QgQnVzL0Rldi9GdW5jCi0JICogd2UgbmVlZCB0byBoYW5kbGUuIFVwb24gdGhpcyBpbmZvcm1hdGlvbiB0aGUgc2hhcmVkIGRhdGEKLQkgKiBzdHJ1Y3R1cmVzIGZvciB0aGUgSU9NTVVzIGluIHRoZSBzeXN0ZW0gd2lsbCBiZSBhbGxvY2F0ZWQKLQkgKi8KLQlpZiAoYWNwaV90YWJsZV9wYXJzZSgiSVZSUyIsIGZpbmRfbGFzdF9kZXZpZF9hY3BpKSAhPSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldCA9IGFtZF9pb21tdV9pbml0X2VycjsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCWRldl90YWJsZV9zaXplICAgICA9IHRibF9zaXplKERFVl9UQUJMRV9FTlRSWV9TSVpFKTsKLQlhbGlhc190YWJsZV9zaXplICAgPSB0Ymxfc2l6ZShBTElBU19UQUJMRV9FTlRSWV9TSVpFKTsKLQlybG9va3VwX3RhYmxlX3NpemUgPSB0Ymxfc2l6ZShSTE9PS1VQX1RBQkxFX0VOVFJZX1NJWkUpOwotCi0JcmV0ID0gLUVOT01FTTsKLQotCS8qIERldmljZSB0YWJsZSAtIGRpcmVjdGx5IHVzZWQgYnkgYWxsIElPTU1VcyAqLwotCWFtZF9pb21tdV9kZXZfdGFibGUgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCi0JCQkJICAgICAgZ2V0X29yZGVyKGRldl90YWJsZV9zaXplKSk7Ci0JaWYgKGFtZF9pb21tdV9kZXZfdGFibGUgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KLQkvKgotCSAqIEFsaWFzIHRhYmxlIC0gbWFwIFBDSSBCdXMvRGV2L0Z1bmMgdG8gQnVzL0Rldi9GdW5jIHRoZQotCSAqIElPTU1VIHNlZSBmb3IgdGhhdCBkZXZpY2UKLQkgKi8KLQlhbWRfaW9tbXVfYWxpYXNfdGFibGUgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKLQkJCWdldF9vcmRlcihhbGlhc190YWJsZV9zaXplKSk7Ci0JaWYgKGFtZF9pb21tdV9hbGlhc190YWJsZSA9PSBOVUxMKQotCQlnb3RvIGZyZWU7Ci0KLQkvKiBJT01NVSBybG9va3VwIHRhYmxlIC0gZmluZCB0aGUgSU9NTVUgZm9yIGEgc3BlY2lmaWMgZGV2aWNlICovCi0JYW1kX2lvbW11X3Jsb29rdXBfdGFibGUgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoCi0JCQlHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywKLQkJCWdldF9vcmRlcihybG9va3VwX3RhYmxlX3NpemUpKTsKLQlpZiAoYW1kX2lvbW11X3Jsb29rdXBfdGFibGUgPT0gTlVMTCkKLQkJZ290byBmcmVlOwotCi0JYW1kX2lvbW11X3BkX2FsbG9jX2JpdG1hcCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcygKLQkJCQkJICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAotCQkJCQkgICAgZ2V0X29yZGVyKE1BWF9ET01BSU5fSUQvOCkpOwotCWlmIChhbWRfaW9tbXVfcGRfYWxsb2NfYml0bWFwID09IE5VTEwpCi0JCWdvdG8gZnJlZTsKLQotCS8qIGluaXQgdGhlIGRldmljZSB0YWJsZSAqLwotCWluaXRfZGV2aWNlX3RhYmxlKCk7Ci0KLQkvKgotCSAqIGxldCBhbGwgYWxpYXMgZW50cmllcyBwb2ludCB0byBpdHNlbGYKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDw9IGFtZF9pb21tdV9sYXN0X2JkZjsgKytpKQotCQlhbWRfaW9tbXVfYWxpYXNfdGFibGVbaV0gPSBpOwotCi0JLyoKLQkgKiBuZXZlciBhbGxvY2F0ZSBkb21haW4gMCBiZWNhdXNlIGl0cyB1c2VkIGFzIHRoZSBub24tYWxsb2NhdGVkIGFuZAotCSAqIGVycm9yIHZhbHVlIHBsYWNlaG9sZGVyCi0JICovCi0JYW1kX2lvbW11X3BkX2FsbG9jX2JpdG1hcFswXSA9IDE7Ci0KLQlzcGluX2xvY2tfaW5pdCgmYW1kX2lvbW11X3BkX2xvY2spOwotCi0JLyoKLQkgKiBub3cgdGhlIGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIGFuZCBiYXNpY2FsbHkgaW5pdGlhbGl6ZWQKLQkgKiBzdGFydCB0aGUgcmVhbCBhY3BpIHRhYmxlIHNjYW4KLQkgKi8KLQlyZXQgPSAtRU5PREVWOwotCWlmIChhY3BpX3RhYmxlX3BhcnNlKCJJVlJTIiwgaW5pdF9pb21tdV9hbGwpICE9IDApCi0JCWdvdG8gZnJlZTsKLQotCWlmIChhbWRfaW9tbXVfaW5pdF9lcnIpIHsKLQkJcmV0ID0gYW1kX2lvbW11X2luaXRfZXJyOwotCQlnb3RvIGZyZWU7Ci0JfQotCi0JaWYgKGFjcGlfdGFibGVfcGFyc2UoIklWUlMiLCBpbml0X21lbW9yeV9kZWZpbml0aW9ucykgIT0gMCkKLQkJZ290byBmcmVlOwotCi0JaWYgKGFtZF9pb21tdV9pbml0X2VycikgewotCQlyZXQgPSBhbWRfaW9tbXVfaW5pdF9lcnI7Ci0JCWdvdG8gZnJlZTsKLQl9Ci0KLQlyZXQgPSBhbWRfaW9tbXVfaW5pdF9kZXZpY2VzKCk7Ci0JaWYgKHJldCkKLQkJZ290byBmcmVlOwotCi0JZW5hYmxlX2lvbW11cygpOwotCi0JaWYgKGlvbW11X3Bhc3NfdGhyb3VnaCkKLQkJcmV0ID0gYW1kX2lvbW11X2luaXRfcGFzc3Rocm91Z2goKTsKLQllbHNlCi0JCXJldCA9IGFtZF9pb21tdV9pbml0X2RtYV9vcHMoKTsKLQotCWlmIChyZXQpCi0JCWdvdG8gZnJlZV9kaXNhYmxlOwotCi0JYW1kX2lvbW11X2luaXRfYXBpKCk7Ci0KLQlhbWRfaW9tbXVfaW5pdF9ub3RpZmllcigpOwotCi0JcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmFtZF9pb21tdV9zeXNjb3JlX29wcyk7Ci0KLQlpZiAoaW9tbXVfcGFzc190aHJvdWdoKQotCQlnb3RvIG91dDsKLQotCWlmIChhbWRfaW9tbXVfdW5tYXBfZmx1c2gpCi0JCXByaW50ayhLRVJOX0lORk8gIkFNRC1WaTogSU8vVExCIGZsdXNoIG9uIHVubWFwIGVuYWJsZWRcbiIpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQU1ELVZpOiBMYXp5IElPL1RMQiBmbHVzaGluZyBlbmFibGVkXG4iKTsKLQotCXg4Nl9wbGF0Zm9ybS5pb21tdV9zaHV0ZG93biA9IGRpc2FibGVfaW9tbXVzOwotb3V0OgotCXJldHVybiByZXQ7Ci0KLWZyZWVfZGlzYWJsZToKLQlkaXNhYmxlX2lvbW11cygpOwotCi1mcmVlOgotCWFtZF9pb21tdV91bmluaXRfZGV2aWNlcygpOwotCi0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylhbWRfaW9tbXVfcGRfYWxsb2NfYml0bWFwLAotCQkgICBnZXRfb3JkZXIoTUFYX0RPTUFJTl9JRC84KSk7Ci0KLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFtZF9pb21tdV9ybG9va3VwX3RhYmxlLAotCQkgICBnZXRfb3JkZXIocmxvb2t1cF90YWJsZV9zaXplKSk7Ci0KLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFtZF9pb21tdV9hbGlhc190YWJsZSwKLQkJICAgZ2V0X29yZGVyKGFsaWFzX3RhYmxlX3NpemUpKTsKLQotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYW1kX2lvbW11X2Rldl90YWJsZSwKLQkJICAgZ2V0X29yZGVyKGRldl90YWJsZV9zaXplKSk7Ci0KLQlmcmVlX2lvbW11X2FsbCgpOwotCi0JZnJlZV91bml0eV9tYXBzKCk7Ci0KLSNpZmRlZiBDT05GSUdfR0FSVF9JT01NVQotCS8qCi0JICogV2UgZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIEFNRCBJT01NVSAtIHRyeSBmYWxsYmFjayB0byBHQVJUCi0JICogaWYgcG9zc2libGUuCi0JICovCi0JZ2FydF9pb21tdV9pbml0KCk7Ci0KLSNlbmRpZgotCi0JZ290byBvdXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRWFybHkgZGV0ZWN0IGNvZGUuIFRoaXMgY29kZSBydW5zIGF0IElPTU1VIGRldGVjdGlvbiB0aW1lIGluIHRoZSBETUEKLSAqIGxheWVyLiBJdCBqdXN0IGxvb2tzIGlmIHRoZXJlIGlzIGFuIElWUlMgQUNQSSB0YWJsZSB0byBkZXRlY3QgQU1ECi0gKiBJT01NVXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgX19pbml0IGVhcmx5X2FtZF9pb21tdV9kZXRlY3Qoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50IF9faW5pdCBhbWRfaW9tbXVfZGV0ZWN0KHZvaWQpCi17Ci0JaWYgKG5vX2lvbW11IHx8IChpb21tdV9kZXRlY3RlZCAmJiAhZ2FydF9pb21tdV9hcGVydHVyZSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKGFtZF9pb21tdV9kaXNhYmxlZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoYWNwaV90YWJsZV9wYXJzZSgiSVZSUyIsIGVhcmx5X2FtZF9pb21tdV9kZXRlY3QpID09IDApIHsKLQkJaW9tbXVfZGV0ZWN0ZWQgPSAxOwotCQlhbWRfaW9tbXVfZGV0ZWN0ZWQgPSAxOwotCQl4ODZfaW5pdC5pb21tdS5pb21tdV9pbml0ID0gYW1kX2lvbW11X2luaXQ7Ci0KLQkJLyogTWFrZSBzdXJlIEFDUyB3aWxsIGJlIGVuYWJsZWQgKi8KLQkJcGNpX3JlcXVlc3RfYWNzKCk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBQYXJzaW5nIGZ1bmN0aW9ucyBmb3IgdGhlIEFNRCBJT01NVSBzcGVjaWZpYyBrZXJuZWwgY29tbWFuZCBsaW5lCi0gKiBvcHRpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV9hbWRfaW9tbXVfZHVtcChjaGFyICpzdHIpCi17Ci0JYW1kX2lvbW11X2R1bXAgPSB0cnVlOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2FtZF9pb21tdV9vcHRpb25zKGNoYXIgKnN0cikKLXsKLQlmb3IgKDsgKnN0cjsgKytzdHIpIHsKLQkJaWYgKHN0cm5jbXAoc3RyLCAiZnVsbGZsdXNoIiwgOSkgPT0gMCkKLQkJCWFtZF9pb21tdV91bm1hcF9mbHVzaCA9IHRydWU7Ci0JCWlmIChzdHJuY21wKHN0ciwgIm9mZiIsIDMpID09IDApCi0JCQlhbWRfaW9tbXVfZGlzYWJsZWQgPSB0cnVlOwotCX0KLQotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJhbWRfaW9tbXVfZHVtcCIsIHBhcnNlX2FtZF9pb21tdV9kdW1wKTsKLV9fc2V0dXAoImFtZF9pb21tdT0iLCBwYXJzZV9hbWRfaW9tbXVfb3B0aW9ucyk7Ci0KLUlPTU1VX0lOSVRfRklOSVNIKGFtZF9pb21tdV9kZXRlY3QsCi0JCSAgZ2FydF9pb21tdV9ob2xlX2luaXQsCi0JCSAgMCwKLQkJICAwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGJfdGltZXIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGJfdGltZXIuYwppbmRleCAyODllOTI4Li5hZmRjM2Y3NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwYl90aW1lci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGJfdGltZXIuYwpAQCAtMjcsMTUgKzI3LDEyIEBACiAgKiB0aW1lciwgYnV0IGJ5IGRlZmF1bHQgQVBCIHRpbWVyIGhhcyBoaWdoZXIgcmF0aW5nIHRoYW4gbG9jYWwgQVBJQyB0aW1lcnMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZHdfYXBiX3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2ZpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CkBAIC00NCw3NiArNDEsNDggQEAKICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CiAjaW5jbHVkZSA8YXNtL2FwYl90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9tcnN0Lmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KIAotI2RlZmluZSBBUEJUX01BU0sJCQlDTE9DS1NPVVJDRV9NQVNLKDMyKQotI2RlZmluZSBBUEJUX1NISUZUCQkJMjIKICNkZWZpbmUgQVBCVF9DTE9DS0VWRU5UX1JBVElORwkJMTEwCiAjZGVmaW5lIEFQQlRfQ0xPQ0tTT1VSQ0VfUkFUSU5HCQkyNTAKLSNkZWZpbmUgQVBCVF9NSU5fREVMVEFfVVNFQwkJMjAwCiAKLSNkZWZpbmUgRVZUX1RPX0FQQlRfREVWKGV2dCkgY29udGFpbmVyX29mKGV2dCwgc3RydWN0IGFwYnRfZGV2LCBldnQpCiAjZGVmaW5lIEFQQlRfQ0xPQ0tFVkVOVDBfTlVNICAgKDApCi0jZGVmaW5lIEFQQlRfQ0xPQ0tFVkVOVDFfTlVNICAgKDEpCiAjZGVmaW5lIEFQQlRfQ0xPQ0tTT1VSQ0VfTlVNICAgKDIpCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGFwYnRfYWRkcmVzczsKK3N0YXRpYyBwaHlzX2FkZHJfdCBhcGJ0X2FkZHJlc3M7CiBzdGF0aWMgaW50IGFwYl90aW1lcl9ibG9ja19lbmFibGVkOwogc3RhdGljIHZvaWQgX19pb21lbSAqYXBidF92aXJ0X2FkZHJlc3M7Ci1zdGF0aWMgaW50IHBoeV9jc190aW1lcl9pZDsKIAogLyoKICAqIENvbW1vbiBEVyBBUEIgdGltZXIgaW5mbwogICovCi1zdGF0aWMgdWludDY0X3QgYXBidF9mcmVxOwotCi1zdGF0aWMgdm9pZCBhcGJ0X3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAotCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpOwotc3RhdGljIGludCBhcGJ0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwKLQkJCSAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCk7Ci1zdGF0aWMgY3ljbGVfdCBhcGJ0X3JlYWRfY2xvY2tzb3VyY2Uoc3RydWN0IGNsb2Nrc291cmNlICpjcyk7Ci1zdGF0aWMgdm9pZCBhcGJ0X3Jlc3RhcnRfY2xvY2tzb3VyY2Uoc3RydWN0IGNsb2Nrc291cmNlICpjcyk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBhcGJ0X2ZyZXE7CiAKIHN0cnVjdCBhcGJ0X2RldiB7Ci0Jc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBldnQ7Ci0JdW5zaWduZWQgaW50IG51bTsKLQlpbnQgY3B1OwotCXVuc2lnbmVkIGludCBpcnE7Ci0JdW5zaWduZWQgaW50IHRpY2s7Ci0JdW5zaWduZWQgaW50IGNvdW50OwotCXVuc2lnbmVkIGludCBmbGFnczsKLQljaGFyIG5hbWVbMTBdOworCXN0cnVjdCBkd19hcGJfY2xvY2tfZXZlbnRfZGV2aWNlCSp0aW1lcjsKKwl1bnNpZ25lZCBpbnQJCQkJbnVtOworCWludAkJCQkJY3B1OworCXVuc2lnbmVkIGludAkJCQlpcnE7CisJY2hhcgkJCQkJbmFtZVsxMF07CiB9OwogCitzdGF0aWMgc3RydWN0IGR3X2FwYl9jbG9ja3NvdXJjZSAqY2xvY2tzb3VyY2VfYXBidDsKKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmFkZXZfdmlydF9hZGRyKHN0cnVjdCBhcGJ0X2RldiAqYWRldikKK3sKKwlyZXR1cm4gYXBidF92aXJ0X2FkZHJlc3MgKyBhZGV2LT5udW0gKiBBUEJUTVJTX1JFR19TSVpFOworfQorCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGFwYnRfZGV2LCBjcHVfYXBidF9kZXYpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIHVuc2lnbmVkIGludCBhcGJ0X251bV90aW1lcnNfdXNlZDsKLXN0YXRpYyBzdHJ1Y3QgYXBidF9kZXYgKmFwYnRfZGV2czsKICNlbmRpZgogCi1zdGF0aWMJaW5saW5lIHVuc2lnbmVkIGxvbmcgYXBidF9yZWFkbF9yZWcodW5zaWduZWQgbG9uZyBhKQotewotCXJldHVybiByZWFkbChhcGJ0X3ZpcnRfYWRkcmVzcyArIGEpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXBidF93cml0ZWxfcmVnKHVuc2lnbmVkIGxvbmcgZCwgdW5zaWduZWQgbG9uZyBhKQotewotCXdyaXRlbChkLCBhcGJ0X3ZpcnRfYWRkcmVzcyArIGEpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXBidF9yZWFkbChpbnQgbiwgdW5zaWduZWQgbG9uZyBhKQotewotCXJldHVybiByZWFkbChhcGJ0X3ZpcnRfYWRkcmVzcyArIGEgKyBuICogQVBCVE1SU19SRUdfU0laRSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcGJ0X3dyaXRlbChpbnQgbiwgdW5zaWduZWQgbG9uZyBkLCB1bnNpZ25lZCBsb25nIGEpCi17Ci0Jd3JpdGVsKGQsIGFwYnRfdmlydF9hZGRyZXNzICsgYSArIG4gKiBBUEJUTVJTX1JFR19TSVpFKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGFwYnRfc2V0X21hcHBpbmcodm9pZCkKIHsKIAlzdHJ1Y3Qgc2ZpX3RpbWVyX3RhYmxlX2VudHJ5ICptdG1yOworCWludCBwaHlfY3NfdGltZXJfaWQgPSAwOwogCiAJaWYgKGFwYnRfdmlydF9hZGRyZXNzKSB7CiAJCXByX2RlYnVnKCJBUEJUIGJhc2UgYWxyZWFkeSBtYXBwZWRcbiIpOwpAQCAtMTI1LDIxICs5NCwxOCBAQAogCQkgICAgICAgQVBCVF9DTE9DS0VWRU5UMF9OVU0pOwogCQlyZXR1cm47CiAJfQotCWFwYnRfYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKW10bXItPnBoeXNfYWRkcjsKKwlhcGJ0X2FkZHJlc3MgPSAocGh5c19hZGRyX3QpbXRtci0+cGh5c19hZGRyOwogCWlmICghYXBidF9hZGRyZXNzKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIHRpbWVyIGJhc2UgZnJvbSBTRkksIHVzZSBkZWZhdWx0XG4iKTsKIAkJYXBidF9hZGRyZXNzID0gQVBCVF9ERUZBVUxUX0JBU0U7CiAJfQogCWFwYnRfdmlydF9hZGRyZXNzID0gaW9yZW1hcF9ub2NhY2hlKGFwYnRfYWRkcmVzcywgQVBCVF9NTUFQX1NJWkUpOwotCWlmIChhcGJ0X3ZpcnRfYWRkcmVzcykgewotCQlwcl9kZWJ1ZygiTWFwcGVkIEFQQlQgcGh5c2ljYWwgYWRkciAlcCBhdCB2aXJ0dWFsIGFkZHIgJXBcbiIsXAotCQkJICh2b2lkICopYXBidF9hZGRyZXNzLCAodm9pZCAqKWFwYnRfdmlydF9hZGRyZXNzKTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiRmFpbGVkIG1hcHBpbmcgQVBCVCBwaHkgYWRkcmVzcyBhdCAlcFxuIixcCi0JCQkgKHZvaWQgKilhcGJ0X2FkZHJlc3MpOworCWlmICghYXBidF92aXJ0X2FkZHJlc3MpIHsKKwkJcHJfZGVidWcoIkZhaWxlZCBtYXBwaW5nIEFQQlQgcGh5IGFkZHJlc3MgYXQgJWx1XG4iLFwKKwkJCSAodW5zaWduZWQgbG9uZylhcGJ0X2FkZHJlc3MpOwogCQlnb3RvIHBhbmljX25vYXBidDsKIAl9Ci0JYXBidF9mcmVxID0gbXRtci0+ZnJlcV9oeiAvIFVTRUNfUEVSX1NFQzsKKwlhcGJ0X2ZyZXEgPSBtdG1yLT5mcmVxX2h6OwogCXNmaV9mcmVlX210bXIobXRtcik7CiAKIAkvKiBOb3cgZmlndXJlIG91dCB0aGUgcGh5c2ljYWwgdGltZXIgaWQgZm9yIGNsb2Nrc291cmNlIGRldmljZSAqLwpAQCAtMTQ4LDkgKzExNCwxNCBAQAogCQlnb3RvIHBhbmljX25vYXBidDsKIAogCS8qIE5vdyBmaWd1cmUgb3V0IHRoZSBwaHlzaWNhbCB0aW1lciBpZCAqLwotCXBoeV9jc190aW1lcl9pZCA9ICh1bnNpZ25lZCBpbnQpKG10bXItPnBoeXNfYWRkciAmIDB4ZmYpCi0JCS8gQVBCVE1SU19SRUdfU0laRTsKLQlwcl9kZWJ1ZygiVXNlIHRpbWVyICVkIGZvciBjbG9ja3NvdXJjZVxuIiwgcGh5X2NzX3RpbWVyX2lkKTsKKwlwcl9kZWJ1ZygiVXNlIHRpbWVyICVkIGZvciBjbG9ja3NvdXJjZVxuIiwKKwkJIChpbnQpKG10bXItPnBoeXNfYWRkciAmIDB4ZmYpIC8gQVBCVE1SU19SRUdfU0laRSk7CisJcGh5X2NzX3RpbWVyX2lkID0gKHVuc2lnbmVkIGludCkobXRtci0+cGh5c19hZGRyICYgMHhmZikgLworCQlBUEJUTVJTX1JFR19TSVpFOworCisJY2xvY2tzb3VyY2VfYXBidCA9IGR3X2FwYl9jbG9ja3NvdXJjZV9pbml0KEFQQlRfQ0xPQ0tTT1VSQ0VfUkFUSU5HLAorCQkiYXBidDAiLCBhcGJ0X3ZpcnRfYWRkcmVzcyArIHBoeV9jc190aW1lcl9pZCAqCisJCUFQQlRNUlNfUkVHX1NJWkUsIGFwYnRfZnJlcSk7CiAJcmV0dXJuOwogCiBwYW5pY19ub2FwYnQ6CkBAIC0xNzIsODIgKzE0Myw2IEBACiAJcmV0dXJuIGFwYnRfdmlydF9hZGRyZXNzID8gMSA6IDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfYXBidCA9IHsKLQkubmFtZQkJPSAiYXBidCIsCi0JLnJhdGluZwkJPSBBUEJUX0NMT0NLU09VUkNFX1JBVElORywKLQkucmVhZAkJPSBhcGJ0X3JlYWRfY2xvY2tzb3VyY2UsCi0JLm1hc2sJCT0gQVBCVF9NQVNLLAotCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKLQkucmVzdW1lCQk9IGFwYnRfcmVzdGFydF9jbG9ja3NvdXJjZSwKLX07Ci0KLS8qIGJvb3QgQVBCIGNsb2NrIGV2ZW50IGRldmljZSAqLwotc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgYXBidF9jbG9ja2V2ZW50ID0gewotCS5uYW1lCQk9ICJhcGJ0MCIsCi0JLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAotCS5zZXRfbW9kZQk9IGFwYnRfc2V0X21vZGUsCi0JLnNldF9uZXh0X2V2ZW50ID0gYXBidF9uZXh0X2V2ZW50LAotCS5zaGlmdAkJPSBBUEJUX1NISUZULAotCS5pcnEJCT0gMCwKLQkucmF0aW5nCQk9IEFQQlRfQ0xPQ0tFVkVOVF9SQVRJTkcsCi19OwotCi0vKgotICogc3RhcnQgY291bnQgZG93biBmcm9tIDB4ZmZmZl9mZmZmLiB0aGlzIGlzIGRvbmUgYnkgdG9nZ2xpbmcgdGhlIGVuYWJsZSBiaXQKLSAqIHRoZW4gbG9hZCBpbml0aWFsIGxvYWQgY291bnQgdG8gfjAuCi0gKi8KLXN0YXRpYyB2b2lkIGFwYnRfc3RhcnRfY291bnRlcihpbnQgbikKLXsKLQl1bnNpZ25lZCBsb25nIGN0cmwgPSBhcGJ0X3JlYWRsKG4sIEFQQlRNUl9OX0NPTlRST0wpOwotCi0JY3RybCAmPSB+QVBCVE1SX0NPTlRST0xfRU5BQkxFOwotCWFwYnRfd3JpdGVsKG4sIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOwotCWFwYnRfd3JpdGVsKG4sIH4wLCBBUEJUTVJfTl9MT0FEX0NPVU5UKTsKLQkvKiBlbmFibGUsIG1hc2sgaW50ZXJydXB0ICovCi0JY3RybCAmPSB+QVBCVE1SX0NPTlRST0xfTU9ERV9QRVJJT0RJQzsKLQljdHJsIHw9IChBUEJUTVJfQ09OVFJPTF9FTkFCTEUgfCBBUEJUTVJfQ09OVFJPTF9JTlQpOwotCWFwYnRfd3JpdGVsKG4sIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOwotCS8qIHJlYWQgaXQgb25jZSB0byBnZXQgY2FjaGVkIGNvdW50ZXIgdmFsdWUgaW5pdGlhbGl6ZWQgKi8KLQlhcGJ0X3JlYWRfY2xvY2tzb3VyY2UoJmNsb2Nrc291cmNlX2FwYnQpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYXBidF9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBhcGJ0X2RldiAqZGV2ID0gKHN0cnVjdCBhcGJ0X2RldiAqKWRhdGE7Ci0Jc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYWV2dCA9ICZkZXYtPmV2dDsKLQotCWlmICghYWV2dC0+ZXZlbnRfaGFuZGxlcikgewotCQlwcmludGsoS0VSTl9JTkZPICJTcHVyaW91cyBBUEJUIHRpbWVyIGludGVycnVwdCBvbiAlZFxuIiwKLQkJICAgICAgIGRldi0+bnVtKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQlhZXZ0LT5ldmVudF9oYW5kbGVyKGFldnQpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgYXBidF9yZXN0YXJ0X2Nsb2Nrc291cmNlKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCi17Ci0JYXBidF9zdGFydF9jb3VudGVyKHBoeV9jc190aW1lcl9pZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFwYnRfZW5hYmxlX2ludChpbnQgbikKLXsKLQl1bnNpZ25lZCBsb25nIGN0cmwgPSBhcGJ0X3JlYWRsKG4sIEFQQlRNUl9OX0NPTlRST0wpOwotCS8qIGNsZWFyIHBlbmRpbmcgaW50ciAqLwotCWFwYnRfcmVhZGwobiwgQVBCVE1SX05fRU9JKTsKLQljdHJsICY9IH5BUEJUTVJfQ09OVFJPTF9JTlQ7Ci0JYXBidF93cml0ZWwobiwgY3RybCwgQVBCVE1SX05fQ09OVFJPTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFwYnRfZGlzYWJsZV9pbnQoaW50IG4pCi17Ci0JdW5zaWduZWQgbG9uZyBjdHJsID0gYXBidF9yZWFkbChuLCBBUEJUTVJfTl9DT05UUk9MKTsKLQotCWN0cmwgfD0gQVBCVE1SX0NPTlRST0xfSU5UOwotCWFwYnRfd3JpdGVsKG4sIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOwotfQotCi0KIHN0YXRpYyBpbnQgX19pbml0IGFwYnRfY2xvY2tldmVudF9yZWdpc3Rlcih2b2lkKQogewogCXN0cnVjdCBzZmlfdGltZXJfdGFibGVfZW50cnkgKm10bXI7CkBAIC0yNjAsNDUgKzE1NSwyMSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQkvKgotCSAqIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBzY2FsZWQgbWF0aCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yCi0JICogbmFub3NlY29uZCB0byBhcGJ0IHRpY2sgY29udmVyc2lvbi4KLQkgKiBtdWx0ID0gKG5zZWMvY3ljbGUpKjJeQVBCVF9TSElGVAotCSAqLwotCWFwYnRfY2xvY2tldmVudC5tdWx0ID0gZGl2X3NjKCh1bnNpZ25lZCBsb25nKSBtdG1yLT5mcmVxX2h6Ci0JCQkJICAgICAgLCBOU0VDX1BFUl9TRUMsIEFQQlRfU0hJRlQpOwotCi0JLyogQ2FsY3VsYXRlIHRoZSBtaW4gLyBtYXggZGVsdGEgKi8KLQlhcGJ0X2Nsb2NrZXZlbnQubWF4X2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucygweDdGRkZGRkZGLAotCQkJCQkJCSAgICZhcGJ0X2Nsb2NrZXZlbnQpOwotCWFwYnRfY2xvY2tldmVudC5taW5fZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKAotCQlBUEJUX01JTl9ERUxUQV9VU0VDKmFwYnRfZnJlcSwKLQkJJmFwYnRfY2xvY2tldmVudCk7Ci0JLyoKLQkgKiBTdGFydCBhcGJ0IHdpdGggdGhlIGJvb3QgY3B1IG1hc2sgYW5kIG1ha2UgaXQKLQkgKiBnbG9iYWwgaWYgbm90IHVzZWQgZm9yIHBlciBjcHUgdGltZXIuCi0JICovCi0JYXBidF9jbG9ja2V2ZW50LmNwdW1hc2sgPSBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJYWRldi0+bnVtID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCW1lbWNweSgmYWRldi0+ZXZ0LCAmYXBidF9jbG9ja2V2ZW50LCBzaXplb2Yoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSkpOworCWFkZXYtPnRpbWVyID0gZHdfYXBiX2Nsb2NrZXZlbnRfaW5pdChzbXBfcHJvY2Vzc29yX2lkKCksICJhcGJ0MCIsCisJCW1yc3RfdGltZXJfb3B0aW9ucyA9PSBNUlNUX1RJTUVSX0xBUElDX0FQQlQgPworCQlBUEJUX0NMT0NLRVZFTlRfUkFUSU5HIC0gMTAwIDogQVBCVF9DTE9DS0VWRU5UX1JBVElORywKKwkJYWRldl92aXJ0X2FkZHIoYWRldiksIDAsIGFwYnRfZnJlcSk7CisJLyogRmlybXdhcmUgZG9lcyBFT0kgaGFuZGxpbmcgZm9yIHVzLiAqLworCWFkZXYtPnRpbWVyLT5lb2kgPSBOVUxMOwogCiAJaWYgKG1yc3RfdGltZXJfb3B0aW9ucyA9PSBNUlNUX1RJTUVSX0xBUElDX0FQQlQpIHsKLQkJYWRldi0+ZXZ0LnJhdGluZyA9IEFQQlRfQ0xPQ0tFVkVOVF9SQVRJTkcgLSAxMDA7Ci0JCWdsb2JhbF9jbG9ja19ldmVudCA9ICZhZGV2LT5ldnQ7CisJCWdsb2JhbF9jbG9ja19ldmVudCA9ICZhZGV2LT50aW1lci0+Y2VkOwogCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgY2xvY2tldmVudCByZWdpc3RlcmVkIGFzIGdsb2JhbFxuIiwKIAkJICAgICAgIGdsb2JhbF9jbG9ja19ldmVudC0+bmFtZSk7CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxKGFwYnRfY2xvY2tldmVudC5pcnEsIGFwYnRfaW50ZXJydXB0X2hhbmRsZXIsCi0JCQlJUlFGX1RJTUVSIHwgSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcsCi0JCQlhcGJ0X2Nsb2NrZXZlbnQubmFtZSwgYWRldikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgcmVxdWVzdCBJUlEgZm9yIEFQQlQlZFxuIiwKLQkJICAgICAgIGFwYnRfY2xvY2tldmVudC5pcnEpOwotCX0KLQotCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZSgmYWRldi0+ZXZ0KTsKLQkvKiBTdGFydCBBUEJUIDAgaW50ZXJydXB0cyAqLwotCWFwYnRfZW5hYmxlX2ludChBUEJUX0NMT0NLRVZFTlQwX05VTSk7CisJZHdfYXBiX2Nsb2NrZXZlbnRfcmVnaXN0ZXIoYWRldi0+dGltZXIpOwogCiAJc2ZpX2ZyZWVfbXRtcihtdG1yKTsKIAlyZXR1cm4gMDsKQEAgLTMxNiw1MiArMTg3LDM0IEBACiAJaXJxX3NldF9hZmZpbml0eShhZGV2LT5pcnEsIGNwdW1hc2tfb2YoYWRldi0+Y3B1KSk7CiAJLyogQVBCIHRpbWVyIGlycXMgYXJlIHNldCB1cCBhcyBtcF9pcnFzLCB0aW1lciBpcyBlZGdlIHR5cGUgKi8KIAlfX2lycV9zZXRfaGFuZGxlcihhZGV2LT5pcnEsIGhhbmRsZV9lZGdlX2lycSwgMCwgImVkZ2UiKTsKLQotCWlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0JPT1RJTkcpIHsKLQkJaWYgKHJlcXVlc3RfaXJxKGFkZXYtPmlycSwgYXBidF9pbnRlcnJ1cHRfaGFuZGxlciwKLQkJCQkJSVJRRl9USU1FUiB8IElSUUZfRElTQUJMRUQgfAotCQkJCQlJUlFGX05PQkFMQU5DSU5HLAotCQkJCQlhZGV2LT5uYW1lLCBhZGV2KSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgcmVxdWVzdCBJUlEgZm9yIEFQQlQlZFxuIiwKLQkJCSAgICAgICBhZGV2LT5udW0pOwotCQl9Ci0JfSBlbHNlCi0JCWVuYWJsZV9pcnEoYWRldi0+aXJxKTsKIH0KIAogLyogU2hvdWxkIGJlIGNhbGxlZCB3aXRoIHBlciBjcHUgKi8KIHZvaWQgYXBidF9zZXR1cF9zZWNvbmRhcnlfY2xvY2sodm9pZCkKIHsKIAlzdHJ1Y3QgYXBidF9kZXYgKmFkZXY7Ci0Jc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYWV2dDsKIAlpbnQgY3B1OwogCiAJLyogRG9uJ3QgcmVnaXN0ZXIgYm9vdCBDUFUgY2xvY2tldmVudCAqLwogCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlpZiAoIWNwdSkKIAkJcmV0dXJuOwotCS8qCi0JICogV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIHNjYWxlZCBtYXRoIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IKLQkgKiBuYW5vc2Vjb25kIHRvIGFwYnQgdGljayBjb252ZXJzaW9uLgotCSAqIG11bHQgPSAobnNlYy9jeWNsZSkqMl5BUEJUX1NISUZUCi0JICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiSW5pdCBwZXIgQ1BVIGNsb2NrZXZlbnQgJWRcbiIsIGNwdSk7Ci0JYWRldiA9ICZwZXJfY3B1KGNwdV9hcGJ0X2RldiwgY3B1KTsKLQlhZXZ0ID0gJmFkZXYtPmV2dDsKIAotCW1lbWNweShhZXZ0LCAmYXBidF9jbG9ja2V2ZW50LCBzaXplb2YoKmFldnQpKTsKLQlhZXZ0LT5jcHVtYXNrID0gY3B1bWFza19vZihjcHUpOwotCWFldnQtPm5hbWUgPSBhZGV2LT5uYW1lOwotCWFldnQtPm1vZGUgPSBDTE9DS19FVlRfTU9ERV9VTlVTRUQ7CisJYWRldiA9ICZfX2dldF9jcHVfdmFyKGNwdV9hcGJ0X2Rldik7CisJaWYgKCFhZGV2LT50aW1lcikgeworCQlhZGV2LT50aW1lciA9IGR3X2FwYl9jbG9ja2V2ZW50X2luaXQoY3B1LCBhZGV2LT5uYW1lLAorCQkJQVBCVF9DTE9DS0VWRU5UX1JBVElORywgYWRldl92aXJ0X2FkZHIoYWRldiksCisJCQlhZGV2LT5pcnEsIGFwYnRfZnJlcSk7CisJCWFkZXYtPnRpbWVyLT5lb2kgPSBOVUxMOworCX0gZWxzZSB7CisJCWR3X2FwYl9jbG9ja2V2ZW50X3Jlc3VtZShhZGV2LT50aW1lcik7CisJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiUmVnaXN0ZXJpbmcgQ1BVICVkIGNsb2NrZXZlbnQgZGV2aWNlICVzLCBtYXNrICUwOHhcbiIsCi0JICAgICAgIGNwdSwgYWV2dC0+bmFtZSwgKih1MzIgKilhZXZ0LT5jcHVtYXNrKTsKKwlwcmludGsoS0VSTl9JTkZPICJSZWdpc3RlcmluZyBDUFUgJWQgY2xvY2tldmVudCBkZXZpY2UgJXMsIGNwdSAlMDh4XG4iLAorCSAgICAgICBjcHUsIGFkZXYtPm5hbWUsIGFkZXYtPmNwdSk7CiAKIAlhcGJ0X3NldHVwX2lycShhZGV2KTsKLQotCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShhZXZ0KTsKLQotCWFwYnRfZW5hYmxlX2ludChjcHUpOworCWR3X2FwYl9jbG9ja2V2ZW50X3JlZ2lzdGVyKGFkZXYtPnRpbWVyKTsKIAogCXJldHVybjsKIH0KQEAgLTM4NCwxMyArMjM3LDEyIEBACiAKIAlzd2l0Y2ggKGFjdGlvbiAmIDB4ZikgewogCWNhc2UgQ1BVX0RFQUQ6Ci0JCWRpc2FibGVfaXJxKGFkZXYtPmlycSk7Ci0JCWFwYnRfZGlzYWJsZV9pbnQoY3B1KTsKKwkJZHdfYXBiX2Nsb2NrZXZlbnRfcGF1c2UoYWRldi0+dGltZXIpOwogCQlpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SVU5OSU5HKSB7CiAJCQlwcl9kZWJ1Zygic2tpcHBpbmcgQVBCVCBDUFUgJWx1IG9mZmxpbmVcbiIsIGNwdSk7CiAJCX0gZWxzZSBpZiAoYWRldikgewogCQkJcHJfZGVidWcoIkFQQlQgY2xvY2tldmVudCBmb3IgY3B1ICVsdSBvZmZsaW5lXG4iLCBjcHUpOwotCQkJZnJlZV9pcnEoYWRldi0+aXJxLCBhZGV2KTsKKwkJCWR3X2FwYl9jbG9ja2V2ZW50X3N0b3AoYWRldi0+dGltZXIpOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC00MTUsMTE2ICsyNjcsMTYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotc3RhdGljIHZvaWQgYXBidF9zZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKLQkJCSAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQotewotCXVuc2lnbmVkIGxvbmcgY3RybDsKLQl1aW50NjRfdCBkZWx0YTsKLQlpbnQgdGltZXJfbnVtOwotCXN0cnVjdCBhcGJ0X2RldiAqYWRldiA9IEVWVF9UT19BUEJUX0RFVihldnQpOwotCi0JQlVHX09OKCFhcGJ0X3ZpcnRfYWRkcmVzcyk7Ci0KLQl0aW1lcl9udW0gPSBhZGV2LT5udW07Ci0JcHJfZGVidWcoIiVzIENQVSAlZCB0aW1lciAlZCBtb2RlPSVkXG4iLAotCQkgX19mdW5jX18sIGZpcnN0X2NwdSgqZXZ0LT5jcHVtYXNrKSwgdGltZXJfbnVtLCBtb2RlKTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6Ci0JCWRlbHRhID0gKCh1aW50NjRfdCkoTlNFQ19QRVJfU0VDL0haKSkgKiBhcGJ0X2Nsb2NrZXZlbnQubXVsdDsKLQkJZGVsdGEgPj49IGFwYnRfY2xvY2tldmVudC5zaGlmdDsKLQkJY3RybCA9IGFwYnRfcmVhZGwodGltZXJfbnVtLCBBUEJUTVJfTl9DT05UUk9MKTsKLQkJY3RybCB8PSBBUEJUTVJfQ09OVFJPTF9NT0RFX1BFUklPRElDOwotCQlhcGJ0X3dyaXRlbCh0aW1lcl9udW0sIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOwotCQkvKgotCQkgKiBEVyBBUEIgcC4gNDYsIGhhdmUgdG8gZGlzYWJsZSB0aW1lciBiZWZvcmUgbG9hZCBjb3VudGVyLAotCQkgKiBtYXkgY2F1c2Ugc3luYyBwcm9ibGVtLgotCQkgKi8KLQkJY3RybCAmPSB+QVBCVE1SX0NPTlRST0xfRU5BQkxFOwotCQlhcGJ0X3dyaXRlbCh0aW1lcl9udW0sIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOwotCQl1ZGVsYXkoMSk7Ci0JCXByX2RlYnVnKCJTZXR0aW5nIGNsb2NrIHBlcmlvZCAlZCBmb3IgSFogJWRcbiIsIChpbnQpZGVsdGEsIEhaKTsKLQkJYXBidF93cml0ZWwodGltZXJfbnVtLCBkZWx0YSwgQVBCVE1SX05fTE9BRF9DT1VOVCk7Ci0JCWN0cmwgfD0gQVBCVE1SX0NPTlRST0xfRU5BQkxFOwotCQlhcGJ0X3dyaXRlbCh0aW1lcl9udW0sIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOwotCQlicmVhazsKLQkJLyogQVBCIHRpbWVyIGRvZXMgbm90IGhhdmUgb25lLXNob3QgbW9kZSwgdXNlIGZyZWUgcnVubmluZyBtb2RlICovCi0JY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgotCQljdHJsID0gYXBidF9yZWFkbCh0aW1lcl9udW0sIEFQQlRNUl9OX0NPTlRST0wpOwotCQkvKgotCQkgKiBzZXQgZnJlZSBydW5uaW5nIG1vZGUsIHRoaXMgbW9kZSB3aWxsIGxldCB0aW1lciByZWxvYWQgbWF4Ci0JCSAqIHRpbWVvdXQgd2hpY2ggd2lsbCBnaXZlIHRpbWUgKDNtaW4gb24gMjVNSHogY2xvY2spIHRvIHJlYXJtCi0JCSAqIHRoZSBuZXh0IGV2ZW50LCB0aGVyZWZvcmUgZW11bGF0ZSB0aGUgb25lLXNob3QgbW9kZS4KLQkJICovCi0JCWN0cmwgJj0gfkFQQlRNUl9DT05UUk9MX0VOQUJMRTsKLQkJY3RybCAmPSB+QVBCVE1SX0NPTlRST0xfTU9ERV9QRVJJT0RJQzsKLQotCQlhcGJ0X3dyaXRlbCh0aW1lcl9udW0sIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOwotCQkvKiB3cml0ZSBhZ2FpbiB0byBzZXQgZnJlZSBydW5uaW5nIG1vZGUgKi8KLQkJYXBidF93cml0ZWwodGltZXJfbnVtLCBjdHJsLCBBUEJUTVJfTl9DT05UUk9MKTsKLQotCQkvKgotCQkgKiBEVyBBUEIgcC4gNDYsIGxvYWQgY291bnRlciB3aXRoIGFsbCAxcyBiZWZvcmUgc3RhcnRpbmcgZnJlZQotCQkgKiBydW5uaW5nIG1vZGUuCi0JCSAqLwotCQlhcGJ0X3dyaXRlbCh0aW1lcl9udW0sIH4wLCBBUEJUTVJfTl9MT0FEX0NPVU5UKTsKLQkJY3RybCAmPSB+QVBCVE1SX0NPTlRST0xfSU5UOwotCQljdHJsIHw9IEFQQlRNUl9DT05UUk9MX0VOQUJMRTsKLQkJYXBidF93cml0ZWwodGltZXJfbnVtLCBjdHJsLCBBUEJUTVJfTl9DT05UUk9MKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKLQljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgotCQlhcGJ0X2Rpc2FibGVfaW50KHRpbWVyX251bSk7Ci0JCWN0cmwgPSBhcGJ0X3JlYWRsKHRpbWVyX251bSwgQVBCVE1SX05fQ09OVFJPTCk7Ci0JCWN0cmwgJj0gfkFQQlRNUl9DT05UUk9MX0VOQUJMRTsKLQkJYXBidF93cml0ZWwodGltZXJfbnVtLCBjdHJsLCBBUEJUTVJfTl9DT05UUk9MKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENMT0NLX0VWVF9NT0RFX1JFU1VNRToKLQkJYXBidF9lbmFibGVfaW50KHRpbWVyX251bSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludCBhcGJ0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwKLQkJCSAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKLXsKLQl1bnNpZ25lZCBsb25nIGN0cmw7Ci0JaW50IHRpbWVyX251bTsKLQotCXN0cnVjdCBhcGJ0X2RldiAqYWRldiA9IEVWVF9UT19BUEJUX0RFVihldnQpOwotCi0JdGltZXJfbnVtID0gYWRldi0+bnVtOwotCS8qIERpc2FibGUgdGltZXIgKi8KLQljdHJsID0gYXBidF9yZWFkbCh0aW1lcl9udW0sIEFQQlRNUl9OX0NPTlRST0wpOwotCWN0cmwgJj0gfkFQQlRNUl9DT05UUk9MX0VOQUJMRTsKLQlhcGJ0X3dyaXRlbCh0aW1lcl9udW0sIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOwotCS8qIHdyaXRlIG5ldyBjb3VudCAqLwotCWFwYnRfd3JpdGVsKHRpbWVyX251bSwgZGVsdGEsIEFQQlRNUl9OX0xPQURfQ09VTlQpOwotCWN0cmwgfD0gQVBCVE1SX0NPTlRST0xfRU5BQkxFOwotCWFwYnRfd3JpdGVsKHRpbWVyX251bSwgY3RybCwgQVBCVE1SX05fQ09OVFJPTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjeWNsZV90IGFwYnRfcmVhZF9jbG9ja3NvdXJjZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQotewotCXVuc2lnbmVkIGxvbmcgY3VycmVudF9jb3VudDsKLQotCWN1cnJlbnRfY291bnQgPSBhcGJ0X3JlYWRsKHBoeV9jc190aW1lcl9pZCwgQVBCVE1SX05fQ1VSUkVOVF9WQUxVRSk7Ci0JcmV0dXJuIChjeWNsZV90KX5jdXJyZW50X2NvdW50OwotfQotCiBzdGF0aWMgaW50IGFwYnRfY2xvY2tzb3VyY2VfcmVnaXN0ZXIodm9pZCkKIHsKIAl1NjQgc3RhcnQsIG5vdzsKIAljeWNsZV90IHQxOwogCiAJLyogU3RhcnQgdGhlIGNvdW50ZXIsIHVzZSB0aW1lciAyIGFzIHNvdXJjZSwgdGltZXIgMC8xIGZvciBldmVudCAqLwotCWFwYnRfc3RhcnRfY291bnRlcihwaHlfY3NfdGltZXJfaWQpOworCWR3X2FwYl9jbG9ja3NvdXJjZV9zdGFydChjbG9ja3NvdXJjZV9hcGJ0KTsKIAogCS8qIFZlcmlmeSB3aGV0aGVyIGFwYnQgY291bnRlciB3b3JrcyAqLwotCXQxID0gYXBidF9yZWFkX2Nsb2Nrc291cmNlKCZjbG9ja3NvdXJjZV9hcGJ0KTsKKwl0MSA9IGR3X2FwYl9jbG9ja3NvdXJjZV9yZWFkKGNsb2Nrc291cmNlX2FwYnQpOwogCXJkdHNjbGwoc3RhcnQpOwogCiAJLyoKQEAgLTUzOSwxMCArMjkxLDEwIEBACiAJfSB3aGlsZSAoKG5vdyAtIHN0YXJ0KSA8IDIwMDAwMFVMKTsKIAogCS8qIEFQQlQgaXMgdGhlIG9ubHkgYWx3YXlzIG9uIGNsb2Nrc291cmNlLCBpdCBoYXMgdG8gd29yayEgKi8KLQlpZiAodDEgPT0gYXBidF9yZWFkX2Nsb2Nrc291cmNlKCZjbG9ja3NvdXJjZV9hcGJ0KSkKKwlpZiAodDEgPT0gZHdfYXBiX2Nsb2Nrc291cmNlX3JlYWQoY2xvY2tzb3VyY2VfYXBidCkpCiAJCXBhbmljKCJBUEJUIGNvdW50ZXIgbm90IGNvdW50aW5nLiBBUEJUIGRpc2FibGVkXG4iKTsKIAotCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2toeigmY2xvY2tzb3VyY2VfYXBidCwgKHUzMilhcGJ0X2ZyZXEqMTAwMCk7CisJZHdfYXBiX2Nsb2Nrc291cmNlX3JlZ2lzdGVyKGNsb2Nrc291cmNlX2FwYnQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NjYsMTAgKzMxOCw3IEBACiAJaWYgKGFwYl90aW1lcl9ibG9ja19lbmFibGVkKQogCQlyZXR1cm47CiAJYXBidF9zZXRfbWFwcGluZygpOwotCWlmIChhcGJ0X3ZpcnRfYWRkcmVzcykgewotCQlwcl9kZWJ1ZygiRm91bmQgQVBCVCB2ZXJzaW9uIDB4JWx4XG4iLFwKLQkJCSBhcGJ0X3JlYWRsX3JlZyhBUEJUTVJTX0NPTVBfVkVSU0lPTikpOwotCX0gZWxzZQorCWlmICghYXBidF92aXJ0X2FkZHJlc3MpCiAJCWdvdG8gb3V0X25vYXBidDsKIAkvKgogCSAqIFJlYWQgdGhlIGZyZXF1ZW5jeSBhbmQgY2hlY2sgZm9yIGEgc2FuZSB2YWx1ZSwgZm9yIEVTTCBtb2RlbApAQCAtNTc3LDcgKzMyNiw3IEBACiAJICovCiAKIAlpZiAoYXBidF9mcmVxIDwgQVBCVF9NSU5fRlJFUSB8fCBhcGJ0X2ZyZXEgPiBBUEJUX01BWF9GUkVRKSB7Ci0JCXByX2RlYnVnKCJBUEJUIGhhcyBpbnZhbGlkIGZyZXEgMHglbGx4XG4iLCBhcGJ0X2ZyZXEpOworCQlwcl9kZWJ1ZygiQVBCVCBoYXMgaW52YWxpZCBmcmVxIDB4JWx4XG4iLCBhcGJ0X2ZyZXEpOwogCQlnb3RvIG91dF9ub2FwYnQ7CiAJfQogCWlmIChhcGJ0X2Nsb2Nrc291cmNlX3JlZ2lzdGVyKCkpIHsKQEAgLTYwMywzMCArMzUyLDIwIEBACiAJfSBlbHNlIHsKIAkJcGVyY3B1X3RpbWVyID0gMDsKIAkJYXBidF9udW1fdGltZXJzX3VzZWQgPSAxOwotCQlhZGV2ID0gJnBlcl9jcHUoY3B1X2FwYnRfZGV2LCAwKTsKLQkJYWRldi0+ZmxhZ3MgJj0gfkFQQlRfREVWX1VTRUQ7CiAJfQogCXByX2RlYnVnKCIlczogJWQgQVBCIHRpbWVycyB1c2VkXG4iLCBfX2Z1bmNfXywgYXBidF9udW1fdGltZXJzX3VzZWQpOwogCiAJLyogaGVyZSB3ZSBzZXQgdXAgcGVyIENQVSB0aW1lciBkYXRhIHN0cnVjdHVyZSAqLwotCWFwYnRfZGV2cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcGJ0X2RldikgKiBhcGJ0X251bV90aW1lcnNfdXNlZCwKLQkJCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWFwYnRfZGV2cykgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSBBUEIgdGltZXIgZGV2aWNlc1xuIik7Ci0JCXJldHVybjsKLQl9CiAJZm9yIChpID0gMDsgaSA8IGFwYnRfbnVtX3RpbWVyc191c2VkOyBpKyspIHsKIAkJYWRldiA9ICZwZXJfY3B1KGNwdV9hcGJ0X2RldiwgaSk7CiAJCWFkZXYtPm51bSA9IGk7CiAJCWFkZXYtPmNwdSA9IGk7CiAJCXBfbXRtciA9IHNmaV9nZXRfbXRtcihpKTsKLQkJaWYgKHBfbXRtcikgewotCQkJYWRldi0+dGljayA9IHBfbXRtci0+ZnJlcV9oejsKKwkJaWYgKHBfbXRtcikKIAkJCWFkZXYtPmlycSA9IHBfbXRtci0+aXJxOwotCQl9IGVsc2UKKwkJZWxzZQogCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZ2V0IHRpbWVyIGZvciBjcHUgJWRcbiIsIGkpOwotCQlhZGV2LT5jb3VudCA9IDA7Ci0JCXNwcmludGYoYWRldi0+bmFtZSwgImFwYnQlZCIsIGkpOworCQlzbnByaW50ZihhZGV2LT5uYW1lLCBzaXplb2YoYWRldi0+bmFtZSkgLSAxLCAiYXBidCVkIiwgaSk7CiAJfQogI2VuZGlmCiAKQEAgLTYzOCwxNyArMzc3LDggQEAKIAlwYW5pYygiZmFpbGVkIHRvIGVuYWJsZSBBUEIgdGltZXJcbiIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXBidF9kaXNhYmxlKGludCBuKQotewotCWlmIChpc19hcGJ0X2NhcGFibGUoKSkgewotCQl1bnNpZ25lZCBsb25nIGN0cmwgPSAgYXBidF9yZWFkbChuLCBBUEJUTVJfTl9DT05UUk9MKTsKLQkJY3RybCAmPSB+QVBCVE1SX0NPTlRST0xfRU5BQkxFOwotCQlhcGJ0X3dyaXRlbChuLCBjdHJsLCBBUEJUTVJfTl9DT05UUk9MKTsKLQl9Ci19Ci0KIC8qIGNhbGxlZCBiZWZvcmUgYXBiX3RpbWVyX2VuYWJsZSwgdXNlIGVhcmx5IG1hcCAqLwotdW5zaWduZWQgbG9uZyBhcGJ0X3F1aWNrX2NhbGlicmF0ZSgpCit1bnNpZ25lZCBsb25nIGFwYnRfcXVpY2tfY2FsaWJyYXRlKHZvaWQpCiB7CiAJaW50IGksIHNjYWxlOwogCXU2NCBvbGQsIG5ldzsKQEAgLTY1NywzMSArMzg3LDMxIEBACiAJdTMyIGxvb3AsIHNoaWZ0OwogCiAJYXBidF9zZXRfbWFwcGluZygpOwotCWFwYnRfc3RhcnRfY291bnRlcihwaHlfY3NfdGltZXJfaWQpOworCWR3X2FwYl9jbG9ja3NvdXJjZV9zdGFydChjbG9ja3NvdXJjZV9hcGJ0KTsKIAogCS8qIGNoZWNrIGlmIHRoZSB0aW1lciBjYW4gY291bnQgZG93biwgb3RoZXJ3aXNlIHJldHVybiAqLwotCW9sZCA9IGFwYnRfcmVhZF9jbG9ja3NvdXJjZSgmY2xvY2tzb3VyY2VfYXBidCk7CisJb2xkID0gZHdfYXBiX2Nsb2Nrc291cmNlX3JlYWQoY2xvY2tzb3VyY2VfYXBidCk7CiAJaSA9IDEwMDAwOwogCXdoaWxlICgtLWkpIHsKLQkJaWYgKG9sZCAhPSBhcGJ0X3JlYWRfY2xvY2tzb3VyY2UoJmNsb2Nrc291cmNlX2FwYnQpKQorCQlpZiAob2xkICE9IGR3X2FwYl9jbG9ja3NvdXJjZV9yZWFkKGNsb2Nrc291cmNlX2FwYnQpKQogCQkJYnJlYWs7CiAJfQogCWlmICghaSkKIAkJZ290byBmYWlsZWQ7CiAKIAkvKiBjb3VudCAxNiBtcyAqLwotCWxvb3AgPSAoYXBidF9mcmVxICogMTAwMCkgPDwgNDsKKwlsb29wID0gKGFwYnRfZnJlcSAvIDEwMDApIDw8IDQ7CiAKIAkvKiByZXN0YXJ0IHRoZSB0aW1lciB0byBlbnN1cmUgaXQgd29uJ3QgZ2V0IHRvIDAgaW4gdGhlIGNhbGlicmF0aW9uICovCi0JYXBidF9zdGFydF9jb3VudGVyKHBoeV9jc190aW1lcl9pZCk7CisJZHdfYXBiX2Nsb2Nrc291cmNlX3N0YXJ0KGNsb2Nrc291cmNlX2FwYnQpOwogCi0Jb2xkID0gYXBidF9yZWFkX2Nsb2Nrc291cmNlKCZjbG9ja3NvdXJjZV9hcGJ0KTsKKwlvbGQgPSBkd19hcGJfY2xvY2tzb3VyY2VfcmVhZChjbG9ja3NvdXJjZV9hcGJ0KTsKIAlvbGQgKz0gbG9vcDsKIAogCXQxID0gX19uYXRpdmVfcmVhZF90c2MoKTsKIAogCWRvIHsKLQkJbmV3ID0gYXBidF9yZWFkX2Nsb2Nrc291cmNlKCZjbG9ja3NvdXJjZV9hcGJ0KTsKKwkJbmV3ID0gZHdfYXBiX2Nsb2Nrc291cmNlX3JlYWQoY2xvY2tzb3VyY2VfYXBidCk7CiAJfSB3aGlsZSAobmV3IDwgb2xkKTsKIAogCXQyID0gX19uYXRpdmVfcmVhZF90c2MoKTsKQEAgLTY5Myw3ICs0MjMsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAJc2NhbGUgPSAoaW50KWRpdl91NjQoKHQyIC0gdDEpLCBsb29wID4+IHNoaWZ0KTsKLQlraHogPSAoc2NhbGUgKiBhcGJ0X2ZyZXEgKiAxMDAwKSA+PiBzaGlmdDsKKwlraHogPSAoc2NhbGUgKiAoYXBidF9mcmVxIC8gMTAwMCkpID4+IHNoaWZ0OwogCXByaW50ayhLRVJOX0lORk8gIlRTQyBmcmVxIGNhbGN1bGF0ZWQgYnkgQVBCIHRpbWVyIGlzICVsdSBraHpcbiIsIGtoeik7CiAJcmV0dXJuIGtoejsKIGZhaWxlZDoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwppbmRleCBiOTYxYWY4Li5iMjRiZTM4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvaTgyNTMuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgpAQCAtMzksNyArNDAsNiBAQAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KLSNpbmNsdWRlIDxhc20vaTgyNTMuaD4KICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CiAjaW5jbHVkZSA8YXNtL2lkbGUuaD4KICNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KICNpbmNsdWRlIDxhc20vdHNjLmg+CkBAIC0zOTAsNyArMzkxLDggQEAKIAogLyoKICAqIElmIG1hc2s9MSwgdGhlIExWVCBlbnRyeSBkb2VzIG5vdCBnZW5lcmF0ZSBpbnRlcnJ1cHRzIHdoaWxlIG1hc2s9MAotICogZW5hYmxlcyB0aGUgdmVjdG9yLiBTZWUgYWxzbyB0aGUgQktER3MuCisgKiBlbmFibGVzIHRoZSB2ZWN0b3IuIFNlZSBhbHNvIHRoZSBCS0RHcy4gTXVzdCBiZSBjYWxsZWQgd2l0aAorICogcHJlZW1wdGlvbiBkaXNhYmxlZC4KICAqLwogCiBpbnQgc2V0dXBfQVBJQ19laWx2dCh1OCBvZmZzZXQsIHU4IHZlY3RvciwgdTggbXNnX3R5cGUsIHU4IG1hc2spCkBAIC0xNDI4LDcgKzE0MzAsNyBAQAogCXJkbXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBtc3IsIG1zcjIpOwogCWlmICghKG1zciAmIFgyQVBJQ19FTkFCTEUpKSB7CiAJCXByaW50a19vbmNlKEtFUk5fSU5GTyAiRW5hYmxpbmcgeDJhcGljXG4iKTsKLQkJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIG1zciB8IFgyQVBJQ19FTkFCTEUsIDApOworCQl3cm1zcihNU1JfSUEzMl9BUElDQkFTRSwgbXNyIHwgWDJBUElDX0VOQUJMRSwgbXNyMik7CiAJfQogfQogI2VuZGlmIC8qIENPTkZJR19YODZfWDJBUElDICovCkBAIC0xOTQyLDEwICsxOTQ0LDI4IEBACiAKIHZvaWQgX19jcHVpbml0IGdlbmVyaWNfcHJvY2Vzc29yX2luZm8oaW50IGFwaWNpZCwgaW50IHZlcnNpb24pCiB7Ci0JaW50IGNwdTsKKwlpbnQgY3B1LCBtYXggPSBucl9jcHVfaWRzOworCWJvb2wgYm9vdF9jcHVfZGV0ZWN0ZWQgPSBwaHlzaWRfaXNzZXQoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkLAorCQkJCXBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKworCS8qCisJICogSWYgYm9vdCBjcHUgaGFzIG5vdCBiZWVuIGRldGVjdGVkIHlldCwgdGhlbiBvbmx5IGFsbG93IHVwdG8KKwkgKiBucl9jcHVfaWRzIC0gMSBwcm9jZXNzb3JzIGFuZCBrZWVwIG9uZSBzbG90IGZyZWUgZm9yIGJvb3QgY3B1CisJICovCisJaWYgKCFib290X2NwdV9kZXRlY3RlZCAmJiBudW1fcHJvY2Vzc29ycyA+PSBucl9jcHVfaWRzIC0gMSAmJgorCSAgICBhcGljaWQgIT0gYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKSB7CisJCWludCB0aGlzY3B1ID0gbWF4ICsgZGlzYWJsZWRfY3B1cyAtIDE7CisKKwkJcHJfd2FybmluZygKKwkJCSJBQ1BJOiBOUl9DUFVTL3Bvc3NpYmxlX2NwdXMgbGltaXQgb2YgJWkgYWxtb3N0IgorCQkJIiByZWFjaGVkLiBLZWVwaW5nIG9uZSBzbG90IGZvciBib290IGNwdS4iCisJCQkiICBQcm9jZXNzb3IgJWQvMHgleCBpZ25vcmVkLlxuIiwgbWF4LCB0aGlzY3B1LCBhcGljaWQpOworCisJCWRpc2FibGVkX2NwdXMrKzsKKwkJcmV0dXJuOworCX0KIAogCWlmIChudW1fcHJvY2Vzc29ycyA+PSBucl9jcHVfaWRzKSB7Ci0JCWludCBtYXggPSBucl9jcHVfaWRzOwogCQlpbnQgdGhpc2NwdSA9IG1heCArIGRpc2FibGVkX2NwdXM7CiAKIAkJcHJfd2FybmluZygKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYwppbmRleCBlNTI5MzM5Li44ZWI4NjNlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jCkBAIC0xMjk1LDYgKzEyOTUsMTYgQEAKIAkJICogaXJxIGhhbmRsZXIgd2lsbCBkbyB0aGUgZXhwbGljaXQgRU9JIHRvIHRoZSBpby1hcGljLgogCQkgKi8KIAkJaXJfZW50cnktPnZlY3RvciA9IHBpbjsKKworCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIEtFUk5fREVCVUcgIklPQVBJQ1slZF06ICIKKwkJCSJTZXQgSVJURSBlbnRyeSAoUDolZCBGUEQ6JWQgRHN0X01vZGU6JWQgIgorCQkJIlJlZGlyX2hpbnQ6JWQgVHJpZ19Nb2RlOiVkIERsdnJ5X01vZGU6JVggIgorCQkJIkF2YWlsOiVYIFZlY3RvcjolMDJYIERlc3Q6JTA4WCAiCisJCQkiU0lEOiUwNFggU1E6JVggU1ZUOiVYKVxuIiwKKwkJCWFwaWNfaWQsIGlydGUucHJlc2VudCwgaXJ0ZS5mcGQsIGlydGUuZHN0X21vZGUsCisJCQlpcnRlLnJlZGlyX2hpbnQsIGlydGUudHJpZ2dlcl9tb2RlLCBpcnRlLmRsdnJ5X21vZGUsCisJCQlpcnRlLmF2YWlsLCBpcnRlLnZlY3RvciwgaXJ0ZS5kZXN0X2lkLAorCQkJaXJ0ZS5zaWQsIGlydGUuc3EsIGlydGUuc3Z0KTsKIAl9IGVsc2UgewogCQllbnRyeS0+ZGVsaXZlcnlfbW9kZSA9IGFwaWMtPmlycV9kZWxpdmVyeV9tb2RlOwogCQllbnRyeS0+ZGVzdF9tb2RlID0gYXBpYy0+aXJxX2Rlc3RfbW9kZTsKQEAgLTEzMzcsOSArMTM0Nyw5IEBACiAKIAlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsS0VSTl9ERUJVRwogCQkgICAgIklPQVBJQ1slZF06IFNldCByb3V0aW5nIGVudHJ5ICglZC0lZCAtPiAweCV4IC0+ICIKLQkJICAgICJJUlEgJWQgTW9kZTolaSBBY3RpdmU6JWkpXG4iLAorCQkgICAgIklSUSAlZCBNb2RlOiVpIEFjdGl2ZTolaSBEZXN0OiVkKVxuIiwKIAkJICAgIGFwaWNfaWQsIG1wY19pb2FwaWNfaWQoYXBpY19pZCksIHBpbiwgY2ZnLT52ZWN0b3IsCi0JCSAgICBpcnEsIHRyaWdnZXIsIHBvbGFyaXR5KTsKKwkJICAgIGlycSwgdHJpZ2dlciwgcG9sYXJpdHksIGRlc3QpOwogCiAKIAlpZiAoc2V0dXBfaW9hcGljX2VudHJ5KG1wY19pb2FwaWNfaWQoYXBpY19pZCksIGlycSwgJmVudHJ5LApAQCAtMTUyMiwxMCArMTUzMiwxMiBAQAogCXByaW50ayhLRVJOX0RFQlVHICIuLi4uLi4uICAgIDogTFRTICAgICAgICAgIDogJVhcbiIsIHJlZ18wMC5iaXRzLkxUUyk7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiLi4uLiByZWdpc3RlciAjMDE6ICUwOFhcbiIsICooaW50ICopJnJlZ18wMSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4uLi4gICAgIDogbWF4IHJlZGlyZWN0aW9uIGVudHJpZXM6ICUwNFhcbiIsIHJlZ18wMS5iaXRzLmVudHJpZXMpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4uLi4uICAgICA6IG1heCByZWRpcmVjdGlvbiBlbnRyaWVzOiAlMDJYXG4iLAorCQlyZWdfMDEuYml0cy5lbnRyaWVzKTsKIAogCXByaW50ayhLRVJOX0RFQlVHICIuLi4uLi4uICAgICA6IFBSUSBpbXBsZW1lbnRlZDogJVhcbiIsIHJlZ18wMS5iaXRzLlBSUSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4uLi4gICAgIDogSU8gQVBJQyB2ZXJzaW9uOiAlMDRYXG4iLCByZWdfMDEuYml0cy52ZXJzaW9uKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICAgOiBJTyBBUElDIHZlcnNpb246ICUwMlhcbiIsCisJCXJlZ18wMS5iaXRzLnZlcnNpb24pOwogCiAJLyoKIAkgKiBTb21lIEludGVsIGNoaXBzZXRzIHdpdGggSU8gQVBJQyBWRVJTSU9OIG9mIDB4MT8gZG9uJ3QgaGF2ZSByZWdfMDIsCkBAIC0xNTUwLDMxICsxNTYyLDYwIEBACiAKIAlwcmludGsoS0VSTl9ERUJVRyAiLi4uLiBJUlEgcmVkaXJlY3Rpb24gdGFibGU6XG4iKTsKIAotCXByaW50ayhLRVJOX0RFQlVHICIgTlIgRHN0IE1hc2sgVHJpZyBJUlIgUG9sIgotCQkJICAiIFN0YXQgRG1vZCBEZWxpIFZlY3Q6XG4iKTsKKwlpZiAoaW50cl9yZW1hcHBpbmdfZW5hYmxlZCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiIE5SIEluZHggRm10IE1hc2sgVHJpZyBJUlIiCisJCQkiIFBvbCBTdGF0IEluZHgyIFplcm8gVmVjdDpcbiIpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIgTlIgRHN0IE1hc2sgVHJpZyBJUlIgUG9sIgorCQkJIiBTdGF0IERtb2QgRGVsaSBWZWN0OlxuIik7CisJfQogCiAJZm9yIChpID0gMDsgaSA8PSByZWdfMDEuYml0cy5lbnRyaWVzOyBpKyspIHsKLQkJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisJCWlmIChpbnRyX3JlbWFwcGluZ19lbmFibGVkKSB7CisJCQlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKKwkJCXN0cnVjdCBJUl9JT19BUElDX3JvdXRlX2VudHJ5ICppcl9lbnRyeTsKIAotCQllbnRyeSA9IGlvYXBpY19yZWFkX2VudHJ5KGFwaWMsIGkpOworCQkJZW50cnkgPSBpb2FwaWNfcmVhZF9lbnRyeShhcGljLCBpKTsKKwkJCWlyX2VudHJ5ID0gKHN0cnVjdCBJUl9JT19BUElDX3JvdXRlX2VudHJ5ICopICZlbnRyeTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgJTAyeCAlMDRYICIsCisJCQkJaSwKKwkJCQlpcl9lbnRyeS0+aW5kZXgKKwkJCSk7CisJCQlwcmludGsoIiUxZCAgICUxZCAgICAlMWQgICAgJTFkICAgJTFkICAgIgorCQkJCSIlMWQgICAgJTFkICAgICAlWCAgICAlMDJYXG4iLAorCQkJCWlyX2VudHJ5LT5mb3JtYXQsCisJCQkJaXJfZW50cnktPm1hc2ssCisJCQkJaXJfZW50cnktPnRyaWdnZXIsCisJCQkJaXJfZW50cnktPmlyciwKKwkJCQlpcl9lbnRyeS0+cG9sYXJpdHksCisJCQkJaXJfZW50cnktPmRlbGl2ZXJ5X3N0YXR1cywKKwkJCQlpcl9lbnRyeS0+aW5kZXgyLAorCQkJCWlyX2VudHJ5LT56ZXJvLAorCQkJCWlyX2VudHJ5LT52ZWN0b3IKKwkJCSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKIAotCQlwcmludGsoS0VSTl9ERUJVRyAiICUwMnggJTAzWCAiLAotCQkJaSwKLQkJCWVudHJ5LmRlc3QKLQkJKTsKLQotCQlwcmludGsoIiUxZCAgICAlMWQgICAgJTFkICAgJTFkICAgJTFkICAgICUxZCAgICAlMWQgICAgJTAyWFxuIiwKLQkJCWVudHJ5Lm1hc2ssCi0JCQllbnRyeS50cmlnZ2VyLAotCQkJZW50cnkuaXJyLAotCQkJZW50cnkucG9sYXJpdHksCi0JCQllbnRyeS5kZWxpdmVyeV9zdGF0dXMsCi0JCQllbnRyeS5kZXN0X21vZGUsCi0JCQllbnRyeS5kZWxpdmVyeV9tb2RlLAotCQkJZW50cnkudmVjdG9yCi0JCSk7CisJCQllbnRyeSA9IGlvYXBpY19yZWFkX2VudHJ5KGFwaWMsIGkpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAlMDJ4ICUwMlggICIsCisJCQkJaSwKKwkJCQllbnRyeS5kZXN0CisJCQkpOworCQkJcHJpbnRrKCIlMWQgICAgJTFkICAgICUxZCAgICUxZCAgICUxZCAgICAiCisJCQkJIiUxZCAgICAlMWQgICAgJTAyWFxuIiwKKwkJCQllbnRyeS5tYXNrLAorCQkJCWVudHJ5LnRyaWdnZXIsCisJCQkJZW50cnkuaXJyLAorCQkJCWVudHJ5LnBvbGFyaXR5LAorCQkJCWVudHJ5LmRlbGl2ZXJ5X3N0YXR1cywKKwkJCQllbnRyeS5kZXN0X21vZGUsCisJCQkJZW50cnkuZGVsaXZlcnlfbW9kZSwKKwkJCQllbnRyeS52ZWN0b3IKKwkJCSk7CisJCX0KIAl9CiAJfQorCiAJcHJpbnRrKEtFUk5fREVCVUcgIklSUSB0byBwaW4gbWFwcGluZ3M6XG4iKTsKIAlmb3JfZWFjaF9hY3RpdmVfaXJxKGlycSkgewogCQlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeTsKQEAgLTE3OTIsNyArMTgzMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWZzX2luaXRjYWxsKHByaW50X0lDcyk7CitsYXRlX2luaXRjYWxsKHByaW50X0lDcyk7CiAKIAogLyogV2hlcmUgaWYgYW55d2hlcmUgaXMgdGhlIGk4MjU5IGNvbm5lY3QgaW4gZXh0ZXJuYWwgaW50IG1vZGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCmluZGV4IGI1MTFhMDEuLmFkYzY2YzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwpAQCAtNjMyLDE0ICs2MzIsMTQgQEAKIAogLyogRGlyZWN0IExlZ2FjeSBWR0EgSS9PIHRyYWZmaWMgdG8gZGVzaWduYXRlZCBJT0ggKi8KIGludCB1dl9zZXRfdmdhX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBib29sIGRlY29kZSwKLQkJICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmRfYml0cywgYm9vbCBjaGFuZ2VfYnJpZGdlKQorCQkgICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZF9iaXRzLCB1MzIgZmxhZ3MpCiB7CiAJaW50IGRvbWFpbiwgYnVzLCByYzsKIAotCVBSX0RFVkVMKCJkZXZmbiAleCBkZWNvZGUgJWQgY21kICV4IGNoZ19icmRnICVkXG4iLAotCQkJcGRldi0+ZGV2Zm4sIGRlY29kZSwgY29tbWFuZF9iaXRzLCBjaGFuZ2VfYnJpZGdlKTsKKwlQUl9ERVZFTCgiZGV2Zm4gJXggZGVjb2RlICVkIGNtZCAleCBmbGFncyAlZFxuIiwKKwkJCXBkZXYtPmRldmZuLCBkZWNvZGUsIGNvbW1hbmRfYml0cywgZmxhZ3MpOwogCi0JaWYgKCFjaGFuZ2VfYnJpZGdlKQorCWlmICghKGZsYWdzICYgUENJX1ZHQV9TVEFURV9DSEFOR0VfQlJJREdFKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoKGNvbW1hbmRfYml0cyAmIFBDSV9DT01NQU5EX0lPKSA9PSAwKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwbV8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwbV8zMi5jCmluZGV4IDk2NWE3NjYuLjAzNzFjNDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcG1fMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBtXzMyLmMKQEAgLTIyOSwxMSArMjI5LDExIEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2k4MjUzLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgotI2luY2x1ZGUgPGFzbS9pODI1My5oPgogI2luY2x1ZGUgPGFzbS9vbHBjLmg+CiAjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgpAQCAtMTIyMCwxMSArMTIyMCwxMSBAQAogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7CiAJLyogc2V0IHRoZSBjbG9jayB0byBIWiAqLwotCW91dGJfcGl0KDB4MzQsIFBJVF9NT0RFKTsJCS8qIGJpbmFyeSwgbW9kZSAyLCBMU0IvTVNCLCBjaCAwICovCisJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsJCS8qIGJpbmFyeSwgbW9kZSAyLCBMU0IvTVNCLCBjaCAwICovCiAJdWRlbGF5KDEwKTsKLQlvdXRiX3BpdChMQVRDSCAmIDB4ZmYsIFBJVF9DSDApOwkvKiBMU0IgKi8KKwlvdXRiX3AoTEFUQ0ggJiAweGZmLCBQSVRfQ0gwKTsJLyogTFNCICovCiAJdWRlbGF5KDEwKTsKLQlvdXRiX3BpdChMQVRDSCA+PiA4LCBQSVRfQ0gwKTsJLyogTVNCICovCisJb3V0Yl9wKExBVENIID4+IDgsIFBJVF9DSDApOwkvKiBNU0IgKi8KIAl1ZGVsYXkoMTApOwogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1M19sb2NrLCBmbGFncyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c18zMi5jIGIvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMKaW5kZXggYzI5ZDYzMS4uMzk1YTEwZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMKQEAgLTYzLDcgKzYzLDYgQEAKIAlCTEFOSygpOwogCU9GRlNFVChMR1VFU1RfREFUQV9pcnFfZW5hYmxlZCwgbGd1ZXN0X2RhdGEsIGlycV9lbmFibGVkKTsKIAlPRkZTRVQoTEdVRVNUX0RBVEFfaXJxX3BlbmRpbmcsIGxndWVzdF9kYXRhLCBpcnFfcGVuZGluZyk7Ci0JT0ZGU0VUKExHVUVTVF9EQVRBX3BnZGlyLCBsZ3Vlc3RfZGF0YSwgcGdkaXIpOwogCiAJQkxBTksoKTsKIAlPRkZTRVQoTEdVRVNUX1BBR0VTX2hvc3RfZ2R0X2Rlc2MsIGxndWVzdF9wYWdlcywgc3RhdGUuaG9zdF9nZHRfZGVzYyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2J1Z3MuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvYnVncy5jCmluZGV4IDUyNTUxNGMuLjQ2Njc0ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYnVncy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvYnVncy5jCkBAIC02Miw2ICs2Miw4IEBACiAJCXJldHVybjsKIAl9CiAKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisKIAkvKgogCSAqIHRyYXBfaW5pdCgpIGVuYWJsZWQgRlhTUiBhbmQgY29tcGFueSBfYmVmb3JlXyB0ZXN0aW5nIGZvciBGUAogCSAqIHByb2JsZW1zIGhlcmUuCkBAIC04MCw2ICs4Miw4IEBACiAJCTogIj1tIiAoKiZmZGl2X2J1ZykKIAkJOiAibSIgKComeCksICJtIiAoKiZ5KSk7CiAKKwlrZXJuZWxfZnB1X2VuZCgpOworCiAJYm9vdF9jcHVfZGF0YS5mZGl2X2J1ZyA9IGZkaXZfYnVnOwogCWlmIChib290X2NwdV9kYXRhLmZkaXZfYnVnKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJIbW0sIEZQVSB3aXRoIEZESVYgYnVnLlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2h5cGVydmlzb3IuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCmluZGV4IDgwOTVmODYuLjc1NWY2NGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCkBAIC0zMiwxMSArMzIsMTEgQEAKICAqLwogc3RhdGljIGNvbnN0IF9faW5pdGNvbnN0IHN0cnVjdCBoeXBlcnZpc29yX3g4NiAqIGNvbnN0IGh5cGVydmlzb3JzW10gPQogewotCSZ4ODZfaHlwZXJfdm13YXJlLAotCSZ4ODZfaHlwZXJfbXNfaHlwZXJ2LAogI2lmZGVmIENPTkZJR19YRU5fUFZIVk0KIAkmeDg2X2h5cGVyX3hlbl9odm0sCiAjZW5kaWYKKwkmeDg2X2h5cGVyX3Ztd2FyZSwKKwkmeDg2X2h5cGVyX21zX2h5cGVydiwKIH07CiAKIGNvbnN0IHN0cnVjdCBoeXBlcnZpc29yX3g4NiAqeDg2X2h5cGVyOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCmluZGV4IDFlZGY1YmEuLmVkNjA4NmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKQEAgLTQ1Niw2ICs0NTYsMjQgQEAKIAogCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1ZNWCkpCiAJCWRldGVjdF92bXhfdmlydGNhcChjKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBNU1JfSUEzMl9FTkVSR1lfUEVSRl9CSUFTIGlmIEJJT1MgZGlkIG5vdC4KKwkgKiB4ODZfZW5lcmd5X3BlcmZfcG9saWN5KDgpIGlzIGF2YWlsYWJsZSB0byBjaGFuZ2UgaXQgYXQgcnVuLXRpbWUKKwkgKi8KKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FUEIpKSB7CisJCXU2NCBlcGI7CisKKwkJcmRtc3JsKE1TUl9JQTMyX0VORVJHWV9QRVJGX0JJQVMsIGVwYik7CisJCWlmICgoZXBiICYgMHhGKSA9PSBFTkVSR1lfUEVSRl9CSUFTX1BFUkZPUk1BTkNFKSB7CisJCQlwcmludGtfb25jZShLRVJOX1dBUk5JTkcgIkVORVJHWV9QRVJGX0JJQVM6IgorCQkJCSIgU2V0IHRvICdub3JtYWwnLCB3YXMgJ3BlcmZvcm1hbmNlJ1xuIgorCQkJCSJFTkVSR1lfUEVSRl9CSUFTOiBWaWV3IGFuZCB1cGRhdGUgd2l0aCIKKwkJCQkiIHg4Nl9lbmVyZ3lfcGVyZl9wb2xpY3koOClcbiIpOworCQkJZXBiID0gKGVwYiAmIH4weEYpIHwgRU5FUkdZX1BFUkZfQklBU19OT1JNQUw7CisJCQl3cm1zcmwoTVNSX0lBMzJfRU5FUkdZX1BFUkZfQklBUywgZXBiKTsKKwkJfQorCX0KIH0KIAogI2lmZGVmIENPTkZJR19YODZfMzIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1zZXZlcml0eS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLXNldmVyaXR5LmMKaW5kZXggMWU4ZDY2Yy4uNzM5NWQ1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLXNldmVyaXR5LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLXNldmVyaXR5LmMKQEAgLTQzLDYxICs0MywxMDUgQEAKIAl1bnNpZ25lZCBjaGFyIGNvdmVyZWQ7CiAJY2hhciAqbXNnOwogfSBzZXZlcml0aWVzW10gPSB7Ci0jZGVmaW5lIEtFUk5FTCAuY29udGV4dCA9IElOX0tFUk5FTAotI2RlZmluZSBVU0VSIC5jb250ZXh0ID0gSU5fVVNFUgotI2RlZmluZSBTRVIgLnNlciA9IFNFUl9SRVFVSVJFRAotI2RlZmluZSBOT1NFUiAuc2VyID0gTk9fU0VSCi0jZGVmaW5lIFNFVihzKSAuc2V2ID0gTUNFXyAjIyBzICMjIF9TRVZFUklUWQotI2RlZmluZSBCSVRDTFIoeCwgcywgbSwgci4uLikgeyAubWFzayA9IHgsIC5yZXN1bHQgPSAwLCBTRVYocyksIC5tc2cgPSBtLCAjIyByIH0KLSNkZWZpbmUgQklUU0VUKHgsIHMsIG0sIHIuLi4pIHsgLm1hc2sgPSB4LCAucmVzdWx0ID0geCwgU0VWKHMpLCAubXNnID0gbSwgIyMgciB9Ci0jZGVmaW5lIE1DR01BU0soeCwgcmVzLCBzLCBtLCByLi4uKSBcCi0JeyAubWNnbWFzayA9IHgsIC5tY2dyZXMgPSByZXMsIFNFVihzKSwgLm1zZyA9IG0sICMjIHIgfQotI2RlZmluZSBNQVNLKHgsIHksIHMsIG0sIHIuLi4pIFwKLQl7IC5tYXNrID0geCwgLnJlc3VsdCA9IHksIFNFVihzKSwgLm1zZyA9IG0sICMjIHIgfQorI2RlZmluZSBNQ0VTRVYocywgbSwgYy4uLikgeyAuc2V2ID0gTUNFXyAjIyBzICMjIF9TRVZFUklUWSwgLm1zZyA9IG0sICMjIGMgfQorI2RlZmluZSAgS0VSTkVMCQkuY29udGV4dCA9IElOX0tFUk5FTAorI2RlZmluZSAgVVNFUgkJLmNvbnRleHQgPSBJTl9VU0VSCisjZGVmaW5lICBTRVIJCS5zZXIgPSBTRVJfUkVRVUlSRUQKKyNkZWZpbmUgIE5PU0VSCQkuc2VyID0gTk9fU0VSCisjZGVmaW5lICBCSVRDTFIoeCkJLm1hc2sgPSB4LCAucmVzdWx0ID0gMAorI2RlZmluZSAgQklUU0VUKHgpCS5tYXNrID0geCwgLnJlc3VsdCA9IHgKKyNkZWZpbmUgIE1DR01BU0soeCwgeSkJLm1jZ21hc2sgPSB4LCAubWNncmVzID0geQorI2RlZmluZSAgTUFTSyh4LCB5KQkubWFzayA9IHgsIC5yZXN1bHQgPSB5CiAjZGVmaW5lIE1DSV9VQ19TIChNQ0lfU1RBVFVTX1VDfE1DSV9TVEFUVVNfUykKICNkZWZpbmUgTUNJX1VDX1NBUiAoTUNJX1NUQVRVU19VQ3xNQ0lfU1RBVFVTX1N8TUNJX1NUQVRVU19BUikKICNkZWZpbmUgTUNBQ09EIDB4ZmZmZgogCi0JQklUQ0xSKE1DSV9TVEFUVVNfVkFMLCBOTywgIkludmFsaWQiKSwKLQlCSVRDTFIoTUNJX1NUQVRVU19FTiwgTk8sICJOb3QgZW5hYmxlZCIpLAotCUJJVFNFVChNQ0lfU1RBVFVTX1BDQywgUEFOSUMsICJQcm9jZXNzb3IgY29udGV4dCBjb3JydXB0IiksCisJTUNFU0VWKAorCQlOTywgIkludmFsaWQiLAorCQlCSVRDTFIoTUNJX1NUQVRVU19WQUwpCisJCSksCisJTUNFU0VWKAorCQlOTywgIk5vdCBlbmFibGVkIiwKKwkJQklUQ0xSKE1DSV9TVEFUVVNfRU4pCisJCSksCisJTUNFU0VWKAorCQlQQU5JQywgIlByb2Nlc3NvciBjb250ZXh0IGNvcnJ1cHQiLAorCQlCSVRTRVQoTUNJX1NUQVRVU19QQ0MpCisJCSksCiAJLyogV2hlbiBNQ0lQIGlzIG5vdCBzZXQgc29tZXRoaW5nIGlzIHZlcnkgY29uZnVzZWQgKi8KLQlNQ0dNQVNLKE1DR19TVEFUVVNfTUNJUCwgMCwgUEFOSUMsICJNQ0lQIG5vdCBzZXQgaW4gTUNBIGhhbmRsZXIiKSwKKwlNQ0VTRVYoCisJCVBBTklDLCAiTUNJUCBub3Qgc2V0IGluIE1DQSBoYW5kbGVyIiwKKwkJTUNHTUFTSyhNQ0dfU1RBVFVTX01DSVAsIDApCisJCSksCiAJLyogTmVpdGhlciByZXR1cm4gbm90IGVycm9yIElQIC0tIG5vIGNoYW5jZSB0byByZWNvdmVyIC0+IFBBTklDICovCi0JTUNHTUFTSyhNQ0dfU1RBVFVTX1JJUFZ8TUNHX1NUQVRVU19FSVBWLCAwLCBQQU5JQywKLQkJIk5laXRoZXIgcmVzdGFydCBub3IgZXJyb3IgSVAiKSwKLQlNQ0dNQVNLKE1DR19TVEFUVVNfUklQViwgMCwgUEFOSUMsICJJbiBrZXJuZWwgYW5kIG5vIHJlc3RhcnQgSVAiLAotCQlLRVJORUwpLAotCUJJVENMUihNQ0lfU1RBVFVTX1VDLCBLRUVQLCAiQ29ycmVjdGVkIGVycm9yIiwgTk9TRVIpLAotCU1BU0soTUNJX1NUQVRVU19PVkVSfE1DSV9TVEFUVVNfVUN8TUNJX1NUQVRVU19FTiwgTUNJX1NUQVRVU19VQywgU09NRSwKLQkgICAgICJTcHVyaW91cyBub3QgZW5hYmxlZCIsIFNFUiksCisJTUNFU0VWKAorCQlQQU5JQywgIk5laXRoZXIgcmVzdGFydCBub3IgZXJyb3IgSVAiLAorCQlNQ0dNQVNLKE1DR19TVEFUVVNfUklQVnxNQ0dfU1RBVFVTX0VJUFYsIDApCisJCSksCisJTUNFU0VWKAorCQlQQU5JQywgIkluIGtlcm5lbCBhbmQgbm8gcmVzdGFydCBJUCIsCisJCUtFUk5FTCwgTUNHTUFTSyhNQ0dfU1RBVFVTX1JJUFYsIDApCisJCSksCisJTUNFU0VWKAorCQlLRUVQLCAiQ29ycmVjdGVkIGVycm9yIiwKKwkJTk9TRVIsIEJJVENMUihNQ0lfU1RBVFVTX1VDKQorCQkpLAogCiAJLyogaWdub3JlIE9WRVIgZm9yIFVDTkEgKi8KLQlNQVNLKE1DSV9VQ19TQVIsIE1DSV9TVEFUVVNfVUMsIEtFRVAsCi0JICAgICAiVW5jb3JyZWN0ZWQgbm8gYWN0aW9uIHJlcXVpcmVkIiwgU0VSKSwKLQlNQVNLKE1DSV9TVEFUVVNfT1ZFUnxNQ0lfVUNfU0FSLCBNQ0lfU1RBVFVTX1VDfE1DSV9TVEFUVVNfQVIsIFBBTklDLAotCSAgICAgIklsbGVnYWwgY29tYmluYXRpb24gKFVDTkEgd2l0aCBBUj0xKSIsIFNFUiksCi0JTUFTSyhNQ0lfU1RBVFVTX1MsIDAsIEtFRVAsICJOb24gc2lnbmFsbGVkIG1hY2hpbmUgY2hlY2siLCBTRVIpLAorCU1DRVNFVigKKwkJS0VFUCwgIlVuY29ycmVjdGVkIG5vIGFjdGlvbiByZXF1aXJlZCIsCisJCVNFUiwgTUFTSyhNQ0lfVUNfU0FSLCBNQ0lfU1RBVFVTX1VDKQorCQkpLAorCU1DRVNFVigKKwkJUEFOSUMsICJJbGxlZ2FsIGNvbWJpbmF0aW9uIChVQ05BIHdpdGggQVI9MSkiLAorCQlTRVIsCisJCU1BU0soTUNJX1NUQVRVU19PVkVSfE1DSV9VQ19TQVIsIE1DSV9TVEFUVVNfVUN8TUNJX1NUQVRVU19BUikKKwkJKSwKKwlNQ0VTRVYoCisJCUtFRVAsICJOb24gc2lnbmFsbGVkIG1hY2hpbmUgY2hlY2siLAorCQlTRVIsIEJJVENMUihNQ0lfU1RBVFVTX1MpCisJCSksCiAKIAkvKiBBUiBhZGQga25vd24gTUNBQ09EcyBoZXJlICovCi0JTUFTSyhNQ0lfU1RBVFVTX09WRVJ8TUNJX1VDX1NBUiwgTUNJX1NUQVRVU19PVkVSfE1DSV9VQ19TQVIsIFBBTklDLAotCSAgICAgIkFjdGlvbiByZXF1aXJlZCB3aXRoIGxvc3QgZXZlbnRzIiwgU0VSKSwKLQlNQVNLKE1DSV9TVEFUVVNfT1ZFUnxNQ0lfVUNfU0FSfE1DQUNPRCwgTUNJX1VDX1NBUiwgUEFOSUMsCi0JICAgICAiQWN0aW9uIHJlcXVpcmVkOyB1bmtub3duIE1DQUNPRCIsIFNFUiksCisJTUNFU0VWKAorCQlQQU5JQywgIkFjdGlvbiByZXF1aXJlZCB3aXRoIGxvc3QgZXZlbnRzIiwKKwkJU0VSLCBCSVRTRVQoTUNJX1NUQVRVU19PVkVSfE1DSV9VQ19TQVIpCisJCSksCisJTUNFU0VWKAorCQlQQU5JQywgIkFjdGlvbiByZXF1aXJlZDogdW5rbm93biBNQ0FDT0QiLAorCQlTRVIsIE1BU0soTUNJX1NUQVRVU19PVkVSfE1DSV9VQ19TQVIsIE1DSV9VQ19TQVIpCisJCSksCiAKIAkvKiBrbm93biBBTyBNQ0FDT0RzOiAqLwotCU1BU0soTUNJX1VDX1NBUnxNQ0lfU1RBVFVTX09WRVJ8MHhmZmYwLCBNQ0lfVUNfU3wweGMwLCBBTywKLQkgICAgICJBY3Rpb24gb3B0aW9uYWw6IG1lbW9yeSBzY3J1YmJpbmcgZXJyb3IiLCBTRVIpLAotCU1BU0soTUNJX1VDX1NBUnxNQ0lfU1RBVFVTX09WRVJ8TUNBQ09ELCBNQ0lfVUNfU3wweDE3YSwgQU8sCi0JICAgICAiQWN0aW9uIG9wdGlvbmFsOiBsYXN0IGxldmVsIGNhY2hlIHdyaXRlYmFjayBlcnJvciIsIFNFUiksCisJTUNFU0VWKAorCQlBTywgIkFjdGlvbiBvcHRpb25hbDogbWVtb3J5IHNjcnViYmluZyBlcnJvciIsCisJCVNFUiwgTUFTSyhNQ0lfU1RBVFVTX09WRVJ8TUNJX1VDX1NBUnwweGZmZjAsIE1DSV9VQ19TfDB4MDBjMCkKKwkJKSwKKwlNQ0VTRVYoCisJCUFPLCAiQWN0aW9uIG9wdGlvbmFsOiBsYXN0IGxldmVsIGNhY2hlIHdyaXRlYmFjayBlcnJvciIsCisJCVNFUiwgTUFTSyhNQ0lfU1RBVFVTX09WRVJ8TUNJX1VDX1NBUnxNQ0FDT0QsIE1DSV9VQ19TfDB4MDE3YSkKKwkJKSwKKwlNQ0VTRVYoCisJCVNPTUUsICJBY3Rpb24gb3B0aW9uYWw6IHVua25vd24gTUNBQ09EIiwKKwkJU0VSLCBNQVNLKE1DSV9TVEFUVVNfT1ZFUnxNQ0lfVUNfU0FSLCBNQ0lfVUNfUykKKwkJKSwKKwlNQ0VTRVYoCisJCVNPTUUsICJBY3Rpb24gb3B0aW9uYWwgd2l0aCBsb3N0IGV2ZW50cyIsCisJCVNFUiwgTUFTSyhNQ0lfU1RBVFVTX09WRVJ8TUNJX1VDX1NBUiwgTUNJX1NUQVRVU19PVkVSfE1DSV9VQ19TKQorCQkpLAogCi0JTUFTSyhNQ0lfU1RBVFVTX09WRVJ8TUNJX1VDX1NBUiwgTUNJX1VDX1MsIFNPTUUsCi0JICAgICAiQWN0aW9uIG9wdGlvbmFsIHVua25vd24gTUNBQ09EIiwgU0VSKSwKLQlNQVNLKE1DSV9TVEFUVVNfT1ZFUnxNQ0lfVUNfU0FSLCBNQ0lfVUNfU3xNQ0lfU1RBVFVTX09WRVIsIFNPTUUsCi0JICAgICAiQWN0aW9uIG9wdGlvbmFsIHdpdGggbG9zdCBldmVudHMiLCBTRVIpLAotCUJJVFNFVChNQ0lfU1RBVFVTX1VDfE1DSV9TVEFUVVNfT1ZFUiwgUEFOSUMsICJPdmVyZmxvd2VkIHVuY29ycmVjdGVkIiksCi0JQklUU0VUKE1DSV9TVEFUVVNfVUMsIFVDLCAiVW5jb3JyZWN0ZWQiKSwKLQlCSVRTRVQoMCwgU09NRSwgIk5vIG1hdGNoIikJLyogYWx3YXlzIG1hdGNoZXMuIGtlZXAgYXQgZW5kICovCisJTUNFU0VWKAorCQlQQU5JQywgIk92ZXJmbG93ZWQgdW5jb3JyZWN0ZWQiLAorCQlCSVRTRVQoTUNJX1NUQVRVU19PVkVSfE1DSV9TVEFUVVNfVUMpCisJCSksCisJTUNFU0VWKAorCQlVQywgIlVuY29ycmVjdGVkIiwKKwkJQklUU0VUKE1DSV9TVEFUVVNfVUMpCisJCSksCisJTUNFU0VWKAorCQlTT01FLCAiTm8gbWF0Y2giLAorCQlCSVRTRVQoMCkKKwkJKQkvKiBhbHdheXMgbWF0Y2hlcy4ga2VlcCBhdCBlbmQgKi8KIH07CiAKIC8qCkBAIC0xMTIsMTUgKzE1NiwxNSBAQAogCXJldHVybiBJTl9LRVJORUw7CiB9CiAKLWludCBtY2Vfc2V2ZXJpdHkoc3RydWN0IG1jZSAqYSwgaW50IHRvbGVyYW50LCBjaGFyICoqbXNnKQoraW50IG1jZV9zZXZlcml0eShzdHJ1Y3QgbWNlICptLCBpbnQgdG9sZXJhbnQsIGNoYXIgKiptc2cpCiB7Ci0JZW51bSBjb250ZXh0IGN0eCA9IGVycm9yX2NvbnRleHQoYSk7CisJZW51bSBjb250ZXh0IGN0eCA9IGVycm9yX2NvbnRleHQobSk7CiAJc3RydWN0IHNldmVyaXR5ICpzOwogCiAJZm9yIChzID0gc2V2ZXJpdGllczs7IHMrKykgewotCQlpZiAoKGEtPnN0YXR1cyAmIHMtPm1hc2spICE9IHMtPnJlc3VsdCkKKwkJaWYgKChtLT5zdGF0dXMgJiBzLT5tYXNrKSAhPSBzLT5yZXN1bHQpCiAJCQljb250aW51ZTsKLQkJaWYgKChhLT5tY2dzdGF0dXMgJiBzLT5tY2dtYXNrKSAhPSBzLT5tY2dyZXMpCisJCWlmICgobS0+bWNnc3RhdHVzICYgcy0+bWNnbWFzaykgIT0gcy0+bWNncmVzKQogCQkJY29udGludWU7CiAJCWlmIChzLT5zZXIgPT0gU0VSX1JFUVVJUkVEICYmICFtY2Vfc2VyKQogCQkJY29udGludWU7CkBAIC0xOTcsMTUgKzI0MSwxNSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzZXZlcml0aWVzX2RlYnVnZnNfaW5pdCh2b2lkKQogewotCXN0cnVjdCBkZW50cnkgKmRtY2UgPSBOVUxMLCAqZnNldmVyaXRpZXNfY292ZXJhZ2UgPSBOVUxMOworCXN0cnVjdCBkZW50cnkgKmRtY2UsICpmc2V2OwogCiAJZG1jZSA9IG1jZV9nZXRfZGVidWdmc19kaXIoKTsKLQlpZiAoZG1jZSA9PSBOVUxMKQorCWlmICghZG1jZSkKIAkJZ290byBlcnJfb3V0OwotCWZzZXZlcml0aWVzX2NvdmVyYWdlID0gZGVidWdmc19jcmVhdGVfZmlsZSgic2V2ZXJpdGllcy1jb3ZlcmFnZSIsCi0JCQkJCQkgICAwNDQ0LCBkbWNlLCBOVUxMLAotCQkJCQkJICAgJnNldmVyaXRpZXNfY292ZXJhZ2VfZm9wcyk7Ci0JaWYgKGZzZXZlcml0aWVzX2NvdmVyYWdlID09IE5VTEwpCisKKwlmc2V2ID0gZGVidWdmc19jcmVhdGVfZmlsZSgic2V2ZXJpdGllcy1jb3ZlcmFnZSIsIDA0NDQsIGRtY2UsIE5VTEwsCisJCQkJICAgJnNldmVyaXRpZXNfY292ZXJhZ2VfZm9wcyk7CisJaWYgKCFmc2V2KQogCQlnb3RvIGVycl9vdXQ7CiAKIAlyZXR1cm4gMDsKQEAgLTIxNCw0ICsyNTgsNCBAQAogCXJldHVybiAtRU5PTUVNOwogfQogbGF0ZV9pbml0Y2FsbChzZXZlcml0aWVzX2RlYnVnZnNfaW5pdCk7Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKaW5kZXggZmYxYWU5Yi4uMDgzNjNiMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgpAQCAtMzgsMjMgKzM3LDIwIEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZWRhY19tY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFfd29yay5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9pZGxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lwaS5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KICNpbmNsdWRlIDxhc20vbXNyLmg+CiAKICNpbmNsdWRlICJtY2UtaW50ZXJuYWwuaCIKIAotc3RhdGljIERFRklORV9NVVRFWChtY2VfcmVhZF9tdXRleCk7CitzdGF0aWMgREVGSU5FX01VVEVYKG1jZV9jaHJkZXZfcmVhZF9tdXRleCk7CiAKICNkZWZpbmUgcmN1X2RlcmVmZXJlbmNlX2NoZWNrX21jZShwKSBcCiAJcmN1X2RlcmVmZXJlbmNlX2luZGV4X2NoZWNrKChwKSwgXAogCQkJICAgICAgcmN1X3JlYWRfbG9ja19zY2hlZF9oZWxkKCkgfHwgXAotCQkJICAgICAgbG9ja2RlcF9pc19oZWxkKCZtY2VfcmVhZF9tdXRleCkpCisJCQkgICAgICBsb2NrZGVwX2lzX2hlbGQoJm1jZV9jaHJkZXZfcmVhZF9tdXRleCkpCiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9tY2UuaD4KQEAgLTk0LDcgKzkwLDggQEAKIHN0YXRpYyBjaGFyCQkJbWNlX2hlbHBlclsxMjhdOwogc3RhdGljIGNoYXIJCQkqbWNlX2hlbHBlcl9hcmd2WzJdID0geyBtY2VfaGVscGVyLCBOVUxMIH07CiAKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChtY2Vfd2FpdCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobWNlX2NocmRldl93YWl0KTsKKwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBtY2UsIG1jZXNfc2Vlbik7CiBzdGF0aWMgaW50CQkJY3B1X21pc3Npbmc7CiAKQEAgLTM3Myw2ICszNzAsMzEgQEAKIH0KIAogLyoKKyAqIENvbGxlY3QgYWxsIGdsb2JhbCAody5yLnQuIHRoaXMgcHJvY2Vzc29yKSBzdGF0dXMgYWJvdXQgdGhpcyBtYWNoaW5lCisgKiBjaGVjayBpbnRvIG91ciAibWNlIiBzdHJ1Y3Qgc28gdGhhdCB3ZSBjYW4gdXNlIGl0IGxhdGVyIHRvIGFzc2VzcworICogdGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtIGFzIHdlIHJlYWQgcGVyLWJhbmsgc3BlY2lmaWMgZGV0YWlscy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1jZV9nYXRoZXJfaW5mbyhzdHJ1Y3QgbWNlICptLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwltY2Vfc2V0dXAobSk7CisKKwltLT5tY2dzdGF0dXMgPSBtY2VfcmRtc3JsKE1TUl9JQTMyX01DR19TVEFUVVMpOworCWlmIChyZWdzKSB7CisJCS8qCisJCSAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXQgdGhlIHRpbWUgb2YKKwkJICogdGhlIG1hY2hpbmUgY2hlY2sgZXJyb3IuCisJCSAqLworCQlpZiAobS0+bWNnc3RhdHVzICYgKE1DR19TVEFUVVNfUklQVnxNQ0dfU1RBVFVTX0VJUFYpKSB7CisJCQltLT5pcCA9IHJlZ3MtPmlwOworCQkJbS0+Y3MgPSByZWdzLT5jczsKKwkJfQorCQkvKiBVc2UgYWNjdXJhdGUgUklQIHJlcG9ydGluZyBpZiBhdmFpbGFibGUuICovCisJCWlmIChyaXBfbXNyKQorCQkJbS0+aXAgPSBtY2VfcmRtc3JsKHJpcF9tc3IpOworCX0KK30KKworLyoKICAqIFNpbXBsZSBsb2NrbGVzcyByaW5nIHRvIGNvbW11bmljYXRlIFBGTnMgZnJvbSB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgd2l0aCB0aGUKICAqIHByb2Nlc3MgY29udGV4dCB3b3JrIGZ1bmN0aW9uLiBUaGlzIGlzIHZhc3RseSBzaW1wbGlmaWVkIGJlY2F1c2UgdGhlcmUncwogICogb25seSBhIHNpbmdsZSByZWFkZXIgYW5kIGEgc2luZ2xlIHdyaXRlci4KQEAgLTQ0Myw0MCArNDY1LDEzIEBACiAJfQogfQogCi0vKgotICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiBhdCB0aGUgdGltZSBvZiB0aGUgbWFjaGluZSBjaGVjawotICogZXJyb3IuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBtY2VfZ2V0X3JpcChzdHJ1Y3QgbWNlICptLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBpcnFfd29yaywgbWNlX2lycV93b3JrKTsKIAotCWlmIChyZWdzICYmIChtLT5tY2dzdGF0dXMgJiAoTUNHX1NUQVRVU19SSVBWfE1DR19TVEFUVVNfRUlQVikpKSB7Ci0JCW0tPmlwID0gcmVncy0+aXA7Ci0JCW0tPmNzID0gcmVncy0+Y3M7Ci0JfSBlbHNlIHsKLQkJbS0+aXAgPSAwOwotCQltLT5jcyA9IDA7Ci0JfQotCWlmIChyaXBfbXNyKQotCQltLT5pcCA9IG1jZV9yZG1zcmwocmlwX21zcik7Ci19Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKLS8qCi0gKiBDYWxsZWQgYWZ0ZXIgaW50ZXJydXB0cyBoYXZlIGJlZW4gcmVlbmFibGVkIGFnYWluCi0gKiB3aGVuIGEgTUNFIGhhcHBlbmVkIGR1cmluZyBhbiBpbnRlcnJ1cHRzIG9mZiByZWdpb24KLSAqIGluIHRoZSBrZXJuZWwuCi0gKi8KLWFzbWxpbmthZ2Ugdm9pZCBzbXBfbWNlX3NlbGZfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgbWNlX2lycV93b3JrX2NiKHN0cnVjdCBpcnFfd29yayAqZW50cnkpCiB7Ci0JYWNrX0FQSUNfaXJxKCk7Ci0JZXhpdF9pZGxlKCk7Ci0JaXJxX2VudGVyKCk7CiAJbWNlX25vdGlmeV9pcnEoKTsKIAltY2Vfc2NoZWR1bGVfd29yaygpOwotCWlycV9leGl0KCk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIHZvaWQgbWNlX3JlcG9ydF9ldmVudChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTQ5MiwyOSArNDg3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCS8qCi0JICogV2l0aG91dCBBUElDIGRvIG5vdCBub3RpZnkuIFRoZSBldmVudCB3aWxsIGJlIHBpY2tlZAotCSAqIHVwIGV2ZW50dWFsbHkuCi0JICovCi0JaWYgKCFjcHVfaGFzX2FwaWMpCi0JCXJldHVybjsKLQotCS8qCi0JICogV2hlbiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCB3ZSBjYW5ub3QgdXNlCi0JICoga2VybmVsIHNlcnZpY2VzIHNhZmVseS4gVHJpZ2dlciBhbiBzZWxmIGludGVycnVwdAotCSAqIHRocm91Z2ggdGhlIEFQSUMgdG8gaW5zdGVhZCBkbyB0aGUgbm90aWZpY2F0aW9uCi0JICogYWZ0ZXIgaW50ZXJydXB0cyBhcmUgcmVlbmFibGVkIGFnYWluLgotCSAqLwotCWFwaWMtPnNlbmRfSVBJX3NlbGYoTUNFX1NFTEZfVkVDVE9SKTsKLQotCS8qCi0JICogV2FpdCBmb3IgaWRsZSBhZnRlcndhcmRzIGFnYWluIHNvIHRoYXQgd2UgZG9uJ3QgbGVhdmUgdGhlCi0JICogQVBJQyBpbiBhIG5vbiBpZGxlIHN0YXRlIGJlY2F1c2UgdGhlIG5vcm1hbCBBUElDIHdyaXRlcwotCSAqIGNhbm5vdCBleGNsdWRlIHVzLgotCSAqLwotCWFwaWNfd2FpdF9pY3JfaWRsZSgpOwotI2VuZGlmCisJaXJxX3dvcmtfcXVldWUoJl9fZ2V0X2NwdV92YXIobWNlX2lycV93b3JrKSk7CiB9CiAKIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkLCBtY2VfcG9sbF9jb3VudCk7CkBAIC01NDEsOSArNTE0LDggQEAKIAogCXBlcmNwdV9pbmMobWNlX3BvbGxfY291bnQpOwogCi0JbWNlX3NldHVwKCZtKTsKKwltY2VfZ2F0aGVyX2luZm8oJm0sIE5VTEwpOwogCi0JbS5tY2dzdGF0dXMgPSBtY2VfcmRtc3JsKE1TUl9JQTMyX01DR19TVEFUVVMpOwogCWZvciAoaSA9IDA7IGkgPCBiYW5rczsgaSsrKSB7CiAJCWlmICghbWNlX2JhbmtzW2ldLmN0bCB8fCAhdGVzdF9iaXQoaSwgKmIpKQogCQkJY29udGludWU7CkBAIC04NzksOSArODUxLDkgQEAKIHsKIAlpZiAoIShtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX01JU0NWKSB8fCAhKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfQUREUlYpKQogCQlyZXR1cm4gMDsKLQlpZiAoKG0tPm1pc2MgJiAweDNmKSA+IFBBR0VfU0hJRlQpCisJaWYgKE1DSV9NSVNDX0FERFJfTFNCKG0tPm1pc2MpID4gUEFHRV9TSElGVCkKIAkJcmV0dXJuIDA7Ci0JaWYgKCgobS0+bWlzYyA+PiA2KSAmIDcpICE9IE1DTV9BRERSX1BIWVMpCisJaWYgKE1DSV9NSVNDX0FERFJfTU9ERShtLT5taXNjKSAhPSBNQ0lfTUlTQ19BRERSX1BIWVMpCiAJCXJldHVybiAwOwogCXJldHVybiAxOwogfQpAQCAtOTQyLDkgKzkxNCw4IEBACiAJaWYgKCFiYW5rcykKIAkJZ290byBvdXQ7CiAKLQltY2Vfc2V0dXAoJm0pOworCW1jZV9nYXRoZXJfaW5mbygmbSwgcmVncyk7CiAKLQltLm1jZ3N0YXR1cyA9IG1jZV9yZG1zcmwoTVNSX0lBMzJfTUNHX1NUQVRVUyk7CiAJZmluYWwgPSAmX19nZXRfY3B1X3ZhcihtY2VzX3NlZW4pOwogCSpmaW5hbCA9IG07CiAKQEAgLTEwMjgsNyArOTk5LDYgQEAKIAkJaWYgKHNldmVyaXR5ID09IE1DRV9BT19TRVZFUklUWSAmJiBtY2VfdXNhYmxlX2FkZHJlc3MoJm0pKQogCQkJbWNlX3JpbmdfYWRkKG0uYWRkciA+PiBQQUdFX1NISUZUKTsKIAotCQltY2VfZ2V0X3JpcCgmbSwgcmVncyk7CiAJCW1jZV9sb2coJm0pOwogCiAJCWlmIChzZXZlcml0eSA+IHdvcnN0KSB7CkBAIC0xMTkwLDcgKzExNjAsOCBAQAogCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9NQ0VfTk9USUZZKTsKIAogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJm1jZV9uZWVkX25vdGlmeSkpIHsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtY2Vfd2FpdCk7CisJCS8qIHdha2UgcHJvY2Vzc2VzIHBvbGxpbmcgL2Rldi9tY2Vsb2cgKi8KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtY2VfY2hyZGV2X3dhaXQpOwogCiAJCS8qCiAJCSAqIFRoZXJlIGlzIG5vIHJpc2sgb2YgbWlzc2luZyBub3RpZmljYXRpb25zIGJlY2F1c2UKQEAgLTEzNjMsMTggKzEzMzQsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19jcHVpbml0IF9fbWNoZWNrX2NwdV9hbmNpZW50X2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQorc3RhdGljIGludCBfX2NwdWluaXQgX19tY2hlY2tfY3B1X2FuY2llbnRfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJaWYgKGMtPng4NiAhPSA1KQotCQlyZXR1cm47CisJCXJldHVybiAwOworCiAJc3dpdGNoIChjLT54ODZfdmVuZG9yKSB7CiAJY2FzZSBYODZfVkVORE9SX0lOVEVMOgogCQlpbnRlbF9wNV9tY2hlY2tfaW5pdChjKTsKKwkJcmV0dXJuIDE7CiAJCWJyZWFrOwogCWNhc2UgWDg2X1ZFTkRPUl9DRU5UQVVSOgogCQl3aW5jaGlwX21jaGVja19pbml0KGMpOworCQlyZXR1cm4gMTsKIAkJYnJlYWs7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fbWNoZWNrX2NwdV9pbml0X3ZlbmRvcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCkBAIC0xNDI4LDcgKzE0MDQsOCBAQAogCWlmIChtY2VfZGlzYWJsZWQpCiAJCXJldHVybjsKIAotCV9fbWNoZWNrX2NwdV9hbmNpZW50X2luaXQoYyk7CisJaWYgKF9fbWNoZWNrX2NwdV9hbmNpZW50X2luaXQoYykpCisJCXJldHVybjsKIAogCWlmICghbWNlX2F2YWlsYWJsZShjKSkKIAkJcmV0dXJuOwpAQCAtMTQ0NCw0NCArMTQyMSw0NSBAQAogCV9fbWNoZWNrX2NwdV9pbml0X3ZlbmRvcihjKTsKIAlfX21jaGVja19jcHVfaW5pdF90aW1lcigpOwogCUlOSVRfV09SSygmX19nZXRfY3B1X3ZhcihtY2Vfd29yayksIG1jZV9wcm9jZXNzX3dvcmspOwotCisJaW5pdF9pcnFfd29yaygmX19nZXRfY3B1X3ZhcihtY2VfaXJxX3dvcmspLCAmbWNlX2lycV93b3JrX2NiKTsKIH0KIAogLyoKLSAqIENoYXJhY3RlciBkZXZpY2UgdG8gcmVhZCBhbmQgY2xlYXIgdGhlIE1DRSBsb2cuCisgKiBtY2VfY2hyZGV2OiBDaGFyYWN0ZXIgZGV2aWNlIC9kZXYvbWNlbG9nIHRvIHJlYWQgYW5kIGNsZWFyIHRoZSBNQ0UgbG9nLgogICovCiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWNlX3N0YXRlX2xvY2spOwotc3RhdGljIGludAkJb3Blbl9jb3VudDsJCS8qICN0aW1lcyBvcGVuZWQgKi8KLXN0YXRpYyBpbnQJCW9wZW5fZXhjbHU7CQkvKiBhbHJlYWR5IG9wZW4gZXhjbHVzaXZlPyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhtY2VfY2hyZGV2X3N0YXRlX2xvY2spOworc3RhdGljIGludCBtY2VfY2hyZGV2X29wZW5fY291bnQ7CS8qICN0aW1lcyBvcGVuZWQgKi8KK3N0YXRpYyBpbnQgbWNlX2NocmRldl9vcGVuX2V4Y2x1OwkvKiBhbHJlYWR5IG9wZW4gZXhjbHVzaXZlPyAqLwogCi1zdGF0aWMgaW50IG1jZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBtY2VfY2hyZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3Bpbl9sb2NrKCZtY2Vfc3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrKCZtY2VfY2hyZGV2X3N0YXRlX2xvY2spOwogCi0JaWYgKG9wZW5fZXhjbHUgfHwgKG9wZW5fY291bnQgJiYgKGZpbGUtPmZfZmxhZ3MgJiBPX0VYQ0wpKSkgewotCQlzcGluX3VubG9jaygmbWNlX3N0YXRlX2xvY2spOworCWlmIChtY2VfY2hyZGV2X29wZW5fZXhjbHUgfHwKKwkgICAgKG1jZV9jaHJkZXZfb3Blbl9jb3VudCAmJiAoZmlsZS0+Zl9mbGFncyAmIE9fRVhDTCkpKSB7CisJCXNwaW5fdW5sb2NrKCZtY2VfY2hyZGV2X3N0YXRlX2xvY2spOwogCiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0VYQ0wpCi0JCW9wZW5fZXhjbHUgPSAxOwotCW9wZW5fY291bnQrKzsKKwkJbWNlX2NocmRldl9vcGVuX2V4Y2x1ID0gMTsKKwltY2VfY2hyZGV2X29wZW5fY291bnQrKzsKIAotCXNwaW5fdW5sb2NrKCZtY2Vfc3RhdGVfbG9jayk7CisJc3Bpbl91bmxvY2soJm1jZV9jaHJkZXZfc3RhdGVfbG9jayk7CiAKIAlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiB9CiAKLXN0YXRpYyBpbnQgbWNlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IG1jZV9jaHJkZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzcGluX2xvY2soJm1jZV9zdGF0ZV9sb2NrKTsKKwlzcGluX2xvY2soJm1jZV9jaHJkZXZfc3RhdGVfbG9jayk7CiAKLQlvcGVuX2NvdW50LS07Ci0Jb3Blbl9leGNsdSA9IDA7CisJbWNlX2NocmRldl9vcGVuX2NvdW50LS07CisJbWNlX2NocmRldl9vcGVuX2V4Y2x1ID0gMDsKIAotCXNwaW5fdW5sb2NrKCZtY2Vfc3RhdGVfbG9jayk7CisJc3Bpbl91bmxvY2soJm1jZV9jaHJkZXZfc3RhdGVfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MzAsOCArMTUwOCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IG1jZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IHVzaXplLAotCQkJbG9mZl90ICpvZmYpCitzdGF0aWMgc3NpemVfdCBtY2VfY2hyZGV2X3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1YnVmLAorCQkJCXNpemVfdCB1c2l6ZSwgbG9mZl90ICpvZmYpCiB7CiAJY2hhciBfX3VzZXIgKmJ1ZiA9IHVidWY7CiAJdW5zaWduZWQgbG9uZyAqY3B1X3RzYzsKQEAgLTE1NDIsNyArMTUyMCw3IEBACiAJaWYgKCFjcHVfdHNjKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW11dGV4X2xvY2soJm1jZV9yZWFkX211dGV4KTsKKwltdXRleF9sb2NrKCZtY2VfY2hyZGV2X3JlYWRfbXV0ZXgpOwogCiAJaWYgKCFtY2VfYXBlaV9yZWFkX2RvbmUpIHsKIAkJZXJyID0gX19tY2VfcmVhZF9hcGVpKCZidWYsIHVzaXplKTsKQEAgLTE1NjIsMTkgKzE1NDAsMTggQEAKIAlkbyB7CiAJCWZvciAoaSA9IHByZXY7IGkgPCBuZXh0OyBpKyspIHsKIAkJCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOworCQkJc3RydWN0IG1jZSAqbSA9ICZtY2Vsb2cuZW50cnlbaV07CiAKLQkJCXdoaWxlICghbWNlbG9nLmVudHJ5W2ldLmZpbmlzaGVkKSB7CisJCQl3aGlsZSAoIW0tPmZpbmlzaGVkKSB7CiAJCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgc3RhcnQgKyAyKSkgewotCQkJCQltZW1zZXQobWNlbG9nLmVudHJ5ICsgaSwgMCwKLQkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWNlKSk7CisJCQkJCW1lbXNldChtLCAwLCBzaXplb2YoKm0pKTsKIAkJCQkJZ290byB0aW1lb3V0OwogCQkJCX0KIAkJCQljcHVfcmVsYXgoKTsKIAkJCX0KIAkJCXNtcF9ybWIoKTsKLQkJCWVyciB8PSBjb3B5X3RvX3VzZXIoYnVmLCBtY2Vsb2cuZW50cnkgKyBpLAotCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBtY2UpKTsKLQkJCWJ1ZiArPSBzaXplb2Yoc3RydWN0IG1jZSk7CisJCQllcnIgfD0gY29weV90b191c2VyKGJ1ZiwgbSwgc2l6ZW9mKCptKSk7CisJCQlidWYgKz0gc2l6ZW9mKCptKTsKIHRpbWVvdXQ6CiAJCQk7CiAJCX0KQEAgLTE1OTQsMTMgKzE1NzEsMTMgQEAKIAlvbl9lYWNoX2NwdShjb2xsZWN0X3RzY3MsIGNwdV90c2MsIDEpOwogCiAJZm9yIChpID0gbmV4dDsgaSA8IE1DRV9MT0dfTEVOOyBpKyspIHsKLQkJaWYgKG1jZWxvZy5lbnRyeVtpXS5maW5pc2hlZCAmJgotCQkgICAgbWNlbG9nLmVudHJ5W2ldLnRzYyA8IGNwdV90c2NbbWNlbG9nLmVudHJ5W2ldLmNwdV0pIHsKLQkJCWVyciB8PSBjb3B5X3RvX3VzZXIoYnVmLCBtY2Vsb2cuZW50cnkraSwKLQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgbWNlKSk7CisJCXN0cnVjdCBtY2UgKm0gPSAmbWNlbG9nLmVudHJ5W2ldOworCisJCWlmIChtLT5maW5pc2hlZCAmJiBtLT50c2MgPCBjcHVfdHNjW20tPmNwdV0pIHsKKwkJCWVyciB8PSBjb3B5X3RvX3VzZXIoYnVmLCBtLCBzaXplb2YoKm0pKTsKIAkJCXNtcF9ybWIoKTsKLQkJCWJ1ZiArPSBzaXplb2Yoc3RydWN0IG1jZSk7Ci0JCQltZW1zZXQoJm1jZWxvZy5lbnRyeVtpXSwgMCwgc2l6ZW9mKHN0cnVjdCBtY2UpKTsKKwkJCWJ1ZiArPSBzaXplb2YoKm0pOworCQkJbWVtc2V0KG0sIDAsIHNpemVvZigqbSkpOwogCQl9CiAJfQogCkBAIC0xNjA4LDE1ICsxNTg1LDE1IEBACiAJCWVyciA9IC1FRkFVTFQ7CiAKIG91dDoKLQltdXRleF91bmxvY2soJm1jZV9yZWFkX211dGV4KTsKKwltdXRleF91bmxvY2soJm1jZV9jaHJkZXZfcmVhZF9tdXRleCk7CiAJa2ZyZWUoY3B1X3RzYyk7CiAKIAlyZXR1cm4gZXJyID8gZXJyIDogYnVmIC0gdWJ1ZjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBtY2VfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWNlX2NocmRldl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewotCXBvbGxfd2FpdChmaWxlLCAmbWNlX3dhaXQsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmbWNlX2NocmRldl93YWl0LCB3YWl0KTsKIAlpZiAocmN1X2FjY2Vzc19pbmRleChtY2Vsb2cubmV4dCkpCiAJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwogCWlmICghbWNlX2FwZWlfcmVhZF9kb25lICYmIGFwZWlfY2hlY2tfbWNlKCkpCkBAIC0xNjI0LDcgKzE2MDEsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgbG9uZyBtY2VfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgbWNlX2NocmRldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CiAKQEAgLTE2NTIsMTYgKzE2MzAsMTYgQEAKIAogLyogTW9kaWZpZWQgaW4gbWNlLWluamVjdC5jLCBzbyBub3Qgc3RhdGljIG9yIGNvbnN0ICovCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1jZV9jaHJkZXZfb3BzID0gewotCS5vcGVuCQkJPSBtY2Vfb3BlbiwKLQkucmVsZWFzZQkJPSBtY2VfcmVsZWFzZSwKLQkucmVhZAkJCT0gbWNlX3JlYWQsCi0JLnBvbGwJCQk9IG1jZV9wb2xsLAotCS51bmxvY2tlZF9pb2N0bAkJPSBtY2VfaW9jdGwsCi0JLmxsc2VlawkJPSBub19sbHNlZWssCisJLm9wZW4JCQk9IG1jZV9jaHJkZXZfb3BlbiwKKwkucmVsZWFzZQkJPSBtY2VfY2hyZGV2X3JlbGVhc2UsCisJLnJlYWQJCQk9IG1jZV9jaHJkZXZfcmVhZCwKKwkucG9sbAkJCT0gbWNlX2NocmRldl9wb2xsLAorCS51bmxvY2tlZF9pb2N0bAkJPSBtY2VfY2hyZGV2X2lvY3RsLAorCS5sbHNlZWsJCQk9IG5vX2xsc2VlaywKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChtY2VfY2hyZGV2X29wcyk7CiAKLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtY2VfbG9nX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtY2VfY2hyZGV2X2RldmljZSA9IHsKIAlNSVNDX01DRUxPR19NSU5PUiwKIAkibWNlbG9nIiwKIAkmbWNlX2NocmRldl9vcHMsCkBAIC0xNzE5LDcgKzE2OTcsNyBAQAogfQogCiAvKgotICogU3lzZnMgc3VwcG9ydAorICogbWNlX3N5c2NvcmU6IFBNIHN1cHBvcnQKICAqLwogCiAvKgpAQCAtMTczOSwxMiArMTcxNywxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1jZV9zdXNwZW5kKHZvaWQpCitzdGF0aWMgaW50IG1jZV9zeXNjb3JlX3N1c3BlbmQodm9pZCkKIHsKIAlyZXR1cm4gbWNlX2Rpc2FibGVfZXJyb3JfcmVwb3J0aW5nKCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1jZV9zaHV0ZG93bih2b2lkKQorc3RhdGljIHZvaWQgbWNlX3N5c2NvcmVfc2h1dGRvd24odm9pZCkKIHsKIAltY2VfZGlzYWJsZV9lcnJvcl9yZXBvcnRpbmcoKTsKIH0KQEAgLTE3NTQsMTggKzE3MzIsMjIgQEAKICAqIE9ubHkgb25lIENQVSBpcyBhY3RpdmUgYXQgdGhpcyB0aW1lLCB0aGUgb3RoZXJzIGdldCByZS1hZGRlZCBsYXRlciB1c2luZwogICogQ1BVIGhvdHBsdWc6CiAgKi8KLXN0YXRpYyB2b2lkIG1jZV9yZXN1bWUodm9pZCkKK3N0YXRpYyB2b2lkIG1jZV9zeXNjb3JlX3Jlc3VtZSh2b2lkKQogewogCV9fbWNoZWNrX2NwdV9pbml0X2dlbmVyaWMoKTsKIAlfX21jaGVja19jcHVfaW5pdF92ZW5kb3IoX190aGlzX2NwdV9wdHIoJmNwdV9pbmZvKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgbWNlX3N5c2NvcmVfb3BzID0gewotCS5zdXNwZW5kCT0gbWNlX3N1c3BlbmQsCi0JLnNodXRkb3duCT0gbWNlX3NodXRkb3duLAotCS5yZXN1bWUJCT0gbWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAk9IG1jZV9zeXNjb3JlX3N1c3BlbmQsCisJLnNodXRkb3duCT0gbWNlX3N5c2NvcmVfc2h1dGRvd24sCisJLnJlc3VtZQkJPSBtY2Vfc3lzY29yZV9yZXN1bWUsCiB9OwogCisvKgorICogbWNlX3N5c2RldjogU3lzZnMgc3VwcG9ydAorICovCisKIHN0YXRpYyB2b2lkIG1jZV9jcHVfcmVzdGFydCh2b2lkICpkYXRhKQogewogCWRlbF90aW1lcl9zeW5jKCZfX2dldF9jcHVfdmFyKG1jZV90aW1lcikpOwpAQCAtMTgwMSwxMSArMTc4MywxMSBAQAogCQlfX21jaGVja19jcHVfaW5pdF90aW1lcigpOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBtY2Vfc3lzY2xhc3MgPSB7CitzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBtY2Vfc3lzZGV2X2NsYXNzID0gewogCS5uYW1lCQk9ICJtYWNoaW5lY2hlY2siLAogfTsKIAotREVGSU5FX1BFUl9DUFUoc3RydWN0IHN5c19kZXZpY2UsIG1jZV9kZXYpOworREVGSU5FX1BFUl9DUFUoc3RydWN0IHN5c19kZXZpY2UsIG1jZV9zeXNkZXYpOwogCiBfX2NwdWluaXRkYXRhCiB2b2lkICgqdGhyZXNob2xkX2NwdV9jYWxsYmFjaykodW5zaWduZWQgbG9uZyBhY3Rpb24sIHVuc2lnbmVkIGludCBjcHUpOwpAQCAtMTkzNCw3ICsxOTE2LDcgQEAKIAkmbWNlX2NtY2lfZGlzYWJsZWQKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqbWNlX2F0dHJzW10gPSB7CitzdGF0aWMgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKm1jZV9zeXNkZXZfYXR0cnNbXSA9IHsKIAkmYXR0cl90b2xlcmFudC5hdHRyLAogCSZhdHRyX2NoZWNrX2ludGVydmFsLmF0dHIsCiAJJmF0dHJfdHJpZ2dlciwKQEAgLTE5NDUsNjYgKzE5MjcsNjcgQEAKIAlOVUxMCiB9OwogCi1zdGF0aWMgY3B1bWFza192YXJfdCBtY2VfZGV2X2luaXRpYWxpemVkOworc3RhdGljIGNwdW1hc2tfdmFyX3QgbWNlX3N5c2Rldl9pbml0aWFsaXplZDsKIAogLyogUGVyIGNwdSBzeXNkZXYgaW5pdC4gQWxsIG9mIHRoZSBjcHVzIHN0aWxsIHNoYXJlIHRoZSBzYW1lIGN0cmwgYmFuazogKi8KLXN0YXRpYyBfX2NwdWluaXQgaW50IG1jZV9jcmVhdGVfZGV2aWNlKHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgX19jcHVpbml0IGludCBtY2Vfc3lzZGV2X2NyZWF0ZSh1bnNpZ25lZCBpbnQgY3B1KQogeworCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYgPSAmcGVyX2NwdShtY2Vfc3lzZGV2LCBjcHUpOwogCWludCBlcnI7CiAJaW50IGksIGo7CiAKIAlpZiAoIW1jZV9hdmFpbGFibGUoJmJvb3RfY3B1X2RhdGEpKQogCQlyZXR1cm4gLUVJTzsKIAotCW1lbXNldCgmcGVyX2NwdShtY2VfZGV2LCBjcHUpLmtvYmosIDAsIHNpemVvZihzdHJ1Y3Qga29iamVjdCkpOwotCXBlcl9jcHUobWNlX2RldiwgY3B1KS5pZAk9IGNwdTsKLQlwZXJfY3B1KG1jZV9kZXYsIGNwdSkuY2xzCT0gJm1jZV9zeXNjbGFzczsKKwltZW1zZXQoJnN5c2Rldi0+a29iaiwgMCwgc2l6ZW9mKHN0cnVjdCBrb2JqZWN0KSk7CisJc3lzZGV2LT5pZCAgPSBjcHU7CisJc3lzZGV2LT5jbHMgPSAmbWNlX3N5c2Rldl9jbGFzczsKIAotCWVyciA9IHN5c2Rldl9yZWdpc3RlcigmcGVyX2NwdShtY2VfZGV2LCBjcHUpKTsKKwllcnIgPSBzeXNkZXZfcmVnaXN0ZXIoc3lzZGV2KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZm9yIChpID0gMDsgbWNlX2F0dHJzW2ldOyBpKyspIHsKLQkJZXJyID0gc3lzZGV2X2NyZWF0ZV9maWxlKCZwZXJfY3B1KG1jZV9kZXYsIGNwdSksIG1jZV9hdHRyc1tpXSk7CisJZm9yIChpID0gMDsgbWNlX3N5c2Rldl9hdHRyc1tpXTsgaSsrKSB7CisJCWVyciA9IHN5c2Rldl9jcmVhdGVfZmlsZShzeXNkZXYsIG1jZV9zeXNkZXZfYXR0cnNbaV0pOwogCQlpZiAoZXJyKQogCQkJZ290byBlcnJvcjsKIAl9CiAJZm9yIChqID0gMDsgaiA8IGJhbmtzOyBqKyspIHsKLQkJZXJyID0gc3lzZGV2X2NyZWF0ZV9maWxlKCZwZXJfY3B1KG1jZV9kZXYsIGNwdSksCi0JCQkJCSZtY2VfYmFua3Nbal0uYXR0cik7CisJCWVyciA9IHN5c2Rldl9jcmVhdGVfZmlsZShzeXNkZXYsICZtY2VfYmFua3Nbal0uYXR0cik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycm9yMjsKIAl9Ci0JY3B1bWFza19zZXRfY3B1KGNwdSwgbWNlX2Rldl9pbml0aWFsaXplZCk7CisJY3B1bWFza19zZXRfY3B1KGNwdSwgbWNlX3N5c2Rldl9pbml0aWFsaXplZCk7CiAKIAlyZXR1cm4gMDsKIGVycm9yMjoKIAl3aGlsZSAoLS1qID49IDApCi0JCXN5c2Rldl9yZW1vdmVfZmlsZSgmcGVyX2NwdShtY2VfZGV2LCBjcHUpLCAmbWNlX2JhbmtzW2pdLmF0dHIpOworCQlzeXNkZXZfcmVtb3ZlX2ZpbGUoc3lzZGV2LCAmbWNlX2JhbmtzW2pdLmF0dHIpOwogZXJyb3I6CiAJd2hpbGUgKC0taSA+PSAwKQotCQlzeXNkZXZfcmVtb3ZlX2ZpbGUoJnBlcl9jcHUobWNlX2RldiwgY3B1KSwgbWNlX2F0dHJzW2ldKTsKKwkJc3lzZGV2X3JlbW92ZV9maWxlKHN5c2RldiwgbWNlX3N5c2Rldl9hdHRyc1tpXSk7CiAKLQlzeXNkZXZfdW5yZWdpc3RlcigmcGVyX2NwdShtY2VfZGV2LCBjcHUpKTsKKwlzeXNkZXZfdW5yZWdpc3RlcihzeXNkZXYpOwogCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIF9fY3B1aW5pdCB2b2lkIG1jZV9yZW1vdmVfZGV2aWNlKHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgX19jcHVpbml0IHZvaWQgbWNlX3N5c2Rldl9yZW1vdmUodW5zaWduZWQgaW50IGNwdSkKIHsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2ID0gJnBlcl9jcHUobWNlX3N5c2RldiwgY3B1KTsKIAlpbnQgaTsKIAotCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIG1jZV9kZXZfaW5pdGlhbGl6ZWQpKQorCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIG1jZV9zeXNkZXZfaW5pdGlhbGl6ZWQpKQogCQlyZXR1cm47CiAKLQlmb3IgKGkgPSAwOyBtY2VfYXR0cnNbaV07IGkrKykKLQkJc3lzZGV2X3JlbW92ZV9maWxlKCZwZXJfY3B1KG1jZV9kZXYsIGNwdSksIG1jZV9hdHRyc1tpXSk7CisJZm9yIChpID0gMDsgbWNlX3N5c2Rldl9hdHRyc1tpXTsgaSsrKQorCQlzeXNkZXZfcmVtb3ZlX2ZpbGUoc3lzZGV2LCBtY2Vfc3lzZGV2X2F0dHJzW2ldKTsKIAogCWZvciAoaSA9IDA7IGkgPCBiYW5rczsgaSsrKQotCQlzeXNkZXZfcmVtb3ZlX2ZpbGUoJnBlcl9jcHUobWNlX2RldiwgY3B1KSwgJm1jZV9iYW5rc1tpXS5hdHRyKTsKKwkJc3lzZGV2X3JlbW92ZV9maWxlKHN5c2RldiwgJm1jZV9iYW5rc1tpXS5hdHRyKTsKIAotCXN5c2Rldl91bnJlZ2lzdGVyKCZwZXJfY3B1KG1jZV9kZXYsIGNwdSkpOwotCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbWNlX2Rldl9pbml0aWFsaXplZCk7CisJc3lzZGV2X3VucmVnaXN0ZXIoc3lzZGV2KTsKKwljcHVtYXNrX2NsZWFyX2NwdShjcHUsIG1jZV9zeXNkZXZfaW5pdGlhbGl6ZWQpOwogfQogCiAvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG1hY2hpbmUgY2hlY2tzIG9uIG9mZmxpbmVkIENQVXMuICovCkBAIC0yMDU0LDcgKzIwMzcsNyBAQAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBDUFVfT05MSU5FOgogCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JCW1jZV9jcmVhdGVfZGV2aWNlKGNwdSk7CisJCW1jZV9zeXNkZXZfY3JlYXRlKGNwdSk7CiAJCWlmICh0aHJlc2hvbGRfY3B1X2NhbGxiYWNrKQogCQkJdGhyZXNob2xkX2NwdV9jYWxsYmFjayhhY3Rpb24sIGNwdSk7CiAJCWJyZWFrOwpAQCAtMjA2Miw3ICsyMDQ1LDcgQEAKIAljYXNlIENQVV9ERUFEX0ZST1pFTjoKIAkJaWYgKHRocmVzaG9sZF9jcHVfY2FsbGJhY2spCiAJCQl0aHJlc2hvbGRfY3B1X2NhbGxiYWNrKGFjdGlvbiwgY3B1KTsKLQkJbWNlX3JlbW92ZV9kZXZpY2UoY3B1KTsKKwkJbWNlX3N5c2Rldl9yZW1vdmUoY3B1KTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgogCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46CkBAIC0yMTE2LDI3ICsyMDk5LDI4IEBACiAJaWYgKCFtY2VfYXZhaWxhYmxlKCZib290X2NwdV9kYXRhKSkKIAkJcmV0dXJuIC1FSU87CiAKLQl6YWxsb2NfY3B1bWFza192YXIoJm1jZV9kZXZfaW5pdGlhbGl6ZWQsIEdGUF9LRVJORUwpOworCXphbGxvY19jcHVtYXNrX3ZhcigmbWNlX3N5c2Rldl9pbml0aWFsaXplZCwgR0ZQX0tFUk5FTCk7CiAKIAltY2VfaW5pdF9iYW5rcygpOwogCi0JZXJyID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZtY2Vfc3lzY2xhc3MpOworCWVyciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmbWNlX3N5c2Rldl9jbGFzcyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewotCQllcnIgPSBtY2VfY3JlYXRlX2RldmljZShpKTsKKwkJZXJyID0gbWNlX3N5c2Rldl9jcmVhdGUoaSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCX0KIAogCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZtY2Vfc3lzY29yZV9vcHMpOwogCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmbWNlX2NwdV9ub3RpZmllcik7Ci0JbWlzY19yZWdpc3RlcigmbWNlX2xvZ19kZXZpY2UpOworCisJLyogcmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZSAvZGV2L21jZWxvZyAqLworCW1pc2NfcmVnaXN0ZXIoJm1jZV9jaHJkZXZfZGV2aWNlKTsKIAogCXJldHVybiBlcnI7CiB9Ci0KIGRldmljZV9pbml0Y2FsbChtY2hlY2tfaW5pdF9kZXZpY2UpOwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2FtZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2FtZC5jCmluZGV4IGJiMGFkYWQuLmY1NDc0MjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9hbWQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kLmMKQEAgLTU0OCw3ICs1NDgsNyBAQAogCQlpZiAoIWIpCiAJCQlnb3RvIG91dDsKIAotCQllcnIgPSBzeXNmc19jcmVhdGVfbGluaygmcGVyX2NwdShtY2VfZGV2LCBjcHUpLmtvYmosCisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZwZXJfY3B1KG1jZV9zeXNkZXYsIGNwdSkua29iaiwKIAkJCQkJYi0+a29iaiwgbmFtZSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKQEAgLTU3MSw3ICs1NzEsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQliLT5rb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZChuYW1lLCAmcGVyX2NwdShtY2VfZGV2LCBjcHUpLmtvYmopOworCWItPmtvYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKG5hbWUsICZwZXJfY3B1KG1jZV9zeXNkZXYsIGNwdSkua29iaik7CiAJaWYgKCFiLT5rb2JqKQogCQlnb3RvIG91dF9mcmVlOwogCkBAIC01OTEsNyArNTkxLDcgQEAKIAkJaWYgKGkgPT0gY3B1KQogCQkJY29udGludWU7CiAKLQkJZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBlcl9jcHUobWNlX2RldiwgaSkua29iaiwKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBlcl9jcHUobWNlX3N5c2RldiwgaSkua29iaiwKIAkJCQkJYi0+a29iaiwgbmFtZSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKQEAgLTY2OSw3ICs2NjksNyBAQAogI2lmZGVmIENPTkZJR19TTVAKIAkvKiBzaWJsaW5nIHN5bWxpbmsgKi8KIAlpZiAoc2hhcmVkX2JhbmtbYmFua10gJiYgYi0+YmxvY2tzLT5jcHUgIT0gY3B1KSB7Ci0JCXN5c2ZzX3JlbW92ZV9saW5rKCZwZXJfY3B1KG1jZV9kZXYsIGNwdSkua29iaiwgbmFtZSk7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZwZXJfY3B1KG1jZV9zeXNkZXYsIGNwdSkua29iaiwgbmFtZSk7CiAJCXBlcl9jcHUodGhyZXNob2xkX2JhbmtzLCBjcHUpW2JhbmtdID0gTlVMTDsKIAogCQlyZXR1cm47CkBAIC02ODEsNyArNjgxLDcgQEAKIAkJaWYgKGkgPT0gY3B1KQogCQkJY29udGludWU7CiAKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJnBlcl9jcHUobWNlX2RldiwgaSkua29iaiwgbmFtZSk7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZwZXJfY3B1KG1jZV9zeXNkZXYsIGkpLmtvYmosIG5hbWUpOwogCQlwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgaSlbYmFua10gPSBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL21haW4uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMKaW5kZXggOTI5NzM5YS4uMDgxMTlhMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL21haW4uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCkBAIC03OSw3ICs3OSw2IEBACiBzdGF0aWMgaW50IGhhdmVfd3Jjb21iKHZvaWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKLQl1OCByZXY7CiAKIAlkZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4LCBOVUxMKTsKIAlpZiAoZGV2ICE9IE5VTEwpIHsKQEAgLTg5LDEzICs4OCwxMSBAQAogCQkgKiBjaGlwc2V0cyB0byBiZSB0YWdnZWQKIAkJICovCiAJCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTICYmCi0JCSAgICBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0xFKSB7Ci0JCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldik7Ci0JCQlpZiAocmV2IDw9IDUpIHsKLQkJCQlwcl9pbmZvKCJtdHJyOiBTZXJ2ZXJ3b3JrcyBMRSByZXYgPCA2IGRldGVjdGVkLiBXcml0ZS1jb21iaW5pbmcgZGlzYWJsZWQuXG4iKTsKLQkJCQlwY2lfZGV2X3B1dChkZXYpOwotCQkJCXJldHVybiAwOwotCQkJfQorCQkgICAgZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19MRSAmJgorCQkgICAgZGV2LT5yZXZpc2lvbiA8PSA1KSB7CisJCQlwcl9pbmZvKCJtdHJyOiBTZXJ2ZXJ3b3JrcyBMRSByZXYgPCA2IGRldGVjdGVkLiBXcml0ZS1jb21iaW5pbmcgZGlzYWJsZWQuXG4iKTsKKwkJCXBjaV9kZXZfcHV0KGRldik7CisJCQlyZXR1cm4gMDsKIAkJfQogCQkvKgogCQkgKiBJbnRlbCA0NTBOWCBlcnJhdGEgIyAyMy4gTm9uIGFzY2VuZGluZyBjYWNoZWxpbmUgZXZpY3Rpb25zIHRvCkBAIC0xMzcsNTUgKzEzNCw0MyBAQAogfQogCiBzdHJ1Y3Qgc2V0X210cnJfZGF0YSB7Ci0JYXRvbWljX3QJY291bnQ7Ci0JYXRvbWljX3QJZ2F0ZTsKIAl1bnNpZ25lZCBsb25nCXNtcF9iYXNlOwogCXVuc2lnbmVkIGxvbmcJc21wX3NpemU7CiAJdW5zaWduZWQgaW50CXNtcF9yZWc7CiAJbXRycl90eXBlCXNtcF90eXBlOwogfTsKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfc3RvcF93b3JrLCBtdHJyX3dvcmspOwotCiAvKioKLSAqIG10cnJfd29ya19oYW5kbGVyIC0gU3luY2hyb25pc2F0aW9uIGhhbmRsZXIuIEV4ZWN1dGVkIGJ5ICJvdGhlciIgQ1BVcy4KKyAqIG10cnJfcmVuZGV6dm91c19oYW5kbGVyIC0gV29yayBkb25lIGluIHRoZSBzeW5jaHJvbml6YXRpb24gaGFuZGxlci4gRXhlY3V0ZWQKKyAqIGJ5IGFsbCB0aGUgQ1BVcy4KICAqIEBpbmZvOiBwb2ludGVyIHRvIG10cnIgY29uZmlndXJhdGlvbiBkYXRhCiAgKgogICogUmV0dXJucyBub3RoaW5nLgogICovCi1zdGF0aWMgaW50IG10cnJfd29ya19oYW5kbGVyKHZvaWQgKmluZm8pCitzdGF0aWMgaW50IG10cnJfcmVuZGV6dm91c19oYW5kbGVyKHZvaWQgKmluZm8pCiB7CiAjaWZkZWYgQ09ORklHX1NNUAogCXN0cnVjdCBzZXRfbXRycl9kYXRhICpkYXRhID0gaW5mbzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JYXRvbWljX2RlYygmZGF0YS0+Y291bnQpOwotCXdoaWxlICghYXRvbWljX3JlYWQoJmRhdGEtPmdhdGUpKQotCQljcHVfcmVsYXgoKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWF0b21pY19kZWMoJmRhdGEtPmNvdW50KTsKLQl3aGlsZSAoYXRvbWljX3JlYWQoJmRhdGEtPmdhdGUpKQotCQljcHVfcmVsYXgoKTsKLQotCS8qICBUaGUgbWFzdGVyIGhhcyBjbGVhcmVkIG1lIHRvIGV4ZWN1dGUgICovCisJLyoKKwkgKiBXZSB1c2UgdGhpcyBzYW1lIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIG10cnJzIGR1cmluZyBib290LAorCSAqIHJlc3VtZSwgcnVudGltZSBjcHUgb25saW5lIGFuZCBvbiBhbiBleHBsaWNpdCByZXF1ZXN0IHRvIHNldCBhCisJICogc3BlY2lmaWMgTVRSUi4KKwkgKgorCSAqIER1cmluZyBib290IG9yIHN1c3BlbmQsIHRoZSBzdGF0ZSBvZiB0aGUgYm9vdCBjcHUncyBtdHJycyBoYXMgYmVlbgorCSAqIHNhdmVkLCBhbmQgd2Ugd2FudCB0byByZXBsaWNhdGUgdGhhdCBhY3Jvc3MgYWxsIHRoZSBjcHVzIHRoYXQgY29tZQorCSAqIG9ubGluZSAoZWl0aGVyIGF0IHRoZSBlbmQgb2YgYm9vdCBvciByZXN1bWUgb3IgZHVyaW5nIGEgcnVudGltZSBjcHUKKwkgKiBvbmxpbmUpLiBJZiB3ZSdyZSBkb2luZyB0aGF0LCBAcmVnIGlzIHNldCB0byBzb21ldGhpbmcgc3BlY2lhbCBhbmQgb24KKwkgKiBhbGwgdGhlIGNwdSdzIHdlIGRvIG10cnJfaWYtPnNldF9hbGwoKSAoT24gdGhlIGxvZ2ljYWwgY3B1IHRoYXQKKwkgKiBzdGFydGVkIHRoZSBib290L3Jlc3VtZSBzZXF1ZW5jZSwgdGhpcyBtaWdodCBiZSBhIGR1cGxpY2F0ZQorCSAqIHNldF9hbGwoKSkuCisJICovCiAJaWYgKGRhdGEtPnNtcF9yZWcgIT0gfjBVKSB7CiAJCW10cnJfaWYtPnNldChkYXRhLT5zbXBfcmVnLCBkYXRhLT5zbXBfYmFzZSwKIAkJCSAgICAgZGF0YS0+c21wX3NpemUsIGRhdGEtPnNtcF90eXBlKTsKLQl9IGVsc2UgaWYgKG10cnJfYXBzX2RlbGF5ZWRfaW5pdCkgewotCQkvKgotCQkgKiBJbml0aWFsaXplIHRoZSBNVFJScyBpbmFkZGl0aW9uIHRvIHRoZSBzeW5jaHJvbmlzYXRpb24uCi0JCSAqLworCX0gZWxzZSBpZiAobXRycl9hcHNfZGVsYXllZF9pbml0IHx8ICFjcHVfb25saW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkpIHsKIAkJbXRycl9pZi0+c2V0X2FsbCgpOwogCX0KLQotCWF0b21pY19kZWMoJmRhdGEtPmNvdW50KTsKLQl3aGlsZSAoIWF0b21pY19yZWFkKCZkYXRhLT5nYXRlKSkKLQkJY3B1X3JlbGF4KCk7Ci0KLQlhdG9taWNfZGVjKCZkYXRhLT5jb3VudCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiB9CkBAIC0yMjMsMjAgKzIwOCwxMSBAQAogICogMTQuIFdhaXQgZm9yIGJ1ZGRpZXMgdG8gY2F0Y2ggdXAKICAqIDE1LiBFbmFibGUgaW50ZXJydXB0cy4KICAqCi0gKiBXaGF0IGRvZXMgdGhhdCBtZWFuIGZvciB1cz8gV2VsbCwgZmlyc3Qgd2Ugc2V0IGRhdGEuY291bnQgdG8gdGhlIG51bWJlcgotICogb2YgQ1BVcy4gQXMgZWFjaCBDUFUgYW5ub3VuY2VzIHRoYXQgaXQgc3RhcnRlZCB0aGUgcmVuZGV6dm91cyBoYW5kbGVyIGJ5Ci0gKiBkZWNyZW1lbnRpbmcgdGhlIGNvdW50LCBXZSByZXNldCBkYXRhLmNvdW50IGFuZCBzZXQgdGhlIGRhdGEuZ2F0ZSBmbGFnCi0gKiBhbGxvd2luZyBhbGwgdGhlIGNwdSdzIHRvIHByb2NlZWQgd2l0aCB0aGUgd29yay4gQXMgZWFjaCBjcHUgZGlzYWJsZXMKLSAqIGludGVycnVwdHMsIGl0J2xsIGRlY3JlbWVudCBkYXRhLmNvdW50IG9uY2UuIFdlIHdhaXQgdW50aWwgaXQgaGl0cyAwIGFuZAotICogcHJvY2VlZC4gV2UgY2xlYXIgdGhlIGRhdGEuZ2F0ZSBmbGFnIGFuZCByZXNldCBkYXRhLmNvdW50LiBNZWFud2hpbGUsIHRoZXkKLSAqIGFyZSB3YWl0aW5nIGZvciB0aGF0IGZsYWcgdG8gYmUgY2xlYXJlZC4gT25jZSBpdCdzIGNsZWFyZWQsIGVhY2gKLSAqIENQVSBnb2VzIHRocm91Z2ggdGhlIHRyYW5zaXRpb24gb2YgdXBkYXRpbmcgTVRSUnMuCi0gKiBUaGUgQ1BVIHZlbmRvcnMgbWF5IGVhY2ggZG8gaXQgZGlmZmVyZW50bHksCi0gKiBzbyB3ZSBjYWxsIG10cnJfaWYtPnNldCgpIGNhbGxiYWNrIGFuZCBsZXQgdGhlbSB0YWtlIGNhcmUgb2YgaXQuCi0gKiBXaGVuIHRoZXkncmUgZG9uZSwgdGhleSBhZ2FpbiBkZWNyZW1lbnQgZGF0YS0+Y291bnQgYW5kIHdhaXQgZm9yIGRhdGEuZ2F0ZQotICogdG8gYmUgc2V0LgotICogV2hlbiB3ZSBmaW5pc2gsIHdlIHdhaXQgZm9yIGRhdGEuY291bnQgdG8gaGl0IDAgYW5kIHRvZ2dsZSB0aGUgZGF0YS5nYXRlIGZsYWcKLSAqIEV2ZXJ5b25lIHRoZW4gZW5hYmxlcyBpbnRlcnJ1cHRzIGFuZCB3ZSBhbGwgY29udGludWUgb24uCisgKiBXaGF0IGRvZXMgdGhhdCBtZWFuIGZvciB1cz8gV2VsbCwgc3RvcF9tYWNoaW5lKCkgd2lsbCBlbnN1cmUgdGhhdAorICogdGhlIHJlbmRlenZvdXMgaGFuZGxlciBpcyBzdGFydGVkIG9uIGVhY2ggQ1BVLiBBbmQgaW4gbG9ja3N0ZXAgdGhleQorICogZG8gdGhlIHN0YXRlIHRyYW5zaXRpb24gb2YgZGlzYWJsaW5nIGludGVycnVwdHMsIHVwZGF0aW5nIE1UUlIncworICogKHRoZSBDUFUgdmVuZG9ycyBtYXkgZWFjaCBkbyBpdCBkaWZmZXJlbnRseSwgc28gd2UgY2FsbCBtdHJyX2lmLT5zZXQoKQorICogY2FsbGJhY2sgYW5kIGxldCB0aGVtIHRha2UgY2FyZSBvZiBpdC4pIGFuZCBlbmFibGluZyBpbnRlcnJ1cHRzLgogICoKICAqIE5vdGUgdGhhdCB0aGUgbWVjaGFuaXNtIGlzIHRoZSBzYW1lIGZvciBVUCBzeXN0ZW1zLCB0b287IGFsbCB0aGUgU01QIHN0dWZmCiAgKiBiZWNvbWVzIG5vcHMuCkBAIC0yNDQsOTIgKzIyMCwyNiBAQAogc3RhdGljIHZvaWQKIHNldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSkKIHsKLQlzdHJ1Y3Qgc2V0X210cnJfZGF0YSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGNwdTsKKwlzdHJ1Y3Qgc2V0X210cnJfZGF0YSBkYXRhID0geyAuc21wX3JlZyA9IHJlZywKKwkJCQkgICAgICAuc21wX2Jhc2UgPSBiYXNlLAorCQkJCSAgICAgIC5zbXBfc2l6ZSA9IHNpemUsCisJCQkJICAgICAgLnNtcF90eXBlID0gdHlwZQorCQkJCSAgICB9OwogCi0JcHJlZW1wdF9kaXNhYmxlKCk7CisJc3RvcF9tYWNoaW5lKG10cnJfcmVuZGV6dm91c19oYW5kbGVyLCAmZGF0YSwgY3B1X29ubGluZV9tYXNrKTsKK30KIAotCWRhdGEuc21wX3JlZyA9IHJlZzsKLQlkYXRhLnNtcF9iYXNlID0gYmFzZTsKLQlkYXRhLnNtcF9zaXplID0gc2l6ZTsKLQlkYXRhLnNtcF90eXBlID0gdHlwZTsKLQlhdG9taWNfc2V0KCZkYXRhLmNvdW50LCBudW1fYm9vdGluZ19jcHVzKCkgLSAxKTsKK3N0YXRpYyB2b2lkIHNldF9tdHJyX2Zyb21faW5hY3RpdmVfY3B1KHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIG10cnJfdHlwZSB0eXBlKQoreworCXN0cnVjdCBzZXRfbXRycl9kYXRhIGRhdGEgPSB7IC5zbXBfcmVnID0gcmVnLAorCQkJCSAgICAgIC5zbXBfYmFzZSA9IGJhc2UsCisJCQkJICAgICAgLnNtcF9zaXplID0gc2l6ZSwKKwkJCQkgICAgICAuc21wX3R5cGUgPSB0eXBlCisJCQkJICAgIH07CiAKLQkvKiBNYWtlIHN1cmUgZGF0YS5jb3VudCBpcyB2aXNpYmxlIGJlZm9yZSB1bmxlYXNoaW5nIG90aGVyIENQVXMgKi8KLQlzbXBfd21iKCk7Ci0JYXRvbWljX3NldCgmZGF0YS5nYXRlLCAwKTsKLQotCS8qIFN0YXJ0IHRoZSBiYWxsIHJvbGxpbmcgb24gb3RoZXIgQ1BVcyAqLwotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCXN0cnVjdCBjcHVfc3RvcF93b3JrICp3b3JrID0gJnBlcl9jcHUobXRycl93b3JrLCBjcHUpOwotCi0JCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQotCQkJY29udGludWU7Ci0KLQkJc3RvcF9vbmVfY3B1X25vd2FpdChjcHUsIG10cnJfd29ya19oYW5kbGVyLCAmZGF0YSwgd29yayk7Ci0JfQotCi0KLQl3aGlsZSAoYXRvbWljX3JlYWQoJmRhdGEuY291bnQpKQotCQljcHVfcmVsYXgoKTsKLQotCS8qIE9rLCByZXNldCBjb3VudCBhbmQgdG9nZ2xlIGdhdGUgKi8KLQlhdG9taWNfc2V0KCZkYXRhLmNvdW50LCBudW1fYm9vdGluZ19jcHVzKCkgLSAxKTsKLQlzbXBfd21iKCk7Ci0JYXRvbWljX3NldCgmZGF0YS5nYXRlLCAxKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCXdoaWxlIChhdG9taWNfcmVhZCgmZGF0YS5jb3VudCkpCi0JCWNwdV9yZWxheCgpOwotCi0JLyogT2ssIHJlc2V0IGNvdW50IGFuZCB0b2dnbGUgZ2F0ZSAqLwotCWF0b21pY19zZXQoJmRhdGEuY291bnQsIG51bV9ib290aW5nX2NwdXMoKSAtIDEpOwotCXNtcF93bWIoKTsKLQlhdG9taWNfc2V0KCZkYXRhLmdhdGUsIDApOwotCi0JLyogRG8gb3VyIE1UUlIgYnVzaW5lc3MgKi8KLQotCS8qCi0JICogSEFDSyEKLQkgKgotCSAqIFdlIHVzZSB0aGlzIHNhbWUgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgbXRycnMgZHVyaW5nIGJvb3QsCi0JICogcmVzdW1lLCBydW50aW1lIGNwdSBvbmxpbmUgYW5kIG9uIGFuIGV4cGxpY2l0IHJlcXVlc3QgdG8gc2V0IGEKLQkgKiBzcGVjaWZpYyBNVFJSLgotCSAqCi0JICogRHVyaW5nIGJvb3Qgb3Igc3VzcGVuZCwgdGhlIHN0YXRlIG9mIHRoZSBib290IGNwdSdzIG10cnJzIGhhcyBiZWVuCi0JICogc2F2ZWQsIGFuZCB3ZSB3YW50IHRvIHJlcGxpY2F0ZSB0aGF0IGFjcm9zcyBhbGwgdGhlIGNwdXMgdGhhdCBjb21lCi0JICogb25saW5lIChlaXRoZXIgYXQgdGhlIGVuZCBvZiBib290IG9yIHJlc3VtZSBvciBkdXJpbmcgYSBydW50aW1lIGNwdQotCSAqIG9ubGluZSkuIElmIHdlJ3JlIGRvaW5nIHRoYXQsIEByZWcgaXMgc2V0IHRvIHNvbWV0aGluZyBzcGVjaWFsIGFuZCBvbgotCSAqIHRoaXMgY3B1IHdlIHN0aWxsIGRvIG10cnJfaWYtPnNldF9hbGwoKS4gRHVyaW5nIGJvb3QvcmVzdW1lLCB0aGlzCi0JICogaXMgdW5uZWNlc3NhcnkgaWYgYXQgdGhpcyBwb2ludCB3ZSBhcmUgc3RpbGwgb24gdGhlIGNwdSB0aGF0IHN0YXJ0ZWQKLQkgKiB0aGUgYm9vdC9yZXN1bWUgc2VxdWVuY2UuIEJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB3ZSBhcmUgc3RpbGwKLQkgKiBvbiB0aGUgc2FtZSBjcHUuIFNvIHdlIGRvIG10cnJfaWYtPnNldF9hbGwoKSBvbiB0aGlzIGNwdSBhc3dlbGwgdG8gYmUKLQkgKiBzdXJlIHRoYXQgd2UgYXJlIGluIHN5bmMgd2l0aCBldmVyeW9uZSBlbHNlLgotCSAqLwotCWlmIChyZWcgIT0gfjBVKQotCQltdHJyX2lmLT5zZXQocmVnLCBiYXNlLCBzaXplLCB0eXBlKTsKLQllbHNlCi0JCW10cnJfaWYtPnNldF9hbGwoKTsKLQotCS8qIFdhaXQgZm9yIHRoZSBvdGhlcnMgKi8KLQl3aGlsZSAoYXRvbWljX3JlYWQoJmRhdGEuY291bnQpKQotCQljcHVfcmVsYXgoKTsKLQotCWF0b21pY19zZXQoJmRhdGEuY291bnQsIG51bV9ib290aW5nX2NwdXMoKSAtIDEpOwotCXNtcF93bWIoKTsKLQlhdG9taWNfc2V0KCZkYXRhLmdhdGUsIDEpOwotCi0JLyoKLQkgKiBXYWl0IGhlcmUgZm9yIGV2ZXJ5b25lIHRvIGhhdmUgc2VlbiB0aGUgZ2F0ZSBjaGFuZ2UKLQkgKiBTbyB3ZSdyZSB0aGUgbGFzdCBvbmVzIHRvIHRvdWNoICdkYXRhJwotCSAqLwotCXdoaWxlIChhdG9taWNfcmVhZCgmZGF0YS5jb3VudCkpCi0JCWNwdV9yZWxheCgpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXByZWVtcHRfZW5hYmxlKCk7CisJc3RvcF9tYWNoaW5lX2Zyb21faW5hY3RpdmVfY3B1KG10cnJfcmVuZGV6dm91c19oYW5kbGVyLCAmZGF0YSwKKwkJCQkgICAgICAgY3B1X2NhbGxvdXRfbWFzayk7CiB9CiAKIC8qKgpAQCAtNzgzLDcgKzY5Myw3IEBACiAJICogICAyLiBjcHUgaG90YWRkIHRpbWUuIFdlIGxldCBtdHJyX2FkZC9kZWxfcGFnZSBob2xkIGNwdWhvdHBsdWcKIAkgKiAgICAgIGxvY2sgdG8gcHJldmVudCBtdHJyIGVudHJ5IGNoYW5nZXMKIAkgKi8KLQlzZXRfbXRycih+MFUsIDAsIDAsIDApOworCXNldF9tdHJyX2Zyb21faW5hY3RpdmVfY3B1KH4wVSwgMCwgMCwgMCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYwppbmRleCAzYTAzMzhiLi40ZWUzYWJmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKQEAgLTQ1LDM4ICs0NCwyNyBAQAogI2VuZGlmCiAKIC8qCi0gKiBiZXN0IGVmZm9ydCwgR1VQIGJhc2VkIGNvcHlfZnJvbV91c2VyKCkgdGhhdCBhc3N1bWVzIElSUSBvciBOTUkgY29udGV4dAorICogICAgICAgICAgfCAgIE5ITS9XU00gICAgfCAgICAgIFNOQiAgICAgfAorICogcmVnaXN0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgfCAgSFQgIHwgbm8gSFQgfCAgSFQgIHwgbm8gSFQgfAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb2ZmY29yZSAgfCBjb3JlIHwgY29yZSAgfCBjcHUgIHwgY29yZSAgfAorICogbGJyX3NlbCAgfCBjb3JlIHwgY29yZSAgfCBjcHUgIHwgY29yZSAgfAorICogbGRfbGF0ICAgfCBjcHUgIHwgY29yZSAgfCBjcHUgIHwgY29yZSAgfAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEdpdmVuIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCBudW1iZXIgb2Ygc2hhcmVkIHJlZ3MsCisgKiB3ZSBjYW4gcHJlLWFsbG9jYXRlIHRoZWlyIHNsb3QgaW4gdGhlIHBlci1jcHUKKyAqIHBlci1jb3JlIHJlZyB0YWJsZXMuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1jb3B5X2Zyb21fdXNlcl9ubWkodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCi17Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQsIGFkZHIgPSAodW5zaWduZWQgbG9uZylmcm9tOwotCXVuc2lnbmVkIGxvbmcgc2l6ZSwgbGVuID0gMDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl2b2lkICptYXA7Ci0JaW50IHJldDsKK2VudW0gZXh0cmFfcmVnX3R5cGUgeworCUVYVFJBX1JFR19OT05FICA9IC0xLAkvKiBub3QgdXNlZCAqLwogCi0JZG8gewotCQlyZXQgPSBfX2dldF91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgMSwgMCwgJnBhZ2UpOwotCQlpZiAoIXJldCkKLQkJCWJyZWFrOworCUVYVFJBX1JFR19SU1BfMCA9IDAsCS8qIG9mZmNvcmVfcmVzcG9uc2VfMCAqLworCUVYVFJBX1JFR19SU1BfMSA9IDEsCS8qIG9mZmNvcmVfcmVzcG9uc2VfMSAqLwogCi0JCW9mZnNldCA9IGFkZHIgJiAoUEFHRV9TSVpFIC0gMSk7Ci0JCXNpemUgPSBtaW4oUEFHRV9TSVpFIC0gb2Zmc2V0LCBuIC0gbGVuKTsKLQotCQltYXAgPSBrbWFwX2F0b21pYyhwYWdlKTsKLQkJbWVtY3B5KHRvLCBtYXArb2Zmc2V0LCBzaXplKTsKLQkJa3VubWFwX2F0b21pYyhtYXApOwotCQlwdXRfcGFnZShwYWdlKTsKLQotCQlsZW4gICs9IHNpemU7Ci0JCXRvICAgKz0gc2l6ZTsKLQkJYWRkciArPSBzaXplOwotCi0JfSB3aGlsZSAobGVuIDwgbik7Ci0KLQlyZXR1cm4gbGVuOwotfQorCUVYVFJBX1JFR19NQVgJCS8qIG51bWJlciBvZiBlbnRyaWVzIG5lZWRlZCAqLworfTsKIAogc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgewogCXVuaW9uIHsKQEAgLTEzMiwxMSArMTIwLDEwIEBACiAJc3RydWN0IHBlcmZfYnJhbmNoX2VudHJ5CWxicl9lbnRyaWVzW01BWF9MQlJfRU5UUklFU107CiAKIAkvKgotCSAqIEludGVsIHBlcmNvcmUgcmVnaXN0ZXIgc3RhdGUuCi0JICogQ29vcmRpbmF0ZSBzaGFyZWQgcmVzb3VyY2VzIGJldHdlZW4gSFQgdGhyZWFkcy4KKwkgKiBtYW5hZ2Ugc2hhcmVkIChwZXItY29yZSwgcGVyLWNwdSkgcmVnaXN0ZXJzCisJICogdXNlZCBvbiBJbnRlbCBOSE0vV1NNL1NOQgogCSAqLwotCWludAkJCQlwZXJjb3JlX3VzZWQ7IC8qIFVzZWQgYnkgdGhpcyBDUFU/ICovCi0Jc3RydWN0IGludGVsX3BlcmNvcmUJCSpwZXJfY29yZTsKKwlzdHJ1Y3QgaW50ZWxfc2hhcmVkX3JlZ3MJKnNoYXJlZF9yZWdzOwogCiAJLyoKIAkgKiBBTUQgc3BlY2lmaWMgYml0cwpAQCAtMTg3LDI2ICsxNzQsNDUgQEAKIAlmb3IgKChlKSA9IChjKTsgKGUpLT53ZWlnaHQ7IChlKSsrKQogCiAvKgorICogUGVyIHJlZ2lzdGVyIHN0YXRlLgorICovCitzdHJ1Y3QgZXJfYWNjb3VudCB7CisJcmF3X3NwaW5sb2NrX3QJCWxvY2s7CS8qIHBlci1jb3JlOiBwcm90ZWN0IHN0cnVjdHVyZSAqLworCXU2NAkJCWNvbmZpZzsJLyogZXh0cmEgTVNSIGNvbmZpZyAqLworCXU2NAkJCXJlZzsJLyogZXh0cmEgTVNSIG51bWJlciAqLworCWF0b21pY190CQlyZWY7CS8qIHJlZmVyZW5jZSBjb3VudCAqLworfTsKKworLyoKICAqIEV4dHJhIHJlZ2lzdGVycyBmb3Igc3BlY2lmaWMgZXZlbnRzLgorICoKICAqIFNvbWUgZXZlbnRzIG5lZWQgbGFyZ2UgbWFza3MgYW5kIHJlcXVpcmUgZXh0ZXJuYWwgTVNScy4KLSAqIERlZmluZSBhIG1hcHBpbmcgdG8gdGhlc2UgZXh0cmEgcmVnaXN0ZXJzLgorICogVGhvc2UgZXh0cmEgTVNScyBlbmQgdXAgYmVpbmcgc2hhcmVkIGZvciBhbGwgZXZlbnRzIG9uCisgKiBhIFBNVSBhbmQgc29tZXRpbWVzIGJldHdlZW4gUE1VIG9mIHNpYmxpbmcgSFQgdGhyZWFkcy4KKyAqIEluIGVpdGhlciBjYXNlLCB0aGUga2VybmVsIG5lZWRzIHRvIGhhbmRsZSBjb25mbGljdGluZworICogYWNjZXNzZXMgdG8gdGhvc2UgZXh0cmEsIHNoYXJlZCwgcmVncy4gVGhlIGRhdGEgc3RydWN0dXJlCisgKiB0byBtYW5hZ2UgdGhvc2UgcmVnaXN0ZXJzIGlzIHN0b3JlZCBpbiBjcHVfaHdfZXZlbnQuCiAgKi8KIHN0cnVjdCBleHRyYV9yZWcgewogCXVuc2lnbmVkIGludAkJZXZlbnQ7CiAJdW5zaWduZWQgaW50CQltc3I7CiAJdTY0CQkJY29uZmlnX21hc2s7CiAJdTY0CQkJdmFsaWRfbWFzazsKKwlpbnQJCQlpZHg7ICAvKiBwZXJfeHh4LT5yZWdzW10gcmVnIGluZGV4ICovCiB9OwogCi0jZGVmaW5lIEVWRU5UX0VYVFJBX1JFRyhlLCBtcywgbSwgdm0pIHsJXAorI2RlZmluZSBFVkVOVF9FWFRSQV9SRUcoZSwgbXMsIG0sIHZtLCBpKSB7CVwKIAkuZXZlbnQgPSAoZSksCQlcCiAJLm1zciA9IChtcyksCQlcCiAJLmNvbmZpZ19tYXNrID0gKG0pLAlcCiAJLnZhbGlkX21hc2sgPSAodm0pLAlcCisJLmlkeCA9IEVYVFJBX1JFR18jI2kJXAogCX0KLSNkZWZpbmUgSU5URUxfRVZFTlRfRVhUUkFfUkVHKGV2ZW50LCBtc3IsIHZtKQlcCi0JRVZFTlRfRVhUUkFfUkVHKGV2ZW50LCBtc3IsIEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9FVkVOVCwgdm0pCi0jZGVmaW5lIEVWRU5UX0VYVFJBX0VORCBFVkVOVF9FWFRSQV9SRUcoMCwgMCwgMCwgMCkKKworI2RlZmluZSBJTlRFTF9FVkVOVF9FWFRSQV9SRUcoZXZlbnQsIG1zciwgdm0sIGlkeCkJXAorCUVWRU5UX0VYVFJBX1JFRyhldmVudCwgbXNyLCBBUkNIX1BFUkZNT05fRVZFTlRTRUxfRVZFTlQsIHZtLCBpZHgpCisKKyNkZWZpbmUgRVZFTlRfRVhUUkFfRU5EIEVWRU5UX0VYVFJBX1JFRygwLCAwLCAwLCAwLCBSU1BfMCkKIAogdW5pb24gcGVyZl9jYXBhYmlsaXRpZXMgewogCXN0cnVjdCB7CkBAIC0yNTIsNyArMjU4LDYgQEAKIAl2b2lkCQkoKnB1dF9ldmVudF9jb25zdHJhaW50cykoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCiAJCQkJCQkgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAlzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqZXZlbnRfY29uc3RyYWludHM7Ci0Jc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKnBlcmNvcmVfY29uc3RyYWludHM7CiAJdm9pZAkJKCpxdWlya3MpKHZvaWQpOwogCWludAkJcGVyZmN0cl9zZWNvbmRfd3JpdGU7CiAKQEAgLTI4Niw4ICsyOTEsMTIgQEAKIAkgKiBFeHRyYSByZWdpc3RlcnMgZm9yIGV2ZW50cwogCSAqLwogCXN0cnVjdCBleHRyYV9yZWcgKmV4dHJhX3JlZ3M7CisJdW5zaWduZWQgaW50IGVyX2ZsYWdzOwogfTsKIAorI2RlZmluZSBFUkZfTk9fSFRfU0hBUklORwkxCisjZGVmaW5lIEVSRl9IQVNfUlNQXzEJCTIKKwogc3RhdGljIHN0cnVjdCB4ODZfcG11IHg4Nl9wbXUgX19yZWFkX21vc3RseTsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfaHdfZXZlbnRzLCBjcHVfaHdfZXZlbnRzKSA9IHsKQEAgLTM5MywxMCArNDAyLDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgeDg2X3BtdV9leHRyYV9yZWdzKHU2NCBjb25maWcsIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudF9leHRyYSAqcmVnOwogCXN0cnVjdCBleHRyYV9yZWcgKmVyOwogCi0JZXZlbnQtPmh3LmV4dHJhX3JlZyA9IDA7Ci0JZXZlbnQtPmh3LmV4dHJhX2NvbmZpZyA9IDA7CisJcmVnID0gJmV2ZW50LT5ody5leHRyYV9yZWc7CiAKIAlpZiAoIXg4Nl9wbXUuZXh0cmFfcmVncykKIAkJcmV0dXJuIDA7CkBAIC00MDYsOCArNDE1LDEwIEBACiAJCQljb250aW51ZTsKIAkJaWYgKGV2ZW50LT5hdHRyLmNvbmZpZzEgJiB+ZXItPnZhbGlkX21hc2spCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJZXZlbnQtPmh3LmV4dHJhX3JlZyA9IGVyLT5tc3I7Ci0JCWV2ZW50LT5ody5leHRyYV9jb25maWcgPSBldmVudC0+YXR0ci5jb25maWcxOworCisJCXJlZy0+aWR4ID0gZXItPmlkeDsKKwkJcmVnLT5jb25maWcgPSBldmVudC0+YXR0ci5jb25maWcxOworCQlyZWctPnJlZyA9IGVyLT5tc3I7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKQEAgLTcwNiw2ICs3MTcsOSBAQAogCWV2ZW50LT5ody5sYXN0X2NwdSA9IC0xOwogCWV2ZW50LT5ody5sYXN0X3RhZyA9IH4wVUxMOwogCisJLyogbWFyayB1bnVzZWQgKi8KKwlldmVudC0+aHcuZXh0cmFfcmVnLmlkeCA9IEVYVFJBX1JFR19OT05FOworCiAJcmV0dXJuIHg4Nl9wbXUuaHdfY29uZmlnKGV2ZW50KTsKIH0KIApAQCAtNzQ3LDggKzc2MSw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgX194ODZfcG11X2VuYWJsZV9ldmVudChzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLAogCQkJCQkgIHU2NCBlbmFibGVfbWFzaykKIHsKLQlpZiAoaHdjLT5leHRyYV9yZWcpCi0JCXdybXNybChod2MtPmV4dHJhX3JlZywgaHdjLT5leHRyYV9jb25maWcpOworCWlmIChod2MtPmV4dHJhX3JlZy5yZWcpCisJCXdybXNybChod2MtPmV4dHJhX3JlZy5yZWcsIGh3Yy0+ZXh0cmFfcmVnLmNvbmZpZyk7CiAJd3Jtc3JsKGh3Yy0+Y29uZmlnX2Jhc2UsIGh3Yy0+Y29uZmlnIHwgZW5hYmxlX21hc2spOwogfQogCkBAIC0xMzMyLDcgKzEzNDYsNyBAQAogCQlpZiAoIXg4Nl9wZXJmX2V2ZW50X3NldF9wZXJpb2QoZXZlbnQpKQogCQkJY29udGludWU7CiAKLQkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsIDEsICZkYXRhLCByZWdzKSkKKwkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsICZkYXRhLCByZWdzKSkKIAkJCXg4Nl9wbXVfc3RvcChldmVudCwgMCk7CiAJfQogCkBAIC0xNjM3LDYgKzE2NTEsNDAgQEAKIAlwZXJmX3BtdV9lbmFibGUocG11KTsKIAlyZXR1cm4gMDsKIH0KKy8qCisgKiBhIGZha2VfY3B1YyBpcyB1c2VkIHRvIHZhbGlkYXRlIGV2ZW50IGdyb3Vwcy4gRHVlIHRvCisgKiB0aGUgZXh0cmEgcmVnIGxvZ2ljLCB3ZSBuZWVkIHRvIGFsc28gYWxsb2NhdGUgYSBmYWtlCisgKiBwZXJfY29yZSBhbmQgcGVyX2NwdSBzdHJ1Y3R1cmUuIE90aGVyd2lzZSwgZ3JvdXAgZXZlbnRzCisgKiB1c2luZyBleHRyYSByZWcgbWF5IGNvbmZsaWN0IHdpdGhvdXQgdGhlIGtlcm5lbCBiZWluZworICogYWJsZSB0byBjYXRjaCB0aGlzIHdoZW4gdGhlIGxhc3QgZXZlbnQgZ2V0cyBhZGRlZCB0bworICogdGhlIGdyb3VwLgorICovCitzdGF0aWMgdm9pZCBmcmVlX2Zha2VfY3B1YyhzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YykKK3sKKwlrZnJlZShjcHVjLT5zaGFyZWRfcmVncyk7CisJa2ZyZWUoY3B1Yyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqYWxsb2NhdGVfZmFrZV9jcHVjKHZvaWQpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWM7CisJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwljcHVjID0ga3phbGxvYyhzaXplb2YoKmNwdWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNwdWMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJLyogb25seSBuZWVkZWQsIGlmIHdlIGhhdmUgZXh0cmFfcmVncyAqLworCWlmICh4ODZfcG11LmV4dHJhX3JlZ3MpIHsKKwkJY3B1Yy0+c2hhcmVkX3JlZ3MgPSBhbGxvY2F0ZV9zaGFyZWRfcmVncyhjcHUpOworCQlpZiAoIWNwdWMtPnNoYXJlZF9yZWdzKQorCQkJZ290byBlcnJvcjsKKwl9CisJcmV0dXJuIGNwdWM7CitlcnJvcjoKKwlmcmVlX2Zha2VfY3B1YyhjcHVjKTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KIAogLyoKICAqIHZhbGlkYXRlIHRoYXQgd2UgY2FuIHNjaGVkdWxlIHRoaXMgZXZlbnQKQEAgLTE2NDcsOSArMTY5NSw5IEBACiAJc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKmM7CiAJaW50IHJldCA9IDA7CiAKLQlmYWtlX2NwdWMgPSBrbWFsbG9jKHNpemVvZigqZmFrZV9jcHVjKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOwotCWlmICghZmFrZV9jcHVjKQotCQlyZXR1cm4gLUVOT01FTTsKKwlmYWtlX2NwdWMgPSBhbGxvY2F0ZV9mYWtlX2NwdWMoKTsKKwlpZiAoSVNfRVJSKGZha2VfY3B1YykpCisJCXJldHVybiBQVFJfRVJSKGZha2VfY3B1Yyk7CiAKIAljID0geDg2X3BtdS5nZXRfZXZlbnRfY29uc3RyYWludHMoZmFrZV9jcHVjLCBldmVudCk7CiAKQEAgLTE2NTksNyArMTcwNyw3IEBACiAJaWYgKHg4Nl9wbXUucHV0X2V2ZW50X2NvbnN0cmFpbnRzKQogCQl4ODZfcG11LnB1dF9ldmVudF9jb25zdHJhaW50cyhmYWtlX2NwdWMsIGV2ZW50KTsKIAotCWtmcmVlKGZha2VfY3B1Yyk7CisJZnJlZV9mYWtlX2NwdWMoZmFrZV9jcHVjKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNjc5LDM2ICsxNzI3LDMyIEBACiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmxlYWRlciA9IGV2ZW50LT5ncm91cF9sZWFkZXI7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmZha2VfY3B1YzsKLQlpbnQgcmV0LCBuOworCWludCByZXQgPSAtRU5PU1BDLCBuOwogCi0JcmV0ID0gLUVOT01FTTsKLQlmYWtlX2NwdWMgPSBrbWFsbG9jKHNpemVvZigqZmFrZV9jcHVjKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOwotCWlmICghZmFrZV9jcHVjKQotCQlnb3RvIG91dDsKLQorCWZha2VfY3B1YyA9IGFsbG9jYXRlX2Zha2VfY3B1YygpOworCWlmIChJU19FUlIoZmFrZV9jcHVjKSkKKwkJcmV0dXJuIFBUUl9FUlIoZmFrZV9jcHVjKTsKIAkvKgogCSAqIHRoZSBldmVudCBpcyBub3QgeWV0IGNvbm5lY3RlZCB3aXRoIGl0cwogCSAqIHNpYmxpbmdzIHRoZXJlZm9yZSB3ZSBtdXN0IGZpcnN0IGNvbGxlY3QKIAkgKiBleGlzdGluZyBzaWJsaW5ncywgdGhlbiBhZGQgdGhlIG5ldyBldmVudAogCSAqIGJlZm9yZSB3ZSBjYW4gc2ltdWxhdGUgdGhlIHNjaGVkdWxpbmcKIAkgKi8KLQlyZXQgPSAtRU5PU1BDOwogCW4gPSBjb2xsZWN0X2V2ZW50cyhmYWtlX2NwdWMsIGxlYWRlciwgdHJ1ZSk7CiAJaWYgKG4gPCAwKQotCQlnb3RvIG91dF9mcmVlOworCQlnb3RvIG91dDsKIAogCWZha2VfY3B1Yy0+bl9ldmVudHMgPSBuOwogCW4gPSBjb2xsZWN0X2V2ZW50cyhmYWtlX2NwdWMsIGV2ZW50LCBmYWxzZSk7CiAJaWYgKG4gPCAwKQotCQlnb3RvIG91dF9mcmVlOworCQlnb3RvIG91dDsKIAogCWZha2VfY3B1Yy0+bl9ldmVudHMgPSBuOwogCiAJcmV0ID0geDg2X3BtdS5zY2hlZHVsZV9ldmVudHMoZmFrZV9jcHVjLCBuLCBOVUxMKTsKIAotb3V0X2ZyZWU6Ci0Ja2ZyZWUoZmFrZV9jcHVjKTsKIG91dDoKKwlmcmVlX2Zha2VfY3B1YyhmYWtlX2NwdWMpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9hbWQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9hbWQuYwppbmRleCBmZTI5YzFkLi45NDFjYWEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2FtZC5jCkBAIC04OSw2ICs4OSwyMCBAQAogCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAogCX0sCiAgfSwKKyBbIEMoTk9ERSkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweGI4ZTksIC8qIENQVSBSZXF1ZXN0IHRvIE1lbW9yeSwgbCtyICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHg5OGU5LCAvKiBDUFUgUmVxdWVzdCB0byBNZW1vcnksIHIgICAqLworCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCX0sCisgfSwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbC5jCmluZGV4IDQxMTc4YzguLjQ1ZmJiOGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbC5jCkBAIC0xLDI1ICsxLDE1IEBACiAjaWZkZWYgQ09ORklHX0NQVV9TVVBfSU5URUwKIAotI2RlZmluZSBNQVhfRVhUUkFfUkVHUyAyCi0KIC8qCi0gKiBQZXIgcmVnaXN0ZXIgc3RhdGUuCisgKiBQZXIgY29yZS9jcHUgc3RhdGUKKyAqCisgKiBVc2VkIHRvIGNvb3JkaW5hdGUgc2hhcmVkIHJlZ2lzdGVycyBiZXR3ZWVuIEhUIHRocmVhZHMgb3IKKyAqIGFtb25nIGV2ZW50cyBvbiBhIHNpbmdsZSBQTVUuCiAgKi8KLXN0cnVjdCBlcl9hY2NvdW50IHsKLQlpbnQJCQlyZWY7CQkvKiByZWZlcmVuY2UgY291bnQgKi8KLQl1bnNpZ25lZCBpbnQJCWV4dHJhX3JlZzsJLyogZXh0cmEgTVNSIG51bWJlciAqLwotCXU2NAkJCWV4dHJhX2NvbmZpZzsJLyogZXh0cmEgTVNSIGNvbmZpZyAqLwotfTsKLQotLyoKLSAqIFBlciBjb3JlIHN0YXRlCi0gKiBUaGlzIHVzZWQgdG8gY29vcmRpbmF0ZSBzaGFyZWQgcmVnaXN0ZXJzIGZvciBIVCB0aHJlYWRzLgotICovCi1zdHJ1Y3QgaW50ZWxfcGVyY29yZSB7Ci0JcmF3X3NwaW5sb2NrX3QJCWxvY2s7CQkvKiBwcm90ZWN0IHN0cnVjdHVyZSAqLwotCXN0cnVjdCBlcl9hY2NvdW50CXJlZ3NbTUFYX0VYVFJBX1JFR1NdOwotCWludAkJCXJlZmNudDsJCS8qIG51bWJlciBvZiB0aHJlYWRzICovCi0JdW5zaWduZWQJCWNvcmVfaWQ7CitzdHJ1Y3QgaW50ZWxfc2hhcmVkX3JlZ3MgeworCXN0cnVjdCBlcl9hY2NvdW50ICAgICAgIHJlZ3NbRVhUUkFfUkVHX01BWF07CisJaW50ICAgICAgICAgICAgICAgICAgICAgcmVmY250OwkJLyogcGVyLWNvcmU6ICNIVCB0aHJlYWRzICovCisJdW5zaWduZWQgICAgICAgICAgICAgICAgY29yZV9pZDsJLyogcGVyLWNvcmU6IGNvcmUgaWQgKi8KIH07CiAKIC8qCkBAIC04OCwxNiArNzgsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBleHRyYV9yZWcgaW50ZWxfbmVoYWxlbV9leHRyYV9yZWdzW10gX19yZWFkX21vc3RseSA9CiB7Ci0JSU5URUxfRVZFTlRfRVhUUkFfUkVHKDB4YjcsIE1TUl9PRkZDT1JFX1JTUF8wLCAweGZmZmYpLAorCUlOVEVMX0VWRU5UX0VYVFJBX1JFRygweGI3LCBNU1JfT0ZGQ09SRV9SU1BfMCwgMHhmZmZmLCBSU1BfMCksCiAJRVZFTlRfRVhUUkFfRU5ECiB9OwogCi1zdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgaW50ZWxfbmVoYWxlbV9wZXJjb3JlX2NvbnN0cmFpbnRzW10gX19yZWFkX21vc3RseSA9Ci17Ci0JSU5URUxfRVZFTlRfQ09OU1RSQUlOVCgweGI3LCAwKSwKLQlFVkVOVF9DT05TVFJBSU5UX0VORAotfTsKLQogc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGludGVsX3dlc3RtZXJlX2V2ZW50X2NvbnN0cmFpbnRzW10gX19yZWFkX21vc3RseSA9CiB7CiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwYzAsIDApLCAvKiBJTlNUX1JFVElSRUQuQU5ZICovCkBAIC0xMTYsOCArMTAwLDYgQEAKIAlGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDAzYywgMSksIC8qIENQVV9DTEtfVU5IQUxURUQuQ09SRSAqLwogCS8qIEZJWEVEX0VWRU5UX0NPTlNUUkFJTlQoMHgwMTNjLCAyKSwgQ1BVX0NMS19VTkhBTFRFRC5SRUYgKi8KIAlJTlRFTF9FVkVOVF9DT05TVFJBSU5UKDB4NDgsIDB4NCksIC8qIEwxRF9QRU5EX01JU1MuUEVORElORyAqLwotCUlOVEVMX0VWRU5UX0NPTlNUUkFJTlQoMHhiNywgMHgxKSwgLyogT0ZGX0NPUkVfUkVTUE9OU0VfMCAqLwotCUlOVEVMX0VWRU5UX0NPTlNUUkFJTlQoMHhiYiwgMHg4KSwgLyogT0ZGX0NPUkVfUkVTUE9OU0VfMSAqLwogCUlOVEVMX1VFVkVOVF9DT05TVFJBSU5UKDB4MDFjMCwgMHgyKSwgLyogSU5TVF9SRVRJUkVELlBSRUNfRElTVCAqLwogCUlOVEVMX0VWRU5UX0NPTlNUUkFJTlQoMHhjZCwgMHg4KSwgLyogTUVNX1RSQU5TX1JFVElSRUQuTE9BRF9MQVRFTkNZICovCiAJRVZFTlRfQ09OU1RSQUlOVF9FTkQKQEAgLTEyNSwxNSArMTA3LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgZXh0cmFfcmVnIGludGVsX3dlc3RtZXJlX2V4dHJhX3JlZ3NbXSBfX3JlYWRfbW9zdGx5ID0KIHsKLQlJTlRFTF9FVkVOVF9FWFRSQV9SRUcoMHhiNywgTVNSX09GRkNPUkVfUlNQXzAsIDB4ZmZmZiksCi0JSU5URUxfRVZFTlRfRVhUUkFfUkVHKDB4YmIsIE1TUl9PRkZDT1JFX1JTUF8xLCAweGZmZmYpLAorCUlOVEVMX0VWRU5UX0VYVFJBX1JFRygweGI3LCBNU1JfT0ZGQ09SRV9SU1BfMCwgMHhmZmZmLCBSU1BfMCksCisJSU5URUxfRVZFTlRfRVhUUkFfUkVHKDB4YmIsIE1TUl9PRkZDT1JFX1JTUF8xLCAweGZmZmYsIFJTUF8xKSwKIAlFVkVOVF9FWFRSQV9FTkQKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBpbnRlbF93ZXN0bWVyZV9wZXJjb3JlX2NvbnN0cmFpbnRzW10gX19yZWFkX21vc3RseSA9CitzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgaW50ZWxfdjFfZXZlbnRfY29uc3RyYWludHNbXSBfX3JlYWRfbW9zdGx5ID0KIHsKLQlJTlRFTF9FVkVOVF9DT05TVFJBSU5UKDB4YjcsIDApLAotCUlOVEVMX0VWRU5UX0NPTlNUUkFJTlQoMHhiYiwgMCksCiAJRVZFTlRfQ09OU1RSQUlOVF9FTkQKIH07CiAKQEAgLTE0NSw2ICsxMjUsMTIgQEAKIAlFVkVOVF9DT05TVFJBSU5UX0VORAogfTsKIAorc3RhdGljIHN0cnVjdCBleHRyYV9yZWcgaW50ZWxfc25iX2V4dHJhX3JlZ3NbXSBfX3JlYWRfbW9zdGx5ID0geworCUlOVEVMX0VWRU5UX0VYVFJBX1JFRygweGI3LCBNU1JfT0ZGQ09SRV9SU1BfMCwgMHgzZmZmZmZmZmZmdWxsLCBSU1BfMCksCisJSU5URUxfRVZFTlRfRVhUUkFfUkVHKDB4YmIsIE1TUl9PRkZDT1JFX1JTUF8xLCAweDNmZmZmZmZmZmZ1bGwsIFJTUF8xKSwKKwlFVkVOVF9FWFRSQV9FTkQKK307CisKIHN0YXRpYyB1NjQgaW50ZWxfcG11X2V2ZW50X21hcChpbnQgaHdfZXZlbnQpCiB7CiAJcmV0dXJuIGludGVsX3BlcmZtb25fZXZlbnRfbWFwW2h3X2V2ZW50XTsKQEAgLTI0NSw2ICsyMzEsMjEgQEAKIAkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKIAl9LAogIH0sCisgWyBDKE5PREUpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKyB9LAorCiB9OwogCiBzdGF0aWMgX19pbml0Y29uc3QgY29uc3QgdTY0IHdlc3RtZXJlX2h3X2NhY2hlX2V2ZW50X2lkcwpAQCAtMzQ2LDYgKzM0NywyMCBAQAogCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAogCX0sCiAgfSwKKyBbIEMoTk9ERSkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAxYjcsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMWI3LAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDFiNywKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAxYjcsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMWI3LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDFiNywKKwl9LAorIH0sCiB9OwogCiAvKgpAQCAtMzk4LDcgKzQxMywyMSBAQAogCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IE5ITV9ETU5EX1BSRUZFVENIfE5ITV9MM19BQ0NFU1MsCiAJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gTkhNX0RNTkRfUFJFRkVUQ0h8TkhNX0wzX01JU1MsCiAJfSwKLSB9CisgfSwKKyBbIEMoTk9ERSkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSBOSE1fRE1ORF9SRUFEfE5ITV9BTExfRFJBTSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSBOSE1fRE1ORF9SRUFEfE5ITV9SRU1PVEVfRFJBTSwKKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSBOSE1fRE1ORF9XUklURXxOSE1fQUxMX0RSQU0sCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gTkhNX0RNTkRfV1JJVEV8TkhNX1JFTU9URV9EUkFNLAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IE5ITV9ETU5EX1BSRUZFVENIfE5ITV9BTExfRFJBTSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSBOSE1fRE1ORF9QUkVGRVRDSHxOSE1fUkVNT1RFX0RSQU0sCisJfSwKKyB9LAogfTsKIAogc3RhdGljIF9faW5pdGNvbnN0IGNvbnN0IHU2NCBuZWhhbGVtX2h3X2NhY2hlX2V2ZW50X2lkcwpAQCAtNTAwLDYgKzUyOSwyMCBAQAogCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAogCX0sCiAgfSwKKyBbIEMoTk9ERSkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAxYjcsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMWI3LAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDFiNywKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAxYjcsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMWI3LAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDFiNywKKwl9LAorIH0sCiB9OwogCiBzdGF0aWMgX19pbml0Y29uc3QgY29uc3QgdTY0IGNvcmUyX2h3X2NhY2hlX2V2ZW50X2lkcwpAQCAtMTAwMyw3ICsxMDQ2LDcgQEAKIAogCQlkYXRhLnBlcmlvZCA9IGV2ZW50LT5ody5sYXN0X3BlcmlvZDsKIAotCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgMSwgJmRhdGEsIHJlZ3MpKQorCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgJmRhdGEsIHJlZ3MpKQogCQkJeDg2X3BtdV9zdG9wKGV2ZW50LCAwKTsKIAl9CiAKQEAgLTEwMzcsNjUgKzEwODAsMTIxIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqCi1pbnRlbF9wZXJjb3JlX2NvbnN0cmFpbnRzKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLCBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCitzdGF0aWMgYm9vbCBpbnRlbF90cnlfYWx0X2VyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IG9yaWdfaWR4KQogewotCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwotCXVuc2lnbmVkIGludCBlID0gaHdjLT5jb25maWcgJiBBUkNIX1BFUkZNT05fRVZFTlRTRUxfRVZFTlQ7Ci0Jc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKmM7Ci0Jc3RydWN0IGludGVsX3BlcmNvcmUgKnBjOwotCXN0cnVjdCBlcl9hY2NvdW50ICplcmE7Ci0JaW50IGk7Ci0JaW50IGZyZWVfc2xvdDsKLQlpbnQgZm91bmQ7CisJaWYgKCEoeDg2X3BtdS5lcl9mbGFncyAmIEVSRl9IQVNfUlNQXzEpKQorCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoIXg4Nl9wbXUucGVyY29yZV9jb25zdHJhaW50cyB8fCBod2MtPmV4dHJhX2FsbG9jKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvciAoYyA9IHg4Nl9wbXUucGVyY29yZV9jb25zdHJhaW50czsgYy0+Y21hc2s7IGMrKykgewotCQlpZiAoZSAhPSBjLT5jb2RlKQotCQkJY29udGludWU7Ci0KLQkJLyoKLQkJICogQWxsb2NhdGUgcmVzb3VyY2UgcGVyIGNvcmUuCi0JCSAqLwotCQlwYyA9IGNwdWMtPnBlcl9jb3JlOwotCQlpZiAoIXBjKQotCQkJYnJlYWs7Ci0JCWMgPSAmZW1wdHljb25zdHJhaW50OwotCQlyYXdfc3Bpbl9sb2NrKCZwYy0+bG9jayk7Ci0JCWZyZWVfc2xvdCA9IC0xOwotCQlmb3VuZCA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfRVhUUkFfUkVHUzsgaSsrKSB7Ci0JCQllcmEgPSAmcGMtPnJlZ3NbaV07Ci0JCQlpZiAoZXJhLT5yZWYgPiAwICYmIGh3Yy0+ZXh0cmFfcmVnID09IGVyYS0+ZXh0cmFfcmVnKSB7Ci0JCQkJLyogQWxsb3cgc2hhcmluZyBzYW1lIGNvbmZpZyAqLwotCQkJCWlmIChod2MtPmV4dHJhX2NvbmZpZyA9PSBlcmEtPmV4dHJhX2NvbmZpZykgewotCQkJCQllcmEtPnJlZisrOwotCQkJCQljcHVjLT5wZXJjb3JlX3VzZWQgPSAxOwotCQkJCQlod2MtPmV4dHJhX2FsbG9jID0gMTsKLQkJCQkJYyA9IE5VTEw7Ci0JCQkJfQotCQkJCS8qIGVsc2UgY29uZmxpY3QgKi8KLQkJCQlmb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKGVyYS0+cmVmID09IDAgJiYgZnJlZV9zbG90ID09IC0xKQotCQkJCWZyZWVfc2xvdCA9IGk7Ci0JCX0KLQkJaWYgKCFmb3VuZCAmJiBmcmVlX3Nsb3QgIT0gLTEpIHsKLQkJCWVyYSA9ICZwYy0+cmVnc1tmcmVlX3Nsb3RdOwotCQkJZXJhLT5yZWYgPSAxOwotCQkJZXJhLT5leHRyYV9yZWcgPSBod2MtPmV4dHJhX3JlZzsKLQkJCWVyYS0+ZXh0cmFfY29uZmlnID0gaHdjLT5leHRyYV9jb25maWc7Ci0JCQljcHVjLT5wZXJjb3JlX3VzZWQgPSAxOwotCQkJaHdjLT5leHRyYV9hbGxvYyA9IDE7Ci0JCQljID0gTlVMTDsKLQkJfQotCQlyYXdfc3Bpbl91bmxvY2soJnBjLT5sb2NrKTsKLQkJcmV0dXJuIGM7CisJaWYgKGV2ZW50LT5ody5leHRyYV9yZWcuaWR4ID09IEVYVFJBX1JFR19SU1BfMCkgeworCQlldmVudC0+aHcuY29uZmlnICY9IH5JTlRFTF9BUkNIX0VWRU5UX01BU0s7CisJCWV2ZW50LT5ody5jb25maWcgfD0gMHgwMWJiOworCQlldmVudC0+aHcuZXh0cmFfcmVnLmlkeCA9IEVYVFJBX1JFR19SU1BfMTsKKwkJZXZlbnQtPmh3LmV4dHJhX3JlZy5yZWcgPSBNU1JfT0ZGQ09SRV9SU1BfMTsKKwl9IGVsc2UgaWYgKGV2ZW50LT5ody5leHRyYV9yZWcuaWR4ID09IEVYVFJBX1JFR19SU1BfMSkgeworCQlldmVudC0+aHcuY29uZmlnICY9IH5JTlRFTF9BUkNIX0VWRU5UX01BU0s7CisJCWV2ZW50LT5ody5jb25maWcgfD0gMHgwMWI3OworCQlldmVudC0+aHcuZXh0cmFfcmVnLmlkeCA9IEVYVFJBX1JFR19SU1BfMDsKKwkJZXZlbnQtPmh3LmV4dHJhX3JlZy5yZWcgPSBNU1JfT0ZGQ09SRV9SU1BfMDsKIAl9CiAKLQlyZXR1cm4gTlVMTDsKKwlpZiAoZXZlbnQtPmh3LmV4dHJhX3JlZy5pZHggPT0gb3JpZ19pZHgpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCisvKgorICogbWFuYWdlIGFsbG9jYXRpb24gb2Ygc2hhcmVkIGV4dHJhIG1zciBmb3IgY2VydGFpbiBldmVudHMKKyAqCisgKiBzaGFyaW5nIGNhbiBiZToKKyAqIHBlci1jcHU6IHRvIGJlIHNoYXJlZCBiZXR3ZWVuIHRoZSB2YXJpb3VzIGV2ZW50cyBvbiBhIHNpbmdsZSBQTVUKKyAqIHBlci1jb3JlOiBwZXItY3B1ICsgc2hhcmVkIGJ5IEhUIHRocmVhZHMKKyAqLworc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50ICoKK19faW50ZWxfc2hhcmVkX3JlZ19nZXRfY29uc3RyYWludHMoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCisJCQkJICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBldmVudF9jb25zdHJhaW50ICpjID0gJmVtcHR5Y29uc3RyYWludDsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudF9leHRyYSAqcmVnID0gJmV2ZW50LT5ody5leHRyYV9yZWc7CisJc3RydWN0IGVyX2FjY291bnQgKmVyYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvcmlnX2lkeCA9IHJlZy0+aWR4OworCisJLyogYWxyZWFkeSBhbGxvY2F0ZWQgc2hhcmVkIG1zciAqLworCWlmIChyZWctPmFsbG9jKQorCQlyZXR1cm4gJnVuY29uc3RyYWluZWQ7CisKK2FnYWluOgorCWVyYSA9ICZjcHVjLT5zaGFyZWRfcmVncy0+cmVnc1tyZWctPmlkeF07CisJLyoKKwkgKiB3ZSB1c2Ugc3Bpbl9sb2NrX2lycXNhdmUoKSB0byBhdm9pZCBsb2NrZGVwIGlzc3VlcyB3aGVuCisJICogcGFzc2luZyBhIGZha2UgY3B1YworCSAqLworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXJhLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWF0b21pY19yZWFkKCZlcmEtPnJlZikgfHwgZXJhLT5jb25maWcgPT0gcmVnLT5jb25maWcpIHsKKworCQkvKiBsb2NrIGluIG1zciB2YWx1ZSAqLworCQllcmEtPmNvbmZpZyA9IHJlZy0+Y29uZmlnOworCQllcmEtPnJlZyA9IHJlZy0+cmVnOworCisJCS8qIG9uZSBtb3JlIHVzZXIgKi8KKwkJYXRvbWljX2luYygmZXJhLT5yZWYpOworCisJCS8qIG5vIG5lZWQgdG8gcmVhbGxvY2F0ZSBkdXJpbmcgaW5jcmVtZW50YWwgZXZlbnQgc2NoZWR1bGluZyAqLworCQlyZWctPmFsbG9jID0gMTsKKworCQkvKgorCQkgKiBBbGwgZXZlbnRzIHVzaW5nIGV4dHJhX3JlZyBhcmUgdW5jb25zdHJhaW5lZC4KKwkJICogQXZvaWRzIGNhbGxpbmcgeDg2X2dldF9ldmVudF9jb25zdHJhaW50cygpCisJCSAqCisJCSAqIE11c3QgcmV2aXNpdCBpZiBleHRyYV9yZWcgY29udHJvbGxpbmcgZXZlbnRzCisJCSAqIGV2ZXIgaGF2ZSBjb25zdHJhaW50cy4gV29yc3QgY2FzZSB3ZSBnbyB0aHJvdWdoCisJCSAqIHRoZSByZWd1bGFyIGV2ZW50IGNvbnN0cmFpbnQgdGFibGUuCisJCSAqLworCQljID0gJnVuY29uc3RyYWluZWQ7CisJfSBlbHNlIGlmIChpbnRlbF90cnlfYWx0X2VyKGV2ZW50LCBvcmlnX2lkeCkpIHsKKwkJcmF3X3NwaW5fdW5sb2NrKCZlcmEtPmxvY2spOworCQlnb3RvIGFnYWluOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXJhLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHZvaWQKK19faW50ZWxfc2hhcmVkX3JlZ19wdXRfY29uc3RyYWludHMoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCisJCQkJICAgc3RydWN0IGh3X3BlcmZfZXZlbnRfZXh0cmEgKnJlZykKK3sKKwlzdHJ1Y3QgZXJfYWNjb3VudCAqZXJhOworCisJLyoKKwkgKiBvbmx5IHB1dCBjb25zdHJhaW50IGlmIGV4dHJhIHJlZyB3YXMgYWN0dWFsbHkKKwkgKiBhbGxvY2F0ZWQuIEFsc28gdGFrZXMgY2FyZSBvZiBldmVudCB3aGljaCBkbworCSAqIG5vdCB1c2UgYW4gZXh0cmEgc2hhcmVkIHJlZworCSAqLworCWlmICghcmVnLT5hbGxvYykKKwkJcmV0dXJuOworCisJZXJhID0gJmNwdWMtPnNoYXJlZF9yZWdzLT5yZWdzW3JlZy0+aWR4XTsKKworCS8qIG9uZSBmZXdlciB1c2VyICovCisJYXRvbWljX2RlYygmZXJhLT5yZWYpOworCisJLyogYWxsb2NhdGUgYWdhaW4gbmV4dCB0aW1lICovCisJcmVnLT5hbGxvYyA9IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqCitpbnRlbF9zaGFyZWRfcmVnc19jb25zdHJhaW50cyhzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywKKwkJCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqYyA9IE5VTEw7CisKKwlpZiAoZXZlbnQtPmh3LmV4dHJhX3JlZy5pZHggIT0gRVhUUkFfUkVHX05PTkUpCisJCWMgPSBfX2ludGVsX3NoYXJlZF9yZWdfZ2V0X2NvbnN0cmFpbnRzKGNwdWMsIGV2ZW50KTsKKworCXJldHVybiBjOwogfQogCiBzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKgpAQCAtMTExMSw0OSArMTIxMCwyOCBAQAogCWlmIChjKQogCQlyZXR1cm4gYzsKIAotCWMgPSBpbnRlbF9wZXJjb3JlX2NvbnN0cmFpbnRzKGNwdWMsIGV2ZW50KTsKKwljID0gaW50ZWxfc2hhcmVkX3JlZ3NfY29uc3RyYWludHMoY3B1YywgZXZlbnQpOwogCWlmIChjKQogCQlyZXR1cm4gYzsKIAogCXJldHVybiB4ODZfZ2V0X2V2ZW50X2NvbnN0cmFpbnRzKGNwdWMsIGV2ZW50KTsKIH0KIAorc3RhdGljIHZvaWQKK2ludGVsX3B1dF9zaGFyZWRfcmVnc19ldmVudF9jb25zdHJhaW50cyhzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywKKwkJCQkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50X2V4dHJhICpyZWc7CisKKwlyZWcgPSAmZXZlbnQtPmh3LmV4dHJhX3JlZzsKKwlpZiAocmVnLT5pZHggIT0gRVhUUkFfUkVHX05PTkUpCisJCV9faW50ZWxfc2hhcmVkX3JlZ19wdXRfY29uc3RyYWludHMoY3B1YywgcmVnKTsKK30KKwogc3RhdGljIHZvaWQgaW50ZWxfcHV0X2V2ZW50X2NvbnN0cmFpbnRzKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAogCQkJCQlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7Ci0Jc3RydWN0IGV4dHJhX3JlZyAqZXI7Ci0Jc3RydWN0IGludGVsX3BlcmNvcmUgKnBjOwotCXN0cnVjdCBlcl9hY2NvdW50ICplcmE7Ci0Jc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7Ci0JaW50IGksIGFsbHJlZjsKLQotCWlmICghY3B1Yy0+cGVyY29yZV91c2VkKQotCQlyZXR1cm47Ci0KLQlmb3IgKGVyID0geDg2X3BtdS5leHRyYV9yZWdzOyBlci0+bXNyOyBlcisrKSB7Ci0JCWlmIChlci0+ZXZlbnQgIT0gKGh3Yy0+Y29uZmlnICYgZXItPmNvbmZpZ19tYXNrKSkKLQkJCWNvbnRpbnVlOwotCi0JCXBjID0gY3B1Yy0+cGVyX2NvcmU7Ci0JCXJhd19zcGluX2xvY2soJnBjLT5sb2NrKTsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9FWFRSQV9SRUdTOyBpKyspIHsKLQkJCWVyYSA9ICZwYy0+cmVnc1tpXTsKLQkJCWlmIChlcmEtPnJlZiA+IDAgJiYKLQkJCSAgICBlcmEtPmV4dHJhX2NvbmZpZyA9PSBod2MtPmV4dHJhX2NvbmZpZyAmJgotCQkJICAgIGVyYS0+ZXh0cmFfcmVnID09IGVyLT5tc3IpIHsKLQkJCQllcmEtPnJlZi0tOwotCQkJCWh3Yy0+ZXh0cmFfYWxsb2MgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFsbHJlZiA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfRVhUUkFfUkVHUzsgaSsrKQotCQkJYWxscmVmICs9IHBjLT5yZWdzW2ldLnJlZjsKLQkJaWYgKGFsbHJlZiA9PSAwKQotCQkJY3B1Yy0+cGVyY29yZV91c2VkID0gMDsKLQkJcmF3X3NwaW5fdW5sb2NrKCZwYy0+bG9jayk7Ci0JCWJyZWFrOwotCX0KKwlpbnRlbF9wdXRfc2hhcmVkX3JlZ3NfZXZlbnRfY29uc3RyYWludHMoY3B1YywgZXZlbnQpOwogfQogCiBzdGF0aWMgaW50IGludGVsX3BtdV9od19jb25maWcoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQpAQCAtMTIzMSwyMCArMTMwOSwzNiBAQAogCS5ldmVudF9jb25zdHJhaW50cwk9IGludGVsX2NvcmVfZXZlbnRfY29uc3RyYWludHMsCiB9OwogCitzdGF0aWMgc3RydWN0IGludGVsX3NoYXJlZF9yZWdzICphbGxvY2F0ZV9zaGFyZWRfcmVncyhpbnQgY3B1KQoreworCXN0cnVjdCBpbnRlbF9zaGFyZWRfcmVncyAqcmVnczsKKwlpbnQgaTsKKworCXJlZ3MgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBpbnRlbF9zaGFyZWRfcmVncyksCisJCQkgICAgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoY3B1KSk7CisJaWYgKHJlZ3MpIHsKKwkJLyoKKwkJICogaW5pdGlhbGl6ZSB0aGUgbG9ja3MgdG8ga2VlcCBsb2NrZGVwIGhhcHB5CisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgRVhUUkFfUkVHX01BWDsgaSsrKQorCQkJcmF3X3NwaW5fbG9ja19pbml0KCZyZWdzLT5yZWdzW2ldLmxvY2spOworCisJCXJlZ3MtPmNvcmVfaWQgPSAtMTsKKwl9CisJcmV0dXJuIHJlZ3M7Cit9CisKIHN0YXRpYyBpbnQgaW50ZWxfcG11X2NwdV9wcmVwYXJlKGludCBjcHUpCiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmcGVyX2NwdShjcHVfaHdfZXZlbnRzLCBjcHUpOwogCi0JaWYgKCFjcHVfaGFzX2h0X3NpYmxpbmdzKCkpCisJaWYgKCF4ODZfcG11LmV4dHJhX3JlZ3MpCiAJCXJldHVybiBOT1RJRllfT0s7CiAKLQljcHVjLT5wZXJfY29yZSA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGludGVsX3BlcmNvcmUpLAotCQkJCSAgICAgIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGNwdSkpOwotCWlmICghY3B1Yy0+cGVyX2NvcmUpCisJY3B1Yy0+c2hhcmVkX3JlZ3MgPSBhbGxvY2F0ZV9zaGFyZWRfcmVncyhjcHUpOworCWlmICghY3B1Yy0+c2hhcmVkX3JlZ3MpCiAJCXJldHVybiBOT1RJRllfQkFEOwogCi0JcmF3X3NwaW5fbG9ja19pbml0KCZjcHVjLT5wZXJfY29yZS0+bG9jayk7Ci0JY3B1Yy0+cGVyX2NvcmUtPmNvcmVfaWQgPSAtMTsKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCkBAIC0xMjYwLDMyICsxMzU0LDM0IEBACiAJICovCiAJaW50ZWxfcG11X2xicl9yZXNldCgpOwogCi0JaWYgKCFjcHVfaGFzX2h0X3NpYmxpbmdzKCkpCisJaWYgKCFjcHVjLT5zaGFyZWRfcmVncyB8fCAoeDg2X3BtdS5lcl9mbGFncyAmIEVSRl9OT19IVF9TSEFSSU5HKSkKIAkJcmV0dXJuOwogCiAJZm9yX2VhY2hfY3B1KGksIHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKGNwdSkpIHsKLQkJc3RydWN0IGludGVsX3BlcmNvcmUgKnBjID0gcGVyX2NwdShjcHVfaHdfZXZlbnRzLCBpKS5wZXJfY29yZTsKKwkJc3RydWN0IGludGVsX3NoYXJlZF9yZWdzICpwYzsKIAorCQlwYyA9IHBlcl9jcHUoY3B1X2h3X2V2ZW50cywgaSkuc2hhcmVkX3JlZ3M7CiAJCWlmIChwYyAmJiBwYy0+Y29yZV9pZCA9PSBjb3JlX2lkKSB7Ci0JCQlrZnJlZShjcHVjLT5wZXJfY29yZSk7Ci0JCQljcHVjLT5wZXJfY29yZSA9IHBjOworCQkJa2ZyZWUoY3B1Yy0+c2hhcmVkX3JlZ3MpOworCQkJY3B1Yy0+c2hhcmVkX3JlZ3MgPSBwYzsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JY3B1Yy0+cGVyX2NvcmUtPmNvcmVfaWQgPSBjb3JlX2lkOwotCWNwdWMtPnBlcl9jb3JlLT5yZWZjbnQrKzsKKwljcHVjLT5zaGFyZWRfcmVncy0+Y29yZV9pZCA9IGNvcmVfaWQ7CisJY3B1Yy0+c2hhcmVkX3JlZ3MtPnJlZmNudCsrOwogfQogCiBzdGF0aWMgdm9pZCBpbnRlbF9wbXVfY3B1X2R5aW5nKGludCBjcHUpCiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmcGVyX2NwdShjcHVfaHdfZXZlbnRzLCBjcHUpOwotCXN0cnVjdCBpbnRlbF9wZXJjb3JlICpwYyA9IGNwdWMtPnBlcl9jb3JlOworCXN0cnVjdCBpbnRlbF9zaGFyZWRfcmVncyAqcGM7CiAKKwlwYyA9IGNwdWMtPnNoYXJlZF9yZWdzOwogCWlmIChwYykgewogCQlpZiAocGMtPmNvcmVfaWQgPT0gLTEgfHwgLS1wYy0+cmVmY250ID09IDApCiAJCQlrZnJlZShwYyk7Ci0JCWNwdWMtPnBlcl9jb3JlID0gTlVMTDsKKwkJY3B1Yy0+c2hhcmVkX3JlZ3MgPSBOVUxMOwogCX0KIAogCWZpbmlfZGVidWdfc3RvcmVfb25fY3B1KGNwdSk7CkBAIC0xNDM2LDcgKzE1MzIsNiBAQAogCiAJCXg4Nl9wbXUuZXZlbnRfY29uc3RyYWludHMgPSBpbnRlbF9uZWhhbGVtX2V2ZW50X2NvbnN0cmFpbnRzOwogCQl4ODZfcG11LnBlYnNfY29uc3RyYWludHMgPSBpbnRlbF9uZWhhbGVtX3BlYnNfZXZlbnRfY29uc3RyYWludHM7Ci0JCXg4Nl9wbXUucGVyY29yZV9jb25zdHJhaW50cyA9IGludGVsX25laGFsZW1fcGVyY29yZV9jb25zdHJhaW50czsKIAkJeDg2X3BtdS5lbmFibGVfYWxsID0gaW50ZWxfcG11X25obV9lbmFibGVfYWxsOwogCQl4ODZfcG11LmV4dHJhX3JlZ3MgPSBpbnRlbF9uZWhhbGVtX2V4dHJhX3JlZ3M7CiAKQEAgLTE0ODEsMTAgKzE1NzYsMTAgQEAKIAkJaW50ZWxfcG11X2xicl9pbml0X25obSgpOwogCiAJCXg4Nl9wbXUuZXZlbnRfY29uc3RyYWludHMgPSBpbnRlbF93ZXN0bWVyZV9ldmVudF9jb25zdHJhaW50czsKLQkJeDg2X3BtdS5wZXJjb3JlX2NvbnN0cmFpbnRzID0gaW50ZWxfd2VzdG1lcmVfcGVyY29yZV9jb25zdHJhaW50czsKIAkJeDg2X3BtdS5lbmFibGVfYWxsID0gaW50ZWxfcG11X25obV9lbmFibGVfYWxsOwogCQl4ODZfcG11LnBlYnNfY29uc3RyYWludHMgPSBpbnRlbF93ZXN0bWVyZV9wZWJzX2V2ZW50X2NvbnN0cmFpbnRzOwogCQl4ODZfcG11LmV4dHJhX3JlZ3MgPSBpbnRlbF93ZXN0bWVyZV9leHRyYV9yZWdzOworCQl4ODZfcG11LmVyX2ZsYWdzIHw9IEVSRl9IQVNfUlNQXzE7CiAKIAkJLyogVU9QU19JU1NVRUQuU1RBTExFRF9DWUNMRVMgKi8KIAkJaW50ZWxfcGVyZm1vbl9ldmVudF9tYXBbUEVSRl9DT1VOVF9IV19TVEFMTEVEX0NZQ0xFU19GUk9OVEVORF0gPSAweDE4MDAxMGU7CkBAIC0xNTAyLDYgKzE1OTcsMTAgQEAKIAogCQl4ODZfcG11LmV2ZW50X2NvbnN0cmFpbnRzID0gaW50ZWxfc25iX2V2ZW50X2NvbnN0cmFpbnRzOwogCQl4ODZfcG11LnBlYnNfY29uc3RyYWludHMgPSBpbnRlbF9zbmJfcGVic19ldmVudHM7CisJCXg4Nl9wbXUuZXh0cmFfcmVncyA9IGludGVsX3NuYl9leHRyYV9yZWdzOworCQkvKiBhbGwgZXh0cmEgcmVncyBhcmUgcGVyLWNwdSB3aGVuIEhUIGlzIG9uICovCisJCXg4Nl9wbXUuZXJfZmxhZ3MgfD0gRVJGX0hBU19SU1BfMTsKKwkJeDg2X3BtdS5lcl9mbGFncyB8PSBFUkZfTk9fSFRfU0hBUklORzsKIAogCQkvKiBVT1BTX0lTU1VFRC5BTlksYz0xLGk9MSB0byBjb3VudCBzdGFsbCBjeWNsZXMgKi8KIAkJaW50ZWxfcGVyZm1vbl9ldmVudF9tYXBbUEVSRl9DT1VOVF9IV19TVEFMTEVEX0NZQ0xFU19GUk9OVEVORF0gPSAweDE4MDAxMGU7CkBAIC0xNTEyLDExICsxNjExLDE5IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJLyoKLQkJICogZGVmYXVsdCBjb25zdHJhaW50cyBmb3IgdjIgYW5kIHVwCi0JCSAqLwotCQl4ODZfcG11LmV2ZW50X2NvbnN0cmFpbnRzID0gaW50ZWxfZ2VuX2V2ZW50X2NvbnN0cmFpbnRzOwotCQlwcl9jb250KCJnZW5lcmljIGFyY2hpdGVjdGVkIHBlcmZtb24sICIpOworCQlzd2l0Y2ggKHg4Nl9wbXUudmVyc2lvbikgeworCQljYXNlIDE6CisJCQl4ODZfcG11LmV2ZW50X2NvbnN0cmFpbnRzID0gaW50ZWxfdjFfZXZlbnRfY29uc3RyYWludHM7CisJCQlwcl9jb250KCJnZW5lcmljIGFyY2hpdGVjdGVkIHBlcmZtb24gdjEsICIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogZGVmYXVsdCBjb25zdHJhaW50cyBmb3IgdjIgYW5kIHVwCisJCQkgKi8KKwkJCXg4Nl9wbXUuZXZlbnRfY29uc3RyYWludHMgPSBpbnRlbF9nZW5fZXZlbnRfY29uc3RyYWludHM7CisJCQlwcl9jb250KCJnZW5lcmljIGFyY2hpdGVjdGVkIHBlcmZtb24sICIpOworCQkJYnJlYWs7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xNTI4LDQgKzE2MzUsOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGludGVsX3NoYXJlZF9yZWdzICphbGxvY2F0ZV9zaGFyZWRfcmVncyhpbnQgY3B1KQoreworCXJldHVybiBOVUxMOworfQogI2VuZGlmIC8qIENPTkZJR19DUFVfU1VQX0lOVEVMICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfZHMuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF9kcy5jCmluZGV4IGJhYjQ5MWIuLjFiMWVmM2EgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF9kcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF9kcy5jCkBAIC0zNDAsNyArMzQwLDcgQEAKIAkgKi8KIAlwZXJmX3ByZXBhcmVfc2FtcGxlKCZoZWFkZXIsICZkYXRhLCBldmVudCwgJnJlZ3MpOwogCi0JaWYgKHBlcmZfb3V0cHV0X2JlZ2luKCZoYW5kbGUsIGV2ZW50LCBoZWFkZXIuc2l6ZSAqICh0b3AgLSBhdCksIDEsIDEpKQorCWlmIChwZXJmX291dHB1dF9iZWdpbigmaGFuZGxlLCBldmVudCwgaGVhZGVyLnNpemUgKiAodG9wIC0gYXQpKSkKIAkJcmV0dXJuIDE7CiAKIAlmb3IgKDsgYXQgPCB0b3A7IGF0KyspIHsKQEAgLTYxNiw3ICs2MTYsNyBAQAogCWVsc2UKIAkJcmVncy5mbGFncyAmPSB+UEVSRl9FRkxBR1NfRVhBQ1Q7CiAKLQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgMSwgJmRhdGEsICZyZWdzKSkKKwlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgJmRhdGEsICZyZWdzKSkKIAkJeDg2X3BtdV9zdG9wKGV2ZW50LCAwKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfcDQuYwppbmRleCBlYWQ1ODRmLi43ODA5ZDJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfcDQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfcDQuYwpAQCAtNTU0LDEzICs1NTQsMTAyIEBACiAJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCiAJfSwKICB9LAorIFsgQyhOT0RFKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCX0sCisgfSwKIH07CiAKKy8qCisgKiBCZWNhdXNlIG9mIE5ldGJ1cnN0IGJlaW5nIHF1aXRlIHJlc3RyaWN0ZWQgaW4gaG93IG1hbnkKKyAqIGlkZW50aWNhbCBldmVudHMgbWF5IHJ1biBzaW11bHRhbmVvdXNseSwgd2UgaW50cm9kdWNlIGV2ZW50IGFsaWFzZXMsCisgKiBpZSB0aGUgZGlmZmVyZW50IGV2ZW50cyB3aGljaCBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYnV0CisgKiB1dGlsaXplIG5vbi1pbnRlcnNlY3RlZCByZXNvdXJjZXMgKEVTQ1IvQ0NDUi9jb3VudGVyIHJlZ2lzdGVycykuCisgKgorICogVGhpcyBhbGxvdyB1cyB0byByZWxheCByZXN0cmljdGlvbnMgYSBiaXQgYW5kIHJ1biB0d28gb3IgbW9yZQorICogaWRlbnRpY2FsIGV2ZW50cyB0b2dldGhlci4KKyAqCisgKiBOZXZlciBzZXQgYW55IGN1c3RvbSBpbnRlcm5hbCBiaXRzIHN1Y2ggYXMgUDRfQ09ORklHX0hULAorICogUDRfQ09ORklHX0FMSUFTQUJMRSBvciBiaXRzIGZvciBQNF9QRUJTX01FVFJJQywgdGhleSBhcmUKKyAqIGVpdGhlciB1cCB0byBkYXRlIGF1dG9tYXRpY2FsbHkgb3Igbm90IGFwcGxpY2FibGUgYXQgYWxsLgorICovCitzdHJ1Y3QgcDRfZXZlbnRfYWxpYXMgeworCXU2NCBvcmlnaW5hbDsKKwl1NjQgYWx0ZXJuYXRpdmU7Cit9IHA0X2V2ZW50X2FsaWFzZXNbXSA9IHsKKwl7CisJCS8qCisJCSAqIE5vbi1oYWx0ZWQgY3ljbGVzIGNhbiBiZSBzdWJzdGl0dXRlZCB3aXRoIG5vbi1zbGVlcGluZyBjeWNsZXMgKHNlZQorCQkgKiBJbnRlbCBTRE0gVm9sM2IgZm9yIGRldGFpbHMpLiBXZSBuZWVkIHRoaXMgYWxpYXMgdG8gYmUgYWJsZQorCQkgKiB0byBydW4gbm1pLXdhdGNoZG9nIGFuZCAncGVyZiB0b3AnIChvciBhbnkgb3RoZXIgdXNlciBzcGFjZSB0b29sCisJCSAqIHdoaWNoIGlzIGludGVyZXN0ZWQgaW4gcnVubmluZyBQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVMpCisJCSAqIHNpbXVsdGFuZW91c2x5LgorCQkgKi8KKwkub3JpZ2luYWwJPQorCQlwNF9jb25maWdfcGFja19lc2NyKFA0X0VTQ1JfRVZFTlQoUDRfRVZFTlRfR0xPQkFMX1BPV0VSX0VWRU5UUykJCXwKKwkJCQkgICAgUDRfRVNDUl9FTUFTS19CSVQoUDRfRVZFTlRfR0xPQkFMX1BPV0VSX0VWRU5UUywgUlVOTklORykpLAorCS5hbHRlcm5hdGl2ZQk9CisJCXA0X2NvbmZpZ19wYWNrX2VzY3IoUDRfRVNDUl9FVkVOVChQNF9FVkVOVF9FWEVDVVRJT05fRVZFTlQpCQl8CisJCQkJICAgIFA0X0VTQ1JfRU1BU0tfQklUKFA0X0VWRU5UX0VYRUNVVElPTl9FVkVOVCwgTkJPR1VTMCl8CisJCQkJICAgIFA0X0VTQ1JfRU1BU0tfQklUKFA0X0VWRU5UX0VYRUNVVElPTl9FVkVOVCwgTkJPR1VTMSl8CisJCQkJICAgIFA0X0VTQ1JfRU1BU0tfQklUKFA0X0VWRU5UX0VYRUNVVElPTl9FVkVOVCwgTkJPR1VTMil8CisJCQkJICAgIFA0X0VTQ1JfRU1BU0tfQklUKFA0X0VWRU5UX0VYRUNVVElPTl9FVkVOVCwgTkJPR1VTMyl8CisJCQkJICAgIFA0X0VTQ1JfRU1BU0tfQklUKFA0X0VWRU5UX0VYRUNVVElPTl9FVkVOVCwgQk9HVVMwKQl8CisJCQkJICAgIFA0X0VTQ1JfRU1BU0tfQklUKFA0X0VWRU5UX0VYRUNVVElPTl9FVkVOVCwgQk9HVVMxKQl8CisJCQkJICAgIFA0X0VTQ1JfRU1BU0tfQklUKFA0X0VWRU5UX0VYRUNVVElPTl9FVkVOVCwgQk9HVVMyKQl8CisJCQkJICAgIFA0X0VTQ1JfRU1BU0tfQklUKFA0X0VWRU5UX0VYRUNVVElPTl9FVkVOVCwgQk9HVVMzKSl8CisJCXA0X2NvbmZpZ19wYWNrX2NjY3IoUDRfQ0NDUl9USFJFU0hPTEQoMTUpIHwgUDRfQ0NDUl9DT01QTEVNRU5UCQl8CisJCQkJICAgIFA0X0NDQ1JfQ09NUEFSRSksCisJfSwKK307CisKK3N0YXRpYyB1NjQgcDRfZ2V0X2FsaWFzX2V2ZW50KHU2NCBjb25maWcpCit7CisJdTY0IGNvbmZpZ19tYXRjaDsKKwlpbnQgaTsKKworCS8qCisJICogT25seSBldmVudCB3aXRoIHNwZWNpYWwgbWFyayBpcyBhbGxvd2VkLAorCSAqIHdlJ3JlIHRvIGJlIHN1cmUgaXQgZGlkbid0IGNvbWUgYXMgbWFsZm9ybWVkCisJICogUkFXIGV2ZW50LgorCSAqLworCWlmICghKGNvbmZpZyAmIFA0X0NPTkZJR19BTElBU0FCTEUpKQorCQlyZXR1cm4gMDsKKworCWNvbmZpZ19tYXRjaCA9IGNvbmZpZyAmIFA0X0NPTkZJR19FVkVOVF9BTElBU19NQVNLOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocDRfZXZlbnRfYWxpYXNlcyk7IGkrKykgeworCQlpZiAoY29uZmlnX21hdGNoID09IHA0X2V2ZW50X2FsaWFzZXNbaV0ub3JpZ2luYWwpIHsKKwkJCWNvbmZpZ19tYXRjaCA9IHA0X2V2ZW50X2FsaWFzZXNbaV0uYWx0ZXJuYXRpdmU7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChjb25maWdfbWF0Y2ggPT0gcDRfZXZlbnRfYWxpYXNlc1tpXS5hbHRlcm5hdGl2ZSkgeworCQkJY29uZmlnX21hdGNoID0gcDRfZXZlbnRfYWxpYXNlc1tpXS5vcmlnaW5hbDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPj0gQVJSQVlfU0laRShwNF9ldmVudF9hbGlhc2VzKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY29uZmlnX21hdGNoIHwgKGNvbmZpZyAmIFA0X0NPTkZJR19FVkVOVF9BTElBU19JTU1VVEFCTEVfQklUUyk7Cit9CisKIHN0YXRpYyB1NjQgcDRfZ2VuZXJhbF9ldmVudHNbUEVSRl9DT1VOVF9IV19NQVhdID0gewogICAvKiBub24taGFsdGVkIENQVSBjbG9ja3MgKi8KICAgW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10gPQogCXA0X2NvbmZpZ19wYWNrX2VzY3IoUDRfRVNDUl9FVkVOVChQNF9FVkVOVF9HTE9CQUxfUE9XRVJfRVZFTlRTKQkJfAotCQlQNF9FU0NSX0VNQVNLX0JJVChQNF9FVkVOVF9HTE9CQUxfUE9XRVJfRVZFTlRTLCBSVU5OSU5HKSksCisJCVA0X0VTQ1JfRU1BU0tfQklUKFA0X0VWRU5UX0dMT0JBTF9QT1dFUl9FVkVOVFMsIFJVTk5JTkcpKQl8CisJCVA0X0NPTkZJR19BTElBU0FCTEUsCiAKICAgLyoKICAgICogcmV0aXJlZCBpbnN0cnVjdGlvbnMKQEAgLTk0NSw3ICsxMDM0LDcgQEAKIAogCQlpZiAoIXg4Nl9wZXJmX2V2ZW50X3NldF9wZXJpb2QoZXZlbnQpKQogCQkJY29udGludWU7Ci0JCWlmIChwZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCAxLCAmZGF0YSwgcmVncykpCisJCWlmIChwZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCAmZGF0YSwgcmVncykpCiAJCQl4ODZfcG11X3N0b3AoZXZlbnQsIDApOwogCX0KIApAQCAtMTEyMCw2ICsxMjA5LDggQEAKIAlzdHJ1Y3QgcDRfZXZlbnRfYmluZCAqYmluZDsKIAl1bnNpZ25lZCBpbnQgaSwgdGhyZWFkLCBudW07CiAJaW50IGNudHJfaWR4LCBlc2NyX2lkeDsKKwl1NjQgY29uZmlnX2FsaWFzOworCWludCBwYXNzOwogCiAJYml0bWFwX3plcm8odXNlZF9tYXNrLCBYODZfUE1DX0lEWF9NQVgpOwogCWJpdG1hcF96ZXJvKGVzY3JfbWFzaywgUDRfRVNDUl9NU1JfVEFCTEVfU0laRSk7CkBAIC0xMTI4LDYgKzEyMTksMTcgQEAKIAogCQlod2MgPSAmY3B1Yy0+ZXZlbnRfbGlzdFtpXS0+aHc7CiAJCXRocmVhZCA9IHA0X2h0X3RocmVhZChjcHUpOworCQlwYXNzID0gMDsKKworYWdhaW46CisJCS8qCisJCSAqIEl0J3MgcG9zc2libGUgdG8gaGl0IGEgY2lyY3VsYXIgbG9jaworCQkgKiBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBhbHRlcm5hdGl2ZSBldmVudHMKKwkJICogaWYgYm90aCBhcmUgc2NoZWR1bGVkIGFscmVhZHkuCisJCSAqLworCQlpZiAocGFzcyA+IDIpCisJCQlnb3RvIGRvbmU7CisKIAkJYmluZCA9IHA0X2NvbmZpZ19nZXRfYmluZChod2MtPmNvbmZpZyk7CiAJCWVzY3JfaWR4ID0gcDRfZ2V0X2VzY3JfaWR4KGJpbmQtPmVzY3JfbXNyW3RocmVhZF0pOwogCQlpZiAodW5saWtlbHkoZXNjcl9pZHggPT0gLTEpKQpAQCAtMTE0MSw4ICsxMjQzLDE3IEBACiAJCX0KIAogCQljbnRyX2lkeCA9IHA0X25leHRfY250cih0aHJlYWQsIHVzZWRfbWFzaywgYmluZCk7Ci0JCWlmIChjbnRyX2lkeCA9PSAtMSB8fCB0ZXN0X2JpdChlc2NyX2lkeCwgZXNjcl9tYXNrKSkKLQkJCWdvdG8gZG9uZTsKKwkJaWYgKGNudHJfaWR4ID09IC0xIHx8IHRlc3RfYml0KGVzY3JfaWR4LCBlc2NyX21hc2spKSB7CisJCQkvKgorCQkJICogQ2hlY2sgd2hldGhlciBhbiBldmVudCBhbGlhcyBpcyBzdGlsbCBhdmFpbGFibGUuCisJCQkgKi8KKwkJCWNvbmZpZ19hbGlhcyA9IHA0X2dldF9hbGlhc19ldmVudChod2MtPmNvbmZpZyk7CisJCQlpZiAoIWNvbmZpZ19hbGlhcykKKwkJCQlnb3RvIGRvbmU7CisJCQlod2MtPmNvbmZpZyA9IGNvbmZpZ19hbGlhczsKKwkJCXBhc3MrKzsKKwkJCWdvdG8gYWdhaW47CisJCX0KIAogCQlwNF9wbXVfc3dhcF9jb25maWdfdHMoaHdjLCBjcHUpOwogCQlpZiAoYXNzaWduKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2RldmljZXRyZWUuYyBiL2FyY2gveDg2L2tlcm5lbC9kZXZpY2V0cmVlLmMKaW5kZXggNjkwYmM4NC4uYTYyMWYzNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2RldmljZXRyZWUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZGV2aWNldHJlZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgogCiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KICNpbmNsdWRlIDxhc20vaXJxX2NvbnRyb2xsZXIuaD4KQEAgLTk4LDYgKzk5LDE2IEBACiAJcmV0dXJuIF9fYWxsb2NfYm9vdG1lbShzaXplLCBhbGlnbiwgX19wYShNQVhfRE1BX0FERFJFU1MpKTsKIH0KIAorI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAordm9pZCBfX2luaXQgZWFybHlfaW5pdF9kdF9zZXR1cF9pbml0cmRfYXJjaCh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJaW5pdHJkX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpX192YShzdGFydCk7CisJaW5pdHJkX2VuZCA9ICh1bnNpZ25lZCBsb25nKV9fdmEoZW5kKTsKKwlpbml0cmRfYmVsb3dfc3RhcnRfb2sgPSAxOworfQorI2VuZGlmCisKIHZvaWQgX19pbml0IGFkZF9kdGIodTY0IGRhdGEpCiB7CiAJaW5pdGlhbF9kdGIgPSBkYXRhICsgb2Zmc2V0b2Yoc3RydWN0IHNldHVwX2RhdGEsIGRhdGEpOwpAQCAtMTIzLDYgKzEzNCwyNCBAQAogbW9kdWxlX2luaXQoYWRkX2J1c19wcm9iZSk7CiAKICNpZmRlZiBDT05GSUdfUENJCitzdHJ1Y3QgZGV2aWNlX25vZGUgKnBjaWJpb3NfZ2V0X3BoYl9vZl9ub2RlKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgInBjaSIpIHsKKwkJY29uc3Qgdm9pZCAqcHJvcDsKKwkJdW5zaWduZWQgaW50IGJ1c19taW47CisKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImJ1cy1yYW5nZSIsIE5VTEwpOworCQlpZiAoIXByb3ApCisJCQljb250aW51ZTsKKwkJYnVzX21pbiA9IGJlMzJfdG9fY3B1cChwcm9wKTsKKwkJaWYgKGJ1cy0+bnVtYmVyID09IGJ1c19taW4pCisJCQlyZXR1cm4gbnA7CisJfQorCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgaW50IHg4Nl9vZl9wY2lfaXJxX2VuYWJsZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBvZl9pcnEgb2lycTsKQEAgLTE1NCw1MCArMTgzLDggQEAKIAogdm9pZCBfX2NwdWluaXQgeDg2X29mX3BjaV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQogCXBjaWJpb3NfZW5hYmxlX2lycSA9IHg4Nl9vZl9wY2lfaXJxX2VuYWJsZTsKIAlwY2liaW9zX2Rpc2FibGVfaXJxID0geDg2X29mX3BjaV9pcnFfZGlzYWJsZTsKLQotCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgInBjaSIpIHsKLQkJY29uc3Qgdm9pZCAqcHJvcDsKLQkJc3RydWN0IHBjaV9idXMgKmJ1czsKLQkJdW5zaWduZWQgaW50IGJ1c19taW47Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7Ci0KLQkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImJ1cy1yYW5nZSIsIE5VTEwpOwotCQlpZiAoIXByb3ApCi0JCQljb250aW51ZTsKLQkJYnVzX21pbiA9IGJlMzJfdG9fY3B1cChwcm9wKTsKLQotCQlidXMgPSBwY2lfZmluZF9idXMoMCwgYnVzX21pbik7Ci0JCWlmICghYnVzKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGZpbmQgYSBub2RlIGZvciBidXMgJXMuXG4iLAotCQkJCQlucC0+ZnVsbF9uYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGJ1cy0+c2VsZikKLQkJCWJ1cy0+c2VsZi0+ZGV2Lm9mX25vZGUgPSBucDsKLQkJZWxzZQotCQkJYnVzLT5kZXYub2Zfbm9kZSA9IG5wOwotCi0JCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIGNoaWxkKSB7Ci0JCQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCQkJdTMyIGRldmZuOwotCi0JCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGNoaWxkLCAicmVnIiwgTlVMTCk7Ci0JCQlpZiAoIXByb3ApCi0JCQkJY29udGludWU7Ci0KLQkJCWRldmZuID0gKGJlMzJfdG9fY3B1cChwcm9wKSA+PiA4KSAmIDB4ZmY7Ci0JCQlkZXYgPSBwY2lfZ2V0X3Nsb3QoYnVzLCBkZXZmbik7Ci0JCQlpZiAoIWRldikKLQkJCQljb250aW51ZTsKLQkJCWRldi0+ZGV2Lm9mX25vZGUgPSBjaGlsZDsKLQkJCXBjaV9kZXZfcHV0KGRldik7Ci0JCX0KLQl9CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCmluZGV4IGU3MWM5OGQuLjE5ODUzYWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKQEAgLTEwNSwzNCArMTA1LDYgQEAKIH0KIAogLyoKLSAqIFdlIGFyZSByZXR1cm5pbmcgZnJvbSB0aGUgaXJxIHN0YWNrIGFuZCBnbyB0byB0aGUgcHJldmlvdXMgb25lLgotICogSWYgdGhlIHByZXZpb3VzIHN0YWNrIGlzIGFsc28gaW4gdGhlIGlycSBzdGFjaywgdGhlbiBicCBpbiB0aGUgZmlyc3QKLSAqIGZyYW1lIG9mIHRoZSBpcnEgc3RhY2sgcG9pbnRzIHRvIHRoZSBwcmV2aW91cywgaW50ZXJydXB0ZWQgb25lLgotICogT3RoZXJ3aXNlIHdlIGhhdmUgYW5vdGhlciBsZXZlbCBvZiBpbmRpcmVjdGlvbjogV2UgZmlyc3Qgc2F2ZQotICogdGhlIGJwIG9mIHRoZSBwcmV2aW91cyBzdGFjaywgdGhlbiB3ZSBzd2l0Y2ggdGhlIHN0YWNrIHRvIHRoZSBpcnEgb25lCi0gKiBhbmQgc2F2ZSBhIG5ldyBicCB0aGF0IGxpbmtzIHRvIHRoZSBwcmV2aW91cyBvbmUuCi0gKiAoU2VlIHNhdmVfYXJncygpKQotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLWZpeHVwX2JwX2lycV9saW5rKHVuc2lnbmVkIGxvbmcgYnAsIHVuc2lnbmVkIGxvbmcgKnN0YWNrLAotCQkgIHVuc2lnbmVkIGxvbmcgKmlycV9zdGFjaywgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrX2VuZCkKLXsKLSNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgotCXN0cnVjdCBzdGFja19mcmFtZSAqZnJhbWUgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopYnA7Ci0JdW5zaWduZWQgbG9uZyBuZXh0OwotCi0JaWYgKCFpbl9pcnFfc3RhY2soc3RhY2ssIGlycV9zdGFjaywgaXJxX3N0YWNrX2VuZCkpIHsKLQkJaWYgKCFwcm9iZV9rZXJuZWxfYWRkcmVzcygmZnJhbWUtPm5leHRfZnJhbWUsIG5leHQpKQotCQkJcmV0dXJuIG5leHQ7Ci0JCWVsc2UKLQkJCVdBUk5fT05DRSgxLCAiUGVyZjogYmFkIGZyYW1lIHBvaW50ZXIgPSAlcCBpbiAiCi0JCQkJICAiY2FsbGNoYWluXG4iLCAmZnJhbWUtPm5leHRfZnJhbWUpOwotCX0KLSNlbmRpZgotCXJldHVybiBicDsKLX0KLQotLyoKICAqIHg4Ni02NCBjYW4gaGF2ZSB1cCB0byB0aHJlZSBrZXJuZWwgc3RhY2tzOgogICogcHJvY2VzcyBzdGFjawogICogaW50ZXJydXB0IHN0YWNrCkBAIC0xNTUsOSArMTI3LDEyIEBACiAJCXRhc2sgPSBjdXJyZW50OwogCiAJaWYgKCFzdGFjaykgewotCQlzdGFjayA9ICZkdW1teTsKLQkJaWYgKHRhc2sgJiYgdGFzayAhPSBjdXJyZW50KQorCQlpZiAocmVncykKKwkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5zcDsKKwkJZWxzZSBpZiAodGFzayAmJiB0YXNrICE9IGN1cnJlbnQpCiAJCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnNwOworCQllbHNlCisJCQlzdGFjayA9ICZkdW1teTsKIAl9CiAKIAlpZiAoIWJwKQpAQCAtMjA1LDggKzE4MCw2IEBACiAJCQkJICogcG9pbnRlciAoaW5kZXggLTEgdG8gZW5kKSBpbiB0aGUgSVJRIHN0YWNrOgogCQkJCSAqLwogCQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgKGlycV9zdGFja19lbmRbLTFdKTsKLQkJCQlicCA9IGZpeHVwX2JwX2lycV9saW5rKGJwLCBzdGFjaywgaXJxX3N0YWNrLAotCQkJCQkJICAgICAgIGlycV9zdGFja19lbmQpOwogCQkJCWlycV9zdGFja19lbmQgPSBOVUxMOwogCQkJCW9wcy0+c3RhY2soZGF0YSwgIkVPSSIpOwogCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUwppbmRleCA4YTQ0NWEwLi5lMTMzMjlkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUwpAQCAtOSw2ICs5LDggQEAKIC8qCiAgKiBlbnRyeS5TIGNvbnRhaW5zIHRoZSBzeXN0ZW0tY2FsbCBhbmQgZmF1bHQgbG93LWxldmVsIGhhbmRsaW5nIHJvdXRpbmVzLgogICoKKyAqIFNvbWUgb2YgdGhpcyBpcyBkb2N1bWVudGVkIGluIERvY3VtZW50YXRpb24veDg2L2VudHJ5XzY0LnR4dAorICoKICAqIE5PVEU6IFRoaXMgY29kZSBoYW5kbGVzIHNpZ25hbC1yZWNvZ25pdGlvbiwgd2hpY2ggaGFwcGVucyBldmVyeSB0aW1lCiAgKiBhZnRlciBhbiBpbnRlcnJ1cHQgYW5kIGFmdGVyIGVhY2ggc3lzdGVtIGNhbGwuCiAgKgpAQCAtMjk3LDI3ICsyOTksMjYgQEAKIAkuZW5kbQogCiAvKiBzYXZlIHBhcnRpYWwgc3RhY2sgZnJhbWUgKi8KLQkucHVzaHNlY3Rpb24gLmtwcm9iZXMudGV4dCwgImF4IgotRU5UUlkoc2F2ZV9hcmdzKQotCVhDUFRfRlJBTUUKKwkubWFjcm8gU0FWRV9BUkdTX0lSUQogCWNsZAotCS8qCi0JICogc3RhcnQgZnJvbSByYnAgaW4gcHRfcmVncyBhbmQganVtcCBvdmVyCi0JICogcmV0dXJuIGFkZHJlc3MuCi0JICovCi0JbW92cV9jZmkgcmRpLCBSREkrOC1SQlAKLQltb3ZxX2NmaSByc2ksIFJTSSs4LVJCUAotCW1vdnFfY2ZpIHJkeCwgUkRYKzgtUkJQCi0JbW92cV9jZmkgcmN4LCBSQ1grOC1SQlAKLQltb3ZxX2NmaSByYXgsIFJBWCs4LVJCUAotCW1vdnFfY2ZpICByOCwgIFI4KzgtUkJQCi0JbW92cV9jZmkgIHI5LCAgUjkrOC1SQlAKLQltb3ZxX2NmaSByMTAsIFIxMCs4LVJCUAotCW1vdnFfY2ZpIHIxMSwgUjExKzgtUkJQCisJLyogc3RhcnQgZnJvbSByYnAgaW4gcHRfcmVncyBhbmQganVtcCBvdmVyICovCisJbW92cV9jZmkgcmRpLCBSREktUkJQCisJbW92cV9jZmkgcnNpLCBSU0ktUkJQCisJbW92cV9jZmkgcmR4LCBSRFgtUkJQCisJbW92cV9jZmkgcmN4LCBSQ1gtUkJQCisJbW92cV9jZmkgcmF4LCBSQVgtUkJQCisJbW92cV9jZmkgIHI4LCAgUjgtUkJQCisJbW92cV9jZmkgIHI5LCAgUjktUkJQCisJbW92cV9jZmkgcjEwLCBSMTAtUkJQCisJbW92cV9jZmkgcjExLCBSMTEtUkJQCiAKLQlsZWFxIC1SQlArOCglcnNwKSwlcmRpCS8qIGFyZzEgZm9yIGhhbmRsZXIgKi8KLQltb3ZxX2NmaSByYnAsIDgJCS8qIHB1c2ggJXJicCAqLwotCWxlYXEgOCglcnNwKSwgJXJicAkJLyogbW92ICVyc3AsICVlYnAgKi8KKwkvKiBTYXZlIHJicCBzbyB0aGF0IHdlIGNhbiB1bndpbmQgZnJvbSBnZXRfaXJxX3JlZ3MoKSAqLworCW1vdnFfY2ZpIHJicCwgMAorCisJLyogU2F2ZSBwcmV2aW91cyBzdGFjayB2YWx1ZSAqLworCW1vdnEgJXJzcCwgJXJzaQorCisJbGVhcSAtUkJQKCVyc3ApLCVyZGkJLyogYXJnMSBmb3IgaGFuZGxlciAqLwogCXRlc3RsICQzLCBDUyglcmRpKQogCWplIDFmCiAJU1dBUEdTCkBAIC0zMjksMTkgKzMzMCwxNCBAQAogCSAqLwogMToJaW5jbCBQRVJfQ1BVX1ZBUihpcnFfY291bnQpCiAJam5lIDJmCi0JcG9wcV9jZmkgJXJheAkJCS8qIG1vdmUgcmV0dXJuIGFkZHJlc3MuLi4gKi8KIAltb3YgUEVSX0NQVV9WQVIoaXJxX3N0YWNrX3B0ciksJXJzcAogCUVNUFRZX0ZSQU1FIDAKLQlwdXNocV9jZmkgJXJicAkJCS8qIGJhY2tsaW5rIGZvciB1bndpbmRlciAqLwotCXB1c2hxX2NmaSAlcmF4CQkJLyogLi4uIHRvIHRoZSBuZXcgc3RhY2sgKi8KLQkvKgotCSAqIFdlIGVudGVyZWQgYW4gaW50ZXJydXB0IGNvbnRleHQgLSBpcnFzIGFyZSBvZmY6Ci0JICovCi0yOglUUkFDRV9JUlFTX09GRgotCXJldAotCUNGSV9FTkRQUk9DCi1FTkQoc2F2ZV9hcmdzKQotCS5wb3BzZWN0aW9uCisKKzI6CS8qIFN0b3JlIHByZXZpb3VzIHN0YWNrIHZhbHVlICovCisJcHVzaHEgJXJzaQorCS8qIFdlIGVudGVyZWQgYW4gaW50ZXJydXB0IGNvbnRleHQgLSBpcnFzIGFyZSBvZmY6ICovCisJVFJBQ0VfSVJRU19PRkYKKwkuZW5kbQogCiBFTlRSWShzYXZlX3Jlc3QpCiAJUEFSVElBTF9GUkFNRSAxIFJFU1RfU0tJUCs4CkBAIC00NzMsNyArNDY5LDcgQEAKIAkgKiBhbmQgc2hvcnQ6CiAJICovCiAJRU5BQkxFX0lOVEVSUlVQVFMoQ0xCUl9OT05FKQotCVNBVkVfQVJHUyA4LDEKKwlTQVZFX0FSR1MgOCwwCiAJbW92cSAgJXJheCxPUklHX1JBWC1BUkdPRkZTRVQoJXJzcCkKIAltb3ZxICAlcmN4LFJJUC1BUkdPRkZTRVQoJXJzcCkKIAlDRklfUkVMX09GRlNFVCByaXAsUklQLUFSR09GRlNFVApAQCAtNTA4LDcgKzUwNCw3IEBACiAJVFJBQ0VfSVJRU19PTgogCW1vdnEgUklQLUFSR09GRlNFVCglcnNwKSwlcmN4CiAJQ0ZJX1JFR0lTVEVSCXJpcCxyY3gKLQlSRVNUT1JFX0FSR1MgMCwtQVJHX1NLSVAsMQorCVJFU1RPUkVfQVJHUyAxLC1BUkdfU0tJUCwwCiAJLypDRklfUkVHSVNURVIJcmZsYWdzLHIxMSovCiAJbW92cQlQRVJfQ1BVX1ZBUihvbGRfcnNwKSwgJXJzcAogCVVTRVJHU19TWVNSRVQ2NApAQCAtNzkxLDcgKzc4Nyw3IEBACiAJLyogcmVzZXJ2ZSBwdF9yZWdzIGZvciBzY3JhdGNoIHJlZ3MgYW5kIHJicCAqLwogCXN1YnEgJE9SSUdfUkFYLVJCUCwgJXJzcAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCBPUklHX1JBWC1SQlAKLQljYWxsIHNhdmVfYXJncworCVNBVkVfQVJHU19JUlEKIAlQQVJUSUFMX0ZSQU1FIDAKIAljYWxsIFxmdW5jCiAJLmVuZG0KQEAgLTgxNCwxNSArODEwLDE0IEBACiAJRElTQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKIAlUUkFDRV9JUlFTX09GRgogCWRlY2wgUEVSX0NQVV9WQVIoaXJxX2NvdW50KQotCWxlYXZlcQogCi0JQ0ZJX1JFU1RPUkUJCXJicAorCS8qIFJlc3RvcmUgc2F2ZWQgcHJldmlvdXMgc3RhY2sgKi8KKwlwb3BxICVyc2kKKwlsZWFxIDE2KCVyc2kpLCAlcnNwCisKIAlDRklfREVGX0NGQV9SRUdJU1RFUglyc3AKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQJLTgKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQJLTE2CiAKLQkvKiB3ZSBkaWQgbm90IHNhdmUgcmJ4LCByZXN0b3JlIG9ubHkgZnJvbSBBUkdPRkZTRVQgKi8KLQlhZGRxICQ4LCAlcnNwCi0JQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUCS04CiBleGl0X2ludHI6CiAJR0VUX1RIUkVBRF9JTkZPKCVyY3gpCiAJdGVzdGwgJDMsQ1MtQVJHT0ZGU0VUKCVyc3ApCkBAIC04NTgsNyArODUzLDcgQEAKIAkgKi8KIAlUUkFDRV9JUlFTX0lSRVRRCiByZXN0b3JlX2FyZ3M6Ci0JUkVTVE9SRV9BUkdTIDAsOCwwCisJUkVTVE9SRV9BUkdTIDEsOCwxCiAKIGlycV9yZXR1cm46CiAJSU5URVJSVVBUX1JFVFVSTgpAQCAtOTkxLDExICs5ODYsNiBAQAogYXBpY2ludGVycnVwdCBUSEVSTUFMX0FQSUNfVkVDVE9SIFwKIAl0aGVybWFsX2ludGVycnVwdCBzbXBfdGhlcm1hbF9pbnRlcnJ1cHQKIAotI2lmZGVmIENPTkZJR19YODZfTUNFCi1hcGljaW50ZXJydXB0IE1DRV9TRUxGX1ZFQ1RPUiBcCi0JbWNlX3NlbGZfaW50ZXJydXB0IHNtcF9tY2Vfc2VsZl9pbnRlcnJ1cHQKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1NNUAogYXBpY2ludGVycnVwdCBDQUxMX0ZVTkNUSU9OX1NJTkdMRV9WRUNUT1IgXAogCWNhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaW50ZXJydXB0CkBAIC0xMTIxLDYgKzExMTEsOCBAQAogemVyb2VudHJ5IGNvcHJvY2Vzc29yX2Vycm9yIGRvX2NvcHJvY2Vzc29yX2Vycm9yCiBlcnJvcmVudHJ5IGFsaWdubWVudF9jaGVjayBkb19hbGlnbm1lbnRfY2hlY2sKIHplcm9lbnRyeSBzaW1kX2NvcHJvY2Vzc29yX2Vycm9yIGRvX3NpbWRfY29wcm9jZXNzb3JfZXJyb3IKK3plcm9lbnRyeSBlbXVsYXRlX3ZzeXNjYWxsIGRvX2VtdWxhdGVfdnN5c2NhbGwKKwogCiAJLyogUmVsb2FkIGdzIHNlbGVjdG9yIHdpdGggZXhjZXB0aW9uIGhhbmRsaW5nICovCiAJLyogZWRpOiAgbmV3IHNlbGVjdG9yICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwppbmRleCA2NzgxNzY1Li40YWVjYzU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2k4MjUzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hwZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xMiw4ICsxMyw4IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLSNpbmNsdWRlIDxhc20vaTgyNTMuaD4KICNpbmNsdWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAKICNkZWZpbmUgSFBFVF9NQVNLCQkJQ0xPQ0tTT1VSQ0VfTUFTSygzMikKIApAQCAtNzEsNyArNzIsNyBAQAogewogCWhwZXRfdmlydF9hZGRyZXNzID0gaW9yZW1hcF9ub2NhY2hlKGhwZXRfYWRkcmVzcywgSFBFVF9NTUFQX1NJWkUpOwogI2lmZGVmIENPTkZJR19YODZfNjQKLQlfX3NldF9maXhtYXAoVlNZU0NBTExfSFBFVCwgaHBldF9hZGRyZXNzLCBQQUdFX0tFUk5FTF9WU1lTQ0FMTF9OT0NBQ0hFKTsKKwlfX3NldF9maXhtYXAoVlNZU0NBTExfSFBFVCwgaHBldF9hZGRyZXNzLCBQQUdFX0tFUk5FTF9WVkFSX05PQ0FDSEUpOwogI2VuZGlmCiB9CiAKQEAgLTczOCwxMyArNzM5LDYgQEAKIAlyZXR1cm4gKGN5Y2xlX3QpaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwogfQogCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotc3RhdGljIGN5Y2xlX3QgX192c3lzY2FsbF9mbiB2cmVhZF9ocGV0KHZvaWQpCi17Ci0JcmV0dXJuIHJlYWRsKChjb25zdCB2b2lkIF9faW9tZW0gKilmaXhfdG9fdmlydChWU1lTQ0FMTF9IUEVUKSArIDB4ZjApOwotfQotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfaHBldCA9IHsKIAkubmFtZQkJPSAiaHBldCIsCiAJLnJhdGluZwkJPSAyNTAsCkBAIC03NTMsNyArNzQ3LDcgQEAKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiAJLnJlc3VtZQkJPSBocGV0X3Jlc3VtZV9jb3VudGVyLAogI2lmZGVmIENPTkZJR19YODZfNjQKLQkudnJlYWQJCT0gdnJlYWRfaHBldCwKKwkuYXJjaGRhdGEJPSB7IC52Y2xvY2tfbW9kZSA9IFZDTE9DS19IUEVUIH0sCiAjZW5kaWYKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pMzg3LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaTM4Ny5jCmluZGV4IDEyYWZmMjUuLjczOWQ4NTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pMzg3LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2kzODcuYwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJcmV0dXJuIHRtcDsKIH0KIAotI2RlZmluZSBGUFJFR19BRERSKGYsIG4pCSgodm9pZCAqKSYoZiktPnN0X3NwYWNlICsgKG4pICogMTYpOworI2RlZmluZSBGUFJFR19BRERSKGYsIG4pCSgodm9pZCAqKSYoZiktPnN0X3NwYWNlICsgKG4pICogMTYpCiAjZGVmaW5lIEZQX0VYUF9UQUdfVkFMSUQJMAogI2RlZmluZSBGUF9FWFBfVEFHX1pFUk8JCTEKICNkZWZpbmUgRlBfRVhQX1RBR19TUEVDSUFMCTIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pODI1My5jIGIvYXJjaC94ODYva2VybmVsL2k4MjUzLmMKaW5kZXggZmI2NmRjOS4uZjJiOTZkZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2k4MjUzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2k4MjUzLmMKQEAgLTMsMTEzICszLDI0IEBACiAgKgogICovCiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pODI1My5oPgogCi0jaW5jbHVkZSA8YXNtL2k4MjUzLmg+CiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAotREVGSU5FX1JBV19TUElOTE9DSyhpODI1M19sb2NrKTsKLUVYUE9SVF9TWU1CT0woaTgyNTNfbG9jayk7Ci0KIC8qCiAgKiBIUEVUIHJlcGxhY2VzIHRoZSBQSVQsIHdoZW4gZW5hYmxlZC4gU28gd2UgbmVlZCB0byBrbm93LCB3aGljaCBvZgogICogdGhlIHR3byB0aW1lcnMgaXMgdXNlZAogICovCiBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpnbG9iYWxfY2xvY2tfZXZlbnQ7CiAKLS8qCi0gKiBJbml0aWFsaXplIHRoZSBQSVQgdGltZXIuCi0gKgotICogVGhpcyBpcyBhbHNvIGNhbGxlZCBhZnRlciByZXN1bWUgdG8gYnJpbmcgdGhlIFBJVCBpbnRvIG9wZXJhdGlvbiBhZ2Fpbi4KLSAqLwotc3RhdGljIHZvaWQgaW5pdF9waXRfdGltZXIoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCi0JCQkgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi17Ci0JcmF3X3NwaW5fbG9jaygmaTgyNTNfbG9jayk7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgotCQkvKiBiaW5hcnksIG1vZGUgMiwgTFNCL01TQiwgY2ggMCAqLwotCQlvdXRiX3BpdCgweDM0LCBQSVRfTU9ERSk7Ci0JCW91dGJfcGl0KExBVENIICYgMHhmZiAsIFBJVF9DSDApOwkvKiBMU0IgKi8KLQkJb3V0Yl9waXQoTEFUQ0ggPj4gOCAsIFBJVF9DSDApOwkJLyogTVNCICovCi0JCWJyZWFrOwotCi0JY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKLQljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKLQkJaWYgKGV2dC0+bW9kZSA9PSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQyB8fAotCQkgICAgZXZ0LT5tb2RlID09IENMT0NLX0VWVF9NT0RFX09ORVNIT1QpIHsKLQkJCW91dGJfcGl0KDB4MzAsIFBJVF9NT0RFKTsKLQkJCW91dGJfcGl0KDAsIFBJVF9DSDApOwotCQkJb3V0Yl9waXQoMCwgUElUX0NIMCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENMT0NLX0VWVF9NT0RFX09ORVNIT1Q6Ci0JCS8qIE9uZSBzaG90IHNldHVwICovCi0JCW91dGJfcGl0KDB4MzgsIFBJVF9NT0RFKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENMT0NLX0VWVF9NT0RFX1JFU1VNRToKLQkJLyogTm90aGluZyB0byBkbyBoZXJlICovCi0JCWJyZWFrOwotCX0KLQlyYXdfc3Bpbl91bmxvY2soJmk4MjUzX2xvY2spOwotfQotCi0vKgotICogUHJvZ3JhbSB0aGUgbmV4dCBldmVudCBpbiBvbmVzaG90IG1vZGUKLSAqCi0gKiBEZWx0YSBpcyBnaXZlbiBpbiBQSVQgdGlja3MKLSAqLwotc3RhdGljIGludCBwaXRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGRlbHRhLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi17Ci0JcmF3X3NwaW5fbG9jaygmaTgyNTNfbG9jayk7Ci0Jb3V0Yl9waXQoZGVsdGEgJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLwotCW91dGJfcGl0KGRlbHRhID4+IDggLCBQSVRfQ0gwKTsJCS8qIE1TQiAqLwotCXJhd19zcGluX3VubG9jaygmaTgyNTNfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIE9uIFVQIHRoZSBQSVQgY2FuIHNlcnZlIGFsbCBvZiB0aGUgcG9zc2libGUgdGltZXIgZnVuY3Rpb25zLiBPbiBTTVAgc3lzdGVtcwotICogaXQgY2FuIGJlIHNvbGVseSB1c2VkIGZvciB0aGUgZ2xvYmFsIHRpY2suCi0gKgotICogVGhlIHByb2ZpbGluZyBhbmQgdXBkYXRlIGNhcGFiaWxpdGllcyBhcmUgc3dpdGNoZWQgb2ZmIG9uY2UgdGhlIGxvY2FsIGFwaWMgaXMKLSAqIHJlZ2lzdGVyZWQuIFRoaXMgbWVjaGFuaXNtIHJlcGxhY2VzIHRoZSBwcmV2aW91cyAjaWZkZWYgTE9DQUxfQVBJQyAtCi0gKiAhdXNpbmdfYXBpY190aW1lciBkZWNpc2lvbnMgaW4gZG9fdGltZXJfaW50ZXJydXB0X2hvb2soKQotICovCi1zdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBwaXRfY2UgPSB7Ci0JLm5hbWUJCT0gInBpdCIsCi0JLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAotCS5zZXRfbW9kZQk9IGluaXRfcGl0X3RpbWVyLAotCS5zZXRfbmV4dF9ldmVudCA9IHBpdF9uZXh0X2V2ZW50LAotCS5pcnEJCT0gMCwKLX07Ci0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBjb252ZXJzaW9uIGZhY3RvciBhbmQgdGhlIG1pbi9tYXggZGVsdGFzIG9mIHRoZSBjbG9jayBldmVudAotICogc3RydWN0dXJlIGFuZCByZWdpc3RlciB0aGUgY2xvY2sgZXZlbnQgc291cmNlIHdpdGggdGhlIGZyYW1ld29yay4KLSAqLwogdm9pZCBfX2luaXQgc2V0dXBfcGl0X3RpbWVyKHZvaWQpCiB7Ci0JLyoKLQkgKiBTdGFydCBwaXQgd2l0aCB0aGUgYm9vdCBjcHUgbWFzayBhbmQgbWFrZSBpdCBnbG9iYWwgYWZ0ZXIgdGhlCi0JICogSU9fQVBJQyBoYXMgYmVlbiBpbml0aWFsaXplZC4KLQkgKi8KLQlwaXRfY2UuY3B1bWFzayA9IGNwdW1hc2tfb2Yoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQotCWNsb2NrZXZlbnRzX2NvbmZpZ19hbmRfcmVnaXN0ZXIoJnBpdF9jZSwgQ0xPQ0tfVElDS19SQVRFLCAweEYsIDB4N0ZGRik7Ci0JZ2xvYmFsX2Nsb2NrX2V2ZW50ID0gJnBpdF9jZTsKKwljbG9ja2V2ZW50X2k4MjUzX2luaXQodHJ1ZSk7CisJZ2xvYmFsX2Nsb2NrX2V2ZW50ID0gJmk4MjUzX2Nsb2NrZXZlbnQ7CiB9CiAKICNpZm5kZWYgQ09ORklHX1g4Nl82NApAQCAtMTIzLDcgKzM0LDcgQEAKIAkgICogLSB3aGVuIGxvY2FsIEFQSUMgdGltZXIgaXMgYWN0aXZlIChQSVQgaXMgc3dpdGNoZWQgb2ZmKQogCSAgKi8KIAlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDEgfHwgaXNfaHBldF9lbmFibGVkKCkgfHwKLQkgICAgcGl0X2NlLm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMpCisJICAgIGk4MjUzX2Nsb2NrZXZlbnQubW9kZSAhPSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gY2xvY2tzb3VyY2VfaTgyNTNfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycWluaXQuYyBiL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0LmMKaW5kZXggZjQ3MGU0ZS4uZjA5ZDRiYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycWluaXQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdC5jCkBAIC0yNzIsOSArMjcyLDYgQEAKICNpZmRlZiBDT05GSUdfWDg2X01DRV9USFJFU0hPTEQKIAlhbGxvY19pbnRyX2dhdGUoVEhSRVNIT0xEX0FQSUNfVkVDVE9SLCB0aHJlc2hvbGRfaW50ZXJydXB0KTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9NQ0UpICYmIGRlZmluZWQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQotCWFsbG9jX2ludHJfZ2F0ZShNQ0VfU0VMRl9WRUNUT1IsIG1jZV9zZWxmX2ludGVycnVwdCk7Ci0jZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCiAJLyogc2VsZiBnZW5lcmF0ZWQgSVBJIGZvciBsb2NhbCBBUElDIHRpbWVyICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jIGIvYXJjaC94ODYva2VybmVsL2tnZGIuYwppbmRleCA1ZjllY2ZmLi4wMDM1NGQ0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKQEAgLTYwOCw3ICs2MDgsNyBAQAogCXJldHVybiByZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmtnZGJfbm90aWZpZXIpOwogfQogCi1zdGF0aWMgdm9pZCBrZ2RiX2h3X292ZXJmbG93X2hhbmRsZXIoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbm1pLAorc3RhdGljIHZvaWQga2dkYl9od19vdmVyZmxvd19oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKIAkJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKQEAgLTYzOCw3ICs2MzgsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBIQlBfTlVNOyBpKyspIHsKIAkJaWYgKGJyZWFraW5mb1tpXS5wZXYpCiAJCQljb250aW51ZTsKLQkJYnJlYWtpbmZvW2ldLnBldiA9IHJlZ2lzdGVyX3dpZGVfaHdfYnJlYWtwb2ludCgmYXR0ciwgTlVMTCk7CisJCWJyZWFraW5mb1tpXS5wZXYgPSByZWdpc3Rlcl93aWRlX2h3X2JyZWFrcG9pbnQoJmF0dHIsIE5VTEwsIE5VTEwpOwogCQlpZiAoSVNfRVJSKCh2b2lkICogX19mb3JjZSlicmVha2luZm9baV0ucGV2KSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJrZ2RiOiBDb3VsZCBub3QgYWxsb2NhdGUgaHciCiAJCQkgICAgICAgImJyZWFrcG9pbnRzXG5EaXNhYmxpbmcgdGhlIGtlcm5lbCBkZWJ1Z2dlclxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKaW5kZXggMzNjMDdiMC4uYTljMjExNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2t2bS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rdm0uYwpAQCAtNTEsNiArNTEsMTUgQEAKIAogZWFybHlfcGFyYW0oIm5vLWt2bWFwZiIsIHBhcnNlX25vX2t2bWFwZik7CiAKK3N0YXRpYyBpbnQgc3RlYWxfYWNjID0gMTsKK3N0YXRpYyBpbnQgcGFyc2Vfbm9fc3RlYWxhY2MoY2hhciAqYXJnKQoreworICAgICAgICBzdGVhbF9hY2MgPSAwOworICAgICAgICByZXR1cm4gMDsKK30KKworZWFybHlfcGFyYW0oIm5vLXN0ZWFsLWFjYyIsIHBhcnNlX25vX3N0ZWFsYWNjKTsKKwogc3RydWN0IGt2bV9wYXJhX3N0YXRlIHsKIAl1OCBtbXVfcXVldWVbTU1VX1FVRVVFX1NJWkVdOwogCWludCBtbXVfcXVldWVfbGVuOwpAQCAtNTgsNiArNjcsOCBAQAogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGt2bV9wYXJhX3N0YXRlLCBwYXJhX3N0YXRlKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qga3ZtX3ZjcHVfcHZfYXBmX2RhdGEsIGFwZl9yZWFzb24pIF9fYWxpZ25lZCg2NCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGt2bV9zdGVhbF90aW1lLCBzdGVhbF90aW1lKSBfX2FsaWduZWQoNjQpOworc3RhdGljIGludCBoYXNfc3RlYWxfY2xvY2sgPSAwOwogCiBzdGF0aWMgc3RydWN0IGt2bV9wYXJhX3N0YXRlICprdm1fcGFyYV9zdGF0ZSh2b2lkKQogewpAQCAtNDQxLDYgKzQ1MiwyMSBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyB2b2lkIGt2bV9yZWdpc3Rlcl9zdGVhbF90aW1lKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3Qga3ZtX3N0ZWFsX3RpbWUgKnN0ID0gJnBlcl9jcHUoc3RlYWxfdGltZSwgY3B1KTsKKworCWlmICghaGFzX3N0ZWFsX2Nsb2NrKQorCQlyZXR1cm47CisKKwltZW1zZXQoc3QsIDAsIHNpemVvZigqc3QpKTsKKworCXdybXNybChNU1JfS1ZNX1NURUFMX1RJTUUsIChfX3BhKHN0KSB8IEtWTV9NU1JfRU5BQkxFRCkpOworCXByaW50ayhLRVJOX0lORk8gImt2bS1zdGVhbHRpbWU6IGNwdSAlZCwgbXNyICVseFxuIiwKKwkJY3B1LCBfX3BhKHN0KSk7Cit9CisKIHZvaWQgX19jcHVpbml0IGt2bV9ndWVzdF9jcHVfaW5pdCh2b2lkKQogewogCWlmICgha3ZtX3BhcmFfYXZhaWxhYmxlKCkpCkBAIC00NTcsNiArNDgzLDkgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyJLVk0gc2V0dXAgYXN5bmMgUEYgZm9yIGNwdSAlZFxuIiwKIAkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJfQorCisJaWYgKGhhc19zdGVhbF9jbG9jaykKKwkJa3ZtX3JlZ2lzdGVyX3N0ZWFsX3RpbWUoKTsKIH0KIAogc3RhdGljIHZvaWQga3ZtX3B2X2Rpc2FibGVfYXBmKHZvaWQgKnVudXNlZCkKQEAgLTQ4Myw2ICs1MTIsMzEgQEAKIAkubm90aWZpZXJfY2FsbCA9IGt2bV9wdl9yZWJvb3Rfbm90aWZ5LAogfTsKIAorc3RhdGljIHU2NCBrdm1fc3RlYWxfY2xvY2soaW50IGNwdSkKK3sKKwl1NjQgc3RlYWw7CisJc3RydWN0IGt2bV9zdGVhbF90aW1lICpzcmM7CisJaW50IHZlcnNpb247CisKKwlzcmMgPSAmcGVyX2NwdShzdGVhbF90aW1lLCBjcHUpOworCWRvIHsKKwkJdmVyc2lvbiA9IHNyYy0+dmVyc2lvbjsKKwkJcm1iKCk7CisJCXN0ZWFsID0gc3JjLT5zdGVhbDsKKwkJcm1iKCk7CisJfSB3aGlsZSAoKHZlcnNpb24gJiAxKSB8fCAodmVyc2lvbiAhPSBzcmMtPnZlcnNpb24pKTsKKworCXJldHVybiBzdGVhbDsKK30KKwordm9pZCBrdm1fZGlzYWJsZV9zdGVhbF90aW1lKHZvaWQpCit7CisJaWYgKCFoYXNfc3RlYWxfY2xvY2spCisJCXJldHVybjsKKworCXdybXNyKE1TUl9LVk1fU1RFQUxfVElNRSwgMCwgMCk7Cit9CisKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBfX2luaXQga3ZtX3NtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCiB7CkBAIC01MDAsNiArNTU0LDcgQEAKIAogc3RhdGljIHZvaWQga3ZtX2d1ZXN0X2NwdV9vZmZsaW5lKHZvaWQgKmR1bW15KQogeworCWt2bV9kaXNhYmxlX3N0ZWFsX3RpbWUoKTsKIAlrdm1fcHZfZGlzYWJsZV9hcGYoTlVMTCk7CiAJYXBmX3Rhc2tfd2FrZV9hbGwoKTsKIH0KQEAgLTU0OCw2ICs2MDMsMTEgQEAKIAlpZiAoa3ZtX3BhcmFfaGFzX2ZlYXR1cmUoS1ZNX0ZFQVRVUkVfQVNZTkNfUEYpKQogCQl4ODZfaW5pdC5pcnFzLnRyYXBfaW5pdCA9IGt2bV9hcGZfdHJhcF9pbml0OwogCisJaWYgKGt2bV9wYXJhX2hhc19mZWF0dXJlKEtWTV9GRUFUVVJFX1NURUFMX1RJTUUpKSB7CisJCWhhc19zdGVhbF9jbG9jayA9IDE7CisJCXB2X3RpbWVfb3BzLnN0ZWFsX2Nsb2NrID0ga3ZtX3N0ZWFsX2Nsb2NrOworCX0KKwogI2lmZGVmIENPTkZJR19TTVAKIAlzbXBfb3BzLnNtcF9wcmVwYXJlX2Jvb3RfY3B1ID0ga3ZtX3NtcF9wcmVwYXJlX2Jvb3RfY3B1OwogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigma3ZtX2NwdV9ub3RpZmllcik7CkBAIC01NTUsMyArNjE1LDE1IEBACiAJa3ZtX2d1ZXN0X2NwdV9pbml0KCk7CiAjZW5kaWYKIH0KKworc3RhdGljIF9faW5pdCBpbnQgYWN0aXZhdGVfanVtcF9sYWJlbHModm9pZCkKK3sKKwlpZiAoaGFzX3N0ZWFsX2Nsb2NrKSB7CisJCWp1bXBfbGFiZWxfaW5jKCZwYXJhdmlydF9zdGVhbF9lbmFibGVkKTsKKwkJaWYgKHN0ZWFsX2FjYykKKwkJCWp1bXBfbGFiZWxfaW5jKCZwYXJhdmlydF9zdGVhbF9ycV9lbmFibGVkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoYWN0aXZhdGVfanVtcF9sYWJlbHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtY2xvY2suYwppbmRleCA2Mzg5YTZiLi5jMWEwMTg4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva3ZtY2xvY2suYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtY2xvY2suYwpAQCAtMTYwLDYgKzE2MCw3IEBACiBzdGF0aWMgdm9pZCBrdm1fY3Jhc2hfc2h1dGRvd24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJbmF0aXZlX3dyaXRlX21zcihtc3Jfa3ZtX3N5c3RlbV90aW1lLCAwLCAwKTsKKwlrdm1fZGlzYWJsZV9zdGVhbF90aW1lKCk7CiAJbmF0aXZlX21hY2hpbmVfY3Jhc2hfc2h1dGRvd24ocmVncyk7CiB9CiAjZW5kaWYKQEAgLTE2Nyw2ICsxNjgsNyBAQAogc3RhdGljIHZvaWQga3ZtX3NodXRkb3duKHZvaWQpCiB7CiAJbmF0aXZlX3dyaXRlX21zcihtc3Jfa3ZtX3N5c3RlbV90aW1lLCAwLCAwKTsKKwlrdm1fZGlzYWJsZV9zdGVhbF90aW1lKCk7CiAJbmF0aXZlX21hY2hpbmVfc2h1dGRvd24oKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9hbWQuYyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMKaW5kZXggYzU2MTAzOC4uNTkxYmUwZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9hbWQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jCkBAIC02Niw4ICs2Niw4IEBACiAJdW5zaWduZWQgaW50CQkJbXBiWzBdOwogfTsKIAotI2RlZmluZSBVQ09ERV9DT05UQUlORVJfU0VDVElPTl9IRFIJOAotI2RlZmluZSBVQ09ERV9DT05UQUlORVJfSEVBREVSX1NJWkUJMTIKKyNkZWZpbmUgU0VDVElPTl9IRFJfU0laRQk4CisjZGVmaW5lIENPTlRBSU5FUl9IRFJfU1oJMTIKIAogc3RhdGljIHN0cnVjdCBlcXVpdl9jcHVfZW50cnkgKmVxdWl2X2NwdV90YWJsZTsKIApAQCAtMTU3LDcgKzE1Nyw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHZlcmlmeV91Y29kZV9zaXplKGludCBjcHUsIGNvbnN0IHU4ICpidWYsIHVuc2lnbmVkIGludCBzaXplKQogewogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHUpOwotCXVuc2lnbmVkIGludCBtYXhfc2l6ZSwgYWN0dWFsX3NpemU7CisJdTMyIG1heF9zaXplLCBhY3R1YWxfc2l6ZTsKIAogI2RlZmluZSBGMVhIX01QQl9NQVhfU0laRSAyMDQ4CiAjZGVmaW5lIEYxNEhfTVBCX01BWF9TSVpFIDE4MjQKQEAgLTE3NSw5ICsxNzUsOSBAQAogCQlicmVhazsKIAl9CiAKLQlhY3R1YWxfc2l6ZSA9IGJ1Zls0XSArIChidWZbNV0gPDwgOCk7CisJYWN0dWFsX3NpemUgPSAqKHUzMiAqKShidWYgKyA0KTsKIAotCWlmIChhY3R1YWxfc2l6ZSA+IHNpemUgfHwgYWN0dWFsX3NpemUgPiBtYXhfc2l6ZSkgeworCWlmIChhY3R1YWxfc2l6ZSArIFNFQ1RJT05fSERSX1NJWkUgPiBzaXplIHx8IGFjdHVhbF9zaXplID4gbWF4X3NpemUpIHsKIAkJcHJfZXJyKCJzZWN0aW9uIHNpemUgbWlzbWF0Y2hcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xOTEsNyArMTkxLDcgQEAKIAlzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9hbWQgKm1jID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgYWN0dWFsX3NpemUgPSAwOwogCi0JaWYgKGJ1ZlswXSAhPSBVQ09ERV9VQ09ERV9UWVBFKSB7CisJaWYgKCoodTMyICopYnVmICE9IFVDT0RFX1VDT0RFX1RZUEUpIHsKIAkJcHJfZXJyKCJpbnZhbGlkIHR5cGUgZmllbGQgaW4gY29udGFpbmVyIGZpbGUgc2VjdGlvbiBoZWFkZXJcbiIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMDQsOCArMjA0LDggQEAKIAlpZiAoIW1jKQogCQlnb3RvIG91dDsKIAotCWdldF91Y29kZV9kYXRhKG1jLCBidWYgKyBVQ09ERV9DT05UQUlORVJfU0VDVElPTl9IRFIsIGFjdHVhbF9zaXplKTsKLQkqbWNfc2l6ZSA9IGFjdHVhbF9zaXplICsgVUNPREVfQ09OVEFJTkVSX1NFQ1RJT05fSERSOworCWdldF91Y29kZV9kYXRhKG1jLCBidWYgKyBTRUNUSU9OX0hEUl9TSVpFLCBhY3R1YWxfc2l6ZSk7CisJKm1jX3NpemUgPSBhY3R1YWxfc2l6ZSArIFNFQ1RJT05fSERSX1NJWkU7CiAKIG91dDoKIAlyZXR1cm4gbWM7CkBAIC0yMjksOSArMjI5LDEwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWdldF91Y29kZV9kYXRhKGVxdWl2X2NwdV90YWJsZSwgYnVmICsgVUNPREVfQ09OVEFJTkVSX0hFQURFUl9TSVpFLCBzaXplKTsKKwlnZXRfdWNvZGVfZGF0YShlcXVpdl9jcHVfdGFibGUsIGJ1ZiArIENPTlRBSU5FUl9IRFJfU1osIHNpemUpOwogCi0JcmV0dXJuIHNpemUgKyBVQ09ERV9DT05UQUlORVJfSEVBREVSX1NJWkU7IC8qIGFkZCBoZWFkZXIgbGVuZ3RoICovCisJLyogYWRkIGhlYWRlciBsZW5ndGggKi8KKwlyZXR1cm4gc2l6ZSArIENPTlRBSU5FUl9IRFJfU1o7CiB9CiAKIHN0YXRpYyB2b2lkIGZyZWVfZXF1aXZfY3B1X3RhYmxlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmMKaW5kZXggNTJmMjU2Zi4uOTI1MTc5ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUuYwpAQCAtNDUsMjEgKzQ1LDYgQEAKIAkJCQktMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIAotLyogRnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfYWxsb2MgKi8KLXZvaWQgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKQotewotCXZmcmVlKG1vZHVsZV9yZWdpb24pOwotfQotCi0vKiBXZSBkb24ndCBuZWVkIGFueXRoaW5nIHNwZWNpYWwuICovCi1pbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLAotCQkJICAgICAgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCQkgICAgICBjaGFyICpzZWNzdHJpbmdzLAotCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbW9kKQotewotCXJldHVybiAwOwotfQotCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogaW50IGFwcGx5X3JlbG9jYXRlKEVsZjMyX1NoZHIgKnNlY2hkcnMsCiAJCSAgIGNvbnN0IGNoYXIgKnN0cnRhYiwKQEAgLTEwMCwxNyArODUsNiBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLQotaW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGYzMl9TaGRyICpzZWNoZHJzLAotCQkgICAgICAgY29uc3QgY2hhciAqc3RydGFiLAotCQkgICAgICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAotCQkgICAgICAgdW5zaWduZWQgaW50IHJlbHNlYywKLQkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBBREQgUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwKLQkgICAgICAgbWUtPm5hbWUpOwotCXJldHVybiAtRU5PRVhFQzsKLX0KICNlbHNlIC8qWDg2XzY0Ki8KIGludCBhcHBseV9yZWxvY2F0ZV9hZGQoRWxmNjRfU2hkciAqc2VjaGRycywKIAkJICAgY29uc3QgY2hhciAqc3RydGFiLApAQCAtMTgxLDE3ICsxNTUsNiBAQAogCSAgICAgICBtZS0+bmFtZSk7CiAJcmV0dXJuIC1FTk9FWEVDOwogfQotCi1pbnQgYXBwbHlfcmVsb2NhdGUoRWxmX1NoZHIgKnNlY2hkcnMsCi0JCSAgIGNvbnN0IGNoYXIgKnN0cnRhYiwKLQkJICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAotCQkgICB1bnNpZ25lZCBpbnQgcmVsc2VjLAotCQkgICBzdHJ1Y3QgbW9kdWxlICptZSkKLXsKLQlwcmludGsoS0VSTl9FUlIgIm5vbiBhZGQgcmVsb2NhdGlvbiBub3Qgc3VwcG9ydGVkXG4iKTsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQogI2VuZGlmCiAKIGludCBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jIGIvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKaW5kZXggODY5ZTFhZS4uNjEzYTc5MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKQEAgLTIwMiw2ICsyMDIsMTQgQEAKIAlfX25hdGl2ZV9mbHVzaF90bGJfc2luZ2xlKGFkZHIpOwogfQogCitzdHJ1Y3QganVtcF9sYWJlbF9rZXkgcGFyYXZpcnRfc3RlYWxfZW5hYmxlZDsKK3N0cnVjdCBqdW1wX2xhYmVsX2tleSBwYXJhdmlydF9zdGVhbF9ycV9lbmFibGVkOworCitzdGF0aWMgdTY0IG5hdGl2ZV9zdGVhbF9jbG9jayhpbnQgY3B1KQoreworCXJldHVybiAwOworfQorCiAvKiBUaGVzZSBhcmUgaW4gZW50cnkuUyAqLwogZXh0ZXJuIHZvaWQgbmF0aXZlX2lyZXQodm9pZCk7CiBleHRlcm4gdm9pZCBuYXRpdmVfaXJxX2VuYWJsZV9zeXNleGl0KHZvaWQpOwpAQCAtMzA3LDYgKzMxNSw3IEBACiAKIHN0cnVjdCBwdl90aW1lX29wcyBwdl90aW1lX29wcyA9IHsKIAkuc2NoZWRfY2xvY2sgPSBuYXRpdmVfc2NoZWRfY2xvY2ssCisJLnN0ZWFsX2Nsb2NrID0gbmF0aXZlX3N0ZWFsX2Nsb2NrLAogfTsKIAogc3RydWN0IHB2X2lycV9vcHMgcHZfaXJxX29wcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wY2ktY2FsZ2FyeV82NC5jIGIvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKaW5kZXggZThjMzNhMy4uNzI2NDk0YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKQEAgLTE1NTMsNyArMTU1Myw3IEBACiAJCQljb250aW51ZTsKIAogCQkvKiBjb3ZlciB0aGUgd2hvbGUgcmVnaW9uICovCi0JCW5wYWdlcyA9IChyLT5lbmQgLSByLT5zdGFydCkgPj4gUEFHRV9TSElGVDsKKwkJbnBhZ2VzID0gcmVzb3VyY2Vfc2l6ZShyKSA+PiBQQUdFX1NISUZUOwogCQlucGFnZXMrKzsKIAogCQlpb21tdV9yYW5nZV9yZXNlcnZlKHRibCwgci0+c3RhcnQsIG5wYWdlcyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvYmVfcm9tcy5jIGIvYXJjaC94ODYva2VybmVsL3Byb2JlX3JvbXMuYwppbmRleCBiYTBhNGNjLi42MzIyODAzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvYmVfcm9tcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9iZV9yb21zLmMKQEAgLTIzNCw3ICsyMzQsNyBAQAogCS8qIGNoZWNrIGZvciBleHRlbnNpb24gcm9tIChpZ25vcmUgbGVuZ3RoIGJ5dGUhKSAqLwogCXJvbSA9IGlzYV9idXNfdG9fdmlydChleHRlbnNpb25fcm9tX3Jlc291cmNlLnN0YXJ0KTsKIAlpZiAocm9tc2lnbmF0dXJlKHJvbSkpIHsKLQkJbGVuZ3RoID0gZXh0ZW5zaW9uX3JvbV9yZXNvdXJjZS5lbmQgLSBleHRlbnNpb25fcm9tX3Jlc291cmNlLnN0YXJ0ICsgMTsKKwkJbGVuZ3RoID0gcmVzb3VyY2Vfc2l6ZSgmZXh0ZW5zaW9uX3JvbV9yZXNvdXJjZSk7CiAJCWlmIChyb21jaGVja3N1bShyb20sIGxlbmd0aCkpIHsKIAkJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmZXh0ZW5zaW9uX3JvbV9yZXNvdXJjZSk7CiAJCQl1cHBlciA9IGV4dGVuc2lvbl9yb21fcmVzb3VyY2Uuc3RhcnQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCAyZTQ5MjhkLi5lMWJhOGNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMzNyw3ICszMzcsNyBAQAogICogUG93ZXJtYW5hZ2VtZW50IGlkbGUgZnVuY3Rpb24sIGlmIGFueS4uCiAgKi8KIHZvaWQgKCpwbV9pZGxlKSh2b2lkKTsKLSNpZiBkZWZpbmVkKENPTkZJR19BUE1fTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19BUE1fQ1BVX0lETEUpCisjaWZkZWYgQ09ORklHX0FQTV9NT0RVTEUKIEVYUE9SVF9TWU1CT0wocG1faWRsZSk7CiAjZW5kaWYKIApAQCAtMzk5LDcgKzM5OSw3IEBACiAJCWNwdV9yZWxheCgpOwogCX0KIH0KLSNpZiBkZWZpbmVkKENPTkZJR19BUE1fTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19BUE1fQ1BVX0lETEUpCisjaWZkZWYgQ09ORklHX0FQTV9NT0RVTEUKIEVYUE9SVF9TWU1CT0woZGVmYXVsdF9pZGxlKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCA4ZDEyODc4Li5hM2QwZGM1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTI0NSw3ICsyNDUsNiBAQAogewogCXNldF91c2VyX2dzKHJlZ3MsIDApOwogCXJlZ3MtPmZzCQk9IDA7Ci0Jc2V0X2ZzKFVTRVJfRFMpOwogCXJlZ3MtPmRzCQk9IF9fVVNFUl9EUzsKIAlyZWdzLT5lcwkJPSBfX1VTRVJfRFM7CiAJcmVncy0+c3MJCT0gX19VU0VSX0RTOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKaW5kZXggNmM5ZGQ5Mi4uY2E2ZjdhYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCkBAIC0zMzgsNyArMzM4LDYgQEAKIAlyZWdzLT5jcwkJPSBfY3M7CiAJcmVncy0+c3MJCT0gX3NzOwogCXJlZ3MtPmZsYWdzCQk9IFg4Nl9FRkxBR1NfSUY7Ci0Jc2V0X2ZzKFVTRVJfRFMpOwogCS8qCiAJICogRnJlZSB0aGUgb2xkIEZQIGFuZCBvdGhlciBleHRlbmRlZCBzdGF0ZQogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCmluZGV4IDgwN2MyYTIuLjgyNTI4NzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTUyOCw3ICs1MjgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHB0cmFjZV90cmlnZ2VyZWQoc3RydWN0IHBlcmZfZXZlbnQgKmJwLCBpbnQgbm1pLAorc3RhdGljIHZvaWQgcHRyYWNlX3RyaWdnZXJlZChzdHJ1Y3QgcGVyZl9ldmVudCAqYnAsCiAJCQkgICAgIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLAogCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTcxNSw3ICs3MTUsOCBAQAogCQlhdHRyLmJwX3R5cGUgPSBIV19CUkVBS1BPSU5UX1c7CiAJCWF0dHIuZGlzYWJsZWQgPSAxOwogCi0JCWJwID0gcmVnaXN0ZXJfdXNlcl9od19icmVha3BvaW50KCZhdHRyLCBwdHJhY2VfdHJpZ2dlcmVkLCB0c2spOworCQlicCA9IHJlZ2lzdGVyX3VzZXJfaHdfYnJlYWtwb2ludCgmYXR0ciwgcHRyYWNlX3RyaWdnZXJlZCwKKwkJCQkJCSBOVUxMLCB0c2spOwogCiAJCS8qCiAJCSAqIENIRUNLTUU6IHRoZSBwcmV2aW91cyBjb2RlIHJldHVybmVkIC1FSU8gaWYgdGhlIGFkZHIgd2Fzbid0CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMKaW5kZXggOGJiZThjNS4uYjc4NjQzZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYwpAQCAtMTAsNyArMTAsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfaW50ZWxfaXJxYmFsYW5jZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXU4IGNvbmZpZywgcmV2OworCXU4IGNvbmZpZzsKIAl1MTYgd29yZDsKIAogCS8qIEJJT1MgbWF5IGVuYWJsZSBoYXJkd2FyZSBJUlEgYmFsYW5jaW5nIGZvcgpAQCAtMTgsOCArMTgsNyBAQAogCSAqIGJhc2VkIHBsYXRmb3Jtcy4KIAkgKiBEaXNhYmxlIFNXIGlycWJhbGFuY2UvYWZmaW5pdHkgb24gdGhvc2UgcGxhdGZvcm1zLgogCSAqLwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmcmV2KTsKLQlpZiAocmV2ID4gMHg5KQorCWlmIChkZXYtPnJldmlzaW9uID4gMHg5KQogCQlyZXR1cm47CiAKIAkvKiBlbmFibGUgYWNjZXNzIHRvIGNvbmZpZyBzcGFjZSovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggMGMwMTZmNy4uOTI0MjQzNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtMjk0LDYgKzI5NCwxNCBAQAogCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiVmVyc2FMb2dpYyBNZW5sb3cgYm9hcmQiKSwKIAkJfSwKIAl9LAorCXsgLyogSGFuZGxlIHJlYm9vdCBpc3N1ZSBvbiBBY2VyIEFzcGlyZSBvbmUgKi8KKwkJLmNhbGxiYWNrID0gc2V0X2Jpb3NfcmVib290LAorCQkuaWRlbnQgPSAiQWNlciBBc3BpcmUgT25lIEExMTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQU9BMTEwIiksCisJCX0sCisJfSwKIAl7IH0KIH07CiAKQEAgLTQxMSw2ICs0MTksMzAgQEAKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiaU1hYzksMSIpLAogCQl9LAogCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gdGhlIExhdGl0dWRlIEU2MzIwLiAqLworCQkuY2FsbGJhY2sgPSBzZXRfcGNpX3JlYm9vdCwKKwkJLmlkZW50ID0gIkRlbGwgTGF0aXR1ZGUgRTYzMjAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMYXRpdHVkZSBFNjMyMCIpLAorCQl9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gdGhlIExhdGl0dWRlIEU1NDIwLiAqLworCQkuY2FsbGJhY2sgPSBzZXRfcGNpX3JlYm9vdCwKKwkJLmlkZW50ID0gIkRlbGwgTGF0aXR1ZGUgRTU0MjAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMYXRpdHVkZSBFNTQyMCIpLAorCQl9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gdGhlIExhdGl0dWRlIEU2NDIwLiAqLworCQkuY2FsbGJhY2sgPSBzZXRfcGNpX3JlYm9vdCwKKwkJLmlkZW50ID0gIkRlbGwgTGF0aXR1ZGUgRTY0MjAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMYXRpdHVkZSBFNjQyMCIpLAorCQl9LAorCX0sCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVsb2NhdGVfa2VybmVsXzMyLlMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVsb2NhdGVfa2VybmVsXzMyLlMKaW5kZXggNDEyMzU1My4uMzY4MThmOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3JlbG9jYXRlX2tlcm5lbF8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWxfMzIuUwpAQCAtOTcsNiArOTcsOCBAQAogCXJldAogCiBpZGVudGl0eV9tYXBwZWQ6CisJLyogc2V0IHJldHVybiBhZGRyZXNzIHRvIDAgaWYgbm90IHByZXNlcnZpbmcgY29udGV4dCAqLworCXB1c2hsCSQwCiAJLyogc3RvcmUgdGhlIHN0YXJ0IGFkZHJlc3Mgb24gdGhlIHN0YWNrICovCiAJcHVzaGwgICAlZWR4CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWxfNjQuUyBiL2FyY2gveDg2L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWxfNjQuUwppbmRleCA0ZGU4ZjViLi43YTZmM2IzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcmVsb2NhdGVfa2VybmVsXzY0LlMKKysrIGIvYXJjaC94ODYva2VybmVsL3JlbG9jYXRlX2tlcm5lbF82NC5TCkBAIC0xMDAsNiArMTAwLDggQEAKIAlyZXQKIAogaWRlbnRpdHlfbWFwcGVkOgorCS8qIHNldCByZXR1cm4gYWRkcmVzcyB0byAwIGlmIG5vdCBwcmVzZXJ2aW5nIGNvbnRleHQgKi8KKwlwdXNocQkkMAogCS8qIHN0b3JlIHRoZSBzdGFydCBhZGRyZXNzIG9uIHRoZSBzdGFjayAqLwogCXB1c2hxICAgJXJkeAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNDBhMjQ5My4uNTRkZGFlYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMKQEAgLTQ4NSwxNyArNDg1LDE4IEBACiBhc21saW5rYWdlIGludAogc3lzX3NpZ3N1c3BlbmQoaW50IGhpc3RvcnkwLCBpbnQgaGlzdG9yeTEsIG9sZF9zaWdzZXRfdCBtYXNrKQogewotCW1hc2sgJj0gX0JMT0NLQUJMRTsKLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzaWdzZXRfdCBibG9ja2VkOworCiAJY3VycmVudC0+c2F2ZWRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7Ci0Jc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgbWFzayk7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJbWFzayAmPSBfQkxPQ0tBQkxFOworCXNpZ2luaXRzZXQoJmJsb2NrZWQsIG1hc2spOworCXNldF9jdXJyZW50X2Jsb2NrZWQoJmJsb2NrZWQpOwogCiAJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CiAJc2NoZWR1bGUoKTsKLQlzZXRfcmVzdG9yZV9zaWdtYXNrKCk7CiAKKwlzZXRfcmVzdG9yZV9zaWdtYXNrKCk7CiAJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIApAQCAtNTcyLDEwICs1NzMsNyBAQAogCQlnb3RvIGJhZGZyYW1lOwogCiAJc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2V0X2N1cnJlbnRfYmxvY2tlZCgmc2V0KTsKIAogCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT5zYywgJmF4KSkKIAkJZ290byBiYWRmcmFtZTsKQEAgLTY1MywxMSArNjUxLDE1IEBACiAKIHN0YXRpYyBpbnQKIHNldHVwX3J0X2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKLQkgICAgICAgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCB1c2lnID0gc2lnbnJfY29udmVydChzaWcpOworCXNpZ3NldF90ICpzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKIAlpbnQgcmV0OwogCisJaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICYgVFNfUkVTVE9SRV9TSUdNQVNLKQorCQlzZXQgPSAmY3VycmVudC0+c2F2ZWRfc2lnbWFzazsKKwogCS8qIFNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KIAlpZiAoaXNfaWEzMikgewogCQlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKQEAgLTY3MiwxMiArNjc0LDEzIEBACiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAorCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICY9IH5UU19SRVNUT1JFX1NJR01BU0s7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludAogaGFuZGxlX3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywgc2lnaW5mb190ICppbmZvLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAotCSAgICAgIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzaWdzZXRfdCBibG9ja2VkOwogCWludCByZXQ7CkBAIC03MTIsMjAgKzcxNSwxMSBAQAogCSAgICBsaWtlbHkodGVzdF9hbmRfY2xlYXJfdGhyZWFkX2ZsYWcoVElGX0ZPUkNFRF9URikpKQogCQlyZWdzLT5mbGFncyAmPSB+WDg2X0VGTEFHU19URjsKIAotCXJldCA9IHNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CisJcmV0ID0gc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgcmVncyk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCS8qCi0JICogVGhpcyBoYXMgbm90aGluZyB0byBkbyB3aXRoIHNlZ21lbnQgcmVnaXN0ZXJzLAotCSAqIGRlc3BpdGUgdGhlIG5hbWUuICBUaGlzIG1hZ2ljIGFmZmVjdHMgdWFjY2Vzcy5oCi0JICogbWFjcm9zJyBiZWhhdmlvci4gIFJlc2V0IGl0IHRvIHRoZSBub3JtYWwgc2V0dGluZy4KLQkgKi8KLQlzZXRfZnMoVVNFUl9EUyk7Ci0jZW5kaWYKLQogCS8qCiAJICogQ2xlYXIgdGhlIGRpcmVjdGlvbiBmbGFnIGFzIHBlciB0aGUgQUJJIGZvciBmdW5jdGlvbiBlbnRyeS4KIAkgKi8KQEAgLTc2Nyw3ICs3NjEsNiBAQAogCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKIAlzaWdpbmZvX3QgaW5mbzsKIAlpbnQgc2lnbnI7Ci0Jc2lnc2V0X3QgKm9sZHNldDsKIAogCS8qCiAJICogV2Ugd2FudCB0aGUgY29tbW9uIGNhc2UgdG8gZ28gZmFzdCwgd2hpY2ggaXMgd2h5IHdlIG1heSBpbiBjZXJ0YWluCkBAIC03NzksMjMgKzc3MiwxMCBAQAogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQogCQlyZXR1cm47CiAKLQlpZiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgJiBUU19SRVNUT1JFX1NJR01BU0spCi0JCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOwotCWVsc2UKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7Ci0KIAlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKIAlpZiAoc2lnbnIgPiAwKSB7CiAJCS8qIFdoZWUhIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCi0JCWlmIChoYW5kbGVfc2lnbmFsKHNpZ25yLCAmaW5mbywgJmthLCBvbGRzZXQsIHJlZ3MpID09IDApIHsKLQkJCS8qCi0JCQkgKiBBIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkCi0JCQkgKiBzaWdtYXNrIHdpbGwgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgc2lnbmFsIGZyYW1lLAotCQkJICogYW5kIHdpbGwgYmUgcmVzdG9yZWQgYnkgc2lncmV0dXJuLCBzbyB3ZSBjYW4gc2ltcGx5Ci0JCQkgKiBjbGVhciB0aGUgVFNfUkVTVE9SRV9TSUdNQVNLIGZsYWcuCi0JCQkgKi8KLQkJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICY9IH5UU19SRVNUT1JFX1NJR01BU0s7Ci0JCX0KKwkJaGFuZGxlX3NpZ25hbChzaWduciwgJmluZm8sICZrYSwgcmVncyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTgyMyw3ICs4MDMsNyBAQAogCSAqLwogCWlmIChjdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmIFRTX1JFU1RPUkVfU0lHTUFTSykgewogCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmPSB+VFNfUkVTVE9SRV9TSUdNQVNLOwotCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOworCQlzZXRfY3VycmVudF9ibG9ja2VkKCZjdXJyZW50LT5zYXZlZF9zaWdtYXNrKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDMzYTBjMTEuLjlmNTQ4Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwpAQCAtMjg1LDYgKzI4NSwxOSBAQAogCXBlcl9jcHUoY3B1X3N0YXRlLCBzbXBfcHJvY2Vzc29yX2lkKCkpID0gQ1BVX09OTElORTsKIAl4ODZfcGxhdGZvcm0ubm1pX2luaXQoKTsKIAorCS8qCisJICogV2FpdCB1bnRpbCB0aGUgY3B1IHdoaWNoIGJyb3VnaHQgdGhpcyBvbmUgdXAgbWFya2VkIGl0CisJICogb25saW5lIGJlZm9yZSBlbmFibGluZyBpbnRlcnJ1cHRzLiBJZiB3ZSBkb24ndCBkbyB0aGF0IHRoZW4KKwkgKiB3ZSBjYW4gZW5kIHVwIHdha2luZyB1cCB0aGUgc29mdGlycSB0aHJlYWQgYmVmb3JlIHRoaXMgY3B1CisJICogcmVhY2hlZCB0aGUgYWN0aXZlIHN0YXRlLCB3aGljaCBtYWtlcyB0aGUgc2NoZWR1bGVyIHVuaGFwcHkKKwkgKiBhbmQgc2NoZWR1bGUgdGhlIHNvZnRpcnEgdGhyZWFkIG9uIHRoZSB3cm9uZyBjcHUuIFRoaXMgaXMKKwkgKiBvbmx5IG9ic2VydmFibGUgd2l0aCBmb3JjZWQgdGhyZWFkZWQgaW50ZXJydXB0cywgYnV0IGluCisJICogdGhlb3J5IGl0IGNvdWxkIGFsc28gaGFwcGVuIHcvbyB0aGVtLiBJdCdzIGp1c3Qgd2F5IGhhcmRlcgorCSAqIHRvIGFjaGlldmUuCisJICovCisJd2hpbGUgKCFjcHVtYXNrX3Rlc3RfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X2FjdGl2ZV9tYXNrKSkKKwkJY3B1X3JlbGF4KCk7CisKIAkvKiBlbmFibGUgbG9jYWwgaW50ZXJydXB0cyAqLwogCWxvY2FsX2lycV9lbmFibGUoKTsKIApAQCAtNDI1LDcgKzQzOCw3IEBACiB2b2lkIF9faW5xdWlyZV9yZW1vdGVfYXBpYyhpbnQgYXBpY2lkKQogewogCXVuc2lnbmVkIGksIHJlZ3NbXSA9IHsgQVBJQ19JRCA+PiA0LCBBUElDX0xWUiA+PiA0LCBBUElDX1NQSVYgPj4gNCB9OwotCWNoYXIgKm5hbWVzW10gPSB7ICJJRCIsICJWRVJTSU9OIiwgIlNQSVYiIH07CisJY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10gPSB7ICJJRCIsICJWRVJTSU9OIiwgIlNQSVYiIH07CiAJaW50IHRpbWVvdXQ7CiAJdTMyIHN0YXR1czsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggNTVkOWJjMC4uZmRkMGM2NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC02Niw3ICs2Niw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlKTsKIAotdm9pZCBzYXZlX3N0YWNrX3RyYWNlX3JlZ3Moc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit2b2lkIHNhdmVfc3RhY2tfdHJhY2VfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKIHsKIAlkdW1wX3RyYWNlKGN1cnJlbnQsIHJlZ3MsIE5VTEwsIDAsICZzYXZlX3N0YWNrX29wcywgdHJhY2UpOwogCWlmICh0cmFjZS0+bnJfZW50cmllcyA8IHRyYWNlLT5tYXhfZW50cmllcykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90Ym9vdC5jIGIvYXJjaC94ODYva2VybmVsL3Rib290LmMKaW5kZXggMzBhYzY1ZC4uZTA3YTJmYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Rib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Rib290LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vYm9vdHBhcmFtLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9zd2lvdGxiLmg+CiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RpbWUuYyBiL2FyY2gveDg2L2tlcm5lbC90aW1lLmMKaW5kZXggMDBjYmIyNy4uNWE2NGQwNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdGltZS5jCkBAIC0xMSwxMyArMTEsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pODI1My5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tY2EuaD4KIAogI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS94ODZfaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9pODI1OS5oPgotI2luY2x1ZGUgPGFzbS9pODI1My5oPgogI2luY2x1ZGUgPGFzbS90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKaW5kZXggYjliNjcxNi4uZmJjMDk3YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKQEAgLTg3Miw2ICs4NzIsMTIgQEAKIAlzZXRfYml0KFNZU0NBTExfVkVDVE9SLCB1c2VkX3ZlY3RvcnMpOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJQlVHX09OKHRlc3RfYml0KFZTWVNDQUxMX0VNVV9WRUNUT1IsIHVzZWRfdmVjdG9ycykpOworCXNldF9zeXN0ZW1faW50cl9nYXRlKFZTWVNDQUxMX0VNVV9WRUNUT1IsICZlbXVsYXRlX3ZzeXNjYWxsKTsKKwlzZXRfYml0KFZTWVNDQUxMX0VNVV9WRUNUT1IsIHVzZWRfdmVjdG9ycyk7CisjZW5kaWYKKwogCS8qCiAJICogU2hvdWxkIGJlIGEgYmFycmllciBmb3IgYW55IGV4dGVybmFsIENQVSBzdGF0ZToKIAkgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90c2MuYyBiL2FyY2gveDg2L2tlcm5lbC90c2MuYwppbmRleCA2Y2M2OTIyLi5kYjQ4MzM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RzYy5jCkBAIC01LDcgKzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaV9wbXRtci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CkBAIC03NzcsNyArNzc2LDcgQEAKIAkuZmxhZ3MgICAgICAgICAgICAgICAgICA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTIHwKIAkJCQkgIENMT0NLX1NPVVJDRV9NVVNUX1ZFUklGWSwKICNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JLnZyZWFkICAgICAgICAgICAgICAgICAgPSB2cmVhZF90c2MsCisJLmFyY2hkYXRhICAgICAgICAgICAgICAgPSB7IC52Y2xvY2tfbW9kZSA9IFZDTE9DS19UU0MgfSwKICNlbmRpZgogfTsKIApAQCAtODAwLDI3ICs3OTksNiBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTChtYXJrX3RzY191bnN0YWJsZSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IGRtaV9tYXJrX3RzY191bnN0YWJsZShjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKLXsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIGRldGVjdGVkOiBtYXJraW5nIFRTQyB1bnN0YWJsZS5cbiIsCi0JCQlkLT5pZGVudCk7Ci0JdHNjX3Vuc3RhYmxlID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyogTGlzdCBvZiBzeXN0ZW1zIHRoYXQgaGF2ZSBrbm93biBUU0MgcHJvYmxlbXMgKi8KLXN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIGJhZF90c2NfZG1pX3RhYmxlW10gPSB7Ci0JewotCQkuY2FsbGJhY2sgPSBkbWlfbWFya190c2NfdW5zdGFibGUsCi0JCS5pZGVudCA9ICJJQk0gVGhpbmtwYWQgMzgwWEQiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCi0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICIyNjM1RkEwIiksCi0JCX0sCi0JfSwKLQl7fQotfTsKLQogc3RhdGljIHZvaWQgX19pbml0IGNoZWNrX3N5c3RlbV90c2NfcmVsaWFibGUodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfTUdFT0RFX0xYCkBAIC0xMDEwLDggKzk4OCw2IEBACiAJbHBqX2ZpbmUgPSBscGo7CiAKIAl1c2VfdHNjX2RlbGF5KCk7Ci0JLyogQ2hlY2sgYW5kIGluc3RhbGwgdGhlIFRTQyBjbG9ja3NvdXJjZSAqLwotCWRtaV9jaGVja19zeXN0ZW0oYmFkX3RzY19kbWlfdGFibGUpOwogCiAJaWYgKHVuc3luY2hyb25pemVkX3RzYygpKQogCQltYXJrX3RzY191bnN0YWJsZSgiVFNDcyB1bnN5bmNocm9uaXplZCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA4OWFlZDk5Li40YWE5YzU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTYxLDUwICsxNjEsNDcgQEAKIAogI2RlZmluZSBWVklSVF9PRkZTRVQgKFZTWVNDQUxMX0FERFIgLSBfX3ZzeXNjYWxsXzApCiAjZGVmaW5lIFZWSVJUKHgpIChBRERSKHgpIC0gVlZJUlRfT0ZGU0VUKQotI2RlZmluZSBFTUlUX1ZWQVIoeCwgb2Zmc2V0KSAudnN5c2NhbGxfdmFyXyAjIyB4CVwKLQlBRERSKC52c3lzY2FsbF8wKSArIG9mZnNldAkJIAlcCi0JOiBBVChWTE9BRCgudnN5c2NhbGxfdmFyXyAjIyB4KSkgeyAgICAgCQlcCi0JCSooLnZzeXNjYWxsX3Zhcl8gIyMgeCkJCQlcCi0JfQkJCQkJCVwKLQl4ID0gVlZJUlQoLnZzeXNjYWxsX3Zhcl8gIyMgeCk7CiAKIAkuID0gQUxJR04oNDA5Nik7CiAJX192c3lzY2FsbF8wID0gLjsKIAogCS4gPSBWU1lTQ0FMTF9BRERSOwotCS52c3lzY2FsbF8wIDogQVQoVkxPQUQoLnZzeXNjYWxsXzApKSB7CisJLnZzeXNjYWxsIDogQVQoVkxPQUQoLnZzeXNjYWxsKSkgewogCQkqKC52c3lzY2FsbF8wKQotCX0gOnVzZXIKIAotCS4gPSBBTElHTihMMV9DQUNIRV9CWVRFUyk7Ci0JLnZzeXNjYWxsX2ZuIDogQVQoVkxPQUQoLnZzeXNjYWxsX2ZuKSkgewotCQkqKC52c3lzY2FsbF9mbikKLQl9Ci0KLQkudnN5c2NhbGxfMSBBRERSKC52c3lzY2FsbF8wKSArIDEwMjQ6IEFUKFZMT0FEKC52c3lzY2FsbF8xKSkgeworCQkuID0gMTAyNDsKIAkJKigudnN5c2NhbGxfMSkKLQl9Ci0JLnZzeXNjYWxsXzIgQUREUigudnN5c2NhbGxfMCkgKyAyMDQ4OiBBVChWTE9BRCgudnN5c2NhbGxfMikpIHsKKworCQkuID0gMjA0ODsKIAkJKigudnN5c2NhbGxfMikKLQl9CiAKLQkudnN5c2NhbGxfMyBBRERSKC52c3lzY2FsbF8wKSArIDMwNzI6IEFUKFZMT0FEKC52c3lzY2FsbF8zKSkgewotCQkqKC52c3lzY2FsbF8zKQotCX0KLQotI2RlZmluZSBfX1ZWQVJfS0VSTkVMX0xEUwotI2luY2x1ZGUgPGFzbS92dmFyLmg+Ci0jdW5kZWYgX19WVkFSX0tFUk5FTF9MRFMKLQotCS4gPSBfX3ZzeXNjYWxsXzAgKyBQQUdFX1NJWkU7CisJCS4gPSA0MDk2OyAgLyogUGFkIHRoZSB3aG9sZSBwYWdlLiAqLworCX0gOnVzZXIgPTB4Y2MKKwkuID0gQUxJR04oX192c3lzY2FsbF8wICsgUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwogCiAjdW5kZWYgVlNZU0NBTExfQUREUgogI3VuZGVmIFZMT0FEX09GRlNFVAogI3VuZGVmIFZMT0FECiAjdW5kZWYgVlZJUlRfT0ZGU0VUCiAjdW5kZWYgVlZJUlQKKworCV9fdnZhcl9wYWdlID0gLjsKKworCS52dmFyIDogQVQoQUREUigudnZhcikgLSBMT0FEX09GRlNFVCkgeworCisJICAgICAgLyogUGxhY2UgYWxsIHZ2YXJzIGF0IHRoZSBvZmZzZXRzIGluIGFzbS92dmFyLmguICovCisjZGVmaW5lIEVNSVRfVlZBUihuYW1lLCBvZmZzZXQpIAkJXAorCQkuID0gb2Zmc2V0OwkJXAorCQkqKC52dmFyXyAjIyBuYW1lKQorI2RlZmluZSBfX1ZWQVJfS0VSTkVMX0xEUworI2luY2x1ZGUgPGFzbS92dmFyLmg+CisjdW5kZWYgX19WVkFSX0tFUk5FTF9MRFMKICN1bmRlZiBFTUlUX1ZWQVIKIAorCX0gOmRhdGEKKworICAgICAgIC4gPSBBTElHTihfX3Z2YXJfcGFnZSArIFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKwogI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8KIAogCS8qIEluaXQgY29kZSBhbmQgZGF0YSAtIHdpbGwgYmUgZnJlZWQgYWZ0ZXIgaW5pdCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZyZWFkX3RzY182NC5jIGIvYXJjaC94ODYva2VybmVsL3ZyZWFkX3RzY182NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODFhYTllLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC92cmVhZF90c2NfNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIFRoaXMgY29kZSBydW5zIGluIHVzZXJzcGFjZS4gKi8KLQotI2RlZmluZSBESVNBQkxFX0JSQU5DSF9QUk9GSUxJTkcKLSNpbmNsdWRlIDxhc20vdmd0b2QuaD4KLQotbm90cmFjZSBjeWNsZV90IF9fdnN5c2NhbGxfZm4gdnJlYWRfdHNjKHZvaWQpCi17Ci0JY3ljbGVfdCByZXQ7Ci0JdTY0IGxhc3Q7Ci0KLQkvKgotCSAqIEVtcGlyaWNhbGx5LCBhIGZlbmNlIChvZiB0eXBlIHRoYXQgZGVwZW5kcyBvbiB0aGUgQ1BVKQotCSAqIGJlZm9yZSByZHRzYyBpcyBlbm91Z2ggdG8gZW5zdXJlIHRoYXQgcmR0c2MgaXMgb3JkZXJlZAotCSAqIHdpdGggcmVzcGVjdCB0byBsb2Fkcy4gIFRoZSB2YXJpb3VzIENQVSBtYW51YWxzIGFyZSB1bmNsZWFyCi0JICogYXMgdG8gd2hldGhlciByZHRzYyBjYW4gYmUgcmVvcmRlcmVkIHdpdGggbGF0ZXIgbG9hZHMsCi0JICogYnV0IG5vIG9uZSBoYXMgZXZlciBzZWVuIGl0IGhhcHBlbi4KLQkgKi8KLQlyZHRzY19iYXJyaWVyKCk7Ci0JcmV0ID0gKGN5Y2xlX3QpdmdldF9jeWNsZXMoKTsKLQotCWxhc3QgPSBWVkFSKHZzeXNjYWxsX2d0b2RfZGF0YSkuY2xvY2suY3ljbGVfbGFzdDsKLQotCWlmIChsaWtlbHkocmV0ID49IGxhc3QpKQotCQlyZXR1cm4gcmV0OwotCi0JLyoKLQkgKiBHQ0MgbGlrZXMgdG8gZ2VuZXJhdGUgY21vdiBoZXJlLCBidXQgdGhpcyBicmFuY2ggaXMgZXh0cmVtZWx5Ci0JICogcHJlZGljdGFibGUgKGl0J3MganVzdCBhIGZ1bmNpdG9uIG9mIHRpbWUgYW5kIHRoZSBsaWtlbHkgaXMKLQkgKiB2ZXJ5IGxpa2VseSkgYW5kIHRoZXJlJ3MgYSBkYXRhIGRlcGVuZGVuY2UsIHNvIGZvcmNlIEdDQwotCSAqIHRvIGdlbmVyYXRlIGEgYnJhbmNoIGluc3RlYWQuICBJIGRvbid0IGJhcnJpZXIoKSBiZWNhdXNlCi0JICogd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCBhIGJhcnJpZXIsIGFuZCBpZiB0aGlzIGZ1bmN0aW9uCi0JICogZXZlciBnZXRzIGlubGluZWQgaXQgd2lsbCBnZW5lcmF0ZSB3b3JzZSBjb2RlLgotCSAqLwotCWFzbSB2b2xhdGlsZSAoIiIpOwotCXJldHVybiBsYXN0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwppbmRleCAzZTY4MjE4Li5kZGE3ZGZmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwpAQCAtMiw2ICsyLDggQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQW5kcmVhIEFyY2FuZ2VsaSA8YW5kcmVhQHN1c2UuZGU+IFN1U0UKICAqICBDb3B5cmlnaHQgMjAwMyBBbmRpIEtsZWVuLCBTdVNFIExhYnMuCiAgKgorICogIFsgTk9URTogdGhpcyBtZWNoYW5pc20gaXMgbm93IGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdGhlIHZEU08uIF0KKyAqCiAgKiAgVGhhbmtzIHRvIGhwYUB0cmFuc21ldGEuY29tIGZvciBzb21lIHVzZWZ1bCBoaW50LgogICogIFNwZWNpYWwgdGhhbmtzIHRvIEluZ28gTW9sbmFyIGZvciBoaXMgZWFybHkgZXhwZXJpZW5jZSB3aXRoCiAgKiAgYSBkaWZmZXJlbnQgdnN5c2NhbGwgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4L0lBMzIgYW5kIGZvciB0aGUgbmFtZS4KQEAgLTExLDEwICsxMyw5IEBACiAgKiAgdnN5c2NhbGxzLiBPbmUgdnN5c2NhbGwgY2FuIHJlc2VydmUgbW9yZSB0aGFuIDEgc2xvdCB0byBhdm9pZAogICogIGp1bXBpbmcgb3V0IG9mIGxpbmUgaWYgbmVjZXNzYXJ5LiBXZSBjYW5ub3QgYWRkIG1vcmUgd2l0aCB0aGlzCiAgKiAgbWVjaGFuaXNtIGJlY2F1c2Ugb2xkZXIga2VybmVscyB3b24ndCByZXR1cm4gLUVOT1NZUy4KLSAqICBJZiB3ZSB3YW50IG1vcmUgdGhhbiBmb3VyIHdlIG5lZWQgYSB2RFNPLgogICoKLSAqICBOb3RlOiB0aGUgY29uY2VwdCBjbGFzaGVzIHdpdGggdXNlciBtb2RlIGxpbnV4LiBJZiB5b3UgdXNlIFVNTCBhbmQKLSAqICB3YW50IHBlciBndWVzdCB0aW1lIGp1c3Qgc2V0IHRoZSBrZXJuZWwudnN5c2NhbGw2NCBzeXNjdGwgdG8gMC4KKyAqICBOb3RlOiB0aGUgY29uY2VwdCBjbGFzaGVzIHdpdGggdXNlciBtb2RlIGxpbnV4LiAgVU1MIHVzZXJzIHNob3VsZAorICogIHVzZSB0aGUgdkRTTy4KICAqLwogCiAvKiBEaXNhYmxlIHByb2ZpbGluZyBmb3IgdXNlcnNwYWNlIGNvZGU6ICovCkBAIC0zMiw5ICszMywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2NvbXBhdC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KQEAgLTQ0LDE2ICs0OCwxMiBAQAogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+CiAjaW5jbHVkZSA8YXNtL3ZndG9kLmg+Ci0KLSNkZWZpbmUgX192c3lzY2FsbChucikgXAotCQlfX2F0dHJpYnV0ZV9fICgodW51c2VkLCBfX3NlY3Rpb25fXygiLnZzeXNjYWxsXyIgI25yKSkpIG5vdHJhY2UKLSNkZWZpbmUgX19zeXNjYWxsX2Nsb2JiZXIgInIxMSIsImN4IiwibWVtb3J5IgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogCiBERUZJTkVfVlZBUihpbnQsIHZnZXRjcHVfbW9kZSk7CiBERUZJTkVfVlZBUihzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhLCB2c3lzY2FsbF9ndG9kX2RhdGEpID0KIHsKIAkubG9jayA9IF9fU0VRTE9DS19VTkxPQ0tFRChfX3ZzeXNjYWxsX2d0b2RfZGF0YS5sb2NrKSwKLQkuc3lzY3RsX2VuYWJsZWQgPSAxLAogfTsKIAogdm9pZCB1cGRhdGVfdnN5c2NhbGxfdHoodm9pZCkKQEAgLTcyLDE3OSArNzIsMTQ5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmdnN5c2NhbGxfZ3RvZF9kYXRhLmxvY2ssIGZsYWdzKTsKKwogCS8qIGNvcHkgdnN5c2NhbGwgZGF0YSAqLwotCXZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay52cmVhZCA9IGNsb2NrLT52cmVhZDsKLQl2c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2suY3ljbGVfbGFzdCA9IGNsb2NrLT5jeWNsZV9sYXN0OwotCXZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay5tYXNrID0gY2xvY2stPm1hc2s7Ci0JdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrLm11bHQgPSBtdWx0OwotCXZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay5zaGlmdCA9IGNsb2NrLT5zaGlmdDsKLQl2c3lzY2FsbF9ndG9kX2RhdGEud2FsbF90aW1lX3NlYyA9IHdhbGxfdGltZS0+dHZfc2VjOwotCXZzeXNjYWxsX2d0b2RfZGF0YS53YWxsX3RpbWVfbnNlYyA9IHdhbGxfdGltZS0+dHZfbnNlYzsKLQl2c3lzY2FsbF9ndG9kX2RhdGEud2FsbF90b19tb25vdG9uaWMgPSAqd3RtOwotCXZzeXNjYWxsX2d0b2RfZGF0YS53YWxsX3RpbWVfY29hcnNlID0gX19jdXJyZW50X2tlcm5lbF90aW1lKCk7CisJdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrLnZjbG9ja19tb2RlCT0gY2xvY2stPmFyY2hkYXRhLnZjbG9ja19tb2RlOworCXZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay5jeWNsZV9sYXN0CT0gY2xvY2stPmN5Y2xlX2xhc3Q7CisJdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrLm1hc2sJCT0gY2xvY2stPm1hc2s7CisJdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrLm11bHQJCT0gbXVsdDsKKwl2c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2suc2hpZnQJCT0gY2xvY2stPnNoaWZ0OworCXZzeXNjYWxsX2d0b2RfZGF0YS53YWxsX3RpbWVfc2VjCT0gd2FsbF90aW1lLT50dl9zZWM7CisJdnN5c2NhbGxfZ3RvZF9kYXRhLndhbGxfdGltZV9uc2VjCT0gd2FsbF90aW1lLT50dl9uc2VjOworCXZzeXNjYWxsX2d0b2RfZGF0YS53YWxsX3RvX21vbm90b25pYwk9ICp3dG07CisJdnN5c2NhbGxfZ3RvZF9kYXRhLndhbGxfdGltZV9jb2Fyc2UJPSBfX2N1cnJlbnRfa2VybmVsX3RpbWUoKTsKKwogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ2c3lzY2FsbF9ndG9kX2RhdGEubG9jaywgZmxhZ3MpOwogfQogCi0vKiBSRUQtUEVOIG1heSB3YW50IHRvIHJlYWRkIHNlcSBsb2NraW5nLCBidXQgdGhlbiB0aGUgdmFyaWFibGUgc2hvdWxkIGJlCi0gKiB3cml0ZS1vbmNlLgorc3RhdGljIHZvaWQgd2Fybl9iYWRfdnN5c2NhbGwoY29uc3QgY2hhciAqbGV2ZWwsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKwlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShycywgREVGQVVMVF9SQVRFTElNSVRfSU5URVJWQUwsIERFRkFVTFRfUkFURUxJTUlUX0JVUlNUKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKworCWlmICghc2hvd191bmhhbmRsZWRfc2lnbmFscyB8fCAhX19yYXRlbGltaXQoJnJzKSkKKwkJcmV0dXJuOworCisJdHNrID0gY3VycmVudDsKKworCXByaW50aygiJXMlc1slZF0gJXMgaXA6JWx4IGNzOiVseCBzcDolbHggYXg6JWx4IHNpOiVseCBkaTolbHhcbiIsCisJICAgICAgIGxldmVsLCB0c2stPmNvbW0sIHRhc2tfcGlkX25yKHRzayksCisJICAgICAgIG1lc3NhZ2UsIHJlZ3MtPmlwIC0gMiwgcmVncy0+Y3MsCisJICAgICAgIHJlZ3MtPnNwLCByZWdzLT5heCwgcmVncy0+c2ksIHJlZ3MtPmRpKTsKK30KKworc3RhdGljIGludCBhZGRyX3RvX3ZzeXNjYWxsX25yKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbnQgbnI7CisKKwlpZiAoKGFkZHIgJiB+MHhDMDBVTCkgIT0gVlNZU0NBTExfU1RBUlQpCisJCXJldHVybiAtRUlOVkFMOworCisJbnIgPSAoYWRkciAmIDB4QzAwVUwpID4+IDEwOworCWlmIChuciA+PSAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBucjsKK30KKwordm9pZCBkb3RyYXBsaW5rYWdlIGRvX2VtdWxhdGVfdnN5c2NhbGwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKwl1bnNpZ25lZCBsb25nIGNhbGxlcjsKKwlpbnQgdnN5c2NhbGxfbnI7CisJbG9uZyByZXQ7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkvKgorCSAqIFJlYWwgNjQtYml0IHVzZXIgbW9kZSBjb2RlIGhhcyBjcyA9PSBfX1VTRVJfQ1MuICBBbnl0aGluZyBlbHNlCisJICogaXMgYm9ndXMuCisJICovCisJaWYgKHJlZ3MtPmNzICE9IF9fVVNFUl9DUykgeworCQkvKgorCQkgKiBJZiB3ZSB0cmFwcGVkIGZyb20ga2VybmVsIG1vZGUsIHdlIG1pZ2h0IGFzIHdlbGwgT09QUyBub3cKKwkJICogaW5zdGVhZCBvZiByZXR1cm5pbmcgdG8gc29tZSByYW5kb20gYWRkcmVzcyBhbmQgT09QU2luZworCQkgKiB0aGVuLgorCQkgKi8KKwkJQlVHX09OKCF1c2VyX21vZGUocmVncykpOworCisJCS8qIENvbXBhdCBtb2RlIGFuZCBub24tY29tcGF0IDMyLWJpdCBDUyBzaG91bGQgYm90aCBzZWdmYXVsdC4gKi8KKwkJd2Fybl9iYWRfdnN5c2NhbGwoS0VSTl9XQVJOSU5HLCByZWdzLAorCQkJCSAgImlsbGVnYWwgaW50IDB4Y2MgZnJvbSAzMi1iaXQgbW9kZSIpOworCQlnb3RvIHNpZ3NlZ3Y7CisJfQorCisJLyoKKwkgKiB4ODYtaXNtIGhlcmU6IHJlZ3MtPmlwIHBvaW50cyB0byB0aGUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIGludCAweGNjLAorCSAqIGFuZCBpbnQgMHhjYyBpcyB0d28gYnl0ZXMgbG9uZy4KKwkgKi8KKwl2c3lzY2FsbF9uciA9IGFkZHJfdG9fdnN5c2NhbGxfbnIocmVncy0+aXAgLSAyKTsKKwlpZiAodnN5c2NhbGxfbnIgPCAwKSB7CisJCXdhcm5fYmFkX3ZzeXNjYWxsKEtFUk5fV0FSTklORywgcmVncywKKwkJCQkgICJpbGxlZ2FsIGludCAweGNjIChleHBsb2l0IGF0dGVtcHQ/KSIpOworCQlnb3RvIHNpZ3NlZ3Y7CisJfQorCisJaWYgKGdldF91c2VyKGNhbGxlciwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopcmVncy0+c3ApICE9IDApIHsKKwkJd2Fybl9iYWRfdnN5c2NhbGwoS0VSTl9XQVJOSU5HLCByZWdzLCAiaW50IDB4Y2Mgd2l0aCBiYWQgc3RhY2sgKGV4cGxvaXQgYXR0ZW1wdD8pIik7CisJCWdvdG8gc2lnc2VndjsKKwl9CisKKwl0c2sgPSBjdXJyZW50OworCWlmIChzZWNjb21wX21vZGUoJnRzay0+c2VjY29tcCkpCisJCWRvX2V4aXQoU0lHS0lMTCk7CisKKwlzd2l0Y2ggKHZzeXNjYWxsX25yKSB7CisJY2FzZSAwOgorCQlyZXQgPSBzeXNfZ2V0dGltZW9mZGF5KAorCQkJKHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqKXJlZ3MtPmRpLAorCQkJKHN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKilyZWdzLT5zaSk7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQlyZXQgPSBzeXNfdGltZSgodGltZV90IF9fdXNlciAqKXJlZ3MtPmRpKTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXJldCA9IHN5c19nZXRjcHUoKHVuc2lnbmVkIF9fdXNlciAqKXJlZ3MtPmRpLAorCQkJCSAodW5zaWduZWQgX191c2VyICopcmVncy0+c2ksCisJCQkJIDApOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0ID09IC1FRkFVTFQpIHsKKwkJLyoKKwkJICogQmFkIG5ld3MgLS0gdXNlcnNwYWNlIGZlZCBhIGJhZCBwb2ludGVyIHRvIGEgdnN5c2NhbGwuCisJCSAqCisJCSAqIFdpdGggYSByZWFsIHZzeXNjYWxsLCB0aGF0IHdvdWxkIGhhdmUgY2F1c2VkIFNJR1NFR1YuCisJCSAqIFRvIG1ha2Ugd3JpdGluZyByZWxpYWJsZSBleHBsb2l0cyB1c2luZyB0aGUgZW11bGF0ZWQKKwkJICogdnN5c2NhbGxzIGhhcmRlciwgZ2VuZXJhdGUgU0lHU0VHViBoZXJlIGFzIHdlbGwuCisJCSAqLworCQl3YXJuX2JhZF92c3lzY2FsbChLRVJOX0lORk8sIHJlZ3MsCisJCQkJICAidnN5c2NhbGwgZmF1bHQgKGV4cGxvaXQgYXR0ZW1wdD8pIik7CisJCWdvdG8gc2lnc2VndjsKKwl9CisKKwlyZWdzLT5heCA9IHJldDsKKworCS8qIEVtdWxhdGUgYSByZXQgaW5zdHJ1Y3Rpb24uICovCisJcmVncy0+aXAgPSBjYWxsZXI7CisJcmVncy0+c3AgKz0gODsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJcmV0dXJuOworCitzaWdzZWd2OgorCXJlZ3MtPmlwIC09IDI7ICAvKiBUaGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIHRoZSBpbnQgMHhjYy4gKi8KKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKK30KKworLyoKKyAqIEFzc3VtZSBfX2luaXRjYWxsIGV4ZWN1dGVzIGJlZm9yZSBhbGwgdXNlciBzcGFjZS4gSG9wZWZ1bGx5IGttb2QKKyAqIGRvZXNuJ3QgdmlvbGF0ZSB0aGF0LiBXZSdsbCBmaW5kIG91dCBpZiBpdCBkb2VzLgogICovCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgZG9fZ2V0X3R6KHN0cnVjdCB0aW1lem9uZSAqIHR6KQotewotCSp0eiA9IFZWQVIodnN5c2NhbGxfZ3RvZF9kYXRhKS5zeXNfdHo7Ci19Ci0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopCi17Ci0JaW50IHJldDsKLQlhc20gdm9sYXRpbGUoInN5c2NhbGwiCi0JCTogIj1hIiAocmV0KQotCQk6ICIwIiAoX19OUl9nZXR0aW1lb2ZkYXkpLCJEIiAodHYpLCJTIiAodHopCi0JCTogX19zeXNjYWxsX2Nsb2JiZXIgKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIGxvbmcgdGltZV9zeXNjYWxsKGxvbmcgKnQpCi17Ci0JbG9uZyBzZWNzOwotCWFzbSB2b2xhdGlsZSgic3lzY2FsbCIKLQkJOiAiPWEiIChzZWNzKQotCQk6ICIwIiAoX19OUl90aW1lKSwiRCIgKHQpIDogX19zeXNjYWxsX2Nsb2JiZXIpOwotCXJldHVybiBzZWNzOwotfQotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgZG9fdmdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqIHR2KQotewotCWN5Y2xlX3Qgbm93LCBiYXNlLCBtYXNrLCBjeWNsZV9kZWx0YTsKLQl1bnNpZ25lZCBzZXE7Ci0JdW5zaWduZWQgbG9uZyBtdWx0LCBzaGlmdCwgbnNlYzsKLQljeWNsZV90ICgqdnJlYWQpKHZvaWQpOwotCWRvIHsKLQkJc2VxID0gcmVhZF9zZXFiZWdpbigmVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLmxvY2spOwotCi0JCXZyZWFkID0gVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLmNsb2NrLnZyZWFkOwotCQlpZiAodW5saWtlbHkoIVZWQVIodnN5c2NhbGxfZ3RvZF9kYXRhKS5zeXNjdGxfZW5hYmxlZCB8fAotCQkJICAgICAhdnJlYWQpKSB7Ci0JCQlnZXR0aW1lb2ZkYXkodHYsTlVMTCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlub3cgPSB2cmVhZCgpOwotCQliYXNlID0gVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLmNsb2NrLmN5Y2xlX2xhc3Q7Ci0JCW1hc2sgPSBWVkFSKHZzeXNjYWxsX2d0b2RfZGF0YSkuY2xvY2subWFzazsKLQkJbXVsdCA9IFZWQVIodnN5c2NhbGxfZ3RvZF9kYXRhKS5jbG9jay5tdWx0OwotCQlzaGlmdCA9IFZWQVIodnN5c2NhbGxfZ3RvZF9kYXRhKS5jbG9jay5zaGlmdDsKLQotCQl0di0+dHZfc2VjID0gVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLndhbGxfdGltZV9zZWM7Ci0JCW5zZWMgPSBWVkFSKHZzeXNjYWxsX2d0b2RfZGF0YSkud2FsbF90aW1lX25zZWM7Ci0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLmxvY2ssIHNlcSkpOwotCi0JLyogY2FsY3VsYXRlIGludGVydmFsOiAqLwotCWN5Y2xlX2RlbHRhID0gKG5vdyAtIGJhc2UpICYgbWFzazsKLQkvKiBjb252ZXJ0IHRvIG5zZWNzOiAqLwotCW5zZWMgKz0gKGN5Y2xlX2RlbHRhICogbXVsdCkgPj4gc2hpZnQ7Ci0KLQl3aGlsZSAobnNlYyA+PSBOU0VDX1BFUl9TRUMpIHsKLQkJdHYtPnR2X3NlYyArPSAxOwotCQluc2VjIC09IE5TRUNfUEVSX1NFQzsKLQl9Ci0JdHYtPnR2X3VzZWMgPSBuc2VjIC8gTlNFQ19QRVJfVVNFQzsKLX0KLQotaW50IF9fdnN5c2NhbGwoMCkgdmdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqIHR2LCBzdHJ1Y3QgdGltZXpvbmUgKiB0eikKLXsKLQlpZiAodHYpCi0JCWRvX3ZnZXR0aW1lb2ZkYXkodHYpOwotCWlmICh0eikKLQkJZG9fZ2V0X3R6KHR6KTsKLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyB3aWxsIGJyZWFrIHdoZW4gdGhlIHh0aW1lIHNlY29uZHMgZ2V0IGluYWNjdXJhdGUsIGJ1dCB0aGF0IGlzCi0gKiB1bmxpa2VseSAqLwotdGltZV90IF9fdnN5c2NhbGwoMSkgdnRpbWUodGltZV90ICp0KQotewotCXVuc2lnbmVkIHNlcTsKLQl0aW1lX3QgcmVzdWx0OwotCWlmICh1bmxpa2VseSghVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLnN5c2N0bF9lbmFibGVkKSkKLQkJcmV0dXJuIHRpbWVfc3lzY2FsbCh0KTsKLQotCWRvIHsKLQkJc2VxID0gcmVhZF9zZXFiZWdpbigmVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLmxvY2spOwotCi0JCXJlc3VsdCA9IFZWQVIodnN5c2NhbGxfZ3RvZF9kYXRhKS53YWxsX3RpbWVfc2VjOwotCi0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLmxvY2ssIHNlcSkpOwotCi0JaWYgKHQpCi0JCSp0ID0gcmVzdWx0OwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIEZhc3Qgd2F5IHRvIGdldCBjdXJyZW50IENQVSBhbmQgbm9kZS4KLSAgIFRoaXMgaGVscHMgdG8gZG8gcGVyIG5vZGUgYW5kIHBlciBDUFUgY2FjaGVzIGluIHVzZXIgc3BhY2UuCi0gICBUaGUgcmVzdWx0IGlzIG5vdCBndWFyYW50ZWVkIHdpdGhvdXQgQ1BVIGFmZmluaXR5LCBidXQgdXN1YWxseQotICAgd29ya3Mgb3V0IGJlY2F1c2UgdGhlIHNjaGVkdWxlciB0cmllcyB0byBrZWVwIGEgdGhyZWFkIG9uIHRoZSBzYW1lCi0gICBDUFUuCi0KLSAgIHRjYWNoZSBtdXN0IHBvaW50IHRvIGEgdHdvIGVsZW1lbnQgc2l6ZWQgbG9uZyBhcnJheS4KLSAgIEFsbCBhcmd1bWVudHMgY2FuIGJlIE5VTEwuICovCi1sb25nIF9fdnN5c2NhbGwoMikKLXZnZXRjcHUodW5zaWduZWQgKmNwdSwgdW5zaWduZWQgKm5vZGUsIHN0cnVjdCBnZXRjcHVfY2FjaGUgKnRjYWNoZSkKLXsKLQl1bnNpZ25lZCBpbnQgcDsKLQl1bnNpZ25lZCBsb25nIGogPSAwOwotCi0JLyogRmFzdCBjYWNoZSAtIG9ubHkgcmVjb21wdXRlIHZhbHVlIG9uY2UgcGVyIGppZmZpZXMgYW5kIGF2b2lkCi0JICAgcmVsYXRpdmVseSBjb3N0bHkgcmR0c2NwL2NwdWlkIG90aGVyd2lzZS4KLQkgICBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIHNjaGVkdWxlciB1c3VhbGx5IGtlZXBzIHRoZSBwcm9jZXNzCi0JICAgb24gdGhlIHNhbWUgQ1BVIGFuZCB0aGlzIHN5c2NhbGwgZG9lc24ndCBndWFyYW50ZWUgaXRzCi0JICAgcmVzdWx0cyBhbnl3YXlzLgotCSAgIFdlIGRvIHRoaXMgaGVyZSBiZWNhdXNlIG90aGVyd2lzZSB1c2VyIHNwYWNlIHdvdWxkIGRvIGl0IG9uCi0JICAgaXRzIG93biBpbiBhIGxpa2VseSBpbmZlcmlvciB3YXkgKG5vIGFjY2VzcyB0byBqaWZmaWVzKS4KLQkgICBJZiB5b3UgZG9uJ3QgbGlrZSBpdCBwYXNzIE5VTEwuICovCi0JaWYgKHRjYWNoZSAmJiB0Y2FjaGUtPmJsb2JbMF0gPT0gKGogPSBWVkFSKGppZmZpZXMpKSkgewotCQlwID0gdGNhY2hlLT5ibG9iWzFdOwotCX0gZWxzZSBpZiAoVlZBUih2Z2V0Y3B1X21vZGUpID09IFZHRVRDUFVfUkRUU0NQKSB7Ci0JCS8qIExvYWQgcGVyIENQVSBkYXRhIGZyb20gUkRUU0NQICovCi0JCW5hdGl2ZV9yZWFkX3RzY3AoJnApOwotCX0gZWxzZSB7Ci0JCS8qIExvYWQgcGVyIENQVSBkYXRhIGZyb20gR0RUICovCi0JCWFzbSgibHNsICUxLCUwIiA6ICI9ciIgKHApIDogInIiIChfX1BFUl9DUFVfU0VHKSk7Ci0JfQotCWlmICh0Y2FjaGUpIHsKLQkJdGNhY2hlLT5ibG9iWzBdID0gajsKLQkJdGNhY2hlLT5ibG9iWzFdID0gcDsKLQl9Ci0JaWYgKGNwdSkKLQkJKmNwdSA9IHAgJiAweGZmZjsKLQlpZiAobm9kZSkKLQkJKm5vZGUgPSBwID4+IDEyOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBfX3ZzeXNjYWxsKDMpIHZlbm9zeXNfMSh2b2lkKQotewotCXJldHVybiAtRU5PU1lTOwotfQotCi0jaWZkZWYgQ09ORklHX1NZU0NUTAotc3RhdGljIGN0bF90YWJsZSBrZXJuZWxfdGFibGUyW10gPSB7Ci0JeyAucHJvY25hbWUgPSAidnN5c2NhbGw2NCIsCi0JICAuZGF0YSA9ICZ2c3lzY2FsbF9ndG9kX2RhdGEuc3lzY3RsX2VuYWJsZWQsIC5tYXhsZW4gPSBzaXplb2YoaW50KSwKLQkgIC5tb2RlID0gMDY0NCwKLQkgIC5wcm9jX2hhbmRsZXIgPSBwcm9jX2RvaW50dmVjIH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjdGxfdGFibGUga2VybmVsX3Jvb3RfdGFibGUyW10gPSB7Ci0JeyAucHJvY25hbWUgPSAia2VybmVsIiwgLm1vZGUgPSAwNTU1LAotCSAgLmNoaWxkID0ga2VybmVsX3RhYmxlMiB9LAotCXt9Ci19OwotI2VuZGlmCi0KLS8qIEFzc3VtZSBfX2luaXRjYWxsIGV4ZWN1dGVzIGJlZm9yZSBhbGwgdXNlciBzcGFjZS4gSG9wZWZ1bGx5IGttb2QKLSAgIGRvZXNuJ3QgdmlvbGF0ZSB0aGF0LiBXZSdsbCBmaW5kIG91dCBpZiBpdCBkb2VzLiAqLwogc3RhdGljIHZvaWQgX19jcHVpbml0IHZzeXNjYWxsX3NldF9jcHUoaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGQ7CkBAIC0yNTUsMTMgKzIyNSwxNSBAQAogCWlmIChjcHVfaGFzKCZjcHVfZGF0YShjcHUpLCBYODZfRkVBVFVSRV9SRFRTQ1ApKQogCQl3cml0ZV9yZHRzY3BfYXV4KChub2RlIDw8IDEyKSB8IGNwdSk7CiAKLQkvKiBTdG9yZSBjcHUgbnVtYmVyIGluIGxpbWl0IHNvIHRoYXQgaXQgY2FuIGJlIGxvYWRlZCBxdWlja2x5Ci0JICAgaW4gdXNlciBzcGFjZSBpbiB2Z2V0Y3B1LgotCSAgIDEyIGJpdHMgZm9yIHRoZSBDUFUgYW5kIDggYml0cyBmb3IgdGhlIG5vZGUuICovCisJLyoKKwkgKiBTdG9yZSBjcHUgbnVtYmVyIGluIGxpbWl0IHNvIHRoYXQgaXQgY2FuIGJlIGxvYWRlZCBxdWlja2x5CisJICogaW4gdXNlciBzcGFjZSBpbiB2Z2V0Y3B1LiAoMTIgYml0cyBmb3IgdGhlIENQVSBhbmQgOCBiaXRzIGZvciB0aGUgbm9kZSkKKwkgKi8KIAlkID0gMHgwZjQwMDAwMDAwMDAwVUxMOwogCWQgfD0gY3B1OwogCWQgfD0gKG5vZGUgJiAweGYpIDw8IDEyOwogCWQgfD0gKG5vZGUgPj4gNCkgPDwgNDg7CisKIAl3cml0ZV9nZHRfZW50cnkoZ2V0X2NwdV9nZHRfdGFibGUoY3B1KSwgR0RUX0VOVFJZX1BFUl9DUFUsICZkLCBERVNDVFlQRV9TKTsKIH0KIApAQCAtMjc1LDggKzI0NywxMCBAQAogY3B1X3ZzeXNjYWxsX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmFyZykKIHsKIAlsb25nIGNwdSA9IChsb25nKWFyZzsKKwogCWlmIChhY3Rpb24gPT0gQ1BVX09OTElORSB8fCBhY3Rpb24gPT0gQ1BVX09OTElORV9GUk9aRU4pCiAJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGNwdV92c3lzY2FsbF9pbml0LCBOVUxMLCAxKTsKKwogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIApAQCAtMjg0LDI1ICsyNTgsMjMgQEAKIHsKIAlleHRlcm4gY2hhciBfX3ZzeXNjYWxsXzA7CiAJdW5zaWduZWQgbG9uZyBwaHlzYWRkcl9wYWdlMCA9IF9fcGFfc3ltYm9sKCZfX3ZzeXNjYWxsXzApOworCWV4dGVybiBjaGFyIF9fdnZhcl9wYWdlOworCXVuc2lnbmVkIGxvbmcgcGh5c2FkZHJfdnZhcl9wYWdlID0gX19wYV9zeW1ib2woJl9fdnZhcl9wYWdlKTsKIAogCS8qIE5vdGUgdGhhdCBWU1lTQ0FMTF9NQVBQRURfUEFHRVMgbXVzdCBhZ3JlZSB3aXRoIHRoZSBjb2RlIGJlbG93LiAqLwogCV9fc2V0X2ZpeG1hcChWU1lTQ0FMTF9GSVJTVF9QQUdFLCBwaHlzYWRkcl9wYWdlMCwgUEFHRV9LRVJORUxfVlNZU0NBTEwpOworCV9fc2V0X2ZpeG1hcChWVkFSX1BBR0UsIHBoeXNhZGRyX3Z2YXJfcGFnZSwgUEFHRV9LRVJORUxfVlZBUik7CisJQlVJTERfQlVHX09OKCh1bnNpZ25lZCBsb25nKV9fZml4X3RvX3ZpcnQoVlZBUl9QQUdFKSAhPSAodW5zaWduZWQgbG9uZylWVkFSX0FERFJFU1MpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCB2c3lzY2FsbF9pbml0KHZvaWQpCiB7Ci0JQlVHX09OKCgodW5zaWduZWQgbG9uZykgJnZnZXR0aW1lb2ZkYXkgIT0KLQkJCVZTWVNDQUxMX0FERFIoX19OUl92Z2V0dGltZW9mZGF5KSkpOwotCUJVR19PTigodW5zaWduZWQgbG9uZykgJnZ0aW1lICE9IFZTWVNDQUxMX0FERFIoX19OUl92dGltZSkpOwotCUJVR19PTigoVlNZU0NBTExfQUREUigwKSAhPSBfX2ZpeF90b192aXJ0KFZTWVNDQUxMX0ZJUlNUX1BBR0UpKSk7Ci0JQlVHX09OKCh1bnNpZ25lZCBsb25nKSAmdmdldGNwdSAhPSBWU1lTQ0FMTF9BRERSKF9fTlJfdmdldGNwdSkpOwotI2lmZGVmIENPTkZJR19TWVNDVEwKLQlyZWdpc3Rlcl9zeXNjdGxfdGFibGUoa2VybmVsX3Jvb3RfdGFibGUyKTsKLSNlbmRpZgorCUJVR19PTihWU1lTQ0FMTF9BRERSKDApICE9IF9fZml4X3RvX3ZpcnQoVlNZU0NBTExfRklSU1RfUEFHRSkpOworCiAJb25fZWFjaF9jcHUoY3B1X3ZzeXNjYWxsX2luaXQsIE5VTEwsIDEpOwogCS8qIG5vdGlmaWVyIHByaW9yaXR5ID4gS1ZNICovCiAJaG90Y3B1X25vdGlmaWVyKGNwdV92c3lzY2FsbF9ub3RpZmllciwgMzApOworCiAJcmV0dXJuIDA7CiB9Ci0KIF9faW5pdGNhbGwodnN5c2NhbGxfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfZW11XzY0LlMgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfZW11XzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhODQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF9lbXVfNjQuUwpAQCAtMCwwICsxLDI3IEBACisvKgorICogdnN5c2NhbGxfZW11XzY0LlM6IFZzeXNjYWxsIGVtdWxhdGlvbiBwYWdlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIEFuZHkgTHV0b21pcnNraQorICoKKyAqIFN1YmplY3QgdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9pcnFfdmVjdG9ycy5oPgorCisvKiBUaGUgdW51c2VkIHBhcnRzIG9mIHRoZSBwYWdlIGFyZSBmaWxsZWQgd2l0aCAweGNjIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LiAqLworCisuc2VjdGlvbiAudnN5c2NhbGxfMCwgImEiCitFTlRSWSh2c3lzY2FsbF8wKQorCWludCAkVlNZU0NBTExfRU1VX1ZFQ1RPUgorRU5EKHZzeXNjYWxsXzApCisKKy5zZWN0aW9uIC52c3lzY2FsbF8xLCAiYSIKK0VOVFJZKHZzeXNjYWxsXzEpCisJaW50ICRWU1lTQ0FMTF9FTVVfVkVDVE9SCitFTkQodnN5c2NhbGxfMSkKKworLnNlY3Rpb24gLnZzeXNjYWxsXzIsICJhIgorRU5UUlkodnN5c2NhbGxfMikKKwlpbnQgJFZTWVNDQUxMX0VNVV9WRUNUT1IKK0VORCh2c3lzY2FsbF8yKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL0tjb25maWcgYi9hcmNoL3g4Ni9rdm0vS2NvbmZpZwppbmRleCA1MGY2MzY0Li45ODg3MjRiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vS2NvbmZpZworKysgYi9hcmNoL3g4Ni9rdm0vS2NvbmZpZwpAQCAtMzEsNiArMzEsNyBAQAogCXNlbGVjdCBLVk1fQVNZTkNfUEYKIAlzZWxlY3QgVVNFUl9SRVRVUk5fTk9USUZJRVIKIAlzZWxlY3QgS1ZNX01NSU8KKwlzZWxlY3QgVEFTS19ERUxBWV9BQ0NUCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBob3N0aW5nIGZ1bGx5IHZpcnR1YWxpemVkIGd1ZXN0IG1hY2hpbmVzIHVzaW5nIGhhcmR3YXJlCiAJICB2aXJ0dWFsaXphdGlvbiBleHRlbnNpb25zLiAgWW91IHdpbGwgbmVlZCBhIGZhaXJseSByZWNlbnQKQEAgLTc2LDYgKzc3LDUgQEAKICMgdGhlIHZpcnR1YWxpemF0aW9uIG1lbnUuCiBzb3VyY2UgZHJpdmVycy92aG9zdC9LY29uZmlnCiBzb3VyY2UgZHJpdmVycy9sZ3Vlc3QvS2NvbmZpZwotc291cmNlIGRyaXZlcnMvdmlydGlvL0tjb25maWcKIAogZW5kaWYgIyBWSVJUVUFMSVpBVElPTgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2VtdWxhdGUuYyBiL2FyY2gveDg2L2t2bS9lbXVsYXRlLmMKaW5kZXggZDZlMjQ3Ny4uNmYwOGJjOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2VtdWxhdGUuYworKysgYi9hcmNoL3g4Ni9rdm0vZW11bGF0ZS5jCkBAIC00NywzOCArNDcsNDAgQEAKICNkZWZpbmUgRHN0REkgICAgICAgKDU8PDEpCS8qIERlc3RpbmF0aW9uIGlzIGluIEVTOihFKURJICovCiAjZGVmaW5lIERzdE1lbTY0ICAgICg2PDwxKQkvKiA2NGJpdCBtZW1vcnkgb3BlcmFuZCAqLwogI2RlZmluZSBEc3RJbW1VQnl0ZSAoNzw8MSkJLyogOC1iaXQgdW5zaWduZWQgaW1tZWRpYXRlIG9wZXJhbmQgKi8KLSNkZWZpbmUgRHN0TWFzayAgICAgKDc8PDEpCisjZGVmaW5lIERzdERYICAgICAgICg4PDwxKQkvKiBEZXN0aW5hdGlvbiBpcyBpbiBEWCByZWdpc3RlciAqLworI2RlZmluZSBEc3RNYXNrICAgICAoMHhmPDwxKQogLyogU291cmNlIG9wZXJhbmQgdHlwZS4gKi8KLSNkZWZpbmUgU3JjTm9uZSAgICAgKDA8PDQpCS8qIE5vIHNvdXJjZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNSZWcgICAgICAoMTw8NCkJLyogUmVnaXN0ZXIgb3BlcmFuZC4gKi8KLSNkZWZpbmUgU3JjTWVtICAgICAgKDI8PDQpCS8qIE1lbW9yeSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNNZW0xNiAgICAoMzw8NCkJLyogTWVtb3J5IG9wZXJhbmQgKDE2LWJpdCkuICovCi0jZGVmaW5lIFNyY01lbTMyICAgICg0PDw0KQkvKiBNZW1vcnkgb3BlcmFuZCAoMzItYml0KS4gKi8KLSNkZWZpbmUgU3JjSW1tICAgICAgKDU8PDQpCS8qIEltbWVkaWF0ZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNJbW1CeXRlICAoNjw8NCkJLyogOC1iaXQgc2lnbi1leHRlbmRlZCBpbW1lZGlhdGUgb3BlcmFuZC4gKi8KLSNkZWZpbmUgU3JjT25lICAgICAgKDc8PDQpCS8qIEltcGxpZWQgJzEnICovCi0jZGVmaW5lIFNyY0ltbVVCeXRlICg4PDw0KSAgICAgIC8qIDgtYml0IHVuc2lnbmVkIGltbWVkaWF0ZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNJbW1VICAgICAoOTw8NCkgICAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQgKi8KLSNkZWZpbmUgU3JjU0kgICAgICAgKDB4YTw8NCkJLyogU291cmNlIGlzIGluIHRoZSBEUzpSU0kgKi8KLSNkZWZpbmUgU3JjSW1tRkFkZHIgKDB4Yjw8NCkJLyogU291cmNlIGlzIGltbWVkaWF0ZSBmYXIgYWRkcmVzcyAqLwotI2RlZmluZSBTcmNNZW1GQWRkciAoMHhjPDw0KQkvKiBTb3VyY2UgaXMgZmFyIGFkZHJlc3MgaW4gbWVtb3J5ICovCi0jZGVmaW5lIFNyY0FjYyAgICAgICgweGQ8PDQpCS8qIFNvdXJjZSBBY2N1bXVsYXRvciAqLwotI2RlZmluZSBTcmNJbW1VMTYgICAoMHhlPDw0KSAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQsIDE2IGJpdHMgKi8KLSNkZWZpbmUgU3JjTWFzayAgICAgKDB4Zjw8NCkKKyNkZWZpbmUgU3JjTm9uZSAgICAgKDA8PDUpCS8qIE5vIHNvdXJjZSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNSZWcgICAgICAoMTw8NSkJLyogUmVnaXN0ZXIgb3BlcmFuZC4gKi8KKyNkZWZpbmUgU3JjTWVtICAgICAgKDI8PDUpCS8qIE1lbW9yeSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNNZW0xNiAgICAoMzw8NSkJLyogTWVtb3J5IG9wZXJhbmQgKDE2LWJpdCkuICovCisjZGVmaW5lIFNyY01lbTMyICAgICg0PDw1KQkvKiBNZW1vcnkgb3BlcmFuZCAoMzItYml0KS4gKi8KKyNkZWZpbmUgU3JjSW1tICAgICAgKDU8PDUpCS8qIEltbWVkaWF0ZSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNJbW1CeXRlICAoNjw8NSkJLyogOC1iaXQgc2lnbi1leHRlbmRlZCBpbW1lZGlhdGUgb3BlcmFuZC4gKi8KKyNkZWZpbmUgU3JjT25lICAgICAgKDc8PDUpCS8qIEltcGxpZWQgJzEnICovCisjZGVmaW5lIFNyY0ltbVVCeXRlICg4PDw1KSAgICAgIC8qIDgtYml0IHVuc2lnbmVkIGltbWVkaWF0ZSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNJbW1VICAgICAoOTw8NSkgICAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQgKi8KKyNkZWZpbmUgU3JjU0kgICAgICAgKDB4YTw8NSkJLyogU291cmNlIGlzIGluIHRoZSBEUzpSU0kgKi8KKyNkZWZpbmUgU3JjSW1tRkFkZHIgKDB4Yjw8NSkJLyogU291cmNlIGlzIGltbWVkaWF0ZSBmYXIgYWRkcmVzcyAqLworI2RlZmluZSBTcmNNZW1GQWRkciAoMHhjPDw1KQkvKiBTb3VyY2UgaXMgZmFyIGFkZHJlc3MgaW4gbWVtb3J5ICovCisjZGVmaW5lIFNyY0FjYyAgICAgICgweGQ8PDUpCS8qIFNvdXJjZSBBY2N1bXVsYXRvciAqLworI2RlZmluZSBTcmNJbW1VMTYgICAoMHhlPDw1KSAgICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgdW5zaWduZWQsIDE2IGJpdHMgKi8KKyNkZWZpbmUgU3JjRFggICAgICAgKDB4Zjw8NSkJLyogU291cmNlIGlzIGluIERYIHJlZ2lzdGVyICovCisjZGVmaW5lIFNyY01hc2sgICAgICgweGY8PDUpCiAvKiBHZW5lcmljIE1vZFJNIGRlY29kZS4gKi8KLSNkZWZpbmUgTW9kUk0gICAgICAgKDE8PDgpCisjZGVmaW5lIE1vZFJNICAgICAgICgxPDw5KQogLyogRGVzdGluYXRpb24gaXMgb25seSB3cml0dGVuOyBuZXZlciByZWFkLiAqLwotI2RlZmluZSBNb3YgICAgICAgICAoMTw8OSkKLSNkZWZpbmUgQml0T3AgICAgICAgKDE8PDEwKQotI2RlZmluZSBNZW1BYnMgICAgICAoMTw8MTEpICAgICAgLyogTWVtb3J5IG9wZXJhbmQgaXMgYWJzb2x1dGUgZGlzcGxhY2VtZW50ICovCi0jZGVmaW5lIFN0cmluZyAgICAgICgxPDwxMikgICAgIC8qIFN0cmluZyBpbnN0cnVjdGlvbiAocmVwIGNhcGFibGUpICovCi0jZGVmaW5lIFN0YWNrICAgICAgICgxPDwxMykgICAgIC8qIFN0YWNrIGluc3RydWN0aW9uIChwdXNoL3BvcCkgKi8KLSNkZWZpbmUgR3JvdXBNYXNrICAgKDc8PDE0KSAgICAgLyogT3Bjb2RlIHVzZXMgb25lIG9mIHRoZSBncm91cCBtZWNoYW5pc21zICovCi0jZGVmaW5lIEdyb3VwICAgICAgICgxPDwxNCkgICAgIC8qIEJpdHMgMzo1IG9mIG1vZHJtIGJ5dGUgZXh0ZW5kIG9wY29kZSAqLwotI2RlZmluZSBHcm91cER1YWwgICAoMjw8MTQpICAgICAvKiBBbHRlcm5hdGUgZGVjb2Rpbmcgb2YgbW9kID09IDMgKi8KLSNkZWZpbmUgUHJlZml4ICAgICAgKDM8PDE0KSAgICAgLyogSW5zdHJ1Y3Rpb24gdmFyaWVzIHdpdGggNjYvZjIvZjMgcHJlZml4ICovCi0jZGVmaW5lIFJNRXh0ICAgICAgICg0PDwxNCkgICAgIC8qIE9wY29kZSBleHRlbnNpb24gaW4gTW9kUk0gci9tIGlmIG1vZCA9PSAzICovCi0jZGVmaW5lIFNzZSAgICAgICAgICgxPDwxNykgICAgIC8qIFNTRSBWZWN0b3IgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgTW92ICAgICAgICAgKDE8PDEwKQorI2RlZmluZSBCaXRPcCAgICAgICAoMTw8MTEpCisjZGVmaW5lIE1lbUFicyAgICAgICgxPDwxMikgICAgICAvKiBNZW1vcnkgb3BlcmFuZCBpcyBhYnNvbHV0ZSBkaXNwbGFjZW1lbnQgKi8KKyNkZWZpbmUgU3RyaW5nICAgICAgKDE8PDEzKSAgICAgLyogU3RyaW5nIGluc3RydWN0aW9uIChyZXAgY2FwYWJsZSkgKi8KKyNkZWZpbmUgU3RhY2sgICAgICAgKDE8PDE0KSAgICAgLyogU3RhY2sgaW5zdHJ1Y3Rpb24gKHB1c2gvcG9wKSAqLworI2RlZmluZSBHcm91cE1hc2sgICAoNzw8MTUpICAgICAvKiBPcGNvZGUgdXNlcyBvbmUgb2YgdGhlIGdyb3VwIG1lY2hhbmlzbXMgKi8KKyNkZWZpbmUgR3JvdXAgICAgICAgKDE8PDE1KSAgICAgLyogQml0cyAzOjUgb2YgbW9kcm0gYnl0ZSBleHRlbmQgb3Bjb2RlICovCisjZGVmaW5lIEdyb3VwRHVhbCAgICgyPDwxNSkgICAgIC8qIEFsdGVybmF0ZSBkZWNvZGluZyBvZiBtb2QgPT0gMyAqLworI2RlZmluZSBQcmVmaXggICAgICAoMzw8MTUpICAgICAvKiBJbnN0cnVjdGlvbiB2YXJpZXMgd2l0aCA2Ni9mMi9mMyBwcmVmaXggKi8KKyNkZWZpbmUgUk1FeHQgICAgICAgKDQ8PDE1KSAgICAgLyogT3Bjb2RlIGV4dGVuc2lvbiBpbiBNb2RSTSByL20gaWYgbW9kID09IDMgKi8KKyNkZWZpbmUgU3NlICAgICAgICAgKDE8PDE4KSAgICAgLyogU1NFIFZlY3RvciBpbnN0cnVjdGlvbiAqLwogLyogTWlzYyBmbGFncyAqLwogI2RlZmluZSBQcm90ICAgICAgICAoMTw8MjEpIC8qIGluc3RydWN0aW9uIGdlbmVyYXRlcyAjVUQgaWYgbm90IGluIHByb3QtbW9kZSAqLwogI2RlZmluZSBWZW5kb3JTcGVjaWZpYyAoMTw8MjIpIC8qIFZlbmRvciBzcGVjaWZpYyBpbnN0cnVjdGlvbiAqLwpAQCAtNDA1LDc2ICs0MDcsNTkgQEAKIAkJfQkJCQkJCQlcCiAJfSB3aGlsZSAoMCkKIAotLyogRmV0Y2ggbmV4dCBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBlbXVsYXRlZC4gKi8KLSNkZWZpbmUgaW5zbl9mZXRjaChfdHlwZSwgX3NpemUsIF9laXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSh7CXVuc2lnbmVkIGxvbmcgX3g7CQkJCQkJXAotCXJjID0gZG9faW5zbl9mZXRjaChjdHh0LCBvcHMsIChfZWlwKSwgJl94LCAoX3NpemUpKTsJCVwKLQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkJCQkJCVwKLQkJZ290byBkb25lOwkJCQkJCVwKLQkoX2VpcCkgKz0gKF9zaXplKTsJCQkJCQlcCi0JKF90eXBlKV94OwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIGluc25fZmV0Y2hfYXJyKF9hcnIsIF9zaXplLCBfZWlwKQkJCQlcCi0oewlyYyA9IGRvX2luc25fZmV0Y2goY3R4dCwgb3BzLCAoX2VpcCksIF9hcnIsIChfc2l6ZSkpOwkJXAotCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQkJCQkJXAotCQlnb3RvIGRvbmU7CQkJCQkJXAotCShfZWlwKSArPSAoX3NpemUpOwkJCQkJCVwKLX0pCi0KIHN0YXRpYyBpbnQgZW11bGF0b3JfY2hlY2tfaW50ZXJjZXB0KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAogCQkJCSAgICBlbnVtIHg4Nl9pbnRlcmNlcHQgaW50ZXJjZXB0LAogCQkJCSAgICBlbnVtIHg4Nl9pbnRlcmNlcHRfc3RhZ2Ugc3RhZ2UpCiB7CiAJc3RydWN0IHg4Nl9pbnN0cnVjdGlvbl9pbmZvIGluZm8gPSB7CiAJCS5pbnRlcmNlcHQgID0gaW50ZXJjZXB0LAotCQkucmVwX3ByZWZpeCA9IGN0eHQtPmRlY29kZS5yZXBfcHJlZml4LAotCQkubW9kcm1fbW9kICA9IGN0eHQtPmRlY29kZS5tb2RybV9tb2QsCi0JCS5tb2RybV9yZWcgID0gY3R4dC0+ZGVjb2RlLm1vZHJtX3JlZywKLQkJLm1vZHJtX3JtICAgPSBjdHh0LT5kZWNvZGUubW9kcm1fcm0sCi0JCS5zcmNfdmFsICAgID0gY3R4dC0+ZGVjb2RlLnNyYy52YWw2NCwKLQkJLnNyY19ieXRlcyAgPSBjdHh0LT5kZWNvZGUuc3JjLmJ5dGVzLAotCQkuZHN0X2J5dGVzICA9IGN0eHQtPmRlY29kZS5kc3QuYnl0ZXMsCi0JCS5hZF9ieXRlcyAgID0gY3R4dC0+ZGVjb2RlLmFkX2J5dGVzLAorCQkucmVwX3ByZWZpeCA9IGN0eHQtPnJlcF9wcmVmaXgsCisJCS5tb2RybV9tb2QgID0gY3R4dC0+bW9kcm1fbW9kLAorCQkubW9kcm1fcmVnICA9IGN0eHQtPm1vZHJtX3JlZywKKwkJLm1vZHJtX3JtICAgPSBjdHh0LT5tb2RybV9ybSwKKwkJLnNyY192YWwgICAgPSBjdHh0LT5zcmMudmFsNjQsCisJCS5zcmNfYnl0ZXMgID0gY3R4dC0+c3JjLmJ5dGVzLAorCQkuZHN0X2J5dGVzICA9IGN0eHQtPmRzdC5ieXRlcywKKwkJLmFkX2J5dGVzICAgPSBjdHh0LT5hZF9ieXRlcywKIAkJLm5leHRfcmlwICAgPSBjdHh0LT5laXAsCiAJfTsKIAogCXJldHVybiBjdHh0LT5vcHMtPmludGVyY2VwdChjdHh0LCAmaW5mbywgc3RhZ2UpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYWRfbWFzayhzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFkX21hc2soc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JcmV0dXJuICgxVUwgPDwgKGMtPmFkX2J5dGVzIDw8IDMpKSAtIDE7CisJcmV0dXJuICgxVUwgPDwgKGN0eHQtPmFkX2J5dGVzIDw8IDMpKSAtIDE7CiB9CiAKIC8qIEFjY2Vzcy91cGRhdGUgYWRkcmVzcyBoZWxkIGluIGEgcmVnaXN0ZXIsIGJhc2VkIG9uIGFkZHJlc3NpbmcgbW9kZS4gKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotYWRkcmVzc19tYXNrKHN0cnVjdCBkZWNvZGVfY2FjaGUgKmMsIHVuc2lnbmVkIGxvbmcgcmVnKQorYWRkcmVzc19tYXNrKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB1bnNpZ25lZCBsb25nIHJlZykKIHsKLQlpZiAoYy0+YWRfYnl0ZXMgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCWlmIChjdHh0LT5hZF9ieXRlcyA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCiAJCXJldHVybiByZWc7CiAJZWxzZQotCQlyZXR1cm4gcmVnICYgYWRfbWFzayhjKTsKKwkJcmV0dXJuIHJlZyAmIGFkX21hc2soY3R4dCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotcmVnaXN0ZXJfYWRkcmVzcyhzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjLCB1bnNpZ25lZCBsb25nIHJlZykKK3JlZ2lzdGVyX2FkZHJlc3Moc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIHVuc2lnbmVkIGxvbmcgcmVnKQogewotCXJldHVybiBhZGRyZXNzX21hc2soYywgcmVnKTsKKwlyZXR1cm4gYWRkcmVzc19tYXNrKGN0eHQsIHJlZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotcmVnaXN0ZXJfYWRkcmVzc19pbmNyZW1lbnQoc3RydWN0IGRlY29kZV9jYWNoZSAqYywgdW5zaWduZWQgbG9uZyAqcmVnLCBpbnQgaW5jKQorcmVnaXN0ZXJfYWRkcmVzc19pbmNyZW1lbnQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIHVuc2lnbmVkIGxvbmcgKnJlZywgaW50IGluYykKIHsKLQlpZiAoYy0+YWRfYnl0ZXMgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCWlmIChjdHh0LT5hZF9ieXRlcyA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCiAJCSpyZWcgKz0gaW5jOwogCWVsc2UKLQkJKnJlZyA9ICgqcmVnICYgfmFkX21hc2soYykpIHwgKCgqcmVnICsgaW5jKSAmIGFkX21hc2soYykpOworCQkqcmVnID0gKCpyZWcgJiB+YWRfbWFzayhjdHh0KSkgfCAoKCpyZWcgKyBpbmMpICYgYWRfbWFzayhjdHh0KSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBqbXBfcmVsKHN0cnVjdCBkZWNvZGVfY2FjaGUgKmMsIGludCByZWwpCitzdGF0aWMgaW5saW5lIHZvaWQgam1wX3JlbChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgaW50IHJlbCkKIHsKLQlyZWdpc3Rlcl9hZGRyZXNzX2luY3JlbWVudChjLCAmYy0+ZWlwLCByZWwpOworCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KGN0eHQsICZjdHh0LT5fZWlwLCByZWwpOwogfQogCiBzdGF0aWMgdTMyIGRlc2NfbGltaXRfc2NhbGVkKHN0cnVjdCBkZXNjX3N0cnVjdCAqZGVzYykKQEAgLTQ4NCwyOCArNDY5LDI2IEBACiAJcmV0dXJuIGRlc2MtPmcgPyAobGltaXQgPDwgMTIpIHwgMHhmZmYgOiBsaW1pdDsKIH0KIAotc3RhdGljIHZvaWQgc2V0X3NlZ19vdmVycmlkZShzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjLCBpbnQgc2VnKQorc3RhdGljIHZvaWQgc2V0X3NlZ19vdmVycmlkZShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgaW50IHNlZykKIHsKLQljLT5oYXNfc2VnX292ZXJyaWRlID0gdHJ1ZTsKLQljLT5zZWdfb3ZlcnJpZGUgPSBzZWc7CisJY3R4dC0+aGFzX3NlZ19vdmVycmlkZSA9IHRydWU7CisJY3R4dC0+c2VnX292ZXJyaWRlID0gc2VnOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzZWdfYmFzZShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCSAgICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywgaW50IHNlZykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNlZ19iYXNlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgc2VnKQogewogCWlmIChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQgJiYgc2VnIDwgVkNQVV9TUkVHX0ZTKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBvcHMtPmdldF9jYWNoZWRfc2VnbWVudF9iYXNlKGN0eHQsIHNlZyk7CisJcmV0dXJuIGN0eHQtPm9wcy0+Z2V0X2NhY2hlZF9zZWdtZW50X2Jhc2UoY3R4dCwgc2VnKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIHNlZ19vdmVycmlkZShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCSAgICAgc3RydWN0IGRlY29kZV9jYWNoZSAqYykKK3N0YXRpYyB1bnNpZ25lZCBzZWdfb3ZlcnJpZGUoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JaWYgKCFjLT5oYXNfc2VnX292ZXJyaWRlKQorCWlmICghY3R4dC0+aGFzX3NlZ19vdmVycmlkZSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gYy0+c2VnX292ZXJyaWRlOworCXJldHVybiBjdHh0LT5zZWdfb3ZlcnJpZGU7CiB9CiAKIHN0YXRpYyBpbnQgZW11bGF0ZV9leGNlcHRpb24oc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCB2ZWMsCkBAIC01NzcsNyArNTYwLDYgQEAKIAkJICAgICB1bnNpZ25lZCBzaXplLCBib29sIHdyaXRlLCBib29sIGZldGNoLAogCQkgICAgIHVsb25nICpsaW5lYXIpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CiAJc3RydWN0IGRlc2Nfc3RydWN0IGRlc2M7CiAJYm9vbCB1c2FibGU7CiAJdWxvbmcgbGE7CkBAIC01ODUsNyArNTY3LDcgQEAKIAl1MTYgc2VsOwogCXVuc2lnbmVkIGNwbCwgcnBsOwogCi0JbGEgPSBzZWdfYmFzZShjdHh0LCBjdHh0LT5vcHMsIGFkZHIuc2VnKSArIGFkZHIuZWE7CisJbGEgPSBzZWdfYmFzZShjdHh0LCBhZGRyLnNlZykgKyBhZGRyLmVhOwogCXN3aXRjaCAoY3R4dC0+bW9kZSkgewogCWNhc2UgWDg2RU1VTF9NT0RFX1JFQUw6CiAJCWJyZWFrOwpAQCAtNjM1LDcgKzYxNyw3IEBACiAJCX0KIAkJYnJlYWs7CiAJfQotCWlmIChmZXRjaCA/IGN0eHQtPm1vZGUgIT0gWDg2RU1VTF9NT0RFX1BST1Q2NCA6IGMtPmFkX2J5dGVzICE9IDgpCisJaWYgKGZldGNoID8gY3R4dC0+bW9kZSAhPSBYODZFTVVMX01PREVfUFJPVDY0IDogY3R4dC0+YWRfYnl0ZXMgIT0gOCkKIAkJbGEgJj0gKHUzMiktMTsKIAkqbGluZWFyID0gbGE7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CkBAIC02NjksMTEgKzY1MSwxMCBAQAogCXJldHVybiBjdHh0LT5vcHMtPnJlYWRfc3RkKGN0eHQsIGxpbmVhciwgZGF0YSwgc2l6ZSwgJmN0eHQtPmV4Y2VwdGlvbik7CiB9CiAKLXN0YXRpYyBpbnQgZG9fZmV0Y2hfaW5zbl9ieXRlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzLAorc3RhdGljIGludCBkb19pbnNuX2ZldGNoX2J5dGUoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGVpcCwgdTggKmRlc3QpCiB7Ci0Jc3RydWN0IGZldGNoX2NhY2hlICpmYyA9ICZjdHh0LT5kZWNvZGUuZmV0Y2g7CisJc3RydWN0IGZldGNoX2NhY2hlICpmYyA9ICZjdHh0LT5mZXRjaDsKIAlpbnQgcmM7CiAJaW50IHNpemUsIGN1cl9zaXplOwogCkBAIC02ODUsOCArNjY2LDggQEAKIAkJcmMgPSBfX2xpbmVhcml6ZShjdHh0LCBhZGRyLCBzaXplLCBmYWxzZSwgdHJ1ZSwgJmxpbmVhcik7CiAJCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQkJcmV0dXJuIHJjOwotCQlyYyA9IG9wcy0+ZmV0Y2goY3R4dCwgbGluZWFyLCBmYy0+ZGF0YSArIGN1cl9zaXplLAotCQkJCXNpemUsICZjdHh0LT5leGNlcHRpb24pOworCQlyYyA9IGN0eHQtPm9wcy0+ZmV0Y2goY3R4dCwgbGluZWFyLCBmYy0+ZGF0YSArIGN1cl9zaXplLAorCQkJCSAgICAgIHNpemUsICZjdHh0LT5leGNlcHRpb24pOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCXJldHVybiByYzsKIAkJZmMtPmVuZCArPSBzaXplOwpAQCAtNjk2LDcgKzY3Nyw2IEBACiB9CiAKIHN0YXRpYyBpbnQgZG9faW5zbl9mZXRjaChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCSBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsCiAJCQkgdW5zaWduZWQgbG9uZyBlaXAsIHZvaWQgKmRlc3QsIHVuc2lnbmVkIHNpemUpCiB7CiAJaW50IHJjOwpAQCAtNzA1LDEzICs2ODUsMzAgQEAKIAlpZiAoZWlwICsgc2l6ZSAtIGN0eHQtPmVpcCA+IDE1KQogCQlyZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CiAJd2hpbGUgKHNpemUtLSkgewotCQlyYyA9IGRvX2ZldGNoX2luc25fYnl0ZShjdHh0LCBvcHMsIGVpcCsrLCBkZXN0KyspOworCQlyYyA9IGRvX2luc25fZmV0Y2hfYnl0ZShjdHh0LCBlaXArKywgZGVzdCsrKTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlyZXR1cm4gcmM7CiAJfQogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCisvKiBGZXRjaCBuZXh0IHBhcnQgb2YgdGhlIGluc3RydWN0aW9uIGJlaW5nIGVtdWxhdGVkLiAqLworI2RlZmluZSBpbnNuX2ZldGNoKF90eXBlLCBfc2l6ZSwgX2VpcCkJCQkJCVwKKyh7CXVuc2lnbmVkIGxvbmcgX3g7CQkJCQkJXAorCXJjID0gZG9faW5zbl9mZXRjaChjdHh0LCAoX2VpcCksICZfeCwgKF9zaXplKSk7CQkJXAorCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQkJCQkJXAorCQlnb3RvIGRvbmU7CQkJCQkJXAorCShfZWlwKSArPSAoX3NpemUpOwkJCQkJCVwKKwkoX3R5cGUpX3g7CQkJCQkJCVwKK30pCisKKyNkZWZpbmUgaW5zbl9mZXRjaF9hcnIoX2FyciwgX3NpemUsIF9laXApCQkJCVwKKyh7CXJjID0gZG9faW5zbl9mZXRjaChjdHh0LCAoX2VpcCksIF9hcnIsIChfc2l6ZSkpOwkJXAorCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQkJCQkJXAorCQlnb3RvIGRvbmU7CQkJCQkJXAorCShfZWlwKSArPSAoX3NpemUpOwkJCQkJCVwKK30pCisKIC8qCiAgKiBHaXZlbiB0aGUgJ3JlZycgcG9ydGlvbiBvZiBhIE1vZFJNIGJ5dGUsIGFuZCBhIHJlZ2lzdGVyIGJsb2NrLCByZXR1cm4gYQogICogcG9pbnRlciBpbnRvIHRoZSBibG9jayB0aGF0IGFkZHJlc3NlcyB0aGUgcmVsZXZhbnQgcmVnaXN0ZXIuCkBAIC04NTUsMTYgKzg1MiwxNSBAQAogCiBzdGF0aWMgdm9pZCBkZWNvZGVfcmVnaXN0ZXJfb3BlcmFuZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKIAkJCQkgICAgc3RydWN0IG9wZXJhbmQgKm9wLAotCQkJCSAgICBzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjLAogCQkJCSAgICBpbnQgaW5oaWJpdF9ieXRlcmVnKQogewotCXVuc2lnbmVkIHJlZyA9IGMtPm1vZHJtX3JlZzsKLQlpbnQgaGlnaGJ5dGVfcmVncyA9IGMtPnJleF9wcmVmaXggPT0gMDsKKwl1bnNpZ25lZCByZWcgPSBjdHh0LT5tb2RybV9yZWc7CisJaW50IGhpZ2hieXRlX3JlZ3MgPSBjdHh0LT5yZXhfcHJlZml4ID09IDA7CiAKLQlpZiAoIShjLT5kICYgTW9kUk0pKQotCQlyZWcgPSAoYy0+YiAmIDcpIHwgKChjLT5yZXhfcHJlZml4ICYgMSkgPDwgMyk7CisJaWYgKCEoY3R4dC0+ZCAmIE1vZFJNKSkKKwkJcmVnID0gKGN0eHQtPmIgJiA3KSB8ICgoY3R4dC0+cmV4X3ByZWZpeCAmIDEpIDw8IDMpOwogCi0JaWYgKGMtPmQgJiBTc2UpIHsKKwlpZiAoY3R4dC0+ZCAmIFNzZSkgewogCQlvcC0+dHlwZSA9IE9QX1hNTTsKIAkJb3AtPmJ5dGVzID0gMTY7CiAJCW9wLT5hZGRyLnhtbSA9IHJlZzsKQEAgLTg3Myw0OSArODY5LDQ3IEBACiAJfQogCiAJb3AtPnR5cGUgPSBPUF9SRUc7Ci0JaWYgKChjLT5kICYgQnl0ZU9wKSAmJiAhaW5oaWJpdF9ieXRlcmVnKSB7Ci0JCW9wLT5hZGRyLnJlZyA9IGRlY29kZV9yZWdpc3RlcihyZWcsIGMtPnJlZ3MsIGhpZ2hieXRlX3JlZ3MpOworCWlmICgoY3R4dC0+ZCAmIEJ5dGVPcCkgJiYgIWluaGliaXRfYnl0ZXJlZykgeworCQlvcC0+YWRkci5yZWcgPSBkZWNvZGVfcmVnaXN0ZXIocmVnLCBjdHh0LT5yZWdzLCBoaWdoYnl0ZV9yZWdzKTsKIAkJb3AtPmJ5dGVzID0gMTsKIAl9IGVsc2UgewotCQlvcC0+YWRkci5yZWcgPSBkZWNvZGVfcmVnaXN0ZXIocmVnLCBjLT5yZWdzLCAwKTsKLQkJb3AtPmJ5dGVzID0gYy0+b3BfYnl0ZXM7CisJCW9wLT5hZGRyLnJlZyA9IGRlY29kZV9yZWdpc3RlcihyZWcsIGN0eHQtPnJlZ3MsIDApOworCQlvcC0+Ynl0ZXMgPSBjdHh0LT5vcF9ieXRlczsKIAl9CiAJZmV0Y2hfcmVnaXN0ZXJfb3BlcmFuZChvcCk7CiAJb3AtPm9yaWdfdmFsID0gb3AtPnZhbDsKIH0KIAogc3RhdGljIGludCBkZWNvZGVfbW9kcm0oc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCQlzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsCiAJCQlzdHJ1Y3Qgb3BlcmFuZCAqb3ApCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CiAJdTggc2liOwogCWludCBpbmRleF9yZWcgPSAwLCBiYXNlX3JlZyA9IDAsIHNjYWxlOwogCWludCByYyA9IFg4NkVNVUxfQ09OVElOVUU7CiAJdWxvbmcgbW9kcm1fZWEgPSAwOwogCi0JaWYgKGMtPnJleF9wcmVmaXgpIHsKLQkJYy0+bW9kcm1fcmVnID0gKGMtPnJleF9wcmVmaXggJiA0KSA8PCAxOwkvKiBSRVguUiAqLwotCQlpbmRleF9yZWcgPSAoYy0+cmV4X3ByZWZpeCAmIDIpIDw8IDI7IC8qIFJFWC5YICovCi0JCWMtPm1vZHJtX3JtID0gYmFzZV9yZWcgPSAoYy0+cmV4X3ByZWZpeCAmIDEpIDw8IDM7IC8qIFJFRy5CICovCisJaWYgKGN0eHQtPnJleF9wcmVmaXgpIHsKKwkJY3R4dC0+bW9kcm1fcmVnID0gKGN0eHQtPnJleF9wcmVmaXggJiA0KSA8PCAxOwkvKiBSRVguUiAqLworCQlpbmRleF9yZWcgPSAoY3R4dC0+cmV4X3ByZWZpeCAmIDIpIDw8IDI7IC8qIFJFWC5YICovCisJCWN0eHQtPm1vZHJtX3JtID0gYmFzZV9yZWcgPSAoY3R4dC0+cmV4X3ByZWZpeCAmIDEpIDw8IDM7IC8qIFJFRy5CICovCiAJfQogCi0JYy0+bW9kcm0gPSBpbnNuX2ZldGNoKHU4LCAxLCBjLT5laXApOwotCWMtPm1vZHJtX21vZCB8PSAoYy0+bW9kcm0gJiAweGMwKSA+PiA2OwotCWMtPm1vZHJtX3JlZyB8PSAoYy0+bW9kcm0gJiAweDM4KSA+PiAzOwotCWMtPm1vZHJtX3JtIHw9IChjLT5tb2RybSAmIDB4MDcpOwotCWMtPm1vZHJtX3NlZyA9IFZDUFVfU1JFR19EUzsKKwljdHh0LT5tb2RybSA9IGluc25fZmV0Y2godTgsIDEsIGN0eHQtPl9laXApOworCWN0eHQtPm1vZHJtX21vZCB8PSAoY3R4dC0+bW9kcm0gJiAweGMwKSA+PiA2OworCWN0eHQtPm1vZHJtX3JlZyB8PSAoY3R4dC0+bW9kcm0gJiAweDM4KSA+PiAzOworCWN0eHQtPm1vZHJtX3JtIHw9IChjdHh0LT5tb2RybSAmIDB4MDcpOworCWN0eHQtPm1vZHJtX3NlZyA9IFZDUFVfU1JFR19EUzsKIAotCWlmIChjLT5tb2RybV9tb2QgPT0gMykgeworCWlmIChjdHh0LT5tb2RybV9tb2QgPT0gMykgewogCQlvcC0+dHlwZSA9IE9QX1JFRzsKLQkJb3AtPmJ5dGVzID0gKGMtPmQgJiBCeXRlT3ApID8gMSA6IGMtPm9wX2J5dGVzOwotCQlvcC0+YWRkci5yZWcgPSBkZWNvZGVfcmVnaXN0ZXIoYy0+bW9kcm1fcm0sCi0JCQkJCSAgICAgICBjLT5yZWdzLCBjLT5kICYgQnl0ZU9wKTsKLQkJaWYgKGMtPmQgJiBTc2UpIHsKKwkJb3AtPmJ5dGVzID0gKGN0eHQtPmQgJiBCeXRlT3ApID8gMSA6IGN0eHQtPm9wX2J5dGVzOworCQlvcC0+YWRkci5yZWcgPSBkZWNvZGVfcmVnaXN0ZXIoY3R4dC0+bW9kcm1fcm0sCisJCQkJCSAgICAgICBjdHh0LT5yZWdzLCBjdHh0LT5kICYgQnl0ZU9wKTsKKwkJaWYgKGN0eHQtPmQgJiBTc2UpIHsKIAkJCW9wLT50eXBlID0gT1BfWE1NOwogCQkJb3AtPmJ5dGVzID0gMTY7Ci0JCQlvcC0+YWRkci54bW0gPSBjLT5tb2RybV9ybTsKLQkJCXJlYWRfc3NlX3JlZyhjdHh0LCAmb3AtPnZlY192YWwsIGMtPm1vZHJtX3JtKTsKKwkJCW9wLT5hZGRyLnhtbSA9IGN0eHQtPm1vZHJtX3JtOworCQkJcmVhZF9zc2VfcmVnKGN0eHQsICZvcC0+dmVjX3ZhbCwgY3R4dC0+bW9kcm1fcm0pOwogCQkJcmV0dXJuIHJjOwogCQl9CiAJCWZldGNoX3JlZ2lzdGVyX29wZXJhbmQob3ApOwpAQCAtOTI0LDI2ICs5MTgsMjYgQEAKIAogCW9wLT50eXBlID0gT1BfTUVNOwogCi0JaWYgKGMtPmFkX2J5dGVzID09IDIpIHsKLQkJdW5zaWduZWQgYnggPSBjLT5yZWdzW1ZDUFVfUkVHU19SQlhdOwotCQl1bnNpZ25lZCBicCA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JCUF07Ci0JCXVuc2lnbmVkIHNpID0gYy0+cmVnc1tWQ1BVX1JFR1NfUlNJXTsKLQkJdW5zaWduZWQgZGkgPSBjLT5yZWdzW1ZDUFVfUkVHU19SREldOworCWlmIChjdHh0LT5hZF9ieXRlcyA9PSAyKSB7CisJCXVuc2lnbmVkIGJ4ID0gY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkJYXTsKKwkJdW5zaWduZWQgYnAgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQlBdOworCQl1bnNpZ25lZCBzaSA9IGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JTSV07CisJCXVuc2lnbmVkIGRpID0gY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRJXTsKIAogCQkvKiAxNi1iaXQgTW9kUi9NIGRlY29kZS4gKi8KLQkJc3dpdGNoIChjLT5tb2RybV9tb2QpIHsKKwkJc3dpdGNoIChjdHh0LT5tb2RybV9tb2QpIHsKIAkJY2FzZSAwOgotCQkJaWYgKGMtPm1vZHJtX3JtID09IDYpCi0JCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaCh1MTYsIDIsIGMtPmVpcCk7CisJCQlpZiAoY3R4dC0+bW9kcm1fcm0gPT0gNikKKwkJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHUxNiwgMiwgY3R4dC0+X2VpcCk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgotCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaChzOCwgMSwgYy0+ZWlwKTsKKwkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczgsIDEsIGN0eHQtPl9laXApOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKLQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2godTE2LCAyLCBjLT5laXApOworCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaCh1MTYsIDIsIGN0eHQtPl9laXApOwogCQkJYnJlYWs7CiAJCX0KLQkJc3dpdGNoIChjLT5tb2RybV9ybSkgeworCQlzd2l0Y2ggKGN0eHQtPm1vZHJtX3JtKSB7CiAJCWNhc2UgMDoKIAkJCW1vZHJtX2VhICs9IGJ4ICsgc2k7CiAJCQlicmVhazsKQEAgLTk2Myw0NiArOTU3LDQ2IEBACiAJCQltb2RybV9lYSArPSBkaTsKIAkJCWJyZWFrOwogCQljYXNlIDY6Ci0JCQlpZiAoYy0+bW9kcm1fbW9kICE9IDApCisJCQlpZiAoY3R4dC0+bW9kcm1fbW9kICE9IDApCiAJCQkJbW9kcm1fZWEgKz0gYnA7CiAJCQlicmVhazsKIAkJY2FzZSA3OgogCQkJbW9kcm1fZWEgKz0gYng7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoYy0+bW9kcm1fcm0gPT0gMiB8fCBjLT5tb2RybV9ybSA9PSAzIHx8Ci0JCSAgICAoYy0+bW9kcm1fcm0gPT0gNiAmJiBjLT5tb2RybV9tb2QgIT0gMCkpCi0JCQljLT5tb2RybV9zZWcgPSBWQ1BVX1NSRUdfU1M7CisJCWlmIChjdHh0LT5tb2RybV9ybSA9PSAyIHx8IGN0eHQtPm1vZHJtX3JtID09IDMgfHwKKwkJICAgIChjdHh0LT5tb2RybV9ybSA9PSA2ICYmIGN0eHQtPm1vZHJtX21vZCAhPSAwKSkKKwkJCWN0eHQtPm1vZHJtX3NlZyA9IFZDUFVfU1JFR19TUzsKIAkJbW9kcm1fZWEgPSAodTE2KW1vZHJtX2VhOwogCX0gZWxzZSB7CiAJCS8qIDMyLzY0LWJpdCBNb2RSL00gZGVjb2RlLiAqLwotCQlpZiAoKGMtPm1vZHJtX3JtICYgNykgPT0gNCkgewotCQkJc2liID0gaW5zbl9mZXRjaCh1OCwgMSwgYy0+ZWlwKTsKKwkJaWYgKChjdHh0LT5tb2RybV9ybSAmIDcpID09IDQpIHsKKwkJCXNpYiA9IGluc25fZmV0Y2godTgsIDEsIGN0eHQtPl9laXApOwogCQkJaW5kZXhfcmVnIHw9IChzaWIgPj4gMykgJiA3OwogCQkJYmFzZV9yZWcgfD0gc2liICYgNzsKIAkJCXNjYWxlID0gc2liID4+IDY7CiAKLQkJCWlmICgoYmFzZV9yZWcgJiA3KSA9PSA1ICYmIGMtPm1vZHJtX21vZCA9PSAwKQotCQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczMyLCA0LCBjLT5laXApOworCQkJaWYgKChiYXNlX3JlZyAmIDcpID09IDUgJiYgY3R4dC0+bW9kcm1fbW9kID09IDApCisJCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaChzMzIsIDQsIGN0eHQtPl9laXApOwogCQkJZWxzZQotCQkJCW1vZHJtX2VhICs9IGMtPnJlZ3NbYmFzZV9yZWddOworCQkJCW1vZHJtX2VhICs9IGN0eHQtPnJlZ3NbYmFzZV9yZWddOwogCQkJaWYgKGluZGV4X3JlZyAhPSA0KQotCQkJCW1vZHJtX2VhICs9IGMtPnJlZ3NbaW5kZXhfcmVnXSA8PCBzY2FsZTsKLQkJfSBlbHNlIGlmICgoYy0+bW9kcm1fcm0gJiA3KSA9PSA1ICYmIGMtPm1vZHJtX21vZCA9PSAwKSB7CisJCQkJbW9kcm1fZWEgKz0gY3R4dC0+cmVnc1tpbmRleF9yZWddIDw8IHNjYWxlOworCQl9IGVsc2UgaWYgKChjdHh0LT5tb2RybV9ybSAmIDcpID09IDUgJiYgY3R4dC0+bW9kcm1fbW9kID09IDApIHsKIAkJCWlmIChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQpCi0JCQkJYy0+cmlwX3JlbGF0aXZlID0gMTsKKwkJCQljdHh0LT5yaXBfcmVsYXRpdmUgPSAxOwogCQl9IGVsc2UKLQkJCW1vZHJtX2VhICs9IGMtPnJlZ3NbYy0+bW9kcm1fcm1dOwotCQlzd2l0Y2ggKGMtPm1vZHJtX21vZCkgeworCQkJbW9kcm1fZWEgKz0gY3R4dC0+cmVnc1tjdHh0LT5tb2RybV9ybV07CisJCXN3aXRjaCAoY3R4dC0+bW9kcm1fbW9kKSB7CiAJCWNhc2UgMDoKLQkJCWlmIChjLT5tb2RybV9ybSA9PSA1KQotCQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczMyLCA0LCBjLT5laXApOworCQkJaWYgKGN0eHQtPm1vZHJtX3JtID09IDUpCisJCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaChzMzIsIDQsIGN0eHQtPl9laXApOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKLQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczgsIDEsIGMtPmVpcCk7CisJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHM4LCAxLCBjdHh0LT5fZWlwKTsKIAkJCWJyZWFrOwogCQljYXNlIDI6Ci0JCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHMzMiwgNCwgYy0+ZWlwKTsKKwkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczMyLCA0LCBjdHh0LT5fZWlwKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTAxMiw1MyArMTAwNiw1MCBAQAogfQogCiBzdGF0aWMgaW50IGRlY29kZV9hYnMoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCSAgICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywKIAkJICAgICAgc3RydWN0IG9wZXJhbmQgKm9wKQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCWludCByYyA9IFg4NkVNVUxfQ09OVElOVUU7CiAKIAlvcC0+dHlwZSA9IE9QX01FTTsKLQlzd2l0Y2ggKGMtPmFkX2J5dGVzKSB7CisJc3dpdGNoIChjdHh0LT5hZF9ieXRlcykgewogCWNhc2UgMjoKLQkJb3AtPmFkZHIubWVtLmVhID0gaW5zbl9mZXRjaCh1MTYsIDIsIGMtPmVpcCk7CisJCW9wLT5hZGRyLm1lbS5lYSA9IGluc25fZmV0Y2godTE2LCAyLCBjdHh0LT5fZWlwKTsKIAkJYnJlYWs7CiAJY2FzZSA0OgotCQlvcC0+YWRkci5tZW0uZWEgPSBpbnNuX2ZldGNoKHUzMiwgNCwgYy0+ZWlwKTsKKwkJb3AtPmFkZHIubWVtLmVhID0gaW5zbl9mZXRjaCh1MzIsIDQsIGN0eHQtPl9laXApOwogCQlicmVhazsKIAljYXNlIDg6Ci0JCW9wLT5hZGRyLm1lbS5lYSA9IGluc25fZmV0Y2godTY0LCA4LCBjLT5laXApOworCQlvcC0+YWRkci5tZW0uZWEgPSBpbnNuX2ZldGNoKHU2NCwgOCwgY3R4dC0+X2VpcCk7CiAJCWJyZWFrOwogCX0KIGRvbmU6CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBmZXRjaF9iaXRfb3BlcmFuZChzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjKQorc3RhdGljIHZvaWQgZmV0Y2hfYml0X29wZXJhbmQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7CiAJbG9uZyBzdiA9IDAsIG1hc2s7CiAKLQlpZiAoYy0+ZHN0LnR5cGUgPT0gT1BfTUVNICYmIGMtPnNyYy50eXBlID09IE9QX1JFRykgewotCQltYXNrID0gfihjLT5kc3QuYnl0ZXMgKiA4IC0gMSk7CisJaWYgKGN0eHQtPmRzdC50eXBlID09IE9QX01FTSAmJiBjdHh0LT5zcmMudHlwZSA9PSBPUF9SRUcpIHsKKwkJbWFzayA9IH4oY3R4dC0+ZHN0LmJ5dGVzICogOCAtIDEpOwogCi0JCWlmIChjLT5zcmMuYnl0ZXMgPT0gMikKLQkJCXN2ID0gKHMxNiljLT5zcmMudmFsICYgKHMxNiltYXNrOwotCQllbHNlIGlmIChjLT5zcmMuYnl0ZXMgPT0gNCkKLQkJCXN2ID0gKHMzMiljLT5zcmMudmFsICYgKHMzMiltYXNrOworCQlpZiAoY3R4dC0+c3JjLmJ5dGVzID09IDIpCisJCQlzdiA9IChzMTYpY3R4dC0+c3JjLnZhbCAmIChzMTYpbWFzazsKKwkJZWxzZSBpZiAoY3R4dC0+c3JjLmJ5dGVzID09IDQpCisJCQlzdiA9IChzMzIpY3R4dC0+c3JjLnZhbCAmIChzMzIpbWFzazsKIAotCQljLT5kc3QuYWRkci5tZW0uZWEgKz0gKHN2ID4+IDMpOworCQljdHh0LT5kc3QuYWRkci5tZW0uZWEgKz0gKHN2ID4+IDMpOwogCX0KIAogCS8qIG9ubHkgc3Vid29yZCBvZmZzZXQgKi8KLQljLT5zcmMudmFsICY9IChjLT5kc3QuYnl0ZXMgPDwgMykgLSAxOworCWN0eHQtPnNyYy52YWwgJj0gKGN0eHQtPmRzdC5ieXRlcyA8PCAzKSAtIDE7CiB9CiAKIHN0YXRpYyBpbnQgcmVhZF9lbXVsYXRlZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCSBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsCiAJCQkgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkZXN0LCB1bnNpZ25lZCBzaXplKQogewogCWludCByYzsKLQlzdHJ1Y3QgcmVhZF9jYWNoZSAqbWMgPSAmY3R4dC0+ZGVjb2RlLm1lbV9yZWFkOworCXN0cnVjdCByZWFkX2NhY2hlICptYyA9ICZjdHh0LT5tZW1fcmVhZDsKIAogCXdoaWxlIChzaXplKSB7CiAJCWludCBuID0gbWluKHNpemUsIDh1KTsKQEAgLTEwNjYsOCArMTA1Nyw4IEBACiAJCWlmIChtYy0+cG9zIDwgbWMtPmVuZCkKIAkJCWdvdG8gcmVhZF9jYWNoZWQ7CiAKLQkJcmMgPSBvcHMtPnJlYWRfZW11bGF0ZWQoY3R4dCwgYWRkciwgbWMtPmRhdGEgKyBtYy0+ZW5kLCBuLAotCQkJCQkmY3R4dC0+ZXhjZXB0aW9uKTsKKwkJcmMgPSBjdHh0LT5vcHMtPnJlYWRfZW11bGF0ZWQoY3R4dCwgYWRkciwgbWMtPmRhdGEgKyBtYy0+ZW5kLCBuLAorCQkJCQkgICAgICAmY3R4dC0+ZXhjZXB0aW9uKTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlyZXR1cm4gcmM7CiAJCW1jLT5lbmQgKz0gbjsKQEAgLTEwOTIsNyArMTA4Myw3IEBACiAJcmMgPSBsaW5lYXJpemUoY3R4dCwgYWRkciwgc2l6ZSwgZmFsc2UsICZsaW5lYXIpOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7Ci0JcmV0dXJuIHJlYWRfZW11bGF0ZWQoY3R4dCwgY3R4dC0+b3BzLCBsaW5lYXIsIGRhdGEsIHNpemUpOworCXJldHVybiByZWFkX2VtdWxhdGVkKGN0eHQsIGxpbmVhciwgZGF0YSwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQgc2VnbWVudGVkX3dyaXRlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LApAQCAtMTEyNiwyNiArMTExNywyNCBAQAogfQogCiBzdGF0aWMgaW50IHBpb19pbl9lbXVsYXRlZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCSAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywKIAkJCSAgIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBzaG9ydCBwb3J0LAogCQkJICAgdm9pZCAqZGVzdCkKIHsKLQlzdHJ1Y3QgcmVhZF9jYWNoZSAqcmMgPSAmY3R4dC0+ZGVjb2RlLmlvX3JlYWQ7CisJc3RydWN0IHJlYWRfY2FjaGUgKnJjID0gJmN0eHQtPmlvX3JlYWQ7CiAKIAlpZiAocmMtPnBvcyA9PSByYy0+ZW5kKSB7IC8qIHJlZmlsbCBwaW8gcmVhZCBhaGVhZCAqLwotCQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAkJdW5zaWduZWQgaW50IGluX3BhZ2UsIG47Ci0JCXVuc2lnbmVkIGludCBjb3VudCA9IGMtPnJlcF9wcmVmaXggPwotCQkJYWRkcmVzc19tYXNrKGMsIGMtPnJlZ3NbVkNQVV9SRUdTX1JDWF0pIDogMTsKKwkJdW5zaWduZWQgaW50IGNvdW50ID0gY3R4dC0+cmVwX3ByZWZpeCA/CisJCQlhZGRyZXNzX21hc2soY3R4dCwgY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkNYXSkgOiAxOwogCQlpbl9wYWdlID0gKGN0eHQtPmVmbGFncyAmIEVGTEdfREYpID8KLQkJCW9mZnNldF9pbl9wYWdlKGMtPnJlZ3NbVkNQVV9SRUdTX1JESV0pIDoKLQkJCVBBR0VfU0laRSAtIG9mZnNldF9pbl9wYWdlKGMtPnJlZ3NbVkNQVV9SRUdTX1JESV0pOworCQkJb2Zmc2V0X2luX3BhZ2UoY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRJXSkgOgorCQkJUEFHRV9TSVpFIC0gb2Zmc2V0X2luX3BhZ2UoY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRJXSk7CiAJCW4gPSBtaW4obWluKGluX3BhZ2UsICh1bnNpZ25lZCBpbnQpc2l6ZW9mKHJjLT5kYXRhKSkgLyBzaXplLAogCQkJY291bnQpOwogCQlpZiAobiA9PSAwKQogCQkJbiA9IDE7CiAJCXJjLT5wb3MgPSByYy0+ZW5kID0gMDsKLQkJaWYgKCFvcHMtPnBpb19pbl9lbXVsYXRlZChjdHh0LCBzaXplLCBwb3J0LCByYy0+ZGF0YSwgbikpCisJCWlmICghY3R4dC0+b3BzLT5waW9faW5fZW11bGF0ZWQoY3R4dCwgc2l6ZSwgcG9ydCwgcmMtPmRhdGEsIG4pKQogCQkJcmV0dXJuIDA7CiAJCXJjLT5lbmQgPSBuICogc2l6ZTsKIAl9CkBAIC0xMTU2LDkgKzExNDUsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQgZ2V0X2Rlc2NyaXB0b3JfdGFibGVfcHRyKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJCSAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzLAogCQkJCSAgICAgdTE2IHNlbGVjdG9yLCBzdHJ1Y3QgZGVzY19wdHIgKmR0KQogeworCXN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcyA9IGN0eHQtPm9wczsKKwogCWlmIChzZWxlY3RvciAmIDEgPDwgMikgewogCQlzdHJ1Y3QgZGVzY19zdHJ1Y3QgZGVzYzsKIAkJdTE2IHNlbDsKQEAgLTExNzUsNDggKzExNjUsNDIgQEAKIAogLyogYWxsb3dlZCBqdXN0IGZvciA4IGJ5dGVzIHNlZ21lbnRzICovCiBzdGF0aWMgaW50IHJlYWRfc2VnbWVudF9kZXNjcmlwdG9yKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJCSAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywKIAkJCQkgICB1MTYgc2VsZWN0b3IsIHN0cnVjdCBkZXNjX3N0cnVjdCAqZGVzYykKIHsKIAlzdHJ1Y3QgZGVzY19wdHIgZHQ7CiAJdTE2IGluZGV4ID0gc2VsZWN0b3IgPj4gMzsKLQlpbnQgcmV0OwogCXVsb25nIGFkZHI7CiAKLQlnZXRfZGVzY3JpcHRvcl90YWJsZV9wdHIoY3R4dCwgb3BzLCBzZWxlY3RvciwgJmR0KTsKKwlnZXRfZGVzY3JpcHRvcl90YWJsZV9wdHIoY3R4dCwgc2VsZWN0b3IsICZkdCk7CiAKIAlpZiAoZHQuc2l6ZSA8IGluZGV4ICogOCArIDcpCiAJCXJldHVybiBlbXVsYXRlX2dwKGN0eHQsIHNlbGVjdG9yICYgMHhmZmZjKTsKLQlhZGRyID0gZHQuYWRkcmVzcyArIGluZGV4ICogODsKLQlyZXQgPSBvcHMtPnJlYWRfc3RkKGN0eHQsIGFkZHIsIGRlc2MsIHNpemVvZiAqZGVzYywgJmN0eHQtPmV4Y2VwdGlvbik7CiAKLSAgICAgICByZXR1cm4gcmV0OworCWFkZHIgPSBkdC5hZGRyZXNzICsgaW5kZXggKiA4OworCXJldHVybiBjdHh0LT5vcHMtPnJlYWRfc3RkKGN0eHQsIGFkZHIsIGRlc2MsIHNpemVvZiAqZGVzYywKKwkJCQkgICAmY3R4dC0+ZXhjZXB0aW9uKTsKIH0KIAogLyogYWxsb3dlZCBqdXN0IGZvciA4IGJ5dGVzIHNlZ21lbnRzICovCiBzdGF0aWMgaW50IHdyaXRlX3NlZ21lbnRfZGVzY3JpcHRvcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCQkgICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzLAogCQkJCSAgICB1MTYgc2VsZWN0b3IsIHN0cnVjdCBkZXNjX3N0cnVjdCAqZGVzYykKIHsKIAlzdHJ1Y3QgZGVzY19wdHIgZHQ7CiAJdTE2IGluZGV4ID0gc2VsZWN0b3IgPj4gMzsKIAl1bG9uZyBhZGRyOwotCWludCByZXQ7CiAKLQlnZXRfZGVzY3JpcHRvcl90YWJsZV9wdHIoY3R4dCwgb3BzLCBzZWxlY3RvciwgJmR0KTsKKwlnZXRfZGVzY3JpcHRvcl90YWJsZV9wdHIoY3R4dCwgc2VsZWN0b3IsICZkdCk7CiAKIAlpZiAoZHQuc2l6ZSA8IGluZGV4ICogOCArIDcpCiAJCXJldHVybiBlbXVsYXRlX2dwKGN0eHQsIHNlbGVjdG9yICYgMHhmZmZjKTsKIAogCWFkZHIgPSBkdC5hZGRyZXNzICsgaW5kZXggKiA4OwotCXJldCA9IG9wcy0+d3JpdGVfc3RkKGN0eHQsIGFkZHIsIGRlc2MsIHNpemVvZiAqZGVzYywgJmN0eHQtPmV4Y2VwdGlvbik7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBjdHh0LT5vcHMtPndyaXRlX3N0ZChjdHh0LCBhZGRyLCBkZXNjLCBzaXplb2YgKmRlc2MsCisJCQkJICAgICZjdHh0LT5leGNlcHRpb24pOwogfQogCiAvKiBEb2VzIG5vdCBzdXBwb3J0IGxvbmcgbW9kZSAqLwogc3RhdGljIGludCBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCQkgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsCiAJCQkJICAgdTE2IHNlbGVjdG9yLCBpbnQgc2VnKQogewogCXN0cnVjdCBkZXNjX3N0cnVjdCBzZWdfZGVzYzsKQEAgLTEyNTEsNyArMTIzNSw3IEBACiAJaWYgKG51bGxfc2VsZWN0b3IpIC8qIGZvciBOVUxMIHNlbGVjdG9yIHNraXAgYWxsIGZvbGxvd2luZyBjaGVja3MgKi8KIAkJZ290byBsb2FkOwogCi0JcmV0ID0gcmVhZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCBzZWxlY3RvciwgJnNlZ19kZXNjKTsKKwlyZXQgPSByZWFkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBzZWxlY3RvciwgJnNlZ19kZXNjKTsKIAlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByZXQ7CiAKQEAgLTEyNjksNyArMTI1Myw3IEBACiAKIAlycGwgPSBzZWxlY3RvciAmIDM7CiAJZHBsID0gc2VnX2Rlc2MuZHBsOwotCWNwbCA9IG9wcy0+Y3BsKGN0eHQpOworCWNwbCA9IGN0eHQtPm9wcy0+Y3BsKGN0eHQpOwogCiAJc3dpdGNoIChzZWcpIHsKIAljYXNlIFZDUFVfU1JFR19TUzoKQEAgLTEzMjAsMTIgKzEzMDQsMTIgQEAKIAlpZiAoc2VnX2Rlc2MucykgewogCQkvKiBtYXJrIHNlZ21lbnQgYXMgYWNjZXNzZWQgKi8KIAkJc2VnX2Rlc2MudHlwZSB8PSAxOwotCQlyZXQgPSB3cml0ZV9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCBzZWxlY3RvciwgJnNlZ19kZXNjKTsKKwkJcmV0ID0gd3JpdGVfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIHNlbGVjdG9yLCAmc2VnX2Rlc2MpOwogCQlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlyZXR1cm4gcmV0OwogCX0KIGxvYWQ6Ci0Jb3BzLT5zZXRfc2VnbWVudChjdHh0LCBzZWxlY3RvciwgJnNlZ19kZXNjLCAwLCBzZWcpOworCWN0eHQtPm9wcy0+c2V0X3NlZ21lbnQoY3R4dCwgc2VsZWN0b3IsICZzZWdfZGVzYywgMCwgc2VnKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIGV4Y2VwdGlvbjoKIAllbXVsYXRlX2V4Y2VwdGlvbihjdHh0LCBlcnJfdmVjLCBlcnJfY29kZSwgdHJ1ZSk7CkBAIC0xMzU0LDI5ICsxMzM4LDI4IEBACiBzdGF0aWMgaW50IHdyaXRlYmFjayhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKIAlpbnQgcmM7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CiAKLQlzd2l0Y2ggKGMtPmRzdC50eXBlKSB7CisJc3dpdGNoIChjdHh0LT5kc3QudHlwZSkgewogCWNhc2UgT1BfUkVHOgotCQl3cml0ZV9yZWdpc3Rlcl9vcGVyYW5kKCZjLT5kc3QpOworCQl3cml0ZV9yZWdpc3Rlcl9vcGVyYW5kKCZjdHh0LT5kc3QpOwogCQlicmVhazsKIAljYXNlIE9QX01FTToKLQkJaWYgKGMtPmxvY2tfcHJlZml4KQorCQlpZiAoY3R4dC0+bG9ja19wcmVmaXgpCiAJCQlyYyA9IHNlZ21lbnRlZF9jbXB4Y2hnKGN0eHQsCi0JCQkJCSAgICAgICBjLT5kc3QuYWRkci5tZW0sCi0JCQkJCSAgICAgICAmYy0+ZHN0Lm9yaWdfdmFsLAotCQkJCQkgICAgICAgJmMtPmRzdC52YWwsCi0JCQkJCSAgICAgICBjLT5kc3QuYnl0ZXMpOworCQkJCQkgICAgICAgY3R4dC0+ZHN0LmFkZHIubWVtLAorCQkJCQkgICAgICAgJmN0eHQtPmRzdC5vcmlnX3ZhbCwKKwkJCQkJICAgICAgICZjdHh0LT5kc3QudmFsLAorCQkJCQkgICAgICAgY3R4dC0+ZHN0LmJ5dGVzKTsKIAkJZWxzZQogCQkJcmMgPSBzZWdtZW50ZWRfd3JpdGUoY3R4dCwKLQkJCQkJICAgICBjLT5kc3QuYWRkci5tZW0sCi0JCQkJCSAgICAgJmMtPmRzdC52YWwsCi0JCQkJCSAgICAgYy0+ZHN0LmJ5dGVzKTsKKwkJCQkJICAgICBjdHh0LT5kc3QuYWRkci5tZW0sCisJCQkJCSAgICAgJmN0eHQtPmRzdC52YWwsCisJCQkJCSAgICAgY3R4dC0+ZHN0LmJ5dGVzKTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlyZXR1cm4gcmM7CiAJCWJyZWFrOwogCWNhc2UgT1BfWE1NOgotCQl3cml0ZV9zc2VfcmVnKGN0eHQsICZjLT5kc3QudmVjX3ZhbCwgYy0+ZHN0LmFkZHIueG1tKTsKKwkJd3JpdGVfc3NlX3JlZyhjdHh0LCAmY3R4dC0+ZHN0LnZlY192YWwsIGN0eHQtPmRzdC5hZGRyLnhtbSk7CiAJCWJyZWFrOwogCWNhc2UgT1BfTk9ORToKIAkJLyogbm8gd3JpdGViYWNrICovCkBAIC0xMzg5LDUwICsxMzcyLDQ1IEBACiAKIHN0YXRpYyBpbnQgZW1fcHVzaChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAlzdHJ1Y3Qgc2VnbWVudGVkX2FkZHJlc3MgYWRkcjsKIAotCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KGMsICZjLT5yZWdzW1ZDUFVfUkVHU19SU1BdLCAtYy0+b3BfYnl0ZXMpOwotCWFkZHIuZWEgPSByZWdpc3Rlcl9hZGRyZXNzKGMsIGMtPnJlZ3NbVkNQVV9SRUdTX1JTUF0pOworCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KGN0eHQsICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SU1BdLCAtY3R4dC0+b3BfYnl0ZXMpOworCWFkZHIuZWEgPSByZWdpc3Rlcl9hZGRyZXNzKGN0eHQsIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JTUF0pOwogCWFkZHIuc2VnID0gVkNQVV9TUkVHX1NTOwogCiAJLyogRGlzYWJsZSB3cml0ZWJhY2suICovCi0JYy0+ZHN0LnR5cGUgPSBPUF9OT05FOwotCXJldHVybiBzZWdtZW50ZWRfd3JpdGUoY3R4dCwgYWRkciwgJmMtPnNyYy52YWwsIGMtPm9wX2J5dGVzKTsKKwljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7CisJcmV0dXJuIHNlZ21lbnRlZF93cml0ZShjdHh0LCBhZGRyLCAmY3R4dC0+c3JjLnZhbCwgY3R4dC0+b3BfYnl0ZXMpOwogfQogCiBzdGF0aWMgaW50IGVtdWxhdGVfcG9wKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAogCQkgICAgICAgdm9pZCAqZGVzdCwgaW50IGxlbikKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAlpbnQgcmM7CiAJc3RydWN0IHNlZ21lbnRlZF9hZGRyZXNzIGFkZHI7CiAKLQlhZGRyLmVhID0gcmVnaXN0ZXJfYWRkcmVzcyhjLCBjLT5yZWdzW1ZDUFVfUkVHU19SU1BdKTsKKwlhZGRyLmVhID0gcmVnaXN0ZXJfYWRkcmVzcyhjdHh0LCBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SU1BdKTsKIAlhZGRyLnNlZyA9IFZDUFVfU1JFR19TUzsKIAlyYyA9IHNlZ21lbnRlZF9yZWFkKGN0eHQsIGFkZHIsIGRlc3QsIGxlbik7CiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByYzsKIAotCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KGMsICZjLT5yZWdzW1ZDUFVfUkVHU19SU1BdLCBsZW4pOworCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KGN0eHQsICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SU1BdLCBsZW4pOwogCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBlbV9wb3Aoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQlyZXR1cm4gZW11bGF0ZV9wb3AoY3R4dCwgJmMtPmRzdC52YWwsIGMtPm9wX2J5dGVzKTsKKwlyZXR1cm4gZW11bGF0ZV9wb3AoY3R4dCwgJmN0eHQtPmRzdC52YWwsIGN0eHQtPm9wX2J5dGVzKTsKIH0KIAogc3RhdGljIGludCBlbXVsYXRlX3BvcGYoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCSAgICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsCi0JCSAgICAgICB2b2lkICpkZXN0LCBpbnQgbGVuKQorCQkJdm9pZCAqZGVzdCwgaW50IGxlbikKIHsKIAlpbnQgcmM7CiAJdW5zaWduZWQgbG9uZyB2YWwsIGNoYW5nZV9tYXNrOwogCWludCBpb3BsID0gKGN0eHQtPmVmbGFncyAmIFg4Nl9FRkxBR1NfSU9QTCkgPj4gSU9QTF9TSElGVDsKLQlpbnQgY3BsID0gb3BzLT5jcGwoY3R4dCk7CisJaW50IGNwbCA9IGN0eHQtPm9wcy0+Y3BsKGN0eHQpOwogCiAJcmMgPSBlbXVsYXRlX3BvcChjdHh0LCAmdmFsLCBsZW4pOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQpAQCAtMTQ2OCw0OSArMTQ0Niw0MSBAQAogCiBzdGF0aWMgaW50IGVtX3BvcGYoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQljLT5kc3QudHlwZSA9IE9QX1JFRzsKLQljLT5kc3QuYWRkci5yZWcgPSAmY3R4dC0+ZWZsYWdzOwotCWMtPmRzdC5ieXRlcyA9IGMtPm9wX2J5dGVzOwotCXJldHVybiBlbXVsYXRlX3BvcGYoY3R4dCwgY3R4dC0+b3BzLCAmYy0+ZHN0LnZhbCwgYy0+b3BfYnl0ZXMpOworCWN0eHQtPmRzdC50eXBlID0gT1BfUkVHOworCWN0eHQtPmRzdC5hZGRyLnJlZyA9ICZjdHh0LT5lZmxhZ3M7CisJY3R4dC0+ZHN0LmJ5dGVzID0gY3R4dC0+b3BfYnl0ZXM7CisJcmV0dXJuIGVtdWxhdGVfcG9wZihjdHh0LCAmY3R4dC0+ZHN0LnZhbCwgY3R4dC0+b3BfYnl0ZXMpOwogfQogCi1zdGF0aWMgaW50IGVtdWxhdGVfcHVzaF9zcmVnKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsIGludCBzZWcpCitzdGF0aWMgaW50IGVtdWxhdGVfcHVzaF9zcmVnKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgc2VnKQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCi0JYy0+c3JjLnZhbCA9IGdldF9zZWdtZW50X3NlbGVjdG9yKGN0eHQsIHNlZyk7CisJY3R4dC0+c3JjLnZhbCA9IGdldF9zZWdtZW50X3NlbGVjdG9yKGN0eHQsIHNlZyk7CiAKIAlyZXR1cm4gZW1fcHVzaChjdHh0KTsKIH0KIAotc3RhdGljIGludCBlbXVsYXRlX3BvcF9zcmVnKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsIGludCBzZWcpCitzdGF0aWMgaW50IGVtdWxhdGVfcG9wX3NyZWcoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBzZWcpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CiAJdW5zaWduZWQgbG9uZyBzZWxlY3RvcjsKIAlpbnQgcmM7CiAKLQlyYyA9IGVtdWxhdGVfcG9wKGN0eHQsICZzZWxlY3RvciwgYy0+b3BfYnl0ZXMpOworCXJjID0gZW11bGF0ZV9wb3AoY3R4dCwgJnNlbGVjdG9yLCBjdHh0LT5vcF9ieXRlcyk7CiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByYzsKIAotCXJjID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCAodTE2KXNlbGVjdG9yLCBzZWcpOworCXJjID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgKHUxNilzZWxlY3Rvciwgc2VnKTsKIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgZW1fcHVzaGEoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0JdW5zaWduZWQgbG9uZyBvbGRfZXNwID0gYy0+cmVnc1tWQ1BVX1JFR1NfUlNQXTsKKwl1bnNpZ25lZCBsb25nIG9sZF9lc3AgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SU1BdOwogCWludCByYyA9IFg4NkVNVUxfQ09OVElOVUU7CiAJaW50IHJlZyA9IFZDUFVfUkVHU19SQVg7CiAKIAl3aGlsZSAocmVnIDw9IFZDUFVfUkVHU19SREkpIHsKIAkJKHJlZyA9PSBWQ1BVX1JFR1NfUlNQKSA/Ci0JCShjLT5zcmMudmFsID0gb2xkX2VzcCkgOiAoYy0+c3JjLnZhbCA9IGMtPnJlZ3NbcmVnXSk7CisJCShjdHh0LT5zcmMudmFsID0gb2xkX2VzcCkgOiAoY3R4dC0+c3JjLnZhbCA9IGN0eHQtPnJlZ3NbcmVnXSk7CiAKIAkJcmMgPSBlbV9wdXNoKGN0eHQpOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKQEAgLTE1MjQsMjYgKzE0OTQsMjMgQEAKIAogc3RhdGljIGludCBlbV9wdXNoZihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKLQotCWMtPnNyYy52YWwgPSAgKHVuc2lnbmVkIGxvbmcpY3R4dC0+ZWZsYWdzOworCWN0eHQtPnNyYy52YWwgPSAgKHVuc2lnbmVkIGxvbmcpY3R4dC0+ZWZsYWdzOwogCXJldHVybiBlbV9wdXNoKGN0eHQpOwogfQogCiBzdGF0aWMgaW50IGVtX3BvcGEoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CiAJaW50IHJjID0gWDg2RU1VTF9DT05USU5VRTsKIAlpbnQgcmVnID0gVkNQVV9SRUdTX1JESTsKIAogCXdoaWxlIChyZWcgPj0gVkNQVV9SRUdTX1JBWCkgewogCQlpZiAocmVnID09IFZDUFVfUkVHU19SU1ApIHsKLQkJCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KGMsICZjLT5yZWdzW1ZDUFVfUkVHU19SU1BdLAotCQkJCQkJCWMtPm9wX2J5dGVzKTsKKwkJCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KGN0eHQsICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SU1BdLAorCQkJCQkJCWN0eHQtPm9wX2J5dGVzKTsKIAkJCS0tcmVnOwogCQl9CiAKLQkJcmMgPSBlbXVsYXRlX3BvcChjdHh0LCAmYy0+cmVnc1tyZWddLCBjLT5vcF9ieXRlcyk7CisJCXJjID0gZW11bGF0ZV9wb3AoY3R4dCwgJmN0eHQtPnJlZ3NbcmVnXSwgY3R4dC0+b3BfYnl0ZXMpOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCWJyZWFrOwogCQktLXJlZzsKQEAgLTE1NTEsMTAgKzE1MTgsOSBAQAogCXJldHVybiByYzsKIH0KIAotaW50IGVtdWxhdGVfaW50X3JlYWwoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCQkgICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzLCBpbnQgaXJxKQoraW50IGVtdWxhdGVfaW50X3JlYWwoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBpcnEpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CisJc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzID0gY3R4dC0+b3BzOwogCWludCByYzsKIAlzdHJ1Y3QgZGVzY19wdHIgZHQ7CiAJZ3ZhX3QgY3NfYWRkcjsKQEAgLTE1NjIsMTkgKzE1MjgsMTkgQEAKIAl1MTYgY3MsIGVpcDsKIAogCS8qIFRPRE86IEFkZCBsaW1pdCBjaGVja3MgKi8KLQljLT5zcmMudmFsID0gY3R4dC0+ZWZsYWdzOworCWN0eHQtPnNyYy52YWwgPSBjdHh0LT5lZmxhZ3M7CiAJcmMgPSBlbV9wdXNoKGN0eHQpOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7CiAKIAljdHh0LT5lZmxhZ3MgJj0gfihFRkxHX0lGIHwgRUZMR19URiB8IEVGTEdfQUMpOwogCi0JYy0+c3JjLnZhbCA9IGdldF9zZWdtZW50X3NlbGVjdG9yKGN0eHQsIFZDUFVfU1JFR19DUyk7CisJY3R4dC0+c3JjLnZhbCA9IGdldF9zZWdtZW50X3NlbGVjdG9yKGN0eHQsIFZDUFVfU1JFR19DUyk7CiAJcmMgPSBlbV9wdXNoKGN0eHQpOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7CiAKLQljLT5zcmMudmFsID0gYy0+ZWlwOworCWN0eHQtPnNyYy52YWwgPSBjdHh0LT5fZWlwOwogCXJjID0gZW1fcHVzaChjdHh0KTsKIAlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJjOwpAQCAtMTU5MiwyMSArMTU1OCwyMCBAQAogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIG9wcywgY3MsIFZDUFVfU1JFR19DUyk7CisJcmMgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBjcywgVkNQVV9TUkVHX0NTKTsKIAlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJjOwogCi0JYy0+ZWlwID0gZWlwOworCWN0eHQtPl9laXAgPSBlaXA7CiAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgZW11bGF0ZV9pbnQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCSAgICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsIGludCBpcnEpCitzdGF0aWMgaW50IGVtdWxhdGVfaW50KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgaXJxKQogewogCXN3aXRjaChjdHh0LT5tb2RlKSB7CiAJY2FzZSBYODZFTVVMX01PREVfUkVBTDoKLQkJcmV0dXJuIGVtdWxhdGVfaW50X3JlYWwoY3R4dCwgb3BzLCBpcnEpOworCQlyZXR1cm4gZW11bGF0ZV9pbnRfcmVhbChjdHh0LCBpcnEpOwogCWNhc2UgWDg2RU1VTF9NT0RFX1ZNODY6CiAJY2FzZSBYODZFTVVMX01PREVfUFJPVDE2OgogCWNhc2UgWDg2RU1VTF9NT0RFX1BST1QzMjoKQEAgLTE2MTcsMTAgKzE1ODIsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCBlbXVsYXRlX2lyZXRfcmVhbChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCSAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzKQorc3RhdGljIGludCBlbXVsYXRlX2lyZXRfcmVhbChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAlpbnQgcmMgPSBYODZFTVVMX0NPTlRJTlVFOwogCXVuc2lnbmVkIGxvbmcgdGVtcF9laXAgPSAwOwogCXVuc2lnbmVkIGxvbmcgdGVtcF9lZmxhZ3MgPSAwOwpAQCAtMTYzMiw3ICsxNTk1LDcgQEAKIAogCS8qIFRPRE86IEFkZCBzdGFjayBsaW1pdCBjaGVjayAqLwogCi0JcmMgPSBlbXVsYXRlX3BvcChjdHh0LCAmdGVtcF9laXAsIGMtPm9wX2J5dGVzKTsKKwlyYyA9IGVtdWxhdGVfcG9wKGN0eHQsICZ0ZW1wX2VpcCwgY3R4dC0+b3BfYnl0ZXMpOwogCiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByYzsKQEAgLTE2NDAsMjcgKzE2MDMsMjcgQEAKIAlpZiAodGVtcF9laXAgJiB+MHhmZmZmKQogCQlyZXR1cm4gZW11bGF0ZV9ncChjdHh0LCAwKTsKIAotCXJjID0gZW11bGF0ZV9wb3AoY3R4dCwgJmNzLCBjLT5vcF9ieXRlcyk7CisJcmMgPSBlbXVsYXRlX3BvcChjdHh0LCAmY3MsIGN0eHQtPm9wX2J5dGVzKTsKIAogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IGVtdWxhdGVfcG9wKGN0eHQsICZ0ZW1wX2VmbGFncywgYy0+b3BfYnl0ZXMpOworCXJjID0gZW11bGF0ZV9wb3AoY3R4dCwgJnRlbXBfZWZsYWdzLCBjdHh0LT5vcF9ieXRlcyk7CiAKIAlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBvcHMsICh1MTYpY3MsIFZDUFVfU1JFR19DUyk7CisJcmMgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCAodTE2KWNzLCBWQ1BVX1NSRUdfQ1MpOwogCiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByYzsKIAotCWMtPmVpcCA9IHRlbXBfZWlwOworCWN0eHQtPl9laXAgPSB0ZW1wX2VpcDsKIAogCi0JaWYgKGMtPm9wX2J5dGVzID09IDQpCisJaWYgKGN0eHQtPm9wX2J5dGVzID09IDQpCiAJCWN0eHQtPmVmbGFncyA9ICgodGVtcF9lZmxhZ3MgJiBtYXNrKSB8IChjdHh0LT5lZmxhZ3MgJiB2bTg2X21hc2spKTsKLQllbHNlIGlmIChjLT5vcF9ieXRlcyA9PSAyKSB7CisJZWxzZSBpZiAoY3R4dC0+b3BfYnl0ZXMgPT0gMikgewogCQljdHh0LT5lZmxhZ3MgJj0gfjB4ZmZmZjsKIAkJY3R4dC0+ZWZsYWdzIHw9IHRlbXBfZWZsYWdzOwogCX0KQEAgLTE2NzEsMTIgKzE2MzQsMTEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGVtdWxhdGVfaXJldChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCQkgICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyogb3BzKQorc3RhdGljIGludCBlbV9pcmV0KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewogCXN3aXRjaChjdHh0LT5tb2RlKSB7CiAJY2FzZSBYODZFTVVMX01PREVfUkVBTDoKLQkJcmV0dXJuIGVtdWxhdGVfaXJldF9yZWFsKGN0eHQsIG9wcyk7CisJCXJldHVybiBlbXVsYXRlX2lyZXRfcmVhbChjdHh0KTsKIAljYXNlIFg4NkVNVUxfTU9ERV9WTTg2OgogCWNhc2UgWDg2RU1VTF9NT0RFX1BST1QxNjoKIAljYXNlIFg4NkVNVUxfTU9ERV9QUk9UMzI6CkBAIC0xNjg5LDUzICsxNjUxLDQ5IEBACiAKIHN0YXRpYyBpbnQgZW1fam1wX2ZhcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAlpbnQgcmM7CiAJdW5zaWduZWQgc2hvcnQgc2VsOwogCi0JbWVtY3B5KCZzZWwsIGMtPnNyYy52YWxwdHIgKyBjLT5vcF9ieXRlcywgMik7CisJbWVtY3B5KCZzZWwsIGN0eHQtPnNyYy52YWxwdHIgKyBjdHh0LT5vcF9ieXRlcywgMik7CiAKLQlyYyA9IGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIGN0eHQtPm9wcywgc2VsLCBWQ1BVX1NSRUdfQ1MpOworCXJjID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgc2VsLCBWQ1BVX1NSRUdfQ1MpOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7CiAKLQljLT5laXAgPSAwOwotCW1lbWNweSgmYy0+ZWlwLCBjLT5zcmMudmFscHRyLCBjLT5vcF9ieXRlcyk7CisJY3R4dC0+X2VpcCA9IDA7CisJbWVtY3B5KCZjdHh0LT5fZWlwLCBjdHh0LT5zcmMudmFscHRyLCBjdHh0LT5vcF9ieXRlcyk7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZW1fZ3JwMWEoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQlyZXR1cm4gZW11bGF0ZV9wb3AoY3R4dCwgJmMtPmRzdC52YWwsIGMtPmRzdC5ieXRlcyk7CisJcmV0dXJuIGVtdWxhdGVfcG9wKGN0eHQsICZjdHh0LT5kc3QudmFsLCBjdHh0LT5kc3QuYnl0ZXMpOwogfQogCiBzdGF0aWMgaW50IGVtX2dycDIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0Jc3dpdGNoIChjLT5tb2RybV9yZWcpIHsKKwlzd2l0Y2ggKGN0eHQtPm1vZHJtX3JlZykgewogCWNhc2UgMDoJLyogcm9sICovCi0JCWVtdWxhdGVfMm9wX1NyY0IoInJvbCIsIGMtPnNyYywgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNCKCJyb2wiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSAxOgkvKiByb3IgKi8KLQkJZW11bGF0ZV8yb3BfU3JjQigicm9yIiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY0IoInJvciIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIDI6CS8qIHJjbCAqLwotCQllbXVsYXRlXzJvcF9TcmNCKCJyY2wiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8yb3BfU3JjQigicmNsIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgMzoJLyogcmNyICovCi0JCWVtdWxhdGVfMm9wX1NyY0IoInJjciIsIGMtPnNyYywgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNCKCJyY3IiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSA0OgkvKiBzYWwvc2hsICovCiAJY2FzZSA2OgkvKiBzYWwvc2hsICovCi0JCWVtdWxhdGVfMm9wX1NyY0IoInNhbCIsIGMtPnNyYywgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNCKCJzYWwiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSA1OgkvKiBzaHIgKi8KLQkJZW11bGF0ZV8yb3BfU3JjQigic2hyIiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY0IoInNociIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIDc6CS8qIHNhciAqLwotCQllbXVsYXRlXzJvcF9TcmNCKCJzYXIiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8yb3BfU3JjQigic2FyIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKQEAgLTE3NDMsMzMgKzE3MDEsMzIgQEAKIAogc3RhdGljIGludCBlbV9ncnAzKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCXVuc2lnbmVkIGxvbmcgKnJheCA9ICZjLT5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCXVuc2lnbmVkIGxvbmcgKnJkeCA9ICZjLT5yZWdzW1ZDUFVfUkVHU19SRFhdOworCXVuc2lnbmVkIGxvbmcgKnJheCA9ICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQVhdOworCXVuc2lnbmVkIGxvbmcgKnJkeCA9ICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SRFhdOwogCXU4IGRlID0gMDsKIAotCXN3aXRjaCAoYy0+bW9kcm1fcmVnKSB7CisJc3dpdGNoIChjdHh0LT5tb2RybV9yZWcpIHsKIAljYXNlIDAgLi4uIDE6CS8qIHRlc3QgKi8KLQkJZW11bGF0ZV8yb3BfU3JjVigidGVzdCIsIGMtPnNyYywgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNWKCJ0ZXN0IiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgMjoJLyogbm90ICovCi0JCWMtPmRzdC52YWwgPSB+Yy0+ZHN0LnZhbDsKKwkJY3R4dC0+ZHN0LnZhbCA9IH5jdHh0LT5kc3QudmFsOwogCQlicmVhazsKIAljYXNlIDM6CS8qIG5lZyAqLwotCQllbXVsYXRlXzFvcCgibmVnIiwgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzFvcCgibmVnIiwgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIDQ6IC8qIG11bCAqLwotCQllbXVsYXRlXzFvcF9yYXhfcmR4KCJtdWwiLCBjLT5zcmMsICpyYXgsICpyZHgsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMW9wX3JheF9yZHgoIm11bCIsIGN0eHQtPnNyYywgKnJheCwgKnJkeCwgY3R4dC0+ZWZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSA1OiAvKiBpbXVsICovCi0JCWVtdWxhdGVfMW9wX3JheF9yZHgoImltdWwiLCBjLT5zcmMsICpyYXgsICpyZHgsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMW9wX3JheF9yZHgoImltdWwiLCBjdHh0LT5zcmMsICpyYXgsICpyZHgsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgNjogLyogZGl2ICovCi0JCWVtdWxhdGVfMW9wX3JheF9yZHhfZXgoImRpdiIsIGMtPnNyYywgKnJheCwgKnJkeCwKKwkJZW11bGF0ZV8xb3BfcmF4X3JkeF9leCgiZGl2IiwgY3R4dC0+c3JjLCAqcmF4LCAqcmR4LAogCQkJCSAgICAgICBjdHh0LT5lZmxhZ3MsIGRlKTsKIAkJYnJlYWs7CiAJY2FzZSA3OiAvKiBpZGl2ICovCi0JCWVtdWxhdGVfMW9wX3JheF9yZHhfZXgoImlkaXYiLCBjLT5zcmMsICpyYXgsICpyZHgsCisJCWVtdWxhdGVfMW9wX3JheF9yZHhfZXgoImlkaXYiLCBjdHh0LT5zcmMsICpyYXgsICpyZHgsCiAJCQkJICAgICAgIGN0eHQtPmVmbGFncywgZGUpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTc4MiwyNiArMTczOSwyNSBAQAogCiBzdGF0aWMgaW50IGVtX2dycDQ1KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCWludCByYyA9IFg4NkVNVUxfQ09OVElOVUU7CiAKLQlzd2l0Y2ggKGMtPm1vZHJtX3JlZykgeworCXN3aXRjaCAoY3R4dC0+bW9kcm1fcmVnKSB7CiAJY2FzZSAwOgkvKiBpbmMgKi8KLQkJZW11bGF0ZV8xb3AoImluYyIsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8xb3AoImluYyIsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSAxOgkvKiBkZWMgKi8KLQkJZW11bGF0ZV8xb3AoImRlYyIsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8xb3AoImRlYyIsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSAyOiAvKiBjYWxsIG5lYXIgYWJzICovIHsKIAkJbG9uZyBpbnQgb2xkX2VpcDsKLQkJb2xkX2VpcCA9IGMtPmVpcDsKLQkJYy0+ZWlwID0gYy0+c3JjLnZhbDsKLQkJYy0+c3JjLnZhbCA9IG9sZF9laXA7CisJCW9sZF9laXAgPSBjdHh0LT5fZWlwOworCQljdHh0LT5fZWlwID0gY3R4dC0+c3JjLnZhbDsKKwkJY3R4dC0+c3JjLnZhbCA9IG9sZF9laXA7CiAJCXJjID0gZW1fcHVzaChjdHh0KTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgNDogLyogam1wIGFicyAqLwotCQljLT5laXAgPSBjLT5zcmMudmFsOworCQljdHh0LT5fZWlwID0gY3R4dC0+c3JjLnZhbDsKIAkJYnJlYWs7CiAJY2FzZSA1OiAvKiBqbXAgZmFyICovCiAJCXJjID0gZW1fam1wX2ZhcihjdHh0KTsKQEAgLTE4MTUsNjggKzE3NzEsNzAgQEAKIAogc3RhdGljIGludCBlbV9ncnA5KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCXU2NCBvbGQgPSBjLT5kc3Qub3JpZ192YWw2NDsKKwl1NjQgb2xkID0gY3R4dC0+ZHN0Lm9yaWdfdmFsNjQ7CiAKLQlpZiAoKCh1MzIpIChvbGQgPj4gMCkgIT0gKHUzMikgYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXSkgfHwKLQkgICAgKCh1MzIpIChvbGQgPj4gMzIpICE9ICh1MzIpIGMtPnJlZ3NbVkNQVV9SRUdTX1JEWF0pKSB7Ci0JCWMtPnJlZ3NbVkNQVV9SRUdTX1JBWF0gPSAodTMyKSAob2xkID4+IDApOwotCQljLT5yZWdzW1ZDUFVfUkVHU19SRFhdID0gKHUzMikgKG9sZCA+PiAzMik7CisJaWYgKCgodTMyKSAob2xkID4+IDApICE9ICh1MzIpIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JBWF0pIHx8CisJICAgICgodTMyKSAob2xkID4+IDMyKSAhPSAodTMyKSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SRFhdKSkgeworCQljdHh0LT5yZWdzW1ZDUFVfUkVHU19SQVhdID0gKHUzMikgKG9sZCA+PiAwKTsKKwkJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRYXSA9ICh1MzIpIChvbGQgPj4gMzIpOwogCQljdHh0LT5lZmxhZ3MgJj0gfkVGTEdfWkY7CiAJfSBlbHNlIHsKLQkJYy0+ZHN0LnZhbDY0ID0gKCh1NjQpYy0+cmVnc1tWQ1BVX1JFR1NfUkNYXSA8PCAzMikgfAotCQkJKHUzMikgYy0+cmVnc1tWQ1BVX1JFR1NfUkJYXTsKKwkJY3R4dC0+ZHN0LnZhbDY0ID0gKCh1NjQpY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkNYXSA8PCAzMikgfAorCQkJKHUzMikgY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkJYXTsKIAogCQljdHh0LT5lZmxhZ3MgfD0gRUZMR19aRjsKIAl9CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyBpbnQgZW11bGF0ZV9yZXRfZmFyKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzKQorc3RhdGljIGludCBlbV9yZXQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CisJY3R4dC0+ZHN0LnR5cGUgPSBPUF9SRUc7CisJY3R4dC0+ZHN0LmFkZHIucmVnID0gJmN0eHQtPl9laXA7CisJY3R4dC0+ZHN0LmJ5dGVzID0gY3R4dC0+b3BfYnl0ZXM7CisJcmV0dXJuIGVtX3BvcChjdHh0KTsKK30KKworc3RhdGljIGludCBlbV9yZXRfZmFyKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQorewogCWludCByYzsKIAl1bnNpZ25lZCBsb25nIGNzOwogCi0JcmMgPSBlbXVsYXRlX3BvcChjdHh0LCAmYy0+ZWlwLCBjLT5vcF9ieXRlcyk7CisJcmMgPSBlbXVsYXRlX3BvcChjdHh0LCAmY3R4dC0+X2VpcCwgY3R4dC0+b3BfYnl0ZXMpOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7Ci0JaWYgKGMtPm9wX2J5dGVzID09IDQpCi0JCWMtPmVpcCA9ICh1MzIpYy0+ZWlwOwotCXJjID0gZW11bGF0ZV9wb3AoY3R4dCwgJmNzLCBjLT5vcF9ieXRlcyk7CisJaWYgKGN0eHQtPm9wX2J5dGVzID09IDQpCisJCWN0eHQtPl9laXAgPSAodTMyKWN0eHQtPl9laXA7CisJcmMgPSBlbXVsYXRlX3BvcChjdHh0LCAmY3MsIGN0eHQtPm9wX2J5dGVzKTsKIAlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJjOwotCXJjID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCAodTE2KWNzLCBWQ1BVX1NSRUdfQ1MpOworCXJjID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgKHUxNiljcywgVkNQVV9TUkVHX0NTKTsKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgZW11bGF0ZV9sb2FkX3NlZ21lbnQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCQkgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsIGludCBzZWcpCitzdGF0aWMgaW50IGVtdWxhdGVfbG9hZF9zZWdtZW50KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgc2VnKQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCXVuc2lnbmVkIHNob3J0IHNlbDsKIAlpbnQgcmM7CiAKLQltZW1jcHkoJnNlbCwgYy0+c3JjLnZhbHB0ciArIGMtPm9wX2J5dGVzLCAyKTsKKwltZW1jcHkoJnNlbCwgY3R4dC0+c3JjLnZhbHB0ciArIGN0eHQtPm9wX2J5dGVzLCAyKTsKIAotCXJjID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCBzZWwsIHNlZyk7CisJcmMgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBzZWwsIHNlZyk7CiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByYzsKIAotCWMtPmRzdC52YWwgPSBjLT5zcmMudmFsOworCWN0eHQtPmRzdC52YWwgPSBjdHh0LT5zcmMudmFsOwogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogc2V0dXBfc3lzY2FsbHNfc2VnbWVudHMoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCQlzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsIHN0cnVjdCBkZXNjX3N0cnVjdCAqY3MsCi0JCQlzdHJ1Y3QgZGVzY19zdHJ1Y3QgKnNzKQorCQkJc3RydWN0IGRlc2Nfc3RydWN0ICpjcywgc3RydWN0IGRlc2Nfc3RydWN0ICpzcykKIHsKIAl1MTYgc2VsZWN0b3I7CiAKIAltZW1zZXQoY3MsIDAsIHNpemVvZihzdHJ1Y3QgZGVzY19zdHJ1Y3QpKTsKLQlvcHMtPmdldF9zZWdtZW50KGN0eHQsICZzZWxlY3RvciwgY3MsIE5VTEwsIFZDUFVfU1JFR19DUyk7CisJY3R4dC0+b3BzLT5nZXRfc2VnbWVudChjdHh0LCAmc2VsZWN0b3IsIGNzLCBOVUxMLCBWQ1BVX1NSRUdfQ1MpOwogCW1lbXNldChzcywgMCwgc2l6ZW9mKHN0cnVjdCBkZXNjX3N0cnVjdCkpOwogCiAJY3MtPmwgPSAwOwkJLyogd2lsbCBiZSBhZGp1c3RlZCBsYXRlciAqLwpAQCAtMTg5OSwxMCArMTg1Nyw5IEBACiAJc3MtPnAgPSAxOwogfQogCi1zdGF0aWMgaW50Ci1lbXVsYXRlX3N5c2NhbGwoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcykKK3N0YXRpYyBpbnQgZW1fc3lzY2FsbChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKKwlzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMgPSBjdHh0LT5vcHM7CiAJc3RydWN0IGRlc2Nfc3RydWN0IGNzLCBzczsKIAl1NjQgbXNyX2RhdGE7CiAJdTE2IGNzX3NlbCwgc3Nfc2VsOwpAQCAtMTkxNCw3ICsxODcxLDcgQEAKIAkJcmV0dXJuIGVtdWxhdGVfdWQoY3R4dCk7CiAKIAlvcHMtPmdldF9tc3IoY3R4dCwgTVNSX0VGRVIsICZlZmVyKTsKLQlzZXR1cF9zeXNjYWxsc19zZWdtZW50cyhjdHh0LCBvcHMsICZjcywgJnNzKTsKKwlzZXR1cF9zeXNjYWxsc19zZWdtZW50cyhjdHh0LCAmY3MsICZzcyk7CiAKIAlvcHMtPmdldF9tc3IoY3R4dCwgTVNSX1NUQVIsICZtc3JfZGF0YSk7CiAJbXNyX2RhdGEgPj49IDMyOwpAQCAtMTkyOCwxNSArMTg4NSwxNSBAQAogCW9wcy0+c2V0X3NlZ21lbnQoY3R4dCwgY3Nfc2VsLCAmY3MsIDAsIFZDUFVfU1JFR19DUyk7CiAJb3BzLT5zZXRfc2VnbWVudChjdHh0LCBzc19zZWwsICZzcywgMCwgVkNQVV9TUkVHX1NTKTsKIAotCWMtPnJlZ3NbVkNQVV9SRUdTX1JDWF0gPSBjLT5laXA7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkNYXSA9IGN0eHQtPl9laXA7CiAJaWYgKGVmZXIgJiBFRkVSX0xNQSkgewogI2lmZGVmIENPTkZJR19YODZfNjQKLQkJYy0+cmVnc1tWQ1BVX1JFR1NfUjExXSA9IGN0eHQtPmVmbGFncyAmIH5FRkxHX1JGOworCQljdHh0LT5yZWdzW1ZDUFVfUkVHU19SMTFdID0gY3R4dC0+ZWZsYWdzICYgfkVGTEdfUkY7CiAKIAkJb3BzLT5nZXRfbXNyKGN0eHQsCiAJCQkgICAgIGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCA/CiAJCQkgICAgIE1TUl9MU1RBUiA6IE1TUl9DU1RBUiwgJm1zcl9kYXRhKTsKLQkJYy0+ZWlwID0gbXNyX2RhdGE7CisJCWN0eHQtPl9laXAgPSBtc3JfZGF0YTsKIAogCQlvcHMtPmdldF9tc3IoY3R4dCwgTVNSX1NZU0NBTExfTUFTSywgJm1zcl9kYXRhKTsKIAkJY3R4dC0+ZWZsYWdzICY9IH4obXNyX2RhdGEgfCBFRkxHX1JGKTsKQEAgLTE5NDQsNyArMTkwMSw3IEBACiAJfSBlbHNlIHsKIAkJLyogbGVnYWN5IG1vZGUgKi8KIAkJb3BzLT5nZXRfbXNyKGN0eHQsIE1TUl9TVEFSLCAmbXNyX2RhdGEpOwotCQljLT5laXAgPSAodTMyKW1zcl9kYXRhOworCQljdHh0LT5fZWlwID0gKHUzMiltc3JfZGF0YTsKIAogCQljdHh0LT5lZmxhZ3MgJj0gfihFRkxHX1ZNIHwgRUZMR19JRiB8IEVGTEdfUkYpOwogCX0KQEAgLTE5NTIsMTYgKzE5MDksMTUgQEAKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAotc3RhdGljIGludAotZW11bGF0ZV9zeXNlbnRlcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzKQorc3RhdGljIGludCBlbV9zeXNlbnRlcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKKwlzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMgPSBjdHh0LT5vcHM7CiAJc3RydWN0IGRlc2Nfc3RydWN0IGNzLCBzczsKIAl1NjQgbXNyX2RhdGE7CiAJdTE2IGNzX3NlbCwgc3Nfc2VsOwogCXU2NCBlZmVyID0gMDsKIAotCWN0eHQtPm9wcy0+Z2V0X21zcihjdHh0LCBNU1JfRUZFUiwgJmVmZXIpOworCW9wcy0+Z2V0X21zcihjdHh0LCBNU1JfRUZFUiwgJmVmZXIpOwogCS8qIGluamVjdCAjR1AgaWYgaW4gcmVhbCBtb2RlICovCiAJaWYgKGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1JFQUwpCiAJCXJldHVybiBlbXVsYXRlX2dwKGN0eHQsIDApOwpAQCAtMTk3Miw3ICsxOTI4LDcgQEAKIAlpZiAoY3R4dC0+bW9kZSA9PSBYODZFTVVMX01PREVfUFJPVDY0KQogCQlyZXR1cm4gZW11bGF0ZV91ZChjdHh0KTsKIAotCXNldHVwX3N5c2NhbGxzX3NlZ21lbnRzKGN0eHQsIG9wcywgJmNzLCAmc3MpOworCXNldHVwX3N5c2NhbGxzX3NlZ21lbnRzKGN0eHQsICZjcywgJnNzKTsKIAogCW9wcy0+Z2V0X21zcihjdHh0LCBNU1JfSUEzMl9TWVNFTlRFUl9DUywgJm1zcl9kYXRhKTsKIAlzd2l0Y2ggKGN0eHQtPm1vZGUpIHsKQEAgLTIwMDAsMzEgKzE5NTYsMzAgQEAKIAlvcHMtPnNldF9zZWdtZW50KGN0eHQsIHNzX3NlbCwgJnNzLCAwLCBWQ1BVX1NSRUdfU1MpOwogCiAJb3BzLT5nZXRfbXNyKGN0eHQsIE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwgJm1zcl9kYXRhKTsKLQljLT5laXAgPSBtc3JfZGF0YTsKKwljdHh0LT5fZWlwID0gbXNyX2RhdGE7CiAKIAlvcHMtPmdldF9tc3IoY3R4dCwgTVNSX0lBMzJfU1lTRU5URVJfRVNQLCAmbXNyX2RhdGEpOwotCWMtPnJlZ3NbVkNQVV9SRUdTX1JTUF0gPSBtc3JfZGF0YTsKKwljdHh0LT5yZWdzW1ZDUFVfUkVHU19SU1BdID0gbXNyX2RhdGE7CiAKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAotc3RhdGljIGludAotZW11bGF0ZV9zeXNleGl0KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMpCitzdGF0aWMgaW50IGVtX3N5c2V4aXQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CisJc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzID0gY3R4dC0+b3BzOwogCXN0cnVjdCBkZXNjX3N0cnVjdCBjcywgc3M7CiAJdTY0IG1zcl9kYXRhOwogCWludCB1c2VybW9kZTsKLQl1MTYgY3Nfc2VsLCBzc19zZWw7CisJdTE2IGNzX3NlbCA9IDAsIHNzX3NlbCA9IDA7CiAKIAkvKiBpbmplY3QgI0dQIGlmIGluIHJlYWwgbW9kZSBvciBWaXJ0dWFsIDgwODYgbW9kZSAqLwogCWlmIChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9SRUFMIHx8CiAJICAgIGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1ZNODYpCiAJCXJldHVybiBlbXVsYXRlX2dwKGN0eHQsIDApOwogCi0Jc2V0dXBfc3lzY2FsbHNfc2VnbWVudHMoY3R4dCwgb3BzLCAmY3MsICZzcyk7CisJc2V0dXBfc3lzY2FsbHNfc2VnbWVudHMoY3R4dCwgJmNzLCAmc3MpOwogCi0JaWYgKChjLT5yZXhfcHJlZml4ICYgMHg4KSAhPSAweDApCisJaWYgKChjdHh0LT5yZXhfcHJlZml4ICYgMHg4KSAhPSAweDApCiAJCXVzZXJtb2RlID0gWDg2RU1VTF9NT0RFX1BST1Q2NDsKIAllbHNlCiAJCXVzZXJtb2RlID0gWDg2RU1VTF9NT0RFX1BST1QzMjsKQEAgLTIwNTQsMTQgKzIwMDksMTMgQEAKIAlvcHMtPnNldF9zZWdtZW50KGN0eHQsIGNzX3NlbCwgJmNzLCAwLCBWQ1BVX1NSRUdfQ1MpOwogCW9wcy0+c2V0X3NlZ21lbnQoY3R4dCwgc3Nfc2VsLCAmc3MsIDAsIFZDUFVfU1JFR19TUyk7CiAKLQljLT5laXAgPSBjLT5yZWdzW1ZDUFVfUkVHU19SRFhdOwotCWMtPnJlZ3NbVkNQVV9SRUdTX1JTUF0gPSBjLT5yZWdzW1ZDUFVfUkVHU19SQ1hdOworCWN0eHQtPl9laXAgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SRFhdOworCWN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JTUF0gPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQ1hdOwogCiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyBib29sIGVtdWxhdG9yX2JhZF9pb3BsKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzKQorc3RhdGljIGJvb2wgZW11bGF0b3JfYmFkX2lvcGwoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7CiAJaW50IGlvcGw7CiAJaWYgKGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1JFQUwpCkBAIC0yMDY5LDEzICsyMDIzLDEzIEBACiAJaWYgKGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1ZNODYpCiAJCXJldHVybiB0cnVlOwogCWlvcGwgPSAoY3R4dC0+ZWZsYWdzICYgWDg2X0VGTEFHU19JT1BMKSA+PiBJT1BMX1NISUZUOwotCXJldHVybiBvcHMtPmNwbChjdHh0KSA+IGlvcGw7CisJcmV0dXJuIGN0eHQtPm9wcy0+Y3BsKGN0eHQpID4gaW9wbDsKIH0KIAogc3RhdGljIGJvb2wgZW11bGF0b3JfaW9fcG9ydF9hY2Nlc3NfYWxsb3dlZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCQkJICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywKIAkJCQkJICAgIHUxNiBwb3J0LCB1MTYgbGVuKQogeworCXN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcyA9IGN0eHQtPm9wczsKIAlzdHJ1Y3QgZGVzY19zdHJ1Y3QgdHJfc2VnOwogCXUzMiBiYXNlMzsKIAlpbnQgcjsKQEAgLTIxMDYsMTQgKzIwNjAsMTMgQEAKIH0KIAogc3RhdGljIGJvb2wgZW11bGF0b3JfaW9fcGVybWl0ZWQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCQkJIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywKIAkJCQkgdTE2IHBvcnQsIHUxNiBsZW4pCiB7CiAJaWYgKGN0eHQtPnBlcm1fb2spCiAJCXJldHVybiB0cnVlOwogCi0JaWYgKGVtdWxhdG9yX2JhZF9pb3BsKGN0eHQsIG9wcykpCi0JCWlmICghZW11bGF0b3JfaW9fcG9ydF9hY2Nlc3NfYWxsb3dlZChjdHh0LCBvcHMsIHBvcnQsIGxlbikpCisJaWYgKGVtdWxhdG9yX2JhZF9pb3BsKGN0eHQpKQorCQlpZiAoIWVtdWxhdG9yX2lvX3BvcnRfYWNjZXNzX2FsbG93ZWQoY3R4dCwgcG9ydCwgbGVuKSkKIAkJCXJldHVybiBmYWxzZTsKIAogCWN0eHQtPnBlcm1fb2sgPSB0cnVlOwpAQCAtMjEyMiwyMSArMjA3NSwxOCBAQAogfQogCiBzdGF0aWMgdm9pZCBzYXZlX3N0YXRlX3RvX3RzczE2KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJCXN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywKIAkJCQlzdHJ1Y3QgdHNzX3NlZ21lbnRfMTYgKnRzcykKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKLQotCXRzcy0+aXAgPSBjLT5laXA7CisJdHNzLT5pcCA9IGN0eHQtPl9laXA7CiAJdHNzLT5mbGFnID0gY3R4dC0+ZWZsYWdzOwotCXRzcy0+YXggPSBjLT5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCXRzcy0+Y3ggPSBjLT5yZWdzW1ZDUFVfUkVHU19SQ1hdOwotCXRzcy0+ZHggPSBjLT5yZWdzW1ZDUFVfUkVHU19SRFhdOwotCXRzcy0+YnggPSBjLT5yZWdzW1ZDUFVfUkVHU19SQlhdOwotCXRzcy0+c3AgPSBjLT5yZWdzW1ZDUFVfUkVHU19SU1BdOwotCXRzcy0+YnAgPSBjLT5yZWdzW1ZDUFVfUkVHU19SQlBdOwotCXRzcy0+c2kgPSBjLT5yZWdzW1ZDUFVfUkVHU19SU0ldOwotCXRzcy0+ZGkgPSBjLT5yZWdzW1ZDUFVfUkVHU19SREldOworCXRzcy0+YXggPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQVhdOworCXRzcy0+Y3ggPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQ1hdOworCXRzcy0+ZHggPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SRFhdOworCXRzcy0+YnggPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQlhdOworCXRzcy0+c3AgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SU1BdOworCXRzcy0+YnAgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQlBdOworCXRzcy0+c2kgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SU0ldOworCXRzcy0+ZGkgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SREldOwogCiAJdHNzLT5lcyA9IGdldF9zZWdtZW50X3NlbGVjdG9yKGN0eHQsIFZDUFVfU1JFR19FUyk7CiAJdHNzLT5jcyA9IGdldF9zZWdtZW50X3NlbGVjdG9yKGN0eHQsIFZDUFVfU1JFR19DUyk7CkBAIC0yMTQ2LDIyICsyMDk2LDIwIEBACiB9CiAKIHN0YXRpYyBpbnQgbG9hZF9zdGF0ZV9mcm9tX3RzczE2KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJCSBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsCiAJCQkJIHN0cnVjdCB0c3Nfc2VnbWVudF8xNiAqdHNzKQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCWludCByZXQ7CiAKLQljLT5laXAgPSB0c3MtPmlwOworCWN0eHQtPl9laXAgPSB0c3MtPmlwOwogCWN0eHQtPmVmbGFncyA9IHRzcy0+ZmxhZyB8IDI7Ci0JYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXSA9IHRzcy0+YXg7Ci0JYy0+cmVnc1tWQ1BVX1JFR1NfUkNYXSA9IHRzcy0+Y3g7Ci0JYy0+cmVnc1tWQ1BVX1JFR1NfUkRYXSA9IHRzcy0+ZHg7Ci0JYy0+cmVnc1tWQ1BVX1JFR1NfUkJYXSA9IHRzcy0+Yng7Ci0JYy0+cmVnc1tWQ1BVX1JFR1NfUlNQXSA9IHRzcy0+c3A7Ci0JYy0+cmVnc1tWQ1BVX1JFR1NfUkJQXSA9IHRzcy0+YnA7Ci0JYy0+cmVnc1tWQ1BVX1JFR1NfUlNJXSA9IHRzcy0+c2k7Ci0JYy0+cmVnc1tWQ1BVX1JFR1NfUkRJXSA9IHRzcy0+ZGk7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkFYXSA9IHRzcy0+YXg7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkNYXSA9IHRzcy0+Y3g7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRYXSA9IHRzcy0+ZHg7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkJYXSA9IHRzcy0+Yng7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUlNQXSA9IHRzcy0+c3A7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkJQXSA9IHRzcy0+YnA7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUlNJXSA9IHRzcy0+c2k7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRJXSA9IHRzcy0+ZGk7CiAKIAkvKgogCSAqIFNETSBzYXlzIHRoYXQgc2VnbWVudCBzZWxlY3RvcnMgYXJlIGxvYWRlZCBiZWZvcmUgc2VnbWVudApAQCAtMjE3NywxOSArMjEyNSwxOSBAQAogCSAqIE5vdyBsb2FkIHNlZ21lbnQgZGVzY3JpcHRvcnMuIElmIGZhdWx0IGhhcHBlbmVzIGF0IHRoaXMgc3RhZ2UKIAkgKiBpdCBpcyBoYW5kbGVkIGluIGEgY29udGV4dCBvZiBuZXcgdGFzawogCSAqLwotCXJldCA9IGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIG9wcywgdHNzLT5sZHQsIFZDUFVfU1JFR19MRFRSKTsKKwlyZXQgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCB0c3MtPmxkdCwgVkNQVV9TUkVHX0xEVFIpOwogCWlmIChyZXQgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJldDsKLQlyZXQgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBvcHMsIHRzcy0+ZXMsIFZDUFVfU1JFR19FUyk7CisJcmV0ID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgdHNzLT5lcywgVkNQVV9TUkVHX0VTKTsKIAlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCB0c3MtPmNzLCBWQ1BVX1NSRUdfQ1MpOworCXJldCA9IGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIHRzcy0+Y3MsIFZDUFVfU1JFR19DUyk7CiAJaWYgKHJldCAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmV0OwotCXJldCA9IGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIG9wcywgdHNzLT5zcywgVkNQVV9TUkVHX1NTKTsKKwlyZXQgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCB0c3MtPnNzLCBWQ1BVX1NSRUdfU1MpOwogCWlmIChyZXQgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJldDsKLQlyZXQgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBvcHMsIHRzcy0+ZHMsIFZDUFVfU1JFR19EUyk7CisJcmV0ID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgdHNzLT5kcywgVkNQVV9TUkVHX0RTKTsKIAlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByZXQ7CiAKQEAgLTIxOTcsMTAgKzIxNDUsMTAgQEAKIH0KIAogc3RhdGljIGludCB0YXNrX3N3aXRjaF8xNihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCSAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzLAogCQkJICB1MTYgdHNzX3NlbGVjdG9yLCB1MTYgb2xkX3Rzc19zZWwsCiAJCQkgIHVsb25nIG9sZF90c3NfYmFzZSwgc3RydWN0IGRlc2Nfc3RydWN0ICpuZXdfZGVzYykKIHsKKwlzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMgPSBjdHh0LT5vcHM7CiAJc3RydWN0IHRzc19zZWdtZW50XzE2IHRzc19zZWc7CiAJaW50IHJldDsKIAl1MzIgbmV3X3Rzc19iYXNlID0gZ2V0X2Rlc2NfYmFzZShuZXdfZGVzYyk7CkBAIC0yMjExLDcgKzIxNTksNyBAQAogCQkvKiBGSVhNRTogbmVlZCB0byBwcm92aWRlIHByZWNpc2UgZmF1bHQgYWRkcmVzcyAqLwogCQlyZXR1cm4gcmV0OwogCi0Jc2F2ZV9zdGF0ZV90b190c3MxNihjdHh0LCBvcHMsICZ0c3Nfc2VnKTsKKwlzYXZlX3N0YXRlX3RvX3RzczE2KGN0eHQsICZ0c3Nfc2VnKTsKIAogCXJldCA9IG9wcy0+d3JpdGVfc3RkKGN0eHQsIG9sZF90c3NfYmFzZSwgJnRzc19zZWcsIHNpemVvZiB0c3Nfc2VnLAogCQkJICAgICAmY3R4dC0+ZXhjZXB0aW9uKTsKQEAgLTIyMzcsMjYgKzIxODUsMjMgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0dXJuIGxvYWRfc3RhdGVfZnJvbV90c3MxNihjdHh0LCBvcHMsICZ0c3Nfc2VnKTsKKwlyZXR1cm4gbG9hZF9zdGF0ZV9mcm9tX3RzczE2KGN0eHQsICZ0c3Nfc2VnKTsKIH0KIAogc3RhdGljIHZvaWQgc2F2ZV9zdGF0ZV90b190c3MzMihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCQlzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsCiAJCQkJc3RydWN0IHRzc19zZWdtZW50XzMyICp0c3MpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQl0c3MtPmNyMyA9IG9wcy0+Z2V0X2NyKGN0eHQsIDMpOwotCXRzcy0+ZWlwID0gYy0+ZWlwOworCXRzcy0+Y3IzID0gY3R4dC0+b3BzLT5nZXRfY3IoY3R4dCwgMyk7CisJdHNzLT5laXAgPSBjdHh0LT5fZWlwOwogCXRzcy0+ZWZsYWdzID0gY3R4dC0+ZWZsYWdzOwotCXRzcy0+ZWF4ID0gYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXTsKLQl0c3MtPmVjeCA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JDWF07Ci0JdHNzLT5lZHggPSBjLT5yZWdzW1ZDUFVfUkVHU19SRFhdOwotCXRzcy0+ZWJ4ID0gYy0+cmVnc1tWQ1BVX1JFR1NfUkJYXTsKLQl0c3MtPmVzcCA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JTUF07Ci0JdHNzLT5lYnAgPSBjLT5yZWdzW1ZDUFVfUkVHU19SQlBdOwotCXRzcy0+ZXNpID0gYy0+cmVnc1tWQ1BVX1JFR1NfUlNJXTsKLQl0c3MtPmVkaSA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JESV07CisJdHNzLT5lYXggPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQVhdOworCXRzcy0+ZWN4ID0gY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkNYXTsKKwl0c3MtPmVkeCA9IGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JEWF07CisJdHNzLT5lYnggPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQlhdOworCXRzcy0+ZXNwID0gY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUlNQXTsKKwl0c3MtPmVicCA9IGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JCUF07CisJdHNzLT5lc2kgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SU0ldOworCXRzcy0+ZWRpID0gY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRJXTsKIAogCXRzcy0+ZXMgPSBnZXRfc2VnbWVudF9zZWxlY3RvcihjdHh0LCBWQ1BVX1NSRUdfRVMpOwogCXRzcy0+Y3MgPSBnZXRfc2VnbWVudF9zZWxlY3RvcihjdHh0LCBWQ1BVX1NSRUdfQ1MpOwpAQCAtMjI2OCwyNCArMjIxMywyMiBAQAogfQogCiBzdGF0aWMgaW50IGxvYWRfc3RhdGVfZnJvbV90c3MzMihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCQkgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzLAogCQkJCSBzdHJ1Y3QgdHNzX3NlZ21lbnRfMzIgKnRzcykKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAlpbnQgcmV0OwogCi0JaWYgKG9wcy0+c2V0X2NyKGN0eHQsIDMsIHRzcy0+Y3IzKSkKKwlpZiAoY3R4dC0+b3BzLT5zZXRfY3IoY3R4dCwgMywgdHNzLT5jcjMpKQogCQlyZXR1cm4gZW11bGF0ZV9ncChjdHh0LCAwKTsKLQljLT5laXAgPSB0c3MtPmVpcDsKKwljdHh0LT5fZWlwID0gdHNzLT5laXA7CiAJY3R4dC0+ZWZsYWdzID0gdHNzLT5lZmxhZ3MgfCAyOwotCWMtPnJlZ3NbVkNQVV9SRUdTX1JBWF0gPSB0c3MtPmVheDsKLQljLT5yZWdzW1ZDUFVfUkVHU19SQ1hdID0gdHNzLT5lY3g7Ci0JYy0+cmVnc1tWQ1BVX1JFR1NfUkRYXSA9IHRzcy0+ZWR4OwotCWMtPnJlZ3NbVkNQVV9SRUdTX1JCWF0gPSB0c3MtPmVieDsKLQljLT5yZWdzW1ZDUFVfUkVHU19SU1BdID0gdHNzLT5lc3A7Ci0JYy0+cmVnc1tWQ1BVX1JFR1NfUkJQXSA9IHRzcy0+ZWJwOwotCWMtPnJlZ3NbVkNQVV9SRUdTX1JTSV0gPSB0c3MtPmVzaTsKLQljLT5yZWdzW1ZDUFVfUkVHU19SREldID0gdHNzLT5lZGk7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkFYXSA9IHRzcy0+ZWF4OworCWN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JDWF0gPSB0c3MtPmVjeDsKKwljdHh0LT5yZWdzW1ZDUFVfUkVHU19SRFhdID0gdHNzLT5lZHg7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkJYXSA9IHRzcy0+ZWJ4OworCWN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JTUF0gPSB0c3MtPmVzcDsKKwljdHh0LT5yZWdzW1ZDUFVfUkVHU19SQlBdID0gdHNzLT5lYnA7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUlNJXSA9IHRzcy0+ZXNpOworCWN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JESV0gPSB0c3MtPmVkaTsKIAogCS8qCiAJICogU0RNIHNheXMgdGhhdCBzZWdtZW50IHNlbGVjdG9ycyBhcmUgbG9hZGVkIGJlZm9yZSBzZWdtZW50CkBAIC0yMzAzLDI1ICsyMjQ2LDI1IEBACiAJICogTm93IGxvYWQgc2VnbWVudCBkZXNjcmlwdG9ycy4gSWYgZmF1bHQgaGFwcGVuZXMgYXQgdGhpcyBzdGFnZQogCSAqIGl0IGlzIGhhbmRsZWQgaW4gYSBjb250ZXh0IG9mIG5ldyB0YXNrCiAJICovCi0JcmV0ID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCB0c3MtPmxkdF9zZWxlY3RvciwgVkNQVV9TUkVHX0xEVFIpOworCXJldCA9IGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIHRzcy0+bGR0X3NlbGVjdG9yLCBWQ1BVX1NSRUdfTERUUik7CiAJaWYgKHJldCAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmV0OwotCXJldCA9IGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIG9wcywgdHNzLT5lcywgVkNQVV9TUkVHX0VTKTsKKwlyZXQgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCB0c3MtPmVzLCBWQ1BVX1NSRUdfRVMpOwogCWlmIChyZXQgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJldDsKLQlyZXQgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBvcHMsIHRzcy0+Y3MsIFZDUFVfU1JFR19DUyk7CisJcmV0ID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgdHNzLT5jcywgVkNQVV9TUkVHX0NTKTsKIAlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCB0c3MtPnNzLCBWQ1BVX1NSRUdfU1MpOworCXJldCA9IGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIHRzcy0+c3MsIFZDUFVfU1JFR19TUyk7CiAJaWYgKHJldCAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmV0OwotCXJldCA9IGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIG9wcywgdHNzLT5kcywgVkNQVV9TUkVHX0RTKTsKKwlyZXQgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCB0c3MtPmRzLCBWQ1BVX1NSRUdfRFMpOwogCWlmIChyZXQgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJldDsKLQlyZXQgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBvcHMsIHRzcy0+ZnMsIFZDUFVfU1JFR19GUyk7CisJcmV0ID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgdHNzLT5mcywgVkNQVV9TUkVHX0ZTKTsKIAlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCB0c3MtPmdzLCBWQ1BVX1NSRUdfR1MpOworCXJldCA9IGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIHRzcy0+Z3MsIFZDUFVfU1JFR19HUyk7CiAJaWYgKHJldCAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmV0OwogCkBAIC0yMzI5LDEwICsyMjcyLDEwIEBACiB9CiAKIHN0YXRpYyBpbnQgdGFza19zd2l0Y2hfMzIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCQkgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywKIAkJCSAgdTE2IHRzc19zZWxlY3RvciwgdTE2IG9sZF90c3Nfc2VsLAogCQkJICB1bG9uZyBvbGRfdHNzX2Jhc2UsIHN0cnVjdCBkZXNjX3N0cnVjdCAqbmV3X2Rlc2MpCiB7CisJc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzID0gY3R4dC0+b3BzOwogCXN0cnVjdCB0c3Nfc2VnbWVudF8zMiB0c3Nfc2VnOwogCWludCByZXQ7CiAJdTMyIG5ld190c3NfYmFzZSA9IGdldF9kZXNjX2Jhc2UobmV3X2Rlc2MpOwpAQCAtMjM0Myw3ICsyMjg2LDcgQEAKIAkJLyogRklYTUU6IG5lZWQgdG8gcHJvdmlkZSBwcmVjaXNlIGZhdWx0IGFkZHJlc3MgKi8KIAkJcmV0dXJuIHJldDsKIAotCXNhdmVfc3RhdGVfdG9fdHNzMzIoY3R4dCwgb3BzLCAmdHNzX3NlZyk7CisJc2F2ZV9zdGF0ZV90b190c3MzMihjdHh0LCAmdHNzX3NlZyk7CiAKIAlyZXQgPSBvcHMtPndyaXRlX3N0ZChjdHh0LCBvbGRfdHNzX2Jhc2UsICZ0c3Nfc2VnLCBzaXplb2YgdHNzX3NlZywKIAkJCSAgICAgJmN0eHQtPmV4Y2VwdGlvbik7CkBAIC0yMzY5LDE0ICsyMzEyLDE0IEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldHVybiBsb2FkX3N0YXRlX2Zyb21fdHNzMzIoY3R4dCwgb3BzLCAmdHNzX3NlZyk7CisJcmV0dXJuIGxvYWRfc3RhdGVfZnJvbV90c3MzMihjdHh0LCAmdHNzX3NlZyk7CiB9CiAKIHN0YXRpYyBpbnQgZW11bGF0b3JfZG9fdGFza19zd2l0Y2goc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCQkJICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzLAogCQkJCSAgIHUxNiB0c3Nfc2VsZWN0b3IsIGludCByZWFzb24sCiAJCQkJICAgYm9vbCBoYXNfZXJyb3JfY29kZSwgdTMyIGVycm9yX2NvZGUpCiB7CisJc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzID0gY3R4dC0+b3BzOwogCXN0cnVjdCBkZXNjX3N0cnVjdCBjdXJyX3Rzc19kZXNjLCBuZXh0X3Rzc19kZXNjOwogCWludCByZXQ7CiAJdTE2IG9sZF90c3Nfc2VsID0gZ2V0X3NlZ21lbnRfc2VsZWN0b3IoY3R4dCwgVkNQVV9TUkVHX1RSKTsKQEAgLTIzODYsMTAgKzIzMjksMTAgQEAKIAogCS8qIEZJWE1FOiBvbGRfdHNzX2Jhc2UgPT0gfjAgPyAqLwogCi0JcmV0ID0gcmVhZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCB0c3Nfc2VsZWN0b3IsICZuZXh0X3Rzc19kZXNjKTsKKwlyZXQgPSByZWFkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCB0c3Nfc2VsZWN0b3IsICZuZXh0X3Rzc19kZXNjKTsKIAlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gcmVhZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCBvbGRfdHNzX3NlbCwgJmN1cnJfdHNzX2Rlc2MpOworCXJldCA9IHJlYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIG9sZF90c3Nfc2VsLCAmY3Vycl90c3NfZGVzYyk7CiAJaWYgKHJldCAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmV0OwogCkBAIC0yNDExLDggKzIzNTQsNyBAQAogCiAJaWYgKHJlYXNvbiA9PSBUQVNLX1NXSVRDSF9JUkVUIHx8IHJlYXNvbiA9PSBUQVNLX1NXSVRDSF9KTVApIHsKIAkJY3Vycl90c3NfZGVzYy50eXBlICY9IH4oMSA8PCAxKTsgLyogY2xlYXIgYnVzeSBmbGFnICovCi0JCXdyaXRlX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBvcHMsIG9sZF90c3Nfc2VsLAotCQkJCQkgJmN1cnJfdHNzX2Rlc2MpOworCQl3cml0ZV9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb2xkX3Rzc19zZWwsICZjdXJyX3Rzc19kZXNjKTsKIAl9CiAKIAlpZiAocmVhc29uID09IFRBU0tfU1dJVENIX0lSRVQpCkBAIC0yNDI0LDEwICsyMzY2LDEwIEBACiAJCW9sZF90c3Nfc2VsID0gMHhmZmZmOwogCiAJaWYgKG5leHRfdHNzX2Rlc2MudHlwZSAmIDgpCi0JCXJldCA9IHRhc2tfc3dpdGNoXzMyKGN0eHQsIG9wcywgdHNzX3NlbGVjdG9yLCBvbGRfdHNzX3NlbCwKKwkJcmV0ID0gdGFza19zd2l0Y2hfMzIoY3R4dCwgdHNzX3NlbGVjdG9yLCBvbGRfdHNzX3NlbCwKIAkJCQkgICAgIG9sZF90c3NfYmFzZSwgJm5leHRfdHNzX2Rlc2MpOwogCWVsc2UKLQkJcmV0ID0gdGFza19zd2l0Y2hfMTYoY3R4dCwgb3BzLCB0c3Nfc2VsZWN0b3IsIG9sZF90c3Nfc2VsLAorCQlyZXQgPSB0YXNrX3N3aXRjaF8xNihjdHh0LCB0c3Nfc2VsZWN0b3IsIG9sZF90c3Nfc2VsLAogCQkJCSAgICAgb2xkX3Rzc19iYXNlLCAmbmV4dF90c3NfZGVzYyk7CiAJaWYgKHJldCAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmV0OwpAQCAtMjQzNywxOSArMjM3OSwxNiBAQAogCiAJaWYgKHJlYXNvbiAhPSBUQVNLX1NXSVRDSF9JUkVUKSB7CiAJCW5leHRfdHNzX2Rlc2MudHlwZSB8PSAoMSA8PCAxKTsgLyogc2V0IGJ1c3kgZmxhZyAqLwotCQl3cml0ZV9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCB0c3Nfc2VsZWN0b3IsCi0JCQkJCSAmbmV4dF90c3NfZGVzYyk7CisJCXdyaXRlX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCB0c3Nfc2VsZWN0b3IsICZuZXh0X3Rzc19kZXNjKTsKIAl9CiAKIAlvcHMtPnNldF9jcihjdHh0LCAwLCAgb3BzLT5nZXRfY3IoY3R4dCwgMCkgfCBYODZfQ1IwX1RTKTsKIAlvcHMtPnNldF9zZWdtZW50KGN0eHQsIHRzc19zZWxlY3RvciwgJm5leHRfdHNzX2Rlc2MsIDAsIFZDUFVfU1JFR19UUik7CiAKIAlpZiAoaGFzX2Vycm9yX2NvZGUpIHsKLQkJc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQkJYy0+b3BfYnl0ZXMgPSBjLT5hZF9ieXRlcyA9IChuZXh0X3Rzc19kZXNjLnR5cGUgJiA4KSA/IDQgOiAyOwotCQljLT5sb2NrX3ByZWZpeCA9IDA7Ci0JCWMtPnNyYy52YWwgPSAodW5zaWduZWQgbG9uZykgZXJyb3JfY29kZTsKKwkJY3R4dC0+b3BfYnl0ZXMgPSBjdHh0LT5hZF9ieXRlcyA9IChuZXh0X3Rzc19kZXNjLnR5cGUgJiA4KSA/IDQgOiAyOworCQljdHh0LT5sb2NrX3ByZWZpeCA9IDA7CisJCWN0eHQtPnNyYy52YWwgPSAodW5zaWduZWQgbG9uZykgZXJyb3JfY29kZTsKIAkJcmV0ID0gZW1fcHVzaChjdHh0KTsKIAl9CiAKQEAgLTI0NjAsMTggKzIzOTksMTYgQEAKIAkJCSB1MTYgdHNzX3NlbGVjdG9yLCBpbnQgcmVhc29uLAogCQkJIGJvb2wgaGFzX2Vycm9yX2NvZGUsIHUzMiBlcnJvcl9jb2RlKQogewotCXN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcyA9IGN0eHQtPm9wczsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAlpbnQgcmM7CiAKLQljLT5laXAgPSBjdHh0LT5laXA7Ci0JYy0+ZHN0LnR5cGUgPSBPUF9OT05FOworCWN0eHQtPl9laXAgPSBjdHh0LT5laXA7CisJY3R4dC0+ZHN0LnR5cGUgPSBPUF9OT05FOwogCi0JcmMgPSBlbXVsYXRvcl9kb190YXNrX3N3aXRjaChjdHh0LCBvcHMsIHRzc19zZWxlY3RvciwgcmVhc29uLAorCXJjID0gZW11bGF0b3JfZG9fdGFza19zd2l0Y2goY3R4dCwgdHNzX3NlbGVjdG9yLCByZWFzb24sCiAJCQkJICAgICBoYXNfZXJyb3JfY29kZSwgZXJyb3JfY29kZSk7CiAKIAlpZiAocmMgPT0gWDg2RU1VTF9DT05USU5VRSkKLQkJY3R4dC0+ZWlwID0gYy0+ZWlwOworCQljdHh0LT5laXAgPSBjdHh0LT5fZWlwOwogCiAJcmV0dXJuIChyYyA9PSBYODZFTVVMX1VOSEFORExFQUJMRSkgPyBFTVVMQVRJT05fRkFJTEVEIDogRU1VTEFUSU9OX09LOwogfQpAQCAtMjQ3OSwyMiArMjQxNiwyMCBAQAogc3RhdGljIHZvaWQgc3RyaW5nX2FkZHJfaW5jKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB1bnNpZ25lZCBzZWcsCiAJCQkgICAgaW50IHJlZywgc3RydWN0IG9wZXJhbmQgKm9wKQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCWludCBkZiA9IChjdHh0LT5lZmxhZ3MgJiBFRkxHX0RGKSA/IC0xIDogMTsKIAotCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KGMsICZjLT5yZWdzW3JlZ10sIGRmICogb3AtPmJ5dGVzKTsKLQlvcC0+YWRkci5tZW0uZWEgPSByZWdpc3Rlcl9hZGRyZXNzKGMsIGMtPnJlZ3NbcmVnXSk7CisJcmVnaXN0ZXJfYWRkcmVzc19pbmNyZW1lbnQoY3R4dCwgJmN0eHQtPnJlZ3NbcmVnXSwgZGYgKiBvcC0+Ynl0ZXMpOworCW9wLT5hZGRyLm1lbS5lYSA9IHJlZ2lzdGVyX2FkZHJlc3MoY3R4dCwgY3R4dC0+cmVnc1tyZWddKTsKIAlvcC0+YWRkci5tZW0uc2VnID0gc2VnOwogfQogCiBzdGF0aWMgaW50IGVtX2RhcyhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAl1OCBhbCwgb2xkX2FsOwogCWJvb2wgYWYsIGNmLCBvbGRfY2Y7CiAKIAljZiA9IGN0eHQtPmVmbGFncyAmIFg4Nl9FRkxBR1NfQ0Y7Ci0JYWwgPSBjLT5kc3QudmFsOworCWFsID0gY3R4dC0+ZHN0LnZhbDsKIAogCW9sZF9hbCA9IGFsOwogCW9sZF9jZiA9IGNmOwpAQCAtMjUxMiwxMiArMjQ0NywxMiBAQAogCQljZiA9IHRydWU7CiAJfQogCi0JYy0+ZHN0LnZhbCA9IGFsOworCWN0eHQtPmRzdC52YWwgPSBhbDsKIAkvKiBTZXQgUEYsIFpGLCBTRiAqLwotCWMtPnNyYy50eXBlID0gT1BfSU1NOwotCWMtPnNyYy52YWwgPSAwOwotCWMtPnNyYy5ieXRlcyA9IDE7Ci0JZW11bGF0ZV8yb3BfU3JjVigib3IiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwljdHh0LT5zcmMudHlwZSA9IE9QX0lNTTsKKwljdHh0LT5zcmMudmFsID0gMDsKKwljdHh0LT5zcmMuYnl0ZXMgPSAxOworCWVtdWxhdGVfMm9wX1NyY1YoIm9yIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJY3R4dC0+ZWZsYWdzICY9IH4oWDg2X0VGTEFHU19BRiB8IFg4Nl9FRkxBR1NfQ0YpOwogCWlmIChjZikKIAkJY3R4dC0+ZWZsYWdzIHw9IFg4Nl9FRkxBR1NfQ0Y7CkBAIC0yNTI4LDE3NSArMjQ2MywxODkgQEAKIAogc3RhdGljIGludCBlbV9jYWxsX2ZhcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAl1MTYgc2VsLCBvbGRfY3M7CiAJdWxvbmcgb2xkX2VpcDsKIAlpbnQgcmM7CiAKIAlvbGRfY3MgPSBnZXRfc2VnbWVudF9zZWxlY3RvcihjdHh0LCBWQ1BVX1NSRUdfQ1MpOwotCW9sZF9laXAgPSBjLT5laXA7CisJb2xkX2VpcCA9IGN0eHQtPl9laXA7CiAKLQltZW1jcHkoJnNlbCwgYy0+c3JjLnZhbHB0ciArIGMtPm9wX2J5dGVzLCAyKTsKLQlpZiAobG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dCwgY3R4dC0+b3BzLCBzZWwsIFZDUFVfU1JFR19DUykpCisJbWVtY3B5KCZzZWwsIGN0eHQtPnNyYy52YWxwdHIgKyBjdHh0LT5vcF9ieXRlcywgMik7CisJaWYgKGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIHNlbCwgVkNQVV9TUkVHX0NTKSkKIAkJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiAKLQljLT5laXAgPSAwOwotCW1lbWNweSgmYy0+ZWlwLCBjLT5zcmMudmFscHRyLCBjLT5vcF9ieXRlcyk7CisJY3R4dC0+X2VpcCA9IDA7CisJbWVtY3B5KCZjdHh0LT5fZWlwLCBjdHh0LT5zcmMudmFscHRyLCBjdHh0LT5vcF9ieXRlcyk7CiAKLQljLT5zcmMudmFsID0gb2xkX2NzOworCWN0eHQtPnNyYy52YWwgPSBvbGRfY3M7CiAJcmMgPSBlbV9wdXNoKGN0eHQpOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7CiAKLQljLT5zcmMudmFsID0gb2xkX2VpcDsKKwljdHh0LT5zcmMudmFsID0gb2xkX2VpcDsKIAlyZXR1cm4gZW1fcHVzaChjdHh0KTsKIH0KIAogc3RhdGljIGludCBlbV9yZXRfbmVhcl9pbW0oc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CiAJaW50IHJjOwogCi0JYy0+ZHN0LnR5cGUgPSBPUF9SRUc7Ci0JYy0+ZHN0LmFkZHIucmVnID0gJmMtPmVpcDsKLQljLT5kc3QuYnl0ZXMgPSBjLT5vcF9ieXRlczsKLQlyYyA9IGVtdWxhdGVfcG9wKGN0eHQsICZjLT5kc3QudmFsLCBjLT5vcF9ieXRlcyk7CisJY3R4dC0+ZHN0LnR5cGUgPSBPUF9SRUc7CisJY3R4dC0+ZHN0LmFkZHIucmVnID0gJmN0eHQtPl9laXA7CisJY3R4dC0+ZHN0LmJ5dGVzID0gY3R4dC0+b3BfYnl0ZXM7CisJcmMgPSBlbXVsYXRlX3BvcChjdHh0LCAmY3R4dC0+ZHN0LnZhbCwgY3R4dC0+b3BfYnl0ZXMpOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7Ci0JcmVnaXN0ZXJfYWRkcmVzc19pbmNyZW1lbnQoYywgJmMtPnJlZ3NbVkNQVV9SRUdTX1JTUF0sIGMtPnNyYy52YWwpOworCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KGN0eHQsICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SU1BdLCBjdHh0LT5zcmMudmFsKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV9hZGQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQllbXVsYXRlXzJvcF9TcmNWKCJhZGQiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKCJhZGQiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV9vcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKLQotCWVtdWxhdGVfMm9wX1NyY1YoIm9yIiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVigib3IiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV9hZGMoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQllbXVsYXRlXzJvcF9TcmNWKCJhZGMiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKCJhZGMiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV9zYmIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQllbXVsYXRlXzJvcF9TcmNWKCJzYmIiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKCJzYmIiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV9hbmQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQllbXVsYXRlXzJvcF9TcmNWKCJhbmQiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKCJhbmQiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV9zdWIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQllbXVsYXRlXzJvcF9TcmNWKCJzdWIiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKCJzdWIiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV94b3Ioc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQllbXVsYXRlXzJvcF9TcmNWKCJ4b3IiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKCJ4b3IiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV9jbXAoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQllbXVsYXRlXzJvcF9TcmNWKCJjbXAiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKCJjbXAiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAkvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KLQljLT5kc3QudHlwZSA9IE9QX05PTkU7CisJY3R4dC0+ZHN0LnR5cGUgPSBPUF9OT05FOworCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworfQorCitzdGF0aWMgaW50IGVtX3Rlc3Qoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJZW11bGF0ZV8yb3BfU3JjVigidGVzdCIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworfQorCitzdGF0aWMgaW50IGVtX3hjaGcoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJLyogV3JpdGUgYmFjayB0aGUgcmVnaXN0ZXIgc291cmNlLiAqLworCWN0eHQtPnNyYy52YWwgPSBjdHh0LT5kc3QudmFsOworCXdyaXRlX3JlZ2lzdGVyX29wZXJhbmQoJmN0eHQtPnNyYyk7CisKKwkvKiBXcml0ZSBiYWNrIHRoZSBtZW1vcnkgZGVzdGluYXRpb24gd2l0aCBpbXBsaWNpdCBMT0NLIHByZWZpeC4gKi8KKwljdHh0LT5kc3QudmFsID0gY3R4dC0+c3JjLm9yaWdfdmFsOworCWN0eHQtPmxvY2tfcHJlZml4ID0gMTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV9pbXVsKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCi0JZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoImltdWwiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZSgiaW11bCIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50IGVtX2ltdWxfM29wKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCi0JYy0+ZHN0LnZhbCA9IGMtPnNyYzIudmFsOworCWN0eHQtPmRzdC52YWwgPSBjdHh0LT5zcmMyLnZhbDsKIAlyZXR1cm4gZW1faW11bChjdHh0KTsKIH0KIAogc3RhdGljIGludCBlbV9jd2Qoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQljLT5kc3QudHlwZSA9IE9QX1JFRzsKLQljLT5kc3QuYnl0ZXMgPSBjLT5zcmMuYnl0ZXM7Ci0JYy0+ZHN0LmFkZHIucmVnID0gJmMtPnJlZ3NbVkNQVV9SRUdTX1JEWF07Ci0JYy0+ZHN0LnZhbCA9IH4oKGMtPnNyYy52YWwgPj4gKGMtPnNyYy5ieXRlcyAqIDggLSAxKSkgLSAxKTsKKwljdHh0LT5kc3QudHlwZSA9IE9QX1JFRzsKKwljdHh0LT5kc3QuYnl0ZXMgPSBjdHh0LT5zcmMuYnl0ZXM7CisJY3R4dC0+ZHN0LmFkZHIucmVnID0gJmN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JEWF07CisJY3R4dC0+ZHN0LnZhbCA9IH4oKGN0eHQtPnNyYy52YWwgPj4gKGN0eHQtPnNyYy5ieXRlcyAqIDggLSAxKSkgLSAxKTsKIAogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50IGVtX3JkdHNjKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCXU2NCB0c2MgPSAwOwogCiAJY3R4dC0+b3BzLT5nZXRfbXNyKGN0eHQsIE1TUl9JQTMyX1RTQywgJnRzYyk7Ci0JYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXSA9ICh1MzIpdHNjOwotCWMtPnJlZ3NbVkNQVV9SRUdTX1JEWF0gPSB0c2MgPj4gMzI7CisJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkFYXSA9ICh1MzIpdHNjOworCWN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JEWF0gPSB0c2MgPj4gMzI7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZW1fbW92KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCWMtPmRzdC52YWwgPSBjLT5zcmMudmFsOworCWN0eHQtPmRzdC52YWwgPSBjdHh0LT5zcmMudmFsOwogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCitzdGF0aWMgaW50IGVtX21vdl9ybV9zcmVnKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworCWlmIChjdHh0LT5tb2RybV9yZWcgPiBWQ1BVX1NSRUdfR1MpCisJCXJldHVybiBlbXVsYXRlX3VkKGN0eHQpOworCisJY3R4dC0+ZHN0LnZhbCA9IGdldF9zZWdtZW50X3NlbGVjdG9yKGN0eHQsIGN0eHQtPm1vZHJtX3JlZyk7CisJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbnQgZW1fbW92X3NyZWdfcm0oc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJdTE2IHNlbCA9IGN0eHQtPnNyYy52YWw7CisKKwlpZiAoY3R4dC0+bW9kcm1fcmVnID09IFZDUFVfU1JFR19DUyB8fCBjdHh0LT5tb2RybV9yZWcgPiBWQ1BVX1NSRUdfR1MpCisJCXJldHVybiBlbXVsYXRlX3VkKGN0eHQpOworCisJaWYgKGN0eHQtPm1vZHJtX3JlZyA9PSBWQ1BVX1NSRUdfU1MpCisJCWN0eHQtPmludGVycnVwdGliaWxpdHkgPSBLVk1fWDg2X1NIQURPV19JTlRfTU9WX1NTOworCisJLyogRGlzYWJsZSB3cml0ZWJhY2suICovCisJY3R4dC0+ZHN0LnR5cGUgPSBPUF9OT05FOworCXJldHVybiBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBzZWwsIGN0eHQtPm1vZHJtX3JlZyk7Cit9CisKIHN0YXRpYyBpbnQgZW1fbW92ZHF1KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCW1lbWNweSgmYy0+ZHN0LnZlY192YWwsICZjLT5zcmMudmVjX3ZhbCwgYy0+b3BfYnl0ZXMpOworCW1lbWNweSgmY3R4dC0+ZHN0LnZlY192YWwsICZjdHh0LT5zcmMudmVjX3ZhbCwgY3R4dC0+b3BfYnl0ZXMpOwogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50IGVtX2ludmxwZyhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAlpbnQgcmM7CiAJdWxvbmcgbGluZWFyOwogCi0JcmMgPSBsaW5lYXJpemUoY3R4dCwgYy0+c3JjLmFkZHIubWVtLCAxLCBmYWxzZSwgJmxpbmVhcik7CisJcmMgPSBsaW5lYXJpemUoY3R4dCwgY3R4dC0+c3JjLmFkZHIubWVtLCAxLCBmYWxzZSwgJmxpbmVhcik7CiAJaWYgKHJjID09IFg4NkVNVUxfQ09OVElOVUUpCiAJCWN0eHQtPm9wcy0+aW52bHBnKGN0eHQsIGxpbmVhcik7CiAJLyogRGlzYWJsZSB3cml0ZWJhY2suICovCi0JYy0+ZHN0LnR5cGUgPSBPUF9OT05FOworCWN0eHQtPmRzdC50eXBlID0gT1BfTk9ORTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIApAQCAtMjcxMiwxMCArMjY2MSw5IEBACiAKIHN0YXRpYyBpbnQgZW1fdm1jYWxsKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCWludCByYzsKIAotCWlmIChjLT5tb2RybV9tb2QgIT0gMyB8fCBjLT5tb2RybV9ybSAhPSAxKQorCWlmIChjdHh0LT5tb2RybV9tb2QgIT0gMyB8fCBjdHh0LT5tb2RybV9ybSAhPSAxKQogCQlyZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CiAKIAlyYyA9IGN0eHQtPm9wcy0+Zml4X2h5cGVyY2FsbChjdHh0KTsKQEAgLTI3MjMsNzMgKzI2NzEsMTA0IEBACiAJCXJldHVybiByYzsKIAogCS8qIExldCB0aGUgcHJvY2Vzc29yIHJlLWV4ZWN1dGUgdGhlIGZpeGVkIGh5cGVyY2FsbCAqLwotCWMtPmVpcCA9IGN0eHQtPmVpcDsKKwljdHh0LT5fZWlwID0gY3R4dC0+ZWlwOwogCS8qIERpc2FibGUgd3JpdGViYWNrLiAqLwotCWMtPmRzdC50eXBlID0gT1BfTk9ORTsKKwljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZW1fbGdkdChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAlzdHJ1Y3QgZGVzY19wdHIgZGVzY19wdHI7CiAJaW50IHJjOwogCi0JcmMgPSByZWFkX2Rlc2NyaXB0b3IoY3R4dCwgYy0+c3JjLmFkZHIubWVtLAorCXJjID0gcmVhZF9kZXNjcmlwdG9yKGN0eHQsIGN0eHQtPnNyYy5hZGRyLm1lbSwKIAkJCSAgICAgJmRlc2NfcHRyLnNpemUsICZkZXNjX3B0ci5hZGRyZXNzLAotCQkJICAgICBjLT5vcF9ieXRlcyk7CisJCQkgICAgIGN0eHQtPm9wX2J5dGVzKTsKIAlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJjOwogCWN0eHQtPm9wcy0+c2V0X2dkdChjdHh0LCAmZGVzY19wdHIpOwogCS8qIERpc2FibGUgd3JpdGViYWNrLiAqLwotCWMtPmRzdC50eXBlID0gT1BfTk9ORTsKKwljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZW1fdm1tY2FsbChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAlpbnQgcmM7CiAKIAlyYyA9IGN0eHQtPm9wcy0+Zml4X2h5cGVyY2FsbChjdHh0KTsKIAogCS8qIERpc2FibGUgd3JpdGViYWNrLiAqLwotCWMtPmRzdC50eXBlID0gT1BfTk9ORTsKKwljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IGVtX2xpZHQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CiAJc3RydWN0IGRlc2NfcHRyIGRlc2NfcHRyOwogCWludCByYzsKIAotCXJjID0gcmVhZF9kZXNjcmlwdG9yKGN0eHQsIGMtPnNyYy5hZGRyLm1lbSwKKwlyYyA9IHJlYWRfZGVzY3JpcHRvcihjdHh0LCBjdHh0LT5zcmMuYWRkci5tZW0sCiAJCQkgICAgICZkZXNjX3B0ci5zaXplLCAmZGVzY19wdHIuYWRkcmVzcywKLQkJCSAgICAgYy0+b3BfYnl0ZXMpOworCQkJICAgICBjdHh0LT5vcF9ieXRlcyk7CiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiByYzsKIAljdHh0LT5vcHMtPnNldF9pZHQoY3R4dCwgJmRlc2NfcHRyKTsKIAkvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KLQljLT5kc3QudHlwZSA9IE9QX05PTkU7CisJY3R4dC0+ZHN0LnR5cGUgPSBPUF9OT05FOwogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50IGVtX3Ntc3coc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQljLT5kc3QuYnl0ZXMgPSAyOwotCWMtPmRzdC52YWwgPSBjdHh0LT5vcHMtPmdldF9jcihjdHh0LCAwKTsKKwljdHh0LT5kc3QuYnl0ZXMgPSAyOworCWN0eHQtPmRzdC52YWwgPSBjdHh0LT5vcHMtPmdldF9jcihjdHh0LCAwKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV9sbXN3KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCWN0eHQtPm9wcy0+c2V0X2NyKGN0eHQsIDAsIChjdHh0LT5vcHMtPmdldF9jcihjdHh0LCAwKSAmIH4weDBldWwpCi0JCQkgIHwgKGMtPnNyYy52YWwgJiAweDBmKSk7Ci0JYy0+ZHN0LnR5cGUgPSBPUF9OT05FOworCQkJICB8IChjdHh0LT5zcmMudmFsICYgMHgwZikpOworCWN0eHQtPmRzdC50eXBlID0gT1BfTk9ORTsKKwlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKK30KKworc3RhdGljIGludCBlbV9sb29wKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KGN0eHQsICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQ1hdLCAtMSk7CisJaWYgKChhZGRyZXNzX21hc2soY3R4dCwgY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkNYXSkgIT0gMCkgJiYKKwkgICAgKGN0eHQtPmIgPT0gMHhlMiB8fCB0ZXN0X2NjKGN0eHQtPmIgXiAweDUsIGN0eHQtPmVmbGFncykpKQorCQlqbXBfcmVsKGN0eHQsIGN0eHQtPnNyYy52YWwpOworCisJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbnQgZW1famN4eihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3sKKwlpZiAoYWRkcmVzc19tYXNrKGN0eHQsIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JDWF0pID09IDApCisJCWptcF9yZWwoY3R4dCwgY3R4dC0+c3JjLnZhbCk7CisKKwlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKK30KKworc3RhdGljIGludCBlbV9jbGkoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJaWYgKGVtdWxhdG9yX2JhZF9pb3BsKGN0eHQpKQorCQlyZXR1cm4gZW11bGF0ZV9ncChjdHh0LCAwKTsKKworCWN0eHQtPmVmbGFncyAmPSB+WDg2X0VGTEFHU19JRjsKKwlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKK30KKworc3RhdGljIGludCBlbV9zdGkoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJaWYgKGVtdWxhdG9yX2JhZF9pb3BsKGN0eHQpKQorCQlyZXR1cm4gZW11bGF0ZV9ncChjdHh0LCAwKTsKKworCWN0eHQtPmludGVycnVwdGliaWxpdHkgPSBLVk1fWDg2X1NIQURPV19JTlRfU1RJOworCWN0eHQtPmVmbGFncyB8PSBYODZfRUZMQUdTX0lGOwogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCkBAIC0yODA3LDkgKzI3ODYsNyBAQAogCiBzdGF0aWMgaW50IGNoZWNrX2NyX3JlYWQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQlpZiAoIXZhbGlkX2NyKGMtPm1vZHJtX3JlZykpCisJaWYgKCF2YWxpZF9jcihjdHh0LT5tb2RybV9yZWcpKQogCQlyZXR1cm4gZW11bGF0ZV91ZChjdHh0KTsKIAogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwpAQCAtMjgxNyw5ICsyNzk0LDggQEAKIAogc3RhdGljIGludCBjaGVja19jcl93cml0ZShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKLQl1NjQgbmV3X3ZhbCA9IGMtPnNyYy52YWw2NDsKLQlpbnQgY3IgPSBjLT5tb2RybV9yZWc7CisJdTY0IG5ld192YWwgPSBjdHh0LT5zcmMudmFsNjQ7CisJaW50IGNyID0gY3R4dC0+bW9kcm1fcmVnOwogCXU2NCBlZmVyID0gMDsKIAogCXN0YXRpYyB1NjQgY3JfcmVzZXJ2ZWRfYml0c1tdID0gewpAQCAtMjg5Niw4ICsyODcyLDcgQEAKIAogc3RhdGljIGludCBjaGVja19kcl9yZWFkKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCWludCBkciA9IGMtPm1vZHJtX3JlZzsKKwlpbnQgZHIgPSBjdHh0LT5tb2RybV9yZWc7CiAJdTY0IGNyNDsKIAogCWlmIChkciA+IDcpCkBAIC0yOTE1LDkgKzI4OTAsOCBAQAogCiBzdGF0aWMgaW50IGNoZWNrX2RyX3dyaXRlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCXU2NCBuZXdfdmFsID0gYy0+c3JjLnZhbDY0OwotCWludCBkciA9IGMtPm1vZHJtX3JlZzsKKwl1NjQgbmV3X3ZhbCA9IGN0eHQtPnNyYy52YWw2NDsKKwlpbnQgZHIgPSBjdHh0LT5tb2RybV9yZWc7CiAKIAlpZiAoKGRyID09IDYgfHwgZHIgPT0gNykgJiYgKG5ld192YWwgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpKQogCQlyZXR1cm4gZW11bGF0ZV9ncChjdHh0LCAwKTsKQEAgLTI5MzksNyArMjkxMyw3IEBACiAKIHN0YXRpYyBpbnQgY2hlY2tfc3ZtZV9wYShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQl1NjQgcmF4ID0gY3R4dC0+ZGVjb2RlLnJlZ3NbVkNQVV9SRUdTX1JBWF07CisJdTY0IHJheCA9IGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JBWF07CiAKIAkvKiBWYWxpZCBwaHlzaWNhbCBhZGRyZXNzPyAqLwogCWlmIChyYXggJiAweGZmZmYwMDAwMDAwMDAwMDBVTEwpCkBAIC0yOTYxLDcgKzI5MzUsNyBAQAogc3RhdGljIGludCBjaGVja19yZHBtYyhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKIAl1NjQgY3I0ID0gY3R4dC0+b3BzLT5nZXRfY3IoY3R4dCwgNCk7Ci0JdTY0IHJjeCA9IGN0eHQtPmRlY29kZS5yZWdzW1ZDUFVfUkVHU19SQ1hdOworCXU2NCByY3ggPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQ1hdOwogCiAJaWYgKCghKGNyNCAmIFg4Nl9DUjRfUENFKSAmJiBjdHh0LT5vcHMtPmNwbChjdHh0KSkgfHwKIAkgICAgKHJjeCA+IDMpKQpAQCAtMjk3MiwxMCArMjk0Niw4IEBACiAKIHN0YXRpYyBpbnQgY2hlY2tfcGVybV9pbihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKLQotCWMtPmRzdC5ieXRlcyA9IG1pbihjLT5kc3QuYnl0ZXMsIDR1KTsKLQlpZiAoIWVtdWxhdG9yX2lvX3Blcm1pdGVkKGN0eHQsIGN0eHQtPm9wcywgYy0+c3JjLnZhbCwgYy0+ZHN0LmJ5dGVzKSkKKwljdHh0LT5kc3QuYnl0ZXMgPSBtaW4oY3R4dC0+ZHN0LmJ5dGVzLCA0dSk7CisJaWYgKCFlbXVsYXRvcl9pb19wZXJtaXRlZChjdHh0LCBjdHh0LT5zcmMudmFsLCBjdHh0LT5kc3QuYnl0ZXMpKQogCQlyZXR1cm4gZW11bGF0ZV9ncChjdHh0LCAwKTsKIAogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwpAQCAtMjk4MywxMCArMjk1NSw4IEBACiAKIHN0YXRpYyBpbnQgY2hlY2tfcGVybV9vdXQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7Ci0KLQljLT5zcmMuYnl0ZXMgPSBtaW4oYy0+c3JjLmJ5dGVzLCA0dSk7Ci0JaWYgKCFlbXVsYXRvcl9pb19wZXJtaXRlZChjdHh0LCBjdHh0LT5vcHMsIGMtPmRzdC52YWwsIGMtPnNyYy5ieXRlcykpCisJY3R4dC0+c3JjLmJ5dGVzID0gbWluKGN0eHQtPnNyYy5ieXRlcywgNHUpOworCWlmICghZW11bGF0b3JfaW9fcGVybWl0ZWQoY3R4dCwgY3R4dC0+ZHN0LnZhbCwgY3R4dC0+c3JjLmJ5dGVzKSkKIAkJcmV0dXJuIGVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKQEAgLTMxNTQsOCArMzEyNCw4IEBACiAJSShEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IFNyYzJJbW0sIGVtX2ltdWxfM29wKSwKIAlJKFNyY0ltbUJ5dGUgfCBNb3YgfCBTdGFjaywgZW1fcHVzaCksCiAJSShEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IFNyYzJJbW1CeXRlLCBlbV9pbXVsXzNvcCksCi0JRDJidklQKERzdERJIHwgTW92IHwgU3RyaW5nLCBpbnMsIGNoZWNrX3Blcm1faW4pLCAvKiBpbnNiLCBpbnN3L2luc2QgKi8KLQlEMmJ2SVAoU3JjU0kgfCBJbXBsaWNpdE9wcyB8IFN0cmluZywgb3V0cywgY2hlY2tfcGVybV9vdXQpLCAvKiBvdXRzYiwgb3V0c3cvb3V0c2QgKi8KKwlEMmJ2SVAoRHN0REkgfCBTcmNEWCB8IE1vdiB8IFN0cmluZywgaW5zLCBjaGVja19wZXJtX2luKSwgLyogaW5zYiwgaW5zdy9pbnNkICovCisJRDJidklQKFNyY1NJIHwgRHN0RFggfCBTdHJpbmcsIG91dHMsIGNoZWNrX3Blcm1fb3V0KSwgLyogb3V0c2IsIG91dHN3L291dHNkICovCiAJLyogMHg3MCAtIDB4N0YgKi8KIAlYMTYoRChTcmNJbW1CeXRlKSksCiAJLyogMHg4MCAtIDB4ODcgKi8KQEAgLTMxNjMsMTIgKzMxMzMsMTUgQEAKIAlHKERzdE1lbSB8IFNyY0ltbSB8IE1vZFJNIHwgR3JvdXAsIGdyb3VwMSksCiAJRyhCeXRlT3AgfCBEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSB8IE5vNjQgfCBHcm91cCwgZ3JvdXAxKSwKIAlHKERzdE1lbSB8IFNyY0ltbUJ5dGUgfCBNb2RSTSB8IEdyb3VwLCBncm91cDEpLAotCUQyYnYoRHN0TWVtIHwgU3JjUmVnIHwgTW9kUk0pLCBEMmJ2KERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNIHwgTG9jayksCisJSTJidihEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwgZW1fdGVzdCksCisJSTJidihEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSB8IExvY2ssIGVtX3hjaGcpLAogCS8qIDB4ODggLSAweDhGICovCiAJSTJidihEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSB8IE1vdiwgZW1fbW92KSwKIAlJMmJ2KERzdFJlZyB8IFNyY01lbSB8IE1vZFJNIHwgTW92LCBlbV9tb3YpLAotCUQoRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNIHwgTW92KSwgRChNb2RSTSB8IFNyY01lbSB8IE5vQWNjZXNzIHwgRHN0UmVnKSwKLQlEKEltcGxpY2l0T3BzIHwgU3JjTWVtMTYgfCBNb2RSTSksIEcoMCwgZ3JvdXAxQSksCisJSShEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0gfCBNb3YsIGVtX21vdl9ybV9zcmVnKSwKKwlEKE1vZFJNIHwgU3JjTWVtIHwgTm9BY2Nlc3MgfCBEc3RSZWcpLAorCUkoSW1wbGljaXRPcHMgfCBTcmNNZW0xNiB8IE1vZFJNLCBlbV9tb3Zfc3JlZ19ybSksCisJRygwLCBncm91cDFBKSwKIAkvKiAweDkwIC0gMHg5NyAqLwogCURJKFNyY0FjYyB8IERzdFJlZywgcGF1c2UpLCBYNyhEKFNyY0FjYyB8IERzdFJlZykpLAogCS8qIDB4OTggLSAweDlGICovCkBAIC0zMTgyLDcgKzMxNTUsNyBAQAogCUkyYnYoU3JjU0kgfCBEc3RESSB8IE1vdiB8IFN0cmluZywgZW1fbW92KSwKIAlJMmJ2KFNyY1NJIHwgRHN0REkgfCBTdHJpbmcsIGVtX2NtcCksCiAJLyogMHhBOCAtIDB4QUYgKi8KLQlEMmJ2KERzdEFjYyB8IFNyY0ltbSksCisJSTJidihEc3RBY2MgfCBTcmNJbW0sIGVtX3Rlc3QpLAogCUkyYnYoU3JjQWNjIHwgRHN0REkgfCBNb3YgfCBTdHJpbmcsIGVtX21vdiksCiAJSTJidihTcmNTSSB8IERzdEFjYyB8IE1vdiB8IFN0cmluZywgZW1fbW92KSwKIAlJMmJ2KFNyY0FjYyB8IERzdERJIHwgU3RyaW5nLCBlbV9jbXApLApAQCAtMzE5Myw0MCArMzE2Niw0MyBAQAogCS8qIDB4QzAgLSAweEM3ICovCiAJRDJidihEc3RNZW0gfCBTcmNJbW1CeXRlIHwgTW9kUk0pLAogCUkoSW1wbGljaXRPcHMgfCBTdGFjayB8IFNyY0ltbVUxNiwgZW1fcmV0X25lYXJfaW1tKSwKLQlEKEltcGxpY2l0T3BzIHwgU3RhY2spLAorCUkoSW1wbGljaXRPcHMgfCBTdGFjaywgZW1fcmV0KSwKIAlEKERzdFJlZyB8IFNyY01lbUZBZGRyIHwgTW9kUk0gfCBObzY0KSwgRChEc3RSZWcgfCBTcmNNZW1GQWRkciB8IE1vZFJNIHwgTm82NCksCiAJRyhCeXRlT3AsIGdyb3VwMTEpLCBHKDAsIGdyb3VwMTEpLAogCS8qIDB4QzggLSAweENGICovCi0JTiwgTiwgTiwgRChJbXBsaWNpdE9wcyB8IFN0YWNrKSwKKwlOLCBOLCBOLCBJKEltcGxpY2l0T3BzIHwgU3RhY2ssIGVtX3JldF9mYXIpLAogCUQoSW1wbGljaXRPcHMpLCBESShTcmNJbW1CeXRlLCBpbnRuKSwKLQlEKEltcGxpY2l0T3BzIHwgTm82NCksIERJKEltcGxpY2l0T3BzLCBpcmV0KSwKKwlEKEltcGxpY2l0T3BzIHwgTm82NCksIElJKEltcGxpY2l0T3BzLCBlbV9pcmV0LCBpcmV0KSwKIAkvKiAweEQwIC0gMHhENyAqLwogCUQyYnYoRHN0TWVtIHwgU3JjT25lIHwgTW9kUk0pLCBEMmJ2KERzdE1lbSB8IE1vZFJNKSwKIAlOLCBOLCBOLCBOLAogCS8qIDB4RDggLSAweERGICovCiAJTiwgTiwgTiwgTiwgTiwgTiwgTiwgTiwKIAkvKiAweEUwIC0gMHhFNyAqLwotCVg0KEQoU3JjSW1tQnl0ZSkpLAorCVgzKEkoU3JjSW1tQnl0ZSwgZW1fbG9vcCkpLAorCUkoU3JjSW1tQnl0ZSwgZW1famN4eiksCiAJRDJidklQKFNyY0ltbVVCeXRlIHwgRHN0QWNjLCBpbiwgIGNoZWNrX3Blcm1faW4pLAogCUQyYnZJUChTcmNBY2MgfCBEc3RJbW1VQnl0ZSwgb3V0LCBjaGVja19wZXJtX291dCksCiAJLyogMHhFOCAtIDB4RUYgKi8KIAlEKFNyY0ltbSB8IFN0YWNrKSwgRChTcmNJbW0gfCBJbXBsaWNpdE9wcyksCi0JRChTcmNJbW1GQWRkciB8IE5vNjQpLCBEKFNyY0ltbUJ5dGUgfCBJbXBsaWNpdE9wcyksCi0JRDJidklQKFNyY05vbmUgfCBEc3RBY2MsICAgICBpbiwgIGNoZWNrX3Blcm1faW4pLAotCUQyYnZJUChTcmNBY2MgfCBJbXBsaWNpdE9wcywgb3V0LCBjaGVja19wZXJtX291dCksCisJSShTcmNJbW1GQWRkciB8IE5vNjQsIGVtX2ptcF9mYXIpLCBEKFNyY0ltbUJ5dGUgfCBJbXBsaWNpdE9wcyksCisJRDJidklQKFNyY0RYIHwgRHN0QWNjLCBpbiwgIGNoZWNrX3Blcm1faW4pLAorCUQyYnZJUChTcmNBY2MgfCBEc3REWCwgb3V0LCBjaGVja19wZXJtX291dCksCiAJLyogMHhGMCAtIDB4RjcgKi8KIAlOLCBESShJbXBsaWNpdE9wcywgaWNlYnApLCBOLCBOLAogCURJKEltcGxpY2l0T3BzIHwgUHJpdiwgaGx0KSwgRChJbXBsaWNpdE9wcyksCiAJRyhCeXRlT3AsIGdyb3VwMyksIEcoMCwgZ3JvdXAzKSwKIAkvKiAweEY4IC0gMHhGRiAqLwotCUQoSW1wbGljaXRPcHMpLCBEKEltcGxpY2l0T3BzKSwgRChJbXBsaWNpdE9wcyksIEQoSW1wbGljaXRPcHMpLAorCUQoSW1wbGljaXRPcHMpLCBEKEltcGxpY2l0T3BzKSwKKwlJKEltcGxpY2l0T3BzLCBlbV9jbGkpLCBJKEltcGxpY2l0T3BzLCBlbV9zdGkpLAogCUQoSW1wbGljaXRPcHMpLCBEKEltcGxpY2l0T3BzKSwgRygwLCBncm91cDQpLCBHKDAsIGdyb3VwNSksCiB9OwogCiBzdGF0aWMgc3RydWN0IG9wY29kZSB0d29ieXRlX3RhYmxlWzI1Nl0gPSB7CiAJLyogMHgwMCAtIDB4MEYgKi8KIAlHKDAsIGdyb3VwNiksIEdEKDAsICZncm91cDcpLCBOLCBOLAotCU4sIEQoSW1wbGljaXRPcHMgfCBWZW5kb3JTcGVjaWZpYyksIERJKEltcGxpY2l0T3BzIHwgUHJpdiwgY2x0cyksIE4sCisJTiwgSShJbXBsaWNpdE9wcyB8IFZlbmRvclNwZWNpZmljLCBlbV9zeXNjYWxsKSwKKwlJSShJbXBsaWNpdE9wcyB8IFByaXYsIGVtX2NsdHMsIGNsdHMpLCBOLAogCURJKEltcGxpY2l0T3BzIHwgUHJpdiwgaW52ZCksIERJKEltcGxpY2l0T3BzIHwgUHJpdiwgd2JpbnZkKSwgTiwgTiwKIAlOLCBEKEltcGxpY2l0T3BzIHwgTW9kUk0pLCBOLCBOLAogCS8qIDB4MTAgLSAweDFGICovCkBAIC0zMjQzLDcgKzMyMTksOCBAQAogCUlJUChJbXBsaWNpdE9wcywgZW1fcmR0c2MsIHJkdHNjLCBjaGVja19yZHRzYyksCiAJREkoSW1wbGljaXRPcHMgfCBQcml2LCByZG1zciksCiAJRElQKEltcGxpY2l0T3BzIHwgUHJpdiwgcmRwbWMsIGNoZWNrX3JkcG1jKSwKLQlEKEltcGxpY2l0T3BzIHwgVmVuZG9yU3BlY2lmaWMpLCBEKEltcGxpY2l0T3BzIHwgUHJpdiB8IFZlbmRvclNwZWNpZmljKSwKKwlJKEltcGxpY2l0T3BzIHwgVmVuZG9yU3BlY2lmaWMsIGVtX3N5c2VudGVyKSwKKwlJKEltcGxpY2l0T3BzIHwgUHJpdiB8IFZlbmRvclNwZWNpZmljLCBlbV9zeXNleGl0KSwKIAlOLCBOLAogCU4sIE4sIE4sIE4sIE4sIE4sIE4sIE4sCiAJLyogMHg0MCAtIDB4NEYgKi8KQEAgLTMzMTEsMTEgKzMyODgsMTEgQEAKICN1bmRlZiBJMmJ2CiAjdW5kZWYgSTZBTFUKIAotc3RhdGljIHVuc2lnbmVkIGltbV9zaXplKHN0cnVjdCBkZWNvZGVfY2FjaGUgKmMpCitzdGF0aWMgdW5zaWduZWQgaW1tX3NpemUoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7CiAJdW5zaWduZWQgc2l6ZTsKIAotCXNpemUgPSAoYy0+ZCAmIEJ5dGVPcCkgPyAxIDogYy0+b3BfYnl0ZXM7CisJc2l6ZSA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKIAlpZiAoc2l6ZSA9PSA4KQogCQlzaXplID0gNDsKIAlyZXR1cm4gc2l6ZTsKQEAgLTMzMjQsMjMgKzMzMDEsMjEgQEAKIHN0YXRpYyBpbnQgZGVjb2RlX2ltbShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgc3RydWN0IG9wZXJhbmQgKm9wLAogCQkgICAgICB1bnNpZ25lZCBzaXplLCBib29sIHNpZ25fZXh0ZW5zaW9uKQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCXN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcyA9IGN0eHQtPm9wczsKIAlpbnQgcmMgPSBYODZFTVVMX0NPTlRJTlVFOwogCiAJb3AtPnR5cGUgPSBPUF9JTU07CiAJb3AtPmJ5dGVzID0gc2l6ZTsKLQlvcC0+YWRkci5tZW0uZWEgPSBjLT5laXA7CisJb3AtPmFkZHIubWVtLmVhID0gY3R4dC0+X2VpcDsKIAkvKiBOQi4gSW1tZWRpYXRlcyBhcmUgc2lnbi1leHRlbmRlZCBhcyBuZWNlc3NhcnkuICovCiAJc3dpdGNoIChvcC0+Ynl0ZXMpIHsKIAljYXNlIDE6Ci0JCW9wLT52YWwgPSBpbnNuX2ZldGNoKHM4LCAxLCBjLT5laXApOworCQlvcC0+dmFsID0gaW5zbl9mZXRjaChzOCwgMSwgY3R4dC0+X2VpcCk7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJb3AtPnZhbCA9IGluc25fZmV0Y2goczE2LCAyLCBjLT5laXApOworCQlvcC0+dmFsID0gaW5zbl9mZXRjaChzMTYsIDIsIGN0eHQtPl9laXApOwogCQlicmVhazsKIAljYXNlIDQ6Ci0JCW9wLT52YWwgPSBpbnNuX2ZldGNoKHMzMiwgNCwgYy0+ZWlwKTsKKwkJb3AtPnZhbCA9IGluc25fZmV0Y2goczMyLCA0LCBjdHh0LT5fZWlwKTsKIAkJYnJlYWs7CiAJfQogCWlmICghc2lnbl9leHRlbnNpb24pIHsKQEAgLTMzNjAsMjMgKzMzMzUsMjAgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludAoteDg2X2RlY29kZV9pbnNuKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB2b2lkICppbnNuLCBpbnQgaW5zbl9sZW4pCitpbnQgeDg2X2RlY29kZV9pbnNuKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB2b2lkICppbnNuLCBpbnQgaW5zbl9sZW4pCiB7Ci0Jc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzID0gY3R4dC0+b3BzOwotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCWludCByYyA9IFg4NkVNVUxfQ09OVElOVUU7CiAJaW50IG1vZGUgPSBjdHh0LT5tb2RlOwogCWludCBkZWZfb3BfYnl0ZXMsIGRlZl9hZF9ieXRlcywgZ29mZnNldCwgc2ltZF9wcmVmaXg7CiAJYm9vbCBvcF9wcmVmaXggPSBmYWxzZTsKIAlzdHJ1Y3Qgb3Bjb2RlIG9wY29kZTsKLQlzdHJ1Y3Qgb3BlcmFuZCBtZW1vcCA9IHsgLnR5cGUgPSBPUF9OT05FIH07CisJc3RydWN0IG9wZXJhbmQgbWVtb3AgPSB7IC50eXBlID0gT1BfTk9ORSB9LCAqbWVtb3BwID0gTlVMTDsKIAotCWMtPmVpcCA9IGN0eHQtPmVpcDsKLQljLT5mZXRjaC5zdGFydCA9IGMtPmVpcDsKLQljLT5mZXRjaC5lbmQgPSBjLT5mZXRjaC5zdGFydCArIGluc25fbGVuOworCWN0eHQtPl9laXAgPSBjdHh0LT5laXA7CisJY3R4dC0+ZmV0Y2guc3RhcnQgPSBjdHh0LT5fZWlwOworCWN0eHQtPmZldGNoLmVuZCA9IGN0eHQtPmZldGNoLnN0YXJ0ICsgaW5zbl9sZW47CiAJaWYgKGluc25fbGVuID4gMCkKLQkJbWVtY3B5KGMtPmZldGNoLmRhdGEsIGluc24sIGluc25fbGVuKTsKKwkJbWVtY3B5KGN0eHQtPmZldGNoLmRhdGEsIGluc24sIGluc25fbGVuKTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgWDg2RU1VTF9NT0RFX1JFQUw6CkBAIC0zMzk3LDQ2ICszMzY5LDQ2IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQljLT5vcF9ieXRlcyA9IGRlZl9vcF9ieXRlczsKLQljLT5hZF9ieXRlcyA9IGRlZl9hZF9ieXRlczsKKwljdHh0LT5vcF9ieXRlcyA9IGRlZl9vcF9ieXRlczsKKwljdHh0LT5hZF9ieXRlcyA9IGRlZl9hZF9ieXRlczsKIAogCS8qIExlZ2FjeSBwcmVmaXhlcy4gKi8KIAlmb3IgKDs7KSB7Ci0JCXN3aXRjaCAoYy0+YiA9IGluc25fZmV0Y2godTgsIDEsIGMtPmVpcCkpIHsKKwkJc3dpdGNoIChjdHh0LT5iID0gaW5zbl9mZXRjaCh1OCwgMSwgY3R4dC0+X2VpcCkpIHsKIAkJY2FzZSAweDY2OgkvKiBvcGVyYW5kLXNpemUgb3ZlcnJpZGUgKi8KIAkJCW9wX3ByZWZpeCA9IHRydWU7CiAJCQkvKiBzd2l0Y2ggYmV0d2VlbiAyLzQgYnl0ZXMgKi8KLQkJCWMtPm9wX2J5dGVzID0gZGVmX29wX2J5dGVzIF4gNjsKKwkJCWN0eHQtPm9wX2J5dGVzID0gZGVmX29wX2J5dGVzIF4gNjsKIAkJCWJyZWFrOwogCQljYXNlIDB4Njc6CS8qIGFkZHJlc3Mtc2l6ZSBvdmVycmlkZSAqLwogCQkJaWYgKG1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCkKIAkJCQkvKiBzd2l0Y2ggYmV0d2VlbiA0LzggYnl0ZXMgKi8KLQkJCQljLT5hZF9ieXRlcyA9IGRlZl9hZF9ieXRlcyBeIDEyOworCQkJCWN0eHQtPmFkX2J5dGVzID0gZGVmX2FkX2J5dGVzIF4gMTI7CiAJCQllbHNlCiAJCQkJLyogc3dpdGNoIGJldHdlZW4gMi80IGJ5dGVzICovCi0JCQkJYy0+YWRfYnl0ZXMgPSBkZWZfYWRfYnl0ZXMgXiA2OworCQkJCWN0eHQtPmFkX2J5dGVzID0gZGVmX2FkX2J5dGVzIF4gNjsKIAkJCWJyZWFrOwogCQljYXNlIDB4MjY6CS8qIEVTIG92ZXJyaWRlICovCiAJCWNhc2UgMHgyZToJLyogQ1Mgb3ZlcnJpZGUgKi8KIAkJY2FzZSAweDM2OgkvKiBTUyBvdmVycmlkZSAqLwogCQljYXNlIDB4M2U6CS8qIERTIG92ZXJyaWRlICovCi0JCQlzZXRfc2VnX292ZXJyaWRlKGMsIChjLT5iID4+IDMpICYgMyk7CisJCQlzZXRfc2VnX292ZXJyaWRlKGN0eHQsIChjdHh0LT5iID4+IDMpICYgMyk7CiAJCQlicmVhazsKIAkJY2FzZSAweDY0OgkvKiBGUyBvdmVycmlkZSAqLwogCQljYXNlIDB4NjU6CS8qIEdTIG92ZXJyaWRlICovCi0JCQlzZXRfc2VnX292ZXJyaWRlKGMsIGMtPmIgJiA3KTsKKwkJCXNldF9zZWdfb3ZlcnJpZGUoY3R4dCwgY3R4dC0+YiAmIDcpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg0MCAuLi4gMHg0ZjogLyogUkVYICovCiAJCQlpZiAobW9kZSAhPSBYODZFTVVMX01PREVfUFJPVDY0KQogCQkJCWdvdG8gZG9uZV9wcmVmaXhlczsKLQkJCWMtPnJleF9wcmVmaXggPSBjLT5iOworCQkJY3R4dC0+cmV4X3ByZWZpeCA9IGN0eHQtPmI7CiAJCQljb250aW51ZTsKIAkJY2FzZSAweGYwOgkvKiBMT0NLICovCi0JCQljLT5sb2NrX3ByZWZpeCA9IDE7CisJCQljdHh0LT5sb2NrX3ByZWZpeCA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSAweGYyOgkvKiBSRVBORS9SRVBOWiAqLwogCQljYXNlIDB4ZjM6CS8qIFJFUC9SRVBFL1JFUFogKi8KLQkJCWMtPnJlcF9wcmVmaXggPSBjLT5iOworCQkJY3R4dC0+cmVwX3ByZWZpeCA9IGN0eHQtPmI7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWdvdG8gZG9uZV9wcmVmaXhlczsKQEAgLTM0NDQsNTAgKzM0MTYsNTAgQEAKIAogCQkvKiBBbnkgbGVnYWN5IHByZWZpeCBhZnRlciBhIFJFWCBwcmVmaXggbnVsbGlmaWVzIGl0cyBlZmZlY3QuICovCiAKLQkJYy0+cmV4X3ByZWZpeCA9IDA7CisJCWN0eHQtPnJleF9wcmVmaXggPSAwOwogCX0KIAogZG9uZV9wcmVmaXhlczoKIAogCS8qIFJFWCBwcmVmaXguICovCi0JaWYgKGMtPnJleF9wcmVmaXggJiA4KQotCQljLT5vcF9ieXRlcyA9IDg7CS8qIFJFWC5XICovCisJaWYgKGN0eHQtPnJleF9wcmVmaXggJiA4KQorCQljdHh0LT5vcF9ieXRlcyA9IDg7CS8qIFJFWC5XICovCiAKIAkvKiBPcGNvZGUgYnl0ZShzKS4gKi8KLQlvcGNvZGUgPSBvcGNvZGVfdGFibGVbYy0+Yl07CisJb3Bjb2RlID0gb3Bjb2RlX3RhYmxlW2N0eHQtPmJdOwogCS8qIFR3by1ieXRlIG9wY29kZT8gKi8KLQlpZiAoYy0+YiA9PSAweDBmKSB7Ci0JCWMtPnR3b2J5dGUgPSAxOwotCQljLT5iID0gaW5zbl9mZXRjaCh1OCwgMSwgYy0+ZWlwKTsKLQkJb3Bjb2RlID0gdHdvYnl0ZV90YWJsZVtjLT5iXTsKKwlpZiAoY3R4dC0+YiA9PSAweDBmKSB7CisJCWN0eHQtPnR3b2J5dGUgPSAxOworCQljdHh0LT5iID0gaW5zbl9mZXRjaCh1OCwgMSwgY3R4dC0+X2VpcCk7CisJCW9wY29kZSA9IHR3b2J5dGVfdGFibGVbY3R4dC0+Yl07CiAJfQotCWMtPmQgPSBvcGNvZGUuZmxhZ3M7CisJY3R4dC0+ZCA9IG9wY29kZS5mbGFnczsKIAotCXdoaWxlIChjLT5kICYgR3JvdXBNYXNrKSB7Ci0JCXN3aXRjaCAoYy0+ZCAmIEdyb3VwTWFzaykgeworCXdoaWxlIChjdHh0LT5kICYgR3JvdXBNYXNrKSB7CisJCXN3aXRjaCAoY3R4dC0+ZCAmIEdyb3VwTWFzaykgewogCQljYXNlIEdyb3VwOgotCQkJYy0+bW9kcm0gPSBpbnNuX2ZldGNoKHU4LCAxLCBjLT5laXApOwotCQkJLS1jLT5laXA7Ci0JCQlnb2Zmc2V0ID0gKGMtPm1vZHJtID4+IDMpICYgNzsKKwkJCWN0eHQtPm1vZHJtID0gaW5zbl9mZXRjaCh1OCwgMSwgY3R4dC0+X2VpcCk7CisJCQktLWN0eHQtPl9laXA7CisJCQlnb2Zmc2V0ID0gKGN0eHQtPm1vZHJtID4+IDMpICYgNzsKIAkJCW9wY29kZSA9IG9wY29kZS51Lmdyb3VwW2dvZmZzZXRdOwogCQkJYnJlYWs7CiAJCWNhc2UgR3JvdXBEdWFsOgotCQkJYy0+bW9kcm0gPSBpbnNuX2ZldGNoKHU4LCAxLCBjLT5laXApOwotCQkJLS1jLT5laXA7Ci0JCQlnb2Zmc2V0ID0gKGMtPm1vZHJtID4+IDMpICYgNzsKLQkJCWlmICgoYy0+bW9kcm0gPj4gNikgPT0gMykKKwkJCWN0eHQtPm1vZHJtID0gaW5zbl9mZXRjaCh1OCwgMSwgY3R4dC0+X2VpcCk7CisJCQktLWN0eHQtPl9laXA7CisJCQlnb2Zmc2V0ID0gKGN0eHQtPm1vZHJtID4+IDMpICYgNzsKKwkJCWlmICgoY3R4dC0+bW9kcm0gPj4gNikgPT0gMykKIAkJCQlvcGNvZGUgPSBvcGNvZGUudS5nZHVhbC0+bW9kM1tnb2Zmc2V0XTsKIAkJCWVsc2UKIAkJCQlvcGNvZGUgPSBvcGNvZGUudS5nZHVhbC0+bW9kMDEyW2dvZmZzZXRdOwogCQkJYnJlYWs7CiAJCWNhc2UgUk1FeHQ6Ci0JCQlnb2Zmc2V0ID0gYy0+bW9kcm0gJiA3OworCQkJZ29mZnNldCA9IGN0eHQtPm1vZHJtICYgNzsKIAkJCW9wY29kZSA9IG9wY29kZS51Lmdyb3VwW2dvZmZzZXRdOwogCQkJYnJlYWs7CiAJCWNhc2UgUHJlZml4OgotCQkJaWYgKGMtPnJlcF9wcmVmaXggJiYgb3BfcHJlZml4KQorCQkJaWYgKGN0eHQtPnJlcF9wcmVmaXggJiYgb3BfcHJlZml4KQogCQkJCXJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKLQkJCXNpbWRfcHJlZml4ID0gb3BfcHJlZml4ID8gMHg2NiA6IGMtPnJlcF9wcmVmaXg7CisJCQlzaW1kX3ByZWZpeCA9IG9wX3ByZWZpeCA/IDB4NjYgOiBjdHh0LT5yZXBfcHJlZml4OwogCQkJc3dpdGNoIChzaW1kX3ByZWZpeCkgewogCQkJY2FzZSAweDAwOiBvcGNvZGUgPSBvcGNvZGUudS5ncHJlZml4LT5wZnhfbm87IGJyZWFrOwogCQkJY2FzZSAweDY2OiBvcGNvZGUgPSBvcGNvZGUudS5ncHJlZml4LT5wZnhfNjY7IGJyZWFrOwpAQCAtMzQ5OSw2NCArMzQ3MSw2MSBAQAogCQkJcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOwogCQl9CiAKLQkJYy0+ZCAmPSB+R3JvdXBNYXNrOwotCQljLT5kIHw9IG9wY29kZS5mbGFnczsKKwkJY3R4dC0+ZCAmPSB+R3JvdXBNYXNrOworCQljdHh0LT5kIHw9IG9wY29kZS5mbGFnczsKIAl9CiAKLQljLT5leGVjdXRlID0gb3Bjb2RlLnUuZXhlY3V0ZTsKLQljLT5jaGVja19wZXJtID0gb3Bjb2RlLmNoZWNrX3Blcm07Ci0JYy0+aW50ZXJjZXB0ID0gb3Bjb2RlLmludGVyY2VwdDsKKwljdHh0LT5leGVjdXRlID0gb3Bjb2RlLnUuZXhlY3V0ZTsKKwljdHh0LT5jaGVja19wZXJtID0gb3Bjb2RlLmNoZWNrX3Blcm07CisJY3R4dC0+aW50ZXJjZXB0ID0gb3Bjb2RlLmludGVyY2VwdDsKIAogCS8qIFVucmVjb2duaXNlZD8gKi8KLQlpZiAoYy0+ZCA9PSAwIHx8IChjLT5kICYgVW5kZWZpbmVkKSkKKwlpZiAoY3R4dC0+ZCA9PSAwIHx8IChjdHh0LT5kICYgVW5kZWZpbmVkKSkKIAkJcmV0dXJuIC0xOwogCi0JaWYgKCEoYy0+ZCAmIFZlbmRvclNwZWNpZmljKSAmJiBjdHh0LT5vbmx5X3ZlbmRvcl9zcGVjaWZpY19pbnNuKQorCWlmICghKGN0eHQtPmQgJiBWZW5kb3JTcGVjaWZpYykgJiYgY3R4dC0+b25seV92ZW5kb3Jfc3BlY2lmaWNfaW5zbikKIAkJcmV0dXJuIC0xOwogCi0JaWYgKG1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCAmJiAoYy0+ZCAmIFN0YWNrKSkKLQkJYy0+b3BfYnl0ZXMgPSA4OworCWlmIChtb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQgJiYgKGN0eHQtPmQgJiBTdGFjaykpCisJCWN0eHQtPm9wX2J5dGVzID0gODsKIAotCWlmIChjLT5kICYgT3AzMjY0KSB7CisJaWYgKGN0eHQtPmQgJiBPcDMyNjQpIHsKIAkJaWYgKG1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCkKLQkJCWMtPm9wX2J5dGVzID0gODsKKwkJCWN0eHQtPm9wX2J5dGVzID0gODsKIAkJZWxzZQotCQkJYy0+b3BfYnl0ZXMgPSA0OworCQkJY3R4dC0+b3BfYnl0ZXMgPSA0OwogCX0KIAotCWlmIChjLT5kICYgU3NlKQotCQljLT5vcF9ieXRlcyA9IDE2OworCWlmIChjdHh0LT5kICYgU3NlKQorCQljdHh0LT5vcF9ieXRlcyA9IDE2OwogCiAJLyogTW9kUk0gYW5kIFNJQiBieXRlcy4gKi8KLQlpZiAoYy0+ZCAmIE1vZFJNKSB7Ci0JCXJjID0gZGVjb2RlX21vZHJtKGN0eHQsIG9wcywgJm1lbW9wKTsKLQkJaWYgKCFjLT5oYXNfc2VnX292ZXJyaWRlKQotCQkJc2V0X3NlZ19vdmVycmlkZShjLCBjLT5tb2RybV9zZWcpOwotCX0gZWxzZSBpZiAoYy0+ZCAmIE1lbUFicykKLQkJcmMgPSBkZWNvZGVfYWJzKGN0eHQsIG9wcywgJm1lbW9wKTsKKwlpZiAoY3R4dC0+ZCAmIE1vZFJNKSB7CisJCXJjID0gZGVjb2RlX21vZHJtKGN0eHQsICZtZW1vcCk7CisJCWlmICghY3R4dC0+aGFzX3NlZ19vdmVycmlkZSkKKwkJCXNldF9zZWdfb3ZlcnJpZGUoY3R4dCwgY3R4dC0+bW9kcm1fc2VnKTsKKwl9IGVsc2UgaWYgKGN0eHQtPmQgJiBNZW1BYnMpCisJCXJjID0gZGVjb2RlX2FicyhjdHh0LCAmbWVtb3ApOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlnb3RvIGRvbmU7CiAKLQlpZiAoIWMtPmhhc19zZWdfb3ZlcnJpZGUpCi0JCXNldF9zZWdfb3ZlcnJpZGUoYywgVkNQVV9TUkVHX0RTKTsKKwlpZiAoIWN0eHQtPmhhc19zZWdfb3ZlcnJpZGUpCisJCXNldF9zZWdfb3ZlcnJpZGUoY3R4dCwgVkNQVV9TUkVHX0RTKTsKIAotCW1lbW9wLmFkZHIubWVtLnNlZyA9IHNlZ19vdmVycmlkZShjdHh0LCBjKTsKKwltZW1vcC5hZGRyLm1lbS5zZWcgPSBzZWdfb3ZlcnJpZGUoY3R4dCk7CiAKLQlpZiAobWVtb3AudHlwZSA9PSBPUF9NRU0gJiYgYy0+YWRfYnl0ZXMgIT0gOCkKKwlpZiAobWVtb3AudHlwZSA9PSBPUF9NRU0gJiYgY3R4dC0+YWRfYnl0ZXMgIT0gOCkKIAkJbWVtb3AuYWRkci5tZW0uZWEgPSAodTMyKW1lbW9wLmFkZHIubWVtLmVhOwogCi0JaWYgKG1lbW9wLnR5cGUgPT0gT1BfTUVNICYmIGMtPnJpcF9yZWxhdGl2ZSkKLQkJbWVtb3AuYWRkci5tZW0uZWEgKz0gYy0+ZWlwOwotCiAJLyoKIAkgKiBEZWNvZGUgYW5kIGZldGNoIHRoZSBzb3VyY2Ugb3BlcmFuZDogcmVnaXN0ZXIsIG1lbW9yeQogCSAqIG9yIGltbWVkaWF0ZS4KIAkgKi8KLQlzd2l0Y2ggKGMtPmQgJiBTcmNNYXNrKSB7CisJc3dpdGNoIChjdHh0LT5kICYgU3JjTWFzaykgewogCWNhc2UgU3JjTm9uZToKIAkJYnJlYWs7CiAJY2FzZSBTcmNSZWc6Ci0JCWRlY29kZV9yZWdpc3Rlcl9vcGVyYW5kKGN0eHQsICZjLT5zcmMsIGMsIDApOworCQlkZWNvZGVfcmVnaXN0ZXJfb3BlcmFuZChjdHh0LCAmY3R4dC0+c3JjLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTcmNNZW0xNjoKIAkJbWVtb3AuYnl0ZXMgPSAyOwpAQCAtMzU2NSw1NCArMzUzNCw2MSBAQAogCQltZW1vcC5ieXRlcyA9IDQ7CiAJCWdvdG8gc3JjbWVtX2NvbW1vbjsKIAljYXNlIFNyY01lbToKLQkJbWVtb3AuYnl0ZXMgPSAoYy0+ZCAmIEJ5dGVPcCkgPyAxIDoKLQkJCQkJCQkgICBjLT5vcF9ieXRlczsKKwkJbWVtb3AuYnl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDoKKwkJCQkJCQkgICBjdHh0LT5vcF9ieXRlczsKIAlzcmNtZW1fY29tbW9uOgotCQljLT5zcmMgPSBtZW1vcDsKKwkJY3R4dC0+c3JjID0gbWVtb3A7CisJCW1lbW9wcCA9ICZjdHh0LT5zcmM7CiAJCWJyZWFrOwogCWNhc2UgU3JjSW1tVTE2OgotCQlyYyA9IGRlY29kZV9pbW0oY3R4dCwgJmMtPnNyYywgMiwgZmFsc2UpOworCQlyYyA9IGRlY29kZV9pbW0oY3R4dCwgJmN0eHQtPnNyYywgMiwgZmFsc2UpOwogCQlicmVhazsKIAljYXNlIFNyY0ltbToKLQkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsICZjLT5zcmMsIGltbV9zaXplKGMpLCB0cnVlKTsKKwkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsICZjdHh0LT5zcmMsIGltbV9zaXplKGN0eHQpLCB0cnVlKTsKIAkJYnJlYWs7CiAJY2FzZSBTcmNJbW1VOgotCQlyYyA9IGRlY29kZV9pbW0oY3R4dCwgJmMtPnNyYywgaW1tX3NpemUoYyksIGZhbHNlKTsKKwkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsICZjdHh0LT5zcmMsIGltbV9zaXplKGN0eHQpLCBmYWxzZSk7CiAJCWJyZWFrOwogCWNhc2UgU3JjSW1tQnl0ZToKLQkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsICZjLT5zcmMsIDEsIHRydWUpOworCQlyYyA9IGRlY29kZV9pbW0oY3R4dCwgJmN0eHQtPnNyYywgMSwgdHJ1ZSk7CiAJCWJyZWFrOwogCWNhc2UgU3JjSW1tVUJ5dGU6Ci0JCXJjID0gZGVjb2RlX2ltbShjdHh0LCAmYy0+c3JjLCAxLCBmYWxzZSk7CisJCXJjID0gZGVjb2RlX2ltbShjdHh0LCAmY3R4dC0+c3JjLCAxLCBmYWxzZSk7CiAJCWJyZWFrOwogCWNhc2UgU3JjQWNjOgotCQljLT5zcmMudHlwZSA9IE9QX1JFRzsKLQkJYy0+c3JjLmJ5dGVzID0gKGMtPmQgJiBCeXRlT3ApID8gMSA6IGMtPm9wX2J5dGVzOwotCQljLT5zcmMuYWRkci5yZWcgPSAmYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXTsKLQkJZmV0Y2hfcmVnaXN0ZXJfb3BlcmFuZCgmYy0+c3JjKTsKKwkJY3R4dC0+c3JjLnR5cGUgPSBPUF9SRUc7CisJCWN0eHQtPnNyYy5ieXRlcyA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKKwkJY3R4dC0+c3JjLmFkZHIucmVnID0gJmN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JBWF07CisJCWZldGNoX3JlZ2lzdGVyX29wZXJhbmQoJmN0eHQtPnNyYyk7CiAJCWJyZWFrOwogCWNhc2UgU3JjT25lOgotCQljLT5zcmMuYnl0ZXMgPSAxOwotCQljLT5zcmMudmFsID0gMTsKKwkJY3R4dC0+c3JjLmJ5dGVzID0gMTsKKwkJY3R4dC0+c3JjLnZhbCA9IDE7CiAJCWJyZWFrOwogCWNhc2UgU3JjU0k6Ci0JCWMtPnNyYy50eXBlID0gT1BfTUVNOwotCQljLT5zcmMuYnl0ZXMgPSAoYy0+ZCAmIEJ5dGVPcCkgPyAxIDogYy0+b3BfYnl0ZXM7Ci0JCWMtPnNyYy5hZGRyLm1lbS5lYSA9Ci0JCQlyZWdpc3Rlcl9hZGRyZXNzKGMsIGMtPnJlZ3NbVkNQVV9SRUdTX1JTSV0pOwotCQljLT5zcmMuYWRkci5tZW0uc2VnID0gc2VnX292ZXJyaWRlKGN0eHQsIGMpOwotCQljLT5zcmMudmFsID0gMDsKKwkJY3R4dC0+c3JjLnR5cGUgPSBPUF9NRU07CisJCWN0eHQtPnNyYy5ieXRlcyA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKKwkJY3R4dC0+c3JjLmFkZHIubWVtLmVhID0KKwkJCXJlZ2lzdGVyX2FkZHJlc3MoY3R4dCwgY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUlNJXSk7CisJCWN0eHQtPnNyYy5hZGRyLm1lbS5zZWcgPSBzZWdfb3ZlcnJpZGUoY3R4dCk7CisJCWN0eHQtPnNyYy52YWwgPSAwOwogCQlicmVhazsKIAljYXNlIFNyY0ltbUZBZGRyOgotCQljLT5zcmMudHlwZSA9IE9QX0lNTTsKLQkJYy0+c3JjLmFkZHIubWVtLmVhID0gYy0+ZWlwOwotCQljLT5zcmMuYnl0ZXMgPSBjLT5vcF9ieXRlcyArIDI7Ci0JCWluc25fZmV0Y2hfYXJyKGMtPnNyYy52YWxwdHIsIGMtPnNyYy5ieXRlcywgYy0+ZWlwKTsKKwkJY3R4dC0+c3JjLnR5cGUgPSBPUF9JTU07CisJCWN0eHQtPnNyYy5hZGRyLm1lbS5lYSA9IGN0eHQtPl9laXA7CisJCWN0eHQtPnNyYy5ieXRlcyA9IGN0eHQtPm9wX2J5dGVzICsgMjsKKwkJaW5zbl9mZXRjaF9hcnIoY3R4dC0+c3JjLnZhbHB0ciwgY3R4dC0+c3JjLmJ5dGVzLCBjdHh0LT5fZWlwKTsKIAkJYnJlYWs7CiAJY2FzZSBTcmNNZW1GQWRkcjoKLQkJbWVtb3AuYnl0ZXMgPSBjLT5vcF9ieXRlcyArIDI7CisJCW1lbW9wLmJ5dGVzID0gY3R4dC0+b3BfYnl0ZXMgKyAyOwogCQlnb3RvIHNyY21lbV9jb21tb247CiAJCWJyZWFrOworCWNhc2UgU3JjRFg6CisJCWN0eHQtPnNyYy50eXBlID0gT1BfUkVHOworCQljdHh0LT5zcmMuYnl0ZXMgPSAyOworCQljdHh0LT5zcmMuYWRkci5yZWcgPSAmY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKKwkJZmV0Y2hfcmVnaXN0ZXJfb3BlcmFuZCgmY3R4dC0+c3JjKTsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCkBAIC0zNjIyLDIyICszNTk4LDIyIEBACiAJICogRGVjb2RlIGFuZCBmZXRjaCB0aGUgc2Vjb25kIHNvdXJjZSBvcGVyYW5kOiByZWdpc3RlciwgbWVtb3J5CiAJICogb3IgaW1tZWRpYXRlLgogCSAqLwotCXN3aXRjaCAoYy0+ZCAmIFNyYzJNYXNrKSB7CisJc3dpdGNoIChjdHh0LT5kICYgU3JjMk1hc2spIHsKIAljYXNlIFNyYzJOb25lOgogCQlicmVhazsKIAljYXNlIFNyYzJDTDoKLQkJYy0+c3JjMi5ieXRlcyA9IDE7Ci0JCWMtPnNyYzIudmFsID0gYy0+cmVnc1tWQ1BVX1JFR1NfUkNYXSAmIDB4ODsKKwkJY3R4dC0+c3JjMi5ieXRlcyA9IDE7CisJCWN0eHQtPnNyYzIudmFsID0gY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkNYXSAmIDB4ODsKIAkJYnJlYWs7CiAJY2FzZSBTcmMySW1tQnl0ZToKLQkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsICZjLT5zcmMyLCAxLCB0cnVlKTsKKwkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsICZjdHh0LT5zcmMyLCAxLCB0cnVlKTsKIAkJYnJlYWs7CiAJY2FzZSBTcmMyT25lOgotCQljLT5zcmMyLmJ5dGVzID0gMTsKLQkJYy0+c3JjMi52YWwgPSAxOworCQljdHh0LT5zcmMyLmJ5dGVzID0gMTsKKwkJY3R4dC0+c3JjMi52YWwgPSAxOwogCQlicmVhazsKIAljYXNlIFNyYzJJbW06Ci0JCXJjID0gZGVjb2RlX2ltbShjdHh0LCAmYy0+c3JjMiwgaW1tX3NpemUoYyksIHRydWUpOworCQlyYyA9IGRlY29kZV9pbW0oY3R4dCwgJmN0eHQtPnNyYzIsIGltbV9zaXplKGN0eHQpLCB0cnVlKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0zNjQ1LDU4ICszNjIxLDY2IEBACiAJCWdvdG8gZG9uZTsKIAogCS8qIERlY29kZSBhbmQgZmV0Y2ggdGhlIGRlc3RpbmF0aW9uIG9wZXJhbmQ6IHJlZ2lzdGVyIG9yIG1lbW9yeS4gKi8KLQlzd2l0Y2ggKGMtPmQgJiBEc3RNYXNrKSB7CisJc3dpdGNoIChjdHh0LT5kICYgRHN0TWFzaykgewogCWNhc2UgRHN0UmVnOgotCQlkZWNvZGVfcmVnaXN0ZXJfb3BlcmFuZChjdHh0LCAmYy0+ZHN0LCBjLAotCQkJIGMtPnR3b2J5dGUgJiYgKGMtPmIgPT0gMHhiNiB8fCBjLT5iID09IDB4YjcpKTsKKwkJZGVjb2RlX3JlZ2lzdGVyX29wZXJhbmQoY3R4dCwgJmN0eHQtPmRzdCwKKwkJCSBjdHh0LT50d29ieXRlICYmIChjdHh0LT5iID09IDB4YjYgfHwgY3R4dC0+YiA9PSAweGI3KSk7CiAJCWJyZWFrOwogCWNhc2UgRHN0SW1tVUJ5dGU6Ci0JCWMtPmRzdC50eXBlID0gT1BfSU1NOwotCQljLT5kc3QuYWRkci5tZW0uZWEgPSBjLT5laXA7Ci0JCWMtPmRzdC5ieXRlcyA9IDE7Ci0JCWMtPmRzdC52YWwgPSBpbnNuX2ZldGNoKHU4LCAxLCBjLT5laXApOworCQljdHh0LT5kc3QudHlwZSA9IE9QX0lNTTsKKwkJY3R4dC0+ZHN0LmFkZHIubWVtLmVhID0gY3R4dC0+X2VpcDsKKwkJY3R4dC0+ZHN0LmJ5dGVzID0gMTsKKwkJY3R4dC0+ZHN0LnZhbCA9IGluc25fZmV0Y2godTgsIDEsIGN0eHQtPl9laXApOwogCQlicmVhazsKIAljYXNlIERzdE1lbToKIAljYXNlIERzdE1lbTY0OgotCQljLT5kc3QgPSBtZW1vcDsKLQkJaWYgKChjLT5kICYgRHN0TWFzaykgPT0gRHN0TWVtNjQpCi0JCQljLT5kc3QuYnl0ZXMgPSA4OworCQljdHh0LT5kc3QgPSBtZW1vcDsKKwkJbWVtb3BwID0gJmN0eHQtPmRzdDsKKwkJaWYgKChjdHh0LT5kICYgRHN0TWFzaykgPT0gRHN0TWVtNjQpCisJCQljdHh0LT5kc3QuYnl0ZXMgPSA4OwogCQllbHNlCi0JCQljLT5kc3QuYnl0ZXMgPSAoYy0+ZCAmIEJ5dGVPcCkgPyAxIDogYy0+b3BfYnl0ZXM7Ci0JCWlmIChjLT5kICYgQml0T3ApCi0JCQlmZXRjaF9iaXRfb3BlcmFuZChjKTsKLQkJYy0+ZHN0Lm9yaWdfdmFsID0gYy0+ZHN0LnZhbDsKKwkJCWN0eHQtPmRzdC5ieXRlcyA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKKwkJaWYgKGN0eHQtPmQgJiBCaXRPcCkKKwkJCWZldGNoX2JpdF9vcGVyYW5kKGN0eHQpOworCQljdHh0LT5kc3Qub3JpZ192YWwgPSBjdHh0LT5kc3QudmFsOwogCQlicmVhazsKIAljYXNlIERzdEFjYzoKLQkJYy0+ZHN0LnR5cGUgPSBPUF9SRUc7Ci0JCWMtPmRzdC5ieXRlcyA9IChjLT5kICYgQnl0ZU9wKSA/IDEgOiBjLT5vcF9ieXRlczsKLQkJYy0+ZHN0LmFkZHIucmVnID0gJmMtPnJlZ3NbVkNQVV9SRUdTX1JBWF07Ci0JCWZldGNoX3JlZ2lzdGVyX29wZXJhbmQoJmMtPmRzdCk7Ci0JCWMtPmRzdC5vcmlnX3ZhbCA9IGMtPmRzdC52YWw7CisJCWN0eHQtPmRzdC50eXBlID0gT1BfUkVHOworCQljdHh0LT5kc3QuYnl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7CisJCWN0eHQtPmRzdC5hZGRyLnJlZyA9ICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQVhdOworCQlmZXRjaF9yZWdpc3Rlcl9vcGVyYW5kKCZjdHh0LT5kc3QpOworCQljdHh0LT5kc3Qub3JpZ192YWwgPSBjdHh0LT5kc3QudmFsOwogCQlicmVhazsKIAljYXNlIERzdERJOgotCQljLT5kc3QudHlwZSA9IE9QX01FTTsKLQkJYy0+ZHN0LmJ5dGVzID0gKGMtPmQgJiBCeXRlT3ApID8gMSA6IGMtPm9wX2J5dGVzOwotCQljLT5kc3QuYWRkci5tZW0uZWEgPQotCQkJcmVnaXN0ZXJfYWRkcmVzcyhjLCBjLT5yZWdzW1ZDUFVfUkVHU19SREldKTsKLQkJYy0+ZHN0LmFkZHIubWVtLnNlZyA9IFZDUFVfU1JFR19FUzsKLQkJYy0+ZHN0LnZhbCA9IDA7CisJCWN0eHQtPmRzdC50eXBlID0gT1BfTUVNOworCQljdHh0LT5kc3QuYnl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7CisJCWN0eHQtPmRzdC5hZGRyLm1lbS5lYSA9CisJCQlyZWdpc3Rlcl9hZGRyZXNzKGN0eHQsIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JESV0pOworCQljdHh0LT5kc3QuYWRkci5tZW0uc2VnID0gVkNQVV9TUkVHX0VTOworCQljdHh0LT5kc3QudmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBEc3REWDoKKwkJY3R4dC0+ZHN0LnR5cGUgPSBPUF9SRUc7CisJCWN0eHQtPmRzdC5ieXRlcyA9IDI7CisJCWN0eHQtPmRzdC5hZGRyLnJlZyA9ICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SRFhdOworCQlmZXRjaF9yZWdpc3Rlcl9vcGVyYW5kKCZjdHh0LT5kc3QpOwogCQlicmVhazsKIAljYXNlIEltcGxpY2l0T3BzOgogCQkvKiBTcGVjaWFsIGluc3RydWN0aW9ucyBkbyB0aGVpciBvd24gb3BlcmFuZCBkZWNvZGluZy4gKi8KIAlkZWZhdWx0OgotCQljLT5kc3QudHlwZSA9IE9QX05PTkU7IC8qIERpc2FibGUgd3JpdGViYWNrLiAqLwotCQlyZXR1cm4gMDsKKwkJY3R4dC0+ZHN0LnR5cGUgPSBPUF9OT05FOyAvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KKwkJYnJlYWs7CiAJfQogCiBkb25lOgorCWlmIChtZW1vcHAgJiYgbWVtb3BwLT50eXBlID09IE9QX01FTSAmJiBjdHh0LT5yaXBfcmVsYXRpdmUpCisJCW1lbW9wcC0+YWRkci5tZW0uZWEgKz0gY3R4dC0+X2VpcDsKKwogCXJldHVybiAocmMgPT0gWDg2RU1VTF9VTkhBTkRMRUFCTEUpID8gRU1VTEFUSU9OX0ZBSUxFRCA6IEVNVUxBVElPTl9PSzsKIH0KIAogc3RhdGljIGJvb2wgc3RyaW5nX2luc25fY29tcGxldGVkKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwotCiAJLyogVGhlIHNlY29uZCB0ZXJtaW5hdGlvbiBjb25kaXRpb24gb25seSBhcHBsaWVzIGZvciBSRVBFCiAJICogYW5kIFJFUE5FLiBUZXN0IGlmIHRoZSByZXBlYXQgc3RyaW5nIG9wZXJhdGlvbiBwcmVmaXggaXMKIAkgKiBSRVBFL1JFUFogb3IgUkVQTkUvUkVQTlogYW5kIGlmIGl0J3MgdGhlIGNhc2UgaXQgdGVzdHMgdGhlCkBAIC0zNzA0LDMwNCArMzY4OCwyMzIgQEAKIAkgKiAJLSBpZiBSRVBFL1JFUFogYW5kIFpGID0gMCB0aGVuIGRvbmUKIAkgKiAJLSBpZiBSRVBORS9SRVBOWiBhbmQgWkYgPSAxIHRoZW4gZG9uZQogCSAqLwotCWlmICgoKGMtPmIgPT0gMHhhNikgfHwgKGMtPmIgPT0gMHhhNykgfHwKLQkgICAgIChjLT5iID09IDB4YWUpIHx8IChjLT5iID09IDB4YWYpKQotCSAgICAmJiAoKChjLT5yZXBfcHJlZml4ID09IFJFUEVfUFJFRklYKSAmJgorCWlmICgoKGN0eHQtPmIgPT0gMHhhNikgfHwgKGN0eHQtPmIgPT0gMHhhNykgfHwKKwkgICAgIChjdHh0LT5iID09IDB4YWUpIHx8IChjdHh0LT5iID09IDB4YWYpKQorCSAgICAmJiAoKChjdHh0LT5yZXBfcHJlZml4ID09IFJFUEVfUFJFRklYKSAmJgogCQkgKChjdHh0LT5lZmxhZ3MgJiBFRkxHX1pGKSA9PSAwKSkKLQkJfHwgKChjLT5yZXBfcHJlZml4ID09IFJFUE5FX1BSRUZJWCkgJiYKKwkJfHwgKChjdHh0LT5yZXBfcHJlZml4ID09IFJFUE5FX1BSRUZJWCkgJiYKIAkJICAgICgoY3R4dC0+ZWZsYWdzICYgRUZMR19aRikgPT0gRUZMR19aRikpKSkKIAkJcmV0dXJuIHRydWU7CiAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLWludAoteDg2X2VtdWxhdGVfaW5zbihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK2ludCB4ODZfZW11bGF0ZV9pbnNuKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewogCXN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcyA9IGN0eHQtPm9wczsKIAl1NjQgbXNyX2RhdGE7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CiAJaW50IHJjID0gWDg2RU1VTF9DT05USU5VRTsKLQlpbnQgc2F2ZWRfZHN0X3R5cGUgPSBjLT5kc3QudHlwZTsKLQlpbnQgaXJxOyAvKiBVc2VkIGZvciBpbnQgMywgaW50LCBhbmQgaW50byAqLworCWludCBzYXZlZF9kc3RfdHlwZSA9IGN0eHQtPmRzdC50eXBlOwogCi0JY3R4dC0+ZGVjb2RlLm1lbV9yZWFkLnBvcyA9IDA7CisJY3R4dC0+bWVtX3JlYWQucG9zID0gMDsKIAotCWlmIChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQgJiYgKGMtPmQgJiBObzY0KSkgeworCWlmIChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQgJiYgKGN0eHQtPmQgJiBObzY0KSkgewogCQlyYyA9IGVtdWxhdGVfdWQoY3R4dCk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKIAkvKiBMT0NLIHByZWZpeCBpcyBhbGxvd2VkIG9ubHkgd2l0aCBzb21lIGluc3RydWN0aW9ucyAqLwotCWlmIChjLT5sb2NrX3ByZWZpeCAmJiAoIShjLT5kICYgTG9jaykgfHwgYy0+ZHN0LnR5cGUgIT0gT1BfTUVNKSkgeworCWlmIChjdHh0LT5sb2NrX3ByZWZpeCAmJiAoIShjdHh0LT5kICYgTG9jaykgfHwgY3R4dC0+ZHN0LnR5cGUgIT0gT1BfTUVNKSkgewogCQlyYyA9IGVtdWxhdGVfdWQoY3R4dCk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAoKGMtPmQgJiBTcmNNYXNrKSA9PSBTcmNNZW1GQWRkciAmJiBjLT5zcmMudHlwZSAhPSBPUF9NRU0pIHsKKwlpZiAoKGN0eHQtPmQgJiBTcmNNYXNrKSA9PSBTcmNNZW1GQWRkciAmJiBjdHh0LT5zcmMudHlwZSAhPSBPUF9NRU0pIHsKIAkJcmMgPSBlbXVsYXRlX3VkKGN0eHQpOwogCQlnb3RvIGRvbmU7CiAJfQogCi0JaWYgKChjLT5kICYgU3NlKQorCWlmICgoY3R4dC0+ZCAmIFNzZSkKIAkgICAgJiYgKChvcHMtPmdldF9jcihjdHh0LCAwKSAmIFg4Nl9DUjBfRU0pCiAJCXx8ICEob3BzLT5nZXRfY3IoY3R4dCwgNCkgJiBYODZfQ1I0X09TRlhTUikpKSB7CiAJCXJjID0gZW11bGF0ZV91ZChjdHh0KTsKIAkJZ290byBkb25lOwogCX0KIAotCWlmICgoYy0+ZCAmIFNzZSkgJiYgKG9wcy0+Z2V0X2NyKGN0eHQsIDApICYgWDg2X0NSMF9UUykpIHsKKwlpZiAoKGN0eHQtPmQgJiBTc2UpICYmIChvcHMtPmdldF9jcihjdHh0LCAwKSAmIFg4Nl9DUjBfVFMpKSB7CiAJCXJjID0gZW11bGF0ZV9ubShjdHh0KTsKIAkJZ290byBkb25lOwogCX0KIAotCWlmICh1bmxpa2VseShjdHh0LT5ndWVzdF9tb2RlKSAmJiBjLT5pbnRlcmNlcHQpIHsKLQkJcmMgPSBlbXVsYXRvcl9jaGVja19pbnRlcmNlcHQoY3R4dCwgYy0+aW50ZXJjZXB0LAorCWlmICh1bmxpa2VseShjdHh0LT5ndWVzdF9tb2RlKSAmJiBjdHh0LT5pbnRlcmNlcHQpIHsKKwkJcmMgPSBlbXVsYXRvcl9jaGVja19pbnRlcmNlcHQoY3R4dCwgY3R4dC0+aW50ZXJjZXB0LAogCQkJCQkgICAgICBYODZfSUNQVF9QUkVfRVhDRVBUKTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlnb3RvIGRvbmU7CiAJfQogCiAJLyogUHJpdmlsZWdlZCBpbnN0cnVjdGlvbiBjYW4gYmUgZXhlY3V0ZWQgb25seSBpbiBDUEw9MCAqLwotCWlmICgoYy0+ZCAmIFByaXYpICYmIG9wcy0+Y3BsKGN0eHQpKSB7CisJaWYgKChjdHh0LT5kICYgUHJpdikgJiYgb3BzLT5jcGwoY3R4dCkpIHsKIAkJcmMgPSBlbXVsYXRlX2dwKGN0eHQsIDApOwogCQlnb3RvIGRvbmU7CiAJfQogCiAJLyogSW5zdHJ1Y3Rpb24gY2FuIG9ubHkgYmUgZXhlY3V0ZWQgaW4gcHJvdGVjdGVkIG1vZGUgKi8KLQlpZiAoKGMtPmQgJiBQcm90KSAmJiAhKGN0eHQtPm1vZGUgJiBYODZFTVVMX01PREVfUFJPVCkpIHsKKwlpZiAoKGN0eHQtPmQgJiBQcm90KSAmJiAhKGN0eHQtPm1vZGUgJiBYODZFTVVMX01PREVfUFJPVCkpIHsKIAkJcmMgPSBlbXVsYXRlX3VkKGN0eHQpOwogCQlnb3RvIGRvbmU7CiAJfQogCiAJLyogRG8gaW5zdHJ1Y3Rpb24gc3BlY2lmaWMgcGVybWlzc2lvbiBjaGVja3MgKi8KLQlpZiAoYy0+Y2hlY2tfcGVybSkgewotCQlyYyA9IGMtPmNoZWNrX3Blcm0oY3R4dCk7CisJaWYgKGN0eHQtPmNoZWNrX3Blcm0pIHsKKwkJcmMgPSBjdHh0LT5jaGVja19wZXJtKGN0eHQpOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAodW5saWtlbHkoY3R4dC0+Z3Vlc3RfbW9kZSkgJiYgYy0+aW50ZXJjZXB0KSB7Ci0JCXJjID0gZW11bGF0b3JfY2hlY2tfaW50ZXJjZXB0KGN0eHQsIGMtPmludGVyY2VwdCwKKwlpZiAodW5saWtlbHkoY3R4dC0+Z3Vlc3RfbW9kZSkgJiYgY3R4dC0+aW50ZXJjZXB0KSB7CisJCXJjID0gZW11bGF0b3JfY2hlY2tfaW50ZXJjZXB0KGN0eHQsIGN0eHQtPmludGVyY2VwdCwKIAkJCQkJICAgICAgWDg2X0lDUFRfUE9TVF9FWENFUFQpOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAoYy0+cmVwX3ByZWZpeCAmJiAoYy0+ZCAmIFN0cmluZykpIHsKKwlpZiAoY3R4dC0+cmVwX3ByZWZpeCAmJiAoY3R4dC0+ZCAmIFN0cmluZykpIHsKIAkJLyogQWxsIFJFUCBwcmVmaXhlcyBoYXZlIHRoZSBzYW1lIGZpcnN0IHRlcm1pbmF0aW9uIGNvbmRpdGlvbiAqLwotCQlpZiAoYWRkcmVzc19tYXNrKGMsIGMtPnJlZ3NbVkNQVV9SRUdTX1JDWF0pID09IDApIHsKLQkJCWN0eHQtPmVpcCA9IGMtPmVpcDsKKwkJaWYgKGFkZHJlc3NfbWFzayhjdHh0LCBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQ1hdKSA9PSAwKSB7CisJCQljdHh0LT5laXAgPSBjdHh0LT5fZWlwOwogCQkJZ290byBkb25lOwogCQl9CiAJfQogCi0JaWYgKChjLT5zcmMudHlwZSA9PSBPUF9NRU0pICYmICEoYy0+ZCAmIE5vQWNjZXNzKSkgewotCQlyYyA9IHNlZ21lbnRlZF9yZWFkKGN0eHQsIGMtPnNyYy5hZGRyLm1lbSwKLQkJCQkgICAgYy0+c3JjLnZhbHB0ciwgYy0+c3JjLmJ5dGVzKTsKKwlpZiAoKGN0eHQtPnNyYy50eXBlID09IE9QX01FTSkgJiYgIShjdHh0LT5kICYgTm9BY2Nlc3MpKSB7CisJCXJjID0gc2VnbWVudGVkX3JlYWQoY3R4dCwgY3R4dC0+c3JjLmFkZHIubWVtLAorCQkJCSAgICBjdHh0LT5zcmMudmFscHRyLCBjdHh0LT5zcmMuYnl0ZXMpOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCWdvdG8gZG9uZTsKLQkJYy0+c3JjLm9yaWdfdmFsNjQgPSBjLT5zcmMudmFsNjQ7CisJCWN0eHQtPnNyYy5vcmlnX3ZhbDY0ID0gY3R4dC0+c3JjLnZhbDY0OwogCX0KIAotCWlmIChjLT5zcmMyLnR5cGUgPT0gT1BfTUVNKSB7Ci0JCXJjID0gc2VnbWVudGVkX3JlYWQoY3R4dCwgYy0+c3JjMi5hZGRyLm1lbSwKLQkJCQkgICAgJmMtPnNyYzIudmFsLCBjLT5zcmMyLmJ5dGVzKTsKKwlpZiAoY3R4dC0+c3JjMi50eXBlID09IE9QX01FTSkgeworCQlyYyA9IHNlZ21lbnRlZF9yZWFkKGN0eHQsIGN0eHQtPnNyYzIuYWRkci5tZW0sCisJCQkJICAgICZjdHh0LT5zcmMyLnZhbCwgY3R4dC0+c3JjMi5ieXRlcyk7CiAJCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQkJZ290byBkb25lOwogCX0KIAotCWlmICgoYy0+ZCAmIERzdE1hc2spID09IEltcGxpY2l0T3BzKQorCWlmICgoY3R4dC0+ZCAmIERzdE1hc2spID09IEltcGxpY2l0T3BzKQogCQlnb3RvIHNwZWNpYWxfaW5zbjsKIAogCi0JaWYgKChjLT5kc3QudHlwZSA9PSBPUF9NRU0pICYmICEoYy0+ZCAmIE1vdikpIHsKKwlpZiAoKGN0eHQtPmRzdC50eXBlID09IE9QX01FTSkgJiYgIShjdHh0LT5kICYgTW92KSkgewogCQkvKiBvcHRpbWlzYXRpb24gLSBhdm9pZCBzbG93IGVtdWxhdGVkIHJlYWQgaWYgTW92ICovCi0JCXJjID0gc2VnbWVudGVkX3JlYWQoY3R4dCwgYy0+ZHN0LmFkZHIubWVtLAotCQkJCSAgICZjLT5kc3QudmFsLCBjLT5kc3QuYnl0ZXMpOworCQlyYyA9IHNlZ21lbnRlZF9yZWFkKGN0eHQsIGN0eHQtPmRzdC5hZGRyLm1lbSwKKwkJCQkgICAmY3R4dC0+ZHN0LnZhbCwgY3R4dC0+ZHN0LmJ5dGVzKTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlnb3RvIGRvbmU7CiAJfQotCWMtPmRzdC5vcmlnX3ZhbCA9IGMtPmRzdC52YWw7CisJY3R4dC0+ZHN0Lm9yaWdfdmFsID0gY3R4dC0+ZHN0LnZhbDsKIAogc3BlY2lhbF9pbnNuOgogCi0JaWYgKHVubGlrZWx5KGN0eHQtPmd1ZXN0X21vZGUpICYmIGMtPmludGVyY2VwdCkgewotCQlyYyA9IGVtdWxhdG9yX2NoZWNrX2ludGVyY2VwdChjdHh0LCBjLT5pbnRlcmNlcHQsCisJaWYgKHVubGlrZWx5KGN0eHQtPmd1ZXN0X21vZGUpICYmIGN0eHQtPmludGVyY2VwdCkgeworCQlyYyA9IGVtdWxhdG9yX2NoZWNrX2ludGVyY2VwdChjdHh0LCBjdHh0LT5pbnRlcmNlcHQsCiAJCQkJCSAgICAgIFg4Nl9JQ1BUX1BPU1RfTUVNQUNDRVNTKTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlnb3RvIGRvbmU7CiAJfQogCi0JaWYgKGMtPmV4ZWN1dGUpIHsKLQkJcmMgPSBjLT5leGVjdXRlKGN0eHQpOworCWlmIChjdHh0LT5leGVjdXRlKSB7CisJCXJjID0gY3R4dC0+ZXhlY3V0ZShjdHh0KTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlnb3RvIGRvbmU7CiAJCWdvdG8gd3JpdGViYWNrOwogCX0KIAotCWlmIChjLT50d29ieXRlKQorCWlmIChjdHh0LT50d29ieXRlKQogCQlnb3RvIHR3b2J5dGVfaW5zbjsKIAotCXN3aXRjaCAoYy0+YikgeworCXN3aXRjaCAoY3R4dC0+YikgewogCWNhc2UgMHgwNjoJCS8qIHB1c2ggZXMgKi8KLQkJcmMgPSBlbXVsYXRlX3B1c2hfc3JlZyhjdHh0LCBvcHMsIFZDUFVfU1JFR19FUyk7CisJCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0VTKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA3OgkJLyogcG9wIGVzICovCi0JCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBvcHMsIFZDUFVfU1JFR19FUyk7CisJCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBWQ1BVX1NSRUdfRVMpOwogCQlicmVhazsKIAljYXNlIDB4MGU6CQkvKiBwdXNoIGNzICovCi0JCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgb3BzLCBWQ1BVX1NSRUdfQ1MpOworCQlyYyA9IGVtdWxhdGVfcHVzaF9zcmVnKGN0eHQsIFZDUFVfU1JFR19DUyk7CiAJCWJyZWFrOwogCWNhc2UgMHgxNjoJCS8qIHB1c2ggc3MgKi8KLQkJcmMgPSBlbXVsYXRlX3B1c2hfc3JlZyhjdHh0LCBvcHMsIFZDUFVfU1JFR19TUyk7CisJCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX1NTKTsKIAkJYnJlYWs7CiAJY2FzZSAweDE3OgkJLyogcG9wIHNzICovCi0JCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBvcHMsIFZDUFVfU1JFR19TUyk7CisJCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBWQ1BVX1NSRUdfU1MpOwogCQlicmVhazsKIAljYXNlIDB4MWU6CQkvKiBwdXNoIGRzICovCi0JCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgb3BzLCBWQ1BVX1NSRUdfRFMpOworCQlyYyA9IGVtdWxhdGVfcHVzaF9zcmVnKGN0eHQsIFZDUFVfU1JFR19EUyk7CiAJCWJyZWFrOwogCWNhc2UgMHgxZjoJCS8qIHBvcCBkcyAqLwotCQlyYyA9IGVtdWxhdGVfcG9wX3NyZWcoY3R4dCwgb3BzLCBWQ1BVX1NSRUdfRFMpOworCQlyYyA9IGVtdWxhdGVfcG9wX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0RTKTsKIAkJYnJlYWs7CiAJY2FzZSAweDQwIC4uLiAweDQ3OiAvKiBpbmMgcjE2L3IzMiAqLwotCQllbXVsYXRlXzFvcCgiaW5jIiwgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzFvcCgiaW5jIiwgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIDB4NDggLi4uIDB4NGY6IC8qIGRlYyByMTYvcjMyICovCi0JCWVtdWxhdGVfMW9wKCJkZWMiLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMW9wKCJkZWMiLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgMHg2MzoJCS8qIG1vdnN4ZCAqLwogCQlpZiAoY3R4dC0+bW9kZSAhPSBYODZFTVVMX01PREVfUFJPVDY0KQogCQkJZ290byBjYW5ub3RfZW11bGF0ZTsKLQkJYy0+ZHN0LnZhbCA9IChzMzIpIGMtPnNyYy52YWw7CisJCWN0eHQtPmRzdC52YWwgPSAoczMyKSBjdHh0LT5zcmMudmFsOwogCQlicmVhazsKIAljYXNlIDB4NmM6CQkvKiBpbnNiICovCiAJY2FzZSAweDZkOgkJLyogaW5zdy9pbnNkICovCi0JCWMtPnNyYy52YWwgPSBjLT5yZWdzW1ZDUFVfUkVHU19SRFhdOworCQljdHh0LT5zcmMudmFsID0gY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKIAkJZ290byBkb19pb19pbjsKIAljYXNlIDB4NmU6CQkvKiBvdXRzYiAqLwogCWNhc2UgMHg2ZjoJCS8qIG91dHN3L291dHNkICovCi0JCWMtPmRzdC52YWwgPSBjLT5yZWdzW1ZDUFVfUkVHU19SRFhdOworCQljdHh0LT5kc3QudmFsID0gY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKIAkJZ290byBkb19pb19vdXQ7CiAJCWJyZWFrOwogCWNhc2UgMHg3MCAuLi4gMHg3ZjogLyogamNjIChzaG9ydCkgKi8KLQkJaWYgKHRlc3RfY2MoYy0+YiwgY3R4dC0+ZWZsYWdzKSkKLQkJCWptcF9yZWwoYywgYy0+c3JjLnZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgMHg4NCAuLi4gMHg4NToKLQl0ZXN0OgotCQllbXVsYXRlXzJvcF9TcmNWKCJ0ZXN0IiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgMHg4NiAuLi4gMHg4NzoJLyogeGNoZyAqLwotCXhjaGc6Ci0JCS8qIFdyaXRlIGJhY2sgdGhlIHJlZ2lzdGVyIHNvdXJjZS4gKi8KLQkJYy0+c3JjLnZhbCA9IGMtPmRzdC52YWw7Ci0JCXdyaXRlX3JlZ2lzdGVyX29wZXJhbmQoJmMtPnNyYyk7Ci0JCS8qCi0JCSAqIFdyaXRlIGJhY2sgdGhlIG1lbW9yeSBkZXN0aW5hdGlvbiB3aXRoIGltcGxpY2l0IExPQ0sKLQkJICogcHJlZml4LgotCQkgKi8KLQkJYy0+ZHN0LnZhbCA9IGMtPnNyYy5vcmlnX3ZhbDsKLQkJYy0+bG9ja19wcmVmaXggPSAxOwotCQlicmVhazsKLQljYXNlIDB4OGM6ICAvKiBtb3Ygci9tLCBzcmVnICovCi0JCWlmIChjLT5tb2RybV9yZWcgPiBWQ1BVX1NSRUdfR1MpIHsKLQkJCXJjID0gZW11bGF0ZV91ZChjdHh0KTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQljLT5kc3QudmFsID0gZ2V0X3NlZ21lbnRfc2VsZWN0b3IoY3R4dCwgYy0+bW9kcm1fcmVnKTsKKwkJaWYgKHRlc3RfY2MoY3R4dC0+YiwgY3R4dC0+ZWZsYWdzKSkKKwkJCWptcF9yZWwoY3R4dCwgY3R4dC0+c3JjLnZhbCk7CiAJCWJyZWFrOwogCWNhc2UgMHg4ZDogLyogbGVhIHIxNi9yMzIsIG0gKi8KLQkJYy0+ZHN0LnZhbCA9IGMtPnNyYy5hZGRyLm1lbS5lYTsKKwkJY3R4dC0+ZHN0LnZhbCA9IGN0eHQtPnNyYy5hZGRyLm1lbS5lYTsKIAkJYnJlYWs7Ci0JY2FzZSAweDhlOiB7IC8qIG1vdiBzZWcsIHIvbTE2ICovCi0JCXVpbnQxNl90IHNlbDsKLQotCQlzZWwgPSBjLT5zcmMudmFsOwotCi0JCWlmIChjLT5tb2RybV9yZWcgPT0gVkNQVV9TUkVHX0NTIHx8Ci0JCSAgICBjLT5tb2RybV9yZWcgPiBWQ1BVX1NSRUdfR1MpIHsKLQkJCXJjID0gZW11bGF0ZV91ZChjdHh0KTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWlmIChjLT5tb2RybV9yZWcgPT0gVkNQVV9TUkVHX1NTKQotCQkJY3R4dC0+aW50ZXJydXB0aWJpbGl0eSA9IEtWTV9YODZfU0hBRE9XX0lOVF9NT1ZfU1M7Ci0KLQkJcmMgPSBsb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LCBvcHMsIHNlbCwgYy0+bW9kcm1fcmVnKTsKLQotCQljLT5kc3QudHlwZSA9IE9QX05PTkU7ICAvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KLQkJYnJlYWs7Ci0JfQogCWNhc2UgMHg4ZjoJCS8qIHBvcCAoc29sZSBtZW1iZXIgb2YgR3JwMWEpICovCiAJCXJjID0gZW1fZ3JwMWEoY3R4dCk7CiAJCWJyZWFrOwogCWNhc2UgMHg5MCAuLi4gMHg5NzogLyogbm9wIC8geGNoZyByZWcsIHJheCAqLwotCQlpZiAoYy0+ZHN0LmFkZHIucmVnID09ICZjLT5yZWdzW1ZDUFVfUkVHU19SQVhdKQorCQlpZiAoY3R4dC0+ZHN0LmFkZHIucmVnID09ICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQVhdKQogCQkJYnJlYWs7Ci0JCWdvdG8geGNoZzsKKwkJcmMgPSBlbV94Y2hnKGN0eHQpOworCQlicmVhazsKIAljYXNlIDB4OTg6IC8qIGNidy9jd2RlL2NkcWUgKi8KLQkJc3dpdGNoIChjLT5vcF9ieXRlcykgewotCQljYXNlIDI6IGMtPmRzdC52YWwgPSAoczgpYy0+ZHN0LnZhbDsgYnJlYWs7Ci0JCWNhc2UgNDogYy0+ZHN0LnZhbCA9IChzMTYpYy0+ZHN0LnZhbDsgYnJlYWs7Ci0JCWNhc2UgODogYy0+ZHN0LnZhbCA9IChzMzIpYy0+ZHN0LnZhbDsgYnJlYWs7CisJCXN3aXRjaCAoY3R4dC0+b3BfYnl0ZXMpIHsKKwkJY2FzZSAyOiBjdHh0LT5kc3QudmFsID0gKHM4KWN0eHQtPmRzdC52YWw7IGJyZWFrOworCQljYXNlIDQ6IGN0eHQtPmRzdC52YWwgPSAoczE2KWN0eHQtPmRzdC52YWw7IGJyZWFrOworCQljYXNlIDg6IGN0eHQtPmRzdC52YWwgPSAoczMyKWN0eHQtPmRzdC52YWw7IGJyZWFrOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgMHhhOCAuLi4gMHhhOToJLyogdGVzdCBheCwgaW1tICovCi0JCWdvdG8gdGVzdDsKIAljYXNlIDB4YzAgLi4uIDB4YzE6CiAJCXJjID0gZW1fZ3JwMihjdHh0KTsKIAkJYnJlYWs7Ci0JY2FzZSAweGMzOiAvKiByZXQgKi8KLQkJYy0+ZHN0LnR5cGUgPSBPUF9SRUc7Ci0JCWMtPmRzdC5hZGRyLnJlZyA9ICZjLT5laXA7Ci0JCWMtPmRzdC5ieXRlcyA9IGMtPm9wX2J5dGVzOwotCQlyYyA9IGVtX3BvcChjdHh0KTsKLQkJYnJlYWs7CiAJY2FzZSAweGM0OgkJLyogbGVzICovCi0JCXJjID0gZW11bGF0ZV9sb2FkX3NlZ21lbnQoY3R4dCwgb3BzLCBWQ1BVX1NSRUdfRVMpOworCQlyYyA9IGVtdWxhdGVfbG9hZF9zZWdtZW50KGN0eHQsIFZDUFVfU1JFR19FUyk7CiAJCWJyZWFrOwogCWNhc2UgMHhjNToJCS8qIGxkcyAqLwotCQlyYyA9IGVtdWxhdGVfbG9hZF9zZWdtZW50KGN0eHQsIG9wcywgVkNQVV9TUkVHX0RTKTsKLQkJYnJlYWs7Ci0JY2FzZSAweGNiOgkJLyogcmV0IGZhciAqLwotCQlyYyA9IGVtdWxhdGVfcmV0X2ZhcihjdHh0LCBvcHMpOworCQlyYyA9IGVtdWxhdGVfbG9hZF9zZWdtZW50KGN0eHQsIFZDUFVfU1JFR19EUyk7CiAJCWJyZWFrOwogCWNhc2UgMHhjYzoJCS8qIGludDMgKi8KLQkJaXJxID0gMzsKLQkJZ290byBkb19pbnRlcnJ1cHQ7CisJCXJjID0gZW11bGF0ZV9pbnQoY3R4dCwgMyk7CisJCWJyZWFrOwogCWNhc2UgMHhjZDoJCS8qIGludCBuICovCi0JCWlycSA9IGMtPnNyYy52YWw7Ci0JZG9faW50ZXJydXB0OgotCQlyYyA9IGVtdWxhdGVfaW50KGN0eHQsIG9wcywgaXJxKTsKKwkJcmMgPSBlbXVsYXRlX2ludChjdHh0LCBjdHh0LT5zcmMudmFsKTsKIAkJYnJlYWs7CiAJY2FzZSAweGNlOgkJLyogaW50byAqLwotCQlpZiAoY3R4dC0+ZWZsYWdzICYgRUZMR19PRikgewotCQkJaXJxID0gNDsKLQkJCWdvdG8gZG9faW50ZXJydXB0OwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMHhjZjoJCS8qIGlyZXQgKi8KLQkJcmMgPSBlbXVsYXRlX2lyZXQoY3R4dCwgb3BzKTsKKwkJaWYgKGN0eHQtPmVmbGFncyAmIEVGTEdfT0YpCisJCQlyYyA9IGVtdWxhdGVfaW50KGN0eHQsIDQpOwogCQlicmVhazsKIAljYXNlIDB4ZDAgLi4uIDB4ZDE6CS8qIEdycDIgKi8KIAkJcmMgPSBlbV9ncnAyKGN0eHQpOwogCQlicmVhazsKIAljYXNlIDB4ZDIgLi4uIDB4ZDM6CS8qIEdycDIgKi8KLQkJYy0+c3JjLnZhbCA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JDWF07CisJCWN0eHQtPnNyYy52YWwgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQ1hdOwogCQlyYyA9IGVtX2dycDIoY3R4dCk7CiAJCWJyZWFrOwotCWNhc2UgMHhlMCAuLi4gMHhlMjoJLyogbG9vcC9sb29wei9sb29wbnogKi8KLQkJcmVnaXN0ZXJfYWRkcmVzc19pbmNyZW1lbnQoYywgJmMtPnJlZ3NbVkNQVV9SRUdTX1JDWF0sIC0xKTsKLQkJaWYgKGFkZHJlc3NfbWFzayhjLCBjLT5yZWdzW1ZDUFVfUkVHU19SQ1hdKSAhPSAwICYmCi0JCSAgICAoYy0+YiA9PSAweGUyIHx8IHRlc3RfY2MoYy0+YiBeIDB4NSwgY3R4dC0+ZWZsYWdzKSkpCi0JCQlqbXBfcmVsKGMsIGMtPnNyYy52YWwpOwotCQlicmVhazsKLQljYXNlIDB4ZTM6CS8qIGpjeHovamVjeHovanJjeHogKi8KLQkJaWYgKGFkZHJlc3NfbWFzayhjLCBjLT5yZWdzW1ZDUFVfUkVHU19SQ1hdKSA9PSAwKQotCQkJam1wX3JlbChjLCBjLT5zcmMudmFsKTsKLQkJYnJlYWs7CiAJY2FzZSAweGU0OiAJLyogaW5iICovCiAJY2FzZSAweGU1OiAJLyogaW4gKi8KIAkJZ290byBkb19pb19pbjsKQEAgLTQwMDksMzcgKzM5MjEsMzAgQEAKIAljYXNlIDB4ZTc6IC8qIG91dCAqLwogCQlnb3RvIGRvX2lvX291dDsKIAljYXNlIDB4ZTg6IC8qIGNhbGwgKG5lYXIpICovIHsKLQkJbG9uZyBpbnQgcmVsID0gYy0+c3JjLnZhbDsKLQkJYy0+c3JjLnZhbCA9ICh1bnNpZ25lZCBsb25nKSBjLT5laXA7Ci0JCWptcF9yZWwoYywgcmVsKTsKKwkJbG9uZyBpbnQgcmVsID0gY3R4dC0+c3JjLnZhbDsKKwkJY3R4dC0+c3JjLnZhbCA9ICh1bnNpZ25lZCBsb25nKSBjdHh0LT5fZWlwOworCQlqbXBfcmVsKGN0eHQsIHJlbCk7CiAJCXJjID0gZW1fcHVzaChjdHh0KTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgMHhlOTogLyogam1wIHJlbCAqLwotCQlnb3RvIGptcDsKLQljYXNlIDB4ZWE6IC8qIGptcCBmYXIgKi8KLQkJcmMgPSBlbV9qbXBfZmFyKGN0eHQpOwotCQlicmVhazsKLQljYXNlIDB4ZWI6Ci0JICAgICAgam1wOgkJLyogam1wIHJlbCBzaG9ydCAqLwotCQlqbXBfcmVsKGMsIGMtPnNyYy52YWwpOwotCQljLT5kc3QudHlwZSA9IE9QX05PTkU7IC8qIERpc2FibGUgd3JpdGViYWNrLiAqLworCWNhc2UgMHhlYjogLyogam1wIHJlbCBzaG9ydCAqLworCQlqbXBfcmVsKGN0eHQsIGN0eHQtPnNyYy52YWwpOworCQljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7IC8qIERpc2FibGUgd3JpdGViYWNrLiAqLwogCQlicmVhazsKIAljYXNlIDB4ZWM6IC8qIGluIGFsLGR4ICovCiAJY2FzZSAweGVkOiAvKiBpbiAoZS9yKWF4LGR4ICovCi0JCWMtPnNyYy52YWwgPSBjLT5yZWdzW1ZDUFVfUkVHU19SRFhdOwogCWRvX2lvX2luOgotCQlpZiAoIXBpb19pbl9lbXVsYXRlZChjdHh0LCBvcHMsIGMtPmRzdC5ieXRlcywgYy0+c3JjLnZhbCwKLQkJCQkgICAgICZjLT5kc3QudmFsKSkKKwkJaWYgKCFwaW9faW5fZW11bGF0ZWQoY3R4dCwgY3R4dC0+ZHN0LmJ5dGVzLCBjdHh0LT5zcmMudmFsLAorCQkJCSAgICAgJmN0eHQtPmRzdC52YWwpKQogCQkJZ290byBkb25lOyAvKiBJTyBpcyBuZWVkZWQgKi8KIAkJYnJlYWs7CiAJY2FzZSAweGVlOiAvKiBvdXQgZHgsYWwgKi8KIAljYXNlIDB4ZWY6IC8qIG91dCBkeCwoZS9yKWF4ICovCi0JCWMtPmRzdC52YWwgPSBjLT5yZWdzW1ZDUFVfUkVHU19SRFhdOwogCWRvX2lvX291dDoKLQkJb3BzLT5waW9fb3V0X2VtdWxhdGVkKGN0eHQsIGMtPnNyYy5ieXRlcywgYy0+ZHN0LnZhbCwKLQkJCQkgICAgICAmYy0+c3JjLnZhbCwgMSk7Ci0JCWMtPmRzdC50eXBlID0gT1BfTk9ORTsJLyogRGlzYWJsZSB3cml0ZWJhY2suICovCisJCW9wcy0+cGlvX291dF9lbXVsYXRlZChjdHh0LCBjdHh0LT5zcmMuYnl0ZXMsIGN0eHQtPmRzdC52YWwsCisJCQkJICAgICAgJmN0eHQtPnNyYy52YWwsIDEpOworCQljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7CS8qIERpc2FibGUgd3JpdGViYWNrLiAqLwogCQlicmVhazsKIAljYXNlIDB4ZjQ6ICAgICAgICAgICAgICAvKiBobHQgKi8KIAkJY3R4dC0+b3BzLT5oYWx0KGN0eHQpOwpAQCAtNDA1NywyMiArMzk2Miw2IEBACiAJY2FzZSAweGY5OiAvKiBzdGMgKi8KIAkJY3R4dC0+ZWZsYWdzIHw9IEVGTEdfQ0Y7CiAJCWJyZWFrOwotCWNhc2UgMHhmYTogLyogY2xpICovCi0JCWlmIChlbXVsYXRvcl9iYWRfaW9wbChjdHh0LCBvcHMpKSB7Ci0JCQlyYyA9IGVtdWxhdGVfZ3AoY3R4dCwgMCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0gZWxzZQotCQkJY3R4dC0+ZWZsYWdzICY9IH5YODZfRUZMQUdTX0lGOwotCQlicmVhazsKLQljYXNlIDB4ZmI6IC8qIHN0aSAqLwotCQlpZiAoZW11bGF0b3JfYmFkX2lvcGwoY3R4dCwgb3BzKSkgewotCQkJcmMgPSBlbXVsYXRlX2dwKGN0eHQsIDApOwotCQkJZ290byBkb25lOwotCQl9IGVsc2UgewotCQkJY3R4dC0+aW50ZXJydXB0aWJpbGl0eSA9IEtWTV9YODZfU0hBRE9XX0lOVF9TVEk7Ci0JCQljdHh0LT5lZmxhZ3MgfD0gWDg2X0VGTEFHU19JRjsKLQkJfQotCQlicmVhazsKIAljYXNlIDB4ZmM6IC8qIGNsZCAqLwogCQljdHh0LT5lZmxhZ3MgJj0gfkVGTEdfREY7CiAJCWJyZWFrOwpAQCAtNDEwMSw0MCArMzk5MCw0MCBAQAogCSAqIHJlc3RvcmUgZHN0IHR5cGUgaW4gY2FzZSB0aGUgZGVjb2Rpbmcgd2lsbCBiZSByZXVzZWQKIAkgKiAoaGFwcGVucyBmb3Igc3RyaW5nIGluc3RydWN0aW9uICkKIAkgKi8KLQljLT5kc3QudHlwZSA9IHNhdmVkX2RzdF90eXBlOworCWN0eHQtPmRzdC50eXBlID0gc2F2ZWRfZHN0X3R5cGU7CiAKLQlpZiAoKGMtPmQgJiBTcmNNYXNrKSA9PSBTcmNTSSkKLQkJc3RyaW5nX2FkZHJfaW5jKGN0eHQsIHNlZ19vdmVycmlkZShjdHh0LCBjKSwKLQkJCQlWQ1BVX1JFR1NfUlNJLCAmYy0+c3JjKTsKKwlpZiAoKGN0eHQtPmQgJiBTcmNNYXNrKSA9PSBTcmNTSSkKKwkJc3RyaW5nX2FkZHJfaW5jKGN0eHQsIHNlZ19vdmVycmlkZShjdHh0KSwKKwkJCQlWQ1BVX1JFR1NfUlNJLCAmY3R4dC0+c3JjKTsKIAotCWlmICgoYy0+ZCAmIERzdE1hc2spID09IERzdERJKQorCWlmICgoY3R4dC0+ZCAmIERzdE1hc2spID09IERzdERJKQogCQlzdHJpbmdfYWRkcl9pbmMoY3R4dCwgVkNQVV9TUkVHX0VTLCBWQ1BVX1JFR1NfUkRJLAotCQkJCSZjLT5kc3QpOworCQkJCSZjdHh0LT5kc3QpOwogCi0JaWYgKGMtPnJlcF9wcmVmaXggJiYgKGMtPmQgJiBTdHJpbmcpKSB7Ci0JCXN0cnVjdCByZWFkX2NhY2hlICpyID0gJmN0eHQtPmRlY29kZS5pb19yZWFkOwotCQlyZWdpc3Rlcl9hZGRyZXNzX2luY3JlbWVudChjLCAmYy0+cmVnc1tWQ1BVX1JFR1NfUkNYXSwgLTEpOworCWlmIChjdHh0LT5yZXBfcHJlZml4ICYmIChjdHh0LT5kICYgU3RyaW5nKSkgeworCQlzdHJ1Y3QgcmVhZF9jYWNoZSAqciA9ICZjdHh0LT5pb19yZWFkOworCQlyZWdpc3Rlcl9hZGRyZXNzX2luY3JlbWVudChjdHh0LCAmY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkNYXSwgLTEpOwogCiAJCWlmICghc3RyaW5nX2luc25fY29tcGxldGVkKGN0eHQpKSB7CiAJCQkvKgogCQkJICogUmUtZW50ZXIgZ3Vlc3Qgd2hlbiBwaW8gcmVhZCBhaGVhZCBidWZmZXIgaXMgZW1wdHkKIAkJCSAqIG9yLCBpZiBpdCBpcyBub3QgdXNlZCwgYWZ0ZXIgZWFjaCAxMDI0IGl0ZXJhdGlvbi4KIAkJCSAqLwotCQkJaWYgKChyLT5lbmQgIT0gMCB8fCBjLT5yZWdzW1ZDUFVfUkVHU19SQ1hdICYgMHgzZmYpICYmCisJCQlpZiAoKHItPmVuZCAhPSAwIHx8IGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JDWF0gJiAweDNmZikgJiYKIAkJCSAgICAoci0+ZW5kID09IDAgfHwgci0+ZW5kICE9IHItPnBvcykpIHsKIAkJCQkvKgogCQkJCSAqIFJlc2V0IHJlYWQgY2FjaGUuIFVzdWFsbHkgaGFwcGVucyBiZWZvcmUKIAkJCQkgKiBkZWNvZGUsIGJ1dCBzaW5jZSBpbnN0cnVjdGlvbiBpcyByZXN0YXJ0ZWQKIAkJCQkgKiB3ZSBoYXZlIHRvIGRvIGl0IGhlcmUuCiAJCQkJICovCi0JCQkJY3R4dC0+ZGVjb2RlLm1lbV9yZWFkLmVuZCA9IDA7CisJCQkJY3R4dC0+bWVtX3JlYWQuZW5kID0gMDsKIAkJCQlyZXR1cm4gRU1VTEFUSU9OX1JFU1RBUlQ7CiAJCQl9CiAJCQlnb3RvIGRvbmU7IC8qIHNraXAgcmlwIHdyaXRlYmFjayAqLwogCQl9CiAJfQogCi0JY3R4dC0+ZWlwID0gYy0+ZWlwOworCWN0eHQtPmVpcCA9IGN0eHQtPl9laXA7CiAKIGRvbmU6CiAJaWYgKHJjID09IFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUKQpAQCAtNDE0NSwxMyArNDAzNCw3IEBACiAJcmV0dXJuIChyYyA9PSBYODZFTVVMX1VOSEFORExFQUJMRSkgPyBFTVVMQVRJT05fRkFJTEVEIDogRU1VTEFUSU9OX09LOwogCiB0d29ieXRlX2luc246Ci0Jc3dpdGNoIChjLT5iKSB7Ci0JY2FzZSAweDA1OiAJCS8qIHN5c2NhbGwgKi8KLQkJcmMgPSBlbXVsYXRlX3N5c2NhbGwoY3R4dCwgb3BzKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDA2OgotCQlyYyA9IGVtX2NsdHMoY3R4dCk7Ci0JCWJyZWFrOworCXN3aXRjaCAoY3R4dC0+YikgewogCWNhc2UgMHgwOToJCS8qIHdiaW52ZCAqLwogCQkoY3R4dC0+b3BzLT53YmludmQpKGN0eHQpOwogCQlicmVhazsKQEAgLTQxNjAsMjEgKzQwNDMsMjEgQEAKIAljYXNlIDB4MTg6CQkvKiBHcnAxNiAocHJlZmV0Y2gvbm9wKSAqLwogCQlicmVhazsKIAljYXNlIDB4MjA6IC8qIG1vdiBjciwgcmVnICovCi0JCWMtPmRzdC52YWwgPSBvcHMtPmdldF9jcihjdHh0LCBjLT5tb2RybV9yZWcpOworCQljdHh0LT5kc3QudmFsID0gb3BzLT5nZXRfY3IoY3R4dCwgY3R4dC0+bW9kcm1fcmVnKTsKIAkJYnJlYWs7CiAJY2FzZSAweDIxOiAvKiBtb3YgZnJvbSBkciB0byByZWcgKi8KLQkJb3BzLT5nZXRfZHIoY3R4dCwgYy0+bW9kcm1fcmVnLCAmYy0+ZHN0LnZhbCk7CisJCW9wcy0+Z2V0X2RyKGN0eHQsIGN0eHQtPm1vZHJtX3JlZywgJmN0eHQtPmRzdC52YWwpOwogCQlicmVhazsKIAljYXNlIDB4MjI6IC8qIG1vdiByZWcsIGNyICovCi0JCWlmIChvcHMtPnNldF9jcihjdHh0LCBjLT5tb2RybV9yZWcsIGMtPnNyYy52YWwpKSB7CisJCWlmIChvcHMtPnNldF9jcihjdHh0LCBjdHh0LT5tb2RybV9yZWcsIGN0eHQtPnNyYy52YWwpKSB7CiAJCQllbXVsYXRlX2dwKGN0eHQsIDApOwogCQkJcmMgPSBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKIAkJCWdvdG8gZG9uZTsKIAkJfQotCQljLT5kc3QudHlwZSA9IE9QX05PTkU7CisJCWN0eHQtPmRzdC50eXBlID0gT1BfTk9ORTsKIAkJYnJlYWs7CiAJY2FzZSAweDIzOiAvKiBtb3YgZnJvbSByZWcgdG8gZHIgKi8KLQkJaWYgKG9wcy0+c2V0X2RyKGN0eHQsIGMtPm1vZHJtX3JlZywgYy0+c3JjLnZhbCAmCisJCWlmIChvcHMtPnNldF9kcihjdHh0LCBjdHh0LT5tb2RybV9yZWcsIGN0eHQtPnNyYy52YWwgJgogCQkJCSgoY3R4dC0+bW9kZSA9PSBYODZFTVVMX01PREVfUFJPVDY0KSA/CiAJCQkJIH4wVUxMIDogfjBVKSkgPCAwKSB7CiAJCQkvKiAjVUQgY29uZGl0aW9uIGlzIGFscmVhZHkgaGFuZGxlZCBieSB0aGUgY29kZSBhYm92ZSAqLwpAQCAtNDE4MywxMyArNDA2NiwxMyBAQAogCQkJZ290byBkb25lOwogCQl9CiAKLQkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOwkvKiBubyB3cml0ZWJhY2sgKi8KKwkJY3R4dC0+ZHN0LnR5cGUgPSBPUF9OT05FOwkvKiBubyB3cml0ZWJhY2sgKi8KIAkJYnJlYWs7CiAJY2FzZSAweDMwOgogCQkvKiB3cm1zciAqLwotCQltc3JfZGF0YSA9ICh1MzIpYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXQotCQkJfCAoKHU2NCljLT5yZWdzW1ZDUFVfUkVHU19SRFhdIDw8IDMyKTsKLQkJaWYgKG9wcy0+c2V0X21zcihjdHh0LCBjLT5yZWdzW1ZDUFVfUkVHU19SQ1hdLCBtc3JfZGF0YSkpIHsKKwkJbXNyX2RhdGEgPSAodTMyKWN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JBWF0KKwkJCXwgKCh1NjQpY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRYXSA8PCAzMik7CisJCWlmIChvcHMtPnNldF9tc3IoY3R4dCwgY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkNYXSwgbXNyX2RhdGEpKSB7CiAJCQllbXVsYXRlX2dwKGN0eHQsIDApOwogCQkJcmMgPSBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKIAkJCWdvdG8gZG9uZTsKQEAgLTQxOTgsNjQgKzQwODEsNTggQEAKIAkJYnJlYWs7CiAJY2FzZSAweDMyOgogCQkvKiByZG1zciAqLwotCQlpZiAob3BzLT5nZXRfbXNyKGN0eHQsIGMtPnJlZ3NbVkNQVV9SRUdTX1JDWF0sICZtc3JfZGF0YSkpIHsKKwkJaWYgKG9wcy0+Z2V0X21zcihjdHh0LCBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQ1hdLCAmbXNyX2RhdGEpKSB7CiAJCQllbXVsYXRlX2dwKGN0eHQsIDApOwogCQkJcmMgPSBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKIAkJCWdvdG8gZG9uZTsKIAkJfSBlbHNlIHsKLQkJCWMtPnJlZ3NbVkNQVV9SRUdTX1JBWF0gPSAodTMyKW1zcl9kYXRhOwotCQkJYy0+cmVnc1tWQ1BVX1JFR1NfUkRYXSA9IG1zcl9kYXRhID4+IDMyOworCQkJY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkFYXSA9ICh1MzIpbXNyX2RhdGE7CisJCQljdHh0LT5yZWdzW1ZDUFVfUkVHU19SRFhdID0gbXNyX2RhdGEgPj4gMzI7CiAJCX0KIAkJcmMgPSBYODZFTVVMX0NPTlRJTlVFOwogCQlicmVhazsKLQljYXNlIDB4MzQ6CQkvKiBzeXNlbnRlciAqLwotCQlyYyA9IGVtdWxhdGVfc3lzZW50ZXIoY3R4dCwgb3BzKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDM1OgkJLyogc3lzZXhpdCAqLwotCQlyYyA9IGVtdWxhdGVfc3lzZXhpdChjdHh0LCBvcHMpOwotCQlicmVhazsKIAljYXNlIDB4NDAgLi4uIDB4NGY6CS8qIGNtb3YgKi8KLQkJYy0+ZHN0LnZhbCA9IGMtPmRzdC5vcmlnX3ZhbCA9IGMtPnNyYy52YWw7Ci0JCWlmICghdGVzdF9jYyhjLT5iLCBjdHh0LT5lZmxhZ3MpKQotCQkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOyAvKiBubyB3cml0ZWJhY2sgKi8KKwkJY3R4dC0+ZHN0LnZhbCA9IGN0eHQtPmRzdC5vcmlnX3ZhbCA9IGN0eHQtPnNyYy52YWw7CisJCWlmICghdGVzdF9jYyhjdHh0LT5iLCBjdHh0LT5lZmxhZ3MpKQorCQkJY3R4dC0+ZHN0LnR5cGUgPSBPUF9OT05FOyAvKiBubyB3cml0ZWJhY2sgKi8KIAkJYnJlYWs7CiAJY2FzZSAweDgwIC4uLiAweDhmOiAvKiBqbnogcmVsLCBldGMqLwotCQlpZiAodGVzdF9jYyhjLT5iLCBjdHh0LT5lZmxhZ3MpKQotCQkJam1wX3JlbChjLCBjLT5zcmMudmFsKTsKKwkJaWYgKHRlc3RfY2MoY3R4dC0+YiwgY3R4dC0+ZWZsYWdzKSkKKwkJCWptcF9yZWwoY3R4dCwgY3R4dC0+c3JjLnZhbCk7CiAJCWJyZWFrOwogCWNhc2UgMHg5MCAuLi4gMHg5ZjogICAgIC8qIHNldGNjIHIvbTggKi8KLQkJYy0+ZHN0LnZhbCA9IHRlc3RfY2MoYy0+YiwgY3R4dC0+ZWZsYWdzKTsKKwkJY3R4dC0+ZHN0LnZhbCA9IHRlc3RfY2MoY3R4dC0+YiwgY3R4dC0+ZWZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSAweGEwOgkgIC8qIHB1c2ggZnMgKi8KLQkJcmMgPSBlbXVsYXRlX3B1c2hfc3JlZyhjdHh0LCBvcHMsIFZDUFVfU1JFR19GUyk7CisJCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0ZTKTsKIAkJYnJlYWs7CiAJY2FzZSAweGExOgkgLyogcG9wIGZzICovCi0JCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBvcHMsIFZDUFVfU1JFR19GUyk7CisJCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBWQ1BVX1NSRUdfRlMpOwogCQlicmVhazsKIAljYXNlIDB4YTM6CiAJICAgICAgYnQ6CQkvKiBidCAqLwotCQljLT5kc3QudHlwZSA9IE9QX05PTkU7CisJCWN0eHQtPmRzdC50eXBlID0gT1BfTk9ORTsKIAkJLyogb25seSBzdWJ3b3JkIG9mZnNldCAqLwotCQljLT5zcmMudmFsICY9IChjLT5kc3QuYnl0ZXMgPDwgMykgLSAxOwotCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZSgiYnQiLCBjLT5zcmMsIGMtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJY3R4dC0+c3JjLnZhbCAmPSAoY3R4dC0+ZHN0LmJ5dGVzIDw8IDMpIC0gMTsKKwkJZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoImJ0IiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgMHhhNDogLyogc2hsZCBpbW04LCByLCByL20gKi8KIAljYXNlIDB4YTU6IC8qIHNobGQgY2wsIHIsIHIvbSAqLwotCQllbXVsYXRlXzJvcF9jbCgic2hsZCIsIGMtPnNyYzIsIGMtPnNyYywgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9jbCgic2hsZCIsIGN0eHQtPnNyYzIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIDB4YTg6CS8qIHB1c2ggZ3MgKi8KLQkJcmMgPSBlbXVsYXRlX3B1c2hfc3JlZyhjdHh0LCBvcHMsIFZDUFVfU1JFR19HUyk7CisJCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0dTKTsKIAkJYnJlYWs7CiAJY2FzZSAweGE5OgkvKiBwb3AgZ3MgKi8KLQkJcmMgPSBlbXVsYXRlX3BvcF9zcmVnKGN0eHQsIG9wcywgVkNQVV9TUkVHX0dTKTsKKwkJcmMgPSBlbXVsYXRlX3BvcF9zcmVnKGN0eHQsIFZDUFVfU1JFR19HUyk7CiAJCWJyZWFrOwogCWNhc2UgMHhhYjoKIAkgICAgICBidHM6CQkvKiBidHMgKi8KLQkJZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoImJ0cyIsIGMtPnNyYywgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZSgiYnRzIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgMHhhYzogLyogc2hyZCBpbW04LCByLCByL20gKi8KIAljYXNlIDB4YWQ6IC8qIHNocmQgY2wsIHIsIHIvbSAqLwotCQllbXVsYXRlXzJvcF9jbCgic2hyZCIsIGMtPnNyYzIsIGMtPnNyYywgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9jbCgic2hyZCIsIGN0eHQtPnNyYzIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIDB4YWU6ICAgICAgICAgICAgICAvKiBjbGZsdXNoICovCiAJCWJyZWFrOwpAQCAtNDI2NCwzOCArNDE0MSwzOCBAQAogCQkgKiBTYXZlIHJlYWwgc291cmNlIHZhbHVlLCB0aGVuIGNvbXBhcmUgRUFYIGFnYWluc3QKIAkJICogZGVzdGluYXRpb24uCiAJCSAqLwotCQljLT5zcmMub3JpZ192YWwgPSBjLT5zcmMudmFsOwotCQljLT5zcmMudmFsID0gYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXTsKLQkJZW11bGF0ZV8yb3BfU3JjVigiY21wIiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWN0eHQtPnNyYy5vcmlnX3ZhbCA9IGN0eHQtPnNyYy52YWw7CisJCWN0eHQtPnNyYy52YWwgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQVhdOworCQllbXVsYXRlXzJvcF9TcmNWKCJjbXAiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAkJaWYgKGN0eHQtPmVmbGFncyAmIEVGTEdfWkYpIHsKIAkJCS8qIFN1Y2Nlc3M6IHdyaXRlIGJhY2sgdG8gbWVtb3J5LiAqLwotCQkJYy0+ZHN0LnZhbCA9IGMtPnNyYy5vcmlnX3ZhbDsKKwkJCWN0eHQtPmRzdC52YWwgPSBjdHh0LT5zcmMub3JpZ192YWw7CiAJCX0gZWxzZSB7CiAJCQkvKiBGYWlsdXJlOiB3cml0ZSB0aGUgdmFsdWUgd2Ugc2F3IHRvIEVBWC4gKi8KLQkJCWMtPmRzdC50eXBlID0gT1BfUkVHOwotCQkJYy0+ZHN0LmFkZHIucmVnID0gKHVuc2lnbmVkIGxvbmcgKikmYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXTsKKwkJCWN0eHQtPmRzdC50eXBlID0gT1BfUkVHOworCQkJY3R4dC0+ZHN0LmFkZHIucmVnID0gKHVuc2lnbmVkIGxvbmcgKikmY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkFYXTsKIAkJfQogCQlicmVhazsKIAljYXNlIDB4YjI6CQkvKiBsc3MgKi8KLQkJcmMgPSBlbXVsYXRlX2xvYWRfc2VnbWVudChjdHh0LCBvcHMsIFZDUFVfU1JFR19TUyk7CisJCXJjID0gZW11bGF0ZV9sb2FkX3NlZ21lbnQoY3R4dCwgVkNQVV9TUkVHX1NTKTsKIAkJYnJlYWs7CiAJY2FzZSAweGIzOgogCSAgICAgIGJ0cjoJCS8qIGJ0ciAqLwotCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZSgiYnRyIiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY1Zfbm9ieXRlKCJidHIiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSAweGI0OgkJLyogbGZzICovCi0JCXJjID0gZW11bGF0ZV9sb2FkX3NlZ21lbnQoY3R4dCwgb3BzLCBWQ1BVX1NSRUdfRlMpOworCQlyYyA9IGVtdWxhdGVfbG9hZF9zZWdtZW50KGN0eHQsIFZDUFVfU1JFR19GUyk7CiAJCWJyZWFrOwogCWNhc2UgMHhiNToJCS8qIGxncyAqLwotCQlyYyA9IGVtdWxhdGVfbG9hZF9zZWdtZW50KGN0eHQsIG9wcywgVkNQVV9TUkVHX0dTKTsKKwkJcmMgPSBlbXVsYXRlX2xvYWRfc2VnbWVudChjdHh0LCBWQ1BVX1NSRUdfR1MpOwogCQlicmVhazsKIAljYXNlIDB4YjYgLi4uIDB4Yjc6CS8qIG1vdnp4ICovCi0JCWMtPmRzdC5ieXRlcyA9IGMtPm9wX2J5dGVzOwotCQljLT5kc3QudmFsID0gKGMtPmQgJiBCeXRlT3ApID8gKHU4KSBjLT5zcmMudmFsCi0JCQkJCQkgICAgICAgOiAodTE2KSBjLT5zcmMudmFsOworCQljdHh0LT5kc3QuYnl0ZXMgPSBjdHh0LT5vcF9ieXRlczsKKwkJY3R4dC0+ZHN0LnZhbCA9IChjdHh0LT5kICYgQnl0ZU9wKSA/ICh1OCkgY3R4dC0+c3JjLnZhbAorCQkJCQkJICAgICAgIDogKHUxNikgY3R4dC0+c3JjLnZhbDsKIAkJYnJlYWs7CiAJY2FzZSAweGJhOgkJLyogR3JwOCAqLwotCQlzd2l0Y2ggKGMtPm1vZHJtX3JlZyAmIDMpIHsKKwkJc3dpdGNoIChjdHh0LT5tb2RybV9yZWcgJiAzKSB7CiAJCWNhc2UgMDoKIAkJCWdvdG8gYnQ7CiAJCWNhc2UgMToKQEAgLTQzMDgsNDcgKzQxODUsNDcgQEAKIAkJYnJlYWs7CiAJY2FzZSAweGJiOgogCSAgICAgIGJ0YzoJCS8qIGJ0YyAqLwotCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZSgiYnRjIiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY1Zfbm9ieXRlKCJidGMiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSAweGJjOiB7CQkvKiBic2YgKi8KIAkJdTggemY7CiAJCV9fYXNtX18gKCJic2YgJTIsICUwOyBzZXR6ICUxIgotCQkJIDogIj1yIihjLT5kc3QudmFsKSwgIj1xIih6ZikKLQkJCSA6ICJyIihjLT5zcmMudmFsKSk7CisJCQkgOiAiPXIiKGN0eHQtPmRzdC52YWwpLCAiPXEiKHpmKQorCQkJIDogInIiKGN0eHQtPnNyYy52YWwpKTsKIAkJY3R4dC0+ZWZsYWdzICY9IH5YODZfRUZMQUdTX1pGOwogCQlpZiAoemYpIHsKIAkJCWN0eHQtPmVmbGFncyB8PSBYODZfRUZMQUdTX1pGOwotCQkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOwkvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KKwkJCWN0eHQtPmRzdC50eXBlID0gT1BfTk9ORTsJLyogRGlzYWJsZSB3cml0ZWJhY2suICovCiAJCX0KIAkJYnJlYWs7CiAJfQogCWNhc2UgMHhiZDogewkJLyogYnNyICovCiAJCXU4IHpmOwogCQlfX2FzbV9fICgiYnNyICUyLCAlMDsgc2V0eiAlMSIKLQkJCSA6ICI9ciIoYy0+ZHN0LnZhbCksICI9cSIoemYpCi0JCQkgOiAiciIoYy0+c3JjLnZhbCkpOworCQkJIDogIj1yIihjdHh0LT5kc3QudmFsKSwgIj1xIih6ZikKKwkJCSA6ICJyIihjdHh0LT5zcmMudmFsKSk7CiAJCWN0eHQtPmVmbGFncyAmPSB+WDg2X0VGTEFHU19aRjsKIAkJaWYgKHpmKSB7CiAJCQljdHh0LT5lZmxhZ3MgfD0gWDg2X0VGTEFHU19aRjsKLQkJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsJLyogRGlzYWJsZSB3cml0ZWJhY2suICovCisJCQljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7CS8qIERpc2FibGUgd3JpdGViYWNrLiAqLwogCQl9CiAJCWJyZWFrOwogCX0KIAljYXNlIDB4YmUgLi4uIDB4YmY6CS8qIG1vdnN4ICovCi0JCWMtPmRzdC5ieXRlcyA9IGMtPm9wX2J5dGVzOwotCQljLT5kc3QudmFsID0gKGMtPmQgJiBCeXRlT3ApID8gKHM4KSBjLT5zcmMudmFsIDoKLQkJCQkJCQkoczE2KSBjLT5zcmMudmFsOworCQljdHh0LT5kc3QuYnl0ZXMgPSBjdHh0LT5vcF9ieXRlczsKKwkJY3R4dC0+ZHN0LnZhbCA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IChzOCkgY3R4dC0+c3JjLnZhbCA6CisJCQkJCQkJKHMxNikgY3R4dC0+c3JjLnZhbDsKIAkJYnJlYWs7CiAJY2FzZSAweGMwIC4uLiAweGMxOgkvKiB4YWRkICovCi0JCWVtdWxhdGVfMm9wX1NyY1YoImFkZCIsIGMtPnNyYywgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNWKCJhZGQiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKIAkJLyogV3JpdGUgYmFjayB0aGUgcmVnaXN0ZXIgc291cmNlLiAqLwotCQljLT5zcmMudmFsID0gYy0+ZHN0Lm9yaWdfdmFsOwotCQl3cml0ZV9yZWdpc3Rlcl9vcGVyYW5kKCZjLT5zcmMpOworCQljdHh0LT5zcmMudmFsID0gY3R4dC0+ZHN0Lm9yaWdfdmFsOworCQl3cml0ZV9yZWdpc3Rlcl9vcGVyYW5kKCZjdHh0LT5zcmMpOwogCQlicmVhazsKIAljYXNlIDB4YzM6CQkvKiBtb3ZudGkgKi8KLQkJYy0+ZHN0LmJ5dGVzID0gYy0+b3BfYnl0ZXM7Ci0JCWMtPmRzdC52YWwgPSAoYy0+b3BfYnl0ZXMgPT0gNCkgPyAodTMyKSBjLT5zcmMudmFsIDoKLQkJCQkJCQkodTY0KSBjLT5zcmMudmFsOworCQljdHh0LT5kc3QuYnl0ZXMgPSBjdHh0LT5vcF9ieXRlczsKKwkJY3R4dC0+ZHN0LnZhbCA9IChjdHh0LT5vcF9ieXRlcyA9PSA0KSA/ICh1MzIpIGN0eHQtPnNyYy52YWwgOgorCQkJCQkJCSh1NjQpIGN0eHQtPnNyYy52YWw7CiAJCWJyZWFrOwogCWNhc2UgMHhjNzoJCS8qIEdycDkgKGNtcHhjaGc4YikgKi8KIAkJcmMgPSBlbV9ncnA5KGN0eHQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL21tdS5jIGIvYXJjaC94ODYva3ZtL21tdS5jCmluZGV4IGJkMTRiYjQuLjFjNWI2OTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9tbXUuYworKysgYi9hcmNoL3g4Ni9rdm0vbW11LmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlICJtbXUuaCIKICNpbmNsdWRlICJ4ODYuaCIKICNpbmNsdWRlICJrdm1fY2FjaGVfcmVncy5oIgotI2luY2x1ZGUgIng4Ni5oIgogCiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMTQ4LDcgKzE0Nyw3IEBACiAjZGVmaW5lIFBUNjRfUEVSTV9NQVNLIChQVF9QUkVTRU5UX01BU0sgfCBQVF9XUklUQUJMRV9NQVNLIHwgUFRfVVNFUl9NQVNLIFwKIAkJCXwgUFQ2NF9OWF9NQVNLKQogCi0jZGVmaW5lIFJNQVBfRVhUIDQKKyNkZWZpbmUgUFRFX0xJU1RfRVhUIDQKIAogI2RlZmluZSBBQ0NfRVhFQ19NQVNLICAgIDEKICNkZWZpbmUgQUNDX1dSSVRFX01BU0sgICBQVF9XUklUQUJMRV9NQVNLCkBAIC0xNjQsMTYgKzE2MywxNiBAQAogCiAjZGVmaW5lIFNIQURPV19QVF9JTkRFWChhZGRyLCBsZXZlbCkgUFQ2NF9JTkRFWChhZGRyLCBsZXZlbCkKIAotc3RydWN0IGt2bV9ybWFwX2Rlc2MgewotCXU2NCAqc3B0ZXNbUk1BUF9FWFRdOwotCXN0cnVjdCBrdm1fcm1hcF9kZXNjICptb3JlOworc3RydWN0IHB0ZV9saXN0X2Rlc2MgeworCXU2NCAqc3B0ZXNbUFRFX0xJU1RfRVhUXTsKKwlzdHJ1Y3QgcHRlX2xpc3RfZGVzYyAqbW9yZTsKIH07CiAKIHN0cnVjdCBrdm1fc2hhZG93X3dhbGtfaXRlcmF0b3IgewogCXU2NCBhZGRyOwogCWhwYV90IHNoYWRvd19hZGRyOwotCWludCBsZXZlbDsKIAl1NjQgKnNwdGVwOworCWludCBsZXZlbDsKIAl1bnNpZ25lZCBpbmRleDsKIH07CiAKQEAgLTE4MiwzMyArMTgxLDY5IEBACiAJICAgICBzaGFkb3dfd2Fsa19va2F5KCYoX3dhbGtlcikpOwkJCVwKIAkgICAgIHNoYWRvd193YWxrX25leHQoJihfd2Fsa2VyKSkpCiAKLXR5cGVkZWYgdm9pZCAoKm1tdV9wYXJlbnRfd2Fsa19mbikgKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLCB1NjQgKnNwdGUpOworI2RlZmluZSBmb3JfZWFjaF9zaGFkb3dfZW50cnlfbG9ja2xlc3MoX3ZjcHUsIF9hZGRyLCBfd2Fsa2VyLCBzcHRlKQlcCisJZm9yIChzaGFkb3dfd2Fsa19pbml0KCYoX3dhbGtlciksIF92Y3B1LCBfYWRkcik7CQlcCisJICAgICBzaGFkb3dfd2Fsa19va2F5KCYoX3dhbGtlcikpICYmCQkJCVwKKwkJKHsgc3B0ZSA9IG1tdV9zcHRlX2dldF9sb2NrbGVzcyhfd2Fsa2VyLnNwdGVwKTsgMTsgfSk7CVwKKwkgICAgIF9fc2hhZG93X3dhbGtfbmV4dCgmKF93YWxrZXIpLCBzcHRlKSkKIAotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwdGVfY2hhaW5fY2FjaGU7Ci1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJtYXBfZGVzY19jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcHRlX2xpc3RfZGVzY19jYWNoZTsKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbW11X3BhZ2VfaGVhZGVyX2NhY2hlOwogc3RhdGljIHN0cnVjdCBwZXJjcHVfY291bnRlciBrdm1fdG90YWxfdXNlZF9tbXVfcGFnZXM7CiAKLXN0YXRpYyB1NjQgX19yZWFkX21vc3RseSBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZTsKLXN0YXRpYyB1NjQgX19yZWFkX21vc3RseSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlOwogc3RhdGljIHU2NCBfX3JlYWRfbW9zdGx5IHNoYWRvd19ueF9tYXNrOwogc3RhdGljIHU2NCBfX3JlYWRfbW9zdGx5IHNoYWRvd194X21hc2s7CS8qIG11dHVhbCBleGNsdXNpdmUgd2l0aCBueF9tYXNrICovCiBzdGF0aWMgdTY0IF9fcmVhZF9tb3N0bHkgc2hhZG93X3VzZXJfbWFzazsKIHN0YXRpYyB1NjQgX19yZWFkX21vc3RseSBzaGFkb3dfYWNjZXNzZWRfbWFzazsKIHN0YXRpYyB1NjQgX19yZWFkX21vc3RseSBzaGFkb3dfZGlydHlfbWFzazsKK3N0YXRpYyB1NjQgX19yZWFkX21vc3RseSBzaGFkb3dfbW1pb19tYXNrOworCitzdGF0aWMgdm9pZCBtbXVfc3B0ZV9zZXQodTY0ICpzcHRlcCwgdTY0IHNwdGUpOworCit2b2lkIGt2bV9tbXVfc2V0X21taW9fc3B0ZV9tYXNrKHU2NCBtbWlvX21hc2spCit7CisJc2hhZG93X21taW9fbWFzayA9IG1taW9fbWFzazsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV9tbXVfc2V0X21taW9fc3B0ZV9tYXNrKTsKKworc3RhdGljIHZvaWQgbWFya19tbWlvX3NwdGUodTY0ICpzcHRlcCwgdTY0IGdmbiwgdW5zaWduZWQgYWNjZXNzKQoreworCWFjY2VzcyAmPSBBQ0NfV1JJVEVfTUFTSyB8IEFDQ19VU0VSX01BU0s7CisKKwl0cmFjZV9tYXJrX21taW9fc3B0ZShzcHRlcCwgZ2ZuLCBhY2Nlc3MpOworCW1tdV9zcHRlX3NldChzcHRlcCwgc2hhZG93X21taW9fbWFzayB8IGFjY2VzcyB8IGdmbiA8PCBQQUdFX1NISUZUKTsKK30KKworc3RhdGljIGJvb2wgaXNfbW1pb19zcHRlKHU2NCBzcHRlKQoreworCXJldHVybiAoc3B0ZSAmIHNoYWRvd19tbWlvX21hc2spID09IHNoYWRvd19tbWlvX21hc2s7Cit9CisKK3N0YXRpYyBnZm5fdCBnZXRfbW1pb19zcHRlX2dmbih1NjQgc3B0ZSkKK3sKKwlyZXR1cm4gKHNwdGUgJiB+c2hhZG93X21taW9fbWFzaykgPj4gUEFHRV9TSElGVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGdldF9tbWlvX3NwdGVfYWNjZXNzKHU2NCBzcHRlKQoreworCXJldHVybiAoc3B0ZSAmIH5zaGFkb3dfbW1pb19tYXNrKSAmIH5QQUdFX01BU0s7Cit9CisKK3N0YXRpYyBib29sIHNldF9tbWlvX3NwdGUodTY0ICpzcHRlcCwgZ2ZuX3QgZ2ZuLCBwZm5fdCBwZm4sIHVuc2lnbmVkIGFjY2VzcykKK3sKKwlpZiAodW5saWtlbHkoaXNfbm9zbG90X3BmbihwZm4pKSkgeworCQltYXJrX21taW9fc3B0ZShzcHRlcCwgZ2ZuLCBhY2Nlc3MpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdTY0IHJzdmRfYml0cyhpbnQgcywgaW50IGUpCiB7CiAJcmV0dXJuICgoMVVMTCA8PCAoZSAtIHMgKyAxKSkgLSAxKSA8PCBzOwogfQogCi12b2lkIGt2bV9tbXVfc2V0X25vbnByZXNlbnRfcHRlcyh1NjQgdHJhcF9wdGUsIHU2NCBub3RyYXBfcHRlKQotewotCXNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlID0gdHJhcF9wdGU7Ci0Jc2hhZG93X25vdHJhcF9ub25wcmVzZW50X3B0ZSA9IG5vdHJhcF9wdGU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChrdm1fbW11X3NldF9ub25wcmVzZW50X3B0ZXMpOwotCiB2b2lkIGt2bV9tbXVfc2V0X21hc2tfcHRlcyh1NjQgdXNlcl9tYXNrLCB1NjQgYWNjZXNzZWRfbWFzaywKIAkJdTY0IGRpcnR5X21hc2ssIHU2NCBueF9tYXNrLCB1NjQgeF9tYXNrKQogewpAQCAtMjIwLDExICsyNTUsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX21tdV9zZXRfbWFza19wdGVzKTsKIAotc3RhdGljIGJvb2wgaXNfd3JpdGVfcHJvdGVjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0JcmV0dXJuIGt2bV9yZWFkX2NyMF9iaXRzKHZjcHUsIFg4Nl9DUjBfV1ApOwotfQotCiBzdGF0aWMgaW50IGlzX2NwdWlkX1BTRTM2KHZvaWQpCiB7CiAJcmV0dXJuIDE7CkBAIC0yMzcsOCArMjY3LDcgQEAKIAogc3RhdGljIGludCBpc19zaGFkb3dfcHJlc2VudF9wdGUodTY0IHB0ZSkKIHsKLQlyZXR1cm4gcHRlICE9IHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlCi0JCSYmIHB0ZSAhPSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlOworCXJldHVybiBwdGUgJiBQVF9QUkVTRU5UX01BU0sgJiYgIWlzX21taW9fc3B0ZShwdGUpOwogfQogCiBzdGF0aWMgaW50IGlzX2xhcmdlX3B0ZSh1NjQgcHRlKQpAQCAtMjQ2LDExICsyNzUsNiBAQAogCXJldHVybiBwdGUgJiBQVF9QQUdFX1NJWkVfTUFTSzsKIH0KIAotc3RhdGljIGludCBpc193cml0YWJsZV9wdGUodW5zaWduZWQgbG9uZyBwdGUpCi17Ci0JcmV0dXJuIHB0ZSAmIFBUX1dSSVRBQkxFX01BU0s7Ci19Ci0KIHN0YXRpYyBpbnQgaXNfZGlydHlfZ3B0ZSh1bnNpZ25lZCBsb25nIHB0ZSkKIHsKIAlyZXR1cm4gcHRlICYgUFRfRElSVFlfTUFTSzsKQEAgLTI4MiwyNiArMzA2LDE1NCBAQAogCXJldHVybiAoZ3B0ZSAmIFBUMzJfRElSX1BTRTM2X01BU0spIDw8IHNoaWZ0OwogfQogCisjaWZkZWYgQ09ORklHX1g4Nl82NAogc3RhdGljIHZvaWQgX19zZXRfc3B0ZSh1NjQgKnNwdGVwLCB1NjQgc3B0ZSkKIHsKLQlzZXRfNjRiaXQoc3B0ZXAsIHNwdGUpOworCSpzcHRlcCA9IHNwdGU7CiB9CiAKLXN0YXRpYyB1NjQgX194Y2hnX3NwdGUodTY0ICpzcHRlcCwgdTY0IG5ld19zcHRlKQorc3RhdGljIHZvaWQgX191cGRhdGVfY2xlYXJfc3B0ZV9mYXN0KHU2NCAqc3B0ZXAsIHU2NCBzcHRlKQogewotI2lmZGVmIENPTkZJR19YODZfNjQKLQlyZXR1cm4geGNoZyhzcHRlcCwgbmV3X3NwdGUpOwotI2Vsc2UKLQl1NjQgb2xkX3NwdGU7Ci0KLQlkbyB7Ci0JCW9sZF9zcHRlID0gKnNwdGVwOwotCX0gd2hpbGUgKGNtcHhjaGc2NChzcHRlcCwgb2xkX3NwdGUsIG5ld19zcHRlKSAhPSBvbGRfc3B0ZSk7Ci0KLQlyZXR1cm4gb2xkX3NwdGU7Ci0jZW5kaWYKKwkqc3B0ZXAgPSBzcHRlOwogfQogCitzdGF0aWMgdTY0IF9fdXBkYXRlX2NsZWFyX3NwdGVfc2xvdyh1NjQgKnNwdGVwLCB1NjQgc3B0ZSkKK3sKKwlyZXR1cm4geGNoZyhzcHRlcCwgc3B0ZSk7Cit9CisKK3N0YXRpYyB1NjQgX19nZXRfc3B0ZV9sb2NrbGVzcyh1NjQgKnNwdGVwKQoreworCXJldHVybiBBQ0NFU1NfT05DRSgqc3B0ZXApOworfQorCitzdGF0aWMgYm9vbCBfX2NoZWNrX2RpcmVjdF9zcHRlX21taW9fcGYodTY0IHNwdGUpCit7CisJLyogSXQgaXMgdmFsaWQgaWYgdGhlIHNwdGUgaXMgemFwcGVkLiAqLworCXJldHVybiBzcHRlID09IDB1bGw7Cit9CisjZWxzZQordW5pb24gc3BsaXRfc3B0ZSB7CisJc3RydWN0IHsKKwkJdTMyIHNwdGVfbG93OworCQl1MzIgc3B0ZV9oaWdoOworCX07CisJdTY0IHNwdGU7Cit9OworCitzdGF0aWMgdm9pZCBjb3VudF9zcHRlX2NsZWFyKHU2NCAqc3B0ZXAsIHU2NCBzcHRlKQoreworCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwID0gIHBhZ2VfaGVhZGVyKF9fcGEoc3B0ZXApKTsKKworCWlmIChpc19zaGFkb3dfcHJlc2VudF9wdGUoc3B0ZSkpCisJCXJldHVybjsKKworCS8qIEVuc3VyZSB0aGUgc3B0ZSBpcyBjb21wbGV0ZWx5IHNldCBiZWZvcmUgd2UgaW5jcmVhc2UgdGhlIGNvdW50ICovCisJc21wX3dtYigpOworCXNwLT5jbGVhcl9zcHRlX2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkIF9fc2V0X3NwdGUodTY0ICpzcHRlcCwgdTY0IHNwdGUpCit7CisJdW5pb24gc3BsaXRfc3B0ZSAqc3NwdGVwLCBzc3B0ZTsKKworCXNzcHRlcCA9ICh1bmlvbiBzcGxpdF9zcHRlICopc3B0ZXA7CisJc3NwdGUgPSAodW5pb24gc3BsaXRfc3B0ZSlzcHRlOworCisJc3NwdGVwLT5zcHRlX2hpZ2ggPSBzc3B0ZS5zcHRlX2hpZ2g7CisKKwkvKgorCSAqIElmIHdlIG1hcCB0aGUgc3B0ZSBmcm9tIG5vbnByZXNlbnQgdG8gcHJlc2VudCwgV2Ugc2hvdWxkIHN0b3JlCisJICogdGhlIGhpZ2ggYml0cyBmaXJzdGx5LCB0aGVuIHNldCBwcmVzZW50IGJpdCwgc28gY3B1IGNhbiBub3QKKwkgKiBmZXRjaCB0aGlzIHNwdGUgd2hpbGUgd2UgYXJlIHNldHRpbmcgdGhlIHNwdGUuCisJICovCisJc21wX3dtYigpOworCisJc3NwdGVwLT5zcHRlX2xvdyA9IHNzcHRlLnNwdGVfbG93OworfQorCitzdGF0aWMgdm9pZCBfX3VwZGF0ZV9jbGVhcl9zcHRlX2Zhc3QodTY0ICpzcHRlcCwgdTY0IHNwdGUpCit7CisJdW5pb24gc3BsaXRfc3B0ZSAqc3NwdGVwLCBzc3B0ZTsKKworCXNzcHRlcCA9ICh1bmlvbiBzcGxpdF9zcHRlICopc3B0ZXA7CisJc3NwdGUgPSAodW5pb24gc3BsaXRfc3B0ZSlzcHRlOworCisJc3NwdGVwLT5zcHRlX2xvdyA9IHNzcHRlLnNwdGVfbG93OworCisJLyoKKwkgKiBJZiB3ZSBtYXAgdGhlIHNwdGUgZnJvbSBwcmVzZW50IHRvIG5vbnByZXNlbnQsIHdlIHNob3VsZCBjbGVhcgorCSAqIHByZXNlbnQgYml0IGZpcnN0bHkgdG8gYXZvaWQgdmNwdSBmZXRjaCB0aGUgb2xkIGhpZ2ggYml0cy4KKwkgKi8KKwlzbXBfd21iKCk7CisKKwlzc3B0ZXAtPnNwdGVfaGlnaCA9IHNzcHRlLnNwdGVfaGlnaDsKKwljb3VudF9zcHRlX2NsZWFyKHNwdGVwLCBzcHRlKTsKK30KKworc3RhdGljIHU2NCBfX3VwZGF0ZV9jbGVhcl9zcHRlX3Nsb3codTY0ICpzcHRlcCwgdTY0IHNwdGUpCit7CisJdW5pb24gc3BsaXRfc3B0ZSAqc3NwdGVwLCBzc3B0ZSwgb3JpZzsKKworCXNzcHRlcCA9ICh1bmlvbiBzcGxpdF9zcHRlICopc3B0ZXA7CisJc3NwdGUgPSAodW5pb24gc3BsaXRfc3B0ZSlzcHRlOworCisJLyogeGNoZyBhY3RzIGFzIGEgYmFycmllciBiZWZvcmUgdGhlIHNldHRpbmcgb2YgdGhlIGhpZ2ggYml0cyAqLworCW9yaWcuc3B0ZV9sb3cgPSB4Y2hnKCZzc3B0ZXAtPnNwdGVfbG93LCBzc3B0ZS5zcHRlX2xvdyk7CisJb3JpZy5zcHRlX2hpZ2ggPSBzc3B0ZXAtPnNwdGVfaGlnaCA9IHNzcHRlLnNwdGVfaGlnaDsKKwljb3VudF9zcHRlX2NsZWFyKHNwdGVwLCBzcHRlKTsKKworCXJldHVybiBvcmlnLnNwdGU7Cit9CisKKy8qCisgKiBUaGUgaWRlYSB1c2luZyB0aGUgbGlnaHQgd2F5IGdldCB0aGUgc3B0ZSBvbiB4ODZfMzIgZ3Vlc3QgaXMgZnJvbQorICogZ3VwX2dldF9wdGUoYXJjaC94ODYvbW0vZ3VwLmMpLgorICogVGhlIGRpZmZlcmVuY2UgaXMgd2UgY2FuIG5vdCBjYXRjaCB0aGUgc3B0ZSB0bGIgZmx1c2ggaWYgd2UgbGVhdmUKKyAqIGd1ZXN0IG1vZGUsIHNvIHdlIGVtdWxhdGUgaXQgYnkgaW5jcmVhc2UgY2xlYXJfc3B0ZV9jb3VudCB3aGVuIHNwdGUKKyAqIGlzIGNsZWFyZWQuCisgKi8KK3N0YXRpYyB1NjQgX19nZXRfc3B0ZV9sb2NrbGVzcyh1NjQgKnNwdGVwKQoreworCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwID0gIHBhZ2VfaGVhZGVyKF9fcGEoc3B0ZXApKTsKKwl1bmlvbiBzcGxpdF9zcHRlIHNwdGUsICpvcmlnID0gKHVuaW9uIHNwbGl0X3NwdGUgKilzcHRlcDsKKwlpbnQgY291bnQ7CisKK3JldHJ5OgorCWNvdW50ID0gc3AtPmNsZWFyX3NwdGVfY291bnQ7CisJc21wX3JtYigpOworCisJc3B0ZS5zcHRlX2xvdyA9IG9yaWctPnNwdGVfbG93OworCXNtcF9ybWIoKTsKKworCXNwdGUuc3B0ZV9oaWdoID0gb3JpZy0+c3B0ZV9oaWdoOworCXNtcF9ybWIoKTsKKworCWlmICh1bmxpa2VseShzcHRlLnNwdGVfbG93ICE9IG9yaWctPnNwdGVfbG93IHx8CisJICAgICAgY291bnQgIT0gc3AtPmNsZWFyX3NwdGVfY291bnQpKQorCQlnb3RvIHJldHJ5OworCisJcmV0dXJuIHNwdGUuc3B0ZTsKK30KKworc3RhdGljIGJvb2wgX19jaGVja19kaXJlY3Rfc3B0ZV9tbWlvX3BmKHU2NCBzcHRlKQoreworCXVuaW9uIHNwbGl0X3NwdGUgc3NwdGUgPSAodW5pb24gc3BsaXRfc3B0ZSlzcHRlOworCXUzMiBoaWdoX21taW9fbWFzayA9IHNoYWRvd19tbWlvX21hc2sgPj4gMzI7CisKKwkvKiBJdCBpcyB2YWxpZCBpZiB0aGUgc3B0ZSBpcyB6YXBwZWQuICovCisJaWYgKHNwdGUgPT0gMHVsbCkKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBJdCBpcyB2YWxpZCBpZiB0aGUgc3B0ZSBpcyBiZWluZyB6YXBwZWQuICovCisJaWYgKHNzcHRlLnNwdGVfbG93ID09IDB1bGwgJiYKKwkgICAgKHNzcHRlLnNwdGVfaGlnaCAmIGhpZ2hfbW1pb19tYXNrKSA9PSBoaWdoX21taW9fbWFzaykKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKwogc3RhdGljIGJvb2wgc3B0ZV9oYXNfdm9sYXRpbGVfYml0cyh1NjQgc3B0ZSkKIHsKIAlpZiAoIXNoYWRvd19hY2Nlc3NlZF9tYXNrKQpAQCAtMzIyLDEyICs0NzQsMzAgQEAKIAlyZXR1cm4gKG9sZF9zcHRlICYgYml0X21hc2spICYmICEobmV3X3NwdGUgJiBiaXRfbWFzayk7CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9zcHRlKHU2NCAqc3B0ZXAsIHU2NCBuZXdfc3B0ZSkKKy8qIFJ1bGVzIGZvciB1c2luZyBtbXVfc3B0ZV9zZXQ6CisgKiBTZXQgdGhlIHNwdGVwIGZyb20gbm9ucHJlc2VudCB0byBwcmVzZW50LgorICogTm90ZTogdGhlIHNwdGVwIGJlaW5nIGFzc2lnbmVkICptdXN0KiBiZSBlaXRoZXIgbm90IHByZXNlbnQKKyAqIG9yIGluIGEgc3RhdGUgd2hlcmUgdGhlIGhhcmR3YXJlIHdpbGwgbm90IGF0dGVtcHQgdG8gdXBkYXRlCisgKiB0aGUgc3B0ZS4KKyAqLworc3RhdGljIHZvaWQgbW11X3NwdGVfc2V0KHU2NCAqc3B0ZXAsIHU2NCBuZXdfc3B0ZSkKK3sKKwlXQVJOX09OKGlzX3NoYWRvd19wcmVzZW50X3B0ZSgqc3B0ZXApKTsKKwlfX3NldF9zcHRlKHNwdGVwLCBuZXdfc3B0ZSk7Cit9CisKKy8qIFJ1bGVzIGZvciB1c2luZyBtbXVfc3B0ZV91cGRhdGU6CisgKiBVcGRhdGUgdGhlIHN0YXRlIGJpdHMsIGl0IG1lYW5zIHRoZSBtYXBwZWQgcGZuIGlzIG5vdCBjaGFuZ2dlZC4KKyAqLworc3RhdGljIHZvaWQgbW11X3NwdGVfdXBkYXRlKHU2NCAqc3B0ZXAsIHU2NCBuZXdfc3B0ZSkKIHsKIAl1NjQgbWFzaywgb2xkX3NwdGUgPSAqc3B0ZXA7CiAKIAlXQVJOX09OKCFpc19ybWFwX3NwdGUobmV3X3NwdGUpKTsKIAorCWlmICghaXNfc2hhZG93X3ByZXNlbnRfcHRlKG9sZF9zcHRlKSkKKwkJcmV0dXJuIG1tdV9zcHRlX3NldChzcHRlcCwgbmV3X3NwdGUpOworCiAJbmV3X3NwdGUgfD0gb2xkX3NwdGUgJiBzaGFkb3dfZGlydHlfbWFzazsKIAogCW1hc2sgPSBzaGFkb3dfYWNjZXNzZWRfbWFzazsKQEAgLTMzNSw5ICs1MDUsOSBAQAogCQltYXNrIHw9IHNoYWRvd19kaXJ0eV9tYXNrOwogCiAJaWYgKCFzcHRlX2hhc192b2xhdGlsZV9iaXRzKG9sZF9zcHRlKSB8fCAobmV3X3NwdGUgJiBtYXNrKSA9PSBtYXNrKQotCQlfX3NldF9zcHRlKHNwdGVwLCBuZXdfc3B0ZSk7CisJCV9fdXBkYXRlX2NsZWFyX3NwdGVfZmFzdChzcHRlcCwgbmV3X3NwdGUpOwogCWVsc2UKLQkJb2xkX3NwdGUgPSBfX3hjaGdfc3B0ZShzcHRlcCwgbmV3X3NwdGUpOworCQlvbGRfc3B0ZSA9IF9fdXBkYXRlX2NsZWFyX3NwdGVfc2xvdyhzcHRlcCwgbmV3X3NwdGUpOwogCiAJaWYgKCFzaGFkb3dfYWNjZXNzZWRfbWFzaykKIAkJcmV0dXJuOwpAQCAtMzQ4LDYgKzUxOCw2NCBAQAogCQlrdm1fc2V0X3Bmbl9kaXJ0eShzcHRlX3RvX3BmbihvbGRfc3B0ZSkpOwogfQogCisvKgorICogUnVsZXMgZm9yIHVzaW5nIG1tdV9zcHRlX2NsZWFyX3RyYWNrX2JpdHM6CisgKiBJdCBzZXRzIHRoZSBzcHRlcCBmcm9tIHByZXNlbnQgdG8gbm9ucHJlc2VudCwgYW5kIHRyYWNrIHRoZQorICogc3RhdGUgYml0cywgaXQgaXMgdXNlZCB0byBjbGVhciB0aGUgbGFzdCBsZXZlbCBzcHRlcC4KKyAqLworc3RhdGljIGludCBtbXVfc3B0ZV9jbGVhcl90cmFja19iaXRzKHU2NCAqc3B0ZXApCit7CisJcGZuX3QgcGZuOworCXU2NCBvbGRfc3B0ZSA9ICpzcHRlcDsKKworCWlmICghc3B0ZV9oYXNfdm9sYXRpbGVfYml0cyhvbGRfc3B0ZSkpCisJCV9fdXBkYXRlX2NsZWFyX3NwdGVfZmFzdChzcHRlcCwgMHVsbCk7CisJZWxzZQorCQlvbGRfc3B0ZSA9IF9fdXBkYXRlX2NsZWFyX3NwdGVfc2xvdyhzcHRlcCwgMHVsbCk7CisKKwlpZiAoIWlzX3JtYXBfc3B0ZShvbGRfc3B0ZSkpCisJCXJldHVybiAwOworCisJcGZuID0gc3B0ZV90b19wZm4ob2xkX3NwdGUpOworCWlmICghc2hhZG93X2FjY2Vzc2VkX21hc2sgfHwgb2xkX3NwdGUgJiBzaGFkb3dfYWNjZXNzZWRfbWFzaykKKwkJa3ZtX3NldF9wZm5fYWNjZXNzZWQocGZuKTsKKwlpZiAoIXNoYWRvd19kaXJ0eV9tYXNrIHx8IChvbGRfc3B0ZSAmIHNoYWRvd19kaXJ0eV9tYXNrKSkKKwkJa3ZtX3NldF9wZm5fZGlydHkocGZuKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJ1bGVzIGZvciB1c2luZyBtbXVfc3B0ZV9jbGVhcl9ub190cmFjazoKKyAqIERpcmVjdGx5IGNsZWFyIHNwdGUgd2l0aG91dCBjYXJpbmcgdGhlIHN0YXRlIGJpdHMgb2Ygc3B0ZXAsCisgKiBpdCBpcyB1c2VkIHRvIHNldCB0aGUgdXBwZXIgbGV2ZWwgc3B0ZS4KKyAqLworc3RhdGljIHZvaWQgbW11X3NwdGVfY2xlYXJfbm9fdHJhY2sodTY0ICpzcHRlcCkKK3sKKwlfX3VwZGF0ZV9jbGVhcl9zcHRlX2Zhc3Qoc3B0ZXAsIDB1bGwpOworfQorCitzdGF0aWMgdTY0IG1tdV9zcHRlX2dldF9sb2NrbGVzcyh1NjQgKnNwdGVwKQoreworCXJldHVybiBfX2dldF9zcHRlX2xvY2tsZXNzKHNwdGVwKTsKK30KKworc3RhdGljIHZvaWQgd2Fsa19zaGFkb3dfcGFnZV9sb2NrbGVzc19iZWdpbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmN1X3JlYWRfbG9jaygpOworCWF0b21pY19pbmMoJnZjcHUtPmt2bS0+YXJjaC5yZWFkZXJfY291bnRlcik7CisKKwkvKiBJbmNyZWFzZSB0aGUgY291bnRlciBiZWZvcmUgd2Fsa2luZyBzaGFkb3cgcGFnZSB0YWJsZSAqLworCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOworfQorCitzdGF0aWMgdm9pZCB3YWxrX3NoYWRvd19wYWdlX2xvY2tsZXNzX2VuZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJLyogRGVjcmVhc2UgdGhlIGNvdW50ZXIgYWZ0ZXIgd2Fsa2luZyBzaGFkb3cgcGFnZSB0YWJsZSBmaW5pc2hlZCAqLworCXNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKTsKKwlhdG9taWNfZGVjKCZ2Y3B1LT5rdm0tPmFyY2gucmVhZGVyX2NvdW50ZXIpOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCiBzdGF0aWMgaW50IG1tdV90b3B1cF9tZW1vcnlfY2FjaGUoc3RydWN0IGt2bV9tbXVfbWVtb3J5X2NhY2hlICpjYWNoZSwKIAkJCQkgIHN0cnVjdCBrbWVtX2NhY2hlICpiYXNlX2NhY2hlLCBpbnQgbWluKQogewpAQCAtMzk3LDEyICs2MjUsOCBAQAogewogCWludCByOwogCi0JciA9IG1tdV90b3B1cF9tZW1vcnlfY2FjaGUoJnZjcHUtPmFyY2gubW11X3B0ZV9jaGFpbl9jYWNoZSwKLQkJCQkgICBwdGVfY2hhaW5fY2FjaGUsIDQpOwotCWlmIChyKQotCQlnb3RvIG91dDsKLQlyID0gbW11X3RvcHVwX21lbW9yeV9jYWNoZSgmdmNwdS0+YXJjaC5tbXVfcm1hcF9kZXNjX2NhY2hlLAotCQkJCSAgIHJtYXBfZGVzY19jYWNoZSwgNCArIFBURV9QUkVGRVRDSF9OVU0pOworCXIgPSBtbXVfdG9wdXBfbWVtb3J5X2NhY2hlKCZ2Y3B1LT5hcmNoLm1tdV9wdGVfbGlzdF9kZXNjX2NhY2hlLAorCQkJCSAgIHB0ZV9saXN0X2Rlc2NfY2FjaGUsIDggKyBQVEVfUFJFRkVUQ0hfTlVNKTsKIAlpZiAocikKIAkJZ290byBvdXQ7CiAJciA9IG1tdV90b3B1cF9tZW1vcnlfY2FjaGVfcGFnZSgmdmNwdS0+YXJjaC5tbXVfcGFnZV9jYWNoZSwgOCk7CkBAIC00MTYsOCArNjQwLDggQEAKIAogc3RhdGljIHZvaWQgbW11X2ZyZWVfbWVtb3J5X2NhY2hlcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JbW11X2ZyZWVfbWVtb3J5X2NhY2hlKCZ2Y3B1LT5hcmNoLm1tdV9wdGVfY2hhaW5fY2FjaGUsIHB0ZV9jaGFpbl9jYWNoZSk7Ci0JbW11X2ZyZWVfbWVtb3J5X2NhY2hlKCZ2Y3B1LT5hcmNoLm1tdV9ybWFwX2Rlc2NfY2FjaGUsIHJtYXBfZGVzY19jYWNoZSk7CisJbW11X2ZyZWVfbWVtb3J5X2NhY2hlKCZ2Y3B1LT5hcmNoLm1tdV9wdGVfbGlzdF9kZXNjX2NhY2hlLAorCQkJCXB0ZV9saXN0X2Rlc2NfY2FjaGUpOwogCW1tdV9mcmVlX21lbW9yeV9jYWNoZV9wYWdlKCZ2Y3B1LT5hcmNoLm1tdV9wYWdlX2NhY2hlKTsKIAltbXVfZnJlZV9tZW1vcnlfY2FjaGUoJnZjcHUtPmFyY2gubW11X3BhZ2VfaGVhZGVyX2NhY2hlLAogCQkJCW1tdV9wYWdlX2hlYWRlcl9jYWNoZSk7CkBAIC00MzMsMjYgKzY1NywxNSBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgc3RydWN0IGt2bV9wdGVfY2hhaW4gKm1tdV9hbGxvY19wdGVfY2hhaW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIHN0cnVjdCBwdGVfbGlzdF9kZXNjICptbXVfYWxsb2NfcHRlX2xpc3RfZGVzYyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JcmV0dXJuIG1tdV9tZW1vcnlfY2FjaGVfYWxsb2MoJnZjcHUtPmFyY2gubW11X3B0ZV9jaGFpbl9jYWNoZSwKLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGt2bV9wdGVfY2hhaW4pKTsKKwlyZXR1cm4gbW11X21lbW9yeV9jYWNoZV9hbGxvYygmdmNwdS0+YXJjaC5tbXVfcHRlX2xpc3RfZGVzY19jYWNoZSwKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IHB0ZV9saXN0X2Rlc2MpKTsKIH0KIAotc3RhdGljIHZvaWQgbW11X2ZyZWVfcHRlX2NoYWluKHN0cnVjdCBrdm1fcHRlX2NoYWluICpwYykKK3N0YXRpYyB2b2lkIG1tdV9mcmVlX3B0ZV9saXN0X2Rlc2Moc3RydWN0IHB0ZV9saXN0X2Rlc2MgKnB0ZV9saXN0X2Rlc2MpCiB7Ci0Ja21lbV9jYWNoZV9mcmVlKHB0ZV9jaGFpbl9jYWNoZSwgcGMpOwotfQotCi1zdGF0aWMgc3RydWN0IGt2bV9ybWFwX2Rlc2MgKm1tdV9hbGxvY19ybWFwX2Rlc2Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXJldHVybiBtbXVfbWVtb3J5X2NhY2hlX2FsbG9jKCZ2Y3B1LT5hcmNoLm1tdV9ybWFwX2Rlc2NfY2FjaGUsCi0JCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBrdm1fcm1hcF9kZXNjKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1tdV9mcmVlX3JtYXBfZGVzYyhzdHJ1Y3Qga3ZtX3JtYXBfZGVzYyAqcmQpCi17Ci0Ja21lbV9jYWNoZV9mcmVlKHJtYXBfZGVzY19jYWNoZSwgcmQpOworCWttZW1fY2FjaGVfZnJlZShwdGVfbGlzdF9kZXNjX2NhY2hlLCBwdGVfbGlzdF9kZXNjKTsKIH0KIAogc3RhdGljIGdmbl90IGt2bV9tbXVfcGFnZV9nZXRfZ2ZuKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLCBpbnQgaW5kZXgpCkBAIC00OTgsNiArNzExLDcgQEAKIAkJbGluZm8gPSBscGFnZV9pbmZvX3Nsb3QoZ2ZuLCBzbG90LCBpKTsKIAkJbGluZm8tPndyaXRlX2NvdW50ICs9IDE7CiAJfQorCWt2bS0+YXJjaC5pbmRpcmVjdF9zaGFkb3dfcGFnZXMrKzsKIH0KIAogc3RhdGljIHZvaWQgdW5hY2NvdW50X3NoYWRvd2VkKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKQpAQCAtNTEzLDYgKzcyNyw3IEBACiAJCWxpbmZvLT53cml0ZV9jb3VudCAtPSAxOwogCQlXQVJOX09OKGxpbmZvLT53cml0ZV9jb3VudCA8IDApOwogCX0KKwlrdm0tPmFyY2guaW5kaXJlY3Rfc2hhZG93X3BhZ2VzLS07CiB9CiAKIHN0YXRpYyBpbnQgaGFzX3dycHJvdGVjdGVkX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLApAQCAtNTY1LDcgKzc4MCw3IEBACiAKIHN0YXRpYyBib29sIG1hcHBpbmdfbGV2ZWxfZGlydHlfYml0bWFwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ2ZuX3QgbGFyZ2VfZ2ZuKQogewotCXJldHVybiBnZm5fdG9fbWVtc2xvdF9kaXJ0eV9iaXRtYXAodmNwdSwgbGFyZ2VfZ2ZuLCB0cnVlKTsKKwlyZXR1cm4gIWdmbl90b19tZW1zbG90X2RpcnR5X2JpdG1hcCh2Y3B1LCBsYXJnZV9nZm4sIHRydWUpOwogfQogCiBzdGF0aWMgaW50IG1hcHBpbmdfbGV2ZWwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBsYXJnZV9nZm4pCkBAIC01ODgsOSArODAzLDE1OCBAQAogfQogCiAvKgorICogUHRlIG1hcHBpbmcgc3RydWN0dXJlczoKKyAqCisgKiBJZiBwdGVfbGlzdCBiaXQgemVybyBpcyB6ZXJvLCB0aGVuIHB0ZV9saXN0IHBvaW50IHRvIHRoZSBzcHRlLgorICoKKyAqIElmIHB0ZV9saXN0IGJpdCB6ZXJvIGlzIG9uZSwgKHRoZW4gcHRlX2xpc3QgJiB+MSkgcG9pbnRzIHRvIGEgc3RydWN0CisgKiBwdGVfbGlzdF9kZXNjIGNvbnRhaW5pbmcgbW9yZSBtYXBwaW5ncy4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcHRlIGVudHJpZXMgYmVmb3JlIHRoZSBzcHRlIHdhcyBhZGRlZCBvciB6ZXJvIGlmCisgKiB0aGUgc3B0ZSB3YXMgbm90IGFkZGVkLgorICoKKyAqLworc3RhdGljIGludCBwdGVfbGlzdF9hZGQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgKnNwdGUsCisJCQl1bnNpZ25lZCBsb25nICpwdGVfbGlzdCkKK3sKKwlzdHJ1Y3QgcHRlX2xpc3RfZGVzYyAqZGVzYzsKKwlpbnQgaSwgY291bnQgPSAwOworCisJaWYgKCEqcHRlX2xpc3QpIHsKKwkJcm1hcF9wcmludGsoInB0ZV9saXN0X2FkZDogJXAgJWxseCAwLT4xXG4iLCBzcHRlLCAqc3B0ZSk7CisJCSpwdGVfbGlzdCA9ICh1bnNpZ25lZCBsb25nKXNwdGU7CisJfSBlbHNlIGlmICghKCpwdGVfbGlzdCAmIDEpKSB7CisJCXJtYXBfcHJpbnRrKCJwdGVfbGlzdF9hZGQ6ICVwICVsbHggMS0+bWFueVxuIiwgc3B0ZSwgKnNwdGUpOworCQlkZXNjID0gbW11X2FsbG9jX3B0ZV9saXN0X2Rlc2ModmNwdSk7CisJCWRlc2MtPnNwdGVzWzBdID0gKHU2NCAqKSpwdGVfbGlzdDsKKwkJZGVzYy0+c3B0ZXNbMV0gPSBzcHRlOworCQkqcHRlX2xpc3QgPSAodW5zaWduZWQgbG9uZylkZXNjIHwgMTsKKwkJKytjb3VudDsKKwl9IGVsc2UgeworCQlybWFwX3ByaW50aygicHRlX2xpc3RfYWRkOiAlcCAlbGx4IG1hbnktPm1hbnlcbiIsIHNwdGUsICpzcHRlKTsKKwkJZGVzYyA9IChzdHJ1Y3QgcHRlX2xpc3RfZGVzYyAqKSgqcHRlX2xpc3QgJiB+MXVsKTsKKwkJd2hpbGUgKGRlc2MtPnNwdGVzW1BURV9MSVNUX0VYVC0xXSAmJiBkZXNjLT5tb3JlKSB7CisJCQlkZXNjID0gZGVzYy0+bW9yZTsKKwkJCWNvdW50ICs9IFBURV9MSVNUX0VYVDsKKwkJfQorCQlpZiAoZGVzYy0+c3B0ZXNbUFRFX0xJU1RfRVhULTFdKSB7CisJCQlkZXNjLT5tb3JlID0gbW11X2FsbG9jX3B0ZV9saXN0X2Rlc2ModmNwdSk7CisJCQlkZXNjID0gZGVzYy0+bW9yZTsKKwkJfQorCQlmb3IgKGkgPSAwOyBkZXNjLT5zcHRlc1tpXTsgKytpKQorCQkJKytjb3VudDsKKwkJZGVzYy0+c3B0ZXNbaV0gPSBzcHRlOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB1NjQgKnB0ZV9saXN0X25leHQodW5zaWduZWQgbG9uZyAqcHRlX2xpc3QsIHU2NCAqc3B0ZSkKK3sKKwlzdHJ1Y3QgcHRlX2xpc3RfZGVzYyAqZGVzYzsKKwl1NjQgKnByZXZfc3B0ZTsKKwlpbnQgaTsKKworCWlmICghKnB0ZV9saXN0KQorCQlyZXR1cm4gTlVMTDsKKwllbHNlIGlmICghKCpwdGVfbGlzdCAmIDEpKSB7CisJCWlmICghc3B0ZSkKKwkJCXJldHVybiAodTY0ICopKnB0ZV9saXN0OworCQlyZXR1cm4gTlVMTDsKKwl9CisJZGVzYyA9IChzdHJ1Y3QgcHRlX2xpc3RfZGVzYyAqKSgqcHRlX2xpc3QgJiB+MXVsKTsKKwlwcmV2X3NwdGUgPSBOVUxMOworCXdoaWxlIChkZXNjKSB7CisJCWZvciAoaSA9IDA7IGkgPCBQVEVfTElTVF9FWFQgJiYgZGVzYy0+c3B0ZXNbaV07ICsraSkgeworCQkJaWYgKHByZXZfc3B0ZSA9PSBzcHRlKQorCQkJCXJldHVybiBkZXNjLT5zcHRlc1tpXTsKKwkJCXByZXZfc3B0ZSA9IGRlc2MtPnNwdGVzW2ldOworCQl9CisJCWRlc2MgPSBkZXNjLT5tb3JlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3B0ZV9saXN0X2Rlc2NfcmVtb3ZlX2VudHJ5KHVuc2lnbmVkIGxvbmcgKnB0ZV9saXN0LCBzdHJ1Y3QgcHRlX2xpc3RfZGVzYyAqZGVzYywKKwkJCSAgIGludCBpLCBzdHJ1Y3QgcHRlX2xpc3RfZGVzYyAqcHJldl9kZXNjKQoreworCWludCBqOworCisJZm9yIChqID0gUFRFX0xJU1RfRVhUIC0gMTsgIWRlc2MtPnNwdGVzW2pdICYmIGogPiBpOyAtLWopCisJCTsKKwlkZXNjLT5zcHRlc1tpXSA9IGRlc2MtPnNwdGVzW2pdOworCWRlc2MtPnNwdGVzW2pdID0gTlVMTDsKKwlpZiAoaiAhPSAwKQorCQlyZXR1cm47CisJaWYgKCFwcmV2X2Rlc2MgJiYgIWRlc2MtPm1vcmUpCisJCSpwdGVfbGlzdCA9ICh1bnNpZ25lZCBsb25nKWRlc2MtPnNwdGVzWzBdOworCWVsc2UKKwkJaWYgKHByZXZfZGVzYykKKwkJCXByZXZfZGVzYy0+bW9yZSA9IGRlc2MtPm1vcmU7CisJCWVsc2UKKwkJCSpwdGVfbGlzdCA9ICh1bnNpZ25lZCBsb25nKWRlc2MtPm1vcmUgfCAxOworCW1tdV9mcmVlX3B0ZV9saXN0X2Rlc2MoZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkIHB0ZV9saXN0X3JlbW92ZSh1NjQgKnNwdGUsIHVuc2lnbmVkIGxvbmcgKnB0ZV9saXN0KQoreworCXN0cnVjdCBwdGVfbGlzdF9kZXNjICpkZXNjOworCXN0cnVjdCBwdGVfbGlzdF9kZXNjICpwcmV2X2Rlc2M7CisJaW50IGk7CisKKwlpZiAoISpwdGVfbGlzdCkgeworCQlwcmludGsoS0VSTl9FUlIgInB0ZV9saXN0X3JlbW92ZTogJXAgMC0+QlVHXG4iLCBzcHRlKTsKKwkJQlVHKCk7CisJfSBlbHNlIGlmICghKCpwdGVfbGlzdCAmIDEpKSB7CisJCXJtYXBfcHJpbnRrKCJwdGVfbGlzdF9yZW1vdmU6ICAlcCAxLT4wXG4iLCBzcHRlKTsKKwkJaWYgKCh1NjQgKikqcHRlX2xpc3QgIT0gc3B0ZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJwdGVfbGlzdF9yZW1vdmU6ICAlcCAxLT5CVUdcbiIsIHNwdGUpOworCQkJQlVHKCk7CisJCX0KKwkJKnB0ZV9saXN0ID0gMDsKKwl9IGVsc2UgeworCQlybWFwX3ByaW50aygicHRlX2xpc3RfcmVtb3ZlOiAgJXAgbWFueS0+bWFueVxuIiwgc3B0ZSk7CisJCWRlc2MgPSAoc3RydWN0IHB0ZV9saXN0X2Rlc2MgKikoKnB0ZV9saXN0ICYgfjF1bCk7CisJCXByZXZfZGVzYyA9IE5VTEw7CisJCXdoaWxlIChkZXNjKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgUFRFX0xJU1RfRVhUICYmIGRlc2MtPnNwdGVzW2ldOyArK2kpCisJCQkJaWYgKGRlc2MtPnNwdGVzW2ldID09IHNwdGUpIHsKKwkJCQkJcHRlX2xpc3RfZGVzY19yZW1vdmVfZW50cnkocHRlX2xpc3QsCisJCQkJCQkJICAgICAgIGRlc2MsIGksCisJCQkJCQkJICAgICAgIHByZXZfZGVzYyk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQlwcmV2X2Rlc2MgPSBkZXNjOworCQkJZGVzYyA9IGRlc2MtPm1vcmU7CisJCX0KKwkJcHJfZXJyKCJwdGVfbGlzdF9yZW1vdmU6ICVwIG1hbnktPm1hbnlcbiIsIHNwdGUpOworCQlCVUcoKTsKKwl9Cit9CisKK3R5cGVkZWYgdm9pZCAoKnB0ZV9saXN0X3dhbGtfZm4pICh1NjQgKnNwdGUpOworc3RhdGljIHZvaWQgcHRlX2xpc3Rfd2Fsayh1bnNpZ25lZCBsb25nICpwdGVfbGlzdCwgcHRlX2xpc3Rfd2Fsa19mbiBmbikKK3sKKwlzdHJ1Y3QgcHRlX2xpc3RfZGVzYyAqZGVzYzsKKwlpbnQgaTsKKworCWlmICghKnB0ZV9saXN0KQorCQlyZXR1cm47CisKKwlpZiAoISgqcHRlX2xpc3QgJiAxKSkKKwkJcmV0dXJuIGZuKCh1NjQgKikqcHRlX2xpc3QpOworCisJZGVzYyA9IChzdHJ1Y3QgcHRlX2xpc3RfZGVzYyAqKSgqcHRlX2xpc3QgJiB+MXVsKTsKKwl3aGlsZSAoZGVzYykgeworCQlmb3IgKGkgPSAwOyBpIDwgUFRFX0xJU1RfRVhUICYmIGRlc2MtPnNwdGVzW2ldOyArK2kpCisJCQlmbihkZXNjLT5zcHRlc1tpXSk7CisJCWRlc2MgPSBkZXNjLT5tb3JlOworCX0KK30KKworLyoKICAqIFRha2UgZ2ZuIGFuZCByZXR1cm4gdGhlIHJldmVyc2UgbWFwcGluZyB0byBpdC4KICAqLwotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqZ2ZuX3RvX3JtYXAoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIGludCBsZXZlbCkKIHsKIAlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90OwpAQCAtNjA1LDE3NSArOTY5LDM4IEBACiAJcmV0dXJuICZsaW5mby0+cm1hcF9wZGU7CiB9CiAKLS8qCi0gKiBSZXZlcnNlIG1hcHBpbmcgZGF0YSBzdHJ1Y3R1cmVzOgotICoKLSAqIElmIHJtYXBwIGJpdCB6ZXJvIGlzIHplcm8sIHRoZW4gcm1hcHAgcG9pbnQgdG8gdGhlIHNoYWR3IHBhZ2UgdGFibGUgZW50cnkKLSAqIHRoYXQgcG9pbnRzIHRvIHBhZ2VfYWRkcmVzcyhwYWdlKS4KLSAqCi0gKiBJZiBybWFwcCBiaXQgemVybyBpcyBvbmUsICh0aGVuIHJtYXAgJiB+MSkgcG9pbnRzIHRvIGEgc3RydWN0IGt2bV9ybWFwX2Rlc2MKLSAqIGNvbnRhaW5pbmcgbW9yZSBtYXBwaW5ncy4KLSAqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm1hcCBlbnRyaWVzIGJlZm9yZSB0aGUgc3B0ZSB3YXMgYWRkZWQgb3IgemVybyBpZgotICogdGhlIHNwdGUgd2FzIG5vdCBhZGRlZC4KLSAqCi0gKi8KIHN0YXRpYyBpbnQgcm1hcF9hZGQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgKnNwdGUsIGdmbl90IGdmbikKIHsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKLQlzdHJ1Y3Qga3ZtX3JtYXBfZGVzYyAqZGVzYzsKIAl1bnNpZ25lZCBsb25nICpybWFwcDsKLQlpbnQgaSwgY291bnQgPSAwOwogCi0JaWYgKCFpc19ybWFwX3NwdGUoKnNwdGUpKQotCQlyZXR1cm4gY291bnQ7CiAJc3AgPSBwYWdlX2hlYWRlcihfX3BhKHNwdGUpKTsKIAlrdm1fbW11X3BhZ2Vfc2V0X2dmbihzcCwgc3B0ZSAtIHNwLT5zcHQsIGdmbik7CiAJcm1hcHAgPSBnZm5fdG9fcm1hcCh2Y3B1LT5rdm0sIGdmbiwgc3AtPnJvbGUubGV2ZWwpOwotCWlmICghKnJtYXBwKSB7Ci0JCXJtYXBfcHJpbnRrKCJybWFwX2FkZDogJXAgJWxseCAwLT4xXG4iLCBzcHRlLCAqc3B0ZSk7Ci0JCSpybWFwcCA9ICh1bnNpZ25lZCBsb25nKXNwdGU7Ci0JfSBlbHNlIGlmICghKCpybWFwcCAmIDEpKSB7Ci0JCXJtYXBfcHJpbnRrKCJybWFwX2FkZDogJXAgJWxseCAxLT5tYW55XG4iLCBzcHRlLCAqc3B0ZSk7Ci0JCWRlc2MgPSBtbXVfYWxsb2Nfcm1hcF9kZXNjKHZjcHUpOwotCQlkZXNjLT5zcHRlc1swXSA9ICh1NjQgKikqcm1hcHA7Ci0JCWRlc2MtPnNwdGVzWzFdID0gc3B0ZTsKLQkJKnJtYXBwID0gKHVuc2lnbmVkIGxvbmcpZGVzYyB8IDE7Ci0JCSsrY291bnQ7Ci0JfSBlbHNlIHsKLQkJcm1hcF9wcmludGsoInJtYXBfYWRkOiAlcCAlbGx4IG1hbnktPm1hbnlcbiIsIHNwdGUsICpzcHRlKTsKLQkJZGVzYyA9IChzdHJ1Y3Qga3ZtX3JtYXBfZGVzYyAqKSgqcm1hcHAgJiB+MXVsKTsKLQkJd2hpbGUgKGRlc2MtPnNwdGVzW1JNQVBfRVhULTFdICYmIGRlc2MtPm1vcmUpIHsKLQkJCWRlc2MgPSBkZXNjLT5tb3JlOwotCQkJY291bnQgKz0gUk1BUF9FWFQ7Ci0JCX0KLQkJaWYgKGRlc2MtPnNwdGVzW1JNQVBfRVhULTFdKSB7Ci0JCQlkZXNjLT5tb3JlID0gbW11X2FsbG9jX3JtYXBfZGVzYyh2Y3B1KTsKLQkJCWRlc2MgPSBkZXNjLT5tb3JlOwotCQl9Ci0JCWZvciAoaSA9IDA7IGRlc2MtPnNwdGVzW2ldOyArK2kpCi0JCQkrK2NvdW50OwotCQlkZXNjLT5zcHRlc1tpXSA9IHNwdGU7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHZvaWQgcm1hcF9kZXNjX3JlbW92ZV9lbnRyeSh1bnNpZ25lZCBsb25nICpybWFwcCwKLQkJCQkgICBzdHJ1Y3Qga3ZtX3JtYXBfZGVzYyAqZGVzYywKLQkJCQkgICBpbnQgaSwKLQkJCQkgICBzdHJ1Y3Qga3ZtX3JtYXBfZGVzYyAqcHJldl9kZXNjKQotewotCWludCBqOwotCi0JZm9yIChqID0gUk1BUF9FWFQgLSAxOyAhZGVzYy0+c3B0ZXNbal0gJiYgaiA+IGk7IC0taikKLQkJOwotCWRlc2MtPnNwdGVzW2ldID0gZGVzYy0+c3B0ZXNbal07Ci0JZGVzYy0+c3B0ZXNbal0gPSBOVUxMOwotCWlmIChqICE9IDApCi0JCXJldHVybjsKLQlpZiAoIXByZXZfZGVzYyAmJiAhZGVzYy0+bW9yZSkKLQkJKnJtYXBwID0gKHVuc2lnbmVkIGxvbmcpZGVzYy0+c3B0ZXNbMF07Ci0JZWxzZQotCQlpZiAocHJldl9kZXNjKQotCQkJcHJldl9kZXNjLT5tb3JlID0gZGVzYy0+bW9yZTsKLQkJZWxzZQotCQkJKnJtYXBwID0gKHVuc2lnbmVkIGxvbmcpZGVzYy0+bW9yZSB8IDE7Ci0JbW11X2ZyZWVfcm1hcF9kZXNjKGRlc2MpOwotfQotCi1zdGF0aWMgdm9pZCBybWFwX3JlbW92ZShzdHJ1Y3Qga3ZtICprdm0sIHU2NCAqc3B0ZSkKLXsKLQlzdHJ1Y3Qga3ZtX3JtYXBfZGVzYyAqZGVzYzsKLQlzdHJ1Y3Qga3ZtX3JtYXBfZGVzYyAqcHJldl9kZXNjOwotCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwOwotCWdmbl90IGdmbjsKLQl1bnNpZ25lZCBsb25nICpybWFwcDsKLQlpbnQgaTsKLQotCXNwID0gcGFnZV9oZWFkZXIoX19wYShzcHRlKSk7Ci0JZ2ZuID0ga3ZtX21tdV9wYWdlX2dldF9nZm4oc3AsIHNwdGUgLSBzcC0+c3B0KTsKLQlybWFwcCA9IGdmbl90b19ybWFwKGt2bSwgZ2ZuLCBzcC0+cm9sZS5sZXZlbCk7Ci0JaWYgKCEqcm1hcHApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJybWFwX3JlbW92ZTogJXAgMC0+QlVHXG4iLCBzcHRlKTsKLQkJQlVHKCk7Ci0JfSBlbHNlIGlmICghKCpybWFwcCAmIDEpKSB7Ci0JCXJtYXBfcHJpbnRrKCJybWFwX3JlbW92ZTogICVwIDEtPjBcbiIsIHNwdGUpOwotCQlpZiAoKHU2NCAqKSpybWFwcCAhPSBzcHRlKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInJtYXBfcmVtb3ZlOiAgJXAgMS0+QlVHXG4iLCBzcHRlKTsKLQkJCUJVRygpOwotCQl9Ci0JCSpybWFwcCA9IDA7Ci0JfSBlbHNlIHsKLQkJcm1hcF9wcmludGsoInJtYXBfcmVtb3ZlOiAgJXAgbWFueS0+bWFueVxuIiwgc3B0ZSk7Ci0JCWRlc2MgPSAoc3RydWN0IGt2bV9ybWFwX2Rlc2MgKikoKnJtYXBwICYgfjF1bCk7Ci0JCXByZXZfZGVzYyA9IE5VTEw7Ci0JCXdoaWxlIChkZXNjKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgUk1BUF9FWFQgJiYgZGVzYy0+c3B0ZXNbaV07ICsraSkKLQkJCQlpZiAoZGVzYy0+c3B0ZXNbaV0gPT0gc3B0ZSkgewotCQkJCQlybWFwX2Rlc2NfcmVtb3ZlX2VudHJ5KHJtYXBwLAotCQkJCQkJCSAgICAgICBkZXNjLCBpLAotCQkJCQkJCSAgICAgICBwcmV2X2Rlc2MpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJcHJldl9kZXNjID0gZGVzYzsKLQkJCWRlc2MgPSBkZXNjLT5tb3JlOwotCQl9Ci0JCXByX2Vycigicm1hcF9yZW1vdmU6ICVwIG1hbnktPm1hbnlcbiIsIHNwdGUpOwotCQlCVUcoKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X3NwdGVfdHJhY2tfYml0cyh1NjQgKnNwdGVwLCB1NjQgbmV3X3NwdGUpCi17Ci0JcGZuX3QgcGZuOwotCXU2NCBvbGRfc3B0ZSA9ICpzcHRlcDsKLQotCWlmICghc3B0ZV9oYXNfdm9sYXRpbGVfYml0cyhvbGRfc3B0ZSkpCi0JCV9fc2V0X3NwdGUoc3B0ZXAsIG5ld19zcHRlKTsKLQllbHNlCi0JCW9sZF9zcHRlID0gX194Y2hnX3NwdGUoc3B0ZXAsIG5ld19zcHRlKTsKLQotCWlmICghaXNfcm1hcF9zcHRlKG9sZF9zcHRlKSkKLQkJcmV0dXJuIDA7Ci0KLQlwZm4gPSBzcHRlX3RvX3BmbihvbGRfc3B0ZSk7Ci0JaWYgKCFzaGFkb3dfYWNjZXNzZWRfbWFzayB8fCBvbGRfc3B0ZSAmIHNoYWRvd19hY2Nlc3NlZF9tYXNrKQotCQlrdm1fc2V0X3Bmbl9hY2Nlc3NlZChwZm4pOwotCWlmICghc2hhZG93X2RpcnR5X21hc2sgfHwgKG9sZF9zcHRlICYgc2hhZG93X2RpcnR5X21hc2spKQotCQlrdm1fc2V0X3Bmbl9kaXJ0eShwZm4pOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBkcm9wX3NwdGUoc3RydWN0IGt2bSAqa3ZtLCB1NjQgKnNwdGVwLCB1NjQgbmV3X3NwdGUpCi17Ci0JaWYgKHNldF9zcHRlX3RyYWNrX2JpdHMoc3B0ZXAsIG5ld19zcHRlKSkKLQkJcm1hcF9yZW1vdmUoa3ZtLCBzcHRlcCk7CisJcmV0dXJuIHB0ZV9saXN0X2FkZCh2Y3B1LCBzcHRlLCBybWFwcCk7CiB9CiAKIHN0YXRpYyB1NjQgKnJtYXBfbmV4dChzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgKnJtYXBwLCB1NjQgKnNwdGUpCiB7Ci0Jc3RydWN0IGt2bV9ybWFwX2Rlc2MgKmRlc2M7Ci0JdTY0ICpwcmV2X3NwdGU7Ci0JaW50IGk7CisJcmV0dXJuIHB0ZV9saXN0X25leHQocm1hcHAsIHNwdGUpOworfQogCi0JaWYgKCEqcm1hcHApCi0JCXJldHVybiBOVUxMOwotCWVsc2UgaWYgKCEoKnJtYXBwICYgMSkpIHsKLQkJaWYgKCFzcHRlKQotCQkJcmV0dXJuICh1NjQgKikqcm1hcHA7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkZXNjID0gKHN0cnVjdCBrdm1fcm1hcF9kZXNjICopKCpybWFwcCAmIH4xdWwpOwotCXByZXZfc3B0ZSA9IE5VTEw7Ci0Jd2hpbGUgKGRlc2MpIHsKLQkJZm9yIChpID0gMDsgaSA8IFJNQVBfRVhUICYmIGRlc2MtPnNwdGVzW2ldOyArK2kpIHsKLQkJCWlmIChwcmV2X3NwdGUgPT0gc3B0ZSkKLQkJCQlyZXR1cm4gZGVzYy0+c3B0ZXNbaV07Ci0JCQlwcmV2X3NwdGUgPSBkZXNjLT5zcHRlc1tpXTsKLQkJfQotCQlkZXNjID0gZGVzYy0+bW9yZTsKLQl9Ci0JcmV0dXJuIE5VTEw7CitzdGF0aWMgdm9pZCBybWFwX3JlbW92ZShzdHJ1Y3Qga3ZtICprdm0sIHU2NCAqc3B0ZSkKK3sKKwlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKKwlnZm5fdCBnZm47CisJdW5zaWduZWQgbG9uZyAqcm1hcHA7CisKKwlzcCA9IHBhZ2VfaGVhZGVyKF9fcGEoc3B0ZSkpOworCWdmbiA9IGt2bV9tbXVfcGFnZV9nZXRfZ2ZuKHNwLCBzcHRlIC0gc3AtPnNwdCk7CisJcm1hcHAgPSBnZm5fdG9fcm1hcChrdm0sIGdmbiwgc3AtPnJvbGUubGV2ZWwpOworCXB0ZV9saXN0X3JlbW92ZShzcHRlLCBybWFwcCk7Cit9CisKK3N0YXRpYyB2b2lkIGRyb3Bfc3B0ZShzdHJ1Y3Qga3ZtICprdm0sIHU2NCAqc3B0ZXApCit7CisJaWYgKG1tdV9zcHRlX2NsZWFyX3RyYWNrX2JpdHMoc3B0ZXApKQorCQlybWFwX3JlbW92ZShrdm0sIHNwdGVwKTsKIH0KIAogc3RhdGljIGludCBybWFwX3dyaXRlX3Byb3RlY3Qoc3RydWN0IGt2bSAqa3ZtLCB1NjQgZ2ZuKQpAQCAtNzkwLDcgKzEwMTcsNyBAQAogCQlCVUdfT04oISgqc3B0ZSAmIFBUX1BSRVNFTlRfTUFTSykpOwogCQlybWFwX3ByaW50aygicm1hcF93cml0ZV9wcm90ZWN0OiBzcHRlICVwICVsbHhcbiIsIHNwdGUsICpzcHRlKTsKIAkJaWYgKGlzX3dyaXRhYmxlX3B0ZSgqc3B0ZSkpIHsKLQkJCXVwZGF0ZV9zcHRlKHNwdGUsICpzcHRlICYgflBUX1dSSVRBQkxFX01BU0spOworCQkJbW11X3NwdGVfdXBkYXRlKHNwdGUsICpzcHRlICYgflBUX1dSSVRBQkxFX01BU0spOwogCQkJd3JpdGVfcHJvdGVjdGVkID0gMTsKIAkJfQogCQlzcHRlID0gcm1hcF9uZXh0KGt2bSwgcm1hcHAsIHNwdGUpOwpAQCAtODA3LDggKzEwMzQsNyBAQAogCQkJQlVHX09OKCgqc3B0ZSAmIChQVF9QQUdFX1NJWkVfTUFTS3xQVF9QUkVTRU5UX01BU0spKSAhPSAoUFRfUEFHRV9TSVpFX01BU0t8UFRfUFJFU0VOVF9NQVNLKSk7CiAJCQlwZ3ByaW50aygicm1hcF93cml0ZV9wcm90ZWN0KGxhcmdlKTogc3B0ZSAlcCAlbGx4ICVsbGRcbiIsIHNwdGUsICpzcHRlLCBnZm4pOwogCQkJaWYgKGlzX3dyaXRhYmxlX3B0ZSgqc3B0ZSkpIHsKLQkJCQlkcm9wX3NwdGUoa3ZtLCBzcHRlLAotCQkJCQkgIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKKwkJCQlkcm9wX3NwdGUoa3ZtLCBzcHRlKTsKIAkJCQktLWt2bS0+c3RhdC5scGFnZXM7CiAJCQkJc3B0ZSA9IE5VTEw7CiAJCQkJd3JpdGVfcHJvdGVjdGVkID0gMTsKQEAgLTgyOSw3ICsxMDU1LDcgQEAKIAl3aGlsZSAoKHNwdGUgPSBybWFwX25leHQoa3ZtLCBybWFwcCwgTlVMTCkpKSB7CiAJCUJVR19PTighKCpzcHRlICYgUFRfUFJFU0VOVF9NQVNLKSk7CiAJCXJtYXBfcHJpbnRrKCJrdm1fcm1hcF91bm1hcF9odmE6IHNwdGUgJXAgJWxseFxuIiwgc3B0ZSwgKnNwdGUpOwotCQlkcm9wX3NwdGUoa3ZtLCBzcHRlLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CisJCWRyb3Bfc3B0ZShrdm0sIHNwdGUpOwogCQluZWVkX3RsYl9mbHVzaCA9IDE7CiAJfQogCXJldHVybiBuZWVkX3RsYl9mbHVzaDsKQEAgLTg1MSw3ICsxMDc3LDcgQEAKIAkJcm1hcF9wcmludGsoImt2bV9zZXRfcHRlX3JtYXBwOiBzcHRlICVwICVsbHhcbiIsIHNwdGUsICpzcHRlKTsKIAkJbmVlZF9mbHVzaCA9IDE7CiAJCWlmIChwdGVfd3JpdGUoKnB0ZXApKSB7Ci0JCQlkcm9wX3NwdGUoa3ZtLCBzcHRlLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CisJCQlkcm9wX3NwdGUoa3ZtLCBzcHRlKTsKIAkJCXNwdGUgPSBybWFwX25leHQoa3ZtLCBybWFwcCwgTlVMTCk7CiAJCX0gZWxzZSB7CiAJCQluZXdfc3B0ZSA9ICpzcHRlICZ+IChQVDY0X0JBU0VfQUREUl9NQVNLKTsKQEAgLTg2MCw3ICsxMDg2LDggQEAKIAkJCW5ld19zcHRlICY9IH5QVF9XUklUQUJMRV9NQVNLOwogCQkJbmV3X3NwdGUgJj0gflNQVEVfSE9TVF9XUklURUFCTEU7CiAJCQluZXdfc3B0ZSAmPSB+c2hhZG93X2FjY2Vzc2VkX21hc2s7Ci0JCQlzZXRfc3B0ZV90cmFja19iaXRzKHNwdGUsIG5ld19zcHRlKTsKKwkJCW1tdV9zcHRlX2NsZWFyX3RyYWNrX2JpdHMoc3B0ZSk7CisJCQltbXVfc3B0ZV9zZXQoc3B0ZSwgbmV3X3NwdGUpOwogCQkJc3B0ZSA9IHJtYXBfbmV4dChrdm0sIHJtYXBwLCBzcHRlKTsKIAkJfQogCX0KQEAgLTEwMzIsMTYgKzEyNTksMjkgQEAKIAlwZXJjcHVfY291bnRlcl9hZGQoJmt2bV90b3RhbF91c2VkX21tdV9wYWdlcywgbnIpOwogfQogCi1zdGF0aWMgdm9pZCBrdm1fbW11X2ZyZWVfcGFnZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQorLyoKKyAqIFJlbW92ZSB0aGUgc3AgZnJvbSBzaGFkb3cgcGFnZSBjYWNoZSwgYWZ0ZXIgY2FsbCBpdCwKKyAqIHdlIGNhbiBub3QgZmluZCB0aGlzIHNwIGZyb20gdGhlIGNhY2hlLCBhbmQgdGhlIHNoYWRvdworICogcGFnZSB0YWJsZSBpcyBzdGlsbCB2YWxpZC4KKyAqIEl0IHNob3VsZCBiZSB1bmRlciB0aGUgcHJvdGVjdGlvbiBvZiBtbXUgbG9jay4KKyAqLworc3RhdGljIHZvaWQga3ZtX21tdV9pc29sYXRlX3BhZ2Uoc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCiB7CiAJQVNTRVJUKGlzX2VtcHR5X3NoYWRvd19wYWdlKHNwLT5zcHQpKTsKIAlobGlzdF9kZWwoJnNwLT5oYXNoX2xpbmspOwotCWxpc3RfZGVsKCZzcC0+bGluayk7Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXNwLT5zcHQpOwogCWlmICghc3AtPnJvbGUuZGlyZWN0KQogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpc3AtPmdmbnMpOworfQorCisvKgorICogRnJlZSB0aGUgc2hhZG93IHBhZ2UgdGFibGUgYW5kIHRoZSBzcCwgd2UgY2FuIGRvIGl0CisgKiBvdXQgb2YgdGhlIHByb3RlY3Rpb24gb2YgbW11IGxvY2suCisgKi8KK3N0YXRpYyB2b2lkIGt2bV9tbXVfZnJlZV9wYWdlKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQoreworCWxpc3RfZGVsKCZzcC0+bGluayk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXNwLT5zcHQpOwogCWttZW1fY2FjaGVfZnJlZShtbXVfcGFnZV9oZWFkZXJfY2FjaGUsIHNwKTsKLQlrdm1fbW9kX3VzZWRfbW11X3BhZ2VzKGt2bSwgLTEpOwogfQogCiBzdGF0aWMgdW5zaWduZWQga3ZtX3BhZ2VfdGFibGVfaGFzaGZuKGdmbl90IGdmbikKQEAgLTEwNDksMTIgKzEyODksMzQgQEAKIAlyZXR1cm4gZ2ZuICYgKCgxIDw8IEtWTV9NTVVfSEFTSF9TSElGVCkgLSAxKTsKIH0KIAorc3RhdGljIHZvaWQgbW11X3BhZ2VfYWRkX3BhcmVudF9wdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgICBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwgdTY0ICpwYXJlbnRfcHRlKQoreworCWlmICghcGFyZW50X3B0ZSkKKwkJcmV0dXJuOworCisJcHRlX2xpc3RfYWRkKHZjcHUsIHBhcmVudF9wdGUsICZzcC0+cGFyZW50X3B0ZXMpOworfQorCitzdGF0aWMgdm9pZCBtbXVfcGFnZV9yZW1vdmVfcGFyZW50X3B0ZShzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwKKwkJCQkgICAgICAgdTY0ICpwYXJlbnRfcHRlKQoreworCXB0ZV9saXN0X3JlbW92ZShwYXJlbnRfcHRlLCAmc3AtPnBhcmVudF9wdGVzKTsKK30KKworc3RhdGljIHZvaWQgZHJvcF9wYXJlbnRfcHRlKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLAorCQkJICAgIHU2NCAqcGFyZW50X3B0ZSkKK3sKKwltbXVfcGFnZV9yZW1vdmVfcGFyZW50X3B0ZShzcCwgcGFyZW50X3B0ZSk7CisJbW11X3NwdGVfY2xlYXJfbm9fdHJhY2socGFyZW50X3B0ZSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qga3ZtX21tdV9wYWdlICprdm1fbW11X2FsbG9jX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCQkgICAgICAgdTY0ICpwYXJlbnRfcHRlLCBpbnQgZGlyZWN0KQogewogCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwOwotCi0Jc3AgPSBtbXVfbWVtb3J5X2NhY2hlX2FsbG9jKCZ2Y3B1LT5hcmNoLm1tdV9wYWdlX2hlYWRlcl9jYWNoZSwgc2l6ZW9mICpzcCk7CisJc3AgPSBtbXVfbWVtb3J5X2NhY2hlX2FsbG9jKCZ2Y3B1LT5hcmNoLm1tdV9wYWdlX2hlYWRlcl9jYWNoZSwKKwkJCQkJc2l6ZW9mICpzcCk7CiAJc3AtPnNwdCA9IG1tdV9tZW1vcnlfY2FjaGVfYWxsb2MoJnZjcHUtPmFyY2gubW11X3BhZ2VfY2FjaGUsIFBBR0VfU0laRSk7CiAJaWYgKCFkaXJlY3QpCiAJCXNwLT5nZm5zID0gbW11X21lbW9yeV9jYWNoZV9hbGxvYygmdmNwdS0+YXJjaC5tbXVfcGFnZV9jYWNoZSwKQEAgLTEwNjIsMTIxICsxMzI0LDI0IEBACiAJc2V0X3BhZ2VfcHJpdmF0ZSh2aXJ0X3RvX3BhZ2Uoc3AtPnNwdCksICh1bnNpZ25lZCBsb25nKXNwKTsKIAlsaXN0X2FkZCgmc3AtPmxpbmssICZ2Y3B1LT5rdm0tPmFyY2guYWN0aXZlX21tdV9wYWdlcyk7CiAJYml0bWFwX3plcm8oc3AtPnNsb3RfYml0bWFwLCBLVk1fTUVNT1JZX1NMT1RTICsgS1ZNX1BSSVZBVEVfTUVNX1NMT1RTKTsKLQlzcC0+bXVsdGltYXBwZWQgPSAwOwotCXNwLT5wYXJlbnRfcHRlID0gcGFyZW50X3B0ZTsKKwlzcC0+cGFyZW50X3B0ZXMgPSAwOworCW1tdV9wYWdlX2FkZF9wYXJlbnRfcHRlKHZjcHUsIHNwLCBwYXJlbnRfcHRlKTsKIAlrdm1fbW9kX3VzZWRfbW11X3BhZ2VzKHZjcHUtPmt2bSwgKzEpOwogCXJldHVybiBzcDsKIH0KIAotc3RhdGljIHZvaWQgbW11X3BhZ2VfYWRkX3BhcmVudF9wdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotCQkJCSAgICBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwgdTY0ICpwYXJlbnRfcHRlKQotewotCXN0cnVjdCBrdm1fcHRlX2NoYWluICpwdGVfY2hhaW47Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0JaW50IGk7Ci0KLQlpZiAoIXBhcmVudF9wdGUpCi0JCXJldHVybjsKLQlpZiAoIXNwLT5tdWx0aW1hcHBlZCkgewotCQl1NjQgKm9sZCA9IHNwLT5wYXJlbnRfcHRlOwotCi0JCWlmICghb2xkKSB7Ci0JCQlzcC0+cGFyZW50X3B0ZSA9IHBhcmVudF9wdGU7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3AtPm11bHRpbWFwcGVkID0gMTsKLQkJcHRlX2NoYWluID0gbW11X2FsbG9jX3B0ZV9jaGFpbih2Y3B1KTsKLQkJSU5JVF9ITElTVF9IRUFEKCZzcC0+cGFyZW50X3B0ZXMpOwotCQlobGlzdF9hZGRfaGVhZCgmcHRlX2NoYWluLT5saW5rLCAmc3AtPnBhcmVudF9wdGVzKTsKLQkJcHRlX2NoYWluLT5wYXJlbnRfcHRlc1swXSA9IG9sZDsKLQl9Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnkocHRlX2NoYWluLCBub2RlLCAmc3AtPnBhcmVudF9wdGVzLCBsaW5rKSB7Ci0JCWlmIChwdGVfY2hhaW4tPnBhcmVudF9wdGVzW05SX1BURV9DSEFJTl9FTlRSSUVTLTFdKQotCQkJY29udGludWU7Ci0JCWZvciAoaSA9IDA7IGkgPCBOUl9QVEVfQ0hBSU5fRU5UUklFUzsgKytpKQotCQkJaWYgKCFwdGVfY2hhaW4tPnBhcmVudF9wdGVzW2ldKSB7Ci0JCQkJcHRlX2NoYWluLT5wYXJlbnRfcHRlc1tpXSA9IHBhcmVudF9wdGU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCX0KLQlwdGVfY2hhaW4gPSBtbXVfYWxsb2NfcHRlX2NoYWluKHZjcHUpOwotCUJVR19PTighcHRlX2NoYWluKTsKLQlobGlzdF9hZGRfaGVhZCgmcHRlX2NoYWluLT5saW5rLCAmc3AtPnBhcmVudF9wdGVzKTsKLQlwdGVfY2hhaW4tPnBhcmVudF9wdGVzWzBdID0gcGFyZW50X3B0ZTsKLX0KLQotc3RhdGljIHZvaWQgbW11X3BhZ2VfcmVtb3ZlX3BhcmVudF9wdGUoc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AsCi0JCQkJICAgICAgIHU2NCAqcGFyZW50X3B0ZSkKLXsKLQlzdHJ1Y3Qga3ZtX3B0ZV9jaGFpbiAqcHRlX2NoYWluOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCWludCBpOwotCi0JaWYgKCFzcC0+bXVsdGltYXBwZWQpIHsKLQkJQlVHX09OKHNwLT5wYXJlbnRfcHRlICE9IHBhcmVudF9wdGUpOwotCQlzcC0+cGFyZW50X3B0ZSA9IE5VTEw7Ci0JCXJldHVybjsKLQl9Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnkocHRlX2NoYWluLCBub2RlLCAmc3AtPnBhcmVudF9wdGVzLCBsaW5rKQotCQlmb3IgKGkgPSAwOyBpIDwgTlJfUFRFX0NIQUlOX0VOVFJJRVM7ICsraSkgewotCQkJaWYgKCFwdGVfY2hhaW4tPnBhcmVudF9wdGVzW2ldKQotCQkJCWJyZWFrOwotCQkJaWYgKHB0ZV9jaGFpbi0+cGFyZW50X3B0ZXNbaV0gIT0gcGFyZW50X3B0ZSkKLQkJCQljb250aW51ZTsKLQkJCXdoaWxlIChpICsgMSA8IE5SX1BURV9DSEFJTl9FTlRSSUVTCi0JCQkJJiYgcHRlX2NoYWluLT5wYXJlbnRfcHRlc1tpICsgMV0pIHsKLQkJCQlwdGVfY2hhaW4tPnBhcmVudF9wdGVzW2ldCi0JCQkJCT0gcHRlX2NoYWluLT5wYXJlbnRfcHRlc1tpICsgMV07Ci0JCQkJKytpOwotCQkJfQotCQkJcHRlX2NoYWluLT5wYXJlbnRfcHRlc1tpXSA9IE5VTEw7Ci0JCQlpZiAoaSA9PSAwKSB7Ci0JCQkJaGxpc3RfZGVsKCZwdGVfY2hhaW4tPmxpbmspOwotCQkJCW1tdV9mcmVlX3B0ZV9jaGFpbihwdGVfY2hhaW4pOwotCQkJCWlmIChobGlzdF9lbXB0eSgmc3AtPnBhcmVudF9wdGVzKSkgewotCQkJCQlzcC0+bXVsdGltYXBwZWQgPSAwOwotCQkJCQlzcC0+cGFyZW50X3B0ZSA9IE5VTEw7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JQlVHKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1tdV9wYXJlbnRfd2FsayhzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwgbW11X3BhcmVudF93YWxrX2ZuIGZuKQotewotCXN0cnVjdCBrdm1fcHRlX2NoYWluICpwdGVfY2hhaW47Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0Jc3RydWN0IGt2bV9tbXVfcGFnZSAqcGFyZW50X3NwOwotCWludCBpOwotCi0JaWYgKCFzcC0+bXVsdGltYXBwZWQgJiYgc3AtPnBhcmVudF9wdGUpIHsKLQkJcGFyZW50X3NwID0gcGFnZV9oZWFkZXIoX19wYShzcC0+cGFyZW50X3B0ZSkpOwotCQlmbihwYXJlbnRfc3AsIHNwLT5wYXJlbnRfcHRlKTsKLQkJcmV0dXJuOwotCX0KLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0ZV9jaGFpbiwgbm9kZSwgJnNwLT5wYXJlbnRfcHRlcywgbGluaykKLQkJZm9yIChpID0gMDsgaSA8IE5SX1BURV9DSEFJTl9FTlRSSUVTOyArK2kpIHsKLQkJCXU2NCAqc3B0ZSA9IHB0ZV9jaGFpbi0+cGFyZW50X3B0ZXNbaV07Ci0KLQkJCWlmICghc3B0ZSkKLQkJCQlicmVhazsKLQkJCXBhcmVudF9zcCA9IHBhZ2VfaGVhZGVyKF9fcGEoc3B0ZSkpOwotCQkJZm4ocGFyZW50X3NwLCBzcHRlKTsKLQkJfQotfQotCi1zdGF0aWMgdm9pZCBtYXJrX3Vuc3luYyhzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwgdTY0ICpzcHRlKTsKK3N0YXRpYyB2b2lkIG1hcmtfdW5zeW5jKHU2NCAqc3B0ZSk7CiBzdGF0aWMgdm9pZCBrdm1fbW11X21hcmtfcGFyZW50c191bnN5bmMoc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCiB7Ci0JbW11X3BhcmVudF93YWxrKHNwLCBtYXJrX3Vuc3luYyk7CisJcHRlX2xpc3Rfd2Fsaygmc3AtPnBhcmVudF9wdGVzLCBtYXJrX3Vuc3luYyk7CiB9CiAKLXN0YXRpYyB2b2lkIG1hcmtfdW5zeW5jKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLCB1NjQgKnNwdGUpCitzdGF0aWMgdm9pZCBtYXJrX3Vuc3luYyh1NjQgKnNwdGUpCiB7CisJc3RydWN0IGt2bV9tbXVfcGFnZSAqc3A7CiAJdW5zaWduZWQgaW50IGluZGV4OwogCisJc3AgPSBwYWdlX2hlYWRlcihfX3BhKHNwdGUpKTsKIAlpbmRleCA9IHNwdGUgLSBzcC0+c3B0OwogCWlmIChfX3Rlc3RfYW5kX3NldF9iaXQoaW5kZXgsIHNwLT51bnN5bmNfY2hpbGRfYml0bWFwKSkKIAkJcmV0dXJuOwpAQCAtMTE4NSwxNSArMTM1MCw2IEBACiAJa3ZtX21tdV9tYXJrX3BhcmVudHNfdW5zeW5jKHNwKTsKIH0KIAotc3RhdGljIHZvaWQgbm9ucGFnaW5nX3ByZWZldGNoX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotCQkJCSAgICBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBQVDY0X0VOVF9QRVJfUEFHRTsgKytpKQotCQlzcC0+c3B0W2ldID0gc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGU7Ci19Ci0KIHN0YXRpYyBpbnQgbm9ucGFnaW5nX3N5bmNfcGFnZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkgICAgICAgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCiB7CkBAIC0xNDc1LDYgKzE2MzEsMTQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGluaXRfc2hhZG93X3BhZ2VfdGFibGUoc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUFQ2NF9FTlRfUEVSX1BBR0U7ICsraSkKKwkJc3AtPnNwdFtpXSA9IDB1bGw7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qga3ZtX21tdV9wYWdlICprdm1fbW11X2dldF9wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkJICAgICBnZm5fdCBnZm4sCiAJCQkJCSAgICAgZ3ZhX3QgZ2FkZHIsCkBAIC0xNTM3LDEwICsxNzAxLDcgQEAKIAogCQlhY2NvdW50X3NoYWRvd2VkKHZjcHUtPmt2bSwgZ2ZuKTsKIAl9Ci0JaWYgKHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlICE9IHNoYWRvd19ub3RyYXBfbm9ucHJlc2VudF9wdGUpCi0JCXZjcHUtPmFyY2gubW11LnByZWZldGNoX3BhZ2UodmNwdSwgc3ApOwotCWVsc2UKLQkJbm9ucGFnaW5nX3ByZWZldGNoX3BhZ2UodmNwdSwgc3ApOworCWluaXRfc2hhZG93X3BhZ2VfdGFibGUoc3ApOwogCXRyYWNlX2t2bV9tbXVfZ2V0X3BhZ2Uoc3AsIHRydWUpOwogCXJldHVybiBzcDsKIH0KQEAgLTE1NzIsMTkgKzE3MzMsMjYgQEAKIAlpZiAoaXRlcmF0b3ItPmxldmVsIDwgUFRfUEFHRV9UQUJMRV9MRVZFTCkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKGl0ZXJhdG9yLT5sZXZlbCA9PSBQVF9QQUdFX1RBQkxFX0xFVkVMKQotCQlpZiAoaXNfbGFyZ2VfcHRlKCppdGVyYXRvci0+c3B0ZXApKQotCQkJcmV0dXJuIGZhbHNlOwotCiAJaXRlcmF0b3ItPmluZGV4ID0gU0hBRE9XX1BUX0lOREVYKGl0ZXJhdG9yLT5hZGRyLCBpdGVyYXRvci0+bGV2ZWwpOwogCWl0ZXJhdG9yLT5zcHRlcAk9ICgodTY0ICopX192YShpdGVyYXRvci0+c2hhZG93X2FkZHIpKSArIGl0ZXJhdG9yLT5pbmRleDsKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIHZvaWQgX19zaGFkb3dfd2Fsa19uZXh0KHN0cnVjdCBrdm1fc2hhZG93X3dhbGtfaXRlcmF0b3IgKml0ZXJhdG9yLAorCQkJICAgICAgIHU2NCBzcHRlKQoreworCWlmIChpc19sYXN0X3NwdGUoc3B0ZSwgaXRlcmF0b3ItPmxldmVsKSkgeworCQlpdGVyYXRvci0+bGV2ZWwgPSAwOworCQlyZXR1cm47CisJfQorCisJaXRlcmF0b3ItPnNoYWRvd19hZGRyID0gc3B0ZSAmIFBUNjRfQkFTRV9BRERSX01BU0s7CisJLS1pdGVyYXRvci0+bGV2ZWw7Cit9CisKIHN0YXRpYyB2b2lkIHNoYWRvd193YWxrX25leHQoc3RydWN0IGt2bV9zaGFkb3dfd2Fsa19pdGVyYXRvciAqaXRlcmF0b3IpCiB7Ci0JaXRlcmF0b3ItPnNoYWRvd19hZGRyID0gKml0ZXJhdG9yLT5zcHRlcCAmIFBUNjRfQkFTRV9BRERSX01BU0s7Ci0JLS1pdGVyYXRvci0+bGV2ZWw7CisJcmV0dXJuIF9fc2hhZG93X3dhbGtfbmV4dChpdGVyYXRvciwgKml0ZXJhdG9yLT5zcHRlcCk7CiB9CiAKIHN0YXRpYyB2b2lkIGxpbmtfc2hhZG93X3BhZ2UodTY0ICpzcHRlcCwgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCkBAIC0xNTk0LDEzICsxNzYyLDEzIEBACiAJc3B0ZSA9IF9fcGEoc3AtPnNwdCkKIAkJfCBQVF9QUkVTRU5UX01BU0sgfCBQVF9BQ0NFU1NFRF9NQVNLCiAJCXwgUFRfV1JJVEFCTEVfTUFTSyB8IFBUX1VTRVJfTUFTSzsKLQlfX3NldF9zcHRlKHNwdGVwLCBzcHRlKTsKKwltbXVfc3B0ZV9zZXQoc3B0ZXAsIHNwdGUpOwogfQogCiBzdGF0aWMgdm9pZCBkcm9wX2xhcmdlX3NwdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgKnNwdGVwKQogewogCWlmIChpc19sYXJnZV9wdGUoKnNwdGVwKSkgewotCQlkcm9wX3NwdGUodmNwdS0+a3ZtLCBzcHRlcCwgc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpOworCQlkcm9wX3NwdGUodmNwdS0+a3ZtLCBzcHRlcCk7CiAJCWt2bV9mbHVzaF9yZW1vdGVfdGxicyh2Y3B1LT5rdm0pOwogCX0KIH0KQEAgLTE2MjIsMzggKzE3OTAsMzkgQEAKIAkJaWYgKGNoaWxkLT5yb2xlLmFjY2VzcyA9PSBkaXJlY3RfYWNjZXNzKQogCQkJcmV0dXJuOwogCi0JCW1tdV9wYWdlX3JlbW92ZV9wYXJlbnRfcHRlKGNoaWxkLCBzcHRlcCk7Ci0JCV9fc2V0X3NwdGUoc3B0ZXAsIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKKwkJZHJvcF9wYXJlbnRfcHRlKGNoaWxkLCBzcHRlcCk7CiAJCWt2bV9mbHVzaF9yZW1vdGVfdGxicyh2Y3B1LT5rdm0pOwogCX0KIH0KIAorc3RhdGljIHZvaWQgbW11X3BhZ2VfemFwX3B0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLAorCQkJICAgICB1NjQgKnNwdGUpCit7CisJdTY0IHB0ZTsKKwlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpjaGlsZDsKKworCXB0ZSA9ICpzcHRlOworCWlmIChpc19zaGFkb3dfcHJlc2VudF9wdGUocHRlKSkgeworCQlpZiAoaXNfbGFzdF9zcHRlKHB0ZSwgc3AtPnJvbGUubGV2ZWwpKQorCQkJZHJvcF9zcHRlKGt2bSwgc3B0ZSk7CisJCWVsc2UgeworCQkJY2hpbGQgPSBwYWdlX2hlYWRlcihwdGUgJiBQVDY0X0JBU0VfQUREUl9NQVNLKTsKKwkJCWRyb3BfcGFyZW50X3B0ZShjaGlsZCwgc3B0ZSk7CisJCX0KKwl9IGVsc2UgaWYgKGlzX21taW9fc3B0ZShwdGUpKQorCQltbXVfc3B0ZV9jbGVhcl9ub190cmFjayhzcHRlKTsKKworCWlmIChpc19sYXJnZV9wdGUocHRlKSkKKwkJLS1rdm0tPnN0YXQubHBhZ2VzOworfQorCiBzdGF0aWMgdm9pZCBrdm1fbW11X3BhZ2VfdW5saW5rX2NoaWxkcmVuKHN0cnVjdCBrdm0gKmt2bSwKIAkJCQkJIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQogewogCXVuc2lnbmVkIGk7Ci0JdTY0ICpwdDsKLQl1NjQgZW50OwogCi0JcHQgPSBzcC0+c3B0OwotCi0JZm9yIChpID0gMDsgaSA8IFBUNjRfRU5UX1BFUl9QQUdFOyArK2kpIHsKLQkJZW50ID0gcHRbaV07Ci0KLQkJaWYgKGlzX3NoYWRvd19wcmVzZW50X3B0ZShlbnQpKSB7Ci0JCQlpZiAoIWlzX2xhc3Rfc3B0ZShlbnQsIHNwLT5yb2xlLmxldmVsKSkgewotCQkJCWVudCAmPSBQVDY0X0JBU0VfQUREUl9NQVNLOwotCQkJCW1tdV9wYWdlX3JlbW92ZV9wYXJlbnRfcHRlKHBhZ2VfaGVhZGVyKGVudCksCi0JCQkJCQkJICAgJnB0W2ldKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGlzX2xhcmdlX3B0ZShlbnQpKQotCQkJCQktLWt2bS0+c3RhdC5scGFnZXM7Ci0JCQkJZHJvcF9zcHRlKGt2bSwgJnB0W2ldLAotCQkJCQkgIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKLQkJCX0KLQkJfQotCQlwdFtpXSA9IHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgUFQ2NF9FTlRfUEVSX1BBR0U7ICsraSkKKwkJbW11X3BhZ2VfemFwX3B0ZShrdm0sIHNwLCBzcC0+c3B0ICsgaSk7CiB9CiAKIHN0YXRpYyB2b2lkIGt2bV9tbXVfcHV0X3BhZ2Uoc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AsIHU2NCAqcGFyZW50X3B0ZSkKQEAgLTE2NzQsMjAgKzE4NDMsOCBAQAogewogCXU2NCAqcGFyZW50X3B0ZTsKIAotCXdoaWxlIChzcC0+bXVsdGltYXBwZWQgfHwgc3AtPnBhcmVudF9wdGUpIHsKLQkJaWYgKCFzcC0+bXVsdGltYXBwZWQpCi0JCQlwYXJlbnRfcHRlID0gc3AtPnBhcmVudF9wdGU7Ci0JCWVsc2UgewotCQkJc3RydWN0IGt2bV9wdGVfY2hhaW4gKmNoYWluOwotCi0JCQljaGFpbiA9IGNvbnRhaW5lcl9vZihzcC0+cGFyZW50X3B0ZXMuZmlyc3QsCi0JCQkJCSAgICAgc3RydWN0IGt2bV9wdGVfY2hhaW4sIGxpbmspOwotCQkJcGFyZW50X3B0ZSA9IGNoYWluLT5wYXJlbnRfcHRlc1swXTsKLQkJfQotCQlCVUdfT04oIXBhcmVudF9wdGUpOwotCQlrdm1fbW11X3B1dF9wYWdlKHNwLCBwYXJlbnRfcHRlKTsKLQkJX19zZXRfc3B0ZShwYXJlbnRfcHRlLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7Ci0JfQorCXdoaWxlICgocGFyZW50X3B0ZSA9IHB0ZV9saXN0X25leHQoJnNwLT5wYXJlbnRfcHRlcywgTlVMTCkpKQorCQlkcm9wX3BhcmVudF9wdGUoc3AsIHBhcmVudF9wdGUpOwogfQogCiBzdGF0aWMgaW50IG1tdV96YXBfdW5zeW5jX2NoaWxkcmVuKHN0cnVjdCBrdm0gKmt2bSwKQEAgLTE3MzQsNiArMTg5MSw3IEBACiAJCS8qIENvdW50IHNlbGYgKi8KIAkJcmV0Kys7CiAJCWxpc3RfbW92ZSgmc3AtPmxpbmssIGludmFsaWRfbGlzdCk7CisJCWt2bV9tb2RfdXNlZF9tbXVfcGFnZXMoa3ZtLCAtMSk7CiAJfSBlbHNlIHsKIAkJbGlzdF9tb3ZlKCZzcC0+bGluaywgJmt2bS0+YXJjaC5hY3RpdmVfbW11X3BhZ2VzKTsKIAkJa3ZtX3JlbG9hZF9yZW1vdGVfbW11cyhrdm0pOwpAQCAtMTc0NCw2ICsxOTAyLDMwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQga3ZtX21tdV9pc29sYXRlX3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKmludmFsaWRfbGlzdCkKK3sKKwlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3AsIGludmFsaWRfbGlzdCwgbGluaykKKwkJa3ZtX21tdV9pc29sYXRlX3BhZ2Uoc3ApOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BhZ2VzX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGt2bV9tbXVfcGFnZSAqbmV4dCwgKnNwOworCisJc3AgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGt2bV9tbXVfcGFnZSwgcmN1KTsKKwl3aGlsZSAoc3ApIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZzcC0+bGluaykpCisJCQluZXh0ID0gbGlzdF9maXJzdF9lbnRyeSgmc3AtPmxpbmssCisJCQkJICAgICAgc3RydWN0IGt2bV9tbXVfcGFnZSwgbGluayk7CisJCWVsc2UKKwkJCW5leHQgPSBOVUxMOworCQlrdm1fbW11X2ZyZWVfcGFnZShzcCk7CisJCXNwID0gbmV4dDsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGt2bV9tbXVfY29tbWl0X3phcF9wYWdlKHN0cnVjdCBrdm0gKmt2bSwKIAkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqaW52YWxpZF9saXN0KQogewpAQCAtMTc1NCwxMCArMTkzNiwyMSBAQAogCiAJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKGt2bSk7CiAKKwlpZiAoYXRvbWljX3JlYWQoJmt2bS0+YXJjaC5yZWFkZXJfY291bnRlcikpIHsKKwkJa3ZtX21tdV9pc29sYXRlX3BhZ2VzKGludmFsaWRfbGlzdCk7CisJCXNwID0gbGlzdF9maXJzdF9lbnRyeShpbnZhbGlkX2xpc3QsIHN0cnVjdCBrdm1fbW11X3BhZ2UsIGxpbmspOworCQlsaXN0X2RlbF9pbml0KGludmFsaWRfbGlzdCk7CisKKwkJdHJhY2Vfa3ZtX21tdV9kZWxheV9mcmVlX3BhZ2VzKHNwKTsKKwkJY2FsbF9yY3UoJnNwLT5yY3UsIGZyZWVfcGFnZXNfcmN1KTsKKwkJcmV0dXJuOworCX0KKwogCWRvIHsKIAkJc3AgPSBsaXN0X2ZpcnN0X2VudHJ5KGludmFsaWRfbGlzdCwgc3RydWN0IGt2bV9tbXVfcGFnZSwgbGluayk7CiAJCVdBUk5fT04oIXNwLT5yb2xlLmludmFsaWQgfHwgc3AtPnJvb3RfY291bnQpOwotCQlrdm1fbW11X2ZyZWVfcGFnZShrdm0sIHNwKTsKKwkJa3ZtX21tdV9pc29sYXRlX3BhZ2Uoc3ApOworCQlrdm1fbW11X2ZyZWVfcGFnZShzcCk7CiAJfSB3aGlsZSAoIWxpc3RfZW1wdHkoaW52YWxpZF9saXN0KSk7CiAKIH0KQEAgLTE3ODMsOCArMTk3Niw4IEBACiAJCQlwYWdlID0gY29udGFpbmVyX29mKGt2bS0+YXJjaC5hY3RpdmVfbW11X3BhZ2VzLnByZXYsCiAJCQkJCSAgICBzdHJ1Y3Qga3ZtX21tdV9wYWdlLCBsaW5rKTsKIAkJCWt2bV9tbXVfcHJlcGFyZV96YXBfcGFnZShrdm0sIHBhZ2UsICZpbnZhbGlkX2xpc3QpOwotCQkJa3ZtX21tdV9jb21taXRfemFwX3BhZ2Uoa3ZtLCAmaW52YWxpZF9saXN0KTsKIAkJfQorCQlrdm1fbW11X2NvbW1pdF96YXBfcGFnZShrdm0sICZpbnZhbGlkX2xpc3QpOwogCQlnb2FsX25yX21tdV9wYWdlcyA9IGt2bS0+YXJjaC5uX3VzZWRfbW11X3BhZ2VzOwogCX0KIApAQCAtMTgzMywyMCArMjAyNiw2IEBACiAJX19zZXRfYml0KHNsb3QsIHNwLT5zbG90X2JpdG1hcCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1tdV9jb252ZXJ0X25vdHJhcChzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKLXsKLQlpbnQgaTsKLQl1NjQgKnB0ID0gc3AtPnNwdDsKLQotCWlmIChzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSA9PSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUFQ2NF9FTlRfUEVSX1BBR0U7ICsraSkgewotCQlpZiAocHRbaV0gPT0gc2hhZG93X25vdHJhcF9ub25wcmVzZW50X3B0ZSkKLQkJCV9fc2V0X3NwdGUoJnB0W2ldLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7Ci0JfQotfQotCiAvKgogICogVGhlIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIG10cnJfdHlwZV9sb29rdXAoKSBpbgogICogYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYwpAQCAtMTk1OSw3ICsyMTM4LDYgQEAKIAlzcC0+dW5zeW5jID0gMTsKIAogCWt2bV9tbXVfbWFya19wYXJlbnRzX3Vuc3luYyhzcCk7Ci0JbW11X2NvbnZlcnRfbm90cmFwKHNwKTsKIH0KIAogc3RhdGljIHZvaWQga3ZtX3Vuc3luY19wYWdlcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsICBnZm5fdCBnZm4pCkBAIC0yMDAyLDEzICsyMTgwLDE2IEBACiAKIHN0YXRpYyBpbnQgc2V0X3NwdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgKnNwdGVwLAogCQkgICAgdW5zaWduZWQgcHRlX2FjY2VzcywgaW50IHVzZXJfZmF1bHQsCi0JCSAgICBpbnQgd3JpdGVfZmF1bHQsIGludCBkaXJ0eSwgaW50IGxldmVsLAorCQkgICAgaW50IHdyaXRlX2ZhdWx0LCBpbnQgbGV2ZWwsCiAJCSAgICBnZm5fdCBnZm4sIHBmbl90IHBmbiwgYm9vbCBzcGVjdWxhdGl2ZSwKIAkJICAgIGJvb2wgY2FuX3Vuc3luYywgYm9vbCBob3N0X3dyaXRhYmxlKQogewogCXU2NCBzcHRlLCBlbnRyeSA9ICpzcHRlcDsKIAlpbnQgcmV0ID0gMDsKIAorCWlmIChzZXRfbW1pb19zcHRlKHNwdGVwLCBnZm4sIHBmbiwgcHRlX2FjY2VzcykpCisJCXJldHVybiAwOworCiAJLyoKIAkgKiBXZSBkb24ndCBzZXQgdGhlIGFjY2Vzc2VkIGJpdCwgc2luY2Ugd2Ugc29tZXRpbWVzIHdhbnQgdG8gc2VlCiAJICogd2hldGhlciB0aGUgZ3Vlc3QgYWN0dWFsbHkgdXNlZCB0aGUgcHRlIChpbiBvcmRlciB0byBkZXRlY3QKQEAgLTIwMTcsOCArMjE5OCw3IEBACiAJc3B0ZSA9IFBUX1BSRVNFTlRfTUFTSzsKIAlpZiAoIXNwZWN1bGF0aXZlKQogCQlzcHRlIHw9IHNoYWRvd19hY2Nlc3NlZF9tYXNrOwotCWlmICghZGlydHkpCi0JCXB0ZV9hY2Nlc3MgJj0gfkFDQ19XUklURV9NQVNLOworCiAJaWYgKHB0ZV9hY2Nlc3MgJiBBQ0NfRVhFQ19NQVNLKQogCQlzcHRlIHw9IHNoYWRvd194X21hc2s7CiAJZWxzZQpAQCAtMjA0NSwxNSArMjIyNSwyNCBAQAogCQlpZiAobGV2ZWwgPiBQVF9QQUdFX1RBQkxFX0xFVkVMICYmCiAJCSAgICBoYXNfd3Jwcm90ZWN0ZWRfcGFnZSh2Y3B1LT5rdm0sIGdmbiwgbGV2ZWwpKSB7CiAJCQlyZXQgPSAxOwotCQkJZHJvcF9zcHRlKHZjcHUtPmt2bSwgc3B0ZXAsIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKKwkJCWRyb3Bfc3B0ZSh2Y3B1LT5rdm0sIHNwdGVwKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCiAJCXNwdGUgfD0gUFRfV1JJVEFCTEVfTUFTSzsKIAogCQlpZiAoIXZjcHUtPmFyY2gubW11LmRpcmVjdF9tYXAKLQkJICAgICYmICEocHRlX2FjY2VzcyAmIEFDQ19XUklURV9NQVNLKSkKKwkJICAgICYmICEocHRlX2FjY2VzcyAmIEFDQ19XUklURV9NQVNLKSkgewogCQkJc3B0ZSAmPSB+UFRfVVNFUl9NQVNLOworCQkJLyoKKwkJCSAqIElmIHdlIGNvbnZlcnRlZCBhIHVzZXIgcGFnZSB0byBhIGtlcm5lbCBwYWdlLAorCQkJICogc28gdGhhdCB0aGUga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGNyMC53cD0wLAorCQkJICogdGhlbiB3ZSBzaG91bGQgcHJldmVudCB0aGUga2VybmVsIGZyb20gZXhlY3V0aW5nIGl0CisJCQkgKiBpZiBTTUVQIGlzIGVuYWJsZWQuCisJCQkgKi8KKwkJCWlmIChrdm1fcmVhZF9jcjRfYml0cyh2Y3B1LCBYODZfQ1I0X1NNRVApKQorCQkJCXNwdGUgfD0gUFQ2NF9OWF9NQVNLOworCQl9CiAKIAkJLyoKIAkJICogT3B0aW1pemF0aW9uOiBmb3IgcHRlIHN5bmMsIGlmIHNwdGUgd2FzIHdyaXRhYmxlIHRoZSBoYXNoCkBAIC0yMDc4LDcgKzIyNjcsNyBAQAogCQltYXJrX3BhZ2VfZGlydHkodmNwdS0+a3ZtLCBnZm4pOwogCiBzZXRfcHRlOgotCXVwZGF0ZV9zcHRlKHNwdGVwLCBzcHRlKTsKKwltbXVfc3B0ZV91cGRhdGUoc3B0ZXAsIHNwdGUpOwogCS8qCiAJICogSWYgd2Ugb3ZlcndyaXRlIGEgd3JpdGFibGUgc3B0ZSB3aXRoIGEgcmVhZC1vbmx5IG9uZSB3ZQogCSAqIHNob3VsZCBmbHVzaCByZW1vdGUgVExCcy4gT3RoZXJ3aXNlIHJtYXBfd3JpdGVfcHJvdGVjdApAQCAtMjA5Myw4ICsyMjgyLDggQEAKIAogc3RhdGljIHZvaWQgbW11X3NldF9zcHRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0ICpzcHRlcCwKIAkJCSB1bnNpZ25lZCBwdF9hY2Nlc3MsIHVuc2lnbmVkIHB0ZV9hY2Nlc3MsCi0JCQkgaW50IHVzZXJfZmF1bHQsIGludCB3cml0ZV9mYXVsdCwgaW50IGRpcnR5LAotCQkJIGludCAqcHR3cml0ZSwgaW50IGxldmVsLCBnZm5fdCBnZm4sCisJCQkgaW50IHVzZXJfZmF1bHQsIGludCB3cml0ZV9mYXVsdCwKKwkJCSBpbnQgKmVtdWxhdGUsIGludCBsZXZlbCwgZ2ZuX3QgZ2ZuLAogCQkJIHBmbl90IHBmbiwgYm9vbCBzcGVjdWxhdGl2ZSwKIAkJCSBib29sIGhvc3Rfd3JpdGFibGUpCiB7CkBAIC0yMTE3LDI2ICsyMzA2LDI4IEBACiAJCQl1NjQgcHRlID0gKnNwdGVwOwogCiAJCQljaGlsZCA9IHBhZ2VfaGVhZGVyKHB0ZSAmIFBUNjRfQkFTRV9BRERSX01BU0spOwotCQkJbW11X3BhZ2VfcmVtb3ZlX3BhcmVudF9wdGUoY2hpbGQsIHNwdGVwKTsKLQkJCV9fc2V0X3NwdGUoc3B0ZXAsIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKKwkJCWRyb3BfcGFyZW50X3B0ZShjaGlsZCwgc3B0ZXApOwogCQkJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKHZjcHUtPmt2bSk7CiAJCX0gZWxzZSBpZiAocGZuICE9IHNwdGVfdG9fcGZuKCpzcHRlcCkpIHsKIAkJCXBncHJpbnRrKCJoZm4gb2xkICVsbHggbmV3ICVsbHhcbiIsCiAJCQkJIHNwdGVfdG9fcGZuKCpzcHRlcCksIHBmbik7Ci0JCQlkcm9wX3NwdGUodmNwdS0+a3ZtLCBzcHRlcCwgc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpOworCQkJZHJvcF9zcHRlKHZjcHUtPmt2bSwgc3B0ZXApOwogCQkJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKHZjcHUtPmt2bSk7CiAJCX0gZWxzZQogCQkJd2FzX3JtYXBwZWQgPSAxOwogCX0KIAogCWlmIChzZXRfc3B0ZSh2Y3B1LCBzcHRlcCwgcHRlX2FjY2VzcywgdXNlcl9mYXVsdCwgd3JpdGVfZmF1bHQsCi0JCSAgICAgIGRpcnR5LCBsZXZlbCwgZ2ZuLCBwZm4sIHNwZWN1bGF0aXZlLCB0cnVlLAorCQkgICAgICBsZXZlbCwgZ2ZuLCBwZm4sIHNwZWN1bGF0aXZlLCB0cnVlLAogCQkgICAgICBob3N0X3dyaXRhYmxlKSkgewogCQlpZiAod3JpdGVfZmF1bHQpCi0JCQkqcHR3cml0ZSA9IDE7CisJCQkqZW11bGF0ZSA9IDE7CiAJCWt2bV9tbXVfZmx1c2hfdGxiKHZjcHUpOwogCX0KIAorCWlmICh1bmxpa2VseShpc19tbWlvX3NwdGUoKnNwdGVwKSAmJiBlbXVsYXRlKSkKKwkJKmVtdWxhdGUgPSAxOworCiAJcGdwcmludGsoIiVzOiBzZXR0aW5nIHNwdGUgJWxseFxuIiwgX19mdW5jX18sICpzcHRlcCk7CiAJcGdwcmludGsoImluc3RhbnRpYXRpbmcgJXMgUFRFICglcykgYXQgJWxseCAoJWxseCkgYWRkciAlcFxuIiwKIAkJIGlzX2xhcmdlX3B0ZSgqc3B0ZXApPyAiMk1CIiA6ICI0a0IiLApAQCAtMjE0NSwxMSArMjMzNiwxMyBAQAogCWlmICghd2FzX3JtYXBwZWQgJiYgaXNfbGFyZ2VfcHRlKCpzcHRlcCkpCiAJCSsrdmNwdS0+a3ZtLT5zdGF0LmxwYWdlczsKIAotCXBhZ2VfaGVhZGVyX3VwZGF0ZV9zbG90KHZjcHUtPmt2bSwgc3B0ZXAsIGdmbik7Ci0JaWYgKCF3YXNfcm1hcHBlZCkgewotCQlybWFwX2NvdW50ID0gcm1hcF9hZGQodmNwdSwgc3B0ZXAsIGdmbik7Ci0JCWlmIChybWFwX2NvdW50ID4gUk1BUF9SRUNZQ0xFX1RIUkVTSE9MRCkKLQkJCXJtYXBfcmVjeWNsZSh2Y3B1LCBzcHRlcCwgZ2ZuKTsKKwlpZiAoaXNfc2hhZG93X3ByZXNlbnRfcHRlKCpzcHRlcCkpIHsKKwkJcGFnZV9oZWFkZXJfdXBkYXRlX3Nsb3QodmNwdS0+a3ZtLCBzcHRlcCwgZ2ZuKTsKKwkJaWYgKCF3YXNfcm1hcHBlZCkgeworCQkJcm1hcF9jb3VudCA9IHJtYXBfYWRkKHZjcHUsIHNwdGVwLCBnZm4pOworCQkJaWYgKHJtYXBfY291bnQgPiBSTUFQX1JFQ1lDTEVfVEhSRVNIT0xEKQorCQkJCXJtYXBfcmVjeWNsZSh2Y3B1LCBzcHRlcCwgZ2ZuKTsKKwkJfQogCX0KIAlrdm1fcmVsZWFzZV9wZm5fY2xlYW4ocGZuKTsKIAlpZiAoc3BlY3VsYXRpdmUpIHsKQEAgLTIxNzAsOCArMjM2Myw4IEBACiAKIAlzbG90ID0gZ2ZuX3RvX21lbXNsb3RfZGlydHlfYml0bWFwKHZjcHUsIGdmbiwgbm9fZGlydHlfbG9nKTsKIAlpZiAoIXNsb3QpIHsKLQkJZ2V0X3BhZ2UoYmFkX3BhZ2UpOwotCQlyZXR1cm4gcGFnZV90b19wZm4oYmFkX3BhZ2UpOworCQlnZXRfcGFnZShmYXVsdF9wYWdlKTsKKwkJcmV0dXJuIHBhZ2VfdG9fcGZuKGZhdWx0X3BhZ2UpOwogCX0KIAogCWh2YSA9IGdmbl90b19odmFfbWVtc2xvdChzbG90LCBnZm4pOwpAQCAtMjE5OCw3ICsyMzkxLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCByZXQ7IGkrKywgZ2ZuKyssIHN0YXJ0KyspCiAJCW1tdV9zZXRfc3B0ZSh2Y3B1LCBzdGFydCwgQUNDX0FMTCwKLQkJCSAgICAgYWNjZXNzLCAwLCAwLCAxLCBOVUxMLAorCQkJICAgICBhY2Nlc3MsIDAsIDAsIE5VTEwsCiAJCQkgICAgIHNwLT5yb2xlLmxldmVsLCBnZm4sCiAJCQkgICAgIHBhZ2VfdG9fcGZuKHBhZ2VzW2ldKSwgdHJ1ZSwgdHJ1ZSk7CiAKQEAgLTIyMTcsNyArMjQxMCw3IEBACiAJc3B0ZSA9IHNwLT5zcHQgKyBpOwogCiAJZm9yIChpID0gMDsgaSA8IFBURV9QUkVGRVRDSF9OVU07IGkrKywgc3B0ZSsrKSB7Ci0JCWlmICgqc3B0ZSAhPSBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSB8fCBzcHRlID09IHNwdGVwKSB7CisJCWlmIChpc19zaGFkb3dfcHJlc2VudF9wdGUoKnNwdGUpIHx8IHNwdGUgPT0gc3B0ZXApIHsKIAkJCWlmICghc3RhcnQpCiAJCQkJY29udGludWU7CiAJCQlpZiAoZGlyZWN0X3B0ZV9wcmVmZXRjaF9tYW55KHZjcHUsIHNwLCBzdGFydCwgc3B0ZSkgPCAwKQpAQCAtMjI1NCw3ICsyNDQ3LDcgQEAKIHsKIAlzdHJ1Y3Qga3ZtX3NoYWRvd193YWxrX2l0ZXJhdG9yIGl0ZXJhdG9yOwogCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwOwotCWludCBwdF93cml0ZSA9IDA7CisJaW50IGVtdWxhdGUgPSAwOwogCWdmbl90IHBzZXVkb19nZm47CiAKIAlmb3JfZWFjaF9zaGFkb3dfZW50cnkodmNwdSwgKHU2NClnZm4gPDwgUEFHRV9TSElGVCwgaXRlcmF0b3IpIHsKQEAgLTIyNjIsMTQgKzI0NTUsMTQgQEAKIAkJCXVuc2lnbmVkIHB0ZV9hY2Nlc3MgPSBBQ0NfQUxMOwogCiAJCQltbXVfc2V0X3NwdGUodmNwdSwgaXRlcmF0b3Iuc3B0ZXAsIEFDQ19BTEwsIHB0ZV9hY2Nlc3MsCi0JCQkJICAgICAwLCB3cml0ZSwgMSwgJnB0X3dyaXRlLAorCQkJCSAgICAgMCwgd3JpdGUsICZlbXVsYXRlLAogCQkJCSAgICAgbGV2ZWwsIGdmbiwgcGZuLCBwcmVmYXVsdCwgbWFwX3dyaXRhYmxlKTsKIAkJCWRpcmVjdF9wdGVfcHJlZmV0Y2godmNwdSwgaXRlcmF0b3Iuc3B0ZXApOwogCQkJKyt2Y3B1LT5zdGF0LnBmX2ZpeGVkOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoKml0ZXJhdG9yLnNwdGVwID09IHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKSB7CisJCWlmICghaXNfc2hhZG93X3ByZXNlbnRfcHRlKCppdGVyYXRvci5zcHRlcCkpIHsKIAkJCXU2NCBiYXNlX2FkZHIgPSBpdGVyYXRvci5hZGRyOwogCiAJCQliYXNlX2FkZHIgJj0gUFQ2NF9MVkxfQUREUl9NQVNLKGl0ZXJhdG9yLmxldmVsKTsKQEAgLTIyODMsMTQgKzI0NzYsMTQgQEAKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAotCQkJX19zZXRfc3B0ZShpdGVyYXRvci5zcHRlcCwKLQkJCQkgICBfX3BhKHNwLT5zcHQpCi0JCQkJICAgfCBQVF9QUkVTRU5UX01BU0sgfCBQVF9XUklUQUJMRV9NQVNLCi0JCQkJICAgfCBzaGFkb3dfdXNlcl9tYXNrIHwgc2hhZG93X3hfbWFzawotCQkJCSAgIHwgc2hhZG93X2FjY2Vzc2VkX21hc2spOworCQkJbW11X3NwdGVfc2V0KGl0ZXJhdG9yLnNwdGVwLAorCQkJCSAgICAgX19wYShzcC0+c3B0KQorCQkJCSAgICAgfCBQVF9QUkVTRU5UX01BU0sgfCBQVF9XUklUQUJMRV9NQVNLCisJCQkJICAgICB8IHNoYWRvd191c2VyX21hc2sgfCBzaGFkb3dfeF9tYXNrCisJCQkJICAgICB8IHNoYWRvd19hY2Nlc3NlZF9tYXNrKTsKIAkJfQogCX0KLQlyZXR1cm4gcHRfd3JpdGU7CisJcmV0dXJuIGVtdWxhdGU7CiB9CiAKIHN0YXRpYyB2b2lkIGt2bV9zZW5kX2h3cG9pc29uX3NpZ25hbCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQpAQCAtMjMwNiwxNiArMjQ5OSwxNSBAQAogCXNlbmRfc2lnX2luZm8oU0lHQlVTLCAmaW5mbywgdHNrKTsKIH0KIAotc3RhdGljIGludCBrdm1faGFuZGxlX2JhZF9wYWdlKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuLCBwZm5fdCBwZm4pCitzdGF0aWMgaW50IGt2bV9oYW5kbGVfYmFkX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBnZm4sIHBmbl90IHBmbikKIHsKIAlrdm1fcmVsZWFzZV9wZm5fY2xlYW4ocGZuKTsKIAlpZiAoaXNfaHdwb2lzb25fcGZuKHBmbikpIHsKLQkJa3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKGdmbl90b19odmEoa3ZtLCBnZm4pLCBjdXJyZW50KTsKKwkJa3ZtX3NlbmRfaHdwb2lzb25fc2lnbmFsKGdmbl90b19odmEodmNwdS0+a3ZtLCBnZm4pLCBjdXJyZW50KTsKIAkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmIChpc19mYXVsdF9wZm4ocGZuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJfQogCi0JcmV0dXJuIDE7CisJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKIHN0YXRpYyB2b2lkIHRyYW5zcGFyZW50X2h1Z2VwYWdlX2FkanVzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCkBAIC0yMzYwLDYgKzI1NTIsMzAgQEAKIAl9CiB9CiAKK3N0YXRpYyBib29sIG1tdV9pbnZhbGlkX3BmbihwZm5fdCBwZm4pCit7CisJcmV0dXJuIHVubGlrZWx5KGlzX2ludmFsaWRfcGZuKHBmbikpOworfQorCitzdGF0aWMgYm9vbCBoYW5kbGVfYWJub3JtYWxfcGZuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLCBnZm5fdCBnZm4sCisJCQkJcGZuX3QgcGZuLCB1bnNpZ25lZCBhY2Nlc3MsIGludCAqcmV0X3ZhbCkKK3sKKwlib29sIHJldCA9IHRydWU7CisKKwkvKiBUaGUgcGZuIGlzIGludmFsaWQsIHJlcG9ydCB0aGUgZXJyb3IhICovCisJaWYgKHVubGlrZWx5KGlzX2ludmFsaWRfcGZuKHBmbikpKSB7CisJCSpyZXRfdmFsID0ga3ZtX2hhbmRsZV9iYWRfcGFnZSh2Y3B1LCBnZm4sIHBmbik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAodW5saWtlbHkoaXNfbm9zbG90X3BmbihwZm4pKSkKKwkJdmNwdV9jYWNoZV9tbWlvX2luZm8odmNwdSwgZ3ZhLCBnZm4sIGFjY2Vzcyk7CisKKwlyZXQgPSBmYWxzZTsKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGJvb2wgdHJ5X2FzeW5jX3BmKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgYm9vbCBwcmVmYXVsdCwgZ2ZuX3QgZ2ZuLAogCQkJIGd2YV90IGd2YSwgcGZuX3QgKnBmbiwgYm9vbCB3cml0ZSwgYm9vbCAqd3JpdGFibGUpOwogCkBAIC0yMzk0LDkgKzI2MTAsOCBAQAogCWlmICh0cnlfYXN5bmNfcGYodmNwdSwgcHJlZmF1bHQsIGdmbiwgdiwgJnBmbiwgd3JpdGUsICZtYXBfd3JpdGFibGUpKQogCQlyZXR1cm4gMDsKIAotCS8qIG1taW8gKi8KLQlpZiAoaXNfZXJyb3JfcGZuKHBmbikpCi0JCXJldHVybiBrdm1faGFuZGxlX2JhZF9wYWdlKHZjcHUtPmt2bSwgZ2ZuLCBwZm4pOworCWlmIChoYW5kbGVfYWJub3JtYWxfcGZuKHZjcHUsIHYsIGdmbiwgcGZuLCBBQ0NfQUxMLCAmcikpCisJCXJldHVybiByOwogCiAJc3Bpbl9sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKIAlpZiAobW11X25vdGlmaWVyX3JldHJ5KHZjcHUsIG1tdV9zZXEpKQpAQCAtMjYyMyw2ICsyODM4LDcgQEAKIAlpZiAoIVZBTElEX1BBR0UodmNwdS0+YXJjaC5tbXUucm9vdF9ocGEpKQogCQlyZXR1cm47CiAKKwl2Y3B1X2NsZWFyX21taW9faW5mbyh2Y3B1LCB+MHVsKTsKIAl0cmFjZV9rdm1fbW11X2F1ZGl0KHZjcHUsIEFVRElUX1BSRV9TWU5DKTsKIAlpZiAodmNwdS0+YXJjaC5tbXUucm9vdF9sZXZlbCA9PSBQVDY0X1JPT1RfTEVWRUwpIHsKIAkJaHBhX3Qgcm9vdCA9IHZjcHUtPmFyY2gubW11LnJvb3RfaHBhOwpAQCAtMjY2Nyw2ICsyODgzLDk0IEBACiAJcmV0dXJuIHZjcHUtPmFyY2gubmVzdGVkX21tdS50cmFuc2xhdGVfZ3BhKHZjcHUsIHZhZGRyLCBhY2Nlc3MpOwogfQogCitzdGF0aWMgYm9vbCBxdWlja2x5X2NoZWNrX21taW9fcGYoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYWRkciwgYm9vbCBkaXJlY3QpCit7CisJaWYgKGRpcmVjdCkKKwkJcmV0dXJuIHZjcHVfbWF0Y2hfbW1pb19ncGEodmNwdSwgYWRkcik7CisKKwlyZXR1cm4gdmNwdV9tYXRjaF9tbWlvX2d2YSh2Y3B1LCBhZGRyKTsKK30KKworCisvKgorICogT24gZGlyZWN0IGhvc3RzLCB0aGUgbGFzdCBzcHRlIGlzIG9ubHkgYWxsb3dzIHR3byBzdGF0ZXMKKyAqIGZvciBtbWlvIHBhZ2UgZmF1bHQ6CisgKiAgIC0gSXQgaXMgdGhlIG1taW8gc3B0ZQorICogICAtIEl0IGlzIHphcHBlZCBvciBpdCBpcyBiZWluZyB6YXBwZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBjb21wbGV0ZWx5IGNoZWNrcyB0aGUgc3B0ZSB3aGVuIHRoZSBsYXN0IHNwdGUKKyAqIGlzIG5vdCB0aGUgbW1pbyBzcHRlLgorICovCitzdGF0aWMgYm9vbCBjaGVja19kaXJlY3Rfc3B0ZV9tbWlvX3BmKHU2NCBzcHRlKQoreworCXJldHVybiBfX2NoZWNrX2RpcmVjdF9zcHRlX21taW9fcGYoc3B0ZSk7Cit9CisKK3N0YXRpYyB1NjQgd2Fsa19zaGFkb3dfcGFnZV9nZXRfbW1pb19zcHRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGFkZHIpCit7CisJc3RydWN0IGt2bV9zaGFkb3dfd2Fsa19pdGVyYXRvciBpdGVyYXRvcjsKKwl1NjQgc3B0ZSA9IDB1bGw7CisKKwl3YWxrX3NoYWRvd19wYWdlX2xvY2tsZXNzX2JlZ2luKHZjcHUpOworCWZvcl9lYWNoX3NoYWRvd19lbnRyeV9sb2NrbGVzcyh2Y3B1LCBhZGRyLCBpdGVyYXRvciwgc3B0ZSkKKwkJaWYgKCFpc19zaGFkb3dfcHJlc2VudF9wdGUoc3B0ZSkpCisJCQlicmVhazsKKwl3YWxrX3NoYWRvd19wYWdlX2xvY2tsZXNzX2VuZCh2Y3B1KTsKKworCXJldHVybiBzcHRlOworfQorCisvKgorICogSWYgaXQgaXMgYSByZWFsIG1taW8gcGFnZSBmYXVsdCwgcmV0dXJuIDEgYW5kIGVtdWxhdCB0aGUgaW5zdHJ1Y3Rpb24KKyAqIGRpcmVjdGx5LCByZXR1cm4gMCB0byBsZXQgQ1BVIGZhdWx0IGFnYWluIG9uIHRoZSBhZGRyZXNzLCAtMSBpcworICogcmV0dXJuZWQgaWYgYnVnIGlzIGRldGVjdGVkLgorICovCitpbnQgaGFuZGxlX21taW9fcGFnZV9mYXVsdF9jb21tb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYWRkciwgYm9vbCBkaXJlY3QpCit7CisJdTY0IHNwdGU7CisKKwlpZiAocXVpY2tseV9jaGVja19tbWlvX3BmKHZjcHUsIGFkZHIsIGRpcmVjdCkpCisJCXJldHVybiAxOworCisJc3B0ZSA9IHdhbGtfc2hhZG93X3BhZ2VfZ2V0X21taW9fc3B0ZSh2Y3B1LCBhZGRyKTsKKworCWlmIChpc19tbWlvX3NwdGUoc3B0ZSkpIHsKKwkJZ2ZuX3QgZ2ZuID0gZ2V0X21taW9fc3B0ZV9nZm4oc3B0ZSk7CisJCXVuc2lnbmVkIGFjY2VzcyA9IGdldF9tbWlvX3NwdGVfYWNjZXNzKHNwdGUpOworCisJCWlmIChkaXJlY3QpCisJCQlhZGRyID0gMDsKKworCQl0cmFjZV9oYW5kbGVfbW1pb19wYWdlX2ZhdWx0KGFkZHIsIGdmbiwgYWNjZXNzKTsKKwkJdmNwdV9jYWNoZV9tbWlvX2luZm8odmNwdSwgYWRkciwgZ2ZuLCBhY2Nlc3MpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIEl0J3Mgb2sgaWYgdGhlIGd2YSBpcyByZW1hcHBlZCBieSBvdGhlciBjcHVzIG9uIHNoYWRvdyBndWVzdCwKKwkgKiBpdCdzIGEgQlVHIGlmIHRoZSBnZm4gaXMgbm90IGEgbW1pbyBwYWdlLgorCSAqLworCWlmIChkaXJlY3QgJiYgIWNoZWNrX2RpcmVjdF9zcHRlX21taW9fcGYoc3B0ZSkpCisJCXJldHVybiAtMTsKKworCS8qCisJICogSWYgdGhlIHBhZ2UgdGFibGUgaXMgemFwcGVkIGJ5IG90aGVyIGNwdXMsIGxldCBDUFUgZmF1bHQgYWdhaW4gb24KKwkgKiB0aGUgYWRkcmVzcy4KKwkgKi8KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGhhbmRsZV9tbWlvX3BhZ2VfZmF1bHRfY29tbW9uKTsKKworc3RhdGljIGludCBoYW5kbGVfbW1pb19wYWdlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGFkZHIsCisJCQkJICB1MzIgZXJyb3JfY29kZSwgYm9vbCBkaXJlY3QpCit7CisJaW50IHJldDsKKworCXJldCA9IGhhbmRsZV9tbWlvX3BhZ2VfZmF1bHRfY29tbW9uKHZjcHUsIGFkZHIsIGRpcmVjdCk7CisJV0FSTl9PTihyZXQgPCAwKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG5vbnBhZ2luZ19wYWdlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLAogCQkJCXUzMiBlcnJvcl9jb2RlLCBib29sIHByZWZhdWx0KQogewpAQCAtMjY3NCw2ICsyOTc4LDEwIEBACiAJaW50IHI7CiAKIAlwZ3ByaW50aygiJXM6IGd2YSAlbHggZXJyb3IgJXhcbiIsIF9fZnVuY19fLCBndmEsIGVycm9yX2NvZGUpOworCisJaWYgKHVubGlrZWx5KGVycm9yX2NvZGUgJiBQRkVSUl9SU1ZEX01BU0spKQorCQlyZXR1cm4gaGFuZGxlX21taW9fcGFnZV9mYXVsdCh2Y3B1LCBndmEsIGVycm9yX2NvZGUsIHRydWUpOworCiAJciA9IG1tdV90b3B1cF9tZW1vcnlfY2FjaGVzKHZjcHUpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTI3NTAsNiArMzA1OCw5IEBACiAJQVNTRVJUKHZjcHUpOwogCUFTU0VSVChWQUxJRF9QQUdFKHZjcHUtPmFyY2gubW11LnJvb3RfaHBhKSk7CiAKKwlpZiAodW5saWtlbHkoZXJyb3JfY29kZSAmIFBGRVJSX1JTVkRfTUFTSykpCisJCXJldHVybiBoYW5kbGVfbW1pb19wYWdlX2ZhdWx0KHZjcHUsIGdwYSwgZXJyb3JfY29kZSwgdHJ1ZSk7CisKIAlyID0gbW11X3RvcHVwX21lbW9yeV9jYWNoZXModmNwdSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtMjc2Nyw5ICszMDc4LDkgQEAKIAlpZiAodHJ5X2FzeW5jX3BmKHZjcHUsIHByZWZhdWx0LCBnZm4sIGdwYSwgJnBmbiwgd3JpdGUsICZtYXBfd3JpdGFibGUpKQogCQlyZXR1cm4gMDsKIAotCS8qIG1taW8gKi8KLQlpZiAoaXNfZXJyb3JfcGZuKHBmbikpCi0JCXJldHVybiBrdm1faGFuZGxlX2JhZF9wYWdlKHZjcHUtPmt2bSwgZ2ZuLCBwZm4pOworCWlmIChoYW5kbGVfYWJub3JtYWxfcGZuKHZjcHUsIDAsIGdmbiwgcGZuLCBBQ0NfQUxMLCAmcikpCisJCXJldHVybiByOworCiAJc3Bpbl9sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKIAlpZiAobW11X25vdGlmaWVyX3JldHJ5KHZjcHUsIG1tdV9zZXEpKQogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0yODAwLDcgKzMxMTEsNiBAQAogCWNvbnRleHQtPnBhZ2VfZmF1bHQgPSBub25wYWdpbmdfcGFnZV9mYXVsdDsKIAljb250ZXh0LT5ndmFfdG9fZ3BhID0gbm9ucGFnaW5nX2d2YV90b19ncGE7CiAJY29udGV4dC0+ZnJlZSA9IG5vbnBhZ2luZ19mcmVlOwotCWNvbnRleHQtPnByZWZldGNoX3BhZ2UgPSBub25wYWdpbmdfcHJlZmV0Y2hfcGFnZTsKIAljb250ZXh0LT5zeW5jX3BhZ2UgPSBub25wYWdpbmdfc3luY19wYWdlOwogCWNvbnRleHQtPmludmxwZyA9IG5vbnBhZ2luZ19pbnZscGc7CiAJY29udGV4dC0+dXBkYXRlX3B0ZSA9IG5vbnBhZ2luZ191cGRhdGVfcHRlOwpAQCAtMjg0OCw2ICszMTU4LDIzIEBACiAJcmV0dXJuIChncHRlICYgbW11LT5yc3ZkX2JpdHNfbWFza1tiaXQ3XVtsZXZlbC0xXSkgIT0gMDsKIH0KIAorc3RhdGljIGJvb2wgc3luY19tbWlvX3NwdGUodTY0ICpzcHRlcCwgZ2ZuX3QgZ2ZuLCB1bnNpZ25lZCBhY2Nlc3MsCisJCQkgICBpbnQgKm5yX3ByZXNlbnQpCit7CisJaWYgKHVubGlrZWx5KGlzX21taW9fc3B0ZSgqc3B0ZXApKSkgeworCQlpZiAoZ2ZuICE9IGdldF9tbWlvX3NwdGVfZ2ZuKCpzcHRlcCkpIHsKKwkJCW1tdV9zcHRlX2NsZWFyX25vX3RyYWNrKHNwdGVwKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJKCpucl9wcmVzZW50KSsrOworCQltYXJrX21taW9fc3B0ZShzcHRlcCwgZ2ZuLCBhY2Nlc3MpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKICNkZWZpbmUgUFRUWVBFIDY0CiAjaW5jbHVkZSAicGFnaW5nX3RtcGwuaCIKICN1bmRlZiBQVFRZUEUKQEAgLTI5MzAsNyArMzI1Nyw2IEBACiAJY29udGV4dC0+bmV3X2NyMyA9IHBhZ2luZ19uZXdfY3IzOwogCWNvbnRleHQtPnBhZ2VfZmF1bHQgPSBwYWdpbmc2NF9wYWdlX2ZhdWx0OwogCWNvbnRleHQtPmd2YV90b19ncGEgPSBwYWdpbmc2NF9ndmFfdG9fZ3BhOwotCWNvbnRleHQtPnByZWZldGNoX3BhZ2UgPSBwYWdpbmc2NF9wcmVmZXRjaF9wYWdlOwogCWNvbnRleHQtPnN5bmNfcGFnZSA9IHBhZ2luZzY0X3N5bmNfcGFnZTsKIAljb250ZXh0LT5pbnZscGcgPSBwYWdpbmc2NF9pbnZscGc7CiAJY29udGV4dC0+dXBkYXRlX3B0ZSA9IHBhZ2luZzY0X3VwZGF0ZV9wdGU7CkBAIC0yOTU5LDcgKzMyODUsNiBAQAogCWNvbnRleHQtPnBhZ2VfZmF1bHQgPSBwYWdpbmczMl9wYWdlX2ZhdWx0OwogCWNvbnRleHQtPmd2YV90b19ncGEgPSBwYWdpbmczMl9ndmFfdG9fZ3BhOwogCWNvbnRleHQtPmZyZWUgPSBwYWdpbmdfZnJlZTsKLQljb250ZXh0LT5wcmVmZXRjaF9wYWdlID0gcGFnaW5nMzJfcHJlZmV0Y2hfcGFnZTsKIAljb250ZXh0LT5zeW5jX3BhZ2UgPSBwYWdpbmczMl9zeW5jX3BhZ2U7CiAJY29udGV4dC0+aW52bHBnID0gcGFnaW5nMzJfaW52bHBnOwogCWNvbnRleHQtPnVwZGF0ZV9wdGUgPSBwYWdpbmczMl91cGRhdGVfcHRlOwpAQCAtMjk4NCw3ICszMzA5LDYgQEAKIAljb250ZXh0LT5uZXdfY3IzID0gbm9ucGFnaW5nX25ld19jcjM7CiAJY29udGV4dC0+cGFnZV9mYXVsdCA9IHRkcF9wYWdlX2ZhdWx0OwogCWNvbnRleHQtPmZyZWUgPSBub25wYWdpbmdfZnJlZTsKLQljb250ZXh0LT5wcmVmZXRjaF9wYWdlID0gbm9ucGFnaW5nX3ByZWZldGNoX3BhZ2U7CiAJY29udGV4dC0+c3luY19wYWdlID0gbm9ucGFnaW5nX3N5bmNfcGFnZTsKIAljb250ZXh0LT5pbnZscGcgPSBub25wYWdpbmdfaW52bHBnOwogCWNvbnRleHQtPnVwZGF0ZV9wdGUgPSBub25wYWdpbmdfdXBkYXRlX3B0ZTsKQEAgLTMwMjMsNiArMzM0Nyw3IEBACiBpbnQga3ZtX2luaXRfc2hhZG93X21tdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbW11ICpjb250ZXh0KQogewogCWludCByOworCWJvb2wgc21lcCA9IGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIFg4Nl9DUjRfU01FUCk7CiAJQVNTRVJUKHZjcHUpOwogCUFTU0VSVCghVkFMSURfUEFHRSh2Y3B1LT5hcmNoLm1tdS5yb290X2hwYSkpOwogCkBAIC0zMDM3LDYgKzMzNjIsOCBAQAogCiAJdmNwdS0+YXJjaC5tbXUuYmFzZV9yb2xlLmNyNF9wYWUgPSAhIWlzX3BhZSh2Y3B1KTsKIAl2Y3B1LT5hcmNoLm1tdS5iYXNlX3JvbGUuY3IwX3dwICA9IGlzX3dyaXRlX3Byb3RlY3Rpb24odmNwdSk7CisJdmNwdS0+YXJjaC5tbXUuYmFzZV9yb2xlLnNtZXBfYW5kbm90X3dwCisJCT0gc21lcCAmJiAhaXNfd3JpdGVfcHJvdGVjdGlvbih2Y3B1KTsKIAogCXJldHVybiByOwogfQpAQCAtMzE0MSwyNyArMzQ2OCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fbW11X3VubG9hZCk7CiAKLXN0YXRpYyB2b2lkIG1tdV9wdGVfd3JpdGVfemFwX3B0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJICBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwKLQkJCQkgIHU2NCAqc3B0ZSkKLXsKLQl1NjQgcHRlOwotCXN0cnVjdCBrdm1fbW11X3BhZ2UgKmNoaWxkOwotCi0JcHRlID0gKnNwdGU7Ci0JaWYgKGlzX3NoYWRvd19wcmVzZW50X3B0ZShwdGUpKSB7Ci0JCWlmIChpc19sYXN0X3NwdGUocHRlLCBzcC0+cm9sZS5sZXZlbCkpCi0JCQlkcm9wX3NwdGUodmNwdS0+a3ZtLCBzcHRlLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7Ci0JCWVsc2UgewotCQkJY2hpbGQgPSBwYWdlX2hlYWRlcihwdGUgJiBQVDY0X0JBU0VfQUREUl9NQVNLKTsKLQkJCW1tdV9wYWdlX3JlbW92ZV9wYXJlbnRfcHRlKGNoaWxkLCBzcHRlKTsKLQkJfQotCX0KLQlfX3NldF9zcHRlKHNwdGUsIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKLQlpZiAoaXNfbGFyZ2VfcHRlKHB0ZSkpCi0JCS0tdmNwdS0+a3ZtLT5zdGF0LmxwYWdlczsKLX0KLQogc3RhdGljIHZvaWQgbW11X3B0ZV93cml0ZV9uZXdfcHRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkgIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLCB1NjQgKnNwdGUsCiAJCQkJICBjb25zdCB2b2lkICpuZXcpCkBAIC0zMjMzLDYgKzM1MzksMTMgQEAKIAlpbnQgbGV2ZWwsIG5wdGUsIGludmxwZ19jb3VudGVyLCByLCBmbG9vZGVkID0gMDsKIAlib29sIHJlbW90ZV9mbHVzaCwgbG9jYWxfZmx1c2gsIHphcF9wYWdlOwogCisJLyoKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGluZGlyZWN0IHNoYWRvdyBwYWdlcywgaXQgbWVhbnMgbm8gcGFnZSBpcworCSAqIHdyaXRlLXByb3RlY3RlZCwgc28gd2UgY2FuIGV4aXQgc2ltcGx5LgorCSAqLworCWlmICghQUNDRVNTX09OQ0UodmNwdS0+a3ZtLT5hcmNoLmluZGlyZWN0X3NoYWRvd19wYWdlcykpCisJCXJldHVybjsKKwogCXphcF9wYWdlID0gcmVtb3RlX2ZsdXNoID0gbG9jYWxfZmx1c2ggPSBmYWxzZTsKIAlvZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShncGEpOwogCkBAIC0zMzM2LDcgKzM2NDksNyBAQAogCQlzcHRlID0gJnNwLT5zcHRbcGFnZV9vZmZzZXQgLyBzaXplb2YoKnNwdGUpXTsKIAkJd2hpbGUgKG5wdGUtLSkgewogCQkJZW50cnkgPSAqc3B0ZTsKLQkJCW1tdV9wdGVfd3JpdGVfemFwX3B0ZSh2Y3B1LCBzcCwgc3B0ZSk7CisJCQltbXVfcGFnZV96YXBfcHRlKHZjcHUtPmt2bSwgc3AsIHNwdGUpOwogCQkJaWYgKGdlbnRyeSAmJgogCQkJICAgICAgISgoc3AtPnJvbGUud29yZCBeIHZjcHUtPmFyY2gubW11LmJhc2Vfcm9sZS53b3JkKQogCQkJICAgICAgJiBtYXNrLndvcmQpKQpAQCAtMzM4MCw5ICszNjkzLDkgQEAKIAkJc3AgPSBjb250YWluZXJfb2YodmNwdS0+a3ZtLT5hcmNoLmFjdGl2ZV9tbXVfcGFnZXMucHJldiwKIAkJCQkgIHN0cnVjdCBrdm1fbW11X3BhZ2UsIGxpbmspOwogCQlrdm1fbW11X3ByZXBhcmVfemFwX3BhZ2UodmNwdS0+a3ZtLCBzcCwgJmludmFsaWRfbGlzdCk7Ci0JCWt2bV9tbXVfY29tbWl0X3phcF9wYWdlKHZjcHUtPmt2bSwgJmludmFsaWRfbGlzdCk7CiAJCSsrdmNwdS0+a3ZtLT5zdGF0Lm1tdV9yZWN5Y2xlZDsKIAl9CisJa3ZtX21tdV9jb21taXRfemFwX3BhZ2UodmNwdS0+a3ZtLCAmaW52YWxpZF9saXN0KTsKIH0KIAogaW50IGt2bV9tbXVfcGFnZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGNyMiwgdTMyIGVycm9yX2NvZGUsCkBAIC0zNTA2LDE1ICszODE5LDE1IEBACiAJCQkJY29udGludWU7CiAKIAkJCWlmIChpc19sYXJnZV9wdGUocHRbaV0pKSB7Ci0JCQkJZHJvcF9zcHRlKGt2bSwgJnB0W2ldLAotCQkJCQkgIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKKwkJCQlkcm9wX3NwdGUoa3ZtLCAmcHRbaV0pOwogCQkJCS0ta3ZtLT5zdGF0LmxwYWdlczsKIAkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJLyogYXZvaWQgUk1XICovCiAJCQlpZiAoaXNfd3JpdGFibGVfcHRlKHB0W2ldKSkKLQkJCQl1cGRhdGVfc3B0ZSgmcHRbaV0sIHB0W2ldICYgflBUX1dSSVRBQkxFX01BU0spOworCQkJCW1tdV9zcHRlX3VwZGF0ZSgmcHRbaV0sCisJCQkJCQlwdFtpXSAmIH5QVF9XUklUQUJMRV9NQVNLKTsKIAkJfQogCX0KIAlrdm1fZmx1c2hfcmVtb3RlX3RsYnMoa3ZtKTsKQEAgLTM1OTAsMjUgKzM5MDMsMTggQEAKIAogc3RhdGljIHZvaWQgbW11X2Rlc3Ryb3lfY2FjaGVzKHZvaWQpCiB7Ci0JaWYgKHB0ZV9jaGFpbl9jYWNoZSkKLQkJa21lbV9jYWNoZV9kZXN0cm95KHB0ZV9jaGFpbl9jYWNoZSk7Ci0JaWYgKHJtYXBfZGVzY19jYWNoZSkKLQkJa21lbV9jYWNoZV9kZXN0cm95KHJtYXBfZGVzY19jYWNoZSk7CisJaWYgKHB0ZV9saXN0X2Rlc2NfY2FjaGUpCisJCWttZW1fY2FjaGVfZGVzdHJveShwdGVfbGlzdF9kZXNjX2NhY2hlKTsKIAlpZiAobW11X3BhZ2VfaGVhZGVyX2NhY2hlKQogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kobW11X3BhZ2VfaGVhZGVyX2NhY2hlKTsKIH0KIAogaW50IGt2bV9tbXVfbW9kdWxlX2luaXQodm9pZCkKIHsKLQlwdGVfY2hhaW5fY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgia3ZtX3B0ZV9jaGFpbiIsCi0JCQkJCSAgICBzaXplb2Yoc3RydWN0IGt2bV9wdGVfY2hhaW4pLAorCXB0ZV9saXN0X2Rlc2NfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicHRlX2xpc3RfZGVzYyIsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHB0ZV9saXN0X2Rlc2MpLAogCQkJCQkgICAgMCwgMCwgTlVMTCk7Ci0JaWYgKCFwdGVfY2hhaW5fY2FjaGUpCi0JCWdvdG8gbm9tZW07Ci0Jcm1hcF9kZXNjX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImt2bV9ybWFwX2Rlc2MiLAotCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBrdm1fcm1hcF9kZXNjKSwKLQkJCQkJICAgIDAsIDAsIE5VTEwpOwotCWlmICghcm1hcF9kZXNjX2NhY2hlKQorCWlmICghcHRlX2xpc3RfZGVzY19jYWNoZSkKIAkJZ290byBub21lbTsKIAogCW1tdV9wYWdlX2hlYWRlcl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJrdm1fbW11X3BhZ2VfaGVhZGVyIiwKQEAgLTM3NzUsMTYgKzQwODEsMTcgQEAKIGludCBrdm1fbW11X2dldF9zcHRlX2hpZXJhcmNoeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBhZGRyLCB1NjQgc3B0ZXNbNF0pCiB7CiAJc3RydWN0IGt2bV9zaGFkb3dfd2Fsa19pdGVyYXRvciBpdGVyYXRvcjsKKwl1NjQgc3B0ZTsKIAlpbnQgbnJfc3B0ZXMgPSAwOwogCi0Jc3Bpbl9sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKLQlmb3JfZWFjaF9zaGFkb3dfZW50cnkodmNwdSwgYWRkciwgaXRlcmF0b3IpIHsKLQkJc3B0ZXNbaXRlcmF0b3IubGV2ZWwtMV0gPSAqaXRlcmF0b3Iuc3B0ZXA7CisJd2Fsa19zaGFkb3dfcGFnZV9sb2NrbGVzc19iZWdpbih2Y3B1KTsKKwlmb3JfZWFjaF9zaGFkb3dfZW50cnlfbG9ja2xlc3ModmNwdSwgYWRkciwgaXRlcmF0b3IsIHNwdGUpIHsKKwkJc3B0ZXNbaXRlcmF0b3IubGV2ZWwtMV0gPSBzcHRlOwogCQlucl9zcHRlcysrOwotCQlpZiAoIWlzX3NoYWRvd19wcmVzZW50X3B0ZSgqaXRlcmF0b3Iuc3B0ZXApKQorCQlpZiAoIWlzX3NoYWRvd19wcmVzZW50X3B0ZShzcHRlKSkKIAkJCWJyZWFrOwogCX0KLQlzcGluX3VubG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CisJd2Fsa19zaGFkb3dfcGFnZV9sb2NrbGVzc19lbmQodmNwdSk7CiAKIAlyZXR1cm4gbnJfc3B0ZXM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vbW11LmggYi9hcmNoL3g4Ni9rdm0vbW11LmgKaW5kZXggNzA4NmNhOC4uZTM3NGRiOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL21tdS5oCisrKyBiL2FyY2gveDg2L2t2bS9tbXUuaApAQCAtNDksNiArNDksOCBAQAogI2RlZmluZSBQRkVSUl9GRVRDSF9NQVNLICgxVSA8PCA0KQogCiBpbnQga3ZtX21tdV9nZXRfc3B0ZV9oaWVyYXJjaHkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYWRkciwgdTY0IHNwdGVzWzRdKTsKK3ZvaWQga3ZtX21tdV9zZXRfbW1pb19zcHRlX21hc2sodTY0IG1taW9fbWFzayk7CitpbnQgaGFuZGxlX21taW9fcGFnZV9mYXVsdF9jb21tb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgYWRkciwgYm9vbCBkaXJlY3QpOwogaW50IGt2bV9pbml0X3NoYWRvd19tbXUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdSAqY29udGV4dCk7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGt2bV9tbXVfYXZhaWxhYmxlX3BhZ2VzKHN0cnVjdCBrdm0gKmt2bSkKQEAgLTc2LDQgKzc4LDI3IEBACiAJcmV0dXJuIHB0ZSAmIFBUX1BSRVNFTlRfTUFTSzsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXNfd3JpdGFibGVfcHRlKHVuc2lnbmVkIGxvbmcgcHRlKQoreworCXJldHVybiBwdGUgJiBQVF9XUklUQUJMRV9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfd3JpdGVfcHJvdGVjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIGt2bV9yZWFkX2NyMF9iaXRzKHZjcHUsIFg4Nl9DUjBfV1ApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgY2hlY2tfd3JpdGVfdXNlcl9hY2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCQkgICBib29sIHdyaXRlX2ZhdWx0LCBib29sIHVzZXJfZmF1bHQsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgcHRlKQoreworCWlmICh1bmxpa2VseSh3cml0ZV9mYXVsdCAmJiAhaXNfd3JpdGFibGVfcHRlKHB0ZSkKKwkgICAgICAmJiAodXNlcl9mYXVsdCB8fCBpc193cml0ZV9wcm90ZWN0aW9uKHZjcHUpKSkpCisJCXJldHVybiBmYWxzZTsKKworCWlmICh1bmxpa2VseSh1c2VyX2ZhdWx0ICYmICEocHRlICYgUFRfVVNFUl9NQVNLKSkpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vbW11X2F1ZGl0LmMgYi9hcmNoL3g4Ni9rdm0vbW11X2F1ZGl0LmMKaW5kZXggNWY2MjIzYi4uMjQ2MGEyNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL21tdV9hdWRpdC5jCisrKyBiL2FyY2gveDg2L2t2bS9tbXVfYXVkaXQuYwpAQCAtOTksMTggKzk5LDYgQEAKIAkJCQkgICAgICJsZXZlbCA9ICVkXG4iLCBzcCwgbGV2ZWwpOwogCQkJcmV0dXJuOwogCQl9Ci0KLQkJaWYgKCpzcHRlcCA9PSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlKSB7Ci0JCQlhdWRpdF9wcmludGsodmNwdS0+a3ZtLCAibm90cmFwIHNwdGUgaW4gdW5zeW5jICIKLQkJCQkgICAgICJzcDogJXBcbiIsIHNwKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWlmIChzcC0+cm9sZS5kaXJlY3QgJiYgKnNwdGVwID09IHNoYWRvd19ub3RyYXBfbm9ucHJlc2VudF9wdGUpIHsKLQkJYXVkaXRfcHJpbnRrKHZjcHUtPmt2bSwgIm5vdHJhcCBzcHRlIGluIGRpcmVjdCBzcDogJXBcbiIsCi0JCQkgICAgIHNwKTsKLQkJcmV0dXJuOwogCX0KIAogCWlmICghaXNfc2hhZG93X3ByZXNlbnRfcHRlKCpzcHRlcCkgfHwgIWlzX2xhc3Rfc3B0ZSgqc3B0ZXAsIGxldmVsKSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9tbXV0cmFjZS5oIGIvYXJjaC94ODYva3ZtL21tdXRyYWNlLmgKaW5kZXggYjYwYjRmZC4uZWVkNjdmMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL21tdXRyYWNlLmgKKysrIGIvYXJjaC94ODYva3ZtL21tdXRyYWNlLmgKQEAgLTE5Niw2ICsxOTYsNTQgQEAKIAlUUF9BUkdTKHNwKQogKTsKIAorREVGSU5FX0VWRU5UKGt2bV9tbXVfcGFnZV9jbGFzcywga3ZtX21tdV9kZWxheV9mcmVlX3BhZ2VzLAorCVRQX1BST1RPKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKSwKKworCVRQX0FSR1Moc3ApCispOworCitUUkFDRV9FVkVOVCgKKwltYXJrX21taW9fc3B0ZSwKKwlUUF9QUk9UTyh1NjQgKnNwdGVwLCBnZm5fdCBnZm4sIHVuc2lnbmVkIGFjY2VzcyksCisJVFBfQVJHUyhzcHRlcCwgZ2ZuLCBhY2Nlc3MpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCh2b2lkICosIHNwdGVwKQorCQlfX2ZpZWxkKGdmbl90LCBnZm4pCisJCV9fZmllbGQodW5zaWduZWQsIGFjY2VzcykKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnNwdGVwID0gc3B0ZXA7CisJCV9fZW50cnktPmdmbiA9IGdmbjsKKwkJX19lbnRyeS0+YWNjZXNzID0gYWNjZXNzOworCSksCisKKwlUUF9wcmludGsoInNwdGVwOiVwIGdmbiAlbGx4IGFjY2VzcyAleCIsIF9fZW50cnktPnNwdGVwLCBfX2VudHJ5LT5nZm4sCisJCSAgX19lbnRyeS0+YWNjZXNzKQorKTsKKworVFJBQ0VfRVZFTlQoCisJaGFuZGxlX21taW9fcGFnZV9mYXVsdCwKKwlUUF9QUk9UTyh1NjQgYWRkciwgZ2ZuX3QgZ2ZuLCB1bnNpZ25lZCBhY2Nlc3MpLAorCVRQX0FSR1MoYWRkciwgZ2ZuLCBhY2Nlc3MpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCh1NjQsIGFkZHIpCisJCV9fZmllbGQoZ2ZuX3QsIGdmbikKKwkJX19maWVsZCh1bnNpZ25lZCwgYWNjZXNzKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+YWRkciA9IGFkZHI7CisJCV9fZW50cnktPmdmbiA9IGdmbjsKKwkJX19lbnRyeS0+YWNjZXNzID0gYWNjZXNzOworCSksCisKKwlUUF9wcmludGsoImFkZHI6JWxseCBnZm4gJWxseCBhY2Nlc3MgJXgiLCBfX2VudHJ5LT5hZGRyLCBfX2VudHJ5LT5nZm4sCisJCSAgX19lbnRyeS0+YWNjZXNzKQorKTsKKwogVFJBQ0VfRVZFTlQoCiAJa3ZtX21tdV9hdWRpdCwKIAlUUF9QUk9UTyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBhdWRpdF9wb2ludCksCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vcGFnaW5nX3RtcGwuaCBiL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oCmluZGV4IDZjNGRjMDEuLjUwN2UyYjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oCisrKyBiL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oCkBAIC0xMDEsMTEgKzEwMSwxNSBAQAogCXJldHVybiAocmV0ICE9IG9yaWdfcHRlKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIEZOQU1FKGdwdGVfYWNjZXNzKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHB0X2VsZW1lbnRfdCBncHRlKQorc3RhdGljIHVuc2lnbmVkIEZOQU1FKGdwdGVfYWNjZXNzKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHB0X2VsZW1lbnRfdCBncHRlLAorCQkJCSAgIGJvb2wgbGFzdCkKIHsKIAl1bnNpZ25lZCBhY2Nlc3M7CiAKIAlhY2Nlc3MgPSAoZ3B0ZSAmIChQVF9XUklUQUJMRV9NQVNLIHwgUFRfVVNFUl9NQVNLKSkgfCBBQ0NfRVhFQ19NQVNLOworCWlmIChsYXN0ICYmICFpc19kaXJ0eV9ncHRlKGdwdGUpKQorCQlhY2Nlc3MgJj0gfkFDQ19XUklURV9NQVNLOworCiAjaWYgUFRUWVBFID09IDY0CiAJaWYgKHZjcHUtPmFyY2gubW11Lm54KQogCQlhY2Nlc3MgJj0gfihncHRlID4+IFBUNjRfTlhfU0hJRlQpOwpAQCAtMTEzLDYgKzExNywyNCBAQAogCXJldHVybiBhY2Nlc3M7CiB9CiAKK3N0YXRpYyBib29sIEZOQU1FKGlzX2xhc3RfZ3B0ZSkoc3RydWN0IGd1ZXN0X3dhbGtlciAqd2Fsa2VyLAorCQkJCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9tbXUgKm1tdSwKKwkJCQlwdF9lbGVtZW50X3QgZ3B0ZSkKK3sKKwlpZiAod2Fsa2VyLT5sZXZlbCA9PSBQVF9QQUdFX1RBQkxFX0xFVkVMKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmICgod2Fsa2VyLT5sZXZlbCA9PSBQVF9ESVJFQ1RPUllfTEVWRUwpICYmIGlzX2xhcmdlX3B0ZShncHRlKSAmJgorCSAgICAoUFRUWVBFID09IDY0IHx8IGlzX3BzZSh2Y3B1KSkpCisJCXJldHVybiB0cnVlOworCisJaWYgKCh3YWxrZXItPmxldmVsID09IFBUX1BEUEVfTEVWRUwpICYmIGlzX2xhcmdlX3B0ZShncHRlKSAmJgorCSAgICAobW11LT5yb290X2xldmVsID09IFBUNjRfUk9PVF9MRVZFTCkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiAvKgogICogRmV0Y2ggYSBndWVzdCBwdGUgZm9yIGEgZ3Vlc3QgdmlydHVhbCBhZGRyZXNzCiAgKi8KQEAgLTEyMSwyMiArMTQzLDIxIEBACiAJCQkJICAgIGd2YV90IGFkZHIsIHUzMiBhY2Nlc3MpCiB7CiAJcHRfZWxlbWVudF90IHB0ZTsKLQlwdF9lbGVtZW50X3QgX191c2VyICpwdGVwX3VzZXI7CisJcHRfZWxlbWVudF90IF9fdXNlciAqdW5pbml0aWFsaXplZF92YXIocHRlcF91c2VyKTsKIAlnZm5fdCB0YWJsZV9nZm47CiAJdW5zaWduZWQgaW5kZXgsIHB0X2FjY2VzcywgdW5pbml0aWFsaXplZF92YXIocHRlX2FjY2Vzcyk7CiAJZ3BhX3QgcHRlX2dwYTsKLQlib29sIGVwZXJtLCBwcmVzZW50LCByc3ZkX2ZhdWx0OwotCWludCBvZmZzZXQsIHdyaXRlX2ZhdWx0LCB1c2VyX2ZhdWx0LCBmZXRjaF9mYXVsdDsKLQotCXdyaXRlX2ZhdWx0ID0gYWNjZXNzICYgUEZFUlJfV1JJVEVfTUFTSzsKLQl1c2VyX2ZhdWx0ID0gYWNjZXNzICYgUEZFUlJfVVNFUl9NQVNLOwotCWZldGNoX2ZhdWx0ID0gYWNjZXNzICYgUEZFUlJfRkVUQ0hfTUFTSzsKKwlib29sIGVwZXJtOworCWludCBvZmZzZXQ7CisJY29uc3QgaW50IHdyaXRlX2ZhdWx0ID0gYWNjZXNzICYgUEZFUlJfV1JJVEVfTUFTSzsKKwljb25zdCBpbnQgdXNlcl9mYXVsdCAgPSBhY2Nlc3MgJiBQRkVSUl9VU0VSX01BU0s7CisJY29uc3QgaW50IGZldGNoX2ZhdWx0ID0gYWNjZXNzICYgUEZFUlJfRkVUQ0hfTUFTSzsKKwl1MTYgZXJyY29kZSA9IDA7CiAKIAl0cmFjZV9rdm1fbW11X3BhZ2V0YWJsZV93YWxrKGFkZHIsIHdyaXRlX2ZhdWx0LCB1c2VyX2ZhdWx0LAogCQkJCSAgICAgZmV0Y2hfZmF1bHQpOwotd2FsazoKLQlwcmVzZW50ID0gdHJ1ZTsKLQllcGVybSA9IHJzdmRfZmF1bHQgPSBmYWxzZTsKK3JldHJ5X3dhbGs6CisJZXBlcm0gPSBmYWxzZTsKIAl3YWxrZXItPmxldmVsID0gbW11LT5yb290X2xldmVsOwogCXB0ZSAgICAgICAgICAgPSBtbXUtPmdldF9jcjModmNwdSk7CiAKQEAgLTE0NCwxMCArMTY1LDggQEAKIAlpZiAod2Fsa2VyLT5sZXZlbCA9PSBQVDMyRV9ST09UX0xFVkVMKSB7CiAJCXB0ZSA9IGt2bV9wZHB0cl9yZWFkX21tdSh2Y3B1LCBtbXUsIChhZGRyID4+IDMwKSAmIDMpOwogCQl0cmFjZV9rdm1fbW11X3BhZ2luZ19lbGVtZW50KHB0ZSwgd2Fsa2VyLT5sZXZlbCk7Ci0JCWlmICghaXNfcHJlc2VudF9ncHRlKHB0ZSkpIHsKLQkJCXByZXNlbnQgPSBmYWxzZTsKKwkJaWYgKCFpc19wcmVzZW50X2dwdGUocHRlKSkKIAkJCWdvdG8gZXJyb3I7Ci0JCX0KIAkJLS13YWxrZXItPmxldmVsOwogCX0KICNlbmRpZgpAQCAtMTcwLDQyICsxODksMzEgQEAKIAogCQlyZWFsX2dmbiA9IG1tdS0+dHJhbnNsYXRlX2dwYSh2Y3B1LCBnZm5fdG9fZ3BhKHRhYmxlX2dmbiksCiAJCQkJCSAgICAgIFBGRVJSX1VTRVJfTUFTS3xQRkVSUl9XUklURV9NQVNLKTsKLQkJaWYgKHVubGlrZWx5KHJlYWxfZ2ZuID09IFVOTUFQUEVEX0dWQSkpIHsKLQkJCXByZXNlbnQgPSBmYWxzZTsKLQkJCWJyZWFrOwotCQl9CisJCWlmICh1bmxpa2VseShyZWFsX2dmbiA9PSBVTk1BUFBFRF9HVkEpKQorCQkJZ290byBlcnJvcjsKIAkJcmVhbF9nZm4gPSBncGFfdG9fZ2ZuKHJlYWxfZ2ZuKTsKIAogCQlob3N0X2FkZHIgPSBnZm5fdG9faHZhKHZjcHUtPmt2bSwgcmVhbF9nZm4pOwotCQlpZiAodW5saWtlbHkoa3ZtX2lzX2Vycm9yX2h2YShob3N0X2FkZHIpKSkgewotCQkJcHJlc2VudCA9IGZhbHNlOwotCQkJYnJlYWs7Ci0JCX0KKwkJaWYgKHVubGlrZWx5KGt2bV9pc19lcnJvcl9odmEoaG9zdF9hZGRyKSkpCisJCQlnb3RvIGVycm9yOwogCiAJCXB0ZXBfdXNlciA9IChwdF9lbGVtZW50X3QgX191c2VyICopKCh2b2lkICopaG9zdF9hZGRyICsgb2Zmc2V0KTsKLQkJaWYgKHVubGlrZWx5KF9fY29weV9mcm9tX3VzZXIoJnB0ZSwgcHRlcF91c2VyLCBzaXplb2YocHRlKSkpKSB7Ci0JCQlwcmVzZW50ID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJfQorCQlpZiAodW5saWtlbHkoX19jb3B5X2Zyb21fdXNlcigmcHRlLCBwdGVwX3VzZXIsIHNpemVvZihwdGUpKSkpCisJCQlnb3RvIGVycm9yOwogCiAJCXRyYWNlX2t2bV9tbXVfcGFnaW5nX2VsZW1lbnQocHRlLCB3YWxrZXItPmxldmVsKTsKIAotCQlpZiAodW5saWtlbHkoIWlzX3ByZXNlbnRfZ3B0ZShwdGUpKSkgewotCQkJcHJlc2VudCA9IGZhbHNlOwotCQkJYnJlYWs7Ci0JCX0KKwkJaWYgKHVubGlrZWx5KCFpc19wcmVzZW50X2dwdGUocHRlKSkpCisJCQlnb3RvIGVycm9yOwogCiAJCWlmICh1bmxpa2VseShpc19yc3ZkX2JpdHNfc2V0KCZ2Y3B1LT5hcmNoLm1tdSwgcHRlLAogCQkJCQkgICAgICB3YWxrZXItPmxldmVsKSkpIHsKLQkJCXJzdmRfZmF1bHQgPSB0cnVlOwotCQkJYnJlYWs7CisJCQllcnJjb2RlIHw9IFBGRVJSX1JTVkRfTUFTSyB8IFBGRVJSX1BSRVNFTlRfTUFTSzsKKwkJCWdvdG8gZXJyb3I7CiAJCX0KIAotCQlpZiAodW5saWtlbHkod3JpdGVfZmF1bHQgJiYgIWlzX3dyaXRhYmxlX3B0ZShwdGUpCi0JCQkgICAgICYmICh1c2VyX2ZhdWx0IHx8IGlzX3dyaXRlX3Byb3RlY3Rpb24odmNwdSkpKSkKLQkJCWVwZXJtID0gdHJ1ZTsKLQotCQlpZiAodW5saWtlbHkodXNlcl9mYXVsdCAmJiAhKHB0ZSAmIFBUX1VTRVJfTUFTSykpKQorCQlpZiAoIWNoZWNrX3dyaXRlX3VzZXJfYWNjZXNzKHZjcHUsIHdyaXRlX2ZhdWx0LCB1c2VyX2ZhdWx0LAorCQkJCQkgIHB0ZSkpCiAJCQllcGVybSA9IHRydWU7CiAKICNpZiBQVFRZUEUgPT0gNjQKQEAgLTIxMywzOSArMjIxLDM1IEBACiAJCQllcGVybSA9IHRydWU7CiAjZW5kaWYKIAotCQlpZiAoIWVwZXJtICYmICFyc3ZkX2ZhdWx0Ci0JCSAgICAmJiB1bmxpa2VseSghKHB0ZSAmIFBUX0FDQ0VTU0VEX01BU0spKSkgeworCQlpZiAoIWVwZXJtICYmIHVubGlrZWx5KCEocHRlICYgUFRfQUNDRVNTRURfTUFTSykpKSB7CiAJCQlpbnQgcmV0OwogCQkJdHJhY2Vfa3ZtX21tdV9zZXRfYWNjZXNzZWRfYml0KHRhYmxlX2dmbiwgaW5kZXgsCiAJCQkJCQkgICAgICAgc2l6ZW9mKHB0ZSkpOwogCQkJcmV0ID0gRk5BTUUoY21weGNoZ19ncHRlKSh2Y3B1LCBtbXUsIHB0ZXBfdXNlciwgaW5kZXgsCiAJCQkJCQkgIHB0ZSwgcHRlfFBUX0FDQ0VTU0VEX01BU0spOwotCQkJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7Ci0JCQkJcHJlc2VudCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChyZXQpCi0JCQkJZ290byB3YWxrOworCQkJaWYgKHVubGlrZWx5KHJldCA8IDApKQorCQkJCWdvdG8gZXJyb3I7CisJCQllbHNlIGlmIChyZXQpCisJCQkJZ290byByZXRyeV93YWxrOwogCiAJCQltYXJrX3BhZ2VfZGlydHkodmNwdS0+a3ZtLCB0YWJsZV9nZm4pOwogCQkJcHRlIHw9IFBUX0FDQ0VTU0VEX01BU0s7CiAJCX0KIAotCQlwdGVfYWNjZXNzID0gcHRfYWNjZXNzICYgRk5BTUUoZ3B0ZV9hY2Nlc3MpKHZjcHUsIHB0ZSk7Ci0KIAkJd2Fsa2VyLT5wdGVzW3dhbGtlci0+bGV2ZWwgLSAxXSA9IHB0ZTsKIAotCQlpZiAoKHdhbGtlci0+bGV2ZWwgPT0gUFRfUEFHRV9UQUJMRV9MRVZFTCkgfHwKLQkJICAgICgod2Fsa2VyLT5sZXZlbCA9PSBQVF9ESVJFQ1RPUllfTEVWRUwpICYmCi0JCQkJaXNfbGFyZ2VfcHRlKHB0ZSkgJiYKLQkJCQkoUFRUWVBFID09IDY0IHx8IGlzX3BzZSh2Y3B1KSkpIHx8Ci0JCSAgICAoKHdhbGtlci0+bGV2ZWwgPT0gUFRfUERQRV9MRVZFTCkgJiYKLQkJCQlpc19sYXJnZV9wdGUocHRlKSAmJgotCQkJCW1tdS0+cm9vdF9sZXZlbCA9PSBQVDY0X1JPT1RfTEVWRUwpKSB7CisJCWlmIChGTkFNRShpc19sYXN0X2dwdGUpKHdhbGtlciwgdmNwdSwgbW11LCBwdGUpKSB7CiAJCQlpbnQgbHZsID0gd2Fsa2VyLT5sZXZlbDsKIAkJCWdwYV90IHJlYWxfZ3BhOwogCQkJZ2ZuX3QgZ2ZuOwogCQkJdTMyIGFjOwogCisJCQkvKiBjaGVjayBpZiB0aGUga2VybmVsIGlzIGZldGNoaW5nIGZyb20gdXNlciBwYWdlICovCisJCQlpZiAodW5saWtlbHkocHRlX2FjY2VzcyAmIFBUX1VTRVJfTUFTSykgJiYKKwkJCSAgICBrdm1fcmVhZF9jcjRfYml0cyh2Y3B1LCBYODZfQ1I0X1NNRVApKQorCQkJCWlmIChmZXRjaF9mYXVsdCAmJiAhdXNlcl9mYXVsdCkKKwkJCQkJZXBlcm0gPSB0cnVlOworCiAJCQlnZm4gPSBncHRlX3RvX2dmbl9sdmwocHRlLCBsdmwpOwogCQkJZ2ZuICs9IChhZGRyICYgUFRfTFZMX09GRlNFVF9NQVNLKGx2bCkpID4+IFBBR0VfU0hJRlQ7CiAKQEAgLTI2NiwxMiArMjcwLDE0IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXB0X2FjY2VzcyA9IHB0ZV9hY2Nlc3M7CisJCXB0X2FjY2VzcyAmPSBGTkFNRShncHRlX2FjY2VzcykodmNwdSwgcHRlLCBmYWxzZSk7CiAJCS0td2Fsa2VyLT5sZXZlbDsKIAl9CiAKLQlpZiAodW5saWtlbHkoIXByZXNlbnQgfHwgZXBlcm0gfHwgcnN2ZF9mYXVsdCkpCisJaWYgKHVubGlrZWx5KGVwZXJtKSkgeworCQllcnJjb2RlIHw9IFBGRVJSX1BSRVNFTlRfTUFTSzsKIAkJZ290byBlcnJvcjsKKwl9CiAKIAlpZiAod3JpdGVfZmF1bHQgJiYgdW5saWtlbHkoIWlzX2RpcnR5X2dwdGUocHRlKSkpIHsKIAkJaW50IHJldDsKQEAgLTI3OSwxNyArMjg1LDE3IEBACiAJCXRyYWNlX2t2bV9tbXVfc2V0X2RpcnR5X2JpdCh0YWJsZV9nZm4sIGluZGV4LCBzaXplb2YocHRlKSk7CiAJCXJldCA9IEZOQU1FKGNtcHhjaGdfZ3B0ZSkodmNwdSwgbW11LCBwdGVwX3VzZXIsIGluZGV4LAogCQkJCQkgIHB0ZSwgcHRlfFBUX0RJUlRZX01BU0spOwotCQlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKLQkJCXByZXNlbnQgPSBmYWxzZTsKKwkJaWYgKHVubGlrZWx5KHJldCA8IDApKQogCQkJZ290byBlcnJvcjsKLQkJfSBlbHNlIGlmIChyZXQpCi0JCQlnb3RvIHdhbGs7CisJCWVsc2UgaWYgKHJldCkKKwkJCWdvdG8gcmV0cnlfd2FsazsKIAogCQltYXJrX3BhZ2VfZGlydHkodmNwdS0+a3ZtLCB0YWJsZV9nZm4pOwogCQlwdGUgfD0gUFRfRElSVFlfTUFTSzsKIAkJd2Fsa2VyLT5wdGVzW3dhbGtlci0+bGV2ZWwgLSAxXSA9IHB0ZTsKIAl9CiAKKwlwdGVfYWNjZXNzID0gcHRfYWNjZXNzICYgRk5BTUUoZ3B0ZV9hY2Nlc3MpKHZjcHUsIHB0ZSwgdHJ1ZSk7CiAJd2Fsa2VyLT5wdF9hY2Nlc3MgPSBwdF9hY2Nlc3M7CiAJd2Fsa2VyLT5wdGVfYWNjZXNzID0gcHRlX2FjY2VzczsKIAlwZ3ByaW50aygiJXM6IHB0ZSAlbGx4IHB0ZV9hY2Nlc3MgJXggcHRfYWNjZXNzICV4XG4iLApAQCAtMjk3LDE5ICszMDMsMTQgQEAKIAlyZXR1cm4gMTsKIAogZXJyb3I6CisJZXJyY29kZSB8PSB3cml0ZV9mYXVsdCB8IHVzZXJfZmF1bHQ7CisJaWYgKGZldGNoX2ZhdWx0ICYmIChtbXUtPm54IHx8CisJCQkgICAga3ZtX3JlYWRfY3I0X2JpdHModmNwdSwgWDg2X0NSNF9TTUVQKSkpCisJCWVycmNvZGUgfD0gUEZFUlJfRkVUQ0hfTUFTSzsKKwogCXdhbGtlci0+ZmF1bHQudmVjdG9yID0gUEZfVkVDVE9SOwogCXdhbGtlci0+ZmF1bHQuZXJyb3JfY29kZV92YWxpZCA9IHRydWU7Ci0Jd2Fsa2VyLT5mYXVsdC5lcnJvcl9jb2RlID0gMDsKLQlpZiAocHJlc2VudCkKLQkJd2Fsa2VyLT5mYXVsdC5lcnJvcl9jb2RlIHw9IFBGRVJSX1BSRVNFTlRfTUFTSzsKLQotCXdhbGtlci0+ZmF1bHQuZXJyb3JfY29kZSB8PSB3cml0ZV9mYXVsdCB8IHVzZXJfZmF1bHQ7Ci0KLQlpZiAoZmV0Y2hfZmF1bHQgJiYgbW11LT5ueCkKLQkJd2Fsa2VyLT5mYXVsdC5lcnJvcl9jb2RlIHw9IFBGRVJSX0ZFVENIX01BU0s7Ci0JaWYgKHJzdmRfZmF1bHQpCi0JCXdhbGtlci0+ZmF1bHQuZXJyb3JfY29kZSB8PSBQRkVSUl9SU1ZEX01BU0s7Ci0KKwl3YWxrZXItPmZhdWx0LmVycm9yX2NvZGUgPSBlcnJjb2RlOwogCXdhbGtlci0+ZmF1bHQuYWRkcmVzcyA9IGFkZHI7CiAJd2Fsa2VyLT5mYXVsdC5uZXN0ZWRfcGFnZV9mYXVsdCA9IG1tdSAhPSB2Y3B1LT5hcmNoLndhbGtfbW11OwogCkBAIC0zMzYsMTYgKzMzNywxMSBAQAogCQkJCSAgICBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwgdTY0ICpzcHRlLAogCQkJCSAgICBwdF9lbGVtZW50X3QgZ3B0ZSkKIHsKLQl1NjQgbm9ucHJlc2VudCA9IHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlOwotCiAJaWYgKGlzX3JzdmRfYml0c19zZXQoJnZjcHUtPmFyY2gubW11LCBncHRlLCBQVF9QQUdFX1RBQkxFX0xFVkVMKSkKIAkJZ290byBub19wcmVzZW50OwogCi0JaWYgKCFpc19wcmVzZW50X2dwdGUoZ3B0ZSkpIHsKLQkJaWYgKCFzcC0+dW5zeW5jKQotCQkJbm9ucHJlc2VudCA9IHNoYWRvd19ub3RyYXBfbm9ucHJlc2VudF9wdGU7CisJaWYgKCFpc19wcmVzZW50X2dwdGUoZ3B0ZSkpCiAJCWdvdG8gbm9fcHJlc2VudDsKLQl9CiAKIAlpZiAoIShncHRlICYgUFRfQUNDRVNTRURfTUFTSykpCiAJCWdvdG8gbm9fcHJlc2VudDsKQEAgLTM1Myw3ICszNDksNyBAQAogCXJldHVybiBmYWxzZTsKIAogbm9fcHJlc2VudDoKLQlkcm9wX3NwdGUodmNwdS0+a3ZtLCBzcHRlLCBub25wcmVzZW50KTsKKwlkcm9wX3NwdGUodmNwdS0+a3ZtLCBzcHRlKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMzY5LDkgKzM2NSw5IEBACiAJCXJldHVybjsKIAogCXBncHJpbnRrKCIlczogZ3B0ZSAlbGx4IHNwdGUgJXBcbiIsIF9fZnVuY19fLCAodTY0KWdwdGUsIHNwdGUpOwotCXB0ZV9hY2Nlc3MgPSBzcC0+cm9sZS5hY2Nlc3MgJiBGTkFNRShncHRlX2FjY2VzcykodmNwdSwgZ3B0ZSk7CisJcHRlX2FjY2VzcyA9IHNwLT5yb2xlLmFjY2VzcyAmIEZOQU1FKGdwdGVfYWNjZXNzKSh2Y3B1LCBncHRlLCB0cnVlKTsKIAlwZm4gPSBnZm5fdG9fcGZuX2F0b21pYyh2Y3B1LT5rdm0sIGdwdGVfdG9fZ2ZuKGdwdGUpKTsKLQlpZiAoaXNfZXJyb3JfcGZuKHBmbikpIHsKKwlpZiAobW11X2ludmFsaWRfcGZuKHBmbikpIHsKIAkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7CiAJCXJldHVybjsKIAl9CkBAIC0zODEsNyArMzc3LDcgQEAKIAkgKiB2Y3B1LT5hcmNoLnVwZGF0ZV9wdGUucGZuIHdhcyBmZXRjaGVkIGZyb20gZ2V0X3VzZXJfcGFnZXMod3JpdGUgPSAxKS4KIAkgKi8KIAltbXVfc2V0X3NwdGUodmNwdSwgc3B0ZSwgc3AtPnJvbGUuYWNjZXNzLCBwdGVfYWNjZXNzLCAwLCAwLAotCQkgICAgIGlzX2RpcnR5X2dwdGUoZ3B0ZSksIE5VTEwsIFBUX1BBR0VfVEFCTEVfTEVWRUwsCisJCSAgICAgTlVMTCwgUFRfUEFHRV9UQUJMRV9MRVZFTCwKIAkJICAgICBncHRlX3RvX2dmbihncHRlKSwgcGZuLCB0cnVlLCB0cnVlKTsKIH0KIApAQCAtNDMyLDEyICs0MjgsMTEgQEAKIAkJdW5zaWduZWQgcHRlX2FjY2VzczsKIAkJZ2ZuX3QgZ2ZuOwogCQlwZm5fdCBwZm47Ci0JCWJvb2wgZGlydHk7CiAKIAkJaWYgKHNwdGUgPT0gc3B0ZXApCiAJCQljb250aW51ZTsKIAotCQlpZiAoKnNwdGUgIT0gc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpCisJCWlmIChpc19zaGFkb3dfcHJlc2VudF9wdGUoKnNwdGUpKQogCQkJY29udGludWU7CiAKIAkJZ3B0ZSA9IGdwdGVwW2ldOwpAQCAtNDQ1LDE4ICs0NDAsMTggQEAKIAkJaWYgKEZOQU1FKHByZWZldGNoX2ludmFsaWRfZ3B0ZSkodmNwdSwgc3AsIHNwdGUsIGdwdGUpKQogCQkJY29udGludWU7CiAKLQkJcHRlX2FjY2VzcyA9IHNwLT5yb2xlLmFjY2VzcyAmIEZOQU1FKGdwdGVfYWNjZXNzKSh2Y3B1LCBncHRlKTsKKwkJcHRlX2FjY2VzcyA9IHNwLT5yb2xlLmFjY2VzcyAmIEZOQU1FKGdwdGVfYWNjZXNzKSh2Y3B1LCBncHRlLAorCQkJCQkJCQkgIHRydWUpOwogCQlnZm4gPSBncHRlX3RvX2dmbihncHRlKTsKLQkJZGlydHkgPSBpc19kaXJ0eV9ncHRlKGdwdGUpOwogCQlwZm4gPSBwdGVfcHJlZmV0Y2hfZ2ZuX3RvX3Bmbih2Y3B1LCBnZm4sCi0JCQkJICAgICAgKHB0ZV9hY2Nlc3MgJiBBQ0NfV1JJVEVfTUFTSykgJiYgZGlydHkpOwotCQlpZiAoaXNfZXJyb3JfcGZuKHBmbikpIHsKKwkJCQkgICAgICBwdGVfYWNjZXNzICYgQUNDX1dSSVRFX01BU0spOworCQlpZiAobW11X2ludmFsaWRfcGZuKHBmbikpIHsKIAkJCWt2bV9yZWxlYXNlX3Bmbl9jbGVhbihwZm4pOwogCQkJYnJlYWs7CiAJCX0KIAogCQltbXVfc2V0X3NwdGUodmNwdSwgc3B0ZSwgc3AtPnJvbGUuYWNjZXNzLCBwdGVfYWNjZXNzLCAwLCAwLAotCQkJICAgICBkaXJ0eSwgTlVMTCwgUFRfUEFHRV9UQUJMRV9MRVZFTCwgZ2ZuLAorCQkJICAgICBOVUxMLCBQVF9QQUdFX1RBQkxFX0xFVkVMLCBnZm4sCiAJCQkgICAgIHBmbiwgdHJ1ZSwgdHJ1ZSk7CiAJfQogfQpAQCAtNDY3LDEyICs0NjIsMTEgQEAKIHN0YXRpYyB1NjQgKkZOQU1FKGZldGNoKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGFkZHIsCiAJCQkgc3RydWN0IGd1ZXN0X3dhbGtlciAqZ3csCiAJCQkgaW50IHVzZXJfZmF1bHQsIGludCB3cml0ZV9mYXVsdCwgaW50IGhsZXZlbCwKLQkJCSBpbnQgKnB0d3JpdGUsIHBmbl90IHBmbiwgYm9vbCBtYXBfd3JpdGFibGUsCisJCQkgaW50ICplbXVsYXRlLCBwZm5fdCBwZm4sIGJvb2wgbWFwX3dyaXRhYmxlLAogCQkJIGJvb2wgcHJlZmF1bHQpCiB7CiAJdW5zaWduZWQgYWNjZXNzID0gZ3ctPnB0X2FjY2VzczsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCA9IE5VTEw7Ci0JYm9vbCBkaXJ0eSA9IGlzX2RpcnR5X2dwdGUoZ3ctPnB0ZXNbZ3ctPmxldmVsIC0gMV0pOwogCWludCB0b3BfbGV2ZWw7CiAJdW5zaWduZWQgZGlyZWN0X2FjY2VzczsKIAlzdHJ1Y3Qga3ZtX3NoYWRvd193YWxrX2l0ZXJhdG9yIGl0OwpAQCAtNDgwLDkgKzQ3NCw3IEBACiAJaWYgKCFpc19wcmVzZW50X2dwdGUoZ3ctPnB0ZXNbZ3ctPmxldmVsIC0gMV0pKQogCQlyZXR1cm4gTlVMTDsKIAotCWRpcmVjdF9hY2Nlc3MgPSBndy0+cHRfYWNjZXNzICYgZ3ctPnB0ZV9hY2Nlc3M7Ci0JaWYgKCFkaXJ0eSkKLQkJZGlyZWN0X2FjY2VzcyAmPSB+QUNDX1dSSVRFX01BU0s7CisJZGlyZWN0X2FjY2VzcyA9IGd3LT5wdGVfYWNjZXNzOwogCiAJdG9wX2xldmVsID0gdmNwdS0+YXJjaC5tbXUucm9vdF9sZXZlbDsKIAlpZiAodG9wX2xldmVsID09IFBUMzJFX1JPT1RfTEVWRUwpCkBAIC01NDAsOCArNTMyLDggQEAKIAkJbGlua19zaGFkb3dfcGFnZShpdC5zcHRlcCwgc3ApOwogCX0KIAotCW1tdV9zZXRfc3B0ZSh2Y3B1LCBpdC5zcHRlcCwgYWNjZXNzLCBndy0+cHRlX2FjY2VzcyAmIGFjY2VzcywKLQkJICAgICB1c2VyX2ZhdWx0LCB3cml0ZV9mYXVsdCwgZGlydHksIHB0d3JpdGUsIGl0LmxldmVsLAorCW1tdV9zZXRfc3B0ZSh2Y3B1LCBpdC5zcHRlcCwgYWNjZXNzLCBndy0+cHRlX2FjY2VzcywKKwkJICAgICB1c2VyX2ZhdWx0LCB3cml0ZV9mYXVsdCwgZW11bGF0ZSwgaXQubGV2ZWwsCiAJCSAgICAgZ3ctPmdmbiwgcGZuLCBwcmVmYXVsdCwgbWFwX3dyaXRhYmxlKTsKIAlGTkFNRShwdGVfcHJlZmV0Y2gpKHZjcHUsIGd3LCBpdC5zcHRlcCk7CiAKQEAgLTU3NSw3ICs1NjcsNyBAQAogCWludCB1c2VyX2ZhdWx0ID0gZXJyb3JfY29kZSAmIFBGRVJSX1VTRVJfTUFTSzsKIAlzdHJ1Y3QgZ3Vlc3Rfd2Fsa2VyIHdhbGtlcjsKIAl1NjQgKnNwdGVwOwotCWludCB3cml0ZV9wdCA9IDA7CisJaW50IGVtdWxhdGUgPSAwOwogCWludCByOwogCXBmbl90IHBmbjsKIAlpbnQgbGV2ZWwgPSBQVF9QQUdFX1RBQkxFX0xFVkVMOwpAQCAtNTg1LDYgKzU3NywxMCBAQAogCiAJcGdwcmludGsoIiVzOiBhZGRyICVseCBlcnIgJXhcbiIsIF9fZnVuY19fLCBhZGRyLCBlcnJvcl9jb2RlKTsKIAorCWlmICh1bmxpa2VseShlcnJvcl9jb2RlICYgUEZFUlJfUlNWRF9NQVNLKSkKKwkJcmV0dXJuIGhhbmRsZV9tbWlvX3BhZ2VfZmF1bHQodmNwdSwgYWRkciwgZXJyb3JfY29kZSwKKwkJCQkJICAgICAgbW11X2lzX25lc3RlZCh2Y3B1KSk7CisKIAlyID0gbW11X3RvcHVwX21lbW9yeV9jYWNoZXModmNwdSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtNjIzLDkgKzYxOSw5IEBACiAJCQkgJm1hcF93cml0YWJsZSkpCiAJCXJldHVybiAwOwogCi0JLyogbW1pbyAqLwotCWlmIChpc19lcnJvcl9wZm4ocGZuKSkKLQkJcmV0dXJuIGt2bV9oYW5kbGVfYmFkX3BhZ2UodmNwdS0+a3ZtLCB3YWxrZXIuZ2ZuLCBwZm4pOworCWlmIChoYW5kbGVfYWJub3JtYWxfcGZuKHZjcHUsIG1tdV9pc19uZXN0ZWQodmNwdSkgPyAwIDogYWRkciwKKwkJCQl3YWxrZXIuZ2ZuLCBwZm4sIHdhbGtlci5wdGVfYWNjZXNzLCAmcikpCisJCXJldHVybiByOwogCiAJc3Bpbl9sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKIAlpZiAobW11X25vdGlmaWVyX3JldHJ5KHZjcHUsIG1tdV9zZXEpKQpAQCAtNjM2LDE5ICs2MzIsMTkgQEAKIAlpZiAoIWZvcmNlX3B0X2xldmVsKQogCQl0cmFuc3BhcmVudF9odWdlcGFnZV9hZGp1c3QodmNwdSwgJndhbGtlci5nZm4sICZwZm4sICZsZXZlbCk7CiAJc3B0ZXAgPSBGTkFNRShmZXRjaCkodmNwdSwgYWRkciwgJndhbGtlciwgdXNlcl9mYXVsdCwgd3JpdGVfZmF1bHQsCi0JCQkgICAgIGxldmVsLCAmd3JpdGVfcHQsIHBmbiwgbWFwX3dyaXRhYmxlLCBwcmVmYXVsdCk7CisJCQkgICAgIGxldmVsLCAmZW11bGF0ZSwgcGZuLCBtYXBfd3JpdGFibGUsIHByZWZhdWx0KTsKIAkodm9pZClzcHRlcDsKLQlwZ3ByaW50aygiJXM6IHNoYWRvdyBwdGUgJXAgJWxseCBwdHdyaXRlICVkXG4iLCBfX2Z1bmNfXywKLQkJIHNwdGVwLCAqc3B0ZXAsIHdyaXRlX3B0KTsKKwlwZ3ByaW50aygiJXM6IHNoYWRvdyBwdGUgJXAgJWxseCBlbXVsYXRlICVkXG4iLCBfX2Z1bmNfXywKKwkJIHNwdGVwLCAqc3B0ZXAsIGVtdWxhdGUpOwogCi0JaWYgKCF3cml0ZV9wdCkKKwlpZiAoIWVtdWxhdGUpCiAJCXZjcHUtPmFyY2gubGFzdF9wdF93cml0ZV9jb3VudCA9IDA7IC8qIHJlc2V0IGZvcmsgZGV0ZWN0b3IgKi8KIAogCSsrdmNwdS0+c3RhdC5wZl9maXhlZDsKIAl0cmFjZV9rdm1fbW11X2F1ZGl0KHZjcHUsIEFVRElUX1BPU1RfUEFHRV9GQVVMVCk7CiAJc3Bpbl91bmxvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOwogCi0JcmV0dXJuIHdyaXRlX3B0OworCXJldHVybiBlbXVsYXRlOwogCiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKQEAgLTY2NSw2ICs2NjEsOCBAQAogCXU2NCAqc3B0ZXA7CiAJaW50IG5lZWRfZmx1c2ggPSAwOwogCisJdmNwdV9jbGVhcl9tbWlvX2luZm8odmNwdSwgZ3ZhKTsKKwogCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CiAKIAlmb3JfZWFjaF9zaGFkb3dfZW50cnkodmNwdSwgZ3ZhLCBpdGVyYXRvcikgewpAQCAtNjg4LDExICs2ODYsMTEgQEAKIAkJCWlmIChpc19zaGFkb3dfcHJlc2VudF9wdGUoKnNwdGVwKSkgewogCQkJCWlmIChpc19sYXJnZV9wdGUoKnNwdGVwKSkKIAkJCQkJLS12Y3B1LT5rdm0tPnN0YXQubHBhZ2VzOwotCQkJCWRyb3Bfc3B0ZSh2Y3B1LT5rdm0sIHNwdGVwLAotCQkJCQkgIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKKwkJCQlkcm9wX3NwdGUodmNwdS0+a3ZtLCBzcHRlcCk7CiAJCQkJbmVlZF9mbHVzaCA9IDE7Ci0JCQl9IGVsc2UKLQkJCQlfX3NldF9zcHRlKHNwdGVwLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CisJCQl9IGVsc2UgaWYgKGlzX21taW9fc3B0ZSgqc3B0ZXApKQorCQkJCW1tdV9zcHRlX2NsZWFyX25vX3RyYWNrKHNwdGVwKTsKKwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNzUyLDM2ICs3NTAsNiBAQAogCXJldHVybiBncGE7CiB9CiAKLXN0YXRpYyB2b2lkIEZOQU1FKHByZWZldGNoX3BhZ2UpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJCQkgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCi17Ci0JaW50IGksIGosIG9mZnNldCwgcjsKLQlwdF9lbGVtZW50X3QgcHRbMjU2IC8gc2l6ZW9mKHB0X2VsZW1lbnRfdCldOwotCWdwYV90IHB0ZV9ncGE7Ci0KLQlpZiAoc3AtPnJvbGUuZGlyZWN0Ci0JICAgIHx8IChQVFRZUEUgPT0gMzIgJiYgc3AtPnJvbGUubGV2ZWwgPiBQVF9QQUdFX1RBQkxFX0xFVkVMKSkgewotCQlub25wYWdpbmdfcHJlZmV0Y2hfcGFnZSh2Y3B1LCBzcCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdGVfZ3BhID0gZ2ZuX3RvX2dwYShzcC0+Z2ZuKTsKLQlpZiAoUFRUWVBFID09IDMyKSB7Ci0JCW9mZnNldCA9IHNwLT5yb2xlLnF1YWRyYW50IDw8IFBUNjRfTEVWRUxfQklUUzsKLQkJcHRlX2dwYSArPSBvZmZzZXQgKiBzaXplb2YocHRfZWxlbWVudF90KTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUFQ2NF9FTlRfUEVSX1BBR0U7IGkgKz0gQVJSQVlfU0laRShwdCkpIHsKLQkJciA9IGt2bV9yZWFkX2d1ZXN0X2F0b21pYyh2Y3B1LT5rdm0sIHB0ZV9ncGEsIHB0LCBzaXplb2YgcHQpOwotCQlwdGVfZ3BhICs9IEFSUkFZX1NJWkUocHQpICogc2l6ZW9mKHB0X2VsZW1lbnRfdCk7Ci0JCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHB0KTsgKytqKQotCQkJaWYgKHIgfHwgaXNfcHJlc2VudF9ncHRlKHB0W2pdKSkKLQkJCQlzcC0+c3B0W2kral0gPSBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZTsKLQkJCWVsc2UKLQkJCQlzcC0+c3B0W2kral0gPSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlOwotCX0KLX0KLQogLyoKICAqIFVzaW5nIHRoZSBjYWNoZWQgaW5mb3JtYXRpb24gZnJvbSBzcC0+Z2ZucyBpcyBzYWZlIGJlY2F1c2U6CiAgKiAtIFRoZSBzcHRlIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgc3RydWN0IHBhZ2UsIHNvIHRoZSBwZm4gZm9yIGEgZ2l2ZW4gZ2ZuCkBAIC04MTcsNyArNzg1LDcgQEAKIAkJZ3BhX3QgcHRlX2dwYTsKIAkJZ2ZuX3QgZ2ZuOwogCi0JCWlmICghaXNfc2hhZG93X3ByZXNlbnRfcHRlKHNwLT5zcHRbaV0pKQorCQlpZiAoIXNwLT5zcHRbaV0pCiAJCQljb250aW51ZTsKIAogCQlwdGVfZ3BhID0gZmlyc3RfcHRlX2dwYSArIGkgKiBzaXplb2YocHRfZWxlbWVudF90KTsKQEAgLTgyNiwyNiArNzk0LDMwIEBACiAJCQkJCSAgc2l6ZW9mKHB0X2VsZW1lbnRfdCkpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJZ2ZuID0gZ3B0ZV90b19nZm4oZ3B0ZSk7Ci0KIAkJaWYgKEZOQU1FKHByZWZldGNoX2ludmFsaWRfZ3B0ZSkodmNwdSwgc3AsICZzcC0+c3B0W2ldLCBncHRlKSkgewogCQkJdmNwdS0+a3ZtLT50bGJzX2RpcnR5Kys7CiAJCQljb250aW51ZTsKIAkJfQogCisJCWdmbiA9IGdwdGVfdG9fZ2ZuKGdwdGUpOworCQlwdGVfYWNjZXNzID0gc3AtPnJvbGUuYWNjZXNzOworCQlwdGVfYWNjZXNzICY9IEZOQU1FKGdwdGVfYWNjZXNzKSh2Y3B1LCBncHRlLCB0cnVlKTsKKworCQlpZiAoc3luY19tbWlvX3NwdGUoJnNwLT5zcHRbaV0sIGdmbiwgcHRlX2FjY2VzcywgJm5yX3ByZXNlbnQpKQorCQkJY29udGludWU7CisKIAkJaWYgKGdmbiAhPSBzcC0+Z2Zuc1tpXSkgewotCQkJZHJvcF9zcHRlKHZjcHUtPmt2bSwgJnNwLT5zcHRbaV0sCi0JCQkJICAgICAgc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpOworCQkJZHJvcF9zcHRlKHZjcHUtPmt2bSwgJnNwLT5zcHRbaV0pOwogCQkJdmNwdS0+a3ZtLT50bGJzX2RpcnR5Kys7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCW5yX3ByZXNlbnQrKzsKLQkJcHRlX2FjY2VzcyA9IHNwLT5yb2xlLmFjY2VzcyAmIEZOQU1FKGdwdGVfYWNjZXNzKSh2Y3B1LCBncHRlKTsKKwogCQlob3N0X3dyaXRhYmxlID0gc3AtPnNwdFtpXSAmIFNQVEVfSE9TVF9XUklURUFCTEU7CiAKIAkJc2V0X3NwdGUodmNwdSwgJnNwLT5zcHRbaV0sIHB0ZV9hY2Nlc3MsIDAsIDAsCi0JCQkgaXNfZGlydHlfZ3B0ZShncHRlKSwgUFRfUEFHRV9UQUJMRV9MRVZFTCwgZ2ZuLAorCQkJIFBUX1BBR0VfVEFCTEVfTEVWRUwsIGdmbiwKIAkJCSBzcHRlX3RvX3BmbihzcC0+c3B0W2ldKSwgdHJ1ZSwgZmFsc2UsCiAJCQkgaG9zdF93cml0YWJsZSk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3N2bS5jIGIvYXJjaC94ODYva3ZtL3N2bS5jCmluZGV4IDUwNmU0ZmUuLjQ3NWQxYzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9zdm0uYworKysgYi9hcmNoL3g4Ni9rdm0vc3ZtLmMKQEAgLTE0OTYsMTEgKzE0OTYsMTQgQEAKIAl1cGRhdGVfY3IwX2ludGVyY2VwdChzdm0pOwogfQogCi1zdGF0aWMgdm9pZCBzdm1fc2V0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I0KQorc3RhdGljIGludCBzdm1fc2V0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I0KQogewogCXVuc2lnbmVkIGxvbmcgaG9zdF9jcjRfbWNlID0gcmVhZF9jcjQoKSAmIFg4Nl9DUjRfTUNFOwogCXVuc2lnbmVkIGxvbmcgb2xkX2NyNCA9IHRvX3N2bSh2Y3B1KS0+dm1jYi0+c2F2ZS5jcjQ7CiAKKwlpZiAoY3I0ICYgWDg2X0NSNF9WTVhFKQorCQlyZXR1cm4gMTsKKwogCWlmIChucHRfZW5hYmxlZCAmJiAoKG9sZF9jcjQgXiBjcjQpICYgWDg2X0NSNF9QR0UpKQogCQlzdm1fZmx1c2hfdGxiKHZjcHUpOwogCkBAIC0xNTEwLDYgKzE1MTMsNyBAQAogCWNyNCB8PSBob3N0X2NyNF9tY2U7CiAJdG9fc3ZtKHZjcHUpLT52bWNiLT5zYXZlLmNyNCA9IGNyNDsKIAltYXJrX2RpcnR5KHRvX3N2bSh2Y3B1KS0+dm1jYiwgVk1DQl9DUik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHN2bV9zZXRfc2VnbWVudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vdHJhY2UuaCBiL2FyY2gveDg2L2t2bS90cmFjZS5oCmluZGV4IGRiOTMyNzYuLjNmZjg5OGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS90cmFjZS5oCisrKyBiL2FyY2gveDg2L2t2bS90cmFjZS5oCkBAIC02NzUsMTIgKzY3NSwxMiBAQAogCQkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPnJpcCA9IHZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmRlY29kZS5mZXRjaC5zdGFydDsKKwkJX19lbnRyeS0+cmlwID0gdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZmV0Y2guc3RhcnQ7CiAJCV9fZW50cnktPmNzYmFzZSA9IGt2bV94ODZfb3BzLT5nZXRfc2VnbWVudF9iYXNlKHZjcHUsIFZDUFVfU1JFR19DUyk7Ci0JCV9fZW50cnktPmxlbiA9IHZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmRlY29kZS5laXAKLQkJCSAgICAgICAtIHZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmRlY29kZS5mZXRjaC5zdGFydDsKKwkJX19lbnRyeS0+bGVuID0gdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuX2VpcAorCQkJICAgICAgIC0gdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZmV0Y2guc3RhcnQ7CiAJCW1lbWNweShfX2VudHJ5LT5pbnNuLAotCQkgICAgICAgdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZGVjb2RlLmZldGNoLmRhdGEsCisJCSAgICAgICB2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5mZXRjaC5kYXRhLAogCQkgICAgICAgMTUpOwogCQlfX2VudHJ5LT5mbGFncyA9IGtlaV9kZWNvZGVfbW9kZSh2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5tb2RlKTsKIAkJX19lbnRyeS0+ZmFpbGVkID0gZmFpbGVkOwpAQCAtNjk4LDYgKzY5OCwyOSBAQAogI2RlZmluZSB0cmFjZV9rdm1fZW11bGF0ZV9pbnNuX3N0YXJ0KHZjcHUpIHRyYWNlX2t2bV9lbXVsYXRlX2luc24odmNwdSwgMCkKICNkZWZpbmUgdHJhY2Vfa3ZtX2VtdWxhdGVfaW5zbl9mYWlsZWQodmNwdSkgdHJhY2Vfa3ZtX2VtdWxhdGVfaW5zbih2Y3B1LCAxKQogCitUUkFDRV9FVkVOVCgKKwl2Y3B1X21hdGNoX21taW8sCisJVFBfUFJPVE8oZ3ZhX3QgZ3ZhLCBncGFfdCBncGEsIGJvb2wgd3JpdGUsIGJvb2wgZ3BhX21hdGNoKSwKKwlUUF9BUkdTKGd2YSwgZ3BhLCB3cml0ZSwgZ3BhX21hdGNoKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoZ3ZhX3QsIGd2YSkKKwkJX19maWVsZChncGFfdCwgZ3BhKQorCQlfX2ZpZWxkKGJvb2wsIHdyaXRlKQorCQlfX2ZpZWxkKGJvb2wsIGdwYV9tYXRjaCkKKwkJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5ndmEgPSBndmE7CisJCV9fZW50cnktPmdwYSA9IGdwYTsKKwkJX19lbnRyeS0+d3JpdGUgPSB3cml0ZTsKKwkJX19lbnRyeS0+Z3BhX21hdGNoID0gZ3BhX21hdGNoCisJCSksCisKKwlUUF9wcmludGsoImd2YSAlI2x4IGdwYSAlI2xseCAlcyAlcyIsIF9fZW50cnktPmd2YSwgX19lbnRyeS0+Z3BhLAorCQkgIF9fZW50cnktPndyaXRlID8gIldyaXRlIiA6ICJSZWFkIiwKKwkJICBfX2VudHJ5LT5ncGFfbWF0Y2ggPyAiR1BBIiA6ICJHVkEiKQorKTsKICNlbmRpZiAvKiBfVFJBQ0VfS1ZNX0ggKi8KIAogI3VuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3ZteC5jIGIvYXJjaC94ODYva3ZtL3ZteC5jCmluZGV4IDRjM2ZhMGYuLmU2NWExNTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS92bXguYworKysgYi9hcmNoL3g4Ni9rdm0vdm14LmMKQEAgLTQzLDEzICs0MywxMiBAQAogI2luY2x1ZGUgInRyYWNlLmgiCiAKICNkZWZpbmUgX19leCh4KSBfX2t2bV9oYW5kbGVfZmF1bHRfb25fcmVib290KHgpCisjZGVmaW5lIF9fZXhfY2xlYXIoeCwgcmVnKSBcCisJX19fX2t2bV9oYW5kbGVfZmF1bHRfb25fcmVib290KHgsICJ4b3IgIiByZWcgIiAsICIgcmVnKQogCiBNT0RVTEVfQVVUSE9SKCJRdW1yYW5ldCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgYnlwYXNzX2d1ZXN0X3BmID0gMTsKLW1vZHVsZV9wYXJhbShieXBhc3NfZ3Vlc3RfcGYsIGJvb2wsIFNfSVJVR08pOwotCiBzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgZW5hYmxlX3ZwaWQgPSAxOwogbW9kdWxlX3BhcmFtX25hbWVkKHZwaWQsIGVuYWJsZV92cGlkLCBib29sLCAwNDQ0KTsKIApAQCAtNzIsNiArNzEsMTQgQEAKIHN0YXRpYyBpbnQgX19yZWFkX21vc3RseSB5aWVsZF9vbl9obHQgPSAxOwogbW9kdWxlX3BhcmFtKHlpZWxkX29uX2hsdCwgYm9vbCwgU19JUlVHTyk7CiAKKy8qCisgKiBJZiBuZXN0ZWQ9MSwgbmVzdGVkIHZpcnR1YWxpemF0aW9uIGlzIHN1cHBvcnRlZCwgaS5lLiwgZ3Vlc3RzIG1heSB1c2UKKyAqIFZNWCBhbmQgYmUgYSBoeXBlcnZpc29yIGZvciBpdHMgb3duIGd1ZXN0cy4gSWYgbmVzdGVkPTAsIGd1ZXN0cyBtYXkgbm90CisgKiB1c2UgVk1YIGluc3RydWN0aW9ucy4KKyAqLworc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IG5lc3RlZCA9IDA7Cittb2R1bGVfcGFyYW0obmVzdGVkLCBib29sLCBTX0lSVUdPKTsKKwogI2RlZmluZSBLVk1fR1VFU1RfQ1IwX01BU0tfVU5SRVNUUklDVEVEX0dVRVNUCQkJCVwKIAkoWDg2X0NSMF9XUCB8IFg4Nl9DUjBfTkUgfCBYODZfQ1IwX05XIHwgWDg2X0NSMF9DRCkKICNkZWZpbmUgS1ZNX0dVRVNUX0NSMF9NQVNLCQkJCQkJXApAQCAtMTA5LDYgKzExNiw3IEBACiBtb2R1bGVfcGFyYW0ocGxlX3dpbmRvdywgaW50LCBTX0lSVUdPKTsKIAogI2RlZmluZSBOUl9BVVRPTE9BRF9NU1JTIDEKKyNkZWZpbmUgVk1DUzAyX1BPT0xfU0laRSAxCiAKIHN0cnVjdCB2bWNzIHsKIAl1MzIgcmV2aXNpb25faWQ7CkBAIC0xMTYsMTcgKzEyNCwyMzcgQEAKIAljaGFyIGRhdGFbMF07CiB9OwogCisvKgorICogVHJhY2sgYSBWTUNTIHRoYXQgbWF5IGJlIGxvYWRlZCBvbiBhIGNlcnRhaW4gQ1BVLiBJZiBpdCBpcyAoY3B1IT0tMSksIGFsc28KKyAqIHJlbWVtYmVyIHdoZXRoZXIgaXQgd2FzIFZNTEFVTkNIZWQsIGFuZCBtYWludGFpbiBhIGxpbmtlZCBsaXN0IG9mIGFsbCBWTUNTcworICogbG9hZGVkIG9uIHRoaXMgQ1BVIChzbyB3ZSBjYW4gY2xlYXIgdGhlbSBpZiB0aGUgQ1BVIGdvZXMgZG93bikuCisgKi8KK3N0cnVjdCBsb2FkZWRfdm1jcyB7CisJc3RydWN0IHZtY3MgKnZtY3M7CisJaW50IGNwdTsKKwlpbnQgbGF1bmNoZWQ7CisJc3RydWN0IGxpc3RfaGVhZCBsb2FkZWRfdm1jc3Nfb25fY3B1X2xpbms7Cit9OworCiBzdHJ1Y3Qgc2hhcmVkX21zcl9lbnRyeSB7CiAJdW5zaWduZWQgaW5kZXg7CiAJdTY0IGRhdGE7CiAJdTY0IG1hc2s7CiB9OwogCisvKgorICogc3RydWN0IHZtY3MxMiBkZXNjcmliZXMgdGhlIHN0YXRlIHRoYXQgb3VyIGd1ZXN0IGh5cGVydmlzb3IgKEwxKSBrZWVwcyBmb3IgYQorICogc2luZ2xlIG5lc3RlZCBndWVzdCAoTDIpLCBoZW5jZSB0aGUgbmFtZSB2bWNzMTIuIEFueSBWTVggaW1wbGVtZW50YXRpb24gaGFzCisgKiBhIFZNQ1Mgc3RydWN0dXJlLCBhbmQgdm1jczEyIGlzIG91ciBlbXVsYXRlZCBWTVgncyBWTUNTLiBUaGlzIHN0cnVjdHVyZSBpcworICogc3RvcmVkIGluIGd1ZXN0IG1lbW9yeSBzcGVjaWZpZWQgYnkgVk1QVFJMRCwgYnV0IGlzIG9wYXF1ZSB0byB0aGUgZ3Vlc3QsCisgKiB3aGljaCBtdXN0IGFjY2VzcyBpdCB1c2luZyBWTVJFQUQvVk1XUklURS9WTUNMRUFSIGluc3RydWN0aW9ucy4KKyAqIE1vcmUgdGhhbiBvbmUgb2YgdGhlc2Ugc3RydWN0dXJlcyBtYXkgZXhpc3QsIGlmIEwxIHJ1bnMgbXVsdGlwbGUgTDIgZ3Vlc3RzLgorICogbmVzdGVkX3ZteF9ydW4oKSB3aWxsIHVzZSB0aGUgZGF0YSBoZXJlIHRvIGJ1aWxkIGEgdm1jczAyOiBhIFZNQ1MgZm9yIHRoZQorICogdW5kZXJseWluZyBoYXJkd2FyZSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcnVuIEwyLgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgcGFja2VkIHRvIGVuc3VyZSB0aGF0IGl0cyBsYXlvdXQgaXMgaWRlbnRpY2FsIGFjcm9zcworICogbWFjaGluZXMgKG5lY2Vzc2FyeSBmb3IgbGl2ZSBtaWdyYXRpb24pLgorICogSWYgdGhlcmUgYXJlIGNoYW5nZXMgaW4gdGhpcyBzdHJ1Y3QsIFZNQ1MxMl9SRVZJU0lPTiBtdXN0IGJlIGNoYW5nZWQuCisgKi8KK3R5cGVkZWYgdTY0IG5hdHVyYWxfd2lkdGg7CitzdHJ1Y3QgX19wYWNrZWQgdm1jczEyIHsKKwkvKiBBY2NvcmRpbmcgdG8gdGhlIEludGVsIHNwZWMsIGEgVk1DUyByZWdpb24gbXVzdCBzdGFydCB3aXRoIHRoZQorCSAqIGZvbGxvd2luZyB0d28gZmllbGRzLiBUaGVuIGZvbGxvdyBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBkYXRhLgorCSAqLworCXUzMiByZXZpc2lvbl9pZDsKKwl1MzIgYWJvcnQ7CisKKwl1MzIgbGF1bmNoX3N0YXRlOyAvKiBzZXQgdG8gMCBieSBWTUNMRUFSLCB0byAxIGJ5IFZNTEFVTkNIICovCisJdTMyIHBhZGRpbmdbN107IC8qIHJvb20gZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKworCXU2NCBpb19iaXRtYXBfYTsKKwl1NjQgaW9fYml0bWFwX2I7CisJdTY0IG1zcl9iaXRtYXA7CisJdTY0IHZtX2V4aXRfbXNyX3N0b3JlX2FkZHI7CisJdTY0IHZtX2V4aXRfbXNyX2xvYWRfYWRkcjsKKwl1NjQgdm1fZW50cnlfbXNyX2xvYWRfYWRkcjsKKwl1NjQgdHNjX29mZnNldDsKKwl1NjQgdmlydHVhbF9hcGljX3BhZ2VfYWRkcjsKKwl1NjQgYXBpY19hY2Nlc3NfYWRkcjsKKwl1NjQgZXB0X3BvaW50ZXI7CisJdTY0IGd1ZXN0X3BoeXNpY2FsX2FkZHJlc3M7CisJdTY0IHZtY3NfbGlua19wb2ludGVyOworCXU2NCBndWVzdF9pYTMyX2RlYnVnY3RsOworCXU2NCBndWVzdF9pYTMyX3BhdDsKKwl1NjQgZ3Vlc3RfaWEzMl9lZmVyOworCXU2NCBndWVzdF9pYTMyX3BlcmZfZ2xvYmFsX2N0cmw7CisJdTY0IGd1ZXN0X3BkcHRyMDsKKwl1NjQgZ3Vlc3RfcGRwdHIxOworCXU2NCBndWVzdF9wZHB0cjI7CisJdTY0IGd1ZXN0X3BkcHRyMzsKKwl1NjQgaG9zdF9pYTMyX3BhdDsKKwl1NjQgaG9zdF9pYTMyX2VmZXI7CisJdTY0IGhvc3RfaWEzMl9wZXJmX2dsb2JhbF9jdHJsOworCXU2NCBwYWRkaW5nNjRbOF07IC8qIHJvb20gZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKwkvKgorCSAqIFRvIGFsbG93IG1pZ3JhdGlvbiBvZiBMMSAoY29tcGxldGUgd2l0aCBpdHMgTDIgZ3Vlc3RzKSBiZXR3ZWVuCisJICogbWFjaGluZXMgb2YgZGlmZmVyZW50IG5hdHVyYWwgd2lkdGhzICgzMiBvciA2NCBiaXQpLCB3ZSBjYW5ub3QgaGF2ZQorCSAqIHVuc2lnbmVkIGxvbmcgZmllbGRzIHdpdGggbm8gZXhwbGljdCBzaXplLiBXZSB1c2UgdTY0IChhbGlhc2VkCisJICogbmF0dXJhbF93aWR0aCkgaW5zdGVhZC4gTHVja2lseSwgeDg2IGlzIGxpdHRsZS1lbmRpYW4uCisJICovCisJbmF0dXJhbF93aWR0aCBjcjBfZ3Vlc3RfaG9zdF9tYXNrOworCW5hdHVyYWxfd2lkdGggY3I0X2d1ZXN0X2hvc3RfbWFzazsKKwluYXR1cmFsX3dpZHRoIGNyMF9yZWFkX3NoYWRvdzsKKwluYXR1cmFsX3dpZHRoIGNyNF9yZWFkX3NoYWRvdzsKKwluYXR1cmFsX3dpZHRoIGNyM190YXJnZXRfdmFsdWUwOworCW5hdHVyYWxfd2lkdGggY3IzX3RhcmdldF92YWx1ZTE7CisJbmF0dXJhbF93aWR0aCBjcjNfdGFyZ2V0X3ZhbHVlMjsKKwluYXR1cmFsX3dpZHRoIGNyM190YXJnZXRfdmFsdWUzOworCW5hdHVyYWxfd2lkdGggZXhpdF9xdWFsaWZpY2F0aW9uOworCW5hdHVyYWxfd2lkdGggZ3Vlc3RfbGluZWFyX2FkZHJlc3M7CisJbmF0dXJhbF93aWR0aCBndWVzdF9jcjA7CisJbmF0dXJhbF93aWR0aCBndWVzdF9jcjM7CisJbmF0dXJhbF93aWR0aCBndWVzdF9jcjQ7CisJbmF0dXJhbF93aWR0aCBndWVzdF9lc19iYXNlOworCW5hdHVyYWxfd2lkdGggZ3Vlc3RfY3NfYmFzZTsKKwluYXR1cmFsX3dpZHRoIGd1ZXN0X3NzX2Jhc2U7CisJbmF0dXJhbF93aWR0aCBndWVzdF9kc19iYXNlOworCW5hdHVyYWxfd2lkdGggZ3Vlc3RfZnNfYmFzZTsKKwluYXR1cmFsX3dpZHRoIGd1ZXN0X2dzX2Jhc2U7CisJbmF0dXJhbF93aWR0aCBndWVzdF9sZHRyX2Jhc2U7CisJbmF0dXJhbF93aWR0aCBndWVzdF90cl9iYXNlOworCW5hdHVyYWxfd2lkdGggZ3Vlc3RfZ2R0cl9iYXNlOworCW5hdHVyYWxfd2lkdGggZ3Vlc3RfaWR0cl9iYXNlOworCW5hdHVyYWxfd2lkdGggZ3Vlc3RfZHI3OworCW5hdHVyYWxfd2lkdGggZ3Vlc3RfcnNwOworCW5hdHVyYWxfd2lkdGggZ3Vlc3RfcmlwOworCW5hdHVyYWxfd2lkdGggZ3Vlc3RfcmZsYWdzOworCW5hdHVyYWxfd2lkdGggZ3Vlc3RfcGVuZGluZ19kYmdfZXhjZXB0aW9uczsKKwluYXR1cmFsX3dpZHRoIGd1ZXN0X3N5c2VudGVyX2VzcDsKKwluYXR1cmFsX3dpZHRoIGd1ZXN0X3N5c2VudGVyX2VpcDsKKwluYXR1cmFsX3dpZHRoIGhvc3RfY3IwOworCW5hdHVyYWxfd2lkdGggaG9zdF9jcjM7CisJbmF0dXJhbF93aWR0aCBob3N0X2NyNDsKKwluYXR1cmFsX3dpZHRoIGhvc3RfZnNfYmFzZTsKKwluYXR1cmFsX3dpZHRoIGhvc3RfZ3NfYmFzZTsKKwluYXR1cmFsX3dpZHRoIGhvc3RfdHJfYmFzZTsKKwluYXR1cmFsX3dpZHRoIGhvc3RfZ2R0cl9iYXNlOworCW5hdHVyYWxfd2lkdGggaG9zdF9pZHRyX2Jhc2U7CisJbmF0dXJhbF93aWR0aCBob3N0X2lhMzJfc3lzZW50ZXJfZXNwOworCW5hdHVyYWxfd2lkdGggaG9zdF9pYTMyX3N5c2VudGVyX2VpcDsKKwluYXR1cmFsX3dpZHRoIGhvc3RfcnNwOworCW5hdHVyYWxfd2lkdGggaG9zdF9yaXA7CisJbmF0dXJhbF93aWR0aCBwYWRkaW5nbFs4XTsgLyogcm9vbSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworCXUzMiBwaW5fYmFzZWRfdm1fZXhlY19jb250cm9sOworCXUzMiBjcHVfYmFzZWRfdm1fZXhlY19jb250cm9sOworCXUzMiBleGNlcHRpb25fYml0bWFwOworCXUzMiBwYWdlX2ZhdWx0X2Vycm9yX2NvZGVfbWFzazsKKwl1MzIgcGFnZV9mYXVsdF9lcnJvcl9jb2RlX21hdGNoOworCXUzMiBjcjNfdGFyZ2V0X2NvdW50OworCXUzMiB2bV9leGl0X2NvbnRyb2xzOworCXUzMiB2bV9leGl0X21zcl9zdG9yZV9jb3VudDsKKwl1MzIgdm1fZXhpdF9tc3JfbG9hZF9jb3VudDsKKwl1MzIgdm1fZW50cnlfY29udHJvbHM7CisJdTMyIHZtX2VudHJ5X21zcl9sb2FkX2NvdW50OworCXUzMiB2bV9lbnRyeV9pbnRyX2luZm9fZmllbGQ7CisJdTMyIHZtX2VudHJ5X2V4Y2VwdGlvbl9lcnJvcl9jb2RlOworCXUzMiB2bV9lbnRyeV9pbnN0cnVjdGlvbl9sZW47CisJdTMyIHRwcl90aHJlc2hvbGQ7CisJdTMyIHNlY29uZGFyeV92bV9leGVjX2NvbnRyb2w7CisJdTMyIHZtX2luc3RydWN0aW9uX2Vycm9yOworCXUzMiB2bV9leGl0X3JlYXNvbjsKKwl1MzIgdm1fZXhpdF9pbnRyX2luZm87CisJdTMyIHZtX2V4aXRfaW50cl9lcnJvcl9jb2RlOworCXUzMiBpZHRfdmVjdG9yaW5nX2luZm9fZmllbGQ7CisJdTMyIGlkdF92ZWN0b3JpbmdfZXJyb3JfY29kZTsKKwl1MzIgdm1fZXhpdF9pbnN0cnVjdGlvbl9sZW47CisJdTMyIHZteF9pbnN0cnVjdGlvbl9pbmZvOworCXUzMiBndWVzdF9lc19saW1pdDsKKwl1MzIgZ3Vlc3RfY3NfbGltaXQ7CisJdTMyIGd1ZXN0X3NzX2xpbWl0OworCXUzMiBndWVzdF9kc19saW1pdDsKKwl1MzIgZ3Vlc3RfZnNfbGltaXQ7CisJdTMyIGd1ZXN0X2dzX2xpbWl0OworCXUzMiBndWVzdF9sZHRyX2xpbWl0OworCXUzMiBndWVzdF90cl9saW1pdDsKKwl1MzIgZ3Vlc3RfZ2R0cl9saW1pdDsKKwl1MzIgZ3Vlc3RfaWR0cl9saW1pdDsKKwl1MzIgZ3Vlc3RfZXNfYXJfYnl0ZXM7CisJdTMyIGd1ZXN0X2NzX2FyX2J5dGVzOworCXUzMiBndWVzdF9zc19hcl9ieXRlczsKKwl1MzIgZ3Vlc3RfZHNfYXJfYnl0ZXM7CisJdTMyIGd1ZXN0X2ZzX2FyX2J5dGVzOworCXUzMiBndWVzdF9nc19hcl9ieXRlczsKKwl1MzIgZ3Vlc3RfbGR0cl9hcl9ieXRlczsKKwl1MzIgZ3Vlc3RfdHJfYXJfYnl0ZXM7CisJdTMyIGd1ZXN0X2ludGVycnVwdGliaWxpdHlfaW5mbzsKKwl1MzIgZ3Vlc3RfYWN0aXZpdHlfc3RhdGU7CisJdTMyIGd1ZXN0X3N5c2VudGVyX2NzOworCXUzMiBob3N0X2lhMzJfc3lzZW50ZXJfY3M7CisJdTMyIHBhZGRpbmczMls4XTsgLyogcm9vbSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworCXUxNiB2aXJ0dWFsX3Byb2Nlc3Nvcl9pZDsKKwl1MTYgZ3Vlc3RfZXNfc2VsZWN0b3I7CisJdTE2IGd1ZXN0X2NzX3NlbGVjdG9yOworCXUxNiBndWVzdF9zc19zZWxlY3RvcjsKKwl1MTYgZ3Vlc3RfZHNfc2VsZWN0b3I7CisJdTE2IGd1ZXN0X2ZzX3NlbGVjdG9yOworCXUxNiBndWVzdF9nc19zZWxlY3RvcjsKKwl1MTYgZ3Vlc3RfbGR0cl9zZWxlY3RvcjsKKwl1MTYgZ3Vlc3RfdHJfc2VsZWN0b3I7CisJdTE2IGhvc3RfZXNfc2VsZWN0b3I7CisJdTE2IGhvc3RfY3Nfc2VsZWN0b3I7CisJdTE2IGhvc3Rfc3Nfc2VsZWN0b3I7CisJdTE2IGhvc3RfZHNfc2VsZWN0b3I7CisJdTE2IGhvc3RfZnNfc2VsZWN0b3I7CisJdTE2IGhvc3RfZ3Nfc2VsZWN0b3I7CisJdTE2IGhvc3RfdHJfc2VsZWN0b3I7Cit9OworCisvKgorICogVk1DUzEyX1JFVklTSU9OIGlzIGFuIGFyYml0cmFyeSBpZCB0aGF0IHNob3VsZCBiZSBjaGFuZ2VkIGlmIHRoZSBjb250ZW50IG9yCisgKiBsYXlvdXQgb2Ygc3RydWN0IHZtY3MxMiBpcyBjaGFuZ2VkLiBNU1JfSUEzMl9WTVhfQkFTSUMgcmV0dXJucyB0aGlzIGlkLCBhbmQKKyAqIFZNUFRSTEQgdmVyaWZpZXMgdGhhdCB0aGUgVk1DUyByZWdpb24gdGhhdCBMMSBpcyBsb2FkaW5nIGNvbnRhaW5zIHRoaXMgaWQuCisgKi8KKyNkZWZpbmUgVk1DUzEyX1JFVklTSU9OIDB4MTFlNTdlZDAKKworLyoKKyAqIFZNQ1MxMl9TSVpFIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgTDEgc2hvdWxkIGFsbG9jYXRlIGZvciB0aGUgVk1YT04gcmVnaW9uCisgKiBhbmQgYW55IFZNQ1MgcmVnaW9uLiBBbHRob3VnaCBvbmx5IHNpemVvZihzdHJ1Y3Qgdm1jczEyKSBhcmUgdXNlZCBieSB0aGUKKyAqIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIDRLIGFyZSByZXNlcnZlZCB0byBhdm9pZCBmdXR1cmUgY29tcGxpY2F0aW9ucy4KKyAqLworI2RlZmluZSBWTUNTMTJfU0laRSAweDEwMDAKKworLyogVXNlZCB0byByZW1lbWJlciB0aGUgbGFzdCB2bWNzMDIgdXNlZCBmb3Igc29tZSByZWNlbnRseSB1c2VkIHZtY3MxMnMgKi8KK3N0cnVjdCB2bWNzMDJfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWdwYV90IHZtcHRyOworCXN0cnVjdCBsb2FkZWRfdm1jcyB2bWNzMDI7Cit9OworCisvKgorICogVGhlIG5lc3RlZF92bXggc3RydWN0dXJlIGlzIHBhcnQgb2YgdmNwdV92bXgsIGFuZCBob2xkcyBpbmZvcm1hdGlvbiB3ZSBuZWVkCisgKiBmb3IgY29ycmVjdCBlbXVsYXRpb24gb2YgVk1YIChpLmUuLCBuZXN0ZWQgVk1YKSBvbiB0aGlzIHZjcHUuCisgKi8KK3N0cnVjdCBuZXN0ZWRfdm14IHsKKwkvKiBIYXMgdGhlIGxldmVsMSBndWVzdCBkb25lIHZteG9uPyAqLworCWJvb2wgdm14b247CisKKwkvKiBUaGUgZ3Vlc3QtcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBWTUNTIEwxIGtlZXBzIGZvciBMMiAqLworCWdwYV90IGN1cnJlbnRfdm1wdHI7CisJLyogVGhlIGhvc3QtdXNhYmxlIHBvaW50ZXIgdG8gdGhlIGFib3ZlICovCisJc3RydWN0IHBhZ2UgKmN1cnJlbnRfdm1jczEyX3BhZ2U7CisJc3RydWN0IHZtY3MxMiAqY3VycmVudF92bWNzMTI7CisKKwkvKiB2bWNzMDJfbGlzdCBjYWNoZSBvZiBWTUNTcyByZWNlbnRseSB1c2VkIHRvIHJ1biBMMiBndWVzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHZtY3MwMl9wb29sOworCWludCB2bWNzMDJfbnVtOworCXU2NCB2bWNzMDFfdHNjX29mZnNldDsKKwkvKiBMMiBtdXN0IHJ1biBuZXh0LCBhbmQgbXVzdG4ndCBkZWNpZGUgdG8gZXhpdCB0byBMMS4gKi8KKwlib29sIG5lc3RlZF9ydW5fcGVuZGluZzsKKwkvKgorCSAqIEd1ZXN0IHBhZ2VzIHJlZmVycmVkIHRvIGluIHZtY3MwMiB3aXRoIGhvc3QtcGh5c2ljYWwgcG9pbnRlcnMsIHNvCisJICogd2UgbXVzdCBrZWVwIHRoZW0gcGlubmVkIHdoaWxlIEwyIHJ1bnMuCisJICovCisJc3RydWN0IHBhZ2UgKmFwaWNfYWNjZXNzX3BhZ2U7Cit9OworCiBzdHJ1Y3QgdmNwdV92bXggewogCXN0cnVjdCBrdm1fdmNwdSAgICAgICB2Y3B1OwotCXN0cnVjdCBsaXN0X2hlYWQgICAgICBsb2NhbF92Y3B1c19saW5rOwogCXVuc2lnbmVkIGxvbmcgICAgICAgICBob3N0X3JzcDsKLQlpbnQgICAgICAgICAgICAgICAgICAgbGF1bmNoZWQ7CiAJdTggICAgICAgICAgICAgICAgICAgIGZhaWw7CiAJdTggICAgICAgICAgICAgICAgICAgIGNwbDsKIAlib29sICAgICAgICAgICAgICAgICAgbm1pX2tub3duX3VubWFza2VkOwpAQCAtMTQwLDcgKzM2OCwxNCBAQAogCXU2NCAJCSAgICAgIG1zcl9ob3N0X2tlcm5lbF9nc19iYXNlOwogCXU2NCAJCSAgICAgIG1zcl9ndWVzdF9rZXJuZWxfZ3NfYmFzZTsKICNlbmRpZgotCXN0cnVjdCB2bWNzICAgICAgICAgICp2bWNzOworCS8qCisJICogbG9hZGVkX3ZtY3MgcG9pbnRzIHRvIHRoZSBWTUNTIGN1cnJlbnRseSB1c2VkIGluIHRoaXMgdmNwdS4gRm9yIGEKKwkgKiBub24tbmVzdGVkIChMMSkgZ3Vlc3QsIGl0IGFsd2F5cyBwb2ludHMgdG8gdm1jczAxLiBGb3IgYSBuZXN0ZWQKKwkgKiBndWVzdCAoTDIpLCBpdCBwb2ludHMgdG8gYSBkaWZmZXJlbnQgVk1DUy4KKwkgKi8KKwlzdHJ1Y3QgbG9hZGVkX3ZtY3MgICAgdm1jczAxOworCXN0cnVjdCBsb2FkZWRfdm1jcyAgICpsb2FkZWRfdm1jczsKKwlib29sICAgICAgICAgICAgICAgICAgX19sYXVuY2hlZDsgLyogdGVtcG9yYXJ5LCB1c2VkIGluIHZteF92Y3B1X3J1biAqLwogCXN0cnVjdCBtc3JfYXV0b2xvYWQgewogCQl1bnNpZ25lZCBucjsKIAkJc3RydWN0IHZteF9tc3JfZW50cnkgZ3Vlc3RbTlJfQVVUT0xPQURfTVNSU107CkBAIC0xNzYsNiArNDExLDkgQEAKIAl1MzIgZXhpdF9yZWFzb247CiAKIAlib29sIHJkdHNjcF9lbmFibGVkOworCisJLyogU3VwcG9ydCBmb3IgYSBndWVzdCBoeXBlcnZpc29yIChuZXN0ZWQgVk1YKSAqLworCXN0cnVjdCBuZXN0ZWRfdm14IG5lc3RlZDsKIH07CiAKIGVudW0gc2VnbWVudF9jYWNoZV9maWVsZCB7CkBAIC0xOTIsNiArNDMwLDE3NCBAQAogCXJldHVybiBjb250YWluZXJfb2YodmNwdSwgc3RydWN0IHZjcHVfdm14LCB2Y3B1KTsKIH0KIAorI2RlZmluZSBWTUNTMTJfT0ZGU0VUKHgpIG9mZnNldG9mKHN0cnVjdCB2bWNzMTIsIHgpCisjZGVmaW5lIEZJRUxEKG51bWJlciwgbmFtZSkJW251bWJlcl0gPSBWTUNTMTJfT0ZGU0VUKG5hbWUpCisjZGVmaW5lIEZJRUxENjQobnVtYmVyLCBuYW1lKQlbbnVtYmVyXSA9IFZNQ1MxMl9PRkZTRVQobmFtZSksIFwKKwkJCQlbbnVtYmVyIyNfSElHSF0gPSBWTUNTMTJfT0ZGU0VUKG5hbWUpKzQKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHZtY3NfZmllbGRfdG9fb2Zmc2V0X3RhYmxlW10gPSB7CisJRklFTEQoVklSVFVBTF9QUk9DRVNTT1JfSUQsIHZpcnR1YWxfcHJvY2Vzc29yX2lkKSwKKwlGSUVMRChHVUVTVF9FU19TRUxFQ1RPUiwgZ3Vlc3RfZXNfc2VsZWN0b3IpLAorCUZJRUxEKEdVRVNUX0NTX1NFTEVDVE9SLCBndWVzdF9jc19zZWxlY3RvciksCisJRklFTEQoR1VFU1RfU1NfU0VMRUNUT1IsIGd1ZXN0X3NzX3NlbGVjdG9yKSwKKwlGSUVMRChHVUVTVF9EU19TRUxFQ1RPUiwgZ3Vlc3RfZHNfc2VsZWN0b3IpLAorCUZJRUxEKEdVRVNUX0ZTX1NFTEVDVE9SLCBndWVzdF9mc19zZWxlY3RvciksCisJRklFTEQoR1VFU1RfR1NfU0VMRUNUT1IsIGd1ZXN0X2dzX3NlbGVjdG9yKSwKKwlGSUVMRChHVUVTVF9MRFRSX1NFTEVDVE9SLCBndWVzdF9sZHRyX3NlbGVjdG9yKSwKKwlGSUVMRChHVUVTVF9UUl9TRUxFQ1RPUiwgZ3Vlc3RfdHJfc2VsZWN0b3IpLAorCUZJRUxEKEhPU1RfRVNfU0VMRUNUT1IsIGhvc3RfZXNfc2VsZWN0b3IpLAorCUZJRUxEKEhPU1RfQ1NfU0VMRUNUT1IsIGhvc3RfY3Nfc2VsZWN0b3IpLAorCUZJRUxEKEhPU1RfU1NfU0VMRUNUT1IsIGhvc3Rfc3Nfc2VsZWN0b3IpLAorCUZJRUxEKEhPU1RfRFNfU0VMRUNUT1IsIGhvc3RfZHNfc2VsZWN0b3IpLAorCUZJRUxEKEhPU1RfRlNfU0VMRUNUT1IsIGhvc3RfZnNfc2VsZWN0b3IpLAorCUZJRUxEKEhPU1RfR1NfU0VMRUNUT1IsIGhvc3RfZ3Nfc2VsZWN0b3IpLAorCUZJRUxEKEhPU1RfVFJfU0VMRUNUT1IsIGhvc3RfdHJfc2VsZWN0b3IpLAorCUZJRUxENjQoSU9fQklUTUFQX0EsIGlvX2JpdG1hcF9hKSwKKwlGSUVMRDY0KElPX0JJVE1BUF9CLCBpb19iaXRtYXBfYiksCisJRklFTEQ2NChNU1JfQklUTUFQLCBtc3JfYml0bWFwKSwKKwlGSUVMRDY0KFZNX0VYSVRfTVNSX1NUT1JFX0FERFIsIHZtX2V4aXRfbXNyX3N0b3JlX2FkZHIpLAorCUZJRUxENjQoVk1fRVhJVF9NU1JfTE9BRF9BRERSLCB2bV9leGl0X21zcl9sb2FkX2FkZHIpLAorCUZJRUxENjQoVk1fRU5UUllfTVNSX0xPQURfQUREUiwgdm1fZW50cnlfbXNyX2xvYWRfYWRkciksCisJRklFTEQ2NChUU0NfT0ZGU0VULCB0c2Nfb2Zmc2V0KSwKKwlGSUVMRDY0KFZJUlRVQUxfQVBJQ19QQUdFX0FERFIsIHZpcnR1YWxfYXBpY19wYWdlX2FkZHIpLAorCUZJRUxENjQoQVBJQ19BQ0NFU1NfQUREUiwgYXBpY19hY2Nlc3NfYWRkciksCisJRklFTEQ2NChFUFRfUE9JTlRFUiwgZXB0X3BvaW50ZXIpLAorCUZJRUxENjQoR1VFU1RfUEhZU0lDQUxfQUREUkVTUywgZ3Vlc3RfcGh5c2ljYWxfYWRkcmVzcyksCisJRklFTEQ2NChWTUNTX0xJTktfUE9JTlRFUiwgdm1jc19saW5rX3BvaW50ZXIpLAorCUZJRUxENjQoR1VFU1RfSUEzMl9ERUJVR0NUTCwgZ3Vlc3RfaWEzMl9kZWJ1Z2N0bCksCisJRklFTEQ2NChHVUVTVF9JQTMyX1BBVCwgZ3Vlc3RfaWEzMl9wYXQpLAorCUZJRUxENjQoR1VFU1RfSUEzMl9FRkVSLCBndWVzdF9pYTMyX2VmZXIpLAorCUZJRUxENjQoR1VFU1RfSUEzMl9QRVJGX0dMT0JBTF9DVFJMLCBndWVzdF9pYTMyX3BlcmZfZ2xvYmFsX2N0cmwpLAorCUZJRUxENjQoR1VFU1RfUERQVFIwLCBndWVzdF9wZHB0cjApLAorCUZJRUxENjQoR1VFU1RfUERQVFIxLCBndWVzdF9wZHB0cjEpLAorCUZJRUxENjQoR1VFU1RfUERQVFIyLCBndWVzdF9wZHB0cjIpLAorCUZJRUxENjQoR1VFU1RfUERQVFIzLCBndWVzdF9wZHB0cjMpLAorCUZJRUxENjQoSE9TVF9JQTMyX1BBVCwgaG9zdF9pYTMyX3BhdCksCisJRklFTEQ2NChIT1NUX0lBMzJfRUZFUiwgaG9zdF9pYTMyX2VmZXIpLAorCUZJRUxENjQoSE9TVF9JQTMyX1BFUkZfR0xPQkFMX0NUUkwsIGhvc3RfaWEzMl9wZXJmX2dsb2JhbF9jdHJsKSwKKwlGSUVMRChQSU5fQkFTRURfVk1fRVhFQ19DT05UUk9MLCBwaW5fYmFzZWRfdm1fZXhlY19jb250cm9sKSwKKwlGSUVMRChDUFVfQkFTRURfVk1fRVhFQ19DT05UUk9MLCBjcHVfYmFzZWRfdm1fZXhlY19jb250cm9sKSwKKwlGSUVMRChFWENFUFRJT05fQklUTUFQLCBleGNlcHRpb25fYml0bWFwKSwKKwlGSUVMRChQQUdFX0ZBVUxUX0VSUk9SX0NPREVfTUFTSywgcGFnZV9mYXVsdF9lcnJvcl9jb2RlX21hc2spLAorCUZJRUxEKFBBR0VfRkFVTFRfRVJST1JfQ09ERV9NQVRDSCwgcGFnZV9mYXVsdF9lcnJvcl9jb2RlX21hdGNoKSwKKwlGSUVMRChDUjNfVEFSR0VUX0NPVU5ULCBjcjNfdGFyZ2V0X2NvdW50KSwKKwlGSUVMRChWTV9FWElUX0NPTlRST0xTLCB2bV9leGl0X2NvbnRyb2xzKSwKKwlGSUVMRChWTV9FWElUX01TUl9TVE9SRV9DT1VOVCwgdm1fZXhpdF9tc3Jfc3RvcmVfY291bnQpLAorCUZJRUxEKFZNX0VYSVRfTVNSX0xPQURfQ09VTlQsIHZtX2V4aXRfbXNyX2xvYWRfY291bnQpLAorCUZJRUxEKFZNX0VOVFJZX0NPTlRST0xTLCB2bV9lbnRyeV9jb250cm9scyksCisJRklFTEQoVk1fRU5UUllfTVNSX0xPQURfQ09VTlQsIHZtX2VudHJ5X21zcl9sb2FkX2NvdW50KSwKKwlGSUVMRChWTV9FTlRSWV9JTlRSX0lORk9fRklFTEQsIHZtX2VudHJ5X2ludHJfaW5mb19maWVsZCksCisJRklFTEQoVk1fRU5UUllfRVhDRVBUSU9OX0VSUk9SX0NPREUsIHZtX2VudHJ5X2V4Y2VwdGlvbl9lcnJvcl9jb2RlKSwKKwlGSUVMRChWTV9FTlRSWV9JTlNUUlVDVElPTl9MRU4sIHZtX2VudHJ5X2luc3RydWN0aW9uX2xlbiksCisJRklFTEQoVFBSX1RIUkVTSE9MRCwgdHByX3RocmVzaG9sZCksCisJRklFTEQoU0VDT05EQVJZX1ZNX0VYRUNfQ09OVFJPTCwgc2Vjb25kYXJ5X3ZtX2V4ZWNfY29udHJvbCksCisJRklFTEQoVk1fSU5TVFJVQ1RJT05fRVJST1IsIHZtX2luc3RydWN0aW9uX2Vycm9yKSwKKwlGSUVMRChWTV9FWElUX1JFQVNPTiwgdm1fZXhpdF9yZWFzb24pLAorCUZJRUxEKFZNX0VYSVRfSU5UUl9JTkZPLCB2bV9leGl0X2ludHJfaW5mbyksCisJRklFTEQoVk1fRVhJVF9JTlRSX0VSUk9SX0NPREUsIHZtX2V4aXRfaW50cl9lcnJvcl9jb2RlKSwKKwlGSUVMRChJRFRfVkVDVE9SSU5HX0lORk9fRklFTEQsIGlkdF92ZWN0b3JpbmdfaW5mb19maWVsZCksCisJRklFTEQoSURUX1ZFQ1RPUklOR19FUlJPUl9DT0RFLCBpZHRfdmVjdG9yaW5nX2Vycm9yX2NvZGUpLAorCUZJRUxEKFZNX0VYSVRfSU5TVFJVQ1RJT05fTEVOLCB2bV9leGl0X2luc3RydWN0aW9uX2xlbiksCisJRklFTEQoVk1YX0lOU1RSVUNUSU9OX0lORk8sIHZteF9pbnN0cnVjdGlvbl9pbmZvKSwKKwlGSUVMRChHVUVTVF9FU19MSU1JVCwgZ3Vlc3RfZXNfbGltaXQpLAorCUZJRUxEKEdVRVNUX0NTX0xJTUlULCBndWVzdF9jc19saW1pdCksCisJRklFTEQoR1VFU1RfU1NfTElNSVQsIGd1ZXN0X3NzX2xpbWl0KSwKKwlGSUVMRChHVUVTVF9EU19MSU1JVCwgZ3Vlc3RfZHNfbGltaXQpLAorCUZJRUxEKEdVRVNUX0ZTX0xJTUlULCBndWVzdF9mc19saW1pdCksCisJRklFTEQoR1VFU1RfR1NfTElNSVQsIGd1ZXN0X2dzX2xpbWl0KSwKKwlGSUVMRChHVUVTVF9MRFRSX0xJTUlULCBndWVzdF9sZHRyX2xpbWl0KSwKKwlGSUVMRChHVUVTVF9UUl9MSU1JVCwgZ3Vlc3RfdHJfbGltaXQpLAorCUZJRUxEKEdVRVNUX0dEVFJfTElNSVQsIGd1ZXN0X2dkdHJfbGltaXQpLAorCUZJRUxEKEdVRVNUX0lEVFJfTElNSVQsIGd1ZXN0X2lkdHJfbGltaXQpLAorCUZJRUxEKEdVRVNUX0VTX0FSX0JZVEVTLCBndWVzdF9lc19hcl9ieXRlcyksCisJRklFTEQoR1VFU1RfQ1NfQVJfQllURVMsIGd1ZXN0X2NzX2FyX2J5dGVzKSwKKwlGSUVMRChHVUVTVF9TU19BUl9CWVRFUywgZ3Vlc3Rfc3NfYXJfYnl0ZXMpLAorCUZJRUxEKEdVRVNUX0RTX0FSX0JZVEVTLCBndWVzdF9kc19hcl9ieXRlcyksCisJRklFTEQoR1VFU1RfRlNfQVJfQllURVMsIGd1ZXN0X2ZzX2FyX2J5dGVzKSwKKwlGSUVMRChHVUVTVF9HU19BUl9CWVRFUywgZ3Vlc3RfZ3NfYXJfYnl0ZXMpLAorCUZJRUxEKEdVRVNUX0xEVFJfQVJfQllURVMsIGd1ZXN0X2xkdHJfYXJfYnl0ZXMpLAorCUZJRUxEKEdVRVNUX1RSX0FSX0JZVEVTLCBndWVzdF90cl9hcl9ieXRlcyksCisJRklFTEQoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPLCBndWVzdF9pbnRlcnJ1cHRpYmlsaXR5X2luZm8pLAorCUZJRUxEKEdVRVNUX0FDVElWSVRZX1NUQVRFLCBndWVzdF9hY3Rpdml0eV9zdGF0ZSksCisJRklFTEQoR1VFU1RfU1lTRU5URVJfQ1MsIGd1ZXN0X3N5c2VudGVyX2NzKSwKKwlGSUVMRChIT1NUX0lBMzJfU1lTRU5URVJfQ1MsIGhvc3RfaWEzMl9zeXNlbnRlcl9jcyksCisJRklFTEQoQ1IwX0dVRVNUX0hPU1RfTUFTSywgY3IwX2d1ZXN0X2hvc3RfbWFzayksCisJRklFTEQoQ1I0X0dVRVNUX0hPU1RfTUFTSywgY3I0X2d1ZXN0X2hvc3RfbWFzayksCisJRklFTEQoQ1IwX1JFQURfU0hBRE9XLCBjcjBfcmVhZF9zaGFkb3cpLAorCUZJRUxEKENSNF9SRUFEX1NIQURPVywgY3I0X3JlYWRfc2hhZG93KSwKKwlGSUVMRChDUjNfVEFSR0VUX1ZBTFVFMCwgY3IzX3RhcmdldF92YWx1ZTApLAorCUZJRUxEKENSM19UQVJHRVRfVkFMVUUxLCBjcjNfdGFyZ2V0X3ZhbHVlMSksCisJRklFTEQoQ1IzX1RBUkdFVF9WQUxVRTIsIGNyM190YXJnZXRfdmFsdWUyKSwKKwlGSUVMRChDUjNfVEFSR0VUX1ZBTFVFMywgY3IzX3RhcmdldF92YWx1ZTMpLAorCUZJRUxEKEVYSVRfUVVBTElGSUNBVElPTiwgZXhpdF9xdWFsaWZpY2F0aW9uKSwKKwlGSUVMRChHVUVTVF9MSU5FQVJfQUREUkVTUywgZ3Vlc3RfbGluZWFyX2FkZHJlc3MpLAorCUZJRUxEKEdVRVNUX0NSMCwgZ3Vlc3RfY3IwKSwKKwlGSUVMRChHVUVTVF9DUjMsIGd1ZXN0X2NyMyksCisJRklFTEQoR1VFU1RfQ1I0LCBndWVzdF9jcjQpLAorCUZJRUxEKEdVRVNUX0VTX0JBU0UsIGd1ZXN0X2VzX2Jhc2UpLAorCUZJRUxEKEdVRVNUX0NTX0JBU0UsIGd1ZXN0X2NzX2Jhc2UpLAorCUZJRUxEKEdVRVNUX1NTX0JBU0UsIGd1ZXN0X3NzX2Jhc2UpLAorCUZJRUxEKEdVRVNUX0RTX0JBU0UsIGd1ZXN0X2RzX2Jhc2UpLAorCUZJRUxEKEdVRVNUX0ZTX0JBU0UsIGd1ZXN0X2ZzX2Jhc2UpLAorCUZJRUxEKEdVRVNUX0dTX0JBU0UsIGd1ZXN0X2dzX2Jhc2UpLAorCUZJRUxEKEdVRVNUX0xEVFJfQkFTRSwgZ3Vlc3RfbGR0cl9iYXNlKSwKKwlGSUVMRChHVUVTVF9UUl9CQVNFLCBndWVzdF90cl9iYXNlKSwKKwlGSUVMRChHVUVTVF9HRFRSX0JBU0UsIGd1ZXN0X2dkdHJfYmFzZSksCisJRklFTEQoR1VFU1RfSURUUl9CQVNFLCBndWVzdF9pZHRyX2Jhc2UpLAorCUZJRUxEKEdVRVNUX0RSNywgZ3Vlc3RfZHI3KSwKKwlGSUVMRChHVUVTVF9SU1AsIGd1ZXN0X3JzcCksCisJRklFTEQoR1VFU1RfUklQLCBndWVzdF9yaXApLAorCUZJRUxEKEdVRVNUX1JGTEFHUywgZ3Vlc3RfcmZsYWdzKSwKKwlGSUVMRChHVUVTVF9QRU5ESU5HX0RCR19FWENFUFRJT05TLCBndWVzdF9wZW5kaW5nX2RiZ19leGNlcHRpb25zKSwKKwlGSUVMRChHVUVTVF9TWVNFTlRFUl9FU1AsIGd1ZXN0X3N5c2VudGVyX2VzcCksCisJRklFTEQoR1VFU1RfU1lTRU5URVJfRUlQLCBndWVzdF9zeXNlbnRlcl9laXApLAorCUZJRUxEKEhPU1RfQ1IwLCBob3N0X2NyMCksCisJRklFTEQoSE9TVF9DUjMsIGhvc3RfY3IzKSwKKwlGSUVMRChIT1NUX0NSNCwgaG9zdF9jcjQpLAorCUZJRUxEKEhPU1RfRlNfQkFTRSwgaG9zdF9mc19iYXNlKSwKKwlGSUVMRChIT1NUX0dTX0JBU0UsIGhvc3RfZ3NfYmFzZSksCisJRklFTEQoSE9TVF9UUl9CQVNFLCBob3N0X3RyX2Jhc2UpLAorCUZJRUxEKEhPU1RfR0RUUl9CQVNFLCBob3N0X2dkdHJfYmFzZSksCisJRklFTEQoSE9TVF9JRFRSX0JBU0UsIGhvc3RfaWR0cl9iYXNlKSwKKwlGSUVMRChIT1NUX0lBMzJfU1lTRU5URVJfRVNQLCBob3N0X2lhMzJfc3lzZW50ZXJfZXNwKSwKKwlGSUVMRChIT1NUX0lBMzJfU1lTRU5URVJfRUlQLCBob3N0X2lhMzJfc3lzZW50ZXJfZWlwKSwKKwlGSUVMRChIT1NUX1JTUCwgaG9zdF9yc3ApLAorCUZJRUxEKEhPU1RfUklQLCBob3N0X3JpcCksCit9Oworc3RhdGljIGNvbnN0IGludCBtYXhfdm1jc19maWVsZCA9IEFSUkFZX1NJWkUodm1jc19maWVsZF90b19vZmZzZXRfdGFibGUpOworCitzdGF0aWMgaW5saW5lIHNob3J0IHZtY3NfZmllbGRfdG9fb2Zmc2V0KHVuc2lnbmVkIGxvbmcgZmllbGQpCit7CisJaWYgKGZpZWxkID49IG1heF92bWNzX2ZpZWxkIHx8IHZtY3NfZmllbGRfdG9fb2Zmc2V0X3RhYmxlW2ZpZWxkXSA9PSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHZtY3NfZmllbGRfdG9fb2Zmc2V0X3RhYmxlW2ZpZWxkXTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm1jczEyICpnZXRfdm1jczEyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdG9fdm14KHZjcHUpLT5uZXN0ZWQuY3VycmVudF92bWNzMTI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqbmVzdGVkX2dldF9wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgYWRkcikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdmbl90b19wYWdlKHZjcHUtPmt2bSwgYWRkciA+PiBQQUdFX1NISUZUKTsKKwlpZiAoaXNfZXJyb3JfcGFnZShwYWdlKSkgeworCQlrdm1fcmVsZWFzZV9wYWdlX2NsZWFuKHBhZ2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyB2b2lkIG5lc3RlZF9yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJa3ZtX3JlbGVhc2VfcGFnZV9kaXJ0eShwYWdlKTsKK30KKworc3RhdGljIHZvaWQgbmVzdGVkX3JlbGVhc2VfcGFnZV9jbGVhbihzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlrdm1fcmVsZWFzZV9wYWdlX2NsZWFuKHBhZ2UpOworfQorCiBzdGF0aWMgdTY0IGNvbnN0cnVjdF9lcHRwKHVuc2lnbmVkIGxvbmcgcm9vdF9ocGEpOwogc3RhdGljIHZvaWQga3ZtX2NwdV92bXhvbih1NjQgYWRkcik7CiBzdGF0aWMgdm9pZCBrdm1fY3B1X3ZteG9mZih2b2lkKTsKQEAgLTIwMCw3ICs2MDYsMTEgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB2bWNzICosIHZteGFyZWEpOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB2bWNzICosIGN1cnJlbnRfdm1jcyk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGxpc3RfaGVhZCwgdmNwdXNfb25fY3B1KTsKKy8qCisgKiBXZSBtYWludGFpbiBhIHBlci1DUFUgbGlua2VkLWxpc3Qgb2YgVk1DUyBsb2FkZWQgb24gdGhhdCBDUFUuIFRoaXMgaXMgbmVlZGVkCisgKiB3aGVuIGEgQ1BVIGlzIGJyb3VnaHQgZG93biwgYW5kIHdlIG5lZWQgdG8gVk1DTEVBUiBhbGwgVk1DU3MgbG9hZGVkIG9uIGl0LgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGxpc3RfaGVhZCwgbG9hZGVkX3ZtY3NzX29uX2NwdSk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGRlc2NfcHRyLCBob3N0X2dkdCk7CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nICp2bXhfaW9fYml0bWFwX2E7CkBAIC00NDIsNiArODUyLDM1IEBACiAJcmV0dXJuIGZsZXhwcmlvcml0eV9lbmFibGVkOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgbmVzdGVkX2NwdV9oYXMoc3RydWN0IHZtY3MxMiAqdm1jczEyLCB1MzIgYml0KQoreworCXJldHVybiB2bWNzMTItPmNwdV9iYXNlZF92bV9leGVjX2NvbnRyb2wgJiBiaXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZXN0ZWRfY3B1X2hhczIoc3RydWN0IHZtY3MxMiAqdm1jczEyLCB1MzIgYml0KQoreworCXJldHVybiAodm1jczEyLT5jcHVfYmFzZWRfdm1fZXhlY19jb250cm9sICYKKwkJCUNQVV9CQVNFRF9BQ1RJVkFURV9TRUNPTkRBUllfQ09OVFJPTFMpICYmCisJCSh2bWNzMTItPnNlY29uZGFyeV92bV9leGVjX2NvbnRyb2wgJiBiaXQpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbmVzdGVkX2NwdV9oYXNfdmlydHVhbF9ubWlzKHN0cnVjdCB2bWNzMTIgKnZtY3MxMiwKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIHZtY3MxMi0+cGluX2Jhc2VkX3ZtX2V4ZWNfY29udHJvbCAmIFBJTl9CQVNFRF9WSVJUVUFMX05NSVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19leGNlcHRpb24odTMyIGludHJfaW5mbykKK3sKKwlyZXR1cm4gKGludHJfaW5mbyAmIChJTlRSX0lORk9fSU5UUl9UWVBFX01BU0sgfCBJTlRSX0lORk9fVkFMSURfTUFTSykpCisJCT09IChJTlRSX1RZUEVfSEFSRF9FWENFUFRJT04gfCBJTlRSX0lORk9fVkFMSURfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIG5lc3RlZF92bXhfdm1leGl0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CitzdGF0aWMgdm9pZCBuZXN0ZWRfdm14X2VudHJ5X2ZhaWx1cmUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJc3RydWN0IHZtY3MxMiAqdm1jczEyLAorCQkJdTMyIHJlYXNvbiwgdW5zaWduZWQgbG9uZyBxdWFsaWZpY2F0aW9uKTsKKwogc3RhdGljIGludCBfX2ZpbmRfbXNyX2luZGV4KHN0cnVjdCB2Y3B1X3ZteCAqdm14LCB1MzIgbXNyKQogewogCWludCBpOwpAQCAtNTAxLDYgKzk0MCwxMyBAQAogCQkgICAgICAgdm1jcywgcGh5c19hZGRyKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGxvYWRlZF92bWNzX2luaXQoc3RydWN0IGxvYWRlZF92bWNzICpsb2FkZWRfdm1jcykKK3sKKwl2bWNzX2NsZWFyKGxvYWRlZF92bWNzLT52bWNzKTsKKwlsb2FkZWRfdm1jcy0+Y3B1ID0gLTE7CisJbG9hZGVkX3ZtY3MtPmxhdW5jaGVkID0gMDsKK30KKwogc3RhdGljIHZvaWQgdm1jc19sb2FkKHN0cnVjdCB2bWNzICp2bWNzKQogewogCXU2NCBwaHlzX2FkZHIgPSBfX3BhKHZtY3MpOwpAQCAtNTEwLDI5ICs5NTYsMjggQEAKIAkJCTogIj1xbSIoZXJyb3IpIDogImEiKCZwaHlzX2FkZHIpLCAibSIocGh5c19hZGRyKQogCQkJOiAiY2MiLCAibWVtb3J5Iik7CiAJaWYgKGVycm9yKQotCQlwcmludGsoS0VSTl9FUlIgImt2bTogdm1wdHJsZCAlcC8lbGx4IGZhaWxcbiIsCisJCXByaW50ayhLRVJOX0VSUiAia3ZtOiB2bXB0cmxkICVwLyVsbHggZmFpbGVkXG4iLAogCQkgICAgICAgdm1jcywgcGh5c19hZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgX192Y3B1X2NsZWFyKHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIF9fbG9hZGVkX3ZtY3NfY2xlYXIodm9pZCAqYXJnKQogewotCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gYXJnOworCXN0cnVjdCBsb2FkZWRfdm1jcyAqbG9hZGVkX3ZtY3MgPSBhcmc7CiAJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAodm14LT52Y3B1LmNwdSA9PSBjcHUpCi0JCXZtY3NfY2xlYXIodm14LT52bWNzKTsKLQlpZiAocGVyX2NwdShjdXJyZW50X3ZtY3MsIGNwdSkgPT0gdm14LT52bWNzKQorCWlmIChsb2FkZWRfdm1jcy0+Y3B1ICE9IGNwdSkKKwkJcmV0dXJuOyAvKiB2Y3B1IG1pZ3JhdGlvbiBjYW4gcmFjZSB3aXRoIGNwdSBvZmZsaW5lICovCisJaWYgKHBlcl9jcHUoY3VycmVudF92bWNzLCBjcHUpID09IGxvYWRlZF92bWNzLT52bWNzKQogCQlwZXJfY3B1KGN1cnJlbnRfdm1jcywgY3B1KSA9IE5VTEw7Ci0JbGlzdF9kZWwoJnZteC0+bG9jYWxfdmNwdXNfbGluayk7Ci0Jdm14LT52Y3B1LmNwdSA9IC0xOwotCXZteC0+bGF1bmNoZWQgPSAwOworCWxpc3RfZGVsKCZsb2FkZWRfdm1jcy0+bG9hZGVkX3ZtY3NzX29uX2NwdV9saW5rKTsKKwlsb2FkZWRfdm1jc19pbml0KGxvYWRlZF92bWNzKTsKIH0KIAotc3RhdGljIHZvaWQgdmNwdV9jbGVhcihzdHJ1Y3QgdmNwdV92bXggKnZteCkKK3N0YXRpYyB2b2lkIGxvYWRlZF92bWNzX2NsZWFyKHN0cnVjdCBsb2FkZWRfdm1jcyAqbG9hZGVkX3ZtY3MpCiB7Ci0JaWYgKHZteC0+dmNwdS5jcHUgPT0gLTEpCi0JCXJldHVybjsKLQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUodm14LT52Y3B1LmNwdSwgX192Y3B1X2NsZWFyLCB2bXgsIDEpOworCWlmIChsb2FkZWRfdm1jcy0+Y3B1ICE9IC0xKQorCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoCisJCQlsb2FkZWRfdm1jcy0+Y3B1LCBfX2xvYWRlZF92bWNzX2NsZWFyLCBsb2FkZWRfdm1jcywgMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB2cGlkX3N5bmNfdmNwdV9zaW5nbGUoc3RydWN0IHZjcHVfdm14ICp2bXgpCkBAIC01ODUsMjYgKzEwMzAsMjYgQEAKIAl9CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZtY3NfcmVhZGwodW5zaWduZWQgbG9uZyBmaWVsZCkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZyB2bWNzX3JlYWRsKHVuc2lnbmVkIGxvbmcgZmllbGQpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAotCWFzbSB2b2xhdGlsZSAoX19leChBU01fVk1YX1ZNUkVBRF9SRFhfUkFYKQotCQkgICAgICA6ICIrYSIodmFsdWUpIDogImQiKGZpZWxkKSA6ICJjYyIpOworCWFzbSB2b2xhdGlsZSAoX19leF9jbGVhcihBU01fVk1YX1ZNUkVBRF9SRFhfUkFYLCAiJTAiKQorCQkgICAgICA6ICI9YSIodmFsdWUpIDogImQiKGZpZWxkKSA6ICJjYyIpOwogCXJldHVybiB2YWx1ZTsKIH0KIAotc3RhdGljIHUxNiB2bWNzX3JlYWQxNih1bnNpZ25lZCBsb25nIGZpZWxkKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSB1MTYgdm1jc19yZWFkMTYodW5zaWduZWQgbG9uZyBmaWVsZCkKIHsKIAlyZXR1cm4gdm1jc19yZWFkbChmaWVsZCk7CiB9CiAKLXN0YXRpYyB1MzIgdm1jc19yZWFkMzIodW5zaWduZWQgbG9uZyBmaWVsZCkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTMyIHZtY3NfcmVhZDMyKHVuc2lnbmVkIGxvbmcgZmllbGQpCiB7CiAJcmV0dXJuIHZtY3NfcmVhZGwoZmllbGQpOwogfQogCi1zdGF0aWMgdTY0IHZtY3NfcmVhZDY0KHVuc2lnbmVkIGxvbmcgZmllbGQpCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHU2NCB2bWNzX3JlYWQ2NCh1bnNpZ25lZCBsb25nIGZpZWxkKQogewogI2lmZGVmIENPTkZJR19YODZfNjQKIAlyZXR1cm4gdm1jc19yZWFkbChmaWVsZCk7CkBAIC03MzEsNiArMTE3NiwxNSBAQAogCQllYiAmPSB+KDF1IDw8IFBGX1ZFQ1RPUik7IC8qIGJ5cGFzc19ndWVzdF9wZiA9IDAgKi8KIAlpZiAodmNwdS0+ZnB1X2FjdGl2ZSkKIAkJZWIgJj0gfigxdSA8PCBOTV9WRUNUT1IpOworCisJLyogV2hlbiB3ZSBhcmUgcnVubmluZyBhIG5lc3RlZCBMMiBndWVzdCBhbmQgTDEgc3BlY2lmaWVkIGZvciBpdCBhCisJICogY2VydGFpbiBleGNlcHRpb24gYml0bWFwLCB3ZSBtdXN0IHRyYXAgdGhlIHNhbWUgZXhjZXB0aW9ucyBhbmQgcGFzcworCSAqIHRoZW0gdG8gTDEuIFdoZW4gcnVubmluZyBMMiwgd2Ugd2lsbCBvbmx5IGhhbmRsZSB0aGUgZXhjZXB0aW9ucworCSAqIHNwZWNpZmllZCBhYm92ZSBpZiBMMSBkaWQgbm90IHdhbnQgdGhlbS4KKwkgKi8KKwlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkKKwkJZWIgfD0gZ2V0X3ZtY3MxMih2Y3B1KS0+ZXhjZXB0aW9uX2JpdG1hcDsKKwogCXZtY3Nfd3JpdGUzMihFWENFUFRJT05fQklUTUFQLCBlYik7CiB9CiAKQEAgLTk3MSwyMiArMTQyNSwyMiBAQAogCiAJaWYgKCF2bW1fZXhjbHVzaXZlKQogCQlrdm1fY3B1X3ZteG9uKHBoeXNfYWRkcik7Ci0JZWxzZSBpZiAodmNwdS0+Y3B1ICE9IGNwdSkKLQkJdmNwdV9jbGVhcih2bXgpOworCWVsc2UgaWYgKHZteC0+bG9hZGVkX3ZtY3MtPmNwdSAhPSBjcHUpCisJCWxvYWRlZF92bWNzX2NsZWFyKHZteC0+bG9hZGVkX3ZtY3MpOwogCi0JaWYgKHBlcl9jcHUoY3VycmVudF92bWNzLCBjcHUpICE9IHZteC0+dm1jcykgewotCQlwZXJfY3B1KGN1cnJlbnRfdm1jcywgY3B1KSA9IHZteC0+dm1jczsKLQkJdm1jc19sb2FkKHZteC0+dm1jcyk7CisJaWYgKHBlcl9jcHUoY3VycmVudF92bWNzLCBjcHUpICE9IHZteC0+bG9hZGVkX3ZtY3MtPnZtY3MpIHsKKwkJcGVyX2NwdShjdXJyZW50X3ZtY3MsIGNwdSkgPSB2bXgtPmxvYWRlZF92bWNzLT52bWNzOworCQl2bWNzX2xvYWQodm14LT5sb2FkZWRfdm1jcy0+dm1jcyk7CiAJfQogCi0JaWYgKHZjcHUtPmNwdSAhPSBjcHUpIHsKKwlpZiAodm14LT5sb2FkZWRfdm1jcy0+Y3B1ICE9IGNwdSkgewogCQlzdHJ1Y3QgZGVzY19wdHIgKmdkdCA9ICZfX2dldF9jcHVfdmFyKGhvc3RfZ2R0KTsKIAkJdW5zaWduZWQgbG9uZyBzeXNlbnRlcl9lc3A7CiAKIAkJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1RMQl9GTFVTSCwgdmNwdSk7CiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCWxpc3RfYWRkKCZ2bXgtPmxvY2FsX3ZjcHVzX2xpbmssCi0JCQkgJnBlcl9jcHUodmNwdXNfb25fY3B1LCBjcHUpKTsKKwkJbGlzdF9hZGQoJnZteC0+bG9hZGVkX3ZtY3MtPmxvYWRlZF92bWNzc19vbl9jcHVfbGluaywKKwkJCSAmcGVyX2NwdShsb2FkZWRfdm1jc3Nfb25fY3B1LCBjcHUpKTsKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJCS8qCkBAIC05OTgsNiArMTQ1Miw3IEBACiAKIAkJcmRtc3JsKE1TUl9JQTMyX1NZU0VOVEVSX0VTUCwgc3lzZW50ZXJfZXNwKTsKIAkJdm1jc193cml0ZWwoSE9TVF9JQTMyX1NZU0VOVEVSX0VTUCwgc3lzZW50ZXJfZXNwKTsgLyogMjIuMi4zICovCisJCXZteC0+bG9hZGVkX3ZtY3MtPmNwdSA9IGNwdTsKIAl9CiB9CiAKQEAgLTEwMDUsNyArMTQ2MCw4IEBACiB7CiAJX192bXhfbG9hZF9ob3N0X3N0YXRlKHRvX3ZteCh2Y3B1KSk7CiAJaWYgKCF2bW1fZXhjbHVzaXZlKSB7Ci0JCV9fdmNwdV9jbGVhcih0b192bXgodmNwdSkpOworCQlfX2xvYWRlZF92bWNzX2NsZWFyKHRvX3ZteCh2Y3B1KS0+bG9hZGVkX3ZtY3MpOworCQl2Y3B1LT5jcHUgPSAtMTsKIAkJa3ZtX2NwdV92bXhvZmYoKTsKIAl9CiB9CkBAIC0xMDIzLDE5ICsxNDc5LDU1IEBACiAJdm1jc193cml0ZWwoR1VFU1RfQ1IwLCBjcjApOwogCXVwZGF0ZV9leGNlcHRpb25fYml0bWFwKHZjcHUpOwogCXZjcHUtPmFyY2guY3IwX2d1ZXN0X293bmVkX2JpdHMgPSBYODZfQ1IwX1RTOworCWlmIChpc19ndWVzdF9tb2RlKHZjcHUpKQorCQl2Y3B1LT5hcmNoLmNyMF9ndWVzdF9vd25lZF9iaXRzICY9CisJCQl+Z2V0X3ZtY3MxMih2Y3B1KS0+Y3IwX2d1ZXN0X2hvc3RfbWFzazsKIAl2bWNzX3dyaXRlbChDUjBfR1VFU1RfSE9TVF9NQVNLLCB+dmNwdS0+YXJjaC5jcjBfZ3Vlc3Rfb3duZWRfYml0cyk7CiB9CiAKIHN0YXRpYyB2b2lkIHZteF9kZWNhY2hlX2NyMF9ndWVzdF9iaXRzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKKy8qCisgKiBSZXR1cm4gdGhlIGNyMCB2YWx1ZSB0aGF0IGEgbmVzdGVkIGd1ZXN0IHdvdWxkIHJlYWQuIFRoaXMgaXMgYSBjb21iaW5hdGlvbgorICogb2YgdGhlIHJlYWwgY3IwIHVzZWQgdG8gcnVuIHRoZSBndWVzdCAoZ3Vlc3RfY3IwKSwgYW5kIHRoZSBiaXRzIHNoYWRvd2VkIGJ5CisgKiBpdHMgaHlwZXJ2aXNvciAoY3IwX3JlYWRfc2hhZG93KS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5lc3RlZF9yZWFkX2NyMChzdHJ1Y3Qgdm1jczEyICpmaWVsZHMpCit7CisJcmV0dXJuIChmaWVsZHMtPmd1ZXN0X2NyMCAmIH5maWVsZHMtPmNyMF9ndWVzdF9ob3N0X21hc2spIHwKKwkJKGZpZWxkcy0+Y3IwX3JlYWRfc2hhZG93ICYgZmllbGRzLT5jcjBfZ3Vlc3RfaG9zdF9tYXNrKTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBuZXN0ZWRfcmVhZF9jcjQoc3RydWN0IHZtY3MxMiAqZmllbGRzKQoreworCXJldHVybiAoZmllbGRzLT5ndWVzdF9jcjQgJiB+ZmllbGRzLT5jcjRfZ3Vlc3RfaG9zdF9tYXNrKSB8CisJCShmaWVsZHMtPmNyNF9yZWFkX3NoYWRvdyAmIGZpZWxkcy0+Y3I0X2d1ZXN0X2hvc3RfbWFzayk7Cit9CisKIHN0YXRpYyB2b2lkIHZteF9mcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CisJLyogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHZjcHUtPmZwdV9hY3RpdmUgPSAwIGhlcmUuIFRoZSBjYWxsZXIgbXVzdAorCSAqIHNldCB0aGlzICpiZWZvcmUqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKwkgKi8KIAl2bXhfZGVjYWNoZV9jcjBfZ3Vlc3RfYml0cyh2Y3B1KTsKIAl2bWNzX3NldF9iaXRzKEdVRVNUX0NSMCwgWDg2X0NSMF9UUyB8IFg4Nl9DUjBfTVApOwogCXVwZGF0ZV9leGNlcHRpb25fYml0bWFwKHZjcHUpOwogCXZjcHUtPmFyY2guY3IwX2d1ZXN0X293bmVkX2JpdHMgPSAwOwogCXZtY3Nfd3JpdGVsKENSMF9HVUVTVF9IT1NUX01BU0ssIH52Y3B1LT5hcmNoLmNyMF9ndWVzdF9vd25lZF9iaXRzKTsKLQl2bWNzX3dyaXRlbChDUjBfUkVBRF9TSEFET1csIHZjcHUtPmFyY2guY3IwKTsKKwlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkgeworCQkvKgorCQkgKiBMMSdzIHNwZWNpZmllZCByZWFkIHNoYWRvdyBtaWdodCBub3QgY29udGFpbiB0aGUgVFMgYml0LAorCQkgKiBzbyBub3cgdGhhdCB3ZSB0dXJuZWQgb24gc2hhZG93aW5nIG9mIHRoaXMgYml0LCB3ZSBuZWVkIHRvCisJCSAqIHNldCB0aGlzIGJpdCBvZiB0aGUgc2hhZG93LiBMaWtlIGluIG5lc3RlZF92bXhfcnVuIHdlIG5lZWQKKwkJICogbmVzdGVkX3JlYWRfY3IwKHZtY3MxMiksIGJ1dCB2bWNzMTItPmd1ZXN0X2NyMCBpcyBub3QgeWV0CisJCSAqIHVwLXRvLWRhdGUgaGVyZSBiZWNhdXNlIHdlIGp1c3QgZGVjYWNoZWQgY3IwLlRTIChhbmQgd2UnbGwKKwkJICogb25seSB1cGRhdGUgdm1jczEyLT5ndWVzdF9jcjAgb24gbmVzdGVkIGV4aXQpLgorCQkgKi8KKwkJc3RydWN0IHZtY3MxMiAqdm1jczEyID0gZ2V0X3ZtY3MxMih2Y3B1KTsKKwkJdm1jczEyLT5ndWVzdF9jcjAgPSAodm1jczEyLT5ndWVzdF9jcjAgJiB+WDg2X0NSMF9UUykgfAorCQkJKHZjcHUtPmFyY2guY3IwICYgWDg2X0NSMF9UUyk7CisJCXZtY3Nfd3JpdGVsKENSMF9SRUFEX1NIQURPVywgbmVzdGVkX3JlYWRfY3IwKHZtY3MxMikpOworCX0gZWxzZQorCQl2bWNzX3dyaXRlbChDUjBfUkVBRF9TSEFET1csIHZjcHUtPmFyY2guY3IwKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgdm14X2dldF9yZmxhZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMTExOSw2ICsxNjExLDI1IEBACiAJCXZtY3Nfd3JpdGUzMihHVUVTVF9BQ1RJVklUWV9TVEFURSwgR1VFU1RfQUNUSVZJVFlfQUNUSVZFKTsKIH0KIAorLyoKKyAqIEtWTSB3YW50cyB0byBpbmplY3QgcGFnZS1mYXVsdHMgd2hpY2ggaXQgZ290IHRvIHRoZSBndWVzdC4gVGhpcyBmdW5jdGlvbgorICogY2hlY2tzIHdoZXRoZXIgaW4gYSBuZXN0ZWQgZ3Vlc3QsIHdlIG5lZWQgdG8gaW5qZWN0IHRoZW0gdG8gTDEgb3IgTDIuCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgaXQgaXMgY2FsbGVkIHdpdGggdGhlIGV4aXQgcmVhc29uIGluIHZtY3MwMiBiZWluZworICogYSAjUEYgZXhjZXB0aW9uICh0aGlzIGlzIHRoZSBvbmx5IGNhc2UgaW4gd2hpY2ggS1ZNIGluamVjdHMgYSAjUEYgd2hlbiBMMgorICogaXMgcnVubmluZykuCisgKi8KK3N0YXRpYyBpbnQgbmVzdGVkX3BmX2hhbmRsZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCB2bWNzMTIgKnZtY3MxMiA9IGdldF92bWNzMTIodmNwdSk7CisKKwkvKiBUT0RPOiBhbHNvIGNoZWNrIFBGRUNfTUFUQ0gvTUFTSywgbm90IGp1c3QgRUIuUEYuICovCisJaWYgKCEodm1jczEyLT5leGNlcHRpb25fYml0bWFwICYgUEZfVkVDVE9SKSkKKwkJcmV0dXJuIDA7CisKKwluZXN0ZWRfdm14X3ZtZXhpdCh2Y3B1KTsKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIHZvaWQgdm14X3F1ZXVlX2V4Y2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIG5yLAogCQkJCWJvb2wgaGFzX2Vycm9yX2NvZGUsIHUzMiBlcnJvcl9jb2RlLAogCQkJCWJvb2wgcmVpbmplY3QpCkBAIC0xMTI2LDYgKzE2MzcsMTAgQEAKIAlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKIAl1MzIgaW50cl9pbmZvID0gbnIgfCBJTlRSX0lORk9fVkFMSURfTUFTSzsKIAorCWlmIChuciA9PSBQRl9WRUNUT1IgJiYgaXNfZ3Vlc3RfbW9kZSh2Y3B1KSAmJgorCQluZXN0ZWRfcGZfaGFuZGxlZCh2Y3B1KSkKKwkJcmV0dXJuOworCiAJaWYgKGhhc19lcnJvcl9jb2RlKSB7CiAJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9FWENFUFRJT05fRVJST1JfQ09ERSwgZXJyb3JfY29kZSk7CiAJCWludHJfaW5mbyB8PSBJTlRSX0lORk9fREVMSVZFUl9DT0RFX01BU0s7CkBAIC0xMjQ4LDEyICsxNzYzLDI0IEBACiBzdGF0aWMgdm9pZCB2bXhfd3JpdGVfdHNjX29mZnNldChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBvZmZzZXQpCiB7CiAJdm1jc193cml0ZTY0KFRTQ19PRkZTRVQsIG9mZnNldCk7CisJaWYgKGlzX2d1ZXN0X21vZGUodmNwdSkpCisJCS8qCisJCSAqIFdlJ3JlIGhlcmUgaWYgTDEgY2hvc2Ugbm90IHRvIHRyYXAgdGhlIFRTQyBNU1IuIFNpbmNlCisJCSAqIHByZXBhcmVfdm1jczEyKCkgZG9lcyBub3QgY29weSB0c2Nfb2Zmc2V0LCB3ZSBuZWVkIHRvIGFsc28KKwkJICogc2V0IHRoZSB2bWNzMTIgZmllbGQgaGVyZS4KKwkJICovCisJCWdldF92bWNzMTIodmNwdSktPnRzY19vZmZzZXQgPSBvZmZzZXQgLQorCQkJdG9fdm14KHZjcHUpLT5uZXN0ZWQudm1jczAxX3RzY19vZmZzZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHZteF9hZGp1c3RfdHNjX29mZnNldChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHM2NCBhZGp1c3RtZW50KQogewogCXU2NCBvZmZzZXQgPSB2bWNzX3JlYWQ2NChUU0NfT0ZGU0VUKTsKIAl2bWNzX3dyaXRlNjQoVFNDX09GRlNFVCwgb2Zmc2V0ICsgYWRqdXN0bWVudCk7CisJaWYgKGlzX2d1ZXN0X21vZGUodmNwdSkpIHsKKwkJLyogRXZlbiB3aGVuIHJ1bm5pbmcgTDIsIHRoZSBhZGp1c3RtZW50IG5lZWRzIHRvIGFwcGx5IHRvIEwxICovCisJCXRvX3ZteCh2Y3B1KS0+bmVzdGVkLnZtY3MwMV90c2Nfb2Zmc2V0ICs9IGFkanVzdG1lbnQ7CisJfQogfQogCiBzdGF0aWMgdTY0IHZteF9jb21wdXRlX3RzY19vZmZzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgdGFyZ2V0X3RzYykKQEAgLTEyNjEsNiArMTc4OCwyMzYgQEAKIAlyZXR1cm4gdGFyZ2V0X3RzYyAtIG5hdGl2ZV9yZWFkX3RzYygpOwogfQogCitzdGF0aWMgYm9vbCBndWVzdF9jcHVpZF9oYXNfdm14KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiAqYmVzdCA9IGt2bV9maW5kX2NwdWlkX2VudHJ5KHZjcHUsIDEsIDApOworCXJldHVybiBiZXN0ICYmIChiZXN0LT5lY3ggJiAoMSA8PCAoWDg2X0ZFQVRVUkVfVk1YICYgMzEpKSk7Cit9CisKKy8qCisgKiBuZXN0ZWRfdm14X2FsbG93ZWQoKSBjaGVja3Mgd2hldGhlciBhIGd1ZXN0IHNob3VsZCBiZSBhbGxvd2VkIHRvIHVzZSBWTVgKKyAqIGluc3RydWN0aW9ucyBhbmQgTVNScyAoaS5lLiwgbmVzdGVkIFZNWCkuIE5lc3RlZCBWTVggaXMgZGlzYWJsZWQgZm9yCisgKiBhbGwgZ3Vlc3RzIGlmIHRoZSAibmVzdGVkIiBtb2R1bGUgb3B0aW9uIGlzIG9mZiwgYW5kIGNhbiBhbHNvIGJlIGRpc2FibGVkCisgKiBmb3IgYSBzaW5nbGUgZ3Vlc3QgYnkgZGlzYWJsaW5nIGl0cyBWTVggY3B1aWQgYml0LgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgbmVzdGVkX3ZteF9hbGxvd2VkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gbmVzdGVkICYmIGd1ZXN0X2NwdWlkX2hhc192bXgodmNwdSk7Cit9CisKKy8qCisgKiBuZXN0ZWRfdm14X3NldHVwX2N0bHNfbXNycygpIHNldHMgdXAgdmFyaWFibGVzIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0byBiZQorICogcmV0dXJuZWQgZm9yIHRoZSB2YXJpb3VzIFZNWCBjb250cm9scyBNU1JzIHdoZW4gbmVzdGVkIFZNWCBpcyBlbmFibGVkLgorICogVGhlIHNhbWUgdmFsdWVzIHNob3VsZCBhbHNvIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdm1jczEyIGNvbnRyb2wgZmllbGRzIGFyZQorICogdmFsaWQgZHVyaW5nIG5lc3RlZCBlbnRyeSBmcm9tIEwxIHRvIEwyLgorICogRWFjaCBvZiB0aGVzZSBjb250cm9sIG1zcnMgaGFzIGEgbG93IGFuZCBoaWdoIDMyLWJpdCBoYWxmOiBBIGxvdyBiaXQgaXMgb24KKyAqIGlmIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgKDMyLWJpdCkgY29udHJvbCBmaWVsZCAqbXVzdCogYmUgb24sIGFuZCBhCisgKiBiaXQgaW4gdGhlIGhpZ2ggaGFsZiBpcyBvbiBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGNvbnRyb2wgZmllbGQKKyAqIG1heSBiZSBvbi4gU2VlIGFsc28gdm14X2NvbnRyb2xfdmVyaWZ5KCkuCisgKiBUT0RPOiBhbGxvdyB0aGVzZSB2YXJpYWJsZXMgdG8gYmUgbW9kaWZpZWQgKGRvd25ncmFkZWQpIGJ5IG1vZHVsZSBvcHRpb25zCisgKiBvciBvdGhlciBtZWFucy4KKyAqLworc3RhdGljIHUzMiBuZXN0ZWRfdm14X3Byb2NiYXNlZF9jdGxzX2xvdywgbmVzdGVkX3ZteF9wcm9jYmFzZWRfY3Rsc19oaWdoOworc3RhdGljIHUzMiBuZXN0ZWRfdm14X3NlY29uZGFyeV9jdGxzX2xvdywgbmVzdGVkX3ZteF9zZWNvbmRhcnlfY3Rsc19oaWdoOworc3RhdGljIHUzMiBuZXN0ZWRfdm14X3BpbmJhc2VkX2N0bHNfbG93LCBuZXN0ZWRfdm14X3BpbmJhc2VkX2N0bHNfaGlnaDsKK3N0YXRpYyB1MzIgbmVzdGVkX3ZteF9leGl0X2N0bHNfbG93LCBuZXN0ZWRfdm14X2V4aXRfY3Rsc19oaWdoOworc3RhdGljIHUzMiBuZXN0ZWRfdm14X2VudHJ5X2N0bHNfbG93LCBuZXN0ZWRfdm14X2VudHJ5X2N0bHNfaGlnaDsKK3N0YXRpYyBfX2luaXQgdm9pZCBuZXN0ZWRfdm14X3NldHVwX2N0bHNfbXNycyh2b2lkKQoreworCS8qCisJICogTm90ZSB0aGF0IGFzIGEgZ2VuZXJhbCBydWxlLCB0aGUgaGlnaCBoYWxmIG9mIHRoZSBNU1JzIChiaXRzIGluCisJICogdGhlIGNvbnRyb2wgZmllbGRzIHdoaWNoIG1heSBiZSAxKSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYnkgdGhlCisJICogaW50ZXJzZWN0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlJ3MgTVNSIChpLmUuLCBmZWF0dXJlcyB3aGljaAorCSAqIGNhbiBiZSBzdXBwb3J0ZWQpIGFuZCB0aGUgbGlzdCBvZiBmZWF0dXJlcyB3ZSB3YW50IHRvIGV4cG9zZSAtCisJICogYmVjYXVzZSB0aGV5IGFyZSBrbm93biB0byBiZSBwcm9wZXJseSBzdXBwb3J0ZWQgaW4gb3VyIGNvZGUuCisJICogQWxzbywgdXN1YWxseSwgdGhlIGxvdyBoYWxmIG9mIHRoZSBNU1JzIChiaXRzIHdoaWNoIG11c3QgYmUgMSkgY2FuCisJICogYmUgc2V0IHRvIDAsIG1lYW5pbmcgdGhhdCBMMSBtYXkgdHVybiBvZmYgYW55IG9mIHRoZXNlIGJpdHMuIFRoZQorCSAqIHJlYXNvbiBpcyB0aGF0IGlmIG9uZSBvZiB0aGVzZSBiaXRzIGlzIG5lY2Vzc2FyeSwgaXQgd2lsbCBhcHBlYXIKKwkgKiBpbiB2bWNzMDEgYW5kIHByZXBhcmVfdm1jczAyLCB3aGVuIGl0IGJpdHdpc2Utb3IncyB0aGUgY29udHJvbAorCSAqIGZpZWxkcyBvZiB2bWNzMDEgYW5kIHZtY3MwMiwgd2lsbCB0dXJuIHRoZXNlIGJpdHMgb2ZmIC0gYW5kCisJICogbmVzdGVkX3ZteF9leGl0X2hhbmRsZWQoKSB3aWxsIG5vdCBwYXNzIHJlbGF0ZWQgZXhpdHMgdG8gTDEuCisJICogVGhlc2UgcnVsZXMgaGF2ZSBleGNlcHRpb25zIGJlbG93LgorCSAqLworCisJLyogcGluLWJhc2VkIGNvbnRyb2xzICovCisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gdGhlIEludGVsIHNwZWMsIGlmIGJpdCA1NSBvZiBWTVhfQkFTSUMgaXMgb2ZmIChhcyBpdCBpcworCSAqIGluIG91ciBjYXNlKSwgYml0cyAxLCAyIGFuZCA0IChpLmUuLCAweDE2KSBtdXN0IGJlIDEgaW4gdGhpcyBNU1IuCisJICovCisJbmVzdGVkX3ZteF9waW5iYXNlZF9jdGxzX2xvdyA9IDB4MTYgOworCW5lc3RlZF92bXhfcGluYmFzZWRfY3Rsc19oaWdoID0gMHgxNiB8CisJCVBJTl9CQVNFRF9FWFRfSU5UUl9NQVNLIHwgUElOX0JBU0VEX05NSV9FWElUSU5HIHwKKwkJUElOX0JBU0VEX1ZJUlRVQUxfTk1JUzsKKworCS8qIGV4aXQgY29udHJvbHMgKi8KKwluZXN0ZWRfdm14X2V4aXRfY3Rsc19sb3cgPSAwOworCS8qIE5vdGUgdGhhdCBndWVzdCB1c2Ugb2YgVk1fRVhJVF9BQ0tfSU5UUl9PTl9FWElUIGlzIG5vdCBzdXBwb3J0ZWQuICovCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCW5lc3RlZF92bXhfZXhpdF9jdGxzX2hpZ2ggPSBWTV9FWElUX0hPU1RfQUREUl9TUEFDRV9TSVpFOworI2Vsc2UKKwluZXN0ZWRfdm14X2V4aXRfY3Rsc19oaWdoID0gMDsKKyNlbmRpZgorCisJLyogZW50cnkgY29udHJvbHMgKi8KKwlyZG1zcihNU1JfSUEzMl9WTVhfRU5UUllfQ1RMUywKKwkJbmVzdGVkX3ZteF9lbnRyeV9jdGxzX2xvdywgbmVzdGVkX3ZteF9lbnRyeV9jdGxzX2hpZ2gpOworCW5lc3RlZF92bXhfZW50cnlfY3Rsc19sb3cgPSAwOworCW5lc3RlZF92bXhfZW50cnlfY3Rsc19oaWdoICY9CisJCVZNX0VOVFJZX0xPQURfSUEzMl9QQVQgfCBWTV9FTlRSWV9JQTMyRV9NT0RFOworCisJLyogY3B1LWJhc2VkIGNvbnRyb2xzICovCisJcmRtc3IoTVNSX0lBMzJfVk1YX1BST0NCQVNFRF9DVExTLAorCQluZXN0ZWRfdm14X3Byb2NiYXNlZF9jdGxzX2xvdywgbmVzdGVkX3ZteF9wcm9jYmFzZWRfY3Rsc19oaWdoKTsKKwluZXN0ZWRfdm14X3Byb2NiYXNlZF9jdGxzX2xvdyA9IDA7CisJbmVzdGVkX3ZteF9wcm9jYmFzZWRfY3Rsc19oaWdoICY9CisJCUNQVV9CQVNFRF9WSVJUVUFMX0lOVFJfUEVORElORyB8IENQVV9CQVNFRF9VU0VfVFNDX09GRlNFVElORyB8CisJCUNQVV9CQVNFRF9ITFRfRVhJVElORyB8IENQVV9CQVNFRF9JTlZMUEdfRVhJVElORyB8CisJCUNQVV9CQVNFRF9NV0FJVF9FWElUSU5HIHwgQ1BVX0JBU0VEX0NSM19MT0FEX0VYSVRJTkcgfAorCQlDUFVfQkFTRURfQ1IzX1NUT1JFX0VYSVRJTkcgfAorI2lmZGVmIENPTkZJR19YODZfNjQKKwkJQ1BVX0JBU0VEX0NSOF9MT0FEX0VYSVRJTkcgfCBDUFVfQkFTRURfQ1I4X1NUT1JFX0VYSVRJTkcgfAorI2VuZGlmCisJCUNQVV9CQVNFRF9NT1ZfRFJfRVhJVElORyB8IENQVV9CQVNFRF9VTkNPTkRfSU9fRVhJVElORyB8CisJCUNQVV9CQVNFRF9VU0VfSU9fQklUTUFQUyB8IENQVV9CQVNFRF9NT05JVE9SX0VYSVRJTkcgfAorCQlDUFVfQkFTRURfQUNUSVZBVEVfU0VDT05EQVJZX0NPTlRST0xTOworCS8qCisJICogV2UgY2FuIGFsbG93IHNvbWUgZmVhdHVyZXMgZXZlbiB3aGVuIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisJICogaGFyZHdhcmUuIEZvciBleGFtcGxlLCBMMSBjYW4gc3BlY2lmeSBhbiBNU1IgYml0bWFwIC0gYW5kIHdlCisJICogY2FuIHVzZSBpdCB0byBhdm9pZCBleGl0cyB0byBMMSAtIGV2ZW4gd2hlbiBMMCBydW5zIEwyCisJICogd2l0aG91dCBNU1IgYml0bWFwcy4KKwkgKi8KKwluZXN0ZWRfdm14X3Byb2NiYXNlZF9jdGxzX2hpZ2ggfD0gQ1BVX0JBU0VEX1VTRV9NU1JfQklUTUFQUzsKKworCS8qIHNlY29uZGFyeSBjcHUtYmFzZWQgY29udHJvbHMgKi8KKwlyZG1zcihNU1JfSUEzMl9WTVhfUFJPQ0JBU0VEX0NUTFMyLAorCQluZXN0ZWRfdm14X3NlY29uZGFyeV9jdGxzX2xvdywgbmVzdGVkX3ZteF9zZWNvbmRhcnlfY3Rsc19oaWdoKTsKKwluZXN0ZWRfdm14X3NlY29uZGFyeV9jdGxzX2xvdyA9IDA7CisJbmVzdGVkX3ZteF9zZWNvbmRhcnlfY3Rsc19oaWdoICY9CisJCVNFQ09OREFSWV9FWEVDX1ZJUlRVQUxJWkVfQVBJQ19BQ0NFU1NFUzsKK30KKworc3RhdGljIGlubGluZSBib29sIHZteF9jb250cm9sX3ZlcmlmeSh1MzIgY29udHJvbCwgdTMyIGxvdywgdTMyIGhpZ2gpCit7CisJLyoKKwkgKiBCaXRzIDAgaW4gaGlnaCBtdXN0IGJlIDAsIGFuZCBiaXRzIDEgaW4gbG93IG11c3QgYmUgMS4KKwkgKi8KKwlyZXR1cm4gKChjb250cm9sICYgaGlnaCkgfCBsb3cpID09IGNvbnRyb2w7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IHZteF9jb250cm9sX21zcih1MzIgbG93LCB1MzIgaGlnaCkKK3sKKwlyZXR1cm4gbG93IHwgKCh1NjQpaGlnaCA8PCAzMik7Cit9CisKKy8qCisgKiBJZiB3ZSBhbGxvdyBvdXIgZ3Vlc3QgdG8gdXNlIFZNWCBpbnN0cnVjdGlvbnMgKGkuZS4sIG5lc3RlZCBWTVgpLCB3ZSBzaG91bGQKKyAqIGFsc28gbGV0IGl0IHVzZSBWTVgtc3BlY2lmaWMgTVNScy4KKyAqIHZteF9nZXRfdm14X21zcigpIGFuZCB2bXhfc2V0X3ZteF9tc3IoKSByZXR1cm4gMSB3aGVuIHdlIGhhbmRsZWQgYQorICogVk1YLXNwZWNpZmljIE1TUiwgb3IgMCB3aGVuIHdlIGhhdmVuJ3QgKGFuZCB0aGUgY2FsbGVyIHNob3VsZCBoYW5kbGUgaXQKKyAqIGxpa2UgYWxsIG90aGVyIE1TUnMpLgorICovCitzdGF0aWMgaW50IHZteF9nZXRfdm14X21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBtc3JfaW5kZXgsIHU2NCAqcGRhdGEpCit7CisJaWYgKCFuZXN0ZWRfdm14X2FsbG93ZWQodmNwdSkgJiYgbXNyX2luZGV4ID49IE1TUl9JQTMyX1ZNWF9CQVNJQyAmJgorCQkgICAgIG1zcl9pbmRleCA8PSBNU1JfSUEzMl9WTVhfVFJVRV9FTlRSWV9DVExTKSB7CisJCS8qCisJCSAqIEFjY29yZGluZyB0byB0aGUgc3BlYywgcHJvY2Vzc29ycyB3aGljaCBkbyBub3Qgc3VwcG9ydCBWTVgKKwkJICogc2hvdWxkIHRocm93IGEgI0dQKDApIHdoZW4gVk1YIGNhcGFiaWxpdHkgTVNScyBhcmUgcmVhZC4KKwkJICovCisJCWt2bV9xdWV1ZV9leGNlcHRpb25fZSh2Y3B1LCBHUF9WRUNUT1IsIDApOworCQlyZXR1cm4gMTsKKwl9CisKKwlzd2l0Y2ggKG1zcl9pbmRleCkgeworCWNhc2UgTVNSX0lBMzJfRkVBVFVSRV9DT05UUk9MOgorCQkqcGRhdGEgPSAwOworCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX1ZNWF9CQVNJQzoKKwkJLyoKKwkJICogVGhpcyBNU1IgcmVwb3J0cyBzb21lIGluZm9ybWF0aW9uIGFib3V0IFZNWCBzdXBwb3J0LiBXZQorCQkgKiBzaG91bGQgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBWTVggd2UgZW11bGF0ZSBmb3IgdGhlCisJCSAqIGd1ZXN0LCBhbmQgdGhlIFZNQ1Mgc3RydWN0dXJlIHdlIGdpdmUgaXQgLSBub3QgYWJvdXQgdGhlCisJCSAqIFZNWCBzdXBwb3J0IG9mIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlLgorCQkgKi8KKwkJKnBkYXRhID0gVk1DUzEyX1JFVklTSU9OIHwKKwkJCSAgICgodTY0KVZNQ1MxMl9TSVpFIDw8IFZNWF9CQVNJQ19WTUNTX1NJWkVfU0hJRlQpIHwKKwkJCSAgIChWTVhfQkFTSUNfTUVNX1RZUEVfV0IgPDwgVk1YX0JBU0lDX01FTV9UWVBFX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9WTVhfVFJVRV9QSU5CQVNFRF9DVExTOgorCWNhc2UgTVNSX0lBMzJfVk1YX1BJTkJBU0VEX0NUTFM6CisJCSpwZGF0YSA9IHZteF9jb250cm9sX21zcihuZXN0ZWRfdm14X3BpbmJhc2VkX2N0bHNfbG93LAorCQkJCQluZXN0ZWRfdm14X3BpbmJhc2VkX2N0bHNfaGlnaCk7CisJCWJyZWFrOworCWNhc2UgTVNSX0lBMzJfVk1YX1RSVUVfUFJPQ0JBU0VEX0NUTFM6CisJY2FzZSBNU1JfSUEzMl9WTVhfUFJPQ0JBU0VEX0NUTFM6CisJCSpwZGF0YSA9IHZteF9jb250cm9sX21zcihuZXN0ZWRfdm14X3Byb2NiYXNlZF9jdGxzX2xvdywKKwkJCQkJbmVzdGVkX3ZteF9wcm9jYmFzZWRfY3Rsc19oaWdoKTsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9WTVhfVFJVRV9FWElUX0NUTFM6CisJY2FzZSBNU1JfSUEzMl9WTVhfRVhJVF9DVExTOgorCQkqcGRhdGEgPSB2bXhfY29udHJvbF9tc3IobmVzdGVkX3ZteF9leGl0X2N0bHNfbG93LAorCQkJCQluZXN0ZWRfdm14X2V4aXRfY3Rsc19oaWdoKTsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9WTVhfVFJVRV9FTlRSWV9DVExTOgorCWNhc2UgTVNSX0lBMzJfVk1YX0VOVFJZX0NUTFM6CisJCSpwZGF0YSA9IHZteF9jb250cm9sX21zcihuZXN0ZWRfdm14X2VudHJ5X2N0bHNfbG93LAorCQkJCQluZXN0ZWRfdm14X2VudHJ5X2N0bHNfaGlnaCk7CisJCWJyZWFrOworCWNhc2UgTVNSX0lBMzJfVk1YX01JU0M6CisJCSpwZGF0YSA9IDA7CisJCWJyZWFrOworCS8qCisJICogVGhlc2UgTVNScyBzcGVjaWZ5IGJpdHMgd2hpY2ggdGhlIGd1ZXN0IG11c3Qga2VlcCBmaXhlZCAob24gb3Igb2ZmKQorCSAqIHdoaWxlIEwxIGlzIGluIFZNWE9OIG1vZGUgKGluIEwxJ3Mgcm9vdCBtb2RlLCBvciBydW5uaW5nIGFuIEwyKS4KKwkgKiBXZSBwaWNrZWQgdGhlIHN0YW5kYXJkIGNvcmUyIHNldHRpbmcuCisJICovCisjZGVmaW5lIFZNWE9OX0NSMF9BTFdBWVNPTgkoWDg2X0NSMF9QRSB8IFg4Nl9DUjBfUEcgfCBYODZfQ1IwX05FKQorI2RlZmluZSBWTVhPTl9DUjRfQUxXQVlTT04JWDg2X0NSNF9WTVhFCisJY2FzZSBNU1JfSUEzMl9WTVhfQ1IwX0ZJWEVEMDoKKwkJKnBkYXRhID0gVk1YT05fQ1IwX0FMV0FZU09OOworCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX1ZNWF9DUjBfRklYRUQxOgorCQkqcGRhdGEgPSAtMVVMTDsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9WTVhfQ1I0X0ZJWEVEMDoKKwkJKnBkYXRhID0gVk1YT05fQ1I0X0FMV0FZU09OOworCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX1ZNWF9DUjRfRklYRUQxOgorCQkqcGRhdGEgPSAtMVVMTDsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9WTVhfVk1DU19FTlVNOgorCQkqcGRhdGEgPSAweDFmOworCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX1ZNWF9QUk9DQkFTRURfQ1RMUzI6CisJCSpwZGF0YSA9IHZteF9jb250cm9sX21zcihuZXN0ZWRfdm14X3NlY29uZGFyeV9jdGxzX2xvdywKKwkJCQkJbmVzdGVkX3ZteF9zZWNvbmRhcnlfY3Rsc19oaWdoKTsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9WTVhfRVBUX1ZQSURfQ0FQOgorCQkvKiBDdXJyZW50bHksIG5vIG5lc3RlZCBlcHQgb3IgbmVzdGVkIHZwaWQgKi8KKwkJKnBkYXRhID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdm14X3NldF92bXhfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIG1zcl9pbmRleCwgdTY0IGRhdGEpCit7CisJaWYgKCFuZXN0ZWRfdm14X2FsbG93ZWQodmNwdSkpCisJCXJldHVybiAwOworCisJaWYgKG1zcl9pbmRleCA9PSBNU1JfSUEzMl9GRUFUVVJFX0NPTlRST0wpCisJCS8qIFRPRE86IHRoZSByaWdodCB0aGluZy4gKi8KKwkJcmV0dXJuIDE7CisJLyoKKwkgKiBObyBuZWVkIHRvIHRyZWF0IFZNWCBjYXBhYmlsaXR5IE1TUnMgc3BlY2lhbGx5OiBJZiB3ZSBkb24ndCBoYW5kbGUKKwkgKiB0aGVtLCBoYW5kbGVfd3Jtc3Igd2lsbCAjR1AoMCksIHdoaWNoIGlzIGNvcnJlY3QgKHRoZXkgYXJlIHJlYWRvbmx5KQorCSAqLworCXJldHVybiAwOworfQorCiAvKgogICogUmVhZHMgYW4gbXNyIHZhbHVlIChvZiAnbXNyX2luZGV4JykgaW50byAncGRhdGEnLgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbi0wIG90aGVyd2lzZS4KQEAgLTEzMDksNiArMjA2Niw4IEBACiAJCS8qIE90aGVyd2lzZSBmYWxscyB0aHJvdWdoICovCiAJZGVmYXVsdDoKIAkJdm14X2xvYWRfaG9zdF9zdGF0ZSh0b192bXgodmNwdSkpOworCQlpZiAodm14X2dldF92bXhfbXNyKHZjcHUsIG1zcl9pbmRleCwgcGRhdGEpKQorCQkJcmV0dXJuIDA7CiAJCW1zciA9IGZpbmRfbXNyX2VudHJ5KHRvX3ZteCh2Y3B1KSwgbXNyX2luZGV4KTsKIAkJaWYgKG1zcikgewogCQkJdm14X2xvYWRfaG9zdF9zdGF0ZSh0b192bXgodmNwdSkpOwpAQCAtMTM4MCw2ICsyMTM5LDggQEAKIAkJCXJldHVybiAxOwogCQkvKiBPdGhlcndpc2UgZmFsbHMgdGhyb3VnaCAqLwogCWRlZmF1bHQ6CisJCWlmICh2bXhfc2V0X3ZteF9tc3IodmNwdSwgbXNyX2luZGV4LCBkYXRhKSkKKwkJCWJyZWFrOwogCQltc3IgPSBmaW5kX21zcl9lbnRyeSh2bXgsIG1zcl9pbmRleCk7CiAJCWlmIChtc3IpIHsKIAkJCXZteF9sb2FkX2hvc3Rfc3RhdGUodm14KTsKQEAgLTE0NjksNyArMjIzMCw3IEBACiAJaWYgKHJlYWRfY3I0KCkgJiBYODZfQ1I0X1ZNWEUpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlJTklUX0xJU1RfSEVBRCgmcGVyX2NwdSh2Y3B1c19vbl9jcHUsIGNwdSkpOworCUlOSVRfTElTVF9IRUFEKCZwZXJfY3B1KGxvYWRlZF92bWNzc19vbl9jcHUsIGNwdSkpOwogCXJkbXNybChNU1JfSUEzMl9GRUFUVVJFX0NPTlRST0wsIG9sZCk7CiAKIAl0ZXN0X2JpdHMgPSBGRUFUVVJFX0NPTlRST0xfTE9DS0VEOwpAQCAtMTQ5MywxNCArMjI1NCwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB2bWNsZWFyX2xvY2FsX3ZjcHVzKHZvaWQpCitzdGF0aWMgdm9pZCB2bWNsZWFyX2xvY2FsX2xvYWRlZF92bWNzcyh2b2lkKQogewogCWludCBjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCB2Y3B1X3ZteCAqdm14LCAqbjsKKwlzdHJ1Y3QgbG9hZGVkX3ZtY3MgKnYsICpuOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZteCwgbiwgJnBlcl9jcHUodmNwdXNfb25fY3B1LCBjcHUpLAotCQkJCSBsb2NhbF92Y3B1c19saW5rKQotCQlfX3ZjcHVfY2xlYXIodm14KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodiwgbiwgJnBlcl9jcHUobG9hZGVkX3ZtY3NzX29uX2NwdSwgY3B1KSwKKwkJCQkgbG9hZGVkX3ZtY3NzX29uX2NwdV9saW5rKQorCQlfX2xvYWRlZF92bWNzX2NsZWFyKHYpOwogfQogCiAKQEAgLTE1MTUsNyArMjI3Niw3IEBACiBzdGF0aWMgdm9pZCBoYXJkd2FyZV9kaXNhYmxlKHZvaWQgKmdhcmJhZ2UpCiB7CiAJaWYgKHZtbV9leGNsdXNpdmUpIHsKLQkJdm1jbGVhcl9sb2NhbF92Y3B1cygpOworCQl2bWNsZWFyX2xvY2FsX2xvYWRlZF92bWNzcygpOwogCQlrdm1fY3B1X3ZteG9mZigpOwogCX0KIAl3cml0ZV9jcjQocmVhZF9jcjQoKSAmIH5YODZfQ1I0X1ZNWEUpOwpAQCAtMTY5Niw2ICsyNDU3LDE4IEBACiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2bWNzLCB2bWNzX2NvbmZpZy5vcmRlcik7CiB9CiAKKy8qCisgKiBGcmVlIGEgVk1DUywgYnV0IGJlZm9yZSB0aGF0IFZNQ0xFQVIgaXQgb24gdGhlIENQVSB3aGVyZSBpdCB3YXMgbGFzdCBsb2FkZWQKKyAqLworc3RhdGljIHZvaWQgZnJlZV9sb2FkZWRfdm1jcyhzdHJ1Y3QgbG9hZGVkX3ZtY3MgKmxvYWRlZF92bWNzKQoreworCWlmICghbG9hZGVkX3ZtY3MtPnZtY3MpCisJCXJldHVybjsKKwlsb2FkZWRfdm1jc19jbGVhcihsb2FkZWRfdm1jcyk7CisJZnJlZV92bWNzKGxvYWRlZF92bWNzLT52bWNzKTsKKwlsb2FkZWRfdm1jcy0+dm1jcyA9IE5VTEw7Cit9CisKIHN0YXRpYyB2b2lkIGZyZWVfa3ZtX2FyZWEodm9pZCkKIHsKIAlpbnQgY3B1OwpAQCAtMTc1Niw2ICsyNTI5LDkgQEAKIAlpZiAoIWNwdV9oYXNfdm14X3BsZSgpKQogCQlwbGVfZ2FwID0gMDsKIAorCWlmIChuZXN0ZWQpCisJCW5lc3RlZF92bXhfc2V0dXBfY3Rsc19tc3JzKCk7CisKIAlyZXR1cm4gYWxsb2Nfa3ZtX2FyZWEoKTsKIH0KIApAQCAtMjA0MSwxMyArMjgxNywxNCBAQAogCQkgICh1bnNpZ25lZCBsb25nICopJnZjcHUtPmFyY2gucmVnc19kaXJ0eSk7CiB9CiAKLXN0YXRpYyB2b2lkIHZteF9zZXRfY3I0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjQpOworc3RhdGljIGludCB2bXhfc2V0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I0KTsKIAogc3RhdGljIHZvaWQgZXB0X3VwZGF0ZV9wYWdpbmdfbW9kZV9jcjAodW5zaWduZWQgbG9uZyAqaHdfY3IwLAogCQkJCQl1bnNpZ25lZCBsb25nIGNyMCwKIAkJCQkJc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXZteF9kZWNhY2hlX2NyMyh2Y3B1KTsKKwlpZiAoIXRlc3RfYml0KFZDUFVfRVhSRUdfQ1IzLCAodWxvbmcgKikmdmNwdS0+YXJjaC5yZWdzX2F2YWlsKSkKKwkJdm14X2RlY2FjaGVfY3IzKHZjcHUpOwogCWlmICghKGNyMCAmIFg4Nl9DUjBfUEcpKSB7CiAJCS8qIEZyb20gcGFnaW5nL3N0YXJ0aW5nIHRvIG5vbnBhZ2luZyAqLwogCQl2bWNzX3dyaXRlMzIoQ1BVX0JBU0VEX1ZNX0VYRUNfQ09OVFJPTCwKQEAgLTIxMzgsMTEgKzI5MTUsMjMgQEAKIAl2bWNzX3dyaXRlbChHVUVTVF9DUjMsIGd1ZXN0X2NyMyk7CiB9CiAKLXN0YXRpYyB2b2lkIHZteF9zZXRfY3I0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjQpCitzdGF0aWMgaW50IHZteF9zZXRfY3I0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjQpCiB7CiAJdW5zaWduZWQgbG9uZyBod19jcjQgPSBjcjQgfCAodG9fdm14KHZjcHUpLT5ybW9kZS52bTg2X2FjdGl2ZSA/CiAJCSAgICBLVk1fUk1PREVfVk1fQ1I0X0FMV0FZU19PTiA6IEtWTV9QTU9ERV9WTV9DUjRfQUxXQVlTX09OKTsKIAorCWlmIChjcjQgJiBYODZfQ1I0X1ZNWEUpIHsKKwkJLyoKKwkJICogVG8gdXNlIFZNWE9OIChhbmQgbGF0ZXIgb3RoZXIgVk1YIGluc3RydWN0aW9ucyksIGEgZ3Vlc3QKKwkJICogbXVzdCBmaXJzdCBiZSBhYmxlIHRvIHR1cm4gb24gY3I0LlZNWEUgKHNlZSBoYW5kbGVfdm1vbigpKS4KKwkJICogU28gYmFzaWNhbGx5IHRoZSBjaGVjayBvbiB3aGV0aGVyIHRvIGFsbG93IG5lc3RlZCBWTVgKKwkJICogaXMgaGVyZS4KKwkJICovCisJCWlmICghbmVzdGVkX3ZteF9hbGxvd2VkKHZjcHUpKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIGlmICh0b192bXgodmNwdSktPm5lc3RlZC52bXhvbikKKwkJcmV0dXJuIDE7CisKIAl2Y3B1LT5hcmNoLmNyNCA9IGNyNDsKIAlpZiAoZW5hYmxlX2VwdCkgewogCQlpZiAoIWlzX3BhZ2luZyh2Y3B1KSkgewpAQCAtMjE1NSw2ICsyOTQ0LDcgQEAKIAogCXZtY3Nfd3JpdGVsKENSNF9SRUFEX1NIQURPVywgY3I0KTsKIAl2bWNzX3dyaXRlbChHVUVTVF9DUjQsIGh3X2NyNCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHZteF9nZXRfc2VnbWVudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCkBAIC0yNzIwLDE4ICszNTEwLDExMCBAQAogfQogCiAvKgorICogU2V0IHVwIHRoZSB2bWNzJ3MgY29uc3RhbnQgaG9zdC1zdGF0ZSBmaWVsZHMsIGkuZS4sIGhvc3Qtc3RhdGUgZmllbGRzIHRoYXQKKyAqIHdpbGwgbm90IGNoYW5nZSBpbiB0aGUgbGlmZXRpbWUgb2YgdGhlIGd1ZXN0LgorICogTm90ZSB0aGF0IGhvc3Qtc3RhdGUgdGhhdCBkb2VzIGNoYW5nZSBpcyBzZXQgZWxzZXdoZXJlLiBFLmcuLCBob3N0LXN0YXRlCisgKiB0aGF0IGlzIHNldCBkaWZmZXJlbnRseSBmb3IgZWFjaCBDUFUgaXMgc2V0IGluIHZteF92Y3B1X2xvYWQoKSwgbm90IGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkIHZteF9zZXRfY29uc3RhbnRfaG9zdF9zdGF0ZSh2b2lkKQoreworCXUzMiBsb3czMiwgaGlnaDMyOworCXVuc2lnbmVkIGxvbmcgdG1wbDsKKwlzdHJ1Y3QgZGVzY19wdHIgZHQ7CisKKwl2bWNzX3dyaXRlbChIT1NUX0NSMCwgcmVhZF9jcjAoKSB8IFg4Nl9DUjBfVFMpOyAgLyogMjIuMi4zICovCisJdm1jc193cml0ZWwoSE9TVF9DUjQsIHJlYWRfY3I0KCkpOyAgLyogMjIuMi4zLCAyMi4yLjUgKi8KKwl2bWNzX3dyaXRlbChIT1NUX0NSMywgcmVhZF9jcjMoKSk7ICAvKiAyMi4yLjMgIEZJWE1FOiBzaGFkb3cgdGFibGVzICovCisKKwl2bWNzX3dyaXRlMTYoSE9TVF9DU19TRUxFQ1RPUiwgX19LRVJORUxfQ1MpOyAgLyogMjIuMi40ICovCisJdm1jc193cml0ZTE2KEhPU1RfRFNfU0VMRUNUT1IsIF9fS0VSTkVMX0RTKTsgIC8qIDIyLjIuNCAqLworCXZtY3Nfd3JpdGUxNihIT1NUX0VTX1NFTEVDVE9SLCBfX0tFUk5FTF9EUyk7ICAvKiAyMi4yLjQgKi8KKwl2bWNzX3dyaXRlMTYoSE9TVF9TU19TRUxFQ1RPUiwgX19LRVJORUxfRFMpOyAgLyogMjIuMi40ICovCisJdm1jc193cml0ZTE2KEhPU1RfVFJfU0VMRUNUT1IsIEdEVF9FTlRSWV9UU1MqOCk7ICAvKiAyMi4yLjQgKi8KKworCW5hdGl2ZV9zdG9yZV9pZHQoJmR0KTsKKwl2bWNzX3dyaXRlbChIT1NUX0lEVFJfQkFTRSwgZHQuYWRkcmVzcyk7ICAgLyogMjIuMi40ICovCisKKwlhc20oIm1vdiAkLkxrdm1fdm14X3JldHVybiwgJTAiIDogIj1yIih0bXBsKSk7CisJdm1jc193cml0ZWwoSE9TVF9SSVAsIHRtcGwpOyAvKiAyMi4yLjUgKi8KKworCXJkbXNyKE1TUl9JQTMyX1NZU0VOVEVSX0NTLCBsb3czMiwgaGlnaDMyKTsKKwl2bWNzX3dyaXRlMzIoSE9TVF9JQTMyX1NZU0VOVEVSX0NTLCBsb3czMik7CisJcmRtc3JsKE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwgdG1wbCk7CisJdm1jc193cml0ZWwoSE9TVF9JQTMyX1NZU0VOVEVSX0VJUCwgdG1wbCk7ICAgLyogMjIuMi4zICovCisKKwlpZiAodm1jc19jb25maWcudm1leGl0X2N0cmwgJiBWTV9FWElUX0xPQURfSUEzMl9QQVQpIHsKKwkJcmRtc3IoTVNSX0lBMzJfQ1JfUEFULCBsb3czMiwgaGlnaDMyKTsKKwkJdm1jc193cml0ZTY0KEhPU1RfSUEzMl9QQVQsIGxvdzMyIHwgKCh1NjQpIGhpZ2gzMiA8PCAzMikpOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2NyNF9ndWVzdF9ob3N0X21hc2soc3RydWN0IHZjcHVfdm14ICp2bXgpCit7CisJdm14LT52Y3B1LmFyY2guY3I0X2d1ZXN0X293bmVkX2JpdHMgPSBLVk1fQ1I0X0dVRVNUX09XTkVEX0JJVFM7CisJaWYgKGVuYWJsZV9lcHQpCisJCXZteC0+dmNwdS5hcmNoLmNyNF9ndWVzdF9vd25lZF9iaXRzIHw9IFg4Nl9DUjRfUEdFOworCWlmIChpc19ndWVzdF9tb2RlKCZ2bXgtPnZjcHUpKQorCQl2bXgtPnZjcHUuYXJjaC5jcjRfZ3Vlc3Rfb3duZWRfYml0cyAmPQorCQkJfmdldF92bWNzMTIoJnZteC0+dmNwdSktPmNyNF9ndWVzdF9ob3N0X21hc2s7CisJdm1jc193cml0ZWwoQ1I0X0dVRVNUX0hPU1RfTUFTSywgfnZteC0+dmNwdS5hcmNoLmNyNF9ndWVzdF9vd25lZF9iaXRzKTsKK30KKworc3RhdGljIHUzMiB2bXhfZXhlY19jb250cm9sKHN0cnVjdCB2Y3B1X3ZteCAqdm14KQoreworCXUzMiBleGVjX2NvbnRyb2wgPSB2bWNzX2NvbmZpZy5jcHVfYmFzZWRfZXhlY19jdHJsOworCWlmICghdm1fbmVlZF90cHJfc2hhZG93KHZteC0+dmNwdS5rdm0pKSB7CisJCWV4ZWNfY29udHJvbCAmPSB+Q1BVX0JBU0VEX1RQUl9TSEFET1c7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQlleGVjX2NvbnRyb2wgfD0gQ1BVX0JBU0VEX0NSOF9TVE9SRV9FWElUSU5HIHwKKwkJCQlDUFVfQkFTRURfQ1I4X0xPQURfRVhJVElORzsKKyNlbmRpZgorCX0KKwlpZiAoIWVuYWJsZV9lcHQpCisJCWV4ZWNfY29udHJvbCB8PSBDUFVfQkFTRURfQ1IzX1NUT1JFX0VYSVRJTkcgfAorCQkJCUNQVV9CQVNFRF9DUjNfTE9BRF9FWElUSU5HICB8CisJCQkJQ1BVX0JBU0VEX0lOVkxQR19FWElUSU5HOworCXJldHVybiBleGVjX2NvbnRyb2w7Cit9CisKK3N0YXRpYyB1MzIgdm14X3NlY29uZGFyeV9leGVjX2NvbnRyb2woc3RydWN0IHZjcHVfdm14ICp2bXgpCit7CisJdTMyIGV4ZWNfY29udHJvbCA9IHZtY3NfY29uZmlnLmNwdV9iYXNlZF8ybmRfZXhlY19jdHJsOworCWlmICghdm1fbmVlZF92aXJ0dWFsaXplX2FwaWNfYWNjZXNzZXModm14LT52Y3B1Lmt2bSkpCisJCWV4ZWNfY29udHJvbCAmPSB+U0VDT05EQVJZX0VYRUNfVklSVFVBTElaRV9BUElDX0FDQ0VTU0VTOworCWlmICh2bXgtPnZwaWQgPT0gMCkKKwkJZXhlY19jb250cm9sICY9IH5TRUNPTkRBUllfRVhFQ19FTkFCTEVfVlBJRDsKKwlpZiAoIWVuYWJsZV9lcHQpIHsKKwkJZXhlY19jb250cm9sICY9IH5TRUNPTkRBUllfRVhFQ19FTkFCTEVfRVBUOworCQllbmFibGVfdW5yZXN0cmljdGVkX2d1ZXN0ID0gMDsKKwl9CisJaWYgKCFlbmFibGVfdW5yZXN0cmljdGVkX2d1ZXN0KQorCQlleGVjX2NvbnRyb2wgJj0gflNFQ09OREFSWV9FWEVDX1VOUkVTVFJJQ1RFRF9HVUVTVDsKKwlpZiAoIXBsZV9nYXApCisJCWV4ZWNfY29udHJvbCAmPSB+U0VDT05EQVJZX0VYRUNfUEFVU0VfTE9PUF9FWElUSU5HOworCXJldHVybiBleGVjX2NvbnRyb2w7Cit9CisKK3N0YXRpYyB2b2lkIGVwdF9zZXRfbW1pb19zcHRlX21hc2sodm9pZCkKK3sKKwkvKgorCSAqIEVQVCBNaXNjb25maWd1cmF0aW9ucyBjYW4gYmUgZ2VuZXJhdGVkIGlmIHRoZSB2YWx1ZSBvZiBiaXRzIDI6MAorCSAqIG9mIGFuIEVQVCBwYWdpbmctc3RydWN0dXJlIGVudHJ5IGlzIDExMGIgKHdyaXRlL2V4ZWN1dGUpLgorCSAqIEFsc28sIG1hZ2ljIGJpdHMgKDB4ZmZ1bGwgPDwgNDkpIGlzIHNldCB0byBxdWlja2x5IGlkZW50aWZ5IG1taW8KKwkgKiBzcHRlLgorCSAqLworCWt2bV9tbXVfc2V0X21taW9fc3B0ZV9tYXNrKDB4ZmZ1bGwgPDwgNDkgfCAweDZ1bGwpOworfQorCisvKgogICogU2V0cyB1cCB0aGUgdm1jcyBmb3IgZW11bGF0ZWQgcmVhbCBtb2RlLgogICovCiBzdGF0aWMgaW50IHZteF92Y3B1X3NldHVwKHN0cnVjdCB2Y3B1X3ZteCAqdm14KQogewotCXUzMiBob3N0X3N5c2VudGVyX2NzLCBtc3JfbG93LCBtc3JfaGlnaDsKLQl1MzIganVuazsKLQl1NjQgaG9zdF9wYXQ7CisjaWZkZWYgQ09ORklHX1g4Nl82NAogCXVuc2lnbmVkIGxvbmcgYTsKLQlzdHJ1Y3QgZGVzY19wdHIgZHQ7CisjZW5kaWYKIAlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGt2bV92bXhfcmV0dXJuOwotCXUzMiBleGVjX2NvbnRyb2w7CiAKIAkvKiBJL08gKi8KIAl2bWNzX3dyaXRlNjQoSU9fQklUTUFQX0EsIF9fcGEodm14X2lvX2JpdG1hcF9hKSk7CkBAIC0yNzQ2LDM2ICszNjI4LDExIEBACiAJdm1jc193cml0ZTMyKFBJTl9CQVNFRF9WTV9FWEVDX0NPTlRST0wsCiAJCXZtY3NfY29uZmlnLnBpbl9iYXNlZF9leGVjX2N0cmwpOwogCi0JZXhlY19jb250cm9sID0gdm1jc19jb25maWcuY3B1X2Jhc2VkX2V4ZWNfY3RybDsKLQlpZiAoIXZtX25lZWRfdHByX3NoYWRvdyh2bXgtPnZjcHUua3ZtKSkgewotCQlleGVjX2NvbnRyb2wgJj0gfkNQVV9CQVNFRF9UUFJfU0hBRE9XOwotI2lmZGVmIENPTkZJR19YODZfNjQKLQkJZXhlY19jb250cm9sIHw9IENQVV9CQVNFRF9DUjhfU1RPUkVfRVhJVElORyB8Ci0JCQkJQ1BVX0JBU0VEX0NSOF9MT0FEX0VYSVRJTkc7Ci0jZW5kaWYKLQl9Ci0JaWYgKCFlbmFibGVfZXB0KQotCQlleGVjX2NvbnRyb2wgfD0gQ1BVX0JBU0VEX0NSM19TVE9SRV9FWElUSU5HIHwKLQkJCQlDUFVfQkFTRURfQ1IzX0xPQURfRVhJVElORyAgfAotCQkJCUNQVV9CQVNFRF9JTlZMUEdfRVhJVElORzsKLQl2bWNzX3dyaXRlMzIoQ1BVX0JBU0VEX1ZNX0VYRUNfQ09OVFJPTCwgZXhlY19jb250cm9sKTsKKwl2bWNzX3dyaXRlMzIoQ1BVX0JBU0VEX1ZNX0VYRUNfQ09OVFJPTCwgdm14X2V4ZWNfY29udHJvbCh2bXgpKTsKIAogCWlmIChjcHVfaGFzX3NlY29uZGFyeV9leGVjX2N0cmxzKCkpIHsKLQkJZXhlY19jb250cm9sID0gdm1jc19jb25maWcuY3B1X2Jhc2VkXzJuZF9leGVjX2N0cmw7Ci0JCWlmICghdm1fbmVlZF92aXJ0dWFsaXplX2FwaWNfYWNjZXNzZXModm14LT52Y3B1Lmt2bSkpCi0JCQlleGVjX2NvbnRyb2wgJj0KLQkJCQl+U0VDT05EQVJZX0VYRUNfVklSVFVBTElaRV9BUElDX0FDQ0VTU0VTOwotCQlpZiAodm14LT52cGlkID09IDApCi0JCQlleGVjX2NvbnRyb2wgJj0gflNFQ09OREFSWV9FWEVDX0VOQUJMRV9WUElEOwotCQlpZiAoIWVuYWJsZV9lcHQpIHsKLQkJCWV4ZWNfY29udHJvbCAmPSB+U0VDT05EQVJZX0VYRUNfRU5BQkxFX0VQVDsKLQkJCWVuYWJsZV91bnJlc3RyaWN0ZWRfZ3Vlc3QgPSAwOwotCQl9Ci0JCWlmICghZW5hYmxlX3VucmVzdHJpY3RlZF9ndWVzdCkKLQkJCWV4ZWNfY29udHJvbCAmPSB+U0VDT05EQVJZX0VYRUNfVU5SRVNUUklDVEVEX0dVRVNUOwotCQlpZiAoIXBsZV9nYXApCi0JCQlleGVjX2NvbnRyb2wgJj0gflNFQ09OREFSWV9FWEVDX1BBVVNFX0xPT1BfRVhJVElORzsKLQkJdm1jc193cml0ZTMyKFNFQ09OREFSWV9WTV9FWEVDX0NPTlRST0wsIGV4ZWNfY29udHJvbCk7CisJCXZtY3Nfd3JpdGUzMihTRUNPTkRBUllfVk1fRVhFQ19DT05UUk9MLAorCQkJCXZteF9zZWNvbmRhcnlfZXhlY19jb250cm9sKHZteCkpOwogCX0KIAogCWlmIChwbGVfZ2FwKSB7CkBAIC0yNzgzLDIwICszNjQwLDEzIEBACiAJCXZtY3Nfd3JpdGUzMihQTEVfV0lORE9XLCBwbGVfd2luZG93KTsKIAl9CiAKLQl2bWNzX3dyaXRlMzIoUEFHRV9GQVVMVF9FUlJPUl9DT0RFX01BU0ssICEhYnlwYXNzX2d1ZXN0X3BmKTsKLQl2bWNzX3dyaXRlMzIoUEFHRV9GQVVMVF9FUlJPUl9DT0RFX01BVENILCAhIWJ5cGFzc19ndWVzdF9wZik7CisJdm1jc193cml0ZTMyKFBBR0VfRkFVTFRfRVJST1JfQ09ERV9NQVNLLCAwKTsKKwl2bWNzX3dyaXRlMzIoUEFHRV9GQVVMVF9FUlJPUl9DT0RFX01BVENILCAwKTsKIAl2bWNzX3dyaXRlMzIoQ1IzX1RBUkdFVF9DT1VOVCwgMCk7ICAgICAgICAgICAvKiAyMi4yLjEgKi8KIAotCXZtY3Nfd3JpdGVsKEhPU1RfQ1IwLCByZWFkX2NyMCgpIHwgWDg2X0NSMF9UUyk7ICAvKiAyMi4yLjMgKi8KLQl2bWNzX3dyaXRlbChIT1NUX0NSNCwgcmVhZF9jcjQoKSk7ICAvKiAyMi4yLjMsIDIyLjIuNSAqLwotCXZtY3Nfd3JpdGVsKEhPU1RfQ1IzLCByZWFkX2NyMygpKTsgIC8qIDIyLjIuMyAgRklYTUU6IHNoYWRvdyB0YWJsZXMgKi8KLQotCXZtY3Nfd3JpdGUxNihIT1NUX0NTX1NFTEVDVE9SLCBfX0tFUk5FTF9DUyk7ICAvKiAyMi4yLjQgKi8KLQl2bWNzX3dyaXRlMTYoSE9TVF9EU19TRUxFQ1RPUiwgX19LRVJORUxfRFMpOyAgLyogMjIuMi40ICovCi0Jdm1jc193cml0ZTE2KEhPU1RfRVNfU0VMRUNUT1IsIF9fS0VSTkVMX0RTKTsgIC8qIDIyLjIuNCAqLwogCXZtY3Nfd3JpdGUxNihIT1NUX0ZTX1NFTEVDVE9SLCAwKTsgICAgICAgICAgICAvKiAyMi4yLjQgKi8KIAl2bWNzX3dyaXRlMTYoSE9TVF9HU19TRUxFQ1RPUiwgMCk7ICAgICAgICAgICAgLyogMjIuMi40ICovCi0Jdm1jc193cml0ZTE2KEhPU1RfU1NfU0VMRUNUT1IsIF9fS0VSTkVMX0RTKTsgIC8qIDIyLjIuNCAqLworCXZteF9zZXRfY29uc3RhbnRfaG9zdF9zdGF0ZSgpOwogI2lmZGVmIENPTkZJR19YODZfNjQKIAlyZG1zcmwoTVNSX0ZTX0JBU0UsIGEpOwogCXZtY3Nfd3JpdGVsKEhPU1RfRlNfQkFTRSwgYSk7IC8qIDIyLjIuNCAqLwpAQCAtMjgwNywzMiArMzY1NywxNSBAQAogCXZtY3Nfd3JpdGVsKEhPU1RfR1NfQkFTRSwgMCk7IC8qIDIyLjIuNCAqLwogI2VuZGlmCiAKLQl2bWNzX3dyaXRlMTYoSE9TVF9UUl9TRUxFQ1RPUiwgR0RUX0VOVFJZX1RTUyo4KTsgIC8qIDIyLjIuNCAqLwotCi0JbmF0aXZlX3N0b3JlX2lkdCgmZHQpOwotCXZtY3Nfd3JpdGVsKEhPU1RfSURUUl9CQVNFLCBkdC5hZGRyZXNzKTsgICAvKiAyMi4yLjQgKi8KLQotCWFzbSgibW92ICQuTGt2bV92bXhfcmV0dXJuLCAlMCIgOiAiPXIiKGt2bV92bXhfcmV0dXJuKSk7Ci0Jdm1jc193cml0ZWwoSE9TVF9SSVAsIGt2bV92bXhfcmV0dXJuKTsgLyogMjIuMi41ICovCiAJdm1jc193cml0ZTMyKFZNX0VYSVRfTVNSX1NUT1JFX0NPVU5ULCAwKTsKIAl2bWNzX3dyaXRlMzIoVk1fRVhJVF9NU1JfTE9BRF9DT1VOVCwgMCk7CiAJdm1jc193cml0ZTY0KFZNX0VYSVRfTVNSX0xPQURfQUREUiwgX19wYSh2bXgtPm1zcl9hdXRvbG9hZC5ob3N0KSk7CiAJdm1jc193cml0ZTMyKFZNX0VOVFJZX01TUl9MT0FEX0NPVU5ULCAwKTsKIAl2bWNzX3dyaXRlNjQoVk1fRU5UUllfTVNSX0xPQURfQUREUiwgX19wYSh2bXgtPm1zcl9hdXRvbG9hZC5ndWVzdCkpOwogCi0JcmRtc3IoTVNSX0lBMzJfU1lTRU5URVJfQ1MsIGhvc3Rfc3lzZW50ZXJfY3MsIGp1bmspOwotCXZtY3Nfd3JpdGUzMihIT1NUX0lBMzJfU1lTRU5URVJfQ1MsIGhvc3Rfc3lzZW50ZXJfY3MpOwotCXJkbXNybChNU1JfSUEzMl9TWVNFTlRFUl9FU1AsIGEpOwotCXZtY3Nfd3JpdGVsKEhPU1RfSUEzMl9TWVNFTlRFUl9FU1AsIGEpOyAgIC8qIDIyLjIuMyAqLwotCXJkbXNybChNU1JfSUEzMl9TWVNFTlRFUl9FSVAsIGEpOwotCXZtY3Nfd3JpdGVsKEhPU1RfSUEzMl9TWVNFTlRFUl9FSVAsIGEpOyAgIC8qIDIyLjIuMyAqLwotCi0JaWYgKHZtY3NfY29uZmlnLnZtZXhpdF9jdHJsICYgVk1fRVhJVF9MT0FEX0lBMzJfUEFUKSB7Ci0JCXJkbXNyKE1TUl9JQTMyX0NSX1BBVCwgbXNyX2xvdywgbXNyX2hpZ2gpOwotCQlob3N0X3BhdCA9IG1zcl9sb3cgfCAoKHU2NCkgbXNyX2hpZ2ggPDwgMzIpOwotCQl2bWNzX3dyaXRlNjQoSE9TVF9JQTMyX1BBVCwgaG9zdF9wYXQpOwotCX0KIAlpZiAodm1jc19jb25maWcudm1lbnRyeV9jdHJsICYgVk1fRU5UUllfTE9BRF9JQTMyX1BBVCkgeworCQl1MzIgbXNyX2xvdywgbXNyX2hpZ2g7CisJCXU2NCBob3N0X3BhdDsKIAkJcmRtc3IoTVNSX0lBMzJfQ1JfUEFULCBtc3JfbG93LCBtc3JfaGlnaCk7CiAJCWhvc3RfcGF0ID0gbXNyX2xvdyB8ICgodTY0KSBtc3JfaGlnaCA8PCAzMik7CiAJCS8qIFdyaXRlIHRoZSBkZWZhdWx0IHZhbHVlIGZvbGxvdyBob3N0IHBhdCAqLwpAQCAtMjg2MiwxMCArMzY5NSw3IEBACiAJdm1jc193cml0ZTMyKFZNX0VOVFJZX0NPTlRST0xTLCB2bWNzX2NvbmZpZy52bWVudHJ5X2N0cmwpOwogCiAJdm1jc193cml0ZWwoQ1IwX0dVRVNUX0hPU1RfTUFTSywgfjBVTCk7Ci0Jdm14LT52Y3B1LmFyY2guY3I0X2d1ZXN0X293bmVkX2JpdHMgPSBLVk1fQ1I0X0dVRVNUX09XTkVEX0JJVFM7Ci0JaWYgKGVuYWJsZV9lcHQpCi0JCXZteC0+dmNwdS5hcmNoLmNyNF9ndWVzdF9vd25lZF9iaXRzIHw9IFg4Nl9DUjRfUEdFOwotCXZtY3Nfd3JpdGVsKENSNF9HVUVTVF9IT1NUX01BU0ssIH52bXgtPnZjcHUuYXJjaC5jcjRfZ3Vlc3Rfb3duZWRfYml0cyk7CisJc2V0X2NyNF9ndWVzdF9ob3N0X21hc2sodm14KTsKIAogCWt2bV93cml0ZV90c2MoJnZteC0+dmNwdSwgMCk7CiAKQEAgLTI5ODksOSArMzgxOSwyNSBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBJbiBuZXN0ZWQgdmlydHVhbGl6YXRpb24sIGNoZWNrIGlmIEwxIGFza2VkIHRvIGV4aXQgb24gZXh0ZXJuYWwgaW50ZXJydXB0cy4KKyAqIEZvciBtb3N0IGV4aXN0aW5nIGh5cGVydmlzb3JzLCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlLgorICovCitzdGF0aWMgYm9vbCBuZXN0ZWRfZXhpdF9vbl9pbnRyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gZ2V0X3ZtY3MxMih2Y3B1KS0+cGluX2Jhc2VkX3ZtX2V4ZWNfY29udHJvbCAmCisJCVBJTl9CQVNFRF9FWFRfSU5UUl9NQVNLOworfQorCiBzdGF0aWMgdm9pZCBlbmFibGVfaXJxX3dpbmRvdyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJdTMyIGNwdV9iYXNlZF92bV9leGVjX2NvbnRyb2w7CisJaWYgKGlzX2d1ZXN0X21vZGUodmNwdSkgJiYgbmVzdGVkX2V4aXRfb25faW50cih2Y3B1KSkKKwkJLyogV2UgY2FuIGdldCBoZXJlIHdoZW4gbmVzdGVkX3J1bl9wZW5kaW5nIGNhdXNlZAorCQkgKiB2bXhfaW50ZXJydXB0X2FsbG93ZWQoKSB0byByZXR1cm4gZmFsc2UuIEluIHRoaXMgY2FzZSwgZG8KKwkJICogbm90aGluZyAtIHRoZSBpbnRlcnJ1cHQgd2lsbCBiZSBpbmplY3RlZCBsYXRlci4KKwkJICovCisJCXJldHVybjsKIAogCWNwdV9iYXNlZF92bV9leGVjX2NvbnRyb2wgPSB2bWNzX3JlYWQzMihDUFVfQkFTRURfVk1fRVhFQ19DT05UUk9MKTsKIAljcHVfYmFzZWRfdm1fZXhlY19jb250cm9sIHw9IENQVV9CQVNFRF9WSVJUVUFMX0lOVFJfUEVORElORzsKQEAgLTMwNDgsNiArMzg5NCw5IEBACiB7CiAJc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7CiAKKwlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkKKwkJcmV0dXJuOworCiAJaWYgKCFjcHVfaGFzX3ZpcnR1YWxfbm1pcygpKSB7CiAJCS8qCiAJCSAqIFRyYWNraW5nIHRoZSBOTUktYmxvY2tlZCBzdGF0ZSBpbiBzb2Z0d2FyZSBpcyBidWlsdCB1cG9uCkBAIC0zMTE0LDYgKzM5NjMsMTcgQEAKIAogc3RhdGljIGludCB2bXhfaW50ZXJydXB0X2FsbG93ZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCWlmIChpc19ndWVzdF9tb2RlKHZjcHUpICYmIG5lc3RlZF9leGl0X29uX2ludHIodmNwdSkpIHsKKwkJc3RydWN0IHZtY3MxMiAqdm1jczEyOworCQlpZiAodG9fdm14KHZjcHUpLT5uZXN0ZWQubmVzdGVkX3J1bl9wZW5kaW5nKQorCQkJcmV0dXJuIDA7CisJCW5lc3RlZF92bXhfdm1leGl0KHZjcHUpOworCQl2bWNzMTIgPSBnZXRfdm1jczEyKHZjcHUpOworCQl2bWNzMTItPnZtX2V4aXRfcmVhc29uID0gRVhJVF9SRUFTT05fRVhURVJOQUxfSU5URVJSVVBUOworCQl2bWNzMTItPnZtX2V4aXRfaW50cl9pbmZvID0gMDsKKwkJLyogZmFsbCB0aHJvdWdoIHRvIG5vcm1hbCBjb2RlLCBidXQgbm93IGluIEwxLCBub3QgTDIgKi8KKwl9CisKIAlyZXR1cm4gKHZtY3NfcmVhZGwoR1VFU1RfUkZMQUdTKSAmIFg4Nl9FRkxBR1NfSUYpICYmCiAJCSEodm1jc19yZWFkMzIoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPKSAmCiAJCQkoR1VFU1RfSU5UUl9TVEFURV9TVEkgfCBHVUVTVF9JTlRSX1NUQVRFX01PVl9TUykpOwpAQCAtMzM1NSw2ICs0MjE1LDU4IEBACiAJaHlwZXJjYWxsWzJdID0gMHhjMTsKIH0KIAorLyogY2FsbGVkIHRvIHNldCBjcjAgYXMgYXBwcm9yaWF0ZSBmb3IgYSBtb3YtdG8tY3IwIGV4aXQuICovCitzdGF0aWMgaW50IGhhbmRsZV9zZXRfY3IwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJaWYgKHRvX3ZteCh2Y3B1KS0+bmVzdGVkLnZteG9uICYmCisJICAgICgodmFsICYgVk1YT05fQ1IwX0FMV0FZU09OKSAhPSBWTVhPTl9DUjBfQUxXQVlTT04pKQorCQlyZXR1cm4gMTsKKworCWlmIChpc19ndWVzdF9tb2RlKHZjcHUpKSB7CisJCS8qCisJCSAqIFdlIGdldCBoZXJlIHdoZW4gTDIgY2hhbmdlZCBjcjAgaW4gYSB3YXkgdGhhdCBkaWQgbm90IGNoYW5nZQorCQkgKiBhbnkgb2YgTDEncyBzaGFkb3dlZCBiaXRzIChzZWUgbmVzdGVkX3ZteF9leGl0X2hhbmRsZWRfY3IpLAorCQkgKiBidXQgZGlkIGNoYW5nZSBMMCBzaGFkb3dlZCBiaXRzLiBUaGlzIGNhbiBjdXJyZW50bHkgaGFwcGVuCisJCSAqIHdpdGggdGhlIFRTIGJpdDogTDAgbWF5IHdhbnQgdG8gbGVhdmUgVFMgb24gKGZvciBsYXp5IGZwdQorCQkgKiBsb2FkaW5nKSB3aGlsZSBwcmV0ZW5kaW5nIHRvIGFsbG93IHRoZSBndWVzdCB0byBjaGFuZ2UgaXQuCisJCSAqLworCQlpZiAoa3ZtX3NldF9jcjAodmNwdSwgKHZhbCAmIHZjcHUtPmFyY2guY3IwX2d1ZXN0X293bmVkX2JpdHMpIHwKKwkJCSAodmNwdS0+YXJjaC5jcjAgJiB+dmNwdS0+YXJjaC5jcjBfZ3Vlc3Rfb3duZWRfYml0cykpKQorCQkJcmV0dXJuIDE7CisJCXZtY3Nfd3JpdGVsKENSMF9SRUFEX1NIQURPVywgdmFsKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiBrdm1fc2V0X2NyMCh2Y3B1LCB2YWwpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9zZXRfY3I0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJaWYgKGlzX2d1ZXN0X21vZGUodmNwdSkpIHsKKwkJaWYgKGt2bV9zZXRfY3I0KHZjcHUsICh2YWwgJiB2Y3B1LT5hcmNoLmNyNF9ndWVzdF9vd25lZF9iaXRzKSB8CisJCQkgKHZjcHUtPmFyY2guY3I0ICYgfnZjcHUtPmFyY2guY3I0X2d1ZXN0X293bmVkX2JpdHMpKSkKKwkJCXJldHVybiAxOworCQl2bWNzX3dyaXRlbChDUjRfUkVBRF9TSEFET1csIHZhbCk7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4ga3ZtX3NldF9jcjQodmNwdSwgdmFsKTsKK30KKworLyogY2FsbGVkIHRvIHNldCBjcjAgYXMgYXBwcm9yaWF0ZSBmb3IgY2x0cyBpbnN0cnVjdGlvbiBleGl0LiAqLworc3RhdGljIHZvaWQgaGFuZGxlX2NsdHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWlmIChpc19ndWVzdF9tb2RlKHZjcHUpKSB7CisJCS8qCisJCSAqIFdlIGdldCBoZXJlIHdoZW4gTDIgZGlkIENMVFMsIGFuZCBMMSBkaWRuJ3Qgc2hhZG93IENSMC5UUworCQkgKiBidXQgd2UgZGlkICghZnB1X2FjdGl2ZSkuIFdlIG5lZWQgdG8ga2VlcCBHVUVTVF9DUjAuVFMgb24sCisJCSAqIGp1c3QgcHJldGVuZCBpdCdzIG9mZiAoYWxzbyBpbiBhcmNoLmNyMCBmb3IgZnB1X2FjdGl2YXRlKS4KKwkJICovCisJCXZtY3Nfd3JpdGVsKENSMF9SRUFEX1NIQURPVywKKwkJCXZtY3NfcmVhZGwoQ1IwX1JFQURfU0hBRE9XKSAmIH5YODZfQ1IwX1RTKTsKKwkJdmNwdS0+YXJjaC5jcjAgJj0gflg4Nl9DUjBfVFM7CisJfSBlbHNlCisJCXZteF9zZXRfY3IwKHZjcHUsIGt2bV9yZWFkX2NyMF9iaXRzKHZjcHUsIH5YODZfQ1IwX1RTKSk7Cit9CisKIHN0YXRpYyBpbnQgaGFuZGxlX2NyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGV4aXRfcXVhbGlmaWNhdGlvbiwgdmFsOwpAQCAtMzM3MSw3ICs0MjgzLDcgQEAKIAkJdHJhY2Vfa3ZtX2NyX3dyaXRlKGNyLCB2YWwpOwogCQlzd2l0Y2ggKGNyKSB7CiAJCWNhc2UgMDoKLQkJCWVyciA9IGt2bV9zZXRfY3IwKHZjcHUsIHZhbCk7CisJCQllcnIgPSBoYW5kbGVfc2V0X2NyMCh2Y3B1LCB2YWwpOwogCQkJa3ZtX2NvbXBsZXRlX2luc25fZ3AodmNwdSwgZXJyKTsKIAkJCXJldHVybiAxOwogCQljYXNlIDM6CkBAIC0zMzc5LDcgKzQyOTEsNyBAQAogCQkJa3ZtX2NvbXBsZXRlX2luc25fZ3AodmNwdSwgZXJyKTsKIAkJCXJldHVybiAxOwogCQljYXNlIDQ6Ci0JCQllcnIgPSBrdm1fc2V0X2NyNCh2Y3B1LCB2YWwpOworCQkJZXJyID0gaGFuZGxlX3NldF9jcjQodmNwdSwgdmFsKTsKIAkJCWt2bV9jb21wbGV0ZV9pbnNuX2dwKHZjcHUsIGVycik7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSA4OiB7CkBAIC0zMzk3LDcgKzQzMDksNyBAQAogCQl9OwogCQlicmVhazsKIAljYXNlIDI6IC8qIGNsdHMgKi8KLQkJdm14X3NldF9jcjAodmNwdSwga3ZtX3JlYWRfY3IwX2JpdHModmNwdSwgflg4Nl9DUjBfVFMpKTsKKwkJaGFuZGxlX2NsdHModmNwdSk7CiAJCXRyYWNlX2t2bV9jcl93cml0ZSgwLCBrdm1fcmVhZF9jcjAodmNwdSkpOwogCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOwogCQl2bXhfZnB1X2FjdGl2YXRlKHZjcHUpOwpAQCAtMzU3MywxMiArNDQ4NSw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgaGFuZGxlX3ZteF9pbnNuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlrdm1fcXVldWVfZXhjZXB0aW9uKHZjcHUsIFVEX1ZFQ1RPUik7Ci0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpbnQgaGFuZGxlX2ludmQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXJldHVybiBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDApID09IEVNVUxBVEVfRE9ORTsKQEAgLTM3NzYsMTEgKzQ2ODIsMTkgQEAKIHN0YXRpYyBpbnQgaGFuZGxlX2VwdF9taXNjb25maWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXU2NCBzcHRlc1s0XTsKLQlpbnQgbnJfc3B0ZXMsIGk7CisJaW50IG5yX3NwdGVzLCBpLCByZXQ7CiAJZ3BhX3QgZ3BhOwogCiAJZ3BhID0gdm1jc19yZWFkNjQoR1VFU1RfUEhZU0lDQUxfQUREUkVTUyk7CiAKKwlyZXQgPSBoYW5kbGVfbW1pb19wYWdlX2ZhdWx0X2NvbW1vbih2Y3B1LCBncGEsIHRydWUpOworCWlmIChsaWtlbHkocmV0ID09IDEpKQorCQlyZXR1cm4geDg2X2VtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgZ3BhLCAwLCBOVUxMLCAwKSA9PQorCQkJCQkgICAgICBFTVVMQVRFX0RPTkU7CisJaWYgKHVubGlrZWx5KCFyZXQpKQorCQlyZXR1cm4gMTsKKworCS8qIEl0IGlzIHRoZSByZWFsIGVwdCBtaXNjb25maWcgKi8KIAlwcmludGsoS0VSTl9FUlIgIkVQVDogTWlzY29uZmlndXJhdGlvbi5cbiIpOwogCXByaW50ayhLRVJOX0VSUiAiRVBUOiBHUEE6IDB4JWxseFxuIiwgZ3BhKTsKIApAQCAtMzg2NSw2ICs0Nzc5LDYzOSBAQAogfQogCiAvKgorICogVG8gcnVuIGFuIEwyIGd1ZXN0LCB3ZSBuZWVkIGEgdm1jczAyIGJhc2VkIG9uIHRoZSBMMS1zcGVjaWZpZWQgdm1jczEyLgorICogV2UgY291bGQgcmV1c2UgYSBzaW5nbGUgVk1DUyBmb3IgYWxsIHRoZSBMMiBndWVzdHMsIGJ1dCB3ZSBhbHNvIHdhbnQgdGhlCisgKiBvcHRpb24gdG8gYWxsb2NhdGUgYSBzZXBhcmF0ZSB2bWNzMDIgZm9yIGVhY2ggc2VwYXJhdGUgbG9hZGVkIHZtY3MxMiAtIHRoaXMKKyAqIGFsbG93cyBrZWVwaW5nIHRoZW0gbG9hZGVkIG9uIHRoZSBwcm9jZXNzb3IsIGFuZCBpbiB0aGUgZnV0dXJlIHdpbGwgYWxsb3cKKyAqIG9wdGltaXphdGlvbnMgd2hlcmUgcHJlcGFyZV92bWNzMDIgZG9lc24ndCBuZWVkIHRvIHNldCBhbGwgdGhlIGZpZWxkcyBvbgorICogZXZlcnkgZW50cnkgaWYgdGhleSBuZXZlciBjaGFuZ2UuCisgKiBTbyB3ZSBrZWVwLCBpbiB2bXgtPm5lc3RlZC52bWNzMDJfcG9vbCwgYSBjYWNoZSBvZiBzaXplIFZNQ1MwMl9QT09MX1NJWkUKKyAqICg+PTApIHdpdGggYSB2bWNzMDIgZm9yIGVhY2ggcmVjZW50bHkgbG9hZGVkIHZtY3MxMnMsIG1vc3QgcmVjZW50IGZpcnN0LgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFsbG9jYXRlIGFuZCBmcmVlIGEgdm1jczAyIGluIHRoaXMgcG9vbC4KKyAqLworCisvKiBHZXQgYSBWTUNTIGZyb20gdGhlIHBvb2wgdG8gdXNlIGFzIHZtY3MwMiBmb3IgdGhlIGN1cnJlbnQgdm1jczEyLiAqLworc3RhdGljIHN0cnVjdCBsb2FkZWRfdm1jcyAqbmVzdGVkX2dldF9jdXJyZW50X3ZtY3MwMihzdHJ1Y3QgdmNwdV92bXggKnZteCkKK3sKKwlzdHJ1Y3Qgdm1jczAyX2xpc3QgKml0ZW07CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVtLCAmdm14LT5uZXN0ZWQudm1jczAyX3Bvb2wsIGxpc3QpCisJCWlmIChpdGVtLT52bXB0ciA9PSB2bXgtPm5lc3RlZC5jdXJyZW50X3ZtcHRyKSB7CisJCQlsaXN0X21vdmUoJml0ZW0tPmxpc3QsICZ2bXgtPm5lc3RlZC52bWNzMDJfcG9vbCk7CisJCQlyZXR1cm4gJml0ZW0tPnZtY3MwMjsKKwkJfQorCisJaWYgKHZteC0+bmVzdGVkLnZtY3MwMl9udW0gPj0gbWF4KFZNQ1MwMl9QT09MX1NJWkUsIDEpKSB7CisJCS8qIFJlY3ljbGUgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgVk1DUy4gKi8KKwkJaXRlbSA9IGxpc3RfZW50cnkodm14LT5uZXN0ZWQudm1jczAyX3Bvb2wucHJldiwKKwkJCXN0cnVjdCB2bWNzMDJfbGlzdCwgbGlzdCk7CisJCWl0ZW0tPnZtcHRyID0gdm14LT5uZXN0ZWQuY3VycmVudF92bXB0cjsKKwkJbGlzdF9tb3ZlKCZpdGVtLT5saXN0LCAmdm14LT5uZXN0ZWQudm1jczAyX3Bvb2wpOworCQlyZXR1cm4gJml0ZW0tPnZtY3MwMjsKKwl9CisKKwkvKiBDcmVhdGUgYSBuZXcgVk1DUyAqLworCWl0ZW0gPSAoc3RydWN0IHZtY3MwMl9saXN0ICopCisJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWNzMDJfbGlzdCksIEdGUF9LRVJORUwpOworCWlmICghaXRlbSkKKwkJcmV0dXJuIE5VTEw7CisJaXRlbS0+dm1jczAyLnZtY3MgPSBhbGxvY192bWNzKCk7CisJaWYgKCFpdGVtLT52bWNzMDIudm1jcykgeworCQlrZnJlZShpdGVtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWxvYWRlZF92bWNzX2luaXQoJml0ZW0tPnZtY3MwMik7CisJaXRlbS0+dm1wdHIgPSB2bXgtPm5lc3RlZC5jdXJyZW50X3ZtcHRyOworCWxpc3RfYWRkKCYoaXRlbS0+bGlzdCksICYodm14LT5uZXN0ZWQudm1jczAyX3Bvb2wpKTsKKwl2bXgtPm5lc3RlZC52bWNzMDJfbnVtKys7CisJcmV0dXJuICZpdGVtLT52bWNzMDI7Cit9CisKKy8qIEZyZWUgYW5kIHJlbW92ZSBmcm9tIHBvb2wgYSB2bWNzMDIgc2F2ZWQgZm9yIGEgdm1jczEyIChpZiB0aGVyZSBpcyBvbmUpICovCitzdGF0aWMgdm9pZCBuZXN0ZWRfZnJlZV92bWNzMDIoc3RydWN0IHZjcHVfdm14ICp2bXgsIGdwYV90IHZtcHRyKQoreworCXN0cnVjdCB2bWNzMDJfbGlzdCAqaXRlbTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZW0sICZ2bXgtPm5lc3RlZC52bWNzMDJfcG9vbCwgbGlzdCkKKwkJaWYgKGl0ZW0tPnZtcHRyID09IHZtcHRyKSB7CisJCQlmcmVlX2xvYWRlZF92bWNzKCZpdGVtLT52bWNzMDIpOworCQkJbGlzdF9kZWwoJml0ZW0tPmxpc3QpOworCQkJa2ZyZWUoaXRlbSk7CisJCQl2bXgtPm5lc3RlZC52bWNzMDJfbnVtLS07CisJCQlyZXR1cm47CisJCX0KK30KKworLyoKKyAqIEZyZWUgYWxsIFZNQ1NzIHNhdmVkIGZvciB0aGlzIHZjcHUsIGV4Y2VwdCB0aGUgb25lIHBvaW50ZWQgYnkKKyAqIHZteC0+bG9hZGVkX3ZtY3MuIFRoZXNlIGluY2x1ZGUgdGhlIFZNQ1NzIGluIHZtY3MwMl9wb29sIChleGNlcHQgdGhlIG9uZQorICogY3VycmVudGx5IHVzZWQsIGlmIHJ1bm5pbmcgTDIpLCBhbmQgdm1jczAxIHdoZW4gcnVubmluZyBMMi4KKyAqLworc3RhdGljIHZvaWQgbmVzdGVkX2ZyZWVfYWxsX3NhdmVkX3ZtY3NzKHN0cnVjdCB2Y3B1X3ZteCAqdm14KQoreworCXN0cnVjdCB2bWNzMDJfbGlzdCAqaXRlbSwgKm47CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGl0ZW0sIG4sICZ2bXgtPm5lc3RlZC52bWNzMDJfcG9vbCwgbGlzdCkgeworCQlpZiAodm14LT5sb2FkZWRfdm1jcyAhPSAmaXRlbS0+dm1jczAyKQorCQkJZnJlZV9sb2FkZWRfdm1jcygmaXRlbS0+dm1jczAyKTsKKwkJbGlzdF9kZWwoJml0ZW0tPmxpc3QpOworCQlrZnJlZShpdGVtKTsKKwl9CisJdm14LT5uZXN0ZWQudm1jczAyX251bSA9IDA7CisKKwlpZiAodm14LT5sb2FkZWRfdm1jcyAhPSAmdm14LT52bWNzMDEpCisJCWZyZWVfbG9hZGVkX3ZtY3MoJnZteC0+dm1jczAxKTsKK30KKworLyoKKyAqIEVtdWxhdGUgdGhlIFZNWE9OIGluc3RydWN0aW9uLgorICogQ3VycmVudGx5LCB3ZSBqdXN0IHJlbWVtYmVyIHRoYXQgVk1YIGlzIGFjdGl2ZSwgYW5kIGRvIG5vdCBzYXZlIG9yIGV2ZW4KKyAqIGluc3BlY3QgdGhlIGFyZ3VtZW50IHRvIFZNWE9OICh0aGUgc28tY2FsbGVkICJWTVhPTiBwb2ludGVyIikgYmVjYXVzZSB3ZQorICogZG8gbm90IGN1cnJlbnRseSBuZWVkIHRvIHN0b3JlIGFueXRoaW5nIGluIHRoYXQgZ3Vlc3QtYWxsb2NhdGVkIG1lbW9yeQorICogcmVnaW9uLiBDb25zZXF1ZW50bHksIFZNQ0xFQVIgYW5kIFZNUFRSTEQgYWxzbyBkbyBub3QgdmVyaWZ5IHRoYXQgdGhlIHRoZWlyCisgKiBhcmd1bWVudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgVk1YT04gcG9pbnRlciAod2hpY2ggdGhlIHNwZWMgc2F5cyB0aGV5IGRvKS4KKyAqLworc3RhdGljIGludCBoYW5kbGVfdm1vbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bV9zZWdtZW50IGNzOworCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gdG9fdm14KHZjcHUpOworCisJLyogVGhlIEludGVsIFZNWCBJbnN0cnVjdGlvbiBSZWZlcmVuY2UgbGlzdHMgYSBidW5jaCBvZiBiaXRzIHRoYXQKKwkgKiBhcmUgcHJlcmVxdWlzaXRlIHRvIHJ1bm5pbmcgVk1YT04sIG1vc3Qgbm90YWJseSBjcjQuVk1YRSBtdXN0IGJlCisJICogc2V0IHRvIDEgKHNlZSB2bXhfc2V0X2NyNCgpIGZvciB3aGVuIHdlIGFsbG93IHRoZSBndWVzdCB0byBzZXQgdGhpcykuCisJICogT3RoZXJ3aXNlLCB3ZSBzaG91bGQgZmFpbCB3aXRoICNVRC4gV2UgdGVzdCB0aGVzZSBub3c6CisJICovCisJaWYgKCFrdm1fcmVhZF9jcjRfYml0cyh2Y3B1LCBYODZfQ1I0X1ZNWEUpIHx8CisJICAgICFrdm1fcmVhZF9jcjBfYml0cyh2Y3B1LCBYODZfQ1IwX1BFKSB8fAorCSAgICAodm14X2dldF9yZmxhZ3ModmNwdSkgJiBYODZfRUZMQUdTX1ZNKSkgeworCQlrdm1fcXVldWVfZXhjZXB0aW9uKHZjcHUsIFVEX1ZFQ1RPUik7CisJCXJldHVybiAxOworCX0KKworCXZteF9nZXRfc2VnbWVudCh2Y3B1LCAmY3MsIFZDUFVfU1JFR19DUyk7CisJaWYgKGlzX2xvbmdfbW9kZSh2Y3B1KSAmJiAhY3MubCkgeworCQlrdm1fcXVldWVfZXhjZXB0aW9uKHZjcHUsIFVEX1ZFQ1RPUik7CisJCXJldHVybiAxOworCX0KKworCWlmICh2bXhfZ2V0X2NwbCh2Y3B1KSkgeworCQlrdm1faW5qZWN0X2dwKHZjcHUsIDApOworCQlyZXR1cm4gMTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmKHZteC0+bmVzdGVkLnZtY3MwMl9wb29sKSk7CisJdm14LT5uZXN0ZWQudm1jczAyX251bSA9IDA7CisKKwl2bXgtPm5lc3RlZC52bXhvbiA9IHRydWU7CisKKwlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCXJldHVybiAxOworfQorCisvKgorICogSW50ZWwncyBWTVggSW5zdHJ1Y3Rpb24gUmVmZXJlbmNlIHNwZWNpZmllcyBhIGNvbW1vbiBzZXQgb2YgcHJlcmVxdWlzaXRlcworICogZm9yIHJ1bm5pbmcgVk1YIGluc3RydWN0aW9ucyAoZXhjZXB0IFZNWE9OLCB3aG9zZSBwcmVyZXF1aXNpdGVzIGFyZQorICogc2xpZ2h0bHkgZGlmZmVyZW50KS4gSXQgYWxzbyBzcGVjaWZpZXMgd2hhdCBleGNlcHRpb24gdG8gaW5qZWN0IG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBuZXN0ZWRfdm14X2NoZWNrX3Blcm1pc3Npb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1fc2VnbWVudCBjczsKKwlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKKworCWlmICghdm14LT5uZXN0ZWQudm14b24pIHsKKwkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbih2Y3B1LCBVRF9WRUNUT1IpOworCQlyZXR1cm4gMDsKKwl9CisKKwl2bXhfZ2V0X3NlZ21lbnQodmNwdSwgJmNzLCBWQ1BVX1NSRUdfQ1MpOworCWlmICgodm14X2dldF9yZmxhZ3ModmNwdSkgJiBYODZfRUZMQUdTX1ZNKSB8fAorCSAgICAoaXNfbG9uZ19tb2RlKHZjcHUpICYmICFjcy5sKSkgeworCQlrdm1fcXVldWVfZXhjZXB0aW9uKHZjcHUsIFVEX1ZFQ1RPUik7CisJCXJldHVybiAwOworCX0KKworCWlmICh2bXhfZ2V0X2NwbCh2Y3B1KSkgeworCQlrdm1faW5qZWN0X2dwKHZjcHUsIDApOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZyZWUgd2hhdGV2ZXIgbmVlZHMgdG8gYmUgZnJlZWQgZnJvbSB2bXgtPm5lc3RlZCB3aGVuIEwxIGdvZXMgZG93biwgb3IKKyAqIGp1c3Qgc3RvcHMgdXNpbmcgVk1YLgorICovCitzdGF0aWMgdm9pZCBmcmVlX25lc3RlZChzdHJ1Y3QgdmNwdV92bXggKnZteCkKK3sKKwlpZiAoIXZteC0+bmVzdGVkLnZteG9uKQorCQlyZXR1cm47CisJdm14LT5uZXN0ZWQudm14b24gPSBmYWxzZTsKKwlpZiAodm14LT5uZXN0ZWQuY3VycmVudF92bXB0ciAhPSAtMXVsbCkgeworCQlrdW5tYXAodm14LT5uZXN0ZWQuY3VycmVudF92bWNzMTJfcGFnZSk7CisJCW5lc3RlZF9yZWxlYXNlX3BhZ2Uodm14LT5uZXN0ZWQuY3VycmVudF92bWNzMTJfcGFnZSk7CisJCXZteC0+bmVzdGVkLmN1cnJlbnRfdm1wdHIgPSAtMXVsbDsKKwkJdm14LT5uZXN0ZWQuY3VycmVudF92bWNzMTIgPSBOVUxMOworCX0KKwkvKiBVbnBpbiBwaHlzaWNhbCBtZW1vcnkgd2UgcmVmZXJyZWQgdG8gaW4gY3VycmVudCB2bWNzMDIgKi8KKwlpZiAodm14LT5uZXN0ZWQuYXBpY19hY2Nlc3NfcGFnZSkgeworCQluZXN0ZWRfcmVsZWFzZV9wYWdlKHZteC0+bmVzdGVkLmFwaWNfYWNjZXNzX3BhZ2UpOworCQl2bXgtPm5lc3RlZC5hcGljX2FjY2Vzc19wYWdlID0gMDsKKwl9CisKKwluZXN0ZWRfZnJlZV9hbGxfc2F2ZWRfdm1jc3Modm14KTsKK30KKworLyogRW11bGF0ZSB0aGUgVk1YT0ZGIGluc3RydWN0aW9uICovCitzdGF0aWMgaW50IGhhbmRsZV92bW9mZihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaWYgKCFuZXN0ZWRfdm14X2NoZWNrX3Blcm1pc3Npb24odmNwdSkpCisJCXJldHVybiAxOworCWZyZWVfbmVzdGVkKHRvX3ZteCh2Y3B1KSk7CisJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIERlY29kZSB0aGUgbWVtb3J5LWFkZHJlc3Mgb3BlcmFuZCBvZiBhIHZteCBpbnN0cnVjdGlvbiwgYXMgcmVjb3JkZWQgb24gYW4KKyAqIGV4aXQgY2F1c2VkIGJ5IHN1Y2ggYW4gaW5zdHJ1Y3Rpb24gKHJ1biBieSBhIGd1ZXN0IGh5cGVydmlzb3IpLgorICogT24gc3VjY2VzcywgcmV0dXJucyAwLiBXaGVuIHRoZSBvcGVyYW5kIGlzIGludmFsaWQsIHJldHVybnMgMSBhbmQgdGhyb3dzCisgKiAjVUQgb3IgI0dQLgorICovCitzdGF0aWMgaW50IGdldF92bXhfbWVtX2FkZHJlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSB1bnNpZ25lZCBsb25nIGV4aXRfcXVhbGlmaWNhdGlvbiwKKwkJCQkgdTMyIHZteF9pbnN0cnVjdGlvbl9pbmZvLCBndmFfdCAqcmV0KQoreworCS8qCisJICogQWNjb3JkaW5nIHRvIFZvbC4gM0IsICJJbmZvcm1hdGlvbiBmb3IgVk0gRXhpdHMgRHVlIHRvIEluc3RydWN0aW9uCisJICogRXhlY3V0aW9uIiwgb24gYW4gZXhpdCwgdm14X2luc3RydWN0aW9uX2luZm8gaG9sZHMgbW9zdCBvZiB0aGUKKwkgKiBhZGRyZXNzaW5nIGNvbXBvbmVudHMgb2YgdGhlIG9wZXJhbmQuIE9ubHkgdGhlIGRpc3BsYWNlbWVudCBwYXJ0CisJICogaXMgcHV0IGluIGV4aXRfcXVhbGlmaWNhdGlvbiAoc2VlIDNCLCAiQmFzaWMgVk0tRXhpdCBJbmZvcm1hdGlvbiIpLgorCSAqIEZvciBob3cgYW4gYWN0dWFsIGFkZHJlc3MgaXMgY2FsY3VsYXRlZCBmcm9tIGFsbCB0aGVzZSBjb21wb25lbnRzLAorCSAqIHJlZmVyIHRvIFZvbC4gMSwgIk9wZXJhbmQgQWRkcmVzc2luZyIuCisJICovCisJaW50ICBzY2FsaW5nID0gdm14X2luc3RydWN0aW9uX2luZm8gJiAzOworCWludCAgYWRkcl9zaXplID0gKHZteF9pbnN0cnVjdGlvbl9pbmZvID4+IDcpICYgNzsKKwlib29sIGlzX3JlZyA9IHZteF9pbnN0cnVjdGlvbl9pbmZvICYgKDF1IDw8IDEwKTsKKwlpbnQgIHNlZ19yZWcgPSAodm14X2luc3RydWN0aW9uX2luZm8gPj4gMTUpICYgNzsKKwlpbnQgIGluZGV4X3JlZyA9ICh2bXhfaW5zdHJ1Y3Rpb25faW5mbyA+PiAxOCkgJiAweGY7CisJYm9vbCBpbmRleF9pc192YWxpZCA9ICEodm14X2luc3RydWN0aW9uX2luZm8gJiAoMXUgPDwgMjIpKTsKKwlpbnQgIGJhc2VfcmVnICAgICAgID0gKHZteF9pbnN0cnVjdGlvbl9pbmZvID4+IDIzKSAmIDB4ZjsKKwlib29sIGJhc2VfaXNfdmFsaWQgID0gISh2bXhfaW5zdHJ1Y3Rpb25faW5mbyAmICgxdSA8PCAyNykpOworCisJaWYgKGlzX3JlZykgeworCQlrdm1fcXVldWVfZXhjZXB0aW9uKHZjcHUsIFVEX1ZFQ1RPUik7CisJCXJldHVybiAxOworCX0KKworCS8qIEFkZHIgPSBzZWdtZW50X2Jhc2UgKyBvZmZzZXQgKi8KKwkvKiBvZmZzZXQgPSBiYXNlICsgW2luZGV4ICogc2NhbGVdICsgZGlzcGxhY2VtZW50ICovCisJKnJldCA9IHZteF9nZXRfc2VnbWVudF9iYXNlKHZjcHUsIHNlZ19yZWcpOworCWlmIChiYXNlX2lzX3ZhbGlkKQorCQkqcmV0ICs9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIGJhc2VfcmVnKTsKKwlpZiAoaW5kZXhfaXNfdmFsaWQpCisJCSpyZXQgKz0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgaW5kZXhfcmVnKTw8c2NhbGluZzsKKwkqcmV0ICs9IGV4aXRfcXVhbGlmaWNhdGlvbjsgLyogaG9sZHMgdGhlIGRpc3BsYWNlbWVudCAqLworCisJaWYgKGFkZHJfc2l6ZSA9PSAxKSAvKiAzMiBiaXQgKi8KKwkJKnJldCAmPSAweGZmZmZmZmZmOworCisJLyoKKwkgKiBUT0RPOiB0aHJvdyAjR1AgKGFuZCByZXR1cm4gMSkgaW4gdmFyaW91cyBjYXNlcyB0aGF0IHRoZSBWTSoKKwkgKiBpbnN0cnVjdGlvbnMgcmVxdWlyZSBpdCAtIGUuZy4sIG9mZnNldCBiZXlvbmQgc2VnbWVudCBsaW1pdCwKKwkgKiB1bnVzYWJsZSBvciB1bnJlYWRhYmxlL3Vud3JpdGFibGUgc2VnbWVudCwgbm9uLWNhbm9uaWNhbCA2NC1iaXQKKwkgKiBhZGRyZXNzLCBhbmQgc28gb24uIEN1cnJlbnRseSB0aGVzZSBhcmUgbm90IGNoZWNrZWQuCisJICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIDMgZnVuY3Rpb25zLCBuZXN0ZWRfdm14X3N1Y2NlZWQoKS9mYWlsVmFsaWQoKS9mYWlsSW52YWxpZCgpLAorICogc2V0IHRoZSBzdWNjZXNzIG9yIGVycm9yIGNvZGUgb2YgYW4gZW11bGF0ZWQgVk1YIGluc3RydWN0aW9uLCBhcyBzcGVjaWZpZWQKKyAqIGJ5IFZvbCAyQiwgVk1YIEluc3RydWN0aW9uIFJlZmVyZW5jZSwgIkNvbnZlbnRpb25zIi4KKyAqLworc3RhdGljIHZvaWQgbmVzdGVkX3ZteF9zdWNjZWVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl2bXhfc2V0X3JmbGFncyh2Y3B1LCB2bXhfZ2V0X3JmbGFncyh2Y3B1KQorCQkJJiB+KFg4Nl9FRkxBR1NfQ0YgfCBYODZfRUZMQUdTX1BGIHwgWDg2X0VGTEFHU19BRiB8CisJCQkgICAgWDg2X0VGTEFHU19aRiB8IFg4Nl9FRkxBR1NfU0YgfCBYODZfRUZMQUdTX09GKSk7Cit9CisKK3N0YXRpYyB2b2lkIG5lc3RlZF92bXhfZmFpbEludmFsaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXZteF9zZXRfcmZsYWdzKHZjcHUsICh2bXhfZ2V0X3JmbGFncyh2Y3B1KQorCQkJJiB+KFg4Nl9FRkxBR1NfUEYgfCBYODZfRUZMQUdTX0FGIHwgWDg2X0VGTEFHU19aRiB8CisJCQkgICAgWDg2X0VGTEFHU19TRiB8IFg4Nl9FRkxBR1NfT0YpKQorCQkJfCBYODZfRUZMQUdTX0NGKTsKK30KKworc3RhdGljIHZvaWQgbmVzdGVkX3ZteF9mYWlsVmFsaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCQl1MzIgdm1faW5zdHJ1Y3Rpb25fZXJyb3IpCit7CisJaWYgKHRvX3ZteCh2Y3B1KS0+bmVzdGVkLmN1cnJlbnRfdm1wdHIgPT0gLTF1bGwpIHsKKwkJLyoKKwkJICogZmFpbFZhbGlkIHdyaXRlcyB0aGUgZXJyb3IgbnVtYmVyIHRvIHRoZSBjdXJyZW50IFZNQ1MsIHdoaWNoCisJCSAqIGNhbid0IGJlIGRvbmUgdGhlcmUgaXNuJ3QgYSBjdXJyZW50IFZNQ1MuCisJCSAqLworCQluZXN0ZWRfdm14X2ZhaWxJbnZhbGlkKHZjcHUpOworCQlyZXR1cm47CisJfQorCXZteF9zZXRfcmZsYWdzKHZjcHUsICh2bXhfZ2V0X3JmbGFncyh2Y3B1KQorCQkJJiB+KFg4Nl9FRkxBR1NfQ0YgfCBYODZfRUZMQUdTX1BGIHwgWDg2X0VGTEFHU19BRiB8CisJCQkgICAgWDg2X0VGTEFHU19TRiB8IFg4Nl9FRkxBR1NfT0YpKQorCQkJfCBYODZfRUZMQUdTX1pGKTsKKwlnZXRfdm1jczEyKHZjcHUpLT52bV9pbnN0cnVjdGlvbl9lcnJvciA9IHZtX2luc3RydWN0aW9uX2Vycm9yOworfQorCisvKiBFbXVsYXRlIHRoZSBWTUNMRUFSIGluc3RydWN0aW9uICovCitzdGF0aWMgaW50IGhhbmRsZV92bWNsZWFyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKKwlndmFfdCBndmE7CisJZ3BhX3Qgdm1wdHI7CisJc3RydWN0IHZtY3MxMiAqdm1jczEyOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCB4ODZfZXhjZXB0aW9uIGU7CisKKwlpZiAoIW5lc3RlZF92bXhfY2hlY2tfcGVybWlzc2lvbih2Y3B1KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZ2V0X3ZteF9tZW1fYWRkcmVzcyh2Y3B1LCB2bWNzX3JlYWRsKEVYSVRfUVVBTElGSUNBVElPTiksCisJCQl2bWNzX3JlYWQzMihWTVhfSU5TVFJVQ1RJT05fSU5GTyksICZndmEpKQorCQlyZXR1cm4gMTsKKworCWlmIChrdm1fcmVhZF9ndWVzdF92aXJ0KCZ2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dCwgZ3ZhLCAmdm1wdHIsCisJCQkJc2l6ZW9mKHZtcHRyKSwgJmUpKSB7CisJCWt2bV9pbmplY3RfcGFnZV9mYXVsdCh2Y3B1LCAmZSk7CisJCXJldHVybiAxOworCX0KKworCWlmICghSVNfQUxJR05FRCh2bXB0ciwgUEFHRV9TSVpFKSkgeworCQluZXN0ZWRfdm14X2ZhaWxWYWxpZCh2Y3B1LCBWTVhFUlJfVk1DTEVBUl9JTlZBTElEX0FERFJFU1MpOworCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAodm1wdHIgPT0gdm14LT5uZXN0ZWQuY3VycmVudF92bXB0cikgeworCQlrdW5tYXAodm14LT5uZXN0ZWQuY3VycmVudF92bWNzMTJfcGFnZSk7CisJCW5lc3RlZF9yZWxlYXNlX3BhZ2Uodm14LT5uZXN0ZWQuY3VycmVudF92bWNzMTJfcGFnZSk7CisJCXZteC0+bmVzdGVkLmN1cnJlbnRfdm1wdHIgPSAtMXVsbDsKKwkJdm14LT5uZXN0ZWQuY3VycmVudF92bWNzMTIgPSBOVUxMOworCX0KKworCXBhZ2UgPSBuZXN0ZWRfZ2V0X3BhZ2UodmNwdSwgdm1wdHIpOworCWlmIChwYWdlID09IE5VTEwpIHsKKwkJLyoKKwkJICogRm9yIGFjY3VyYXRlIHByb2Nlc3NvciBlbXVsYXRpb24sIFZNQ0xFQVIgYmV5b25kIGF2YWlsYWJsZQorCQkgKiBwaHlzaWNhbCBtZW1vcnkgc2hvdWxkIGRvIG5vdGhpbmcgYXQgYWxsLiBIb3dldmVyLCBpdCBpcworCQkgKiBwb3NzaWJsZSB0aGF0IGEgbmVzdGVkIHZteCBidWcsIG5vdCBhIGd1ZXN0IGh5cGVydmlzb3IgYnVnLAorCQkgKiByZXN1bHRlZCBpbiB0aGlzIGNhc2UsIHNvIGxldCdzIHNodXQgZG93biBiZWZvcmUgZG9pbmcgYW55CisJCSAqIG1vcmUgZGFtYWdlOgorCQkgKi8KKwkJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1RSSVBMRV9GQVVMVCwgdmNwdSk7CisJCXJldHVybiAxOworCX0KKwl2bWNzMTIgPSBrbWFwKHBhZ2UpOworCXZtY3MxMi0+bGF1bmNoX3N0YXRlID0gMDsKKwlrdW5tYXAocGFnZSk7CisJbmVzdGVkX3JlbGVhc2VfcGFnZShwYWdlKTsKKworCW5lc3RlZF9mcmVlX3ZtY3MwMih2bXgsIHZtcHRyKTsKKworCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJbmVzdGVkX3ZteF9zdWNjZWVkKHZjcHUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG5lc3RlZF92bXhfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgYm9vbCBsYXVuY2gpOworCisvKiBFbXVsYXRlIHRoZSBWTUxBVU5DSCBpbnN0cnVjdGlvbiAqLworc3RhdGljIGludCBoYW5kbGVfdm1sYXVuY2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiBuZXN0ZWRfdm14X3J1bih2Y3B1LCB0cnVlKTsKK30KKworLyogRW11bGF0ZSB0aGUgVk1SRVNVTUUgaW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3ZtcmVzdW1lKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKworCXJldHVybiBuZXN0ZWRfdm14X3J1bih2Y3B1LCBmYWxzZSk7Cit9CisKK2VudW0gdm1jc19maWVsZF90eXBlIHsKKwlWTUNTX0ZJRUxEX1RZUEVfVTE2ID0gMCwKKwlWTUNTX0ZJRUxEX1RZUEVfVTY0ID0gMSwKKwlWTUNTX0ZJRUxEX1RZUEVfVTMyID0gMiwKKwlWTUNTX0ZJRUxEX1RZUEVfTkFUVVJBTF9XSURUSCA9IDMKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHZtY3NfZmllbGRfdHlwZSh1bnNpZ25lZCBsb25nIGZpZWxkKQoreworCWlmICgweDEgJiBmaWVsZCkJLyogdGhlICpfSElHSCBmaWVsZHMgYXJlIGFsbCAzMiBiaXQgKi8KKwkJcmV0dXJuIFZNQ1NfRklFTERfVFlQRV9VMzI7CisJcmV0dXJuIChmaWVsZCA+PiAxMykgJiAweDMgOworfQorCitzdGF0aWMgaW5saW5lIGludCB2bWNzX2ZpZWxkX3JlYWRvbmx5KHVuc2lnbmVkIGxvbmcgZmllbGQpCit7CisJcmV0dXJuICgoKGZpZWxkID4+IDEwKSAmIDB4MykgPT0gMSk7Cit9CisKKy8qCisgKiBSZWFkIGEgdm1jczEyIGZpZWxkLiBTaW5jZSB0aGVzZSBjYW4gaGF2ZSB2YXJ5aW5nIGxlbmd0aHMgYW5kIHdlIHJldHVybgorICogb25lIHR5cGUsIHdlIGNob3NlIHRoZSBiaWdnZXN0IHR5cGUgKHU2NCkgYW5kIHplcm8tZXh0ZW5kIHRoZSByZXR1cm4gdmFsdWUKKyAqIHRvIHRoYXQgc2l6ZS4gTm90ZSB0aGF0IHRoZSBjYWxsZXIsIGhhbmRsZV92bXJlYWQsIG1pZ2h0IG5lZWQgdG8gdXNlIG9ubHkKKyAqIHNvbWUgb2YgdGhlIGJpdHMgd2UgcmV0dXJuIGhlcmUgKGUuZy4sIG9uIDMyLWJpdCBndWVzdHMsIG9ubHkgMzIgYml0cyBvZgorICogNjQtYml0IGZpZWxkcyBhcmUgdG8gYmUgcmV0dXJuZWQpLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgdm1jczEyX3JlYWRfYW55KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkJdW5zaWduZWQgbG9uZyBmaWVsZCwgdTY0ICpyZXQpCit7CisJc2hvcnQgb2Zmc2V0ID0gdm1jc19maWVsZF90b19vZmZzZXQoZmllbGQpOworCWNoYXIgKnA7CisKKwlpZiAob2Zmc2V0IDwgMCkKKwkJcmV0dXJuIDA7CisKKwlwID0gKChjaGFyICopKGdldF92bWNzMTIodmNwdSkpKSArIG9mZnNldDsKKworCXN3aXRjaCAodm1jc19maWVsZF90eXBlKGZpZWxkKSkgeworCWNhc2UgVk1DU19GSUVMRF9UWVBFX05BVFVSQUxfV0lEVEg6CisJCSpyZXQgPSAqKChuYXR1cmFsX3dpZHRoICopcCk7CisJCXJldHVybiAxOworCWNhc2UgVk1DU19GSUVMRF9UWVBFX1UxNjoKKwkJKnJldCA9ICooKHUxNiAqKXApOworCQlyZXR1cm4gMTsKKwljYXNlIFZNQ1NfRklFTERfVFlQRV9VMzI6CisJCSpyZXQgPSAqKCh1MzIgKilwKTsKKwkJcmV0dXJuIDE7CisJY2FzZSBWTUNTX0ZJRUxEX1RZUEVfVTY0OgorCQkqcmV0ID0gKigodTY0ICopcCk7CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAwOyAvKiBjYW4gbmV2ZXIgaGFwcGVuLiAqLworCX0KK30KKworLyoKKyAqIFZNWCBpbnN0cnVjdGlvbnMgd2hpY2ggYXNzdW1lIGEgY3VycmVudCB2bWNzMTIgKGkuZS4sIHRoYXQgVk1QVFJMRCB3YXMKKyAqIHVzZWQgYmVmb3JlKSBhbGwgZ2VuZXJhdGUgdGhlIHNhbWUgZmFpbHVyZSB3aGVuIGl0IGlzIG1pc3NpbmcuCisgKi8KK3N0YXRpYyBpbnQgbmVzdGVkX3ZteF9jaGVja192bWNzMTIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gdG9fdm14KHZjcHUpOworCWlmICh2bXgtPm5lc3RlZC5jdXJyZW50X3ZtcHRyID09IC0xdWxsKSB7CisJCW5lc3RlZF92bXhfZmFpbEludmFsaWQodmNwdSk7CisJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYW5kbGVfdm1yZWFkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZpZWxkOworCXU2NCBmaWVsZF92YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGV4aXRfcXVhbGlmaWNhdGlvbiA9IHZtY3NfcmVhZGwoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKKwl1MzIgdm14X2luc3RydWN0aW9uX2luZm8gPSB2bWNzX3JlYWQzMihWTVhfSU5TVFJVQ1RJT05fSU5GTyk7CisJZ3ZhX3QgZ3ZhID0gMDsKKworCWlmICghbmVzdGVkX3ZteF9jaGVja19wZXJtaXNzaW9uKHZjcHUpIHx8CisJICAgICFuZXN0ZWRfdm14X2NoZWNrX3ZtY3MxMih2Y3B1KSkKKwkJcmV0dXJuIDE7CisKKwkvKiBEZWNvZGUgaW5zdHJ1Y3Rpb24gaW5mbyBhbmQgZmluZCB0aGUgZmllbGQgdG8gcmVhZCAqLworCWZpZWxkID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgKCgodm14X2luc3RydWN0aW9uX2luZm8pID4+IDI4KSAmIDB4ZikpOworCS8qIFJlYWQgdGhlIGZpZWxkLCB6ZXJvLWV4dGVuZGVkIHRvIGEgdTY0IGZpZWxkX3ZhbHVlICovCisJaWYgKCF2bWNzMTJfcmVhZF9hbnkodmNwdSwgZmllbGQsICZmaWVsZF92YWx1ZSkpIHsKKwkJbmVzdGVkX3ZteF9mYWlsVmFsaWQodmNwdSwgVk1YRVJSX1VOU1VQUE9SVEVEX1ZNQ1NfQ09NUE9ORU5UKTsKKwkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwkJcmV0dXJuIDE7CisJfQorCS8qCisJICogTm93IGNvcHkgcGFydCBvZiB0aGlzIHZhbHVlIHRvIHJlZ2lzdGVyIG9yIG1lbW9yeSwgYXMgcmVxdWVzdGVkLgorCSAqIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIGJpdHMgYWN0dWFsbHkgY29waWVkIGlzIDMyIG9yIDY0IGRlcGVuZGluZworCSAqIG9uIHRoZSBndWVzdCdzIG1vZGUgKDMyIG9yIDY0IGJpdCksIG5vdCBvbiB0aGUgZ2l2ZW4gZmllbGQncyBsZW5ndGguCisJICovCisJaWYgKHZteF9pbnN0cnVjdGlvbl9pbmZvICYgKDF1IDw8IDEwKSkgeworCQlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgKCgodm14X2luc3RydWN0aW9uX2luZm8pID4+IDMpICYgMHhmKSwKKwkJCWZpZWxkX3ZhbHVlKTsKKwl9IGVsc2UgeworCQlpZiAoZ2V0X3ZteF9tZW1fYWRkcmVzcyh2Y3B1LCBleGl0X3F1YWxpZmljYXRpb24sCisJCQkJdm14X2luc3RydWN0aW9uX2luZm8sICZndmEpKQorCQkJcmV0dXJuIDE7CisJCS8qIF9zeXN0ZW0gb2ssIGFzIG5lc3RlZF92bXhfY2hlY2tfcGVybWlzc2lvbiB2ZXJpZmllZCBjcGw9MCAqLworCQlrdm1fd3JpdGVfZ3Vlc3RfdmlydF9zeXN0ZW0oJnZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LCBndmEsCisJCQkgICAgICZmaWVsZF92YWx1ZSwgKGlzX2xvbmdfbW9kZSh2Y3B1KSA/IDggOiA0KSwgTlVMTCk7CisJfQorCisJbmVzdGVkX3ZteF9zdWNjZWVkKHZjcHUpOworCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBoYW5kbGVfdm13cml0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdW5zaWduZWQgbG9uZyBmaWVsZDsKKwlndmFfdCBndmE7CisJdW5zaWduZWQgbG9uZyBleGl0X3F1YWxpZmljYXRpb24gPSB2bWNzX3JlYWRsKEVYSVRfUVVBTElGSUNBVElPTik7CisJdTMyIHZteF9pbnN0cnVjdGlvbl9pbmZvID0gdm1jc19yZWFkMzIoVk1YX0lOU1RSVUNUSU9OX0lORk8pOworCWNoYXIgKnA7CisJc2hvcnQgb2Zmc2V0OworCS8qIFRoZSB2YWx1ZSB0byB3cml0ZSBtaWdodCBiZSAzMiBvciA2NCBiaXRzLCBkZXBlbmRpbmcgb24gTDEncyBsb25nCisJICogbW9kZSwgYW5kIGV2ZW50dWFsbHkgd2UgbmVlZCB0byB3cml0ZSB0aGF0IGludG8gYSBmaWVsZCBvZiBzZXZlcmFsCisJICogcG9zc2libGUgbGVuZ3Rocy4gVGhlIGNvZGUgYmVsb3cgZmlyc3QgemVyby1leHRlbmRzIHRoZSB2YWx1ZSB0byA2NAorCSAqIGJpdCAoZmllbGRfdmFsdWUpLCBhbmQgdGhlbiBjb3BpZXMgb25seSB0aGUgYXBwcm9yaWF0ZSBudW1iZXIgb2YKKwkgKiBiaXRzIGludG8gdGhlIHZtY3MxMiBmaWVsZC4KKwkgKi8KKwl1NjQgZmllbGRfdmFsdWUgPSAwOworCXN0cnVjdCB4ODZfZXhjZXB0aW9uIGU7CisKKwlpZiAoIW5lc3RlZF92bXhfY2hlY2tfcGVybWlzc2lvbih2Y3B1KSB8fAorCSAgICAhbmVzdGVkX3ZteF9jaGVja192bWNzMTIodmNwdSkpCisJCXJldHVybiAxOworCisJaWYgKHZteF9pbnN0cnVjdGlvbl9pbmZvICYgKDF1IDw8IDEwKSkKKwkJZmllbGRfdmFsdWUgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LAorCQkJKCgodm14X2luc3RydWN0aW9uX2luZm8pID4+IDMpICYgMHhmKSk7CisJZWxzZSB7CisJCWlmIChnZXRfdm14X21lbV9hZGRyZXNzKHZjcHUsIGV4aXRfcXVhbGlmaWNhdGlvbiwKKwkJCQl2bXhfaW5zdHJ1Y3Rpb25faW5mbywgJmd2YSkpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGt2bV9yZWFkX2d1ZXN0X3ZpcnQoJnZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LCBndmEsCisJCQkgICAmZmllbGRfdmFsdWUsIChpc19sb25nX21vZGUodmNwdSkgPyA4IDogNCksICZlKSkgeworCQkJa3ZtX2luamVjdF9wYWdlX2ZhdWx0KHZjcHUsICZlKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisKKwlmaWVsZCA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsICgoKHZteF9pbnN0cnVjdGlvbl9pbmZvKSA+PiAyOCkgJiAweGYpKTsKKwlpZiAodm1jc19maWVsZF9yZWFkb25seShmaWVsZCkpIHsKKwkJbmVzdGVkX3ZteF9mYWlsVmFsaWQodmNwdSwKKwkJCVZNWEVSUl9WTVdSSVRFX1JFQURfT05MWV9WTUNTX0NPTVBPTkVOVCk7CisJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJCXJldHVybiAxOworCX0KKworCW9mZnNldCA9IHZtY3NfZmllbGRfdG9fb2Zmc2V0KGZpZWxkKTsKKwlpZiAob2Zmc2V0IDwgMCkgeworCQluZXN0ZWRfdm14X2ZhaWxWYWxpZCh2Y3B1LCBWTVhFUlJfVU5TVVBQT1JURURfVk1DU19DT01QT05FTlQpOworCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCQlyZXR1cm4gMTsKKwl9CisJcCA9ICgoY2hhciAqKSBnZXRfdm1jczEyKHZjcHUpKSArIG9mZnNldDsKKworCXN3aXRjaCAodm1jc19maWVsZF90eXBlKGZpZWxkKSkgeworCWNhc2UgVk1DU19GSUVMRF9UWVBFX1UxNjoKKwkJKih1MTYgKilwID0gZmllbGRfdmFsdWU7CisJCWJyZWFrOworCWNhc2UgVk1DU19GSUVMRF9UWVBFX1UzMjoKKwkJKih1MzIgKilwID0gZmllbGRfdmFsdWU7CisJCWJyZWFrOworCWNhc2UgVk1DU19GSUVMRF9UWVBFX1U2NDoKKwkJKih1NjQgKilwID0gZmllbGRfdmFsdWU7CisJCWJyZWFrOworCWNhc2UgVk1DU19GSUVMRF9UWVBFX05BVFVSQUxfV0lEVEg6CisJCSoobmF0dXJhbF93aWR0aCAqKXAgPSBmaWVsZF92YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbmVzdGVkX3ZteF9mYWlsVmFsaWQodmNwdSwgVk1YRVJSX1VOU1VQUE9SVEVEX1ZNQ1NfQ09NUE9ORU5UKTsKKwkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwkJcmV0dXJuIDE7CisJfQorCisJbmVzdGVkX3ZteF9zdWNjZWVkKHZjcHUpOworCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJcmV0dXJuIDE7Cit9CisKKy8qIEVtdWxhdGUgdGhlIFZNUFRSTEQgaW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3ZtcHRybGQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gdG9fdm14KHZjcHUpOworCWd2YV90IGd2YTsKKwlncGFfdCB2bXB0cjsKKwlzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiBlOworCisJaWYgKCFuZXN0ZWRfdm14X2NoZWNrX3Blcm1pc3Npb24odmNwdSkpCisJCXJldHVybiAxOworCisJaWYgKGdldF92bXhfbWVtX2FkZHJlc3ModmNwdSwgdm1jc19yZWFkbChFWElUX1FVQUxJRklDQVRJT04pLAorCQkJdm1jc19yZWFkMzIoVk1YX0lOU1RSVUNUSU9OX0lORk8pLCAmZ3ZhKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoa3ZtX3JlYWRfZ3Vlc3RfdmlydCgmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQsIGd2YSwgJnZtcHRyLAorCQkJCXNpemVvZih2bXB0ciksICZlKSkgeworCQlrdm1faW5qZWN0X3BhZ2VfZmF1bHQodmNwdSwgJmUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIUlTX0FMSUdORUQodm1wdHIsIFBBR0VfU0laRSkpIHsKKwkJbmVzdGVkX3ZteF9mYWlsVmFsaWQodmNwdSwgVk1YRVJSX1ZNUFRSTERfSU5WQUxJRF9BRERSRVNTKTsKKwkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHZteC0+bmVzdGVkLmN1cnJlbnRfdm1wdHIgIT0gdm1wdHIpIHsKKwkJc3RydWN0IHZtY3MxMiAqbmV3X3ZtY3MxMjsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXBhZ2UgPSBuZXN0ZWRfZ2V0X3BhZ2UodmNwdSwgdm1wdHIpOworCQlpZiAocGFnZSA9PSBOVUxMKSB7CisJCQluZXN0ZWRfdm14X2ZhaWxJbnZhbGlkKHZjcHUpOworCQkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwkJCXJldHVybiAxOworCQl9CisJCW5ld192bWNzMTIgPSBrbWFwKHBhZ2UpOworCQlpZiAobmV3X3ZtY3MxMi0+cmV2aXNpb25faWQgIT0gVk1DUzEyX1JFVklTSU9OKSB7CisJCQlrdW5tYXAocGFnZSk7CisJCQluZXN0ZWRfcmVsZWFzZV9wYWdlX2NsZWFuKHBhZ2UpOworCQkJbmVzdGVkX3ZteF9mYWlsVmFsaWQodmNwdSwKKwkJCQlWTVhFUlJfVk1QVFJMRF9JTkNPUlJFQ1RfVk1DU19SRVZJU0lPTl9JRCk7CisJCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHZteC0+bmVzdGVkLmN1cnJlbnRfdm1wdHIgIT0gLTF1bGwpIHsKKwkJCWt1bm1hcCh2bXgtPm5lc3RlZC5jdXJyZW50X3ZtY3MxMl9wYWdlKTsKKwkJCW5lc3RlZF9yZWxlYXNlX3BhZ2Uodm14LT5uZXN0ZWQuY3VycmVudF92bWNzMTJfcGFnZSk7CisJCX0KKworCQl2bXgtPm5lc3RlZC5jdXJyZW50X3ZtcHRyID0gdm1wdHI7CisJCXZteC0+bmVzdGVkLmN1cnJlbnRfdm1jczEyID0gbmV3X3ZtY3MxMjsKKwkJdm14LT5uZXN0ZWQuY3VycmVudF92bWNzMTJfcGFnZSA9IHBhZ2U7CisJfQorCisJbmVzdGVkX3ZteF9zdWNjZWVkKHZjcHUpOworCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJcmV0dXJuIDE7Cit9CisKKy8qIEVtdWxhdGUgdGhlIFZNUFRSU1QgaW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3ZtcHRyc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXVuc2lnbmVkIGxvbmcgZXhpdF9xdWFsaWZpY2F0aW9uID0gdm1jc19yZWFkbChFWElUX1FVQUxJRklDQVRJT04pOworCXUzMiB2bXhfaW5zdHJ1Y3Rpb25faW5mbyA9IHZtY3NfcmVhZDMyKFZNWF9JTlNUUlVDVElPTl9JTkZPKTsKKwlndmFfdCB2bWNzX2d2YTsKKwlzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiBlOworCisJaWYgKCFuZXN0ZWRfdm14X2NoZWNrX3Blcm1pc3Npb24odmNwdSkpCisJCXJldHVybiAxOworCisJaWYgKGdldF92bXhfbWVtX2FkZHJlc3ModmNwdSwgZXhpdF9xdWFsaWZpY2F0aW9uLAorCQkJdm14X2luc3RydWN0aW9uX2luZm8sICZ2bWNzX2d2YSkpCisJCXJldHVybiAxOworCS8qIG9rIHRvIHVzZSAqX3N5c3RlbSwgYXMgbmVzdGVkX3ZteF9jaGVja19wZXJtaXNzaW9uIHZlcmlmaWVkIGNwbD0wICovCisJaWYgKGt2bV93cml0ZV9ndWVzdF92aXJ0X3N5c3RlbSgmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQsIHZtY3NfZ3ZhLAorCQkJCSAodm9pZCAqKSZ0b192bXgodmNwdSktPm5lc3RlZC5jdXJyZW50X3ZtcHRyLAorCQkJCSBzaXplb2YodTY0KSwgJmUpKSB7CisJCWt2bV9pbmplY3RfcGFnZV9mYXVsdCh2Y3B1LCAmZSk7CisJCXJldHVybiAxOworCX0KKwluZXN0ZWRfdm14X3N1Y2NlZWQodmNwdSk7CisJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwlyZXR1cm4gMTsKK30KKworLyoKICAqIFRoZSBleGl0IGhhbmRsZXJzIHJldHVybiAxIGlmIHRoZSBleGl0IHdhcyBoYW5kbGVkIGZ1bGx5IGFuZCBndWVzdCBleGVjdXRpb24KICAqIG1heSByZXN1bWUuICBPdGhlcndpc2UgdGhleSBzZXQgdGhlIGt2bV9ydW4gcGFyYW1ldGVyIHRvIGluZGljYXRlIHdoYXQgbmVlZHMKICAqIHRvIGJlIGRvbmUgdG8gdXNlcnNwYWNlIGFuZCByZXR1cm4gMC4KQEAgLTM4ODUsMTUgKzU0MzIsMTUgQEAKIAlbRVhJVF9SRUFTT05fSU5WRF0JCSAgICAgID0gaGFuZGxlX2ludmQsCiAJW0VYSVRfUkVBU09OX0lOVkxQR10JCSAgICAgID0gaGFuZGxlX2ludmxwZywKIAlbRVhJVF9SRUFTT05fVk1DQUxMXSAgICAgICAgICAgICAgICAgID0gaGFuZGxlX3ZtY2FsbCwKLQlbRVhJVF9SRUFTT05fVk1DTEVBUl0JICAgICAgICAgICAgICA9IGhhbmRsZV92bXhfaW5zbiwKLQlbRVhJVF9SRUFTT05fVk1MQVVOQ0hdICAgICAgICAgICAgICAgID0gaGFuZGxlX3ZteF9pbnNuLAotCVtFWElUX1JFQVNPTl9WTVBUUkxEXSAgICAgICAgICAgICAgICAgPSBoYW5kbGVfdm14X2luc24sCi0JW0VYSVRfUkVBU09OX1ZNUFRSU1RdICAgICAgICAgICAgICAgICA9IGhhbmRsZV92bXhfaW5zbiwKLQlbRVhJVF9SRUFTT05fVk1SRUFEXSAgICAgICAgICAgICAgICAgID0gaGFuZGxlX3ZteF9pbnNuLAotCVtFWElUX1JFQVNPTl9WTVJFU1VNRV0gICAgICAgICAgICAgICAgPSBoYW5kbGVfdm14X2luc24sCi0JW0VYSVRfUkVBU09OX1ZNV1JJVEVdICAgICAgICAgICAgICAgICA9IGhhbmRsZV92bXhfaW5zbiwKLQlbRVhJVF9SRUFTT05fVk1PRkZdICAgICAgICAgICAgICAgICAgID0gaGFuZGxlX3ZteF9pbnNuLAotCVtFWElUX1JFQVNPTl9WTU9OXSAgICAgICAgICAgICAgICAgICAgPSBoYW5kbGVfdm14X2luc24sCisJW0VYSVRfUkVBU09OX1ZNQ0xFQVJdCSAgICAgICAgICAgICAgPSBoYW5kbGVfdm1jbGVhciwKKwlbRVhJVF9SRUFTT05fVk1MQVVOQ0hdICAgICAgICAgICAgICAgID0gaGFuZGxlX3ZtbGF1bmNoLAorCVtFWElUX1JFQVNPTl9WTVBUUkxEXSAgICAgICAgICAgICAgICAgPSBoYW5kbGVfdm1wdHJsZCwKKwlbRVhJVF9SRUFTT05fVk1QVFJTVF0gICAgICAgICAgICAgICAgID0gaGFuZGxlX3ZtcHRyc3QsCisJW0VYSVRfUkVBU09OX1ZNUkVBRF0gICAgICAgICAgICAgICAgICA9IGhhbmRsZV92bXJlYWQsCisJW0VYSVRfUkVBU09OX1ZNUkVTVU1FXSAgICAgICAgICAgICAgICA9IGhhbmRsZV92bXJlc3VtZSwKKwlbRVhJVF9SRUFTT05fVk1XUklURV0gICAgICAgICAgICAgICAgID0gaGFuZGxlX3Ztd3JpdGUsCisJW0VYSVRfUkVBU09OX1ZNT0ZGXSAgICAgICAgICAgICAgICAgICA9IGhhbmRsZV92bW9mZiwKKwlbRVhJVF9SRUFTT05fVk1PTl0gICAgICAgICAgICAgICAgICAgID0gaGFuZGxlX3Ztb24sCiAJW0VYSVRfUkVBU09OX1RQUl9CRUxPV19USFJFU0hPTERdICAgICA9IGhhbmRsZV90cHJfYmVsb3dfdGhyZXNob2xkLAogCVtFWElUX1JFQVNPTl9BUElDX0FDQ0VTU10gICAgICAgICAgICAgPSBoYW5kbGVfYXBpY19hY2Nlc3MsCiAJW0VYSVRfUkVBU09OX1dCSU5WRF0gICAgICAgICAgICAgICAgICA9IGhhbmRsZV93YmludmQsCkBAIC0zOTEwLDYgKzU0NTcsMjI5IEBACiBzdGF0aWMgY29uc3QgaW50IGt2bV92bXhfbWF4X2V4aXRfaGFuZGxlcnMgPQogCUFSUkFZX1NJWkUoa3ZtX3ZteF9leGl0X2hhbmRsZXJzKTsKIAorLyoKKyAqIFJldHVybiAxIGlmIHdlIHNob3VsZCBleGl0IGZyb20gTDIgdG8gTDEgdG8gaGFuZGxlIGFuIE1TUiBhY2Nlc3MgYWNjZXNzLAorICogcmF0aGVyIHRoYW4gaGFuZGxlIGl0IG91cnNlbHZlcyBpbiBMMC4gSS5lLiwgY2hlY2sgd2hldGhlciBMMSBleHByZXNzZWQKKyAqIGRpc2ludGVyZXN0IGluIHRoZSBjdXJyZW50IGV2ZW50IChyZWFkIG9yIHdyaXRlIGEgc3BlY2lmaWMgTVNSKSBieSB1c2luZyBhbgorICogTVNSIGJpdG1hcC4gVGhpcyBtYXkgYmUgdGhlIGNhc2UgZXZlbiB3aGVuIEwwIGRvZXNuJ3QgdXNlIE1TUiBiaXRtYXBzLgorICovCitzdGF0aWMgYm9vbCBuZXN0ZWRfdm14X2V4aXRfaGFuZGxlZF9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCXN0cnVjdCB2bWNzMTIgKnZtY3MxMiwgdTMyIGV4aXRfcmVhc29uKQoreworCXUzMiBtc3JfaW5kZXggPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JDWF07CisJZ3BhX3QgYml0bWFwOworCisJaWYgKCFuZXN0ZWRfY3B1X2hhcyhnZXRfdm1jczEyKHZjcHUpLCBDUFVfQkFTRURfVVNFX01TUl9CSVRNQVBTKSkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIFRoZSBNU1JfQklUTUFQIHBhZ2UgaXMgZGl2aWRlZCBpbnRvIGZvdXIgMTAyNC1ieXRlIGJpdG1hcHMsCisJICogZm9yIHRoZSBmb3VyIGNvbWJpbmF0aW9ucyBvZiByZWFkL3dyaXRlIGFuZCBsb3cvaGlnaCBNU1IgbnVtYmVycy4KKwkgKiBGaXJzdCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggb2YgdGhlIGZvdXIgdG8gdXNlOgorCSAqLworCWJpdG1hcCA9IHZtY3MxMi0+bXNyX2JpdG1hcDsKKwlpZiAoZXhpdF9yZWFzb24gPT0gRVhJVF9SRUFTT05fTVNSX1dSSVRFKQorCQliaXRtYXAgKz0gMjA0ODsKKwlpZiAobXNyX2luZGV4ID49IDB4YzAwMDAwMDApIHsKKwkJbXNyX2luZGV4IC09IDB4YzAwMDAwMDA7CisJCWJpdG1hcCArPSAxMDI0OworCX0KKworCS8qIFRoZW4gcmVhZCB0aGUgbXNyX2luZGV4J3RoIGJpdCBmcm9tIHRoaXMgYml0bWFwOiAqLworCWlmIChtc3JfaW5kZXggPCAxMDI0KjgpIHsKKwkJdW5zaWduZWQgY2hhciBiOworCQlrdm1fcmVhZF9ndWVzdCh2Y3B1LT5rdm0sIGJpdG1hcCArIG1zcl9pbmRleC84LCAmYiwgMSk7CisJCXJldHVybiAxICYgKGIgPj4gKG1zcl9pbmRleCAmIDcpKTsKKwl9IGVsc2UKKwkJcmV0dXJuIDE7IC8qIGxldCBMMSBoYW5kbGUgdGhlIHdyb25nIHBhcmFtZXRlciAqLworfQorCisvKgorICogUmV0dXJuIDEgaWYgd2Ugc2hvdWxkIGV4aXQgZnJvbSBMMiB0byBMMSB0byBoYW5kbGUgYSBDUiBhY2Nlc3MgZXhpdCwKKyAqIHJhdGhlciB0aGFuIGhhbmRsZSBpdCBvdXJzZWx2ZXMgaW4gTDAuIEkuZS4sIGNoZWNrIGlmIEwxIHdhbnRlZCB0bworICogaW50ZXJjZXB0ICh2aWEgZ3Vlc3RfaG9zdF9tYXNrIGV0Yy4pIHRoZSBjdXJyZW50IGV2ZW50LgorICovCitzdGF0aWMgYm9vbCBuZXN0ZWRfdm14X2V4aXRfaGFuZGxlZF9jcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJc3RydWN0IHZtY3MxMiAqdm1jczEyKQoreworCXVuc2lnbmVkIGxvbmcgZXhpdF9xdWFsaWZpY2F0aW9uID0gdm1jc19yZWFkbChFWElUX1FVQUxJRklDQVRJT04pOworCWludCBjciA9IGV4aXRfcXVhbGlmaWNhdGlvbiAmIDE1OworCWludCByZWcgPSAoZXhpdF9xdWFsaWZpY2F0aW9uID4+IDgpICYgMTU7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCByZWcpOworCisJc3dpdGNoICgoZXhpdF9xdWFsaWZpY2F0aW9uID4+IDQpICYgMykgeworCWNhc2UgMDogLyogbW92IHRvIGNyICovCisJCXN3aXRjaCAoY3IpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHZtY3MxMi0+Y3IwX2d1ZXN0X2hvc3RfbWFzayAmCisJCQkgICAgKHZhbCBeIHZtY3MxMi0+Y3IwX3JlYWRfc2hhZG93KSkKKwkJCQlyZXR1cm4gMTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlpZiAoKHZtY3MxMi0+Y3IzX3RhcmdldF9jb3VudCA+PSAxICYmCisJCQkJCXZtY3MxMi0+Y3IzX3RhcmdldF92YWx1ZTAgPT0gdmFsKSB8fAorCQkJCSh2bWNzMTItPmNyM190YXJnZXRfY291bnQgPj0gMiAmJgorCQkJCQl2bWNzMTItPmNyM190YXJnZXRfdmFsdWUxID09IHZhbCkgfHwKKwkJCQkodm1jczEyLT5jcjNfdGFyZ2V0X2NvdW50ID49IDMgJiYKKwkJCQkJdm1jczEyLT5jcjNfdGFyZ2V0X3ZhbHVlMiA9PSB2YWwpIHx8CisJCQkJKHZtY3MxMi0+Y3IzX3RhcmdldF9jb3VudCA+PSA0ICYmCisJCQkJCXZtY3MxMi0+Y3IzX3RhcmdldF92YWx1ZTMgPT0gdmFsKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChuZXN0ZWRfY3B1X2hhcyh2bWNzMTIsIENQVV9CQVNFRF9DUjNfTE9BRF9FWElUSU5HKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlpZiAodm1jczEyLT5jcjRfZ3Vlc3RfaG9zdF9tYXNrICYKKwkJCSAgICAodm1jczEyLT5jcjRfcmVhZF9zaGFkb3cgXiB2YWwpKQorCQkJCXJldHVybiAxOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWlmIChuZXN0ZWRfY3B1X2hhcyh2bWNzMTIsIENQVV9CQVNFRF9DUjhfTE9BRF9FWElUSU5HKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgMjogLyogY2x0cyAqLworCQlpZiAoKHZtY3MxMi0+Y3IwX2d1ZXN0X2hvc3RfbWFzayAmIFg4Nl9DUjBfVFMpICYmCisJCSAgICAodm1jczEyLT5jcjBfcmVhZF9zaGFkb3cgJiBYODZfQ1IwX1RTKSkKKwkJCXJldHVybiAxOworCQlicmVhazsKKwljYXNlIDE6IC8qIG1vdiBmcm9tIGNyICovCisJCXN3aXRjaCAoY3IpIHsKKwkJY2FzZSAzOgorCQkJaWYgKHZtY3MxMi0+Y3B1X2Jhc2VkX3ZtX2V4ZWNfY29udHJvbCAmCisJCQkgICAgQ1BVX0JBU0VEX0NSM19TVE9SRV9FWElUSU5HKQorCQkJCXJldHVybiAxOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWlmICh2bWNzMTItPmNwdV9iYXNlZF92bV9leGVjX2NvbnRyb2wgJgorCQkJICAgIENQVV9CQVNFRF9DUjhfU1RPUkVfRVhJVElORykKKwkJCQlyZXR1cm4gMTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgMzogLyogbG1zdyAqLworCQkvKgorCQkgKiBsbXN3IGNhbiBjaGFuZ2UgYml0cyAxLi4zIG9mIGNyMCwgYW5kIG9ubHkgc2V0IGJpdCAwIG9mCisJCSAqIGNyMC4gT3RoZXIgYXR0ZW1wdGVkIGNoYW5nZXMgYXJlIGlnbm9yZWQsIHdpdGggbm8gZXhpdC4KKwkJICovCisJCWlmICh2bWNzMTItPmNyMF9ndWVzdF9ob3N0X21hc2sgJiAweGUgJgorCQkgICAgKHZhbCBeIHZtY3MxMi0+Y3IwX3JlYWRfc2hhZG93KSkKKwkJCXJldHVybiAxOworCQlpZiAoKHZtY3MxMi0+Y3IwX2d1ZXN0X2hvc3RfbWFzayAmIDB4MSkgJiYKKwkJICAgICEodm1jczEyLT5jcjBfcmVhZF9zaGFkb3cgJiAweDEpICYmCisJCSAgICAodmFsICYgMHgxKSkKKwkJCXJldHVybiAxOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gMSBpZiB3ZSBzaG91bGQgZXhpdCBmcm9tIEwyIHRvIEwxIHRvIGhhbmRsZSBhbiBleGl0LCBvciAwIGlmIHdlCisgKiBzaG91bGQgaGFuZGxlIGl0IG91cnNlbHZlcyBpbiBMMCAoYW5kIHRoZW4gY29udGludWUgTDIpLiBPbmx5IGNhbGwgdGhpcworICogd2hlbiBpbiBpc19ndWVzdF9tb2RlIChMMikuCisgKi8KK3N0YXRpYyBib29sIG5lc3RlZF92bXhfZXhpdF9oYW5kbGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1MzIgZXhpdF9yZWFzb24gPSB2bWNzX3JlYWQzMihWTV9FWElUX1JFQVNPTik7CisJdTMyIGludHJfaW5mbyA9IHZtY3NfcmVhZDMyKFZNX0VYSVRfSU5UUl9JTkZPKTsKKwlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKKwlzdHJ1Y3Qgdm1jczEyICp2bWNzMTIgPSBnZXRfdm1jczEyKHZjcHUpOworCisJaWYgKHZteC0+bmVzdGVkLm5lc3RlZF9ydW5fcGVuZGluZykKKwkJcmV0dXJuIDA7CisKKwlpZiAodW5saWtlbHkodm14LT5mYWlsKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlcyBmYWlsZWQgdm0gZW50cnkgJXhcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgdm1jc19yZWFkMzIoVk1fSU5TVFJVQ1RJT05fRVJST1IpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc3dpdGNoIChleGl0X3JlYXNvbikgeworCWNhc2UgRVhJVF9SRUFTT05fRVhDRVBUSU9OX05NSToKKwkJaWYgKCFpc19leGNlcHRpb24oaW50cl9pbmZvKSkKKwkJCXJldHVybiAwOworCQllbHNlIGlmIChpc19wYWdlX2ZhdWx0KGludHJfaW5mbykpCisJCQlyZXR1cm4gZW5hYmxlX2VwdDsKKwkJcmV0dXJuIHZtY3MxMi0+ZXhjZXB0aW9uX2JpdG1hcCAmCisJCQkJKDF1IDw8IChpbnRyX2luZm8gJiBJTlRSX0lORk9fVkVDVE9SX01BU0spKTsKKwljYXNlIEVYSVRfUkVBU09OX0VYVEVSTkFMX0lOVEVSUlVQVDoKKwkJcmV0dXJuIDA7CisJY2FzZSBFWElUX1JFQVNPTl9UUklQTEVfRkFVTFQ6CisJCXJldHVybiAxOworCWNhc2UgRVhJVF9SRUFTT05fUEVORElOR19JTlRFUlJVUFQ6CisJY2FzZSBFWElUX1JFQVNPTl9OTUlfV0lORE9XOgorCQkvKgorCQkgKiBwcmVwYXJlX3ZtY3MwMigpIHNldCB0aGUgQ1BVX0JBU0VEX1ZJUlRVQUxfSU5UUl9QRU5ESU5HIGJpdAorCQkgKiAoYWthIEludGVycnVwdCBXaW5kb3cgRXhpdGluZykgb25seSB3aGVuIEwxIHR1cm5lZCBpdCBvbiwKKwkJICogc28gaWYgd2UgZ290IGEgUEVORElOR19JTlRFUlJVUFQgZXhpdCwgdGhpcyBtdXN0IGJlIGZvciBMMS4KKwkJICogU2FtZSBmb3IgTk1JIFdpbmRvdyBFeGl0aW5nLgorCQkgKi8KKwkJcmV0dXJuIDE7CisJY2FzZSBFWElUX1JFQVNPTl9UQVNLX1NXSVRDSDoKKwkJcmV0dXJuIDE7CisJY2FzZSBFWElUX1JFQVNPTl9DUFVJRDoKKwkJcmV0dXJuIDE7CisJY2FzZSBFWElUX1JFQVNPTl9ITFQ6CisJCXJldHVybiBuZXN0ZWRfY3B1X2hhcyh2bWNzMTIsIENQVV9CQVNFRF9ITFRfRVhJVElORyk7CisJY2FzZSBFWElUX1JFQVNPTl9JTlZEOgorCQlyZXR1cm4gMTsKKwljYXNlIEVYSVRfUkVBU09OX0lOVkxQRzoKKwkJcmV0dXJuIG5lc3RlZF9jcHVfaGFzKHZtY3MxMiwgQ1BVX0JBU0VEX0lOVkxQR19FWElUSU5HKTsKKwljYXNlIEVYSVRfUkVBU09OX1JEUE1DOgorCQlyZXR1cm4gbmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfUkRQTUNfRVhJVElORyk7CisJY2FzZSBFWElUX1JFQVNPTl9SRFRTQzoKKwkJcmV0dXJuIG5lc3RlZF9jcHVfaGFzKHZtY3MxMiwgQ1BVX0JBU0VEX1JEVFNDX0VYSVRJTkcpOworCWNhc2UgRVhJVF9SRUFTT05fVk1DQUxMOiBjYXNlIEVYSVRfUkVBU09OX1ZNQ0xFQVI6CisJY2FzZSBFWElUX1JFQVNPTl9WTUxBVU5DSDogY2FzZSBFWElUX1JFQVNPTl9WTVBUUkxEOgorCWNhc2UgRVhJVF9SRUFTT05fVk1QVFJTVDogY2FzZSBFWElUX1JFQVNPTl9WTVJFQUQ6CisJY2FzZSBFWElUX1JFQVNPTl9WTVJFU1VNRTogY2FzZSBFWElUX1JFQVNPTl9WTVdSSVRFOgorCWNhc2UgRVhJVF9SRUFTT05fVk1PRkY6IGNhc2UgRVhJVF9SRUFTT05fVk1PTjoKKwkJLyoKKwkJICogVk1YIGluc3RydWN0aW9ucyB0cmFwIHVuY29uZGl0aW9uYWxseS4gVGhpcyBhbGxvd3MgTDEgdG8KKwkJICogZW11bGF0ZSB0aGVtIGZvciBpdHMgTDIgZ3Vlc3QsIGkuZS4sIGFsbG93cyAzLWxldmVsIG5lc3RpbmchCisJCSAqLworCQlyZXR1cm4gMTsKKwljYXNlIEVYSVRfUkVBU09OX0NSX0FDQ0VTUzoKKwkJcmV0dXJuIG5lc3RlZF92bXhfZXhpdF9oYW5kbGVkX2NyKHZjcHUsIHZtY3MxMik7CisJY2FzZSBFWElUX1JFQVNPTl9EUl9BQ0NFU1M6CisJCXJldHVybiBuZXN0ZWRfY3B1X2hhcyh2bWNzMTIsIENQVV9CQVNFRF9NT1ZfRFJfRVhJVElORyk7CisJY2FzZSBFWElUX1JFQVNPTl9JT19JTlNUUlVDVElPTjoKKwkJLyogVE9ETzogc3VwcG9ydCBJTyBiaXRtYXBzICovCisJCXJldHVybiAxOworCWNhc2UgRVhJVF9SRUFTT05fTVNSX1JFQUQ6CisJY2FzZSBFWElUX1JFQVNPTl9NU1JfV1JJVEU6CisJCXJldHVybiBuZXN0ZWRfdm14X2V4aXRfaGFuZGxlZF9tc3IodmNwdSwgdm1jczEyLCBleGl0X3JlYXNvbik7CisJY2FzZSBFWElUX1JFQVNPTl9JTlZBTElEX1NUQVRFOgorCQlyZXR1cm4gMTsKKwljYXNlIEVYSVRfUkVBU09OX01XQUlUX0lOU1RSVUNUSU9OOgorCQlyZXR1cm4gbmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfTVdBSVRfRVhJVElORyk7CisJY2FzZSBFWElUX1JFQVNPTl9NT05JVE9SX0lOU1RSVUNUSU9OOgorCQlyZXR1cm4gbmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfTU9OSVRPUl9FWElUSU5HKTsKKwljYXNlIEVYSVRfUkVBU09OX1BBVVNFX0lOU1RSVUNUSU9OOgorCQlyZXR1cm4gbmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfUEFVU0VfRVhJVElORykgfHwKKwkJCW5lc3RlZF9jcHVfaGFzMih2bWNzMTIsCisJCQkJU0VDT05EQVJZX0VYRUNfUEFVU0VfTE9PUF9FWElUSU5HKTsKKwljYXNlIEVYSVRfUkVBU09OX01DRV9EVVJJTkdfVk1FTlRSWToKKwkJcmV0dXJuIDA7CisJY2FzZSBFWElUX1JFQVNPTl9UUFJfQkVMT1dfVEhSRVNIT0xEOgorCQlyZXR1cm4gMTsKKwljYXNlIEVYSVRfUkVBU09OX0FQSUNfQUNDRVNTOgorCQlyZXR1cm4gbmVzdGVkX2NwdV9oYXMyKHZtY3MxMiwKKwkJCVNFQ09OREFSWV9FWEVDX1ZJUlRVQUxJWkVfQVBJQ19BQ0NFU1NFUyk7CisJY2FzZSBFWElUX1JFQVNPTl9FUFRfVklPTEFUSU9OOgorCWNhc2UgRVhJVF9SRUFTT05fRVBUX01JU0NPTkZJRzoKKwkJcmV0dXJuIDA7CisJY2FzZSBFWElUX1JFQVNPTl9XQklOVkQ6CisJCXJldHVybiBuZXN0ZWRfY3B1X2hhczIodm1jczEyLCBTRUNPTkRBUllfRVhFQ19XQklOVkRfRVhJVElORyk7CisJY2FzZSBFWElUX1JFQVNPTl9YU0VUQlY6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KK30KKwogc3RhdGljIHZvaWQgdm14X2dldF9leGl0X2luZm8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgKmluZm8xLCB1NjQgKmluZm8yKQogewogCSppbmZvMSA9IHZtY3NfcmVhZGwoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKQEAgLTM5MzIsNiArNTcwMiwyNSBAQAogCWlmICh2bXgtPmVtdWxhdGlvbl9yZXF1aXJlZCAmJiBlbXVsYXRlX2ludmFsaWRfZ3Vlc3Rfc3RhdGUpCiAJCXJldHVybiBoYW5kbGVfaW52YWxpZF9ndWVzdF9zdGF0ZSh2Y3B1KTsKIAorCS8qCisJICogdGhlIEtWTV9SRVFfRVZFTlQgb3B0aW1pemF0aW9uIGJpdCBpcyBvbmx5IG9uIGZvciBvbmUgZW50cnksIGFuZCBpZgorCSAqIHdlIGRpZCBub3QgaW5qZWN0IGEgc3RpbGwtcGVuZGluZyBldmVudCB0byBMMSBub3cgYmVjYXVzZSBvZgorCSAqIG5lc3RlZF9ydW5fcGVuZGluZywgd2UgbmVlZCB0byByZS1lbmFibGUgdGhpcyBiaXQuCisJICovCisJaWYgKHZteC0+bmVzdGVkLm5lc3RlZF9ydW5fcGVuZGluZykKKwkJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX0VWRU5ULCB2Y3B1KTsKKworCWlmICghaXNfZ3Vlc3RfbW9kZSh2Y3B1KSAmJiAoZXhpdF9yZWFzb24gPT0gRVhJVF9SRUFTT05fVk1MQVVOQ0ggfHwKKwkgICAgZXhpdF9yZWFzb24gPT0gRVhJVF9SRUFTT05fVk1SRVNVTUUpKQorCQl2bXgtPm5lc3RlZC5uZXN0ZWRfcnVuX3BlbmRpbmcgPSAxOworCWVsc2UKKwkJdm14LT5uZXN0ZWQubmVzdGVkX3J1bl9wZW5kaW5nID0gMDsKKworCWlmIChpc19ndWVzdF9tb2RlKHZjcHUpICYmIG5lc3RlZF92bXhfZXhpdF9oYW5kbGVkKHZjcHUpKSB7CisJCW5lc3RlZF92bXhfdm1leGl0KHZjcHUpOworCQlyZXR1cm4gMTsKKwl9CisKIAlpZiAoZXhpdF9yZWFzb24gJiBWTVhfRVhJVF9SRUFTT05TX0ZBSUxFRF9WTUVOVFJZKSB7CiAJCXZjcHUtPnJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9GQUlMX0VOVFJZOwogCQl2Y3B1LT5ydW4tPmZhaWxfZW50cnkuaGFyZHdhcmVfZW50cnlfZmFpbHVyZV9yZWFzb24KQEAgLTM5NTQsNyArNTc0Myw5IEBACiAJCSAgICAgICAiKDB4JXgpIGFuZCBleGl0IHJlYXNvbiBpcyAweCV4XG4iLAogCQkgICAgICAgX19mdW5jX18sIHZlY3RvcmluZ19pbmZvLCBleGl0X3JlYXNvbik7CiAKLQlpZiAodW5saWtlbHkoIWNwdV9oYXNfdmlydHVhbF9ubWlzKCkgJiYgdm14LT5zb2Z0X3ZubWlfYmxvY2tlZCkpIHsKKwlpZiAodW5saWtlbHkoIWNwdV9oYXNfdmlydHVhbF9ubWlzKCkgJiYgdm14LT5zb2Z0X3ZubWlfYmxvY2tlZCAmJgorCSAgICAhKGlzX2d1ZXN0X21vZGUodmNwdSkgJiYgbmVzdGVkX2NwdV9oYXNfdmlydHVhbF9ubWlzKAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3ZtY3MxMih2Y3B1KSwgdmNwdSkpKSkgewogCQlpZiAodm14X2ludGVycnVwdF9hbGxvd2VkKHZjcHUpKSB7CiAJCQl2bXgtPnNvZnRfdm5taV9ibG9ja2VkID0gMDsKIAkJfSBlbHNlIGlmICh2bXgtPnZubWlfYmxvY2tlZF90aW1lID4gMTAwMDAwMDAwMExMICYmCkBAIC00MTE3LDYgKzU5MDgsOCBAQAogCiBzdGF0aWMgdm9pZCB2bXhfY29tcGxldGVfaW50ZXJydXB0cyhzdHJ1Y3QgdmNwdV92bXggKnZteCkKIHsKKwlpZiAoaXNfZ3Vlc3RfbW9kZSgmdm14LT52Y3B1KSkKKwkJcmV0dXJuOwogCV9fdm14X2NvbXBsZXRlX2ludGVycnVwdHModm14LCB2bXgtPmlkdF92ZWN0b3JpbmdfaW5mbywKIAkJCQkgIFZNX0VYSVRfSU5TVFJVQ1RJT05fTEVOLAogCQkJCSAgSURUX1ZFQ1RPUklOR19FUlJPUl9DT0RFKTsKQEAgLTQxMjQsNiArNTkxNyw4IEBACiAKIHN0YXRpYyB2b2lkIHZteF9jYW5jZWxfaW5qZWN0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkKKwkJcmV0dXJuOwogCV9fdm14X2NvbXBsZXRlX2ludGVycnVwdHModG9fdm14KHZjcHUpLAogCQkJCSAgdm1jc19yZWFkMzIoVk1fRU5UUllfSU5UUl9JTkZPX0ZJRUxEKSwKIAkJCQkgIFZNX0VOVFJZX0lOU1RSVUNUSU9OX0xFTiwKQEAgLTQxNDQsNiArNTkzOSwyMSBAQAogewogCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gdG9fdm14KHZjcHUpOwogCisJaWYgKGlzX2d1ZXN0X21vZGUodmNwdSkgJiYgIXZteC0+bmVzdGVkLm5lc3RlZF9ydW5fcGVuZGluZykgeworCQlzdHJ1Y3Qgdm1jczEyICp2bWNzMTIgPSBnZXRfdm1jczEyKHZjcHUpOworCQlpZiAodm1jczEyLT5pZHRfdmVjdG9yaW5nX2luZm9fZmllbGQgJgorCQkJCVZFQ1RPUklOR19JTkZPX1ZBTElEX01BU0spIHsKKwkJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9JTlRSX0lORk9fRklFTEQsCisJCQkJdm1jczEyLT5pZHRfdmVjdG9yaW5nX2luZm9fZmllbGQpOworCQkJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOU1RSVUNUSU9OX0xFTiwKKwkJCQl2bWNzMTItPnZtX2V4aXRfaW5zdHJ1Y3Rpb25fbGVuKTsKKwkJCWlmICh2bWNzMTItPmlkdF92ZWN0b3JpbmdfaW5mb19maWVsZCAmCisJCQkJCVZFQ1RPUklOR19JTkZPX0RFTElWRVJfQ09ERV9NQVNLKQorCQkJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9FWENFUFRJT05fRVJST1JfQ09ERSwKKwkJCQkJdm1jczEyLT5pZHRfdmVjdG9yaW5nX2Vycm9yX2NvZGUpOworCQl9CisJfQorCiAJLyogUmVjb3JkIHRoZSBndWVzdCdzIG5ldCB2Y3B1IHRpbWUgZm9yIGVuZm9yY2VkIE5NSSBpbmplY3Rpb25zLiAqLwogCWlmICh1bmxpa2VseSghY3B1X2hhc192aXJ0dWFsX25taXMoKSAmJiB2bXgtPnNvZnRfdm5taV9ibG9ja2VkKSkKIAkJdm14LT5lbnRyeV90aW1lID0ga3RpbWVfZ2V0KCk7CkBAIC00MTY2LDYgKzU5NzYsNyBAQAogCWlmICh2Y3B1LT5ndWVzdF9kZWJ1ZyAmIEtWTV9HVUVTVERCR19TSU5HTEVTVEVQKQogCQl2bXhfc2V0X2ludGVycnVwdF9zaGFkb3codmNwdSwgMCk7CiAKKwl2bXgtPl9fbGF1bmNoZWQgPSB2bXgtPmxvYWRlZF92bWNzLT5sYXVuY2hlZDsKIAlhc20oCiAJCS8qIFN0b3JlIGhvc3QgcmVnaXN0ZXJzICovCiAJCSJwdXNoICUlIlIiZHg7IHB1c2ggJSUiUiJicDsiCkBAIC00MjM2LDcgKzYwNDcsNyBAQAogCQkicG9wICAlJSJSImJwOyBwb3AgICUlIlIiZHggXG5cdCIKIAkJInNldGJlICVjW2ZhaWxdKCUwKSBcblx0IgogCSAgICAgIDogOiAiYyIodm14KSwgImQiKCh1bnNpZ25lZCBsb25nKUhPU1RfUlNQKSwKLQkJW2xhdW5jaGVkXSJpIihvZmZzZXRvZihzdHJ1Y3QgdmNwdV92bXgsIGxhdW5jaGVkKSksCisJCVtsYXVuY2hlZF0iaSIob2Zmc2V0b2Yoc3RydWN0IHZjcHVfdm14LCBfX2xhdW5jaGVkKSksCiAJCVtmYWlsXSJpIihvZmZzZXRvZihzdHJ1Y3QgdmNwdV92bXgsIGZhaWwpKSwKIAkJW2hvc3RfcnNwXSJpIihvZmZzZXRvZihzdHJ1Y3QgdmNwdV92bXgsIGhvc3RfcnNwKSksCiAJCVtyYXhdImkiKG9mZnNldG9mKHN0cnVjdCB2Y3B1X3ZteCwgdmNwdS5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JBWF0pKSwKQEAgLTQyNzUsOCArNjA4NiwxOSBAQAogCiAJdm14LT5pZHRfdmVjdG9yaW5nX2luZm8gPSB2bWNzX3JlYWQzMihJRFRfVkVDVE9SSU5HX0lORk9fRklFTEQpOwogCisJaWYgKGlzX2d1ZXN0X21vZGUodmNwdSkpIHsKKwkJc3RydWN0IHZtY3MxMiAqdm1jczEyID0gZ2V0X3ZtY3MxMih2Y3B1KTsKKwkJdm1jczEyLT5pZHRfdmVjdG9yaW5nX2luZm9fZmllbGQgPSB2bXgtPmlkdF92ZWN0b3JpbmdfaW5mbzsKKwkJaWYgKHZteC0+aWR0X3ZlY3RvcmluZ19pbmZvICYgVkVDVE9SSU5HX0lORk9fVkFMSURfTUFTSykgeworCQkJdm1jczEyLT5pZHRfdmVjdG9yaW5nX2Vycm9yX2NvZGUgPQorCQkJCXZtY3NfcmVhZDMyKElEVF9WRUNUT1JJTkdfRVJST1JfQ09ERSk7CisJCQl2bWNzMTItPnZtX2V4aXRfaW5zdHJ1Y3Rpb25fbGVuID0KKwkJCQl2bWNzX3JlYWQzMihWTV9FWElUX0lOU1RSVUNUSU9OX0xFTik7CisJCX0KKwl9CisKIAlhc20oIm1vdiAlMCwgJSVkczsgbW92ICUwLCAlJWVzIiA6IDogInIiKF9fVVNFUl9EUykpOwotCXZteC0+bGF1bmNoZWQgPSAxOworCXZteC0+bG9hZGVkX3ZtY3MtPmxhdW5jaGVkID0gMTsKIAogCXZteC0+ZXhpdF9yZWFzb24gPSB2bWNzX3JlYWQzMihWTV9FWElUX1JFQVNPTik7CiAKQEAgLTQyODgsNDEgKzYxMTAsMTggQEAKICN1bmRlZiBSCiAjdW5kZWYgUQogCi1zdGF0aWMgdm9pZCB2bXhfZnJlZV92bWNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKLQotCWlmICh2bXgtPnZtY3MpIHsKLQkJdmNwdV9jbGVhcih2bXgpOwotCQlmcmVlX3ZtY3Modm14LT52bWNzKTsKLQkJdm14LT52bWNzID0gTlVMTDsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIHZteF9mcmVlX3ZjcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gdG9fdm14KHZjcHUpOwogCiAJZnJlZV92cGlkKHZteCk7Ci0Jdm14X2ZyZWVfdm1jcyh2Y3B1KTsKKwlmcmVlX25lc3RlZCh2bXgpOworCWZyZWVfbG9hZGVkX3ZtY3Modm14LT5sb2FkZWRfdm1jcyk7CiAJa2ZyZWUodm14LT5ndWVzdF9tc3JzKTsKIAlrdm1fdmNwdV91bmluaXQodmNwdSk7CiAJa21lbV9jYWNoZV9mcmVlKGt2bV92Y3B1X2NhY2hlLCB2bXgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdm1jc19pbml0KHN0cnVjdCB2bWNzICp2bWNzKQotewotCXU2NCBwaHlzX2FkZHIgPSBfX3BhKHBlcl9jcHUodm14YXJlYSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkpOwotCi0JaWYgKCF2bW1fZXhjbHVzaXZlKQotCQlrdm1fY3B1X3ZteG9uKHBoeXNfYWRkcik7Ci0KLQl2bWNzX2NsZWFyKHZtY3MpOwotCi0JaWYgKCF2bW1fZXhjbHVzaXZlKQotCQlrdm1fY3B1X3ZteG9mZigpOwotfQotCiBzdGF0aWMgc3RydWN0IGt2bV92Y3B1ICp2bXhfY3JlYXRlX3ZjcHUoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBpbnQgaWQpCiB7CiAJaW50IGVycjsKQEAgLTQzNDQsMTEgKzYxNDMsMTUgQEAKIAkJZ290byB1bmluaXRfdmNwdTsKIAl9CiAKLQl2bXgtPnZtY3MgPSBhbGxvY192bWNzKCk7Ci0JaWYgKCF2bXgtPnZtY3MpCisJdm14LT5sb2FkZWRfdm1jcyA9ICZ2bXgtPnZtY3MwMTsKKwl2bXgtPmxvYWRlZF92bWNzLT52bWNzID0gYWxsb2Nfdm1jcygpOworCWlmICghdm14LT5sb2FkZWRfdm1jcy0+dm1jcykKIAkJZ290byBmcmVlX21zcnM7Ci0KLQl2bWNzX2luaXQodm14LT52bWNzKTsKKwlpZiAoIXZtbV9leGNsdXNpdmUpCisJCWt2bV9jcHVfdm14b24oX19wYShwZXJfY3B1KHZteGFyZWEsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpKSk7CisJbG9hZGVkX3ZtY3NfaW5pdCh2bXgtPmxvYWRlZF92bWNzKTsKKwlpZiAoIXZtbV9leGNsdXNpdmUpCisJCWt2bV9jcHVfdm14b2ZmKCk7CiAKIAljcHUgPSBnZXRfY3B1KCk7CiAJdm14X3ZjcHVfbG9hZCgmdm14LT52Y3B1LCBjcHUpOwpAQCAtNDM3NCwxMCArNjE3NywxMyBAQAogCQkJZ290byBmcmVlX3ZtY3M7CiAJfQogCisJdm14LT5uZXN0ZWQuY3VycmVudF92bXB0ciA9IC0xdWxsOworCXZteC0+bmVzdGVkLmN1cnJlbnRfdm1jczEyID0gTlVMTDsKKwogCXJldHVybiAmdm14LT52Y3B1OwogCiBmcmVlX3ZtY3M6Ci0JZnJlZV92bWNzKHZteC0+dm1jcyk7CisJZnJlZV92bWNzKHZteC0+bG9hZGVkX3ZtY3MtPnZtY3MpOwogZnJlZV9tc3JzOgogCWtmcmVlKHZteC0+Z3Vlc3RfbXNycyk7CiB1bmluaXRfdmNwdToKQEAgLTQ1MTEsNiArNjMxNyw2NTAgQEAKIAogc3RhdGljIHZvaWQgdm14X3NldF9zdXBwb3J0ZWRfY3B1aWQodTMyIGZ1bmMsIHN0cnVjdCBrdm1fY3B1aWRfZW50cnkyICplbnRyeSkKIHsKKwlpZiAoZnVuYyA9PSAxICYmIG5lc3RlZCkKKwkJZW50cnktPmVjeCB8PSBiaXQoWDg2X0ZFQVRVUkVfVk1YKTsKK30KKworLyoKKyAqIHByZXBhcmVfdm1jczAyIGlzIGNhbGxlZCB3aGVuIHRoZSBMMSBndWVzdCBoeXBlcnZpc29yIHJ1bnMgaXRzIG5lc3RlZAorICogTDIgZ3Vlc3QuIEwxIGhhcyBhIHZtY3MgZm9yIEwyICh2bWNzMTIpLCBhbmQgdGhpcyBmdW5jdGlvbiAibWVyZ2VzIiBpdAorICogd2l0aCBMMCdzIHJlcXVpcmVtZW50cyBmb3IgaXRzIGd1ZXN0IChhLmsuYS4gdm1zYzAxKSwgc28gd2UgY2FuIHJ1biB0aGUgTDIKKyAqIGd1ZXN0IGluIGEgd2F5IHRoYXQgd2lsbCBib3RoIGJlIGFwcHJvcHJpYXRlIHRvIEwxJ3MgcmVxdWVzdHMsIGFuZCBvdXIKKyAqIG5lZWRzLiBJbiBhZGRpdGlvbiB0byBtb2RpZnlpbmcgdGhlIGFjdGl2ZSB2bWNzICh3aGljaCBpcyB2bWNzMDIpLCB0aGlzCisgKiBmdW5jdGlvbiBhbHNvIGhhcyBhZGRpdGlvbmFsIG5lY2Vzc2FyeSBzaWRlLWVmZmVjdHMsIGxpa2Ugc2V0dGluZyB2YXJpb3VzCisgKiB2Y3B1LT5hcmNoIGZpZWxkcy4KKyAqLworc3RhdGljIHZvaWQgcHJlcGFyZV92bWNzMDIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qgdm1jczEyICp2bWNzMTIpCit7CisJc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7CisJdTMyIGV4ZWNfY29udHJvbDsKKworCXZtY3Nfd3JpdGUxNihHVUVTVF9FU19TRUxFQ1RPUiwgdm1jczEyLT5ndWVzdF9lc19zZWxlY3Rvcik7CisJdm1jc193cml0ZTE2KEdVRVNUX0NTX1NFTEVDVE9SLCB2bWNzMTItPmd1ZXN0X2NzX3NlbGVjdG9yKTsKKwl2bWNzX3dyaXRlMTYoR1VFU1RfU1NfU0VMRUNUT1IsIHZtY3MxMi0+Z3Vlc3Rfc3Nfc2VsZWN0b3IpOworCXZtY3Nfd3JpdGUxNihHVUVTVF9EU19TRUxFQ1RPUiwgdm1jczEyLT5ndWVzdF9kc19zZWxlY3Rvcik7CisJdm1jc193cml0ZTE2KEdVRVNUX0ZTX1NFTEVDVE9SLCB2bWNzMTItPmd1ZXN0X2ZzX3NlbGVjdG9yKTsKKwl2bWNzX3dyaXRlMTYoR1VFU1RfR1NfU0VMRUNUT1IsIHZtY3MxMi0+Z3Vlc3RfZ3Nfc2VsZWN0b3IpOworCXZtY3Nfd3JpdGUxNihHVUVTVF9MRFRSX1NFTEVDVE9SLCB2bWNzMTItPmd1ZXN0X2xkdHJfc2VsZWN0b3IpOworCXZtY3Nfd3JpdGUxNihHVUVTVF9UUl9TRUxFQ1RPUiwgdm1jczEyLT5ndWVzdF90cl9zZWxlY3Rvcik7CisJdm1jc193cml0ZTMyKEdVRVNUX0VTX0xJTUlULCB2bWNzMTItPmd1ZXN0X2VzX2xpbWl0KTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfQ1NfTElNSVQsIHZtY3MxMi0+Z3Vlc3RfY3NfbGltaXQpOworCXZtY3Nfd3JpdGUzMihHVUVTVF9TU19MSU1JVCwgdm1jczEyLT5ndWVzdF9zc19saW1pdCk7CisJdm1jc193cml0ZTMyKEdVRVNUX0RTX0xJTUlULCB2bWNzMTItPmd1ZXN0X2RzX2xpbWl0KTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfRlNfTElNSVQsIHZtY3MxMi0+Z3Vlc3RfZnNfbGltaXQpOworCXZtY3Nfd3JpdGUzMihHVUVTVF9HU19MSU1JVCwgdm1jczEyLT5ndWVzdF9nc19saW1pdCk7CisJdm1jc193cml0ZTMyKEdVRVNUX0xEVFJfTElNSVQsIHZtY3MxMi0+Z3Vlc3RfbGR0cl9saW1pdCk7CisJdm1jc193cml0ZTMyKEdVRVNUX1RSX0xJTUlULCB2bWNzMTItPmd1ZXN0X3RyX2xpbWl0KTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfR0RUUl9MSU1JVCwgdm1jczEyLT5ndWVzdF9nZHRyX2xpbWl0KTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfSURUUl9MSU1JVCwgdm1jczEyLT5ndWVzdF9pZHRyX2xpbWl0KTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfRVNfQVJfQllURVMsIHZtY3MxMi0+Z3Vlc3RfZXNfYXJfYnl0ZXMpOworCXZtY3Nfd3JpdGUzMihHVUVTVF9DU19BUl9CWVRFUywgdm1jczEyLT5ndWVzdF9jc19hcl9ieXRlcyk7CisJdm1jc193cml0ZTMyKEdVRVNUX1NTX0FSX0JZVEVTLCB2bWNzMTItPmd1ZXN0X3NzX2FyX2J5dGVzKTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfRFNfQVJfQllURVMsIHZtY3MxMi0+Z3Vlc3RfZHNfYXJfYnl0ZXMpOworCXZtY3Nfd3JpdGUzMihHVUVTVF9GU19BUl9CWVRFUywgdm1jczEyLT5ndWVzdF9mc19hcl9ieXRlcyk7CisJdm1jc193cml0ZTMyKEdVRVNUX0dTX0FSX0JZVEVTLCB2bWNzMTItPmd1ZXN0X2dzX2FyX2J5dGVzKTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfTERUUl9BUl9CWVRFUywgdm1jczEyLT5ndWVzdF9sZHRyX2FyX2J5dGVzKTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfVFJfQVJfQllURVMsIHZtY3MxMi0+Z3Vlc3RfdHJfYXJfYnl0ZXMpOworCXZtY3Nfd3JpdGVsKEdVRVNUX0VTX0JBU0UsIHZtY3MxMi0+Z3Vlc3RfZXNfYmFzZSk7CisJdm1jc193cml0ZWwoR1VFU1RfQ1NfQkFTRSwgdm1jczEyLT5ndWVzdF9jc19iYXNlKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9TU19CQVNFLCB2bWNzMTItPmd1ZXN0X3NzX2Jhc2UpOworCXZtY3Nfd3JpdGVsKEdVRVNUX0RTX0JBU0UsIHZtY3MxMi0+Z3Vlc3RfZHNfYmFzZSk7CisJdm1jc193cml0ZWwoR1VFU1RfRlNfQkFTRSwgdm1jczEyLT5ndWVzdF9mc19iYXNlKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9HU19CQVNFLCB2bWNzMTItPmd1ZXN0X2dzX2Jhc2UpOworCXZtY3Nfd3JpdGVsKEdVRVNUX0xEVFJfQkFTRSwgdm1jczEyLT5ndWVzdF9sZHRyX2Jhc2UpOworCXZtY3Nfd3JpdGVsKEdVRVNUX1RSX0JBU0UsIHZtY3MxMi0+Z3Vlc3RfdHJfYmFzZSk7CisJdm1jc193cml0ZWwoR1VFU1RfR0RUUl9CQVNFLCB2bWNzMTItPmd1ZXN0X2dkdHJfYmFzZSk7CisJdm1jc193cml0ZWwoR1VFU1RfSURUUl9CQVNFLCB2bWNzMTItPmd1ZXN0X2lkdHJfYmFzZSk7CisKKwl2bWNzX3dyaXRlNjQoR1VFU1RfSUEzMl9ERUJVR0NUTCwgdm1jczEyLT5ndWVzdF9pYTMyX2RlYnVnY3RsKTsKKwl2bWNzX3dyaXRlMzIoVk1fRU5UUllfSU5UUl9JTkZPX0ZJRUxELAorCQl2bWNzMTItPnZtX2VudHJ5X2ludHJfaW5mb19maWVsZCk7CisJdm1jc193cml0ZTMyKFZNX0VOVFJZX0VYQ0VQVElPTl9FUlJPUl9DT0RFLAorCQl2bWNzMTItPnZtX2VudHJ5X2V4Y2VwdGlvbl9lcnJvcl9jb2RlKTsKKwl2bWNzX3dyaXRlMzIoVk1fRU5UUllfSU5TVFJVQ1RJT05fTEVOLAorCQl2bWNzMTItPnZtX2VudHJ5X2luc3RydWN0aW9uX2xlbik7CisJdm1jc193cml0ZTMyKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTywKKwkJdm1jczEyLT5ndWVzdF9pbnRlcnJ1cHRpYmlsaXR5X2luZm8pOworCXZtY3Nfd3JpdGUzMihHVUVTVF9BQ1RJVklUWV9TVEFURSwgdm1jczEyLT5ndWVzdF9hY3Rpdml0eV9zdGF0ZSk7CisJdm1jc193cml0ZTMyKEdVRVNUX1NZU0VOVEVSX0NTLCB2bWNzMTItPmd1ZXN0X3N5c2VudGVyX2NzKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9EUjcsIHZtY3MxMi0+Z3Vlc3RfZHI3KTsKKwl2bWNzX3dyaXRlbChHVUVTVF9SRkxBR1MsIHZtY3MxMi0+Z3Vlc3RfcmZsYWdzKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9QRU5ESU5HX0RCR19FWENFUFRJT05TLAorCQl2bWNzMTItPmd1ZXN0X3BlbmRpbmdfZGJnX2V4Y2VwdGlvbnMpOworCXZtY3Nfd3JpdGVsKEdVRVNUX1NZU0VOVEVSX0VTUCwgdm1jczEyLT5ndWVzdF9zeXNlbnRlcl9lc3ApOworCXZtY3Nfd3JpdGVsKEdVRVNUX1NZU0VOVEVSX0VJUCwgdm1jczEyLT5ndWVzdF9zeXNlbnRlcl9laXApOworCisJdm1jc193cml0ZTY0KFZNQ1NfTElOS19QT0lOVEVSLCAtMXVsbCk7CisKKwl2bWNzX3dyaXRlMzIoUElOX0JBU0VEX1ZNX0VYRUNfQ09OVFJPTCwKKwkJKHZtY3NfY29uZmlnLnBpbl9iYXNlZF9leGVjX2N0cmwgfAorCQkgdm1jczEyLT5waW5fYmFzZWRfdm1fZXhlY19jb250cm9sKSk7CisKKwkvKgorCSAqIFdoZXRoZXIgcGFnZS1mYXVsdHMgYXJlIHRyYXBwZWQgaXMgZGV0ZXJtaW5lZCBieSBhIGNvbWJpbmF0aW9uIG9mCisJICogMyBzZXR0aW5nczogUEZFQ19NQVNLLCBQRkVDX01BVENIIGFuZCBFWENFUFRJT05fQklUTUFQLlBGLgorCSAqIElmIGVuYWJsZV9lcHQsIEwwIGRvZXNuJ3QgY2FyZSBhYm91dCBwYWdlIGZhdWx0cyBhbmQgd2Ugc2hvdWxkCisJICogc2V0IGFsbCBvZiB0aGVzZSB0byBMMSdzIGRlc2lyZXMuIEhvd2V2ZXIsIGlmICFlbmFibGVfZXB0LCBMMCBkb2VzCisJICogY2FyZSBhYm91dCAoYXQgbGVhc3Qgc29tZSkgcGFnZSBmYXVsdHMsIGFuZCBiZWNhdXNlIGl0IGlzIG5vdCBlYXN5CisJICogKGlmIGF0IGFsbCBwb3NzaWJsZT8pIHRvIG1lcmdlIEwwIGFuZCBMMSdzIGRlc2lyZXMsIHdlIHNpbXBseSBhc2sKKwkgKiB0byBleGl0IG9uIGVhY2ggYW5kIGV2ZXJ5IEwyIHBhZ2UgZmF1bHQuIFRoaXMgaXMgZG9uZSBieSBzZXR0aW5nCisJICogTUFTSz1NQVRDSD0wIGFuZCAoc2VlIGJlbG93KSBFQi5QRj0xLgorCSAqIE5vdGUgdGhhdCBiZWxvdyB3ZSBkb24ndCBuZWVkIHNwZWNpYWwgY29kZSB0byBzZXQgRUIuUEYgYmV5b25kIHRoZQorCSAqICJvciJpbmcgb2YgdGhlIEVCIG9mIHZtY3MwMSBhbmQgdm1jczEyLCBiZWNhdXNlIHdoZW4gZW5hYmxlX2VwdCwKKwkgKiB2bWNzMDEncyBFQi5QRiBpcyAwIHNvIHRoZSAib3IiIHdpbGwgdGFrZSB2bWNzMTIncyB2YWx1ZSwgYW5kIHdoZW4KKwkgKiAhZW5hYmxlX2VwdCwgRUIuUEYgaXMgMSwgc28gdGhlICJvciIgd2lsbCBhbHdheXMgYmUgMS4KKwkgKgorCSAqIEEgcHJvYmxlbSB3aXRoIHRoaXMgYXBwcm9hY2ggKHdoZW4gIWVuYWJsZV9lcHQpIGlzIHRoYXQgTDEgbWF5IGJlCisJICogaW5qZWN0ZWQgd2l0aCBtb3JlIHBhZ2UgZmF1bHRzIHRoYW4gaXQgYXNrZWQgZm9yLiBUaGlzIGNvdWxkIGhhdmUKKwkgKiBjYXVzZWQgcHJvYmxlbXMsIGJ1dCBpbiBwcmFjdGljZSBleGlzdGluZyBoeXBlcnZpc29ycyBkb24ndCBjYXJlLgorCSAqIFRvIGZpeCB0aGlzLCB3ZSB3aWxsIG5lZWQgdG8gZW11bGF0ZSB0aGUgUEZFQyBjaGVja2luZyAob24gdGhlIEwxCisJICogcGFnZSB0YWJsZXMpLCB1c2luZyB3YWxrX2FkZHIoKSwgd2hlbiBpbmplY3RpbmcgUEZzIHRvIEwxLgorCSAqLworCXZtY3Nfd3JpdGUzMihQQUdFX0ZBVUxUX0VSUk9SX0NPREVfTUFTSywKKwkJZW5hYmxlX2VwdCA/IHZtY3MxMi0+cGFnZV9mYXVsdF9lcnJvcl9jb2RlX21hc2sgOiAwKTsKKwl2bWNzX3dyaXRlMzIoUEFHRV9GQVVMVF9FUlJPUl9DT0RFX01BVENILAorCQllbmFibGVfZXB0ID8gdm1jczEyLT5wYWdlX2ZhdWx0X2Vycm9yX2NvZGVfbWF0Y2ggOiAwKTsKKworCWlmIChjcHVfaGFzX3NlY29uZGFyeV9leGVjX2N0cmxzKCkpIHsKKwkJdTMyIGV4ZWNfY29udHJvbCA9IHZteF9zZWNvbmRhcnlfZXhlY19jb250cm9sKHZteCk7CisJCWlmICghdm14LT5yZHRzY3BfZW5hYmxlZCkKKwkJCWV4ZWNfY29udHJvbCAmPSB+U0VDT05EQVJZX0VYRUNfUkRUU0NQOworCQkvKiBUYWtlIHRoZSBmb2xsb3dpbmcgZmllbGRzIG9ubHkgZnJvbSB2bWNzMTIgKi8KKwkJZXhlY19jb250cm9sICY9IH5TRUNPTkRBUllfRVhFQ19WSVJUVUFMSVpFX0FQSUNfQUNDRVNTRVM7CisJCWlmIChuZXN0ZWRfY3B1X2hhcyh2bWNzMTIsCisJCQkJQ1BVX0JBU0VEX0FDVElWQVRFX1NFQ09OREFSWV9DT05UUk9MUykpCisJCQlleGVjX2NvbnRyb2wgfD0gdm1jczEyLT5zZWNvbmRhcnlfdm1fZXhlY19jb250cm9sOworCisJCWlmIChleGVjX2NvbnRyb2wgJiBTRUNPTkRBUllfRVhFQ19WSVJUVUFMSVpFX0FQSUNfQUNDRVNTRVMpIHsKKwkJCS8qCisJCQkgKiBUcmFuc2xhdGUgTDEgcGh5c2ljYWwgYWRkcmVzcyB0byBob3N0IHBoeXNpY2FsCisJCQkgKiBhZGRyZXNzIGZvciB2bWNzMDIuIEtlZXAgdGhlIHBhZ2UgcGlubmVkLCBzbyB0aGlzCisJCQkgKiBwaHlzaWNhbCBhZGRyZXNzIHJlbWFpbnMgdmFsaWQuIFdlIGtlZXAgYSByZWZlcmVuY2UKKwkJCSAqIHRvIGl0IHNvIHdlIGNhbiByZWxlYXNlIGl0IGxhdGVyLgorCQkJICovCisJCQlpZiAodm14LT5uZXN0ZWQuYXBpY19hY2Nlc3NfcGFnZSkgLyogc2hvdWxkbid0IGhhcHBlbiAqLworCQkJCW5lc3RlZF9yZWxlYXNlX3BhZ2Uodm14LT5uZXN0ZWQuYXBpY19hY2Nlc3NfcGFnZSk7CisJCQl2bXgtPm5lc3RlZC5hcGljX2FjY2Vzc19wYWdlID0KKwkJCQluZXN0ZWRfZ2V0X3BhZ2UodmNwdSwgdm1jczEyLT5hcGljX2FjY2Vzc19hZGRyKTsKKwkJCS8qCisJCQkgKiBJZiB0cmFuc2xhdGlvbiBmYWlsZWQsIG5vIG1hdHRlcjogVGhpcyBmZWF0dXJlIGFza3MKKwkJCSAqIHRvIGV4aXQgd2hlbiBhY2Nlc3NpbmcgdGhlIGdpdmVuIGFkZHJlc3MsIGFuZCBpZiBpdAorCQkJICogY2FuIG5ldmVyIGJlIGFjY2Vzc2VkLCB0aGlzIGZlYXR1cmUgd29uJ3QgZG8KKwkJCSAqIGFueXRoaW5nIGFueXdheS4KKwkJCSAqLworCQkJaWYgKCF2bXgtPm5lc3RlZC5hcGljX2FjY2Vzc19wYWdlKQorCQkJCWV4ZWNfY29udHJvbCAmPQorCQkJCSAgflNFQ09OREFSWV9FWEVDX1ZJUlRVQUxJWkVfQVBJQ19BQ0NFU1NFUzsKKwkJCWVsc2UKKwkJCQl2bWNzX3dyaXRlNjQoQVBJQ19BQ0NFU1NfQUREUiwKKwkJCQkgIHBhZ2VfdG9fcGh5cyh2bXgtPm5lc3RlZC5hcGljX2FjY2Vzc19wYWdlKSk7CisJCX0KKworCQl2bWNzX3dyaXRlMzIoU0VDT05EQVJZX1ZNX0VYRUNfQ09OVFJPTCwgZXhlY19jb250cm9sKTsKKwl9CisKKworCS8qCisJICogU2V0IGhvc3Qtc3RhdGUgYWNjb3JkaW5nIHRvIEwwJ3Mgc2V0dGluZ3MgKHZtY3MxMiBpcyBpcnJlbGV2YW50IGhlcmUpCisJICogU29tZSBjb25zdGFudCBmaWVsZHMgYXJlIHNldCBoZXJlIGJ5IHZteF9zZXRfY29uc3RhbnRfaG9zdF9zdGF0ZSgpLgorCSAqIE90aGVyIGZpZWxkcyBhcmUgZGlmZmVyZW50IHBlciBDUFUsIGFuZCB3aWxsIGJlIHNldCBsYXRlciB3aGVuCisJICogdm14X3ZjcHVfbG9hZCgpIGlzIGNhbGxlZCwgYW5kIHdoZW4gdm14X3NhdmVfaG9zdF9zdGF0ZSgpIGlzIGNhbGxlZC4KKwkgKi8KKwl2bXhfc2V0X2NvbnN0YW50X2hvc3Rfc3RhdGUoKTsKKworCS8qCisJICogSE9TVF9SU1AgaXMgbm9ybWFsbHkgc2V0IGNvcnJlY3RseSBpbiB2bXhfdmNwdV9ydW4oKSBqdXN0IGJlZm9yZQorCSAqIGVudHJ5LCBidXQgb25seSBpZiB0aGUgY3VycmVudCAoaG9zdCkgc3AgY2hhbmdlZCBmcm9tIHRoZSB2YWx1ZQorCSAqIHdlIHdyb3RlIGxhc3QgKHZteC0+aG9zdF9yc3ApLiBUaGlzIGNhY2hlIGlzIG5vIGxvbmdlciByZWxldmFudAorCSAqIGlmIHdlIHN3aXRjaCB2bWNzLCBhbmQgcmF0aGVyIHRoYW4gaG9sZCBhIHNlcGFyYXRlIGNhY2hlIHBlciB2bWNzLAorCSAqIGhlcmUgd2UganVzdCBmb3JjZSB0aGUgd3JpdGUgdG8gaGFwcGVuIG9uIGVudHJ5LgorCSAqLworCXZteC0+aG9zdF9yc3AgPSAwOworCisJZXhlY19jb250cm9sID0gdm14X2V4ZWNfY29udHJvbCh2bXgpOyAvKiBMMCdzIGRlc2lyZXMgKi8KKwlleGVjX2NvbnRyb2wgJj0gfkNQVV9CQVNFRF9WSVJUVUFMX0lOVFJfUEVORElORzsKKwlleGVjX2NvbnRyb2wgJj0gfkNQVV9CQVNFRF9WSVJUVUFMX05NSV9QRU5ESU5HOworCWV4ZWNfY29udHJvbCAmPSB+Q1BVX0JBU0VEX1RQUl9TSEFET1c7CisJZXhlY19jb250cm9sIHw9IHZtY3MxMi0+Y3B1X2Jhc2VkX3ZtX2V4ZWNfY29udHJvbDsKKwkvKgorCSAqIE1lcmdpbmcgb2YgSU8gYW5kIE1TUiBiaXRtYXBzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorCSAqIFJhdGhlciwgZXhpdCBldmVyeSB0aW1lLgorCSAqLworCWV4ZWNfY29udHJvbCAmPSB+Q1BVX0JBU0VEX1VTRV9NU1JfQklUTUFQUzsKKwlleGVjX2NvbnRyb2wgJj0gfkNQVV9CQVNFRF9VU0VfSU9fQklUTUFQUzsKKwlleGVjX2NvbnRyb2wgfD0gQ1BVX0JBU0VEX1VOQ09ORF9JT19FWElUSU5HOworCisJdm1jc193cml0ZTMyKENQVV9CQVNFRF9WTV9FWEVDX0NPTlRST0wsIGV4ZWNfY29udHJvbCk7CisKKwkvKiBFWENFUFRJT05fQklUTUFQIGFuZCBDUjBfR1VFU1RfSE9TVF9NQVNLIHNob3VsZCBiYXNpY2FsbHkgYmUgdGhlCisJICogYml0d2lzZS1vciBvZiB3aGF0IEwxIHdhbnRzIHRvIHRyYXAgZm9yIEwyLCBhbmQgd2hhdCB3ZSB3YW50IHRvCisJICogdHJhcC4gTm90ZSB0aGF0IENSMC5UUyBhbHNvIG5lZWRzIHVwZGF0aW5nIC0gd2UgZG8gdGhpcyBsYXRlci4KKwkgKi8KKwl1cGRhdGVfZXhjZXB0aW9uX2JpdG1hcCh2Y3B1KTsKKwl2Y3B1LT5hcmNoLmNyMF9ndWVzdF9vd25lZF9iaXRzICY9IH52bWNzMTItPmNyMF9ndWVzdF9ob3N0X21hc2s7CisJdm1jc193cml0ZWwoQ1IwX0dVRVNUX0hPU1RfTUFTSywgfnZjcHUtPmFyY2guY3IwX2d1ZXN0X293bmVkX2JpdHMpOworCisJLyogTm90ZTogSUEzMl9NT0RFLCBMT0FEX0lBMzJfRUZFUiBhcmUgbW9kaWZpZWQgYnkgdm14X3NldF9lZmVyIGJlbG93ICovCisJdm1jc193cml0ZTMyKFZNX0VYSVRfQ09OVFJPTFMsCisJCXZtY3MxMi0+dm1fZXhpdF9jb250cm9scyB8IHZtY3NfY29uZmlnLnZtZXhpdF9jdHJsKTsKKwl2bWNzX3dyaXRlMzIoVk1fRU5UUllfQ09OVFJPTFMsIHZtY3MxMi0+dm1fZW50cnlfY29udHJvbHMgfAorCQkodm1jc19jb25maWcudm1lbnRyeV9jdHJsICYgflZNX0VOVFJZX0lBMzJFX01PREUpKTsKKworCWlmICh2bWNzMTItPnZtX2VudHJ5X2NvbnRyb2xzICYgVk1fRU5UUllfTE9BRF9JQTMyX1BBVCkKKwkJdm1jc193cml0ZTY0KEdVRVNUX0lBMzJfUEFULCB2bWNzMTItPmd1ZXN0X2lhMzJfcGF0KTsKKwllbHNlIGlmICh2bWNzX2NvbmZpZy52bWVudHJ5X2N0cmwgJiBWTV9FTlRSWV9MT0FEX0lBMzJfUEFUKQorCQl2bWNzX3dyaXRlNjQoR1VFU1RfSUEzMl9QQVQsIHZteC0+dmNwdS5hcmNoLnBhdCk7CisKKworCXNldF9jcjRfZ3Vlc3RfaG9zdF9tYXNrKHZteCk7CisKKwl2bWNzX3dyaXRlNjQoVFNDX09GRlNFVCwKKwkJdm14LT5uZXN0ZWQudm1jczAxX3RzY19vZmZzZXQgKyB2bWNzMTItPnRzY19vZmZzZXQpOworCisJaWYgKGVuYWJsZV92cGlkKSB7CisJCS8qCisJCSAqIFRyaXZpYWxseSBzdXBwb3J0IHZwaWQgYnkgbGV0dGluZyBMMnMgc2hhcmUgdGhlaXIgcGFyZW50CisJCSAqIEwxJ3MgdnBpZC4gVE9ETzogbW92ZSB0byBhIG1vcmUgZWxhYm9yYXRlIHNvbHV0aW9uLCBnaXZpbmcKKwkJICogZWFjaCBMMiBpdHMgb3duIHZwaWQgYW5kIGV4cG9zaW5nIHRoZSB2cGlkIGZlYXR1cmUgdG8gTDEuCisJCSAqLworCQl2bWNzX3dyaXRlMTYoVklSVFVBTF9QUk9DRVNTT1JfSUQsIHZteC0+dnBpZCk7CisJCXZteF9mbHVzaF90bGIodmNwdSk7CisJfQorCisJaWYgKHZtY3MxMi0+dm1fZW50cnlfY29udHJvbHMgJiBWTV9FTlRSWV9MT0FEX0lBMzJfRUZFUikKKwkJdmNwdS0+YXJjaC5lZmVyID0gdm1jczEyLT5ndWVzdF9pYTMyX2VmZXI7CisJaWYgKHZtY3MxMi0+dm1fZW50cnlfY29udHJvbHMgJiBWTV9FTlRSWV9JQTMyRV9NT0RFKQorCQl2Y3B1LT5hcmNoLmVmZXIgfD0gKEVGRVJfTE1BIHwgRUZFUl9MTUUpOworCWVsc2UKKwkJdmNwdS0+YXJjaC5lZmVyICY9IH4oRUZFUl9MTUEgfCBFRkVSX0xNRSk7CisJLyogTm90ZTogbW9kaWZpZXMgVk1fRU5UUlkvRVhJVF9DT05UUk9MUyBhbmQgR1VFU1QvSE9TVF9JQTMyX0VGRVIgKi8KKwl2bXhfc2V0X2VmZXIodmNwdSwgdmNwdS0+YXJjaC5lZmVyKTsKKworCS8qCisJICogVGhpcyBzZXRzIEdVRVNUX0NSMCB0byB2bWNzMTItPmd1ZXN0X2NyMCwgd2l0aCBwb3NzaWJseSBhIG1vZGlmaWVkCisJICogVFMgYml0IChmb3IgbGF6eSBmcHUpIGFuZCBiaXRzIHdoaWNoIHdlIGNvbnNpZGVyIG1hbmRhdG9yeSBlbmFibGVkLgorCSAqIFRoZSBDUjBfUkVBRF9TSEFET1cgaXMgd2hhdCBMMiBzaG91bGQgaGF2ZSBleHBlY3RlZCB0byByZWFkIGdpdmVuCisJICogdGhlIHNwZWNpZmljYXRpb25zIGJ5IEwxOyBJdCdzIG5vdCBlbm91Z2ggdG8gdGFrZQorCSAqIHZtY3MxMi0+Y3IwX3JlYWRfc2hhZG93IGJlY2F1c2Ugb24gb3VyIGNyMF9ndWVzdF9ob3N0X21hc2sgd2Ugd2UKKwkgKiBoYXZlIG1vcmUgYml0cyB0aGFuIEwxIGV4cGVjdGVkLgorCSAqLworCXZteF9zZXRfY3IwKHZjcHUsIHZtY3MxMi0+Z3Vlc3RfY3IwKTsKKwl2bWNzX3dyaXRlbChDUjBfUkVBRF9TSEFET1csIG5lc3RlZF9yZWFkX2NyMCh2bWNzMTIpKTsKKworCXZteF9zZXRfY3I0KHZjcHUsIHZtY3MxMi0+Z3Vlc3RfY3I0KTsKKwl2bWNzX3dyaXRlbChDUjRfUkVBRF9TSEFET1csIG5lc3RlZF9yZWFkX2NyNCh2bWNzMTIpKTsKKworCS8qIHNoYWRvdyBwYWdlIHRhYmxlcyBvbiBlaXRoZXIgRVBUIG9yIHNoYWRvdyBwYWdlIHRhYmxlcyAqLworCWt2bV9zZXRfY3IzKHZjcHUsIHZtY3MxMi0+Z3Vlc3RfY3IzKTsKKwlrdm1fbW11X3Jlc2V0X2NvbnRleHQodmNwdSk7CisKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JTUCwgdm1jczEyLT5ndWVzdF9yc3ApOworCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUklQLCB2bWNzMTItPmd1ZXN0X3JpcCk7Cit9CisKKy8qCisgKiBuZXN0ZWRfdm14X3J1bigpIGhhbmRsZXMgYSBuZXN0ZWQgZW50cnksIGkuZS4sIGEgVk1MQVVOQ0ggb3IgVk1SRVNVTUUgb24gTDEKKyAqIGZvciBydW5uaW5nIGFuIEwyIG5lc3RlZCBndWVzdC4KKyAqLworc3RhdGljIGludCBuZXN0ZWRfdm14X3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgbGF1bmNoKQoreworCXN0cnVjdCB2bWNzMTIgKnZtY3MxMjsKKwlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKKwlpbnQgY3B1OworCXN0cnVjdCBsb2FkZWRfdm1jcyAqdm1jczAyOworCisJaWYgKCFuZXN0ZWRfdm14X2NoZWNrX3Blcm1pc3Npb24odmNwdSkgfHwKKwkgICAgIW5lc3RlZF92bXhfY2hlY2tfdm1jczEyKHZjcHUpKQorCQlyZXR1cm4gMTsKKworCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJdm1jczEyID0gZ2V0X3ZtY3MxMih2Y3B1KTsKKworCS8qCisJICogVGhlIG5lc3RlZCBlbnRyeSBwcm9jZXNzIHN0YXJ0cyB3aXRoIGVuZm9yY2luZyB2YXJpb3VzIHByZXJlcXVpc2l0ZXMKKwkgKiBvbiB2bWNzMTIgYXMgcmVxdWlyZWQgYnkgdGhlIEludGVsIFNETSwgYW5kIGFjdCBhcHByb3ByaWF0ZWx5IHdoZW4KKwkgKiB0aGV5IGZhaWw6IEFzIHRoZSBTRE0gZXhwbGFpbnMsIHNvbWUgY29uZGl0aW9ucyBzaG91bGQgY2F1c2UgdGhlCisJICogaW5zdHJ1Y3Rpb24gdG8gZmFpbCwgd2hpbGUgb3RoZXJzIHdpbGwgY2F1c2UgdGhlIGluc3RydWN0aW9uIHRvIHNlZW0KKwkgKiB0byBzdWNjZWVkLCBidXQgcmV0dXJuIGFuIEVYSVRfUkVBU09OX0lOVkFMSURfU1RBVEUuCisJICogVG8gc3BlZWQgdXAgdGhlIG5vcm1hbCAoc3VjY2VzcykgY29kZSBwYXRoLCB3ZSBzaG91bGQgYXZvaWQgY2hlY2tpbmcKKwkgKiBmb3IgbWlzY29uZmlndXJhdGlvbnMgd2hpY2ggd2lsbCBhbnl3YXkgYmUgY2F1Z2h0IGJ5IHRoZSBwcm9jZXNzb3IKKwkgKiB3aGVuIHVzaW5nIHRoZSBtZXJnZWQgdm1jczAyLgorCSAqLworCWlmICh2bWNzMTItPmxhdW5jaF9zdGF0ZSA9PSBsYXVuY2gpIHsKKwkJbmVzdGVkX3ZteF9mYWlsVmFsaWQodmNwdSwKKwkJCWxhdW5jaCA/IFZNWEVSUl9WTUxBVU5DSF9OT05DTEVBUl9WTUNTCisJCQkgICAgICAgOiBWTVhFUlJfVk1SRVNVTUVfTk9OTEFVTkNIRURfVk1DUyk7CisJCXJldHVybiAxOworCX0KKworCWlmICgodm1jczEyLT5jcHVfYmFzZWRfdm1fZXhlY19jb250cm9sICYgQ1BVX0JBU0VEX1VTRV9NU1JfQklUTUFQUykgJiYKKwkJCSFJU19BTElHTkVEKHZtY3MxMi0+bXNyX2JpdG1hcCwgUEFHRV9TSVpFKSkgeworCQkvKlRPRE86IEFsc28gdmVyaWZ5IGJpdHMgYmV5b25kIHBoeXNpY2FsIGFkZHJlc3Mgd2lkdGggYXJlIDAqLworCQluZXN0ZWRfdm14X2ZhaWxWYWxpZCh2Y3B1LCBWTVhFUlJfRU5UUllfSU5WQUxJRF9DT05UUk9MX0ZJRUxEKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG5lc3RlZF9jcHVfaGFzMih2bWNzMTIsIFNFQ09OREFSWV9FWEVDX1ZJUlRVQUxJWkVfQVBJQ19BQ0NFU1NFUykgJiYKKwkJCSFJU19BTElHTkVEKHZtY3MxMi0+YXBpY19hY2Nlc3NfYWRkciwgUEFHRV9TSVpFKSkgeworCQkvKlRPRE86IEFsc28gdmVyaWZ5IGJpdHMgYmV5b25kIHBoeXNpY2FsIGFkZHJlc3Mgd2lkdGggYXJlIDAqLworCQluZXN0ZWRfdm14X2ZhaWxWYWxpZCh2Y3B1LCBWTVhFUlJfRU5UUllfSU5WQUxJRF9DT05UUk9MX0ZJRUxEKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHZtY3MxMi0+dm1fZW50cnlfbXNyX2xvYWRfY291bnQgPiAwIHx8CisJICAgIHZtY3MxMi0+dm1fZXhpdF9tc3JfbG9hZF9jb3VudCA+IDAgfHwKKwkgICAgdm1jczEyLT52bV9leGl0X21zcl9zdG9yZV9jb3VudCA+IDApIHsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgIiVzOiBWTUNTIE1TUl97TE9BRCxTVE9SRX0gdW5zdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsKKwkJbmVzdGVkX3ZteF9mYWlsVmFsaWQodmNwdSwgVk1YRVJSX0VOVFJZX0lOVkFMSURfQ09OVFJPTF9GSUVMRCk7CisJCXJldHVybiAxOworCX0KKworCWlmICghdm14X2NvbnRyb2xfdmVyaWZ5KHZtY3MxMi0+Y3B1X2Jhc2VkX3ZtX2V4ZWNfY29udHJvbCwKKwkgICAgICBuZXN0ZWRfdm14X3Byb2NiYXNlZF9jdGxzX2xvdywgbmVzdGVkX3ZteF9wcm9jYmFzZWRfY3Rsc19oaWdoKSB8fAorCSAgICAhdm14X2NvbnRyb2xfdmVyaWZ5KHZtY3MxMi0+c2Vjb25kYXJ5X3ZtX2V4ZWNfY29udHJvbCwKKwkgICAgICBuZXN0ZWRfdm14X3NlY29uZGFyeV9jdGxzX2xvdywgbmVzdGVkX3ZteF9zZWNvbmRhcnlfY3Rsc19oaWdoKSB8fAorCSAgICAhdm14X2NvbnRyb2xfdmVyaWZ5KHZtY3MxMi0+cGluX2Jhc2VkX3ZtX2V4ZWNfY29udHJvbCwKKwkgICAgICBuZXN0ZWRfdm14X3BpbmJhc2VkX2N0bHNfbG93LCBuZXN0ZWRfdm14X3BpbmJhc2VkX2N0bHNfaGlnaCkgfHwKKwkgICAgIXZteF9jb250cm9sX3ZlcmlmeSh2bWNzMTItPnZtX2V4aXRfY29udHJvbHMsCisJICAgICAgbmVzdGVkX3ZteF9leGl0X2N0bHNfbG93LCBuZXN0ZWRfdm14X2V4aXRfY3Rsc19oaWdoKSB8fAorCSAgICAhdm14X2NvbnRyb2xfdmVyaWZ5KHZtY3MxMi0+dm1fZW50cnlfY29udHJvbHMsCisJICAgICAgbmVzdGVkX3ZteF9lbnRyeV9jdGxzX2xvdywgbmVzdGVkX3ZteF9lbnRyeV9jdGxzX2hpZ2gpKQorCXsKKwkJbmVzdGVkX3ZteF9mYWlsVmFsaWQodmNwdSwgVk1YRVJSX0VOVFJZX0lOVkFMSURfQ09OVFJPTF9GSUVMRCk7CisJCXJldHVybiAxOworCX0KKworCWlmICgoKHZtY3MxMi0+aG9zdF9jcjAgJiBWTVhPTl9DUjBfQUxXQVlTT04pICE9IFZNWE9OX0NSMF9BTFdBWVNPTikgfHwKKwkgICAgKCh2bWNzMTItPmhvc3RfY3I0ICYgVk1YT05fQ1I0X0FMV0FZU09OKSAhPSBWTVhPTl9DUjRfQUxXQVlTT04pKSB7CisJCW5lc3RlZF92bXhfZmFpbFZhbGlkKHZjcHUsCisJCQlWTVhFUlJfRU5UUllfSU5WQUxJRF9IT1NUX1NUQVRFX0ZJRUxEKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCgodm1jczEyLT5ndWVzdF9jcjAgJiBWTVhPTl9DUjBfQUxXQVlTT04pICE9IFZNWE9OX0NSMF9BTFdBWVNPTikgfHwKKwkgICAgKCh2bWNzMTItPmd1ZXN0X2NyNCAmIFZNWE9OX0NSNF9BTFdBWVNPTikgIT0gVk1YT05fQ1I0X0FMV0FZU09OKSkgeworCQluZXN0ZWRfdm14X2VudHJ5X2ZhaWx1cmUodmNwdSwgdm1jczEyLAorCQkJRVhJVF9SRUFTT05fSU5WQUxJRF9TVEFURSwgRU5UUllfRkFJTF9ERUZBVUxUKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh2bWNzMTItPnZtY3NfbGlua19wb2ludGVyICE9IC0xdWxsKSB7CisJCW5lc3RlZF92bXhfZW50cnlfZmFpbHVyZSh2Y3B1LCB2bWNzMTIsCisJCQlFWElUX1JFQVNPTl9JTlZBTElEX1NUQVRFLCBFTlRSWV9GQUlMX1ZNQ1NfTElOS19QVFIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIFdlJ3JlIGZpbmFsbHkgZG9uZSB3aXRoIHByZXJlcXVpc2l0ZSBjaGVja2luZywgYW5kIGNhbiBzdGFydCB3aXRoCisJICogdGhlIG5lc3RlZCBlbnRyeS4KKwkgKi8KKworCXZtY3MwMiA9IG5lc3RlZF9nZXRfY3VycmVudF92bWNzMDIodm14KTsKKwlpZiAoIXZtY3MwMikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnRlcl9ndWVzdF9tb2RlKHZjcHUpOworCisJdm14LT5uZXN0ZWQudm1jczAxX3RzY19vZmZzZXQgPSB2bWNzX3JlYWQ2NChUU0NfT0ZGU0VUKTsKKworCWNwdSA9IGdldF9jcHUoKTsKKwl2bXgtPmxvYWRlZF92bWNzID0gdm1jczAyOworCXZteF92Y3B1X3B1dCh2Y3B1KTsKKwl2bXhfdmNwdV9sb2FkKHZjcHUsIGNwdSk7CisJdmNwdS0+Y3B1ID0gY3B1OworCXB1dF9jcHUoKTsKKworCXZtY3MxMi0+bGF1bmNoX3N0YXRlID0gMTsKKworCXByZXBhcmVfdm1jczAyKHZjcHUsIHZtY3MxMik7CisKKwkvKgorCSAqIE5vdGUgbm8gbmVzdGVkX3ZteF9zdWNjZWVkIG9yIG5lc3RlZF92bXhfZmFpbCBoZXJlLiBBdCB0aGlzIHBvaW50CisJICogd2UgYXJlIG5vIGxvbmdlciBydW5uaW5nIEwxLCBhbmQgVk1MQVVOQ0gvVk1SRVNVTUUgaGFzIG5vdCB5ZXQKKwkgKiByZXR1cm5lZCBhcyBmYXIgYXMgTDEgaXMgY29uY2VybmVkLiBJdCB3aWxsIG9ubHkgcmV0dXJuIChhbmQgc2V0CisJICogdGhlIHN1Y2Nlc3MgZmxhZykgd2hlbiBMMiBleGl0cyAoc2VlIG5lc3RlZF92bXhfdm1leGl0KCkpLgorCSAqLworCXJldHVybiAxOworfQorCisvKgorICogT24gYSBuZXN0ZWQgZXhpdCBmcm9tIEwyIHRvIEwxLCB2bWNzMTIuZ3Vlc3RfY3IwIG1pZ2h0IG5vdCBiZSB1cC10by1kYXRlCisgKiBiZWNhdXNlIEwyIG1heSBoYXZlIGNoYW5nZWQgc29tZSBjcjAgYml0cyBkaXJlY3RseSAoQ1JPX0dVRVNUX0hPU1RfTUFTSykuCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5ldyB2YWx1ZSB3ZSBzaG91bGQgcHV0IGluIHZtY3MxMi5ndWVzdF9jcjAuCisgKiBJdCdzIG5vdCBlbm91Z2ggdG8ganVzdCByZXR1cm4gdGhlIHZtY3MwMiBHVUVTVF9DUjAuIFJhdGhlciwKKyAqICAxLiBCaXRzIHRoYXQgbmVpdGhlciBMMCBub3IgTDEgdHJhcHBlZCwgd2VyZSBzZXQgZGlyZWN0bHkgYnkgTDIgYW5kIGFyZSBub3cKKyAqICAgICBhdmFpbGFibGUgaW4gdm1jczAyIEdVRVNUX0NSMC4gKE5vdGU6IEl0J3MgZW5vdWdoIHRvIGNoZWNrIHRoYXQgTDAKKyAqICAgICBkaWRuJ3QgdHJhcCB0aGUgYml0LCBiZWNhdXNlIGlmIEwxIGRpZCwgc28gd291bGQgTDApLgorICogIDIuIEJpdHMgdGhhdCBMMSBhc2tlZCB0byB0cmFwIChhbmQgdGhlcmVmb3JlIEwwIGFsc28gZGlkKSBjb3VsZCBub3QgaGF2ZQorICogICAgIGJlZW4gbW9kaWZpZWQgYnkgTDIsIGFuZCBMMSBrbm93cyBpdC4gU28ganVzdCBsZWF2ZSB0aGUgb2xkIHZhbHVlIG9mCisgKiAgICAgdGhlIGJpdCBmcm9tIHZtY3MxMi5ndWVzdF9jcjAuIE5vdGUgdGhhdCB0aGUgYml0IGZyb20gdm1jczAyIEdVRVNUX0NSMAorICogICAgIGlzbid0IHJlbGV2YW50LCBiZWNhdXNlIGlmIEwwIHRyYXBzIHRoaXMgYml0IGl0IGNhbiBzZXQgaXQgdG8gYW55dGhpbmcuCisgKiAgMy4gQml0cyB0aGF0IEwxIGRpZG4ndCB0cmFwLCBidXQgTDAgZGlkLiBMMSBiZWxpZXZlcyB0aGUgZ3Vlc3QgY291bGQgaGF2ZQorICogICAgIGNoYW5nZWQgdGhlc2UgYml0cywgYW5kIHRoZXJlZm9yZSB0aGV5IG5lZWQgdG8gYmUgdXBkYXRlZCwgYnV0IEwwCisgKiAgICAgZGlkbid0IG5lY2Vzc2FyaWx5IGFsbG93IHRoZW0gdG8gYmUgY2hhbmdlZCBpbiBHVUVTVF9DUjAgLSBhbmQgcmF0aGVyCisgKiAgICAgcHV0IHRoZW0gaW4gdm1jczAyIENSMF9SRUFEX1NIQURPVy4gU28gdGFrZSB0aGVzZSBiaXRzIGZyb20gdGhlcmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwordm1jczEyX2d1ZXN0X2NyMChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCB2bWNzMTIgKnZtY3MxMikKK3sKKwlyZXR1cm4KKwkvKjEqLwkodm1jc19yZWFkbChHVUVTVF9DUjApICYgdmNwdS0+YXJjaC5jcjBfZ3Vlc3Rfb3duZWRfYml0cykgfAorCS8qMiovCSh2bWNzMTItPmd1ZXN0X2NyMCAmIHZtY3MxMi0+Y3IwX2d1ZXN0X2hvc3RfbWFzaykgfAorCS8qMyovCSh2bWNzX3JlYWRsKENSMF9SRUFEX1NIQURPVykgJiB+KHZtY3MxMi0+Y3IwX2d1ZXN0X2hvc3RfbWFzayB8CisJCQl2Y3B1LT5hcmNoLmNyMF9ndWVzdF9vd25lZF9iaXRzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwordm1jczEyX2d1ZXN0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCB2bWNzMTIgKnZtY3MxMikKK3sKKwlyZXR1cm4KKwkvKjEqLwkodm1jc19yZWFkbChHVUVTVF9DUjQpICYgdmNwdS0+YXJjaC5jcjRfZ3Vlc3Rfb3duZWRfYml0cykgfAorCS8qMiovCSh2bWNzMTItPmd1ZXN0X2NyNCAmIHZtY3MxMi0+Y3I0X2d1ZXN0X2hvc3RfbWFzaykgfAorCS8qMyovCSh2bWNzX3JlYWRsKENSNF9SRUFEX1NIQURPVykgJiB+KHZtY3MxMi0+Y3I0X2d1ZXN0X2hvc3RfbWFzayB8CisJCQl2Y3B1LT5hcmNoLmNyNF9ndWVzdF9vd25lZF9iaXRzKSk7Cit9CisKKy8qCisgKiBwcmVwYXJlX3ZtY3MxMiBpcyBwYXJ0IG9mIHdoYXQgd2UgbmVlZCB0byBkbyB3aGVuIHRoZSBuZXN0ZWQgTDIgZ3Vlc3QgZXhpdHMKKyAqIGFuZCB3ZSB3YW50IHRvIHByZXBhcmUgdG8gcnVuIGl0cyBMMSBwYXJlbnQuIEwxIGtlZXBzIGEgdm1jcyBmb3IgTDIgKHZtY3MxMiksCisgKiBhbmQgdGhpcyBmdW5jdGlvbiB1cGRhdGVzIGl0IHRvIHJlZmxlY3QgdGhlIGNoYW5nZXMgdG8gdGhlIGd1ZXN0IHN0YXRlIHdoaWxlCisgKiBMMiB3YXMgcnVubmluZyAoYW5kIHBlcmhhcHMgbWFkZSBzb21lIGV4aXRzIHdoaWNoIHdlcmUgaGFuZGxlZCBkaXJlY3RseSBieSBMMAorICogd2l0aG91dCBnb2luZyBiYWNrIHRvIEwxKSwgYW5kIHRvIHJlZmxlY3QgdGhlIGV4aXQgcmVhc29uLgorICogTm90ZSB0aGF0IHdlIGRvIG5vdCBoYXZlIHRvIGNvcHkgaGVyZSBhbGwgVk1DUyBmaWVsZHMsIGp1c3QgdGhvc2UgdGhhdAorICogY291bGQgaGF2ZSBjaGFuZ2VkIGJ5IHRoZSBMMiBndWVzdCBvciB0aGUgZXhpdCAtIGkuZS4sIHRoZSBndWVzdC1zdGF0ZSBhbmQKKyAqIGV4aXQtaW5mb3JtYXRpb24gZmllbGRzIG9ubHkuIE90aGVyIGZpZWxkcyBhcmUgbW9kaWZpZWQgYnkgTDEgd2l0aCBWTVdSSVRFLAorICogd2hpY2ggYWxyZWFkeSB3cml0ZXMgdG8gdm1jczEyIGRpcmVjdGx5LgorICovCit2b2lkIHByZXBhcmVfdm1jczEyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IHZtY3MxMiAqdm1jczEyKQoreworCS8qIHVwZGF0ZSBndWVzdCBzdGF0ZSBmaWVsZHM6ICovCisJdm1jczEyLT5ndWVzdF9jcjAgPSB2bWNzMTJfZ3Vlc3RfY3IwKHZjcHUsIHZtY3MxMik7CisJdm1jczEyLT5ndWVzdF9jcjQgPSB2bWNzMTJfZ3Vlc3RfY3I0KHZjcHUsIHZtY3MxMik7CisKKwlrdm1fZ2V0X2RyKHZjcHUsIDcsICh1bnNpZ25lZCBsb25nICopJnZtY3MxMi0+Z3Vlc3RfZHI3KTsKKwl2bWNzMTItPmd1ZXN0X3JzcCA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SU1ApOworCXZtY3MxMi0+Z3Vlc3RfcmlwID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1JJUCk7CisJdm1jczEyLT5ndWVzdF9yZmxhZ3MgPSB2bWNzX3JlYWRsKEdVRVNUX1JGTEFHUyk7CisKKwl2bWNzMTItPmd1ZXN0X2VzX3NlbGVjdG9yID0gdm1jc19yZWFkMTYoR1VFU1RfRVNfU0VMRUNUT1IpOworCXZtY3MxMi0+Z3Vlc3RfY3Nfc2VsZWN0b3IgPSB2bWNzX3JlYWQxNihHVUVTVF9DU19TRUxFQ1RPUik7CisJdm1jczEyLT5ndWVzdF9zc19zZWxlY3RvciA9IHZtY3NfcmVhZDE2KEdVRVNUX1NTX1NFTEVDVE9SKTsKKwl2bWNzMTItPmd1ZXN0X2RzX3NlbGVjdG9yID0gdm1jc19yZWFkMTYoR1VFU1RfRFNfU0VMRUNUT1IpOworCXZtY3MxMi0+Z3Vlc3RfZnNfc2VsZWN0b3IgPSB2bWNzX3JlYWQxNihHVUVTVF9GU19TRUxFQ1RPUik7CisJdm1jczEyLT5ndWVzdF9nc19zZWxlY3RvciA9IHZtY3NfcmVhZDE2KEdVRVNUX0dTX1NFTEVDVE9SKTsKKwl2bWNzMTItPmd1ZXN0X2xkdHJfc2VsZWN0b3IgPSB2bWNzX3JlYWQxNihHVUVTVF9MRFRSX1NFTEVDVE9SKTsKKwl2bWNzMTItPmd1ZXN0X3RyX3NlbGVjdG9yID0gdm1jc19yZWFkMTYoR1VFU1RfVFJfU0VMRUNUT1IpOworCXZtY3MxMi0+Z3Vlc3RfZXNfbGltaXQgPSB2bWNzX3JlYWQzMihHVUVTVF9FU19MSU1JVCk7CisJdm1jczEyLT5ndWVzdF9jc19saW1pdCA9IHZtY3NfcmVhZDMyKEdVRVNUX0NTX0xJTUlUKTsKKwl2bWNzMTItPmd1ZXN0X3NzX2xpbWl0ID0gdm1jc19yZWFkMzIoR1VFU1RfU1NfTElNSVQpOworCXZtY3MxMi0+Z3Vlc3RfZHNfbGltaXQgPSB2bWNzX3JlYWQzMihHVUVTVF9EU19MSU1JVCk7CisJdm1jczEyLT5ndWVzdF9mc19saW1pdCA9IHZtY3NfcmVhZDMyKEdVRVNUX0ZTX0xJTUlUKTsKKwl2bWNzMTItPmd1ZXN0X2dzX2xpbWl0ID0gdm1jc19yZWFkMzIoR1VFU1RfR1NfTElNSVQpOworCXZtY3MxMi0+Z3Vlc3RfbGR0cl9saW1pdCA9IHZtY3NfcmVhZDMyKEdVRVNUX0xEVFJfTElNSVQpOworCXZtY3MxMi0+Z3Vlc3RfdHJfbGltaXQgPSB2bWNzX3JlYWQzMihHVUVTVF9UUl9MSU1JVCk7CisJdm1jczEyLT5ndWVzdF9nZHRyX2xpbWl0ID0gdm1jc19yZWFkMzIoR1VFU1RfR0RUUl9MSU1JVCk7CisJdm1jczEyLT5ndWVzdF9pZHRyX2xpbWl0ID0gdm1jc19yZWFkMzIoR1VFU1RfSURUUl9MSU1JVCk7CisJdm1jczEyLT5ndWVzdF9lc19hcl9ieXRlcyA9IHZtY3NfcmVhZDMyKEdVRVNUX0VTX0FSX0JZVEVTKTsKKwl2bWNzMTItPmd1ZXN0X2NzX2FyX2J5dGVzID0gdm1jc19yZWFkMzIoR1VFU1RfQ1NfQVJfQllURVMpOworCXZtY3MxMi0+Z3Vlc3Rfc3NfYXJfYnl0ZXMgPSB2bWNzX3JlYWQzMihHVUVTVF9TU19BUl9CWVRFUyk7CisJdm1jczEyLT5ndWVzdF9kc19hcl9ieXRlcyA9IHZtY3NfcmVhZDMyKEdVRVNUX0RTX0FSX0JZVEVTKTsKKwl2bWNzMTItPmd1ZXN0X2ZzX2FyX2J5dGVzID0gdm1jc19yZWFkMzIoR1VFU1RfRlNfQVJfQllURVMpOworCXZtY3MxMi0+Z3Vlc3RfZ3NfYXJfYnl0ZXMgPSB2bWNzX3JlYWQzMihHVUVTVF9HU19BUl9CWVRFUyk7CisJdm1jczEyLT5ndWVzdF9sZHRyX2FyX2J5dGVzID0gdm1jc19yZWFkMzIoR1VFU1RfTERUUl9BUl9CWVRFUyk7CisJdm1jczEyLT5ndWVzdF90cl9hcl9ieXRlcyA9IHZtY3NfcmVhZDMyKEdVRVNUX1RSX0FSX0JZVEVTKTsKKwl2bWNzMTItPmd1ZXN0X2VzX2Jhc2UgPSB2bWNzX3JlYWRsKEdVRVNUX0VTX0JBU0UpOworCXZtY3MxMi0+Z3Vlc3RfY3NfYmFzZSA9IHZtY3NfcmVhZGwoR1VFU1RfQ1NfQkFTRSk7CisJdm1jczEyLT5ndWVzdF9zc19iYXNlID0gdm1jc19yZWFkbChHVUVTVF9TU19CQVNFKTsKKwl2bWNzMTItPmd1ZXN0X2RzX2Jhc2UgPSB2bWNzX3JlYWRsKEdVRVNUX0RTX0JBU0UpOworCXZtY3MxMi0+Z3Vlc3RfZnNfYmFzZSA9IHZtY3NfcmVhZGwoR1VFU1RfRlNfQkFTRSk7CisJdm1jczEyLT5ndWVzdF9nc19iYXNlID0gdm1jc19yZWFkbChHVUVTVF9HU19CQVNFKTsKKwl2bWNzMTItPmd1ZXN0X2xkdHJfYmFzZSA9IHZtY3NfcmVhZGwoR1VFU1RfTERUUl9CQVNFKTsKKwl2bWNzMTItPmd1ZXN0X3RyX2Jhc2UgPSB2bWNzX3JlYWRsKEdVRVNUX1RSX0JBU0UpOworCXZtY3MxMi0+Z3Vlc3RfZ2R0cl9iYXNlID0gdm1jc19yZWFkbChHVUVTVF9HRFRSX0JBU0UpOworCXZtY3MxMi0+Z3Vlc3RfaWR0cl9iYXNlID0gdm1jc19yZWFkbChHVUVTVF9JRFRSX0JBU0UpOworCisJdm1jczEyLT5ndWVzdF9hY3Rpdml0eV9zdGF0ZSA9IHZtY3NfcmVhZDMyKEdVRVNUX0FDVElWSVRZX1NUQVRFKTsKKwl2bWNzMTItPmd1ZXN0X2ludGVycnVwdGliaWxpdHlfaW5mbyA9CisJCXZtY3NfcmVhZDMyKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTyk7CisJdm1jczEyLT5ndWVzdF9wZW5kaW5nX2RiZ19leGNlcHRpb25zID0KKwkJdm1jc19yZWFkbChHVUVTVF9QRU5ESU5HX0RCR19FWENFUFRJT05TKTsKKworCS8qIFRPRE86IFRoZXNlIGNhbm5vdCBoYXZlIGNoYW5nZWQgdW5sZXNzIHdlIGhhdmUgTVNSIGJpdG1hcHMgYW5kCisJICogdGhlIHJlbGV2YW50IGJpdCBhc2tzIG5vdCB0byB0cmFwIHRoZSBjaGFuZ2UgKi8KKwl2bWNzMTItPmd1ZXN0X2lhMzJfZGVidWdjdGwgPSB2bWNzX3JlYWQ2NChHVUVTVF9JQTMyX0RFQlVHQ1RMKTsKKwlpZiAodm1jczEyLT52bV9lbnRyeV9jb250cm9scyAmIFZNX0VYSVRfU0FWRV9JQTMyX1BBVCkKKwkJdm1jczEyLT5ndWVzdF9pYTMyX3BhdCA9IHZtY3NfcmVhZDY0KEdVRVNUX0lBMzJfUEFUKTsKKwl2bWNzMTItPmd1ZXN0X3N5c2VudGVyX2NzID0gdm1jc19yZWFkMzIoR1VFU1RfU1lTRU5URVJfQ1MpOworCXZtY3MxMi0+Z3Vlc3Rfc3lzZW50ZXJfZXNwID0gdm1jc19yZWFkbChHVUVTVF9TWVNFTlRFUl9FU1ApOworCXZtY3MxMi0+Z3Vlc3Rfc3lzZW50ZXJfZWlwID0gdm1jc19yZWFkbChHVUVTVF9TWVNFTlRFUl9FSVApOworCisJLyogdXBkYXRlIGV4aXQgaW5mb3JtYXRpb24gZmllbGRzOiAqLworCisJdm1jczEyLT52bV9leGl0X3JlYXNvbiAgPSB2bWNzX3JlYWQzMihWTV9FWElUX1JFQVNPTik7CisJdm1jczEyLT5leGl0X3F1YWxpZmljYXRpb24gPSB2bWNzX3JlYWRsKEVYSVRfUVVBTElGSUNBVElPTik7CisKKwl2bWNzMTItPnZtX2V4aXRfaW50cl9pbmZvID0gdm1jc19yZWFkMzIoVk1fRVhJVF9JTlRSX0lORk8pOworCXZtY3MxMi0+dm1fZXhpdF9pbnRyX2Vycm9yX2NvZGUgPSB2bWNzX3JlYWQzMihWTV9FWElUX0lOVFJfRVJST1JfQ09ERSk7CisJdm1jczEyLT5pZHRfdmVjdG9yaW5nX2luZm9fZmllbGQgPQorCQl2bWNzX3JlYWQzMihJRFRfVkVDVE9SSU5HX0lORk9fRklFTEQpOworCXZtY3MxMi0+aWR0X3ZlY3RvcmluZ19lcnJvcl9jb2RlID0KKwkJdm1jc19yZWFkMzIoSURUX1ZFQ1RPUklOR19FUlJPUl9DT0RFKTsKKwl2bWNzMTItPnZtX2V4aXRfaW5zdHJ1Y3Rpb25fbGVuID0gdm1jc19yZWFkMzIoVk1fRVhJVF9JTlNUUlVDVElPTl9MRU4pOworCXZtY3MxMi0+dm14X2luc3RydWN0aW9uX2luZm8gPSB2bWNzX3JlYWQzMihWTVhfSU5TVFJVQ1RJT05fSU5GTyk7CisKKwkvKiBjbGVhciB2bS1lbnRyeSBmaWVsZHMgd2hpY2ggYXJlIHRvIGJlIGNsZWFyZWQgb24gZXhpdCAqLworCWlmICghKHZtY3MxMi0+dm1fZXhpdF9yZWFzb24gJiBWTVhfRVhJVF9SRUFTT05TX0ZBSUxFRF9WTUVOVFJZKSkKKwkJdm1jczEyLT52bV9lbnRyeV9pbnRyX2luZm9fZmllbGQgJj0gfklOVFJfSU5GT19WQUxJRF9NQVNLOworfQorCisvKgorICogQSBwYXJ0IG9mIHdoYXQgd2UgbmVlZCB0byB3aGVuIHRoZSBuZXN0ZWQgTDIgZ3Vlc3QgZXhpdHMgYW5kIHdlIHdhbnQgdG8KKyAqIHJ1biBpdHMgTDEgcGFyZW50LCBpcyB0byByZXNldCBMMSdzIGd1ZXN0IHN0YXRlIHRvIHRoZSBob3N0IHN0YXRlIHNwZWNpZmllZAorICogaW4gdm1jczEyLgorICogVGhpcyBmdW5jdGlvbiBpcyB0byBiZSBjYWxsZWQgbm90IG9ubHkgb24gbm9ybWFsIG5lc3RlZCBleGl0LCBidXQgYWxzbyBvbgorICogYSBuZXN0ZWQgZW50cnkgZmFpbHVyZSwgYXMgZXhwbGFpbmVkIGluIEludGVsJ3Mgc3BlYywgM0IuMjMuNyAoIlZNLUVudHJ5CisgKiBGYWlsdXJlcyBEdXJpbmcgb3IgQWZ0ZXIgTG9hZGluZyBHdWVzdCBTdGF0ZSIpLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGFjdGl2ZSBWTUNTIGlzIEwxJ3MgKHZtY3MwMSkuCisgKi8KK3ZvaWQgbG9hZF92bWNzMTJfaG9zdF9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCB2bWNzMTIgKnZtY3MxMikKK3sKKwlpZiAodm1jczEyLT52bV9leGl0X2NvbnRyb2xzICYgVk1fRVhJVF9MT0FEX0lBMzJfRUZFUikKKwkJdmNwdS0+YXJjaC5lZmVyID0gdm1jczEyLT5ob3N0X2lhMzJfZWZlcjsKKwlpZiAodm1jczEyLT52bV9leGl0X2NvbnRyb2xzICYgVk1fRVhJVF9IT1NUX0FERFJfU1BBQ0VfU0laRSkKKwkJdmNwdS0+YXJjaC5lZmVyIHw9IChFRkVSX0xNQSB8IEVGRVJfTE1FKTsKKwllbHNlCisJCXZjcHUtPmFyY2guZWZlciAmPSB+KEVGRVJfTE1BIHwgRUZFUl9MTUUpOworCXZteF9zZXRfZWZlcih2Y3B1LCB2Y3B1LT5hcmNoLmVmZXIpOworCisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SU1AsIHZtY3MxMi0+aG9zdF9yc3ApOworCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUklQLCB2bWNzMTItPmhvc3RfcmlwKTsKKwkvKgorCSAqIE5vdGUgdGhhdCBjYWxsaW5nIHZteF9zZXRfY3IwIGlzIGltcG9ydGFudCwgZXZlbiBpZiBjcjAgaGFzbid0CisJICogYWN0dWFsbHkgY2hhbmdlZCwgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mCisJICogZnB1X2FjdGl2ZSAod2hpY2ggbWF5IGhhdmUgY2hhbmdlZCkuCisJICogTm90ZSB0aGF0IHZteF9zZXRfY3IwIHJlZmVycyB0byBlZmVyIHNldCBhYm92ZS4KKwkgKi8KKwlrdm1fc2V0X2NyMCh2Y3B1LCB2bWNzMTItPmhvc3RfY3IwKTsKKwkvKgorCSAqIElmIHdlIGRpZCBmcHVfYWN0aXZhdGUoKS9mcHVfZGVhY3RpdmF0ZSgpIGR1cmluZyBMMidzIHJ1biwgd2UgbmVlZAorCSAqIHRvIGFwcGx5IHRoZSBzYW1lIGNoYW5nZXMgdG8gTDEncyB2bWNzLiBXZSBqdXN0IHNldCBjcjAgY29ycmVjdGx5LAorCSAqIGJ1dCB3ZSBhbHNvIG5lZWQgdG8gdXBkYXRlIGNyMF9ndWVzdF9ob3N0X21hc2sgYW5kIGV4Y2VwdGlvbl9iaXRtYXAuCisJICovCisJdXBkYXRlX2V4Y2VwdGlvbl9iaXRtYXAodmNwdSk7CisJdmNwdS0+YXJjaC5jcjBfZ3Vlc3Rfb3duZWRfYml0cyA9ICh2Y3B1LT5mcHVfYWN0aXZlID8gWDg2X0NSMF9UUyA6IDApOworCXZtY3Nfd3JpdGVsKENSMF9HVUVTVF9IT1NUX01BU0ssIH52Y3B1LT5hcmNoLmNyMF9ndWVzdF9vd25lZF9iaXRzKTsKKworCS8qCisJICogTm90ZSB0aGF0IENSNF9HVUVTVF9IT1NUX01BU0sgaXMgYWxyZWFkeSBzZXQgaW4gdGhlIG9yaWdpbmFsIHZtY3MwMQorCSAqIChLVk0gZG9lc24ndCBjaGFuZ2UgaXQpLSBubyByZWFzb24gdG8gY2FsbCBzZXRfY3I0X2d1ZXN0X2hvc3RfbWFzaygpOworCSAqLworCXZjcHUtPmFyY2guY3I0X2d1ZXN0X293bmVkX2JpdHMgPSB+dm1jc19yZWFkbChDUjRfR1VFU1RfSE9TVF9NQVNLKTsKKwlrdm1fc2V0X2NyNCh2Y3B1LCB2bWNzMTItPmhvc3RfY3I0KTsKKworCS8qIHNoYWRvdyBwYWdlIHRhYmxlcyBvbiBlaXRoZXIgRVBUIG9yIHNoYWRvdyBwYWdlIHRhYmxlcyAqLworCWt2bV9zZXRfY3IzKHZjcHUsIHZtY3MxMi0+aG9zdF9jcjMpOworCWt2bV9tbXVfcmVzZXRfY29udGV4dCh2Y3B1KTsKKworCWlmIChlbmFibGVfdnBpZCkgeworCQkvKgorCQkgKiBUcml2aWFsbHkgc3VwcG9ydCB2cGlkIGJ5IGxldHRpbmcgTDJzIHNoYXJlIHRoZWlyIHBhcmVudAorCQkgKiBMMSdzIHZwaWQuIFRPRE86IG1vdmUgdG8gYSBtb3JlIGVsYWJvcmF0ZSBzb2x1dGlvbiwgZ2l2aW5nCisJCSAqIGVhY2ggTDIgaXRzIG93biB2cGlkIGFuZCBleHBvc2luZyB0aGUgdnBpZCBmZWF0dXJlIHRvIEwxLgorCQkgKi8KKwkJdm14X2ZsdXNoX3RsYih2Y3B1KTsKKwl9CisKKworCXZtY3Nfd3JpdGUzMihHVUVTVF9TWVNFTlRFUl9DUywgdm1jczEyLT5ob3N0X2lhMzJfc3lzZW50ZXJfY3MpOworCXZtY3Nfd3JpdGVsKEdVRVNUX1NZU0VOVEVSX0VTUCwgdm1jczEyLT5ob3N0X2lhMzJfc3lzZW50ZXJfZXNwKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9TWVNFTlRFUl9FSVAsIHZtY3MxMi0+aG9zdF9pYTMyX3N5c2VudGVyX2VpcCk7CisJdm1jc193cml0ZWwoR1VFU1RfSURUUl9CQVNFLCB2bWNzMTItPmhvc3RfaWR0cl9iYXNlKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9HRFRSX0JBU0UsIHZtY3MxMi0+aG9zdF9nZHRyX2Jhc2UpOworCXZtY3Nfd3JpdGVsKEdVRVNUX1RSX0JBU0UsIHZtY3MxMi0+aG9zdF90cl9iYXNlKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9HU19CQVNFLCB2bWNzMTItPmhvc3RfZ3NfYmFzZSk7CisJdm1jc193cml0ZWwoR1VFU1RfRlNfQkFTRSwgdm1jczEyLT5ob3N0X2ZzX2Jhc2UpOworCXZtY3Nfd3JpdGUxNihHVUVTVF9FU19TRUxFQ1RPUiwgdm1jczEyLT5ob3N0X2VzX3NlbGVjdG9yKTsKKwl2bWNzX3dyaXRlMTYoR1VFU1RfQ1NfU0VMRUNUT1IsIHZtY3MxMi0+aG9zdF9jc19zZWxlY3Rvcik7CisJdm1jc193cml0ZTE2KEdVRVNUX1NTX1NFTEVDVE9SLCB2bWNzMTItPmhvc3Rfc3Nfc2VsZWN0b3IpOworCXZtY3Nfd3JpdGUxNihHVUVTVF9EU19TRUxFQ1RPUiwgdm1jczEyLT5ob3N0X2RzX3NlbGVjdG9yKTsKKwl2bWNzX3dyaXRlMTYoR1VFU1RfRlNfU0VMRUNUT1IsIHZtY3MxMi0+aG9zdF9mc19zZWxlY3Rvcik7CisJdm1jc193cml0ZTE2KEdVRVNUX0dTX1NFTEVDVE9SLCB2bWNzMTItPmhvc3RfZ3Nfc2VsZWN0b3IpOworCXZtY3Nfd3JpdGUxNihHVUVTVF9UUl9TRUxFQ1RPUiwgdm1jczEyLT5ob3N0X3RyX3NlbGVjdG9yKTsKKworCWlmICh2bWNzMTItPnZtX2V4aXRfY29udHJvbHMgJiBWTV9FWElUX0xPQURfSUEzMl9QQVQpCisJCXZtY3Nfd3JpdGU2NChHVUVTVF9JQTMyX1BBVCwgdm1jczEyLT5ob3N0X2lhMzJfcGF0KTsKKwlpZiAodm1jczEyLT52bV9leGl0X2NvbnRyb2xzICYgVk1fRVhJVF9MT0FEX0lBMzJfUEVSRl9HTE9CQUxfQ1RSTCkKKwkJdm1jc193cml0ZTY0KEdVRVNUX0lBMzJfUEVSRl9HTE9CQUxfQ1RSTCwKKwkJCXZtY3MxMi0+aG9zdF9pYTMyX3BlcmZfZ2xvYmFsX2N0cmwpOworfQorCisvKgorICogRW11bGF0ZSBhbiBleGl0IGZyb20gbmVzdGVkIGd1ZXN0IChMMikgdG8gTDEsIGkuZS4sIHByZXBhcmUgdG8gcnVuIEwxCisgKiBhbmQgbW9kaWZ5IHZtY3MxMiB0byBtYWtlIGl0IHNlZSB3aGF0IGl0IHdvdWxkIGV4cGVjdCB0byBzZWUgdGhlcmUgaWYKKyAqIEwyIHdhcyBpdHMgcmVhbCBndWVzdC4gTXVzdCBvbmx5IGJlIGNhbGxlZCB3aGVuIGluIEwyIChpc19ndWVzdF9tb2RlKCkpCisgKi8KK3N0YXRpYyB2b2lkIG5lc3RlZF92bXhfdm1leGl0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKKwlpbnQgY3B1OworCXN0cnVjdCB2bWNzMTIgKnZtY3MxMiA9IGdldF92bWNzMTIodmNwdSk7CisKKwlsZWF2ZV9ndWVzdF9tb2RlKHZjcHUpOworCXByZXBhcmVfdm1jczEyKHZjcHUsIHZtY3MxMik7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJdm14LT5sb2FkZWRfdm1jcyA9ICZ2bXgtPnZtY3MwMTsKKwl2bXhfdmNwdV9wdXQodmNwdSk7CisJdm14X3ZjcHVfbG9hZCh2Y3B1LCBjcHUpOworCXZjcHUtPmNwdSA9IGNwdTsKKwlwdXRfY3B1KCk7CisKKwkvKiBpZiBubyB2bWNzMDIgY2FjaGUgcmVxdWVzdGVkLCByZW1vdmUgdGhlIG9uZSB3ZSB1c2VkICovCisJaWYgKFZNQ1MwMl9QT09MX1NJWkUgPT0gMCkKKwkJbmVzdGVkX2ZyZWVfdm1jczAyKHZteCwgdm14LT5uZXN0ZWQuY3VycmVudF92bXB0cik7CisKKwlsb2FkX3ZtY3MxMl9ob3N0X3N0YXRlKHZjcHUsIHZtY3MxMik7CisKKwkvKiBVcGRhdGUgVFNDX09GRlNFVCBpZiB2bXhfYWRqdXN0X3RzY19vZmZzZXQoKSB3YXMgdXNlZCB3aGlsZSBMMiByYW4gKi8KKwl2bWNzX3dyaXRlNjQoVFNDX09GRlNFVCwgdm14LT5uZXN0ZWQudm1jczAxX3RzY19vZmZzZXQpOworCisJLyogVGhpcyBpcyBuZWVkZWQgZm9yIHNhbWUgcmVhc29uIGFzIGl0IHdhcyBuZWVkZWQgaW4gcHJlcGFyZV92bWNzMDIgKi8KKwl2bXgtPmhvc3RfcnNwID0gMDsKKworCS8qIFVucGluIHBoeXNpY2FsIG1lbW9yeSB3ZSByZWZlcnJlZCB0byBpbiB2bWNzMDIgKi8KKwlpZiAodm14LT5uZXN0ZWQuYXBpY19hY2Nlc3NfcGFnZSkgeworCQluZXN0ZWRfcmVsZWFzZV9wYWdlKHZteC0+bmVzdGVkLmFwaWNfYWNjZXNzX3BhZ2UpOworCQl2bXgtPm5lc3RlZC5hcGljX2FjY2Vzc19wYWdlID0gMDsKKwl9CisKKwkvKgorCSAqIEV4aXRpbmcgZnJvbSBMMiB0byBMMSwgd2UncmUgbm93IGJhY2sgdG8gTDEgd2hpY2ggdGhpbmtzIGl0IGp1c3QKKwkgKiBmaW5pc2hlZCBhIFZNTEFVTkNIIG9yIFZNUkVTVU1FIGluc3RydWN0aW9uLCBzbyB3ZSBuZWVkIHRvIHNldCB0aGUKKwkgKiBzdWNjZXNzIG9yIGZhaWx1cmUgZmxhZyBhY2NvcmRpbmdseS4KKwkgKi8KKwlpZiAodW5saWtlbHkodm14LT5mYWlsKSkgeworCQl2bXgtPmZhaWwgPSAwOworCQluZXN0ZWRfdm14X2ZhaWxWYWxpZCh2Y3B1LCB2bWNzX3JlYWQzMihWTV9JTlNUUlVDVElPTl9FUlJPUikpOworCX0gZWxzZQorCQluZXN0ZWRfdm14X3N1Y2NlZWQodmNwdSk7Cit9CisKKy8qCisgKiBMMSdzIGZhaWx1cmUgdG8gZW50ZXIgTDIgaXMgYSBzdWJzZXQgb2YgYSBub3JtYWwgZXhpdCwgYXMgZXhwbGFpbmVkIGluCisgKiAyMy43ICJWTS1lbnRyeSBmYWlsdXJlcyBkdXJpbmcgb3IgYWZ0ZXIgbG9hZGluZyBndWVzdCBzdGF0ZSIgKHRoaXMgYWxzbworICogbGlzdHMgdGhlIGFjY2VwdGFibGUgZXhpdC1yZWFzb24gYW5kIGV4aXQtcXVhbGlmaWNhdGlvbiBwYXJhbWV0ZXJzKS4KKyAqIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgTDIgYWN0dWFsbHkgc3VjY2VlZGVkIHRvIHJ1biwgYW5kIHdoZW4KKyAqIHZtY3MwMSBpcyBjdXJyZW50IChpdCBkb2Vzbid0IGxlYXZlX2d1ZXN0X21vZGUoKSBvciBzd2l0Y2ggdm1jc3MpLgorICovCitzdGF0aWMgdm9pZCBuZXN0ZWRfdm14X2VudHJ5X2ZhaWx1cmUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJc3RydWN0IHZtY3MxMiAqdm1jczEyLAorCQkJdTMyIHJlYXNvbiwgdW5zaWduZWQgbG9uZyBxdWFsaWZpY2F0aW9uKQoreworCWxvYWRfdm1jczEyX2hvc3Rfc3RhdGUodmNwdSwgdm1jczEyKTsKKwl2bWNzMTItPnZtX2V4aXRfcmVhc29uID0gcmVhc29uIHwgVk1YX0VYSVRfUkVBU09OU19GQUlMRURfVk1FTlRSWTsKKwl2bWNzMTItPmV4aXRfcXVhbGlmaWNhdGlvbiA9IHF1YWxpZmljYXRpb247CisJbmVzdGVkX3ZteF9zdWNjZWVkKHZjcHUpOwogfQogCiBzdGF0aWMgaW50IHZteF9jaGVja19pbnRlcmNlcHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LApAQCAtNDY2OSwxNiArNzExOSwxMyBAQAogCXZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwgZmFsc2UpOwogCiAJaWYgKGVuYWJsZV9lcHQpIHsKLQkJYnlwYXNzX2d1ZXN0X3BmID0gMDsKIAkJa3ZtX21tdV9zZXRfbWFza19wdGVzKDB1bGwsIDB1bGwsIDB1bGwsIDB1bGwsCiAJCQkJVk1YX0VQVF9FWEVDVVRBQkxFX01BU0spOworCQllcHRfc2V0X21taW9fc3B0ZV9tYXNrKCk7CiAJCWt2bV9lbmFibGVfdGRwKCk7CiAJfSBlbHNlCiAJCWt2bV9kaXNhYmxlX3RkcCgpOwogCi0JaWYgKGJ5cGFzc19ndWVzdF9wZikKLQkJa3ZtX21tdV9zZXRfbm9ucHJlc2VudF9wdGVzKH4weGZmZXVsbCwgMHVsbCk7Ci0KIAlyZXR1cm4gMDsKIAogb3V0MzoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS94ODYuYyBiL2FyY2gveDg2L2t2bS94ODYuYwppbmRleCA3N2M5ZDg2Li44NGEyOGVhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0veDg2LmMKKysrIGIvYXJjaC94ODYva3ZtL3g4Ni5jCkBAIC0zNDcsNiArMzQ3LDcgQEAKIAl2Y3B1LT5hcmNoLmNyMiA9IGZhdWx0LT5hZGRyZXNzOwogCWt2bV9xdWV1ZV9leGNlcHRpb25fZSh2Y3B1LCBQRl9WRUNUT1IsIGZhdWx0LT5lcnJvcl9jb2RlKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV9pbmplY3RfcGFnZV9mYXVsdCk7CiAKIHZvaWQga3ZtX3Byb3BhZ2F0ZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpmYXVsdCkKIHsKQEAgLTU3OSw2ICs1ODAsMjIgQEAKIAlyZXR1cm4gYmVzdCAmJiAoYmVzdC0+ZWN4ICYgYml0KFg4Nl9GRUFUVVJFX1hTQVZFKSk7CiB9CiAKK3N0YXRpYyBib29sIGd1ZXN0X2NwdWlkX2hhc19zbWVwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiAqYmVzdDsKKworCWJlc3QgPSBrdm1fZmluZF9jcHVpZF9lbnRyeSh2Y3B1LCA3LCAwKTsKKwlyZXR1cm4gYmVzdCAmJiAoYmVzdC0+ZWJ4ICYgYml0KFg4Nl9GRUFUVVJFX1NNRVApKTsKK30KKworc3RhdGljIGJvb2wgZ3Vlc3RfY3B1aWRfaGFzX2ZzZ3NiYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiAqYmVzdDsKKworCWJlc3QgPSBrdm1fZmluZF9jcHVpZF9lbnRyeSh2Y3B1LCA3LCAwKTsKKwlyZXR1cm4gYmVzdCAmJiAoYmVzdC0+ZWJ4ICYgYml0KFg4Nl9GRUFUVVJFX0ZTR1NCQVNFKSk7Cit9CisKIHN0YXRpYyB2b2lkIHVwZGF0ZV9jcHVpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgKmJlc3Q7CkBAIC01OTgsMTQgKzYxNSwyMCBAQAogaW50IGt2bV9zZXRfY3I0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjQpCiB7CiAJdW5zaWduZWQgbG9uZyBvbGRfY3I0ID0ga3ZtX3JlYWRfY3I0KHZjcHUpOwotCXVuc2lnbmVkIGxvbmcgcGRwdHJfYml0cyA9IFg4Nl9DUjRfUEdFIHwgWDg2X0NSNF9QU0UgfCBYODZfQ1I0X1BBRTsKLQorCXVuc2lnbmVkIGxvbmcgcGRwdHJfYml0cyA9IFg4Nl9DUjRfUEdFIHwgWDg2X0NSNF9QU0UgfAorCQkJCSAgIFg4Nl9DUjRfUEFFIHwgWDg2X0NSNF9TTUVQOwogCWlmIChjcjQgJiBDUjRfUkVTRVJWRURfQklUUykKIAkJcmV0dXJuIDE7CiAKIAlpZiAoIWd1ZXN0X2NwdWlkX2hhc194c2F2ZSh2Y3B1KSAmJiAoY3I0ICYgWDg2X0NSNF9PU1hTQVZFKSkKIAkJcmV0dXJuIDE7CiAKKwlpZiAoIWd1ZXN0X2NwdWlkX2hhc19zbWVwKHZjcHUpICYmIChjcjQgJiBYODZfQ1I0X1NNRVApKQorCQlyZXR1cm4gMTsKKworCWlmICghZ3Vlc3RfY3B1aWRfaGFzX2ZzZ3NiYXNlKHZjcHUpICYmIChjcjQgJiBYODZfQ1I0X1JEV1JHU0ZTKSkKKwkJcmV0dXJuIDE7CisKIAlpZiAoaXNfbG9uZ19tb2RlKHZjcHUpKSB7CiAJCWlmICghKGNyNCAmIFg4Nl9DUjRfUEFFKSkKIAkJCXJldHVybiAxOwpAQCAtNjE1LDExICs2MzgsOSBAQAogCQkJCSAgIGt2bV9yZWFkX2NyMyh2Y3B1KSkpCiAJCXJldHVybiAxOwogCi0JaWYgKGNyNCAmIFg4Nl9DUjRfVk1YRSkKKwlpZiAoa3ZtX3g4Nl9vcHMtPnNldF9jcjQodmNwdSwgY3I0KSkKIAkJcmV0dXJuIDE7CiAKLQlrdm1feDg2X29wcy0+c2V0X2NyNCh2Y3B1LCBjcjQpOwotCiAJaWYgKChjcjQgXiBvbGRfY3I0KSAmIHBkcHRyX2JpdHMpCiAJCWt2bV9tbXVfcmVzZXRfY29udGV4dCh2Y3B1KTsKIApAQCAtNzg3LDEyICs4MDgsMTIgQEAKICAqIGt2bS1zcGVjaWZpYy4gVGhvc2UgYXJlIHB1dCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LgogICovCiAKLSNkZWZpbmUgS1ZNX1NBVkVfTVNSU19CRUdJTgk4CisjZGVmaW5lIEtWTV9TQVZFX01TUlNfQkVHSU4JOQogc3RhdGljIHUzMiBtc3JzX3RvX3NhdmVbXSA9IHsKIAlNU1JfS1ZNX1NZU1RFTV9USU1FLCBNU1JfS1ZNX1dBTExfQ0xPQ0ssCiAJTVNSX0tWTV9TWVNURU1fVElNRV9ORVcsIE1TUl9LVk1fV0FMTF9DTE9DS19ORVcsCiAJSFZfWDY0X01TUl9HVUVTVF9PU19JRCwgSFZfWDY0X01TUl9IWVBFUkNBTEwsCi0JSFZfWDY0X01TUl9BUElDX0FTU0lTVF9QQUdFLCBNU1JfS1ZNX0FTWU5DX1BGX0VOLAorCUhWX1g2NF9NU1JfQVBJQ19BU1NJU1RfUEFHRSwgTVNSX0tWTV9BU1lOQ19QRl9FTiwgTVNSX0tWTV9TVEVBTF9USU1FLAogCU1TUl9JQTMyX1NZU0VOVEVSX0NTLCBNU1JfSUEzMl9TWVNFTlRFUl9FU1AsIE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwKIAlNU1JfU1RBUiwKICNpZmRlZiBDT05GSUdfWDg2XzY0CkBAIC0xMzg4LDcgKzE0MDksNyBAQAogCQkJcmV0dXJuIDE7CiAJCWt2bV94ODZfb3BzLT5wYXRjaF9oeXBlcmNhbGwodmNwdSwgaW5zdHJ1Y3Rpb25zKTsKIAkJKCh1bnNpZ25lZCBjaGFyICopaW5zdHJ1Y3Rpb25zKVszXSA9IDB4YzM7IC8qIHJldCAqLwotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFkZHIsIGluc3RydWN0aW9ucywgNCkpCisJCWlmIChfX2NvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhZGRyLCBpbnN0cnVjdGlvbnMsIDQpKQogCQkJcmV0dXJuIDE7CiAJCWt2bS0+YXJjaC5odl9oeXBlcmNhbGwgPSBkYXRhOwogCQlicmVhazsKQEAgLTE0MTUsNyArMTQzNiw3IEBACiAJCQkJICBIVl9YNjRfTVNSX0FQSUNfQVNTSVNUX1BBR0VfQUREUkVTU19TSElGVCk7CiAJCWlmIChrdm1faXNfZXJyb3JfaHZhKGFkZHIpKQogCQkJcmV0dXJuIDE7Ci0JCWlmIChjbGVhcl91c2VyKCh2b2lkIF9fdXNlciAqKWFkZHIsIFBBR0VfU0laRSkpCisJCWlmIChfX2NsZWFyX3VzZXIoKHZvaWQgX191c2VyICopYWRkciwgUEFHRV9TSVpFKSkKIAkJCXJldHVybiAxOwogCQl2Y3B1LT5hcmNoLmh2X3ZhcGljID0gZGF0YTsKIAkJYnJlYWs7CkBAIC0xNDY3LDYgKzE0ODgsMzUgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGFjY3VtdWxhdGVfc3RlYWxfdGltZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdTY0IGRlbHRhOworCisJaWYgKCEodmNwdS0+YXJjaC5zdC5tc3JfdmFsICYgS1ZNX01TUl9FTkFCTEVEKSkKKwkJcmV0dXJuOworCisJZGVsdGEgPSBjdXJyZW50LT5zY2hlZF9pbmZvLnJ1bl9kZWxheSAtIHZjcHUtPmFyY2guc3QubGFzdF9zdGVhbDsKKwl2Y3B1LT5hcmNoLnN0Lmxhc3Rfc3RlYWwgPSBjdXJyZW50LT5zY2hlZF9pbmZvLnJ1bl9kZWxheTsKKwl2Y3B1LT5hcmNoLnN0LmFjY3VtX3N0ZWFsID0gZGVsdGE7Cit9CisKK3N0YXRpYyB2b2lkIHJlY29yZF9zdGVhbF90aW1lKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpZiAoISh2Y3B1LT5hcmNoLnN0Lm1zcl92YWwgJiBLVk1fTVNSX0VOQUJMRUQpKQorCQlyZXR1cm47CisKKwlpZiAodW5saWtlbHkoa3ZtX3JlYWRfZ3Vlc3RfY2FjaGVkKHZjcHUtPmt2bSwgJnZjcHUtPmFyY2guc3Quc3RpbWUsCisJCSZ2Y3B1LT5hcmNoLnN0LnN0ZWFsLCBzaXplb2Yoc3RydWN0IGt2bV9zdGVhbF90aW1lKSkpKQorCQlyZXR1cm47CisKKwl2Y3B1LT5hcmNoLnN0LnN0ZWFsLnN0ZWFsICs9IHZjcHUtPmFyY2guc3QuYWNjdW1fc3RlYWw7CisJdmNwdS0+YXJjaC5zdC5zdGVhbC52ZXJzaW9uICs9IDI7CisJdmNwdS0+YXJjaC5zdC5hY2N1bV9zdGVhbCA9IDA7CisKKwlrdm1fd3JpdGVfZ3Vlc3RfY2FjaGVkKHZjcHUtPmt2bSwgJnZjcHUtPmFyY2guc3Quc3RpbWUsCisJCSZ2Y3B1LT5hcmNoLnN0LnN0ZWFsLCBzaXplb2Yoc3RydWN0IGt2bV9zdGVhbF90aW1lKSk7Cit9CisKIGludCBrdm1fc2V0X21zcl9jb21tb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgbXNyLCB1NjQgZGF0YSkKIHsKIAlzd2l0Y2ggKG1zcikgewpAQCAtMTU0OSw2ICsxNTk5LDMzIEBACiAJCWlmIChrdm1fcHZfZW5hYmxlX2FzeW5jX3BmKHZjcHUsIGRhdGEpKQogCQkJcmV0dXJuIDE7CiAJCWJyZWFrOworCWNhc2UgTVNSX0tWTV9TVEVBTF9USU1FOgorCisJCWlmICh1bmxpa2VseSghc2NoZWRfaW5mb19vbigpKSkKKwkJCXJldHVybiAxOworCisJCWlmIChkYXRhICYgS1ZNX1NURUFMX1JFU0VSVkVEX01BU0spCisJCQlyZXR1cm4gMTsKKworCQlpZiAoa3ZtX2dmbl90b19odmFfY2FjaGVfaW5pdCh2Y3B1LT5rdm0sICZ2Y3B1LT5hcmNoLnN0LnN0aW1lLAorCQkJCQkJCWRhdGEgJiBLVk1fU1RFQUxfVkFMSURfQklUUykpCisJCQlyZXR1cm4gMTsKKworCQl2Y3B1LT5hcmNoLnN0Lm1zcl92YWwgPSBkYXRhOworCisJCWlmICghKGRhdGEgJiBLVk1fTVNSX0VOQUJMRUQpKQorCQkJYnJlYWs7CisKKwkJdmNwdS0+YXJjaC5zdC5sYXN0X3N0ZWFsID0gY3VycmVudC0+c2NoZWRfaW5mby5ydW5fZGVsYXk7CisKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCWFjY3VtdWxhdGVfc3RlYWxfdGltZSh2Y3B1KTsKKwkJcHJlZW1wdF9lbmFibGUoKTsKKworCQlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfU1RFQUxfVVBEQVRFLCB2Y3B1KTsKKworCQlicmVhazsKKwogCWNhc2UgTVNSX0lBMzJfTUNHX0NUTDoKIAljYXNlIE1TUl9JQTMyX01DR19TVEFUVVM6CiAJY2FzZSBNU1JfSUEzMl9NQzBfQ1RMIC4uLiBNU1JfSUEzMl9NQzBfQ1RMICsgNCAqIEtWTV9NQVhfTUNFX0JBTktTIC0gMToKQEAgLTE4MzQsNiArMTkxMSw5IEBACiAJY2FzZSBNU1JfS1ZNX0FTWU5DX1BGX0VOOgogCQlkYXRhID0gdmNwdS0+YXJjaC5hcGYubXNyX3ZhbDsKIAkJYnJlYWs7CisJY2FzZSBNU1JfS1ZNX1NURUFMX1RJTUU6CisJCWRhdGEgPSB2Y3B1LT5hcmNoLnN0Lm1zcl92YWw7CisJCWJyZWFrOwogCWNhc2UgTVNSX0lBMzJfUDVfTUNfQUREUjoKIAljYXNlIE1TUl9JQTMyX1A1X01DX1RZUEU6CiAJY2FzZSBNU1JfSUEzMl9NQ0dfQ0FQOgpAQCAtMjE0NSw2ICsyMjI1LDkgQEAKIAkJCWt2bV9taWdyYXRlX3RpbWVycyh2Y3B1KTsKIAkJdmNwdS0+Y3B1ID0gY3B1OwogCX0KKworCWFjY3VtdWxhdGVfc3RlYWxfdGltZSh2Y3B1KTsKKwlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfU1RFQUxfVVBEQVRFLCB2Y3B1KTsKIH0KIAogdm9pZCBrdm1fYXJjaF92Y3B1X3B1dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC0yMjgzLDYgKzIzNjYsMTMgQEAKIAllbnRyeS0+ZmxhZ3MgPSAwOwogfQogCitzdGF0aWMgYm9vbCBzdXBwb3J0ZWRfeGNyMF9iaXQodW5zaWduZWQgYml0KQoreworCXU2NCBtYXNrID0gKCh1NjQpMSA8PCBiaXQpOworCisJcmV0dXJuIG1hc2sgJiAoWFNUQVRFX0ZQIHwgWFNUQVRFX1NTRSB8IFhTVEFURV9ZTU0pICYgaG9zdF94Y3IwOworfQorCiAjZGVmaW5lIEYoeCkgYml0KFg4Nl9GRUFUVVJFXyMjeCkKIAogc3RhdGljIHZvaWQgZG9fY3B1aWRfZW50KHN0cnVjdCBrdm1fY3B1aWRfZW50cnkyICplbnRyeSwgdTMyIGZ1bmN0aW9uLApAQCAtMjMyOCw3ICsyNDE4LDcgQEAKIAkJMCAvKiBSZXNlcnZlZCwgRENBICovIHwgRihYTU00XzEpIHwKIAkJRihYTU00XzIpIHwgRihYMkFQSUMpIHwgRihNT1ZCRSkgfCBGKFBPUENOVCkgfAogCQkwIC8qIFJlc2VydmVkKi8gfCBGKEFFUykgfCBGKFhTQVZFKSB8IDAgLyogT1NYU0FWRSAqLyB8IEYoQVZYKSB8Ci0JCUYoRjE2Qyk7CisJCUYoRjE2QykgfCBGKFJEUkFORCk7CiAJLyogY3B1aWQgMHg4MDAwMDAwMS5lY3ggKi8KIAljb25zdCB1MzIga3ZtX3N1cHBvcnRlZF93b3JkNl94ODZfZmVhdHVyZXMgPQogCQlGKExBSEZfTE0pIHwgRihDTVBfTEVHQUNZKSB8IDAgLypTVk0qLyB8IDAgLyogRXh0QXBpY1NwYWNlICovIHwKQEAgLTIzNDIsNiArMjQzMiwxMCBAQAogCQlGKEFDRTIpIHwgRihBQ0UyX0VOKSB8IEYoUEhFKSB8IEYoUEhFX0VOKSB8CiAJCUYoUE1NKSB8IEYoUE1NX0VOKTsKIAorCS8qIGNwdWlkIDcuMC5lYnggKi8KKwljb25zdCB1MzIga3ZtX3N1cHBvcnRlZF93b3JkOV94ODZfZmVhdHVyZXMgPQorCQlGKFNNRVApIHwgRihGU0dTQkFTRSkgfCBGKEVSTVMpOworCiAJLyogYWxsIGNhbGxzIHRvIGNwdWlkX2NvdW50KCkgc2hvdWxkIGJlIG1hZGUgb24gdGhlIHNhbWUgY3B1ICovCiAJZ2V0X2NwdSgpOwogCWRvX2NwdWlkXzFfZW50KGVudHJ5LCBmdW5jdGlvbiwgaW5kZXgpOwpAQCAtMjM3Niw3ICsyNDcwLDcgQEAKIAkJfQogCQlicmVhazsKIAl9Ci0JLyogZnVuY3Rpb24gNCBhbmQgMHhiIGhhdmUgYWRkaXRpb25hbCBpbmRleC4gKi8KKwkvKiBmdW5jdGlvbiA0IGhhcyBhZGRpdGlvbmFsIGluZGV4LiAqLwogCWNhc2UgNDogewogCQlpbnQgaSwgY2FjaGVfdHlwZTsKIApAQCAtMjM5Myw2ICsyNDg3LDIyIEBACiAJCX0KIAkJYnJlYWs7CiAJfQorCWNhc2UgNzogeworCQllbnRyeS0+ZmxhZ3MgfD0gS1ZNX0NQVUlEX0ZMQUdfU0lHTklGQ0FOVF9JTkRFWDsKKwkJLyogTWFzayBlYnggYWdhaW5zdCBob3N0IGNhcGJhYmlsaXR5IHdvcmQgOSAqLworCQlpZiAoaW5kZXggPT0gMCkgeworCQkJZW50cnktPmVieCAmPSBrdm1fc3VwcG9ydGVkX3dvcmQ5X3g4Nl9mZWF0dXJlczsKKwkJCWNwdWlkX21hc2soJmVudHJ5LT5lYngsIDkpOworCQl9IGVsc2UKKwkJCWVudHJ5LT5lYnggPSAwOworCQllbnRyeS0+ZWF4ID0gMDsKKwkJZW50cnktPmVjeCA9IDA7CisJCWVudHJ5LT5lZHggPSAwOworCQlicmVhazsKKwl9CisJY2FzZSA5OgorCQlicmVhazsKKwkvKiBmdW5jdGlvbiAweGIgaGFzIGFkZGl0aW9uYWwgaW5kZXguICovCiAJY2FzZSAweGI6IHsKIAkJaW50IGksIGxldmVsX3R5cGU7CiAKQEAgLTI0MTAsMTYgKzI1MjAsMTcgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgMHhkOiB7Ci0JCWludCBpOworCQlpbnQgaWR4LCBpOwogCiAJCWVudHJ5LT5mbGFncyB8PSBLVk1fQ1BVSURfRkxBR19TSUdOSUZDQU5UX0lOREVYOwotCQlmb3IgKGkgPSAxOyAqbmVudCA8IG1heG5lbnQgJiYgaSA8IDY0OyArK2kpIHsKLQkJCWlmIChlbnRyeVtpXS5lYXggPT0gMCkKKwkJZm9yIChpZHggPSAxLCBpID0gMTsgKm5lbnQgPCBtYXhuZW50ICYmIGlkeCA8IDY0OyArK2lkeCkgeworCQkJZG9fY3B1aWRfMV9lbnQoJmVudHJ5W2ldLCBmdW5jdGlvbiwgaWR4KTsKKwkJCWlmIChlbnRyeVtpXS5lYXggPT0gMCB8fCAhc3VwcG9ydGVkX3hjcjBfYml0KGlkeCkpCiAJCQkJY29udGludWU7Ci0JCQlkb19jcHVpZF8xX2VudCgmZW50cnlbaV0sIGZ1bmN0aW9uLCBpKTsKIAkJCWVudHJ5W2ldLmZsYWdzIHw9CiAJCQkgICAgICAgS1ZNX0NQVUlEX0ZMQUdfU0lHTklGQ0FOVF9JTkRFWDsKIAkJCSsrKm5lbnQ7CisJCQkrK2k7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtMjQzOCw2ICsyNTQ5LDEwIEBACiAJCQkgICAgICgxIDw8IEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFMikgfAogCQkJICAgICAoMSA8PCBLVk1fRkVBVFVSRV9BU1lOQ19QRikgfAogCQkJICAgICAoMSA8PCBLVk1fRkVBVFVSRV9DTE9DS1NPVVJDRV9TVEFCTEVfQklUKTsKKworCQlpZiAoc2NoZWRfaW5mb19vbigpKQorCQkJZW50cnktPmVheCB8PSAoMSA8PCBLVk1fRkVBVFVSRV9TVEVBTF9USU1FKTsKKwogCQllbnRyeS0+ZWJ4ID0gMDsKIAkJZW50cnktPmVjeCA9IDA7CiAJCWVudHJ5LT5lZHggPSAwOwpAQCAtMjQ1MSw2ICsyNTY2LDI0IEBACiAJCWVudHJ5LT5lY3ggJj0ga3ZtX3N1cHBvcnRlZF93b3JkNl94ODZfZmVhdHVyZXM7CiAJCWNwdWlkX21hc2soJmVudHJ5LT5lY3gsIDYpOwogCQlicmVhazsKKwljYXNlIDB4ODAwMDAwMDg6IHsKKwkJdW5zaWduZWQgZ19waHlzX2FzID0gKGVudHJ5LT5lYXggPj4gMTYpICYgMHhmZjsKKwkJdW5zaWduZWQgdmlydF9hcyA9IG1heCgoZW50cnktPmVheCA+PiA4KSAmIDB4ZmYsIDQ4VSk7CisJCXVuc2lnbmVkIHBoeXNfYXMgPSBlbnRyeS0+ZWF4ICYgMHhmZjsKKworCQlpZiAoIWdfcGh5c19hcykKKwkJCWdfcGh5c19hcyA9IHBoeXNfYXM7CisJCWVudHJ5LT5lYXggPSBnX3BoeXNfYXMgfCAodmlydF9hcyA8PCA4KTsKKwkJZW50cnktPmVieCA9IGVudHJ5LT5lZHggPSAwOworCQlicmVhazsKKwl9CisJY2FzZSAweDgwMDAwMDE5OgorCQllbnRyeS0+ZWN4ID0gZW50cnktPmVkeCA9IDA7CisJCWJyZWFrOworCWNhc2UgMHg4MDAwMDAxYToKKwkJYnJlYWs7CisJY2FzZSAweDgwMDAwMDFkOgorCQlicmVhazsKIAkvKkFkZCBzdXBwb3J0IGZvciBDZW50YXVyJ3MgQ1BVSUQgaW5zdHJ1Y3Rpb24qLwogCWNhc2UgMHhDMDAwMDAwMDoKIAkJLypKdXN0IHN1cHBvcnQgdXAgdG8gMHhDMDAwMDAwNCBub3cqLwpAQCAtMjQ2MCwxMCArMjU5MywxNiBAQAogCQllbnRyeS0+ZWR4ICY9IGt2bV9zdXBwb3J0ZWRfd29yZDVfeDg2X2ZlYXR1cmVzOwogCQljcHVpZF9tYXNrKCZlbnRyeS0+ZWR4LCA1KTsKIAkJYnJlYWs7CisJY2FzZSAzOiAvKiBQcm9jZXNzb3Igc2VyaWFsIG51bWJlciAqLworCWNhc2UgNTogLyogTU9OSVRPUi9NV0FJVCAqLworCWNhc2UgNjogLyogVGhlcm1hbCBtYW5hZ2VtZW50ICovCisJY2FzZSAweEE6IC8qIEFyY2hpdGVjdHVyYWwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyAqLworCWNhc2UgMHg4MDAwMDAwNzogLyogQWR2YW5jZWQgcG93ZXIgbWFuYWdlbWVudCAqLwogCWNhc2UgMHhDMDAwMDAwMjoKIAljYXNlIDB4QzAwMDAwMDM6CiAJY2FzZSAweEMwMDAwMDA0OgotCQkvKk5vdyBub3RoaW5nIHRvIGRvLCByZXNlcnZlZCBmb3IgdGhlIGZ1dHVyZSovCisJZGVmYXVsdDoKKwkJZW50cnktPmVheCA9IGVudHJ5LT5lYnggPSBlbnRyeS0+ZWN4ID0gZW50cnktPmVkeCA9IDA7CiAJCWJyZWFrOwogCX0KIApAQCAtMzgxNyw3ICszOTU2LDcgQEAKIAkJCQkJICBleGNlcHRpb24pOwogfQogCi1zdGF0aWMgaW50IGt2bV9yZWFkX2d1ZXN0X3ZpcnQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCitpbnQga3ZtX3JlYWRfZ3Vlc3RfdmlydChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKIAkJCSAgICAgICBndmFfdCBhZGRyLCB2b2lkICp2YWwsIHVuc2lnbmVkIGludCBieXRlcywKIAkJCSAgICAgICBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZXhjZXB0aW9uKQogewpAQCAtMzgyNyw2ICszOTY2LDcgQEAKIAlyZXR1cm4ga3ZtX3JlYWRfZ3Vlc3RfdmlydF9oZWxwZXIoYWRkciwgdmFsLCBieXRlcywgdmNwdSwgYWNjZXNzLAogCQkJCQkgIGV4Y2VwdGlvbik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChrdm1fcmVhZF9ndWVzdF92aXJ0KTsKIAogc3RhdGljIGludCBrdm1fcmVhZF9ndWVzdF92aXJ0X3N5c3RlbShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKIAkJCQkgICAgICBndmFfdCBhZGRyLCB2b2lkICp2YWwsIHVuc2lnbmVkIGludCBieXRlcywKQEAgLTM4MzYsNyArMzk3Niw3IEBACiAJcmV0dXJuIGt2bV9yZWFkX2d1ZXN0X3ZpcnRfaGVscGVyKGFkZHIsIHZhbCwgYnl0ZXMsIHZjcHUsIDAsIGV4Y2VwdGlvbik7CiB9CiAKLXN0YXRpYyBpbnQga3ZtX3dyaXRlX2d1ZXN0X3ZpcnRfc3lzdGVtKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAoraW50IGt2bV93cml0ZV9ndWVzdF92aXJ0X3N5c3RlbShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKIAkJCQkgICAgICAgZ3ZhX3QgYWRkciwgdm9pZCAqdmFsLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCiAJCQkJICAgICAgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCkBAIC0zODY4LDYgKzQwMDgsNDIgQEAKIG91dDoKIAlyZXR1cm4gcjsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV93cml0ZV9ndWVzdF92aXJ0X3N5c3RlbSk7CisKK3N0YXRpYyBpbnQgdmNwdV9tbWlvX2d2YV90b19ncGEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGd2YSwKKwkJCQlncGFfdCAqZ3BhLCBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZXhjZXB0aW9uLAorCQkJCWJvb2wgd3JpdGUpCit7CisJdTMyIGFjY2VzcyA9IChrdm1feDg2X29wcy0+Z2V0X2NwbCh2Y3B1KSA9PSAzKSA/IFBGRVJSX1VTRVJfTUFTSyA6IDA7CisKKwlpZiAodmNwdV9tYXRjaF9tbWlvX2d2YSh2Y3B1LCBndmEpICYmCisJCSAgY2hlY2tfd3JpdGVfdXNlcl9hY2Nlc3ModmNwdSwgd3JpdGUsIGFjY2VzcywKKwkJICB2Y3B1LT5hcmNoLmFjY2VzcykpIHsKKwkJKmdwYSA9IHZjcHUtPmFyY2gubW1pb19nZm4gPDwgUEFHRV9TSElGVCB8CisJCQkJCShndmEgJiAoUEFHRV9TSVpFIC0gMSkpOworCQl0cmFjZV92Y3B1X21hdGNoX21taW8oZ3ZhLCAqZ3BhLCB3cml0ZSwgZmFsc2UpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAod3JpdGUpCisJCWFjY2VzcyB8PSBQRkVSUl9XUklURV9NQVNLOworCisJKmdwYSA9IHZjcHUtPmFyY2gud2Fsa19tbXUtPmd2YV90b19ncGEodmNwdSwgZ3ZhLCBhY2Nlc3MsIGV4Y2VwdGlvbik7CisKKwlpZiAoKmdwYSA9PSBVTk1BUFBFRF9HVkEpCisJCXJldHVybiAtMTsKKworCS8qIEZvciBBUElDIGFjY2VzcyB2bWV4aXQgKi8KKwlpZiAoKCpncGEgJiBQQUdFX01BU0spID09IEFQSUNfREVGQVVMVF9QSFlTX0JBU0UpCisJCXJldHVybiAxOworCisJaWYgKHZjcHVfbWF0Y2hfbW1pb19ncGEodmNwdSwgKmdwYSkpIHsKKwkJdHJhY2VfdmNwdV9tYXRjaF9tbWlvKGd2YSwgKmdwYSwgd3JpdGUsIHRydWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIGludCBlbXVsYXRvcl9yZWFkX2VtdWxhdGVkKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAogCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLApAQCAtMzg3Niw4ICs0MDUyLDggQEAKIAkJCQkgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCiB7CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gZW11bF90b192Y3B1KGN0eHQpOwotCWdwYV90ICAgICAgICAgICAgICAgICBncGE7Ci0JaW50IGhhbmRsZWQ7CisJZ3BhX3QgZ3BhOworCWludCBoYW5kbGVkLCByZXQ7CiAKIAlpZiAodmNwdS0+bW1pb19yZWFkX2NvbXBsZXRlZCkgewogCQltZW1jcHkodmFsLCB2Y3B1LT5tbWlvX2RhdGEsIGJ5dGVzKTsKQEAgLTM4ODcsMTMgKzQwNjMsMTIgQEAKIAkJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiAJfQogCi0JZ3BhID0ga3ZtX21tdV9ndmFfdG9fZ3BhX3JlYWQodmNwdSwgYWRkciwgZXhjZXB0aW9uKTsKKwlyZXQgPSB2Y3B1X21taW9fZ3ZhX3RvX2dwYSh2Y3B1LCBhZGRyLCAmZ3BhLCBleGNlcHRpb24sIGZhbHNlKTsKIAotCWlmIChncGEgPT0gVU5NQVBQRURfR1ZBKQorCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CiAKLQkvKiBGb3IgQVBJQyBhY2Nlc3Mgdm1leGl0ICovCi0JaWYgKChncGEgJiBQQUdFX01BU0spID09IEFQSUNfREVGQVVMVF9QSFlTX0JBU0UpCisJaWYgKHJldCkKIAkJZ290byBtbWlvOwogCiAJaWYgKGt2bV9yZWFkX2d1ZXN0X3ZpcnQoY3R4dCwgYWRkciwgdmFsLCBieXRlcywgZXhjZXB0aW9uKQpAQCAtMzk0NCwxNiArNDExOSwxNiBAQAogCQkJCQkgICBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZXhjZXB0aW9uLAogCQkJCQkgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JZ3BhX3QgICAgICAgICAgICAgICAgIGdwYTsKLQlpbnQgaGFuZGxlZDsKKwlncGFfdCBncGE7CisJaW50IGhhbmRsZWQsIHJldDsKIAotCWdwYSA9IGt2bV9tbXVfZ3ZhX3RvX2dwYV93cml0ZSh2Y3B1LCBhZGRyLCBleGNlcHRpb24pOworCXJldCA9IHZjcHVfbW1pb19ndmFfdG9fZ3BhKHZjcHUsIGFkZHIsICZncGEsIGV4Y2VwdGlvbiwgdHJ1ZSk7CiAKLQlpZiAoZ3BhID09IFVOTUFQUEVEX0dWQSkKKwlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCiAJLyogRm9yIEFQSUMgYWNjZXNzIHZtZXhpdCAqLwotCWlmICgoZ3BhICYgUEFHRV9NQVNLKSA9PSBBUElDX0RFRkFVTFRfUEhZU19CQVNFKQorCWlmIChyZXQpCiAJCWdvdG8gbW1pbzsKIAogCWlmIChlbXVsYXRvcl93cml0ZV9waHlzKHZjcHUsIGdwYSwgdmFsLCBieXRlcykpCkBAIC00NDczLDkgKzQ2NDgsMjQgQEAKIAkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbih2Y3B1LCBjdHh0LT5leGNlcHRpb24udmVjdG9yKTsKIH0KIAorc3RhdGljIHZvaWQgaW5pdF9kZWNvZGVfY2FjaGUoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpyZWdzKQoreworCW1lbXNldCgmY3R4dC0+dHdvYnl0ZSwgMCwKKwkgICAgICAgKHZvaWQgKikmY3R4dC0+cmVncyAtICh2b2lkICopJmN0eHQtPnR3b2J5dGUpOworCW1lbWNweShjdHh0LT5yZWdzLCByZWdzLCBzaXplb2YoY3R4dC0+cmVncykpOworCisJY3R4dC0+ZmV0Y2guc3RhcnQgPSAwOworCWN0eHQtPmZldGNoLmVuZCA9IDA7CisJY3R4dC0+aW9fcmVhZC5wb3MgPSAwOworCWN0eHQtPmlvX3JlYWQuZW5kID0gMDsKKwljdHh0LT5tZW1fcmVhZC5wb3MgPSAwOworCWN0eHQtPm1lbV9yZWFkLmVuZCA9IDA7Cit9CisKIHN0YXRpYyB2b2lkIGluaXRfZW11bGF0ZV9jdHh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJnZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmRlY29kZTsKKwlzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCA9ICZ2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dDsKIAlpbnQgY3NfZGIsIGNzX2w7CiAKIAkvKgpAQCAtNDQ4OCw0MCArNDY3OCwzOCBAQAogCiAJa3ZtX3g4Nl9vcHMtPmdldF9jc19kYl9sX2JpdHModmNwdSwgJmNzX2RiLCAmY3NfbCk7CiAKLQl2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5lZmxhZ3MgPSBrdm1fZ2V0X3JmbGFncyh2Y3B1KTsKLQl2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5laXAgPSBrdm1fcmlwX3JlYWQodmNwdSk7Ci0JdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQubW9kZSA9Ci0JCSghaXNfcHJvdG1vZGUodmNwdSkpID8gWDg2RU1VTF9NT0RFX1JFQUwgOgotCQkodmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZWZsYWdzICYgWDg2X0VGTEFHU19WTSkKLQkJPyBYODZFTVVMX01PREVfVk04NiA6IGNzX2wKLQkJPyBYODZFTVVMX01PREVfUFJPVDY0IDoJY3NfZGIKLQkJPyBYODZFTVVMX01PREVfUFJPVDMyIDogWDg2RU1VTF9NT0RFX1BST1QxNjsKLQl2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5ndWVzdF9tb2RlID0gaXNfZ3Vlc3RfbW9kZSh2Y3B1KTsKLQltZW1zZXQoYywgMCwgc2l6ZW9mKHN0cnVjdCBkZWNvZGVfY2FjaGUpKTsKLQltZW1jcHkoYy0+cmVncywgdmNwdS0+YXJjaC5yZWdzLCBzaXplb2YgYy0+cmVncyk7CisJY3R4dC0+ZWZsYWdzID0ga3ZtX2dldF9yZmxhZ3ModmNwdSk7CisJY3R4dC0+ZWlwID0ga3ZtX3JpcF9yZWFkKHZjcHUpOworCWN0eHQtPm1vZGUgPSAoIWlzX3Byb3Rtb2RlKHZjcHUpKQkJPyBYODZFTVVMX01PREVfUkVBTCA6CisJCSAgICAgKGN0eHQtPmVmbGFncyAmIFg4Nl9FRkxBR1NfVk0pCT8gWDg2RU1VTF9NT0RFX1ZNODYgOgorCQkgICAgIGNzX2wJCQkJPyBYODZFTVVMX01PREVfUFJPVDY0IDoKKwkJICAgICBjc19kYgkJCQk/IFg4NkVNVUxfTU9ERV9QUk9UMzIgOgorCQkJCQkJCSAgWDg2RU1VTF9NT0RFX1BST1QxNjsKKwljdHh0LT5ndWVzdF9tb2RlID0gaXNfZ3Vlc3RfbW9kZSh2Y3B1KTsKKworCWluaXRfZGVjb2RlX2NhY2hlKGN0eHQsIHZjcHUtPmFyY2gucmVncyk7CiAJdmNwdS0+YXJjaC5lbXVsYXRlX3JlZ3NfbmVlZF9zeW5jX2Zyb21fdmNwdSA9IGZhbHNlOwogfQogCiBpbnQga3ZtX2luamVjdF9yZWFsbW9kZV9pbnRlcnJ1cHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgaXJxLCBpbnQgaW5jX2VpcCkKIHsKLQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJnZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmRlY29kZTsKKwlzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCA9ICZ2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dDsKIAlpbnQgcmV0OwogCiAJaW5pdF9lbXVsYXRlX2N0eHQodmNwdSk7CiAKLQl2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5kZWNvZGUub3BfYnl0ZXMgPSAyOwotCXZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmRlY29kZS5hZF9ieXRlcyA9IDI7Ci0JdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZGVjb2RlLmVpcCA9IHZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmVpcCArCi0JCQkJCQkJCSBpbmNfZWlwOwotCXJldCA9IGVtdWxhdGVfaW50X3JlYWwoJnZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LCAmZW11bGF0ZV9vcHMsIGlycSk7CisJY3R4dC0+b3BfYnl0ZXMgPSAyOworCWN0eHQtPmFkX2J5dGVzID0gMjsKKwljdHh0LT5fZWlwID0gY3R4dC0+ZWlwICsgaW5jX2VpcDsKKwlyZXQgPSBlbXVsYXRlX2ludF9yZWFsKGN0eHQsIGlycSk7CiAKIAlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiBFTVVMQVRFX0ZBSUw7CiAKLQl2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5laXAgPSBjLT5laXA7Ci0JbWVtY3B5KHZjcHUtPmFyY2gucmVncywgYy0+cmVncywgc2l6ZW9mIGMtPnJlZ3MpOwotCWt2bV9yaXBfd3JpdGUodmNwdSwgdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZWlwKTsKLQlrdm1fc2V0X3JmbGFncyh2Y3B1LCB2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5lZmxhZ3MpOworCWN0eHQtPmVpcCA9IGN0eHQtPl9laXA7CisJbWVtY3B5KHZjcHUtPmFyY2gucmVncywgY3R4dC0+cmVncywgc2l6ZW9mIGN0eHQtPnJlZ3MpOworCWt2bV9yaXBfd3JpdGUodmNwdSwgY3R4dC0+ZWlwKTsKKwlrdm1fc2V0X3JmbGFncyh2Y3B1LCBjdHh0LT5lZmxhZ3MpOwogCiAJaWYgKGlycSA9PSBOTUlfVkVDVE9SKQogCQl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gZmFsc2U7CkBAIC00NTgyLDIxICs0NzcwLDIxIEBACiAJCQkgICAgaW50IGluc25fbGVuKQogewogCWludCByOwotCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZGVjb2RlOworCXN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0ID0gJnZjcHUtPmFyY2guZW11bGF0ZV9jdHh0OwogCWJvb2wgd3JpdGViYWNrID0gdHJ1ZTsKIAogCWt2bV9jbGVhcl9leGNlcHRpb25fcXVldWUodmNwdSk7CiAKIAlpZiAoIShlbXVsYXRpb25fdHlwZSAmIEVNVUxUWVBFX05PX0RFQ09ERSkpIHsKIAkJaW5pdF9lbXVsYXRlX2N0eHQodmNwdSk7Ci0JCXZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmludGVycnVwdGliaWxpdHkgPSAwOwotCQl2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5oYXZlX2V4Y2VwdGlvbiA9IGZhbHNlOwotCQl2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5wZXJtX29rID0gZmFsc2U7CisJCWN0eHQtPmludGVycnVwdGliaWxpdHkgPSAwOworCQljdHh0LT5oYXZlX2V4Y2VwdGlvbiA9IGZhbHNlOworCQljdHh0LT5wZXJtX29rID0gZmFsc2U7CiAKLQkJdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQub25seV92ZW5kb3Jfc3BlY2lmaWNfaW5zbgorCQljdHh0LT5vbmx5X3ZlbmRvcl9zcGVjaWZpY19pbnNuCiAJCQk9IGVtdWxhdGlvbl90eXBlICYgRU1VTFRZUEVfVFJBUF9VRDsKIAotCQlyID0geDg2X2RlY29kZV9pbnNuKCZ2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dCwgaW5zbiwgaW5zbl9sZW4pOworCQlyID0geDg2X2RlY29kZV9pbnNuKGN0eHQsIGluc24sIGluc25fbGVuKTsKIAogCQl0cmFjZV9rdm1fZW11bGF0ZV9pbnNuX3N0YXJ0KHZjcHUpOwogCQkrK3ZjcHUtPnN0YXQuaW5zbl9lbXVsYXRpb247CkBAIC00NjEyLDcgKzQ4MDAsNyBAQAogCX0KIAogCWlmIChlbXVsYXRpb25fdHlwZSAmIEVNVUxUWVBFX1NLSVApIHsKLQkJa3ZtX3JpcF93cml0ZSh2Y3B1LCB2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5kZWNvZGUuZWlwKTsKKwkJa3ZtX3JpcF93cml0ZSh2Y3B1LCBjdHh0LT5fZWlwKTsKIAkJcmV0dXJuIEVNVUxBVEVfRE9ORTsKIAl9CiAKQEAgLTQ2MjAsMTEgKzQ4MDgsMTEgQEAKIAkgICBjaGFuZ2VzIHJlZ2lzdGVycyB2YWx1ZXMgIGR1cmluZyBJTyBvcGVyYXRpb24gKi8KIAlpZiAodmNwdS0+YXJjaC5lbXVsYXRlX3JlZ3NfbmVlZF9zeW5jX2Zyb21fdmNwdSkgewogCQl2Y3B1LT5hcmNoLmVtdWxhdGVfcmVnc19uZWVkX3N5bmNfZnJvbV92Y3B1ID0gZmFsc2U7Ci0JCW1lbWNweShjLT5yZWdzLCB2Y3B1LT5hcmNoLnJlZ3MsIHNpemVvZiBjLT5yZWdzKTsKKwkJbWVtY3B5KGN0eHQtPnJlZ3MsIHZjcHUtPmFyY2gucmVncywgc2l6ZW9mIGN0eHQtPnJlZ3MpOwogCX0KIAogcmVzdGFydDoKLQlyID0geDg2X2VtdWxhdGVfaW5zbigmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQpOworCXIgPSB4ODZfZW11bGF0ZV9pbnNuKGN0eHQpOwogCiAJaWYgKHIgPT0gRU1VTEFUSU9OX0lOVEVSQ0VQVEVEKQogCQlyZXR1cm4gRU1VTEFURV9ET05FOwpAQCAtNDYzNiw3ICs0ODI0LDcgQEAKIAkJcmV0dXJuIGhhbmRsZV9lbXVsYXRpb25fZmFpbHVyZSh2Y3B1KTsKIAl9CiAKLQlpZiAodmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuaGF2ZV9leGNlcHRpb24pIHsKKwlpZiAoY3R4dC0+aGF2ZV9leGNlcHRpb24pIHsKIAkJaW5qZWN0X2VtdWxhdGVkX2V4Y2VwdGlvbih2Y3B1KTsKIAkJciA9IEVNVUxBVEVfRE9ORTsKIAl9IGVsc2UgaWYgKHZjcHUtPmFyY2gucGlvLmNvdW50KSB7CkBAIC00NjU1LDEzICs0ODQzLDEyIEBACiAJCXIgPSBFTVVMQVRFX0RPTkU7CiAKIAlpZiAod3JpdGViYWNrKSB7Ci0JCXRvZ2dsZV9pbnRlcnJ1cHRpYmlsaXR5KHZjcHUsCi0JCQkJdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuaW50ZXJydXB0aWJpbGl0eSk7Ci0JCWt2bV9zZXRfcmZsYWdzKHZjcHUsIHZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmVmbGFncyk7CisJCXRvZ2dsZV9pbnRlcnJ1cHRpYmlsaXR5KHZjcHUsIGN0eHQtPmludGVycnVwdGliaWxpdHkpOworCQlrdm1fc2V0X3JmbGFncyh2Y3B1LCBjdHh0LT5lZmxhZ3MpOwogCQlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfRVZFTlQsIHZjcHUpOwotCQltZW1jcHkodmNwdS0+YXJjaC5yZWdzLCBjLT5yZWdzLCBzaXplb2YgYy0+cmVncyk7CisJCW1lbWNweSh2Y3B1LT5hcmNoLnJlZ3MsIGN0eHQtPnJlZ3MsIHNpemVvZiBjdHh0LT5yZWdzKTsKIAkJdmNwdS0+YXJjaC5lbXVsYXRlX3JlZ3NfbmVlZF9zeW5jX3RvX3ZjcHUgPSBmYWxzZTsKLQkJa3ZtX3JpcF93cml0ZSh2Y3B1LCB2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5laXApOworCQlrdm1fcmlwX3dyaXRlKHZjcHUsIGN0eHQtPmVpcCk7CiAJfSBlbHNlCiAJCXZjcHUtPmFyY2guZW11bGF0ZV9yZWdzX25lZWRfc3luY190b192Y3B1ID0gdHJ1ZTsKIApAQCAtNDg3OCw2ICs1MDY1LDMwIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fYWZ0ZXJfaGFuZGxlX25taSk7CiAKK3N0YXRpYyB2b2lkIGt2bV9zZXRfbW1pb19zcHRlX21hc2sodm9pZCkKK3sKKwl1NjQgbWFzazsKKwlpbnQgbWF4cGh5YWRkciA9IGJvb3RfY3B1X2RhdGEueDg2X3BoeXNfYml0czsKKworCS8qCisJICogU2V0IHRoZSByZXNlcnZlZCBiaXRzIGFuZCB0aGUgcHJlc2VudCBiaXQgb2YgYW4gcGFnaW5nLXN0cnVjdHVyZQorCSAqIGVudHJ5IHRvIGdlbmVyYXRlIHBhZ2UgZmF1bHQgd2l0aCBQRkVSLlJTViA9IDEuCisJICovCisJbWFzayA9ICgoMXVsbCA8PCAoNjIgLSBtYXhwaHlhZGRyICsgMSkpIC0gMSkgPDwgbWF4cGh5YWRkcjsKKwltYXNrIHw9IDF1bGw7CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJLyoKKwkgKiBJZiByZXNlcnZlZCBiaXQgaXMgbm90IHN1cHBvcnRlZCwgY2xlYXIgdGhlIHByZXNlbnQgYml0IHRvIGRpc2FibGUKKwkgKiBtbWlvIHBhZ2UgZmF1bHQuCisJICovCisJaWYgKG1heHBoeWFkZHIgPT0gNTIpCisJCW1hc2sgJj0gfjF1bGw7CisjZW5kaWYKKworCWt2bV9tbXVfc2V0X21taW9fc3B0ZV9tYXNrKG1hc2spOworfQorCiBpbnQga3ZtX2FyY2hfaW5pdCh2b2lkICpvcGFxdWUpCiB7CiAJaW50IHI7CkBAIC00OTA0LDEwICs1MTE1LDEwIEBACiAJaWYgKHIpCiAJCWdvdG8gb3V0OwogCisJa3ZtX3NldF9tbWlvX3NwdGVfbWFzaygpOwogCWt2bV9pbml0X21zcl9saXN0KCk7CiAKIAlrdm1feDg2X29wcyA9IG9wczsKLQlrdm1fbW11X3NldF9ub25wcmVzZW50X3B0ZXMoMHVsbCwgMHVsbCk7CiAJa3ZtX21tdV9zZXRfbWFza19wdGVzKFBUX1VTRVJfTUFTSywgUFRfQUNDRVNTRURfTUFTSywKIAkJCVBUX0RJUlRZX01BU0ssIFBUNjRfTlhfTUFTSywgMCk7CiAKQEAgLTUwODIsOCArNTI5Myw3IEBACiAKIAlrdm1feDg2X29wcy0+cGF0Y2hfaHlwZXJjYWxsKHZjcHUsIGluc3RydWN0aW9uKTsKIAotCXJldHVybiBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZCgmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQsCi0JCQkJICAgICAgIHJpcCwgaW5zdHJ1Y3Rpb24sIDMsIE5VTEwpOworCXJldHVybiBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZChjdHh0LCByaXAsIGluc3RydWN0aW9uLCAzLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBtb3ZlX3RvX25leHRfc3RhdGVmdWxfY3B1aWRfZW50cnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgaSkKQEAgLTUzODQsNiArNTU5NCw5IEBACiAJCQlyID0gMTsKIAkJCWdvdG8gb3V0OwogCQl9CisJCWlmIChrdm1fY2hlY2tfcmVxdWVzdChLVk1fUkVRX1NURUFMX1VQREFURSwgdmNwdSkpCisJCQlyZWNvcmRfc3RlYWxfdGltZSh2Y3B1KTsKKwogCX0KIAogCXIgPSBrdm1fbW11X3JlbG9hZCh2Y3B1KTsKQEAgLTU2NzEsOCArNTg4NCw4IEBACiAJCSAqIHRoYXQgdXN1YWxseSwgYnV0IHNvbWUgYmFkIGRlc2lnbmVkIFBWIGRldmljZXMgKHZtd2FyZQogCQkgKiBiYWNrZG9vciBpbnRlcmZhY2UpIG5lZWQgdGhpcyB0byB3b3JrCiAJCSAqLwotCQlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJnZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmRlY29kZTsKLQkJbWVtY3B5KHZjcHUtPmFyY2gucmVncywgYy0+cmVncywgc2l6ZW9mIGMtPnJlZ3MpOworCQlzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCA9ICZ2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dDsKKwkJbWVtY3B5KHZjcHUtPmFyY2gucmVncywgY3R4dC0+cmVncywgc2l6ZW9mIGN0eHQtPnJlZ3MpOwogCQl2Y3B1LT5hcmNoLmVtdWxhdGVfcmVnc19uZWVkX3N5bmNfdG9fdmNwdSA9IGZhbHNlOwogCX0KIAlyZWdzLT5yYXggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkFYKTsKQEAgLTU4MDEsMjEgKzYwMTQsMjAgQEAKIGludCBrdm1fdGFza19zd2l0Y2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MTYgdHNzX3NlbGVjdG9yLCBpbnQgcmVhc29uLAogCQkgICAgYm9vbCBoYXNfZXJyb3JfY29kZSwgdTMyIGVycm9yX2NvZGUpCiB7Ci0Jc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZ2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5kZWNvZGU7CisJc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQgPSAmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQ7CiAJaW50IHJldDsKIAogCWluaXRfZW11bGF0ZV9jdHh0KHZjcHUpOwogCi0JcmV0ID0gZW11bGF0b3JfdGFza19zd2l0Y2goJnZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LAotCQkJCSAgIHRzc19zZWxlY3RvciwgcmVhc29uLCBoYXNfZXJyb3JfY29kZSwKLQkJCQkgICBlcnJvcl9jb2RlKTsKKwlyZXQgPSBlbXVsYXRvcl90YXNrX3N3aXRjaChjdHh0LCB0c3Nfc2VsZWN0b3IsIHJlYXNvbiwKKwkJCQkgICBoYXNfZXJyb3JfY29kZSwgZXJyb3JfY29kZSk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gRU1VTEFURV9GQUlMOwogCi0JbWVtY3B5KHZjcHUtPmFyY2gucmVncywgYy0+cmVncywgc2l6ZW9mIGMtPnJlZ3MpOwotCWt2bV9yaXBfd3JpdGUodmNwdSwgdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZWlwKTsKLQlrdm1fc2V0X3JmbGFncyh2Y3B1LCB2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5lZmxhZ3MpOworCW1lbWNweSh2Y3B1LT5hcmNoLnJlZ3MsIGN0eHQtPnJlZ3MsIHNpemVvZiBjdHh0LT5yZWdzKTsKKwlrdm1fcmlwX3dyaXRlKHZjcHUsIGN0eHQtPmVpcCk7CisJa3ZtX3NldF9yZmxhZ3ModmNwdSwgY3R4dC0+ZWZsYWdzKTsKIAlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfRVZFTlQsIHZjcHUpOwogCXJldHVybiBFTVVMQVRFX0RPTkU7CiB9CkBAIC02MDkzLDEyICs2MzA1LDcgQEAKIAlpZiAociA9PSAwKQogCQlyID0ga3ZtX21tdV9zZXR1cCh2Y3B1KTsKIAl2Y3B1X3B1dCh2Y3B1KTsKLQlpZiAociA8IDApCi0JCWdvdG8gZnJlZV92Y3B1OwogCi0JcmV0dXJuIDA7Ci1mcmVlX3ZjcHU6Ci0Ja3ZtX3g4Nl9vcHMtPnZjcHVfZnJlZSh2Y3B1KTsKIAlyZXR1cm4gcjsKIH0KIApAQCAtNjEyNiw2ICs2MzMzLDcgQEAKIAogCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9FVkVOVCwgdmNwdSk7CiAJdmNwdS0+YXJjaC5hcGYubXNyX3ZhbCA9IDA7CisJdmNwdS0+YXJjaC5zdC5tc3JfdmFsID0gMDsKIAogCWt2bWNsb2NrX3Jlc2V0KHZjcHUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0veDg2LmggYi9hcmNoL3g4Ni9rdm0veDg2LmgKaW5kZXggZTQwN2VkMy4uZDM2ZmUyMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3g4Ni5oCisrKyBiL2FyY2gveDg2L2t2bS94ODYuaApAQCAtNzUsMTAgKzc1LDU0IEBACiAJcmV0dXJuIDEgPDwgKGJpdG5vICYgMzEpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgdmNwdV9jYWNoZV9tbWlvX2luZm8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCQlndmFfdCBndmEsIGdmbl90IGdmbiwgdW5zaWduZWQgYWNjZXNzKQoreworCXZjcHUtPmFyY2gubW1pb19ndmEgPSBndmEgJiBQQUdFX01BU0s7CisJdmNwdS0+YXJjaC5hY2Nlc3MgPSBhY2Nlc3M7CisJdmNwdS0+YXJjaC5tbWlvX2dmbiA9IGdmbjsKK30KKworLyoKKyAqIENsZWFyIHRoZSBtbWlvIGNhY2hlIGluZm8gZm9yIHRoZSBnaXZlbiBndmEsCisgKiBzcGVjaWFsbHksIGlmIGd2YSBpcyB+MHVsLCB3ZSBjbGVhciBhbGwgbW1pbyBjYWNoZSBpbmZvLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdmNwdV9jbGVhcl9tbWlvX2luZm8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEpCit7CisJaWYgKGd2YSAhPSAofjB1bCkgJiYgdmNwdS0+YXJjaC5tbWlvX2d2YSAhPSAoZ3ZhICYgUEFHRV9NQVNLKSkKKwkJcmV0dXJuOworCisJdmNwdS0+YXJjaC5tbWlvX2d2YSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB2Y3B1X21hdGNoX21taW9fZ3ZhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBndmEpCit7CisJaWYgKHZjcHUtPmFyY2gubW1pb19ndmEgJiYgdmNwdS0+YXJjaC5tbWlvX2d2YSA9PSAoZ3ZhICYgUEFHRV9NQVNLKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB2Y3B1X21hdGNoX21taW9fZ3BhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhKQoreworCWlmICh2Y3B1LT5hcmNoLm1taW9fZ2ZuICYmIHZjcHUtPmFyY2gubW1pb19nZm4gPT0gZ3BhID4+IFBBR0VfU0hJRlQpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIGt2bV9iZWZvcmVfaGFuZGxlX25taShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fYWZ0ZXJfaGFuZGxlX25taShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogaW50IGt2bV9pbmplY3RfcmVhbG1vZGVfaW50ZXJydXB0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGlycSwgaW50IGluY19laXApOwogCiB2b2lkIGt2bV93cml0ZV90c2Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZGF0YSk7CiAKK2ludCBrdm1fcmVhZF9ndWVzdF92aXJ0KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAorCWd2YV90IGFkZHIsIHZvaWQgKnZhbCwgdW5zaWduZWQgaW50IGJ5dGVzLAorCXN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pOworCitpbnQga3ZtX3dyaXRlX2d1ZXN0X3ZpcnRfc3lzdGVtKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAorCWd2YV90IGFkZHIsIHZvaWQgKnZhbCwgdW5zaWduZWQgaW50IGJ5dGVzLAorCXN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xndWVzdC9ib290LmMgYi9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCmluZGV4IGRiODMyZmQuLjEzZWUyNTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xndWVzdC9ib290LmMKKysrIGIvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYwpAQCAtNzEsNyArNzEsOCBAQAogI2luY2x1ZGUgPGFzbS9zdGFja3Byb3RlY3Rvci5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4JCS8qIGZvciBzdHJ1Y3QgbWFjaGluZV9vcHMgKi8KIAotLypHOjAxMCBXZWxjb21lIHRvIHRoZSBHdWVzdCEKKy8qRzowMTAKKyAqIFdlbGNvbWUgdG8gdGhlIEd1ZXN0IQogICoKICAqIFRoZSBHdWVzdCBpbiBvdXIgdGFsZSBpcyBhIHNpbXBsZSBjcmVhdHVyZTogaWRlbnRpY2FsIHRvIHRoZSBIb3N0IGJ1dAogICogYmVoYXZpbmcgaW4gc2ltcGxpZmllZCBidXQgZXF1aXZhbGVudCB3YXlzLiAgSW4gcGFydGljdWxhciwgdGhlIEd1ZXN0IGlzIHRoZQpAQCAtMTkwLDE1ICsxOTEsMjMgQEAKICNlbmRpZgogCiAvKkc6MDM2Ci0gKiBXaGVuIGxhenkgbW9kZSBpcyB0dXJuZWQgb2ZmIHJlc2V0IHRoZSBwZXItY3B1IGxhenkgbW9kZSB2YXJpYWJsZSBhbmQgdGhlbgotICogaXNzdWUgdGhlIGRvLW5vdGhpbmcgaHlwZXJjYWxsIHRvIGZsdXNoIGFueSBzdG9yZWQgY2FsbHMuCi06Ki8KKyAqIFdoZW4gbGF6eSBtb2RlIGlzIHR1cm5lZCBvZmYsIHdlIGlzc3VlIHRoZSBkby1ub3RoaW5nIGh5cGVyY2FsbCB0bworICogZmx1c2ggYW55IHN0b3JlZCBjYWxscywgYW5kIGNhbGwgdGhlIGdlbmVyaWMgaGVscGVyIHRvIHJlc2V0IHRoZQorICogcGVyLWNwdSBsYXp5IG1vZGUgdmFyaWFibGUuCisgKi8KIHN0YXRpYyB2b2lkIGxndWVzdF9sZWF2ZV9sYXp5X21tdV9tb2RlKHZvaWQpCiB7CiAJaGNhbGwoTEhDQUxMX0ZMVVNIX0FTWU5DLCAwLCAwLCAwLCAwKTsKIAlwYXJhdmlydF9sZWF2ZV9sYXp5X21tdSgpOwogfQogCisvKgorICogV2UgYWxzbyBjYXRjaCB0aGUgZW5kIG9mIGNvbnRleHQgc3dpdGNoOyB3ZSBlbnRlciBsYXp5IG1vZGUgZm9yIG11Y2ggb2YKKyAqIHRoYXQgdG9vLCBzbyBhZ2FpbiB3ZSBuZWVkIHRvIGZsdXNoIGhlcmUuCisgKgorICogKFRlY2huaWNhbGx5LCB0aGlzIGlzIGxhenkgQ1BVIG1vZGUsIGFuZCBub3JtYWxseSB3ZSdyZSBpbiBsYXp5IE1NVQorICogbW9kZSwgYnV0IHVubGlrZSBYZW4sIGxndWVzdCBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGRpZmZlcmVuY2UpLgorICovCiBzdGF0aWMgdm9pZCBsZ3Vlc3RfZW5kX2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKIAloY2FsbChMSENBTExfRkxVU0hfQVNZTkMsIDAsIDAsIDAsIDApOwpAQCAtMzkxLDcgKzQwMCw3IEBACiAgKiBnaWFudCBiYWxsIG9mIGhhaXIuICBJdHMgZW50cnkgaW4gdGhlIGN1cnJlbnQgSW50ZWwgbWFudWFsIHJ1bnMgdG8gMjggcGFnZXMuCiAgKgogICogVGhpcyBpbnN0cnVjdGlvbiBldmVuIGl0IGhhcyBpdHMgb3duIFdpa2lwZWRpYSBlbnRyeS4gIFRoZSBXaWtpcGVkaWEgZW50cnkKLSAqIGhhcyBiZWVuIHRyYW5zbGF0ZWQgaW50byA1IGxhbmd1YWdlcy4gIEkgYW0gbm90IG1ha2luZyB0aGlzIHVwIQorICogaGFzIGJlZW4gdHJhbnNsYXRlZCBpbnRvIDYgbGFuZ3VhZ2VzLiAgSSBhbSBub3QgbWFraW5nIHRoaXMgdXAhCiAgKgogICogV2UgY291bGQgZ2V0IGZ1bmt5IGhlcmUgYW5kIGlkZW50aWZ5IG91cnNlbHZlcyBhcyAiR2VudWluZUxndWVzdCIsIGJ1dAogICogaW5zdGVhZCB3ZSBqdXN0IHVzZSB0aGUgcmVhbCAiY3B1aWQiIGluc3RydWN0aW9uLiAgVGhlbiBJIHByZXR0eSBtdWNoIHR1cm5lZApAQCAtNDU4LDcgKzQ2Nyw3IEBACiAJLyoKIAkgKiBQQUUgc3lzdGVtcyBjYW4gbWFyayBwYWdlcyBhcyBub24tZXhlY3V0YWJsZS4gIExpbnV4IGNhbGxzIHRoaXMgdGhlCiAJICogTlggYml0LiAgSW50ZWwgY2FsbHMgaXQgWEQgKGVYZWN1dGUgRGlzYWJsZSksIEFNRCBFVlAgKEVuaGFuY2VkCi0JICogVmlydXMgUHJvdGVjdGlvbikuICBXZSBqdXN0IHN3aXRjaCB0dXJuIGlmIG9mZiBoZXJlLCBzaW5jZSB3ZSBkb24ndAorCSAqIFZpcnVzIFByb3RlY3Rpb24pLiAgV2UganVzdCBzd2l0Y2ggaXQgb2ZmIGhlcmUsIHNpbmNlIHdlIGRvbid0CiAJICogc3VwcG9ydCBpdC4KIAkgKi8KIAljYXNlIDB4ODAwMDAwMDE6CkBAIC01MjAsMTcgKzUyOSwxNiBAQAogCiAvKiBTZWUgbGd1ZXN0X3NldF9wdGUoKSBiZWxvdy4gKi8KIHN0YXRpYyBib29sIGNyM19jaGFuZ2VkID0gZmFsc2U7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjdXJyZW50X2NyMzsKIAogLyoKICAqIGNyMyBpcyB0aGUgY3VycmVudCB0b3BsZXZlbCBwYWdldGFibGUgcGFnZTogdGhlIHByaW5jaXBsZSBpcyB0aGUgc2FtZSBhcwotICogY3IwLiAgS2VlcCBhIGxvY2FsIGNvcHksIGFuZCB0ZWxsIHRoZSBIb3N0IHdoZW4gaXQgY2hhbmdlcy4gIFRoZSBvbmx5Ci0gKiBkaWZmZXJlbmNlIGlzIHRoYXQgb3VyIGxvY2FsIGNvcHkgaXMgaW4gbGd1ZXN0X2RhdGEgYmVjYXVzZSB0aGUgSG9zdCBuZWVkcwotICogdG8gc2V0IGl0IHVwb24gb3VyIGluaXRpYWwgaHlwZXJjYWxsLgorICogY3IwLiAgS2VlcCBhIGxvY2FsIGNvcHksIGFuZCB0ZWxsIHRoZSBIb3N0IHdoZW4gaXQgY2hhbmdlcy4KICAqLwogc3RhdGljIHZvaWQgbGd1ZXN0X3dyaXRlX2NyMyh1bnNpZ25lZCBsb25nIGNyMykKIHsKLQlsZ3Vlc3RfZGF0YS5wZ2RpciA9IGNyMzsKIAlsYXp5X2hjYWxsMShMSENBTExfTkVXX1BHVEFCTEUsIGNyMyk7CisJY3VycmVudF9jcjMgPSBjcjM7CiAKIAkvKiBUaGVzZSB0d28gcGFnZSB0YWJsZXMgYXJlIHNpbXBsZSwgbGluZWFyLCBhbmQgdXNlZCBkdXJpbmcgYm9vdCAqLwogCWlmIChjcjMgIT0gX19wYShzd2FwcGVyX3BnX2RpcikgJiYgY3IzICE9IF9fcGEoaW5pdGlhbF9wYWdlX3RhYmxlKSkKQEAgLTUzOSw3ICs1NDcsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsZ3Vlc3RfcmVhZF9jcjModm9pZCkKIHsKLQlyZXR1cm4gbGd1ZXN0X2RhdGEucGdkaXI7CisJcmV0dXJuIGN1cnJlbnRfY3IzOwogfQogCiAvKiBjcjQgaXMgdXNlZCB0byBlbmFibGUgYW5kIGRpc2FibGUgUEdFLCBidXQgd2UgZG9uJ3QgY2FyZS4gKi8KQEAgLTY0MSw3ICs2NDksNyBAQAogCiAvKgogICogVGhlIEd1ZXN0IGNhbGxzIHRoaXMgYWZ0ZXIgaXQgaGFzIHNldCBhIHNlY29uZC1sZXZlbCBlbnRyeSAocHRlKSwgaWUuIHRvIG1hcAotICogYSBwYWdlIGludG8gYSBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlLiAgV2V0ZWxsIHRoZSBIb3N0IHRoZSB0b3BsZXZlbCBhbmQKKyAqIGEgcGFnZSBpbnRvIGEgcHJvY2VzcycgYWRkcmVzcyBzcGFjZS4gIFdlIHRlbGwgdGhlIEhvc3QgdGhlIHRvcGxldmVsIGFuZAogICogYWRkcmVzcyB0aGlzIGNvcnJlc3BvbmRzIHRvLiAgVGhlIEd1ZXN0IHVzZXMgb25lIHBhZ2V0YWJsZSBwZXIgcHJvY2Vzcywgc28KICAqIHdlIG5lZWQgdG8gdGVsbCB0aGUgSG9zdCB3aGljaCBvbmUgd2UncmUgY2hhbmdpbmcgKG1tLT5wZ2QpLgogICovCkBAIC03NTgsNyArNzY2LDcgQEAKIHN0YXRpYyB2b2lkIGxndWVzdF9mbHVzaF90bGJfc2luZ2xlKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAkvKiBTaW1wbHkgc2V0IGl0IHRvIHplcm86IGlmIGl0IHdhcyBub3QsIGl0IHdpbGwgZmF1bHQgYmFjayBpbi4gKi8KLQlsYXp5X2hjYWxsMyhMSENBTExfU0VUX1BURSwgbGd1ZXN0X2RhdGEucGdkaXIsIGFkZHIsIDApOworCWxhenlfaGNhbGwzKExIQ0FMTF9TRVRfUFRFLCBjdXJyZW50X2NyMywgYWRkciwgMCk7CiB9CiAKIC8qCkBAIC0xMTQwLDcgKzExNDgsNyBAQAogc3RhdGljIF9faW5pdCBjaGFyICpsZ3Vlc3RfbWVtb3J5X3NldHVwKHZvaWQpCiB7CiAJLyoKLQkgKlRoZSBMaW51eCBib290bG9hZGVyIGhlYWRlciBjb250YWlucyBhbiAiZTgyMCIgbWVtb3J5IG1hcDogdGhlCisJICogVGhlIExpbnV4IGJvb3Rsb2FkZXIgaGVhZGVyIGNvbnRhaW5zIGFuICJlODIwIiBtZW1vcnkgbWFwOiB0aGUKIAkgKiBMYXVuY2hlciBwb3B1bGF0ZWQgdGhlIGZpcnN0IGVudHJ5IHdpdGggb3VyIG1lbW9yeSBsaW1pdC4KIAkgKi8KIAllODIwX2FkZF9yZWdpb24oYm9vdF9wYXJhbXMuZTgyMF9tYXBbMF0uYWRkciwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xndWVzdC9pMzg2X2hlYWQuUyBiL2FyY2gveDg2L2xndWVzdC9pMzg2X2hlYWQuUwppbmRleCA0ZjQyMGMyZi4uNmRkZmU0ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGd1ZXN0L2kzODZfaGVhZC5TCisrKyBiL2FyY2gveDg2L2xndWVzdC9pMzg2X2hlYWQuUwpAQCAtNiwxOCArNiwyMiBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KIAogLypHOjAyMAotICogT3VyIHN0b3J5IHN0YXJ0cyB3aXRoIHRoZSBrZXJuZWwgYm9vdGluZyBpbnRvIHN0YXJ0dXBfMzIgaW4KLSAqIGFyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMuICBJdCBleHBlY3RzIGEgYm9vdCBoZWFkZXIsIHdoaWNoIGlzIGNyZWF0ZWQgYnkKLSAqIHRoZSBib290bG9hZGVyICh0aGUgTGF1bmNoZXIgaW4gb3VyIGNhc2UpLgorCisgKiBPdXIgc3Rvcnkgc3RhcnRzIHdpdGggdGhlIGJ6SW1hZ2U6IGJvb3Rpbmcgc3RhcnRzIGF0IHN0YXJ0dXBfMzIgaW4KKyAqIGFyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMuICBUaGlzIG1lcmVseSB1bmNvbXByZXNzZXMgdGhlIHJlYWwKKyAqIGtlcm5lbCBpbiBwbGFjZSBhbmQgdGhlbiBqdW1wcyBpbnRvIGl0OiBzdGFydHVwXzMyIGluCisgKiBhcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TLiAgQm90aCByb3V0aW5lcyBleHBlY3RzIGEgYm9vdCBoZWFkZXIgaW4gdGhlICVlc2kKKyAqIHJlZ2lzdGVyLCB3aGljaCBpcyBjcmVhdGVkIGJ5IHRoZSBib290bG9hZGVyICh0aGUgTGF1bmNoZXIgaW4gb3VyIGNhc2UpLgogICoKICAqIFRoZSBzdGFydHVwXzMyIGZ1bmN0aW9uIGRvZXMgdmVyeSBsaXR0bGU6IGl0IGNsZWFycyB0aGUgdW5pbml0aWFsaXplZCBnbG9iYWwKICAqIEMgdmFyaWFibGVzIHdoaWNoIHdlIGV4cGVjdCB0byBiZSB6ZXJvIChpZS4gQlNTKSBhbmQgdGhlbiBjb3BpZXMgdGhlIGJvb3QKLSAqIGhlYWRlciBhbmQga2VybmVsIGNvbW1hbmQgbGluZSBzb21ld2hlcmUgc2FmZS4gIEZpbmFsbHkgaXQgY2hlY2tzIHRoZQotICogJ2hhcmR3YXJlX3N1YmFyY2gnIGZpZWxkLiAgVGhpcyB3YXMgaW50cm9kdWNlZCBpbiAyLjYuMjQgZm9yIGxndWVzdCBhbmQgWGVuOgotICogaWYgaXQncyBzZXQgdG8gJzEnIChsZ3Vlc3QncyBhc3NpZ25lZCBudW1iZXIpLCB0aGVuIGl0IGNhbGxzIHVzIGhlcmUuCisgKiBoZWFkZXIgYW5kIGtlcm5lbCBjb21tYW5kIGxpbmUgc29tZXdoZXJlIHNhZmUsIGFuZCBwb3B1bGF0ZXMgc29tZSBpbml0aWFsCisgKiBwYWdlIHRhYmxlcy4gIEZpbmFsbHkgaXQgY2hlY2tzIHRoZSAnaGFyZHdhcmVfc3ViYXJjaCcgZmllbGQuICBUaGlzIHdhcworICogaW50cm9kdWNlZCBpbiAyLjYuMjQgZm9yIGxndWVzdCBhbmQgWGVuOiBpZiBpdCdzIHNldCB0byAnMScgKGxndWVzdCdzCisgKiBhc3NpZ25lZCBudW1iZXIpLCB0aGVuIGl0IGNhbGxzIHVzIGhlcmUuCiAgKgogICogV0FSTklORzogYmUgdmVyeSBjYXJlZnVsIGhlcmUhICBXZSdyZSBydW5uaW5nIGF0IGFkZHJlc3NlcyBlcXVhbCB0byBwaHlzaWNhbAotICogYWRkZXNzZXMgKGFyb3VuZCAwKSwgbm90IGFib3ZlIFBBR0VfT0ZGU0VUIGFzIG1vc3QgY29kZSBleHBlY3RlcworICogYWRkcmVzc2VzIChhcm91bmQgMCksIG5vdCBhYm92ZSBQQUdFX09GRlNFVCBhcyBtb3N0IGNvZGUgZXhwZWN0cwogICogKGVnLiAweEMwMDAwMDAwKS4gIEp1bXBzIGFyZSByZWxhdGl2ZSwgc28gdGhleSdyZSBPSywgYnV0IHdlIGNhbid0IHRvdWNoIGFueQogICogZGF0YSB3aXRob3V0IHJlbWVtYmVyaW5nIHRvIHN1YnRyYWN0IF9fUEFHRV9PRkZTRVQhCiAgKgpAQCAtMjcsMTMgKzMxLDE4IEBACiAuc2VjdGlvbiAuaW5pdC50ZXh0LCAiYXgiLCBAcHJvZ2JpdHMKIEVOVFJZKGxndWVzdF9lbnRyeSkKIAkvKgotCSAqIFdlIG1ha2UgdGhlICJpbml0aWFsaXphdGlvbiIgaHlwZXJjYWxsIG5vdyB0byB0ZWxsIHRoZSBIb3N0IGFib3V0Ci0JICogdXMsIGFuZCBhbHNvIGZpbmQgb3V0IHdoZXJlIGl0IHB1dCBvdXIgcGFnZSB0YWJsZXMuCisJICogV2UgbWFrZSB0aGUgImluaXRpYWxpemF0aW9uIiBoeXBlcmNhbGwgbm93IHRvIHRlbGwgdGhlIEhvc3Qgd2hlcmUKKwkgKiBvdXIgbGd1ZXN0X2RhdGEgc3RydWN0IGlzLgogCSAqLwogCW1vdmwgJExIQ0FMTF9MR1VFU1RfSU5JVCwgJWVheAogCW1vdmwgJGxndWVzdF9kYXRhIC0gX19QQUdFX09GRlNFVCwgJWVieAogCWludCAkTEdVRVNUX1RSQVBfRU5UUlkKIAorCS8qIE5vdyB0dXJuIG91ciBwYWdldGFibGVzIG9uOyBzZXR1cCBieSBhcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TLiAqLworCW1vdmwgJExIQ0FMTF9ORVdfUEdUQUJMRSwgJWVheAorCW1vdmwgJChpbml0aWFsX3BhZ2VfdGFibGUgLSBfX1BBR0VfT0ZGU0VUKSwgJWVieAorCWludCAkTEdVRVNUX1RSQVBfRU5UUlkKKwogCS8qIFNldCB1cCB0aGUgaW5pdGlhbCBzdGFjayBzbyB3ZSBjYW4gcnVuIEMgY29kZS4gKi8KIAltb3ZsICQoaW5pdF90aHJlYWRfdW5pb24rVEhSRUFEX1NJWkUpLCVlc3AKIApAQCAtOTYsMTIgKzEwNSw4IEBACiAJICovCiAJcHVzaGwgJWVheAogCW1vdmwgJExIQ0FMTF9TRU5EX0lOVEVSUlVQVFMsICVlYXgKLQkvKgotCSAqIFRoaXMgaXMgYSB2bWNhbGwgaW5zdHJ1Y3Rpb24gKHNhbWUgdGhpbmcgdGhhdCBLVk0gdXNlcykuICBPbGRlcgotCSAqIGFzc2VtYmxlciB2ZXJzaW9ucyBtaWdodCBub3Qga25vdyB0aGUgInZtY2FsbCIgaW5zdHJ1Y3Rpb24sIHNvIHdlCi0JICogY3JlYXRlIG9uZSBtYW51YWxseSBoZXJlLgotCSAqLwotCS5ieXRlIDB4MGYsMHgwMSwweGMxIC8qIEtWTV9IWVBFUkNBTEwgKi8KKwkvKiBUaGlzIGlzIHRoZSBhY3R1YWwgaHlwZXJjYWxsIHRyYXAuICovCisJaW50ICAkTEdVRVNUX1RSQVBfRU5UUlkKIAkvKiBQdXQgZWF4IGJhY2sgdGhlIHdheSB3ZSBmb3VuZCBpdC4gKi8KIAlwb3BsICVlYXgKIAlyZXQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9NYWtlZmlsZSBiL2FyY2gveDg2L2xpYi9NYWtlZmlsZQppbmRleCBmMjQ3OWYxLi5iMDBmNjc4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvbGliL01ha2VmaWxlCkBAIC0xOCw4ICsxOCwxMCBAQAogCiBsaWIteSA6PSBkZWxheS5vCiBsaWIteSArPSB0aHVua18kKEJJVFMpLm8KLWxpYi15ICs9IHVzZXJjb3B5XyQoQklUUykubyBnZXR1c2VyLm8gcHV0dXNlci5vCitsaWIteSArPSB1c2VyY29weV8kKEJJVFMpLm8gdXNlcmNvcHkubyBnZXR1c2VyLm8gcHV0dXNlci5vCiBsaWIteSArPSBtZW1jcHlfJChCSVRTKS5vCitsaWItJChDT05GSUdfU01QKSArPSByd2xvY2subworbGliLSQoQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNKSArPSByd3NlbS5vCiBsaWItJChDT05GSUdfSU5TVFJVQ1RJT05fREVDT0RFUikgKz0gaW5zbi5vIGluYXQubwogCiBvYmoteSArPSBtc3IubyBtc3ItcmVnLm8gbXNyLXJlZy1leHBvcnQubwpAQCAtMjksNyArMzEsNyBAQAogICAgICAgICBsaWIteSArPSBhdG9taWM2NF9jeDhfMzIubwogICAgICAgICBsaWIteSArPSBjaGVja3N1bV8zMi5vCiAgICAgICAgIGxpYi15ICs9IHN0cnN0cl8zMi5vCi0gICAgICAgIGxpYi15ICs9IHNlbWFwaG9yZV8zMi5vIHN0cmluZ18zMi5vCisgICAgICAgIGxpYi15ICs9IHN0cmluZ18zMi5vCiAgICAgICAgIGxpYi15ICs9IGNtcHhjaGcubwogaWZuZXEgKCQoQ09ORklHX1g4Nl9DTVBYQ0hHNjQpLHkpCiAgICAgICAgIGxpYi15ICs9IGNtcHhjaGc4Yl9lbXUubyBhdG9taWM2NF8zODZfMzIubwpAQCAtNDAsNyArNDIsNiBAQAogICAgICAgICBsaWIteSArPSBjc3VtLXBhcnRpYWxfNjQubyBjc3VtLWNvcHlfNjQubyBjc3VtLXdyYXBwZXJzXzY0Lm8KICAgICAgICAgbGliLXkgKz0gdGh1bmtfNjQubyBjbGVhcl9wYWdlXzY0Lm8gY29weV9wYWdlXzY0Lm8KICAgICAgICAgbGliLXkgKz0gbWVtbW92ZV82NC5vIG1lbXNldF82NC5vCi0gICAgICAgIGxpYi15ICs9IGNvcHlfdXNlcl82NC5vIHJ3bG9ja182NC5vIGNvcHlfdXNlcl9ub2NhY2hlXzY0Lm8KLQlsaWItJChDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0pICs9IHJ3c2VtXzY0Lm8KKyAgICAgICAgbGliLXkgKz0gY29weV91c2VyXzY0Lm8gY29weV91c2VyX25vY2FjaGVfNjQubwogCWxpYi15ICs9IGNtcHhjaGcxNmJfZW11Lm8KIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvY29weV9wYWdlXzY0LlMgYi9hcmNoL3g4Ni9saWIvY29weV9wYWdlXzY0LlMKaW5kZXggNmZlYzJkMS4uMDFjODA1YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL2NvcHlfcGFnZV82NC5TCisrKyBiL2FyY2gveDg2L2xpYi9jb3B5X3BhZ2VfNjQuUwpAQCAtMiw2ICsyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CisjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLWFzbS5oPgogCiAJQUxJR04KIGNvcHlfcGFnZV9jOgpAQCAtMTEwLDEwICsxMTEsNiBAQAogMjoKIAkucHJldmlvdXMKIAkuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCJhIgotCS5hbGlnbiA4Ci0JLnF1YWQgY29weV9wYWdlCi0JLnF1YWQgMWIKLQkud29yZCBYODZfRkVBVFVSRV9SRVBfR09PRAotCS5ieXRlIC5MY29weV9wYWdlX2VuZCAtIGNvcHlfcGFnZQotCS5ieXRlIDJiIC0gMWIKKwlhbHRpbnN0cnVjdGlvbl9lbnRyeSBjb3B5X3BhZ2UsIDFiLCBYODZfRkVBVFVSRV9SRVBfR09PRCwJXAorCQkuTGNvcHlfcGFnZV9lbmQtY29weV9wYWdlLCAyYi0xYgogCS5wcmV2aW91cwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL21lbW1vdmVfNjQuUyBiL2FyY2gveDg2L2xpYi9tZW1tb3ZlXzY0LlMKaW5kZXggZDBlYzljMi4uZWUxNjQ2MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL21lbW1vdmVfNjQuUworKysgYi9hcmNoL3g4Ni9saWIvbWVtbW92ZV82NC5TCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUtYXNtLmg+CiAKICN1bmRlZiBtZW1tb3ZlCiAKQEAgLTIxNCwxMSArMjE1LDkgQEAKIAkucHJldmlvdXMKIAogCS5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsImEiCi0JLmFsaWduIDgKLQkucXVhZCAuTG1lbW1vdmVfYmVnaW5fZm9yd2FyZAotCS5xdWFkIC5MbWVtbW92ZV9iZWdpbl9mb3J3YXJkX2VmcwotCS53b3JkIFg4Nl9GRUFUVVJFX0VSTVMKLQkuYnl0ZSAuTG1lbW1vdmVfZW5kX2ZvcndhcmQtLkxtZW1tb3ZlX2JlZ2luX2ZvcndhcmQKLQkuYnl0ZSAuTG1lbW1vdmVfZW5kX2ZvcndhcmRfZWZzLS5MbWVtbW92ZV9iZWdpbl9mb3J3YXJkX2VmcworCWFsdGluc3RydWN0aW9uX2VudHJ5IC5MbWVtbW92ZV9iZWdpbl9mb3J3YXJkLAkJXAorCQkuTG1lbW1vdmVfYmVnaW5fZm9yd2FyZF9lZnMsWDg2X0ZFQVRVUkVfRVJNUywJXAorCQkuTG1lbW1vdmVfZW5kX2ZvcndhcmQtLkxtZW1tb3ZlX2JlZ2luX2ZvcndhcmQsCVwKKwkJLkxtZW1tb3ZlX2VuZF9mb3J3YXJkX2Vmcy0uTG1lbW1vdmVfYmVnaW5fZm9yd2FyZF9lZnMKIAkucHJldmlvdXMKIEVORFBST0MobWVtbW92ZSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9yd2xvY2suUyBiL2FyY2gveDg2L2xpYi9yd2xvY2suUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2FkMjIxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvbGliL3J3bG9jay5TCkBAIC0wLDAgKzEsNDQgQEAKKy8qIFNsb3cgcGF0aHMgb2YgcmVhZC93cml0ZSBzcGlubG9ja3MuICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLWFzbS5oPgorI2luY2x1ZGUgPGFzbS9mcmFtZS5oPgorI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KKworI2lmZGVmIENPTkZJR19YODZfMzIKKyMgZGVmaW5lIF9fbG9ja19wdHIgZWF4CisjZWxzZQorIyBkZWZpbmUgX19sb2NrX3B0ciByZGkKKyNlbmRpZgorCitFTlRSWShfX3dyaXRlX2xvY2tfZmFpbGVkKQorCUNGSV9TVEFSVFBST0MKKwlGUkFNRQorMDoJTE9DS19QUkVGSVgKKwlXUklURV9MT0NLX0FERCgkUldfTE9DS19CSUFTKSAoJV9fbG9ja19wdHIpCisxOglyZXA7IG5vcAorCWNtcGwJJFdSSVRFX0xPQ0tfQ01QLCAoJV9fbG9ja19wdHIpCisJam5lCTFiCisJTE9DS19QUkVGSVgKKwlXUklURV9MT0NLX1NVQigkUldfTE9DS19CSUFTKSAoJV9fbG9ja19wdHIpCisJam56CTBiCisJRU5ERlJBTUUKKwlyZXQKKwlDRklfRU5EUFJPQworRU5EKF9fd3JpdGVfbG9ja19mYWlsZWQpCisKK0VOVFJZKF9fcmVhZF9sb2NrX2ZhaWxlZCkKKwlDRklfU1RBUlRQUk9DCisJRlJBTUUKKzA6CUxPQ0tfUFJFRklYCisJUkVBRF9MT0NLX1NJWkUoaW5jKSAoJV9fbG9ja19wdHIpCisxOglyZXA7IG5vcAorCVJFQURfTE9DS19TSVpFKGNtcCkgJDEsICglX19sb2NrX3B0cikKKwlqcwkxYgorCUxPQ0tfUFJFRklYCisJUkVBRF9MT0NLX1NJWkUoZGVjKSAoJV9fbG9ja19wdHIpCisJanMJMGIKKwlFTkRGUkFNRQorCXJldAorCUNGSV9FTkRQUk9DCitFTkQoX19yZWFkX2xvY2tfZmFpbGVkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL3J3bG9ja182NC5TIGIvYXJjaC94ODYvbGliL3J3bG9ja182NC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWVhNTVmLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2xpYi9yd2xvY2tfNjQuUworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIFNsb3cgcGF0aHMgb2YgcmVhZC93cml0ZSBzcGlubG9ja3MuICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3J3bG9jay5oPgotI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS1hc20uaD4KLSNpbmNsdWRlIDxhc20vZHdhcmYyLmg+Ci0KLS8qIHJkaToJcG9pbnRlciB0byByd2xvY2tfdCAqLwotRU5UUlkoX193cml0ZV9sb2NrX2ZhaWxlZCkKLQlDRklfU1RBUlRQUk9DCi0JTE9DS19QUkVGSVgKLQlhZGRsICRSV19MT0NLX0JJQVMsKCVyZGkpCi0xOglyZXAKLQlub3AKLQljbXBsICRSV19MT0NLX0JJQVMsKCVyZGkpCi0Jam5lIDFiCi0JTE9DS19QUkVGSVgKLQlzdWJsICRSV19MT0NLX0JJQVMsKCVyZGkpCi0Jam56ICBfX3dyaXRlX2xvY2tfZmFpbGVkCi0JcmV0Ci0JQ0ZJX0VORFBST0MKLUVORChfX3dyaXRlX2xvY2tfZmFpbGVkKQotCi0vKiByZGk6CXBvaW50ZXIgdG8gcndsb2NrX3QgKi8KLUVOVFJZKF9fcmVhZF9sb2NrX2ZhaWxlZCkKLQlDRklfU1RBUlRQUk9DCi0JTE9DS19QUkVGSVgKLQlpbmNsICglcmRpKQotMToJcmVwCi0Jbm9wCi0JY21wbCAkMSwoJXJkaSkKLQlqcyAxYgotCUxPQ0tfUFJFRklYCi0JZGVjbCAoJXJkaSkKLQlqcyBfX3JlYWRfbG9ja19mYWlsZWQKLQlyZXQKLQlDRklfRU5EUFJPQwotRU5EKF9fcmVhZF9sb2NrX2ZhaWxlZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9yd3NlbS5TIGIvYXJjaC94ODYvbGliL3J3c2VtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmZjVmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2xpYi9yd3NlbS5TCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogeDg2IHNlbWFwaG9yZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDE5OTkgTGludXMgVG9ydmFsZHMKKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgMTk5OSBSZWQgSGF0LCBJbmMuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBydyBzZW1hcGhvcmVzIGltcGxlbWVudGVkIE5vdmVtYmVyIDE5OTkgYnkgQmVuamFtaW4gTGFIYWlzZSA8YmNybEBrdmFjay5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUtYXNtLmg+CisjaW5jbHVkZSA8YXNtL2R3YXJmMi5oPgorCisjZGVmaW5lIF9fQVNNX0hBTEZfUkVHKHJlZykJX19BU01fU0VMKHJlZywgZSMjcmVnKQorI2RlZmluZSBfX0FTTV9IQUxGX1NJWkUoaW5zdCkJX19BU01fU0VMKGluc3QjI3csIGluc3QjI2wpCisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisKKy8qCisgKiBUaGUgc2VtYXBob3JlIG9wZXJhdGlvbnMgaGF2ZSBhIHNwZWNpYWwgY2FsbGluZyBzZXF1ZW5jZSB0aGF0CisgKiBhbGxvdyB1cyB0byBkbyBhIHNpbXBsZXIgaW4tbGluZSB2ZXJzaW9uIG9mIHRoZW0uIFRoZXNlIHJvdXRpbmVzCisgKiBuZWVkIHRvIGNvbnZlcnQgdGhhdCBzZXF1ZW5jZSBiYWNrIGludG8gdGhlIEMgc2VxdWVuY2Ugd2hlbgorICogdGhlcmUgaXMgY29udGVudGlvbiBvbiB0aGUgc2VtYXBob3JlLgorICoKKyAqICVlYXggY29udGFpbnMgdGhlIHNlbWFwaG9yZSBwb2ludGVyIG9uIGVudHJ5LiBTYXZlIHRoZSBDLWNsb2JiZXJlZAorICogcmVnaXN0ZXJzICglZWF4LCAlZWR4IGFuZCAlZWN4KSBleGNlcHQgJWVheCB3aGlzaCBpcyBlaXRoZXIgYSByZXR1cm4KKyAqIHZhbHVlIG9yIGp1c3QgY2xvYmJlcmVkLi4KKyAqLworCisjZGVmaW5lIHNhdmVfY29tbW9uX3JlZ3MgXAorCXB1c2hsX2NmaSAlZWN4OyBDRklfUkVMX09GRlNFVCBlY3gsIDAKKworI2RlZmluZSByZXN0b3JlX2NvbW1vbl9yZWdzIFwKKwlwb3BsX2NmaSAlZWN4OyBDRklfUkVTVE9SRSBlY3gKKworCS8qIEF2b2lkIHVnbGlmeWluZyB0aGUgYXJndW1lbnQgY29weWluZyB4ODYtNjQgbmVlZHMgdG8gZG8uICovCisJLm1hY3JvIG1vdnEgc3JjLCBkc3QKKwkuZW5kbQorCisjZWxzZQorCisvKgorICogeDg2LTY0IHJ3c2VtIHdyYXBwZXJzCisgKgorICogVGhpcyBpbnRlcmZhY2VzIHRoZSBpbmxpbmUgYXNtIGNvZGUgdG8gdGhlIHNsb3ctcGF0aAorICogQyByb3V0aW5lcy4gV2UgbmVlZCB0byBzYXZlIHRoZSBjYWxsLWNsb2JiZXJlZCByZWdzCisgKiB0aGF0IHRoZSBhc20gZG9lcyBub3QgbWFyayBhcyBjbG9iYmVyZWQsIGFuZCBtb3ZlIHRoZQorICogYXJndW1lbnQgZnJvbSAlcmF4IHRvICVyZGkuCisgKgorICogTk9URSEgV2UgZG9uJ3QgbmVlZCB0byBzYXZlICVyYXgsIGJlY2F1c2UgdGhlIGZ1bmN0aW9ucworICogd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzZW1hcGhvcmUgcG9pbnRlciBpbiAlcmF4ICh3aGljaAorICogaXMgYWxzbyB0aGUgaW5wdXQgYXJndW1lbnQgdG8gdGhlc2UgaGVscGVycykKKyAqCisgKiBUaGUgZm9sbG93aW5nIGNhbiBjbG9iYmVyICVyZHggYmVjYXVzZSB0aGUgYXNtIGNsb2JiZXJzIGl0OgorICogICBjYWxsX3J3c2VtX2Rvd25fd3JpdGVfZmFpbGVkCisgKiAgIGNhbGxfcndzZW1fd2FrZQorICogYnV0ICVyZGksICVyc2ksICVyY3gsICVyOC1yMTEgYWx3YXlzIG5lZWQgc2F2aW5nLgorICovCisKKyNkZWZpbmUgc2F2ZV9jb21tb25fcmVncyBcCisJcHVzaHFfY2ZpICVyZGk7IENGSV9SRUxfT0ZGU0VUIHJkaSwgMDsgXAorCXB1c2hxX2NmaSAlcnNpOyBDRklfUkVMX09GRlNFVCByc2ksIDA7IFwKKwlwdXNocV9jZmkgJXJjeDsgQ0ZJX1JFTF9PRkZTRVQgcmN4LCAwOyBcCisJcHVzaHFfY2ZpICVyODsgIENGSV9SRUxfT0ZGU0VUIHI4LCAgMDsgXAorCXB1c2hxX2NmaSAlcjk7ICBDRklfUkVMX09GRlNFVCByOSwgIDA7IFwKKwlwdXNocV9jZmkgJXIxMDsgQ0ZJX1JFTF9PRkZTRVQgcjEwLCAwOyBcCisJcHVzaHFfY2ZpICVyMTE7IENGSV9SRUxfT0ZGU0VUIHIxMSwgMAorCisjZGVmaW5lIHJlc3RvcmVfY29tbW9uX3JlZ3MgXAorCXBvcHFfY2ZpICVyMTE7IENGSV9SRVNUT1JFIHIxMTsgXAorCXBvcHFfY2ZpICVyMTA7IENGSV9SRVNUT1JFIHIxMDsgXAorCXBvcHFfY2ZpICVyOTsgIENGSV9SRVNUT1JFIHI5OyBcCisJcG9wcV9jZmkgJXI4OyAgQ0ZJX1JFU1RPUkUgcjg7IFwKKwlwb3BxX2NmaSAlcmN4OyBDRklfUkVTVE9SRSByY3g7IFwKKwlwb3BxX2NmaSAlcnNpOyBDRklfUkVTVE9SRSByc2k7IFwKKwlwb3BxX2NmaSAlcmRpOyBDRklfUkVTVE9SRSByZGkKKworI2VuZGlmCisKKy8qIEZpeCB1cCBzcGVjaWFsIGNhbGxpbmcgY29udmVudGlvbnMgKi8KK0VOVFJZKGNhbGxfcndzZW1fZG93bl9yZWFkX2ZhaWxlZCkKKwlDRklfU1RBUlRQUk9DCisJc2F2ZV9jb21tb25fcmVncworCV9fQVNNX1NJWkUocHVzaCxfY2ZpKSAlX19BU01fUkVHKGR4KQorCUNGSV9SRUxfT0ZGU0VUIF9fQVNNX1JFRyhkeCksIDAKKwltb3ZxICVyYXgsJXJkaQorCWNhbGwgcndzZW1fZG93bl9yZWFkX2ZhaWxlZAorCV9fQVNNX1NJWkUocG9wLF9jZmkpICVfX0FTTV9SRUcoZHgpCisJQ0ZJX1JFU1RPUkUgX19BU01fUkVHKGR4KQorCXJlc3RvcmVfY29tbW9uX3JlZ3MKKwlyZXQKKwlDRklfRU5EUFJPQworRU5EUFJPQyhjYWxsX3J3c2VtX2Rvd25fcmVhZF9mYWlsZWQpCisKK0VOVFJZKGNhbGxfcndzZW1fZG93bl93cml0ZV9mYWlsZWQpCisJQ0ZJX1NUQVJUUFJPQworCXNhdmVfY29tbW9uX3JlZ3MKKwltb3ZxICVyYXgsJXJkaQorCWNhbGwgcndzZW1fZG93bl93cml0ZV9mYWlsZWQKKwlyZXN0b3JlX2NvbW1vbl9yZWdzCisJcmV0CisJQ0ZJX0VORFBST0MKK0VORFBST0MoY2FsbF9yd3NlbV9kb3duX3dyaXRlX2ZhaWxlZCkKKworRU5UUlkoY2FsbF9yd3NlbV93YWtlKQorCUNGSV9TVEFSVFBST0MKKwkvKiBkbyBub3RoaW5nIGlmIHN0aWxsIG91dHN0YW5kaW5nIGFjdGl2ZSByZWFkZXJzICovCisJX19BU01fSEFMRl9TSVpFKGRlYykgJV9fQVNNX0hBTEZfUkVHKGR4KQorCWpueiAxZgorCXNhdmVfY29tbW9uX3JlZ3MKKwltb3ZxICVyYXgsJXJkaQorCWNhbGwgcndzZW1fd2FrZQorCXJlc3RvcmVfY29tbW9uX3JlZ3MKKzE6CXJldAorCUNGSV9FTkRQUk9DCitFTkRQUk9DKGNhbGxfcndzZW1fd2FrZSkKKworRU5UUlkoY2FsbF9yd3NlbV9kb3duZ3JhZGVfd2FrZSkKKwlDRklfU1RBUlRQUk9DCisJc2F2ZV9jb21tb25fcmVncworCV9fQVNNX1NJWkUocHVzaCxfY2ZpKSAlX19BU01fUkVHKGR4KQorCUNGSV9SRUxfT0ZGU0VUIF9fQVNNX1JFRyhkeCksIDAKKwltb3ZxICVyYXgsJXJkaQorCWNhbGwgcndzZW1fZG93bmdyYWRlX3dha2UKKwlfX0FTTV9TSVpFKHBvcCxfY2ZpKSAlX19BU01fUkVHKGR4KQorCUNGSV9SRVNUT1JFIF9fQVNNX1JFRyhkeCkKKwlyZXN0b3JlX2NvbW1vbl9yZWdzCisJcmV0CisJQ0ZJX0VORFBST0MKK0VORFBST0MoY2FsbF9yd3NlbV9kb3duZ3JhZGVfd2FrZSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9yd3NlbV82NC5TIGIvYXJjaC94ODYvbGliL3J3c2VtXzY0LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NzQzOTcuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvbGliL3J3c2VtXzY0LlMKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogeDg2LTY0IHJ3c2VtIHdyYXBwZXJzCi0gKgotICogVGhpcyBpbnRlcmZhY2VzIHRoZSBpbmxpbmUgYXNtIGNvZGUgdG8gdGhlIHNsb3ctcGF0aAotICogQyByb3V0aW5lcy4gV2UgbmVlZCB0byBzYXZlIHRoZSBjYWxsLWNsb2JiZXJlZCByZWdzCi0gKiB0aGF0IHRoZSBhc20gZG9lcyBub3QgbWFyayBhcyBjbG9iYmVyZWQsIGFuZCBtb3ZlIHRoZQotICogYXJndW1lbnQgZnJvbSAlcmF4IHRvICVyZGkuCi0gKgotICogTk9URSEgV2UgZG9uJ3QgbmVlZCB0byBzYXZlICVyYXgsIGJlY2F1c2UgdGhlIGZ1bmN0aW9ucwotICogd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzZW1hcGhvcmUgcG9pbnRlciBpbiAlcmF4ICh3aGljaAotICogaXMgYWxzbyB0aGUgaW5wdXQgYXJndW1lbnQgdG8gdGhlc2UgaGVscGVycykKLSAqCi0gKiBUaGUgZm9sbG93aW5nIGNhbiBjbG9iYmVyICVyZHggYmVjYXVzZSB0aGUgYXNtIGNsb2JiZXJzIGl0OgotICogICBjYWxsX3J3c2VtX2Rvd25fd3JpdGVfZmFpbGVkCi0gKiAgIGNhbGxfcndzZW1fd2FrZQotICogYnV0ICVyZGksICVyc2ksICVyY3gsICVyOC1yMTEgYWx3YXlzIG5lZWQgc2F2aW5nLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3J3bG9jay5oPgotI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS1hc20uaD4KLSNpbmNsdWRlIDxhc20vZnJhbWUuaD4KLSNpbmNsdWRlIDxhc20vZHdhcmYyLmg+Ci0KLSNkZWZpbmUgc2F2ZV9jb21tb25fcmVncyBcCi0JcHVzaHFfY2ZpICVyZGk7IENGSV9SRUxfT0ZGU0VUIHJkaSwgMDsgXAotCXB1c2hxX2NmaSAlcnNpOyBDRklfUkVMX09GRlNFVCByc2ksIDA7IFwKLQlwdXNocV9jZmkgJXJjeDsgQ0ZJX1JFTF9PRkZTRVQgcmN4LCAwOyBcCi0JcHVzaHFfY2ZpICVyODsgIENGSV9SRUxfT0ZGU0VUIHI4LCAgMDsgXAotCXB1c2hxX2NmaSAlcjk7ICBDRklfUkVMX09GRlNFVCByOSwgIDA7IFwKLQlwdXNocV9jZmkgJXIxMDsgQ0ZJX1JFTF9PRkZTRVQgcjEwLCAwOyBcCi0JcHVzaHFfY2ZpICVyMTE7IENGSV9SRUxfT0ZGU0VUIHIxMSwgMAotCi0jZGVmaW5lIHJlc3RvcmVfY29tbW9uX3JlZ3MgXAotCXBvcHFfY2ZpICVyMTE7IENGSV9SRVNUT1JFIHIxMTsgXAotCXBvcHFfY2ZpICVyMTA7IENGSV9SRVNUT1JFIHIxMDsgXAotCXBvcHFfY2ZpICVyOTsgIENGSV9SRVNUT1JFIHI5OyBcCi0JcG9wcV9jZmkgJXI4OyAgQ0ZJX1JFU1RPUkUgcjg7IFwKLQlwb3BxX2NmaSAlcmN4OyBDRklfUkVTVE9SRSByY3g7IFwKLQlwb3BxX2NmaSAlcnNpOyBDRklfUkVTVE9SRSByc2k7IFwKLQlwb3BxX2NmaSAlcmRpOyBDRklfUkVTVE9SRSByZGkKLQotLyogRml4IHVwIHNwZWNpYWwgY2FsbGluZyBjb252ZW50aW9ucyAqLwotRU5UUlkoY2FsbF9yd3NlbV9kb3duX3JlYWRfZmFpbGVkKQotCUNGSV9TVEFSVFBST0MKLQlzYXZlX2NvbW1vbl9yZWdzCi0JcHVzaHFfY2ZpICVyZHgKLQlDRklfUkVMX09GRlNFVCByZHgsIDAKLQltb3ZxICVyYXgsJXJkaQotCWNhbGwgcndzZW1fZG93bl9yZWFkX2ZhaWxlZAotCXBvcHFfY2ZpICVyZHgKLQlDRklfUkVTVE9SRSByZHgKLQlyZXN0b3JlX2NvbW1vbl9yZWdzCi0JcmV0Ci0JQ0ZJX0VORFBST0MKLUVORFBST0MoY2FsbF9yd3NlbV9kb3duX3JlYWRfZmFpbGVkKQotCi1FTlRSWShjYWxsX3J3c2VtX2Rvd25fd3JpdGVfZmFpbGVkKQotCUNGSV9TVEFSVFBST0MKLQlzYXZlX2NvbW1vbl9yZWdzCi0JbW92cSAlcmF4LCVyZGkKLQljYWxsIHJ3c2VtX2Rvd25fd3JpdGVfZmFpbGVkCi0JcmVzdG9yZV9jb21tb25fcmVncwotCXJldAotCUNGSV9FTkRQUk9DCi1FTkRQUk9DKGNhbGxfcndzZW1fZG93bl93cml0ZV9mYWlsZWQpCi0KLUVOVFJZKGNhbGxfcndzZW1fd2FrZSkKLQlDRklfU1RBUlRQUk9DCi0JZGVjbCAlZWR4CS8qIGRvIG5vdGhpbmcgaWYgc3RpbGwgb3V0c3RhbmRpbmcgYWN0aXZlIHJlYWRlcnMgKi8KLQlqbnogMWYKLQlzYXZlX2NvbW1vbl9yZWdzCi0JbW92cSAlcmF4LCVyZGkKLQljYWxsIHJ3c2VtX3dha2UKLQlyZXN0b3JlX2NvbW1vbl9yZWdzCi0xOglyZXQKLQlDRklfRU5EUFJPQwotRU5EUFJPQyhjYWxsX3J3c2VtX3dha2UpCi0KLS8qIEZpeCB1cCBzcGVjaWFsIGNhbGxpbmcgY29udmVudGlvbnMgKi8KLUVOVFJZKGNhbGxfcndzZW1fZG93bmdyYWRlX3dha2UpCi0JQ0ZJX1NUQVJUUFJPQwotCXNhdmVfY29tbW9uX3JlZ3MKLQlwdXNocV9jZmkgJXJkeAotCUNGSV9SRUxfT0ZGU0VUIHJkeCwgMAotCW1vdnEgJXJheCwlcmRpCi0JY2FsbCByd3NlbV9kb3duZ3JhZGVfd2FrZQotCXBvcHFfY2ZpICVyZHgKLQlDRklfUkVTVE9SRSByZHgKLQlyZXN0b3JlX2NvbW1vbl9yZWdzCi0JcmV0Ci0JQ0ZJX0VORFBST0MKLUVORFBST0MoY2FsbF9yd3NlbV9kb3duZ3JhZGVfd2FrZSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9zZW1hcGhvcmVfMzIuUyBiL2FyY2gveDg2L2xpYi9zZW1hcGhvcmVfMzIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2OTFkYS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9saWIvc2VtYXBob3JlXzMyLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIGkzODYgc2VtYXBob3JlIGltcGxlbWVudGF0aW9uLgotICoKLSAqIChDKSBDb3B5cmlnaHQgMTk5OSBMaW51cyBUb3J2YWxkcwotICoKLSAqIFBvcnRpb25zIENvcHlyaWdodCAxOTk5IFJlZCBIYXQsIEluYy4KLSAqCi0gKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIHJ3IHNlbWFwaG9yZXMgaW1wbGVtZW50ZWQgTm92ZW1iZXIgMTk5OSBieSBCZW5qYW1pbiBMYUhhaXNlIDxiY3JsQGt2YWNrLm9yZz4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KLSNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUtYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL2ZyYW1lLmg+Ci0jaW5jbHVkZSA8YXNtL2R3YXJmMi5oPgotCi0vKgotICogVGhlIHNlbWFwaG9yZSBvcGVyYXRpb25zIGhhdmUgYSBzcGVjaWFsIGNhbGxpbmcgc2VxdWVuY2UgdGhhdAotICogYWxsb3cgdXMgdG8gZG8gYSBzaW1wbGVyIGluLWxpbmUgdmVyc2lvbiBvZiB0aGVtLiBUaGVzZSByb3V0aW5lcwotICogbmVlZCB0byBjb252ZXJ0IHRoYXQgc2VxdWVuY2UgYmFjayBpbnRvIHRoZSBDIHNlcXVlbmNlIHdoZW4KLSAqIHRoZXJlIGlzIGNvbnRlbnRpb24gb24gdGhlIHNlbWFwaG9yZS4KLSAqCi0gKiAlZWF4IGNvbnRhaW5zIHRoZSBzZW1hcGhvcmUgcG9pbnRlciBvbiBlbnRyeS4gU2F2ZSB0aGUgQy1jbG9iYmVyZWQKLSAqIHJlZ2lzdGVycyAoJWVheCwgJWVkeCBhbmQgJWVjeCkgZXhjZXB0ICVlYXggd2hpc2ggaXMgZWl0aGVyIGEgcmV0dXJuCi0gKiB2YWx1ZSBvciBqdXN0IGNsb2JiZXJlZC4uCi0gKi8KLQkuc2VjdGlvbiAuc2NoZWQudGV4dCwgImF4IgotCi0vKgotICogcncgc3BpbmxvY2sgZmFsbGJhY2tzCi0gKi8KLSNpZmRlZiBDT05GSUdfU01QCi1FTlRSWShfX3dyaXRlX2xvY2tfZmFpbGVkKQotCUNGSV9TVEFSVFBST0MKLQlGUkFNRQotMjogCUxPQ0tfUFJFRklYCi0JYWRkbAkkIFJXX0xPQ0tfQklBUywoJWVheCkKLTE6CXJlcDsgbm9wCi0JY21wbAkkIFJXX0xPQ0tfQklBUywoJWVheCkKLQlqbmUJMWIKLQlMT0NLX1BSRUZJWAotCXN1YmwJJCBSV19MT0NLX0JJQVMsKCVlYXgpCi0Jam56CTJiCi0JRU5ERlJBTUUKLQlyZXQKLQlDRklfRU5EUFJPQwotCUVORFBST0MoX193cml0ZV9sb2NrX2ZhaWxlZCkKLQotRU5UUlkoX19yZWFkX2xvY2tfZmFpbGVkKQotCUNGSV9TVEFSVFBST0MKLQlGUkFNRQotMjogCUxPQ0tfUFJFRklYCi0JaW5jbAkoJWVheCkKLTE6CXJlcDsgbm9wCi0JY21wbAkkMSwoJWVheCkKLQlqcwkxYgotCUxPQ0tfUFJFRklYCi0JZGVjbAkoJWVheCkKLQlqcwkyYgotCUVOREZSQU1FCi0JcmV0Ci0JQ0ZJX0VORFBST0MKLQlFTkRQUk9DKF9fcmVhZF9sb2NrX2ZhaWxlZCkKLQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0KLQotLyogRml4IHVwIHNwZWNpYWwgY2FsbGluZyBjb252ZW50aW9ucyAqLwotRU5UUlkoY2FsbF9yd3NlbV9kb3duX3JlYWRfZmFpbGVkKQotCUNGSV9TVEFSVFBST0MKLQlwdXNobF9jZmkgJWVjeAotCUNGSV9SRUxfT0ZGU0VUIGVjeCwwCi0JcHVzaGxfY2ZpICVlZHgKLQlDRklfUkVMX09GRlNFVCBlZHgsMAotCWNhbGwgcndzZW1fZG93bl9yZWFkX2ZhaWxlZAotCXBvcGxfY2ZpICVlZHgKLQlwb3BsX2NmaSAlZWN4Ci0JcmV0Ci0JQ0ZJX0VORFBST0MKLQlFTkRQUk9DKGNhbGxfcndzZW1fZG93bl9yZWFkX2ZhaWxlZCkKLQotRU5UUlkoY2FsbF9yd3NlbV9kb3duX3dyaXRlX2ZhaWxlZCkKLQlDRklfU1RBUlRQUk9DCi0JcHVzaGxfY2ZpICVlY3gKLQlDRklfUkVMX09GRlNFVCBlY3gsMAotCWNhbGxsIHJ3c2VtX2Rvd25fd3JpdGVfZmFpbGVkCi0JcG9wbF9jZmkgJWVjeAotCXJldAotCUNGSV9FTkRQUk9DCi0JRU5EUFJPQyhjYWxsX3J3c2VtX2Rvd25fd3JpdGVfZmFpbGVkKQotCi1FTlRSWShjYWxsX3J3c2VtX3dha2UpCi0JQ0ZJX1NUQVJUUFJPQwotCWRlY3cgJWR4ICAgIC8qIGRvIG5vdGhpbmcgaWYgc3RpbGwgb3V0c3RhbmRpbmcgYWN0aXZlIHJlYWRlcnMgKi8KLQlqbnogMWYKLQlwdXNobF9jZmkgJWVjeAotCUNGSV9SRUxfT0ZGU0VUIGVjeCwwCi0JY2FsbCByd3NlbV93YWtlCi0JcG9wbF9jZmkgJWVjeAotMToJcmV0Ci0JQ0ZJX0VORFBST0MKLQlFTkRQUk9DKGNhbGxfcndzZW1fd2FrZSkKLQotLyogRml4IHVwIHNwZWNpYWwgY2FsbGluZyBjb252ZW50aW9ucyAqLwotRU5UUlkoY2FsbF9yd3NlbV9kb3duZ3JhZGVfd2FrZSkKLQlDRklfU1RBUlRQUk9DCi0JcHVzaGxfY2ZpICVlY3gKLQlDRklfUkVMX09GRlNFVCBlY3gsMAotCXB1c2hsX2NmaSAlZWR4Ci0JQ0ZJX1JFTF9PRkZTRVQgZWR4LDAKLQljYWxsIHJ3c2VtX2Rvd25ncmFkZV93YWtlCi0JcG9wbF9jZmkgJWVkeAotCXBvcGxfY2ZpICVlY3gKLQlyZXQKLQlDRklfRU5EUFJPQwotCUVORFBST0MoY2FsbF9yd3NlbV9kb3duZ3JhZGVfd2FrZSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvdGh1bmtfNjQuUyBiL2FyY2gveDg2L2xpYi90aHVua182NC5TCmluZGV4IDc4MmIwODIuLmE2M2VmZDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi90aHVua182NC5TCisrKyBiL2FyY2gveDg2L2xpYi90aHVua182NC5TCkBAIC01LDUwICs1LDQxIEBACiAgKiBBZGRlZCB0cmFjZV9oYXJkaXJxcyBjYWxsZXJzIC0gQ29weXJpZ2h0IDIwMDcgU3RldmVuIFJvc3RlZHQsIFJlZCBIYXQsIEluYy4KICAqIFN1YmplY3QgdG8gdGhlIEdOVSBwdWJsaWMgbGljZW5zZSwgdi4yLiBObyB3YXJyYW50eSBvZiBhbnkga2luZC4KICAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CisjaW5jbHVkZSA8YXNtL2NhbGxpbmcuaD4KIAotCSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0JI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KLQkjaW5jbHVkZSA8YXNtL2NhbGxpbmcuaD4JCQkKLQkjaW5jbHVkZSA8YXNtL3J3bG9jay5oPgotCQkKLQkvKiByZGk6CWFyZzEgLi4uIG5vcm1hbCBDIGNvbnZlbnRpb25zLiByYXggaXMgc2F2ZWQvcmVzdG9yZWQuICovIAkKLQkubWFjcm8gdGh1bmsgbmFtZSxmdW5jCisJLyogcmRpOglhcmcxIC4uLiBub3JtYWwgQyBjb252ZW50aW9ucy4gcmF4IGlzIHNhdmVkL3Jlc3RvcmVkLiAqLworCS5tYWNybyBUSFVOSyBuYW1lLCBmdW5jLCBwdXRfcmV0X2FkZHJfaW5fcmRpPTAKIAkuZ2xvYmwgXG5hbWUKLVxuYW1lOgkKK1xuYW1lOgogCUNGSV9TVEFSVFBST0MKKworCS8qIHRoaXMgb25lIHB1c2hlcyA5IGVsZW1zLCB0aGUgbmV4dCBvbmUgd291bGQgYmUgJXJJUCAqLwogCVNBVkVfQVJHUworCisJLmlmIFxwdXRfcmV0X2FkZHJfaW5fcmRpCisJbW92cV9jZmlfcmVzdG9yZSA5KjgsIHJkaQorCS5lbmRpZgorCiAJY2FsbCBcZnVuYwogCWptcCAgcmVzdG9yZQogCUNGSV9FTkRQUk9DCiAJLmVuZG0KIAogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwotCS8qIHB1dCByZXR1cm4gYWRkcmVzcyBpbiByZGkgKGFyZzEpICovCi0JLm1hY3JvIHRodW5rX3JhIG5hbWUsZnVuYwotCS5nbG9ibCBcbmFtZQotXG5hbWU6Ci0JQ0ZJX1NUQVJUUFJPQwotCVNBVkVfQVJHUwotCS8qIFNBVkVfQVJHUyBwdXNocyA5IGVsZW1lbnRzICovCi0JLyogdGhlIG5leHQgZWxlbWVudCB3b3VsZCBiZSB0aGUgcmlwICovCi0JbW92cSA5KjgoJXJzcCksICVyZGkKLQljYWxsIFxmdW5jCi0Jam1wICByZXN0b3JlCi0JQ0ZJX0VORFBST0MKLQkuZW5kbQotCi0JdGh1bmtfcmEgdHJhY2VfaGFyZGlycXNfb25fdGh1bmssdHJhY2VfaGFyZGlycXNfb25fY2FsbGVyCi0JdGh1bmtfcmEgdHJhY2VfaGFyZGlycXNfb2ZmX3RodW5rLHRyYWNlX2hhcmRpcnFzX29mZl9jYWxsZXIKKwlUSFVOSyB0cmFjZV9oYXJkaXJxc19vbl90aHVuayx0cmFjZV9oYXJkaXJxc19vbl9jYWxsZXIsMQorCVRIVU5LIHRyYWNlX2hhcmRpcnFzX29mZl90aHVuayx0cmFjZV9oYXJkaXJxc19vZmZfY2FsbGVyLDEKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MKLQl0aHVuayBsb2NrZGVwX3N5c19leGl0X3RodW5rLGxvY2tkZXBfc3lzX2V4aXQKKwlUSFVOSyBsb2NrZGVwX3N5c19leGl0X3RodW5rLGxvY2tkZXBfc3lzX2V4aXQKICNlbmRpZgotCQorCiAJLyogU0FWRV9BUkdTIGJlbG93IGlzIHVzZWQgb25seSBmb3IgdGhlIC5jZmkgZGlyZWN0aXZlcyBpdCBjb250YWlucy4gKi8KIAlDRklfU1RBUlRQUk9DCiAJU0FWRV9BUkdTCiByZXN0b3JlOgogCVJFU1RPUkVfQVJHUwotCXJldAkKKwlyZXQKIAlDRklfRU5EUFJPQwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL3VzZXJjb3B5LmMgYi9hcmNoL3g4Ni9saWIvdXNlcmNvcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2JlOWNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvbGliL3VzZXJjb3B5LmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIFVzZXIgYWRkcmVzcyBzcGFjZSBhY2Nlc3MgZnVuY3Rpb25zLgorICoKKyAqICBGb3IgbGljZW5jaW5nIGRldGFpbHMgc2VlIGtlcm5lbC1iYXNlL0NPUFlJTkcKKyAqLworCisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisvKgorICogYmVzdCBlZmZvcnQsIEdVUCBiYXNlZCBjb3B5X2Zyb21fdXNlcigpIHRoYXQgaXMgTk1JLXNhZmUKKyAqLwordW5zaWduZWQgbG9uZworY29weV9mcm9tX3VzZXJfbm1pKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBhZGRyID0gKHVuc2lnbmVkIGxvbmcpZnJvbTsKKwl1bnNpZ25lZCBsb25nIHNpemUsIGxlbiA9IDA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdm9pZCAqbWFwOworCWludCByZXQ7CisKKwlkbyB7CisJCXJldCA9IF9fZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyLCAxLCAwLCAmcGFnZSk7CisJCWlmICghcmV0KQorCQkJYnJlYWs7CisKKwkJb2Zmc2V0ID0gYWRkciAmIChQQUdFX1NJWkUgLSAxKTsKKwkJc2l6ZSA9IG1pbihQQUdFX1NJWkUgLSBvZmZzZXQsIG4gLSBsZW4pOworCisJCW1hcCA9IGttYXBfYXRvbWljKHBhZ2UpOworCQltZW1jcHkodG8sIG1hcCtvZmZzZXQsIHNpemUpOworCQlrdW5tYXBfYXRvbWljKG1hcCk7CisJCXB1dF9wYWdlKHBhZ2UpOworCisJCWxlbiAgKz0gc2l6ZTsKKwkJdG8gICArPSBzaXplOworCQlhZGRyICs9IHNpemU7CisKKwl9IHdoaWxlIChsZW4gPCBuKTsKKworCXJldHVybiBsZW47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjb3B5X2Zyb21fdXNlcl9ubWkpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZmF1bHQuYyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKaW5kZXggMmRiZjZiZi4uNGQwOWRmMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZmF1bHQuYworKysgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCkBAIC0xMDU5LDcgKzEwNTksNyBAQAogCWlmICh1bmxpa2VseShlcnJvcl9jb2RlICYgUEZfUlNWRCkpCiAJCXBndGFibGVfYmFkKHJlZ3MsIGVycm9yX2NvZGUsIGFkZHJlc3MpOwogCi0JcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTLCAxLCAwLCByZWdzLCBhZGRyZXNzKTsKKwlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMsIDEsIHJlZ3MsIGFkZHJlc3MpOwogCiAJLyoKIAkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQsIGhhdmUgbm8gdXNlciBjb250ZXh0IG9yIGFyZSBydW5uaW5nCkBAIC0xMTYxLDExICsxMTYxLDExIEBACiAJaWYgKGZsYWdzICYgRkFVTFRfRkxBR19BTExPV19SRVRSWSkgewogCQlpZiAoZmF1bHQgJiBWTV9GQVVMVF9NQUpPUikgewogCQkJdHNrLT5tYWpfZmx0Kys7Ci0JCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKLCAxLCAwLAorCQkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSiwgMSwKIAkJCQkgICAgICByZWdzLCBhZGRyZXNzKTsKIAkJfSBlbHNlIHsKIAkJCXRzay0+bWluX2ZsdCsrOwotCQkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTiwgMSwgMCwKKwkJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4sIDEsCiAJCQkJICAgICAgcmVncywgYWRkcmVzcyk7CiAJCX0KIAkJaWYgKGZhdWx0ICYgVk1fRkFVTFRfUkVUUlkpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXRfNjQuYyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwppbmRleCBkODY1YzRhLi5iYmFhYTAwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC94ODYvbW0vaW5pdF82NC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG9pc29uLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1vcnlfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L25taS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgpAQCAtODk1LDggKzg5Niw2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfWDg2X1VWCi0jZGVmaW5lIE1JTl9NRU1PUllfQkxPQ0tfU0laRSAgICgxIDw8IFNFQ1RJT05fU0laRV9CSVRTKQotCiB1bnNpZ25lZCBsb25nIG1lbW9yeV9ibG9ja19zaXplX2J5dGVzKHZvaWQpCiB7CiAJaWYgKGlzX3V2X3N5c3RlbSgpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9rbWVtY2hlY2svZXJyb3IuYyBiL2FyY2gveDg2L21tL2ttZW1jaGVjay9lcnJvci5jCmluZGV4IDcwNGEzN2MuLmRhYjQxODcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2ttZW1jaGVjay9lcnJvci5jCisrKyBiL2FyY2gveDg2L21tL2ttZW1jaGVjay9lcnJvci5jCkBAIC0xODUsNyArMTg1LDcgQEAKIAllLT50cmFjZS5lbnRyaWVzID0gZS0+dHJhY2VfZW50cmllczsKIAllLT50cmFjZS5tYXhfZW50cmllcyA9IEFSUkFZX1NJWkUoZS0+dHJhY2VfZW50cmllcyk7CiAJZS0+dHJhY2Uuc2tpcCA9IDA7Ci0Jc2F2ZV9zdGFja190cmFjZV9yZWdzKCZlLT50cmFjZSwgcmVncyk7CisJc2F2ZV9zdGFja190cmFjZV9yZWdzKHJlZ3MsICZlLT50cmFjZSk7CiAKIAkvKiBSb3VuZCBhZGRyZXNzIGRvd24gdG8gbmVhcmVzdCAxNiBieXRlcyAqLwogCXNoYWRvd19jb3B5ID0ga21lbWNoZWNrX3NoYWRvd19sb29rdXAoYWRkcmVzcwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vbWVtYmxvY2suYyBiL2FyY2gveDg2L21tL21lbWJsb2NrLmMKaW5kZXggYWExMTY5My4uOTkyZGE1ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbWVtYmxvY2suYworKysgYi9hcmNoL3g4Ni9tbS9tZW1ibG9jay5jCkBAIC04LDcgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhbmdlLmg+CiAKIC8qIENoZWNrIGZvciBhbHJlYWR5IHJlc2VydmVkIGFyZWFzICovCi1zdGF0aWMgYm9vbCBfX2luaXQgY2hlY2tfd2l0aF9tZW1ibG9ja19yZXNlcnZlZF9zaXplKHU2NCAqYWRkcnAsIHU2NCAqc2l6ZXAsIHU2NCBhbGlnbikKK2Jvb2wgX19pbml0IG1lbWJsb2NrX3g4Nl9jaGVja19yZXNlcnZlZF9zaXplKHU2NCAqYWRkcnAsIHU2NCAqc2l6ZXAsIHU2NCBhbGlnbikKIHsKIAlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyOwogCXU2NCBhZGRyID0gKmFkZHJwLCBsYXN0OwpAQCAtNTksNyArNTksNyBAQAogCQlpZiAoYWRkciA+PSBlaV9sYXN0KQogCQkJY29udGludWU7CiAJCSpzaXplcCA9IGVpX2xhc3QgLSBhZGRyOwotCQl3aGlsZSAoY2hlY2tfd2l0aF9tZW1ibG9ja19yZXNlcnZlZF9zaXplKCZhZGRyLCBzaXplcCwgYWxpZ24pKQorCQl3aGlsZSAobWVtYmxvY2tfeDg2X2NoZWNrX3Jlc2VydmVkX3NpemUoJmFkZHIsIHNpemVwLCBhbGlnbikpCiAJCQk7CiAKIAkJaWYgKCpzaXplcCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL251bWEuYyBiL2FyY2gveDg2L21tL251bWEuYwppbmRleCBmNTUxMGQ4Li5mYmVhYWY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9udW1hLmMKKysrIGIvYXJjaC94ODYvbW0vbnVtYS5jCkBAIC00OTYsNiArNDk2LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgbnVtYV9yZWdpc3Rlcl9tZW1ibGtzKHN0cnVjdCBudW1hX21lbWluZm8gKm1pKQogeworCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIocGZuX2FsaWduKTsKIAlpbnQgaSwgbmlkOwogCiAJLyogQWNjb3VudCBmb3Igbm9kZXMgd2l0aCBjcHVzIGFuZCBubyBtZW1vcnkgKi8KQEAgLTUxMSw2ICs1MTIsMjAgQEAKIAogCS8qIGZvciBvdXQgb2Ygb3JkZXIgZW50cmllcyAqLwogCXNvcnRfbm9kZV9tYXAoKTsKKworCS8qCisJICogSWYgc2VjdGlvbnMgYXJyYXkgaXMgZ29ubmEgYmUgdXNlZCBmb3IgcGZuIC0+IG5pZCBtYXBwaW5nLCBjaGVjaworCSAqIHdoZXRoZXIgaXRzIGdyYW51bGFyaXR5IGlzIGZpbmUgZW5vdWdoLgorCSAqLworI2lmZGVmIE5PREVfTk9UX0lOX1BBR0VfRkxBR1MKKwlwZm5fYWxpZ24gPSBub2RlX21hcF9wZm5fYWxpZ25tZW50KCk7CisJaWYgKHBmbl9hbGlnbiAmJiBwZm5fYWxpZ24gPCBQQUdFU19QRVJfU0VDVElPTikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJOb2RlIGFsaWdubWVudCAlTHVNQiA8IG1pbiAlTHVNQiwgcmVqZWN0aW5nIE5VTUEgY29uZmlnXG4iLAorCQkgICAgICAgUEZOX1BIWVMocGZuX2FsaWduKSA+PiAyMCwKKwkJICAgICAgIFBGTl9QSFlTKFBBR0VTX1BFUl9TRUNUSU9OKSA+PiAyMCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNlbmRpZgogCWlmICghbnVtYV9tZW1pbmZvX2NvdmVyX21lbW9yeShtaSkpCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9udW1hXzMyLmMgYi9hcmNoL3g4Ni9tbS9udW1hXzMyLmMKaW5kZXggODQ5YTk3NS4uM2FkZWJlNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbnVtYV8zMi5jCisrKyBiL2FyY2gveDg2L21tL251bWFfMzIuYwpAQCAtNDEsNyArNDEsNyBAQAogICogICAgIHBoeXNub2RlX21hcFsxNi0zMV0gPSAxOwogICogICAgIHBoeXNub2RlX21hcFszMi0gXSA9IC0xOwogICovCi1zOCBwaHlzbm9kZV9tYXBbTUFYX0VMRU1FTlRTXSBfX3JlYWRfbW9zdGx5ID0geyBbMCAuLi4gKE1BWF9FTEVNRU5UUyAtIDEpXSA9IC0xfTsKK3M4IHBoeXNub2RlX21hcFtNQVhfU0VDVElPTlNdIF9fcmVhZF9tb3N0bHkgPSB7IFswIC4uLiAoTUFYX1NFQ1RJT05TIC0gMSldID0gLTF9OwogRVhQT1JUX1NZTUJPTChwaHlzbm9kZV9tYXApOwogCiB2b2lkIG1lbW9yeV9wcmVzZW50KGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQpAQCAtNTIsOCArNTIsOCBAQAogCQkJbmlkLCBzdGFydCwgZW5kKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiICBTZXR0aW5nIHBoeXNub2RlX21hcCBhcnJheSB0byBub2RlICVkIGZvciBwZm5zOlxuIiwgbmlkKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiICAiKTsKLQlmb3IgKHBmbiA9IHN0YXJ0OyBwZm4gPCBlbmQ7IHBmbiArPSBQQUdFU19QRVJfRUxFTUVOVCkgewotCQlwaHlzbm9kZV9tYXBbcGZuIC8gUEFHRVNfUEVSX0VMRU1FTlRdID0gbmlkOworCWZvciAocGZuID0gc3RhcnQ7IHBmbiA8IGVuZDsgcGZuICs9IFBBR0VTX1BFUl9TRUNUSU9OKSB7CisJCXBoeXNub2RlX21hcFtwZm4gLyBQQUdFU19QRVJfU0VDVElPTl0gPSBuaWQ7CiAJCXByaW50ayhLRVJOX0NPTlQgIiVseCAiLCBwZm4pOwogCX0KIAlwcmludGsoS0VSTl9DT05UICJcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGFnZWF0dHItdGVzdC5jIGIvYXJjaC94ODYvbW0vcGFnZWF0dHItdGVzdC5jCmluZGV4IGUxZDEwNjkuLmIwMDg2NTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3BhZ2VhdHRyLXRlc3QuYworKysgYi9hcmNoL3g4Ni9tbS9wYWdlYXR0ci10ZXN0LmMKQEAgLTEyMywxMiArMTIzLDExIEBACiAJaWYgKHByaW50KQogCQlwcmludGsoS0VSTl9JTkZPICJDUEEgc2VsZi10ZXN0OlxuIik7CiAKLQlibSA9IHZtYWxsb2MoKG1heF9wZm5fbWFwcGVkICsgNykgLyA4KTsKKwlibSA9IHZ6YWxsb2MoKG1heF9wZm5fbWFwcGVkICsgNykgLyA4KTsKIAlpZiAoIWJtKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ1BBIENhbm5vdCB2bWFsbG9jIGJpdG1hcFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoYm0sIDAsIChtYXhfcGZuX21hcHBlZCArIDcpIC8gOCk7CiAKIAlmYWlsZWQgKz0gcHJpbnRfc3BsaXQoJnNhKTsKIAlzcmFuZG9tMzIoMTAwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L29wcm9maWxlL2JhY2t0cmFjZS5jIGIvYXJjaC94ODYvb3Byb2ZpbGUvYmFja3RyYWNlLmMKaW5kZXggYTViNjRhYi4uYmZmODlkZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvb3Byb2ZpbGUvYmFja3RyYWNlLmMKKysrIGIvYXJjaC94ODYvb3Byb2ZpbGUvYmFja3RyYWNlLmMKQEAgLTExLDEwICsxMSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CiAKIHN0YXRpYyBpbnQgYmFja3RyYWNlX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCiB7CkBAIC00MCwxMyArNDEsMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3RhY2tfZnJhbWVfaWEzMiAqCiBkdW1wX3VzZXJfYmFja3RyYWNlXzMyKHN0cnVjdCBzdGFja19mcmFtZV9pYTMyICpoZWFkKQogeworCS8qIEFsc28gY2hlY2sgYWNjZXNzaWJpbGl0eSBvZiBvbmUgc3RydWN0IGZyYW1lX2hlYWQgYmV5b25kOiAqLwogCXN0cnVjdCBzdGFja19mcmFtZV9pYTMyIGJ1ZmhlYWRbMl07CiAJc3RydWN0IHN0YWNrX2ZyYW1lX2lhMzIgKmZwOworCXVuc2lnbmVkIGxvbmcgYnl0ZXM7CiAKLQkvKiBBbHNvIGNoZWNrIGFjY2Vzc2liaWxpdHkgb2Ygb25lIHN0cnVjdCBmcmFtZV9oZWFkIGJleW9uZCAqLwotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBoZWFkLCBzaXplb2YoYnVmaGVhZCkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhidWZoZWFkLCBoZWFkLCBzaXplb2YoYnVmaGVhZCkpKQorCWJ5dGVzID0gY29weV9mcm9tX3VzZXJfbm1pKGJ1ZmhlYWQsIGhlYWQsIHNpemVvZihidWZoZWFkKSk7CisJaWYgKGJ5dGVzICE9IHNpemVvZihidWZoZWFkKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlmcCA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWVfaWEzMiAqKSBjb21wYXRfcHRyKGJ1ZmhlYWRbMF0ubmV4dF9mcmFtZSk7CkBAIC04NywxMiArODgsMTIgQEAKIAogc3RhdGljIHN0cnVjdCBzdGFja19mcmFtZSAqZHVtcF91c2VyX2JhY2t0cmFjZShzdHJ1Y3Qgc3RhY2tfZnJhbWUgKmhlYWQpCiB7CisJLyogQWxzbyBjaGVjayBhY2Nlc3NpYmlsaXR5IG9mIG9uZSBzdHJ1Y3QgZnJhbWVfaGVhZCBiZXlvbmQ6ICovCiAJc3RydWN0IHN0YWNrX2ZyYW1lIGJ1ZmhlYWRbMl07CisJdW5zaWduZWQgbG9uZyBieXRlczsKIAotCS8qIEFsc28gY2hlY2sgYWNjZXNzaWJpbGl0eSBvZiBvbmUgc3RydWN0IHN0YWNrX2ZyYW1lIGJleW9uZCAqLwotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBoZWFkLCBzaXplb2YoYnVmaGVhZCkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhidWZoZWFkLCBoZWFkLCBzaXplb2YoYnVmaGVhZCkpKQorCWJ5dGVzID0gY29weV9mcm9tX3VzZXJfbm1pKGJ1ZmhlYWQsIGhlYWQsIHNpemVvZihidWZoZWFkKSk7CisJaWYgKGJ5dGVzICE9IHNpemVvZihidWZoZWFkKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlvcHJvZmlsZV9hZGRfdHJhY2UoYnVmaGVhZFswXS5yZXR1cm5fYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMKaW5kZXggY2Y5NzUwMC4uNjg4OTRmZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYwpAQCAtMTEyLDggKzExMiwxMCBAQAogc3RhdGljIGludCBubWlfc3RhcnQodm9pZCkKIHsKIAlnZXRfb25saW5lX2NwdXMoKTsKLQlvbl9lYWNoX2NwdShubWlfY3B1X3N0YXJ0LCBOVUxMLCAxKTsKIAljdHJfcnVubmluZyA9IDE7CisJLyogbWFrZSBjdHJfcnVubmluZyB2aXNpYmxlIHRvIHRoZSBubWkgaGFuZGxlcjogKi8KKwlzbXBfbWIoKTsKKwlvbl9lYWNoX2NwdShubWlfY3B1X3N0YXJ0LCBOVUxMLCAxKTsKIAlwdXRfb25saW5lX2NwdXMoKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUwNCwxNSArNTA2LDE4IEBACiAKIAlubWlfZW5hYmxlZCA9IDA7CiAJY3RyX3J1bm5pbmcgPSAwOwotCWJhcnJpZXIoKTsKKwkvKiBtYWtlIHZhcmlhYmxlcyB2aXNpYmxlIHRvIHRoZSBubWkgaGFuZGxlcjogKi8KKwlzbXBfbWIoKTsKIAllcnIgPSByZWdpc3Rlcl9kaWVfbm90aWZpZXIoJnByb2ZpbGVfZXhjZXB0aW9uc19uYik7CiAJaWYgKGVycikKIAkJZ290byBmYWlsOwogCiAJZ2V0X29ubGluZV9jcHVzKCk7CiAJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZvcHJvZmlsZV9jcHVfbmIpOwotCW9uX2VhY2hfY3B1KG5taV9jcHVfc2V0dXAsIE5VTEwsIDEpOwogCW5taV9lbmFibGVkID0gMTsKKwkvKiBtYWtlIG5taV9lbmFibGVkIHZpc2libGUgdG8gdGhlIG5taSBoYW5kbGVyOiAqLworCXNtcF9tYigpOworCW9uX2VhY2hfY3B1KG5taV9jcHVfc2V0dXAsIE5VTEwsIDEpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogCiAJcmV0dXJuIDA7CkBAIC01MzEsNyArNTM2LDggQEAKIAlubWlfZW5hYmxlZCA9IDA7CiAJY3RyX3J1bm5pbmcgPSAwOwogCXB1dF9vbmxpbmVfY3B1cygpOwotCWJhcnJpZXIoKTsKKwkvKiBtYWtlIHZhcmlhYmxlcyB2aXNpYmxlIHRvIHRoZSBubWkgaGFuZGxlcjogKi8KKwlzbXBfbWIoKTsKIAl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigmcHJvZmlsZV9leGNlcHRpb25zX25iKTsKIAltc3JzID0gJmdldF9jcHVfdmFyKGNwdV9tc3JzKTsKIAltb2RlbC0+c2h1dGRvd24obXNycyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hbWQuYyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCmluZGV4IDlmZDhhNTYuLjljYmI3MTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCkBAIC02MDksMTYgKzYwOSwyMSBAQAogCXJldHVybiAwOwogfQogCisvKgorICogVGhpcyBydW5zIG9ubHkgb24gdGhlIGN1cnJlbnQgY3B1LiBXZSB0cnkgdG8gZmluZCBhbiBMVlQgb2Zmc2V0IGFuZAorICogc2V0dXAgdGhlIGxvY2FsIEFQSUMuIEZvciB0aGlzIHdlIG11c3QgZGlzYWJsZSBwcmVlbXB0aW9uLiBPbgorICogc3VjY2VzcyB3ZSBpbml0aWFsaXplIGFsbCBub2RlcyB3aXRoIHRoaXMgb2Zmc2V0LiBUaGlzIHVwZGF0ZXMgdGhlbgorICogdGhlIG9mZnNldCBpbiB0aGUgSUJTX0NUTCBwZXItbm9kZSBtc3IuIFRoZSBwZXItY29yZSBBUElDIHNldHVwIG9mCisgKiB0aGUgSUJTIGludGVycnVwdCB2ZWN0b3IgaXMgY2FsbGVkIGZyb20gb3BfYW1kX3NldHVwX2N0cnMoKS9vcF8tCisgKiBhbWRfY3B1X3NodXRkb3duKCkgdXNpbmcgdGhlIG5ldyBvZmZzZXQuCisgKi8KIHN0YXRpYyBpbnQgZm9yY2VfaWJzX2VpbHZ0X3NldHVwKHZvaWQpCiB7CiAJaW50IG9mZnNldDsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBmaW5kIHRoZSBuZXh0IGZyZWUgYXZhaWxhYmxlIEVJTFZUIGVudHJ5LCBza2lwIG9mZnNldCAwLAotCSAqIHBpbiBzZWFyY2ggdG8gdGhpcyBjcHUKLQkgKi8KIAlwcmVlbXB0X2Rpc2FibGUoKTsKKwkvKiBmaW5kIHRoZSBuZXh0IGZyZWUgYXZhaWxhYmxlIEVJTFZUIGVudHJ5LCBza2lwIG9mZnNldCAwICovCiAJZm9yIChvZmZzZXQgPSAxOyBvZmZzZXQgPCBBUElDX0VJTFZUX05SX01BWDsgb2Zmc2V0KyspIHsKIAkJaWYgKGdldF9laWx2dChvZmZzZXQpKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYWNwaS5jIGIvYXJjaC94ODYvcGNpL2FjcGkuYwppbmRleCAwOTcyMzE1Li42OGMzYzEzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvYWNwaS5jCisrKyBiL2FyY2gveDg2L3BjaS9hY3BpLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQgY29hbGVzY2Vfd2luZG93cyhzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbywgaW50IHR5cGUpCitzdGF0aWMgdm9pZCBjb2FsZXNjZV93aW5kb3dzKHN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIHR5cGUpCiB7CiAJaW50IGksIGo7CiAJc3RydWN0IHJlc291cmNlICpyZXMxLCAqcmVzMjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9tbWNvbmZpZy1zaGFyZWQuYyBiL2FyY2gveDg2L3BjaS9tbWNvbmZpZy1zaGFyZWQuYwppbmRleCA3NTBjMzQ2Li4zMDFlMzI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvbW1jb25maWctc2hhcmVkLmMKKysrIGIvYXJjaC94ODYvcGNpL21tY29uZmlnLXNoYXJlZC5jCkBAIC01MTksNyArNTE5LDggQEAKIAlpZiAoY2ZnLT5hZGRyZXNzIDwgMHhGRkZGRkZGRikKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIXN0cmNtcChtY2ZnLT5oZWFkZXIub2VtX2lkLCAiU0dJIikpCisJaWYgKCFzdHJjbXAobWNmZy0+aGVhZGVyLm9lbV9pZCwgIlNHSSIpIHx8CisJCQkhc3RyY21wKG1jZmctPmhlYWRlci5vZW1faWQsICJTR0kyIikpCiAJCXJldHVybiAwOwogCiAJaWYgKG1jZmctPmhlYWRlci5yZXZpc2lvbiA+PSAxKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kveGVuLmMgYi9hcmNoL3g4Ni9wY2kveGVuLmMKaW5kZXggODIxNDcyNC4uMTAxN2M3YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL3hlbi5jCisrKyBiL2FyY2gveDg2L3BjaS94ZW4uYwpAQCAtMSw4ICsxLDEzIEBACiAvKgotICogWGVuIFBDSSBGcm9udGVuZCBTdHViIC0gcHV0cyBzb21lICJkdW1teSIgZnVuY3Rpb25zIGluIHRvIHRoZSBMaW51eAotICoJCQkgICB4ODYgUENJIGNvcmUgdG8gc3VwcG9ydCB0aGUgWGVuIFBDSSBGcm9udGVuZAorICogWGVuIFBDSSAtIGhhbmRsZSBQQ0kgKElOVHgpIGFuZCBNU0kgaW5mcmFzdHJ1Y3R1cmUgY2FsbHMgZm9yIFBWLCBIVk0gYW5kCisgKiBpbml0aWFsIGRvbWFpbiBzdXBwb3J0LiBXZSBhbHNvIGhhbmRsZSB0aGUgRFNEVCBfUFJUIGNhbGxiYWNrcyBmb3IgR1NJJ3MKKyAqIHVzZWQgaW4gSFZNIGFuZCBpbml0aWFsIGRvbWFpbiBtb2RlIChQViBkb2VzIG5vdCBwYXJzZSBBQ1BJLCBzbyBpdCBoYXMgbm8KKyAqIGNvbmNlcHQgb2YgR1NJcykuIFVuZGVyIFBWIHdlIGhvb2sgdW5kZXIgdGhlIHBuYmJpb3MgQVBJIGZvciBJUlFzIGFuZAorICogMHhjZjggUENJIGNvbmZpZ3VyYXRpb24gcmVhZC93cml0ZS4KICAqCiAgKiAgIEF1dGhvcjogUnlhbiBXaWxzb24gPGhhcDlAZXBvY2gubmNzYy5taWw+CisgKiAgICAgICAgICAgS29ucmFkIFJ6ZXN6dXRlayBXaWxrIDxrb25yYWQud2lsa0BvcmFjbGUuY29tPgorICogICAgICAgICAgIFN0ZWZhbm8gU3RhYmVsbGluaSA8c3RlZmFuby5zdGFiZWxsaW5pQGV1LmNpdHJpeC5jb20+CiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xOSwyMiArMjQsNTMgQEAKICNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9wY2kuaD4KIAotI2lmZGVmIENPTkZJR19BQ1BJCi1zdGF0aWMgaW50IGFjcGlfcmVnaXN0ZXJfZ3NpX3hlbl9odm0oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgZ3NpLAotCQkJCSBpbnQgdHJpZ2dlciwgaW50IHBvbGFyaXR5KQorc3RhdGljIGludCB4ZW5fcGNpZnJvbnRfZW5hYmxlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWludCByYywgaXJxOworCWludCByYzsKKwlpbnQgc2hhcmUgPSAxOworCWludCBwaXJxOworCXU4IGdzaTsKKworCXJjID0gcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZnc2kpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiWGVuIFBDSTogZmFpbGVkIHRvIHJlYWQgaW50ZXJydXB0IGxpbmU6ICVkXG4iLAorCQkJIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKwkvKiBJbiBQViBEb21VIHRoZSBYZW4gUENJIGJhY2tlbmQgcHV0cyB0aGUgUElSUSBpbiB0aGUgaW50ZXJydXB0IGxpbmUuKi8KKwlwaXJxID0gZ3NpOworCisJaWYgKGdzaSA8IE5SX0lSUVNfTEVHQUNZKQorCQlzaGFyZSA9IDA7CisKKwlyYyA9IHhlbl9iaW5kX3BpcnFfZ3NpX3RvX2lycShnc2ksIHBpcnEsIHNoYXJlLCAicGNpZnJvbnQiKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl93YXJuKCZkZXYtPmRldiwgIlhlbiBQQ0k6IGZhaWxlZCB0byBiaW5kIEdTSSVkIChQSVJRJWQpIHRvIElSUTogJWRcbiIsCisJCQkgZ3NpLCBwaXJxLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlkZXYtPmlycSA9IHJjOworCWRldl9pbmZvKCZkZXYtPmRldiwgIlhlbiBQQ0kgbWFwcGVkIEdTSSVkIHRvIElSUSVkXG4iLCBnc2ksIGRldi0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgaW50IHhlbl9yZWdpc3Rlcl9waXJxKHUzMiBnc2ksIGludCBnc2lfb3ZlcnJpZGUsIGludCB0cmlnZ2VyaW5nLAorCQkJICAgICBib29sIHNldF9waXJxKQoreworCWludCByYywgcGlycSA9IC0xLCBpcnEgPSAtMTsKIAlzdHJ1Y3QgcGh5c2Rldl9tYXBfcGlycSBtYXBfaXJxOwogCWludCBzaGFyZWFibGUgPSAwOwogCWNoYXIgKm5hbWU7CiAKLQlpZiAoIXhlbl9odm1fZG9tYWluKCkpCi0JCXJldHVybiAtMTsKKwlpZiAoc2V0X3BpcnEpCisJCXBpcnEgPSBnc2k7CiAKIAltYXBfaXJxLmRvbWlkID0gRE9NSURfU0VMRjsKIAltYXBfaXJxLnR5cGUgPSBNQVBfUElSUV9UWVBFX0dTSTsKIAltYXBfaXJxLmluZGV4ID0gZ3NpOwotCW1hcF9pcnEucGlycSA9IC0xOworCW1hcF9pcnEucGlycSA9IHBpcnE7CiAKIAlyYyA9IEhZUEVSVklTT1JfcGh5c2Rldl9vcChQSFlTREVWT1BfbWFwX3BpcnEsICZtYXBfaXJxKTsKIAlpZiAocmMpIHsKQEAgLTQyLDcgKzc4LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmICh0cmlnZ2VyID09IEFDUElfRURHRV9TRU5TSVRJVkUpIHsKKwlpZiAodHJpZ2dlcmluZyA9PSBBQ1BJX0VER0VfU0VOU0lUSVZFKSB7CiAJCXNoYXJlYWJsZSA9IDA7CiAJCW5hbWUgPSAiaW9hcGljLWVkZ2UiOwogCX0gZWxzZSB7CkBAIC01MCwxMiArODYsNjMgQEAKIAkJbmFtZSA9ICJpb2FwaWMtbGV2ZWwiOwogCX0KIAotCWlycSA9IHhlbl9iaW5kX3BpcnFfZ3NpX3RvX2lycShnc2ksIG1hcF9pcnEucGlycSwgc2hhcmVhYmxlLCBuYW1lKTsKKwlpZiAoZ3NpX292ZXJyaWRlID49IDApCisJCWdzaSA9IGdzaV9vdmVycmlkZTsKIAotCXByaW50ayhLRVJOX0RFQlVHICJ4ZW46IC0tPiBpcnE9JWQsIHBpcnE9JWRcbiIsIGlycSwgbWFwX2lycS5waXJxKTsKKwlpcnEgPSB4ZW5fYmluZF9waXJxX2dzaV90b19pcnEoZ3NpLCBtYXBfaXJxLnBpcnEsIHNoYXJlYWJsZSwgbmFtZSk7CisJaWYgKGlycSA8IDApCisJCWdvdG8gb3V0OworCisJcHJpbnRrKEtFUk5fREVCVUcgInhlbjogLS0+IHBpcnE9JWQgLT4gaXJxPSVkIChnc2k9JWQpXG4iLCBtYXBfaXJxLnBpcnEsIGlycSwgZ3NpKTsKK291dDoKKwlyZXR1cm4gaXJxOworfQorCitzdGF0aWMgaW50IGFjcGlfcmVnaXN0ZXJfZ3NpX3hlbl9odm0oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgZ3NpLAorCQkJCSAgICAgaW50IHRyaWdnZXIsIGludCBwb2xhcml0eSkKK3sKKwlpZiAoIXhlbl9odm1fZG9tYWluKCkpCisJCXJldHVybiAtMTsKKworCXJldHVybiB4ZW5fcmVnaXN0ZXJfcGlycShnc2ksIC0xIC8qIG5vIEdTSSBvdmVycmlkZSAqLywgdHJpZ2dlciwKKwkJCQkgZmFsc2UgLyogbm8gbWFwcGluZyBvZiBHU0kgdG8gUElSUSAqLyk7Cit9CisKKyNpZmRlZiBDT05GSUdfWEVOX0RPTTAKK3N0YXRpYyBpbnQgeGVuX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgZ3NpX292ZXJyaWRlLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQoreworCWludCByYywgaXJxOworCXN0cnVjdCBwaHlzZGV2X3NldHVwX2dzaSBzZXR1cF9nc2k7CisKKwlpZiAoIXhlbl9wdl9kb21haW4oKSkKKwkJcmV0dXJuIC0xOworCisJcHJpbnRrKEtFUk5fREVCVUcgInhlbjogcmVnaXN0ZXJpbmcgZ3NpICV1IHRyaWdnZXJpbmcgJWQgcG9sYXJpdHkgJWRcbiIsCisJCQlnc2ksIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKKworCWlycSA9IHhlbl9yZWdpc3Rlcl9waXJxKGdzaSwgZ3NpX292ZXJyaWRlLCB0cmlnZ2VyaW5nLCB0cnVlKTsKKworCXNldHVwX2dzaS5nc2kgPSBnc2k7CisJc2V0dXBfZ3NpLnRyaWdnZXJpbmcgPSAodHJpZ2dlcmluZyA9PSBBQ1BJX0VER0VfU0VOU0lUSVZFID8gMCA6IDEpOworCXNldHVwX2dzaS5wb2xhcml0eSA9IChwb2xhcml0eSA9PSBBQ1BJX0FDVElWRV9ISUdIID8gMCA6IDEpOworCisJcmMgPSBIWVBFUlZJU09SX3BoeXNkZXZfb3AoUEhZU0RFVk9QX3NldHVwX2dzaSwgJnNldHVwX2dzaSk7CisJaWYgKHJjID09IC1FRVhJU1QpCisJCXByaW50ayhLRVJOX0lORk8gIkFscmVhZHkgc2V0dXAgdGhlIEdTSSA6JWRcbiIsIGdzaSk7CisJZWxzZSBpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2V0dXAgR1NJIDolZCwgZXJyX2NvZGU6JWRcbiIsCisJCQkJZ3NpLCByYyk7CisJfQogCiAJcmV0dXJuIGlycTsKIH0KKworc3RhdGljIGludCBhY3BpX3JlZ2lzdGVyX2dzaV94ZW4oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgZ3NpLAorCQkJCSBpbnQgdHJpZ2dlciwgaW50IHBvbGFyaXR5KQoreworCXJldHVybiB4ZW5fcmVnaXN0ZXJfZ3NpKGdzaSwgLTEgLyogbm8gR1NJIG92ZXJyaWRlICovLCB0cmlnZ2VyLCBwb2xhcml0eSk7Cit9CisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfUENJX01TSSkKQEAgLTY1LDYgKzE1Miw0MyBAQAogc3RydWN0IHhlbl9wY2lfZnJvbnRlbmRfb3BzICp4ZW5fcGNpX2Zyb250ZW5kOwogRVhQT1JUX1NZTUJPTF9HUEwoeGVuX3BjaV9mcm9udGVuZCk7CiAKK3N0YXRpYyBpbnQgeGVuX3NldHVwX21zaV9pcnFzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBudmVjLCBpbnQgdHlwZSkKK3sKKwlpbnQgaXJxLCByZXQsIGk7CisJc3RydWN0IG1zaV9kZXNjICptc2lkZXNjOworCWludCAqdjsKKworCXYgPSBremFsbG9jKHNpemVvZihpbnQpICogbWF4KDEsIG52ZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHR5cGUgPT0gUENJX0NBUF9JRF9NU0lYKQorCQlyZXQgPSB4ZW5fcGNpX2Zyb250ZW5kX2VuYWJsZV9tc2l4KGRldiwgdiwgbnZlYyk7CisJZWxzZQorCQlyZXQgPSB4ZW5fcGNpX2Zyb250ZW5kX2VuYWJsZV9tc2koZGV2LCB2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCWkgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkobXNpZGVzYywgJmRldi0+bXNpX2xpc3QsIGxpc3QpIHsKKwkJaXJxID0geGVuX2JpbmRfcGlycV9tc2lfdG9faXJxKGRldiwgbXNpZGVzYywgdltpXSwgMCwKKwkJCQkJICAgICAgICh0eXBlID09IFBDSV9DQVBfSURfTVNJWCkgPworCQkJCQkgICAgICAgInBjaWZyb250LW1zaS14IiA6CisJCQkJCSAgICAgICAicGNpZnJvbnQtbXNpIiwKKwkJCQkJCURPTUlEX1NFTEYpOworCQlpZiAoaXJxIDwgMCkKKwkJCWdvdG8gZnJlZTsKKwkJaSsrOworCX0KKwlrZnJlZSh2KTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZGV2X2VycigmZGV2LT5kZXYsICJYZW4gUENJIGZyb250ZW5kIGhhcyBub3QgcmVnaXN0ZXJlZCBNU0kvTVNJLVggc3VwcG9ydCFcbiIpOworZnJlZToKKwlrZnJlZSh2KTsKKwlyZXR1cm4gcmV0OworfQorCiAjZGVmaW5lIFhFTl9QSVJRX01TSV9EQVRBICAoTVNJX0RBVEFfVFJJR0dFUl9FREdFIHwgXAogCQlNU0lfREFUQV9MRVZFTF9BU1NFUlQgfCAoMyA8PCA4KSB8IE1TSV9EQVRBX1ZFQ1RPUigwKSkKIApAQCAtMTIzLDY3ICsyNDcsNiBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi0vKgotICogRm9yIE1TSSBpbnRlcnJ1cHRzIHdlIGhhdmUgdG8gdXNlIGRyaXZlcnMveGVuL2V2ZW50LnMgZnVuY3Rpb25zIHRvCi0gKiBhbGxvY2F0ZSBhbiBpcnFfZGVzYyBhbmQgc2V0dXAgdGhlIHJpZ2h0ICovCi0KLQotc3RhdGljIGludCB4ZW5fc2V0dXBfbXNpX2lycXMoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG52ZWMsIGludCB0eXBlKQotewotCWludCBpcnEsIHJldCwgaTsKLQlzdHJ1Y3QgbXNpX2Rlc2MgKm1zaWRlc2M7Ci0JaW50ICp2OwotCi0JdiA9IGt6YWxsb2Moc2l6ZW9mKGludCkgKiBtYXgoMSwgbnZlYyksIEdGUF9LRVJORUwpOwotCWlmICghdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAodHlwZSA9PSBQQ0lfQ0FQX0lEX01TSVgpCi0JCXJldCA9IHhlbl9wY2lfZnJvbnRlbmRfZW5hYmxlX21zaXgoZGV2LCB2LCBudmVjKTsKLQllbHNlCi0JCXJldCA9IHhlbl9wY2lfZnJvbnRlbmRfZW5hYmxlX21zaShkZXYsIHYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0JaSA9IDA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShtc2lkZXNjLCAmZGV2LT5tc2lfbGlzdCwgbGlzdCkgewotCQlpcnEgPSB4ZW5fYmluZF9waXJxX21zaV90b19pcnEoZGV2LCBtc2lkZXNjLCB2W2ldLCAwLAotCQkJCQkgICAgICAgKHR5cGUgPT0gUENJX0NBUF9JRF9NU0lYKSA/Ci0JCQkJCSAgICAgICAicGNpZnJvbnQtbXNpLXgiIDoKLQkJCQkJICAgICAgICJwY2lmcm9udC1tc2kiLAotCQkJCQkJRE9NSURfU0VMRik7Ci0JCWlmIChpcnEgPCAwKQotCQkJZ290byBmcmVlOwotCQlpKys7Ci0JfQotCWtmcmVlKHYpOwotCXJldHVybiAwOwotCi1lcnJvcjoKLQlkZXZfZXJyKCZkZXYtPmRldiwgIlhlbiBQQ0kgZnJvbnRlbmQgaGFzIG5vdCByZWdpc3RlcmVkIE1TSS9NU0ktWCBzdXBwb3J0IVxuIik7Ci1mcmVlOgotCWtmcmVlKHYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl90ZWFyZG93bl9tc2lfaXJxcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBtc2lfZGVzYyAqbXNpZGVzYzsKLQotCW1zaWRlc2MgPSBsaXN0X2VudHJ5KGRldi0+bXNpX2xpc3QubmV4dCwgc3RydWN0IG1zaV9kZXNjLCBsaXN0KTsKLQlpZiAobXNpZGVzYy0+bXNpX2F0dHJpYi5pc19tc2l4KQotCQl4ZW5fcGNpX2Zyb250ZW5kX2Rpc2FibGVfbXNpeChkZXYpOwotCWVsc2UKLQkJeGVuX3BjaV9mcm9udGVuZF9kaXNhYmxlX21zaShkZXYpOwotCi0JLyogRnJlZSB0aGUgSVJRJ3MgYW5kIHRoZSBtc2lkZXNjIHVzaW5nIHRoZSBnZW5lcmljIGNvZGUuICovCi0JZGVmYXVsdF90ZWFyZG93bl9tc2lfaXJxcyhkZXYpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fdGVhcmRvd25fbXNpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXhlbl9kZXN0cm95X2lycShpcnEpOwotfQotCiAjaWZkZWYgQ09ORklHX1hFTl9ET00wCiBzdGF0aWMgaW50IHhlbl9pbml0ZG9tX3NldHVwX21zaV9pcnFzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBudmVjLCBpbnQgdHlwZSkKIHsKQEAgLTI0Miw0NSArMzA1LDI4IEBACiAJcmV0dXJuIHJldDsKIH0KICNlbmRpZgotI2VuZGlmCiAKLXN0YXRpYyBpbnQgeGVuX3BjaWZyb250X2VuYWJsZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB2b2lkIHhlbl90ZWFyZG93bl9tc2lfaXJxcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWludCByYzsKLQlpbnQgc2hhcmUgPSAxOwotCWludCBwaXJxOwotCXU4IGdzaTsKKwlzdHJ1Y3QgbXNpX2Rlc2MgKm1zaWRlc2M7CiAKLQlyYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAmZ3NpKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWRldl93YXJuKCZkZXYtPmRldiwgIlhlbiBQQ0k6IGZhaWxlZCB0byByZWFkIGludGVycnVwdCBsaW5lOiAlZFxuIiwKLQkJCSByYyk7Ci0JCXJldHVybiByYzsKLQl9CisJbXNpZGVzYyA9IGxpc3RfZW50cnkoZGV2LT5tc2lfbGlzdC5uZXh0LCBzdHJ1Y3QgbXNpX2Rlc2MsIGxpc3QpOworCWlmIChtc2lkZXNjLT5tc2lfYXR0cmliLmlzX21zaXgpCisJCXhlbl9wY2lfZnJvbnRlbmRfZGlzYWJsZV9tc2l4KGRldik7CisJZWxzZQorCQl4ZW5fcGNpX2Zyb250ZW5kX2Rpc2FibGVfbXNpKGRldik7CiAKLQlyYyA9IHhlbl9hbGxvY2F0ZV9waXJxX2dzaShnc2kpOwotCWlmIChyYyA8IDApIHsKLQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiWGVuIFBDSTogZmFpbGVkIHRvIGFsbG9jYXRlIGEgUElSUSBmb3IgR1NJJWQ6ICVkXG4iLAotCQkJIGdzaSwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCXBpcnEgPSByYzsKLQotCWlmIChnc2kgPCBOUl9JUlFTX0xFR0FDWSkKLQkJc2hhcmUgPSAwOwotCi0JcmMgPSB4ZW5fYmluZF9waXJxX2dzaV90b19pcnEoZ3NpLCBwaXJxLCBzaGFyZSwgInBjaWZyb250Iik7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZfd2FybigmZGV2LT5kZXYsICJYZW4gUENJOiBmYWlsZWQgdG8gYmluZCBHU0klZCAoUElSUSVkKSB0byBJUlE6ICVkXG4iLAotCQkJIGdzaSwgcGlycSwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JZGV2LT5pcnEgPSByYzsKLQlkZXZfaW5mbygmZGV2LT5kZXYsICJYZW4gUENJIG1hcHBlZCBHU0klZCB0byBJUlElZFxuIiwgZ3NpLCBkZXYtPmlycSk7Ci0JcmV0dXJuIDA7CisJLyogRnJlZSB0aGUgSVJRJ3MgYW5kIHRoZSBtc2lkZXNjIHVzaW5nIHRoZSBnZW5lcmljIGNvZGUuICovCisJZGVmYXVsdF90ZWFyZG93bl9tc2lfaXJxcyhkZXYpOwogfQogCitzdGF0aWMgdm9pZCB4ZW5fdGVhcmRvd25fbXNpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXhlbl9kZXN0cm95X2lycShpcnEpOworfQorCisjZW5kaWYKKwogaW50IF9faW5pdCBwY2lfeGVuX2luaXQodm9pZCkKIHsKIAlpZiAoIXhlbl9wdl9kb21haW4oKSB8fCB4ZW5faW5pdGlhbF9kb21haW4oKSkKQEAgLTMyNyw4MiArMzczLDEzIEBACiB9CiAKICNpZmRlZiBDT05GSUdfWEVOX0RPTTAKLXN0YXRpYyBpbnQgeGVuX3JlZ2lzdGVyX3BpcnEodTMyIGdzaSwgaW50IHRyaWdnZXJpbmcpCi17Ci0JaW50IHJjLCBwaXJxLCBpcnEgPSAtMTsKLQlzdHJ1Y3QgcGh5c2Rldl9tYXBfcGlycSBtYXBfaXJxOwotCWludCBzaGFyZWFibGUgPSAwOwotCWNoYXIgKm5hbWU7Ci0KLQlpZiAoIXhlbl9wdl9kb21haW4oKSkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKHRyaWdnZXJpbmcgPT0gQUNQSV9FREdFX1NFTlNJVElWRSkgewotCQlzaGFyZWFibGUgPSAwOwotCQluYW1lID0gImlvYXBpYy1lZGdlIjsKLQl9IGVsc2UgewotCQlzaGFyZWFibGUgPSAxOwotCQluYW1lID0gImlvYXBpYy1sZXZlbCI7Ci0JfQotCi0JcGlycSA9IHhlbl9hbGxvY2F0ZV9waXJxX2dzaShnc2kpOwotCWlmIChwaXJxIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQlpcnEgPSB4ZW5fYmluZF9waXJxX2dzaV90b19pcnEoZ3NpLCBwaXJxLCBzaGFyZWFibGUsIG5hbWUpOwotCWlmIChpcnEgPCAwKQotCQlnb3RvIG91dDsKLQotCXByaW50ayhLRVJOX0RFQlVHICJ4ZW46IC0tPiBwaXJxPSVkIC0+IGlycT0lZFxuIiwgcGlycSwgaXJxKTsKLQotCW1hcF9pcnEuZG9taWQgPSBET01JRF9TRUxGOwotCW1hcF9pcnEudHlwZSA9IE1BUF9QSVJRX1RZUEVfR1NJOwotCW1hcF9pcnEuaW5kZXggPSBnc2k7Ci0JbWFwX2lycS5waXJxID0gcGlycTsKLQotCXJjID0gSFlQRVJWSVNPUl9waHlzZGV2X29wKFBIWVNERVZPUF9tYXBfcGlycSwgJm1hcF9pcnEpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4ZW4gbWFwIGlycSBmYWlsZWQgJWRcbiIsIHJjKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotb3V0OgotCXJldHVybiBpcnE7Ci19Ci0KLXN0YXRpYyBpbnQgeGVuX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQotewotCWludCByYywgaXJxOwotCXN0cnVjdCBwaHlzZGV2X3NldHVwX2dzaSBzZXR1cF9nc2k7Ci0KLQlpZiAoIXhlbl9wdl9kb21haW4oKSkKLQkJcmV0dXJuIC0xOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgInhlbjogcmVnaXN0ZXJpbmcgZ3NpICV1IHRyaWdnZXJpbmcgJWQgcG9sYXJpdHkgJWRcbiIsCi0JCQlnc2ksIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKLQotCWlycSA9IHhlbl9yZWdpc3Rlcl9waXJxKGdzaSwgdHJpZ2dlcmluZyk7Ci0KLQlzZXR1cF9nc2kuZ3NpID0gZ3NpOwotCXNldHVwX2dzaS50cmlnZ2VyaW5nID0gKHRyaWdnZXJpbmcgPT0gQUNQSV9FREdFX1NFTlNJVElWRSA/IDAgOiAxKTsKLQlzZXR1cF9nc2kucG9sYXJpdHkgPSAocG9sYXJpdHkgPT0gQUNQSV9BQ1RJVkVfSElHSCA/IDAgOiAxKTsKLQotCXJjID0gSFlQRVJWSVNPUl9waHlzZGV2X29wKFBIWVNERVZPUF9zZXR1cF9nc2ksICZzZXR1cF9nc2kpOwotCWlmIChyYyA9PSAtRUVYSVNUKQotCQlwcmludGsoS0VSTl9JTkZPICJBbHJlYWR5IHNldHVwIHRoZSBHU0kgOiVkXG4iLCBnc2kpOwotCWVsc2UgaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNldHVwIEdTSSA6JWQsIGVycl9jb2RlOiVkXG4iLAotCQkJCWdzaSwgcmMpOwotCX0KLQotCXJldHVybiBpcnE7Ci19Ci0KIHN0YXRpYyBfX2luaXQgdm9pZCB4ZW5fc2V0dXBfYWNwaV9zY2kodm9pZCkKIHsKIAlpbnQgcmM7CiAJaW50IHRyaWdnZXIsIHBvbGFyaXR5OwogCWludCBnc2kgPSBhY3BpX3NjaV9vdmVycmlkZV9nc2k7CisJaW50IGlycSA9IC0xOworCWludCBnc2lfb3ZlcnJpZGUgPSAtMTsKIAogCWlmICghZ3NpKQogCQlyZXR1cm47CkBAIC00MTUsNTEgKzM5Miw0MyBAQAogCX0KIAl0cmlnZ2VyID0gdHJpZ2dlciA/IEFDUElfTEVWRUxfU0VOU0lUSVZFIDogQUNQSV9FREdFX1NFTlNJVElWRTsKIAlwb2xhcml0eSA9IHBvbGFyaXR5ID8gQUNQSV9BQ1RJVkVfTE9XIDogQUNQSV9BQ1RJVkVfSElHSDsKLQkKKwogCXByaW50ayhLRVJOX0lORk8gInhlbjogc2NpIG92ZXJyaWRlOiBnbG9iYWxfaXJxPSVkIHRyaWdnZXI9JWQgIgogCQkJInBvbGFyaXR5PSVkXG4iLCBnc2ksIHRyaWdnZXIsIHBvbGFyaXR5KTsKIAotCWdzaSA9IHhlbl9yZWdpc3Rlcl9nc2koZ3NpLCB0cmlnZ2VyLCBwb2xhcml0eSk7CisJLyogQmVmb3JlIHdlIGJpbmQgdGhlIEdTSSB0byBhIExpbnV4IElSUSwgY2hlY2sgd2hldGhlcgorCSAqIHdlIG5lZWQgdG8gb3ZlcnJpZGUgaXQgd2l0aCBidXNfaXJxIChJUlEpIHZhbHVlLiBVc3VhbGx5IGZvcgorCSAqIElSUXMgYmVsb3cgSVJRX0xFR0FDWV9JUlEgdGhpcyBob2xkcyBJUlEgPT0gR1NJLCBhcyBzbzoKKwkgKiAgQUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19pcnEgOSBnbG9iYWxfaXJxIDkgbG93IGxldmVsKQorCSAqIGJ1dCB0aGVyZSBhcmUgb2RkYmFsbHMgd2hlcmUgdGhlIElSUSAhPSBHU0k6CisJICogIEFDUEk6IElOVF9TUkNfT1ZSIChidXMgMCBidXNfaXJxIDkgZ2xvYmFsX2lycSAyMCBsb3cgbGV2ZWwpCisJICogd2hpY2ggZW5kcyB1cCBiZWluZzogZ3NpX3RvX2lycVs5XSA9PSAyMAorCSAqICh3aGljaCBpcyB3aGF0IGFjcGlfZ3NpX3RvX2lycSBlbmRzIHVwIGNhbGxpbmcgd2hlbiBzdGFydGluZyB0aGUKKwkgKiB0aGUgQUNQSSBpbnRlcnByZXRlciBhbmQga2VlbHMgb3ZlciBzaW5jZSBJUlEgOSBoYXMgbm90IGJlZW4KKwkgKiBzZXR1cCBhcyB3ZSBoYWQgc2V0dXAgSVJRIDIwIGZvciBpdCkuCisJICovCisJaWYgKGFjcGlfZ3NpX3RvX2lycShnc2ksICZpcnEpID09IDApIHsKKwkJLyogVXNlIHRoZSBwcm92aWRlZCB2YWx1ZSBpZiBpdCdzIHZhbGlkLiAqLworCQlpZiAoaXJxID49IDApCisJCQlnc2lfb3ZlcnJpZGUgPSBpcnE7CisJfQorCisJZ3NpID0geGVuX3JlZ2lzdGVyX2dzaShnc2ksIGdzaV9vdmVycmlkZSwgdHJpZ2dlciwgcG9sYXJpdHkpOwogCXByaW50ayhLRVJOX0lORk8gInhlbjogYWNwaSBzY2kgJWRcbiIsIGdzaSk7CiAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9yZWdpc3Rlcl9nc2lfeGVuKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGdzaSwKLQkJCQkgaW50IHRyaWdnZXIsIGludCBwb2xhcml0eSkKK2ludCBfX2luaXQgcGNpX3hlbl9pbml0aWFsX2RvbWFpbih2b2lkKQogewotCXJldHVybiB4ZW5fcmVnaXN0ZXJfZ3NpKGdzaSwgdHJpZ2dlciwgcG9sYXJpdHkpOwotfQorCWludCBpcnE7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBjaV94ZW5faW5pdGlhbF9kb21haW4odm9pZCkKLXsKICNpZmRlZiBDT05GSUdfUENJX01TSQogCXg4Nl9tc2kuc2V0dXBfbXNpX2lycXMgPSB4ZW5faW5pdGRvbV9zZXR1cF9tc2lfaXJxczsKIAl4ODZfbXNpLnRlYXJkb3duX21zaV9pcnEgPSB4ZW5fdGVhcmRvd25fbXNpX2lycTsKICNlbmRpZgogCXhlbl9zZXR1cF9hY3BpX3NjaSgpOwogCV9fYWNwaV9yZWdpc3Rlcl9nc2kgPSBhY3BpX3JlZ2lzdGVyX2dzaV94ZW47Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBfX2luaXQgeGVuX3NldHVwX3BpcnFzKHZvaWQpCi17Ci0JaW50IHBpcnEsIGlycTsKLQotCXBjaV94ZW5faW5pdGlhbF9kb21haW4oKTsKLQotCWlmICgwID09IG5yX2lvYXBpY3MpIHsKLQkJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTX0xFR0FDWTsgaXJxKyspIHsKLQkJCXBpcnEgPSB4ZW5fYWxsb2NhdGVfcGlycV9nc2koaXJxKTsKLQkJCWlmIChXQVJOKHBpcnEgPCAwLAotCQkJCSAiQ291bGQgbm90IGFsbG9jYXRlIFBJUlEgZm9yIGxlZ2FjeSBpbnRlcnJ1cHRcbiIpKQotCQkJCWJyZWFrOwotCQkJaXJxID0geGVuX2JpbmRfcGlycV9nc2lfdG9faXJxKGlycSwgcGlycSwgMCwgInh0LXBpYyIpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KIAkvKiBQcmUtYWxsb2NhdGUgbGVnYWN5IGlycXMgKi8KIAlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVNfTEVHQUNZOyBpcnErKykgewogCQlpbnQgdHJpZ2dlciwgcG9sYXJpdHk7CkBAIC00NjcsMTMgKzQzNiwxNyBAQAogCQlpZiAoYWNwaV9nZXRfb3ZlcnJpZGVfaXJxKGlycSwgJnRyaWdnZXIsICZwb2xhcml0eSkgPT0gLTEpCiAJCQljb250aW51ZTsKIAotCQl4ZW5fcmVnaXN0ZXJfcGlycShpcnEsCi0JCQl0cmlnZ2VyID8gQUNQSV9MRVZFTF9TRU5TSVRJVkUgOiBBQ1BJX0VER0VfU0VOU0lUSVZFKTsKKwkJeGVuX3JlZ2lzdGVyX3BpcnEoaXJxLCAtMSAvKiBubyBHU0kgb3ZlcnJpZGUgKi8sCisJCQl0cmlnZ2VyID8gQUNQSV9MRVZFTF9TRU5TSVRJVkUgOiBBQ1BJX0VER0VfU0VOU0lUSVZFLAorCQkJdHJ1ZSAvKiBNYXAgR1NJIHRvIFBJUlEgKi8pOwogCX0KKwlpZiAoMCA9PSBucl9pb2FwaWNzKSB7CisJCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfSVJRU19MRUdBQ1k7IGlycSsrKQorCQkJeGVuX2JpbmRfcGlycV9nc2lfdG9faXJxKGlycSwgaXJxLCAwLCAieHQtcGljIik7CisJfQorCXJldHVybiAwOwogfQotI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfWEVOX0RPTTAKIHN0cnVjdCB4ZW5fZGV2aWNlX2RvbWFpbl9vd25lciB7CiAJZG9taWRfdCBkb21haW47CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYwppbmRleCAwZDNhNGZhLi4zYWU0MTI4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCkBAIC01MSw3ICs1MSwxNyBAQAogaW50IGVmaV9lbmFibGVkOwogRVhQT1JUX1NZTUJPTChlZmlfZW5hYmxlZCk7CiAKLXN0cnVjdCBlZmkgZWZpOworc3RydWN0IGVmaSBfX3JlYWRfbW9zdGx5IGVmaSA9IHsKKwkubXBzICAgICAgICA9IEVGSV9JTlZBTElEX1RBQkxFX0FERFIsCisJLmFjcGkgICAgICAgPSBFRklfSU5WQUxJRF9UQUJMRV9BRERSLAorCS5hY3BpMjAgICAgID0gRUZJX0lOVkFMSURfVEFCTEVfQUREUiwKKwkuc21iaW9zICAgICA9IEVGSV9JTlZBTElEX1RBQkxFX0FERFIsCisJLnNhbF9zeXN0YWIgPSBFRklfSU5WQUxJRF9UQUJMRV9BRERSLAorCS5ib290X2luZm8gID0gRUZJX0lOVkFMSURfVEFCTEVfQUREUiwKKwkuaGNkcCAgICAgICA9IEVGSV9JTlZBTElEX1RBQkxFX0FERFIsCisJLnVnYSAgICAgICAgPSBFRklfSU5WQUxJRF9UQUJMRV9BRERSLAorCS51dl9zeXN0YWIgID0gRUZJX0lOVkFMSURfVEFCTEVfQUREUiwKK307CiBFWFBPUlRfU1lNQk9MKGVmaSk7CiAKIHN0cnVjdCBlZmlfbWVtb3J5X21hcCBtZW1tYXA7CkBAIC03OSwyNiArODksNTAgQEAKIAogc3RhdGljIGVmaV9zdGF0dXNfdCB2aXJ0X2VmaV9nZXRfdGltZShlZmlfdGltZV90ICp0bSwgZWZpX3RpbWVfY2FwX3QgKnRjKQogewotCXJldHVybiBlZmlfY2FsbF92aXJ0MihnZXRfdGltZSwgdG0sIHRjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0MihnZXRfdGltZSwgdG0sIHRjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCXJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXRpYyBlZmlfc3RhdHVzX3QgdmlydF9lZmlfc2V0X3RpbWUoZWZpX3RpbWVfdCAqdG0pCiB7Ci0JcmV0dXJuIGVmaV9jYWxsX3ZpcnQxKHNldF90aW1lLCB0bSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJc3RhdHVzID0gZWZpX2NhbGxfdmlydDEoc2V0X3RpbWUsIHRtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCXJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXRpYyBlZmlfc3RhdHVzX3QgdmlydF9lZmlfZ2V0X3dha2V1cF90aW1lKGVmaV9ib29sX3QgKmVuYWJsZWQsCiAJCQkJCSAgICAgZWZpX2Jvb2xfdCAqcGVuZGluZywKIAkJCQkJICAgICBlZmlfdGltZV90ICp0bSkKIHsKLQlyZXR1cm4gZWZpX2NhbGxfdmlydDMoZ2V0X3dha2V1cF90aW1lLAotCQkJICAgICAgZW5hYmxlZCwgcGVuZGluZywgdG0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQzKGdldF93YWtldXBfdGltZSwKKwkJCQllbmFibGVkLCBwZW5kaW5nLCB0bSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgZWZpX3N0YXR1c190IHZpcnRfZWZpX3NldF93YWtldXBfdGltZShlZmlfYm9vbF90IGVuYWJsZWQsIGVmaV90aW1lX3QgKnRtKQogewotCXJldHVybiBlZmlfY2FsbF92aXJ0MihzZXRfd2FrZXVwX3RpbWUsCi0JCQkgICAgICBlbmFibGVkLCB0bSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJc3RhdHVzID0gZWZpX2NhbGxfdmlydDIoc2V0X3dha2V1cF90aW1lLAorCQkJCWVuYWJsZWQsIHRtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCXJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXRpYyBlZmlfc3RhdHVzX3QgdmlydF9lZmlfZ2V0X3ZhcmlhYmxlKGVmaV9jaGFyMTZfdCAqbmFtZSwKQEAgLTEyMiw3ICsxNTYsNyBAQAogCiBzdGF0aWMgZWZpX3N0YXR1c190IHZpcnRfZWZpX3NldF92YXJpYWJsZShlZmlfY2hhcjE2X3QgKm5hbWUsCiAJCQkJCSAgZWZpX2d1aWRfdCAqdmVuZG9yLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgYXR0ciwKKwkJCQkJICB1MzIgYXR0ciwKIAkJCQkJICB1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZSwKIAkJCQkJICB2b2lkICpkYXRhKQogewpAQCAtMTMxLDYgKzE2NSwxOCBAQAogCQkJICAgICAgZGF0YV9zaXplLCBkYXRhKTsKIH0KIAorc3RhdGljIGVmaV9zdGF0dXNfdCB2aXJ0X2VmaV9xdWVyeV92YXJpYWJsZV9pbmZvKHUzMiBhdHRyLAorCQkJCQkJIHU2NCAqc3RvcmFnZV9zcGFjZSwKKwkJCQkJCSB1NjQgKnJlbWFpbmluZ19zcGFjZSwKKwkJCQkJCSB1NjQgKm1heF92YXJpYWJsZV9zaXplKQoreworCWlmIChlZmkucnVudGltZV92ZXJzaW9uIDwgRUZJXzJfMDBfU1lTVEVNX1RBQkxFX1JFVklTSU9OKQorCQlyZXR1cm4gRUZJX1VOU1VQUE9SVEVEOworCisJcmV0dXJuIGVmaV9jYWxsX3ZpcnQ0KHF1ZXJ5X3ZhcmlhYmxlX2luZm8sIGF0dHIsIHN0b3JhZ2Vfc3BhY2UsCisJCQkgICAgICByZW1haW5pbmdfc3BhY2UsIG1heF92YXJpYWJsZV9zaXplKTsKK30KKwogc3RhdGljIGVmaV9zdGF0dXNfdCB2aXJ0X2VmaV9nZXRfbmV4dF9oaWdoX21vbm9fY291bnQodTMyICpjb3VudCkKIHsKIAlyZXR1cm4gZWZpX2NhbGxfdmlydDEoZ2V0X25leHRfaGlnaF9tb25vX2NvdW50LCBjb3VudCk7CkBAIC0xNDUsNiArMTkxLDI4IEBACiAJCSAgICAgICBkYXRhX3NpemUsIGRhdGEpOwogfQogCitzdGF0aWMgZWZpX3N0YXR1c190IHZpcnRfZWZpX3VwZGF0ZV9jYXBzdWxlKGVmaV9jYXBzdWxlX2hlYWRlcl90ICoqY2Fwc3VsZXMsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGNvdW50LAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzZ19saXN0KQoreworCWlmIChlZmkucnVudGltZV92ZXJzaW9uIDwgRUZJXzJfMDBfU1lTVEVNX1RBQkxFX1JFVklTSU9OKQorCQlyZXR1cm4gRUZJX1VOU1VQUE9SVEVEOworCisJcmV0dXJuIGVmaV9jYWxsX3ZpcnQzKHVwZGF0ZV9jYXBzdWxlLCBjYXBzdWxlcywgY291bnQsIHNnX2xpc3QpOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190IHZpcnRfZWZpX3F1ZXJ5X2NhcHN1bGVfY2FwcyhlZmlfY2Fwc3VsZV9oZWFkZXJfdCAqKmNhcHN1bGVzLAorCQkJCQkJdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJCQkJCXU2NCAqbWF4X3NpemUsCisJCQkJCQlpbnQgKnJlc2V0X3R5cGUpCit7CisJaWYgKGVmaS5ydW50aW1lX3ZlcnNpb24gPCBFRklfMl8wMF9TWVNURU1fVEFCTEVfUkVWSVNJT04pCisJCXJldHVybiBFRklfVU5TVVBQT1JURUQ7CisKKwlyZXR1cm4gZWZpX2NhbGxfdmlydDQocXVlcnlfY2Fwc3VsZV9jYXBzLCBjYXBzdWxlcywgY291bnQsIG1heF9zaXplLAorCQkJICAgICAgcmVzZXRfdHlwZSk7Cit9CisKIHN0YXRpYyBlZmlfc3RhdHVzX3QgX19pbml0IHBoeXNfZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwKAogCXVuc2lnbmVkIGxvbmcgbWVtb3J5X21hcF9zaXplLAogCXVuc2lnbmVkIGxvbmcgZGVzY3JpcHRvcl9zaXplLApAQCAtMTY0LDExICsyMzIsMTQgQEAKIHN0YXRpYyBlZmlfc3RhdHVzX3QgX19pbml0IHBoeXNfZWZpX2dldF90aW1lKGVmaV90aW1lX3QgKnRtLAogCQkJCQkgICAgIGVmaV90aW1lX2NhcF90ICp0YykKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKIAllZmlfY2FsbF9waHlzX3ByZWxvZygpOwogCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMyKGVmaV9waHlzLmdldF90aW1lLCB0bSwgdGMpOwogCWVmaV9jYWxsX3BoeXNfZXBpbG9nKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zMTAsMTQgKzM4MSwzMSBAQAogCiAJZm9yIChwID0gbWVtbWFwLm1hcDsgcCA8IG1lbW1hcC5tYXBfZW5kOyBwICs9IG1lbW1hcC5kZXNjX3NpemUpIHsKIAkJZWZpX21lbW9yeV9kZXNjX3QgKm1kID0gcDsKLQkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0ID0gbWQtPnBoeXNfYWRkcjsKLQkJdW5zaWduZWQgbG9uZyBsb25nIHNpemUgPSBtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUOworCQl1NjQgc3RhcnQgPSBtZC0+cGh5c19hZGRyOworCQl1NjQgc2l6ZSA9IG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQ7CiAKIAkJaWYgKG1kLT50eXBlICE9IEVGSV9CT09UX1NFUlZJQ0VTX0NPREUgJiYKIAkJICAgIG1kLT50eXBlICE9IEVGSV9CT09UX1NFUlZJQ0VTX0RBVEEpCiAJCQljb250aW51ZTsKLQotCQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShzdGFydCwgc3RhcnQgKyBzaXplLCAiRUZJIEJvb3QiKTsKKwkJLyogT25seSByZXNlcnZlIHdoZXJlIHBvc3NpYmxlOgorCQkgKiAtIE5vdCB3aXRoaW4gYW55IGFscmVhZHkgYWxsb2NhdGVkIGFyZWFzCisJCSAqIC0gTm90IG92ZXIgYW55IG1lbW9yeSBhcmVhIChyZWFsbHkgbmVlZGVkLCBpZiBhYm92ZT8pCisJCSAqIC0gTm90IHdpdGhpbiBhbnkgcGFydCBvZiB0aGUga2VybmVsCisJCSAqIC0gTm90IHRoZSBiaW9zIHJlc2VydmVkIGFyZWEKKwkJKi8KKwkJaWYgKChzdGFydCtzaXplID49IHZpcnRfdG9fcGh5cyhfdGV4dCkKKwkJCQkmJiBzdGFydCA8PSB2aXJ0X3RvX3BoeXMoX2VuZCkpIHx8CisJCQkhZTgyMF9hbGxfbWFwcGVkKHN0YXJ0LCBzdGFydCtzaXplLCBFODIwX1JBTSkgfHwKKwkJCW1lbWJsb2NrX3g4Nl9jaGVja19yZXNlcnZlZF9zaXplKCZzdGFydCwgJnNpemUsCisJCQkJCQkJMTw8RUZJX1BBR0VfU0hJRlQpKSB7CisJCQkvKiBDb3VsZCBub3QgcmVzZXJ2ZSwgc2tpcCBpdCAqLworCQkJbWQtPm51bV9wYWdlcyA9IDA7CisJCQltZW1ibG9ja19kYmcoUEZYICJDb3VsZCBub3QgcmVzZXJ2ZSBib290IHJhbmdlICIKKwkJCQkJIlsweCUwMTBsbHgtMHglMDEwbGx4XVxuIiwKKwkJCQkJCXN0YXJ0LCBzdGFydCtzaXplLTEpOworCQl9IGVsc2UKKwkJCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHN0YXJ0LCBzdGFydCtzaXplLAorCQkJCQkJCSJFRkkgQm9vdCIpOwogCX0KIH0KIApAQCAtMzM0LDYgKzQyMiwxMCBAQAogCQkgICAgbWQtPnR5cGUgIT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSkKIAkJCWNvbnRpbnVlOwogCisJCS8qIENvdWxkIG5vdCByZXNlcnZlIGJvb3QgYXJlYSAqLworCQlpZiAoIXNpemUpCisJCQljb250aW51ZTsKKwogCQlmcmVlX2Jvb3RtZW1fbGF0ZShzdGFydCwgc2l6ZSk7CiAJfQogfQpAQCAtNDgzLDkgKzU3NSw2IEBACiAJeDg2X3BsYXRmb3JtLnNldF93YWxsY2xvY2sgPSBlZmlfc2V0X3J0Y19tbXNzOwogI2VuZGlmCiAKLQkvKiBTZXR1cCBmb3IgRUZJIHJ1bnRpbWUgc2VydmljZSAqLwotCXJlYm9vdF90eXBlID0gQk9PVF9FRkk7Ci0KICNpZiBFRklfREVCVUcKIAlwcmludF9lZmlfbWVtbWFwKCk7CiAjZW5kaWYKQEAgLTY1MSw2ICs3NDAsOSBAQAogCWVmaS5nZXRfbmV4dF9oaWdoX21vbm9fY291bnQgPSB2aXJ0X2VmaV9nZXRfbmV4dF9oaWdoX21vbm9fY291bnQ7CiAJZWZpLnJlc2V0X3N5c3RlbSA9IHZpcnRfZWZpX3Jlc2V0X3N5c3RlbTsKIAllZmkuc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAgPSBOVUxMOworCWVmaS5xdWVyeV92YXJpYWJsZV9pbmZvID0gdmlydF9lZmlfcXVlcnlfdmFyaWFibGVfaW5mbzsKKwllZmkudXBkYXRlX2NhcHN1bGUgPSB2aXJ0X2VmaV91cGRhdGVfY2Fwc3VsZTsKKwllZmkucXVlcnlfY2Fwc3VsZV9jYXBzID0gdmlydF9lZmlfcXVlcnlfY2Fwc3VsZV9jYXBzOwogCWlmIChfX3N1cHBvcnRlZF9wdGVfbWFzayAmIF9QQUdFX05YKQogCQlydW50aW1lX2NvZGVfcGFnZV9ta2V4ZWMoKTsKIAllYXJseV9pb3VubWFwKG1lbW1hcC5tYXAsIG1lbW1hcC5ucl9tYXAgKiBtZW1tYXAuZGVzY19zaXplKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL3V2L3RsYl91di5jIGIvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKaW5kZXggNjhlNDY3Zi4uZGI4YjkxNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKQEAgLTI5NiwxNCArMjk2LDE4IEBACiB9CiAKIC8qCi0gKiBEZXRlcm1pbmUgdGhlIGZpcnN0IGNwdSBvbiBhIHV2aHViLgorICogRGV0ZXJtaW5lIHRoZSBmaXJzdCBjcHUgb24gYSBwbm9kZS4KICAqLwotc3RhdGljIGludCB1dmh1Yl90b19maXJzdF9jcHUoaW50IHV2aHViKQorc3RhdGljIGludCBwbm9kZV90b19maXJzdF9jcHUoaW50IHBub2RlLCBzdHJ1Y3QgYmF1X2NvbnRyb2wgKnNtYXN0ZXIpCiB7CiAJaW50IGNwdTsKLQlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpCi0JCWlmICh1dmh1YiA9PSB1dl9jcHVfdG9fYmxhZGVfaWQoY3B1KSkKKwlzdHJ1Y3QgaHViX2FuZF9wbm9kZSAqaHBwOworCisJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CisJCWhwcCA9ICZzbWFzdGVyLT50aHBbY3B1XTsKKwkJaWYgKHBub2RlID09IGhwcC0+cG5vZGUpCiAJCQlyZXR1cm4gY3B1OworCX0KIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTM2NiwyOCArMzcwLDMyIEBACiAgKiBVc2UgSVBJIHRvIGdldCBhbGwgdGFyZ2V0IHV2aHVicyB0byByZWxlYXNlIHJlc291cmNlcyBoZWxkIGJ5CiAgKiBhIGdpdmVuIHNlbmRpbmcgY3B1IG51bWJlci4KICAqLwotc3RhdGljIHZvaWQgcmVzZXRfd2l0aF9pcGkoc3RydWN0IGJhdV90YXJnX2h1Ym1hc2sgKmRpc3RyaWJ1dGlvbiwgaW50IHNlbmRlcikKK3N0YXRpYyB2b2lkIHJlc2V0X3dpdGhfaXBpKHN0cnVjdCBwbm1hc2sgKmRpc3RyaWJ1dGlvbiwgc3RydWN0IGJhdV9jb250cm9sICpiY3ApCiB7Ci0JaW50IHV2aHViOworCWludCBwbm9kZTsKKwlpbnQgYXBub2RlOwogCWludCBtYXNrYml0czsKLQljcHVtYXNrX3QgbWFzazsKKwlpbnQgc2VuZGVyID0gYmNwLT5jcHU7CisJY3B1bWFza190ICptYXNrID0gYmNwLT51dmh1Yl9tYXN0ZXItPmNwdW1hc2s7CisJc3RydWN0IGJhdV9jb250cm9sICpzbWFzdGVyID0gYmNwLT5zb2NrZXRfbWFzdGVyOwogCXN0cnVjdCByZXNldF9hcmdzIHJlc2V0X2FyZ3M7CiAKIAlyZXNldF9hcmdzLnNlbmRlciA9IHNlbmRlcjsKLQljcHVzX2NsZWFyKG1hc2spOworCWNwdXNfY2xlYXIoKm1hc2spOwogCS8qIGZpbmQgYSBzaW5nbGUgY3B1IGZvciBlYWNoIHV2aHViIGluIHRoaXMgZGlzdHJpYnV0aW9uIG1hc2sgKi8KLQltYXNrYml0cyA9IHNpemVvZihzdHJ1Y3QgYmF1X3RhcmdfaHVibWFzaykgKiBCSVRTUEVSQllURTsKLQlmb3IgKHV2aHViID0gMDsgdXZodWIgPCBtYXNrYml0czsgdXZodWIrKykgeworCW1hc2tiaXRzID0gc2l6ZW9mKHN0cnVjdCBwbm1hc2spICogQklUU1BFUkJZVEU7CisJLyogZWFjaCBiaXQgaXMgYSBwbm9kZSByZWxhdGl2ZSB0byB0aGUgcGFydGl0aW9uIGJhc2UgcG5vZGUgKi8KKwlmb3IgKHBub2RlID0gMDsgcG5vZGUgPCBtYXNrYml0czsgcG5vZGUrKykgewogCQlpbnQgY3B1OwotCQlpZiAoIWJhdV91dmh1Yl9pc3NldCh1dmh1YiwgZGlzdHJpYnV0aW9uKSkKKwkJaWYgKCFiYXVfdXZodWJfaXNzZXQocG5vZGUsIGRpc3RyaWJ1dGlvbikpCiAJCQljb250aW51ZTsKLQkJLyogZmluZCBhIGNwdSBmb3IgdGhpcyB1dmh1YiAqLwotCQljcHUgPSB1dmh1Yl90b19maXJzdF9jcHUodXZodWIpOwotCQljcHVfc2V0KGNwdSwgbWFzayk7CisJCWFwbm9kZSA9IHBub2RlICsgYmNwLT5wYXJ0aXRpb25fYmFzZV9wbm9kZTsKKwkJY3B1ID0gcG5vZGVfdG9fZmlyc3RfY3B1KGFwbm9kZSwgc21hc3Rlcik7CisJCWNwdV9zZXQoY3B1LCAqbWFzayk7CiAJfQogCiAJLyogSVBJIGFsbCBjcHVzOyBwcmVlbXB0aW9uIGlzIGFscmVhZHkgZGlzYWJsZWQgKi8KLQlzbXBfY2FsbF9mdW5jdGlvbl9tYW55KCZtYXNrLCBkb19yZXNldCwgKHZvaWQgKikmcmVzZXRfYXJncywgMSk7CisJc21wX2NhbGxfZnVuY3Rpb25fbWFueShtYXNrLCBkb19yZXNldCwgKHZvaWQgKikmcmVzZXRfYXJncywgMSk7CiAJcmV0dXJuOwogfQogCkBAIC02MDQsNyArNjEyLDcgQEAKIAkJcXVpZXNjZV9sb2NhbF91dmh1YihobWFzdGVyKTsKIAogCQlzcGluX2xvY2soJmhtYXN0ZXItPnF1ZXVlX2xvY2spOwotCQlyZXNldF93aXRoX2lwaSgmYmF1X2Rlc2MtPmRpc3RyaWJ1dGlvbiwgYmNwLT5jcHUpOworCQlyZXNldF93aXRoX2lwaSgmYmF1X2Rlc2MtPmRpc3RyaWJ1dGlvbiwgYmNwKTsKIAkJc3Bpbl91bmxvY2soJmhtYXN0ZXItPnF1ZXVlX2xvY2spOwogCiAJCWVuZF91dmh1Yl9xdWllc2NlKGhtYXN0ZXIpOwpAQCAtNjI2LDcgKzYzNCw3IEBACiAJCXF1aWVzY2VfbG9jYWxfdXZodWIoaG1hc3Rlcik7CiAKIAkJc3Bpbl9sb2NrKCZobWFzdGVyLT5xdWV1ZV9sb2NrKTsKLQkJcmVzZXRfd2l0aF9pcGkoJmJhdV9kZXNjLT5kaXN0cmlidXRpb24sIGJjcC0+Y3B1KTsKKwkJcmVzZXRfd2l0aF9pcGkoJmJhdV9kZXNjLT5kaXN0cmlidXRpb24sIGJjcCk7CiAJCXNwaW5fdW5sb2NrKCZobWFzdGVyLT5xdWV1ZV9sb2NrKTsKIAogCQllbmRfdXZodWJfcXVpZXNjZShobWFzdGVyKTsKQEAgLTEzMzQsOSArMTM0MiwxMCBAQAogCiAJaW5zdHJbY291bnRdID0gJ1wwJzsKIAotCWJjcCA9ICZwZXJfY3B1KGJhdV9jb250cm9sLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCisJY3B1ID0gZ2V0X2NwdSgpOworCWJjcCA9ICZwZXJfY3B1KGJhdV9jb250cm9sLCBjcHUpOwogCXJldCA9IHBhcnNlX3R1bmFibGVzX3dyaXRlKGJjcCwgaW5zdHIsIGNvdW50KTsKKwlwdXRfY3B1KCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTY4Nyw2ICsxNjk2LDE2IEBACiB9CiAKIC8qCisgKiBFYWNoIHV2aHViIGlzIHRvIGdldCBhIGxvY2FsIGNwdW1hc2suCisgKi8KK3N0YXRpYyB2b2lkIG1ha2VfcGVyX2h1Yl9jcHVtYXNrKHN0cnVjdCBiYXVfY29udHJvbCAqaG1hc3RlcikKK3sKKwlpbnQgc3ogPSBzaXplb2YoY3B1bWFza190KTsKKworCWhtYXN0ZXItPmNwdW1hc2sgPSBremFsbG9jX25vZGUoc3osIEdGUF9LRVJORUwsIGhtYXN0ZXItPm9zbm9kZSk7Cit9CisKKy8qCiAgKiBJbml0aWFsaXplIGFsbCB0aGUgcGVyX2NwdSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNwdSdzIG9uIGEgZ2l2ZW4gc29ja2V0LAogICogZ2l2ZW4gd2hhdCBoYXMgYmVlbiBnYXRoZXJlZCBpbnRvIHRoZSBzb2NrZXRfZGVzYyBzdHJ1Y3QuCiAgKiBBbmQgcmVwb3J0cyB0aGUgY2hvc2VuIGh1YiBhbmQgc29ja2V0IG1hc3RlcnMgYmFjayB0byB0aGUgY2FsbGVyLgpAQCAtMTc1MSwxMSArMTc3MCwxMiBAQAogCQkJCXNkcCA9ICZiZHAtPnNvY2tldFtzb2NrZXRdOwogCQkJCWlmIChzY2FuX3NvY2soc2RwLCBiZHAsICZzbWFzdGVyLCAmaG1hc3RlcikpCiAJCQkJCXJldHVybiAxOworCQkJCW1ha2VfcGVyX2NwdV90aHAoc21hc3Rlcik7CiAJCQl9CiAJCQlzb2NrZXQrKzsKIAkJCXNvY2tldF9tYXNrID0gKHNvY2tldF9tYXNrID4+IDEpOwotCQkJbWFrZV9wZXJfY3B1X3RocChzbWFzdGVyKTsKIAkJfQorCQltYWtlX3Blcl9odWJfY3B1bWFzayhobWFzdGVyKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzc3LDE1ICsxNzk3LDIwIEBACiAJdXZodWJfbWFzayA9IGt6YWxsb2MoKG51dmh1YnMrNykvOCwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoZ2V0X2NwdV90b3BvbG9neShiYXNlX3BhcnRfcG5vZGUsIHV2aHViX2Rlc2NzLCB1dmh1Yl9tYXNrKSkKLQkJcmV0dXJuIDE7CisJCWdvdG8gZmFpbDsKIAogCWlmIChzdW1tYXJpemVfdXZodWJfc29ja2V0cyhudXZodWJzLCB1dmh1Yl9kZXNjcywgdXZodWJfbWFzaykpCi0JCXJldHVybiAxOworCQlnb3RvIGZhaWw7CiAKIAlrZnJlZSh1dmh1Yl9kZXNjcyk7CiAJa2ZyZWUodXZodWJfbWFzayk7CiAJaW5pdF9wZXJfY3B1X3R1bmFibGVzKCk7CiAJcmV0dXJuIDA7CisKK2ZhaWw6CisJa2ZyZWUodXZodWJfZGVzY3MpOworCWtmcmVlKHV2aHViX21hc2spOworCXJldHVybiAxOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby9NYWtlZmlsZSBiL2FyY2gveDg2L3Zkc28vTWFrZWZpbGUKaW5kZXggYmVmMGJjOS4uNWQxNzk1MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni92ZHNvL01ha2VmaWxlCkBAIC0yNiw2ICsyNiw3IEBACiBleHBvcnQgQ1BQRkxBR1NfdmRzby5sZHMgKz0gLVAgLUMKIAogVkRTT19MREZMQUdTX3Zkc28ubGRzID0gLW02NCAtV2wsLXNvbmFtZT1saW51eC12ZHNvLnNvLjEgXAorCQkJLVdsLC0tbm8tdW5kZWZpbmVkIFwKIAkJICAgICAgCS1XbCwteixtYXgtcGFnZS1zaXplPTQwOTYgLVdsLC16LGNvbW1vbi1wYWdlLXNpemU9NDA5NgogCiAkKG9iaikvdmRzby5vOiAkKHNyYykvdmRzby5TICQob2JqKS92ZHNvLnNvCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3ZjbG9ja19nZXR0aW1lLmMgYi9hcmNoL3g4Ni92ZHNvL3ZjbG9ja19nZXR0aW1lLmMKaW5kZXggYTcyNDkwNS4uNmJjMGU3MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby92Y2xvY2tfZ2V0dGltZS5jCisrKyBiL2FyY2gveDg2L3Zkc28vdmNsb2NrX2dldHRpbWUuYwpAQCAtNiw3ICs2LDYgQEAKICAqCiAgKiBUaGUgY29kZSBzaG91bGQgaGF2ZSBubyBpbnRlcm5hbCB1bnJlc29sdmVkIHJlbG9jYXRpb25zLgogICogQ2hlY2sgd2l0aCByZWFkZWxmIGFmdGVyIGNoYW5naW5nLgotICogQWxzbyBhbHRlcm5hdGl2ZSgpIGRvZXNuJ3Qgd29yay4KICAqLwogCiAvKiBEaXNhYmxlIHByb2ZpbGluZyBmb3IgdXNlcnNwYWNlIGNvZGU6ICovCkBAIC0xNyw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KICNpbmNsdWRlIDxhc20vdmd0b2QuaD4KICNpbmNsdWRlIDxhc20vdGltZXguaD4KICNpbmNsdWRlIDxhc20vaHBldC5oPgpAQCAtMjUsNiArMjUsNDMgQEAKIAogI2RlZmluZSBndG9kICgmVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpKQogCitub3RyYWNlIHN0YXRpYyBjeWNsZV90IHZyZWFkX3RzYyh2b2lkKQoreworCWN5Y2xlX3QgcmV0OworCXU2NCBsYXN0OworCisJLyoKKwkgKiBFbXBpcmljYWxseSwgYSBmZW5jZSAob2YgdHlwZSB0aGF0IGRlcGVuZHMgb24gdGhlIENQVSkKKwkgKiBiZWZvcmUgcmR0c2MgaXMgZW5vdWdoIHRvIGVuc3VyZSB0aGF0IHJkdHNjIGlzIG9yZGVyZWQKKwkgKiB3aXRoIHJlc3BlY3QgdG8gbG9hZHMuICBUaGUgdmFyaW91cyBDUFUgbWFudWFscyBhcmUgdW5jbGVhcgorCSAqIGFzIHRvIHdoZXRoZXIgcmR0c2MgY2FuIGJlIHJlb3JkZXJlZCB3aXRoIGxhdGVyIGxvYWRzLAorCSAqIGJ1dCBubyBvbmUgaGFzIGV2ZXIgc2VlbiBpdCBoYXBwZW4uCisJICovCisJcmR0c2NfYmFycmllcigpOworCXJldCA9IChjeWNsZV90KXZnZXRfY3ljbGVzKCk7CisKKwlsYXN0ID0gVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLmNsb2NrLmN5Y2xlX2xhc3Q7CisKKwlpZiAobGlrZWx5KHJldCA+PSBsYXN0KSkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogR0NDIGxpa2VzIHRvIGdlbmVyYXRlIGNtb3YgaGVyZSwgYnV0IHRoaXMgYnJhbmNoIGlzIGV4dHJlbWVseQorCSAqIHByZWRpY3RhYmxlIChpdCdzIGp1c3QgYSBmdW5jaXRvbiBvZiB0aW1lIGFuZCB0aGUgbGlrZWx5IGlzCisJICogdmVyeSBsaWtlbHkpIGFuZCB0aGVyZSdzIGEgZGF0YSBkZXBlbmRlbmNlLCBzbyBmb3JjZSBHQ0MKKwkgKiB0byBnZW5lcmF0ZSBhIGJyYW5jaCBpbnN0ZWFkLiAgSSBkb24ndCBiYXJyaWVyKCkgYmVjYXVzZQorCSAqIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgYSBiYXJyaWVyLCBhbmQgaWYgdGhpcyBmdW5jdGlvbgorCSAqIGV2ZXIgZ2V0cyBpbmxpbmVkIGl0IHdpbGwgZ2VuZXJhdGUgd29yc2UgY29kZS4KKwkgKi8KKwlhc20gdm9sYXRpbGUgKCIiKTsKKwlyZXR1cm4gbGFzdDsKK30KKworc3RhdGljIG5vdHJhY2UgY3ljbGVfdCB2cmVhZF9ocGV0KHZvaWQpCit7CisJcmV0dXJuIHJlYWRsKChjb25zdCB2b2lkIF9faW9tZW0gKilmaXhfdG9fdmlydChWU1lTQ0FMTF9IUEVUKSArIDB4ZjApOworfQorCiBub3RyYWNlIHN0YXRpYyBsb25nIHZkc29fZmFsbGJhY2tfZ2V0dGltZShsb25nIGNsb2NrLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQogewogCWxvbmcgcmV0OwpAQCAtMzYsOSArNzMsMTIgQEAKIG5vdHJhY2Ugc3RhdGljIGlubGluZSBsb25nIHZnZXRucyh2b2lkKQogewogCWxvbmcgdjsKLQljeWNsZXNfdCAoKnZyZWFkKSh2b2lkKTsKLQl2cmVhZCA9IGd0b2QtPmNsb2NrLnZyZWFkOwotCXYgPSAodnJlYWQoKSAtIGd0b2QtPmNsb2NrLmN5Y2xlX2xhc3QpICYgZ3RvZC0+Y2xvY2subWFzazsKKwljeWNsZXNfdCBjeWNsZXM7CisJaWYgKGd0b2QtPmNsb2NrLnZjbG9ja19tb2RlID09IFZDTE9DS19UU0MpCisJCWN5Y2xlcyA9IHZyZWFkX3RzYygpOworCWVsc2UKKwkJY3ljbGVzID0gdnJlYWRfaHBldCgpOworCXYgPSAoY3ljbGVzIC0gZ3RvZC0+Y2xvY2suY3ljbGVfbGFzdCkgJiBndG9kLT5jbG9jay5tYXNrOwogCXJldHVybiAodiAqIGd0b2QtPmNsb2NrLm11bHQpID4+IGd0b2QtPmNsb2NrLnNoaWZ0OwogfQogCkBAIC0xMTYsMjEgKzE1NiwyMSBAQAogCiBub3RyYWNlIGludCBfX3Zkc29fY2xvY2tfZ2V0dGltZShjbG9ja2lkX3QgY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHMpCiB7Ci0JaWYgKGxpa2VseShndG9kLT5zeXNjdGxfZW5hYmxlZCkpCi0JCXN3aXRjaCAoY2xvY2spIHsKLQkJY2FzZSBDTE9DS19SRUFMVElNRToKLQkJCWlmIChsaWtlbHkoZ3RvZC0+Y2xvY2sudnJlYWQpKQotCQkJCXJldHVybiBkb19yZWFsdGltZSh0cyk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTE9DS19NT05PVE9OSUM6Ci0JCQlpZiAobGlrZWx5KGd0b2QtPmNsb2NrLnZyZWFkKSkKLQkJCQlyZXR1cm4gZG9fbW9ub3RvbmljKHRzKTsKLQkJCWJyZWFrOwotCQljYXNlIENMT0NLX1JFQUxUSU1FX0NPQVJTRToKLQkJCXJldHVybiBkb19yZWFsdGltZV9jb2Fyc2UodHMpOwotCQljYXNlIENMT0NLX01PTk9UT05JQ19DT0FSU0U6Ci0JCQlyZXR1cm4gZG9fbW9ub3RvbmljX2NvYXJzZSh0cyk7Ci0JCX0KKwlzd2l0Y2ggKGNsb2NrKSB7CisJY2FzZSBDTE9DS19SRUFMVElNRToKKwkJaWYgKGxpa2VseShndG9kLT5jbG9jay52Y2xvY2tfbW9kZSAhPSBWQ0xPQ0tfTk9ORSkpCisJCQlyZXR1cm4gZG9fcmVhbHRpbWUodHMpOworCQlicmVhazsKKwljYXNlIENMT0NLX01PTk9UT05JQzoKKwkJaWYgKGxpa2VseShndG9kLT5jbG9jay52Y2xvY2tfbW9kZSAhPSBWQ0xPQ0tfTk9ORSkpCisJCQlyZXR1cm4gZG9fbW9ub3RvbmljKHRzKTsKKwkJYnJlYWs7CisJY2FzZSBDTE9DS19SRUFMVElNRV9DT0FSU0U6CisJCXJldHVybiBkb19yZWFsdGltZV9jb2Fyc2UodHMpOworCWNhc2UgQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRToKKwkJcmV0dXJuIGRvX21vbm90b25pY19jb2Fyc2UodHMpOworCX0KKwogCXJldHVybiB2ZHNvX2ZhbGxiYWNrX2dldHRpbWUoY2xvY2ssIHRzKTsKIH0KIGludCBjbG9ja19nZXR0aW1lKGNsb2NraWRfdCwgc3RydWN0IHRpbWVzcGVjICopCkBAIC0xMzksNyArMTc5LDcgQEAKIG5vdHJhY2UgaW50IF9fdmRzb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgKnR6KQogewogCWxvbmcgcmV0OwotCWlmIChsaWtlbHkoZ3RvZC0+c3lzY3RsX2VuYWJsZWQgJiYgZ3RvZC0+Y2xvY2sudnJlYWQpKSB7CisJaWYgKGxpa2VseShndG9kLT5jbG9jay52Y2xvY2tfbW9kZSAhPSBWQ0xPQ0tfTk9ORSkpIHsKIAkJaWYgKGxpa2VseSh0diAhPSBOVUxMKSkgewogCQkJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCB0aW1ldmFsLCB0dl91c2VjKSAhPQogCQkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHRpbWVzcGVjLCB0dl9uc2VjKSB8fApAQCAtMTYxLDI3ICsyMDEsMTQgQEAKIGludCBnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiwgc3RydWN0IHRpbWV6b25lICopCiAJX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fdmRzb19nZXR0aW1lb2ZkYXkiKSkpOwogCi0vKiBUaGlzIHdpbGwgYnJlYWsgd2hlbiB0aGUgeHRpbWUgc2Vjb25kcyBnZXQgaW5hY2N1cmF0ZSwgYnV0IHRoYXQgaXMKLSAqIHVubGlrZWx5ICovCi0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgbG9uZyB0aW1lX3N5c2NhbGwobG9uZyAqdCkKLXsKLQlsb25nIHNlY3M7Ci0JYXNtIHZvbGF0aWxlKCJzeXNjYWxsIgotCQkgICAgIDogIj1hIiAoc2VjcykKLQkJICAgICA6ICIwIiAoX19OUl90aW1lKSwgIkQiICh0KSA6ICJjYyIsICJyMTEiLCAiY3giLCAibWVtb3J5Iik7Ci0JcmV0dXJuIHNlY3M7Ci19Ci0KKy8qCisgKiBUaGlzIHdpbGwgYnJlYWsgd2hlbiB0aGUgeHRpbWUgc2Vjb25kcyBnZXQgaW5hY2N1cmF0ZSwgYnV0IHRoYXQgaXMKKyAqIHVubGlrZWx5CisgKi8KIG5vdHJhY2UgdGltZV90IF9fdmRzb190aW1lKHRpbWVfdCAqdCkKIHsKLQl0aW1lX3QgcmVzdWx0OwotCi0JaWYgKHVubGlrZWx5KCFWVkFSKHZzeXNjYWxsX2d0b2RfZGF0YSkuc3lzY3RsX2VuYWJsZWQpKQotCQlyZXR1cm4gdGltZV9zeXNjYWxsKHQpOwotCiAJLyogVGhpcyBpcyBhdG9taWMgb24geDg2XzY0IHNvIHdlIGRvbid0IG5lZWQgYW55IGxvY2tzLiAqLwotCXJlc3VsdCA9IEFDQ0VTU19PTkNFKFZWQVIodnN5c2NhbGxfZ3RvZF9kYXRhKS53YWxsX3RpbWVfc2VjKTsKKwl0aW1lX3QgcmVzdWx0ID0gQUNDRVNTX09OQ0UoVlZBUih2c3lzY2FsbF9ndG9kX2RhdGEpLndhbGxfdGltZV9zZWMpOwogCiAJaWYgKHQpCiAJCSp0ID0gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92ZHNvLlMgYi9hcmNoL3g4Ni92ZHNvL3Zkc28uUwppbmRleCAxZDNhYTZiLi4xYjk3OWMxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3Zkc28uUworKysgYi9hcmNoL3g4Ni92ZHNvL3Zkc28uUwpAQCAtMSwxMCArMSwyMSBAQAorI2luY2x1ZGUgPGFzbS9wYWdlX3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAotX19JTklUREFUQQorX19QQUdFX0FMSUdORURfREFUQQogCiAJLmdsb2JsIHZkc29fc3RhcnQsIHZkc29fZW5kCisJLmFsaWduIFBBR0VfU0laRQogdmRzb19zdGFydDoKIAkuaW5jYmluICJhcmNoL3g4Ni92ZHNvL3Zkc28uc28iCiB2ZHNvX2VuZDoKIAotX19GSU5JVAorLnByZXZpb3VzCisKKwkuZ2xvYmwgdmRzb19wYWdlcworCS5ic3MKKwkuYWxpZ24gOAorCS50eXBlIHZkc29fcGFnZXMsIEBvYmplY3QKK3Zkc29fcGFnZXM6CisJLnplcm8gKHZkc29fZW5kIC0gdmRzb19zdGFydCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFICogOAorCS5zaXplIHZkc29fcGFnZXMsIC4tdmRzb19wYWdlcwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92bWEuYyBiL2FyY2gveDg2L3Zkc28vdm1hLmMKaW5kZXggN2FiZDJiZS4uMzE2ZmJjYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby92bWEuYworKysgYi9hcmNoL3g4Ni92ZHNvL3ZtYS5jCkBAIC0xNCw0MSArMTQsNjEgQEAKICNpbmNsdWRlIDxhc20vdmd0b2QuaD4KICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIHVuc2lnbmVkIGludCBfX3JlYWRfbW9zdGx5IHZkc29fZW5hYmxlZCA9IDE7CiAKIGV4dGVybiBjaGFyIHZkc29fc3RhcnRbXSwgdmRzb19lbmRbXTsKIGV4dGVybiB1bnNpZ25lZCBzaG9ydCB2ZHNvX3N5bmNfY3B1aWQ7CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqKnZkc29fcGFnZXM7CitleHRlcm4gc3RydWN0IHBhZ2UgKnZkc29fcGFnZXNbXTsKIHN0YXRpYyB1bnNpZ25lZCB2ZHNvX3NpemU7CiAKLXN0YXRpYyBpbnQgX19pbml0IGluaXRfdmRzb192YXJzKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgcGF0Y2hfdmRzbyh2b2lkICp2ZHNvLCBzaXplX3QgbGVuKQoreworCUVsZjY0X0VoZHIgKmhkciA9IHZkc287CisJRWxmNjRfU2hkciAqc2VjaGRycywgKmFsdF9zZWMgPSAwOworCWNoYXIgKnNlY3N0cmluZ3M7CisJdm9pZCAqYWx0X2RhdGE7CisJaW50IGk7CisKKwlCVUdfT04obGVuIDwgc2l6ZW9mKEVsZjY0X0VoZHIpKTsKKwlCVUdfT04obWVtY21wKGhkci0+ZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSAhPSAwKTsKKworCXNlY2hkcnMgPSAodm9pZCAqKWhkciArIGhkci0+ZV9zaG9mZjsKKwlzZWNzdHJpbmdzID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2hkci0+ZV9zaHN0cm5keF0uc2hfb2Zmc2V0OworCisJZm9yIChpID0gMTsgaSA8IGhkci0+ZV9zaG51bTsgaSsrKSB7CisJCUVsZjY0X1NoZHIgKnNoZHIgPSAmc2VjaGRyc1tpXTsKKwkJaWYgKCFzdHJjbXAoc2Vjc3RyaW5ncyArIHNoZHItPnNoX25hbWUsICIuYWx0aW5zdHJ1Y3Rpb25zIikpIHsKKwkJCWFsdF9zZWMgPSBzaGRyOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCS8qIElmIHdlIGdldCBoZXJlLCBpdCdzIHByb2JhYmx5IGEgYnVnLiAqLworCXByX3dhcm5pbmcoInBhdGNoX3Zkc286IC5hbHRpbnN0cnVjdGlvbnMgbm90IGZvdW5kXG4iKTsKKwlyZXR1cm47ICAvKiBub3RoaW5nIHRvIHBhdGNoICovCisKK2ZvdW5kOgorCWFsdF9kYXRhID0gKHZvaWQgKiloZHIgKyBhbHRfc2VjLT5zaF9vZmZzZXQ7CisJYXBwbHlfYWx0ZXJuYXRpdmVzKGFsdF9kYXRhLCBhbHRfZGF0YSArIGFsdF9zZWMtPnNoX3NpemUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3Zkc28odm9pZCkKIHsKIAlpbnQgbnBhZ2VzID0gKHZkc29fZW5kIC0gdmRzb19zdGFydCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOwogCWludCBpOwogCisJcGF0Y2hfdmRzbyh2ZHNvX3N0YXJ0LCB2ZHNvX2VuZCAtIHZkc29fc3RhcnQpOworCiAJdmRzb19zaXplID0gbnBhZ2VzIDw8IFBBR0VfU0hJRlQ7Ci0JdmRzb19wYWdlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbnBhZ2VzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZkc29fcGFnZXMpCi0JCWdvdG8gb29tOwotCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgewotCQlzdHJ1Y3QgcGFnZSAqcDsKLQkJcCA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCWlmICghcCkKLQkJCWdvdG8gb29tOwotCQl2ZHNvX3BhZ2VzW2ldID0gcDsKLQkJY29weV9wYWdlKHBhZ2VfYWRkcmVzcyhwKSwgdmRzb19zdGFydCArIGkqUEFHRV9TSVpFKTsKLQl9CisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKQorCQl2ZHNvX3BhZ2VzW2ldID0gdmlydF90b19wYWdlKHZkc29fc3RhcnQgKyBpKlBBR0VfU0laRSk7CiAKIAlyZXR1cm4gMDsKLQotIG9vbToKLQlwcmludGsoIkNhbm5vdCBhbGxvY2F0ZSB2ZHNvXG4iKTsKLQl2ZHNvX2VuYWJsZWQgPSAwOwotCXJldHVybiAtRU5PTUVNOwogfQotc3Vic3lzX2luaXRjYWxsKGluaXRfdmRzb192YXJzKTsKK3N1YnN5c19pbml0Y2FsbChpbml0X3Zkc28pOwogCiBzdHJ1Y3QgbGludXhfYmlucHJtOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUgYi9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKaW5kZXggMTdjNTY1ZC4uY2NmNzNiMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3hlbi9NYWtlZmlsZQpAQCAtMTMsMTAgKzEzLDEwIEBACiBvYmoteQkJOj0gZW5saWdodGVuLm8gc2V0dXAubyBtdWx0aWNhbGxzLm8gbW11Lm8gaXJxLm8gXAogCQkJdGltZS5vIHhlbi1hc20ubyB4ZW4tYXNtXyQoQklUUykubyBcCiAJCQlncmFudC10YWJsZS5vIHN1c3BlbmQubyBwbGF0Zm9ybS1wY2ktdW5wbHVnLm8gXAotCQkJcDJtLm8KKwkJCXAybS5vIHRyYWNlLm8KIAogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCiBvYmotJChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKSs9IHNwaW5sb2NrLm8KIG9iai0kKENPTkZJR19YRU5fREVCVUdfRlMpCSs9IGRlYnVnZnMubwotCitvYmotJChDT05GSUdfWEVOX0RPTTApCQkrPSB2Z2Eubwogb2JqLSQoQ09ORklHX1NXSU9UTEJfWEVOKQkrPSBwY2ktc3dpb3RsYi14ZW4ubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCmluZGV4IGRkN2I4OGYuLjk3NGE1MjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYworKysgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKQEAgLTM0MSw2ICszNDEsOCBAQAogCXN0cnVjdCBtbXVleHRfb3AgKm9wOwogCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzID0geGVuX21jX2VudHJ5KHNpemVvZigqb3ApKTsKIAorCXRyYWNlX3hlbl9jcHVfc2V0X2xkdChhZGRyLCBlbnRyaWVzKTsKKwogCW9wID0gbWNzLmFyZ3M7CiAJb3AtPmNtZCA9IE1NVUVYVF9TRVRfTERUOwogCW9wLT5hcmcxLmxpbmVhcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKQEAgLTQ5Niw2ICs0OTgsOCBAQAogCXhtYWRkcl90IG1hY2hfbHAgPSBhcmJpdHJhcnlfdmlydF90b19tYWNoaW5lKCZkdFtlbnRyeW51bV0pOwogCXU2NCBlbnRyeSA9ICoodTY0ICopcHRyOwogCisJdHJhY2VfeGVuX2NwdV93cml0ZV9sZHRfZW50cnkoZHQsIGVudHJ5bnVtLCBlbnRyeSk7CisKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAogCXhlbl9tY19mbHVzaCgpOwpAQCAtNTY1LDYgKzU2OSw4IEBACiAJdW5zaWduZWQgbG9uZyBwID0gKHVuc2lnbmVkIGxvbmcpJmR0W2VudHJ5bnVtXTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CiAKKwl0cmFjZV94ZW5fY3B1X3dyaXRlX2lkdF9lbnRyeShkdCwgZW50cnludW0sIGcpOworCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAKIAlzdGFydCA9IF9fdGhpc19jcHVfcmVhZChpZHRfZGVzYy5hZGRyZXNzKTsKQEAgLTYxOSw2ICs2MjUsOCBAQAogCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CiAJc3RhdGljIHN0cnVjdCB0cmFwX2luZm8gdHJhcHNbMjU3XTsKIAorCXRyYWNlX3hlbl9jcHVfbG9hZF9pZHQoZGVzYyk7CisKIAlzcGluX2xvY2soJmxvY2spOwogCiAJX19nZXRfY3B1X3ZhcihpZHRfZGVzYykgPSAqZGVzYzsKQEAgLTYzNyw2ICs2NDUsOCBAQAogc3RhdGljIHZvaWQgeGVuX3dyaXRlX2dkdF9lbnRyeShzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmR0LCBpbnQgZW50cnksCiAJCQkJY29uc3Qgdm9pZCAqZGVzYywgaW50IHR5cGUpCiB7CisJdHJhY2VfeGVuX2NwdV93cml0ZV9nZHRfZW50cnkoZHQsIGVudHJ5LCBkZXNjLCB0eXBlKTsKKwogCXByZWVtcHRfZGlzYWJsZSgpOwogCiAJc3dpdGNoICh0eXBlKSB7CkBAIC02NjUsNiArNjc1LDggQEAKIHN0YXRpYyB2b2lkIF9faW5pdCB4ZW5fd3JpdGVfZ2R0X2VudHJ5X2Jvb3Qoc3RydWN0IGRlc2Nfc3RydWN0ICpkdCwgaW50IGVudHJ5LAogCQkJCQkgICAgY29uc3Qgdm9pZCAqZGVzYywgaW50IHR5cGUpCiB7CisJdHJhY2VfeGVuX2NwdV93cml0ZV9nZHRfZW50cnkoZHQsIGVudHJ5LCBkZXNjLCB0eXBlKTsKKwogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgREVTQ19MRFQ6CiAJY2FzZSBERVNDX1RTUzoKQEAgLTY4NCw3ICs2OTYsOSBAQAogc3RhdGljIHZvaWQgeGVuX2xvYWRfc3AwKHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MsCiAJCQkgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCkKIHsKLQlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jcyA9IHhlbl9tY19lbnRyeSgwKTsKKwlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKKworCW1jcyA9IHhlbl9tY19lbnRyeSgwKTsKIAlNVUxUSV9zdGFja19zd2l0Y2gobWNzLm1jLCBfX0tFUk5FTF9EUywgdGhyZWFkLT5zcDApOwogCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX0NQVSk7CiB9CkBAIC0xMDMzLDYgKzEwNDcsMTMgQEAKIAl4ZW5fcmVib290KFNIVVRET1dOX3Bvd2Vyb2ZmKTsKIH0KIAorc3RhdGljIHZvaWQgeGVuX21hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCit7CisJaWYgKHBtX3Bvd2VyX29mZikKKwkJcG1fcG93ZXJfb2ZmKCk7CisJeGVuX3JlYm9vdChTSFVURE9XTl9wb3dlcm9mZik7Cit9CisKIHN0YXRpYyB2b2lkIHhlbl9jcmFzaF9zaHV0ZG93bihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl4ZW5fcmVib290KFNIVVRET1dOX2NyYXNoKTsKQEAgLTEwNTgsNyArMTA3OSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG1hY2hpbmVfb3BzIHhlbl9tYWNoaW5lX29wcyBfX2luaXRjb25zdCA9IHsKIAkucmVzdGFydCA9IHhlbl9yZXN0YXJ0LAogCS5oYWx0ID0geGVuX21hY2hpbmVfaGFsdCwKLQkucG93ZXJfb2ZmID0geGVuX21hY2hpbmVfaGFsdCwKKwkucG93ZXJfb2ZmID0geGVuX21hY2hpbmVfcG93ZXJfb2ZmLAogCS5zaHV0ZG93biA9IHhlbl9tYWNoaW5lX2hhbHQsCiAJLmNyYXNoX3NodXRkb3duID0geGVuX2NyYXNoX3NodXRkb3duLAogCS5lbWVyZ2VuY3lfcmVzdGFydCA9IHhlbl9lbWVyZ2VuY3lfcmVzdGFydCwKQEAgLTEyNDEsNiArMTI2MiwxNCBAQAogCQlpZiAocGNpX3hlbikKIAkJCXg4Nl9pbml0LnBjaS5hcmNoX2luaXQgPSBwY2lfeGVuX2luaXQ7CiAJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IGRvbTBfdmdhX2NvbnNvbGVfaW5mbyAqaW5mbyA9CisJCQkodm9pZCAqKSgoY2hhciAqKXhlbl9zdGFydF9pbmZvICsKKwkJCQkgeGVuX3N0YXJ0X2luZm8tPmNvbnNvbGUuZG9tMC5pbmZvX29mZik7CisKKwkJeGVuX2luaXRfdmdhKGluZm8sIHhlbl9zdGFydF9pbmZvLT5jb25zb2xlLmRvbTAuaW5mb19zaXplKTsKKwkJeGVuX3N0YXJ0X2luZm8tPmNvbnNvbGUuZG9tVS5tZm4gPSAwOworCQl4ZW5fc3RhcnRfaW5mby0+Y29uc29sZS5kb21VLmV2dGNobiA9IDA7CisKIAkJLyogTWFrZSBzdXJlIEFDUyB3aWxsIGJlIGVuYWJsZWQgKi8KIAkJcGNpX3JlcXVlc3RfYWNzKCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL21tdS5jIGIvYXJjaC94ODYveGVuL21tdS5jCmluZGV4IGRjNzA4ZGMuLmY5ODdiZGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9tbXUuYworKysgYi9hcmNoL3g4Ni94ZW4vbW11LmMKQEAgLTQ4LDYgKzQ4LDggQEAKICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMveGVuLmg+CisKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KQEAgLTU5LDYgKzYxLDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL3BhdC5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CkBAIC0xOTMsNiArMTk2LDggQEAKIAlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKIAlzdHJ1Y3QgbW11X3VwZGF0ZSAqdTsKIAorCXRyYWNlX3hlbl9tbXVfc2V0X2RvbWFpbl9wdGUocHRlcCwgcHRldmFsLCBkb21pZCk7CisKIAltY3MgPSB4ZW5fbWNfZW50cnkoc2l6ZW9mKCp1KSk7CiAJdSA9IG1jcy5hcmdzOwogCkBAIC0yMjQsNiArMjI5LDI0IEBACiAJKnUgPSAqdXBkYXRlOwogfQogCitzdGF0aWMgdm9pZCB4ZW5fZXh0ZW5kX21tdWV4dF9vcChjb25zdCBzdHJ1Y3QgbW11ZXh0X29wICpvcCkKK3sKKwlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKKwlzdHJ1Y3QgbW11ZXh0X29wICp1OworCisJbWNzID0geGVuX21jX2V4dGVuZF9hcmdzKF9fSFlQRVJWSVNPUl9tbXVleHRfb3AsIHNpemVvZigqdSkpOworCisJaWYgKG1jcy5tYyAhPSBOVUxMKSB7CisJCW1jcy5tYy0+YXJnc1sxXSsrOworCX0gZWxzZSB7CisJCW1jcyA9IF9feGVuX21jX2VudHJ5KHNpemVvZigqdSkpOworCQlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCBtY3MuYXJncywgMSwgTlVMTCwgRE9NSURfU0VMRik7CisJfQorCisJdSA9IG1jcy5hcmdzOworCSp1ID0gKm9wOworfQorCiBzdGF0aWMgdm9pZCB4ZW5fc2V0X3BtZF9oeXBlcihwbWRfdCAqcHRyLCBwbWRfdCB2YWwpCiB7CiAJc3RydWN0IG1tdV91cGRhdGUgdTsKQEAgLTI0NCw2ICsyNjcsOCBAQAogCiBzdGF0aWMgdm9pZCB4ZW5fc2V0X3BtZChwbWRfdCAqcHRyLCBwbWRfdCB2YWwpCiB7CisJdHJhY2VfeGVuX21tdV9zZXRfcG1kKHB0ciwgdmFsKTsKKwogCS8qIElmIHBhZ2UgaXMgbm90IHBpbm5lZCwgd2UgY2FuIGp1c3QgdXBkYXRlIHRoZSBlbnRyeQogCSAgIGRpcmVjdGx5ICovCiAJaWYgKCF4ZW5fcGFnZV9waW5uZWQocHRyKSkgewpAQCAtMjgxLDIyICszMDYsMzAgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQgeGVuX3NldF9wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3hlbl9zZXRfcHRlKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCiB7CiAJaWYgKCF4ZW5fYmF0Y2hlZF9zZXRfcHRlKHB0ZXAsIHB0ZXZhbCkpCiAJCW5hdGl2ZV9zZXRfcHRlKHB0ZXAsIHB0ZXZhbCk7CiB9CiAKK3N0YXRpYyB2b2lkIHhlbl9zZXRfcHRlKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCit7CisJdHJhY2VfeGVuX21tdV9zZXRfcHRlKHB0ZXAsIHB0ZXZhbCk7CisJX194ZW5fc2V0X3B0ZShwdGVwLCBwdGV2YWwpOworfQorCiBzdGF0aWMgdm9pZCB4ZW5fc2V0X3B0ZV9hdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkgICAgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKIHsKLQl4ZW5fc2V0X3B0ZShwdGVwLCBwdGV2YWwpOworCXRyYWNlX3hlbl9tbXVfc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgcHRldmFsKTsKKwlfX3hlbl9zZXRfcHRlKHB0ZXAsIHB0ZXZhbCk7CiB9CiAKIHB0ZV90IHhlbl9wdGVwX21vZGlmeV9wcm90X3N0YXJ0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCSB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewogCS8qIEp1c3QgcmV0dXJuIHRoZSBwdGUgYXMtaXMuICBXZSBwcmVzZXJ2ZSB0aGUgYml0cyBvbiBjb21taXQgKi8KKwl0cmFjZV94ZW5fbW11X3B0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQobW0sIGFkZHIsIHB0ZXAsICpwdGVwKTsKIAlyZXR1cm4gKnB0ZXA7CiB9CiAKQEAgLTMwNSw2ICszMzgsNyBAQAogewogCXN0cnVjdCBtbXVfdXBkYXRlIHU7CiAKKwl0cmFjZV94ZW5fbW11X3B0ZXBfbW9kaWZ5X3Byb3RfY29tbWl0KG1tLCBhZGRyLCBwdGVwLCBwdGUpOwogCXhlbl9tY19iYXRjaCgpOwogCiAJdS5wdHIgPSB2aXJ0X3RvX21hY2hpbmUocHRlcCkubWFkZHIgfCBNTVVfUFRfVVBEQVRFX1BSRVNFUlZFX0FEOwpAQCAtNTI5LDYgKzU2Myw4IEBACiAKIHN0YXRpYyB2b2lkIHhlbl9zZXRfcHVkKHB1ZF90ICpwdHIsIHB1ZF90IHZhbCkKIHsKKwl0cmFjZV94ZW5fbW11X3NldF9wdWQocHRyLCB2YWwpOworCiAJLyogSWYgcGFnZSBpcyBub3QgcGlubmVkLCB3ZSBjYW4ganVzdCB1cGRhdGUgdGhlIGVudHJ5CiAJICAgZGlyZWN0bHkgKi8KIAlpZiAoIXhlbl9wYWdlX3Bpbm5lZChwdHIpKSB7CkBAIC01NDIsMTcgKzU3OCwyMCBAQAogI2lmZGVmIENPTkZJR19YODZfUEFFCiBzdGF0aWMgdm9pZCB4ZW5fc2V0X3B0ZV9hdG9taWMocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKIHsKKwl0cmFjZV94ZW5fbW11X3NldF9wdGVfYXRvbWljKHB0ZXAsIHB0ZSk7CiAJc2V0XzY0Yml0KCh1NjQgKilwdGVwLCBuYXRpdmVfcHRlX3ZhbChwdGUpKTsKIH0KIAogc3RhdGljIHZvaWQgeGVuX3B0ZV9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKIHsKKwl0cmFjZV94ZW5fbW11X3B0ZV9jbGVhcihtbSwgYWRkciwgcHRlcCk7CiAJaWYgKCF4ZW5fYmF0Y2hlZF9zZXRfcHRlKHB0ZXAsIG5hdGl2ZV9tYWtlX3B0ZSgwKSkpCiAJCW5hdGl2ZV9wdGVfY2xlYXIobW0sIGFkZHIsIHB0ZXApOwogfQogCiBzdGF0aWMgdm9pZCB4ZW5fcG1kX2NsZWFyKHBtZF90ICpwbWRwKQogeworCXRyYWNlX3hlbl9tbXVfcG1kX2NsZWFyKHBtZHApOwogCXNldF9wbWQocG1kcCwgX19wbWQoMCkpOwogfQogI2VuZGlmCS8qIENPTkZJR19YODZfUEFFICovCkBAIC02MjgsNiArNjY3LDggQEAKIHsKIAlwZ2RfdCAqdXNlcl9wdHIgPSB4ZW5fZ2V0X3VzZXJfcGdkKHB0cik7CiAKKwl0cmFjZV94ZW5fbW11X3NldF9wZ2QocHRyLCB1c2VyX3B0ciwgdmFsKTsKKwogCS8qIElmIHBhZ2UgaXMgbm90IHBpbm5lZCwgd2UgY2FuIGp1c3QgdXBkYXRlIHRoZSBlbnRyeQogCSAgIGRpcmVjdGx5ICovCiAJaWYgKCF4ZW5fcGFnZV9waW5uZWQocHRyKSkgewpAQCAtNzg3LDE0ICs4MjgsMTIgQEAKIAogc3RhdGljIHZvaWQgeGVuX2RvX3Bpbih1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQgbG9uZyBwZm4pCiB7Ci0Jc3RydWN0IG1tdWV4dF9vcCAqb3A7Ci0Jc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CisJc3RydWN0IG1tdWV4dF9vcCBvcDsKIAotCW1jcyA9IF9feGVuX21jX2VudHJ5KHNpemVvZigqb3ApKTsKLQlvcCA9IG1jcy5hcmdzOwotCW9wLT5jbWQgPSBsZXZlbDsKLQlvcC0+YXJnMS5tZm4gPSBwZm5fdG9fbWZuKHBmbik7Ci0JTVVMVElfbW11ZXh0X29wKG1jcy5tYywgb3AsIDEsIE5VTEwsIERPTUlEX1NFTEYpOworCW9wLmNtZCA9IGxldmVsOworCW9wLmFyZzEubWZuID0gcGZuX3RvX21mbihwZm4pOworCisJeGVuX2V4dGVuZF9tbXVleHRfb3AoJm9wKTsKIH0KIAogc3RhdGljIGludCB4ZW5fcGluX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwYWdlLApAQCAtODYyLDYgKzkwMSw4IEBACiAgICByZWFkLW9ubHksIGFuZCBjYW4gYmUgcGlubmVkLiAqLwogc3RhdGljIHZvaWQgX194ZW5fcGdkX3BpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCkKIHsKKwl0cmFjZV94ZW5fbW11X3BnZF9waW4obW0sIHBnZCk7CisKIAl4ZW5fbWNfYmF0Y2goKTsKIAogCWlmIChfX3hlbl9wZ2Rfd2FsayhtbSwgcGdkLCB4ZW5fcGluX3BhZ2UsIFVTRVJfTElNSVQpKSB7CkBAIC05ODcsNiArMTAyOCw4IEBACiAvKiBSZWxlYXNlIGEgcGFnZXRhYmxlcyBwYWdlcyBiYWNrIGFzIG5vcm1hbCBSVyAqLwogc3RhdGljIHZvaWQgX194ZW5fcGdkX3VucGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkKQogeworCXRyYWNlX3hlbl9tbXVfcGdkX3VucGluKG1tLCBwZ2QpOworCiAJeGVuX21jX2JhdGNoKCk7CiAKIAl4ZW5fZG9fcGluKE1NVUVYVF9VTlBJTl9UQUJMRSwgUEZOX0RPV04oX19wYShwZ2QpKSk7CkBAIC0xMTk1LDYgKzEyMzgsOCBAQAogCXN0cnVjdCBtbXVleHRfb3AgKm9wOwogCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOwogCisJdHJhY2VfeGVuX21tdV9mbHVzaF90bGIoMCk7CisKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAogCW1jcyA9IHhlbl9tY19lbnRyeShzaXplb2YoKm9wKSk7CkBAIC0xMjEzLDYgKzEyNTgsOCBAQAogCXN0cnVjdCBtbXVleHRfb3AgKm9wOwogCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOwogCisJdHJhY2VfeGVuX21tdV9mbHVzaF90bGJfc2luZ2xlKGFkZHIpOworCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAKIAltY3MgPSB4ZW5fbWNfZW50cnkoc2l6ZW9mKCpvcCkpOwpAQCAtMTIzMSwxMCArMTI3OCwxNiBAQAogewogCXN0cnVjdCB7CiAJCXN0cnVjdCBtbXVleHRfb3Agb3A7CisjaWZkZWYgQ09ORklHX1NNUAorCQlERUNMQVJFX0JJVE1BUChtYXNrLCBudW1fcHJvY2Vzc29ycyk7CisjZWxzZQogCQlERUNMQVJFX0JJVE1BUChtYXNrLCBOUl9DUFVTKTsKKyNlbmRpZgogCX0gKmFyZ3M7CiAJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CiAKKwl0cmFjZV94ZW5fbW11X2ZsdXNoX3RsYl9vdGhlcnMoY3B1cywgbW0sIHZhKTsKKwogCWlmIChjcHVtYXNrX2VtcHR5KGNwdXMpKQogCQlyZXR1cm47CQkvKiBub3RoaW5nIHRvIGRvICovCiAKQEAgLTEyNzAsMTAgKzEzMjMsMTEgQEAKIAogc3RhdGljIHZvaWQgX194ZW5fd3JpdGVfY3IzKGJvb2wga2VybmVsLCB1bnNpZ25lZCBsb25nIGNyMykKIHsKLQlzdHJ1Y3QgbW11ZXh0X29wICpvcDsKLQlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKKwlzdHJ1Y3QgbW11ZXh0X29wIG9wOwogCXVuc2lnbmVkIGxvbmcgbWZuOwogCisJdHJhY2VfeGVuX21tdV93cml0ZV9jcjMoa2VybmVsLCBjcjMpOworCiAJaWYgKGNyMykKIAkJbWZuID0gcGZuX3RvX21mbihQRk5fRE9XTihjcjMpKTsKIAllbHNlCkBAIC0xMjgxLDEzICsxMzM1LDEwIEBACiAKIAlXQVJOX09OKG1mbiA9PSAwICYmIGtlcm5lbCk7CiAKLQltY3MgPSBfX3hlbl9tY19lbnRyeShzaXplb2YoKm9wKSk7CisJb3AuY21kID0ga2VybmVsID8gTU1VRVhUX05FV19CQVNFUFRSIDogTU1VRVhUX05FV19VU0VSX0JBU0VQVFI7CisJb3AuYXJnMS5tZm4gPSBtZm47CiAKLQlvcCA9IG1jcy5hcmdzOwotCW9wLT5jbWQgPSBrZXJuZWwgPyBNTVVFWFRfTkVXX0JBU0VQVFIgOiBNTVVFWFRfTkVXX1VTRVJfQkFTRVBUUjsKLQlvcC0+YXJnMS5tZm4gPSBtZm47Ci0KLQlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCBvcCwgMSwgTlVMTCwgRE9NSURfU0VMRik7CisJeGVuX2V4dGVuZF9tbXVleHRfb3AoJm9wKTsKIAogCWlmIChrZXJuZWwpIHsKIAkJcGVyY3B1X3dyaXRlKHhlbl9jcjMsIGNyMyk7CkBAIC0xNDQ2LDE5ICsxNDk3LDUyIEBACiAJbWFrZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUoX192YShQRk5fUEhZUyhwZm4pKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Bpbl9wYWdldGFibGVfcGZuKHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBwZm4pCit7CisJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CisJc3RydWN0IG1tdWV4dF9vcCAqb3A7CisKKwltY3MgPSBfX3hlbl9tY19lbnRyeShzaXplb2YoKm9wKSk7CisJb3AgPSBtY3MuYXJnczsKKwlvcC0+Y21kID0gY21kOworCW9wLT5hcmcxLm1mbiA9IHBmbl90b19tZm4ocGZuKTsKKworCU1VTFRJX21tdWV4dF9vcChtY3MubWMsIG1jcy5hcmdzLCAxLCBOVUxMLCBET01JRF9TRUxGKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fc2V0X3Bmbl9wcm90KHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQoreworCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOworCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKV9fdmEocGZuIDw8IFBBR0VfU0hJRlQpOworCisJbWNzID0gX194ZW5fbWNfZW50cnkoMCk7CisJTVVMVElfdXBkYXRlX3ZhX21hcHBpbmcobWNzLm1jLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkJCXBmbl9wdGUocGZuLCBwcm90KSwgMCk7Cit9CisKIC8qIFRoaXMgbmVlZHMgdG8gbWFrZSBzdXJlIHRoZSBuZXcgcHRlIHBhZ2UgaXMgcGlubmVkIGlmZiBpdHMgYmVpbmcKICAgIGF0dGFjaGVkIHRvIGEgcGlubmVkIHBhZ2V0YWJsZS4gKi8KLXN0YXRpYyB2b2lkIHhlbl9hbGxvY19wdHBhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsZXZlbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZW5fYWxsb2NfcHRwYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbiwKKwkJCQkgICAgdW5zaWduZWQgbGV2ZWwpCiB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCWJvb2wgcGlubmVkID0gUGFnZVBpbm5lZCh2aXJ0X3RvX3BhZ2UobW0tPnBnZCkpOwogCi0JaWYgKFBhZ2VQaW5uZWQodmlydF90b19wYWdlKG1tLT5wZ2QpKSkgeworCXRyYWNlX3hlbl9tbXVfYWxsb2NfcHRwYWdlKG1tLCBwZm4sIGxldmVsLCBwaW5uZWQpOworCisJaWYgKHBpbm5lZCkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisKIAkJU2V0UGFnZVBpbm5lZChwYWdlKTsKIAogCQlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7Ci0JCQltYWtlX2xvd21lbV9wYWdlX3JlYWRvbmx5KF9fdmEoUEZOX1BIWVMoKHVuc2lnbmVkIGxvbmcpcGZuKSkpOworCQkJeGVuX21jX2JhdGNoKCk7CisKKwkJCV9fc2V0X3Bmbl9wcm90KHBmbiwgUEFHRV9LRVJORUxfUk8pOworCiAJCQlpZiAobGV2ZWwgPT0gUFRfUFRFICYmIFVTRV9TUExJVF9QVExPQ0tTKQotCQkJCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9QSU5fTDFfVEFCTEUsIHBmbik7CisJCQkJX19waW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfUElOX0wxX1RBQkxFLCBwZm4pOworCisJCQl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOwogCQl9IGVsc2UgewogCQkJLyogbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBzdHJheSBtYXBwaW5ncyBvZgogCQkJICAgdGhpcyBwYWdlICovCkBAIC0xNDc4LDE1ICsxNTYyLDIzIEBACiB9CiAKIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB1bnRpbCB3ZSdyZSBPSyB0byB1c2Ugc3RydWN0IHBhZ2UgKi8KLXN0YXRpYyB2b2lkIHhlbl9yZWxlYXNlX3B0cGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbGV2ZWwpCitzdGF0aWMgaW5saW5lIHZvaWQgeGVuX3JlbGVhc2VfcHRwYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsZXZlbCkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisJYm9vbCBwaW5uZWQgPSBQYWdlUGlubmVkKHBhZ2UpOwogCi0JaWYgKFBhZ2VQaW5uZWQocGFnZSkpIHsKKwl0cmFjZV94ZW5fbW11X3JlbGVhc2VfcHRwYWdlKHBmbiwgbGV2ZWwsIHBpbm5lZCk7CisKKwlpZiAocGlubmVkKSB7CiAJCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpIHsKKwkJCXhlbl9tY19iYXRjaCgpOworCiAJCQlpZiAobGV2ZWwgPT0gUFRfUFRFICYmIFVTRV9TUExJVF9QVExPQ0tTKQotCQkJCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9VTlBJTl9UQUJMRSwgcGZuKTsKLQkJCW1ha2VfbG93bWVtX3BhZ2VfcmVhZHdyaXRlKF9fdmEoUEZOX1BIWVMocGZuKSkpOworCQkJCV9fcGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1VOUElOX1RBQkxFLCBwZm4pOworCisJCQlfX3NldF9wZm5fcHJvdChwZm4sIFBBR0VfS0VSTkVMKTsKKworCQkJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKIAkJfQogCQlDbGVhclBhZ2VQaW5uZWQocGFnZSk7CiAJfQpAQCAtMTU5OSw2ICsxNjkxLDExIEBACiAJCWZvciAocHRlaWR4ID0gMDsgcHRlaWR4IDwgUFRSU19QRVJfUFRFOyBwdGVpZHgrKywgcGZuKyspIHsKIAkJCXB0ZV90IHB0ZTsKIAorI2lmZGVmIENPTkZJR19YODZfMzIKKwkJCWlmIChwZm4gPiBtYXhfcGZuX21hcHBlZCkKKwkJCQltYXhfcGZuX21hcHBlZCA9IHBmbjsKKyNlbmRpZgorCiAJCQlpZiAoIXB0ZV9ub25lKHB0ZV9wYWdlW3B0ZWlkeF0pKQogCQkJCWNvbnRpbnVlOwogCkBAIC0xNzY2LDcgKzE4NjMsOSBAQAogCWluaXRpYWxfa2VybmVsX3BtZCA9CiAJCWV4dGVuZF9icmsoc2l6ZW9mKHBtZF90KSAqIFBUUlNfUEVSX1BNRCwgUEFHRV9TSVpFKTsKIAotCW1heF9wZm5fbWFwcGVkID0gUEZOX0RPV04oX19wYSh4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QpKTsKKwltYXhfcGZuX21hcHBlZCA9IFBGTl9ET1dOKF9fcGEoeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UpICsKKwkJCQkgIHhlbl9zdGFydF9pbmZvLT5ucl9wdF9mcmFtZXMgKiBQQUdFX1NJWkUgKworCQkJCSAgNTEyKjEwMjQpOwogCiAJa2VybmVsX3BtZCA9IG0ydihwZ2RbS0VSTkVMX1BHRF9CT1VOREFSWV0ucGdkKTsKIAltZW1jcHkoaW5pdGlhbF9rZXJuZWxfcG1kLCBrZXJuZWxfcG1kLCBzaXplb2YocG1kX3QpICogUFRSU19QRVJfUE1EKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9tdWx0aWNhbGxzLmMgYi9hcmNoL3g4Ni94ZW4vbXVsdGljYWxscy5jCmluZGV4IDhiZmY3ZTcuLjBkODIwMDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9tdWx0aWNhbGxzLmMKKysrIGIvYXJjaC94ODYveGVuL211bHRpY2FsbHMuYwpAQCAtMzAsMTIgKzMwLDEzIEBACiAKICNkZWZpbmUgTUNfQkFUQ0gJMzIKIAotI2RlZmluZSBNQ19ERUJVRwkxCisjZGVmaW5lIE1DX0RFQlVHCTAKIAogI2RlZmluZSBNQ19BUkdTCQkoTUNfQkFUQ0ggKiAxNikKIAogCiBzdHJ1Y3QgbWNfYnVmZmVyIHsKKwl1bnNpZ25lZCBtY2lkeCwgYXJnaWR4LCBjYmlkeDsKIAlzdHJ1Y3QgbXVsdGljYWxsX2VudHJ5IGVudHJpZXNbTUNfQkFUQ0hdOwogI2lmIE1DX0RFQlVHCiAJc3RydWN0IG11bHRpY2FsbF9lbnRyeSBkZWJ1Z1tNQ19CQVRDSF07CkBAIC00Niw4NSArNDcsMTUgQEAKIAkJdm9pZCAoKmZuKSh2b2lkICopOwogCQl2b2lkICpkYXRhOwogCX0gY2FsbGJhY2tzW01DX0JBVENIXTsKLQl1bnNpZ25lZCBtY2lkeCwgYXJnaWR4LCBjYmlkeDsKIH07CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbWNfYnVmZmVyLCBtY19idWZmZXIpOwogREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgeGVuX21jX2lycV9mbGFncyk7CiAKLS8qIGZsdXNoIHJlYXNvbnMgMC0gc2xvdHMsIDEtIGFyZ3MsIDItIGNhbGxiYWNrcyAqLwotZW51bSBmbHVzaF9yZWFzb25zCi17Ci0JRkxfU0xPVFMsCi0JRkxfQVJHUywKLQlGTF9DQUxMQkFDS1MsCi0KLQlGTF9OX1JFQVNPTlMKLX07Ci0KLSNpZmRlZiBDT05GSUdfWEVOX0RFQlVHX0ZTCi0jZGVmaW5lIE5IWVBFUkNBTExTCTQwCQkvKiBub3QgcmVhbGx5ICovCi0KLXN0YXRpYyBzdHJ1Y3QgewotCXVuc2lnbmVkIGhpc3RvW01DX0JBVENIKzFdOwotCi0JdW5zaWduZWQgaXNzdWVkOwotCXVuc2lnbmVkIGFyZ190b3RhbDsKLQl1bnNpZ25lZCBoeXBlcmNhbGxzOwotCXVuc2lnbmVkIGhpc3RvX2h5cGVyY2FsbHNbTkhZUEVSQ0FMTFNdOwotCi0JdW5zaWduZWQgZmx1c2hbRkxfTl9SRUFTT05TXTsKLX0gbWNfc3RhdHM7Ci0KLXN0YXRpYyB1OCB6ZXJvX3N0YXRzOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfemVybyh2b2lkKQotewotCWlmICh1bmxpa2VseSh6ZXJvX3N0YXRzKSkgewotCQltZW1zZXQoJm1jX3N0YXRzLCAwLCBzaXplb2YobWNfc3RhdHMpKTsKLQkJemVyb19zdGF0cyA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtY19hZGRfc3RhdHMoY29uc3Qgc3RydWN0IG1jX2J1ZmZlciAqbWMpCi17Ci0JaW50IGk7Ci0KLQljaGVja196ZXJvKCk7Ci0KLQltY19zdGF0cy5pc3N1ZWQrKzsKLQltY19zdGF0cy5oeXBlcmNhbGxzICs9IG1jLT5tY2lkeDsKLQltY19zdGF0cy5hcmdfdG90YWwgKz0gbWMtPmFyZ2lkeDsKLQotCW1jX3N0YXRzLmhpc3RvW21jLT5tY2lkeF0rKzsKLQlmb3IoaSA9IDA7IGkgPCBtYy0+bWNpZHg7IGkrKykgewotCQl1bnNpZ25lZCBvcCA9IG1jLT5lbnRyaWVzW2ldLm9wOwotCQlpZiAob3AgPCBOSFlQRVJDQUxMUykKLQkJCW1jX3N0YXRzLmhpc3RvX2h5cGVyY2FsbHNbb3BdKys7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtY19zdGF0c19mbHVzaChlbnVtIGZsdXNoX3JlYXNvbnMgaWR4KQotewotCWNoZWNrX3plcm8oKTsKLQotCW1jX3N0YXRzLmZsdXNoW2lkeF0rKzsKLX0KLQotI2Vsc2UgIC8qICFDT05GSUdfWEVOX0RFQlVHX0ZTICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtY19hZGRfc3RhdHMoY29uc3Qgc3RydWN0IG1jX2J1ZmZlciAqbWMpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtY19zdGF0c19mbHVzaChlbnVtIGZsdXNoX3JlYXNvbnMgaWR4KQotewotfQotI2VuZGlmCS8qIENPTkZJR19YRU5fREVCVUdfRlMgKi8KLQogdm9pZCB4ZW5fbWNfZmx1c2godm9pZCkKIHsKIAlzdHJ1Y3QgbWNfYnVmZmVyICpiID0gJl9fZ2V0X2NwdV92YXIobWNfYnVmZmVyKTsKKwlzdHJ1Y3QgbXVsdGljYWxsX2VudHJ5ICptYzsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwpAQCAtMTM1LDkgKzY2LDI2IEBACiAJICAgc29tZXRoaW5nIGluIHRoZSBtaWRkbGUgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKLQltY19hZGRfc3RhdHMoYik7CisJdHJhY2VfeGVuX21jX2ZsdXNoKGItPm1jaWR4LCBiLT5hcmdpZHgsIGItPmNiaWR4KTsKIAotCWlmIChiLT5tY2lkeCkgeworCXN3aXRjaCAoYi0+bWNpZHgpIHsKKwljYXNlIDA6CisJCS8qIG5vLW9wICovCisJCUJVR19PTihiLT5hcmdpZHggIT0gMCk7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQkvKiBTaW5nbGV0b24gbXVsdGljYWxsIC0gYnlwYXNzIG11bHRpY2FsbCBtYWNoaW5lcnkKKwkJICAgYW5kIGp1c3QgZG8gdGhlIGNhbGwgZGlyZWN0bHkuICovCisJCW1jID0gJmItPmVudHJpZXNbMF07CisKKwkJbWMtPnJlc3VsdCA9IHByaXZjbWRfY2FsbChtYy0+b3AsCisJCQkJCSAgbWMtPmFyZ3NbMF0sIG1jLT5hcmdzWzFdLCBtYy0+YXJnc1syXSwgCisJCQkJCSAgbWMtPmFyZ3NbM10sIG1jLT5hcmdzWzRdKTsKKwkJcmV0ID0gbWMtPnJlc3VsdCA8IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKICNpZiBNQ19ERUJVRwogCQltZW1jcHkoYi0+ZGVidWcsIGItPmVudHJpZXMsCiAJCSAgICAgICBiLT5tY2lkeCAqIHNpemVvZihzdHJ1Y3QgbXVsdGljYWxsX2VudHJ5KSk7CkBAIC0xNjQsMTEgKzExMiwxMCBAQAogCQkJfQogCQl9CiAjZW5kaWYKKwl9CiAKLQkJYi0+bWNpZHggPSAwOwotCQliLT5hcmdpZHggPSAwOwotCX0gZWxzZQotCQlCVUdfT04oYi0+YXJnaWR4ICE9IDApOworCWItPm1jaWR4ID0gMDsKKwliLT5hcmdpZHggPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IGItPmNiaWR4OyBpKyspIHsKIAkJc3RydWN0IGNhbGxiYWNrICpjYiA9ICZiLT5jYWxsYmFja3NbaV07CkBAIC0xODgsMjUgKzEzNSwyOCBAQAogCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgcmV0OwogCXVuc2lnbmVkIGFyZ2lkeCA9IHJvdW5kdXAoYi0+YXJnaWR4LCBzaXplb2YodTY0KSk7CiAKLQlCVUdfT04ocHJlZW1wdGlibGUoKSk7Ci0JQlVHX09OKGItPmFyZ2lkeCA+IE1DX0FSR1MpOworCXRyYWNlX3hlbl9tY19lbnRyeV9hbGxvYyhhcmdzKTsKIAotCWlmIChiLT5tY2lkeCA9PSBNQ19CQVRDSCB8fAotCSAgICAoYXJnaWR4ICsgYXJncykgPiBNQ19BUkdTKSB7Ci0JCW1jX3N0YXRzX2ZsdXNoKGItPm1jaWR4ID09IE1DX0JBVENIID8gRkxfU0xPVFMgOiBGTF9BUkdTKTsKKwlCVUdfT04ocHJlZW1wdGlibGUoKSk7CisJQlVHX09OKGItPmFyZ2lkeCA+PSBNQ19BUkdTKTsKKworCWlmICh1bmxpa2VseShiLT5tY2lkeCA9PSBNQ19CQVRDSCB8fAorCQkgICAgIChhcmdpZHggKyBhcmdzKSA+PSBNQ19BUkdTKSkgeworCQl0cmFjZV94ZW5fbWNfZmx1c2hfcmVhc29uKChiLT5tY2lkeCA9PSBNQ19CQVRDSCkgPworCQkJCQkgIFhFTl9NQ19GTF9CQVRDSCA6IFhFTl9NQ19GTF9BUkdTKTsKIAkJeGVuX21jX2ZsdXNoKCk7CiAJCWFyZ2lkeCA9IHJvdW5kdXAoYi0+YXJnaWR4LCBzaXplb2YodTY0KSk7CiAJfQogCiAJcmV0Lm1jID0gJmItPmVudHJpZXNbYi0+bWNpZHhdOwotI2lmZGVmIE1DX0RFQlVHCisjaWYgTUNfREVCVUcKIAliLT5jYWxsZXJbYi0+bWNpZHhdID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwogI2VuZGlmCiAJYi0+bWNpZHgrKzsKIAlyZXQuYXJncyA9ICZiLT5hcmdzW2FyZ2lkeF07CiAJYi0+YXJnaWR4ID0gYXJnaWR4ICsgYXJnczsKIAotCUJVR19PTihiLT5hcmdpZHggPiBNQ19BUkdTKTsKKwlCVUdfT04oYi0+YXJnaWR4ID49IE1DX0FSR1MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxNiwyMiArMTY2LDI3IEBACiAJc3RydWN0IG11bHRpY2FsbF9zcGFjZSByZXQgPSB7IE5VTEwsIE5VTEwgfTsKIAogCUJVR19PTihwcmVlbXB0aWJsZSgpKTsKLQlCVUdfT04oYi0+YXJnaWR4ID4gTUNfQVJHUyk7CisJQlVHX09OKGItPmFyZ2lkeCA+PSBNQ19BUkdTKTsKIAotCWlmIChiLT5tY2lkeCA9PSAwKQotCQlyZXR1cm4gcmV0OworCWlmICh1bmxpa2VseShiLT5tY2lkeCA9PSAwIHx8CisJCSAgICAgYi0+ZW50cmllc1tiLT5tY2lkeCAtIDFdLm9wICE9IG9wKSkgeworCQl0cmFjZV94ZW5fbWNfZXh0ZW5kX2FyZ3Mob3AsIHNpemUsIFhFTl9NQ19YRV9CQURfT1ApOworCQlnb3RvIG91dDsKKwl9CiAKLQlpZiAoYi0+ZW50cmllc1tiLT5tY2lkeCAtIDFdLm9wICE9IG9wKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKChiLT5hcmdpZHggKyBzaXplKSA+IE1DX0FSR1MpCi0JCXJldHVybiByZXQ7CisJaWYgKHVubGlrZWx5KChiLT5hcmdpZHggKyBzaXplKSA+PSBNQ19BUkdTKSkgeworCQl0cmFjZV94ZW5fbWNfZXh0ZW5kX2FyZ3Mob3AsIHNpemUsIFhFTl9NQ19YRV9OT19TUEFDRSk7CisJCWdvdG8gb3V0OworCX0KIAogCXJldC5tYyA9ICZiLT5lbnRyaWVzW2ItPm1jaWR4IC0gMV07CiAJcmV0LmFyZ3MgPSAmYi0+YXJnc1tiLT5hcmdpZHhdOwogCWItPmFyZ2lkeCArPSBzaXplOwogCi0JQlVHX09OKGItPmFyZ2lkeCA+IE1DX0FSR1MpOworCUJVR19PTihiLT5hcmdpZHggPj0gTUNfQVJHUyk7CisKKwl0cmFjZV94ZW5fbWNfZXh0ZW5kX2FyZ3Mob3AsIHNpemUsIFhFTl9NQ19YRV9PSyk7CitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjQxLDQzICsxOTYsMTMgQEAKIAlzdHJ1Y3QgY2FsbGJhY2sgKmNiOwogCiAJaWYgKGItPmNiaWR4ID09IE1DX0JBVENIKSB7Ci0JCW1jX3N0YXRzX2ZsdXNoKEZMX0NBTExCQUNLUyk7CisJCXRyYWNlX3hlbl9tY19mbHVzaF9yZWFzb24oWEVOX01DX0ZMX0NBTExCQUNLKTsKIAkJeGVuX21jX2ZsdXNoKCk7CiAJfQogCisJdHJhY2VfeGVuX21jX2NhbGxiYWNrKGZuLCBkYXRhKTsKKwogCWNiID0gJmItPmNhbGxiYWNrc1tiLT5jYmlkeCsrXTsKIAljYi0+Zm4gPSBmbjsKIAljYi0+ZGF0YSA9IGRhdGE7CiB9Ci0KLSNpZmRlZiBDT05GSUdfWEVOX0RFQlVHX0ZTCi0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkX21jX2RlYnVnOwotCi1zdGF0aWMgaW50IF9faW5pdCB4ZW5fbWNfZGVidWdmcyh2b2lkKQotewotCXN0cnVjdCBkZW50cnkgKmRfeGVuID0geGVuX2luaXRfZGVidWdmcygpOwotCi0JaWYgKGRfeGVuID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZF9tY19kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2RpcigibXVsdGljYWxscyIsIGRfeGVuKTsKLQotCWRlYnVnZnNfY3JlYXRlX3U4KCJ6ZXJvX3N0YXRzIiwgMDY0NCwgZF9tY19kZWJ1ZywgJnplcm9fc3RhdHMpOwotCi0JZGVidWdmc19jcmVhdGVfdTMyKCJiYXRjaGVzIiwgMDQ0NCwgZF9tY19kZWJ1ZywgJm1jX3N0YXRzLmlzc3VlZCk7Ci0JZGVidWdmc19jcmVhdGVfdTMyKCJoeXBlcmNhbGxzIiwgMDQ0NCwgZF9tY19kZWJ1ZywgJm1jX3N0YXRzLmh5cGVyY2FsbHMpOwotCWRlYnVnZnNfY3JlYXRlX3UzMigiYXJnX3RvdGFsIiwgMDQ0NCwgZF9tY19kZWJ1ZywgJm1jX3N0YXRzLmFyZ190b3RhbCk7Ci0KLQl4ZW5fZGVidWdmc19jcmVhdGVfdTMyX2FycmF5KCJiYXRjaF9oaXN0byIsIDA0NDQsIGRfbWNfZGVidWcsCi0JCQkJICAgICBtY19zdGF0cy5oaXN0bywgTUNfQkFUQ0gpOwotCXhlbl9kZWJ1Z2ZzX2NyZWF0ZV91MzJfYXJyYXkoImh5cGVyY2FsbF9oaXN0byIsIDA0NDQsIGRfbWNfZGVidWcsCi0JCQkJICAgICBtY19zdGF0cy5oaXN0b19oeXBlcmNhbGxzLCBOSFlQRVJDQUxMUyk7Ci0JeGVuX2RlYnVnZnNfY3JlYXRlX3UzMl9hcnJheSgiZmx1c2hfcmVhc29ucyIsIDA0NDQsIGRfbWNfZGVidWcsCi0JCQkJICAgICBtY19zdGF0cy5mbHVzaCwgRkxfTl9SRUFTT05TKTsKLQotCXJldHVybiAwOwotfQotZnNfaW5pdGNhbGwoeGVuX21jX2RlYnVnZnMpOwotCi0jZW5kaWYJLyogQ09ORklHX1hFTl9ERUJVR19GUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL211bHRpY2FsbHMuaCBiL2FyY2gveDg2L3hlbi9tdWx0aWNhbGxzLmgKaW5kZXggNGVjODAzNS4uZGVlNzliNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL211bHRpY2FsbHMuaAorKysgYi9hcmNoL3g4Ni94ZW4vbXVsdGljYWxscy5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfWEVOX01VTFRJQ0FMTFNfSAogI2RlZmluZSBfWEVOX01VTFRJQ0FMTFNfSAogCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3hlbi5oPgorCiAjaW5jbHVkZSAieGVuLW9wcy5oIgogCiAvKiBNdWx0aWNhbGxzICovCkBAIC0yMCw4ICsyMiwxMCBAQAogc3RhdGljIGlubGluZSB2b2lkIHhlbl9tY19iYXRjaCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAkvKiBuZWVkIHRvIGRpc2FibGUgaW50ZXJydXB0cyB1bnRpbCB0aGlzIGVudHJ5IGlzIGNvbXBsZXRlICovCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXRyYWNlX3hlbl9tY19iYXRjaChwYXJhdmlydF9nZXRfbGF6eV9tb2RlKCkpOwogCV9fdGhpc19jcHVfd3JpdGUoeGVuX21jX2lycV9mbGFncywgZmxhZ3MpOwogfQogCkBAIC0zNyw2ICs0MSw4IEBACiAvKiBJc3N1ZSBhIG11bHRpY2FsbCBpZiB3ZSdyZSBub3QgaW4gYSBsYXp5IG1vZGUgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZW5fbWNfaXNzdWUodW5zaWduZWQgbW9kZSkKIHsKKwl0cmFjZV94ZW5fbWNfaXNzdWUobW9kZSk7CisKIAlpZiAoKHBhcmF2aXJ0X2dldF9sYXp5X21vZGUoKSAmIG1vZGUpID09IDApCiAJCXhlbl9tY19mbHVzaCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vcGxhdGZvcm0tcGNpLXVucGx1Zy5jIGIvYXJjaC94ODYveGVuL3BsYXRmb3JtLXBjaS11bnBsdWcuYwppbmRleCAyNWM1MmY5Li5mZmNmMjYxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vcGxhdGZvcm0tcGNpLXVucGx1Zy5jCisrKyBiL2FyY2gveDg2L3hlbi9wbGF0Zm9ybS1wY2ktdW5wbHVnLmMKQEAgLTM1LDcgKzM1LDcgQEAKICNpZmRlZiBDT05GSUdfWEVOX1BWSFZNCiBzdGF0aWMgaW50IHhlbl9lbXVsX3VucGx1ZzsKIAotc3RhdGljIGludCBfX2luaXQgY2hlY2tfcGxhdGZvcm1fbWFnaWModm9pZCkKK3N0YXRpYyBpbnQgY2hlY2tfcGxhdGZvcm1fbWFnaWModm9pZCkKIHsKIAlzaG9ydCBtYWdpYzsKIAljaGFyIHByb3RvY29sOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NldHVwLmMgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwppbmRleCBiZTFhNDY0Li42MGFlZWI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYworKysgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwpAQCAtMjI3LDExICsyMjcsNyBAQAogCiAJbWVtY3B5KG1hcF9yYXcsIG1hcCwgc2l6ZW9mKG1hcCkpOwogCWU4MjAubnJfbWFwID0gMDsKLSNpZmRlZiBDT05GSUdfWDg2XzMyCiAJeGVuX2V4dHJhX21lbV9zdGFydCA9IG1lbV9lbmQ7Ci0jZWxzZQotCXhlbl9leHRyYV9tZW1fc3RhcnQgPSBtYXgoKDFVTEwgPDwgMzIpLCBtZW1fZW5kKTsKLSNlbmRpZgogCWZvciAoaSA9IDA7IGkgPCBtZW1tYXAubnJfZW50cmllczsgaSsrKSB7CiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBlbmQ7CiAKQEAgLTI2Niw2ICsyNjIsMTIgQEAKIAkJaWYgKG1hcFtpXS5zaXplID4gMCkKIAkJCWU4MjBfYWRkX3JlZ2lvbihtYXBbaV0uYWRkciwgbWFwW2ldLnNpemUsIG1hcFtpXS50eXBlKTsKIAl9CisJLyogQWxpZ24gdGhlIGJhbGxvb24gYXJlYSBzbyB0aGF0IG1heF9sb3dfcGZuIGRvZXMgbm90IGdldCBzZXQKKwkgKiB0byBiZSBhdCB0aGUgX2VuZF8gb2YgdGhlIFBDSSBnYXAgYXQgdGhlIGZhciBlbmQgKGZlZTAxMDAwKS4KKwkgKiBOb3RlIHRoYXQgeGVuX2V4dHJhX21lbV9zdGFydCBnZXRzIHNldCBpbiB0aGUgbG9vcCBhYm92ZSB0byBiZQorCSAqIHBhc3QgdGhlIGxhc3QgRTgyMCByZWdpb24uICovCisJaWYgKHhlbl9pbml0aWFsX2RvbWFpbigpICYmICh4ZW5fZXh0cmFfbWVtX3N0YXJ0IDwgKDFVTEw8PDMyKSkpCisJCXhlbl9leHRyYV9tZW1fc3RhcnQgPSAoMVVMTDw8MzIpOwogCiAJLyoKIAkgKiBJbiBkb21VLCB0aGUgSVNBIHJlZ2lvbiBpcyBub3JtYWwsIHVzYWJsZSBtZW1vcnksIGJ1dCB3ZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NtcC5jIGIvYXJjaC94ODYveGVuL3NtcC5jCmluZGV4IDQxMDM4YzAuLmI0NTMzYTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zbXAuYworKysgYi9hcmNoL3g4Ni94ZW4vc21wLmMKQEAgLTIwNSwxMSArMjA1LDE4IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgeGVuX3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQogewogCXVuc2lnbmVkIGNwdTsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCXhlbl9pbml0X2xvY2tfY3B1KDApOwogCiAJc21wX3N0b3JlX2NwdV9pbmZvKDApOwogCWNwdV9kYXRhKDApLng4Nl9tYXhfY29yZXMgPSAxOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJemFsbG9jX2NwdW1hc2tfdmFyKCZwZXJfY3B1KGNwdV9zaWJsaW5nX21hcCwgaSksIEdGUF9LRVJORUwpOworCQl6YWxsb2NfY3B1bWFza192YXIoJnBlcl9jcHUoY3B1X2NvcmVfbWFwLCBpKSwgR0ZQX0tFUk5FTCk7CisJCXphbGxvY19jcHVtYXNrX3ZhcigmcGVyX2NwdShjcHVfbGxjX3NoYXJlZF9tYXAsIGkpLCBHRlBfS0VSTkVMKTsKKwl9CiAJc2V0X2NwdV9zaWJsaW5nX21hcCgwKTsKIAogCWlmICh4ZW5fc21wX2ludHJfaW5pdCgwKSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi90cmFjZS5jIGIvYXJjaC94ODYveGVuL3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0YmViYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3hlbi90cmFjZS5jCkBAIC0wLDAgKzEsNjEgQEAKKyNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKworI2RlZmluZSBOKHgpCVtfX0hZUEVSVklTT1JfIyN4XSA9ICIoIiN4IikiCitzdGF0aWMgY29uc3QgY2hhciAqeGVuX2h5cGVyY2FsbF9uYW1lc1tdID0geworCU4oc2V0X3RyYXBfdGFibGUpLAorCU4obW11X3VwZGF0ZSksCisJTihzZXRfZ2R0KSwKKwlOKHN0YWNrX3N3aXRjaCksCisJTihzZXRfY2FsbGJhY2tzKSwKKwlOKGZwdV90YXNrc3dpdGNoKSwKKwlOKHNjaGVkX29wX2NvbXBhdCksCisJTihkb20wX29wKSwKKwlOKHNldF9kZWJ1Z3JlZyksCisJTihnZXRfZGVidWdyZWcpLAorCU4odXBkYXRlX2Rlc2NyaXB0b3IpLAorCU4obWVtb3J5X29wKSwKKwlOKG11bHRpY2FsbCksCisJTih1cGRhdGVfdmFfbWFwcGluZyksCisJTihzZXRfdGltZXJfb3ApLAorCU4oZXZlbnRfY2hhbm5lbF9vcF9jb21wYXQpLAorCU4oeGVuX3ZlcnNpb24pLAorCU4oY29uc29sZV9pbyksCisJTihwaHlzZGV2X29wX2NvbXBhdCksCisJTihncmFudF90YWJsZV9vcCksCisJTih2bV9hc3Npc3QpLAorCU4odXBkYXRlX3ZhX21hcHBpbmdfb3RoZXJkb21haW4pLAorCU4oaXJldCksCisJTih2Y3B1X29wKSwKKwlOKHNldF9zZWdtZW50X2Jhc2UpLAorCU4obW11ZXh0X29wKSwKKwlOKGFjbV9vcCksCisJTihubWlfb3ApLAorCU4oc2NoZWRfb3ApLAorCU4oY2FsbGJhY2tfb3ApLAorCU4oeGVub3Byb2Zfb3ApLAorCU4oZXZlbnRfY2hhbm5lbF9vcCksCisJTihwaHlzZGV2X29wKSwKKwlOKGh2bV9vcCksCisKKy8qIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBoeXBlcmNhbGwgZGVmaW5pdGlvbnMuICovCisJTihhcmNoXzApLAorCU4oYXJjaF8xKSwKKwlOKGFyY2hfMiksCisJTihhcmNoXzMpLAorCU4oYXJjaF80KSwKKwlOKGFyY2hfNSksCisJTihhcmNoXzYpLAorCU4oYXJjaF83KSwKK307CisjdW5kZWYgTgorCitzdGF0aWMgY29uc3QgY2hhciAqeGVuX2h5cGVyY2FsbF9uYW1lKHVuc2lnbmVkIG9wKQoreworCWlmIChvcCA8IEFSUkFZX1NJWkUoeGVuX2h5cGVyY2FsbF9uYW1lcykgJiYgeGVuX2h5cGVyY2FsbF9uYW1lc1tvcF0gIT0gTlVMTCkKKwkJcmV0dXJuIHhlbl9oeXBlcmNhbGxfbmFtZXNbb3BdOworCisJcmV0dXJuICIiOworfQorCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMveGVuLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vdmdhLmMgYi9hcmNoL3g4Ni94ZW4vdmdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkN2Y0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3hlbi92Z2EuYwpAQCAtMCwwICsxLDY3IEBACisjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vYm9vdHBhcmFtLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgorCisjaW5jbHVkZSAieGVuLW9wcy5oIgorCit2b2lkIF9faW5pdCB4ZW5faW5pdF92Z2EoY29uc3Qgc3RydWN0IGRvbTBfdmdhX2NvbnNvbGVfaW5mbyAqaW5mbywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHNjcmVlbl9pbmZvICpzY3JlZW5faW5mbyA9ICZib290X3BhcmFtcy5zY3JlZW5faW5mbzsKKworCS8qIFRoaXMgaXMgZHJhd24gZnJvbSBhIGR1bXAgZnJvbSB2Z2Fjb246c3RhcnR1cCBpbgorCSAqIHN0YW5kYXJkIExpbnV4LiAqLworCXNjcmVlbl9pbmZvLT5vcmlnX3ZpZGVvX21vZGUgPSAzOworCXNjcmVlbl9pbmZvLT5vcmlnX3ZpZGVvX2lzVkdBID0gMTsKKwlzY3JlZW5faW5mby0+b3JpZ192aWRlb19saW5lcyA9IDI1OworCXNjcmVlbl9pbmZvLT5vcmlnX3ZpZGVvX2NvbHMgPSA4MDsKKwlzY3JlZW5faW5mby0+b3JpZ192aWRlb19lZ2FfYnggPSAzOworCXNjcmVlbl9pbmZvLT5vcmlnX3ZpZGVvX3BvaW50cyA9IDE2OworCXNjcmVlbl9pbmZvLT5vcmlnX3kgPSBzY3JlZW5faW5mby0+b3JpZ192aWRlb19saW5lcyAtIDE7CisKKwlzd2l0Y2ggKGluZm8tPnZpZGVvX3R5cGUpIHsKKwljYXNlIFhFTl9WR0FUWVBFX1RFWFRfTU9ERV8zOgorCQlpZiAoc2l6ZSA8IG9mZnNldG9mKHN0cnVjdCBkb20wX3ZnYV9jb25zb2xlX2luZm8sIHUudGV4dF9tb2RlXzMpCisJCSAgICArIHNpemVvZihpbmZvLT51LnRleHRfbW9kZV8zKSkKKwkJCWJyZWFrOworCQlzY3JlZW5faW5mby0+b3JpZ192aWRlb19saW5lcyA9IGluZm8tPnUudGV4dF9tb2RlXzMucm93czsKKwkJc2NyZWVuX2luZm8tPm9yaWdfdmlkZW9fY29scyA9IGluZm8tPnUudGV4dF9tb2RlXzMuY29sdW1uczsKKwkJc2NyZWVuX2luZm8tPm9yaWdfeCA9IGluZm8tPnUudGV4dF9tb2RlXzMuY3Vyc29yX3g7CisJCXNjcmVlbl9pbmZvLT5vcmlnX3kgPSBpbmZvLT51LnRleHRfbW9kZV8zLmN1cnNvcl95OworCQlzY3JlZW5faW5mby0+b3JpZ192aWRlb19wb2ludHMgPQorCQkJaW5mby0+dS50ZXh0X21vZGVfMy5mb250X2hlaWdodDsKKwkJYnJlYWs7CisKKwljYXNlIFhFTl9WR0FUWVBFX1ZFU0FfTEZCOgorCQlpZiAoc2l6ZSA8IG9mZnNldG9mKHN0cnVjdCBkb20wX3ZnYV9jb25zb2xlX2luZm8sCisJCQkJICAgIHUudmVzYV9sZmIuZ2JsX2NhcHMpKQorCQkJYnJlYWs7CisJCXNjcmVlbl9pbmZvLT5vcmlnX3ZpZGVvX2lzVkdBID0gVklERU9fVFlQRV9WTEZCOworCQlzY3JlZW5faW5mby0+bGZiX3dpZHRoID0gaW5mby0+dS52ZXNhX2xmYi53aWR0aDsKKwkJc2NyZWVuX2luZm8tPmxmYl9oZWlnaHQgPSBpbmZvLT51LnZlc2FfbGZiLmhlaWdodDsKKwkJc2NyZWVuX2luZm8tPmxmYl9kZXB0aCA9IGluZm8tPnUudmVzYV9sZmIuYml0c19wZXJfcGl4ZWw7CisJCXNjcmVlbl9pbmZvLT5sZmJfYmFzZSA9IGluZm8tPnUudmVzYV9sZmIubGZiX2Jhc2U7CisJCXNjcmVlbl9pbmZvLT5sZmJfc2l6ZSA9IGluZm8tPnUudmVzYV9sZmIubGZiX3NpemU7CisJCXNjcmVlbl9pbmZvLT5sZmJfbGluZWxlbmd0aCA9IGluZm8tPnUudmVzYV9sZmIuYnl0ZXNfcGVyX2xpbmU7CisJCXNjcmVlbl9pbmZvLT5yZWRfc2l6ZSA9IGluZm8tPnUudmVzYV9sZmIucmVkX3NpemU7CisJCXNjcmVlbl9pbmZvLT5yZWRfcG9zID0gaW5mby0+dS52ZXNhX2xmYi5yZWRfcG9zOworCQlzY3JlZW5faW5mby0+Z3JlZW5fc2l6ZSA9IGluZm8tPnUudmVzYV9sZmIuZ3JlZW5fc2l6ZTsKKwkJc2NyZWVuX2luZm8tPmdyZWVuX3BvcyA9IGluZm8tPnUudmVzYV9sZmIuZ3JlZW5fcG9zOworCQlzY3JlZW5faW5mby0+Ymx1ZV9zaXplID0gaW5mby0+dS52ZXNhX2xmYi5ibHVlX3NpemU7CisJCXNjcmVlbl9pbmZvLT5ibHVlX3BvcyA9IGluZm8tPnUudmVzYV9sZmIuYmx1ZV9wb3M7CisJCXNjcmVlbl9pbmZvLT5yc3ZkX3NpemUgPSBpbmZvLT51LnZlc2FfbGZiLnJzdmRfc2l6ZTsKKwkJc2NyZWVuX2luZm8tPnJzdmRfcG9zID0gaW5mby0+dS52ZXNhX2xmYi5yc3ZkX3BvczsKKwkJaWYgKHNpemUgPj0gb2Zmc2V0b2Yoc3RydWN0IGRvbTBfdmdhX2NvbnNvbGVfaW5mbywKKwkJCQkgICAgIHUudmVzYV9sZmIuZ2JsX2NhcHMpCisJCSAgICArIHNpemVvZihpbmZvLT51LnZlc2FfbGZiLmdibF9jYXBzKSkKKwkJCXNjcmVlbl9pbmZvLT5jYXBhYmlsaXRpZXMgPSBpbmZvLT51LnZlc2FfbGZiLmdibF9jYXBzOworCQlpZiAoc2l6ZSA+PSBvZmZzZXRvZihzdHJ1Y3QgZG9tMF92Z2FfY29uc29sZV9pbmZvLAorCQkJCSAgICAgdS52ZXNhX2xmYi5tb2RlX2F0dHJzKQorCQkgICAgKyBzaXplb2YoaW5mby0+dS52ZXNhX2xmYi5tb2RlX2F0dHJzKSkKKwkJCXNjcmVlbl9pbmZvLT52ZXNhX2F0dHJpYnV0ZXMgPSBpbmZvLT51LnZlc2FfbGZiLm1vZGVfYXR0cnM7CisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi94ZW4tb3BzLmggYi9hcmNoL3g4Ni94ZW4veGVuLW9wcy5oCmluZGV4IDk3ZGZkYzguLmIwOTU3MzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi94ZW4tb3BzLmgKKysrIGIvYXJjaC94ODYveGVuL3hlbi1vcHMuaApAQCAtODgsNiArODgsMTcgQEAKIH0KICNlbmRpZgogCitzdHJ1Y3QgZG9tMF92Z2FfY29uc29sZV9pbmZvOworCisjaWZkZWYgQ09ORklHX1hFTl9ET00wCit2b2lkIF9faW5pdCB4ZW5faW5pdF92Z2EoY29uc3Qgc3RydWN0IGRvbTBfdmdhX2NvbnNvbGVfaW5mbyAqLCBzaXplX3Qgc2l6ZSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCB4ZW5faW5pdF92Z2EoY29uc3Qgc3RydWN0IGRvbTBfdmdhX2NvbnNvbGVfaW5mbyAqaW5mbywKKwkJCQkgICAgICAgc2l6ZV90IHNpemUpCit7Cit9CisjZW5kaWYKKwogLyogRGVjbGFyZSBhbiBhc20gZnVuY3Rpb24sIGFsb25nIHdpdGggc3ltYm9scyBuZWVkZWQgdG8gbWFrZSBpdAogICAgaW5saW5lYWJsZSAqLwogI2RlZmluZSBERUNMX0FTTShyZXQsIG5hbWUsIC4uLikJCVwKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL0tjb25maWcgYi9hcmNoL3h0ZW5zYS9LY29uZmlnCmluZGV4IDVkNDNjMWYuLmMzNDZjY2QgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL0tjb25maWcKKysrIGIvYXJjaC94dGVuc2EvS2NvbmZpZwpAQCAtODAsMTggKzgwLDcgQEAKIAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgaW4gdXNlciBzcGFjZS4KIAotY29uZmlnIFBSRUVNUFQKLQlib29sICJQcmVlbXB0aWJsZSBLZXJuZWwiCi0JaGVscAotICAgICAgICAgIFRoaXMgb3B0aW9uIHJlZHVjZXMgdGhlIGxhdGVuY3kgb2YgdGhlIGtlcm5lbCB3aGVuIHJlYWN0aW5nIHRvCi0gICAgICAgICAgcmVhbC10aW1lIG9yIGludGVyYWN0aXZlIGV2ZW50cyBieSBhbGxvd2luZyBhIGxvdyBwcmlvcml0eSBwcm9jZXNzIHRvCi0gICAgICAgICAgYmUgcHJlZW1wdGVkIGV2ZW4gaWYgaXQgaXMgaW4ga2VybmVsIG1vZGUgZXhlY3V0aW5nIGEgc3lzdGVtIGNhbGwuCi0gICAgICAgICAgVW5mb3J0dW5hdGVseSB0aGUga2VybmVsIGNvZGUgaGFzIHNvbWUgcmFjZSBjb25kaXRpb25zIGlmIGJvdGgKLSAgICAgICAgICBDT05GSUdfU01QIGFuZCBDT05GSUdfUFJFRU1QVCBhcmUgZW5hYmxlZCwgc28gdGhpcyBvcHRpb24gaXMKLSAgICAgICAgICBjdXJyZW50bHkgZGlzYWJsZWQgaWYgeW91IGFyZSBidWlsZGluZyBhbiBTTVAga2VybmVsLgotCi0gICAgICAgICAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBhIGRlc2t0b3AsIGVtYmVkZGVkCi0gICAgICAgICAgb3IgcmVhbC10aW1lIHN5c3RlbS4gIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgorc291cmNlICJrZXJuZWwvS2NvbmZpZy5wcmVlbXB0IgogCiBjb25maWcgTUFUSF9FTVVMQVRJT04KIAlib29sICJNYXRoIGVtdWxhdGlvbiIKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCA1YjBjMThjLi4zZmE1MjZmIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xNyw2ICsxNyw4IEBACiAjZGVmaW5lIF9YVEVOU0FfVUFDQ0VTU19ICiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKICNkZWZpbmUgVkVSSUZZX1JFQUQgICAgMAogI2RlZmluZSBWRVJJRllfV1JJVEUgICAxCkBAIC0yNiw3ICsyOCw2IEBACiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKIC8qCiAgKiBUaGVzZSBhc3NlbWJseSBtYWNyb3MgbWlycm9yIHRoZSBDIG1hY3JvcyB0aGF0IGZvbGxvdyBiZWxvdy4gIFRoZXkKQEAgLTE1Nyw3ICsxNTgsNiBAQAogI2Vsc2UgLyogX19BU1NFTUJMWV9fIG5vdCBkZWZpbmVkICovCiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCiAvKgogICogVGhlIGZzIHZhbHVlIGRldGVybWluZXMgd2hldGhlciBhcmd1bWVudCB2YWxpZGl0eSBjaGVja2luZyBzaG91bGQKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9tb2R1bGUuYwppbmRleCBjMWFjY2VhLi40NTFkZGE5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL21vZHVsZS5jCkBAIC0yNCwyNiArMjQsNiBAQAogCiAjdW5kZWYgREVCVUdfUkVMT0NBVEUKIAotdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpZiAoc2l6ZSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdm1hbGxvY19leGVjKHNpemUpOwotfQotCi12b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKLXsKLQl2ZnJlZShtb2R1bGVfcmVnaW9uKTsKLX0KLQotaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmMzJfRWhkciAqaGRyLAotICAgIAkJCSAgICAgIEVsZjMyX1NoZHIgKnNlY2hkcnMsCi0JCQkgICAgICBjaGFyICpzZWNzdHJpbmdzLAotCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbW9kKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50CiBkZWNvZGVfY2FsbG5fb3Bjb2RlICh1bnNpZ25lZCBjaGFyICpsb2NhdGlvbikKIHsKQEAgLTY2LDE4ICs0Niw2IEBACiAjZW5kaWYKIH0KIAotaW50IGFwcGx5X3JlbG9jYXRlKEVsZjMyX1NoZHIgKnNlY2hkcnMsCi0gICAgCQkgICBjb25zdCBjaGFyICpzdHJ0YWIsCi0JCSAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKLQkJICAgdW5zaWduZWQgaW50IHJlbHNlYywKLQkJICAgc3RydWN0IG1vZHVsZSAqbW9kKQotewotICAgICAgICBwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogUkVMIFJFTE9DQVRJT04gdW5zdXBwb3J0ZWRcbiIsCi0gICAgICAgICAgICAgICBtb2QtPm5hbWUpOwotICAgICAgICByZXR1cm4gLUVOT0VYRUM7Ci0KLX0KLQogaW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGYzMl9TaGRyICpzZWNoZHJzLAogCQkgICAgICAgY29uc3QgY2hhciAqc3RydGFiLAogCQkgICAgICAgdW5zaWduZWQgaW50IHN5bWluZGV4LApAQCAtMjIyLDE0ICsxOTAsMyBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLQotaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAotICAgIAkJICAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAotCQkgICAgc3RydWN0IG1vZHVsZSAqbW9kKQotewotCXJldHVybiAwOwotfQotCi12b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQotewotfQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jCmluZGV4IGM3MmM5NDcuLmEwZDA0MmEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcHRyYWNlLmMKQEAgLTE0Nyw2ICsxNDcsOSBAQAogCWVsZl94dHJlZ3NfdCAqeHRyZWdzID0gdXJlZ3M7CiAJaW50IHJldCA9IDA7CiAKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXJlZ3MsIHNpemVvZihlbGZfeHRyZWdzX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKICNpZiBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUlMKIAkvKiBGbHVzaCBhbGwgY29wcm9jZXNzb3JzIGJlZm9yZSB3ZSBvdmVyd3JpdGUgdGhlbS4gKi8KIAljb3Byb2Nlc3Nvcl9mbHVzaF9hbGwodGkpOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvdmFyaWFudHMvczYwMDAvaW5jbHVkZS92YXJpYW50L2RtYWMuaCBiL2FyY2gveHRlbnNhL3ZhcmlhbnRzL3M2MDAwL2luY2x1ZGUvdmFyaWFudC9kbWFjLmgKaW5kZXggODlhYjk0OC4uZTgxNzM1YiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvdmFyaWFudHMvczYwMDAvaW5jbHVkZS92YXJpYW50L2RtYWMuaAorKysgYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9zNjAwMC9pbmNsdWRlL3ZhcmlhbnQvZG1hYy5oCkBAIC0zNTcsNyArMzU3LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzNmRtYWNfZHBfc2V0dXBfZ3JvdXAodTMyIGRtYWMsIGludCBwb3J0LAogCQkJaW50IG5yY2gsIGludCBmcnJlcCkKIHsKLQljb25zdCBzdGF0aWMgdTggbWFza1s0XSA9IHswLCAzLCAxLCAyfTsKKwlzdGF0aWMgY29uc3QgdTggbWFza1s0XSA9IHswLCAzLCAxLCAyfTsKIAlCVUdfT04oZG1hYyAhPSBTNl9SRUdfRFBETUEpOwogCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID4gMykgfHwgKG5yY2ggPCAxKSB8fCAobnJjaCA+IDQpKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9ibG9jay9ibGstY29yZS5jIGIvYmxvY2svYmxrLWNvcmUuYwppbmRleCBkMmY4ZjQwLi5mOGNiMDk5IDEwMDY0NAotLS0gYS9ibG9jay9ibGstY29yZS5jCisrKyBiL2Jsb2NrL2Jsay1jb3JlLmMKQEAgLTgzOSw2ICs4MzksOSBAQAogewogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAorCWlmICh1bmxpa2VseSh0ZXN0X2JpdChRVUVVRV9GTEFHX0RFQUQsICZxLT5xdWV1ZV9mbGFncykpKQorCQlyZXR1cm4gTlVMTDsKKwogCUJVR19PTihydyAhPSBSRUFEICYmIHJ3ICE9IFdSSVRFKTsKIAogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CkBAIC0xMjc5LDEwICsxMjgyLDggQEAKIAlpbml0X3JlcXVlc3RfZnJvbV9iaW8ocmVxLCBiaW8pOwogCiAJaWYgKHRlc3RfYml0KFFVRVVFX0ZMQUdfU0FNRV9DT01QLCAmcS0+cXVldWVfZmxhZ3MpIHx8Ci0JICAgIGJpb19mbGFnZ2VkKGJpbywgQklPX0NQVV9BRkZJTkUpKSB7Ci0JCXJlcS0+Y3B1ID0gYmxrX2NwdV90b19ncm91cChnZXRfY3B1KCkpOwotCQlwdXRfY3B1KCk7Ci0JfQorCSAgICBiaW9fZmxhZ2dlZChiaW8sIEJJT19DUFVfQUZGSU5FKSkKKwkJcmVxLT5jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlwbHVnID0gY3VycmVudC0+cGx1ZzsKIAlpZiAocGx1ZykgewpAQCAtMTMwMiw3ICsxMzAzLDEwIEBACiAJCQkJcGx1Zy0+c2hvdWxkX3NvcnQgPSAxOwogCQl9CiAJCWxpc3RfYWRkX3RhaWwoJnJlcS0+cXVldWVsaXN0LCAmcGx1Zy0+bGlzdCk7CisJCXBsdWctPmNvdW50Kys7CiAJCWRyaXZlX3N0YXRfYWNjdChyZXEsIDEpOworCQlpZiAocGx1Zy0+Y291bnQgPj0gQkxLX01BWF9SRVFVRVNUX0NPVU5UKQorCQkJYmxrX2ZsdXNoX3BsdWdfbGlzdChwbHVnLCBmYWxzZSk7CiAJfSBlbHNlIHsKIAkJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAkJYWRkX2FjY3RfcmVxdWVzdChxLCByZXEsIHdoZXJlKTsKQEAgLTI2MjYsNiArMjYzMCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnBsdWctPmxpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZwbHVnLT5jYl9saXN0KTsKIAlwbHVnLT5zaG91bGRfc29ydCA9IDA7CisJcGx1Zy0+Y291bnQgPSAwOwogCiAJLyoKIAkgKiBJZiB0aGlzIGlzIGEgbmVzdGVkIHBsdWcsIGRvbid0IGFjdHVhbGx5IGFzc2lnbiBpdC4gSXQgd2lsbCBiZQpAQCAtMjcwOSw2ICsyNzE0LDcgQEAKIAkJcmV0dXJuOwogCiAJbGlzdF9zcGxpY2VfaW5pdCgmcGx1Zy0+bGlzdCwgJmxpc3QpOworCXBsdWctPmNvdW50ID0gMDsKIAogCWlmIChwbHVnLT5zaG91bGRfc29ydCkgewogCQlsaXN0X3NvcnQoTlVMTCwgJmxpc3QsIHBsdWdfcnFfY21wKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1leGVjLmMgYi9ibG9jay9ibGstZXhlYy5jCmluZGV4IDhhMGU3ZWMuLmExZWJjZWIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1leGVjLmMKKysrIGIvYmxvY2svYmxrLWV4ZWMuYwpAQCAtNTAsNiArNTAsMTMgQEAKIHsKIAlpbnQgd2hlcmUgPSBhdF9oZWFkID8gRUxFVkFUT1JfSU5TRVJUX0ZST05UIDogRUxFVkFUT1JfSU5TRVJUX0JBQ0s7CiAKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoUVVFVUVfRkxBR19ERUFELCAmcS0+cXVldWVfZmxhZ3MpKSkgeworCQlycS0+ZXJyb3JzID0gLUVOWElPOworCQlpZiAocnEtPmVuZF9pbykKKwkJCXJxLT5lbmRfaW8ocnEsIHJxLT5lcnJvcnMpOworCQlyZXR1cm47CisJfQorCiAJcnEtPnJxX2Rpc2sgPSBiZF9kaXNrOwogCXJxLT5lbmRfaW8gPSBkb25lOwogCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pb2MuYyBiL2Jsb2NrL2Jsay1pb2MuYwppbmRleCAzNDJlYWU5Li42ZjliYmQ5IDEwMDY0NAotLS0gYS9ibG9jay9ibGstaW9jLmMKKysrIGIvYmxvY2svYmxrLWlvYy5jCkBAIC04MiwyNiArODIsMjYgQEAKIAogc3RydWN0IGlvX2NvbnRleHQgKmFsbG9jX2lvX2NvbnRleHQoZ2ZwX3QgZ2ZwX2ZsYWdzLCBpbnQgbm9kZSkKIHsKLQlzdHJ1Y3QgaW9fY29udGV4dCAqcmV0OworCXN0cnVjdCBpb19jb250ZXh0ICppb2M7CiAKLQlyZXQgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUoaW9jb250ZXh0X2NhY2hlcCwgZ2ZwX2ZsYWdzLCBub2RlKTsKLQlpZiAocmV0KSB7Ci0JCWF0b21pY19sb25nX3NldCgmcmV0LT5yZWZjb3VudCwgMSk7Ci0JCWF0b21pY19zZXQoJnJldC0+bnJfdGFza3MsIDEpOwotCQlzcGluX2xvY2tfaW5pdCgmcmV0LT5sb2NrKTsKLQkJcmV0LT5pb3ByaW9fY2hhbmdlZCA9IDA7Ci0JCXJldC0+aW9wcmlvID0gMDsKLQkJcmV0LT5sYXN0X3dhaXRlZCA9IDA7IC8qIGRvZXNuJ3QgbWF0dGVyLi4uICovCi0JCXJldC0+bnJfYmF0Y2hfcmVxdWVzdHMgPSAwOyAvKiBiZWNhdXNlIHRoaXMgaXMgMCAqLwotCQlJTklUX1JBRElYX1RSRUUoJnJldC0+cmFkaXhfcm9vdCwgR0ZQX0FUT01JQyB8IF9fR0ZQX0hJR0gpOwotCQlJTklUX0hMSVNUX0hFQUQoJnJldC0+Y2ljX2xpc3QpOwotCQlyZXQtPmlvY19kYXRhID0gTlVMTDsKKwlpb2MgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUoaW9jb250ZXh0X2NhY2hlcCwgZ2ZwX2ZsYWdzLCBub2RlKTsKKwlpZiAoaW9jKSB7CisJCWF0b21pY19sb25nX3NldCgmaW9jLT5yZWZjb3VudCwgMSk7CisJCWF0b21pY19zZXQoJmlvYy0+bnJfdGFza3MsIDEpOworCQlzcGluX2xvY2tfaW5pdCgmaW9jLT5sb2NrKTsKKwkJaW9jLT5pb3ByaW9fY2hhbmdlZCA9IDA7CisJCWlvYy0+aW9wcmlvID0gMDsKKwkJaW9jLT5sYXN0X3dhaXRlZCA9IDA7IC8qIGRvZXNuJ3QgbWF0dGVyLi4uICovCisJCWlvYy0+bnJfYmF0Y2hfcmVxdWVzdHMgPSAwOyAvKiBiZWNhdXNlIHRoaXMgaXMgMCAqLworCQlJTklUX1JBRElYX1RSRUUoJmlvYy0+cmFkaXhfcm9vdCwgR0ZQX0FUT01JQyB8IF9fR0ZQX0hJR0gpOworCQlJTklUX0hMSVNUX0hFQUQoJmlvYy0+Y2ljX2xpc3QpOworCQlpb2MtPmlvY19kYXRhID0gTlVMTDsKICNpZiBkZWZpbmVkKENPTkZJR19CTEtfQ0dST1VQKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfQ0dST1VQX01PRFVMRSkKLQkJcmV0LT5jZ3JvdXBfY2hhbmdlZCA9IDA7CisJCWlvYy0+Y2dyb3VwX2NoYW5nZWQgPSAwOwogI2VuZGlmCiAJfQogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gaW9jOwogfQogCiAvKgpAQCAtMTM5LDE5ICsxMzksMTkgQEAKICAqLwogc3RydWN0IGlvX2NvbnRleHQgKmdldF9pb19jb250ZXh0KGdmcF90IGdmcF9mbGFncywgaW50IG5vZGUpCiB7Ci0Jc3RydWN0IGlvX2NvbnRleHQgKnJldCA9IE5VTEw7CisJc3RydWN0IGlvX2NvbnRleHQgKmlvYyA9IE5VTEw7CiAKIAkvKgogCSAqIENoZWNrIGZvciB1bmxpa2VseSByYWNlIHdpdGggZXhpdGluZyB0YXNrLiBpb2MgcmVmIGNvdW50IGlzCiAJICogemVybyB3aGVuIGlvYyBpcyBiZWluZyBkZXRhY2hlZC4KIAkgKi8KIAlkbyB7Ci0JCXJldCA9IGN1cnJlbnRfaW9fY29udGV4dChnZnBfZmxhZ3MsIG5vZGUpOwotCQlpZiAodW5saWtlbHkoIXJldCkpCisJCWlvYyA9IGN1cnJlbnRfaW9fY29udGV4dChnZnBfZmxhZ3MsIG5vZGUpOworCQlpZiAodW5saWtlbHkoIWlvYykpCiAJCQlicmVhazsKLQl9IHdoaWxlICghYXRvbWljX2xvbmdfaW5jX25vdF96ZXJvKCZyZXQtPnJlZmNvdW50KSk7CisJfSB3aGlsZSAoIWF0b21pY19sb25nX2luY19ub3RfemVybygmaW9jLT5yZWZjb3VudCkpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gaW9jOwogfQogRVhQT1JUX1NZTUJPTChnZXRfaW9fY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1saWIuYyBiL2Jsb2NrL2Jsay1saWIuYwppbmRleCA3OGU2MjdlLi4yYjQ2MWI0IDEwMDY0NAotLS0gYS9ibG9jay9ibGstbGliLmMKKysrIGIvYmxvY2svYmxrLWxpYi5jCkBAIC01OSw3ICs1OSwxMCBAQAogCSAqIGdyYW51bGFyaXR5CiAJICovCiAJbWF4X2Rpc2NhcmRfc2VjdG9ycyA9IG1pbihxLT5saW1pdHMubWF4X2Rpc2NhcmRfc2VjdG9ycywgVUlOVF9NQVggPj4gOSk7Ci0JaWYgKHEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5KSB7CisJaWYgKHVubGlrZWx5KCFtYXhfZGlzY2FyZF9zZWN0b3JzKSkgeworCQkvKiBBdm9pZCBpbmZpbml0ZSBsb29wIGJlbG93LiBCZWluZyBjYXV0aW91cyBuZXZlciBodXJ0cy4gKi8KKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0gZWxzZSBpZiAocS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkpIHsKIAkJdW5zaWduZWQgaW50IGRpc2Nfc2VjdHMgPSBxLT5saW1pdHMuZGlzY2FyZF9ncmFudWxhcml0eSA+PiA5OwogCiAJCW1heF9kaXNjYXJkX3NlY3RvcnMgJj0gfihkaXNjX3NlY3RzIC0gMSk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstc29mdGlycS5jIGIvYmxvY2svYmxrLXNvZnRpcnEuYwppbmRleCBlZTljMjE2Li40NzVmYWI4IDEwMDY0NAotLS0gYS9ibG9jay9ibGstc29mdGlycS5jCisrKyBiL2Jsb2NrL2Jsay1zb2Z0aXJxLmMKQEAgLTEwMywyMiArMTAzLDI1IEBACiAKIHZvaWQgX19ibGtfY29tcGxldGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogeworCWludCBjY3B1LCBjcHUsIGdyb3VwX2NwdSA9IE5SX0NQVVM7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSByZXEtPnE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgY2NwdSwgY3B1LCBncm91cF9jcHU7CiAKIAlCVUdfT04oIXEtPnNvZnRpcnFfZG9uZV9mbik7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWdyb3VwX2NwdSA9IGJsa19jcHVfdG9fZ3JvdXAoY3B1KTsKIAogCS8qCiAJICogU2VsZWN0IGNvbXBsZXRpb24gQ1BVCiAJICovCi0JaWYgKHRlc3RfYml0KFFVRVVFX0ZMQUdfU0FNRV9DT01QLCAmcS0+cXVldWVfZmxhZ3MpICYmIHJlcS0+Y3B1ICE9IC0xKQorCWlmICh0ZXN0X2JpdChRVUVVRV9GTEFHX1NBTUVfQ09NUCwgJnEtPnF1ZXVlX2ZsYWdzKSAmJiByZXEtPmNwdSAhPSAtMSkgewogCQljY3B1ID0gcmVxLT5jcHU7Ci0JZWxzZQorCQlpZiAoIXRlc3RfYml0KFFVRVVFX0ZMQUdfU0FNRV9GT1JDRSwgJnEtPnF1ZXVlX2ZsYWdzKSkgeworCQkJY2NwdSA9IGJsa19jcHVfdG9fZ3JvdXAoY2NwdSk7CisJCQlncm91cF9jcHUgPSBibGtfY3B1X3RvX2dyb3VwKGNwdSk7CisJCX0KKwl9IGVsc2UKIAkJY2NwdSA9IGNwdTsKIAogCWlmIChjY3B1ID09IGNwdSB8fCBjY3B1ID09IGdyb3VwX2NwdSkgewpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXN5c2ZzLmMgYi9ibG9jay9ibGstc3lzZnMuYwppbmRleCBkOTM1YmQ4Li4wZWUxN2I1IDEwMDY0NAotLS0gYS9ibG9jay9ibGstc3lzZnMuYworKysgYi9ibG9jay9ibGstc3lzZnMuYwpAQCAtMjQ0LDggKzI0NCw5IEBACiBzdGF0aWMgc3NpemVfdCBxdWV1ZV9ycV9hZmZpbml0eV9zaG93KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpwYWdlKQogewogCWJvb2wgc2V0ID0gdGVzdF9iaXQoUVVFVUVfRkxBR19TQU1FX0NPTVAsICZxLT5xdWV1ZV9mbGFncyk7CisJYm9vbCBmb3JjZSA9IHRlc3RfYml0KFFVRVVFX0ZMQUdfU0FNRV9GT1JDRSwgJnEtPnF1ZXVlX2ZsYWdzKTsKIAotCXJldHVybiBxdWV1ZV92YXJfc2hvdyhzZXQsIHBhZ2UpOworCXJldHVybiBxdWV1ZV92YXJfc2hvdyhzZXQgPDwgZm9yY2UsIHBhZ2UpOwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtMjU3LDEwICsyNTgsMTQgQEAKIAogCXJldCA9IHF1ZXVlX3Zhcl9zdG9yZSgmdmFsLCBwYWdlLCBjb3VudCk7CiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLQlpZiAodmFsKQorCWlmICh2YWwpIHsKIAkJcXVldWVfZmxhZ19zZXQoUVVFVUVfRkxBR19TQU1FX0NPTVAsIHEpOwotCWVsc2UKLQkJcXVldWVfZmxhZ19jbGVhcihRVUVVRV9GTEFHX1NBTUVfQ09NUCwgIHEpOworCQlpZiAodmFsID09IDIpCisJCQlxdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX1NBTUVfRk9SQ0UsIHEpOworCX0gZWxzZSB7CisJCXF1ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19TQU1FX0NPTVAsIHEpOworCQlxdWV1ZV9mbGFnX2NsZWFyKFFVRVVFX0ZMQUdfU0FNRV9GT1JDRSwgcSk7CisJfQogCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKICNlbmRpZgogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstdGhyb3R0bGUuYyBiL2Jsb2NrL2Jsay10aHJvdHRsZS5jCmluZGV4IGE2MmJlOGQuLmY2YTc5NDEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay10aHJvdHRsZS5jCisrKyBiL2Jsb2NrL2Jsay10aHJvdHRsZS5jCkBAIC0xNDIsOSArMTQyLDkgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdG90YWxfbnJfcXVldWVkKHN0cnVjdCB0aHJvdGxfZGF0YSAqdGQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0b3RhbF9ucl9xdWV1ZWQoc3RydWN0IHRocm90bF9kYXRhICp0ZCkKIHsKLQlyZXR1cm4gKHRkLT5ucl9xdWV1ZWRbMF0gKyB0ZC0+bnJfcXVldWVkWzFdKTsKKwlyZXR1cm4gdGQtPm5yX3F1ZXVlZFswXSArIHRkLT5ucl9xdWV1ZWRbMV07CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRocm90bF9ncnAgKnRocm90bF9yZWZfZ2V0X3RnKHN0cnVjdCB0aHJvdGxfZ3JwICp0ZykKQEAgLTkyNyw3ICs5MjcsNyBAQAogCiAJYmlvX2xpc3RfaW5pdCgmYmlvX2xpc3Rfb25fc3RhY2spOwogCi0JdGhyb3RsX2xvZyh0ZCwgImRpc3BhdGNoIG5yX3F1ZXVlZD0lbHUgcmVhZD0ldSB3cml0ZT0ldSIsCisJdGhyb3RsX2xvZyh0ZCwgImRpc3BhdGNoIG5yX3F1ZXVlZD0ldSByZWFkPSV1IHdyaXRlPSV1IiwKIAkJCXRvdGFsX25yX3F1ZXVlZCh0ZCksIHRkLT5ucl9xdWV1ZWRbUkVBRF0sCiAJCQl0ZC0+bnJfcXVldWVkW1dSSVRFXSk7CiAKQEAgLTk3MCw3ICs5NzAsNyBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gJnRkLT50aHJvdGxfd29yazsKIAogCS8qIHNjaGVkdWxlIHdvcmsgaWYgbGltaXRzIGNoYW5nZWQgZXZlbiBpZiBubyBiaW8gaXMgcXVldWVkICovCi0JaWYgKHRvdGFsX25yX3F1ZXVlZCh0ZCkgPiAwIHx8IHRkLT5saW1pdHNfY2hhbmdlZCkgeworCWlmICh0b3RhbF9ucl9xdWV1ZWQodGQpIHx8IHRkLT5saW1pdHNfY2hhbmdlZCkgewogCQkvKgogCQkgKiBXZSBtaWdodCBoYXZlIGEgd29yayBzY2hlZHVsZWQgdG8gYmUgZXhlY3V0ZWQgaW4gZnV0dXJlLgogCQkgKiBDYW5jZWwgdGhhdCBhbmQgc2NoZWR1bGUgYSBuZXcgb25lLgpAQCAtMTIwNCw3ICsxMjA0LDcgQEAKIAl9CiAKIHF1ZXVlX2JpbzoKLQl0aHJvdGxfbG9nX3RnKHRkLCB0ZywgIlslY10gYmlvLiBiZGlzcD0ldSBzej0ldSBicHM9JWxsdSIKKwl0aHJvdGxfbG9nX3RnKHRkLCB0ZywgIlslY10gYmlvLiBiZGlzcD0lbGx1IHN6PSV1IGJwcz0lbGx1IgogCQkJIiBpb2Rpc3A9JXUgaW9wcz0ldSBxdWV1ZWQ9JWQvJWQiLAogCQkJcncgPT0gUkVBRCA/ICdSJyA6ICdXJywKIAkJCXRnLT5ieXRlc19kaXNwW3J3XSwgYmlvLT5iaV9zaXplLCB0Zy0+YnBzW3J3XSwKZGlmZiAtLWdpdCBhL2Jsb2NrL2JzZy5jIGIvYmxvY2svYnNnLmMKaW5kZXggMGM4YjY0YS4uNzAyZjEzMSAxMDA2NDQKLS0tIGEvYmxvY2svYnNnLmMKKysrIGIvYmxvY2svYnNnLmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaWYgKGNvcHlfZnJvbV91c2VyKHJxLT5jbWQsICh2b2lkICopKHVuc2lnbmVkIGxvbmcpaGRyLT5yZXF1ZXN0LAorCWlmIChjb3B5X2Zyb21fdXNlcihycS0+Y21kLCAodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyloZHItPnJlcXVlc3QsCiAJCQkgICBoZHItPnJlcXVlc3RfbGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTI0OSw3ICsyNDksNyBAQAogCXN0cnVjdCByZXF1ZXN0ICpycSwgKm5leHRfcnEgPSBOVUxMOwogCWludCByZXQsIHJ3OwogCXVuc2lnbmVkIGludCBkeGZlcl9sZW47Ci0Jdm9pZCAqZHhmZXJwID0gTlVMTDsKKwl2b2lkIF9fdXNlciAqZHhmZXJwID0gTlVMTDsKIAlzdHJ1Y3QgYnNnX2NsYXNzX2RldmljZSAqYmNkID0gJnEtPmJzZ19kZXY7CiAKIAkvKiBpZiB0aGUgTExEIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiB0aGUgYnNnX3VucmVnaXN0ZXJfcXVldWUgd2lsbApAQCAtMjkxLDcgKzI5MSw3IEBACiAJCXJxLT5uZXh0X3JxID0gbmV4dF9ycTsKIAkJbmV4dF9ycS0+Y21kX3R5cGUgPSBycS0+Y21kX3R5cGU7CiAKLQkJZHhmZXJwID0gKHZvaWQqKSh1bnNpZ25lZCBsb25nKWhkci0+ZGluX3hmZXJwOworCQlkeGZlcnAgPSAodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyloZHItPmRpbl94ZmVycDsKIAkJcmV0ID0gIGJsa19ycV9tYXBfdXNlcihxLCBuZXh0X3JxLCBOVUxMLCBkeGZlcnAsCiAJCQkJICAgICAgIGhkci0+ZGluX3hmZXJfbGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHJldCkKQEAgLTMwMCwxMCArMzAwLDEwIEBACiAKIAlpZiAoaGRyLT5kb3V0X3hmZXJfbGVuKSB7CiAJCWR4ZmVyX2xlbiA9IGhkci0+ZG91dF94ZmVyX2xlbjsKLQkJZHhmZXJwID0gKHZvaWQqKSh1bnNpZ25lZCBsb25nKWhkci0+ZG91dF94ZmVycDsKKwkJZHhmZXJwID0gKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpaGRyLT5kb3V0X3hmZXJwOwogCX0gZWxzZSBpZiAoaGRyLT5kaW5feGZlcl9sZW4pIHsKIAkJZHhmZXJfbGVuID0gaGRyLT5kaW5feGZlcl9sZW47Ci0JCWR4ZmVycCA9ICh2b2lkKikodW5zaWduZWQgbG9uZyloZHItPmRpbl94ZmVycDsKKwkJZHhmZXJwID0gKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpaGRyLT5kaW5feGZlcnA7CiAJfSBlbHNlCiAJCWR4ZmVyX2xlbiA9IDA7CiAKQEAgLTQ0NSw3ICs0NDUsNyBAQAogCQlpbnQgbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBoZHItPm1heF9yZXNwb25zZV9sZW4sCiAJCQkJCXJxLT5zZW5zZV9sZW4pOwogCi0JCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCopKHVuc2lnbmVkIGxvbmcpaGRyLT5yZXNwb25zZSwKKwkJcmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWhkci0+cmVzcG9uc2UsCiAJCQkJICAgcnEtPnNlbnNlLCBsZW4pOwogCQlpZiAoIXJldCkKIAkJCWhkci0+cmVzcG9uc2VfbGVuID0gbGVuOwpAQCAtNjA2LDcgKzYwNiw3IEBACiAJcmV0ID0gX19ic2dfcmVhZChidWYsIGNvdW50LCBiZCwgTlVMTCwgJmJ5dGVzX3JlYWQpOwogCSpwcG9zID0gYnl0ZXNfcmVhZDsKIAotCWlmICghYnl0ZXNfcmVhZCB8fCAoYnl0ZXNfcmVhZCAmJiBlcnJfYmxvY2tfZXJyKHJldCkpKQorCWlmICghYnl0ZXNfcmVhZCB8fCBlcnJfYmxvY2tfZXJyKHJldCkpCiAJCWJ5dGVzX3JlYWQgPSByZXQ7CiAKIAlyZXR1cm4gYnl0ZXNfcmVhZDsKQEAgLTY4Niw3ICs2ODYsNyBAQAogCS8qCiAJICogcmV0dXJuIGJ5dGVzIHdyaXR0ZW4gb24gbm9uLWZhdGFsIGVycm9ycwogCSAqLwotCWlmICghYnl0ZXNfd3JpdHRlbiB8fCAoYnl0ZXNfd3JpdHRlbiAmJiBlcnJfYmxvY2tfZXJyKHJldCkpKQorCWlmICghYnl0ZXNfd3JpdHRlbiB8fCBlcnJfYmxvY2tfZXJyKHJldCkpCiAJCWJ5dGVzX3dyaXR0ZW4gPSByZXQ7CiAKIAlkcHJpbnRrKCIlczogcmV0dXJuaW5nICVaZFxuIiwgYmQtPm5hbWUsIGJ5dGVzX3dyaXR0ZW4pOwpAQCAtODc4LDcgKzg3OCw3IEBACiAJc3Bpbl9sb2NrX2lycSgmYmQtPmxvY2spOwogCWlmICghbGlzdF9lbXB0eSgmYmQtPmRvbmVfbGlzdCkpCiAJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKLQlpZiAoYmQtPnF1ZXVlZF9jbWRzID49IGJkLT5tYXhfcXVldWUpCisJaWYgKGJkLT5xdWV1ZWRfY21kcyA8IGJkLT5tYXhfcXVldWUpCiAJCW1hc2sgfD0gUE9MTE9VVDsKIAlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKIApkaWZmIC0tZ2l0IGEvYmxvY2svY2ZxLWlvc2NoZWQuYyBiL2Jsb2NrL2NmcS1pb3NjaGVkLmMKaW5kZXggM2M3YjUzNy4uMWY5NmFkNiAxMDA2NDQKLS0tIGEvYmxvY2svY2ZxLWlvc2NoZWQuYworKysgYi9ibG9jay9jZnEtaW9zY2hlZC5jCkBAIC04Nyw5ICs4NywxMCBAQAogCXVuc2lnbmVkIGNvdW50OwogCXVuc2lnbmVkIHRvdGFsX3dlaWdodDsKIAl1NjQgbWluX3ZkaXNrdGltZTsKKwlzdHJ1Y3QgY2ZxX3R0aW1lIHR0aW1lOwogfTsKLSNkZWZpbmUgQ0ZRX1JCX1JPT1QJKHN0cnVjdCBjZnFfcmJfcm9vdCkgeyAucmIgPSBSQl9ST09ULCAubGVmdCA9IE5VTEwsIFwKLQkJCS5jb3VudCA9IDAsIC5taW5fdmRpc2t0aW1lID0gMCwgfQorI2RlZmluZSBDRlFfUkJfUk9PVAkoc3RydWN0IGNmcV9yYl9yb290KSB7IC5yYiA9IFJCX1JPT1QsIFwKKwkJCS50dGltZSA9IHsubGFzdF9lbmRfcmVxdWVzdCA9IGppZmZpZXMsfSx9CiAKIC8qCiAgKiBQZXIgcHJvY2Vzcy1ncm91cGluZyBzdHJ1Y3R1cmUKQEAgLTEyOSwxNCArMTMwLDEyIEBACiAJdW5zaWduZWQgbG9uZyBzbGljZV9lbmQ7CiAJbG9uZyBzbGljZV9yZXNpZDsKIAotCS8qIHBlbmRpbmcgbWV0YWRhdGEgcmVxdWVzdHMgKi8KLQlpbnQgbWV0YV9wZW5kaW5nOwogCS8qIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGFyZSBvbiB0aGUgZGlzcGF0Y2ggbGlzdCBvciBpbnNpZGUgZHJpdmVyICovCiAJaW50IGRpc3BhdGNoZWQ7CiAKIAkvKiBpbyBwcmlvIG9mIHRoaXMgZ3JvdXAgKi8KIAl1bnNpZ25lZCBzaG9ydCBpb3ByaW8sIG9yZ19pb3ByaW87Ci0JdW5zaWduZWQgc2hvcnQgaW9wcmlvX2NsYXNzLCBvcmdfaW9wcmlvX2NsYXNzOworCXVuc2lnbmVkIHNob3J0IGlvcHJpb19jbGFzczsKIAogCXBpZF90IHBpZDsKIApAQCAtMjEyLDYgKzIxMSw3IEBACiAjZW5kaWYKIAkvKiBudW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBhcmUgb24gdGhlIGRpc3BhdGNoIGxpc3Qgb3IgaW5zaWRlIGRyaXZlciAqLwogCWludCBkaXNwYXRjaGVkOworCXN0cnVjdCBjZnFfdHRpbWUgdHRpbWU7CiB9OwogCiAvKgpAQCAtMzkzLDYgKzM5MywxOCBAQAogCQkJaisrLCBzdCA9IGkgPCBJRExFX1dPUktMT0FEID8gXAogCQkJJmNmcWctPnNlcnZpY2VfdHJlZXNbaV1bal06IE5VTEwpIFwKIAorc3RhdGljIGlubGluZSBib29sIGNmcV9pb190aGlua3RpbWVfYmlnKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwKKwlzdHJ1Y3QgY2ZxX3R0aW1lICp0dGltZSwgYm9vbCBncm91cF9pZGxlKQoreworCXVuc2lnbmVkIGxvbmcgc2xpY2U7CisJaWYgKCFzYW1wbGVfdmFsaWQodHRpbWUtPnR0aW1lX3NhbXBsZXMpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGdyb3VwX2lkbGUpCisJCXNsaWNlID0gY2ZxZC0+Y2ZxX2dyb3VwX2lkbGU7CisJZWxzZQorCQlzbGljZSA9IGNmcWQtPmNmcV9zbGljZV9pZGxlOworCXJldHVybiB0dGltZS0+dHRpbWVfbWVhbiA+IHNsaWNlOworfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaW9wc19tb2RlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCkKIHsKQEAgLTY3MCw5ICs2ODIsNiBAQAogCWlmIChycV9pc19zeW5jKHJxMSkgIT0gcnFfaXNfc3luYyhycTIpKQogCQlyZXR1cm4gcnFfaXNfc3luYyhycTEpID8gcnExIDogcnEyOwogCi0JaWYgKChycTEtPmNtZF9mbGFncyBeIHJxMi0+Y21kX2ZsYWdzKSAmIFJFUV9NRVRBKQotCQlyZXR1cm4gcnExLT5jbWRfZmxhZ3MgJiBSRVFfTUVUQSA/IHJxMSA6IHJxMjsKLQogCXMxID0gYmxrX3JxX3BvcyhycTEpOwogCXMyID0gYmxrX3JxX3BvcyhycTIpOwogCkBAIC05ODgsOSArOTk3LDEwIEBACiAKIAljZnFfbG9nX2NmcWcoY2ZxZCwgY2ZxZywgInNlcnZlZDogdnQ9JWxsdSBtaW5fdnQ9JWxsdSIsIGNmcWctPnZkaXNrdGltZSwKIAkJCQkJc3QtPm1pbl92ZGlza3RpbWUpOwotCWNmcV9sb2dfY2ZxcShjZnFxLT5jZnFkLCBjZnFxLCAic2xfdXNlZD0ldSBkaXNwPSV1IGNoYXJnZT0ldSBpb3BzPSV1IgotCQkJIiBzZWN0PSV1IiwgdXNlZF9zbCwgY2ZxcS0+c2xpY2VfZGlzcGF0Y2gsIGNoYXJnZSwKLQkJCWlvcHNfbW9kZShjZnFkKSwgY2ZxcS0+bnJfc2VjdG9ycyk7CisJY2ZxX2xvZ19jZnFxKGNmcXEtPmNmcWQsIGNmcXEsCisJCSAgICAgInNsX3VzZWQ9JXUgZGlzcD0ldSBjaGFyZ2U9JXUgaW9wcz0ldSBzZWN0PSVsdSIsCisJCSAgICAgdXNlZF9zbCwgY2ZxcS0+c2xpY2VfZGlzcGF0Y2gsIGNoYXJnZSwKKwkJICAgICBpb3BzX21vZGUoY2ZxZCksIGNmcXEtPm5yX3NlY3RvcnMpOwogCWNmcV9ibGtpb2NnX3VwZGF0ZV90aW1lc2xpY2VfdXNlZCgmY2ZxZy0+YmxrZywgdXNlZF9zbCwKIAkJCQkJICB1bmFjY291bnRlZF9zbCk7CiAJY2ZxX2Jsa2lvY2dfc2V0X3N0YXJ0X2VtcHR5X3RpbWUoJmNmcWctPmJsa2cpOwpAQCAtMTAwNCw4ICsxMDE0LDggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBjZnFfdXBkYXRlX2Jsa2lvX2dyb3VwX3dlaWdodCh2b2lkICprZXksIHN0cnVjdCBibGtpb19ncm91cCAqYmxrZywKLQkJCQkJdW5zaWduZWQgaW50IHdlaWdodCkKK3N0YXRpYyB2b2lkIGNmcV91cGRhdGVfYmxraW9fZ3JvdXBfd2VpZ2h0KHZvaWQgKmtleSwgc3RydWN0IGJsa2lvX2dyb3VwICpibGtnLAorCQkJCQkgIHVuc2lnbmVkIGludCB3ZWlnaHQpCiB7CiAJc3RydWN0IGNmcV9ncm91cCAqY2ZxZyA9IGNmcWdfb2ZfYmxrZyhibGtnKTsKIAljZnFnLT5uZXdfd2VpZ2h0ID0gd2VpZ2h0OwpAQCAtMTA1OCw2ICsxMDY4LDggQEAKIAkJKnN0ID0gQ0ZRX1JCX1JPT1Q7CiAJUkJfQ0xFQVJfTk9ERSgmY2ZxZy0+cmJfbm9kZSk7CiAKKwljZnFnLT50dGltZS5sYXN0X2VuZF9yZXF1ZXN0ID0gamlmZmllczsKKwogCS8qCiAJICogVGFrZSB0aGUgaW5pdGlhbCByZWZlcmVuY2UgdGhhdCB3aWxsIGJlIHJlbGVhc2VkIG9uIGRlc3Ryb3kKIAkgKiBUaGlzIGNhbiBiZSB0aG91Z2h0IG9mIGEgam9pbnQgcmVmZXJlbmNlIGJ5IGNncm91cCBhbmQKQEAgLTEyMzQsNyArMTI0Niw3IEBACiAgKiBpdCBzaG91bGQgbm90IGJlIE5VTEwgYXMgZXZlbiBpZiBlbGV2YXRvciB3YXMgZXhpdGluZywgY2dyb3VwIGRlbHRpb24KICAqIHBhdGggZ290IHRvIGl0IGZpcnN0LgogICovCi12b2lkIGNmcV91bmxpbmtfYmxraW9fZ3JvdXAodm9pZCAqa2V5LCBzdHJ1Y3QgYmxraW9fZ3JvdXAgKmJsa2cpCitzdGF0aWMgdm9pZCBjZnFfdW5saW5rX2Jsa2lvX2dyb3VwKHZvaWQgKmtleSwgc3RydWN0IGJsa2lvX2dyb3VwICpibGtnKQogewogCXVuc2lnbmVkIGxvbmcgIGZsYWdzOwogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IGtleTsKQEAgLTE1MDEsMTYgKzE1MTMsMTEgQEAKIHsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gUlFfQ0ZRUShycSk7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gY2ZxcS0+Y2ZxZDsKLQlzdHJ1Y3QgcmVxdWVzdCAqX19hbGlhcywgKnByZXY7CisJc3RydWN0IHJlcXVlc3QgKnByZXY7CiAKIAljZnFxLT5xdWV1ZWRbcnFfaXNfc3luYyhycSldKys7CiAKLQkvKgotCSAqIGxvb2tzIGEgbGl0dGxlIG9kZCwgYnV0IHRoZSBmaXJzdCBpbnNlcnQgbWlnaHQgcmV0dXJuIGFuIGFsaWFzLgotCSAqIGlmIHRoYXQgaGFwcGVucywgcHV0IHRoZSBhbGlhcyBvbiB0aGUgZGlzcGF0Y2ggbGlzdAotCSAqLwotCXdoaWxlICgoX19hbGlhcyA9IGVsdl9yYl9hZGQoJmNmcXEtPnNvcnRfbGlzdCwgcnEpKSAhPSBOVUxMKQotCQljZnFfZGlzcGF0Y2hfaW5zZXJ0KGNmcWQtPnF1ZXVlLCBfX2FsaWFzKTsKKwllbHZfcmJfYWRkKCZjZnFxLT5zb3J0X2xpc3QsIHJxKTsKIAogCWlmICghY2ZxX2NmcXFfb25fcnIoY2ZxcSkpCiAJCWNmcV9hZGRfY2ZxcV9ycihjZnFkLCBjZnFxKTsKQEAgLTE1OTcsMTAgKzE2MDQsNiBAQAogCWNmcXEtPmNmcWQtPnJxX3F1ZXVlZC0tOwogCWNmcV9ibGtpb2NnX3VwZGF0ZV9pb19yZW1vdmVfc3RhdHMoJihSUV9DRlFHKHJxKSktPmJsa2csCiAJCQkJCXJxX2RhdGFfZGlyKHJxKSwgcnFfaXNfc3luYyhycSkpOwotCWlmIChycS0+Y21kX2ZsYWdzICYgUkVRX01FVEEpIHsKLQkJV0FSTl9PTighY2ZxcS0+bWV0YV9wZW5kaW5nKTsKLQkJY2ZxcS0+bWV0YV9wZW5kaW5nLS07Ci0JfQogfQogCiBzdGF0aWMgaW50IGNmcV9tZXJnZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKipyZXEsCkBAIC0xOTY4LDcgKzE5NzEsOCBAQAogCSAqIE90aGVyd2lzZSwgd2UgZG8gb25seSBpZiB0aGV5IGFyZSB0aGUgbGFzdCBvbmVzCiAJICogaW4gdGhlaXIgc2VydmljZSB0cmVlLgogCSAqLwotCWlmIChzZXJ2aWNlX3RyZWUtPmNvdW50ID09IDEgJiYgY2ZxX2NmcXFfc3luYyhjZnFxKSkKKwlpZiAoc2VydmljZV90cmVlLT5jb3VudCA9PSAxICYmIGNmcV9jZnFxX3N5bmMoY2ZxcSkgJiYKKwkgICAhY2ZxX2lvX3RoaW5rdGltZV9iaWcoY2ZxZCwgJnNlcnZpY2VfdHJlZS0+dHRpbWUsIGZhbHNlKSkKIAkJcmV0dXJuIHRydWU7CiAJY2ZxX2xvZ19jZnFxKGNmcWQsIGNmcXEsICJOb3QgaWRsaW5nLiBzdC0+Y291bnQ6JWQiLAogCQkJc2VydmljZV90cmVlLT5jb3VudCk7CkBAIC0yMDIxLDEwICsyMDI1LDEwIEBACiAJICogc2xpY2UsIHRoZW4gZG9uJ3QgaWRsZS4gVGhpcyBhdm9pZHMgb3ZlcnJ1bm5pbmcgdGhlIGFsbG90dGVkCiAJICogdGltZSBzbGljZS4KIAkgKi8KLQlpZiAoc2FtcGxlX3ZhbGlkKGNpYy0+dHRpbWVfc2FtcGxlcykgJiYKLQkgICAgKGNmcXEtPnNsaWNlX2VuZCAtIGppZmZpZXMgPCBjaWMtPnR0aW1lX21lYW4pKSB7Ci0JCWNmcV9sb2dfY2ZxcShjZnFkLCBjZnFxLCAiTm90IGlkbGluZy4gdGhpbmtfdGltZTolZCIsCi0JCQkJY2ljLT50dGltZV9tZWFuKTsKKwlpZiAoc2FtcGxlX3ZhbGlkKGNpYy0+dHRpbWUudHRpbWVfc2FtcGxlcykgJiYKKwkgICAgKGNmcXEtPnNsaWNlX2VuZCAtIGppZmZpZXMgPCBjaWMtPnR0aW1lLnR0aW1lX21lYW4pKSB7CisJCWNmcV9sb2dfY2ZxcShjZnFkLCBjZnFxLCAiTm90IGlkbGluZy4gdGhpbmtfdGltZTolbHUiLAorCQkJICAgICBjaWMtPnR0aW1lLnR0aW1lX21lYW4pOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMzgwLDggKzIzODQsOSBAQAogCSAqIHRoaXMgZ3JvdXAsIHdhaXQgZm9yIHJlcXVlc3RzIHRvIGNvbXBsZXRlLgogCSAqLwogY2hlY2tfZ3JvdXBfaWRsZToKLQlpZiAoY2ZxZC0+Y2ZxX2dyb3VwX2lkbGUgJiYgY2ZxcS0+Y2ZxZy0+bnJfY2ZxcSA9PSAxCi0JICAgICYmIGNmcXEtPmNmcWctPmRpc3BhdGNoZWQpIHsKKwlpZiAoY2ZxZC0+Y2ZxX2dyb3VwX2lkbGUgJiYgY2ZxcS0+Y2ZxZy0+bnJfY2ZxcSA9PSAxICYmCisJICAgIGNmcXEtPmNmcWctPmRpc3BhdGNoZWQgJiYKKwkgICAgIWNmcV9pb190aGlua3RpbWVfYmlnKGNmcWQsICZjZnFxLT5jZnFnLT50dGltZSwgdHJ1ZSkpIHsKIAkJY2ZxcSA9IE5VTEw7CiAJCWdvdG8ga2VlcF9xdWV1ZTsKIAl9CkBAIC0yNzcyLDggKzI3NzcsMTQgQEAKIAlzbXBfd21iKCk7CiAJY2ljLT5rZXkgPSBjZnFkX2RlYWRfa2V5KGNmcWQpOwogCi0JaWYgKGlvYy0+aW9jX2RhdGEgPT0gY2ljKQorCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAocmN1X2RlcmVmZXJlbmNlKGlvYy0+aW9jX2RhdGEpID09IGNpYykgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJc3Bpbl9sb2NrKCZpb2MtPmxvY2spOwogCQlyY3VfYXNzaWduX3BvaW50ZXIoaW9jLT5pb2NfZGF0YSwgTlVMTCk7CisJCXNwaW5fdW5sb2NrKCZpb2MtPmxvY2spOworCX0gZWxzZQorCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChjaWMtPmNmcXFbQkxLX1JXX0FTWU5DXSkgewogCQljZnFfZXhpdF9jZnFxKGNmcWQsIGNpYy0+Y2ZxcVtCTEtfUldfQVNZTkNdKTsKQEAgLTI4MjYsNyArMjgzNyw3IEBACiAJY2ljID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNmcV9pb2NfcG9vbCwgZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLAogCQkJCQkJCWNmcWQtPnF1ZXVlLT5ub2RlKTsKIAlpZiAoY2ljKSB7Ci0JCWNpYy0+bGFzdF9lbmRfcmVxdWVzdCA9IGppZmZpZXM7CisJCWNpYy0+dHRpbWUubGFzdF9lbmRfcmVxdWVzdCA9IGppZmZpZXM7CiAJCUlOSVRfTElTVF9IRUFEKCZjaWMtPnF1ZXVlX2xpc3QpOwogCQlJTklUX0hMSVNUX05PREUoJmNpYy0+Y2ljX2xpc3QpOwogCQljaWMtPmR0b3IgPSBjZnFfZnJlZV9pb19jb250ZXh0OwpAQCAtMjg3Niw3ICsyODg3LDYgQEAKIAkgKiBlbGV2YXRlIHRoZSBwcmlvcml0eSBvZiB0aGlzIHF1ZXVlCiAJICovCiAJY2ZxcS0+b3JnX2lvcHJpbyA9IGNmcXEtPmlvcHJpbzsKLQljZnFxLT5vcmdfaW9wcmlvX2NsYXNzID0gY2ZxcS0+aW9wcmlvX2NsYXNzOwogCWNmcV9jbGVhcl9jZnFxX3ByaW9fY2hhbmdlZChjZnFxKTsKIH0KIApAQCAtMzA4MCw3ICszMDkwLDggQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmxvY2ssIGZsYWdzKTsKIAotCUJVR19PTihpb2MtPmlvY19kYXRhID09IGNpYyk7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZV9jaGVjayhpb2MtPmlvY19kYXRhLAorCQlsb2NrZGVwX2lzX2hlbGQoJmlvYy0+bG9jaykpID09IGNpYyk7CiAKIAlyYWRpeF90cmVlX2RlbGV0ZSgmaW9jLT5yYWRpeF9yb290LCBjZnFkLT5jaWNfaW5kZXgpOwogCWhsaXN0X2RlbF9yY3UoJmNpYy0+Y2ljX2xpc3QpOwpAQCAtMzIxMywxNCArMzIyNCwyOCBAQAogfQogCiBzdGF0aWMgdm9pZAotY2ZxX3VwZGF0ZV9pb190aGlua3RpbWUoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYykKK19fY2ZxX3VwZGF0ZV9pb190aGlua3RpbWUoc3RydWN0IGNmcV90dGltZSAqdHRpbWUsIHVuc2lnbmVkIGxvbmcgc2xpY2VfaWRsZSkKIHsKLQl1bnNpZ25lZCBsb25nIGVsYXBzZWQgPSBqaWZmaWVzIC0gY2ljLT5sYXN0X2VuZF9yZXF1ZXN0OwotCXVuc2lnbmVkIGxvbmcgdHRpbWUgPSBtaW4oZWxhcHNlZCwgMlVMICogY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUpOworCXVuc2lnbmVkIGxvbmcgZWxhcHNlZCA9IGppZmZpZXMgLSB0dGltZS0+bGFzdF9lbmRfcmVxdWVzdDsKKwllbGFwc2VkID0gbWluKGVsYXBzZWQsIDJVTCAqIHNsaWNlX2lkbGUpOwogCi0JY2ljLT50dGltZV9zYW1wbGVzID0gKDcqY2ljLT50dGltZV9zYW1wbGVzICsgMjU2KSAvIDg7Ci0JY2ljLT50dGltZV90b3RhbCA9ICg3KmNpYy0+dHRpbWVfdG90YWwgKyAyNTYqdHRpbWUpIC8gODsKLQljaWMtPnR0aW1lX21lYW4gPSAoY2ljLT50dGltZV90b3RhbCArIDEyOCkgLyBjaWMtPnR0aW1lX3NhbXBsZXM7CisJdHRpbWUtPnR0aW1lX3NhbXBsZXMgPSAoNyp0dGltZS0+dHRpbWVfc2FtcGxlcyArIDI1NikgLyA4OworCXR0aW1lLT50dGltZV90b3RhbCA9ICg3KnR0aW1lLT50dGltZV90b3RhbCArIDI1NiplbGFwc2VkKSAvIDg7CisJdHRpbWUtPnR0aW1lX21lYW4gPSAodHRpbWUtPnR0aW1lX3RvdGFsICsgMTI4KSAvIHR0aW1lLT50dGltZV9zYW1wbGVzOworfQorCitzdGF0aWMgdm9pZAorY2ZxX3VwZGF0ZV9pb190aGlua3RpbWUoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLAorCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljKQoreworCWlmIChjZnFfY2ZxcV9zeW5jKGNmcXEpKSB7CisJCV9fY2ZxX3VwZGF0ZV9pb190aGlua3RpbWUoJmNpYy0+dHRpbWUsIGNmcWQtPmNmcV9zbGljZV9pZGxlKTsKKwkJX19jZnFfdXBkYXRlX2lvX3RoaW5rdGltZSgmY2ZxcS0+c2VydmljZV90cmVlLT50dGltZSwKKwkJCWNmcWQtPmNmcV9zbGljZV9pZGxlKTsKKwl9CisjaWZkZWYgQ09ORklHX0NGUV9HUk9VUF9JT1NDSEVECisJX19jZnFfdXBkYXRlX2lvX3RoaW5rdGltZSgmY2ZxcS0+Y2ZxZy0+dHRpbWUsIGNmcWQtPmNmcV9ncm91cF9pZGxlKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZApAQCAtMzI2OSw4ICszMjk0LDggQEAKIAllbHNlIGlmICghYXRvbWljX3JlYWQoJmNpYy0+aW9jLT5ucl90YXNrcykgfHwgIWNmcWQtPmNmcV9zbGljZV9pZGxlIHx8CiAJICAgICghY2ZxX2NmcXFfZGVlcChjZnFxKSAmJiBDRlFRX1NFRUtZKGNmcXEpKSkKIAkJZW5hYmxlX2lkbGUgPSAwOwotCWVsc2UgaWYgKHNhbXBsZV92YWxpZChjaWMtPnR0aW1lX3NhbXBsZXMpKSB7Ci0JCWlmIChjaWMtPnR0aW1lX21lYW4gPiBjZnFkLT5jZnFfc2xpY2VfaWRsZSkKKwllbHNlIGlmIChzYW1wbGVfdmFsaWQoY2ljLT50dGltZS50dGltZV9zYW1wbGVzKSkgeworCQlpZiAoY2ljLT50dGltZS50dGltZV9tZWFuID4gY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUpCiAJCQllbmFibGVfaWRsZSA9IDA7CiAJCWVsc2UKIAkJCWVuYWJsZV9pZGxlID0gMTsKQEAgLTMzMzIsMTMgKzMzNTcsNiBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCS8qCi0JICogU28gYm90aCBxdWV1ZXMgYXJlIHN5bmMuIExldCB0aGUgbmV3IHJlcXVlc3QgZ2V0IGRpc2sgdGltZSBpZgotCSAqIGl0J3MgYSBtZXRhZGF0YSByZXF1ZXN0IGFuZCB0aGUgY3VycmVudCBxdWV1ZSBpcyBkb2luZyByZWd1bGFyIElPLgotCSAqLwotCWlmICgocnEtPmNtZF9mbGFncyAmIFJFUV9NRVRBKSAmJiAhY2ZxcS0+bWV0YV9wZW5kaW5nKQotCQlyZXR1cm4gdHJ1ZTsKLQotCS8qCiAJICogQWxsb3cgYW4gUlQgcmVxdWVzdCB0byBwcmUtZW1wdCBhbiBvbmdvaW5nIG5vbi1SVCBjZnFxIHRpbWVzbGljZS4KIAkgKi8KIAlpZiAoY2ZxX2NsYXNzX3J0KG5ld19jZnFxKSAmJiAhY2ZxX2NsYXNzX3J0KGNmcXEpKQpAQCAtMzQwMiwxMCArMzQyMCw4IEBACiAJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMgPSBSUV9DSUMocnEpOwogCiAJY2ZxZC0+cnFfcXVldWVkKys7Ci0JaWYgKHJxLT5jbWRfZmxhZ3MgJiBSRVFfTUVUQSkKLQkJY2ZxcS0+bWV0YV9wZW5kaW5nKys7CiAKLQljZnFfdXBkYXRlX2lvX3RoaW5rdGltZShjZnFkLCBjaWMpOworCWNmcV91cGRhdGVfaW9fdGhpbmt0aW1lKGNmcWQsIGNmcXEsIGNpYyk7CiAJY2ZxX3VwZGF0ZV9pb19zZWVrdGltZShjZnFkLCBjZnFxLCBycSk7CiAJY2ZxX3VwZGF0ZV9pZGxlX3dpbmRvdyhjZnFkLCBjZnFxLCBjaWMpOwogCkBAIC0zNTEyLDEyICszNTI4LDE2IEBACiAJaWYgKGNmcXEtPmNmcWctPm5yX2NmcXEgPiAxKQogCQlyZXR1cm4gZmFsc2U7CiAKKwkvKiB0aGUgb25seSBxdWV1ZSBpbiB0aGUgZ3JvdXAsIGJ1dCB0aGluayB0aW1lIGlzIGJpZyAqLworCWlmIChjZnFfaW9fdGhpbmt0aW1lX2JpZyhjZnFkLCAmY2ZxcS0+Y2ZxZy0+dHRpbWUsIHRydWUpKQorCQlyZXR1cm4gZmFsc2U7CisKIAlpZiAoY2ZxX3NsaWNlX3VzZWQoY2ZxcSkpCiAJCXJldHVybiB0cnVlOwogCiAJLyogaWYgc2xpY2UgbGVmdCBpcyBsZXNzIHRoYW4gdGhpbmsgdGltZSwgd2FpdCBidXN5ICovCi0JaWYgKGNpYyAmJiBzYW1wbGVfdmFsaWQoY2ljLT50dGltZV9zYW1wbGVzKQotCSAgICAmJiAoY2ZxcS0+c2xpY2VfZW5kIC0gamlmZmllcyA8IGNpYy0+dHRpbWVfbWVhbikpCisJaWYgKGNpYyAmJiBzYW1wbGVfdmFsaWQoY2ljLT50dGltZS50dGltZV9zYW1wbGVzKQorCSAgICAmJiAoY2ZxcS0+c2xpY2VfZW5kIC0gamlmZmllcyA8IGNpYy0+dHRpbWUudHRpbWVfbWVhbikpCiAJCXJldHVybiB0cnVlOwogCiAJLyoKQEAgLTM1NTgsMTEgKzM1NzgsMjQgQEAKIAljZnFkLT5ycV9pbl9mbGlnaHRbY2ZxX2NmcXFfc3luYyhjZnFxKV0tLTsKIAogCWlmIChzeW5jKSB7Ci0JCVJRX0NJQyhycSktPmxhc3RfZW5kX3JlcXVlc3QgPSBub3c7CisJCXN0cnVjdCBjZnFfcmJfcm9vdCAqc2VydmljZV90cmVlOworCisJCVJRX0NJQyhycSktPnR0aW1lLmxhc3RfZW5kX3JlcXVlc3QgPSBub3c7CisKKwkJaWYgKGNmcV9jZnFxX29uX3JyKGNmcXEpKQorCQkJc2VydmljZV90cmVlID0gY2ZxcS0+c2VydmljZV90cmVlOworCQllbHNlCisJCQlzZXJ2aWNlX3RyZWUgPSBzZXJ2aWNlX3RyZWVfZm9yKGNmcXEtPmNmcWcsCisJCQkJY2ZxcV9wcmlvKGNmcXEpLCBjZnFxX3R5cGUoY2ZxcSkpOworCQlzZXJ2aWNlX3RyZWUtPnR0aW1lLmxhc3RfZW5kX3JlcXVlc3QgPSBub3c7CiAJCWlmICghdGltZV9hZnRlcihycS0+c3RhcnRfdGltZSArIGNmcWQtPmNmcV9maWZvX2V4cGlyZVsxXSwgbm93KSkKIAkJCWNmcWQtPmxhc3RfZGVsYXllZF9zeW5jID0gbm93OwogCX0KIAorI2lmZGVmIENPTkZJR19DRlFfR1JPVVBfSU9TQ0hFRAorCWNmcXEtPmNmcWctPnR0aW1lLmxhc3RfZW5kX3JlcXVlc3QgPSBub3c7CisjZW5kaWYKKwogCS8qCiAJICogSWYgdGhpcyBpcyB0aGUgYWN0aXZlIHF1ZXVlLCBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSBleHBpcmVkLAogCSAqIG9yIGlmIHdlIHdhbnQgdG8gaWRsZSBpbiBjYXNlIGl0IGhhcyBubyBwZW5kaW5nIHJlcXVlc3RzLgpAQCAtMzYwOCwzMCArMzY0MSw2IEBACiAJCWNmcV9zY2hlZHVsZV9kaXNwYXRjaChjZnFkKTsKIH0KIAotLyoKLSAqIHdlIHRlbXBvcmFyaWx5IGJvb3N0IGxvd2VyIHByaW9yaXR5IHF1ZXVlcyBpZiB0aGV5IGFyZSBob2xkaW5nIGZzIGV4Y2x1c2l2ZQotICogcmVzb3VyY2VzLiB0aGV5IGFyZSBib29zdGVkIHRvIG5vcm1hbCBwcmlvIChDTEFTU19CRS80KQotICovCi1zdGF0aWMgdm9pZCBjZnFfcHJpb19ib29zdChzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQotewotCWlmIChoYXNfZnNfZXhjbCgpKSB7Ci0JCS8qCi0JCSAqIGJvb3N0IGlkbGUgcHJpbyBvbiB0cmFuc2FjdGlvbnMgdGhhdCB3b3VsZCBsb2NrIG91dCBvdGhlcgotCQkgKiB1c2VycyBvZiB0aGUgZmlsZXN5c3RlbQotCQkgKi8KLQkJaWYgKGNmcV9jbGFzc19pZGxlKGNmcXEpKQotCQkJY2ZxcS0+aW9wcmlvX2NsYXNzID0gSU9QUklPX0NMQVNTX0JFOwotCQlpZiAoY2ZxcS0+aW9wcmlvID4gSU9QUklPX05PUk0pCi0JCQljZnFxLT5pb3ByaW8gPSBJT1BSSU9fTk9STTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiB1bmJvb3N0IHRoZSBxdWV1ZSAoaWYgbmVlZGVkKQotCQkgKi8KLQkJY2ZxcS0+aW9wcmlvX2NsYXNzID0gY2ZxcS0+b3JnX2lvcHJpb19jbGFzczsKLQkJY2ZxcS0+aW9wcmlvID0gY2ZxcS0+b3JnX2lvcHJpbzsKLQl9Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IF9fY2ZxX21heV9xdWV1ZShzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQogewogCWlmIChjZnFfY2ZxcV93YWl0X3JlcXVlc3QoY2ZxcSkgJiYgIWNmcV9jZnFxX211c3RfYWxsb2Nfc2xpY2UoY2ZxcSkpIHsKQEAgLTM2NjIsNyArMzY3MSw2IEBACiAJY2ZxcSA9IGNpY190b19jZnFxKGNpYywgcndfaXNfc3luYyhydykpOwogCWlmIChjZnFxKSB7CiAJCWNmcV9pbml0X3ByaW9fZGF0YShjZnFxLCBjaWMtPmlvYyk7Ci0JCWNmcV9wcmlvX2Jvb3N0KGNmcXEpOwogCiAJCXJldHVybiBfX2NmcV9tYXlfcXVldWUoY2ZxcSk7CiAJfQpkaWZmIC0tZ2l0IGEvYmxvY2svY29tcGF0X2lvY3RsLmMgYi9ibG9jay9jb21wYXRfaW9jdGwuYwppbmRleCBjYzNlYjc4Li43YjcyNTAyIDEwMDY0NAotLS0gYS9ibG9jay9jb21wYXRfaW9jdGwuYworKysgYi9ibG9jay9jb21wYXRfaW9jdGwuYwpAQCAtMjA4LDE5ICsyMDgsNiBAQAogI2RlZmluZSBCTEtCU1pTRVRfMzIJCV9JT1coMHgxMiwgMTEzLCBpbnQpCiAjZGVmaW5lIEJMS0dFVFNJWkU2NF8zMgkJX0lPUigweDEyLCAxMTQsIGludCkKIAotc3RydWN0IGNvbXBhdF9mbG9wcHlfc3RydWN0IHsKLQljb21wYXRfdWludF90CXNpemU7Ci0JY29tcGF0X3VpbnRfdAlzZWN0OwotCWNvbXBhdF91aW50X3QJaGVhZDsKLQljb21wYXRfdWludF90CXRyYWNrOwotCWNvbXBhdF91aW50X3QJc3RyZXRjaDsKLQl1bnNpZ25lZCBjaGFyCWdhcDsKLQl1bnNpZ25lZCBjaGFyCXJhdGU7Ci0JdW5zaWduZWQgY2hhcglzcGVjMTsKLQl1bnNpZ25lZCBjaGFyCWZtdF9nYXA7Ci0JY29uc3QgY29tcGF0X2NhZGRyX3QgbmFtZTsKLX07Ci0KIHN0cnVjdCBjb21wYXRfZmxvcHB5X2RyaXZlX3BhcmFtcyB7CiAJY2hhcgkJY21vczsKIAljb21wYXRfdWxvbmdfdAltYXhfZHRyOwpAQCAtMjg4LDcgKzI3NSw2IEBACiAKICNkZWZpbmUgRkRTRVRQUk0zMiBfSU9XKDIsIDB4NDIsIHN0cnVjdCBjb21wYXRfZmxvcHB5X3N0cnVjdCkKICNkZWZpbmUgRkRERUZQUk0zMiBfSU9XKDIsIDB4NDMsIHN0cnVjdCBjb21wYXRfZmxvcHB5X3N0cnVjdCkKLSNkZWZpbmUgRkRHRVRQUk0zMiBfSU9SKDIsIDB4MDQsIHN0cnVjdCBjb21wYXRfZmxvcHB5X3N0cnVjdCkKICNkZWZpbmUgRkRTRVREUlZQUk0zMiBfSU9XKDIsIDB4OTAsIHN0cnVjdCBjb21wYXRfZmxvcHB5X2RyaXZlX3BhcmFtcykKICNkZWZpbmUgRkRHRVREUlZQUk0zMiBfSU9SKDIsIDB4MTEsIHN0cnVjdCBjb21wYXRfZmxvcHB5X2RyaXZlX3BhcmFtcykKICNkZWZpbmUgRkRHRVREUlZTVEFUMzIgX0lPUigyLCAweDEyLCBzdHJ1Y3QgY29tcGF0X2Zsb3BweV9kcml2ZV9zdHJ1Y3QpCmRpZmYgLS1naXQgYS9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKaW5kZXggNTEzOWMwZS4uYzY0NDEzNyAxMDA2NDQKLS0tIGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYwpAQCAtNzcsMTAgKzc3LDggQEAKIGRlYWRsaW5lX2FkZF9ycV9yYihzdHJ1Y3QgZGVhZGxpbmVfZGF0YSAqZGQsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzdHJ1Y3QgcmJfcm9vdCAqcm9vdCA9IGRlYWRsaW5lX3JiX3Jvb3QoZGQsIHJxKTsKLQlzdHJ1Y3QgcmVxdWVzdCAqX19hbGlhczsKIAotCXdoaWxlICh1bmxpa2VseShfX2FsaWFzID0gZWx2X3JiX2FkZChyb290LCBycSkpKQotCQlkZWFkbGluZV9tb3ZlX3JlcXVlc3QoZGQsIF9fYWxpYXMpOworCWVsdl9yYl9hZGQocm9vdCwgcnEpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKZGlmZiAtLWdpdCBhL2Jsb2NrL2VsZXZhdG9yLmMgYi9ibG9jay9lbGV2YXRvci5jCmluZGV4IGIwYjM4Y2UuLmEzYjY0YmMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2VsZXZhdG9yLmMKKysrIGIvYmxvY2svZWxldmF0b3IuYwpAQCAtMzUzLDcgKzM1Myw3IEBACiAgKiBSQi10cmVlIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBpbnNlcnRpbmcvbG9va3VwL3JlbW92YWwgb2YgcmVxdWVzdHMKICAqIGluIGEgc29ydGVkIFJCIHRyZWUuCiAgKi8KLXN0cnVjdCByZXF1ZXN0ICplbHZfcmJfYWRkKHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit2b2lkIGVsdl9yYl9hZGQoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcm9vdC0+cmJfbm9kZTsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKQEAgLTM2NSwxNSArMzY1LDEyIEBACiAKIAkJaWYgKGJsa19ycV9wb3MocnEpIDwgYmxrX3JxX3BvcyhfX3JxKSkKIAkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoYmxrX3JxX3BvcyhycSkgPiBibGtfcnFfcG9zKF9fcnEpKQorCQllbHNlIGlmIChibGtfcnFfcG9zKHJxKSA+PSBibGtfcnFfcG9zKF9fcnEpKQogCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKLQkJZWxzZQotCQkJcmV0dXJuIF9fcnE7CiAJfQogCiAJcmJfbGlua19ub2RlKCZycS0+cmJfbm9kZSwgcGFyZW50LCBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJnJxLT5yYl9ub2RlLCByb290KTsKLQlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0woZWx2X3JiX2FkZCk7CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2dlbmhkLmMgYi9ibG9jay9nZW5oZC5jCmluZGV4IDk1ODIyYWUuLjVjYjUxYzUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2dlbmhkLmMKKysrIGIvYmxvY2svZ2VuaGQuYwpAQCAtNjAyLDcgKzYwMiw3IEBACiAJZGlzay0+bWFqb3IgPSBNQUpPUihkZXZ0KTsKIAlkaXNrLT5maXJzdF9taW5vciA9IE1JTk9SKGRldnQpOwogCi0JLyogUmVnaXN0ZXIgQkRJIGJlZm9yZSByZWZlcmVuY2luZyBpdCBmcm9tIGJkZXYgKi8gCisJLyogUmVnaXN0ZXIgQkRJIGJlZm9yZSByZWZlcmVuY2luZyBpdCBmcm9tIGJkZXYgKi8KIAliZGkgPSAmZGlzay0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm87CiAJYmRpX3JlZ2lzdGVyX2RldihiZGksIGRpc2tfZGV2dChkaXNrKSk7CiAKQEAgLTEwMTgsMTQgKzEwMTgsNiBAQAogCU5VTEwKIH07CiAKLXN0YXRpYyB2b2lkIGRpc2tfZnJlZV9wdGJsX3JjdV9jYihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGRpc2tfcGFydF90YmwgKnB0YmwgPQotCQljb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGRpc2tfcGFydF90YmwsIHJjdV9oZWFkKTsKLQotCWtmcmVlKHB0YmwpOwotfQotCiAvKioKICAqIGRpc2tfcmVwbGFjZV9wYXJ0X3RibCAtIHJlcGxhY2UgZGlzay0+cGFydF90YmwgaW4gUkNVLXNhZmUgd2F5CiAgKiBAZGlzazogZGlzayB0byByZXBsYWNlIHBhcnRfdGJsIGZvcgpAQCAtMTA0Niw3ICsxMDM4LDcgQEAKIAogCWlmIChvbGRfcHRibCkgewogCQlyY3VfYXNzaWduX3BvaW50ZXIob2xkX3B0YmwtPmxhc3RfbG9va3VwLCBOVUxMKTsKLQkJY2FsbF9yY3UoJm9sZF9wdGJsLT5yY3VfaGVhZCwgZGlza19mcmVlX3B0YmxfcmN1X2NiKTsKKwkJa2ZyZWVfcmN1KG9sZF9wdGJsLCByY3VfaGVhZCk7CiAJfQogfQogCkBAIC0xMTQ4LDcgKzExNDAsNyBAQAogCQkJCSJ3c2VjdCB3dXNlIHJ1bm5pbmcgdXNlIGF2ZXEiCiAJCQkJIlxuXG4iKTsKIAkqLwotIAorCiAJZGlza19wYXJ0X2l0ZXJfaW5pdCgmcGl0ZXIsIGdwLCBESVNLX1BJVEVSX0lOQ0xfRU1QVFlfUEFSVDApOwogCXdoaWxlICgoaGQgPSBkaXNrX3BhcnRfaXRlcl9uZXh0KCZwaXRlcikpKSB7CiAJCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7CkBAIC0xMTcyLDcgKzExNjQsNyBAQAogCQkJKTsKIAl9CiAJZGlza19wYXJ0X2l0ZXJfZXhpdCgmcGl0ZXIpOwotIAorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNzEsNiArMTM2Myw3IEBACiAJc3RydWN0IGdlbmRpc2sJCSpkaXNrOwkJLyogdGhlIGFzc29jaWF0ZWQgZGlzayAqLwogCXNwaW5sb2NrX3QJCWxvY2s7CiAKKwlzdHJ1Y3QgbXV0ZXgJCWJsb2NrX211dGV4OwkvKiBwcm90ZWN0cyBibG9ja2luZyAqLwogCWludAkJCWJsb2NrOwkJLyogZXZlbnQgYmxvY2tpbmcgZGVwdGggKi8KIAl1bnNpZ25lZCBpbnQJCXBlbmRpbmc7CS8qIGV2ZW50cyBhbHJlYWR5IHNlbnQgb3V0ICovCiAJdW5zaWduZWQgaW50CQljbGVhcmluZzsJLyogZXZlbnRzIGJlaW5nIGNsZWFyZWQgKi8KQEAgLTE0MTQsMjIgKzE0MDcsNDQgQEAKIAlyZXR1cm4gbXNlY3NfdG9famlmZmllcyhpbnR2X21zZWNzKTsKIH0KIAotc3RhdGljIHZvaWQgX19kaXNrX2Jsb2NrX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgYm9vbCBzeW5jKQorLyoqCisgKiBkaXNrX2Jsb2NrX2V2ZW50cyAtIGJsb2NrIGFuZCBmbHVzaCBkaXNrIGV2ZW50IGNoZWNraW5nCisgKiBAZGlzazogZGlzayB0byBibG9jayBldmVudHMgZm9yCisgKgorICogT24gcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbiwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IGV2ZW50IGNoZWNraW5nCisgKiBpc24ndCBpbiBwcm9ncmVzcyBhbmQgd29uJ3QgaGFwcGVuIHVudGlsIHVuYmxvY2tlZCBieQorICogZGlza191bmJsb2NrX2V2ZW50cygpLiAgRXZlbnRzIGJsb2NraW5nIGlzIGNvdW50ZWQgYW5kIHRoZSBhY3R1YWwKKyAqIHVuYmxvY2tpbmcgaGFwcGVucyBhZnRlciB0aGUgbWF0Y2hpbmcgbnVtYmVyIG9mIHVuYmxvY2tzIGFyZSBkb25lLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGludGVudGlvbmFsbHkgZG9lcyBub3QgYmxvY2sgZXZlbnQgY2hlY2tpbmcgZnJvbQorICogZGlza19jbGVhcl9ldmVudHMoKS4KKyAqCisgKiBDT05URVhUOgorICogTWlnaHQgc2xlZXAuCisgKi8KK3ZvaWQgZGlza19ibG9ja19ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7CiAJc3RydWN0IGRpc2tfZXZlbnRzICpldiA9IGRpc2stPmV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYm9vbCBjYW5jZWw7CiAKKwlpZiAoIWV2KQorCQlyZXR1cm47CisKKwkvKgorCSAqIE91dGVyIG11dGV4IGVuc3VyZXMgdGhhdCB0aGUgZmlyc3QgYmxvY2tlciBjb21wbGV0ZXMgY2FuY2VsaW5nCisJICogdGhlIGV2ZW50IHdvcmsgYmVmb3JlIGZ1cnRoZXIgYmxvY2tlcnMgYXJlIGFsbG93ZWQgdG8gZmluaXNoLgorCSAqLworCW11dGV4X2xvY2soJmV2LT5ibG9ja19tdXRleCk7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXYtPmxvY2ssIGZsYWdzKTsKIAljYW5jZWwgPSAhZXYtPmJsb2NrKys7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXYtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChjYW5jZWwpIHsKLQkJaWYgKHN5bmMpCi0JCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRpc2stPmV2LT5kd29yayk7Ci0JCWVsc2UKLQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRpc2stPmV2LT5kd29yayk7Ci0JfQorCWlmIChjYW5jZWwpCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGlzay0+ZXYtPmR3b3JrKTsKKworCW11dGV4X3VubG9jaygmZXYtPmJsb2NrX211dGV4KTsKIH0KIAogc3RhdGljIHZvaWQgX19kaXNrX3VuYmxvY2tfZXZlbnRzKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBib29sIGNoZWNrX25vdykKQEAgLTE0NjEsMjcgKzE0NzYsNiBAQAogfQogCiAvKioKLSAqIGRpc2tfYmxvY2tfZXZlbnRzIC0gYmxvY2sgYW5kIGZsdXNoIGRpc2sgZXZlbnQgY2hlY2tpbmcKLSAqIEBkaXNrOiBkaXNrIHRvIGJsb2NrIGV2ZW50cyBmb3IKLSAqCi0gKiBPbiByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQgZXZlbnQgY2hlY2tpbmcKLSAqIGlzbid0IGluIHByb2dyZXNzIGFuZCB3b24ndCBoYXBwZW4gdW50aWwgdW5ibG9ja2VkIGJ5Ci0gKiBkaXNrX3VuYmxvY2tfZXZlbnRzKCkuICBFdmVudHMgYmxvY2tpbmcgaXMgY291bnRlZCBhbmQgdGhlIGFjdHVhbAotICogdW5ibG9ja2luZyBoYXBwZW5zIGFmdGVyIHRoZSBtYXRjaGluZyBudW1iZXIgb2YgdW5ibG9ja3MgYXJlIGRvbmUuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgaW50ZW50aW9uYWxseSBkb2VzIG5vdCBibG9jayBldmVudCBjaGVja2luZyBmcm9tCi0gKiBkaXNrX2NsZWFyX2V2ZW50cygpLgotICoKLSAqIENPTlRFWFQ6Ci0gKiBNaWdodCBzbGVlcC4KLSAqLwotdm9pZCBkaXNrX2Jsb2NrX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKLXsKLQlpZiAoZGlzay0+ZXYpCi0JCV9fZGlza19ibG9ja19ldmVudHMoZGlzaywgdHJ1ZSk7Ci19Ci0KLS8qKgogICogZGlza191bmJsb2NrX2V2ZW50cyAtIHVuYmxvY2sgZGlzayBldmVudCBjaGVja2luZwogICogQGRpc2s6IGRpc2sgdG8gdW5ibG9jayBldmVudHMgZm9yCiAgKgpAQCAtMTQ5OCwyMiArMTQ5MiwzMiBAQAogfQogCiAvKioKLSAqIGRpc2tfY2hlY2tfZXZlbnRzIC0gc2NoZWR1bGUgaW1tZWRpYXRlIGV2ZW50IGNoZWNraW5nCi0gKiBAZGlzazogZGlzayB0byBjaGVjayBldmVudHMgZm9yCisgKiBkaXNrX2ZsdXNoX2V2ZW50cyAtIHNjaGVkdWxlIGltbWVkaWF0ZSBldmVudCBjaGVja2luZyBhbmQgZmx1c2hpbmcKKyAqIEBkaXNrOiBkaXNrIHRvIGNoZWNrIGFuZCBmbHVzaCBldmVudHMgZm9yCisgKiBAbWFzazogZXZlbnRzIHRvIGZsdXNoCiAgKgotICogU2NoZWR1bGUgaW1tZWRpYXRlIGV2ZW50IGNoZWNraW5nIG9uIEBkaXNrIGlmIG5vdCBibG9ja2VkLgorICogU2NoZWR1bGUgaW1tZWRpYXRlIGV2ZW50IGNoZWNraW5nIG9uIEBkaXNrIGlmIG5vdCBibG9ja2VkLiAgRXZlbnRzIGluCisgKiBAbWFzayBhcmUgc2NoZWR1bGVkIHRvIGJlIGNsZWFyZWQgZnJvbSB0aGUgZHJpdmVyLiAgTm90ZSB0aGF0IHRoaXMKKyAqIGRvZXNuJ3QgY2xlYXIgdGhlIGV2ZW50cyBmcm9tIEBkaXNrLT5ldi4KICAqCiAgKiBDT05URVhUOgotICogRG9uJ3QgY2FyZS4gIFNhZmUgdG8gY2FsbCBmcm9tIGlycSBjb250ZXh0LgorICogSWYgQG1hc2sgaXMgbm9uLXplcm8gbXVzdCBiZSBjYWxsZWQgd2l0aCBiZGV2LT5iZF9tdXRleCBoZWxkLgogICovCi12b2lkIGRpc2tfY2hlY2tfZXZlbnRzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQordm9pZCBkaXNrX2ZsdXNoX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgdW5zaWduZWQgaW50IG1hc2spCiB7Ci0JaWYgKGRpc2stPmV2KSB7Ci0JCV9fZGlza19ibG9ja19ldmVudHMoZGlzaywgZmFsc2UpOwotCQlfX2Rpc2tfdW5ibG9ja19ldmVudHMoZGlzaywgdHJ1ZSk7CisJc3RydWN0IGRpc2tfZXZlbnRzICpldiA9IGRpc2stPmV2OworCisJaWYgKCFldikKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycSgmZXYtPmxvY2spOworCWV2LT5jbGVhcmluZyB8PSBtYXNrOworCWlmICghZXYtPmJsb2NrKSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmV2LT5kd29yayk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fbnJ0X3dxLCAmZXYtPmR3b3JrLCAwKTsKIAl9CisJc3Bpbl91bmxvY2tfaXJxKCZldi0+bG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChkaXNrX2NoZWNrX2V2ZW50cyk7CiAKIC8qKgogICogZGlza19jbGVhcl9ldmVudHMgLSBzeW5jaHJvbm91c2x5IGNoZWNrLCBjbGVhciBhbmQgcmV0dXJuIHBlbmRpbmcgZXZlbnRzCkBAIC0xNTQ2LDcgKzE1NTAsNyBAQAogCXNwaW5fdW5sb2NrX2lycSgmZXYtPmxvY2spOwogCiAJLyogdW5jb25kdGlvbmFsbHkgc2NoZWR1bGUgZXZlbnQgY2hlY2sgYW5kIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCAqLwotCV9fZGlza19ibG9ja19ldmVudHMoZGlzaywgdHJ1ZSk7CisJZGlza19ibG9ja19ldmVudHMoZGlzayk7CiAJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9ucnRfd3EsICZldi0+ZHdvcmssIDApOwogCWZsdXNoX2RlbGF5ZWRfd29yaygmZXYtPmR3b3JrKTsKIAlfX2Rpc2tfdW5ibG9ja19ldmVudHMoZGlzaywgZmFsc2UpOwpAQCAtMTY2NCw3ICsxNjY4LDcgQEAKIAlpZiAoaW50diA8IDAgJiYgaW50diAhPSAtMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlfX2Rpc2tfYmxvY2tfZXZlbnRzKGRpc2ssIHRydWUpOworCWRpc2tfYmxvY2tfZXZlbnRzKGRpc2spOwogCWRpc2stPmV2LT5wb2xsX21zZWNzID0gaW50djsKIAlfX2Rpc2tfdW5ibG9ja19ldmVudHMoZGlzaywgdHJ1ZSk7CiAKQEAgLTE3MDMsNyArMTcwNyw3IEBACiAJbXV0ZXhfbG9jaygmZGlza19ldmVudHNfbXV0ZXgpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShldiwgJmRpc2tfZXZlbnRzLCBub2RlKQotCQlkaXNrX2NoZWNrX2V2ZW50cyhldi0+ZGlzayk7CisJCWRpc2tfZmx1c2hfZXZlbnRzKGV2LT5kaXNrLCAwKTsKIAogCW11dGV4X3VubG9jaygmZGlza19ldmVudHNfbXV0ZXgpOwogCkBAIC0xNzUwLDYgKzE3NTQsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZldi0+bm9kZSk7CiAJZXYtPmRpc2sgPSBkaXNrOwogCXNwaW5fbG9ja19pbml0KCZldi0+bG9jayk7CisJbXV0ZXhfaW5pdCgmZXYtPmJsb2NrX211dGV4KTsKIAlldi0+YmxvY2sgPSAxOwogCWV2LT5wb2xsX21zZWNzID0gLTE7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmV2LT5kd29yaywgZGlza19ldmVudHNfd29ya2ZuKTsKQEAgLTE3NzAsNyArMTc3NSw3IEBACiAJaWYgKCFkaXNrLT5ldikKIAkJcmV0dXJuOwogCi0JX19kaXNrX2Jsb2NrX2V2ZW50cyhkaXNrLCB0cnVlKTsKKwlkaXNrX2Jsb2NrX2V2ZW50cyhkaXNrKTsKIAogCW11dGV4X2xvY2soJmRpc2tfZXZlbnRzX211dGV4KTsKIAlsaXN0X2RlbF9pbml0KCZkaXNrLT5ldi0+bm9kZSk7CmRpZmYgLS1naXQgYS9jcnlwdG8vS2NvbmZpZyBiL2NyeXB0by9LY29uZmlnCmluZGV4IDg3YjIyY2EuLmFlMjdiNzUzIDEwMDY0NAotLS0gYS9jcnlwdG8vS2NvbmZpZworKysgYi9jcnlwdG8vS2NvbmZpZwpAQCAtMzU0LDcgKzM1NCw3IEBACiAJICBSSVBFTUQtMTI4IChJU08vSUVDIDEwMTE4LTM6MjAwNCkuCiAKIAkgIFJJUEVNRC0xMjggaXMgYSAxMjgtYml0IGNyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbi4gSXQgc2hvdWxkIG9ubHkKLQkgIHRvIGJlIHVzZWQgYXMgYSBzZWN1cmUgcmVwbGFjZW1lbnQgZm9yIFJJUEVNRC4gRm9yIG90aGVyIHVzZSBjYXNlcworCSAgYmUgdXNlZCBhcyBhIHNlY3VyZSByZXBsYWNlbWVudCBmb3IgUklQRU1ELiBGb3Igb3RoZXIgdXNlIGNhc2VzLAogCSAgUklQRU1ELTE2MCBzaG91bGQgYmUgdXNlZC4KIAogCSAgRGV2ZWxvcGVkIGJ5IEhhbnMgRG9iYmVydGluLCBBbnRvb24gQm9zc2VsYWVycyBhbmQgQmFydCBQcmVuZWVsLgpAQCAtNDU4LDcgKzQ1OCw3IEBACiAKIGNvbmZpZyBDUllQVE9fR0hBU0hfQ0xNVUxfTklfSU5URUwKIAl0cmlzdGF0ZSAiR0hBU0ggZGlnZXN0IGFsZ29yaXRobSAoQ0xNVUwtTkkgYWNjZWxlcmF0ZWQpIgotCWRlcGVuZHMgb24gKFg4NiB8fCBVTUxfWDg2KSAmJiA2NEJJVAorCWRlcGVuZHMgb24gWDg2ICYmIDY0QklUCiAJc2VsZWN0IENSWVBUT19TSEFTSAogCXNlbGVjdCBDUllQVE9fQ1JZUFRECiAJaGVscApAQCAtNTMzLDcgKzUzMyw3IEBACiAKIGNvbmZpZyBDUllQVE9fQUVTX05JX0lOVEVMCiAJdHJpc3RhdGUgIkFFUyBjaXBoZXIgYWxnb3JpdGhtcyAoQUVTLU5JKSIKLQlkZXBlbmRzIG9uIChYODYgfHwgVU1MX1g4NikKKwlkZXBlbmRzIG9uIFg4NgogCXNlbGVjdCBDUllQVE9fQUVTX1g4Nl82NCBpZiA2NEJJVAogCXNlbGVjdCBDUllQVE9fQUVTXzU4NiBpZiAhNjRCSVQKIAlzZWxlY3QgQ1JZUFRPX0NSWVBURApkaWZmIC0tZ2l0IGEvY3J5cHRvL2FsZ2lmX2hhc2guYyBiL2NyeXB0by9hbGdpZl9oYXNoLmMKaW5kZXggNjIxMjJhMS4uZWY1MzU2YyAxMDA2NDQKLS0tIGEvY3J5cHRvL2FsZ2lmX2hhc2guYworKysgYi9jcnlwdG8vYWxnaWZfaGFzaC5jCkBAIC02OCw4ICs2OCwxMCBAQAogCQkJaW50IG5ld2xlbjsKIAogCQkJbmV3bGVuID0gYWZfYWxnX21ha2Vfc2coJmN0eC0+c2dsLCBmcm9tLCBsZW4sIDApOwotCQkJaWYgKG5ld2xlbiA8IDApCisJCQlpZiAobmV3bGVuIDwgMCkgeworCQkJCWVyciA9IGNvcGllZCA/IDAgOiBuZXdsZW47CiAJCQkJZ290byB1bmxvY2s7CisJCQl9CiAKIAkJCWFoYXNoX3JlcXVlc3Rfc2V0X2NyeXB0KCZjdHgtPnJlcSwgY3R4LT5zZ2wuc2csIE5VTEwsCiAJCQkJCQluZXdsZW4pOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FyYzQuYyBiL2NyeXB0by9hcmM0LmMKaW5kZXggOGJlNDdlMS4uMGQxMmE5NiAxMDA2NDQKLS0tIGEvY3J5cHRvL2FyYzQuYworKysgYi9jcnlwdG8vYXJjNC5jCkBAIC0xLDQgKzEsNCBAQAotLyogCisvKgogICogQ3J5cHRvZ3JhcGhpYyBBUEkKICAqCiAgKiBBUkM0IENpcGhlciBBbGdvcml0aG0KQEAgLTMzLDE2ICszMywxNSBAQAogCWN0eC0+eCA9IDE7CiAJY3R4LT55ID0gMDsKIAotCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKIAkJY3R4LT5TW2ldID0gaTsKIAotCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKIAkJdTggYSA9IGN0eC0+U1tpXTsKIAkJaiA9IChqICsgaW5fa2V5W2tdICsgYSkgJiAweGZmOwogCQljdHgtPlNbaV0gPSBjdHgtPlNbal07CiAJCWN0eC0+U1tqXSA9IGE7Ci0JCWlmKCsrayA+PSBrZXlfbGVuKQorCQlpZiAoKytrID49IGtleV9sZW4pCiAJCQlrID0gMDsKIAl9CiAKQEAgLTgwLDkgKzc5LDkgQEAKIAkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKIAkuY2lhX21pbl9rZXlzaXplCT0JQVJDNF9NSU5fS0VZX1NJWkUsCiAJLmNpYV9tYXhfa2V5c2l6ZQk9CUFSQzRfTUFYX0tFWV9TSVpFLAotCS5jaWFfc2V0a2V5CSAgIAk9IAlhcmM0X3NldF9rZXksCi0JLmNpYV9lbmNyeXB0CSAJPQlhcmM0X2NyeXB0LAotCS5jaWFfZGVjcnlwdAkgIAk9CWFyYzRfY3J5cHQgfSB9CisJLmNpYV9zZXRrZXkJCT0JYXJjNF9zZXRfa2V5LAorCS5jaWFfZW5jcnlwdAkJPQlhcmM0X2NyeXB0LAorCS5jaWFfZGVjcnlwdAkJPQlhcmM0X2NyeXB0IH0gfQogfTsKIAogc3RhdGljIGludCBfX2luaXQgYXJjNF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9jcnlwdG8vYXN5bmNfdHgvcmFpZDZ0ZXN0LmMgYi9jcnlwdG8vYXN5bmNfdHgvcmFpZDZ0ZXN0LmMKaW5kZXggYzEzMjE5My4uYzg4ZmY5ZSAxMDA2NDQKLS0tIGEvY3J5cHRvL2FzeW5jX3R4L3JhaWQ2dGVzdC5jCisrKyBiL2NyeXB0by9hc3luY190eC9yYWlkNnRlc3QuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvYXN5bmNfdHguaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogCiAjdW5kZWYgcHIKZGlmZiAtLWdpdCBhL2NyeXB0by9jcmMzMmMuYyBiL2NyeXB0by9jcmMzMmMuYwppbmRleCBkZTllNTVjLi4zZjlhZDI4IDEwMDY0NAotLS0gYS9jcnlwdG8vY3JjMzJjLmMKKysrIGIvY3J5cHRvL2NyYzMyYy5jCkBAIC0yMjQsMTEgKzIyNCwxMSBAQAogc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgYWxnID0gewogCS5kaWdlc3RzaXplCQk9CUNIS1NVTV9ESUdFU1RfU0laRSwKIAkuc2V0a2V5CQkJPQljaGtzdW1fc2V0a2V5LAotCS5pbml0ICAgCQk9IAljaGtzdW1faW5pdCwKLQkudXBkYXRlIAkJPQljaGtzdW1fdXBkYXRlLAotCS5maW5hbCAgCQk9CWNoa3N1bV9maW5hbCwKLQkuZmludXAgIAkJPQljaGtzdW1fZmludXAsCi0JLmRpZ2VzdCAgCQk9CWNoa3N1bV9kaWdlc3QsCisJLmluaXQJCT0JY2hrc3VtX2luaXQsCisJLnVwZGF0ZQkJPQljaGtzdW1fdXBkYXRlLAorCS5maW5hbAkJPQljaGtzdW1fZmluYWwsCisJLmZpbnVwCQk9CWNoa3N1bV9maW51cCwKKwkuZGlnZXN0CQk9CWNoa3N1bV9kaWdlc3QsCiAJLmRlc2NzaXplCQk9CXNpemVvZihzdHJ1Y3QgY2hrc3VtX2Rlc2NfY3R4KSwKIAkuYmFzZQkJCT0JewogCQkuY3JhX25hbWUJCT0JImNyYzMyYyIsCmRpZmYgLS1naXQgYS9jcnlwdG8vZGVmbGF0ZS5jIGIvY3J5cHRvL2RlZmxhdGUuYwppbmRleCBiNWNjYWUyLi5iMDE2NWVjIDEwMDY0NAotLS0gYS9jcnlwdG8vZGVmbGF0ZS5jCisrKyBiL2NyeXB0by9kZWZsYXRlLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2RlZmluZSBERUZMQVRFX0RFRl9MRVZFTAkJWl9ERUZBVUxUX0NPTVBSRVNTSU9OCiAjZGVmaW5lIERFRkxBVEVfREVGX1dJTkJJVFMJCTExCkBAIC03Myw3ICs3Miw3IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHpfc3RyZWFtX3MgKnN0cmVhbSA9ICZjdHgtPmRlY29tcF9zdHJlYW07CiAKLQlzdHJlYW0tPndvcmtzcGFjZSA9IGt6YWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSwgR0ZQX0tFUk5FTCk7CisJc3RyZWFtLT53b3Jrc3BhY2UgPSB2emFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpOwogCWlmICghc3RyZWFtLT53b3Jrc3BhY2UpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC04Niw3ICs4NSw3IEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIG91dF9mcmVlOgotCWtmcmVlKHN0cmVhbS0+d29ya3NwYWNlKTsKKwl2ZnJlZShzdHJlYW0tPndvcmtzcGFjZSk7CiAJZ290byBvdXQ7CiB9CiAKQEAgLTk5LDcgKzk4LDcgQEAKIHN0YXRpYyB2b2lkIGRlZmxhdGVfZGVjb21wX2V4aXQoc3RydWN0IGRlZmxhdGVfY3R4ICpjdHgpCiB7CiAJemxpYl9pbmZsYXRlRW5kKCZjdHgtPmRlY29tcF9zdHJlYW0pOwotCWtmcmVlKGN0eC0+ZGVjb21wX3N0cmVhbS53b3Jrc3BhY2UpOworCXZmcmVlKGN0eC0+ZGVjb21wX3N0cmVhbS53b3Jrc3BhY2UpOwogfQogCiBzdGF0aWMgaW50IGRlZmxhdGVfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2dmMTI4bXVsLmMgYi9jcnlwdG8vZ2YxMjhtdWwuYwppbmRleCBkZjM1ZTRjLi41Mjc2NjA3IDEwMDY0NAotLS0gYS9jcnlwdG8vZ2YxMjhtdWwuYworKysgYi9jcnlwdG8vZ2YxMjhtdWwuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKIAkJZ2YxMjhtdWxfeF9sbGUoJnBbaSArIDFdLCAmcFtpXSk7CiAKLQltZW1zZXQociwgMCwgc2l6ZW9mKHIpKTsKKwltZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7CiAJZm9yIChpID0gMDs7KSB7CiAJCXU4IGNoID0gKCh1OCAqKWIpWzE1IC0gaV07CiAKQEAgLTIyMCw3ICsyMjAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCA3OyArK2kpCiAJCWdmMTI4bXVsX3hfYmJlKCZwW2kgKyAxXSwgJnBbaV0pOwogCi0JbWVtc2V0KHIsIDAsIHNpemVvZihyKSk7CisJbWVtc2V0KHIsIDAsIHNpemVvZigqcikpOwogCWZvciAoaSA9IDA7OykgewogCQl1OCBjaCA9ICgodTggKiliKVtpXTsKIApkaWZmIC0tZ2l0IGEvY3J5cHRvL3NoYTFfZ2VuZXJpYy5jIGIvY3J5cHRvL3NoYTFfZ2VuZXJpYy5jCmluZGV4IDA0MTYwOTEuLjAwYWU2MGUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zaGExX2dlbmVyaWMuYworKysgYi9jcnlwdG8vc2hhMV9nZW5lcmljLmMKQEAgLTQzLDI1ICs0MywyNiBAQAogCXVuc2lnbmVkIGludCBwYXJ0aWFsLCBkb25lOwogCWNvbnN0IHU4ICpzcmM7CiAKLQlwYXJ0aWFsID0gc2N0eC0+Y291bnQgJiAweDNmOworCXBhcnRpYWwgPSBzY3R4LT5jb3VudCAlIFNIQTFfQkxPQ0tfU0laRTsKIAlzY3R4LT5jb3VudCArPSBsZW47CiAJZG9uZSA9IDA7CiAJc3JjID0gZGF0YTsKIAotCWlmICgocGFydGlhbCArIGxlbikgPiA2MykgeworCWlmICgocGFydGlhbCArIGxlbikgPj0gU0hBMV9CTE9DS19TSVpFKSB7CiAJCXUzMiB0ZW1wW1NIQV9XT1JLU1BBQ0VfV09SRFNdOwogCiAJCWlmIChwYXJ0aWFsKSB7CiAJCQlkb25lID0gLXBhcnRpYWw7Ci0JCQltZW1jcHkoc2N0eC0+YnVmZmVyICsgcGFydGlhbCwgZGF0YSwgZG9uZSArIDY0KTsKKwkJCW1lbWNweShzY3R4LT5idWZmZXIgKyBwYXJ0aWFsLCBkYXRhLAorCQkJICAgICAgIGRvbmUgKyBTSEExX0JMT0NLX1NJWkUpOwogCQkJc3JjID0gc2N0eC0+YnVmZmVyOwogCQl9CiAKIAkJZG8gewogCQkJc2hhX3RyYW5zZm9ybShzY3R4LT5zdGF0ZSwgc3JjLCB0ZW1wKTsKLQkJCWRvbmUgKz0gNjQ7CisJCQlkb25lICs9IFNIQTFfQkxPQ0tfU0laRTsKIAkJCXNyYyA9IGRhdGEgKyBkb25lOwotCQl9IHdoaWxlIChkb25lICsgNjMgPCBsZW4pOworCQl9IHdoaWxlIChkb25lICsgU0hBMV9CTE9DS19TSVpFIDw9IGxlbik7CiAKIAkJbWVtc2V0KHRlbXAsIDAsIHNpemVvZih0ZW1wKSk7CiAJCXBhcnRpYWwgPSAwOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Rlc3RtZ3IuaCBiL2NyeXB0by90ZXN0bWdyLmgKaW5kZXggMjdlNjA2MS4uMjdhZGM5MiAxMDA2NDQKLS0tIGEvY3J5cHRvL3Rlc3RtZ3IuaAorKysgYi9jcnlwdG8vdGVzdG1nci5oCkBAIC0yOTc2LDggKzI5NzYsOCBAQAogI2RlZmluZSBBRVNfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMgNAogI2RlZmluZSBBRVNfTFJXX0VOQ19URVNUX1ZFQ1RPUlMgOAogI2RlZmluZSBBRVNfTFJXX0RFQ19URVNUX1ZFQ1RPUlMgOAotI2RlZmluZSBBRVNfWFRTX0VOQ19URVNUX1ZFQ1RPUlMgNAotI2RlZmluZSBBRVNfWFRTX0RFQ19URVNUX1ZFQ1RPUlMgNAorI2RlZmluZSBBRVNfWFRTX0VOQ19URVNUX1ZFQ1RPUlMgNQorI2RlZmluZSBBRVNfWFRTX0RFQ19URVNUX1ZFQ1RPUlMgNQogI2RlZmluZSBBRVNfQ1RSX0VOQ19URVNUX1ZFQ1RPUlMgMwogI2RlZmluZSBBRVNfQ1RSX0RFQ19URVNUX1ZFQ1RPUlMgMwogI2RlZmluZSBBRVNfT0ZCX0VOQ19URVNUX1ZFQ1RPUlMgMQpAQCAtMzkyNiw2ICszOTI2LDE1MCBAQAogCQkJICAiXHgwYVx4MjhceDJkXHhmOVx4MjBceDE0XHg3Ylx4ZWEiCiAJCQkgICJceGJlXHg0Mlx4MWVceGU1XHgzMVx4OWRceDA1XHg2OCIsCiAJCS5ybGVuICAgPSA1MTIsCisJfSwgeyAvKiBYVFMtQUVTIDEwLCBYVFMtQUVTLTI1NiwgZGF0YSB1bml0IDUxMiBieXRlcyAqLworCQkua2V5CT0gIlx4MjdceDE4XHgyOFx4MThceDI4XHg0NVx4OTBceDQ1IgorCQkJICAiXHgyM1x4NTNceDYwXHgyOFx4NzRceDcxXHgzNVx4MjYiCisJCQkgICJceDYyXHg0OVx4NzdceDU3XHgyNFx4NzBceDkzXHg2OSIKKwkJCSAgIlx4OTlceDU5XHg1N1x4NDlceDY2XHg5Nlx4NzZceDI3IgorCQkJICAiXHgzMVx4NDFceDU5XHgyNlx4NTNceDU4XHg5N1x4OTMiCisJCQkgICJceDIzXHg4NFx4NjJceDY0XHgzM1x4ODNceDI3XHg5NSIKKwkJCSAgIlx4MDJceDg4XHg0MVx4OTdceDE2XHg5M1x4OTlceDM3IgorCQkJICAiXHg1MVx4MDVceDgyXHgwOVx4NzRceDk0XHg0NVx4OTIiLAorCQkua2xlbgk9IDY0LAorCQkuaXYJPSAiXHhmZlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKKwkJCSAgIlx4MjBceDIxXHgyMlx4MjNceDI0XHgyNVx4MjZceDI3IgorCQkJICAiXHgyOFx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmYiCisJCQkgICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKKwkJCSAgIlx4MzhceDM5XHgzYVx4M2JceDNjXHgzZFx4M2VceDNmIgorCQkJICAiXHg0MFx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDciCisJCQkgICJceDQ4XHg0OVx4NGFceDRiXHg0Y1x4NGRceDRlXHg0ZiIKKwkJCSAgIlx4NTBceDUxXHg1Mlx4NTNceDU0XHg1NVx4NTZceDU3IgorCQkJICAiXHg1OFx4NTlceDVhXHg1Ylx4NWNceDVkXHg1ZVx4NWYiCisJCQkgICJceDYwXHg2MVx4NjJceDYzXHg2NFx4NjVceDY2XHg2NyIKKwkJCSAgIlx4NjhceDY5XHg2YVx4NmJceDZjXHg2ZFx4NmVceDZmIgorCQkJICAiXHg3MFx4NzFceDcyXHg3M1x4NzRceDc1XHg3Nlx4NzciCisJCQkgICJceDc4XHg3OVx4N2FceDdiXHg3Y1x4N2RceDdlXHg3ZiIKKwkJCSAgIlx4ODBceDgxXHg4Mlx4ODNceDg0XHg4NVx4ODZceDg3IgorCQkJICAiXHg4OFx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGYiCisJCQkgICJceDkwXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5NyIKKwkJCSAgIlx4OThceDk5XHg5YVx4OWJceDljXHg5ZFx4OWVceDlmIgorCQkJICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTciCisJCQkgICJceGE4XHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZiIKKwkJCSAgIlx4YjBceGIxXHhiMlx4YjNceGI0XHhiNVx4YjZceGI3IgorCQkJICAiXHhiOFx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmYiCisJCQkgICJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjNyIKKwkJCSAgIlx4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmIgorCQkJICAiXHhkMFx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZDciCisJCQkgICJceGQ4XHhkOVx4ZGFceGRiXHhkY1x4ZGRceGRlXHhkZiIKKwkJCSAgIlx4ZTBceGUxXHhlMlx4ZTNceGU0XHhlNVx4ZTZceGU3IgorCQkJICAiXHhlOFx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWYiCisJCQkgICJceGYwXHhmMVx4ZjJceGYzXHhmNFx4ZjVceGY2XHhmNyIKKwkJCSAgIlx4ZjhceGY5XHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmIgorCQkJICAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgorCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCisJCQkgICJceDIwXHgyMVx4MjJceDIzXHgyNFx4MjVceDI2XHgyNyIKKwkJCSAgIlx4MjhceDI5XHgyYVx4MmJceDJjXHgyZFx4MmVceDJmIgorCQkJICAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCisJCQkgICJceDM4XHgzOVx4M2FceDNiXHgzY1x4M2RceDNlXHgzZiIKKwkJCSAgIlx4NDBceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDZceDQ3IgorCQkJICAiXHg0OFx4NDlceDRhXHg0Ylx4NGNceDRkXHg0ZVx4NGYiCisJCQkgICJceDUwXHg1MVx4NTJceDUzXHg1NFx4NTVceDU2XHg1NyIKKwkJCSAgIlx4NThceDU5XHg1YVx4NWJceDVjXHg1ZFx4NWVceDVmIgorCQkJICAiXHg2MFx4NjFceDYyXHg2M1x4NjRceDY1XHg2Nlx4NjciCisJCQkgICJceDY4XHg2OVx4NmFceDZiXHg2Y1x4NmRceDZlXHg2ZiIKKwkJCSAgIlx4NzBceDcxXHg3Mlx4NzNceDc0XHg3NVx4NzZceDc3IgorCQkJICAiXHg3OFx4NzlceDdhXHg3Ylx4N2NceDdkXHg3ZVx4N2YiCisJCQkgICJceDgwXHg4MVx4ODJceDgzXHg4NFx4ODVceDg2XHg4NyIKKwkJCSAgIlx4ODhceDg5XHg4YVx4OGJceDhjXHg4ZFx4OGVceDhmIgorCQkJICAiXHg5MFx4OTFceDkyXHg5M1x4OTRceDk1XHg5Nlx4OTciCisJCQkgICJceDk4XHg5OVx4OWFceDliXHg5Y1x4OWRceDllXHg5ZiIKKwkJCSAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4YTZceGE3IgorCQkJICAiXHhhOFx4YTlceGFhXHhhYlx4YWNceGFkXHhhZVx4YWYiCisJCQkgICJceGIwXHhiMVx4YjJceGIzXHhiNFx4YjVceGI2XHhiNyIKKwkJCSAgIlx4YjhceGI5XHhiYVx4YmJceGJjXHhiZFx4YmVceGJmIgorCQkJICAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCisJCQkgICJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIKKwkJCSAgIlx4ZDBceGQxXHhkMlx4ZDNceGQ0XHhkNVx4ZDZceGQ3IgorCQkJICAiXHhkOFx4ZDlceGRhXHhkYlx4ZGNceGRkXHhkZVx4ZGYiCisJCQkgICJceGUwXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlNyIKKwkJCSAgIlx4ZThceGU5XHhlYVx4ZWJceGVjXHhlZFx4ZWVceGVmIgorCQkJICAiXHhmMFx4ZjFceGYyXHhmM1x4ZjRceGY1XHhmNlx4ZjciCisJCQkgICJceGY4XHhmOVx4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZiIsCisJCS5pbGVuCT0gNTEyLAorCQkucmVzdWx0CT0gIlx4MWNceDNiXHgzYVx4MTBceDJmXHg3N1x4MDNceDg2IgorCQkJICAiXHhlNFx4ODNceDZjXHg5OVx4ZTNceDcwXHhjZlx4OWIiCisJCQkgICJceGVhXHgwMFx4ODBceDNmXHg1ZVx4NDhceDIzXHg1NyIKKwkJCSAgIlx4YTRceGFlXHgxMlx4ZDRceDE0XHhhM1x4ZTZceDNiIgorCQkJICAiXHg1ZFx4MzFceGUyXHg3Nlx4ZjhceGZlXHg0YVx4OGQiCisJCQkgICJceDY2XHhiM1x4MTdceGY5XHhhY1x4NjhceDNmXHg0NCIKKwkJCSAgIlx4NjhceDBhXHg4Nlx4YWNceDM1XHhhZFx4ZmNceDMzIgorCQkJICAiXHg0NVx4YmVceGZlXHhjYlx4NGJceGIxXHg4OFx4ZmQiCisJCQkgICJceDU3XHg3Nlx4OTJceDZjXHg0OVx4YTNceDA5XHg1ZSIKKwkJCSAgIlx4YjFceDA4XHhmZFx4MTBceDk4XHhiYVx4ZWNceDcwIgorCQkJICAiXHhhYVx4YTZceDY5XHg5OVx4YTdceDJhXHg4Mlx4ZjIiCisJCQkgICJceDdkXHg4NFx4OGJceDIxXHhkNFx4YTdceDQxXHhiMCIKKwkJCSAgIlx4YzVceGNkXHg0ZFx4NWZceGZmXHg5ZFx4YWNceDg5IgorCQkJICAiXHhhZVx4YmFceDEyXHgyOVx4NjFceGQwXHgzYVx4NzUiCisJCQkgICJceDcxXHgyM1x4ZTlceDg3XHgwZlx4OGFceGNmXHgxMCIKKwkJCSAgIlx4MDBceDAyXHgwOFx4ODdceDg5XHgxNFx4MjlceGNhIgorCQkJICAiXHgyYVx4M2VceDdhXHg3ZFx4N2RceGY3XHhiMVx4MDMiCisJCQkgICJceDU1XHgxNlx4NWNceDhiXHg5YVx4NmRceDBhXHg3ZCIKKwkJCSAgIlx4ZThceGIwXHg2Mlx4YzRceDUwXHgwZFx4YzRceGNkIgorCQkJICAiXHgxMlx4MGNceDBmXHg3NFx4MThceGRhXHhlM1x4ZDAiCisJCQkgICJceGI1XHg3OFx4MWNceDM0XHg4MFx4M2ZceGE3XHg1NCIKKwkJCSAgIlx4MjFceGM3XHg5MFx4ZGZceGUxXHhkZVx4MThceDM0IgorCQkJICAiXHhmMlx4ODBceGQ3XHg2Nlx4N2JceDMyXHg3Zlx4NmMiCisJCQkgICJceDhjXHhkN1x4NTVceDdlXHgxMlx4YWNceDNhXHgwZiIKKwkJCSAgIlx4OTNceGVjXHgwNVx4YzVceDJlXHgwNFx4OTNceGVmIgorCQkJICAiXHgzMVx4YTFceDJkXHgzZFx4OTJceDYwXHhmN1x4OWEiCisJCQkgICJceDI4XHg5ZFx4NmFceDM3XHg5Ylx4YzdceDBjXHg1MCIKKwkJCSAgIlx4ODRceDE0XHg3M1x4ZDFceGE4XHhjY1x4ODFceGVjIgorCQkJICAiXHg1OFx4M2VceDk2XHg0NVx4ZTBceDdiXHg4ZFx4OTYiCisJCQkgICJceDcwXHg2NVx4NWJceGE1XHhiYlx4Y2ZceGVjXHhjNiIKKwkJCSAgIlx4ZGNceDM5XHg2Nlx4MzhceDBhXHhkOFx4ZmVceGNiIgorCQkJICAiXHgxN1x4YjZceGJhXHgwMlx4NDZceDlhXHgwMlx4MGEiCisJCQkgICJceDg0XHhlMVx4OGVceDhmXHg4NFx4MjVceDIwXHg3MCIKKwkJCSAgIlx4YzFceDNlXHg5Zlx4MWZceDI4XHg5Ylx4ZTVceDRmIgorCQkJICAiXHhiY1x4NDhceDE0XHg1N1x4NzdceDhmXHg2MVx4NjAiCisJCQkgICJceDE1XHhlMVx4MzJceDdhXHgwMlx4YjFceDQwXHhmMSIKKwkJCSAgIlx4NTBceDVlXHhiM1x4MDlceDMyXHg2ZFx4NjhceDM3IgorCQkJICAiXHg4Zlx4ODNceDc0XHg1OVx4NWNceDg0XHg5ZFx4ODQiCisJCQkgICJceGY0XHhjM1x4MzNceGVjXHg0NFx4MjNceDg4XHg1MSIKKwkJCSAgIlx4NDNceGNiXHg0N1x4YmRceDcxXHhjNVx4ZWRceGFlIgorCQkJICAiXHg5Ylx4ZTZceDlhXHgyZlx4ZmVceGNlXHhiMVx4YmUiCisJCQkgICJceGM5XHhkZVx4MjRceDRmXHhiZVx4MTVceDk5XHgyYiIKKwkJCSAgIlx4MTFceGI3XHg3Y1x4MDRceDBmXHgxMlx4YmRceDhmIgorCQkJICAiXHg2YVx4OTdceDVhXHg0NFx4YTBceGY5XHgwY1x4MjkiCisJCQkgICJceGE5XHhhYlx4YzNceGQ0XHhkOFx4OTNceDkyXHg3MiIKKwkJCSAgIlx4ODRceGM1XHg4N1x4NTRceGNjXHhlMlx4OTRceDUyIgorCQkJICAiXHg5Zlx4ODZceDE0XHhkY1x4ZDJceGFiXHhhOVx4OTEiCisJCQkgICJceDkyXHg1Zlx4ZWRceGM0XHhhZVx4NzRceGZmXHhhYyIKKwkJCSAgIlx4NmVceDMzXHgzYlx4OTNceGViXHg0YVx4ZmZceDA0IgorCQkJICAiXHg3OVx4ZGFceDlhXHg0MVx4MGVceDQ0XHg1MFx4ZTAiCisJCQkgICJceGRkXHg3YVx4ZTRceGM2XHhlMlx4OTFceDA5XHgwMCIKKwkJCSAgIlx4NTdceDVkXHhhNFx4MDFceGZjXHgwN1x4MDVceDlmIgorCQkJICAiXHg2NFx4NWVceDhiXHg3ZVx4OWJceGZkXHhlZlx4MzMiCisJCQkgICJceDk0XHgzMFx4NTRceGZmXHg4NFx4MDFceDE0XHg5MyIKKwkJCSAgIlx4YzJceDdiXHgzNFx4MjlceGVhXHhlZFx4YjRceGVkIgorCQkJICAiXHg1M1x4NzZceDQ0XHgxYVx4NzdceGVkXHg0M1x4ODUiCisJCQkgICJceDFhXHhkN1x4N2ZceDE2XHhmNVx4NDFceGRmXHhkMiIKKwkJCSAgIlx4NjlceGQ1XHgwZFx4NmFceDVmXHgxNFx4ZmJceDBhIgorCQkJICAiXHhhYlx4MWNceGJiXHg0Y1x4MTVceDUwXHhiZVx4OTciCisJCQkgICJceGY3XHhhYlx4NDBceDY2XHgxOVx4M2NceDRjXHhhYSIKKwkJCSAgIlx4NzdceDNkXHhhZFx4MzhceDAxXHg0Ylx4ZDJceDA5IgorCQkJICAiXHgyZlx4YTdceDU1XHhjOFx4MjRceGJiXHg1ZVx4NTQiCisJCQkgICJceGM0XHhmM1x4NmZceGZkXHhhOVx4ZmNceGVhXHg3MCIKKwkJCSAgIlx4YjlceGM2XHhlNlx4OTNceGUxXHg0OFx4YzFceDUxIiwKKwkJLnJsZW4JPSA1MTIsCiAJfQogfTsKIApAQCAtNDEyMyw2ICs0MjY3LDE1MSBAQAogCQkJICAiXHhmMFx4ZjFceGYyXHhmM1x4ZjRceGY1XHhmNlx4ZjciCiAJCQkgICJceGY4XHhmOVx4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZiIsCiAJCS5ybGVuICAgPSA1MTIsCisJfSwgeyAvKiBYVFMtQUVTIDEwLCBYVFMtQUVTLTI1NiwgZGF0YSB1bml0IDUxMiBieXRlcyAqLworCQkua2V5CT0gIlx4MjdceDE4XHgyOFx4MThceDI4XHg0NVx4OTBceDQ1IgorCQkJICAiXHgyM1x4NTNceDYwXHgyOFx4NzRceDcxXHgzNVx4MjYiCisJCQkgICJceDYyXHg0OVx4NzdceDU3XHgyNFx4NzBceDkzXHg2OSIKKwkJCSAgIlx4OTlceDU5XHg1N1x4NDlceDY2XHg5Nlx4NzZceDI3IgorCQkJICAiXHgzMVx4NDFceDU5XHgyNlx4NTNceDU4XHg5N1x4OTMiCisJCQkgICJceDIzXHg4NFx4NjJceDY0XHgzM1x4ODNceDI3XHg5NSIKKwkJCSAgIlx4MDJceDg4XHg0MVx4OTdceDE2XHg5M1x4OTlceDM3IgorCQkJICAiXHg1MVx4MDVceDgyXHgwOVx4NzRceDk0XHg0NVx4OTIiLAorCQkua2xlbgk9IDY0LAorCQkuaXYJPSAiXHhmZlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dAk9ICJceDFjXHgzYlx4M2FceDEwXHgyZlx4NzdceDAzXHg4NiIKKwkJCSAgIlx4ZTRceDgzXHg2Y1x4OTlceGUzXHg3MFx4Y2ZceDliIgorCQkJICAiXHhlYVx4MDBceDgwXHgzZlx4NWVceDQ4XHgyM1x4NTciCisJCQkgICJceGE0XHhhZVx4MTJceGQ0XHgxNFx4YTNceGU2XHgzYiIKKwkJCSAgIlx4NWRceDMxXHhlMlx4NzZceGY4XHhmZVx4NGFceDhkIgorCQkJICAiXHg2Nlx4YjNceDE3XHhmOVx4YWNceDY4XHgzZlx4NDQiCisJCQkgICJceDY4XHgwYVx4ODZceGFjXHgzNVx4YWRceGZjXHgzMyIKKwkJCSAgIlx4NDVceGJlXHhmZVx4Y2JceDRiXHhiMVx4ODhceGZkIgorCQkJICAiXHg1N1x4NzZceDkyXHg2Y1x4NDlceGEzXHgwOVx4NWUiCisJCQkgICJceGIxXHgwOFx4ZmRceDEwXHg5OFx4YmFceGVjXHg3MCIKKwkJCSAgIlx4YWFceGE2XHg2OVx4OTlceGE3XHgyYVx4ODJceGYyIgorCQkJICAiXHg3ZFx4ODRceDhiXHgyMVx4ZDRceGE3XHg0MVx4YjAiCisJCQkgICJceGM1XHhjZFx4NGRceDVmXHhmZlx4OWRceGFjXHg4OSIKKwkJCSAgIlx4YWVceGJhXHgxMlx4MjlceDYxXHhkMFx4M2FceDc1IgorCQkJICAiXHg3MVx4MjNceGU5XHg4N1x4MGZceDhhXHhjZlx4MTAiCisJCQkgICJceDAwXHgwMlx4MDhceDg3XHg4OVx4MTRceDI5XHhjYSIKKwkJCSAgIlx4MmFceDNlXHg3YVx4N2RceDdkXHhmN1x4YjFceDAzIgorCQkJICAiXHg1NVx4MTZceDVjXHg4Ylx4OWFceDZkXHgwYVx4N2QiCisJCQkgICJceGU4XHhiMFx4NjJceGM0XHg1MFx4MGRceGM0XHhjZCIKKwkJCSAgIlx4MTJceDBjXHgwZlx4NzRceDE4XHhkYVx4ZTNceGQwIgorCQkJICAiXHhiNVx4NzhceDFjXHgzNFx4ODBceDNmXHhhN1x4NTQiCisJCQkgICJceDIxXHhjN1x4OTBceGRmXHhlMVx4ZGVceDE4XHgzNCIKKwkJCSAgIlx4ZjJceDgwXHhkN1x4NjZceDdiXHgzMlx4N2ZceDZjIgorCQkJICAiXHg4Y1x4ZDdceDU1XHg3ZVx4MTJceGFjXHgzYVx4MGYiCisJCQkgICJceDkzXHhlY1x4MDVceGM1XHgyZVx4MDRceDkzXHhlZiIKKwkJCSAgIlx4MzFceGExXHgyZFx4M2RceDkyXHg2MFx4ZjdceDlhIgorCQkJICAiXHgyOFx4OWRceDZhXHgzN1x4OWJceGM3XHgwY1x4NTAiCisJCQkgICJceDg0XHgxNFx4NzNceGQxXHhhOFx4Y2NceDgxXHhlYyIKKwkJCSAgIlx4NThceDNlXHg5Nlx4NDVceGUwXHg3Ylx4OGRceDk2IgorCQkJICAiXHg3MFx4NjVceDViXHhhNVx4YmJceGNmXHhlY1x4YzYiCisJCQkgICJceGRjXHgzOVx4NjZceDM4XHgwYVx4ZDhceGZlXHhjYiIKKwkJCSAgIlx4MTdceGI2XHhiYVx4MDJceDQ2XHg5YVx4MDJceDBhIgorCQkJICAiXHg4NFx4ZTFceDhlXHg4Zlx4ODRceDI1XHgyMFx4NzAiCisJCQkgICJceGMxXHgzZVx4OWZceDFmXHgyOFx4OWJceGU1XHg0ZiIKKwkJCSAgIlx4YmNceDQ4XHgxNFx4NTdceDc3XHg4Zlx4NjFceDYwIgorCQkJICAiXHgxNVx4ZTFceDMyXHg3YVx4MDJceGIxXHg0MFx4ZjEiCisJCQkgICJceDUwXHg1ZVx4YjNceDA5XHgzMlx4NmRceDY4XHgzNyIKKwkJCSAgIlx4OGZceDgzXHg3NFx4NTlceDVjXHg4NFx4OWRceDg0IgorCQkJICAiXHhmNFx4YzNceDMzXHhlY1x4NDRceDIzXHg4OFx4NTEiCisJCQkgICJceDQzXHhjYlx4NDdceGJkXHg3MVx4YzVceGVkXHhhZSIKKwkJCSAgIlx4OWJceGU2XHg5YVx4MmZceGZlXHhjZVx4YjFceGJlIgorCQkJICAiXHhjOVx4ZGVceDI0XHg0Zlx4YmVceDE1XHg5OVx4MmIiCisJCQkgICJceDExXHhiN1x4N2NceDA0XHgwZlx4MTJceGJkXHg4ZiIKKwkJCSAgIlx4NmFceDk3XHg1YVx4NDRceGEwXHhmOVx4MGNceDI5IgorCQkJICAiXHhhOVx4YWJceGMzXHhkNFx4ZDhceDkzXHg5Mlx4NzIiCisJCQkgICJceDg0XHhjNVx4ODdceDU0XHhjY1x4ZTJceDk0XHg1MiIKKwkJCSAgIlx4OWZceDg2XHgxNFx4ZGNceGQyXHhhYlx4YTlceDkxIgorCQkJICAiXHg5Mlx4NWZceGVkXHhjNFx4YWVceDc0XHhmZlx4YWMiCisJCQkgICJceDZlXHgzM1x4M2JceDkzXHhlYlx4NGFceGZmXHgwNCIKKwkJCSAgIlx4NzlceGRhXHg5YVx4NDFceDBlXHg0NFx4NTBceGUwIgorCQkJICAiXHhkZFx4N2FceGU0XHhjNlx4ZTJceDkxXHgwOVx4MDAiCisJCQkgICJceDU3XHg1ZFx4YTRceDAxXHhmY1x4MDdceDA1XHg5ZiIKKwkJCSAgIlx4NjRceDVlXHg4Ylx4N2VceDliXHhmZFx4ZWZceDMzIgorCQkJICAiXHg5NFx4MzBceDU0XHhmZlx4ODRceDAxXHgxNFx4OTMiCisJCQkgICJceGMyXHg3Ylx4MzRceDI5XHhlYVx4ZWRceGI0XHhlZCIKKwkJCSAgIlx4NTNceDc2XHg0NFx4MWFceDc3XHhlZFx4NDNceDg1IgorCQkJICAiXHgxYVx4ZDdceDdmXHgxNlx4ZjVceDQxXHhkZlx4ZDIiCisJCQkgICJceDY5XHhkNVx4MGRceDZhXHg1Zlx4MTRceGZiXHgwYSIKKwkJCSAgIlx4YWJceDFjXHhiYlx4NGNceDE1XHg1MFx4YmVceDk3IgorCQkJICAiXHhmN1x4YWJceDQwXHg2Nlx4MTlceDNjXHg0Y1x4YWEiCisJCQkgICJceDc3XHgzZFx4YWRceDM4XHgwMVx4NGJceGQyXHgwOSIKKwkJCSAgIlx4MmZceGE3XHg1NVx4YzhceDI0XHhiYlx4NWVceDU0IgorCQkJICAiXHhjNFx4ZjNceDZmXHhmZFx4YTlceGZjXHhlYVx4NzAiCisJCQkgICJceGI5XHhjNlx4ZTZceDkzXHhlMVx4NDhceGMxXHg1MSIsCisJCS5pbGVuCT0gNTEyLAorCQkucmVzdWx0CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKwkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgorCQkJICAiXHgyMFx4MjFceDIyXHgyM1x4MjRceDI1XHgyNlx4MjciCisJCQkgICJceDI4XHgyOVx4MmFceDJiXHgyY1x4MmRceDJlXHgyZiIKKwkJCSAgIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgorCQkJICAiXHgzOFx4MzlceDNhXHgzYlx4M2NceDNkXHgzZVx4M2YiCisJCQkgICJceDQwXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0NyIKKwkJCSAgIlx4NDhceDQ5XHg0YVx4NGJceDRjXHg0ZFx4NGVceDRmIgorCQkJICAiXHg1MFx4NTFceDUyXHg1M1x4NTRceDU1XHg1Nlx4NTciCisJCQkgICJceDU4XHg1OVx4NWFceDViXHg1Y1x4NWRceDVlXHg1ZiIKKwkJCSAgIlx4NjBceDYxXHg2Mlx4NjNceDY0XHg2NVx4NjZceDY3IgorCQkJICAiXHg2OFx4NjlceDZhXHg2Ylx4NmNceDZkXHg2ZVx4NmYiCisJCQkgICJceDcwXHg3MVx4NzJceDczXHg3NFx4NzVceDc2XHg3NyIKKwkJCSAgIlx4NzhceDc5XHg3YVx4N2JceDdjXHg3ZFx4N2VceDdmIgorCQkJICAiXHg4MFx4ODFceDgyXHg4M1x4ODRceDg1XHg4Nlx4ODciCisJCQkgICJceDg4XHg4OVx4OGFceDhiXHg4Y1x4OGRceDhlXHg4ZiIKKwkJCSAgIlx4OTBceDkxXHg5Mlx4OTNceDk0XHg5NVx4OTZceDk3IgorCQkJICAiXHg5OFx4OTlceDlhXHg5Ylx4OWNceDlkXHg5ZVx4OWYiCisJCQkgICJceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceGE2XHhhNyIKKwkJCSAgIlx4YThceGE5XHhhYVx4YWJceGFjXHhhZFx4YWVceGFmIgorCQkJICAiXHhiMFx4YjFceGIyXHhiM1x4YjRceGI1XHhiNlx4YjciCisJCQkgICJceGI4XHhiOVx4YmFceGJiXHhiY1x4YmRceGJlXHhiZiIKKwkJCSAgIlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3IgorCQkJICAiXHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiCisJCQkgICJceGQwXHhkMVx4ZDJceGQzXHhkNFx4ZDVceGQ2XHhkNyIKKwkJCSAgIlx4ZDhceGQ5XHhkYVx4ZGJceGRjXHhkZFx4ZGVceGRmIgorCQkJICAiXHhlMFx4ZTFceGUyXHhlM1x4ZTRceGU1XHhlNlx4ZTciCisJCQkgICJceGU4XHhlOVx4ZWFceGViXHhlY1x4ZWRceGVlXHhlZiIKKwkJCSAgIlx4ZjBceGYxXHhmMlx4ZjNceGY0XHhmNVx4ZjZceGY3IgorCQkJICAiXHhmOFx4ZjlceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYiCisJCQkgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKKwkJCSAgIlx4MjBceDIxXHgyMlx4MjNceDI0XHgyNVx4MjZceDI3IgorCQkJICAiXHgyOFx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmYiCisJCQkgICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKKwkJCSAgIlx4MzhceDM5XHgzYVx4M2JceDNjXHgzZFx4M2VceDNmIgorCQkJICAiXHg0MFx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDciCisJCQkgICJceDQ4XHg0OVx4NGFceDRiXHg0Y1x4NGRceDRlXHg0ZiIKKwkJCSAgIlx4NTBceDUxXHg1Mlx4NTNceDU0XHg1NVx4NTZceDU3IgorCQkJICAiXHg1OFx4NTlceDVhXHg1Ylx4NWNceDVkXHg1ZVx4NWYiCisJCQkgICJceDYwXHg2MVx4NjJceDYzXHg2NFx4NjVceDY2XHg2NyIKKwkJCSAgIlx4NjhceDY5XHg2YVx4NmJceDZjXHg2ZFx4NmVceDZmIgorCQkJICAiXHg3MFx4NzFceDcyXHg3M1x4NzRceDc1XHg3Nlx4NzciCisJCQkgICJceDc4XHg3OVx4N2FceDdiXHg3Y1x4N2RceDdlXHg3ZiIKKwkJCSAgIlx4ODBceDgxXHg4Mlx4ODNceDg0XHg4NVx4ODZceDg3IgorCQkJICAiXHg4OFx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGYiCisJCQkgICJceDkwXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5NyIKKwkJCSAgIlx4OThceDk5XHg5YVx4OWJceDljXHg5ZFx4OWVceDlmIgorCQkJICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTciCisJCQkgICJceGE4XHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZiIKKwkJCSAgIlx4YjBceGIxXHhiMlx4YjNceGI0XHhiNVx4YjZceGI3IgorCQkJICAiXHhiOFx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmYiCisJCQkgICJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjNyIKKwkJCSAgIlx4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmIgorCQkJICAiXHhkMFx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZDciCisJCQkgICJceGQ4XHhkOVx4ZGFceGRiXHhkY1x4ZGRceGRlXHhkZiIKKwkJCSAgIlx4ZTBceGUxXHhlMlx4ZTNceGU0XHhlNVx4ZTZceGU3IgorCQkJICAiXHhlOFx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWYiCisJCQkgICJceGYwXHhmMVx4ZjJceGYzXHhmNFx4ZjVceGY2XHhmNyIKKwkJCSAgIlx4ZjhceGY5XHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmIiwKKwkJLnJsZW4JPSA1MTIsCisKIAl9CiB9OwogCmRpZmYgLS1naXQgYS9jcnlwdG8vemxpYi5jIGIvY3J5cHRvL3psaWIuYwppbmRleCBkMTFkNzYxLi4wNmI2MmU1IDEwMDY0NAotLS0gYS9jcnlwdG8vemxpYi5jCisrKyBiL2NyeXB0by96bGliLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9jb21wcmVzcy5oPgogCkBAIC02MCw3ICs1OSw3IEBACiAKIAlpZiAoc3RyZWFtLT53b3Jrc3BhY2UpIHsKIAkJemxpYl9pbmZsYXRlRW5kKHN0cmVhbSk7Ci0JCWtmcmVlKHN0cmVhbS0+d29ya3NwYWNlKTsKKwkJdmZyZWUoc3RyZWFtLT53b3Jrc3BhY2UpOwogCQlzdHJlYW0tPndvcmtzcGFjZSA9IE5VTEw7CiAJfQogfQpAQCAtMjI4LDEzICsyMjcsMTMgQEAKIAkJCQkgPyBubGFfZ2V0X3UzMih0YltaTElCX0RFQ09NUF9XSU5ET1dCSVRTXSkKIAkJCQkgOiBERUZfV0JJVFM7CiAKLQlzdHJlYW0tPndvcmtzcGFjZSA9IGt6YWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSwgR0ZQX0tFUk5FTCk7CisJc3RyZWFtLT53b3Jrc3BhY2UgPSB2emFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpOwogCWlmICghc3RyZWFtLT53b3Jrc3BhY2UpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0ID0gemxpYl9pbmZsYXRlSW5pdDIoc3RyZWFtLCBjdHgtPmRlY29tcF93aW5kb3dCaXRzKTsKIAlpZiAocmV0ICE9IFpfT0spIHsKLQkJa2ZyZWUoc3RyZWFtLT53b3Jrc3BhY2UpOworCQl2ZnJlZShzdHJlYW0tPndvcmtzcGFjZSk7CiAJCXN0cmVhbS0+d29ya3NwYWNlID0gTlVMTDsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9LY29uZmlnIGIvZHJpdmVycy9LY29uZmlnCmluZGV4IDNiYjE1NGQuLjk1YjllN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL0tjb25maWcKQEAgLTk0LDggKzk0LDYgQEAKIAogc291cmNlICJkcml2ZXJzL2xlZHMvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL25mYy9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvYWNjZXNzaWJpbGl0eS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnIgpAQCAtMTE0LDYgKzExMiw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy92bHlucS9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvdmlydGlvL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy94ZW4vS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvS2NvbmZpZyIKQEAgLTEyNiw0ICsxMjYsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL2lvbW11L0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy92aXJ0L0tjb25maWciCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDA5ZjMyMzIuLjdmYTQzM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtMTIyLDMgKzEyMiw4IEBACiBvYmoteQkJCQkrPSBjbGsvCiAKIG9iai0kKENPTkZJR19IV1NQSU5MT0NLKQkrPSBod3NwaW5sb2NrLworb2JqLSQoQ09ORklHX05GQykJCSs9IG5mYy8KK29iai0kKENPTkZJR19JT01NVV9TVVBQT1JUKQkrPSBpb21tdS8KKworIyBWaXJ0dWFsaXphdGlvbiBkcml2ZXJzCitvYmotJChDT05GSUdfVklSVF9EUklWRVJTKQkrPSB2aXJ0LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjLmMgYi9kcml2ZXJzL2FjcGkvYWMuYwppbmRleCA1OGMzZjc0Li42NTEyYjIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWMuYworKysgYi9kcml2ZXJzL2FjcGkvYWMuYwpAQCAtODksNyArODksNyBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGF0ZTsKIH07CiAKLSNkZWZpbmUgdG9fYWNwaV9hYyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGFjcGlfYWMsIGNoYXJnZXIpOworI2RlZmluZSB0b19hY3BpX2FjKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgYWNwaV9hYywgY2hhcmdlcikKIAogI2lmZGVmIENPTkZJR19BQ1BJX1BST0NGU19QT1dFUgogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9hY19mb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FwZWkvaGVzdC5jIGIvZHJpdmVycy9hY3BpL2FwZWkvaGVzdC5jCmluZGV4IGFiZGEzNzguLjE4MWJjMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hcGVpL2hlc3QuYworKysgYi9kcml2ZXJzL2FjcGkvYXBlaS9oZXN0LmMKQEAgLTEzOSwxMyArMTM5LDIzIEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZ2hlc19kZXY7CiAJc3RydWN0IGdoZXNfYXJyICpnaGVzX2FyciA9IGRhdGE7Ci0JaW50IHJjOworCWludCByYywgaTsKIAogCWlmIChoZXN0X2hkci0+dHlwZSAhPSBBQ1BJX0hFU1RfVFlQRV9HRU5FUklDX0VSUk9SKQogCQlyZXR1cm4gMDsKIAogCWlmICghKChzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKiloZXN0X2hkciktPmVuYWJsZWQpCiAJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBnaGVzX2Fyci0+Y291bnQ7IGkrKykgeworCQlzdHJ1Y3QgYWNwaV9oZXN0X2hlYWRlciAqaGRyOworCQlnaGVzX2RldiA9IGdoZXNfYXJyLT5naGVzX2RldnNbaV07CisJCWhkciA9ICooc3RydWN0IGFjcGlfaGVzdF9oZWFkZXIgKiopZ2hlc19kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCQlpZiAoaGRyLT5zb3VyY2VfaWQgPT0gaGVzdF9oZHItPnNvdXJjZV9pZCkgeworCQkJcHJfd2FybmluZyhGV19XQVJOIEhFU1RfUEZYICJEdXBsaWNhdGVkIGhhcmR3YXJlIGVycm9yIHNvdXJjZSBJRDogJWQuXG4iLAorCQkJCSAgIGhkci0+c291cmNlX2lkKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQogCWdoZXNfZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJHSEVTIiwgaGVzdF9oZHItPnNvdXJjZV9pZCk7CiAJaWYgKCFnaGVzX2RldikKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwppbmRleCBmY2MxM2FjLi4yYzY2MTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OwogCi0jZGVmaW5lIHRvX2FjcGlfYmF0dGVyeSh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGFjcGlfYmF0dGVyeSwgYmF0KTsKKyNkZWZpbmUgdG9fYWNwaV9iYXR0ZXJ5KHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5LCBiYXQpCiAKIGlubGluZSBpbnQgYWNwaV9iYXR0ZXJ5X3ByZXNlbnQoc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9vc2wuYyBiL2RyaXZlcnMvYWNwaS9vc2wuYwppbmRleCA1MmNhOTY0Li4zNzJmOWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvb3NsLmMKKysrIGIvZHJpdmVycy9hY3BpL29zbC5jCkBAIC0xMzMzLDIzICsxMzMzLDYgQEAKIEVYUE9SVF9TWU1CT0woYWNwaV9yZXNvdXJjZXNfYXJlX2VuZm9yY2VkKTsKIAogLyoKLSAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIHNwaW5sb2NrLgotICovCi1hY3BpX3N0YXR1cwotYWNwaV9vc19jcmVhdGVfbG9jayhhY3BpX3NwaW5sb2NrICpvdXRfaGFuZGxlKQotewotCXNwaW5sb2NrX3QgKmxvY2s7Ci0KLQlsb2NrID0gQUNQSV9BTExPQ0FURShzaXplb2Yoc3BpbmxvY2tfdCkpOwotCWlmICghbG9jaykKLQkJcmV0dXJuIEFFX05PX01FTU9SWTsKLQlzcGluX2xvY2tfaW5pdChsb2NrKTsKLQkqb3V0X2hhbmRsZSA9IGxvY2s7Ci0KLQlyZXR1cm4gQUVfT0s7Ci19Ci0KLS8qCiAgKiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIGEgc3BpbmxvY2suCiAgKi8KIHZvaWQgYWNwaV9vc19kZWxldGVfbG9jayhhY3BpX3NwaW5sb2NrIGhhbmRsZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zYnMuYyBiL2RyaXZlcnMvYWNwaS9zYnMuYwppbmRleCA1MWFlMzc5Li41MDY1OGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2JzLmMKKysrIGIvZHJpdmVycy9hY3BpL3Nicy5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAl1OCBoYXZlX3N5c2ZzX2FsYXJtOjE7CiB9OwogCi0jZGVmaW5lIHRvX2FjcGlfYmF0dGVyeSh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGFjcGlfYmF0dGVyeSwgYmF0KTsKKyNkZWZpbmUgdG9fYWNwaV9iYXR0ZXJ5KHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5LCBiYXQpCiAKIHN0cnVjdCBhY3BpX3NicyB7CiAJc3RydWN0IHBvd2VyX3N1cHBseSBjaGFyZ2VyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvS2NvbmZpZyBiL2RyaXZlcnMvYXRhL0tjb25maWcKaW5kZXggNzVhZmE3NS4uY2EzZTZiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvS2NvbmZpZworKysgYi9kcml2ZXJzL2F0YS9LY29uZmlnCkBAIC0zMTMsNiArMzEzLDcgQEAKIAogY29uZmlnIFBBVEFfQVJBU0FOX0NGCiAJdHJpc3RhdGUgIkFSQVNBTiBDb21wYWN0Rmxhc2ggUEFUQSBDb250cm9sbGVyIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBETUFERVZJQ0VTCiAJc2VsZWN0IERNQV9FTkdJTkUKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEFSQVNBTiBDb21wYWN0Rmxhc2ggUEFUQSBjb250cm9sbGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hY2FyZC1haGNpLmMgYi9kcml2ZXJzL2F0YS9hY2FyZC1haGNpLmMKaW5kZXggYWUyMmJlNC4uM2JjOGM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWNhcmQtYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FjYXJkLWFoY2kuYwpAQCAtMTM1LDggKzEzNSw4IEBACiAKIAlpZiAobWVzZy5ldmVudCAmIFBNX0VWRU5UX1NVU1BFTkQgJiYKIAkgICAgaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19OT19TVVNQRU5EKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkgICAiQklPUyB1cGRhdGUgcmVxdWlyZWQgZm9yIHN1c3BlbmQvcmVzdW1lXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkJJT1MgdXBkYXRlIHJlcXVpcmVkIGZvciBzdXNwZW5kL3Jlc3VtZVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTg3LDcgKzE4Nyw3IEBACiAJCWlmIChyYykgewogCQkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCQlpZiAocmMpIHsKLQkJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCQkJICAgIjY0LWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCQkJcmV0dXJuIHJjOwogCQkJfQpAQCAtMTk1LDE0ICsxOTUsMTMgQEAKIAl9IGVsc2UgewogCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCQkgICAiMzItYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIjMyLWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCQkgICAiMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSIzMi1iaXQgY29uc2lzdGVudCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAl9CkBAIC0zNDMsMTQgKzM0MiwxMiBAQAogCQlpZiAoY21kICYgUE9SVF9DTURfRkJTQ1ApCiAJCQlwcC0+ZmJzX3N1cHBvcnRlZCA9IHRydWU7CiAJCWVsc2UgaWYgKGhwcml2LT5mbGFncyAmIEFIQ0lfSEZMQUdfWUVTX0ZCUykgewotCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sIGRldiwKLQkJCQkgICAicG9ydCAlZCBjYW4gZG8gRkJTLCBmb3JjaW5nIEZCU0NQXG4iLAotCQkJCSAgIGFwLT5wb3J0X25vKTsKKwkJCWRldl9pbmZvKGRldiwgInBvcnQgJWQgY2FuIGRvIEZCUywgZm9yY2luZyBGQlNDUFxuIiwKKwkJCQkgYXAtPnBvcnRfbm8pOwogCQkJcHAtPmZic19zdXBwb3J0ZWQgPSB0cnVlOwogCQl9IGVsc2UKLQkJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCBkZXYsCi0JCQkJICAgInBvcnQgJWQgaXMgbm90IGNhcGFibGUgb2YgRkJTXG4iLAotCQkJCSAgIGFwLT5wb3J0X25vKTsKKwkJCWRldl93YXJuKGRldiwgInBvcnQgJWQgaXMgbm90IGNhcGFibGUgb2YgRkJTXG4iLAorCQkJCSBhcC0+cG9ydF9ubyk7CiAJfQogCiAJaWYgKHBwLT5mYnNfc3VwcG9ydGVkKSB7CkBAIC00MDYsNyArNDAzLDYgQEAKIAogc3RhdGljIGludCBhY2FyZF9haGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXVuc2lnbmVkIGludCBib2FyZF9pZCA9IGVudC0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IGF0YV9wb3J0X2luZm8gcGkgPSBhY2FyZF9haGNpX3BvcnRfaW5mb1tib2FyZF9pZF07CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmcGksIE5VTEwgfTsKQEAgLTQxOSw4ICs0MTUsNyBAQAogCiAJV0FSTl9PTigoaW50KUFUQV9NQVhfUVVFVUUgPiBBSENJX01BWF9DTURTKTsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCS8qIGFjcXVpcmUgcmVzb3VyY2VzICovCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmMgYi9kcml2ZXJzL2F0YS9haGNpLmMKaW5kZXggNzFhZmUwMy4uZmI3YjkwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuYwpAQCAtNzksOCArNzksNiBAQAogfTsKIAogc3RhdGljIGludCBhaGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKLXN0YXRpYyBpbnQgYWhjaV9zYjYwMF9zb2Z0cmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgKmNsYXNzLAotCQkJICB1bnNpZ25lZCBsb25nIGRlYWRsaW5lKTsKIHN0YXRpYyBpbnQgYWhjaV92dDgyNTFfaGFyZHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcywKIAkJCQkgdW5zaWduZWQgbG9uZyBkZWFkbGluZSk7CiBzdGF0aWMgaW50IGFoY2lfcDV3ZGhfaGFyZHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcywKQEAgLTEwNCwxMiArMTAyLDYgQEAKIAkuaGFyZHJlc2V0CQk9IGFoY2lfcDV3ZGhfaGFyZHJlc2V0LAogfTsKIAotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfc2I2MDBfb3BzID0gewotCS5pbmhlcml0cwkJPSAmYWhjaV9vcHMsCi0JLnNvZnRyZXNldAkJPSBhaGNpX3NiNjAwX3NvZnRyZXNldCwKLQkucG1wX3NvZnRyZXNldAkJPSBhaGNpX3NiNjAwX3NvZnRyZXNldCwKLX07Ci0KICNkZWZpbmUgQUhDSV9IRkxBR1MoZmxhZ3MpCS5wcml2YXRlX2RhdGEJPSAodm9pZCAqKShmbGFncykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGFoY2lfcG9ydF9pbmZvW10gPSB7CkBAIC0xODgsNyArMTgwLDcgQEAKIAkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCiAJCS5waW9fbWFzawk9IEFUQV9QSU80LAogCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAotCQkucG9ydF9vcHMJPSAmYWhjaV9zYjYwMF9vcHMsCisJCS5wb3J0X29wcwk9ICZhaGNpX3BtcF9yZXRyeV9zcnN0X29wcywKIAl9LAogCVtib2FyZF9haGNpX3NiNzAwXSA9CS8qIGZvciBTQjcwMCBhbmQgU0I4MDAgKi8KIAl7CkBAIC0xOTYsNyArMTg4LDcgQEAKIAkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCiAJCS5waW9fbWFzawk9IEFUQV9QSU80LAogCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAotCQkucG9ydF9vcHMJPSAmYWhjaV9zYjYwMF9vcHMsCisJCS5wb3J0X29wcwk9ICZhaGNpX3BtcF9yZXRyeV9zcnN0X29wcywKIAl9LAogCVtib2FyZF9haGNpX3Z0ODI1MV0gPQogCXsKQEAgLTI2Nyw2ICsyNTksNyBAQAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWUwNSksIGJvYXJkX2FoY2kgfSwgLyogUGFudGhlciBQb2ludCBSQUlEICovCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxZTA2KSwgYm9hcmRfYWhjaSB9LCAvKiBQYW50aGVyIFBvaW50IFJBSUQgKi8KIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlMDcpLCBib2FyZF9haGNpIH0sIC8qIFBhbnRoZXIgUG9pbnQgUkFJRCAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWUwZSksIGJvYXJkX2FoY2kgfSwgLyogUGFudGhlciBQb2ludCBSQUlEICovCiAKIAkvKiBKTWljcm9uIDM2MC8xLzMvNS82LCBtYXRjaCBjbGFzcyB0byBhdm9pZCBJREUgZnVuY3Rpb24gKi8KIAl7IFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKQEAgLTUwMiw1NSArNDk1LDYgQEAKIAlhaGNpX2luaXRfY29udHJvbGxlcihob3N0KTsKIH0KIAotc3RhdGljIGludCBhaGNpX3NiNjAwX2NoZWNrX3JlYWR5KHN0cnVjdCBhdGFfbGluayAqbGluaykKLXsKLQl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGxpbmstPmFwKTsKLQl1OCBzdGF0dXMgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX1RGREFUQSkgJiAweEZGOwotCXUzMiBpcnFfc3RhdHVzID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCk7Ci0KLQkvKgotCSAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgVEZEQVRBIGlmIEJBRCBQTVAgaXMgZm91bmQgZHVlIHRvIEhXIGJ1ZywKLQkgKiB3aGljaCBjYW4gc2F2ZSB0aW1lb3V0IGRlbGF5LgotCSAqLwotCWlmIChpcnFfc3RhdHVzICYgUE9SVF9JUlFfQkFEX1BNUCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gYXRhX2NoZWNrX3JlYWR5KHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbnQgYWhjaV9zYjYwMF9zb2Z0cmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgKmNsYXNzLAotCQkJCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCi17Ci0Jc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOwotCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UoYXApOwotCWludCBwbXAgPSBzYXRhX3Nyc3RfcG1wKGxpbmspOwotCWludCByYzsKLQl1MzIgaXJxX3N0czsKLQotCURQUklOVEsoIkVOVEVSXG4iKTsKLQotCXJjID0gYWhjaV9kb19zb2Z0cmVzZXQobGluaywgY2xhc3MsIHBtcCwgZGVhZGxpbmUsCi0JCQkgICAgICAgYWhjaV9zYjYwMF9jaGVja19yZWFkeSk7Ci0KLQkvKgotCSAqIFNvZnQgcmVzZXQgZmFpbHMgb24gc29tZSBBVEkgY2hpcHMgd2l0aCBJUE1TIHNldCB3aGVuIFBNUAotCSAqIGlzIGVuYWJsZWQgYnV0IFNBVEEgSEREL09ERCBpcyBjb25uZWN0ZWQgdG8gU0FUQSBwb3J0LAotCSAqIGRvIHNvZnQgcmVzZXQgYWdhaW4gdG8gcG9ydCAwLgotCSAqLwotCWlmIChyYyA9PSAtRUlPKSB7Ci0JCWlycV9zdHMgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0lSUV9TVEFUKTsKLQkJaWYgKGlycV9zdHMgJiBQT1JUX0lSUV9CQURfUE1QKSB7Ci0JCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9XQVJOSU5HLAotCQkJCQkiYXBwbHlpbmcgU0I2MDAgUE1QIFNSU1Qgd29ya2Fyb3VuZCAiCi0JCQkJCSJhbmQgcmV0cnlpbmdcbiIpOwotCQkJcmMgPSBhaGNpX2RvX3NvZnRyZXNldChsaW5rLCBjbGFzcywgMCwgZGVhZGxpbmUsCi0JCQkJCSAgICAgICBhaGNpX2NoZWNrX3JlYWR5KTsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQogc3RhdGljIGludCBhaGNpX3Z0ODI1MV9oYXJkcmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgKmNsYXNzLAogCQkJCSB1bnNpZ25lZCBsb25nIGRlYWRsaW5lKQogewpAQCAtNjI5LDggKzU3Myw4IEBACiAKIAlpZiAobWVzZy5ldmVudCAmIFBNX0VWRU5UX1NVU1BFTkQgJiYKIAkgICAgaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19OT19TVVNQRU5EKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkgICAiQklPUyB1cGRhdGUgcmVxdWlyZWQgZm9yIHN1c3BlbmQvcmVzdW1lXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkJJT1MgdXBkYXRlIHJlcXVpcmVkIGZvciBzdXNwZW5kL3Jlc3VtZVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtNjgxLDIyICs2MjUsMjEgQEAKIAkJaWYgKHJjKSB7CiAJCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAkJCWlmIChyYykgewotCQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkJCSAgICI2NC1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkJIjY0LWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCQkJcmV0dXJuIHJjOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKIAkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAocmMpIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkJICAgIjMyLWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIHJjOwogCQl9CiAJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAocmMpIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkJICAgIjMyLWJpdCBjb25zaXN0ZW50IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIHJjOwogCQl9CiAJfQpAQCAtNzU5LDggKzcwMiw4IEBACiAJICAgIGRtaV9jaGVja19zeXN0ZW0oc3lzaWRzKSkgewogCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gaG9zdC0+cG9ydHNbMV07CiAKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJlbmFibGluZyBBU1VTIFA1VyBESCAiCi0JCQkgICAiRGVsdXhlIG9uLWJvYXJkIFNJTUc0NzI2IHdvcmthcm91bmRcbiIpOworCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJICJlbmFibGluZyBBU1VTIFA1VyBESCBEZWx1eGUgb24tYm9hcmQgU0lNRzQ3MjYgd29ya2Fyb3VuZFxuIik7CiAKIAkJYXAtPm9wcyA9ICZhaGNpX3A1d2RoX29wczsKIAkJYXAtPmxpbmsuZmxhZ3MgfD0gQVRBX0xGTEFHX05PX1NSU1QgfCBBVEFfTEZMQUdfQVNTVU1FX0FUQTsKQEAgLTgxMSw2ICs3NTQsMTggQEAKIAkJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJNUy03Mzc2IiksCiAJCQl9LAogCQl9LAorCQkvKgorCQkgKiBBbGwgQklPUyB2ZXJzaW9ucyBmb3IgdGhlIEFzdXMgTTNBIHN1cHBvcnQgNjRiaXQgRE1BLgorCQkgKiAoYWxsIHJlbGVhc2UgdmVyc2lvbnMgZnJvbSAwMzAxIHRvIDEyMDYgd2VyZSB0ZXN0ZWQpCisJCSAqLworCQl7CisJCQkuaWRlbnQgPSAiQVNVUyBNM0EiLAorCQkJLm1hdGNoZXMgPSB7CisJCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsCisJCQkJCSAgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIk0zQSIpLAorCQkJfSwKKwkJfSwKIAkJeyB9CiAJfTsKIAljb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqbWF0Y2g7CkBAIC04MzEsMTQgKzc4NiwxNCBAQAogCWlmIChzdHJjbXAoYnVmLCBtYXRjaC0+ZHJpdmVyX2RhdGEpID49IDApCiAJCWdvdG8gZW5hYmxlXzY0Yml0OwogCWVsc2UgewotCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJnBkZXYtPmRldiwgIiVzOiBCSU9TIHRvbyBvbGQsICIKLQkJCSAgICJmb3JjaW5nIDMyYml0IERNQSwgdXBkYXRlIEJJT1NcbiIsIG1hdGNoLT5pZGVudCk7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIiVzOiBCSU9TIHRvbyBvbGQsIGZvcmNpbmcgMzJiaXQgRE1BLCB1cGRhdGUgQklPU1xuIiwKKwkJCSBtYXRjaC0+aWRlbnQpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiBlbmFibGVfNjRiaXQ6Ci0JZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsICIlczogZW5hYmxpbmcgNjRiaXQgRE1BXG4iLAotCQkgICBtYXRjaC0+aWRlbnQpOworCWRldl93YXJuKCZwZGV2LT5kZXYsICIlczogZW5hYmxpbmcgNjRiaXQgRE1BXG4iLCBtYXRjaC0+aWRlbnQpOwogCXJldHVybiB0cnVlOwogfQogCkBAIC0xMDQxLDkgKzk5Niw4IEBACiAJCXJldHVybjsKIAogCWZpbHRlciA9ICh1bnNpZ25lZCBsb25nKWRtaS0+ZHJpdmVyX2RhdGE7Ci0JZGV2X3ByaW50ayhLRVJOX0lORk8sIGhvc3QtPmRldiwKLQkJICAgImFwcGx5aW5nIGV4dHJhIEFDUEkgX0dURiBmaWx0ZXIgMHgleCBmb3IgJXNcbiIsCi0JCSAgIGZpbHRlciwgZG1pLT5pZGVudCk7CisJZGV2X2luZm8oaG9zdC0+ZGV2LCAiYXBwbHlpbmcgZXh0cmEgQUNQSSBfR1RGIGZpbHRlciAweCV4IGZvciAlc1xuIiwKKwkJIGZpbHRlciwgZG1pLT5pZGVudCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKSB7CiAJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1tpXTsKQEAgLTEwNjIsNyArMTAxNiw2IEBACiAKIHN0YXRpYyBpbnQgYWhjaV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAl1bnNpZ25lZCBpbnQgYm9hcmRfaWQgPSBlbnQtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpID0gYWhjaV9wb3J0X2luZm9bYm9hcmRfaWRdOwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnBpLCBOVUxMIH07CkBAIC0xMDc1LDggKzEwMjgsNyBAQAogCiAJV0FSTl9PTigoaW50KUFUQV9NQVhfUVVFVUUgPiBBSENJX01BWF9DTURTKTsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCS8qIFRoZSBBSENJIGRyaXZlciBjYW4gb25seSBkcml2ZSB0aGUgU0FUQSBwb3J0cywgdGhlIFBBVEEgZHJpdmVyCiAJICAgY2FuIGRyaXZlIHRoZW0gYWxsIHNvIGlmIGJvdGggZHJpdmVycyBhcmUgc2VsZWN0ZWQgbWFrZSBzdXJlCkBAIC0xMDk5LDggKzEwNTEsOCBAQAogCSAqIHRoYXQgZm9yIFNBUyBkcml2ZXMgdGhleSdyZSBvdXQgb2YgbHVjay4KIAkgKi8KIAlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfUFJPTUlTRSkKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJQREM0MjgxOSAiCi0JCQkgICAiY2FuIG9ubHkgZHJpdmUgU0FUQSBkZXZpY2VzIHdpdGggdGhpcyBkcml2ZXJcbiIpOworCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJICJQREM0MjgxOSBjYW4gb25seSBkcml2ZSBTQVRBIGRldmljZXMgd2l0aCB0aGlzIGRyaXZlclxuIik7CiAKIAkvKiBhY3F1aXJlIHJlc291cmNlcyAqLwogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwpAQCAtMTEyNiw4ICsxMDc4LDggQEAKIAkJICovCiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIElDSF9NQVAsICZtYXApOwogCQlpZiAobWFwICYgMHgzKSB7Ci0JCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwgImNvbnRyb2xsZXIgaXMgaW4gIgotCQkJCSAgICJjb21iaW5lZCBtb2RlLCBjYW4ndCBlbmFibGUgQUhDSSBtb2RlXG4iKTsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkJICJjb250cm9sbGVyIGlzIGluIGNvbWJpbmVkIG1vZGUsIGNhbid0IGVuYWJsZSBBSENJIG1vZGVcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC0xMTg0LDggKzExMzYsOCBAQAogCiAJaWYgKGFoY2lfYnJva2VuX3N1c3BlbmQocGRldikpIHsKIAkJaHByaXYtPmZsYWdzIHw9IEFIQ0lfSEZMQUdfTk9fU1VTUEVORDsKLQkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsCi0JCQkgICAiQklPUyB1cGRhdGUgcmVxdWlyZWQgZm9yIHN1c3BlbmQvcmVzdW1lXG4iKTsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSAiQklPUyB1cGRhdGUgcmVxdWlyZWQgZm9yIHN1c3BlbmQvcmVzdW1lXG4iKTsKIAl9CiAKIAlpZiAoYWhjaV9icm9rZW5fb25saW5lKHBkZXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmggYi9kcml2ZXJzL2F0YS9haGNpLmgKaW5kZXggMTJjNTI4Mi4uYjE3NTAwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5oCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuaApAQCAtMzEyLDYgKzMxMiw3IEBACiAJLnNkZXZfYXR0cnMJCT0gYWhjaV9zZGV2X2F0dHJzCiAKIGV4dGVybiBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhaGNpX29wczsKK2V4dGVybiBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhaGNpX3BtcF9yZXRyeV9zcnN0X29wczsKIAogdm9pZCBhaGNpX2ZpbGxfY21kX3Nsb3Qoc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCwgdW5zaWduZWQgaW50IHRhZywKIAkJCXUzMiBvcHRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMgYi9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jCmluZGV4IDcyMWQzOGIuLjdkZjU2ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYwpAQCAtODEsMTQgKzgxLDEzIEBACiAJCQkJeGZlcl9tYXNrIHw9IGF0YV94ZmVyX21vZGUybWFzayhYRkVSX01XX0RNQV8wKTsKIAkJCX0KIAotCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJjb25maWd1cmVkIGZvciAlc1xuIiwKLQkJCQkgICAgICAgbmFtZSk7CisJCQlhdGFfZGV2X2luZm8oZGV2LCAiY29uZmlndXJlZCBmb3IgJXNcbiIsIG5hbWUpOwogCiAJCQlkZXYtPnhmZXJfbW9kZSA9IGF0YV94ZmVyX21hc2sybW9kZSh4ZmVyX21hc2spOwogCQkJZGV2LT54ZmVyX3NoaWZ0ID0gYXRhX3hmZXJfbW9kZTJzaGlmdChkZXYtPnhmZXJfbW9kZSk7CiAJCQlkZXYtPmZsYWdzICY9IH5BVEFfREZMQUdfUElPOwogCQl9IGVsc2UgewotCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJjb25maWd1cmVkIGZvciBQSU9cbiIpOworCQkJYXRhX2Rldl9pbmZvKGRldiwgImNvbmZpZ3VyZWQgZm9yIFBJT1xuIik7CiAJCQlkZXYtPnhmZXJfbW9kZSA9IFhGRVJfUElPXzA7CiAJCQlkZXYtPnhmZXJfc2hpZnQgPSBBVEFfU0hJRlRfUElPOwogCQkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfUElPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKaW5kZXggNmY2ZTc3MS4uNDMxMDdlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYworKysgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCkBAIC0xMjI1LDggKzEyMjUsOSBAQAogCQkgKi8KIAkJcmMgPSBwY2lfcmVlbmFibGVfZGV2aWNlKHBkZXYpOwogCQlpZiAocmMpCi0JCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSAiCi0JCQkJICAgImRldmljZSBhZnRlciByZXN1bWUgKCVkKVxuIiwgcmMpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gZW5hYmxlIGRldmljZSBhZnRlciByZXN1bWUgKCVkKVxuIiwKKwkJCQlyYyk7CiAJfSBlbHNlCiAJCXJjID0gYXRhX3BjaV9kZXZpY2VfZG9fcmVzdW1lKHBkZXYpOwogCkBAIC0xMzAzLDkgKzEzMDQsMTEgQEAKIAkJCW5vX3BpaXhfZG1hID0gMjsKIAl9CiAJaWYgKG5vX3BpaXhfZG1hKQotCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJmF0YV9kZXYtPmRldiwgIjQ1ME5YIGVycmF0YSBwcmVzZW50LCBkaXNhYmxpbmcgSURFIERNQS5cbiIpOwotCWlmIChub19waWl4X2RtYSA9PSAyKQotCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJmF0YV9kZXYtPmRldiwgIkEgQklPUyB1cGRhdGUgbWF5IHJlc29sdmUgdGhpcy5cbiIpOworCQlkZXZfd2FybigmYXRhX2Rldi0+ZGV2LAorCQkJICI0NTBOWCBlcnJhdGEgcHJlc2VudCwgZGlzYWJsaW5nIElERSBETUElc1xuIiwKKwkJCSBub19waWl4X2RtYSA9PSAyID8gIiAtIGEgQklPUyB1cGRhdGUgbWF5IHJlc29sdmUgdGhpcyIKKwkJCSA6ICIiKTsKKwogCXJldHVybiBub19waWl4X2RtYTsKIH0KIApAQCAtMTMzOCwzNyArMTM0MSwzNiBAQAogCiAJbWFwID0gbWFwX2RiLT5tYXBbbWFwX3ZhbHVlICYgbWFwX2RiLT5tYXNrXTsKIAotCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LCAiTUFQIFsiKTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiTUFQIFsiKTsKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCXN3aXRjaCAobWFwW2ldKSB7CiAJCWNhc2UgUlY6CiAJCQlpbnZhbGlkX21hcCA9IDE7Ci0JCQlwcmludGsoIiBYWCIpOworCQkJcHJfY29udCgiIFhYIik7CiAJCQlicmVhazsKIAogCQljYXNlIE5BOgotCQkJcHJpbnRrKCIgLS0iKTsKKwkJCXByX2NvbnQoIiAtLSIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBJREU6CiAJCQlXQVJOX09OKChpICYgMSkgfHwgbWFwW2kgKyAxXSAhPSBJREUpOwogCQkJcGluZm9baSAvIDJdID0gcGlpeF9wb3J0X2luZm9baWNoX3BhdGFfMTAwXTsKIAkJCWkrKzsKLQkJCXByaW50aygiIElERSBJREUiKTsKKwkJCXByX2NvbnQoIiBJREUgSURFIik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCIgUCVkIiwgbWFwW2ldKTsKKwkJCXByX2NvbnQoIiBQJWQiLCBtYXBbaV0pOwogCQkJaWYgKGkgJiAxKQogCQkJCXBpbmZvW2kgLyAyXS5mbGFncyB8PSBBVEFfRkxBR19TTEFWRV9QT1NTOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JcHJpbnRrKCIgXVxuIik7CisJcHJfY29udCgiIF1cbiIpOwogCiAJaWYgKGludmFsaWRfbWFwKQotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAotCQkJICAgImludmFsaWQgTUFQIHZhbHVlICV1XG4iLCBtYXBfdmFsdWUpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIE1BUCB2YWx1ZSAldVxuIiwgbWFwX3ZhbHVlKTsKIAogCXJldHVybiBtYXA7CiB9CkBAIC0xMzk4LDggKzE0MDAsOCBAQAogCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCAmJiBwZGV2LT5kZXZpY2UgPT0gMHgyOTIwICYmCiAJICAgIHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9TQU1TVU5HICYmCiAJICAgIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHhiMDQ5KSB7Ci0JCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCBob3N0LT5kZXYsCi0JCQkgICAiU2Ftc3VuZyBEQi1QNzAgZGV0ZWN0ZWQsIGRpc2FibGluZyBTSURQUlxuIik7CisJCWRldl93YXJuKGhvc3QtPmRldiwKKwkJCSAiU2Ftc3VuZyBEQi1QNzAgZGV0ZWN0ZWQsIGRpc2FibGluZyBTSURQUlxuIik7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtMTQ1MSw4ICsxNDUzLDggQEAKIAkJcGlpeF9zaWRwcl9zY3JfcmVhZChsaW5rMCwgU0NSX0NPTlRST0wsICZzY29udHJvbCk7CiAKIAkJaWYgKChzY29udHJvbCAmIDB4ZjAwKSAhPSAweDMwMCkgewotCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sIGhvc3QtPmRldiwgIlNDUiBhY2Nlc3MgdmlhICIKLQkJCQkgICAiU0lEUFIgaXMgYXZhaWxhYmxlIGJ1dCBkb2Vzbid0IHdvcmtcbiIpOworCQkJZGV2X2luZm8oaG9zdC0+ZGV2LAorCQkJCSAiU0NSIGFjY2VzcyB2aWEgU0lEUFIgaXMgYXZhaWxhYmxlIGJ1dCBkb2Vzbid0IHdvcmtcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0xNTAxLDggKzE1MDMsNyBAQAogCSAqIGFmZmVjdGVkIHN5c3RlbXMuCiAJICovCiAJaWYgKGhwcml2LT5zYXZlZF9pb2NmZyAmICgxIDw8IDE4KSkgewotCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwKLQkJCSAgICJhcHBseWluZyBJT0NGRyBiaXQxOCBxdWlya1xuIik7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJhcHBseWluZyBJT0NGRyBiaXQxOCBxdWlya1xuIik7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUElJWF9JT0NGRywKIAkJCQkgICAgICAgaHByaXYtPnNhdmVkX2lvY2ZnICYgfigxIDw8IDE4KSk7CiAJfQpAQCAtMTU2MSw3ICsxNTYyLDYgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBpaXhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBvcnRfaW5mb1syXTsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZwb3J0X2luZm9bMF0sICZwb3J0X2luZm9bMV0gfTsKQEAgLTE1NzEsOSArMTU3MSw3IEBACiAJc3RydWN0IHBpaXhfaG9zdF9wcml2ICpocHJpdjsKIAlpbnQgcmM7CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCi0JCQkgICAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWF0YV9wcmludF92ZXJzaW9uX29uY2UoJnBkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJLyogbm8gaG90cGx1Z2dpbmcgc3VwcG9ydCBmb3IgbGF0ZXIgZGV2aWNlcyAoRklYTUUpICovCiAJaWYgKCFpbl9tb2R1bGVfaW5pdCAmJiBlbnQtPmRyaXZlcl9kYXRhID49IGljaDVfc2F0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmFoY2kuYyBiL2RyaXZlcnMvYXRhL2xpYmFoY2kuYwppbmRleCBkMzhjNDBmLi4zYzkyZGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhaGNpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYWhjaS5jCkBAIC04Miw2ICs4Miw4IEBACiBzdGF0aWMgdm9pZCBhaGNpX3BtcF9kZXRhY2goc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgaW50IGFoY2lfc29mdHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcywKIAkJCSAgdW5zaWduZWQgbG9uZyBkZWFkbGluZSk7CitzdGF0aWMgaW50IGFoY2lfcG1wX3JldHJ5X3NvZnRyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCAqY2xhc3MsCisJCQkgIHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpOwogc3RhdGljIGludCBhaGNpX2hhcmRyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCAqY2xhc3MsCiAJCQkgIHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpOwogc3RhdGljIHZvaWQgYWhjaV9wb3N0cmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgKmNsYXNzKTsKQEAgLTE3OCw2ICsxODAsMTIgQEAKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChhaGNpX29wcyk7CiAKK3N0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfcG1wX3JldHJ5X3Nyc3Rfb3BzID0geworCS5pbmhlcml0cwkJPSAmYWhjaV9vcHMsCisJLnNvZnRyZXNldAkJPSBhaGNpX3BtcF9yZXRyeV9zb2Z0cmVzZXQsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9wbXBfcmV0cnlfc3JzdF9vcHMpOworCiBpbnQgYWhjaV9lbV9tZXNzYWdlcyA9IDE7CiBFWFBPUlRfU1lNQk9MX0dQTChhaGNpX2VtX21lc3NhZ2VzKTsKIG1vZHVsZV9wYXJhbShhaGNpX2VtX21lc3NhZ2VzLCBpbnQsIDA0NDQpOwpAQCAtMjg2LDEwICsyOTQsMTAgQEAKIAkvKiB0aGUgY291bnQgc2hvdWxkIG5vdCBiZSBsYXJnZXIgdGhhbiBQQUdFX1NJWkUgKi8KIAlpZiAoY291bnQgPiBQQUdFX1NJWkUpIHsKIAkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9XQVJOSU5HLAotCQkJCQkiRU0gcmVhZCBidWZmZXIgc2l6ZSB0b28gbGFyZ2U6ICIKLQkJCQkJImJ1ZmZlciBzaXplICV1LCBwYWdlIHNpemUgJWx1XG4iLAotCQkJCQlocHJpdi0+ZW1fYnVmX3N6LCBQQUdFX1NJWkUpOworCQkJYXRhX3BvcnRfd2FybihhcCwKKwkJCQkgICAgICAiRU0gcmVhZCBidWZmZXIgc2l6ZSB0b28gbGFyZ2U6ICIKKwkJCQkgICAgICAiYnVmZmVyIHNpemUgJXUsIHBhZ2Ugc2l6ZSAlbHVcbiIsCisJCQkJICAgICAgaHByaXYtPmVtX2J1Zl9zeiwgUEFHRV9TSVpFKTsKIAkJY291bnQgPSBQQUdFX1NJWkU7CiAJfQogCkBAIC00MTAsNTEgKzQxOCw0NiBAQAogCiAJLyogc29tZSBjaGlwcyBoYXZlIGVycmF0YSBwcmV2ZW50aW5nIDY0Yml0IHVzZSAqLwogCWlmICgoY2FwICYgSE9TVF9DQVBfNjQpICYmIChocHJpdi0+ZmxhZ3MgJiBBSENJX0hGTEFHXzMyQklUX09OTFkpKSB7Ci0JCWRldl9wcmludGsoS0VSTl9JTkZPLCBkZXYsCi0JCQkgICAiY29udHJvbGxlciBjYW4ndCBkbyA2NGJpdCBETUEsIGZvcmNpbmcgMzJiaXRcbiIpOworCQlkZXZfaW5mbyhkZXYsICJjb250cm9sbGVyIGNhbid0IGRvIDY0Yml0IERNQSwgZm9yY2luZyAzMmJpdFxuIik7CiAJCWNhcCAmPSB+SE9TVF9DQVBfNjQ7CiAJfQogCiAJaWYgKChjYXAgJiBIT1NUX0NBUF9OQ1EpICYmIChocHJpdi0+ZmxhZ3MgJiBBSENJX0hGTEFHX05PX05DUSkpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sIGRldiwKLQkJCSAgICJjb250cm9sbGVyIGNhbid0IGRvIE5DUSwgdHVybmluZyBvZmYgQ0FQX05DUVxuIik7CisJCWRldl9pbmZvKGRldiwgImNvbnRyb2xsZXIgY2FuJ3QgZG8gTkNRLCB0dXJuaW5nIG9mZiBDQVBfTkNRXG4iKTsKIAkJY2FwICY9IH5IT1NUX0NBUF9OQ1E7CiAJfQogCiAJaWYgKCEoY2FwICYgSE9TVF9DQVBfTkNRKSAmJiAoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19ZRVNfTkNRKSkgewotCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgZGV2LAotCQkJICAgImNvbnRyb2xsZXIgY2FuIGRvIE5DUSwgdHVybmluZyBvbiBDQVBfTkNRXG4iKTsKKwkJZGV2X2luZm8oZGV2LCAiY29udHJvbGxlciBjYW4gZG8gTkNRLCB0dXJuaW5nIG9uIENBUF9OQ1FcbiIpOwogCQljYXAgfD0gSE9TVF9DQVBfTkNROwogCX0KIAogCWlmICgoY2FwICYgSE9TVF9DQVBfUE1QKSAmJiAoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19OT19QTVApKSB7Ci0JCWRldl9wcmludGsoS0VSTl9JTkZPLCBkZXYsCi0JCQkgICAiY29udHJvbGxlciBjYW4ndCBkbyBQTVAsIHR1cm5pbmcgb2ZmIENBUF9QTVBcbiIpOworCQlkZXZfaW5mbyhkZXYsICJjb250cm9sbGVyIGNhbid0IGRvIFBNUCwgdHVybmluZyBvZmYgQ0FQX1BNUFxuIik7CiAJCWNhcCAmPSB+SE9TVF9DQVBfUE1QOwogCX0KIAogCWlmICgoY2FwICYgSE9TVF9DQVBfU05URikgJiYgKGhwcml2LT5mbGFncyAmIEFIQ0lfSEZMQUdfTk9fU05URikpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sIGRldiwKLQkJCSAgICJjb250cm9sbGVyIGNhbid0IGRvIFNOVEYsIHR1cm5pbmcgb2ZmIENBUF9TTlRGXG4iKTsKKwkJZGV2X2luZm8oZGV2LAorCQkJICJjb250cm9sbGVyIGNhbid0IGRvIFNOVEYsIHR1cm5pbmcgb2ZmIENBUF9TTlRGXG4iKTsKIAkJY2FwICY9IH5IT1NUX0NBUF9TTlRGOwogCX0KIAogCWlmICghKGNhcCAmIEhPU1RfQ0FQX0ZCUykgJiYgKGhwcml2LT5mbGFncyAmIEFIQ0lfSEZMQUdfWUVTX0ZCUykpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sIGRldiwKLQkJCSAgICJjb250cm9sbGVyIGNhbiBkbyBGQlMsIHR1cm5pbmcgb24gQ0FQX0ZCU1xuIik7CisJCWRldl9pbmZvKGRldiwgImNvbnRyb2xsZXIgY2FuIGRvIEZCUywgdHVybmluZyBvbiBDQVBfRkJTXG4iKTsKIAkJY2FwIHw9IEhPU1RfQ0FQX0ZCUzsKIAl9CiAKIAlpZiAoZm9yY2VfcG9ydF9tYXAgJiYgcG9ydF9tYXAgIT0gZm9yY2VfcG9ydF9tYXApIHsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sIGRldiwgImZvcmNpbmcgcG9ydF9tYXAgMHgleCAtPiAweCV4XG4iLAotCQkJICAgcG9ydF9tYXAsIGZvcmNlX3BvcnRfbWFwKTsKKwkJZGV2X2luZm8oZGV2LCAiZm9yY2luZyBwb3J0X21hcCAweCV4IC0+IDB4JXhcbiIsCisJCQkgcG9ydF9tYXAsIGZvcmNlX3BvcnRfbWFwKTsKIAkJcG9ydF9tYXAgPSBmb3JjZV9wb3J0X21hcDsKIAl9CiAKIAlpZiAobWFza19wb3J0X21hcCkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBkZXYsICJtYXNraW5nIHBvcnRfbWFwIDB4JXggLT4gMHgleFxuIiwKLQkJCSAgIHBvcnRfbWFwLAotCQkJICAgcG9ydF9tYXAgJiBtYXNrX3BvcnRfbWFwKTsKKwkJZGV2X3dhcm4oZGV2LCAibWFza2luZyBwb3J0X21hcCAweCV4IC0+IDB4JXhcbiIsCisJCQlwb3J0X21hcCwKKwkJCXBvcnRfbWFwICYgbWFza19wb3J0X21hcCk7CiAJCXBvcnRfbWFwICY9IG1hc2tfcG9ydF9tYXA7CiAJfQogCkBAIC00NzAsMTAgKzQ3Myw5IEBACiAJCSAqIHBvcnRfbWFwIGFuZCBsZXQgaXQgYmUgZ2VuZXJhdGVkIGZyb20gbl9wb3J0cy4KIAkJICovCiAJCWlmIChtYXBfcG9ydHMgPiBhaGNpX25yX3BvcnRzKGNhcCkpIHsKLQkJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCBkZXYsCi0JCQkJICAgImltcGxlbWVudGVkIHBvcnQgbWFwICgweCV4KSBjb250YWlucyBtb3JlICIKLQkJCQkgICAicG9ydHMgdGhhbiBucl9wb3J0cyAoJXUpLCB1c2luZyBucl9wb3J0c1xuIiwKLQkJCQkgICBwb3J0X21hcCwgYWhjaV9ucl9wb3J0cyhjYXApKTsKKwkJCWRldl93YXJuKGRldiwKKwkJCQkgImltcGxlbWVudGVkIHBvcnQgbWFwICgweCV4KSBjb250YWlucyBtb3JlIHBvcnRzIHRoYW4gbnJfcG9ydHMgKCV1KSwgdXNpbmcgbnJfcG9ydHNcbiIsCisJCQkJIHBvcnRfbWFwLCBhaGNpX25yX3BvcnRzKGNhcCkpOwogCQkJcG9ydF9tYXAgPSAwOwogCQl9CiAJfQpAQCAtNDgxLDggKzQ4Myw3IEBACiAJLyogZmFicmljYXRlIHBvcnRfbWFwIGZyb20gY2FwLm5yX3BvcnRzICovCiAJaWYgKCFwb3J0X21hcCkgewogCQlwb3J0X21hcCA9ICgxIDw8IGFoY2lfbnJfcG9ydHMoY2FwKSkgLSAxOwotCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgZGV2LAotCQkJICAgImZvcmNpbmcgUE9SVFNfSU1QTCB0byAweCV4XG4iLCBwb3J0X21hcCk7CisJCWRldl93YXJuKGRldiwgImZvcmNpbmcgUE9SVFNfSU1QTCB0byAweCV4XG4iLCBwb3J0X21hcCk7CiAKIAkJLyogd3JpdGUgdGhlIGZpeGVkIHVwIHZhbHVlIHRvIHRoZSBQSSByZWdpc3RlciAqLwogCQlocHJpdi0+c2F2ZWRfcG9ydF9tYXAgPSBwb3J0X21hcDsKQEAgLTgyMiw4ICs4MjMsOCBAQAogCQkJCQlIT1NUX1JFU0VULCAxMCwgMTAwMCk7CiAKIAkJaWYgKHRtcCAmIEhPU1RfUkVTRVQpIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsIGhvc3QtPmRldiwKLQkJCQkgICAiY29udHJvbGxlciByZXNldCBmYWlsZWQgKDB4JXgpXG4iLCB0bXApOworCQkJZGV2X2Vycihob3N0LT5kZXYsICJjb250cm9sbGVyIHJlc2V0IGZhaWxlZCAoMHgleClcbiIsCisJCQkJdG1wKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAKQEAgLTgzNSw4ICs4MzYsNyBAQAogCQkgKi8KIAkJYWhjaV9yZXN0b3JlX2luaXRpYWxfY29uZmlnKGhvc3QpOwogCX0gZWxzZQotCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgaG9zdC0+ZGV2LAotCQkJICAgInNraXBwaW5nIGdsb2JhbCBob3N0IHJlc2V0XG4iKTsKKwkJZGV2X2luZm8oaG9zdC0+ZGV2LCAic2tpcHBpbmcgZ2xvYmFsIGhvc3QgcmVzZXRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTMyLDggKzExMzIsOCBAQAogCiAJaWYgKGhwcml2LT5mbGFncyAmIEFIQ0lfSEZMQUdfU0VDVDI1NSkgewogCQlkZXYtPm1heF9zZWN0b3JzID0gMjU1OwotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywKLQkJCSAgICAgICAiU0I2MDAgQUhDSTogbGltaXRpbmcgdG8gMjU1IHNlY3RvcnMgcGVyIGNtZFxuIik7CisJCWF0YV9kZXZfaW5mbyhkZXYsCisJCQkgICAgICJTQjYwMCBBSENJOiBsaW1pdGluZyB0byAyNTUgc2VjdG9ycyBwZXIgY21kXG4iKTsKIAl9CiB9CiAKQEAgLTEyNTcsOCArMTI1Nyw3IEBACiAJLyogcHJlcGFyZSBmb3IgU1JTVCAoQUhDSS0xLjEgMTAuNC4xKSAqLwogCXJjID0gYWhjaV9raWNrX2VuZ2luZShhcCk7CiAJaWYgKHJjICYmIHJjICE9IC1FT1BOT1RTVVBQKQotCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9XQVJOSU5HLAotCQkJCSJmYWlsZWQgdG8gcmVzZXQgZW5naW5lIChlcnJubz0lZClcbiIsIHJjKTsKKwkJYXRhX2xpbmtfd2FybihsaW5rLCAiZmFpbGVkIHRvIHJlc2V0IGVuZ2luZSAoZXJybm89JWQpXG4iLCByYyk7CiAKIAlhdGFfdGZfaW5pdChsaW5rLT5kZXZpY2UsICZ0Zik7CiAKQEAgLTEyOTEsOCArMTI5MCw3IEBACiAJCSAqIGJlIHRydXN0ZWQuICBUcmVhdCBkZXZpY2UgcmVhZGluZXNzIHRpbWVvdXQgYXMgbGluawogCQkgKiBvZmZsaW5lLgogCQkgKi8KLQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fSU5GTywKLQkJCQkiZGV2aWNlIG5vdCByZWFkeSwgdHJlYXRpbmcgYXMgb2ZmbGluZVxuIik7CisJCWF0YV9saW5rX2luZm8obGluaywgImRldmljZSBub3QgcmVhZHksIHRyZWF0aW5nIGFzIG9mZmxpbmVcbiIpOwogCQkqY2xhc3MgPSBBVEFfREVWX05PTkU7CiAJfSBlbHNlIGlmIChyYykgewogCQkvKiBsaW5rIG9jY3VwaWVkLCAtRU5PREVWIHRvbyBpcyBhbiBlcnJvciAqLwpAQCAtMTMwNSw3ICsxMzAzLDcgQEAKIAlyZXR1cm4gMDsKIAogIGZhaWw6Ci0JYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fRVJSLCAic29mdHJlc2V0IGZhaWxlZCAoJXMpXG4iLCByZWFzb24pOworCWF0YV9saW5rX2VycihsaW5rLCAic29mdHJlc2V0IGZhaWxlZCAoJXMpXG4iLCByZWFzb24pOwogCXJldHVybiByYzsKIH0KIApAQCAtMTMyOSw2ICsxMzI3LDU1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhaGNpX2RvX3NvZnRyZXNldCk7CiAKK3N0YXRpYyBpbnQgYWhjaV9iYWRfcG1wX2NoZWNrX3JlYWR5KHN0cnVjdCBhdGFfbGluayAqbGluaykKK3sKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGxpbmstPmFwKTsKKwl1OCBzdGF0dXMgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX1RGREFUQSkgJiAweEZGOworCXUzMiBpcnFfc3RhdHVzID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCk7CisKKwkvKgorCSAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgVEZEQVRBIGlmIEJBRCBQTVAgaXMgZm91bmQgZHVlIHRvIEhXIGJ1ZywKKwkgKiB3aGljaCBjYW4gc2F2ZSB0aW1lb3V0IGRlbGF5LgorCSAqLworCWlmIChpcnFfc3RhdHVzICYgUE9SVF9JUlFfQkFEX1BNUCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gYXRhX2NoZWNrX3JlYWR5KHN0YXR1cyk7Cit9CisKK2ludCBhaGNpX3BtcF9yZXRyeV9zb2Z0cmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgKmNsYXNzLAorCQkJCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UoYXApOworCWludCBwbXAgPSBzYXRhX3Nyc3RfcG1wKGxpbmspOworCWludCByYzsKKwl1MzIgaXJxX3N0czsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCXJjID0gYWhjaV9kb19zb2Z0cmVzZXQobGluaywgY2xhc3MsIHBtcCwgZGVhZGxpbmUsCisJCQkgICAgICAgYWhjaV9iYWRfcG1wX2NoZWNrX3JlYWR5KTsKKworCS8qCisJICogU29mdCByZXNldCBmYWlscyB3aXRoIElQTVMgc2V0IHdoZW4gUE1QIGlzIGVuYWJsZWQgYnV0CisJICogU0FUQSBIREQvT0REIGlzIGNvbm5lY3RlZCB0byBTQVRBIHBvcnQsIGRvIHNvZnQgcmVzZXQKKwkgKiBhZ2FpbiB0byBwb3J0IDAuCisJICovCisJaWYgKHJjID09IC1FSU8pIHsKKwkJaXJxX3N0cyA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfSVJRX1NUQVQpOworCQlpZiAoaXJxX3N0cyAmIFBPUlRfSVJRX0JBRF9QTVApIHsKKwkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX1dBUk5JTkcsCisJCQkJCSJhcHBseWluZyBQTVAgU1JTVCB3b3JrYXJvdW5kICIKKwkJCQkJImFuZCByZXRyeWluZ1xuIik7CisJCQlyYyA9IGFoY2lfZG9fc29mdHJlc2V0KGxpbmssIGNsYXNzLCAwLCBkZWFkbGluZSwKKwkJCQkJICAgICAgIGFoY2lfY2hlY2tfcmVhZHkpOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50IGFoY2lfaGFyZHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcywKIAkJCSAgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKIHsKQEAgLTE0NzQsOCArMTUyMSw3IEBACiAJfQogCiAJaWYgKGZicyAmIFBPUlRfRkJTX0RFQykKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgYXAtPmhvc3QtPmRldiwKLQkJCSAgICJmYWlsZWQgdG8gY2xlYXIgZGV2aWNlIGVycm9yXG4iKTsKKwkJZGV2X2VycihhcC0+aG9zdC0+ZGV2LCAiZmFpbGVkIHRvIGNsZWFyIGRldmljZSBlcnJvclxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIGFoY2lfZXJyb3JfaW50cihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MzIgaXJxX3N0YXQpCkBAIC0xNzEzLDggKzE3NTksOCBAQAogCQl9IGVsc2UgewogCQkJVlBSSU5USygicG9ydCAldSAobm8gaXJxKVxuIiwgaSk7CiAJCQlpZiAoYXRhX3JhdGVsaW1pdCgpKQotCQkJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCBob3N0LT5kZXYsCi0JCQkJCSJpbnRlcnJ1cHQgb24gZGlzYWJsZWQgcG9ydCAldVxuIiwgaSk7CisJCQkJZGV2X3dhcm4oaG9zdC0+ZGV2LAorCQkJCQkgImludGVycnVwdCBvbiBkaXNhYmxlZCBwb3J0ICV1XG4iLCBpKTsKIAkJfQogCiAJCWhhbmRsZWQgPSAxOwpAQCAtMTg2NSwxMSArMTkxMSwxMSBAQAogCXdyaXRlbChmYnMgfCBQT1JUX0ZCU19FTiwgcG9ydF9tbWlvICsgUE9SVF9GQlMpOwogCWZicyA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfRkJTKTsKIAlpZiAoZmJzICYgUE9SVF9GQlNfRU4pIHsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sIGFwLT5ob3N0LT5kZXYsICJGQlMgaXMgZW5hYmxlZC5cbiIpOworCQlkZXZfaW5mbyhhcC0+aG9zdC0+ZGV2LCAiRkJTIGlzIGVuYWJsZWRcbiIpOwogCQlwcC0+ZmJzX2VuYWJsZWQgPSB0cnVlOwogCQlwcC0+ZmJzX2xhc3RfZGV2ID0gLTE7IC8qIGluaXRpYWxpemF0aW9uICovCiAJfSBlbHNlCi0JCWRldl9wcmludGsoS0VSTl9FUlIsIGFwLT5ob3N0LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIEZCU1xuIik7CisJCWRldl9lcnIoYXAtPmhvc3QtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgRkJTXG4iKTsKIAogCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKIH0KQEAgLTE4OTcsOSArMTk0Myw5IEBACiAJd3JpdGVsKGZicyAmIH5QT1JUX0ZCU19FTiwgcG9ydF9tbWlvICsgUE9SVF9GQlMpOwogCWZicyA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfRkJTKTsKIAlpZiAoZmJzICYgUE9SVF9GQlNfRU4pCi0JCWRldl9wcmludGsoS0VSTl9FUlIsIGFwLT5ob3N0LT5kZXYsICJGYWlsZWQgdG8gZGlzYWJsZSBGQlNcbiIpOworCQlkZXZfZXJyKGFwLT5ob3N0LT5kZXYsICJGYWlsZWQgdG8gZGlzYWJsZSBGQlNcbiIpOwogCWVsc2UgewotCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgYXAtPmhvc3QtPmRldiwgIkZCUyBpcyBkaXNhYmxlZC5cbiIpOworCQlkZXZfaW5mbyhhcC0+aG9zdC0+ZGV2LCAiRkJTIGlzIGRpc2FibGVkXG4iKTsKIAkJcHAtPmZic19lbmFibGVkID0gZmFsc2U7CiAJfQogCkBAIC0xOTc1LDcgKzIwMjEsNyBAQAogCWlmIChyYyA9PSAwKQogCQlhaGNpX3Bvd2VyX2Rvd24oYXApOwogCWVsc2UgewotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAiJXMgKCVkKVxuIiwgZW1zZywgcmMpOworCQlhdGFfcG9ydF9lcnIoYXAsICIlcyAoJWQpXG4iLCBlbXNnLCByYyk7CiAJCWFoY2lfc3RhcnRfcG9ydChhcCk7CiAJfQogCkBAIC0yMDAzLDE0ICsyMDQ5LDEyIEBACiAJCWlmIChjbWQgJiBQT1JUX0NNRF9GQlNDUCkKIAkJCXBwLT5mYnNfc3VwcG9ydGVkID0gdHJ1ZTsKIAkJZWxzZSBpZiAoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19ZRVNfRkJTKSB7Ci0JCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgZGV2LAotCQkJCSAgICJwb3J0ICVkIGNhbiBkbyBGQlMsIGZvcmNpbmcgRkJTQ1BcbiIsCi0JCQkJICAgYXAtPnBvcnRfbm8pOworCQkJZGV2X2luZm8oZGV2LCAicG9ydCAlZCBjYW4gZG8gRkJTLCBmb3JjaW5nIEZCU0NQXG4iLAorCQkJCSBhcC0+cG9ydF9ubyk7CiAJCQlwcC0+ZmJzX3N1cHBvcnRlZCA9IHRydWU7CiAJCX0gZWxzZQotCQkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIGRldiwKLQkJCQkgICAicG9ydCAlZCBpcyBub3QgY2FwYWJsZSBvZiBGQlNcbiIsCi0JCQkJICAgYXAtPnBvcnRfbm8pOworCQkJZGV2X3dhcm4oZGV2LCAicG9ydCAlZCBpcyBub3QgY2FwYWJsZSBvZiBGQlNcbiIsCisJCQkJIGFwLT5wb3J0X25vKTsKIAl9CiAKIAlpZiAocHAtPmZic19zdXBwb3J0ZWQpIHsKQEAgLTIwNzIsNyArMjExNiw3IEBACiAJLyogZGUtaW5pdGlhbGl6ZSBwb3J0ICovCiAJcmMgPSBhaGNpX2RlaW5pdF9wb3J0KGFwLCAmZW1zZyk7CiAJaWYgKHJjKQotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywgIiVzICglZClcbiIsIGVtc2csIHJjKTsKKwkJYXRhX3BvcnRfd2FybihhcCwgIiVzICglZClcbiIsIGVtc2csIHJjKTsKIH0KIAogdm9pZCBhaGNpX3ByaW50X2luZm8oc3RydWN0IGF0YV9ob3N0ICpob3N0LCBjb25zdCBjaGFyICpzY2NfcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtYWNwaS5jCmluZGV4IGE3OTFiOGNlLi5lMGE1YjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtYWNwaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKQEAgLTMzMiwyNSArMzMyLDIyIEBACiAKIAlyYyA9IC1FSU5WQUw7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsCi0JCQkJIkFDUEkgZ2V0IHRpbWluZyBtb2RlIGZhaWxlZCAoQUUgMHgleClcbiIsCi0JCQkJc3RhdHVzKTsKKwkJYXRhX3BvcnRfZXJyKGFwLCAiQUNQSSBnZXQgdGltaW5nIG1vZGUgZmFpbGVkIChBRSAweCV4KVxuIiwKKwkJCSAgICAgc3RhdHVzKTsKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKIAlvdXRfb2JqID0gb3V0cHV0LnBvaW50ZXI7CiAJaWYgKG91dF9vYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikgewotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywKLQkJCQkiX0dUTSByZXR1cm5lZCB1bmV4cGVjdGVkIG9iamVjdCB0eXBlIDB4JXhcbiIsCi0JCQkJb3V0X29iai0+dHlwZSk7CisJCWF0YV9wb3J0X3dhcm4oYXAsICJfR1RNIHJldHVybmVkIHVuZXhwZWN0ZWQgb2JqZWN0IHR5cGUgMHgleFxuIiwKKwkJCSAgICAgIG91dF9vYmotPnR5cGUpOwogCiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJaWYgKG91dF9vYmotPmJ1ZmZlci5sZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBhdGFfYWNwaV9ndG0pKSB7Ci0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsCi0JCQkJIl9HVE0gcmV0dXJuZWQgaW52YWxpZCBsZW5ndGggJWRcbiIsCi0JCQkJb3V0X29iai0+YnVmZmVyLmxlbmd0aCk7CisJCWF0YV9wb3J0X2VycihhcCwgIl9HVE0gcmV0dXJuZWQgaW52YWxpZCBsZW5ndGggJWRcbiIsCisJCQkgICAgIG91dF9vYmotPmJ1ZmZlci5sZW5ndGgpOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIApAQCAtNDAyLDggKzM5OSw4IEBACiAJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpCiAJCXJldHVybiAtRU5PRU5UOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLAotCQkJIkFDUEkgc2V0IHRpbWluZyBtb2RlIGZhaWxlZCAoc3RhdHVzPTB4JXgpXG4iLCBzdGF0dXMpOworCQlhdGFfcG9ydF9lcnIoYXAsICJBQ1BJIHNldCB0aW1pbmcgbW9kZSBmYWlsZWQgKHN0YXR1cz0weCV4KVxuIiwKKwkJCSAgICAgc3RhdHVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpAQCAtNDUwLDggKzQ0Nyw4IEBACiAJb3V0cHV0LnBvaW50ZXIgPSBOVUxMOwkvKiBBQ1BJLUNBIHNldHMgdGhpczsgc2F2ZS9mcmVlIGl0IGxhdGVyICovCiAKIAlpZiAoYXRhX21zZ19wcm9iZShhcCkpCi0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywgIiVzOiBFTlRFUjogcG9ydCM6ICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBhcC0+cG9ydF9ubyk7CisJCWF0YV9kZXZfZGJnKGRldiwgIiVzOiBFTlRFUjogcG9ydCM6ICVkXG4iLAorCQkJICAgIF9fZnVuY19fLCBhcC0+cG9ydF9ubyk7CiAKIAkvKiBfR1RGIGhhcyBubyBpbnB1dCBwYXJhbWV0ZXJzICovCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoZGV2LT5hY3BpX2hhbmRsZSwgIl9HVEYiLCBOVUxMLCAmb3V0cHV0KTsKQEAgLTQ1OSw5ICs0NTYsOCBAQAogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywKLQkJCQkgICAgICAgIl9HVEYgZXZhbHVhdGlvbiBmYWlsZWQgKEFFIDB4JXgpXG4iLAotCQkJCSAgICAgICBzdGF0dXMpOworCQkJYXRhX2Rldl93YXJuKGRldiwgIl9HVEYgZXZhbHVhdGlvbiBmYWlsZWQgKEFFIDB4JXgpXG4iLAorCQkJCSAgICAgc3RhdHVzKTsKIAkJCXJjID0gLUVJTlZBTDsKIAkJfQogCQlnb3RvIG91dF9mcmVlOwpAQCAtNDY5LDI3ICs0NjUsMjQgQEAKIAogCWlmICghb3V0cHV0Lmxlbmd0aCB8fCAhb3V0cHV0LnBvaW50ZXIpIHsKIAkJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQotCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLCAiJXM6IFJ1biBfR1RGOiAiCi0JCQkJImxlbmd0aCBvciBwdHIgaXMgTlVMTCAoMHglbGx4LCAweCVwKVxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKW91dHB1dC5sZW5ndGgsCi0JCQkJb3V0cHV0LnBvaW50ZXIpOworCQkJYXRhX2Rldl9kYmcoZGV2LCAiJXM6IFJ1biBfR1RGOiBsZW5ndGggb3IgcHRyIGlzIE5VTEwgKDB4JWxseCwgMHglcClcbiIsCisJCQkJICAgIF9fZnVuY19fLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW91dHB1dC5sZW5ndGgsCisJCQkJICAgIG91dHB1dC5wb2ludGVyKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIAogCWlmIChvdXRfb2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCi0JCQkgICAgICAgIl9HVEYgdW5leHBlY3RlZCBvYmplY3QgdHlwZSAweCV4XG4iLAotCQkJICAgICAgIG91dF9vYmotPnR5cGUpOworCQlhdGFfZGV2X3dhcm4oZGV2LCAiX0dURiB1bmV4cGVjdGVkIG9iamVjdCB0eXBlIDB4JXhcbiIsCisJCQkgICAgIG91dF9vYmotPnR5cGUpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJaWYgKG91dF9vYmotPmJ1ZmZlci5sZW5ndGggJSBSRUdTX1BFUl9HVEYpIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCi0JCQkgICAgICAgInVuZXhwZWN0ZWQgX0dURiBsZW5ndGggKCVkKVxuIiwKLQkJCSAgICAgICBvdXRfb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJYXRhX2Rldl93YXJuKGRldiwgInVuZXhwZWN0ZWQgX0dURiBsZW5ndGggKCVkKVxuIiwKKwkJCSAgICAgb3V0X29iai0+YnVmZmVyLmxlbmd0aCk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXRfZnJlZTsKIAl9CkBAIC00OTksOSArNDkyLDggQEAKIAlpZiAoZ3RmKSB7CiAJCSpndGYgPSAodm9pZCAqKW91dF9vYmotPmJ1ZmZlci5wb2ludGVyOwogCQlpZiAoYXRhX21zZ19wcm9iZShhcCkpCi0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsCi0JCQkJICAgICAgICIlczogcmV0dXJuaW5nIGd0Zj0lcCwgZ3RmX2NvdW50PSVkXG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXywgKmd0ZiwgcmMpOworCQkJYXRhX2Rldl9kYmcoZGV2LCAiJXM6IHJldHVybmluZyBndGY9JXAsIGd0Zl9jb3VudD0lZFxuIiwKKwkJCQkgICAgX19mdW5jX18sICpndGYsIHJjKTsKIAl9CiAJcmV0dXJuIHJjOwogCkBAIC04MTEsOCArODAzLDggQEAKIAl1bmlvbiBhY3BpX29iamVjdCBpbl9wYXJhbXNbMV07CiAKIAlpZiAoYXRhX21zZ19wcm9iZShhcCkpCi0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywgIiVzOiBpeCA9ICVkLCBwb3J0IzogJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGRldi0+ZGV2bm8sIGFwLT5wb3J0X25vKTsKKwkJYXRhX2Rldl9kYmcoZGV2LCAiJXM6IGl4ID0gJWQsIHBvcnQjOiAlZFxuIiwKKwkJCSAgICBfX2Z1bmNfXywgZGV2LT5kZXZubywgYXAtPnBvcnRfbm8pOwogCiAJLyogR2l2ZSB0aGUgZHJpdmUgSWRlbnRpZnkgZGF0YSB0byB0aGUgZHJpdmUgdmlhIHRoZSBfU0REIG1ldGhvZCAqLwogCS8qIF9TREQ6IHNldCB1cCBpbnB1dCBwYXJhbWV0ZXJzICovCkBAIC04MzIsOCArODI0LDcgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCi0JCQkgICAgICAgIkFDUEkgX1NERCBmYWlsZWQgKEFFIDB4JXgpXG4iLCBzdGF0dXMpOworCQlhdGFfZGV2X3dhcm4oZGV2LCAiQUNQSSBfU0REIGZhaWxlZCAoQUUgMHgleClcbiIsIHN0YXR1cyk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtOTgzLDggKzk3NCw4IEBACiAJaWYgKG5yX2V4ZWN1dGVkKSB7CiAJCXJjID0gYXRhX2Rldl9yZXJlYWRfaWQoZGV2LCAwKTsKIAkJaWYgKHJjIDwgMCkgewotCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0VSUiwgImZhaWxlZCB0byBJREVOVElGWSAiCi0JCQkJICAgICAgICJhZnRlciBBQ1BJIGNvbW1hbmRzXG4iKTsKKwkJCWF0YV9kZXZfZXJyKGRldiwKKwkJCQkgICAgImZhaWxlZCB0byBJREVOVElGWSBhZnRlciBBQ1BJIGNvbW1hbmRzXG4iKTsKIAkJCXJldHVybiByYzsKIAkJfQogCX0KQEAgLTEwMDIsOCArOTkzLDcgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLAotCQkgICAgICAgIkFDUEk6IGZhaWxlZCB0aGUgc2Vjb25kIHRpbWUsIGRpc2FibGVkXG4iKTsKKwlhdGFfZGV2X3dhcm4oZGV2LCAiQUNQSTogZmFpbGVkIHRoZSBzZWNvbmQgdGltZSwgZGlzYWJsZWRcbiIpOwogCWRldi0+YWNwaV9oYW5kbGUgPSBOVUxMOwogCiAJLyogV2UgY2FuIHNhZmVseSBjb250aW51ZSBpZiBubyBfR1RGIGNvbW1hbmQgaGFzIGJlZW4gZXhlY3V0ZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCmluZGV4IDczNmJlZTUuLjRhM2E1YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwpAQCAtMzM1LDggKzMzNSw3IEBACiAJCQljb250aW51ZTsKIAogCQlhcC0+Y2JsID0gZmUtPnBhcmFtLmNibDsKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX05PVElDRSwKLQkJCQkiRk9SQ0U6IGNhYmxlIHNldCB0byAlc1xuIiwgZmUtPnBhcmFtLm5hbWUpOworCQlhdGFfcG9ydF9ub3RpY2UoYXAsICJGT1JDRTogY2FibGUgc2V0IHRvICVzXG4iLCBmZS0+cGFyYW0ubmFtZSk7CiAJCXJldHVybjsKIAl9CiB9CkBAIC0zNzgsOCArMzc3LDcgQEAKIAkJLyogb25seSBob25vciB0aGUgZmlyc3Qgc3BkIGxpbWl0ICovCiAJCWlmICghZGlkX3NwZCAmJiBmZS0+cGFyYW0uc3BkX2xpbWl0KSB7CiAJCQlsaW5rLT5od19zYXRhX3NwZF9saW1pdCA9ICgxIDw8IGZlLT5wYXJhbS5zcGRfbGltaXQpIC0gMTsKLQkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX05PVElDRSwKLQkJCQkJIkZPUkNFOiBQSFkgc3BkIGxpbWl0IHNldCB0byAlc1xuIiwKKwkJCWF0YV9saW5rX25vdGljZShsaW5rLCAiRk9SQ0U6IFBIWSBzcGQgbGltaXQgc2V0IHRvICVzXG4iLAogCQkJCQlmZS0+cGFyYW0ubmFtZSk7CiAJCQlkaWRfc3BkID0gdHJ1ZTsKIAkJfQpAQCAtMzg3LDcgKzM4NSw3IEBACiAJCS8qIGxldCBsZmxhZ3Mgc3RhY2sgKi8KIAkJaWYgKGZlLT5wYXJhbS5sZmxhZ3MpIHsKIAkJCWxpbmstPmZsYWdzIHw9IGZlLT5wYXJhbS5sZmxhZ3M7Ci0JCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9OT1RJQ0UsCisJCQlhdGFfbGlua19ub3RpY2UobGluaywKIAkJCQkJIkZPUkNFOiBsaW5rIGZsYWcgMHgleCBmb3JjZWQgLT4gMHgleFxuIiwKIAkJCQkJZmUtPnBhcmFtLmxmbGFncywgbGluay0+ZmxhZ3MpOwogCQl9CkBAIC00NDIsOCArNDQwLDggQEAKIAkJCWRldi0+cGlvX21hc2sgPSBwaW9fbWFzazsKIAkJfQogCi0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9OT1RJQ0UsCi0JCQkiRk9SQ0U6IHhmZXJfbWFzayBzZXQgdG8gJXNcbiIsIGZlLT5wYXJhbS5uYW1lKTsKKwkJYXRhX2Rldl9ub3RpY2UoZGV2LCAiRk9SQ0U6IHhmZXJfbWFzayBzZXQgdG8gJXNcbiIsCisJCQkgICAgICAgZmUtPnBhcmFtLm5hbWUpOwogCQlyZXR1cm47CiAJfQogfQpAQCAtNDg2LDggKzQ4NCw4IEBACiAJCWRldi0+aG9ya2FnZSB8PSBmZS0+cGFyYW0uaG9ya2FnZV9vbjsKIAkJZGV2LT5ob3JrYWdlICY9IH5mZS0+cGFyYW0uaG9ya2FnZV9vZmY7CiAKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX05PVElDRSwKLQkJCSJGT1JDRTogaG9ya2FnZSBtb2RpZmllZCAoJXMpXG4iLCBmZS0+cGFyYW0ubmFtZSk7CisJCWF0YV9kZXZfbm90aWNlKGRldiwgIkZPUkNFOiBob3JrYWdlIG1vZGlmaWVkICglcylcbiIsCisJCQkgICAgICAgZmUtPnBhcmFtLm5hbWUpOwogCX0KIH0KIApAQCAtNzExLDggKzcwOSw4IEBACiAJCXNlY3QgPSB0Zi0+bGJhbDsKIAogCQlpZiAoIXNlY3QpIHsKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCAiZGV2aWNlIHJlcG9ydGVkICIKLQkJCQkgICAgICAgImludmFsaWQgQ0hTIHNlY3RvciAwXG4iKTsKKwkJCWF0YV9kZXZfd2FybihkZXYsCisJCQkJICAgICAiZGV2aWNlIHJlcG9ydGVkIGludmFsaWQgQ0hTIHNlY3RvciAwXG4iKTsKIAkJCXNlY3QgPSAxOyAvKiBvaCB3ZWxsICovCiAJCX0KIApAQCAtMTIzMCw4ICsxMjI4LDkgQEAKIAogCWVycl9tYXNrID0gYXRhX2V4ZWNfaW50ZXJuYWwoZGV2LCAmdGYsIE5VTEwsIERNQV9OT05FLCBOVUxMLCAwLCAwKTsKIAlpZiAoZXJyX21hc2spIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsICJmYWlsZWQgdG8gcmVhZCBuYXRpdmUgIgotCQkJICAgICAgICJtYXggYWRkcmVzcyAoZXJyX21hc2s9MHgleClcbiIsIGVycl9tYXNrKTsKKwkJYXRhX2Rldl93YXJuKGRldiwKKwkJCSAgICAgImZhaWxlZCB0byByZWFkIG5hdGl2ZSBtYXggYWRkcmVzcyAoZXJyX21hc2s9MHgleClcbiIsCisJCQkgICAgIGVycl9tYXNrKTsKIAkJaWYgKGVycl9tYXNrID09IEFDX0VSUl9ERVYgJiYgKHRmLmZlYXR1cmUgJiBBVEFfQUJPUlRFRCkpCiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJcmV0dXJuIC1FSU87CkBAIC0xMjkyLDggKzEyOTEsOSBAQAogCiAJZXJyX21hc2sgPSBhdGFfZXhlY19pbnRlcm5hbChkZXYsICZ0ZiwgTlVMTCwgRE1BX05PTkUsIE5VTEwsIDAsIDApOwogCWlmIChlcnJfbWFzaykgewotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywgImZhaWxlZCB0byBzZXQgIgotCQkJICAgICAgICJtYXggYWRkcmVzcyAoZXJyX21hc2s9MHgleClcbiIsIGVycl9tYXNrKTsKKwkJYXRhX2Rldl93YXJuKGRldiwKKwkJCSAgICAgImZhaWxlZCB0byBzZXQgbWF4IGFkZHJlc3MgKGVycl9tYXNrPTB4JXgpXG4iLAorCQkJICAgICBlcnJfbWFzayk7CiAJCWlmIChlcnJfbWFzayA9PSBBQ19FUlJfREVWICYmCiAJCSAgICAodGYuZmVhdHVyZSAmIChBVEFfQUJPUlRFRCB8IEFUQV9JRE5GKSkpCiAJCQlyZXR1cm4gLUVBQ0NFUzsKQEAgLTEzMzYsOCArMTMzNiw4IEBACiAJCSAqIGJlIHVubG9ja2VkLCBza2lwIEhQQSByZXNpemluZy4KIAkJICovCiAJCWlmIChyYyA9PSAtRUFDQ0VTIHx8ICF1bmxvY2tfaHBhKSB7Ci0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywgIkhQQSBzdXBwb3J0IHNlZW1zICIKLQkJCQkgICAgICAgImJyb2tlbiwgc2tpcHBpbmcgSFBBIGhhbmRsaW5nXG4iKTsKKwkJCWF0YV9kZXZfd2FybihkZXYsCisJCQkJICAgICAiSFBBIHN1cHBvcnQgc2VlbXMgYnJva2VuLCBza2lwcGluZyBIUEEgaGFuZGxpbmdcbiIpOwogCQkJZGV2LT5ob3JrYWdlIHw9IEFUQV9IT1JLQUdFX0JST0tFTl9IUEE7CiAKIAkJCS8qIHdlIGNhbiBjb250aW51ZSBpZiBkZXZpY2UgYWJvcnRlZCB0aGUgY29tbWFuZCAqLwpAQCAtMTM1NSwxNCArMTM1NSwxMyBAQAogCQkJcmV0dXJuIDA7CiAKIAkJaWYgKG5hdGl2ZV9zZWN0b3JzID4gc2VjdG9ycykKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLAorCQkJYXRhX2Rldl9pbmZvKGRldiwKIAkJCQkiSFBBIGRldGVjdGVkOiBjdXJyZW50ICVsbHUsIG5hdGl2ZSAlbGx1XG4iLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9ycywKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKW5hdGl2ZV9zZWN0b3JzKTsKIAkJZWxzZSBpZiAobmF0aXZlX3NlY3RvcnMgPCBzZWN0b3JzKQotCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCi0JCQkJIm5hdGl2ZSBzZWN0b3JzICglbGx1KSBpcyBzbWFsbGVyIHRoYW4gIgotCQkJCSJzZWN0b3JzICglbGx1KVxuIiwKKwkJCWF0YV9kZXZfd2FybihkZXYsCisJCQkJIm5hdGl2ZSBzZWN0b3JzICglbGx1KSBpcyBzbWFsbGVyIHRoYW4gc2VjdG9ycyAoJWxsdSlcbiIsCiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyluYXRpdmVfc2VjdG9ycywKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvcnMpOwogCQlyZXR1cm4gMDsKQEAgLTEzNzIsMTAgKzEzNzEsMTAgQEAKIAlyYyA9IGF0YV9zZXRfbWF4X3NlY3RvcnMoZGV2LCBuYXRpdmVfc2VjdG9ycyk7CiAJaWYgKHJjID09IC1FQUNDRVMpIHsKIAkJLyogaWYgZGV2aWNlIGFib3J0ZWQgdGhlIGNvbW1hbmQsIHNraXAgSFBBIHJlc2l6aW5nICovCi0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCAiZGV2aWNlIGFib3J0ZWQgcmVzaXplICIKLQkJCSAgICAgICAiKCVsbHUgLT4gJWxsdSksIHNraXBwaW5nIEhQQSBoYW5kbGluZ1xuIiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvcnMsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluYXRpdmVfc2VjdG9ycyk7CisJCWF0YV9kZXZfd2FybihkZXYsCisJCQkgICAgICJkZXZpY2UgYWJvcnRlZCByZXNpemUgKCVsbHUgLT4gJWxsdSksIHNraXBwaW5nIEhQQSBoYW5kbGluZ1xuIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3JzLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKW5hdGl2ZV9zZWN0b3JzKTsKIAkJZGV2LT5ob3JrYWdlIHw9IEFUQV9IT1JLQUdFX0JST0tFTl9IUEE7CiAJCXJldHVybiAwOwogCX0gZWxzZSBpZiAocmMpCkBAIC0xMzg0LDE0ICsxMzgzLDE0IEBACiAJLyogcmUtcmVhZCBJREVOVElGWSBkYXRhICovCiAJcmMgPSBhdGFfZGV2X3JlcmVhZF9pZChkZXYsIDApOwogCWlmIChyYykgewotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIHJlLXJlYWQgSURFTlRJRlkgIgotCQkJICAgICAgICJkYXRhIGFmdGVyIEhQQSByZXNpemluZ1xuIik7CisJCWF0YV9kZXZfZXJyKGRldiwKKwkJCSAgICAiZmFpbGVkIHRvIHJlLXJlYWQgSURFTlRJRlkgZGF0YSBhZnRlciBIUEEgcmVzaXppbmdcbiIpOwogCQlyZXR1cm4gcmM7CiAJfQogCiAJaWYgKHByaW50X2luZm8pIHsKIAkJdTY0IG5ld19zZWN0b3JzID0gYXRhX2lkX25fc2VjdG9ycyhkZXYtPmlkKTsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sCisJCWF0YV9kZXZfaW5mbyhkZXYsCiAJCQkiSFBBIHVubG9ja2VkOiAlbGx1IC0+ICVsbHUsIG5hdGl2ZSAlbGx1XG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3JzLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyluZXdfc2VjdG9ycywKQEAgLTE2NTUsOCArMTY1NCw4IEBACiAJCQkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKIAogCQkJaWYgKGF0YV9tc2dfd2FybihhcCkpCi0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCi0JCQkJCSJxYyB0aW1lb3V0IChjbWQgMHgleClcbiIsIGNvbW1hbmQpOworCQkJCWF0YV9kZXZfd2FybihkZXYsICJxYyB0aW1lb3V0IChjbWQgMHgleClcbiIsCisJCQkJCSAgICAgY29tbWFuZCk7CiAJCX0KIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CkBAIC0xODcwLDcgKzE4NjksNyBAQAogCWludCByYzsKIAogCWlmIChhdGFfbXNnX2N0bChhcCkpCi0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywgIiVzOiBFTlRFUlxuIiwgX19mdW5jX18pOworCQlhdGFfZGV2X2RiZyhkZXYsICIlczogRU5URVJcbiIsIF9fZnVuY19fKTsKIAogcmV0cnk6CiAJYXRhX3RmX2luaXQoZGV2LCAmdGYpOwpAQCAtMTkwOSwxNCArMTkwOCwxMyBAQAogCiAJaWYgKGVycl9tYXNrKSB7CiAJCWlmIChlcnJfbWFzayAmIEFDX0VSUl9OT0RFVl9ISU5UKSB7Ci0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsCi0JCQkJICAgICAgICJOT0RFViBhZnRlciBwb2xsaW5nIGRldGVjdGlvblxuIik7CisJCQlhdGFfZGV2X2RiZyhkZXYsICJOT0RFViBhZnRlciBwb2xsaW5nIGRldGVjdGlvblxuIik7CiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJfQogCiAJCWlmIChpc19zZW1iKSB7Ci0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgIklERU5USUZZIGZhaWxlZCBvbiAiCi0JCQkJICAgICAgICJkZXZpY2Ugdy8gU0VNQiBzaWcsIGRpc2FibGVkXG4iKTsKKwkJCWF0YV9kZXZfaW5mbyhkZXYsCisJCSAgICAgIklERU5USUZZIGZhaWxlZCBvbiBkZXZpY2Ugdy8gU0VNQiBzaWcsIGRpc2FibGVkXG4iKTsKIAkJCS8qIFNFTUIgaXMgbm90IHN1cHBvcnRlZCB5ZXQgKi8KIAkJCSpwX2NsYXNzID0gQVRBX0RFVl9TRU1CX1VOU1VQOwogCQkJcmV0dXJuIDA7CkBAIC0xOTQyLDggKzE5NDAsOCBAQAogCQkJICogYm90aCBmbGF2b3JzIG9mIElERU5USUZZcyB3aGljaCBoYXBwZW5zCiAJCQkgKiBzb21ldGltZXMgd2l0aCBwaGFudG9tIGRldmljZXMuCiAJCQkgKi8KLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywKLQkJCQkgICAgICAgImJvdGggSURFTlRJRllzIGFib3J0ZWQsIGFzc3VtaW5nIE5PREVWXG4iKTsKKwkJCWF0YV9kZXZfZGJnKGRldiwKKwkJCQkgICAgImJvdGggSURFTlRJRllzIGFib3J0ZWQsIGFzc3VtaW5nIE5PREVWXG4iKTsKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9CiAKQEAgLTE5NTMsOSArMTk1MSw5IEBACiAJfQogCiAJaWYgKGRldi0+aG9ya2FnZSAmIEFUQV9IT1JLQUdFX0RVTVBfSUQpIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLCAiZHVtcGluZyBJREVOVElGWSBkYXRhLCAiCi0JCQkgICAgICAgImNsYXNzPSVkIG1heV9mYWxsYmFjaz0lZCB0cmllZF9zcGludXA9JWRcbiIsCi0JCQkgICAgICAgY2xhc3MsIG1heV9mYWxsYmFjaywgdHJpZWRfc3BpbnVwKTsKKwkJYXRhX2Rldl9kYmcoZGV2LCAiZHVtcGluZyBJREVOVElGWSBkYXRhLCAiCisJCQkgICAgImNsYXNzPSVkIG1heV9mYWxsYmFjaz0lZCB0cmllZF9zcGludXA9JWRcbiIsCisJCQkgICAgY2xhc3MsIG1heV9mYWxsYmFjaywgdHJpZWRfc3BpbnVwKTsKIAkJcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgIiIsIERVTVBfUFJFRklYX09GRlNFVCwKIAkJCSAgICAgICAxNiwgMiwgaWQsIEFUQV9JRF9XT1JEUyAqIHNpemVvZigqaWQpLCB0cnVlKTsKIAl9CkBAIC0yMDM0LDggKzIwMzIsOCBAQAogCiAgZXJyX291dDoKIAlpZiAoYXRhX21zZ193YXJuKGFwKSkKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsICJmYWlsZWQgdG8gSURFTlRJRlkgIgotCQkJICAgICAgICIoJXMsIGVycl9tYXNrPTB4JXgpXG4iLCByZWFzb24sIGVycl9tYXNrKTsKKwkJYXRhX2Rldl93YXJuKGRldiwgImZhaWxlZCB0byBJREVOVElGWSAoJXMsIGVycl9tYXNrPTB4JXgpXG4iLAorCQkJICAgICByZWFzb24sIGVycl9tYXNrKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTIwNjUsOSArMjA2Myw4IEBACiAJICogZ3VhcmFudGVlZCBieSBzZXR0aW5nIHNhdGFfc3BkX2xpbWl0IHRvIHRhcmdldF9saW1pdCBhYm92ZS4KIAkgKi8KIAlpZiAocGxpbmstPnNhdGFfc3BkID4gdGFyZ2V0KSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLAotCQkJICAgICAgICJhcHBseWluZyBsaW5rIHNwZWVkIGxpbWl0IGhvcmthZ2UgdG8gJXNcbiIsCi0JCQkgICAgICAgc2F0YV9zcGRfc3RyaW5nKHRhcmdldCkpOworCQlhdGFfZGV2X2luZm8oZGV2LCAiYXBwbHlpbmcgbGluayBzcGVlZCBsaW1pdCBob3JrYWdlIHRvICVzXG4iLAorCQkJICAgICBzYXRhX3NwZF9zdHJpbmcodGFyZ2V0KSk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAlyZXR1cm4gMDsKQEAgLTIxMTAsOCArMjEwNyw5IEBACiAJCWVycl9tYXNrID0gYXRhX2Rldl9zZXRfZmVhdHVyZShkZXYsIFNFVEZFQVRVUkVTX1NBVEFfRU5BQkxFLAogCQkJU0FUQV9GUERNQV9BQSk7CiAJCWlmIChlcnJfbWFzaykgewotCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0VSUiwgImZhaWxlZCB0byBlbmFibGUgQUEiCi0JCQkJIihlcnJvcl9tYXNrPTB4JXgpXG4iLCBlcnJfbWFzayk7CisJCQlhdGFfZGV2X2VycihkZXYsCisJCQkJICAgICJmYWlsZWQgdG8gZW5hYmxlIEFBIChlcnJvcl9tYXNrPTB4JXgpXG4iLAorCQkJCSAgICBlcnJfbWFzayk7CiAJCQlpZiAoZXJyX21hc2sgIT0gQUNfRVJSX0RFVikgewogCQkJCWRldi0+aG9ya2FnZSB8PSBBVEFfSE9SS0FHRV9CUk9LRU5fRlBETUFfQUE7CiAJCQkJcmV0dXJuIC1FSU87CkBAIC0yMTU0LDMxICsyMTUyLDI4IEBACiAJaW50IHJjOwogCiAJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSAmJiBhdGFfbXNnX2luZm8oYXApKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiJXM6IEVOVEVSL0VYSVQgLS0gbm9kZXZcbiIsCi0JCQkgICAgICAgX19mdW5jX18pOworCQlhdGFfZGV2X2luZm8oZGV2LCAiJXM6IEVOVEVSL0VYSVQgLS0gbm9kZXZcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsICIlczogRU5URVJcbiIsIF9fZnVuY19fKTsKKwkJYXRhX2Rldl9kYmcoZGV2LCAiJXM6IEVOVEVSXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBzZXQgaG9ya2FnZSAqLwogCWRldi0+aG9ya2FnZSB8PSBhdGFfZGV2X2JsYWNrbGlzdGVkKGRldik7CiAJYXRhX2ZvcmNlX2hvcmthZ2UoZGV2KTsKIAogCWlmIChkZXYtPmhvcmthZ2UgJiBBVEFfSE9SS0FHRV9ESVNBQkxFKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLAotCQkJICAgICAgICJ1bnN1cHBvcnRlZCBkZXZpY2UsIGRpc2FibGluZ1xuIik7CisJCWF0YV9kZXZfaW5mbyhkZXYsICJ1bnN1cHBvcnRlZCBkZXZpY2UsIGRpc2FibGluZ1xuIik7CiAJCWF0YV9kZXZfZGlzYWJsZShkZXYpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoKCFhdGFwaV9lbmFibGVkIHx8IChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19OT19BVEFQSSkpICYmCiAJICAgIGRldi0+Y2xhc3MgPT0gQVRBX0RFVl9BVEFQSSkgewotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywKLQkJCSJXQVJOSU5HOiBBVEFQSSBpcyAlcywgZGV2aWNlIGlnbm9yZWQuXG4iLAotCQkJYXRhcGlfZW5hYmxlZCA/ICJub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBkcml2ZXIiCi0JCQkJICAgICAgOiAiZGlzYWJsZWQiKTsKKwkJYXRhX2Rldl93YXJuKGRldiwgIldBUk5JTkc6IEFUQVBJIGlzICVzLCBkZXZpY2UgaWdub3JlZFxuIiwKKwkJCSAgICAgYXRhcGlfZW5hYmxlZCA/ICJub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBkcml2ZXIiCisJCQkgICAgIDogImRpc2FibGVkIik7CiAJCWF0YV9kZXZfZGlzYWJsZShkZXYpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yMTk5LDEyICsyMTk0LDEyIEBACiAKIAkvKiBwcmludCBkZXZpY2UgY2FwYWJpbGl0aWVzICovCiAJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsCi0JCQkgICAgICAgIiVzOiBjZmcgNDk6JTA0eCA4MjolMDR4IDgzOiUwNHggODQ6JTA0eCAiCi0JCQkgICAgICAgIjg1OiUwNHggODY6JTA0eCA4NzolMDR4IDg4OiUwNHhcbiIsCi0JCQkgICAgICAgX19mdW5jX18sCi0JCQkgICAgICAgaWRbNDldLCBpZFs4Ml0sIGlkWzgzXSwgaWRbODRdLAotCQkJICAgICAgIGlkWzg1XSwgaWRbODZdLCBpZFs4N10sIGlkWzg4XSk7CisJCWF0YV9kZXZfZGJnKGRldiwKKwkJCSAgICAiJXM6IGNmZyA0OTolMDR4IDgyOiUwNHggODM6JTA0eCA4NDolMDR4ICIKKwkJCSAgICAiODU6JTA0eCA4NjolMDR4IDg3OiUwNHggODg6JTA0eFxuIiwKKwkJCSAgICBfX2Z1bmNfXywKKwkJCSAgICBpZFs0OV0sIGlkWzgyXSwgaWRbODNdLCBpZFs4NF0sCisJCQkgICAgaWRbODVdLCBpZFs4Nl0sIGlkWzg3XSwgaWRbODhdKTsKIAogCS8qIGluaXRpYWxpemUgdG8tYmUtY29uZmlndXJlZCBwYXJhbWV0ZXJzICovCiAJZGV2LT5mbGFncyAmPSB+QVRBX0RGTEFHX0NGR19NQVNLOwpAQCAtMjIzOCwxNyArMjIzMywxNSBAQAogCQlpZiAoYXRhX2lkX2lzX2NmYShpZCkpIHsKIAkJCS8qIENQUk0gbWF5IG1ha2UgdGhpcyBtZWRpYSB1bnVzYWJsZSAqLwogCQkJaWYgKGlkW0FUQV9JRF9DRkFfS0VZX01HTVRdICYgMSkKLQkJCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywKLQkJCQkJICAgICAgICJzdXBwb3J0cyBEUk0gZnVuY3Rpb25zIGFuZCBtYXkgIgotCQkJCQkgICAgICAgIm5vdCBiZSBmdWxseSBhY2Nlc3NpYmxlLlxuIik7CisJCQkJYXRhX2Rldl93YXJuKGRldiwKKwkic3VwcG9ydHMgRFJNIGZ1bmN0aW9ucyBhbmQgbWF5IG5vdCBiZSBmdWxseSBhY2Nlc3NpYmxlXG4iKTsKIAkJCXNucHJpbnRmKHJldmJ1ZiwgNywgIkNGQSIpOwogCQl9IGVsc2UgewogCQkJc25wcmludGYocmV2YnVmLCA3LCAiQVRBLSVkIiwgYXRhX2lkX21ham9yX3ZlcnNpb24oaWQpKTsKIAkJCS8qIFdhcm4gdGhlIHVzZXIgaWYgdGhlIGRldmljZSBoYXMgVFBNIGV4dGVuc2lvbnMgKi8KIAkJCWlmIChhdGFfaWRfaGFzX3RwbShpZCkpCi0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCi0JCQkJCSAgICAgICAic3VwcG9ydHMgRFJNIGZ1bmN0aW9ucyBhbmQgbWF5ICIKLQkJCQkJICAgICAgICJub3QgYmUgZnVsbHkgYWNjZXNzaWJsZS5cbiIpOworCQkJCWF0YV9kZXZfd2FybihkZXYsCisJInN1cHBvcnRzIERSTSBmdW5jdGlvbnMgYW5kIG1heSBub3QgYmUgZnVsbHkgYWNjZXNzaWJsZVxuIik7CiAJCX0KIAogCQlkZXYtPm5fc2VjdG9ycyA9IGF0YV9pZF9uX3NlY3RvcnMoaWQpOwpAQCAtMjI4NSwxMiArMjI3OCwxMSBAQAogCiAJCQkvKiBwcmludCBkZXZpY2UgaW5mbyB0byBkbWVzZyAqLwogCQkJaWYgKGF0YV9tc2dfZHJ2KGFwKSAmJiBwcmludF9pbmZvKSB7Ci0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sCi0JCQkJCSIlczogJXMsICVzLCBtYXggJXNcbiIsCi0JCQkJCXJldmJ1ZiwgbW9kZWxidWYsIGZ3cmV2YnVmLAotCQkJCQlhdGFfbW9kZV9zdHJpbmcoeGZlcl9tYXNrKSk7Ci0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sCi0JCQkJCSIlTHUgc2VjdG9ycywgbXVsdGkgJXU6ICVzICVzXG4iLAorCQkJCWF0YV9kZXZfaW5mbyhkZXYsICIlczogJXMsICVzLCBtYXggJXNcbiIsCisJCQkJCSAgICAgcmV2YnVmLCBtb2RlbGJ1ZiwgZndyZXZidWYsCisJCQkJCSAgICAgYXRhX21vZGVfc3RyaW5nKHhmZXJfbWFzaykpOworCQkJCWF0YV9kZXZfaW5mbyhkZXYsCisJCQkJCSAgICAgIiVsbHUgc2VjdG9ycywgbXVsdGkgJXU6ICVzICVzXG4iLAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRldi0+bl9zZWN0b3JzLAogCQkJCQlkZXYtPm11bHRpX2NvdW50LCBsYmFfZGVzYywgbmNxX2Rlc2MpOwogCQkJfQpAQCAtMjMxMSwxNSArMjMwMywxNCBAQAogCiAJCQkvKiBwcmludCBkZXZpY2UgaW5mbyB0byBkbWVzZyAqLwogCQkJaWYgKGF0YV9tc2dfZHJ2KGFwKSAmJiBwcmludF9pbmZvKSB7Ci0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sCi0JCQkJCSIlczogJXMsICVzLCBtYXggJXNcbiIsCi0JCQkJCXJldmJ1ZiwJbW9kZWxidWYsIGZ3cmV2YnVmLAotCQkJCQlhdGFfbW9kZV9zdHJpbmcoeGZlcl9tYXNrKSk7Ci0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sCi0JCQkJCSIlTHUgc2VjdG9ycywgbXVsdGkgJXUsIENIUyAldS8ldS8ldVxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPm5fc2VjdG9ycywKLQkJCQkJZGV2LT5tdWx0aV9jb3VudCwgZGV2LT5jeWxpbmRlcnMsCi0JCQkJCWRldi0+aGVhZHMsIGRldi0+c2VjdG9ycyk7CisJCQkJYXRhX2Rldl9pbmZvKGRldiwgIiVzOiAlcywgJXMsIG1heCAlc1xuIiwKKwkJCQkJICAgICByZXZidWYsCW1vZGVsYnVmLCBmd3JldmJ1ZiwKKwkJCQkJICAgICBhdGFfbW9kZV9zdHJpbmcoeGZlcl9tYXNrKSk7CisJCQkJYXRhX2Rldl9pbmZvKGRldiwKKwkJCQkJICAgICAiJWxsdSBzZWN0b3JzLCBtdWx0aSAldSwgQ0hTICV1LyV1LyV1XG4iLAorCQkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5uX3NlY3RvcnMsCisJCQkJCSAgICAgZGV2LT5tdWx0aV9jb3VudCwgZGV2LT5jeWxpbmRlcnMsCisJCQkJCSAgICAgZGV2LT5oZWFkcywgZGV2LT5zZWN0b3JzKTsKIAkJCX0KIAkJfQogCkBAIC0yMzM2LDggKzIzMjcsNyBAQAogCQlyYyA9IGF0YXBpX2NkYl9sZW4oaWQpOwogCQlpZiAoKHJjIDwgMTIpIHx8IChyYyA+IEFUQVBJX0NEQl9MRU4pKSB7CiAJCQlpZiAoYXRhX21zZ193YXJuKGFwKSkKLQkJCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywKLQkJCQkJICAgICAgICJ1bnN1cHBvcnRlZCBDREIgbGVuXG4iKTsKKwkJCQlhdGFfZGV2X3dhcm4oZGV2LCAidW5zdXBwb3J0ZWQgQ0RCIGxlblxuIik7CiAJCQlyYyA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl9vdXRfbm9zdXA7CiAJCX0KQEAgLTIzNTgsOSArMjM0OCw5IEBACiAJCQllcnJfbWFzayA9IGF0YV9kZXZfc2V0X2ZlYXR1cmUoZGV2LAogCQkJCQlTRVRGRUFUVVJFU19TQVRBX0VOQUJMRSwgU0FUQV9BTik7CiAJCQlpZiAoZXJyX21hc2spCi0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0VSUiwKLQkJCQkJImZhaWxlZCB0byBlbmFibGUgQVRBUEkgQU4gIgotCQkJCQkiKGVycl9tYXNrPTB4JXgpXG4iLCBlcnJfbWFzayk7CisJCQkJYXRhX2Rldl9lcnIoZGV2LAorCQkJCQkgICAgImZhaWxlZCB0byBlbmFibGUgQVRBUEkgQU4gKGVycl9tYXNrPTB4JXgpXG4iLAorCQkJCQkgICAgZXJyX21hc2spOwogCQkJZWxzZSB7CiAJCQkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfQU47CiAJCQkJYXRhcGlfYW5fc3RyaW5nID0gIiwgQVRBUEkgQU4iOwpAQCAtMjM3OSwxMiArMjM2OSwxMiBAQAogCiAJCS8qIHByaW50IGRldmljZSBpbmZvIHRvIGRtZXNnICovCiAJCWlmIChhdGFfbXNnX2RydihhcCkgJiYgcHJpbnRfaW5mbykKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLAotCQkJCSAgICAgICAiQVRBUEk6ICVzLCAlcywgbWF4ICVzJXMlcyVzXG4iLAotCQkJCSAgICAgICBtb2RlbGJ1ZiwgZndyZXZidWYsCi0JCQkJICAgICAgIGF0YV9tb2RlX3N0cmluZyh4ZmVyX21hc2spLAotCQkJCSAgICAgICBjZGJfaW50cl9zdHJpbmcsIGF0YXBpX2FuX3N0cmluZywKLQkJCQkgICAgICAgZG1hX2Rpcl9zdHJpbmcpOworCQkJYXRhX2Rldl9pbmZvKGRldiwKKwkJCQkgICAgICJBVEFQSTogJXMsICVzLCBtYXggJXMlcyVzJXNcbiIsCisJCQkJICAgICBtb2RlbGJ1ZiwgZndyZXZidWYsCisJCQkJICAgICBhdGFfbW9kZV9zdHJpbmcoeGZlcl9tYXNrKSwKKwkJCQkgICAgIGNkYl9pbnRyX3N0cmluZywgYXRhcGlfYW5fc3RyaW5nLAorCQkJCSAgICAgZG1hX2Rpcl9zdHJpbmcpOwogCX0KIAogCS8qIGRldGVybWluZSBtYXhfc2VjdG9ycyAqLwpAQCAtMjM5Niw4ICsyMzg2LDcgQEAKIAkgICAyMDAgc2VjdG9ycyAqLwogCWlmIChhdGFfZGV2X2tub2JibGUoZGV2KSkgewogCQlpZiAoYXRhX21zZ19kcnYoYXApICYmIHByaW50X2luZm8pCi0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywKLQkJCQkgICAgICAgImFwcGx5aW5nIGJyaWRnZSBsaW1pdHNcbiIpOworCQkJYXRhX2Rldl9pbmZvKGRldiwgImFwcGx5aW5nIGJyaWRnZSBsaW1pdHNcbiIpOwogCQlkZXYtPnVkbWFfbWFzayAmPSBBVEFfVURNQTU7CiAJCWRldi0+bWF4X3NlY3RvcnMgPSBBVEFfTUFYX1NFQ1RPUlM7CiAJfQpAQCAtMjQyMywyNiArMjQxMiwyMyBAQAogCQkgICBidWdzICovCiAKIAkJaWYgKHByaW50X2luZm8pIHsKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLAorCQkJYXRhX2Rldl93YXJuKGRldiwKICJEcml2ZSByZXBvcnRzIGRpYWdub3N0aWNzIGZhaWx1cmUuIFRoaXMgbWF5IGluZGljYXRlIGEgZHJpdmVcbiIpOwotCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCisJCQlhdGFfZGV2X3dhcm4oZGV2LAogImZhdWx0IG9yIGludmFsaWQgZW11bGF0aW9uLiBDb250YWN0IGRyaXZlIHZlbmRvciBmb3IgaW5mb3JtYXRpb24uXG4iKTsKIAkJfQogCX0KIAogCWlmICgoZGV2LT5ob3JrYWdlICYgQVRBX0hPUktBR0VfRklSTVdBUkVfV0FSTikgJiYgcHJpbnRfaW5mbykgewotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywgIldBUk5JTkc6IGRldmljZSByZXF1aXJlcyAiCi0JCQkgICAgICAgImZpcm13YXJlIHVwZGF0ZSB0byBiZSBmdWxseSBmdW5jdGlvbmFsLlxuIik7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCAiICAgICAgICAgY29udGFjdCB0aGUgdmVuZG9yICIKLQkJCSAgICAgICAib3IgdmlzaXQgaHR0cDovL2F0YS53aWtpLmtlcm5lbC5vcmcuXG4iKTsKKwkJYXRhX2Rldl93YXJuKGRldiwgIldBUk5JTkc6IGRldmljZSByZXF1aXJlcyBmaXJtd2FyZSB1cGRhdGUgdG8gYmUgZnVsbHkgZnVuY3Rpb25hbFxuIik7CisJCWF0YV9kZXZfd2FybihkZXYsICIgICAgICAgICBjb250YWN0IHRoZSB2ZW5kb3Igb3IgdmlzaXQgaHR0cDovL2F0YS53aWtpLmtlcm5lbC5vcmdcbiIpOwogCX0KIAogCXJldHVybiAwOwogCiBlcnJfb3V0X25vc3VwOgogCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLAotCQkJICAgICAgICIlczogRVhJVCwgZXJyXG4iLCBfX2Z1bmNfXyk7CisJCWF0YV9kZXZfZGJnKGRldiwgIiVzOiBFWElULCBlcnJcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTI2NjMsMTMgKzI2NDksMTEgQEAKIAogCWlmIChhdGFfcGh5c19saW5rX29ubGluZShsaW5rKSkgewogCQl0bXAgPSAoc3N0YXR1cyA+PiA0KSAmIDB4ZjsKLQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fSU5GTywKLQkJCQkiU0FUQSBsaW5rIHVwICVzIChTU3RhdHVzICVYIFNDb250cm9sICVYKVxuIiwKLQkJCQlzYXRhX3NwZF9zdHJpbmcodG1wKSwgc3N0YXR1cywgc2NvbnRyb2wpOworCQlhdGFfbGlua19pbmZvKGxpbmssICJTQVRBIGxpbmsgdXAgJXMgKFNTdGF0dXMgJVggU0NvbnRyb2wgJVgpXG4iLAorCQkJICAgICAgc2F0YV9zcGRfc3RyaW5nKHRtcCksIHNzdGF0dXMsIHNjb250cm9sKTsKIAl9IGVsc2UgewotCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9JTkZPLAotCQkJCSJTQVRBIGxpbmsgZG93biAoU1N0YXR1cyAlWCBTQ29udHJvbCAlWClcbiIsCi0JCQkJc3N0YXR1cywgc2NvbnRyb2wpOworCQlhdGFfbGlua19pbmZvKGxpbmssICJTQVRBIGxpbmsgZG93biAoU1N0YXR1cyAlWCBTQ29udHJvbCAlWClcbiIsCisJCQkgICAgICBzc3RhdHVzLCBzY29udHJvbCk7CiAJfQogfQogCkBAIC0yNzU4LDggKzI3NDIsOCBAQAogCiAJbGluay0+c2F0YV9zcGRfbGltaXQgPSBtYXNrOwogCi0JYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fV0FSTklORywgImxpbWl0aW5nIFNBVEEgbGluayBzcGVlZCB0byAlc1xuIiwKLQkJCXNhdGFfc3BkX3N0cmluZyhmbHMobWFzaykpKTsKKwlhdGFfbGlua193YXJuKGxpbmssICJsaW1pdGluZyBTQVRBIGxpbmsgc3BlZWQgdG8gJXNcbiIsCisJCSAgICAgIHNhdGFfc3BkX3N0cmluZyhmbHMobWFzaykpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzEzNiw4ICszMTIwLDcgQEAKIAkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyIsCiAJCQkJIGF0YV9tb2RlX3N0cmluZyh4ZmVyX21hc2spKTsKIAotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywKLQkJCSAgICAgICAibGltaXRpbmcgc3BlZWQgdG8gJXNcbiIsIGJ1Zik7CisJCWF0YV9kZXZfd2FybihkZXYsICJsaW1pdGluZyBzcGVlZCB0byAlc1xuIiwgYnVmKTsKIAl9CiAKIAlhdGFfdW5wYWNrX3hmZXJtYXNrKHhmZXJfbWFzaywgJmRldi0+cGlvX21hc2ssICZkZXYtPm13ZG1hX21hc2ssCkBAIC0zMTY0LDkgKzMxNDcsOSBAQAogCQlkZXZfZXJyX3doaW5lID0gIiAoU0VUX1hGRVJNT0RFIHNraXBwZWQpIjsKIAllbHNlIHsKIAkJaWYgKG5vc2V0eGZlcikKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLAotCQkJCSAgICAgICAiTk9TRVRYRkVSIGJ1dCBQQVRBIGRldGVjdGVkIC0gY2FuJ3QgIgotCQkJCSAgICAgICAic2tpcCBTRVRYRkVSLCBtaWdodCBtYWxmdW5jdGlvblxuIik7CisJCQlhdGFfZGV2X3dhcm4oZGV2LAorCQkJCSAgICAgIk5PU0VUWEZFUiBidXQgUEFUQSBkZXRlY3RlZCAtIGNhbid0ICIKKwkJCQkgICAgICJza2lwIFNFVFhGRVIsIG1pZ2h0IG1hbGZ1bmN0aW9uXG4iKTsKIAkJZXJyX21hc2sgPSBhdGFfZGV2X3NldF94ZmVybW9kZShkZXYpOwogCX0KIApAQCAtMzIxNiwxNSArMzE5OSwxNCBAQAogCURQUklOVEsoInhmZXJfc2hpZnQ9JXUsIHhmZXJfbW9kZT0weCV4XG4iLAogCQlkZXYtPnhmZXJfc2hpZnQsIChpbnQpZGV2LT54ZmVyX21vZGUpOwogCi0JYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJjb25maWd1cmVkIGZvciAlcyVzXG4iLAotCQkgICAgICAgYXRhX21vZGVfc3RyaW5nKGF0YV94ZmVyX21vZGUybWFzayhkZXYtPnhmZXJfbW9kZSkpLAotCQkgICAgICAgZGV2X2Vycl93aGluZSk7CisJYXRhX2Rldl9pbmZvKGRldiwgImNvbmZpZ3VyZWQgZm9yICVzJXNcbiIsCisJCSAgICAgYXRhX21vZGVfc3RyaW5nKGF0YV94ZmVyX21vZGUybWFzayhkZXYtPnhmZXJfbW9kZSkpLAorCQkgICAgIGRldl9lcnJfd2hpbmUpOwogCiAJcmV0dXJuIDA7CiAKICBmYWlsOgotCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9FUlIsICJmYWlsZWQgdG8gc2V0IHhmZXJtb2RlICIKLQkJICAgICAgICIoZXJyX21hc2s9MHgleClcbiIsIGVycl9tYXNrKTsKKwlhdGFfZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IHhmZXJtb2RlIChlcnJfbWFzaz0weCV4KVxuIiwgZXJyX21hc2spOwogCXJldHVybiAtRUlPOwogfQogCkBAIC0zMjg2LDcgKzMyNjgsNyBAQAogCS8qIHN0ZXAgMjogYWx3YXlzIHNldCBob3N0IFBJTyB0aW1pbmdzICovCiAJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEVOQUJMRUQpIHsKIAkJaWYgKGRldi0+cGlvX21vZGUgPT0gMHhmZikgewotCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsICJubyBQSU8gc3VwcG9ydFxuIik7CisJCQlhdGFfZGV2X3dhcm4oZGV2LCAibm8gUElPIHN1cHBvcnRcbiIpOwogCQkJcmMgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTM0MDQsNyArMzM4Niw3IEBACiAKIAkJaWYgKCF3YXJuZWQgJiYgdGltZV9hZnRlcihub3csIHN0YXJ0ICsgNSAqIEhaKSAmJgogCQkgICAgKGRlYWRsaW5lIC0gbm93ID4gMyAqIEhaKSkgewotCQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fV0FSTklORywKKwkJCWF0YV9saW5rX3dhcm4obGluaywKIAkJCQkibGluayBpcyBzbG93IHRvIHJlc3BvbmQsIHBsZWFzZSBiZSBwYXRpZW50ICIKIAkJCQkiKHJlYWR5PSVkKVxuIiwgdG1wKTsKIAkJCXdhcm5lZCA9IDE7CkBAIC0zNTUyLDE2ICszNTM0LDE0IEBACiAJfSB3aGlsZSAoKHNjb250cm9sICYgMHhmMGYpICE9IDB4MzAwICYmIC0tdHJpZXMpOwogCiAJaWYgKChzY29udHJvbCAmIDB4ZjBmKSAhPSAweDMwMCkgewotCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9FUlIsCi0JCQkJImZhaWxlZCB0byByZXN1bWUgbGluayAoU0NvbnRyb2wgJVgpXG4iLAotCQkJCXNjb250cm9sKTsKKwkJYXRhX2xpbmtfd2FybihsaW5rLCAiZmFpbGVkIHRvIHJlc3VtZSBsaW5rIChTQ29udHJvbCAlWClcbiIsCisJCQkgICAgIHNjb250cm9sKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHRyaWVzIDwgQVRBX0xJTktfUkVTVU1FX1RSSUVTKQotCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9XQVJOSU5HLAotCQkJCSJsaW5rIHJlc3VtZSBzdWNjZWVkZWQgYWZ0ZXIgJWQgcmV0cmllc1xuIiwKLQkJCQlBVEFfTElOS19SRVNVTUVfVFJJRVMgLSB0cmllcyk7CisJCWF0YV9saW5rX3dhcm4obGluaywgImxpbmsgcmVzdW1lIHN1Y2NlZWRlZCBhZnRlciAlZCByZXRyaWVzXG4iLAorCQkJICAgICAgQVRBX0xJTktfUkVTVU1FX1RSSUVTIC0gdHJpZXMpOwogCiAJaWYgKChyYyA9IHNhdGFfbGlua19kZWJvdW5jZShsaW5rLCBwYXJhbXMsIGRlYWRsaW5lKSkpCiAJCXJldHVybiByYzsKQEAgLTM2NzgsOCArMzY1OCw5IEBACiAJCXJjID0gc2F0YV9saW5rX3Jlc3VtZShsaW5rLCB0aW1pbmcsIGRlYWRsaW5lKTsKIAkJLyogd2hpbmUgYWJvdXQgcGh5IHJlc3VtZSBmYWlsdXJlIGJ1dCBwcm9jZWVkICovCiAJCWlmIChyYyAmJiByYyAhPSAtRU9QTk9UU1VQUCkKLQkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX1dBUk5JTkcsICJmYWlsZWQgdG8gcmVzdW1lICIKLQkJCQkJImxpbmsgZm9yIHJlc2V0IChlcnJubz0lZClcbiIsIHJjKTsKKwkJCWF0YV9saW5rX3dhcm4obGluaywKKwkJCQkgICAgICAiZmFpbGVkIHRvIHJlc3VtZSBsaW5rIGZvciByZXNldCAoZXJybm89JWQpXG4iLAorCQkJCSAgICAgIHJjKTsKIAl9CiAKIAkvKiBubyBwb2ludCBpbiB0cnlpbmcgc29mdHJlc2V0IG9uIG9mZmxpbmUgbGluayAqLwpAQCAtMzc5NSw4ICszNzc2LDcgQEAKIAkJLyogb25saW5lIGlzIHNldCBpZmYgbGluayBpcyBvbmxpbmUgJiYgcmVzZXQgc3VjY2VlZGVkICovCiAJCWlmIChvbmxpbmUpCiAJCQkqb25saW5lID0gZmFsc2U7Ci0JCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwKLQkJCQkiQ09NUkVTRVQgZmFpbGVkIChlcnJubz0lZClcbiIsIHJjKTsKKwkJYXRhX2xpbmtfZXJyKGxpbmssICJDT01SRVNFVCBmYWlsZWQgKGVycm5vPSVkKVxuIiwgcmMpOwogCX0KIAlEUFJJTlRLKCJFWElULCByYz0lZFxuIiwgcmMpOwogCXJldHVybiByYzsKQEAgLTM4ODAsOCArMzg2MCw4IEBACiAJdW5zaWduZWQgY2hhciBzZXJpYWxbMl1bQVRBX0lEX1NFUk5PX0xFTiArIDFdOwogCiAJaWYgKGRldi0+Y2xhc3MgIT0gbmV3X2NsYXNzKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiY2xhc3MgbWlzbWF0Y2ggJWQgIT0gJWRcbiIsCi0JCQkgICAgICAgZGV2LT5jbGFzcywgbmV3X2NsYXNzKTsKKwkJYXRhX2Rldl9pbmZvKGRldiwgImNsYXNzIG1pc21hdGNoICVkICE9ICVkXG4iLAorCQkJICAgICBkZXYtPmNsYXNzLCBuZXdfY2xhc3MpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM4OTEsMTQgKzM4NzEsMTQgQEAKIAlhdGFfaWRfY19zdHJpbmcobmV3X2lkLCBzZXJpYWxbMV0sIEFUQV9JRF9TRVJOTywgc2l6ZW9mKHNlcmlhbFsxXSkpOwogCiAJaWYgKHN0cmNtcChtb2RlbFswXSwgbW9kZWxbMV0pKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAibW9kZWwgbnVtYmVyIG1pc21hdGNoICIKLQkJCSAgICAgICAiJyVzJyAhPSAnJXMnXG4iLCBtb2RlbFswXSwgbW9kZWxbMV0pOworCQlhdGFfZGV2X2luZm8oZGV2LCAibW9kZWwgbnVtYmVyIG1pc21hdGNoICclcycgIT0gJyVzJ1xuIiwKKwkJCSAgICAgbW9kZWxbMF0sIG1vZGVsWzFdKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHN0cmNtcChzZXJpYWxbMF0sIHNlcmlhbFsxXSkpIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJzZXJpYWwgbnVtYmVyIG1pc21hdGNoICIKLQkJCSAgICAgICAiJyVzJyAhPSAnJXMnXG4iLCBzZXJpYWxbMF0sIHNlcmlhbFsxXSk7CisJCWF0YV9kZXZfaW5mbyhkZXYsICJzZXJpYWwgbnVtYmVyIG1pc21hdGNoICclcycgIT0gJyVzJ1xuIiwKKwkJCSAgICAgc2VyaWFsWzBdLCBzZXJpYWxbMV0pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM5NjgsOCArMzk0OCw4IEBACiAJICAgIG5ld19jbGFzcyAhPSBBVEFfREVWX0FUQSAmJgogCSAgICBuZXdfY2xhc3MgIT0gQVRBX0RFVl9BVEFQSSAmJgogCSAgICBuZXdfY2xhc3MgIT0gQVRBX0RFVl9TRU1CKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiY2xhc3MgbWlzbWF0Y2ggJXUgIT0gJXVcbiIsCi0JCQkgICAgICAgZGV2LT5jbGFzcywgbmV3X2NsYXNzKTsKKwkJYXRhX2Rldl9pbmZvKGRldiwgImNsYXNzIG1pc21hdGNoICV1ICE9ICV1XG4iLAorCQkJICAgICBkZXYtPmNsYXNzLCBuZXdfY2xhc3MpOwogCQlyYyA9IC1FTk9ERVY7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC0zOTkwLDkgKzM5NzAsOSBAQAogCQlyZXR1cm4gMDsKIAogCS8qIG5fc2VjdG9ycyBoYXMgY2hhbmdlZCAqLwotCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCAibl9zZWN0b3JzIG1pc21hdGNoICVsbHUgIT0gJWxsdVxuIiwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbl9zZWN0b3JzLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPm5fc2VjdG9ycyk7CisJYXRhX2Rldl93YXJuKGRldiwgIm5fc2VjdG9ycyBtaXNtYXRjaCAlbGx1ICE9ICVsbHVcbiIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluX3NlY3RvcnMsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPm5fc2VjdG9ycyk7CiAKIAkvKgogCSAqIFNvbWV0aGluZyBjb3VsZCBoYXZlIGNhdXNlZCBIUEEgdG8gYmUgdW5sb2NrZWQKQEAgLTQwMDEsOSArMzk4MSw5IEBACiAJICovCiAJaWYgKGRldi0+bl9uYXRpdmVfc2VjdG9ycyA9PSBuX25hdGl2ZV9zZWN0b3JzICYmCiAJICAgIGRldi0+bl9zZWN0b3JzID4gbl9zZWN0b3JzICYmIGRldi0+bl9zZWN0b3JzID09IG5fbmF0aXZlX3NlY3RvcnMpIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCi0JCQkgICAgICAgIm5ldyBuX3NlY3RvcnMgbWF0Y2hlcyBuYXRpdmUsIHByb2JhYmx5ICIKLQkJCSAgICAgICAibGF0ZSBIUEEgdW5sb2NrLCBuX3NlY3RvcnMgdXBkYXRlZFxuIik7CisJCWF0YV9kZXZfd2FybihkZXYsCisJCQkgICAgICJuZXcgbl9zZWN0b3JzIG1hdGNoZXMgbmF0aXZlLCBwcm9iYWJseSAiCisJCQkgICAgICJsYXRlIEhQQSB1bmxvY2ssIG5fc2VjdG9ycyB1cGRhdGVkXG4iKTsKIAkJLyogdXNlIHRoZSBsYXJnZXIgbl9zZWN0b3JzICovCiAJCXJldHVybiAwOwogCX0KQEAgLTQwMTcsOSArMzk5Nyw5IEBACiAJaWYgKGRldi0+bl9uYXRpdmVfc2VjdG9ycyA9PSBuX25hdGl2ZV9zZWN0b3JzICYmCiAJICAgIGRldi0+bl9zZWN0b3JzIDwgbl9zZWN0b3JzICYmIG5fc2VjdG9ycyA9PSBuX25hdGl2ZV9zZWN0b3JzICYmCiAJICAgICEoZGV2LT5ob3JrYWdlICYgQVRBX0hPUktBR0VfQlJPS0VOX0hQQSkpIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCi0JCQkgICAgICAgIm9sZCBuX3NlY3RvcnMgbWF0Y2hlcyBuYXRpdmUsIHByb2JhYmx5ICIKLQkJCSAgICAgICAibGF0ZSBIUEEgbG9jaywgd2lsbCB0cnkgdG8gdW5sb2NrIEhQQVxuIik7CisJCWF0YV9kZXZfd2FybihkZXYsCisJCQkgICAgICJvbGQgbl9zZWN0b3JzIG1hdGNoZXMgbmF0aXZlLCBwcm9iYWJseSAiCisJCQkgICAgICJsYXRlIEhQQSBsb2NrLCB3aWxsIHRyeSB0byB1bmxvY2sgSFBBXG4iKTsKIAkJLyogdHJ5IHVubG9ja2luZyBIUEEgKi8KIAkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfVU5MT0NLX0hQQTsKIAkJcmMgPSAtRUlPOwpAQCAtNDAzMCw3ICs0MDEwLDcgQEAKIAlkZXYtPm5fbmF0aXZlX3NlY3RvcnMgPSBuX25hdGl2ZV9zZWN0b3JzOwogCWRldi0+bl9zZWN0b3JzID0gbl9zZWN0b3JzOwogIGZhaWw6Ci0JYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0VSUiwgInJldmFsaWRhdGlvbiBmYWlsZWQgKGVycm5vPSVkKVxuIiwgcmMpOworCWF0YV9kZXZfZXJyKGRldiwgInJldmFsaWRhdGlvbiBmYWlsZWQgKGVycm5vPSVkKVxuIiwgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtNDE0Myw5ICs0MTIzLDkgQEAKIAkgKiBEZXZpY2VzIHdoaWNoIGNob2tlIG9uIFNFVFhGRVIuICBBcHBsaWVzIG9ubHkgaWYgYm90aCB0aGUKIAkgKiBkZXZpY2UgYW5kIGNvbnRyb2xsZXIgYXJlIFNBVEEuCiAJICovCi0JeyAiUElPTkVFUiBEVkQtUlcgIERWUlREMDgiLAkiMS4wMCIsCUFUQV9IT1JLQUdFX05PU0VUWEZFUiB9LAotCXsgIlBJT05FRVIgRFZELVJXICBEVlItMjEyRCIsCSIxLjI4IiwgQVRBX0hPUktBR0VfTk9TRVRYRkVSIH0sCi0JeyAiUElPTkVFUiBEVkQtUlcgIERWUi0yMTZEIiwJIjEuMDgiLCBBVEFfSE9SS0FHRV9OT1NFVFhGRVIgfSwKKwl7ICJQSU9ORUVSIERWRC1SVyAgRFZSVEQwOCIsCU5VTEwsCUFUQV9IT1JLQUdFX05PU0VUWEZFUiB9LAorCXsgIlBJT05FRVIgRFZELVJXICBEVlItMjEyRCIsCU5VTEwsCUFUQV9IT1JLQUdFX05PU0VUWEZFUiB9LAorCXsgIlBJT05FRVIgRFZELVJXICBEVlItMjE2RCIsCU5VTEwsCUFUQV9IT1JLQUdFX05PU0VUWEZFUiB9LAogCiAJLyogRW5kIE1hcmtlciAqLwogCXsgfQpAQCAtNDM1OCwxNSArNDMzOCwxNSBAQAogCiAJaWYgKGF0YV9kbWFfYmxhY2tsaXN0ZWQoZGV2KSkgewogCQl4ZmVyX21hc2sgJj0gfihBVEFfTUFTS19NV0RNQSB8IEFUQV9NQVNLX1VETUEpOwotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywKLQkJCSAgICAgICAiZGV2aWNlIGlzIG9uIERNQSBibGFja2xpc3QsIGRpc2FibGluZyBETUFcbiIpOworCQlhdGFfZGV2X3dhcm4oZGV2LAorCQkJICAgICAiZGV2aWNlIGlzIG9uIERNQSBibGFja2xpc3QsIGRpc2FibGluZyBETUFcbiIpOwogCX0KIAogCWlmICgoaG9zdC0+ZmxhZ3MgJiBBVEFfSE9TVF9TSU1QTEVYKSAmJgogCSAgICBob3N0LT5zaW1wbGV4X2NsYWltZWQgJiYgaG9zdC0+c2ltcGxleF9jbGFpbWVkICE9IGFwKSB7CiAJCXhmZXJfbWFzayAmPSB+KEFUQV9NQVNLX01XRE1BIHwgQVRBX01BU0tfVURNQSk7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCAic2ltcGxleCBETUEgaXMgY2xhaW1lZCBieSAiCi0JCQkgICAgICAgIm90aGVyIGRldmljZSwgZGlzYWJsaW5nIERNQVxuIik7CisJCWF0YV9kZXZfd2FybihkZXYsCisJCQkgICAgICJzaW1wbGV4IERNQSBpcyBjbGFpbWVkIGJ5IG90aGVyIGRldmljZSwgZGlzYWJsaW5nIERNQVxuIik7CiAJfQogCiAJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX05PX0lPUkRZKQpAQCAtNDM4Niw4ICs0MzY2LDggQEAKIAlpZiAoeGZlcl9tYXNrICYgKDB4RjggPDwgQVRBX1NISUZUX1VETUEpKQogCQkvKiBVRE1BLzQ0IG9yIGhpZ2hlciB3b3VsZCBiZSBhdmFpbGFibGUgKi8KIAkJaWYgKGNhYmxlX2lzXzQwd2lyZShhcCkpIHsKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLAotCQkJCSAibGltaXRlZCB0byBVRE1BLzMzIGR1ZSB0byA0MC13aXJlIGNhYmxlXG4iKTsKKwkJCWF0YV9kZXZfd2FybihkZXYsCisJCQkJICAgICAibGltaXRlZCB0byBVRE1BLzMzIGR1ZSB0byA0MC13aXJlIGNhYmxlXG4iKTsKIAkJCXhmZXJfbWFzayAmPSB+KDB4RjggPDwgQVRBX1NISUZUX1VETUEpOwogCQl9CiAKQEAgLTQ5NTQsOCArNDkzNCw4IEBACiAJZG9uZV9tYXNrID0gYXAtPnFjX2FjdGl2ZSBeIHFjX2FjdGl2ZTsKIAogCWlmICh1bmxpa2VseShkb25lX21hc2sgJiBxY19hY3RpdmUpKSB7Ci0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJpbGxlZ2FsIHFjX2FjdGl2ZSB0cmFuc2l0aW9uICIKLQkJCQkiKCUwOHgtPiUwOHgpXG4iLCBhcC0+cWNfYWN0aXZlLCBxY19hY3RpdmUpOworCQlhdGFfcG9ydF9lcnIoYXAsICJpbGxlZ2FsIHFjX2FjdGl2ZSB0cmFuc2l0aW9uICglMDh4LT4lMDh4KVxuIiwKKwkJCSAgICAgYXAtPnFjX2FjdGl2ZSwgcWNfYWN0aXZlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01ODQ3LDkgKzU4MjcsOSBAQAogCQkJcmMgPSBhcC0+b3BzLT5wb3J0X3N0YXJ0KGFwKTsKIAkJCWlmIChyYykgewogCQkJCWlmIChyYyAhPSAtRU5PREVWKQotCQkJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBob3N0LT5kZXYsCi0JCQkJCQkiZmFpbGVkIHRvIHN0YXJ0IHBvcnQgJWQgIgotCQkJCQkJIihlcnJubz0lZClcbiIsIGksIHJjKTsKKwkJCQkJZGV2X2Vycihob3N0LT5kZXYsCisJCQkJCQkiZmFpbGVkIHRvIHN0YXJ0IHBvcnQgJWQgKGVycm5vPSVkKVxuIiwKKwkJCQkJCWksIHJjKTsKIAkJCQlnb3RvIGVycl9vdXQ7CiAJCQl9CiAJCX0KQEAgLTU5NzEsOCArNTk1MSw3IEBACiAKIAkvKiBob3N0IG11c3QgaGF2ZSBiZWVuIHN0YXJ0ZWQgKi8KIAlpZiAoIShob3N0LT5mbGFncyAmIEFUQV9IT1NUX1NUQVJURUQpKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsIGhvc3QtPmRldiwKLQkJCSAgICJCVUc6IHRyeWluZyB0byByZWdpc3RlciB1bnN0YXJ0ZWQgaG9zdFxuIik7CisJCWRldl9lcnIoaG9zdC0+ZGV2LCAiQlVHOiB0cnlpbmcgdG8gcmVnaXN0ZXIgdW5zdGFydGVkIGhvc3RcbiIpOwogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC02MDIzLDE0ICs2MDAyLDEzIEBACiAJCQkJCSAgICAgIGFwLT51ZG1hX21hc2spOwogCiAJCWlmICghYXRhX3BvcnRfaXNfZHVtbXkoYXApKSB7Ci0JCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywKLQkJCQkJIiVjQVRBIG1heCAlcyAlc1xuIiwKLQkJCQkJKGFwLT5mbGFncyAmIEFUQV9GTEFHX1NBVEEpID8gJ1MnIDogJ1AnLAotCQkJCQlhdGFfbW9kZV9zdHJpbmcoeGZlcl9tYXNrKSwKLQkJCQkJYXAtPmxpbmsuZWhfaW5mby5kZXNjKTsKKwkJCWF0YV9wb3J0X2luZm8oYXAsICIlY0FUQSBtYXggJXMgJXNcbiIsCisJCQkJICAgICAgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1NBVEEpID8gJ1MnIDogJ1AnLAorCQkJCSAgICAgIGF0YV9tb2RlX3N0cmluZyh4ZmVyX21hc2spLAorCQkJCSAgICAgIGFwLT5saW5rLmVoX2luZm8uZGVzYyk7CiAJCQlhdGFfZWhpX2NsZWFyX2Rlc2MoJmFwLT5saW5rLmVoX2luZm8pOwogCQl9IGVsc2UKLQkJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9JTkZPLCAiRFVNTVlcbiIpOworCQkJYXRhX3BvcnRfaW5mbyhhcCwgIkRVTU1ZXG4iKTsKIAl9CiAKIAkvKiBwZXJmb3JtIGVhY2ggcHJvYmUgYXN5bmNocm9ub3VzbHkgKi8KQEAgLTYyNDIsOCArNjIyMCw4IEBACiAKIAlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCSAgICJmYWlsZWQgdG8gZW5hYmxlIGRldmljZSBhZnRlciByZXN1bWUgKCVkKVxuIiwgcmMpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGVuYWJsZSBkZXZpY2UgYWZ0ZXIgcmVzdW1lICglZClcbiIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtNjYwMCw2ICs2NTc4LDgyIEBACiB9OwogCiAvKgorICogVXRpbGl0eSBwcmludCBmdW5jdGlvbnMKKyAqLworaW50IGF0YV9wb3J0X3ByaW50ayhjb25zdCBzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBjb25zdCBjaGFyICpsZXZlbCwKKwkJICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOworCXZhX2xpc3QgYXJnczsKKwlpbnQgcjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJciA9IHByaW50aygiJXNhdGEldTogJXBWIiwgbGV2ZWwsIGFwLT5wcmludF9pZCwgJnZhZik7CisKKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0woYXRhX3BvcnRfcHJpbnRrKTsKKworaW50IGF0YV9saW5rX3ByaW50ayhjb25zdCBzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIGNvbnN0IGNoYXIgKmxldmVsLAorCQkgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CisJdmFfbGlzdCBhcmdzOworCWludCByOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlpZiAoc2F0YV9wbXBfYXR0YWNoZWQobGluay0+YXApIHx8IGxpbmstPmFwLT5zbGF2ZV9saW5rKQorCQlyID0gcHJpbnRrKCIlc2F0YSV1LiUwMnU6ICVwViIsCisJCQkgICBsZXZlbCwgbGluay0+YXAtPnByaW50X2lkLCBsaW5rLT5wbXAsICZ2YWYpOworCWVsc2UKKwkJciA9IHByaW50aygiJXNhdGEldTogJXBWIiwKKwkJCSAgIGxldmVsLCBsaW5rLT5hcC0+cHJpbnRfaWQsICZ2YWYpOworCisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKGF0YV9saW5rX3ByaW50ayk7CisKK2ludCBhdGFfZGV2X3ByaW50ayhjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpsZXZlbCwKKwkJICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOworCXZhX2xpc3QgYXJnczsKKwlpbnQgcjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJciA9IHByaW50aygiJXNhdGEldS4lMDJ1OiAlcFYiLAorCQkgICBsZXZlbCwgZGV2LT5saW5rLT5hcC0+cHJpbnRfaWQsIGRldi0+bGluay0+cG1wICsgZGV2LT5kZXZubywKKwkJICAgJnZhZik7CisKKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0woYXRhX2Rldl9wcmludGspOworCit2b2lkIGF0YV9wcmludF92ZXJzaW9uKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqdmVyc2lvbikKK3sKKwlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgInZlcnNpb24gJXNcbiIsIHZlcnNpb24pOworfQorRVhQT1JUX1NZTUJPTChhdGFfcHJpbnRfdmVyc2lvbik7CisKKy8qCiAgKiBsaWJhdGEgaXMgZXNzZW50aWFsbHkgYSBsaWJyYXJ5IG9mIGludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgZm9yCiAgKiBsb3ctbGV2ZWwgQVRBIGhvc3QgY29udHJvbGxlciBkcml2ZXJzLiAgQXMgc3VjaCwgdGhlIEFQSS9BQkkgaXMKICAqIGxpa2VseSB0byBjaGFuZ2UgYXMgbmV3IGRyaXZlcnMgYXJlIGFkZGVkIGFuZCB1cGRhdGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwppbmRleCBkZmI2ZTlkLi5lZDE2ZmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwpAQCAtNzgyLDggKzc4Miw5IEBACiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwogCQkJCWdvdG8gcmVwZWF0OwogCQkJfQotCQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgIkVIIHBlbmRpbmcgYWZ0ZXIgJWQgIgotCQkJCQkidHJpZXMsIGdpdmluZyB1cFxuIiwgQVRBX0VIX01BWF9UUklFUyk7CisJCQlhdGFfcG9ydF9lcnIoYXAsCisJCQkJICAgICAiRUggcGVuZGluZyBhZnRlciAlZCB0cmllcywgZ2l2aW5nIHVwXG4iLAorCQkJCSAgICAgQVRBX0VIX01BWF9UUklFUyk7CiAJCQlhcC0+cGZsYWdzICY9IH5BVEFfUEZMQUdfRUhfUEVORElORzsKIAkJfQogCkBAIC04MTYsNyArODE3LDcgQEAKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhcC0+aG90cGx1Z190YXNrLCAwKTsKIAogCWlmIChhcC0+cGZsYWdzICYgQVRBX1BGTEFHX1JFQ09WRVJFRCkKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sICJFSCBjb21wbGV0ZVxuIik7CisJCWF0YV9wb3J0X2luZm8oYXAsICJFSCBjb21wbGV0ZVxuIik7CiAKIAlhcC0+cGZsYWdzICY9IH4oQVRBX1BGTEFHX1NDU0lfSE9UUExVRyB8IEFUQV9QRkxBR19SRUNPVkVSRUQpOwogCkBAIC0xMzEwLDcgKzEzMTEsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAoYXRhX21zZ19kcnYoZGV2LT5saW5rLT5hcCkpCi0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCAiZGlzYWJsZWRcbiIpOworCQlhdGFfZGV2X3dhcm4oZGV2LCAiZGlzYWJsZWRcbiIpOwogCWF0YV9hY3BpX29uX2Rpc2FibGUoZGV2KTsKIAlhdGFfZG93bl94ZmVybWFza19saW1pdChkZXYsIEFUQV9ETlhGRVJfRk9SQ0VfUElPMCB8IEFUQV9ETlhGRVJfUVVJRVQpOwogCWRldi0+Y2xhc3MrKzsKQEAgLTE1MTUsOCArMTUxNiw4IEBACiAJZm9yIChpID0gMDsgaSA8IEFUQV9TRUNUX1NJWkU7IGkrKykKIAkJY3N1bSArPSBidWZbaV07CiAJaWYgKGNzdW0pCi0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLAotCQkJICAgICAgICJpbnZhbGlkIGNoZWNrc3VtIDB4JXggb24gbG9nIHBhZ2UgMTBoXG4iLCBjc3VtKTsKKwkJYXRhX2Rldl93YXJuKGRldiwgImludmFsaWQgY2hlY2tzdW0gMHgleCBvbiBsb2cgcGFnZSAxMGhcbiIsCisJCQkgICAgIGNzdW0pOwogCiAJaWYgKGJ1ZlswXSAmIDB4ODApCiAJCXJldHVybiAtRU5PRU5UOwpAQCAtMTcxNiwxNCArMTcxNywxNCBAQAogCW1lbXNldCgmdGYsIDAsIHNpemVvZih0ZikpOwogCXJjID0gYXRhX2VoX3JlYWRfbG9nXzEwaChkZXYsICZ0YWcsICZ0Zik7CiAJaWYgKHJjKSB7Ci0JCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwgImZhaWxlZCB0byByZWFkIGxvZyBwYWdlIDEwaCAiCi0JCQkJIihlcnJubz0lZClcbiIsIHJjKTsKKwkJYXRhX2xpbmtfZXJyKGxpbmssICJmYWlsZWQgdG8gcmVhZCBsb2cgcGFnZSAxMGggKGVycm5vPSVkKVxuIiwKKwkJCSAgICAgcmMpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKCEobGluay0+c2FjdGl2ZSAmICgxIDw8IHRhZykpKSB7Ci0JCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwgImxvZyBwYWdlIDEwaCByZXBvcnRlZCAiCi0JCQkJImluYWN0aXZlIHRhZyAlZFxuIiwgdGFnKTsKKwkJYXRhX2xpbmtfZXJyKGxpbmssICJsb2cgcGFnZSAxMGggcmVwb3J0ZWQgaW5hY3RpdmUgdGFnICVkXG4iLAorCQkJICAgICB0YWcpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xOTg4LDggKzE5ODksNyBAQAogCSAgICAoZGV2LT5mbGFncyAmIChBVEFfREZMQUdfUElPIHwgQVRBX0RGTEFHX05DUSB8CiAJCQkgICBBVEFfREZMQUdfTkNRX09GRikpID09IEFUQV9ERkxBR19OQ1EpIHsKIAkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfTkNRX09GRjsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCi0JCQkgICAgICAgIk5DUSBkaXNhYmxlZCBkdWUgdG8gZXhjZXNzaXZlIGVycm9yc1xuIik7CisJCWF0YV9kZXZfd2FybihkZXYsICJOQ1EgZGlzYWJsZWQgZHVlIHRvIGV4Y2Vzc2l2ZSBlcnJvcnNcbiIpOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC0yMzc0LDI0ICsyMzc0LDI0IEBACiAJCQkgYXAtPmVoX3RyaWVzKTsKIAogCWlmIChlaGMtPmkuZGV2KSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGVoYy0+aS5kZXYsIEtFUk5fRVJSLCAiZXhjZXB0aW9uIEVtYXNrIDB4JXggIgotCQkJICAgICAgICJTQWN0IDB4JXggU0VyciAweCV4IGFjdGlvbiAweCV4JXMlc1xuIiwKLQkJCSAgICAgICBlaGMtPmkuZXJyX21hc2ssIGxpbmstPnNhY3RpdmUsIGVoYy0+aS5zZXJyb3IsCi0JCQkgICAgICAgZWhjLT5pLmFjdGlvbiwgZnJvemVuLCB0cmllc19idWYpOworCQlhdGFfZGV2X2VycihlaGMtPmkuZGV2LCAiZXhjZXB0aW9uIEVtYXNrIDB4JXggIgorCQkJICAgICJTQWN0IDB4JXggU0VyciAweCV4IGFjdGlvbiAweCV4JXMlc1xuIiwKKwkJCSAgICBlaGMtPmkuZXJyX21hc2ssIGxpbmstPnNhY3RpdmUsIGVoYy0+aS5zZXJyb3IsCisJCQkgICAgZWhjLT5pLmFjdGlvbiwgZnJvemVuLCB0cmllc19idWYpOwogCQlpZiAoZGVzYykKLQkJCWF0YV9kZXZfcHJpbnRrKGVoYy0+aS5kZXYsIEtFUk5fRVJSLCAiJXNcbiIsIGRlc2MpOworCQkJYXRhX2Rldl9lcnIoZWhjLT5pLmRldiwgIiVzXG4iLCBkZXNjKTsKIAl9IGVsc2UgewotCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9FUlIsICJleGNlcHRpb24gRW1hc2sgMHgleCAiCi0JCQkJIlNBY3QgMHgleCBTRXJyIDB4JXggYWN0aW9uIDB4JXglcyVzXG4iLAotCQkJCWVoYy0+aS5lcnJfbWFzaywgbGluay0+c2FjdGl2ZSwgZWhjLT5pLnNlcnJvciwKLQkJCQllaGMtPmkuYWN0aW9uLCBmcm96ZW4sIHRyaWVzX2J1Zik7CisJCWF0YV9saW5rX2VycihsaW5rLCAiZXhjZXB0aW9uIEVtYXNrIDB4JXggIgorCQkJICAgICAiU0FjdCAweCV4IFNFcnIgMHgleCBhY3Rpb24gMHgleCVzJXNcbiIsCisJCQkgICAgIGVoYy0+aS5lcnJfbWFzaywgbGluay0+c2FjdGl2ZSwgZWhjLT5pLnNlcnJvciwKKwkJCSAgICAgZWhjLT5pLmFjdGlvbiwgZnJvemVuLCB0cmllc19idWYpOwogCQlpZiAoZGVzYykKLQkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwgIiVzXG4iLCBkZXNjKTsKKwkJCWF0YV9saW5rX2VycihsaW5rLCAiJXNcbiIsIGRlc2MpOwogCX0KIAogI2lmZGVmIENPTkZJR19BVEFfVkVSQk9TRV9FUlJPUgogCWlmIChlaGMtPmkuc2Vycm9yKQotCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9FUlIsCisJCWF0YV9saW5rX2VycihsaW5rLAogCQkgICJTRXJyb3I6IHsgJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlc31cbiIsCiAJCSAgZWhjLT5pLnNlcnJvciAmIFNFUlJfREFUQV9SRUNPVkVSRUQgPyAiUmVjb3ZEYXRhICIgOiAiIiwKIAkJICBlaGMtPmkuc2Vycm9yICYgU0VSUl9DT01NX1JFQ09WRVJFRCA/ICJSZWNvdkNvbW0gIiA6ICIiLApAQCAtMjQ1NiwxMSArMjQ1NiwxMSBAQAogCQl9IGVsc2UgewogCQkJY29uc3QgY2hhciAqZGVzY3IgPSBhdGFfZ2V0X2NtZF9kZXNjcmlwdChjbWQtPmNvbW1hbmQpOwogCQkJaWYgKGRlc2NyKQotCQkJCWF0YV9kZXZfcHJpbnRrKHFjLT5kZXYsIEtFUk5fRVJSLAotCQkJCQkiZmFpbGVkIGNvbW1hbmQ6ICVzXG4iLCBkZXNjcik7CisJCQkJYXRhX2Rldl9lcnIocWMtPmRldiwgImZhaWxlZCBjb21tYW5kOiAlc1xuIiwKKwkJCQkJICAgIGRlc2NyKTsKIAkJfQogCi0JCWF0YV9kZXZfcHJpbnRrKHFjLT5kZXYsIEtFUk5fRVJSLAorCQlhdGFfZGV2X2VycihxYy0+ZGV2LAogCQkJImNtZCAlMDJ4LyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC8lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngvJTAyeCAiCiAJCQkidGFnICVkJXNcbiAgICAgICAgICVzIgogCQkJInJlcyAlMDJ4LyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC8lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngvJTAyeCAiCkBAIC0yNDgxLDExICsyNDgxLDkgQEAKIAkJaWYgKHJlcy0+Y29tbWFuZCAmIChBVEFfQlVTWSB8IEFUQV9EUkRZIHwgQVRBX0RGIHwgQVRBX0RSUSB8CiAJCQkJICAgIEFUQV9FUlIpKSB7CiAJCQlpZiAocmVzLT5jb21tYW5kICYgQVRBX0JVU1kpCi0JCQkJYXRhX2Rldl9wcmludGsocWMtPmRldiwgS0VSTl9FUlIsCi0JCQkJICAic3RhdHVzOiB7IEJ1c3kgfVxuIik7CisJCQkJYXRhX2Rldl9lcnIocWMtPmRldiwgInN0YXR1czogeyBCdXN5IH1cbiIpOwogCQkJZWxzZQotCQkJCWF0YV9kZXZfcHJpbnRrKHFjLT5kZXYsIEtFUk5fRVJSLAotCQkJCSAgInN0YXR1czogeyAlcyVzJXMlc31cbiIsCisJCQkJYXRhX2Rldl9lcnIocWMtPmRldiwgInN0YXR1czogeyAlcyVzJXMlc31cbiIsCiAJCQkJICByZXMtPmNvbW1hbmQgJiBBVEFfRFJEWSA/ICJEUkRZICIgOiAiIiwKIAkJCQkgIHJlcy0+Y29tbWFuZCAmIEFUQV9ERiA/ICJERiAiIDogIiIsCiAJCQkJICByZXMtPmNvbW1hbmQgJiBBVEFfRFJRID8gIkRSUSAiIDogIiIsCkBAIC0yNDk1LDggKzI0OTMsNyBAQAogCQlpZiAoY21kLT5jb21tYW5kICE9IEFUQV9DTURfUEFDS0VUICYmCiAJCSAgICAocmVzLT5mZWF0dXJlICYgKEFUQV9JQ1JDIHwgQVRBX1VOQyB8IEFUQV9JRE5GIHwKIAkJCQkgICAgIEFUQV9BQk9SVEVEKSkpCi0JCQlhdGFfZGV2X3ByaW50ayhxYy0+ZGV2LCBLRVJOX0VSUiwKLQkJCSAgImVycm9yOiB7ICVzJXMlcyVzfVxuIiwKKwkJCWF0YV9kZXZfZXJyKHFjLT5kZXYsICJlcnJvcjogeyAlcyVzJXMlc31cbiIsCiAJCQkgIHJlcy0+ZmVhdHVyZSAmIEFUQV9JQ1JDID8gIklDUkMgIiA6ICIiLAogCQkJICByZXMtPmZlYXR1cmUgJiBBVEFfVU5DID8gIlVOQyAiIDogIiIsCiAJCQkgIHJlcy0+ZmVhdHVyZSAmIEFUQV9JRE5GID8gIklETkYgIiA6ICIiLApAQCAtMjY1MCw4ICsyNjQ3LDcgQEAKIAogCQlpZiAocmMpIHsKIAkJCWlmIChyYyA9PSAtRU5PRU5UKSB7Ci0JCQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fREVCVUcsCi0JCQkJCQkicG9ydCBkaXNhYmxlZC4gaWdub3JpbmcuXG4iKTsKKwkJCQlhdGFfbGlua19kYmcobGluaywgInBvcnQgZGlzYWJsZWQtLWlnbm9yaW5nXG4iKTsKIAkJCQllaGMtPmkuYWN0aW9uICY9IH5BVEFfRUhfUkVTRVQ7CiAKIAkJCQlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgQUxMKQpAQCAtMjY1OSw4ICsyNjU1LDkgQEAKIAogCQkJCXJjID0gMDsKIAkJCX0gZWxzZQotCQkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwKLQkJCQkJInByZXJlc2V0IGZhaWxlZCAoZXJybm89JWQpXG4iLCByYyk7CisJCQkJYXRhX2xpbmtfZXJyKGxpbmssCisJCQkJCSAgICAgInByZXJlc2V0IGZhaWxlZCAoZXJybm89JWQpXG4iLAorCQkJCQkgICAgIHJjKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTI2ODksOCArMjY4Niw4IEBACiAKIAlpZiAocmVzZXQpIHsKIAkJaWYgKHZlcmJvc2UpCi0JCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9JTkZPLCAiJXMgcmVzZXR0aW5nIGxpbmtcbiIsCi0JCQkJCXJlc2V0ID09IHNvZnRyZXNldCA/ICJzb2Z0IiA6ICJoYXJkIik7CisJCQlhdGFfbGlua19pbmZvKGxpbmssICIlcyByZXNldHRpbmcgbGlua1xuIiwKKwkJCQkgICAgICByZXNldCA9PSBzb2Z0cmVzZXQgPyAic29mdCIgOiAiaGFyZCIpOwogCiAJCS8qIG1hcmsgdGhhdCB0aGlzIEVIIHNlc3Npb24gc3RhcnRlZCB3aXRoIHJlc2V0ICovCiAJCWVoYy0+bGFzdF9yZXNldCA9IGppZmZpZXM7CkBAIC0yNzEwLDggKzI3MDcsNyBAQAogCQkJaW50IHRtcDsKIAogCQkJaWYgKHZlcmJvc2UpCi0JCQkJYXRhX2xpbmtfcHJpbnRrKHNsYXZlLCBLRVJOX0lORk8sCi0JCQkJCQkiaGFyZCByZXNldHRpbmcgbGlua1xuIik7CisJCQkJYXRhX2xpbmtfaW5mbyhzbGF2ZSwgImhhcmQgcmVzZXR0aW5nIGxpbmtcbiIpOwogCiAJCQlhdGFfZWhfYWJvdXRfdG9fZG8oc2xhdmUsIE5VTEwsIEFUQV9FSF9SRVNFVCk7CiAJCQl0bXAgPSBhdGFfZG9fcmVzZXQoc2xhdmUsIHJlc2V0LCBjbGFzc2VzLCBkZWFkbGluZSwKQEAgLTI3MzQsOSArMjczMCw4IEBACiAJCQlyZXNldCA9IHNvZnRyZXNldDsKIAogCQkJaWYgKCFyZXNldCkgewotCQkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwKLQkJCQkJCSJmb2xsb3ctdXAgc29mdHJlc2V0IHJlcXVpcmVkICIKLQkJCQkJCSJidXQgbm8gc29mdHJlc2V0IGF2YWlsYWJsZVxuIik7CisJCQkJYXRhX2xpbmtfZXJyKGxpbmssCisJICAgICAiZm9sbG93LXVwIHNvZnRyZXNldCByZXF1aXJlZCBidXQgbm8gc29mdHJlc2V0IGF2YWlsYWJsZVxuIik7CiAJCQkJZmFpbGVkX2xpbmsgPSBsaW5rOwogCQkJCXJjID0gLUVJTlZBTDsKIAkJCQlnb3RvIGZhaWw7CkBAIC0yNzUxLDggKzI3NDYsOCBAQAogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKHZlcmJvc2UpCi0JCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9JTkZPLCAibm8gcmVzZXQgbWV0aG9kICIKLQkJCQkJImF2YWlsYWJsZSwgc2tpcHBpbmcgcmVzZXRcbiIpOworCQkJYXRhX2xpbmtfaW5mbyhsaW5rLAorCSJubyByZXNldCBtZXRob2QgYXZhaWxhYmxlLCBza2lwcGluZyByZXNldFxuIik7CiAJCWlmICghKGxmbGFncyAmIEFUQV9MRkxBR19BU1NVTUVfQ0xBU1MpKQogCQkJbGZsYWdzIHw9IEFUQV9MRkxBR19BU1NVTUVfQVRBOwogCX0KQEAgLTI4MDIsMTAgKzI3OTcsMTEgQEAKIAl9CiAKIAkvKgotCSAqIFNvbWUgY29udHJvbGxlcnMgY2FuJ3QgYmUgZnJvemVuIHZlcnkgd2VsbCBhbmQgbWF5IHNldAotCSAqIHNwdXJ1aW91cyBlcnJvciBjb25kaXRpb25zIGR1cmluZyByZXNldC4gIENsZWFyIGFjY3VtdWxhdGVkCi0JICogZXJyb3IgaW5mb3JtYXRpb24uICBBcyByZXNldCBpcyB0aGUgZmluYWwgcmVjb3ZlcnkgYWN0aW9uLAotCSAqIG5vdGhpbmcgaXMgbG9zdCBieSBkb2luZyB0aGlzLgorCSAqIFNvbWUgY29udHJvbGxlcnMgY2FuJ3QgYmUgZnJvemVuIHZlcnkgd2VsbCBhbmQgbWF5IHNldCBzcHVyaW91cworCSAqIGVycm9yIGNvbmRpdGlvbnMgZHVyaW5nIHJlc2V0LiAgQ2xlYXIgYWNjdW11bGF0ZWQgZXJyb3IKKwkgKiBpbmZvcm1hdGlvbiBhbmQgcmUtdGhhdyB0aGUgcG9ydCBpZiBmcm96ZW4uICBBcyByZXNldCBpcyB0aGUKKwkgKiBmaW5hbCByZWNvdmVyeSBhY3Rpb24gYW5kIHdlIGNyb3NzIGNoZWNrIGxpbmsgb25saW5lbmVzcyBhZ2FpbnN0CisJICogZGV2aWNlIGNsYXNzaWZpY2F0aW9uIGxhdGVyLCBubyBob3RwbHVnIGV2ZW50IGlzIGxvc3QgYnkgdGhpcy4KIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZShsaW5rLT5hcC0+bG9jaywgZmxhZ3MpOwogCW1lbXNldCgmbGluay0+ZWhfaW5mbywgMCwgc2l6ZW9mKGxpbmstPmVoX2luZm8pKTsKQEAgLTI4MTQsNiArMjgxMCw5IEBACiAJYXAtPnBmbGFncyAmPSB+QVRBX1BGTEFHX0VIX1BFTkRJTkc7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsaW5rLT5hcC0+bG9jaywgZmxhZ3MpOwogCisJaWYgKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRlJPWkVOKQorCQlhdGFfZWhfdGhhd19wb3J0KGFwKTsKKwogCS8qCiAJICogTWFrZSBzdXJlIG9ubGluZW5lc3MgYW5kIGNsYXNzaWZpY2F0aW9uIHJlc3VsdCBjb3JyZXNwb25kLgogCSAqIEhvdHBsdWcgY291bGQgaGF2ZSBoYXBwZW5lZCBkdXJpbmcgcmVzZXQgYW5kIHNvbWUKQEAgLTI4MjYsMzYgKzI4MjUsMzUgQEAKIAlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgQUxMKSB7CiAJCWlmIChhdGFfcGh5c19saW5rX29ubGluZShhdGFfZGV2X3BoeXNfbGluayhkZXYpKSkgewogCQkJaWYgKGNsYXNzZXNbZGV2LT5kZXZub10gPT0gQVRBX0RFVl9VTktOT1dOKSB7Ci0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLCAibGluayBvbmxpbmUgIgotCQkJCQkgICAgICAgImJ1dCBkZXZpY2UgbWlzY2xhc3NpZmVkXG4iKTsKKwkJCQlhdGFfZGV2X2RiZyhkZXYsICJsaW5rIG9ubGluZSBidXQgZGV2aWNlIG1pc2NsYXNzaWZpZWRcbiIpOwogCQkJCWNsYXNzZXNbZGV2LT5kZXZub10gPSBBVEFfREVWX05PTkU7CiAJCQkJbnJfdW5rbm93bisrOwogCQkJfQogCQl9IGVsc2UgaWYgKGF0YV9waHlzX2xpbmtfb2ZmbGluZShhdGFfZGV2X3BoeXNfbGluayhkZXYpKSkgewogCQkJaWYgKGF0YV9jbGFzc19lbmFibGVkKGNsYXNzZXNbZGV2LT5kZXZub10pKQotCQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywgImxpbmsgb2ZmbGluZSwgIgotCQkJCQkgICAgICAgImNsZWFyaW5nIGNsYXNzICVkIHRvIE5PTkVcbiIsCi0JCQkJCSAgICAgICBjbGFzc2VzW2Rldi0+ZGV2bm9dKTsKKwkJCQlhdGFfZGV2X2RiZyhkZXYsCisJCQkJCSAgICAibGluayBvZmZsaW5lLCBjbGVhcmluZyBjbGFzcyAlZCB0byBOT05FXG4iLAorCQkJCQkgICAgY2xhc3Nlc1tkZXYtPmRldm5vXSk7CiAJCQljbGFzc2VzW2Rldi0+ZGV2bm9dID0gQVRBX0RFVl9OT05FOwogCQl9IGVsc2UgaWYgKGNsYXNzZXNbZGV2LT5kZXZub10gPT0gQVRBX0RFVl9VTktOT1dOKSB7Ci0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsICJsaW5rIHN0YXR1cyB1bmtub3duLCAiCi0JCQkJICAgICAgICJjbGVhcmluZyBVTktOT1dOIHRvIE5PTkVcbiIpOworCQkJYXRhX2Rldl9kYmcoZGV2LAorCQkJCSAgICAibGluayBzdGF0dXMgdW5rbm93biwgY2xlYXJpbmcgVU5LTk9XTiB0byBOT05FXG4iKTsKIAkJCWNsYXNzZXNbZGV2LT5kZXZub10gPSBBVEFfREVWX05PTkU7CiAJCX0KIAl9CiAKIAlpZiAoY2xhc3NpZnkgJiYgbnJfdW5rbm93bikgewogCQlpZiAodHJ5IDwgbWF4X3RyaWVzKSB7Ci0JCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9XQVJOSU5HLCAibGluayBvbmxpbmUgYnV0ICIKLQkJCQkJIiVkIGRldmljZXMgbWlzY2xhc3NpZmllZCwgcmV0cnlpbmdcbiIsCi0JCQkJCW5yX3Vua25vd24pOworCQkJYXRhX2xpbmtfd2FybihsaW5rLAorCQkJCSAgICAgICJsaW5rIG9ubGluZSBidXQgJWQgZGV2aWNlcyBtaXNjbGFzc2lmaWVkLCByZXRyeWluZ1xuIiwKKwkJCQkgICAgICBucl91bmtub3duKTsKIAkJCWZhaWxlZF9saW5rID0gbGluazsKIAkJCXJjID0gLUVBR0FJTjsKIAkJCWdvdG8gZmFpbDsKIAkJfQotCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9XQVJOSU5HLAotCQkJCSJsaW5rIG9ubGluZSBidXQgJWQgZGV2aWNlcyBtaXNjbGFzc2lmaWVkLCAiCi0JCQkJImRldmljZSBkZXRlY3Rpb24gbWlnaHQgZmFpbFxuIiwgbnJfdW5rbm93bik7CisJCWF0YV9saW5rX3dhcm4obGluaywKKwkJCSAgICAgICJsaW5rIG9ubGluZSBidXQgJWQgZGV2aWNlcyBtaXNjbGFzc2lmaWVkLCAiCisJCQkgICAgICAiZGV2aWNlIGRldGVjdGlvbiBtaWdodCBmYWlsXG4iLCBucl91bmtub3duKTsKIAl9CiAKIAkvKiByZXNldCBzdWNjZXNzZnVsLCBzY2hlZHVsZSByZXZhbGlkYXRpb24gKi8KQEAgLTI4ODUsMTQgKzI4ODMsMjMgQEAKIAkgICAgc2F0YV9zY3JfcmVhZChsaW5rLCBTQ1JfU1RBVFVTLCAmc3N0YXR1cykpCiAJCXJjID0gLUVSRVNUQVJUOwogCi0JaWYgKHJjID09IC1FUkVTVEFSVCB8fCB0cnkgPj0gbWF4X3RyaWVzKQorCWlmIChyYyA9PSAtRVJFU1RBUlQgfHwgdHJ5ID49IG1heF90cmllcykgeworCQkvKgorCQkgKiBUaGF3IGhvc3QgcG9ydCBldmVuIGlmIHJlc2V0IGZhaWxlZCwgc28gdGhhdCB0aGUgcG9ydAorCQkgKiBjYW4gYmUgcmV0cmllZCBvbiB0aGUgbmV4dCBwaHkgZXZlbnQuICBUaGlzIHJpc2tzCisJCSAqIHJlcGVhdGVkIEVIIHJ1bnMgYnV0IHNlZW1zIHRvIGJlIGEgYmV0dGVyIHRyYWRlb2ZmIHRoYW4KKwkJICogc2h1dHRpbmcgZG93biBhIHBvcnQgYWZ0ZXIgYSBib3RjaGVkIGhvdHBsdWcgYXR0ZW1wdC4KKwkJICovCisJCWlmIChhdGFfaXNfaG9zdF9saW5rKGxpbmspKQorCQkJYXRhX2VoX3RoYXdfcG9ydChhcCk7CiAJCWdvdG8gb3V0OworCX0KIAogCW5vdyA9IGppZmZpZXM7CiAJaWYgKHRpbWVfYmVmb3JlKG5vdywgZGVhZGxpbmUpKSB7CiAJCXVuc2lnbmVkIGxvbmcgZGVsdGEgPSBkZWFkbGluZSAtIG5vdzsKIAotCQlhdGFfbGlua19wcmludGsoZmFpbGVkX2xpbmssIEtFUk5fV0FSTklORywKKwkJYXRhX2xpbmtfd2FybihmYWlsZWRfbGluaywKIAkJCSJyZXNldCBmYWlsZWQgKGVycm5vPSVkKSwgcmV0cnlpbmcgaW4gJXUgc2Vjc1xuIiwKIAkJCXJjLCBESVZfUk9VTkRfVVAoamlmZmllc190b19tc2VjcyhkZWx0YSksIDEwMDApKTsKIApAQCAtMjk4Myw3ICsyOTkwLDcgQEAKIAl0Zi5wcm90b2NvbCB8PSBBVEFfUFJPVF9OT0RBVEE7CiAJZXJyX21hc2sgPSBhdGFfZXhlY19pbnRlcm5hbChkZXYsICZ0ZiwgTlVMTCwgRE1BX05PTkUsIE5VTEwsIDAsIDApOwogCWlmIChwYXJrICYmIChlcnJfbWFzayB8fCB0Zi5sYmFsICE9IDB4YzQpKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9FUlIsICJoZWFkIHVubG9hZCBmYWlsZWQhXG4iKTsKKwkJYXRhX2Rldl9lcnIoZGV2LCAiaGVhZCB1bmxvYWQgZmFpbGVkIVxuIik7CiAJCWVoYy0+dW5sb2FkZWRfbWFzayAmPSB+KDEgPDwgZGV2LT5kZXZubyk7CiAJfQogfQpAQCAtMzE5NCw4ICszMjAxLDkgQEAKIAogCQllcnJfbWFzayA9IGF0YXBpX2VoX3R1cihkZXYsICZzZW5zZV9rZXkpOwogCQlpZiAoZXJyX21hc2sgIT0gMCAmJiBlcnJfbWFzayAhPSBBQ19FUlJfREVWKSB7Ci0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywgIlRFU1RfVU5JVF9SRUFEWSAiCi0JCQkJImZhaWxlZCAoZXJyX21hc2s9MHgleClcbiIsIGVycl9tYXNrKTsKKwkJCWF0YV9kZXZfd2FybihkZXYsCisJCQkJICAgICAiVEVTVF9VTklUX1JFQURZIGZhaWxlZCAoZXJyX21hc2s9MHgleClcbiIsCisJCQkJICAgICBlcnJfbWFzayk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCkBAIC0zMjA0LDE0ICszMjEyLDE0IEBACiAKIAkJZXJyX21hc2sgPSBhdGFwaV9laF9yZXF1ZXN0X3NlbnNlKGRldiwgc2Vuc2VfYnVmZmVyLCBzZW5zZV9rZXkpOwogCQlpZiAoZXJyX21hc2spIHsKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCAiZmFpbGVkIHRvIGNsZWFyICIKKwkJCWF0YV9kZXZfd2FybihkZXYsICJmYWlsZWQgdG8gY2xlYXIgIgogCQkJCSJVTklUIEFUVEVOVElPTiAoZXJyX21hc2s9MHgleClcbiIsIGVycl9tYXNrKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJfQogCi0JYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCi0JCSJVTklUIEFUVEVOVElPTiBwZXJzaXN0cyBhZnRlciAlZCB0cmllc1xuIiwgQVRBX0VIX1VBX1RSSUVTKTsKKwlhdGFfZGV2X3dhcm4oZGV2LCAiVU5JVCBBVFRFTlRJT04gcGVyc2lzdHMgYWZ0ZXIgJWQgdHJpZXNcbiIsCisJCSAgICAgQVRBX0VIX1VBX1RSSUVTKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzI2Miw3ICszMjcwLDcgQEAKIAl0Zi5mbGFncyB8PSBBVEFfVEZMQUdfREVWSUNFOwogCXRmLnByb3RvY29sID0gQVRBX1BST1RfTk9EQVRBOwogCi0JYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsICJyZXRyeWluZyBGTFVTSCAweCV4IEVtYXNrIDB4JXhcbiIsCisJYXRhX2Rldl93YXJuKGRldiwgInJldHJ5aW5nIEZMVVNIIDB4JXggRW1hc2sgMHgleFxuIiwKIAkJICAgICAgIHRmLmNvbW1hbmQsIHFjLT5lcnJfbWFzayk7CiAKIAllcnJfbWFzayA9IGF0YV9leGVjX2ludGVybmFsKGRldiwgJnRmLCBOVUxMLCBETUFfTk9ORSwgTlVMTCwgMCwgMCk7CkBAIC0zMjc3LDcgKzMyODUsNyBAQAogCQkgKi8KIAkJcWMtPnNjc2ljbWQtPmFsbG93ZWQgPSBtYXgocWMtPnNjc2ljbWQtPmFsbG93ZWQsIDEpOwogCX0gZWxzZSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCAiRkxVU0ggZmFpbGVkIEVtYXNrIDB4JXhcbiIsCisJCWF0YV9kZXZfd2FybihkZXYsICJGTFVTSCBmYWlsZWQgRW1hc2sgMHgleFxuIiwKIAkJCSAgICAgICBlcnJfbWFzayk7CiAJCXJjID0gLUVJTzsKIApAQCAtMzM1MSw5ICszMzU5LDkgQEAKIAkJCWVycl9tYXNrID0gYXRhX2Rldl9zZXRfZmVhdHVyZShkZXYsCiAJCQkJCVNFVEZFQVRVUkVTX1NBVEFfRElTQUJMRSwgU0FUQV9ESVBNKTsKIAkJCWlmIChlcnJfbWFzayAmJiBlcnJfbWFzayAhPSBBQ19FUlJfREVWKSB7Ci0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCi0JCQkJCSJmYWlsZWQgdG8gZGlzYWJsZSBESVBNLCBFbWFzayAweCV4XG4iLAotCQkJCQllcnJfbWFzayk7CisJCQkJYXRhX2Rldl93YXJuKGRldiwKKwkJCQkJICAgICAiZmFpbGVkIHRvIGRpc2FibGUgRElQTSwgRW1hc2sgMHgleFxuIiwKKwkJCQkJICAgICBlcnJfbWFzayk7CiAJCQkJcmMgPSAtRUlPOwogCQkJCWdvdG8gZmFpbDsKIAkJCX0KQEAgLTMzOTUsNyArMzQwMyw3IEBACiAJCQllcnJfbWFzayA9IGF0YV9kZXZfc2V0X2ZlYXR1cmUoZGV2LAogCQkJCQlTRVRGRUFUVVJFU19TQVRBX0VOQUJMRSwgU0FUQV9ESVBNKTsKIAkJCWlmIChlcnJfbWFzayAmJiBlcnJfbWFzayAhPSBBQ19FUlJfREVWKSB7Ci0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCisJCQkJYXRhX2Rldl93YXJuKGRldiwKIAkJCQkJImZhaWxlZCB0byBlbmFibGUgRElQTSwgRW1hc2sgMHgleFxuIiwKIAkJCQkJZXJyX21hc2spOwogCQkJCXJjID0gLUVJTzsKQEAgLTM0MTQsOCArMzQyMiw3IEBACiAKIAkvKiBpZiBubyBkZXZpY2Ugb3Igb25seSBvbmUgbW9yZSBjaGFuY2UgaXMgbGVmdCwgZGlzYWJsZSBMUE0gKi8KIAlpZiAoIWRldiB8fCBlaGMtPnRyaWVzW2Rldi0+ZGV2bm9dIDw9IDIpIHsKLQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fV0FSTklORywKLQkJCQkiZGlzYWJsaW5nIExQTSBvbiB0aGUgbGlua1xuIik7CisJCWF0YV9saW5rX3dhcm4obGluaywgImRpc2FibGluZyBMUE0gb24gdGhlIGxpbmtcbiIpOwogCQlsaW5rLT5mbGFncyB8PSBBVEFfTEZMQUdfTk9fTFBNOwogCX0KIAlpZiAocl9mYWlsZWRfZGV2KQpAQCAtMzY4Niw4ICszNjkzLDcgQEAKIAkJcmMgPSBhdGFfZWhfcmVzZXQobGluaywgYXRhX2xpbmtfbnJfdmFjYW50KGxpbmspLAogCQkJCSAgcHJlcmVzZXQsIHNvZnRyZXNldCwgaGFyZHJlc2V0LCBwb3N0cmVzZXQpOwogCQlpZiAocmMpIHsKLQkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwKLQkJCQkJInJlc2V0IGZhaWxlZCwgZ2l2aW5nIHVwXG4iKTsKKwkJCWF0YV9saW5rX2VycihsaW5rLCAicmVzZXQgZmFpbGVkLCBnaXZpbmcgdXBcbiIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtcG1wLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtcG1wLmMKaW5kZXggZjA2YjdlYS4uM2ViMmI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXBtcC5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1wbXAuYwpAQCAtMTQ3LDggKzE0Nyw4IEBACiAKIAllcnJfbWFzayA9IHNhdGFfcG1wX3JlYWQobGluaywgcmVnLCByX3ZhbCk7CiAJaWYgKGVycl9tYXNrKSB7Ci0JCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX1dBUk5JTkcsICJmYWlsZWQgdG8gcmVhZCBTQ1IgJWQgIgotCQkJCSIoRW1hc2s9MHgleClcbiIsIHJlZywgZXJyX21hc2spOworCQlhdGFfbGlua193YXJuKGxpbmssICJmYWlsZWQgdG8gcmVhZCBTQ1IgJWQgKEVtYXNrPTB4JXgpXG4iLAorCQkJICAgICAgcmVnLCBlcnJfbWFzayk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE3OCw4ICsxNzgsOCBAQAogCiAJZXJyX21hc2sgPSBzYXRhX3BtcF93cml0ZShsaW5rLCByZWcsIHZhbCk7CiAJaWYgKGVycl9tYXNrKSB7Ci0JCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX1dBUk5JTkcsICJmYWlsZWQgdG8gd3JpdGUgU0NSICVkICIKLQkJCQkiKEVtYXNrPTB4JXgpXG4iLCByZWcsIGVycl9tYXNrKTsKKwkJYXRhX2xpbmtfd2FybihsaW5rLCAiZmFpbGVkIHRvIHdyaXRlIFNDUiAlZCAoRW1hc2s9MHgleClcbiIsCisJCQkgICAgICByZWcsIGVycl9tYXNrKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXJldHVybiAwOwpAQCAtMjMxLDggKzIzMSw4IEBACiAKIAkJZXJyX21hc2sgPSBzYXRhX3BtcF9yZWFkKGRldi0+bGluaywgcmVnLCAmZ3NjcltyZWddKTsKIAkJaWYgKGVycl9tYXNrKSB7Ci0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIHJlYWQgUE1QICIKLQkJCQkiR1NDUlslZF0gKEVtYXNrPTB4JXgpXG4iLCByZWcsIGVycl9tYXNrKTsKKwkJCWF0YV9kZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWFkIFBNUCBHU0NSWyVkXSAoRW1hc2s9MHgleClcbiIsCisJCQkJICAgIHJlZywgZXJyX21hc2spOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9CkBAIC0zMTEsMjYgKzMxMSwyNSBAQAogCX0KIAogCWlmIChwcmludF9pbmZvKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiUG9ydCBNdWx0aXBsaWVyICVzLCAiCi0JCQkgICAgICAgIjB4JTA0eDoweCUwNHggciVkLCAlZCBwb3J0cywgZmVhdCAweCV4LzB4JXhcbiIsCi0JCQkgICAgICAgc2F0YV9wbXBfc3BlY19yZXZfc3RyKGdzY3IpLCB2ZW5kb3IsIGRldmlkLAotCQkJICAgICAgIHNhdGFfcG1wX2dzY3JfcmV2KGdzY3IpLAotCQkJICAgICAgIG5yX3BvcnRzLCBnc2NyW1NBVEFfUE1QX0dTQ1JfRkVBVF9FTl0sCi0JCQkgICAgICAgZ3NjcltTQVRBX1BNUF9HU0NSX0ZFQVRdKTsKKwkJYXRhX2Rldl9pbmZvKGRldiwgIlBvcnQgTXVsdGlwbGllciAlcywgIgorCQkJICAgICAiMHglMDR4OjB4JTA0eCByJWQsICVkIHBvcnRzLCBmZWF0IDB4JXgvMHgleFxuIiwKKwkJCSAgICAgc2F0YV9wbXBfc3BlY19yZXZfc3RyKGdzY3IpLCB2ZW5kb3IsIGRldmlkLAorCQkJICAgICBzYXRhX3BtcF9nc2NyX3Jldihnc2NyKSwKKwkJCSAgICAgbnJfcG9ydHMsIGdzY3JbU0FUQV9QTVBfR1NDUl9GRUFUX0VOXSwKKwkJCSAgICAgZ3NjcltTQVRBX1BNUF9HU0NSX0ZFQVRdKTsKIAogCQlpZiAoIShkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0FOKSkKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLAorCQkJYXRhX2Rldl9pbmZvKGRldiwKIAkJCQkiQXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbiBub3Qgc3VwcG9ydGVkLCAiCi0JCQkJImhvdHBsdWcgd29uJ3RcbiAgICAgICAgIHdvcmsgb24gZmFuLW91dCAiCi0JCQkJInBvcnRzLiBVc2Ugd2FybS1wbHVnIGluc3RlYWQuXG4iKTsKKwkJCQkiaG90cGx1ZyB3b24ndCB3b3JrIG9uIGZhbi1vdXQgcG9ydHMuIFVzZSB3YXJtLXBsdWcgaW5zdGVhZC5cbiIpOwogCX0KIAogCXJldHVybiAwOwogCiAgZmFpbDoKLQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fRVJSLAotCQkgICAgICAgImZhaWxlZCB0byBjb25maWd1cmUgUG9ydCBNdWx0aXBsaWVyICglcywgRW1hc2s9MHgleClcbiIsCi0JCSAgICAgICByZWFzb24sIGVycl9tYXNrKTsKKwlhdGFfZGV2X2VycihkZXYsCisJCSAgICAiZmFpbGVkIHRvIGNvbmZpZ3VyZSBQb3J0IE11bHRpcGxpZXIgKCVzLCBFbWFzaz0weCV4KVxuIiwKKwkJICAgIHJlYXNvbiwgZXJyX21hc2spOwogCXJldHVybiByYzsKIH0KIApAQCAtNDg1LDIwICs0ODQsMTcgQEAKIAogCS8qIGlzIGl0IGhhbmdpbmcgb2ZmIHRoZSByaWdodCBwbGFjZT8gKi8KIAlpZiAoIXNhdGFfcG1wX3N1cHBvcnRlZChhcCkpIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0VSUiwKLQkJCSAgICAgICAiaG9zdCBkb2VzIG5vdCBzdXBwb3J0IFBvcnQgTXVsdGlwbGllclxuIik7CisJCWF0YV9kZXZfZXJyKGRldiwgImhvc3QgZG9lcyBub3Qgc3VwcG9ydCBQb3J0IE11bHRpcGxpZXJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoIWF0YV9pc19ob3N0X2xpbmsobGluaykpIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0VSUiwKLQkJCSAgICAgICAiUG9ydCBNdWx0aXBsaWVycyBjYW5ub3QgYmUgbmVzdGVkXG4iKTsKKwkJYXRhX2Rldl9lcnIoZGV2LCAiUG9ydCBNdWx0aXBsaWVycyBjYW5ub3QgYmUgbmVzdGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGRldi0+ZGV2bm8pIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0VSUiwKLQkJCSAgICAgICAiUG9ydCBNdWx0aXBsaWVyIG11c3QgYmUgdGhlIGZpcnN0IGRldmljZVxuIik7CisJCWF0YV9kZXZfZXJyKGRldiwgIlBvcnQgTXVsdGlwbGllciBtdXN0IGJlIHRoZSBmaXJzdCBkZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTUxNyw4ICs1MTMsNyBAQAogCiAJcmMgPSBzYXRhX3BtcF9pbml0X2xpbmtzKGFwLCBzYXRhX3BtcF9nc2NyX3BvcnRzKGRldi0+Z3NjcikpOwogCWlmIChyYykgewotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywKLQkJCSAgICAgICAiZmFpbGVkIHRvIGluaXRpYWxpemUgUE1QIGxpbmtzXG4iKTsKKwkJYXRhX2Rldl9pbmZvKGRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIFBNUCBsaW5rc1xuIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTU2Miw3ICs1NTcsNyBAQAogCXN0cnVjdCBhdGFfbGluayAqdGxpbms7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiUG9ydCBNdWx0aXBsaWVyIGRldGFjaGluZ1xuIik7CisJYXRhX2Rldl9pbmZvKGRldiwgIlBvcnQgTXVsdGlwbGllciBkZXRhY2hpbmdcbiIpOwogCiAJV0FSTl9PTighYXRhX2lzX2hvc3RfbGluayhsaW5rKSB8fCBkZXYtPmRldm5vIHx8CiAJCWxpbmstPnBtcCAhPSBTQVRBX1BNUF9DVFJMX1BPUlQpOwpAQCAtNjA5LDIzICs2MDQsMjMgQEAKIAluZXdfbnJfcG9ydHMgPSBzYXRhX3BtcF9nc2NyX3BvcnRzKG5ld19nc2NyKTsKIAogCWlmIChvbGRfdmVuZG9yICE9IG5ld192ZW5kb3IpIHsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJQb3J0IE11bHRpcGxpZXIgIgotCQkJICAgICAgICJ2ZW5kb3IgbWlzbWF0Y2ggJzB4JXgnICE9ICcweCV4J1xuIiwKLQkJCSAgICAgICBvbGRfdmVuZG9yLCBuZXdfdmVuZG9yKTsKKwkJYXRhX2Rldl9pbmZvKGRldiwKKwkJCSAgICAgIlBvcnQgTXVsdGlwbGllciB2ZW5kb3IgbWlzbWF0Y2ggJzB4JXgnICE9ICcweCV4J1xuIiwKKwkJCSAgICAgb2xkX3ZlbmRvciwgbmV3X3ZlbmRvcik7CiAJCXJldHVybiAwOwogCX0KIAogCWlmIChvbGRfZGV2aWQgIT0gbmV3X2RldmlkKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiUG9ydCBNdWx0aXBsaWVyICIKLQkJCSAgICAgICAiZGV2aWNlIElEIG1pc21hdGNoICcweCV4JyAhPSAnMHgleCdcbiIsCi0JCQkgICAgICAgb2xkX2RldmlkLCBuZXdfZGV2aWQpOworCQlhdGFfZGV2X2luZm8oZGV2LAorCQkJICAgICAiUG9ydCBNdWx0aXBsaWVyIGRldmljZSBJRCBtaXNtYXRjaCAnMHgleCcgIT0gJzB4JXgnXG4iLAorCQkJICAgICBvbGRfZGV2aWQsIG5ld19kZXZpZCk7CiAJCXJldHVybiAwOwogCX0KIAogCWlmIChvbGRfbnJfcG9ydHMgIT0gbmV3X25yX3BvcnRzKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiUG9ydCBNdWx0aXBsaWVyICIKLQkJCSAgICAgICAibnJfcG9ydHMgbWlzbWF0Y2ggJzB4JXgnICE9ICcweCV4J1xuIiwKLQkJCSAgICAgICBvbGRfbnJfcG9ydHMsIG5ld19ucl9wb3J0cyk7CisJCWF0YV9kZXZfaW5mbyhkZXYsCisJCQkgICAgICJQb3J0IE11bHRpcGxpZXIgbnJfcG9ydHMgbWlzbWF0Y2ggJzB4JXgnICE9ICcweCV4J1xuIiwKKwkJCSAgICAgb2xkX25yX3BvcnRzLCBuZXdfbnJfcG9ydHMpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTY5MSw4ICs2ODYsNyBAQAogCXJldHVybiAwOwogCiAgZmFpbDoKLQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fRVJSLAotCQkgICAgICAgIlBNUCByZXZhbGlkYXRpb24gZmFpbGVkIChlcnJubz0lZClcbiIsIHJjKTsKKwlhdGFfZGV2X2VycihkZXYsICJQTVAgcmV2YWxpZGF0aW9uIGZhaWxlZCAoZXJybm89JWQpXG4iLCByYyk7CiAJRFBSSU5USygiRVhJVCwgcmM9JWRcbiIsIHJjKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC03MTYsMTMgKzcxMCwxNCBAQAogCiAJZXJyX21hc2sgPSBzYXRhX3BtcF9yZWFkKGRldi0+bGluaywgU0FUQV9QTVBfR1NDUl9QUk9EX0lELCAmcHJvZF9pZCk7CiAJaWYgKGVycl9tYXNrKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9FUlIsICJmYWlsZWQgdG8gcmVhZCBQTVAgcHJvZHVjdCBJRCAiCi0JCQkgICAgICAgIihFbWFzaz0weCV4KVxuIiwgZXJyX21hc2spOworCQlhdGFfZGV2X2VycihkZXYsCisJCQkgICAgImZhaWxlZCB0byByZWFkIFBNUCBwcm9kdWN0IElEIChFbWFzaz0weCV4KVxuIiwKKwkJCSAgICBlcnJfbWFzayk7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCWlmIChwcm9kX2lkICE9IGRldi0+Z3NjcltTQVRBX1BNUF9HU0NSX1BST0RfSURdKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9FUlIsICJQTVAgcHJvZHVjdCBJRCBtaXNtYXRjaFxuIik7CisJCWF0YV9kZXZfZXJyKGRldiwgIlBNUCBwcm9kdWN0IElEIG1pc21hdGNoXG4iKTsKIAkJLyogc29tZXRoaW5nIHdlaXJkIGlzIGdvaW5nIG9uLCByZXF1ZXN0IGZ1bGwgUE1QIHJlY292ZXJ5ICovCiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTc3Nyw4ICs3NzIsNyBAQAogCQlyYyA9IGF0YV9laF9yZXNldChsaW5rLCAwLCBwcmVyZXNldCwgc29mdHJlc2V0LCBoYXJkcmVzZXQsCiAJCQkJICBwb3N0cmVzZXQpOwogCQlpZiAocmMpIHsKLQkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwKLQkJCQkJImZhaWxlZCB0byByZXNldCBQTVAsIGdpdmluZyB1cFxuIik7CisJCQlhdGFfbGlua19lcnIobGluaywgImZhaWxlZCB0byByZXNldCBQTVAsIGdpdmluZyB1cFxuIik7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIApAQCAtODE5LDkgKzgxMyw5IEBACiAJCQllaGMtPmkuYWN0aW9uIHw9IEFUQV9FSF9SRVNFVDsKIAkJCWdvdG8gcmV0cnk7CiAJCX0gZWxzZSB7Ci0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIHJlY292ZXIgUE1QICIKLQkJCQkgICAgICAgImFmdGVyICVkIHRyaWVzLCBnaXZpbmcgdXBcbiIsCi0JCQkJICAgICAgIEFUQV9FSF9QTVBfVFJJRVMpOworCQkJYXRhX2Rldl9lcnIoZGV2LAorCQkJCSAgICAiZmFpbGVkIHRvIHJlY292ZXIgUE1QIGFmdGVyICVkIHRyaWVzLCBnaXZpbmcgdXBcbiIsCisJCQkJICAgIEFUQV9FSF9QTVBfVFJJRVMpOwogCQkJZ290byBmYWlsOwogCQl9CiAJfQpAQCAtODY3LDggKzg2MSw5IEBACiAJCS8qIHVuY29uZGl0aW9uYWxseSBjbGVhciBTRXJyb3IuTiAqLwogCQlyYyA9IHNhdGFfc2NyX3dyaXRlKGxpbmssIFNDUl9FUlJPUiwgU0VSUl9QSFlSRFlfQ0hHKTsKIAkJaWYgKHJjKSB7Ci0JCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9FUlIsICJmYWlsZWQgdG8gY2xlYXIgIgotCQkJCQkiU0Vycm9yLk4gKGVycm5vPSVkKVxuIiwgcmMpOworCQkJYXRhX2xpbmtfZXJyKGxpbmssCisJCQkJICAgICAiZmFpbGVkIHRvIGNsZWFyIFNFcnJvci5OIChlcnJubz0lZClcbiIsCisJCQkJICAgICByYyk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIApAQCAtODkwLDcgKzg4NSw3IEBACiAKIAkvKiBkaXNhYmxlIHRoaXMgbGluayAqLwogCWlmICghKGxpbmstPmZsYWdzICYgQVRBX0xGTEFHX0RJU0FCTEVEKSkgewotCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9XQVJOSU5HLAorCQlhdGFfbGlua193YXJuKGxpbmssCiAJCQkiZmFpbGVkIHRvIHJlY292ZXIgbGluayBhZnRlciAlZCB0cmllcywgZGlzYWJsaW5nXG4iLAogCQkJQVRBX0VIX1BNUF9MSU5LX1RSSUVTKTsKIApAQCAtOTc0LDcgKzk2OSw3IEBACiAJCWVycl9tYXNrID0gc2F0YV9wbXBfd3JpdGUocG1wX2xpbmssIFNBVEFfUE1QX0dTQ1JfRkVBVF9FTiwKIAkJCQkJICBnc2NyW1NBVEFfUE1QX0dTQ1JfRkVBVF9FTl0pOwogCQlpZiAoZXJyX21hc2spIHsKLQkJCWF0YV9saW5rX3ByaW50ayhwbXBfbGluaywgS0VSTl9XQVJOSU5HLAorCQkJYXRhX2xpbmtfd2FybihwbXBfbGluaywKIAkJCQkiZmFpbGVkIHRvIGRpc2FibGUgTk9USUZZIChlcnJfbWFzaz0weCV4KVxuIiwKIAkJCQllcnJfbWFzayk7CiAJCQlnb3RvIHBtcF9mYWlsOwpAQCAtMTAxOCw4ICsxMDEzLDkgQEAKIAkJZXJyX21hc2sgPSBzYXRhX3BtcF93cml0ZShwbXBfbGluaywgU0FUQV9QTVBfR1NDUl9GRUFUX0VOLAogCQkJCQkgIGdzY3JbU0FUQV9QTVBfR1NDUl9GRUFUX0VOXSk7CiAJCWlmIChlcnJfbWFzaykgewotCQkJYXRhX2Rldl9wcmludGsocG1wX2RldiwgS0VSTl9FUlIsICJmYWlsZWQgdG8gd3JpdGUgIgotCQkJCSAgICAgICAiUE1QX0ZFQVRfRU4gKEVtYXNrPTB4JXgpXG4iLCBlcnJfbWFzayk7CisJCQlhdGFfZGV2X2VycihwbXBfZGV2LAorCQkJCSAgICAiZmFpbGVkIHRvIHdyaXRlIFBNUF9GRUFUX0VOIChFbWFzaz0weCV4KVxuIiwKKwkJCQkgICAgZXJyX21hc2spOwogCQkJcmMgPSAtRUlPOwogCQkJZ290byBwbXBfZmFpbDsKIAkJfQpAQCAtMTAyOCw4ICsxMDI0LDkgQEAKIAkvKiBjaGVjayBHU0NSX0VSUk9SICovCiAJZXJyX21hc2sgPSBzYXRhX3BtcF9yZWFkKHBtcF9saW5rLCBTQVRBX1BNUF9HU0NSX0VSUk9SLCAmZ3Njcl9lcnJvcik7CiAJaWYgKGVycl9tYXNrKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKHBtcF9kZXYsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIHJlYWQgIgotCQkJICAgICAgICJQTVBfR1NDUl9FUlJPUiAoRW1hc2s9MHgleClcbiIsIGVycl9tYXNrKTsKKwkJYXRhX2Rldl9lcnIocG1wX2RldiwKKwkJCSAgICAiZmFpbGVkIHRvIHJlYWQgUE1QX0dTQ1JfRVJST1IgKEVtYXNrPTB4JXgpXG4iLAorCQkJICAgIGVycl9tYXNrKTsKIAkJcmMgPSAtRUlPOwogCQlnb3RvIHBtcF9mYWlsOwogCX0KQEAgLTEwNDMsMTcgKzEwNDAsMTYgQEAKIAkJCWF0YV9laGlfaG90cGx1Z2dlZCgmbGluay0+ZWhfY29udGV4dC5pKTsKIAkJCWNudCsrOwogCQl9IGVsc2UgewotCQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fV0FSTklORywKLQkJCQkiUEhZIHN0YXR1cyBjaGFuZ2VkIGJ1dCBtYXhlZCBvdXQgb24gcmV0cmllcywgIgotCQkJCSJnaXZpbmcgdXBcbiIpOwotCQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fV0FSTklORywKLQkJCQkiTWFudWxseSBpc3N1ZSBzY2FuIHRvIHJlc3VtZSB0aGlzIGxpbmtcbiIpOworCQkJYXRhX2xpbmtfd2FybihsaW5rLAorCQkJCSJQSFkgc3RhdHVzIGNoYW5nZWQgYnV0IG1heGVkIG91dCBvbiByZXRyaWVzLCBnaXZpbmcgdXBcbiIpOworCQkJYXRhX2xpbmtfd2FybihsaW5rLAorCQkJCSJNYW51YWxseSBpc3N1ZSBzY2FuIHRvIHJlc3VtZSB0aGlzIGxpbmtcbiIpOwogCQl9CiAJfQogCiAJaWYgKGNudCkgewotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywgIlBNUCBTRXJyb3IuTiBzZXQgZm9yIHNvbWUgIgotCQkJCSJwb3J0cywgcmVwZWF0aW5nIHJlY292ZXJ5XG4iKTsKKwkJYXRhX3BvcnRfaW5mbyhhcCwKKwkJCSJQTVAgU0Vycm9yLk4gc2V0IGZvciBzb21lIHBvcnRzLCByZXBlYXRpbmcgcmVjb3ZlcnlcbiIpOwogCQlnb3RvIHJldHJ5OwogCX0KIApAQCAtMTA4MSw5ICsxMDc3LDggQEAKIAkJZ290byByZXRyeTsKIAl9CiAKLQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLAotCQkJImZhaWxlZCB0byByZWNvdmVyIFBNUCBhZnRlciAlZCB0cmllcywgZ2l2aW5nIHVwXG4iLAotCQkJQVRBX0VIX1BNUF9UUklFUyk7CisJYXRhX3BvcnRfZXJyKGFwLCAiZmFpbGVkIHRvIHJlY292ZXIgUE1QIGFmdGVyICVkIHRyaWVzLCBnaXZpbmcgdXBcbiIsCisJCSAgICAgQVRBX0VIX1BNUF9UUklFUyk7CiAJc2F0YV9wbXBfZGV0YWNoKHBtcF9kZXYpOwogCWF0YV9kZXZfZGlzYWJsZShwbXBfZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKaW5kZXggZDUxZjk3OS4uNDZkMDg3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCkBAIC0xMTA4LDggKzExMDgsNyBAQAogCQkvKiBjb25maWd1cmUgZHJhaW5pbmcgKi8KIAkJYnVmID0ga21hbGxvYyhBVEFQSV9NQVhfRFJBSU4sIHEtPmJvdW5jZV9nZnAgfCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFidWYpIHsKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9FUlIsCi0JCQkJICAgICAgICJkcmFpbiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJYXRhX2Rldl9lcnIoZGV2LCAiZHJhaW4gYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKQEAgLTExMjcsNyArMTEyNiw3IEBACiAJICogSURFTlRJRllfUEFDS0VUIGlzIGV4ZWN1dGVkIGFzIEFUQV9QUk9UX1BJTy4KIAkgKi8KIAlpZiAoc2Rldi0+c2VjdG9yX3NpemUgPiBQQUdFX1NJWkUpCi0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLAorCQlhdGFfZGV2X3dhcm4oZGV2LAogCQkJInNlY3Rvcl9zaXplPSV1ID4gUEFHRV9TSVpFLCBQSU8gbWF5IG1hbGZ1bmN0aW9uXG4iLAogCQkJc2Rldi0+c2VjdG9yX3NpemUpOwogCkBAIC0xNzg0LDggKzE3ODMsNyBAQAogCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSB8fAogCSAgICBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKIAkJaWYgKHVubGlrZWx5KHNjc2lfYnVmZmxlbihjbWQpIDwgMSkpIHsKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLAotCQkJCSAgICAgICAiV0FSTklORzogemVybyBsZW4gci93IHJlcVxuIik7CisJCQlhdGFfZGV2X3dhcm4oZGV2LCAiV0FSTklORzogemVybyBsZW4gci93IHJlcVxuIik7CiAJCQlnb3RvIGVycl9kaWQ7CiAJCX0KIApAQCAtMjk2OSw5ICsyOTY3LDggQEAKIAkJICogd2l0aCB0aGUgY2FjaGVkIG11bHRpX2NvdW50IG9mIGxpYmF0YQogCQkgKi8KIAkJaWYgKG11bHRpX2NvdW50ICE9IGRldi0+bXVsdGlfY291bnQpCi0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywKLQkJCQkgICAgICAgImludmFsaWQgbXVsdGlfY291bnQgJXUgaWdub3JlZFxuIiwKLQkJCQkgICAgICAgbXVsdGlfY291bnQpOworCQkJYXRhX2Rldl93YXJuKGRldiwgImludmFsaWQgbXVsdGlfY291bnQgJXUgaWdub3JlZFxuIiwKKwkJCQkgICAgIG11bHRpX2NvdW50KTsKIAl9CiAKIAkvKgpAQCAtMzQ2Niw5ICszNDYzLDggQEAKIAkJCWdvdG8gcmVwZWF0OwogCQl9CiAKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgIldBUk5JTkc6IHN5bmNocm9ub3VzIFNDU0kgc2NhbiAiCi0JCQkJImZhaWxlZCB3aXRob3V0IG1ha2luZyBhbnkgcHJvZ3Jlc3MsXG4iCi0JCQkJIiAgICAgICAgICAgICAgICAgIHN3aXRjaGluZyB0byBhc3luY1xuIik7CisJCWF0YV9wb3J0X2VycihhcCwKKwkJCSAgICAgIldBUk5JTkc6IHN5bmNocm9ub3VzIFNDU0kgc2NhbiBmYWlsZWQgd2l0aG91dCBtYWtpbmcgYW55IHByb2dyZXNzLCBzd2l0Y2hpbmcgdG8gYXN5bmNcbiIpOwogCX0KIAogCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fbG9uZ193cSwgJmFwLT5ob3RwbHVnX3Rhc2ssCkBAIC0zNTUwLDggKzM1NDYsOCBAQAogCW11dGV4X3VubG9jaygmYXAtPnNjc2lfaG9zdC0+c2Nhbl9tdXRleCk7CiAKIAlpZiAoc2RldikgewotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImRldGFjaGluZyAoU0NTSSAlcylcbiIsCi0JCQkgICAgICAgZGV2X25hbWUoJnNkZXYtPnNkZXZfZ2VuZGV2KSk7CisJCWF0YV9kZXZfaW5mbyhkZXYsICJkZXRhY2hpbmcgKFNDU0kgJXMpXG4iLAorCQkJICAgICBkZXZfbmFtZSgmc2Rldi0+c2Rldl9nZW5kZXYpKTsKIAogCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2Rldik7CiAJCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKQEAgLTM3OTcsNiArMzc5MywxMiBAQAogICovCiBpbnQgYXRhX3Nhc19wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJLyoKKwkgKiB0aGUgcG9ydCBpcyBtYXJrZWQgYXMgZnJvemVuIGF0IGFsbG9jYXRpb24gdGltZSwgYnV0IGlmIHdlIGRvbid0CisJICogaGF2ZSBuZXcgZWgsIHdlIHdvbid0IHRoYXcgaXQKKwkgKi8KKwlpZiAoIWFwLT5vcHMtPmVycm9yX2hhbmRsZXIpCisJCWFwLT5wZmxhZ3MgJj0gfkFUQV9QRkxBR19GUk9aRU47CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2FzX3BvcnRfc3RhcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCmluZGV4IGIxYjkyNmMuLmMyNDEyN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKQEAgLTIyNyw5ICsyMjcsOSBAQAogCX0KIAogCWlmIChzdGF0dXMgIT0gMHhmZiAmJiAoc3RhdHVzICYgQVRBX0JVU1kpKQotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywKLQkJCQkicG9ydCBpcyBzbG93IHRvIHJlc3BvbmQsIHBsZWFzZSBiZSBwYXRpZW50ICIKLQkJCQkiKFN0YXR1cyAweCV4KVxuIiwgc3RhdHVzKTsKKwkJYXRhX3BvcnRfd2FybihhcCwKKwkJCSAgICAgICJwb3J0IGlzIHNsb3cgdG8gcmVzcG9uZCwgcGxlYXNlIGJlIHBhdGllbnQgKFN0YXR1cyAweCV4KVxuIiwKKwkJCSAgICAgIHN0YXR1cyk7CiAKIAl0aW1lb3V0ID0gYXRhX2RlYWRsaW5lKHRpbWVyX3N0YXJ0LCB0bW91dCk7CiAJd2hpbGUgKHN0YXR1cyAhPSAweGZmICYmIChzdGF0dXMgJiBBVEFfQlVTWSkgJiYKQEAgLTI0Miw5ICsyNDIsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChzdGF0dXMgJiBBVEFfQlVTWSkgewotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAicG9ydCBmYWlsZWQgdG8gcmVzcG9uZCAiCi0JCQkJIiglbHUgc2VjcywgU3RhdHVzIDB4JXgpXG4iLAotCQkJCURJVl9ST1VORF9VUCh0bW91dCwgMTAwMCksIHN0YXR1cyk7CisJCWF0YV9wb3J0X2VycihhcCwKKwkJCSAgICAgInBvcnQgZmFpbGVkIHRvIHJlc3BvbmQgKCVsdSBzZWNzLCBTdGF0dXMgMHgleClcbiIsCisJCQkgICAgIERJVl9ST1VORF9VUCh0bW91dCwgMTAwMCksIHN0YXR1cyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0zNTAsOCArMzUwLDggQEAKIAkJCSAgIHVuc2lnbmVkIGludCB3YWl0LCB1bnNpZ25lZCBpbnQgY2FuX3NsZWVwKQogewogCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sICJhdGFfZGV2X3NlbGVjdDogRU5URVIsICIKLQkJCQkiZGV2aWNlICV1LCB3YWl0ICV1XG4iLCBkZXZpY2UsIHdhaXQpOworCQlhdGFfcG9ydF9pbmZvKGFwLCAiYXRhX2Rldl9zZWxlY3Q6IEVOVEVSLCBkZXZpY2UgJXUsIHdhaXQgJXVcbiIsCisJCQkgICAgICBkZXZpY2UsIHdhaXQpOwogCiAJaWYgKHdhaXQpCiAJCWF0YV93YWl0X2lkbGUoYXApOwpAQCAtMTMzMyw5ICsxMzMzLDEwIEBACiAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmFwLT5zZmZfcGlvX3Rhc2spOwogCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9JRExFOworCWFwLT5zZmZfcGlvX3Rhc2tfbGluayA9IE5VTEw7CiAKIAlpZiAoYXRhX21zZ19jdGwoYXApKQotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fREVCVUcsICIlczogRVhJVFxuIiwgX19mdW5jX18pOworCQlhdGFfcG9ydF9kYmcoYXAsICIlczogRVhJVFxuIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgdm9pZCBhdGFfc2ZmX3Bpb190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTE1MTMsNyArMTUxNCw3IEBACiAJCWFwLT5vcHMtPnNmZl9jaGVja19zdGF0dXMoYXApOwogCQlpZiAoYXAtPm9wcy0+c2ZmX2lycV9jbGVhcikKIAkJCWFwLT5vcHMtPnNmZl9pcnFfY2xlYXIoYXApOwotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywgImlycSB0cmFwXG4iKTsKKwkJYXRhX3BvcnRfd2FybihhcCwgImlycSB0cmFwXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQogI2VuZGlmCkBAIC0xNzExLDcgKzE3MTIsNyBAQAogCiAJLyogVGhlcmUgd2FzIGEgY29tbWFuZCBydW5uaW5nLCB3ZSBhcmUgbm8gbG9uZ2VyIGJ1c3kgYW5kIHdlIGhhdmUKIAkgICBubyBpbnRlcnJ1cHQuICovCi0JYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX1dBUk5JTkcsICJsb3N0IGludGVycnVwdCAoU3RhdHVzIDB4JXgpXG4iLAorCWF0YV9wb3J0X3dhcm4oYXAsICJsb3N0IGludGVycnVwdCAoU3RhdHVzIDB4JXgpXG4iLAogCQkJCQkJCQlzdGF0dXMpOwogCS8qIFJ1biB0aGUgaG9zdCBpbnRlcnJ1cHQgbG9naWMgYXMgaWYgdGhlIGludGVycnVwdCBoYWQgbm90IGJlZW4KIAkgICBsb3N0ICovCkBAIC0xNzk4LDggKzE3OTksOSBAQAogCWlmICghYXRhX2xpbmtfb2ZmbGluZShsaW5rKSkgewogCQlyYyA9IGF0YV9zZmZfd2FpdF9yZWFkeShsaW5rLCBkZWFkbGluZSk7CiAJCWlmIChyYyAmJiByYyAhPSAtRU5PREVWKSB7Ci0JCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9XQVJOSU5HLCAiZGV2aWNlIG5vdCByZWFkeSAiCi0JCQkJCSIoZXJybm89JWQpLCBmb3JjaW5nIGhhcmRyZXNldFxuIiwgcmMpOworCQkJYXRhX2xpbmtfd2FybihsaW5rLAorCQkJCSAgICAgICJkZXZpY2Ugbm90IHJlYWR5IChlcnJubz0lZCksIGZvcmNpbmcgaGFyZHJlc2V0XG4iLAorCQkJCSAgICAgIHJjKTsKIAkJCWVoYy0+aS5hY3Rpb24gfD0gQVRBX0VIX0hBUkRSRVNFVDsKIAkJfQogCX0KQEAgLTIwNTYsNyArMjA1OCw3IEBACiAJcmMgPSBhdGFfYnVzX3NvZnRyZXNldChhcCwgZGV2bWFzaywgZGVhZGxpbmUpOwogCS8qIGlmIGxpbmsgaXMgb2NjdXBpZWQsIC1FTk9ERVYgdG9vIGlzIGFuIGVycm9yICovCiAJaWYgKHJjICYmIChyYyAhPSAtRU5PREVWIHx8IHNhdGFfc2NyX3ZhbGlkKGxpbmspKSkgewotCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9FUlIsICJTUlNUIGZhaWxlZCAoZXJybm89JWQpXG4iLCByYyk7CisJCWF0YV9saW5rX2VycihsaW5rLCAiU1JTVCBmYWlsZWQgKGVycm5vPSVkKVxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC0yMTcwLDggKzIxNzIsNyBAQAogCiAJLyogQ2FuIGJlY29tZSBERUJVRyBsYXRlciAqLwogCWlmIChjb3VudCkKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0RFQlVHLAotCQkJImRyYWluZWQgJWQgYnl0ZXMgdG8gY2xlYXIgRFJRLlxuIiwgY291bnQpOworCQlhdGFfcG9ydF9kYmcoYXAsICJkcmFpbmVkICVkIGJ5dGVzIHRvIGNsZWFyIERSUVxuIiwgY291bnQpOwogCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2RyYWluX2ZpZm8pOwpAQCAtMjMxNiw5ICsyMzE3LDkgQEAKIAkJcmMgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgMHgzIDw8IGJhc2UsCiAJCQkJCWRldl9kcml2ZXJfc3RyaW5nKGdkZXYpKTsKIAkJaWYgKHJjKSB7Ci0JCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgZ2RldiwKLQkJCQkgICAiZmFpbGVkIHRvIHJlcXVlc3QvaW9tYXAgQkFScyBmb3IgcG9ydCAlZCAiCi0JCQkJICAgIihlcnJubz0lZClcbiIsIGksIHJjKTsKKwkJCWRldl93YXJuKGdkZXYsCisJCQkJICJmYWlsZWQgdG8gcmVxdWVzdC9pb21hcCBCQVJzIGZvciBwb3J0ICVkIChlcnJubz0lZClcbiIsCisJCQkJIGksIHJjKTsKIAkJCWlmIChyYyA9PSAtRUJVU1kpCiAJCQkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOwogCQkJYXAtPm9wcyA9ICZhdGFfZHVtbXlfcG9ydF9vcHM7CkBAIC0yMzQwLDcgKzIzNDEsNyBAQAogCX0KIAogCWlmICghbWFzaykgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBnZGV2LCAibm8gYXZhaWxhYmxlIG5hdGl2ZSBwb3J0XG4iKTsKKwkJZGV2X2VycihnZGV2LCAibm8gYXZhaWxhYmxlIG5hdGl2ZSBwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yMzc1LDggKzIzNzYsNyBAQAogCiAJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgMik7CiAJaWYgKCFob3N0KSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkgICAiZmFpbGVkIHRvIGFsbG9jYXRlIEFUQSBob3N0XG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIEFUQSBob3N0XG4iKTsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9vdXQ7CiAJfQpAQCAtMjU0Miw4ICsyNTQyLDcgQEAKIAogCXBpID0gYXRhX3NmZl9maW5kX3ZhbGlkX3BpKHBwaSk7CiAJaWYgKCFwaSkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAotCQkJICAgIm5vIHZhbGlkIHBvcnRfaW5mbyBzcGVjaWZpZWRcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyB2YWxpZCBwb3J0X2luZm8gc3BlY2lmaWVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMTY0LDggKzMxNjMsNyBAQAogewogCWludCBpOwogCi0JZGV2X3ByaW50ayhLRVJOX0VSUiwgaG9zdC0+ZGV2LCAiQk1ETUE6ICVzLCBmYWxsaW5nIGJhY2sgdG8gUElPXG4iLAotCQkgICByZWFzb24pOworCWRldl9lcnIoaG9zdC0+ZGV2LCAiQk1ETUE6ICVzLCBmYWxsaW5nIGJhY2sgdG8gUElPXG4iLCByZWFzb24pOwogCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlob3N0LT5wb3J0c1tpXS0+bXdkbWFfbWFzayA9IDA7CkBAIC0zMjk3LDggKzMyOTUsNyBAQAogCiAJcGkgPSBhdGFfc2ZmX2ZpbmRfdmFsaWRfcGkocHBpKTsKIAlpZiAoIXBpKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkgICAibm8gdmFsaWQgcG9ydF9pbmZvIHNwZWNpZmllZFxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHZhbGlkIHBvcnRfaW5mbyBzcGVjaWZpZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYWNwaS5jIGIvZHJpdmVycy9hdGEvcGF0YV9hY3BpLmMKaW5kZXggOTE5NDlkOS4uNTQxNDVlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hY3BpLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hY3BpLmMKQEAgLTE5NSw4ICsxOTUsNiBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAlzdHJ1Y3QgcGF0YV9hY3BpICphY3BpOwogCi0JaW50IHJldDsKLQogCWlmIChhcC0+YWNwaV9oYW5kbGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTIwNSwxMSArMjAzLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJYWNwaS0+bWFza1swXSA9IHBhY3BpX2Rpc2NvdmVyX21vZGVzKGFwLCAmYXAtPmxpbmsuZGV2aWNlWzBdKTsKIAlhY3BpLT5tYXNrWzFdID0gcGFjcGlfZGlzY292ZXJfbW9kZXMoYXAsICZhcC0+bGluay5kZXZpY2VbMV0pOwotCXJldCA9IGF0YV9ibWRtYV9wb3J0X3N0YXJ0KGFwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGF0YV9ibWRtYV9wb3J0X3N0YXJ0KGFwKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgcGFjcGlfc2h0ID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hbGkuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKaW5kZXggNzk0ZWM2ZS4uY2FkZDY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hbGkuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCkBAIC0yODcsMTAgKzI4NywxMCBAQAogCWludCBwcmludF9pbmZvID0gZWhjLT5pLmZsYWdzICYgQVRBX0VISV9QUklOVElORk87CiAKIAlpZiAocHJpbnRfaW5mbyAmJiBhZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQVBJICYmICFhbGlfYXRhcGlfZG1hKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKGFkZXYsIEtFUk5fV0FSTklORywKLQkJCSAgICAgICAiV0FSTklORzogQVRBUEkgRE1BIGRpc2FibGVkIGZvciByZWxpYWJpbGl0eSBpc3N1ZXMuICBJdCBjYW4gYmUgZW5hYmxlZFxuIik7Ci0JCWF0YV9kZXZfcHJpbnRrKGFkZXYsIEtFUk5fV0FSTklORywKLQkJCSAgICAgICAiV0FSTklORzogdmlhIHBhdGFfYWxpLmF0YXBpX2RtYSBtb2RwYXJhbSBvciBjb3JyZXNwb25kaW5nIHN5c2ZzIG5vZGUuXG4iKTsKKwkJYXRhX2Rldl93YXJuKGFkZXYsCisJCQkgICAgICJXQVJOSU5HOiBBVEFQSSBETUEgZGlzYWJsZWQgZm9yIHJlbGlhYmlsaXR5IGlzc3Vlcy4gIEl0IGNhbiBiZSBlbmFibGVkXG4iKTsKKwkJYXRhX2Rldl93YXJuKGFkZXYsCisJCQkgICAgICJXQVJOSU5HOiB2aWEgcGF0YV9hbGkuYXRhcGlfZG1hIG1vZHBhcmFtIG9yIGNvcnJlc3BvbmRpbmcgc3lzZnMgbm9kZS5cbiIpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hbWQuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKaW5kZXggYjA5NzVhNS4uZGM2YjVkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hbWQuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCkBAIC02MCw3ICs2MCw3IEBACiAJCVVUID0gVCAvIDI7CiAKIAlpZiAoYXRhX3RpbWluZ19jb21wdXRlKGFkZXYsIHNwZWVkLCAmYXQsIFQsIFVUKSA8IDApIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwgInVua25vd24gbW9kZSAlZC5cbiIsIHNwZWVkKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5rbm93biBtb2RlICVkXG4iLCBzcGVlZCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTMxMSw3ICszMTEsNyBAQAogCSAgIGNhYmxlIGRldGVjdGlvbiByZXN1bHQgKi8KIAlsaW1pdCB8PSBhdGFfcGFja194ZmVybWFzayhBVEFfUElPNCwgQVRBX01XRE1BMiwgQVRBX1VETUEyKTsKIAotCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9ERUJVRywgIm52X21vZGVfZmlsdGVyOiAweCVseCYweCVseC0+MHglbHgsICIKKwlhdGFfcG9ydF9kYmcoYXAsICJudl9tb2RlX2ZpbHRlcjogMHglbHgmMHglbHgtPjB4JWx4LCAiCiAJCQkiQklPUz0weCVseCAoMHgleCkgQUNQST0weCVseCVzXG4iLAogCQkJeGZlcl9tYXNrLCBsaW1pdCwgeGZlcl9tYXNrICYgbGltaXQsIGJpb3NfbGltaXQsCiAJCQlzYXZlZF91ZG1hLCBhY3BpX2xpbWl0LCBhY3BpX3N0cik7CkBAIC01MzAsMTQgKzUzMCwxMiBAQAogCQl9CiAJfTsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7IE5VTEwsIE5VTEwgfTsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAlpbnQgdHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKIAl2b2lkICpocHJpdiA9IE5VTEw7CiAJdTggZmlmbzsKIAlpbnQgcmM7CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmcGRldi0+ZGV2LCBEUlZfVkVSU0lPTik7CiAKIAlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMKaW5kZXggMjIxNTYzMi4uNzhhOTNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYwpAQCAtMzQ2LDcgKzM0Niw2IEBACiAKIHN0YXRpYyBpbnQgYXJ0b3BfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fNjIxMCA9IHsKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS5waW9fbWFzawk9IEFUQV9QSU80LApAQCAtMzc4LDkgKzM3Nyw3IEBACiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyBOVUxMLCBOVUxMIH07CiAJaW50IHJjOwogCi0JaWYgKCFwcmludGVkX3ZlcnNpb24rKykKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LAotCQkJICAgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYXRwODY3eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hdHA4Njd4LmMKaW5kZXggOTUyOTU5My4uM2NmYWJiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hdHA4Njd4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hdHA4Njd4LmMKQEAgLTQ3MCw3ICs0NzAsNyBAQAogCX0KIAogCWlmICghbWFzaykgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBnZGV2LCAibm8gYXZhaWxhYmxlIG5hdGl2ZSBwb3J0XG4iKTsKKwkJZGV2X2VycihnZGV2LCAibm8gYXZhaWxhYmxlIG5hdGl2ZSBwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC00ODcsNyArNDg3LDYgQEAKIHN0YXRpYyBpbnQgYXRwODY3eF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fODY3eCA9IHsKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS5waW9fbWFzawk9IEFUQV9QSU80LApAQCAtNDk5LDggKzQ5OCw3IEBACiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mb184Njd4LCBOVUxMIH07CiAJaW50IHJjOwogCi0JaWYgKCFwcmludGVkX3ZlcnNpb24rKykKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmcGRldi0+ZGV2LCBEUlZfVkVSU0lPTik7CiAKIAlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCkBAIC01MTEsMTUgKzUwOSwxNCBAQAogCiAJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgQVRQODY3WF9OVU1fUE9SVFMpOwogCWlmICghaG9zdCkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAotCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBBVEEgaG9zdFxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBBVEEgaG9zdFxuIik7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0OwogCX0KIAogCXJjID0gYXRwODY3eF9hdGFfcGNpX3NmZl9pbml0X2hvc3QoaG9zdCk7CiAJaWYgKHJjKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdCBob3N0XG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXQgaG9zdFxuIik7CiAJCWdvdG8gZXJyX291dDsKIAl9CiAKQEAgLTUyOCw3ICs1MjUsNyBAQAogCXJjID0gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgcGRldi0+aXJxLCBhdGFfYm1kbWFfaW50ZXJydXB0LAogCQkJCUlSUUZfU0hBUkVELCAmYXRwODY3eF9zaHQpOwogCWlmIChyYykKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwgImZhaWxlZCB0byBhY3RpdmF0ZSBob3N0XG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFjdGl2YXRlIGhvc3RcbiIpOwogCiBlcnJfb3V0OgogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYmY1NHguYyBiL2RyaXZlcnMvYXRhL3BhdGFfYmY1NHguYwppbmRleCBlYTY0OTY3Li5iZDk4N2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2JmNTR4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9iZjU0eC5jCkBAIC0xMTI5LDcgKzExMjksNyBAQAogCS8qIGlzc3VlIGJ1cyByZXNldCAqLwogCWVycl9tYXNrID0gYmZpbl9idXNfc29mdHJlc2V0KGFwLCBkZXZtYXNrKTsKIAlpZiAoZXJyX21hc2spIHsKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgIlNSU1QgZmFpbGVkIChlcnJfbWFzaz0weCV4KVxuIiwKKwkJYXRhX3BvcnRfZXJyKGFwLCAiU1JTVCBmYWlsZWQgKGVycl9tYXNrPTB4JXgpXG4iLAogCQkJCWVycl9tYXNrKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTM4Miw3ICsxMzgyLDcgQEAKICNpZmRlZiBBVEFfSVJRX1RSQVAKIAlpZiAoKGFwLT5zdGF0cy5pZGxlX2lycSAlIDEwMDApID09IDApIHsKIAkJYXAtPm9wcy0+aXJxX2FjayhhcCwgMCk7IC8qIGRlYnVnIHRyYXAgKi8KLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX1dBUk5JTkcsICJpcnEgdHJhcFxuIik7CisJCWF0YV9wb3J0X3dhcm4oYXAsICJpcnEgdHJhcFxuIik7CiAJCXJldHVybiAxOwogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTIwLmMKaW5kZXggZTMyNTRmYy4uOWRkY2RkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jCkBAIC0xNDksOCArMTQ5LDcgQEAKIAkJcHBpWzFdID0gJnBpOwogCiAJaWYgKChwY2ljZmcgJiAweDQwKSA9PSAwKSB7Ci0JCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcGRldi0+ZGV2LAotCQkJICAgIkRNQSBtb2RlIGRpc2FibGVkLiBFbmFibGluZy5cbiIpOworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiRE1BIG1vZGUgZGlzYWJsZWQuIEVuYWJsaW5nLlxuIik7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDYwLCBwY2ljZmcgfCAweDQwKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jIGIvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMKaW5kZXggYTA4ODM0Ny4uYWNhNDdlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMKQEAgLTI2Myw3ICsyNjMsNiBAQAogCiBzdGF0aWMgaW50IGVmYXJfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0gewogCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUywKIAkJLnBpb19tYXNrCT0gQVRBX1BJTzQsCkBAIC0yNzMsOSArMjcyLDcgQEAKIAl9OwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sICZpbmZvIH07CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCi0JCQkgICAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWF0YV9wcmludF92ZXJzaW9uX29uY2UoJnBkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJcmV0dXJuIGF0YV9wY2lfYm1kbWFfaW5pdF9vbmUocGRldiwgcHBpLCAmZWZhcl9zaHQsIE5VTEwsCiAJCQkJICAgICAgQVRBX0hPU1RfUEFSQUxMRUxfU0NBTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYwppbmRleCAyNGQ3ZGY4Li5iMzA0MmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKQEAgLTE4NSw3ICsxODUsNiBAQAogCiBzdGF0aWMgaW50IGhwdDN4M19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0gewogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTLAogCQkucGlvX21hc2sgPSBBVEFfUElPNCwKQEAgLTIwNiw4ICsyMDUsNyBAQAogCiAJaHB0M3gzX2luaXRfY2hpcHNldChwZGV2KTsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbygmcGRldi0+ZGV2LCBwcGksIDIpOwogCWlmICghaG9zdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaWNzaWRlLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2ljc2lkZS5jCmluZGV4IDlmMjg4OWYuLjUyZTdlN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaWNzaWRlLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9pY3NpZGUuYwpAQCAtMjEwLDggKzIxMCw4IEBACiAJZWxzZQogCQlpb21kX3R5cGUgPSAnQScsIGN5Y2xlID0gNTYyOwogCi0JYXRhX2Rldl9wcmludGsoYWRldiwgS0VSTl9JTkZPLCAidGltaW5nczogYWN0ICVkbnMgcmVjICVkbnMgY3ljICVkbnMgKCVjKVxuIiwKLQkJdC5hY3RpdmUsIHQucmVjb3ZlciwgdC5jeWNsZSwgaW9tZF90eXBlKTsKKwlhdGFfZGV2X2luZm8oYWRldiwgInRpbWluZ3M6IGFjdCAlZG5zIHJlYyAlZG5zIGN5YyAlZG5zICglYylcbiIsCisJCSAgICAgdC5hY3RpdmUsIHQucmVjb3ZlciwgdC5jeWNsZSwgaW9tZF90eXBlKTsKIAogCXN0YXRlLT5wb3J0W2FwLT5wb3J0X25vXS5zcGVlZFthZGV2LT5kZXZub10gPSBjeWNsZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjEzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxMy5jCmluZGV4IDRkMTQyYTIuLjk5OGFmMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjEzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMTMuYwpAQCAtMjU4LDcgKzI1OCw2IEBACiAKIHN0YXRpYyBpbnQgaXQ4MjEzX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS5waW9fbWFzawk9IEFUQV9QSU80LApAQCAtMjY5LDkgKzI2OCw3IEBACiAJLyogQ3VycmVudCBJVDgyMTMgc3R1ZmYgaXMgc2luZ2xlIHBvcnQgKi8KIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCAmYXRhX2R1bW15X3BvcnRfaW5mbyB9OwogCi0JaWYgKCFwcmludGVkX3ZlcnNpb24rKykKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LAotCQkJICAgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCXJldHVybiBhdGFfcGNpX2JtZG1hX2luaXRfb25lKHBkZXYsIHBwaSwgJml0ODIxM19zaHQsIE5VTEwsIDApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMKaW5kZXggMmQxNWYyNS4uNjJjNWQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jCkBAIC00NzMsMTIgKzQ3MywxMiBAQAogCQkvKiBXZSBkbyBuZWVkIHRoZSByaWdodCBtb2RlIGluZm9ybWF0aW9uIGZvciBETUEgb3IgUElPCiAJCSAgIGFuZCB0aGlzIGNvbWVzIGZyb20gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBmbGFncyAqLwogCQlpZiAoYXRhX2lkX2hhc19kbWEoZGV2LT5pZCkpIHsKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiY29uZmlndXJlZCBmb3IgRE1BXG4iKTsKKwkJCWF0YV9kZXZfaW5mbyhkZXYsICJjb25maWd1cmVkIGZvciBETUFcbiIpOwogCQkJZGV2LT54ZmVyX21vZGUgPSBYRkVSX01XX0RNQV8wOwogCQkJZGV2LT54ZmVyX3NoaWZ0ID0gQVRBX1NISUZUX01XRE1BOwogCQkJZGV2LT5mbGFncyAmPSB+QVRBX0RGTEFHX1BJTzsKIAkJfSBlbHNlIHsKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiY29uZmlndXJlZCBmb3IgUElPXG4iKTsKKwkJCWF0YV9kZXZfaW5mbyhkZXYsICJjb25maWd1cmVkIGZvciBQSU9cbiIpOwogCQkJZGV2LT54ZmVyX21vZGUgPSBYRkVSX1BJT18wOwogCQkJZGV2LT54ZmVyX3NoaWZ0ID0gQVRBX1NISUZUX1BJTzsKIAkJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX1BJTzsKQEAgLTUwOCwxMiArNTA4LDEyIEBACiAKIAlpZiAoc3Ryc3RyKG1vZGVsX251bSwgIkludGVncmF0ZWQgVGVjaG5vbG9neSBFeHByZXNzIikpIHsKIAkJLyogUkFJRCBtb2RlICovCi0JCWF0YV9kZXZfcHJpbnRrKGFkZXYsIEtFUk5fSU5GTywgIiVzUkFJRCVkIHZvbHVtZSIsCi0JCQlhZGV2LT5pZFsxNDddPyJCb290YWJsZSAiOiIiLAotCQkJYWRldi0+aWRbMTI5XSk7CisJCWF0YV9kZXZfaW5mbyhhZGV2LCAiJXNSQUlEJWQgdm9sdW1lIiwKKwkJCSAgICAgYWRldi0+aWRbMTQ3XSA/ICJCb290YWJsZSAiIDogIiIsCisJCQkgICAgIGFkZXYtPmlkWzEyOV0pOwogCQlpZiAoYWRldi0+aWRbMTI5XSAhPSAxKQotCQkJcHJpbnRrKCIoJWRLIHN0cmlwZSkiLCBhZGV2LT5pZFsxNDZdKTsKLQkJcHJpbnRrKCIuXG4iKTsKKwkJCXByX2NvbnQoIiglZEsgc3RyaXBlKSIsIGFkZXYtPmlkWzE0Nl0pOworCQlwcl9jb250KCJcbiIpOwogCX0KIAkvKiBUaGlzIGlzIGEgY29udHJvbGxlciBmaXJtd2FyZSB0cmlnZ2VyZWQgZnVubnksIGRvbid0CiAJICAgcmVwb3J0IHRoZSBkcml2ZSBmYXVsdHkhICovCkBAIC02MTAsNyArNjEwLDcgQEAKIAljaGFyICpjYmwgPSAiKDQwIHdpcmUgY2FibGUpIjsKIAogCXN0YXRpYyBjb25zdCBjaGFyICp0eXBlc1s1XSA9IHsKLQkJIlJBSUQwIiwgIlJBSUQxIiAiUkFJRCAwKzEiLCAiSkJPRCIsICJESVNLIgorCQkiUkFJRDAiLCAiUkFJRDEiLCAiUkFJRCAwKzEiLCAiSkJPRCIsICJESVNLIgogCX07CiAKIAlpZiAoYnVmWzUyXSA+IDQpCS8qIE5vIERpc2sgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaXhwNHh4X2NmLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2l4cDR4eF9jZi5jCmluZGV4IGY2YjNmOTkuLjE1YjY0MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaXhwNHh4X2NmLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9peHA0eHhfY2YuYwpAQCAtMzEsNyArMzEsNyBAQAogCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CiAKIAlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgRU5BQkxFRCkgewotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImNvbmZpZ3VyZWQgZm9yIFBJTzBcbiIpOworCQlhdGFfZGV2X2luZm8oZGV2LCAiY29uZmlndXJlZCBmb3IgUElPMFxuIik7CiAJCWRldi0+cGlvX21vZGUgPSBYRkVSX1BJT18wOwogCQlkZXYtPnhmZXJfbW9kZSA9IFhGRVJfUElPXzA7CiAJCWRldi0+eGZlcl9zaGlmdCA9IEFUQV9TSElGVF9QSU87CkBAIC0xODEsNyArMTgxLDcgQEAKIAogCWl4cDR4eF9zZXR1cF9wb3J0KGFwLCBkYXRhLCBjczAtPnN0YXJ0LCBjczEtPnN0YXJ0KTsKIAotCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWF0YV9wcmludF92ZXJzaW9uX29uY2UoJnBkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJLyogYWN0aXZhdGUgaG9zdCAqLwogCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBpcnEsIGF0YV9zZmZfaW50ZXJydXB0LCAwLCAmaXhwNHh4X3NodCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jIGIvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYwppbmRleCA2YmQ5NDI1Li5kOTYwZjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMKQEAgLTIxMyw3ICsyMTMsNyBAQAogCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CiAKIAlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgRU5BQkxFRCkgewotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImNvbmZpZ3VyZWQgZm9yIFBJT1xuIik7CisJCWF0YV9kZXZfaW5mbyhkZXYsICJjb25maWd1cmVkIGZvciBQSU9cbiIpOwogCQlkZXYtPnBpb19tb2RlID0gWEZFUl9QSU9fMDsKIAkJZGV2LT54ZmVyX21vZGUgPSBYRkVSX1BJT18wOwogCQlkZXYtPnhmZXJfc2hpZnQgPSBBVEFfU0hJRlRfUElPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9tYWNpby5jIGIvZHJpdmVycy9hdGEvcGF0YV9tYWNpby5jCmluZGV4IDQ2ZjU4OWUuLmIwNTdlM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbWFjaW8uYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX21hY2lvLmMKQEAgLTc3Miw4ICs3NzIsOSBAQAogCQlwY2lfcmVzdG9yZV9zdGF0ZShwcml2LT5wZGV2KTsKIAkJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocHJpdi0+cGRldik7CiAJCWlmIChyYykKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwcml2LT5wZGV2LT5kZXYsCi0JCQkJICAgIkZhaWxlZCB0byBlbmFibGUgZGV2aWNlIGFmdGVyIHJlc3VtZSAoJWQpXG4iLCByYyk7CisJCQlkZXZfZXJyKCZwcml2LT5wZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byBlbmFibGUgZGV2aWNlIGFmdGVyIHJlc3VtZSAoJWQpXG4iLAorCQkJCXJjKTsKIAkJZWxzZQogCQkJcGNpX3NldF9tYXN0ZXIocHJpdi0+cGRldik7CiAJfQpAQCAtODEyLDcgKzgxMyw3IEBACiAJCWJsa19xdWV1ZV91cGRhdGVfZG1hX3BhZChzZGV2LT5yZXF1ZXN0X3F1ZXVlLCAzMSk7CiAKIAkJLyogVGVsbCB0aGUgd29ybGQgYWJvdXQgaXQgKi8KLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJPSGFyZSBhbGlnbm1lbnQgbGltaXRzIGFwcGxpZWRcbiIpOworCQlhdGFfZGV2X2luZm8oZGV2LCAiT0hhcmUgYWxpZ25tZW50IGxpbWl0cyBhcHBsaWVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC04MzgsOCArODM5LDcgQEAKIAkJCQkgICAgICBjbWQgfCBQQ0lfQ09NTUFORF9JTlZBTElEQVRFKTsKIAogCQkvKiBUZWxsIHRoZSB3b3JsZCBhYm91dCBpdCAqLwotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywKLQkJCSAgICAgICAiSzIvU2hhc3RhIGFsaWdubWVudCBsaW1pdHMgYXBwbGllZFxuIik7CisJCWF0YV9kZXZfaW5mbyhkZXYsICJLMi9TaGFzdGEgYWxpZ25tZW50IGxpbWl0cyBhcHBsaWVkXG4iKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbWFydmVsbC5jIGIvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMKaW5kZXggNzVhNmEwYy4uNWQ3ZjU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMKQEAgLTE2MSw2ICsxNjEsOSBAQAogCXsgUENJX0RFVklDRSgweDExQUIsIDB4NjEyMSksIH0sCiAJeyBQQ0lfREVWSUNFKDB4MTFBQiwgMHg2MTIzKSwgfSwKIAl7IFBDSV9ERVZJQ0UoMHgxMUFCLCAweDYxNDUpLCB9LAorCXsgUENJX0RFVklDRSgweDFCNEIsIDB4OTFBMCksIH0sCisJeyBQQ0lfREVWSUNFKDB4MUI0QiwgMHg5MUE0KSwgfSwKKwogCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jIGIvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jCmluZGV4IGQ4ZDljNTguLjlkYzE2ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX21waWl4LmMKQEAgLTE1MiwxNSArMTUyLDEzIEBACiBzdGF0aWMgaW50IG1waWl4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAkvKiBTaW5nbGUgdGhyZWFkZWQgYnkgdGhlIFBDSSBwcm9iZSBsb2dpYyAqLwotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwogCXZvaWQgX19pb21lbSAqY21kX2FkZHIsICpjdGxfYWRkcjsKIAl1MTYgaWRldGltOwogCWludCBjbWQsIGN0bCwgaXJxOwogCi0JaWYgKCFwcmludGVkX3ZlcnNpb24rKykKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCWhvc3QgPSBhdGFfaG9zdF9hbGxvYygmZGV2LT5kZXYsIDEpOwogCWlmICghaG9zdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbmV0Y2VsbC5jIGIvZHJpdmVycy9hdGEvcGF0YV9uZXRjZWxsLmMKaW5kZXggM2ViOTIxYy4uOTk3OWE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9uZXRjZWxsLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9uZXRjZWxsLmMKQEAgLTU3LDcgKzU3LDYgQEAKIAogc3RhdGljIGludCBuZXRjZWxsX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS8qIEFjdHVhbGx5IHdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoZXNlIGFzIHRoZQpAQCAtNzAsOSArNjksNyBAQAogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bXSA9IHsgJmluZm8sIE5VTEwgfTsKIAlpbnQgcmM7CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCi0JCQkgICAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWF0YV9wcmludF92ZXJzaW9uX29uY2UoJnBkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9uczg3NDEwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTAuYwppbmRleCAyMTEwODYzLi4zMWQ1OTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTAuYwpAQCAtODYsNyArODYsNyBAQAogCQlpZGVmciAmPSB+MHgwNDsKIAogCWlmIChhdGFfdGltaW5nX2NvbXB1dGUoYWRldiwgYWRldi0+cGlvX21vZGUsICZhdCwgMzAzMDMsIDEpIDwgMCkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LCAidW5rbm93biBtb2RlICVkLlxuIiwgYWRldi0+cGlvX21vZGUpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmtub3duIG1vZGUgJWRcbiIsIGFkZXYtPnBpb19tb2RlKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9uczg3NDE1LmMgYi9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTUuYwppbmRleCA2MDVmMTk4Li5mMWQ1MTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTUuYwpAQCAtMzUwLDcgKzM1MCw2IEBACiAKIHN0YXRpYyBpbnQgbnM4NzQxNV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0Jc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CiAJCS5mbGFncwkJPSBBVEFfRkxBR19TTEFWRV9QT1NTLAogCQkucGlvX21hc2sJPSBBVEFfUElPNCwKQEAgLTM3MCw5ICszNjksNyBAQAogCWlmIChQQ0lfU0xPVChwZGV2LT5kZXZmbikgPT0gMHgwRSkKIAkJcHBpWzBdID0gJmluZm84NzU2MDsKICNlbmRpZgotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwKLQkJCSAgICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmcGRldi0+ZGV2LCBEUlZfVkVSU0lPTik7CiAKIAlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX29jdGVvbl9jZi5jIGIvZHJpdmVycy9hdGEvcGF0YV9vY3Rlb25fY2YuYwppbmRleCAyMjBkZGM5Li4xZDYxZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29jdGVvbl9jZi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfb2N0ZW9uX2NmLmMKQEAgLTQwNSw3ICs0MDUsNyBAQAogCiAJcmMgPSBhdGFfc2ZmX3dhaXRfYWZ0ZXJfcmVzZXQobGluaywgMSwgZGVhZGxpbmUpOwogCWlmIChyYykgewotCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9FUlIsICJTUlNUIGZhaWxlZCAoZXJybm89JWQpXG4iLCByYyk7CisJCWF0YV9saW5rX2VycihsaW5rLCAiU1JTVCBmYWlsZWQgKGVycm5vPSVkKVxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC04MDcsNiArODA3LDcgQEAKIAlpcnFfaGFuZGxlcl90IGlycV9oYW5kbGVyID0gTlVMTDsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJc3RydWN0IG9jdGVvbl9jZl9wb3J0ICpjZl9wb3J0OworCWNoYXIgdmVyc2lvblszMl07CiAKIAlyZXNfY3MwID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIApAQCAtOTA1LDEwICs5MDYsMTEgQEAKIAlhdGFfcG9ydF9kZXNjKGFwLCAiY21kICVwIGN0bCAlcCIsIGJhc2UsIGFwLT5pb2FkZHIuY3RsX2FkZHIpOwogCiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OIiAlZCBiaXQlcy5cbiIsCisJc25wcmludGYodmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pLCAiJXMgJWQgYml0JXMiLAorCQkgRFJWX1ZFUlNJT04sCiAJCSAob2NkLT5pczE2Yml0KSA/IDE2IDogOCwKIAkJIChjczEpID8gIiwgVHJ1ZSBJREUiIDogIiIpOwotCisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmcGRldi0+ZGV2LCB2ZXJzaW9uKTsKIAogCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBpcnEsIGlycV9oYW5kbGVyLCAwLCAmb2N0ZW9uX2NmX3NodCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfb2xkcGlpeC5jIGIvZHJpdmVycy9hdGEvcGF0YV9vbGRwaWl4LmMKaW5kZXggYjgxMWMxNi4uOThjZGY1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9vbGRwaWl4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9vbGRwaWl4LmMKQEAgLTIzNSw3ICsyMzUsNiBAQAogCiBzdGF0aWMgaW50IG9sZHBpaXhfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0gewogCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUywKIAkJLnBpb19tYXNrCT0gQVRBX1BJTzQsCkBAIC0yNDQsOSArMjQzLDcgQEAKIAl9OwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sIE5VTEwgfTsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwKLQkJCSAgICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmcGRldi0+ZGV2LCBEUlZfVkVSU0lPTik7CiAKIAlyZXR1cm4gYXRhX3BjaV9ibWRtYV9pbml0X29uZShwZGV2LCBwcGksICZvbGRwaWl4X3NodCwgTlVMTCwgMCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aS5jCmluZGV4IDAwYzVhMDIuLmFjY2MwMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfb3B0aS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aS5jCkBAIC0xNjcsMTAgKzE2Nyw4IEBACiAJCS5wb3J0X29wcyA9ICZvcHRpX3BvcnRfb3BzCiAJfTsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCBOVUxMIH07Ci0Jc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJcmV0dXJuIGF0YV9wY2lfc2ZmX2luaXRfb25lKGRldiwgcHBpLCAmb3B0aV9zaHQsIE5VTEwsIDApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9vcHRpZG1hLmMgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGlkbWEuYwppbmRleCAwODUyY2QwLi43N2NiOTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29wdGlkbWEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGlkbWEuYwpAQCAtNDExLDExICs0MTEsOSBAQAogCQkucG9ydF9vcHMgPSAmb3B0aXBsdXNfcG9ydF9vcHMKIAl9OwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm9fODJjNzAwLCBOVUxMIH07Ci0Jc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJaW50IHJjOwogCi0JaWYgKCFwcmludGVkX3ZlcnNpb24rKykKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKGRldik7CiAJaWYgKHJjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMKaW5kZXggMDIxYWJlNi4uYTgwOGJhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BjbWNpYS5jCkBAIC02OCw3ICs2OCw3IEBACiAJCSAgIHRoZSBzYW1lIHZlbmRvciAtIGNoZWNrIHNlcmlhbCAqLwogCQlpZiAobWVtY21wKG1hc3Rlci0+aWQgKyBBVEFfSURfU0VSTk8sIHNsYXZlLT5pZCArIEFUQV9JRF9TRVJOTywKIAkJCSAgIEFUQV9JRF9TRVJOT19MRU4pID09IDAgJiYgbWFzdGVyLT5pZFtBVEFfSURfU0VSTk9dID4+IDgpIHsKLQkJCWF0YV9kZXZfcHJpbnRrKHNsYXZlLCBLRVJOX1dBUk5JTkcsICJpcyBhIGdob3N0IGRldmljZSwgaWdub3JpbmcuXG4iKTsKKwkJCWF0YV9kZXZfd2FybihzbGF2ZSwgImlzIGEgZ2hvc3QgZGV2aWNlLCBpZ25vcmluZ1xuIik7CiAJCQlhdGFfZGV2X2Rpc2FibGUoc2xhdmUpOwogCQl9CiAJfQpAQCAtMTQyLDggKzE0Miw3IEBACiAJCWlvcmVhZDgoYXAtPmlvYWRkci5kYXRhX2FkZHIpOwogCiAJaWYgKGNvdW50KQotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywgImRyYWluZWQgJWQgYnl0ZXMgdG8gY2xlYXIgRFJRLlxuIiwKLQkJCQkJCQkJY291bnQpOworCQlhdGFfcG9ydF93YXJuKGFwLCAiZHJhaW5lZCAlZCBieXRlcyB0byBjbGVhciBEUlFcbiIsIGNvdW50KTsKIAogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMKaW5kZXggOTc2NWFjZS4uYjE1MTFmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYwpAQCAtNjU1LDcgKzY1NSw3IEBACiAJICovCiAJcGxsX2Nsb2NrID0gcGRjX2RldGVjdF9wbGxfaW5wdXRfY2xvY2soaG9zdCk7CiAKLQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgaG9zdC0+ZGV2LCAiUExMIGlucHV0IGNsb2NrICVsZCBrSHpcbiIsIHBsbF9jbG9jay8xMDAwKTsKKwlkZXZfaW5mbyhob3N0LT5kZXYsICJQTEwgaW5wdXQgY2xvY2sgJWxkIGtIelxuIiwgcGxsX2Nsb2NrLzEwMDApOwogCiAJLyogQWRqdXN0IFBMTCBjb250cm9sIHJlZ2lzdGVyICovCiAJcGRjX2FkanVzdF9wbGwoaG9zdCwgcGxsX2Nsb2NrLCBib2FyZF9pZHgpOwpAQCAtNjk3LDcgKzY5Nyw2IEBACiAgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IHBkYzIwMjd4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGNtZF9vZmZzZXRbXSA9IHsgMHgxN2MwLCAweDE1YzAgfTsKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBibWRtYV9vZmZzZXRbXSA9IHsgMHgxMDAwLCAweDEwMDggfTsKIAl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4ID0gKHVuc2lnbmVkIGludCkgZW50LT5kcml2ZXJfZGF0YTsKQEAgLTcwNyw4ICs3MDYsNyBAQAogCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOwogCWludCBpLCByYzsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCS8qIGFsbG9jIGhvc3QgKi8KIAlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oJnBkZXYtPmRldiwgcHBpLCAyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYwppbmRleCA1MDQwMGZhLi4yMDY3MzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jCkBAIC0zOSw3ICszOSw3IEBACiAJCWRldi0+cGlvX21vZGUgPSBkZXYtPnhmZXJfbW9kZSA9IFhGRVJfUElPXzA7CiAJCWRldi0+eGZlcl9zaGlmdCA9IEFUQV9TSElGVF9QSU87CiAJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX1BJTzsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJjb25maWd1cmVkIGZvciBQSU9cbiIpOworCQlhdGFfZGV2X2luZm8oZGV2LCAiY29uZmlndXJlZCBmb3IgUElPXG4iKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcmFkaXN5cy5jCmluZGV4IDg1NzRiMzEuLmIyZDNhMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcmFkaXN5cy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcmFkaXN5cy5jCkBAIC0yMTMsNyArMjEzLDYgQEAKIAogc3RhdGljIGludCByYWRpc3lzX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS5waW9fbWFzawk9IEFUQV9QSU80LApAQCAtMjIzLDkgKzIyMiw3IEBACiAJfTsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCBOVUxMIH07CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCi0JCQkgICAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWF0YV9wcmludF92ZXJzaW9uX29uY2UoJnBkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJcmV0dXJuIGF0YV9wY2lfYm1kbWFfaW5pdF9vbmUocGRldiwgcHBpLCAmcmFkaXN5c19zaHQsIE5VTEwsIDApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9yZGMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcmRjLmMKaW5kZXggNWZiZTliMS4uNGQzMThmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9yZGMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3JkYy5jCkBAIC0zMTIsNyArMzEyLDYgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJkY19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IGF0YV9wb3J0X2luZm8gcG9ydF9pbmZvWzJdOwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnBvcnRfaW5mb1swXSwgJnBvcnRfaW5mb1sxXSB9OwpAQCAtMzIxLDkgKzMyMCw3IEBACiAJc3RydWN0IHJkY19ob3N0X3ByaXYgKmhwcml2OwogCWludCByYzsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwKLQkJCSAgICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmcGRldi0+ZGV2LCBEUlZfVkVSU0lPTik7CiAKIAlwb3J0X2luZm9bMF0gPSByZGNfcG9ydF9pbmZvOwogCXBvcnRfaW5mb1sxXSA9IHJkY19wb3J0X2luZm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3J6MTAwMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9yejEwMDAuYwppbmRleCA0ZDA0NDcxLi5hY2EzMjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3J6MTAwMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkJZGV2LT54ZmVyX21vZGUgPSBYRkVSX1BJT18wOwogCQlkZXYtPnhmZXJfc2hpZnQgPSBBVEFfU0hJRlRfUElPOwogCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19QSU87Ci0JCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiY29uZmlndXJlZCBmb3IgUElPXG4iKTsKKwkJYXRhX2Rldl9pbmZvKGRldiwgImNvbmZpZ3VyZWQgZm9yIFBJT1xuIik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtOTIsNyArOTIsNyBAQAogCX07CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mbywgTlVMTCB9OwogCi0JcHJpbnRrX29uY2UoS0VSTl9ERUJVRyBEUlZfTkFNRSAiIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCWlmIChyejEwMDBfZmlmb19kaXNhYmxlKHBkZXYpID09IDApCiAJCXJldHVybiBhdGFfcGNpX3NmZl9pbml0X29uZShwZGV2LCBwcGksICZyejEwMDBfc2h0LCBOVUxMLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2Ftc3VuZ19jZi5jIGIvZHJpdmVycy9hdGEvcGF0YV9zYW1zdW5nX2NmLmMKaW5kZXggYzQ0NmFlNi4uMWIzNzJjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zYW1zdW5nX2NmLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zYW1zdW5nX2NmLmMKQEAgLTM3Niw3ICszNzYsNyBAQAogCXJjID0gcGF0YV9zM2NfYnVzX3NvZnRyZXNldChhcCwgZGVhZGxpbmUpOwogCS8qIGlmIGxpbmsgaXMgb2NjdXBpZWQsIC1FTk9ERVYgdG9vIGlzIGFuIGVycm9yICovCiAJaWYgKHJjICYmIHJjICE9IC1FTk9ERVYpIHsKLQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fRVJSLCAiU1JTVCBmYWlsZWQgKGVycm5vPSVkKVxuIiwgcmMpOworCQlhdGFfbGlua19lcnIobGluaywgIlNSU1QgZmFpbGVkIChlcnJubz0lZClcbiIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zY2MuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMKaW5kZXggODhlYTliNi4uZWI3NDhlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zY2MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jCkBAIC02MzcsOCArNjM3LDcgQEAKIAlEUFJJTlRLKCJhYm91dCB0byBzb2Z0cmVzZXQsIGRldm1hc2s9JXhcbiIsIGRldm1hc2spOwogCWVycl9tYXNrID0gc2NjX2J1c19zb2Z0cmVzZXQoYXAsIGRldm1hc2ssIGRlYWRsaW5lKTsKIAlpZiAoZXJyX21hc2spIHsKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgIlNSU1QgZmFpbGVkIChlcnJfbWFzaz0weCV4KVxuIiwKLQkJCQllcnJfbWFzayk7CisJCWF0YV9wb3J0X2VycihhcCwgIlNSU1QgZmFpbGVkIChlcnJfbWFzaz0weCV4KVxuIiwgZXJyX21hc2spOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTEwNzIsMTUgKzEwNzEsMTIgQEAKIAogc3RhdGljIGludCBzY2NfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXVuc2lnbmVkIGludCBib2FyZF9pZHggPSAodW5zaWduZWQgaW50KSBlbnQtPmRyaXZlcl9kYXRhOwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnNjY19wb3J0X2luZm9bYm9hcmRfaWR4XSwgTlVMTCB9OwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKIAlpbnQgcmM7CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCi0JCQkgICAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWF0YV9wcmludF92ZXJzaW9uX29uY2UoJnBkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgMSk7CiAJaWYgKCFob3N0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zY2guYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2NoLmMKaW5kZXggZTk3YjMyZi4uN2M3OGI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zY2guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjaC5jCkBAIC0xNzIsMTIgKzE3Miw5IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzY2hfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZzY2hfcG9ydF9pbmZvLCBOVUxMIH07CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCi0JCQkgICAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWF0YV9wcmludF92ZXJzaW9uX29uY2UoJnBkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJcmV0dXJuIGF0YV9wY2lfYm1kbWFfaW5pdF9vbmUocGRldiwgcHBpLCAmc2NoX3NodCwgTlVMTCwgMCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwppbmRleCAxMTg3ODdjLi4zMWY3NTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKQEAgLTMyNywxMyArMzI3LDExIEBACiAJCS5wb3J0X29wcyA9ICZzaWw2ODBfcG9ydF9vcHMKIAl9OwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sIE5VTEwgfTsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7CiAJaW50IHJjLCB0cnlfbW1pbzsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3Npcy5jCmluZGV4IGJlMDhmZjkuLjUzM2YyYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zaXMuYwpAQCAtNjgxLDcgKzY4MSw2IEBACiAKIHN0YXRpYyBpbnQgc2lzX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7IE5VTEwsIE5VTEwgfTsKIAlzdHJ1Y3QgcGNpX2RldiAqaG9zdCA9IE5VTEw7CiAJc3RydWN0IHNpc19jaGlwc2V0ICpjaGlwc2V0ID0gTlVMTDsKQEAgLTczNSw5ICs3MzQsNyBAQAogCQkweDAsICZzaXNfaW5mbzEwMAogCX07CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCi0JCQkgICAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWF0YV9wcmludF92ZXJzaW9uX29uY2UoJnBkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jIGIvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jCmluZGV4IDdmNWQwMjAuLmMwNmNlOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMKQEAgLTMxNyw5ICszMTcsMTEgQEAKIAlyZXYgPSBzbDgyYzEwNV9icmlkZ2VfcmV2aXNpb24oZGV2KTsKIAogCWlmIChyZXYgPT0gLTEpCi0JCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmZGV2LT5kZXYsICJwYXRhX3NsODJjMTA1OiBVbmFibGUgdG8gZmluZCBicmlkZ2UsIGRpc2FibGluZyBETUEuXG4iKTsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LAorCQkJICJwYXRhX3NsODJjMTA1OiBVbmFibGUgdG8gZmluZCBicmlkZ2UsIGRpc2FibGluZyBETUFcbiIpOwogCWVsc2UgaWYgKHJldiA8PSA1KQotCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJmRldi0+ZGV2LCAicGF0YV9zbDgyYzEwNTogRWFybHkgYnJpZGdlIHJldmlzaW9uLCBubyBETUEgYXZhaWxhYmxlLlxuIik7CisJCWRldl93YXJuKCZkZXYtPmRldiwKKwkJCSAicGF0YV9zbDgyYzEwNTogRWFybHkgYnJpZGdlIHJldmlzaW9uLCBubyBETUEgYXZhaWxhYmxlXG4iKTsKIAllbHNlCiAJCXBwaVswXSA9ICZpbmZvX2RtYTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV90cmlmbGV4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX3RyaWZsZXguYwppbmRleCBiM2UwYzk0Li4yOGRhMWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3RyaWZsZXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3RyaWZsZXguYwpAQCAtMTk2LDEwICsxOTYsOCBAQAogCQkucG9ydF9vcHMgPSAmdHJpZmxleF9wb3J0X29wcwogCX07CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mbywgTlVMTCB9OwotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCi0JaWYgKCFwcmludGVkX3ZlcnNpb24rKykKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCXJldHVybiBhdGFfcGNpX2JtZG1hX2luaXRfb25lKGRldiwgcHBpLCAmdHJpZmxleF9zaHQsIE5VTEwsIDApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV92aWEuYyBiL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMKaW5kZXggYWM4ZDdkOS4uNjVlNGJlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV92aWEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jCkBAIC0zNTAsOCArMzUwLDggQEAKIAlpZiAoY29uZmlnLT5pZCA9PSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMCkgewogCQlhdGFfaWRfY19zdHJpbmcoZGV2LT5pZCwgbW9kZWxfbnVtLCBBVEFfSURfUFJPRCwgc2l6ZW9mKG1vZGVsX251bSkpOwogCQlpZiAoc3RyY21wKG1vZGVsX251bSwgIlRTNjRHU1NEMjUtTSIpID09IDApIHsKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLAotCSJkaXNhYmxpbmcgVURNQSBtb2RlIGR1ZSB0byByZXBvcnRlZCBsb2NrdXBzIHdpdGggdGhpcyBkZXZpY2UuXG4iKTsKKwkJCWF0YV9kZXZfd2FybihkZXYsCisJImRpc2FibGluZyBVRE1BIG1vZGUgZHVlIHRvIHJlcG9ydGVkIGxvY2t1cHMgd2l0aCB0aGlzIGRldmljZVxuIik7CiAJCQltYXNrICY9IH4gQVRBX01BU0tfVURNQTsKIAkJfQogCX0KQEAgLTU1MSwxNCArNTUxLDEyIEBACiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyBOVUxMLCBOVUxMIH07CiAJc3RydWN0IHBjaV9kZXYgKmlzYTsKIAljb25zdCBzdHJ1Y3QgdmlhX2lzYV9icmlkZ2UgKmNvbmZpZzsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAl1OCBlbmFibGU7CiAJdTMyIHRpbWluZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gaWQtPmRyaXZlcl9kYXRhOwogCWludCByYzsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BkY19hZG1hLmMgYi9kcml2ZXJzL2F0YS9wZGNfYWRtYS5jCmluZGV4IDExMTE3MTIuLjA0OTExZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BkY19hZG1hLmMKKysrIGIvZHJpdmVycy9hdGEvcGRjX2FkbWEuYwpAQCAtNTk2LDE0ICs1OTYsMTIgQEAKIAogCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAocmMpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCSIzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmM7CiAJfQogCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCWlmIChyYykgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAotCQkJIjMyLWJpdCBjb25zaXN0ZW50IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmM7CiAJfQogCXJldHVybiAwOwpAQCAtNjEyLDE1ICs2MTAsMTMgQEAKIHN0YXRpYyBpbnQgYWRtYV9hdGFfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0Jc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpIGVudC0+ZHJpdmVyX2RhdGE7CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmYWRtYV9wb3J0X2luZm9bYm9hcmRfaWR4XSwgTlVMTCB9OwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKIAl2b2lkIF9faW9tZW0gKm1taW9fYmFzZTsKIAlpbnQgcmMsIHBvcnRfbm87CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmcGRldi0+ZGV2LCBEUlZfVkVSU0lPTik7CiAKIAkvKiBhbGxvYyBob3N0ICovCiAJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgQURNQV9QT1JUUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jIGIvZHJpdmVycy9hdGEvc2F0YV9kd2NfNDYwZXguYwppbmRleCAxYzRiM2FhLi4wYTlhNzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfZHdjXzQ2MGV4LmMKQEAgLTM4OSw3ICszODksNyBAQAogLyoKICAqIEZ1bmN0aW9uOiBnZXRfYnVyc3RfbGVuZ3RoX2VuY29kZQogICogYXJndW1lbnRzOiBkYXRhbGVuZ3RoOiBsZW5ndGggaW4gYnl0ZXMgb2YgZGF0YQotICogcmV0dXJucyB2YWx1ZSB0byBiZSBwcm9ncmFtbWVkIGluIHJlZ2lzdGVyIGNvcnJyZXNwb25kaW5nIHRvIGRhdGEgbGVuZ3RoCisgKiByZXR1cm5zIHZhbHVlIHRvIGJlIHByb2dyYW1tZWQgaW4gcmVnaXN0ZXIgY29ycmVzcG9uZGluZyB0byBkYXRhIGxlbmd0aAogICogVGhpcyB2YWx1ZSBpcyBlZmZlY3RpdmVseSB0aGUgbG9nKGJhc2UgMikgb2YgdGhlIGxlbmd0aAogICovCiBzdGF0aWMgIGludCBnZXRfYnVyc3RfbGVuZ3RoX2VuY29kZShpbnQgZGF0YWxlbmd0aCkKQEAgLTc2NiwxMSArNzY2LDE1IEBACiBzdGF0aWMgdm9pZCBkbWFfZHdjX2V4aXQoc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXYpCiB7CiAJZGV2X2RiZyhob3N0X3B2dC5kd2NfZGV2LCAiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MpCisJaWYgKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MpIHsKIAkJaW91bm1hcChob3N0X3B2dC5zYXRhX2RtYV9yZWdzKTsKKwkJaG9zdF9wdnQuc2F0YV9kbWFfcmVncyA9IE5VTEw7CisJfQogCi0JaWYgKGhzZGV2LT5pcnFfZG1hKQorCWlmIChoc2Rldi0+aXJxX2RtYSkgewogCQlmcmVlX2lycShoc2Rldi0+aXJxX2RtYSwgaHNkZXYpOworCQloc2Rldi0+aXJxX2RtYSA9IDA7CisJfQogfQogCiAvKgpAQCAtMTYzOCwxMyArMTY0MiwxMiBAQAogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnBpLCBOVUxMIH07CiAKIAkvKiBBbGxvY2F0ZSBEV0MgU0FUQSBkZXZpY2UgKi8KLQloc2RldiA9IGttYWxsb2Moc2l6ZW9mKCpoc2RldiksIEdGUF9LRVJORUwpOworCWhzZGV2ID0ga3phbGxvYyhzaXplb2YoKmhzZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGhzZGV2ID09IE5VTEwpIHsKIAkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImttYWxsb2MgZmFpbGVkIGZvciBoc2RldlxuIik7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3Jfb3V0OworCQlnb3RvIGVycm9yOwogCX0KLQltZW1zZXQoaHNkZXYsIDAsIHNpemVvZigqaHNkZXYpKTsKIAogCS8qIElvcmVtYXAgU0FUQSByZWdpc3RlcnMgKi8KIAliYXNlID0gb2ZfaW9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKQEAgLTE2NTIsNyArMTY1NSw3IEBACiAJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJpb3JlbWFwIGZhaWxlZCBmb3IgU0FUQSByZWdpc3RlciIKIAkJCSIgYWRkcmVzc1xuIik7CiAJCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyb3Jfb3V0OworCQlnb3RvIGVycm9yX2ttYWxsb2M7CiAJfQogCWhzZGV2LT5yZWdfYmFzZSA9IGJhc2U7CiAJZGV2X2RiZygmb2ZkZXYtPmRldiwgImlvcmVtYXAgZG9uZSBmb3IgU0FUQSByZWdpc3RlciBhZGRyZXNzXG4iKTsKQEAgLTE2NjUsNyArMTY2OCw3IEBACiAJaWYgKCFob3N0KSB7CiAJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJhdGFfaG9zdF9hbGxvY19waW5mbyBmYWlsZWRcbiIpOwogCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX291dDsKKwkJZ290byBlcnJvcl9pb21hcDsKIAl9CiAKIAlob3N0LT5wcml2YXRlX2RhdGEgPSBoc2RldjsKQEAgLTE3MzMsOCArMTczNiwxMSBAQAogCS8qIEZyZWUgU0FUQSBETUEgcmVzb3VyY2VzICovCiAJZG1hX2R3Y19leGl0KGhzZGV2KTsKIAotCWlmIChiYXNlKQotCQlpb3VubWFwKGJhc2UpOworZXJyb3JfaW9tYXA6CisJaW91bm1hcChiYXNlKTsKK2Vycm9yX2ttYWxsb2M6CisJa2ZyZWUoaHNkZXYpOworZXJyb3I6CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9mc2wuYyBiL2RyaXZlcnMvYXRhL3NhdGFfZnNsLmMKaW5kZXggMzVhNzFkOC4uNzhhZTdiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9mc2wuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX2ZzbC5jCkBAIC0zNDYsMTIgKzM0NiwxMSBAQAogCiAJCS8qIHdhcm4gaWYgZWFjaCBzL2cgZWxlbWVudCBpcyBub3QgZHdvcmQgYWxpZ25lZCAqLwogCQlpZiAoc2dfYWRkciAmIDB4MDMpCi0JCQlhdGFfcG9ydF9wcmludGsocWMtPmFwLCBLRVJOX0VSUiwKLQkJCQkJInMvZyBhZGRyIHVuYWxpZ25lZCA6IDB4JWxseFxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZ19hZGRyKTsKKwkJCWF0YV9wb3J0X2VycihxYy0+YXAsICJzL2cgYWRkciB1bmFsaWduZWQgOiAweCVsbHhcbiIsCisJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNnX2FkZHIpOwogCQlpZiAoc2dfbGVuICYgMHgwMykKLQkJCWF0YV9wb3J0X3ByaW50ayhxYy0+YXAsIEtFUk5fRVJSLAotCQkJCQkicy9nIGxlbiB1bmFsaWduZWQgOiAweCV4XG4iLCBzZ19sZW4pOworCQkJYXRhX3BvcnRfZXJyKHFjLT5hcCwgInMvZyBsZW4gdW5hbGlnbmVkIDogMHgleFxuIiwKKwkJCQkgICAgIHNnX2xlbik7CiAKIAkJaWYgKG51bV9wcmRlID09IChTQVRBX0ZTTF9NQVhfUFJEX0RJUkVDVCAtIDEpICYmCiAJCSAgICBzZ19uZXh0KHNnKSAhPSBOVUxMKSB7CkBAIC02NjEsOCArNjYwLDcgQEAKIAlzYXRhX2ZzbF9zY3Jfd3JpdGUoJmFwLT5saW5rLCBTQ1JfQ09OVFJPTCwgdGVtcCk7CiAKIAlzYXRhX2ZzbF9zY3JfcmVhZCgmYXAtPmxpbmssIFNDUl9DT05UUk9MLCAmdGVtcCk7Ci0JZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIGRldiwgInNjcl9jb250cm9sLCBzcGVlZCBsaW1pdGVkIHRvICV4XG4iLAotCQkJdGVtcCk7CisJZGV2X3dhcm4oZGV2LCAic2NyX2NvbnRyb2wsIHNwZWVkIGxpbWl0ZWQgdG8gJXhcbiIsIHRlbXApOwogI2VuZGlmCiAKIAlyZXR1cm4gMDsKQEAgLTc0MCw4ICs3MzgsNyBAQAogCQkJCSAxLCA1MDApOwogCiAJaWYgKHRlbXAgJiBPTkxJTkUpIHsKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwKLQkJCQkiSGFyZHJlc2V0IGZhaWxlZCwgbm90IG9mZi1saW5lZCAlZFxuIiwgaSk7CisJCWF0YV9wb3J0X2VycihhcCwgIkhhcmRyZXNldCBmYWlsZWQsIG5vdCBvZmYtbGluZWQgJWRcbiIsIGkpOwogCiAJCS8qCiAJCSAqIFRyeSB0byBvZmZsaW5lIGNvbnRyb2xsZXIgYXRsZWFzdCB0d2ljZQpAQCAtNzc3LDggKzc3NCw3IEBACiAJdGVtcCA9IGF0YV93YWl0X3JlZ2lzdGVyKGFwLCBoY3JfYmFzZSArIEhTVEFUVVMsIE9OTElORSwgMCwgMSwgNTAwKTsKIAogCWlmICghKHRlbXAgJiBPTkxJTkUpKSB7Ci0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsCi0JCQkJIkhhcmRyZXNldCBmYWlsZWQsIG5vdCBvbi1saW5lZFxuIik7CisJCWF0YV9wb3J0X2VycihhcCwgIkhhcmRyZXNldCBmYWlsZWQsIG5vdCBvbi1saW5lZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtNzk0LDkgKzc5MCw4IEBACiAKIAl0ZW1wID0gYXRhX3dhaXRfcmVnaXN0ZXIoYXAsIGhjcl9iYXNlICsgSFNUQVRVUywgMHhGRiwgMCwgMSwgNTAwKTsKIAlpZiAoKCEodGVtcCAmIDB4MTApKSB8fCBhdGFfbGlua19vZmZsaW5lKGxpbmspKSB7Ci0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9XQVJOSU5HLAotCQkJCSJObyBEZXZpY2UgT1IgUEhZUkRZIGNoYW5nZSxIc3RhdHVzID0gMHgleFxuIiwKLQkJCQlpb3JlYWQzMihoY3JfYmFzZSArIEhTVEFUVVMpKTsKKwkJYXRhX3BvcnRfd2FybihhcCwgIk5vIERldmljZSBPUiBQSFlSRFkgY2hhbmdlLEhzdGF0dXMgPSAweCV4XG4iLAorCQkJICAgICAgaW9yZWFkMzIoaGNyX2Jhc2UgKyBIU1RBVFVTKSk7CiAJCSpjbGFzcyA9IEFUQV9ERVZfTk9ORTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtODA5LDEzICs4MDQsMTIgQEAKIAkJCTUwMCwgamlmZmllc190b19tc2VjcyhkZWFkbGluZSAtIHN0YXJ0X2ppZmZpZXMpKTsKIAogCWlmICgodGVtcCAmIDB4RkYpICE9IDB4MTgpIHsKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX1dBUk5JTkcsICJObyBTaWduYXR1cmUgVXBkYXRlXG4iKTsKKwkJYXRhX3BvcnRfd2FybihhcCwgIk5vIFNpZ25hdHVyZSBVcGRhdGVcbiIpOwogCQkqY2xhc3MgPSBBVEFfREVWX05PTkU7CiAJCWdvdG8gZG9fZm9sbG93dXBfc3JzdDsKIAl9IGVsc2UgewotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywKLQkJCQkiU2lnbmF0dXJlIFVwZGF0ZSBkZXRlY3RlZCBAICVkIG1zZWNzXG4iLAotCQkJCWppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpKTsKKwkJYXRhX3BvcnRfaW5mbyhhcCwgIlNpZ25hdHVyZSBVcGRhdGUgZGV0ZWN0ZWQgQCAlZCBtc2Vjc1xuIiwKKwkJCSAgICAgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpKTsKIAkJKmNsYXNzID0gc2F0YV9mc2xfZGV2X2NsYXNzaWZ5KGFwKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtODkwLDcgKzg4NCw3IEBACiAKIAl0ZW1wID0gYXRhX3dhaXRfcmVnaXN0ZXIoYXAsIENRICsgaGNyX2Jhc2UsIDB4MSwgMHgxLCAxLCA1MDAwKTsKIAlpZiAodGVtcCAmIDB4MSkgewotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywgIkFUQV9TUlNUIGlzc3VlIGZhaWxlZFxuIik7CisJCWF0YV9wb3J0X3dhcm4oYXAsICJBVEFfU1JTVCBpc3N1ZSBmYWlsZWRcbiIpOwogCiAJCURQUklOVEsoIlNvZnRyZXNldEA1MDAwLENRPTB4JXgsQ0E9MHgleCxDQz0weCV4XG4iLAogCQkJaW9yZWFkMzIoQ1EgKyBoY3JfYmFzZSksCkBAIC0xMjAyLDggKzExOTYsNyBAQAogCWlmIChhcCkgewogCQlzYXRhX2ZzbF9ob3N0X2ludHIoYXApOwogCX0gZWxzZSB7Ci0JCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCBob3N0LT5kZXYsCi0JCQkgICAiaW50ZXJydXB0IG9uIGRpc2FibGVkIHBvcnQgMFxuIik7CisJCWRldl93YXJuKGhvc3QtPmRldiwgImludGVycnVwdCBvbiBkaXNhYmxlZCBwb3J0IDBcbiIpOwogCX0KIAogCWlvd3JpdGUzMihpbnRlcnJ1cHRfZW5hYmxlcywgaGNyX2Jhc2UgKyBIU1RBVFVTKTsKQEAgLTEzMTcsOCArMTMxMCw3IEBACiAJc3RydWN0IGF0YV9wb3J0X2luZm8gcGkgPSBzYXRhX2ZzbF9wb3J0X2luZm9bMF07CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmcGksIE5VTEwgfTsKIAotCWRldl9wcmludGsoS0VSTl9JTkZPLCAmb2ZkZXYtPmRldiwKLQkJICAgIlNhdGEgRlNMIFBsYXRmb3JtL0NTQiBEcml2ZXIgaW5pdFxuIik7CisJZGV2X2luZm8oJm9mZGV2LT5kZXYsICJTYXRhIEZTTCBQbGF0Zm9ybS9DU0IgRHJpdmVyIGluaXRcbiIpOwogCiAJaGNyX2Jhc2UgPSBvZl9pb21hcChvZmRldi0+ZGV2Lm9mX25vZGUsIDApOwogCWlmICghaGNyX2Jhc2UpCkBAIC0xMzQ3LDcgKzEzMzksNyBAQAogCiAJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKIAlpZiAoaXJxIDwgMCkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmb2ZkZXYtPmRldiwgImludmFsaWQgaXJxIGZyb20gcGxhdGZvcm1cbiIpOworCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAiaW52YWxpZCBpcnEgZnJvbSBwbGF0Zm9ybVxuIik7CiAJCWdvdG8gZXJyb3JfZXhpdF93aXRoX2NsZWFudXA7CiAJfQogCWhvc3RfcHJpdi0+aXJxID0gaXJxOwpAQCAtMTQyMiw4ICsxNDE0LDcgQEAKIAogCXJldCA9IHNhdGFfZnNsX2luaXRfY29udHJvbGxlcihob3N0KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZvcC0+ZGV2LAotCQkJIkVycm9yIGluaXRpYWxpemUgaGFyZHdhcmVcbiIpOworCQlkZXZfZXJyKCZvcC0+ZGV2LCAiRXJyb3IgaW5pdGlhbGl6aW5nIGhhcmR3YXJlXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfaW5pYzE2MnguYyBiL2RyaXZlcnMvYXRhL3NhdGFfaW5pYzE2MnguYwppbmRleCA4M2E0NDQ3Li41YzdkNzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX2luaWMxNjJ4LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9pbmljMTYyeC5jCkBAIC0zOTYsOSArMzk2LDggQEAKIAl9CiAKICBzcHVyaW91czoKLQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywgInVuaGFuZGxlZCBpbnRlcnJ1cHQ6ICIKLQkJCSJjbWQ9MHgleCBpcnFfc3RhdD0weCV4IGlkbWFfc3RhdD0weCV4XG4iLAotCQkJcWMgPyBxYy0+dGYuY29tbWFuZCA6IDB4ZmYsIGlycV9zdGF0LCBpZG1hX3N0YXQpOworCWF0YV9wb3J0X3dhcm4oYXAsICJ1bmhhbmRsZWQgaW50ZXJydXB0OiBjbWQ9MHgleCBpcnFfc3RhdD0weCV4IGlkbWFfc3RhdD0weCV4XG4iLAorCQkgICAgICBxYyA/IHFjLT50Zi5jb21tYW5kIDogMHhmZiwgaXJxX3N0YXQsIGlkbWFfc3RhdCk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpbmljX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCkBAIC02MTksOCArNjE4LDkgQEAKIAogCXJjID0gc2F0YV9saW5rX3Jlc3VtZShsaW5rLCB0aW1pbmcsIGRlYWRsaW5lKTsKIAlpZiAocmMpIHsKLQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fV0FSTklORywgImZhaWxlZCB0byByZXN1bWUgIgotCQkJCSJsaW5rIGFmdGVyIHJlc2V0IChlcnJubz0lZClcbiIsIHJjKTsKKwkJYXRhX2xpbmtfd2FybihsaW5rLAorCQkJICAgICAgImZhaWxlZCB0byByZXN1bWUgbGluayBhZnRlciByZXNldCAoZXJybm89JWQpXG4iLAorCQkJICAgICAgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC02MzIsOCArNjMyLDkgQEAKIAkJcmMgPSBhdGFfd2FpdF9hZnRlcl9yZXNldChsaW5rLCBkZWFkbGluZSwgaW5pY19jaGVja19yZWFkeSk7CiAJCS8qIGxpbmsgb2NjdXBpZWQsIC1FTk9ERVYgdG9vIGlzIGFuIGVycm9yICovCiAJCWlmIChyYykgewotCQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fV0FSTklORywgImRldmljZSBub3QgcmVhZHkgIgotCQkJCQkiYWZ0ZXIgaGFyZHJlc2V0IChlcnJubz0lZClcbiIsIHJjKTsKKwkJCWF0YV9saW5rX3dhcm4obGluaywKKwkJCQkgICAgICAiZGV2aWNlIG5vdCByZWFkeSBhZnRlciBoYXJkcmVzZXQgKGVycm5vPSVkKVxuIiwKKwkJCQkgICAgICByYyk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIApAQCAtNzk5LDcgKzgwMCw2IEBACiAKIHN0YXRpYyBpbnQgaW5pY19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmljX3BvcnRfaW5mbywgTlVMTCB9OwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgaW5pY19ob3N0X3ByaXYgKmhwcml2OwpAQCAtODA3LDggKzgwNyw3IEBACiAJaW50IG1taW9fYmFyOwogCWludCBpLCByYzsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCS8qIGFsbG9jIGhvc3QgKi8KIAlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oJnBkZXYtPmRldiwgcHBpLCBOUl9QT1JUUyk7CkBAIC04NDcsMTUgKzg0NiwxMyBAQAogCS8qIFNldCBkbWFfbWFzay4gIFRoaXMgZGV2aWNlcyBkb2Vzbid0IHN1cHBvcnQgNjRiaXQgYWRkcmVzc2luZy4gKi8KIAlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJaWYgKHJjKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkgICAiMzItYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiMzItYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJjOwogCX0KIAogCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCWlmIChyYykgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAotCQkJICAgIjMyLWJpdCBjb25zaXN0ZW50IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC04NjYsMTUgKzg2MywxMyBAQAogCSAqLwogCXJjID0gcGNpX3NldF9kbWFfbWF4X3NlZ19zaXplKHBkZXYsIDY1NTM2IC0gNTEyKTsKIAlpZiAocmMpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCSAgICJmYWlsZWQgdG8gc2V0IHRoZSBtYXhpbXVtIHNlZ21lbnQgc2l6ZS5cbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0IHRoZSBtYXhpbXVtIHNlZ21lbnQgc2l6ZVxuIik7CiAJCXJldHVybiByYzsKIAl9CiAKIAlyYyA9IGluaXRfY29udHJvbGxlcihocHJpdi0+bW1pb19iYXNlLCBocHJpdi0+Y2FjaGVkX2hjdGwpOwogCWlmIChyYykgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAotCQkJICAgImZhaWxlZCB0byBpbml0aWFsaXplIGNvbnRyb2xsZXJcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb250cm9sbGVyXG4iKTsKIAkJcmV0dXJuIHJjOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9tdi5jIGIvZHJpdmVycy9hdGEvc2F0YV9tdi5jCmluZGV4IGI1MmMwNTEuLjRiNmIyMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfbXYuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX212LmMKQEAgLTExOTAsNyArMTE5MCw3IEBACiAJCQlicmVhazsKIAkJdWRlbGF5KHBlcl9sb29wKTsKIAl9Ci0JLyogYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sICIlczogJXUrIHVzZWNzXG4iLCBfX2Z1bmNfXywgaSk7ICovCisJLyogYXRhX3BvcnRfaW5mbyhhcCwgIiVzOiAldSsgdXNlY3NcbiIsIF9fZnVuY19fLCBpKTsgKi8KIH0KIAogLyoqCkBAIC0xMjI4LDcgKzEyMjgsNyBAQAogCXBwLT5wcF9mbGFncyAmPSB+TVZfUFBfRkxBR19FRE1BX0VOOwogCW12X3dhaXRfZm9yX2VkbWFfZW1wdHlfaWRsZShhcCk7CiAJaWYgKG12X3N0b3BfZWRtYV9lbmdpbmUocG9ydF9tbWlvKSkgewotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAiVW5hYmxlIHRvIHN0b3AgZURNQVxuIik7CisJCWF0YV9wb3J0X2VycihhcCwgIlVuYWJsZSB0byBzdG9wIGVETUFcbiIpOwogCQllcnIgPSAtRUlPOwogCX0KIAltdl9lZG1hX2NmZyhhcCwgMCwgMCk7CkBAIC0xMzgyLDcgKzEzODIsNyBAQAogCWlmIChhZGV2LT5mbGFncyAmIEFUQV9ERkxBR19OQ1EpIHsKIAkJaWYgKHNhdGFfcG1wX2F0dGFjaGVkKGFkZXYtPmxpbmstPmFwKSkgewogCQkJYWRldi0+ZmxhZ3MgJj0gfkFUQV9ERkxBR19OQ1E7Ci0JCQlhdGFfZGV2X3ByaW50ayhhZGV2LCBLRVJOX0lORk8sCisJCQlhdGFfZGV2X2luZm8oYWRldiwKIAkJCQkiTkNRIGRpc2FibGVkIGZvciBjb21tYW5kLWJhc2VkIHN3aXRjaGluZ1xuIik7CiAJCX0KIAl9CkBAIC0yMjI1LDkgKzIyMjUsOCBAQAogCiAJLyogU2VlIGlmIGl0IHdvcmtlZCAqLwogCWlmICgoaWZzdGF0ICYgMHgzMDAwKSAhPSAweDEwMDApIHsKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX1dBUk5JTkcsCi0JCQkJIiVzIHRyYW5zbWlzc2lvbiBlcnJvciwgaWZzdGF0PSUwOHhcbiIsCi0JCQkJX19mdW5jX18sIGlmc3RhdCk7CisJCWF0YV9wb3J0X3dhcm4oYXAsICIlcyB0cmFuc21pc3Npb24gZXJyb3IsIGlmc3RhdD0lMDh4XG4iLAorCQkJICAgICAgX19mdW5jX18sIGlmc3RhdCk7CiAJCXJldHVybiBBQ19FUlJfT1RIRVI7CiAJfQogCXJldHVybiAwOwpAQCAtMjM0Miw5ICsyMzQxLDkgQEAKIAkJICovCiAJCWlmIChsaW1pdF93YXJuaW5ncyA+IDAgJiYgKHFjLT5uYnl0ZXMgLyBxYy0+c2VjdF9zaXplKSA+IDEpIHsKIAkJCS0tbGltaXRfd2FybmluZ3M7Ci0JCQlhdGFfbGlua19wcmludGsocWMtPmRldi0+bGluaywgS0VSTl9XQVJOSU5HLCBEUlZfTkFNRQotCQkJCQkiOiBhdHRlbXB0aW5nIFBJTyB3L211bHRpcGxlIERSUTogIgotCQkJCQkidGhpcyBtYXkgZmFpbCBkdWUgdG8gaC93IGVycmF0YVxuIik7CisJCQlhdGFfbGlua193YXJuKHFjLT5kZXYtPmxpbmssIERSVl9OQU1FCisJCQkJICAgICAgIjogYXR0ZW1wdGluZyBQSU8gdy9tdWx0aXBsZSBEUlE6ICIKKwkJCQkgICAgICAidGhpcyBtYXkgZmFpbCBkdWUgdG8gaC93IGVycmF0YVxuIik7CiAJCX0KIAkJLyogZHJvcCB0aHJvdWdoICovCiAJY2FzZSBBVEFfUFJPVF9OT0RBVEE6CkBAIC0yNDk5LDIwICsyNDk4LDIwIEBACiAJfQogCWZhaWxlZF9saW5rcyA9IGh3ZWlnaHQxNihuZXdfbWFwKTsKIAotCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9JTkZPLCAiJXM6IHBtcF9tYXA9JTA0eCBxY19tYXA9JTA0eCAiCi0JCQkiZmFpbGVkX2xpbmtzPSVkIG5yX2FjdGl2ZV9saW5rcz0lZFxuIiwKLQkJCV9fZnVuY19fLCBwcC0+ZGVsYXllZF9laF9wbXBfbWFwLAotCQkJYXAtPnFjX2FjdGl2ZSwgZmFpbGVkX2xpbmtzLAotCQkJYXAtPm5yX2FjdGl2ZV9saW5rcyk7CisJYXRhX3BvcnRfaW5mbyhhcCwKKwkJICAgICAgIiVzOiBwbXBfbWFwPSUwNHggcWNfbWFwPSUwNHggZmFpbGVkX2xpbmtzPSVkIG5yX2FjdGl2ZV9saW5rcz0lZFxuIiwKKwkJICAgICAgX19mdW5jX18sIHBwLT5kZWxheWVkX2VoX3BtcF9tYXAsCisJCSAgICAgIGFwLT5xY19hY3RpdmUsIGZhaWxlZF9saW5rcywKKwkJICAgICAgYXAtPm5yX2FjdGl2ZV9saW5rcyk7CiAKIAlpZiAoYXAtPm5yX2FjdGl2ZV9saW5rcyA8PSBmYWlsZWRfbGlua3MgJiYgbXZfcmVxX3FfZW1wdHkoYXApKSB7CiAJCW12X3Byb2Nlc3NfY3JwYl9lbnRyaWVzKGFwLCBwcCk7CiAJCW12X3N0b3BfZWRtYShhcCk7CiAJCW12X2VoX2ZyZWV6ZShhcCk7Ci0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9JTkZPLCAiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKKwkJYXRhX3BvcnRfaW5mbyhhcCwgIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAxOwkvKiBoYW5kbGVkICovCiAJfQotCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9JTkZPLCAiJXM6IHdhaXRpbmdcbiIsIF9fZnVuY19fKTsKKwlhdGFfcG9ydF9pbmZvKGFwLCAiJXM6IHdhaXRpbmdcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMTsJLyogaGFuZGxlZCAqLwogfQogCkBAIC0yNTU0LDkgKzI1NTMsOCBAQAogCQkgKiBhbmQgd2UgY2Fubm90IGhhbmRsZSBpdCBoZXJlLgogCQkgKi8KIAkJaWYgKGVkbWFfZXJyX2NhdXNlICYgRURNQV9FUlJfU0VMRl9ESVMpIHsKLQkJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9XQVJOSU5HLAotCQkJCSIlczogZXJyX2NhdXNlPTB4JXggcHBfZmxhZ3M9MHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgZWRtYV9lcnJfY2F1c2UsIHBwLT5wcF9mbGFncyk7CisJCQlhdGFfcG9ydF93YXJuKGFwLCAiJXM6IGVycl9jYXVzZT0weCV4IHBwX2ZsYWdzPTB4JXhcbiIsCisJCQkJICAgICAgX19mdW5jX18sIGVkbWFfZXJyX2NhdXNlLCBwcC0+cHBfZmxhZ3MpOwogCQkJcmV0dXJuIDA7IC8qIG5vdCBoYW5kbGVkICovCiAJCX0KIAkJcmV0dXJuIG12X2hhbmRsZV9mYnNfbmNxX2Rldl9lcnIoYXApOwpAQCAtMjU2Nyw5ICsyNTY1LDggQEAKIAkJICogYW5kIHdlIGNhbm5vdCBoYW5kbGUgaXQgaGVyZS4KIAkJICovCiAJCWlmICghKGVkbWFfZXJyX2NhdXNlICYgRURNQV9FUlJfU0VMRl9ESVMpKSB7Ci0JCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywKLQkJCQkiJXM6IGVycl9jYXVzZT0weCV4IHBwX2ZsYWdzPTB4JXhcbiIsCi0JCQkJX19mdW5jX18sIGVkbWFfZXJyX2NhdXNlLCBwcC0+cHBfZmxhZ3MpOworCQkJYXRhX3BvcnRfd2FybihhcCwgIiVzOiBlcnJfY2F1c2U9MHgleCBwcF9mbGFncz0weCV4XG4iLAorCQkJCSAgICAgIF9fZnVuY19fLCBlZG1hX2Vycl9jYXVzZSwgcHAtPnBwX2ZsYWdzKTsKIAkJCXJldHVybiAwOyAvKiBub3QgaGFuZGxlZCAqLwogCQl9CiAJCXJldHVybiBtdl9oYW5kbGVfZmJzX25vbl9uY3FfZGV2X2VycihhcCk7CkBAIC0yOTMwLDggKzI5MjcsNyBAQAogCiAJZXJyX2NhdXNlID0gcmVhZGwobW1pbyArIGhwcml2LT5pcnFfY2F1c2Vfb2Zmc2V0KTsKIAotCWRldl9wcmludGsoS0VSTl9FUlIsIGhvc3QtPmRldiwgIlBDSSBFUlJPUjsgUENJIElSUSBjYXVzZT0weCUwOHhcbiIsCi0JCSAgIGVycl9jYXVzZSk7CisJZGV2X2Vycihob3N0LT5kZXYsICJQQ0kgRVJST1I7IFBDSSBJUlEgY2F1c2U9MHglMDh4XG4iLCBlcnJfY2F1c2UpOwogCiAJRFBSSU5USygiQWxsIHJlZ3MgQCBQQ0kgZXJyb3JcbiIpOwogCW12X2R1bXBfYWxsX3JlZ3MobW1pbywgLTEsIHRvX3BjaV9kZXYoaG9zdC0+ZGV2KSk7CkBAIC0zNzYwLDggKzM3NTYsOCBAQAogCQkJaHBfZmxhZ3MgfD0gTVZfSFBfRVJSQVRBXzUwWFhCMjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsCi0JCQkgICAiQXBwbHlpbmcgNTBYWEIyIHdvcmthcm91bmRzIHRvIHVua25vd24gcmV2XG4iKTsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJICJBcHBseWluZyA1MFhYQjIgd29ya2Fyb3VuZHMgdG8gdW5rbm93biByZXZcbiIpOwogCQkJaHBfZmxhZ3MgfD0gTVZfSFBfRVJSQVRBXzUwWFhCMjsKIAkJCWJyZWFrOwogCQl9CkBAIC0zNzgwLDggKzM3NzYsOCBAQAogCQkJaHBfZmxhZ3MgfD0gTVZfSFBfRVJSQVRBXzUwWFhCMjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsCi0JCQkgICAiQXBwbHlpbmcgQjIgd29ya2Fyb3VuZHMgdG8gdW5rbm93biByZXZcbiIpOworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCQkgIkFwcGx5aW5nIEIyIHdvcmthcm91bmRzIHRvIHVua25vd24gcmV2XG4iKTsKIAkJCWhwX2ZsYWdzIHw9IE1WX0hQX0VSUkFUQV81MFhYQjI7CiAJCQlicmVhazsKIAkJfQpAQCAtMzgwMSw4ICszNzk3LDggQEAKIAkJCWhwX2ZsYWdzIHw9IE1WX0hQX0VSUkFUQV82MFgxQzA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcGRldi0+ZGV2LAotCQkJCSAgICJBcHBseWluZyBCMiB3b3JrYXJvdW5kcyB0byB1bmtub3duIHJldlxuIik7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCSAiQXBwbHlpbmcgQjIgd29ya2Fyb3VuZHMgdG8gdW5rbm93biByZXZcbiIpOwogCQkJaHBfZmxhZ3MgfD0gTVZfSFBfRVJSQVRBXzYwWDFCMjsKIAkJCWJyZWFrOwogCQl9CkBAIC0zODUxLDggKzM4NDcsOCBAQAogCQkJaHBfZmxhZ3MgfD0gTVZfSFBfRVJSQVRBXzYwWDFDMDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsCi0JCQkgICAiQXBwbHlpbmcgNjBYMUMwIHdvcmthcm91bmRzIHRvIHVua25vd24gcmV2XG4iKTsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJICJBcHBseWluZyA2MFgxQzAgd29ya2Fyb3VuZHMgdG8gdW5rbm93biByZXZcbiIpOwogCQkJaHBfZmxhZ3MgfD0gTVZfSFBfRVJSQVRBXzYwWDFDMDsKIAkJCWJyZWFrOwogCQl9CkBAIC0zODY3LDggKzM4NjMsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsIGhvc3QtPmRldiwKLQkJCSAgICJCVUc6IGludmFsaWQgYm9hcmQgaW5kZXggJXVcbiIsIGJvYXJkX2lkeCk7CisJCWRldl9lcnIoaG9zdC0+ZGV2LCAiQlVHOiBpbnZhbGlkIGJvYXJkIGluZGV4ICV1XG4iLCBib2FyZF9pZHgpOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTQwMjMsNyArNDAxOCw2IEBACiAgKi8KIHN0YXRpYyBpbnQgbXZfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAljb25zdCBzdHJ1Y3QgbXZfc2F0YV9wbGF0Zm9ybV9kYXRhICptdl9wbGF0Zm9ybV9kYXRhOwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9CiAJICAgIHsgJm12X3BvcnRfaW5mb1tjaGlwX3NvY10sIE5VTEwgfTsKQEAgLTQwMzIsOCArNDAyNiw3IEBACiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IG5fcG9ydHMsIHJjOwogCi0JaWYgKCFwcmludGVkX3ZlcnNpb24rKykKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmcGRldi0+ZGV2LCBEUlZfVkVSU0lPTik7CiAKIAkvKgogCSAqIFNpbXBsZSByZXNvdXJjZSB2YWxpZGF0aW9uIC4uCkBAIC00MDkxLDkgKzQwODQsOCBAQAogCWlmIChyYykKIAkJZ290byBlcnI7CiAKLQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwKLQkJICAgInNsb3RzICV1IHBvcnRzICVkXG4iLCAodW5zaWduZWQpTVZfTUFYX1FfREVQVEgsCi0JCSAgIGhvc3QtPm5fcG9ydHMpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJzbG90cyAldSBwb3J0cyAlZFxuIiwKKwkJICh1bnNpZ25lZClNVl9NQVhfUV9ERVBUSCwgaG9zdC0+bl9wb3J0cyk7CiAKIAlyZXR1cm4gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKSwgbXZfaW50ZXJydXB0LAogCQkJCSBJUlFGX1NIQVJFRCwgJm12Nl9zaHQpOwpAQCAtNDIxNywyMiArNDIwOSwyMSBAQAogCQlpZiAocmMpIHsKIAkJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQkJaWYgKHJjKSB7Ci0JCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCQkJICAgIjY0LWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCQkiNjQtYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gcmM7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewogCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCQkgICAiMzItYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIjMyLWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCQkgICAiMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSIzMi1iaXQgY29uc2lzdGVudCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAl9CkBAIC00Mjc2LDEwICs0MjY3LDkgQEAKIAllbHNlCiAJCWdlbiA9ICI/IjsKIAotCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LAotCSAgICAgICAiR2VuLSVzICV1IHNsb3RzICV1IHBvcnRzICVzIG1vZGUgSVJRIHZpYSAlc1xuIiwKLQkgICAgICAgZ2VuLCAodW5zaWduZWQpTVZfTUFYX1FfREVQVEgsIGhvc3QtPm5fcG9ydHMsCi0JICAgICAgIHNjY19zLCAoTVZfSFBfRkxBR19NU0kgJiBocHJpdi0+aHBfZmxhZ3MpID8gIk1TSSIgOiAiSU5UeCIpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJHZW4tJXMgJXUgc2xvdHMgJXUgcG9ydHMgJXMgbW9kZSBJUlEgdmlhICVzXG4iLAorCQkgZ2VuLCAodW5zaWduZWQpTVZfTUFYX1FfREVQVEgsIGhvc3QtPm5fcG9ydHMsCisJCSBzY2NfcywgKE1WX0hQX0ZMQUdfTVNJICYgaHByaXYtPmhwX2ZsYWdzKSA/ICJNU0kiIDogIklOVHgiKTsKIH0KIAogLyoqCkBAIC00MjkzLDE1ICs0MjgzLDEzIEBACiBzdGF0aWMgaW50IG12X3BjaV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0Jc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpZW50LT5kcml2ZXJfZGF0YTsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZtdl9wb3J0X2luZm9bYm9hcmRfaWR4XSwgTlVMTCB9OwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgbXZfaG9zdF9wcml2ICpocHJpdjsKIAlpbnQgbl9wb3J0cywgcG9ydCwgcmM7CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCS8qIGFsbG9jYXRlIGhvc3QgKi8KIAluX3BvcnRzID0gbXZfZ2V0X2hjX2NvdW50KHBwaVswXS0+ZmxhZ3MpICogTVZfUE9SVFNfUEVSX0hDOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9udi5jIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCmluZGV4IGYxNzNlZjMuLmUwYmM5NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX252LmMKQEAgLTYyMCw5ICs2MjAsOCBAQAogCQljb3VudCsrOwogCX0KIAlpZiAoY291bnQgPT0gMjApCi0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9XQVJOSU5HLAotCQkJInRpbWVvdXQgd2FpdGluZyBmb3IgQURNQSBJRExFLCBzdGF0PTB4JWh4XG4iLAotCQkJc3RhdHVzKTsKKwkJYXRhX3BvcnRfd2FybihhcCwgInRpbWVvdXQgd2FpdGluZyBmb3IgQURNQSBJRExFLCBzdGF0PTB4JWh4XG4iLAorCQkJICAgICAgc3RhdHVzKTsKIAogCXRtcCA9IHJlYWR3KG1taW8gKyBOVl9BRE1BX0NUTCk7CiAJd3JpdGV3KHRtcCAmIH5OVl9BRE1BX0NUTF9HTywgbW1pbyArIE5WX0FETUFfQ1RMKTsKQEAgLTYzNSw5ICs2MzQsOSBAQAogCQljb3VudCsrOwogCX0KIAlpZiAoY291bnQgPT0gMjApCi0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9XQVJOSU5HLAotCQkJICJ0aW1lb3V0IHdhaXRpbmcgZm9yIEFETUEgTEVHQUNZLCBzdGF0PTB4JWh4XG4iLAotCQkJIHN0YXR1cyk7CisJCWF0YV9wb3J0X3dhcm4oYXAsCisJCQkgICAgICAidGltZW91dCB3YWl0aW5nIGZvciBBRE1BIExFR0FDWSwgc3RhdD0weCVoeFxuIiwKKwkJCSAgICAgIHN0YXR1cyk7CiAKIAlwcC0+ZmxhZ3MgfD0gTlZfQURNQV9QT1JUX1JFR0lTVEVSX01PREU7CiB9CkBAIC02NjUsNyArNjY0LDcgQEAKIAkJY291bnQrKzsKIAl9CiAJaWYgKGNvdW50ID09IDIwKQotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywKKwkJYXRhX3BvcnRfd2FybihhcCwKIAkJCSJ0aW1lb3V0IHdhaXRpbmcgZm9yIEFETUEgTEVHQUNZIGNsZWFyIGFuZCBJRExFLCBzdGF0PTB4JWh4XG4iLAogCQkJc3RhdHVzKTsKIApAQCAtNzcyLDEwICs3NzEsMTAgQEAKIAogCWJsa19xdWV1ZV9zZWdtZW50X2JvdW5kYXJ5KHNkZXYtPnJlcXVlc3RfcXVldWUsIHNlZ21lbnRfYm91bmRhcnkpOwogCWJsa19xdWV1ZV9tYXhfc2VnbWVudHMoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgc2dfdGFibGVzaXplKTsKLQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywKLQkJIkRNQSBtYXNrIDB4JWxsWCwgc2VnbWVudCBib3VuZGFyeSAweCVsWCwgaHcgc2VncyAlaHVcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpKmFwLT5ob3N0LT5kZXYtPmRtYV9tYXNrLAotCQlzZWdtZW50X2JvdW5kYXJ5LCBzZ190YWJsZXNpemUpOworCWF0YV9wb3J0X2luZm8oYXAsCisJCSAgICAgICJETUEgbWFzayAweCVsbFgsIHNlZ21lbnQgYm91bmRhcnkgMHglbFgsIGh3IHNlZ3MgJWh1XG4iLAorCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSphcC0+aG9zdC0+ZGV2LT5kbWFfbWFzaywKKwkJICAgICAgc2VnbWVudF9ib3VuZGFyeSwgc2dfdGFibGVzaXplKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKIApAQCAtMTQ0Myw4ICsxNDQyLDcgQEAKIAkgICBleGlzdGluZyBjb21tYW5kcy4gKi8KIAlpZiAodW5saWtlbHkocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX05DUSAmJgogCQkgICAgIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX1JFU1VMVF9URikpKSB7Ci0JCWF0YV9kZXZfcHJpbnRrKHFjLT5kZXYsIEtFUk5fRVJSLAotCQkJIk5DUSB3LyBSRVNVTFRfVEYgbm90IGFsbG93ZWRcbiIpOworCQlhdGFfZGV2X2VycihxYy0+ZGV2LCAiTkNRIHcvIFJFU1VMVF9URiBub3QgYWxsb3dlZFxuIik7CiAJCXJldHVybiBBQ19FUlJfU1lTVEVNOwogCX0KIApAQCAtMTU4MSwxNSArMTU3OSwxNSBAQAogCQlpbnQgcmM7CiAKIAkJaWYgKCEoZWhjLT5pLmZsYWdzICYgQVRBX0VISV9RVUlFVCkpCi0JCQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9JTkZPLCAibnY6IHNraXBwaW5nICIKLQkJCQkJImhhcmRyZXNldCBvbiBvY2N1cGllZCBwb3J0XG4iKTsKKwkJCWF0YV9saW5rX2luZm8obGluaywKKwkJCQkgICAgICAibnY6IHNraXBwaW5nIGhhcmRyZXNldCBvbiBvY2N1cGllZCBwb3J0XG4iKTsKIAogCQkvKiBtYWtlIHN1cmUgdGhlIGxpbmsgaXMgb25saW5lICovCiAJCXJjID0gc2F0YV9saW5rX3Jlc3VtZShsaW5rLCB0aW1pbmcsIGRlYWRsaW5lKTsKIAkJLyogd2hpbmUgYWJvdXQgcGh5IHJlc3VtZSBmYWlsdXJlIGJ1dCBwcm9jZWVkICovCiAJCWlmIChyYyAmJiByYyAhPSAtRU9QTk9UU1VQUCkKLQkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX1dBUk5JTkcsICJmYWlsZWQgdG8gcmVzdW1lICIKLQkJCQkJImxpbmsgKGVycm5vPSVkKVxuIiwgcmMpOworCQkJYXRhX2xpbmtfd2FybihsaW5rLCAiZmFpbGVkIHRvIHJlc3VtZSBsaW5rIChlcnJubz0lZClcbiIsCisJCQkJICAgICAgcmMpOwogCX0KIAogCS8qIGRldmljZSBzaWduYXR1cmUgYWNxdWlzaXRpb24gaXMgdW5yZWxpYWJsZSAqLwpAQCAtMTY4Niw3ICsxNjg0LDcgQEAKIAkJCXU4IGNwYl9jb3VudCA9IHJlYWRiKG1taW8gKyBOVl9BRE1BX0NQQl9DT1VOVCk7CiAJCQl1OCBuZXh0X2NwYl9pZHggPSByZWFkYihtbWlvICsgTlZfQURNQV9ORVhUX0NQQl9JRFgpOwogCi0JCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLAorCQkJYXRhX3BvcnRfZXJyKGFwLAogCQkJCSJFSCBpbiBBRE1BIG1vZGUsIG5vdGlmaWVyIDB4JVggIgogCQkJCSJub3RpZmllcl9lcnJvciAweCVYIGdlbl9jdGwgMHglWCBzdGF0dXMgMHglWCAiCiAJCQkJIm5leHQgY3BiIGNvdW50IDB4JVggbmV4dCBjcGIgaWR4IDB4JXhcbiIsCkBAIC0xNjk3LDcgKzE2OTUsNyBAQAogCQkJCXN0cnVjdCBudl9hZG1hX2NwYiAqY3BiID0gJnBwLT5jcGJbaV07CiAJCQkJaWYgKChhdGFfdGFnX3ZhbGlkKGFwLT5saW5rLmFjdGl2ZV90YWcpICYmIGkgPT0gYXAtPmxpbmsuYWN0aXZlX3RhZykgfHwKIAkJCQkgICAgYXAtPmxpbmsuc2FjdGl2ZSAmICgxIDw8IGkpKQotCQkJCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLAorCQkJCQlhdGFfcG9ydF9lcnIoYXAsCiAJCQkJCQkiQ1BCICVkOiBjdGxfZmxhZ3MgMHgleCwgcmVzcF9mbGFncyAweCV4XG4iLAogCQkJCQkJaSwgY3BiLT5jdGxfZmxhZ3MsIGNwYi0+cmVzcF9mbGFncyk7CiAJCQl9CkBAIC0xNzk5LDIzICsxNzk3LDIyIEBACiAJdTMyIHNhY3RpdmU7CiAJdTMyIGRvbmVfbWFzazsKIAotCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsCi0JCQkiRUggaW4gU1dOQ1EgbW9kZSxRQzpxY19hY3RpdmUgMHglWCBzYWN0aXZlIDB4JVhcbiIsCi0JCQlhcC0+cWNfYWN0aXZlLCBhcC0+bGluay5zYWN0aXZlKTsKLQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLAorCWF0YV9wb3J0X2VycihhcCwgIkVIIGluIFNXTkNRIG1vZGUsUUM6cWNfYWN0aXZlIDB4JVggc2FjdGl2ZSAweCVYXG4iLAorCQkgICAgIGFwLT5xY19hY3RpdmUsIGFwLT5saW5rLnNhY3RpdmUpOworCWF0YV9wb3J0X2VycihhcCwKIAkJIlNXTkNROnFjX2FjdGl2ZSAweCVYIGRlZmVyX2JpdHMgMHglWCBsYXN0X2lzc3VlX3RhZyAweCV4XG4gICIKIAkJImRoZmlzIDB4JVggZG1hZmlzIDB4JVggc2RiZmlzIDB4JVhcbiIsCiAJCXBwLT5xY19hY3RpdmUsIHBwLT5kZWZlcl9xdWV1ZS5kZWZlcl9iaXRzLCBwcC0+bGFzdF9pc3N1ZV90YWcsCiAJCXBwLT5kaGZpc19iaXRzLCBwcC0+ZG1hZmlzX2JpdHMsIHBwLT5zZGJmaXNfYml0cyk7CiAKLQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAiQVRBX1JFRyAweCVYIEVSUl9SRUcgMHglWFxuIiwKLQkJCWFwLT5vcHMtPnNmZl9jaGVja19zdGF0dXMoYXApLAotCQkJaW9yZWFkOChhcC0+aW9hZGRyLmVycm9yX2FkZHIpKTsKKwlhdGFfcG9ydF9lcnIoYXAsICJBVEFfUkVHIDB4JVggRVJSX1JFRyAweCVYXG4iLAorCQkgICAgIGFwLT5vcHMtPnNmZl9jaGVja19zdGF0dXMoYXApLAorCQkgICAgIGlvcmVhZDgoYXAtPmlvYWRkci5lcnJvcl9hZGRyKSk7CiAKIAlzYWN0aXZlID0gcmVhZGwocHAtPnNhY3RpdmVfYmxvY2spOwogCWRvbmVfbWFzayA9IHBwLT5xY19hY3RpdmUgXiBzYWN0aXZlOwogCi0JYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgInRhZyA6IGRoZmlzIGRtYWZpcyBzZGJmaXMgc2FjaXR2ZVxuIik7CisJYXRhX3BvcnRfZXJyKGFwLCAidGFnIDogZGhmaXMgZG1hZmlzIHNkYmZpcyBzYWN0aXZlXG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9RVUVVRTsgaSsrKSB7CiAJCXU4IGVyciA9IDA7CiAJCWlmIChwcC0+cWNfYWN0aXZlICYgKDEgPDwgaSkpCkBAIC0xODI1LDEzICsxODIyLDEzIEBACiAJCWVsc2UKIAkJCWNvbnRpbnVlOwogCi0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsCi0JCQkJInRhZyAweCV4OiAlMDF4ICUwMXggJTAxeCAlMDF4ICVzXG4iLCBpLAotCQkJCShwcC0+ZGhmaXNfYml0cyA+PiBpKSAmIDB4MSwKLQkJCQkocHAtPmRtYWZpc19iaXRzID4+IGkpICYgMHgxLAotCQkJCShwcC0+c2RiZmlzX2JpdHMgPj4gaSkgJiAweDEsCi0JCQkJKHNhY3RpdmUgPj4gaSkgJiAweDEsCi0JCQkJKGVyciA/ICJlcnJvciEgdGFnIGRvZXNuJ3QgZXhpdCIgOiAiICIpKTsKKwkJYXRhX3BvcnRfZXJyKGFwLAorCQkJICAgICAidGFnIDB4JXg6ICUwMXggJTAxeCAlMDF4ICUwMXggJXNcbiIsIGksCisJCQkgICAgIChwcC0+ZGhmaXNfYml0cyA+PiBpKSAmIDB4MSwKKwkJCSAgICAgKHBwLT5kbWFmaXNfYml0cyA+PiBpKSAmIDB4MSwKKwkJCSAgICAgKHBwLT5zZGJmaXNfYml0cyA+PiBpKSAmIDB4MSwKKwkJCSAgICAgKHNhY3RpdmUgPj4gaSkgJiAweDEsCisJCQkgICAgIChlcnIgPyAiZXJyb3IhIHRhZyBkb2Vzbid0IGV4aXQiIDogIiAiKSk7CiAJfQogCiAJbnZfc3duY3FfcHBfcmVpbml0KGFwKTsKQEAgLTE5NTYsOCArMTk1Myw4IEBACiAKIAlpZiAoc3RybmNtcChtb2RlbF9udW0sICJNYXh0b3IiLCA2KSA9PSAwKSB7CiAJCWF0YV9zY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aChzZGV2LCAxLCBTQ1NJX1FERVBUSF9ERUZBVUxUKTsKLQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX05PVElDRSwKLQkJCSJEaXNhYmxpbmcgU1dOQ1EgbW9kZSAoZGVwdGggJXgpXG4iLCBzZGV2LT5xdWV1ZV9kZXB0aCk7CisJCWF0YV9kZXZfbm90aWNlKGRldiwgIkRpc2FibGluZyBTV05DUSBtb2RlIChkZXB0aCAleClcbiIsCisJCQkgICAgICAgc2Rldi0+cXVldWVfZGVwdGgpOwogCX0KIAogCXJldHVybiByYzsKQEAgLTIzNTYsNyArMjM1Myw2IEBACiAKIHN0YXRpYyBpbnQgbnZfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0Jc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyBOVUxMLCBOVUxMIH07CiAJc3RydWN0IG52X3BpX3ByaXYgKmlwcml2OwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKQEAgLTIzNzMsOCArMjM2OSw3IEBACiAJCWlmIChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKSA9PSAwKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmcGRldi0+ZGV2LCBEUlZfVkVSU0lPTik7CiAKIAlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCkBAIC0yMzgyLDEwICsyMzc3LDEwIEBACiAKIAkvKiBkZXRlcm1pbmUgdHlwZSBhbmQgYWxsb2NhdGUgaG9zdCAqLwogCWlmICh0eXBlID09IENLODA0ICYmIGFkbWFfZW5hYmxlZCkgewotCQlkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCAmcGRldi0+ZGV2LCAiVXNpbmcgQURNQSBtb2RlXG4iKTsKKwkJZGV2X25vdGljZSgmcGRldi0+ZGV2LCAiVXNpbmcgQURNQSBtb2RlXG4iKTsKIAkJdHlwZSA9IEFETUE7CiAJfSBlbHNlIGlmICh0eXBlID09IE1DUDV4ICYmIHN3bmNxX2VuYWJsZWQpIHsKLQkJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJnBkZXYtPmRldiwgIlVzaW5nIFNXTkNRIG1vZGVcbiIpOworCQlkZXZfbm90aWNlKCZwZGV2LT5kZXYsICJVc2luZyBTV05DUSBtb2RlXG4iKTsKIAkJdHlwZSA9IFNXTkNROwogCX0KIApAQCAtMjQyOSw3ICsyNDI0LDcgQEAKIAkJbnZfc3duY3FfaG9zdF9pbml0KGhvc3QpOwogCiAJaWYgKG1zaV9lbmFibGVkKSB7Ci0JCWRldl9wcmludGsoS0VSTl9OT1RJQ0UsICZwZGV2LT5kZXYsICJVc2luZyBNU0lcbiIpOworCQlkZXZfbm90aWNlKCZwZGV2LT5kZXYsICJVc2luZyBNU0lcbiIpOwogCQlwY2lfZW5hYmxlX21zaShwZGV2KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcHJvbWlzZS5jIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKaW5kZXggYTAwNGIxZS4uMDAwZmNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKQEAgLTExNzksNyArMTE3OSw2IEBACiBzdGF0aWMgaW50IHBkY19hdGFfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcGkgPSAmcGRjX3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW1BEQ19NQVhfUE9SVFNdOwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKQEAgLTExODcsOCArMTE4Niw3IEBACiAJaW50IG5fcG9ydHMsIGksIHJjOwogCWludCBpc19zYXRhaWlfdHg0OwogCi0JaWYgKCFwcmludGVkX3ZlcnNpb24rKykKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWF0YV9wcmludF92ZXJzaW9uX29uY2UoJnBkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJLyogZW5hYmxlIGFuZCBhY3F1aXJlIHJlc291cmNlcyAqLwogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwpAQCAtMTIxNyw3ICsxMjE1LDcgQEAKIAogCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbygmcGRldi0+ZGV2LCBwcGksIG5fcG9ydHMpOwogCWlmICghaG9zdCkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGhvc3RcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgaG9zdFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlob3N0LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3FzdG9yLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3FzdG9yLmMKaW5kZXggYzU2MDMyNi4uOWQxYTQ3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9xc3Rvci5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfcXN0b3IuYwpAQCAtNTYzLDIxICs1NjMsMjAgQEAKIAkJaWYgKHJjKSB7CiAJCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAkJCWlmIChyYykgewotCQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkJCSAgICI2NC1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkJIjY0LWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCQkJcmV0dXJuIHJjOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKIAkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAocmMpIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkJIjMyLWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIHJjOwogCQl9CiAJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAocmMpIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJIjMyLWJpdCBjb25zaXN0ZW50IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKIAkJCXJldHVybiByYzsKIAkJfQpAQCAtNTg4LDE0ICs1ODcsMTIgQEAKIHN0YXRpYyBpbnQgcXNfYXRhX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0Jc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpIGVudC0+ZHJpdmVyX2RhdGE7CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmcXNfcG9ydF9pbmZvW2JvYXJkX2lkeF0sIE5VTEwgfTsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJaW50IHJjLCBwb3J0X25vOwogCi0JaWYgKCFwcmludGVkX3ZlcnNpb24rKykKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWF0YV9wcmludF92ZXJzaW9uX29uY2UoJnBkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJLyogYWxsb2MgaG9zdCAqLwogCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbygmcGRldi0+ZGV2LCBwcGksIFFTX1BPUlRTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCmluZGV4IGI0MmVkYWFmLi45OGMxZDc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMKQEAgLTY0Myw4ICs2NDMsOCBAQAogCSAgICAoKGFwLT5mbGFncyAmIFNJTF9GTEFHX01PRDE1V1JJVEUpICYmCiAJICAgICAocXVpcmtzICYgU0lMX1FVSVJLX01PRDE1V1JJVEUpKSkgewogCQlpZiAocHJpbnRfaW5mbykKLQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiYXBwbHlpbmcgU2VhZ2F0ZSAiCi0JCQkJICAgICAgICJlcnJhdGEgZml4IChtb2QxNXdyaXRlIHdvcmthcm91bmQpXG4iKTsKKwkJCWF0YV9kZXZfaW5mbyhkZXYsCisJCSJhcHBseWluZyBTZWFnYXRlIGVycmF0YSBmaXggKG1vZDE1d3JpdGUgd29ya2Fyb3VuZClcbiIpOwogCQlkZXYtPm1heF9zZWN0b3JzID0gMTU7CiAJCXJldHVybjsKIAl9CkBAIC02NTIsOCArNjUyLDggQEAKIAkvKiBsaW1pdCB0byB1ZG1hNSAqLwogCWlmIChxdWlya3MgJiBTSUxfUVVJUktfVURNQTVNQVgpIHsKIAkJaWYgKHByaW50X2luZm8pCi0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImFwcGx5aW5nIE1heHRvciAiCi0JCQkJICAgICAgICJlcnJhdGEgZml4ICVzXG4iLCBtb2RlbF9udW0pOworCQkJYXRhX2Rldl9pbmZvKGRldiwgImFwcGx5aW5nIE1heHRvciBlcnJhdGEgZml4ICVzXG4iLAorCQkJCSAgICAgbW9kZWxfbnVtKTsKIAkJZGV2LT51ZG1hX21hc2sgJj0gQVRBX1VETUE1OwogCQlyZXR1cm47CiAJfQpAQCAtNjc2LDggKzY3Niw4IEBACiAJCQl3cml0ZXcoY2xzIDw8IDggfCBjbHMsCiAJCQkgICAgICAgbW1pb19iYXNlICsgc2lsX3BvcnRbaV0uZmlmb19jZmcpOwogCX0gZWxzZQotCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJnBkZXYtPmRldiwKLQkJCSAgICJjYWNoZSBsaW5lIHNpemUgbm90IHNldC4gIERyaXZlciBtYXkgbm90IGZ1bmN0aW9uXG4iKTsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSAiY2FjaGUgbGluZSBzaXplIG5vdCBzZXQuICBEcml2ZXIgbWF5IG5vdCBmdW5jdGlvblxuIik7CiAKIAkvKiBBcHBseSBSX0VSUiBvbiBETUEgYWN0aXZhdGUgRklTIGVycmF0YSB3b3JrYXJvdW5kICovCiAJaWYgKGhvc3QtPnBvcnRzWzBdLT5mbGFncyAmIFNJTF9GTEFHX1JFUlJfT05fRE1BX0FDVCkgewpAQCAtNjg4LDkgKzY4OCw4IEBACiAJCQlpZiAoKHRtcCAmIDB4MykgIT0gMHgwMSkKIAkJCQljb250aW51ZTsKIAkJCWlmICghY250KQotCQkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LAotCQkJCQkgICAiQXBwbHlpbmcgUl9FUlIgb24gRE1BIGFjdGl2YXRlICIKLQkJCQkJICAgIkZJUyBlcnJhdGEgZml4XG4iKTsKKwkJCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJCQkgIkFwcGx5aW5nIFJfRVJSIG9uIERNQSBhY3RpdmF0ZSBGSVMgZXJyYXRhIGZpeFxuIik7CiAJCQl3cml0ZWwodG1wICYgfjB4MywgbW1pb19iYXNlICsgc2lsX3BvcnRbaV0uc2Zpc19jZmcpOwogCQkJY250Kys7CiAJCX0KQEAgLTczMyw3ICs3MzIsNiBAQAogCiBzdGF0aWMgaW50IHNpbF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAlpbnQgYm9hcmRfaWQgPSBlbnQtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpID0gc2lsX3BvcnRfaW5mb1tib2FyZF9pZF07CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmcGksIE5VTEwgfTsKQEAgLTc0Miw4ICs3NDAsNyBAQAogCWludCBuX3BvcnRzLCByYzsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCS8qIGFsbG9jYXRlIGhvc3QgKi8KIAluX3BvcnRzID0gMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYwppbmRleCAwNmM1NjRlLi41NTQ3MGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCkBAIC02OTQsNyArNjk0LDcgQEAKIAlyZXR1cm4gMDsKIAogIGVycjoKLQlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9FUlIsICJzb2Z0cmVzZXQgZmFpbGVkICglcylcbiIsIHJlYXNvbik7CisJYXRhX2xpbmtfZXJyKGxpbmssICJzb2Z0cmVzZXQgZmFpbGVkICglcylcbiIsIHJlYXNvbik7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTcxNCw4ICs3MTQsOCBAQAogCSAqIFRoaXMgaGFwcGVucyBvZnRlbiBhZnRlciBQTSBETUEgQ1MgZXJyYXRhLgogCSAqLwogCWlmIChwcC0+ZG9fcG9ydF9yc3QpIHsKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX1dBUk5JTkcsICJjb250cm9sbGVyIGluIGR1YmlvdXMgIgotCQkJCSJzdGF0ZSwgcGVyZm9ybWluZyBQT1JUX1JTVFxuIik7CisJCWF0YV9wb3J0X3dhcm4oYXAsCisJCQkgICAgICAiY29udHJvbGxlciBpbiBkdWJpb3VzIHN0YXRlLCBwZXJmb3JtaW5nIFBPUlRfUlNUXG4iKTsKIAogCQl3cml0ZWwoUE9SVF9DU19QT1JUX1JTVCwgcG9ydCArIFBPUlRfQ1RSTF9TVEFUKTsKIAkJYXRhX21zbGVlcChhcCwgMTApOwpAQCAtNzczLDcgKzc3Myw3IEBACiAJCWdvdG8gcmV0cnk7CiAJfQogCi0JYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fRVJSLCAiaGFyZHJlc2V0IGZhaWxlZCAoJXMpXG4iLCByZWFzb24pOworCWF0YV9saW5rX2VycihsaW5rLCAiaGFyZHJlc2V0IGZhaWxlZCAoJXMpXG4iLCByZWFzb24pOwogCXJldHVybiAtRUlPOwogfQogCkBAIC05MjUsNyArOTI1LDcgQEAKIAogCWlmIChzYXRhX3BtcF9nc2NyX3ZlbmRvcihnc2NyKSA9PSAweDExYWIgJiYKIAkgICAgc2F0YV9wbXBfZ3Njcl9kZXZpZChnc2NyKSA9PSAweDQxNDApIHsKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sCisJCWF0YV9wb3J0X2luZm8oYXAsCiAJCQkiZGlzYWJsaW5nIE5DUSBzdXBwb3J0IGR1ZSB0byBzaWwyNC1tdjQxNDAgcXVpcmtcbiIpOwogCQlhcC0+ZmxhZ3MgJj0gfkFUQV9GTEFHX05DUTsKIAl9CkBAIC05NDYsOCArOTQ2LDcgQEAKIAogCXJjID0gc2lsMjRfaW5pdF9wb3J0KGxpbmstPmFwKTsKIAlpZiAocmMpIHsKLQkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fRVJSLAotCQkJCSJoYXJkcmVzZXQgZmFpbGVkIChwb3J0IG5vdCByZWFkeSlcbiIpOworCQlhdGFfbGlua19lcnIobGluaywgImhhcmRyZXNldCBmYWlsZWQgKHBvcnQgbm90IHJlYWR5KVxuIik7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTExNDEsOCArMTE0MCw4IEBACiAKIAkvKiBzcHVyaW91cyBpbnRlcnJ1cHRzIGFyZSBleHBlY3RlZCBpZiBQQ0lYX0lSUV9XT0MgKi8KIAlpZiAoIShhcC0+ZmxhZ3MgJiBTSUwyNF9GTEFHX1BDSVhfSVJRX1dPQykgJiYgYXRhX3JhdGVsaW1pdCgpKQotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywgInNwdXJpb3VzIGludGVycnVwdCAiCi0JCQkiKHNsb3Rfc3RhdCAweCV4IGFjdGl2ZV90YWcgJWQgc2FjdGl2ZSAweCV4KVxuIiwKKwkJYXRhX3BvcnRfaW5mbyhhcCwKKwkJCSJzcHVyaW91cyBpbnRlcnJ1cHQgKHNsb3Rfc3RhdCAweCV4IGFjdGl2ZV90YWcgJWQgc2FjdGl2ZSAweCV4KVxuIiwKIAkJCXNsb3Rfc3RhdCwgYXAtPmxpbmsuYWN0aXZlX3RhZywgYXAtPmxpbmsuc2FjdGl2ZSk7CiB9CiAKQEAgLTEyNTYsOCArMTI1NSw4IEBACiAJCQkJCQlQT1JUX0NTX1BPUlRfUlNULAogCQkJCQkJUE9SVF9DU19QT1JUX1JTVCwgMTAsIDEwMCk7CiAJCQlpZiAodG1wICYgUE9SVF9DU19QT1JUX1JTVCkKLQkJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBob3N0LT5kZXYsCi0JCQkJCSAgICJmYWlsZWQgdG8gY2xlYXIgcG9ydCBSU1RcbiIpOworCQkJCWRldl9lcnIoaG9zdC0+ZGV2LAorCQkJCQkiZmFpbGVkIHRvIGNsZWFyIHBvcnQgUlNUXG4iKTsKIAkJfQogCiAJCS8qIGNvbmZpZ3VyZSBwb3J0ICovCkBAIC0xMjcxLDcgKzEyNzAsNiBAQAogc3RhdGljIGludCBzaWwyNF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlleHRlcm4gaW50IF9fTUFSS0VSX19zaWwyNF9jbWRfYmxvY2tfaXNfc2l6ZWRfd3JvbmdseTsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwaSA9IHNpbDI0X3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZwaSwgTlVMTCB9OwogCXZvaWQgX19pb21lbSAqIGNvbnN0ICppb21hcDsKQEAgLTEyODMsOCArMTI4MSw3IEBACiAJaWYgKHNpemVvZih1bmlvbiBzaWwyNF9jbWRfYmxvY2spICE9IFBBR0VfU0laRSkKIAkJX19NQVJLRVJfX3NpbDI0X2NtZF9ibG9ja19pc19zaXplZF93cm9uZ2x5ID0gMTsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCS8qIGFjcXVpcmUgcmVzb3VyY2VzICovCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CkBAIC0xMzAyLDkgKzEyOTksOCBAQAogCWlmIChwaS5mbGFncyAmIFNJTDI0X0ZMQUdfUENJWF9JUlFfV09DKSB7CiAJCXRtcCA9IHJlYWRsKGlvbWFwW1NJTDI0X0hPU1RfQkFSXSArIEhPU1RfQ1RSTCk7CiAJCWlmICh0bXAgJiAoSE9TVF9DVFJMX1RSRFkgfCBIT1NUX0NUUkxfU1RPUCB8IEhPU1RfQ1RSTF9ERVZTRUwpKQotCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCi0JCQkJICAgIkFwcGx5aW5nIGNvbXBsZXRpb24gSVJRIGxvc3Mgb24gUENJLVggIgotCQkJCSAgICJlcnJhdGEgZml4XG4iKTsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkJICJBcHBseWluZyBjb21wbGV0aW9uIElSUSBsb3NzIG9uIFBDSS1YIGVycmF0YSBmaXhcbiIpOwogCQllbHNlCiAJCQlwaS5mbGFncyAmPSB+U0lMMjRfRkxBR19QQ0lYX0lSUV9XT0M7CiAJfQpAQCAtMTMyMiwyMiArMTMxOCwyMSBAQAogCQlpZiAocmMpIHsKIAkJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQkJaWYgKHJjKSB7Ci0JCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCQkJICAgIjY0LWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCQkiNjQtYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gcmM7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewogCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCQkgICAiMzItYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIjMyLWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCQkgICAiMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSIzMi1iaXQgY29uc2lzdGVudCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAl9CkBAIC0xMzUwLDcgKzEzNDUsNyBAQAogCXNpbDI0X2luaXRfY29udHJvbGxlcihob3N0KTsKIAogCWlmIChzYXRhX3NpbDI0X21zaSAmJiAhcGNpX2VuYWJsZV9tc2kocGRldikpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJVc2luZyBNU0lcbiIpOworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiVXNpbmcgTVNJXG4iKTsKIAkJcGNpX2ludHgocGRldiwgMCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaXMuYwppbmRleCBjZGNjMTNlLi40NDdkOWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMKQEAgLTE5Myw3ICsxOTMsNiBAQAogCiBzdGF0aWMgaW50IHNpc19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwaSA9IHNpc19wb3J0X2luZm87CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmcGksICZwaSB9OwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKQEAgLTIwMiw4ICsyMDEsNyBAQAogCXU4IHBvcnQyX3N0YXJ0ID0gMHgyMDsKIAlpbnQgaSwgcmM7CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYykKQEAgLTI0MSwxMiArMjM5LDEyIEBACiAJCQlicmVhazsKIAkJfQogCQlpZiAoKHBtciAmIFNJU19QTVJfQ09NQklORUQpID09IDApIHsKLQkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LAotCQkJCSAgICJEZXRlY3RlZCBTaVMgMTgwLzE4MS85NjQgY2hpcHNldCBpbiBTQVRBIG1vZGVcbiIpOworCQkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCQkgIkRldGVjdGVkIFNpUyAxODAvMTgxLzk2NCBjaGlwc2V0IGluIFNBVEEgbW9kZVxuIik7CiAJCQlwb3J0Ml9zdGFydCA9IDY0OwogCQl9IGVsc2UgewotCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCi0JCQkJICAgIkRldGVjdGVkIFNpUyAxODAvMTgxIGNoaXBzZXQgaW4gY29tYmluZWQgbW9kZVxuIik7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJCSAiRGV0ZWN0ZWQgU2lTIDE4MC8xODEgY2hpcHNldCBpbiBjb21iaW5lZCBtb2RlXG4iKTsKIAkJCXBvcnQyX3N0YXJ0ID0gMDsKIAkJCXBpLmZsYWdzIHw9IEFUQV9GTEFHX1NMQVZFX1BPU1M7CiAJCX0KQEAgLTI1NiwyNCArMjU0LDIyIEBACiAJY2FzZSAweDAxODM6CiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDZDLCAmdmFsKTsKIAkJaWYgKHZhbCAmICgxTCA8PCAzMSkpIHsKLQkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LAotCQkJCSAgICJEZXRlY3RlZCBTaVMgMTgyLzk2NSBjaGlwc2V0XG4iKTsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJEZXRlY3RlZCBTaVMgMTgyLzk2NSBjaGlwc2V0XG4iKTsKIAkJCXBpLmZsYWdzIHw9IEFUQV9GTEFHX1NMQVZFX1BPU1M7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwKLQkJCQkgICAiRGV0ZWN0ZWQgU2lTIDE4Mi85NjVMIGNoaXBzZXRcbiIpOworCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIkRldGVjdGVkIFNpUyAxODIvOTY1TCBjaGlwc2V0XG4iKTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgMHgxMTgyOgotCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwKLQkJCSAgICJEZXRlY3RlZCBTaVMgMTE4Mi85NjYvNjgwIFNBVEEgY29udHJvbGxlclxuIik7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIkRldGVjdGVkIFNpUyAxMTgyLzk2Ni82ODAgU0FUQSBjb250cm9sbGVyXG4iKTsKIAkJcGkuZmxhZ3MgfD0gQVRBX0ZMQUdfU0xBVkVfUE9TUzsKIAkJYnJlYWs7CiAKIAljYXNlIDB4MTE4MzoKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCi0JCQkgICAiRGV0ZWN0ZWQgU2lTIDExODMvOTY2Lzk2NkwvOTY4LzY4MCBjb250cm9sbGVyIGluIFBBVEEgbW9kZVxuIik7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIkRldGVjdGVkIFNpUyAxMTgzLzk2Ni85NjZMLzk2OC82ODAgY29udHJvbGxlciBpbiBQQVRBIG1vZGVcbiIpOwogCQlwcGlbMF0gPSAmc2lzX2luZm8xMzNfZm9yX3NhdGE7CiAJCXBwaVsxXSA9ICZzaXNfaW5mbzEzM19mb3Jfc2F0YTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3N2dy5jIGIvZHJpdmVycy9hdGEvc2F0YV9zdncuYwppbmRleCAzNWVhYmNmLi5jNjQ2MTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3N2dy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc3Z3LmMKQEAgLTQxNCwxNSArNDE0LDEzIEBACiAKIHN0YXRpYyBpbnQgazJfc2F0YV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPQogCQl7ICZrMl9wb3J0X2luZm9bZW50LT5kcml2ZXJfZGF0YV0sIE5VTEwgfTsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7CiAJaW50IG5fcG9ydHMsIGksIHJjLCBiYXJfcG9zOwogCi0JaWYgKCFwcmludGVkX3ZlcnNpb24rKykKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWF0YV9wcmludF92ZXJzaW9uX29uY2UoJnBkZXYtPmRldiwgRFJWX1ZFUlNJT04pOwogCiAJLyogYWxsb2NhdGUgaG9zdCAqLwogCW5fcG9ydHMgPSA0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zeDQuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc3g0LmMKaW5kZXggOGZkM2I3Mi4uY2RhZWJiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zeDQuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3N4NC5jCkBAIC0xNDQwLDE1ICsxNDQwLDEzIEBACiBzdGF0aWMgaW50IHBkY19zYXRhX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9CiAJCXsgJnBkY19wb3J0X2luZm9bZW50LT5kcml2ZXJfZGF0YV0sIE5VTEwgfTsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwcml2OwogCWludCBpLCByYzsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCS8qIGFsbG9jYXRlIGhvc3QgKi8KIAlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oJnBkZXYtPmRldiwgcHBpLCA0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfdWxpLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3VsaS5jCmluZGV4IDIzNWJlNzEuLmI1NGViZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfdWxpLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV91bGkuYwpAQCAtMTQ1LDcgKzE0NSw2IEBACiAKIHN0YXRpYyBpbnQgdWxpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnVsaV9wb3J0X2luZm8sIE5VTEwgfTsKIAl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4ID0gKHVuc2lnbmVkIGludCkgZW50LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CkBAIC0xNTQsOCArMTUzLDcgQEAKIAlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkcjsKIAlpbnQgbl9wb3J0cywgcmM7CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKCZwZGV2LT5kZXYsIERSVl9WRVJTSU9OKTsKIAogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jCmluZGV4IDU0NDM0ZGIuLmY5M2U0M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV92aWEuYwpAQCAtMzYwLDkgKzM2MCw5IEBACiAKIAlvbmxpbmUgPSAoc3N0YXR1cyAmIDB4ZikgPT0gMHgzOwogCi0JYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sCi0JCQkiU0FUQSBsaW5rICVzIDEuNSBHYnBzIChTU3RhdHVzICVYIFNDb250cm9sICVYKVxuIiwKLQkJCW9ubGluZSA/ICJ1cCIgOiAiZG93biIsIHNzdGF0dXMsIHNjb250cm9sKTsKKwlhdGFfcG9ydF9pbmZvKGFwLAorCQkgICAgICAiU0FUQSBsaW5rICVzIDEuNSBHYnBzIChTU3RhdHVzICVYIFNDb250cm9sICVYKVxuIiwKKwkJICAgICAgb25saW5lID8gInVwIiA6ICJkb3duIiwgc3N0YXR1cywgc2NvbnRyb2wpOwogCiAJLyogU1N0YXR1cyBpcyByZWFkIG9uZSBtb3JlIHRpbWUgKi8KIAlzdmlhX3Njcl9yZWFkKGxpbmssIFNDUl9TVEFUVVMsICZzc3RhdHVzKTsKQEAgLTQ2OSw3ICs0NjksNyBAQAogCiAJcmMgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgMSA8PCA1LCBEUlZfTkFNRSk7CiAJaWYgKHJjKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW9tYXAgUENJIEJBUiA1XG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGlvbWFwIFBDSSBCQVIgNVxuIik7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTQ4OCwxNCArNDg4LDE0IEBACiAKIAkqcl9ob3N0ID0gaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgQVJSQVlfU0laRShwcGkpKTsKIAlpZiAoIWhvc3QpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBob3N0XG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGhvc3RcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlyYyA9IHBjaW1faW9tYXBfcmVnaW9ucyhwZGV2LCAweDNmLCBEUlZfTkFNRSk7CiAJaWYgKHJjKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdC9pb21hcCAiCi0JCQkgICAiUENJIEJBUnMgKGVycm5vPSVkKVxuIiwgcmMpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdC9pb21hcCBQQ0kgQkFScyAoZXJybm89JWQpXG4iLAorCQkJcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCWhvc3QtPmlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKQEAgLTUyNiw3ICs1MjYsNyBAQAogCiAJcmMgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgMSA8PCA1LCBEUlZfTkFNRSk7CiAJaWYgKHJjKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW9tYXAgUENJIEJBUiA1XG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGlvbWFwIFBDSSBCQVIgNVxuIik7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTU0MiwxNSArNTQyLDE0IEBACiAJdTggdG1wODsKIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgJnRtcDgpOwotCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LCAicm91dGVkIHRvIGhhcmQgaXJxIGxpbmUgJWRcbiIsCi0JICAgICAgIChpbnQpICh0bXA4ICYgMHhmMCkgPT0gMHhmMCA/IDAgOiB0bXA4ICYgMHgwZik7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgInJvdXRlZCB0byBoYXJkIGlycSBsaW5lICVkXG4iLAorCQkgKGludCkgKHRtcDggJiAweGYwKSA9PSAweGYwID8gMCA6IHRtcDggJiAweDBmKTsKIAogCS8qIG1ha2Ugc3VyZSBTQVRBIGNoYW5uZWxzIGFyZSBlbmFibGVkICovCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgU0FUQV9DSEFOX0VOQUIsICZ0bXA4KTsKIAlpZiAoKHRtcDggJiBBTExfUE9SVFMpICE9IEFMTF9QT1JUUykgewotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCi0JCQkgICAiZW5hYmxpbmcgU0FUQSBjaGFubmVscyAoMHgleClcbiIsCi0JCQkgICAoaW50KSB0bXA4KTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZW5hYmxpbmcgU0FUQSBjaGFubmVscyAoMHgleClcbiIsCisJCQkoaW50KXRtcDgpOwogCQl0bXA4IHw9IEFMTF9QT1JUUzsKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFNBVEFfQ0hBTl9FTkFCLCB0bXA4KTsKIAl9CkBAIC01NTgsOSArNTU3LDggQEAKIAkvKiBtYWtlIHN1cmUgaW50ZXJydXB0cyBmb3IgZWFjaCBjaGFubmVsIHNlbnQgdG8gdXMgKi8KIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTQVRBX0lOVF9HQVRFLCAmdG1wOCk7CiAJaWYgKCh0bXA4ICYgQUxMX1BPUlRTKSAhPSBBTExfUE9SVFMpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LAotCQkJICAgImVuYWJsaW5nIFNBVEEgY2hhbm5lbCBpbnRlcnJ1cHRzICgweCV4KVxuIiwKLQkJCSAgIChpbnQpIHRtcDgpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJlbmFibGluZyBTQVRBIGNoYW5uZWwgaW50ZXJydXB0cyAoMHgleClcbiIsCisJCQkoaW50KSB0bXA4KTsKIAkJdG1wOCB8PSBBTExfUE9SVFM7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBTQVRBX0lOVF9HQVRFLCB0bXA4KTsKIAl9CkBAIC01NjgsOSArNTY2LDkgQEAKIAkvKiBtYWtlIHN1cmUgbmF0aXZlIG1vZGUgaXMgZW5hYmxlZCAqLwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNBVEFfTkFUSVZFX01PREUsICZ0bXA4KTsKIAlpZiAoKHRtcDggJiBOQVRJVkVfTU9ERV9BTEwpICE9IE5BVElWRV9NT0RFX0FMTCkgewotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCi0JCQkgICAiZW5hYmxpbmcgU0FUQSBjaGFubmVsIG5hdGl2ZSBtb2RlICgweCV4KVxuIiwKLQkJCSAgIChpbnQpIHRtcDgpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsCisJCQkiZW5hYmxpbmcgU0FUQSBjaGFubmVsIG5hdGl2ZSBtb2RlICgweCV4KVxuIiwKKwkJCShpbnQpIHRtcDgpOwogCQl0bXA4IHw9IE5BVElWRV9NT0RFX0FMTDsKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFNBVEFfTkFUSVZFX01PREUsIHRtcDgpOwogCX0KQEAgLTYwNiwxNSArNjA0LDEzIEBACiAKIHN0YXRpYyBpbnQgc3ZpYV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcmM7CiAJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gTlVMTDsKIAlpbnQgYm9hcmRfaWQgPSAoaW50KSBlbnQtPmRyaXZlcl9kYXRhOwogCWNvbnN0IHVuc2lnbmVkICpiYXJfc2l6ZXM7CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmcGRldi0+ZGV2LCBEUlZfVkVSU0lPTik7CiAKIAlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCkBAIC02MjgsNyArNjI0LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdmlhX2Jhcl9zaXplcyk7IGkrKykKIAkJaWYgKChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSkgPT0gMCkgfHwKIAkJICAgIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpIDwgYmFyX3NpemVzW2ldKSkgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCQkiaW52YWxpZCBQQ0kgQkFSICV1IChzeiAweCVsbHgsIHZhbCAweCVsbHgpXG4iLAogCQkJCWksCiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jIGIvZHJpdmVycy9hdGEvc2F0YV92c2MuYwppbmRleCA3Yzk4NzM3Li42MTM1YTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfdnNjLmMKQEAgLTI3Myw5ICsyNzMsOCBAQAogCiAJaWYgKHVubGlrZWx5KHN0YXR1cyA9PSAweGZmZmZmZmZmIHx8IHN0YXR1cyA9PSAwKSkgewogCQlpZiAoc3RhdHVzKQotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgaG9zdC0+ZGV2LAotCQkJCSI6IElSUSBzdGF0dXMgPT0gMHhmZmZmZmZmZiwgIgotCQkJCSJQQ0kgZmF1bHQgb3IgZGV2aWNlIHJlbW92YWw/XG4iKTsKKwkJCWRldl9lcnIoaG9zdC0+ZGV2LAorCQkJCSI6IElSUSBzdGF0dXMgPT0gMHhmZmZmZmZmZiwgUENJIGZhdWx0IG9yIGRldmljZSByZW1vdmFsP1xuIik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzQ3LDE0ICszNDYsMTIgQEAKIAkJLnBvcnRfb3BzCT0gJnZzY19zYXRhX29wcywKIAl9OwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnBpLCBOVUxMIH07Ci0Jc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJc3RydWN0IGF0YV9ob3N0ICpob3N0OwogCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOwogCWludCBpLCByYzsKIAl1OCBjbHM7CiAKLQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisJYXRhX3ByaW50X3ZlcnNpb25fb25jZSgmcGRldi0+ZGV2LCBEUlZfVkVSU0lPTik7CiAKIAkvKiBhbGxvY2F0ZSBob3N0ICovCiAJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMgYi9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMKaW5kZXggYTVmY2IxZS4uYmIzYjAxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jCisrKyBiL2RyaXZlcnMvYXRtL2FtYmFzc2Fkb3IuYwpAQCAtODEzLDcgKzgxMyw3IEBACiAgIHJldHVybjsKIH0KIAotLy8gdG9wIHVwIGFsbCBSWCBwb29scyAoY2FuIGFsc28gYmUgY2FsbGVkIGFzIGEgYm90dG9tIGhhbGYpCisvLyB0b3AgdXAgYWxsIFJYIHBvb2xzCiBzdGF0aWMgdm9pZCBmaWxsX3J4X3Bvb2xzIChhbWJfZGV2ICogZGV2KSB7CiAgIHVuc2lnbmVkIGNoYXIgcG9vbDsKICAgCkBAIC04NzIsMTEgKzg3Miw3IEBACiAgICAgICArK2lycV93b3JrOwogICAKICAgICBpZiAoaXJxX3dvcmspIHsKLSNpZmRlZiBGSUxMX1JYX1BPT0xTX0lOX0JICi0gICAgICBzY2hlZHVsZV93b3JrICgmZGV2LT5iaCk7Ci0jZWxzZQogICAgICAgZmlsbF9yeF9wb29scyAoZGV2KTsKLSNlbmRpZgogCiAgICAgICBQUklOVEQgKERCR19JUlEsICJ3b3JrIGRvbmU6ICV1IiwgaXJxX3dvcmspOwogICAgIH0gZWxzZSB7CkBAIC0yMTU0LDExICsyMTUwLDYgQEAKICAgICAgIGRldi0+dHhfYXZhaWwgPSBBVE1fT0MzX1BDUjsKICAgICAgIGRldi0+cnhfYXZhaWwgPSBBVE1fT0MzX1BDUjsKICAgICAgIAotI2lmZGVmIEZJTExfUlhfUE9PTFNfSU5fQkgKLSAgICAgIC8vIGluaXRpYWxpc2UgYm90dG9tIGhhbGYKLSAgICAgIElOSVRfV09SSygmZGV2LT5iaCwgKHZvaWQgKCopKHZvaWQgKikpIGZpbGxfcnhfcG9vbHMsIGRldik7Ci0jZW5kaWYKLSAgICAgIAogICAgICAgLy8gc2VtYXBob3JlIGZvciB0eGVyL3J4ZXIgbW9kaWZpY2F0aW9ucyAtIHdlIGNhbm5vdCB1c2UgYQogICAgICAgLy8gc3BpbmxvY2sgYXMgdGhlIGNyaXRpY2FsIHJlZ2lvbiBuZWVkcyB0byBzd2l0Y2ggcHJvY2Vzc2VzCiAgICAgICBtdXRleF9pbml0KCZkZXYtPnZjY19zZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmggYi9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmgKaW5kZXggYmQxYzQ2YS4uYWE5NzEwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5oCisrKyBiL2RyaXZlcnMvYXRtL2FtYmFzc2Fkb3IuaApAQCAtNjMwLDEwICs2MzAsNiBAQAogICB1MzIgICAgICAgICAgICAgIGlvYmFzZTsKICAgdTMyICogICAgICAgICAgICBtZW1iYXNlOwogCi0jaWZkZWYgRklMTF9SWF9QT09MU19JTl9CSAotICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgYmg7Ci0jZW5kaWYKLSAgCiAgIGFtYl9jcSAgICAgICAgICAgY3E7CiAgIGFtYl90eHEgICAgICAgICAgdHhxOwogICBhbWJfcnhxICAgICAgICAgIHJ4cVtOVU1fUlhfUE9PTFNdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZW5pLmggYi9kcml2ZXJzL2F0bS9lbmkuaAppbmRleCBlNGM5NTI1Li40OTNhNjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9lbmkuaAorKysgYi9kcml2ZXJzL2F0bS9lbmkuaApAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NvbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jIGIvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jCmluZGV4IGVmN2E2NTguLjdjN2I1NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2ZpcmVzdHJlYW0uYworKysgYi9kcml2ZXJzL2F0bS9maXJlc3RyZWFtLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4gLyogZm9yIHJlcXVlc3RfcmVnaW9uICovCiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9ob3Jpem9uLmMgYi9kcml2ZXJzL2F0bS9ob3Jpem9uLmMKaW5kZXggZDU4ZTNmYy4uMjg3NTA2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaG9yaXpvbi5jCisrKyBiL2RyaXZlcnMvYXRtL2hvcml6b24uYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9pZHQ3NzI1Mi5jIGIvZHJpdmVycy9hdG0vaWR0NzcyNTIuYwppbmRleCAxZjhkNzI0Li5iZTBkYmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9pZHQ3NzI1Mi5jCisrKyBiL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdG0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaXBoYXNlLmMgYi9kcml2ZXJzL2F0bS9pcGhhc2UuYwppbmRleCBkZWU0ZjAxLi45NTcxMDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9pcGhhc2UuYworKysgYi9kcml2ZXJzL2F0bS9pcGhhc2UuYwpAQCAtNTMsNiArNTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+ICAKICNpbmNsdWRlIDxsaW51eC91aW8uaD4gIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4gIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPiAgCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9sYW5haS5jIGIvZHJpdmVycy9hdG0vbGFuYWkuYwppbmRleCA0ZThiYTU2Li5lODI4YzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9sYW5haS5jCisrKyBiL2RyaXZlcnMvYXRtL2xhbmFpLmMKQEAgLTE5NDcsNyArMTk0Nyw2IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaSA9IGxhbmFpLT5wY2k7CiAJaW50IHJlc3VsdDsKLQl1MTYgdzsKIAogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERFVl9MQUJFTCAiKGl0ZiAlZCk6IGNhbid0IGVuYWJsZSAiCkBAIC0xOTY1LDEzICsxOTY0LDcgQEAKIAkJICAgICIoaXRmICVkKTogTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIsIGxhbmFpLT5udW1iZXIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KLQlyZXN1bHQgPSBwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fSUQsICZ3KTsKLQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgewotCQlwcmludGsoS0VSTl9FUlIgREVWX0xBQkVMICIoaXRmICVkKTogY2FuJ3QgcmVhZCAiCi0JCSAgICAiUENJX1NVQlNZU1RFTV9JRDogJWRcbiIsIGxhbmFpLT5udW1iZXIsIHJlc3VsdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXN1bHQgPSBjaGVja19ib2FyZF9pZF9hbmRfcmV2KCJQQ0kiLCB3LCBOVUxMKTsKKwlyZXN1bHQgPSBjaGVja19ib2FyZF9pZF9hbmRfcmV2KCJQQ0kiLCBwY2ktPnN1YnN5c3RlbV9kZXZpY2UsIE5VTEwpOwogCWlmIChyZXN1bHQgIT0gMCkKIAkJcmV0dXJuIHJlc3VsdDsKIAkvKiBTZXQgbGF0ZW5jeSB0aW1lciB0byB6ZXJvIGFzIHBlciBsYW5haSBkb2NzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS96YXRtLmMgYi9kcml2ZXJzL2F0bS96YXRtLmMKaW5kZXggNjI0OTE3OS4uN2Y4YzUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vemF0bS5jCisrKyBiL2RyaXZlcnMvYXRtL3phdG0uYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvYXRtX3phdG0uaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvS2NvbmZpZyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCmluZGV4IGQ1N2U4ZDAuLjIxY2Y0NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCkBAIC0xNiw2ICsxNiwxMSBAQAogCSAgdGhhdCBpdCBjcmVhdGVzIGEgaGlnaCBzeXN0ZW0gbG9hZCwgb3Igb24gc21hbGxlciBzeXN0ZW1zCiAJICBpdCBpcyBrbm93biB0byBjcmVhdGUgb3V0LW9mLW1lbW9yeSBzaXR1YXRpb25zIGR1cmluZyBib290dXAuCiAKKwkgIFRvIGRpc2FibGUgdXNlciBzcGFjZSBoZWxwZXIgcHJvZ3JhbSBleGVjdXRpb24gYXQgZWFybHkgYm9vdAorCSAgdGltZSBzcGVjaWZ5IGFuIGVtcHR5IHN0cmluZyBoZXJlLiBUaGlzIHNldHRpbmcgY2FuIGJlIGFsdGVyZWQKKwkgIHZpYSAvcHJvYy9zeXMva2VybmVsL2hvdHBsdWcgb3IgdmlhIC9zeXMva2VybmVsL3VldmVudF9oZWxwZXIKKwkgIGxhdGVyIGF0IHJ1bnRpbWUuCisKIGNvbmZpZyBERVZUTVBGUwogCWJvb2wgIk1haW50YWluIGEgZGV2dG1wZnMgZmlsZXN5c3RlbSB0byBtb3VudCBhdCAvZGV2IgogCWRlcGVuZHMgb24gSE9UUExVRwpAQCAtNjUsMTcgKzcwLDE3IEBACiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU2F5IHllcyB0byBhdm9pZCBidWlsZGluZyBmaXJtd2FyZS4gRmlybXdhcmUgaXMgdXN1YWxseSBzaGlwcGVkCi0JICB3aXRoIHRoZSBkcml2ZXIsIGFuZCBvbmx5IHdoZW4gdXBkYXRpbmcgdGhlIGZpcm13YXJlIGEgcmVidWlsZAotCSAgc2hvdWxkIGJlIG1hZGUuCi0JICBJZiB1bnN1cmUgc2F5IFkgaGVyZS4KKwkgIHdpdGggdGhlIGRyaXZlciBhbmQgb25seSB3aGVuIHVwZGF0aW5nIHRoZSBmaXJtd2FyZSBzaG91bGQgYQorCSAgcmVidWlsZCBiZSBtYWRlLgorCSAgSWYgdW5zdXJlLCBzYXkgWSBoZXJlLgogCiBjb25maWcgRldfTE9BREVSCiAJdHJpc3RhdGUgIlVzZXJzcGFjZSBmaXJtd2FyZSBsb2FkaW5nIHN1cHBvcnQiIGlmIEVYUEVSVAogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGlzIHByb3ZpZGVkIGZvciB0aGUgY2FzZSB3aGVyZSBubyBpbi1rZXJuZWwtdHJlZSBtb2R1bGVzCi0JICByZXF1aXJlIHVzZXJzcGFjZSBmaXJtd2FyZSBsb2FkaW5nIHN1cHBvcnQsIGJ1dCBhIG1vZHVsZSBidWlsdCBvdXRzaWRlCi0JICB0aGUga2VybmVsIHRyZWUgZG9lcy4KKwkgIFRoaXMgb3B0aW9uIGlzIHByb3ZpZGVkIGZvciB0aGUgY2FzZSB3aGVyZSBub25lIG9mIHRoZSBpbi10cmVlIG1vZHVsZXMKKwkgIHJlcXVpcmUgdXNlcnNwYWNlIGZpcm13YXJlIGxvYWRpbmcgc3VwcG9ydCwgYnV0IGEgbW9kdWxlIGJ1aWx0CisJICBvdXQtb2YtdHJlZSBkb2VzLgogCiBjb25maWcgRklSTVdBUkVfSU5fS0VSTkVMCiAJYm9vbCAiSW5jbHVkZSBpbi1rZXJuZWwgZmlybXdhcmUgYmxvYnMgaW4ga2VybmVsIGJpbmFyeSIKQEAgLTgzLDIyICs4OCwyMiBAQAogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoZSBrZXJuZWwgc291cmNlIHRyZWUgaW5jbHVkZXMgYSBudW1iZXIgb2YgZmlybXdhcmUgJ2Jsb2JzJwotCSAgd2hpY2ggYXJlIHVzZWQgYnkgdmFyaW91cyBkcml2ZXJzLiBUaGUgcmVjb21tZW5kZWQgd2F5IHRvCi0JICB1c2UgdGhlc2UgaXMgdG8gcnVuICJtYWtlIGZpcm13YXJlX2luc3RhbGwiIGFuZCB0byBjb3B5IHRoZQotCSAgcmVzdWx0aW5nIGJpbmFyeSBmaWxlcyBjcmVhdGVkIGluIHVzci9saWIvZmlybXdhcmUgZGlyZWN0b3J5Ci0JICBvZiB0aGUga2VybmVsIHRyZWUgdG8gdGhlIC9saWIvZmlybXdhcmUgb24geW91ciBzeXN0ZW0gc28KKwkgIHRoYXQgYXJlIHVzZWQgYnkgdmFyaW91cyBkcml2ZXJzLiBUaGUgcmVjb21tZW5kZWQgd2F5IHRvCisJICB1c2UgdGhlc2UgaXMgdG8gcnVuICJtYWtlIGZpcm13YXJlX2luc3RhbGwiLCB3aGljaCwgYWZ0ZXIKKwkgIGNvbnZlcnRpbmcgaWhleCBmaWxlcyB0byBiaW5hcnksIGNvcGllcyBhbGwgb2YgdGhlIG5lZWRlZAorCSAgYmluYXJ5IGZpbGVzIGluIGZpcm13YXJlLyB0byAvbGliL2Zpcm13YXJlLyBvbiB5b3VyIHN5c3RlbSBzbwogCSAgdGhhdCB0aGV5IGNhbiBiZSBsb2FkZWQgYnkgdXNlcnNwYWNlIGhlbHBlcnMgb24gcmVxdWVzdC4KIAogCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBidWlsZCBlYWNoIHJlcXVpcmVkIGZpcm13YXJlIGJsb2IKIAkgIGludG8gdGhlIGtlcm5lbCBkaXJlY3RseSwgd2hlcmUgcmVxdWVzdF9maXJtd2FyZSgpIHdpbGwgZmluZAogCSAgdGhlbSB3aXRob3V0IGhhdmluZyB0byBjYWxsIG91dCB0byB1c2Vyc3BhY2UuIFRoaXMgbWF5IGJlCi0JICB1c2VmdWwgaWYgeW91ciByb290IGZpbGUgc3lzdGVtIHJlcXVpcmVzIGEgZGV2aWNlIHdoaWNoIHVzZXMKLQkgIHN1Y2ggZmlybXdhcmUsIGFuZCBkbyBub3Qgd2lzaCB0byB1c2UgYW4gaW5pdHJkLgorCSAgdXNlZnVsIGlmIHlvdXIgcm9vdCBmaWxlIHN5c3RlbSByZXF1aXJlcyBhIGRldmljZSB0aGF0IHVzZXMKKwkgIHN1Y2ggZmlybXdhcmUgYW5kIGRvIG5vdCB3aXNoIHRvIHVzZSBhbiBpbml0cmQuCiAKIAkgIFRoaXMgc2luZ2xlIG9wdGlvbiBjb250cm9scyB0aGUgaW5jbHVzaW9uIG9mIGZpcm13YXJlIGZvcgotCSAgZXZlcnkgZHJpdmVyIHdoaWNoIHVzZXMgcmVxdWVzdF9maXJtd2FyZSgpIGFuZCBzaGlwcyBpdHMKLQkgIGZpcm13YXJlIGluIHRoZSBrZXJuZWwgc291cmNlIHRyZWUsIHRvIGF2b2lkIGEgcHJvbGlmZXJhdGlvbgotCSAgb2YgJ0luY2x1ZGUgZmlybXdhcmUgZm9yIHh4eCBkZXZpY2UnIG9wdGlvbnMuCisJICBldmVyeSBkcml2ZXIgdGhhdCB1c2VzIHJlcXVlc3RfZmlybXdhcmUoKSBhbmQgc2hpcHMgaXRzCisJICBmaXJtd2FyZSBpbiB0aGUga2VybmVsIHNvdXJjZSB0cmVlLCB3aGljaCBhdm9pZHMgYQorCSAgcHJvbGlmZXJhdGlvbiBvZiAnSW5jbHVkZSBmaXJtd2FyZSBmb3IgeHh4IGRldmljZScgb3B0aW9ucy4KIAogCSAgU2F5ICdOJyBhbmQgbGV0IGZpcm13YXJlIGJlIGxvYWRlZCBmcm9tIHVzZXJzcGFjZS4KIApAQCAtMTA2LDI3ICsxMTEsMjcgQEAKIAlzdHJpbmcgIkV4dGVybmFsIGZpcm13YXJlIGJsb2JzIHRvIGJ1aWxkIGludG8gdGhlIGtlcm5lbCBiaW5hcnkiCiAJZGVwZW5kcyBvbiBGV19MT0FERVIKIAloZWxwCi0JICBUaGlzIG9wdGlvbiBhbGxvd3MgZmlybXdhcmUgdG8gYmUgYnVpbHQgaW50byB0aGUga2VybmVsLCBmb3IgdGhlCi0JICBjYXNlcyB3aGVyZSB0aGUgdXNlciBlaXRoZXIgY2Fubm90IG9yIGRvZXNuJ3Qgd2FudCB0byBwcm92aWRlIGl0IGZyb20KKwkgIFRoaXMgb3B0aW9uIGFsbG93cyBmaXJtd2FyZSB0byBiZSBidWlsdCBpbnRvIHRoZSBrZXJuZWwgZm9yIHRoZSBjYXNlCisJICB3aGVyZSB0aGUgdXNlciBlaXRoZXIgY2Fubm90IG9yIGRvZXNuJ3Qgd2FudCB0byBwcm92aWRlIGl0IGZyb20KIAkgIHVzZXJzcGFjZSBhdCBydW50aW1lIChmb3IgZXhhbXBsZSwgd2hlbiB0aGUgZmlybXdhcmUgaW4gcXVlc3Rpb24gaXMKIAkgIHJlcXVpcmVkIGZvciBhY2Nlc3NpbmcgdGhlIGJvb3QgZGV2aWNlLCBhbmQgdGhlIHVzZXIgZG9lc24ndCB3YW50IHRvCiAJICB1c2UgYW4gaW5pdHJkKS4KIAotCSAgVGhpcyBvcHRpb24gaXMgYSBzdHJpbmcsIGFuZCB0YWtlcyB0aGUgKHNwYWNlLXNlcGFyYXRlZCkgbmFtZXMgb2YgdGhlCi0JICBmaXJtd2FyZSBmaWxlcyAtLSB0aGUgc2FtZSBuYW1lcyB3aGljaCBhcHBlYXIgaW4gTU9EVUxFX0ZJUk1XQVJFKCkKKwkgIFRoaXMgb3B0aW9uIGlzIGEgc3RyaW5nIGFuZCB0YWtlcyB0aGUgKHNwYWNlLXNlcGFyYXRlZCkgbmFtZXMgb2YgdGhlCisJICBmaXJtd2FyZSBmaWxlcyAtLSB0aGUgc2FtZSBuYW1lcyB0aGF0IGFwcGVhciBpbiBNT0RVTEVfRklSTVdBUkUoKQogCSAgYW5kIHJlcXVlc3RfZmlybXdhcmUoKSBpbiB0aGUgc291cmNlLiBUaGVzZSBmaWxlcyBzaG91bGQgZXhpc3QgdW5kZXIKIAkgIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSBFWFRSQV9GSVJNV0FSRV9ESVIgb3B0aW9uLCB3aGljaCBpcwotCSAgYnkgZGVmYXVsdCB0aGUgZmlybXdhcmUvIHN1YmRpcmVjdG9yeSBvZiB0aGUga2VybmVsIHNvdXJjZSB0cmVlLgorCSAgYnkgZGVmYXVsdCB0aGUgZmlybXdhcmUgc3ViZGlyZWN0b3J5IG9mIHRoZSBrZXJuZWwgc291cmNlIHRyZWUuCiAKLQkgIFNvLCBmb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHNldCBDT05GSUdfRVhUUkFfRklSTVdBUkU9InVzYjgzODguYmluIiwKLQkgIGNvcHkgdGhlIHVzYjgzODguYmluIGZpbGUgaW50byB0aGUgZmlybXdhcmUvIGRpcmVjdG9yeSwgYW5kIGJ1aWxkIHRoZQotCSAga2VybmVsLiBUaGVuIGFueSByZXF1ZXN0X2Zpcm13YXJlKCJ1c2I4Mzg4LmJpbiIpIHdpbGwgYmUKLQkgIHNhdGlzZmllZCBpbnRlcm5hbGx5IHdpdGhvdXQgbmVlZGluZyB0byBjYWxsIG91dCB0byB1c2Vyc3BhY2UuCisJICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHNldCBDT05GSUdfRVhUUkFfRklSTVdBUkU9InVzYjgzODguYmluIiwgY29weQorCSAgdGhlIHVzYjgzODguYmluIGZpbGUgaW50byB0aGUgZmlybXdhcmUgZGlyZWN0b3J5LCBhbmQgYnVpbGQgdGhlIGtlcm5lbC4KKwkgIFRoZW4gYW55IHJlcXVlc3RfZmlybXdhcmUoInVzYjgzODguYmluIikgd2lsbCBiZSBzYXRpc2ZpZWQgaW50ZXJuYWxseQorCSAgd2l0aG91dCBuZWVkaW5nIHRvIGNhbGwgb3V0IHRvIHVzZXJzcGFjZS4KIAogCSAgV0FSTklORzogSWYgeW91IGluY2x1ZGUgYWRkaXRpb25hbCBmaXJtd2FyZSBmaWxlcyBpbnRvIHlvdXIgYmluYXJ5Ci0JICBrZXJuZWwgaW1hZ2Ugd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwsCisJICBrZXJuZWwgaW1hZ2UgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCwKIAkgIHRoZW4gaXQgbWF5IGJlIGEgdmlvbGF0aW9uIG9mIHRoZSBHUEwgdG8gZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nCi0JICBpbWFnZSAtLSBzaW5jZSBpdCBjb21iaW5lcyBib3RoIEdQTCBhbmQgbm9uLUdQTCB3b3JrLiBZb3Ugc2hvdWxkCisJICBpbWFnZSBzaW5jZSBpdCBjb21iaW5lcyBib3RoIEdQTCBhbmQgbm9uLUdQTCB3b3JrLiBZb3Ugc2hvdWxkCiAJICBjb25zdWx0IGEgbGF3eWVyIG9mIHlvdXIgb3duIGJlZm9yZSBkaXN0cmlidXRpbmcgc3VjaCBhbiBpbWFnZS4KIAogY29uZmlnIEVYVFJBX0ZJUk1XQVJFX0RJUgpAQCAtMTM2LDEwICsxNDEsOSBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGNvbnRyb2xzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0KIAkgIGxvb2tzIGZvciB0aGUgZmlybXdhcmUgZmlsZXMgbGlzdGVkIGluIHRoZSBFWFRSQV9GSVJNV0FSRSBvcHRpb24uCi0JICBUaGUgZGVmYXVsdCBpcyB0aGUgZmlybXdhcmUvIGRpcmVjdG9yeSBpbiB0aGUga2VybmVsIHNvdXJjZSB0cmVlLAotCSAgYnV0IGJ5IGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBjYW4gcG9pbnQgaXQgZWxzZXdoZXJlLCBzdWNoIGFzCi0JICB0aGUgL2xpYi9maXJtd2FyZS8gZGlyZWN0b3J5IG9yIGFub3RoZXIgc2VwYXJhdGUgZGlyZWN0b3J5Ci0JICBjb250YWluaW5nIGZpcm13YXJlIGZpbGVzLgorCSAgVGhlIGRlZmF1bHQgaXMgZmlybXdhcmUvIGluIHRoZSBrZXJuZWwgc291cmNlIHRyZWUsIGJ1dCBieSBjaGFuZ2luZworCSAgdGhpcyBvcHRpb24geW91IGNhbiBwb2ludCBpdCBlbHNld2hlcmUsIHN1Y2ggYXMgL2xpYi9maXJtd2FyZS8gb3IKKwkgIHNvbWUgb3RoZXIgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpcm13YXJlIGZpbGVzLgogCiBjb25maWcgREVCVUdfRFJJVkVSCiAJYm9vbCAiRHJpdmVyIENvcmUgdmVyYm9zZSBkZWJ1ZyBtZXNzYWdlcyIKQEAgLTE2OCw0ICsxNzIsNiBAQAogCWJvb2wKIAlkZWZhdWx0IG4KIAorc291cmNlICJkcml2ZXJzL2Jhc2UvcmVnbWFwL0tjb25maWciCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9NYWtlZmlsZSBiL2RyaXZlcnMvYmFzZS9NYWtlZmlsZQppbmRleCA0YzU3MDFjLi45OWEzNzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9iYXNlL01ha2VmaWxlCkBAIC0xMywxMSArMTMsMTEgQEAKIG9iai0kKENPTkZJR19OVU1BKQkrPSBub2RlLm8KIG9iai0kKENPTkZJR19NRU1PUllfSE9UUExVR19TUEFSU0UpICs9IG1lbW9yeS5vCiBvYmotJChDT05GSUdfU01QKQkrPSB0b3BvbG9neS5vCi1vYmotJChDT05GSUdfSU9NTVVfQVBJKSArPSBpb21tdS5vCiBpZmVxICgkKENPTkZJR19TWVNGUykseSkKIG9iai0kKENPTkZJR19NT0RVTEVTKQkrPSBtb2R1bGUubwogZW5kaWYKIG9iai0kKENPTkZJR19TWVNfSFlQRVJWSVNPUikgKz0gaHlwZXJ2aXNvci5vCitvYmotJChDT05GSUdfUkVHTUFQKQkrPSByZWdtYXAvCiAKIGNjZmxhZ3MtJChDT05GSUdfREVCVUdfRFJJVkVSKSA6PSAtRERFQlVHCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZXZ0bXBmcy5jIGIvZHJpdmVycy9iYXNlL2RldnRtcGZzLmMKaW5kZXggODJiYmI1OS4uYjg5ZmZmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RldnRtcGZzLmMKKysrIGIvZHJpdmVycy9iYXNlL2RldnRtcGZzLmMKQEAgLTIxLDEyICsyMSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KICNpbmNsdWRlIDxsaW51eC9yYW1mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NyZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmRldl9tbnQ7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICp0aHJlYWQ7CiAKICNpZiBkZWZpbmVkIENPTkZJR19ERVZUTVBGU19NT1VOVAogc3RhdGljIGludCBtb3VudF9kZXYgPSAxOwpAQCAtMzQsNyArMzMsMTYgQEAKIHN0YXRpYyBpbnQgbW91bnRfZGV2OwogI2VuZGlmCiAKLXN0YXRpYyBERUZJTkVfTVVURVgoZGlybG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJlcV9sb2NrKTsKKworc3RhdGljIHN0cnVjdCByZXEgeworCXN0cnVjdCByZXEgKm5leHQ7CisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKKwlpbnQgZXJyOworCWNvbnN0IGNoYXIgKm5hbWU7CisJbW9kZV90IG1vZGU7CS8qIDAgPT4gZGVsZXRlICovCisJc3RydWN0IGRldmljZSAqZGV2OworfSAqcmVxdWVzdHM7CiAKIHN0YXRpYyBpbnQgX19pbml0IG1vdW50X3BhcmFtKGNoYXIgKnN0cikKIHsKQEAgLTY4LDEzMSArNzYsMTUyIEBACiBzdGF0aWMgaW5saW5lIGludCBpc19ibG9ja2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCitpbnQgZGV2dG1wZnNfY3JlYXRlX25vZGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IGNoYXIgKnRtcCA9IE5VTEw7CisJc3RydWN0IHJlcSByZXE7CisKKwlpZiAoIXRocmVhZCkKKwkJcmV0dXJuIDA7CisKKwlyZXEubW9kZSA9IDA7CisJcmVxLm5hbWUgPSBkZXZpY2VfZ2V0X2Rldm5vZGUoZGV2LCAmcmVxLm1vZGUsICZ0bXApOworCWlmICghcmVxLm5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHJlcS5tb2RlID09IDApCisJCXJlcS5tb2RlID0gMDYwMDsKKwlpZiAoaXNfYmxvY2tkZXYoZGV2KSkKKwkJcmVxLm1vZGUgfD0gU19JRkJMSzsKKwllbHNlCisJCXJlcS5tb2RlIHw9IFNfSUZDSFI7CisKKwlyZXEuZGV2ID0gZGV2OworCisJaW5pdF9jb21wbGV0aW9uKCZyZXEuZG9uZSk7CisKKwlzcGluX2xvY2soJnJlcV9sb2NrKTsKKwlyZXEubmV4dCA9IHJlcXVlc3RzOworCXJlcXVlc3RzID0gJnJlcTsKKwlzcGluX3VubG9jaygmcmVxX2xvY2spOworCisJd2FrZV91cF9wcm9jZXNzKHRocmVhZCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmcmVxLmRvbmUpOworCisJa2ZyZWUodG1wKTsKKworCXJldHVybiByZXEuZXJyOworfQorCitpbnQgZGV2dG1wZnNfZGVsZXRlX25vZGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IGNoYXIgKnRtcCA9IE5VTEw7CisJc3RydWN0IHJlcSByZXE7CisKKwlpZiAoIXRocmVhZCkKKwkJcmV0dXJuIDA7CisKKwlyZXEubmFtZSA9IGRldmljZV9nZXRfZGV2bm9kZShkZXYsIE5VTEwsICZ0bXApOworCWlmICghcmVxLm5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxLm1vZGUgPSAwOworCXJlcS5kZXYgPSBkZXY7CisKKwlpbml0X2NvbXBsZXRpb24oJnJlcS5kb25lKTsKKworCXNwaW5fbG9jaygmcmVxX2xvY2spOworCXJlcS5uZXh0ID0gcmVxdWVzdHM7CisJcmVxdWVzdHMgPSAmcmVxOworCXNwaW5fdW5sb2NrKCZyZXFfbG9jayk7CisKKwl3YWtlX3VwX3Byb2Nlc3ModGhyZWFkKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZyZXEuZG9uZSk7CisKKwlrZnJlZSh0bXApOworCXJldHVybiByZXEuZXJyOworfQorCiBzdGF0aWMgaW50IGRldl9ta2Rpcihjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSkKIHsKLQlzdHJ1Y3QgbmFtZWlkYXRhIG5kOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgcGF0aCBwYXRoOwogCWludCBlcnI7CiAKLQllcnIgPSB2ZnNfcGF0aF9sb29rdXAoZGV2X21udC0+bW50X3Jvb3QsIGRldl9tbnQsCi0JCQkgICAgICBuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJZGVudHJ5ID0ga2Vybl9wYXRoX2NyZWF0ZShBVF9GRENXRCwgbmFtZSwgJnBhdGgsIDEpOworCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGVudHJ5KTsKIAotCWRlbnRyeSA9IGxvb2t1cF9jcmVhdGUoJm5kLCAxKTsKLQlpZiAoIUlTX0VSUihkZW50cnkpKSB7Ci0JCWVyciA9IHZmc19ta2RpcihuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5LCBtb2RlKTsKLQkJaWYgKCFlcnIpCi0JCQkvKiBtYXJrIGFzIGtlcm5lbC1jcmVhdGVkIGlub2RlICovCi0JCQlkZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0ZSA9ICZkZXZfbW50OwotCQlkcHV0KGRlbnRyeSk7Ci0JfSBlbHNlIHsKLQkJZXJyID0gUFRSX0VSUihkZW50cnkpOwotCX0KLQotCW11dGV4X3VubG9jaygmbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwotCXBhdGhfcHV0KCZuZC5wYXRoKTsKKwllcnIgPSB2ZnNfbWtkaXIocGF0aC5kZW50cnktPmRfaW5vZGUsIGRlbnRyeSwgbW9kZSk7CisJaWYgKCFlcnIpCisJCS8qIG1hcmsgYXMga2VybmVsLWNyZWF0ZWQgaW5vZGUgKi8KKwkJZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGUgPSAmdGhyZWFkOworCWRwdXQoZGVudHJ5KTsKKwltdXRleF91bmxvY2soJnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwlwYXRoX3B1dCgmcGF0aCk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBjcmVhdGVfcGF0aChjb25zdCBjaGFyICpub2RlcGF0aCkKIHsKKwljaGFyICpwYXRoOworCWNoYXIgKnM7CiAJaW50IGVycjsKIAotCW11dGV4X2xvY2soJmRpcmxvY2spOwotCWVyciA9IGRldl9ta2Rpcihub2RlcGF0aCwgMDc1NSk7Ci0JaWYgKGVyciA9PSAtRU5PRU5UKSB7Ci0JCWNoYXIgKnBhdGg7Ci0JCWNoYXIgKnM7CisJLyogcGFyZW50IGRpcmVjdG9yaWVzIGRvIG5vdCBleGlzdCwgY3JlYXRlIHRoZW0gKi8KKwlwYXRoID0ga3N0cmR1cChub2RlcGF0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCQkvKiBwYXJlbnQgZGlyZWN0b3JpZXMgZG8gbm90IGV4aXN0LCBjcmVhdGUgdGhlbSAqLwotCQlwYXRoID0ga3N0cmR1cChub2RlcGF0aCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGF0aCkgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXMgPSBwYXRoOwotCQlmb3IgKDs7KSB7Ci0JCQlzID0gc3RyY2hyKHMsICcvJyk7Ci0JCQlpZiAoIXMpCi0JCQkJYnJlYWs7Ci0JCQlzWzBdID0gJ1wwJzsKLQkJCWVyciA9IGRldl9ta2RpcihwYXRoLCAwNzU1KTsKLQkJCWlmIChlcnIgJiYgZXJyICE9IC1FRVhJU1QpCi0JCQkJYnJlYWs7Ci0JCQlzWzBdID0gJy8nOwotCQkJcysrOwotCQl9Ci0JCWtmcmVlKHBhdGgpOworCXMgPSBwYXRoOworCWZvciAoOzspIHsKKwkJcyA9IHN0cmNocihzLCAnLycpOworCQlpZiAoIXMpCisJCQlicmVhazsKKwkJc1swXSA9ICdcMCc7CisJCWVyciA9IGRldl9ta2RpcihwYXRoLCAwNzU1KTsKKwkJaWYgKGVyciAmJiBlcnIgIT0gLUVFWElTVCkKKwkJCWJyZWFrOworCQlzWzBdID0gJy8nOworCQlzKys7CiAJfQotb3V0OgotCW11dGV4X3VubG9jaygmZGlybG9jayk7CisJa2ZyZWUocGF0aCk7CiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGRldnRtcGZzX2NyZWF0ZV9ub2RlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaGFuZGxlX2NyZWF0ZShjb25zdCBjaGFyICpub2RlbmFtZSwgbW9kZV90IG1vZGUsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQljb25zdCBjaGFyICp0bXAgPSBOVUxMOwotCWNvbnN0IGNoYXIgKm5vZGVuYW1lOwotCWNvbnN0IHN0cnVjdCBjcmVkICpjdXJyX2NyZWQ7Ci0JbW9kZV90IG1vZGUgPSAwOwotCXN0cnVjdCBuYW1laWRhdGEgbmQ7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycjsKIAotCWlmICghZGV2X21udCkKLQkJcmV0dXJuIDA7Ci0KLQlub2RlbmFtZSA9IGRldmljZV9nZXRfZGV2bm9kZShkZXYsICZtb2RlLCAmdG1wKTsKLQlpZiAoIW5vZGVuYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChtb2RlID09IDApCi0JCW1vZGUgPSAwNjAwOwotCWlmIChpc19ibG9ja2RldihkZXYpKQotCQltb2RlIHw9IFNfSUZCTEs7Ci0JZWxzZQotCQltb2RlIHw9IFNfSUZDSFI7Ci0KLQljdXJyX2NyZWQgPSBvdmVycmlkZV9jcmVkcygmaW5pdF9jcmVkKTsKLQotCWVyciA9IHZmc19wYXRoX2xvb2t1cChkZXZfbW50LT5tbnRfcm9vdCwgZGV2X21udCwKLQkJCSAgICAgIG5vZGVuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOwotCWlmIChlcnIgPT0gLUVOT0VOVCkgeworCWRlbnRyeSA9IGtlcm5fcGF0aF9jcmVhdGUoQVRfRkRDV0QsIG5vZGVuYW1lLCAmcGF0aCwgMCk7CisJaWYgKGRlbnRyeSA9PSBFUlJfUFRSKC1FTk9FTlQpKSB7CiAJCWNyZWF0ZV9wYXRoKG5vZGVuYW1lKTsKLQkJZXJyID0gdmZzX3BhdGhfbG9va3VwKGRldl9tbnQtPm1udF9yb290LCBkZXZfbW50LAotCQkJCSAgICAgIG5vZGVuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOworCQlkZW50cnkgPSBrZXJuX3BhdGhfY3JlYXRlKEFUX0ZEQ1dELCBub2RlbmFtZSwgJnBhdGgsIDApOwogCX0KLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGRlbnRyeSk7CiAKLQlkZW50cnkgPSBsb29rdXBfY3JlYXRlKCZuZCwgMCk7Ci0JaWYgKCFJU19FUlIoZGVudHJ5KSkgewotCQllcnIgPSB2ZnNfbWtub2QobmQucGF0aC5kZW50cnktPmRfaW5vZGUsCi0JCQkJZGVudHJ5LCBtb2RlLCBkZXYtPmRldnQpOwotCQlpZiAoIWVycikgewotCQkJc3RydWN0IGlhdHRyIG5ld2F0dHJzOworCWVyciA9IHZmc19ta25vZChwYXRoLmRlbnRyeS0+ZF9pbm9kZSwKKwkJCWRlbnRyeSwgbW9kZSwgZGV2LT5kZXZ0KTsKKwlpZiAoIWVycikgeworCQlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CiAKLQkJCS8qIGZpeHVwIHBvc3NpYmx5IHVtYXNrZWQgbW9kZSAqLwotCQkJbmV3YXR0cnMuaWFfbW9kZSA9IG1vZGU7Ci0JCQluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfTU9ERTsKLQkJCW11dGV4X2xvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JCQlub3RpZnlfY2hhbmdlKGRlbnRyeSwgJm5ld2F0dHJzKTsKLQkJCW11dGV4X3VubG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwkJLyogZml4dXAgcG9zc2libHkgdW1hc2tlZCBtb2RlICovCisJCW5ld2F0dHJzLmlhX21vZGUgPSBtb2RlOworCQluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfTU9ERTsKKwkJbXV0ZXhfbG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwkJbm90aWZ5X2NoYW5nZShkZW50cnksICZuZXdhdHRycyk7CisJCW11dGV4X3VubG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAotCQkJLyogbWFyayBhcyBrZXJuZWwtY3JlYXRlZCBpbm9kZSAqLwotCQkJZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGUgPSAmZGV2X21udDsKLQkJfQotCQlkcHV0KGRlbnRyeSk7Ci0JfSBlbHNlIHsKLQkJZXJyID0gUFRSX0VSUihkZW50cnkpOworCQkvKiBtYXJrIGFzIGtlcm5lbC1jcmVhdGVkIGlub2RlICovCisJCWRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlID0gJnRocmVhZDsKIAl9CisJZHB1dChkZW50cnkpOwogCi0JbXV0ZXhfdW5sb2NrKCZuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JcGF0aF9wdXQoJm5kLnBhdGgpOwotb3V0OgotCWtmcmVlKHRtcCk7Ci0JcmV2ZXJ0X2NyZWRzKGN1cnJfY3JlZCk7CisJbXV0ZXhfdW5sb2NrKCZwYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJcGF0aF9wdXQoJnBhdGgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTIwMiw4ICsyMzEsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlpbnQgZXJyOwogCi0JZXJyID0gdmZzX3BhdGhfbG9va3VwKGRldl9tbnQtPm1udF9yb290LCBkZXZfbW50LAotCQkJICAgICAgbmFtZSwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwllcnIgPSBrZXJuX3BhdGhfcGFyZW50KG5hbWUsICZuZCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjExLDcgKzIzOSw3IEBACiAJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmQubGFzdC5uYW1lLCBuZC5wYXRoLmRlbnRyeSwgbmQubGFzdC5sZW4pOwogCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKIAkJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgewotCQkJaWYgKGRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlID09ICZkZXZfbW50KQorCQkJaWYgKGRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlID09ICZ0aHJlYWQpCiAJCQkJZXJyID0gdmZzX3JtZGlyKG5kLnBhdGguZGVudHJ5LT5kX2lub2RlLAogCQkJCQkJZGVudHJ5KTsKIAkJCWVsc2UKQEAgLTIzOCw3ICsyNjYsNiBAQAogCWlmICghcGF0aCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltdXRleF9sb2NrKCZkaXJsb2NrKTsKIAlmb3IgKDs7KSB7CiAJCWNoYXIgKmJhc2U7CiAKQEAgLTI1MCw3ICsyNzcsNiBAQAogCQlpZiAoZXJyKQogCQkJYnJlYWs7CiAJfQotCW11dGV4X3VubG9jaygmZGlybG9jayk7CiAKIAlrZnJlZShwYXRoKTsKIAlyZXR1cm4gZXJyOwpAQCAtMjU5LDcgKzI4NSw3IEBACiBzdGF0aWMgaW50IGRldl9teW5vZGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCiB7CiAJLyogZGlkIHdlIGNyZWF0ZSBpdCAqLwotCWlmIChpbm9kZS0+aV9wcml2YXRlICE9ICZkZXZfbW50KQorCWlmIChpbm9kZS0+aV9wcml2YXRlICE9ICZ0aHJlYWQpCiAJCXJldHVybiAwOwogCiAJLyogZG9lcyB0aGUgZGV2X3QgbWF0Y2ggKi8KQEAgLTI3NywyOSArMzAzLDE3IEBACiAJcmV0dXJuIDE7CiB9CiAKLWludCBkZXZ0bXBmc19kZWxldGVfbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGhhbmRsZV9yZW1vdmUoY29uc3QgY2hhciAqbm9kZW5hbWUsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQljb25zdCBjaGFyICp0bXAgPSBOVUxMOwotCWNvbnN0IGNoYXIgKm5vZGVuYW1lOwotCWNvbnN0IHN0cnVjdCBjcmVkICpjdXJyX2NyZWQ7CiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGRlbGV0ZWQgPSAxOwogCWludCBlcnI7CiAKLQlpZiAoIWRldl9tbnQpCi0JCXJldHVybiAwOwotCi0Jbm9kZW5hbWUgPSBkZXZpY2VfZ2V0X2Rldm5vZGUoZGV2LCBOVUxMLCAmdG1wKTsKLQlpZiAoIW5vZGVuYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWN1cnJfY3JlZCA9IG92ZXJyaWRlX2NyZWRzKCZpbml0X2NyZWQpOwotCWVyciA9IHZmc19wYXRoX2xvb2t1cChkZXZfbW50LT5tbnRfcm9vdCwgZGV2X21udCwKLQkJCSAgICAgIG5vZGVuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOworCWVyciA9IGtlcm5fcGF0aF9wYXJlbnQobm9kZW5hbWUsICZuZCk7CiAJaWYgKGVycikKLQkJZ290byBvdXQ7CisJCXJldHVybiBlcnI7CiAKIAltdXRleF9sb2NrX25lc3RlZCgmbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfUEFSRU5UKTsKIAlkZW50cnkgPSBsb29rdXBfb25lX2xlbihuZC5sYXN0Lm5hbWUsIG5kLnBhdGguZGVudHJ5LCBuZC5sYXN0Lmxlbik7CkBAIC0zMzcsOSArMzUxLDYgQEAKIAlwYXRoX3B1dCgmbmQucGF0aCk7CiAJaWYgKGRlbGV0ZWQgJiYgc3RyY2hyKG5vZGVuYW1lLCAnLycpKQogCQlkZWxldGVfcGF0aChub2RlbmFtZSk7Ci1vdXQ6Ci0Ja2ZyZWUodG1wKTsKLQlyZXZlcnRfY3JlZHMoY3Vycl9jcmVkKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zNTQsNyArMzY1LDcgQEAKIAlpZiAoIW1vdW50X2RldikKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIWRldl9tbnQpCisJaWYgKCF0aHJlYWQpCiAJCXJldHVybiAwOwogCiAJZXJyID0gc3lzX21vdW50KCJkZXZ0bXBmcyIsIChjaGFyICopbW50ZGlyLCAiZGV2dG1wZnMiLCBNU19TSUxFTlQsIE5VTEwpOwpAQCAtMzY1LDMxICszNzYsODAgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgX19pbml0ZGF0YSBERUNMQVJFX0NPTVBMRVRJT04oc2V0dXBfZG9uZSk7CisKK3N0YXRpYyBpbnQgaGFuZGxlKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKG1vZGUpCisJCXJldHVybiBoYW5kbGVfY3JlYXRlKG5hbWUsIG1vZGUsIGRldik7CisJZWxzZQorCQlyZXR1cm4gaGFuZGxlX3JlbW92ZShuYW1lLCBkZXYpOworfQorCitzdGF0aWMgaW50IGRldnRtcGZzZCh2b2lkICpwKQoreworCWNoYXIgb3B0aW9uc1tdID0gIm1vZGU9MDc1NSI7CisJaW50ICplcnIgPSBwOworCSplcnIgPSBzeXNfdW5zaGFyZShDTE9ORV9ORVdOUyk7CisJaWYgKCplcnIpCisJCWdvdG8gb3V0OworCSplcnIgPSBzeXNfbW91bnQoImRldnRtcGZzIiwgIi8iLCAiZGV2dG1wZnMiLCBNU19TSUxFTlQsIG9wdGlvbnMpOworCWlmICgqZXJyKQorCQlnb3RvIG91dDsKKwlzeXNfY2hkaXIoIi8uLiIpOyAvKiB3aWxsIHRyYXZlcnNlIGludG8gb3Zlcm1vdW50ZWQgcm9vdCAqLworCXN5c19jaHJvb3QoIi4iKTsKKwljb21wbGV0ZSgmc2V0dXBfZG9uZSk7CisJd2hpbGUgKDEpIHsKKwkJc3Bpbl9sb2NrKCZyZXFfbG9jayk7CisJCXdoaWxlIChyZXF1ZXN0cykgeworCQkJc3RydWN0IHJlcSAqcmVxID0gcmVxdWVzdHM7CisJCQlyZXF1ZXN0cyA9IE5VTEw7CisJCQlzcGluX3VubG9jaygmcmVxX2xvY2spOworCQkJd2hpbGUgKHJlcSkgeworCQkJCXN0cnVjdCByZXEgKm5leHQgPSByZXEtPm5leHQ7CisJCQkJcmVxLT5lcnIgPSBoYW5kbGUocmVxLT5uYW1lLCByZXEtPm1vZGUsIHJlcS0+ZGV2KTsKKwkJCQljb21wbGV0ZSgmcmVxLT5kb25lKTsKKwkJCQlyZXEgPSBuZXh0OworCQkJfQorCQkJc3Bpbl9sb2NrKCZyZXFfbG9jayk7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2soJnJlcV9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKwlyZXR1cm4gMDsKK291dDoKKwljb21wbGV0ZSgmc2V0dXBfZG9uZSk7CisJcmV0dXJuICplcnI7Cit9CisKIC8qCiAgKiBDcmVhdGUgZGV2dG1wZnMgaW5zdGFuY2UsIGRyaXZlci1jb3JlIGRldmljZXMgd2lsbCBhZGQgdGhlaXIgZGV2aWNlCiAgKiBub2RlcyBoZXJlLgogICovCiBpbnQgX19pbml0IGRldnRtcGZzX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyOwotCXN0cnVjdCB2ZnNtb3VudCAqbW50OwotCWNoYXIgb3B0aW9uc1tdID0gIm1vZGU9MDc1NSI7Ci0KLQllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZkZXZfZnNfdHlwZSk7CisJaW50IGVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmRldl9mc190eXBlKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZGV2dG1wZnM6IHVuYWJsZSB0byByZWdpc3RlciBkZXZ0bXBmcyAiCiAJCSAgICAgICAidHlwZSAlaVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQltbnQgPSBrZXJuX21vdW50X2RhdGEoJmRldl9mc190eXBlLCBvcHRpb25zKTsKLQlpZiAoSVNfRVJSKG1udCkpIHsKLQkJZXJyID0gUFRSX0VSUihtbnQpOworCXRocmVhZCA9IGt0aHJlYWRfcnVuKGRldnRtcGZzZCwgJmVyciwgImtkZXZ0bXBmcyIpOworCWlmICghSVNfRVJSKHRocmVhZCkpIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmc2V0dXBfZG9uZSk7CisJfSBlbHNlIHsKKwkJZXJyID0gUFRSX0VSUih0aHJlYWQpOworCQl0aHJlYWQgPSBOVUxMOworCX0KKworCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJkZXZ0bXBmczogdW5hYmxlIHRvIGNyZWF0ZSBkZXZ0bXBmcyAlaVxuIiwgZXJyKTsKIAkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZkZXZfZnNfdHlwZSk7CiAJCXJldHVybiBlcnI7CiAJfQotCWRldl9tbnQgPSBtbnQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJkZXZ0bXBmczogaW5pdGlhbGl6ZWRcbiIpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL21lbW9yeS5jIGIvZHJpdmVycy9iYXNlL21lbW9yeS5jCmluZGV4IDlmOWIyMzUuLjQ1ZDdjOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuYworKysgYi9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKQEAgLTMwLDcgKzMwLDYgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgobWVtX3N5c2ZzX211dGV4KTsKIAogI2RlZmluZSBNRU1PUllfQ0xBU1NfTkFNRQkibWVtb3J5IgotI2RlZmluZSBNSU5fTUVNT1JZX0JMT0NLX1NJWkUJKDEgPDwgU0VDVElPTl9TSVpFX0JJVFMpCiAKIHN0YXRpYyBpbnQgc2VjdGlvbnNfcGVyX2Jsb2NrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCmluZGV4IDFjMjkxYWYuLjBjYWQ5YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC0zMiw2ICszMiwyNSBAQAogRVhQT1JUX1NZTUJPTF9HUEwocGxhdGZvcm1fYnVzKTsKIAogLyoqCisgKiBhcmNoX3NldHVwX3BkZXZfYXJjaGRhdGEgLSBBbGxvdyBtYW5pcHVsYXRpb24gb2YgYXJjaGRhdGEgYmVmb3JlIGl0cyB1c2VkCisgKiBAZGV2OiBwbGF0Zm9ybSBkZXZpY2UKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgcGxhdGZvcm1fZGV2aWNlX2FkZCgpIHN1Y2ggdGhhdCBhbnkgcGRldl9hcmNoZGF0YSBtYXkKKyAqIGJlIHNldHVwIGJlZm9yZSB0aGUgcGxhdGZvcm1fbm90aWZpZXIgaXMgY2FsbGVkLiAgU28gaWYgYSB1c2VyIG5lZWRzIHRvCisgKiBtYW5pcHVsYXRlIGFueSByZWxldmFudCBpbmZvcm1hdGlvbiBpbiB0aGUgcGRldl9hcmNoZGF0YSB0aGV5IGNhbiBkbzoKKyAqCisgKiAJcGxhdGZvcm1fZGV2aWNfYWxsb2MoKQorICogCS4uLiBtYW5pcHVsYXRlIC4uLgorICogCXBsYXRmb3JtX2RldmljZV9hZGQoKQorICoKKyAqIEFuZCBpZiB0aGV5IGRvbid0IGNhcmUgdGhleSBjYW4ganVzdCBjYWxsIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigpIGFuZAorICogZXZlcnl0aGluZyB3aWxsIGp1c3Qgd29yayBvdXQuCisgKi8KK3ZvaWQgX193ZWFrIGFyY2hfc2V0dXBfcGRldl9hcmNoZGF0YShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworfQorCisvKioKICAqIHBsYXRmb3JtX2dldF9yZXNvdXJjZSAtIGdldCBhIHJlc291cmNlIGZvciBhIGRldmljZQogICogQGRldjogcGxhdGZvcm0gZGV2aWNlCiAgKiBAdHlwZTogcmVzb3VyY2UgdHlwZQpAQCAtMTczLDYgKzE5Miw3IEBACiAJCXBhLT5wZGV2LmlkID0gaWQ7CiAJCWRldmljZV9pbml0aWFsaXplKCZwYS0+cGRldi5kZXYpOwogCQlwYS0+cGRldi5kZXYucmVsZWFzZSA9IHBsYXRmb3JtX2RldmljZV9yZWxlYXNlOworCQlhcmNoX3NldHVwX3BkZXZfYXJjaGRhdGEoJnBhLT5wZGV2KTsKIAl9CiAKIAlyZXR1cm4gcGEgPyAmcGEtPnBkZXYgOiBOVUxMOwpAQCAtMzM0LDYgKzM1NCw3IEBACiBpbnQgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJZGV2aWNlX2luaXRpYWxpemUoJnBkZXYtPmRldik7CisJYXJjaF9zZXR1cF9wZGV2X2FyY2hkYXRhKHBkZXYpOwogCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKTsKQEAgLTM2Nyw3ICszODgsNyBAQAogICoKICAqIFJldHVybnMgJnN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcG9pbnRlciBvbiBzdWNjZXNzLCBvciBFUlJfUFRSKCkgb24gZXJyb3IuCiAgKi8KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdF9vcl9tb2R1bGUgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3Jlc25kYXRhKAorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3Jlc25kYXRhKAogCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCiAJCWNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCwKIAkJY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGludCBudW0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvTWFrZWZpbGUKaW5kZXggMzY0N2UxMS4uMjYzOWFlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9NYWtlZmlsZQpAQCAtMyw2ICszLDcgQEAKIG9iai0kKENPTkZJR19QTV9SVU5USU1FKQkrPSBydW50aW1lLm8KIG9iai0kKENPTkZJR19QTV9UUkFDRV9SVEMpCSs9IHRyYWNlLm8KIG9iai0kKENPTkZJR19QTV9PUFApCSs9IG9wcC5vCitvYmotJChDT05GSUdfUE1fR0VORVJJQ19ET01BSU5TKQkrPSAgZG9tYWluLm8KIG9iai0kKENPTkZJR19IQVZFX0NMSykJKz0gY2xvY2tfb3BzLm8KIAogY2NmbGFncy0kKENPTkZJR19ERUJVR19EUklWRVIpIDo9IC1EREVCVUcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvY2xvY2tfb3BzLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvY2xvY2tfb3BzLmMKaW5kZXggYzBkZDA5ZC4uYTg0NmIyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL2Nsb2NrX29wcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9jbG9ja19vcHMuYwpAQCAtMTUsOSArMTUsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAotI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCisjaWZkZWYgQ09ORklHX1BNCiAKLXN0cnVjdCBwbV9ydW50aW1lX2Nsa19kYXRhIHsKK3N0cnVjdCBwbV9jbGtfZGF0YSB7CiAJc3RydWN0IGxpc3RfaGVhZCBjbG9ja19saXN0OwogCXN0cnVjdCBtdXRleCBsb2NrOwogfTsKQEAgLTM2LDI1ICszNiwyNSBAQAogCWVudW0gcGNlX3N0YXR1cyBzdGF0dXM7CiB9OwogCi1zdGF0aWMgc3RydWN0IHBtX3J1bnRpbWVfY2xrX2RhdGEgKl9fdG9fcHJkKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3QgcG1fY2xrX2RhdGEgKl9fdG9fcGNkKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gZGV2ID8gZGV2LT5wb3dlci5zdWJzeXNfZGF0YSA6IE5VTEw7CiB9CiAKIC8qKgotICogcG1fcnVudGltZV9jbGtfYWRkIC0gU3RhcnQgdXNpbmcgYSBkZXZpY2UgY2xvY2sgZm9yIHJ1bnRpbWUgUE0uCi0gKiBAZGV2OiBEZXZpY2Ugd2hvc2UgY2xvY2sgaXMgZ29pbmcgdG8gYmUgdXNlZCBmb3IgcnVudGltZSBQTS4KKyAqIHBtX2Nsa19hZGQgLSBTdGFydCB1c2luZyBhIGRldmljZSBjbG9jayBmb3IgcG93ZXIgbWFuYWdlbWVudC4KKyAqIEBkZXY6IERldmljZSB3aG9zZSBjbG9jayBpcyBnb2luZyB0byBiZSB1c2VkIGZvciBwb3dlciBtYW5hZ2VtZW50LgogICogQGNvbl9pZDogQ29ubmVjdGlvbiBJRCBvZiB0aGUgY2xvY2suCiAgKgogICogQWRkIHRoZSBjbG9jayByZXByZXNlbnRlZCBieSBAY29uX2lkIHRvIHRoZSBsaXN0IG9mIGNsb2NrcyB1c2VkIGZvcgotICogdGhlIHJ1bnRpbWUgUE0gb2YgQGRldi4KKyAqIHRoZSBwb3dlciBtYW5hZ2VtZW50IG9mIEBkZXYuCiAgKi8KLWludCBwbV9ydW50aW1lX2Nsa19hZGQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpCitpbnQgcG1fY2xrX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNvbl9pZCkKIHsKLQlzdHJ1Y3QgcG1fcnVudGltZV9jbGtfZGF0YSAqcHJkID0gX190b19wcmQoZGV2KTsKKwlzdHJ1Y3QgcG1fY2xrX2RhdGEgKnBjZCA9IF9fdG9fcGNkKGRldik7CiAJc3RydWN0IHBtX2Nsb2NrX2VudHJ5ICpjZTsKIAotCWlmICghcHJkKQorCWlmICghcGNkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNlID0ga3phbGxvYyhzaXplb2YoKmNlKSwgR0ZQX0tFUk5FTCk7CkBAIC03MywyMCArNzMsMjAgQEAKIAkJfQogCX0KIAotCW11dGV4X2xvY2soJnByZC0+bG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmY2UtPm5vZGUsICZwcmQtPmNsb2NrX2xpc3QpOwotCW11dGV4X3VubG9jaygmcHJkLT5sb2NrKTsKKwltdXRleF9sb2NrKCZwY2QtPmxvY2spOworCWxpc3RfYWRkX3RhaWwoJmNlLT5ub2RlLCAmcGNkLT5jbG9ja19saXN0KTsKKwltdXRleF91bmxvY2soJnBjZC0+bG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogX19wbV9ydW50aW1lX2Nsa19yZW1vdmUgLSBEZXN0cm95IHJ1bnRpbWUgUE0gY2xvY2sgZW50cnkuCi0gKiBAY2U6IFJ1bnRpbWUgUE0gY2xvY2sgZW50cnkgdG8gZGVzdHJveS4KKyAqIF9fcG1fY2xrX3JlbW92ZSAtIERlc3Ryb3kgUE0gY2xvY2sgZW50cnkuCisgKiBAY2U6IFBNIGNsb2NrIGVudHJ5IHRvIGRlc3Ryb3kuCiAgKgotICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIHVuZGVyIHRoZSBtdXRleCBwcm90ZWN0aW5nIHRoZSBydW50aW1lIFBNIGxpc3QKLSAqIG9mIGNsb2NrcyBjb3JyZXNwb25kaW5nIHRoZSB0aGUgQGNlJ3MgZGV2aWNlLgorICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIHVuZGVyIHRoZSBtdXRleCBwcm90ZWN0aW5nIHRoZSBQTSBsaXN0IG9mIGNsb2NrcworICogY29ycmVzcG9uZGluZyB0aGUgdGhlIEBjZSdzIGRldmljZS4KICAqLwotc3RhdGljIHZvaWQgX19wbV9ydW50aW1lX2Nsa19yZW1vdmUoc3RydWN0IHBtX2Nsb2NrX2VudHJ5ICpjZSkKK3N0YXRpYyB2b2lkIF9fcG1fY2xrX3JlbW92ZShzdHJ1Y3QgcG1fY2xvY2tfZW50cnkgKmNlKQogewogCWlmICghY2UpCiAJCXJldHVybjsKQEAgLTEwOCw5NSArMTA4LDk5IEBACiB9CiAKIC8qKgotICogcG1fcnVudGltZV9jbGtfcmVtb3ZlIC0gU3RvcCB1c2luZyBhIGRldmljZSBjbG9jayBmb3IgcnVudGltZSBQTS4KLSAqIEBkZXY6IERldmljZSB3aG9zZSBjbG9jayBzaG91bGQgbm90IGJlIHVzZWQgZm9yIHJ1bnRpbWUgUE0gYW55IG1vcmUuCisgKiBwbV9jbGtfcmVtb3ZlIC0gU3RvcCB1c2luZyBhIGRldmljZSBjbG9jayBmb3IgcG93ZXIgbWFuYWdlbWVudC4KKyAqIEBkZXY6IERldmljZSB3aG9zZSBjbG9jayBzaG91bGQgbm90IGJlIHVzZWQgZm9yIFBNIGFueSBtb3JlLgogICogQGNvbl9pZDogQ29ubmVjdGlvbiBJRCBvZiB0aGUgY2xvY2suCiAgKgogICogUmVtb3ZlIHRoZSBjbG9jayByZXByZXNlbnRlZCBieSBAY29uX2lkIGZyb20gdGhlIGxpc3Qgb2YgY2xvY2tzIHVzZWQgZm9yCi0gKiB0aGUgcnVudGltZSBQTSBvZiBAZGV2LgorICogdGhlIHBvd2VyIG1hbmFnZW1lbnQgb2YgQGRldi4KICAqLwotdm9pZCBwbV9ydW50aW1lX2Nsa19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpCit2b2lkIHBtX2Nsa19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpCiB7Ci0Jc3RydWN0IHBtX3J1bnRpbWVfY2xrX2RhdGEgKnByZCA9IF9fdG9fcHJkKGRldik7CisJc3RydWN0IHBtX2Nsa19kYXRhICpwY2QgPSBfX3RvX3BjZChkZXYpOwogCXN0cnVjdCBwbV9jbG9ja19lbnRyeSAqY2U7CiAKLQlpZiAoIXByZCkKKwlpZiAoIXBjZCkKIAkJcmV0dXJuOwogCi0JbXV0ZXhfbG9jaygmcHJkLT5sb2NrKTsKKwltdXRleF9sb2NrKCZwY2QtPmxvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjZSwgJnByZC0+Y2xvY2tfbGlzdCwgbm9kZSkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2UsICZwY2QtPmNsb2NrX2xpc3QsIG5vZGUpIHsKIAkJaWYgKCFjb25faWQgJiYgIWNlLT5jb25faWQpIHsKLQkJCV9fcG1fcnVudGltZV9jbGtfcmVtb3ZlKGNlKTsKKwkJCV9fcG1fY2xrX3JlbW92ZShjZSk7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmICghY29uX2lkIHx8ICFjZS0+Y29uX2lkKSB7CiAJCQljb250aW51ZTsKIAkJfSBlbHNlIGlmICghc3RyY21wKGNvbl9pZCwgY2UtPmNvbl9pZCkpIHsKLQkJCV9fcG1fcnVudGltZV9jbGtfcmVtb3ZlKGNlKTsKKwkJCV9fcG1fY2xrX3JlbW92ZShjZSk7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCW11dGV4X3VubG9jaygmcHJkLT5sb2NrKTsKKwltdXRleF91bmxvY2soJnBjZC0+bG9jayk7CiB9CiAKIC8qKgotICogcG1fcnVudGltZV9jbGtfaW5pdCAtIEluaXRpYWxpemUgYSBkZXZpY2UncyBsaXN0IG9mIHJ1bnRpbWUgUE0gY2xvY2tzLgotICogQGRldjogRGV2aWNlIHRvIGluaXRpYWxpemUgdGhlIGxpc3Qgb2YgcnVudGltZSBQTSBjbG9ja3MgZm9yLgorICogcG1fY2xrX2luaXQgLSBJbml0aWFsaXplIGEgZGV2aWNlJ3MgbGlzdCBvZiBwb3dlciBtYW5hZ2VtZW50IGNsb2Nrcy4KKyAqIEBkZXY6IERldmljZSB0byBpbml0aWFsaXplIHRoZSBsaXN0IG9mIFBNIGNsb2NrcyBmb3IuCiAgKgotICogQWxsb2NhdGUgYSBzdHJ1Y3QgcG1fcnVudGltZV9jbGtfZGF0YSBvYmplY3QsIGluaXRpYWxpemUgaXRzIGxvY2sgbWVtYmVyIGFuZAorICogQWxsb2NhdGUgYSBzdHJ1Y3QgcG1fY2xrX2RhdGEgb2JqZWN0LCBpbml0aWFsaXplIGl0cyBsb2NrIG1lbWJlciBhbmQKICAqIG1ha2UgdGhlIEBkZXYncyBwb3dlci5zdWJzeXNfZGF0YSBmaWVsZCBwb2ludCB0byBpdC4KICAqLwotaW50IHBtX3J1bnRpbWVfY2xrX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQoraW50IHBtX2Nsa19pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcG1fcnVudGltZV9jbGtfZGF0YSAqcHJkOworCXN0cnVjdCBwbV9jbGtfZGF0YSAqcGNkOwogCi0JcHJkID0ga3phbGxvYyhzaXplb2YoKnByZCksIEdGUF9LRVJORUwpOwotCWlmICghcHJkKSB7Ci0JCWRldl9lcnIoZGV2LCAiTm90IGVub3VnaCBtZW1vcnkgZm8gcnVudGltZSBQTSBkYXRhLlxuIik7CisJcGNkID0ga3phbGxvYyhzaXplb2YoKnBjZCksIEdGUF9LRVJORUwpOworCWlmICghcGNkKSB7CisJCWRldl9lcnIoZGV2LCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIFBNIGNsb2NrIGRhdGEuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JSU5JVF9MSVNUX0hFQUQoJnByZC0+Y2xvY2tfbGlzdCk7Ci0JbXV0ZXhfaW5pdCgmcHJkLT5sb2NrKTsKLQlkZXYtPnBvd2VyLnN1YnN5c19kYXRhID0gcHJkOworCUlOSVRfTElTVF9IRUFEKCZwY2QtPmNsb2NrX2xpc3QpOworCW11dGV4X2luaXQoJnBjZC0+bG9jayk7CisJZGV2LT5wb3dlci5zdWJzeXNfZGF0YSA9IHBjZDsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBwbV9ydW50aW1lX2Nsa19kZXN0cm95IC0gRGVzdHJveSBhIGRldmljZSdzIGxpc3Qgb2YgcnVudGltZSBQTSBjbG9ja3MuCi0gKiBAZGV2OiBEZXZpY2UgdG8gZGVzdHJveSB0aGUgbGlzdCBvZiBydW50aW1lIFBNIGNsb2NrcyBmb3IuCisgKiBwbV9jbGtfZGVzdHJveSAtIERlc3Ryb3kgYSBkZXZpY2UncyBsaXN0IG9mIHBvd2VyIG1hbmFnZW1lbnQgY2xvY2tzLgorICogQGRldjogRGV2aWNlIHRvIGRlc3Ryb3kgdGhlIGxpc3Qgb2YgUE0gY2xvY2tzIGZvci4KICAqCiAgKiBDbGVhciB0aGUgQGRldidzIHBvd2VyLnN1YnN5c19kYXRhIGZpZWxkLCByZW1vdmUgdGhlIGxpc3Qgb2YgY2xvY2sgZW50cmllcwotICogZnJvbSB0aGUgc3RydWN0IHBtX3J1bnRpbWVfY2xrX2RhdGEgb2JqZWN0IHBvaW50ZWQgdG8gYnkgaXQgYmVmb3JlIGFuZCBmcmVlCisgKiBmcm9tIHRoZSBzdHJ1Y3QgcG1fY2xrX2RhdGEgb2JqZWN0IHBvaW50ZWQgdG8gYnkgaXQgYmVmb3JlIGFuZCBmcmVlCiAgKiB0aGF0IG9iamVjdC4KICAqLwotdm9pZCBwbV9ydW50aW1lX2Nsa19kZXN0cm95KHN0cnVjdCBkZXZpY2UgKmRldikKK3ZvaWQgcG1fY2xrX2Rlc3Ryb3koc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbV9ydW50aW1lX2Nsa19kYXRhICpwcmQgPSBfX3RvX3ByZChkZXYpOworCXN0cnVjdCBwbV9jbGtfZGF0YSAqcGNkID0gX190b19wY2QoZGV2KTsKIAlzdHJ1Y3QgcG1fY2xvY2tfZW50cnkgKmNlLCAqYzsKIAotCWlmICghcHJkKQorCWlmICghcGNkKQogCQlyZXR1cm47CiAKIAlkZXYtPnBvd2VyLnN1YnN5c19kYXRhID0gTlVMTDsKIAotCW11dGV4X2xvY2soJnByZC0+bG9jayk7CisJbXV0ZXhfbG9jaygmcGNkLT5sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGNlLCBjLCAmcHJkLT5jbG9ja19saXN0LCBub2RlKQotCQlfX3BtX3J1bnRpbWVfY2xrX3JlbW92ZShjZSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoY2UsIGMsICZwY2QtPmNsb2NrX2xpc3QsIG5vZGUpCisJCV9fcG1fY2xrX3JlbW92ZShjZSk7CiAKLQltdXRleF91bmxvY2soJnByZC0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwY2QtPmxvY2spOwogCi0Ja2ZyZWUocHJkKTsKKwlrZnJlZShwY2QpOwogfQogCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorCiAvKioKLSAqIHBtX3J1bnRpbWVfY2xrX2FjcXVpcmUgLSBBY3F1aXJlIGEgZGV2aWNlIGNsb2NrLgorICogcG1fY2xrX2FjcXVpcmUgLSBBY3F1aXJlIGEgZGV2aWNlIGNsb2NrLgogICogQGRldjogRGV2aWNlIHdob3NlIGNsb2NrIGlzIHRvIGJlIGFjcXVpcmVkLgogICogQGNvbl9pZDogQ29ubmVjdGlvbiBJRCBvZiB0aGUgY2xvY2suCiAgKi8KLXN0YXRpYyB2b2lkIHBtX3J1bnRpbWVfY2xrX2FjcXVpcmUoc3RydWN0IGRldmljZSAqZGV2LAorc3RhdGljIHZvaWQgcG1fY2xrX2FjcXVpcmUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgcG1fY2xvY2tfZW50cnkgKmNlKQogewogCWNlLT5jbGsgPSBjbGtfZ2V0KGRldiwgY2UtPmNvbl9pZCk7CkBAIC0yMDksMjQgKzIxMywyNCBAQAogfQogCiAvKioKLSAqIHBtX3J1bnRpbWVfY2xrX3N1c3BlbmQgLSBEaXNhYmxlIGNsb2NrcyBpbiBhIGRldmljZSdzIHJ1bnRpbWUgUE0gY2xvY2sgbGlzdC4KKyAqIHBtX2Nsa19zdXNwZW5kIC0gRGlzYWJsZSBjbG9ja3MgaW4gYSBkZXZpY2UncyBQTSBjbG9jayBsaXN0LgogICogQGRldjogRGV2aWNlIHRvIGRpc2FibGUgdGhlIGNsb2NrcyBmb3IuCiAgKi8KLWludCBwbV9ydW50aW1lX2Nsa19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBwbV9jbGtfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBtX3J1bnRpbWVfY2xrX2RhdGEgKnByZCA9IF9fdG9fcHJkKGRldik7CisJc3RydWN0IHBtX2Nsa19kYXRhICpwY2QgPSBfX3RvX3BjZChkZXYpOwogCXN0cnVjdCBwbV9jbG9ja19lbnRyeSAqY2U7CiAKIAlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAotCWlmICghcHJkKQorCWlmICghcGNkKQogCQlyZXR1cm4gMDsKIAotCW11dGV4X2xvY2soJnByZC0+bG9jayk7CisJbXV0ZXhfbG9jaygmcGNkLT5sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShjZSwgJnByZC0+Y2xvY2tfbGlzdCwgbm9kZSkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShjZSwgJnBjZC0+Y2xvY2tfbGlzdCwgbm9kZSkgewogCQlpZiAoY2UtPnN0YXR1cyA9PSBQQ0VfU1RBVFVTX05PTkUpCi0JCQlwbV9ydW50aW1lX2Nsa19hY3F1aXJlKGRldiwgY2UpOworCQkJcG1fY2xrX2FjcXVpcmUoZGV2LCBjZSk7CiAKIAkJaWYgKGNlLT5zdGF0dXMgPCBQQ0VfU1RBVFVTX0VSUk9SKSB7CiAJCQljbGtfZGlzYWJsZShjZS0+Y2xrKTsKQEAgLTIzNCwzMCArMjM4LDMwIEBACiAJCX0KIAl9CiAKLQltdXRleF91bmxvY2soJnByZC0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwY2QtPmxvY2spOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogcG1fcnVudGltZV9jbGtfcmVzdW1lIC0gRW5hYmxlIGNsb2NrcyBpbiBhIGRldmljZSdzIHJ1bnRpbWUgUE0gY2xvY2sgbGlzdC4KKyAqIHBtX2Nsa19yZXN1bWUgLSBFbmFibGUgY2xvY2tzIGluIGEgZGV2aWNlJ3MgUE0gY2xvY2sgbGlzdC4KICAqIEBkZXY6IERldmljZSB0byBlbmFibGUgdGhlIGNsb2NrcyBmb3IuCiAgKi8KLWludCBwbV9ydW50aW1lX2Nsa19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoraW50IHBtX2Nsa19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbV9ydW50aW1lX2Nsa19kYXRhICpwcmQgPSBfX3RvX3ByZChkZXYpOworCXN0cnVjdCBwbV9jbGtfZGF0YSAqcGNkID0gX190b19wY2QoZGV2KTsKIAlzdHJ1Y3QgcG1fY2xvY2tfZW50cnkgKmNlOwogCiAJZGV2X2RiZyhkZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoIXByZCkKKwlpZiAoIXBjZCkKIAkJcmV0dXJuIDA7CiAKLQltdXRleF9sb2NrKCZwcmQtPmxvY2spOworCW11dGV4X2xvY2soJnBjZC0+bG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNlLCAmcHJkLT5jbG9ja19saXN0LCBub2RlKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZSwgJnBjZC0+Y2xvY2tfbGlzdCwgbm9kZSkgewogCQlpZiAoY2UtPnN0YXR1cyA9PSBQQ0VfU1RBVFVTX05PTkUpCi0JCQlwbV9ydW50aW1lX2Nsa19hY3F1aXJlKGRldiwgY2UpOworCQkJcG1fY2xrX2FjcXVpcmUoZGV2LCBjZSk7CiAKIAkJaWYgKGNlLT5zdGF0dXMgPCBQQ0VfU1RBVFVTX0VSUk9SKSB7CiAJCQljbGtfZW5hYmxlKGNlLT5jbGspOwpAQCAtMjY1LDMzICsyNjksMzMgQEAKIAkJfQogCX0KIAotCW11dGV4X3VubG9jaygmcHJkLT5sb2NrKTsKKwltdXRleF91bmxvY2soJnBjZC0+bG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBwbV9ydW50aW1lX2Nsa19ub3RpZnkgLSBOb3RpZnkgcm91dGluZSBmb3IgZGV2aWNlIGFkZGl0aW9uIGFuZCByZW1vdmFsLgorICogcG1fY2xrX25vdGlmeSAtIE5vdGlmeSByb3V0aW5lIGZvciBkZXZpY2UgYWRkaXRpb24gYW5kIHJlbW92YWwuCiAgKiBAbmI6IE5vdGlmaWVyIGJsb2NrIG9iamVjdCB0aGlzIGZ1bmN0aW9uIGlzIGEgbWVtYmVyIG9mLgogICogQGFjdGlvbjogT3BlcmF0aW9uIGJlaW5nIGNhcnJpZWQgb3V0IGJ5IHRoZSBjYWxsZXIuCiAgKiBAZGF0YTogRGV2aWNlIHRoZSByb3V0aW5lIGlzIGJlaW5nIHJ1biBmb3IuCiAgKgogICogRm9yIHRoaXMgZnVuY3Rpb24gdG8gd29yaywgQG5iIG11c3QgYmUgYSBtZW1iZXIgb2YgYW4gb2JqZWN0IG9mIHR5cGUKICAqIHN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgY29udGFpbmluZyBhbGwgb2YgdGhlIHJlcXVpc2l0ZSBkYXRhLgotICogU3BlY2lmaWNhbGx5LCB0aGUgcHdyX2RvbWFpbiBtZW1iZXIgb2YgdGhhdCBvYmplY3QgaXMgY29waWVkIHRvIHRoZSBkZXZpY2UncwotICogcHdyX2RvbWFpbiBmaWVsZCBhbmQgaXRzIGNvbl9pZHMgbWVtYmVyIGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGRldmljZSdzIGxpc3QKLSAqIG9mIHJ1bnRpbWUgUE0gY2xvY2tzLCBkZXBlbmRpbmcgb24gQGFjdGlvbi4KKyAqIFNwZWNpZmljYWxseSwgdGhlIHBtX2RvbWFpbiBtZW1iZXIgb2YgdGhhdCBvYmplY3QgaXMgY29waWVkIHRvIHRoZSBkZXZpY2UncworICogcG1fZG9tYWluIGZpZWxkIGFuZCBpdHMgY29uX2lkcyBtZW1iZXIgaXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgZGV2aWNlJ3MgbGlzdAorICogb2YgUE0gY2xvY2tzLCBkZXBlbmRpbmcgb24gQGFjdGlvbi4KICAqCi0gKiBJZiB0aGUgZGV2aWNlJ3MgcHdyX2RvbWFpbiBmaWVsZCBpcyBhbHJlYWR5IHBvcHVsYXRlZCB3aXRoIGEgdmFsdWUgZGlmZmVyZW50CisgKiBJZiB0aGUgZGV2aWNlJ3MgcG1fZG9tYWluIGZpZWxkIGlzIGFscmVhZHkgcG9wdWxhdGVkIHdpdGggYSB2YWx1ZSBkaWZmZXJlbnQKICAqIGZyb20gdGhlIG9uZSBzdG9yZWQgaW4gdGhlIHN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgb2JqZWN0LCB0aGUgZnVuY3Rpb24KICAqIGRvZXMgbm90aGluZy4KICAqLwotc3RhdGljIGludCBwbV9ydW50aW1lX2Nsa19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKK3N0YXRpYyBpbnQgcG1fY2xrX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcG1fY2xrX25vdGlmaWVyX2Jsb2NrICpjbGtuYjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOwotCWNoYXIgKmNvbl9pZDsKKwljaGFyICoqY29uX2lkOwogCWludCBlcnJvcjsKIAogCWRldl9kYmcoZGV2LCAiJXMoKSAlbGRcbiIsIF9fZnVuY19fLCBhY3Rpb24pOwpAQCAtMzAwLDI4ICszMDQsMjggQEAKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBCVVNfTk9USUZZX0FERF9ERVZJQ0U6Ci0JCWlmIChkZXYtPnB3cl9kb21haW4pCisJCWlmIChkZXYtPnBtX2RvbWFpbikKIAkJCWJyZWFrOwogCi0JCWVycm9yID0gcG1fcnVudGltZV9jbGtfaW5pdChkZXYpOworCQllcnJvciA9IHBtX2Nsa19pbml0KGRldik7CiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwogCi0JCWRldi0+cHdyX2RvbWFpbiA9IGNsa25iLT5wd3JfZG9tYWluOworCQlkZXYtPnBtX2RvbWFpbiA9IGNsa25iLT5wbV9kb21haW47CiAJCWlmIChjbGtuYi0+Y29uX2lkc1swXSkgewotCQkJZm9yIChjb25faWQgPSBjbGtuYi0+Y29uX2lkc1swXTsgKmNvbl9pZDsgY29uX2lkKyspCi0JCQkJcG1fcnVudGltZV9jbGtfYWRkKGRldiwgY29uX2lkKTsKKwkJCWZvciAoY29uX2lkID0gY2xrbmItPmNvbl9pZHM7ICpjb25faWQ7IGNvbl9pZCsrKQorCQkJCXBtX2Nsa19hZGQoZGV2LCAqY29uX2lkKTsKIAkJfSBlbHNlIHsKLQkJCXBtX3J1bnRpbWVfY2xrX2FkZChkZXYsIE5VTEwpOworCQkJcG1fY2xrX2FkZChkZXYsIE5VTEwpOwogCQl9CiAKIAkJYnJlYWs7CiAJY2FzZSBCVVNfTk9USUZZX0RFTF9ERVZJQ0U6Ci0JCWlmIChkZXYtPnB3cl9kb21haW4gIT0gY2xrbmItPnB3cl9kb21haW4pCisJCWlmIChkZXYtPnBtX2RvbWFpbiAhPSBjbGtuYi0+cG1fZG9tYWluKQogCQkJYnJlYWs7CiAKLQkJZGV2LT5wd3JfZG9tYWluID0gTlVMTDsKLQkJcG1fcnVudGltZV9jbGtfZGVzdHJveShkZXYpOworCQlkZXYtPnBtX2RvbWFpbiA9IE5VTEw7CisJCXBtX2Nsa19kZXN0cm95KGRldik7CiAJCWJyZWFrOwogCX0KIApAQCAtMzMwLDYgKzMzNCw2MCBAQAogCiAjZWxzZSAvKiAhQ09ORklHX1BNX1JVTlRJTUUgKi8KIAorI2lmZGVmIENPTkZJR19QTQorCisvKioKKyAqIHBtX2Nsa19zdXNwZW5kIC0gRGlzYWJsZSBjbG9ja3MgaW4gYSBkZXZpY2UncyBQTSBjbG9jayBsaXN0LgorICogQGRldjogRGV2aWNlIHRvIGRpc2FibGUgdGhlIGNsb2NrcyBmb3IuCisgKi8KK2ludCBwbV9jbGtfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBtX2Nsa19kYXRhICpwY2QgPSBfX3RvX3BjZChkZXYpOworCXN0cnVjdCBwbV9jbG9ja19lbnRyeSAqY2U7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIElmIHRoZXJlIGlzIG5vIGRyaXZlciwgdGhlIGNsb2NrcyBhcmUgYWxyZWFkeSBkaXNhYmxlZC4gKi8KKwlpZiAoIXBjZCB8fCAhZGV2LT5kcml2ZXIpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmcGNkLT5sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShjZSwgJnBjZC0+Y2xvY2tfbGlzdCwgbm9kZSkKKwkJY2xrX2Rpc2FibGUoY2UtPmNsayk7CisKKwltdXRleF91bmxvY2soJnBjZC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwbV9jbGtfcmVzdW1lIC0gRW5hYmxlIGNsb2NrcyBpbiBhIGRldmljZSdzIFBNIGNsb2NrIGxpc3QuCisgKiBAZGV2OiBEZXZpY2UgdG8gZW5hYmxlIHRoZSBjbG9ja3MgZm9yLgorICovCitpbnQgcG1fY2xrX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBtX2Nsa19kYXRhICpwY2QgPSBfX3RvX3BjZChkZXYpOworCXN0cnVjdCBwbV9jbG9ja19lbnRyeSAqY2U7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIElmIHRoZXJlIGlzIG5vIGRyaXZlciwgdGhlIGNsb2NrcyBzaG91bGQgcmVtYWluIGRpc2FibGVkLiAqLworCWlmICghcGNkIHx8ICFkZXYtPmRyaXZlcikKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZwY2QtPmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZSwgJnBjZC0+Y2xvY2tfbGlzdCwgbm9kZSkKKwkJY2xrX2VuYWJsZShjZS0+Y2xrKTsKKworCW11dGV4X3VubG9jaygmcGNkLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKIC8qKgogICogZW5hYmxlX2Nsb2NrIC0gRW5hYmxlIGEgZGV2aWNlIGNsb2NrLgogICogQGRldjogRGV2aWNlIHdob3NlIGNsb2NrIGlzIHRvIGJlIGVuYWJsZWQuCkBAIC0zNjUsNyArNDIzLDcgQEAKIH0KIAogLyoqCi0gKiBwbV9ydW50aW1lX2Nsa19ub3RpZnkgLSBOb3RpZnkgcm91dGluZSBmb3IgZGV2aWNlIGFkZGl0aW9uIGFuZCByZW1vdmFsLgorICogcG1fY2xrX25vdGlmeSAtIE5vdGlmeSByb3V0aW5lIGZvciBkZXZpY2UgYWRkaXRpb24gYW5kIHJlbW92YWwuCiAgKiBAbmI6IE5vdGlmaWVyIGJsb2NrIG9iamVjdCB0aGlzIGZ1bmN0aW9uIGlzIGEgbWVtYmVyIG9mLgogICogQGFjdGlvbjogT3BlcmF0aW9uIGJlaW5nIGNhcnJpZWQgb3V0IGJ5IHRoZSBjYWxsZXIuCiAgKiBAZGF0YTogRGV2aWNlIHRoZSByb3V0aW5lIGlzIGJlaW5nIHJ1biBmb3IuCkBAIC0zNzUsMzAgKzQzMywzMCBAQAogICogU3BlY2lmaWNhbGx5LCB0aGUgY29uX2lkcyBtZW1iZXIgb2YgdGhhdCBvYmplY3QgaXMgdXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZQogICogdGhlIGRldmljZSdzIGNsb2NrcywgZGVwZW5kaW5nIG9uIEBhY3Rpb24uCiAgKi8KLXN0YXRpYyBpbnQgcG1fcnVudGltZV9jbGtfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCitzdGF0aWMgaW50IHBtX2Nsa19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKIAkJCQkgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHBtX2Nsa19ub3RpZmllcl9ibG9jayAqY2xrbmI7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKLQljaGFyICpjb25faWQ7CisJY2hhciAqKmNvbl9pZDsKIAogCWRldl9kYmcoZGV2LCAiJXMoKSAlbGRcbiIsIF9fZnVuY19fLCBhY3Rpb24pOwogCiAJY2xrbmIgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2ssIG5iKTsKIAogCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBCVVNfTk9USUZZX0FERF9ERVZJQ0U6CisJY2FzZSBCVVNfTk9USUZZX0JJTkRfRFJJVkVSOgogCQlpZiAoY2xrbmItPmNvbl9pZHNbMF0pIHsKLQkJCWZvciAoY29uX2lkID0gY2xrbmItPmNvbl9pZHNbMF07ICpjb25faWQ7IGNvbl9pZCsrKQotCQkJCWVuYWJsZV9jbG9jayhkZXYsIGNvbl9pZCk7CisJCQlmb3IgKGNvbl9pZCA9IGNsa25iLT5jb25faWRzOyAqY29uX2lkOyBjb25faWQrKykKKwkJCQllbmFibGVfY2xvY2soZGV2LCAqY29uX2lkKTsKIAkJfSBlbHNlIHsKIAkJCWVuYWJsZV9jbG9jayhkZXYsIE5VTEwpOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgQlVTX05PVElGWV9ERUxfREVWSUNFOgorCWNhc2UgQlVTX05PVElGWV9VTkJPVU5EX0RSSVZFUjoKIAkJaWYgKGNsa25iLT5jb25faWRzWzBdKSB7Ci0JCQlmb3IgKGNvbl9pZCA9IGNsa25iLT5jb25faWRzWzBdOyAqY29uX2lkOyBjb25faWQrKykKLQkJCQlkaXNhYmxlX2Nsb2NrKGRldiwgY29uX2lkKTsKKwkJCWZvciAoY29uX2lkID0gY2xrbmItPmNvbl9pZHM7ICpjb25faWQ7IGNvbl9pZCsrKQorCQkJCWRpc2FibGVfY2xvY2soZGV2LCAqY29uX2lkKTsKIAkJfSBlbHNlIHsKIAkJCWRpc2FibGVfY2xvY2soZGV2LCBOVUxMKTsKIAkJfQpAQCAtNDExLDIxICs0NjksMjEgQEAKICNlbmRpZiAvKiAhQ09ORklHX1BNX1JVTlRJTUUgKi8KIAogLyoqCi0gKiBwbV9ydW50aW1lX2Nsa19hZGRfbm90aWZpZXIgLSBBZGQgYnVzIHR5cGUgbm90aWZpZXIgZm9yIHJ1bnRpbWUgUE0gY2xvY2tzLgorICogcG1fY2xrX2FkZF9ub3RpZmllciAtIEFkZCBidXMgdHlwZSBub3RpZmllciBmb3IgcG93ZXIgbWFuYWdlbWVudCBjbG9ja3MuCiAgKiBAYnVzOiBCdXMgdHlwZSB0byBhZGQgdGhlIG5vdGlmaWVyIHRvLgogICogQGNsa25iOiBOb3RpZmllciB0byBiZSBhZGRlZCB0byB0aGUgZ2l2ZW4gYnVzIHR5cGUuCiAgKgogICogVGhlIG5iIG1lbWJlciBvZiBAY2xrbmIgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGluaXRpYWxpemVkIGFuZCBpdHMKLSAqIG5vdGlmaWVyX2NhbGwgbWVtYmVyIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBwbV9ydW50aW1lX2Nsa19ub3RpZnkoKS4gIEhvd2V2ZXIsCisgKiBub3RpZmllcl9jYWxsIG1lbWJlciB3aWxsIGJlIHJlcGxhY2VkIHdpdGggcG1fY2xrX25vdGlmeSgpLiAgSG93ZXZlciwKICAqIHRoZSByZW1haW5pbmcgbWVtYmVycyBvZiBAY2xrbmIgc2hvdWxkIGJlIHBvcHVsYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoaXMKICAqIHJvdXRpbmUuCiAgKi8KLXZvaWQgcG1fcnVudGltZV9jbGtfYWRkX25vdGlmaWVyKHN0cnVjdCBidXNfdHlwZSAqYnVzLAordm9pZCBwbV9jbGtfYWRkX25vdGlmaWVyKHN0cnVjdCBidXNfdHlwZSAqYnVzLAogCQkJCSBzdHJ1Y3QgcG1fY2xrX25vdGlmaWVyX2Jsb2NrICpjbGtuYikKIHsKIAlpZiAoIWJ1cyB8fCAhY2xrbmIpCiAJCXJldHVybjsKIAotCWNsa25iLT5uYi5ub3RpZmllcl9jYWxsID0gcG1fcnVudGltZV9jbGtfbm90aWZ5OworCWNsa25iLT5uYi5ub3RpZmllcl9jYWxsID0gcG1fY2xrX25vdGlmeTsKIAlidXNfcmVnaXN0ZXJfbm90aWZpZXIoYnVzLCAmY2xrbmItPm5iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTg3MTRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jCkBAIC0wLDAgKzEsMTI3MyBAQAorLyoKKyAqIGRyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYyAtIENvbW1vbiBjb2RlIHJlbGF0ZWQgdG8gZGV2aWNlIHBvd2VyIGRvbWFpbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4sIFJlbmVzYXMgRWxlY3Ryb25pY3MgQ29ycC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcG1fZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorCitzdGF0aWMgTElTVF9IRUFEKGdwZF9saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZ3BkX2xpc3RfbG9jayk7CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZGV2X3RvX2dlbnBkKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoSVNfRVJSX09SX05VTEwoZGV2LT5wbV9kb21haW4pKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXJldHVybiBwZF90b19nZW5wZChkZXYtPnBtX2RvbWFpbik7Cit9CisKK3N0YXRpYyB2b2lkIGdlbnBkX3NkX2NvdW50ZXJfZGVjKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJaWYgKCFXQVJOX09OKGdlbnBkLT5zZF9jb3VudCA9PSAwKSkKKwkJCWdlbnBkLT5zZF9jb3VudC0tOworfQorCitzdGF0aWMgdm9pZCBnZW5wZF9hY3F1aXJlX2xvY2soc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCW11dGV4X2xvY2soJmdlbnBkLT5sb2NrKTsKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBkb21haW4gdG8gdHJhbnNpdGlvbiBpbnRvIGVpdGhlciB0aGUgYWN0aXZlLAorCSAqIG9yIHRoZSBwb3dlciBvZmYgc3RhdGUuCisJICovCisJZm9yICg7OykgeworCQlwcmVwYXJlX3RvX3dhaXQoJmdlbnBkLT5zdGF0dXNfd2FpdF9xdWV1ZSwgJndhaXQsCisJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAoZ2VucGQtPnN0YXR1cyA9PSBHUERfU1RBVEVfQUNUSVZFCisJCSAgICB8fCBnZW5wZC0+c3RhdHVzID09IEdQRF9TVEFURV9QT1dFUl9PRkYpCisJCQlicmVhazsKKwkJbXV0ZXhfdW5sb2NrKCZnZW5wZC0+bG9jayk7CisKKwkJc2NoZWR1bGUoKTsKKworCQltdXRleF9sb2NrKCZnZW5wZC0+bG9jayk7CisJfQorCWZpbmlzaF93YWl0KCZnZW5wZC0+c3RhdHVzX3dhaXRfcXVldWUsICZ3YWl0KTsKK30KKworc3RhdGljIHZvaWQgZ2VucGRfcmVsZWFzZV9sb2NrKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJbXV0ZXhfdW5sb2NrKCZnZW5wZC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbnBkX3NldF9hY3RpdmUoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3sKKwlpZiAoZ2VucGQtPnJlc3VtZV9jb3VudCA9PSAwKQorCQlnZW5wZC0+c3RhdHVzID0gR1BEX1NUQVRFX0FDVElWRTsKK30KKworLyoqCisgKiBwbV9nZW5wZF9wb3dlcm9uIC0gUmVzdG9yZSBwb3dlciB0byBhIGdpdmVuIFBNIGRvbWFpbiBhbmQgaXRzIHBhcmVudHMuCisgKiBAZ2VucGQ6IFBNIGRvbWFpbiB0byBwb3dlciB1cC4KKyAqCisgKiBSZXN0b3JlIHBvd2VyIHRvIEBnZW5wZCBhbmQgYWxsIG9mIGl0cyBwYXJlbnRzIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8KKyAqIHJlc3VtZSBhIGRldmljZSBiZWxvbmdpbmcgdG8gaXQuCisgKi8KK2ludCBwbV9nZW5wZF9wb3dlcm9uKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwYXJlbnQgPSBnZW5wZC0+cGFyZW50OworCURFRklORV9XQUlUKHdhaXQpOworCWludCByZXQgPSAwOworCisgc3RhcnQ6CisJaWYgKHBhcmVudCkgeworCQlnZW5wZF9hY3F1aXJlX2xvY2socGFyZW50KTsKKwkJbXV0ZXhfbG9ja19uZXN0ZWQoJmdlbnBkLT5sb2NrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CisJfSBlbHNlIHsKKwkJbXV0ZXhfbG9jaygmZ2VucGQtPmxvY2spOworCX0KKworCWlmIChnZW5wZC0+c3RhdHVzID09IEdQRF9TVEFURV9BQ1RJVkUKKwkgICAgfHwgKGdlbnBkLT5wcmVwYXJlZF9jb3VudCA+IDAgJiYgZ2VucGQtPnN1c3BlbmRfcG93ZXJfb2ZmKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoZ2VucGQtPnN0YXR1cyAhPSBHUERfU1RBVEVfUE9XRVJfT0ZGKSB7CisJCWdlbnBkX3NldF9hY3RpdmUoZ2VucGQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocGFyZW50ICYmIHBhcmVudC0+c3RhdHVzICE9IEdQRF9TVEFURV9BQ1RJVkUpIHsKKwkJbXV0ZXhfdW5sb2NrKCZnZW5wZC0+bG9jayk7CisJCWdlbnBkX3JlbGVhc2VfbG9jayhwYXJlbnQpOworCisJCXJldCA9IHBtX2dlbnBkX3Bvd2Vyb24ocGFyZW50KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZ290byBzdGFydDsKKwl9CisKKwlpZiAoZ2VucGQtPnBvd2VyX29uKSB7CisJCWludCByZXQgPSBnZW5wZC0+cG93ZXJfb24oZ2VucGQpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJZ2VucGRfc2V0X2FjdGl2ZShnZW5wZCk7CisJaWYgKHBhcmVudCkKKwkJcGFyZW50LT5zZF9jb3VudCsrOworCisgb3V0OgorCW11dGV4X3VubG9jaygmZ2VucGQtPmxvY2spOworCWlmIChwYXJlbnQpCisJCWdlbnBkX3JlbGVhc2VfbG9jayhwYXJlbnQpOworCisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKworLyoqCisgKiBfX3BtX2dlbnBkX3NhdmVfZGV2aWNlIC0gU2F2ZSB0aGUgcHJlLXN1c3BlbmQgc3RhdGUgb2YgYSBkZXZpY2UuCisgKiBAZGxlOiBEZXZpY2UgbGlzdCBlbnRyeSBvZiB0aGUgZGV2aWNlIHRvIHNhdmUgdGhlIHN0YXRlIG9mLgorICogQGdlbnBkOiBQTSBkb21haW4gdGhlIGRldmljZSBiZWxvbmdzIHRvLgorICovCitzdGF0aWMgaW50IF9fcG1fZ2VucGRfc2F2ZV9kZXZpY2Uoc3RydWN0IGRldl9saXN0X2VudHJ5ICpkbGUsCisJCQkJICBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQorCV9fcmVsZWFzZXMoJmdlbnBkLT5sb2NrKSBfX2FjcXVpcmVzKCZnZW5wZC0+bG9jaykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkbGUtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGxlLT5uZWVkX3Jlc3RvcmUpCisJCXJldHVybiAwOworCisJbXV0ZXhfdW5sb2NrKCZnZW5wZC0+bG9jayk7CisKKwlpZiAoZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+cnVudGltZV9zdXNwZW5kKSB7CisJCWlmIChnZW5wZC0+c3RhcnRfZGV2aWNlKQorCQkJZ2VucGQtPnN0YXJ0X2RldmljZShkZXYpOworCisJCXJldCA9IGRydi0+cG0tPnJ1bnRpbWVfc3VzcGVuZChkZXYpOworCisJCWlmIChnZW5wZC0+c3RvcF9kZXZpY2UpCisJCQlnZW5wZC0+c3RvcF9kZXZpY2UoZGV2KTsKKwl9CisKKwltdXRleF9sb2NrKCZnZW5wZC0+bG9jayk7CisKKwlpZiAoIXJldCkKKwkJZGxlLT5uZWVkX3Jlc3RvcmUgPSB0cnVlOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX3BtX2dlbnBkX3Jlc3RvcmVfZGV2aWNlIC0gUmVzdG9yZSB0aGUgcHJlLXN1c3BlbmQgc3RhdGUgb2YgYSBkZXZpY2UuCisgKiBAZGxlOiBEZXZpY2UgbGlzdCBlbnRyeSBvZiB0aGUgZGV2aWNlIHRvIHJlc3RvcmUgdGhlIHN0YXRlIG9mLgorICogQGdlbnBkOiBQTSBkb21haW4gdGhlIGRldmljZSBiZWxvbmdzIHRvLgorICovCitzdGF0aWMgdm9pZCBfX3BtX2dlbnBkX3Jlc3RvcmVfZGV2aWNlKHN0cnVjdCBkZXZfbGlzdF9lbnRyeSAqZGxlLAorCQkJCSAgICAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCisJX19yZWxlYXNlcygmZ2VucGQtPmxvY2spIF9fYWNxdWlyZXMoJmdlbnBkLT5sb2NrKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRsZS0+ZGV2OworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKKworCWlmICghZGxlLT5uZWVkX3Jlc3RvcmUpCisJCXJldHVybjsKKworCW11dGV4X3VubG9jaygmZ2VucGQtPmxvY2spOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnJ1bnRpbWVfcmVzdW1lKSB7CisJCWlmIChnZW5wZC0+c3RhcnRfZGV2aWNlKQorCQkJZ2VucGQtPnN0YXJ0X2RldmljZShkZXYpOworCisJCWRydi0+cG0tPnJ1bnRpbWVfcmVzdW1lKGRldik7CisKKwkJaWYgKGdlbnBkLT5zdG9wX2RldmljZSkKKwkJCWdlbnBkLT5zdG9wX2RldmljZShkZXYpOworCX0KKworCW11dGV4X2xvY2soJmdlbnBkLT5sb2NrKTsKKworCWRsZS0+bmVlZF9yZXN0b3JlID0gZmFsc2U7Cit9CisKKy8qKgorICogZ2VucGRfYWJvcnRfcG93ZXJvZmYgLSBDaGVjayBpZiBhIFBNIGRvbWFpbiBwb3dlciBvZmYgc2hvdWxkIGJlIGFib3J0ZWQuCisgKiBAZ2VucGQ6IFBNIGRvbWFpbiB0byBjaGVjay4KKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiBhIFBNIGRvbWFpbidzIHN0YXR1cyBjaGFuZ2VkIHRvIEdQRF9TVEFURV9BQ1RJVkUgZHVyaW5nCisgKiBhICJwb3dlciBvZmYiIG9wZXJhdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCBhICJwb3dlciBvbiIgaGFzIG9jY3VyZWQgaW4gdGhlCisgKiBtZWFudGltZSwgb3IgaWYgaXRzIHJlc3VtZV9jb3VudCBmaWVsZCBpcyBkaWZmZXJlbnQgZnJvbSB6ZXJvLCB3aGljaCBtZWFucworICogdGhhdCBvbmUgb2YgaXRzIGRldmljZXMgaGFzIGJlZW4gcmVzdW1lZCBpbiB0aGUgbWVhbnRpbWUuCisgKi8KK3N0YXRpYyBib29sIGdlbnBkX2Fib3J0X3Bvd2Vyb2ZmKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJcmV0dXJuIGdlbnBkLT5zdGF0dXMgPT0gR1BEX1NUQVRFX0FDVElWRSB8fCBnZW5wZC0+cmVzdW1lX2NvdW50ID4gMDsKK30KKworLyoqCisgKiBnZW5wZF9xdWV1ZV9wb3dlcl9vZmZfd29yayAtIFF1ZXVlIHVwIHRoZSBleGVjdXRpb24gb2YgcG1fZ2VucGRfcG93ZXJvZmYoKS4KKyAqIEBnZW5wZDogUE0gZG9tYWl0IHRvIHBvd2VyIG9mZi4KKyAqCisgKiBRdWV1ZSB1cCB0aGUgZXhlY3V0aW9uIG9mIHBtX2dlbnBkX3Bvd2Vyb2ZmKCkgdW5sZXNzIGl0J3MgYWxyZWFkeSBiZWVuIGRvbmUKKyAqIGJlZm9yZS4KKyAqLwordm9pZCBnZW5wZF9xdWV1ZV9wb3dlcl9vZmZfd29yayhzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQoreworCWlmICghd29ya19wZW5kaW5nKCZnZW5wZC0+cG93ZXJfb2ZmX3dvcmspKQorCQlxdWV1ZV93b3JrKHBtX3dxLCAmZ2VucGQtPnBvd2VyX29mZl93b3JrKTsKK30KKworLyoqCisgKiBwbV9nZW5wZF9wb3dlcm9mZiAtIFJlbW92ZSBwb3dlciBmcm9tIGEgZ2l2ZW4gUE0gZG9tYWluLgorICogQGdlbnBkOiBQTSBkb21haW4gdG8gcG93ZXIgZG93bi4KKyAqCisgKiBJZiBhbGwgb2YgdGhlIEBnZW5wZCdzIGRldmljZXMgaGF2ZSBiZWVuIHN1c3BlbmRlZCBhbmQgYWxsIG9mIGl0cyBzdWJkb21haW5zCisgKiBoYXZlIGJlZW4gcG93ZXJlZCBkb3duLCBydW4gdGhlIHJ1bnRpbWUgc3VzcGVuZCBjYWxsYmFja3MgcHJvdmlkZWQgYnkgYWxsIG9mCisgKiB0aGUgQGdlbnBkJ3MgZGV2aWNlcycgZHJpdmVycyBhbmQgcmVtb3ZlIHBvd2VyIGZyb20gQGdlbnBkLgorICovCitzdGF0aWMgaW50IHBtX2dlbnBkX3Bvd2Vyb2ZmKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCisJX19yZWxlYXNlcygmZ2VucGQtPmxvY2spIF9fYWNxdWlyZXMoJmdlbnBkLT5sb2NrKQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqcGFyZW50OworCXN0cnVjdCBkZXZfbGlzdF9lbnRyeSAqZGxlOworCXVuc2lnbmVkIGludCBub3Rfc3VzcGVuZGVkOworCWludCByZXQgPSAwOworCisgc3RhcnQ6CisJLyoKKwkgKiBEbyBub3QgdHJ5IHRvIHBvd2VyIG9mZiB0aGUgZG9tYWluIGluIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczoKKwkgKiAoMSkgVGhlIGRvbWFpbiBpcyBhbHJlYWR5IGluIHRoZSAicG93ZXIgb2ZmIiBzdGF0ZS4KKwkgKiAoMikgU3lzdGVtIHN1c3BlbmQgaXMgaW4gcHJvZ3Jlc3MuCisJICogKDMpIE9uZSBvZiB0aGUgZG9tYWluJ3MgZGV2aWNlcyBpcyBiZWluZyByZXN1bWVkIHJpZ2h0IG5vdy4KKwkgKi8KKwlpZiAoZ2VucGQtPnN0YXR1cyA9PSBHUERfU1RBVEVfUE9XRVJfT0ZGIHx8IGdlbnBkLT5wcmVwYXJlZF9jb3VudCA+IDAKKwkgICAgfHwgZ2VucGQtPnJlc3VtZV9jb3VudCA+IDApCisJCXJldHVybiAwOworCisJaWYgKGdlbnBkLT5zZF9jb3VudCA+IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlub3Rfc3VzcGVuZGVkID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRsZSwgJmdlbnBkLT5kZXZfbGlzdCwgbm9kZSkKKwkJaWYgKGRsZS0+ZGV2LT5kcml2ZXIgJiYgIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRsZS0+ZGV2KSkKKwkJCW5vdF9zdXNwZW5kZWQrKzsKKworCWlmIChub3Rfc3VzcGVuZGVkID4gZ2VucGQtPmluX3Byb2dyZXNzKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGdlbnBkLT5wb3dlcm9mZl90YXNrKSB7CisJCS8qCisJCSAqIEFub3RoZXIgaW5zdGFuY2Ugb2YgcG1fZ2VucGRfcG93ZXJvZmYoKSBpcyBleGVjdXRpbmcKKwkJICogY2FsbGJhY2tzLCBzbyB0ZWxsIGl0IHRvIHN0YXJ0IG92ZXIgYW5kIHJldHVybi4KKwkJICovCisJCWdlbnBkLT5zdGF0dXMgPSBHUERfU1RBVEVfUkVQRUFUOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZ2VucGQtPmdvdiAmJiBnZW5wZC0+Z292LT5wb3dlcl9kb3duX29rKSB7CisJCWlmICghZ2VucGQtPmdvdi0+cG93ZXJfZG93bl9vaygmZ2VucGQtPmRvbWFpbikpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlnZW5wZC0+c3RhdHVzID0gR1BEX1NUQVRFX0JVU1k7CisJZ2VucGQtPnBvd2Vyb2ZmX3Rhc2sgPSBjdXJyZW50OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGRsZSwgJmdlbnBkLT5kZXZfbGlzdCwgbm9kZSkgeworCQlyZXQgPSBfX3BtX2dlbnBkX3NhdmVfZGV2aWNlKGRsZSwgZ2VucGQpOworCQlpZiAocmV0KSB7CisJCQlnZW5wZF9zZXRfYWN0aXZlKGdlbnBkKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGdlbnBkX2Fib3J0X3Bvd2Vyb2ZmKGdlbnBkKSkKKwkJCWdvdG8gb3V0OworCisJCWlmIChnZW5wZC0+c3RhdHVzID09IEdQRF9TVEFURV9SRVBFQVQpIHsKKwkJCWdlbnBkLT5wb3dlcm9mZl90YXNrID0gTlVMTDsKKwkJCWdvdG8gc3RhcnQ7CisJCX0KKwl9CisKKwlwYXJlbnQgPSBnZW5wZC0+cGFyZW50OworCWlmIChwYXJlbnQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZnZW5wZC0+bG9jayk7CisKKwkJZ2VucGRfYWNxdWlyZV9sb2NrKHBhcmVudCk7CisJCW11dGV4X2xvY2tfbmVzdGVkKCZnZW5wZC0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCisJCWlmIChnZW5wZF9hYm9ydF9wb3dlcm9mZihnZW5wZCkpIHsKKwkJCWdlbnBkX3JlbGVhc2VfbG9jayhwYXJlbnQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoZ2VucGQtPnBvd2VyX29mZikgeworCQlyZXQgPSBnZW5wZC0+cG93ZXJfb2ZmKGdlbnBkKTsKKwkJaWYgKHJldCA9PSAtRUJVU1kpIHsKKwkJCWdlbnBkX3NldF9hY3RpdmUoZ2VucGQpOworCQkJaWYgKHBhcmVudCkKKwkJCQlnZW5wZF9yZWxlYXNlX2xvY2socGFyZW50KTsKKworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlnZW5wZC0+c3RhdHVzID0gR1BEX1NUQVRFX1BPV0VSX09GRjsKKworCWlmIChwYXJlbnQpIHsKKwkJZ2VucGRfc2RfY291bnRlcl9kZWMocGFyZW50KTsKKwkJaWYgKHBhcmVudC0+c2RfY291bnQgPT0gMCkKKwkJCWdlbnBkX3F1ZXVlX3Bvd2VyX29mZl93b3JrKHBhcmVudCk7CisKKwkJZ2VucGRfcmVsZWFzZV9sb2NrKHBhcmVudCk7CisJfQorCisgb3V0OgorCWdlbnBkLT5wb3dlcm9mZl90YXNrID0gTlVMTDsKKwl3YWtlX3VwX2FsbCgmZ2VucGQtPnN0YXR1c193YWl0X3F1ZXVlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGdlbnBkX3Bvd2VyX29mZl93b3JrX2ZuIC0gUG93ZXIgb2ZmIFBNIGRvbWFpbiB3aG9zZSBzdWJkb21haW4gY291bnQgaXMgMC4KKyAqIEB3b3JrOiBXb3JrIHN0cnVjdHVyZSB1c2VkIGZvciBzY2hlZHVsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZ2VucGRfcG93ZXJfb2ZmX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQ7CisKKwlnZW5wZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4sIHBvd2VyX29mZl93b3JrKTsKKworCWdlbnBkX2FjcXVpcmVfbG9jayhnZW5wZCk7CisJcG1fZ2VucGRfcG93ZXJvZmYoZ2VucGQpOworCWdlbnBkX3JlbGVhc2VfbG9jayhnZW5wZCk7Cit9CisKKy8qKgorICogcG1fZ2VucGRfcnVudGltZV9zdXNwZW5kIC0gU3VzcGVuZCBhIGRldmljZSBiZWxvbmdpbmcgdG8gSS9PIFBNIGRvbWFpbi4KKyAqIEBkZXY6IERldmljZSB0byBzdXNwZW5kLgorICoKKyAqIENhcnJ5IG91dCBhIHJ1bnRpbWUgc3VzcGVuZCBvZiBhIGRldmljZSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0cworICogcG1fZG9tYWluIGZpZWxkIHBvaW50cyB0byB0aGUgZG9tYWluIG1lbWJlciBvZiBhbiBvYmplY3Qgb2YgdHlwZQorICogc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluIHJlcHJlc2VudGluZyBhIFBNIGRvbWFpbiBjb25zaXN0aW5nIG9mIEkvTyBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IHBtX2dlbnBkX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZDsKKworCWRldl9kYmcoZGV2LCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJZ2VucGQgPSBkZXZfdG9fZ2VucGQoZGV2KTsKKwlpZiAoSVNfRVJSKGdlbnBkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZ2VucGQtPnN0b3BfZGV2aWNlKSB7CisJCWludCByZXQgPSBnZW5wZC0+c3RvcF9kZXZpY2UoZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJbXV0ZXhfbG9jaygmZ2VucGQtPmxvY2spOworCWdlbnBkLT5pbl9wcm9ncmVzcysrOworCXBtX2dlbnBkX3Bvd2Vyb2ZmKGdlbnBkKTsKKwlnZW5wZC0+aW5fcHJvZ3Jlc3MtLTsKKwltdXRleF91bmxvY2soJmdlbnBkLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIF9fcG1fZ2VucGRfcnVudGltZV9yZXN1bWUgLSBSZXN1bWUgYSBkZXZpY2UgYmVsb25naW5nIHRvIEkvTyBQTSBkb21haW4uCisgKiBAZGV2OiBEZXZpY2UgdG8gcmVzdW1lLgorICogQGdlbnBkOiBQTSBkb21haW4gdGhlIGRldmljZSBiZWxvbmdzIHRvLgorICovCitzdGF0aWMgdm9pZCBfX3BtX2dlbnBkX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQoreworCXN0cnVjdCBkZXZfbGlzdF9lbnRyeSAqZGxlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkbGUsICZnZW5wZC0+ZGV2X2xpc3QsIG5vZGUpIHsKKwkJaWYgKGRsZS0+ZGV2ID09IGRldikgeworCQkJX19wbV9nZW5wZF9yZXN0b3JlX2RldmljZShkbGUsIGdlbnBkKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioKKyAqIHBtX2dlbnBkX3J1bnRpbWVfcmVzdW1lIC0gUmVzdW1lIGEgZGV2aWNlIGJlbG9uZ2luZyB0byBJL08gUE0gZG9tYWluLgorICogQGRldjogRGV2aWNlIHRvIHJlc3VtZS4KKyAqCisgKiBDYXJyeSBvdXQgYSBydW50aW1lIHJlc3VtZSBvZiBhIGRldmljZSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0cworICogcG1fZG9tYWluIGZpZWxkIHBvaW50cyB0byB0aGUgZG9tYWluIG1lbWJlciBvZiBhbiBvYmplY3Qgb2YgdHlwZQorICogc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluIHJlcHJlc2VudGluZyBhIFBNIGRvbWFpbiBjb25zaXN0aW5nIG9mIEkvTyBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IHBtX2dlbnBkX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkOworCURFRklORV9XQUlUKHdhaXQpOworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gcG1fZ2VucGRfcG93ZXJvbihnZW5wZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmdlbnBkLT5sb2NrKTsKKwlnZW5wZC0+c3RhdHVzID0gR1BEX1NUQVRFX0JVU1k7CisJZ2VucGQtPnJlc3VtZV9jb3VudCsrOworCWZvciAoOzspIHsKKwkJcHJlcGFyZV90b193YWl0KCZnZW5wZC0+c3RhdHVzX3dhaXRfcXVldWUsICZ3YWl0LAorCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJLyoKKwkJICogSWYgY3VycmVudCBpcyB0aGUgcG93ZXJpbmcgb2ZmIHRhc2ssIHdlIGhhdmUgYmVlbiBjYWxsZWQKKwkJICogcmVlbnRyYW50bHkgZnJvbSBvbmUgb2YgdGhlIGRldmljZSBjYWxsYmFja3MsIHNvIHdlIHNob3VsZAorCQkgKiBub3Qgd2FpdC4KKwkJICovCisJCWlmICghZ2VucGQtPnBvd2Vyb2ZmX3Rhc2sgfHwgZ2VucGQtPnBvd2Vyb2ZmX3Rhc2sgPT0gY3VycmVudCkKKwkJCWJyZWFrOworCQltdXRleF91bmxvY2soJmdlbnBkLT5sb2NrKTsKKworCQlzY2hlZHVsZSgpOworCisJCW11dGV4X2xvY2soJmdlbnBkLT5sb2NrKTsKKwl9CisJZmluaXNoX3dhaXQoJmdlbnBkLT5zdGF0dXNfd2FpdF9xdWV1ZSwgJndhaXQpOworCV9fcG1fZ2VucGRfcnVudGltZV9yZXN1bWUoZGV2LCBnZW5wZCk7CisJZ2VucGQtPnJlc3VtZV9jb3VudC0tOworCWdlbnBkX3NldF9hY3RpdmUoZ2VucGQpOworCXdha2VfdXBfYWxsKCZnZW5wZC0+c3RhdHVzX3dhaXRfcXVldWUpOworCW11dGV4X3VubG9jaygmZ2VucGQtPmxvY2spOworCisJaWYgKGdlbnBkLT5zdGFydF9kZXZpY2UpCisJCWdlbnBkLT5zdGFydF9kZXZpY2UoZGV2KTsKKworCXJldHVybiAwOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VucGRfcG93ZXJfb2ZmX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKSB7fQorc3RhdGljIGlubGluZSB2b2lkIF9fcG1fZ2VucGRfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpIHt9CisKKyNkZWZpbmUgcG1fZ2VucGRfcnVudGltZV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgcG1fZ2VucGRfcnVudGltZV9yZXN1bWUJCU5VTEwKKworI2VuZGlmIC8qIENPTkZJR19QTV9SVU5USU1FICovCisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKworLyoqCisgKiBwbV9nZW5wZF9zeW5jX3Bvd2Vyb2ZmIC0gU3luY2hyb25vdXNseSBwb3dlciBvZmYgYSBQTSBkb21haW4gYW5kIGl0cyBwYXJlbnRzLgorICogQGdlbnBkOiBQTSBkb21haW4gdG8gcG93ZXIgb2ZmLCBpZiBwb3NzaWJsZS4KKyAqCisgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gUE0gZG9tYWluIGNhbiBiZSBwb3dlcmVkIG9mZiAoZHVyaW5nIHN5c3RlbSBzdXNwZW5kIG9yCisgKiBoaWJlcm5hdGlvbikgYW5kIGRvIHRoYXQgaWYgc28uICBBbHNvLCBpbiB0aGF0IGNhc2UgcHJvcGFnYXRlIHRvIGl0cyBwYXJlbnQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpbiAibm9pcnEiIHN0YWdlcyBvZiBzeXN0ZW0gcG93ZXIgdHJhbnNpdGlvbnMsCisgKiBzbyBpdCBuZWVkIG5vdCBhY3F1aXJlIGxvY2tzIChhbGwgb2YgdGhlICJub2lycSIgY2FsbGJhY2tzIGFyZSBleGVjdXRlZAorICogc2VxdWVudGlhbGx5LCBzbyBpdCBpcyBndWFyYW50ZWVkIHRoYXQgaXQgd2lsbCBuZXZlciBydW4gdHdpY2UgaW4gcGFyYWxsZWwpLgorICovCitzdGF0aWMgdm9pZCBwbV9nZW5wZF9zeW5jX3Bvd2Vyb2ZmKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwYXJlbnQgPSBnZW5wZC0+cGFyZW50OworCisJaWYgKGdlbnBkLT5zdGF0dXMgPT0gR1BEX1NUQVRFX1BPV0VSX09GRikKKwkJcmV0dXJuOworCisJaWYgKGdlbnBkLT5zdXNwZW5kZWRfY291bnQgIT0gZ2VucGQtPmRldmljZV9jb3VudCB8fCBnZW5wZC0+c2RfY291bnQgPiAwKQorCQlyZXR1cm47CisKKwlpZiAoZ2VucGQtPnBvd2VyX29mZikKKwkJZ2VucGQtPnBvd2VyX29mZihnZW5wZCk7CisKKwlnZW5wZC0+c3RhdHVzID0gR1BEX1NUQVRFX1BPV0VSX09GRjsKKwlpZiAocGFyZW50KSB7CisJCWdlbnBkX3NkX2NvdW50ZXJfZGVjKHBhcmVudCk7CisJCXBtX2dlbnBkX3N5bmNfcG93ZXJvZmYocGFyZW50KTsKKwl9Cit9CisKKy8qKgorICogcmVzdW1lX25lZWRlZCAtIENoZWNrIHdoZXRoZXIgdG8gcmVzdW1lIGEgZGV2aWNlIGJlZm9yZSBzeXN0ZW0gc3VzcGVuZC4KKyAqIEBkZXY6IERldmljZSB0byBjaGVjay4KKyAqIEBnZW5wZDogUE0gZG9tYWluIHRoZSBkZXZpY2UgYmVsb25ncyB0by4KKyAqCisgKiBUaGVyZSBhcmUgdHdvIGNhc2VzIGluIHdoaWNoIGEgZGV2aWNlIHRoYXQgY2FuIHdha2UgdXAgdGhlIHN5c3RlbSBmcm9tIHNsZWVwCisgKiBzdGF0ZXMgc2hvdWxkIGJlIHJlc3VtZWQgYnkgcG1fZ2VucGRfcHJlcGFyZSgpOiAoMSkgaWYgdGhlIGRldmljZSBpcyBlbmFibGVkCisgKiB0byB3YWtlIHVwIHRoZSBzeXN0ZW0gYW5kIGl0IGhhcyB0byByZW1haW4gYWN0aXZlIGZvciB0aGlzIHB1cnBvc2Ugd2hpbGUgdGhlCisgKiBzeXN0ZW0gaXMgaW4gdGhlIHNsZWVwIHN0YXRlIGFuZCAoMikgaWYgdGhlIGRldmljZSBpcyBub3QgZW5hYmxlZCB0byB3YWtlIHVwCisgKiB0aGUgc3lzdGVtIGZyb20gc2xlZXAgc3RhdGVzIGFuZCBpdCBnZW5lcmFsbHkgZG9lc24ndCBnZW5lcmF0ZSB3YWtldXAgc2lnbmFscworICogYnkgaXRzZWxmICh0aG9zZSBzaWduYWxzIGFyZSBnZW5lcmF0ZWQgb24gaXRzIGJlaGFsZiBieSBvdGhlciBwYXJ0cyBvZiB0aGUKKyAqIHN5c3RlbSkuICBJbiB0aGUgbGF0dGVyIGNhc2UgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byByZWNvbmZpZ3VyZSB0aGUgZGV2aWNlJ3MKKyAqIHdha2V1cCBzZXR0aW5ncyBkdXJpbmcgc3lzdGVtIHN1c3BlbmQsIGJlY2F1c2UgaXQgbWF5IGhhdmUgYmVlbiBzZXQgdXAgdG8KKyAqIHNpZ25hbCByZW1vdGUgd2FrZXVwIGZyb20gdGhlIHN5c3RlbSdzIHdvcmtpbmcgc3RhdGUgYXMgbmVlZGVkIGJ5IHJ1bnRpbWUgUE0uCisgKiBSZXR1cm4gJ3RydWUnIGluIGVpdGhlciBvZiB0aGUgYWJvdmUgY2FzZXMuCisgKi8KK3N0YXRpYyBib29sIHJlc3VtZV9uZWVkZWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQoreworCWJvb2wgYWN0aXZlX3dha2V1cDsKKworCWlmICghZGV2aWNlX2Nhbl93YWtldXAoZGV2KSkKKwkJcmV0dXJuIGZhbHNlOworCisJYWN0aXZlX3dha2V1cCA9IGdlbnBkLT5hY3RpdmVfd2FrZXVwICYmIGdlbnBkLT5hY3RpdmVfd2FrZXVwKGRldik7CisJcmV0dXJuIGRldmljZV9tYXlfd2FrZXVwKGRldikgPyBhY3RpdmVfd2FrZXVwIDogIWFjdGl2ZV93YWtldXA7Cit9CisKKy8qKgorICogcG1fZ2VucGRfcHJlcGFyZSAtIFN0YXJ0IHBvd2VyIHRyYW5zaXRpb24gb2YgYSBkZXZpY2UgaW4gYSBQTSBkb21haW4uCisgKiBAZGV2OiBEZXZpY2UgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24gb2YuCisgKgorICogU3RhcnQgYSBwb3dlciB0cmFuc2l0aW9uIG9mIGEgZGV2aWNlIChkdXJpbmcgYSBzeXN0ZW0td2lkZSBwb3dlciB0cmFuc2l0aW9uKQorICogdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBpdHMgcG1fZG9tYWluIGZpZWxkIHBvaW50cyB0byB0aGUgZG9tYWluIG1lbWJlciBvZgorICogYW4gb2JqZWN0IG9mIHR5cGUgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluIHJlcHJlc2VudGluZyBhIFBNIGRvbWFpbgorICogY29uc2lzdGluZyBvZiBJL08gZGV2aWNlcy4KKyAqLworc3RhdGljIGludCBwbV9nZW5wZF9wcmVwYXJlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkOworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBJZiBhIHdha2V1cCByZXF1ZXN0IGlzIHBlbmRpbmcgZm9yIHRoZSBkZXZpY2UsIGl0IHNob3VsZCBiZSB3b2tlbiB1cAorCSAqIGF0IHRoaXMgcG9pbnQgYW5kIGEgc3lzdGVtIHdha2V1cCBldmVudCBzaG91bGQgYmUgcmVwb3J0ZWQgaWYgaXQncworCSAqIHNldCB1cCB0byB3YWtlIHVwIHRoZSBzeXN0ZW0gZnJvbSBzbGVlcCBzdGF0ZXMuCisJICovCisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKKwlpZiAocG1fcnVudGltZV9iYXJyaWVyKGRldikgJiYgZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJcG1fd2FrZXVwX2V2ZW50KGRldiwgMCk7CisKKwlpZiAocG1fd2FrZXVwX3BlbmRpbmcoKSkgeworCQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKHJlc3VtZV9uZWVkZWQoZGV2LCBnZW5wZCkpCisJCXBtX3J1bnRpbWVfcmVzdW1lKGRldik7CisKKwlnZW5wZF9hY3F1aXJlX2xvY2soZ2VucGQpOworCisJaWYgKGdlbnBkLT5wcmVwYXJlZF9jb3VudCsrID09IDApCisJCWdlbnBkLT5zdXNwZW5kX3Bvd2VyX29mZiA9IGdlbnBkLT5zdGF0dXMgPT0gR1BEX1NUQVRFX1BPV0VSX09GRjsKKworCWdlbnBkX3JlbGVhc2VfbG9jayhnZW5wZCk7CisKKwlpZiAoZ2VucGQtPnN1c3BlbmRfcG93ZXJfb2ZmKSB7CisJCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFRoZSBQTSBkb21haW4gbXVzdCBiZSBpbiB0aGUgR1BEX1NUQVRFX0FDVElWRSBzdGF0ZSBhdCB0aGlzIHBvaW50LAorCSAqIHNvIHBtX2dlbnBkX3Bvd2Vyb24oKSB3aWxsIHJldHVybiBpbW1lZGlhdGVseSwgYnV0IGlmIHRoZSBkZXZpY2UKKwkgKiBpcyBzdXNwZW5kZWQgKGUuZy4gaXQncyBiZWVuIHN0b3BwZWQgYnkgLnN0b3BfZGV2aWNlKCkpLCB3ZSBuZWVkCisJICogdG8gbWFrZSBpdCBvcGVyYXRpb25hbC4KKwkgKi8KKwlwbV9ydW50aW1lX3Jlc3VtZShkZXYpOworCV9fcG1fcnVudGltZV9kaXNhYmxlKGRldiwgZmFsc2UpOworCisJcmV0ID0gcG1fZ2VuZXJpY19wcmVwYXJlKGRldik7CisJaWYgKHJldCkgeworCQltdXRleF9sb2NrKCZnZW5wZC0+bG9jayk7CisKKwkJaWYgKC0tZ2VucGQtPnByZXBhcmVkX2NvdW50ID09IDApCisJCQlnZW5wZC0+c3VzcGVuZF9wb3dlcl9vZmYgPSBmYWxzZTsKKworCQltdXRleF91bmxvY2soJmdlbnBkLT5sb2NrKTsKKwkJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwl9CisKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBwbV9nZW5wZF9zdXNwZW5kIC0gU3VzcGVuZCBhIGRldmljZSBiZWxvbmdpbmcgdG8gYW4gSS9PIFBNIGRvbWFpbi4KKyAqIEBkZXY6IERldmljZSB0byBzdXNwZW5kLgorICoKKyAqIFN1c3BlbmQgYSBkZXZpY2UgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBpdHMgcG1fZG9tYWluIGZpZWxkIHBvaW50cyB0byB0aGUKKyAqIGRvbWFpbiBtZW1iZXIgb2YgYW4gb2JqZWN0IG9mIHR5cGUgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluIHJlcHJlc2VudGluZworICogYSBQTSBkb21haW4gY29uc2lzdGluZyBvZiBJL08gZGV2aWNlcy4KKyAqLworc3RhdGljIGludCBwbV9nZW5wZF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkOworCisJZGV2X2RiZyhkZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlnZW5wZCA9IGRldl90b19nZW5wZChkZXYpOworCWlmIChJU19FUlIoZ2VucGQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBnZW5wZC0+c3VzcGVuZF9wb3dlcl9vZmYgPyAwIDogcG1fZ2VuZXJpY19zdXNwZW5kKGRldik7Cit9CisKKy8qKgorICogcG1fZ2VucGRfc3VzcGVuZF9ub2lycSAtIExhdGUgc3VzcGVuZCBvZiBhIGRldmljZSBmcm9tIGFuIEkvTyBQTSBkb21haW4uCisgKiBAZGV2OiBEZXZpY2UgdG8gc3VzcGVuZC4KKyAqCisgKiBDYXJyeSBvdXQgYSBsYXRlIHN1c3BlbmQgb2YgYSBkZXZpY2UgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBpdHMKKyAqIHBtX2RvbWFpbiBmaWVsZCBwb2ludHMgdG8gdGhlIGRvbWFpbiBtZW1iZXIgb2YgYW4gb2JqZWN0IG9mIHR5cGUKKyAqIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiByZXByZXNlbnRpbmcgYSBQTSBkb21haW4gY29uc2lzdGluZyBvZiBJL08gZGV2aWNlcy4KKyAqLworc3RhdGljIGludCBwbV9nZW5wZF9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkOworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdlbnBkLT5zdXNwZW5kX3Bvd2VyX29mZikKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBwbV9nZW5lcmljX3N1c3BlbmRfbm9pcnEoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikKKwkgICAgJiYgZ2VucGQtPmFjdGl2ZV93YWtldXAgJiYgZ2VucGQtPmFjdGl2ZV93YWtldXAoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZ2VucGQtPnN0b3BfZGV2aWNlKQorCQlnZW5wZC0+c3RvcF9kZXZpY2UoZGV2KTsKKworCS8qCisJICogU2luY2UgYWxsIG9mIHRoZSAibm9pcnEiIGNhbGxiYWNrcyBhcmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5LCBpdCBpcworCSAqIGd1YXJhbnRlZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcnVuIHR3aWNlIGluIHBhcmFsbGVsIGZvcgorCSAqIHRoZSBzYW1lIFBNIGRvbWFpbiwgc28gaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgbG9ja2luZyBoZXJlLgorCSAqLworCWdlbnBkLT5zdXNwZW5kZWRfY291bnQrKzsKKwlwbV9nZW5wZF9zeW5jX3Bvd2Vyb2ZmKGdlbnBkKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBtX2dlbnBkX3Jlc3VtZV9ub2lycSAtIEVhcmx5IHJlc3VtZSBvZiBhIGRldmljZSBmcm9tIGFuIEkvTyBwb3dlciBkb21haW4uCisgKiBAZGV2OiBEZXZpY2UgdG8gcmVzdW1lLgorICoKKyAqIENhcnJ5IG91dCBhbiBlYXJseSByZXN1bWUgb2YgYSBkZXZpY2UgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBpdHMKKyAqIHBtX2RvbWFpbiBmaWVsZCBwb2ludHMgdG8gdGhlIGRvbWFpbiBtZW1iZXIgb2YgYW4gb2JqZWN0IG9mIHR5cGUKKyAqIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiByZXByZXNlbnRpbmcgYSBwb3dlciBkb21haW4gY29uc2lzdGluZyBvZiBJL08KKyAqIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgcG1fZ2VucGRfcmVzdW1lX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkOworCisJZGV2X2RiZyhkZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlnZW5wZCA9IGRldl90b19nZW5wZChkZXYpOworCWlmIChJU19FUlIoZ2VucGQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnZW5wZC0+c3VzcGVuZF9wb3dlcl9vZmYpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBTaW5jZSBhbGwgb2YgdGhlICJub2lycSIgY2FsbGJhY2tzIGFyZSBleGVjdXRlZCBzZXF1ZW50aWFsbHksIGl0IGlzCisJICogZ3VhcmFudGVlZCB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciBydW4gdHdpY2UgaW4gcGFyYWxsZWwgZm9yCisJICogdGhlIHNhbWUgUE0gZG9tYWluLCBzbyBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSBsb2NraW5nIGhlcmUuCisJICovCisJcG1fZ2VucGRfcG93ZXJvbihnZW5wZCk7CisJZ2VucGQtPnN1c3BlbmRlZF9jb3VudC0tOworCWlmIChnZW5wZC0+c3RhcnRfZGV2aWNlKQorCQlnZW5wZC0+c3RhcnRfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gcG1fZ2VuZXJpY19yZXN1bWVfbm9pcnEoZGV2KTsKK30KKworLyoqCisgKiBwbV9nZW5wZF9yZXN1bWUgLSBSZXN1bWUgYSBkZXZpY2UgYmVsb25naW5nIHRvIGFuIEkvTyBwb3dlciBkb21haW4uCisgKiBAZGV2OiBEZXZpY2UgdG8gcmVzdW1lLgorICoKKyAqIFJlc3VtZSBhIGRldmljZSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0cyBwbV9kb21haW4gZmllbGQgcG9pbnRzIHRvIHRoZQorICogZG9tYWluIG1lbWJlciBvZiBhbiBvYmplY3Qgb2YgdHlwZSBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gcmVwcmVzZW50aW5nCisgKiBhIHBvd2VyIGRvbWFpbiBjb25zaXN0aW5nIG9mIEkvTyBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IHBtX2dlbnBkX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZDsKKworCWRldl9kYmcoZGV2LCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJZ2VucGQgPSBkZXZfdG9fZ2VucGQoZGV2KTsKKwlpZiAoSVNfRVJSKGdlbnBkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZ2VucGQtPnN1c3BlbmRfcG93ZXJfb2ZmID8gMCA6IHBtX2dlbmVyaWNfcmVzdW1lKGRldik7Cit9CisKKy8qKgorICogcG1fZ2VucGRfZnJlZXplIC0gRnJlZXplIGEgZGV2aWNlIGJlbG9uZ2luZyB0byBhbiBJL08gcG93ZXIgZG9tYWluLgorICogQGRldjogRGV2aWNlIHRvIGZyZWV6ZS4KKyAqCisgKiBGcmVlemUgYSBkZXZpY2UgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBpdHMgcG1fZG9tYWluIGZpZWxkIHBvaW50cyB0byB0aGUKKyAqIGRvbWFpbiBtZW1iZXIgb2YgYW4gb2JqZWN0IG9mIHR5cGUgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluIHJlcHJlc2VudGluZworICogYSBwb3dlciBkb21haW4gY29uc2lzdGluZyBvZiBJL08gZGV2aWNlcy4KKyAqLworc3RhdGljIGludCBwbV9nZW5wZF9mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGdlbnBkLT5zdXNwZW5kX3Bvd2VyX29mZiA/IDAgOiBwbV9nZW5lcmljX2ZyZWV6ZShkZXYpOworfQorCisvKioKKyAqIHBtX2dlbnBkX2ZyZWV6ZV9ub2lycSAtIExhdGUgZnJlZXplIG9mIGEgZGV2aWNlIGZyb20gYW4gSS9PIHBvd2VyIGRvbWFpbi4KKyAqIEBkZXY6IERldmljZSB0byBmcmVlemUuCisgKgorICogQ2Fycnkgb3V0IGEgbGF0ZSBmcmVlemUgb2YgYSBkZXZpY2UgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBpdHMKKyAqIHBtX2RvbWFpbiBmaWVsZCBwb2ludHMgdG8gdGhlIGRvbWFpbiBtZW1iZXIgb2YgYW4gb2JqZWN0IG9mIHR5cGUKKyAqIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiByZXByZXNlbnRpbmcgYSBwb3dlciBkb21haW4gY29uc2lzdGluZyBvZiBJL08KKyAqIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgcG1fZ2VucGRfZnJlZXplX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkOworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdlbnBkLT5zdXNwZW5kX3Bvd2VyX29mZikKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBwbV9nZW5lcmljX2ZyZWV6ZV9ub2lycShkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZ2VucGQtPnN0b3BfZGV2aWNlKQorCQlnZW5wZC0+c3RvcF9kZXZpY2UoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBtX2dlbnBkX3RoYXdfbm9pcnEgLSBFYXJseSB0aGF3IG9mIGEgZGV2aWNlIGZyb20gYW4gSS9PIHBvd2VyIGRvbWFpbi4KKyAqIEBkZXY6IERldmljZSB0byB0aGF3LgorICoKKyAqIENhcnJ5IG91dCBhbiBlYXJseSB0aGF3IG9mIGEgZGV2aWNlIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXRzCisgKiBwbV9kb21haW4gZmllbGQgcG9pbnRzIHRvIHRoZSBkb21haW4gbWVtYmVyIG9mIGFuIG9iamVjdCBvZiB0eXBlCisgKiBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gcmVwcmVzZW50aW5nIGEgcG93ZXIgZG9tYWluIGNvbnNpc3Rpbmcgb2YgSS9PCisgKiBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IHBtX2dlbnBkX3RoYXdfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdlbnBkLT5zdXNwZW5kX3Bvd2VyX29mZikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZ2VucGQtPnN0YXJ0X2RldmljZSkKKwkJZ2VucGQtPnN0YXJ0X2RldmljZShkZXYpOworCisJcmV0dXJuIHBtX2dlbmVyaWNfdGhhd19ub2lycShkZXYpOworfQorCisvKioKKyAqIHBtX2dlbnBkX3RoYXcgLSBUaGF3IGEgZGV2aWNlIGJlbG9uZ2luZyB0byBhbiBJL08gcG93ZXIgZG9tYWluLgorICogQGRldjogRGV2aWNlIHRvIHRoYXcuCisgKgorICogVGhhdyBhIGRldmljZSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0cyBwbV9kb21haW4gZmllbGQgcG9pbnRzIHRvIHRoZQorICogZG9tYWluIG1lbWJlciBvZiBhbiBvYmplY3Qgb2YgdHlwZSBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gcmVwcmVzZW50aW5nCisgKiBhIHBvd2VyIGRvbWFpbiBjb25zaXN0aW5nIG9mIEkvTyBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IHBtX2dlbnBkX3RoYXcoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGdlbnBkLT5zdXNwZW5kX3Bvd2VyX29mZiA/IDAgOiBwbV9nZW5lcmljX3RoYXcoZGV2KTsKK30KKworLyoqCisgKiBwbV9nZW5wZF9kZXZfcG93ZXJvZmYgLSBQb3dlciBvZmYgYSBkZXZpY2UgYmVsb25naW5nIHRvIGFuIEkvTyBQTSBkb21haW4uCisgKiBAZGV2OiBEZXZpY2UgdG8gc3VzcGVuZC4KKyAqCisgKiBQb3dlciBvZmYgYSBkZXZpY2UgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBpdHMgcG1fZG9tYWluIGZpZWxkIHBvaW50cyB0bworICogdGhlIGRvbWFpbiBtZW1iZXIgb2YgYW4gb2JqZWN0IG9mIHR5cGUgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluIHJlcHJlc2VudGluZworICogYSBQTSBkb21haW4gY29uc2lzdGluZyBvZiBJL08gZGV2aWNlcy4KKyAqLworc3RhdGljIGludCBwbV9nZW5wZF9kZXZfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGdlbnBkLT5zdXNwZW5kX3Bvd2VyX29mZiA/IDAgOiBwbV9nZW5lcmljX3Bvd2Vyb2ZmKGRldik7Cit9CisKKy8qKgorICogcG1fZ2VucGRfZGV2X3Bvd2Vyb2ZmX25vaXJxIC0gTGF0ZSBwb3dlciBvZmYgb2YgYSBkZXZpY2UgZnJvbSBhIFBNIGRvbWFpbi4KKyAqIEBkZXY6IERldmljZSB0byBzdXNwZW5kLgorICoKKyAqIENhcnJ5IG91dCBhIGxhdGUgcG93ZXJpbmcgb2ZmIG9mIGEgZGV2aWNlIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXRzCisgKiBwbV9kb21haW4gZmllbGQgcG9pbnRzIHRvIHRoZSBkb21haW4gbWVtYmVyIG9mIGFuIG9iamVjdCBvZiB0eXBlCisgKiBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gcmVwcmVzZW50aW5nIGEgUE0gZG9tYWluIGNvbnNpc3Rpbmcgb2YgSS9PIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgcG1fZ2VucGRfZGV2X3Bvd2Vyb2ZmX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkOworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdlbnBkLT5zdXNwZW5kX3Bvd2VyX29mZikKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBwbV9nZW5lcmljX3Bvd2Vyb2ZmX25vaXJxKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpCisJICAgICYmIGdlbnBkLT5hY3RpdmVfd2FrZXVwICYmIGdlbnBkLT5hY3RpdmVfd2FrZXVwKGRldikpCisJCXJldHVybiAwOworCisJaWYgKGdlbnBkLT5zdG9wX2RldmljZSkKKwkJZ2VucGQtPnN0b3BfZGV2aWNlKGRldik7CisKKwkvKgorCSAqIFNpbmNlIGFsbCBvZiB0aGUgIm5vaXJxIiBjYWxsYmFja3MgYXJlIGV4ZWN1dGVkIHNlcXVlbnRpYWxseSwgaXQgaXMKKwkgKiBndWFyYW50ZWVkIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIG5ldmVyIHJ1biB0d2ljZSBpbiBwYXJhbGxlbCBmb3IKKwkgKiB0aGUgc2FtZSBQTSBkb21haW4sIHNvIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIGxvY2tpbmcgaGVyZS4KKwkgKi8KKwlnZW5wZC0+c3VzcGVuZGVkX2NvdW50Kys7CisJcG1fZ2VucGRfc3luY19wb3dlcm9mZihnZW5wZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwbV9nZW5wZF9yZXN0b3JlX25vaXJxIC0gRWFybHkgcmVzdG9yZSBvZiBhIGRldmljZSBmcm9tIGFuIEkvTyBwb3dlciBkb21haW4uCisgKiBAZGV2OiBEZXZpY2UgdG8gcmVzdW1lLgorICoKKyAqIENhcnJ5IG91dCBhbiBlYXJseSByZXN0b3JlIG9mIGEgZGV2aWNlIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXRzCisgKiBwbV9kb21haW4gZmllbGQgcG9pbnRzIHRvIHRoZSBkb21haW4gbWVtYmVyIG9mIGFuIG9iamVjdCBvZiB0eXBlCisgKiBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gcmVwcmVzZW50aW5nIGEgcG93ZXIgZG9tYWluIGNvbnNpc3Rpbmcgb2YgSS9PCisgKiBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IHBtX2dlbnBkX3Jlc3RvcmVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBTaW5jZSBhbGwgb2YgdGhlICJub2lycSIgY2FsbGJhY2tzIGFyZSBleGVjdXRlZCBzZXF1ZW50aWFsbHksIGl0IGlzCisJICogZ3VhcmFudGVlZCB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciBydW4gdHdpY2UgaW4gcGFyYWxsZWwgZm9yCisJICogdGhlIHNhbWUgUE0gZG9tYWluLCBzbyBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSBsb2NraW5nIGhlcmUuCisJICovCisJZ2VucGQtPnN0YXR1cyA9IEdQRF9TVEFURV9QT1dFUl9PRkY7CisJaWYgKGdlbnBkLT5zdXNwZW5kX3Bvd2VyX29mZikgeworCQkvKgorCQkgKiBUaGUgYm9vdCBrZXJuZWwgbWlnaHQgcHV0IHRoZSBkb21haW4gaW50byB0aGUgcG93ZXIgb24gc3RhdGUsCisJCSAqIHNvIG1ha2Ugc3VyZSBpdCByZWFsbHkgaXMgcG93ZXJlZCBvZmYuCisJCSAqLworCQlpZiAoZ2VucGQtPnBvd2VyX29mZikKKwkJCWdlbnBkLT5wb3dlcl9vZmYoZ2VucGQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwbV9nZW5wZF9wb3dlcm9uKGdlbnBkKTsKKwlnZW5wZC0+c3VzcGVuZGVkX2NvdW50LS07CisJaWYgKGdlbnBkLT5zdGFydF9kZXZpY2UpCisJCWdlbnBkLT5zdGFydF9kZXZpY2UoZGV2KTsKKworCXJldHVybiBwbV9nZW5lcmljX3Jlc3RvcmVfbm9pcnEoZGV2KTsKK30KKworLyoqCisgKiBwbV9nZW5wZF9yZXN0b3JlIC0gUmVzdG9yZSBhIGRldmljZSBiZWxvbmdpbmcgdG8gYW4gSS9PIHBvd2VyIGRvbWFpbi4KKyAqIEBkZXY6IERldmljZSB0byByZXN1bWUuCisgKgorICogUmVzdG9yZSBhIGRldmljZSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0cyBwbV9kb21haW4gZmllbGQgcG9pbnRzIHRvIHRoZQorICogZG9tYWluIG1lbWJlciBvZiBhbiBvYmplY3Qgb2YgdHlwZSBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gcmVwcmVzZW50aW5nCisgKiBhIHBvd2VyIGRvbWFpbiBjb25zaXN0aW5nIG9mIEkvTyBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IHBtX2dlbnBkX3Jlc3RvcmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQ7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGdlbnBkLT5zdXNwZW5kX3Bvd2VyX29mZiA/IDAgOiBwbV9nZW5lcmljX3Jlc3RvcmUoZGV2KTsKK30KKworLyoqCisgKiBwbV9nZW5wZF9jb21wbGV0ZSAtIENvbXBsZXRlIHBvd2VyIHRyYW5zaXRpb24gb2YgYSBkZXZpY2UgaW4gYSBwb3dlciBkb21haW4uCisgKiBAZGV2OiBEZXZpY2UgdG8gY29tcGxldGUgdGhlIHRyYW5zaXRpb24gb2YuCisgKgorICogQ29tcGxldGUgYSBwb3dlciB0cmFuc2l0aW9uIG9mIGEgZGV2aWNlIChkdXJpbmcgYSBzeXN0ZW0td2lkZSBwb3dlcgorICogdHJhbnNpdGlvbikgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBpdHMgcG1fZG9tYWluIGZpZWxkIHBvaW50cyB0byB0aGUKKyAqIGRvbWFpbiBtZW1iZXIgb2YgYW4gb2JqZWN0IG9mIHR5cGUgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluIHJlcHJlc2VudGluZworICogYSBwb3dlciBkb21haW4gY29uc2lzdGluZyBvZiBJL08gZGV2aWNlcy4KKyAqLworc3RhdGljIHZvaWQgcG1fZ2VucGRfY29tcGxldGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQ7CisJYm9vbCBydW5fY29tcGxldGU7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWdlbnBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihnZW5wZCkpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmdlbnBkLT5sb2NrKTsKKworCXJ1bl9jb21wbGV0ZSA9ICFnZW5wZC0+c3VzcGVuZF9wb3dlcl9vZmY7CisJaWYgKC0tZ2VucGQtPnByZXBhcmVkX2NvdW50ID09IDApCisJCWdlbnBkLT5zdXNwZW5kX3Bvd2VyX29mZiA9IGZhbHNlOworCisJbXV0ZXhfdW5sb2NrKCZnZW5wZC0+bG9jayk7CisKKwlpZiAocnVuX2NvbXBsZXRlKSB7CisJCXBtX2dlbmVyaWNfY29tcGxldGUoZGV2KTsKKwkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CisJCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisJCXBtX3J1bnRpbWVfaWRsZShkZXYpOworCX0KK30KKworI2Vsc2UKKworI2RlZmluZSBwbV9nZW5wZF9wcmVwYXJlCQlOVUxMCisjZGVmaW5lIHBtX2dlbnBkX3N1c3BlbmQJCU5VTEwKKyNkZWZpbmUgcG1fZ2VucGRfc3VzcGVuZF9ub2lycQkJTlVMTAorI2RlZmluZSBwbV9nZW5wZF9yZXN1bWVfbm9pcnEJCU5VTEwKKyNkZWZpbmUgcG1fZ2VucGRfcmVzdW1lCQkJTlVMTAorI2RlZmluZSBwbV9nZW5wZF9mcmVlemUJCQlOVUxMCisjZGVmaW5lIHBtX2dlbnBkX2ZyZWV6ZV9ub2lycQkJTlVMTAorI2RlZmluZSBwbV9nZW5wZF90aGF3X25vaXJxCQlOVUxMCisjZGVmaW5lIHBtX2dlbnBkX3RoYXcJCQlOVUxMCisjZGVmaW5lIHBtX2dlbnBkX2Rldl9wb3dlcm9mZl9ub2lycQlOVUxMCisjZGVmaW5lIHBtX2dlbnBkX2Rldl9wb3dlcm9mZgkJTlVMTAorI2RlZmluZSBwbV9nZW5wZF9yZXN0b3JlX25vaXJxCQlOVUxMCisjZGVmaW5lIHBtX2dlbnBkX3Jlc3RvcmUJCU5VTEwKKyNkZWZpbmUgcG1fZ2VucGRfY29tcGxldGUJCU5VTEwKKworI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCisvKioKKyAqIHBtX2dlbnBkX2FkZF9kZXZpY2UgLSBBZGQgYSBkZXZpY2UgdG8gYW4gSS9PIFBNIGRvbWFpbi4KKyAqIEBnZW5wZDogUE0gZG9tYWluIHRvIGFkZCB0aGUgZGV2aWNlIHRvLgorICogQGRldjogRGV2aWNlIHRvIGJlIGFkZGVkLgorICovCitpbnQgcG1fZ2VucGRfYWRkX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9saXN0X2VudHJ5ICpkbGU7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmIChJU19FUlJfT1JfTlVMTChnZW5wZCkgfHwgSVNfRVJSX09SX05VTEwoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlnZW5wZF9hY3F1aXJlX2xvY2soZ2VucGQpOworCisJaWYgKGdlbnBkLT5zdGF0dXMgPT0gR1BEX1NUQVRFX1BPV0VSX09GRikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZ2VucGQtPnByZXBhcmVkX2NvdW50ID4gMCkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRsZSwgJmdlbnBkLT5kZXZfbGlzdCwgbm9kZSkKKwkJaWYgKGRsZS0+ZGV2ID09IGRldikgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwlkbGUgPSBremFsbG9jKHNpemVvZigqZGxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkbGUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZGxlLT5kZXYgPSBkZXY7CisJZGxlLT5uZWVkX3Jlc3RvcmUgPSBmYWxzZTsKKwlsaXN0X2FkZF90YWlsKCZkbGUtPm5vZGUsICZnZW5wZC0+ZGV2X2xpc3QpOworCWdlbnBkLT5kZXZpY2VfY291bnQrKzsKKworCXNwaW5fbG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CisJZGV2LT5wbV9kb21haW4gPSAmZ2VucGQtPmRvbWFpbjsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CisKKyBvdXQ6CisJZ2VucGRfcmVsZWFzZV9sb2NrKGdlbnBkKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcG1fZ2VucGRfcmVtb3ZlX2RldmljZSAtIFJlbW92ZSBhIGRldmljZSBmcm9tIGFuIEkvTyBQTSBkb21haW4uCisgKiBAZ2VucGQ6IFBNIGRvbWFpbiB0byByZW1vdmUgdGhlIGRldmljZSBmcm9tLgorICogQGRldjogRGV2aWNlIHRvIGJlIHJlbW92ZWQuCisgKi8KK2ludCBwbV9nZW5wZF9yZW1vdmVfZGV2aWNlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCisJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9saXN0X2VudHJ5ICpkbGU7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmIChJU19FUlJfT1JfTlVMTChnZW5wZCkgfHwgSVNfRVJSX09SX05VTEwoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlnZW5wZF9hY3F1aXJlX2xvY2soZ2VucGQpOworCisJaWYgKGdlbnBkLT5wcmVwYXJlZF9jb3VudCA+IDApIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkbGUsICZnZW5wZC0+ZGV2X2xpc3QsIG5vZGUpIHsKKwkJaWYgKGRsZS0+ZGV2ICE9IGRldikKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CisJCWRldi0+cG1fZG9tYWluID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOworCisJCWdlbnBkLT5kZXZpY2VfY291bnQtLTsKKwkJbGlzdF9kZWwoJmRsZS0+bm9kZSk7CisJCWtmcmVlKGRsZSk7CisKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCisgb3V0OgorCWdlbnBkX3JlbGVhc2VfbG9jayhnZW5wZCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHBtX2dlbnBkX2FkZF9zdWJkb21haW4gLSBBZGQgYSBzdWJkb21haW4gdG8gYW4gSS9PIFBNIGRvbWFpbi4KKyAqIEBnZW5wZDogTWFzdGVyIFBNIGRvbWFpbiB0byBhZGQgdGhlIHN1YmRvbWFpbiB0by4KKyAqIEBuZXdfc3ViZG9tYWluOiBTdWJkb21haW4gdG8gYmUgYWRkZWQuCisgKi8KK2ludCBwbV9nZW5wZF9hZGRfc3ViZG9tYWluKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCisJCQkgICBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKm5ld19zdWJkb21haW4pCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpzdWJkb21haW47CisJaW50IHJldCA9IDA7CisKKwlpZiAoSVNfRVJSX09SX05VTEwoZ2VucGQpIHx8IElTX0VSUl9PUl9OVUxMKG5ld19zdWJkb21haW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworIHN0YXJ0OgorCWdlbnBkX2FjcXVpcmVfbG9jayhnZW5wZCk7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJm5ld19zdWJkb21haW4tPmxvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKworCWlmIChuZXdfc3ViZG9tYWluLT5zdGF0dXMgIT0gR1BEX1NUQVRFX1BPV0VSX09GRgorCSAgICAmJiBuZXdfc3ViZG9tYWluLT5zdGF0dXMgIT0gR1BEX1NUQVRFX0FDVElWRSkgeworCQltdXRleF91bmxvY2soJm5ld19zdWJkb21haW4tPmxvY2spOworCQlnZW5wZF9yZWxlYXNlX2xvY2soZ2VucGQpOworCQlnb3RvIHN0YXJ0OworCX0KKworCWlmIChnZW5wZC0+c3RhdHVzID09IEdQRF9TVEFURV9QT1dFUl9PRkYKKwkgICAgJiYgIG5ld19zdWJkb21haW4tPnN0YXR1cyAhPSBHUERfU1RBVEVfUE9XRVJfT0ZGKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ViZG9tYWluLCAmZ2VucGQtPnNkX2xpc3QsIHNkX25vZGUpIHsKKwkJaWYgKHN1YmRvbWFpbiA9PSBuZXdfc3ViZG9tYWluKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlsaXN0X2FkZF90YWlsKCZuZXdfc3ViZG9tYWluLT5zZF9ub2RlLCAmZ2VucGQtPnNkX2xpc3QpOworCW5ld19zdWJkb21haW4tPnBhcmVudCA9IGdlbnBkOworCWlmIChzdWJkb21haW4tPnN0YXR1cyAhPSBHUERfU1RBVEVfUE9XRVJfT0ZGKQorCQlnZW5wZC0+c2RfY291bnQrKzsKKworIG91dDoKKwltdXRleF91bmxvY2soJm5ld19zdWJkb21haW4tPmxvY2spOworCWdlbnBkX3JlbGVhc2VfbG9jayhnZW5wZCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHBtX2dlbnBkX3JlbW92ZV9zdWJkb21haW4gLSBSZW1vdmUgYSBzdWJkb21haW4gZnJvbSBhbiBJL08gUE0gZG9tYWluLgorICogQGdlbnBkOiBNYXN0ZXIgUE0gZG9tYWluIHRvIHJlbW92ZSB0aGUgc3ViZG9tYWluIGZyb20uCisgKiBAdGFyZ2V0OiBTdWJkb21haW4gdG8gYmUgcmVtb3ZlZC4KKyAqLworaW50IHBtX2dlbnBkX3JlbW92ZV9zdWJkb21haW4oc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKKwkJCSAgICAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqdGFyZ2V0KQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqc3ViZG9tYWluOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGdlbnBkKSB8fCBJU19FUlJfT1JfTlVMTCh0YXJnZXQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworIHN0YXJ0OgorCWdlbnBkX2FjcXVpcmVfbG9jayhnZW5wZCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YmRvbWFpbiwgJmdlbnBkLT5zZF9saXN0LCBzZF9ub2RlKSB7CisJCWlmIChzdWJkb21haW4gIT0gdGFyZ2V0KQorCQkJY29udGludWU7CisKKwkJbXV0ZXhfbG9ja19uZXN0ZWQoJnN1YmRvbWFpbi0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCisJCWlmIChzdWJkb21haW4tPnN0YXR1cyAhPSBHUERfU1RBVEVfUE9XRVJfT0ZGCisJCSAgICAmJiBzdWJkb21haW4tPnN0YXR1cyAhPSBHUERfU1RBVEVfQUNUSVZFKSB7CisJCQltdXRleF91bmxvY2soJnN1YmRvbWFpbi0+bG9jayk7CisJCQlnZW5wZF9yZWxlYXNlX2xvY2soZ2VucGQpOworCQkJZ290byBzdGFydDsKKwkJfQorCisJCWxpc3RfZGVsKCZzdWJkb21haW4tPnNkX25vZGUpOworCQlzdWJkb21haW4tPnBhcmVudCA9IE5VTEw7CisJCWlmIChzdWJkb21haW4tPnN0YXR1cyAhPSBHUERfU1RBVEVfUE9XRVJfT0ZGKQorCQkJZ2VucGRfc2RfY291bnRlcl9kZWMoZ2VucGQpOworCisJCW11dGV4X3VubG9jaygmc3ViZG9tYWluLT5sb2NrKTsKKworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwlnZW5wZF9yZWxlYXNlX2xvY2soZ2VucGQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBwbV9nZW5wZF9pbml0IC0gSW5pdGlhbGl6ZSBhIGdlbmVyaWMgSS9PIFBNIGRvbWFpbiBvYmplY3QuCisgKiBAZ2VucGQ6IFBNIGRvbWFpbiBvYmplY3QgdG8gaW5pdGlhbGl6ZS4KKyAqIEBnb3Y6IFBNIGRvbWFpbiBnb3Zlcm5vciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgZG9tYWluIChtYXkgYmUgTlVMTCkuCisgKiBAaXNfb2ZmOiBJbml0aWFsIHZhbHVlIG9mIHRoZSBkb21haW4ncyBwb3dlcl9pc19vZmYgZmllbGQuCisgKi8KK3ZvaWQgcG1fZ2VucGRfaW5pdChzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAorCQkgICBzdHJ1Y3QgZGV2X3Bvd2VyX2dvdmVybm9yICpnb3YsIGJvb2wgaXNfb2ZmKQoreworCWlmIChJU19FUlJfT1JfTlVMTChnZW5wZCkpCisJCXJldHVybjsKKworCUlOSVRfTElTVF9IRUFEKCZnZW5wZC0+c2Rfbm9kZSk7CisJZ2VucGQtPnBhcmVudCA9IE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJmdlbnBkLT5kZXZfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmdlbnBkLT5zZF9saXN0KTsKKwltdXRleF9pbml0KCZnZW5wZC0+bG9jayk7CisJZ2VucGQtPmdvdiA9IGdvdjsKKwlJTklUX1dPUksoJmdlbnBkLT5wb3dlcl9vZmZfd29yaywgZ2VucGRfcG93ZXJfb2ZmX3dvcmtfZm4pOworCWdlbnBkLT5pbl9wcm9ncmVzcyA9IDA7CisJZ2VucGQtPnNkX2NvdW50ID0gMDsKKwlnZW5wZC0+c3RhdHVzID0gaXNfb2ZmID8gR1BEX1NUQVRFX1BPV0VSX09GRiA6IEdQRF9TVEFURV9BQ1RJVkU7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZ2VucGQtPnN0YXR1c193YWl0X3F1ZXVlKTsKKwlnZW5wZC0+cG93ZXJvZmZfdGFzayA9IE5VTEw7CisJZ2VucGQtPnJlc3VtZV9jb3VudCA9IDA7CisJZ2VucGQtPmRldmljZV9jb3VudCA9IDA7CisJZ2VucGQtPnN1c3BlbmRlZF9jb3VudCA9IDA7CisJZ2VucGQtPmRvbWFpbi5vcHMucnVudGltZV9zdXNwZW5kID0gcG1fZ2VucGRfcnVudGltZV9zdXNwZW5kOworCWdlbnBkLT5kb21haW4ub3BzLnJ1bnRpbWVfcmVzdW1lID0gcG1fZ2VucGRfcnVudGltZV9yZXN1bWU7CisJZ2VucGQtPmRvbWFpbi5vcHMucnVudGltZV9pZGxlID0gcG1fZ2VuZXJpY19ydW50aW1lX2lkbGU7CisJZ2VucGQtPmRvbWFpbi5vcHMucHJlcGFyZSA9IHBtX2dlbnBkX3ByZXBhcmU7CisJZ2VucGQtPmRvbWFpbi5vcHMuc3VzcGVuZCA9IHBtX2dlbnBkX3N1c3BlbmQ7CisJZ2VucGQtPmRvbWFpbi5vcHMuc3VzcGVuZF9ub2lycSA9IHBtX2dlbnBkX3N1c3BlbmRfbm9pcnE7CisJZ2VucGQtPmRvbWFpbi5vcHMucmVzdW1lX25vaXJxID0gcG1fZ2VucGRfcmVzdW1lX25vaXJxOworCWdlbnBkLT5kb21haW4ub3BzLnJlc3VtZSA9IHBtX2dlbnBkX3Jlc3VtZTsKKwlnZW5wZC0+ZG9tYWluLm9wcy5mcmVlemUgPSBwbV9nZW5wZF9mcmVlemU7CisJZ2VucGQtPmRvbWFpbi5vcHMuZnJlZXplX25vaXJxID0gcG1fZ2VucGRfZnJlZXplX25vaXJxOworCWdlbnBkLT5kb21haW4ub3BzLnRoYXdfbm9pcnEgPSBwbV9nZW5wZF90aGF3X25vaXJxOworCWdlbnBkLT5kb21haW4ub3BzLnRoYXcgPSBwbV9nZW5wZF90aGF3OworCWdlbnBkLT5kb21haW4ub3BzLnBvd2Vyb2ZmID0gcG1fZ2VucGRfZGV2X3Bvd2Vyb2ZmOworCWdlbnBkLT5kb21haW4ub3BzLnBvd2Vyb2ZmX25vaXJxID0gcG1fZ2VucGRfZGV2X3Bvd2Vyb2ZmX25vaXJxOworCWdlbnBkLT5kb21haW4ub3BzLnJlc3RvcmVfbm9pcnEgPSBwbV9nZW5wZF9yZXN0b3JlX25vaXJxOworCWdlbnBkLT5kb21haW4ub3BzLnJlc3RvcmUgPSBwbV9nZW5wZF9yZXN0b3JlOworCWdlbnBkLT5kb21haW4ub3BzLmNvbXBsZXRlID0gcG1fZ2VucGRfY29tcGxldGU7CisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CisJbGlzdF9hZGQoJmdlbnBkLT5ncGRfbGlzdF9ub2RlLCAmZ3BkX2xpc3QpOworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7Cit9CisKKy8qKgorICogcG1fZ2VucGRfcG93ZXJvZmZfdW51c2VkIC0gUG93ZXIgb2ZmIGFsbCBQTSBkb21haW5zIHdpdGggbm8gZGV2aWNlcyBpbiB1c2UuCisgKi8KK3ZvaWQgcG1fZ2VucGRfcG93ZXJvZmZfdW51c2VkKHZvaWQpCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZDsKKworCW11dGV4X2xvY2soJmdwZF9saXN0X2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShnZW5wZCwgJmdwZF9saXN0LCBncGRfbGlzdF9ub2RlKQorCQlnZW5wZF9xdWV1ZV9wb3dlcl9vZmZfd29yayhnZW5wZCk7CisKKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL2dlbmVyaWNfb3BzLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvZ2VuZXJpY19vcHMuYwppbmRleCBjYjNiYjM2Li45NTA4ZGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZ2VuZXJpY19vcHMuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvZ2VuZXJpY19vcHMuYwpAQCAtOTQsMTIgKzk0LDEzIEBACiAgKiBfX3BtX2dlbmVyaWNfY2FsbCAtIEdlbmVyaWMgc3VzcGVuZC9mcmVlemUvcG93ZXJvZmYvdGhhdyBzdWJzeXN0ZW0gY2FsbGJhY2suCiAgKiBAZGV2OiBEZXZpY2UgdG8gaGFuZGxlLgogICogQGV2ZW50OiBQTSB0cmFuc2l0aW9uIG9mIHRoZSBzeXN0ZW0gdW5kZXIgd2F5LgorICogQGJvb2w6IFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgdGhlICJub2lycSIgc3RhZ2UuCiAgKgogICogSWYgdGhlIGRldmljZSBoYXMgbm90IGJlZW4gc3VzcGVuZGVkIGF0IHJ1biB0aW1lLCBleGVjdXRlIHRoZQogICogc3VzcGVuZC9mcmVlemUvcG93ZXJvZmYvdGhhdyBjYWxsYmFjayBwcm92aWRlZCBieSBpdHMgZHJpdmVyLCBpZiBkZWZpbmVkLCBhbmQKICAqIHJldHVybiBpdHMgZXJyb3IgY29kZS4gIE90aGVyd2lzZSwgcmV0dXJuIHplcm8uCiAgKi8KLXN0YXRpYyBpbnQgX19wbV9nZW5lcmljX2NhbGwoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZXZlbnQpCitzdGF0aWMgaW50IF9fcG1fZ2VuZXJpY19jYWxsKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGV2ZW50LCBib29sIG5vaXJxKQogewogCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbSA9IGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPnBtIDogTlVMTDsKIAlpbnQgKCpjYWxsYmFjaykoc3RydWN0IGRldmljZSAqKTsKQEAgLTEwOSwxNiArMTEwLDE2IEBACiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBQTV9FVkVOVF9TVVNQRU5EOgotCQljYWxsYmFjayA9IHBtLT5zdXNwZW5kOworCQljYWxsYmFjayA9IG5vaXJxID8gcG0tPnN1c3BlbmRfbm9pcnEgOiBwbS0+c3VzcGVuZDsKIAkJYnJlYWs7CiAJY2FzZSBQTV9FVkVOVF9GUkVFWkU6Ci0JCWNhbGxiYWNrID0gcG0tPmZyZWV6ZTsKKwkJY2FsbGJhY2sgPSBub2lycSA/IHBtLT5mcmVlemVfbm9pcnEgOiBwbS0+ZnJlZXplOwogCQlicmVhazsKIAljYXNlIFBNX0VWRU5UX0hJQkVSTkFURToKLQkJY2FsbGJhY2sgPSBwbS0+cG93ZXJvZmY7CisJCWNhbGxiYWNrID0gbm9pcnEgPyBwbS0+cG93ZXJvZmZfbm9pcnEgOiBwbS0+cG93ZXJvZmY7CiAJCWJyZWFrOwogCWNhc2UgUE1fRVZFTlRfVEhBVzoKLQkJY2FsbGJhY2sgPSBwbS0+dGhhdzsKKwkJY2FsbGJhY2sgPSBub2lycSA/IHBtLT50aGF3X25vaXJxIDogcG0tPnRoYXc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWNhbGxiYWNrID0gTlVMTDsKQEAgLTEyOSw0MiArMTMwLDgyIEBACiB9CiAKIC8qKgorICogcG1fZ2VuZXJpY19zdXNwZW5kX25vaXJxIC0gR2VuZXJpYyBzdXNwZW5kX25vaXJxIGNhbGxiYWNrIGZvciBzdWJzeXN0ZW1zLgorICogQGRldjogRGV2aWNlIHRvIHN1c3BlbmQuCisgKi8KK2ludCBwbV9nZW5lcmljX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBfX3BtX2dlbmVyaWNfY2FsbChkZXYsIFBNX0VWRU5UX1NVU1BFTkQsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1fZ2VuZXJpY19zdXNwZW5kX25vaXJxKTsKKworLyoqCiAgKiBwbV9nZW5lcmljX3N1c3BlbmQgLSBHZW5lcmljIHN1c3BlbmQgY2FsbGJhY2sgZm9yIHN1YnN5c3RlbXMuCiAgKiBAZGV2OiBEZXZpY2UgdG8gc3VzcGVuZC4KICAqLwogaW50IHBtX2dlbmVyaWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIF9fcG1fZ2VuZXJpY19jYWxsKGRldiwgUE1fRVZFTlRfU1VTUEVORCk7CisJcmV0dXJuIF9fcG1fZ2VuZXJpY19jYWxsKGRldiwgUE1fRVZFTlRfU1VTUEVORCwgZmFsc2UpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1fZ2VuZXJpY19zdXNwZW5kKTsKIAogLyoqCisgKiBwbV9nZW5lcmljX2ZyZWV6ZV9ub2lycSAtIEdlbmVyaWMgZnJlZXplX25vaXJxIGNhbGxiYWNrIGZvciBzdWJzeXN0ZW1zLgorICogQGRldjogRGV2aWNlIHRvIGZyZWV6ZS4KKyAqLworaW50IHBtX2dlbmVyaWNfZnJlZXplX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX19wbV9nZW5lcmljX2NhbGwoZGV2LCBQTV9FVkVOVF9GUkVFWkUsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1fZ2VuZXJpY19mcmVlemVfbm9pcnEpOworCisvKioKICAqIHBtX2dlbmVyaWNfZnJlZXplIC0gR2VuZXJpYyBmcmVlemUgY2FsbGJhY2sgZm9yIHN1YnN5c3RlbXMuCiAgKiBAZGV2OiBEZXZpY2UgdG8gZnJlZXplLgogICovCiBpbnQgcG1fZ2VuZXJpY19mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBfX3BtX2dlbmVyaWNfY2FsbChkZXYsIFBNX0VWRU5UX0ZSRUVaRSk7CisJcmV0dXJuIF9fcG1fZ2VuZXJpY19jYWxsKGRldiwgUE1fRVZFTlRfRlJFRVpFLCBmYWxzZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbV9nZW5lcmljX2ZyZWV6ZSk7CiAKIC8qKgorICogcG1fZ2VuZXJpY19wb3dlcm9mZl9ub2lycSAtIEdlbmVyaWMgcG93ZXJvZmZfbm9pcnEgY2FsbGJhY2sgZm9yIHN1YnN5c3RlbXMuCisgKiBAZGV2OiBEZXZpY2UgdG8gaGFuZGxlLgorICovCitpbnQgcG1fZ2VuZXJpY19wb3dlcm9mZl9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIF9fcG1fZ2VuZXJpY19jYWxsKGRldiwgUE1fRVZFTlRfSElCRVJOQVRFLCB0cnVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtX2dlbmVyaWNfcG93ZXJvZmZfbm9pcnEpOworCisvKioKICAqIHBtX2dlbmVyaWNfcG93ZXJvZmYgLSBHZW5lcmljIHBvd2Vyb2ZmIGNhbGxiYWNrIGZvciBzdWJzeXN0ZW1zLgogICogQGRldjogRGV2aWNlIHRvIGhhbmRsZS4KICAqLwogaW50IHBtX2dlbmVyaWNfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBfX3BtX2dlbmVyaWNfY2FsbChkZXYsIFBNX0VWRU5UX0hJQkVSTkFURSk7CisJcmV0dXJuIF9fcG1fZ2VuZXJpY19jYWxsKGRldiwgUE1fRVZFTlRfSElCRVJOQVRFLCBmYWxzZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbV9nZW5lcmljX3Bvd2Vyb2ZmKTsKIAogLyoqCisgKiBwbV9nZW5lcmljX3RoYXdfbm9pcnEgLSBHZW5lcmljIHRoYXdfbm9pcnEgY2FsbGJhY2sgZm9yIHN1YnN5c3RlbXMuCisgKiBAZGV2OiBEZXZpY2UgdG8gdGhhdy4KKyAqLworaW50IHBtX2dlbmVyaWNfdGhhd19ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIF9fcG1fZ2VuZXJpY19jYWxsKGRldiwgUE1fRVZFTlRfVEhBVywgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbV9nZW5lcmljX3RoYXdfbm9pcnEpOworCisvKioKICAqIHBtX2dlbmVyaWNfdGhhdyAtIEdlbmVyaWMgdGhhdyBjYWxsYmFjayBmb3Igc3Vic3lzdGVtcy4KICAqIEBkZXY6IERldmljZSB0byB0aGF3LgogICovCiBpbnQgcG1fZ2VuZXJpY190aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gX19wbV9nZW5lcmljX2NhbGwoZGV2LCBQTV9FVkVOVF9USEFXKTsKKwlyZXR1cm4gX19wbV9nZW5lcmljX2NhbGwoZGV2LCBQTV9FVkVOVF9USEFXLCBmYWxzZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbV9nZW5lcmljX3RoYXcpOwogCkBAIC0xNzIsMTIgKzIxMywxMyBAQAogICogX19wbV9nZW5lcmljX3Jlc3VtZSAtIEdlbmVyaWMgcmVzdW1lL3Jlc3RvcmUgY2FsbGJhY2sgZm9yIHN1YnN5c3RlbXMuCiAgKiBAZGV2OiBEZXZpY2UgdG8gaGFuZGxlLgogICogQGV2ZW50OiBQTSB0cmFuc2l0aW9uIG9mIHRoZSBzeXN0ZW0gdW5kZXIgd2F5LgorICogQGJvb2w6IFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgdGhlICJub2lycSIgc3RhZ2UuCiAgKgogICogRXhlY3V0ZSB0aGUgcmVzdW1lL3Jlc290cmUgY2FsbGJhY2sgcHJvdmlkZWQgYnkgdGhlIEBkZXYncyBkcml2ZXIsIGlmCiAgKiBkZWZpbmVkLiAgSWYgaXQgcmV0dXJucyAwLCBjaGFuZ2UgdGhlIGRldmljZSdzIHJ1bnRpbWUgUE0gc3RhdHVzIHRvICdhY3RpdmUnLgogICogUmV0dXJuIHRoZSBjYWxsYmFjaydzIGVycm9yIGNvZGUuCiAgKi8KLXN0YXRpYyBpbnQgX19wbV9nZW5lcmljX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBldmVudCkKK3N0YXRpYyBpbnQgX19wbV9nZW5lcmljX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBldmVudCwgYm9vbCBub2lycSkKIHsKIAljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5wbSA6IE5VTEw7CiAJaW50ICgqY2FsbGJhY2spKHN0cnVjdCBkZXZpY2UgKik7CkBAIC0xODgsMTAgKzIzMCwxMCBAQAogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgUE1fRVZFTlRfUkVTVU1FOgotCQljYWxsYmFjayA9IHBtLT5yZXN1bWU7CisJCWNhbGxiYWNrID0gbm9pcnEgPyBwbS0+cmVzdW1lX25vaXJxIDogcG0tPnJlc3VtZTsKIAkJYnJlYWs7CiAJY2FzZSBQTV9FVkVOVF9SRVNUT1JFOgotCQljYWxsYmFjayA9IHBtLT5yZXN0b3JlOworCQljYWxsYmFjayA9IG5vaXJxID8gcG0tPnJlc3RvcmVfbm9pcnEgOiBwbS0+cmVzdG9yZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJY2FsbGJhY2sgPSBOVUxMOwpAQCAtMjAyLDcgKzI0NCw3IEBACiAJCXJldHVybiAwOwogCiAJcmV0ID0gY2FsbGJhY2soZGV2KTsKLQlpZiAoIXJldCAmJiBwbV9ydW50aW1lX2VuYWJsZWQoZGV2KSkgeworCWlmICghcmV0ICYmICFub2lycSAmJiBwbV9ydW50aW1lX2VuYWJsZWQoZGV2KSkgewogCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKIAkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CiAJCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CkBAIC0yMTIsMjIgKzI1NCw0MiBAQAogfQogCiAvKioKKyAqIHBtX2dlbmVyaWNfcmVzdW1lX25vaXJxIC0gR2VuZXJpYyByZXN1bWVfbm9pcnEgY2FsbGJhY2sgZm9yIHN1YnN5c3RlbXMuCisgKiBAZGV2OiBEZXZpY2UgdG8gcmVzdW1lLgorICovCitpbnQgcG1fZ2VuZXJpY19yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBfX3BtX2dlbmVyaWNfcmVzdW1lKGRldiwgUE1fRVZFTlRfUkVTVU1FLCB0cnVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtX2dlbmVyaWNfcmVzdW1lX25vaXJxKTsKKworLyoqCiAgKiBwbV9nZW5lcmljX3Jlc3VtZSAtIEdlbmVyaWMgcmVzdW1lIGNhbGxiYWNrIGZvciBzdWJzeXN0ZW1zLgogICogQGRldjogRGV2aWNlIHRvIHJlc3VtZS4KICAqLwogaW50IHBtX2dlbmVyaWNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gX19wbV9nZW5lcmljX3Jlc3VtZShkZXYsIFBNX0VWRU5UX1JFU1VNRSk7CisJcmV0dXJuIF9fcG1fZ2VuZXJpY19yZXN1bWUoZGV2LCBQTV9FVkVOVF9SRVNVTUUsIGZhbHNlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtX2dlbmVyaWNfcmVzdW1lKTsKIAogLyoqCisgKiBwbV9nZW5lcmljX3Jlc3RvcmVfbm9pcnEgLSBHZW5lcmljIHJlc3RvcmVfbm9pcnEgY2FsbGJhY2sgZm9yIHN1YnN5c3RlbXMuCisgKiBAZGV2OiBEZXZpY2UgdG8gcmVzdG9yZS4KKyAqLworaW50IHBtX2dlbmVyaWNfcmVzdG9yZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIF9fcG1fZ2VuZXJpY19yZXN1bWUoZGV2LCBQTV9FVkVOVF9SRVNUT1JFLCB0cnVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtX2dlbmVyaWNfcmVzdG9yZV9ub2lycSk7CisKKy8qKgogICogcG1fZ2VuZXJpY19yZXN0b3JlIC0gR2VuZXJpYyByZXN0b3JlIGNhbGxiYWNrIGZvciBzdWJzeXN0ZW1zLgogICogQGRldjogRGV2aWNlIHRvIHJlc3RvcmUuCiAgKi8KIGludCBwbV9nZW5lcmljX3Jlc3RvcmUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBfX3BtX2dlbmVyaWNfcmVzdW1lKGRldiwgUE1fRVZFTlRfUkVTVE9SRSk7CisJcmV0dXJuIF9fcG1fZ2VuZXJpY19yZXN1bWUoZGV2LCBQTV9FVkVOVF9SRVNUT1JFLCBmYWxzZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbV9nZW5lcmljX3Jlc3RvcmUpOwogCkBAIC0yNTYsMTEgKzMxOCwxNyBAQAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCS5wcmVwYXJlID0gcG1fZ2VuZXJpY19wcmVwYXJlLAogCS5zdXNwZW5kID0gcG1fZ2VuZXJpY19zdXNwZW5kLAorCS5zdXNwZW5kX25vaXJxID0gcG1fZ2VuZXJpY19zdXNwZW5kX25vaXJxLAogCS5yZXN1bWUgPSBwbV9nZW5lcmljX3Jlc3VtZSwKKwkucmVzdW1lX25vaXJxID0gcG1fZ2VuZXJpY19yZXN1bWVfbm9pcnEsCiAJLmZyZWV6ZSA9IHBtX2dlbmVyaWNfZnJlZXplLAorCS5mcmVlemVfbm9pcnEgPSBwbV9nZW5lcmljX2ZyZWV6ZV9ub2lycSwKIAkudGhhdyA9IHBtX2dlbmVyaWNfdGhhdywKKwkudGhhd19ub2lycSA9IHBtX2dlbmVyaWNfdGhhd19ub2lycSwKIAkucG93ZXJvZmYgPSBwbV9nZW5lcmljX3Bvd2Vyb2ZmLAorCS5wb3dlcm9mZl9ub2lycSA9IHBtX2dlbmVyaWNfcG93ZXJvZmZfbm9pcnEsCiAJLnJlc3RvcmUgPSBwbV9nZW5lcmljX3Jlc3RvcmUsCisJLnJlc3RvcmVfbm9pcnEgPSBwbV9nZW5lcmljX3Jlc3RvcmVfbm9pcnEsCiAJLmNvbXBsZXRlID0gcG1fZ2VuZXJpY19jb21wbGV0ZSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwppbmRleCBhYTYzMjAyMC4uYTg1NDU5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCkBAIC01Nyw3ICs1Nyw4IEBACiAgKi8KIHZvaWQgZGV2aWNlX3BtX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQogewotCWRldi0+cG93ZXIuaW5fc3VzcGVuZCA9IGZhbHNlOworCWRldi0+cG93ZXIuaXNfcHJlcGFyZWQgPSBmYWxzZTsKKwlkZXYtPnBvd2VyLmlzX3N1c3BlbmRlZCA9IGZhbHNlOwogCWluaXRfY29tcGxldGlvbigmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAJZGV2LT5wb3dlci53YWtldXAgPSBOVUxMOwpAQCAtOTEsNyArOTIsNyBAQAogCXByX2RlYnVnKCJQTTogQWRkaW5nIGluZm8gZm9yICVzOiVzXG4iLAogCQkgZGV2LT5idXMgPyBkZXYtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXYpKTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwotCWlmIChkZXYtPnBhcmVudCAmJiBkZXYtPnBhcmVudC0+cG93ZXIuaW5fc3VzcGVuZCkKKwlpZiAoZGV2LT5wYXJlbnQgJiYgZGV2LT5wYXJlbnQtPnBvd2VyLmlzX3ByZXBhcmVkKQogCQlkZXZfd2FybihkZXYsICJwYXJlbnQgJXMgc2hvdWxkIG5vdCBiZSBzbGVlcGluZ1xuIiwKIAkJCWRldl9uYW1lKGRldi0+cGFyZW50KSk7CiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9saXN0KTsKQEAgLTQyNCw5ICs0MjUsOSBAQAogCVRSQUNFX0RFVklDRShkZXYpOwogCVRSQUNFX1JFU1VNRSgwKTsKIAotCWlmIChkZXYtPnB3cl9kb21haW4pIHsKKwlpZiAoZGV2LT5wbV9kb21haW4pIHsKIAkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAiRUFSTFkgcG93ZXIgZG9tYWluICIpOwotCQllcnJvciA9IHBtX25vaXJxX29wKGRldiwgJmRldi0+cHdyX2RvbWFpbi0+b3BzLCBzdGF0ZSk7CisJCWVycm9yID0gcG1fbm9pcnFfb3AoZGV2LCAmZGV2LT5wbV9kb21haW4tPm9wcywgc3RhdGUpOwogCX0gZWxzZSBpZiAoZGV2LT50eXBlICYmIGRldi0+dHlwZS0+cG0pIHsKIAkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAiRUFSTFkgdHlwZSAiKTsKIAkJZXJyb3IgPSBwbV9ub2lycV9vcChkZXYsIGRldi0+dHlwZS0+cG0sIHN0YXRlKTsKQEAgLTUwNCw2ICs1MDUsNyBAQAogc3RhdGljIGludCBkZXZpY2VfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCBib29sIGFzeW5jKQogewogCWludCBlcnJvciA9IDA7CisJYm9vbCBwdXQgPSBmYWxzZTsKIAogCVRSQUNFX0RFVklDRShkZXYpOwogCVRSQUNFX1JFU1VNRSgwKTsKQEAgLTUxMSwxMSArNTEzLDIxIEBACiAJZHBtX3dhaXQoZGV2LT5wYXJlbnQsIGFzeW5jKTsKIAlkZXZpY2VfbG9jayhkZXYpOwogCi0JZGV2LT5wb3dlci5pbl9zdXNwZW5kID0gZmFsc2U7CisJLyoKKwkgKiBUaGlzIGlzIGEgZmliLiAgQnV0IHdlJ2xsIGFsbG93IG5ldyBjaGlsZHJlbiB0byBiZSBhZGRlZCBiZWxvdworCSAqIGEgcmVzdW1lZCBkZXZpY2UsIGV2ZW4gaWYgdGhlIGRldmljZSBoYXNuJ3QgYmVlbiBjb21wbGV0ZWQgeWV0LgorCSAqLworCWRldi0+cG93ZXIuaXNfcHJlcGFyZWQgPSBmYWxzZTsKIAotCWlmIChkZXYtPnB3cl9kb21haW4pIHsKKwlpZiAoIWRldi0+cG93ZXIuaXNfc3VzcGVuZGVkKQorCQlnb3RvIFVubG9jazsKKworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisJcHV0ID0gdHJ1ZTsKKworCWlmIChkZXYtPnBtX2RvbWFpbikgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJwb3dlciBkb21haW4gIik7Ci0JCWVycm9yID0gcG1fb3AoZGV2LCAmZGV2LT5wd3JfZG9tYWluLT5vcHMsIHN0YXRlKTsKKwkJZXJyb3IgPSBwbV9vcChkZXYsICZkZXYtPnBtX2RvbWFpbi0+b3BzLCBzdGF0ZSk7CiAJCWdvdG8gRW5kOwogCX0KIApAQCAtNTQ4LDEwICs1NjAsMTcgQEAKIAl9CiAKICBFbmQ6CisJZGV2LT5wb3dlci5pc19zdXNwZW5kZWQgPSBmYWxzZTsKKworIFVubG9jazoKIAlkZXZpY2VfdW5sb2NrKGRldik7CiAJY29tcGxldGVfYWxsKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOwogCiAJVFJBQ0VfUkVTVU1FKGVycm9yKTsKKworCWlmIChwdXQpCisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKKwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNjMwLDEwICs2NDksMTAgQEAKIHsKIAlkZXZpY2VfbG9jayhkZXYpOwogCi0JaWYgKGRldi0+cHdyX2RvbWFpbikgeworCWlmIChkZXYtPnBtX2RvbWFpbikgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJjb21wbGV0aW5nIHBvd2VyIGRvbWFpbiAiKTsKLQkJaWYgKGRldi0+cHdyX2RvbWFpbi0+b3BzLmNvbXBsZXRlKQotCQkJZGV2LT5wd3JfZG9tYWluLT5vcHMuY29tcGxldGUoZGV2KTsKKwkJaWYgKGRldi0+cG1fZG9tYWluLT5vcHMuY29tcGxldGUpCisJCQlkZXYtPnBtX2RvbWFpbi0+b3BzLmNvbXBsZXRlKGRldik7CiAJfSBlbHNlIGlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJjb21wbGV0aW5nIHR5cGUgIik7CiAJCWlmIChkZXYtPnR5cGUtPnBtLT5jb21wbGV0ZSkKQEAgLTY3MCw3ICs2ODksNyBAQAogCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX3ByZXBhcmVkX2xpc3QucHJldik7CiAKIAkJZ2V0X2RldmljZShkZXYpOwotCQlkZXYtPnBvd2VyLmluX3N1c3BlbmQgPSBmYWxzZTsKKwkJZGV2LT5wb3dlci5pc19wcmVwYXJlZCA9IGZhbHNlOwogCQlsaXN0X21vdmUoJmRldi0+cG93ZXIuZW50cnksICZsaXN0KTsKIAkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCkBAIC03MzMsOSArNzUyLDkgQEAKIHsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoZGV2LT5wd3JfZG9tYWluKSB7CisJaWYgKGRldi0+cG1fZG9tYWluKSB7CiAJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgIkxBVEUgcG93ZXIgZG9tYWluICIpOwotCQllcnJvciA9IHBtX25vaXJxX29wKGRldiwgJmRldi0+cHdyX2RvbWFpbi0+b3BzLCBzdGF0ZSk7CisJCWVycm9yID0gcG1fbm9pcnFfb3AoZGV2LCAmZGV2LT5wbV9kb21haW4tPm9wcywgc3RhdGUpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CiAJfSBlbHNlIGlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkgewpAQCAtODMyLDE5ICs4NTEsMjUgQEAKIAlpbnQgZXJyb3IgPSAwOwogCiAJZHBtX3dhaXRfZm9yX2NoaWxkcmVuKGRldiwgYXN5bmMpOwotCWRldmljZV9sb2NrKGRldik7CiAKIAlpZiAoYXN5bmNfZXJyb3IpCi0JCWdvdG8gRW5kOworCQlyZXR1cm4gMDsKKworCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGRldik7CisJaWYgKHBtX3J1bnRpbWVfYmFycmllcihkZXYpICYmIGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCXBtX3dha2V1cF9ldmVudChkZXYsIDApOwogCiAJaWYgKHBtX3dha2V1cF9wZW5kaW5nKCkpIHsKKwkJcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOwogCQlhc3luY19lcnJvciA9IC1FQlVTWTsKLQkJZ290byBFbmQ7CisJCXJldHVybiAwOwogCX0KIAotCWlmIChkZXYtPnB3cl9kb21haW4pIHsKKwlkZXZpY2VfbG9jayhkZXYpOworCisJaWYgKGRldi0+cG1fZG9tYWluKSB7CiAJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgInBvd2VyIGRvbWFpbiAiKTsKLQkJZXJyb3IgPSBwbV9vcChkZXYsICZkZXYtPnB3cl9kb21haW4tPm9wcywgc3RhdGUpOworCQllcnJvciA9IHBtX29wKGRldiwgJmRldi0+cG1fZG9tYWluLT5vcHMsIHN0YXRlKTsKIAkJZ290byBFbmQ7CiAJfQogCkBAIC04NzcsMTEgKzkwMiwxNyBAQAogCX0KIAogIEVuZDoKKwlkZXYtPnBvd2VyLmlzX3N1c3BlbmRlZCA9ICFlcnJvcjsKKwogCWRldmljZV91bmxvY2soZGV2KTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAKLQlpZiAoZXJyb3IpCisJaWYgKGVycm9yKSB7CisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKIAkJYXN5bmNfZXJyb3IgPSBlcnJvcjsKKwl9IGVsc2UgaWYgKGRldi0+cG93ZXIuaXNfc3VzcGVuZGVkKSB7CisJCV9fcG1fcnVudGltZV9kaXNhYmxlKGRldiwgZmFsc2UpOworCX0KIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTk2OCwxMSArOTk5LDExIEBACiAKIAlkZXZpY2VfbG9jayhkZXYpOwogCi0JaWYgKGRldi0+cHdyX2RvbWFpbikgeworCWlmIChkZXYtPnBtX2RvbWFpbikgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJwcmVwYXJpbmcgcG93ZXIgZG9tYWluICIpOwotCQlpZiAoZGV2LT5wd3JfZG9tYWluLT5vcHMucHJlcGFyZSkKLQkJCWVycm9yID0gZGV2LT5wd3JfZG9tYWluLT5vcHMucHJlcGFyZShkZXYpOwotCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZGV2LT5wd3JfZG9tYWluLT5vcHMucHJlcGFyZSwgZXJyb3IpOworCQlpZiAoZGV2LT5wbV9kb21haW4tPm9wcy5wcmVwYXJlKQorCQkJZXJyb3IgPSBkZXYtPnBtX2RvbWFpbi0+b3BzLnByZXBhcmUoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRldi0+cG1fZG9tYWluLT5vcHMucHJlcGFyZSwgZXJyb3IpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIEVuZDsKIAl9IGVsc2UgaWYgKGRldi0+dHlwZSAmJiBkZXYtPnR5cGUtPnBtKSB7CkBAIC0xMDIxLDEzICsxMDUyLDcgQEAKIAkJZ2V0X2RldmljZShkZXYpOwogCQltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAKLQkJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKLQkJaWYgKHBtX3J1bnRpbWVfYmFycmllcihkZXYpICYmIGRldmljZV9tYXlfd2FrZXVwKGRldikpCi0JCQlwbV93YWtldXBfZXZlbnQoZGV2LCAwKTsKLQotCQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7Ci0JCWVycm9yID0gcG1fd2FrZXVwX3BlbmRpbmcoKSA/Ci0JCQkJLUVCVVNZIDogZGV2aWNlX3ByZXBhcmUoZGV2LCBzdGF0ZSk7CisJCWVycm9yID0gZGV2aWNlX3ByZXBhcmUoZGV2LCBzdGF0ZSk7CiAKIAkJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAkJaWYgKGVycm9yKSB7CkBAIC0xMDQyLDcgKzEwNjcsNyBAQAogCQkJcHV0X2RldmljZShkZXYpOwogCQkJYnJlYWs7CiAJCX0KLQkJZGV2LT5wb3dlci5pbl9zdXNwZW5kID0gdHJ1ZTsKKwkJZGV2LT5wb3dlci5pc19wcmVwYXJlZCA9IHRydWU7CiAJCWlmICghbGlzdF9lbXB0eSgmZGV2LT5wb3dlci5lbnRyeSkpCiAJCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9wcmVwYXJlZF9saXN0KTsKIAkJcHV0X2RldmljZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jCmluZGV4IDU2YTY4OTkuLjVjYzEyMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwLmMKQEAgLTYyNSw0ICs2MjUsMjEgQEAKIAogCXJldHVybiAwOwogfQorCisvKioKKyAqIG9wcF9mcmVlX2NwdWZyZXFfdGFibGUoKSAtIGZyZWUgdGhlIGNwdWZyZXEgdGFibGUKKyAqIEBkZXY6CWRldmljZSBmb3Igd2hpY2ggd2UgZG8gdGhpcyBvcGVyYXRpb24KKyAqIEB0YWJsZToJdGFibGUgdG8gZnJlZQorICoKKyAqIEZyZWUgdXAgdGhlIHRhYmxlIGFsbG9jYXRlZCBieSBvcHBfaW5pdF9jcHVmcmVxX3RhYmxlCisgKi8KK3ZvaWQgb3BwX2ZyZWVfY3B1ZnJlcV90YWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICoqdGFibGUpCit7CisJaWYgKCF0YWJsZSkKKwkJcmV0dXJuOworCisJa2ZyZWUoKnRhYmxlKTsKKwkqdGFibGUgPSBOVUxMOworfQogI2VuZGlmCQkvKiBDT05GSUdfQ1BVX0ZSRVEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCmluZGV4IDBkNDU4N2IuLjhkYzI0N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBkcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jIC0gSGVscGVyIGZ1bmN0aW9ucyBmb3IgZGV2aWNlIHJ1bi10aW1lIFBNCisgKiBkcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jIC0gSGVscGVyIGZ1bmN0aW9ucyBmb3IgZGV2aWNlIHJ1bnRpbWUgUE0KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmFmYWVsIEouIFd5c29ja2kgPHJqd0BzaXNrLnBsPiwgTm92ZWxsIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAxMCBBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1PgpAQCAtMTM1LDggKzEzNSw5IEBACiAKIAlpZiAoZGV2LT5wb3dlci5ydW50aW1lX2Vycm9yKQogCQlyZXR2YWwgPSAtRUlOVkFMOwotCWVsc2UgaWYgKGF0b21pY19yZWFkKCZkZXYtPnBvd2VyLnVzYWdlX2NvdW50KSA+IDAKLQkgICAgfHwgZGV2LT5wb3dlci5kaXNhYmxlX2RlcHRoID4gMCkKKwllbHNlIGlmIChkZXYtPnBvd2VyLmRpc2FibGVfZGVwdGggPiAwKQorCQlyZXR2YWwgPSAtRUFDQ0VTOworCWVsc2UgaWYgKGF0b21pY19yZWFkKCZkZXYtPnBvd2VyLnVzYWdlX2NvdW50KSA+IDApCiAJCXJldHZhbCA9IC1FQUdBSU47CiAJZWxzZSBpZiAoIXBtX2NoaWxkcmVuX3N1c3BlbmRlZChkZXYpKQogCQlyZXR2YWwgPSAtRUJVU1k7CkBAIC0xNTgsNyArMTU5LDcgQEAKICAqIEBkZXY6IERldmljZSB0byBub3RpZnkgdGhlIGJ1cyB0eXBlIGFib3V0LgogICogQHJwbWZsYWdzOiBGbGFnIGJpdHMuCiAgKgotICogQ2hlY2sgaWYgdGhlIGRldmljZSdzIHJ1bi10aW1lIFBNIHN0YXR1cyBhbGxvd3MgaXQgdG8gYmUgc3VzcGVuZGVkLiAgSWYKKyAqIENoZWNrIGlmIHRoZSBkZXZpY2UncyBydW50aW1lIFBNIHN0YXR1cyBhbGxvd3MgaXQgdG8gYmUgc3VzcGVuZGVkLiAgSWYKICAqIGFub3RoZXIgaWRsZSBub3RpZmljYXRpb24gaGFzIGJlZW4gc3RhcnRlZCBlYXJsaWVyLCByZXR1cm4gaW1tZWRpYXRlbHkuICBJZgogICogdGhlIFJQTV9BU1lOQyBmbGFnIGlzIHNldCB0aGVuIHF1ZXVlIGFuIGlkbGUtbm90aWZpY2F0aW9uIHJlcXVlc3Q7IG90aGVyd2lzZQogICogcnVuIHRoZSAtPnJ1bnRpbWVfaWRsZSgpIGNhbGxiYWNrIGRpcmVjdGx5LgpAQCAtMjEzLDggKzIxNCw4IEBACiAKIAlkZXYtPnBvd2VyLmlkbGVfbm90aWZpY2F0aW9uID0gdHJ1ZTsKIAotCWlmIChkZXYtPnB3cl9kb21haW4pCi0JCWNhbGxiYWNrID0gZGV2LT5wd3JfZG9tYWluLT5vcHMucnVudGltZV9pZGxlOworCWlmIChkZXYtPnBtX2RvbWFpbikKKwkJY2FsbGJhY2sgPSBkZXYtPnBtX2RvbWFpbi0+b3BzLnJ1bnRpbWVfaWRsZTsKIAllbHNlIGlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5wbSkKIAkJY2FsbGJhY2sgPSBkZXYtPnR5cGUtPnBtLT5ydW50aW1lX2lkbGU7CiAJZWxzZSBpZiAoZGV2LT5jbGFzcyAmJiBkZXYtPmNsYXNzLT5wbSkKQEAgLTI2MiwxNSArMjYzLDE1IEBACiAJCXNwaW5fbG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CiAJfQogCWRldi0+cG93ZXIucnVudGltZV9lcnJvciA9IHJldHZhbDsKLQlyZXR1cm4gcmV0dmFsOworCXJldHVybiByZXR2YWwgIT0gLUVBQ0NFUyA/IHJldHZhbCA6IC1FSU87CiB9CiAKIC8qKgotICogcnBtX3N1c3BlbmQgLSBDYXJyeSBvdXQgcnVuLXRpbWUgc3VzcGVuZCBvZiBnaXZlbiBkZXZpY2UuCisgKiBycG1fc3VzcGVuZCAtIENhcnJ5IG91dCBydW50aW1lIHN1c3BlbmQgb2YgZ2l2ZW4gZGV2aWNlLgogICogQGRldjogRGV2aWNlIHRvIHN1c3BlbmQuCiAgKiBAcnBtZmxhZ3M6IEZsYWcgYml0cy4KICAqCi0gKiBDaGVjayBpZiB0aGUgZGV2aWNlJ3MgcnVuLXRpbWUgUE0gc3RhdHVzIGFsbG93cyBpdCB0byBiZSBzdXNwZW5kZWQuICBJZgorICogQ2hlY2sgaWYgdGhlIGRldmljZSdzIHJ1bnRpbWUgUE0gc3RhdHVzIGFsbG93cyBpdCB0byBiZSBzdXNwZW5kZWQuICBJZgogICogYW5vdGhlciBzdXNwZW5kIGhhcyBiZWVuIHN0YXJ0ZWQgZWFybGllciwgZWl0aGVyIHJldHVybiBpbW1lZGlhdGVseSBvciB3YWl0CiAgKiBmb3IgaXQgdG8gZmluaXNoLCBkZXBlbmRpbmcgb24gdGhlIFJQTV9OT1dBSVQgYW5kIFJQTV9BU1lOQyBmbGFncy4gIENhbmNlbCBhCiAgKiBwZW5kaW5nIGlkbGUgbm90aWZpY2F0aW9uLiAgSWYgdGhlIFJQTV9BU1lOQyBmbGFnIGlzIHNldCB0aGVuIHF1ZXVlIGEKQEAgLTM3NCw4ICszNzUsOCBAQAogCiAJX191cGRhdGVfcnVudGltZV9zdGF0dXMoZGV2LCBSUE1fU1VTUEVORElORyk7CiAKLQlpZiAoZGV2LT5wd3JfZG9tYWluKQotCQljYWxsYmFjayA9IGRldi0+cHdyX2RvbWFpbi0+b3BzLnJ1bnRpbWVfc3VzcGVuZDsKKwlpZiAoZGV2LT5wbV9kb21haW4pCisJCWNhbGxiYWNrID0gZGV2LT5wbV9kb21haW4tPm9wcy5ydW50aW1lX3N1c3BlbmQ7CiAJZWxzZSBpZiAoZGV2LT50eXBlICYmIGRldi0+dHlwZS0+cG0pCiAJCWNhbGxiYWNrID0gZGV2LT50eXBlLT5wbS0+cnVudGltZV9zdXNwZW5kOwogCWVsc2UgaWYgKGRldi0+Y2xhc3MgJiYgZGV2LT5jbGFzcy0+cG0pCkBAIC0zODgsNyArMzg5LDcgQEAKIAlyZXR2YWwgPSBycG1fY2FsbGJhY2soY2FsbGJhY2ssIGRldik7CiAJaWYgKHJldHZhbCkgewogCQlfX3VwZGF0ZV9ydW50aW1lX3N0YXR1cyhkZXYsIFJQTV9BQ1RJVkUpOwotCQlkZXYtPnBvd2VyLmRlZmVycmVkX3Jlc3VtZSA9IDA7CisJCWRldi0+cG93ZXIuZGVmZXJyZWRfcmVzdW1lID0gZmFsc2U7CiAJCWlmIChyZXR2YWwgPT0gLUVBR0FJTiB8fCByZXR2YWwgPT0gLUVCVVNZKQogCQkJZGV2LT5wb3dlci5ydW50aW1lX2Vycm9yID0gMDsKIAkJZWxzZQpAQCAtNDI5LDExICs0MzAsMTEgQEAKIH0KIAogLyoqCi0gKiBycG1fcmVzdW1lIC0gQ2Fycnkgb3V0IHJ1bi10aW1lIHJlc3VtZSBvZiBnaXZlbiBkZXZpY2UuCisgKiBycG1fcmVzdW1lIC0gQ2Fycnkgb3V0IHJ1bnRpbWUgcmVzdW1lIG9mIGdpdmVuIGRldmljZS4KICAqIEBkZXY6IERldmljZSB0byByZXN1bWUuCiAgKiBAcnBtZmxhZ3M6IEZsYWcgYml0cy4KICAqCi0gKiBDaGVjayBpZiB0aGUgZGV2aWNlJ3MgcnVuLXRpbWUgUE0gc3RhdHVzIGFsbG93cyBpdCB0byBiZSByZXN1bWVkLiAgQ2FuY2VsCisgKiBDaGVjayBpZiB0aGUgZGV2aWNlJ3MgcnVudGltZSBQTSBzdGF0dXMgYWxsb3dzIGl0IHRvIGJlIHJlc3VtZWQuICBDYW5jZWwKICAqIGFueSBzY2hlZHVsZWQgb3IgcGVuZGluZyByZXF1ZXN0cy4gIElmIGFub3RoZXIgcmVzdW1lIGhhcyBiZWVuIHN0YXJ0ZWQKICAqIGVhcmxpZXIsIGVpdGhlciByZXR1cm4gaW1tZWRpYXRlbHkgb3Igd2FpdCBmb3IgaXQgdG8gZmluaXNoLCBkZXBlbmRpbmcgb24gdGhlCiAgKiBSUE1fTk9XQUlUIGFuZCBSUE1fQVNZTkMgZmxhZ3MuICBTaW1pbGFybHksIGlmIHRoZXJlJ3MgYSBzdXNwZW5kIHJ1bm5pbmcgaW4KQEAgLTQ1OCw3ICs0NTksNyBAQAogCWlmIChkZXYtPnBvd2VyLnJ1bnRpbWVfZXJyb3IpCiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJZWxzZSBpZiAoZGV2LT5wb3dlci5kaXNhYmxlX2RlcHRoID4gMCkKLQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJcmV0dmFsID0gLUVBQ0NFUzsKIAlpZiAocmV0dmFsKQogCQlnb3RvIG91dDsKIApAQCAtNTUwLDcgKzU1MSw3IEBACiAKIAkJc3Bpbl9sb2NrKCZwYXJlbnQtPnBvd2VyLmxvY2spOwogCQkvKgotCQkgKiBXZSBjYW4gcmVzdW1lIGlmIHRoZSBwYXJlbnQncyBydW4tdGltZSBQTSBpcyBkaXNhYmxlZCBvciBpdAorCQkgKiBXZSBjYW4gcmVzdW1lIGlmIHRoZSBwYXJlbnQncyBydW50aW1lIFBNIGlzIGRpc2FibGVkIG9yIGl0CiAJCSAqIGlzIHNldCB0byBpZ25vcmUgY2hpbGRyZW4uCiAJCSAqLwogCQlpZiAoIXBhcmVudC0+cG93ZXIuZGlzYWJsZV9kZXB0aApAQCAtNTczLDggKzU3NCw4IEBACiAKIAlfX3VwZGF0ZV9ydW50aW1lX3N0YXR1cyhkZXYsIFJQTV9SRVNVTUlORyk7CiAKLQlpZiAoZGV2LT5wd3JfZG9tYWluKQotCQljYWxsYmFjayA9IGRldi0+cHdyX2RvbWFpbi0+b3BzLnJ1bnRpbWVfcmVzdW1lOworCWlmIChkZXYtPnBtX2RvbWFpbikKKwkJY2FsbGJhY2sgPSBkZXYtPnBtX2RvbWFpbi0+b3BzLnJ1bnRpbWVfcmVzdW1lOwogCWVsc2UgaWYgKGRldi0+dHlwZSAmJiBkZXYtPnR5cGUtPnBtKQogCQljYWxsYmFjayA9IGRldi0+dHlwZS0+cG0tPnJ1bnRpbWVfcmVzdW1lOwogCWVsc2UgaWYgKGRldi0+Y2xhc3MgJiYgZGV2LT5jbGFzcy0+cG0pCkBAIC02MTQsMTEgKzYxNSwxMSBAQAogfQogCiAvKioKLSAqIHBtX3J1bnRpbWVfd29yayAtIFVuaXZlcnNhbCBydW4tdGltZSBQTSB3b3JrIGZ1bmN0aW9uLgorICogcG1fcnVudGltZV93b3JrIC0gVW5pdmVyc2FsIHJ1bnRpbWUgUE0gd29yayBmdW5jdGlvbi4KICAqIEB3b3JrOiBXb3JrIHN0cnVjdHVyZSB1c2VkIGZvciBzY2hlZHVsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBmdW5jdGlvbi4KICAqCiAgKiBVc2UgQHdvcmsgdG8gZ2V0IHRoZSBkZXZpY2Ugb2JqZWN0IHRoZSB3b3JrIGlzIHRvIGJlIGRvbmUgZm9yLCBkZXRlcm1pbmUgd2hhdAotICogaXMgdG8gYmUgZG9uZSBhbmQgZXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgcnVuLXRpbWUgUE0gZnVuY3Rpb24uCisgKiBpcyB0byBiZSBkb25lIGFuZCBleGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBydW50aW1lIFBNIGZ1bmN0aW9uLgogICovCiBzdGF0aWMgdm9pZCBwbV9ydW50aW1lX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewpAQCAtNzE3LDcgKzcxOCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChwbV9zY2hlZHVsZV9zdXNwZW5kKTsKIAogLyoqCi0gKiBfX3BtX3J1bnRpbWVfaWRsZSAtIEVudHJ5IHBvaW50IGZvciBydW4tdGltZSBpZGxlIG9wZXJhdGlvbnMuCisgKiBfX3BtX3J1bnRpbWVfaWRsZSAtIEVudHJ5IHBvaW50IGZvciBydW50aW1lIGlkbGUgb3BlcmF0aW9ucy4KICAqIEBkZXY6IERldmljZSB0byBzZW5kIGlkbGUgbm90aWZpY2F0aW9uIGZvci4KICAqIEBycG1mbGFnczogRmxhZyBiaXRzLgogICoKQEAgLTc0Niw3ICs3NDcsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoX19wbV9ydW50aW1lX2lkbGUpOwogCiAvKioKLSAqIF9fcG1fcnVudGltZV9zdXNwZW5kIC0gRW50cnkgcG9pbnQgZm9yIHJ1bi10aW1lIHB1dC9zdXNwZW5kIG9wZXJhdGlvbnMuCisgKiBfX3BtX3J1bnRpbWVfc3VzcGVuZCAtIEVudHJ5IHBvaW50IGZvciBydW50aW1lIHB1dC9zdXNwZW5kIG9wZXJhdGlvbnMuCiAgKiBAZGV2OiBEZXZpY2UgdG8gc3VzcGVuZC4KICAqIEBycG1mbGFnczogRmxhZyBiaXRzLgogICoKQEAgLTc3NSw3ICs3NzYsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoX19wbV9ydW50aW1lX3N1c3BlbmQpOwogCiAvKioKLSAqIF9fcG1fcnVudGltZV9yZXN1bWUgLSBFbnRyeSBwb2ludCBmb3IgcnVuLXRpbWUgcmVzdW1lIG9wZXJhdGlvbnMuCisgKiBfX3BtX3J1bnRpbWVfcmVzdW1lIC0gRW50cnkgcG9pbnQgZm9yIHJ1bnRpbWUgcmVzdW1lIG9wZXJhdGlvbnMuCiAgKiBAZGV2OiBEZXZpY2UgdG8gcmVzdW1lLgogICogQHJwbWZsYWdzOiBGbGFnIGJpdHMuCiAgKgpAQCAtODAxLDExICs4MDIsMTEgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKF9fcG1fcnVudGltZV9yZXN1bWUpOwogCiAvKioKLSAqIF9fcG1fcnVudGltZV9zZXRfc3RhdHVzIC0gU2V0IHJ1bi10aW1lIFBNIHN0YXR1cyBvZiBhIGRldmljZS4KKyAqIF9fcG1fcnVudGltZV9zZXRfc3RhdHVzIC0gU2V0IHJ1bnRpbWUgUE0gc3RhdHVzIG9mIGEgZGV2aWNlLgogICogQGRldjogRGV2aWNlIHRvIGhhbmRsZS4KLSAqIEBzdGF0dXM6IE5ldyBydW4tdGltZSBQTSBzdGF0dXMgb2YgdGhlIGRldmljZS4KKyAqIEBzdGF0dXM6IE5ldyBydW50aW1lIFBNIHN0YXR1cyBvZiB0aGUgZGV2aWNlLgogICoKLSAqIElmIHJ1bi10aW1lIFBNIG9mIHRoZSBkZXZpY2UgaXMgZGlzYWJsZWQgb3IgaXRzIHBvd2VyLnJ1bnRpbWVfZXJyb3IgZmllbGQgaXMKKyAqIElmIHJ1bnRpbWUgUE0gb2YgdGhlIGRldmljZSBpcyBkaXNhYmxlZCBvciBpdHMgcG93ZXIucnVudGltZV9lcnJvciBmaWVsZCBpcwogICogZGlmZmVyZW50IGZyb20gemVybywgdGhlIHN0YXR1cyBtYXkgYmUgY2hhbmdlZCBlaXRoZXIgdG8gUlBNX0FDVElWRSwgb3IgdG8KICAqIFJQTV9TVVNQRU5ERUQsIGFzIGxvbmcgYXMgdGhhdCByZWZsZWN0cyB0aGUgYWN0dWFsIHN0YXRlIG9mIHRoZSBkZXZpY2UuCiAgKiBIb3dldmVyLCBpZiB0aGUgZGV2aWNlIGhhcyBhIHBhcmVudCBhbmQgdGhlIHBhcmVudCBpcyBub3QgYWN0aXZlLCBhbmQgdGhlCkBAIC04NTEsNyArODUyLDcgQEAKIAogCQkvKgogCQkgKiBJdCBpcyBpbnZhbGlkIHRvIHB1dCBhbiBhY3RpdmUgY2hpbGQgdW5kZXIgYSBwYXJlbnQgdGhhdCBpcwotCQkgKiBub3QgYWN0aXZlLCBoYXMgcnVuLXRpbWUgUE0gZW5hYmxlZCBhbmQgdGhlCisJCSAqIG5vdCBhY3RpdmUsIGhhcyBydW50aW1lIFBNIGVuYWJsZWQgYW5kIHRoZQogCQkgKiAncG93ZXIuaWdub3JlX2NoaWxkcmVuJyBmbGFnIHVuc2V0LgogCQkgKi8KIAkJaWYgKCFwYXJlbnQtPnBvd2VyLmRpc2FibGVfZGVwdGgKQEAgLTg4NSw3ICs4ODYsNyBAQAogICogQGRldjogRGV2aWNlIHRvIGhhbmRsZS4KICAqCiAgKiBGbHVzaCBhbGwgcGVuZGluZyByZXF1ZXN0cyBmb3IgdGhlIGRldmljZSBmcm9tIHBtX3dxIGFuZCB3YWl0IGZvciBhbGwKLSAqIHJ1bi10aW1lIFBNIG9wZXJhdGlvbnMgaW52b2x2aW5nIHRoZSBkZXZpY2UgaW4gcHJvZ3Jlc3MgdG8gY29tcGxldGUuCisgKiBydW50aW1lIFBNIG9wZXJhdGlvbnMgaW52b2x2aW5nIHRoZSBkZXZpY2UgaW4gcHJvZ3Jlc3MgdG8gY29tcGxldGUuCiAgKgogICogU2hvdWxkIGJlIGNhbGxlZCB1bmRlciBkZXYtPnBvd2VyLmxvY2sgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgogICovCkBAIC05MzMsNyArOTM0LDcgQEAKICAqIFByZXZlbnQgdGhlIGRldmljZSBmcm9tIGJlaW5nIHN1c3BlbmRlZCBieSBpbmNyZW1lbnRpbmcgaXRzIHVzYWdlIGNvdW50ZXIgYW5kCiAgKiBpZiB0aGVyZSdzIGEgcGVuZGluZyByZXN1bWUgcmVxdWVzdCBmb3IgdGhlIGRldmljZSwgd2FrZSB0aGUgZGV2aWNlIHVwLgogICogTmV4dCwgbWFrZSBzdXJlIHRoYXQgYWxsIHBlbmRpbmcgcmVxdWVzdHMgZm9yIHRoZSBkZXZpY2UgaGF2ZSBiZWVuIGZsdXNoZWQKLSAqIGZyb20gcG1fd3EgYW5kIHdhaXQgZm9yIGFsbCBydW4tdGltZSBQTSBvcGVyYXRpb25zIGludm9sdmluZyB0aGUgZGV2aWNlIGluCisgKiBmcm9tIHBtX3dxIGFuZCB3YWl0IGZvciBhbGwgcnVudGltZSBQTSBvcGVyYXRpb25zIGludm9sdmluZyB0aGUgZGV2aWNlIGluCiAgKiBwcm9ncmVzcyB0byBjb21wbGV0ZS4KICAqCiAgKiBSZXR1cm4gdmFsdWU6CkBAIC05NjMsMTggKzk2NCwxOCBAQAogRVhQT1JUX1NZTUJPTF9HUEwocG1fcnVudGltZV9iYXJyaWVyKTsKIAogLyoqCi0gKiBfX3BtX3J1bnRpbWVfZGlzYWJsZSAtIERpc2FibGUgcnVuLXRpbWUgUE0gb2YgYSBkZXZpY2UuCisgKiBfX3BtX3J1bnRpbWVfZGlzYWJsZSAtIERpc2FibGUgcnVudGltZSBQTSBvZiBhIGRldmljZS4KICAqIEBkZXY6IERldmljZSB0byBoYW5kbGUuCiAgKiBAY2hlY2tfcmVzdW1lOiBJZiBzZXQsIGNoZWNrIGlmIHRoZXJlJ3MgYSByZXN1bWUgcmVxdWVzdCBmb3IgdGhlIGRldmljZS4KICAqCiAgKiBJbmNyZW1lbnQgcG93ZXIuZGlzYWJsZV9kZXB0aCBmb3IgdGhlIGRldmljZSBhbmQgaWYgd2FzIHplcm8gcHJldmlvdXNseSwKLSAqIGNhbmNlbCBhbGwgcGVuZGluZyBydW4tdGltZSBQTSByZXF1ZXN0cyBmb3IgdGhlIGRldmljZSBhbmQgd2FpdCBmb3IgYWxsCisgKiBjYW5jZWwgYWxsIHBlbmRpbmcgcnVudGltZSBQTSByZXF1ZXN0cyBmb3IgdGhlIGRldmljZSBhbmQgd2FpdCBmb3IgYWxsCiAgKiBvcGVyYXRpb25zIGluIHByb2dyZXNzIHRvIGNvbXBsZXRlLiAgVGhlIGRldmljZSBjYW4gYmUgZWl0aGVyIGFjdGl2ZSBvcgotICogc3VzcGVuZGVkIGFmdGVyIGl0cyBydW4tdGltZSBQTSBoYXMgYmVlbiBkaXNhYmxlZC4KKyAqIHN1c3BlbmRlZCBhZnRlciBpdHMgcnVudGltZSBQTSBoYXMgYmVlbiBkaXNhYmxlZC4KICAqCiAgKiBJZiBAY2hlY2tfcmVzdW1lIGlzIHNldCBhbmQgdGhlcmUncyBhIHJlc3VtZSByZXF1ZXN0IHBlbmRpbmcgd2hlbgogICogX19wbV9ydW50aW1lX2Rpc2FibGUoKSBpcyBjYWxsZWQgYW5kIHBvd2VyLmRpc2FibGVfZGVwdGggaXMgemVybywgdGhlCi0gKiBmdW5jdGlvbiB3aWxsIHdha2UgdXAgdGhlIGRldmljZSBiZWZvcmUgZGlzYWJsaW5nIGl0cyBydW4tdGltZSBQTS4KKyAqIGZ1bmN0aW9uIHdpbGwgd2FrZSB1cCB0aGUgZGV2aWNlIGJlZm9yZSBkaXNhYmxpbmcgaXRzIHJ1bnRpbWUgUE0uCiAgKi8KIHZvaWQgX19wbV9ydW50aW1lX2Rpc2FibGUoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGNoZWNrX3Jlc3VtZSkKIHsKQEAgLTk4Nyw3ICs5ODgsNyBAQAogCiAJLyoKIAkgKiBXYWtlIHVwIHRoZSBkZXZpY2UgaWYgdGhlcmUncyBhIHJlc3VtZSByZXF1ZXN0IHBlbmRpbmcsIGJlY2F1c2UgdGhhdAotCSAqIG1lYW5zIHRoZXJlIHByb2JhYmx5IGlzIHNvbWUgSS9PIHRvIHByb2Nlc3MgYW5kIGRpc2FibGluZyBydW4tdGltZSBQTQorCSAqIG1lYW5zIHRoZXJlIHByb2JhYmx5IGlzIHNvbWUgSS9PIHRvIHByb2Nlc3MgYW5kIGRpc2FibGluZyBydW50aW1lIFBNCiAJICogc2hvdWxkbid0IHByZXZlbnQgdGhlIGRldmljZSBmcm9tIHByb2Nlc3NpbmcgdGhlIEkvTy4KIAkgKi8KIAlpZiAoY2hlY2tfcmVzdW1lICYmIGRldi0+cG93ZXIucmVxdWVzdF9wZW5kaW5nCkBAIC0xMDEyLDcgKzEwMTMsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoX19wbV9ydW50aW1lX2Rpc2FibGUpOwogCiAvKioKLSAqIHBtX3J1bnRpbWVfZW5hYmxlIC0gRW5hYmxlIHJ1bi10aW1lIFBNIG9mIGEgZGV2aWNlLgorICogcG1fcnVudGltZV9lbmFibGUgLSBFbmFibGUgcnVudGltZSBQTSBvZiBhIGRldmljZS4KICAqIEBkZXY6IERldmljZSB0byBoYW5kbGUuCiAgKi8KIHZvaWQgcG1fcnVudGltZV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMTAzMSw3ICsxMDMyLDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHBtX3J1bnRpbWVfZW5hYmxlKTsKIAogLyoqCi0gKiBwbV9ydW50aW1lX2ZvcmJpZCAtIEJsb2NrIHJ1bi10aW1lIFBNIG9mIGEgZGV2aWNlLgorICogcG1fcnVudGltZV9mb3JiaWQgLSBCbG9jayBydW50aW1lIFBNIG9mIGEgZGV2aWNlLgogICogQGRldjogRGV2aWNlIHRvIGhhbmRsZS4KICAqCiAgKiBJbmNyZWFzZSB0aGUgZGV2aWNlJ3MgdXNhZ2UgY291bnQgYW5kIGNsZWFyIGl0cyBwb3dlci5ydW50aW1lX2F1dG8gZmxhZywKQEAgLTEwNTQsNyArMTA1NSw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChwbV9ydW50aW1lX2ZvcmJpZCk7CiAKIC8qKgotICogcG1fcnVudGltZV9hbGxvdyAtIFVuYmxvY2sgcnVuLXRpbWUgUE0gb2YgYSBkZXZpY2UuCisgKiBwbV9ydW50aW1lX2FsbG93IC0gVW5ibG9jayBydW50aW1lIFBNIG9mIGEgZGV2aWNlLgogICogQGRldjogRGV2aWNlIHRvIGhhbmRsZS4KICAqCiAgKiBEZWNyZWFzZSB0aGUgZGV2aWNlJ3MgdXNhZ2UgY291bnQgYW5kIHNldCBpdHMgcG93ZXIucnVudGltZV9hdXRvIGZsYWcuCkBAIC0xMDc1LDEyICsxMDc2LDEyIEBACiBFWFBPUlRfU1lNQk9MX0dQTChwbV9ydW50aW1lX2FsbG93KTsKIAogLyoqCi0gKiBwbV9ydW50aW1lX25vX2NhbGxiYWNrcyAtIElnbm9yZSBydW4tdGltZSBQTSBjYWxsYmFja3MgZm9yIGEgZGV2aWNlLgorICogcG1fcnVudGltZV9ub19jYWxsYmFja3MgLSBJZ25vcmUgcnVudGltZSBQTSBjYWxsYmFja3MgZm9yIGEgZGV2aWNlLgogICogQGRldjogRGV2aWNlIHRvIGhhbmRsZS4KICAqCiAgKiBTZXQgdGhlIHBvd2VyLm5vX2NhbGxiYWNrcyBmbGFnLCB3aGljaCB0ZWxscyB0aGUgUE0gY29yZSB0aGF0IHRoaXMKLSAqIGRldmljZSBpcyBwb3dlci1tYW5hZ2VkIHRocm91Z2ggaXRzIHBhcmVudCBhbmQgaGFzIG5vIHJ1bi10aW1lIFBNCi0gKiBjYWxsYmFja3Mgb2YgaXRzIG93bi4gIFRoZSBydW4tdGltZSBzeXNmcyBhdHRyaWJ1dGVzIHdpbGwgYmUgcmVtb3ZlZC4KKyAqIGRldmljZSBpcyBwb3dlci1tYW5hZ2VkIHRocm91Z2ggaXRzIHBhcmVudCBhbmQgaGFzIG5vIHJ1bnRpbWUgUE0KKyAqIGNhbGxiYWNrcyBvZiBpdHMgb3duLiAgVGhlIHJ1bnRpbWUgc3lzZnMgYXR0cmlidXRlcyB3aWxsIGJlIHJlbW92ZWQuCiAgKi8KIHZvaWQgcG1fcnVudGltZV9ub19jYWxsYmFja3Moc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtMTE1Niw4ICsxMTU3LDggQEAKICAqIEBkZWxheTogVmFsdWUgb2YgdGhlIG5ldyBkZWxheSBpbiBtaWxsaXNlY29uZHMuCiAgKgogICogU2V0IHRoZSBkZXZpY2UncyBwb3dlci5hdXRvc3VzcGVuZF9kZWxheSB2YWx1ZS4gIElmIGl0IGNoYW5nZXMgdG8gbmVnYXRpdmUKLSAqIGFuZCB0aGUgcG93ZXIudXNlX2F1dG9zdXNwZW5kIGZsYWcgaXMgc2V0LCBwcmV2ZW50IHJ1bi10aW1lIHN1c3BlbmRzLiAgSWYgaXQKLSAqIGNoYW5nZXMgdGhlIG90aGVyIHdheSwgYWxsb3cgcnVuLXRpbWUgc3VzcGVuZHMuCisgKiBhbmQgdGhlIHBvd2VyLnVzZV9hdXRvc3VzcGVuZCBmbGFnIGlzIHNldCwgcHJldmVudCBydW50aW1lIHN1c3BlbmRzLiAgSWYgaXQKKyAqIGNoYW5nZXMgdGhlIG90aGVyIHdheSwgYWxsb3cgcnVudGltZSBzdXNwZW5kcy4KICAqLwogdm9pZCBwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBkZWxheSkKIHsKQEAgLTExNzcsNyArMTE3OCw3IEBACiAgKiBAZGV2OiBEZXZpY2UgdG8gaGFuZGxlLgogICogQHVzZTogTmV3IHZhbHVlIGZvciB1c2VfYXV0b3N1c3BlbmQuCiAgKgotICogU2V0IHRoZSBkZXZpY2UncyBwb3dlci51c2VfYXV0b3N1c3BlbmQgZmxhZywgYW5kIGFsbG93IG9yIHByZXZlbnQgcnVuLXRpbWUKKyAqIFNldCB0aGUgZGV2aWNlJ3MgcG93ZXIudXNlX2F1dG9zdXNwZW5kIGZsYWcsIGFuZCBhbGxvdyBvciBwcmV2ZW50IHJ1bnRpbWUKICAqIHN1c3BlbmRzIGFzIG5lZWRlZC4KICAqLwogdm9pZCBfX3BtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCB1c2UpCkBAIC0xMTk0LDcgKzExOTUsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoX19wbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCk7CiAKIC8qKgotICogcG1fcnVudGltZV9pbml0IC0gSW5pdGlhbGl6ZSBydW4tdGltZSBQTSBmaWVsZHMgaW4gZ2l2ZW4gZGV2aWNlIG9iamVjdC4KKyAqIHBtX3J1bnRpbWVfaW5pdCAtIEluaXRpYWxpemUgcnVudGltZSBQTSBmaWVsZHMgaW4gZ2l2ZW4gZGV2aWNlIG9iamVjdC4KICAqIEBkZXY6IERldmljZSBvYmplY3QgdG8gaW5pdGlhbGl6ZS4KICAqLwogdm9pZCBwbV9ydW50aW1lX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3N5c2ZzLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYwppbmRleCBhOWY1Yjg5Li45NDJkNmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYwpAQCAtMTE2LDEyICsxMTYsMTQgQEAKIAljcCA9IG1lbWNocihidWYsICdcbicsIG4pOwogCWlmIChjcCkKIAkJbGVuID0gY3AgLSBidWY7CisJZGV2aWNlX2xvY2soZGV2KTsKIAlpZiAobGVuID09IHNpemVvZiBjdHJsX2F1dG8gLSAxICYmIHN0cm5jbXAoYnVmLCBjdHJsX2F1dG8sIGxlbikgPT0gMCkKIAkJcG1fcnVudGltZV9hbGxvdyhkZXYpOwogCWVsc2UgaWYgKGxlbiA9PSBzaXplb2YgY3RybF9vbiAtIDEgJiYgc3RybmNtcChidWYsIGN0cmxfb24sIGxlbikgPT0gMCkKIAkJcG1fcnVudGltZV9mb3JiaWQoZGV2KTsKIAllbHNlCi0JCXJldHVybiAtRUlOVkFMOworCQluID0gLUVJTlZBTDsKKwlkZXZpY2VfdW5sb2NrKGRldik7CiAJcmV0dXJuIG47CiB9CiAKQEAgLTIwNSw3ICsyMDcsOSBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZkZWxheSkgIT0gMCB8fCBkZWxheSAhPSAoaW50KSBkZWxheSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlkZXZpY2VfbG9jayhkZXYpOwogCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KGRldiwgZGVsYXkpOworCWRldmljZV91bmxvY2soZGV2KTsKIAlyZXR1cm4gbjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3RyYWNlLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYwppbmRleCBjODBlMTM4Li5hZjEwYWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJdW5zaWduZWQgaW50IHZhbDsKIAogCWdldF9ydGNfdGltZSgmdGltZSk7Ci0JcHJfaW5mbygiVGltZTogJTJkOiUwMmQ6JTAyZCAgRGF0ZTogJTAyZC8lMDJkLyUwMmRcbiIsCisJcHJfaW5mbygiUlRDIHRpbWU6ICUyZDolMDJkOiUwMmQsIGRhdGU6ICUwMmQvJTAyZC8lMDJkXG4iLAogCQl0aW1lLnRtX2hvdXIsIHRpbWUudG1fbWluLCB0aW1lLnRtX3NlYywKIAkJdGltZS50bV9tb24gKyAxLCB0aW1lLnRtX21kYXksIHRpbWUudG1feWVhciAlIDEwMCk7CiAJdmFsID0gdGltZS50bV95ZWFyOwkJCQkvKiAxMDAgeWVhcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvS2NvbmZpZyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWJiZjZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9LY29uZmlnCkBAIC0wLDAgKzEsMTMgQEAKKyMgR2VuZXJpYyByZWdpc3RlciBtYXAgc3VwcG9ydC4gIFRoZXJlIGFyZSBubyB1c2VyIHNlcnZpY2FibGUgb3B0aW9ucyBoZXJlLAorIyB0aGlzIGlzIGFuIEFQSSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVyIGtlcm5lbCBzdWJzeXN0ZW1zLiAgVGhlc2UKKyMgc3Vic3lzdGVtcyBzaG91bGQgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBzeW1ib2xzLgorCitjb25maWcgUkVHTUFQCisJZGVmYXVsdCB5IGlmIChSRUdNQVBfSTJDIHx8IFJFR01BUF9TUEkpCisJYm9vbAorCitjb25maWcgUkVHTUFQX0kyQworCXRyaXN0YXRlCisKK2NvbmZpZyBSRUdNQVBfU1BJCisJdHJpc3RhdGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvTWFrZWZpbGUgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NzZmNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorb2JqLSQoQ09ORklHX1JFR01BUCkgKz0gcmVnbWFwLm8KK29iai0kKENPTkZJR19SRUdNQVBfSTJDKSArPSByZWdtYXAtaTJjLm8KK29iai0kKENPTkZJR19SRUdNQVBfU1BJKSArPSByZWdtYXAtc3BpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWkyYy5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyMzFmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWkyYy5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogUmVnaXN0ZXIgbWFwIGFjY2VzcyBBUEkgLSBJMkMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDExIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBwbGMKKyAqCisgKiBBdXRob3I6IE1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworc3RhdGljIGludCByZWdtYXBfaTJjX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSB0b19pMmNfY2xpZW50KGRldik7CisJaW50IHJldDsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChpMmMsIGRhdGEsIGNvdW50KTsKKwlpZiAocmV0ID09IGNvdW50KQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgcmVnbWFwX2kyY19nYXRoZXJfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAorCQkJCSAgIGNvbnN0IHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGkyY19tc2cgeGZlclsyXTsKKwlpbnQgcmV0OworCisJLyogSWYgdGhlIEkyQyBjb250cm9sbGVyIGNhbid0IGRvIGEgZ2F0aGVyIHRlbGwgdGhlIGNvcmUsIGl0CisJICogd2lsbCBzdWJzdGl0dXRlIGluIGEgbGluZWFyIHdyaXRlIGZvciB1cy4KKwkgKi8KKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGkyYy0+YWRhcHRlciwgSTJDX0ZVTkNfUFJPVE9DT0xfTUFOR0xJTkcpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJeGZlclswXS5hZGRyID0gaTJjLT5hZGRyOworCXhmZXJbMF0uZmxhZ3MgPSAwOworCXhmZXJbMF0ubGVuID0gcmVnX3NpemU7CisJeGZlclswXS5idWYgPSAodm9pZCAqKXJlZzsKKworCXhmZXJbMV0uYWRkciA9IGkyYy0+YWRkcjsKKwl4ZmVyWzFdLmZsYWdzID0gSTJDX01fTk9TVEFSVDsKKwl4ZmVyWzFdLmxlbiA9IHZhbF9zaXplOworCXhmZXJbMV0uYnVmID0gKHZvaWQgKil2YWw7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoaTJjLT5hZGFwdGVyLCB4ZmVyLCAyKTsKKwlpZiAocmV0ID09IDIpCisJCXJldHVybiAwOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgcmVnbWFwX2kyY19yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAorCQkJICAgdm9pZCAqdmFsLCBzaXplX3QgdmFsX3NpemUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaTJjX21zZyB4ZmVyWzJdOworCWludCByZXQ7CisKKwl4ZmVyWzBdLmFkZHIgPSBpMmMtPmFkZHI7CisJeGZlclswXS5mbGFncyA9IDA7CisJeGZlclswXS5sZW4gPSByZWdfc2l6ZTsKKwl4ZmVyWzBdLmJ1ZiA9ICh2b2lkICopcmVnOworCisJeGZlclsxXS5hZGRyID0gaTJjLT5hZGRyOworCXhmZXJbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKKwl4ZmVyWzFdLmxlbiA9IHZhbF9zaXplOworCXhmZXJbMV0uYnVmID0gdmFsOworCisJcmV0ID0gaTJjX3RyYW5zZmVyKGkyYy0+YWRhcHRlciwgeGZlciwgMik7CisJaWYgKHJldCA9PSAyKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2J1cyByZWdtYXBfaTJjID0geworCS50eXBlID0gJmkyY19idXNfdHlwZSwKKwkud3JpdGUgPSByZWdtYXBfaTJjX3dyaXRlLAorCS5nYXRoZXJfd3JpdGUgPSByZWdtYXBfaTJjX2dhdGhlcl93cml0ZSwKKwkucmVhZCA9IHJlZ21hcF9pMmNfcmVhZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKKy8qKgorICogcmVnbWFwX2luaXRfaTJjKCk6IEluaXRpYWxpc2UgcmVnaXN0ZXIgbWFwCisgKgorICogQGkyYzogRGV2aWNlIHRoYXQgd2lsbCBiZSBpbnRlcmFjdGVkIHdpdGgKKyAqIEBjb25maWc6IENvbmZpZ3VyYXRpb24gZm9yIHJlZ2lzdGVyIG1hcAorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhbiBFUlJfUFRSKCkgb24gZXJyb3Igb3IgYSB2YWxpZCBwb2ludGVyIHRvCisgKiBhIHN0cnVjdCByZWdtYXAuCisgKi8KK3N0cnVjdCByZWdtYXAgKnJlZ21hcF9pbml0X2kyYyhzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpCit7CisJcmV0dXJuIHJlZ21hcF9pbml0KCZpMmMtPmRldiwgJnJlZ21hcF9pMmMsIGNvbmZpZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdtYXBfaW5pdF9pMmMpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1zcGkuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZWJhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1zcGkuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogUmVnaXN0ZXIgbWFwIGFjY2VzcyBBUEkgLSBTUEkgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDExIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBwbGMKKyAqCisgKiBBdXRob3I6IE1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKK3N0YXRpYyBpbnQgcmVnbWFwX3NwaV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJcmV0dXJuIHNwaV93cml0ZShzcGksIGRhdGEsIGNvdW50KTsKK30KKworc3RhdGljIGludCByZWdtYXBfc3BpX2dhdGhlcl93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX2xlbiwKKwkJCQkgICBjb25zdCB2b2lkICp2YWwsIHNpemVfdCB2YWxfbGVuKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJc3RydWN0IHNwaV9tZXNzYWdlIG07CisJc3RydWN0IHNwaV90cmFuc2ZlciB0WzJdID0geyB7IC50eF9idWYgPSByZWcsIC5sZW4gPSByZWdfbGVuLCB9LAorCQkJCSAgICAgeyAudHhfYnVmID0gdmFsLCAubGVuID0gdmFsX2xlbiwgfSwgfTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzBdLCAmbSk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMV0sICZtKTsKKworCXJldHVybiBzcGlfc3luYyhzcGksICZtKTsKK30KKworc3RhdGljIGludCByZWdtYXBfc3BpX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCisJCQkgICB2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCisJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCByZWcsIHJlZ19zaXplLCB2YWwsIHZhbF9zaXplKTsKK30KKworc3RhdGljIHN0cnVjdCByZWdtYXBfYnVzIHJlZ21hcF9zcGkgPSB7CisJLnR5cGUgPSAmc3BpX2J1c190eXBlLAorCS53cml0ZSA9IHJlZ21hcF9zcGlfd3JpdGUsCisJLmdhdGhlcl93cml0ZSA9IHJlZ21hcF9zcGlfZ2F0aGVyX3dyaXRlLAorCS5yZWFkID0gcmVnbWFwX3NwaV9yZWFkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5yZWFkX2ZsYWdfbWFzayA9IDB4ODAsCit9OworCisvKioKKyAqIHJlZ21hcF9pbml0X3NwaSgpOiBJbml0aWFsaXNlIHJlZ2lzdGVyIG1hcAorICoKKyAqIEBzcGk6IERldmljZSB0aGF0IHdpbGwgYmUgaW50ZXJhY3RlZCB3aXRoCisgKiBAY29uZmlnOiBDb25maWd1cmF0aW9uIGZvciByZWdpc3RlciBtYXAKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYW4gRVJSX1BUUigpIG9uIGVycm9yIG9yIGEgdmFsaWQgcG9pbnRlciB0bworICogYSBzdHJ1Y3QgcmVnbWFwLgorICovCitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9zcGkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKQoreworCXJldHVybiByZWdtYXBfaW5pdCgmc3BpLT5kZXYsICZyZWdtYXBfc3BpLCBjb25maWcpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX2luaXRfc3BpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzU2NWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC5jCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogUmVnaXN0ZXIgbWFwIGFjY2VzcyBBUEkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKgorICogQXV0aG9yOiBNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCitzdHJ1Y3QgcmVnbWFwOworCitzdHJ1Y3QgcmVnbWFwX2Zvcm1hdCB7CisJc2l6ZV90IGJ1Zl9zaXplOworCXNpemVfdCByZWdfYnl0ZXM7CisJc2l6ZV90IHZhbF9ieXRlczsKKwl2b2lkICgqZm9ybWF0X3dyaXRlKShzdHJ1Y3QgcmVnbWFwICptYXAsCisJCQkgICAgIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpOworCXZvaWQgKCpmb3JtYXRfcmVnKSh2b2lkICpidWYsIHVuc2lnbmVkIGludCByZWcpOworCXZvaWQgKCpmb3JtYXRfdmFsKSh2b2lkICpidWYsIHVuc2lnbmVkIGludCB2YWwpOworCXVuc2lnbmVkIGludCAoKnBhcnNlX3ZhbCkodm9pZCAqYnVmKTsKK307CisKK3N0cnVjdCByZWdtYXAgeworCXN0cnVjdCBtdXRleCBsb2NrOworCisJc3RydWN0IGRldmljZSAqZGV2OyAvKiBEZXZpY2Ugd2UgZG8gSS9PIG9uICovCisJdm9pZCAqd29ya19idWY7ICAgICAvKiBTY3JhdGNoIGJ1ZmZlciB1c2VkIHRvIGZvcm1hdCBJL08gKi8KKwlzdHJ1Y3QgcmVnbWFwX2Zvcm1hdCBmb3JtYXQ7ICAvKiBCdWZmZXIgZm9ybWF0ICovCisJY29uc3Qgc3RydWN0IHJlZ21hcF9idXMgKmJ1czsKK307CisKK3N0YXRpYyB2b2lkIHJlZ21hcF9mb3JtYXRfNF8xMl93cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCV9fYmUxNiAqb3V0ID0gbWFwLT53b3JrX2J1ZjsKKwkqb3V0ID0gY3B1X3RvX2JlMTYoKHJlZyA8PCAxMikgfCB2YWwpOworfQorCitzdGF0aWMgdm9pZCByZWdtYXBfZm9ybWF0XzdfOV93cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsCisJCQkJICAgIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpCit7CisJX19iZTE2ICpvdXQgPSBtYXAtPndvcmtfYnVmOworCSpvdXQgPSBjcHVfdG9fYmUxNigocmVnIDw8IDkpIHwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgcmVnbWFwX2Zvcm1hdF84KHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1OCAqYiA9IGJ1ZjsKKworCWJbMF0gPSB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHJlZ21hcF9mb3JtYXRfMTYodm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCV9fYmUxNiAqYiA9IGJ1ZjsKKworCWJbMF0gPSBjcHVfdG9fYmUxNih2YWwpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJlZ21hcF9wYXJzZV84KHZvaWQgKmJ1ZikKK3sKKwl1OCAqYiA9IGJ1ZjsKKworCXJldHVybiBiWzBdOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJlZ21hcF9wYXJzZV8xNih2b2lkICpidWYpCit7CisJX19iZTE2ICpiID0gYnVmOworCisJYlswXSA9IGJlMTZfdG9fY3B1KGJbMF0pOworCisJcmV0dXJuIGJbMF07Cit9CisKKy8qKgorICogcmVnbWFwX2luaXQoKTogSW5pdGlhbGlzZSByZWdpc3RlciBtYXAKKyAqCisgKiBAZGV2OiBEZXZpY2UgdGhhdCB3aWxsIGJlIGludGVyYWN0ZWQgd2l0aAorICogQGJ1czogQnVzLXNwZWNpZmljIGNhbGxiYWNrcyB0byB1c2Ugd2l0aCBkZXZpY2UKKyAqIEBjb25maWc6IENvbmZpZ3VyYXRpb24gZm9yIHJlZ2lzdGVyIG1hcAorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhbiBFUlJfUFRSKCkgb24gZXJyb3Igb3IgYSB2YWxpZCBwb2ludGVyIHRvCisgKiBhIHN0cnVjdCByZWdtYXAuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBnZW5lcmFsbHkgbm90IGJlIGNhbGxlZAorICogZGlyZWN0bHksIGl0IHNob3VsZCBiZSBjYWxsZWQgYnkgYnVzLXNwZWNpZmljIGluaXQgZnVuY3Rpb25zLgorICovCitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2J1cyAqYnVzLAorCQkJICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZykKK3sKKwlzdHJ1Y3QgcmVnbWFwICptYXA7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoIWJ1cyB8fCAhY29uZmlnKQorCQlyZXR1cm4gTlVMTDsKKworCW1hcCA9IGt6YWxsb2Moc2l6ZW9mKCptYXApLCBHRlBfS0VSTkVMKTsKKwlpZiAobWFwID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJbXV0ZXhfaW5pdCgmbWFwLT5sb2NrKTsKKwltYXAtPmZvcm1hdC5idWZfc2l6ZSA9IChjb25maWctPnJlZ19iaXRzICsgY29uZmlnLT52YWxfYml0cykgLyA4OworCW1hcC0+Zm9ybWF0LnJlZ19ieXRlcyA9IGNvbmZpZy0+cmVnX2JpdHMgLyA4OworCW1hcC0+Zm9ybWF0LnZhbF9ieXRlcyA9IGNvbmZpZy0+dmFsX2JpdHMgLyA4OworCW1hcC0+ZGV2ID0gZGV2OworCW1hcC0+YnVzID0gYnVzOworCisJc3dpdGNoIChjb25maWctPnJlZ19iaXRzKSB7CisJY2FzZSA0OgorCQlzd2l0Y2ggKGNvbmZpZy0+dmFsX2JpdHMpIHsKKwkJY2FzZSAxMjoKKwkJCW1hcC0+Zm9ybWF0LmZvcm1hdF93cml0ZSA9IHJlZ21hcF9mb3JtYXRfNF8xMl93cml0ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBlcnJfbWFwOworCQl9CisJCWJyZWFrOworCisJY2FzZSA3OgorCQlzd2l0Y2ggKGNvbmZpZy0+dmFsX2JpdHMpIHsKKwkJY2FzZSA5OgorCQkJbWFwLT5mb3JtYXQuZm9ybWF0X3dyaXRlID0gcmVnbWFwX2Zvcm1hdF83Xzlfd3JpdGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyX21hcDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgODoKKwkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyA9IHJlZ21hcF9mb3JtYXRfODsKKwkJYnJlYWs7CisKKwljYXNlIDE2OgorCQltYXAtPmZvcm1hdC5mb3JtYXRfcmVnID0gcmVnbWFwX2Zvcm1hdF8xNjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlnb3RvIGVycl9tYXA7CisJfQorCisJc3dpdGNoIChjb25maWctPnZhbF9iaXRzKSB7CisJY2FzZSA4OgorCQltYXAtPmZvcm1hdC5mb3JtYXRfdmFsID0gcmVnbWFwX2Zvcm1hdF84OworCQltYXAtPmZvcm1hdC5wYXJzZV92YWwgPSByZWdtYXBfcGFyc2VfODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJbWFwLT5mb3JtYXQuZm9ybWF0X3ZhbCA9IHJlZ21hcF9mb3JtYXRfMTY7CisJCW1hcC0+Zm9ybWF0LnBhcnNlX3ZhbCA9IHJlZ21hcF9wYXJzZV8xNjsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFtYXAtPmZvcm1hdC5mb3JtYXRfd3JpdGUgJiYKKwkgICAgIShtYXAtPmZvcm1hdC5mb3JtYXRfcmVnICYmIG1hcC0+Zm9ybWF0LmZvcm1hdF92YWwpKQorCQlnb3RvIGVycl9tYXA7CisKKwltYXAtPndvcmtfYnVmID0ga21hbGxvYyhtYXAtPmZvcm1hdC5idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKG1hcC0+d29ya19idWYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9idXM7CisJfQorCisJcmV0dXJuIG1hcDsKKworZXJyX2J1czoKKwltb2R1bGVfcHV0KG1hcC0+YnVzLT5vd25lcik7CitlcnJfbWFwOgorCWtmcmVlKG1hcCk7CitlcnI6CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF9pbml0KTsKKworLyoqCisgKiByZWdtYXBfZXhpdCgpOiBGcmVlIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgcmVnaXN0ZXIgbWFwCisgKi8KK3ZvaWQgcmVnbWFwX2V4aXQoc3RydWN0IHJlZ21hcCAqbWFwKQoreworCWtmcmVlKG1hcC0+d29ya19idWYpOworCW1vZHVsZV9wdXQobWFwLT5idXMtPm93bmVyKTsKKwlrZnJlZShtYXApOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX2V4aXQpOworCitzdGF0aWMgaW50IF9yZWdtYXBfcmF3X3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKKwkJCSAgICAgY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgdmFsX2xlbikKK3sKKwl2b2lkICpidWY7CisJaW50IHJldCA9IC1FTk9UU1VQUDsKKwlzaXplX3QgbGVuOworCisJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyhtYXAtPndvcmtfYnVmLCByZWcpOworCisJLyogVHJ5IHRvIGRvIGEgZ2F0aGVyIHdyaXRlIGlmIHdlIGNhbiAqLworCWlmIChtYXAtPmJ1cy0+Z2F0aGVyX3dyaXRlKQorCQlyZXQgPSBtYXAtPmJ1cy0+Z2F0aGVyX3dyaXRlKG1hcC0+ZGV2LCBtYXAtPndvcmtfYnVmLAorCQkJCQkgICAgIG1hcC0+Zm9ybWF0LnJlZ19ieXRlcywKKwkJCQkJICAgICB2YWwsIHZhbF9sZW4pOworCisJLyogT3RoZXJ3aXNlIGZhbGwgYmFjayBvbiBsaW5lYXJpc2luZyBieSBoYW5kLiAqLworCWlmIChyZXQgPT0gLUVOT1RTVVBQKSB7CisJCWxlbiA9IG1hcC0+Zm9ybWF0LnJlZ19ieXRlcyArIHZhbF9sZW47CisJCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltZW1jcHkoYnVmLCBtYXAtPndvcmtfYnVmLCBtYXAtPmZvcm1hdC5yZWdfYnl0ZXMpOworCQltZW1jcHkoYnVmICsgbWFwLT5mb3JtYXQucmVnX2J5dGVzLCB2YWwsIHZhbF9sZW4pOworCQlyZXQgPSBtYXAtPmJ1cy0+d3JpdGUobWFwLT5kZXYsIGJ1ZiwgbGVuKTsKKworCQlrZnJlZShidWYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3JlZ21hcF93cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsCisJCQkgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlCVUdfT04oIW1hcC0+Zm9ybWF0LmZvcm1hdF93cml0ZSAmJiAhbWFwLT5mb3JtYXQuZm9ybWF0X3ZhbCk7CisKKwlpZiAobWFwLT5mb3JtYXQuZm9ybWF0X3dyaXRlKSB7CisJCW1hcC0+Zm9ybWF0LmZvcm1hdF93cml0ZShtYXAsIHJlZywgdmFsKTsKKworCQlyZXR1cm4gbWFwLT5idXMtPndyaXRlKG1hcC0+ZGV2LCBtYXAtPndvcmtfYnVmLAorCQkJCSAgICAgICBtYXAtPmZvcm1hdC5idWZfc2l6ZSk7CisJfSBlbHNlIHsKKwkJbWFwLT5mb3JtYXQuZm9ybWF0X3ZhbChtYXAtPndvcmtfYnVmICsgbWFwLT5mb3JtYXQucmVnX2J5dGVzLAorCQkJCSAgICAgICB2YWwpOworCQlyZXR1cm4gX3JlZ21hcF9yYXdfd3JpdGUobWFwLCByZWcsCisJCQkJCSBtYXAtPndvcmtfYnVmICsgbWFwLT5mb3JtYXQucmVnX2J5dGVzLAorCQkJCQkgbWFwLT5mb3JtYXQudmFsX2J5dGVzKTsKKwl9Cit9CisKKy8qKgorICogcmVnbWFwX3dyaXRlKCk6IFdyaXRlIGEgdmFsdWUgdG8gYSBzaW5nbGUgcmVnaXN0ZXIKKyAqCisgKiBAbWFwOiBSZWdpc3RlciBtYXAgdG8gd3JpdGUgdG8KKyAqIEByZWc6IFJlZ2lzdGVyIHRvIHdyaXRlIHRvCisgKiBAdmFsOiBWYWx1ZSB0byBiZSB3cml0dGVuCisgKgorICogQSB2YWx1ZSBvZiB6ZXJvIHdpbGwgYmUgcmV0dXJuZWQgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB3aWxsCisgKiBiZSByZXR1cm5lZCBpbiBlcnJvciBjYXNlcy4KKyAqLworaW50IHJlZ21hcF93cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm1hcC0+bG9jayk7CisKKwlyZXQgPSBfcmVnbWFwX3dyaXRlKG1hcCwgcmVnLCB2YWwpOworCisJbXV0ZXhfdW5sb2NrKCZtYXAtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ21hcF93cml0ZSk7CisKKy8qKgorICogcmVnbWFwX3Jhd193cml0ZSgpOiBXcml0ZSByYXcgdmFsdWVzIHRvIG9uZSBvciBtb3JlIHJlZ2lzdGVycworICoKKyAqIEBtYXA6IFJlZ2lzdGVyIG1hcCB0byB3cml0ZSB0bworICogQHJlZzogSW5pdGlhbCByZWdpc3RlciB0byB3cml0ZSB0bworICogQHZhbDogQmxvY2sgb2YgZGF0YSB0byBiZSB3cml0dGVuLCBsYWlkIG91dCBmb3IgZGlyZWN0IHRyYW5zbWlzc2lvbiB0byB0aGUKKyAqICAgICAgIGRldmljZQorICogQHZhbF9sZW46IExlbmd0aCBvZiBkYXRhIHBvaW50ZWQgdG8gYnkgdmFsLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgdGhpbmdzIGxpa2UgZmlybXdhcmUKKyAqIGRvd25sb2FkIHdoZXJlIGEgbGFyZ2UgYmxvY2sgb2YgZGF0YSBuZWVkcyB0byBiZSB0cmFuc2ZlcnJlZCB0byB0aGUKKyAqIGRldmljZS4gIE5vIGZvcm1hdHRpbmcgd2lsbCBiZSBkb25lIG9uIHRoZSBkYXRhIHByb3ZpZGVkLgorICoKKyAqIEEgdmFsdWUgb2YgemVybyB3aWxsIGJlIHJldHVybmVkIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gd2lsbAorICogYmUgcmV0dXJuZWQgaW4gZXJyb3IgY2FzZXMuCisgKi8KK2ludCByZWdtYXBfcmF3X3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKKwkJICAgICBjb25zdCB2b2lkICp2YWwsIHNpemVfdCB2YWxfbGVuKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZtYXAtPmxvY2spOworCisJcmV0ID0gX3JlZ21hcF9yYXdfd3JpdGUobWFwLCByZWcsIHZhbCwgdmFsX2xlbik7CisKKwltdXRleF91bmxvY2soJm1hcC0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnbWFwX3Jhd193cml0ZSk7CisKK3N0YXRpYyBpbnQgX3JlZ21hcF9yYXdfcmVhZChzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsIHZvaWQgKnZhbCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgdmFsX2xlbikKK3sKKwl1OCAqdTggPSBtYXAtPndvcmtfYnVmOworCWludCByZXQ7CisKKwltYXAtPmZvcm1hdC5mb3JtYXRfcmVnKG1hcC0+d29ya19idWYsIHJlZyk7CisKKwkvKgorCSAqIFNvbWUgYnVzZXMgZmxhZyByZWFkcyBieSBzZXR0aW5nIHRoZSBoaWdoIGJpdHMgaW4gdGhlCisJICogcmVnaXN0ZXIgYWRkcmVzc3M7IHNpbmNlIGl0J3MgYWx3YXlzIHRoZSBoaWdoIGJpdHMgZm9yIGFsbAorCSAqIGN1cnJlbnQgZm9ybWF0cyB3ZSBjYW4gZG8gdGhpcyBoZXJlIHJhdGhlciB0aGFuIGluCisJICogZm9ybWF0dGluZy4gIFRoaXMgbWF5IGJyZWFrIGlmIHdlIGdldCBpbnRlcmVzdGluZyBmb3JtYXRzLgorCSAqLworCWlmIChtYXAtPmJ1cy0+cmVhZF9mbGFnX21hc2spCisJCXU4WzBdIHw9IG1hcC0+YnVzLT5yZWFkX2ZsYWdfbWFzazsKKworCXJldCA9IG1hcC0+YnVzLT5yZWFkKG1hcC0+ZGV2LCBtYXAtPndvcmtfYnVmLCBtYXAtPmZvcm1hdC5yZWdfYnl0ZXMsCisJCQkgICAgIHZhbCwgbWFwLT5mb3JtYXQudmFsX2J5dGVzKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcmVnbWFwX3JlYWQoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJdW5zaWduZWQgaW50ICp2YWwpCit7CisJaW50IHJldDsKKworCWlmICghbWFwLT5mb3JtYXQucGFyc2VfdmFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IF9yZWdtYXBfcmF3X3JlYWQobWFwLCByZWcsIG1hcC0+d29ya19idWYsIG1hcC0+Zm9ybWF0LnZhbF9ieXRlcyk7CisJaWYgKHJldCA9PSAwKQorCQkqdmFsID0gbWFwLT5mb3JtYXQucGFyc2VfdmFsKG1hcC0+d29ya19idWYpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiByZWdtYXBfcmVhZCgpOiBSZWFkIGEgdmFsdWUgZnJvbSBhIHNpbmdsZSByZWdpc3RlcgorICoKKyAqIEBtYXA6IFJlZ2lzdGVyIG1hcCB0byB3cml0ZSB0bworICogQHJlZzogUmVnaXN0ZXIgdG8gYmUgcmVhZCBmcm9tCisgKiBAdmFsOiBQb2ludGVyIHRvIHN0b3JlIHJlYWQgdmFsdWUKKyAqCisgKiBBIHZhbHVlIG9mIHplcm8gd2lsbCBiZSByZXR1cm5lZCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHdpbGwKKyAqIGJlIHJldHVybmVkIGluIGVycm9yIGNhc2VzLgorICovCitpbnQgcmVnbWFwX3JlYWQoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgKnZhbCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmbWFwLT5sb2NrKTsKKworCXJldCA9IF9yZWdtYXBfcmVhZChtYXAsIHJlZywgdmFsKTsKKworCW11dGV4X3VubG9jaygmbWFwLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdtYXBfcmVhZCk7CisKKy8qKgorICogcmVnbWFwX3Jhd19yZWFkKCk6IFJlYWQgcmF3IGRhdGEgZnJvbSB0aGUgZGV2aWNlCisgKgorICogQG1hcDogUmVnaXN0ZXIgbWFwIHRvIHdyaXRlIHRvCisgKiBAcmVnOiBGaXJzdCByZWdpc3RlciB0byBiZSByZWFkIGZyb20KKyAqIEB2YWw6IFBvaW50ZXIgdG8gc3RvcmUgcmVhZCB2YWx1ZQorICogQHZhbF9sZW46IFNpemUgb2YgZGF0YSB0byByZWFkCisgKgorICogQSB2YWx1ZSBvZiB6ZXJvIHdpbGwgYmUgcmV0dXJuZWQgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB3aWxsCisgKiBiZSByZXR1cm5lZCBpbiBlcnJvciBjYXNlcy4KKyAqLworaW50IHJlZ21hcF9yYXdfcmVhZChzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsIHZvaWQgKnZhbCwKKwkJICAgIHNpemVfdCB2YWxfbGVuKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZtYXAtPmxvY2spOworCisJcmV0ID0gX3JlZ21hcF9yYXdfcmVhZChtYXAsIHJlZywgdmFsLCB2YWxfbGVuKTsKKworCW11dGV4X3VubG9jaygmbWFwLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdtYXBfcmF3X3JlYWQpOworCisvKioKKyAqIHJlZ21hcF9idWxrX3JlYWQoKTogUmVhZCBtdWx0aXBsZSByZWdpc3RlcnMgZnJvbSB0aGUgZGV2aWNlCisgKgorICogQG1hcDogUmVnaXN0ZXIgbWFwIHRvIHdyaXRlIHRvCisgKiBAcmVnOiBGaXJzdCByZWdpc3RlciB0byBiZSByZWFkIGZyb20KKyAqIEB2YWw6IFBvaW50ZXIgdG8gc3RvcmUgcmVhZCB2YWx1ZSwgaW4gbmF0aXZlIHJlZ2lzdGVyIHNpemUgZm9yIGRldmljZQorICogQHZhbF9jb3VudDogTnVtYmVyIG9mIHJlZ2lzdGVycyB0byByZWFkCisgKgorICogQSB2YWx1ZSBvZiB6ZXJvIHdpbGwgYmUgcmV0dXJuZWQgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB3aWxsCisgKiBiZSByZXR1cm5lZCBpbiBlcnJvciBjYXNlcy4KKyAqLworaW50IHJlZ21hcF9idWxrX3JlYWQoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLCB2b2lkICp2YWwsCisJCSAgICAgc2l6ZV90IHZhbF9jb3VudCkKK3sKKwlpbnQgcmV0LCBpOworCXNpemVfdCB2YWxfYnl0ZXMgPSBtYXAtPmZvcm1hdC52YWxfYnl0ZXM7CisKKwlpZiAoIW1hcC0+Zm9ybWF0LnBhcnNlX3ZhbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSByZWdtYXBfcmF3X3JlYWQobWFwLCByZWcsIHZhbCwgdmFsX2J5dGVzICogdmFsX2NvdW50KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmFsX2NvdW50ICogdmFsX2J5dGVzOyBpICs9IHZhbF9ieXRlcykKKwkJbWFwLT5mb3JtYXQucGFyc2VfdmFsKHZhbCArIGkpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdtYXBfYnVsa19yZWFkKTsKKworLyoqCisgKiByZW1hcF91cGRhdGVfYml0czogUGVyZm9ybSBhIHJlYWQvbW9kaWZ5L3dyaXRlIGN5Y2xlIG9uIHRoZSByZWdpc3RlciBtYXAKKyAqCisgKiBAbWFwOiBSZWdpc3RlciBtYXAgdG8gdXBkYXRlCisgKiBAcmVnOiBSZWdpc3RlciB0byB1cGRhdGUKKyAqIEBtYXNrOiBCaXRtYXNrIHRvIGNoYW5nZQorICogQHZhbDogTmV3IHZhbHVlIGZvciBiaXRtYXNrCisgKgorICogUmV0dXJucyB6ZXJvIGZvciBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvbiBlcnJvci4KKyAqLworaW50IHJlZ21hcF91cGRhdGVfYml0cyhzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB0bXA7CisKKwltdXRleF9sb2NrKCZtYXAtPmxvY2spOworCisJcmV0ID0gX3JlZ21hcF9yZWFkKG1hcCwgcmVnLCAmdG1wKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gb3V0OworCisJdG1wICY9IH5tYXNrOworCXRtcCB8PSB2YWwgJiBtYXNrOworCisJcmV0ID0gX3JlZ21hcF93cml0ZShtYXAsIHJlZywgdG1wKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmbWFwLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdtYXBfdXBkYXRlX2JpdHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3N5c2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9zeXNjb3JlLmMKaW5kZXggYzEyNmRiMy4uZThkMTFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3N5c2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2Uvc3lzY29yZS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogc3RhdGljIExJU1RfSEVBRChzeXNjb3JlX29wc19saXN0KTsKIHN0YXRpYyBERUZJTkVfTVVURVgoc3lzY29yZV9vcHNfbG9jayk7CkBAIC00OCw2ICs0OSwxMyBAQAogCXN0cnVjdCBzeXNjb3JlX29wcyAqb3BzOwogCWludCByZXQgPSAwOwogCisJcHJfZGVidWcoIkNoZWNraW5nIHdha2V1cCBpbnRlcnJ1cHRzXG4iKTsKKworCS8qIFJldHVybiBlcnJvciBjb2RlIGlmIHRoZXJlIGFyZSBhbnkgd2FrZXVwIGludGVycnVwdHMgcGVuZGluZy4gKi8KKwlyZXQgPSBjaGVja193YWtldXBfaXJxcygpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlXQVJOX09OQ0UoIWlycXNfZGlzYWJsZWQoKSwKIAkJIkludGVycnVwdHMgZW5hYmxlZCBiZWZvcmUgc3lzdGVtIGNvcmUgc3VzcGVuZC5cbiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvS2NvbmZpZyBiL2RyaXZlcnMvYmNtYS9LY29uZmlnCmluZGV4IDM1Mzc4MWIuLmFlMGEwMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmNtYS9LY29uZmlnCkBAIC0xMyw2ICsxMywxMSBAQAogCSAgQnVzIGRyaXZlciBmb3IgQnJvYWRjb20gc3BlY2lmaWMgQWR2YW5jZWQgTWljcm9jb250cm9sbGVyIEJ1cwogCSAgQXJjaGl0ZWN0dXJlLgogCisjIFN1cHBvcnQgZm9yIEJsb2NrLUkvTy4gU0VMRUNUIHRoaXMgZnJvbSB0aGUgZHJpdmVyIHRoYXQgbmVlZHMgaXQuCitjb25maWcgQkNNQV9CTE9DS0lPCisJYm9vbAorCWRlcGVuZHMgb24gQkNNQQorCiBjb25maWcgQkNNQV9IT1NUX1BDSV9QT1NTSUJMRQogCWJvb2wKIAlkZXBlbmRzIG9uIEJDTUEgJiYgUENJID0geQpAQCAtMjIsNiArMjcsMTIgQEAKIAlib29sICJTdXBwb3J0IGZvciBCQ01BIG9uIFBDSS1ob3N0IGJ1cyIKIAlkZXBlbmRzIG9uIEJDTUFfSE9TVF9QQ0lfUE9TU0lCTEUKIAorY29uZmlnIEJDTUFfRFJJVkVSX1BDSV9IT1NUTU9ERQorCWJvb2wgIkRyaXZlciBmb3IgUENJIGNvcmUgd29ya2luZyBpbiBob3N0bW9kZSIKKwlkZXBlbmRzIG9uIEJDTUEgJiYgTUlQUworCWhlbHAKKwkgIFBDSSBjb3JlIGhvc3Rtb2RlIG9wZXJhdGlvbiAoZXh0ZXJuYWwgUENJIGJ1cykuCisKIGNvbmZpZyBCQ01BX0RFQlVHCiAJYm9vbCAiQkNNQSBkZWJ1Z2dpbmciCiAJZGVwZW5kcyBvbiBCQ01BCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvTWFrZWZpbGUgYi9kcml2ZXJzL2JjbWEvTWFrZWZpbGUKaW5kZXggMGQ1NjI0NS4uYTIxNjFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYmNtYS9NYWtlZmlsZQpAQCAtMSw2ICsxLDcgQEAKLWJjbWEteQkJCQkJKz0gbWFpbi5vIHNjYW4ubyBjb3JlLm8KK2JjbWEteQkJCQkJKz0gbWFpbi5vIHNjYW4ubyBjb3JlLm8gc3Byb20ubwogYmNtYS15CQkJCQkrPSBkcml2ZXJfY2hpcGNvbW1vbi5vIGRyaXZlcl9jaGlwY29tbW9uX3BtdS5vCiBiY21hLXkJCQkJCSs9IGRyaXZlcl9wY2kubworYmNtYS0kKENPTkZJR19CQ01BX0RSSVZFUl9QQ0lfSE9TVE1PREUpCSs9IGRyaXZlcl9wY2lfaG9zdC5vCiBiY21hLSQoQ09ORklHX0JDTUFfSE9TVF9QQ0kpCQkrPSBob3N0X3BjaS5vCiBvYmotJChDT05GSUdfQkNNQSkJCQkrPSBiY21hLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL2JjbWFfcHJpdmF0ZS5oIGIvZHJpdmVycy9iY21hL2JjbWFfcHJpdmF0ZS5oCmluZGV4IDJmNzJlOWMuLmUwMmZmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtYS9iY21hX3ByaXZhdGUuaAorKysgYi9kcml2ZXJzL2JjbWEvYmNtYV9wcml2YXRlLmgKQEAgLTEzLDE2ICsxMywyMyBAQAogc3RydWN0IGJjbWFfYnVzOwogCiAvKiBtYWluLmMgKi8KLWV4dGVybiBpbnQgYmNtYV9idXNfcmVnaXN0ZXIoc3RydWN0IGJjbWFfYnVzICpidXMpOwotZXh0ZXJuIHZvaWQgYmNtYV9idXNfdW5yZWdpc3RlcihzdHJ1Y3QgYmNtYV9idXMgKmJ1cyk7CitpbnQgYmNtYV9idXNfcmVnaXN0ZXIoc3RydWN0IGJjbWFfYnVzICpidXMpOwordm9pZCBiY21hX2J1c191bnJlZ2lzdGVyKHN0cnVjdCBiY21hX2J1cyAqYnVzKTsKIAogLyogc2Nhbi5jICovCiBpbnQgYmNtYV9idXNfc2NhbihzdHJ1Y3QgYmNtYV9idXMgKmJ1cyk7CiAKKy8qIHNwcm9tLmMgKi8KK2ludCBiY21hX3Nwcm9tX2dldChzdHJ1Y3QgYmNtYV9idXMgKmJ1cyk7CisKICNpZmRlZiBDT05GSUdfQkNNQV9IT1NUX1BDSQogLyogaG9zdF9wY2kuYyAqLwogZXh0ZXJuIGludCBfX2luaXQgYmNtYV9ob3N0X3BjaV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgX19leGl0IGJjbWFfaG9zdF9wY2lfZXhpdCh2b2lkKTsKICNlbmRpZiAvKiBDT05GSUdfQkNNQV9IT1NUX1BDSSAqLwogCisjaWZkZWYgQ09ORklHX0JDTUFfRFJJVkVSX1BDSV9IT1NUTU9ERQordm9pZCBiY21hX2NvcmVfcGNpX2hvc3Rtb2RlX2luaXQoc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMpOworI2VuZGlmIC8qIENPTkZJR19CQ01BX0RSSVZFUl9QQ0lfSE9TVE1PREUgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvY29yZS5jIGIvZHJpdmVycy9iY21hL2NvcmUuYwppbmRleCBjZWQzNzlmLi40YTA0YTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvY29yZS5jCisrKyBiL2RyaXZlcnMvYmNtYS9jb3JlLmMKQEAgLTE5LDcgKzE5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGJjbWFfY29yZV9pc19lbmFibGVkKTsKIAotc3RhdGljIHZvaWQgYmNtYV9jb3JlX2Rpc2FibGUoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MzIgZmxhZ3MpCit2b2lkIGJjbWFfY29yZV9kaXNhYmxlKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTMyIGZsYWdzKQogewogCWlmIChiY21hX2FyZWFkMzIoY29yZSwgQkNNQV9SRVNFVF9DVEwpICYgQkNNQV9SRVNFVF9DVExfUkVTRVQpCiAJCXJldHVybjsKQEAgLTMxLDYgKzMxLDcgQEAKIAliY21hX2F3cml0ZTMyKGNvcmUsIEJDTUFfUkVTRVRfQ1RMLCBCQ01BX1JFU0VUX0NUTF9SRVNFVCk7CiAJdWRlbGF5KDEpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYmNtYV9jb3JlX2Rpc2FibGUpOwogCiBpbnQgYmNtYV9jb3JlX2VuYWJsZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUzMiBmbGFncykKIHsKQEAgLTQ5LDMgKzUwLDc1IEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChiY21hX2NvcmVfZW5hYmxlKTsKKwordm9pZCBiY21hX2NvcmVfc2V0X2Nsb2NrbW9kZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsCisJCQkgICAgIGVudW0gYmNtYV9jbGttb2RlIGNsa21vZGUpCit7CisJdTE2IGk7CisKKwlXQVJOX09OKGNvcmUtPmlkLmlkICE9IEJDTUFfQ09SRV9DSElQQ09NTU9OICYmCisJCWNvcmUtPmlkLmlkICE9IEJDTUFfQ09SRV9QQ0lFICYmCisJCWNvcmUtPmlkLmlkICE9IEJDTUFfQ09SRV84MDIxMSk7CisKKwlzd2l0Y2ggKGNsa21vZGUpIHsKKwljYXNlIEJDTUFfQ0xLTU9ERV9GQVNUOgorCQliY21hX3NldDMyKGNvcmUsIEJDTUFfQ0xLQ1RMU1QsIEJDTUFfQ0xLQ1RMU1RfRk9SQ0VIVCk7CisJCXVkZWxheSg2NCk7CisJCWZvciAoaSA9IDA7IGkgPCAxNTAwOyBpKyspIHsKKwkJCWlmIChiY21hX3JlYWQzMihjb3JlLCBCQ01BX0NMS0NUTFNUKSAmCisJCQkgICAgQkNNQV9DTEtDVExTVF9IQVZFSFQpIHsKKwkJCQlpID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJaWYgKGkpCisJCQlwcl9lcnIoIkhUIGZvcmNlIHRpbWVvdXRcbiIpOworCQlicmVhazsKKwljYXNlIEJDTUFfQ0xLTU9ERV9EWU5BTUlDOgorCQlwcl93YXJuKCJEeW5hbWljIGNsb2NrbW9kZSBub3Qgc3VwcG9ydGVkIHlldCFcbiIpOworCQlicmVhazsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChiY21hX2NvcmVfc2V0X2Nsb2NrbW9kZSk7CisKK3ZvaWQgYmNtYV9jb3JlX3BsbF9jdGwoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MzIgcmVxLCB1MzIgc3RhdHVzLCBib29sIG9uKQoreworCXUxNiBpOworCisJV0FSTl9PTihyZXEgJiB+QkNNQV9DTEtDVExTVF9FWFRSRVNSRVEpOworCVdBUk5fT04oc3RhdHVzICYgfkJDTUFfQ0xLQ1RMU1RfRVhUUkVTU1QpOworCisJaWYgKG9uKSB7CisJCWJjbWFfc2V0MzIoY29yZSwgQkNNQV9DTEtDVExTVCwgcmVxKTsKKwkJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKwkJCWlmICgoYmNtYV9yZWFkMzIoY29yZSwgQkNNQV9DTEtDVExTVCkgJiBzdGF0dXMpID09CisJCQkgICAgc3RhdHVzKSB7CisJCQkJaSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoMTApOworCQl9CisJCWlmIChpKQorCQkJcHJfZXJyKCJQTEwgZW5hYmxlIHRpbWVvdXRcbiIpOworCX0gZWxzZSB7CisJCXByX3dhcm4oIkRpc2FibGluZyBQTEwgbm90IHN1cHBvcnRlZCB5ZXQhXG4iKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChiY21hX2NvcmVfcGxsX2N0bCk7CisKK3UzMiBiY21hX2NvcmVfZG1hX3RyYW5zbGF0aW9uKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSkKK3sKKwlzd2l0Y2ggKGNvcmUtPmJ1cy0+aG9zdHR5cGUpIHsKKwljYXNlIEJDTUFfSE9TVFRZUEVfUENJOgorCQlpZiAoYmNtYV9hcmVhZDMyKGNvcmUsIEJDTUFfSU9TVCkgJiBCQ01BX0lPU1RfRE1BNjQpCisJCQlyZXR1cm4gQkNNQV9ETUFfVFJBTlNMQVRJT05fRE1BNjRfQ01UOworCQllbHNlCisJCQlyZXR1cm4gQkNNQV9ETUFfVFJBTlNMQVRJT05fRE1BMzJfQ01UOworCWRlZmF1bHQ6CisJCXByX2VycigiRE1BIHRyYW5zbGF0aW9uIHVua25vd24gZm9yIGhvc3QgJWRcbiIsCisJCSAgICAgICBjb3JlLT5idXMtPmhvc3R0eXBlKTsKKwl9CisJcmV0dXJuIEJDTUFfRE1BX1RSQU5TTEFUSU9OX05PTkU7Cit9CitFWFBPUlRfU1lNQk9MKGJjbWFfY29yZV9kbWFfdHJhbnNsYXRpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uLmMgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb24uYwppbmRleCA2MDYxMDIyLi44NTFlMDViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb24uYworKysgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb24uYwpAQCAtMyw3ICszLDcgQEAKICAqIENoaXBDb21tb24gY29yZSBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgMjAwNSwgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAyMDA2LCAyMDA3LCBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICogQ29weXJpZ2h0IDIwMDYsIDIwMDcsIE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdOVS9HUEwuIFNlZSBDT1BZSU5HIGZvciBkZXRhaWxzLgogICovCkBAIC0yMyw2ICsyMyw5IEBACiAKIHZvaWQgYmNtYV9jb3JlX2NoaXBjb21tb25faW5pdChzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjKQogeworCXUzMiBsZWRkY19vbiA9IDEwOworCXUzMiBsZWRkY19vZmYgPSA5MDsKKwogCWlmIChjYy0+Y29yZS0+aWQucmV2ID49IDExKQogCQljYy0+c3RhdHVzID0gYmNtYV9jY19yZWFkMzIoY2MsIEJDTUFfQ0NfQ0hJUFNUQVQpOwogCWNjLT5jYXBhYmlsaXRpZXMgPSBiY21hX2NjX3JlYWQzMihjYywgQkNNQV9DQ19DQVApOwpAQCAtMzgsNiArNDEsMTcgQEAKIAkJYmNtYV9wbXVfaW5pdChjYyk7CiAJaWYgKGNjLT5jYXBhYmlsaXRpZXMgJiBCQ01BX0NDX0NBUF9QQ1RMKQogCQlwcl9lcnIoIlBvd2VyIGNvbnRyb2wgbm90IGltcGxlbWVudGVkIVxuIik7CisKKwlpZiAoY2MtPmNvcmUtPmlkLnJldiA+PSAxNikgeworCQlpZiAoY2MtPmNvcmUtPmJ1cy0+c3Byb20ubGVkZGNfb25fdGltZSAmJgorCQkgICAgY2MtPmNvcmUtPmJ1cy0+c3Byb20ubGVkZGNfb2ZmX3RpbWUpIHsKKwkJCWxlZGRjX29uID0gY2MtPmNvcmUtPmJ1cy0+c3Byb20ubGVkZGNfb25fdGltZTsKKwkJCWxlZGRjX29mZiA9IGNjLT5jb3JlLT5idXMtPnNwcm9tLmxlZGRjX29mZl90aW1lOworCQl9CisJCWJjbWFfY2Nfd3JpdGUzMihjYywgQkNNQV9DQ19HUElPVElNRVIsCisJCQkoKGxlZGRjX29uIDw8IEJDTUFfQ0NfR1BJT1RJTUVSX09OVElNRV9TSElGVCkgfAorCQkJIChsZWRkY19vZmYgPDwgQkNNQV9DQ19HUElPVElNRVJfT0ZGVElNRV9TSElGVCkpKTsKKwl9CiB9CiAKIC8qIFNldCBjaGlwIHdhdGNoZG9nIHJlc2V0IHRpbWVyIHRvIGZpcmUgaW4gJ3RpY2tzJyBiYWNrcGxhbmUgY3ljbGVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb25fcG11LmMgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKaW5kZXggZjQ0MTc3YS4uZmNjNjNkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uX3BtdS5jCisrKyBiL2RyaXZlcnMvYmNtYS9kcml2ZXJfY2hpcGNvbW1vbl9wbXUuYwpAQCAtMiw3ICsyLDcgQEAKICAqIEJyb2FkY29tIHNwZWNpZmljIEFNQkEKICAqIENoaXBDb21tb24gUG93ZXIgTWFuYWdlbWVudCBVbml0IGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAyMDA5LCBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICogQ29weXJpZ2h0IDIwMDksIE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgKiBDb3B5cmlnaHQgMjAwNywgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VL0dQTC4gU2VlIENPUFlJTkcgZm9yIGRldGFpbHMuCkBAIC01Myw2ICs1Myw3IEBACiAJCW1heF9tc2sgPSAweEZGRkY7CiAJCWJyZWFrOwogCWNhc2UgNDMyMjQ6CisJY2FzZSA0MzIyNToKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJQTVUgcmVzb3VyY2UgY29uZmlnIHVua25vd24gZm9yIGRldmljZSAweCUwNFhcbiIsCkBAIC03NCw2ICs3NSw3IEBACiAJY2FzZSAweDQzMTM6CiAJY2FzZSAweDQzMzE6CiAJY2FzZSA0MzIyNDoKKwljYXNlIDQzMjI1OgogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcl9lcnIoIlBNVSBzd2l0Y2gvcmVndWxhdG9ycyBpbml0IHVua25vd24gZm9yIGRldmljZSAiCkBAIC05NiwxMSArOTgsMTMgQEAKIAkJaWYgKGJ1cy0+Y2hpcGluZm8ucmV2ID09IDApIHsKIAkJCXByX2VycigiV29ya2Fyb3VuZHMgZm9yIDQzMjI0IHJldiAwIG5vdCBmdWxseSAiCiAJCQkJImltcGxlbWVudGVkXG4iKTsKLQkJCWJjbWFfY2hpcGNvX2NoaXBjdGxfbWFza3NldChjYywgMCwgfjAsIDB4RjApOworCQkJYmNtYV9jaGlwY29fY2hpcGN0bF9tYXNrc2V0KGNjLCAwLCB+MCwgMHgwMEYwMDBGMCk7CiAJCX0gZWxzZSB7CiAJCQliY21hX2NoaXBjb19jaGlwY3RsX21hc2tzZXQoY2MsIDAsIH4wLCAweEYwKTsKIAkJfQogCQlicmVhazsKKwljYXNlIDQzMjI1OgorCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcl9lcnIoIldvcmthcm91bmRzIHVua25vd24gZm9yIGRldmljZSAweCUwNFhcbiIsCiAJCQlidXMtPmNoaXBpbmZvLmlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9kcml2ZXJfcGNpLmMgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX3BjaS5jCmluZGV4IGU3NTdlNGUuLjI1ZjNkZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtYS9kcml2ZXJfcGNpLmMKKysrIGIvZHJpdmVycy9iY21hL2RyaXZlcl9wY2kuYwpAQCAtMyw3ICszLDcgQEAKICAqIFBDSSBDb3JlCiAgKgogICogQ29weXJpZ2h0IDIwMDUsIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgMjAwNiwgMjAwNywgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAqIENvcHlyaWdodCAyMDA2LCAyMDA3LCBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUvR1BMLiBTZWUgQ09QWUlORyBmb3IgZGV0YWlscy4KICAqLwpAQCAtMTU3LDcgKzE1Nyw2OSBAQAogICogSW5pdC4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBiY21hX2NvcmVfcGNpX2luaXQoc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMpCitzdGF0aWMgdm9pZCBiY21hX2NvcmVfcGNpX2NsaWVudG1vZGVfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfcGNpICpwYykKIHsKIAliY21hX3BjaWNvcmVfc2VyZGVzX3dvcmthcm91bmQocGMpOwogfQorCitzdGF0aWMgYm9vbCBiY21hX2NvcmVfcGNpX2lzX2luX2hvc3Rtb2RlKHN0cnVjdCBiY21hX2Rydl9wY2kgKnBjKQoreworCXN0cnVjdCBiY21hX2J1cyAqYnVzID0gcGMtPmNvcmUtPmJ1czsKKwl1MTYgY2hpcGlkX3RvcDsKKworCWNoaXBpZF90b3AgPSAoYnVzLT5jaGlwaW5mby5pZCAmIDB4RkYwMCk7CisJaWYgKGNoaXBpZF90b3AgIT0gMHg0NzAwICYmCisJICAgIGNoaXBpZF90b3AgIT0gMHg1MzAwKQorCQlyZXR1cm4gZmFsc2U7CisKKyNpZmRlZiBDT05GSUdfU1NCX0RSSVZFUl9QQ0lDT1JFCisJaWYgKGJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyAmIFNTQl9QQ0lDT1JFX0JGTF9OT1BDSSkKKwkJcmV0dXJuIGZhbHNlOworI2VuZGlmIC8qIENPTkZJR19TU0JfRFJJVkVSX1BDSUNPUkUgKi8KKworI2lmIDAKKwkvKiBUT0RPOiBvbiBCQ01BIHdlIHVzZSBhZGRyZXNzIGZyb20gRVJPTSBpbnN0ZWFkIG9mIG1hZ2ljIGZvcm11bGEgKi8KKwl1MzIgdG1wOworCXJldHVybiAhbWlwc19idXNwcm9iZTMyKHRtcCwgKGJ1cy0+bW1pbyArCisJCShwYy0+Y29yZS0+Y29yZV9pbmRleCAqIEJDTUFfQ09SRV9TSVpFKSkpOworI2VuZGlmCisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBiY21hX2NvcmVfcGNpX2luaXQoc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMpCit7CisJaWYgKGJjbWFfY29yZV9wY2lfaXNfaW5faG9zdG1vZGUocGMpKSB7CisjaWZkZWYgQ09ORklHX0JDTUFfRFJJVkVSX1BDSV9IT1NUTU9ERQorCQliY21hX2NvcmVfcGNpX2hvc3Rtb2RlX2luaXQocGMpOworI2Vsc2UKKwkJcHJfZXJyKCJEcml2ZXIgY29tcGlsZWQgd2l0aG91dCBzdXBwb3J0IGZvciBob3N0bW9kZSBQQ0lcbiIpOworI2VuZGlmIC8qIENPTkZJR19CQ01BX0RSSVZFUl9QQ0lfSE9TVE1PREUgKi8KKwl9IGVsc2UgeworCQliY21hX2NvcmVfcGNpX2NsaWVudG1vZGVfaW5pdChwYyk7CisJfQorfQorCitpbnQgYmNtYV9jb3JlX3BjaV9pcnFfY3RsKHN0cnVjdCBiY21hX2Rydl9wY2kgKnBjLCBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsCisJCQkgIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGMtPmNvcmUtPmJ1cy0+aG9zdF9wY2k7CisJdTMyIGNvcmVtYXNrLCB0bXA7CisJaW50IGVycjsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBCQ01BX1BDSV9JUlFNQVNLLCAmdG1wKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWNvcmVtYXNrID0gQklUKGNvcmUtPmNvcmVfaW5kZXgpIDw8IDg7CisJaWYgKGVuYWJsZSkKKwkJdG1wIHw9IGNvcmVtYXNrOworCWVsc2UKKwkJdG1wICY9IH5jb3JlbWFzazsKKworCWVyciA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgQkNNQV9QQ0lfSVJRTUFTSywgdG1wKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChiY21hX2NvcmVfcGNpX2lycV9jdGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL2RyaXZlcl9wY2lfaG9zdC5jIGIvZHJpdmVycy9iY21hL2RyaXZlcl9wY2lfaG9zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzMyYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX3BjaV9ob3N0LmMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIEJyb2FkY29tIHNwZWNpZmljIEFNQkEKKyAqIFBDSSBDb3JlIGluIGhvc3Rtb2RlCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdOVS9HUEwuIFNlZSBDT1BZSU5HIGZvciBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJiY21hX3ByaXZhdGUuaCIKKyNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KKwordm9pZCBiY21hX2NvcmVfcGNpX2hvc3Rtb2RlX2luaXQoc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMpCit7CisJcHJfZXJyKCJObyBzdXBwb3J0IGZvciBQQ0kgY29yZSBpbiBob3N0bW9kZSB5ZXRcbiIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL2hvc3RfcGNpLmMgYi9kcml2ZXJzL2JjbWEvaG9zdF9wY2kuYwppbmRleCA0NzFhMDQwLi5hYzRiYzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvaG9zdF9wY2kuYworKysgYi9kcml2ZXJzL2JjbWEvaG9zdF9wY2kuYwpAQCAtNjUsNiArNjUsNTQgQEAKIAlpb3dyaXRlMzIodmFsdWUsIGNvcmUtPmJ1cy0+bW1pbyArIG9mZnNldCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkNNQV9CTE9DS0lPCit2b2lkIGJjbWFfaG9zdF9wY2lfYmxvY2tfcmVhZChzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHZvaWQgKmJ1ZmZlciwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgdTE2IG9mZnNldCwgdTggcmVnX3dpZHRoKQoreworCXZvaWQgX19pb21lbSAqYWRkciA9IGNvcmUtPmJ1cy0+bW1pbyArIG9mZnNldDsKKwlpZiAoY29yZS0+YnVzLT5tYXBwZWRfY29yZSAhPSBjb3JlKQorCQliY21hX2hvc3RfcGNpX3N3aXRjaF9jb3JlKGNvcmUpOworCXN3aXRjaCAocmVnX3dpZHRoKSB7CisJY2FzZSBzaXplb2YodTgpOgorCQlpb3JlYWQ4X3JlcChhZGRyLCBidWZmZXIsIGNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBzaXplb2YodTE2KToKKwkJV0FSTl9PTihjb3VudCAmIDEpOworCQlpb3JlYWQxNl9yZXAoYWRkciwgYnVmZmVyLCBjb3VudCA+PiAxKTsKKwkJYnJlYWs7CisJY2FzZSBzaXplb2YodTMyKToKKwkJV0FSTl9PTihjb3VudCAmIDMpOworCQlpb3JlYWQzMl9yZXAoYWRkciwgYnVmZmVyLCBjb3VudCA+PiAyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwl9Cit9CisKK3ZvaWQgYmNtYV9ob3N0X3BjaV9ibG9ja193cml0ZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIHUxNiBvZmZzZXQsIHU4IHJlZ193aWR0aCkKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBjb3JlLT5idXMtPm1taW8gKyBvZmZzZXQ7CisJaWYgKGNvcmUtPmJ1cy0+bWFwcGVkX2NvcmUgIT0gY29yZSkKKwkJYmNtYV9ob3N0X3BjaV9zd2l0Y2hfY29yZShjb3JlKTsKKwlzd2l0Y2ggKHJlZ193aWR0aCkgeworCWNhc2Ugc2l6ZW9mKHU4KToKKwkJaW93cml0ZThfcmVwKGFkZHIsIGJ1ZmZlciwgY291bnQpOworCQlicmVhazsKKwljYXNlIHNpemVvZih1MTYpOgorCQlXQVJOX09OKGNvdW50ICYgMSk7CisJCWlvd3JpdGUxNl9yZXAoYWRkciwgYnVmZmVyLCBjb3VudCA+PiAxKTsKKwkJYnJlYWs7CisJY2FzZSBzaXplb2YodTMyKToKKwkJV0FSTl9PTihjb3VudCAmIDMpOworCQlpb3dyaXRlMzJfcmVwKGFkZHIsIGJ1ZmZlciwgY291bnQgPj4gMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJfQorfQorI2VuZGlmCisKIHN0YXRpYyB1MzIgYmNtYV9ob3N0X3BjaV9hcmVhZDMyKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKIHsKIAlpZiAoY29yZS0+YnVzLT5tYXBwZWRfY29yZSAhPSBjb3JlKQpAQCAtODcsNiArMTM1LDEwIEBACiAJLndyaXRlOAkJPSBiY21hX2hvc3RfcGNpX3dyaXRlOCwKIAkud3JpdGUxNgk9IGJjbWFfaG9zdF9wY2lfd3JpdGUxNiwKIAkud3JpdGUzMgk9IGJjbWFfaG9zdF9wY2lfd3JpdGUzMiwKKyNpZmRlZiBDT05GSUdfQkNNQV9CTE9DS0lPCisJLmJsb2NrX3JlYWQJPSBiY21hX2hvc3RfcGNpX2Jsb2NrX3JlYWQsCisJLmJsb2NrX3dyaXRlCT0gYmNtYV9ob3N0X3BjaV9ibG9ja193cml0ZSwKKyNlbmRpZgogCS5hcmVhZDMyCT0gYmNtYV9ob3N0X3BjaV9hcmVhZDMyLAogCS5hd3JpdGUzMgk9IGJjbWFfaG9zdF9wY2lfYXdyaXRlMzIsCiB9OwpAQCAtMTc1LDYgKzIyNyw3IEBACiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDU3NikgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0MzMxKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzNTMpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDM1NykgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0NzI3KSB9LAogCXsgMCwgfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvbWFpbi5jIGIvZHJpdmVycy9iY21hL21haW4uYwppbmRleCBiZTUyMzQ0Li44NzNlMmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvbWFpbi5jCisrKyBiL2RyaXZlcnMvYmNtYS9tYWluLmMKQEAgLTcsNiArNyw3IEBACiAKICNpbmNsdWRlICJiY21hX3ByaXZhdGUuaCIKICNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKIE1PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20ncyBzcGVjaWZpYyBBTUJBIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtODksNiArOTAsOCBAQAogCQlzd2l0Y2ggKGJ1cy0+aG9zdHR5cGUpIHsKIAkJY2FzZSBCQ01BX0hPU1RUWVBFX1BDSToKIAkJCWNvcmUtPmRldi5wYXJlbnQgPSAmYnVzLT5ob3N0X3BjaS0+ZGV2OworCQkJY29yZS0+ZG1hX2RldiA9ICZidXMtPmhvc3RfcGNpLT5kZXY7CisJCQljb3JlLT5pcnEgPSBidXMtPmhvc3RfcGNpLT5pcnE7CiAJCQlicmVhazsKIAkJY2FzZSBCQ01BX0hPU1RUWVBFX05PTkU6CiAJCWNhc2UgQkNNQV9IT1NUVFlQRV9TRElPOgpAQCAtMTQ0LDYgKzE0NywxNSBAQAogCQliY21hX2NvcmVfcGNpX2luaXQoJmJ1cy0+ZHJ2X3BjaSk7CiAJfQogCisJLyogVHJ5IHRvIGdldCBTUFJPTSAqLworCWVyciA9IGJjbWFfc3Byb21fZ2V0KGJ1cyk7CisJaWYgKGVyciA9PSAtRU5PRU5UKSB7CisJCXByX2VycigiTm8gU1BST00gYXZhaWxhYmxlXG4iKTsKKwl9IGVsc2UgaWYgKGVycikgeworCQlwcl9lcnIoIkZhaWxlZCB0byBnZXQgU1BST006ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKIAkvKiBSZWdpc3RlciBmb3VuZCBjb3JlcyAqLwogCWJjbWFfcmVnaXN0ZXJfY29yZXMoYnVzKTsKIApAQCAtMTUxLDEzICsxNjMsMTEgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoYmNtYV9idXNfcmVnaXN0ZXIpOwogCiB2b2lkIGJjbWFfYnVzX3VucmVnaXN0ZXIoc3RydWN0IGJjbWFfYnVzICpidXMpCiB7CiAJYmNtYV91bnJlZ2lzdGVyX2NvcmVzKGJ1cyk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChiY21hX2J1c191bnJlZ2lzdGVyKTsKIAogaW50IF9fYmNtYV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGJjbWFfZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL3Nwcm9tLmMgYi9kcml2ZXJzL2JjbWEvc3Byb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjViNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iY21hL3Nwcm9tLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBCcm9hZGNvbSBzcGVjaWZpYyBBTUJBCisgKiBTUFJPTSByZWFkaW5nCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdOVS9HUEwuIFNlZSBDT1BZSU5HIGZvciBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJiY21hX3ByaXZhdGUuaCIKKworI2luY2x1ZGUgPGxpbnV4L2JjbWEvYmNtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjbWEvYmNtYV9yZWdzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBTUE9GRihvZmZzZXQpCSgob2Zmc2V0KSAvIHNpemVvZih1MTYpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFIvVyBvcHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGJjbWFfc3Byb21fcmVhZChzdHJ1Y3QgYmNtYV9idXMgKmJ1cywgdTE2IG9mZnNldCwgdTE2ICpzcHJvbSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgU1NCX1NQUk9NU0laRV9XT1JEU19SNDsgaSsrKQorCQlzcHJvbVtpXSA9IGJjbWFfcmVhZDE2KGJ1cy0+ZHJ2X2NjLmNvcmUsCisJCQkJICAgICAgIG9mZnNldCArIChpICogMikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhbGlkYXRpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdTggYmNtYV9jcmM4KHU4IGNyYywgdTggZGF0YSkKK3sKKwkvKiBQb2x5bm9taWFsOiAgIHheOCArIHheNyArIHheNiArIHheNCArIHheMiArIDEgICAqLworCXN0YXRpYyBjb25zdCB1OCB0W10gPSB7CisJCTB4MDAsIDB4RjcsIDB4QjksIDB4NEUsIDB4MjUsIDB4RDIsIDB4OUMsIDB4NkIsCisJCTB4NEEsIDB4QkQsIDB4RjMsIDB4MDQsIDB4NkYsIDB4OTgsIDB4RDYsIDB4MjEsCisJCTB4OTQsIDB4NjMsIDB4MkQsIDB4REEsIDB4QjEsIDB4NDYsIDB4MDgsIDB4RkYsCisJCTB4REUsIDB4MjksIDB4NjcsIDB4OTAsIDB4RkIsIDB4MEMsIDB4NDIsIDB4QjUsCisJCTB4N0YsIDB4ODgsIDB4QzYsIDB4MzEsIDB4NUEsIDB4QUQsIDB4RTMsIDB4MTQsCisJCTB4MzUsIDB4QzIsIDB4OEMsIDB4N0IsIDB4MTAsIDB4RTcsIDB4QTksIDB4NUUsCisJCTB4RUIsIDB4MUMsIDB4NTIsIDB4QTUsIDB4Q0UsIDB4MzksIDB4NzcsIDB4ODAsCisJCTB4QTEsIDB4NTYsIDB4MTgsIDB4RUYsIDB4ODQsIDB4NzMsIDB4M0QsIDB4Q0EsCisJCTB4RkUsIDB4MDksIDB4NDcsIDB4QjAsIDB4REIsIDB4MkMsIDB4NjIsIDB4OTUsCisJCTB4QjQsIDB4NDMsIDB4MEQsIDB4RkEsIDB4OTEsIDB4NjYsIDB4MjgsIDB4REYsCisJCTB4NkEsIDB4OUQsIDB4RDMsIDB4MjQsIDB4NEYsIDB4QjgsIDB4RjYsIDB4MDEsCisJCTB4MjAsIDB4RDcsIDB4OTksIDB4NkUsIDB4MDUsIDB4RjIsIDB4QkMsIDB4NEIsCisJCTB4ODEsIDB4NzYsIDB4MzgsIDB4Q0YsIDB4QTQsIDB4NTMsIDB4MUQsIDB4RUEsCisJCTB4Q0IsIDB4M0MsIDB4NzIsIDB4ODUsIDB4RUUsIDB4MTksIDB4NTcsIDB4QTAsCisJCTB4MTUsIDB4RTIsIDB4QUMsIDB4NUIsIDB4MzAsIDB4QzcsIDB4ODksIDB4N0UsCisJCTB4NUYsIDB4QTgsIDB4RTYsIDB4MTEsIDB4N0EsIDB4OEQsIDB4QzMsIDB4MzQsCisJCTB4QUIsIDB4NUMsIDB4MTIsIDB4RTUsIDB4OEUsIDB4NzksIDB4MzcsIDB4QzAsCisJCTB4RTEsIDB4MTYsIDB4NTgsIDB4QUYsIDB4QzQsIDB4MzMsIDB4N0QsIDB4OEEsCisJCTB4M0YsIDB4QzgsIDB4ODYsIDB4NzEsIDB4MUEsIDB4RUQsIDB4QTMsIDB4NTQsCisJCTB4NzUsIDB4ODIsIDB4Q0MsIDB4M0IsIDB4NTAsIDB4QTcsIDB4RTksIDB4MUUsCisJCTB4RDQsIDB4MjMsIDB4NkQsIDB4OUEsIDB4RjEsIDB4MDYsIDB4NDgsIDB4QkYsCisJCTB4OUUsIDB4NjksIDB4MjcsIDB4RDAsIDB4QkIsIDB4NEMsIDB4MDIsIDB4RjUsCisJCTB4NDAsIDB4QjcsIDB4RjksIDB4MEUsIDB4NjUsIDB4OTIsIDB4REMsIDB4MkIsCisJCTB4MEEsIDB4RkQsIDB4QjMsIDB4NDQsIDB4MkYsIDB4RDgsIDB4OTYsIDB4NjEsCisJCTB4NTUsIDB4QTIsIDB4RUMsIDB4MUIsIDB4NzAsIDB4ODcsIDB4QzksIDB4M0UsCisJCTB4MUYsIDB4RTgsIDB4QTYsIDB4NTEsIDB4M0EsIDB4Q0QsIDB4ODMsIDB4NzQsCisJCTB4QzEsIDB4MzYsIDB4NzgsIDB4OEYsIDB4RTQsIDB4MTMsIDB4NUQsIDB4QUEsCisJCTB4OEIsIDB4N0MsIDB4MzIsIDB4QzUsIDB4QUUsIDB4NTksIDB4MTcsIDB4RTAsCisJCTB4MkEsIDB4REQsIDB4OTMsIDB4NjQsIDB4MEYsIDB4RjgsIDB4QjYsIDB4NDEsCisJCTB4NjAsIDB4OTcsIDB4RDksIDB4MkUsIDB4NDUsIDB4QjIsIDB4RkMsIDB4MEIsCisJCTB4QkUsIDB4NDksIDB4MDcsIDB4RjAsIDB4OUIsIDB4NkMsIDB4MjIsIDB4RDUsCisJCTB4RjQsIDB4MDMsIDB4NEQsIDB4QkEsIDB4RDEsIDB4MjYsIDB4NjgsIDB4OUYsCisJfTsKKwlyZXR1cm4gdFtjcmMgXiBkYXRhXTsKK30KKworc3RhdGljIHU4IGJjbWFfc3Byb21fY3JjKGNvbnN0IHUxNiAqc3Byb20pCit7CisJaW50IHdvcmQ7CisJdTggY3JjID0gMHhGRjsKKworCWZvciAod29yZCA9IDA7IHdvcmQgPCBTU0JfU1BST01TSVpFX1dPUkRTX1I0IC0gMTsgd29yZCsrKSB7CisJCWNyYyA9IGJjbWFfY3JjOChjcmMsIHNwcm9tW3dvcmRdICYgMHgwMEZGKTsKKwkJY3JjID0gYmNtYV9jcmM4KGNyYywgKHNwcm9tW3dvcmRdICYgMHhGRjAwKSA+PiA4KTsKKwl9CisJY3JjID0gYmNtYV9jcmM4KGNyYywgc3Byb21bU1NCX1NQUk9NU0laRV9XT1JEU19SNCAtIDFdICYgMHgwMEZGKTsKKwljcmMgXj0gMHhGRjsKKworCXJldHVybiBjcmM7Cit9CisKK3N0YXRpYyBpbnQgYmNtYV9zcHJvbV9jaGVja19jcmMoY29uc3QgdTE2ICpzcHJvbSkKK3sKKwl1OCBjcmM7CisJdTggZXhwZWN0ZWRfY3JjOworCXUxNiB0bXA7CisKKwljcmMgPSBiY21hX3Nwcm9tX2NyYyhzcHJvbSk7CisJdG1wID0gc3Byb21bU1NCX1NQUk9NU0laRV9XT1JEU19SNCAtIDFdICYgU1NCX1NQUk9NX1JFVklTSU9OX0NSQzsKKwlleHBlY3RlZF9jcmMgPSB0bXAgPj4gU1NCX1NQUk9NX1JFVklTSU9OX0NSQ19TSElGVDsKKwlpZiAoY3JjICE9IGV4cGVjdGVkX2NyYykKKwkJcmV0dXJuIC1FUFJPVE87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21hX3Nwcm9tX3ZhbGlkKGNvbnN0IHUxNiAqc3Byb20pCit7CisJdTE2IHJldmlzaW9uOworCWludCBlcnI7CisKKwllcnIgPSBiY21hX3Nwcm9tX2NoZWNrX2NyYyhzcHJvbSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldmlzaW9uID0gc3Byb21bU1NCX1NQUk9NU0laRV9XT1JEU19SNCAtIDFdICYgU1NCX1NQUk9NX1JFVklTSU9OX1JFVjsKKwlpZiAocmV2aXNpb24gIT0gOCAmJiByZXZpc2lvbiAhPSA5KSB7CisJCXByX2VycigiVW5zdXBwb3J0ZWQgU1BST00gcmV2aXNpb246ICVkXG4iLCByZXZpc2lvbik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNQUk9NIGV4dHJhY3Rpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGJjbWFfc3Byb21fZXh0cmFjdF9yOChzdHJ1Y3QgYmNtYV9idXMgKmJ1cywgY29uc3QgdTE2ICpzcHJvbSkKK3sKKwl1MTYgdjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJdiA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfSUwwTUFDKSArIGldOworCQkqKCgoX19iZTE2ICopYnVzLT5zcHJvbS5pbDBtYWMpICsgaSkgPSBjcHVfdG9fYmUxNih2KTsKKwl9Cit9CisKK2ludCBiY21hX3Nwcm9tX2dldChzdHJ1Y3QgYmNtYV9idXMgKmJ1cykKK3sKKwl1MTYgb2Zmc2V0OworCXUxNiAqc3Byb207CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWJ1cy0+ZHJ2X2NjLmNvcmUpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghKGJ1cy0+ZHJ2X2NjLmNhcGFiaWxpdGllcyAmIEJDTUFfQ0NfQ0FQX1NQUk9NKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlzcHJvbSA9IGtjYWxsb2MoU1NCX1NQUk9NU0laRV9XT1JEU19SNCwgc2l6ZW9mKHUxNiksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXNwcm9tKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIE1vc3QgY2FyZHMgaGF2ZSBTUFJPTSBtb3ZlZCBieSBhZGRpdGlvbmFsIG9mZnNldCAweDMwICg0OCBkd29yZHMpLgorCSAqIEFjY29yZGluZyB0byBicmNtODAyMTEgdGhpcyBhcHBsaWVzIHRvIGNhcmRzIHdpdGggUENJZSByZXYgPj0gNgorCSAqIFRPRE86IHVuZGVyc3RhbmQgdGhpcyBjb25kaXRpb24gYW5kIHVzZSBpdCAqLworCW9mZnNldCA9IChidXMtPmNoaXBpbmZvLmlkID09IDB4NDMzMSkgPyBCQ01BX0NDX1NQUk9NIDoKKwkJQkNNQV9DQ19TUFJPTV9QQ0lFNjsKKwliY21hX3Nwcm9tX3JlYWQoYnVzLCBvZmZzZXQsIHNwcm9tKTsKKworCWVyciA9IGJjbWFfc3Byb21fdmFsaWQoc3Byb20pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJYmNtYV9zcHJvbV9leHRyYWN0X3I4KGJ1cywgc3Byb20pOworCitvdXQ6CisJa2ZyZWUoc3Byb20pOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmggYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmgKaW5kZXggMTZiNGQ1OC4uYzA0OTU0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5oCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuaApAQCAtMjIzLDcgKzIyMyw3IEBACiAJCQloLT5jdGxyLCBjLT5idXNhZGRyKTsKICNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLwogICAgICAgICAgd3JpdGVsKGMtPmJ1c2FkZHIsIGgtPnZhZGRyICsgU0E1X1JFUVVFU1RfUE9SVF9PRkZTRVQpOwotCXJlYWRsKGgtPnZhZGRyICsgU0E1X1JFUVVFU1RfUE9SVF9PRkZTRVQpOworCXJlYWRsKGgtPnZhZGRyICsgU0E1X1NDUkFUQ0hQQURfT0ZGU0VUKTsKIAkgaC0+Y29tbWFuZHNfb3V0c3RhbmRpbmcrKzsKIAkgaWYgKCBoLT5jb21tYW5kc19vdXRzdGFuZGluZyA+IGgtPm1heF9vdXRzdGFuZGluZykKIAkJaC0+bWF4X291dHN0YW5kaW5nID0gaC0+Y29tbWFuZHNfb3V0c3RhbmRpbmc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9hY3Rsb2cuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCmluZGV4IDA5ZWY5YTguLmNmMGU2M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2FjdGxvZy5jCkBAIC03OSw3ICs3OSw3IEBACiAJbWRfaW8uZXJyb3IgPSAwOwogCiAJaWYgKChydyAmIFdSSVRFKSAmJiAhdGVzdF9iaXQoTURfTk9fRlVBLCAmbWRldi0+ZmxhZ3MpKQotCQlydyB8PSBSRVFfRlVBOworCQlydyB8PSBSRVFfRlVBIHwgUkVRX0ZMVVNIOwogCXJ3IHw9IFJFUV9TWU5DOwogCiAJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2JpdG1hcC5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYml0bWFwLmMKaW5kZXggZjQ0MGEwMi4uN2I5NzYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYml0bWFwLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfYml0bWFwLmMKQEAgLTExMiw5ICsxMTIsNiBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqYm1fdGFzazsKIH07CiAKLXN0YXRpYyBpbnQgX19ibV9jaGFuZ2VfYml0c190byhzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBjb25zdCB1bnNpZ25lZCBsb25nIHMsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBlLCBpbnQgdmFsLCBjb25zdCBlbnVtIGttX3R5cGUga20pOwotCiAjZGVmaW5lIGJtX3ByaW50X2xvY2tfaW5mbyhtKSBfX2JtX3ByaW50X2xvY2tfaW5mbyhtLCBfX2Z1bmNfXykKIHN0YXRpYyB2b2lkIF9fYm1fcHJpbnRfbG9ja19pbmZvKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIGNvbnN0IGNoYXIgKmZ1bmMpCiB7CkBAIC05OTQsNiArOTkxLDkgQEAKIAkJYmlvX2VuZGlvKGJpbywgLUVJTyk7CiAJfSBlbHNlIHsKIAkJc3VibWl0X2JpbyhydywgYmlvKTsKKwkJLyogdGhpcyBzaG91bGQgbm90IGNvdW50IGFzIHVzZXIgYWN0aXZpdHkgYW5kIGNhdXNlIHRoZQorCQkgKiByZXN5bmMgdG8gdGhyb3R0bGUgLS0gc2VlIGRyYmRfcnNfc2hvdWxkX3Nsb3dfZG93bigpLiAqLworCQlhdG9taWNfYWRkKGxlbiA+PiA5LCAmbWRldi0+cnNfc2VjdF9ldik7CiAJfQogfQogCkBAIC0xMjU2LDcgKzEyNTYsNyBAQAogICogZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGZvciBvbmx5IGEgZmV3IGJpdHMgKGUgLSBzIGFib3V0IEJJVFNfUEVSX0xPTkcpLgogICogTXVzdCBob2xkIGJpdG1hcCBsb2NrIGFscmVhZHkuICovCiBzdGF0aWMgaW50IF9fYm1fY2hhbmdlX2JpdHNfdG8oc3RydWN0IGRyYmRfY29uZiAqbWRldiwgY29uc3QgdW5zaWduZWQgbG9uZyBzLAotCXVuc2lnbmVkIGxvbmcgZSwgaW50IHZhbCwgY29uc3QgZW51bSBrbV90eXBlIGttKQorCXVuc2lnbmVkIGxvbmcgZSwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgZHJiZF9iaXRtYXAgKmIgPSBtZGV2LT5iaXRtYXA7CiAJdW5zaWduZWQgbG9uZyAqcF9hZGRyID0gTlVMTDsKQEAgLTEyNzQsMTQgKzEyNzQsMTQgQEAKIAkJdW5zaWduZWQgaW50IHBhZ2VfbnIgPSBibV9iaXRfdG9fcGFnZV9pZHgoYiwgYml0bnIpOwogCQlpZiAocGFnZV9uciAhPSBsYXN0X3BhZ2VfbnIpIHsKIAkJCWlmIChwX2FkZHIpCi0JCQkJX19ibV91bm1hcChwX2FkZHIsIGttKTsKKwkJCQlfX2JtX3VubWFwKHBfYWRkciwgS01fSVJRMSk7CiAJCQlpZiAoYyA8IDApCiAJCQkJYm1fc2V0X3BhZ2VfbGF6eV93cml0ZW91dChiLT5ibV9wYWdlc1tsYXN0X3BhZ2VfbnJdKTsKIAkJCWVsc2UgaWYgKGMgPiAwKQogCQkJCWJtX3NldF9wYWdlX25lZWRfd3JpdGVvdXQoYi0+Ym1fcGFnZXNbbGFzdF9wYWdlX25yXSk7CiAJCQljaGFuZ2VkX3RvdGFsICs9IGM7CiAJCQljID0gMDsKLQkJCXBfYWRkciA9IF9fYm1fbWFwX3BpZHgoYiwgcGFnZV9uciwga20pOworCQkJcF9hZGRyID0gX19ibV9tYXBfcGlkeChiLCBwYWdlX25yLCBLTV9JUlExKTsKIAkJCWxhc3RfcGFnZV9uciA9IHBhZ2VfbnI7CiAJCX0KIAkJaWYgKHZhbCkKQEAgLTEyOTAsNyArMTI5MCw3IEBACiAJCQljIC09ICgwICE9IF9fdGVzdF9hbmRfY2xlYXJfYml0X2xlKGJpdG5yICYgQklUU19QRVJfUEFHRV9NQVNLLCBwX2FkZHIpKTsKIAl9CiAJaWYgKHBfYWRkcikKLQkJX19ibV91bm1hcChwX2FkZHIsIGttKTsKKwkJX19ibV91bm1hcChwX2FkZHIsIEtNX0lSUTEpOwogCWlmIChjIDwgMCkKIAkJYm1fc2V0X3BhZ2VfbGF6eV93cml0ZW91dChiLT5ibV9wYWdlc1tsYXN0X3BhZ2VfbnJdKTsKIAllbHNlIGlmIChjID4gMCkKQEAgLTEzMTgsNyArMTMxOCw3IEBACiAJaWYgKCh2YWwgPyBCTV9ET05UX1NFVCA6IEJNX0RPTlRfQ0xFQVIpICYgYi0+Ym1fZmxhZ3MpCiAJCWJtX3ByaW50X2xvY2tfaW5mbyhtZGV2KTsKIAotCWMgPSBfX2JtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIGUsIHZhbCwgS01fSVJRMSk7CisJYyA9IF9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgdmFsKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmItPmJtX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gYzsKQEAgLTEzNDMsMTYgKzEzNDMsMTcgQEAKIHsKIAlpbnQgaTsKIAlpbnQgYml0czsKLQl1bnNpZ25lZCBsb25nICpwYWRkciA9IGttYXBfYXRvbWljKGItPmJtX3BhZ2VzW3BhZ2VfbnJdLCBLTV9VU0VSMCk7CisJdW5zaWduZWQgbG9uZyAqcGFkZHIgPSBrbWFwX2F0b21pYyhiLT5ibV9wYWdlc1twYWdlX25yXSwgS01fSVJRMSk7CiAJZm9yIChpID0gZmlyc3Rfd29yZDsgaSA8IGxhc3Rfd29yZDsgaSsrKSB7CiAJCWJpdHMgPSBod2VpZ2h0X2xvbmcocGFkZHJbaV0pOwogCQlwYWRkcltpXSA9IH4wVUw7CiAJCWItPmJtX3NldCArPSBCSVRTX1BFUl9MT05HIC0gYml0czsKIAl9Ci0Ja3VubWFwX2F0b21pYyhwYWRkciwgS01fVVNFUjApOworCWt1bm1hcF9hdG9taWMocGFkZHIsIEtNX0lSUTEpOwogfQogCi0vKiBTYW1lIHRoaW5nIGFzIGRyYmRfYm1fc2V0X2JpdHMsIGJ1dCB3aXRob3V0IHRha2luZyB0aGUgc3Bpbl9sb2NrX2lycXNhdmUuCisvKiBTYW1lIHRoaW5nIGFzIGRyYmRfYm1fc2V0X2JpdHMsCisgKiBidXQgbW9yZSBlZmZpY2llbnQgZm9yIGEgbGFyZ2UgYml0IHJhbmdlLgogICogWW91IG11c3QgZmlyc3QgZHJiZF9ibV9sb2NrKCkuCiAgKiBDYW4gYmUgY2FsbGVkIHRvIHNldCB0aGUgd2hvbGUgYml0bWFwIGluIG9uZSBnby4KICAqIFNldHMgYml0cyBmcm9tIHMgdG8gZSBfaW5jbHVzaXZlXy4gKi8KQEAgLTEzNjYsNiArMTM2Nyw3IEBACiAJICogRG8gbm90IHVzZSBtZW1zZXQsIGJlY2F1c2Ugd2UgbXVzdCBhY2NvdW50IGZvciBjaGFuZ2VzLAogCSAqIHNvIHdlIG5lZWQgdG8gbG9vcCBvdmVyIHRoZSB3b3JkcyB3aXRoIGh3ZWlnaHQoKSBhbnl3YXlzLgogCSAqLworCXN0cnVjdCBkcmJkX2JpdG1hcCAqYiA9IG1kZXYtPmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nIHNsID0gQUxJR04ocyxCSVRTX1BFUl9MT05HKTsKIAl1bnNpZ25lZCBsb25nIGVsID0gKGUrMSkgJiB+KCh1bnNpZ25lZCBsb25nKUJJVFNfUEVSX0xPTkctMSk7CiAJaW50IGZpcnN0X3BhZ2U7CkBAIC0xMzc2LDE1ICsxMzc4LDE5IEBACiAKIAlpZiAoZSAtIHMgPD0gMypCSVRTX1BFUl9MT05HKSB7CiAJCS8qIGRvbid0IGJvdGhlcjsgZWwgYW5kIHNsIG1heSBldmVuIGJlIHdyb25nLiAqLwotCQlfX2JtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIGUsIDEsIEtNX1VTRVIwKTsKKwkJc3Bpbl9sb2NrX2lycSgmYi0+Ym1fbG9jayk7CisJCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgZSwgMSk7CisJCXNwaW5fdW5sb2NrX2lycSgmYi0+Ym1fbG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBkaWZmZXJlbmNlIGlzIGxhcmdlIGVub3VnaCB0aGF0IHdlIGNhbiB0cnVzdCBzbCBhbmQgZWwgKi8KIAorCXNwaW5fbG9ja19pcnEoJmItPmJtX2xvY2spOworCiAJLyogYml0cyBmaWxsaW5nIHRoZSBjdXJyZW50IGxvbmcgKi8KIAlpZiAoc2wpCi0JCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgcywgc2wtMSwgMSwgS01fVVNFUjApOworCQlfX2JtX2NoYW5nZV9iaXRzX3RvKG1kZXYsIHMsIHNsLTEsIDEpOwogCiAJZmlyc3RfcGFnZSA9IHNsID4+ICgzICsgUEFHRV9TSElGVCk7CiAJbGFzdF9wYWdlID0gZWwgPj4gKDMgKyBQQUdFX1NISUZUKTsKQEAgLTEzOTcsOCArMTQwMywxMCBAQAogCS8qIGZpcnN0IGFuZCBmdWxsIHBhZ2VzLCB1bmxlc3MgZmlyc3QgcGFnZSA9PSBsYXN0IHBhZ2UgKi8KIAlmb3IgKHBhZ2VfbnIgPSBmaXJzdF9wYWdlOyBwYWdlX25yIDwgbGFzdF9wYWdlOyBwYWdlX25yKyspIHsKIAkJYm1fc2V0X2Z1bGxfd29yZHNfd2l0aGluX29uZV9wYWdlKG1kZXYtPmJpdG1hcCwgcGFnZV9uciwgZmlyc3Rfd29yZCwgbGFzdF93b3JkKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJCWZpcnN0X3dvcmQgPSAwOworCQlzcGluX2xvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIAl9CiAKIAkvKiBsYXN0IHBhZ2UgKHJlc3BlY3RpdmVseSBvbmx5IHBhZ2UsIGZvciBmaXJzdCBwYWdlID09IGxhc3QgcGFnZSkgKi8KQEAgLTE0MTEsNyArMTQxOSw4IEBACiAJICogaXQgd291bGQgdHJpZ2dlciBhbiBhc3NlcnQgaW4gX19ibV9jaGFuZ2VfYml0c190bygpCiAJICovCiAJaWYgKGVsIDw9IGUpCi0JCV9fYm1fY2hhbmdlX2JpdHNfdG8obWRldiwgZWwsIGUsIDEsIEtNX1VTRVIwKTsKKwkJX19ibV9jaGFuZ2VfYml0c190byhtZGV2LCBlbCwgZSwgMSk7CisJc3Bpbl91bmxvY2tfaXJxKCZiLT5ibV9sb2NrKTsKIH0KIAogLyogcmV0dXJucyBiaXQgc3RhdGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jCmluZGV4IDI1ZDMyYzUuLjQzYmVhY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVjZWl2ZXIuYwpAQCAtNDYwMiw2ICs0NjAyLDExIEBACiAJCQlkZXZfZXJyKERFViwgIm1ldGEgY29ubmVjdGlvbiBzaHV0IGRvd24gYnkgcGVlci5cbiIpOwogCQkJZ290byByZWNvbm5lY3Q7CiAJCX0gZWxzZSBpZiAocnYgPT0gLUVBR0FJTikgeworCQkJLyogSWYgdGhlIGRhdGEgc29ja2V0IHJlY2VpdmVkIHNvbWV0aGluZyBtZWFud2hpbGUsCisJCQkgKiB0aGF0IGlzIGdvb2QgZW5vdWdoOiBwZWVyIGlzIHN0aWxsIGFsaXZlLiAqLworCQkJaWYgKHRpbWVfYWZ0ZXIobWRldi0+bGFzdF9yZWNlaXZlZCwKKwkJCQlqaWZmaWVzIC0gbWRldi0+bWV0YS5zb2NrZXQtPnNrLT5za19yY3Z0aW1lbykpCisJCQkJY29udGludWU7CiAJCQlpZiAocGluZ190aW1lb3V0X2FjdGl2ZSkgewogCQkJCWRldl9lcnIoREVWLCAiUGluZ0FjayBkaWQgbm90IGFycml2ZSBpbiB0aW1lLlxuIik7CiAJCQkJZ290byByZWNvbm5lY3Q7CkBAIC00NjM3LDYgKzQ2NDIsNyBAQAogCQkJCWdvdG8gcmVjb25uZWN0OwogCQl9CiAJCWlmIChyZWNlaXZlZCA9PSBleHBlY3QpIHsKKwkJCW1kZXYtPmxhc3RfcmVjZWl2ZWQgPSBqaWZmaWVzOwogCQkJRF9BU1NFUlQoY21kICE9IE5VTEwpOwogCQkJaWYgKCFjbWQtPnByb2Nlc3MobWRldiwgaCkpCiAJCQkJZ290byByZWNvbm5lY3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF93b3JrZXIuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jCmluZGV4IDRkNzZiMDYuLjRkM2U2ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3dvcmtlci5jCkBAIC01MzYsMTIgKzUzNiw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCS8qIHN0YXJ0aW5nIHdpdGggZHJiZCA4LjMuOCwgd2UgY2FuIGhhbmRsZSBtdWx0aS1iaW8gRUVzLAotCSAqIGlmIGl0IHNob3VsZCBiZSBuZWNlc3NhcnkgKi8KLQltYXhfYmlvX3NpemUgPQotCQltZGV2LT5hZ3JlZWRfcHJvX3ZlcnNpb24gPCA5NCA/IHF1ZXVlX21heF9od19zZWN0b3JzKG1kZXYtPnJxX3F1ZXVlKSA8PCA5IDoKLQkJbWRldi0+YWdyZWVkX3Byb192ZXJzaW9uIDwgOTUgPwlEUkJEX01BWF9TSVpFX0g4MF9QQUNLRVQgOiBEUkJEX01BWF9CSU9fU0laRTsKLQorCW1heF9iaW9fc2l6ZSA9IHF1ZXVlX21heF9od19zZWN0b3JzKG1kZXYtPnJxX3F1ZXVlKSA8PCA5OwogCW51bWJlciA9IGRyYmRfcnNfbnVtYmVyX3JlcXVlc3RzKG1kZXYpOwogCWlmIChudW1iZXIgPT0gMCkKIAkJZ290byByZXF1ZXVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9oZC5jIGIvZHJpdmVycy9ibG9jay9oZC5jCmluZGV4IDAwN2M2MzAuLmI1MmM5Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svaGQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2hkLmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiAjaWYgKEhEX0RFTEFZID4gMCkKIAotI2luY2x1ZGUgPGFzbS9pODI1My5oPgorI2luY2x1ZGUgPGxpbnV4L2k4MjUzLmg+CiAKIHVuc2lnbmVkIGxvbmcgbGFzdF9yZXE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jIGIvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKaW5kZXggMDdhMzgyZS4uZTEzM2YwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKKysrIGIvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKQEAgLTEyMDYsNyArMTIwNiw3IEBACiAJaWYgKCFzYikKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIXNiLT5zX29wIHx8ICFzYi0+c19vcC0+cmVsb2NhdGVfYmxvY2tzKQorCWlmICghc2ItPnNfb3AtPnJlbG9jYXRlX2Jsb2NrcykKIAkJZ290byBvdXQ7CiAKIAlvbGRfYmxvY2sgPSBwa3QtPnNlY3RvciAvIChDRF9GUkFNRVNJWkUgPj4gOSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svYmxrYmFjay5jCmluZGV4IDVjZjI5OTMuLjIzMzBhOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svYmxrYmFjay5jCisrKyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svYmxrYmFjay5jCkBAIC00NTgsNyArNDU4LDggQEAKICAqICh3aGljaCBoYXMgdGhlIHNlY3RvcnMgd2Ugd2FudCwgbnVtYmVyIG9mIHRoZW0sIGdyYW50IHJlZmVyZW5jZXMsIGV0YyksCiAgKiBhbmQgdHJhbnNtdXRlICBpdCB0byB0aGUgYmxvY2sgQVBJIHRvIGhhbmQgaXQgb3ZlciB0byB0aGUgcHJvcGVyIGJsb2NrIGRpc2suCiAgKi8KLXN0YXRpYyBpbnQgZG9fYmxvY2tfaW9fb3Aoc3RydWN0IHhlbl9ibGtpZiAqYmxraWYpCitzdGF0aWMgaW50CitfX2RvX2Jsb2NrX2lvX29wKHN0cnVjdCB4ZW5fYmxraWYgKmJsa2lmKQogewogCXVuaW9uIGJsa2lmX2JhY2tfcmluZ3MgKmJsa19yaW5ncyA9ICZibGtpZi0+YmxrX3JpbmdzOwogCXN0cnVjdCBibGtpZl9yZXF1ZXN0IHJlcTsKQEAgLTUxNSw2ICs1MTYsMjMgQEAKIAlyZXR1cm4gbW9yZV90b19kbzsKIH0KIAorc3RhdGljIGludAorZG9fYmxvY2tfaW9fb3Aoc3RydWN0IHhlbl9ibGtpZiAqYmxraWYpCit7CisJdW5pb24gYmxraWZfYmFja19yaW5ncyAqYmxrX3JpbmdzID0gJmJsa2lmLT5ibGtfcmluZ3M7CisJaW50IG1vcmVfdG9fZG87CisKKwlkbyB7CisJCW1vcmVfdG9fZG8gPSBfX2RvX2Jsb2NrX2lvX29wKGJsa2lmKTsKKwkJaWYgKG1vcmVfdG9fZG8pCisJCQlicmVhazsKKworCQlSSU5HX0ZJTkFMX0NIRUNLX0ZPUl9SRVFVRVNUUygmYmxrX3JpbmdzLT5jb21tb24sIG1vcmVfdG9fZG8pOworCX0gd2hpbGUgKG1vcmVfdG9fZG8pOworCisJcmV0dXJuIG1vcmVfdG9fZG87Cit9CisKIC8qCiAgKiBUcmFuc211dGF0aW9uIG9mIHRoZSAnc3RydWN0IGJsa2lmX3JlcXVlc3QnIHRvIGEgcHJvcGVyICdzdHJ1Y3QgYmlvJwogICogYW5kIGNhbGwgdGhlICdzdWJtaXRfYmlvJyB0byBwYXNzIGl0IHRvIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UuCkBAIC03MDAsNyArNzE4LDYgQEAKIAlzdHJ1Y3QgYmxraWZfcmVzcG9uc2UgIHJlc3A7CiAJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CiAJdW5pb24gYmxraWZfYmFja19yaW5ncyAqYmxrX3JpbmdzID0gJmJsa2lmLT5ibGtfcmluZ3M7Ci0JaW50IG1vcmVfdG9fZG8gPSAwOwogCWludCBub3RpZnk7CiAKIAlyZXNwLmlkICAgICAgICA9IGlkOwpAQCAtNzI3LDIyICs3NDQsNyBAQAogCX0KIAlibGtfcmluZ3MtPmNvbW1vbi5yc3BfcHJvZF9wdnQrKzsKIAlSSU5HX1BVU0hfUkVTUE9OU0VTX0FORF9DSEVDS19OT1RJRlkoJmJsa19yaW5ncy0+Y29tbW9uLCBub3RpZnkpOwotCWlmIChibGtfcmluZ3MtPmNvbW1vbi5yc3BfcHJvZF9wdnQgPT0gYmxrX3JpbmdzLT5jb21tb24ucmVxX2NvbnMpIHsKLQkJLyoKLQkJICogVGFpbCBjaGVjayBmb3IgcGVuZGluZyByZXF1ZXN0cy4gQWxsb3dzIGZyb250ZW5kIHRvIGF2b2lkCi0JCSAqIG5vdGlmaWNhdGlvbnMgaWYgcmVxdWVzdHMgYXJlIGFscmVhZHkgaW4gZmxpZ2h0IChsb3dlcgotCQkgKiBvdmVyaGVhZHMgYW5kIHByb21vdGVzIGJhdGNoaW5nKS4KLQkJICovCi0JCVJJTkdfRklOQUxfQ0hFQ0tfRk9SX1JFUVVFU1RTKCZibGtfcmluZ3MtPmNvbW1vbiwgbW9yZV90b19kbyk7Ci0KLQl9IGVsc2UgaWYgKFJJTkdfSEFTX1VOQ09OU1VNRURfUkVRVUVTVFMoJmJsa19yaW5ncy0+Y29tbW9uKSkgewotCQltb3JlX3RvX2RvID0gMTsKLQl9Ci0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGtpZi0+YmxrX3JpbmdfbG9jaywgZmxhZ3MpOwotCi0JaWYgKG1vcmVfdG9fZG8pCi0JCWJsa2lmX25vdGlmeV93b3JrKGJsa2lmKTsKIAlpZiAobm90aWZ5KQogCQlub3RpZnlfcmVtb3RlX3ZpYV9pcnEoYmxraWYtPmlycSk7CiB9CkBAIC04MjQsMyArODI2LDQgQEAKIG1vZHVsZV9pbml0KHhlbl9ibGtpZl9pbml0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FMSUFTKCJ4ZW4tYmFja2VuZDp2YmQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sveGVuYnVzLmMgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL3hlbmJ1cy5jCmluZGV4IDZjYzBkYjEuLjNmMTI5YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sveGVuYnVzLmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYwpAQCAtNjg0LDcgKzY4NCw3IEBACiAKIAllcnIgPSB4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgWGVuYnVzU3RhdGVDb25uZWN0ZWQpOwogCWlmIChlcnIpCi0JCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsICJzd2l0Y2hpbmcgdG8gQ29ubmVjdGVkIHN0YXRlIiwKKwkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIGVyciwgIiVzOiBzd2l0Y2hpbmcgdG8gQ29ubmVjdGVkIHN0YXRlIiwKIAkJCQkgZGV2LT5ub2RlbmFtZSk7CiAKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3hzeXNhY2UuYyBiL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jCmluZGV4IDZjN2ZkN2QuLmZiMTk3NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jCisrKyBiL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jCkBAIC0xMTU1LDEyICsxMTU1LDE5IEBACiB7CiAJcmVzb3VyY2Vfc2l6ZV90IHBoeXNhZGRyID0gMDsKIAlpbnQgYnVzX3dpZHRoID0gQUNFX0JVU19XSURUSF8xNjsgLyogRklYTUU6IHNob3VsZCBub3QgYmUgaGFyZCBjb2RlZCAqLwotCWludCBpZCA9IGRldi0+aWQ7CisJdTMyIGlkID0gZGV2LT5pZDsKIAlpbnQgaXJxID0gTk9fSVJROwogCWludCBpOwogCiAJZGV2X2RiZygmZGV2LT5kZXYsICJhY2VfcHJvYmUoJXApXG4iLCBkZXYpOwogCisJLyogZGV2aWNlIGlkIGFuZCBidXMgd2lkdGggKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPmRldi5vZl9ub2RlLCAicG9ydC1udW1iZXIiLCAmaWQpOworCWlmIChpZCA8IDApCisJCWlkID0gMDsKKwlpZiAob2ZfZmluZF9wcm9wZXJ0eShkZXYtPmRldi5vZl9ub2RlLCAiOC1iaXQiLCBOVUxMKSkKKwkJYnVzX3dpZHRoID0gQUNFX0JVU19XSURUSF84OworCiAJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3Jlc291cmNlczsgaSsrKSB7CiAJCWlmIChkZXYtPnJlc291cmNlW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCiAJCQlwaHlzYWRkciA9IGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7CkBAIC0xMTgxLDU3ICsxMTg4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWNlX3BsYXRmb3JtX2RyaXZlciA9IHsKLQkucHJvYmUgPSBhY2VfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFjZV9yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkubmFtZSA9ICJ4c3lzYWNlIiwKLQl9LAotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBPRl9QbGF0Zm9ybSBCdXMgU3VwcG9ydAotICovCi0KICNpZiBkZWZpbmVkKENPTkZJR19PRikKLXN0YXRpYyBpbnQgX19kZXZpbml0IGFjZV9vZl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwotCXJlc291cmNlX3NpemVfdCBwaHlzYWRkcjsKLQljb25zdCB1MzIgKmlkOwotCWludCBpcnEsIGJ1c193aWR0aCwgcmM7Ci0KLQkvKiBkZXZpY2UgaWQgKi8KLQlpZCA9IG9mX2dldF9wcm9wZXJ0eShvcC0+ZGV2Lm9mX25vZGUsICJwb3J0LW51bWJlciIsIE5VTEwpOwotCi0JLyogcGh5c2FkZHIgKi8KLQlyYyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uob3AtPmRldi5vZl9ub2RlLCAwLCAmcmVzKTsKLQlpZiAocmMpIHsKLQkJZGV2X2Vycigmb3AtPmRldiwgImludmFsaWQgYWRkcmVzc1xuIik7Ci0JCXJldHVybiByYzsKLQl9Ci0JcGh5c2FkZHIgPSByZXMuc3RhcnQ7Ci0KLQkvKiBpcnEgKi8KLQlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvcC0+ZGV2Lm9mX25vZGUsIDApOwotCi0JLyogYnVzIHdpZHRoICovCi0JYnVzX3dpZHRoID0gQUNFX0JVU19XSURUSF8xNjsKLQlpZiAob2ZfZmluZF9wcm9wZXJ0eShvcC0+ZGV2Lm9mX25vZGUsICI4LWJpdCIsIE5VTEwpKQotCQlidXNfd2lkdGggPSBBQ0VfQlVTX1dJRFRIXzg7Ci0KLQkvKiBDYWxsIHRoZSBidXMtaW5kZXBlbmRlbnQgc2V0dXAgY29kZSAqLwotCXJldHVybiBhY2VfYWxsb2MoJm9wLT5kZXYsIGlkID8gYmUzMl90b19jcHVwKGlkKSA6IDAsCi0JCQkJCQlwaHlzYWRkciwgaXJxLCBidXNfd2lkdGgpOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBhY2Vfb2ZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wKQotewotCWFjZV9mcmVlKCZvcC0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQogLyogTWF0Y2ggdGFibGUgZm9yIG9mX3BsYXRmb3JtIGJpbmRpbmcgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFjZV9vZl9tYXRjaFtdIF9fZGV2aW5pdGNvbnN0ID0gewogCXsgLmNvbXBhdGlibGUgPSAieGxueCxvcGItc3lzYWNlLTEuMDAuYiIsIH0sCkBAIC0xMjQxLDM0ICsxMTk4LDIwIEBACiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWNlX29mX21hdGNoKTsKKyNlbHNlIC8qIENPTkZJR19PRiAqLworI2RlZmluZSBhY2Vfb2ZfbWF0Y2ggTlVMTAorI2VuZGlmIC8qIENPTkZJR19PRiAqLwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhY2Vfb2ZfZHJpdmVyID0gewotCS5wcm9iZSA9IGFjZV9vZl9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoYWNlX29mX3JlbW92ZSksCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhY2VfcGxhdGZvcm1fZHJpdmVyID0geworCS5wcm9iZSA9IGFjZV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWNlX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAieHN5c2FjZSIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkubmFtZSA9ICJ4c3lzYWNlIiwKIAkJLm9mX21hdGNoX3RhYmxlID0gYWNlX29mX21hdGNoLAogCX0sCiB9OwogCi0vKiBSZWdpc3RyYXRpb24gaGVscGVycyB0byBrZWVwIHRoZSBudW1iZXIgb2YgI2lmZGVmcyB0byBhIG1pbmltdW0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9faW5pdCBhY2Vfb2ZfcmVnaXN0ZXIodm9pZCkKLXsKLQlwcl9kZWJ1ZygieHN5c2FjZTogcmVnaXN0ZXJpbmcgT0YgYmluZGluZ1xuIik7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWNlX29mX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQgYWNlX29mX3VucmVnaXN0ZXIodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWNlX29mX2RyaXZlcik7Ci19Ci0jZWxzZSAvKiBDT05GSUdfT0YgKi8KLS8qIENPTkZJR19PRiBub3QgZW5hYmxlZDsgZG8gbm90aGluZyBoZWxwZXJzICovCi1zdGF0aWMgaW5saW5lIGludCBfX2luaXQgYWNlX29mX3JlZ2lzdGVyKHZvaWQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQgYWNlX29mX3VucmVnaXN0ZXIodm9pZCkgeyB9Ci0jZW5kaWYgLyogQ09ORklHX09GICovCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTW9kdWxlIGluaXQvZXhpdCByb3V0aW5lcwogICovCkBAIC0xMjgyLDExICsxMjI1LDYgQEAKIAkJZ290byBlcnJfYmxrOwogCX0KIAotCXJjID0gYWNlX29mX3JlZ2lzdGVyKCk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycl9vZjsKLQotCXByX2RlYnVnKCJ4c3lzYWNlOiByZWdpc3RlcmluZyBwbGF0Zm9ybSBiaW5kaW5nXG4iKTsKIAlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWNlX3BsYXRmb3JtX2RyaXZlcik7CiAJaWYgKHJjKQogCQlnb3RvIGVycl9wbGF0OwpAQCAtMTI5NSwyMSArMTIzMywxNyBAQAogCXJldHVybiAwOwogCiBlcnJfcGxhdDoKLQlhY2Vfb2ZfdW5yZWdpc3RlcigpOwotZXJyX29mOgogCXVucmVnaXN0ZXJfYmxrZGV2KGFjZV9tYWpvciwgInhzeXNhY2UiKTsKIGVycl9ibGs6CiAJcHJpbnRrKEtFUk5fRVJSICJ4c3lzYWNlOiByZWdpc3RyYXRpb24gZmFpbGVkOyBlcnI9JWlcbiIsIHJjKTsKIAlyZXR1cm4gcmM7CiB9Cittb2R1bGVfaW5pdChhY2VfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhY2VfZXhpdCh2b2lkKQogewogCXByX2RlYnVnKCJVbnJlZ2lzdGVyaW5nIFhpbGlueCBTeXN0ZW1BQ0UgZHJpdmVyXG4iKTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWNlX3BsYXRmb3JtX2RyaXZlcik7Ci0JYWNlX29mX3VucmVnaXN0ZXIoKTsKIAl1bnJlZ2lzdGVyX2Jsa2RldihhY2VfbWFqb3IsICJ4c3lzYWNlIik7CiB9Ci0KLW1vZHVsZV9pbml0KGFjZV9pbml0KTsKIG1vZHVsZV9leGl0KGFjZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2F0aDNrLmMgYi9kcml2ZXJzL2JsdWV0b290aC9hdGgzay5jCmluZGV4IDZiYWNlZjMuLmE1ODU0NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2F0aDNrLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYXRoM2suYwpAQCAtMzc1LDYgKzM3NSwxMSBAQAogCiAJLyogbG9hZCBwYXRjaCBhbmQgc3lzY29uZmlnIGZpbGVzIGZvciBBUjMwMTIgKi8KIAlpZiAoaWQtPmRyaXZlcl9pbmZvICYgQlRVU0JfQVRIMzAxMikgeworCisJCS8qIE5ldyBmaXJtd2FyZSB3aXRoIHBhdGNoIGFuZCBzeXNjb25maWcgZmlsZXMgYWxyZWFkeSBsb2FkZWQgKi8KKwkJaWYgKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSA+IDB4MDAwMSkKKwkJCXJldHVybiAtRU5PREVWOworCiAJCXJldCA9IGF0aDNrX2xvYWRfcGF0Y2godWRldik7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlCVF9FUlIoIkxvYWRpbmcgcGF0Y2ggZmlsZSBmYWlsZWQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfZGVidWdmcy5jCmluZGV4IGZkNjMwNWIuLjhlY2Y0YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2RlYnVnZnMuYwpAQCAtNjQsNiArNjQsOCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnJlc3VsdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXByaXYtPmJ0bXJ2bF9kZXYuaHNjZmdjbWQgPSByZXN1bHQ7CiAKQEAgLTEwOCw2ICsxMTAsOCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnJlc3VsdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXByaXYtPmJ0bXJ2bF9kZXYucHNtb2RlID0gcmVzdWx0OwogCkBAIC0xNDcsNiArMTUxLDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZyZXN1bHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwcml2LT5idG1ydmxfZGV2LnBzY21kID0gcmVzdWx0OwogCkBAIC0xOTEsNiArMTk3LDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTYsICZyZXN1bHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwcml2LT5idG1ydmxfZGV2LmdwaW9fZ2FwID0gcmVzdWx0OwogCkBAIC0yMzAsNiArMjM4LDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZyZXN1bHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwcml2LT5idG1ydmxfZGV2LmhzY21kID0gcmVzdWx0OwogCWlmIChwcml2LT5idG1ydmxfZGV2LmhzY21kKSB7CkBAIC0yNzIsNiArMjgyLDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZyZXN1bHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwcml2LT5idG1ydmxfZGV2LmhzbW9kZSA9IHJlc3VsdDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKaW5kZXggYzJkZTg5NS4uOTFkMTNhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCkBAIC01NCw2ICs1NCw3IEBACiAjZGVmaW5lIEJUVVNCX0JDTTkyMDM1CQkweDEwCiAjZGVmaW5lIEJUVVNCX0JST0tFTl9JU09DCTB4MjAKICNkZWZpbmUgQlRVU0JfV1JPTkdfU0NPX01UVQkweDQwCisjZGVmaW5lIEJUVVNCX0FUSDMwMTIJCTB4ODAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGJ0dXNiX3RhYmxlW10gPSB7CiAJLyogR2VuZXJpYyBCbHVldG9vdGggVVNCIGRldmljZSAqLwpAQCAtMTEwLDcgKzExMSw3IEBACiAJeyBVU0JfREVWSUNFKDB4MDNmMCwgMHgzMTFkKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfSUdOT1JFIH0sCiAKIAkvKiBBdGhlcm9zIDMwMTIgd2l0aCBzZmxhc2ggZmlybXdhcmUgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweDMwMDQpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9JR05PUkUgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweDMwMDQpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9BVEgzMDEyIH0sCiAKIAkvKiBBdGhlcm9zIEFSNUJCVTEyIHdpdGggc2ZsYXNoIGZpcm13YXJlICovCiAJeyBVU0JfREVWSUNFKDB4MDQ4OSwgMHhlMDJjKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfSUdOT1JFIH0sCkBAIC05MTQsNiArOTE1LDE1IEBACiAJaWYgKGlnbm9yZV9zbmlmZmVyICYmIGlkLT5kcml2ZXJfaW5mbyAmIEJUVVNCX1NOSUZGRVIpCiAJCXJldHVybiAtRU5PREVWOwogCisJaWYgKGlkLT5kcml2ZXJfaW5mbyAmIEJUVVNCX0FUSDMwMTIpIHsKKwkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCisJCS8qIE9sZCBmaXJtd2FyZSB3b3VsZCBvdGhlcndpc2UgbGV0IGF0aDNrIGRyaXZlciBsb2FkCisJCSAqIHBhdGNoIGFuZCBzeXNjb25maWcgZmlsZXMgKi8KKwkJaWYgKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSA8PSAweDAwMDEpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuaCBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmgKaW5kZXggOTk5ODAzYy4uNWRhNjdmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuaAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5oCkBAIC05MCw5ICs5MCwxMCBAQAogI2RlZmluZSBHNHhfR01DSF9TSVpFX01BU0sJKDB4ZiA8PCA4KQogI2RlZmluZSBHNHhfR01DSF9TSVpFXzFNCSgweDEgPDwgOCkKICNkZWZpbmUgRzR4X0dNQ0hfU0laRV8yTQkoMHgzIDw8IDgpCi0jZGVmaW5lIEc0eF9HTUNIX1NJWkVfVlRfMU0JKDB4OSA8PCA4KQotI2RlZmluZSBHNHhfR01DSF9TSVpFX1ZUXzFfNU0JKDB4YSA8PCA4KQotI2RlZmluZSBHNHhfR01DSF9TSVpFX1ZUXzJNCSgweGMgPDwgOCkKKyNkZWZpbmUgRzR4X0dNQ0hfU0laRV9WVF9FTgkoMHg4IDw8IDgpCisjZGVmaW5lIEc0eF9HTUNIX1NJWkVfVlRfMU0JKEc0eF9HTUNIX1NJWkVfMU0gfCBHNHhfR01DSF9TSVpFX1ZUX0VOKQorI2RlZmluZSBHNHhfR01DSF9TSVpFX1ZUXzFfNU0JKCgweDIgPDwgOCkgfCBHNHhfR01DSF9TSVpFX1ZUX0VOKQorI2RlZmluZSBHNHhfR01DSF9TSVpFX1ZUXzJNCShHNHhfR01DSF9TSVpFXzJNIHwgRzR4X0dNQ0hfU0laRV9WVF9FTikKIAogI2RlZmluZSBHRlhfRkxTSF9DTlRMCQkweDIxNzAgLyogOTE1KyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYXBtLWVtdWxhdGlvbi5jIGIvZHJpdmVycy9jaGFyL2FwbS1lbXVsYXRpb24uYwppbmRleCA1NDg3MDhjLi5hNzM0NmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYXBtLWVtdWxhdGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9hcG0tZW11bGF0aW9uLmMKQEAgLTYwNiw3ICs2MDYsNyBAQAogCQkJcmV0dXJuIE5PVElGWV9PSzsKIAogCQkvKiBpbnRlcnJ1cHRlZCBieSBzaWduYWwgKi8KLQkJcmV0dXJuIE5PVElGWV9CQUQ7CisJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKGVycik7CiAKIAljYXNlIFBNX1BPU1RfU1VTUEVORDoKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ic3IuYyBiL2RyaXZlcnMvY2hhci9ic3IuYwppbmRleCBjZjM5YmMwLi4wYzY4ODIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYnNyLmMKKysrIGIvZHJpdmVycy9jaGFyL2Jzci5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIAogCQljdXItPmJzcl9taW5vciAgPSBpICsgdG90YWxfYnNyX2RldnM7CiAJCWN1ci0+YnNyX2FkZHIgICA9IHJlcy5zdGFydDsKLQkJY3VyLT5ic3JfbGVuICAgID0gcmVzLmVuZCAtIHJlcy5zdGFydCArIDE7CisJCWN1ci0+YnNyX2xlbiAgICA9IHJlc291cmNlX3NpemUoJnJlcyk7CiAJCWN1ci0+YnNyX2J5dGVzICA9IGJzcl9ieXRlc1tpXTsKIAkJY3VyLT5ic3Jfc3RyaWRlID0gYnNyX3N0cmlkZVtpXTsKIAkJY3VyLT5ic3JfZGV2ICAgID0gTUtERVYoYnNyX21ham9yLCBpICsgdG90YWxfYnNyX2RldnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfbnZyYW0uYyBiL2RyaXZlcnMvY2hhci9nZW5lcmljX252cmFtLmMKaW5kZXggMGU5NDFiNS4uNmM0ZjRiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfbnZyYW0uYworKysgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19udnJhbS5jCkBAIC0zNCwxMiArMzQsMTYgQEAKIHN0YXRpYyBsb2ZmX3QgbnZyYW1fbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQogewogCXN3aXRjaCAob3JpZ2luKSB7CisJY2FzZSAwOgorCQlicmVhazsKIAljYXNlIDE6CiAJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKIAkJYnJlYWs7CiAJY2FzZSAyOgogCQlvZmZzZXQgKz0gbnZyYW1fbGVuOwogCQlicmVhazsKKwlkZWZhdWx0OgorCQlvZmZzZXQgPSAtMTsKIAl9CiAJaWYgKG9mZnNldCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hwZXQuYyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKaW5kZXggMDUxNDc0Yy4uMDgzMzg5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2hwZXQuYworKysgYi9kcml2ZXJzL2NoYXIvaHBldC5jCkBAIC0xNjMsMTEgKzE2MywzMiBAQAogCSAqIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgdHJlYXRpbmcgbm9uLXBlcmlvZGljIGxpa2UgcGVyaW9kaWMuCiAJICovCiAJaWYgKChkZXZwLT5oZF9mbGFncyAmIChIUEVUX0lFIHwgSFBFVF9QRVJJT0RJQykpID09IEhQRVRfSUUpIHsKLQkJdW5zaWduZWQgbG9uZyBtLCB0OworCQl1bnNpZ25lZCBsb25nIG0sIHQsIG1jLCBiYXNlLCBrOworCQlzdHJ1Y3QgaHBldCBfX2lvbWVtICpocGV0ID0gZGV2cC0+aGRfaHBldDsKKwkJc3RydWN0IGhwZXRzICpocGV0cCA9IGRldnAtPmhkX2hwZXRzOwogCiAJCXQgPSBkZXZwLT5oZF9pcmVxZnJlcTsKIAkJbSA9IHJlYWRfY291bnRlcigmZGV2cC0+aGRfdGltZXItPmhwZXRfY29tcGFyZSk7Ci0JCXdyaXRlX2NvdW50ZXIodCArIG0sICZkZXZwLT5oZF90aW1lci0+aHBldF9jb21wYXJlKTsKKwkJbWMgPSByZWFkX2NvdW50ZXIoJmhwZXQtPmhwZXRfbWMpOworCQkvKiBUaGUgdGltZSBmb3IgdGhlIG5leHQgaW50ZXJydXB0IHdvdWxkIGxvZ2ljYWxseSBiZSB0ICsgbSwKKwkJICogaG93ZXZlciwgaWYgd2UgYXJlIHZlcnkgdW5sdWNreSBhbmQgdGhlIGludGVycnVwdCBpcyBkZWxheWVkCisJCSAqIGZvciBsb25nZXIgdGhhbiB0IHRoZW4gd2Ugd2lsbCBjb21wbGV0ZWx5IG1pc3MgdGhlIG5leHQKKwkJICogaW50ZXJydXB0IGlmIHdlIHNldCB0ICsgbSBhbmQgYW4gYXBwbGljYXRpb24gd2lsbCBoYW5nLgorCQkgKiBUaGVyZWZvcmUgd2UgbmVlZCB0byBtYWtlIGEgbW9yZSBjb21wbGV4IGNvbXB1dGF0aW9uIGFzc3VtaW5nCisJCSAqIHRoYXQgdGhlcmUgZXhpc3RzIGEgayBmb3Igd2hpY2ggdGhlIGZvbGxvd2luZyBpcyB0cnVlOgorCQkgKiBrICogdCArIGJhc2UgPCBtYyArIGRlbHRhCisJCSAqIChrICsgMSkgKiB0ICsgYmFzZSA+IG1jICsgZGVsdGEKKwkJICogd2hlcmUgdCBpcyB0aGUgaW50ZXJ2YWwgaW4gaHBldCB0aWNrcyBmb3IgdGhlIGdpdmVuIGZyZXEsCisJCSAqIGJhc2UgaXMgdGhlIHRoZW9yZXRpY2FsIHN0YXJ0IHZhbHVlIDAgPCBiYXNlIDwgdCwKKwkJICogbWMgaXMgdGhlIG1haW4gY291bnRlciB2YWx1ZSBhdCB0aGUgdGltZSBvZiB0aGUgaW50ZXJydXB0LAorCQkgKiBkZWx0YSBpcyB0aGUgdGltZSBpdCB0YWtlcyB0byB3cml0ZSB0aGUgYSB2YWx1ZSB0byB0aGUKKwkJICogY29tcGFyYXRvci4KKwkJICogayBtYXkgdGhlbiBiZSBjb21wdXRlZCBhcyAobWMgLSBiYXNlICsgZGVsdGEpIC8gdCAuCisJCSAqLworCQliYXNlID0gbWMgJSB0OworCQlrID0gKG1jIC0gYmFzZSArIGhwZXRwLT5ocF9kZWx0YSkgLyB0OworCQl3cml0ZV9jb3VudGVyKHQgKiAoayArIDEpICsgYmFzZSwKKwkJCSAgICAgICZkZXZwLT5oZF90aW1lci0+aHBldF9jb21wYXJlKTsKIAl9CiAKIAlpZiAoZGV2cC0+aGRfZmxhZ3MgJiBIUEVUX1NIQVJFRF9JUlEpCkBAIC05MzEsNyArOTUyLDcgQEAKICNpZmRlZiBDT05GSUdfSUE2NAogCWlmICghaHBldF9jbG9ja3NvdXJjZSkgewogCQlocGV0X21jdHIgPSAodm9pZCBfX2lvbWVtICopJmhwZXRwLT5ocF9ocGV0LT5ocGV0X21jOwotCQlDTEtTUkNfRlNZU19NTUlPX1NFVChjbG9ja3NvdXJjZV9ocGV0LmZzeXNfbW1pbywgaHBldF9tY3RyKTsKKwkJY2xvY2tzb3VyY2VfaHBldC5hcmNoZGF0YS5mc3lzX21taW8gPSBocGV0X21jdHI7CiAJCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjbG9ja3NvdXJjZV9ocGV0LCBocGV0cC0+aHBfdGlja19mcmVxKTsKIAkJaHBldHAtPmhwX2Nsb2Nrc291cmNlID0gJmNsb2Nrc291cmNlX2hwZXQ7CiAJCWhwZXRfY2xvY2tzb3VyY2UgPSAmY2xvY2tzb3VyY2VfaHBldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vS2NvbmZpZwppbmRleCBhNjAwNDNiLi4xZDJlYmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnCkBAIC0yMTAsMyArMjEwLDE1IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGljb3hjZWxsLXJuZy4KIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIEhXX1JBTkRPTV9QUEM0WFgKKwl0cmlzdGF0ZSAiUG93ZXJQQyA0eHggZ2VuZXJpYyB0cnVlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIV19SQU5ET00gJiYgUFBDICYmIDR4eAorCS0tLWhlbHAtLS0KKwkgVGhpcyBkcml2ZXIgcHJvdmlkZXMgdGhlIGtlcm5lbC1zaWRlIHN1cHBvcnQgZm9yIHRoZSBUUk5HIGhhcmR3YXJlCisJIGZvdW5kIGluIHRoZSBzZWN1cml0eSBmdW5jdGlvbiBvZiBzb21lIFBvd2VyUEMgNHh4IFNvQ3MuCisKKwkgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwcGM0eHgtcm5nLgorCisJIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9NYWtlZmlsZQppbmRleCAzZGI0ZWI4Li5jODhmMjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vTWFrZWZpbGUKQEAgLTIwLDMgKzIwLDQgQEAKIG9iai0kKENPTkZJR19IV19SQU5ET01fT0NURU9OKSArPSBvY3Rlb24tcm5nLm8KIG9iai0kKENPTkZJR19IV19SQU5ET01fTk9NQURJSykgKz0gbm9tYWRpay1ybmcubwogb2JqLSQoQ09ORklHX0hXX1JBTkRPTV9QSUNPWENFTEwpICs9IHBpY294Y2VsbC1ybmcubworb2JqLSQoQ09ORklHX0hXX1JBTkRPTV9QUEM0WFgpICs9IHBwYzR4eC1ybmcubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2NvcmUuYwppbmRleCAyMDE2YWFkLi4xYmFmYjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2NvcmUuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2NvcmUuYwpAQCAtMTksNyArMTksNyBAQAogCUNvcHlyaWdodCAyMDAwLDIwMDEgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQG1hbmRyYWtlc29mdC5jb20+CiAKIAlBZGRlZCBnZW5lcmljIFJORyBBUEkKLQlDb3B5cmlnaHQgMjAwNiBNaWNoYWVsIEJ1ZXNjaCA8bWJ1ZXNjaEBmcmVlbmV0LmRlPgorCUNvcHlyaWdodCAyMDA2IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAJQ29weXJpZ2h0IDIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KIAogCVBsZWFzZSByZWFkIERvY3VtZW50YXRpb24vaHdfcmFuZG9tLnR4dCBmb3IgZGV0YWlscyBvbiB1c2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL25vbWFkaWstcm5nLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL25vbWFkaWstcm5nLmMKaW5kZXggZGQxZDE0My4uNTJlMDhjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9ub21hZGlrLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vbm9tYWRpay1ybmcuYwpAQCAtNTUsNyArNTUsNyBAQAogCiAJcmV0ID0gYW1iYV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCBkZXYtPmRldi5pbml0X25hbWUpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X2NsazsKIAlyZXQgPSAtRU5PTUVNOwogCWJhc2UgPSBpb3JlbWFwKGRldi0+cmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZkZXYtPnJlcykpOwogCWlmICghYmFzZSkKQEAgLTcwLDYgKzcwLDcgQEAKIAlpb3VubWFwKGJhc2UpOwogb3V0X3JlbGVhc2U6CiAJYW1iYV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKK291dF9jbGs6CiAJY2xrX2Rpc2FibGUocm5nX2Nsayk7CiAJY2xrX3B1dChybmdfY2xrKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9vbWFwLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9vbWFwLXJuZy5jCmluZGV4IDJjYzc1NWEuLmI3NTdmYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vb21hcC1ybmcuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL29tYXAtcm5nLmMKQEAgLTExMyw4ICsxMTMsMTAgQEAKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAKLQlpZiAoIXJlcykKLQkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKCFyZXMpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJfcmVnaW9uOworCX0KIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSkpIHsKIAkJcmV0ID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9wcGM0eHgtcm5nLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL3BwYzR4eC1ybmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFmYTZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9wcGM0eHgtcm5nLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBHZW5lcmljIFBvd2VyUEMgNDR4IFJORyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIFBQQzRYWF9UUk5HX0RFVl9DVFJMIDB4NjAwODAKKworI2RlZmluZSBQUEM0WFhfVFJOR0UgMHgwMDAyMDAwMAorI2RlZmluZSBQUEM0WFhfVFJOR19DVFJMIDB4MDAwOAorI2RlZmluZSBQUEM0WFhfVFJOR19DVFJMX0RBTE0gMHgyMAorI2RlZmluZSBQUEM0WFhfVFJOR19TVEFUIDB4MDAwNAorI2RlZmluZSBQUEM0WFhfVFJOR19TVEFUX0IgMHgxCisjZGVmaW5lIFBQQzRYWF9UUk5HX0RBVEEgMHgwMDAwCisKKyNkZWZpbmUgTU9EVUxFX05BTUUgInBwYzR4eF9ybmciCisKK3N0YXRpYyBpbnQgcHBjNHh4X3JuZ19kYXRhX3ByZXNlbnQoc3RydWN0IGh3cm5nICpybmcsIGludCB3YWl0KQoreworCXZvaWQgX19pb21lbSAqcm5nX3JlZ3MgPSAodm9pZCBfX2lvbWVtICopIHJuZy0+cHJpdjsKKwlpbnQgYnVzeSwgaSwgcHJlc2VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQlidXN5ID0gKGluX2xlMzIocm5nX3JlZ3MgKyBQUEM0WFhfVFJOR19TVEFUKSAmIFBQQzRYWF9UUk5HX1NUQVRfQik7CisJCWlmICghYnVzeSB8fCAhd2FpdCkgeworCQkJcHJlc2VudCA9IDE7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KKwlyZXR1cm4gcHJlc2VudDsKK30KKworc3RhdGljIGludCBwcGM0eHhfcm5nX2RhdGFfcmVhZChzdHJ1Y3QgaHdybmcgKnJuZywgdTMyICpkYXRhKQoreworCXZvaWQgX19pb21lbSAqcm5nX3JlZ3MgPSAodm9pZCBfX2lvbWVtICopIHJuZy0+cHJpdjsKKwkqZGF0YSA9IGluX2xlMzIocm5nX3JlZ3MgKyBQUEM0WFhfVFJOR19EQVRBKTsKKwlyZXR1cm4gNDsKK30KKworc3RhdGljIGludCBwcGM0eHhfcm5nX2VuYWJsZShpbnQgZW5hYmxlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3RybDsKKwl2b2lkIF9faW9tZW0gKmN0cmxfcmVnOworCWludCBlcnIgPSAwOworCXUzMiB2YWw7CisKKwkvKiBGaW5kIHRoZSBtYWluIGNyeXB0byBkZXZpY2Ugbm9kZSBhbmQgbWFwIGl0IHRvIHR1cm4gdGhlIFRSTkcgb24gKi8KKwljdHJsID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImFtY2MscHBjNHh4LWNyeXB0byIpOworCWlmICghY3RybCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljdHJsX3JlZyA9IG9mX2lvbWFwKGN0cmwsIDApOworCWlmICghY3RybF9yZWcpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJdmFsID0gaW5fbGUzMihjdHJsX3JlZyArIFBQQzRYWF9UUk5HX0RFVl9DVFJMKTsKKworCWlmIChlbmFibGUpCisJCXZhbCB8PSBQUEM0WFhfVFJOR0U7CisJZWxzZQorCQl2YWwgPSB2YWwgJiB+UFBDNFhYX1RSTkdFOworCisJb3V0X2xlMzIoY3RybF9yZWcgKyBQUEM0WFhfVFJOR19ERVZfQ1RSTCwgdmFsKTsKKwlpb3VubWFwKGN0cmxfcmVnKTsKKworb3V0OgorCW9mX25vZGVfcHV0KGN0cmwpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBod3JuZyBwcGM0eHhfcm5nID0geworCS5uYW1lID0gTU9EVUxFX05BTUUsCisJLmRhdGFfcHJlc2VudCA9IHBwYzR4eF9ybmdfZGF0YV9wcmVzZW50LAorCS5kYXRhX3JlYWQgPSBwcGM0eHhfcm5nX2RhdGFfcmVhZCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBwYzR4eF9ybmdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXZvaWQgX19pb21lbSAqcm5nX3JlZ3M7CisJaW50IGVyciA9IDA7CisKKwlybmdfcmVncyA9IG9mX2lvbWFwKGRldi0+ZGV2Lm9mX25vZGUsIDApOworCWlmICghcm5nX3JlZ3MpCisJCXJldHVybiAtRU5PREVWOworCisJZXJyID0gcHBjNHh4X3JuZ19lbmFibGUoMSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW91dF9sZTMyKHJuZ19yZWdzICsgUFBDNFhYX1RSTkdfQ1RSTCwgUFBDNFhYX1RSTkdfQ1RSTF9EQUxNKTsKKwlwcGM0eHhfcm5nLnByaXYgPSAodW5zaWduZWQgbG9uZykgcm5nX3JlZ3M7CisKKwllcnIgPSBod3JuZ19yZWdpc3RlcigmcHBjNHh4X3JuZyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBwcGM0eHhfcm5nX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJdm9pZCBfX2lvbWVtICpybmdfcmVncyA9ICh2b2lkIF9faW9tZW0gKikgcHBjNHh4X3JuZy5wcml2OworCisJaHdybmdfdW5yZWdpc3RlcigmcHBjNHh4X3JuZyk7CisJcHBjNHh4X3JuZ19lbmFibGUoMCk7CisJaW91bm1hcChybmdfcmVncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcHBjNHh4X3JuZ19tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicHBjNHh4LXJuZyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbWNjLHBwYzQ2MGV4LXJuZyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbWNjLHBwYzQ0MGVweC1ybmciLCB9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHBjNHh4X3JuZ19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBNT0RVTEVfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHBwYzR4eF9ybmdfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBwcGM0eHhfcm5nX3Byb2JlLAorCS5yZW1vdmUgPSBwcGM0eHhfcm5nX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBwYzR4eF9ybmdfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBwYzR4eF9ybmdfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHBwYzR4eF9ybmdfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcGM0eHhfcm5nX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHBjNHh4X3JuZ19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocHBjNHh4X3JuZ19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSm9zaCBCb3llciA8andib3llckBsaW51eC52bmV0LmlibS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhXIFJORyBkcml2ZXIgZm9yIFBQQyA0eHggcHJvY2Vzc29ycyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS90aW1lcmlvbWVtLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS90aW1lcmlvbWVtLXJuZy5jCmluZGV4IGE5NGU5MzAuLmE4NDI4ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vdGltZXJpb21lbS1ybmcuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL3RpbWVyaW9tZW0tcm5nLmMKQEAgLTEwMCw4ICsxMDAsNyBAQAogCiAJdGltZXJpb21lbV9ybmdfZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JdGltZXJpb21lbV9ybmdfZGF0YS0+YWRkcmVzcyA9IGlvcmVtYXAocmVzLT5zdGFydCwKLQkJCQkJCXJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCXRpbWVyaW9tZW1fcm5nX2RhdGEtPmFkZHJlc3MgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKCF0aW1lcmlvbWVtX3JuZ19kYXRhLT5hZGRyZXNzKQogCQlyZXR1cm4gLUVJTzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL252cmFtLmMgYi9kcml2ZXJzL2NoYXIvbnZyYW0uYwppbmRleCAxNjZmMWU3Li5kYTNjZmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbnZyYW0uYworKysgYi9kcml2ZXJzL2NoYXIvbnZyYW0uYwpAQCAtMjI0LDYgKzIyNCw4IEBACiAJY2FzZSAyOgogCQlvZmZzZXQgKz0gTlZSQU1fQllURVM7CiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiAob2Zmc2V0ID49IDApID8gKGZpbGUtPmZfcG9zID0gb2Zmc2V0KSA6IC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcHMzZmxhc2guYyBiL2RyaXZlcnMvY2hhci9wczNmbGFzaC5jCmluZGV4IDg1YzAwNGEuLmQwYzU3YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wczNmbGFzaC5jCisrKyBiL2RyaXZlcnMvY2hhci9wczNmbGFzaC5jCkBAIC0xMDEsMTIgKzEwMSwxNiBAQAogCiAJbXV0ZXhfbG9jaygmZmlsZS0+Zl9tYXBwaW5nLT5ob3N0LT5pX211dGV4KTsKIAlzd2l0Y2ggKG9yaWdpbikgeworCWNhc2UgMDoKKwkJYnJlYWs7CiAJY2FzZSAxOgogCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CiAJCWJyZWFrOwogCWNhc2UgMjoKIAkJb2Zmc2V0ICs9IGRldi0+cmVnaW9uc1tkZXYtPnJlZ2lvbl9pZHhdLnNpemUqZGV2LT5ibGtfc2l6ZTsKIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb2Zmc2V0ID0gLTE7CiAJfQogCWlmIChvZmZzZXQgPCAwKSB7CiAJCXJlcyA9IC1FSU5WQUw7CkBAIC0zMDUsOSArMzA5LDE0IEBACiAJcmV0dXJuIHBzM2ZsYXNoX3dyaXRlYmFjayhwczNmbGFzaF9kZXYpOwogfQogCi1zdGF0aWMgaW50IHBzM2ZsYXNoX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpCitzdGF0aWMgaW50IHBzM2ZsYXNoX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYykKIHsKLQlyZXR1cm4gcHMzZmxhc2hfd3JpdGViYWNrKHBzM2ZsYXNoX2Rldik7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJaW50IGVycjsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJZXJyID0gcHMzZmxhc2hfd3JpdGViYWNrKHBzM2ZsYXNoX2Rldik7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGlycXJldHVybl90IHBzM2ZsYXNoX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCmluZGV4IGQ0ZGRlYmEuLjcyOTI4MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yYW5kb20uYworKysgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKQEAgLTE1MjMsNiArMTUyMywyMSBAQAogCXJldHVybiBoYWxmX21kNF90cmFuc2Zvcm0oaGFzaCwga2V5cHRyLT5zZWNyZXQpOwogfQogCitfX3UzMiBzZWN1cmVfaXB2Nl9pZChjb25zdCBfX2JlMzIgZGFkZHJbNF0pCit7CisJY29uc3Qgc3RydWN0IGtleWRhdGEgKmtleXB0cjsKKwlfX3UzMiBoYXNoWzRdOworCisJa2V5cHRyID0gZ2V0X2tleXB0cigpOworCisJaGFzaFswXSA9IChfX2ZvcmNlIF9fdTMyKWRhZGRyWzBdOworCWhhc2hbMV0gPSAoX19mb3JjZSBfX3UzMilkYWRkclsxXTsKKwloYXNoWzJdID0gKF9fZm9yY2UgX191MzIpZGFkZHJbMl07CisJaGFzaFszXSA9IChfX2ZvcmNlIF9fdTMyKWRhZGRyWzNdOworCisJcmV0dXJuIGhhbGZfbWQ0X3RyYW5zZm9ybShoYXNoLCBrZXlwdHItPnNlY3JldCk7Cit9CisKICNpZmRlZiBDT05GSUdfSU5FVAogCiBfX3UzMiBzZWN1cmVfdGNwX3NlcXVlbmNlX251bWJlcihfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci94aWxpbnhfaHdpY2FwL3hpbGlueF9od2ljYXAuYyBiL2RyaXZlcnMvY2hhci94aWxpbnhfaHdpY2FwL3hpbGlueF9od2ljYXAuYwppbmRleCAzOWNjZGVhLi5lOTBlMWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC94aWxpbnhfaHdpY2FwLmMKKysrIGIvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAveGlsaW54X2h3aWNhcC5jCkBAIC02MjEsNyArNjIxLDcgQEAKIAogCWRydmRhdGEtPm1lbV9zdGFydCA9IHJlZ3NfcmVzLT5zdGFydDsKIAlkcnZkYXRhLT5tZW1fZW5kID0gcmVnc19yZXMtPmVuZDsKLQlkcnZkYXRhLT5tZW1fc2l6ZSA9IHJlZ3NfcmVzLT5lbmQgLSByZWdzX3Jlcy0+c3RhcnQgKyAxOworCWRydmRhdGEtPm1lbV9zaXplID0gcmVzb3VyY2Vfc2l6ZShyZWdzX3Jlcyk7CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkcnZkYXRhLT5tZW1fc3RhcnQsCiAJCQkJCWRydmRhdGEtPm1lbV9zaXplLCBEUklWRVJfTkFNRSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZwppbmRleCA5NmM5MjE5Li4zNGU5YzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWcKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnCkBAIC0xLDUgKzEsMTcgQEAKIGNvbmZpZyBDTEtTUkNfSTgyNTMKIAlib29sCiAKK2NvbmZpZyBDTEtFVlRfSTgyNTMKKwlib29sCisKK2NvbmZpZyBJODI1M19MT0NLCisJYm9vbAorCitjb25maWcgQ0xLQkxEX0k4MjUzCisJZGVmX2Jvb2wgeSBpZiBDTEtTUkNfSTgyNTMgfHwgQ0xLRVZUX0k4MjUzIHx8IEk4MjUzX0xPQ0sKKwogY29uZmlnIENMS1NSQ19NTUlPCiAJYm9vbAorCitjb25maWcgRFdfQVBCX1RJTUVSCisJYm9vbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZSBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUKaW5kZXggYjk5NTk0Mi4uODVhZDE2NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZQpAQCAtNiw1ICs2LDYgQEAKIG9iai0kKENPTkZJR19TSF9USU1FUl9DTVQpCSs9IHNoX2NtdC5vCiBvYmotJChDT05GSUdfU0hfVElNRVJfTVRVMikJKz0gc2hfbXR1Mi5vCiBvYmotJChDT05GSUdfU0hfVElNRVJfVE1VKQkrPSBzaF90bXUubwotb2JqLSQoQ09ORklHX0NMS1NSQ19JODI1MykJKz0gaTgyNTMubworb2JqLSQoQ09ORklHX0NMS0JMRF9JODI1MykJKz0gaTgyNTMubwogb2JqLSQoQ09ORklHX0NMS1NSQ19NTUlPKQkrPSBtbWlvLm8KK29iai0kKENPTkZJR19EV19BUEJfVElNRVIpCSs9IGR3X2FwYl90aW1lci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2R3X2FwYl90aW1lci5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9kd19hcGJfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODBmODcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9kd19hcGJfdGltZXIuYwpAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBKYWNvYiBQYW4gKGphY29iLmp1bi5wYW5AaW50ZWwuY29tKQorICoKKyAqIFNoYXJlZCB3aXRoIEFSTSBwbGF0Zm9ybXMsIEphbWllIElsZXMsIFBpY29jaGlwIDIwMTEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFN1cHBvcnQgZm9yIHRoZSBTeW5vcHN5cyBEZXNpZ25XYXJlIEFQQiBUaW1lcnMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kd19hcGJfdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIEFQQlRfTUlOX1BFUklPRAkJCTQKKyNkZWZpbmUgQVBCVF9NSU5fREVMVEFfVVNFQwkJMjAwCisKKyNkZWZpbmUgQVBCVE1SX05fTE9BRF9DT1VOVAkJMHgwMAorI2RlZmluZSBBUEJUTVJfTl9DVVJSRU5UX1ZBTFVFCQkweDA0CisjZGVmaW5lIEFQQlRNUl9OX0NPTlRST0wJCTB4MDgKKyNkZWZpbmUgQVBCVE1SX05fRU9JCQkJMHgwYworI2RlZmluZSBBUEJUTVJfTl9JTlRfU1RBVFVTCQkweDEwCisKKyNkZWZpbmUgQVBCVE1SU19JTlRfU1RBVFVTCQkweGEwCisjZGVmaW5lIEFQQlRNUlNfRU9JCQkJMHhhNAorI2RlZmluZSBBUEJUTVJTX1JBV19JTlRfU1RBVFVTCQkweGE4CisjZGVmaW5lIEFQQlRNUlNfQ09NUF9WRVJTSU9OCQkweGFjCisKKyNkZWZpbmUgQVBCVE1SX0NPTlRST0xfRU5BQkxFCQkoMSA8PCAwKQorLyogMTogcGVyaW9kaWMsIDA6ZnJlZSBydW5uaW5nLiAqLworI2RlZmluZSBBUEJUTVJfQ09OVFJPTF9NT0RFX1BFUklPRElDCSgxIDw8IDEpCisjZGVmaW5lIEFQQlRNUl9DT05UUk9MX0lOVAkJKDEgPDwgMikKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHdfYXBiX2Nsb2NrX2V2ZW50X2RldmljZSAqCitjZWRfdG9fZHdfYXBiX2NlZChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihldnQsIHN0cnVjdCBkd19hcGJfY2xvY2tfZXZlbnRfZGV2aWNlLCBjZWQpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkd19hcGJfY2xvY2tzb3VyY2UgKgorY2xvY2tzb3VyY2VfdG9fZHdfYXBiX2Nsb2Nrc291cmNlKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjcywgc3RydWN0IGR3X2FwYl9jbG9ja3NvdXJjZSwgY3MpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhcGJ0X3JlYWRsKHN0cnVjdCBkd19hcGJfdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBsb25nIG9mZnMpCit7CisJcmV0dXJuIHJlYWRsKHRpbWVyLT5iYXNlICsgb2Zmcyk7Cit9CisKK3N0YXRpYyB2b2lkIGFwYnRfd3JpdGVsKHN0cnVjdCBkd19hcGJfdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBsb25nIHZhbCwKKwkJIHVuc2lnbmVkIGxvbmcgb2ZmcykKK3sKKwl3cml0ZWwodmFsLCB0aW1lci0+YmFzZSArIG9mZnMpOworfQorCitzdGF0aWMgdm9pZCBhcGJ0X2Rpc2FibGVfaW50KHN0cnVjdCBkd19hcGJfdGltZXIgKnRpbWVyKQoreworCXVuc2lnbmVkIGxvbmcgY3RybCA9IGFwYnRfcmVhZGwodGltZXIsIEFQQlRNUl9OX0NPTlRST0wpOworCisJY3RybCB8PSBBUEJUTVJfQ09OVFJPTF9JTlQ7CisJYXBidF93cml0ZWwodGltZXIsIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOworfQorCisvKioKKyAqIGR3X2FwYl9jbG9ja2V2ZW50X3BhdXNlKCkgLSBzdG9wIHRoZSBjbG9ja19ldmVudF9kZXZpY2UgZnJvbSBydW5uaW5nCisgKgorICogQGR3X2NlZDoJVGhlIEFQQiBjbG9jayB0byBzdG9wIGdlbmVyYXRpbmcgZXZlbnRzLgorICovCit2b2lkIGR3X2FwYl9jbG9ja2V2ZW50X3BhdXNlKHN0cnVjdCBkd19hcGJfY2xvY2tfZXZlbnRfZGV2aWNlICpkd19jZWQpCit7CisJZGlzYWJsZV9pcnEoZHdfY2VkLT50aW1lci5pcnEpOworCWFwYnRfZGlzYWJsZV9pbnQoJmR3X2NlZC0+dGltZXIpOworfQorCitzdGF0aWMgdm9pZCBhcGJ0X2VvaShzdHJ1Y3QgZHdfYXBiX3RpbWVyICp0aW1lcikKK3sKKwlhcGJ0X3JlYWRsKHRpbWVyLCBBUEJUTVJfTl9FT0kpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZHdfYXBiX2Nsb2NrZXZlbnRfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gZGF0YTsKKwlzdHJ1Y3QgZHdfYXBiX2Nsb2NrX2V2ZW50X2RldmljZSAqZHdfY2VkID0gY2VkX3RvX2R3X2FwYl9jZWQoZXZ0KTsKKworCWlmICghZXZ0LT5ldmVudF9oYW5kbGVyKSB7CisJCXByX2luZm8oIlNwdXJpb3VzIEFQQlQgdGltZXIgaW50ZXJydXB0ICVkIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChkd19jZWQtPmVvaSkKKwkJZHdfY2VkLT5lb2koJmR3X2NlZC0+dGltZXIpOworCisJZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBhcGJ0X2VuYWJsZV9pbnQoc3RydWN0IGR3X2FwYl90aW1lciAqdGltZXIpCit7CisJdW5zaWduZWQgbG9uZyBjdHJsID0gYXBidF9yZWFkbCh0aW1lciwgQVBCVE1SX05fQ09OVFJPTCk7CisJLyogY2xlYXIgcGVuZGluZyBpbnRyICovCisJYXBidF9yZWFkbCh0aW1lciwgQVBCVE1SX05fRU9JKTsKKwljdHJsICY9IH5BUEJUTVJfQ09OVFJPTF9JTlQ7CisJYXBidF93cml0ZWwodGltZXIsIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOworfQorCitzdGF0aWMgdm9pZCBhcGJ0X3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJdW5zaWduZWQgbG9uZyBjdHJsOworCXVuc2lnbmVkIGxvbmcgcGVyaW9kOworCXN0cnVjdCBkd19hcGJfY2xvY2tfZXZlbnRfZGV2aWNlICpkd19jZWQgPSBjZWRfdG9fZHdfYXBiX2NlZChldnQpOworCisJcHJfZGVidWcoIiVzIENQVSAlZCBtb2RlPSVkXG4iLCBfX2Z1bmNfXywgZmlyc3RfY3B1KCpldnQtPmNwdW1hc2spLAorCQkgbW9kZSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCQlwZXJpb2QgPSBESVZfUk9VTkRfVVAoZHdfY2VkLT50aW1lci5mcmVxLCBIWik7CisJCWN0cmwgPSBhcGJ0X3JlYWRsKCZkd19jZWQtPnRpbWVyLCBBUEJUTVJfTl9DT05UUk9MKTsKKwkJY3RybCB8PSBBUEJUTVJfQ09OVFJPTF9NT0RFX1BFUklPRElDOworCQlhcGJ0X3dyaXRlbCgmZHdfY2VkLT50aW1lciwgY3RybCwgQVBCVE1SX05fQ09OVFJPTCk7CisJCS8qCisJCSAqIERXIEFQQiBwLiA0NiwgaGF2ZSB0byBkaXNhYmxlIHRpbWVyIGJlZm9yZSBsb2FkIGNvdW50ZXIsCisJCSAqIG1heSBjYXVzZSBzeW5jIHByb2JsZW0uCisJCSAqLworCQljdHJsICY9IH5BUEJUTVJfQ09OVFJPTF9FTkFCTEU7CisJCWFwYnRfd3JpdGVsKCZkd19jZWQtPnRpbWVyLCBjdHJsLCBBUEJUTVJfTl9DT05UUk9MKTsKKwkJdWRlbGF5KDEpOworCQlwcl9kZWJ1ZygiU2V0dGluZyBjbG9jayBwZXJpb2QgJWx1IGZvciBIWiAlZFxuIiwgcGVyaW9kLCBIWik7CisJCWFwYnRfd3JpdGVsKCZkd19jZWQtPnRpbWVyLCBwZXJpb2QsIEFQQlRNUl9OX0xPQURfQ09VTlQpOworCQljdHJsIHw9IEFQQlRNUl9DT05UUk9MX0VOQUJMRTsKKwkJYXBidF93cml0ZWwoJmR3X2NlZC0+dGltZXIsIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKKwkJY3RybCA9IGFwYnRfcmVhZGwoJmR3X2NlZC0+dGltZXIsIEFQQlRNUl9OX0NPTlRST0wpOworCQkvKgorCQkgKiBzZXQgZnJlZSBydW5uaW5nIG1vZGUsIHRoaXMgbW9kZSB3aWxsIGxldCB0aW1lciByZWxvYWQgbWF4CisJCSAqIHRpbWVvdXQgd2hpY2ggd2lsbCBnaXZlIHRpbWUgKDNtaW4gb24gMjVNSHogY2xvY2spIHRvIHJlYXJtCisJCSAqIHRoZSBuZXh0IGV2ZW50LCB0aGVyZWZvcmUgZW11bGF0ZSB0aGUgb25lLXNob3QgbW9kZS4KKwkJICovCisJCWN0cmwgJj0gfkFQQlRNUl9DT05UUk9MX0VOQUJMRTsKKwkJY3RybCAmPSB+QVBCVE1SX0NPTlRST0xfTU9ERV9QRVJJT0RJQzsKKworCQlhcGJ0X3dyaXRlbCgmZHdfY2VkLT50aW1lciwgY3RybCwgQVBCVE1SX05fQ09OVFJPTCk7CisJCS8qIHdyaXRlIGFnYWluIHRvIHNldCBmcmVlIHJ1bm5pbmcgbW9kZSAqLworCQlhcGJ0X3dyaXRlbCgmZHdfY2VkLT50aW1lciwgY3RybCwgQVBCVE1SX05fQ09OVFJPTCk7CisKKwkJLyoKKwkJICogRFcgQVBCIHAuIDQ2LCBsb2FkIGNvdW50ZXIgd2l0aCBhbGwgMXMgYmVmb3JlIHN0YXJ0aW5nIGZyZWUKKwkJICogcnVubmluZyBtb2RlLgorCQkgKi8KKwkJYXBidF93cml0ZWwoJmR3X2NlZC0+dGltZXIsIH4wLCBBUEJUTVJfTl9MT0FEX0NPVU5UKTsKKwkJY3RybCAmPSB+QVBCVE1SX0NPTlRST0xfSU5UOworCQljdHJsIHw9IEFQQlRNUl9DT05UUk9MX0VOQUJMRTsKKwkJYXBidF93cml0ZWwoJmR3X2NlZC0+dGltZXIsIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJCWN0cmwgPSBhcGJ0X3JlYWRsKCZkd19jZWQtPnRpbWVyLCBBUEJUTVJfTl9DT05UUk9MKTsKKwkJY3RybCAmPSB+QVBCVE1SX0NPTlRST0xfRU5BQkxFOworCQlhcGJ0X3dyaXRlbCgmZHdfY2VkLT50aW1lciwgY3RybCwgQVBCVE1SX05fQ09OVFJPTCk7CisJCWJyZWFrOworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9SRVNVTUU6CisJCWFwYnRfZW5hYmxlX2ludCgmZHdfY2VkLT50aW1lcik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBhcGJ0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwKKwkJCSAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGN0cmw7CisJc3RydWN0IGR3X2FwYl9jbG9ja19ldmVudF9kZXZpY2UgKmR3X2NlZCA9IGNlZF90b19kd19hcGJfY2VkKGV2dCk7CisKKwkvKiBEaXNhYmxlIHRpbWVyICovCisJY3RybCA9IGFwYnRfcmVhZGwoJmR3X2NlZC0+dGltZXIsIEFQQlRNUl9OX0NPTlRST0wpOworCWN0cmwgJj0gfkFQQlRNUl9DT05UUk9MX0VOQUJMRTsKKwlhcGJ0X3dyaXRlbCgmZHdfY2VkLT50aW1lciwgY3RybCwgQVBCVE1SX05fQ09OVFJPTCk7CisJLyogd3JpdGUgbmV3IGNvdW50ICovCisJYXBidF93cml0ZWwoJmR3X2NlZC0+dGltZXIsIGRlbHRhLCBBUEJUTVJfTl9MT0FEX0NPVU5UKTsKKwljdHJsIHw9IEFQQlRNUl9DT05UUk9MX0VOQUJMRTsKKwlhcGJ0X3dyaXRlbCgmZHdfY2VkLT50aW1lciwgY3RybCwgQVBCVE1SX05fQ09OVFJPTCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkd19hcGJfY2xvY2tldmVudF9pbml0KCkgLSB1c2UgYW4gQVBCIHRpbWVyIGFzIGEgY2xvY2tfZXZlbnRfZGV2aWNlCisgKgorICogQGNwdToJVGhlIENQVSB0aGUgZXZlbnRzIHdpbGwgYmUgdGFyZ2V0ZWQgYXQuCisgKiBAbmFtZToJVGhlIG5hbWUgdXNlZCBmb3IgdGhlIHRpbWVyIGFuZCB0aGUgSVJRIGZvciBpdC4KKyAqIEByYXRpbmc6CVRoZSByYXRpbmcgdG8gZ2l2ZSB0aGUgdGltZXIuCisgKiBAYmFzZToJSS9PIGJhc2UgZm9yIHRoZSB0aW1lciByZWdpc3RlcnMuCisgKiBAaXJxOglUaGUgaW50ZXJydXB0IG51bWJlciB0byB1c2UgZm9yIHRoZSB0aW1lci4KKyAqIEBmcmVxOglUaGUgZnJlcXVlbmN5IHRoYXQgdGhlIHRpbWVyIGNvdW50cyBhdC4KKyAqCisgKiBUaGlzIGNyZWF0ZXMgYSBjbG9ja19ldmVudF9kZXZpY2UgZm9yIHVzaW5nIHdpdGggdGhlIGdlbmVyaWMgY2xvY2sgbGF5ZXIKKyAqIGJ1dCBkb2VzIG5vdCBzdGFydCBhbmQgcmVnaXN0ZXIgaXQuICBUaGlzIHNob3VsZCBiZSBkb25lIHdpdGgKKyAqIGR3X2FwYl9jbG9ja2V2ZW50X3JlZ2lzdGVyKCkgYXMgdGhlIG5leHQgc3RlcC4gIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUKKyAqIGl0IGhhcyBiZWVuIGNhbGxlZCBmb3IgYSB0aW1lciB0aGVuIHRoZSBJUlEgd2lsbCBiZSByZXF1ZXN0ZWQsIGlmIG5vdCBpdAorICoganVzdCBiZSBlbmFibGVkIHRvIGFsbG93IENQVSBob3RwbHVnIHRvIGF2b2lkIHJlcGVhdGVkbHkgcmVxdWVzdGluZyBhbmQKKyAqIHJlbGVhc2luZyB0aGUgSVJRLgorICovCitzdHJ1Y3QgZHdfYXBiX2Nsb2NrX2V2ZW50X2RldmljZSAqCitkd19hcGJfY2xvY2tldmVudF9pbml0KGludCBjcHUsIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIHJhdGluZywKKwkJICAgICAgIHZvaWQgX19pb21lbSAqYmFzZSwgaW50IGlycSwgdW5zaWduZWQgbG9uZyBmcmVxKQoreworCXN0cnVjdCBkd19hcGJfY2xvY2tfZXZlbnRfZGV2aWNlICpkd19jZWQgPQorCQlremFsbG9jKHNpemVvZigqZHdfY2VkKSwgR0ZQX0tFUk5FTCk7CisJaW50IGVycjsKKworCWlmICghZHdfY2VkKQorCQlyZXR1cm4gTlVMTDsKKworCWR3X2NlZC0+dGltZXIuYmFzZSA9IGJhc2U7CisJZHdfY2VkLT50aW1lci5pcnEgPSBpcnE7CisJZHdfY2VkLT50aW1lci5mcmVxID0gZnJlcTsKKworCWNsb2NrZXZlbnRzX2NhbGNfbXVsdF9zaGlmdCgmZHdfY2VkLT5jZWQsIGZyZXEsIEFQQlRfTUlOX1BFUklPRCk7CisJZHdfY2VkLT5jZWQubWF4X2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucygweDdmZmZmZmZmLAorCQkJCQkJICAgICAgICZkd19jZWQtPmNlZCk7CisJZHdfY2VkLT5jZWQubWluX2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucyg1MDAwLCAmZHdfY2VkLT5jZWQpOworCWR3X2NlZC0+Y2VkLmNwdW1hc2sgPSBjcHVtYXNrX29mKGNwdSk7CisJZHdfY2VkLT5jZWQuZmVhdHVyZXMgPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQyB8IENMT0NLX0VWVF9GRUFUX09ORVNIT1Q7CisJZHdfY2VkLT5jZWQuc2V0X21vZGUgPSBhcGJ0X3NldF9tb2RlOworCWR3X2NlZC0+Y2VkLnNldF9uZXh0X2V2ZW50ID0gYXBidF9uZXh0X2V2ZW50OworCWR3X2NlZC0+Y2VkLmlycSA9IGR3X2NlZC0+dGltZXIuaXJxOworCWR3X2NlZC0+Y2VkLnJhdGluZyA9IHJhdGluZzsKKwlkd19jZWQtPmNlZC5uYW1lID0gbmFtZTsKKworCWR3X2NlZC0+aXJxYWN0aW9uLm5hbWUJCT0gZHdfY2VkLT5jZWQubmFtZTsKKwlkd19jZWQtPmlycWFjdGlvbi5oYW5kbGVyCT0gZHdfYXBiX2Nsb2NrZXZlbnRfaXJxOworCWR3X2NlZC0+aXJxYWN0aW9uLmRldl9pZAk9ICZkd19jZWQtPmNlZDsKKwlkd19jZWQtPmlycWFjdGlvbi5pcnEJCT0gaXJxOworCWR3X2NlZC0+aXJxYWN0aW9uLmZsYWdzCQk9IElSUUZfVElNRVIgfCBJUlFGX0lSUVBPTEwgfAorCQkJCQkgIElSUUZfTk9CQUxBTkNJTkcgfAorCQkJCQkgIElSUUZfRElTQUJMRUQ7CisKKwlkd19jZWQtPmVvaSA9IGFwYnRfZW9pOworCWVyciA9IHNldHVwX2lycShpcnEsICZkd19jZWQtPmlycWFjdGlvbik7CisJaWYgKGVycikgeworCQlwcl9lcnIoImZhaWxlZCB0byByZXF1ZXN0IHRpbWVyIGlycVxuIik7CisJCWtmcmVlKGR3X2NlZCk7CisJCWR3X2NlZCA9IE5VTEw7CisJfQorCisJcmV0dXJuIGR3X2NlZDsKK30KKworLyoqCisgKiBkd19hcGJfY2xvY2tldmVudF9yZXN1bWUoKSAtIHJlc3VtZSBhIGNsb2NrIHRoYXQgaGFzIGJlZW4gcGF1c2VkLgorICoKKyAqIEBkd19jZWQ6CVRoZSBBUEIgY2xvY2sgdG8gcmVzdW1lLgorICovCit2b2lkIGR3X2FwYl9jbG9ja2V2ZW50X3Jlc3VtZShzdHJ1Y3QgZHdfYXBiX2Nsb2NrX2V2ZW50X2RldmljZSAqZHdfY2VkKQoreworCWVuYWJsZV9pcnEoZHdfY2VkLT50aW1lci5pcnEpOworfQorCisvKioKKyAqIGR3X2FwYl9jbG9ja2V2ZW50X3N0b3AoKSAtIHN0b3AgdGhlIGNsb2NrX2V2ZW50X2RldmljZSBhbmQgcmVsZWFzZSB0aGUgSVJRLgorICoKKyAqIEBkd19jZWQ6CVRoZSBBUEIgY2xvY2sgdG8gc3RvcCBnZW5lcmF0aW5nIHRoZSBldmVudHMuCisgKi8KK3ZvaWQgZHdfYXBiX2Nsb2NrZXZlbnRfc3RvcChzdHJ1Y3QgZHdfYXBiX2Nsb2NrX2V2ZW50X2RldmljZSAqZHdfY2VkKQoreworCWZyZWVfaXJxKGR3X2NlZC0+dGltZXIuaXJxLCAmZHdfY2VkLT5jZWQpOworfQorCisvKioKKyAqIGR3X2FwYl9jbG9ja2V2ZW50X3JlZ2lzdGVyKCkgLSByZWdpc3RlciB0aGUgY2xvY2sgd2l0aCB0aGUgZ2VuZXJpYyBsYXllcgorICoKKyAqIEBkd19jZWQ6CVRoZSBBUEIgY2xvY2sgdG8gcmVnaXN0ZXIgYXMgYSBjbG9ja19ldmVudF9kZXZpY2UuCisgKi8KK3ZvaWQgZHdfYXBiX2Nsb2NrZXZlbnRfcmVnaXN0ZXIoc3RydWN0IGR3X2FwYl9jbG9ja19ldmVudF9kZXZpY2UgKmR3X2NlZCkKK3sKKwlhcGJ0X3dyaXRlbCgmZHdfY2VkLT50aW1lciwgMCwgQVBCVE1SX05fQ09OVFJPTCk7CisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZkd19jZWQtPmNlZCk7CisJYXBidF9lbmFibGVfaW50KCZkd19jZWQtPnRpbWVyKTsKK30KKworLyoqCisgKiBkd19hcGJfY2xvY2tzb3VyY2Vfc3RhcnQoKSAtIHN0YXJ0IHRoZSBjbG9ja3NvdXJjZSBjb3VudGluZy4KKyAqCisgKiBAZHdfY3M6CVRoZSBjbG9ja3NvdXJjZSB0byBzdGFydC4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gc3RhcnQgdGhlIGNsb2Nrc291cmNlIGJlZm9yZSByZWdpc3RyYXRpb24gYW5kIGNhbiBiZSB1c2VkCisgKiB0byBlbmFibGUgY2FsaWJyYXRpb24gb2YgdGltZXJzLgorICovCit2b2lkIGR3X2FwYl9jbG9ja3NvdXJjZV9zdGFydChzdHJ1Y3QgZHdfYXBiX2Nsb2Nrc291cmNlICpkd19jcykKK3sKKwkvKgorCSAqIHN0YXJ0IGNvdW50IGRvd24gZnJvbSAweGZmZmZfZmZmZi4gdGhpcyBpcyBkb25lIGJ5IHRvZ2dsaW5nIHRoZQorCSAqIGVuYWJsZSBiaXQgdGhlbiBsb2FkIGluaXRpYWwgbG9hZCBjb3VudCB0byB+MC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGN0cmwgPSBhcGJ0X3JlYWRsKCZkd19jcy0+dGltZXIsIEFQQlRNUl9OX0NPTlRST0wpOworCisJY3RybCAmPSB+QVBCVE1SX0NPTlRST0xfRU5BQkxFOworCWFwYnRfd3JpdGVsKCZkd19jcy0+dGltZXIsIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOworCWFwYnRfd3JpdGVsKCZkd19jcy0+dGltZXIsIH4wLCBBUEJUTVJfTl9MT0FEX0NPVU5UKTsKKwkvKiBlbmFibGUsIG1hc2sgaW50ZXJydXB0ICovCisJY3RybCAmPSB+QVBCVE1SX0NPTlRST0xfTU9ERV9QRVJJT0RJQzsKKwljdHJsIHw9IChBUEJUTVJfQ09OVFJPTF9FTkFCTEUgfCBBUEJUTVJfQ09OVFJPTF9JTlQpOworCWFwYnRfd3JpdGVsKCZkd19jcy0+dGltZXIsIGN0cmwsIEFQQlRNUl9OX0NPTlRST0wpOworCS8qIHJlYWQgaXQgb25jZSB0byBnZXQgY2FjaGVkIGNvdW50ZXIgdmFsdWUgaW5pdGlhbGl6ZWQgKi8KKwlkd19hcGJfY2xvY2tzb3VyY2VfcmVhZChkd19jcyk7Cit9CisKK3N0YXRpYyBjeWNsZV90IF9fYXBidF9yZWFkX2Nsb2Nrc291cmNlKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJdW5zaWduZWQgbG9uZyBjdXJyZW50X2NvdW50OworCXN0cnVjdCBkd19hcGJfY2xvY2tzb3VyY2UgKmR3X2NzID0KKwkJY2xvY2tzb3VyY2VfdG9fZHdfYXBiX2Nsb2Nrc291cmNlKGNzKTsKKworCWN1cnJlbnRfY291bnQgPSBhcGJ0X3JlYWRsKCZkd19jcy0+dGltZXIsIEFQQlRNUl9OX0NVUlJFTlRfVkFMVUUpOworCisJcmV0dXJuIChjeWNsZV90KX5jdXJyZW50X2NvdW50OworfQorCitzdGF0aWMgdm9pZCBhcGJ0X3Jlc3RhcnRfY2xvY2tzb3VyY2Uoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3sKKwlzdHJ1Y3QgZHdfYXBiX2Nsb2Nrc291cmNlICpkd19jcyA9CisJCWNsb2Nrc291cmNlX3RvX2R3X2FwYl9jbG9ja3NvdXJjZShjcyk7CisKKwlkd19hcGJfY2xvY2tzb3VyY2Vfc3RhcnQoZHdfY3MpOworfQorCisvKioKKyAqIGR3X2FwYl9jbG9ja3NvdXJjZV9pbml0KCkgLSB1c2UgYW4gQVBCIHRpbWVyIGFzIGEgY2xvY2tzb3VyY2UuCisgKgorICogQHJhdGluZzoJVGhlIHJhdGluZyB0byBnaXZlIHRoZSBjbG9ja3NvdXJjZS4KKyAqIEBuYW1lOglUaGUgbmFtZSBmb3IgdGhlIGNsb2Nrc291cmNlLgorICogQGJhc2U6CVRoZSBJL08gYmFzZSBmb3IgdGhlIHRpbWVyIHJlZ2lzdGVycy4KKyAqIEBmcmVxOglUaGUgZnJlcXVlbmN5IHRoYXQgdGhlIHRpbWVyIGNvdW50cyBhdC4KKyAqCisgKiBUaGlzIGNyZWF0ZXMgYSBjbG9ja3NvdXJjZSB1c2luZyBhbiBBUEIgdGltZXIgYnV0IGRvZXMgbm90IHlldCByZWdpc3RlciBpdAorICogd2l0aCB0aGUgY2xvY2tzb3VyY2Ugc3lzdGVtLiAgVGhpcyBzaG91bGQgYmUgZG9uZSB3aXRoCisgKiBkd19hcGJfY2xvY2tzb3VyY2VfcmVnaXN0ZXIoKSBhcyB0aGUgbmV4dCBzdGVwLgorICovCitzdHJ1Y3QgZHdfYXBiX2Nsb2Nrc291cmNlICoKK2R3X2FwYl9jbG9ja3NvdXJjZV9pbml0KHVuc2lnbmVkIHJhdGluZywgY2hhciAqbmFtZSwgdm9pZCBfX2lvbWVtICpiYXNlLAorCQkJdW5zaWduZWQgbG9uZyBmcmVxKQoreworCXN0cnVjdCBkd19hcGJfY2xvY2tzb3VyY2UgKmR3X2NzID0ga3phbGxvYyhzaXplb2YoKmR3X2NzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWR3X2NzKQorCQlyZXR1cm4gTlVMTDsKKworCWR3X2NzLT50aW1lci5iYXNlID0gYmFzZTsKKwlkd19jcy0+dGltZXIuZnJlcSA9IGZyZXE7CisJZHdfY3MtPmNzLm5hbWUgPSBuYW1lOworCWR3X2NzLT5jcy5yYXRpbmcgPSByYXRpbmc7CisJZHdfY3MtPmNzLnJlYWQgPSBfX2FwYnRfcmVhZF9jbG9ja3NvdXJjZTsKKwlkd19jcy0+Y3MubWFzayA9IENMT0NLU09VUkNFX01BU0soMzIpOworCWR3X2NzLT5jcy5mbGFncyA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTOworCWR3X2NzLT5jcy5yZXN1bWUgPSBhcGJ0X3Jlc3RhcnRfY2xvY2tzb3VyY2U7CisKKwlyZXR1cm4gZHdfY3M7Cit9CisKKy8qKgorICogZHdfYXBiX2Nsb2Nrc291cmNlX3JlZ2lzdGVyKCkgLSByZWdpc3RlciB0aGUgQVBCIGNsb2Nrc291cmNlLgorICoKKyAqIEBkd19jczoJVGhlIGNsb2Nrc291cmNlIHRvIHJlZ2lzdGVyLgorICovCit2b2lkIGR3X2FwYl9jbG9ja3NvdXJjZV9yZWdpc3RlcihzdHJ1Y3QgZHdfYXBiX2Nsb2Nrc291cmNlICpkd19jcykKK3sKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmZHdfY3MtPmNzLCBkd19jcy0+dGltZXIuZnJlcSk7Cit9CisKKy8qKgorICogZHdfYXBiX2Nsb2Nrc291cmNlX3JlYWQoKSAtIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBjbG9ja3NvdXJjZS4KKyAqCisgKiBAZHdfY3M6CVRoZSBjbG9ja3NvdXJjZSB0byByZWFkLgorICovCitjeWNsZV90IGR3X2FwYl9jbG9ja3NvdXJjZV9yZWFkKHN0cnVjdCBkd19hcGJfY2xvY2tzb3VyY2UgKmR3X2NzKQoreworCXJldHVybiAoY3ljbGVfdCl+YXBidF9yZWFkbCgmZHdfY3MtPnRpbWVyLCBBUEJUTVJfTl9DVVJSRU5UX1ZBTFVFKTsKK30KKworLyoqCisgKiBkd19hcGJfY2xvY2tzb3VyY2VfdW5yZWdpc3RlcigpIC0gdW5yZWdpc3RlciBhbmQgZnJlZSBhIGNsb2Nrc291cmNlLgorICoKKyAqIEBkd19jczoJVGhlIGNsb2Nrc291cmNlIHRvIHVucmVnaXN0ZXIvZnJlZS4KKyAqLwordm9pZCBkd19hcGJfY2xvY2tzb3VyY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZHdfYXBiX2Nsb2Nrc291cmNlICpkd19jcykKK3sKKwljbG9ja3NvdXJjZV91bnJlZ2lzdGVyKCZkd19jcy0+Y3MpOworCisJa2ZyZWUoZHdfY3MpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9pODI1My5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9pODI1My5jCmluZGV4IDIyNWMxNzYuLjI3YzQ5ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvaTgyNTMuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2k4MjUzLmMKQEAgLTEsMTQgKzEsMjUgQEAKIC8qCiAgKiBpODI1MyBQSVQgY2xvY2tzb3VyY2UKICAqLwotI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pODI1My5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogCi0jaW5jbHVkZSA8YXNtL2k4MjUzLmg+CisvKgorICogUHJvdGVjdHMgYWNjZXNzIHRvIEkvTyBwb3J0cworICoKKyAqIDAwNDAtMDA0MyA6IHRpbWVyMCwgaTgyNTMgLyBpODI1NAorICogMDA2MS0wMDYxIDogTk1JIENvbnRyb2wgUmVnaXN0ZXIgd2hpY2ggY29udGFpbnMgdHdvIHNwZWFrZXIgY29udHJvbCBiaXRzLgorICovCitERUZJTkVfUkFXX1NQSU5MT0NLKGk4MjUzX2xvY2spOworRVhQT1JUX1NZTUJPTChpODI1M19sb2NrKTsKIAorI2lmZGVmIENPTkZJR19DTEtTUkNfSTgyNTMKIC8qCiAgKiBTaW5jZSB0aGUgUElUIG92ZXJmbG93cyBldmVyeSB0aWNrLCBpdHMgbm90IHZlcnkgdXNlZnVsCiAgKiB0byBqdXN0IHJlYWQgYnkgaXRzZWxmLiBTbyB1c2UgamlmZmllcyB0byBlbXVsYXRlIGEgZnJlZQpAQCAtMzcsMTUgKzQ4LDE1IEBACiAJICogY291bnQpLCBpdCBjYW5ub3QgYmUgbmV3ZXIuCiAJICovCiAJamlmcyA9IGppZmZpZXM7Ci0Jb3V0Yl9waXQoMHgwMCwgUElUX01PREUpOwkvKiBsYXRjaCB0aGUgY291bnQgQVNBUCAqLwotCWNvdW50ID0gaW5iX3BpdChQSVRfQ0gwKTsJLyogcmVhZCB0aGUgbGF0Y2hlZCBjb3VudCAqLwotCWNvdW50IHw9IGluYl9waXQoUElUX0NIMCkgPDwgODsKKwlvdXRiX3AoMHgwMCwgUElUX01PREUpOwkvKiBsYXRjaCB0aGUgY291bnQgQVNBUCAqLworCWNvdW50ID0gaW5iX3AoUElUX0NIMCk7CS8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KKwljb3VudCB8PSBpbmJfcChQSVRfQ0gwKSA8PCA4OwogCiAJLyogVklBNjg2YSB0ZXN0IGNvZGUuLi4gcmVzZXQgdGhlIGxhdGNoIGlmIGNvdW50ID4gbWF4ICsgMSAqLwogCWlmIChjb3VudCA+IExBVENIKSB7Ci0JCW91dGJfcGl0KDB4MzQsIFBJVF9NT0RFKTsKLQkJb3V0Yl9waXQoUElUX0xBVENIICYgMHhmZiwgUElUX0NIMCk7Ci0JCW91dGJfcGl0KFBJVF9MQVRDSCA+PiA4LCBQSVRfQ0gwKTsKKwkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKKwkJb3V0Yl9wKFBJVF9MQVRDSCAmIDB4ZmYsIFBJVF9DSDApOworCQlvdXRiX3AoUElUX0xBVENIID4+IDgsIFBJVF9DSDApOwogCQljb3VudCA9IFBJVF9MQVRDSCAtIDE7CiAJfQogCkBAIC04NiwzICs5Nyw5MCBAQAogewogCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmaTgyNTNfY3MsIFBJVF9USUNLX1JBVEUpOwogfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ0xLRVZUX0k4MjUzCisvKgorICogSW5pdGlhbGl6ZSB0aGUgUElUIHRpbWVyLgorICoKKyAqIFRoaXMgaXMgYWxzbyBjYWxsZWQgYWZ0ZXIgcmVzdW1lIHRvIGJyaW5nIHRoZSBQSVQgaW50byBvcGVyYXRpb24gYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcGl0X3RpbWVyKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQoreworCXJhd19zcGluX2xvY2soJmk4MjUzX2xvY2spOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKKwkJLyogYmluYXJ5LCBtb2RlIDIsIExTQi9NU0IsIGNoIDAgKi8KKwkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKKwkJb3V0Yl9wKExBVENIICYgMHhmZiAsIFBJVF9DSDApOwkvKiBMU0IgKi8KKwkJb3V0Yl9wKExBVENIID4+IDggLCBQSVRfQ0gwKTsJCS8qIE1TQiAqLworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJY2FzZSBDTE9DS19FVlRfTU9ERV9VTlVTRUQ6CisJCWlmIChldnQtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMgfHwKKwkJICAgIGV2dC0+bW9kZSA9PSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKSB7CisJCQlvdXRiX3AoMHgzMCwgUElUX01PREUpOworCQkJb3V0Yl9wKDAsIFBJVF9DSDApOworCQkJb3V0Yl9wKDAsIFBJVF9DSDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCQkvKiBPbmUgc2hvdCBzZXR1cCAqLworCQlvdXRiX3AoMHgzOCwgUElUX01PREUpOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgorCQkvKiBOb3RoaW5nIHRvIGRvIGhlcmUgKi8KKwkJYnJlYWs7CisJfQorCXJhd19zcGluX3VubG9jaygmaTgyNTNfbG9jayk7Cit9CisKKy8qCisgKiBQcm9ncmFtIHRoZSBuZXh0IGV2ZW50IGluIG9uZXNob3QgbW9kZQorICoKKyAqIERlbHRhIGlzIGdpdmVuIGluIFBJVCB0aWNrcworICovCitzdGF0aWMgaW50IHBpdF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlyYXdfc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKKwlvdXRiX3AoZGVsdGEgJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLworCW91dGJfcChkZWx0YSA+PiA4ICwgUElUX0NIMCk7CQkvKiBNU0IgKi8KKwlyYXdfc3Bpbl91bmxvY2soJmk4MjUzX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBPbiBVUCB0aGUgUElUIGNhbiBzZXJ2ZSBhbGwgb2YgdGhlIHBvc3NpYmxlIHRpbWVyIGZ1bmN0aW9ucy4gT24gU01QIHN5c3RlbXMKKyAqIGl0IGNhbiBiZSBzb2xlbHkgdXNlZCBmb3IgdGhlIGdsb2JhbCB0aWNrLgorICovCitzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGk4MjUzX2Nsb2NrZXZlbnQgPSB7CisJLm5hbWUJCT0gInBpdCIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMsCisJLnNldF9tb2RlCT0gaW5pdF9waXRfdGltZXIsCisJLnNldF9uZXh0X2V2ZW50ID0gcGl0X25leHRfZXZlbnQsCit9OworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgY29udmVyc2lvbiBmYWN0b3IgYW5kIHRoZSBtaW4vbWF4IGRlbHRhcyBvZiB0aGUgY2xvY2sgZXZlbnQKKyAqIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrIGV2ZW50IHNvdXJjZSB3aXRoIHRoZSBmcmFtZXdvcmsuCisgKi8KK3ZvaWQgX19pbml0IGNsb2NrZXZlbnRfaTgyNTNfaW5pdChib29sIG9uZXNob3QpCit7CisJaWYgKG9uZXNob3QpCisJCWk4MjUzX2Nsb2NrZXZlbnQuZmVhdHVyZXMgfD0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVDsKKwkvKgorCSAqIFN0YXJ0IHBpdCB3aXRoIHRoZSBib290IGNwdSBtYXNrLiB4ODYgbWlnaHQgbWFrZSBpdCBnbG9iYWwKKwkgKiB3aGVuIGl0IGlzIHVzZWQgYXMgYnJvYWRjYXN0IGRldmljZSBsYXRlci4KKwkgKi8KKwlpODI1M19jbG9ja2V2ZW50LmNwdW1hc2sgPSBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwljbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKCZpODI1M19jbG9ja2V2ZW50LCBQSVRfVElDS19SQVRFLAorCQkJCQkweEYsIDB4N0ZGRik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYyBiL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYwppbmRleCAyYjQ2YTdlLi4wZGViYzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9wcm9jLmMKKysrIGIvZHJpdmVycy9jb25uZWN0b3IvY25fcHJvYy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nvbm5lY3Rvci5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKQEAgLTE2Niw2ICsxNjcsMzkgQEAKIAljbl9uZXRsaW5rX3NlbmQobXNnLCBDTl9JRFhfUFJPQywgR0ZQX0tFUk5FTCk7CiB9CiAKK3ZvaWQgcHJvY19wdHJhY2VfY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHB0cmFjZV9pZCkKK3sKKwlzdHJ1Y3QgY25fbXNnICptc2c7CisJc3RydWN0IHByb2NfZXZlbnQgKmV2OworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlfX3U4IGJ1ZmZlcltDTl9QUk9DX01TR19TSVpFXTsKKworCWlmIChhdG9taWNfcmVhZCgmcHJvY19ldmVudF9udW1fbGlzdGVuZXJzKSA8IDEpCisJCXJldHVybjsKKworCW1zZyA9IChzdHJ1Y3QgY25fbXNnICopYnVmZmVyOworCWV2ID0gKHN0cnVjdCBwcm9jX2V2ZW50ICopbXNnLT5kYXRhOworCWdldF9zZXEoJm1zZy0+c2VxLCAmZXYtPmNwdSk7CisJa3RpbWVfZ2V0X3RzKCZ0cyk7IC8qIGdldCBoaWdoIHJlcyBtb25vdG9uaWMgdGltZXN0YW1wICovCisJcHV0X3VuYWxpZ25lZCh0aW1lc3BlY190b19ucygmdHMpLCAoX191NjQgKikmZXYtPnRpbWVzdGFtcF9ucyk7CisJZXYtPndoYXQgPSBQUk9DX0VWRU5UX1BUUkFDRTsKKwlldi0+ZXZlbnRfZGF0YS5wdHJhY2UucHJvY2Vzc19waWQgID0gdGFzay0+cGlkOworCWV2LT5ldmVudF9kYXRhLnB0cmFjZS5wcm9jZXNzX3RnaWQgPSB0YXNrLT50Z2lkOworCWlmIChwdHJhY2VfaWQgPT0gUFRSQUNFX0FUVEFDSCkgeworCQlldi0+ZXZlbnRfZGF0YS5wdHJhY2UudHJhY2VyX3BpZCAgPSBjdXJyZW50LT5waWQ7CisJCWV2LT5ldmVudF9kYXRhLnB0cmFjZS50cmFjZXJfdGdpZCA9IGN1cnJlbnQtPnRnaWQ7CisJfSBlbHNlIGlmIChwdHJhY2VfaWQgPT0gUFRSQUNFX0RFVEFDSCkgeworCQlldi0+ZXZlbnRfZGF0YS5wdHJhY2UudHJhY2VyX3BpZCAgPSAwOworCQlldi0+ZXZlbnRfZGF0YS5wdHJhY2UudHJhY2VyX3RnaWQgPSAwOworCX0gZWxzZQorCQlyZXR1cm47CisKKwltZW1jcHkoJm1zZy0+aWQsICZjbl9wcm9jX2V2ZW50X2lkLCBzaXplb2YobXNnLT5pZCkpOworCW1zZy0+YWNrID0gMDsgLyogbm90IHVzZWQgKi8KKwltc2ctPmxlbiA9IHNpemVvZigqZXYpOworCWNuX25ldGxpbmtfc2VuZChtc2csIENOX0lEWF9QUk9DLCBHRlBfS0VSTkVMKTsKK30KKwogdm9pZCBwcm9jX2V4aXRfY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlzdHJ1Y3QgY25fbXNnICptc2c7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYyBiL2RyaXZlcnMvY29ubmVjdG9yL2Nvbm5lY3Rvci5jCmluZGV4IDIxOWQ4OGEuLmRkZTZhMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY29ubmVjdG9yL2Nvbm5lY3Rvci5jCisrKyBiL2RyaXZlcnMvY29ubmVjdG9yL2Nvbm5lY3Rvci5jCkBAIC0xMzksNiArMTM5LDcgQEAKIAlzcGluX3VubG9ja19iaCgmZGV2LT5jYmRldi0+cXVldWVfbG9jayk7CiAKIAlpZiAoY2JxICE9IE5VTEwpIHsKKwkJZXJyID0gMDsKIAkJY2JxLT5jYWxsYmFjayhtc2csIG5zcCk7CiAJCWtmcmVlX3NrYihza2IpOwogCQljbl9xdWV1ZV9yZWxlYXNlX2NhbGxiYWNrKGNicSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCmluZGV4IDlmYjg0ODUuLmUyNGEyYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCkBAIC0xODQsNSArMTg0LDE1IEBACiBzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLng4NiIKIGVuZG1lbnUKIAorbWVudSAiQVJNIENQVSBmcmVxdWVuY3kgc2NhbGluZyBkcml2ZXJzIgorZGVwZW5kcyBvbiBBUk0KK3NvdXJjZSAiZHJpdmVycy9jcHVmcmVxL0tjb25maWcuYXJtIgorZW5kbWVudQorCittZW51ICJQb3dlclBDIENQVSBmcmVxdWVuY3kgc2NhbGluZyBkcml2ZXJzIgorZGVwZW5kcyBvbiBQUEMzMiB8fCBQUEM2NAorc291cmNlICJkcml2ZXJzL2NwdWZyZXEvS2NvbmZpZy5wb3dlcnBjIgorZW5kbWVudQorCiBlbmRpZgogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcuYXJtIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcuYXJtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYTAwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZy5hcm0KQEAgLTAsMCArMSwzMiBAQAorIworIyBBUk0gQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nIGRyaXZlcnMKKyMKKworY29uZmlnIEFSTV9TM0M2NFhYX0NQVUZSRVEKKwlib29sICJTYW1zdW5nIFMzQzY0WFgiCisJZGVwZW5kcyBvbiBDUFVfUzNDNjQxMAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIFNhbXN1bmcgUzNDNjQxMCBTb0MuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIEFSTV9TNVBWMjEwX0NQVUZSRVEKKwlib29sICJTYW1zdW5nIFM1UFYyMTAgYW5kIFM1UEMxMTAiCisJZGVwZW5kcyBvbiBDUFVfUzVQVjIxMAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIFNhbXN1bmcgUzVQVjIxMCBhbmQKKwkgIFM1UEMxMTAgU29Dcy4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgQVJNX0VYWU5PUzQyMTBfQ1BVRlJFUQorCWJvb2wgIlNhbXN1bmcgRVhZTk9TNDIxMCIKKwlkZXBlbmRzIG9uIENQVV9FWFlOT1M0MjEwCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgU2Ftc3VuZyBFWFlOT1M0MjEwCisJICBTb0MgKFM1UFYzMTAgb3IgUzVQQzIxMCkuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLnBvd2VycGMgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZy5wb3dlcnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3Njk5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZy5wb3dlcnBjCkBAIC0wLDAgKzEsNyBAQAorY29uZmlnIENQVV9GUkVRX01BUExFCisJYm9vbCAiU3VwcG9ydCBmb3IgTWFwbGUgOTcwRlggRXZhbHVhdGlvbiBCb2FyZCIKKwlkZXBlbmRzIG9uIFBQQ19NQVBMRQorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWhlbHAKKwkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBmcmVxdWVuY3kgc3dpdGNoaW5nIG9uIE1hcGxlIDk3MEZYCisJICBFdmFsdWF0aW9uIEJvYXJkIGFuZCBjb21wYXRpYmxlIGJvYXJkcyAoSUJNIEpTMnggYmxhZGVzKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9NYWtlZmlsZSBiL2RyaXZlcnMvY3B1ZnJlcS9NYWtlZmlsZQppbmRleCBlMmZjMmQyLi5hNDhiYzAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jcHVmcmVxL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw3IEBACiAjIENQVWZyZXEgY3Jvc3MtYXJjaCBoZWxwZXJzCiBvYmotJChDT05GSUdfQ1BVX0ZSRVFfVEFCTEUpCQkrPSBmcmVxX3RhYmxlLm8KIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI2QKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgeDg2IGRyaXZlcnMuCiAjIExpbmsgb3JkZXIgbWF0dGVycy4gSzggaXMgcHJlZmVycmVkIHRvIEFDUEkgYmVjYXVzZSBvZiBmaXJtd2FyZSBidWdzIGluIGVhcmx5CiAjIEs4IHN5c3RlbXMuIEFDUEkgaXMgcHJlZmVycmVkIHRvIGFsbCBvdGhlciBoYXJkd2FyZS1zcGVjaWZpYyBkcml2ZXJzLgpAQCAtMzcsNyArMzcsMTMgQEAKIG9iai0kKENPTkZJR19YODZfUDRfQ0xPQ0tNT0QpCQkrPSBwNC1jbG9ja21vZC5vCiBvYmotJChDT05GSUdfWDg2X0NQVUZSRVFfTkZPUkNFMikJKz0gY3B1ZnJlcS1uZm9yY2UyLm8KIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI2QKLQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBBUk0gU29DIGRyaXZlcnMKIG9iai0kKENPTkZJR19VWDUwMF9TT0NfREI4NTAwKQkJKz0gZGI4NTAwLWNwdWZyZXEubworb2JqLSQoQ09ORklHX0FSTV9TM0M2NFhYX0NQVUZSRVEpCSs9IHMzYzY0eHgtY3B1ZnJlcS5vCitvYmotJChDT05GSUdfQVJNX1M1UFYyMTBfQ1BVRlJFUSkJKz0gczVwdjIxMC1jcHVmcmVxLm8KK29iai0kKENPTkZJR19BUk1fRVhZTk9TNDIxMF9DUFVGUkVRKQkrPSBleHlub3M0MjEwLWNwdWZyZXEubworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBvd2VyUEMgcGxhdGZvcm0gZHJpdmVycworb2JqLSQoQ09ORklHX0NQVV9GUkVRX01BUExFKQkJKz0gbWFwbGUtY3B1ZnJlcS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKaW5kZXggNGUwNGUxMi4uNTZjNmM2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwpAQCAtNjU1LDcgKzY1NSw3IEBACiAJYWNwaV9wcm9jZXNzb3Jfbm90aWZ5X3NtbShUSElTX01PRFVMRSk7CiAKIAkvKiBDaGVjayBmb3IgQVBFUkYvTVBFUkYgc3VwcG9ydCBpbiBoYXJkd2FyZSAqLwotCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0FQRVJGTVBFUkYpKQorCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVBFUkZNUEVSRikpCiAJCWFjcGlfY3B1ZnJlcV9kcml2ZXIuZ2V0YXZnID0gY3B1ZnJlcV9nZXRfbWVhc3VyZWRfcGVyZjsKIAogCXByX2RlYnVnKCJDUFUldSAtIEFDUEkgcGVyZm9ybWFuY2UgbWFuYWdlbWVudCBhY3RpdmF0ZWQuXG4iLCBjcHUpOwpAQCAtNzU5LDcgKzc1OSw3IEBACiAKIAljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2NwdWZyZXFfZHJpdmVyKTsKIAotCWZyZWVfcGVyY3B1KGFjcGlfcGVyZl9kYXRhKTsKKwlmcmVlX2FjcGlfcGVyZl9kYXRhKCk7CiB9CiAKIG1vZHVsZV9wYXJhbShhY3BpX3BzdGF0ZV9zdHJpY3QsIHVpbnQsIDA2NDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKaW5kZXggYjYwYTRjMi4uZmFmN2M1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCkBAIC0yOTgsMTEgKzI5OCwxMyBAQAogCW9sZF9pbmRleCA9IHN0YXQtPmxhc3RfaW5kZXg7CiAJbmV3X2luZGV4ID0gZnJlcV90YWJsZV9nZXRfaW5kZXgoc3RhdCwgZnJlcS0+bmV3KTsKIAotCWNwdWZyZXFfc3RhdHNfdXBkYXRlKGZyZXEtPmNwdSk7Ci0JaWYgKG9sZF9pbmRleCA9PSBuZXdfaW5kZXgpCisJLyogV2UgY2FuJ3QgZG8gc3RhdC0+dGltZV9pbl9zdGF0ZVstMV09IC4uICovCisJaWYgKG9sZF9pbmRleCA9PSAtMSB8fCBuZXdfaW5kZXggPT0gLTEpCiAJCXJldHVybiAwOwogCi0JaWYgKG9sZF9pbmRleCA9PSAtMSB8fCBuZXdfaW5kZXggPT0gLTEpCisJY3B1ZnJlcV9zdGF0c191cGRhdGUoZnJlcS0+Y3B1KTsKKworCWlmIChvbGRfaW5kZXggPT0gbmV3X2luZGV4KQogCQlyZXR1cm4gMDsKIAogCXNwaW5fbG9jaygmY3B1ZnJlcV9zdGF0c19sb2NrKTsKQEAgLTM4Nyw2ICszODksNyBAQAogCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZjcHVmcmVxX3N0YXRfY3B1X25vdGlmaWVyKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQljcHVmcmVxX3N0YXRzX2ZyZWVfdGFibGUoY3B1KTsKKwkJY3B1ZnJlcV9zdGF0c19mcmVlX3N5c2ZzKGNwdSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvZXh5bm9zNDIxMC1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvZXh5bm9zNDIxMC1jcHVmcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjM2E4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9leHlub3M0MjEwLWNwdWZyZXEuYwpAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQgLSBDUFUgZnJlcXVlbmN5IHNjYWxpbmcgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1tZW0uaD4KKworI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjcHVfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgKm1vdXRjb3JlOworc3RhdGljIHN0cnVjdCBjbGsgKm1vdXRfbXBsbDsKK3N0YXRpYyBzdHJ1Y3QgY2xrICptb3V0X2FwbGw7CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICphcm1fcmVndWxhdG9yOworc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKmludF9yZWd1bGF0b3I7CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWVtdHlwZTsKKworZW51bSBleHlub3M0X21lbW9yeV90eXBlIHsKKwlERFIyID0gNCwKKwlMUEREUjIsCisJRERSMywKK307CisKK2VudW0gY3B1ZnJlcV9sZXZlbF9pbmRleCB7CisJTDAsIEwxLCBMMiwgTDMsIENQVUZSRVFfTEVWRUxfRU5ELAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBleHlub3M0X2ZyZXFfdGFibGVbXSA9IHsKKwl7TDAsIDEwMDAqMTAwMH0sCisJe0wxLCA4MDAqMTAwMH0sCisJe0wyLCA0MDAqMTAwMH0sCisJe0wzLCAxMDAqMTAwMH0sCisJezAsIENQVUZSRVFfVEFCTEVfRU5EfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2xrZGl2X2NwdTBbQ1BVRlJFUV9MRVZFTF9FTkRdWzddID0geworCS8qCisJICogQ2xvY2sgZGl2aWRlciB2YWx1ZSBmb3IgZm9sbG93aW5nCisJICogeyBESVZDT1JFLCBESVZDT1JFTTAsIERJVkNPUkVNMSwgRElWUEVSSVBILAorCSAqCQlESVZBVEIsIERJVlBDTEtfREJHLCBESVZBUExMIH0KKwkgKi8KKworCS8qIEFSTSBMMDogMTAwME1IeiAqLworCXsgMCwgMywgNywgMywgMywgMCwgMSB9LAorCisJLyogQVJNIEwxOiA4MDBNSHogKi8KKwl7IDAsIDMsIDcsIDMsIDMsIDAsIDEgfSwKKworCS8qIEFSTSBMMjogNDAwTUh6ICovCisJeyAwLCAxLCAzLCAxLCAzLCAwLCAxIH0sCisKKwkvKiBBUk0gTDM6IDEwME1IeiAqLworCXsgMCwgMCwgMSwgMCwgMywgMSwgMSB9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjbGtkaXZfY3B1MVtDUFVGUkVRX0xFVkVMX0VORF1bMl0gPSB7CisJLyoKKwkgKiBDbG9jayBkaXZpZGVyIHZhbHVlIGZvciBmb2xsb3dpbmcKKwkgKiB7IERJVkNPUFksIERJVkhQTSB9CisJICovCisKKwkgLyogQVJNIEwwOiAxMDAwTUh6ICovCisJeyAzLCAwIH0sCisKKwkvKiBBUk0gTDE6IDgwME1IeiAqLworCXsgMywgMCB9LAorCisJLyogQVJNIEwyOiA0MDBNSHogKi8KKwl7IDMsIDAgfSwKKworCS8qIEFSTSBMMzogMTAwTUh6ICovCisJeyAzLCAwIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGNsa2Rpdl9kbWMwW0NQVUZSRVFfTEVWRUxfRU5EXVs4XSA9IHsKKwkvKgorCSAqIENsb2NrIGRpdmlkZXIgdmFsdWUgZm9yIGZvbGxvd2luZworCSAqIHsgRElWQUNQLCBESVZBQ1BfUENMSywgRElWRFBIWSwgRElWRE1DLCBESVZETUNECisJICoJCURJVkRNQ1AsIERJVkNPUFkyLCBESVZDT1JFX1RJTUVSUyB9CisJICovCisKKwkvKiBETUMgTDA6IDQwME1IeiAqLworCXsgMywgMSwgMSwgMSwgMSwgMSwgMywgMSB9LAorCisJLyogRE1DIEwxOiA0MDBNSHogKi8KKwl7IDMsIDEsIDEsIDEsIDEsIDEsIDMsIDEgfSwKKworCS8qIERNQyBMMjogMjY2LjdNSHogKi8KKwl7IDcsIDEsIDEsIDIsIDEsIDEsIDMsIDEgfSwKKworCS8qIERNQyBMMzogMjAwTUh6ICovCisJeyA3LCAxLCAxLCAzLCAxLCAxLCAzLCAxIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGNsa2Rpdl90b3BbQ1BVRlJFUV9MRVZFTF9FTkRdWzVdID0geworCS8qCisJICogQ2xvY2sgZGl2aWRlciB2YWx1ZSBmb3IgZm9sbG93aW5nCisJICogeyBESVZBQ0xLMjAwLCBESVZBQ0xLMTAwLCBESVZBQ0xLMTYwLCBESVZBQ0xLMTMzLCBESVZPTkVOQU5EIH0KKwkgKi8KKworCS8qIEFDTEsyMDAgTDA6IDIwME1IeiAqLworCXsgMywgNywgNCwgNSwgMSB9LAorCisJLyogQUNMSzIwMCBMMTogMjAwTUh6ICovCisJeyAzLCA3LCA0LCA1LCAxIH0sCisKKwkvKiBBQ0xLMjAwIEwyOiAxNjBNSHogKi8KKwl7IDQsIDcsIDUsIDcsIDEgfSwKKworCS8qIEFDTEsyMDAgTDM6IDEzMy4zTUh6ICovCisJeyA1LCA3LCA3LCA3LCAxIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGNsa2Rpdl9scl9idXNbQ1BVRlJFUV9MRVZFTF9FTkRdWzJdID0geworCS8qCisJICogQ2xvY2sgZGl2aWRlciB2YWx1ZSBmb3IgZm9sbG93aW5nCisJICogeyBESVZHREwvUiwgRElWR1BML1IgfQorCSAqLworCisJLyogQUNMS19HREwvUiBMMDogMjAwTUh6ICovCisJeyAzLCAxIH0sCisKKwkvKiBBQ0xLX0dETC9SIEwxOiAyMDBNSHogKi8KKwl7IDMsIDEgfSwKKworCS8qIEFDTEtfR0RML1IgTDI6IDE2ME1IeiAqLworCXsgNCwgMSB9LAorCisJLyogQUNMS19HREwvUiBMMzogMTMzLjNNSHogKi8KKwl7IDUsIDEgfSwKK307CisKK3N0cnVjdCBjcHVmcmVxX3ZvbHRhZ2VfdGFibGUgeworCXVuc2lnbmVkIGludAlpbmRleDsJCS8qIGFueSAqLworCXVuc2lnbmVkIGludAlhcm1fdm9sdDsJLyogdVYgKi8KKwl1bnNpZ25lZCBpbnQJaW50X3ZvbHQ7Cit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfdm9sdGFnZV90YWJsZSBleHlub3M0X3ZvbHRfdGFibGVbQ1BVRlJFUV9MRVZFTF9FTkRdID0geworCXsKKwkJLmluZGV4CQk9IEwwLAorCQkuYXJtX3ZvbHQJPSAxMjAwMDAwLAorCQkuaW50X3ZvbHQJPSAxMTAwMDAwLAorCX0sIHsKKwkJLmluZGV4CQk9IEwxLAorCQkuYXJtX3ZvbHQJPSAxMTAwMDAwLAorCQkuaW50X3ZvbHQJPSAxMTAwMDAwLAorCX0sIHsKKwkJLmluZGV4CQk9IEwyLAorCQkuYXJtX3ZvbHQJPSAxMDAwMDAwLAorCQkuaW50X3ZvbHQJPSAxMDAwMDAwLAorCX0sIHsKKwkJLmluZGV4CQk9IEwzLAorCQkuYXJtX3ZvbHQJPSA5MDAwMDAsCisJCS5pbnRfdm9sdAk9IDEwMDAwMDAsCisJfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXh5bm9zNF9hcGxsX3Btc190YWJsZVtDUFVGUkVRX0xFVkVMX0VORF0gPSB7CisJLyogQVBMTCBGT1VUIEwwOiAxMDAwTUh6ICovCisJKCgyNTAgPDwgMTYpIHwgKDYgPDwgOCkgfCAxKSwKKworCS8qIEFQTEwgRk9VVCBMMTogODAwTUh6ICovCisJKCgyMDAgPDwgMTYpIHwgKDYgPDwgOCkgfCAxKSwKKworCS8qIEFQTEwgRk9VVCBMMiA6IDQwME1IeiAqLworCSgoMjAwIDw8IDE2KSB8ICg2IDw8IDgpIHwgMiksCisKKwkvKiBBUExMIEZPVVQgTDM6IDEwME1IeiAqLworCSgoMjAwIDw8IDE2KSB8ICg2IDw8IDgpIHwgNCksCit9OworCitzdGF0aWMgaW50IGV4eW5vczRfdmVyaWZ5X3NwZWVkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCBleHlub3M0X2ZyZXFfdGFibGUpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGV4eW5vczRfZ2V0c3BlZWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNwdV9jbGspIC8gMTAwMDsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNF9zZXRfY2xrZGl2KHVuc2lnbmVkIGludCBkaXZfaW5kZXgpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCS8qIENoYW5nZSBEaXZpZGVyIC0gQ1BVMCAqLworCisJdG1wID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9DUFUpOworCisJdG1wICY9IH4oUzVQX0NMS0RJVl9DUFUwX0NPUkVfTUFTSyB8IFM1UF9DTEtESVZfQ1BVMF9DT1JFTTBfTUFTSyB8CisJCVM1UF9DTEtESVZfQ1BVMF9DT1JFTTFfTUFTSyB8IFM1UF9DTEtESVZfQ1BVMF9QRVJJUEhfTUFTSyB8CisJCVM1UF9DTEtESVZfQ1BVMF9BVEJfTUFTSyB8IFM1UF9DTEtESVZfQ1BVMF9QQ0xLREJHX01BU0sgfAorCQlTNVBfQ0xLRElWX0NQVTBfQVBMTF9NQVNLKTsKKworCXRtcCB8PSAoKGNsa2Rpdl9jcHUwW2Rpdl9pbmRleF1bMF0gPDwgUzVQX0NMS0RJVl9DUFUwX0NPUkVfU0hJRlQpIHwKKwkJKGNsa2Rpdl9jcHUwW2Rpdl9pbmRleF1bMV0gPDwgUzVQX0NMS0RJVl9DUFUwX0NPUkVNMF9TSElGVCkgfAorCQkoY2xrZGl2X2NwdTBbZGl2X2luZGV4XVsyXSA8PCBTNVBfQ0xLRElWX0NQVTBfQ09SRU0xX1NISUZUKSB8CisJCShjbGtkaXZfY3B1MFtkaXZfaW5kZXhdWzNdIDw8IFM1UF9DTEtESVZfQ1BVMF9QRVJJUEhfU0hJRlQpIHwKKwkJKGNsa2Rpdl9jcHUwW2Rpdl9pbmRleF1bNF0gPDwgUzVQX0NMS0RJVl9DUFUwX0FUQl9TSElGVCkgfAorCQkoY2xrZGl2X2NwdTBbZGl2X2luZGV4XVs1XSA8PCBTNVBfQ0xLRElWX0NQVTBfUENMS0RCR19TSElGVCkgfAorCQkoY2xrZGl2X2NwdTBbZGl2X2luZGV4XVs2XSA8PCBTNVBfQ0xLRElWX0NQVTBfQVBMTF9TSElGVCkpOworCisJX19yYXdfd3JpdGVsKHRtcCwgUzVQX0NMS0RJVl9DUFUpOworCisJZG8geworCQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0xLRElWX1NUQVRDUFUpOworCX0gd2hpbGUgKHRtcCAmIDB4MTExMTExMSk7CisKKwkvKiBDaGFuZ2UgRGl2aWRlciAtIENQVTEgKi8KKworCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9DTEtESVZfQ1BVMSk7CisKKwl0bXAgJj0gfigoMHg3IDw8IDQpIHwgMHg3KTsKKworCXRtcCB8PSAoKGNsa2Rpdl9jcHUxW2Rpdl9pbmRleF1bMF0gPDwgNCkgfAorCQkoY2xrZGl2X2NwdTFbZGl2X2luZGV4XVsxXSA8PCAwKSk7CisKKwlfX3Jhd193cml0ZWwodG1wLCBTNVBfQ0xLRElWX0NQVTEpOworCisJZG8geworCQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0xLRElWX1NUQVRDUFUxKTsKKwl9IHdoaWxlICh0bXAgJiAweDExKTsKKworCS8qIENoYW5nZSBEaXZpZGVyIC0gRE1DMCAqLworCisJdG1wID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9ETUMwKTsKKworCXRtcCAmPSB+KFM1UF9DTEtESVZfRE1DMF9BQ1BfTUFTSyB8IFM1UF9DTEtESVZfRE1DMF9BQ1BQQ0xLX01BU0sgfAorCQlTNVBfQ0xLRElWX0RNQzBfRFBIWV9NQVNLIHwgUzVQX0NMS0RJVl9ETUMwX0RNQ19NQVNLIHwKKwkJUzVQX0NMS0RJVl9ETUMwX0RNQ0RfTUFTSyB8IFM1UF9DTEtESVZfRE1DMF9ETUNQX01BU0sgfAorCQlTNVBfQ0xLRElWX0RNQzBfQ09QWTJfTUFTSyB8IFM1UF9DTEtESVZfRE1DMF9DT1JFVElfTUFTSyk7CisKKwl0bXAgfD0gKChjbGtkaXZfZG1jMFtkaXZfaW5kZXhdWzBdIDw8IFM1UF9DTEtESVZfRE1DMF9BQ1BfU0hJRlQpIHwKKwkJKGNsa2Rpdl9kbWMwW2Rpdl9pbmRleF1bMV0gPDwgUzVQX0NMS0RJVl9ETUMwX0FDUFBDTEtfU0hJRlQpIHwKKwkJKGNsa2Rpdl9kbWMwW2Rpdl9pbmRleF1bMl0gPDwgUzVQX0NMS0RJVl9ETUMwX0RQSFlfU0hJRlQpIHwKKwkJKGNsa2Rpdl9kbWMwW2Rpdl9pbmRleF1bM10gPDwgUzVQX0NMS0RJVl9ETUMwX0RNQ19TSElGVCkgfAorCQkoY2xrZGl2X2RtYzBbZGl2X2luZGV4XVs0XSA8PCBTNVBfQ0xLRElWX0RNQzBfRE1DRF9TSElGVCkgfAorCQkoY2xrZGl2X2RtYzBbZGl2X2luZGV4XVs1XSA8PCBTNVBfQ0xLRElWX0RNQzBfRE1DUF9TSElGVCkgfAorCQkoY2xrZGl2X2RtYzBbZGl2X2luZGV4XVs2XSA8PCBTNVBfQ0xLRElWX0RNQzBfQ09QWTJfU0hJRlQpIHwKKwkJKGNsa2Rpdl9kbWMwW2Rpdl9pbmRleF1bN10gPDwgUzVQX0NMS0RJVl9ETUMwX0NPUkVUSV9TSElGVCkpOworCisJX19yYXdfd3JpdGVsKHRtcCwgUzVQX0NMS0RJVl9ETUMwKTsKKworCWRvIHsKKwkJdG1wID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9TVEFUX0RNQzApOworCX0gd2hpbGUgKHRtcCAmIDB4MTExMTExMTEpOworCisJLyogQ2hhbmdlIERpdmlkZXIgLSBUT1AgKi8KKworCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9DTEtESVZfVE9QKTsKKworCXRtcCAmPSB+KFM1UF9DTEtESVZfVE9QX0FDTEsyMDBfTUFTSyB8IFM1UF9DTEtESVZfVE9QX0FDTEsxMDBfTUFTSyB8CisJCVM1UF9DTEtESVZfVE9QX0FDTEsxNjBfTUFTSyB8IFM1UF9DTEtESVZfVE9QX0FDTEsxMzNfTUFTSyB8CisJCVM1UF9DTEtESVZfVE9QX09ORU5BTkRfTUFTSyk7CisKKwl0bXAgfD0gKChjbGtkaXZfdG9wW2Rpdl9pbmRleF1bMF0gPDwgUzVQX0NMS0RJVl9UT1BfQUNMSzIwMF9TSElGVCkgfAorCQkoY2xrZGl2X3RvcFtkaXZfaW5kZXhdWzFdIDw8IFM1UF9DTEtESVZfVE9QX0FDTEsxMDBfU0hJRlQpIHwKKwkJKGNsa2Rpdl90b3BbZGl2X2luZGV4XVsyXSA8PCBTNVBfQ0xLRElWX1RPUF9BQ0xLMTYwX1NISUZUKSB8CisJCShjbGtkaXZfdG9wW2Rpdl9pbmRleF1bM10gPDwgUzVQX0NMS0RJVl9UT1BfQUNMSzEzM19TSElGVCkgfAorCQkoY2xrZGl2X3RvcFtkaXZfaW5kZXhdWzRdIDw8IFM1UF9DTEtESVZfVE9QX09ORU5BTkRfU0hJRlQpKTsKKworCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9DTEtESVZfVE9QKTsKKworCWRvIHsKKwkJdG1wID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9TVEFUX1RPUCk7CisJfSB3aGlsZSAodG1wICYgMHgxMTExMSk7CisKKwkvKiBDaGFuZ2UgRGl2aWRlciAtIExFRlRCVVMgKi8KKworCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9DTEtESVZfTEVGVEJVUyk7CisKKwl0bXAgJj0gfihTNVBfQ0xLRElWX0JVU19HRExSX01BU0sgfCBTNVBfQ0xLRElWX0JVU19HUExSX01BU0spOworCisJdG1wIHw9ICgoY2xrZGl2X2xyX2J1c1tkaXZfaW5kZXhdWzBdIDw8IFM1UF9DTEtESVZfQlVTX0dETFJfU0hJRlQpIHwKKwkJKGNsa2Rpdl9scl9idXNbZGl2X2luZGV4XVsxXSA8PCBTNVBfQ0xLRElWX0JVU19HUExSX1NISUZUKSk7CisKKwlfX3Jhd193cml0ZWwodG1wLCBTNVBfQ0xLRElWX0xFRlRCVVMpOworCisJZG8geworCQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0xLRElWX1NUQVRfTEVGVEJVUyk7CisJfSB3aGlsZSAodG1wICYgMHgxMSk7CisKKwkvKiBDaGFuZ2UgRGl2aWRlciAtIFJJR0hUQlVTICovCisKKwl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0xLRElWX1JJR0hUQlVTKTsKKworCXRtcCAmPSB+KFM1UF9DTEtESVZfQlVTX0dETFJfTUFTSyB8IFM1UF9DTEtESVZfQlVTX0dQTFJfTUFTSyk7CisKKwl0bXAgfD0gKChjbGtkaXZfbHJfYnVzW2Rpdl9pbmRleF1bMF0gPDwgUzVQX0NMS0RJVl9CVVNfR0RMUl9TSElGVCkgfAorCQkoY2xrZGl2X2xyX2J1c1tkaXZfaW5kZXhdWzFdIDw8IFM1UF9DTEtESVZfQlVTX0dQTFJfU0hJRlQpKTsKKworCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9DTEtESVZfUklHSFRCVVMpOworCisJZG8geworCQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0xLRElWX1NUQVRfUklHSFRCVVMpOworCX0gd2hpbGUgKHRtcCAmIDB4MTEpOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0X3NldF9hcGxsKHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJLyogMS4gTVVYX0NPUkVfU0VMID0gTVBMTCwgQVJNQ0xLIHVzZXMgTVBMTCBmb3IgbG9jayB0aW1lICovCisJY2xrX3NldF9wYXJlbnQobW91dGNvcmUsIG1vdXRfbXBsbCk7CisKKwlkbyB7CisJCXRtcCA9IChfX3Jhd19yZWFkbChTNVBfQ0xLTVVYX1NUQVRDUFUpCisJCQk+PiBTNVBfQ0xLU1JDX0NQVV9NVVhDT1JFX1NISUZUKTsKKwkJdG1wICY9IDB4NzsKKwl9IHdoaWxlICh0bXAgIT0gMHgyKTsKKworCS8qIDIuIFNldCBBUExMIExvY2sgdGltZSAqLworCV9fcmF3X3dyaXRlbChTNVBfQVBMTF9MT0NLVElNRSwgUzVQX0FQTExfTE9DSyk7CisKKwkvKiAzLiBDaGFuZ2UgUExMIFBNUyB2YWx1ZXMgKi8KKwl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQVBMTF9DT04wKTsKKwl0bXAgJj0gfigoMHgzZmYgPDwgMTYpIHwgKDB4M2YgPDwgOCkgfCAoMHg3IDw8IDApKTsKKwl0bXAgfD0gZXh5bm9zNF9hcGxsX3Btc190YWJsZVtpbmRleF07CisJX19yYXdfd3JpdGVsKHRtcCwgUzVQX0FQTExfQ09OMCk7CisKKwkvKiA0LiB3YWl0X2xvY2tfdGltZSAqLworCWRvIHsKKwkJdG1wID0gX19yYXdfcmVhZGwoUzVQX0FQTExfQ09OMCk7CisJfSB3aGlsZSAoISh0bXAgJiAoMHgxIDw8IFM1UF9BUExMQ09OMF9MT0NLRURfU0hJRlQpKSk7CisKKwkvKiA1LiBNVVhfQ09SRV9TRUwgPSBBUExMICovCisJY2xrX3NldF9wYXJlbnQobW91dGNvcmUsIG1vdXRfYXBsbCk7CisKKwlkbyB7CisJCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9DTEtNVVhfU1RBVENQVSk7CisJCXRtcCAmPSBTNVBfQ0xLTVVYX1NUQVRDUFVfTVVYQ09SRV9NQVNLOworCX0gd2hpbGUgKHRtcCAhPSAoMHgxIDw8IFM1UF9DTEtTUkNfQ1BVX01VWENPUkVfU0hJRlQpKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNF9zZXRfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBvbGRfaW5kZXgsIHVuc2lnbmVkIGludCBuZXdfaW5kZXgpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCWlmIChvbGRfaW5kZXggPiBuZXdfaW5kZXgpIHsKKwkJLyogVGhlIGZyZXF1ZW5jeSBjaGFuZ2luZyB0byBMMCBuZWVkcyB0byBjaGFuZ2UgYXBsbCAqLworCQlpZiAoZnJlcXMubmV3ID09IGV4eW5vczRfZnJlcV90YWJsZVtMMF0uZnJlcXVlbmN5KSB7CisJCQkvKiAxLiBDaGFuZ2UgdGhlIHN5c3RlbSBjbG9jayBkaXZpZGVyIHZhbHVlcyAqLworCQkJZXh5bm9zNF9zZXRfY2xrZGl2KG5ld19pbmRleCk7CisKKwkJCS8qIDIuIENoYW5nZSB0aGUgYXBsbCBtLHAscyB2YWx1ZSAqLworCQkJZXh5bm9zNF9zZXRfYXBsbChuZXdfaW5kZXgpOworCQl9IGVsc2UgeworCQkJLyogMS4gQ2hhbmdlIHRoZSBzeXN0ZW0gY2xvY2sgZGl2aWRlciB2YWx1ZXMgKi8KKwkJCWV4eW5vczRfc2V0X2Nsa2RpdihuZXdfaW5kZXgpOworCisJCQkvKiAyLiBDaGFuZ2UganVzdCBzIHZhbHVlIGluIGFwbGwgbSxwLHMgdmFsdWUgKi8KKwkJCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9BUExMX0NPTjApOworCQkJdG1wICY9IH4oMHg3IDw8IDApOworCQkJdG1wIHw9IChleHlub3M0X2FwbGxfcG1zX3RhYmxlW25ld19pbmRleF0gJiAweDcpOworCQkJX19yYXdfd3JpdGVsKHRtcCwgUzVQX0FQTExfQ09OMCk7CisJCX0KKwl9CisKKwllbHNlIGlmIChvbGRfaW5kZXggPCBuZXdfaW5kZXgpIHsKKwkJLyogVGhlIGZyZXF1ZW5jeSBjaGFuZ2luZyBmcm9tIEwwIG5lZWRzIHRvIGNoYW5nZSBhcGxsICovCisJCWlmIChmcmVxcy5vbGQgPT0gZXh5bm9zNF9mcmVxX3RhYmxlW0wwXS5mcmVxdWVuY3kpIHsKKwkJCS8qIDEuIENoYW5nZSB0aGUgYXBsbCBtLHAscyB2YWx1ZSAqLworCQkJZXh5bm9zNF9zZXRfYXBsbChuZXdfaW5kZXgpOworCisJCQkvKiAyLiBDaGFuZ2UgdGhlIHN5c3RlbSBjbG9jayBkaXZpZGVyIHZhbHVlcyAqLworCQkJZXh5bm9zNF9zZXRfY2xrZGl2KG5ld19pbmRleCk7CisJCX0gZWxzZSB7CisJCQkvKiAxLiBDaGFuZ2UganVzdCBzIHZhbHVlIGluIGFwbGwgbSxwLHMgdmFsdWUgKi8KKwkJCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9BUExMX0NPTjApOworCQkJdG1wICY9IH4oMHg3IDw8IDApOworCQkJdG1wIHw9IChleHlub3M0X2FwbGxfcG1zX3RhYmxlW25ld19pbmRleF0gJiAweDcpOworCQkJX19yYXdfd3JpdGVsKHRtcCwgUzVQX0FQTExfQ09OMCk7CisKKwkJCS8qIDIuIENoYW5nZSB0aGUgc3lzdGVtIGNsb2NrIGRpdmlkZXIgdmFsdWVzICovCisJCQlleHlub3M0X3NldF9jbGtkaXYobmV3X2luZGV4KTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBleHlub3M0X3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCSAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAorCQkJICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50IGluZGV4LCBvbGRfaW5kZXg7CisJdW5zaWduZWQgaW50IGFybV92b2x0LCBpbnRfdm9sdDsKKworCWZyZXFzLm9sZCA9IGV4eW5vczRfZ2V0c3BlZWQocG9saWN5LT5jcHUpOworCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIGV4eW5vczRfZnJlcV90YWJsZSwKKwkJCQkJICAgZnJlcXMub2xkLCByZWxhdGlvbiwgJm9sZF9pbmRleCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIGV4eW5vczRfZnJlcV90YWJsZSwKKwkJCQkJICAgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmaW5kZXgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZyZXFzLm5ldyA9IGV4eW5vczRfZnJlcV90YWJsZVtpbmRleF0uZnJlcXVlbmN5OworCWZyZXFzLmNwdSA9IHBvbGljeS0+Y3B1OworCisJaWYgKGZyZXFzLm5ldyA9PSBmcmVxcy5vbGQpCisJCXJldHVybiAwOworCisJLyogZ2V0IHRoZSB2b2x0YWdlIHZhbHVlICovCisJYXJtX3ZvbHQgPSBleHlub3M0X3ZvbHRfdGFibGVbaW5kZXhdLmFybV92b2x0OworCWludF92b2x0ID0gZXh5bm9zNF92b2x0X3RhYmxlW2luZGV4XS5pbnRfdm9sdDsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwkvKiBjb250cm9sIHJlZ3VsYXRvciAqLworCWlmIChmcmVxcy5uZXcgPiBmcmVxcy5vbGQpIHsKKwkJLyogVm9sdGFnZSB1cCAqLworCQlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UoYXJtX3JlZ3VsYXRvciwgYXJtX3ZvbHQsIGFybV92b2x0KTsKKwkJcmVndWxhdG9yX3NldF92b2x0YWdlKGludF9yZWd1bGF0b3IsIGludF92b2x0LCBpbnRfdm9sdCk7CisJfQorCisJLyogQ2xvY2sgQ29uZmlndXJhdGlvbiBQcm9jZWR1cmUgKi8KKwlleHlub3M0X3NldF9mcmVxdWVuY3kob2xkX2luZGV4LCBpbmRleCk7CisKKwkvKiBjb250cm9sIHJlZ3VsYXRvciAqLworCWlmIChmcmVxcy5uZXcgPCBmcmVxcy5vbGQpIHsKKwkJLyogVm9sdGFnZSBkb3duICovCisJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShhcm1fcmVndWxhdG9yLCBhcm1fdm9sdCwgYXJtX3ZvbHQpOworCQlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UoaW50X3JlZ3VsYXRvciwgaW50X3ZvbHQsIGludF92b2x0KTsKKwl9CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGV4eW5vczRfY3B1ZnJlcV9zdXNwZW5kKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY3B1ZnJlcV9yZXN1bWUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBleHlub3M0X2NwdWZyZXFfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcG9saWN5LT5jdXIgPSBwb2xpY3ktPm1pbiA9IHBvbGljeS0+bWF4ID0gZXh5bm9zNF9nZXRzcGVlZChwb2xpY3ktPmNwdSk7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihleHlub3M0X2ZyZXFfdGFibGUsIHBvbGljeS0+Y3B1KTsKKworCS8qIHNldCB0aGUgdHJhbnNpdGlvbiBsYXRlbmN5IHZhbHVlICovCisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDEwMDAwMDsKKworCS8qCisJICogRVhZTk9TNCBtdWx0aS1jb3JlIHByb2Nlc3NvcnMgaGFzIDIgY29yZXMKKwkgKiB0aGF0IHRoZSBmcmVxdWVuY3kgY2Fubm90IGJlIHNldCBpbmRlcGVuZGVudGx5LgorCSAqIEVhY2ggY3B1IGlzIGJvdW5kIHRvIHRoZSBzYW1lIHNwZWVkLgorCSAqIFNvIHRoZSBhZmZlY3RlZCBjcHUgaXMgYWxsIG9mIHRoZSBjcHVzLgorCSAqLworCWNwdW1hc2tfc2V0YWxsKHBvbGljeS0+Y3B1cyk7CisKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIGV4eW5vczRfZnJlcV90YWJsZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgZXh5bm9zNF9kcml2ZXIgPSB7CisJLmZsYWdzCQk9IENQVUZSRVFfU1RJQ0tZLAorCS52ZXJpZnkJCT0gZXh5bm9zNF92ZXJpZnlfc3BlZWQsCisJLnRhcmdldAkJPSBleHlub3M0X3RhcmdldCwKKwkuZ2V0CQk9IGV4eW5vczRfZ2V0c3BlZWQsCisJLmluaXQJCT0gZXh5bm9zNF9jcHVmcmVxX2NwdV9pbml0LAorCS5uYW1lCQk9ICJleHlub3M0X2NwdWZyZXEiLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gZXh5bm9zNF9jcHVmcmVxX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBleHlub3M0X2NwdWZyZXFfcmVzdW1lLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IF9faW5pdCBleHlub3M0X2NwdWZyZXFfaW5pdCh2b2lkKQoreworCWNwdV9jbGsgPSBjbGtfZ2V0KE5VTEwsICJhcm1jbGsiKTsKKwlpZiAoSVNfRVJSKGNwdV9jbGspKQorCQlyZXR1cm4gUFRSX0VSUihjcHVfY2xrKTsKKworCW1vdXRjb3JlID0gY2xrX2dldChOVUxMLCAibW91dGNvcmUiKTsKKwlpZiAoSVNfRVJSKG1vdXRjb3JlKSkKKwkJZ290byBvdXQ7CisKKwltb3V0X21wbGwgPSBjbGtfZ2V0KE5VTEwsICJtb3V0X21wbGwiKTsKKwlpZiAoSVNfRVJSKG1vdXRfbXBsbCkpCisJCWdvdG8gb3V0OworCisJbW91dF9hcGxsID0gY2xrX2dldChOVUxMLCAibW91dF9hcGxsIik7CisJaWYgKElTX0VSUihtb3V0X2FwbGwpKQorCQlnb3RvIG91dDsKKworCWFybV9yZWd1bGF0b3IgPSByZWd1bGF0b3JfZ2V0KE5VTEwsICJ2ZGRfYXJtIik7CisJaWYgKElTX0VSUihhcm1fcmVndWxhdG9yKSkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBnZXQgcmVzb3VyY2UgJXNcbiIsICJ2ZGRfYXJtIik7CisJCWdvdG8gb3V0OworCX0KKworCWludF9yZWd1bGF0b3IgPSByZWd1bGF0b3JfZ2V0KE5VTEwsICJ2ZGRfaW50Iik7CisJaWYgKElTX0VSUihpbnRfcmVndWxhdG9yKSkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBnZXQgcmVzb3VyY2UgJXNcbiIsICJ2ZGRfaW50Iik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQ2hlY2sgRFJBTSB0eXBlLgorCSAqIEJlY2F1c2UgRFZGUyBsZXZlbCBpcyBkaWZmZXJlbnQgYWNjb3JkaW5nIHRvIERSQU0gdHlwZS4KKwkgKi8KKwltZW10eXBlID0gX19yYXdfcmVhZGwoUzVQX1ZBX0RNQzAgKyBTNVBfRE1DMF9NRU1DT05fT0ZGU0VUKTsKKwltZW10eXBlID0gKG1lbXR5cGUgPj4gUzVQX0RNQzBfTUVNVFlQRV9TSElGVCk7CisJbWVtdHlwZSAmPSBTNVBfRE1DMF9NRU1UWVBFX01BU0s7CisKKwlpZiAoKG1lbXR5cGUgPCBERFIyKSAmJiAobWVtdHlwZSA+IEREUjMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHdyb25nIG1lbXR5cGU9IDB4JXhcbiIsIF9fZnVuY19fLCBtZW10eXBlKTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBtZW10eXBlPSAweCV4XG4iLCBfX2Z1bmNfXywgbWVtdHlwZSk7CisJfQorCisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZleHlub3M0X2RyaXZlcik7CisKK291dDoKKwlpZiAoIUlTX0VSUihjcHVfY2xrKSkKKwkJY2xrX3B1dChjcHVfY2xrKTsKKworCWlmICghSVNfRVJSKG1vdXRjb3JlKSkKKwkJY2xrX3B1dChtb3V0Y29yZSk7CisKKwlpZiAoIUlTX0VSUihtb3V0X21wbGwpKQorCQljbGtfcHV0KG1vdXRfbXBsbCk7CisKKwlpZiAoIUlTX0VSUihtb3V0X2FwbGwpKQorCQljbGtfcHV0KG1vdXRfYXBsbCk7CisKKwlpZiAoIUlTX0VSUihhcm1fcmVndWxhdG9yKSkKKwkJcmVndWxhdG9yX3B1dChhcm1fcmVndWxhdG9yKTsKKworCWlmICghSVNfRVJSKGludF9yZWd1bGF0b3IpKQorCQlyZWd1bGF0b3JfcHV0KGludF9yZWd1bGF0b3IpOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIGluaXRpYWxpemF0aW9uXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KK2xhdGVfaW5pdGNhbGwoZXh5bm9zNF9jcHVmcmVxX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL21hcGxlLWNwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9tYXBsZS1jcHVmcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliMTc4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9tYXBsZS1jcHVmcmVxLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDExIERtaXRyeSBFcmVtaW4tU29sZW5pa292CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKiAgYW5kICAgICAgICAgICAgICAgICAgICAgICBNYXJrdXMgRGVtbGVpdG5lciA8bXNkZW1sZWlAY2wudW5pLWhlaWRlbGJlcmcuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGRyaXZlciBhZGRzIGJhc2ljIGNwdWZyZXEgc3VwcG9ydCBmb3IgU01VICYgOTcwRlggYmFzZWQgRzUgTWFjcywKKyAqIHRoYXQgaXMgaU1hYyBHNSBhbmQgbGF0ZXN0IHNpbmdsZSBDUFUgZGVza3RvcC4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKworI2RlZmluZSBEQkcoZm10Li4uKSBwcl9kZWJ1ZyhmbXQpCisKKy8qIHNlZSA5NzBGWCB1c2VyIG1hbnVhbCAqLworCisjZGVmaW5lIFNDT01fUENSIDB4MGFhMDAxCQkJLyogUENSIHNjb20gYWRkciAqLworCisjZGVmaW5lIFBDUl9ISUxPX1NFTEVDVAkJMHg4MDAwMDAwMFUJLyogMSA9IFBDUiwgMCA9IFBDUkggKi8KKyNkZWZpbmUgUENSX1NQRUVEX0ZVTEwJCTB4MDAwMDAwMDBVCS8qIDE6MSBzcGVlZCB2YWx1ZSAqLworI2RlZmluZSBQQ1JfU1BFRURfSEFMRgkJMHgwMDAyMDAwMFUJLyogMToyIHNwZWVkIHZhbHVlICovCisjZGVmaW5lIFBDUl9TUEVFRF9RVUFSVEVSCTB4MDAwNDAwMDBVCS8qIDE6NCBzcGVlZCB2YWx1ZSAqLworI2RlZmluZSBQQ1JfU1BFRURfTUFTSwkJMHgwMDBlMDAwMFUJLyogc3BlZWQgbWFzayAqLworI2RlZmluZSBQQ1JfU1BFRURfU0hJRlQJCTE3CisjZGVmaW5lIFBDUl9GUkVRX1JFUV9WQUxJRAkweDAwMDEwMDAwVQkvKiBmcmVxIHJlcXVlc3QgdmFsaWQgKi8KKyNkZWZpbmUgUENSX1ZPTFRfUkVRX1ZBTElECTB4MDAwMDgwMDBVCS8qIHZvbHQgcmVxdWVzdCB2YWxpZCAqLworI2RlZmluZSBQQ1JfVEFSR0VUX1RJTUVfTUFTSwkweDAwMDA2MDAwVQkvKiB0YXJnZXQgdGltZSAqLworI2RlZmluZSBQQ1JfU1RBVExBVF9NQVNLCTB4MDAwMDFmMDBVCS8qIFNUQVRMQVQgdmFsdWUgKi8KKyNkZWZpbmUgUENSX1NOT09QTEFUX01BU0sJMHgwMDAwMDBmMFUJLyogU05PT1BMQVQgdmFsdWUgKi8KKyNkZWZpbmUgUENSX1NOT09QQUNDX01BU0sJMHgwMDAwMDAwZlUJLyogU05PT1BBQ0MgdmFsdWUgKi8KKworI2RlZmluZSBTQ09NX1BTUiAweDQwODAwMQkJCS8qIFBTUiBzY29tIGFkZHIgKi8KKy8qIHdhcm5pbmc6IFBTUiBpcyBhIDY0IGJpdHMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFNSX0NNRF9SRUNFSVZFRAkweDIwMDAwMDAwMDAwMDAwMDBVICAgLyogY29tbWFuZCByZWNlaXZlZCAqLworI2RlZmluZSBQU1JfQ01EX0NPTVBMRVRFRAkweDEwMDAwMDAwMDAwMDAwMDBVICAgLyogY29tbWFuZCBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgUFNSX0NVUl9TUEVFRF9NQVNLCTB4MDMwMDAwMDAwMDAwMDAwMFUgICAvKiBjdXJyZW50IHNwZWVkICovCisjZGVmaW5lIFBTUl9DVVJfU1BFRURfU0hJRlQJKDU2KQorCisvKgorICogVGhlIEc1IG9ubHkgc3VwcG9ydHMgdHdvIGZyZXF1ZW5jaWVzIChRdWFydGVyIHNwZWVkIGlzIG5vdCBzdXBwb3J0ZWQpCisgKi8KKyNkZWZpbmUgQ1BVRlJFUV9ISUdIICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUFVGUkVRX0xPVyAgICAgICAgICAgICAgICAgICAxCisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgbWFwbGVfY3B1X2ZyZXFzW10gPSB7CisJe0NQVUZSRVFfSElHSCwJCTB9LAorCXtDUFVGUkVRX0xPVywJCTB9LAorCXswLAkJCUNQVUZSRVFfVEFCTEVfRU5EfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyICptYXBsZV9jcHVfZnJlcXNfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworLyogUG93ZXIgbW9kZSBkYXRhIGlzIGFuIGFycmF5IG9mIHRoZSAzMiBiaXRzIFBDUiB2YWx1ZXMgdG8gdXNlIGZvcgorICogdGhlIHZhcmlvdXMgZnJlcXVlbmNpZXMsIHJldHJpZXZlZCBmcm9tIHRoZSBkZXZpY2UtdHJlZQorICovCitzdGF0aWMgaW50IG1hcGxlX3Btb2RlX2N1cjsKKworc3RhdGljIERFRklORV9NVVRFWChtYXBsZV9zd2l0Y2hfbXV0ZXgpOworCitzdGF0aWMgY29uc3QgdTMyICptYXBsZV9wbW9kZV9kYXRhOworc3RhdGljIGludCBtYXBsZV9wbW9kZV9tYXg7CisKKy8qCisgKiBTQ09NIGJhc2VkIGZyZXF1ZW5jeSBzd2l0Y2hpbmcgZm9yIDk3MEZYIHJldjMKKyAqLworc3RhdGljIGludCBtYXBsZV9zY29tX3N3aXRjaF9mcmVxKGludCBzcGVlZF9tb2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRvOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogQ2xlYXIgUENSIGhpZ2ggKi8KKwlzY29tOTcwX3dyaXRlKFNDT01fUENSLCAwKTsKKwkvKiBDbGVhciBQQ1IgbG93ICovCisJc2NvbTk3MF93cml0ZShTQ09NX1BDUiwgUENSX0hJTE9fU0VMRUNUIHwgMCk7CisJLyogU2V0IFBDUiBsb3cgKi8KKwlzY29tOTcwX3dyaXRlKFNDT01fUENSLCBQQ1JfSElMT19TRUxFQ1QgfAorCQkgICAgICBtYXBsZV9wbW9kZV9kYXRhW3NwZWVkX21vZGVdKTsKKworCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwlmb3IgKHRvID0gMDsgdG8gPCAxMDsgdG8rKykgeworCQl1bnNpZ25lZCBsb25nIHBzciA9IHNjb205NzBfcmVhZChTQ09NX1BTUik7CisKKwkJaWYgKChwc3IgJiBQU1JfQ01EX1JFQ0VJVkVEKSA9PSAwICYmCisJCSAgICAoKChwc3IgPj4gUFNSX0NVUl9TUEVFRF9TSElGVCkgXgorCQkgICAgICAobWFwbGVfcG1vZGVfZGF0YVtzcGVlZF9tb2RlXSA+PiBQQ1JfU1BFRURfU0hJRlQpKSAmIDB4MykKKwkJICAgID09IDApCisJCQlicmVhazsKKwkJaWYgKHBzciAmIFBTUl9DTURfQ09NUExFVEVEKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCW1hcGxlX3Btb2RlX2N1ciA9IHNwZWVkX21vZGU7CisJcHBjX3Byb2NfZnJlcSA9IG1hcGxlX2NwdV9mcmVxc1tzcGVlZF9tb2RlXS5mcmVxdWVuY3kgKiAxMDAwdWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXBsZV9zY29tX3F1ZXJ5X2ZyZXEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBzciA9IHNjb205NzBfcmVhZChTQ09NX1BTUik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IG1hcGxlX3Btb2RlX21heDsgaSsrKQorCQlpZiAoKCgocHNyID4+IFBTUl9DVVJfU1BFRURfU0hJRlQpIF4KKwkJICAgICAgKG1hcGxlX3Btb2RlX2RhdGFbaV0gPj4gUENSX1NQRUVEX1NISUZUKSkgJiAweDMpID09IDApCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIENvbW1vbiBpbnRlcmZhY2UgdG8gdGhlIGNwdWZyZXEgY29yZQorICovCisKK3N0YXRpYyBpbnQgbWFwbGVfY3B1ZnJlcV92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIG1hcGxlX2NwdV9mcmVxcyk7Cit9CisKK3N0YXRpYyBpbnQgbWFwbGVfY3B1ZnJlcV90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLCB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50IG5ld3N0YXRlID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwlpbnQgcmM7CisKKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgbWFwbGVfY3B1X2ZyZXFzLAorCQkJdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtYXBsZV9wbW9kZV9jdXIgPT0gbmV3c3RhdGUpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmbWFwbGVfc3dpdGNoX211dGV4KTsKKworCWZyZXFzLm9sZCA9IG1hcGxlX2NwdV9mcmVxc1ttYXBsZV9wbW9kZV9jdXJdLmZyZXF1ZW5jeTsKKwlmcmVxcy5uZXcgPSBtYXBsZV9jcHVfZnJlcXNbbmV3c3RhdGVdLmZyZXF1ZW5jeTsKKwlmcmVxcy5jcHUgPSAwOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwlyYyA9IG1hcGxlX3Njb21fc3dpdGNoX2ZyZXEobmV3c3RhdGUpOworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJbXV0ZXhfdW5sb2NrKCZtYXBsZV9zd2l0Y2hfbXV0ZXgpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1hcGxlX2NwdWZyZXFfZ2V0X3NwZWVkKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIG1hcGxlX2NwdV9mcmVxc1ttYXBsZV9wbW9kZV9jdXJdLmZyZXF1ZW5jeTsKK30KKworc3RhdGljIGludCBtYXBsZV9jcHVmcmVxX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAxMjAwMDsKKwlwb2xpY3ktPmN1ciA9IG1hcGxlX2NwdV9mcmVxc1ttYXBsZV9zY29tX3F1ZXJ5X2ZyZXEoKV0uZnJlcXVlbmN5OworCS8qIHNlY29uZGFyeSBDUFVzIGFyZSB0aWVkIHRvIHRoZSBwcmltYXJ5IG9uZSBieSB0aGUKKwkgKiBjcHVmcmVxIGNvcmUgaWYgaW4gdGhlIHNlY29uZGFyeSBwb2xpY3kgd2UgdGVsbCBpdCB0aGF0CisJICogaXQgYWN0dWFsbHkgbXVzdCBiZSBvbmUgcG9saWN5IHRvZ2V0aGVyIHdpdGggYWxsIG90aGVycy4gKi8KKwljcHVtYXNrX2NvcHkocG9saWN5LT5jcHVzLCBjcHVfb25saW5lX21hc2spOworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKG1hcGxlX2NwdV9mcmVxcywgcG9saWN5LT5jcHUpOworCisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LAorCQltYXBsZV9jcHVfZnJlcXMpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgbWFwbGVfY3B1ZnJlcV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIm1hcGxlIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZsYWdzCQk9IENQVUZSRVFfQ09OU1RfTE9PUFMsCisJLmluaXQJCT0gbWFwbGVfY3B1ZnJlcV9jcHVfaW5pdCwKKwkudmVyaWZ5CQk9IG1hcGxlX2NwdWZyZXFfdmVyaWZ5LAorCS50YXJnZXQJCT0gbWFwbGVfY3B1ZnJlcV90YXJnZXQsCisJLmdldAkJPSBtYXBsZV9jcHVmcmVxX2dldF9zcGVlZCwKKwkuYXR0cgkJPSBtYXBsZV9jcHVfZnJlcXNfYXR0ciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1hcGxlX2NwdWZyZXFfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1czsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdW5vZGU7CisJdW5zaWduZWQgaW50IHBzaXplOworCXVuc2lnbmVkIGxvbmcgbWF4X2ZyZXE7CisJY29uc3QgdTMyICp2YWxwOworCXUzMiBwdnJfaGk7CisJaW50IHJjID0gLUVOT0RFVjsKKworCS8qCisJICogQmVoYXZlIGhlcmUgbGlrZSBwb3dlcm1hYyBkcml2ZXIgd2hpY2ggY2hlY2tzIG1hY2hpbmUgY29tcGF0aWJpbGl0eQorCSAqIHRvIGVhc2UgbWVyZ2luZyBvZiB0d28gZHJpdmVycyBpbiBmdXR1cmUuCisJICovCisJaWYgKCFvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1vbWVudHVtLE1hcGxlIikgJiYKKwkgICAgIW9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiTW9tZW50dW0sQXBhY2hlIikpCisJCXJldHVybiAwOworCisJY3B1cyA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY3B1cyIpOworCWlmIChjcHVzID09IE5VTEwpIHsKKwkJREJHKCJObyAvY3B1cyBub2RlICFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBHZXQgZmlyc3QgQ1BVIG5vZGUgKi8KKwlmb3IgKGNwdW5vZGUgPSBOVUxMOworCSAgICAgKGNwdW5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChjcHVzLCBjcHVub2RlKSkgIT0gTlVMTDspIHsKKwkJY29uc3QgdTMyICpyZWcgPSBvZl9nZXRfcHJvcGVydHkoY3B1bm9kZSwgInJlZyIsIE5VTEwpOworCQlpZiAocmVnID09IE5VTEwgfHwgKCpyZWcpICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJjbXAoY3B1bm9kZS0+dHlwZSwgImNwdSIpKQorCQkJYnJlYWs7CisJfQorCWlmIChjcHVub2RlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBDYW4ndCBmaW5kIGFueSBDUFUgMCBub2RlXG4iKTsKKwkJZ290byBiYWlsX2NwdXM7CisJfQorCisJLyogQ2hlY2sgOTcwRlggZm9yIG5vdyAqLworCS8qIHdlIGFjdHVhbGx5IGRvbid0IGNhcmUgb24gd2hpY2ggQ1BVIHRvIGFjY2VzcyBQVlIgKi8KKwlwdnJfaGkgPSBQVlJfVkVSKG1mc3ByKFNQUk5fUFZSKSk7CisJaWYgKHB2cl9oaSAhPSAweDNjICYmIHB2cl9oaSAhPSAweDQ0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogVW5zdXBwb3J0ZWQgQ1BVIHZlcnNpb24gKCV4KVxuIiwKKwkJCQlwdnJfaGkpOworCQlnb3RvIGJhaWxfbm9wcm9wczsKKwl9CisKKwkvKiBMb29rIGZvciB0aGUgcG93ZXJ0dW5lIGRhdGEgaW4gdGhlIGRldmljZS10cmVlICovCisJLyoKKwkgKiBPbiBNYXBsZSB0aGlzIHByb3BlcnR5IGlzIHByb3ZpZGVkIGJ5IFBJQlMgaW4gZHVhbC1wcm9jZXNzb3IgY29uZmlnLAorCSAqIG5vdCBwcm92aWRlZCBieSBQSUJTIGluIENQVTAgY29uZmlnIGFuZCBhbHNvIG5vdCBwcm92aWRlZCBieSBTTE9GLAorCSAqIHNvIFlNTVYKKwkgKi8KKwltYXBsZV9wbW9kZV9kYXRhID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJwb3dlci1tb2RlLWRhdGEiLCAmcHNpemUpOworCWlmICghbWFwbGVfcG1vZGVfZGF0YSkgeworCQlEQkcoIk5vIHBvd2VyLW1vZGUtZGF0YSAhXG4iKTsKKwkJZ290byBiYWlsX25vcHJvcHM7CisJfQorCW1hcGxlX3Btb2RlX21heCA9IHBzaXplIC8gc2l6ZW9mKHUzMikgLSAxOworCisJLyoKKwkgKiBGcm9tIHdoYXQgSSBzZWUsIGNsb2NrLWZyZXF1ZW5jeSBpcyBhbHdheXMgdGhlIG1heGltYWwgZnJlcXVlbmN5LgorCSAqIFRoZSBjdXJyZW50IGRyaXZlciBjYW4gbm90IHNsZXcgc3lzY2xrIHlldCwgc28gd2UgcmVhbGx5IG9ubHkgZGVhbAorCSAqIHdpdGggcG93ZXJ0dW5lIHN0ZXBzIGZvciBub3cuIFdlIGFsc28gb25seSBpbXBsZW1lbnQgZnVsbCBmcmVxIGFuZAorCSAqIGhhbGYgZnJlcSBpbiB0aGlzIHZlcnNpb24uIFNvIGZhciwgSSBoYXZlbid0IHlldCBzZWVuIGEgbWFjaGluZQorCSAqIHN1cHBvcnRpbmcgYW55dGhpbmcgZWxzZS4KKwkgKi8KKwl2YWxwID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwlpZiAoIXZhbHApCisJCXJldHVybiAtRU5PREVWOworCW1heF9mcmVxID0gKCp2YWxwKS8xMDAwOworCW1hcGxlX2NwdV9mcmVxc1swXS5mcmVxdWVuY3kgPSBtYXhfZnJlcTsKKwltYXBsZV9jcHVfZnJlcXNbMV0uZnJlcXVlbmN5ID0gbWF4X2ZyZXEvMjsKKworCS8qIEZvcmNlIGFwcGx5IGN1cnJlbnQgZnJlcXVlbmN5IHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIGluCisJICogc3luYyAodm9sdGFnZSBpcyByaWdodCBmb3IgZXhhbXBsZSkuIEZpcm13YXJlIG1heSBsZWF2ZSB1cyB3aXRoCisJICogYSBzdHJhbmdlIHNldHRpbmcgLi4uCisJICovCisJbXNsZWVwKDEwKTsKKwltYXBsZV9wbW9kZV9jdXIgPSAtMTsKKwltYXBsZV9zY29tX3N3aXRjaF9mcmVxKG1hcGxlX3Njb21fcXVlcnlfZnJlcSgpKTsKKworCXByaW50ayhLRVJOX0lORk8gIlJlZ2lzdGVyaW5nIE1hcGxlIENQVSBmcmVxdWVuY3kgZHJpdmVyXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJMb3c6ICVkIE1oeiwgSGlnaDogJWQgTWh6LCBDdXI6ICVkIE1IelxuIiwKKwkJbWFwbGVfY3B1X2ZyZXFzWzFdLmZyZXF1ZW5jeS8xMDAwLAorCQltYXBsZV9jcHVfZnJlcXNbMF0uZnJlcXVlbmN5LzEwMDAsCisJCW1hcGxlX2NwdV9mcmVxc1ttYXBsZV9wbW9kZV9jdXJdLmZyZXF1ZW5jeS8xMDAwKTsKKworCXJjID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJm1hcGxlX2NwdWZyZXFfZHJpdmVyKTsKKworCW9mX25vZGVfcHV0KGNwdW5vZGUpOworCW9mX25vZGVfcHV0KGNwdXMpOworCisJcmV0dXJuIHJjOworCitiYWlsX25vcHJvcHM6CisJb2Zfbm9kZV9wdXQoY3B1bm9kZSk7CitiYWlsX2NwdXM6CisJb2Zfbm9kZV9wdXQoY3B1cyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK21vZHVsZV9pbml0KG1hcGxlX2NwdWZyZXFfaW5pdCk7CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3Bvd2Vybm93LWs4LmMgYi9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazguYwppbmRleCA4MzQ3OWI2Li5iY2U1NzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazguYworKysgYi9kcml2ZXJzL2NwdWZyZXEvcG93ZXJub3ctazguYwpAQCAtMTA3OSw2ICsxMDc5LDkgQEAKIAl9CiAKIAlyZXMgPSB0cmFuc2l0aW9uX2ZpZF92aWQoZGF0YSwgZmlkLCB2aWQpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKIAlmcmVxcy5uZXcgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGRhdGEtPmN1cnJmaWQpOwogCiAJZm9yX2VhY2hfY3B1KGksIGRhdGEtPmF2YWlsYWJsZV9jb3JlcykgewpAQCAtMTEwMSw3ICsxMTA0LDggQEAKIAkvKiBnZXQgTVNSIGluZGV4IGZvciBoYXJkd2FyZSBwc3RhdGUgdHJhbnNpdGlvbiAqLwogCXBzdGF0ZSA9IGluZGV4ICYgSFdfUFNUQVRFX01BU0s7CiAJaWYgKHBzdGF0ZSA+IGRhdGEtPm1heF9od19wc3RhdGUpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKKwogCWZyZXFzLm9sZCA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9wc3RhdGUoZGF0YS0+cG93ZXJub3dfdGFibGUsCiAJCQlkYXRhLT5jdXJycHN0YXRlKTsKIAlmcmVxcy5uZXcgPSBmaW5kX2toel9mcmVxX2Zyb21fcHN0YXRlKGRhdGEtPnBvd2Vybm93X3RhYmxlLCBwc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3MzYzY0eHgtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL3MzYzY0eHgtY3B1ZnJlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZDFkMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NwdWZyZXEvczNjNjR4eC1jcHVmcmVxLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKgorICogUzNDNjR4eCBDUFVmcmVxIFN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICphcm1jbGs7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqdmRkYXJtOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVndWxhdG9yX2xhdGVuY3k7CisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzY0MTAKK3N0cnVjdCBzM2M2NHh4X2R2ZnMgeworCXVuc2lnbmVkIGludCB2ZGRhcm1fbWluOworCXVuc2lnbmVkIGludCB2ZGRhcm1fbWF4OworfTsKKworc3RhdGljIHN0cnVjdCBzM2M2NHh4X2R2ZnMgczNjNjR4eF9kdmZzX3RhYmxlW10gPSB7CisJWzBdID0geyAxMDAwMDAwLCAxMTUwMDAwIH0sCisJWzFdID0geyAxMDUwMDAwLCAxMTUwMDAwIH0sCisJWzJdID0geyAxMTAwMDAwLCAxMTUwMDAwIH0sCisJWzNdID0geyAxMjAwMDAwLCAxMzUwMDAwIH0sCisJWzRdID0geyAxMzAwMDAwLCAxMzUwMDAwIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIHMzYzY0eHhfZnJlcV90YWJsZVtdID0geworCXsgMCwgIDY2MDAwIH0sCisJeyAwLCAxMDAwMDAgfSwKKwl7IDAsIDEzMzAwMCB9LAorCXsgMSwgMjAwMDAwIH0sCisJeyAxLCAyMjIwMDAgfSwKKwl7IDEsIDI2NjAwMCB9LAorCXsgMiwgMzMzMDAwIH0sCisJeyAyLCA0MDAwMDAgfSwKKwl7IDIsIDUzMjAwMCB9LAorCXsgMiwgNTMzMDAwIH0sCisJeyAzLCA2NjcwMDAgfSwKKwl7IDQsIDgwMDAwMCB9LAorCXsgMCwgQ1BVRlJFUV9UQUJMRV9FTkQgfSwKK307CisjZW5kaWYKKworc3RhdGljIGludCBzM2M2NHh4X2NwdWZyZXFfdmVyaWZ5X3NwZWVkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWlmIChwb2xpY3ktPmNwdSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCBzM2M2NHh4X2ZyZXFfdGFibGUpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHMzYzY0eHhfY3B1ZnJlcV9nZXRfc3BlZWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoY3B1ICE9IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIGNsa19nZXRfcmF0ZShhcm1jbGspIC8gMTAwMDsKK30KKworc3RhdGljIGludCBzM2M2NHh4X2NwdWZyZXFfc2V0X3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJc3RydWN0IHMzYzY0eHhfZHZmcyAqZHZmczsKKworCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIHMzYzY0eHhfZnJlcV90YWJsZSwKKwkJCQkJICAgICB0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZpKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlmcmVxcy5jcHUgPSAwOworCWZyZXFzLm9sZCA9IGNsa19nZXRfcmF0ZShhcm1jbGspIC8gMTAwMDsKKwlmcmVxcy5uZXcgPSBzM2M2NHh4X2ZyZXFfdGFibGVbaV0uZnJlcXVlbmN5OworCWZyZXFzLmZsYWdzID0gMDsKKwlkdmZzID0gJnMzYzY0eHhfZHZmc190YWJsZVtzM2M2NHh4X2ZyZXFfdGFibGVbaV0uaW5kZXhdOworCisJaWYgKGZyZXFzLm9sZCA9PSBmcmVxcy5uZXcpCisJCXJldHVybiAwOworCisJcHJfZGVidWcoImNwdWZyZXE6IFRyYW5zaXRpb24gJWQtJWRrSHpcbiIsIGZyZXFzLm9sZCwgZnJlcXMubmV3KTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKyNpZmRlZiBDT05GSUdfUkVHVUxBVE9SCisJaWYgKHZkZGFybSAmJiBmcmVxcy5uZXcgPiBmcmVxcy5vbGQpIHsKKwkJcmV0ID0gcmVndWxhdG9yX3NldF92b2x0YWdlKHZkZGFybSwKKwkJCQkJICAgIGR2ZnMtPnZkZGFybV9taW4sCisJCQkJCSAgICBkdmZzLT52ZGRhcm1fbWF4KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlwcl9lcnIoImNwdWZyZXE6IEZhaWxlZCB0byBzZXQgVkREQVJNIGZvciAlZGtIejogJWRcbiIsCisJCQkgICAgICAgZnJlcXMubmV3LCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisjZW5kaWYKKworCXJldCA9IGNsa19zZXRfcmF0ZShhcm1jbGssIGZyZXFzLm5ldyAqIDEwMDApOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiY3B1ZnJlcTogRmFpbGVkIHRvIHNldCByYXRlICVka0h6OiAlZFxuIiwKKwkJICAgICAgIGZyZXFzLm5ldywgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisKKyNpZmRlZiBDT05GSUdfUkVHVUxBVE9SCisJaWYgKHZkZGFybSAmJiBmcmVxcy5uZXcgPCBmcmVxcy5vbGQpIHsKKwkJcmV0ID0gcmVndWxhdG9yX3NldF92b2x0YWdlKHZkZGFybSwKKwkJCQkJICAgIGR2ZnMtPnZkZGFybV9taW4sCisJCQkJCSAgICBkdmZzLT52ZGRhcm1fbWF4KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlwcl9lcnIoImNwdWZyZXE6IEZhaWxlZCB0byBzZXQgVkREQVJNIGZvciAlZGtIejogJWRcbiIsCisJCQkgICAgICAgZnJlcXMubmV3LCByZXQpOworCQkJZ290byBlcnJfY2xrOworCQl9CisJfQorI2VuZGlmCisKKwlwcl9kZWJ1ZygiY3B1ZnJlcTogU2V0IGFjdHVhbCBmcmVxdWVuY3kgJWx1a0h6XG4iLAorCQkgY2xrX2dldF9yYXRlKGFybWNsaykgLyAxMDAwKTsKKworCXJldHVybiAwOworCitlcnJfY2xrOgorCWlmIChjbGtfc2V0X3JhdGUoYXJtY2xrLCBmcmVxcy5vbGQgKiAxMDAwKSA8IDApCisJCXByX2VycigiRmFpbGVkIHRvIHJlc3RvcmUgb3JpZ2luYWwgY2xvY2sgcmF0ZVxuIik7CitlcnI6CisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX1JFR1VMQVRPUgorc3RhdGljIHZvaWQgX19pbml0IHMzYzY0eHhfY3B1ZnJlcV9jb25maWdfcmVndWxhdG9yKHZvaWQpCit7CisJaW50IGNvdW50LCB2LCBpLCBmb3VuZDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZyZXE7CisJc3RydWN0IHMzYzY0eHhfZHZmcyAqZHZmczsKKworCWNvdW50ID0gcmVndWxhdG9yX2NvdW50X3ZvbHRhZ2VzKHZkZGFybSk7CisJaWYgKGNvdW50IDwgMCkgeworCQlwcl9lcnIoImNwdWZyZXE6IFVuYWJsZSB0byBjaGVjayBzdXBwb3J0ZWQgdm9sdGFnZXNcbiIpOworCX0KKworCWZyZXEgPSBzM2M2NHh4X2ZyZXFfdGFibGU7CisJd2hpbGUgKGNvdW50ID4gMCAmJiBmcmVxLT5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpIHsKKwkJaWYgKGZyZXEtPmZyZXF1ZW5jeSA9PSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQpCisJCQljb250aW51ZTsKKworCQlkdmZzID0gJnMzYzY0eHhfZHZmc190YWJsZVtmcmVxLT5pbmRleF07CisJCWZvdW5kID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJdiA9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2UodmRkYXJtLCBpKTsKKwkJCWlmICh2ID49IGR2ZnMtPnZkZGFybV9taW4gJiYgdiA8PSBkdmZzLT52ZGRhcm1fbWF4KQorCQkJCWZvdW5kID0gMTsKKwkJfQorCisJCWlmICghZm91bmQpIHsKKwkJCXByX2RlYnVnKCJjcHVmcmVxOiAlZGtIeiB1bnN1cHBvcnRlZCBieSByZWd1bGF0b3JcbiIsCisJCQkJIGZyZXEtPmZyZXF1ZW5jeSk7CisJCQlmcmVxLT5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCX0KKworCQlmcmVxKys7CisJfQorCisJLyogR3Vlc3MgYmFzZWQgb24gaGF2aW5nIHRvIGRvIGFuIEkyQy9TUEkgd3JpdGU7IGluIGZ1dHVyZSB3ZQorCSAqIHdpbGwgYmUgYWJsZSB0byBxdWVyeSB0aGUgcmVndWxhdG9yIHBlcmZvcm1hbmNlIGhlcmUuICovCisJcmVndWxhdG9yX2xhdGVuY3kgPSAxICogMTAwMCAqIDEwMDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzM2M2NHh4X2NwdWZyZXFfZHJpdmVyX2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZyZXE7CisKKwlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoczNjNjR4eF9mcmVxX3RhYmxlID09IE5VTEwpIHsKKwkJcHJfZXJyKCJjcHVmcmVxOiBObyBmcmVxdWVuY3kgaW5mb3JtYXRpb24gZm9yIHRoaXMgQ1BVXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYXJtY2xrID0gY2xrX2dldChOVUxMLCAiYXJtY2xrIik7CisJaWYgKElTX0VSUihhcm1jbGspKSB7CisJCXByX2VycigiY3B1ZnJlcTogVW5hYmxlIHRvIG9idGFpbiBBUk1DTEs6ICVsZFxuIiwKKwkJICAgICAgIFBUUl9FUlIoYXJtY2xrKSk7CisJCXJldHVybiBQVFJfRVJSKGFybWNsayk7CisJfQorCisjaWZkZWYgQ09ORklHX1JFR1VMQVRPUgorCXZkZGFybSA9IHJlZ3VsYXRvcl9nZXQoTlVMTCwgInZkZGFybSIpOworCWlmIChJU19FUlIodmRkYXJtKSkgeworCQlyZXQgPSBQVFJfRVJSKHZkZGFybSk7CisJCXByX2VycigiY3B1ZnJlcTogRmFpbGVkIHRvIG9idGFpbiBWRERBUk06ICVkXG4iLCByZXQpOworCQlwcl9lcnIoImNwdWZyZXE6IE9ubHkgZnJlcXVlbmN5IHNjYWxpbmcgYXZhaWxhYmxlXG4iKTsKKwkJdmRkYXJtID0gTlVMTDsKKwl9IGVsc2UgeworCQlzM2M2NHh4X2NwdWZyZXFfY29uZmlnX3JlZ3VsYXRvcigpOworCX0KKyNlbmRpZgorCisJZnJlcSA9IHMzYzY0eHhfZnJlcV90YWJsZTsKKwl3aGlsZSAoZnJlcS0+ZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EKSB7CisJCXVuc2lnbmVkIGxvbmcgcjsKKworCQkvKiBDaGVjayBmb3IgZnJlcXVlbmNpZXMgd2UgY2FuIGdlbmVyYXRlICovCisJCXIgPSBjbGtfcm91bmRfcmF0ZShhcm1jbGssIGZyZXEtPmZyZXF1ZW5jeSAqIDEwMDApOworCQlyIC89IDEwMDA7CisJCWlmIChyICE9IGZyZXEtPmZyZXF1ZW5jeSkgeworCQkJcHJfZGVidWcoImNwdWZyZXE6ICVka0h6IHVuc3VwcG9ydGVkIGJ5IGNsb2NrXG4iLAorCQkJCSBmcmVxLT5mcmVxdWVuY3kpOworCQkJZnJlcS0+ZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCQl9CisKKwkJLyogSWYgd2UgaGF2ZSBubyByZWd1bGF0b3IgdGhlbiBhc3N1bWUgc3RhcnR1cAorCQkgKiBmcmVxdWVuY3kgaXMgdGhlIG1heGltdW0gd2UgY2FuIHN1cHBvcnQuICovCisJCWlmICghdmRkYXJtICYmIGZyZXEtPmZyZXF1ZW5jeSA+IHMzYzY0eHhfY3B1ZnJlcV9nZXRfc3BlZWQoMCkpCisJCQlmcmVxLT5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisKKwkJZnJlcSsrOworCX0KKworCXBvbGljeS0+Y3VyID0gY2xrX2dldF9yYXRlKGFybWNsaykgLyAxMDAwOworCisJLyogRGF0YXNoZWV0IHNheXMgUExMIHN0YWJhbGlzYXRpb24gdGltZSAoaWYgd2Ugd2VyZSB0byB1c2UKKwkgKiB0aGUgUExMcywgd2hpY2ggd2UgZG9uJ3QgY3VycmVudGx5KSBpcyB+MzAwdXMgd29yc3QgY2FzZSwKKwkgKiBidXQgYWRkIHNvbWUgZnVkZ2UuCisJICovCisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9ICg1MDAgKiAxMDAwKSArIHJlZ3VsYXRvcl9sYXRlbmN5OworCisJcmV0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIHMzYzY0eHhfZnJlcV90YWJsZSk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByX2VycigiY3B1ZnJlcTogRmFpbGVkIHRvIGNvbmZpZ3VyZSBmcmVxdWVuY3kgdGFibGU6ICVkXG4iLAorCQkgICAgICAgcmV0KTsKKwkJcmVndWxhdG9yX3B1dCh2ZGRhcm0pOworCQljbGtfcHV0KGFybWNsayk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBzM2M2NHh4X2NwdWZyZXFfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZmxhZ3MgICAgICAgICAgPSAwLAorCS52ZXJpZnkJCT0gczNjNjR4eF9jcHVmcmVxX3ZlcmlmeV9zcGVlZCwKKwkudGFyZ2V0CQk9IHMzYzY0eHhfY3B1ZnJlcV9zZXRfdGFyZ2V0LAorCS5nZXQJCT0gczNjNjR4eF9jcHVmcmVxX2dldF9zcGVlZCwKKwkuaW5pdAkJPSBzM2M2NHh4X2NwdWZyZXFfZHJpdmVyX2luaXQsCisJLm5hbWUJCT0gInMzYyIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzM2M2NHh4X2NwdWZyZXFfaW5pdCh2b2lkKQoreworCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmczNjNjR4eF9jcHVmcmVxX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChzM2M2NHh4X2NwdWZyZXFfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvczVwdjIxMC1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvczVwdjIxMC1jcHVmcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4NGFhZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9zNXB2MjEwLWNwdWZyZXEuYwpAQCAtMCwwICsxLDY0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBDUFUgZnJlcXVlbmN5IHNjYWxpbmcgZm9yIFM1UEMxMTAvUzVQVjIxMAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KKworc3RhdGljIHN0cnVjdCBjbGsgKmNwdV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayAqZG1jMF9jbGs7CitzdGF0aWMgc3RydWN0IGNsayAqZG1jMV9jbGs7CitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CitzdGF0aWMgREVGSU5FX01VVEVYKHNldF9mcmVxX2xvY2spOworCisvKiBBUExMIE0sUCxTIHZhbHVlcyBmb3IgMUcvODAwTWh6ICovCisjZGVmaW5lIEFQTExfVkFMXzEwMDAJKCgxIDw8IDMxKSB8ICgxMjUgPDwgMTYpIHwgKDMgPDwgOCkgfCAxKQorI2RlZmluZSBBUExMX1ZBTF84MDAJKCgxIDw8IDMxKSB8ICgxMDAgPDwgMTYpIHwgKDMgPDwgOCkgfCAxKQorCisvKiBVc2UgODAwTUh6IHdoZW4gZW50ZXJpbmcgc2xlZXAgbW9kZSAqLworI2RlZmluZSBTTEVFUF9GUkVRCSg4MDAgKiAxMDAwKQorCisvKgorICogcmVsYXRpb24gaGFzIGFuIGFkZGl0aW9uYWwgc3ltYW50aWNzIG90aGVyIHRoYW4gdGhlIHN0YW5kYXJkIG9mIGNwdWZyZXEKKyAqIERJU0FMQkVfRlVSVEhFUl9DUFVGUkVROiBkaXNhYmxlIGZ1cnRoZXIgYWNjZXNzIHRvIHRhcmdldAorICogRU5BQkxFX0ZVUlRVRVJfQ1BVRlJFUTogZW5hYmxlIGFjY2VzcyB0byB0YXJnZXQKKyAqLworZW51bSBjcHVmcmVxX2FjY2VzcyB7CisJRElTQUJMRV9GVVJUSEVSX0NQVUZSRVEgPSAweDEwLAorCUVOQUJMRV9GVVJUSEVSX0NQVUZSRVEgPSAweDIwLAorfTsKKworc3RhdGljIGJvb2wgbm9fY3B1ZnJlcV9hY2Nlc3M7CisKKy8qCisgKiBEUkFNIGNvbmZpZ3VyYXRpb25zIHRvIGNhbGN1bGF0ZSByZWZyZXNoIGNvdW50ZXIgZm9yIGNoYW5naW5nCisgKiBmcmVxdWVuY3kgb2YgbWVtb3J5LgorICovCitzdHJ1Y3QgZHJhbV9jb25mIHsKKwl1bnNpZ25lZCBsb25nIGZyZXE7CS8qIEhaICovCisJdW5zaWduZWQgbG9uZyByZWZyZXNoOwkvKiBEUkFNIHJlZnJlc2ggY291bnRlciAqIDEwMDAgKi8KK307CisKKy8qIERSQU0gY29uZmlndXJhdGlvbiAoRE1DMCBhbmQgRE1DMSkgKi8KK3N0YXRpYyBzdHJ1Y3QgZHJhbV9jb25mIHM1cHYyMTBfZHJhbV9jb25mWzJdOworCitlbnVtIHBlcmZfbGV2ZWwgeworCUwwLCBMMSwgTDIsIEwzLCBMNCwKK307CisKK2VudW0gczVwdjIxMF9tZW1fdHlwZSB7CisJTFBERFIJPSAweDEsCisJTFBERFIyCT0gMHgyLAorCUREUjIJPSAweDQsCit9OworCitlbnVtIHM1cHYyMTBfZG1jX3BvcnQgeworCURNQzAgPSAwLAorCURNQzEsCit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIHM1cHYyMTBfZnJlcV90YWJsZVtdID0geworCXtMMCwgMTAwMCoxMDAwfSwKKwl7TDEsIDgwMCoxMDAwfSwKKwl7TDIsIDQwMCoxMDAwfSwKKwl7TDMsIDIwMCoxMDAwfSwKKwl7TDQsIDEwMCoxMDAwfSwKKwl7MCwgQ1BVRlJFUV9UQUJMRV9FTkR9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKmFybV9yZWd1bGF0b3I7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqaW50X3JlZ3VsYXRvcjsKKworc3RydWN0IHM1cHYyMTBfZHZzX2NvbmYgeworCWludCBhcm1fdm9sdDsJLyogdVYgKi8KKwlpbnQgaW50X3ZvbHQ7CS8qIHVWICovCit9OworCitzdGF0aWMgY29uc3QgaW50IGFybV92b2x0X21heCA9IDEzNTAwMDA7CitzdGF0aWMgY29uc3QgaW50IGludF92b2x0X21heCA9IDEyNTAwMDA7CisKK3N0YXRpYyBzdHJ1Y3QgczVwdjIxMF9kdnNfY29uZiBkdnNfY29uZltdID0geworCVtMMF0gPSB7CisJCS5hcm1fdm9sdAk9IDEyNTAwMDAsCisJCS5pbnRfdm9sdAk9IDExMDAwMDAsCisJfSwKKwlbTDFdID0geworCQkuYXJtX3ZvbHQJPSAxMjAwMDAwLAorCQkuaW50X3ZvbHQJPSAxMTAwMDAwLAorCX0sCisJW0wyXSA9IHsKKwkJLmFybV92b2x0CT0gMTA1MDAwMCwKKwkJLmludF92b2x0CT0gMTEwMDAwMCwKKwl9LAorCVtMM10gPSB7CisJCS5hcm1fdm9sdAk9IDk1MDAwMCwKKwkJLmludF92b2x0CT0gMTEwMDAwMCwKKwl9LAorCVtMNF0gPSB7CisJCS5hcm1fdm9sdAk9IDk1MDAwMCwKKwkJLmludF92b2x0CT0gMTAwMDAwMCwKKwl9LAorfTsKKworc3RhdGljIHUzMiBjbGtkaXZfdmFsWzVdWzExXSA9IHsKKwkvKgorCSAqIENsb2NrIGRpdmlkZXIgdmFsdWUgZm9yIGZvbGxvd2luZworCSAqIHsgQVBMTCwgQTJNLCBIQ0xLX01TWVMsIFBDTEtfTVNZUywKKwkgKiAgIEhDTEtfRFNZUywgUENMS19EU1lTLCBIQ0xLX1BTWVMsIFBDTEtfUFNZUywKKwkgKiAgIE9ORURSQU0sIE1GQywgRzNEIH0KKwkgKi8KKworCS8qIEwwIDogWzEwMDAvMjAwLzEwMF1bMTY2LzgzXVsxMzMvNjZdWzIwMC8yMDBdICovCisJezAsIDQsIDQsIDEsIDMsIDEsIDQsIDEsIDMsIDAsIDB9LAorCisJLyogTDEgOiBbODAwLzIwMC8xMDBdWzE2Ni84M11bMTMzLzY2XVsyMDAvMjAwXSAqLworCXswLCAzLCAzLCAxLCAzLCAxLCA0LCAxLCAzLCAwLCAwfSwKKworCS8qIEwyIDogWzQwMC8yMDAvMTAwXVsxNjYvODNdWzEzMy82Nl1bMjAwLzIwMF0gKi8KKwl7MSwgMywgMSwgMSwgMywgMSwgNCwgMSwgMywgMCwgMH0sCisKKwkvKiBMMyA6IFsyMDAvMjAwLzEwMF1bMTY2LzgzXVsxMzMvNjZdWzIwMC8yMDBdICovCisJezMsIDMsIDEsIDEsIDMsIDEsIDQsIDEsIDMsIDAsIDB9LAorCisJLyogTDQgOiBbMTAwLzEwMC8xMDBdWzgzLzgzXVs2Ni82Nl1bMTAwLzEwMF0gKi8KKwl7NywgNywgMCwgMCwgNywgMCwgOSwgMCwgNywgMCwgMH0sCit9OworCisvKgorICogVGhpcyBmdW5jdGlvbiBzZXQgRFJBTSByZWZyZXNoIGNvdW50ZXIKKyAqIGFjY29yaWRpbmcgdG8gb3BlcmF0aW5nIGZyZXF1ZW5jeSBvZiBEUkFNCisgKiBjaDogRE1DIHBvcnQgbnVtYmVyIDAgb3IgMQorICogZnJlcTogT3BlcmF0aW5nIGZyZXF1ZW5jeSBvZiBEUkFNKEtIeikKKyAqLworc3RhdGljIHZvaWQgczVwdjIxMF9zZXRfcmVmcmVzaChlbnVtIHM1cHYyMTBfZG1jX3BvcnQgY2gsIHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcCwgdG1wMTsKKwl2b2lkIF9faW9tZW0gKnJlZyA9IE5VTEw7CisKKwlpZiAoY2ggPT0gRE1DMCkgeworCQlyZWcgPSAoUzVQX1ZBX0RNQzAgKyAweDMwKTsKKwl9IGVsc2UgaWYgKGNoID09IERNQzEpIHsKKwkJcmVnID0gKFM1UF9WQV9ETUMxICsgMHgzMCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgZmluZCBETUMgcG9ydFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaW5kIGN1cnJlbnQgRFJBTSBmcmVxdWVuY3kgKi8KKwl0bXAgPSBzNXB2MjEwX2RyYW1fY29uZltjaF0uZnJlcTsKKworCWRvX2Rpdih0bXAsIGZyZXEpOworCisJdG1wMSA9IHM1cHYyMTBfZHJhbV9jb25mW2NoXS5yZWZyZXNoOworCisJZG9fZGl2KHRtcDEsIHRtcCk7CisKKwlfX3Jhd193cml0ZWwodG1wMSwgcmVnKTsKK30KKworc3RhdGljIGludCBzNXB2MjEwX3ZlcmlmeV9zcGVlZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlpZiAocG9saWN5LT5jcHUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIHM1cHYyMTBfZnJlcV90YWJsZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgczVwdjIxMF9nZXRzcGVlZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWlmIChjcHUpCisJCXJldHVybiAwOworCisJcmV0dXJuIGNsa19nZXRfcmF0ZShjcHVfY2xrKSAvIDEwMDA7Cit9CisKK3N0YXRpYyBpbnQgczVwdjIxMF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGxvbmcgcmVnOworCXVuc2lnbmVkIGludCBpbmRleCwgcHJpdl9pbmRleDsKKwl1bnNpZ25lZCBpbnQgcGxsX2NoYW5naW5nID0gMDsKKwl1bnNpZ25lZCBpbnQgYnVzX3NwZWVkX2NoYW5naW5nID0gMDsKKwlpbnQgYXJtX3ZvbHQsIGludF92b2x0OworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmc2V0X2ZyZXFfbG9jayk7CisKKwlpZiAocmVsYXRpb24gJiBFTkFCTEVfRlVSVEhFUl9DUFVGUkVRKQorCQlub19jcHVmcmVxX2FjY2VzcyA9IGZhbHNlOworCisJaWYgKG5vX2NwdWZyZXFfYWNjZXNzKSB7CisjaWZkZWYgQ09ORklHX1BNX1ZFUkJPU0UKKwkJcHJfZXJyKCIlczolZCBkZW5pZWQgYWNjZXNzIHRvICVzIGFzIGl0IGlzIGRpc2FibGVkIgorCQkJCSJ0ZW1wb3JhcmlseVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisjZW5kaWYKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmIChyZWxhdGlvbiAmIERJU0FCTEVfRlVSVEhFUl9DUFVGUkVRKQorCQlub19jcHVmcmVxX2FjY2VzcyA9IHRydWU7CisKKwlyZWxhdGlvbiAmPSB+KEVOQUJMRV9GVVJUSEVSX0NQVUZSRVEgfCBESVNBQkxFX0ZVUlRIRVJfQ1BVRlJFUSk7CisKKwlmcmVxcy5vbGQgPSBzNXB2MjEwX2dldHNwZWVkKDApOworCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIHM1cHYyMTBfZnJlcV90YWJsZSwKKwkJCQkJICAgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmaW5kZXgpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlmcmVxcy5uZXcgPSBzNXB2MjEwX2ZyZXFfdGFibGVbaW5kZXhdLmZyZXF1ZW5jeTsKKwlmcmVxcy5jcHUgPSAwOworCisJaWYgKGZyZXFzLm5ldyA9PSBmcmVxcy5vbGQpCisJCWdvdG8gZXhpdDsKKworCS8qIEZpbmRpbmcgY3VycmVudCBydW5uaW5nIGxldmVsIGluZGV4ICovCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIHM1cHYyMTBfZnJlcV90YWJsZSwKKwkJCQkJICAgZnJlcXMub2xkLCByZWxhdGlvbiwgJnByaXZfaW5kZXgpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlhcm1fdm9sdCA9IGR2c19jb25mW2luZGV4XS5hcm1fdm9sdDsKKwlpbnRfdm9sdCA9IGR2c19jb25mW2luZGV4XS5pbnRfdm9sdDsKKworCWlmIChmcmVxcy5uZXcgPiBmcmVxcy5vbGQpIHsKKwkJcmV0ID0gcmVndWxhdG9yX3NldF92b2x0YWdlKGFybV9yZWd1bGF0b3IsCisJCQkJYXJtX3ZvbHQsIGFybV92b2x0X21heCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGV4aXQ7CisKKwkJcmV0ID0gcmVndWxhdG9yX3NldF92b2x0YWdlKGludF9yZWd1bGF0b3IsCisJCQkJaW50X3ZvbHQsIGludF92b2x0X21heCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGV4aXQ7CisJfQorCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCS8qIENoZWNrIGlmIHRoZXJlIG5lZWQgdG8gY2hhbmdlIFBMTCAqLworCWlmICgoaW5kZXggPT0gTDApIHx8IChwcml2X2luZGV4ID09IEwwKSkKKwkJcGxsX2NoYW5naW5nID0gMTsKKworCS8qIENoZWNrIGlmIHRoZXJlIG5lZWQgdG8gY2hhbmdlIFN5c3RlbSBidXMgY2xvY2sgKi8KKwlpZiAoKGluZGV4ID09IEw0KSB8fCAocHJpdl9pbmRleCA9PSBMNCkpCisJCWJ1c19zcGVlZF9jaGFuZ2luZyA9IDE7CisKKwlpZiAoYnVzX3NwZWVkX2NoYW5naW5nKSB7CisJCS8qCisJCSAqIFJlY29uZmlndXJlIERSQU0gcmVmcmVzaCBjb3VudGVyIHZhbHVlIGZvciBtaW5pbXVtCisJCSAqIHRlbXBvcmFyeSBjbG9jayB3aGlsZSBjaGFuZ2luZyBkaXZpZGVyLgorCQkgKiBleHBlY3RlZCBjbG9jayBpcyA4M01oeiA6IDcuOHVzZWMvKDEvODNNaHopID0gMHgyODcKKwkJICovCisJCWlmIChwbGxfY2hhbmdpbmcpCisJCQlzNXB2MjEwX3NldF9yZWZyZXNoKERNQzEsIDgzMDAwKTsKKwkJZWxzZQorCQkJczVwdjIxMF9zZXRfcmVmcmVzaChETUMxLCAxMDAwMDApOworCisJCXM1cHYyMTBfc2V0X3JlZnJlc2goRE1DMCwgODMwMDApOworCX0KKworCS8qCisJICogQVBMTCBzaG91bGQgYmUgY2hhbmdlZCBpbiB0aGlzIGxldmVsCisJICogQVBMTCAtPiBNUExMKGZvciBzdGFibGUgdHJhbnNpdGlvbikgLT4gQVBMTAorCSAqIFNvbWUgY2xvY2sgc291cmNlJ3MgY2xvY2sgQVBJIGFyZSBub3QgcHJlcGFyZWQuCisJICogRG8gbm90IHVzZSBjbG9jayBBUEkgaW4gYmVsb3cgY29kZS4KKwkgKi8KKwlpZiAocGxsX2NoYW5naW5nKSB7CisJCS8qCisJCSAqIDEuIFRlbXBvcmFyeSBDaGFuZ2UgZGl2aWRlciBmb3IgTUZDIGFuZCBHM0QKKwkJICogU0NMS0EyTSgyMDAvMT0yMDApLT4oMjAwLzQ9NTApTWh6CisJCSAqLworCQlyZWcgPSBfX3Jhd19yZWFkbChTNVBfQ0xLX0RJVjIpOworCQlyZWcgJj0gfihTNVBfQ0xLRElWMl9HM0RfTUFTSyB8IFM1UF9DTEtESVYyX01GQ19NQVNLKTsKKwkJcmVnIHw9ICgzIDw8IFM1UF9DTEtESVYyX0czRF9TSElGVCkgfAorCQkJKDMgPDwgUzVQX0NMS0RJVjJfTUZDX1NISUZUKTsKKwkJX19yYXdfd3JpdGVsKHJlZywgUzVQX0NMS19ESVYyKTsKKworCQkvKiBGb3IgTUZDLCBHM0QgZGl2aWRpbmcgKi8KKwkJZG8geworCQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9TVEFUMCk7CisJCX0gd2hpbGUgKHJlZyAmICgoMSA8PCAxNikgfCAoMSA8PCAxNykpKTsKKworCQkvKgorCQkgKiAyLiBDaGFuZ2UgU0NMS0EyTSgyMDBNaHopdG8gU0NMS01QTEwgaW4gTUZDX01VWCwgRzNEIE1VWAorCQkgKiAoMjAwLzQ9NTApLT4oNjY3LzQ9MTY2KU1oegorCQkgKi8KKwkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS19TUkMyKTsKKwkJcmVnICY9IH4oUzVQX0NMS1NSQzJfRzNEX01BU0sgfCBTNVBfQ0xLU1JDMl9NRkNfTUFTSyk7CisJCXJlZyB8PSAoMSA8PCBTNVBfQ0xLU1JDMl9HM0RfU0hJRlQpIHwKKwkJCSgxIDw8IFM1UF9DTEtTUkMyX01GQ19TSElGVCk7CisJCV9fcmF3X3dyaXRlbChyZWcsIFM1UF9DTEtfU1JDMik7CisKKwkJZG8geworCQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS01VWF9TVEFUMSk7CisJCX0gd2hpbGUgKHJlZyAmICgoMSA8PCA3KSB8ICgxIDw8IDMpKSk7CisKKwkJLyoKKwkJICogMy4gRE1DMSByZWZyZXNoIGNvdW50IGZvciAxMzNNaHogaWYgKGluZGV4ID09IEw0KSBpcworCQkgKiB0cnVlIHJlZnJlc2ggY291bnRlciBpcyBhbHJlYWR5IHByb2dyYW1lZCBpbiB1cHBlcgorCQkgKiBjb2RlLiAweDI4N0A4M01oegorCQkgKi8KKwkJaWYgKCFidXNfc3BlZWRfY2hhbmdpbmcpCisJCQlzNXB2MjEwX3NldF9yZWZyZXNoKERNQzEsIDEzMzAwMCk7CisKKwkJLyogNC4gU0NMS0FQTEwgLT4gU0NMS01QTEwgKi8KKwkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS19TUkMwKTsKKwkJcmVnICY9IH4oUzVQX0NMS1NSQzBfTVVYMjAwX01BU0spOworCQlyZWcgfD0gKDB4MSA8PCBTNVBfQ0xLU1JDMF9NVVgyMDBfU0hJRlQpOworCQlfX3Jhd193cml0ZWwocmVnLCBTNVBfQ0xLX1NSQzApOworCisJCWRvIHsKKwkJCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtNVVhfU1RBVDApOworCQl9IHdoaWxlIChyZWcgJiAoMHgxIDw8IDE4KSk7CisKKwl9CisKKwkvKiBDaGFuZ2UgZGl2aWRlciAqLworCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtfRElWMCk7CisKKwlyZWcgJj0gfihTNVBfQ0xLRElWMF9BUExMX01BU0sgfCBTNVBfQ0xLRElWMF9BMk1fTUFTSyB8CisJCVM1UF9DTEtESVYwX0hDTEsyMDBfTUFTSyB8IFM1UF9DTEtESVYwX1BDTEsxMDBfTUFTSyB8CisJCVM1UF9DTEtESVYwX0hDTEsxNjZfTUFTSyB8IFM1UF9DTEtESVYwX1BDTEs4M19NQVNLIHwKKwkJUzVQX0NMS0RJVjBfSENMSzEzM19NQVNLIHwgUzVQX0NMS0RJVjBfUENMSzY2X01BU0spOworCisJcmVnIHw9ICgoY2xrZGl2X3ZhbFtpbmRleF1bMF0gPDwgUzVQX0NMS0RJVjBfQVBMTF9TSElGVCkgfAorCQkoY2xrZGl2X3ZhbFtpbmRleF1bMV0gPDwgUzVQX0NMS0RJVjBfQTJNX1NISUZUKSB8CisJCShjbGtkaXZfdmFsW2luZGV4XVsyXSA8PCBTNVBfQ0xLRElWMF9IQ0xLMjAwX1NISUZUKSB8CisJCShjbGtkaXZfdmFsW2luZGV4XVszXSA8PCBTNVBfQ0xLRElWMF9QQ0xLMTAwX1NISUZUKSB8CisJCShjbGtkaXZfdmFsW2luZGV4XVs0XSA8PCBTNVBfQ0xLRElWMF9IQ0xLMTY2X1NISUZUKSB8CisJCShjbGtkaXZfdmFsW2luZGV4XVs1XSA8PCBTNVBfQ0xLRElWMF9QQ0xLODNfU0hJRlQpIHwKKwkJKGNsa2Rpdl92YWxbaW5kZXhdWzZdIDw8IFM1UF9DTEtESVYwX0hDTEsxMzNfU0hJRlQpIHwKKwkJKGNsa2Rpdl92YWxbaW5kZXhdWzddIDw8IFM1UF9DTEtESVYwX1BDTEs2Nl9TSElGVCkpOworCisJX19yYXdfd3JpdGVsKHJlZywgUzVQX0NMS19ESVYwKTsKKworCWRvIHsKKwkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS0RJVl9TVEFUMCk7CisJfSB3aGlsZSAocmVnICYgMHhmZik7CisKKwkvKiBBUk0gTUNTIHZhbHVlIGNoYW5nZWQgKi8KKwlyZWcgPSBfX3Jhd19yZWFkbChTNVBfQVJNX01DU19DT04pOworCXJlZyAmPSB+MHgzOworCWlmIChpbmRleCA+PSBMMykKKwkJcmVnIHw9IDB4MzsKKwllbHNlCisJCXJlZyB8PSAweDE7CisKKwlfX3Jhd193cml0ZWwocmVnLCBTNVBfQVJNX01DU19DT04pOworCisJaWYgKHBsbF9jaGFuZ2luZykgeworCQkvKiA1LiBTZXQgTG9jayB0aW1lID0gMzB1cyoyNE1oeiA9IDB4MmNmICovCisJCV9fcmF3X3dyaXRlbCgweDJjZiwgUzVQX0FQTExfTE9DSyk7CisKKwkJLyoKKwkJICogNi4gVHVybiBvbiBBUExMCisJCSAqIDYtMS4gU2V0IFBNUyB2YWx1ZXMKKwkJICogNi0yLiBXYWl0IHVudGlsZSB0aGUgUExMIGlzIGxvY2tlZAorCQkgKi8KKwkJaWYgKGluZGV4ID09IEwwKQorCQkJX19yYXdfd3JpdGVsKEFQTExfVkFMXzEwMDAsIFM1UF9BUExMX0NPTik7CisJCWVsc2UKKwkJCV9fcmF3X3dyaXRlbChBUExMX1ZBTF84MDAsIFM1UF9BUExMX0NPTik7CisKKwkJZG8geworCQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0FQTExfQ09OKTsKKwkJfSB3aGlsZSAoIShyZWcgJiAoMHgxIDw8IDI5KSkpOworCisJCS8qCisJCSAqIDcuIENoYW5nZSBzb3VjZSBjbG9jayBmcm9tIFNDTEtNUExMKDY2N01oeikKKwkJICogdG8gU0NMS0EyTSgyMDBNaHopIGluIE1GQ19NVVggYW5kIEczRCBNVVgKKwkJICogKDY2Ny80PTE2NiktPigyMDAvND01MClNaHoKKwkJICovCisJCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtfU1JDMik7CisJCXJlZyAmPSB+KFM1UF9DTEtTUkMyX0czRF9NQVNLIHwgUzVQX0NMS1NSQzJfTUZDX01BU0spOworCQlyZWcgfD0gKDAgPDwgUzVQX0NMS1NSQzJfRzNEX1NISUZUKSB8CisJCQkoMCA8PCBTNVBfQ0xLU1JDMl9NRkNfU0hJRlQpOworCQlfX3Jhd193cml0ZWwocmVnLCBTNVBfQ0xLX1NSQzIpOworCisJCWRvIHsKKwkJCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtNVVhfU1RBVDEpOworCQl9IHdoaWxlIChyZWcgJiAoKDEgPDwgNykgfCAoMSA8PCAzKSkpOworCisJCS8qCisJCSAqIDguIENoYW5nZSBkaXZpZGVyIGZvciBNRkMgYW5kIEczRAorCQkgKiAoMjAwLzQ9NTApLT4oMjAwLzE9MjAwKU1oegorCQkgKi8KKwkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS19ESVYyKTsKKwkJcmVnICY9IH4oUzVQX0NMS0RJVjJfRzNEX01BU0sgfCBTNVBfQ0xLRElWMl9NRkNfTUFTSyk7CisJCXJlZyB8PSAoY2xrZGl2X3ZhbFtpbmRleF1bMTBdIDw8IFM1UF9DTEtESVYyX0czRF9TSElGVCkgfAorCQkJKGNsa2Rpdl92YWxbaW5kZXhdWzldIDw8IFM1UF9DTEtESVYyX01GQ19TSElGVCk7CisJCV9fcmF3X3dyaXRlbChyZWcsIFM1UF9DTEtfRElWMik7CisKKwkJLyogRm9yIE1GQywgRzNEIGRpdmlkaW5nICovCisJCWRvIHsKKwkJCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtESVZfU1RBVDApOworCQl9IHdoaWxlIChyZWcgJiAoKDEgPDwgMTYpIHwgKDEgPDwgMTcpKSk7CisKKwkJLyogOS4gQ2hhbmdlIE1QTEwgdG8gQVBMTCBpbiBNU1lTX01VWCAqLworCQlyZWcgPSBfX3Jhd19yZWFkbChTNVBfQ0xLX1NSQzApOworCQlyZWcgJj0gfihTNVBfQ0xLU1JDMF9NVVgyMDBfTUFTSyk7CisJCXJlZyB8PSAoMHgwIDw8IFM1UF9DTEtTUkMwX01VWDIwMF9TSElGVCk7CisJCV9fcmF3X3dyaXRlbChyZWcsIFM1UF9DTEtfU1JDMCk7CisKKwkJZG8geworCQkJcmVnID0gX19yYXdfcmVhZGwoUzVQX0NMS01VWF9TVEFUMCk7CisJCX0gd2hpbGUgKHJlZyAmICgweDEgPDwgMTgpKTsKKworCQkvKgorCQkgKiAxMC4gRE1DMSByZWZyZXNoIGNvdW50ZXIKKwkJICogTDQgOiBETUMxID0gMTAwTWh6IDcuOHVzLygxLzEwMCkgPSAweDMwYworCQkgKiBPdGhlcnMgOiBETUMxID0gMjAwTWh6IDcuOHVzLygxLzIwMCkgPSAweDYxOAorCQkgKi8KKwkJaWYgKCFidXNfc3BlZWRfY2hhbmdpbmcpCisJCQlzNXB2MjEwX3NldF9yZWZyZXNoKERNQzEsIDIwMDAwMCk7CisJfQorCisJLyoKKwkgKiBMNCBsZXZlbCBuZWVkIHRvIGNoYW5nZSBtZW1vcnkgYnVzIHNwZWVkLCBoZW5jZSBvbmVkcmFtIGNsb2NrIGRpdmllcgorCSAqIGFuZCBtZW1vcnkgcmVmcmVzaCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGNoYW5nZWQKKwkgKi8KKwlpZiAoYnVzX3NwZWVkX2NoYW5naW5nKSB7CisJCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtfRElWNik7CisJCXJlZyAmPSB+UzVQX0NMS0RJVjZfT05FRFJBTV9NQVNLOworCQlyZWcgfD0gKGNsa2Rpdl92YWxbaW5kZXhdWzhdIDw8IFM1UF9DTEtESVY2X09ORURSQU1fU0hJRlQpOworCQlfX3Jhd193cml0ZWwocmVnLCBTNVBfQ0xLX0RJVjYpOworCisJCWRvIHsKKwkJCXJlZyA9IF9fcmF3X3JlYWRsKFM1UF9DTEtESVZfU1RBVDEpOworCQl9IHdoaWxlIChyZWcgJiAoMSA8PCAxNSkpOworCisJCS8qIFJlY29uZmlndXJlIERSQU0gcmVmcmVzaCBjb3VudGVyIHZhbHVlICovCisJCWlmIChpbmRleCAhPSBMNCkgeworCQkJLyoKKwkJCSAqIERNQzAgOiAxNjZNaHoKKwkJCSAqIERNQzEgOiAyMDBNaHoKKwkJCSAqLworCQkJczVwdjIxMF9zZXRfcmVmcmVzaChETUMwLCAxNjYwMDApOworCQkJczVwdjIxMF9zZXRfcmVmcmVzaChETUMxLCAyMDAwMDApOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIERNQzAgOiA4M01oegorCQkJICogRE1DMSA6IDEwME1oegorCQkJICovCisJCQlzNXB2MjEwX3NldF9yZWZyZXNoKERNQzAsIDgzMDAwKTsKKwkJCXM1cHYyMTBfc2V0X3JlZnJlc2goRE1DMSwgMTAwMDAwKTsKKwkJfQorCX0KKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJaWYgKGZyZXFzLm5ldyA8IGZyZXFzLm9sZCkgeworCQlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UoaW50X3JlZ3VsYXRvciwKKwkJCQlpbnRfdm9sdCwgaW50X3ZvbHRfbWF4KTsKKworCQlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UoYXJtX3JlZ3VsYXRvciwKKwkJCQlhcm1fdm9sdCwgYXJtX3ZvbHRfbWF4KTsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiUGVyZiBjaGFuZ2VkW0wlZF1cbiIsIGluZGV4KTsKKworZXhpdDoKKwltdXRleF91bmxvY2soJnNldF9mcmVxX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgczVwdjIxMF9jcHVmcmVxX3N1c3BlbmQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVwdjIxMF9jcHVmcmVxX3Jlc3VtZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGNoZWNrX21lbV90eXBlKHZvaWQgX19pb21lbSAqZG1jX3JlZykKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKGRtY19yZWcgKyAweDQpOworCXZhbCA9ICh2YWwgJiAoMHhmIDw8IDgpKTsKKworCXJldHVybiB2YWwgPj4gODsKK30KKworc3RhdGljIGludCBfX2luaXQgczVwdjIxMF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwl1bnNpZ25lZCBsb25nIG1lbV90eXBlOworCWludCByZXQ7CisKKwljcHVfY2xrID0gY2xrX2dldChOVUxMLCAiYXJtY2xrIik7CisJaWYgKElTX0VSUihjcHVfY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3B1X2Nsayk7CisKKwlkbWMwX2NsayA9IGNsa19nZXQoTlVMTCwgInNjbGtfZG1jMCIpOworCWlmIChJU19FUlIoZG1jMF9jbGspKSB7CisJCXJldCA9IFBUUl9FUlIoZG1jMF9jbGspOworCQlnb3RvIG91dF9kbWMwOworCX0KKworCWRtYzFfY2xrID0gY2xrX2dldChOVUxMLCAiaGNsa19tc3lzIik7CisJaWYgKElTX0VSUihkbWMxX2NsaykpIHsKKwkJcmV0ID0gUFRSX0VSUihkbWMxX2Nsayk7CisJCWdvdG8gb3V0X2RtYzE7CisJfQorCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZG1jMTsKKwl9CisKKwkvKgorCSAqIGNoZWNrX21lbV90eXBlIDogVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0IExQRERSICYgTFBERFIyLgorCSAqIG90aGVyIG1lbW9yeSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuCisJICovCisJbWVtX3R5cGUgPSBjaGVja19tZW1fdHlwZShTNVBfVkFfRE1DMCk7CisKKwlpZiAoKG1lbV90eXBlICE9IExQRERSKSAmJiAobWVtX3R5cGUgIT0gTFBERFIyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNQVUZyZXEgZG9lc24ndCBzdXBwb3J0IHRoaXMgbWVtb3J5IHR5cGVcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9kbWMxOworCX0KKworCS8qIEZpbmQgY3VycmVudCByZWZyZXNoIGNvdW50ZXIgYW5kIGZyZXF1ZW5jeSBlYWNoIERNQyAqLworCXM1cHYyMTBfZHJhbV9jb25mWzBdLnJlZnJlc2ggPSAoX19yYXdfcmVhZGwoUzVQX1ZBX0RNQzAgKyAweDMwKSAqIDEwMDApOworCXM1cHYyMTBfZHJhbV9jb25mWzBdLmZyZXEgPSBjbGtfZ2V0X3JhdGUoZG1jMF9jbGspOworCisJczVwdjIxMF9kcmFtX2NvbmZbMV0ucmVmcmVzaCA9IChfX3Jhd19yZWFkbChTNVBfVkFfRE1DMSArIDB4MzApICogMTAwMCk7CisJczVwdjIxMF9kcmFtX2NvbmZbMV0uZnJlcSA9IGNsa19nZXRfcmF0ZShkbWMxX2Nsayk7CisKKwlwb2xpY3ktPmN1ciA9IHBvbGljeS0+bWluID0gcG9saWN5LT5tYXggPSBzNXB2MjEwX2dldHNwZWVkKDApOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoczVwdjIxMF9mcmVxX3RhYmxlLCBwb2xpY3ktPmNwdSk7CisKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gNDAwMDA7CisKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIHM1cHYyMTBfZnJlcV90YWJsZSk7CisKK291dF9kbWMxOgorCWNsa19wdXQoZG1jMF9jbGspOworb3V0X2RtYzA6CisJY2xrX3B1dChjcHVfY2xrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHM1cHYyMTBfY3B1ZnJlcV9ub3RpZmllcl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBQTV9TVVNQRU5EX1BSRVBBUkU6CisJCXJldCA9IGNwdWZyZXFfZHJpdmVyX3RhcmdldChjcHVmcmVxX2NwdV9nZXQoMCksIFNMRUVQX0ZSRVEsCisJCQkJCSAgICBESVNBQkxFX0ZVUlRIRVJfQ1BVRlJFUSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisKKwkJcmV0dXJuIE5PVElGWV9PSzsKKwljYXNlIFBNX1BPU1RfUkVTVE9SRToKKwljYXNlIFBNX1BPU1RfU1VTUEVORDoKKwkJY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KGNwdWZyZXFfY3B1X2dldCgwKSwgU0xFRVBfRlJFUSwKKwkJCQkgICAgICBFTkFCTEVfRlVSVEhFUl9DUFVGUkVRKTsKKworCQlyZXR1cm4gTk9USUZZX09LOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIGludCBzNXB2MjEwX2NwdWZyZXFfcmVib290X25vdGlmaWVyX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJCQkJCSB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJaW50IHJldDsKKworCXJldCA9IGNwdWZyZXFfZHJpdmVyX3RhcmdldChjcHVmcmVxX2NwdV9nZXQoMCksIFNMRUVQX0ZSRVEsCisJCQkJICAgIERJU0FCTEVfRlVSVEhFUl9DUFVGUkVRKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIE5PVElGWV9CQUQ7CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgczVwdjIxMF9kcml2ZXIgPSB7CisJLmZsYWdzCQk9IENQVUZSRVFfU1RJQ0tZLAorCS52ZXJpZnkJCT0gczVwdjIxMF92ZXJpZnlfc3BlZWQsCisJLnRhcmdldAkJPSBzNXB2MjEwX3RhcmdldCwKKwkuZ2V0CQk9IHM1cHYyMTBfZ2V0c3BlZWQsCisJLmluaXQJCT0gczVwdjIxMF9jcHVfaW5pdCwKKwkubmFtZQkJPSAiczVwdjIxMCIsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBzNXB2MjEwX2NwdWZyZXFfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHM1cHYyMTBfY3B1ZnJlcV9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgczVwdjIxMF9jcHVmcmVxX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gczVwdjIxMF9jcHVmcmVxX25vdGlmaWVyX2V2ZW50LAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzNXB2MjEwX2NwdWZyZXFfcmVib290X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gczVwdjIxMF9jcHVmcmVxX3JlYm9vdF9ub3RpZmllcl9ldmVudCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHM1cHYyMTBfY3B1ZnJlcV9pbml0KHZvaWQpCit7CisJYXJtX3JlZ3VsYXRvciA9IHJlZ3VsYXRvcl9nZXQoTlVMTCwgInZkZGFybSIpOworCWlmIChJU19FUlIoYXJtX3JlZ3VsYXRvcikpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gZ2V0IHJlZ3VsYXRvciB2ZGRhcm0iKTsKKwkJcmV0dXJuIFBUUl9FUlIoYXJtX3JlZ3VsYXRvcik7CisJfQorCisJaW50X3JlZ3VsYXRvciA9IHJlZ3VsYXRvcl9nZXQoTlVMTCwgInZkZGludCIpOworCWlmIChJU19FUlIoaW50X3JlZ3VsYXRvcikpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gZ2V0IHJlZ3VsYXRvciB2ZGRpbnQiKTsKKwkJcmVndWxhdG9yX3B1dChhcm1fcmVndWxhdG9yKTsKKwkJcmV0dXJuIFBUUl9FUlIoaW50X3JlZ3VsYXRvcik7CisJfQorCisJcmVnaXN0ZXJfcG1fbm90aWZpZXIoJnM1cHYyMTBfY3B1ZnJlcV9ub3RpZmllcik7CisJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzNXB2MjEwX2NwdWZyZXFfcmVib290X25vdGlmaWVyKTsKKworCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmczVwdjIxMF9kcml2ZXIpOworfQorCitsYXRlX2luaXRjYWxsKHM1cHYyMTBfY3B1ZnJlcV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2FtY2MvY3J5cHRvNHh4X2NvcmUuYyBiL2RyaXZlcnMvY3J5cHRvL2FtY2MvY3J5cHRvNHh4X2NvcmUuYwppbmRleCAxODkxMjUyLi4xZDEwM2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9hbWNjL2NyeXB0bzR4eF9jb3JlLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vYW1jYy9jcnlwdG80eHhfY29yZS5jCkBAIC01MSw2ICs1MSw3IEBACiAJdW5pb24gY2VfaW9fdGhyZXNob2xkIGlvX3RocmVzaG9sZDsKIAl1MzIgcmFuZF9udW07CiAJdW5pb24gY2VfcGVfZG1hX2NmZyBwZV9kbWFfY2ZnOworCXUzMiBkZXZpY2VfY3RybDsKIAogCXdyaXRlbChQUEM0WFhfQllURV9PUkRFUiwgZGV2LT5jZV9iYXNlICsgQ1JZUFRPNFhYX0JZVEVfT1JERVJfQ0ZHKTsKIAkvKiBzZXR1cCBwZSBkbWEsIGluY2x1ZGUgcmVzZXQgc2csIHBkciBhbmQgcGUsIHRoZW4gcmVsZWFzZSByZXNldCAqLwpAQCAtODQsNyArODUsOSBAQAogCXdyaXRlbChyaW5nX3NpemUudywgZGV2LT5jZV9iYXNlICsgQ1JZUFRPNFhYX1JJTkdfU0laRSk7CiAJcmluZ19jdHJsLncgPSAwOwogCXdyaXRlbChyaW5nX2N0cmwudywgZGV2LT5jZV9iYXNlICsgQ1JZUFRPNFhYX1JJTkdfQ1RSTCk7Ci0Jd3JpdGVsKFBQQzRYWF9EQ18zREVTX0VOLCBkZXYtPmNlX2Jhc2UgKyBDUllQVE80WFhfREVWSUNFX0NUUkwpOworCWRldmljZV9jdHJsID0gcmVhZGwoZGV2LT5jZV9iYXNlICsgQ1JZUFRPNFhYX0RFVklDRV9DVFJMKTsKKwlkZXZpY2VfY3RybCB8PSBQUEM0WFhfRENfM0RFU19FTjsKKwl3cml0ZWwoZGV2aWNlX2N0cmwsIGRldi0+Y2VfYmFzZSArIENSWVBUTzRYWF9ERVZJQ0VfQ1RSTCk7CiAJd3JpdGVsKGRldi0+Z2RyX3BhLCBkZXYtPmNlX2Jhc2UgKyBDUllQVE80WFhfR0FUSF9SSU5HX0JBU0UpOwogCXdyaXRlbChkZXYtPnNkcl9wYSwgZGV2LT5jZV9iYXNlICsgQ1JZUFRPNFhYX1NDQVRfUklOR19CQVNFKTsKIAlwYXJ0X3Jpbmdfc2l6ZS53ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NhYW0vY2FhbWFsZy5jIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKaW5kZXggZDBlNjVkNi4uNDE1OTI2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKQEAgLTYyLDEwICs2MiwyMiBAQAogI2RlZmluZSBDQUFNX01BWF9JVl9MRU5HVEgJCTE2CiAKIC8qIGxlbmd0aCBvZiBkZXNjcmlwdG9ycyB0ZXh0ICovCi0jZGVmaW5lIERFU0NfQUVBRF9TSEFSRURfVEVYVF9MRU4JNAotI2RlZmluZSBERVNDX0FFQURfRU5DUllQVF9URVhUX0xFTiAJMjEKLSNkZWZpbmUgREVTQ19BRUFEX0RFQ1JZUFRfVEVYVF9MRU4gCTI0Ci0jZGVmaW5lIERFU0NfQUVBRF9HSVZFTkNSWVBUX1RFWFRfTEVOIAkyNworI2RlZmluZSBERVNDX0pPQl9JT19MRU4JCQkoQ0FBTV9DTURfU1ogKiAzICsgQ0FBTV9QVFJfU1ogKiAzKQorCisjZGVmaW5lIERFU0NfQUVBRF9CQVNFCQkJKDQgKiBDQUFNX0NNRF9TWikKKyNkZWZpbmUgREVTQ19BRUFEX0VOQ19MRU4JCShERVNDX0FFQURfQkFTRSArIDE2ICogQ0FBTV9DTURfU1opCisjZGVmaW5lIERFU0NfQUVBRF9ERUNfTEVOCQkoREVTQ19BRUFEX0JBU0UgKyAyMSAqIENBQU1fQ01EX1NaKQorI2RlZmluZSBERVNDX0FFQURfR0lWRU5DX0xFTgkJKERFU0NfQUVBRF9FTkNfTEVOICsgNyAqIENBQU1fQ01EX1NaKQorCisjZGVmaW5lIERFU0NfQUJMS0NJUEhFUl9CQVNFCQkoMyAqIENBQU1fQ01EX1NaKQorI2RlZmluZSBERVNDX0FCTEtDSVBIRVJfRU5DX0xFTgkJKERFU0NfQUJMS0NJUEhFUl9CQVNFICsgXAorCQkJCQkgMjAgKiBDQUFNX0NNRF9TWikKKyNkZWZpbmUgREVTQ19BQkxLQ0lQSEVSX0RFQ19MRU4JCShERVNDX0FCTEtDSVBIRVJfQkFTRSArIFwKKwkJCQkJIDE1ICogQ0FBTV9DTURfU1opCisKKyNkZWZpbmUgREVTQ19NQVhfVVNFRF9CWVRFUwkJKERFU0NfQUVBRF9HSVZFTkNfTEVOICsgXAorCQkJCQkgQ0FBTV9NQVhfS0VZX1NJWkUpCisjZGVmaW5lIERFU0NfTUFYX1VTRURfTEVOCQkoREVTQ19NQVhfVVNFRF9CWVRFUyAvIENBQU1fQ01EX1NaKQogCiAjaWZkZWYgREVCVUcKIC8qIGZvciBwcmludF9oZXhfZHVtcHMgd2l0aCBsaW5lIHJlZmVyZW5jZXMgKi8KQEAgLTc2LDMwICs4OCwzNjYgQEAKICNkZWZpbmUgZGVidWcoZm9ybWF0LCBhcmcuLi4pCiAjZW5kaWYKIAorLyogU2V0IERLIGJpdCBpbiBjbGFzcyAxIG9wZXJhdGlvbiBpZiBzaGFyZWQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcHBlbmRfZGVjX29wMSh1MzIgKmRlc2MsIHUzMiB0eXBlKQoreworCXUzMiAqanVtcF9jbWQsICp1bmNvbmRfanVtcF9jbWQ7CisKKwlqdW1wX2NtZCA9IGFwcGVuZF9qdW1wKGRlc2MsIEpVTVBfVEVTVF9BTEwgfCBKVU1QX0NPTkRfU0hSRCk7CisJYXBwZW5kX29wZXJhdGlvbihkZXNjLCB0eXBlIHwgT1BfQUxHX0FTX0lOSVRGSU5BTCB8CisJCQkgT1BfQUxHX0RFQ1JZUFQpOworCXVuY29uZF9qdW1wX2NtZCA9IGFwcGVuZF9qdW1wKGRlc2MsIEpVTVBfVEVTVF9BTEwpOworCXNldF9qdW1wX3RndF9oZXJlKGRlc2MsIGp1bXBfY21kKTsKKwlhcHBlbmRfb3BlcmF0aW9uKGRlc2MsIHR5cGUgfCBPUF9BTEdfQVNfSU5JVEZJTkFMIHwKKwkJCSBPUF9BTEdfREVDUllQVCB8IE9QX0FMR19BQUlfREspOworCXNldF9qdW1wX3RndF9oZXJlKGRlc2MsIHVuY29uZF9qdW1wX2NtZCk7Cit9CisKKy8qCisgKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIGNsYXNzIDEga2V5IGxvYWRpbmcgYmVmb3JlIGFsbG93aW5nCisgKiBlcnJvciBwcm9wYWdhdGlvbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX2RlY19zaHJfZG9uZSh1MzIgKmRlc2MpCit7CisJdTMyICpqdW1wX2NtZDsKKworCWp1bXBfY21kID0gYXBwZW5kX2p1bXAoZGVzYywgSlVNUF9DTEFTU19DTEFTUzEgfCBKVU1QX1RFU1RfQUxMKTsKKwlzZXRfanVtcF90Z3RfaGVyZShkZXNjLCBqdW1wX2NtZCk7CisJYXBwZW5kX2NtZChkZXNjLCBTRVRfT0tfUFJPUF9FUlJPUlMgfCBDTURfTE9BRCk7Cit9CisKKy8qCisgKiBGb3IgYWVhZCBmdW5jdGlvbnMsIHJlYWQgcGF5bG9hZCBhbmQgd3JpdGUgcGF5bG9hZCwKKyAqIGJvdGggb2Ygd2hpY2ggYXJlIHNwZWNpZmllZCBpbiByZXEtPnNyYyBhbmQgcmVxLT5kc3QKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFlYWRfYXBwZW5kX3NyY19kc3QodTMyICpkZXNjLCB1MzIgbXNnX3R5cGUpCit7CisJYXBwZW5kX3NlcV9maWZvX2xvYWQoZGVzYywgMCwgRklGT0xEX0NMQVNTX0JPVEggfAorCQkJICAgICBLRVlfVkxGIHwgbXNnX3R5cGUgfCBGSUZPTERfVFlQRV9MQVNUQk9USCk7CisJYXBwZW5kX3NlcV9maWZvX3N0b3JlKGRlc2MsIDAsIEZJRk9TVF9UWVBFX01FU1NBR0VfREFUQSB8IEtFWV9WTEYpOworfQorCisvKgorICogRm9yIGFlYWQgZW5jcnlwdCBhbmQgZGVjcnlwdCwgcmVhZCBpdiBmb3IgYm90aCBjbGFzc2VzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZWFkX2FwcGVuZF9sZF9pdih1MzIgKmRlc2MsIGludCBpdnNpemUpCit7CisJYXBwZW5kX2NtZChkZXNjLCBDTURfU0VRX0xPQUQgfCBMRFNUX1NSQ0RTVF9CWVRFX0NPTlRFWFQgfAorCQkgICBMRFNUX0NMQVNTXzFfQ0NCIHwgaXZzaXplKTsKKwlhcHBlbmRfbW92ZShkZXNjLCBNT1ZFX1NSQ19DTEFTUzFDVFggfCBNT1ZFX0RFU1RfQ0xBU1MySU5GSUZPIHwgaXZzaXplKTsKK30KKworLyoKKyAqIEZvciBhYmxrY2lwaGVyIGVuY3J5cHQgYW5kIGRlY3J5cHQsIHJlYWQgZnJvbSByZXEtPnNyYyBhbmQKKyAqIHdyaXRlIHRvIHJlcS0+ZHN0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhYmxrY2lwaGVyX2FwcGVuZF9zcmNfZHN0KHUzMiAqZGVzYykKK3sKKwlhcHBlbmRfbWF0aF9hZGQoZGVzYywgVkFSU0VRT1VUTEVOLCBTRVFJTkxFTiwgUkVHMCwgQ0FBTV9DTURfU1opOyBcCisJYXBwZW5kX21hdGhfYWRkKGRlc2MsIFZBUlNFUUlOTEVOLCBTRVFJTkxFTiwgUkVHMCwgQ0FBTV9DTURfU1opOyBcCisJYXBwZW5kX3NlcV9maWZvX2xvYWQoZGVzYywgMCwgRklGT0xEX0NMQVNTX0NMQVNTMSB8IFwKKwkJCSAgICAgS0VZX1ZMRiB8IEZJRk9MRF9UWVBFX01TRyB8IEZJRk9MRF9UWVBFX0xBU1QxKTsgXAorCWFwcGVuZF9zZXFfZmlmb19zdG9yZShkZXNjLCAwLCBGSUZPU1RfVFlQRV9NRVNTQUdFX0RBVEEgfCBLRVlfVkxGKTsgXAorfQorCisvKgorICogSWYgYWxsIGRhdGEsIGluY2x1ZGluZyBzcmMgKHdpdGggYXNzb2MgYW5kIGl2KSBvciBkc3QgKHdpdGggaXYgb25seSkgYXJlCisgKiBjb250aWd1b3VzCisgKi8KKyNkZWZpbmUgR0lWX1NSQ19DT05USUcJCTEKKyNkZWZpbmUgR0lWX0RTVF9DT05USUcJCSgxIDw8IDEpCisKIC8qCiAgKiBwZXItc2Vzc2lvbiBjb250ZXh0CiAgKi8KIHN0cnVjdCBjYWFtX2N0eCB7CiAJc3RydWN0IGRldmljZSAqanJkZXY7Ci0JdTMyICpzaF9kZXNjOwotCWRtYV9hZGRyX3Qgc2hhcmVkX2Rlc2NfcGh5czsKKwl1MzIgc2hfZGVzY19lbmNbREVTQ19NQVhfVVNFRF9MRU5dOworCXUzMiBzaF9kZXNjX2RlY1tERVNDX01BWF9VU0VEX0xFTl07CisJdTMyIHNoX2Rlc2NfZ2l2ZW5jW0RFU0NfTUFYX1VTRURfTEVOXTsKKwlkbWFfYWRkcl90IHNoX2Rlc2NfZW5jX2RtYTsKKwlkbWFfYWRkcl90IHNoX2Rlc2NfZGVjX2RtYTsKKwlkbWFfYWRkcl90IHNoX2Rlc2NfZ2l2ZW5jX2RtYTsKIAl1MzIgY2xhc3MxX2FsZ190eXBlOwogCXUzMiBjbGFzczJfYWxnX3R5cGU7CiAJdTMyIGFsZ19vcDsKLQl1OCAqa2V5OwotCWRtYV9hZGRyX3Qga2V5X3BoeXM7CisJdTgga2V5W0NBQU1fTUFYX0tFWV9TSVpFXTsKKwlkbWFfYWRkcl90IGtleV9kbWE7CiAJdW5zaWduZWQgaW50IGVuY2tleWxlbjsKIAl1bnNpZ25lZCBpbnQgc3BsaXRfa2V5X2xlbjsKIAl1bnNpZ25lZCBpbnQgc3BsaXRfa2V5X3BhZF9sZW47CiAJdW5zaWduZWQgaW50IGF1dGhzaXplOwogfTsKIAotc3RhdGljIGludCBhZWFkX2F1dGhlbmNfc2V0YXV0aHNpemUoc3RydWN0IGNyeXB0b19hZWFkICphdXRoZW5jLAorc3RhdGljIHZvaWQgYXBwZW5kX2tleV9hZWFkKHUzMiAqZGVzYywgc3RydWN0IGNhYW1fY3R4ICpjdHgsCisJCQkgICAgaW50IGtleXNfZml0X2lubGluZSkKK3sKKwlpZiAoa2V5c19maXRfaW5saW5lKSB7CisJCWFwcGVuZF9rZXlfYXNfaW1tKGRlc2MsIGN0eC0+a2V5LCBjdHgtPnNwbGl0X2tleV9wYWRfbGVuLAorCQkJCSAgY3R4LT5zcGxpdF9rZXlfbGVuLCBDTEFTU18yIHwKKwkJCQkgIEtFWV9ERVNUX01ESEFfU1BMSVQgfCBLRVlfRU5DKTsKKwkJYXBwZW5kX2tleV9hc19pbW0oZGVzYywgKHZvaWQgKiljdHgtPmtleSArCisJCQkJICBjdHgtPnNwbGl0X2tleV9wYWRfbGVuLCBjdHgtPmVuY2tleWxlbiwKKwkJCQkgIGN0eC0+ZW5ja2V5bGVuLCBDTEFTU18xIHwgS0VZX0RFU1RfQ0xBU1NfUkVHKTsKKwl9IGVsc2UgeworCQlhcHBlbmRfa2V5KGRlc2MsIGN0eC0+a2V5X2RtYSwgY3R4LT5zcGxpdF9rZXlfbGVuLCBDTEFTU18yIHwKKwkJCSAgIEtFWV9ERVNUX01ESEFfU1BMSVQgfCBLRVlfRU5DKTsKKwkJYXBwZW5kX2tleShkZXNjLCBjdHgtPmtleV9kbWEgKyBjdHgtPnNwbGl0X2tleV9wYWRfbGVuLAorCQkJICAgY3R4LT5lbmNrZXlsZW4sIENMQVNTXzEgfCBLRVlfREVTVF9DTEFTU19SRUcpOworCX0KK30KKworc3RhdGljIHZvaWQgaW5pdF9zaF9kZXNjX2tleV9hZWFkKHUzMiAqZGVzYywgc3RydWN0IGNhYW1fY3R4ICpjdHgsCisJCQkJICBpbnQga2V5c19maXRfaW5saW5lKQoreworCXUzMiAqa2V5X2p1bXBfY21kOworCisJaW5pdF9zaF9kZXNjKGRlc2MsIEhEUl9TSEFSRV9XQUlUKTsKKworCS8qIFNraXAgaWYgYWxyZWFkeSBzaGFyZWQgKi8KKwlrZXlfanVtcF9jbWQgPSBhcHBlbmRfanVtcChkZXNjLCBKVU1QX0pTTCB8IEpVTVBfVEVTVF9BTEwgfAorCQkJCSAgIEpVTVBfQ09ORF9TSFJEKTsKKworCWFwcGVuZF9rZXlfYWVhZChkZXNjLCBjdHgsIGtleXNfZml0X2lubGluZSk7CisKKwlzZXRfanVtcF90Z3RfaGVyZShkZXNjLCBrZXlfanVtcF9jbWQpOworCisJLyogUHJvcGFnYXRlIGVycm9ycyBmcm9tIHNoYXJlZCB0byBqb2IgZGVzY3JpcHRvciAqLworCWFwcGVuZF9jbWQoZGVzYywgU0VUX09LX1BST1BfRVJST1JTIHwgQ01EX0xPQUQpOworfQorCitzdGF0aWMgaW50IGFlYWRfc2V0X3NoX2Rlc2Moc3RydWN0IGNyeXB0b19hZWFkICphZWFkKQoreworCXN0cnVjdCBhZWFkX3RmbSAqdGZtID0gJmFlYWQtPmJhc2UuY3J0X2FlYWQ7CisJc3RydWN0IGNhYW1fY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoYWVhZCk7CisJc3RydWN0IGRldmljZSAqanJkZXYgPSBjdHgtPmpyZGV2OworCWJvb2wga2V5c19maXRfaW5saW5lID0gMDsKKwl1MzIgKmtleV9qdW1wX2NtZCwgKmp1bXBfY21kOworCXUzMiBnZW5pdiwgbW92ZWl2OworCXUzMiAqZGVzYzsKKworCWlmICghY3R4LT5lbmNrZXlsZW4gfHwgIWN0eC0+YXV0aHNpemUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBKb2IgRGVzY3JpcHRvciBhbmQgU2hhcmVkIERlc2NyaXB0b3JzCisJICogbXVzdCBhbGwgZml0IGludG8gdGhlIDY0LXdvcmQgRGVzY3JpcHRvciBoL3cgQnVmZmVyCisJICovCisJaWYgKERFU0NfQUVBRF9FTkNfTEVOICsgREVTQ19KT0JfSU9fTEVOICsKKwkgICAgY3R4LT5zcGxpdF9rZXlfcGFkX2xlbiArIGN0eC0+ZW5ja2V5bGVuIDw9CisJICAgIENBQU1fREVTQ19CWVRFU19NQVgpCisJCWtleXNfZml0X2lubGluZSA9IDE7CisKKwkvKiBhZWFkX2VuY3J5cHQgc2hhcmVkIGRlc2NyaXB0b3IgKi8KKwlkZXNjID0gY3R4LT5zaF9kZXNjX2VuYzsKKworCWluaXRfc2hfZGVzY19rZXlfYWVhZChkZXNjLCBjdHgsIGtleXNfZml0X2lubGluZSk7CisKKwkvKiBDbGFzcyAyIG9wZXJhdGlvbiAqLworCWFwcGVuZF9vcGVyYXRpb24oZGVzYywgY3R4LT5jbGFzczJfYWxnX3R5cGUgfAorCQkJIE9QX0FMR19BU19JTklURklOQUwgfCBPUF9BTEdfRU5DUllQVCk7CisKKwkvKiBjcnlwdGxlbiA9IHNlcW91dGxlbiAtIGF1dGhzaXplICovCisJYXBwZW5kX21hdGhfc3ViX2ltbV91MzIoZGVzYywgUkVHMywgU0VRT1VUTEVOLCBJTU0sIGN0eC0+YXV0aHNpemUpOworCisJLyogYXNzb2NsZW4gKyBjcnlwdGxlbiA9IHNlcWlubGVuIC0gaXZzaXplICovCisJYXBwZW5kX21hdGhfc3ViX2ltbV91MzIoZGVzYywgUkVHMiwgU0VRSU5MRU4sIElNTSwgdGZtLT5pdnNpemUpOworCisJLyogYXNzb2NsZW4gKyBjcnlwdGxlbiA9IChhc3NvY2xlbiArIGNyeXB0bGVuKSAtIGNyeXB0bGVuICovCisJYXBwZW5kX21hdGhfc3ViKGRlc2MsIFZBUlNFUUlOTEVOLCBSRUcyLCBSRUczLCBDQUFNX0NNRF9TWik7CisKKwkvKiByZWFkIGFzc29jIGJlZm9yZSByZWFkaW5nIHBheWxvYWQgKi8KKwlhcHBlbmRfc2VxX2ZpZm9fbG9hZChkZXNjLCAwLCBGSUZPTERfQ0xBU1NfQ0xBU1MyIHwgRklGT0xEX1RZUEVfTVNHIHwKKwkJCSAgICAgS0VZX1ZMRik7CisJYWVhZF9hcHBlbmRfbGRfaXYoZGVzYywgdGZtLT5pdnNpemUpOworCisJLyogQ2xhc3MgMSBvcGVyYXRpb24gKi8KKwlhcHBlbmRfb3BlcmF0aW9uKGRlc2MsIGN0eC0+Y2xhc3MxX2FsZ190eXBlIHwKKwkJCSBPUF9BTEdfQVNfSU5JVEZJTkFMIHwgT1BfQUxHX0VOQ1JZUFQpOworCisJLyogUmVhZCBhbmQgd3JpdGUgY3J5cHRsZW4gYnl0ZXMgKi8KKwlhcHBlbmRfbWF0aF9hZGQoZGVzYywgVkFSU0VRSU5MRU4sIFpFUk8sIFJFRzMsIENBQU1fQ01EX1NaKTsKKwlhcHBlbmRfbWF0aF9hZGQoZGVzYywgVkFSU0VRT1VUTEVOLCBaRVJPLCBSRUczLCBDQUFNX0NNRF9TWik7CisJYWVhZF9hcHBlbmRfc3JjX2RzdChkZXNjLCBGSUZPTERfVFlQRV9NU0cxT1VUMik7CisKKwkvKiBXcml0ZSBJQ1YgKi8KKwlhcHBlbmRfc2VxX3N0b3JlKGRlc2MsIGN0eC0+YXV0aHNpemUsIExEU1RfQ0xBU1NfMl9DQ0IgfAorCQkJIExEU1RfU1JDRFNUX0JZVEVfQ09OVEVYVCk7CisKKwljdHgtPnNoX2Rlc2NfZW5jX2RtYSA9IGRtYV9tYXBfc2luZ2xlKGpyZGV2LCBkZXNjLAorCQkJCQkgICAgICBkZXNjX2J5dGVzKGRlc2MpLAorCQkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoanJkZXYsIGN0eC0+c2hfZGVzY19lbmNfZG1hKSkgeworCQlkZXZfZXJyKGpyZGV2LCAidW5hYmxlIHRvIG1hcCBzaGFyZWQgZGVzY3JpcHRvclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKyNpZmRlZiBERUJVRworCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiYWVhZCBlbmMgc2hkZXNjQCJ4c3RyKF9fTElORV9fKSI6ICIsCisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgZGVzYywKKwkJICAgICAgIGRlc2NfYnl0ZXMoZGVzYyksIDEpOworI2VuZGlmCisKKwkvKgorCSAqIEpvYiBEZXNjcmlwdG9yIGFuZCBTaGFyZWQgRGVzY3JpcHRvcnMKKwkgKiBtdXN0IGFsbCBmaXQgaW50byB0aGUgNjQtd29yZCBEZXNjcmlwdG9yIGgvdyBCdWZmZXIKKwkgKi8KKwlpZiAoREVTQ19BRUFEX0RFQ19MRU4gKyBERVNDX0pPQl9JT19MRU4gKworCSAgICBjdHgtPnNwbGl0X2tleV9wYWRfbGVuICsgY3R4LT5lbmNrZXlsZW4gPD0KKwkgICAgQ0FBTV9ERVNDX0JZVEVTX01BWCkKKwkJa2V5c19maXRfaW5saW5lID0gMTsKKworCWRlc2MgPSBjdHgtPnNoX2Rlc2NfZGVjOworCisJLyogYWVhZF9kZWNyeXB0IHNoYXJlZCBkZXNjcmlwdG9yICovCisJaW5pdF9zaF9kZXNjKGRlc2MsIEhEUl9TSEFSRV9XQUlUKTsKKworCS8qIFNraXAgaWYgYWxyZWFkeSBzaGFyZWQgKi8KKwlrZXlfanVtcF9jbWQgPSBhcHBlbmRfanVtcChkZXNjLCBKVU1QX0pTTCB8IEpVTVBfVEVTVF9BTEwgfAorCQkJCSAgIEpVTVBfQ09ORF9TSFJEKTsKKworCWFwcGVuZF9rZXlfYWVhZChkZXNjLCBjdHgsIGtleXNfZml0X2lubGluZSk7CisKKwkvKiBPbmx5IHByb3BhZ2F0ZSBlcnJvciBpbW1lZGlhdGVseSBpZiBzaGFyZWQgKi8KKwlqdW1wX2NtZCA9IGFwcGVuZF9qdW1wKGRlc2MsIEpVTVBfVEVTVF9BTEwpOworCXNldF9qdW1wX3RndF9oZXJlKGRlc2MsIGtleV9qdW1wX2NtZCk7CisJYXBwZW5kX2NtZChkZXNjLCBTRVRfT0tfUFJPUF9FUlJPUlMgfCBDTURfTE9BRCk7CisJc2V0X2p1bXBfdGd0X2hlcmUoZGVzYywganVtcF9jbWQpOworCisJLyogQ2xhc3MgMiBvcGVyYXRpb24gKi8KKwlhcHBlbmRfb3BlcmF0aW9uKGRlc2MsIGN0eC0+Y2xhc3MyX2FsZ190eXBlIHwKKwkJCSBPUF9BTEdfQVNfSU5JVEZJTkFMIHwgT1BfQUxHX0RFQ1JZUFQgfCBPUF9BTEdfSUNWX09OKTsKKworCS8qIGFzc29jbGVuICsgY3J5cHRsZW4gPSBzZXFpbmxlbiAtIGl2c2l6ZSAqLworCWFwcGVuZF9tYXRoX3N1Yl9pbW1fdTMyKGRlc2MsIFJFRzMsIFNFUUlOTEVOLCBJTU0sCisJCQkJY3R4LT5hdXRoc2l6ZSArIHRmbS0+aXZzaXplKQorCS8qIGFzc29jbGVuID0gKGFzc29jbGVuICsgY3J5cHRsZW4pIC0gY3J5cHRsZW4gKi8KKwlhcHBlbmRfbWF0aF9zdWIoZGVzYywgUkVHMiwgU0VRT1VUTEVOLCBSRUcwLCBDQUFNX0NNRF9TWik7CisJYXBwZW5kX21hdGhfc3ViKGRlc2MsIFZBUlNFUUlOTEVOLCBSRUczLCBSRUcyLCBDQUFNX0NNRF9TWik7CisKKwkvKiByZWFkIGFzc29jIGJlZm9yZSByZWFkaW5nIHBheWxvYWQgKi8KKwlhcHBlbmRfc2VxX2ZpZm9fbG9hZChkZXNjLCAwLCBGSUZPTERfQ0xBU1NfQ0xBU1MyIHwgRklGT0xEX1RZUEVfTVNHIHwKKwkJCSAgICAgS0VZX1ZMRik7CisKKwlhZWFkX2FwcGVuZF9sZF9pdihkZXNjLCB0Zm0tPml2c2l6ZSk7CisKKwlhcHBlbmRfZGVjX29wMShkZXNjLCBjdHgtPmNsYXNzMV9hbGdfdHlwZSk7CisKKwkvKiBSZWFkIGFuZCB3cml0ZSBjcnlwdGxlbiBieXRlcyAqLworCWFwcGVuZF9tYXRoX2FkZChkZXNjLCBWQVJTRVFJTkxFTiwgWkVSTywgUkVHMiwgQ0FBTV9DTURfU1opOworCWFwcGVuZF9tYXRoX2FkZChkZXNjLCBWQVJTRVFPVVRMRU4sIFpFUk8sIFJFRzIsIENBQU1fQ01EX1NaKTsKKwlhZWFkX2FwcGVuZF9zcmNfZHN0KGRlc2MsIEZJRk9MRF9UWVBFX01TRyk7CisKKwkvKiBMb2FkIElDViAqLworCWFwcGVuZF9zZXFfZmlmb19sb2FkKGRlc2MsIGN0eC0+YXV0aHNpemUsIEZJRk9MRF9DTEFTU19DTEFTUzIgfAorCQkJICAgICBGSUZPTERfVFlQRV9MQVNUMiB8IEZJRk9MRF9UWVBFX0lDVik7CisJYXBwZW5kX2RlY19zaHJfZG9uZShkZXNjKTsKKworCWN0eC0+c2hfZGVzY19kZWNfZG1hID0gZG1hX21hcF9zaW5nbGUoanJkZXYsIGRlc2MsCisJCQkJCSAgICAgIGRlc2NfYnl0ZXMoZGVzYyksCisJCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihqcmRldiwgY3R4LT5zaF9kZXNjX2RlY19kbWEpKSB7CisJCWRldl9lcnIoanJkZXYsICJ1bmFibGUgdG8gbWFwIHNoYXJlZCBkZXNjcmlwdG9yXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorI2lmZGVmIERFQlVHCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJhZWFkIGRlYyBzaGRlc2NAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBkZXNjLAorCQkgICAgICAgZGVzY19ieXRlcyhkZXNjKSwgMSk7CisjZW5kaWYKKworCS8qCisJICogSm9iIERlc2NyaXB0b3IgYW5kIFNoYXJlZCBEZXNjcmlwdG9ycworCSAqIG11c3QgYWxsIGZpdCBpbnRvIHRoZSA2NC13b3JkIERlc2NyaXB0b3IgaC93IEJ1ZmZlcgorCSAqLworCWlmIChERVNDX0FFQURfR0lWRU5DX0xFTiArIERFU0NfSk9CX0lPX0xFTiArCisJICAgIGN0eC0+c3BsaXRfa2V5X3BhZF9sZW4gKyBjdHgtPmVuY2tleWxlbiA8PQorCSAgICBDQUFNX0RFU0NfQllURVNfTUFYKQorCQlrZXlzX2ZpdF9pbmxpbmUgPSAxOworCisJLyogYWVhZF9naXZlbmNyeXB0IHNoYXJlZCBkZXNjcmlwdG9yICovCisJZGVzYyA9IGN0eC0+c2hfZGVzY19naXZlbmM7CisKKwlpbml0X3NoX2Rlc2Nfa2V5X2FlYWQoZGVzYywgY3R4LCBrZXlzX2ZpdF9pbmxpbmUpOworCisJLyogR2VuZXJhdGUgSVYgKi8KKwlnZW5pdiA9IE5GSUZPRU5UUllfU1RZUEVfUEFEIHwgTkZJRk9FTlRSWV9ERVNUX0RFQ08gfAorCQlORklGT0VOVFJZX0RUWVBFX01TRyB8IE5GSUZPRU5UUllfTEMxIHwKKwkJTkZJRk9FTlRSWV9QVFlQRV9STkQgfCAodGZtLT5pdnNpemUgPDwgTkZJRk9FTlRSWV9ETEVOX1NISUZUKTsKKwlhcHBlbmRfbG9hZF9pbW1fdTMyKGRlc2MsIGdlbml2LCBMRFNUX0NMQVNTX0lORF9DQ0IgfAorCQkJICAgIExEU1RfU1JDRFNUX1dPUkRfSU5GT19GSUZPIHwgTERTVF9JTU0pOworCWFwcGVuZF9jbWQoZGVzYywgQ01EX0xPQUQgfCBESVNBQkxFX0FVVE9fSU5GT19GSUZPKTsKKwlhcHBlbmRfbW92ZShkZXNjLCBNT1ZFX1NSQ19JTkZJRk8gfAorCQkgICAgTU9WRV9ERVNUX0NMQVNTMUNUWCB8ICh0Zm0tPml2c2l6ZSA8PCBNT1ZFX0xFTl9TSElGVCkpOworCWFwcGVuZF9jbWQoZGVzYywgQ01EX0xPQUQgfCBFTkFCTEVfQVVUT19JTkZPX0ZJRk8pOworCisJLyogQ29weSBJViB0byBjbGFzcyAxIGNvbnRleHQgKi8KKwlhcHBlbmRfbW92ZShkZXNjLCBNT1ZFX1NSQ19DTEFTUzFDVFggfAorCQkgICAgTU9WRV9ERVNUX09VVEZJRk8gfCAodGZtLT5pdnNpemUgPDwgTU9WRV9MRU5fU0hJRlQpKTsKKworCS8qIFJldHVybiB0byBlbmNyeXB0aW9uICovCisJYXBwZW5kX29wZXJhdGlvbihkZXNjLCBjdHgtPmNsYXNzMl9hbGdfdHlwZSB8CisJCQkgT1BfQUxHX0FTX0lOSVRGSU5BTCB8IE9QX0FMR19FTkNSWVBUKTsKKworCS8qIGl2c2l6ZSArIGNyeXB0bGVuID0gc2Vxb3V0bGVuIC0gYXV0aHNpemUgKi8KKwlhcHBlbmRfbWF0aF9zdWJfaW1tX3UzMihkZXNjLCBSRUczLCBTRVFPVVRMRU4sIElNTSwgY3R4LT5hdXRoc2l6ZSk7CisKKwkvKiBhc3NvY2xlbiA9IHNlcWlubGVuIC0gKGl2c2l6ZSArIGNyeXB0bGVuKSAqLworCWFwcGVuZF9tYXRoX3N1YihkZXNjLCBWQVJTRVFJTkxFTiwgU0VRSU5MRU4sIFJFRzMsIENBQU1fQ01EX1NaKTsKKworCS8qIHJlYWQgYXNzb2MgYmVmb3JlIHJlYWRpbmcgcGF5bG9hZCAqLworCWFwcGVuZF9zZXFfZmlmb19sb2FkKGRlc2MsIDAsIEZJRk9MRF9DTEFTU19DTEFTUzIgfCBGSUZPTERfVFlQRV9NU0cgfAorCQkJICAgICBLRVlfVkxGKTsKKworCS8qIENvcHkgaXYgZnJvbSBjbGFzcyAxIGN0eCB0byBjbGFzcyAyIGZpZm8qLworCW1vdmVpdiA9IE5GSUZPRU5UUllfU1RZUEVfT0ZJRk8gfCBORklGT0VOVFJZX0RFU1RfQ0xBU1MyIHwKKwkJIE5GSUZPRU5UUllfRFRZUEVfTVNHIHwgKHRmbS0+aXZzaXplIDw8IE5GSUZPRU5UUllfRExFTl9TSElGVCk7CisJYXBwZW5kX2xvYWRfaW1tX3UzMihkZXNjLCBtb3ZlaXYsIExEU1RfQ0xBU1NfSU5EX0NDQiB8CisJCQkgICAgTERTVF9TUkNEU1RfV09SRF9JTkZPX0ZJRk8gfCBMRFNUX0lNTSk7CisJYXBwZW5kX2xvYWRfaW1tX3UzMihkZXNjLCB0Zm0tPml2c2l6ZSwgTERTVF9DTEFTU18yX0NDQiB8CisJCQkgICAgTERTVF9TUkNEU1RfV09SRF9EQVRBU1pfUkVHIHwgTERTVF9JTU0pOworCisJLyogQ2xhc3MgMSBvcGVyYXRpb24gKi8KKwlhcHBlbmRfb3BlcmF0aW9uKGRlc2MsIGN0eC0+Y2xhc3MxX2FsZ190eXBlIHwKKwkJCSBPUF9BTEdfQVNfSU5JVEZJTkFMIHwgT1BfQUxHX0VOQ1JZUFQpOworCisJLyogV2lsbCB3cml0ZSBpdnNpemUgKyBjcnlwdGxlbiAqLworCWFwcGVuZF9tYXRoX2FkZChkZXNjLCBWQVJTRVFPVVRMRU4sIFNFUUlOTEVOLCBSRUcwLCBDQUFNX0NNRF9TWik7CisKKwkvKiBOb3QgbmVlZCB0byByZWxvYWQgaXYgKi8KKwlhcHBlbmRfc2VxX2ZpZm9fbG9hZChkZXNjLCB0Zm0tPml2c2l6ZSwKKwkJCSAgICAgRklGT0xEX0NMQVNTX1NLSVApOworCisJLyogV2lsbCByZWFkIGNyeXB0bGVuICovCisJYXBwZW5kX21hdGhfYWRkKGRlc2MsIFZBUlNFUUlOTEVOLCBTRVFJTkxFTiwgUkVHMCwgQ0FBTV9DTURfU1opOworCWFlYWRfYXBwZW5kX3NyY19kc3QoZGVzYywgRklGT0xEX1RZUEVfTVNHMU9VVDIpOworCisJLyogV3JpdGUgSUNWICovCisJYXBwZW5kX3NlcV9zdG9yZShkZXNjLCBjdHgtPmF1dGhzaXplLCBMRFNUX0NMQVNTXzJfQ0NCIHwKKwkJCSBMRFNUX1NSQ0RTVF9CWVRFX0NPTlRFWFQpOworCisJY3R4LT5zaF9kZXNjX2dpdmVuY19kbWEgPSBkbWFfbWFwX3NpbmdsZShqcmRldiwgZGVzYywKKwkJCQkJCSBkZXNjX2J5dGVzKGRlc2MpLAorCQkJCQkJIERNQV9UT19ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihqcmRldiwgY3R4LT5zaF9kZXNjX2dpdmVuY19kbWEpKSB7CisJCWRldl9lcnIoanJkZXYsICJ1bmFibGUgdG8gbWFwIHNoYXJlZCBkZXNjcmlwdG9yXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorI2lmZGVmIERFQlVHCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJhZWFkIGdpdmVuYyBzaGRlc2NAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBkZXNjLAorCQkgICAgICAgZGVzY19ieXRlcyhkZXNjKSwgMSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFlYWRfc2V0YXV0aHNpemUoc3RydWN0IGNyeXB0b19hZWFkICphdXRoZW5jLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgYXV0aHNpemUpCiB7CiAJc3RydWN0IGNhYW1fY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoYXV0aGVuYyk7CiAKIAljdHgtPmF1dGhzaXplID0gYXV0aHNpemU7CisJYWVhZF9zZXRfc2hfZGVzYyhhdXRoZW5jKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTE3LDYgKzQ2NSw3IEBACiAjaWZkZWYgREVCVUcKIAlkZXZfZXJyKGRldiwgIiVzICVkOiBlcnIgMHgleFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBlcnIpOwogI2VuZGlmCisKIAlpZiAoZXJyKSB7CiAJCWNoYXIgdG1wW0NBQU1fRVJST1JfU1RSX01BWF07CiAKQEAgLTIyMCw3MyArNTY5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGJ1aWxkX3NoX2Rlc2NfaXBzZWMoc3RydWN0IGNhYW1fY3R4ICpjdHgpCi17Ci0Jc3RydWN0IGRldmljZSAqanJkZXYgPSBjdHgtPmpyZGV2OwotCXUzMiAqc2hfZGVzYzsKLQl1MzIgKmp1bXBfY21kOwotCWJvb2wga2V5c19maXRfaW5saW5lID0gMDsKLQotCS8qCi0JICogbGFyZ2VzdCBKb2IgRGVzY3JpcHRvciBhbmQgaXRzIFNoYXJlZCBEZXNjcmlwdG9yCi0JICogbXVzdCBib3RoIGZpdCBpbnRvIHRoZSA2NC13b3JkIERlc2NyaXB0b3IgaC93IEJ1ZmZlcgotCSAqLwotCWlmICgoREVTQ19BRUFEX0dJVkVOQ1JZUFRfVEVYVF9MRU4gKwotCSAgICAgREVTQ19BRUFEX1NIQVJFRF9URVhUX0xFTikgKiBDQUFNX0NNRF9TWiArCi0JICAgIGN0eC0+c3BsaXRfa2V5X3BhZF9sZW4gKyBjdHgtPmVuY2tleWxlbiA8PSBDQUFNX0RFU0NfQllURVNfTUFYKQotCQlrZXlzX2ZpdF9pbmxpbmUgPSAxOwotCi0JLyogYnVpbGQgc2hhcmVkIGRlc2NyaXB0b3IgZm9yIHRoaXMgc2Vzc2lvbiAqLwotCXNoX2Rlc2MgPSBrbWFsbG9jKENBQU1fQ01EX1NaICogREVTQ19BRUFEX1NIQVJFRF9URVhUX0xFTiArCi0JCQkgIGtleXNfZml0X2lubGluZSA/Ci0JCQkgIGN0eC0+c3BsaXRfa2V5X3BhZF9sZW4gKyBjdHgtPmVuY2tleWxlbiA6Ci0JCQkgIENBQU1fUFRSX1NaICogMiwgR0ZQX0RNQSB8IEdGUF9LRVJORUwpOwotCWlmICghc2hfZGVzYykgewotCQlkZXZfZXJyKGpyZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIHNoYXJlZCBkZXNjcmlwdG9yXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaW5pdF9zaF9kZXNjKHNoX2Rlc2MsIEhEUl9TQVZFQ1RYIHwgSERSX1NIQVJFX1NFUklBTCk7Ci0KLQlqdW1wX2NtZCA9IGFwcGVuZF9qdW1wKHNoX2Rlc2MsIENMQVNTX0JPVEggfCBKVU1QX1RFU1RfQUxMIHwKLQkJCSAgICAgICBKVU1QX0NPTkRfU0hSRCB8IEpVTVBfQ09ORF9TRUxGKTsKLQotCS8qCi0JICogcHJvY2VzcyBrZXlzLCBzdGFydGluZyB3aXRoIGNsYXNzIDIvYXV0aGVudGljYXRpb24uCi0JICovCi0JaWYgKGtleXNfZml0X2lubGluZSkgewotCQlhcHBlbmRfa2V5X2FzX2ltbShzaF9kZXNjLCBjdHgtPmtleSwgY3R4LT5zcGxpdF9rZXlfcGFkX2xlbiwKLQkJCQkgIGN0eC0+c3BsaXRfa2V5X2xlbiwKLQkJCQkgIENMQVNTXzIgfCBLRVlfREVTVF9NREhBX1NQTElUIHwgS0VZX0VOQyk7Ci0KLQkJYXBwZW5kX2tleV9hc19pbW0oc2hfZGVzYywgKHZvaWQgKiljdHgtPmtleSArCi0JCQkJICBjdHgtPnNwbGl0X2tleV9wYWRfbGVuLCBjdHgtPmVuY2tleWxlbiwKLQkJCQkgIGN0eC0+ZW5ja2V5bGVuLCBDTEFTU18xIHwgS0VZX0RFU1RfQ0xBU1NfUkVHKTsKLQl9IGVsc2UgewotCQlhcHBlbmRfa2V5KHNoX2Rlc2MsIGN0eC0+a2V5X3BoeXMsIGN0eC0+c3BsaXRfa2V5X2xlbiwgQ0xBU1NfMiB8Ci0JCQkgICBLRVlfREVTVF9NREhBX1NQTElUIHwgS0VZX0VOQyk7Ci0JCWFwcGVuZF9rZXkoc2hfZGVzYywgY3R4LT5rZXlfcGh5cyArIGN0eC0+c3BsaXRfa2V5X3BhZF9sZW4sCi0JCQkgICBjdHgtPmVuY2tleWxlbiwgQ0xBU1NfMSB8IEtFWV9ERVNUX0NMQVNTX1JFRyk7Ci0JfQotCi0JLyogdXBkYXRlIGp1bXAgY21kIG5vdyB0aGF0IHdlIGFyZSBhdCB0aGUganVtcCB0YXJnZXQgKi8KLQlzZXRfanVtcF90Z3RfaGVyZShzaF9kZXNjLCBqdW1wX2NtZCk7Ci0KLQljdHgtPnNoYXJlZF9kZXNjX3BoeXMgPSBkbWFfbWFwX3NpbmdsZShqcmRldiwgc2hfZGVzYywKLQkJCQkJICAgICAgIGRlc2NfYnl0ZXMoc2hfZGVzYyksCi0JCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKLQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoanJkZXYsIGN0eC0+c2hhcmVkX2Rlc2NfcGh5cykpIHsKLQkJZGV2X2VycihqcmRldiwgInVuYWJsZSB0byBtYXAgc2hhcmVkIGRlc2NyaXB0b3JcbiIpOwotCQlrZnJlZShzaF9kZXNjKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JY3R4LT5zaF9kZXNjID0gc2hfZGVzYzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFlYWRfYXV0aGVuY19zZXRrZXkoc3RydWN0IGNyeXB0b19hZWFkICphZWFkLAorc3RhdGljIGludCBhZWFkX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQsCiAJCQkgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKIHsKIAkvKiBTaXplcyBmb3IgTURIQSBwYWRzICgqbm90KiBrZXlzKTogTUQ1LCBTSEExLCAyMjQsIDI1NiwgMzg0LCA1MTIgKi8KQEAgLTMyNiwyNyArNjA5LDE5IEBACiAJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJrZXkgaW4gQCJ4c3RyKF9fTElORV9fKSI6ICIsCiAJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwga2V5LCBrZXlsZW4sIDEpOwogI2VuZGlmCi0JY3R4LT5rZXkgPSBrbWFsbG9jKGN0eC0+c3BsaXRfa2V5X3BhZF9sZW4gKyBlbmNrZXlsZW4sCi0JCQkgICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JaWYgKCFjdHgtPmtleSkgewotCQlkZXZfZXJyKGpyZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIGtleSBvdXRwdXQgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcmV0ID0gZ2VuX3NwbGl0X2tleShjdHgsIGtleSwgYXV0aGtleWxlbik7CiAJaWYgKHJldCkgewotCQlrZnJlZShjdHgtPmtleSk7CiAJCWdvdG8gYmFka2V5OwogCX0KIAogCS8qIHBvc3RwZW5kIGVuY3J5cHRpb24ga2V5IHRvIGF1dGggc3BsaXQga2V5ICovCiAJbWVtY3B5KGN0eC0+a2V5ICsgY3R4LT5zcGxpdF9rZXlfcGFkX2xlbiwga2V5ICsgYXV0aGtleWxlbiwgZW5ja2V5bGVuKTsKIAotCWN0eC0+a2V5X3BoeXMgPSBkbWFfbWFwX3NpbmdsZShqcmRldiwgY3R4LT5rZXksIGN0eC0+c3BsaXRfa2V5X3BhZF9sZW4gKworCWN0eC0+a2V5X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGpyZGV2LCBjdHgtPmtleSwgY3R4LT5zcGxpdF9rZXlfcGFkX2xlbiArCiAJCQkJICAgICAgIGVuY2tleWxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGpyZGV2LCBjdHgtPmtleV9waHlzKSkgeworCWlmIChkbWFfbWFwcGluZ19lcnJvcihqcmRldiwgY3R4LT5rZXlfZG1hKSkgewogCQlkZXZfZXJyKGpyZGV2LCAidW5hYmxlIHRvIG1hcCBrZXkgaS9vIG1lbW9yeVxuIik7Ci0JCWtmcmVlKGN0eC0+a2V5KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogI2lmZGVmIERFQlVHCkBAIC0zNTcsMTEgKzYzMiwxMCBAQAogCiAJY3R4LT5lbmNrZXlsZW4gPSBlbmNrZXlsZW47CiAKLQlyZXQgPSBidWlsZF9zaF9kZXNjX2lwc2VjKGN0eCk7CisJcmV0ID0gYWVhZF9zZXRfc2hfZGVzYyhhZWFkKTsKIAlpZiAocmV0KSB7Ci0JCWRtYV91bm1hcF9zaW5nbGUoanJkZXYsIGN0eC0+a2V5X3BoeXMsIGN0eC0+c3BsaXRfa2V5X3BhZF9sZW4gKworCQlkbWFfdW5tYXBfc2luZ2xlKGpyZGV2LCBjdHgtPmtleV9kbWEsIGN0eC0+c3BsaXRfa2V5X3BhZF9sZW4gKwogCQkJCSBlbmNrZXlsZW4sIERNQV9UT19ERVZJQ0UpOwotCQlrZnJlZShjdHgtPmtleSk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTM3MCw2ICs2NDQsMTE5IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBpbnQgYWJsa2NpcGhlcl9zZXRrZXkoc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICphYmxrY2lwaGVyLAorCQkJICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBjYWFtX2N0eCAqY3R4ID0gY3J5cHRvX2FibGtjaXBoZXJfY3R4KGFibGtjaXBoZXIpOworCXN0cnVjdCBhYmxrY2lwaGVyX3RmbSAqdGZtID0gJmFibGtjaXBoZXItPmJhc2UuY3J0X2FibGtjaXBoZXI7CisJc3RydWN0IGRldmljZSAqanJkZXYgPSBjdHgtPmpyZGV2OworCWludCByZXQgPSAwOworCXUzMiAqa2V5X2p1bXBfY21kLCAqanVtcF9jbWQ7CisJdTMyICpkZXNjOworCisjaWZkZWYgREVCVUcKKwlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImtleSBpbiBAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBrZXksIGtleWxlbiwgMSk7CisjZW5kaWYKKworCW1lbWNweShjdHgtPmtleSwga2V5LCBrZXlsZW4pOworCWN0eC0+a2V5X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGpyZGV2LCBjdHgtPmtleSwga2V5bGVuLAorCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihqcmRldiwgY3R4LT5rZXlfZG1hKSkgeworCQlkZXZfZXJyKGpyZGV2LCAidW5hYmxlIHRvIG1hcCBrZXkgaS9vIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljdHgtPmVuY2tleWxlbiA9IGtleWxlbjsKKworCS8qIGFibGtjaXBoZXJfZW5jcnlwdCBzaGFyZWQgZGVzY3JpcHRvciAqLworCWRlc2MgPSBjdHgtPnNoX2Rlc2NfZW5jOworCWluaXRfc2hfZGVzYyhkZXNjLCBIRFJfU0hBUkVfV0FJVCk7CisJLyogU2tpcCBpZiBhbHJlYWR5IHNoYXJlZCAqLworCWtleV9qdW1wX2NtZCA9IGFwcGVuZF9qdW1wKGRlc2MsIEpVTVBfSlNMIHwgSlVNUF9URVNUX0FMTCB8CisJCQkJICAgSlVNUF9DT05EX1NIUkQpOworCisJLyogTG9hZCBjbGFzczEga2V5IG9ubHkgKi8KKwlhcHBlbmRfa2V5X2FzX2ltbShkZXNjLCAodm9pZCAqKWN0eC0+a2V5LCBjdHgtPmVuY2tleWxlbiwKKwkJCSAgY3R4LT5lbmNrZXlsZW4sIENMQVNTXzEgfAorCQkJICBLRVlfREVTVF9DTEFTU19SRUcpOworCisJc2V0X2p1bXBfdGd0X2hlcmUoZGVzYywga2V5X2p1bXBfY21kKTsKKworCS8qIFByb3BhZ2F0ZSBlcnJvcnMgZnJvbSBzaGFyZWQgdG8gam9iIGRlc2NyaXB0b3IgKi8KKwlhcHBlbmRfY21kKGRlc2MsIFNFVF9PS19QUk9QX0VSUk9SUyB8IENNRF9MT0FEKTsKKworCS8qIExvYWQgaXYgKi8KKwlhcHBlbmRfY21kKGRlc2MsIENNRF9TRVFfTE9BRCB8IExEU1RfU1JDRFNUX0JZVEVfQ09OVEVYVCB8CisJCSAgIExEU1RfQ0xBU1NfMV9DQ0IgfCB0Zm0tPml2c2l6ZSk7CisKKwkvKiBMb2FkIG9wZXJhdGlvbiAqLworCWFwcGVuZF9vcGVyYXRpb24oZGVzYywgY3R4LT5jbGFzczFfYWxnX3R5cGUgfAorCQkJIE9QX0FMR19BU19JTklURklOQUwgfCBPUF9BTEdfRU5DUllQVCk7CisKKwkvKiBQZXJmb3JtIG9wZXJhdGlvbiAqLworCWFibGtjaXBoZXJfYXBwZW5kX3NyY19kc3QoZGVzYyk7CisKKwljdHgtPnNoX2Rlc2NfZW5jX2RtYSA9IGRtYV9tYXBfc2luZ2xlKGpyZGV2LCBkZXNjLAorCQkJCQkgICAgICBkZXNjX2J5dGVzKGRlc2MpLAorCQkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoanJkZXYsIGN0eC0+c2hfZGVzY19lbmNfZG1hKSkgeworCQlkZXZfZXJyKGpyZGV2LCAidW5hYmxlIHRvIG1hcCBzaGFyZWQgZGVzY3JpcHRvclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKyNpZmRlZiBERUJVRworCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiYWJsa2NpcGhlciBlbmMgc2hkZXNjQCJ4c3RyKF9fTElORV9fKSI6ICIsCisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgZGVzYywKKwkJICAgICAgIGRlc2NfYnl0ZXMoZGVzYyksIDEpOworI2VuZGlmCisJLyogYWJsa2NpcGhlcl9kZWNyeXB0IHNoYXJlZCBkZXNjcmlwdG9yICovCisJZGVzYyA9IGN0eC0+c2hfZGVzY19kZWM7CisKKwlpbml0X3NoX2Rlc2MoZGVzYywgSERSX1NIQVJFX1dBSVQpOworCS8qIFNraXAgaWYgYWxyZWFkeSBzaGFyZWQgKi8KKwlrZXlfanVtcF9jbWQgPSBhcHBlbmRfanVtcChkZXNjLCBKVU1QX0pTTCB8IEpVTVBfVEVTVF9BTEwgfAorCQkJCSAgIEpVTVBfQ09ORF9TSFJEKTsKKworCS8qIExvYWQgY2xhc3MxIGtleSBvbmx5ICovCisJYXBwZW5kX2tleV9hc19pbW0oZGVzYywgKHZvaWQgKiljdHgtPmtleSwgY3R4LT5lbmNrZXlsZW4sCisJCQkgIGN0eC0+ZW5ja2V5bGVuLCBDTEFTU18xIHwKKwkJCSAgS0VZX0RFU1RfQ0xBU1NfUkVHKTsKKworCS8qIEZvciBhZWFkLCBvbmx5IHByb3BhZ2F0ZSBlcnJvciBpbW1lZGlhdGVseSBpZiBzaGFyZWQgKi8KKwlqdW1wX2NtZCA9IGFwcGVuZF9qdW1wKGRlc2MsIEpVTVBfVEVTVF9BTEwpOworCXNldF9qdW1wX3RndF9oZXJlKGRlc2MsIGtleV9qdW1wX2NtZCk7CisJYXBwZW5kX2NtZChkZXNjLCBTRVRfT0tfUFJPUF9FUlJPUlMgfCBDTURfTE9BRCk7CisJc2V0X2p1bXBfdGd0X2hlcmUoZGVzYywganVtcF9jbWQpOworCisJLyogbG9hZCBJViAqLworCWFwcGVuZF9jbWQoZGVzYywgQ01EX1NFUV9MT0FEIHwgTERTVF9TUkNEU1RfQllURV9DT05URVhUIHwKKwkJICAgTERTVF9DTEFTU18xX0NDQiB8IHRmbS0+aXZzaXplKTsKKworCS8qIENob29zZSBvcGVyYXRpb24gKi8KKwlhcHBlbmRfZGVjX29wMShkZXNjLCBjdHgtPmNsYXNzMV9hbGdfdHlwZSk7CisKKwkvKiBQZXJmb3JtIG9wZXJhdGlvbiAqLworCWFibGtjaXBoZXJfYXBwZW5kX3NyY19kc3QoZGVzYyk7CisKKwkvKiBXYWl0IGZvciBrZXkgdG8gbG9hZCBiZWZvcmUgYWxsb3dpbmcgcHJvcGFnYXRpbmcgZXJyb3IgKi8KKwlhcHBlbmRfZGVjX3Nocl9kb25lKGRlc2MpOworCisJY3R4LT5zaF9kZXNjX2RlY19kbWEgPSBkbWFfbWFwX3NpbmdsZShqcmRldiwgZGVzYywKKwkJCQkJICAgICAgZGVzY19ieXRlcyhkZXNjKSwKKwkJCQkJICAgICAgRE1BX1RPX0RFVklDRSk7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGpyZGV2LCBjdHgtPnNoX2Rlc2NfZW5jX2RtYSkpIHsKKwkJZGV2X2VycihqcmRldiwgInVuYWJsZSB0byBtYXAgc2hhcmVkIGRlc2NyaXB0b3JcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKyNpZmRlZiBERUJVRworCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiYWJsa2NpcGhlciBkZWMgc2hkZXNjQCJ4c3RyKF9fTElORV9fKSI6ICIsCisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgZGVzYywKKwkJICAgICAgIGRlc2NfYnl0ZXMoZGVzYyksIDEpOworI2VuZGlmCisKKwlyZXR1cm4gcmV0OworfQorCiBzdHJ1Y3QgbGlua190YmxfZW50cnkgewogCXU2NCBwdHI7CiAJdTMyIGxlbjsKQEAgLTM3OSw2NCArNzY2LDEwOSBAQAogfTsKIAogLyoKLSAqIGlwc2VjX2VzcF9lZGVzYyAtIHMvdy1leHRlbmRlZCBpcHNlY19lc3AgZGVzY3JpcHRvcgorICogYWVhZF9lZGVzYyAtIHMvdy1leHRlbmRlZCBhZWFkIGRlc2NyaXB0b3IKKyAqIEBhc3NvY19uZW50czogbnVtYmVyIG9mIHNlZ21lbnRzIGluIGFzc29jaWF0ZWQgZGF0YSAoU1BJK1NlcSkgc2NhdHRlcmxpc3QKICAqIEBzcmNfbmVudHM6IG51bWJlciBvZiBzZWdtZW50cyBpbiBpbnB1dCBzY2F0dGVybGlzdAogICogQGRzdF9uZW50czogbnVtYmVyIG9mIHNlZ21lbnRzIGluIG91dHB1dCBzY2F0dGVybGlzdAotICogQGFzc29jX25lbnRzOiBudW1iZXIgb2Ygc2VnbWVudHMgaW4gYXNzb2NpYXRlZCBkYXRhIChTUEkrU2VxKSBzY2F0dGVybGlzdAorICogQGl2X2RtYTogZG1hIGFkZHJlc3Mgb2YgaXYgZm9yIGNoZWNraW5nIGNvbnRpbnVpdHkgYW5kIGxpbmsgdGFibGUKICAqIEBkZXNjOiBoL3cgZGVzY3JpcHRvciAodmFyaWFibGUgbGVuZ3RoOyBtdXN0IG5vdCBleGNlZWQgTUFYX0NBQU1fREVTQ1NJWkUpCiAgKiBAbGlua190YmxfYnl0ZXM6IGxlbmd0aCBvZiBkbWEgbWFwcGVkIGxpbmtfdGJsIHNwYWNlCiAgKiBAbGlua190YmxfZG1hOiBidXMgcGh5c2ljYWwgbWFwcGVkIGFkZHJlc3Mgb2YgaC93IGxpbmsgdGFibGUKICAqIEBod19kZXNjOiB0aGUgaC93IGpvYiBkZXNjcmlwdG9yIGZvbGxvd2VkIGJ5IGFueSByZWZlcmVuY2VkIGxpbmsgdGFibGVzCiAgKi8KLXN0cnVjdCBpcHNlY19lc3BfZWRlc2Mgeworc3RydWN0IGFlYWRfZWRlc2MgewogCWludCBhc3NvY19uZW50czsKIAlpbnQgc3JjX25lbnRzOwogCWludCBkc3RfbmVudHM7CisJZG1hX2FkZHJfdCBpdl9kbWE7CiAJaW50IGxpbmtfdGJsX2J5dGVzOwogCWRtYV9hZGRyX3QgbGlua190YmxfZG1hOwogCXN0cnVjdCBsaW5rX3RibF9lbnRyeSAqbGlua190Ymw7CiAJdTMyIGh3X2Rlc2NbMF07CiB9OwogCi1zdGF0aWMgdm9pZCBpcHNlY19lc3BfdW5tYXAoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBpcHNlY19lc3BfZWRlc2MgKmVkZXNjLAotCQkJICAgIHN0cnVjdCBhZWFkX3JlcXVlc3QgKmFyZXEpCi17Ci0JZG1hX3VubWFwX3NnKGRldiwgYXJlcS0+YXNzb2MsIGVkZXNjLT5hc3NvY19uZW50cywgRE1BX1RPX0RFVklDRSk7CisvKgorICogYWJsa2NpcGhlcl9lZGVzYyAtIHMvdy1leHRlbmRlZCBhYmxrY2lwaGVyIGRlc2NyaXB0b3IKKyAqIEBzcmNfbmVudHM6IG51bWJlciBvZiBzZWdtZW50cyBpbiBpbnB1dCBzY2F0dGVybGlzdAorICogQGRzdF9uZW50czogbnVtYmVyIG9mIHNlZ21lbnRzIGluIG91dHB1dCBzY2F0dGVybGlzdAorICogQGl2X2RtYTogZG1hIGFkZHJlc3Mgb2YgaXYgZm9yIGNoZWNraW5nIGNvbnRpbnVpdHkgYW5kIGxpbmsgdGFibGUKKyAqIEBkZXNjOiBoL3cgZGVzY3JpcHRvciAodmFyaWFibGUgbGVuZ3RoOyBtdXN0IG5vdCBleGNlZWQgTUFYX0NBQU1fREVTQ1NJWkUpCisgKiBAbGlua190YmxfYnl0ZXM6IGxlbmd0aCBvZiBkbWEgbWFwcGVkIGxpbmtfdGJsIHNwYWNlCisgKiBAbGlua190YmxfZG1hOiBidXMgcGh5c2ljYWwgbWFwcGVkIGFkZHJlc3Mgb2YgaC93IGxpbmsgdGFibGUKKyAqIEBod19kZXNjOiB0aGUgaC93IGpvYiBkZXNjcmlwdG9yIGZvbGxvd2VkIGJ5IGFueSByZWZlcmVuY2VkIGxpbmsgdGFibGVzCisgKi8KK3N0cnVjdCBhYmxrY2lwaGVyX2VkZXNjIHsKKwlpbnQgc3JjX25lbnRzOworCWludCBkc3RfbmVudHM7CisJZG1hX2FkZHJfdCBpdl9kbWE7CisJaW50IGxpbmtfdGJsX2J5dGVzOworCWRtYV9hZGRyX3QgbGlua190YmxfZG1hOworCXN0cnVjdCBsaW5rX3RibF9lbnRyeSAqbGlua190Ymw7CisJdTMyIGh3X2Rlc2NbMF07Cit9OwogCi0JaWYgKHVubGlrZWx5KGFyZXEtPmRzdCAhPSBhcmVxLT5zcmMpKSB7Ci0JCWRtYV91bm1hcF9zZyhkZXYsIGFyZXEtPnNyYywgZWRlc2MtPnNyY19uZW50cywKLQkJCSAgICAgRE1BX1RPX0RFVklDRSk7Ci0JCWRtYV91bm1hcF9zZyhkZXYsIGFyZXEtPmRzdCwgZWRlc2MtPmRzdF9uZW50cywKLQkJCSAgICAgRE1BX0ZST01fREVWSUNFKTsKK3N0YXRpYyB2b2lkIGNhYW1fdW5tYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LCBpbnQgc3JjX25lbnRzLCBpbnQgZHN0X25lbnRzLAorCQkgICAgICAgZG1hX2FkZHJfdCBpdl9kbWEsIGludCBpdnNpemUsIGRtYV9hZGRyX3QgbGlua190YmxfZG1hLAorCQkgICAgICAgaW50IGxpbmtfdGJsX2J5dGVzKQoreworCWlmICh1bmxpa2VseShkc3QgIT0gc3JjKSkgeworCQlkbWFfdW5tYXBfc2coZGV2LCBzcmMsIHNyY19uZW50cywgRE1BX1RPX0RFVklDRSk7CisJCWRtYV91bm1hcF9zZyhkZXYsIGRzdCwgZHN0X25lbnRzLCBETUFfRlJPTV9ERVZJQ0UpOwogCX0gZWxzZSB7Ci0JCWRtYV91bm1hcF9zZyhkZXYsIGFyZXEtPnNyYywgZWRlc2MtPnNyY19uZW50cywKLQkJCSAgICAgRE1BX0JJRElSRUNUSU9OQUwpOworCQlkbWFfdW5tYXBfc2coZGV2LCBzcmMsIHNyY19uZW50cywgRE1BX0JJRElSRUNUSU9OQUwpOwogCX0KIAotCWlmIChlZGVzYy0+bGlua190YmxfYnl0ZXMpCi0JCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBlZGVzYy0+bGlua190YmxfZG1hLAotCQkJCSBlZGVzYy0+bGlua190YmxfYnl0ZXMsCisJaWYgKGl2X2RtYSkKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYsIGl2X2RtYSwgaXZzaXplLCBETUFfVE9fREVWSUNFKTsKKwlpZiAobGlua190YmxfYnl0ZXMpCisJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBsaW5rX3RibF9kbWEsIGxpbmtfdGJsX2J5dGVzLAogCQkJCSBETUFfVE9fREVWSUNFKTsKIH0KIAotLyoKLSAqIGlwc2VjX2VzcCBkZXNjcmlwdG9yIGNhbGxiYWNrcwotICovCi1zdGF0aWMgdm9pZCBpcHNlY19lc3BfZW5jcnlwdF9kb25lKHN0cnVjdCBkZXZpY2UgKmpyZGV2LCB1MzIgKmRlc2MsIHUzMiBlcnIsCitzdGF0aWMgdm9pZCBhZWFkX3VubWFwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBhZWFkX2VkZXNjICplZGVzYywKKwkJICAgICAgIHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKKwlpbnQgaXZzaXplID0gY3J5cHRvX2FlYWRfaXZzaXplKGFlYWQpOworCisJZG1hX3VubWFwX3NnKGRldiwgcmVxLT5hc3NvYywgZWRlc2MtPmFzc29jX25lbnRzLCBETUFfVE9fREVWSUNFKTsKKworCWNhYW1fdW5tYXAoZGV2LCByZXEtPnNyYywgcmVxLT5kc3QsCisJCSAgIGVkZXNjLT5zcmNfbmVudHMsIGVkZXNjLT5kc3RfbmVudHMsCisJCSAgIGVkZXNjLT5pdl9kbWEsIGl2c2l6ZSwgZWRlc2MtPmxpbmtfdGJsX2RtYSwKKwkJICAgZWRlc2MtPmxpbmtfdGJsX2J5dGVzKTsKK30KKworc3RhdGljIHZvaWQgYWJsa2NpcGhlcl91bm1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBhYmxrY2lwaGVyX2VkZXNjICplZGVzYywKKwkJCSAgICAgc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqYWJsa2NpcGhlciA9IGNyeXB0b19hYmxrY2lwaGVyX3JlcXRmbShyZXEpOworCWludCBpdnNpemUgPSBjcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUoYWJsa2NpcGhlcik7CisKKwljYWFtX3VubWFwKGRldiwgcmVxLT5zcmMsIHJlcS0+ZHN0LAorCQkgICBlZGVzYy0+c3JjX25lbnRzLCBlZGVzYy0+ZHN0X25lbnRzLAorCQkgICBlZGVzYy0+aXZfZG1hLCBpdnNpemUsIGVkZXNjLT5saW5rX3RibF9kbWEsCisJCSAgIGVkZXNjLT5saW5rX3RibF9ieXRlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGFlYWRfZW5jcnlwdF9kb25lKHN0cnVjdCBkZXZpY2UgKmpyZGV2LCB1MzIgKmRlc2MsIHUzMiBlcnIsCiAJCQkJICAgdm9pZCAqY29udGV4dCkKIHsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICphcmVxID0gY29udGV4dDsKLQlzdHJ1Y3QgaXBzZWNfZXNwX2VkZXNjICplZGVzYzsKKwlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBjb250ZXh0OworCXN0cnVjdCBhZWFkX2VkZXNjICplZGVzYzsKICNpZmRlZiBERUJVRwotCXN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShhcmVxKTsKLQlpbnQgaXZzaXplID0gY3J5cHRvX2FlYWRfaXZzaXplKGFlYWQpOworCXN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOwogCXN0cnVjdCBjYWFtX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KGFlYWQpOworCWludCBpdnNpemUgPSBjcnlwdG9fYWVhZF9pdnNpemUoYWVhZCk7CiAKIAlkZXZfZXJyKGpyZGV2LCAiJXMgJWQ6IGVyciAweCV4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGVycik7CiAjZW5kaWYKLQllZGVzYyA9IChzdHJ1Y3QgaXBzZWNfZXNwX2VkZXNjICopKChjaGFyICopZGVzYyAtCi0JCSBvZmZzZXRvZihzdHJ1Y3QgaXBzZWNfZXNwX2VkZXNjLCBod19kZXNjKSk7CisKKwllZGVzYyA9IChzdHJ1Y3QgYWVhZF9lZGVzYyAqKSgoY2hhciAqKWRlc2MgLQorCQkgb2Zmc2V0b2Yoc3RydWN0IGFlYWRfZWRlc2MsIGh3X2Rlc2MpKTsKIAogCWlmIChlcnIpIHsKIAkJY2hhciB0bXBbQ0FBTV9FUlJPUl9TVFJfTUFYXTsKQEAgLTQ0NCwzOSArODc2LDUwIEBACiAJCWRldl9lcnIoanJkZXYsICIlMDh4OiAlc1xuIiwgZXJyLCBjYWFtX2pyX3N0cnN0YXR1cyh0bXAsIGVycikpOwogCX0KIAotCWlwc2VjX2VzcF91bm1hcChqcmRldiwgZWRlc2MsIGFyZXEpOworCWFlYWRfdW5tYXAoanJkZXYsIGVkZXNjLCByZXEpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImFzc29jICBAInhzdHIoX19MSU5FX18pIjogIiwKLQkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBzZ192aXJ0KGFyZXEtPmFzc29jKSwKLQkJICAgICAgIGFyZXEtPmFzc29jbGVuICwgMSk7CisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgc2dfdmlydChyZXEtPmFzc29jKSwKKwkJICAgICAgIHJlcS0+YXNzb2NsZW4gLCAxKTsKIAlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImRzdGl2ICBAInhzdHIoX19MSU5FX18pIjogIiwKLQkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBzZ192aXJ0KGFyZXEtPnNyYykgLSBpdnNpemUsCisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgc2dfdmlydChyZXEtPnNyYykgLSBpdnNpemUsCiAJCSAgICAgICBlZGVzYy0+c3JjX25lbnRzID8gMTAwIDogaXZzaXplLCAxKTsKIAlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImRzdCAgICBAInhzdHIoX19MSU5FX18pIjogIiwKLQkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBzZ192aXJ0KGFyZXEtPnNyYyksCi0JCSAgICAgICBlZGVzYy0+c3JjX25lbnRzID8gMTAwIDogYXJlcS0+Y3J5cHRsZW4gKworCQkgICAgICAgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsIHNnX3ZpcnQocmVxLT5zcmMpLAorCQkgICAgICAgZWRlc2MtPnNyY19uZW50cyA/IDEwMCA6IHJlcS0+Y3J5cHRsZW4gKwogCQkgICAgICAgY3R4LT5hdXRoc2l6ZSArIDQsIDEpOwogI2VuZGlmCiAKIAlrZnJlZShlZGVzYyk7CiAKLQlhZWFkX3JlcXVlc3RfY29tcGxldGUoYXJlcSwgZXJyKTsKKwlhZWFkX3JlcXVlc3RfY29tcGxldGUocmVxLCBlcnIpOwogfQogCi1zdGF0aWMgdm9pZCBpcHNlY19lc3BfZGVjcnlwdF9kb25lKHN0cnVjdCBkZXZpY2UgKmpyZGV2LCB1MzIgKmRlc2MsIHUzMiBlcnIsCitzdGF0aWMgdm9pZCBhZWFkX2RlY3J5cHRfZG9uZShzdHJ1Y3QgZGV2aWNlICpqcmRldiwgdTMyICpkZXNjLCB1MzIgZXJyLAogCQkJCSAgIHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IGFlYWRfcmVxdWVzdCAqYXJlcSA9IGNvbnRleHQ7Ci0Jc3RydWN0IGlwc2VjX2VzcF9lZGVzYyAqZWRlc2M7CisJc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gY29udGV4dDsKKwlzdHJ1Y3QgYWVhZF9lZGVzYyAqZWRlc2M7CiAjaWZkZWYgREVCVUcKLQlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0oYXJlcSk7CisJc3RydWN0IGNyeXB0b19hZWFkICphZWFkID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7CiAJc3RydWN0IGNhYW1fY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoYWVhZCk7CisJaW50IGl2c2l6ZSA9IGNyeXB0b19hZWFkX2l2c2l6ZShhZWFkKTsKIAogCWRldl9lcnIoanJkZXYsICIlcyAlZDogZXJyIDB4JXhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZXJyKTsKICNlbmRpZgotCWVkZXNjID0gKHN0cnVjdCBpcHNlY19lc3BfZWRlc2MgKikoKGNoYXIgKilkZXNjIC0KLQkJIG9mZnNldG9mKHN0cnVjdCBpcHNlY19lc3BfZWRlc2MsIGh3X2Rlc2MpKTsKKworCWVkZXNjID0gKHN0cnVjdCBhZWFkX2VkZXNjICopKChjaGFyICopZGVzYyAtCisJCSBvZmZzZXRvZihzdHJ1Y3QgYWVhZF9lZGVzYywgaHdfZGVzYykpOworCisjaWZkZWYgREVCVUcKKwlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImRzdGl2ICBAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCByZXEtPml2LAorCQkgICAgICAgaXZzaXplLCAxKTsKKwlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImRzdCAgICBAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBzZ192aXJ0KHJlcS0+ZHN0KSwKKwkJICAgICAgIHJlcS0+Y3J5cHRsZW4sIDEpOworI2VuZGlmCiAKIAlpZiAoZXJyKSB7CiAJCWNoYXIgdG1wW0NBQU1fRVJST1JfU1RSX01BWF07CkBAIC00ODQsNyArOTI3LDcgQEAKIAkJZGV2X2VycihqcmRldiwgIiUwOHg6ICVzXG4iLCBlcnIsIGNhYW1fanJfc3Ryc3RhdHVzKHRtcCwgZXJyKSk7CiAJfQogCi0JaXBzZWNfZXNwX3VubWFwKGpyZGV2LCBlZGVzYywgYXJlcSk7CisJYWVhZF91bm1hcChqcmRldiwgZWRlc2MsIHJlcSk7CiAKIAkvKgogCSAqIHZlcmlmeSBodyBhdXRoIGNoZWNrIHBhc3NlZCBlbHNlIHJldHVybiAtRUJBRE1TRwpAQCAtNDk1LDI1NSArOTM4LDQxMyBAQAogI2lmZGVmIERFQlVHCiAJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJpcGhkcm91dEAieHN0cihfX0xJTkVfXykiOiAiLAogCQkgICAgICAgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsCi0JCSAgICAgICAoKGNoYXIgKilzZ192aXJ0KGFyZXEtPmFzc29jKSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgYXJlcS0+YXNzb2NsZW4gKwotCQkgICAgICAgKChhcmVxLT5jcnlwdGxlbiA+IDE1MDApID8gMTUwMCA6IGFyZXEtPmNyeXB0bGVuKSArCisJCSAgICAgICAoKGNoYXIgKilzZ192aXJ0KHJlcS0+YXNzb2MpIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikpLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyByZXEtPmFzc29jbGVuICsKKwkJICAgICAgICgocmVxLT5jcnlwdGxlbiA+IDE1MDApID8gMTUwMCA6IHJlcS0+Y3J5cHRsZW4pICsKIAkJICAgICAgIGN0eC0+YXV0aHNpemUgKyAzNiwgMSk7CiAJaWYgKCFlcnIgJiYgZWRlc2MtPmxpbmtfdGJsX2J5dGVzKSB7Ci0JCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzZ19sYXN0KGFyZXEtPnNyYywgZWRlc2MtPnNyY19uZW50cyk7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzZ19sYXN0KHJlcS0+c3JjLCBlZGVzYy0+c3JjX25lbnRzKTsKIAkJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJzZ2xhc3RvdXRAInhzdHIoX19MSU5FX18pIjogIiwKIAkJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgc2dfdmlydChzZyksCiAJCQlzZy0+bGVuZ3RoICsgY3R4LT5hdXRoc2l6ZSArIDE2LCAxKTsKIAl9CiAjZW5kaWYKKwogCWtmcmVlKGVkZXNjKTsKIAotCWFlYWRfcmVxdWVzdF9jb21wbGV0ZShhcmVxLCBlcnIpOworCWFlYWRfcmVxdWVzdF9jb21wbGV0ZShyZXEsIGVycik7Cit9CisKK3N0YXRpYyB2b2lkIGFibGtjaXBoZXJfZW5jcnlwdF9kb25lKHN0cnVjdCBkZXZpY2UgKmpyZGV2LCB1MzIgKmRlc2MsIHUzMiBlcnIsCisJCQkJICAgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXEgPSBjb250ZXh0OworCXN0cnVjdCBhYmxrY2lwaGVyX2VkZXNjICplZGVzYzsKKyNpZmRlZiBERUJVRworCXN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqYWJsa2NpcGhlciA9IGNyeXB0b19hYmxrY2lwaGVyX3JlcXRmbShyZXEpOworCWludCBpdnNpemUgPSBjcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUoYWJsa2NpcGhlcik7CisKKwlkZXZfZXJyKGpyZGV2LCAiJXMgJWQ6IGVyciAweCV4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGVycik7CisjZW5kaWYKKworCWVkZXNjID0gKHN0cnVjdCBhYmxrY2lwaGVyX2VkZXNjICopKChjaGFyICopZGVzYyAtCisJCSBvZmZzZXRvZihzdHJ1Y3QgYWJsa2NpcGhlcl9lZGVzYywgaHdfZGVzYykpOworCisJaWYgKGVycikgeworCQljaGFyIHRtcFtDQUFNX0VSUk9SX1NUUl9NQVhdOworCisJCWRldl9lcnIoanJkZXYsICIlMDh4OiAlc1xuIiwgZXJyLCBjYWFtX2pyX3N0cnN0YXR1cyh0bXAsIGVycikpOworCX0KKworI2lmZGVmIERFQlVHCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJkc3RpdiAgQCJ4c3RyKF9fTElORV9fKSI6ICIsCisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgcmVxLT5pbmZvLAorCQkgICAgICAgZWRlc2MtPnNyY19uZW50cyA+IDEgPyAxMDAgOiBpdnNpemUsIDEpOworCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiZHN0ICAgIEAieHN0cihfX0xJTkVfXykiOiAiLAorCQkgICAgICAgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsIHNnX3ZpcnQocmVxLT5zcmMpLAorCQkgICAgICAgZWRlc2MtPmRzdF9uZW50cyA+IDEgPyAxMDAgOiByZXEtPm5ieXRlcywgMSk7CisjZW5kaWYKKworCWFibGtjaXBoZXJfdW5tYXAoanJkZXYsIGVkZXNjLCByZXEpOworCWtmcmVlKGVkZXNjKTsKKworCWFibGtjaXBoZXJfcmVxdWVzdF9jb21wbGV0ZShyZXEsIGVycik7Cit9CisKK3N0YXRpYyB2b2lkIGFibGtjaXBoZXJfZGVjcnlwdF9kb25lKHN0cnVjdCBkZXZpY2UgKmpyZGV2LCB1MzIgKmRlc2MsIHUzMiBlcnIsCisJCQkJICAgIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxID0gY29udGV4dDsKKwlzdHJ1Y3QgYWJsa2NpcGhlcl9lZGVzYyAqZWRlc2M7CisjaWZkZWYgREVCVUcKKwlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmFibGtjaXBoZXIgPSBjcnlwdG9fYWJsa2NpcGhlcl9yZXF0Zm0ocmVxKTsKKwlpbnQgaXZzaXplID0gY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKGFibGtjaXBoZXIpOworCisJZGV2X2VycihqcmRldiwgIiVzICVkOiBlcnIgMHgleFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBlcnIpOworI2VuZGlmCisKKwllZGVzYyA9IChzdHJ1Y3QgYWJsa2NpcGhlcl9lZGVzYyAqKSgoY2hhciAqKWRlc2MgLQorCQkgb2Zmc2V0b2Yoc3RydWN0IGFibGtjaXBoZXJfZWRlc2MsIGh3X2Rlc2MpKTsKKwlpZiAoZXJyKSB7CisJCWNoYXIgdG1wW0NBQU1fRVJST1JfU1RSX01BWF07CisKKwkJZGV2X2VycihqcmRldiwgIiUwOHg6ICVzXG4iLCBlcnIsIGNhYW1fanJfc3Ryc3RhdHVzKHRtcCwgZXJyKSk7CisJfQorCisjaWZkZWYgREVCVUcKKwlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImRzdGl2ICBAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCByZXEtPmluZm8sCisJCSAgICAgICBpdnNpemUsIDEpOworCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiZHN0ICAgIEAieHN0cihfX0xJTkVfXykiOiAiLAorCQkgICAgICAgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsIHNnX3ZpcnQocmVxLT5zcmMpLAorCQkgICAgICAgZWRlc2MtPmRzdF9uZW50cyA+IDEgPyAxMDAgOiByZXEtPm5ieXRlcywgMSk7CisjZW5kaWYKKworCWFibGtjaXBoZXJfdW5tYXAoanJkZXYsIGVkZXNjLCByZXEpOworCWtmcmVlKGVkZXNjKTsKKworCWFibGtjaXBoZXJfcmVxdWVzdF9jb21wbGV0ZShyZXEsIGVycik7Cit9CisKK3N0YXRpYyB2b2lkIHNnX3RvX2xpbmtfdGJsX29uZShzdHJ1Y3QgbGlua190YmxfZW50cnkgKmxpbmtfdGJsX3B0ciwKKwkJCSAgICAgICBkbWFfYWRkcl90IGRtYSwgdTMyIGxlbiwgdTMyIG9mZnNldCkKK3sKKwlsaW5rX3RibF9wdHItPnB0ciA9IGRtYTsKKwlsaW5rX3RibF9wdHItPmxlbiA9IGxlbjsKKwlsaW5rX3RibF9wdHItPnJlc2VydmVkID0gMDsKKwlsaW5rX3RibF9wdHItPmJ1Zl9wb29sX2lkID0gMDsKKwlsaW5rX3RibF9wdHItPm9mZnNldCA9IG9mZnNldDsKKyNpZmRlZiBERUJVRworCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAibGlua190YmxfcHRyQCJ4c3RyKF9fTElORV9fKSI6ICIsCisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgbGlua190YmxfcHRyLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBsaW5rX3RibF9lbnRyeSksIDEpOworI2VuZGlmCit9CisKKy8qCisgKiBjb252ZXJ0IHNjYXR0ZXJsaXN0IHRvIGgvdyBsaW5rIHRhYmxlIGZvcm1hdAorICogYnV0IGRvZXMgbm90IGhhdmUgZmluYWwgYml0OyBpbnN0ZWFkLCByZXR1cm5zIGxhc3QgZW50cnkKKyAqLworc3RhdGljIHN0cnVjdCBsaW5rX3RibF9lbnRyeSAqc2dfdG9fbGlua190Ymwoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkJICAgICBpbnQgc2dfY291bnQsIHN0cnVjdCBsaW5rX3RibF9lbnRyeQorCQkJCQkgICAgICpsaW5rX3RibF9wdHIsIHUzMiBvZmZzZXQpCit7CisJd2hpbGUgKHNnX2NvdW50KSB7CisJCXNnX3RvX2xpbmtfdGJsX29uZShsaW5rX3RibF9wdHIsIHNnX2RtYV9hZGRyZXNzKHNnKSwKKwkJCQkgICBzZ19kbWFfbGVuKHNnKSwgb2Zmc2V0KTsKKwkJbGlua190YmxfcHRyKys7CisJCXNnID0gc2dfbmV4dChzZyk7CisJCXNnX2NvdW50LS07CisJfQorCXJldHVybiBsaW5rX3RibF9wdHIgLSAxOwogfQogCiAvKgogICogY29udmVydCBzY2F0dGVybGlzdCB0byBoL3cgbGluayB0YWJsZSBmb3JtYXQKICAqIHNjYXR0ZXJsaXN0IG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgZG1hIG1hcHBlZAogICovCi1zdGF0aWMgdm9pZCBzZ190b19saW5rX3RibChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgc2dfY291bnQsCi0JCQkgICBzdHJ1Y3QgbGlua190YmxfZW50cnkgKmxpbmtfdGJsX3B0ciwgdTMyIG9mZnNldCkKK3N0YXRpYyB2b2lkIHNnX3RvX2xpbmtfdGJsX2xhc3Qoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IHNnX2NvdW50LAorCQkJCXN0cnVjdCBsaW5rX3RibF9lbnRyeSAqbGlua190YmxfcHRyLCB1MzIgb2Zmc2V0KQogewotCXdoaWxlIChzZ19jb3VudCkgewotCQlsaW5rX3RibF9wdHItPnB0ciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKLQkJbGlua190YmxfcHRyLT5sZW4gPSBzZ19kbWFfbGVuKHNnKTsKLQkJbGlua190YmxfcHRyLT5yZXNlcnZlZCA9IDA7Ci0JCWxpbmtfdGJsX3B0ci0+YnVmX3Bvb2xfaWQgPSAwOwotCQlsaW5rX3RibF9wdHItPm9mZnNldCA9IG9mZnNldDsKLQkJbGlua190YmxfcHRyKys7Ci0JCXNnID0gc2dfbmV4dChzZyk7Ci0JCXNnX2NvdW50LS07Ci0JfQotCi0JLyogc2V0IEZpbmFsIGJpdCAobWFya3MgZW5kIG9mIGxpbmsgdGFibGUpICovCi0JbGlua190YmxfcHRyLS07CisJbGlua190YmxfcHRyID0gc2dfdG9fbGlua190Ymwoc2csIHNnX2NvdW50LCBsaW5rX3RibF9wdHIsIG9mZnNldCk7CiAJbGlua190YmxfcHRyLT5sZW4gfD0gMHg0MDAwMDAwMDsKIH0KIAogLyoKLSAqIGZpbGwgaW4gYW5kIHN1Ym1pdCBpcHNlY19lc3Agam9iIGRlc2NyaXB0b3IKKyAqIEZpbGwgaW4gYWVhZCBqb2IgZGVzY3JpcHRvcgogICovCi1zdGF0aWMgaW50IGlwc2VjX2VzcChzdHJ1Y3QgaXBzZWNfZXNwX2VkZXNjICplZGVzYywgc3RydWN0IGFlYWRfcmVxdWVzdCAqYXJlcSwKLQkJICAgICB1MzIgZW5jcnlwdCwKLQkJICAgICB2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiAqZGVzYywKLQkJCQkgICAgICAgdTMyIGVyciwgdm9pZCAqY29udGV4dCkpCitzdGF0aWMgdm9pZCBpbml0X2FlYWRfam9iKHUzMiAqc2hfZGVzYywgZG1hX2FkZHJfdCBwdHIsCisJCQkgIHN0cnVjdCBhZWFkX2VkZXNjICplZGVzYywKKwkJCSAgc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxLAorCQkJICBib29sIGFsbF9jb250aWcsIGJvb2wgZW5jcnlwdCkKIHsKLQlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0oYXJlcSk7CisJc3RydWN0IGNyeXB0b19hZWFkICphZWFkID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7CiAJc3RydWN0IGNhYW1fY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoYWVhZCk7Ci0Jc3RydWN0IGRldmljZSAqanJkZXYgPSBjdHgtPmpyZGV2OwotCXUzMiAqZGVzYyA9IGVkZXNjLT5od19kZXNjLCBvcHRpb25zOwotCWludCByZXQsIHNnX2NvdW50LCBhc3NvY19zZ19jb3VudDsKIAlpbnQgaXZzaXplID0gY3J5cHRvX2FlYWRfaXZzaXplKGFlYWQpOwogCWludCBhdXRoc2l6ZSA9IGN0eC0+YXV0aHNpemU7Ci0JZG1hX2FkZHJfdCBwdHIsIGRzdF9kbWEsIHNyY19kbWE7Ci0jaWZkZWYgREVCVUcKLQl1MzIgKnNoX2Rlc2MgPSBjdHgtPnNoX2Rlc2M7CisJdTMyICpkZXNjID0gZWRlc2MtPmh3X2Rlc2M7CisJdTMyIG91dF9vcHRpb25zID0gMCwgaW5fb3B0aW9uczsKKwlkbWFfYWRkcl90IGRzdF9kbWEsIHNyY19kbWE7CisJaW50IGxlbiwgbGlua190YmxfaW5kZXggPSAwOwogCisjaWZkZWYgREVCVUcKIAlkZWJ1ZygiYXNzb2NsZW4gJWQgY3J5cHRsZW4gJWQgYXV0aHNpemUgJWRcbiIsCi0JICAgICAgYXJlcS0+YXNzb2NsZW4sIGFyZXEtPmNyeXB0bGVuLCBhdXRoc2l6ZSk7CisJICAgICAgcmVxLT5hc3NvY2xlbiwgcmVxLT5jcnlwdGxlbiwgYXV0aHNpemUpOwogCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiYXNzb2MgIEAieHN0cihfX0xJTkVfXykiOiAiLAotCQkgICAgICAgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsIHNnX3ZpcnQoYXJlcS0+YXNzb2MpLAotCQkgICAgICAgYXJlcS0+YXNzb2NsZW4gLCAxKTsKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBzZ192aXJ0KHJlcS0+YXNzb2MpLAorCQkgICAgICAgcmVxLT5hc3NvY2xlbiAsIDEpOwogCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAicHJlc2NpdkAieHN0cihfX0xJTkVfXykiOiAiLAotCQkgICAgICAgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsIHNnX3ZpcnQoYXJlcS0+c3JjKSAtIGl2c2l6ZSwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCByZXEtPml2LAogCQkgICAgICAgZWRlc2MtPnNyY19uZW50cyA/IDEwMCA6IGl2c2l6ZSwgMSk7CiAJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJzcmMgICAgQCJ4c3RyKF9fTElORV9fKSI6ICIsCi0JCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgc2dfdmlydChhcmVxLT5zcmMpLAotCQkJZWRlc2MtPnNyY19uZW50cyA/IDEwMCA6IGFyZXEtPmNyeXB0bGVuICsgYXV0aHNpemUsIDEpOworCQkgICAgICAgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsIHNnX3ZpcnQocmVxLT5zcmMpLAorCQkJZWRlc2MtPnNyY19uZW50cyA/IDEwMCA6IHJlcS0+Y3J5cHRsZW4sIDEpOwogCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAic2hyZGVzY0AieHN0cihfX0xJTkVfXykiOiAiLAogCQkgICAgICAgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsIHNoX2Rlc2MsCiAJCSAgICAgICBkZXNjX2J5dGVzKHNoX2Rlc2MpLCAxKTsKICNlbmRpZgotCWFzc29jX3NnX2NvdW50ID0gZG1hX21hcF9zZyhqcmRldiwgYXJlcS0+YXNzb2MsIGVkZXNjLT5hc3NvY19uZW50cyA/OiAxLAotCQkJCSAgICBETUFfVE9fREVWSUNFKTsKLQlpZiAoYXJlcS0+c3JjID09IGFyZXEtPmRzdCkKLQkJc2dfY291bnQgPSBkbWFfbWFwX3NnKGpyZGV2LCBhcmVxLT5zcmMsIGVkZXNjLT5zcmNfbmVudHMgPyA6IDEsCi0JCQkJICAgICAgRE1BX0JJRElSRUNUSU9OQUwpOworCisJbGVuID0gZGVzY19sZW4oc2hfZGVzYyk7CisJaW5pdF9qb2JfZGVzY19zaGFyZWQoZGVzYywgcHRyLCBsZW4sIEhEUl9TSEFSRV9ERUZFUiB8IEhEUl9SRVZFUlNFKTsKKworCWlmIChhbGxfY29udGlnKSB7CisJCXNyY19kbWEgPSBzZ19kbWFfYWRkcmVzcyhyZXEtPmFzc29jKTsKKwkJaW5fb3B0aW9ucyA9IDA7CisJfSBlbHNlIHsKKwkJc3JjX2RtYSA9IGVkZXNjLT5saW5rX3RibF9kbWE7CisJCWxpbmtfdGJsX2luZGV4ICs9IChlZGVzYy0+YXNzb2NfbmVudHMgPyA6IDEpICsgMSArCisJCQkJICAoZWRlc2MtPnNyY19uZW50cyA/IDogMSk7CisJCWluX29wdGlvbnMgPSBMRFNUX1NHRjsKKwl9CisJaWYgKGVuY3J5cHQpCisJCWFwcGVuZF9zZXFfaW5fcHRyKGRlc2MsIHNyY19kbWEsIHJlcS0+YXNzb2NsZW4gKyBpdnNpemUgKworCQkJCSAgcmVxLT5jcnlwdGxlbiAtIGF1dGhzaXplLCBpbl9vcHRpb25zKTsKIAllbHNlCi0JCXNnX2NvdW50ID0gZG1hX21hcF9zZyhqcmRldiwgYXJlcS0+c3JjLCBlZGVzYy0+c3JjX25lbnRzID8gOiAxLAotCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOworCQlhcHBlbmRfc2VxX2luX3B0cihkZXNjLCBzcmNfZG1hLCByZXEtPmFzc29jbGVuICsgaXZzaXplICsKKwkJCQkgIHJlcS0+Y3J5cHRsZW4sIGluX29wdGlvbnMpOwogCi0JLyogc3RhcnQgYXV0aCBvcGVyYXRpb24gKi8KLQlhcHBlbmRfb3BlcmF0aW9uKGRlc2MsIGN0eC0+Y2xhc3MyX2FsZ190eXBlIHwgT1BfQUxHX0FTX0lOSVRGSU5BTCB8Ci0JCQkgKGVuY3J5cHQgPyA6IE9QX0FMR19JQ1ZfT04pKTsKLQotCS8qIExvYWQgRklGTyB3aXRoIGRhdGEgZm9yIENsYXNzIDIgQ0hBICovCi0Jb3B0aW9ucyA9IEZJRk9MRF9DTEFTU19DTEFTUzIgfCBGSUZPTERfVFlQRV9NU0c7Ci0JaWYgKCFlZGVzYy0+YXNzb2NfbmVudHMpIHsKLQkJcHRyID0gc2dfZG1hX2FkZHJlc3MoYXJlcS0+YXNzb2MpOwotCX0gZWxzZSB7Ci0JCXNnX3RvX2xpbmtfdGJsKGFyZXEtPmFzc29jLCBlZGVzYy0+YXNzb2NfbmVudHMsCi0JCQkgICAgICAgZWRlc2MtPmxpbmtfdGJsLCAwKTsKLQkJcHRyID0gZWRlc2MtPmxpbmtfdGJsX2RtYTsKLQkJb3B0aW9ucyB8PSBMRFNUX1NHRjsKLQl9Ci0JYXBwZW5kX2ZpZm9fbG9hZChkZXNjLCBwdHIsIGFyZXEtPmFzc29jbGVuLCBvcHRpb25zKTsKLQotCS8qIGNvcHkgaXYgZnJvbSBjaXBoZXIvY2xhc3MxIGlucHV0IGNvbnRleHQgdG8gY2xhc3MyIGluZmlmbyAqLwotCWFwcGVuZF9tb3ZlKGRlc2MsIE1PVkVfU1JDX0NMQVNTMUNUWCB8IE1PVkVfREVTVF9DTEFTUzJJTkZJRk8gfCBpdnNpemUpOwotCi0JaWYgKCFlbmNyeXB0KSB7Ci0JCXUzMiAqanVtcF9jbWQsICp1bmNvbmRfanVtcF9jbWQ7Ci0KLQkJLyogSlVNUCBpZiBzaGFyZWQgKi8KLQkJanVtcF9jbWQgPSBhcHBlbmRfanVtcChkZXNjLCBKVU1QX1RFU1RfQUxMIHwgSlVNUF9DT05EX1NIUkQpOwotCi0JCS8qIHN0YXJ0IGNsYXNzIDEgKGNpcGhlcikgb3BlcmF0aW9uLCBub24tc2hhcmVkIHZlcnNpb24gKi8KLQkJYXBwZW5kX29wZXJhdGlvbihkZXNjLCBjdHgtPmNsYXNzMV9hbGdfdHlwZSB8Ci0JCQkJIE9QX0FMR19BU19JTklURklOQUwpOwotCi0JCXVuY29uZF9qdW1wX2NtZCA9IGFwcGVuZF9qdW1wKGRlc2MsIDApOwotCi0JCXNldF9qdW1wX3RndF9oZXJlKGRlc2MsIGp1bXBfY21kKTsKLQotCQkvKiBzdGFydCBjbGFzcyAxIChjaXBoZXIpIG9wZXJhdGlvbiwgc2hhcmVkIHZlcnNpb24gKi8KLQkJYXBwZW5kX29wZXJhdGlvbihkZXNjLCBjdHgtPmNsYXNzMV9hbGdfdHlwZSB8Ci0JCQkJIE9QX0FMR19BU19JTklURklOQUwgfCBPUF9BTEdfQUFJX0RLKTsKLQkJc2V0X2p1bXBfdGd0X2hlcmUoZGVzYywgdW5jb25kX2p1bXBfY21kKTsKLQl9IGVsc2UKLQkJYXBwZW5kX29wZXJhdGlvbihkZXNjLCBjdHgtPmNsYXNzMV9hbGdfdHlwZSB8Ci0JCQkJIE9QX0FMR19BU19JTklURklOQUwgfCBlbmNyeXB0KTsKLQotCS8qIGxvYWQgcGF5bG9hZCAmIGluc3RydWN0IHRvIGNsYXNzMiB0byBzbm9vcCBjbGFzcyAxIGlmIGVuY3J5cHRpbmcgKi8KLQlvcHRpb25zID0gMDsKLQlpZiAoIWVkZXNjLT5zcmNfbmVudHMpIHsKLQkJc3JjX2RtYSA9IHNnX2RtYV9hZGRyZXNzKGFyZXEtPnNyYyk7Ci0JfSBlbHNlIHsKLQkJc2dfdG9fbGlua190YmwoYXJlcS0+c3JjLCBlZGVzYy0+c3JjX25lbnRzLCBlZGVzYy0+bGlua190YmwgKwotCQkJICAgICAgIGVkZXNjLT5hc3NvY19uZW50cywgMCk7Ci0JCXNyY19kbWEgPSBlZGVzYy0+bGlua190YmxfZG1hICsgZWRlc2MtPmFzc29jX25lbnRzICoKLQkJCSAgc2l6ZW9mKHN0cnVjdCBsaW5rX3RibF9lbnRyeSk7Ci0JCW9wdGlvbnMgfD0gTERTVF9TR0Y7Ci0JfQotCWFwcGVuZF9zZXFfaW5fcHRyKGRlc2MsIHNyY19kbWEsIGFyZXEtPmNyeXB0bGVuICsgYXV0aHNpemUsIG9wdGlvbnMpOwotCWFwcGVuZF9zZXFfZmlmb19sb2FkKGRlc2MsIGFyZXEtPmNyeXB0bGVuLCBGSUZPTERfQ0xBU1NfQk9USCB8Ci0JCQkgICAgIEZJRk9MRF9UWVBFX0xBU1RCT1RIIHwKLQkJCSAgICAgKGVuY3J5cHQgPyBGSUZPTERfVFlQRV9NU0cxT1VUMgotCQkJCSAgICAgIDogRklGT0xEX1RZUEVfTVNHKSk7Ci0KLQkvKiBzcGVjaWZ5IGRlc3RpbmF0aW9uICovCi0JaWYgKGFyZXEtPnNyYyA9PSBhcmVxLT5kc3QpIHsKLQkJZHN0X2RtYSA9IHNyY19kbWE7Ci0JfSBlbHNlIHsKLQkJc2dfY291bnQgPSBkbWFfbWFwX3NnKGpyZGV2LCBhcmVxLT5kc3QsIGVkZXNjLT5kc3RfbmVudHMgPyA6IDEsCi0JCQkJICAgICAgRE1BX0ZST01fREVWSUNFKTsKLQkJaWYgKCFlZGVzYy0+ZHN0X25lbnRzKSB7Ci0JCQlkc3RfZG1hID0gc2dfZG1hX2FkZHJlc3MoYXJlcS0+ZHN0KTsKLQkJCW9wdGlvbnMgPSAwOworCWlmIChsaWtlbHkocmVxLT5zcmMgPT0gcmVxLT5kc3QpKSB7CisJCWlmIChhbGxfY29udGlnKSB7CisJCQlkc3RfZG1hID0gc2dfZG1hX2FkZHJlc3MocmVxLT5zcmMpOwogCQl9IGVsc2UgewotCQkJc2dfdG9fbGlua190YmwoYXJlcS0+ZHN0LCBlZGVzYy0+ZHN0X25lbnRzLAotCQkJCSAgICAgICBlZGVzYy0+bGlua190YmwgKyBlZGVzYy0+YXNzb2NfbmVudHMgKwotCQkJCSAgICAgICBlZGVzYy0+c3JjX25lbnRzLCAwKTsKLQkJCWRzdF9kbWEgPSBlZGVzYy0+bGlua190YmxfZG1hICsgKGVkZXNjLT5hc3NvY19uZW50cyArCi0JCQkJICBlZGVzYy0+c3JjX25lbnRzKSAqCisJCQlkc3RfZG1hID0gc3JjX2RtYSArIHNpemVvZihzdHJ1Y3QgbGlua190YmxfZW50cnkpICoKKwkJCQkgICgoZWRlc2MtPmFzc29jX25lbnRzID8gOiAxKSArIDEpOworCQkJb3V0X29wdGlvbnMgPSBMRFNUX1NHRjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghZWRlc2MtPmRzdF9uZW50cykgeworCQkJZHN0X2RtYSA9IHNnX2RtYV9hZGRyZXNzKHJlcS0+ZHN0KTsKKwkJfSBlbHNlIHsKKwkJCWRzdF9kbWEgPSBlZGVzYy0+bGlua190YmxfZG1hICsKKwkJCQkgIGxpbmtfdGJsX2luZGV4ICoKIAkJCQkgIHNpemVvZihzdHJ1Y3QgbGlua190YmxfZW50cnkpOwotCQkJb3B0aW9ucyA9IExEU1RfU0dGOworCQkJb3V0X29wdGlvbnMgPSBMRFNUX1NHRjsKIAkJfQogCX0KLQlhcHBlbmRfc2VxX291dF9wdHIoZGVzYywgZHN0X2RtYSwgYXJlcS0+Y3J5cHRsZW4gKyBhdXRoc2l6ZSwgb3B0aW9ucyk7Ci0JYXBwZW5kX3NlcV9maWZvX3N0b3JlKGRlc2MsIGFyZXEtPmNyeXB0bGVuLCBGSUZPU1RfVFlQRV9NRVNTQUdFX0RBVEEpOwotCi0JLyogSUNWICovCiAJaWYgKGVuY3J5cHQpCi0JCWFwcGVuZF9zZXFfc3RvcmUoZGVzYywgYXV0aHNpemUsIExEU1RfQ0xBU1NfMl9DQ0IgfAotCQkJCSBMRFNUX1NSQ0RTVF9CWVRFX0NPTlRFWFQpOworCQlhcHBlbmRfc2VxX291dF9wdHIoZGVzYywgZHN0X2RtYSwgcmVxLT5jcnlwdGxlbiwgb3V0X29wdGlvbnMpOwogCWVsc2UKLQkJYXBwZW5kX3NlcV9maWZvX2xvYWQoZGVzYywgYXV0aHNpemUsIEZJRk9MRF9DTEFTU19DTEFTUzIgfAotCQkJCSAgICAgRklGT0xEX1RZUEVfTEFTVDIgfCBGSUZPTERfVFlQRV9JQ1YpOworCQlhcHBlbmRfc2VxX291dF9wdHIoZGVzYywgZHN0X2RtYSwgcmVxLT5jcnlwdGxlbiAtIGF1dGhzaXplLAorCQkJCSAgIG91dF9vcHRpb25zKTsKK30KKworLyoKKyAqIEZpbGwgaW4gYWVhZCBnaXZlbmNyeXB0IGpvYiBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfYWVhZF9naXZfam9iKHUzMiAqc2hfZGVzYywgZG1hX2FkZHJfdCBwdHIsCisJCQkgICAgICBzdHJ1Y3QgYWVhZF9lZGVzYyAqZWRlc2MsCisJCQkgICAgICBzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEsCisJCQkgICAgICBpbnQgY29udGlnKQoreworCXN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOworCXN0cnVjdCBjYWFtX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KGFlYWQpOworCWludCBpdnNpemUgPSBjcnlwdG9fYWVhZF9pdnNpemUoYWVhZCk7CisJaW50IGF1dGhzaXplID0gY3R4LT5hdXRoc2l6ZTsKKwl1MzIgKmRlc2MgPSBlZGVzYy0+aHdfZGVzYzsKKwl1MzIgb3V0X29wdGlvbnMgPSAwLCBpbl9vcHRpb25zOworCWRtYV9hZGRyX3QgZHN0X2RtYSwgc3JjX2RtYTsKKwlpbnQgbGVuLCBsaW5rX3RibF9pbmRleCA9IDA7CiAKICNpZmRlZiBERUJVRwotCWRlYnVnKCJqb2JfZGVzY19sZW4gJWRcbiIsIGRlc2NfbGVuKGRlc2MpKTsKLQlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImpvYmRlc2NAInhzdHIoX19MSU5FX18pIjogIiwKLQkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBkZXNjLCBkZXNjX2J5dGVzKGRlc2MpICwgMSk7Ci0JcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJqZGxpbmt0QCJ4c3RyKF9fTElORV9fKSI6ICIsCi0JCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgZWRlc2MtPmxpbmtfdGJsLAotCQkJZWRlc2MtPmxpbmtfdGJsX2J5dGVzLCAxKTsKKwlkZWJ1ZygiYXNzb2NsZW4gJWQgY3J5cHRsZW4gJWQgYXV0aHNpemUgJWRcbiIsCisJICAgICAgcmVxLT5hc3NvY2xlbiwgcmVxLT5jcnlwdGxlbiwgYXV0aHNpemUpOworCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiYXNzb2MgIEAieHN0cihfX0xJTkVfXykiOiAiLAorCQkgICAgICAgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsIHNnX3ZpcnQocmVxLT5hc3NvYyksCisJCSAgICAgICByZXEtPmFzc29jbGVuICwgMSk7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJwcmVzY2l2QCJ4c3RyKF9fTElORV9fKSI6ICIsCisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgcmVxLT5pdiwgaXZzaXplLCAxKTsKKwlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgInNyYyAgICBAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBzZ192aXJ0KHJlcS0+c3JjKSwKKwkJCWVkZXNjLT5zcmNfbmVudHMgPiAxID8gMTAwIDogcmVxLT5jcnlwdGxlbiwgMSk7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJzaHJkZXNjQCJ4c3RyKF9fTElORV9fKSI6ICIsCisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgc2hfZGVzYywKKwkJICAgICAgIGRlc2NfYnl0ZXMoc2hfZGVzYyksIDEpOwogI2VuZGlmCiAKLQlyZXQgPSBjYWFtX2pyX2VucXVldWUoanJkZXYsIGRlc2MsIGNhbGxiYWNrLCBhcmVxKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gLUVJTlBST0dSRVNTOwotCWVsc2UgewotCQlpcHNlY19lc3BfdW5tYXAoanJkZXYsIGVkZXNjLCBhcmVxKTsKLQkJa2ZyZWUoZWRlc2MpOworCWxlbiA9IGRlc2NfbGVuKHNoX2Rlc2MpOworCWluaXRfam9iX2Rlc2Nfc2hhcmVkKGRlc2MsIHB0ciwgbGVuLCBIRFJfU0hBUkVfREVGRVIgfCBIRFJfUkVWRVJTRSk7CisKKwlpZiAoY29udGlnICYgR0lWX1NSQ19DT05USUcpIHsKKwkJc3JjX2RtYSA9IHNnX2RtYV9hZGRyZXNzKHJlcS0+YXNzb2MpOworCQlpbl9vcHRpb25zID0gMDsKKwl9IGVsc2UgeworCQlzcmNfZG1hID0gZWRlc2MtPmxpbmtfdGJsX2RtYTsKKwkJbGlua190YmxfaW5kZXggKz0gZWRlc2MtPmFzc29jX25lbnRzICsgMSArIGVkZXNjLT5zcmNfbmVudHM7CisJCWluX29wdGlvbnMgPSBMRFNUX1NHRjsKKwl9CisJYXBwZW5kX3NlcV9pbl9wdHIoZGVzYywgc3JjX2RtYSwgcmVxLT5hc3NvY2xlbiArIGl2c2l6ZSArCisJCQkgIHJlcS0+Y3J5cHRsZW4gLSBhdXRoc2l6ZSwgaW5fb3B0aW9ucyk7CisKKwlpZiAoY29udGlnICYgR0lWX0RTVF9DT05USUcpIHsKKwkJZHN0X2RtYSA9IGVkZXNjLT5pdl9kbWE7CisJfSBlbHNlIHsKKwkJaWYgKGxpa2VseShyZXEtPnNyYyA9PSByZXEtPmRzdCkpIHsKKwkJCWRzdF9kbWEgPSBzcmNfZG1hICsgc2l6ZW9mKHN0cnVjdCBsaW5rX3RibF9lbnRyeSkgKgorCQkJCSAgZWRlc2MtPmFzc29jX25lbnRzOworCQkJb3V0X29wdGlvbnMgPSBMRFNUX1NHRjsKKwkJfSBlbHNlIHsKKwkJCWRzdF9kbWEgPSBlZGVzYy0+bGlua190YmxfZG1hICsKKwkJCQkgIGxpbmtfdGJsX2luZGV4ICoKKwkJCQkgIHNpemVvZihzdHJ1Y3QgbGlua190YmxfZW50cnkpOworCQkJb3V0X29wdGlvbnMgPSBMRFNUX1NHRjsKKwkJfQogCX0KIAotCXJldHVybiByZXQ7CisJYXBwZW5kX3NlcV9vdXRfcHRyKGRlc2MsIGRzdF9kbWEsIGl2c2l6ZSArIHJlcS0+Y3J5cHRsZW4sIG91dF9vcHRpb25zKTsKK30KKworLyoKKyAqIEZpbGwgaW4gYWJsa2NpcGhlciBqb2IgZGVzY3JpcHRvcgorICovCitzdGF0aWMgdm9pZCBpbml0X2FibGtjaXBoZXJfam9iKHUzMiAqc2hfZGVzYywgZG1hX2FkZHJfdCBwdHIsCisJCQkJc3RydWN0IGFibGtjaXBoZXJfZWRlc2MgKmVkZXNjLAorCQkJCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcSwKKwkJCQlib29sIGl2X2NvbnRpZykKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmFibGtjaXBoZXIgPSBjcnlwdG9fYWJsa2NpcGhlcl9yZXF0Zm0ocmVxKTsKKwlpbnQgaXZzaXplID0gY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKGFibGtjaXBoZXIpOworCXUzMiAqZGVzYyA9IGVkZXNjLT5od19kZXNjOworCXUzMiBvdXRfb3B0aW9ucyA9IDAsIGluX29wdGlvbnM7CisJZG1hX2FkZHJfdCBkc3RfZG1hLCBzcmNfZG1hOworCWludCBsZW4sIGxpbmtfdGJsX2luZGV4ID0gMDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJwcmVzY2l2QCJ4c3RyKF9fTElORV9fKSI6ICIsCisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgcmVxLT5pbmZvLAorCQkgICAgICAgaXZzaXplLCAxKTsKKwlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgInNyYyAgICBAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBzZ192aXJ0KHJlcS0+c3JjKSwKKwkJICAgICAgIGVkZXNjLT5zcmNfbmVudHMgPyAxMDAgOiByZXEtPm5ieXRlcywgMSk7CisjZW5kaWYKKworCWxlbiA9IGRlc2NfbGVuKHNoX2Rlc2MpOworCWluaXRfam9iX2Rlc2Nfc2hhcmVkKGRlc2MsIHB0ciwgbGVuLCBIRFJfU0hBUkVfREVGRVIgfCBIRFJfUkVWRVJTRSk7CisKKwlpZiAoaXZfY29udGlnKSB7CisJCXNyY19kbWEgPSBlZGVzYy0+aXZfZG1hOworCQlpbl9vcHRpb25zID0gMDsKKwl9IGVsc2UgeworCQlzcmNfZG1hID0gZWRlc2MtPmxpbmtfdGJsX2RtYTsKKwkJbGlua190YmxfaW5kZXggKz0gKGl2X2NvbnRpZyA/IDAgOiAxKSArIGVkZXNjLT5zcmNfbmVudHM7CisJCWluX29wdGlvbnMgPSBMRFNUX1NHRjsKKwl9CisJYXBwZW5kX3NlcV9pbl9wdHIoZGVzYywgc3JjX2RtYSwgcmVxLT5uYnl0ZXMgKyBpdnNpemUsIGluX29wdGlvbnMpOworCisJaWYgKGxpa2VseShyZXEtPnNyYyA9PSByZXEtPmRzdCkpIHsKKwkJaWYgKCFlZGVzYy0+c3JjX25lbnRzICYmIGl2X2NvbnRpZykgeworCQkJZHN0X2RtYSA9IHNnX2RtYV9hZGRyZXNzKHJlcS0+c3JjKTsKKwkJfSBlbHNlIHsKKwkJCWRzdF9kbWEgPSBlZGVzYy0+bGlua190YmxfZG1hICsKKwkJCQlzaXplb2Yoc3RydWN0IGxpbmtfdGJsX2VudHJ5KTsKKwkJCW91dF9vcHRpb25zID0gTERTVF9TR0Y7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWVkZXNjLT5kc3RfbmVudHMpIHsKKwkJCWRzdF9kbWEgPSBzZ19kbWFfYWRkcmVzcyhyZXEtPmRzdCk7CisJCX0gZWxzZSB7CisJCQlkc3RfZG1hID0gZWRlc2MtPmxpbmtfdGJsX2RtYSArCisJCQkJbGlua190YmxfaW5kZXggKiBzaXplb2Yoc3RydWN0IGxpbmtfdGJsX2VudHJ5KTsKKwkJCW91dF9vcHRpb25zID0gTERTVF9TR0Y7CisJCX0KKwl9CisJYXBwZW5kX3NlcV9vdXRfcHRyKGRlc2MsIGRzdF9kbWEsIHJlcS0+bmJ5dGVzLCBvdXRfb3B0aW9ucyk7CiB9CiAKIC8qCiAgKiBkZXJpdmUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHNjYXR0ZXJsaXN0CiAgKi8KLXN0YXRpYyBpbnQgc2dfY291bnQoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19saXN0LCBpbnQgbmJ5dGVzLCBpbnQgKmNoYWluZWQpCitzdGF0aWMgaW50IHNnX2NvdW50KHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfbGlzdCwgaW50IG5ieXRlcykKIHsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gc2dfbGlzdDsKIAlpbnQgc2dfbmVudHMgPSAwOwogCi0JKmNoYWluZWQgPSAwOwogCXdoaWxlIChuYnl0ZXMgPiAwKSB7CiAJCXNnX25lbnRzKys7CiAJCW5ieXRlcyAtPSBzZy0+bGVuZ3RoOwogCQlpZiAoIXNnX2lzX2xhc3Qoc2cpICYmIChzZyArIDEpLT5sZW5ndGggPT0gMCkKLQkJCSpjaGFpbmVkID0gMTsKKwkJCUJVRygpOyAvKiBOb3Qgc3VwcG9ydCBjaGFpbmluZyAqLwogCQlzZyA9IHNjYXR0ZXJ3YWxrX3NnX25leHQoc2cpOwogCX0KIAorCWlmIChsaWtlbHkoc2dfbmVudHMgPT0gMSkpCisJCXJldHVybiAwOworCiAJcmV0dXJuIHNnX25lbnRzOwogfQogCiAvKgotICogYWxsb2NhdGUgYW5kIG1hcCB0aGUgaXBzZWNfZXNwIGV4dGVuZGVkIGRlc2NyaXB0b3IKKyAqIGFsbG9jYXRlIGFuZCBtYXAgdGhlIGFlYWQgZXh0ZW5kZWQgZGVzY3JpcHRvcgogICovCi1zdGF0aWMgc3RydWN0IGlwc2VjX2VzcF9lZGVzYyAqaXBzZWNfZXNwX2VkZXNjX2FsbG9jKHN0cnVjdCBhZWFkX3JlcXVlc3QgKmFyZXEsCi0JCQkJCQkgICAgIGludCBkZXNjX2J5dGVzKQorc3RhdGljIHN0cnVjdCBhZWFkX2VkZXNjICphZWFkX2VkZXNjX2FsbG9jKHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSwKKwkJCQkJICAgaW50IGRlc2NfYnl0ZXMsIGJvb2wgKmFsbF9jb250aWdfcHRyKQogewotCXN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShhcmVxKTsKKwlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKIAlzdHJ1Y3QgY2FhbV9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTsKIAlzdHJ1Y3QgZGV2aWNlICpqcmRldiA9IGN0eC0+anJkZXY7Ci0JZ2ZwX3QgZmxhZ3MgPSBhcmVxLT5iYXNlLmZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQID8gR0ZQX0tFUk5FTCA6Ci0JCSAgICAgIEdGUF9BVE9NSUM7Ci0JaW50IGFzc29jX25lbnRzLCBzcmNfbmVudHMsIGRzdF9uZW50cyA9IDAsIGNoYWluZWQsIGxpbmtfdGJsX2J5dGVzOwotCXN0cnVjdCBpcHNlY19lc3BfZWRlc2MgKmVkZXNjOworCWdmcF90IGZsYWdzID0gKHJlcS0+YmFzZS5mbGFncyAmIChDUllQVE9fVEZNX1JFUV9NQVlfQkFDS0xPRyB8CisJCSAgICAgICBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVApKSA/IEdGUF9LRVJORUwgOiBHRlBfQVRPTUlDOworCWludCBhc3NvY19uZW50cywgc3JjX25lbnRzLCBkc3RfbmVudHMgPSAwOworCXN0cnVjdCBhZWFkX2VkZXNjICplZGVzYzsKKwlkbWFfYWRkcl90IGl2X2RtYSA9IDA7CisJaW50IHNnYzsKKwlib29sIGFsbF9jb250aWcgPSB0cnVlOworCWludCBpdnNpemUgPSBjcnlwdG9fYWVhZF9pdnNpemUoYWVhZCk7CisJaW50IGxpbmtfdGJsX2luZGV4LCBsaW5rX3RibF9sZW4gPSAwLCBsaW5rX3RibF9ieXRlczsKIAotCWFzc29jX25lbnRzID0gc2dfY291bnQoYXJlcS0+YXNzb2MsIGFyZXEtPmFzc29jbGVuLCAmY2hhaW5lZCk7Ci0JQlVHX09OKGNoYWluZWQpOwotCWlmIChsaWtlbHkoYXNzb2NfbmVudHMgPT0gMSkpCi0JCWFzc29jX25lbnRzID0gMDsKKwlhc3NvY19uZW50cyA9IHNnX2NvdW50KHJlcS0+YXNzb2MsIHJlcS0+YXNzb2NsZW4pOworCXNyY19uZW50cyA9IHNnX2NvdW50KHJlcS0+c3JjLCByZXEtPmNyeXB0bGVuKTsKIAotCXNyY19uZW50cyA9IHNnX2NvdW50KGFyZXEtPnNyYywgYXJlcS0+Y3J5cHRsZW4gKyBjdHgtPmF1dGhzaXplLAotCQkJICAgICAmY2hhaW5lZCk7Ci0JQlVHX09OKGNoYWluZWQpOwotCWlmIChzcmNfbmVudHMgPT0gMSkKLQkJc3JjX25lbnRzID0gMDsKKwlpZiAodW5saWtlbHkocmVxLT5kc3QgIT0gcmVxLT5zcmMpKQorCQlkc3RfbmVudHMgPSBzZ19jb3VudChyZXEtPmRzdCwgcmVxLT5jcnlwdGxlbik7CiAKLQlpZiAodW5saWtlbHkoYXJlcS0+ZHN0ICE9IGFyZXEtPnNyYykpIHsKLQkJZHN0X25lbnRzID0gc2dfY291bnQoYXJlcS0+ZHN0LCBhcmVxLT5jcnlwdGxlbiArIGN0eC0+YXV0aHNpemUsCi0JCQkJICAgICAmY2hhaW5lZCk7Ci0JCUJVR19PTihjaGFpbmVkKTsKLQkJaWYgKGRzdF9uZW50cyA9PSAxKQotCQkJZHN0X25lbnRzID0gMDsKKwlzZ2MgPSBkbWFfbWFwX3NnKGpyZGV2LCByZXEtPmFzc29jLCBhc3NvY19uZW50cyA/IDogMSwKKwkJCSBETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKGxpa2VseShyZXEtPnNyYyA9PSByZXEtPmRzdCkpIHsKKwkJc2djID0gZG1hX21hcF9zZyhqcmRldiwgcmVxLT5zcmMsIHNyY19uZW50cyA/IDogMSwKKwkJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworCX0gZWxzZSB7CisJCXNnYyA9IGRtYV9tYXBfc2coanJkZXYsIHJlcS0+c3JjLCBzcmNfbmVudHMgPyA6IDEsCisJCQkJIERNQV9UT19ERVZJQ0UpOworCQlzZ2MgPSBkbWFfbWFwX3NnKGpyZGV2LCByZXEtPmRzdCwgZHN0X25lbnRzID8gOiAxLAorCQkJCSBETUFfRlJPTV9ERVZJQ0UpOwogCX0KIAotCWxpbmtfdGJsX2J5dGVzID0gKGFzc29jX25lbnRzICsgc3JjX25lbnRzICsgZHN0X25lbnRzKSAqCi0JCQkgc2l6ZW9mKHN0cnVjdCBsaW5rX3RibF9lbnRyeSk7Ci0JZGVidWcoImxpbmtfdGJsX2J5dGVzICVkXG4iLCBsaW5rX3RibF9ieXRlcyk7CisJLyogQ2hlY2sgaWYgZGF0YSBhcmUgY29udGlndW91cyAqLworCWl2X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGpyZGV2LCByZXEtPml2LCBpdnNpemUsIERNQV9UT19ERVZJQ0UpOworCWlmIChhc3NvY19uZW50cyB8fCBzZ19kbWFfYWRkcmVzcyhyZXEtPmFzc29jKSArIHJlcS0+YXNzb2NsZW4gIT0KKwkgICAgaXZfZG1hIHx8IHNyY19uZW50cyB8fCBpdl9kbWEgKyBpdnNpemUgIT0KKwkgICAgc2dfZG1hX2FkZHJlc3MocmVxLT5zcmMpKSB7CisJCWFsbF9jb250aWcgPSBmYWxzZTsKKwkJYXNzb2NfbmVudHMgPSBhc3NvY19uZW50cyA/IDogMTsKKwkJc3JjX25lbnRzID0gc3JjX25lbnRzID8gOiAxOworCQlsaW5rX3RibF9sZW4gPSBhc3NvY19uZW50cyArIDEgKyBzcmNfbmVudHM7CisJfQorCWxpbmtfdGJsX2xlbiArPSBkc3RfbmVudHM7CisKKwlsaW5rX3RibF9ieXRlcyA9IGxpbmtfdGJsX2xlbiAqIHNpemVvZihzdHJ1Y3QgbGlua190YmxfZW50cnkpOwogCiAJLyogYWxsb2NhdGUgc3BhY2UgZm9yIGJhc2UgZWRlc2MgYW5kIGh3IGRlc2MgY29tbWFuZHMsIGxpbmsgdGFibGVzICovCi0JZWRlc2MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBzZWNfZXNwX2VkZXNjKSArIGRlc2NfYnl0ZXMgKworCWVkZXNjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFlYWRfZWRlc2MpICsgZGVzY19ieXRlcyArCiAJCQlsaW5rX3RibF9ieXRlcywgR0ZQX0RNQSB8IGZsYWdzKTsKIAlpZiAoIWVkZXNjKSB7CiAJCWRldl9lcnIoanJkZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgZXh0ZW5kZWQgZGVzY3JpcHRvclxuIik7CkBAIC03NTMsMTQyICsxMzU0LDQ1MCBAQAogCWVkZXNjLT5hc3NvY19uZW50cyA9IGFzc29jX25lbnRzOwogCWVkZXNjLT5zcmNfbmVudHMgPSBzcmNfbmVudHM7CiAJZWRlc2MtPmRzdF9uZW50cyA9IGRzdF9uZW50czsKLQllZGVzYy0+bGlua190YmwgPSAodm9pZCAqKWVkZXNjICsgc2l6ZW9mKHN0cnVjdCBpcHNlY19lc3BfZWRlc2MpICsKKwllZGVzYy0+aXZfZG1hID0gaXZfZG1hOworCWVkZXNjLT5saW5rX3RibF9ieXRlcyA9IGxpbmtfdGJsX2J5dGVzOworCWVkZXNjLT5saW5rX3RibCA9ICh2b2lkICopZWRlc2MgKyBzaXplb2Yoc3RydWN0IGFlYWRfZWRlc2MpICsKIAkJCSAgZGVzY19ieXRlczsKIAllZGVzYy0+bGlua190YmxfZG1hID0gZG1hX21hcF9zaW5nbGUoanJkZXYsIGVkZXNjLT5saW5rX3RibCwKIAkJCQkJICAgICBsaW5rX3RibF9ieXRlcywgRE1BX1RPX0RFVklDRSk7Ci0JZWRlc2MtPmxpbmtfdGJsX2J5dGVzID0gbGlua190YmxfYnl0ZXM7CisJKmFsbF9jb250aWdfcHRyID0gYWxsX2NvbnRpZzsKKworCWxpbmtfdGJsX2luZGV4ID0gMDsKKwlpZiAoIWFsbF9jb250aWcpIHsKKwkJc2dfdG9fbGlua190YmwocmVxLT5hc3NvYywKKwkJCSAgICAgICAoYXNzb2NfbmVudHMgPyA6IDEpLAorCQkJICAgICAgIGVkZXNjLT5saW5rX3RibCArCisJCQkgICAgICAgbGlua190YmxfaW5kZXgsIDApOworCQlsaW5rX3RibF9pbmRleCArPSBhc3NvY19uZW50cyA/IDogMTsKKwkJc2dfdG9fbGlua190Ymxfb25lKGVkZXNjLT5saW5rX3RibCArIGxpbmtfdGJsX2luZGV4LAorCQkJCSAgIGl2X2RtYSwgaXZzaXplLCAwKTsKKwkJbGlua190YmxfaW5kZXggKz0gMTsKKwkJc2dfdG9fbGlua190YmxfbGFzdChyZXEtPnNyYywKKwkJCQkgICAgKHNyY19uZW50cyA/IDogMSksCisJCQkJICAgIGVkZXNjLT5saW5rX3RibCArCisJCQkJICAgIGxpbmtfdGJsX2luZGV4LCAwKTsKKwkJbGlua190YmxfaW5kZXggKz0gc3JjX25lbnRzID8gOiAxOworCX0KKwlpZiAoZHN0X25lbnRzKSB7CisJCXNnX3RvX2xpbmtfdGJsX2xhc3QocmVxLT5kc3QsIGRzdF9uZW50cywKKwkJCQkgICAgZWRlc2MtPmxpbmtfdGJsICsgbGlua190YmxfaW5kZXgsIDApOworCX0KIAogCXJldHVybiBlZGVzYzsKIH0KIAotc3RhdGljIGludCBhZWFkX2F1dGhlbmNfZW5jcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICphcmVxKQorc3RhdGljIGludCBhZWFkX2VuY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKQogewotCXN0cnVjdCBpcHNlY19lc3BfZWRlc2MgKmVkZXNjOwotCXN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShhcmVxKTsKLQlzdHJ1Y3QgY2FhbV9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTsKLQlzdHJ1Y3QgZGV2aWNlICpqcmRldiA9IGN0eC0+anJkZXY7Ci0JaW50IGl2c2l6ZSA9IGNyeXB0b19hZWFkX2l2c2l6ZShhZWFkKTsKLQl1MzIgKmRlc2M7Ci0JZG1hX2FkZHJfdCBpdl9kbWE7Ci0KLQkvKiBhbGxvY2F0ZSBleHRlbmRlZCBkZXNjcmlwdG9yICovCi0JZWRlc2MgPSBpcHNlY19lc3BfZWRlc2NfYWxsb2MoYXJlcSwgREVTQ19BRUFEX0VOQ1JZUFRfVEVYVF9MRU4gKgotCQkJCSAgICAgIENBQU1fQ01EX1NaKTsKLQlpZiAoSVNfRVJSKGVkZXNjKSkKLQkJcmV0dXJuIFBUUl9FUlIoZWRlc2MpOwotCi0JZGVzYyA9IGVkZXNjLT5od19kZXNjOwotCi0JLyogaW5zZXJ0IHNoYXJlZCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KLQlpbml0X2pvYl9kZXNjX3NoYXJlZChkZXNjLCBjdHgtPnNoYXJlZF9kZXNjX3BoeXMsCi0JCQkgICAgIGRlc2NfbGVuKGN0eC0+c2hfZGVzYyksIEhEUl9TSEFSRV9ERUZFUik7Ci0KLQlpdl9kbWEgPSBkbWFfbWFwX3NpbmdsZShqcmRldiwgYXJlcS0+aXYsIGl2c2l6ZSwgRE1BX1RPX0RFVklDRSk7Ci0JLyogY2hlY2sgZG1hIGVycm9yICovCi0KLQlhcHBlbmRfbG9hZChkZXNjLCBpdl9kbWEsIGl2c2l6ZSwKLQkJICAgIExEU1RfQ0xBU1NfMV9DQ0IgfCBMRFNUX1NSQ0RTVF9CWVRFX0NPTlRFWFQpOwotCi0JcmV0dXJuIGlwc2VjX2VzcChlZGVzYywgYXJlcSwgT1BfQUxHX0VOQ1JZUFQsIGlwc2VjX2VzcF9lbmNyeXB0X2RvbmUpOwotfQotCi1zdGF0aWMgaW50IGFlYWRfYXV0aGVuY19kZWNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKLXsKKwlzdHJ1Y3QgYWVhZF9lZGVzYyAqZWRlc2M7CiAJc3RydWN0IGNyeXB0b19hZWFkICphZWFkID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7Ci0JaW50IGl2c2l6ZSA9IGNyeXB0b19hZWFkX2l2c2l6ZShhZWFkKTsKIAlzdHJ1Y3QgY2FhbV9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTsKIAlzdHJ1Y3QgZGV2aWNlICpqcmRldiA9IGN0eC0+anJkZXY7Ci0Jc3RydWN0IGlwc2VjX2VzcF9lZGVzYyAqZWRlc2M7CisJYm9vbCBhbGxfY29udGlnOwogCXUzMiAqZGVzYzsKLQlkbWFfYWRkcl90IGl2X2RtYTsKKwlpbnQgcmV0ID0gMDsKIAotCXJlcS0+Y3J5cHRsZW4gLT0gY3R4LT5hdXRoc2l6ZTsKKwlyZXEtPmNyeXB0bGVuICs9IGN0eC0+YXV0aHNpemU7CiAKIAkvKiBhbGxvY2F0ZSBleHRlbmRlZCBkZXNjcmlwdG9yICovCi0JZWRlc2MgPSBpcHNlY19lc3BfZWRlc2NfYWxsb2MocmVxLCBERVNDX0FFQURfREVDUllQVF9URVhUX0xFTiAqCi0JCQkJICAgICAgQ0FBTV9DTURfU1opOworCWVkZXNjID0gYWVhZF9lZGVzY19hbGxvYyhyZXEsIERFU0NfSk9CX0lPX0xFTiAqCisJCQkJIENBQU1fQ01EX1NaLCAmYWxsX2NvbnRpZyk7CiAJaWYgKElTX0VSUihlZGVzYykpCiAJCXJldHVybiBQVFJfRVJSKGVkZXNjKTsKIAorCS8qIENyZWF0ZSBhbmQgc3VibWl0IGpvYiBkZXNjcmlwdG9yICovCisJaW5pdF9hZWFkX2pvYihjdHgtPnNoX2Rlc2NfZW5jLCBjdHgtPnNoX2Rlc2NfZW5jX2RtYSwgZWRlc2MsIHJlcSwKKwkJICAgICAgYWxsX2NvbnRpZywgdHJ1ZSk7CisjaWZkZWYgREVCVUcKKwlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImFlYWQgam9iZGVzY0AieHN0cihfX0xJTkVfXykiOiAiLAorCQkgICAgICAgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsIGVkZXNjLT5od19kZXNjLAorCQkgICAgICAgZGVzY19ieXRlcyhlZGVzYy0+aHdfZGVzYyksIDEpOworI2VuZGlmCisKIAlkZXNjID0gZWRlc2MtPmh3X2Rlc2M7CisJcmV0ID0gY2FhbV9qcl9lbnF1ZXVlKGpyZGV2LCBkZXNjLCBhZWFkX2VuY3J5cHRfZG9uZSwgcmVxKTsKKwlpZiAoIXJldCkgeworCQlyZXQgPSAtRUlOUFJPR1JFU1M7CisJfSBlbHNlIHsKKwkJYWVhZF91bm1hcChqcmRldiwgZWRlc2MsIHJlcSk7CisJCWtmcmVlKGVkZXNjKTsKKwl9CiAKLQkvKiBpbnNlcnQgc2hhcmVkIGRlc2NyaXB0b3IgcG9pbnRlciAqLwotCWluaXRfam9iX2Rlc2Nfc2hhcmVkKGRlc2MsIGN0eC0+c2hhcmVkX2Rlc2NfcGh5cywKLQkJCSAgICAgZGVzY19sZW4oY3R4LT5zaF9kZXNjKSwgSERSX1NIQVJFX0RFRkVSKTsKLQotCWl2X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGpyZGV2LCByZXEtPml2LCBpdnNpemUsIERNQV9UT19ERVZJQ0UpOwotCS8qIGNoZWNrIGRtYSBlcnJvciAqLwotCi0JYXBwZW5kX2xvYWQoZGVzYywgaXZfZG1hLCBpdnNpemUsCi0JCSAgICBMRFNUX0NMQVNTXzFfQ0NCIHwgTERTVF9TUkNEU1RfQllURV9DT05URVhUKTsKLQotCXJldHVybiBpcHNlY19lc3AoZWRlc2MsIHJlcSwgIU9QX0FMR19FTkNSWVBULCBpcHNlY19lc3BfZGVjcnlwdF9kb25lKTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGFlYWRfYXV0aGVuY19naXZlbmNyeXB0KHN0cnVjdCBhZWFkX2dpdmNyeXB0X3JlcXVlc3QgKnJlcSkKK3N0YXRpYyBpbnQgYWVhZF9kZWNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKIHsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICphcmVxID0gJnJlcS0+YXJlcTsKLQlzdHJ1Y3QgaXBzZWNfZXNwX2VkZXNjICplZGVzYzsKLQlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0oYXJlcSk7CisJc3RydWN0IGFlYWRfZWRlc2MgKmVkZXNjOworCXN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOwogCXN0cnVjdCBjYWFtX2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KGFlYWQpOwogCXN0cnVjdCBkZXZpY2UgKmpyZGV2ID0gY3R4LT5qcmRldjsKLQlpbnQgaXZzaXplID0gY3J5cHRvX2FlYWRfaXZzaXplKGFlYWQpOwotCWRtYV9hZGRyX3QgaXZfZG1hOworCWJvb2wgYWxsX2NvbnRpZzsKIAl1MzIgKmRlc2M7Ci0KLQlpdl9kbWEgPSBkbWFfbWFwX3NpbmdsZShqcmRldiwgcmVxLT5naXYsIGl2c2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKLQotCWRlYnVnKCIlczogZ2l2ICVwXG4iLCBfX2Z1bmNfXywgcmVxLT5naXYpOworCWludCByZXQgPSAwOwogCiAJLyogYWxsb2NhdGUgZXh0ZW5kZWQgZGVzY3JpcHRvciAqLwotCWVkZXNjID0gaXBzZWNfZXNwX2VkZXNjX2FsbG9jKGFyZXEsIERFU0NfQUVBRF9HSVZFTkNSWVBUX1RFWFRfTEVOICoKLQkJCQkgICAgICBDQUFNX0NNRF9TWik7CisJZWRlc2MgPSBhZWFkX2VkZXNjX2FsbG9jKHJlcSwgREVTQ19KT0JfSU9fTEVOICoKKwkJCQkgQ0FBTV9DTURfU1osICZhbGxfY29udGlnKTsKIAlpZiAoSVNfRVJSKGVkZXNjKSkKIAkJcmV0dXJuIFBUUl9FUlIoZWRlc2MpOwogCisjaWZkZWYgREVCVUcKKwlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImRlYyBzcmNAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBzZ192aXJ0KHJlcS0+c3JjKSwKKwkJICAgICAgIHJlcS0+Y3J5cHRsZW4sIDEpOworI2VuZGlmCisKKwkvKiBDcmVhdGUgYW5kIHN1Ym1pdCBqb2IgZGVzY3JpcHRvciovCisJaW5pdF9hZWFkX2pvYihjdHgtPnNoX2Rlc2NfZGVjLAorCQkgICAgICBjdHgtPnNoX2Rlc2NfZGVjX2RtYSwgZWRlc2MsIHJlcSwgYWxsX2NvbnRpZywgZmFsc2UpOworI2lmZGVmIERFQlVHCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJhZWFkIGpvYmRlc2NAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBlZGVzYy0+aHdfZGVzYywKKwkJICAgICAgIGRlc2NfYnl0ZXMoZWRlc2MtPmh3X2Rlc2MpLCAxKTsKKyNlbmRpZgorCiAJZGVzYyA9IGVkZXNjLT5od19kZXNjOworCXJldCA9IGNhYW1fanJfZW5xdWV1ZShqcmRldiwgZGVzYywgYWVhZF9kZWNyeXB0X2RvbmUsIHJlcSk7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gLUVJTlBST0dSRVNTOworCX0gZWxzZSB7CisJCWFlYWRfdW5tYXAoanJkZXYsIGVkZXNjLCByZXEpOworCQlrZnJlZShlZGVzYyk7CisJfQogCi0JLyogaW5zZXJ0IHNoYXJlZCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KLQlpbml0X2pvYl9kZXNjX3NoYXJlZChkZXNjLCBjdHgtPnNoYXJlZF9kZXNjX3BoeXMsCi0JCQkgICAgIGRlc2NfbGVuKGN0eC0+c2hfZGVzYyksIEhEUl9TSEFSRV9ERUZFUik7Ci0KLQkvKgotCSAqIExPQUQgSU1NIEluZm8gRklGTwotCSAqIHRvIERFQ08sIExhc3QsIFBhZGRpbmcsIFJhbmRvbSwgTWVzc2FnZSwgMTYgYnl0ZXMKLQkgKi8KLQlhcHBlbmRfbG9hZF9pbW1fdTMyKGRlc2MsIE5GSUZPRU5UUllfREVTVF9ERUNPIHwgTkZJRk9FTlRSWV9MQzEgfAotCQkJICAgIE5GSUZPRU5UUllfU1RZUEVfUEFEIHwgTkZJRk9FTlRSWV9EVFlQRV9NU0cgfAotCQkJICAgIE5GSUZPRU5UUllfUFRZUEVfUk5EIHwgaXZzaXplLAotCQkJICAgIExEU1RfU1JDRFNUX1dPUkRfSU5GT19GSUZPKTsKLQotCS8qCi0JICogZGlzYWJsZSBpbmZvIGZpZm8gZW50cmllcyBzaW5jZSB0aGUgYWJvdmUgc2VydmVzIGFzIHRoZSBlbnRyeQotCSAqIHRoaXMgd2F5LCB0aGUgTU9WRSBjb21tYW5kIHdvbid0IGdlbmVyYXRlIGFuIGVudHJ5LgotCSAqIE5vdGUgdGhhdCB0aGlzIGlzbid0IHJlcXVpcmVkIGluIG1vcmUgcmVjZW50IHZlcnNpb25zIG9mCi0JICogU0VDIGFzIGEgTU9WRSB0aGF0IGRvZXNuJ3QgZG8gaW5mbyBGSUZPIGVudHJpZXMgaXMgYXZhaWxhYmxlLgotCSAqLwotCWFwcGVuZF9jbWQoZGVzYywgQ01EX0xPQUQgfCBESVNBQkxFX0FVVE9fSU5GT19GSUZPKTsKLQotCS8qIE1PVkUgREVDTyBBbGlnbm1lbnQgLT4gQzEgQ29udGV4dCAxNiBieXRlcyAqLwotCWFwcGVuZF9tb3ZlKGRlc2MsIE1PVkVfU1JDX0lORklGTyB8IE1PVkVfREVTVF9DTEFTUzFDVFggfCBpdnNpemUpOwotCi0JLyogcmUtZW5hYmxlIGluZm8gZmlmbyBlbnRyaWVzICovCi0JYXBwZW5kX2NtZChkZXNjLCBDTURfTE9BRCB8IEVOQUJMRV9BVVRPX0lORk9fRklGTyk7Ci0KLQkvKiBNT1ZFIEMxIENvbnRleHQgLT4gT0ZJRk8gMTYgYnl0ZXMgKi8KLQlhcHBlbmRfbW92ZShkZXNjLCBNT1ZFX1NSQ19DTEFTUzFDVFggfCBNT1ZFX0RFU1RfT1VURklGTyB8IGl2c2l6ZSk7Ci0KLQlhcHBlbmRfZmlmb19zdG9yZShkZXNjLCBpdl9kbWEsIGl2c2l6ZSwgRklGT1NUX1RZUEVfTUVTU0FHRV9EQVRBKTsKLQotCXJldHVybiBpcHNlY19lc3AoZWRlc2MsIGFyZXEsIE9QX0FMR19FTkNSWVBULCBpcHNlY19lc3BfZW5jcnlwdF9kb25lKTsKKwlyZXR1cm4gcmV0OwogfQogCisvKgorICogYWxsb2NhdGUgYW5kIG1hcCB0aGUgYWVhZCBleHRlbmRlZCBkZXNjcmlwdG9yIGZvciBhZWFkIGdpdmVuY3J5cHQKKyAqLworc3RhdGljIHN0cnVjdCBhZWFkX2VkZXNjICphZWFkX2dpdl9lZGVzY19hbGxvYyhzdHJ1Y3QgYWVhZF9naXZjcnlwdF9yZXF1ZXN0CisJCQkJCSAgICAgICAqZ3JlcSwgaW50IGRlc2NfYnl0ZXMsCisJCQkJCSAgICAgICB1MzIgKmNvbnRpZ19wdHIpCit7CisJc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gJmdyZXEtPmFyZXE7CisJc3RydWN0IGNyeXB0b19hZWFkICphZWFkID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7CisJc3RydWN0IGNhYW1fY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoYWVhZCk7CisJc3RydWN0IGRldmljZSAqanJkZXYgPSBjdHgtPmpyZGV2OworCWdmcF90IGZsYWdzID0gKHJlcS0+YmFzZS5mbGFncyAmIChDUllQVE9fVEZNX1JFUV9NQVlfQkFDS0xPRyB8CisJCSAgICAgICBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVApKSA/IEdGUF9LRVJORUwgOiBHRlBfQVRPTUlDOworCWludCBhc3NvY19uZW50cywgc3JjX25lbnRzLCBkc3RfbmVudHMgPSAwOworCXN0cnVjdCBhZWFkX2VkZXNjICplZGVzYzsKKwlkbWFfYWRkcl90IGl2X2RtYSA9IDA7CisJaW50IHNnYzsKKwl1MzIgY29udGlnID0gR0lWX1NSQ19DT05USUcgfCBHSVZfRFNUX0NPTlRJRzsKKwlpbnQgaXZzaXplID0gY3J5cHRvX2FlYWRfaXZzaXplKGFlYWQpOworCWludCBsaW5rX3RibF9pbmRleCwgbGlua190YmxfbGVuID0gMCwgbGlua190YmxfYnl0ZXM7CisKKwlhc3NvY19uZW50cyA9IHNnX2NvdW50KHJlcS0+YXNzb2MsIHJlcS0+YXNzb2NsZW4pOworCXNyY19uZW50cyA9IHNnX2NvdW50KHJlcS0+c3JjLCByZXEtPmNyeXB0bGVuKTsKKworCWlmICh1bmxpa2VseShyZXEtPmRzdCAhPSByZXEtPnNyYykpCisJCWRzdF9uZW50cyA9IHNnX2NvdW50KHJlcS0+ZHN0LCByZXEtPmNyeXB0bGVuKTsKKworCXNnYyA9IGRtYV9tYXBfc2coanJkZXYsIHJlcS0+YXNzb2MsIGFzc29jX25lbnRzID8gOiAxLAorCQkJIERNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAobGlrZWx5KHJlcS0+c3JjID09IHJlcS0+ZHN0KSkgeworCQlzZ2MgPSBkbWFfbWFwX3NnKGpyZGV2LCByZXEtPnNyYywgc3JjX25lbnRzID8gOiAxLAorCQkJCSBETUFfQklESVJFQ1RJT05BTCk7CisJfSBlbHNlIHsKKwkJc2djID0gZG1hX21hcF9zZyhqcmRldiwgcmVxLT5zcmMsIHNyY19uZW50cyA/IDogMSwKKwkJCQkgRE1BX1RPX0RFVklDRSk7CisJCXNnYyA9IGRtYV9tYXBfc2coanJkZXYsIHJlcS0+ZHN0LCBkc3RfbmVudHMgPyA6IDEsCisJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJfQorCisJLyogQ2hlY2sgaWYgZGF0YSBhcmUgY29udGlndW91cyAqLworCWl2X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGpyZGV2LCBncmVxLT5naXYsIGl2c2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJaWYgKGFzc29jX25lbnRzIHx8IHNnX2RtYV9hZGRyZXNzKHJlcS0+YXNzb2MpICsgcmVxLT5hc3NvY2xlbiAhPQorCSAgICBpdl9kbWEgfHwgc3JjX25lbnRzIHx8IGl2X2RtYSArIGl2c2l6ZSAhPSBzZ19kbWFfYWRkcmVzcyhyZXEtPnNyYykpCisJCWNvbnRpZyAmPSB+R0lWX1NSQ19DT05USUc7CisJaWYgKGRzdF9uZW50cyB8fCBpdl9kbWEgKyBpdnNpemUgIT0gc2dfZG1hX2FkZHJlc3MocmVxLT5kc3QpKQorCQljb250aWcgJj0gfkdJVl9EU1RfQ09OVElHOworCQlpZiAodW5saWtlbHkocmVxLT5zcmMgIT0gcmVxLT5kc3QpKSB7CisJCQlkc3RfbmVudHMgPSBkc3RfbmVudHMgPyA6IDE7CisJCQlsaW5rX3RibF9sZW4gKz0gMTsKKwkJfQorCWlmICghKGNvbnRpZyAmIEdJVl9TUkNfQ09OVElHKSkgeworCQlhc3NvY19uZW50cyA9IGFzc29jX25lbnRzID8gOiAxOworCQlzcmNfbmVudHMgPSBzcmNfbmVudHMgPyA6IDE7CisJCWxpbmtfdGJsX2xlbiArPSBhc3NvY19uZW50cyArIDEgKyBzcmNfbmVudHM7CisJCWlmIChsaWtlbHkocmVxLT5zcmMgPT0gcmVxLT5kc3QpKQorCQkJY29udGlnICY9IH5HSVZfRFNUX0NPTlRJRzsKKwl9CisJbGlua190YmxfbGVuICs9IGRzdF9uZW50czsKKworCWxpbmtfdGJsX2J5dGVzID0gbGlua190YmxfbGVuICogc2l6ZW9mKHN0cnVjdCBsaW5rX3RibF9lbnRyeSk7CisKKwkvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgYmFzZSBlZGVzYyBhbmQgaHcgZGVzYyBjb21tYW5kcywgbGluayB0YWJsZXMgKi8KKwllZGVzYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZWFkX2VkZXNjKSArIGRlc2NfYnl0ZXMgKworCQkJbGlua190YmxfYnl0ZXMsIEdGUF9ETUEgfCBmbGFncyk7CisJaWYgKCFlZGVzYykgeworCQlkZXZfZXJyKGpyZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIGV4dGVuZGVkIGRlc2NyaXB0b3JcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwllZGVzYy0+YXNzb2NfbmVudHMgPSBhc3NvY19uZW50czsKKwllZGVzYy0+c3JjX25lbnRzID0gc3JjX25lbnRzOworCWVkZXNjLT5kc3RfbmVudHMgPSBkc3RfbmVudHM7CisJZWRlc2MtPml2X2RtYSA9IGl2X2RtYTsKKwllZGVzYy0+bGlua190YmxfYnl0ZXMgPSBsaW5rX3RibF9ieXRlczsKKwllZGVzYy0+bGlua190YmwgPSAodm9pZCAqKWVkZXNjICsgc2l6ZW9mKHN0cnVjdCBhZWFkX2VkZXNjKSArCisJCQkgIGRlc2NfYnl0ZXM7CisJZWRlc2MtPmxpbmtfdGJsX2RtYSA9IGRtYV9tYXBfc2luZ2xlKGpyZGV2LCBlZGVzYy0+bGlua190YmwsCisJCQkJCSAgICAgbGlua190YmxfYnl0ZXMsIERNQV9UT19ERVZJQ0UpOworCSpjb250aWdfcHRyID0gY29udGlnOworCisJbGlua190YmxfaW5kZXggPSAwOworCWlmICghKGNvbnRpZyAmIEdJVl9TUkNfQ09OVElHKSkgeworCQlzZ190b19saW5rX3RibChyZXEtPmFzc29jLCBhc3NvY19uZW50cywKKwkJCSAgICAgICBlZGVzYy0+bGlua190YmwgKworCQkJICAgICAgIGxpbmtfdGJsX2luZGV4LCAwKTsKKwkJbGlua190YmxfaW5kZXggKz0gYXNzb2NfbmVudHM7CisJCXNnX3RvX2xpbmtfdGJsX29uZShlZGVzYy0+bGlua190YmwgKyBsaW5rX3RibF9pbmRleCwKKwkJCQkgICBpdl9kbWEsIGl2c2l6ZSwgMCk7CisJCWxpbmtfdGJsX2luZGV4ICs9IDE7CisJCXNnX3RvX2xpbmtfdGJsX2xhc3QocmVxLT5zcmMsIHNyY19uZW50cywKKwkJCQkgICAgZWRlc2MtPmxpbmtfdGJsICsKKwkJCQkgICAgbGlua190YmxfaW5kZXgsIDApOworCQlsaW5rX3RibF9pbmRleCArPSBzcmNfbmVudHM7CisJfQorCWlmICh1bmxpa2VseShyZXEtPnNyYyAhPSByZXEtPmRzdCAmJiAhKGNvbnRpZyAmIEdJVl9EU1RfQ09OVElHKSkpIHsKKwkJc2dfdG9fbGlua190Ymxfb25lKGVkZXNjLT5saW5rX3RibCArIGxpbmtfdGJsX2luZGV4LAorCQkJCSAgIGl2X2RtYSwgaXZzaXplLCAwKTsKKwkJbGlua190YmxfaW5kZXggKz0gMTsKKwkJc2dfdG9fbGlua190YmxfbGFzdChyZXEtPmRzdCwgZHN0X25lbnRzLAorCQkJCSAgICBlZGVzYy0+bGlua190YmwgKyBsaW5rX3RibF9pbmRleCwgMCk7CisJfQorCisJcmV0dXJuIGVkZXNjOworfQorCitzdGF0aWMgaW50IGFlYWRfZ2l2ZW5jcnlwdChzdHJ1Y3QgYWVhZF9naXZjcnlwdF9yZXF1ZXN0ICphcmVxKQoreworCXN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9ICZhcmVxLT5hcmVxOworCXN0cnVjdCBhZWFkX2VkZXNjICplZGVzYzsKKwlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgY2FhbV9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChhZWFkKTsKKwlzdHJ1Y3QgZGV2aWNlICpqcmRldiA9IGN0eC0+anJkZXY7CisJdTMyIGNvbnRpZzsKKwl1MzIgKmRlc2M7CisJaW50IHJldCA9IDA7CisKKwlyZXEtPmNyeXB0bGVuICs9IGN0eC0+YXV0aHNpemU7CisKKwkvKiBhbGxvY2F0ZSBleHRlbmRlZCBkZXNjcmlwdG9yICovCisJZWRlc2MgPSBhZWFkX2dpdl9lZGVzY19hbGxvYyhhcmVxLCBERVNDX0pPQl9JT19MRU4gKgorCQkJCSAgICAgQ0FBTV9DTURfU1osICZjb250aWcpOworCisJaWYgKElTX0VSUihlZGVzYykpCisJCXJldHVybiBQVFJfRVJSKGVkZXNjKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJnaXYgc3JjQCJ4c3RyKF9fTElORV9fKSI6ICIsCisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgc2dfdmlydChyZXEtPnNyYyksCisJCSAgICAgICByZXEtPmNyeXB0bGVuLCAxKTsKKyNlbmRpZgorCisJLyogQ3JlYXRlIGFuZCBzdWJtaXQgam9iIGRlc2NyaXB0b3IqLworCWluaXRfYWVhZF9naXZfam9iKGN0eC0+c2hfZGVzY19naXZlbmMsCisJCQkgIGN0eC0+c2hfZGVzY19naXZlbmNfZG1hLCBlZGVzYywgcmVxLCBjb250aWcpOworI2lmZGVmIERFQlVHCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJhZWFkIGpvYmRlc2NAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBlZGVzYy0+aHdfZGVzYywKKwkJICAgICAgIGRlc2NfYnl0ZXMoZWRlc2MtPmh3X2Rlc2MpLCAxKTsKKyNlbmRpZgorCisJZGVzYyA9IGVkZXNjLT5od19kZXNjOworCXJldCA9IGNhYW1fanJfZW5xdWV1ZShqcmRldiwgZGVzYywgYWVhZF9lbmNyeXB0X2RvbmUsIHJlcSk7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gLUVJTlBST0dSRVNTOworCX0gZWxzZSB7CisJCWFlYWRfdW5tYXAoanJkZXYsIGVkZXNjLCByZXEpOworCQlrZnJlZShlZGVzYyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGFsbG9jYXRlIGFuZCBtYXAgdGhlIGFibGtjaXBoZXIgZXh0ZW5kZWQgZGVzY3JpcHRvciBmb3IgYWJsa2NpcGhlcgorICovCitzdGF0aWMgc3RydWN0IGFibGtjaXBoZXJfZWRlc2MgKmFibGtjaXBoZXJfZWRlc2NfYWxsb2Moc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdAorCQkJCQkJICAgICAgICpyZXEsIGludCBkZXNjX2J5dGVzLAorCQkJCQkJICAgICAgIGJvb2wgKml2X2NvbnRpZ19vdXQpCit7CisJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICphYmxrY2lwaGVyID0gY3J5cHRvX2FibGtjaXBoZXJfcmVxdGZtKHJlcSk7CisJc3RydWN0IGNhYW1fY3R4ICpjdHggPSBjcnlwdG9fYWJsa2NpcGhlcl9jdHgoYWJsa2NpcGhlcik7CisJc3RydWN0IGRldmljZSAqanJkZXYgPSBjdHgtPmpyZGV2OworCWdmcF90IGZsYWdzID0gKHJlcS0+YmFzZS5mbGFncyAmIChDUllQVE9fVEZNX1JFUV9NQVlfQkFDS0xPRyB8CisJCQkJCSAgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQKSkgPworCQkgICAgICAgR0ZQX0tFUk5FTCA6IEdGUF9BVE9NSUM7CisJaW50IHNyY19uZW50cywgZHN0X25lbnRzID0gMCwgbGlua190YmxfYnl0ZXM7CisJc3RydWN0IGFibGtjaXBoZXJfZWRlc2MgKmVkZXNjOworCWRtYV9hZGRyX3QgaXZfZG1hID0gMDsKKwlib29sIGl2X2NvbnRpZyA9IGZhbHNlOworCWludCBzZ2M7CisJaW50IGl2c2l6ZSA9IGNyeXB0b19hYmxrY2lwaGVyX2l2c2l6ZShhYmxrY2lwaGVyKTsKKwlpbnQgbGlua190YmxfaW5kZXg7CisKKwlzcmNfbmVudHMgPSBzZ19jb3VudChyZXEtPnNyYywgcmVxLT5uYnl0ZXMpOworCisJaWYgKHVubGlrZWx5KHJlcS0+ZHN0ICE9IHJlcS0+c3JjKSkKKwkJZHN0X25lbnRzID0gc2dfY291bnQocmVxLT5kc3QsIHJlcS0+bmJ5dGVzKTsKKworCWlmIChsaWtlbHkocmVxLT5zcmMgPT0gcmVxLT5kc3QpKSB7CisJCXNnYyA9IGRtYV9tYXBfc2coanJkZXYsIHJlcS0+c3JjLCBzcmNfbmVudHMgPyA6IDEsCisJCQkJIERNQV9CSURJUkVDVElPTkFMKTsKKwl9IGVsc2UgeworCQlzZ2MgPSBkbWFfbWFwX3NnKGpyZGV2LCByZXEtPnNyYywgc3JjX25lbnRzID8gOiAxLAorCQkJCSBETUFfVE9fREVWSUNFKTsKKwkJc2djID0gZG1hX21hcF9zZyhqcmRldiwgcmVxLT5kc3QsIGRzdF9uZW50cyA/IDogMSwKKwkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIGl2IGNhbiBiZSBjb250aWd1b3VzIHdpdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbi4KKwkgKiBJZiBzbywgaW5jbHVkZSBpdC4gSWYgbm90LCBjcmVhdGUgc2NhdHRlcmxpc3QuCisJICovCisJaXZfZG1hID0gZG1hX21hcF9zaW5nbGUoanJkZXYsIHJlcS0+aW5mbywgaXZzaXplLCBETUFfVE9fREVWSUNFKTsKKwlpZiAoIXNyY19uZW50cyAmJiBpdl9kbWEgKyBpdnNpemUgPT0gc2dfZG1hX2FkZHJlc3MocmVxLT5zcmMpKQorCQlpdl9jb250aWcgPSB0cnVlOworCWVsc2UKKwkJc3JjX25lbnRzID0gc3JjX25lbnRzID8gOiAxOworCWxpbmtfdGJsX2J5dGVzID0gKChpdl9jb250aWcgPyAwIDogMSkgKyBzcmNfbmVudHMgKyBkc3RfbmVudHMpICoKKwkJCSBzaXplb2Yoc3RydWN0IGxpbmtfdGJsX2VudHJ5KTsKKworCS8qIGFsbG9jYXRlIHNwYWNlIGZvciBiYXNlIGVkZXNjIGFuZCBodyBkZXNjIGNvbW1hbmRzLCBsaW5rIHRhYmxlcyAqLworCWVkZXNjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFibGtjaXBoZXJfZWRlc2MpICsgZGVzY19ieXRlcyArCisJCQlsaW5rX3RibF9ieXRlcywgR0ZQX0RNQSB8IGZsYWdzKTsKKwlpZiAoIWVkZXNjKSB7CisJCWRldl9lcnIoanJkZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgZXh0ZW5kZWQgZGVzY3JpcHRvclxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWVkZXNjLT5zcmNfbmVudHMgPSBzcmNfbmVudHM7CisJZWRlc2MtPmRzdF9uZW50cyA9IGRzdF9uZW50czsKKwllZGVzYy0+bGlua190YmxfYnl0ZXMgPSBsaW5rX3RibF9ieXRlczsKKwllZGVzYy0+bGlua190YmwgPSAodm9pZCAqKWVkZXNjICsgc2l6ZW9mKHN0cnVjdCBhYmxrY2lwaGVyX2VkZXNjKSArCisJCQkgIGRlc2NfYnl0ZXM7CisKKwlsaW5rX3RibF9pbmRleCA9IDA7CisJaWYgKCFpdl9jb250aWcpIHsKKwkJc2dfdG9fbGlua190Ymxfb25lKGVkZXNjLT5saW5rX3RibCwgaXZfZG1hLCBpdnNpemUsIDApOworCQlzZ190b19saW5rX3RibF9sYXN0KHJlcS0+c3JjLCBzcmNfbmVudHMsCisJCQkJICAgIGVkZXNjLT5saW5rX3RibCArIDEsIDApOworCQlsaW5rX3RibF9pbmRleCArPSAxICsgc3JjX25lbnRzOworCX0KKworCWlmICh1bmxpa2VseShkc3RfbmVudHMpKSB7CisJCXNnX3RvX2xpbmtfdGJsX2xhc3QocmVxLT5kc3QsIGRzdF9uZW50cywKKwkJCWVkZXNjLT5saW5rX3RibCArIGxpbmtfdGJsX2luZGV4LCAwKTsKKwl9CisKKwllZGVzYy0+bGlua190YmxfZG1hID0gZG1hX21hcF9zaW5nbGUoanJkZXYsIGVkZXNjLT5saW5rX3RibCwKKwkJCQkJICAgICBsaW5rX3RibF9ieXRlcywgRE1BX1RPX0RFVklDRSk7CisJZWRlc2MtPml2X2RtYSA9IGl2X2RtYTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJhYmxrY2lwaGVyIGxpbmtfdGJsQCJ4c3RyKF9fTElORV9fKSI6ICIsCisJCSAgICAgICBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwgZWRlc2MtPmxpbmtfdGJsLAorCQkgICAgICAgbGlua190YmxfYnl0ZXMsIDEpOworI2VuZGlmCisKKwkqaXZfY29udGlnX291dCA9IGl2X2NvbnRpZzsKKwlyZXR1cm4gZWRlc2M7Cit9CisKK3N0YXRpYyBpbnQgYWJsa2NpcGhlcl9lbmNyeXB0KHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgYWJsa2NpcGhlcl9lZGVzYyAqZWRlc2M7CisJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICphYmxrY2lwaGVyID0gY3J5cHRvX2FibGtjaXBoZXJfcmVxdGZtKHJlcSk7CisJc3RydWN0IGNhYW1fY3R4ICpjdHggPSBjcnlwdG9fYWJsa2NpcGhlcl9jdHgoYWJsa2NpcGhlcik7CisJc3RydWN0IGRldmljZSAqanJkZXYgPSBjdHgtPmpyZGV2OworCWJvb2wgaXZfY29udGlnOworCXUzMiAqZGVzYzsKKwlpbnQgcmV0ID0gMDsKKworCS8qIGFsbG9jYXRlIGV4dGVuZGVkIGRlc2NyaXB0b3IgKi8KKwllZGVzYyA9IGFibGtjaXBoZXJfZWRlc2NfYWxsb2MocmVxLCBERVNDX0pPQl9JT19MRU4gKgorCQkJCSAgICAgICBDQUFNX0NNRF9TWiwgJml2X2NvbnRpZyk7CisJaWYgKElTX0VSUihlZGVzYykpCisJCXJldHVybiBQVFJfRVJSKGVkZXNjKTsKKworCS8qIENyZWF0ZSBhbmQgc3VibWl0IGpvYiBkZXNjcmlwdG9yKi8KKwlpbml0X2FibGtjaXBoZXJfam9iKGN0eC0+c2hfZGVzY19lbmMsCisJCWN0eC0+c2hfZGVzY19lbmNfZG1hLCBlZGVzYywgcmVxLCBpdl9jb250aWcpOworI2lmZGVmIERFQlVHCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJhYmxrY2lwaGVyIGpvYmRlc2NAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBlZGVzYy0+aHdfZGVzYywKKwkJICAgICAgIGRlc2NfYnl0ZXMoZWRlc2MtPmh3X2Rlc2MpLCAxKTsKKyNlbmRpZgorCWRlc2MgPSBlZGVzYy0+aHdfZGVzYzsKKwlyZXQgPSBjYWFtX2pyX2VucXVldWUoanJkZXYsIGRlc2MsIGFibGtjaXBoZXJfZW5jcnlwdF9kb25lLCByZXEpOworCisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gLUVJTlBST0dSRVNTOworCX0gZWxzZSB7CisJCWFibGtjaXBoZXJfdW5tYXAoanJkZXYsIGVkZXNjLCByZXEpOworCQlrZnJlZShlZGVzYyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhYmxrY2lwaGVyX2RlY3J5cHQoc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBhYmxrY2lwaGVyX2VkZXNjICplZGVzYzsKKwlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmFibGtjaXBoZXIgPSBjcnlwdG9fYWJsa2NpcGhlcl9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgY2FhbV9jdHggKmN0eCA9IGNyeXB0b19hYmxrY2lwaGVyX2N0eChhYmxrY2lwaGVyKTsKKwlzdHJ1Y3QgZGV2aWNlICpqcmRldiA9IGN0eC0+anJkZXY7CisJYm9vbCBpdl9jb250aWc7CisJdTMyICpkZXNjOworCWludCByZXQgPSAwOworCisJLyogYWxsb2NhdGUgZXh0ZW5kZWQgZGVzY3JpcHRvciAqLworCWVkZXNjID0gYWJsa2NpcGhlcl9lZGVzY19hbGxvYyhyZXEsIERFU0NfSk9CX0lPX0xFTiAqCisJCQkJICAgICAgIENBQU1fQ01EX1NaLCAmaXZfY29udGlnKTsKKwlpZiAoSVNfRVJSKGVkZXNjKSkKKwkJcmV0dXJuIFBUUl9FUlIoZWRlc2MpOworCisJLyogQ3JlYXRlIGFuZCBzdWJtaXQgam9iIGRlc2NyaXB0b3IqLworCWluaXRfYWJsa2NpcGhlcl9qb2IoY3R4LT5zaF9kZXNjX2RlYywKKwkJY3R4LT5zaF9kZXNjX2RlY19kbWEsIGVkZXNjLCByZXEsIGl2X2NvbnRpZyk7CisJZGVzYyA9IGVkZXNjLT5od19kZXNjOworI2lmZGVmIERFQlVHCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJhYmxrY2lwaGVyIGpvYmRlc2NAInhzdHIoX19MSU5FX18pIjogIiwKKwkJICAgICAgIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LCBlZGVzYy0+aHdfZGVzYywKKwkJICAgICAgIGRlc2NfYnl0ZXMoZWRlc2MtPmh3X2Rlc2MpLCAxKTsKKyNlbmRpZgorCisJcmV0ID0gY2FhbV9qcl9lbnF1ZXVlKGpyZGV2LCBkZXNjLCBhYmxrY2lwaGVyX2RlY3J5cHRfZG9uZSwgcmVxKTsKKwlpZiAoIXJldCkgeworCQlyZXQgPSAtRUlOUFJPR1JFU1M7CisJfSBlbHNlIHsKKwkJYWJsa2NpcGhlcl91bm1hcChqcmRldiwgZWRlc2MsIHJlcSk7CisJCWtmcmVlKGVkZXNjKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIHRlbXBsYXRlX2FlYWQJCXRlbXBsYXRlX3UuYWVhZAorI2RlZmluZSB0ZW1wbGF0ZV9hYmxrY2lwaGVyCXRlbXBsYXRlX3UuYWJsa2NpcGhlcgogc3RydWN0IGNhYW1fYWxnX3RlbXBsYXRlIHsKIAljaGFyIG5hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CiAJY2hhciBkcml2ZXJfbmFtZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKIAl1bnNpZ25lZCBpbnQgYmxvY2tzaXplOwotCXN0cnVjdCBhZWFkX2FsZyBhZWFkOworCXUzMiB0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IGFibGtjaXBoZXJfYWxnIGFibGtjaXBoZXI7CisJCXN0cnVjdCBhZWFkX2FsZyBhZWFkOworCQlzdHJ1Y3QgYmxrY2lwaGVyX2FsZyBibGtjaXBoZXI7CisJCXN0cnVjdCBjaXBoZXJfYWxnIGNpcGhlcjsKKwkJc3RydWN0IGNvbXByZXNzX2FsZyBjb21wcmVzczsKKwkJc3RydWN0IHJuZ19hbGcgcm5nOworCX0gdGVtcGxhdGVfdTsKIAl1MzIgY2xhc3MxX2FsZ190eXBlOwogCXUzMiBjbGFzczJfYWxnX3R5cGU7CiAJdTMyIGFsZ19vcDsKQEAgLTkwMCwxMiArMTgwOSwxMyBAQAogCQkubmFtZSA9ICJhdXRoZW5jKGhtYWMoc2hhMSksY2JjKGFlcykpIiwKIAkJLmRyaXZlcl9uYW1lID0gImF1dGhlbmMtaG1hYy1zaGExLWNiYy1hZXMtY2FhbSIsCiAJCS5ibG9ja3NpemUgPSBBRVNfQkxPQ0tfU0laRSwKLQkJLmFlYWQgPSB7Ci0JCQkuc2V0a2V5ID0gYWVhZF9hdXRoZW5jX3NldGtleSwKLQkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfYXV0aGVuY19zZXRhdXRoc2l6ZSwKLQkJCS5lbmNyeXB0ID0gYWVhZF9hdXRoZW5jX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfYXV0aGVuY19kZWNyeXB0LAotCQkJLmdpdmVuY3J5cHQgPSBhZWFkX2F1dGhlbmNfZ2l2ZW5jcnlwdCwKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUVBRCwKKwkJLnRlbXBsYXRlX2FlYWQgPSB7CisJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCisJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAorCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKKwkJCS5naXZlbmNyeXB0ID0gYWVhZF9naXZlbmNyeXB0LAogCQkJLmdlbml2ID0gIjxidWlsdC1pbj4iLAogCQkJLml2c2l6ZSA9IEFFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMV9ESUdFU1RfU0laRSwKQEAgLTkxOCwxMiArMTgyOCwxMyBAQAogCQkubmFtZSA9ICJhdXRoZW5jKGhtYWMoc2hhMjU2KSxjYmMoYWVzKSkiLAogCQkuZHJpdmVyX25hbWUgPSAiYXV0aGVuYy1obWFjLXNoYTI1Ni1jYmMtYWVzLWNhYW0iLAogCQkuYmxvY2tzaXplID0gQUVTX0JMT0NLX1NJWkUsCi0JCS5hZWFkID0gewotCQkJLnNldGtleSA9IGFlYWRfYXV0aGVuY19zZXRrZXksCi0JCQkuc2V0YXV0aHNpemUgPSBhZWFkX2F1dGhlbmNfc2V0YXV0aHNpemUsCi0JCQkuZW5jcnlwdCA9IGFlYWRfYXV0aGVuY19lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2F1dGhlbmNfZGVjcnlwdCwKLQkJCS5naXZlbmNyeXB0ID0gYWVhZF9hdXRoZW5jX2dpdmVuY3J5cHQsCisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FFQUQsCisJCS50ZW1wbGF0ZV9hZWFkID0geworCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAorCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKKwkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCisJCQkuZ2l2ZW5jcnlwdCA9IGFlYWRfZ2l2ZW5jcnlwdCwKIAkJCS5nZW5pdiA9ICI8YnVpbHQtaW4+IiwKIAkJCS5pdnNpemUgPSBBRVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRSwKQEAgLTkzNywxMiArMTg0OCwxMyBAQAogCQkubmFtZSA9ICJhdXRoZW5jKGhtYWMoc2hhNTEyKSxjYmMoYWVzKSkiLAogCQkuZHJpdmVyX25hbWUgPSAiYXV0aGVuYy1obWFjLXNoYTUxMi1jYmMtYWVzLWNhYW0iLAogCQkuYmxvY2tzaXplID0gQUVTX0JMT0NLX1NJWkUsCi0JCS5hZWFkID0gewotCQkJLnNldGtleSA9IGFlYWRfYXV0aGVuY19zZXRrZXksCi0JCQkuc2V0YXV0aHNpemUgPSBhZWFkX2F1dGhlbmNfc2V0YXV0aHNpemUsCi0JCQkuZW5jcnlwdCA9IGFlYWRfYXV0aGVuY19lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2F1dGhlbmNfZGVjcnlwdCwKLQkJCS5naXZlbmNyeXB0ID0gYWVhZF9hdXRoZW5jX2dpdmVuY3J5cHQsCisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FFQUQsCisJCS50ZW1wbGF0ZV9hZWFkID0geworCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAorCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKKwkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCisJCQkuZ2l2ZW5jcnlwdCA9IGFlYWRfZ2l2ZW5jcnlwdCwKIAkJCS5nZW5pdiA9ICI8YnVpbHQtaW4+IiwKIAkJCS5pdnNpemUgPSBBRVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRSwKQEAgLTk1NiwxMiArMTg2OCwxMyBAQAogCQkubmFtZSA9ICJhdXRoZW5jKGhtYWMoc2hhMSksY2JjKGRlczNfZWRlKSkiLAogCQkuZHJpdmVyX25hbWUgPSAiYXV0aGVuYy1obWFjLXNoYTEtY2JjLWRlczNfZWRlLWNhYW0iLAogCQkuYmxvY2tzaXplID0gREVTM19FREVfQkxPQ0tfU0laRSwKLQkJLmFlYWQgPSB7Ci0JCQkuc2V0a2V5ID0gYWVhZF9hdXRoZW5jX3NldGtleSwKLQkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfYXV0aGVuY19zZXRhdXRoc2l6ZSwKLQkJCS5lbmNyeXB0ID0gYWVhZF9hdXRoZW5jX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfYXV0aGVuY19kZWNyeXB0LAotCQkJLmdpdmVuY3J5cHQgPSBhZWFkX2F1dGhlbmNfZ2l2ZW5jcnlwdCwKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUVBRCwKKwkJLnRlbXBsYXRlX2FlYWQgPSB7CisJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCisJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAorCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKKwkJCS5naXZlbmNyeXB0ID0gYWVhZF9naXZlbmNyeXB0LAogCQkJLmdlbml2ID0gIjxidWlsdC1pbj4iLAogCQkJLml2c2l6ZSA9IERFUzNfRURFX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEExX0RJR0VTVF9TSVpFLApAQCAtOTc0LDEyICsxODg3LDEzIEBACiAJCS5uYW1lID0gImF1dGhlbmMoaG1hYyhzaGEyNTYpLGNiYyhkZXMzX2VkZSkpIiwKIAkJLmRyaXZlcl9uYW1lID0gImF1dGhlbmMtaG1hYy1zaGEyNTYtY2JjLWRlczNfZWRlLWNhYW0iLAogCQkuYmxvY2tzaXplID0gREVTM19FREVfQkxPQ0tfU0laRSwKLQkJLmFlYWQgPSB7Ci0JCQkuc2V0a2V5ID0gYWVhZF9hdXRoZW5jX3NldGtleSwKLQkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfYXV0aGVuY19zZXRhdXRoc2l6ZSwKLQkJCS5lbmNyeXB0ID0gYWVhZF9hdXRoZW5jX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfYXV0aGVuY19kZWNyeXB0LAotCQkJLmdpdmVuY3J5cHQgPSBhZWFkX2F1dGhlbmNfZ2l2ZW5jcnlwdCwKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUVBRCwKKwkJLnRlbXBsYXRlX2FlYWQgPSB7CisJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCisJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAorCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKKwkJCS5naXZlbmNyeXB0ID0gYWVhZF9naXZlbmNyeXB0LAogCQkJLmdlbml2ID0gIjxidWlsdC1pbj4iLAogCQkJLml2c2l6ZSA9IERFUzNfRURFX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEyNTZfRElHRVNUX1NJWkUsCkBAIC05OTMsMTIgKzE5MDcsMTMgQEAKIAkJLm5hbWUgPSAiYXV0aGVuYyhobWFjKHNoYTUxMiksY2JjKGRlczNfZWRlKSkiLAogCQkuZHJpdmVyX25hbWUgPSAiYXV0aGVuYy1obWFjLXNoYTUxMi1jYmMtZGVzM19lZGUtY2FhbSIsCiAJCS5ibG9ja3NpemUgPSBERVMzX0VERV9CTE9DS19TSVpFLAotCQkuYWVhZCA9IHsKLQkJCS5zZXRrZXkgPSBhZWFkX2F1dGhlbmNfc2V0a2V5LAotCQkJLnNldGF1dGhzaXplID0gYWVhZF9hdXRoZW5jX3NldGF1dGhzaXplLAotCQkJLmVuY3J5cHQgPSBhZWFkX2F1dGhlbmNfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9hdXRoZW5jX2RlY3J5cHQsCi0JCQkuZ2l2ZW5jcnlwdCA9IGFlYWRfYXV0aGVuY19naXZlbmNyeXB0LAorCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9BRUFELAorCQkudGVtcGxhdGVfYWVhZCA9IHsKKwkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKKwkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCisJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAorCQkJLmdpdmVuY3J5cHQgPSBhZWFkX2dpdmVuY3J5cHQsCiAJCQkuZ2VuaXYgPSAiPGJ1aWx0LWluPiIsCiAJCQkuaXZzaXplID0gREVTM19FREVfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRSwKQEAgLTEwMTIsMTIgKzE5MjcsMTMgQEAKIAkJLm5hbWUgPSAiYXV0aGVuYyhobWFjKHNoYTEpLGNiYyhkZXMpKSIsCiAJCS5kcml2ZXJfbmFtZSA9ICJhdXRoZW5jLWhtYWMtc2hhMS1jYmMtZGVzLWNhYW0iLAogCQkuYmxvY2tzaXplID0gREVTX0JMT0NLX1NJWkUsCi0JCS5hZWFkID0gewotCQkJLnNldGtleSA9IGFlYWRfYXV0aGVuY19zZXRrZXksCi0JCQkuc2V0YXV0aHNpemUgPSBhZWFkX2F1dGhlbmNfc2V0YXV0aHNpemUsCi0JCQkuZW5jcnlwdCA9IGFlYWRfYXV0aGVuY19lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2F1dGhlbmNfZGVjcnlwdCwKLQkJCS5naXZlbmNyeXB0ID0gYWVhZF9hdXRoZW5jX2dpdmVuY3J5cHQsCisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FFQUQsCisJCS50ZW1wbGF0ZV9hZWFkID0geworCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAorCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKKwkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCisJCQkuZ2l2ZW5jcnlwdCA9IGFlYWRfZ2l2ZW5jcnlwdCwKIAkJCS5nZW5pdiA9ICI8YnVpbHQtaW4+IiwKIAkJCS5pdnNpemUgPSBERVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTFfRElHRVNUX1NJWkUsCkBAIC0xMDMwLDEyICsxOTQ2LDEzIEBACiAJCS5uYW1lID0gImF1dGhlbmMoaG1hYyhzaGEyNTYpLGNiYyhkZXMpKSIsCiAJCS5kcml2ZXJfbmFtZSA9ICJhdXRoZW5jLWhtYWMtc2hhMjU2LWNiYy1kZXMtY2FhbSIsCiAJCS5ibG9ja3NpemUgPSBERVNfQkxPQ0tfU0laRSwKLQkJLmFlYWQgPSB7Ci0JCQkuc2V0a2V5ID0gYWVhZF9hdXRoZW5jX3NldGtleSwKLQkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfYXV0aGVuY19zZXRhdXRoc2l6ZSwKLQkJCS5lbmNyeXB0ID0gYWVhZF9hdXRoZW5jX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfYXV0aGVuY19kZWNyeXB0LAotCQkJLmdpdmVuY3J5cHQgPSBhZWFkX2F1dGhlbmNfZ2l2ZW5jcnlwdCwKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUVBRCwKKwkJLnRlbXBsYXRlX2FlYWQgPSB7CisJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCisJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAorCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKKwkJCS5naXZlbmNyeXB0ID0gYWVhZF9naXZlbmNyeXB0LAogCQkJLmdlbml2ID0gIjxidWlsdC1pbj4iLAogCQkJLml2c2l6ZSA9IERFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFLApAQCAtMTA0OSwxMiArMTk2NiwxMyBAQAogCQkubmFtZSA9ICJhdXRoZW5jKGhtYWMoc2hhNTEyKSxjYmMoZGVzKSkiLAogCQkuZHJpdmVyX25hbWUgPSAiYXV0aGVuYy1obWFjLXNoYTUxMi1jYmMtZGVzLWNhYW0iLAogCQkuYmxvY2tzaXplID0gREVTX0JMT0NLX1NJWkUsCi0JCS5hZWFkID0gewotCQkJLnNldGtleSA9IGFlYWRfYXV0aGVuY19zZXRrZXksCi0JCQkuc2V0YXV0aHNpemUgPSBhZWFkX2F1dGhlbmNfc2V0YXV0aHNpemUsCi0JCQkuZW5jcnlwdCA9IGFlYWRfYXV0aGVuY19lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2F1dGhlbmNfZGVjcnlwdCwKLQkJCS5naXZlbmNyeXB0ID0gYWVhZF9hdXRoZW5jX2dpdmVuY3J5cHQsCisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FFQUQsCisJCS50ZW1wbGF0ZV9hZWFkID0geworCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAorCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKKwkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCisJCQkuZ2l2ZW5jcnlwdCA9IGFlYWRfZ2l2ZW5jcnlwdCwKIAkJCS5nZW5pdiA9ICI8YnVpbHQtaW4+IiwKIAkJCS5pdnNpemUgPSBERVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRSwKQEAgLTEwNjQsNiArMTk4Miw1NSBAQAogCQkJCSAgIE9QX0FMR19BQUlfSE1BQ19QUkVDT01QLAogCQkuYWxnX29wID0gT1BfQUxHX0FMR1NFTF9TSEE1MTIgfCBPUF9BTEdfQUFJX0hNQUMsCiAJfSwKKwkvKiBhYmxrY2lwaGVyIGRlc2NyaXB0b3IgKi8KKwl7CisJCS5uYW1lID0gImNiYyhhZXMpIiwKKwkJLmRyaXZlcl9uYW1lID0gImNiYy1hZXMtY2FhbSIsCisJCS5ibG9ja3NpemUgPSBBRVNfQkxPQ0tfU0laRSwKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUJMS0NJUEhFUiwKKwkJLnRlbXBsYXRlX2FibGtjaXBoZXIgPSB7CisJCQkuc2V0a2V5ID0gYWJsa2NpcGhlcl9zZXRrZXksCisJCQkuZW5jcnlwdCA9IGFibGtjaXBoZXJfZW5jcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWJsa2NpcGhlcl9kZWNyeXB0LAorCQkJLmdlbml2ID0gImVzZXFpdiIsCisJCQkubWluX2tleXNpemUgPSBBRVNfTUlOX0tFWV9TSVpFLAorCQkJLm1heF9rZXlzaXplID0gQUVTX01BWF9LRVlfU0laRSwKKwkJCS5pdnNpemUgPSBBRVNfQkxPQ0tfU0laRSwKKwkJCX0sCisJCS5jbGFzczFfYWxnX3R5cGUgPSBPUF9BTEdfQUxHU0VMX0FFUyB8IE9QX0FMR19BQUlfQ0JDLAorCX0sCisJeworCQkubmFtZSA9ICJjYmMoZGVzM19lZGUpIiwKKwkJLmRyaXZlcl9uYW1lID0gImNiYy0zZGVzLWNhYW0iLAorCQkuYmxvY2tzaXplID0gREVTM19FREVfQkxPQ0tfU0laRSwKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUJMS0NJUEhFUiwKKwkJLnRlbXBsYXRlX2FibGtjaXBoZXIgPSB7CisJCQkuc2V0a2V5ID0gYWJsa2NpcGhlcl9zZXRrZXksCisJCQkuZW5jcnlwdCA9IGFibGtjaXBoZXJfZW5jcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWJsa2NpcGhlcl9kZWNyeXB0LAorCQkJLmdlbml2ID0gImVzZXFpdiIsCisJCQkubWluX2tleXNpemUgPSBERVMzX0VERV9LRVlfU0laRSwKKwkJCS5tYXhfa2V5c2l6ZSA9IERFUzNfRURFX0tFWV9TSVpFLAorCQkJLml2c2l6ZSA9IERFUzNfRURFX0JMT0NLX1NJWkUsCisJCQl9LAorCQkuY2xhc3MxX2FsZ190eXBlID0gT1BfQUxHX0FMR1NFTF8zREVTIHwgT1BfQUxHX0FBSV9DQkMsCisJfSwKKwl7CisJCS5uYW1lID0gImNiYyhkZXMpIiwKKwkJLmRyaXZlcl9uYW1lID0gImNiYy1kZXMtY2FhbSIsCisJCS5ibG9ja3NpemUgPSBERVNfQkxPQ0tfU0laRSwKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUJMS0NJUEhFUiwKKwkJLnRlbXBsYXRlX2FibGtjaXBoZXIgPSB7CisJCQkuc2V0a2V5ID0gYWJsa2NpcGhlcl9zZXRrZXksCisJCQkuZW5jcnlwdCA9IGFibGtjaXBoZXJfZW5jcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWJsa2NpcGhlcl9kZWNyeXB0LAorCQkJLmdlbml2ID0gImVzZXFpdiIsCisJCQkubWluX2tleXNpemUgPSBERVNfS0VZX1NJWkUsCisJCQkubWF4X2tleXNpemUgPSBERVNfS0VZX1NJWkUsCisJCQkuaXZzaXplID0gREVTX0JMT0NLX1NJWkUsCisJCQl9LAorCQkuY2xhc3MxX2FsZ190eXBlID0gT1BfQUxHX0FMR1NFTF9ERVMgfCBPUF9BTEdfQUFJX0NCQywKKwl9CiB9OwogCiBzdHJ1Y3QgY2FhbV9jcnlwdG9fYWxnIHsKQEAgLTExMDIsMTYgKzIwNjksMTkgQEAKIHsKIAlzdHJ1Y3QgY2FhbV9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKLQlpZiAoIWRtYV9tYXBwaW5nX2Vycm9yKGN0eC0+anJkZXYsIGN0eC0+c2hhcmVkX2Rlc2NfcGh5cykpCi0JCWRtYV91bm1hcF9zaW5nbGUoY3R4LT5qcmRldiwgY3R4LT5zaGFyZWRfZGVzY19waHlzLAotCQkJCSBkZXNjX2J5dGVzKGN0eC0+c2hfZGVzYyksIERNQV9UT19ERVZJQ0UpOwotCWtmcmVlKGN0eC0+c2hfZGVzYyk7Ci0KLQlpZiAoIWRtYV9tYXBwaW5nX2Vycm9yKGN0eC0+anJkZXYsIGN0eC0+a2V5X3BoeXMpKQotCQlkbWFfdW5tYXBfc2luZ2xlKGN0eC0+anJkZXYsIGN0eC0+a2V5X3BoeXMsCi0JCQkJIGN0eC0+c3BsaXRfa2V5X3BhZF9sZW4gKyBjdHgtPmVuY2tleWxlbiwKKwlpZiAoY3R4LT5zaF9kZXNjX2VuY19kbWEgJiYKKwkgICAgIWRtYV9tYXBwaW5nX2Vycm9yKGN0eC0+anJkZXYsIGN0eC0+c2hfZGVzY19lbmNfZG1hKSkKKwkJZG1hX3VubWFwX3NpbmdsZShjdHgtPmpyZGV2LCBjdHgtPnNoX2Rlc2NfZW5jX2RtYSwKKwkJCQkgZGVzY19ieXRlcyhjdHgtPnNoX2Rlc2NfZW5jKSwgRE1BX1RPX0RFVklDRSk7CisJaWYgKGN0eC0+c2hfZGVzY19kZWNfZG1hICYmCisJICAgICFkbWFfbWFwcGluZ19lcnJvcihjdHgtPmpyZGV2LCBjdHgtPnNoX2Rlc2NfZGVjX2RtYSkpCisJCWRtYV91bm1hcF9zaW5nbGUoY3R4LT5qcmRldiwgY3R4LT5zaF9kZXNjX2RlY19kbWEsCisJCQkJIGRlc2NfYnl0ZXMoY3R4LT5zaF9kZXNjX2RlYyksIERNQV9UT19ERVZJQ0UpOworCWlmIChjdHgtPnNoX2Rlc2NfZ2l2ZW5jX2RtYSAmJgorCSAgICAhZG1hX21hcHBpbmdfZXJyb3IoY3R4LT5qcmRldiwgY3R4LT5zaF9kZXNjX2dpdmVuY19kbWEpKQorCQlkbWFfdW5tYXBfc2luZ2xlKGN0eC0+anJkZXYsIGN0eC0+c2hfZGVzY19naXZlbmNfZG1hLAorCQkJCSBkZXNjX2J5dGVzKGN0eC0+c2hfZGVzY19naXZlbmMpLAogCQkJCSBETUFfVE9fREVWSUNFKTsKLQlrZnJlZShjdHgtPmtleSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjYWFtX2FsZ2FwaV9leGl0KHZvaWQpCkBAIC0xMTc1LDEyICsyMTQ1LDIwIEBACiAJYWxnLT5jcmFfaW5pdCA9IGNhYW1fY3JhX2luaXQ7CiAJYWxnLT5jcmFfZXhpdCA9IGNhYW1fY3JhX2V4aXQ7CiAJYWxnLT5jcmFfcHJpb3JpdHkgPSBDQUFNX0NSQV9QUklPUklUWTsKLQlhbGctPmNyYV9mbGFncyA9IENSWVBUT19BTEdfVFlQRV9BRUFEIHwgQ1JZUFRPX0FMR19BU1lOQzsKIAlhbGctPmNyYV9ibG9ja3NpemUgPSB0ZW1wbGF0ZS0+YmxvY2tzaXplOwogCWFsZy0+Y3JhX2FsaWdubWFzayA9IDA7Ci0JYWxnLT5jcmFfdHlwZSA9ICZjcnlwdG9fYWVhZF90eXBlOwogCWFsZy0+Y3JhX2N0eHNpemUgPSBzaXplb2Yoc3RydWN0IGNhYW1fY3R4KTsKLQlhbGctPmNyYV91LmFlYWQgPSB0ZW1wbGF0ZS0+YWVhZDsKKwlhbGctPmNyYV9mbGFncyA9IENSWVBUT19BTEdfQVNZTkMgfCB0ZW1wbGF0ZS0+dHlwZTsKKwlzd2l0Y2ggKHRlbXBsYXRlLT50eXBlKSB7CisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQUJMS0NJUEhFUjoKKwkJYWxnLT5jcmFfdHlwZSA9ICZjcnlwdG9fYWJsa2NpcGhlcl90eXBlOworCQlhbGctPmNyYV9hYmxrY2lwaGVyID0gdGVtcGxhdGUtPnRlbXBsYXRlX2FibGtjaXBoZXI7CisJCWJyZWFrOworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0FFQUQ6CisJCWFsZy0+Y3JhX3R5cGUgPSAmY3J5cHRvX2FlYWRfdHlwZTsKKwkJYWxnLT5jcmFfYWVhZCA9IHRlbXBsYXRlLT50ZW1wbGF0ZV9hZWFkOworCQlicmVhazsKKwl9CiAKIAl0X2FsZy0+Y2xhc3MxX2FsZ190eXBlID0gdGVtcGxhdGUtPmNsYXNzMV9hbGdfdHlwZTsKIAl0X2FsZy0+Y2xhc3MyX2FsZ190eXBlID0gdGVtcGxhdGUtPmNsYXNzMl9hbGdfdHlwZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NhYW0vY29tcGF0LmggYi9kcml2ZXJzL2NyeXB0by9jYWFtL2NvbXBhdC5oCmluZGV4IDk1MDQ1MDMuLmQzOGYyYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2NhYW0vY29tcGF0LmgKKysrIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jb21wYXQuaApAQCAtMzEsNSArMzEsNiBAQAogI2luY2x1ZGUgPGNyeXB0by9hZWFkLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL2F1dGhlbmMuaD4KICNpbmNsdWRlIDxjcnlwdG8vc2NhdHRlcndhbGsuaD4KKyNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvc2tjaXBoZXIuaD4KIAogI2VuZGlmIC8qICFkZWZpbmVkKENBQU1fQ09NUEFUX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9jYWFtL2N0cmwuYyBiL2RyaXZlcnMvY3J5cHRvL2NhYW0vY3RybC5jCmluZGV4IDkwMDk3MTMuLjczOTg4YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2NhYW0vY3RybC5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NhYW0vY3RybC5jCkBAIC01Miw5ICs1MiwxMSBAQAogCXN0cnVjdCBjYWFtX2N0cmwgX19pb21lbSAqY3RybDsKIAlzdHJ1Y3QgY2FhbV9mdWxsIF9faW9tZW0gKnRvcHJlZ3M7CiAJc3RydWN0IGNhYW1fZHJ2X3ByaXZhdGUgKmN0cmxwcml2OwotCXN0cnVjdCBjYWFtX3BlcmZtb24gKnBlcmZtb247CiAJc3RydWN0IGNhYW1fZGVjbyAqKmRlY287CiAJdTMyIGRlY29udW07CisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJc3RydWN0IGNhYW1fcGVyZm1vbiAqcGVyZm1vbjsKKyNlbmRpZgogCiAJY3RybHByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2FhbV9kcnZfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCWlmICghY3RybHByaXYpCkBAIC0xNjQsNTIgKzE2Niw1MiBAQAogCS8qIENvbnRyb2xsZXItbGV2ZWwgLSBwZXJmb3JtYW5jZSBtb25pdG9yIGNvdW50ZXJzICovCiAJY3RybHByaXYtPmN0bF9ycV9kZXF1ZXVlZCA9CiAJCWRlYnVnZnNfY3JlYXRlX3U2NCgicnFfZGVxdWV1ZWQiLAotCQkJCSAgIFNfSUZDSFIgfCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsCisJCQkJICAgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILAogCQkJCSAgIGN0cmxwcml2LT5jdGwsICZwZXJmbW9uLT5yZXFfZGVxdWV1ZWQpOwogCWN0cmxwcml2LT5jdGxfb2JfZW5jX3JlcSA9CiAJCWRlYnVnZnNfY3JlYXRlX3U2NCgib2JfcnFfZW5jcnlwdGVkIiwKLQkJCQkgICBTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILAorCQkJCSAgIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKIAkJCQkgICBjdHJscHJpdi0+Y3RsLCAmcGVyZm1vbi0+b2JfZW5jX3JlcSk7CiAJY3RybHByaXYtPmN0bF9pYl9kZWNfcmVxID0KIAkJZGVidWdmc19jcmVhdGVfdTY0KCJpYl9ycV9kZWNyeXB0ZWQiLAotCQkJCSAgIFNfSUZDSFIgfCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsCisJCQkJICAgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILAogCQkJCSAgIGN0cmxwcml2LT5jdGwsICZwZXJmbW9uLT5pYl9kZWNfcmVxKTsKIAljdHJscHJpdi0+Y3RsX29iX2VuY19ieXRlcyA9CiAJCWRlYnVnZnNfY3JlYXRlX3U2NCgib2JfYnl0ZXNfZW5jcnlwdGVkIiwKLQkJCQkgICBTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILAorCQkJCSAgIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKIAkJCQkgICBjdHJscHJpdi0+Y3RsLCAmcGVyZm1vbi0+b2JfZW5jX2J5dGVzKTsKIAljdHJscHJpdi0+Y3RsX29iX3Byb3RfYnl0ZXMgPQogCQlkZWJ1Z2ZzX2NyZWF0ZV91NjQoIm9iX2J5dGVzX3Byb3RlY3RlZCIsCi0JCQkJICAgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKKwkJCQkgICBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsCiAJCQkJICAgY3RybHByaXYtPmN0bCwgJnBlcmZtb24tPm9iX3Byb3RfYnl0ZXMpOwogCWN0cmxwcml2LT5jdGxfaWJfZGVjX2J5dGVzID0KIAkJZGVidWdmc19jcmVhdGVfdTY0KCJpYl9ieXRlc19kZWNyeXB0ZWQiLAotCQkJCSAgIFNfSUZDSFIgfCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsCisJCQkJICAgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILAogCQkJCSAgIGN0cmxwcml2LT5jdGwsICZwZXJmbW9uLT5pYl9kZWNfYnl0ZXMpOwogCWN0cmxwcml2LT5jdGxfaWJfdmFsaWRfYnl0ZXMgPQogCQlkZWJ1Z2ZzX2NyZWF0ZV91NjQoImliX2J5dGVzX3ZhbGlkYXRlZCIsCi0JCQkJICAgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKKwkJCQkgICBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsCiAJCQkJICAgY3RybHByaXYtPmN0bCwgJnBlcmZtb24tPmliX3ZhbGlkX2J5dGVzKTsKIAogCS8qIENvbnRyb2xsZXIgbGV2ZWwgLSBnbG9iYWwgc3RhdHVzIHZhbHVlcyAqLwogCWN0cmxwcml2LT5jdGxfZmF1bHRhZGRyID0KIAkJZGVidWdmc19jcmVhdGVfdTY0KCJmYXVsdF9hZGRyIiwKLQkJCQkgICBTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILAorCQkJCSAgIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKIAkJCQkgICBjdHJscHJpdi0+Y3RsLCAmcGVyZm1vbi0+ZmF1bHRhZGRyKTsKIAljdHJscHJpdi0+Y3RsX2ZhdWx0ZGV0YWlsID0KIAkJZGVidWdmc19jcmVhdGVfdTMyKCJmYXVsdF9kZXRhaWwiLAotCQkJCSAgIFNfSUZDSFIgfCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsCisJCQkJICAgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILAogCQkJCSAgIGN0cmxwcml2LT5jdGwsICZwZXJmbW9uLT5mYXVsdGRldGFpbCk7CiAJY3RybHByaXYtPmN0bF9mYXVsdHN0YXR1cyA9CiAJCWRlYnVnZnNfY3JlYXRlX3UzMigiZmF1bHRfc3RhdHVzIiwKLQkJCQkgICBTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILAorCQkJCSAgIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKIAkJCQkgICBjdHJscHJpdi0+Y3RsLCAmcGVyZm1vbi0+c3RhdHVzKTsKIAogCS8qIEludGVybmFsIGNvdmVyaW5nIGtleXMgKHVzZWZ1bCBpbiBub24tc2VjdXJlIG1vZGUgb25seSkgKi8KIAljdHJscHJpdi0+Y3RsX2tla193cmFwLmRhdGEgPSAmY3RybHByaXYtPmN0cmwtPmtla1swXTsKIAljdHJscHJpdi0+Y3RsX2tla193cmFwLnNpemUgPSBLRUtfS0VZX1NJWkUgKiBzaXplb2YodTMyKTsKIAljdHJscHJpdi0+Y3RsX2tlayA9IGRlYnVnZnNfY3JlYXRlX2Jsb2IoImtlayIsCi0JCQkJCQlTX0lGQ0hSIHwgU19JUlVTUiB8CisJCQkJCQlTX0lSVVNSIHwKIAkJCQkJCVNfSVJHUlAgfCBTX0lST1RILAogCQkJCQkJY3RybHByaXYtPmN0bCwKIAkJCQkJCSZjdHJscHJpdi0+Y3RsX2tla193cmFwKTsKQEAgLTIxNyw3ICsyMTksNyBAQAogCWN0cmxwcml2LT5jdGxfdGtla193cmFwLmRhdGEgPSAmY3RybHByaXYtPmN0cmwtPnRrZWtbMF07CiAJY3RybHByaXYtPmN0bF90a2VrX3dyYXAuc2l6ZSA9IEtFS19LRVlfU0laRSAqIHNpemVvZih1MzIpOwogCWN0cmxwcml2LT5jdGxfdGtlayA9IGRlYnVnZnNfY3JlYXRlX2Jsb2IoInRrZWsiLAotCQkJCQkJIFNfSUZDSFIgfCBTX0lSVVNSIHwKKwkJCQkJCSBTX0lSVVNSIHwKIAkJCQkJCSBTX0lSR1JQIHwgU19JUk9USCwKIAkJCQkJCSBjdHJscHJpdi0+Y3RsLAogCQkJCQkJICZjdHJscHJpdi0+Y3RsX3RrZWtfd3JhcCk7CkBAIC0yMjUsNyArMjI3LDcgQEAKIAljdHJscHJpdi0+Y3RsX3Rkc2tfd3JhcC5kYXRhID0gJmN0cmxwcml2LT5jdHJsLT50ZHNrWzBdOwogCWN0cmxwcml2LT5jdGxfdGRza193cmFwLnNpemUgPSBLRUtfS0VZX1NJWkUgKiBzaXplb2YodTMyKTsKIAljdHJscHJpdi0+Y3RsX3Rkc2sgPSBkZWJ1Z2ZzX2NyZWF0ZV9ibG9iKCJ0ZHNrIiwKLQkJCQkJCSBTX0lGQ0hSIHwgU19JUlVTUiB8CisJCQkJCQkgU19JUlVTUiB8CiAJCQkJCQkgU19JUkdSUCB8IFNfSVJPVEgsCiAJCQkJCQkgY3RybHByaXYtPmN0bCwKIAkJCQkJCSAmY3RybHByaXYtPmN0bF90ZHNrX3dyYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2FhbS9kZXNjX2NvbnN0ci5oIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9kZXNjX2NvbnN0ci5oCmluZGV4IDQ2OTE1ODAuLjA5OTEzMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2NhYW0vZGVzY19jb25zdHIuaAorKysgYi9kcml2ZXJzL2NyeXB0by9jYWFtL2Rlc2NfY29uc3RyLmgKQEAgLTksNyArOSw3IEBACiAjZGVmaW5lIElNTUVESUFURSAoMSA8PCAyMykKICNkZWZpbmUgQ0FBTV9DTURfU1ogc2l6ZW9mKHUzMikKICNkZWZpbmUgQ0FBTV9QVFJfU1ogc2l6ZW9mKGRtYV9hZGRyX3QpCi0jZGVmaW5lIENBQU1fREVTQ19CWVRFU19NQVggKENBQU1fQ01EX1NaICogNjQpCisjZGVmaW5lIENBQU1fREVTQ19CWVRFU19NQVggKENBQU1fQ01EX1NaICogTUFYX0NBQU1fREVTQ1NJWkUpCiAKICNpZmRlZiBERUJVRwogI2RlZmluZSBQUklOVF9QT1MgZG8geyBwcmludGsoS0VSTl9ERUJVRyAiJTAyZDogJXNcbiIsIGRlc2NfbGVuKGRlc2MpLFwKQEAgLTE4LDYgKzE4LDkgQEAKICNkZWZpbmUgUFJJTlRfUE9TCiAjZW5kaWYKIAorI2RlZmluZSBTRVRfT0tfUFJPUF9FUlJPUlMgKElNTUVESUFURSB8IExEU1RfQ0xBU1NfREVDTyB8IFwKKwkJCSAgICBMRFNUX1NSQ0RTVF9XT1JEX0RFQ09DVFJMIHwgXAorCQkJICAgIChMRE9GRl9DSEdfU0hBUkVfT0tfUFJPUCA8PCBMRFNUX09GRlNFVF9TSElGVCkpCiAjZGVmaW5lIERJU0FCTEVfQVVUT19JTkZPX0ZJRk8gKElNTUVESUFURSB8IExEU1RfQ0xBU1NfREVDTyB8IFwKIAkJCQlMRFNUX1NSQ0RTVF9XT1JEX0RFQ09DVFJMIHwgXAogCQkJCShMRE9GRl9ESVNBQkxFX0FVVE9fTkZJRk8gPDwgTERTVF9PRkZTRVRfU0hJRlQpKQpAQCAtMjAzLDMgKzIwNiw1NiBAQAogCWFwcGVuZF9jbWQoZGVzYywgaW1tZWRpYXRlKTsgXAogfQogQVBQRU5EX0NNRF9SQVdfSU1NKGxvYWQsIExPQUQsIHUzMik7CisKKy8qCisgKiBBcHBlbmQgbWF0aCBjb21tYW5kLiBPbmx5IHRoZSBsYXN0IHBhcnQgb2YgZGVzdGluYXRpb24gYW5kIHNvdXJjZSBuZWVkIHRvCisgKiBiZSBzcGVjaWZpZWQKKyAqLworI2RlZmluZSBBUFBFTkRfTUFUSChvcCwgZGVzYywgZGVzdCwgc3JjXzAsIHNyY18xLCBsZW4pIFwKK2FwcGVuZF9jbWQoZGVzYywgQ01EX01BVEggfCBNQVRIX0ZVTl8jI29wIHwgTUFUSF9ERVNUXyMjZGVzdCB8IFwKKwkgICBNQVRIX1NSQzBfIyNzcmNfMCB8IE1BVEhfU1JDMV8jI3NyY18xIHwgKHUzMikgKGxlbiAmIE1BVEhfTEVOX01BU0spKTsKKworI2RlZmluZSBhcHBlbmRfbWF0aF9hZGQoZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgbGVuKSBcCisJQVBQRU5EX01BVEgoQURELCBkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBsZW4pCisjZGVmaW5lIGFwcGVuZF9tYXRoX3N1YihkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBsZW4pIFwKKwlBUFBFTkRfTUFUSChTVUIsIGRlc2MsIGRlc3QsIHNyYzAsIHNyYzEsIGxlbikKKyNkZWZpbmUgYXBwZW5kX21hdGhfYWRkX2MoZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgbGVuKSBcCisJQVBQRU5EX01BVEgoQUREQywgZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgbGVuKQorI2RlZmluZSBhcHBlbmRfbWF0aF9zdWJfYihkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBsZW4pIFwKKwlBUFBFTkRfTUFUSChTVUJCLCBkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBsZW4pCisjZGVmaW5lIGFwcGVuZF9tYXRoX2FuZChkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBsZW4pIFwKKwlBUFBFTkRfTUFUSChBTkQsIGRlc2MsIGRlc3QsIHNyYzAsIHNyYzEsIGxlbikKKyNkZWZpbmUgYXBwZW5kX21hdGhfb3IoZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgbGVuKSBcCisJQVBQRU5EX01BVEgoT1IsIGRlc2MsIGRlc3QsIHNyYzAsIHNyYzEsIGxlbikKKyNkZWZpbmUgYXBwZW5kX21hdGhfeG9yKGRlc2MsIGRlc3QsIHNyYzAsIHNyYzEsIGxlbikgXAorCUFQUEVORF9NQVRIKFhPUiwgZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgbGVuKQorI2RlZmluZSBhcHBlbmRfbWF0aF9sc2hpZnQoZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgbGVuKSBcCisJQVBQRU5EX01BVEgoTFNISUZULCBkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBsZW4pCisjZGVmaW5lIGFwcGVuZF9tYXRoX3JzaGlmdChkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBsZW4pIFwKKwlBUFBFTkRfTUFUSChSU0hJRlQsIGRlc2MsIGRlc3QsIHNyYzAsIHNyYzEsIGxlbikKKworLyogRXhhY3RseSBvbmUgc291cmNlIGlzIElNTS4gRGF0YSBpcyBwYXNzZWQgaW4gYXMgdTMyIHZhbHVlICovCisjZGVmaW5lIEFQUEVORF9NQVRIX0lNTV91MzIob3AsIGRlc2MsIGRlc3QsIHNyY18wLCBzcmNfMSwgZGF0YSkgXAorZG8geyBcCisJQVBQRU5EX01BVEgob3AsIGRlc2MsIGRlc3QsIHNyY18wLCBzcmNfMSwgQ0FBTV9DTURfU1opOyBcCisJYXBwZW5kX2NtZChkZXNjLCBkYXRhKTsgXAorfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgYXBwZW5kX21hdGhfYWRkX2ltbV91MzIoZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgZGF0YSkgXAorCUFQUEVORF9NQVRIX0lNTV91MzIoQURELCBkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBkYXRhKQorI2RlZmluZSBhcHBlbmRfbWF0aF9zdWJfaW1tX3UzMihkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBkYXRhKSBcCisJQVBQRU5EX01BVEhfSU1NX3UzMihTVUIsIGRlc2MsIGRlc3QsIHNyYzAsIHNyYzEsIGRhdGEpCisjZGVmaW5lIGFwcGVuZF9tYXRoX2FkZF9jX2ltbV91MzIoZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgZGF0YSkgXAorCUFQUEVORF9NQVRIX0lNTV91MzIoQUREQywgZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgZGF0YSkKKyNkZWZpbmUgYXBwZW5kX21hdGhfc3ViX2JfaW1tX3UzMihkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBkYXRhKSBcCisJQVBQRU5EX01BVEhfSU1NX3UzMihTVUJCLCBkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBkYXRhKQorI2RlZmluZSBhcHBlbmRfbWF0aF9hbmRfaW1tX3UzMihkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBkYXRhKSBcCisJQVBQRU5EX01BVEhfSU1NX3UzMihBTkQsIGRlc2MsIGRlc3QsIHNyYzAsIHNyYzEsIGRhdGEpCisjZGVmaW5lIGFwcGVuZF9tYXRoX29yX2ltbV91MzIoZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgZGF0YSkgXAorCUFQUEVORF9NQVRIX0lNTV91MzIoT1IsIGRlc2MsIGRlc3QsIHNyYzAsIHNyYzEsIGRhdGEpCisjZGVmaW5lIGFwcGVuZF9tYXRoX3hvcl9pbW1fdTMyKGRlc2MsIGRlc3QsIHNyYzAsIHNyYzEsIGRhdGEpIFwKKwlBUFBFTkRfTUFUSF9JTU1fdTMyKFhPUiwgZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgZGF0YSkKKyNkZWZpbmUgYXBwZW5kX21hdGhfbHNoaWZ0X2ltbV91MzIoZGVzYywgZGVzdCwgc3JjMCwgc3JjMSwgZGF0YSkgXAorCUFQUEVORF9NQVRIX0lNTV91MzIoTFNISUZULCBkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBkYXRhKQorI2RlZmluZSBhcHBlbmRfbWF0aF9yc2hpZnRfaW1tX3UzMihkZXNjLCBkZXN0LCBzcmMwLCBzcmMxLCBkYXRhKSBcCisJQVBQRU5EX01BVEhfSU1NX3UzMihSU0hJRlQsIGRlc2MsIGRlc3QsIHNyYzAsIHNyYzEsIGRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9vbWFwLXNoYW0uYyBiL2RyaXZlcnMvY3J5cHRvL29tYXAtc2hhbS5jCmluZGV4IGJhOGYxZWEuLjYzOTlhOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL29tYXAtc2hhbS5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL29tYXAtc2hhbS5jCkBAIC03MiwxNyArNzIsMjAgQEAKIAogI2RlZmluZSBERUZBVUxUX1RJTUVPVVRfSU5URVJWQUwJSFoKIAotI2RlZmluZSBGTEFHU19GSU5VUAkJMHgwMDAyCi0jZGVmaW5lIEZMQUdTX0ZJTkFMCQkweDAwMDQKLSNkZWZpbmUgRkxBR1NfU0cJCTB4MDAwOAotI2RlZmluZSBGTEFHU19TSEExCQkweDAwMTAKLSNkZWZpbmUgRkxBR1NfRE1BX0FDVElWRQkweDAwMjAKLSNkZWZpbmUgRkxBR1NfT1VUUFVUX1JFQURZCTB4MDA0MAotI2RlZmluZSBGTEFHU19JTklUCQkweDAxMDAKLSNkZWZpbmUgRkxBR1NfQ1BVCQkweDAyMDAKLSNkZWZpbmUgRkxBR1NfSE1BQwkJMHgwNDAwCi0jZGVmaW5lIEZMQUdTX0VSUk9SCQkweDA4MDAKLSNkZWZpbmUgRkxBR1NfQlVTWQkJMHgxMDAwCisvKiBtb3N0bHkgZGV2aWNlIGZsYWdzICovCisjZGVmaW5lIEZMQUdTX0JVU1kJCTAKKyNkZWZpbmUgRkxBR1NfRklOQUwJCTEKKyNkZWZpbmUgRkxBR1NfRE1BX0FDVElWRQkyCisjZGVmaW5lIEZMQUdTX09VVFBVVF9SRUFEWQkzCisjZGVmaW5lIEZMQUdTX0lOSVQJCTQKKyNkZWZpbmUgRkxBR1NfQ1BVCQk1CisjZGVmaW5lIEZMQUdTX0RNQV9SRUFEWQkJNgorLyogY29udGV4dCBmbGFncyAqLworI2RlZmluZSBGTEFHU19GSU5VUAkJMTYKKyNkZWZpbmUgRkxBR1NfU0cJCTE3CisjZGVmaW5lIEZMQUdTX1NIQTEJCTE4CisjZGVmaW5lIEZMQUdTX0hNQUMJCTE5CisjZGVmaW5lIEZMQUdTX0VSUk9SCQkyMAogCiAjZGVmaW5lIE9QX1VQREFURQkxCiAjZGVmaW5lIE9QX0ZJTkFMCTIKQEAgLTE0NCw3ICsxNDcsNiBAQAogCWludAkJCWRtYTsKIAlpbnQJCQlkbWFfbGNoOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlkb25lX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CXF1ZXVlX3Rhc2s7CiAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAlzdHJ1Y3QgY3J5cHRvX3F1ZXVlCXF1ZXVlOwpAQCAtMjIzLDcgKzIyNSw3IEBACiAJaWYgKCFoYXNoKQogCQlyZXR1cm47CiAKLQlpZiAobGlrZWx5KGN0eC0+ZmxhZ3MgJiBGTEFHU19TSEExKSkgeworCWlmIChsaWtlbHkoY3R4LT5mbGFncyAmIEJJVChGTEFHU19TSEExKSkpIHsKIAkJLyogU0hBMSByZXN1bHRzIGFyZSBpbiBiaWcgZW5kaWFuICovCiAJCWZvciAoaSA9IDA7IGkgPCBTSEExX0RJR0VTVF9TSVpFIC8gc2l6ZW9mKHUzMik7IGkrKykKIAkJCWhhc2hbaV0gPSBiZTMyX3RvX2NwdShpbltpXSk7CkBAIC0yMzgsNyArMjQwLDcgQEAKIHsKIAljbGtfZW5hYmxlKGRkLT5pY2xrKTsKIAotCWlmICghKGRkLT5mbGFncyAmIEZMQUdTX0lOSVQpKSB7CisJaWYgKCF0ZXN0X2JpdChGTEFHU19JTklULCAmZGQtPmZsYWdzKSkgewogCQlvbWFwX3NoYW1fd3JpdGVfbWFzayhkZCwgU0hBX1JFR19NQVNLLAogCQkJU0hBX1JFR19NQVNLX1NPRlRSRVNFVCwgU0hBX1JFR19NQVNLX1NPRlRSRVNFVCk7CiAKQEAgLTI0Niw3ICsyNDgsNyBAQAogCQkJCQlTSEFfUkVHX1NZU1NUQVRVU19SRVNFVERPTkUpKQogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAKLQkJZGQtPmZsYWdzIHw9IEZMQUdTX0lOSVQ7CisJCXNldF9iaXQoRkxBR1NfSU5JVCwgJmRkLT5mbGFncyk7CiAJCWRkLT5lcnIgPSAwOwogCX0KIApAQCAtMjY5LDcgKzI3MSw3IEBACiAJICogU2V0dGluZyBBTEdPX0NPTlNUIG9ubHkgZm9yIHRoZSBmaXJzdCBpdGVyYXRpb24KIAkgKiBhbmQgQ0xPU0VfSEFTSCBvbmx5IGZvciB0aGUgbGFzdCBvbmUuCiAJICovCi0JaWYgKGN0eC0+ZmxhZ3MgJiBGTEFHU19TSEExKQorCWlmIChjdHgtPmZsYWdzICYgQklUKEZMQUdTX1NIQTEpKQogCQl2YWwgfD0gU0hBX1JFR19DVFJMX0FMR087CiAJaWYgKCFjdHgtPmRpZ2NudCkKIAkJdmFsIHw9IFNIQV9SRUdfQ1RSTF9BTEdPX0NPTlNUOwpAQCAtMzAxLDcgKzMwMyw5IEBACiAJCXJldHVybiAtRVRJTUVET1VUOwogCiAJaWYgKGZpbmFsKQotCQljdHgtPmZsYWdzIHw9IEZMQUdTX0ZJTkFMOyAvKiBjYXRjaCBsYXN0IGludGVycnVwdCAqLworCQlzZXRfYml0KEZMQUdTX0ZJTkFMLCAmZGQtPmZsYWdzKTsgLyogY2F0Y2ggbGFzdCBpbnRlcnJ1cHQgKi8KKworCXNldF9iaXQoRkxBR1NfQ1BVLCAmZGQtPmZsYWdzKTsKIAogCWxlbjMyID0gRElWX1JPVU5EX1VQKGxlbmd0aCwgc2l6ZW9mKHUzMikpOwogCkBAIC0zMzQsOSArMzM4LDkgQEAKIAljdHgtPmRpZ2NudCArPSBsZW5ndGg7CiAKIAlpZiAoZmluYWwpCi0JCWN0eC0+ZmxhZ3MgfD0gRkxBR1NfRklOQUw7IC8qIGNhdGNoIGxhc3QgaW50ZXJydXB0ICovCisJCXNldF9iaXQoRkxBR1NfRklOQUwsICZkZC0+ZmxhZ3MpOyAvKiBjYXRjaCBsYXN0IGludGVycnVwdCAqLwogCi0JZGQtPmZsYWdzIHw9IEZMQUdTX0RNQV9BQ1RJVkU7CisJc2V0X2JpdChGTEFHU19ETUFfQUNUSVZFLCAmZGQtPmZsYWdzKTsKIAogCW9tYXBfc3RhcnRfZG1hKGRkLT5kbWFfbGNoKTsKIApAQCAtMzkyLDcgKzM5Niw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWN0eC0+ZmxhZ3MgJj0gfkZMQUdTX1NHOworCWN0eC0+ZmxhZ3MgJj0gfkJJVChGTEFHU19TRyk7CiAKIAkvKiBuZXh0IGNhbGwgZG9lcyBub3QgZmFpbC4uLiBzbyBubyB1bm1hcCBpbiB0aGUgY2FzZSBvZiBlcnJvciAqLwogCXJldHVybiBvbWFwX3NoYW1feG1pdF9kbWEoZGQsIGN0eC0+ZG1hX2FkZHIsIGxlbmd0aCwgZmluYWwpOwpAQCAtNDA2LDcgKzQxMCw3IEBACiAKIAlvbWFwX3NoYW1fYXBwZW5kX3NnKGN0eCk7CiAKLQlmaW5hbCA9IChjdHgtPmZsYWdzICYgRkxBR1NfRklOVVApICYmICFjdHgtPnRvdGFsOworCWZpbmFsID0gKGN0eC0+ZmxhZ3MgJiBCSVQoRkxBR1NfRklOVVApKSAmJiAhY3R4LT50b3RhbDsKIAogCWRldl9kYmcoZGQtPmRldiwgInNsb3c6IGJ1ZmNudDogJXUsIGRpZ2NudDogJWQsIGZpbmFsOiAlZFxuIiwKIAkJCQkJIGN0eC0+YnVmY250LCBjdHgtPmRpZ2NudCwgZmluYWwpOwpAQCAtNDUyLDcgKzQ1Niw3IEBACiAJbGVuZ3RoID0gbWluKGN0eC0+dG90YWwsIHNnLT5sZW5ndGgpOwogCiAJaWYgKHNnX2lzX2xhc3Qoc2cpKSB7Ci0JCWlmICghKGN0eC0+ZmxhZ3MgJiBGTEFHU19GSU5VUCkpIHsKKwkJaWYgKCEoY3R4LT5mbGFncyAmIEJJVChGTEFHU19GSU5VUCkpKSB7CiAJCQkvKiBub3QgbGFzdCBzZyBtdXN0IGJlIFNIQTFfTUQ1X0JMT0NLX1NJWkUgYWxpZ25lZCAqLwogCQkJdGFpbCA9IGxlbmd0aCAmIChTSEExX01ENV9CTE9DS19TSVpFIC0gMSk7CiAJCQkvKiB3aXRob3V0IGZpbnVwKCkgd2UgbmVlZCBvbmUgYmxvY2sgdG8gY2xvc2UgaGFzaCAqLwpAQCAtNDY3LDEyICs0NzEsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY3R4LT5mbGFncyB8PSBGTEFHU19TRzsKKwljdHgtPmZsYWdzIHw9IEJJVChGTEFHU19TRyk7CiAKIAljdHgtPnRvdGFsIC09IGxlbmd0aDsKIAljdHgtPm9mZnNldCA9IGxlbmd0aDsgLyogb2Zmc2V0IHdoZXJlIHRvIHN0YXJ0IHNsb3cgKi8KIAotCWZpbmFsID0gKGN0eC0+ZmxhZ3MgJiBGTEFHU19GSU5VUCkgJiYgIWN0eC0+dG90YWw7CisJZmluYWwgPSAoY3R4LT5mbGFncyAmIEJJVChGTEFHU19GSU5VUCkpICYmICFjdHgtPnRvdGFsOwogCiAJLyogbmV4dCBjYWxsIGRvZXMgbm90IGZhaWwuLi4gc28gbm8gdW5tYXAgaW4gdGhlIGNhc2Ugb2YgZXJyb3IgKi8KIAlyZXR1cm4gb21hcF9zaGFtX3htaXRfZG1hKGRkLCBzZ19kbWFfYWRkcmVzcyhjdHgtPnNnKSwgbGVuZ3RoLCBmaW5hbCk7CkBAIC00OTUsNyArNDk5LDcgQEAKIAlzdHJ1Y3Qgb21hcF9zaGFtX3JlcWN0eCAqY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgoZGQtPnJlcSk7CiAKIAlvbWFwX3N0b3BfZG1hKGRkLT5kbWFfbGNoKTsKLQlpZiAoY3R4LT5mbGFncyAmIEZMQUdTX1NHKSB7CisJaWYgKGN0eC0+ZmxhZ3MgJiBCSVQoRkxBR1NfU0cpKSB7CiAJCWRtYV91bm1hcF9zZyhkZC0+ZGV2LCBjdHgtPnNnLCAxLCBETUFfVE9fREVWSUNFKTsKIAkJaWYgKGN0eC0+c2ctPmxlbmd0aCA9PSBjdHgtPm9mZnNldCkgewogCQkJY3R4LT5zZyA9IHNnX25leHQoY3R4LT5zZyk7CkBAIC01MzcsMTggKzU0MSwxOCBAQAogCQljcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZSh0Zm0pKTsKIAogCWlmIChjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZSh0Zm0pID09IFNIQTFfRElHRVNUX1NJWkUpCi0JCWN0eC0+ZmxhZ3MgfD0gRkxBR1NfU0hBMTsKKwkJY3R4LT5mbGFncyB8PSBCSVQoRkxBR1NfU0hBMSk7CiAKIAljdHgtPmJ1ZmNudCA9IDA7CiAJY3R4LT5kaWdjbnQgPSAwOwogCWN0eC0+YnVmbGVuID0gQlVGTEVOOwogCi0JaWYgKHRjdHgtPmZsYWdzICYgRkxBR1NfSE1BQykgeworCWlmICh0Y3R4LT5mbGFncyAmIEJJVChGTEFHU19ITUFDKSkgewogCQlzdHJ1Y3Qgb21hcF9zaGFtX2htYWNfY3R4ICpiY3R4ID0gdGN0eC0+YmFzZTsKIAogCQltZW1jcHkoY3R4LT5idWZmZXIsIGJjdHgtPmlwYWQsIFNIQTFfTUQ1X0JMT0NLX1NJWkUpOwogCQljdHgtPmJ1ZmNudCA9IFNIQTFfTUQ1X0JMT0NLX1NJWkU7Ci0JCWN0eC0+ZmxhZ3MgfD0gRkxBR1NfSE1BQzsKKwkJY3R4LT5mbGFncyB8PSBCSVQoRkxBR1NfSE1BQyk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC01NjIsOSArNTY2LDkgQEAKIAlpbnQgZXJyOwogCiAJZGV2X2RiZyhkZC0+ZGV2LCAidXBkYXRlX3JlcTogdG90YWw6ICV1LCBkaWdjbnQ6ICVkLCBmaW51cDogJWRcbiIsCi0JCSBjdHgtPnRvdGFsLCBjdHgtPmRpZ2NudCwgKGN0eC0+ZmxhZ3MgJiBGTEFHU19GSU5VUCkgIT0gMCk7CisJCSBjdHgtPnRvdGFsLCBjdHgtPmRpZ2NudCwgKGN0eC0+ZmxhZ3MgJiBCSVQoRkxBR1NfRklOVVApKSAhPSAwKTsKIAotCWlmIChjdHgtPmZsYWdzICYgRkxBR1NfQ1BVKQorCWlmIChjdHgtPmZsYWdzICYgQklUKEZMQUdTX0NQVSkpCiAJCWVyciA9IG9tYXBfc2hhbV91cGRhdGVfY3B1KGRkKTsKIAllbHNlCiAJCWVyciA9IG9tYXBfc2hhbV91cGRhdGVfZG1hX3N0YXJ0KGRkKTsKQEAgLTYyNCw3ICs2MjgsNyBAQAogCiAJaWYgKGN0eC0+ZGlnY250KSB7CiAJCW9tYXBfc2hhbV9jb3B5X3JlYWR5X2hhc2gocmVxKTsKLQkJaWYgKGN0eC0+ZmxhZ3MgJiBGTEFHU19ITUFDKQorCQlpZiAoY3R4LT5mbGFncyAmIEJJVChGTEFHU19ITUFDKSkKIAkJCWVyciA9IG9tYXBfc2hhbV9maW5pc2hfaG1hYyhyZXEpOwogCX0KIApAQCAtNjM5LDE4ICs2NDMsMjMgQEAKIAlzdHJ1Y3Qgb21hcF9zaGFtX2RldiAqZGQgPSBjdHgtPmRkOwogCiAJaWYgKCFlcnIpIHsKLQkJb21hcF9zaGFtX2NvcHlfaGFzaChjdHgtPmRkLT5yZXEsIDEpOwotCQlpZiAoY3R4LT5mbGFncyAmIEZMQUdTX0ZJTkFMKQorCQlvbWFwX3NoYW1fY29weV9oYXNoKHJlcSwgMSk7CisJCWlmICh0ZXN0X2JpdChGTEFHU19GSU5BTCwgJmRkLT5mbGFncykpCiAJCQllcnIgPSBvbWFwX3NoYW1fZmluaXNoKHJlcSk7CiAJfSBlbHNlIHsKLQkJY3R4LT5mbGFncyB8PSBGTEFHU19FUlJPUjsKKwkJY3R4LT5mbGFncyB8PSBCSVQoRkxBR1NfRVJST1IpOwogCX0KIAorCS8qIGF0b21pYyBvcGVyYXRpb24gaXMgbm90IG5lZWRlZCBoZXJlICovCisJZGQtPmZsYWdzICY9IH4oQklUKEZMQUdTX0JVU1kpIHwgQklUKEZMQUdTX0ZJTkFMKSB8IEJJVChGTEFHU19DUFUpIHwKKwkJCUJJVChGTEFHU19ETUFfUkVBRFkpIHwgQklUKEZMQUdTX09VVFBVVF9SRUFEWSkpOwogCWNsa19kaXNhYmxlKGRkLT5pY2xrKTsKLQlkZC0+ZmxhZ3MgJj0gfkZMQUdTX0JVU1k7CiAKIAlpZiAocmVxLT5iYXNlLmNvbXBsZXRlKQogCQlyZXEtPmJhc2UuY29tcGxldGUoJnJlcS0+YmFzZSwgZXJyKTsKKworCS8qIGhhbmRsZSBuZXcgcmVxdWVzdCAqLworCXRhc2tsZXRfc2NoZWR1bGUoJmRkLT5kb25lX3Rhc2spOwogfQogCiBzdGF0aWMgaW50IG9tYXBfc2hhbV9oYW5kbGVfcXVldWUoc3RydWN0IG9tYXBfc2hhbV9kZXYgKmRkLApAQCAtNjU4LDIxICs2NjcsMjAgQEAKIHsKIAlzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKmFzeW5jX3JlcSwgKmJhY2tsb2c7CiAJc3RydWN0IG9tYXBfc2hhbV9yZXFjdHggKmN0eDsKLQlzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcHJldl9yZXE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyID0gMCwgcmV0ID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZC0+bG9jaywgZmxhZ3MpOwogCWlmIChyZXEpCiAJCXJldCA9IGFoYXNoX2VucXVldWVfcmVxdWVzdCgmZGQtPnF1ZXVlLCByZXEpOwotCWlmIChkZC0+ZmxhZ3MgJiBGTEFHU19CVVNZKSB7CisJaWYgKHRlc3RfYml0KEZMQUdTX0JVU1ksICZkZC0+ZmxhZ3MpKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRkLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiByZXQ7CiAJfQogCWJhY2tsb2cgPSBjcnlwdG9fZ2V0X2JhY2tsb2coJmRkLT5xdWV1ZSk7CiAJYXN5bmNfcmVxID0gY3J5cHRvX2RlcXVldWVfcmVxdWVzdCgmZGQtPnF1ZXVlKTsKIAlpZiAoYXN5bmNfcmVxKQotCQlkZC0+ZmxhZ3MgfD0gRkxBR1NfQlVTWTsKKwkJc2V0X2JpdChGTEFHU19CVVNZLCAmZGQtPmZsYWdzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKCFhc3luY19yZXEpCkBAIC02ODIsMTYgKzY5MCwxMiBAQAogCQliYWNrbG9nLT5jb21wbGV0ZShiYWNrbG9nLCAtRUlOUFJPR1JFU1MpOwogCiAJcmVxID0gYWhhc2hfcmVxdWVzdF9jYXN0KGFzeW5jX3JlcSk7Ci0KLQlwcmV2X3JlcSA9IGRkLT5yZXE7CiAJZGQtPnJlcSA9IHJlcTsKLQogCWN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CiAKIAlkZXZfZGJnKGRkLT5kZXYsICJoYW5kbGluZyBuZXcgcmVxLCBvcDogJWx1LCBuYnl0ZXM6ICVkXG4iLAogCQkJCQkJY3R4LT5vcCwgcmVxLT5uYnl0ZXMpOwogCi0KIAllcnIgPSBvbWFwX3NoYW1faHdfaW5pdChkZCk7CiAJaWYgKGVycikKIAkJZ290byBlcnIxOwpAQCAtNzEyLDE4ICs3MTYsMTYgQEAKIAogCWlmIChjdHgtPm9wID09IE9QX1VQREFURSkgewogCQllcnIgPSBvbWFwX3NoYW1fdXBkYXRlX3JlcShkZCk7Ci0JCWlmIChlcnIgIT0gLUVJTlBST0dSRVNTICYmIChjdHgtPmZsYWdzICYgRkxBR1NfRklOVVApKQorCQlpZiAoZXJyICE9IC1FSU5QUk9HUkVTUyAmJiAoY3R4LT5mbGFncyAmIEJJVChGTEFHU19GSU5VUCkpKQogCQkJLyogbm8gZmluYWwoKSBhZnRlciBmaW51cCgpICovCiAJCQllcnIgPSBvbWFwX3NoYW1fZmluYWxfcmVxKGRkKTsKIAl9IGVsc2UgaWYgKGN0eC0+b3AgPT0gT1BfRklOQUwpIHsKIAkJZXJyID0gb21hcF9zaGFtX2ZpbmFsX3JlcShkZCk7CiAJfQogZXJyMToKLQlpZiAoZXJyICE9IC1FSU5QUk9HUkVTUykgeworCWlmIChlcnIgIT0gLUVJTlBST0dSRVNTKQogCQkvKiBkb25lX3Rhc2sgd2lsbCBub3QgZmluaXNoIGl0LCBzbyBkbyBpdCBoZXJlICovCiAJCW9tYXBfc2hhbV9maW5pc2hfcmVxKHJlcSwgZXJyKTsKLQkJdGFza2xldF9zY2hlZHVsZSgmZGQtPnF1ZXVlX3Rhc2spOwotCX0KIAogCWRldl9kYmcoZGQtPmRldiwgImV4aXQsIGVycjogJWRcbiIsIGVycik7CiAKQEAgLTc1Miw3ICs3NTQsNyBAQAogCWN0eC0+c2cgPSByZXEtPnNyYzsKIAljdHgtPm9mZnNldCA9IDA7CiAKLQlpZiAoY3R4LT5mbGFncyAmIEZMQUdTX0ZJTlVQKSB7CisJaWYgKGN0eC0+ZmxhZ3MgJiBCSVQoRkxBR1NfRklOVVApKSB7CiAJCWlmICgoY3R4LT5kaWdjbnQgKyBjdHgtPmJ1ZmNudCArIGN0eC0+dG90YWwpIDwgOSkgewogCQkJLyoKIAkJCSogT01BUCBIVyBhY2NlbCB3b3JrcyBvbmx5IHdpdGggYnVmZmVycyA+PSA5CkBAIC03NjUsNyArNzY3LDcgQEAKIAkJCS8qCiAJCQkqIGZhc3RlciB0byB1c2UgQ1BVIGZvciBzaG9ydCB0cmFuc2ZlcnMKIAkJCSovCi0JCQljdHgtPmZsYWdzIHw9IEZMQUdTX0NQVTsKKwkJCWN0eC0+ZmxhZ3MgfD0gQklUKEZMQUdTX0NQVSk7CiAJCX0KIAl9IGVsc2UgaWYgKGN0eC0+YnVmY250ICsgY3R4LT50b3RhbCA8IGN0eC0+YnVmbGVuKSB7CiAJCW9tYXBfc2hhbV9hcHBlbmRfc2coY3R4KTsKQEAgLTgwMiw5ICs4MDQsOSBAQAogewogCXN0cnVjdCBvbWFwX3NoYW1fcmVxY3R4ICpjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOwogCi0JY3R4LT5mbGFncyB8PSBGTEFHU19GSU5VUDsKKwljdHgtPmZsYWdzIHw9IEJJVChGTEFHU19GSU5VUCk7CiAKLQlpZiAoY3R4LT5mbGFncyAmIEZMQUdTX0VSUk9SKQorCWlmIChjdHgtPmZsYWdzICYgQklUKEZMQUdTX0VSUk9SKSkKIAkJcmV0dXJuIDA7IC8qIHVuY29tcGxldGVkIGhhc2ggaXMgbm90IG5lZWRlZCAqLwogCiAJLyogT01BUCBIVyBhY2NlbCB3b3JrcyBvbmx5IHdpdGggYnVmZmVycyA+PSA5ICovCkBAIC04MjMsNyArODI1LDcgQEAKIAlzdHJ1Y3Qgb21hcF9zaGFtX3JlcWN0eCAqY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKIAlpbnQgZXJyMSwgZXJyMjsKIAotCWN0eC0+ZmxhZ3MgfD0gRkxBR1NfRklOVVA7CisJY3R4LT5mbGFncyB8PSBCSVQoRkxBR1NfRklOVVApOwogCiAJZXJyMSA9IG9tYXBfc2hhbV91cGRhdGUocmVxKTsKIAlpZiAoZXJyMSA9PSAtRUlOUFJPR1JFU1MgfHwgZXJyMSA9PSAtRUJVU1kpCkBAIC04OTUsNyArODk3LDcgQEAKIAogCWlmIChhbGdfYmFzZSkgewogCQlzdHJ1Y3Qgb21hcF9zaGFtX2htYWNfY3R4ICpiY3R4ID0gdGN0eC0+YmFzZTsKLQkJdGN0eC0+ZmxhZ3MgfD0gRkxBR1NfSE1BQzsKKwkJdGN0eC0+ZmxhZ3MgfD0gQklUKEZMQUdTX0hNQUMpOwogCQliY3R4LT5zaGFzaCA9IGNyeXB0b19hbGxvY19zaGFzaChhbGdfYmFzZSwgMCwKIAkJCQkJCUNSWVBUT19BTEdfTkVFRF9GQUxMQkFDSyk7CiAJCWlmIChJU19FUlIoYmN0eC0+c2hhc2gpKSB7CkBAIC05MzIsNyArOTM0LDcgQEAKIAljcnlwdG9fZnJlZV9zaGFzaCh0Y3R4LT5mYWxsYmFjayk7CiAJdGN0eC0+ZmFsbGJhY2sgPSBOVUxMOwogCi0JaWYgKHRjdHgtPmZsYWdzICYgRkxBR1NfSE1BQykgeworCWlmICh0Y3R4LT5mbGFncyAmIEJJVChGTEFHU19ITUFDKSkgewogCQlzdHJ1Y3Qgb21hcF9zaGFtX2htYWNfY3R4ICpiY3R4ID0gdGN0eC0+YmFzZTsKIAkJY3J5cHRvX2ZyZWVfc2hhc2goYmN0eC0+c2hhc2gpOwogCX0KQEAgLTEwMzYsNTEgKzEwMzgsNDYgQEAKIHN0YXRpYyB2b2lkIG9tYXBfc2hhbV9kb25lX3Rhc2sodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBvbWFwX3NoYW1fZGV2ICpkZCA9IChzdHJ1Y3Qgb21hcF9zaGFtX2RldiAqKWRhdGE7Ci0Jc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSA9IGRkLT5yZXE7Ci0Jc3RydWN0IG9tYXBfc2hhbV9yZXFjdHggKmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7Ci0JaW50IHJlYWR5ID0gMCwgZXJyID0gMDsKKwlpbnQgZXJyID0gMDsKIAotCWlmIChjdHgtPmZsYWdzICYgRkxBR1NfT1VUUFVUX1JFQURZKSB7Ci0JCWN0eC0+ZmxhZ3MgJj0gfkZMQUdTX09VVFBVVF9SRUFEWTsKLQkJcmVhZHkgPSAxOwotCX0KLQotCWlmIChkZC0+ZmxhZ3MgJiBGTEFHU19ETUFfQUNUSVZFKSB7Ci0JCWRkLT5mbGFncyAmPSB+RkxBR1NfRE1BX0FDVElWRTsKLQkJb21hcF9zaGFtX3VwZGF0ZV9kbWFfc3RvcChkZCk7Ci0JCWlmICghZGQtPmVycikKLQkJCWVyciA9IG9tYXBfc2hhbV91cGRhdGVfZG1hX3N0YXJ0KGRkKTsKLQl9Ci0KLQllcnIgPSBkZC0+ZXJyID8gOiBlcnI7Ci0KLQlpZiAoZXJyICE9IC1FSU5QUk9HUkVTUyAmJiAocmVhZHkgfHwgZXJyKSkgewotCQlkZXZfZGJnKGRkLT5kZXYsICJ1cGRhdGUgZG9uZTogZXJyOiAlZFxuIiwgZXJyKTsKLQkJLyogZmluaXNoIGN1cmVudCByZXF1ZXN0ICovCi0JCW9tYXBfc2hhbV9maW5pc2hfcmVxKHJlcSwgZXJyKTsKLQkJLyogc3RhcnQgbmV3IHJlcXVlc3QgKi8KKwlpZiAoIXRlc3RfYml0KEZMQUdTX0JVU1ksICZkZC0+ZmxhZ3MpKSB7CiAJCW9tYXBfc2hhbV9oYW5kbGVfcXVldWUoZGQsIE5VTEwpOworCQlyZXR1cm47CiAJfQotfQogCi1zdGF0aWMgdm9pZCBvbWFwX3NoYW1fcXVldWVfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IG9tYXBfc2hhbV9kZXYgKmRkID0gKHN0cnVjdCBvbWFwX3NoYW1fZGV2ICopZGF0YTsKKwlpZiAodGVzdF9iaXQoRkxBR1NfQ1BVLCAmZGQtPmZsYWdzKSkgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZMQUdTX09VVFBVVF9SRUFEWSwgJmRkLT5mbGFncykpCisJCQlnb3RvIGZpbmlzaDsKKwl9IGVsc2UgaWYgKHRlc3RfYml0KEZMQUdTX0RNQV9SRUFEWSwgJmRkLT5mbGFncykpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGTEFHU19ETUFfQUNUSVZFLCAmZGQtPmZsYWdzKSkgeworCQkJb21hcF9zaGFtX3VwZGF0ZV9kbWFfc3RvcChkZCk7CisJCQlpZiAoZGQtPmVycikgeworCQkJCWVyciA9IGRkLT5lcnI7CisJCQkJZ290byBmaW5pc2g7CisJCQl9CisJCX0KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGTEFHU19PVVRQVVRfUkVBRFksICZkZC0+ZmxhZ3MpKSB7CisJCQkvKiBoYXNoIG9yIHNlbWktaGFzaCByZWFkeSAqLworCQkJY2xlYXJfYml0KEZMQUdTX0RNQV9SRUFEWSwgJmRkLT5mbGFncyk7CisJCQllcnIgPSBvbWFwX3NoYW1fdXBkYXRlX2RtYV9zdGFydChkZCk7CisJCQlpZiAoZXJyICE9IC1FSU5QUk9HUkVTUykKKwkJCQlnb3RvIGZpbmlzaDsKKwkJfQorCX0KIAotCW9tYXBfc2hhbV9oYW5kbGVfcXVldWUoZGQsIE5VTEwpOworCXJldHVybjsKKworZmluaXNoOgorCWRldl9kYmcoZGQtPmRldiwgInVwZGF0ZSBkb25lOiBlcnI6ICVkXG4iLCBlcnIpOworCS8qIGZpbmlzaCBjdXJlbnQgcmVxdWVzdCAqLworCW9tYXBfc2hhbV9maW5pc2hfcmVxKGRkLT5yZXEsIGVycik7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX3NoYW1faXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3Qgb21hcF9zaGFtX2RldiAqZGQgPSBkZXZfaWQ7Ci0Jc3RydWN0IG9tYXBfc2hhbV9yZXFjdHggKmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KGRkLT5yZXEpOwogCi0JaWYgKCFjdHgpIHsKLQkJZGV2X2VycihkZC0+ZGV2LCAidW5rbm93biBpbnRlcnJ1cHQuXG4iKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCWlmICh1bmxpa2VseShjdHgtPmZsYWdzICYgRkxBR1NfRklOQUwpKQorCWlmICh1bmxpa2VseSh0ZXN0X2JpdChGTEFHU19GSU5BTCwgJmRkLT5mbGFncykpKQogCQkvKiBmaW5hbCAtPiBhbGxvdyBkZXZpY2UgdG8gZ28gdG8gcG93ZXItc2F2aW5nIG1vZGUgKi8KIAkJb21hcF9zaGFtX3dyaXRlX21hc2soZGQsIFNIQV9SRUdfQ1RSTCwgMCwgU0hBX1JFR19DVFJMX0xFTkdUSCk7CiAKQEAgLTEwODgsOCArMTA4NSwxMiBAQAogCQkJCSBTSEFfUkVHX0NUUkxfT1VUUFVUX1JFQURZKTsKIAlvbWFwX3NoYW1fcmVhZChkZCwgU0hBX1JFR19DVFJMKTsKIAotCWN0eC0+ZmxhZ3MgfD0gRkxBR1NfT1VUUFVUX1JFQURZOwotCWRkLT5lcnIgPSAwOworCWlmICghdGVzdF9iaXQoRkxBR1NfQlVTWSwgJmRkLT5mbGFncykpIHsKKwkJZGV2X3dhcm4oZGQtPmRldiwgIkludGVycnVwdCB3aGVuIG5vIGFjdGl2ZSByZXF1ZXN0cy5cbiIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJc2V0X2JpdChGTEFHU19PVVRQVVRfUkVBRFksICZkZC0+ZmxhZ3MpOwogCXRhc2tsZXRfc2NoZWR1bGUoJmRkLT5kb25lX3Rhc2spOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMTEwMiw5ICsxMTAzLDEwIEBACiAJaWYgKGNoX3N0YXR1cyAhPSBPTUFQX0RNQV9CTE9DS19JUlEpIHsKIAkJcHJfZXJyKCJvbWFwLXNoYW0gRE1BIGVycm9yIHN0YXR1czogMHglaHhcbiIsIGNoX3N0YXR1cyk7CiAJCWRkLT5lcnIgPSAtRUlPOwotCQlkZC0+ZmxhZ3MgJj0gfkZMQUdTX0lOSVQ7IC8qIHJlcXVlc3QgdG8gcmUtaW5pdGlhbGl6ZSAqLworCQljbGVhcl9iaXQoRkxBR1NfSU5JVCwgJmRkLT5mbGFncyk7LyogcmVxdWVzdCB0byByZS1pbml0aWFsaXplICovCiAJfQogCisJc2V0X2JpdChGTEFHU19ETUFfUkVBRFksICZkZC0+ZmxhZ3MpOwogCXRhc2tsZXRfc2NoZWR1bGUoJmRkLT5kb25lX3Rhc2spOwogfQogCkBAIC0xMTUxLDcgKzExNTMsNiBAQAogCUlOSVRfTElTVF9IRUFEKCZkZC0+bGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmRkLT5sb2NrKTsKIAl0YXNrbGV0X2luaXQoJmRkLT5kb25lX3Rhc2ssIG9tYXBfc2hhbV9kb25lX3Rhc2ssICh1bnNpZ25lZCBsb25nKWRkKTsKLQl0YXNrbGV0X2luaXQoJmRkLT5xdWV1ZV90YXNrLCBvbWFwX3NoYW1fcXVldWVfdGFzaywgKHVuc2lnbmVkIGxvbmcpZGQpOwogCWNyeXB0b19pbml0X3F1ZXVlKCZkZC0+cXVldWUsIE9NQVBfU0hBTV9RVUVVRV9MRU5HVEgpOwogCiAJZGQtPmlycSA9IC0xOwpAQCAtMTI2MCw3ICsxMjYxLDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbGdzKTsgaSsrKQogCQljcnlwdG9fdW5yZWdpc3Rlcl9haGFzaCgmYWxnc1tpXSk7CiAJdGFza2xldF9raWxsKCZkZC0+ZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJmRkLT5xdWV1ZV90YXNrKTsKIAlpb3VubWFwKGRkLT5pb19iYXNlKTsKIAljbGtfcHV0KGRkLT5pY2xrKTsKIAlvbWFwX3NoYW1fZG1hX2NsZWFudXAoZGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vdGFsaXRvcy5jIGIvZHJpdmVycy9jcnlwdG8vdGFsaXRvcy5jCmluZGV4IDg1NGUyNjMuLjhhMGJiNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3RhbGl0b3MuYworKysgYi9kcml2ZXJzL2NyeXB0by90YWxpdG9zLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogdGFsaXRvcyAtIEZyZWVzY2FsZSBJbnRlZ3JhdGVkIFNlY3VyaXR5IEVuZ2luZSAoU0VDKSBkZXZpY2UgZHJpdmVyCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCiAgKgogICogU2NhdHRlcmxpc3QgQ3J5cHRvIEFQSSBnbHVlIGNvZGUgY29waWVkIGZyb20gZmlsZXMgd2l0aCB0aGUgZm9sbG93aW5nOgogICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgpAQCAtMjgyLDYgKzI4Miw3IEBACiAvKioKICAqIHRhbGl0b3Nfc3VibWl0IC0gc3VibWl0cyBhIGRlc2NyaXB0b3IgdG8gdGhlIGRldmljZSBmb3IgcHJvY2Vzc2luZwogICogQGRldjoJdGhlIFNFQyBkZXZpY2UgdG8gYmUgdXNlZAorICogQGNoOgkJdGhlIFNFQyBkZXZpY2UgY2hhbm5lbCB0byBiZSB1c2VkCiAgKiBAZGVzYzoJdGhlIGRlc2NyaXB0b3IgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBkZXZpY2UKICAqIEBjYWxsYmFjazoJd2hvbSB0byBjYWxsIHdoZW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZQogICogQGNvbnRleHQ6CWEgaGFuZGxlIGZvciB1c2UgYnkgY2FsbGVyIChvcHRpb25hbCkKQEAgLTI5MCw3ICsyOTEsNyBAQAogICogY2FsbGJhY2sgbXVzdCBjaGVjayBlcnIgYW5kIGZlZWRiYWNrIGluIGRlc2NyaXB0b3IgaGVhZGVyCiAgKiBmb3IgZGV2aWNlIHByb2Nlc3Npbmcgc3RhdHVzLgogICovCi1zdGF0aWMgaW50IHRhbGl0b3Nfc3VibWl0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHRhbGl0b3NfZGVzYyAqZGVzYywKK3N0YXRpYyBpbnQgdGFsaXRvc19zdWJtaXQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgY2gsIHN0cnVjdCB0YWxpdG9zX2Rlc2MgKmRlc2MsCiAJCQkgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkgICBzdHJ1Y3QgdGFsaXRvc19kZXNjICpkZXNjLAogCQkJCQkgICB2b2lkICpjb250ZXh0LCBpbnQgZXJyb3IpLApAQCAtMjk4LDE1ICsyOTksOSBAQAogewogCXN0cnVjdCB0YWxpdG9zX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgdGFsaXRvc19yZXF1ZXN0ICpyZXF1ZXN0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGhlYWQ7CiAKLQkvKiBzZWxlY3QgZG9uZSBub3RpZmljYXRpb24gKi8KLQlkZXNjLT5oZHIgfD0gREVTQ19IRFJfRE9ORV9OT1RJRlk7Ci0KLQkvKiBlbXVsYXRlIFNFQydzIHJvdW5kLXJvYmluIGNoYW5uZWwgZmlmbyBwb2xsaW5nIHNjaGVtZSAqLwotCWNoID0gYXRvbWljX2luY19yZXR1cm4oJnByaXYtPmxhc3RfY2hhbikgJiAocHJpdi0+bnVtX2NoYW5uZWxzIC0gMSk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+Y2hhbltjaF0uaGVhZF9sb2NrLCBmbGFncyk7CiAKIAlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJnByaXYtPmNoYW5bY2hdLnN1Ym1pdF9jb3VudCkpIHsKQEAgLTcwNiw2ICs3MDEsNyBAQAogCiBzdHJ1Y3QgdGFsaXRvc19jdHggewogCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgY2g7CiAJX19iZTMyIGRlc2NfaGRyX3RlbXBsYXRlOwogCXU4IGtleVtUQUxJVE9TX01BWF9LRVlfU0laRV07CiAJdTggaXZbVEFMSVRPU19NQVhfSVZfTEVOR1RIXTsKQEAgLTExMTcsNyArMTExMyw3IEBACiAJbWFwX3NpbmdsZV90YWxpdG9zX3B0cihkZXYsICZkZXNjLT5wdHJbNl0sIGl2c2l6ZSwgY3R4LT5pdiwgMCwKIAkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOwogCi0JcmV0ID0gdGFsaXRvc19zdWJtaXQoZGV2LCBkZXNjLCBjYWxsYmFjaywgYXJlcSk7CisJcmV0ID0gdGFsaXRvc19zdWJtaXQoZGV2LCBjdHgtPmNoLCBkZXNjLCBjYWxsYmFjaywgYXJlcSk7CiAJaWYgKHJldCAhPSAtRUlOUFJPR1JFU1MpIHsKIAkJaXBzZWNfZXNwX3VubWFwKGRldiwgZWRlc2MsIGFyZXEpOwogCQlrZnJlZShlZGVzYyk7CkBAIC0xMzgyLDIyICsxMzc4LDExIEBACiAJCQkgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCiB7CiAJc3RydWN0IHRhbGl0b3NfY3R4ICpjdHggPSBjcnlwdG9fYWJsa2NpcGhlcl9jdHgoY2lwaGVyKTsKLQlzdHJ1Y3QgYWJsa2NpcGhlcl9hbGcgKmFsZyA9IGNyeXB0b19hYmxrY2lwaGVyX2FsZyhjaXBoZXIpOwotCi0JaWYgKGtleWxlbiA+IFRBTElUT1NfTUFYX0tFWV9TSVpFKQotCQlnb3RvIGJhZGtleTsKLQotCWlmIChrZXlsZW4gPCBhbGctPm1pbl9rZXlzaXplIHx8IGtleWxlbiA+IGFsZy0+bWF4X2tleXNpemUpCi0JCWdvdG8gYmFka2V5OwogCiAJbWVtY3B5KCZjdHgtPmtleSwga2V5LCBrZXlsZW4pOwogCWN0eC0+a2V5bGVuID0ga2V5bGVuOwogCiAJcmV0dXJuIDA7Ci0KLWJhZGtleToKLQljcnlwdG9fYWJsa2NpcGhlcl9zZXRfZmxhZ3MoY2lwaGVyLCBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTik7Ci0JcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyB2b2lkIGNvbW1vbl9ub25zbm9vcF91bm1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0xNDMzLDcgKzE0MTgsNiBAQAogCiBzdGF0aWMgaW50IGNvbW1vbl9ub25zbm9vcChzdHJ1Y3QgdGFsaXRvc19lZGVzYyAqZWRlc2MsCiAJCQkgICBzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICphcmVxLAotCQkJICAgdTggKmdpdiwKIAkJCSAgIHZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICAgICBzdHJ1Y3QgdGFsaXRvc19kZXNjICpkZXNjLAogCQkJCQkgICAgIHZvaWQgKmNvbnRleHQsIGludCBlcnJvcikpCkBAIC0xNDUzLDcgKzE0MzcsNyBAQAogCiAJLyogY2lwaGVyIGl2ICovCiAJaXZzaXplID0gY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKGNpcGhlcik7Ci0JbWFwX3NpbmdsZV90YWxpdG9zX3B0cihkZXYsICZkZXNjLT5wdHJbMV0sIGl2c2l6ZSwgZ2l2ID86IGFyZXEtPmluZm8sIDAsCisJbWFwX3NpbmdsZV90YWxpdG9zX3B0cihkZXYsICZkZXNjLT5wdHJbMV0sIGl2c2l6ZSwgYXJlcS0+aW5mbywgMCwKIAkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKIAogCS8qIGNpcGhlciBrZXkgKi8KQEAgLTE1MjQsNyArMTUwOCw3IEBACiAJdG9fdGFsaXRvc19wdHIoJmRlc2MtPnB0cls2XSwgMCk7CiAJZGVzYy0+cHRyWzZdLmpfZXh0ZW50ID0gMDsKIAotCXJldCA9IHRhbGl0b3Nfc3VibWl0KGRldiwgZGVzYywgY2FsbGJhY2ssIGFyZXEpOworCXJldCA9IHRhbGl0b3Nfc3VibWl0KGRldiwgY3R4LT5jaCwgZGVzYywgY2FsbGJhY2ssIGFyZXEpOwogCWlmIChyZXQgIT0gLUVJTlBST0dSRVNTKSB7CiAJCWNvbW1vbl9ub25zbm9vcF91bm1hcChkZXYsIGVkZXNjLCBhcmVxKTsKIAkJa2ZyZWUoZWRlc2MpOwpAQCAtMTU1Niw3ICsxNTQwLDcgQEAKIAkvKiBzZXQgZW5jcnlwdCAqLwogCWVkZXNjLT5kZXNjLmhkciA9IGN0eC0+ZGVzY19oZHJfdGVtcGxhdGUgfCBERVNDX0hEUl9NT0RFMF9FTkNSWVBUOwogCi0JcmV0dXJuIGNvbW1vbl9ub25zbm9vcChlZGVzYywgYXJlcSwgTlVMTCwgYWJsa2NpcGhlcl9kb25lKTsKKwlyZXR1cm4gY29tbW9uX25vbnNub29wKGVkZXNjLCBhcmVxLCBhYmxrY2lwaGVyX2RvbmUpOwogfQogCiBzdGF0aWMgaW50IGFibGtjaXBoZXJfZGVjcnlwdChzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICphcmVxKQpAQCAtMTU3Miw3ICsxNTU2LDcgQEAKIAogCWVkZXNjLT5kZXNjLmhkciA9IGN0eC0+ZGVzY19oZHJfdGVtcGxhdGUgfCBERVNDX0hEUl9ESVJfSU5CT1VORDsKIAotCXJldHVybiBjb21tb25fbm9uc25vb3AoZWRlc2MsIGFyZXEsIE5VTEwsIGFibGtjaXBoZXJfZG9uZSk7CisJcmV0dXJuIGNvbW1vbl9ub25zbm9vcChlZGVzYywgYXJlcSwgYWJsa2NpcGhlcl9kb25lKTsKIH0KIAogc3RhdGljIHZvaWQgY29tbW9uX25vbnNub29wX2hhc2hfdW5tYXAoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTcwMyw3ICsxNjg3LDcgQEAKIAkvKiBsYXN0IERXT1JEIGVtcHR5ICovCiAJZGVzYy0+cHRyWzZdID0gemVyb19lbnRyeTsKIAotCXJldCA9IHRhbGl0b3Nfc3VibWl0KGRldiwgZGVzYywgY2FsbGJhY2ssIGFyZXEpOworCXJldCA9IHRhbGl0b3Nfc3VibWl0KGRldiwgY3R4LT5jaCwgZGVzYywgY2FsbGJhY2ssIGFyZXEpOwogCWlmIChyZXQgIT0gLUVJTlBST0dSRVNTKSB7CiAJCWNvbW1vbl9ub25zbm9vcF9oYXNoX3VubWFwKGRldiwgZWRlc2MsIGFyZXEpOwogCQlrZnJlZShlZGVzYyk7CkBAIC0yMjQ0LDYgKzIyMjgsNyBAQAogCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSB0Zm0tPl9fY3J0X2FsZzsKIAlzdHJ1Y3QgdGFsaXRvc19jcnlwdG9fYWxnICp0YWxpdG9zX2FsZzsKIAlzdHJ1Y3QgdGFsaXRvc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJc3RydWN0IHRhbGl0b3NfcHJpdmF0ZSAqcHJpdjsKIAogCWlmICgoYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX1RZUEVfTUFTSykgPT0gQ1JZUFRPX0FMR19UWVBFX0FIQVNIKQogCQl0YWxpdG9zX2FsZyA9IGNvbnRhaW5lcl9vZihfX2NyeXB0b19haGFzaF9hbGcoYWxnKSwKQEAgLTIyNTYsOSArMjI0MSwxNyBAQAogCS8qIHVwZGF0ZSBjb250ZXh0IHdpdGggcHRyIHRvIGRldiAqLwogCWN0eC0+ZGV2ID0gdGFsaXRvc19hbGctPmRldjsKIAorCS8qIGFzc2lnbiBTRUMgY2hhbm5lbCB0byB0Zm0gaW4gcm91bmQtcm9iaW4gZmFzaGlvbiAqLworCXByaXYgPSBkZXZfZ2V0X2RydmRhdGEoY3R4LT5kZXYpOworCWN0eC0+Y2ggPSBhdG9taWNfaW5jX3JldHVybigmcHJpdi0+bGFzdF9jaGFuKSAmCisJCSAgKHByaXYtPm51bV9jaGFubmVscyAtIDEpOworCiAJLyogY29weSBkZXNjcmlwdG9yIGhlYWRlciB0ZW1wbGF0ZSB2YWx1ZSAqLwogCWN0eC0+ZGVzY19oZHJfdGVtcGxhdGUgPSB0YWxpdG9zX2FsZy0+YWxndC5kZXNjX2hkcl90ZW1wbGF0ZTsKIAorCS8qIHNlbGVjdCBkb25lIG5vdGlmaWNhdGlvbiAqLworCWN0eC0+ZGVzY19oZHJfdGVtcGxhdGUgfD0gREVTQ19IRFJfRE9ORV9OT1RJRlk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvS2NvbmZpZyBiL2RyaXZlcnMvZG1hL0tjb25maWcKaW5kZXggMjVjZjMyNy4uMmUzYjNkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvS2NvbmZpZworKysgYi9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC0yMzcsNiArMjM3LDEzIEBACiAJICBTdXBwb3J0IHRoZSBNWFMgRE1BIGVuZ2luZS4gVGhpcyBlbmdpbmUgaW5jbHVkaW5nIEFQQkgtRE1BCiAJICBhbmQgQVBCWC1ETUEgaXMgaW50ZWdyYXRlZCBpbnRvIEZyZWVzY2FsZSBpLk1YMjMvMjggY2hpcHMuCiAKK2NvbmZpZyBFUDkzWFhfRE1BCisJYm9vbCAiQ2lycnVzIExvZ2ljIEVQOTN4eCBETUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfRVA5M1hYCisJc2VsZWN0IERNQV9FTkdJTkUKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIENpcnJ1cyBMb2dpYyBFUDkzeHggTTJQL00yTSBETUEgY29udHJvbGxlci4KKwogY29uZmlnIERNQV9FTkdJTkUKIAlib29sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL01ha2VmaWxlIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUKaW5kZXggODM2MDk1YS4uMzBjZjNiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUKQEAgLTI1LDMgKzI1LDQgQEAKIG9iai0kKENPTkZJR19QTDMzMF9ETUEpICs9IHBsMzMwLm8KIG9iai0kKENPTkZJR19QQ0hfRE1BKSArPSBwY2hfZG1hLm8KIG9iai0kKENPTkZJR19BTUJBX1BMMDhYKSArPSBhbWJhLXBsMDh4Lm8KK29iai0kKENPTkZJR19FUDkzWFhfRE1BKSArPSBlcDkzeHhfZG1hLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2NvaDkwMTMxOC5jIGIvZHJpdmVycy9kbWEvY29oOTAxMzE4LmMKaW5kZXggYWY4YzBiNS4uYTkyZDk1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvY29oOTAxMzE4LmMKKysrIGIvZHJpdmVycy9kbWEvY29oOTAxMzE4LmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gLyogcHJpbnRrKCkgKi8KICNpbmNsdWRlIDxsaW51eC9mcy5oPiAvKiBldmVyeXRoaW5nLi4uICovCisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+IC8qIGttYWxsb2MoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwppbmRleCA4YmNiMTVmLi40ODY5NGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYworKysgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwpAQCAtNDUsNiArNDUsNyBAQAogICogU2VlIERvY3VtZW50YXRpb24vZG1hZW5naW5lLnR4dCBmb3IgbW9yZSBkZXRhaWxzCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMgYi9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMKaW5kZXggYjRmNWMzMi4uNzY1ZjVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZG1hdGVzdC5jCisrKyBiL2RyaXZlcnMvZG1hL2RtYXRlc3QuYwpAQCAtOCw2ICs4LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9lcDkzeHhfZG1hLmMgYi9kcml2ZXJzL2RtYS9lcDkzeHhfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2NmMxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZG1hL2VwOTN4eF9kbWEuYwpAQCAtMCwwICsxLDEzNTUgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBDaXJydXMgTG9naWMgRVA5M3h4IERNQSBDb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIE1pa2EgV2VzdGVyYmVyZworICoKKyAqIERNQSBNMlAgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsCisgKiBhcmNoL2FybS9tYWNoLWVwOTN4eC9kbWEtbTJwLmMgd2hpY2ggaGFzIGZvbGxvd2luZyBjb3B5cmlnaHRzOgorICoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA2IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPgorICogICBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGllZCBEYXRhIFN5c3RlbXMKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA5IFJ5YW4gTWFsbG9uIDxybWFsbG9uQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBkd19kbWFjIGFuZCBhbWJhLXBsMDh4IGRyaXZlcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisKKy8qIE0yUCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTTJQX0NPTlRST0wJCQkweDAwMDAKKyNkZWZpbmUgTTJQX0NPTlRST0xfU1RBTExJTlQJCUJJVCgwKQorI2RlZmluZSBNMlBfQ09OVFJPTF9ORkJJTlQJCUJJVCgxKQorI2RlZmluZSBNMlBfQ09OVFJPTF9DSF9FUlJPUl9JTlQJQklUKDMpCisjZGVmaW5lIE0yUF9DT05UUk9MX0VOQUJMRQkJQklUKDQpCisjZGVmaW5lIE0yUF9DT05UUk9MX0lDRQkJCUJJVCg2KQorCisjZGVmaW5lIE0yUF9JTlRFUlJVUFQJCQkweDAwMDQKKyNkZWZpbmUgTTJQX0lOVEVSUlVQVF9TVEFMTAkJQklUKDApCisjZGVmaW5lIE0yUF9JTlRFUlJVUFRfTkZCCQlCSVQoMSkKKyNkZWZpbmUgTTJQX0lOVEVSUlVQVF9FUlJPUgkJQklUKDMpCisKKyNkZWZpbmUgTTJQX1BQQUxMT0MJCQkweDAwMDgKKyNkZWZpbmUgTTJQX1NUQVRVUwkJCTB4MDAwYworCisjZGVmaW5lIE0yUF9NQVhDTlQwCQkJMHgwMDIwCisjZGVmaW5lIE0yUF9CQVNFMAkJCTB4MDAyNAorI2RlZmluZSBNMlBfTUFYQ05UMQkJCTB4MDAzMAorI2RlZmluZSBNMlBfQkFTRTEJCQkweDAwMzQKKworI2RlZmluZSBNMlBfU1RBVEVfSURMRQkJCTAKKyNkZWZpbmUgTTJQX1NUQVRFX1NUQUxMCQkJMQorI2RlZmluZSBNMlBfU1RBVEVfT04JCQkyCisjZGVmaW5lIE0yUF9TVEFURV9ORVhUCQkJMworCisvKiBNMk0gcmVnaXN0ZXJzICovCisjZGVmaW5lIE0yTV9DT05UUk9MCQkJMHgwMDAwCisjZGVmaW5lIE0yTV9DT05UUk9MX0RPTkVJTlQJCUJJVCgyKQorI2RlZmluZSBNMk1fQ09OVFJPTF9FTkFCTEUJCUJJVCgzKQorI2RlZmluZSBNMk1fQ09OVFJPTF9TVEFSVAkJQklUKDQpCisjZGVmaW5lIE0yTV9DT05UUk9MX0RBSAkJCUJJVCgxMSkKKyNkZWZpbmUgTTJNX0NPTlRST0xfU0FICQkJQklUKDEyKQorI2RlZmluZSBNMk1fQ09OVFJPTF9QV19TSElGVAkJOQorI2RlZmluZSBNMk1fQ09OVFJPTF9QV184CQkoMCA8PCBNMk1fQ09OVFJPTF9QV19TSElGVCkKKyNkZWZpbmUgTTJNX0NPTlRST0xfUFdfMTYJCSgxIDw8IE0yTV9DT05UUk9MX1BXX1NISUZUKQorI2RlZmluZSBNMk1fQ09OVFJPTF9QV18zMgkJKDIgPDwgTTJNX0NPTlRST0xfUFdfU0hJRlQpCisjZGVmaW5lIE0yTV9DT05UUk9MX1BXX01BU0sJCSgzIDw8IE0yTV9DT05UUk9MX1BXX1NISUZUKQorI2RlZmluZSBNMk1fQ09OVFJPTF9UTV9TSElGVAkJMTMKKyNkZWZpbmUgTTJNX0NPTlRST0xfVE1fVFgJCSgxIDw8IE0yTV9DT05UUk9MX1RNX1NISUZUKQorI2RlZmluZSBNMk1fQ09OVFJPTF9UTV9SWAkJKDIgPDwgTTJNX0NPTlRST0xfVE1fU0hJRlQpCisjZGVmaW5lIE0yTV9DT05UUk9MX1JTU19TSElGVAkJMjIKKyNkZWZpbmUgTTJNX0NPTlRST0xfUlNTX1NTUFJYCQkoMSA8PCBNMk1fQ09OVFJPTF9SU1NfU0hJRlQpCisjZGVmaW5lIE0yTV9DT05UUk9MX1JTU19TU1BUWAkJKDIgPDwgTTJNX0NPTlRST0xfUlNTX1NISUZUKQorI2RlZmluZSBNMk1fQ09OVFJPTF9SU1NfSURFCQkoMyA8PCBNMk1fQ09OVFJPTF9SU1NfU0hJRlQpCisjZGVmaW5lIE0yTV9DT05UUk9MX05PX0hEU0sJCUJJVCgyNCkKKyNkZWZpbmUgTTJNX0NPTlRST0xfUFdTQ19TSElGVAkJMjUKKworI2RlZmluZSBNMk1fSU5URVJSVVBUCQkJMHgwMDA0CisjZGVmaW5lIE0yTV9JTlRFUlJVUFRfRE9ORUlOVAkJQklUKDEpCisKKyNkZWZpbmUgTTJNX0JDUjAJCQkweDAwMTAKKyNkZWZpbmUgTTJNX0JDUjEJCQkweDAwMTQKKyNkZWZpbmUgTTJNX1NBUl9CQVNFMAkJCTB4MDAxOAorI2RlZmluZSBNMk1fU0FSX0JBU0UxCQkJMHgwMDFjCisjZGVmaW5lIE0yTV9EQVJfQkFTRTAJCQkweDAwMmMKKyNkZWZpbmUgTTJNX0RBUl9CQVNFMQkJCTB4MDAzMAorCisjZGVmaW5lIERNQV9NQVhfQ0hBTl9CWVRFUwkJMHhmZmZmCisjZGVmaW5lIERNQV9NQVhfQ0hBTl9ERVNDUklQVE9SUwkzMgorCitzdHJ1Y3QgZXA5M3h4X2RtYV9lbmdpbmU7CisKKy8qKgorICogc3RydWN0IGVwOTN4eF9kbWFfZGVzYyAtIEVQOTN4eCBzcGVjaWZpYyB0cmFuc2FjdGlvbiBkZXNjcmlwdG9yCisgKiBAc3JjX2FkZHI6IHNvdXJjZSBhZGRyZXNzIG9mIHRoZSB0cmFuc2FjdGlvbgorICogQGRzdF9hZGRyOiBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSB0cmFuc2FjdGlvbgorICogQHNpemU6IHNpemUgb2YgdGhlIHRyYW5zYWN0aW9uIChpbiBieXRlcykKKyAqIEBjb21wbGV0ZTogdGhpcyBkZXNjcmlwdG9yIGlzIGNvbXBsZXRlZAorICogQHR4ZDogZG1hZW5naW5lIEFQSSBkZXNjcmlwdG9yCisgKiBAdHhfbGlzdDogbGlzdCBvZiBsaW5rZWQgZGVzY3JpcHRvcnMKKyAqIEBub2RlOiBsaW5rIHVzZWQgZm9yIHB1dHRpbmcgdGhpcyBpbnRvIGEgY2hhbm5lbCBxdWV1ZQorICovCitzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjIHsKKwl1MzIJCQkJc3JjX2FkZHI7CisJdTMyCQkJCWRzdF9hZGRyOworCXNpemVfdAkJCQlzaXplOworCWJvb2wJCQkJY29tcGxldGU7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCXR4ZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQl0eF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCW5vZGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gLSBhbiBFUDkzeHggRE1BIE0yUC9NMk0gY2hhbm5lbAorICogQGNoYW46IGRtYWVuZ2luZSBBUEkgY2hhbm5lbAorICogQGVkbWE6IHBvaW50ZXIgdG8gdG8gdGhlIGVuZ2luZSBkZXZpY2UKKyAqIEByZWdzOiBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycworICogQGlycTogaW50ZXJydXB0IG51bWJlciBvZiB0aGUgY2hhbm5lbAorICogQGNsazogY2xvY2sgdXNlZCBieSB0aGlzIGNoYW5uZWwKKyAqIEB0YXNrbGV0OiBjaGFubmVsIHNwZWNpZmljIHRhc2tsZXQgdXNlZCBmb3IgY2FsbGJhY2tzCisgKiBAbG9jazogbG9jayBwcm90ZWN0aW5nIHRoZSBmaWVsZHMgZm9sbG93aW5nCisgKiBAZmxhZ3M6IGZsYWdzIGZvciB0aGUgY2hhbm5lbAorICogQGJ1ZmZlcjogd2hpY2ggYnVmZmVyIHRvIHVzZSBuZXh0ICgwLzEpCisgKiBAbGFzdF9jb21wbGV0ZWQ6IGxhc3QgY29tcGxldGVkIGNvb2tpZSB2YWx1ZQorICogQGFjdGl2ZTogZmxhdHRlbmVkIGNoYWluIG9mIGRlc2NyaXB0b3JzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQKKyAqIEBxdWV1ZTogcGVuZGluZyBkZXNjcmlwdG9ycyB3aGljaCBhcmUgaGFuZGxlZCBuZXh0CisgKiBAZnJlZV9saXN0OiBsaXN0IG9mIGZyZWUgZGVzY3JpcHRvcnMgd2hpY2ggY2FuIGJlIHVzZWQKKyAqIEBydW50aW1lX2FkZHI6IHBoeXNpY2FsIGFkZHJlc3MgY3VycmVudGx5IHVzZWQgYXMgZGVzdC9zcmMgKE0yTSBvbmx5KS4gVGhpcworICogICAgICAgICAgICAgICAgaXMgc2V0IHZpYSAlRE1BX1NMQVZFX0NPTkZJRyBiZWZvcmUgc2xhdmUgb3BlcmF0aW9uIGlzCisgKiAgICAgICAgICAgICAgICBwcmVwYXJlZAorICogQHJ1bnRpbWVfY3RybDogTTJNIHJ1bnRpbWUgdmFsdWVzIGZvciB0aGUgY29udHJvbCByZWdpc3Rlci4KKyAqCisgKiBBcyBFUDkzeHggRE1BIGNvbnRyb2xsZXIgZG9lc24ndCBzdXBwb3J0IHJlYWwgY2hhaW5lZCBETUEgZGVzY3JpcHRvcnMgd2UKKyAqIHdpbGwgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgc2NoZW1lIGhlcmU6IEBhY3RpdmUgcG9pbnRzIHRvIGEgaGVhZCBvZgorICogZmxhdHRlbmVkIERNQSBkZXNjcmlwdG9yIGNoYWluLgorICoKKyAqIEBxdWV1ZSBob2xkcyBwZW5kaW5nIHRyYW5zYWN0aW9ucy4gVGhlc2UgYXJlIGxpbmtlZCB0aHJvdWdoIHRoZSBmaXJzdAorICogZGVzY3JpcHRvciBpbiB0aGUgY2hhaW4uIFdoZW4gYSBkZXNjcmlwdG9yIGlzIG1vdmVkIHRvIHRoZSBAYWN0aXZlIHF1ZXVlLAorICogdGhlIGZpcnN0IGFuZCBjaGFpbmVkIGRlc2NyaXB0b3JzIGFyZSBmbGF0dGVuZWQgaW50byBhIHNpbmdsZSBsaXN0LgorICoKKyAqIEBjaGFuLnByaXZhdGUgaG9sZHMgcG9pbnRlciB0byAmc3RydWN0IGVwOTN4eF9kbWFfZGF0YSB3aGljaCBjb250YWlucworICogbmVjZXNzYXJ5IGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gRm9yIG1lbWNweSBjaGFubmVscyB0aGlzIG11c3QKKyAqIGJlICVOVUxMLgorICovCitzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuIHsKKwlzdHJ1Y3QgZG1hX2NoYW4JCQljaGFuOworCWNvbnN0IHN0cnVjdCBlcDkzeHhfZG1hX2VuZ2luZQkqZWRtYTsKKwl2b2lkIF9faW9tZW0JCQkqcmVnczsKKwlpbnQJCQkJaXJxOworCXN0cnVjdCBjbGsJCQkqY2xrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAkJdGFza2xldDsKKwkvKiBwcm90ZWN0cyB0aGUgZmllbGRzIGZvbGxvd2luZyAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCXVuc2lnbmVkIGxvbmcJCQlmbGFnczsKKy8qIENoYW5uZWwgaXMgY29uZmlndXJlZCBmb3IgY3ljbGljIHRyYW5zZmVycyAqLworI2RlZmluZSBFUDkzWFhfRE1BX0lTX0NZQ0xJQwkJMAorCisJaW50CQkJCWJ1ZmZlcjsKKwlkbWFfY29va2llX3QJCQlsYXN0X2NvbXBsZXRlZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlhY3RpdmU7CisJc3RydWN0IGxpc3RfaGVhZAkJcXVldWU7CisJc3RydWN0IGxpc3RfaGVhZAkJZnJlZV9saXN0OworCXUzMgkJCQlydW50aW1lX2FkZHI7CisJdTMyCQkJCXJ1bnRpbWVfY3RybDsKK307CisKKy8qKgorICogc3RydWN0IGVwOTN4eF9kbWFfZW5naW5lIC0gdGhlIEVQOTN4eCBETUEgZW5naW5lIGluc3RhbmNlCisgKiBAZG1hX2RldjogaG9sZHMgdGhlIGRtYWVuZ2luZSBkZXZpY2UKKyAqIEBtMm06IGlzIHRoaXMgYW4gTTJNIG9yIE0yUCBkZXZpY2UKKyAqIEBod19zZXR1cDogbWV0aG9kIHdoaWNoIHNldHMgdGhlIGNoYW5uZWwgdXAgZm9yIG9wZXJhdGlvbgorICogQGh3X3NodXRkb3duOiBzaHV0cyB0aGUgY2hhbm5lbCBkb3duIGFuZCBmbHVzaGVzIHdoYXRldmVyIGlzIGxlZnQKKyAqIEBod19zdWJtaXQ6IHB1c2hlcyBhY3RpdmUgZGVzY3JpcHRvcihzKSB0byB0aGUgaGFyZHdhcmUKKyAqIEBod19pbnRlcnJ1cHQ6IGhhbmRsZSB0aGUgaW50ZXJydXB0CisgKiBAbnVtX2NoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIHRoaXMgaW5zdGFuY2UKKyAqIEBjaGFubmVsczogYXJyYXkgb2YgY2hhbm5lbHMKKyAqCisgKiBUaGVyZSBpcyBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3QgZm9yIHRoZSBNMlAgY2hhbm5lbHMgYW5kIG9uZSBmb3IgdGhlCisgKiBNMk0gY2hhbm5lbHMuIGh3X3h4eCgpIG1ldGhvZHMgYXJlIHVzZWQgdG8gcGVyZm9ybSBvcGVyYXRpb25zIHdoaWNoIGFyZQorICogZGlmZmVyZW50IG9uIE0yTSBhbmQgTTJQIGNoYW5uZWxzLiBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgd2l0aCBjaGFubmVsCisgKiBsb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQgc28gdGhleSBjYW5ub3Qgc2xlZXAuCisgKi8KK3N0cnVjdCBlcDkzeHhfZG1hX2VuZ2luZSB7CisJc3RydWN0IGRtYV9kZXZpY2UJZG1hX2RldjsKKwlib29sCQkJbTJtOworCWludAkJCSgqaHdfc2V0dXApKHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKik7CisJdm9pZAkJCSgqaHdfc2h1dGRvd24pKHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKik7CisJdm9pZAkJCSgqaHdfc3VibWl0KShzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICopOworCWludAkJCSgqaHdfaW50ZXJydXB0KShzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICopOworI2RlZmluZSBJTlRFUlJVUFRfVU5LTk9XTgkwCisjZGVmaW5lIElOVEVSUlVQVF9ET05FCQkxCisjZGVmaW5lIElOVEVSUlVQVF9ORVhUX0JVRkZFUgkyCisKKwlzaXplX3QJCQludW1fY2hhbm5lbHM7CisJc3RydWN0IGVwOTN4eF9kbWFfY2hhbgljaGFubmVsc1tdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpjaGFuMmRldihzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYykKK3sKKwlyZXR1cm4gJmVkbWFjLT5jaGFuLmRldi0+ZGV2aWNlOworfQorCitzdGF0aWMgc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqdG9fZXA5M3h4X2RtYV9jaGFuKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNoYW4sIHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4sIGNoYW4pOworfQorCisvKioKKyAqIGVwOTN4eF9kbWFfc2V0X2FjdGl2ZSAtIHNldCBuZXcgYWN0aXZlIGRlc2NyaXB0b3IgY2hhaW4KKyAqIEBlZG1hYzogY2hhbm5lbAorICogQGRlc2M6IGhlYWQgb2YgdGhlIG5ldyBhY3RpdmUgZGVzY3JpcHRvciBjaGFpbgorICoKKyAqIFNldHMgQGRlc2MgdG8gYmUgdGhlIGhlYWQgb2YgdGhlIG5ldyBhY3RpdmUgZGVzY3JpcHRvciBjaGFpbi4gVGhpcyBpcyB0aGUKKyAqIGNoYWluIHdoaWNoIGlzIHByb2Nlc3NlZCBuZXh0LiBUaGUgYWN0aXZlIGxpc3QgbXVzdCBiZSBlbXB0eSBiZWZvcmUgY2FsbGluZworICogdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBDYWxsZWQgd2l0aCBAZWRtYWMtPmxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgZXA5M3h4X2RtYV9zZXRfYWN0aXZlKHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjLAorCQkJCSAgc3RydWN0IGVwOTN4eF9kbWFfZGVzYyAqZGVzYykKK3sKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmVkbWFjLT5hY3RpdmUpKTsKKworCWxpc3RfYWRkX3RhaWwoJmRlc2MtPm5vZGUsICZlZG1hYy0+YWN0aXZlKTsKKworCS8qIEZsYXR0ZW4gdGhlIEBkZXNjLT50eF9saXN0IGNoYWluIGludG8gQGVkbWFjLT5hY3RpdmUgbGlzdCAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmZGVzYy0+dHhfbGlzdCkpIHsKKwkJc3RydWN0IGVwOTN4eF9kbWFfZGVzYyAqZCA9IGxpc3RfZmlyc3RfZW50cnkoJmRlc2MtPnR4X2xpc3QsCisJCQlzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjLCBub2RlKTsKKworCQkvKgorCQkgKiBXZSBjb3B5IHRoZSBjYWxsYmFjayBwYXJhbWV0ZXJzIGZyb20gdGhlIGZpcnN0IGRlc2NyaXB0b3IKKwkJICogdG8gYWxsIHRoZSBjaGFpbmVkIGRlc2NyaXB0b3JzLiBUaGlzIHdheSB3ZSBjYW4gY2FsbCB0aGUKKwkJICogY2FsbGJhY2sgd2l0aG91dCBoYXZpbmcgdG8gZmluZCBvdXQgdGhlIGZpcnN0IGRlc2NyaXB0b3IgaW4KKwkJICogdGhlIGNoYWluLiBVc2VmdWwgZm9yIGN5Y2xpYyB0cmFuc2ZlcnMuCisJCSAqLworCQlkLT50eGQuY2FsbGJhY2sgPSBkZXNjLT50eGQuY2FsbGJhY2s7CisJCWQtPnR4ZC5jYWxsYmFja19wYXJhbSA9IGRlc2MtPnR4ZC5jYWxsYmFja19wYXJhbTsKKworCQlsaXN0X21vdmVfdGFpbCgmZC0+bm9kZSwgJmVkbWFjLT5hY3RpdmUpOworCX0KK30KKworLyogQ2FsbGVkIHdpdGggQGVkbWFjLT5sb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjICoKK2VwOTN4eF9kbWFfZ2V0X2FjdGl2ZShzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYykKK3sKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeSgmZWRtYWMtPmFjdGl2ZSwgc3RydWN0IGVwOTN4eF9kbWFfZGVzYywgbm9kZSk7Cit9CisKKy8qKgorICogZXA5M3h4X2RtYV9hZHZhbmNlX2FjdGl2ZSAtIGFkdmFuY2VzIHRvIHRoZSBuZXh0IGFjdGl2ZSBkZXNjcmlwdG9yCisgKiBAZWRtYWM6IGNoYW5uZWwKKyAqCisgKiBGdW5jdGlvbiBhZHZhbmNlcyBhY3RpdmUgZGVzY3JpcHRvciB0byB0aGUgbmV4dCBpbiB0aGUgQGVkbWFjLT5hY3RpdmUgYW5kCisgKiByZXR1cm5zICV0cnVlIGlmIHdlIHN0aWxsIGhhdmUgZGVzY3JpcHRvcnMgaW4gdGhlIGNoYWluIHRvIHByb2Nlc3MuCisgKiBPdGhlcndpc2UgcmV0dXJucyAlZmFsc2UuCisgKgorICogV2hlbiB0aGUgY2hhbm5lbCBpcyBpbiBjeWNsaWMgbW9kZSBhbHdheXMgcmV0dXJucyAldHJ1ZS4KKyAqCisgKiBDYWxsZWQgd2l0aCBAZWRtYWMtPmxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqLworc3RhdGljIGJvb2wgZXA5M3h4X2RtYV9hZHZhbmNlX2FjdGl2ZShzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYykKK3sKKwlsaXN0X3JvdGF0ZV9sZWZ0KCZlZG1hYy0+YWN0aXZlKTsKKworCWlmICh0ZXN0X2JpdChFUDkzWFhfRE1BX0lTX0NZQ0xJQywgJmVkbWFjLT5mbGFncykpCisJCXJldHVybiB0cnVlOworCisJLyoKKwkgKiBJZiB0eGQuY29va2llIGlzIHNldCBpdCBtZWFucyB0aGF0IHdlIGFyZSBiYWNrIGluIHRoZSBmaXJzdAorCSAqIGRlc2NyaXB0b3IgaW4gdGhlIGNoYWluIGFuZCBoZW5jZSBkb25lIHdpdGggaXQuCisJICovCisJcmV0dXJuICFlcDkzeHhfZG1hX2dldF9hY3RpdmUoZWRtYWMpLT50eGQuY29va2llOworfQorCisvKgorICogTTJQIERNQSBpbXBsZW1lbnRhdGlvbgorICovCisKK3N0YXRpYyB2b2lkIG0ycF9zZXRfY29udHJvbChzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYywgdTMyIGNvbnRyb2wpCit7CisJd3JpdGVsKGNvbnRyb2wsIGVkbWFjLT5yZWdzICsgTTJQX0NPTlRST0wpOworCS8qCisJICogRVA5M3h4IFVzZXIncyBHdWlkZSBzdGF0ZXMgdGhhdCB3ZSBtdXN0IHBlcmZvcm0gYSBkdW1teSByZWFkIGFmdGVyCisJICogd3JpdGUgdG8gdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisJICovCisJcmVhZGwoZWRtYWMtPnJlZ3MgKyBNMlBfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyBpbnQgbTJwX2h3X3NldHVwKHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjKQoreworCXN0cnVjdCBlcDkzeHhfZG1hX2RhdGEgKmRhdGEgPSBlZG1hYy0+Y2hhbi5wcml2YXRlOworCXUzMiBjb250cm9sOworCisJd3JpdGVsKGRhdGEtPnBvcnQgJiAweGYsIGVkbWFjLT5yZWdzICsgTTJQX1BQQUxMT0MpOworCisJY29udHJvbCA9IE0yUF9DT05UUk9MX0NIX0VSUk9SX0lOVCB8IE0yUF9DT05UUk9MX0lDRQorCQl8IE0yUF9DT05UUk9MX0VOQUJMRTsKKwltMnBfc2V0X2NvbnRyb2woZWRtYWMsIGNvbnRyb2wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG0ycF9jaGFubmVsX3N0YXRlKHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjKQoreworCXJldHVybiAocmVhZGwoZWRtYWMtPnJlZ3MgKyBNMlBfU1RBVFVTKSA+PiA0KSAmIDB4MzsKK30KKworc3RhdGljIHZvaWQgbTJwX2h3X3NodXRkb3duKHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjKQoreworCXUzMiBjb250cm9sOworCisJY29udHJvbCA9IHJlYWRsKGVkbWFjLT5yZWdzICsgTTJQX0NPTlRST0wpOworCWNvbnRyb2wgJj0gfihNMlBfQ09OVFJPTF9TVEFMTElOVCB8IE0yUF9DT05UUk9MX05GQklOVCk7CisJbTJwX3NldF9jb250cm9sKGVkbWFjLCBjb250cm9sKTsKKworCXdoaWxlIChtMnBfY2hhbm5lbF9zdGF0ZShlZG1hYykgPj0gTTJQX1NUQVRFX09OKQorCQljcHVfcmVsYXgoKTsKKworCW0ycF9zZXRfY29udHJvbChlZG1hYywgMCk7CisKKwl3aGlsZSAobTJwX2NoYW5uZWxfc3RhdGUoZWRtYWMpID09IE0yUF9TVEFURV9TVEFMTCkKKwkJY3B1X3JlbGF4KCk7Cit9CisKK3N0YXRpYyB2b2lkIG0ycF9maWxsX2Rlc2Moc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqZWRtYWMpCit7CisJc3RydWN0IGVwOTN4eF9kbWFfZGVzYyAqZGVzYyA9IGVwOTN4eF9kbWFfZ2V0X2FjdGl2ZShlZG1hYyk7CisJdTMyIGJ1c19hZGRyOworCisJaWYgKGVwOTN4eF9kbWFfY2hhbl9kaXJlY3Rpb24oJmVkbWFjLT5jaGFuKSA9PSBETUFfVE9fREVWSUNFKQorCQlidXNfYWRkciA9IGRlc2MtPnNyY19hZGRyOworCWVsc2UKKwkJYnVzX2FkZHIgPSBkZXNjLT5kc3RfYWRkcjsKKworCWlmIChlZG1hYy0+YnVmZmVyID09IDApIHsKKwkJd3JpdGVsKGRlc2MtPnNpemUsIGVkbWFjLT5yZWdzICsgTTJQX01BWENOVDApOworCQl3cml0ZWwoYnVzX2FkZHIsIGVkbWFjLT5yZWdzICsgTTJQX0JBU0UwKTsKKwl9IGVsc2UgeworCQl3cml0ZWwoZGVzYy0+c2l6ZSwgZWRtYWMtPnJlZ3MgKyBNMlBfTUFYQ05UMSk7CisJCXdyaXRlbChidXNfYWRkciwgZWRtYWMtPnJlZ3MgKyBNMlBfQkFTRTEpOworCX0KKworCWVkbWFjLT5idWZmZXIgXj0gMTsKK30KKworc3RhdGljIHZvaWQgbTJwX2h3X3N1Ym1pdChzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYykKK3sKKwl1MzIgY29udHJvbCA9IHJlYWRsKGVkbWFjLT5yZWdzICsgTTJQX0NPTlRST0wpOworCisJbTJwX2ZpbGxfZGVzYyhlZG1hYyk7CisJY29udHJvbCB8PSBNMlBfQ09OVFJPTF9TVEFMTElOVDsKKworCWlmIChlcDkzeHhfZG1hX2FkdmFuY2VfYWN0aXZlKGVkbWFjKSkgeworCQltMnBfZmlsbF9kZXNjKGVkbWFjKTsKKwkJY29udHJvbCB8PSBNMlBfQ09OVFJPTF9ORkJJTlQ7CisJfQorCisJbTJwX3NldF9jb250cm9sKGVkbWFjLCBjb250cm9sKTsKK30KKworc3RhdGljIGludCBtMnBfaHdfaW50ZXJydXB0KHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjKQoreworCXUzMiBpcnFfc3RhdHVzID0gcmVhZGwoZWRtYWMtPnJlZ3MgKyBNMlBfSU5URVJSVVBUKTsKKwl1MzIgY29udHJvbDsKKworCWlmIChpcnFfc3RhdHVzICYgTTJQX0lOVEVSUlVQVF9FUlJPUikgeworCQlzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjICpkZXNjID0gZXA5M3h4X2RtYV9nZXRfYWN0aXZlKGVkbWFjKTsKKworCQkvKiBDbGVhciB0aGUgZXJyb3IgaW50ZXJydXB0ICovCisJCXdyaXRlbCgxLCBlZG1hYy0+cmVncyArIE0yUF9JTlRFUlJVUFQpOworCisJCS8qCisJCSAqIEl0IHNlZW1zIHRoYXQgdGhlcmUgaXMgbm8gZWFzeSB3YXkgb2YgcmVwb3J0aW5nIGVycm9ycyBiYWNrCisJCSAqIHRvIGNsaWVudCBzbyB3ZSBqdXN0IHJlcG9ydCB0aGUgZXJyb3IgaGVyZSBhbmQgY29udGludWUgYXMKKwkJICogdXN1YWwuCisJCSAqCisJCSAqIFJldmlzaXQgdGhpcyB3aGVuIHRoZXJlIGlzIGEgbWVjaGFuaXNtIHRvIHJlcG9ydCBiYWNrIHRoZQorCQkgKiBlcnJvcnMuCisJCSAqLworCQlkZXZfZXJyKGNoYW4yZGV2KGVkbWFjKSwKKwkJCSJETUEgdHJhbnNmZXIgZmFpbGVkISBEZXRhaWxzOlxuIgorCQkJIlx0Y29va2llCTogJWRcbiIKKwkJCSJcdHNyY19hZGRyCTogMHglMDh4XG4iCisJCQkiXHRkc3RfYWRkcgk6IDB4JTA4eFxuIgorCQkJIlx0c2l6ZQkJOiAlenVcbiIsCisJCQlkZXNjLT50eGQuY29va2llLCBkZXNjLT5zcmNfYWRkciwgZGVzYy0+ZHN0X2FkZHIsCisJCQlkZXNjLT5zaXplKTsKKwl9CisKKwlzd2l0Y2ggKGlycV9zdGF0dXMgJiAoTTJQX0lOVEVSUlVQVF9TVEFMTCB8IE0yUF9JTlRFUlJVUFRfTkZCKSkgeworCWNhc2UgTTJQX0lOVEVSUlVQVF9TVEFMTDoKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCWNvbnRyb2wgPSByZWFkbChlZG1hYy0+cmVncyArIE0yUF9DT05UUk9MKTsKKwkJY29udHJvbCAmPSB+KE0yUF9DT05UUk9MX1NUQUxMSU5UIHwgTTJQX0NPTlRST0xfTkZCSU5UKTsKKwkJbTJwX3NldF9jb250cm9sKGVkbWFjLCBjb250cm9sKTsKKworCQlyZXR1cm4gSU5URVJSVVBUX0RPTkU7CisKKwljYXNlIE0yUF9JTlRFUlJVUFRfTkZCOgorCQlpZiAoZXA5M3h4X2RtYV9hZHZhbmNlX2FjdGl2ZShlZG1hYykpCisJCQltMnBfZmlsbF9kZXNjKGVkbWFjKTsKKworCQlyZXR1cm4gSU5URVJSVVBUX05FWFRfQlVGRkVSOworCX0KKworCXJldHVybiBJTlRFUlJVUFRfVU5LTk9XTjsKK30KKworLyoKKyAqIE0yTSBETUEgaW1wbGVtZW50YXRpb24KKyAqCisgKiBGb3IgdGhlIE0yTSB0cmFuc2ZlcnMgd2UgZG9uJ3QgdXNlIE5GQiBhdCBhbGwuIFRoaXMgaXMgYmVjYXVzZSBpdCBzaW1wbHkKKyAqIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggbWVtY3B5IHRyYW5zZmVycy4gV2hlbiB5b3Ugc3VibWl0IGJvdGggYnVmZmVycyBpdCBpcworICogZXh0cmVtZWx5IHVubGlrZWx5IHRoYXQgeW91IGdldCBhbiBORkIgaW50ZXJydXB0LCBidXQgaXQgaW5zdGVhZCByZXBvcnRzCisgKiBET05FIGludGVycnVwdCBhbmQgYm90aCBidWZmZXJzIGFyZSBhbHJlYWR5IHRyYW5zZmVycmVkIHdoaWNoIG1lYW5zIHRoYXQgd2UKKyAqIHdlcmVuJ3QgYWJsZSB0byB1cGRhdGUgdGhlIG5leHQgYnVmZmVyLgorICoKKyAqIFNvIGZvciBub3cgd2UgInNpbXVsYXRlIiBORkIgYnkganVzdCBzdWJtaXR0aW5nIGJ1ZmZlciBhZnRlciBidWZmZXIKKyAqIHdpdGhvdXQgZG91YmxlIGJ1ZmZlcmluZy4KKyAqLworCitzdGF0aWMgaW50IG0ybV9od19zZXR1cChzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYykKK3sKKwljb25zdCBzdHJ1Y3QgZXA5M3h4X2RtYV9kYXRhICpkYXRhID0gZWRtYWMtPmNoYW4ucHJpdmF0ZTsKKwl1MzIgY29udHJvbCA9IDA7CisKKwlpZiAoIWRhdGEpIHsKKwkJLyogVGhpcyBpcyBtZW1jcHkgY2hhbm5lbCwgbm90aGluZyB0byBjb25maWd1cmUgKi8KKwkJd3JpdGVsKGNvbnRyb2wsIGVkbWFjLT5yZWdzICsgTTJNX0NPTlRST0wpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGRhdGEtPnBvcnQpIHsKKwljYXNlIEVQOTNYWF9ETUFfU1NQOgorCQkvKgorCQkgKiBUaGlzIHdhcyBmb3VuZCB2aWEgZXhwZXJpbWVudGluZyAtIGFueXRoaW5nIGxlc3MgdGhhbiA1CisJCSAqIGNhdXNlcyB0aGUgY2hhbm5lbCB0byBwZXJmb3JtIG9ubHkgYSBwYXJ0aWFsIHRyYW5zZmVyIHdoaWNoCisJCSAqIGxlYWRzIHRvIHByb2JsZW1zIHNpbmNlIHdlIGRvbid0IGdldCBET05FIGludGVycnVwdCB0aGVuLgorCQkgKi8KKwkJY29udHJvbCA9ICg1IDw8IE0yTV9DT05UUk9MX1BXU0NfU0hJRlQpOworCQljb250cm9sIHw9IE0yTV9DT05UUk9MX05PX0hEU0s7CisKKwkJaWYgKGRhdGEtPmRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCQljb250cm9sIHw9IE0yTV9DT05UUk9MX0RBSDsKKwkJCWNvbnRyb2wgfD0gTTJNX0NPTlRST0xfVE1fVFg7CisJCQljb250cm9sIHw9IE0yTV9DT05UUk9MX1JTU19TU1BUWDsKKwkJfSBlbHNlIHsKKwkJCWNvbnRyb2wgfD0gTTJNX0NPTlRST0xfU0FIOworCQkJY29udHJvbCB8PSBNMk1fQ09OVFJPTF9UTV9SWDsKKwkJCWNvbnRyb2wgfD0gTTJNX0NPTlRST0xfUlNTX1NTUFJYOworCQl9CisJCWJyZWFrOworCisJY2FzZSBFUDkzWFhfRE1BX0lERToKKwkJLyoKKwkJICogVGhpcyBJREUgcGFydCBpcyB0b3RhbGx5IHVudGVzdGVkLiBWYWx1ZXMgYmVsb3cgYXJlIHRha2VuCisJCSAqIGZyb20gdGhlIEVQOTN4eCBVc2VycydzIEd1aWRlIGFuZCBtaWdodCBub3QgYmUgY29ycmVjdC4KKwkJICovCisJCWNvbnRyb2wgfD0gTTJNX0NPTlRST0xfTk9fSERTSzsKKwkJY29udHJvbCB8PSBNMk1fQ09OVFJPTF9SU1NfSURFOworCQljb250cm9sIHw9IE0yTV9DT05UUk9MX1BXXzE2OworCisJCWlmIChkYXRhLT5kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgeworCQkJLyogV29yc3QgY2FzZSBmcm9tIHRoZSBVRyAqLworCQkJY29udHJvbCA9ICgzIDw8IE0yTV9DT05UUk9MX1BXU0NfU0hJRlQpOworCQkJY29udHJvbCB8PSBNMk1fQ09OVFJPTF9EQUg7CisJCQljb250cm9sIHw9IE0yTV9DT05UUk9MX1RNX1RYOworCQl9IGVsc2UgeworCQkJY29udHJvbCA9ICgyIDw8IE0yTV9DT05UUk9MX1BXU0NfU0hJRlQpOworCQkJY29udHJvbCB8PSBNMk1fQ09OVFJPTF9TQUg7CisJCQljb250cm9sIHw9IE0yTV9DT05UUk9MX1RNX1JYOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd3JpdGVsKGNvbnRyb2wsIGVkbWFjLT5yZWdzICsgTTJNX0NPTlRST0wpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtMm1faHdfc2h1dGRvd24oc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqZWRtYWMpCit7CisJLyogSnVzdCBkaXNhYmxlIHRoZSBjaGFubmVsICovCisJd3JpdGVsKDAsIGVkbWFjLT5yZWdzICsgTTJNX0NPTlRST0wpOworfQorCitzdGF0aWMgdm9pZCBtMm1fZmlsbF9kZXNjKHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjKQoreworCXN0cnVjdCBlcDkzeHhfZG1hX2Rlc2MgKmRlc2MgPSBlcDkzeHhfZG1hX2dldF9hY3RpdmUoZWRtYWMpOworCisJaWYgKGVkbWFjLT5idWZmZXIgPT0gMCkgeworCQl3cml0ZWwoZGVzYy0+c3JjX2FkZHIsIGVkbWFjLT5yZWdzICsgTTJNX1NBUl9CQVNFMCk7CisJCXdyaXRlbChkZXNjLT5kc3RfYWRkciwgZWRtYWMtPnJlZ3MgKyBNMk1fREFSX0JBU0UwKTsKKwkJd3JpdGVsKGRlc2MtPnNpemUsIGVkbWFjLT5yZWdzICsgTTJNX0JDUjApOworCX0gZWxzZSB7CisJCXdyaXRlbChkZXNjLT5zcmNfYWRkciwgZWRtYWMtPnJlZ3MgKyBNMk1fU0FSX0JBU0UxKTsKKwkJd3JpdGVsKGRlc2MtPmRzdF9hZGRyLCBlZG1hYy0+cmVncyArIE0yTV9EQVJfQkFTRTEpOworCQl3cml0ZWwoZGVzYy0+c2l6ZSwgZWRtYWMtPnJlZ3MgKyBNMk1fQkNSMSk7CisJfQorCisJZWRtYWMtPmJ1ZmZlciBePSAxOworfQorCitzdGF0aWMgdm9pZCBtMm1faHdfc3VibWl0KHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjKQoreworCXN0cnVjdCBlcDkzeHhfZG1hX2RhdGEgKmRhdGEgPSBlZG1hYy0+Y2hhbi5wcml2YXRlOworCXUzMiBjb250cm9sID0gcmVhZGwoZWRtYWMtPnJlZ3MgKyBNMk1fQ09OVFJPTCk7CisKKwkvKgorCSAqIFNpbmNlIHdlIGFsbG93IGNsaWVudHMgdG8gY29uZmlndXJlIFBXIChwZXJpcGhlcmFsIHdpZHRoKSB3ZSBhbHdheXMKKwkgKiBjbGVhciBQVyBiaXRzIGhlcmUgYW5kIHRoZW4gc2V0IHRoZW0gYWNjb3JkaW5nIHdoYXQgaXMgZ2l2ZW4gaW4KKwkgKiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uLgorCSAqLworCWNvbnRyb2wgJj0gfk0yTV9DT05UUk9MX1BXX01BU0s7CisJY29udHJvbCB8PSBlZG1hYy0+cnVudGltZV9jdHJsOworCisJbTJtX2ZpbGxfZGVzYyhlZG1hYyk7CisJY29udHJvbCB8PSBNMk1fQ09OVFJPTF9ET05FSU5UOworCisJLyoKKwkgKiBOb3cgd2UgY2FuIGZpbmFsbHkgZW5hYmxlIHRoZSBjaGFubmVsLiBGb3IgTTJNIGNoYW5uZWwgdGhpcyBtdXN0IGJlCisJICogZG9uZSBfYWZ0ZXJfIHRoZSBCQ1J4IHJlZ2lzdGVycyBhcmUgcHJvZ3JhbW1lZC4KKwkgKi8KKwljb250cm9sIHw9IE0yTV9DT05UUk9MX0VOQUJMRTsKKwl3cml0ZWwoY29udHJvbCwgZWRtYWMtPnJlZ3MgKyBNMk1fQ09OVFJPTCk7CisKKwlpZiAoIWRhdGEpIHsKKwkJLyoKKwkJICogRm9yIG1lbWNweSBjaGFubmVscyB0aGUgc29mdHdhcmUgdHJpZ2dlciBtdXN0IGJlIGFzc2VydGVkCisJCSAqIGluIG9yZGVyIHRvIHN0YXJ0IHRoZSBtZW1jcHkgb3BlcmF0aW9uLgorCQkgKi8KKwkJY29udHJvbCB8PSBNMk1fQ09OVFJPTF9TVEFSVDsKKwkJd3JpdGVsKGNvbnRyb2wsIGVkbWFjLT5yZWdzICsgTTJNX0NPTlRST0wpOworCX0KK30KKworc3RhdGljIGludCBtMm1faHdfaW50ZXJydXB0KHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjKQoreworCXUzMiBjb250cm9sOworCisJaWYgKCEocmVhZGwoZWRtYWMtPnJlZ3MgKyBNMk1fSU5URVJSVVBUKSAmIE0yTV9JTlRFUlJVUFRfRE9ORUlOVCkpCisJCXJldHVybiBJTlRFUlJVUFRfVU5LTk9XTjsKKworCS8qIENsZWFyIHRoZSBET05FIGJpdCAqLworCXdyaXRlbCgwLCBlZG1hYy0+cmVncyArIE0yTV9JTlRFUlJVUFQpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCB0aGUgY2hhbm5lbCAqLworCWNvbnRyb2wgPSByZWFkbChlZG1hYy0+cmVncyArIE0yTV9DT05UUk9MKTsKKwljb250cm9sICY9IH4oTTJNX0NPTlRST0xfRE9ORUlOVCB8IE0yTV9DT05UUk9MX0VOQUJMRSk7CisJd3JpdGVsKGNvbnRyb2wsIGVkbWFjLT5yZWdzICsgTTJNX0NPTlRST0wpOworCisJLyoKKwkgKiBTaW5jZSB3ZSBvbmx5IGdldCBET05FIGludGVycnVwdCB3ZSBoYXZlIHRvIGZpbmQgb3V0IG91cnNlbHZlcworCSAqIHdoZXRoZXIgdGhlcmUgc3RpbGwgaXMgc29tZXRoaW5nIHRvIHByb2Nlc3MuIFNvIHdlIHRyeSB0byBhZHZhbmNlCisJICogdGhlIGNoYWluIGFuIHNlZSB3aGV0aGVyIGl0IHN1Y2NlZWRzLgorCSAqLworCWlmIChlcDkzeHhfZG1hX2FkdmFuY2VfYWN0aXZlKGVkbWFjKSkgeworCQllZG1hYy0+ZWRtYS0+aHdfc3VibWl0KGVkbWFjKTsKKwkJcmV0dXJuIElOVEVSUlVQVF9ORVhUX0JVRkZFUjsKKwl9CisKKwlyZXR1cm4gSU5URVJSVVBUX0RPTkU7Cit9CisKKy8qCisgKiBETUEgZW5naW5lIEFQSSBpbXBsZW1lbnRhdGlvbgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjICoKK2VwOTN4eF9kbWFfZGVzY19nZXQoc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqZWRtYWMpCit7CisJc3RydWN0IGVwOTN4eF9kbWFfZGVzYyAqZGVzYywgKl9kZXNjOworCXN0cnVjdCBlcDkzeHhfZG1hX2Rlc2MgKnJldCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlZG1hYy0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZGVzYywgJmVkbWFjLT5mcmVlX2xpc3QsIG5vZGUpIHsKKwkJaWYgKGFzeW5jX3R4X3Rlc3RfYWNrKCZkZXNjLT50eGQpKSB7CisJCQlsaXN0X2RlbF9pbml0KCZkZXNjLT5ub2RlKTsKKworCQkJLyogUmUtaW5pdGlhbGl6ZSB0aGUgZGVzY3JpcHRvciAqLworCQkJZGVzYy0+c3JjX2FkZHIgPSAwOworCQkJZGVzYy0+ZHN0X2FkZHIgPSAwOworCQkJZGVzYy0+c2l6ZSA9IDA7CisJCQlkZXNjLT5jb21wbGV0ZSA9IGZhbHNlOworCQkJZGVzYy0+dHhkLmNvb2tpZSA9IDA7CisJCQlkZXNjLT50eGQuY2FsbGJhY2sgPSBOVUxMOworCQkJZGVzYy0+dHhkLmNhbGxiYWNrX3BhcmFtID0gTlVMTDsKKworCQkJcmV0ID0gZGVzYzsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkbWFjLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZXA5M3h4X2RtYV9kZXNjX3B1dChzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYywKKwkJCQlzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjICpkZXNjKQoreworCWlmIChkZXNjKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVkbWFjLT5sb2NrLCBmbGFncyk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJmRlc2MtPnR4X2xpc3QsICZlZG1hYy0+ZnJlZV9saXN0KTsKKwkJbGlzdF9hZGQoJmRlc2MtPm5vZGUsICZlZG1hYy0+ZnJlZV9saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRtYWMtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKKy8qKgorICogZXA5M3h4X2RtYV9hZHZhbmNlX3dvcmsgLSBzdGFydCBwcm9jZXNzaW5nIHRoZSBuZXh0IHBlbmRpbmcgdHJhbnNhY3Rpb24KKyAqIEBlZG1hYzogY2hhbm5lbAorICoKKyAqIElmIHdlIGhhdmUgcGVuZGluZyB0cmFuc2FjdGlvbnMgcXVldWVkIGFuZCB3ZSBhcmUgY3VycmVudGx5IGlkbGluZywgdGhpcworICogZnVuY3Rpb24gdGFrZXMgdGhlIG5leHQgcXVldWVkIHRyYW5zYWN0aW9uIGZyb20gdGhlIEBlZG1hYy0+cXVldWUgYW5kCisgKiBwdXNoZXMgaXQgdG8gdGhlIGhhcmR3YXJlIGZvciBleGVjdXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIGVwOTN4eF9kbWFfYWR2YW5jZV93b3JrKHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjKQoreworCXN0cnVjdCBlcDkzeHhfZG1hX2Rlc2MgKm5ldzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVkbWFjLT5sb2NrLCBmbGFncyk7CisJaWYgKCFsaXN0X2VtcHR5KCZlZG1hYy0+YWN0aXZlKSB8fCBsaXN0X2VtcHR5KCZlZG1hYy0+cXVldWUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkbWFjLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBUYWtlIHRoZSBuZXh0IGRlc2NyaXB0b3IgZnJvbSB0aGUgcGVuZGluZyBxdWV1ZSAqLworCW5ldyA9IGxpc3RfZmlyc3RfZW50cnkoJmVkbWFjLT5xdWV1ZSwgc3RydWN0IGVwOTN4eF9kbWFfZGVzYywgbm9kZSk7CisJbGlzdF9kZWxfaW5pdCgmbmV3LT5ub2RlKTsKKworCWVwOTN4eF9kbWFfc2V0X2FjdGl2ZShlZG1hYywgbmV3KTsKKworCS8qIFB1c2ggaXQgdG8gdGhlIGhhcmR3YXJlICovCisJZWRtYWMtPmVkbWEtPmh3X3N1Ym1pdChlZG1hYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRtYWMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZXA5M3h4X2RtYV91bm1hcF9idWZmZXJzKHN0cnVjdCBlcDkzeHhfZG1hX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGVzYy0+dHhkLmNoYW4tPmRldmljZS0+ZGV2OworCisJaWYgKCEoZGVzYy0+dHhkLmZsYWdzICYgRE1BX0NPTVBMX1NLSVBfU1JDX1VOTUFQKSkgeworCQlpZiAoZGVzYy0+dHhkLmZsYWdzICYgRE1BX0NPTVBMX1NSQ19VTk1BUF9TSU5HTEUpCisJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgZGVzYy0+c3JjX2FkZHIsIGRlc2MtPnNpemUsCisJCQkJCSBETUFfVE9fREVWSUNFKTsKKwkJZWxzZQorCQkJZG1hX3VubWFwX3BhZ2UoZGV2LCBkZXNjLT5zcmNfYWRkciwgZGVzYy0+c2l6ZSwKKwkJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CisJfQorCWlmICghKGRlc2MtPnR4ZC5mbGFncyAmIERNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVApKSB7CisJCWlmIChkZXNjLT50eGQuZmxhZ3MgJiBETUFfQ09NUExfREVTVF9VTk1BUF9TSU5HTEUpCisJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgZGVzYy0+ZHN0X2FkZHIsIGRlc2MtPnNpemUsCisJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQllbHNlCisJCQlkbWFfdW5tYXBfcGFnZShkZXYsIGRlc2MtPmRzdF9hZGRyLCBkZXNjLT5zaXplLAorCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCX0KK30KKworc3RhdGljIHZvaWQgZXA5M3h4X2RtYV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYyA9IChzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICopZGF0YTsKKwlzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjICpkZXNjLCAqZDsKKwlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2s7CisJdm9pZCAqY2FsbGJhY2tfcGFyYW07CisJTElTVF9IRUFEKGxpc3QpOworCisJc3Bpbl9sb2NrX2lycSgmZWRtYWMtPmxvY2spOworCWRlc2MgPSBlcDkzeHhfZG1hX2dldF9hY3RpdmUoZWRtYWMpOworCWlmIChkZXNjLT5jb21wbGV0ZSkgeworCQllZG1hYy0+bGFzdF9jb21wbGV0ZWQgPSBkZXNjLT50eGQuY29va2llOworCQlsaXN0X3NwbGljZV9pbml0KCZlZG1hYy0+YWN0aXZlLCAmbGlzdCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmZWRtYWMtPmxvY2spOworCisJLyogUGljayB1cCB0aGUgbmV4dCBkZXNjcmlwdG9yIGZyb20gdGhlIHF1ZXVlICovCisJZXA5M3h4X2RtYV9hZHZhbmNlX3dvcmsoZWRtYWMpOworCisJY2FsbGJhY2sgPSBkZXNjLT50eGQuY2FsbGJhY2s7CisJY2FsbGJhY2tfcGFyYW0gPSBkZXNjLT50eGQuY2FsbGJhY2tfcGFyYW07CisKKwkvKiBOb3cgd2UgY2FuIHJlbGVhc2UgYWxsIHRoZSBjaGFpbmVkIGRlc2NyaXB0b3JzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIGQsICZsaXN0LCBub2RlKSB7CisJCS8qCisJCSAqIEZvciB0aGUgbWVtY3B5IGNoYW5uZWxzIHRoZSBBUEkgcmVxdWlyZXMgdXMgdG8gdW5tYXAgdGhlCisJCSAqIGJ1ZmZlcnMgdW5sZXNzIHJlcXVlc3RlZCBvdGhlcndpc2UuCisJCSAqLworCQlpZiAoIWVkbWFjLT5jaGFuLnByaXZhdGUpCisJCQllcDkzeHhfZG1hX3VubWFwX2J1ZmZlcnMoZGVzYyk7CisKKwkJZXA5M3h4X2RtYV9kZXNjX3B1dChlZG1hYywgZGVzYyk7CisJfQorCisJaWYgKGNhbGxiYWNrKQorCQljYWxsYmFjayhjYWxsYmFja19wYXJhbSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlcDkzeHhfZG1hX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqZWRtYWMgPSBkZXZfaWQ7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwlzcGluX2xvY2soJmVkbWFjLT5sb2NrKTsKKworCXN3aXRjaCAoZWRtYWMtPmVkbWEtPmh3X2ludGVycnVwdChlZG1hYykpIHsKKwljYXNlIElOVEVSUlVQVF9ET05FOgorCQllcDkzeHhfZG1hX2dldF9hY3RpdmUoZWRtYWMpLT5jb21wbGV0ZSA9IHRydWU7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmVkbWFjLT50YXNrbGV0KTsKKwkJYnJlYWs7CisKKwljYXNlIElOVEVSUlVQVF9ORVhUX0JVRkZFUjoKKwkJaWYgKHRlc3RfYml0KEVQOTNYWF9ETUFfSVNfQ1lDTElDLCAmZWRtYWMtPmZsYWdzKSkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmVkbWFjLT50YXNrbGV0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfd2FybihjaGFuMmRldihlZG1hYyksICJ1bmtub3duIGludGVycnVwdCFcbiIpOworCQlyZXQgPSBJUlFfTk9ORTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2soJmVkbWFjLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGVwOTN4eF9kbWFfdHhfc3VibWl0IC0gc2V0IHRoZSBwcmVwYXJlZCBkZXNjcmlwdG9yKHMpIHRvIGJlIGV4ZWN1dGVkCisgKiBAdHg6IGRlc2NyaXB0b3IgdG8gYmUgZXhlY3V0ZWQKKyAqCisgKiBGdW5jdGlvbiB3aWxsIGV4ZWN1dGUgZ2l2ZW4gZGVzY3JpcHRvciBvbiB0aGUgaGFyZHdhcmUgb3IgaWYgdGhlIGhhcmR3YXJlCisgKiBpcyBidXN5LCBxdWV1ZSB0aGUgZGVzY3JpcHRvciB0byBiZSBleGVjdXRlZCBsYXRlciBvbi4gUmV0dXJucyBjb29raWUgd2hpY2gKKyAqIGNhbiBiZSB1c2VkIHRvIHBvbGwgdGhlIHN0YXR1cyBvZiB0aGUgZGVzY3JpcHRvci4KKyAqLworc3RhdGljIGRtYV9jb29raWVfdCBlcDkzeHhfZG1hX3R4X3N1Ym1pdChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQoreworCXN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjID0gdG9fZXA5M3h4X2RtYV9jaGFuKHR4LT5jaGFuKTsKKwlzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjICpkZXNjOworCWRtYV9jb29raWVfdCBjb29raWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlZG1hYy0+bG9jaywgZmxhZ3MpOworCisJY29va2llID0gZWRtYWMtPmNoYW4uY29va2llOworCisJaWYgKCsrY29va2llIDwgMCkKKwkJY29va2llID0gMTsKKworCWRlc2MgPSBjb250YWluZXJfb2YodHgsIHN0cnVjdCBlcDkzeHhfZG1hX2Rlc2MsIHR4ZCk7CisKKwllZG1hYy0+Y2hhbi5jb29raWUgPSBjb29raWU7CisJZGVzYy0+dHhkLmNvb2tpZSA9IGNvb2tpZTsKKworCS8qCisJICogSWYgbm90aGluZyBpcyBjdXJyZW50bHkgcHJvc2Vzc2VkLCB3ZSBwdXNoIHRoaXMgZGVzY3JpcHRvcgorCSAqIGRpcmVjdGx5IHRvIHRoZSBoYXJkd2FyZS4gT3RoZXJ3aXNlIHdlIHB1dCB0aGUgZGVzY3JpcHRvcgorCSAqIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLgorCSAqLworCWlmIChsaXN0X2VtcHR5KCZlZG1hYy0+YWN0aXZlKSkgeworCQllcDkzeHhfZG1hX3NldF9hY3RpdmUoZWRtYWMsIGRlc2MpOworCQllZG1hYy0+ZWRtYS0+aHdfc3VibWl0KGVkbWFjKTsKKwl9IGVsc2UgeworCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5ub2RlLCAmZWRtYWMtPnF1ZXVlKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZG1hYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBjb29raWU7Cit9CisKKy8qKgorICogZXA5M3h4X2RtYV9hbGxvY19jaGFuX3Jlc291cmNlcyAtIGFsbG9jYXRlIHJlc291cmNlcyBmb3IgdGhlIGNoYW5uZWwKKyAqIEBjaGFuOiBjaGFubmVsIHRvIGFsbG9jYXRlIHJlc291cmNlcworICoKKyAqIEZ1bmN0aW9uIGFsbG9jYXRlcyBuZWNlc3NhcnkgcmVzb3VyY2VzIGZvciB0aGUgZ2l2ZW4gRE1BIGNoYW5uZWwgYW5kCisgKiByZXR1cm5zIG51bWJlciBvZiBhbGxvY2F0ZWQgZGVzY3JpcHRvcnMgZm9yIHRoZSBjaGFubmVsLiBOZWdhdGl2ZSBlcnJubworICogaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGVwOTN4eF9kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjID0gdG9fZXA5M3h4X2RtYV9jaGFuKGNoYW4pOworCXN0cnVjdCBlcDkzeHhfZG1hX2RhdGEgKmRhdGEgPSBjaGFuLT5wcml2YXRlOworCWNvbnN0IGNoYXIgKm5hbWUgPSBkbWFfY2hhbl9uYW1lKGNoYW4pOworCWludCByZXQsIGk7CisKKwkvKiBTYW5pdHkgY2hlY2sgdGhlIGNoYW5uZWwgcGFyYW1ldGVycyAqLworCWlmICghZWRtYWMtPmVkbWEtPm0ybSkgeworCQlpZiAoIWRhdGEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGRhdGEtPnBvcnQgPCBFUDkzWFhfRE1BX0kyUzEgfHwKKwkJICAgIGRhdGEtPnBvcnQgPiBFUDkzWFhfRE1BX0lSREEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGRhdGEtPmRpcmVjdGlvbiAhPSBlcDkzeHhfZG1hX2NoYW5fZGlyZWN0aW9uKGNoYW4pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJaWYgKGRhdGEpIHsKKwkJCXN3aXRjaCAoZGF0YS0+cG9ydCkgeworCQkJY2FzZSBFUDkzWFhfRE1BX1NTUDoKKwkJCWNhc2UgRVA5M1hYX0RNQV9JREU6CisJCQkJaWYgKGRhdGEtPmRpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFICYmCisJCQkJICAgIGRhdGEtPmRpcmVjdGlvbiAhPSBETUFfRlJPTV9ERVZJQ0UpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChkYXRhICYmIGRhdGEtPm5hbWUpCisJCW5hbWUgPSBkYXRhLT5uYW1lOworCisJcmV0ID0gY2xrX2VuYWJsZShlZG1hYy0+Y2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEoZWRtYWMtPmlycSwgZXA5M3h4X2RtYV9pbnRlcnJ1cHQsIDAsIG5hbWUsIGVkbWFjKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfY2xrX2Rpc2FibGU7CisKKwlzcGluX2xvY2tfaXJxKCZlZG1hYy0+bG9jayk7CisJZWRtYWMtPmxhc3RfY29tcGxldGVkID0gMTsKKwllZG1hYy0+Y2hhbi5jb29raWUgPSAxOworCXJldCA9IGVkbWFjLT5lZG1hLT5od19zZXR1cChlZG1hYyk7CisJc3Bpbl91bmxvY2tfaXJxKCZlZG1hYy0+bG9jayk7CisKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfZnJlZV9pcnE7CisKKwlmb3IgKGkgPSAwOyBpIDwgRE1BX01BWF9DSEFOX0RFU0NSSVBUT1JTOyBpKyspIHsKKwkJc3RydWN0IGVwOTN4eF9kbWFfZGVzYyAqZGVzYzsKKworCQlkZXNjID0ga3phbGxvYyhzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkZXNjKSB7CisJCQlkZXZfd2FybihjaGFuMmRldihlZG1hYyksICJub3QgZW5vdWdoIGRlc2NyaXB0b3JzXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJSU5JVF9MSVNUX0hFQUQoJmRlc2MtPnR4X2xpc3QpOworCisJCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJmRlc2MtPnR4ZCwgY2hhbik7CisJCWRlc2MtPnR4ZC5mbGFncyA9IERNQV9DVFJMX0FDSzsKKwkJZGVzYy0+dHhkLnR4X3N1Ym1pdCA9IGVwOTN4eF9kbWFfdHhfc3VibWl0OworCisJCWVwOTN4eF9kbWFfZGVzY19wdXQoZWRtYWMsIGRlc2MpOworCX0KKworCXJldHVybiBpOworCitmYWlsX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGVkbWFjLT5pcnEsIGVkbWFjKTsKK2ZhaWxfY2xrX2Rpc2FibGU6CisJY2xrX2Rpc2FibGUoZWRtYWMtPmNsayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGVwOTN4eF9kbWFfZnJlZV9jaGFuX3Jlc291cmNlcyAtIHJlbGVhc2UgcmVzb3VyY2VzIGZvciB0aGUgY2hhbm5lbAorICogQGNoYW46IGNoYW5uZWwKKyAqCisgKiBGdW5jdGlvbiByZWxlYXNlcyBhbGwgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIHRoZSBnaXZlbiBjaGFubmVsLgorICogVGhlIGNoYW5uZWwgbXVzdCBiZSBpZGxlIHdoZW4gdGhpcyBpcyBjYWxsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGVwOTN4eF9kbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqZWRtYWMgPSB0b19lcDkzeHhfZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IGVwOTN4eF9kbWFfZGVzYyAqZGVzYywgKmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlMSVNUX0hFQUQobGlzdCk7CisKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmVkbWFjLT5hY3RpdmUpKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmVkbWFjLT5xdWV1ZSkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVkbWFjLT5sb2NrLCBmbGFncyk7CisJZWRtYWMtPmVkbWEtPmh3X3NodXRkb3duKGVkbWFjKTsKKwllZG1hYy0+cnVudGltZV9hZGRyID0gMDsKKwllZG1hYy0+cnVudGltZV9jdHJsID0gMDsKKwllZG1hYy0+YnVmZmVyID0gMDsKKwlsaXN0X3NwbGljZV9pbml0KCZlZG1hYy0+ZnJlZV9saXN0LCAmbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRtYWMtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBkLCAmbGlzdCwgbm9kZSkKKwkJa2ZyZWUoZGVzYyk7CisKKwljbGtfZGlzYWJsZShlZG1hYy0+Y2xrKTsKKwlmcmVlX2lycShlZG1hYy0+aXJxLCBlZG1hYyk7Cit9CisKKy8qKgorICogZXA5M3h4X2RtYV9wcmVwX2RtYV9tZW1jcHkgLSBwcmVwYXJlIGEgbWVtY3B5IERNQSBvcGVyYXRpb24KKyAqIEBjaGFuOiBjaGFubmVsCisgKiBAZGVzdDogZGVzdGluYXRpb24gYnVzIGFkZHJlc3MKKyAqIEBzcmM6IHNvdXJjZSBidXMgYWRkcmVzcworICogQGxlbjogc2l6ZSBvZiB0aGUgdHJhbnNhY3Rpb24KKyAqIEBmbGFnczogZmxhZ3MgZm9yIHRoZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJucyBhIHZhbGlkIERNQSBkZXNjcmlwdG9yIG9yICVOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2VwOTN4eF9kbWFfcHJlcF9kbWFfbWVtY3B5KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkZXN0LAorCQkJICAgZG1hX2FkZHJfdCBzcmMsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqZWRtYWMgPSB0b19lcDkzeHhfZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IGVwOTN4eF9kbWFfZGVzYyAqZGVzYywgKmZpcnN0OworCXNpemVfdCBieXRlcywgb2Zmc2V0OworCisJZmlyc3QgPSBOVUxMOworCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbGVuOyBvZmZzZXQgKz0gYnl0ZXMpIHsKKwkJZGVzYyA9IGVwOTN4eF9kbWFfZGVzY19nZXQoZWRtYWMpOworCQlpZiAoIWRlc2MpIHsKKwkJCWRldl93YXJuKGNoYW4yZGV2KGVkbWFjKSwgImNvdWxuJ3QgZ2V0IGRlc2NyaXB0b3JcbiIpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJYnl0ZXMgPSBtaW5fdChzaXplX3QsIGxlbiAtIG9mZnNldCwgRE1BX01BWF9DSEFOX0JZVEVTKTsKKworCQlkZXNjLT5zcmNfYWRkciA9IHNyYyArIG9mZnNldDsKKwkJZGVzYy0+ZHN0X2FkZHIgPSBkZXN0ICsgb2Zmc2V0OworCQlkZXNjLT5zaXplID0gYnl0ZXM7CisKKwkJaWYgKCFmaXJzdCkKKwkJCWZpcnN0ID0gZGVzYzsKKwkJZWxzZQorCQkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+bm9kZSwgJmZpcnN0LT50eF9saXN0KTsKKwl9CisKKwlmaXJzdC0+dHhkLmNvb2tpZSA9IC1FQlVTWTsKKwlmaXJzdC0+dHhkLmZsYWdzID0gZmxhZ3M7CisKKwlyZXR1cm4gJmZpcnN0LT50eGQ7CitmYWlsOgorCWVwOTN4eF9kbWFfZGVzY19wdXQoZWRtYWMsIGZpcnN0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBlcDkzeHhfZG1hX3ByZXBfc2xhdmVfc2cgLSBwcmVwYXJlIGEgc2xhdmUgRE1BIG9wZXJhdGlvbgorICogQGNoYW46IGNoYW5uZWwKKyAqIEBzZ2w6IGxpc3Qgb2YgYnVmZmVycyB0byB0cmFuc2ZlcgorICogQHNnX2xlbjogbnVtYmVyIG9mIGVudHJpZXMgaW4gQHNnbAorICogQGRpcjogZGlyZWN0aW9uIG9mIHRoYSBETUEgdHJhbnNmZXIKKyAqIEBmbGFnczogZmxhZ3MgZm9yIHRoZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJucyBhIHZhbGlkIERNQSBkZXNjcmlwdG9yIG9yICVOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCitlcDkzeHhfZG1hX3ByZXBfc2xhdmVfc2coc3RydWN0IGRtYV9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKKwkJCSB1bnNpZ25lZCBpbnQgc2dfbGVuLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYyA9IHRvX2VwOTN4eF9kbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjICpkZXNjLCAqZmlyc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgaTsKKworCWlmICghZWRtYWMtPmVkbWEtPm0ybSAmJiBkaXIgIT0gZXA5M3h4X2RtYV9jaGFuX2RpcmVjdGlvbihjaGFuKSkgeworCQlkZXZfd2FybihjaGFuMmRldihlZG1hYyksCisJCQkgImNoYW5uZWwgd2FzIGNvbmZpZ3VyZWQgd2l0aCBkaWZmZXJlbnQgZGlyZWN0aW9uXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHRlc3RfYml0KEVQOTNYWF9ETUFfSVNfQ1lDTElDLCAmZWRtYWMtPmZsYWdzKSkgeworCQlkZXZfd2FybihjaGFuMmRldihlZG1hYyksCisJCQkgImNoYW5uZWwgaXMgYWxyZWFkeSB1c2VkIGZvciBjeWNsaWMgdHJhbnNmZXJzXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZmlyc3QgPSBOVUxMOworCWZvcl9lYWNoX3NnKHNnbCwgc2csIHNnX2xlbiwgaSkgeworCQlzaXplX3Qgc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7CisKKwkJaWYgKHNnX2xlbiA+IERNQV9NQVhfQ0hBTl9CWVRFUykgeworCQkJZGV2X3dhcm4oY2hhbjJkZXYoZWRtYWMpLCAidG9vIGJpZyB0cmFuc2ZlciBzaXplICVkXG4iLAorCQkJCSBzZ19sZW4pOworCQkJZ290byBmYWlsOworCQl9CisKKwkJZGVzYyA9IGVwOTN4eF9kbWFfZGVzY19nZXQoZWRtYWMpOworCQlpZiAoIWRlc2MpIHsKKwkJCWRldl93YXJuKGNoYW4yZGV2KGVkbWFjKSwgImNvdWxuJ3QgZ2V0IGRlc2NyaXB0b3JcbiIpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJaWYgKGRpciA9PSBETUFfVE9fREVWSUNFKSB7CisJCQlkZXNjLT5zcmNfYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCWRlc2MtPmRzdF9hZGRyID0gZWRtYWMtPnJ1bnRpbWVfYWRkcjsKKwkJfSBlbHNlIHsKKwkJCWRlc2MtPnNyY19hZGRyID0gZWRtYWMtPnJ1bnRpbWVfYWRkcjsKKwkJCWRlc2MtPmRzdF9hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOworCQl9CisJCWRlc2MtPnNpemUgPSBzZ19sZW47CisKKwkJaWYgKCFmaXJzdCkKKwkJCWZpcnN0ID0gZGVzYzsKKwkJZWxzZQorCQkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+bm9kZSwgJmZpcnN0LT50eF9saXN0KTsKKwl9CisKKwlmaXJzdC0+dHhkLmNvb2tpZSA9IC1FQlVTWTsKKwlmaXJzdC0+dHhkLmZsYWdzID0gZmxhZ3M7CisKKwlyZXR1cm4gJmZpcnN0LT50eGQ7CisKK2ZhaWw6CisJZXA5M3h4X2RtYV9kZXNjX3B1dChlZG1hYywgZmlyc3QpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGVwOTN4eF9kbWFfcHJlcF9kbWFfY3ljbGljIC0gcHJlcGFyZSBhIGN5Y2xpYyBETUEgb3BlcmF0aW9uCisgKiBAY2hhbjogY2hhbm5lbAorICogQGRtYV9hZGRyOiBETUEgbWFwcGVkIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICogQGJ1Zl9sZW46IGxlbmd0aCBvZiB0aGUgYnVmZmVyIChpbiBieXRlcykKKyAqIEBwZXJpb2RfbGVuOiBsZW5naHQgb2YgYSBzaW5nbGUgcGVyaW9kCisgKiBAZGlyOiBkaXJlY3Rpb24gb2YgdGhlIG9wZXJhdGlvbgorICoKKyAqIFByZXBhcmVzIGEgZGVzY3JpcHRvciBmb3IgY3ljbGljIERNQSBvcGVyYXRpb24uIFRoaXMgbWVhbnMgdGhhdCBvbmNlIHRoZQorICogZGVzY3JpcHRvciBpcyBzdWJtaXR0ZWQsIHdlIHdpbGwgYmUgc3VibWl0dGluZyBpbiBhIEBwZXJpb2RfbGVuIHNpemVkCisgKiBidWZmZXJzIGFuZCBjYWxsaW5nIGNhbGxiYWNrIG9uY2UgdGhlIHBlcmlvZCBoYXMgYmVlbiBlbGFwc2VkLiBUcmFuc2ZlcgorICogdGVybWluYXRlcyBvbmx5IHdoZW4gY2xpZW50IGNhbGxzIGRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKCkgZm9yIHRoaXMKKyAqIGNoYW5uZWwuCisgKgorICogUmV0dXJucyBhIHZhbGlkIERNQSBkZXNjcmlwdG9yIG9yICVOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCitlcDkzeHhfZG1hX3ByZXBfZG1hX2N5Y2xpYyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQkgICBzaXplX3QgYnVmX2xlbiwgc2l6ZV90IHBlcmlvZF9sZW4sCisJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqZWRtYWMgPSB0b19lcDkzeHhfZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IGVwOTN4eF9kbWFfZGVzYyAqZGVzYywgKmZpcnN0OworCXNpemVfdCBvZmZzZXQgPSAwOworCisJaWYgKCFlZG1hYy0+ZWRtYS0+bTJtICYmIGRpciAhPSBlcDkzeHhfZG1hX2NoYW5fZGlyZWN0aW9uKGNoYW4pKSB7CisJCWRldl93YXJuKGNoYW4yZGV2KGVkbWFjKSwKKwkJCSAiY2hhbm5lbCB3YXMgY29uZmlndXJlZCB3aXRoIGRpZmZlcmVudCBkaXJlY3Rpb25cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChFUDkzWFhfRE1BX0lTX0NZQ0xJQywgJmVkbWFjLT5mbGFncykpIHsKKwkJZGV2X3dhcm4oY2hhbjJkZXYoZWRtYWMpLAorCQkJICJjaGFubmVsIGlzIGFscmVhZHkgdXNlZCBmb3IgY3ljbGljIHRyYW5zZmVyc1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChwZXJpb2RfbGVuID4gRE1BX01BWF9DSEFOX0JZVEVTKSB7CisJCWRldl93YXJuKGNoYW4yZGV2KGVkbWFjKSwgInRvbyBiaWcgcGVyaW9kIGxlbmd0aCAlZFxuIiwKKwkJCSBwZXJpb2RfbGVuKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogU3BsaXQgdGhlIGJ1ZmZlciBpbnRvIHBlcmlvZCBzaXplIGNodW5rcyAqLworCWZpcnN0ID0gTlVMTDsKKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGJ1Zl9sZW47IG9mZnNldCArPSBwZXJpb2RfbGVuKSB7CisJCWRlc2MgPSBlcDkzeHhfZG1hX2Rlc2NfZ2V0KGVkbWFjKTsKKwkJaWYgKCFkZXNjKSB7CisJCQlkZXZfd2FybihjaGFuMmRldihlZG1hYyksICJjb3Vsbid0IGdldCBkZXNjcmlwdG9yXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmIChkaXIgPT0gRE1BX1RPX0RFVklDRSkgeworCQkJZGVzYy0+c3JjX2FkZHIgPSBkbWFfYWRkciArIG9mZnNldDsKKwkJCWRlc2MtPmRzdF9hZGRyID0gZWRtYWMtPnJ1bnRpbWVfYWRkcjsKKwkJfSBlbHNlIHsKKwkJCWRlc2MtPnNyY19hZGRyID0gZWRtYWMtPnJ1bnRpbWVfYWRkcjsKKwkJCWRlc2MtPmRzdF9hZGRyID0gZG1hX2FkZHIgKyBvZmZzZXQ7CisJCX0KKworCQlkZXNjLT5zaXplID0gcGVyaW9kX2xlbjsKKworCQlpZiAoIWZpcnN0KQorCQkJZmlyc3QgPSBkZXNjOworCQllbHNlCisJCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5ub2RlLCAmZmlyc3QtPnR4X2xpc3QpOworCX0KKworCWZpcnN0LT50eGQuY29va2llID0gLUVCVVNZOworCisJcmV0dXJuICZmaXJzdC0+dHhkOworCitmYWlsOgorCWVwOTN4eF9kbWFfZGVzY19wdXQoZWRtYWMsIGZpcnN0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBlcDkzeHhfZG1hX3Rlcm1pbmF0ZV9hbGwgLSB0ZXJtaW5hdGUgYWxsIHRyYW5zYWN0aW9ucworICogQGVkbWFjOiBjaGFubmVsCisgKgorICogU3RvcHMgYWxsIERNQSB0cmFuc2FjdGlvbnMuIEFsbCBkZXNjcmlwdG9ycyBhcmUgcHV0IGJhY2sgdG8gdGhlCisgKiBAZWRtYWMtPmZyZWVfbGlzdCBhbmQgY2FsbGJhY2tzIGFyZSBfbm90XyBjYWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgZXA5M3h4X2RtYV90ZXJtaW5hdGVfYWxsKHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjKQoreworCXN0cnVjdCBlcDkzeHhfZG1hX2Rlc2MgKmRlc2MsICpfZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUxJU1RfSEVBRChsaXN0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlZG1hYy0+bG9jaywgZmxhZ3MpOworCS8qIEZpcnN0IHdlIGRpc2FibGUgYW5kIGZsdXNoIHRoZSBETUEgY2hhbm5lbCAqLworCWVkbWFjLT5lZG1hLT5od19zaHV0ZG93bihlZG1hYyk7CisJY2xlYXJfYml0KEVQOTNYWF9ETUFfSVNfQ1lDTElDLCAmZWRtYWMtPmZsYWdzKTsKKwlsaXN0X3NwbGljZV9pbml0KCZlZG1hYy0+YWN0aXZlLCAmbGlzdCk7CisJbGlzdF9zcGxpY2VfaW5pdCgmZWRtYWMtPnF1ZXVlLCAmbGlzdCk7CisJLyoKKwkgKiBXZSB0aGVuIHJlLWVuYWJsZSB0aGUgY2hhbm5lbC4gVGhpcyB3YXkgd2UgY2FuIGNvbnRpbnVlIHN1Ym1pdHRpbmcKKwkgKiB0aGUgZGVzY3JpcHRvcnMgYnkganVzdCBjYWxsaW5nIC0+aHdfc3VibWl0KCkgYWdhaW4uCisJICovCisJZWRtYWMtPmVkbWEtPmh3X3NldHVwKGVkbWFjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZG1hYy0+bG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kLCAmbGlzdCwgbm9kZSkKKwkJZXA5M3h4X2RtYV9kZXNjX3B1dChlZG1hYywgZGVzYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlcDkzeHhfZG1hX3NsYXZlX2NvbmZpZyhzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYywKKwkJCQkgICBzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqY29uZmlnKQoreworCWVudW0gZG1hX3NsYXZlX2J1c3dpZHRoIHdpZHRoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGFkZHIsIGN0cmw7CisKKwlpZiAoIWVkbWFjLT5lZG1hLT5tMm0pCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjb25maWctPmRpcmVjdGlvbikgeworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQl3aWR0aCA9IGNvbmZpZy0+c3JjX2FkZHJfd2lkdGg7CisJCWFkZHIgPSBjb25maWctPnNyY19hZGRyOworCQlicmVhazsKKworCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJd2lkdGggPSBjb25maWctPmRzdF9hZGRyX3dpZHRoOworCQlhZGRyID0gY29uZmlnLT5kc3RfYWRkcjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOgorCQljdHJsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzoKKwkJY3RybCA9IE0yTV9DT05UUk9MX1BXXzE2OworCQlicmVhazsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOgorCQljdHJsID0gTTJNX0NPTlRST0xfUFdfMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZlZG1hYy0+bG9jaywgZmxhZ3MpOworCWVkbWFjLT5ydW50aW1lX2FkZHIgPSBhZGRyOworCWVkbWFjLT5ydW50aW1lX2N0cmwgPSBjdHJsOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkbWFjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlcDkzeHhfZG1hX2NvbnRyb2wgLSBtYW5pcHVsYXRlIGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgb24gYSBjaGFubmVsCisgKiBAY2hhbjogY2hhbm5lbAorICogQGNtZDogY29udHJvbCBjb21tYW5kIHRvIHBlcmZvcm0KKyAqIEBhcmc6IG9wdGlvbmFsIGFyZ3VtZW50CisgKgorICogQ29udHJvbHMgdGhlIGNoYW5uZWwuIEZ1bmN0aW9uIHJldHVybnMgJTAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIG5lZ2F0aXZlCisgKiBlcnJvciBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgZXA5M3h4X2RtYV9jb250cm9sKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZW51bSBkbWFfY3RybF9jbWQgY21kLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqZWRtYWMgPSB0b19lcDkzeHhfZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNvbmZpZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBETUFfVEVSTUlOQVRFX0FMTDoKKwkJcmV0dXJuIGVwOTN4eF9kbWFfdGVybWluYXRlX2FsbChlZG1hYyk7CisKKwljYXNlIERNQV9TTEFWRV9DT05GSUc6CisJCWNvbmZpZyA9IChzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqKWFyZzsKKwkJcmV0dXJuIGVwOTN4eF9kbWFfc2xhdmVfY29uZmlnKGVkbWFjLCBjb25maWcpOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIC1FTk9TWVM7Cit9CisKKy8qKgorICogZXA5M3h4X2RtYV90eF9zdGF0dXMgLSBjaGVjayBpZiBhIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlZAorICogQGNoYW46IGNoYW5uZWwKKyAqIEBjb29raWU6IHRyYW5zYWN0aW9uIHNwZWNpZmljIGNvb2tpZQorICogQHN0YXRlOiBzdGF0ZSBvZiB0aGUgdHJhbnNhY3Rpb24gaXMgc3RvcmVkIGhlcmUgaWYgZ2l2ZW4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IHN0YXRlIG9mIGEgZ2l2ZW4gdHJhbnNhY3Rpb24uCisgKi8KK3N0YXRpYyBlbnVtIGRtYV9zdGF0dXMgZXA5M3h4X2RtYV90eF9zdGF0dXMoc3RydWN0IGRtYV9jaGFuICpjaGFuLAorCQkJCQkgICAgZG1hX2Nvb2tpZV90IGNvb2tpZSwKKwkJCQkJICAgIHN0cnVjdCBkbWFfdHhfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjID0gdG9fZXA5M3h4X2RtYV9jaGFuKGNoYW4pOworCWRtYV9jb29raWVfdCBsYXN0X3VzZWQsIGxhc3RfY29tcGxldGVkOworCWVudW0gZG1hX3N0YXR1cyByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlZG1hYy0+bG9jaywgZmxhZ3MpOworCWxhc3RfdXNlZCA9IGNoYW4tPmNvb2tpZTsKKwlsYXN0X2NvbXBsZXRlZCA9IGVkbWFjLT5sYXN0X2NvbXBsZXRlZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZG1hYy0+bG9jaywgZmxhZ3MpOworCisJcmV0ID0gZG1hX2FzeW5jX2lzX2NvbXBsZXRlKGNvb2tpZSwgbGFzdF9jb21wbGV0ZWQsIGxhc3RfdXNlZCk7CisJZG1hX3NldF90eF9zdGF0ZShzdGF0ZSwgbGFzdF9jb21wbGV0ZWQsIGxhc3RfdXNlZCwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGVwOTN4eF9kbWFfaXNzdWVfcGVuZGluZyAtIHB1c2ggcGVuZGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIGhhcmR3YXJlCisgKiBAY2hhbjogY2hhbm5lbAorICoKKyAqIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbCBwZW5kaW5nIHRyYW5zYWN0aW9ucyBhcmUgcHVzaGVkIHRvIHRoZQorICogaGFyZHdhcmUgYW5kIGV4ZWN1dGVkLgorICovCitzdGF0aWMgdm9pZCBlcDkzeHhfZG1hX2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCWVwOTN4eF9kbWFfYWR2YW5jZV93b3JrKHRvX2VwOTN4eF9kbWFfY2hhbihjaGFuKSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVwOTN4eF9kbWFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZXA5M3h4X2RtYV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGVwOTN4eF9kbWFfZW5naW5lICplZG1hOworCXN0cnVjdCBkbWFfZGV2aWNlICpkbWFfZGV2OworCXNpemVfdCBlZG1hX3NpemU7CisJaW50IHJldCwgaTsKKworCWVkbWFfc2l6ZSA9IHBkYXRhLT5udW1fY2hhbm5lbHMgKiBzaXplb2Yoc3RydWN0IGVwOTN4eF9kbWFfY2hhbik7CisJZWRtYSA9IGt6YWxsb2Moc2l6ZW9mKCplZG1hKSArIGVkbWFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlZG1hKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRtYV9kZXYgPSAmZWRtYS0+ZG1hX2RldjsKKwllZG1hLT5tMm0gPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpLT5kcml2ZXJfZGF0YTsKKwllZG1hLT5udW1fY2hhbm5lbHMgPSBwZGF0YS0+bnVtX2NoYW5uZWxzOworCisJSU5JVF9MSVNUX0hFQUQoJmRtYV9kZXYtPmNoYW5uZWxzKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9jaGFubmVsczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBlcDkzeHhfZG1hX2NoYW5fZGF0YSAqY2RhdGEgPSAmcGRhdGEtPmNoYW5uZWxzW2ldOworCQlzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYyA9ICZlZG1hLT5jaGFubmVsc1tpXTsKKworCQllZG1hYy0+Y2hhbi5kZXZpY2UgPSBkbWFfZGV2OworCQllZG1hYy0+cmVncyA9IGNkYXRhLT5iYXNlOworCQllZG1hYy0+aXJxID0gY2RhdGEtPmlycTsKKwkJZWRtYWMtPmVkbWEgPSBlZG1hOworCisJCWVkbWFjLT5jbGsgPSBjbGtfZ2V0KE5VTEwsIGNkYXRhLT5uYW1lKTsKKwkJaWYgKElTX0VSUihlZG1hYy0+Y2xrKSkgeworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgZm9yICVzXG4iLAorCQkJCSBjZGF0YS0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNwaW5fbG9ja19pbml0KCZlZG1hYy0+bG9jayk7CisJCUlOSVRfTElTVF9IRUFEKCZlZG1hYy0+YWN0aXZlKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmVkbWFjLT5xdWV1ZSk7CisJCUlOSVRfTElTVF9IRUFEKCZlZG1hYy0+ZnJlZV9saXN0KTsKKwkJdGFza2xldF9pbml0KCZlZG1hYy0+dGFza2xldCwgZXA5M3h4X2RtYV90YXNrbGV0LAorCQkJICAgICAodW5zaWduZWQgbG9uZyllZG1hYyk7CisKKwkJbGlzdF9hZGRfdGFpbCgmZWRtYWMtPmNoYW4uZGV2aWNlX25vZGUsCisJCQkgICAgICAmZG1hX2Rldi0+Y2hhbm5lbHMpOworCX0KKworCWRtYV9jYXBfemVybyhkbWFfZGV2LT5jYXBfbWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBkbWFfZGV2LT5jYXBfbWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX0NZQ0xJQywgZG1hX2Rldi0+Y2FwX21hc2spOworCisJZG1hX2Rldi0+ZGV2ID0gJnBkZXYtPmRldjsKKwlkbWFfZGV2LT5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgPSBlcDkzeHhfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzOworCWRtYV9kZXYtPmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzID0gZXA5M3h4X2RtYV9mcmVlX2NoYW5fcmVzb3VyY2VzOworCWRtYV9kZXYtPmRldmljZV9wcmVwX3NsYXZlX3NnID0gZXA5M3h4X2RtYV9wcmVwX3NsYXZlX3NnOworCWRtYV9kZXYtPmRldmljZV9wcmVwX2RtYV9jeWNsaWMgPSBlcDkzeHhfZG1hX3ByZXBfZG1hX2N5Y2xpYzsKKwlkbWFfZGV2LT5kZXZpY2VfY29udHJvbCA9IGVwOTN4eF9kbWFfY29udHJvbDsKKwlkbWFfZGV2LT5kZXZpY2VfaXNzdWVfcGVuZGluZyA9IGVwOTN4eF9kbWFfaXNzdWVfcGVuZGluZzsKKwlkbWFfZGV2LT5kZXZpY2VfdHhfc3RhdHVzID0gZXA5M3h4X2RtYV90eF9zdGF0dXM7CisKKwlkbWFfc2V0X21heF9zZWdfc2l6ZShkbWFfZGV2LT5kZXYsIERNQV9NQVhfQ0hBTl9CWVRFUyk7CisKKwlpZiAoZWRtYS0+bTJtKSB7CisJCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIGRtYV9kZXYtPmNhcF9tYXNrKTsKKwkJZG1hX2Rldi0+ZGV2aWNlX3ByZXBfZG1hX21lbWNweSA9IGVwOTN4eF9kbWFfcHJlcF9kbWFfbWVtY3B5OworCisJCWVkbWEtPmh3X3NldHVwID0gbTJtX2h3X3NldHVwOworCQllZG1hLT5od19zaHV0ZG93biA9IG0ybV9od19zaHV0ZG93bjsKKwkJZWRtYS0+aHdfc3VibWl0ID0gbTJtX2h3X3N1Ym1pdDsKKwkJZWRtYS0+aHdfaW50ZXJydXB0ID0gbTJtX2h3X2ludGVycnVwdDsKKwl9IGVsc2UgeworCQlkbWFfY2FwX3NldChETUFfUFJJVkFURSwgZG1hX2Rldi0+Y2FwX21hc2spOworCisJCWVkbWEtPmh3X3NldHVwID0gbTJwX2h3X3NldHVwOworCQllZG1hLT5od19zaHV0ZG93biA9IG0ycF9od19zaHV0ZG93bjsKKwkJZWRtYS0+aHdfc3VibWl0ID0gbTJwX2h3X3N1Ym1pdDsKKwkJZWRtYS0+aHdfaW50ZXJydXB0ID0gbTJwX2h3X2ludGVycnVwdDsKKwl9CisKKwlyZXQgPSBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVyKGRtYV9kZXYpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBlZG1hLT5udW1fY2hhbm5lbHM7IGkrKykgeworCQkJc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqZWRtYWMgPSAmZWRtYS0+Y2hhbm5lbHNbaV07CisJCQlpZiAoIUlTX0VSUl9PUl9OVUxMKGVkbWFjLT5jbGspKQorCQkJCWNsa19wdXQoZWRtYWMtPmNsayk7CisJCX0KKwkJa2ZyZWUoZWRtYSk7CisJfSBlbHNlIHsKKwkJZGV2X2luZm8oZG1hX2Rldi0+ZGV2LCAiRVA5M3h4IE0yJXMgRE1BIHJlYWR5XG4iLAorCQkJIGVkbWEtPm0ybSA/ICJNIiA6ICJQIik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgZXA5M3h4X2RtYV9kcml2ZXJfaWRzW10gPSB7CisJeyAiZXA5M3h4LWRtYS1tMnAiLCAwIH0sCisJeyAiZXA5M3h4LWRtYS1tMm0iLCAxIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZXA5M3h4X2RtYV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImVwOTN4eC1kbWEiLAorCX0sCisJLmlkX3RhYmxlCT0gZXA5M3h4X2RtYV9kcml2ZXJfaWRzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXA5M3h4X2RtYV9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmVwOTN4eF9kbWFfZHJpdmVyLCBlcDkzeHhfZG1hX3Byb2JlKTsKK30KK3N1YnN5c19pbml0Y2FsbChlcDkzeHhfZG1hX21vZHVsZV9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiTWlrYSBXZXN0ZXJiZXJnIDxtaWthLndlc3RlcmJlcmdAaWtpLmZpPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFUDkzeHggRE1BIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW14LWRtYS5jIGIvZHJpdmVycy9kbWEvaW14LWRtYS5jCmluZGV4IGUxOGVhYWIuLmQ5OWY3MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lteC1kbWEuYworKysgYi9kcml2ZXJzL2RtYS9pbXgtZG1hLmMKQEAgLTEzNSw3ICsxMzUsOCBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQlpbXhfZG1hX2NvbmZpZ19idXJzdGxlbihpbXhkbWFjLT5pbXhkbWFfY2hhbm5lbCwgaW14ZG1hYy0+d2F0ZXJtYXJrX2xldmVsKTsKKwkJaW14X2RtYV9jb25maWdfYnVyc3RsZW4oaW14ZG1hYy0+aW14ZG1hX2NoYW5uZWwsCisJCQkJaW14ZG1hYy0+d2F0ZXJtYXJrX2xldmVsICogaW14ZG1hYy0+d29yZF9zaXplKTsKIAogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaXB1L2lwdV9pZG1hYy5jIGIvZHJpdmVycy9kbWEvaXB1L2lwdV9pZG1hYy5jCmluZGV4IGMxYTEyNWUuLmZkN2QyYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lwdS9pcHVfaWRtYWMuYworKysgYi9kcml2ZXJzL2RtYS9pcHUvaXB1X2lkbWFjLmMKQEAgLTksNiArOSw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tdl94b3IuYyBiL2RyaXZlcnMvZG1hL212X3hvci5jCmluZGV4IDk1NGUzMzQuLjA2ZjlmMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL212X3hvci5jCisrKyBiL2RyaXZlcnMvZG1hL212X3hvci5jCkBAIC0xMzA0LDggKzEzMDQsNyBAQAogCWlmICghcmVzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW1zcC0+eG9yX2Jhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKLQkJCQkgICAgIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCW1zcC0+eG9yX2Jhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAoIW1zcC0+eG9yX2Jhc2UpCiAJCXJldHVybiAtRUJVU1k7CiAKQEAgLTEzMTQsNyArMTMxMyw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJbXNwLT54b3JfaGlnaF9iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCi0JCQkJCSAgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJCQkJCSAgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAoIW1zcC0+eG9yX2hpZ2hfYmFzZSkKIAkJcmV0dXJuIC1FQlVTWTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvc2hkbWEuYyBiL2RyaXZlcnMvZG1hL3NoZG1hLmMKaW5kZXggMmE2MzhmOS4uMDI4MzMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc2hkbWEuYworKysgYi9kcml2ZXJzL2RtYS9zaGRtYS5jCkBAIC0xMjIxLDYgKzEyMjEsMTEgQEAKIAl9IGVsc2UgewogCQlkbyB7CiAJCQlmb3IgKGkgPSBjaGFuaXJxX3Jlcy0+c3RhcnQ7IGkgPD0gY2hhbmlycV9yZXMtPmVuZDsgaSsrKSB7CisJCQkJaWYgKGlycV9jbnQgPj0gU0hfRE1BQ19NQVhfQ0hBTk5FTFMpIHsKKwkJCQkJaXJxX2NhcCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwogCQkJCWlmICgoZXJyaXJxX3Jlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFMpID09CiAJCQkJICAgIElPUkVTT1VSQ0VfSVJRX1NIQVJFQUJMRSkKIAkJCQkJY2hhbl9mbGFnW2lycV9jbnRdID0gSVJRRl9TSEFSRUQ7CkBAIC0xMjMwLDE1ICsxMjM1LDExIEBACiAJCQkJCSJGb3VuZCBJUlEgJWQgZm9yIGNoYW5uZWwgJWRcbiIsCiAJCQkJCWksIGlycV9jbnQpOwogCQkJCWNoYW5faXJxW2lycV9jbnQrK10gPSBpOwotCi0JCQkJaWYgKGlycV9jbnQgPj0gU0hfRE1BQ19NQVhfQ0hBTk5FTFMpCi0JCQkJCWJyZWFrOwogCQkJfQogCi0JCQlpZiAoaXJxX2NudCA+PSBTSF9ETUFDX01BWF9DSEFOTkVMUykgewotCQkJCWlycV9jYXAgPSAxOworCQkJaWYgKGlycV9jbnQgPj0gU0hfRE1BQ19NQVhfQ0hBTk5FTFMpCiAJCQkJYnJlYWs7Ci0JCQl9CisKIAkJCWNoYW5pcnFfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsCiAJCQkJCQlJT1JFU09VUkNFX0lSUSwgKytpcnFyZXMpOwogCQl9IHdoaWxlIChpcnFfY250IDwgcGRhdGEtPmNoYW5uZWxfbnVtICYmIGNoYW5pcnFfcmVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jIGIvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKaW5kZXggOGYyMjJkNC4uMjlkMWFkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKKysrIGIvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKQEAgLTYsNiArNiw3IEBACiAgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKICAqLwogCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvY2VsbF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvY2VsbF9lZGFjLmMKaW5kZXggZGIxZGY1OS4uOWE2YTI3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2NlbGxfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9jZWxsX2VkYWMuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCWlmIChvZl9ub2RlX3RvX25pZChucCkgIT0gcHJpdi0+bm9kZSkKIAkJCWNvbnRpbnVlOwogCQljc3Jvdy0+Zmlyc3RfcGFnZSA9IHIuc3RhcnQgPj4gUEFHRV9TSElGVDsKLQkJY3Nyb3ctPm5yX3BhZ2VzID0gKHIuZW5kIC0gci5zdGFydCArIDEpID4+IFBBR0VfU0hJRlQ7CisJCWNzcm93LT5ucl9wYWdlcyA9IHJlc291cmNlX3NpemUoJnIpID4+IFBBR0VfU0hJRlQ7CiAJCWNzcm93LT5sYXN0X3BhZ2UgPSBjc3Jvdy0+Zmlyc3RfcGFnZSArIGNzcm93LT5ucl9wYWdlcyAtIDE7CiAJCWNzcm93LT5tdHlwZSA9IE1FTV9YRFI7CiAJCWNzcm93LT5lZGFjX21vZGUgPSBFREFDX1NFQ0RFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwppbmRleCAzOGFiOGUyLi4xMWUxYTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCkBAIC01MzgsMTUgKzUzOCwxNSBAQAogCS8qIHdlIG9ubHkgbmVlZCB0aGUgZXJyb3IgcmVnaXN0ZXJzICovCiAJci5zdGFydCArPSAweGUwMDsKIAotCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJm9wLT5kZXYsIHIuc3RhcnQsCi0JCQkJICAgICByLmVuZCAtIHIuc3RhcnQgKyAxLCBwZGF0YS0+bmFtZSkpIHsKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZvcC0+ZGV2LCByLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyKSwKKwkJCQkgICAgIHBkYXRhLT5uYW1lKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lbSByZWdpb25cbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7CiAJCXJlcyA9IC1FQlVTWTsKIAkJZ290byBlcnI7CiAJfQogCi0JcGRhdGEtPmwyX3ZiYXNlID0gZGV2bV9pb3JlbWFwKCZvcC0+ZGV2LCByLnN0YXJ0LCByLmVuZCAtIHIuc3RhcnQgKyAxKTsKKwlwZGF0YS0+bDJfdmJhc2UgPSBkZXZtX2lvcmVtYXAoJm9wLT5kZXYsIHIuc3RhcnQsIHJlc291cmNlX3NpemUoJnIpKTsKIAlpZiAoIXBkYXRhLT5sMl92YmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0dXAgTDIgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gLUVOT01FTTsKQEAgLTk4NywxNSArOTg3LDE1IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJm9wLT5kZXYsIHIuc3RhcnQsCi0JCQkJICAgICByLmVuZCAtIHIuc3RhcnQgKyAxLCBwZGF0YS0+bmFtZSkpIHsKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZvcC0+ZGV2LCByLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyKSwKKwkJCQkgICAgIHBkYXRhLT5uYW1lKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lbSByZWdpb25cbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7CiAJCXJlcyA9IC1FQlVTWTsKIAkJZ290byBlcnI7CiAJfQogCi0JcGRhdGEtPm1jX3ZiYXNlID0gZGV2bV9pb3JlbWFwKCZvcC0+ZGV2LCByLnN0YXJ0LCByLmVuZCAtIHIuc3RhcnQgKyAxKTsKKwlwZGF0YS0+bWNfdmJhc2UgPSBkZXZtX2lvcmVtYXAoJm9wLT5kZXYsIHIuc3RhcnQsIHJlc291cmNlX3NpemUoJnIpKTsKIAlpZiAoIXBkYXRhLT5tY192YmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0dXAgTUMgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWlzYS9wY2lfZWlzYS5jIGIvZHJpdmVycy9laXNhL3BjaV9laXNhLmMKaW5kZXggMGRkMGY2My4uMzBkYTcwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9laXNhL3BjaV9laXNhLmMKKysrIGIvZHJpdmVycy9laXNhL3BjaV9laXNhLmMKQEAgLTQ1LDEzICs0NSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX2Vpc2FfcGNpX3RibFtdID0geworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9faW5pdGRhdGEgcGNpX2Vpc2FfcGNpX3RibFtdID0gewogCXsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKIAkgIFBDSV9DTEFTU19CUklER0VfRUlTQSA8PCA4LCAweGZmZmYwMCwgMCB9LAogCXsgMCwgfQogfTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBjaV9laXNhX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBfX2luaXRkYXRhIHBjaV9laXNhX2RyaXZlciA9IHsKIAkubmFtZQkJPSAicGNpX2Vpc2EiLAogCS5pZF90YWJsZQk9IHBjaV9laXNhX3BjaV90YmwsCiAJLnByb2JlCQk9IHBjaV9laXNhX2luaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtY2Rldi5jIGIvZHJpdmVycy9maXJld2lyZS9jb3JlLWNkZXYuYwppbmRleCBiMWMxMTc3Li5lNmFkM2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtY2Rldi5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvY29yZS1jZGV2LmMKQEAgLTI1MywxNCArMjUzLDExIEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY2xpZW50LT53YWl0KTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjbGllbnQtPnR4X2ZsdXNoX3dhaXQpOwogCUlOSVRfTElTVF9IRUFEKCZjbGllbnQtPnBoeV9yZWNlaXZlcl9saW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmY2xpZW50LT5saW5rKTsKIAlrcmVmX2luaXQoJmNsaWVudC0+a3JlZik7CiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBjbGllbnQ7CiAKLQltdXRleF9sb2NrKCZkZXZpY2UtPmNsaWVudF9saXN0X211dGV4KTsKLQlsaXN0X2FkZF90YWlsKCZjbGllbnQtPmxpbmssICZkZXZpY2UtPmNsaWVudF9saXN0KTsKLQltdXRleF91bmxvY2soJmRldmljZS0+Y2xpZW50X2xpc3RfbXV0ZXgpOwotCiAJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwogfQogCkBAIC00NTEsMTUgKzQ0OCwyMCBAQAogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKKwltdXRleF9sb2NrKCZjbGllbnQtPmRldmljZS0+Y2xpZW50X2xpc3RfbXV0ZXgpOworCiAJY2xpZW50LT5idXNfcmVzZXRfY2xvc3VyZSA9IGEtPmJ1c19yZXNldF9jbG9zdXJlOwogCWlmIChhLT5idXNfcmVzZXQgIT0gMCkgewogCQlmaWxsX2J1c19yZXNldF9ldmVudCgmYnVzX3Jlc2V0LCBjbGllbnQpOwotCQlpZiAoY29weV90b191c2VyKHU2NF90b191cHRyKGEtPmJ1c19yZXNldCksCi0JCQkJICZidXNfcmVzZXQsIHNpemVvZihidXNfcmVzZXQpKSkKLQkJCXJldHVybiAtRUZBVUxUOworCQlyZXQgPSBjb3B5X3RvX3VzZXIodTY0X3RvX3VwdHIoYS0+YnVzX3Jlc2V0KSwKKwkJCQkgICAmYnVzX3Jlc2V0LCBzaXplb2YoYnVzX3Jlc2V0KSk7CiAJfQorCWlmIChyZXQgPT0gMCAmJiBsaXN0X2VtcHR5KCZjbGllbnQtPmxpbmspKQorCQlsaXN0X2FkZF90YWlsKCZjbGllbnQtPmxpbmssICZjbGllbnQtPmRldmljZS0+Y2xpZW50X2xpc3QpOwogCi0JcmV0dXJuIDA7CisJbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmRldmljZS0+Y2xpZW50X2xpc3RfbXV0ZXgpOworCisJcmV0dXJuIHJldCA/IC1FRkFVTFQgOiAwOwogfQogCiBzdGF0aWMgaW50IGFkZF9jbGllbnRfcmVzb3VyY2Uoc3RydWN0IGNsaWVudCAqY2xpZW50LApAQCAtMTU4Myw3ICsxNTg1LDcgQEAKIAlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJyMnIHx8CiAJICAgIF9JT0NfTlIoY21kKSA+PSBBUlJBWV9TSVpFKGlvY3RsX2hhbmRsZXJzKSB8fAogCSAgICBfSU9DX1NJWkUoY21kKSA+IHNpemVvZihidWZmZXIpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FTk9UVFk7CiAKIAlpZiAoX0lPQ19ESVIoY21kKSA9PSBfSU9DX1JFQUQpCiAJCW1lbXNldCgmYnVmZmVyLCAwLCBfSU9DX1NJWkUoY21kKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL25ldC5jIGIvZHJpdmVycy9maXJld2lyZS9uZXQuYwppbmRleCBiOTc2MmQwLi4wM2E3YTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL25ldC5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvbmV0LmMKQEAgLTcsNiArNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CkBAIC03Myw3ICs3NCw3IEBACiAJX19iZTMyIGZpZm9fbG87CQkvKiBsbyAzMmJpdHMgb2Ygc2VuZGVyJ3MgRklGTyBhZGRyCSovCiAJX19iZTMyIHNpcDsJCS8qIFNlbmRlcidzIElQIEFkZHJlc3MJCQkqLwogCV9fYmUzMiB0aXA7CQkvKiBJUCBBZGRyZXNzIG9mIHJlcXVlc3RlZCBodyBhZGRyCSovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogVGhpcyBoZWFkZXIgZm9ybWF0IGlzIHNwZWNpZmljIHRvIHRoaXMgZHJpdmVyIGltcGxlbWVudGF0aW9uLiAqLwogI2RlZmluZSBGV05FVF9BTEVOCTgKQEAgLTgxLDcgKzgyLDcgQEAKIHN0cnVjdCBmd25ldF9oZWFkZXIgewogCXU4IGhfZGVzdFtGV05FVF9BTEVOXTsJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLwogCV9fYmUxNiBoX3Byb3RvOwkJLyogcGFja2V0IHR5cGUgSUQgZmllbGQgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBJUHY0IGFuZCBJUHY2IGVuY2Fwc3VsYXRpb24gaGVhZGVyICovCiBzdHJ1Y3QgcmZjMjczNF9oZWFkZXIgewpAQCAtMjYxLDE2ICsyNjIsMTYgQEAKIH0KIAogc3RhdGljIGludCBmd25ldF9oZWFkZXJfY2FjaGUoY29uc3Qgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsCi0JCQkgICAgICBzdHJ1Y3QgaGhfY2FjaGUgKmhoKQorCQkJICAgICAgc3RydWN0IGhoX2NhY2hlICpoaCwgX19iZTE2IHR5cGUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldDsKIAlzdHJ1Y3QgZnduZXRfaGVhZGVyICpoOwogCi0JaWYgKGhoLT5oaF90eXBlID09IGNwdV90b19iZTE2KEVUSF9QXzgwMl8zKSkKKwlpZiAodHlwZSA9PSBjcHVfdG9fYmUxNihFVEhfUF84MDJfMykpCiAJCXJldHVybiAtMTsKIAluZXQgPSBuZWlnaC0+ZGV2OwogCWggPSAoc3RydWN0IGZ3bmV0X2hlYWRlciAqKSgodTggKiloaC0+aGhfZGF0YSArIDE2IC0gc2l6ZW9mKCpoKSk7Ci0JaC0+aF9wcm90byA9IGhoLT5oaF90eXBlOworCWgtPmhfcHJvdG8gPSB0eXBlOwogCW1lbWNweShoLT5oX2Rlc3QsIG5laWdoLT5oYSwgbmV0LT5hZGRyX2xlbik7CiAJaGgtPmhoX2xlbiA9IEZXTkVUX0hMRU47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jIGIvZHJpdmVycy9maXJld2lyZS9vaGNpLmMKaW5kZXggNDM4ZTZjOC4uYmNmNzkyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9vaGNpLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9vaGNpLmMKQEAgLTI1Myw3ICsyNTMsNiBAQAogI2RlZmluZSBPSENJMTM5NF9NQVhfUEhZU19SRVNQX1JFVFJJRVMJMHg4CiAKICNkZWZpbmUgT0hDSTEzOTRfUkVHSVNURVJfU0laRQkJMHg4MDAKLSNkZWZpbmUgT0hDSV9MT09QX0NPVU5UCQkJNTAwCiAjZGVmaW5lIE9IQ0kxMzk0X1BDSV9IQ0lfQ29udHJvbAkweDQwCiAjZGVmaW5lIFNFTEZfSURfQlVGX1NJWkUJCTB4ODAwCiAjZGVmaW5lIE9IQ0lfVENPREVfUEhZX1BBQ0tFVAkJMHgwZQpAQCAtMjY0LDYgKzI2Myw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUdFUkVfRlc2NDMJMHg1OTAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzOFhfRlcJMHgyMzgwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElfVFNCMTJMVjIyCTB4ODAwOQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BJTk5BQ0xFX1NZU1RFTVMJMHgxMWJkCiAKICNkZWZpbmUgUVVJUktfQ1lDTEVfVElNRVIJCTEKICNkZWZpbmUgUVVJUktfUkVTRVRfUEFDS0VUCQkyCkBAIC01MTMsNiArNTEzLDEyIEBACiAJcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfVmVyc2lvbik7CiB9CiAKKy8qCisgKiBCZXdhcmUhICByZWFkX3BoeV9yZWcoKSwgd3JpdGVfcGh5X3JlZygpLCB1cGRhdGVfcGh5X3JlZygpLCBhbmQKKyAqIHJlYWRfcGFnZWRfcGh5X3JlZygpIHJlcXVpcmUgdGhlIGNhbGxlciB0byBob2xkIG9oY2ktPnBoeV9yZWdfbXV0ZXguCisgKiBJbiBvdGhlciB3b3Jkcywgb25seSB1c2Ugb2hjaV9yZWFkX3BoeV9yZWcoKSBhbmQgb2hjaV91cGRhdGVfcGh5X3JlZygpCisgKiBkaXJlY3RseS4gIEV4Y2VwdGlvbnMgYXJlIGludHJpbnNpY2FsbHkgc2VyaWFsaXplZCBjb250ZXh0cyBsaWtlIHBjaV9wcm9iZS4KKyAqLwogc3RhdGljIGludCByZWFkX3BoeV9yZWcoc3RydWN0IGZ3X29oY2kgKm9oY2ksIGludCBhZGRyKQogewogCXUzMiB2YWw7CkBAIC01MjEsNiArNTI3LDkgQEAKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfUGh5Q29udHJvbCwgT0hDSTEzOTRfUGh5Q29udHJvbF9SZWFkKGFkZHIpKTsKIAlmb3IgKGkgPSAwOyBpIDwgMyArIDEwMDsgaSsrKSB7CiAJCXZhbCA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X1BoeUNvbnRyb2wpOworCQlpZiAoIX52YWwpCisJCQlyZXR1cm4gLUVOT0RFVjsgLyogQ2FyZCB3YXMgZWplY3RlZC4gKi8KKwogCQlpZiAodmFsICYgT0hDSTEzOTRfUGh5Q29udHJvbF9SZWFkRG9uZSkKIAkJCXJldHVybiBPSENJMTM5NF9QaHlDb250cm9sX1JlYWREYXRhKHZhbCk7CiAKQEAgLTU0NCw2ICs1NTMsOSBAQAogCQkgIE9IQ0kxMzk0X1BoeUNvbnRyb2xfV3JpdGUoYWRkciwgdmFsKSk7CiAJZm9yIChpID0gMDsgaSA8IDMgKyAxMDA7IGkrKykgewogCQl2YWwgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9QaHlDb250cm9sKTsKKwkJaWYgKCF+dmFsKQorCQkJcmV0dXJuIC1FTk9ERVY7IC8qIENhcmQgd2FzIGVqZWN0ZWQuICovCisKIAkJaWYgKCEodmFsICYgT0hDSTEzOTRfUGh5Q29udHJvbF9Xcml0ZVBlbmRpbmcpKQogCQkJcmV0dXJuIDA7CiAKQEAgLTYyOSw3ICs2NDEsNiBAQAogCWN0eC0+bGFzdF9idWZmZXJfaW5kZXggPSBpbmRleDsKIAogCXJlZ193cml0ZShjdHgtPm9oY2ksIENPTlRST0xfU0VUKGN0eC0+cmVncyksIENPTlRFWFRfV0FLRSk7Ci0JZmx1c2hfd3JpdGVzKGN0eC0+b2hjaSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFyX2NvbnRleHRfcmVsZWFzZShzdHJ1Y3QgYXJfY29udGV4dCAqY3R4KQpAQCAtMTAwMSw3ICsxMDEyLDYgQEAKIAogCXJlZ193cml0ZShjdHgtPm9oY2ksIENPTU1BTkRfUFRSKGN0eC0+cmVncyksIGN0eC0+ZGVzY3JpcHRvcnNfYnVzIHwgMSk7CiAJcmVnX3dyaXRlKGN0eC0+b2hjaSwgQ09OVFJPTF9TRVQoY3R4LT5yZWdzKSwgQ09OVEVYVF9SVU4pOwotCWZsdXNoX3dyaXRlcyhjdHgtPm9oY2kpOwogfQogCiBzdGF0aWMgc3RydWN0IGRlc2NyaXB0b3IgKmZpbmRfYnJhbmNoX2Rlc2NyaXB0b3Ioc3RydWN0IGRlc2NyaXB0b3IgKmQsIGludCB6KQpAQCAtMTIwMSwxNCArMTIxMSwxNCBAQAogCiAJcmVnX3dyaXRlKGN0eC0+b2hjaSwgQ09OVFJPTF9DTEVBUihjdHgtPnJlZ3MpLCBDT05URVhUX1JVTik7CiAJY3R4LT5ydW5uaW5nID0gZmFsc2U7Ci0JZmx1c2hfd3JpdGVzKGN0eC0+b2hjaSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKIAkJcmVnID0gcmVnX3JlYWQoY3R4LT5vaGNpLCBDT05UUk9MX1NFVChjdHgtPnJlZ3MpKTsKIAkJaWYgKChyZWcgJiBDT05URVhUX0FDVElWRSkgPT0gMCkKIAkJCXJldHVybjsKIAotCQltZGVsYXkoMSk7CisJCWlmIChpKQorCQkJdWRlbGF5KDEwKTsKIAl9CiAJZndfZXJyb3IoIkVycm9yOiBETUEgY29udGV4dCBzdGlsbCBhY3RpdmUgKDB4JTA4eClcbiIsIHJlZyk7CiB9CkBAIC0xMzQ1LDEyICsxMzU1LDEwIEBACiAKIAljb250ZXh0X2FwcGVuZChjdHgsIGQsIHosIDQgLSB6KTsKIAotCWlmIChjdHgtPnJ1bm5pbmcpIHsKKwlpZiAoY3R4LT5ydW5uaW5nKQogCQlyZWdfd3JpdGUob2hjaSwgQ09OVFJPTF9TRVQoY3R4LT5yZWdzKSwgQ09OVEVYVF9XQUtFKTsKLQkJZmx1c2hfd3JpdGVzKG9oY2kpOwotCX0gZWxzZSB7CisJZWxzZQogCQljb250ZXh0X3J1bihjdHgsIDApOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTk1OSwxNCArMTk2NywxOCBAQAogCiBzdGF0aWMgaW50IHNvZnR3YXJlX3Jlc2V0KHN0cnVjdCBmd19vaGNpICpvaGNpKQogeworCXUzMiB2YWw7CiAJaW50IGk7CiAKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSENDb250cm9sU2V0LCBPSENJMTM5NF9IQ0NvbnRyb2xfc29mdFJlc2V0KTsKKwlmb3IgKGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKKwkJdmFsID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfSENDb250cm9sU2V0KTsKKwkJaWYgKCF+dmFsKQorCQkJcmV0dXJuIC1FTk9ERVY7IC8qIENhcmQgd2FzIGVqZWN0ZWQuICovCiAKLQlmb3IgKGkgPSAwOyBpIDwgT0hDSV9MT09QX0NPVU5UOyBpKyspIHsKLQkJaWYgKChyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9IQ0NvbnRyb2xTZXQpICYKLQkJICAgICBPSENJMTM5NF9IQ0NvbnRyb2xfc29mdFJlc2V0KSA9PSAwKQorCQlpZiAoISh2YWwgJiBPSENJMTM5NF9IQ0NvbnRyb2xfc29mdFJlc2V0KSkKIAkJCXJldHVybiAwOworCiAJCW1zbGVlcCgxKTsKIAl9CiAKQEAgLTIxOTYsNyArMjIwOCw5IEBACiAJCSAgT0hDSTEzOTRfTGlua0NvbnRyb2xfcmN2UGh5UGt0KTsKIAogCWFyX2NvbnRleHRfcnVuKCZvaGNpLT5hcl9yZXF1ZXN0X2N0eCk7Ci0JYXJfY29udGV4dF9ydW4oJm9oY2ktPmFyX3Jlc3BvbnNlX2N0eCk7IC8qIGFsc28gZmx1c2hlcyB3cml0ZXMgKi8KKwlhcl9jb250ZXh0X3J1bigmb2hjaS0+YXJfcmVzcG9uc2VfY3R4KTsKKworCWZsdXNoX3dyaXRlcyhvaGNpKTsKIAogCS8qIFdlIGFyZSByZWFkeSB0byBnbywgcmVzZXQgYnVzIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbi4gKi8KIAlmd19zY2hlZHVsZV9idXNfcmVzZXQoJm9oY2ktPmNhcmQsIGZhbHNlLCB0cnVlKTsKQEAgLTMxMjgsNyArMzE0Miw2IEBACiAJCQkmY29udGFpbmVyX29mKGJhc2UsIHN0cnVjdCBpc29fY29udGV4dCwgYmFzZSktPmNvbnRleHQ7CiAKIAlyZWdfd3JpdGUoY3R4LT5vaGNpLCBDT05UUk9MX1NFVChjdHgtPnJlZ3MpLCBDT05URVhUX1dBS0UpOwotCWZsdXNoX3dyaXRlcyhjdHgtPm9oY2kpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZ3X2NhcmRfZHJpdmVyIG9oY2lfZHJpdmVyID0gewpAQCAtMzE5MCw2ICszMjAzLDExIEBACiAJaW50IGksIGVycjsKIAlzaXplX3Qgc2l6ZTsKIAorCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1BJTk5BQ0xFX1NZU1RFTVMpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJQaW5uYWNsZSBNb3ZpZUJvYXJkIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCiAJb2hjaSA9IGt6YWxsb2Moc2l6ZW9mKCpvaGNpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG9oY2kgPT0gTlVMTCkgewogCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL0tjb25maWcKaW5kZXggODcwOTZiNi4uMmYyMWIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvS2NvbmZpZworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9LY29uZmlnCkBAIC0xMyw2ICsxMyw3IEBACiBjb25maWcgR09PR0xFX1NNSQogCXRyaXN0YXRlICJTTUkgaW50ZXJmYWNlIGZvciBHb29nbGUgcGxhdGZvcm1zIgogCWRlcGVuZHMgb24gQUNQSSAmJiBETUkKKwlzZWxlY3QgRUZJCiAJc2VsZWN0IEVGSV9WQVJTCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgU01JIGNhbGxiYWNrcyBmb3IgR29vZ2xlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMKaW5kZXggZmE3ZjBiMy4uNjg4MTBmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvZ3NtaS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYwpAQCAtODY5LDggKzg2OSw2IEBACiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJnc21pIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTiAiIGxvYWRlZFxuIik7Ci0KIAkvKiBSZWdpc3RlciBpbiB0aGUgZmlybXdhcmUgZGlyZWN0b3J5ICovCiAJcmV0ID0gLUVOT01FTTsKIAlnc21pX2tvYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJnc21pIiwgZmlybXdhcmVfa29iaik7CkBAIC04OTAsMTIgKzg4OCwxMyBAQAogCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlcyhnc21pX2tvYmosIGdzbWlfYXR0cnMpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiZ3NtaTogRmFpbGVkIHRvIGFkZCBhdHRycyIpOwotCQlnb3RvIG91dF9lcnI7CisJCWdvdG8gb3V0X3JlbW92ZV9iaW5fZmlsZTsKIAl9CiAKLQlpZiAocmVnaXN0ZXJfZWZpdmFycygmZWZpdmFycywgJmVmaXZhcl9vcHMsIGdzbWlfa29iaikpIHsKKwlyZXQgPSByZWdpc3Rlcl9lZml2YXJzKCZlZml2YXJzLCAmZWZpdmFyX29wcywgZ3NtaV9rb2JqKTsKKwlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0lORk8gImdzbWk6IEZhaWxlZCB0byByZWdpc3RlciBlZml2YXJzXG4iKTsKLQkJZ290byBvdXRfZXJyOworCQlnb3RvIG91dF9yZW1vdmVfc3lzZnNfZmlsZXM7CiAJfQogCiAJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZnc21pX3JlYm9vdF9ub3RpZmllcik7CkBAIC05MDMsOSArOTAyLDE1IEBACiAJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LAogCQkJCSAgICAgICAmZ3NtaV9wYW5pY19ub3RpZmllcik7CiAKKwlwcmludGsoS0VSTl9JTkZPICJnc21pIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTiAiIGxvYWRlZFxuIik7CisKIAlyZXR1cm4gMDsKIAotIG91dF9lcnI6CitvdXRfcmVtb3ZlX3N5c2ZzX2ZpbGVzOgorCXN5c2ZzX3JlbW92ZV9maWxlcyhnc21pX2tvYmosIGdzbWlfYXR0cnMpOworb3V0X3JlbW92ZV9iaW5fZmlsZToKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoZ3NtaV9rb2JqLCAmZXZlbnRsb2dfYmluX2F0dHIpOworb3V0X2VycjoKIAlrb2JqZWN0X3B1dChnc21pX2tvYmopOwogCWdzbWlfYnVmX2ZyZWUoZ3NtaV9kZXYucGFyYW1fYnVmKTsKIAlnc21pX2J1Zl9mcmVlKGdzbWlfZGV2LmRhdGFfYnVmKTsKQEAgLTkyNSw2ICs5MzAsOCBAQAogCQkJCQkgJmdzbWlfcGFuaWNfbm90aWZpZXIpOwogCXVucmVnaXN0ZXJfZWZpdmFycygmZWZpdmFycyk7CiAKKwlzeXNmc19yZW1vdmVfZmlsZXMoZ3NtaV9rb2JqLCBnc21pX2F0dHJzKTsKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoZ3NtaV9rb2JqLCAmZXZlbnRsb2dfYmluX2F0dHIpOwogCWtvYmplY3RfcHV0KGdzbWlfa29iaik7CiAJZ3NtaV9idWZfZnJlZShnc21pX2Rldi5wYXJhbV9idWYpOwogCWdzbWlfYnVmX2ZyZWUoZ3NtaV9kZXYuZGF0YV9idWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0LmMgYi9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnQuYwppbmRleCBjZTMzZjQ2Li5jODExY2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnQuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnQuYwpAQCAtNTY2LDYgKzU2NiwxMSBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIHZvaWQgaWJmdF9rb2JqX3JlbGVhc2Uodm9pZCAqZGF0YSkKK3sKKwlrZnJlZShkYXRhKTsKK30KKwogLyoKICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgaWJmdF9yZWdpc3Rlcl9rb2JqZWN0cy4KICAqLwpAQCAtNTk1LDcgKzYwMCw4IEBACiAJCWJvb3Rfa29iaiA9IGlzY3NpX2Jvb3RfY3JlYXRlX2luaXRpYXRvcihib290X2tzZXQsIGhkci0+aW5kZXgsCiAJCQkJCQlpYmZ0X2tvYmosCiAJCQkJCQlpYmZ0X2F0dHJfc2hvd19pbml0aWF0b3IsCi0JCQkJCQlpYmZ0X2NoZWNrX2luaXRpYXRvcl9mb3IpOworCQkJCQkJaWJmdF9jaGVja19pbml0aWF0b3JfZm9yLAorCQkJCQkJaWJmdF9rb2JqX3JlbGVhc2UpOwogCQlpZiAoIWJvb3Rfa29iaikgewogCQkJcmMgPSAtRU5PTUVNOwogCQkJZ290byBmcmVlX2liZnRfb2JqOwpAQCAtNjEwLDcgKzYxNiw4IEBACiAJCWJvb3Rfa29iaiA9IGlzY3NpX2Jvb3RfY3JlYXRlX2V0aGVybmV0KGJvb3Rfa3NldCwgaGRyLT5pbmRleCwKIAkJCQkJCSAgICAgICBpYmZ0X2tvYmosCiAJCQkJCQkgICAgICAgaWJmdF9hdHRyX3Nob3dfbmljLAotCQkJCQkJICAgICAgIGliZnRfY2hlY2tfbmljX2Zvcik7CisJCQkJCQkgICAgICAgaWJmdF9jaGVja19uaWNfZm9yLAorCQkJCQkJICAgICAgIGliZnRfa29ial9yZWxlYXNlKTsKIAkJaWYgKCFib290X2tvYmopIHsKIAkJCXJjID0gLUVOT01FTTsKIAkJCWdvdG8gZnJlZV9pYmZ0X29iajsKQEAgLTYyNSw3ICs2MzIsOCBAQAogCQlib290X2tvYmogPSBpc2NzaV9ib290X2NyZWF0ZV90YXJnZXQoYm9vdF9rc2V0LCBoZHItPmluZGV4LAogCQkJCQkJICAgICBpYmZ0X2tvYmosCiAJCQkJCQkgICAgIGliZnRfYXR0cl9zaG93X3RhcmdldCwKLQkJCQkJCSAgICAgaWJmdF9jaGVja190Z3RfZm9yKTsKKwkJCQkJCSAgICAgaWJmdF9jaGVja190Z3RfZm9yLAorCQkJCQkJICAgICBpYmZ0X2tvYmpfcmVsZWFzZSk7CiAJCWlmICghYm9vdF9rb2JqKSB7CiAJCQlyYyA9IC1FTk9NRU07CiAJCQlnb3RvIGZyZWVfaWJmdF9vYmo7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnRfZmluZC5jIGIvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0X2ZpbmQuYwppbmRleCBmMDMyZTQ0Li5iZmU3MjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnRfZmluZC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdF9maW5kLmMKQEAgLTEwOCw3ICsxMDgsOSBAQAogICovCiB1bnNpZ25lZCBsb25nIF9faW5pdCBmaW5kX2liZnRfcmVnaW9uKHVuc2lnbmVkIGxvbmcgKnNpemVwKQogeworI2lmZGVmIENPTkZJR19BQ1BJCiAJaW50IGk7CisjZW5kaWYKIAlpYmZ0X2FkZHIgPSBOVUxMOwogCiAjaWZkZWYgQ09ORklHX0FDUEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvc2lnbWEuYyBiL2RyaXZlcnMvZmlybXdhcmUvc2lnbWEuYwppbmRleCBjMTljZDJjLi5mMTBmYzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL3NpZ21hLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9zaWdtYS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zaWdtYS5oPgogCiAvKiBSZXR1cm46IDA9PU9LLCA8MD09ZXJyb3IsID0xID09bm8gbW9yZSBhY3Rpb25zICovCkBAIC0xMTMsMyArMTE0LDUgQEAKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChwcm9jZXNzX3NpZ21hX2Zpcm13YXJlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvLzc0eDE2NC5jIGIvZHJpdmVycy9ncGlvLzc0eDE2NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGUwNzAyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3Bpby83NHgxNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogIDc0SHgxNjQgLSBHZW5lcmljIHNlcmlhbC1pbi9wYXJhbGxlbC1vdXQgOC1iaXRzIHNoaWZ0IHJlZ2lzdGVyIEdQSU8gZHJpdmVyCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxMCBHYWJvciBKdWhvcyA8anVob3NnQG9wZW53cnQub3JnPgotICogIENvcHlyaWdodCAoQykgMjAxMCBNaWd1ZWwgR2FpbyA8bWlndWVsLmdhaW9AZWZpeG8uY29tPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvNzR4MTY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2RlZmluZSBHRU5fNzRYMTY0X0dQSU9fQ09VTlQJOAotCi0KLXN0cnVjdCBnZW5fNzR4MTY0X2NoaXAgewotCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7Ci0Jc3RydWN0IGdwaW9fY2hpcAlncGlvX2NoaXA7Ci0Jc3RydWN0IG11dGV4CQlsb2NrOwotCXU4CQkJcG9ydF9jb25maWc7Ci19OwotCi1zdGF0aWMgdm9pZCBnZW5fNzR4MTY0X3NldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICosIHVuc2lnbmVkLCBpbnQpOwotCi1zdGF0aWMgc3RydWN0IGdlbl83NHgxNjRfY2hpcCAqZ3Bpb190b19jaGlwKHN0cnVjdCBncGlvX2NoaXAgKmdjKQotewotCXJldHVybiBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBnZW5fNzR4MTY0X2NoaXAsIGdwaW9fY2hpcCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19nZW5fNzR4MTY0X3dyaXRlX2NvbmZpZyhzdHJ1Y3QgZ2VuXzc0eDE2NF9jaGlwICpjaGlwKQotewotCXJldHVybiBzcGlfd3JpdGUoY2hpcC0+c3BpLAotCQkJICZjaGlwLT5wb3J0X2NvbmZpZywgc2l6ZW9mKGNoaXAtPnBvcnRfY29uZmlnKSk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2VuXzc0eDE2NF9kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLAotCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWwpCi17Ci0JZ2VuXzc0eDE2NF9zZXRfdmFsdWUoZ2MsIG9mZnNldCwgdmFsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZW5fNzR4MTY0X2dldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBnZW5fNzR4MTY0X2NoaXAgKmNoaXAgPSBncGlvX3RvX2NoaXAoZ2MpOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKLQlyZXQgPSAoY2hpcC0+cG9ydF9jb25maWcgPj4gb2Zmc2V0KSAmIDB4MTsKLQltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZ2VuXzc0eDE2NF9zZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCi0JCXVuc2lnbmVkIG9mZnNldCwgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgZ2VuXzc0eDE2NF9jaGlwICpjaGlwID0gZ3Bpb190b19jaGlwKGdjKTsKLQotCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOwotCWlmICh2YWwpCi0JCWNoaXAtPnBvcnRfY29uZmlnIHw9ICgxIDw8IG9mZnNldCk7Ci0JZWxzZQotCQljaGlwLT5wb3J0X2NvbmZpZyAmPSB+KDEgPDwgb2Zmc2V0KTsKLQotCV9fZ2VuXzc0eDE2NF93cml0ZV9jb25maWcoY2hpcCk7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgZ2VuXzc0eDE2NF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBnZW5fNzR4MTY0X2NoaXAgKmNoaXA7Ci0Jc3RydWN0IGdlbl83NHgxNjRfY2hpcF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKLQlpbnQgcmV0OwotCi0JcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmICghcGRhdGEgfHwgIXBkYXRhLT5iYXNlKSB7Ci0JCWRldl9kYmcoJnNwaS0+ZGV2LCAiaW5jb3JyZWN0IG9yIG1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qCi0JICogYml0c19wZXJfd29yZCBjYW5ub3QgYmUgY29uZmlndXJlZCBpbiBwbGF0Zm9ybSBkYXRhCi0JICovCi0Jc3BpLT5iaXRzX3Blcl93b3JkID0gODsKLQotCXJldCA9IHNwaV9zZXR1cChzcGkpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGlwKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW11dGV4X2luaXQoJmNoaXAtPmxvY2spOwotCi0JZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgY2hpcCk7Ci0KLQljaGlwLT5zcGkgPSBzcGk7Ci0KLQljaGlwLT5ncGlvX2NoaXAubGFiZWwgPSBHRU5fNzRYMTY0X0RSSVZFUl9OQU1FLAotCQljaGlwLT5ncGlvX2NoaXAuZGlyZWN0aW9uX291dHB1dCA9IGdlbl83NHgxNjRfZGlyZWN0aW9uX291dHB1dDsKLQljaGlwLT5ncGlvX2NoaXAuZ2V0ID0gZ2VuXzc0eDE2NF9nZXRfdmFsdWU7Ci0JY2hpcC0+Z3Bpb19jaGlwLnNldCA9IGdlbl83NHgxNjRfc2V0X3ZhbHVlOwotCWNoaXAtPmdwaW9fY2hpcC5iYXNlID0gcGRhdGEtPmJhc2U7Ci0JY2hpcC0+Z3Bpb19jaGlwLm5ncGlvID0gR0VOXzc0WDE2NF9HUElPX0NPVU5UOwotCWNoaXAtPmdwaW9fY2hpcC5jYW5fc2xlZXAgPSAxOwotCWNoaXAtPmdwaW9fY2hpcC5kZXYgPSAmc3BpLT5kZXY7Ci0JY2hpcC0+Z3Bpb19jaGlwLm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlyZXQgPSBfX2dlbl83NHgxNjRfd3JpdGVfY29uZmlnKGNoaXApOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgd3JpdGluZzogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXhpdF9kZXN0cm95OwotCX0KLQotCXJldCA9IGdwaW9jaGlwX2FkZCgmY2hpcC0+Z3Bpb19jaGlwKTsKLQlpZiAocmV0KQotCQlnb3RvIGV4aXRfZGVzdHJveTsKLQotCXJldHVybiByZXQ7Ci0KLWV4aXRfZGVzdHJveToKLQlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBOVUxMKTsKLQltdXRleF9kZXN0cm95KCZjaGlwLT5sb2NrKTsKLQlrZnJlZShjaGlwKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBnZW5fNzR4MTY0X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBnZW5fNzR4MTY0X2NoaXAgKmNoaXA7Ci0JaW50IHJldDsKLQotCWNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKLQlpZiAoY2hpcCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIE5VTEwpOwotCi0JcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZjaGlwLT5ncGlvX2NoaXApOwotCWlmICghcmV0KSB7Ci0JCW11dGV4X2Rlc3Ryb3koJmNoaXAtPmxvY2spOwotCQlrZnJlZShjaGlwKTsKLQl9IGVsc2UKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gcmVtb3ZlIHRoZSBHUElPIGNvbnRyb2xsZXI6ICVkXG4iLAotCQkJCXJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgZ2VuXzc0eDE2NF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJCT0gR0VOXzc0WDE2NF9EUklWRVJfTkFNRSwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlCQk9IGdlbl83NHgxNjRfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChnZW5fNzR4MTY0X3JlbW92ZSksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBnZW5fNzR4MTY0X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmZ2VuXzc0eDE2NF9kcml2ZXIpOwotfQotc3Vic3lzX2luaXRjYWxsKGdlbl83NHgxNjRfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBnZW5fNzR4MTY0X2V4aXQodm9pZCkKLXsKLQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmdlbl83NHgxNjRfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGdlbl83NHgxNjRfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkdhYm9yIEp1aG9zIDxqdWhvc2dAb3BlbndydC5vcmc+Iik7Ci1NT0RVTEVfQVVUSE9SKCJNaWd1ZWwgR2FpbyA8bWlndWVsLmdhaW9AZWZpeG8uY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJHUElPIGV4cGFuZGVyIGRyaXZlciBmb3IgNzRYMTY0IDgtYml0cyBzaGlmdCByZWdpc3RlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL0tjb25maWcgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwppbmRleCA0YTdmNjMxLi4zNjM0OTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwpAQCAtNjMsNTYgKzYzLDY5IEBACiAJICBLZXJuZWwgZHJpdmVycyBtYXkgYWxzbyByZXF1ZXN0IHRoYXQgYSBwYXJ0aWN1bGFyIEdQSU8gYmUKIAkgIGV4cG9ydGVkIHRvIHVzZXJzcGFjZTsgdGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGVidWdnaW5nLgogCitjb25maWcgR1BJT19HRU5FUklDCisJdHJpc3RhdGUKKwogIyBwdXQgZHJpdmVycyBpbiB0aGUgcmlnaHQgc2VjdGlvbiwgaW4gYWxwaGFiZXRpY2FsIG9yZGVyCiAKK2NvbmZpZyBHUElPX0RBOTA1MgorCXRyaXN0YXRlICJEaWFsb2cgREE5MDUyIEdQSU8iCisJZGVwZW5kcyBvbiBQTUlDX0RBOTA1MgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBlbmFibGUgdGhlIEdQSU8gZHJpdmVyIGZvciB0aGUgREE5MDUyIGNoaXAuCisKIGNvbmZpZyBHUElPX01BWDczMFgKIAl0cmlzdGF0ZQogCiBjb21tZW50ICJNZW1vcnkgbWFwcGVkIEdQSU8gZHJpdmVyczoiCiAKLWNvbmZpZyBHUElPX0JBU0lDX01NSU9fQ09SRQotCXRyaXN0YXRlCitjb25maWcgR1BJT19HRU5FUklDX1BMQVRGT1JNCisJdHJpc3RhdGUgIkdlbmVyaWMgbWVtb3J5LW1hcHBlZCBHUElPIGNvbnRyb2xsZXIgc3VwcG9ydCAoTU1JTyBwbGF0Zm9ybSBkZXZpY2UpIgorCXNlbGVjdCBHUElPX0dFTkVSSUMKIAloZWxwCi0JICBQcm92aWRlcyBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIGJhc2ljIG1lbW9yeS1tYXBwZWQgR1BJTyBjb250cm9sbGVycy4KLQotY29uZmlnIEdQSU9fQkFTSUNfTU1JTwotCXRyaXN0YXRlICJCYXNpYyBtZW1vcnktbWFwcGVkIEdQSU8gY29udHJvbGxlcnMgc3VwcG9ydCIKLQlzZWxlY3QgR1BJT19CQVNJQ19NTUlPX0NPUkUKLQloZWxwCi0JICBTYXkgeWVzIGhlcmUgdG8gc3VwcG9ydCBiYXNpYyBtZW1vcnktbWFwcGVkIEdQSU8gY29udHJvbGxlcnMuCisJICBTYXkgeWVzIGhlcmUgdG8gc3VwcG9ydCBiYXNpYyBwbGF0Zm9ybV9kZXZpY2UgbWVtb3J5LW1hcHBlZCBHUElPIGNvbnRyb2xsZXJzLgogCiBjb25maWcgR1BJT19JVDg3NjFFCiAJdHJpc3RhdGUgIklUODc2MUUgR1BJTyBzdXBwb3J0IgogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IEdQSU8gZnVuY3Rpb25hbGl0eSBvZiBJVDg3NjFFIHN1cGVyIEkvTyBjaGlwLgogCitjb25maWcgR1BJT19FUDkzWFgKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBBUkNIX0VQOTNYWAorCXNlbGVjdCBHUElPX0dFTkVSSUMKKwogY29uZmlnIEdQSU9fRVhZTk9TNAotCWJvb2wgIlNhbXN1bmcgRXh5bm9zNCBHUElPIGxpYnJhcnkgc3VwcG9ydCIKLQlkZWZhdWx0IHkgaWYgQ1BVX0VYWU5PUzQyMTAKLQlkZXBlbmRzIG9uIEFSTQotCWhlbHAKLQkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IFNhbXN1bmcgRXh5bm9zNCBzZXJpZXMgU29DcyBHUElPIGxpYnJhcnkKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBDUFVfRVhZTk9TNDIxMAorCitjb25maWcgR1BJT19NUEM1MjAwCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gUFBDX01QQzUyeHgKKworY29uZmlnIEdQSU9fTVhDCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gQVJDSF9NWEMKKwlzZWxlY3QgR1BJT19HRU5FUklDCisJc2VsZWN0IEdFTkVSSUNfSVJRX0NISVAKKworY29uZmlnIEdQSU9fTVhTCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gQVJDSF9NWFMKKwlzZWxlY3QgR1BJT19HRU5FUklDCisJc2VsZWN0IEdFTkVSSUNfSVJRX0NISVAKIAogY29uZmlnIEdQSU9fUExBVF9TQU1TVU5HCi0JYm9vbCAiU2Ftc3VuZyBTb0NzIEdQSU8gbGlicmFyeSBzdXBwb3J0IgotCWRlZmF1bHQgeSBpZiBTQU1TVU5HX0dQSU9MSUJfNEJJVAotCWRlcGVuZHMgb24gQVJNCi0JaGVscAotCSAgU2F5IHllcyBoZXJlIHRvIHN1cHBvcnQgU2Ftc3VuZyBTb0NzIEdQSU8gbGlicmFyeQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIFNBTVNVTkdfR1BJT0xJQl80QklUCiAKIGNvbmZpZyBHUElPX1M1UEMxMDAKLQlib29sICJTYW1zdW5nIFM1UEMxMDAgR1BJTyBsaWJyYXJ5IHN1cHBvcnQiCi0JZGVmYXVsdCB5IGlmIENQVV9TNVBDMTAwCi0JZGVwZW5kcyBvbiBBUk0KLQloZWxwCi0JICBTYXkgeWVzIGhlcmUgdG8gc3VwcG9ydCBTYW1zdW5nIFM1UEMxMDAgU29DcyBHUElPIGxpYnJhcnkKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBDUFVfUzVQQzEwMAogCiBjb25maWcgR1BJT19TNVBWMjEwCi0JYm9vbCAiU2Ftc3VuZyBTNVBWMjEwL1M1UEMxMTAgR1BJTyBsaWJyYXJ5IHN1cHBvcnQiCi0JZGVmYXVsdCB5IGlmIENQVV9TNVBWMjEwCi0JZGVwZW5kcyBvbiBBUk0KLQloZWxwCi0JICBTYXkgeWVzIGhlcmUgdG8gc3VwcG9ydCBTYW1zdW5nIFM1UFYyMTAvUzVQQzExMCBTb0NzIEdQSU8gbGlicmFyeQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIENQVV9TNVBWMjEwCiAKIGNvbmZpZyBHUElPX1BMMDYxCiAJYm9vbCAiUHJpbWVDZWxsIFBMMDYxIEdQSU8gc3VwcG9ydCIKQEAgLTE0OSw5ICsxNjIsNiBAQAogCSAgVGhlIEludGVsIFR1bm5lbCBDcmVlayBwcm9jZXNzb3IgaGFzIDUgR1BJT3MgcG93ZXJlZCBieSB0aGUKIAkgIGNvcmUgcG93ZXIgcmFpbCBhbmQgOSBmcm9tIHN1c3BlbmQgcG93ZXIgc3VwcGx5LgogCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNjaC1ncGlvLgotCiBjb25maWcgR1BJT19WWDg1NQogCXRyaXN0YXRlICJWSUEgVlg4NTUvVlg4NzUgR1BJTyIKIAlkZXBlbmRzIG9uIE1GRF9TVVBQT1JUICYmIFBDSQpAQCAtMjE0LDkgKzIyNCw2IEBACiAKIAkgIDE2IGJpdHM6CXBjYTk1MzUsIHBjYTk1MzksIHBjYTk1NTUsIHRjYTY0MTYKIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgcGNhOTUzeC4KLQogY29uZmlnIEdQSU9fUENBOTUzWF9JUlEKIAlib29sICJJbnRlcnJ1cHQgY29udHJvbGxlciBzdXBwb3J0IGZvciBQQ0E5NTN4IgogCWRlcGVuZHMgb24gR1BJT19QQ0E5NTNYPXkKQEAgLTMwOCwxNyArMzE1LDEyIEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIG9uLWNoaXAgR1BJTyBmb3VuZAogCSAgb24gQW5hbG9nIERldmljZXMgQURQNTUyMCBQTUlDcy4KIAotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgYWRwNTUyMC1ncGlvLgotCiBjb25maWcgR1BJT19BRFA1NTg4CiAJdHJpc3RhdGUgIkFEUDU1ODggSTJDIEdQSU8gZXhwYW5kZXIiCiAJZGVwZW5kcyBvbiBJMkMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIDE4IEdQSU9zIGZvdW5kCiAJICBvbiBBbmFsb2cgRGV2aWNlcyBBRFA1NTg4IEdQSU8gRXhwYW5kZXJzLgotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCi0JICBjYWxsZWQgYWRwNTU4OC1ncGlvLgogCiBjb25maWcgR1BJT19BRFA1NTg4X0lSUQogCWJvb2wgIkludGVycnVwdCBjb250cm9sbGVyIHN1cHBvcnQgZm9yIEFEUDU1ODgiCkBAIC00MTAsMTAgKzQxMiwxMSBAQAogCSAgR1BJTyBkcml2ZXIgZm9yIE1heGltIE1BWDczMDEgU1BJLWJhc2VkIEdQSU8gZXhwYW5kZXIuCiAKIGNvbmZpZyBHUElPX01DUDIzUzA4Ci0JdHJpc3RhdGUgIk1pY3JvY2hpcCBNQ1AyM1N4eCBJL08gZXhwYW5kZXIiCi0JZGVwZW5kcyBvbiBTUElfTUFTVEVSCisJdHJpc3RhdGUgIk1pY3JvY2hpcCBNQ1AyM3h4eCBJL08gZXhwYW5kZXIiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSIHx8IEkyQwogCWhlbHAKLQkgIFNQSSBkcml2ZXIgZm9yIE1pY3JvY2hpcCBNQ1AyM1MwOC9NUEMyM1MxNyBJL08gZXhwYW5kZXJzLgorCSAgU1BJL0kyQyBkcml2ZXIgZm9yIE1pY3JvY2hpcCBNQ1AyM1MwOC9NQ1AyM1MxNy9NQ1AyMzAwOC9NQ1AyMzAxNworCSAgSS9PIGV4cGFuZGVycy4KIAkgIFRoaXMgcHJvdmlkZXMgYSBHUElPIGludGVyZmFjZSBzdXBwb3J0aW5nIGlucHV0cyBhbmQgb3V0cHV0cy4KIAogY29uZmlnIEdQSU9fTUMzMzg4MApAQCAtNDQwLDkgKzQ0Myw2IEBACiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFBoaWxpcHMgVUNCMTQwMCBHUElPIHBpbnMuCiAJICBUaGUgVUNCMTQwMCBpcyBhbiBBQzk3IGF1ZGlvIGNvZGVjLgogCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1Y2IxNDAwX2dwaW8uCi0KIGNvbW1lbnQgIk1PRFVMYnVzIEdQSU8gZXhwYW5kZXJzOiIKIAogY29uZmlnIEdQSU9fSkFOWl9UVEwKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgZHJpdmluZyB0aGUgcGlucyBpbiBvdXRwdXQKIAkgIG1vZGUgb25seS4gSW5wdXQgbW9kZSBpcyBub3Qgc3VwcG9ydGVkLgogCi1jb25maWcgQUI4NTAwX0dQSU8KK2NvbmZpZyBHUElPX0FCODUwMAogCWJvb2wgIlNULUVyaWNzc29uIEFCODUwMCBNaXhlZCBTaWduYWwgQ2lyY3VpdCBncGlvIGZ1bmN0aW9ucyIKIAlkZXBlbmRzIG9uIEFCODUwMF9DT1JFICYmIEJST0tFTgogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZSBiL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQppbmRleCBiNjA1ZjhlLi43MjA3MTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncGlvL01ha2VmaWxlCkBAIC00LDQ3ICs0LDU2IEBACiAKIG9iai0kKENPTkZJR19HUElPTElCKQkJKz0gZ3Bpb2xpYi5vCiAKLW9iai0kKENPTkZJR19HUElPX0FEUDU1MjApCSs9IGFkcDU1MjAtZ3Bpby5vCi1vYmotJChDT05GSUdfR1BJT19BRFA1NTg4KQkrPSBhZHA1NTg4LWdwaW8ubwotb2JqLSQoQ09ORklHX0dQSU9fQkFTSUNfTU1JT19DT1JFKQkrPSBiYXNpY19tbWlvX2dwaW8ubwotb2JqLSQoQ09ORklHX0dQSU9fQkFTSUNfTU1JTykJKz0gYmFzaWNfbW1pb19ncGlvLm8KKyMgRGV2aWNlIGRyaXZlcnMuIEdlbmVyYWxseSBrZWVwIGxpc3Qgc29ydGVkIGFscGhhYmV0aWNhbGx5CitvYmotJChDT05GSUdfR1BJT19HRU5FUklDKQkrPSBncGlvLWdlbmVyaWMubworCitvYmotJChDT05GSUdfR1BJT183NFgxNjQpCSs9IGdwaW8tNzR4MTY0Lm8KK29iai0kKENPTkZJR19HUElPX0FCODUwMCkJKz0gZ3Bpby1hYjg1MDAubworb2JqLSQoQ09ORklHX0dQSU9fQURQNTUyMCkJKz0gZ3Bpby1hZHA1NTIwLm8KK29iai0kKENPTkZJR19HUElPX0FEUDU1ODgpCSs9IGdwaW8tYWRwNTU4OC5vCitvYmotJChDT05GSUdfR1BJT19CVDhYWCkJKz0gZ3Bpby1idDh4eC5vCitvYmotJChDT05GSUdfR1BJT19DUzU1MzUpCSs9IGdwaW8tY3M1NTM1Lm8KK29iai0kKENPTkZJR19HUElPX0RBOTA1MikJKz0gZ3Bpby1kYTkwNTIubworb2JqLSQoQ09ORklHX0dQSU9fRVA5M1hYKQkrPSBncGlvLWVwOTN4eC5vCiBvYmotJChDT05GSUdfR1BJT19FWFlOT1M0KQkrPSBncGlvLWV4eW5vczQubworb2JqLSQoQ09ORklHX0dQSU9fSVQ4NzYxRSkJKz0gZ3Bpby1pdDg3NjFlLm8KK29iai0kKENPTkZJR19HUElPX0pBTlpfVFRMKQkrPSBncGlvLWphbnotdHRsLm8KK29iai0kKENPTkZJR19HUElPX0xBTkdXRUxMKQkrPSBncGlvLWxhbmd3ZWxsLm8KK29iai0kKENPTkZJR19HUElPX01BWDczMFgpCSs9IGdwaW8tbWF4NzMweC5vCitvYmotJChDT05GSUdfR1BJT19NQVg3MzAwKQkrPSBncGlvLW1heDczMDAubworb2JqLSQoQ09ORklHX0dQSU9fTUFYNzMwMSkJKz0gZ3Bpby1tYXg3MzAxLm8KK29iai0kKENPTkZJR19HUElPX01BWDczMlgpCSs9IGdwaW8tbWF4NzMyeC5vCitvYmotJChDT05GSUdfR1BJT19NQzMzODgwKQkrPSBncGlvLW1jMzM4ODAubworb2JqLSQoQ09ORklHX0dQSU9fTUNQMjNTMDgpCSs9IGdwaW8tbWNwMjNzMDgubworb2JqLSQoQ09ORklHX0dQSU9fTUxfSU9IKQkrPSBncGlvLW1sLWlvaC5vCitvYmotJChDT05GSUdfR1BJT19NUEM1MjAwKQkrPSBncGlvLW1wYzUyMDAubworb2JqLSQoQ09ORklHX0dQSU9fTVhDKQkJKz0gZ3Bpby1teGMubworb2JqLSQoQ09ORklHX0dQSU9fTVhTKQkJKz0gZ3Bpby1teHMubworb2JqLSQoQ09ORklHX1BMQVRfTk9NQURJSykJKz0gZ3Bpby1ub21hZGlrLm8KK29iai0kKENPTkZJR19BUkNIX09NQVApCQkrPSBncGlvLW9tYXAubworb2JqLSQoQ09ORklHX0dQSU9fUENBOTUzWCkJKz0gZ3Bpby1wY2E5NTN4Lm8KK29iai0kKENPTkZJR19HUElPX1BDRjg1N1gpCSs9IGdwaW8tcGNmODU3eC5vCitvYmotJChDT05GSUdfR1BJT19QQ0gpCQkrPSBncGlvLXBjaC5vCitvYmotJChDT05GSUdfR1BJT19QTDA2MSkJKz0gZ3Bpby1wbDA2MS5vCitvYmotJChDT05GSUdfR1BJT19SREMzMjFYKQkrPSBncGlvLXJkYzMyMXgubworCiBvYmotJChDT05GSUdfR1BJT19QTEFUX1NBTVNVTkcpCSs9IGdwaW8tcGxhdC1zYW1zdW5nLm8KIG9iai0kKENPTkZJR19HUElPX1M1UEMxMDApCSs9IGdwaW8tczVwYzEwMC5vCiBvYmotJChDT05GSUdfR1BJT19TNVBWMjEwKQkrPSBncGlvLXM1cHYyMTAubwotb2JqLSQoQ09ORklHX0dQSU9fTEFOR1dFTEwpCSs9IGxhbmd3ZWxsX2dwaW8ubwotb2JqLSQoQ09ORklHX0dQSU9fTUFYNzMwWCkJKz0gbWF4NzMweC5vCi1vYmotJChDT05GSUdfR1BJT19NQVg3MzAwKQkrPSBtYXg3MzAwLm8KLW9iai0kKENPTkZJR19HUElPX01BWDczMDEpCSs9IG1heDczMDEubwotb2JqLSQoQ09ORklHX0dQSU9fTUFYNzMyWCkJKz0gbWF4NzMyeC5vCi1vYmotJChDT05GSUdfR1BJT19NQzMzODgwKQkrPSBtYzMzODgwLm8KLW9iai0kKENPTkZJR19HUElPX01DUDIzUzA4KQkrPSBtY3AyM3MwOC5vCi1vYmotJChDT05GSUdfR1BJT183NFgxNjQpCSs9IDc0eDE2NC5vCi1vYmotJChDT05GSUdfQVJDSF9PTUFQKSAgICAgICAgICs9IGdwaW8tb21hcC5vCi1vYmotJChDT05GSUdfR1BJT19QQ0E5NTNYKQkrPSBwY2E5NTN4Lm8KLW9iai0kKENPTkZJR19HUElPX1BDRjg1N1gpCSs9IHBjZjg1N3gubwotb2JqLSQoQ09ORklHX0dQSU9fUENIKQkJKz0gcGNoX2dwaW8ubwotb2JqLSQoQ09ORklHX0dQSU9fUEwwNjEpCSs9IHBsMDYxLm8KLW9iai0kKENPTkZJR19HUElPX1NUTVBFKQkrPSBzdG1wZS1ncGlvLm8KLW9iai0kKENPTkZJR19HUElPX1RDMzU4OVgpCSs9IHRjMzU4OXgtZ3Bpby5vCi1vYmotJChDT05GSUdfR1BJT19USU1CRVJEQUxFKQkrPSB0aW1iZ3Bpby5vCi1vYmotJChDT05GSUdfR1BJT19UV0w0MDMwKQkrPSB0d2w0MDMwLWdwaW8ubwotb2JqLSQoQ09ORklHX0dQSU9fVUNCMTQwMCkJKz0gdWNiMTQwMF9ncGlvLm8KLW9iai0kKENPTkZJR19HUElPX1hJTElOWCkJKz0geGlsaW54X2dwaW8ubwotb2JqLSQoQ09ORklHX0dQSU9fQ1M1NTM1KQkrPSBjczU1MzUtZ3Bpby5vCi1vYmotJChDT05GSUdfR1BJT19CVDhYWCkJKz0gYnQ4eHhncGlvLm8KLW9iai0kKENPTkZJR19HUElPX0lUODc2MUUpCSs9IGl0ODc2MWVfZ3Bpby5vCi1vYmotJChDT05GSUdfR1BJT19WUjQxWFgpCSs9IHZyNDF4eF9naXUubwotb2JqLSQoQ09ORklHX0dQSU9fV004MzFYKQkrPSB3bTgzMXgtZ3Bpby5vCi1vYmotJChDT05GSUdfR1BJT19XTTgzNTApCSs9IHdtODM1MC1ncGlvbGliLm8KLW9iai0kKENPTkZJR19HUElPX1dNODk5NCkJKz0gd204OTk0LWdwaW8ubwotb2JqLSQoQ09ORklHX0dQSU9fU0NIKQkJKz0gc2NoX2dwaW8ubworCitvYmotJChDT05GSUdfR1BJT19TQ0gpCQkrPSBncGlvLXNjaC5vCitvYmotJChDT05GSUdfR1BJT19TVE1QRSkJKz0gZ3Bpby1zdG1wZS5vCitvYmotJChDT05GSUdfR1BJT19TWDE1MFgpCSs9IGdwaW8tc3gxNTB4Lm8KK29iai0kKENPTkZJR19HUElPX1RDMzU4OVgpCSs9IGdwaW8tdGMzNTg5eC5vCitvYmotJChDT05GSUdfQVJDSF9URUdSQSkJKz0gZ3Bpby10ZWdyYS5vCitvYmotJChDT05GSUdfR1BJT19USU1CRVJEQUxFKQkrPSBncGlvLXRpbWJlcmRhbGUubworb2JqLSQoQ09ORklHX0dQSU9fVFBTNjU5MTApCSs9IGdwaW8tdHBzNjU5MTAubworb2JqLSQoQ09ORklHX0dQSU9fVFdMNDAzMCkJKz0gZ3Bpby10d2w0MDMwLm8KIG9iai0kKENPTkZJR19NQUNIX1UzMDApCQkrPSBncGlvLXUzMDAubwotb2JqLSQoQ09ORklHX1BMQVRfTk9NQURJSykJKz0gZ3Bpby1ub21hZGlrLm8KLW9iai0kKENPTkZJR19HUElPX1JEQzMyMVgpCSs9IHJkYzMyMXgtZ3Bpby5vCi1vYmotJChDT05GSUdfR1BJT19KQU5aX1RUTCkJKz0gamFuei10dGwubwotb2JqLSQoQ09ORklHX0dQSU9fU1gxNTBYKQkrPSBzeDE1MHgubwotb2JqLSQoQ09ORklHX0dQSU9fVlg4NTUpCSs9IHZ4ODU1X2dwaW8ubwotb2JqLSQoQ09ORklHX0dQSU9fTUxfSU9IKQkrPSBtbF9pb2hfZ3Bpby5vCi1vYmotJChDT05GSUdfQUI4NTAwX0dQSU8pICAgICAgICs9IGFiODUwMC1ncGlvLm8KLW9iai0kKENPTkZJR19HUElPX1RQUzY1OTEwKQkrPSB0cHM2NTkxMC1ncGlvLm8KK29iai0kKENPTkZJR19HUElPX1VDQjE0MDApCSs9IGdwaW8tdWNiMTQwMC5vCitvYmotJChDT05GSUdfR1BJT19WUjQxWFgpCSs9IGdwaW8tdnI0MXh4Lm8KK29iai0kKENPTkZJR19HUElPX1ZYODU1KQkrPSBncGlvLXZ4ODU1Lm8KK29iai0kKENPTkZJR19HUElPX1dNODMxWCkJKz0gZ3Bpby13bTgzMXgubworb2JqLSQoQ09ORklHX0dQSU9fV004MzUwKQkrPSBncGlvLXdtODM1MC5vCitvYmotJChDT05GSUdfR1BJT19XTTg5OTQpCSs9IGdwaW8td204OTk0Lm8KK29iai0kKENPTkZJR19HUElPX1hJTElOWCkJKz0gZ3Bpby14aWxpbngubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2FiODUwMC1ncGlvLmMgYi9kcml2ZXJzL2dwaW8vYWI4NTAwLWdwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwMDUzYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwaW8vYWI4NTAwLWdwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDExCi0gKgotICogQXV0aG9yOiBCSUJFSyBCQVNVIDxiaWJlay5iYXN1QHN0ZXJpY3Nzb24uY29tPgotICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9hYjg1MDAuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2FiODUwMC9ncGlvLmg+Ci0KLS8qCi0gKiBHUElPIHJlZ2lzdGVycyBvZmZzZXQKLSAqIEJhbms6IDB4MTAKLSAqLwotI2RlZmluZSBBQjg1MDBfR1BJT19TRUwxX1JFRwkweDAwCi0jZGVmaW5lIEFCODUwMF9HUElPX1NFTDJfUkVHCTB4MDEKLSNkZWZpbmUgQUI4NTAwX0dQSU9fU0VMM19SRUcJMHgwMgotI2RlZmluZSBBQjg1MDBfR1BJT19TRUw0X1JFRwkweDAzCi0jZGVmaW5lIEFCODUwMF9HUElPX1NFTDVfUkVHCTB4MDQKLSNkZWZpbmUgQUI4NTAwX0dQSU9fU0VMNl9SRUcJMHgwNQotCi0jZGVmaW5lIEFCODUwMF9HUElPX0RJUjFfUkVHCTB4MTAKLSNkZWZpbmUgQUI4NTAwX0dQSU9fRElSMl9SRUcJMHgxMQotI2RlZmluZSBBQjg1MDBfR1BJT19ESVIzX1JFRwkweDEyCi0jZGVmaW5lIEFCODUwMF9HUElPX0RJUjRfUkVHCTB4MTMKLSNkZWZpbmUgQUI4NTAwX0dQSU9fRElSNV9SRUcJMHgxNAotI2RlZmluZSBBQjg1MDBfR1BJT19ESVI2X1JFRwkweDE1Ci0KLSNkZWZpbmUgQUI4NTAwX0dQSU9fT1VUMV9SRUcJMHgyMAotI2RlZmluZSBBQjg1MDBfR1BJT19PVVQyX1JFRwkweDIxCi0jZGVmaW5lIEFCODUwMF9HUElPX09VVDNfUkVHCTB4MjIKLSNkZWZpbmUgQUI4NTAwX0dQSU9fT1VUNF9SRUcJMHgyMwotI2RlZmluZSBBQjg1MDBfR1BJT19PVVQ1X1JFRwkweDI0Ci0jZGVmaW5lIEFCODUwMF9HUElPX09VVDZfUkVHCTB4MjUKLQotI2RlZmluZSBBQjg1MDBfR1BJT19QVUQxX1JFRwkweDMwCi0jZGVmaW5lIEFCODUwMF9HUElPX1BVRDJfUkVHCTB4MzEKLSNkZWZpbmUgQUI4NTAwX0dQSU9fUFVEM19SRUcJMHgzMgotI2RlZmluZSBBQjg1MDBfR1BJT19QVUQ0X1JFRwkweDMzCi0jZGVmaW5lIEFCODUwMF9HUElPX1BVRDVfUkVHCTB4MzQKLSNkZWZpbmUgQUI4NTAwX0dQSU9fUFVENl9SRUcJMHgzNQotCi0jZGVmaW5lIEFCODUwMF9HUElPX0lOMV9SRUcJMHg0MAotI2RlZmluZSBBQjg1MDBfR1BJT19JTjJfUkVHCTB4NDEKLSNkZWZpbmUgQUI4NTAwX0dQSU9fSU4zX1JFRwkweDQyCi0jZGVmaW5lIEFCODUwMF9HUElPX0lONF9SRUcJMHg0MwotI2RlZmluZSBBQjg1MDBfR1BJT19JTjVfUkVHCTB4NDQKLSNkZWZpbmUgQUI4NTAwX0dQSU9fSU42X1JFRwkweDQ1Ci0jZGVmaW5lIEFCODUwMF9HUElPX0FMVEZVTl9SRUcJMHg0NQotI2RlZmluZSBBTFRGVU5fUkVHX0lOREVYCTYKLSNkZWZpbmUgQUI4NTAwX05VTV9HUElPCQk0MgotI2RlZmluZSBBQjg1MDBfTlVNX1ZJUl9HUElPX0lSUQkxNgotCi1lbnVtIGFiODUwMF9ncGlvX2FjdGlvbiB7Ci0JTk9ORSwKLQlTVEFSVFVQLAotCVNIVVRET1dOLAotCU1BU0ssCi0JVU5NQVNLCi19OwotCi1zdHJ1Y3QgYWI4NTAwX2dwaW8gewotCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKLQlzdHJ1Y3QgYWI4NTAwICpwYXJlbnQ7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBtdXRleCBsb2NrOwotCXUzMiBpcnFfYmFzZTsKLQllbnVtIGFiODUwMF9ncGlvX2FjdGlvbiBpcnFfYWN0aW9uOwotCXUxNiByaXNpbmc7Ci0JdTE2IGZhbGxpbmc7Ci19OwotLyoqCi0gKiB0b19hYjg1MDBfZ3BpbygpIC0gZ2V0IHRoZSBwb2ludGVyIHRvIGFiODUwMF9ncGlvCi0gKiBAY2hpcDoJTWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgYWI4NTAwX2dwaW8KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYWI4NTAwX2dwaW8gKnRvX2FiODUwMF9ncGlvKHN0cnVjdCBncGlvX2NoaXAgKmNoaXApCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgYWI4NTAwX2dwaW8sIGNoaXApOwotfQotCi1zdGF0aWMgaW50IGFiODUwMF9ncGlvX3NldF9iaXRzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHU4IHJlZywKLQkJCQkJdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsKQotewotCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSB0b19hYjg1MDBfZ3BpbyhjaGlwKTsKLQl1OCBwb3MgPSBvZmZzZXQgJSA4OwotCWludCByZXQ7Ci0KLQlyZWcgPSByZWcgKyAob2Zmc2V0IC8gOCk7Ci0JcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiODUwMF9ncGlvLT5kZXYsCi0JCQkJQUI4NTAwX01JU0MsIHJlZywgMSA8PCBwb3MsIHZhbCA8PCBwb3MpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGFiODUwMF9ncGlvLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmV0OwotfQotLyoqCi0gKiBhYjg1MDBfZ3Bpb19nZXQoKSAtIEdldCB0aGUgcGFydGljdWxhciBHUElPIHZhbHVlCi0gKiBAY2hpcDogR3BpbyBkZXZpY2UKLSAqIEBvZmZzZXQ6IEdQSU8gbnVtYmVyIHRvIHJlYWQKLSAqLwotc3RhdGljIGludCBhYjg1MDBfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSB0b19hYjg1MDBfZ3BpbyhjaGlwKTsKLQl1OCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7Ci0JdTggcmVnID0gQUI4NTAwX0dQSU9fT1VUMV9SRUcgKyAob2Zmc2V0IC8gOCk7Ci0JaW50IHJldDsKLQl1OCBkYXRhOwotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYjg1MDBfZ3Bpby0+ZGV2LCBBQjg1MDBfTUlTQywKLQkJCQkJCXJlZywgJmRhdGEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoYWI4NTAwX2dwaW8tPmRldiwgIiVzIHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldHVybiAoZGF0YSAmIG1hc2spID4+IChvZmZzZXQgJSA4KTsKLX0KLQotc3RhdGljIHZvaWQgYWI4NTAwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2dwaW8gKmFiODUwMF9ncGlvID0gdG9fYWI4NTAwX2dwaW8oY2hpcCk7Ci0JaW50IHJldDsKLQkvKiBXcml0ZSB0aGUgZGF0YSAqLwotCXJldCA9IGFiODUwMF9ncGlvX3NldF9iaXRzKGNoaXAsIEFCODUwMF9HUElPX09VVDFfUkVHLCBvZmZzZXQsIDEpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGFiODUwMF9ncGlvLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIGludCBhYjg1MDBfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKLQkJCQkJaW50IHZhbCkKLXsKLQlpbnQgcmV0OwotCS8qIHNldCBkaXJlY3Rpb24gYXMgb3V0cHV0ICovCi0JcmV0ID0gYWI4NTAwX2dwaW9fc2V0X2JpdHMoY2hpcCwgQUI4NTAwX0dQSU9fRElSMV9SRUcsIG9mZnNldCwgMSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JLyogZGlzYWJsZSBwdWxsIGRvd24gKi8KLQlyZXQgPSBhYjg1MDBfZ3Bpb19zZXRfYml0cyhjaGlwLCBBQjg1MDBfR1BJT19QVUQxX1JFRywgb2Zmc2V0LCAxKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQkvKiBzZXQgdGhlIG91dHB1dCBhcyAxIG9yIDAgKi8KLQlyZXR1cm4gYWI4NTAwX2dwaW9fc2V0X2JpdHMoY2hpcCwgQUI4NTAwX0dQSU9fT1VUMV9SRUcsIG9mZnNldCwgdmFsKTsKLQotfQotCi1zdGF0aWMgaW50IGFiODUwMF9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JLyogc2V0IHRoZSByZWdpc3RlciBhcyBpbnB1dCAqLwotCXJldHVybiBhYjg1MDBfZ3Bpb19zZXRfYml0cyhjaGlwLCBBQjg1MDBfR1BJT19ESVIxX1JFRywgb2Zmc2V0LCAwKTsKLX0KLQotc3RhdGljIGludCBhYjg1MDBfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCS8qCi0JICogT25seSBzb21lIEdQSU9zIGFyZSBpbnRlcnJ1cHQgY2FwYWJsZSwgYW5kIHRoZXkgYXJlCi0JICogb3JnYW5pemVkIGluIGRpc2NvbnRpZ3VvdXMgY2x1c3RlcnM6Ci0JICoKLQkgKglHUElPNiB0byBHUElPMTMKLQkgKglHUElPMjQgYW5kIEdQSU8yNQotCSAqCUdQSU8zNiB0byBHUElPNDEKLQkgKi8KLQlzdGF0aWMgc3RydWN0IGFiODUwMF9ncGlvX2lycV9jbHVzdGVyIHsKLQkJaW50IHN0YXJ0OwotCQlpbnQgZW5kOwotCX0gY2x1c3RlcnNbXSA9IHsKLQkJey5zdGFydCA9IDYsICAuZW5kID0gMTN9LAotCQl7LnN0YXJ0ID0gMjQsIC5lbmQgPSAyNX0sCi0JCXsuc3RhcnQgPSAzNiwgLmVuZCA9IDQxfSwKLQl9OwotCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSB0b19hYjg1MDBfZ3BpbyhjaGlwKTsKLQlpbnQgYmFzZSA9IGFiODUwMF9ncGlvLT5pcnFfYmFzZTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsdXN0ZXJzKTsgaSsrKSB7Ci0JCXN0cnVjdCBhYjg1MDBfZ3Bpb19pcnFfY2x1c3RlciAqY2x1c3RlciA9ICZjbHVzdGVyc1tpXTsKLQotCQlpZiAob2Zmc2V0ID49IGNsdXN0ZXItPnN0YXJ0ICYmIG9mZnNldCA8PSBjbHVzdGVyLT5lbmQpCi0JCQlyZXR1cm4gYmFzZSArIG9mZnNldCAtIGNsdXN0ZXItPnN0YXJ0OwotCi0JCS8qIEFkdmFuY2UgYnkgdGhlIG51bWJlciBvZiBncGlvcyBpbiB0aGlzIGNsdXN0ZXIgKi8KLQkJYmFzZSArPSBjbHVzdGVyLT5lbmQgLSBjbHVzdGVyLT5zdGFydCArIDE7Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIGFiODUwMGdwaW9fY2hpcCA9IHsKLQkubGFiZWwJCQk9ICJhYjg1MDBfZ3BpbyIsCi0JLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkuZGlyZWN0aW9uX2lucHV0CT0gYWI4NTAwX2dwaW9fZGlyZWN0aW9uX2lucHV0LAotCS5nZXQJCQk9IGFiODUwMF9ncGlvX2dldCwKLQkuZGlyZWN0aW9uX291dHB1dAk9IGFiODUwMF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCi0JLnNldAkJCT0gYWI4NTAwX2dwaW9fc2V0LAotCS50b19pcnEJCQk9IGFiODUwMF9ncGlvX3RvX2lycSwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX3RvX3Jpc2luZyh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWludCBvZmZzZXQgPSBpcnEgLSBhYjg1MDBfZ3Bpby0+aXJxX2Jhc2U7Ci0JaW50IG5ld19pcnEgPSBvZmZzZXQgKyAgQUI4NTAwX0lOVF9HUElPNlIKLQkJCSsgYWI4NTAwX2dwaW8tPnBhcmVudC0+aXJxX2Jhc2U7Ci0JcmV0dXJuIG5ld19pcnE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX3RvX2ZhbGxpbmcodW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2dwaW8gKmFiODUwMF9ncGlvID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlpbnQgb2Zmc2V0ID0gaXJxIC0gYWI4NTAwX2dwaW8tPmlycV9iYXNlOwotCWludCBuZXdfaXJxID0gb2Zmc2V0ICsgIEFCODUwMF9JTlRfR1BJTzZGCi0JCQkrICBhYjg1MDBfZ3Bpby0+cGFyZW50LT5pcnFfYmFzZTsKLQlyZXR1cm4gbmV3X2lycTsKLQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHJpc2luZ190b19pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2KQotewotCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSBkZXY7Ci0JaW50IG9mZnNldCA9IGlycSAtIEFCODUwMF9JTlRfR1BJTzZSCi0JCQktIGFiODUwMF9ncGlvLT5wYXJlbnQtPmlycV9iYXNlIDsKLQlpbnQgbmV3X2lycSA9IG9mZnNldCArIGFiODUwMF9ncGlvLT5pcnFfYmFzZTsKLQlyZXR1cm4gbmV3X2lycTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBmYWxsaW5nX3RvX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXYpCi17Ci0Jc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbyA9IGRldjsKLQlpbnQgb2Zmc2V0ID0gaXJxIC0gQUI4NTAwX0lOVF9HUElPNkYKLQkJCS0gYWI4NTAwX2dwaW8tPnBhcmVudC0+aXJxX2Jhc2UgOwotCWludCBuZXdfaXJxID0gb2Zmc2V0ICsgYWI4NTAwX2dwaW8tPmlycV9iYXNlOwotCXJldHVybiBuZXdfaXJxOwotCi19Ci0KLS8qCi0gKiBJUlEgaGFuZGxlcgotICovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBoYW5kbGVfcmlzaW5nKGludCBpcnEsIHZvaWQgKmRldikKLXsKLQotCWhhbmRsZV9uZXN0ZWRfaXJxKHJpc2luZ190b19pcnEoaXJxICwgZGV2KSk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgaGFuZGxlX2ZhbGxpbmcoaW50IGlycSwgdm9pZCAqZGV2KQotewotCi0JaGFuZGxlX25lc3RlZF9pcnEoZmFsbGluZ190b19pcnEoaXJxLCBkZXYpKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGFiODUwMF9ncGlvX2lycV9sb2NrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JbXV0ZXhfbG9jaygmYWI4NTAwX2dwaW8tPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBhYjg1MDBfZ3Bpb19pcnFfc3luY191bmxvY2sodW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2dwaW8gKmFiODUwMF9ncGlvID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlpbnQgb2Zmc2V0ID0gaXJxIC0gYWI4NTAwX2dwaW8tPmlycV9iYXNlOwotCWJvb2wgcmlzaW5nID0gYWI4NTAwX2dwaW8tPnJpc2luZyAmIEJJVChvZmZzZXQpOwotCWJvb2wgZmFsbGluZyA9IGFiODUwMF9ncGlvLT5mYWxsaW5nICYgQklUKG9mZnNldCk7Ci0JaW50IHJldDsKLQotCXN3aXRjaCAoYWI4NTAwX2dwaW8tPmlycV9hY3Rpb24pCXsKLQljYXNlIFNUQVJUVVA6Ci0JCWlmIChyaXNpbmcpCi0JCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnFfdG9fcmlzaW5nKGlycSksCi0JCQkJCU5VTEwsIGhhbmRsZV9yaXNpbmcsCi0JCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsCi0JCQkJCSJhYjg1MDAtZ3Bpby1yIiwgYWI4NTAwX2dwaW8pOwotCQlpZiAoZmFsbGluZykKLQkJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGlycV90b19mYWxsaW5nKGlycSksCi0JCQkJICAgICAgIE5VTEwsIGhhbmRsZV9mYWxsaW5nLAotCQkJCSAgICAgICBJUlFGX1RSSUdHRVJfRkFMTElORywKLQkJCQkgICAgICAgImFiODUwMC1ncGlvLWYiLCBhYjg1MDBfZ3Bpbyk7Ci0JCWJyZWFrOwotCWNhc2UgU0hVVERPV046Ci0JCWlmIChyaXNpbmcpCi0JCQlmcmVlX2lycShpcnFfdG9fcmlzaW5nKGlycSksIGFiODUwMF9ncGlvKTsKLQkJaWYgKGZhbGxpbmcpCi0JCQlmcmVlX2lycShpcnFfdG9fZmFsbGluZyhpcnEpLCBhYjg1MDBfZ3Bpbyk7Ci0JCWJyZWFrOwotCWNhc2UgTUFTSzoKLQkJaWYgKHJpc2luZykKLQkJCWRpc2FibGVfaXJxKGlycV90b19yaXNpbmcoaXJxKSk7Ci0JCWlmIChmYWxsaW5nKQotCQkJZGlzYWJsZV9pcnEoaXJxX3RvX2ZhbGxpbmcoaXJxKSk7Ci0JCWJyZWFrOwotCWNhc2UgVU5NQVNLOgotCQlpZiAocmlzaW5nKQotCQkJZW5hYmxlX2lycShpcnFfdG9fcmlzaW5nKGlycSkpOwotCQlpZiAoZmFsbGluZykKLQkJCWVuYWJsZV9pcnEoaXJxX3RvX2ZhbGxpbmcoaXJxKSk7Ci0JCWJyZWFrOwotCWNhc2UgTk9ORToKLQkJYnJlYWs7Ci0JfQotCWFiODUwMF9ncGlvLT5pcnFfYWN0aW9uID0gTk9ORTsKLQlhYjg1MDBfZ3Bpby0+cmlzaW5nICY9IH4oQklUKG9mZnNldCkpOwotCWFiODUwMF9ncGlvLT5mYWxsaW5nICY9IH4oQklUKG9mZnNldCkpOwotCW11dGV4X3VubG9jaygmYWI4NTAwX2dwaW8tPmxvY2spOwotfQotCi0KLXN0YXRpYyB2b2lkIGFiODUwMF9ncGlvX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JYWI4NTAwX2dwaW8tPmlycV9hY3Rpb24gPSBNQVNLOwotfQotCi1zdGF0aWMgdm9pZCBhYjg1MDBfZ3Bpb19pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JYWI4NTAwX2dwaW8tPmlycV9hY3Rpb24gPSBVTk1BU0s7Ci19Ci0KLXN0YXRpYyBpbnQgYWI4NTAwX2dwaW9faXJxX3NldF90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQotewotCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWludCBvZmZzZXQgPSBpcnEgLSBhYjg1MDBfZ3Bpby0+aXJxX2Jhc2U7Ci0KLQlpZiAodHlwZSA9PSBJUlFfVFlQRV9FREdFX0JPVEgpIHsKLQkJYWI4NTAwX2dwaW8tPnJpc2luZyA9ICBCSVQob2Zmc2V0KTsKLQkJYWI4NTAwX2dwaW8tPmZhbGxpbmcgPSBCSVQob2Zmc2V0KTsKLQl9IGVsc2UgaWYgKHR5cGUgPT0gSVJRX1RZUEVfRURHRV9SSVNJTkcpIHsKLQkJYWI4NTAwX2dwaW8tPnJpc2luZyA9ICBCSVQob2Zmc2V0KTsKLQl9IGVsc2UgIHsKLQkJYWI4NTAwX2dwaW8tPmZhbGxpbmcgPSBCSVQob2Zmc2V0KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGludCBhYjg1MDBfZ3Bpb19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWFiODUwMF9ncGlvLT5pcnFfYWN0aW9uID0gU1RBUlRVUDsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBhYjg1MDBfZ3Bpb19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2dwaW8gKmFiODUwMF9ncGlvID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlhYjg1MDBfZ3Bpby0+aXJxX2FjdGlvbiA9IFNIVVRET1dOOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGFiODUwMF9ncGlvX2lycV9jaGlwID0gewotCS5uYW1lCQkJPSAiYWI4NTAwLWdwaW8iLAotCS5zdGFydHVwCQk9IGFiODUwMF9ncGlvX2lycV9zdGFydHVwLAotCS5zaHV0ZG93bgkJPSBhYjg1MDBfZ3Bpb19pcnFfc2h1dGRvd24sCi0JLmJ1c19sb2NrCQk9IGFiODUwMF9ncGlvX2lycV9sb2NrLAotCS5idXNfc3luY191bmxvY2sJPSBhYjg1MDBfZ3Bpb19pcnFfc3luY191bmxvY2ssCi0JLm1hc2sJCQk9IGFiODUwMF9ncGlvX2lycV9tYXNrLAotCS51bm1hc2sJCQk9IGFiODUwMF9ncGlvX2lycV91bm1hc2ssCi0JLnNldF90eXBlCQk9IGFiODUwMF9ncGlvX2lycV9zZXRfdHlwZSwKLX07Ci0KLXN0YXRpYyBpbnQgYWI4NTAwX2dwaW9faXJxX2luaXQoc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbykKLXsKLQl1MzIgYmFzZSA9IGFiODUwMF9ncGlvLT5pcnFfYmFzZTsKLQlpbnQgaXJxOwotCi0JZm9yIChpcnEgPSBiYXNlOyBpcnEgPCBiYXNlICsgQUI4NTAwX05VTV9WSVJfR1BJT19JUlEgOyBpcnErKykgewotCQlzZXRfaXJxX2NoaXBfZGF0YShpcnEsIGFiODUwMF9ncGlvKTsKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmFiODUwMF9ncGlvX2lycV9jaGlwLAotCQkJCWhhbmRsZV9zaW1wbGVfaXJxKTsKLQkJc2V0X2lycV9uZXN0ZWRfdGhyZWFkKGlycSwgMSk7Ci0jaWZkZWYgQ09ORklHX0FSTQotCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7Ci0jZWxzZQotCQlzZXRfaXJxX25vcHJvYmUoaXJxKTsKLSNlbmRpZgotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhYjg1MDBfZ3Bpb19pcnFfcmVtb3ZlKHN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8pCi17Ci0JaW50IGJhc2UgPSBhYjg1MDBfZ3Bpby0+aXJxX2Jhc2U7Ci0JaW50IGlycTsKLQotCWZvciAoaXJxID0gYmFzZTsgaXJxIDwgYmFzZSArIEFCODUwMF9OVU1fVklSX0dQSU9fSVJROyBpcnErKykgewotI2lmZGVmIENPTkZJR19BUk0KLQkJc2V0X2lycV9mbGFncyhpcnEsIDApOwotI2VuZGlmCi0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsIE5VTEwsIE5VTEwpOwotCQlzZXRfaXJxX2NoaXBfZGF0YShpcnEsIE5VTEwpOwotCX0KLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgYWI4NTAwX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgYWI4NTAwX3BsYXRmb3JtX2RhdGEgKmFiODUwMF9wZGF0YSA9Ci0JCQkJZGV2X2dldF9wbGF0ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3QgYWI4NTAwX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbzsKLQlpbnQgcmV0OwotCWludCBpOwotCi0JcGRhdGEgPSBhYjg1MDBfcGRhdGEtPmdwaW87Ci0JaWYgKCFwZGF0YSkJewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJncGlvIHBsYXRmb3JtIGRhdGEgbWlzc2luZ1xuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWFiODUwMF9ncGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFiODUwMF9ncGlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGFiODUwMF9ncGlvID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlhYjg1MDBfZ3Bpby0+ZGV2ID0gJnBkZXYtPmRldjsKLQlhYjg1MDBfZ3Bpby0+cGFyZW50ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCWFiODUwMF9ncGlvLT5jaGlwID0gYWI4NTAwZ3Bpb19jaGlwOwotCWFiODUwMF9ncGlvLT5jaGlwLm5ncGlvID0gQUI4NTAwX05VTV9HUElPOwotCWFiODUwMF9ncGlvLT5jaGlwLmRldiA9ICZwZGV2LT5kZXY7Ci0JYWI4NTAwX2dwaW8tPmNoaXAuYmFzZSA9IHBkYXRhLT5ncGlvX2Jhc2U7Ci0JYWI4NTAwX2dwaW8tPmlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOwotCS8qIGluaXRpYWxpemUgdGhlIGxvY2sgKi8KLQltdXRleF9pbml0KCZhYjg1MDBfZ3Bpby0+bG9jayk7Ci0JLyoKLQkgKiBBQjg1MDAgY29yZSB3aWxsIGhhbmRsZSBhbmQgY2xlYXIgdGhlIElSUQotCSAqIGNvbmZpZ3JlIEdQSU8gYmFzZWQgb24gY29uZmlnLXJlZyB2YWx1ZS4KLQkgKiBUaGVzZSB2YWx1ZXMgYXJlIGZvciBzZWxlY3RpbmcgdGhlIFBJTnMgYXMKLQkgKiBHUElPIG9yIGFsdGVybmF0ZSBmdW5jdGlvbgotCSAqLwotCWZvciAoaSA9IEFCODUwMF9HUElPX1NFTDFfUkVHOyBpIDw9IEFCODUwMF9HUElPX1NFTDZfUkVHOyBpKyspCXsKLQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiODUwMF9ncGlvLT5kZXYsCi0JCQkJQUI4NTAwX01JU0MsIGksCi0JCQkJcGRhdGEtPmNvbmZpZ19yZWdbaV0pOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYjg1MDBfZ3Bpby0+ZGV2LCBBQjg1MDBfTUlTQywKLQkJCQlBQjg1MDBfR1BJT19BTFRGVU5fUkVHLAotCQkJCXBkYXRhLT5jb25maWdfcmVnW0FMVEZVTl9SRUdfSU5ERVhdKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZnJlZTsKLQotCXJldCA9IGFiODUwMF9ncGlvX2lycV9pbml0KGFiODUwMF9ncGlvKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9mcmVlOwotCXJldCA9IGdwaW9jaGlwX2FkZCgmYWI4NTAwX2dwaW8tPmNoaXApOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFkZCBncGlvY2hpcDogJWRcbiIsCi0JCQkJcmV0KTsKLQkJZ290byBvdXRfcmVtX2lycTsKLQl9Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYWI4NTAwX2dwaW8pOwotCXJldHVybiAwOwotCi1vdXRfcmVtX2lycToKLQlhYjg1MDBfZ3Bpb19pcnFfcmVtb3ZlKGFiODUwMF9ncGlvKTsKLW91dF9mcmVlOgotCW11dGV4X2Rlc3Ryb3koJmFiODUwMF9ncGlvLT5sb2NrKTsKLQlrZnJlZShhYjg1MDBfZ3Bpbyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGFiODUwMF9ncGlvX3JlbW92ZSgpIC0gcmVtb3ZlIEFiODUwMC1ncGlvIGRyaXZlcgotICogQHBkZXYgOglQbGF0Zm9ybSBkZXZpY2UgcmVnaXN0ZXJlZAotICovCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBhYjg1MDBfZ3Bpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgYWI4NTAwX2dwaW8gKmFiODUwMF9ncGlvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IHJldDsKLQotCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmYWI4NTAwX2dwaW8tPmNoaXApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoYWI4NTAwX2dwaW8tPmRldiwgInVuYWJsZSB0byByZW1vdmUgZ3Bpb2NoaXA6ICVkXG4iLAotCQkJcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQltdXRleF9kZXN0cm95KCZhYjg1MDBfZ3Bpby0+bG9jayk7Ci0Ja2ZyZWUoYWI4NTAwX2dwaW8pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFiODUwMF9ncGlvX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJhYjg1MDAtZ3BpbyIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlID0gYWI4NTAwX2dwaW9fcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFiODUwMF9ncGlvX3JlbW92ZSksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhYjg1MDBfZ3Bpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWI4NTAwX2dwaW9fZHJpdmVyKTsKLX0KLWFyY2hfaW5pdGNhbGwoYWI4NTAwX2dwaW9faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhYjg1MDBfZ3Bpb19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFiODUwMF9ncGlvX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChhYjg1MDBfZ3Bpb19leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiQklCRUsgQkFTVSA8YmliZWsuYmFzdUBzdGVyaWNzc29uLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGFsbG93cyB0byB1c2UgQUI4NTAwIHVudXNlZCBwaW5zIHRvIGJlIHVzZWQgYXMgR1BJTyIpOwotTU9EVUxFX0FMSUFTKCJBQjg1MDAgR1BJTyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9iYXNpY19tbWlvX2dwaW8uYyBiL2RyaXZlcnMvZ3Bpby9iYXNpY19tbWlvX2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1MmU5Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwaW8vYmFzaWNfbW1pb19ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDggKzAsMCBAQAotLyoKLSAqIERyaXZlciBmb3IgYmFzaWMgbWVtb3J5LW1hcHBlZCBHUElPIGNvbnRyb2xsZXJzLgotICoKLSAqIENvcHlyaWdodCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqIENvcHlyaWdodCAyMDA4LDIwMTAgQW50b24gVm9yb250c292IDxjYm91YXRtYWlscnVAZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogLi4uLmBgLmBgYH5+fn5gYGBgLmAuYC5gLmAuYGBgYGBgYCcnLCwsLi4uLi4uLi4uYGBgYGAuLi4uLi5gLi4uLi4uLgotICogLi4uYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYGBgYGBgLi4KLSAqIC4uVGhlIHNpbXBsZXN0IGZvcm0gb2YgYSBHUElPIGNvbnRyb2xsZXIgdGhhdCB0aGUgZHJpdmVyIHN1cHBvcnRzIGlzYGAKLSAqICBgLmp1c3QgYSBzaW5nbGUgImRhdGEiIHJlZ2lzdGVyLCB3aGVyZSBHUElPIHN0YXRlIGNhbiBiZSByZWFkIGFuZC9vciBgCi0gKiAgICBgLC4ud3JpdHRlbi4gLCwuLmBgfn5+fiAuLi4uLmBgLmAuYC5+fi5gYGAuYC4uLi4uLi4uLmBgYGBgYC5gYGBgYGBgCi0gKiAgICAgICAgYGBgYGBgYGBgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX18KLV8vfn58X19fL358ICAgLiBgYGB+fn5+fn4gICAgICAgX19fL19fX1xfX18gICAgICx+LmAuYC5gLmBgYGBgLn5+Li4uLCwsLC4uLgotX19fX19fX19fX3x+JEB+fn4gICAgICAgICV+ICAgIC9vKm8qbypvKm8qb1wgICAuLiBJbXBsZW1lbnRpbmcgc3VjaCBhIEdQSU8gLgotbyAgICAgICAgYCAgICAgICAgICAgICAgICAgICAgIH5+fn5cX19fL35+fn4gICAgYCBjb250cm9sbGVyIGluIEZQR0EgaXMgLC5gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYC4uLi50cml2aWFsLi4nfmAuYGBgLmBgYAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBgYGBgYAotICogIC5gYGBgYGBgfn5+fmAuLmAuYGAuYGAuCi0gKiAuICBUaGUgZHJpdmVyIHN1cHBvcnRzICBgLi4uICAgICAgICwuLmBgYC5gfn5+YGBgYGBgYGBgYGBgYGBgLi4uLmBgYGAuYGAsLAotICogLiAgIGJpZy1lbmRpYW4gbm90YXRpb24sIGp1c3RgLiAgLi4gQSBiaXQgbW9yZSBzb3BoaXN0aWNhdGVkIGNvbnRyb2xsZXJzICwKLSAqICAuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugd2l0aCAtYmVgLiAud2l0aCBhIHBhaXIgb2Ygc2V0L2NsZWFyLWJpdCByZWdpc3RlcnMgLAotICogICBgLi4gc3VmZml4LiAgYGBgfn5gYGBgYC4uLi5gLmAgICAuIGFmZmVjdGluZyB0aGUgZGF0YSByZWdpc3RlciBhbmQgdGhlIC5gCi0gKiAgICAgYGAuYC5gYC4uLmBgYCAgICAgICAgICAgICAgICAgIGBgYC4uIG91dHB1dCBwaW5zIGFyZSBhbHNvIHN1cHBvcnRlZC5gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIF5eICAgICAgICAgICAgIGBgYGBgLmBgYGBgYGBgYC4sYGB+YGB+YGB+fmBgYGBgYAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgXl4KLSAqICAgLC4uYC5gLmAuLi5gYGBgYGBgYGBgYGAuLi4uLi5gLmAuYC5gLmAuYC4uYC5gLmAuLgotICogLi4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQgaW4gYXQgbGVhc3Qgc29tZSBjYXNlcyAuICAgICwtfn5+LSwKLSAqICAudGhpcyB3aWxsIGJlIHVzZWQgd2l0aCByb2xsLXlvdXItb3duIEFTSUMvRlBHQSAuYCAgICAgXCAgIC8KLSAqICAubG9naWMgaW4gVmVyaWxvZyBvciBWSERMLiB+fn5gYGBgYGBgYGAuLmBgYGBgfn5gICAgICAgIFwgLwotICogIC4uYGBgYGBgYGAuLi4uLi5gYGBgYGBgYGBgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG9fCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXiAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcCi0gKgotICogICAgICAgICAgIC4uLmBgYGBgfn5gLi4uLi5gYC5gLi4uLi4uLi4uLmBgYGBgYC5gLmBgLmBgYC4uLi4uLi4uYGAuCi0gKiAgICAgICAgICAgIGAgIDgsIDE2LCAzMiBhbmQgNjQgYml0cyByZWdpc3RlcnMgYXJlIHN1cHBvcnRlZCwgYW5kYGAuCi0gKiAgICAgICAgICAgIC4gdGhlIG51bWJlciBvZiBHUElPcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB3aWR0aCBvZiAgIH4KLSAqICAgICAgICAgICAgIC4uIHRoZSByZWdpc3RlcnMuICwuLi4uLi4uLi4uLi5gYGAuYC5gLi5gLmAufn5+LmAuYC5gfgotICogICAgICAgICAgICAgICBgLi4uLi4uLmBgYGAuYGBgCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9idWcuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+Ci0jaW5jbHVkZSA8bGludXgvYmFzaWNfbW1pb19ncGlvLmg+Ci0KLXN0YXRpYyB2b2lkIGJncGlvX3dyaXRlOCh2b2lkIF9faW9tZW0gKnJlZywgdW5zaWduZWQgbG9uZyBkYXRhKQotewotCXdyaXRlYihkYXRhLCByZWcpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBiZ3Bpb19yZWFkOCh2b2lkIF9faW9tZW0gKnJlZykKLXsKLQlyZXR1cm4gcmVhZGIocmVnKTsKLX0KLQotc3RhdGljIHZvaWQgYmdwaW9fd3JpdGUxNih2b2lkIF9faW9tZW0gKnJlZywgdW5zaWduZWQgbG9uZyBkYXRhKQotewotCXdyaXRldyhkYXRhLCByZWcpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBiZ3Bpb19yZWFkMTYodm9pZCBfX2lvbWVtICpyZWcpCi17Ci0JcmV0dXJuIHJlYWR3KHJlZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJncGlvX3dyaXRlMzIodm9pZCBfX2lvbWVtICpyZWcsIHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl3cml0ZWwoZGF0YSwgcmVnKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYmdwaW9fcmVhZDMyKHZvaWQgX19pb21lbSAqcmVnKQotewotCXJldHVybiByZWFkbChyZWcpOwotfQotCi0jaWYgQklUU19QRVJfTE9ORyA+PSA2NAotc3RhdGljIHZvaWQgYmdwaW9fd3JpdGU2NCh2b2lkIF9faW9tZW0gKnJlZywgdW5zaWduZWQgbG9uZyBkYXRhKQotewotCXdyaXRlcShkYXRhLCByZWcpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBiZ3Bpb19yZWFkNjQodm9pZCBfX2lvbWVtICpyZWcpCi17Ci0JcmV0dXJuIHJlYWRxKHJlZyk7Ci19Ci0jZW5kaWYgLyogQklUU19QRVJfTE9ORyA+PSA2NCAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBiZ3Bpb19waW4ybWFzayhzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjLCB1bnNpZ25lZCBpbnQgcGluKQotewotCXJldHVybiAxIDw8IHBpbjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYmdwaW9fcGluMm1hc2tfYmUoc3RydWN0IGJncGlvX2NoaXAgKmJnYywKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IHBpbikKLXsKLQlyZXR1cm4gMSA8PCAoYmdjLT5iaXRzIC0gMSAtIHBpbik7Ci19Ci0KLXN0YXRpYyBpbnQgYmdwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKLXsKLQlzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjID0gdG9fYmdwaW9fY2hpcChnYyk7Ci0KLQlyZXR1cm4gYmdjLT5yZWFkX3JlZyhiZ2MtPnJlZ19kYXQpICYgYmdjLT5waW4ybWFzayhiZ2MsIGdwaW8pOwotfQotCi1zdGF0aWMgdm9pZCBiZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQotewotCXN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MgPSB0b19iZ3Bpb19jaGlwKGdjKTsKLQl1bnNpZ25lZCBsb25nIG1hc2sgPSBiZ2MtPnBpbjJtYXNrKGJnYywgZ3Bpbyk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiZ2MtPmxvY2ssIGZsYWdzKTsKLQotCWlmICh2YWwpCi0JCWJnYy0+ZGF0YSB8PSBtYXNrOwotCWVsc2UKLQkJYmdjLT5kYXRhICY9IH5tYXNrOwotCi0JYmdjLT53cml0ZV9yZWcoYmdjLT5yZWdfZGF0LCBiZ2MtPmRhdGEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmdjLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJncGlvX3NldF93aXRoX2NsZWFyKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywKLQkJCQkgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjID0gdG9fYmdwaW9fY2hpcChnYyk7Ci0JdW5zaWduZWQgbG9uZyBtYXNrID0gYmdjLT5waW4ybWFzayhiZ2MsIGdwaW8pOwotCi0JaWYgKHZhbCkKLQkJYmdjLT53cml0ZV9yZWcoYmdjLT5yZWdfc2V0LCBtYXNrKTsKLQllbHNlCi0JCWJnYy0+d3JpdGVfcmVnKGJnYy0+cmVnX2NsciwgbWFzayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJncGlvX3NldF9zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQotewotCXN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MgPSB0b19iZ3Bpb19jaGlwKGdjKTsKLQl1bnNpZ25lZCBsb25nIG1hc2sgPSBiZ2MtPnBpbjJtYXNrKGJnYywgZ3Bpbyk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiZ2MtPmxvY2ssIGZsYWdzKTsKLQotCWlmICh2YWwpCi0JCWJnYy0+ZGF0YSB8PSBtYXNrOwotCWVsc2UKLQkJYmdjLT5kYXRhICY9IH5tYXNrOwotCi0JYmdjLT53cml0ZV9yZWcoYmdjLT5yZWdfc2V0LCBiZ2MtPmRhdGEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmdjLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgYmdwaW9fc2ltcGxlX2Rpcl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmdwaW9fc2ltcGxlX2Rpcl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLAotCQkJCWludCB2YWwpCi17Ci0JZ2MtPnNldChnYywgZ3BpbywgdmFsKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJncGlvX2Rpcl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCi17Ci0Jc3RydWN0IGJncGlvX2NoaXAgKmJnYyA9IHRvX2JncGlvX2NoaXAoZ2MpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmdjLT5sb2NrLCBmbGFncyk7Ci0KLQliZ2MtPmRpciAmPSB+YmdjLT5waW4ybWFzayhiZ2MsIGdwaW8pOwotCWJnYy0+d3JpdGVfcmVnKGJnYy0+cmVnX2RpciwgYmdjLT5kaXIpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmdjLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiZ3Bpb19kaXJfb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjID0gdG9fYmdwaW9fY2hpcChnYyk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWdjLT5zZXQoZ2MsIGdwaW8sIHZhbCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmdjLT5sb2NrLCBmbGFncyk7Ci0KLQliZ2MtPmRpciB8PSBiZ2MtPnBpbjJtYXNrKGJnYywgZ3Bpbyk7Ci0JYmdjLT53cml0ZV9yZWcoYmdjLT5yZWdfZGlyLCBiZ2MtPmRpcik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZ2MtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJncGlvX2Rpcl9pbl9pbnYoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQotewotCXN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MgPSB0b19iZ3Bpb19jaGlwKGdjKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJnYy0+bG9jaywgZmxhZ3MpOwotCi0JYmdjLT5kaXIgfD0gYmdjLT5waW4ybWFzayhiZ2MsIGdwaW8pOwotCWJnYy0+d3JpdGVfcmVnKGJnYy0+cmVnX2RpciwgYmdjLT5kaXIpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmdjLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiZ3Bpb19kaXJfb3V0X2ludihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWwpCi17Ci0Jc3RydWN0IGJncGlvX2NoaXAgKmJnYyA9IHRvX2JncGlvX2NoaXAoZ2MpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlnYy0+c2V0KGdjLCBncGlvLCB2YWwpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJnYy0+bG9jaywgZmxhZ3MpOwotCi0JYmdjLT5kaXIgJj0gfmJnYy0+cGluMm1hc2soYmdjLCBncGlvKTsKLQliZ2MtPndyaXRlX3JlZyhiZ2MtPnJlZ19kaXIsIGJnYy0+ZGlyKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJnYy0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmdwaW9fc2V0dXBfYWNjZXNzb3JzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGJncGlvX2NoaXAgKmJnYywKLQkJCQkgYm9vbCBiZSkKLXsKLQotCXN3aXRjaCAoYmdjLT5iaXRzKSB7Ci0JY2FzZSA4OgotCQliZ2MtPnJlYWRfcmVnCT0gYmdwaW9fcmVhZDg7Ci0JCWJnYy0+d3JpdGVfcmVnCT0gYmdwaW9fd3JpdGU4OwotCQlicmVhazsKLQljYXNlIDE2OgotCQliZ2MtPnJlYWRfcmVnCT0gYmdwaW9fcmVhZDE2OwotCQliZ2MtPndyaXRlX3JlZwk9IGJncGlvX3dyaXRlMTY7Ci0JCWJyZWFrOwotCWNhc2UgMzI6Ci0JCWJnYy0+cmVhZF9yZWcJPSBiZ3Bpb19yZWFkMzI7Ci0JCWJnYy0+d3JpdGVfcmVnCT0gYmdwaW9fd3JpdGUzMjsKLQkJYnJlYWs7Ci0jaWYgQklUU19QRVJfTE9ORyA+PSA2NAotCWNhc2UgNjQ6Ci0JCWJnYy0+cmVhZF9yZWcJPSBiZ3Bpb19yZWFkNjQ7Ci0JCWJnYy0+d3JpdGVfcmVnCT0gYmdwaW9fd3JpdGU2NDsKLQkJYnJlYWs7Ci0jZW5kaWYgLyogQklUU19QRVJfTE9ORyA+PSA2NCAqLwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LCAidW5zdXBwb3J0ZWQgZGF0YSB3aWR0aCAldSBiaXRzXG4iLCBiZ2MtPmJpdHMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQliZ2MtPnBpbjJtYXNrID0gYmUgPyBiZ3Bpb19waW4ybWFza19iZSA6IGJncGlvX3BpbjJtYXNrOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgdGhlIGRldmljZSBhbmQgYWxsb2NhdGUgdGhlIHJlc291cmNlcy4gIEZvciBzZXR0aW5nIEdQSU8ncyB0aGVyZSBhcmUKLSAqIHRocmVlIHN1cHBvcnRlZCBjb25maWd1cmF0aW9uczoKLSAqCi0gKgktIHNpbmdsZSBpbnB1dC9vdXRwdXQgcmVnaXN0ZXIgcmVzb3VyY2UgKG5hbWVkICJkYXQiKS4KLSAqCS0gc2V0L2NsZWFyIHBhaXIgKG5hbWVkICJzZXQiIGFuZCAiY2xyIikuCi0gKgktIHNpbmdsZSBvdXRwdXQgcmVnaXN0ZXIgcmVzb3VyY2UgYW5kIHNpbmdsZSBpbnB1dCByZXNvdXJjZSAoInNldCIgYW5kCi0gKglkYXQiKS4KLSAqCi0gKiBGb3IgdGhlIHNpbmdsZSBvdXRwdXQgcmVnaXN0ZXIsIHRoaXMgZHJpdmVzIGEgMSBieSBzZXR0aW5nIGEgYml0IGFuZCBhIHplcm8KLSAqIGJ5IGNsZWFyaW5nIGEgYml0LiAgRm9yIHRoZSBzZXQgY2xyIHBhaXIsIHRoaXMgZHJpdmVzIGEgMSBieSBzZXR0aW5nIGEgYml0Ci0gKiBpbiB0aGUgc2V0IHJlZ2lzdGVyIGFuZCBjbGVhcnMgaXQgYnkgc2V0dGluZyBhIGJpdCBpbiB0aGUgY2xlYXIgcmVnaXN0ZXIuCi0gKiBUaGUgY29uZmlndXJhdGlvbiBpcyBkZXRlY3RlZCBieSB3aGljaCByZXNvdXJjZXMgYXJlIHByZXNlbnQuCi0gKgotICogRm9yIHNldHRpbmcgdGhlIEdQSU8gZGlyZWN0aW9uLCB0aGVyZSBhcmUgdGhyZWUgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zOgotICoKLSAqCS0gc2ltcGxlIGJpZGlyZWN0aW9uIEdQSU8gdGhhdCByZXF1aXJlcyBubyBjb25maWd1cmF0aW9uLgotICoJLSBhbiBvdXRwdXQgZGlyZWN0aW9uIHJlZ2lzdGVyIChuYW1lZCAiZGlyb3V0Iikgd2hlcmUgYSAxIGJpdAotICoJaW5kaWNhdGVzIHRoZSBHUElPIGlzIGFuIG91dHB1dC4KLSAqCS0gYW4gaW5wdXQgZGlyZWN0aW9uIHJlZ2lzdGVyIChuYW1lZCAiZGlyaW4iKSB3aGVyZSBhIDEgYml0IGluZGljYXRlcwotICoJdGhlIEdQSU8gaXMgYW4gaW5wdXQuCi0gKi8KLXN0YXRpYyBpbnQgYmdwaW9fc2V0dXBfaW8oc3RydWN0IGJncGlvX2NoaXAgKmJnYywKLQkJCSAgdm9pZCBfX2lvbWVtICpkYXQsCi0JCQkgIHZvaWQgX19pb21lbSAqc2V0LAotCQkJICB2b2lkIF9faW9tZW0gKmNscikKLXsKLQotCWJnYy0+cmVnX2RhdCA9IGRhdDsKLQlpZiAoIWJnYy0+cmVnX2RhdCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoc2V0ICYmIGNscikgewotCQliZ2MtPnJlZ19zZXQgPSBzZXQ7Ci0JCWJnYy0+cmVnX2NsciA9IGNscjsKLQkJYmdjLT5nYy5zZXQgPSBiZ3Bpb19zZXRfd2l0aF9jbGVhcjsKLQl9IGVsc2UgaWYgKHNldCAmJiAhY2xyKSB7Ci0JCWJnYy0+cmVnX3NldCA9IHNldDsKLQkJYmdjLT5nYy5zZXQgPSBiZ3Bpb19zZXRfc2V0OwotCX0gZWxzZSB7Ci0JCWJnYy0+Z2Muc2V0ID0gYmdwaW9fc2V0OwotCX0KLQotCWJnYy0+Z2MuZ2V0ID0gYmdwaW9fZ2V0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmdwaW9fc2V0dXBfZGlyZWN0aW9uKHN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MsCi0JCQkJIHZvaWQgX19pb21lbSAqZGlyb3V0LAotCQkJCSB2b2lkIF9faW9tZW0gKmRpcmluKQotewotCWlmIChkaXJvdXQgJiYgZGlyaW4pIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIGlmIChkaXJvdXQpIHsKLQkJYmdjLT5yZWdfZGlyID0gZGlyb3V0OwotCQliZ2MtPmdjLmRpcmVjdGlvbl9vdXRwdXQgPSBiZ3Bpb19kaXJfb3V0OwotCQliZ2MtPmdjLmRpcmVjdGlvbl9pbnB1dCA9IGJncGlvX2Rpcl9pbjsKLQl9IGVsc2UgaWYgKGRpcmluKSB7Ci0JCWJnYy0+cmVnX2RpciA9IGRpcmluOwotCQliZ2MtPmdjLmRpcmVjdGlvbl9vdXRwdXQgPSBiZ3Bpb19kaXJfb3V0X2ludjsKLQkJYmdjLT5nYy5kaXJlY3Rpb25faW5wdXQgPSBiZ3Bpb19kaXJfaW5faW52OwotCX0gZWxzZSB7Ci0JCWJnYy0+Z2MuZGlyZWN0aW9uX291dHB1dCA9IGJncGlvX3NpbXBsZV9kaXJfb3V0OwotCQliZ2MtPmdjLmRpcmVjdGlvbl9pbnB1dCA9IGJncGlvX3NpbXBsZV9kaXJfaW47Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBfX2RldmV4aXQgYmdwaW9fcmVtb3ZlKHN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MpCi17Ci0JaW50IGVyciA9IGdwaW9jaGlwX3JlbW92ZSgmYmdjLT5nYyk7Ci0KLQlrZnJlZShiZ2MpOwotCi0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGJncGlvX3JlbW92ZSk7Ci0KLWludCBfX2RldmluaXQgYmdwaW9faW5pdChzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjLAotCQkJIHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSB1bnNpZ25lZCBsb25nIHN6LAotCQkJIHZvaWQgX19pb21lbSAqZGF0LAotCQkJIHZvaWQgX19pb21lbSAqc2V0LAotCQkJIHZvaWQgX19pb21lbSAqY2xyLAotCQkJIHZvaWQgX19pb21lbSAqZGlyb3V0LAotCQkJIHZvaWQgX19pb21lbSAqZGlyaW4sCi0JCQkgYm9vbCBiaWdfZW5kaWFuKQotewotCWludCByZXQ7Ci0KLQlpZiAoIWlzX3Bvd2VyX29mXzIoc3opKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJnYy0+Yml0cyA9IHN6ICogODsKLQlpZiAoYmdjLT5iaXRzID4gQklUU19QRVJfTE9ORykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzcGluX2xvY2tfaW5pdCgmYmdjLT5sb2NrKTsKLQliZ2MtPmdjLmRldiA9IGRldjsKLQliZ2MtPmdjLmxhYmVsID0gZGV2X25hbWUoZGV2KTsKLQliZ2MtPmdjLmJhc2UgPSAtMTsKLQliZ2MtPmdjLm5ncGlvID0gYmdjLT5iaXRzOwotCi0JcmV0ID0gYmdwaW9fc2V0dXBfaW8oYmdjLCBkYXQsIHNldCwgY2xyKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gYmdwaW9fc2V0dXBfYWNjZXNzb3JzKGRldiwgYmdjLCBiaWdfZW5kaWFuKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gYmdwaW9fc2V0dXBfZGlyZWN0aW9uKGJnYywgZGlyb3V0LCBkaXJpbik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWJnYy0+ZGF0YSA9IGJnYy0+cmVhZF9yZWcoYmdjLT5yZWdfZGF0KTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChiZ3Bpb19pbml0KTsKLQotI2lmZGVmIENPTkZJR19HUElPX0JBU0lDX01NSU8KLQotc3RhdGljIHZvaWQgX19pb21lbSAqYmdwaW9fbWFwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgICAgICByZXNvdXJjZV9zaXplX3Qgc2FuZV9zeiwKLQkJCSAgICAgICBpbnQgKmVycikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCByZXNvdXJjZSAqcjsKLQlyZXNvdXJjZV9zaXplX3Qgc3RhcnQ7Ci0JcmVzb3VyY2Vfc2l6ZV90IHN6OwotCXZvaWQgX19pb21lbSAqcmV0OwotCi0JKmVyciA9IDA7Ci0KLQlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgbmFtZSk7Ci0JaWYgKCFyKQotCQlyZXR1cm4gTlVMTDsKLQotCXN6ID0gcmVzb3VyY2Vfc2l6ZShyKTsKLQlpZiAoc3ogIT0gc2FuZV9zeikgewotCQkqZXJyID0gLUVJTlZBTDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc3RhcnQgPSByLT5zdGFydDsKLQlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKGRldiwgc3RhcnQsIHN6LCByLT5uYW1lKSkgewotCQkqZXJyID0gLUVCVVNZOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXQgPSBkZXZtX2lvcmVtYXAoZGV2LCBzdGFydCwgc3opOwotCWlmICghcmV0KSB7Ci0JCSplcnIgPSAtRU5PTUVNOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBiZ3Bpb19wZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnI7Ci0Jdm9pZCBfX2lvbWVtICpkYXQ7Ci0Jdm9pZCBfX2lvbWVtICpzZXQ7Ci0Jdm9pZCBfX2lvbWVtICpjbHI7Ci0Jdm9pZCBfX2lvbWVtICpkaXJvdXQ7Ci0Jdm9pZCBfX2lvbWVtICpkaXJpbjsKLQl1bnNpZ25lZCBsb25nIHN6OwotCWJvb2wgYmU7Ci0JaW50IGVycjsKLQlzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjOwotCXN0cnVjdCBiZ3Bpb19wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7Ci0KLQlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImRhdCIpOwotCWlmICghcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzeiA9IHJlc291cmNlX3NpemUocik7Ci0KLQlkYXQgPSBiZ3Bpb19tYXAocGRldiwgImRhdCIsIHN6LCAmZXJyKTsKLQlpZiAoIWRhdCkKLQkJcmV0dXJuIGVyciA/IGVyciA6IC1FSU5WQUw7Ci0KLQlzZXQgPSBiZ3Bpb19tYXAocGRldiwgInNldCIsIHN6LCAmZXJyKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JY2xyID0gYmdwaW9fbWFwKHBkZXYsICJjbHIiLCBzeiwgJmVycik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWRpcm91dCA9IGJncGlvX21hcChwZGV2LCAiZGlyb3V0Iiwgc3osICZlcnIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlkaXJpbiA9IGJncGlvX21hcChwZGV2LCAiZGlyaW4iLCBzeiwgJmVycik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWJlID0gIXN0cmNtcChwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpLT5uYW1lLCAiYmFzaWMtbW1pby1ncGlvLWJlIik7Ci0KLQliZ2MgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpiZ2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJnYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnIgPSBiZ3Bpb19pbml0KGJnYywgZGV2LCBzeiwgZGF0LCBzZXQsIGNsciwgZGlyb3V0LCBkaXJpbiwgYmUpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAocGRhdGEpIHsKLQkJYmdjLT5nYy5iYXNlID0gcGRhdGEtPmJhc2U7Ci0JCWlmIChwZGF0YS0+bmdwaW8gPiAwKQotCQkJYmdjLT5nYy5uZ3BpbyA9IHBkYXRhLT5uZ3BpbzsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBiZ2MpOwotCi0JcmV0dXJuIGdwaW9jaGlwX2FkZCgmYmdjLT5nYyk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IGJncGlvX3BkZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGJncGlvX2NoaXAgKmJnYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JcmV0dXJuIGJncGlvX3JlbW92ZShiZ2MpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBiZ3Bpb19pZF90YWJsZVtdID0gewotCXsgImJhc2ljLW1taW8tZ3BpbyIsIH0sCi0JeyAiYmFzaWMtbW1pby1ncGlvLWJlIiwgfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBiZ3Bpb19pZF90YWJsZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJncGlvX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJiYXNpYy1tbWlvLWdwaW8iLAotCX0sCi0JLmlkX3RhYmxlID0gYmdwaW9faWRfdGFibGUsCi0JLnByb2JlID0gYmdwaW9fcGRldl9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoYmdwaW9fcGRldl9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYmdwaW9fcGxhdGZvcm1faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmJncGlvX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChiZ3Bpb19wbGF0Zm9ybV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGJncGlvX3BsYXRmb3JtX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYmdwaW9fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGJncGlvX3BsYXRmb3JtX2V4aXQpOwotCi0jZW5kaWYgLyogQ09ORklHX0dQSU9fQkFTSUNfTU1JTyAqLwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgYmFzaWMgbWVtb3J5LW1hcHBlZCBHUElPIGNvbnRyb2xsZXJzIik7Ci1NT0RVTEVfQVVUSE9SKCJBbnRvbiBWb3JvbnRzb3YgPGNib3VhdG1haWxydUBnbWFpbC5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vYnQ4eHhncGlvLmMgYi9kcml2ZXJzL2dwaW8vYnQ4eHhncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNGYwOWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL2J0OHh4Z3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qCi0KLSAgICBidDh4eCBHUElPIGFidXNlcgotCi0gICAgQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+Ci0KLSAgICBQbGVhc2UgZG8gX29ubHlfIGNvbnRhY3QgdGhlIHBlb3BsZSBsaXN0ZWQgX2Fib3ZlXyB3aXRoIGlzc3VlcyByZWxhdGVkIHRvIHRoaXMgZHJpdmVyLgotICAgIEFsbCB0aGUgb3RoZXIgcGVvcGxlIGxpc3RlZCBiZWxvdyBhcmUgbm90IHJlbGF0ZWQgdG8gdGhpcyBkcml2ZXIuIFRoZWlyIG5hbWVzCi0gICAgYXJlIG9ubHkgaGVyZSwgYmVjYXVzZSB0aGlzIGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIGJ0ODQ4IGRyaXZlci4KLQotCi0gICAgRGVyaXZlZCBmcm9tIHRoZSBidDg0OCBkcml2ZXI6Ci0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIKLQkJCSAgICYgTWFyY3VzIE1ldHpsZXIKLSAgICAoYykgMTk5OS0yMDAyIEdlcmQgS25vcnIKLQotICAgIHNvbWUgdjRsMiBjb2RlIGxpbmVzIGFyZSB0YWtlbiBmcm9tIEp1c3RpbidzIGJ0dHYyIGRyaXZlciB3aGljaCBpcwotICAgIChjKSAyMDAwIEp1c3RpbiBTY2hvZW1hbgotCi0gICAgVjRMMSByZW1vdmFsIGZyb206Ci0gICAgKGMpIDIwMDUtMjAwNiBOaWNrb2xheSBWLiBTaG15cmV2Ci0KLSAgICBGaXhlcyB0byBiZSBmdWxseSBWNEwyIGNvbXBsaWFudCBieQotICAgIChjKSAyMDA2IE1hdXJvIENhcnZhbGhvIENoZWhhYgotCi0gICAgQ3JvcHBpbmcgYW5kIG92ZXJzY2FuIHN1cHBvcnQKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTWljaGFlbCBILiBTY2hpbWVrCi0gICAgU3BvbnNvcmVkIGJ5IE9QUSBTeXN0ZW1zIEFCCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLS8qIFN0ZWFsIHRoZSBoYXJkd2FyZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBidHR2IGRyaXZlci4gKi8KLSNpbmNsdWRlICIuLi9tZWRpYS92aWRlby9idDh4eC9idDg0OC5oIgotCi0KLSNkZWZpbmUgQlQ4WFhHUElPX05SX0dQSU9TCQkyNCAvKiBXZSBoYXZlIDI0IEdQSU8gcGlucyAqLwotCi0KLXN0cnVjdCBidDh4eGdwaW8gewotCXNwaW5sb2NrX3QgbG9jazsKLQotCXZvaWQgX19pb21lbSAqbW1pbzsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW87Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQl1MzIgc2F2ZWRfb3V0ZW47Ci0JdTMyIHNhdmVkX2RhdGE7Ci0jZW5kaWYKLX07Ci0KLSNkZWZpbmUgYmd3cml0ZShkYXQsIGFkcikJd3JpdGVsKChkYXQpLCBiZy0+bW1pbysoYWRyKSkKLSNkZWZpbmUgYmdyZWFkKGFkcikJCXJlYWRsKGJnLT5tbWlvKyhhZHIpKQotCi0KLXN0YXRpYyBpbnQgbW9kcGFyYW1fZ3Bpb2Jhc2UgPSAtMS8qIGR5bmFtaWMgKi87Ci1tb2R1bGVfcGFyYW1fbmFtZWQoZ3Bpb2Jhc2UsIG1vZHBhcmFtX2dwaW9iYXNlLCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhncGlvYmFzZSwgIlRoZSBHUElPIG51bWJlciBiYXNlLiAtMSBtZWFucyBkeW5hbWljLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4iKTsKLQotCi1zdGF0aWMgaW50IGJ0OHh4Z3Bpb19ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1bnNpZ25lZCBucikKLXsKLQlzdHJ1Y3QgYnQ4eHhncGlvICpiZyA9IGNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgYnQ4eHhncGlvLCBncGlvKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBvdXRlbiwgZGF0YTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiZy0+bG9jaywgZmxhZ3MpOwotCi0JZGF0YSA9IGJncmVhZChCVDg0OF9HUElPX0RBVEEpOwotCWRhdGEgJj0gfigxIDw8IG5yKTsKLQliZ3dyaXRlKGRhdGEsIEJUODQ4X0dQSU9fREFUQSk7Ci0KLQlvdXRlbiA9IGJncmVhZChCVDg0OF9HUElPX09VVF9FTik7Ci0Jb3V0ZW4gJj0gfigxIDw8IG5yKTsKLQliZ3dyaXRlKG91dGVuLCBCVDg0OF9HUElPX09VVF9FTik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZy0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYnQ4eHhncGlvX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2lnbmVkIG5yKQotewotCXN0cnVjdCBidDh4eGdwaW8gKmJnID0gY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCBidDh4eGdwaW8sIGdwaW8pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHZhbDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiZy0+bG9jaywgZmxhZ3MpOwotCXZhbCA9IGJncmVhZChCVDg0OF9HUElPX0RBVEEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJnLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gISEodmFsICYgKDEgPDwgbnIpKTsKLX0KLQotc3RhdGljIGludCBidDh4eGdwaW9fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sCi0JCQkJCXVuc2lnbmVkIG5yLCBpbnQgdmFsKQotewotCXN0cnVjdCBidDh4eGdwaW8gKmJnID0gY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCBidDh4eGdwaW8sIGdwaW8pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIG91dGVuLCBkYXRhOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJnLT5sb2NrLCBmbGFncyk7Ci0KLQlvdXRlbiA9IGJncmVhZChCVDg0OF9HUElPX09VVF9FTik7Ci0Jb3V0ZW4gfD0gKDEgPDwgbnIpOwotCWJnd3JpdGUob3V0ZW4sIEJUODQ4X0dQSU9fT1VUX0VOKTsKLQotCWRhdGEgPSBiZ3JlYWQoQlQ4NDhfR1BJT19EQVRBKTsKLQlpZiAodmFsKQotCQlkYXRhIHw9ICgxIDw8IG5yKTsKLQllbHNlCi0JCWRhdGEgJj0gfigxIDw8IG5yKTsKLQliZ3dyaXRlKGRhdGEsIEJUODQ4X0dQSU9fREFUQSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZy0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0OHh4Z3Bpb19ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLAotCQkJICAgIHVuc2lnbmVkIG5yLCBpbnQgdmFsKQotewotCXN0cnVjdCBidDh4eGdwaW8gKmJnID0gY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCBidDh4eGdwaW8sIGdwaW8pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGRhdGE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmctPmxvY2ssIGZsYWdzKTsKLQotCWRhdGEgPSBiZ3JlYWQoQlQ4NDhfR1BJT19EQVRBKTsKLQlpZiAodmFsKQotCQlkYXRhIHw9ICgxIDw8IG5yKTsKLQllbHNlCi0JCWRhdGEgJj0gfigxIDw8IG5yKTsKLQliZ3dyaXRlKGRhdGEsIEJUODQ4X0dQSU9fREFUQSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZy0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBidDh4eGdwaW9fZ3Bpb19zZXR1cChzdHJ1Y3QgYnQ4eHhncGlvICpiZykKLXsKLQlzdHJ1Y3QgZ3Bpb19jaGlwICpjID0gJmJnLT5ncGlvOwotCi0JYy0+bGFiZWwgPSBkZXZfbmFtZSgmYmctPnBkZXYtPmRldik7Ci0JYy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQljLT5kaXJlY3Rpb25faW5wdXQgPSBidDh4eGdwaW9fZ3Bpb19kaXJlY3Rpb25faW5wdXQ7Ci0JYy0+Z2V0ID0gYnQ4eHhncGlvX2dwaW9fZ2V0OwotCWMtPmRpcmVjdGlvbl9vdXRwdXQgPSBidDh4eGdwaW9fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OwotCWMtPnNldCA9IGJ0OHh4Z3Bpb19ncGlvX3NldDsKLQljLT5kYmdfc2hvdyA9IE5VTEw7Ci0JYy0+YmFzZSA9IG1vZHBhcmFtX2dwaW9iYXNlOwotCWMtPm5ncGlvID0gQlQ4WFhHUElPX05SX0dQSU9TOwotCWMtPmNhbl9zbGVlcCA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgYnQ4eHhncGlvX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCi0JCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQotewotCXN0cnVjdCBidDh4eGdwaW8gKmJnOwotCWludCBlcnI7Ci0KLQliZyA9IGt6YWxsb2Moc2l6ZW9mKCpiZyksIEdGUF9LRVJORUwpOwotCWlmICghYmcpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYmctPnBkZXYgPSBkZXY7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJnLT5sb2NrKTsKLQotCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgImJ0OHh4Z3BpbzogQ2FuJ3QgZW5hYmxlIGRldmljZS5cbiIpOwotCQlnb3RvIGVycl9mcmVlYmc7Ci0JfQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAotCQkJCXBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSwKLQkJCQkiYnQ4eHhncGlvIikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnQ4eHhncGlvOiBDYW4ndCByZXF1ZXN0IGlvbWVtICgweCVsbHgpLlxuIiwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCkpOwotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyX2Rpc2FibGU7Ci0JfQotCXBjaV9zZXRfbWFzdGVyKGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKGRldiwgYmcpOwotCi0JYmctPm1taW8gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLCAweDEwMDApOwotCWlmICghYmctPm1taW8pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidDh4eGdwaW86IGlvcmVtYXAoKSBmYWlsZWRcbiIpOwotCQllcnIgPSAtRUlPOwotCQlnb3RvIGVycl9yZWxlYXNlX21lbTsKLQl9Ci0KLQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLQliZ3dyaXRlKDAsIEJUODQ4X0lOVF9NQVNLKTsKLQotCS8qIGdwaW8gaW5pdCAqLwotCWJnd3JpdGUoMCwgQlQ4NDhfR1BJT19ETUFfQ1RMKTsKLQliZ3dyaXRlKDAsIEJUODQ4X0dQSU9fUkVHX0lOUCk7Ci0JYmd3cml0ZSgwLCBCVDg0OF9HUElPX09VVF9FTik7Ci0KLQlidDh4eGdwaW9fZ3Bpb19zZXR1cChiZyk7Ci0JZXJyID0gZ3Bpb2NoaXBfYWRkKCZiZy0+Z3Bpbyk7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgImJ0OHh4Z3BpbzogRmFpbGVkIHRvIHJlZ2lzdGVyIEdQSU9zXG4iKTsKLQkJZ290byBlcnJfcmVsZWFzZV9tZW07Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiYnQ4eHhncGlvOiBBYnVzaW5nIEJUOHh4IGNhcmQgZm9yIEdQSU9zICVkIHRvICVkXG4iLAotCSAgICAgICBiZy0+Z3Bpby5iYXNlLCBiZy0+Z3Bpby5iYXNlICsgQlQ4WFhHUElPX05SX0dQSU9TIC0gMSk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3JlbGVhc2VfbWVtOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwKLQkJCSAgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSk7Ci0JcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Ci1lcnJfZGlzYWJsZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKLWVycl9mcmVlYmc6Ci0Ja2ZyZWUoYmcpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgYnQ4eHhncGlvX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgYnQ4eHhncGlvICpiZyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWdwaW9jaGlwX3JlbW92ZSgmYmctPmdwaW8pOwotCi0JYmd3cml0ZSgwLCBCVDg0OF9JTlRfTUFTSyk7Ci0JYmd3cml0ZSh+MHgwLCBCVDg0OF9JTlRfU1RBVCk7Ci0JYmd3cml0ZSgweDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsKLQotCWlvdW5tYXAoYmctPm1taW8pOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0Ja2ZyZWUoYmcpOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGJ0OHh4Z3Bpb19zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IGJ0OHh4Z3BpbyAqYmcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiZy0+bG9jaywgZmxhZ3MpOwotCi0JYmctPnNhdmVkX291dGVuID0gYmdyZWFkKEJUODQ4X0dQSU9fT1VUX0VOKTsKLQliZy0+c2F2ZWRfZGF0YSA9IGJncmVhZChCVDg0OF9HUElPX0RBVEEpOwotCi0JYmd3cml0ZSgwLCBCVDg0OF9JTlRfTUFTSyk7Ci0JYmd3cml0ZSh+MHgwLCBCVDg0OF9JTlRfU1RBVCk7Ci0JYmd3cml0ZSgweDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJnLT5sb2NrLCBmbGFncyk7Ci0KLQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBidDh4eGdwaW9fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBidDh4eGdwaW8gKmJnID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVycjsKLQotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7Ci0JZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiZy0+bG9jaywgZmxhZ3MpOwotCi0JYmd3cml0ZSgwLCBCVDg0OF9JTlRfTUFTSyk7Ci0JYmd3cml0ZSgwLCBCVDg0OF9HUElPX0RNQV9DVEwpOwotCWJnd3JpdGUoMCwgQlQ4NDhfR1BJT19SRUdfSU5QKTsKLQliZ3dyaXRlKGJnLT5zYXZlZF9vdXRlbiwgQlQ4NDhfR1BJT19PVVRfRU4pOwotCWJnd3JpdGUoYmctPnNhdmVkX2RhdGEgJiBiZy0+c2F2ZWRfb3V0ZW4sCi0JCUJUODQ4X0dQSU9fREFUQSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZy0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZWxzZQotI2RlZmluZSBidDh4eGdwaW9fc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGJ0OHh4Z3Bpb19yZXN1bWUgTlVMTAotI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYnQ4eHhncGlvX3BjaV90YmxbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9PS1RSRUUsIFBDSV9ERVZJQ0VfSURfQlQ4NDgpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPT0tUUkVFLCBQQ0lfREVWSUNFX0lEX0JUODQ5KSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST09LVFJFRSwgUENJX0RFVklDRV9JRF9CVDg3OCkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9PS1RSRUUsIFBDSV9ERVZJQ0VfSURfQlQ4NzkpIH0sCi0JeyAwLCB9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBidDh4eGdwaW9fcGNpX3RibCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBidDh4eGdwaW9fcGNpX2RyaXZlciA9IHsKLQkubmFtZQkJPSAiYnQ4eHhncGlvIiwKLQkuaWRfdGFibGUJPSBidDh4eGdwaW9fcGNpX3RibCwKLQkucHJvYmUJCT0gYnQ4eHhncGlvX3Byb2JlLAotCS5yZW1vdmUJCT0gYnQ4eHhncGlvX3JlbW92ZSwKLQkuc3VzcGVuZAk9IGJ0OHh4Z3Bpb19zdXNwZW5kLAotCS5yZXN1bWUJCT0gYnQ4eHhncGlvX3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJ0OHh4Z3Bpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJ0OHh4Z3Bpb19wY2lfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KGJ0OHh4Z3Bpb19pbml0KQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYnQ4eHhncGlvX2V4aXQodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmJ0OHh4Z3Bpb19wY2lfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGJ0OHh4Z3Bpb19leGl0KQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEJ1ZXNjaCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBYnVzZSBhIEJUOHh4IGZyYW1lZ3JhYmJlciBjYXJkIGFzIGdlbmVyaWMgR1BJTyBjYXJkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby03NHgxNjQuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLTc0eDE2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTI1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby03NHgxNjQuYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqICA3NEh4MTY0IC0gR2VuZXJpYyBzZXJpYWwtaW4vcGFyYWxsZWwtb3V0IDgtYml0cyBzaGlmdCByZWdpc3RlciBHUElPIGRyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgR2Fib3IgSnVob3MgPGp1aG9zZ0BvcGVud3J0Lm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTWlndWVsIEdhaW8gPG1pZ3VlbC5nYWlvQGVmaXhvLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpLzc0eDE2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKK3N0cnVjdCBnZW5fNzR4MTY0X2NoaXAgeworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CisJc3RydWN0IGdwaW9fY2hpcAlncGlvX2NoaXA7CisJc3RydWN0IG11dGV4CQlsb2NrOworCXU4CQkJcG9ydF9jb25maWc7Cit9OworCitzdGF0aWMgc3RydWN0IGdlbl83NHgxNjRfY2hpcCAqZ3Bpb190b183NHgxNjRfY2hpcChzdHJ1Y3QgZ3Bpb19jaGlwICpnYykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgZ2VuXzc0eDE2NF9jaGlwLCBncGlvX2NoaXApOworfQorCitzdGF0aWMgaW50IF9fZ2VuXzc0eDE2NF93cml0ZV9jb25maWcoc3RydWN0IGdlbl83NHgxNjRfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gc3BpX3dyaXRlKGNoaXAtPnNwaSwKKwkJCSAmY2hpcC0+cG9ydF9jb25maWcsIHNpemVvZihjaGlwLT5wb3J0X2NvbmZpZykpOworfQorCitzdGF0aWMgaW50IGdlbl83NHgxNjRfZ2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGdlbl83NHgxNjRfY2hpcCAqY2hpcCA9IGdwaW9fdG9fNzR4MTY0X2NoaXAoZ2MpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKwlyZXQgPSAoY2hpcC0+cG9ydF9jb25maWcgPj4gb2Zmc2V0KSAmIDB4MTsKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2VuXzc0eDE2NF9zZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCisJCXVuc2lnbmVkIG9mZnNldCwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgZ2VuXzc0eDE2NF9jaGlwICpjaGlwID0gZ3Bpb190b183NHgxNjRfY2hpcChnYyk7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKwlpZiAodmFsKQorCQljaGlwLT5wb3J0X2NvbmZpZyB8PSAoMSA8PCBvZmZzZXQpOworCWVsc2UKKwkJY2hpcC0+cG9ydF9jb25maWcgJj0gfigxIDw8IG9mZnNldCk7CisKKwlfX2dlbl83NHgxNjRfd3JpdGVfY29uZmlnKGNoaXApOworCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZ2VuXzc0eDE2NF9kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLAorCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWwpCit7CisJZ2VuXzc0eDE2NF9zZXRfdmFsdWUoZ2MsIG9mZnNldCwgdmFsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZ2VuXzc0eDE2NF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBnZW5fNzR4MTY0X2NoaXAgKmNoaXA7CisJc3RydWN0IGdlbl83NHgxNjRfY2hpcF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlpbnQgcmV0OworCisJcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEgfHwgIXBkYXRhLT5iYXNlKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAiaW5jb3JyZWN0IG9yIG1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogYml0c19wZXJfd29yZCBjYW5ub3QgYmUgY29uZmlndXJlZCBpbiBwbGF0Zm9ybSBkYXRhCisJICovCisJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKworCXJldCA9IHNwaV9zZXR1cChzcGkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGlwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJmNoaXAtPmxvY2spOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgY2hpcCk7CisKKwljaGlwLT5zcGkgPSBzcGk7CisKKwljaGlwLT5ncGlvX2NoaXAubGFiZWwgPSBzcGktPm1vZGFsaWFzOworCWNoaXAtPmdwaW9fY2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gZ2VuXzc0eDE2NF9kaXJlY3Rpb25fb3V0cHV0OworCWNoaXAtPmdwaW9fY2hpcC5nZXQgPSBnZW5fNzR4MTY0X2dldF92YWx1ZTsKKwljaGlwLT5ncGlvX2NoaXAuc2V0ID0gZ2VuXzc0eDE2NF9zZXRfdmFsdWU7CisJY2hpcC0+Z3Bpb19jaGlwLmJhc2UgPSBwZGF0YS0+YmFzZTsKKwljaGlwLT5ncGlvX2NoaXAubmdwaW8gPSA4OworCWNoaXAtPmdwaW9fY2hpcC5jYW5fc2xlZXAgPSAxOworCWNoaXAtPmdwaW9fY2hpcC5kZXYgPSAmc3BpLT5kZXY7CisJY2hpcC0+Z3Bpb19jaGlwLm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlyZXQgPSBfX2dlbl83NHgxNjRfd3JpdGVfY29uZmlnKGNoaXApOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgd3JpdGluZzogJWRcbiIsIHJldCk7CisJCWdvdG8gZXhpdF9kZXN0cm95OworCX0KKworCXJldCA9IGdwaW9jaGlwX2FkZCgmY2hpcC0+Z3Bpb19jaGlwKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfZGVzdHJveTsKKworCXJldHVybiByZXQ7CisKK2V4aXRfZGVzdHJveToKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBOVUxMKTsKKwltdXRleF9kZXN0cm95KCZjaGlwLT5sb2NrKTsKKwlrZnJlZShjaGlwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBnZW5fNzR4MTY0X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBnZW5fNzR4MTY0X2NoaXAgKmNoaXA7CisJaW50IHJldDsKKworCWNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIE5VTEwpOworCisJcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZjaGlwLT5ncGlvX2NoaXApOworCWlmICghcmV0KSB7CisJCW11dGV4X2Rlc3Ryb3koJmNoaXAtPmxvY2spOworCQlrZnJlZShjaGlwKTsKKwl9IGVsc2UKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gcmVtb3ZlIHRoZSBHUElPIGNvbnRyb2xsZXI6ICVkXG4iLAorCQkJCXJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgZ2VuXzc0eDE2NF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gIjc0eDE2NCIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBnZW5fNzR4MTY0X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZ2VuXzc0eDE2NF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2VuXzc0eDE2NF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmdlbl83NHgxNjRfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChnZW5fNzR4MTY0X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2VuXzc0eDE2NF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZnZW5fNzR4MTY0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChnZW5fNzR4MTY0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJHYWJvciBKdWhvcyA8anVob3NnQG9wZW53cnQub3JnPiIpOworTU9EVUxFX0FVVEhPUigiTWlndWVsIEdhaW8gPG1pZ3VlbC5nYWlvQGVmaXhvLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR1BJTyBleHBhbmRlciBkcml2ZXIgZm9yIDc0WDE2NCA4LWJpdHMgc2hpZnQgcmVnaXN0ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWFiODUwMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tYWI4NTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3OTVlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWFiODUwMC5jCkBAIC0wLDAgKzEsNTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDExCisgKgorICogQXV0aG9yOiBCSUJFSyBCQVNVIDxiaWJlay5iYXN1QHN0ZXJpY3Nzb24uY29tPgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FiODUwMC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWI4NTAwL2dwaW8uaD4KKworLyoKKyAqIEdQSU8gcmVnaXN0ZXJzIG9mZnNldAorICogQmFuazogMHgxMAorICovCisjZGVmaW5lIEFCODUwMF9HUElPX1NFTDFfUkVHCTB4MDAKKyNkZWZpbmUgQUI4NTAwX0dQSU9fU0VMMl9SRUcJMHgwMQorI2RlZmluZSBBQjg1MDBfR1BJT19TRUwzX1JFRwkweDAyCisjZGVmaW5lIEFCODUwMF9HUElPX1NFTDRfUkVHCTB4MDMKKyNkZWZpbmUgQUI4NTAwX0dQSU9fU0VMNV9SRUcJMHgwNAorI2RlZmluZSBBQjg1MDBfR1BJT19TRUw2X1JFRwkweDA1CisKKyNkZWZpbmUgQUI4NTAwX0dQSU9fRElSMV9SRUcJMHgxMAorI2RlZmluZSBBQjg1MDBfR1BJT19ESVIyX1JFRwkweDExCisjZGVmaW5lIEFCODUwMF9HUElPX0RJUjNfUkVHCTB4MTIKKyNkZWZpbmUgQUI4NTAwX0dQSU9fRElSNF9SRUcJMHgxMworI2RlZmluZSBBQjg1MDBfR1BJT19ESVI1X1JFRwkweDE0CisjZGVmaW5lIEFCODUwMF9HUElPX0RJUjZfUkVHCTB4MTUKKworI2RlZmluZSBBQjg1MDBfR1BJT19PVVQxX1JFRwkweDIwCisjZGVmaW5lIEFCODUwMF9HUElPX09VVDJfUkVHCTB4MjEKKyNkZWZpbmUgQUI4NTAwX0dQSU9fT1VUM19SRUcJMHgyMgorI2RlZmluZSBBQjg1MDBfR1BJT19PVVQ0X1JFRwkweDIzCisjZGVmaW5lIEFCODUwMF9HUElPX09VVDVfUkVHCTB4MjQKKyNkZWZpbmUgQUI4NTAwX0dQSU9fT1VUNl9SRUcJMHgyNQorCisjZGVmaW5lIEFCODUwMF9HUElPX1BVRDFfUkVHCTB4MzAKKyNkZWZpbmUgQUI4NTAwX0dQSU9fUFVEMl9SRUcJMHgzMQorI2RlZmluZSBBQjg1MDBfR1BJT19QVUQzX1JFRwkweDMyCisjZGVmaW5lIEFCODUwMF9HUElPX1BVRDRfUkVHCTB4MzMKKyNkZWZpbmUgQUI4NTAwX0dQSU9fUFVENV9SRUcJMHgzNAorI2RlZmluZSBBQjg1MDBfR1BJT19QVUQ2X1JFRwkweDM1CisKKyNkZWZpbmUgQUI4NTAwX0dQSU9fSU4xX1JFRwkweDQwCisjZGVmaW5lIEFCODUwMF9HUElPX0lOMl9SRUcJMHg0MQorI2RlZmluZSBBQjg1MDBfR1BJT19JTjNfUkVHCTB4NDIKKyNkZWZpbmUgQUI4NTAwX0dQSU9fSU40X1JFRwkweDQzCisjZGVmaW5lIEFCODUwMF9HUElPX0lONV9SRUcJMHg0NAorI2RlZmluZSBBQjg1MDBfR1BJT19JTjZfUkVHCTB4NDUKKyNkZWZpbmUgQUI4NTAwX0dQSU9fQUxURlVOX1JFRwkweDQ1CisjZGVmaW5lIEFMVEZVTl9SRUdfSU5ERVgJNgorI2RlZmluZSBBQjg1MDBfTlVNX0dQSU8JCTQyCisjZGVmaW5lIEFCODUwMF9OVU1fVklSX0dQSU9fSVJRCTE2CisKK2VudW0gYWI4NTAwX2dwaW9fYWN0aW9uIHsKKwlOT05FLAorCVNUQVJUVVAsCisJU0hVVERPV04sCisJTUFTSywKKwlVTk1BU0sKK307CisKK3N0cnVjdCBhYjg1MDBfZ3BpbyB7CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworCXN0cnVjdCBhYjg1MDAgKnBhcmVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG11dGV4IGxvY2s7CisJdTMyIGlycV9iYXNlOworCWVudW0gYWI4NTAwX2dwaW9fYWN0aW9uIGlycV9hY3Rpb247CisJdTE2IHJpc2luZzsKKwl1MTYgZmFsbGluZzsKK307CisvKioKKyAqIHRvX2FiODUwMF9ncGlvKCkgLSBnZXQgdGhlIHBvaW50ZXIgdG8gYWI4NTAwX2dwaW8KKyAqIEBjaGlwOglNZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBhYjg1MDBfZ3BpbworICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhYjg1MDBfZ3BpbyAqdG9fYWI4NTAwX2dwaW8oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBhYjg1MDBfZ3BpbywgY2hpcCk7Cit9CisKK3N0YXRpYyBpbnQgYWI4NTAwX2dwaW9fc2V0X2JpdHMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdTggcmVnLAorCQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWwpCit7CisJc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbyA9IHRvX2FiODUwMF9ncGlvKGNoaXApOworCXU4IHBvcyA9IG9mZnNldCAlIDg7CisJaW50IHJldDsKKworCXJlZyA9IHJlZyArIChvZmZzZXQgLyA4KTsKKwlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWI4NTAwX2dwaW8tPmRldiwKKwkJCQlBQjg1MDBfTUlTQywgcmVnLCAxIDw8IHBvcywgdmFsIDw8IHBvcyk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoYWI4NTAwX2dwaW8tPmRldiwgIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCXJldHVybiByZXQ7Cit9CisvKioKKyAqIGFiODUwMF9ncGlvX2dldCgpIC0gR2V0IHRoZSBwYXJ0aWN1bGFyIEdQSU8gdmFsdWUKKyAqIEBjaGlwOiBHcGlvIGRldmljZQorICogQG9mZnNldDogR1BJTyBudW1iZXIgdG8gcmVhZAorICovCitzdGF0aWMgaW50IGFiODUwMF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbyA9IHRvX2FiODUwMF9ncGlvKGNoaXApOworCXU4IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwl1OCByZWcgPSBBQjg1MDBfR1BJT19PVVQxX1JFRyArIChvZmZzZXQgLyA4KTsKKwlpbnQgcmV0OworCXU4IGRhdGE7CisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiODUwMF9ncGlvLT5kZXYsIEFCODUwMF9NSVNDLAorCQkJCQkJcmVnLCAmZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihhYjg1MDBfZ3Bpby0+ZGV2LCAiJXMgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIChkYXRhICYgbWFzaykgPj4gKG9mZnNldCAlIDgpOworfQorCitzdGF0aWMgdm9pZCBhYjg1MDBfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsKQoreworCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSB0b19hYjg1MDBfZ3BpbyhjaGlwKTsKKwlpbnQgcmV0OworCS8qIFdyaXRlIHRoZSBkYXRhICovCisJcmV0ID0gYWI4NTAwX2dwaW9fc2V0X2JpdHMoY2hpcCwgQUI4NTAwX0dQSU9fT1VUMV9SRUcsIG9mZnNldCwgMSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoYWI4NTAwX2dwaW8tPmRldiwgIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaW50IGFiODUwMF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LAorCQkJCQlpbnQgdmFsKQoreworCWludCByZXQ7CisJLyogc2V0IGRpcmVjdGlvbiBhcyBvdXRwdXQgKi8KKwlyZXQgPSBhYjg1MDBfZ3Bpb19zZXRfYml0cyhjaGlwLCBBQjg1MDBfR1BJT19ESVIxX1JFRywgb2Zmc2V0LCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkvKiBkaXNhYmxlIHB1bGwgZG93biAqLworCXJldCA9IGFiODUwMF9ncGlvX3NldF9iaXRzKGNoaXAsIEFCODUwMF9HUElPX1BVRDFfUkVHLCBvZmZzZXQsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCS8qIHNldCB0aGUgb3V0cHV0IGFzIDEgb3IgMCAqLworCXJldHVybiBhYjg1MDBfZ3Bpb19zZXRfYml0cyhjaGlwLCBBQjg1MDBfR1BJT19PVVQxX1JFRywgb2Zmc2V0LCB2YWwpOworCit9CisKK3N0YXRpYyBpbnQgYWI4NTAwX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwkvKiBzZXQgdGhlIHJlZ2lzdGVyIGFzIGlucHV0ICovCisJcmV0dXJuIGFiODUwMF9ncGlvX3NldF9iaXRzKGNoaXAsIEFCODUwMF9HUElPX0RJUjFfUkVHLCBvZmZzZXQsIDApOworfQorCitzdGF0aWMgaW50IGFiODUwMF9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJLyoKKwkgKiBPbmx5IHNvbWUgR1BJT3MgYXJlIGludGVycnVwdCBjYXBhYmxlLCBhbmQgdGhleSBhcmUKKwkgKiBvcmdhbml6ZWQgaW4gZGlzY29udGlndW91cyBjbHVzdGVyczoKKwkgKgorCSAqCUdQSU82IHRvIEdQSU8xMworCSAqCUdQSU8yNCBhbmQgR1BJTzI1CisJICoJR1BJTzM2IHRvIEdQSU80MQorCSAqLworCXN0YXRpYyBzdHJ1Y3QgYWI4NTAwX2dwaW9faXJxX2NsdXN0ZXIgeworCQlpbnQgc3RhcnQ7CisJCWludCBlbmQ7CisJfSBjbHVzdGVyc1tdID0geworCQl7LnN0YXJ0ID0gNiwgIC5lbmQgPSAxM30sCisJCXsuc3RhcnQgPSAyNCwgLmVuZCA9IDI1fSwKKwkJey5zdGFydCA9IDM2LCAuZW5kID0gNDF9LAorCX07CisJc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbyA9IHRvX2FiODUwMF9ncGlvKGNoaXApOworCWludCBiYXNlID0gYWI4NTAwX2dwaW8tPmlycV9iYXNlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2x1c3RlcnMpOyBpKyspIHsKKwkJc3RydWN0IGFiODUwMF9ncGlvX2lycV9jbHVzdGVyICpjbHVzdGVyID0gJmNsdXN0ZXJzW2ldOworCisJCWlmIChvZmZzZXQgPj0gY2x1c3Rlci0+c3RhcnQgJiYgb2Zmc2V0IDw9IGNsdXN0ZXItPmVuZCkKKwkJCXJldHVybiBiYXNlICsgb2Zmc2V0IC0gY2x1c3Rlci0+c3RhcnQ7CisKKwkJLyogQWR2YW5jZSBieSB0aGUgbnVtYmVyIG9mIGdwaW9zIGluIHRoaXMgY2x1c3RlciAqLworCQliYXNlICs9IGNsdXN0ZXItPmVuZCAtIGNsdXN0ZXItPnN0YXJ0ICsgMTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgYWI4NTAwZ3Bpb19jaGlwID0geworCS5sYWJlbAkJCT0gImFiODUwMF9ncGlvIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5kaXJlY3Rpb25faW5wdXQJPSBhYjg1MDBfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCisJLmdldAkJCT0gYWI4NTAwX2dwaW9fZ2V0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gYWI4NTAwX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkuc2V0CQkJPSBhYjg1MDBfZ3Bpb19zZXQsCisJLnRvX2lycQkJCT0gYWI4NTAwX2dwaW9fdG9faXJxLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBpcnFfdG9fcmlzaW5nKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJaW50IG9mZnNldCA9IGlycSAtIGFiODUwMF9ncGlvLT5pcnFfYmFzZTsKKwlpbnQgbmV3X2lycSA9IG9mZnNldCArICBBQjg1MDBfSU5UX0dQSU82UgorCQkJKyBhYjg1MDBfZ3Bpby0+cGFyZW50LT5pcnFfYmFzZTsKKwlyZXR1cm4gbmV3X2lycTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpcnFfdG9fZmFsbGluZyh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCWludCBvZmZzZXQgPSBpcnEgLSBhYjg1MDBfZ3Bpby0+aXJxX2Jhc2U7CisJaW50IG5ld19pcnEgPSBvZmZzZXQgKyAgQUI4NTAwX0lOVF9HUElPNkYKKwkJCSsgIGFiODUwMF9ncGlvLT5wYXJlbnQtPmlycV9iYXNlOworCXJldHVybiBuZXdfaXJxOworCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmlzaW5nX3RvX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbyA9IGRldjsKKwlpbnQgb2Zmc2V0ID0gaXJxIC0gQUI4NTAwX0lOVF9HUElPNlIKKwkJCS0gYWI4NTAwX2dwaW8tPnBhcmVudC0+aXJxX2Jhc2UgOworCWludCBuZXdfaXJxID0gb2Zmc2V0ICsgYWI4NTAwX2dwaW8tPmlycV9iYXNlOworCXJldHVybiBuZXdfaXJxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGZhbGxpbmdfdG9faXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgYWI4NTAwX2dwaW8gKmFiODUwMF9ncGlvID0gZGV2OworCWludCBvZmZzZXQgPSBpcnEgLSBBQjg1MDBfSU5UX0dQSU82RgorCQkJLSBhYjg1MDBfZ3Bpby0+cGFyZW50LT5pcnFfYmFzZSA7CisJaW50IG5ld19pcnEgPSBvZmZzZXQgKyBhYjg1MDBfZ3Bpby0+aXJxX2Jhc2U7CisJcmV0dXJuIG5ld19pcnE7CisKK30KKworLyoKKyAqIElSUSBoYW5kbGVyCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGhhbmRsZV9yaXNpbmcoaW50IGlycSwgdm9pZCAqZGV2KQoreworCisJaGFuZGxlX25lc3RlZF9pcnEocmlzaW5nX3RvX2lycShpcnEgLCBkZXYpKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBoYW5kbGVfZmFsbGluZyhpbnQgaXJxLCB2b2lkICpkZXYpCit7CisKKwloYW5kbGVfbmVzdGVkX2lycShmYWxsaW5nX3RvX2lycShpcnEsIGRldikpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgYWI4NTAwX2dwaW9faXJxX2xvY2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2dwaW8gKmFiODUwMF9ncGlvID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwltdXRleF9sb2NrKCZhYjg1MDBfZ3Bpby0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGFiODUwMF9ncGlvX2lycV9zeW5jX3VubG9jayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCWludCBvZmZzZXQgPSBpcnEgLSBhYjg1MDBfZ3Bpby0+aXJxX2Jhc2U7CisJYm9vbCByaXNpbmcgPSBhYjg1MDBfZ3Bpby0+cmlzaW5nICYgQklUKG9mZnNldCk7CisJYm9vbCBmYWxsaW5nID0gYWI4NTAwX2dwaW8tPmZhbGxpbmcgJiBCSVQob2Zmc2V0KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChhYjg1MDBfZ3Bpby0+aXJxX2FjdGlvbikJeworCWNhc2UgU1RBUlRVUDoKKwkJaWYgKHJpc2luZykKKwkJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGlycV90b19yaXNpbmcoaXJxKSwKKwkJCQkJTlVMTCwgaGFuZGxlX3Jpc2luZywKKwkJCQkJSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkJImFiODUwMC1ncGlvLXIiLCBhYjg1MDBfZ3Bpbyk7CisJCWlmIChmYWxsaW5nKQorCQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaXJxX3RvX2ZhbGxpbmcoaXJxKSwKKwkJCQkgICAgICAgTlVMTCwgaGFuZGxlX2ZhbGxpbmcsCisJCQkJICAgICAgIElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCSAgICAgICAiYWI4NTAwLWdwaW8tZiIsIGFiODUwMF9ncGlvKTsKKwkJYnJlYWs7CisJY2FzZSBTSFVURE9XTjoKKwkJaWYgKHJpc2luZykKKwkJCWZyZWVfaXJxKGlycV90b19yaXNpbmcoaXJxKSwgYWI4NTAwX2dwaW8pOworCQlpZiAoZmFsbGluZykKKwkJCWZyZWVfaXJxKGlycV90b19mYWxsaW5nKGlycSksIGFiODUwMF9ncGlvKTsKKwkJYnJlYWs7CisJY2FzZSBNQVNLOgorCQlpZiAocmlzaW5nKQorCQkJZGlzYWJsZV9pcnEoaXJxX3RvX3Jpc2luZyhpcnEpKTsKKwkJaWYgKGZhbGxpbmcpCisJCQlkaXNhYmxlX2lycShpcnFfdG9fZmFsbGluZyhpcnEpKTsKKwkJYnJlYWs7CisJY2FzZSBVTk1BU0s6CisJCWlmIChyaXNpbmcpCisJCQllbmFibGVfaXJxKGlycV90b19yaXNpbmcoaXJxKSk7CisJCWlmIChmYWxsaW5nKQorCQkJZW5hYmxlX2lycShpcnFfdG9fZmFsbGluZyhpcnEpKTsKKwkJYnJlYWs7CisJY2FzZSBOT05FOgorCQlicmVhazsKKwl9CisJYWI4NTAwX2dwaW8tPmlycV9hY3Rpb24gPSBOT05FOworCWFiODUwMF9ncGlvLT5yaXNpbmcgJj0gfihCSVQob2Zmc2V0KSk7CisJYWI4NTAwX2dwaW8tPmZhbGxpbmcgJj0gfihCSVQob2Zmc2V0KSk7CisJbXV0ZXhfdW5sb2NrKCZhYjg1MDBfZ3Bpby0+bG9jayk7Cit9CisKKworc3RhdGljIHZvaWQgYWI4NTAwX2dwaW9faXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2dwaW8gKmFiODUwMF9ncGlvID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlhYjg1MDBfZ3Bpby0+aXJxX2FjdGlvbiA9IE1BU0s7Cit9CisKK3N0YXRpYyB2b2lkIGFiODUwMF9ncGlvX2lycV91bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2dwaW8gKmFiODUwMF9ncGlvID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlhYjg1MDBfZ3Bpby0+aXJxX2FjdGlvbiA9IFVOTUFTSzsKK30KKworc3RhdGljIGludCBhYjg1MDBfZ3Bpb19pcnFfc2V0X3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJaW50IG9mZnNldCA9IGlycSAtIGFiODUwMF9ncGlvLT5pcnFfYmFzZTsKKworCWlmICh0eXBlID09IElSUV9UWVBFX0VER0VfQk9USCkgeworCQlhYjg1MDBfZ3Bpby0+cmlzaW5nID0gIEJJVChvZmZzZXQpOworCQlhYjg1MDBfZ3Bpby0+ZmFsbGluZyA9IEJJVChvZmZzZXQpOworCX0gZWxzZSBpZiAodHlwZSA9PSBJUlFfVFlQRV9FREdFX1JJU0lORykgeworCQlhYjg1MDBfZ3Bpby0+cmlzaW5nID0gIEJJVChvZmZzZXQpOworCX0gZWxzZSAgeworCQlhYjg1MDBfZ3Bpby0+ZmFsbGluZyA9IEJJVChvZmZzZXQpOworCX0KKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IGFiODUwMF9ncGlvX2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJYWI4NTAwX2dwaW8tPmlycV9hY3Rpb24gPSBTVEFSVFVQOworCXJldHVybiAwOworfQorCit2b2lkIGFiODUwMF9ncGlvX2lycV9zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCWFiODUwMF9ncGlvLT5pcnFfYWN0aW9uID0gU0hVVERPV047Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYWI4NTAwX2dwaW9faXJxX2NoaXAgPSB7CisJLm5hbWUJCQk9ICJhYjg1MDAtZ3BpbyIsCisJLnN0YXJ0dXAJCT0gYWI4NTAwX2dwaW9faXJxX3N0YXJ0dXAsCisJLnNodXRkb3duCQk9IGFiODUwMF9ncGlvX2lycV9zaHV0ZG93biwKKwkuYnVzX2xvY2sJCT0gYWI4NTAwX2dwaW9faXJxX2xvY2ssCisJLmJ1c19zeW5jX3VubG9jawk9IGFiODUwMF9ncGlvX2lycV9zeW5jX3VubG9jaywKKwkubWFzawkJCT0gYWI4NTAwX2dwaW9faXJxX21hc2ssCisJLnVubWFzawkJCT0gYWI4NTAwX2dwaW9faXJxX3VubWFzaywKKwkuc2V0X3R5cGUJCT0gYWI4NTAwX2dwaW9faXJxX3NldF90eXBlLAorfTsKKworc3RhdGljIGludCBhYjg1MDBfZ3Bpb19pcnFfaW5pdChzdHJ1Y3QgYWI4NTAwX2dwaW8gKmFiODUwMF9ncGlvKQoreworCXUzMiBiYXNlID0gYWI4NTAwX2dwaW8tPmlycV9iYXNlOworCWludCBpcnE7CisKKwlmb3IgKGlycSA9IGJhc2U7IGlycSA8IGJhc2UgKyBBQjg1MDBfTlVNX1ZJUl9HUElPX0lSUSA7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcF9kYXRhKGlycSwgYWI4NTAwX2dwaW8pOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmYWI4NTAwX2dwaW9faXJxX2NoaXAsCisJCQkJaGFuZGxlX3NpbXBsZV9pcnEpOworCQlzZXRfaXJxX25lc3RlZF90aHJlYWQoaXJxLCAxKTsKKyNpZmRlZiBDT05GSUdfQVJNCisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKKyNlbHNlCisJCXNldF9pcnFfbm9wcm9iZShpcnEpOworI2VuZGlmCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFiODUwMF9ncGlvX2lycV9yZW1vdmUoc3RydWN0IGFiODUwMF9ncGlvICphYjg1MDBfZ3BpbykKK3sKKwlpbnQgYmFzZSA9IGFiODUwMF9ncGlvLT5pcnFfYmFzZTsKKwlpbnQgaXJxOworCisJZm9yIChpcnEgPSBiYXNlOyBpcnEgPCBiYXNlICsgQUI4NTAwX05VTV9WSVJfR1BJT19JUlE7IGlycSsrKSB7CisjaWZkZWYgQ09ORklHX0FSTQorCQlzZXRfaXJxX2ZsYWdzKGlycSwgMCk7CisjZW5kaWYKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgTlVMTCwgTlVMTCk7CisJCXNldF9pcnFfY2hpcF9kYXRhKGlycSwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhYjg1MDBfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhYjg1MDBfcGxhdGZvcm1fZGF0YSAqYWI4NTAwX3BkYXRhID0KKwkJCQlkZXZfZ2V0X3BsYXRkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBhYjg1MDBfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgYWI4NTAwX2dwaW8gKmFiODUwMF9ncGlvOworCWludCByZXQ7CisJaW50IGk7CisKKwlwZGF0YSA9IGFiODUwMF9wZGF0YS0+Z3BpbzsKKwlpZiAoIXBkYXRhKQl7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImdwaW8gcGxhdGZvcm0gZGF0YSBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYWI4NTAwX2dwaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWI4NTAwX2dwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWI4NTAwX2dwaW8gPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWFiODUwMF9ncGlvLT5kZXYgPSAmcGRldi0+ZGV2OworCWFiODUwMF9ncGlvLT5wYXJlbnQgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJYWI4NTAwX2dwaW8tPmNoaXAgPSBhYjg1MDBncGlvX2NoaXA7CisJYWI4NTAwX2dwaW8tPmNoaXAubmdwaW8gPSBBQjg1MDBfTlVNX0dQSU87CisJYWI4NTAwX2dwaW8tPmNoaXAuZGV2ID0gJnBkZXYtPmRldjsKKwlhYjg1MDBfZ3Bpby0+Y2hpcC5iYXNlID0gcGRhdGEtPmdwaW9fYmFzZTsKKwlhYjg1MDBfZ3Bpby0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CisJLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLworCW11dGV4X2luaXQoJmFiODUwMF9ncGlvLT5sb2NrKTsKKwkvKgorCSAqIEFCODUwMCBjb3JlIHdpbGwgaGFuZGxlIGFuZCBjbGVhciB0aGUgSVJRCisJICogY29uZmlncmUgR1BJTyBiYXNlZCBvbiBjb25maWctcmVnIHZhbHVlLgorCSAqIFRoZXNlIHZhbHVlcyBhcmUgZm9yIHNlbGVjdGluZyB0aGUgUElOcyBhcworCSAqIEdQSU8gb3IgYWx0ZXJuYXRlIGZ1bmN0aW9uCisJICovCisJZm9yIChpID0gQUI4NTAwX0dQSU9fU0VMMV9SRUc7IGkgPD0gQUI4NTAwX0dQSU9fU0VMNl9SRUc7IGkrKykJeworCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWI4NTAwX2dwaW8tPmRldiwKKwkJCQlBQjg1MDBfTUlTQywgaSwKKwkJCQlwZGF0YS0+Y29uZmlnX3JlZ1tpXSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiODUwMF9ncGlvLT5kZXYsIEFCODUwMF9NSVNDLAorCQkJCUFCODUwMF9HUElPX0FMVEZVTl9SRUcsCisJCQkJcGRhdGEtPmNvbmZpZ19yZWdbQUxURlVOX1JFR19JTkRFWF0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0gYWI4NTAwX2dwaW9faXJxX2luaXQoYWI4NTAwX2dwaW8pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWU7CisJcmV0ID0gZ3Bpb2NoaXBfYWRkKCZhYjg1MDBfZ3Bpby0+Y2hpcCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gYWRkIGdwaW9jaGlwOiAlZFxuIiwKKwkJCQlyZXQpOworCQlnb3RvIG91dF9yZW1faXJxOworCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBhYjg1MDBfZ3Bpbyk7CisJcmV0dXJuIDA7CisKK291dF9yZW1faXJxOgorCWFiODUwMF9ncGlvX2lycV9yZW1vdmUoYWI4NTAwX2dwaW8pOworb3V0X2ZyZWU6CisJbXV0ZXhfZGVzdHJveSgmYWI4NTAwX2dwaW8tPmxvY2spOworCWtmcmVlKGFiODUwMF9ncGlvKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogYWI4NTAwX2dwaW9fcmVtb3ZlKCkgLSByZW1vdmUgQWI4NTAwLWdwaW8gZHJpdmVyCisgKiBAcGRldiA6CVBsYXRmb3JtIGRldmljZSByZWdpc3RlcmVkCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IGFiODUwMF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhYjg1MDBfZ3BpbyAqYWI4NTAwX2dwaW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZhYjg1MDBfZ3Bpby0+Y2hpcCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihhYjg1MDBfZ3Bpby0+ZGV2LCAidW5hYmxlIHRvIHJlbW92ZSBncGlvY2hpcDogJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCW11dGV4X2Rlc3Ryb3koJmFiODUwMF9ncGlvLT5sb2NrKTsKKwlrZnJlZShhYjg1MDBfZ3Bpbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWI4NTAwX2dwaW9fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFiODUwMC1ncGlvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhYjg1MDBfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWI4NTAwX2dwaW9fcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFiODUwMF9ncGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhYjg1MDBfZ3Bpb19kcml2ZXIpOworfQorYXJjaF9pbml0Y2FsbChhYjg1MDBfZ3Bpb19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFiODUwMF9ncGlvX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWI4NTAwX2dwaW9fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFiODUwMF9ncGlvX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCSUJFSyBCQVNVIDxiaWJlay5iYXN1QHN0ZXJpY3Nzb24uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgYWxsb3dzIHRvIHVzZSBBQjg1MDAgdW51c2VkIHBpbnMgdG8gYmUgdXNlZCBhcyBHUElPIik7CitNT0RVTEVfQUxJQVMoIkFCODUwMCBHUElPIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2FkcDU1MjAtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2dwaW8tYWRwNTUyMC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2dwaW8vYWRwNTUyMC1ncGlvLmMKcmVuYW1lIHRvIGRyaXZlcnMvZ3Bpby9ncGlvLWFkcDU1MjAuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2FkcDU1ODgtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2dwaW8tYWRwNTU4OC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2dwaW8vYWRwNTU4OC1ncGlvLmMKcmVuYW1lIHRvIGRyaXZlcnMvZ3Bpby9ncGlvLWFkcDU1ODguYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tYnQ4eHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWJ0OHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1NzkzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWJ0OHh4LmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisKKyAgICBidDh4eCBHUElPIGFidXNlcgorCisgICAgQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CisKKyAgICBQbGVhc2UgZG8gX29ubHlfIGNvbnRhY3QgdGhlIHBlb3BsZSBsaXN0ZWQgX2Fib3ZlXyB3aXRoIGlzc3VlcyByZWxhdGVkIHRvIHRoaXMgZHJpdmVyLgorICAgIEFsbCB0aGUgb3RoZXIgcGVvcGxlIGxpc3RlZCBiZWxvdyBhcmUgbm90IHJlbGF0ZWQgdG8gdGhpcyBkcml2ZXIuIFRoZWlyIG5hbWVzCisgICAgYXJlIG9ubHkgaGVyZSwgYmVjYXVzZSB0aGlzIGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIGJ0ODQ4IGRyaXZlci4KKworCisgICAgRGVyaXZlZCBmcm9tIHRoZSBidDg0OCBkcml2ZXI6CisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIKKwkJCSAgICYgTWFyY3VzIE1ldHpsZXIKKyAgICAoYykgMTk5OS0yMDAyIEdlcmQgS25vcnIKKworICAgIHNvbWUgdjRsMiBjb2RlIGxpbmVzIGFyZSB0YWtlbiBmcm9tIEp1c3RpbidzIGJ0dHYyIGRyaXZlciB3aGljaCBpcworICAgIChjKSAyMDAwIEp1c3RpbiBTY2hvZW1hbgorCisgICAgVjRMMSByZW1vdmFsIGZyb206CisgICAgKGMpIDIwMDUtMjAwNiBOaWNrb2xheSBWLiBTaG15cmV2CisKKyAgICBGaXhlcyB0byBiZSBmdWxseSBWNEwyIGNvbXBsaWFudCBieQorICAgIChjKSAyMDA2IE1hdXJvIENhcnZhbGhvIENoZWhhYgorCisgICAgQ3JvcHBpbmcgYW5kIG92ZXJzY2FuIHN1cHBvcnQKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTWljaGFlbCBILiBTY2hpbWVrCisgICAgU3BvbnNvcmVkIGJ5IE9QUSBTeXN0ZW1zIEFCCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKy8qIFN0ZWFsIHRoZSBoYXJkd2FyZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBidHR2IGRyaXZlci4gKi8KKyNpbmNsdWRlICIuLi9tZWRpYS92aWRlby9idDh4eC9idDg0OC5oIgorCisKKyNkZWZpbmUgQlQ4WFhHUElPX05SX0dQSU9TCQkyNCAvKiBXZSBoYXZlIDI0IEdQSU8gcGlucyAqLworCisKK3N0cnVjdCBidDh4eGdwaW8geworCXNwaW5sb2NrX3QgbG9jazsKKworCXZvaWQgX19pb21lbSAqbW1pbzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW87CisKKyNpZmRlZiBDT05GSUdfUE0KKwl1MzIgc2F2ZWRfb3V0ZW47CisJdTMyIHNhdmVkX2RhdGE7CisjZW5kaWYKK307CisKKyNkZWZpbmUgYmd3cml0ZShkYXQsIGFkcikJd3JpdGVsKChkYXQpLCBiZy0+bW1pbysoYWRyKSkKKyNkZWZpbmUgYmdyZWFkKGFkcikJCXJlYWRsKGJnLT5tbWlvKyhhZHIpKQorCisKK3N0YXRpYyBpbnQgbW9kcGFyYW1fZ3Bpb2Jhc2UgPSAtMS8qIGR5bmFtaWMgKi87Cittb2R1bGVfcGFyYW1fbmFtZWQoZ3Bpb2Jhc2UsIG1vZHBhcmFtX2dwaW9iYXNlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhncGlvYmFzZSwgIlRoZSBHUElPIG51bWJlciBiYXNlLiAtMSBtZWFucyBkeW5hbWljLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4iKTsKKworCitzdGF0aWMgaW50IGJ0OHh4Z3Bpb19ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1bnNpZ25lZCBucikKK3sKKwlzdHJ1Y3QgYnQ4eHhncGlvICpiZyA9IGNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgYnQ4eHhncGlvLCBncGlvKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBvdXRlbiwgZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZy0+bG9jaywgZmxhZ3MpOworCisJZGF0YSA9IGJncmVhZChCVDg0OF9HUElPX0RBVEEpOworCWRhdGEgJj0gfigxIDw8IG5yKTsKKwliZ3dyaXRlKGRhdGEsIEJUODQ4X0dQSU9fREFUQSk7CisKKwlvdXRlbiA9IGJncmVhZChCVDg0OF9HUElPX09VVF9FTik7CisJb3V0ZW4gJj0gfigxIDw8IG5yKTsKKwliZ3dyaXRlKG91dGVuLCBCVDg0OF9HUElPX09VVF9FTik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnQ4eHhncGlvX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2lnbmVkIG5yKQoreworCXN0cnVjdCBidDh4eGdwaW8gKmJnID0gY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCBidDh4eGdwaW8sIGdwaW8pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZy0+bG9jaywgZmxhZ3MpOworCXZhbCA9IGJncmVhZChCVDg0OF9HUElPX0RBVEEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJnLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gISEodmFsICYgKDEgPDwgbnIpKTsKK30KKworc3RhdGljIGludCBidDh4eGdwaW9fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sCisJCQkJCXVuc2lnbmVkIG5yLCBpbnQgdmFsKQoreworCXN0cnVjdCBidDh4eGdwaW8gKmJnID0gY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCBidDh4eGdwaW8sIGdwaW8pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIG91dGVuLCBkYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJnLT5sb2NrLCBmbGFncyk7CisKKwlvdXRlbiA9IGJncmVhZChCVDg0OF9HUElPX09VVF9FTik7CisJb3V0ZW4gfD0gKDEgPDwgbnIpOworCWJnd3JpdGUob3V0ZW4sIEJUODQ4X0dQSU9fT1VUX0VOKTsKKworCWRhdGEgPSBiZ3JlYWQoQlQ4NDhfR1BJT19EQVRBKTsKKwlpZiAodmFsKQorCQlkYXRhIHw9ICgxIDw8IG5yKTsKKwllbHNlCisJCWRhdGEgJj0gfigxIDw8IG5yKTsKKwliZ3dyaXRlKGRhdGEsIEJUODQ4X0dQSU9fREFUQSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ0OHh4Z3Bpb19ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLAorCQkJICAgIHVuc2lnbmVkIG5yLCBpbnQgdmFsKQoreworCXN0cnVjdCBidDh4eGdwaW8gKmJnID0gY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCBidDh4eGdwaW8sIGdwaW8pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGRhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmctPmxvY2ssIGZsYWdzKTsKKworCWRhdGEgPSBiZ3JlYWQoQlQ4NDhfR1BJT19EQVRBKTsKKwlpZiAodmFsKQorCQlkYXRhIHw9ICgxIDw8IG5yKTsKKwllbHNlCisJCWRhdGEgJj0gfigxIDw8IG5yKTsKKwliZ3dyaXRlKGRhdGEsIEJUODQ4X0dQSU9fREFUQSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBidDh4eGdwaW9fZ3Bpb19zZXR1cChzdHJ1Y3QgYnQ4eHhncGlvICpiZykKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjID0gJmJnLT5ncGlvOworCisJYy0+bGFiZWwgPSBkZXZfbmFtZSgmYmctPnBkZXYtPmRldik7CisJYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljLT5kaXJlY3Rpb25faW5wdXQgPSBidDh4eGdwaW9fZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CisJYy0+Z2V0ID0gYnQ4eHhncGlvX2dwaW9fZ2V0OworCWMtPmRpcmVjdGlvbl9vdXRwdXQgPSBidDh4eGdwaW9fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCWMtPnNldCA9IGJ0OHh4Z3Bpb19ncGlvX3NldDsKKwljLT5kYmdfc2hvdyA9IE5VTEw7CisJYy0+YmFzZSA9IG1vZHBhcmFtX2dwaW9iYXNlOworCWMtPm5ncGlvID0gQlQ4WFhHUElPX05SX0dQSU9TOworCWMtPmNhbl9zbGVlcCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgYnQ4eHhncGlvX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0cnVjdCBidDh4eGdwaW8gKmJnOworCWludCBlcnI7CisKKwliZyA9IGt6YWxsb2Moc2l6ZW9mKCpiZyksIEdGUF9LRVJORUwpOworCWlmICghYmcpCisJCXJldHVybiAtRU5PTUVNOworCisJYmctPnBkZXYgPSBkZXY7CisJc3Bpbl9sb2NrX2luaXQoJmJnLT5sb2NrKTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImJ0OHh4Z3BpbzogQ2FuJ3QgZW5hYmxlIGRldmljZS5cbiIpOworCQlnb3RvIGVycl9mcmVlYmc7CisJfQorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAorCQkJCXBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSwKKwkJCQkiYnQ4eHhncGlvIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnQ4eHhncGlvOiBDYW4ndCByZXF1ZXN0IGlvbWVtICgweCVsbHgpLlxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCkpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXJyX2Rpc2FibGU7CisJfQorCXBjaV9zZXRfbWFzdGVyKGRldik7CisJcGNpX3NldF9kcnZkYXRhKGRldiwgYmcpOworCisJYmctPm1taW8gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLCAweDEwMDApOworCWlmICghYmctPm1taW8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJidDh4eGdwaW86IGlvcmVtYXAoKSBmYWlsZWRcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9yZWxlYXNlX21lbTsKKwl9CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwliZ3dyaXRlKDAsIEJUODQ4X0lOVF9NQVNLKTsKKworCS8qIGdwaW8gaW5pdCAqLworCWJnd3JpdGUoMCwgQlQ4NDhfR1BJT19ETUFfQ1RMKTsKKwliZ3dyaXRlKDAsIEJUODQ4X0dQSU9fUkVHX0lOUCk7CisJYmd3cml0ZSgwLCBCVDg0OF9HUElPX09VVF9FTik7CisKKwlidDh4eGdwaW9fZ3Bpb19zZXR1cChiZyk7CisJZXJyID0gZ3Bpb2NoaXBfYWRkKCZiZy0+Z3Bpbyk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImJ0OHh4Z3BpbzogRmFpbGVkIHRvIHJlZ2lzdGVyIEdQSU9zXG4iKTsKKwkJZ290byBlcnJfcmVsZWFzZV9tZW07CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiYnQ4eHhncGlvOiBBYnVzaW5nIEJUOHh4IGNhcmQgZm9yIEdQSU9zICVkIHRvICVkXG4iLAorCSAgICAgICBiZy0+Z3Bpby5iYXNlLCBiZy0+Z3Bpby5iYXNlICsgQlQ4WFhHUElPX05SX0dQSU9TIC0gMSk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JlbGVhc2VfbWVtOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwKKwkJCSAgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSk7CisJcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CitlcnJfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKK2Vycl9mcmVlYmc6CisJa2ZyZWUoYmcpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYnQ4eHhncGlvX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYnQ4eHhncGlvICpiZyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWdwaW9jaGlwX3JlbW92ZSgmYmctPmdwaW8pOworCisJYmd3cml0ZSgwLCBCVDg0OF9JTlRfTUFTSyk7CisJYmd3cml0ZSh+MHgwLCBCVDg0OF9JTlRfU1RBVCk7CisJYmd3cml0ZSgweDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsKKworCWlvdW5tYXAoYmctPm1taW8pOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCisJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoYmcpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGJ0OHh4Z3Bpb19zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGJ0OHh4Z3BpbyAqYmcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZy0+bG9jaywgZmxhZ3MpOworCisJYmctPnNhdmVkX291dGVuID0gYmdyZWFkKEJUODQ4X0dQSU9fT1VUX0VOKTsKKwliZy0+c2F2ZWRfZGF0YSA9IGJncmVhZChCVDg0OF9HUElPX0RBVEEpOworCisJYmd3cml0ZSgwLCBCVDg0OF9JTlRfTUFTSyk7CisJYmd3cml0ZSh+MHgwLCBCVDg0OF9JTlRfU1RBVCk7CisJYmd3cml0ZSgweDAsIEJUODQ4X0dQSU9fT1VUX0VOKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJnLT5sb2NrLCBmbGFncyk7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidDh4eGdwaW9fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBidDh4eGdwaW8gKmJnID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZy0+bG9jaywgZmxhZ3MpOworCisJYmd3cml0ZSgwLCBCVDg0OF9JTlRfTUFTSyk7CisJYmd3cml0ZSgwLCBCVDg0OF9HUElPX0RNQV9DVEwpOworCWJnd3JpdGUoMCwgQlQ4NDhfR1BJT19SRUdfSU5QKTsKKwliZ3dyaXRlKGJnLT5zYXZlZF9vdXRlbiwgQlQ4NDhfR1BJT19PVVRfRU4pOworCWJnd3JpdGUoYmctPnNhdmVkX2RhdGEgJiBiZy0+c2F2ZWRfb3V0ZW4sCisJCUJUODQ4X0dQSU9fREFUQSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBidDh4eGdwaW9fc3VzcGVuZCBOVUxMCisjZGVmaW5lIGJ0OHh4Z3Bpb19yZXN1bWUgTlVMTAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYnQ4eHhncGlvX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9PS1RSRUUsIFBDSV9ERVZJQ0VfSURfQlQ4NDgpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPT0tUUkVFLCBQQ0lfREVWSUNFX0lEX0JUODQ5KSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST09LVFJFRSwgUENJX0RFVklDRV9JRF9CVDg3OCkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9PS1RSRUUsIFBDSV9ERVZJQ0VfSURfQlQ4NzkpIH0sCisJeyAwLCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBidDh4eGdwaW9fcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBidDh4eGdwaW9fcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYnQ4eHhncGlvIiwKKwkuaWRfdGFibGUJPSBidDh4eGdwaW9fcGNpX3RibCwKKwkucHJvYmUJCT0gYnQ4eHhncGlvX3Byb2JlLAorCS5yZW1vdmUJCT0gYnQ4eHhncGlvX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGJ0OHh4Z3Bpb19zdXNwZW5kLAorCS5yZXN1bWUJCT0gYnQ4eHhncGlvX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJ0OHh4Z3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJ0OHh4Z3Bpb19wY2lfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGJ0OHh4Z3Bpb19pbml0KQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYnQ4eHhncGlvX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmJ0OHh4Z3Bpb19wY2lfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGJ0OHh4Z3Bpb19leGl0KQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEJ1ZXNjaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBYnVzZSBhIEJUOHh4IGZyYW1lZ3JhYmJlciBjYXJkIGFzIGdlbmVyaWMgR1BJTyBjYXJkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vY3M1NTM1LWdwaW8uYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWNzNTUzNS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2dwaW8vY3M1NTM1LWdwaW8uYwpyZW5hbWUgdG8gZHJpdmVycy9ncGlvL2dwaW8tY3M1NTM1LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWRhOTA1Mi5jIGIvZHJpdmVycy9ncGlvL2dwaW8tZGE5MDUyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZjVlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWRhOTA1Mi5jCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogR1BJTyBEcml2ZXIgZm9yIERpYWxvZyBEQTkwNTIgUE1JQ3MuCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTEgRGlhbG9nIFNlbWljb25kdWN0b3IgTHRkLgorICoKKyAqIEF1dGhvcjogRGF2aWQgRGFqdW4gQ2hlbiA8ZGNoZW5AZGlhc2VtaS5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwNTIvZGE5MDUyLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RhOTA1Mi9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvZGE5MDUyL3BkYXRhLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RhOTA1Mi9ncGlvLmg+CisKKyNkZWZpbmUgREE5MDUyX0lOUFVUCQkJCTEKKyNkZWZpbmUgREE5MDUyX09VVFBVVF9PUEVORFJBSU4JCTIKKyNkZWZpbmUgREE5MDUyX09VVFBVVF9QVVNIUFVMTAkJCTMKKworI2RlZmluZSBEQTkwNTJfU1VQUExZX1ZERF9JTzEJCQkwCisKKyNkZWZpbmUgREE5MDUyX0RFQk9VTkNJTkdfT0ZGCQkJMAorI2RlZmluZSBEQTkwNTJfREVCT1VOQ0lOR19PTgkJCTEKKworI2RlZmluZSBEQTkwNTJfT1VUUFVUX0xPV0xFVkVMCQkJMAorCisjZGVmaW5lIERBOTA1Ml9BQ1RJVkVfTE9XCQkJMAorI2RlZmluZSBEQTkwNTJfQUNUSVZFX0hJR0gJCQkxCisKKyNkZWZpbmUgREE5MDUyX0dQSU9fTUFYX1BPUlRTX1BFUl9SRUdJU1RFUgk4CisjZGVmaW5lIERBOTA1Ml9HUElPX1NISUZUX0NPVU5UKG5vKQkJKG5vJTgpCisjZGVmaW5lIERBOTA1Ml9HUElPX01BU0tfVVBQRVJfTklCQkxFCQkweEYwCisjZGVmaW5lIERBOTA1Ml9HUElPX01BU0tfTE9XRVJfTklCQkxFCQkweDBGCisjZGVmaW5lIERBOTA1Ml9HUElPX05JQkJMRV9TSElGVAkJNAorCitzdHJ1Y3QgZGE5MDUyX2dwaW8geworCXN0cnVjdCBkYTkwNTIgKmRhOTA1MjsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdwOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGE5MDUyX2dwaW8gKnRvX2RhOTA1Ml9ncGlvKHN0cnVjdCBncGlvX2NoaXAgKmNoaXApCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgZGE5MDUyX2dwaW8sIGdwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGE5MDUyX2dwaW9fcG9ydF9vZGQodW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBvZmZzZXQgJSAyOworfQorCitzdGF0aWMgaW50IGRhOTA1Ml9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBkYTkwNTJfZ3BpbyAqZ3BpbyA9IHRvX2RhOTA1Ml9ncGlvKGdjKTsKKwlpbnQgZGE5MDUyX3BvcnRfZGlyZWN0aW9uID0gMDsKKwlpbnQgcmV0OworCisJcmV0ID0gZGE5MDUyX3JlZ19yZWFkKGdwaW8tPmRhOTA1MiwKKwkJCSAgICAgIERBOTA1Ml9HUElPXzBfMV9SRUcgKyAob2Zmc2V0ID4+IDEpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChkYTkwNTJfZ3Bpb19wb3J0X29kZChvZmZzZXQpKSB7CisJCWRhOTA1Ml9wb3J0X2RpcmVjdGlvbiA9IHJldCAmIERBOTA1Ml9HUElPX09ERF9QT1JUX1BJTjsKKwkJZGE5MDUyX3BvcnRfZGlyZWN0aW9uID4+PSA0OworCX0gZWxzZSB7CisJCWRhOTA1Ml9wb3J0X2RpcmVjdGlvbiA9IHJldCAmIERBOTA1Ml9HUElPX0VWRU5fUE9SVF9QSU47CisJfQorCisJc3dpdGNoIChkYTkwNTJfcG9ydF9kaXJlY3Rpb24pIHsKKwljYXNlIERBOTA1Ml9JTlBVVDoKKwkJaWYgKG9mZnNldCA8IERBOTA1Ml9HUElPX01BWF9QT1JUU19QRVJfUkVHSVNURVIpCisJCQlyZXQgPSBkYTkwNTJfcmVnX3JlYWQoZ3Bpby0+ZGE5MDUyLAorCQkJCQkgICAgICBEQTkwNTJfU1RBVFVTX0NfUkVHKTsKKwkJZWxzZQorCQkJcmV0ID0gZGE5MDUyX3JlZ19yZWFkKGdwaW8tPmRhOTA1MiwKKwkJCQkJICAgICAgREE5MDUyX1NUQVRVU19EX1JFRyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCAmICgxIDw8IERBOTA1Ml9HUElPX1NISUZUX0NPVU5UKG9mZnNldCkpKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCWNhc2UgREE5MDUyX09VVFBVVF9QVVNIUFVMTDoKKwkJaWYgKGRhOTA1Ml9ncGlvX3BvcnRfb2RkKG9mZnNldCkpCisJCQlyZXR1cm4gcmV0ICYgREE5MDUyX0dQSU9fT0REX1BPUlRfTU9ERTsKKwkJZWxzZQorCQkJcmV0dXJuIHJldCAmIERBOTA1Ml9HUElPX0VWRU5fUE9SVF9NT0RFOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHZvaWQgZGE5MDUyX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZGE5MDUyX2dwaW8gKmdwaW8gPSB0b19kYTkwNTJfZ3BpbyhnYyk7CisJdW5zaWduZWQgY2hhciByZWdpc3Rlcl92YWx1ZSA9IDA7CisJaW50IHJldDsKKworCWlmIChkYTkwNTJfZ3Bpb19wb3J0X29kZChvZmZzZXQpKSB7CisJCWlmICh2YWx1ZSkgeworCQkJcmVnaXN0ZXJfdmFsdWUgPSBEQTkwNTJfR1BJT19PRERfUE9SVF9NT0RFOworCQkJcmV0ID0gZGE5MDUyX3JlZ191cGRhdGUoZ3Bpby0+ZGE5MDUyLCAob2Zmc2V0ID4+IDEpICsKKwkJCQkJCURBOTA1Ml9HUElPXzBfMV9SRUcsCisJCQkJCQlEQTkwNTJfR1BJT19PRERfUE9SVF9NT0RFLAorCQkJCQkJcmVnaXN0ZXJfdmFsdWUpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWRldl9lcnIoZ3Bpby0+ZGE5MDUyLT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gdXBkYXRlZCBncGlvIG9kZCByZWcsJWQiLAorCQkJCQlyZXQpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHZhbHVlKSB7CisJCQlyZWdpc3Rlcl92YWx1ZSA9IERBOTA1Ml9HUElPX0VWRU5fUE9SVF9NT0RFOworCQkJcmV0ID0gZGE5MDUyX3JlZ191cGRhdGUoZ3Bpby0+ZGE5MDUyLCAob2Zmc2V0ID4+IDEpICsKKwkJCQkJCURBOTA1Ml9HUElPXzBfMV9SRUcsCisJCQkJCQlEQTkwNTJfR1BJT19FVkVOX1BPUlRfTU9ERSwKKwkJCQkJCXJlZ2lzdGVyX3ZhbHVlKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlkZXZfZXJyKGdwaW8tPmRhOTA1Mi0+ZGV2LAorCQkJCQkiRmFpbGVkIHRvIHVwZGF0ZWQgZ3BpbyBldmVuIHJlZywlZCIsCisJCQkJCXJldCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgZGE5MDUyX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGRhOTA1Ml9ncGlvICpncGlvID0gdG9fZGE5MDUyX2dwaW8oZ2MpOworCXVuc2lnbmVkIGNoYXIgcmVnaXN0ZXJfdmFsdWU7CisJaW50IHJldDsKKworCS8qIEZvcm1hdDogZnVuY3Rpb24gLSAyIGJpdHMgdHlwZSAtIDEgYml0IG1vZGUgLSAxIGJpdCAqLworCXJlZ2lzdGVyX3ZhbHVlID0gREE5MDUyX0lOUFVUIHwgREE5MDUyX0FDVElWRV9MT1cgPDwgMiB8CisJCQkgREE5MDUyX0RFQk9VTkNJTkdfT04gPDwgMzsKKworCWlmIChkYTkwNTJfZ3Bpb19wb3J0X29kZChvZmZzZXQpKQorCQlyZXQgPSBkYTkwNTJfcmVnX3VwZGF0ZShncGlvLT5kYTkwNTIsIChvZmZzZXQgPj4gMSkgKworCQkJCQlEQTkwNTJfR1BJT18wXzFfUkVHLAorCQkJCQlEQTkwNTJfR1BJT19NQVNLX1VQUEVSX05JQkJMRSwKKwkJCQkJKHJlZ2lzdGVyX3ZhbHVlIDw8CisJCQkJCURBOTA1Ml9HUElPX05JQkJMRV9TSElGVCkpOworCWVsc2UKKwkJcmV0ID0gZGE5MDUyX3JlZ191cGRhdGUoZ3Bpby0+ZGE5MDUyLCAob2Zmc2V0ID4+IDEpICsKKwkJCQkJREE5MDUyX0dQSU9fMF8xX1JFRywKKwkJCQkJREE5MDUyX0dQSU9fTUFTS19MT1dFUl9OSUJCTEUsCisJCQkJCXJlZ2lzdGVyX3ZhbHVlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDUyX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKKwkJCQkJdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGRhOTA1Ml9ncGlvICpncGlvID0gdG9fZGE5MDUyX2dwaW8oZ2MpOworCXVuc2lnbmVkIGNoYXIgcmVnaXN0ZXJfdmFsdWU7CisJaW50IHJldDsKKworCS8qIEZvcm1hdDogRnVuY3Rpb24gLSAyIGJpdHMgVHlwZSAtIDEgYml0IE1vZGUgLSAxIGJpdCAqLworCXJlZ2lzdGVyX3ZhbHVlID0gREE5MDUyX09VVFBVVF9QVVNIUFVMTCB8IERBOTA1Ml9TVVBQTFlfVkREX0lPMSA8PCAyIHwKKwkJCSB2YWx1ZSA8PCAzOworCisJaWYgKGRhOTA1Ml9ncGlvX3BvcnRfb2RkKG9mZnNldCkpCisJCXJldCA9IGRhOTA1Ml9yZWdfdXBkYXRlKGdwaW8tPmRhOTA1MiwgKG9mZnNldCA+PiAxKSArCisJCQkJCURBOTA1Ml9HUElPXzBfMV9SRUcsCisJCQkJCURBOTA1Ml9HUElPX01BU0tfVVBQRVJfTklCQkxFLAorCQkJCQkocmVnaXN0ZXJfdmFsdWUgPDwKKwkJCQkJREE5MDUyX0dQSU9fTklCQkxFX1NISUZUKSk7CisJZWxzZQorCQlyZXQgPSBkYTkwNTJfcmVnX3VwZGF0ZShncGlvLT5kYTkwNTIsIChvZmZzZXQgPj4gMSkgKworCQkJCQlEQTkwNTJfR1BJT18wXzFfUkVHLAorCQkJCQlEQTkwNTJfR1BJT19NQVNLX0xPV0VSX05JQkJMRSwKKwkJCQkJcmVnaXN0ZXJfdmFsdWUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkYTkwNTJfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHUzMiBvZmZzZXQpCit7CisJc3RydWN0IGRhOTA1Ml9ncGlvICpncGlvID0gdG9fZGE5MDUyX2dwaW8oZ2MpOworCXN0cnVjdCBkYTkwNTIgKmRhOTA1MiA9IGdwaW8tPmRhOTA1MjsKKworCXJldHVybiBkYTkwNTItPmlycV9iYXNlICsgREE5MDUyX0lSUV9HUEkwICsgb2Zmc2V0OworfQorCitzdGF0aWMgc3RydWN0IGdwaW9fY2hpcCByZWZlcmVuY2VfZ3AgX19kZXZpbml0ZGF0YSA9IHsKKwkubGFiZWwgPSAiZGE5MDUyLWdwaW8iLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5nZXQgPSBkYTkwNTJfZ3Bpb19nZXQsCisJLnNldCA9IGRhOTA1Ml9ncGlvX3NldCwKKwkuZGlyZWN0aW9uX2lucHV0ID0gZGE5MDUyX2dwaW9fZGlyZWN0aW9uX2lucHV0LAorCS5kaXJlY3Rpb25fb3V0cHV0ID0gZGE5MDUyX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkudG9faXJxID0gZGE5MDUyX2dwaW9fdG9faXJxLAorCS5jYW5fc2xlZXAgPSAxOworCS5uZ3BpbyA9IDE2OworCS5iYXNlID0gLTE7Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkYTkwNTJfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkYTkwNTJfZ3BpbyAqZ3BpbzsKKwlzdHJ1Y3QgZGE5MDUyX3BkYXRhICpwZGF0YTsKKwlpbnQgcmV0OworCisJZ3BpbyA9IGt6YWxsb2Moc2l6ZW9mKCpncGlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGdwaW8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlncGlvLT5kYTkwNTIgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJcGRhdGEgPSBncGlvLT5kYTkwNTItPmRldi0+cGxhdGZvcm1fZGF0YTsKKworCWdwaW8tPmdwID0gcmVmZXJlbmNlX2dwOworCWlmIChwZGF0YSAmJiBwZGF0YS0+Z3Bpb19iYXNlKQorCQlncGlvLT5ncC5iYXNlID0gcGRhdGEtPmdwaW9fYmFzZTsKKworCXJldCA9IGdwaW9jaGlwX2FkZCgmZ3Bpby0+Z3ApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCByZWdpc3RlciBncGlvY2hpcCwgJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX21lbTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBncGlvKTsKKworCXJldHVybiAwOworCitlcnJfbWVtOgorCWtmcmVlKGdwaW8pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRhOTA1Ml9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkYTkwNTJfZ3BpbyAqZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJmdwaW8tPmdwKTsKKwlpZiAocmV0ID09IDApCisJCWtmcmVlKGdwaW8pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGE5MDUyX2dwaW9fZHJpdmVyID0geworCS5wcm9iZSA9IGRhOTA1Ml9ncGlvX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChkYTkwNTJfZ3Bpb19yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImRhOTA1Mi1ncGlvIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRhOTA1Ml9ncGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkYTkwNTJfZ3Bpb19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoZGE5MDUyX2dwaW9faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkYTkwNTJfZ3Bpb19leGl0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkYTkwNTJfZ3Bpb19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZGE5MDUyX2dwaW9fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIERhanVuIENoZW4gPGRjaGVuQGRpYXNlbWkuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEQTkwNTIgR1BJTyBEZXZpY2UgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmRhOTA1Mi1ncGlvIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1lcDkzeHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWVwOTN4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZmI5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1lcDkzeHguYwpAQCAtMCwwICsxLDQwNSBAQAorLyoKKyAqIEdlbmVyaWMgRVA5M3h4IEdQSU8gaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUnlhbiBNYWxsb24KKyAqIENvcHlyaWdodCAoYykgMjAxMSBIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIG9yaWdpbmFsbHkgZnJvbToKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmFzaWNfbW1pb19ncGlvLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKK3N0cnVjdCBlcDkzeHhfZ3BpbyB7CisJdm9pZCBfX2lvbWVtCQkqbW1pb19iYXNlOworCXN0cnVjdCBiZ3Bpb19jaGlwCWJnY1s4XTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbnRlcnJ1cHQgaGFuZGxpbmcgZm9yIEVQOTN4eCBvbi1jaGlwIEdQSU9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdwaW9faW50X3VubWFza2VkWzNdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3Bpb19pbnRfZW5hYmxlZFszXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdwaW9faW50X3R5cGUxWzNdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3Bpb19pbnRfdHlwZTJbM107CitzdGF0aWMgdW5zaWduZWQgY2hhciBncGlvX2ludF9kZWJvdW5jZVszXTsKKworLyogUG9ydCBvcmRlcmluZyBpczogQSBCIEYgKi8KK3N0YXRpYyBjb25zdCB1OCBpbnRfdHlwZTFfcmVnaXN0ZXJfb2Zmc2V0WzNdCT0geyAweDkwLCAweGFjLCAweDRjIH07CitzdGF0aWMgY29uc3QgdTggaW50X3R5cGUyX3JlZ2lzdGVyX29mZnNldFszXQk9IHsgMHg5NCwgMHhiMCwgMHg1MCB9Oworc3RhdGljIGNvbnN0IHU4IGVvaV9yZWdpc3Rlcl9vZmZzZXRbM10JCT0geyAweDk4LCAweGI0LCAweDU0IH07CitzdGF0aWMgY29uc3QgdTggaW50X2VuX3JlZ2lzdGVyX29mZnNldFszXQk9IHsgMHg5YywgMHhiOCwgMHg1OCB9Oworc3RhdGljIGNvbnN0IHU4IGludF9kZWJvdW5jZV9yZWdpc3Rlcl9vZmZzZXRbM10JPSB7IDB4YTgsIDB4YzQsIDB4NjQgfTsKKworc3RhdGljIHZvaWQgZXA5M3h4X2dwaW9fdXBkYXRlX2ludF9wYXJhbXModW5zaWduZWQgcG9ydCkKK3sKKwlCVUdfT04ocG9ydCA+IDIpOworCisJX19yYXdfd3JpdGViKDAsIEVQOTNYWF9HUElPX1JFRyhpbnRfZW5fcmVnaXN0ZXJfb2Zmc2V0W3BvcnRdKSk7CisKKwlfX3Jhd193cml0ZWIoZ3Bpb19pbnRfdHlwZTJbcG9ydF0sCisJCUVQOTNYWF9HUElPX1JFRyhpbnRfdHlwZTJfcmVnaXN0ZXJfb2Zmc2V0W3BvcnRdKSk7CisKKwlfX3Jhd193cml0ZWIoZ3Bpb19pbnRfdHlwZTFbcG9ydF0sCisJCUVQOTNYWF9HUElPX1JFRyhpbnRfdHlwZTFfcmVnaXN0ZXJfb2Zmc2V0W3BvcnRdKSk7CisKKwlfX3Jhd193cml0ZWIoZ3Bpb19pbnRfdW5tYXNrZWRbcG9ydF0gJiBncGlvX2ludF9lbmFibGVkW3BvcnRdLAorCQlFUDkzWFhfR1BJT19SRUcoaW50X2VuX3JlZ2lzdGVyX29mZnNldFtwb3J0XSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXA5M3h4X2dwaW9faW50X21hc2sodW5zaWduZWQgbGluZSkKK3sKKwlncGlvX2ludF91bm1hc2tlZFtsaW5lID4+IDNdICY9IH4oMSA8PCAobGluZSAmIDcpKTsKK30KKworc3RhdGljIHZvaWQgZXA5M3h4X2dwaW9faW50X2RlYm91bmNlKHVuc2lnbmVkIGludCBpcnEsIGJvb2wgZW5hYmxlKQoreworCWludCBsaW5lID0gaXJxX3RvX2dwaW8oaXJxKTsKKwlpbnQgcG9ydCA9IGxpbmUgPj4gMzsKKwlpbnQgcG9ydF9tYXNrID0gMSA8PCAobGluZSAmIDcpOworCisJaWYgKGVuYWJsZSkKKwkJZ3Bpb19pbnRfZGVib3VuY2VbcG9ydF0gfD0gcG9ydF9tYXNrOworCWVsc2UKKwkJZ3Bpb19pbnRfZGVib3VuY2VbcG9ydF0gJj0gfnBvcnRfbWFzazsKKworCV9fcmF3X3dyaXRlYihncGlvX2ludF9kZWJvdW5jZVtwb3J0XSwKKwkJRVA5M1hYX0dQSU9fUkVHKGludF9kZWJvdW5jZV9yZWdpc3Rlcl9vZmZzZXRbcG9ydF0pKTsKK30KKworc3RhdGljIHZvaWQgZXA5M3h4X2dwaW9fYWJfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCWludCBpOworCisJc3RhdHVzID0gX19yYXdfcmVhZGIoRVA5M1hYX0dQSU9fQV9JTlRfU1RBVFVTKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChzdGF0dXMgJiAoMSA8PCBpKSkgeworCQkJaW50IGdwaW9faXJxID0gZ3Bpb190b19pcnEoRVA5M1hYX0dQSU9fTElORV9BKDApKSArIGk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoZ3Bpb19pcnEpOworCQl9CisJfQorCisJc3RhdHVzID0gX19yYXdfcmVhZGIoRVA5M1hYX0dQSU9fQl9JTlRfU1RBVFVTKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChzdGF0dXMgJiAoMSA8PCBpKSkgeworCQkJaW50IGdwaW9faXJxID0gZ3Bpb190b19pcnEoRVA5M1hYX0dQSU9fTElORV9CKDApKSArIGk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoZ3Bpb19pcnEpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBlcDkzeHhfZ3Bpb19mX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwkvKgorCSAqIG1hcCBkaXNjb250aWd1b3VzIGh3IGlycSByYW5nZSB0byBjb250aW51b3VzIHN3IGlycSByYW5nZToKKwkgKgorCSAqICBJUlFfRVA5M1hYX0dQSU97MC4uN31NVVggLT4gZ3Bpb190b19pcnEoRVA5M1hYX0dQSU9fTElORV9GKHswLi43fSkKKwkgKi8KKwlpbnQgcG9ydF9mX2lkeCA9ICgoaXJxICsgMSkgJiA3KSBeIDQ7IC8qIHsxOS4uMjIsNDcuLjUwfSAtPiB7MC4uN30gKi8KKwlpbnQgZ3Bpb19pcnEgPSBncGlvX3RvX2lycShFUDkzWFhfR1BJT19MSU5FX0YoMCkpICsgcG9ydF9mX2lkeDsKKworCWdlbmVyaWNfaGFuZGxlX2lycShncGlvX2lycSk7Cit9CisKK3N0YXRpYyB2b2lkIGVwOTN4eF9ncGlvX2lycV9hY2soc3RydWN0IGlycV9kYXRhICpkKQoreworCWludCBsaW5lID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKKwlpbnQgcG9ydCA9IGxpbmUgPj4gMzsKKwlpbnQgcG9ydF9tYXNrID0gMSA8PCAobGluZSAmIDcpOworCisJaWYgKGlycWRfZ2V0X3RyaWdnZXJfdHlwZShkKSA9PSBJUlFfVFlQRV9FREdFX0JPVEgpIHsKKwkJZ3Bpb19pbnRfdHlwZTJbcG9ydF0gXj0gcG9ydF9tYXNrOyAvKiBzd2l0Y2ggZWRnZSBkaXJlY3Rpb24gKi8KKwkJZXA5M3h4X2dwaW9fdXBkYXRlX2ludF9wYXJhbXMocG9ydCk7CisJfQorCisJX19yYXdfd3JpdGViKHBvcnRfbWFzaywgRVA5M1hYX0dQSU9fUkVHKGVvaV9yZWdpc3Rlcl9vZmZzZXRbcG9ydF0pKTsKK30KKworc3RhdGljIHZvaWQgZXA5M3h4X2dwaW9faXJxX21hc2tfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlpbnQgbGluZSA9IGlycV90b19ncGlvKGQtPmlycSk7CisJaW50IHBvcnQgPSBsaW5lID4+IDM7CisJaW50IHBvcnRfbWFzayA9IDEgPDwgKGxpbmUgJiA3KTsKKworCWlmIChpcnFkX2dldF90cmlnZ2VyX3R5cGUoZCkgPT0gSVJRX1RZUEVfRURHRV9CT1RIKQorCQlncGlvX2ludF90eXBlMltwb3J0XSBePSBwb3J0X21hc2s7IC8qIHN3aXRjaCBlZGdlIGRpcmVjdGlvbiAqLworCisJZ3Bpb19pbnRfdW5tYXNrZWRbcG9ydF0gJj0gfnBvcnRfbWFzazsKKwllcDkzeHhfZ3Bpb191cGRhdGVfaW50X3BhcmFtcyhwb3J0KTsKKworCV9fcmF3X3dyaXRlYihwb3J0X21hc2ssIEVQOTNYWF9HUElPX1JFRyhlb2lfcmVnaXN0ZXJfb2Zmc2V0W3BvcnRdKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVwOTN4eF9ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlpbnQgbGluZSA9IGlycV90b19ncGlvKGQtPmlycSk7CisJaW50IHBvcnQgPSBsaW5lID4+IDM7CisKKwlncGlvX2ludF91bm1hc2tlZFtwb3J0XSAmPSB+KDEgPDwgKGxpbmUgJiA3KSk7CisJZXA5M3h4X2dwaW9fdXBkYXRlX2ludF9wYXJhbXMocG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGVwOTN4eF9ncGlvX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCWludCBsaW5lID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKKwlpbnQgcG9ydCA9IGxpbmUgPj4gMzsKKworCWdwaW9faW50X3VubWFza2VkW3BvcnRdIHw9IDEgPDwgKGxpbmUgJiA3KTsKKwllcDkzeHhfZ3Bpb191cGRhdGVfaW50X3BhcmFtcyhwb3J0KTsKK30KKworLyoKKyAqIGdwaW9faW50X3R5cGUxIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGludGVycnVwdCBpcyBsZXZlbCAoMCkgb3IKKyAqIGVkZ2UgKDEpIHRyaWdnZXJlZCwgd2hpbGUgZ3Bpb19pbnRfdHlwZTIgY29udHJvbHMgd2hldGhlciBpdAorICogdHJpZ2dlcnMgb24gbG93L2ZhbGxpbmcgKDApIG9yIGhpZ2gvcmlzaW5nICgxKS4KKyAqLworc3RhdGljIGludCBlcDkzeHhfZ3Bpb19pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQoreworCWNvbnN0IGludCBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKKwljb25zdCBpbnQgcG9ydCA9IGdwaW8gPj4gMzsKKwljb25zdCBpbnQgcG9ydF9tYXNrID0gMSA8PCAoZ3BpbyAmIDcpOworCWlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGVyOworCisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQlncGlvX2ludF90eXBlMVtwb3J0XSB8PSBwb3J0X21hc2s7CisJCWdwaW9faW50X3R5cGUyW3BvcnRdIHw9IHBvcnRfbWFzazsKKwkJaGFuZGxlciA9IGhhbmRsZV9lZGdlX2lycTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCWdwaW9faW50X3R5cGUxW3BvcnRdIHw9IHBvcnRfbWFzazsKKwkJZ3Bpb19pbnRfdHlwZTJbcG9ydF0gJj0gfnBvcnRfbWFzazsKKwkJaGFuZGxlciA9IGhhbmRsZV9lZGdlX2lycTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQlncGlvX2ludF90eXBlMVtwb3J0XSAmPSB+cG9ydF9tYXNrOworCQlncGlvX2ludF90eXBlMltwb3J0XSB8PSBwb3J0X21hc2s7CisJCWhhbmRsZXIgPSBoYW5kbGVfbGV2ZWxfaXJxOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJZ3Bpb19pbnRfdHlwZTFbcG9ydF0gJj0gfnBvcnRfbWFzazsKKwkJZ3Bpb19pbnRfdHlwZTJbcG9ydF0gJj0gfnBvcnRfbWFzazsKKwkJaGFuZGxlciA9IGhhbmRsZV9sZXZlbF9pcnE7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgorCQlncGlvX2ludF90eXBlMVtwb3J0XSB8PSBwb3J0X21hc2s7CisJCS8qIHNldCBpbml0aWFsIHBvbGFyaXR5IGJhc2VkIG9uIGN1cnJlbnQgaW5wdXQgbGV2ZWwgKi8KKwkJaWYgKGdwaW9fZ2V0X3ZhbHVlKGdwaW8pKQorCQkJZ3Bpb19pbnRfdHlwZTJbcG9ydF0gJj0gfnBvcnRfbWFzazsgLyogZmFsbGluZyAqLworCQllbHNlCisJCQlncGlvX2ludF90eXBlMltwb3J0XSB8PSBwb3J0X21hc2s7IC8qIHJpc2luZyAqLworCQloYW5kbGVyID0gaGFuZGxlX2VkZ2VfaXJxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoImZhaWxlZCB0byBzZXQgaXJxIHR5cGUgJWQgZm9yIGdwaW8gJWRcbiIsIHR5cGUsIGdwaW8pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlfX2lycV9zZXRfaGFuZGxlcl9sb2NrZWQoZC0+aXJxLCBoYW5kbGVyKTsKKworCWdwaW9faW50X2VuYWJsZWRbcG9ydF0gfD0gcG9ydF9tYXNrOworCisJZXA5M3h4X2dwaW9fdXBkYXRlX2ludF9wYXJhbXMocG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBlcDkzeHhfZ3Bpb19pcnFfY2hpcCA9IHsKKwkubmFtZQkJPSAiR1BJTyIsCisJLmlycV9hY2sJPSBlcDkzeHhfZ3Bpb19pcnFfYWNrLAorCS5pcnFfbWFza19hY2sJPSBlcDkzeHhfZ3Bpb19pcnFfbWFza19hY2ssCisJLmlycV9tYXNrCT0gZXA5M3h4X2dwaW9faXJxX21hc2ssCisJLmlycV91bm1hc2sJPSBlcDkzeHhfZ3Bpb19pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUJPSBlcDkzeHhfZ3Bpb19pcnFfdHlwZSwKK307CisKK3N0YXRpYyB2b2lkIGVwOTN4eF9ncGlvX2luaXRfaXJxKHZvaWQpCit7CisJaW50IGdwaW9faXJxOworCisJZm9yIChncGlvX2lycSA9IGdwaW9fdG9faXJxKDApOworCSAgICAgZ3Bpb19pcnEgPD0gZ3Bpb190b19pcnEoRVA5M1hYX0dQSU9fTElORV9NQVhfSVJRKTsgKytncGlvX2lycSkgeworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoZ3Bpb19pcnEsICZlcDkzeHhfZ3Bpb19pcnFfY2hpcCwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOworCQlzZXRfaXJxX2ZsYWdzKGdwaW9faXJxLCBJUlFGX1ZBTElEKTsKKwl9CisKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfRVA5M1hYX0dQSU9fQUIsCisJCQkJZXA5M3h4X2dwaW9fYWJfaXJxX2hhbmRsZXIpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9FUDkzWFhfR1BJTzBNVVgsCisJCQkJZXA5M3h4X2dwaW9fZl9pcnFfaGFuZGxlcik7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0VQOTNYWF9HUElPMU1VWCwKKwkJCQllcDkzeHhfZ3Bpb19mX2lycV9oYW5kbGVyKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfRVA5M1hYX0dQSU8yTVVYLAorCQkJCWVwOTN4eF9ncGlvX2ZfaXJxX2hhbmRsZXIpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9FUDkzWFhfR1BJTzNNVVgsCisJCQkJZXA5M3h4X2dwaW9fZl9pcnFfaGFuZGxlcik7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0VQOTNYWF9HUElPNE1VWCwKKwkJCQllcDkzeHhfZ3Bpb19mX2lycV9oYW5kbGVyKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfRVA5M1hYX0dQSU81TVVYLAorCQkJCWVwOTN4eF9ncGlvX2ZfaXJxX2hhbmRsZXIpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9FUDkzWFhfR1BJTzZNVVgsCisJCQkJZXA5M3h4X2dwaW9fZl9pcnFfaGFuZGxlcik7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0VQOTNYWF9HUElPN01VWCwKKwkJCQllcDkzeHhfZ3Bpb19mX2lycV9oYW5kbGVyKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3Bpb2xpYiBpbnRlcmZhY2UgZm9yIEVQOTN4eCBvbi1jaGlwIEdQSU9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBlcDkzeHhfZ3Bpb19iYW5rIHsKKwljb25zdCBjaGFyCSpsYWJlbDsKKwlpbnQJCWRhdGE7CisJaW50CQlkaXI7CisJaW50CQliYXNlOworCWJvb2wJCWhhc19kZWJvdW5jZTsKK307CisKKyNkZWZpbmUgRVA5M1hYX0dQSU9fQkFOSyhfbGFiZWwsIF9kYXRhLCBfZGlyLCBfYmFzZSwgX2RlYm91bmNlKQlcCisJewkJCQkJCQlcCisJCS5sYWJlbAkJPSBfbGFiZWwsCQkJXAorCQkuZGF0YQkJPSBfZGF0YSwJCQlcCisJCS5kaXIJCT0gX2RpciwJCQkJXAorCQkuYmFzZQkJPSBfYmFzZSwJCQlcCisJCS5oYXNfZGVib3VuY2UJPSBfZGVib3VuY2UsCQkJXAorCX0KKworc3RhdGljIHN0cnVjdCBlcDkzeHhfZ3Bpb19iYW5rIGVwOTN4eF9ncGlvX2JhbmtzW10gPSB7CisJRVA5M1hYX0dQSU9fQkFOSygiQSIsIDB4MDAsIDB4MTAsIDAsIHRydWUpLAorCUVQOTNYWF9HUElPX0JBTksoIkIiLCAweDA0LCAweDE0LCA4LCB0cnVlKSwKKwlFUDkzWFhfR1BJT19CQU5LKCJDIiwgMHgwOCwgMHgxOCwgNDAsIGZhbHNlKSwKKwlFUDkzWFhfR1BJT19CQU5LKCJEIiwgMHgwYywgMHgxYywgMjQsIGZhbHNlKSwKKwlFUDkzWFhfR1BJT19CQU5LKCJFIiwgMHgyMCwgMHgyNCwgMzIsIGZhbHNlKSwKKwlFUDkzWFhfR1BJT19CQU5LKCJGIiwgMHgzMCwgMHgzNCwgMTYsIHRydWUpLAorCUVQOTNYWF9HUElPX0JBTksoIkciLCAweDM4LCAweDNjLCA0OCwgZmFsc2UpLAorCUVQOTNYWF9HUElPX0JBTksoIkgiLCAweDQwLCAweDQ0LCA1NiwgZmFsc2UpLAorfTsKKworc3RhdGljIGludCBlcDkzeHhfZ3Bpb19zZXRfZGVib3VuY2Uoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBkZWJvdW5jZSkKK3sKKwlpbnQgZ3BpbyA9IGNoaXAtPmJhc2UgKyBvZmZzZXQ7CisJaW50IGlycSA9IGdwaW9fdG9faXJxKGdwaW8pOworCisJaWYgKGlycSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZXA5M3h4X2dwaW9faW50X2RlYm91bmNlKGlycSwgZGVib3VuY2UgPyB0cnVlIDogZmFsc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXA5M3h4X2dwaW9fYWRkX2Jhbmsoc3RydWN0IGJncGlvX2NoaXAgKmJnYywgc3RydWN0IGRldmljZSAqZGV2LAorCXZvaWQgX19pb21lbSAqbW1pb19iYXNlLCBzdHJ1Y3QgZXA5M3h4X2dwaW9fYmFuayAqYmFuaykKK3sKKwl2b2lkIF9faW9tZW0gKmRhdGEgPSBtbWlvX2Jhc2UgKyBiYW5rLT5kYXRhOworCXZvaWQgX19pb21lbSAqZGlyID0gIG1taW9fYmFzZSArIGJhbmstPmRpcjsKKwlpbnQgZXJyOworCisJZXJyID0gYmdwaW9faW5pdChiZ2MsIGRldiwgMSwgZGF0YSwgTlVMTCwgTlVMTCwgZGlyLCBOVUxMLCBmYWxzZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWJnYy0+Z2MubGFiZWwgPSBiYW5rLT5sYWJlbDsKKwliZ2MtPmdjLmJhc2UgPSBiYW5rLT5iYXNlOworCisJaWYgKGJhbmstPmhhc19kZWJvdW5jZSkKKwkJYmdjLT5nYy5zZXRfZGVib3VuY2UgPSBlcDkzeHhfZ3Bpb19zZXRfZGVib3VuY2U7CisKKwlyZXR1cm4gZ3Bpb2NoaXBfYWRkKCZiZ2MtPmdjKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZXA5M3h4X2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZXA5M3h4X2dwaW8gKmVwOTN4eF9ncGlvOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXZvaWQgX19pb21lbSAqbW1pbzsKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJZXA5M3h4X2dwaW8gPSBremFsbG9jKHNpemVvZigqZXA5M3h4X2dwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVwOTN4eF9ncGlvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBleGl0X2ZyZWU7CisJfQorCisJbW1pbyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIW1taW8pIHsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGV4aXRfcmVsZWFzZTsKKwl9CisJZXA5M3h4X2dwaW8tPm1taW9fYmFzZSA9IG1taW87CisKKwkvKiBEZWZhdWx0IGFsbCBwb3J0cyB0byBHUElPICovCisJZXA5M3h4X2RldmNmZ19zZXRfYml0cyhFUDkzWFhfU1lTQ09OX0RFVkNGR19LRVlTIHwKKwkJCSAgICAgICBFUDkzWFhfU1lTQ09OX0RFVkNGR19HT05LIHwKKwkJCSAgICAgICBFUDkzWFhfU1lTQ09OX0RFVkNGR19FT05JREUgfAorCQkJICAgICAgIEVQOTNYWF9TWVNDT05fREVWQ0ZHX0dPTklERSB8CisJCQkgICAgICAgRVA5M1hYX1NZU0NPTl9ERVZDRkdfSE9OSURFKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVwOTN4eF9ncGlvX2JhbmtzKTsgaSsrKSB7CisJCXN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MgPSAmZXA5M3h4X2dwaW8tPmJnY1tpXTsKKwkJc3RydWN0IGVwOTN4eF9ncGlvX2JhbmsgKmJhbmsgPSAmZXA5M3h4X2dwaW9fYmFua3NbaV07CisKKwkJaWYgKGVwOTN4eF9ncGlvX2FkZF9iYW5rKGJnYywgJnBkZXYtPmRldiwgbW1pbywgYmFuaykpCisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFkZCBncGlvIGJhbmsgJXNcbiIsCisJCQkJYmFuay0+bGFiZWwpOworCX0KKworCWVwOTN4eF9ncGlvX2luaXRfaXJxKCk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9yZWxlYXNlOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworZXhpdF9mcmVlOgorCWtmcmVlKGVwOTN4eF9ncGlvKTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXMgZmFpbGVkIHdpdGggZXJybm8gJWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGVwOTN4eF9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiZ3Bpby1lcDkzeHgiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBlcDkzeHhfZ3Bpb19wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVwOTN4eF9ncGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZlcDkzeHhfZ3Bpb19kcml2ZXIpOworfQorcG9zdGNvcmVfaW5pdGNhbGwoZXA5M3h4X2dwaW9faW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIlJ5YW4gTWFsbG9uIDxyeWFuQGJsdWV3YXRlcnN5cy5jb20+ICIKKwkJIkggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFUDkzWFggR1BJTyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWV4eW5vczQuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWV4eW5vczQuYwppbmRleCBkNTRjYTZhLi5kMjRiMzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1leHlub3M0LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tZXh5bm9zNC5jCkBAIC0xLDEwICsxLDkgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9ncGlvbGliLmMKKy8qCisgKiBFWFlOT1M0IC0gR1BJT2xpYiBzdXBwb3J0CiAgKgogICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KICAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCiAgKgotICogRVhZTk9TNCAtIEdQSU9saWIgc3VwcG9ydAotICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCkBAIC0yMSwxNiArMjAsMzcgQEAKICNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy1oZWxwZXJzLmg+CiAKK2ludCBzM2NfZ3Bpb19zZXRwdWxsX2V4eW5vczQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCisJCQkJdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHB1bGwpCit7CisJaWYgKHB1bGwgPT0gUzNDX0dQSU9fUFVMTF9VUCkKKwkJcHVsbCA9IDM7CisKKwlyZXR1cm4gczNjX2dwaW9fc2V0cHVsbF91cGRvd24oY2hpcCwgb2ZmLCBwdWxsKTsKK30KKworczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGxfZXh5bm9zNChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkJCXVuc2lnbmVkIGludCBvZmYpCit7CisJczNjX2dwaW9fcHVsbF90IHB1bGw7CisKKwlwdWxsID0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24oY2hpcCwgb2ZmKTsKKwlpZiAocHVsbCA9PSAzKQorCQlwdWxsID0gUzNDX0dQSU9fUFVMTF9VUDsKKworCXJldHVybiBwdWxsOworfQorCiBzdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvX2NmZyA9IHsKIAkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCisJLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF9leHlub3M0LAorCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfZXh5bm9zNCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2ZnIGdwaW9fY2ZnX25vaW50ID0gewogCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzY0eHhfNGJpdCwKLQkuc2V0X3B1bGwJPSBzM2NfZ3Bpb19zZXRwdWxsX3VwZG93biwKLQkuZ2V0X3B1bGwJPSBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93biwKKwkuc2V0X3B1bGwJPSBzM2NfZ3Bpb19zZXRwdWxsX2V4eW5vczQsCisJLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF9leHlub3M0LAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWdlbmVyaWMuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWdlbmVyaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzE3MTRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tZ2VuZXJpYy5jCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogR2VuZXJpYyBkcml2ZXIgZm9yIG1lbW9yeS1tYXBwZWQgR1BJTyBjb250cm9sbGVycy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCwyMDEwIEFudG9uIFZvcm9udHNvdiA8Y2JvdWF0bWFpbHJ1QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIC4uLi5gYC5gYGB+fn5+YGBgYC5gLmAuYC5gLmBgYGBgYGAnJywsLC4uLi4uLi4uLmBgYGBgLi4uLi4uYC4uLi4uLi4KKyAqIC4uLmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBgYGBgYC4uCisgKiAuLlRoZSBzaW1wbGVzdCBmb3JtIG9mIGEgR1BJTyBjb250cm9sbGVyIHRoYXQgdGhlIGRyaXZlciBzdXBwb3J0cyBpc2BgCisgKiAgYC5qdXN0IGEgc2luZ2xlICJkYXRhIiByZWdpc3Rlciwgd2hlcmUgR1BJTyBzdGF0ZSBjYW4gYmUgcmVhZCBhbmQvb3IgYAorICogICAgYCwuLndyaXR0ZW4uICwsLi5gYH5+fn4gLi4uLi5gYC5gLmAufn4uYGBgLmAuLi4uLi4uLi5gYGBgYGAuYGBgYGBgYAorICogICAgICAgIGBgYGBgYGBgYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fCitfL35+fF9fXy9+fCAgIC4gYGBgfn5+fn5+ICAgICAgIF9fXy9fX19cX19fICAgICAsfi5gLmAuYC5gYGBgYC5+fi4uLiwsLCwuLi4KK19fX19fX19fX198fiRAfn5+ICAgICAgICAlfiAgICAvbypvKm8qbypvKm9cICAgLi4gSW1wbGVtZW50aW5nIHN1Y2ggYSBHUElPIC4KK28gICAgICAgIGAgICAgICAgICAgICAgICAgICAgICB+fn5+XF9fXy9+fn5+ICAgIGAgY29udHJvbGxlciBpbiBGUEdBIGlzICwuYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAuLi4udHJpdmlhbC4uJ35gLmBgYC5gYGAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgYGBgYGAKKyAqICAuYGBgYGBgYH5+fn5gLi5gLmBgLmBgLgorICogLiAgVGhlIGRyaXZlciBzdXBwb3J0cyAgYC4uLiAgICAgICAsLi5gYGAuYH5+fmBgYGBgYGBgYGBgYGBgYC4uLi5gYGBgLmBgLCwKKyAqIC4gICBiaWctZW5kaWFuIG5vdGF0aW9uLCBqdXN0YC4gIC4uIEEgYml0IG1vcmUgc29waGlzdGljYXRlZCBjb250cm9sbGVycyAsCisgKiAgLiByZWdpc3RlciB0aGUgZGV2aWNlIHdpdGggLWJlYC4gLndpdGggYSBwYWlyIG9mIHNldC9jbGVhci1iaXQgcmVnaXN0ZXJzICwKKyAqICAgYC4uIHN1ZmZpeC4gIGBgYH5+YGBgYGAuLi4uYC5gICAgLiBhZmZlY3RpbmcgdGhlIGRhdGEgcmVnaXN0ZXIgYW5kIHRoZSAuYAorICogICAgIGBgLmAuYGAuLi5gYGAgICAgICAgICAgICAgICAgICBgYGAuLiBvdXRwdXQgcGlucyBhcmUgYWxzbyBzdXBwb3J0ZWQuYAorICogICAgICAgICAgICAgICAgICAgICAgICBeXiAgICAgICAgICAgICBgYGBgYC5gYGBgYGBgYGAuLGBgfmBgfmBgfn5gYGBgYGAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgIF5eCisgKiAgICwuLmAuYC5gLi4uYGBgYGBgYGBgYGBgLi4uLi4uYC5gLmAuYC5gLmAuLmAuYC5gLi4KKyAqIC4uIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGluIGF0IGxlYXN0IHNvbWUgY2FzZXMgLiAgICAsLX5+fi0sCisgKiAgLnRoaXMgd2lsbCBiZSB1c2VkIHdpdGggcm9sbC15b3VyLW93biBBU0lDL0ZQR0EgLmAgICAgIFwgICAvCisgKiAgLmxvZ2ljIGluIFZlcmlsb2cgb3IgVkhETC4gfn5+YGBgYGBgYGBgLi5gYGBgYH5+YCAgICAgICBcIC8KKyAqICAuLmBgYGBgYGBgLi4uLi4uYGBgYGBgYGBgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxvXworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl4gICAgICAgICAgICAgICAgICAgICAgICAgIC8gXAorICoKKyAqICAgICAgICAgICAuLi5gYGBgYH5+YC4uLi4uYGAuYC4uLi4uLi4uLi5gYGBgYGAuYC5gYC5gYGAuLi4uLi4uLmBgLgorICogICAgICAgICAgICBgICA4LCAxNiwgMzIgYW5kIDY0IGJpdHMgcmVnaXN0ZXJzIGFyZSBzdXBwb3J0ZWQsIGFuZGBgLgorICogICAgICAgICAgICAuIHRoZSBudW1iZXIgb2YgR1BJT3MgaXMgZGV0ZXJtaW5lZCBieSB0aGUgd2lkdGggb2YgICB+CisgKiAgICAgICAgICAgICAuLiB0aGUgcmVnaXN0ZXJzLiAsLi4uLi4uLi4uLi4uYGBgLmAuYC4uYC5gLn5+fi5gLmAuYH4KKyAqICAgICAgICAgICAgICAgYC4uLi4uLi5gYGBgLmBgYAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jhc2ljX21taW9fZ3Bpby5oPgorCitzdGF0aWMgdm9pZCBiZ3Bpb193cml0ZTgodm9pZCBfX2lvbWVtICpyZWcsIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl3cml0ZWIoZGF0YSwgcmVnKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmdwaW9fcmVhZDgodm9pZCBfX2lvbWVtICpyZWcpCit7CisJcmV0dXJuIHJlYWRiKHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGJncGlvX3dyaXRlMTYodm9pZCBfX2lvbWVtICpyZWcsIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl3cml0ZXcoZGF0YSwgcmVnKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmdwaW9fcmVhZDE2KHZvaWQgX19pb21lbSAqcmVnKQoreworCXJldHVybiByZWFkdyhyZWcpOworfQorCitzdGF0aWMgdm9pZCBiZ3Bpb193cml0ZTMyKHZvaWQgX19pb21lbSAqcmVnLCB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJd3JpdGVsKGRhdGEsIHJlZyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJncGlvX3JlYWQzMih2b2lkIF9faW9tZW0gKnJlZykKK3sKKwlyZXR1cm4gcmVhZGwocmVnKTsKK30KKworI2lmIEJJVFNfUEVSX0xPTkcgPj0gNjQKK3N0YXRpYyB2b2lkIGJncGlvX3dyaXRlNjQodm9pZCBfX2lvbWVtICpyZWcsIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl3cml0ZXEoZGF0YSwgcmVnKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmdwaW9fcmVhZDY0KHZvaWQgX19pb21lbSAqcmVnKQoreworCXJldHVybiByZWFkcShyZWcpOworfQorI2VuZGlmIC8qIEJJVFNfUEVSX0xPTkcgPj0gNjQgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmdwaW9fcGluMm1hc2soc3RydWN0IGJncGlvX2NoaXAgKmJnYywgdW5zaWduZWQgaW50IHBpbikKK3sKKwlyZXR1cm4gMSA8PCBwaW47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJncGlvX3BpbjJtYXNrX2JlKHN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBwaW4pCit7CisJcmV0dXJuIDEgPDwgKGJnYy0+Yml0cyAtIDEgLSBwaW4pOworfQorCitzdGF0aWMgaW50IGJncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCit7CisJc3RydWN0IGJncGlvX2NoaXAgKmJnYyA9IHRvX2JncGlvX2NoaXAoZ2MpOworCisJcmV0dXJuIGJnYy0+cmVhZF9yZWcoYmdjLT5yZWdfZGF0KSAmIGJnYy0+cGluMm1hc2soYmdjLCBncGlvKTsKK30KKworc3RhdGljIHZvaWQgYmdwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjID0gdG9fYmdwaW9fY2hpcChnYyk7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gYmdjLT5waW4ybWFzayhiZ2MsIGdwaW8pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmdjLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodmFsKQorCQliZ2MtPmRhdGEgfD0gbWFzazsKKwllbHNlCisJCWJnYy0+ZGF0YSAmPSB+bWFzazsKKworCWJnYy0+d3JpdGVfcmVnKGJnYy0+cmVnX2RhdCwgYmdjLT5kYXRhKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJnYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBiZ3Bpb19zZXRfd2l0aF9jbGVhcihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sCisJCQkJIGludCB2YWwpCit7CisJc3RydWN0IGJncGlvX2NoaXAgKmJnYyA9IHRvX2JncGlvX2NoaXAoZ2MpOworCXVuc2lnbmVkIGxvbmcgbWFzayA9IGJnYy0+cGluMm1hc2soYmdjLCBncGlvKTsKKworCWlmICh2YWwpCisJCWJnYy0+d3JpdGVfcmVnKGJnYy0+cmVnX3NldCwgbWFzayk7CisJZWxzZQorCQliZ2MtPndyaXRlX3JlZyhiZ2MtPnJlZ19jbHIsIG1hc2spOworfQorCitzdGF0aWMgdm9pZCBiZ3Bpb19zZXRfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjID0gdG9fYmdwaW9fY2hpcChnYyk7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gYmdjLT5waW4ybWFzayhiZ2MsIGdwaW8pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmdjLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodmFsKQorCQliZ2MtPmRhdGEgfD0gbWFzazsKKwllbHNlCisJCWJnYy0+ZGF0YSAmPSB+bWFzazsKKworCWJnYy0+d3JpdGVfcmVnKGJnYy0+cmVnX3NldCwgYmdjLT5kYXRhKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJnYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGJncGlvX3NpbXBsZV9kaXJfaW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJncGlvX3NpbXBsZV9kaXJfb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywKKwkJCQlpbnQgdmFsKQoreworCWdjLT5zZXQoZ2MsIGdwaW8sIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZ3Bpb19kaXJfaW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MgPSB0b19iZ3Bpb19jaGlwKGdjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJnYy0+bG9jaywgZmxhZ3MpOworCisJYmdjLT5kaXIgJj0gfmJnYy0+cGluMm1hc2soYmdjLCBncGlvKTsKKwliZ2MtPndyaXRlX3JlZyhiZ2MtPnJlZ19kaXIsIGJnYy0+ZGlyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJnYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmdwaW9fZGlyX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWwpCit7CisJc3RydWN0IGJncGlvX2NoaXAgKmJnYyA9IHRvX2JncGlvX2NoaXAoZ2MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlnYy0+c2V0KGdjLCBncGlvLCB2YWwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJnYy0+bG9jaywgZmxhZ3MpOworCisJYmdjLT5kaXIgfD0gYmdjLT5waW4ybWFzayhiZ2MsIGdwaW8pOworCWJnYy0+d3JpdGVfcmVnKGJnYy0+cmVnX2RpciwgYmdjLT5kaXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmdjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZ3Bpb19kaXJfaW5faW52KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjID0gdG9fYmdwaW9fY2hpcChnYyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZ2MtPmxvY2ssIGZsYWdzKTsKKworCWJnYy0+ZGlyIHw9IGJnYy0+cGluMm1hc2soYmdjLCBncGlvKTsKKwliZ2MtPndyaXRlX3JlZyhiZ2MtPnJlZ19kaXIsIGJnYy0+ZGlyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJnYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmdwaW9fZGlyX291dF9pbnYoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCXN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MgPSB0b19iZ3Bpb19jaGlwKGdjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZ2MtPnNldChnYywgZ3BpbywgdmFsKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZ2MtPmxvY2ssIGZsYWdzKTsKKworCWJnYy0+ZGlyICY9IH5iZ2MtPnBpbjJtYXNrKGJnYywgZ3Bpbyk7CisJYmdjLT53cml0ZV9yZWcoYmdjLT5yZWdfZGlyLCBiZ2MtPmRpcik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZ2MtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJncGlvX3NldHVwX2FjY2Vzc29ycyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MsCisJCQkJIGJvb2wgYmUpCit7CisKKwlzd2l0Y2ggKGJnYy0+Yml0cykgeworCWNhc2UgODoKKwkJYmdjLT5yZWFkX3JlZwk9IGJncGlvX3JlYWQ4OworCQliZ2MtPndyaXRlX3JlZwk9IGJncGlvX3dyaXRlODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJYmdjLT5yZWFkX3JlZwk9IGJncGlvX3JlYWQxNjsKKwkJYmdjLT53cml0ZV9yZWcJPSBiZ3Bpb193cml0ZTE2OworCQlicmVhazsKKwljYXNlIDMyOgorCQliZ2MtPnJlYWRfcmVnCT0gYmdwaW9fcmVhZDMyOworCQliZ2MtPndyaXRlX3JlZwk9IGJncGlvX3dyaXRlMzI7CisJCWJyZWFrOworI2lmIEJJVFNfUEVSX0xPTkcgPj0gNjQKKwljYXNlIDY0OgorCQliZ2MtPnJlYWRfcmVnCT0gYmdwaW9fcmVhZDY0OworCQliZ2MtPndyaXRlX3JlZwk9IGJncGlvX3dyaXRlNjQ7CisJCWJyZWFrOworI2VuZGlmIC8qIEJJVFNfUEVSX0xPTkcgPj0gNjQgKi8KKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgInVuc3VwcG9ydGVkIGRhdGEgd2lkdGggJXUgYml0c1xuIiwgYmdjLT5iaXRzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmdjLT5waW4ybWFzayA9IGJlID8gYmdwaW9fcGluMm1hc2tfYmUgOiBiZ3Bpb19waW4ybWFzazsKKworCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIHRoZSBkZXZpY2UgYW5kIGFsbG9jYXRlIHRoZSByZXNvdXJjZXMuICBGb3Igc2V0dGluZyBHUElPJ3MgdGhlcmUgYXJlCisgKiB0aHJlZSBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbnM6CisgKgorICoJLSBzaW5nbGUgaW5wdXQvb3V0cHV0IHJlZ2lzdGVyIHJlc291cmNlIChuYW1lZCAiZGF0IikuCisgKgktIHNldC9jbGVhciBwYWlyIChuYW1lZCAic2V0IiBhbmQgImNsciIpLgorICoJLSBzaW5nbGUgb3V0cHV0IHJlZ2lzdGVyIHJlc291cmNlIGFuZCBzaW5nbGUgaW5wdXQgcmVzb3VyY2UgKCJzZXQiIGFuZAorICoJZGF0IikuCisgKgorICogRm9yIHRoZSBzaW5nbGUgb3V0cHV0IHJlZ2lzdGVyLCB0aGlzIGRyaXZlcyBhIDEgYnkgc2V0dGluZyBhIGJpdCBhbmQgYSB6ZXJvCisgKiBieSBjbGVhcmluZyBhIGJpdC4gIEZvciB0aGUgc2V0IGNsciBwYWlyLCB0aGlzIGRyaXZlcyBhIDEgYnkgc2V0dGluZyBhIGJpdAorICogaW4gdGhlIHNldCByZWdpc3RlciBhbmQgY2xlYXJzIGl0IGJ5IHNldHRpbmcgYSBiaXQgaW4gdGhlIGNsZWFyIHJlZ2lzdGVyLgorICogVGhlIGNvbmZpZ3VyYXRpb24gaXMgZGV0ZWN0ZWQgYnkgd2hpY2ggcmVzb3VyY2VzIGFyZSBwcmVzZW50LgorICoKKyAqIEZvciBzZXR0aW5nIHRoZSBHUElPIGRpcmVjdGlvbiwgdGhlcmUgYXJlIHRocmVlIHN1cHBvcnRlZCBjb25maWd1cmF0aW9uczoKKyAqCisgKgktIHNpbXBsZSBiaWRpcmVjdGlvbiBHUElPIHRoYXQgcmVxdWlyZXMgbm8gY29uZmlndXJhdGlvbi4KKyAqCS0gYW4gb3V0cHV0IGRpcmVjdGlvbiByZWdpc3RlciAobmFtZWQgImRpcm91dCIpIHdoZXJlIGEgMSBiaXQKKyAqCWluZGljYXRlcyB0aGUgR1BJTyBpcyBhbiBvdXRwdXQuCisgKgktIGFuIGlucHV0IGRpcmVjdGlvbiByZWdpc3RlciAobmFtZWQgImRpcmluIikgd2hlcmUgYSAxIGJpdCBpbmRpY2F0ZXMKKyAqCXRoZSBHUElPIGlzIGFuIGlucHV0LgorICovCitzdGF0aWMgaW50IGJncGlvX3NldHVwX2lvKHN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MsCisJCQkgIHZvaWQgX19pb21lbSAqZGF0LAorCQkJICB2b2lkIF9faW9tZW0gKnNldCwKKwkJCSAgdm9pZCBfX2lvbWVtICpjbHIpCit7CisKKwliZ2MtPnJlZ19kYXQgPSBkYXQ7CisJaWYgKCFiZ2MtPnJlZ19kYXQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNldCAmJiBjbHIpIHsKKwkJYmdjLT5yZWdfc2V0ID0gc2V0OworCQliZ2MtPnJlZ19jbHIgPSBjbHI7CisJCWJnYy0+Z2Muc2V0ID0gYmdwaW9fc2V0X3dpdGhfY2xlYXI7CisJfSBlbHNlIGlmIChzZXQgJiYgIWNscikgeworCQliZ2MtPnJlZ19zZXQgPSBzZXQ7CisJCWJnYy0+Z2Muc2V0ID0gYmdwaW9fc2V0X3NldDsKKwl9IGVsc2UgeworCQliZ2MtPmdjLnNldCA9IGJncGlvX3NldDsKKwl9CisKKwliZ2MtPmdjLmdldCA9IGJncGlvX2dldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJncGlvX3NldHVwX2RpcmVjdGlvbihzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjLAorCQkJCSB2b2lkIF9faW9tZW0gKmRpcm91dCwKKwkJCQkgdm9pZCBfX2lvbWVtICpkaXJpbikKK3sKKwlpZiAoZGlyb3V0ICYmIGRpcmluKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoZGlyb3V0KSB7CisJCWJnYy0+cmVnX2RpciA9IGRpcm91dDsKKwkJYmdjLT5nYy5kaXJlY3Rpb25fb3V0cHV0ID0gYmdwaW9fZGlyX291dDsKKwkJYmdjLT5nYy5kaXJlY3Rpb25faW5wdXQgPSBiZ3Bpb19kaXJfaW47CisJfSBlbHNlIGlmIChkaXJpbikgeworCQliZ2MtPnJlZ19kaXIgPSBkaXJpbjsKKwkJYmdjLT5nYy5kaXJlY3Rpb25fb3V0cHV0ID0gYmdwaW9fZGlyX291dF9pbnY7CisJCWJnYy0+Z2MuZGlyZWN0aW9uX2lucHV0ID0gYmdwaW9fZGlyX2luX2ludjsKKwl9IGVsc2UgeworCQliZ2MtPmdjLmRpcmVjdGlvbl9vdXRwdXQgPSBiZ3Bpb19zaW1wbGVfZGlyX291dDsKKwkJYmdjLT5nYy5kaXJlY3Rpb25faW5wdXQgPSBiZ3Bpb19zaW1wbGVfZGlyX2luOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX19kZXZleGl0IGJncGlvX3JlbW92ZShzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjKQoreworCWludCBlcnIgPSBncGlvY2hpcF9yZW1vdmUoJmJnYy0+Z2MpOworCisJa2ZyZWUoYmdjKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChiZ3Bpb19yZW1vdmUpOworCitpbnQgX19kZXZpbml0IGJncGlvX2luaXQoc3RydWN0IGJncGlvX2NoaXAgKmJnYywKKwkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgdW5zaWduZWQgbG9uZyBzeiwKKwkJCSB2b2lkIF9faW9tZW0gKmRhdCwKKwkJCSB2b2lkIF9faW9tZW0gKnNldCwKKwkJCSB2b2lkIF9faW9tZW0gKmNsciwKKwkJCSB2b2lkIF9faW9tZW0gKmRpcm91dCwKKwkJCSB2b2lkIF9faW9tZW0gKmRpcmluLAorCQkJIGJvb2wgYmlnX2VuZGlhbikKK3sKKwlpbnQgcmV0OworCisJaWYgKCFpc19wb3dlcl9vZl8yKHN6KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliZ2MtPmJpdHMgPSBzeiAqIDg7CisJaWYgKGJnYy0+Yml0cyA+IEJJVFNfUEVSX0xPTkcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2luaXQoJmJnYy0+bG9jayk7CisJYmdjLT5nYy5kZXYgPSBkZXY7CisJYmdjLT5nYy5sYWJlbCA9IGRldl9uYW1lKGRldik7CisJYmdjLT5nYy5iYXNlID0gLTE7CisJYmdjLT5nYy5uZ3BpbyA9IGJnYy0+Yml0czsKKworCXJldCA9IGJncGlvX3NldHVwX2lvKGJnYywgZGF0LCBzZXQsIGNscik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGJncGlvX3NldHVwX2FjY2Vzc29ycyhkZXYsIGJnYywgYmlnX2VuZGlhbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGJncGlvX3NldHVwX2RpcmVjdGlvbihiZ2MsIGRpcm91dCwgZGlyaW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwliZ2MtPmRhdGEgPSBiZ2MtPnJlYWRfcmVnKGJnYy0+cmVnX2RhdCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYmdwaW9faW5pdCk7CisKKyNpZmRlZiBDT05GSUdfR1BJT19HRU5FUklDX1BMQVRGT1JNCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmJncGlvX21hcChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZV90IHNhbmVfc3osCisJCQkgICAgICAgaW50ICplcnIpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0OworCXJlc291cmNlX3NpemVfdCBzejsKKwl2b2lkIF9faW9tZW0gKnJldDsKKworCSplcnIgPSAwOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sIG5hbWUpOworCWlmICghcikKKwkJcmV0dXJuIE5VTEw7CisKKwlzeiA9IHJlc291cmNlX3NpemUocik7CisJaWYgKHN6ICE9IHNhbmVfc3opIHsKKwkJKmVyciA9IC1FSU5WQUw7CisJCXJldHVybiBOVUxMOworCX0KKworCXN0YXJ0ID0gci0+c3RhcnQ7CisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbihkZXYsIHN0YXJ0LCBzeiwgci0+bmFtZSkpIHsKKwkJKmVyciA9IC1FQlVTWTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gZGV2bV9pb3JlbWFwKGRldiwgc3RhcnQsIHN6KTsKKwlpZiAoIXJldCkgeworCQkqZXJyID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYmdwaW9fcGRldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHJlc291cmNlICpyOworCXZvaWQgX19pb21lbSAqZGF0OworCXZvaWQgX19pb21lbSAqc2V0OworCXZvaWQgX19pb21lbSAqY2xyOworCXZvaWQgX19pb21lbSAqZGlyb3V0OworCXZvaWQgX19pb21lbSAqZGlyaW47CisJdW5zaWduZWQgbG9uZyBzejsKKwlib29sIGJlOworCWludCBlcnI7CisJc3RydWN0IGJncGlvX2NoaXAgKmJnYzsKKwlzdHJ1Y3QgYmdwaW9fcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJkYXQiKTsKKwlpZiAoIXIpCisJCXJldHVybiAtRUlOVkFMOworCisJc3ogPSByZXNvdXJjZV9zaXplKHIpOworCisJZGF0ID0gYmdwaW9fbWFwKHBkZXYsICJkYXQiLCBzeiwgJmVycik7CisJaWYgKCFkYXQpCisJCXJldHVybiBlcnIgPyBlcnIgOiAtRUlOVkFMOworCisJc2V0ID0gYmdwaW9fbWFwKHBkZXYsICJzZXQiLCBzeiwgJmVycik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWNsciA9IGJncGlvX21hcChwZGV2LCAiY2xyIiwgc3osICZlcnIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkaXJvdXQgPSBiZ3Bpb19tYXAocGRldiwgImRpcm91dCIsIHN6LCAmZXJyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZGlyaW4gPSBiZ3Bpb19tYXAocGRldiwgImRpcmluIiwgc3osICZlcnIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwliZSA9ICFzdHJjbXAocGxhdGZvcm1fZ2V0X2RldmljZV9pZChwZGV2KS0+bmFtZSwgImJhc2ljLW1taW8tZ3Bpby1iZSIpOworCisJYmdjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqYmdjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiZ2MpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gYmdwaW9faW5pdChiZ2MsIGRldiwgc3osIGRhdCwgc2V0LCBjbHIsIGRpcm91dCwgZGlyaW4sIGJlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHBkYXRhKSB7CisJCWJnYy0+Z2MuYmFzZSA9IHBkYXRhLT5iYXNlOworCQlpZiAocGRhdGEtPm5ncGlvID4gMCkKKwkJCWJnYy0+Z2MubmdwaW8gPSBwZGF0YS0+bmdwaW87CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYmdjKTsKKworCXJldHVybiBncGlvY2hpcF9hZGQoJmJnYy0+Z2MpOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBiZ3Bpb19wZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJldHVybiBiZ3Bpb19yZW1vdmUoYmdjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgYmdwaW9faWRfdGFibGVbXSA9IHsKKwl7ICJiYXNpYy1tbWlvLWdwaW8iLCB9LAorCXsgImJhc2ljLW1taW8tZ3Bpby1iZSIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgYmdwaW9faWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiZ3Bpb19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYmFzaWMtbW1pby1ncGlvIiwKKwl9LAorCS5pZF90YWJsZSA9IGJncGlvX2lkX3RhYmxlLAorCS5wcm9iZSA9IGJncGlvX3BkZXZfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGJncGlvX3BkZXZfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJncGlvX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZiZ3Bpb19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYmdwaW9fcGxhdGZvcm1faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiZ3Bpb19wbGF0Zm9ybV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmJncGlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChiZ3Bpb19wbGF0Zm9ybV9leGl0KTsKKworI2VuZGlmIC8qIENPTkZJR19HUElPX0dFTkVSSUNfUExBVEZPUk0gKi8KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIGJhc2ljIG1lbW9yeS1tYXBwZWQgR1BJTyBjb250cm9sbGVycyIpOworTU9EVUxFX0FVVEhPUigiQW50b24gVm9yb250c292IDxjYm91YXRtYWlscnVAZ21haWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8taXQ4NzYxZS5jIGIvZHJpdmVycy9ncGlvL2dwaW8taXQ4NzYxZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGI4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1pdDg3NjFlLmMKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiAgR1BJTyBpbnRlcmZhY2UgZm9yIElUODc2MUUgU3VwZXIgSS9PIGNoaXAKKyAqCisgKiAgQXV0aG9yOiBEZW5pcyBUdXJpc2NoZXYgPGRlbmlzQGNvbXB1bGFiLmNvLmlsPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2RlZmluZSBTSU9fQ0hJUF9JRAkJMHg4NzYxCisjZGVmaW5lIENISVBfSURfSElHSF9CWVRFCTB4MjAKKyNkZWZpbmUgQ0hJUF9JRF9MT1dfQllURQkweDIxCisKK3N0YXRpYyB1OCBwb3J0c1syXSA9IHsgMHgyZSwgMHg0ZSB9Oworc3RhdGljIHU4IHBvcnQ7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2lvX2xvY2spOworCisjZGVmaW5lIEdQSU9fTkFNRQkJIml0ODc2MS1ncGlvIgorI2RlZmluZSBHUElPX0JBX0hJR0hfQllURQkweDYwCisjZGVmaW5lIEdQSU9fQkFfTE9XX0JZVEUJMHg2MQorI2RlZmluZSBHUElPX0lPU0laRQkJNAorI2RlZmluZSBHUElPMVhfSU8JCTB4ZjAKKyNkZWZpbmUgR1BJTzJYX0lPCQkweGYxCisKK3N0YXRpYyB1MTYgZ3Bpb19iYTsKKworc3RhdGljIHU4IHJlYWRfcmVnKHU4IGFkZHIsIHU4IHBvcnQpCit7CisJb3V0YihhZGRyLCBwb3J0KTsKKwlyZXR1cm4gaW5iKHBvcnQgKyAxKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfcmVnKHU4IGRhdGEsIHU4IGFkZHIsIHU4IHBvcnQpCit7CisJb3V0YihhZGRyLCBwb3J0KTsKKwlvdXRiKGRhdGEsIHBvcnQgKyAxKTsKK30KKworc3RhdGljIHZvaWQgZW50ZXJfY29uZl9tb2RlKHU4IHBvcnQpCit7CisJb3V0YigweDg3LCBwb3J0KTsKKwlvdXRiKDB4NjEsIHBvcnQpOworCW91dGIoMHg1NSwgcG9ydCk7CisJb3V0YigocG9ydCA9PSAweDJlKSA/IDB4NTUgOiAweGFhLCBwb3J0KTsKK30KKworc3RhdGljIHZvaWQgZXhpdF9jb25mX21vZGUodTggcG9ydCkKK3sKKwlvdXRiKDB4MiwgcG9ydCk7CisJb3V0YigweDIsIHBvcnQgKyAxKTsKK30KKworc3RhdGljIHZvaWQgZW50ZXJfZ3Bpb19tb2RlKHU4IHBvcnQpCit7CisJd3JpdGVfcmVnKDB4MiwgMHg3LCBwb3J0KTsKK30KKworc3RhdGljIGludCBpdDg3NjFlX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBncGlvX251bSkKK3sKKwl1MTYgcmVnOworCXU4IGJpdDsKKworCWJpdCA9IGdwaW9fbnVtICUgODsKKwlyZWcgPSAoZ3Bpb19udW0gPj0gOCkgPyBncGlvX2JhICsgMSA6IGdwaW9fYmE7CisKKwlyZXR1cm4gISEoaW5iKHJlZykgJiAoMSA8PCBiaXQpKTsKK30KKworc3RhdGljIGludCBpdDg3NjFlX2dwaW9fZGlyZWN0aW9uX2luKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBncGlvX251bSkKK3sKKwl1OCBjdXJyX2RpcnM7CisJdTggaW9fcmVnLCBiaXQ7CisKKwliaXQgPSBncGlvX251bSAlIDg7CisJaW9fcmVnID0gKGdwaW9fbnVtID49IDgpID8gR1BJTzJYX0lPIDogR1BJTzFYX0lPOworCisJc3Bpbl9sb2NrKCZzaW9fbG9jayk7CisKKwllbnRlcl9jb25mX21vZGUocG9ydCk7CisJZW50ZXJfZ3Bpb19tb2RlKHBvcnQpOworCisJY3Vycl9kaXJzID0gcmVhZF9yZWcoaW9fcmVnLCBwb3J0KTsKKworCWlmIChjdXJyX2RpcnMgJiAoMSA8PCBiaXQpKQorCQl3cml0ZV9yZWcoY3Vycl9kaXJzICYgfigxIDw8IGJpdCksIGlvX3JlZywgcG9ydCk7CisKKwlleGl0X2NvbmZfbW9kZShwb3J0KTsKKworCXNwaW5fdW5sb2NrKCZzaW9fbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGl0ODc2MWVfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCisJCQkJdW5zaWduZWQgZ3Bpb19udW0sIGludCB2YWwpCit7CisJdTggY3Vycl92YWxzLCBiaXQ7CisJdTE2IHJlZzsKKworCWJpdCA9IGdwaW9fbnVtICUgODsKKwlyZWcgPSAoZ3Bpb19udW0gPj0gOCkgPyBncGlvX2JhICsgMSA6IGdwaW9fYmE7CisKKwlzcGluX2xvY2soJnNpb19sb2NrKTsKKworCWN1cnJfdmFscyA9IGluYihyZWcpOworCWlmICh2YWwpCisJCW91dGIoY3Vycl92YWxzIHwgKDEgPDwgYml0KSAsIHJlZyk7CisJZWxzZQorCQlvdXRiKGN1cnJfdmFscyAmIH4oMSA8PCBiaXQpLCByZWcpOworCisJc3Bpbl91bmxvY2soJnNpb19sb2NrKTsKK30KKworc3RhdGljIGludCBpdDg3NjFlX2dwaW9fZGlyZWN0aW9uX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKKwkJCQkJdW5zaWduZWQgZ3Bpb19udW0sIGludCB2YWwpCit7CisJdTggY3Vycl9kaXJzLCBpb19yZWcsIGJpdDsKKworCWJpdCA9IGdwaW9fbnVtICUgODsKKwlpb19yZWcgPSAoZ3Bpb19udW0gPj0gOCkgPyBHUElPMlhfSU8gOiBHUElPMVhfSU87CisKKwlpdDg3NjFlX2dwaW9fc2V0KGdjLCBncGlvX251bSwgdmFsKTsKKworCXNwaW5fbG9jaygmc2lvX2xvY2spOworCisJZW50ZXJfY29uZl9tb2RlKHBvcnQpOworCWVudGVyX2dwaW9fbW9kZShwb3J0KTsKKworCWN1cnJfZGlycyA9IHJlYWRfcmVnKGlvX3JlZywgcG9ydCk7CisKKwlpZiAoIShjdXJyX2RpcnMgJiAoMSA8PCBiaXQpKSkKKwkJd3JpdGVfcmVnKGN1cnJfZGlycyB8ICgxIDw8IGJpdCksIGlvX3JlZywgcG9ydCk7CisKKwlleGl0X2NvbmZfbW9kZShwb3J0KTsKKworCXNwaW5fdW5sb2NrKCZzaW9fbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIGl0ODc2MWVfZ3Bpb19jaGlwID0geworCS5sYWJlbAkJCT0gR1BJT19OQU1FLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmdldAkJCT0gaXQ4NzYxZV9ncGlvX2dldCwKKwkuZGlyZWN0aW9uX2lucHV0CT0gaXQ4NzYxZV9ncGlvX2RpcmVjdGlvbl9pbiwKKwkuc2V0CQkJPSBpdDg3NjFlX2dwaW9fc2V0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gaXQ4NzYxZV9ncGlvX2RpcmVjdGlvbl9vdXQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpdDg3NjFlX2dwaW9faW5pdCh2b2lkKQoreworCWludCBpLCBpZCwgZXJyOworCisJLyogY2hpcCBhbmQgcG9ydCBkZXRlY3Rpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3J0cyk7IGkrKykgeworCQlzcGluX2xvY2soJnNpb19sb2NrKTsKKwkJZW50ZXJfY29uZl9tb2RlKHBvcnRzW2ldKTsKKworCQlpZCA9IChyZWFkX3JlZyhDSElQX0lEX0hJR0hfQllURSwgcG9ydHNbaV0pIDw8IDgpICsKKwkJCQlyZWFkX3JlZyhDSElQX0lEX0xPV19CWVRFLCBwb3J0c1tpXSk7CisKKwkJZXhpdF9jb25mX21vZGUocG9ydHNbaV0pOworCQlzcGluX3VubG9jaygmc2lvX2xvY2spOworCisJCWlmIChpZCA9PSBTSU9fQ0hJUF9JRCkgeworCQkJcG9ydCA9IHBvcnRzW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXBvcnQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogZmV0Y2ggR1BJTyBiYXNlIGFkZHJlc3MgKi8KKwllbnRlcl9jb25mX21vZGUocG9ydCk7CisJZW50ZXJfZ3Bpb19tb2RlKHBvcnQpOworCWdwaW9fYmEgPSAocmVhZF9yZWcoR1BJT19CQV9ISUdIX0JZVEUsIHBvcnQpIDw8IDgpICsKKwkJCQlyZWFkX3JlZyhHUElPX0JBX0xPV19CWVRFLCBwb3J0KTsKKwlleGl0X2NvbmZfbW9kZShwb3J0KTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oZ3Bpb19iYSwgR1BJT19JT1NJWkUsIEdQSU9fTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpdDg3NjFlX2dwaW9fY2hpcC5iYXNlID0gLTE7CisJaXQ4NzYxZV9ncGlvX2NoaXAubmdwaW8gPSAxNjsKKworCWVyciA9IGdwaW9jaGlwX2FkZCgmaXQ4NzYxZV9ncGlvX2NoaXApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGdwaW9jaGlwX2FkZF9lcnI7CisKKwlyZXR1cm4gMDsKKworZ3Bpb2NoaXBfYWRkX2VycjoKKwlyZWxlYXNlX3JlZ2lvbihncGlvX2JhLCBHUElPX0lPU0laRSk7CisJZ3Bpb19iYSA9IDA7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGl0ODc2MWVfZ3Bpb19leGl0KHZvaWQpCit7CisJaWYgKGdwaW9fYmEpIHsKKwkJaW50IHJldCA9IGdwaW9jaGlwX3JlbW92ZSgmaXQ4NzYxZV9ncGlvX2NoaXApOworCisJCVdBUk4ocmV0LCAiJXMoKTogZ3Bpb2NoaXBfcmVtb3ZlKCkgZmFpbGVkLCByZXQ9JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisKKwkJcmVsZWFzZV9yZWdpb24oZ3Bpb19iYSwgR1BJT19JT1NJWkUpOworCQlncGlvX2JhID0gMDsKKwl9Cit9Cittb2R1bGVfaW5pdChpdDg3NjFlX2dwaW9faW5pdCk7Cittb2R1bGVfZXhpdChpdDg3NjFlX2dwaW9fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkRlbmlzIFR1cmlzY2hldiA8ZGVuaXNAY29tcHVsYWIuY28uaWw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdQSU8gaW50ZXJmYWNlIGZvciBJVDg3NjFFIFN1cGVyIEkvTyBjaGlwIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vamFuei10dGwuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWphbnotdHRsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvZ3Bpby9qYW56LXR0bC5jCnJlbmFtZSB0byBkcml2ZXJzL2dwaW8vZ3Bpby1qYW56LXR0bC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1sYW5nd2VsbC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbGFuZ3dlbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmViNTdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbGFuZ3dlbGwuYwpAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqIE1vb3Jlc3Rvd24gcGxhdGZvcm0gTGFuZ3dlbGwgY2hpcCBHUElPIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMDksICBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBTdXBwb3J0czoKKyAqIE1vb3Jlc3Rvd24gcGxhdGZvcm0gTGFuZ3dlbGwgY2hpcC4KKyAqIE1lZGZpZWxkIHBsYXRmb3JtIFBlbndlbGwgY2hpcC4KKyAqIFdoaXRuZXkgcG9pbnQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisKKy8qCisgKiBMYW5nd2VsbCBjaGlwIGhhcyA2NCBwaW5zIGFuZCB0aHVzIHRoZXJlIGFyZSAyIDMyYml0IHJlZ2lzdGVycyB0byBjb250cm9sCisgKiBlYWNoIGZlYXR1cmUsIHdoaWxlIFBlbndlbGwgY2hpcCBoYXMgOTYgcGlucyBmb3IgZWFjaCBibG9jaywgYW5kIG5lZWQgMyAzMmJpdAorICogcmVnaXN0ZXJzIHRvIGNvbnRyb2wgdGhlbSwgc28gd2Ugb25seSBkZWZpbmUgdGhlIG9yZGVyIGhlcmUgaW5zdGVhZCBvZiBhCisgKiBzdHJ1Y3R1cmUsIHRvIGdldCBhIGJpdCBvZmZzZXQgZm9yIGEgcGluICh1c2UgR1BEUiBhcyBhbiBleGFtcGxlKToKKyAqCisgKiBucmVnID0gbmdwaW8gLyAzMjsKKyAqIHJlZyA9IG9mZnNldCAvIDMyOworICogYml0ID0gb2Zmc2V0ICUgMzI7CisgKiByZWdfYWRkciA9IHJlZ19iYXNlICsgR1BEUiAqIG5yZWcgKiA0ICsgcmVnICogNDsKKyAqCisgKiBzbyB0aGUgYml0IG9mIHJlZ19hZGRyIGlzIHRvIGNvbnRyb2wgcGluIG9mZnNldCdzIEdQRFIgZmVhdHVyZQorKi8KKworZW51bSBHUElPX1JFRyB7CisJR1BMUiA9IDAsCS8qIHBpbiBsZXZlbCByZWFkLW9ubHkgKi8KKwlHUERSLAkJLyogcGluIGRpcmVjdGlvbiAqLworCUdQU1IsCQkvKiBwaW4gc2V0ICovCisJR1BDUiwJCS8qIHBpbiBjbGVhciAqLworCUdSRVIsCQkvKiByaXNpbmcgZWRnZSBkZXRlY3QgKi8KKwlHRkVSLAkJLyogZmFsbGluZyBlZGdlIGRldGVjdCAqLworCUdFRFIsCQkvKiBlZGdlIGRldGVjdCByZXN1bHQgKi8KK307CisKK3N0cnVjdCBsbndfZ3BpbyB7CisJc3RydWN0IGdwaW9fY2hpcAkJY2hpcDsKKwl2b2lkCQkJCSpyZWdfYmFzZTsKKwlzcGlubG9ja190CQkJbG9jazsKKwl1bnNpZ25lZAkJCWlycV9iYXNlOworCXN0cnVjdCBwY2lfZGV2CQkJKnBkZXY7Cit9OworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpncGlvX3JlZyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCisJCQllbnVtIEdQSU9fUkVHIHJlZ190eXBlKQoreworCXN0cnVjdCBsbndfZ3BpbyAqbG53ID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBsbndfZ3BpbywgY2hpcCk7CisJdW5zaWduZWQgbnJlZyA9IGNoaXAtPm5ncGlvIC8gMzI7CisJdTggcmVnID0gb2Zmc2V0IC8gMzI7CisJdm9pZCBfX2lvbWVtICpwdHI7CisKKwlwdHIgPSAodm9pZCBfX2lvbWVtICopKGxudy0+cmVnX2Jhc2UgKyByZWdfdHlwZSAqIG5yZWcgKiA0ICsgcmVnICogNCk7CisJcmV0dXJuIHB0cjsKK30KKworc3RhdGljIGludCBsbndfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXZvaWQgX19pb21lbSAqZ3BsciA9IGdwaW9fcmVnKGNoaXAsIG9mZnNldCwgR1BMUik7CisKKwlyZXR1cm4gcmVhZGwoZ3BscikgJiBCSVQob2Zmc2V0ICUgMzIpOworfQorCitzdGF0aWMgdm9pZCBsbndfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJdm9pZCBfX2lvbWVtICpncHNyLCAqZ3BjcjsKKworCWlmICh2YWx1ZSkgeworCQlncHNyID0gZ3Bpb19yZWcoY2hpcCwgb2Zmc2V0LCBHUFNSKTsKKwkJd3JpdGVsKEJJVChvZmZzZXQgJSAzMiksIGdwc3IpOworCX0gZWxzZSB7CisJCWdwY3IgPSBncGlvX3JlZyhjaGlwLCBvZmZzZXQsIEdQQ1IpOworCQl3cml0ZWwoQklUKG9mZnNldCAlIDMyKSwgZ3Bjcik7CisJfQorfQorCitzdGF0aWMgaW50IGxud19ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGxud19ncGlvICpsbncgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGxud19ncGlvLCBjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmdwZHIgPSBncGlvX3JlZyhjaGlwLCBvZmZzZXQsIEdQRFIpOworCXUzMiB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGxudy0+cGRldikKKwkJcG1fcnVudGltZV9nZXQoJmxudy0+cGRldi0+ZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsbnctPmxvY2ssIGZsYWdzKTsKKwl2YWx1ZSA9IHJlYWRsKGdwZHIpOworCXZhbHVlICY9IH5CSVQob2Zmc2V0ICUgMzIpOworCXdyaXRlbCh2YWx1ZSwgZ3Bkcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG53LT5sb2NrLCBmbGFncyk7CisKKwlpZiAobG53LT5wZGV2KQorCQlwbV9ydW50aW1lX3B1dCgmbG53LT5wZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG53X2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGxud19ncGlvICpsbncgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGxud19ncGlvLCBjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmdwZHIgPSBncGlvX3JlZyhjaGlwLCBvZmZzZXQsIEdQRFIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsbndfZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7CisKKwlpZiAobG53LT5wZGV2KQorCQlwbV9ydW50aW1lX2dldCgmbG53LT5wZGV2LT5kZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxudy0+bG9jaywgZmxhZ3MpOworCXZhbHVlID0gcmVhZGwoZ3Bkcik7CisJdmFsdWUgfD0gQklUKG9mZnNldCAlIDMyKTsKKwl3cml0ZWwodmFsdWUsIGdwZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxudy0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxudy0+cGRldikKKwkJcG1fcnVudGltZV9wdXQoJmxudy0+cGRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxud19ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGxud19ncGlvICpsbncgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGxud19ncGlvLCBjaGlwKTsKKwlyZXR1cm4gbG53LT5pcnFfYmFzZSArIG9mZnNldDsKK30KKworc3RhdGljIGludCBsbndfaXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCB0eXBlKQoreworCXN0cnVjdCBsbndfZ3BpbyAqbG53ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdTMyIGdwaW8gPSBkLT5pcnEgLSBsbnctPmlycV9iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbHVlOworCXZvaWQgX19pb21lbSAqZ3JlciA9IGdwaW9fcmVnKCZsbnctPmNoaXAsIGdwaW8sIEdSRVIpOworCXZvaWQgX19pb21lbSAqZ2ZlciA9IGdwaW9fcmVnKCZsbnctPmNoaXAsIGdwaW8sIEdGRVIpOworCisJaWYgKGdwaW8gPj0gbG53LT5jaGlwLm5ncGlvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsbnctPnBkZXYpCisJCXBtX3J1bnRpbWVfZ2V0KCZsbnctPnBkZXYtPmRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG53LT5sb2NrLCBmbGFncyk7CisJaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX1JJU0lORykKKwkJdmFsdWUgPSByZWFkbChncmVyKSB8IEJJVChncGlvICUgMzIpOworCWVsc2UKKwkJdmFsdWUgPSByZWFkbChncmVyKSAmICh+QklUKGdwaW8gJSAzMikpOworCXdyaXRlbCh2YWx1ZSwgZ3Jlcik7CisKKwlpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfRkFMTElORykKKwkJdmFsdWUgPSByZWFkbChnZmVyKSB8IEJJVChncGlvICUgMzIpOworCWVsc2UKKwkJdmFsdWUgPSByZWFkbChnZmVyKSAmICh+QklUKGdwaW8gJSAzMikpOworCXdyaXRlbCh2YWx1ZSwgZ2Zlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG53LT5sb2NrLCBmbGFncyk7CisKKwlpZiAobG53LT5wZGV2KQorCQlwbV9ydW50aW1lX3B1dCgmbG53LT5wZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxud19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKK30KKworc3RhdGljIHZvaWQgbG53X2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBsbndfaXJxY2hpcCA9IHsKKwkubmFtZQkJPSAiTE5XLUdQSU8iLAorCS5pcnFfbWFzawk9IGxud19pcnFfbWFzaywKKwkuaXJxX3VubWFzawk9IGxud19pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUJPSBsbndfaXJxX3R5cGUsCit9OworCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUobG53X2dwaW9faWRzKSA9IHsgICAvKiBwaW4gbnVtYmVyICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDgwZiksIC5kcml2ZXJfZGF0YSA9IDY0IH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDgxZiksIC5kcml2ZXJfZGF0YSA9IDk2IH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDgxYSksIC5kcml2ZXJfZGF0YSA9IDk2IH0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGxud19ncGlvX2lkcyk7CisKK3N0YXRpYyB2b2lkIGxud19pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEgPSBpcnFfZGVzY19nZXRfaXJxX2RhdGEoZGVzYyk7CisJc3RydWN0IGxud19ncGlvICpsbncgPSBpcnFfZGF0YV9nZXRfaXJxX2hhbmRsZXJfZGF0YShkYXRhKTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXAoZGF0YSk7CisJdTMyIGJhc2UsIGdwaW8sIG1hc2s7CisJdW5zaWduZWQgbG9uZyBwZW5kaW5nOworCXZvaWQgX19pb21lbSAqZ2VkcjsKKworCS8qIGNoZWNrIEdQSU8gY29udHJvbGxlciB0byBjaGVjayB3aGljaCBwaW4gdHJpZ2dlcmVkIHRoZSBpbnRlcnJ1cHQgKi8KKwlmb3IgKGJhc2UgPSAwOyBiYXNlIDwgbG53LT5jaGlwLm5ncGlvOyBiYXNlICs9IDMyKSB7CisJCWdlZHIgPSBncGlvX3JlZygmbG53LT5jaGlwLCBiYXNlLCBHRURSKTsKKwkJcGVuZGluZyA9IHJlYWRsKGdlZHIpOworCQl3aGlsZSAocGVuZGluZykgeworCQkJZ3BpbyA9IF9fZmZzKHBlbmRpbmcpOworCQkJbWFzayA9IEJJVChncGlvKTsKKwkJCXBlbmRpbmcgJj0gfm1hc2s7CisJCQkvKiBDbGVhciBiZWZvcmUgaGFuZGxpbmcgc28gd2UgY2FuJ3QgbG9zZSBhbiBlZGdlICovCisJCQl3cml0ZWwobWFzaywgZ2Vkcik7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEobG53LT5pcnFfYmFzZSArIGJhc2UgKyBncGlvKTsKKwkJfQorCX0KKworCWNoaXAtPmlycV9lb2koZGF0YSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgbG53X2dwaW9fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxud19ncGlvX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG53X2dwaW9fcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyID0gcG1fc2NoZWR1bGVfc3VzcGVuZChkZXYsIDUwMCk7CisKKwlpZiAoIWVycikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVCVVNZOworfQorCisjZWxzZQorI2RlZmluZSBsbndfZ3Bpb19ydW50aW1lX3N1c3BlbmQJTlVMTAorI2RlZmluZSBsbndfZ3Bpb19ydW50aW1lX3Jlc3VtZQkJTlVMTAorI2RlZmluZSBsbndfZ3Bpb19ydW50aW1lX2lkbGUJCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgbG53X2dwaW9fcG1fb3BzID0geworCS5ydW50aW1lX3N1c3BlbmQgPSBsbndfZ3Bpb19ydW50aW1lX3N1c3BlbmQsCisJLnJ1bnRpbWVfcmVzdW1lID0gbG53X2dwaW9fcnVudGltZV9yZXN1bWUsCisJLnJ1bnRpbWVfaWRsZSA9IGxud19ncGlvX3J1bnRpbWVfaWRsZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxud19ncGlvX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXZvaWQgKmJhc2U7CisJaW50IGk7CisJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCBsZW47CisJc3RydWN0IGxud19ncGlvICpsbnc7CisJdTMyIGlycV9iYXNlOworCXUzMiBncGlvX2Jhc2U7CisJaW50IHJldHZhbCA9IDA7CisKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGRvbmU7CisKKwlyZXR2YWwgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJsYW5nd2VsbF9ncGlvIik7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlcnJvciByZXF1ZXN0aW5nIHJlc291cmNlc1xuIik7CisJCWdvdG8gZXJyMjsKKwl9CisJLyogZ2V0IHRoZSBpcnFfYmFzZSBmcm9tIGJhcjEgKi8KKwlzdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwlsZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOworCWJhc2UgPSBpb3JlbWFwX25vY2FjaGUoc3RhcnQsIGxlbik7CisJaWYgKCFiYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImVycm9yIG1hcHBpbmcgYmFyMVxuIik7CisJCWdvdG8gZXJyMzsKKwl9CisJaXJxX2Jhc2UgPSAqKHUzMiAqKWJhc2U7CisJZ3Bpb19iYXNlID0gKigodTMyICopYmFzZSArIDEpOworCS8qIHJlbGVhc2UgdGhlIElPIG1hcHBpbmcsIHNpbmNlIHdlIGFscmVhZHkgZ2V0IHRoZSBpbmZvIGZyb20gYmFyMSAqLworCWlvdW5tYXAoYmFzZSk7CisJLyogZ2V0IHRoZSByZWdpc3RlciBiYXNlIGZyb20gYmFyMCAqLworCXN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWxlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisJYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShzdGFydCwgbGVuKTsKKwlpZiAoIWJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZXJyb3IgbWFwcGluZyBiYXIwXG4iKTsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byBlcnIzOworCX0KKworCWxudyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsbndfZ3BpbyksIEdGUF9LRVJORUwpOworCWlmICghbG53KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGFsbG9jYXRlIGxhbmd3ZWxsX2dwaW8gY2hpcCBkYXRhXG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnI0OworCX0KKwlsbnctPnJlZ19iYXNlID0gYmFzZTsKKwlsbnctPmlycV9iYXNlID0gaXJxX2Jhc2U7CisJbG53LT5jaGlwLmxhYmVsID0gZGV2X25hbWUoJnBkZXYtPmRldik7CisJbG53LT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IGxud19ncGlvX2RpcmVjdGlvbl9pbnB1dDsKKwlsbnctPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IGxud19ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJbG53LT5jaGlwLmdldCA9IGxud19ncGlvX2dldDsKKwlsbnctPmNoaXAuc2V0ID0gbG53X2dwaW9fc2V0OworCWxudy0+Y2hpcC50b19pcnEgPSBsbndfZ3Bpb190b19pcnE7CisJbG53LT5jaGlwLmJhc2UgPSBncGlvX2Jhc2U7CisJbG53LT5jaGlwLm5ncGlvID0gaWQtPmRyaXZlcl9kYXRhOworCWxudy0+Y2hpcC5jYW5fc2xlZXAgPSAwOworCWxudy0+cGRldiA9IHBkZXY7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGxudyk7CisJcmV0dmFsID0gZ3Bpb2NoaXBfYWRkKCZsbnctPmNoaXApOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibGFuZ3dlbGwgZ3Bpb2NoaXBfYWRkIGVycm9yICVkXG4iLCByZXR2YWwpOworCQlnb3RvIGVycjU7CisJfQorCWlycV9zZXRfaGFuZGxlcl9kYXRhKHBkZXYtPmlycSwgbG53KTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwZGV2LT5pcnEsIGxud19pcnFfaGFuZGxlcik7CisJZm9yIChpID0gMDsgaSA8IGxudy0+Y2hpcC5uZ3BpbzsgaSsrKSB7CisJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGkgKyBsbnctPmlycV9iYXNlLCAmbG53X2lycWNoaXAsCisJCQkJCSAgICAgIGhhbmRsZV9zaW1wbGVfaXJxLCAiZGVtdXgiKTsKKwkJaXJxX3NldF9jaGlwX2RhdGEoaSArIGxudy0+aXJxX2Jhc2UsIGxudyk7CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmxudy0+bG9jayk7CisKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9hbGxvdygmcGRldi0+ZGV2KTsKKworCWdvdG8gZG9uZTsKK2VycjU6CisJa2ZyZWUobG53KTsKK2VycjQ6CisJaW91bm1hcChiYXNlKTsKK2VycjM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2VycjI6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZG9uZToKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbG53X2dwaW9fZHJpdmVyID0geworCS5uYW1lCQk9ICJsYW5nd2VsbF9ncGlvIiwKKwkuaWRfdGFibGUJPSBsbndfZ3Bpb19pZHMsCisJLnByb2JlCQk9IGxud19ncGlvX3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkucG0JPSAmbG53X2dwaW9fcG1fb3BzLAorCX0sCit9OworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdwX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbG53X2dwaW8gKmxudzsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJjOworCWludCByZXR2YWwgPSAwOworCisJcmMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmMpCisJCXJldHVybiAtRUlOVkFMOworCisJbG53ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxud19ncGlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsbncpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJImNhbid0IGFsbG9jYXRlIHdoaXRuZXlwb2ludF9ncGlvIGNoaXAgZGF0YVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlsbnctPnJlZ19iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJjLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyYykpOworCWlmIChsbnctPnJlZ19iYXNlID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBlcnJfa21hbGxvYzsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmxudy0+bG9jayk7CisJZ2MgPSAmbG53LT5jaGlwOworCWdjLT5sYWJlbCA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCWdjLT5vd25lciA9IFRISVNfTU9EVUxFOworCWdjLT5kaXJlY3Rpb25faW5wdXQgPSBsbndfZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CisJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBsbndfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCWdjLT5nZXQgPSBsbndfZ3Bpb19nZXQ7CisJZ2MtPnNldCA9IGxud19ncGlvX3NldDsKKwlnYy0+dG9faXJxID0gTlVMTDsKKwlnYy0+YmFzZSA9IDA7CisJZ2MtPm5ncGlvID0gNjQ7CisJZ2MtPmNhbl9zbGVlcCA9IDA7CisJcmV0dmFsID0gZ3Bpb2NoaXBfYWRkKGdjKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIndoaXRuZXlwb2ludCBncGlvY2hpcF9hZGQgZXJyb3IgJWRcbiIsCisJCQkJCQkJCXJldHZhbCk7CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGxudyk7CisJcmV0dXJuIDA7CitlcnJfaW9yZW1hcDoKKwlpb3VubWFwKGxudy0+cmVnX2Jhc2UpOworZXJyX2ttYWxsb2M6CisJa2ZyZWUobG53KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB3cF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBsbndfZ3BpbyAqbG53ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGVycjsKKwllcnIgPSBncGlvY2hpcF9yZW1vdmUoJmxudy0+Y2hpcCk7CisJaWYgKGVycikKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlbW92ZSBncGlvX2NoaXAuXG4iKTsKKwlpb3VubWFwKGxudy0+cmVnX2Jhc2UpOworCWtmcmVlKGxudyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdwX2dwaW9fZHJpdmVyID0geworCS5wcm9iZQkJPSB3cF9ncGlvX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aod3BfZ3Bpb19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ3cF9ncGlvIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxud19ncGlvX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9ICBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZsbndfZ3Bpb19kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd3BfZ3Bpb19kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmxud19ncGlvX2RyaXZlcik7CisJcmV0dXJuIHJldDsKK30KKworZGV2aWNlX2luaXRjYWxsKGxud19ncGlvX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbWF4NzMwMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbWF4NzMwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Y2EwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tYXg3MzAwLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBXb2xmcmFtIFNhbmcsIFBlbmd1dHJvbml4CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDaGVjayBtYXg3MzB4LmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL21heDczMDEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKK3N0YXRpYyBpbnQgbWF4NzMwMF9pMmNfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJCXVuc2lnbmVkIGludCB2YWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50IG1heDczMDBfaTJjX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbWF4NzMwMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbWF4NzMwMSAqdHM7CisJaW50IHJldDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJcmV0dXJuIC1FSU87CisKKwl0cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtYXg3MzAxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cy0+cmVhZCA9IG1heDczMDBfaTJjX3JlYWQ7CisJdHMtPndyaXRlID0gbWF4NzMwMF9pMmNfd3JpdGU7CisJdHMtPmRldiA9ICZjbGllbnQtPmRldjsKKworCXJldCA9IF9fbWF4NzMweF9wcm9iZSh0cyk7CisJaWYgKHJldCkKKwkJa2ZyZWUodHMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1heDczMDBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIF9fbWF4NzMweF9yZW1vdmUoJmNsaWVudC0+ZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1heDczMDBfaWRbXSA9IHsKKwl7ICJtYXg3MzAwIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtYXg3MzAwX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1heDczMDBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1heDczMDAiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IG1heDczMDBfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG1heDczMDBfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBtYXg3MzAwX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWF4NzMwMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtYXg3MzAwX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwobWF4NzMwMF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1heDczMDBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZtYXg3MzAwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtYXg3MzAwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJXb2xmcmFtIFNhbmciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUFYNzMwMCBHUElPLUV4cGFuZGVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1tYXg3MzAxLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tYXg3MzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxYWNmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1heDczMDEuYwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBKdWVyZ2VuIEJlaXNlcnQsIFBlbmd1dHJvbml4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR3Vlbm5hZGkgTGlha2hvdmV0c2tpLCBQZW5ndXRyb25peAorICogQ29weXJpZ2h0IChDKSAyMDA5IFdvbGZyYW0gU2FuZywgUGVuZ3V0cm9uaXgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIENoZWNrIG1heDczMHguYyBmb3IgZnVydGhlciBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9tYXg3MzAxLmg+CisKKy8qIEEgd3JpdGUgdG8gdGhlIE1BWDczMDEgbWVhbnMgb25lIG1lc3NhZ2Ugd2l0aCBvbmUgdHJhbnNmZXIgKi8KK3N0YXRpYyBpbnQgbWF4NzMwMV9zcGlfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJCXVuc2lnbmVkIGludCB2YWwpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwl1MTYgd29yZCA9ICgocmVnICYgMHg3RikgPDwgOCkgfCAodmFsICYgMHhGRik7CisKKwlyZXR1cm4gc3BpX3dyaXRlKHNwaSwgKGNvbnN0IHU4ICopJndvcmQsIHNpemVvZih3b3JkKSk7Cit9CisKKy8qIEEgcmVhZCBmcm9tIHRoZSBNQVg3MzAxIG1lYW5zIHR3byB0cmFuc2ZlcnM7IGhlcmUsIG9uZSBtZXNzYWdlIGVhY2ggKi8KKworc3RhdGljIGludCBtYXg3MzAxX3NwaV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlpbnQgcmV0OworCXUxNiB3b3JkOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisKKwl3b3JkID0gMHg4MDAwIHwgKHJlZyA8PCA4KTsKKwlyZXQgPSBzcGlfd3JpdGUoc3BpLCAoY29uc3QgdTggKikmd29yZCwgc2l6ZW9mKHdvcmQpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCS8qCisJICogVGhpcyByZWxpZXMgb24gdGhlIGZhY3QsIHRoYXQgYSB0cmFuc2ZlciB3aXRoIE5VTEwgdHhfYnVmIHNoaWZ0cyBvdXQKKwkgKiB6ZXJvIGJ5dGVzICg9Tk9PUCBmb3IgTUFYNzMwMSkKKwkgKi8KKwlyZXQgPSBzcGlfcmVhZChzcGksICh1OCAqKSZ3b3JkLCBzaXplb2Yod29yZCkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHdvcmQgJiAweGZmOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYXg3MzAxX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IG1heDczMDEgKnRzOworCWludCByZXQ7CisKKwkvKiBiaXRzX3Blcl93b3JkIGNhbm5vdCBiZSBjb25maWd1cmVkIGluIHBsYXRmb3JtIGRhdGEgKi8KKwlzcGktPmJpdHNfcGVyX3dvcmQgPSAxNjsKKwlyZXQgPSBzcGlfc2V0dXAoc3BpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXRzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1heDczMDEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRzLT5yZWFkID0gbWF4NzMwMV9zcGlfcmVhZDsKKwl0cy0+d3JpdGUgPSBtYXg3MzAxX3NwaV93cml0ZTsKKwl0cy0+ZGV2ID0gJnNwaS0+ZGV2OworCisJcmV0ID0gX19tYXg3MzB4X3Byb2JlKHRzKTsKKwlpZiAocmV0KQorCQlrZnJlZSh0cyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWF4NzMwMV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gX19tYXg3MzB4X3JlbW92ZSgmc3BpLT5kZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgbWF4NzMwMV9pZFtdID0geworCXsgIm1heDczMDEiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIG1heDczMDFfaWQpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgbWF4NzMwMV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibWF4NzMwMSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gbWF4NzMwMV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobWF4NzMwMV9yZW1vdmUpLAorCS5pZF90YWJsZSA9IG1heDczMDFfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtYXg3MzAxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmbWF4NzMwMV9kcml2ZXIpOworfQorLyogcmVnaXN0ZXIgYWZ0ZXIgc3BpIHBvc3Rjb3JlIGluaXRjYWxsIGFuZCBiZWZvcmUKKyAqIHN1YnN5cyBpbml0Y2FsbHMgdGhhdCBtYXkgcmVseSBvbiB0aGVzZSBHUElPcworICovCitzdWJzeXNfaW5pdGNhbGwobWF4NzMwMV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1heDczMDFfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmbWF4NzMwMV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobWF4NzMwMV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSnVlcmdlbiBCZWlzZXJ0LCBXb2xmcmFtIFNhbmciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUFYNzMwMSBHUElPLUV4cGFuZGVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1tYXg3MzB4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tYXg3MzB4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlMmRhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1heDczMHguYwpAQCAtMCwwICsxLDI1NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSnVlcmdlbiBCZWlzZXJ0LCBQZW5ndXRyb25peAorICogQ29weXJpZ2h0IChDKSAyMDA4IEd1ZW5uYWRpIExpYWtob3ZldHNraSwgUGVuZ3V0cm9uaXgKKyAqIENvcHlyaWdodCAoQykgMjAwOSBXb2xmcmFtIFNhbmcsIFBlbmd1dHJvbml4CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGUgTWF4aW0gTUFYNzMwMC8xIGRldmljZSBpcyBhbiBJMkMvU1BJIGRyaXZlbiBHUElPIGV4cGFuZGVyLiBUaGVyZSBhcmUKKyAqIDI4IEdQSU9zLiA4IG9mIHRoZW0gY2FuIHRyaWdnZXIgYW4gaW50ZXJydXB0LiBTZWUgZGF0YXNoZWV0IGZvciBtb3JlCisgKiBkZXRhaWxzCisgKiBOb3RlOgorICogLSBESU4gbXVzdCBiZSBzdGFibGUgYXQgdGhlIHJpc2luZyBlZGdlIG9mIGNsb2NrLgorICogLSB3aGVuIHdyaXRpbmc6CisgKiAgIC0gYWx3YXlzIGNsb2NrIGluIDE2IGNsb2NrcyBhdCBvbmNlCisgKiAgIC0gYXQgRElOOiBEMTUgZmlyc3QsIEQwIGxhc3QKKyAqICAgLSBEMC4uRDcgPSBkYXRhYnl0ZSwgRDguLkQxNCA9IGNvbW1hbmRieXRlCisgKiAgIC0gRDE1ID0gbG93IC0+IHdyaXRlIGNvbW1hbmQKKyAqIC0gd2hlbiByZWFkaW5nCisgKiAgIC0gYWx3YXlzIGNsb2NrIGluIDE2IGNsb2NrcyBhdCBvbmNlCisgKiAgIC0gYXQgRElOOiBEMTUgZmlyc3QsIEQwIGxhc3QKKyAqICAgLSBEMC4uRDcgPSBkdW1teSwgRDguLkQxNCA9IHJlZ2lzdGVyIGFkZHJlc3MKKyAqICAgLSBEMTUgPSBoaWdoIC0+IHJlYWQgY29tbWFuZAorICogICAtIHJhaXNlIENTIGFuZCBhc3NlcnQgaXQgYWdhaW4KKyAqICAgLSBhbHdheXMgY2xvY2sgaW4gMTYgY2xvY2tzIGF0IG9uY2UKKyAqICAgLSBhdCBET1VUOiBEMTUgZmlyc3QsIEQwIGxhc3QKKyAqICAgLSBEMC4uRDcgY29udGFpbnMgdGhlIGRhdGEgZnJvbSB0aGUgZmlyc3QgY3ljbGUKKyAqCisgKiBUaGUgZHJpdmVyIGV4cG9ydHMgYSBzdGFuZGFyZCBncGlvY2hpcCBpbnRlcmZhY2UKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL21heDczMDEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKgorICogUGluIGNvbmZpZ3VyYXRpb25zLCBzZWUgTUFYNzMwMSBkYXRhc2hlZXQgcGFnZSA2CisgKi8KKyNkZWZpbmUgUElOX0NPTkZJR19NQVNLIDB4MDMKKyNkZWZpbmUgUElOX0NPTkZJR19JTl9QVUxMVVAgMHgwMworI2RlZmluZSBQSU5fQ09ORklHX0lOX1dPX1BVTExVUCAweDAyCisjZGVmaW5lIFBJTl9DT05GSUdfT1VUIDB4MDEKKworI2RlZmluZSBQSU5fTlVNQkVSIDI4CisKK3N0YXRpYyBpbnQgbWF4NzMwMV9kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBtYXg3MzAxICp0cyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbWF4NzMwMSwgY2hpcCk7CisJdTggKmNvbmZpZzsKKwl1OCBvZmZzZXRfYml0cywgcGluX2NvbmZpZzsKKwlpbnQgcmV0OworCisJLyogRmlyc3QgNCBwaW5zIGFyZSB1bnVzZWQgaW4gdGhlIGNvbnRyb2xsZXIgKi8KKwlvZmZzZXQgKz0gNDsKKwlvZmZzZXRfYml0cyA9IChvZmZzZXQgJiAzKSA8PCAxOworCisJY29uZmlnID0gJnRzLT5wb3J0X2NvbmZpZ1tvZmZzZXQgPj4gMl07CisKKwlpZiAodHMtPmlucHV0X3B1bGx1cF9hY3RpdmUgJiBCSVQob2Zmc2V0KSkKKwkJcGluX2NvbmZpZyA9IFBJTl9DT05GSUdfSU5fUFVMTFVQOworCWVsc2UKKwkJcGluX2NvbmZpZyA9IFBJTl9DT05GSUdfSU5fV09fUFVMTFVQOworCisJbXV0ZXhfbG9jaygmdHMtPmxvY2spOworCisJKmNvbmZpZyA9ICgqY29uZmlnICYgfihQSU5fQ09ORklHX01BU0sgPDwgb2Zmc2V0X2JpdHMpKQorCQkJICAgfCAocGluX2NvbmZpZyA8PCBvZmZzZXRfYml0cyk7CisKKwlyZXQgPSB0cy0+d3JpdGUodHMtPmRldiwgMHgwOCArIChvZmZzZXQgPj4gMiksICpjb25maWcpOworCisJbXV0ZXhfdW5sb2NrKCZ0cy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fbWF4NzMwMV9zZXQoc3RydWN0IG1heDczMDEgKnRzLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlpZiAodmFsdWUpIHsKKwkJdHMtPm91dF9sZXZlbCB8PSAxIDw8IG9mZnNldDsKKwkJcmV0dXJuIHRzLT53cml0ZSh0cy0+ZGV2LCAweDIwICsgb2Zmc2V0LCAweDAxKTsKKwl9IGVsc2UgeworCQl0cy0+b3V0X2xldmVsICY9IH4oMSA8PCBvZmZzZXQpOworCQlyZXR1cm4gdHMtPndyaXRlKHRzLT5kZXYsIDB4MjAgKyBvZmZzZXQsIDB4MDApOworCX0KK30KKworc3RhdGljIGludCBtYXg3MzAxX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LAorCQkJCSAgICBpbnQgdmFsdWUpCit7CisJc3RydWN0IG1heDczMDEgKnRzID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtYXg3MzAxLCBjaGlwKTsKKwl1OCAqY29uZmlnOworCXU4IG9mZnNldF9iaXRzOworCWludCByZXQ7CisKKwkvKiBGaXJzdCA0IHBpbnMgYXJlIHVudXNlZCBpbiB0aGUgY29udHJvbGxlciAqLworCW9mZnNldCArPSA0OworCW9mZnNldF9iaXRzID0gKG9mZnNldCAmIDMpIDw8IDE7CisKKwljb25maWcgPSAmdHMtPnBvcnRfY29uZmlnW29mZnNldCA+PiAyXTsKKworCW11dGV4X2xvY2soJnRzLT5sb2NrKTsKKworCSpjb25maWcgPSAoKmNvbmZpZyAmIH4oUElOX0NPTkZJR19NQVNLIDw8IG9mZnNldF9iaXRzKSkKKwkJCSAgIHwgKFBJTl9DT05GSUdfT1VUIDw8IG9mZnNldF9iaXRzKTsKKworCXJldCA9IF9fbWF4NzMwMV9zZXQodHMsIG9mZnNldCwgdmFsdWUpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHRzLT53cml0ZSh0cy0+ZGV2LCAweDA4ICsgKG9mZnNldCA+PiAyKSwgKmNvbmZpZyk7CisKKwltdXRleF91bmxvY2soJnRzLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4NzMwMV9nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBtYXg3MzAxICp0cyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbWF4NzMwMSwgY2hpcCk7CisJaW50IGNvbmZpZywgbGV2ZWwgPSAtRUlOVkFMOworCisJLyogRmlyc3QgNCBwaW5zIGFyZSB1bnVzZWQgaW4gdGhlIGNvbnRyb2xsZXIgKi8KKwlvZmZzZXQgKz0gNDsKKworCW11dGV4X2xvY2soJnRzLT5sb2NrKTsKKworCWNvbmZpZyA9ICh0cy0+cG9ydF9jb25maWdbb2Zmc2V0ID4+IDJdID4+ICgob2Zmc2V0ICYgMykgPDwgMSkpCisJCQkmIFBJTl9DT05GSUdfTUFTSzsKKworCXN3aXRjaCAoY29uZmlnKSB7CisJY2FzZSBQSU5fQ09ORklHX09VVDoKKwkJLyogT3V0cHV0OiByZXR1cm4gY2FjaGVkIGxldmVsICovCisJCWxldmVsID0gICEhKHRzLT5vdXRfbGV2ZWwgJiAoMSA8PCBvZmZzZXQpKTsKKwkJYnJlYWs7CisJY2FzZSBQSU5fQ09ORklHX0lOX1dPX1BVTExVUDoKKwljYXNlIFBJTl9DT05GSUdfSU5fUFVMTFVQOgorCQkvKiBJbnB1dDogcmVhZCBvdXQgKi8KKwkJbGV2ZWwgPSB0cy0+cmVhZCh0cy0+ZGV2LCAweDIwICsgb2Zmc2V0KSAmIDB4MDE7CisJfQorCW11dGV4X3VubG9jaygmdHMtPmxvY2spOworCisJcmV0dXJuIGxldmVsOworfQorCitzdGF0aWMgdm9pZCBtYXg3MzAxX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbWF4NzMwMSAqdHMgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1heDczMDEsIGNoaXApOworCisJLyogRmlyc3QgNCBwaW5zIGFyZSB1bnVzZWQgaW4gdGhlIGNvbnRyb2xsZXIgKi8KKwlvZmZzZXQgKz0gNDsKKworCW11dGV4X2xvY2soJnRzLT5sb2NrKTsKKworCV9fbWF4NzMwMV9zZXQodHMsIG9mZnNldCwgdmFsdWUpOworCisJbXV0ZXhfdW5sb2NrKCZ0cy0+bG9jayk7Cit9CisKK2ludCBfX2RldmluaXQgX19tYXg3MzB4X3Byb2JlKHN0cnVjdCBtYXg3MzAxICp0cykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0cy0+ZGV2OworCXN0cnVjdCBtYXg3MzAxX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCWludCBpLCByZXQ7CisKKwlwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+YmFzZSkgeworCQlkZXZfZXJyKGRldiwgImluY29ycmVjdCBvciBtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9pbml0KCZ0cy0+bG9jayk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgdHMpOworCisJLyogUG93ZXIgdXAgdGhlIGNoaXAgYW5kIGRpc2FibGUgSVJRIG91dHB1dCAqLworCXRzLT53cml0ZShkZXYsIDB4MDQsIDB4MDEpOworCisJdHMtPmlucHV0X3B1bGx1cF9hY3RpdmUgPSBwZGF0YS0+aW5wdXRfcHVsbHVwX2FjdGl2ZTsKKwl0cy0+Y2hpcC5sYWJlbCA9IGRldi0+ZHJpdmVyLT5uYW1lOworCisJdHMtPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gbWF4NzMwMV9kaXJlY3Rpb25faW5wdXQ7CisJdHMtPmNoaXAuZ2V0ID0gbWF4NzMwMV9nZXQ7CisJdHMtPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IG1heDczMDFfZGlyZWN0aW9uX291dHB1dDsKKwl0cy0+Y2hpcC5zZXQgPSBtYXg3MzAxX3NldDsKKworCXRzLT5jaGlwLmJhc2UgPSBwZGF0YS0+YmFzZTsKKwl0cy0+Y2hpcC5uZ3BpbyA9IFBJTl9OVU1CRVI7CisJdHMtPmNoaXAuY2FuX3NsZWVwID0gMTsKKwl0cy0+Y2hpcC5kZXYgPSBkZXY7CisJdHMtPmNoaXAub3duZXIgPSBUSElTX01PRFVMRTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBwdWxsdXBzIGFjY29yZGluZyB0byBwbGF0Zm9ybSBkYXRhIGFuZCBjYWNoZSB0aGUKKwkgKiByZWdpc3RlciB2YWx1ZXMgZm9yIGxhdGVyIHVzZS4KKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7CisJCWludCBqOworCQkvKgorCQkgKiBpbml0aWFsaXplIHBvcnRfY29uZmlnIHdpdGggIjB4QUEiLCB3aGljaCBtZWFucworCQkgKiBpbnB1dCB3aXRoIGludGVybmFsIHB1bGx1cCBkaXNhYmxlZC4gVGhpcyBpcyBuZWVkZWQKKwkJICogdG8gYXZvaWQgd3JpdGluZyB6ZXJvcyAoaW4gdGhlIGlubmVyIGZvciBsb29wKSwKKwkJICogd2hpY2ggaXMgbm90IGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSBkYXRhc2hlZXQuCisJCSAqLworCQl0cy0+cG9ydF9jb25maWdbaV0gPSAweEFBOworCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCQlpbnQgb2Zmc2V0ID0gKGkgLSAxKSAqIDQgKyBqOworCQkJcmV0ID0gbWF4NzMwMV9kaXJlY3Rpb25faW5wdXQoJnRzLT5jaGlwLCBvZmZzZXQpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGV4aXRfZGVzdHJveTsKKwkJfQorCX0KKworCXJldCA9IGdwaW9jaGlwX2FkZCgmdHMtPmNoaXApOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9kZXN0cm95OworCisJcmV0dXJuIHJldDsKKworZXhpdF9kZXN0cm95OgorCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCW11dGV4X2Rlc3Ryb3koJnRzLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19tYXg3MzB4X3Byb2JlKTsKKworaW50IF9fZGV2ZXhpdCBfX21heDczMHhfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWF4NzMwMSAqdHMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKHRzID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisKKwkvKiBQb3dlciBkb3duIHRoZSBjaGlwIGFuZCBkaXNhYmxlIElSUSBvdXRwdXQgKi8KKwl0cy0+d3JpdGUoZGV2LCAweDA0LCAweDAwKTsKKworCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmdHMtPmNoaXApOworCWlmICghcmV0KSB7CisJCW11dGV4X2Rlc3Ryb3koJnRzLT5sb2NrKTsKKwkJa2ZyZWUodHMpOworCX0gZWxzZQorCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZW1vdmUgR1BJTyBjb250cm9sbGVyOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX21heDczMHhfcmVtb3ZlKTsKKworTU9EVUxFX0FVVEhPUigiSnVlcmdlbiBCZWlzZXJ0LCBXb2xmcmFtIFNhbmciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUFYNzMweCBHUElPLUV4cGFuZGVycywgZ2VuZXJpYyBwYXJ0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbWF4NzMyeC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbWF4NzMyeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDQxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tYXg3MzJ4LmMKQEAgLTAsMCArMSw3MTQgQEAKKy8qCisgKiAgTUFYNzMyeCBJMkMgUG9ydCBFeHBhbmRlciB3aXRoIDgvMTYgSS9PCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICogIENvcHlyaWdodCAoQykgMjAwOCBKYWNrIFJlbiA8amFjay5yZW5AbWFydmVsbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IEVyaWMgTWlhbyA8ZXJpYy5taWFvQG1hcnZlbGwuY29tPgorICoKKyAqICBEZXJpdmVkIGZyb20gZHJpdmVycy9ncGlvL3BjYTk1M3guYworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvbWF4NzMyeC5oPgorCisKKy8qCisgKiBFYWNoIHBvcnQgb2YgTUFYNzMyeCAoaW5jbHVkaW5nIE1BWDczMTkpIGZhbGxzIGludG8gb25lIG9mIHRoZQorICogZm9sbG93aW5nIHRocmVlIHR5cGVzOgorICoKKyAqICAgLSBQdXNoIFB1bGwgT3V0cHV0CisgKiAgIC0gSW5wdXQKKyAqICAgLSBPcGVuIERyYWluIEkvTworICoKKyAqIGRlc2lnbmF0ZWQgYnkgJ08nLCAnSScgYW5kICdQJyBpbmRpdmlkdWFsbHkgYWNjb3JkaW5nIHRvIE1BWElNJ3MKKyAqIGRhdGFzaGVldHMuICdJJyBhbmQgJ1AnIHBvcnRzIGFyZSBpbnRlcnJ1cHQgY2FwYWJsZXMsIHNvbWUgd2l0aAorICogYSBkZWRpY2F0ZWQgaW50ZXJydXB0IG1hc2suCisgKgorICogVGhlcmUgYXJlIHR3byBncm91cHMgb2YgSS9PIHBvcnRzLCBlYWNoIGdyb3VwIHVzdWFsbHkgaW5jbHVkZXMKKyAqIHVwIHRvIDggSS9PIHBvcnRzLCBhbmQgaXMgYWNjZXNzZWQgYnkgYSBzcGVjaWZpYyBJMkMgYWRkcmVzczoKKyAqCisgKiAgIC0gR3JvdXAgQSA6IGJ5IEkyQyBhZGRyZXNzIDBiJzExMHh4eHgKKyAqICAgLSBHcm91cCBCIDogYnkgSTJDIGFkZHJlc3MgMGInMTAxeHh4eAorICoKKyAqIHdoZXJlICd4eHh4JyBpcyBkZWNpZGVkIGJ5IHRoZSBjb25uZWN0aW9ucyBvZiBwaW4gQUQyL0FEMC4gIFRoZQorICogYWRkcmVzcyB1c2VkIGFsc28gYWZmZWN0cyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBvdXRwdXQgc2lnbmFscy4KKyAqCisgKiBXaXRoaW4gZWFjaCBncm91cCBvZiBwb3J0cywgdGhlcmUgYXJlIGZpdmUga25vd24gY29tYmluYXRpb25zIG9mCisgKiBJL08gcG9ydHM6IDRJNE8sIDRQNE8sIDhJLCA4UCwgOE8sIHNlZSB0aGUgZGVmaW5pdGlvbnMgYmVsb3cgZm9yCisgKiB0aGUgZGV0YWlsZWQgb3JnYW5pemF0aW9uIG9mIHRoZXNlIHBvcnRzLiBPbmx5IEdvdXAgQSBpcyBpbnRlcnJ1cHQKKyAqIGNhcGFibGUuCisgKgorICogR1BJTyBudW1iZXJzIHN0YXJ0IGZyb20gJ2dwaW9fYmFzZSArIDAnIHRvICdncGlvX2Jhc2UgKyA4LzE2JywKKyAqIGFuZCBHUElPcyBmcm9tIEdST1VQX0EgYXJlIG51bWJlcmVkIGJlZm9yZSB0aG9zZSBmcm9tIEdST1VQX0IKKyAqIChpZiB0aGVyZSBhcmUgdHdvIGdyb3VwcykuCisgKgorICogTk9URTogTUFYNzMyOC9NQVg3MzI5IGFyZSBkcm9wLWluIHJlcGxhY2VtZW50cyBmb3IgUENGODU3NC9hLCBzbworICogdGhleSBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKyAqLworCisjZGVmaW5lIFBPUlRfTk9ORQkweDAJLyogJy8nIE5vIFBvcnQgKi8KKyNkZWZpbmUgUE9SVF9PVVRQVVQJMHgxCS8qICdPJyBQdXNoLVB1bGwsIE91dHB1dCBPbmx5ICovCisjZGVmaW5lIFBPUlRfSU5QVVQJMHgyCS8qICdJJyBJbnB1dCBPbmx5ICovCisjZGVmaW5lIFBPUlRfT1BFTkRSQUlOCTB4MwkvKiAnUCcgT3Blbi1EcmFpbiwgSS9PICovCisKKyNkZWZpbmUgSU9fNEk0TwkJMHg1QUE1CS8qIE83IE82IEk1IEk0IEkzIEkyIE8xIE8wICovCisjZGVmaW5lIElPXzRQNE8JCTB4NUZGNQkvKiBPNyBPNiBQNSBQNCBQMyBQMiBPMSBPMCAqLworI2RlZmluZSBJT184SQkJMHhBQUFBCS8qIEk3IEk2IEk1IEk0IEkzIEkyIEkxIEkwICovCisjZGVmaW5lIElPXzhQCQkweEZGRkYJLyogUDcgUDYgUDUgUDQgUDMgUDIgUDEgUDAgKi8KKyNkZWZpbmUgSU9fOE8JCTB4NTU1NQkvKiBPNyBPNiBPNSBPNCBPMyBPMiBPMSBPMCAqLworCisjZGVmaW5lIEdST1VQX0EoeCkJKCh4KSAmIDB4ZmZmZikJLyogSTJDIEFkZHI6IDBiJzExMHh4eHggKi8KKyNkZWZpbmUgR1JPVVBfQih4KQkoKHgpIDw8IDE2KQkvKiBJMkMgQWRkcjogMGInMTAxeHh4eCAqLworCisjZGVmaW5lIElOVF9OT05FCTB4MAkvKiBObyBpbnRlcnJ1cHQgY2FwYWJpbGl0eSAqLworI2RlZmluZSBJTlRfTk9fTUFTSwkweDEJLyogSGFzIGludGVycnVwdHMsIG5vIG1hc2sgKi8KKyNkZWZpbmUgSU5UX0lOREVQX01BU0sJMHgyCS8qIEhhcyBpbnRlcnJ1cHRzLCBpbmRlcGVuZGVudCBtYXNrICovCisjZGVmaW5lIElOVF9NRVJHRURfTUFTSyAweDMJLyogSGFzIGludGVycnVwdHMsIG1lcmdlZCBtYXNrICovCisKKyNkZWZpbmUgSU5UX0NBUFMoeCkJKCgodWludDY0X3QpKHgpKSA8PCAzMikKKworZW51bSB7CisJTUFYNzMxOSwKKwlNQVg3MzIwLAorCU1BWDczMjEsCisJTUFYNzMyMiwKKwlNQVg3MzIzLAorCU1BWDczMjQsCisJTUFYNzMyNSwKKwlNQVg3MzI2LAorCU1BWDczMjcsCit9OworCitzdGF0aWMgdWludDY0X3QgbWF4NzMyeF9mZWF0dXJlc1tdID0geworCVtNQVg3MzE5XSA9IEdST1VQX0EoSU9fOEkpIHwgSU5UX0NBUFMoSU5UX01FUkdFRF9NQVNLKSwKKwlbTUFYNzMyMF0gPSBHUk9VUF9CKElPXzhPKSwKKwlbTUFYNzMyMV0gPSBHUk9VUF9BKElPXzhQKSB8IElOVF9DQVBTKElOVF9OT19NQVNLKSwKKwlbTUFYNzMyMl0gPSBHUk9VUF9BKElPXzRJNE8pIHwgSU5UX0NBUFMoSU5UX01FUkdFRF9NQVNLKSwKKwlbTUFYNzMyM10gPSBHUk9VUF9BKElPXzRQNE8pIHwgSU5UX0NBUFMoSU5UX0lOREVQX01BU0spLAorCVtNQVg3MzI0XSA9IEdST1VQX0EoSU9fOEkpIHwgR1JPVVBfQihJT184TykgfCBJTlRfQ0FQUyhJTlRfTUVSR0VEX01BU0spLAorCVtNQVg3MzI1XSA9IEdST1VQX0EoSU9fOFApIHwgR1JPVVBfQihJT184TykgfCBJTlRfQ0FQUyhJTlRfTk9fTUFTSyksCisJW01BWDczMjZdID0gR1JPVVBfQShJT180STRPKSB8IEdST1VQX0IoSU9fOE8pIHwgSU5UX0NBUFMoSU5UX01FUkdFRF9NQVNLKSwKKwlbTUFYNzMyN10gPSBHUk9VUF9BKElPXzRQNE8pIHwgR1JPVVBfQihJT184TykgfCBJTlRfQ0FQUyhJTlRfTk9fTUFTSyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4NzMyeF9pZFtdID0geworCXsgIm1heDczMTkiLCBNQVg3MzE5IH0sCisJeyAibWF4NzMyMCIsIE1BWDczMjAgfSwKKwl7ICJtYXg3MzIxIiwgTUFYNzMyMSB9LAorCXsgIm1heDczMjIiLCBNQVg3MzIyIH0sCisJeyAibWF4NzMyMyIsIE1BWDczMjMgfSwKKwl7ICJtYXg3MzI0IiwgTUFYNzMyNCB9LAorCXsgIm1heDczMjUiLCBNQVg3MzI1IH0sCisJeyAibWF4NzMyNiIsIE1BWDczMjYgfSwKKwl7ICJtYXg3MzI3IiwgTUFYNzMyNyB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWF4NzMyeF9pZCk7CisKK3N0cnVjdCBtYXg3MzJ4X2NoaXAgeworCXN0cnVjdCBncGlvX2NoaXAgZ3Bpb19jaGlwOworCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsJLyogIm1haW4iIGNsaWVudCAqLworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnRfZHVtbXk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudF9ncm91cF9hOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnRfZ3JvdXBfYjsKKworCXVuc2lnbmVkIGludAltYXNrX2dyb3VwX2E7CisJdW5zaWduZWQgaW50CWRpcl9pbnB1dDsKKwl1bnNpZ25lZCBpbnQJZGlyX291dHB1dDsKKworCXN0cnVjdCBtdXRleAlsb2NrOworCXVpbnQ4X3QJCXJlZ19vdXRbMl07CisKKyNpZmRlZiBDT05GSUdfR1BJT19NQVg3MzJYX0lSUQorCXN0cnVjdCBtdXRleAlpcnFfbG9jazsKKwlpbnQJCWlycV9iYXNlOworCXVpbnQ4X3QJCWlycV9tYXNrOworCXVpbnQ4X3QJCWlycV9tYXNrX2N1cjsKKwl1aW50OF90CQlpcnFfdHJpZ19yYWlzZTsKKwl1aW50OF90CQlpcnFfdHJpZ19mYWxsOworCXVpbnQ4X3QJCWlycV9mZWF0dXJlczsKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBtYXg3MzJ4X3dyaXRlYihzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwLCBpbnQgZ3JvdXBfYSwgdWludDhfdCB2YWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlpbnQgcmV0OworCisJY2xpZW50ID0gZ3JvdXBfYSA/IGNoaXAtPmNsaWVudF9ncm91cF9hIDogY2hpcC0+Y2xpZW50X2dyb3VwX2I7CisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCB2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHdyaXRpbmdcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDczMnhfcmVhZGIoc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCwgaW50IGdyb3VwX2EsIHVpbnQ4X3QgKnZhbCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWludCByZXQ7CisKKwljbGllbnQgPSBncm91cF9hID8gY2hpcC0+Y2xpZW50X2dyb3VwX2EgOiBjaGlwLT5jbGllbnRfZ3JvdXBfYjsKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgcmVhZGluZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJKnZhbCA9ICh1aW50OF90KXJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfZ3JvdXBfYShzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmYpCit7CisJcmV0dXJuICgxdSA8PCBvZmYpICYgY2hpcC0+bWFza19ncm91cF9hOworfQorCitzdGF0aWMgaW50IG1heDczMnhfZ3Bpb19nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZikKK3sKKwlzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwOworCXVpbnQ4X3QgcmVnX3ZhbDsKKwlpbnQgcmV0OworCisJY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IG1heDczMnhfY2hpcCwgZ3Bpb19jaGlwKTsKKworCXJldCA9IG1heDczMnhfcmVhZGIoY2hpcCwgaXNfZ3JvdXBfYShjaGlwLCBvZmYpLCAmcmVnX3ZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIHJlZ192YWwgJiAoMXUgPDwgKG9mZiAmIDB4NykpOworfQorCitzdGF0aWMgdm9pZCBtYXg3MzJ4X2dwaW9fc2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmYsIGludCB2YWwpCit7CisJc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcDsKKwl1aW50OF90IHJlZ19vdXQsIG1hc2sgPSAxdSA8PCAob2ZmICYgMHg3KTsKKwlpbnQgcmV0OworCisJY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IG1heDczMnhfY2hpcCwgZ3Bpb19jaGlwKTsKKworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCisJcmVnX291dCA9IChvZmYgPiA3KSA/IGNoaXAtPnJlZ19vdXRbMV0gOiBjaGlwLT5yZWdfb3V0WzBdOworCXJlZ19vdXQgPSAodmFsKSA/IHJlZ19vdXQgfCBtYXNrIDogcmVnX291dCAmIH5tYXNrOworCisJcmV0ID0gbWF4NzMyeF93cml0ZWIoY2hpcCwgaXNfZ3JvdXBfYShjaGlwLCBvZmYpLCByZWdfb3V0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiB1cGRhdGUgdGhlIHNoYWRvdyByZWdpc3RlciB0aGVuICovCisJaWYgKG9mZiA+IDcpCisJCWNoaXAtPnJlZ19vdXRbMV0gPSByZWdfb3V0OworCWVsc2UKKwkJY2hpcC0+cmVnX291dFswXSA9IHJlZ19vdXQ7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKK30KKworc3RhdGljIGludCBtYXg3MzJ4X2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmYpCit7CisJc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDF1IDw8IG9mZjsKKworCWNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBtYXg3MzJ4X2NoaXAsIGdwaW9fY2hpcCk7CisKKwlpZiAoKG1hc2sgJiBjaGlwLT5kaXJfaW5wdXQpID09IDApIHsKKwkJZGV2X2RiZygmY2hpcC0+Y2xpZW50LT5kZXYsICIlcyBwb3J0ICVkIGlzIG91dHB1dCBvbmx5XG4iLAorCQkJY2hpcC0+Y2xpZW50LT5uYW1lLCBvZmYpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwkvKgorCSAqIE9wZW4tZHJhaW4gcGlucyBtdXN0IGJlIHNldCB0byBoaWdoIGltcGVkYW5jZSAod2hpY2ggaXMKKwkgKiBlcXVpdmFsZW50IHRvIG91dHB1dC1oaWdoKSB0byBiZSB0dXJuZWQgaW50byBhbiBpbnB1dC4KKwkgKi8KKwlpZiAoKG1hc2sgJiBjaGlwLT5kaXJfb3V0cHV0KSkKKwkJbWF4NzMyeF9ncGlvX3NldF92YWx1ZShnYywgb2ZmLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDczMnhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLAorCQl1bnNpZ25lZCBvZmYsIGludCB2YWwpCit7CisJc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDF1IDw8IG9mZjsKKworCWNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBtYXg3MzJ4X2NoaXAsIGdwaW9fY2hpcCk7CisKKwlpZiAoKG1hc2sgJiBjaGlwLT5kaXJfb3V0cHV0KSA9PSAwKSB7CisJCWRldl9kYmcoJmNoaXAtPmNsaWVudC0+ZGV2LCAiJXMgcG9ydCAlZCBpcyBpbnB1dCBvbmx5XG4iLAorCQkJY2hpcC0+Y2xpZW50LT5uYW1lLCBvZmYpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwltYXg3MzJ4X2dwaW9fc2V0X3ZhbHVlKGdjLCBvZmYsIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfR1BJT19NQVg3MzJYX0lSUQorc3RhdGljIGludCBtYXg3MzJ4X3dyaXRldyhzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwLCB1aW50MTZfdCB2YWwpCit7CisJaW50IHJldDsKKworCXZhbCA9IGNwdV90b19sZTE2KHZhbCk7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2hpcC0+Y2xpZW50X2dyb3VwX2EsIChjaGFyICopJnZhbCwgMik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2hpcC0+Y2xpZW50X2dyb3VwX2EtPmRldiwgImZhaWxlZCB3cml0aW5nXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXg3MzJ4X3JlYWR3KHN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAsIHVpbnQxNl90ICp2YWwpCit7CisJaW50IHJldDsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjaGlwLT5jbGllbnRfZ3JvdXBfYSwgKGNoYXIgKil2YWwsIDIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNoaXAtPmNsaWVudF9ncm91cF9hLT5kZXYsICJmYWlsZWQgcmVhZGluZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJKnZhbCA9IGxlMTZfdG9fY3B1KCp2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYXg3MzJ4X2lycV91cGRhdGVfbWFzayhzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwKQoreworCXVpbnQxNl90IG1zZzsKKworCWlmIChjaGlwLT5pcnFfbWFzayA9PSBjaGlwLT5pcnFfbWFza19jdXIpCisJCXJldHVybjsKKworCWNoaXAtPmlycV9tYXNrID0gY2hpcC0+aXJxX21hc2tfY3VyOworCisJaWYgKGNoaXAtPmlycV9mZWF0dXJlcyA9PSBJTlRfTk9fTUFTSykKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisKKwlzd2l0Y2ggKGNoaXAtPmlycV9mZWF0dXJlcykgeworCWNhc2UgSU5UX0lOREVQX01BU0s6CisJCW1zZyA9IChjaGlwLT5pcnFfbWFzayA8PCA4KSB8IGNoaXAtPnJlZ19vdXRbMF07CisJCW1heDczMnhfd3JpdGV3KGNoaXAsIG1zZyk7CisJCWJyZWFrOworCisJY2FzZSBJTlRfTUVSR0VEX01BU0s6CisJCW1zZyA9IGNoaXAtPmlycV9tYXNrIHwgY2hpcC0+cmVnX291dFswXTsKKwkJbWF4NzMyeF93cml0ZWIoY2hpcCwgMSwgKHVpbnQ4X3QpbXNnKTsKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKK30KKworc3RhdGljIGludCBtYXg3MzJ4X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmYpCit7CisJc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcDsKKworCWNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBtYXg3MzJ4X2NoaXAsIGdwaW9fY2hpcCk7CisJcmV0dXJuIGNoaXAtPmlycV9iYXNlICsgb2ZmOworfQorCitzdGF0aWMgdm9pZCBtYXg3MzJ4X2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwljaGlwLT5pcnFfbWFza19jdXIgJj0gfigxIDw8IChkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZSkpOworfQorCitzdGF0aWMgdm9pZCBtYXg3MzJ4X2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKworCWNoaXAtPmlycV9tYXNrX2N1ciB8PSAxIDw8IChkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1heDczMnhfaXJxX2J1c19sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwltdXRleF9sb2NrKCZjaGlwLT5pcnFfbG9jayk7CisJY2hpcC0+aXJxX21hc2tfY3VyID0gY2hpcC0+aXJxX21hc2s7Cit9CisKK3N0YXRpYyB2b2lkIG1heDczMnhfaXJxX2J1c19zeW5jX3VubG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCisJbWF4NzMyeF9pcnFfdXBkYXRlX21hc2soY2hpcCk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5pcnFfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbWF4NzMyeF9pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdWludDE2X3Qgb2ZmID0gZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2U7CisJdWludDE2X3QgbWFzayA9IDEgPDwgb2ZmOworCisJaWYgKCEobWFzayAmIGNoaXAtPmRpcl9pbnB1dCkpIHsKKwkJZGV2X2RiZygmY2hpcC0+Y2xpZW50LT5kZXYsICIlcyBwb3J0ICVkIGlzIG91dHB1dCBvbmx5XG4iLAorCQkJY2hpcC0+Y2xpZW50LT5uYW1lLCBvZmYpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlpZiAoISh0eXBlICYgSVJRX1RZUEVfRURHRV9CT1RIKSkgeworCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwgImlycSAlZDogdW5zdXBwb3J0ZWQgdHlwZSAlZFxuIiwKKwkJCWQtPmlycSwgdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKQorCQljaGlwLT5pcnFfdHJpZ19mYWxsIHw9IG1hc2s7CisJZWxzZQorCQljaGlwLT5pcnFfdHJpZ19mYWxsICY9IH5tYXNrOworCisJaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX1JJU0lORykKKwkJY2hpcC0+aXJxX3RyaWdfcmFpc2UgfD0gbWFzazsKKwllbHNlCisJCWNoaXAtPmlycV90cmlnX3JhaXNlICY9IH5tYXNrOworCisJcmV0dXJuIG1heDczMnhfZ3Bpb19kaXJlY3Rpb25faW5wdXQoJmNoaXAtPmdwaW9fY2hpcCwgb2ZmKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtYXg3MzJ4X2lycV9jaGlwID0geworCS5uYW1lCQkJPSAibWF4NzMyeCIsCisJLmlycV9tYXNrCQk9IG1heDczMnhfaXJxX21hc2ssCisJLmlycV91bm1hc2sJCT0gbWF4NzMyeF9pcnFfdW5tYXNrLAorCS5pcnFfYnVzX2xvY2sJCT0gbWF4NzMyeF9pcnFfYnVzX2xvY2ssCisJLmlycV9idXNfc3luY191bmxvY2sJPSBtYXg3MzJ4X2lycV9idXNfc3luY191bmxvY2ssCisJLmlycV9zZXRfdHlwZQkJPSBtYXg3MzJ4X2lycV9zZXRfdHlwZSwKK307CisKK3N0YXRpYyB1aW50OF90IG1heDczMnhfaXJxX3BlbmRpbmcoc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCkKK3sKKwl1aW50OF90IGN1cl9zdGF0OworCXVpbnQ4X3Qgb2xkX3N0YXQ7CisJdWludDhfdCB0cmlnZ2VyOworCXVpbnQ4X3QgcGVuZGluZzsKKwl1aW50MTZfdCBzdGF0dXM7CisJaW50IHJldDsKKworCXJldCA9IG1heDczMnhfcmVhZHcoY2hpcCwgJnN0YXR1cyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIDA7CisKKwl0cmlnZ2VyID0gc3RhdHVzID4+IDg7CisJdHJpZ2dlciAmPSBjaGlwLT5pcnFfbWFzazsKKworCWlmICghdHJpZ2dlcikKKwkJcmV0dXJuIDA7CisKKwljdXJfc3RhdCA9IHN0YXR1cyAmIDB4RkY7CisJY3VyX3N0YXQgJj0gY2hpcC0+aXJxX21hc2s7CisKKwlvbGRfc3RhdCA9IGN1cl9zdGF0IF4gdHJpZ2dlcjsKKworCXBlbmRpbmcgPSAob2xkX3N0YXQgJiBjaGlwLT5pcnFfdHJpZ19mYWxsKSB8CisJCSAgKGN1cl9zdGF0ICYgY2hpcC0+aXJxX3RyaWdfcmFpc2UpOworCXBlbmRpbmcgJj0gdHJpZ2dlcjsKKworCXJldHVybiBwZW5kaW5nOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWF4NzMyeF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwID0gZGV2aWQ7CisJdWludDhfdCBwZW5kaW5nOworCXVpbnQ4X3QgbGV2ZWw7CisKKwlwZW5kaW5nID0gbWF4NzMyeF9pcnFfcGVuZGluZyhjaGlwKTsKKworCWlmICghcGVuZGluZykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJZG8geworCQlsZXZlbCA9IF9fZmZzKHBlbmRpbmcpOworCQloYW5kbGVfbmVzdGVkX2lycShsZXZlbCArIGNoaXAtPmlycV9iYXNlKTsKKworCQlwZW5kaW5nICY9IH4oMSA8PCBsZXZlbCk7CisJfSB3aGlsZSAocGVuZGluZyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4NzMyeF9pcnFfc2V0dXAoc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJc3RydWN0IG1heDczMnhfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBoYXNfaXJxID0gbWF4NzMyeF9mZWF0dXJlc1tpZC0+ZHJpdmVyX2RhdGFdID4+IDMyOworCWludCByZXQ7CisKKwlpZiAocGRhdGEtPmlycV9iYXNlICYmIGhhc19pcnEgIT0gSU5UX05PTkUpIHsKKwkJaW50IGx2bDsKKworCQljaGlwLT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKKwkJY2hpcC0+aXJxX2ZlYXR1cmVzID0gaGFzX2lycTsKKwkJbXV0ZXhfaW5pdCgmY2hpcC0+aXJxX2xvY2spOworCisJCWZvciAobHZsID0gMDsgbHZsIDwgY2hpcC0+Z3Bpb19jaGlwLm5ncGlvOyBsdmwrKykgeworCQkJaW50IGlycSA9IGx2bCArIGNoaXAtPmlycV9iYXNlOworCisJCQlpZiAoIShjaGlwLT5kaXJfaW5wdXQgJiAoMSA8PCBsdmwpKSkKKwkJCQljb250aW51ZTsKKworCQkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBjaGlwKTsKKwkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZtYXg3MzJ4X2lycV9jaGlwLAorCQkJCQkJIGhhbmRsZV9lZGdlX2lycSk7CisJCQlpcnFfc2V0X25lc3RlZF90aHJlYWQoaXJxLCAxKTsKKyNpZmRlZiBDT05GSUdfQVJNCisJCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CisjZWxzZQorCQkJaXJxX3NldF9ub3Byb2JlKGlycSk7CisjZW5kaWYKKwkJfQorCisJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGNsaWVudC0+aXJxLAorCQkJCQkgICBOVUxMLAorCQkJCQkgICBtYXg3MzJ4X2lycV9oYW5kbGVyLAorCQkJCQkgICBJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfT05FU0hPVCwKKwkJCQkJICAgZGV2X25hbWUoJmNsaWVudC0+ZGV2KSwgY2hpcCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLAorCQkJCWNsaWVudC0+aXJxKTsKKwkJCWdvdG8gb3V0X2ZhaWxlZDsKKwkJfQorCisJCWNoaXAtPmdwaW9fY2hpcC50b19pcnEgPSBtYXg3MzJ4X2dwaW9fdG9faXJxOworCX0KKworCXJldHVybiAwOworCitvdXRfZmFpbGVkOgorCWNoaXAtPmlycV9iYXNlID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtYXg3MzJ4X2lycV90ZWFyZG93bihzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwKQoreworCWlmIChjaGlwLT5pcnFfYmFzZSkKKwkJZnJlZV9pcnEoY2hpcC0+Y2xpZW50LT5pcnEsIGNoaXApOworfQorI2Vsc2UgLyogQ09ORklHX0dQSU9fTUFYNzMyWF9JUlEgKi8KK3N0YXRpYyBpbnQgbWF4NzMyeF9pcnFfc2V0dXAoc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJc3RydWN0IG1heDczMnhfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBoYXNfaXJxID0gbWF4NzMyeF9mZWF0dXJlc1tpZC0+ZHJpdmVyX2RhdGFdID4+IDMyOworCisJaWYgKHBkYXRhLT5pcnFfYmFzZSAmJiBoYXNfaXJxICE9IElOVF9OT05FKQorCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJpbnRlcnJ1cHQgc3VwcG9ydCBub3QgY29tcGlsZWQgaW5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1heDczMnhfaXJxX3RlYXJkb3duKHN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXApCit7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgbWF4NzMyeF9zZXR1cF9ncGlvKHN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAsCisJCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCwKKwkJCQkJdW5zaWduZWQgZ3Bpb19zdGFydCkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9ICZjaGlwLT5ncGlvX2NoaXA7CisJdWludDMyX3QgaWRfZGF0YSA9ICh1aW50MzJfdCltYXg3MzJ4X2ZlYXR1cmVzW2lkLT5kcml2ZXJfZGF0YV07CisJaW50IGksIHBvcnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyssIGlkX2RhdGEgPj49IDIpIHsKKwkJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IHBvcnQ7CisKKwkJc3dpdGNoIChpZF9kYXRhICYgMHgzKSB7CisJCWNhc2UgUE9SVF9PVVRQVVQ6CisJCQljaGlwLT5kaXJfb3V0cHV0IHw9IG1hc2s7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX0lOUFVUOgorCQkJY2hpcC0+ZGlyX2lucHV0IHw9IG1hc2s7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX09QRU5EUkFJTjoKKwkJCWNoaXAtPmRpcl9vdXRwdXQgfD0gbWFzazsKKwkJCWNoaXAtPmRpcl9pbnB1dCB8PSBtYXNrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpIDwgOCkKKwkJCWNoaXAtPm1hc2tfZ3JvdXBfYSB8PSBtYXNrOworCQlwb3J0Kys7CisJfQorCisJaWYgKGNoaXAtPmRpcl9pbnB1dCkKKwkJZ2MtPmRpcmVjdGlvbl9pbnB1dCA9IG1heDczMnhfZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CisJaWYgKGNoaXAtPmRpcl9vdXRwdXQpIHsKKwkJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBtYXg3MzJ4X2dwaW9fZGlyZWN0aW9uX291dHB1dDsKKwkJZ2MtPnNldCA9IG1heDczMnhfZ3Bpb19zZXRfdmFsdWU7CisJfQorCWdjLT5nZXQgPSBtYXg3MzJ4X2dwaW9fZ2V0X3ZhbHVlOworCWdjLT5jYW5fc2xlZXAgPSAxOworCisJZ2MtPmJhc2UgPSBncGlvX3N0YXJ0OworCWdjLT5uZ3BpbyA9IHBvcnQ7CisJZ2MtPmxhYmVsID0gY2hpcC0+Y2xpZW50LT5uYW1lOworCWdjLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmV0dXJuIHBvcnQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1heDczMnhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG1heDczMnhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYzsKKwl1aW50MTZfdCBhZGRyX2EsIGFkZHJfYjsKKwlpbnQgcmV0LCBucl9wb3J0OworCisJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWF4NzMyeF9jaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY2hpcC0+Y2xpZW50ID0gY2xpZW50OworCisJbnJfcG9ydCA9IG1heDczMnhfc2V0dXBfZ3BpbyhjaGlwLCBpZCwgcGRhdGEtPmdwaW9fYmFzZSk7CisKKwlhZGRyX2EgPSAoY2xpZW50LT5hZGRyICYgMHgwZikgfCAweDYwOworCWFkZHJfYiA9IChjbGllbnQtPmFkZHIgJiAweDBmKSB8IDB4NTA7CisKKwlzd2l0Y2ggKGNsaWVudC0+YWRkciAmIDB4NzApIHsKKwljYXNlIDB4NjA6CisJCWNoaXAtPmNsaWVudF9ncm91cF9hID0gY2xpZW50OworCQlpZiAobnJfcG9ydCA+IDgpIHsKKwkJCWMgPSBpMmNfbmV3X2R1bW15KGNsaWVudC0+YWRhcHRlciwgYWRkcl9iKTsKKwkJCWNoaXAtPmNsaWVudF9ncm91cF9iID0gY2hpcC0+Y2xpZW50X2R1bW15ID0gYzsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4NTA6CisJCWNoaXAtPmNsaWVudF9ncm91cF9iID0gY2xpZW50OworCQlpZiAobnJfcG9ydCA+IDgpIHsKKwkJCWMgPSBpMmNfbmV3X2R1bW15KGNsaWVudC0+YWRhcHRlciwgYWRkcl9hKTsKKwkJCWNoaXAtPmNsaWVudF9ncm91cF9hID0gY2hpcC0+Y2xpZW50X2R1bW15ID0gYzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImludmFsaWQgSTJDIGFkZHJlc3Mgc3BlY2lmaWVkICUwMnhcbiIsCisJCQkJY2xpZW50LT5hZGRyKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KKworCW11dGV4X2luaXQoJmNoaXAtPmxvY2spOworCisJbWF4NzMyeF9yZWFkYihjaGlwLCBpc19ncm91cF9hKGNoaXAsIDApLCAmY2hpcC0+cmVnX291dFswXSk7CisJaWYgKG5yX3BvcnQgPiA4KQorCQltYXg3MzJ4X3JlYWRiKGNoaXAsIGlzX2dyb3VwX2EoY2hpcCwgOCksICZjaGlwLT5yZWdfb3V0WzFdKTsKKworCXJldCA9IG1heDczMnhfaXJxX3NldHVwKGNoaXAsIGlkKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mYWlsZWQ7CisKKwlyZXQgPSBncGlvY2hpcF9hZGQoJmNoaXAtPmdwaW9fY2hpcCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZmFpbGVkOworCisJaWYgKHBkYXRhLT5zZXR1cCkgeworCQlyZXQgPSBwZGF0YS0+c2V0dXAoY2xpZW50LCBjaGlwLT5ncGlvX2NoaXAuYmFzZSwKKwkJCQljaGlwLT5ncGlvX2NoaXAubmdwaW8sIHBkYXRhLT5jb250ZXh0KTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJzZXR1cCBmYWlsZWQsICVkXG4iLCByZXQpOworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCXJldHVybiAwOworCitvdXRfZmFpbGVkOgorCW1heDczMnhfaXJxX3RlYXJkb3duKGNoaXApOworCWtmcmVlKGNoaXApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1heDczMnhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1heDczMnhfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcmV0OworCisJaWYgKHBkYXRhLT50ZWFyZG93bikgeworCQlyZXQgPSBwZGF0YS0+dGVhcmRvd24oY2xpZW50LCBjaGlwLT5ncGlvX2NoaXAuYmFzZSwKKwkJCQljaGlwLT5ncGlvX2NoaXAubmdwaW8sIHBkYXRhLT5jb250ZXh0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgZmFpbGVkLCAlZFxuIiwKKwkJCQkJInRlYXJkb3duIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJmNoaXAtPmdwaW9fY2hpcCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGZhaWxlZCwgJWRcbiIsCisJCQkJImdwaW9jaGlwX3JlbW92ZSgpIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltYXg3MzJ4X2lycV90ZWFyZG93bihjaGlwKTsKKworCS8qIHVucmVnaXN0ZXIgYW55IGR1bW15IGkyY19jbGllbnQgKi8KKwlpZiAoY2hpcC0+Y2xpZW50X2R1bW15KQorCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoY2hpcC0+Y2xpZW50X2R1bW15KTsKKworCWtmcmVlKGNoaXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4NzMyeF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAibWF4NzMyeCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IG1heDczMnhfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtYXg3MzJ4X3JlbW92ZSksCisJLmlkX3RhYmxlCT0gbWF4NzMyeF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1heDczMnhfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbWF4NzMyeF9kcml2ZXIpOworfQorLyogcmVnaXN0ZXIgYWZ0ZXIgaTJjIHBvc3Rjb3JlIGluaXRjYWxsIGFuZCBiZWZvcmUKKyAqIHN1YnN5cyBpbml0Y2FsbHMgdGhhdCBtYXkgcmVseSBvbiB0aGVzZSBHUElPcworICovCitzdWJzeXNfaW5pdGNhbGwobWF4NzMyeF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1heDczMnhfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZtYXg3MzJ4X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtYXg3MzJ4X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJFcmljIE1pYW8gPGVyaWMubWlhb0BtYXJ2ZWxsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR1BJTyBleHBhbmRlciBkcml2ZXIgZm9yIE1BWDczMlgiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1jMzM4ODAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1jMzM4ODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2I0NjUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbWMzMzg4MC5jCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogTUMzMzg4MCBoaWdoLXNpZGUvbG93LXNpZGUgc3dpdGNoIEdQSU8gZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBTdXBwb3J0czoKKyAqIEZyZWVzY2FsZSBNQzMzODgwIGhpZ2gtc2lkZS9sb3ctc2lkZSBzd2l0Y2gKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9tYzMzODgwLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRSAibWMzMzg4MCIKKworLyoKKyAqIFBpbiBjb25maWd1cmF0aW9ucywgc2VlIE1BWDczMDEgZGF0YXNoZWV0IHBhZ2UgNgorICovCisjZGVmaW5lIFBJTl9DT05GSUdfTUFTSyAweDAzCisjZGVmaW5lIFBJTl9DT05GSUdfSU5fUFVMTFVQIDB4MDMKKyNkZWZpbmUgUElOX0NPTkZJR19JTl9XT19QVUxMVVAgMHgwMgorI2RlZmluZSBQSU5fQ09ORklHX09VVCAweDAxCisKKyNkZWZpbmUgUElOX05VTUJFUiA4CisKKworLyoKKyAqIFNvbWUgcmVnaXN0ZXJzIG11c3QgYmUgcmVhZCBiYWNrIHRvIG1vZGlmeS4KKyAqIFRvIHNhdmUgdGltZSB3ZSBjYWNoZSB0aGVtIGhlcmUgaW4gbWVtb3J5CisgKi8KK3N0cnVjdCBtYzMzODgwIHsKKwlzdHJ1Y3QgbXV0ZXgJbG9jazsJLyogcHJvdGVjdCBmcm9tIHNpbXVsdGFuZW91cyBhY2Nlc3NlcyAqLworCXU4CQlwb3J0X2NvbmZpZzsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKK307CisKK3N0YXRpYyBpbnQgbWMzMzg4MF93cml0ZV9jb25maWcoc3RydWN0IG1jMzM4ODAgKm1jKQoreworCXJldHVybiBzcGlfd3JpdGUobWMtPnNwaSwgJm1jLT5wb3J0X2NvbmZpZywgc2l6ZW9mKG1jLT5wb3J0X2NvbmZpZykpOworfQorCisKK3N0YXRpYyBpbnQgX19tYzMzODgwX3NldChzdHJ1Y3QgbWMzMzg4MCAqbWMsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCWlmICh2YWx1ZSkKKwkJbWMtPnBvcnRfY29uZmlnIHw9IDEgPDwgb2Zmc2V0OworCWVsc2UKKwkJbWMtPnBvcnRfY29uZmlnICY9IH4oMSA8PCBvZmZzZXQpOworCisJcmV0dXJuIG1jMzM4ODBfd3JpdGVfY29uZmlnKG1jKTsKK30KKworCitzdGF0aWMgdm9pZCBtYzMzODgwX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbWMzMzg4MCAqbWMgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1jMzM4ODAsIGNoaXApOworCisJbXV0ZXhfbG9jaygmbWMtPmxvY2spOworCisJX19tYzMzODgwX3NldChtYywgb2Zmc2V0LCB2YWx1ZSk7CisKKwltdXRleF91bmxvY2soJm1jLT5sb2NrKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbWMzMzg4MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBtYzMzODgwICptYzsKKwlzdHJ1Y3QgbWMzMzg4MF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlpbnQgcmV0OworCisJcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEgfHwgIXBkYXRhLT5iYXNlKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAiaW5jb3JyZWN0IG9yIG1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogYml0c19wZXJfd29yZCBjYW5ub3QgYmUgY29uZmlndXJlZCBpbiBwbGF0Zm9ybSBkYXRhCisJICovCisJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKworCXJldCA9IHNwaV9zZXR1cChzcGkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWMzMzg4MCksIEdGUF9LRVJORUwpOworCWlmICghbWMpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmbWMtPmxvY2spOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgbWMpOworCisJbWMtPnNwaSA9IHNwaTsKKworCW1jLT5jaGlwLmxhYmVsID0gRFJJVkVSX05BTUUsCisJbWMtPmNoaXAuc2V0ID0gbWMzMzg4MF9zZXQ7CisJbWMtPmNoaXAuYmFzZSA9IHBkYXRhLT5iYXNlOworCW1jLT5jaGlwLm5ncGlvID0gUElOX05VTUJFUjsKKwltYy0+Y2hpcC5jYW5fc2xlZXAgPSAxOworCW1jLT5jaGlwLmRldiA9ICZzcGktPmRldjsKKwltYy0+Y2hpcC5vd25lciA9IFRISVNfTU9EVUxFOworCisJbWMtPnBvcnRfY29uZmlnID0gMHgwMDsKKwkvKiB3cml0ZSB0d2ljZSwgYmVjYXVzZSBkdXJpbmcgaW5pdGlhbGlzYXRpb24gdGhlIGZpcnN0IHNldHRpbmcKKwkgKiBpcyBqdXN0IGZvciB0ZXN0aW5nIFNQSSBjb21tdW5pY2F0aW9uLCBhbmQgdGhlIHNlY29uZCBpcyB0aGUKKwkgKiAicmVhbCIgY29uZmlndXJhdGlvbgorCSAqLworCXJldCA9IG1jMzM4ODBfd3JpdGVfY29uZmlnKG1jKTsKKwltYy0+cG9ydF9jb25maWcgPSAweDAwOworCWlmICghcmV0KQorCQlyZXQgPSBtYzMzODgwX3dyaXRlX2NvbmZpZyhtYyk7CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHdyaXRpbmcgdG8gIiBEUklWRVJfTkFNRSAiOiAlZFxuIiwgcmV0KTsKKwkJZ290byBleGl0X2Rlc3Ryb3k7CisJfQorCisJcmV0ID0gZ3Bpb2NoaXBfYWRkKCZtYy0+Y2hpcCk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X2Rlc3Ryb3k7CisKKwlyZXR1cm4gcmV0OworCitleGl0X2Rlc3Ryb3k6CisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7CisJbXV0ZXhfZGVzdHJveSgmbWMtPmxvY2spOworCWtmcmVlKG1jKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBtYzMzODgwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBtYzMzODgwICptYzsKKwlpbnQgcmV0OworCisJbWMgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKwlpZiAobWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBOVUxMKTsKKworCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmbWMtPmNoaXApOworCWlmICghcmV0KSB7CisJCW11dGV4X2Rlc3Ryb3koJm1jLT5sb2NrKTsKKwkJa2ZyZWUobWMpOworCX0gZWxzZQorCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCB0byByZW1vdmUgdGhlIEdQSU8gY29udHJvbGxlcjogJWRcbiIsCisJCQlyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1jMzM4ODBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gbWMzMzg4MF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1jMzM4ODBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1jMzM4ODBfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZtYzMzODgwX2RyaXZlcik7Cit9CisvKiByZWdpc3RlciBhZnRlciBzcGkgcG9zdGNvcmUgaW5pdGNhbGwgYW5kIGJlZm9yZQorICogc3Vic3lzIGluaXRjYWxscyB0aGF0IG1heSByZWx5IG9uIHRoZXNlIEdQSU9zCisgKi8KK3N1YnN5c19pbml0Y2FsbChtYzMzODgwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWMzMzg4MF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZtYzMzODgwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtYzMzODgwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNb2NlYW4gTGFib3JhdG9yaWVzIDxpbmZvQG1vY2Vhbi1sYWJzLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbWNwMjNzMDguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1jcDIzczA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmNDZlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1jcDIzczA4LmMKQEAgLTAsMCArMSw3MjMgQEAKKy8qCisgKiBNQ1AyM1MwOCBTUEkvR1BJTyBncGlvIGV4cGFuZGVyIGRyaXZlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL21jcDIzczA4Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoqCisgKiBNQ1AgdHlwZXMgc3VwcG9ydGVkIGJ5IGRyaXZlcgorICovCisjZGVmaW5lIE1DUF9UWVBFX1MwOAkwCisjZGVmaW5lIE1DUF9UWVBFX1MxNwkxCisjZGVmaW5lIE1DUF9UWVBFXzAwOAkyCisjZGVmaW5lIE1DUF9UWVBFXzAxNwkzCisKKy8qIFJlZ2lzdGVycyBhcmUgYWxsIDggYml0cyB3aWRlLgorICoKKyAqIFRoZSBtY3AyM3MxNyBoYXMgdHdpY2UgYXMgbWFueSBiaXRzLCBhbmQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gd29yaworICogd2l0aCBlaXRoZXIgMTYgYml0IHJlZ2lzdGVycyBvciB3aXRoIHR3byBhZGphY2VudCA4IGJpdCBiYW5rcy4KKyAqLworI2RlZmluZSBNQ1BfSU9ESVIJMHgwMAkJLyogaW5pdC9yZXNldDogIGFsbCBvbmVzICovCisjZGVmaW5lIE1DUF9JUE9MCTB4MDEKKyNkZWZpbmUgTUNQX0dQSU5URU4JMHgwMgorI2RlZmluZSBNQ1BfREVGVkFMCTB4MDMKKyNkZWZpbmUgTUNQX0lOVENPTgkweDA0CisjZGVmaW5lIE1DUF9JT0NPTgkweDA1CisjCWRlZmluZSBJT0NPTl9TRVFPUAkoMSA8PCA1KQorIwlkZWZpbmUgSU9DT05fSEFFTgkoMSA8PCAzKQorIwlkZWZpbmUgSU9DT05fT0RSCSgxIDw8IDIpCisjCWRlZmluZSBJT0NPTl9JTlRQT0wJKDEgPDwgMSkKKyNkZWZpbmUgTUNQX0dQUFUJMHgwNgorI2RlZmluZSBNQ1BfSU5URgkweDA3CisjZGVmaW5lIE1DUF9JTlRDQVAJMHgwOAorI2RlZmluZSBNQ1BfR1BJTwkweDA5CisjZGVmaW5lIE1DUF9PTEFUCTB4MGEKKworc3RydWN0IG1jcDIzczA4OworCitzdHJ1Y3QgbWNwMjNzMDhfb3BzIHsKKwlpbnQJKCpyZWFkKShzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgcmVnKTsKKwlpbnQJKCp3cml0ZSkoc3RydWN0IG1jcDIzczA4ICptY3AsIHVuc2lnbmVkIHJlZywgdW5zaWduZWQgdmFsKTsKKwlpbnQJKCpyZWFkX3JlZ3MpKHN0cnVjdCBtY3AyM3MwOCAqbWNwLCB1bnNpZ25lZCByZWcsCisJCQkgICAgIHUxNiAqdmFscywgdW5zaWduZWQgbik7Cit9OworCitzdHJ1Y3QgbWNwMjNzMDggeworCXU4CQkJYWRkcjsKKworCXUxNgkJCWNhY2hlWzExXTsKKwkvKiBsb2NrIHByb3RlY3RzIHRoZSBjYWNoZWQgdmFsdWVzICovCisJc3RydWN0IG11dGV4CQlsb2NrOworCisJc3RydWN0IGdwaW9fY2hpcAljaGlwOworCisJY29uc3Qgc3RydWN0IG1jcDIzczA4X29wcwkqb3BzOworCXZvaWQJCQkqZGF0YTsgLyogb3BzIHNwZWNpZmljIGRhdGEgKi8KK307CisKKy8qIEEgZ2l2ZW4gc3BpX2RldmljZSBjYW4gcmVwcmVzZW50IHVwIHRvIGVpZ2h0IG1jcDIzc3h4IGNoaXBzCisgKiBzaGFyaW5nIHRoZSBzYW1lIGNoaXBzZWxlY3QgYnV0IHVzaW5nIGRpZmZlcmVudCBhZGRyZXNzZXMKKyAqIChlLmcuIGNoaXBzICMwIGFuZCAjMyBtaWdodCBiZSBwb3B1bGF0ZWQsIGJ1dCBub3QgIzEgb3IgJDIpLgorICogRHJpdmVyIGRhdGEgaG9sZHMgYWxsIHRoZSBwZXItY2hpcCBkYXRhLgorICovCitzdHJ1Y3QgbWNwMjNzMDhfZHJpdmVyX2RhdGEgeworCXVuc2lnbmVkCQluZ3BpbzsKKwlzdHJ1Y3QgbWNwMjNzMDgJCSptY3BbOF07CisJc3RydWN0IG1jcDIzczA4CQljaGlwW107Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgQ09ORklHX0kyQworCitzdGF0aWMgaW50IG1jcDIzMDA4X3JlYWQoc3RydWN0IG1jcDIzczA4ICptY3AsIHVuc2lnbmVkIHJlZykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG1jcC0+ZGF0YSwgcmVnKTsKK30KKworc3RhdGljIGludCBtY3AyMzAwOF93cml0ZShzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCB2YWwpCit7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEobWNwLT5kYXRhLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQKK21jcDIzMDA4X3JlYWRfcmVncyhzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgcmVnLCB1MTYgKnZhbHMsIHVuc2lnbmVkIG4pCit7CisJd2hpbGUgKG4tLSkgeworCQlpbnQgcmV0ID0gbWNwMjMwMDhfcmVhZChtY3AsIHJlZysrKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFscysrID0gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jcDIzMDE3X3JlYWQoc3RydWN0IG1jcDIzczA4ICptY3AsIHVuc2lnbmVkIHJlZykKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG1jcC0+ZGF0YSwgcmVnIDw8IDEpOworfQorCitzdGF0aWMgaW50IG1jcDIzMDE3X3dyaXRlKHN0cnVjdCBtY3AyM3MwOCAqbWNwLCB1bnNpZ25lZCByZWcsIHVuc2lnbmVkIHZhbCkKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShtY3AtPmRhdGEsIHJlZyA8PCAxLCB2YWwpOworfQorCitzdGF0aWMgaW50CittY3AyMzAxN19yZWFkX3JlZ3Moc3RydWN0IG1jcDIzczA4ICptY3AsIHVuc2lnbmVkIHJlZywgdTE2ICp2YWxzLCB1bnNpZ25lZCBuKQoreworCXdoaWxlIChuLS0pIHsKKwkJaW50IHJldCA9IG1jcDIzMDE3X3JlYWQobWNwLCByZWcrKyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbHMrKyA9IHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtY3AyM3MwOF9vcHMgbWNwMjMwMDhfb3BzID0geworCS5yZWFkCQk9IG1jcDIzMDA4X3JlYWQsCisJLndyaXRlCQk9IG1jcDIzMDA4X3dyaXRlLAorCS5yZWFkX3JlZ3MJPSBtY3AyMzAwOF9yZWFkX3JlZ3MsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1jcDIzczA4X29wcyBtY3AyMzAxN19vcHMgPSB7CisJLnJlYWQJCT0gbWNwMjMwMTdfcmVhZCwKKwkud3JpdGUJCT0gbWNwMjMwMTdfd3JpdGUsCisJLnJlYWRfcmVncwk9IG1jcDIzMDE3X3JlYWRfcmVncywKK307CisKKyNlbmRpZiAvKiBDT05GSUdfSTJDICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBDT05GSUdfU1BJX01BU1RFUgorCitzdGF0aWMgaW50IG1jcDIzczA4X3JlYWQoc3RydWN0IG1jcDIzczA4ICptY3AsIHVuc2lnbmVkIHJlZykKK3sKKwl1OAl0eFsyXSwgcnhbMV07CisJaW50CXN0YXR1czsKKworCXR4WzBdID0gbWNwLT5hZGRyIHwgMHgwMTsKKwl0eFsxXSA9IHJlZzsKKwlzdGF0dXMgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKG1jcC0+ZGF0YSwgdHgsIHNpemVvZiB0eCwgcngsIHNpemVvZiByeCk7CisJcmV0dXJuIChzdGF0dXMgPCAwKSA/IHN0YXR1cyA6IHJ4WzBdOworfQorCitzdGF0aWMgaW50IG1jcDIzczA4X3dyaXRlKHN0cnVjdCBtY3AyM3MwOCAqbWNwLCB1bnNpZ25lZCByZWcsIHVuc2lnbmVkIHZhbCkKK3sKKwl1OAl0eFszXTsKKworCXR4WzBdID0gbWNwLT5hZGRyOworCXR4WzFdID0gcmVnOworCXR4WzJdID0gdmFsOworCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKG1jcC0+ZGF0YSwgdHgsIHNpemVvZiB0eCwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK21jcDIzczA4X3JlYWRfcmVncyhzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgcmVnLCB1MTYgKnZhbHMsIHVuc2lnbmVkIG4pCit7CisJdTgJdHhbMl0sICp0bXA7CisJaW50CXN0YXR1czsKKworCWlmICgobiArIHJlZykgPiBzaXplb2YgbWNwLT5jYWNoZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdHhbMF0gPSBtY3AtPmFkZHIgfCAweDAxOworCXR4WzFdID0gcmVnOworCisJdG1wID0gKHU4ICopdmFsczsKKwlzdGF0dXMgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKG1jcC0+ZGF0YSwgdHgsIHNpemVvZiB0eCwgdG1wLCBuKTsKKwlpZiAoc3RhdHVzID49IDApIHsKKwkJd2hpbGUgKG4tLSkKKwkJCXZhbHNbbl0gPSB0bXBbbl07IC8qIGV4cGFuZCB0byAxNmJpdCAqLworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG1jcDIzczE3X3JlYWQoc3RydWN0IG1jcDIzczA4ICptY3AsIHVuc2lnbmVkIHJlZykKK3sKKwl1OAl0eFsyXSwgcnhbMl07CisJaW50CXN0YXR1czsKKworCXR4WzBdID0gbWNwLT5hZGRyIHwgMHgwMTsKKwl0eFsxXSA9IHJlZyA8PCAxOworCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQobWNwLT5kYXRhLCB0eCwgc2l6ZW9mIHR4LCByeCwgc2l6ZW9mIHJ4KTsKKwlyZXR1cm4gKHN0YXR1cyA8IDApID8gc3RhdHVzIDogKHJ4WzBdIHwgKHJ4WzFdIDw8IDgpKTsKK30KKworc3RhdGljIGludCBtY3AyM3MxN193cml0ZShzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCB2YWwpCit7CisJdTgJdHhbNF07CisKKwl0eFswXSA9IG1jcC0+YWRkcjsKKwl0eFsxXSA9IHJlZyA8PCAxOworCXR4WzJdID0gdmFsOworCXR4WzNdID0gdmFsID4+IDg7CisJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQobWNwLT5kYXRhLCB0eCwgc2l6ZW9mIHR4LCBOVUxMLCAwKTsKK30KKworc3RhdGljIGludAorbWNwMjNzMTdfcmVhZF9yZWdzKHN0cnVjdCBtY3AyM3MwOCAqbWNwLCB1bnNpZ25lZCByZWcsIHUxNiAqdmFscywgdW5zaWduZWQgbikKK3sKKwl1OAl0eFsyXTsKKwlpbnQJc3RhdHVzOworCisJaWYgKChuICsgcmVnKSA+IHNpemVvZiBtY3AtPmNhY2hlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl0eFswXSA9IG1jcC0+YWRkciB8IDB4MDE7CisJdHhbMV0gPSByZWcgPDwgMTsKKworCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQobWNwLT5kYXRhLCB0eCwgc2l6ZW9mIHR4LAorCQkJCSAgICAgKHU4ICopdmFscywgbiAqIDIpOworCWlmIChzdGF0dXMgPj0gMCkgeworCQl3aGlsZSAobi0tKQorCQkJdmFsc1tuXSA9IF9fbGUxNl90b19jcHUoKF9fbGUxNil2YWxzW25dKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1jcDIzczA4X29wcyBtY3AyM3MwOF9vcHMgPSB7CisJLnJlYWQJCT0gbWNwMjNzMDhfcmVhZCwKKwkud3JpdGUJCT0gbWNwMjNzMDhfd3JpdGUsCisJLnJlYWRfcmVncwk9IG1jcDIzczA4X3JlYWRfcmVncywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWNwMjNzMDhfb3BzIG1jcDIzczE3X29wcyA9IHsKKwkucmVhZAkJPSBtY3AyM3MxN19yZWFkLAorCS53cml0ZQkJPSBtY3AyM3MxN193cml0ZSwKKwkucmVhZF9yZWdzCT0gbWNwMjNzMTdfcmVhZF9yZWdzLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19TUElfTUFTVEVSICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgbWNwMjNzMDhfZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgbWNwMjNzMDgJKm1jcCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbWNwMjNzMDgsIGNoaXApOworCWludCBzdGF0dXM7CisKKwltdXRleF9sb2NrKCZtY3AtPmxvY2spOworCW1jcC0+Y2FjaGVbTUNQX0lPRElSXSB8PSAoMSA8PCBvZmZzZXQpOworCXN0YXR1cyA9IG1jcC0+b3BzLT53cml0ZShtY3AsIE1DUF9JT0RJUiwgbWNwLT5jYWNoZVtNQ1BfSU9ESVJdKTsKKwltdXRleF91bmxvY2soJm1jcC0+bG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBtY3AyM3MwOF9nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBtY3AyM3MwOAkqbWNwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtY3AyM3MwOCwgY2hpcCk7CisJaW50IHN0YXR1czsKKworCW11dGV4X2xvY2soJm1jcC0+bG9jayk7CisKKwkvKiBSRVZJU0lUIHJlYWRpbmcgdGhpcyBjbGVhcnMgYW55IElSUSAuLi4gKi8KKwlzdGF0dXMgPSBtY3AtPm9wcy0+cmVhZChtY3AsIE1DUF9HUElPKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJc3RhdHVzID0gMDsKKwllbHNlIHsKKwkJbWNwLT5jYWNoZVtNQ1BfR1BJT10gPSBzdGF0dXM7CisJCXN0YXR1cyA9ICEhKHN0YXR1cyAmICgxIDw8IG9mZnNldCkpOworCX0KKwltdXRleF91bmxvY2soJm1jcC0+bG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX21jcDIzczA4X3NldChzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgbWFzaywgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIG9sYXQgPSBtY3AtPmNhY2hlW01DUF9PTEFUXTsKKworCWlmICh2YWx1ZSkKKwkJb2xhdCB8PSBtYXNrOworCWVsc2UKKwkJb2xhdCAmPSB+bWFzazsKKwltY3AtPmNhY2hlW01DUF9PTEFUXSA9IG9sYXQ7CisJcmV0dXJuIG1jcC0+b3BzLT53cml0ZShtY3AsIE1DUF9PTEFULCBvbGF0KTsKK30KKworc3RhdGljIHZvaWQgbWNwMjNzMDhfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBtY3AyM3MwOAkqbWNwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtY3AyM3MwOCwgY2hpcCk7CisJdW5zaWduZWQgbWFzayA9IDEgPDwgb2Zmc2V0OworCisJbXV0ZXhfbG9jaygmbWNwLT5sb2NrKTsKKwlfX21jcDIzczA4X3NldChtY3AsIG1hc2ssIHZhbHVlKTsKKwltdXRleF91bmxvY2soJm1jcC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQKK21jcDIzczA4X2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IG1jcDIzczA4CSptY3AgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1jcDIzczA4LCBjaGlwKTsKKwl1bnNpZ25lZCBtYXNrID0gMSA8PCBvZmZzZXQ7CisJaW50IHN0YXR1czsKKworCW11dGV4X2xvY2soJm1jcC0+bG9jayk7CisJc3RhdHVzID0gX19tY3AyM3MwOF9zZXQobWNwLCBtYXNrLCB2YWx1ZSk7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCW1jcC0+Y2FjaGVbTUNQX0lPRElSXSAmPSB+bWFzazsKKwkJc3RhdHVzID0gbWNwLT5vcHMtPndyaXRlKG1jcCwgTUNQX0lPRElSLCBtY3AtPmNhY2hlW01DUF9JT0RJUl0pOworCX0KKwltdXRleF91bmxvY2soJm1jcC0+bG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworLyoKKyAqIFRoaXMgc2hvd3MgbW9yZSBpbmZvIHRoYW4gdGhlIGdlbmVyaWMgZ3BpbyBkdW1wIGNvZGU6CisgKiBwdWxsdXBzLCBkZWdsaXRjaGluZywgb3BlbiBkcmFpbiBkcml2ZS4KKyAqLworc3RhdGljIHZvaWQgbWNwMjNzMDhfZGJnX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKQoreworCXN0cnVjdCBtY3AyM3MwOAkqbWNwOworCWNoYXIJCWJhbms7CisJaW50CQl0OworCXVuc2lnbmVkCW1hc2s7CisKKwltY3AgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1jcDIzczA4LCBjaGlwKTsKKworCS8qIE5PVEU6IHdlIG9ubHkgaGFuZGxlIG9uZSBiYW5rIGZvciBub3cgLi4uICovCisJYmFuayA9ICcwJyArICgobWNwLT5hZGRyID4+IDEpICYgMHg3KTsKKworCW11dGV4X2xvY2soJm1jcC0+bG9jayk7CisJdCA9IG1jcC0+b3BzLT5yZWFkX3JlZ3MobWNwLCAwLCBtY3AtPmNhY2hlLCBBUlJBWV9TSVpFKG1jcC0+Y2FjaGUpKTsKKwlpZiAodCA8IDApIHsKKwkJc2VxX3ByaW50ZihzLCAiIEkvTyBFUlJPUiAlZFxuIiwgdCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlmb3IgKHQgPSAwLCBtYXNrID0gMTsgdCA8IGNoaXAtPm5ncGlvOyB0KyssIG1hc2sgPDw9IDEpIHsKKwkJY29uc3QgY2hhcgkqbGFiZWw7CisKKwkJbGFiZWwgPSBncGlvY2hpcF9pc19yZXF1ZXN0ZWQoY2hpcCwgdCk7CisJCWlmICghbGFiZWwpCisJCQljb250aW51ZTsKKworCQlzZXFfcHJpbnRmKHMsICIgZ3Bpby0lLTNkIFAlYy4lZCAoJS0xMnMpICVzICVzICVzIiwKKwkJCWNoaXAtPmJhc2UgKyB0LCBiYW5rLCB0LCBsYWJlbCwKKwkJCShtY3AtPmNhY2hlW01DUF9JT0RJUl0gJiBtYXNrKSA/ICJpbiAiIDogIm91dCIsCisJCQkobWNwLT5jYWNoZVtNQ1BfR1BJT10gJiBtYXNrKSA/ICJoaSIgOiAibG8iLAorCQkJKG1jcC0+Y2FjaGVbTUNQX0dQUFVdICYgbWFzaykgPyAiICAiIDogInVwIik7CisJCS8qIE5PVEU6ICBpZ25vcmluZyB0aGUgaXJxLXJlbGF0ZWQgcmVnaXN0ZXJzICovCisJCXNlcV9wcmludGYocywgIlxuIik7CisJfQorZG9uZToKKwltdXRleF91bmxvY2soJm1jcC0+bG9jayk7Cit9CisKKyNlbHNlCisjZGVmaW5lIG1jcDIzczA4X2RiZ19zaG93CU5VTEwKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IG1jcDIzczA4X3Byb2JlX29uZShzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgYWRkciwKKwkJCSAgICAgIHVuc2lnbmVkIHR5cGUsIHVuc2lnbmVkIGJhc2UsIHVuc2lnbmVkIHB1bGx1cHMpCit7CisJaW50IHN0YXR1czsKKworCW11dGV4X2luaXQoJm1jcC0+bG9jayk7CisKKwltY3AtPmRhdGEgPSBkYXRhOworCW1jcC0+YWRkciA9IGFkZHI7CisKKwltY3AtPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gbWNwMjNzMDhfZGlyZWN0aW9uX2lucHV0OworCW1jcC0+Y2hpcC5nZXQgPSBtY3AyM3MwOF9nZXQ7CisJbWNwLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBtY3AyM3MwOF9kaXJlY3Rpb25fb3V0cHV0OworCW1jcC0+Y2hpcC5zZXQgPSBtY3AyM3MwOF9zZXQ7CisJbWNwLT5jaGlwLmRiZ19zaG93ID0gbWNwMjNzMDhfZGJnX3Nob3c7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKyNpZmRlZiBDT05GSUdfU1BJX01BU1RFUgorCWNhc2UgTUNQX1RZUEVfUzA4OgorCQltY3AtPm9wcyA9ICZtY3AyM3MwOF9vcHM7CisJCW1jcC0+Y2hpcC5uZ3BpbyA9IDg7CisJCW1jcC0+Y2hpcC5sYWJlbCA9ICJtY3AyM3MwOCI7CisJCWJyZWFrOworCisJY2FzZSBNQ1BfVFlQRV9TMTc6CisJCW1jcC0+b3BzID0gJm1jcDIzczE3X29wczsKKwkJbWNwLT5jaGlwLm5ncGlvID0gMTY7CisJCW1jcC0+Y2hpcC5sYWJlbCA9ICJtY3AyM3MxNyI7CisJCWJyZWFrOworI2VuZGlmIC8qIENPTkZJR19TUElfTUFTVEVSICovCisKKyNpZmRlZiBDT05GSUdfSTJDCisJY2FzZSBNQ1BfVFlQRV8wMDg6CisJCW1jcC0+b3BzID0gJm1jcDIzMDA4X29wczsKKwkJbWNwLT5jaGlwLm5ncGlvID0gODsKKwkJbWNwLT5jaGlwLmxhYmVsID0gIm1jcDIzMDA4IjsKKwkJYnJlYWs7CisKKwljYXNlIE1DUF9UWVBFXzAxNzoKKwkJbWNwLT5vcHMgPSAmbWNwMjMwMTdfb3BzOworCQltY3AtPmNoaXAubmdwaW8gPSAxNjsKKwkJbWNwLT5jaGlwLmxhYmVsID0gIm1jcDIzMDE3IjsKKwkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0kyQyAqLworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIGRldmljZSB0eXBlICglZClcbiIsIHR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltY3AtPmNoaXAuYmFzZSA9IGJhc2U7CisJbWNwLT5jaGlwLmNhbl9zbGVlcCA9IDE7CisJbWNwLT5jaGlwLmRldiA9IGRldjsKKwltY3AtPmNoaXAub3duZXIgPSBUSElTX01PRFVMRTsKKworCS8qIHZlcmlmeSBNQ1BfSU9DT04uU0VRT1AgPSAwLCBzbyBzZXF1ZW50aWFsIHJlYWRzIHdvcmssCisJICogYW5kIE1DUF9JT0NPTi5IQUVOID0gMSwgc28gd2Ugd29yayB3aXRoIGFsbCBjaGlwcy4KKwkgKi8KKwlzdGF0dXMgPSBtY3AtPm9wcy0+cmVhZChtY3AsIE1DUF9JT0NPTik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKwlpZiAoKHN0YXR1cyAmIElPQ09OX1NFUU9QKSB8fCAhKHN0YXR1cyAmIElPQ09OX0hBRU4pKSB7CisJCS8qIG1jcDIzczE3IGhhcyBJT0NPTiB0d2ljZSwgbWFrZSBzdXJlIHRoZXkgYXJlIGluIHN5bmMgKi8KKwkJc3RhdHVzICY9IH4oSU9DT05fU0VRT1AgfCAoSU9DT05fU0VRT1AgPDwgOCkpOworCQlzdGF0dXMgfD0gSU9DT05fSEFFTiB8IChJT0NPTl9IQUVOIDw8IDgpOworCQlzdGF0dXMgPSBtY3AtPm9wcy0+d3JpdGUobWNwLCBNQ1BfSU9DT04sIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBmYWlsOworCX0KKworCS8qIGNvbmZpZ3VyZSB+MTAwSyBwdWxsdXBzICovCisJc3RhdHVzID0gbWNwLT5vcHMtPndyaXRlKG1jcCwgTUNQX0dQUFUsIHB1bGx1cHMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0dXMgPSBtY3AtPm9wcy0+cmVhZF9yZWdzKG1jcCwgMCwgbWNwLT5jYWNoZSwgQVJSQVlfU0laRShtY3AtPmNhY2hlKSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKworCS8qIGRpc2FibGUgaW52ZXJ0ZXIgb24gaW5wdXQgKi8KKwlpZiAobWNwLT5jYWNoZVtNQ1BfSVBPTF0gIT0gMCkgeworCQltY3AtPmNhY2hlW01DUF9JUE9MXSA9IDA7CisJCXN0YXR1cyA9IG1jcC0+b3BzLT53cml0ZShtY3AsIE1DUF9JUE9MLCAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGZhaWw7CisJfQorCisJLyogZGlzYWJsZSBpcnFzICovCisJaWYgKG1jcC0+Y2FjaGVbTUNQX0dQSU5URU5dICE9IDApIHsKKwkJbWNwLT5jYWNoZVtNQ1BfR1BJTlRFTl0gPSAwOworCQlzdGF0dXMgPSBtY3AtPm9wcy0+d3JpdGUobWNwLCBNQ1BfR1BJTlRFTiwgMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBmYWlsOworCX0KKworCXN0YXR1cyA9IGdwaW9jaGlwX2FkZCgmbWNwLT5jaGlwKTsKK2ZhaWw6CisJaWYgKHN0YXR1cyA8IDApCisJCWRldl9kYmcoZGV2LCAiY2FuJ3Qgc2V0dXAgY2hpcCAlZCwgLS0+ICVkXG4iLAorCQkJYWRkciwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgQ09ORklHX0kyQworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtY3AyMzB4eF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG1jcDIzczA4X3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBtY3AyM3MwOCAqbWNwOworCWludCBzdGF0dXM7CisKKwlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwZGF0YSB8fCAhZ3Bpb19pc192YWxpZChwZGF0YS0+YmFzZSkpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJpbnZhbGlkIG9yIG1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1jcCA9IGt6YWxsb2Moc2l6ZW9mICptY3AsIEdGUF9LRVJORUwpOworCWlmICghbWNwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXR1cyA9IG1jcDIzczA4X3Byb2JlX29uZShtY3AsICZjbGllbnQtPmRldiwgY2xpZW50LCBjbGllbnQtPmFkZHIsCisJCQkJICAgIGlkLT5kcml2ZXJfZGF0YSwgcGRhdGEtPmJhc2UsCisJCQkJICAgIHBkYXRhLT5jaGlwWzBdLnB1bGx1cHMpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZmFpbDsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIG1jcCk7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlrZnJlZShtY3ApOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWNwMjMweHhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1jcDIzczA4ICptY3AgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZ3Bpb2NoaXBfcmVtb3ZlKCZtY3AtPmNoaXApOworCWlmIChzdGF0dXMgPT0gMCkKKwkJa2ZyZWUobWNwKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtY3AyMzB4eF9pZFtdID0geworCXsgIm1jcDIzMDA4IiwgTUNQX1RZUEVfMDA4IH0sCisJeyAibWNwMjMwMTciLCBNQ1BfVFlQRV8wMTcgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1jcDIzMHh4X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1jcDIzMHh4X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJtY3AyMzB4eCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IG1jcDIzMHh4X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobWNwMjMweHhfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBtY3AyMzB4eF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1jcDIzczA4X2kyY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtY3AyMzB4eF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBtY3AyM3MwOF9pMmNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZtY3AyMzB4eF9kcml2ZXIpOworfQorCisjZWxzZQorCitzdGF0aWMgaW50IF9faW5pdCBtY3AyM3MwOF9pMmNfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgdm9pZCBtY3AyM3MwOF9pMmNfZXhpdCh2b2lkKSB7IH0KKworI2VuZGlmIC8qIENPTkZJR19JMkMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIENPTkZJR19TUElfTUFTVEVSCisKK3N0YXRpYyBpbnQgbWNwMjNzMDhfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgbWNwMjNzMDhfcGxhdGZvcm1fZGF0YQkqcGRhdGE7CisJdW5zaWduZWQJCQlhZGRyOworCXVuc2lnbmVkCQkJY2hpcHMgPSAwOworCXN0cnVjdCBtY3AyM3MwOF9kcml2ZXJfZGF0YQkqZGF0YTsKKwlpbnQJCQkJc3RhdHVzLCB0eXBlOworCXVuc2lnbmVkCQkJYmFzZTsKKworCXR5cGUgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YTsKKworCXBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhIHx8ICFncGlvX2lzX3ZhbGlkKHBkYXRhLT5iYXNlKSkgeworCQlkZXZfZGJnKCZzcGktPmRldiwgImludmFsaWQgb3IgbWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChhZGRyID0gMDsgYWRkciA8IEFSUkFZX1NJWkUocGRhdGEtPmNoaXApOyBhZGRyKyspIHsKKwkJaWYgKCFwZGF0YS0+Y2hpcFthZGRyXS5pc19wcmVzZW50KQorCQkJY29udGludWU7CisJCWNoaXBzKys7CisJCWlmICgodHlwZSA9PSBNQ1BfVFlQRV9TMDgpICYmIChhZGRyID4gMykpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LAorCQkJCSJtY3AyM3MwOCBvbmx5IHN1cHBvcnRzIGFkZHJlc3MgMC4uM1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlpZiAoIWNoaXBzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRhdGEgPSBremFsbG9jKHNpemVvZiAqZGF0YSArIGNoaXBzICogc2l6ZW9mKHN0cnVjdCBtY3AyM3MwOCksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGRhdGEpOworCisJYmFzZSA9IHBkYXRhLT5iYXNlOworCWZvciAoYWRkciA9IDA7IGFkZHIgPCBBUlJBWV9TSVpFKHBkYXRhLT5jaGlwKTsgYWRkcisrKSB7CisJCWlmICghcGRhdGEtPmNoaXBbYWRkcl0uaXNfcHJlc2VudCkKKwkJCWNvbnRpbnVlOworCQljaGlwcy0tOworCQlkYXRhLT5tY3BbYWRkcl0gPSAmZGF0YS0+Y2hpcFtjaGlwc107CisJCXN0YXR1cyA9IG1jcDIzczA4X3Byb2JlX29uZShkYXRhLT5tY3BbYWRkcl0sICZzcGktPmRldiwgc3BpLAorCQkJCQkgICAgMHg0MCB8IChhZGRyIDw8IDEpLCB0eXBlLCBiYXNlLAorCQkJCQkgICAgcGRhdGEtPmNoaXBbYWRkcl0ucHVsbHVwcyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBmYWlsOworCisJCWJhc2UgKz0gKHR5cGUgPT0gTUNQX1RZUEVfUzE3KSA/IDE2IDogODsKKwl9CisJZGF0YS0+bmdwaW8gPSBiYXNlIC0gcGRhdGEtPmJhc2U7CisKKwkvKiBOT1RFOiAgdGhlc2UgY2hpcHMgaGF2ZSBhIHJlbGF0aXZlbHkgc2FuZSBJUlEgZnJhbWV3b3JrLCB3aXRoCisJICogcGVyLXNpZ25hbCBtYXNraW5nIGFuZCBsZXZlbC9lZGdlIHRyaWdnZXJpbmcuICBJdCdzIG5vdCB5ZXQKKwkgKiBoYW5kbGVkIGhlcmUuLi4KKwkgKi8KKworCXJldHVybiAwOworCitmYWlsOgorCWZvciAoYWRkciA9IDA7IGFkZHIgPCBBUlJBWV9TSVpFKGRhdGEtPm1jcCk7IGFkZHIrKykgeworCQlpbnQgdG1wOworCisJCWlmICghZGF0YS0+bWNwW2FkZHJdKQorCQkJY29udGludWU7CisJCXRtcCA9IGdwaW9jaGlwX3JlbW92ZSgmZGF0YS0+bWNwW2FkZHJdLT5jaGlwKTsKKwkJaWYgKHRtcCA8IDApCisJCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzIC0tPiAlZFxuIiwgInJlbW92ZSIsIHRtcCk7CisJfQorCWtmcmVlKGRhdGEpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbWNwMjNzMDhfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IG1jcDIzczA4X2RyaXZlcl9kYXRhCSpkYXRhID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJdW5zaWduZWQJCQlhZGRyOworCWludAkJCQlzdGF0dXMgPSAwOworCisJZm9yIChhZGRyID0gMDsgYWRkciA8IEFSUkFZX1NJWkUoZGF0YS0+bWNwKTsgYWRkcisrKSB7CisJCWludCB0bXA7CisKKwkJaWYgKCFkYXRhLT5tY3BbYWRkcl0pCisJCQljb250aW51ZTsKKworCQl0bXAgPSBncGlvY2hpcF9yZW1vdmUoJmRhdGEtPm1jcFthZGRyXS0+Y2hpcCk7CisJCWlmICh0bXAgPCAwKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzIC0tPiAlZFxuIiwgInJlbW92ZSIsIHRtcCk7CisJCQlzdGF0dXMgPSB0bXA7CisJCX0KKwl9CisJaWYgKHN0YXR1cyA9PSAwKQorCQlrZnJlZShkYXRhKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgbWNwMjNzMDhfaWRzW10gPSB7CisJeyAibWNwMjNzMDgiLCBNQ1BfVFlQRV9TMDggfSwKKwl7ICJtY3AyM3MxNyIsIE1DUF9UWVBFX1MxNyB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgbWNwMjNzMDhfaWRzKTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1jcDIzczA4X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gbWNwMjNzMDhfcHJvYmUsCisJLnJlbW92ZQkJPSBtY3AyM3MwOF9yZW1vdmUsCisJLmlkX3RhYmxlCT0gbWNwMjNzMDhfaWRzLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIm1jcDIzczA4IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1jcDIzczA4X3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJm1jcDIzczA4X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIG1jcDIzczA4X3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZtY3AyM3MwOF9kcml2ZXIpOworfQorCisjZWxzZQorCitzdGF0aWMgaW50IF9faW5pdCBtY3AyM3MwOF9zcGlfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgdm9pZCBtY3AyM3MwOF9zcGlfZXhpdCh2b2lkKSB7IH0KKworI2VuZGlmIC8qIENPTkZJR19TUElfTUFTVEVSICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19pbml0IG1jcDIzczA4X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbWNwMjNzMDhfc3BpX2luaXQoKTsKKwlpZiAocmV0KQorCQlnb3RvIHNwaV9mYWlsOworCisJcmV0ID0gbWNwMjNzMDhfaTJjX2luaXQoKTsKKwlpZiAocmV0KQorCQlnb3RvIGkyY19mYWlsOworCisJcmV0dXJuIDA7CisKKyBpMmNfZmFpbDoKKwltY3AyM3MwOF9zcGlfZXhpdCgpOworIHNwaV9mYWlsOgorCXJldHVybiByZXQ7Cit9CisvKiByZWdpc3RlciBhZnRlciBzcGkvaTJjIHBvc3Rjb3JlIGluaXRjYWxsIGFuZCBiZWZvcmUKKyAqIHN1YnN5cyBpbml0Y2FsbHMgdGhhdCBtYXkgcmVseSBvbiB0aGVzZSBHUElPcworICovCitzdWJzeXNfaW5pdGNhbGwobWNwMjNzMDhfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtY3AyM3MwOF9leGl0KHZvaWQpCit7CisJbWNwMjNzMDhfc3BpX2V4aXQoKTsKKwltY3AyM3MwOF9pMmNfZXhpdCgpOworfQorbW9kdWxlX2V4aXQobWNwMjNzMDhfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1sLWlvaC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbWwtaW9oLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwMTZmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1sLWlvaC5jCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE9LSSBTRU1JQ09ORFVDVE9SIENvLiwgTFRELgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUk9ITSAgICAgICAgICAgICAweDEwREIKKworc3RydWN0IGlvaF9yZWdfY29tbiB7CisJdTMyCWllbjsKKwl1MzIJaXN0YXR1czsKKwl1MzIJaWRpc3A7CisJdTMyCWljbHI7CisJdTMyCWltYXNrOworCXUzMglpbWFza2NscjsKKwl1MzIJcG87CisJdTMyCXBpOworCXUzMglwbTsKKwl1MzIJaW1fMDsKKwl1MzIJaW1fMTsKKwl1MzIJcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaW9oX3JlZ3MgeworCXN0cnVjdCBpb2hfcmVnX2NvbW4gcmVnc1s4XTsKKwl1MzIgcmVzZXJ2ZTFbMTZdOworCXUzMiBpb2hfc2VsX3JlZ1s0XTsKKwl1MzIgcmVzZXJ2ZTJbMTFdOworCXUzMiBzcnN0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgaW9oX2dwaW9fcmVnX2RhdGEgLSBUaGUgcmVnaXN0ZXIgc3RvcmUgZGF0YS4KKyAqIEBwb19yZWc6CVRvIHN0b3JlIGNvbnRlbnRzIG9mIFBPIHJlZ2lzdGVyLgorICogQHBtX3JlZzoJVG8gc3RvcmUgY29udGVudHMgb2YgUE0gcmVnaXN0ZXIuCisgKi8KK3N0cnVjdCBpb2hfZ3Bpb19yZWdfZGF0YSB7CisJdTMyIHBvX3JlZzsKKwl1MzIgcG1fcmVnOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaW9oX2dwaW8gLSBHUElPIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAYmFzZToJCQlQQ0kgYmFzZSBhZGRyZXNzIG9mIE1lbW9yeSBtYXBwZWQgSS9PIHJlZ2lzdGVyLgorICogQHJlZzoJCQlNZW1vcnkgbWFwcGVkIElPSCBHUElPIHJlZ2lzdGVyIGxpc3QuCisgKiBAZGV2OgkJCVBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZS4KKyAqIEBncGlvOgkJCURhdGEgZm9yIEdQSU8gaW5mcmFzdHJ1Y3R1cmUuCisgKiBAaW9oX2dwaW9fcmVnOgkJTWVtb3J5IG1hcHBlZCBSZWdpc3RlciBkYXRhIGlzIHNhdmVkIGhlcmUKKyAqCQkJCXdoZW4gc3VzcGVuZC4KKyAqIEBjaDoJCQkJSW5kaWNhdGUgR1BJTyBjaGFubmVsCisgKi8KK3N0cnVjdCBpb2hfZ3BpbyB7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBpb2hfcmVncyBfX2lvbWVtICpyZWc7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBncGlvX2NoaXAgZ3BpbzsKKwlzdHJ1Y3QgaW9oX2dwaW9fcmVnX2RhdGEgaW9oX2dwaW9fcmVnOworCXN0cnVjdCBtdXRleCBsb2NrOworCWludCBjaDsKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbnVtX3BvcnRzW10gPSB7NiwgMTIsIDE2LCAxNiwgMTUsIDE2LCAxNiwgMTJ9OworCitzdGF0aWMgdm9pZCBpb2hfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ3BpbywgdW5zaWduZWQgbnIsIGludCB2YWwpCit7CisJdTMyIHJlZ192YWw7CisJc3RydWN0IGlvaF9ncGlvICpjaGlwID0JY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCBpb2hfZ3BpbywgZ3Bpbyk7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKwlyZWdfdmFsID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG8pOworCWlmICh2YWwpCisJCXJlZ192YWwgfD0gKDEgPDwgbnIpOworCWVsc2UKKwkJcmVnX3ZhbCAmPSB+KDEgPDwgbnIpOworCisJaW93cml0ZTMyKHJlZ192YWwsICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBvKTsKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworfQorCitzdGF0aWMgaW50IGlvaF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1bnNpZ25lZCBucikKK3sKKwlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAgPQljb250YWluZXJfb2YoZ3Bpbywgc3RydWN0IGlvaF9ncGlvLCBncGlvKTsKKworCXJldHVybiBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5waSkgJiAoMSA8PCBucik7Cit9CisKK3N0YXRpYyBpbnQgaW9oX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1bnNpZ25lZCBuciwKKwkJCQkgICAgIGludCB2YWwpCit7CisJc3RydWN0IGlvaF9ncGlvICpjaGlwID0JY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCBpb2hfZ3BpbywgZ3Bpbyk7CisJdTMyIHBtOworCXUzMiByZWdfdmFsOworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisJcG0gPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbSkgJgorCQkJCQkoKDEgPDwgbnVtX3BvcnRzW2NoaXAtPmNoXSkgLSAxKTsKKwlwbSB8PSAoMSA8PCBucik7CisJaW93cml0ZTMyKHBtLCAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbSk7CisKKwlyZWdfdmFsID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG8pOworCWlmICh2YWwpCisJCXJlZ192YWwgfD0gKDEgPDwgbnIpOworCWVsc2UKKwkJcmVnX3ZhbCAmPSB+KDEgPDwgbnIpOworCWlvd3JpdGUzMihyZWdfdmFsLCAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbyk7CisKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9oX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2lnbmVkIG5yKQoreworCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9CWNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgaW9oX2dwaW8sIGdwaW8pOworCXUzMiBwbTsKKworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCXBtID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG0pICYKKwkJCQkoKDEgPDwgbnVtX3BvcnRzW2NoaXAtPmNoXSkgLSAxKTsKKwlwbSAmPSB+KDEgPDwgbnIpOworCWlvd3JpdGUzMihwbSwgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG0pOworCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorLyoKKyAqIFNhdmUgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBpb2hfZ3Bpb19zYXZlX3JlZ19jb25mKHN0cnVjdCBpb2hfZ3BpbyAqY2hpcCkKK3sKKwljaGlwLT5pb2hfZ3Bpb19yZWcucG9fcmVnID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG8pOworCWNoaXAtPmlvaF9ncGlvX3JlZy5wbV9yZWcgPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIG9mIHRoZSBHUElPIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgaW9oX2dwaW9fcmVzdG9yZV9yZWdfY29uZihzdHJ1Y3QgaW9oX2dwaW8gKmNoaXApCit7CisJLyogdG8gc3RvcmUgY29udGVudHMgb2YgUE8gcmVnaXN0ZXIgKi8KKwlpb3dyaXRlMzIoY2hpcC0+aW9oX2dwaW9fcmVnLnBvX3JlZywgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG8pOworCS8qIHRvIHN0b3JlIGNvbnRlbnRzIG9mIFBNIHJlZ2lzdGVyICovCisJaW93cml0ZTMyKGNoaXAtPmlvaF9ncGlvX3JlZy5wbV9yZWcsICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBtKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpb2hfZ3Bpb19zZXR1cChzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAsIGludCBudW1fcG9ydCkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvID0gJmNoaXAtPmdwaW87CisKKwlncGlvLT5sYWJlbCA9IGRldl9uYW1lKGNoaXAtPmRldik7CisJZ3Bpby0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlncGlvLT5kaXJlY3Rpb25faW5wdXQgPSBpb2hfZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CisJZ3Bpby0+Z2V0ID0gaW9oX2dwaW9fZ2V0OworCWdwaW8tPmRpcmVjdGlvbl9vdXRwdXQgPSBpb2hfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCWdwaW8tPnNldCA9IGlvaF9ncGlvX3NldDsKKwlncGlvLT5kYmdfc2hvdyA9IE5VTEw7CisJZ3Bpby0+YmFzZSA9IC0xOworCWdwaW8tPm5ncGlvID0gbnVtX3BvcnQ7CisJZ3Bpby0+Y2FuX3NsZWVwID0gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW9oX2dwaW9fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCWludCBpOworCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcDsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdm9pZCBfX2lvbWVtICpjaGlwX3NhdmU7CisKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9wY2lfZW5hYmxlOworCX0KKworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgS0JVSUxEX01PRE5BTUUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX3JlcXVlc3RfcmVnaW9ucyBmYWlsZWQtJWQiLCByZXQpOworCQlnb3RvIGVycl9yZXF1ZXN0X3JlZ2lvbnM7CisJfQorCisJYmFzZSA9IHBjaV9pb21hcChwZGV2LCAxLCAwKTsKKwlpZiAoYmFzZSA9PSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIDogcGNpX2lvbWFwIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9tYXA7CisJfQorCisJY2hpcF9zYXZlID0ga3phbGxvYyhzaXplb2YoKmNoaXApICogOCwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXBfc2F2ZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIDoga3phbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2t6YWxsb2M7CisJfQorCisJY2hpcCA9IGNoaXBfc2F2ZTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBjaGlwKyspIHsKKwkJY2hpcC0+ZGV2ID0gJnBkZXYtPmRldjsKKwkJY2hpcC0+YmFzZSA9IGJhc2U7CisJCWNoaXAtPnJlZyA9IGNoaXAtPmJhc2U7CisJCWNoaXAtPmNoID0gaTsKKwkJbXV0ZXhfaW5pdCgmY2hpcC0+bG9jayk7CisJCWlvaF9ncGlvX3NldHVwKGNoaXAsIG51bV9wb3J0c1tpXSk7CisJCXJldCA9IGdwaW9jaGlwX2FkZCgmY2hpcC0+Z3Bpbyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIklPSCBncGlvOiBGYWlsZWQgdG8gcmVnaXN0ZXIgR1BJT1xuIik7CisJCQlnb3RvIGVycl9ncGlvY2hpcF9hZGQ7CisJCX0KKwl9CisKKwljaGlwID0gY2hpcF9zYXZlOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGlwKTsKKworCXJldHVybiAwOworCitlcnJfZ3Bpb2NoaXBfYWRkOgorCXdoaWxlICgtLWkgPj0gMCkgeworCQljaGlwLS07CisJCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmY2hpcC0+Z3Bpbyk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgZ3Bpb2NoaXBfcmVtb3ZlKCVkKVxuIiwgaSk7CisJfQorCWtmcmVlKGNoaXBfc2F2ZSk7CisKK2Vycl9remFsbG9jOgorCXBjaV9pb3VubWFwKHBkZXYsIGJhc2UpOworCitlcnJfaW9tYXA6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZXJyX3JlcXVlc3RfcmVnaW9uczoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKK2Vycl9wY2lfZW5hYmxlOgorCisJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgRmFpbGVkIHJldHVybnMgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpb2hfZ3Bpb19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGVycjsKKwlpbnQgaTsKKwlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICpjaGlwX3NhdmU7CisKKwljaGlwX3NhdmUgPSBjaGlwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIGNoaXArKykgeworCQllcnIgPSBncGlvY2hpcF9yZW1vdmUoJmNoaXAtPmdwaW8pOworCQlpZiAoZXJyKQorCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIGdwaW9jaGlwX3JlbW92ZVxuIik7CisJfQorCisJY2hpcCA9IGNoaXBfc2F2ZTsKKwlwY2lfaW91bm1hcChwZGV2LCBjaGlwLT5iYXNlKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlrZnJlZShjaGlwKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBpb2hfZ3Bpb19zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJczMyIHJldDsKKwlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpb2hfZ3Bpb19zYXZlX3JlZ19jb25mKGNoaXApOworCWlvaF9ncGlvX3Jlc3RvcmVfcmVnX2NvbmYoY2hpcCk7CisKKwlyZXQgPSBwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9zYXZlX3N0YXRlIEZhaWxlZC0lZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlyZXQgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QwLCAxKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfZW5hYmxlX3dha2UgRmFpbGVkIC0lZFxuIiwgcmV0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvaF9ncGlvX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzMzIgcmV0OworCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJldCA9IHBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDAsIDApOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UgRmFpbGVkLSVkICIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJaW93cml0ZTMyKDB4MDEsICZjaGlwLT5yZWctPnNyc3QpOworCWlvd3JpdGUzMigweDAwLCAmY2hpcC0+cmVnLT5zcnN0KTsKKwlpb2hfZ3Bpb19yZXN0b3JlX3JlZ19jb25mKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBpb2hfZ3Bpb19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgaW9oX2dwaW9fcmVzdW1lIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaW9oX2dwaW9fcGNpZGV2X2lkKSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ST0hNLCAweDgwMkUpIH0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlvaF9ncGlvX3BjaWRldl9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpb2hfZ3Bpb19kcml2ZXIgPSB7CisJLm5hbWUgPSAibWxfaW9oX2dwaW8iLAorCS5pZF90YWJsZSA9IGlvaF9ncGlvX3BjaWRldl9pZCwKKwkucHJvYmUgPSBpb2hfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoaW9oX2dwaW9fcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IGlvaF9ncGlvX3N1c3BlbmQsCisJLnJlc3VtZSA9IGlvaF9ncGlvX3Jlc3VtZQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW9oX2dwaW9fcGNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaW9oX2dwaW9fZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGlvaF9ncGlvX3BjaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGlvaF9ncGlvX3BjaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpb2hfZ3Bpb19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoaW9oX2dwaW9fcGNpX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk9LSSBTRU1JQ09ORFVDVE9SIE1MLUlPSCBzZXJpZXMgR1BJTyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1wYzUyMDAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1wYzUyMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQzZWQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbXBjNTIwMC5jCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogTVBDNTJ4eCBncGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYXNjaGEgSGF1ZXIgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+LCBQZW5ndXRyb25peAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKworI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL21wYzUyeHguaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdwaW9fbG9jayk7CisKK3N0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwIHsKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwIG1tY2hpcDsKKwl1bnNpZ25lZCBpbnQgc2hhZG93X2R2bzsKKwl1bnNpZ25lZCBpbnQgc2hhZG93X2dwaW9lOworCXVuc2lnbmVkIGludCBzaGFkb3dfZGRyOworfTsKKworLyoKKyAqIEdQSU8gTElCIEFQSSBpbXBsZW1lbnRhdGlvbiBmb3Igd2FrZXVwIEdQSU9zLgorICoKKyAqIFRoZXJlJ3MgYSBtYXhpbXVtIG9mIDggd2FrZXVwIEdQSU9zLiBXaGljaCBvZiB0aGVzZSBhcmUgYXZhaWxhYmxlCisgKiBmb3IgdXNlIGRlcGVuZHMgb24geW91ciBib2FyZCBzZXR1cC4KKyAqCisgKiAwIC0+IEdQSU9fV0tVUF83CisgKiAxIC0+IEdQSU9fV0tVUF82CisgKiAyIC0+IFBTQzZfMQorICogMyAtPiBQU0M2XzAKKyAqIDQgLT4gRVRIXzE3CisgKiA1IC0+IFBTQzNfOQorICogNiAtPiBQU0MyXzQKKyAqIDcgLT4gUFNDMV80CisgKgorICovCitzdGF0aWMgaW50IG1wYzUyeHhfd2t1cF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCit7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOworCXN0cnVjdCBtcGM1Mnh4X2dwaW9fd2t1cCBfX2lvbWVtICpyZWdzID0gbW1fZ2MtPnJlZ3M7CisJdW5zaWduZWQgaW50IHJldDsKKworCXJldCA9IChpbl84KCZyZWdzLT53a3VwX2l2YWwpID4+ICg3IC0gZ3BpbykpICYgMTsKKworCXByX2RlYnVnKCIlczogZ3BpbzogJWQgcmV0OiAlZFxuIiwgX19mdW5jX18sIGdwaW8sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fbXBjNTJ4eF93a3VwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYyA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CisJc3RydWN0IG1wYzUyeHhfZ3Bpb2NoaXAgKmNoaXAgPSBjb250YWluZXJfb2YobW1fZ2MsCisJCQlzdHJ1Y3QgbXBjNTJ4eF9ncGlvY2hpcCwgbW1jaGlwKTsKKwlzdHJ1Y3QgbXBjNTJ4eF9ncGlvX3drdXAgX19pb21lbSAqcmVncyA9IG1tX2djLT5yZWdzOworCisJaWYgKHZhbCkKKwkJY2hpcC0+c2hhZG93X2R2byB8PSAxIDw8ICg3IC0gZ3Bpbyk7CisJZWxzZQorCQljaGlwLT5zaGFkb3dfZHZvICY9IH4oMSA8PCAoNyAtIGdwaW8pKTsKKworCW91dF84KCZyZWdzLT53a3VwX2R2bywgY2hpcC0+c2hhZG93X2R2byk7Cit9CisKK3N0YXRpYyB2b2lkCittcGM1Mnh4X3drdXBfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwlfX21wYzUyeHhfd2t1cF9ncGlvX3NldChnYywgZ3BpbywgdmFsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoIiVzOiBncGlvOiAlZCB2YWw6ICVkXG4iLCBfX2Z1bmNfXywgZ3BpbywgdmFsKTsKK30KKworc3RhdGljIGludCBtcGM1Mnh4X3drdXBfZ3Bpb19kaXJfaW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgbXBjNTJ4eF9ncGlvY2hpcCAqY2hpcCA9IGNvbnRhaW5lcl9vZihtbV9nYywKKwkJCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwLCBtbWNoaXApOworCXN0cnVjdCBtcGM1Mnh4X2dwaW9fd2t1cCBfX2lvbWVtICpyZWdzID0gbW1fZ2MtPnJlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCS8qIHNldCB0aGUgZGlyZWN0aW9uICovCisJY2hpcC0+c2hhZG93X2RkciAmPSB+KDEgPDwgKDcgLSBncGlvKSk7CisJb3V0XzgoJnJlZ3MtPndrdXBfZGRyLCBjaGlwLT5zaGFkb3dfZGRyKTsKKworCS8qIGFuZCBlbmFibGUgdGhlIHBpbiAqLworCWNoaXAtPnNoYWRvd19ncGlvZSB8PSAxIDw8ICg3IC0gZ3Bpbyk7CisJb3V0XzgoJnJlZ3MtPndrdXBfZ3Bpb2UsIGNoaXAtPnNoYWRvd19ncGlvZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittcGM1Mnh4X3drdXBfZ3Bpb19kaXJfb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYyA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CisJc3RydWN0IG1wYzUyeHhfZ3Bpb193a3VwIF9faW9tZW0gKnJlZ3MgPSBtbV9nYy0+cmVnczsKKwlzdHJ1Y3QgbXBjNTJ4eF9ncGlvY2hpcCAqY2hpcCA9IGNvbnRhaW5lcl9vZihtbV9nYywKKwkJCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwLCBtbWNoaXApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwlfX21wYzUyeHhfd2t1cF9ncGlvX3NldChnYywgZ3BpbywgdmFsKTsKKworCS8qIFRoZW4gc2V0IGRpcmVjdGlvbiAqLworCWNoaXAtPnNoYWRvd19kZHIgfD0gMSA8PCAoNyAtIGdwaW8pOworCW91dF84KCZyZWdzLT53a3VwX2RkciwgY2hpcC0+c2hhZG93X2Rkcik7CisKKwkvKiBGaW5hbGx5IGVuYWJsZSB0aGUgcGluICovCisJY2hpcC0+c2hhZG93X2dwaW9lIHw9IDEgPDwgKDcgLSBncGlvKTsKKwlvdXRfOCgmcmVncy0+d2t1cF9ncGlvZSwgY2hpcC0+c2hhZG93X2dwaW9lKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoIiVzOiBncGlvOiAlZCB2YWw6ICVkXG4iLCBfX2Z1bmNfXywgZ3BpbywgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtcGM1Mnh4X3drdXBfZ3Bpb2NoaXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCit7CisJc3RydWN0IG1wYzUyeHhfZ3Bpb2NoaXAgKmNoaXA7CisJc3RydWN0IG1wYzUyeHhfZ3Bpb193a3VwIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CisJaW50IHJldDsKKworCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnYyA9ICZjaGlwLT5tbWNoaXAuZ2M7CisKKwlnYy0+bmdwaW8gICAgICAgICAgICA9IDg7CisJZ2MtPmRpcmVjdGlvbl9pbnB1dCAgPSBtcGM1Mnh4X3drdXBfZ3Bpb19kaXJfaW47CisJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBtcGM1Mnh4X3drdXBfZ3Bpb19kaXJfb3V0OworCWdjLT5nZXQgICAgICAgICAgICAgID0gbXBjNTJ4eF93a3VwX2dwaW9fZ2V0OworCWdjLT5zZXQgICAgICAgICAgICAgID0gbXBjNTJ4eF93a3VwX2dwaW9fc2V0OworCisJcmV0ID0gb2ZfbW1fZ3Bpb2NoaXBfYWRkKG9mZGV2LT5kZXYub2Zfbm9kZSwgJmNoaXAtPm1tY2hpcCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJlZ3MgPSBjaGlwLT5tbWNoaXAucmVnczsKKwljaGlwLT5zaGFkb3dfZ3Bpb2UgPSBpbl84KCZyZWdzLT53a3VwX2dwaW9lKTsKKwljaGlwLT5zaGFkb3dfZGRyID0gaW5fOCgmcmVncy0+d2t1cF9kZHIpOworCWNoaXAtPnNoYWRvd19kdm8gPSBpbl84KCZyZWdzLT53a3VwX2R2byk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGM1Mnh4X2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKK3sKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1Mnh4X3drdXBfZ3Bpb2NoaXBfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLWdwaW8td2t1cCIsIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1wYzUyeHhfd2t1cF9ncGlvY2hpcF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXBjNTIwMC1ncGlvLXdrdXAiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXBjNTJ4eF93a3VwX2dwaW9jaGlwX21hdGNoLAorCX0sCisJLnByb2JlID0gbXBjNTJ4eF93a3VwX2dwaW9jaGlwX3Byb2JlLAorCS5yZW1vdmUgPSBtcGM1Mnh4X2dwaW9jaGlwX3JlbW92ZSwKK307CisKKy8qCisgKiBHUElPIExJQiBBUEkgaW1wbGVtZW50YXRpb24gZm9yIHNpbXBsZSBHUElPcworICoKKyAqIFRoZXJlJ3MgYSBtYXhpbXVtIG9mIDMyIHNpbXBsZSBHUElPcy4gV2hpY2ggb2YgdGhlc2UgYXJlIGF2YWlsYWJsZQorICogZm9yIHVzZSBkZXBlbmRzIG9uIHlvdXIgYm9hcmQgc2V0dXAuCisgKiBUaGUgbnVtYmVyaW5nIHJlZmxlY3RzIHRoZSBiaXQgbnVtYmVyaW5nIGluIHRoZSBwb3J0IHJlZ2lzdGVyczoKKyAqCisgKiAgMC4uMSAgPiByZXNlcnZlZAorICogIDIuLjMgID4gSVJEQQorICogIDQuLjcgID4gRVRIUgorICogIDguLjExID4gcmVzZXJ2ZWQKKyAqIDEyLi4xNSA+IFVTQgorICogMTYuLjE3ID4gcmVzZXJ2ZWQKKyAqIDE4Li4yMyA+IFBTQzMKKyAqIDI0Li4yNyA+IFBTQzIKKyAqIDI4Li4zMSA+IFBTQzEKKyAqLworc3RhdGljIGludCBtcGM1Mnh4X3NpbXBsZV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCit7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOworCXN0cnVjdCBtcGM1Mnh4X2dwaW8gX19pb21lbSAqcmVncyA9IG1tX2djLT5yZWdzOworCXVuc2lnbmVkIGludCByZXQ7CisKKwlyZXQgPSAoaW5fYmUzMigmcmVncy0+c2ltcGxlX2l2YWwpID4+ICgzMSAtIGdwaW8pKSAmIDE7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fbXBjNTJ4eF9zaW1wbGVfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgbXBjNTJ4eF9ncGlvY2hpcCAqY2hpcCA9IGNvbnRhaW5lcl9vZihtbV9nYywKKwkJCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwLCBtbWNoaXApOworCXN0cnVjdCBtcGM1Mnh4X2dwaW8gX19pb21lbSAqcmVncyA9IG1tX2djLT5yZWdzOworCisJaWYgKHZhbCkKKwkJY2hpcC0+c2hhZG93X2R2byB8PSAxIDw8ICgzMSAtIGdwaW8pOworCWVsc2UKKwkJY2hpcC0+c2hhZG93X2R2byAmPSB+KDEgPDwgKDMxIC0gZ3BpbykpOworCW91dF9iZTMyKCZyZWdzLT5zaW1wbGVfZHZvLCBjaGlwLT5zaGFkb3dfZHZvKTsKK30KKworc3RhdGljIHZvaWQKK21wYzUyeHhfc2ltcGxlX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCisJX19tcGM1Mnh4X3NpbXBsZV9ncGlvX3NldChnYywgZ3BpbywgdmFsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoIiVzOiBncGlvOiAlZCB2YWw6ICVkXG4iLCBfX2Z1bmNfXywgZ3BpbywgdmFsKTsKK30KKworc3RhdGljIGludCBtcGM1Mnh4X3NpbXBsZV9ncGlvX2Rpcl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCit7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOworCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwICpjaGlwID0gY29udGFpbmVyX29mKG1tX2djLAorCQkJc3RydWN0IG1wYzUyeHhfZ3Bpb2NoaXAsIG1tY2hpcCk7CisJc3RydWN0IG1wYzUyeHhfZ3BpbyBfX2lvbWVtICpyZWdzID0gbW1fZ2MtPnJlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCS8qIHNldCB0aGUgZGlyZWN0aW9uICovCisJY2hpcC0+c2hhZG93X2RkciAmPSB+KDEgPDwgKDMxIC0gZ3BpbykpOworCW91dF9iZTMyKCZyZWdzLT5zaW1wbGVfZGRyLCBjaGlwLT5zaGFkb3dfZGRyKTsKKworCS8qIGFuZCBlbmFibGUgdGhlIHBpbiAqLworCWNoaXAtPnNoYWRvd19ncGlvZSB8PSAxIDw8ICgzMSAtIGdwaW8pOworCW91dF9iZTMyKCZyZWdzLT5zaW1wbGVfZ3Bpb2UsIGNoaXAtPnNoYWRvd19ncGlvZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittcGM1Mnh4X3NpbXBsZV9ncGlvX2Rpcl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgbXBjNTJ4eF9ncGlvY2hpcCAqY2hpcCA9IGNvbnRhaW5lcl9vZihtbV9nYywKKwkJCXN0cnVjdCBtcGM1Mnh4X2dwaW9jaGlwLCBtbWNoaXApOworCXN0cnVjdCBtcGM1Mnh4X2dwaW8gX19pb21lbSAqcmVncyA9IG1tX2djLT5yZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwkvKiBGaXJzdCBzZXQgaW5pdGlhbCB2YWx1ZSAqLworCV9fbXBjNTJ4eF9zaW1wbGVfZ3Bpb19zZXQoZ2MsIGdwaW8sIHZhbCk7CisKKwkvKiBUaGVuIHNldCBkaXJlY3Rpb24gKi8KKwljaGlwLT5zaGFkb3dfZGRyIHw9IDEgPDwgKDMxIC0gZ3Bpbyk7CisJb3V0X2JlMzIoJnJlZ3MtPnNpbXBsZV9kZHIsIGNoaXAtPnNoYWRvd19kZHIpOworCisJLyogRmluYWxseSBlbmFibGUgdGhlIHBpbiAqLworCWNoaXAtPnNoYWRvd19ncGlvZSB8PSAxIDw8ICgzMSAtIGdwaW8pOworCW91dF9iZTMyKCZyZWdzLT5zaW1wbGVfZ3Bpb2UsIGNoaXAtPnNoYWRvd19ncGlvZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCXByX2RlYnVnKCIlczogZ3BpbzogJWQgdmFsOiAlZFxuIiwgX19mdW5jX18sIGdwaW8sIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbXBjNTJ4eF9zaW1wbGVfZ3Bpb2NoaXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCit7CisJc3RydWN0IG1wYzUyeHhfZ3Bpb2NoaXAgKmNoaXA7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CisJc3RydWN0IG1wYzUyeHhfZ3BpbyBfX2lvbWVtICpyZWdzOworCWludCByZXQ7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoaXApCisJCXJldHVybiAtRU5PTUVNOworCisJZ2MgPSAmY2hpcC0+bW1jaGlwLmdjOworCisJZ2MtPm5ncGlvICAgICAgICAgICAgPSAzMjsKKwlnYy0+ZGlyZWN0aW9uX2lucHV0ICA9IG1wYzUyeHhfc2ltcGxlX2dwaW9fZGlyX2luOworCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gbXBjNTJ4eF9zaW1wbGVfZ3Bpb19kaXJfb3V0OworCWdjLT5nZXQgICAgICAgICAgICAgID0gbXBjNTJ4eF9zaW1wbGVfZ3Bpb19nZXQ7CisJZ2MtPnNldCAgICAgICAgICAgICAgPSBtcGM1Mnh4X3NpbXBsZV9ncGlvX3NldDsKKworCXJldCA9IG9mX21tX2dwaW9jaGlwX2FkZChvZmRldi0+ZGV2Lm9mX25vZGUsICZjaGlwLT5tbWNoaXApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZWdzID0gY2hpcC0+bW1jaGlwLnJlZ3M7CisJY2hpcC0+c2hhZG93X2dwaW9lID0gaW5fYmUzMigmcmVncy0+c2ltcGxlX2dwaW9lKTsKKwljaGlwLT5zaGFkb3dfZGRyID0gaW5fYmUzMigmcmVncy0+c2ltcGxlX2Rkcik7CisJY2hpcC0+c2hhZG93X2R2byA9IGluX2JlMzIoJnJlZ3MtPnNpbXBsZV9kdm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzUyeHhfc2ltcGxlX2dwaW9jaGlwX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1ncGlvIiwgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXBjNTJ4eF9zaW1wbGVfZ3Bpb2NoaXBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1wYzUyMDAtZ3BpbyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtcGM1Mnh4X3NpbXBsZV9ncGlvY2hpcF9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IG1wYzUyeHhfc2ltcGxlX2dwaW9jaGlwX3Byb2JlLAorCS5yZW1vdmUgPSBtcGM1Mnh4X2dwaW9jaGlwX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1wYzUyeHhfZ3Bpb19pbml0KHZvaWQpCit7CisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXBjNTJ4eF93a3VwX2dwaW9jaGlwX2RyaXZlcikpCisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlZ2lzdGVyIHdha2V1cCBHUElPIGRyaXZlclxuIik7CisKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtcGM1Mnh4X3NpbXBsZV9ncGlvY2hpcF9kcml2ZXIpKQorCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBzaW1wbGUgR1BJTyBkcml2ZXJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogTWFrZSBzdXJlIHdlIGdldCBpbml0aWFsaXNlZCBiZWZvcmUgYW55b25lIGVsc2UgdHJpZXMgdG8gdXNlIHVzICovCitzdWJzeXNfaW5pdGNhbGwobXBjNTJ4eF9ncGlvX2luaXQpOworCisvKiBObyBleGl0IGNhbGwgYXQgdGhlIG1vbWVudCBhcyB3ZSBjYW5ub3QgdW5yZWdpc3RlciBvZiBncGlvIGNoaXBzICovCisKK01PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIE1QQzUyeHggZ3BpbyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW14Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNDBhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYwpAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIE1YQyBHUElPIHN1cHBvcnQuIChjKSAyMDA4IERhbmllbCBNYWNrIDxkYW5pZWxAY2FpYXEuZGU+CisgKiBDb3B5cmlnaHQgMjAwOCBKdWVyZ2VuIEJlaXNlcnQsIGtlcm5lbEBwZW5ndXRyb25peC5kZQorICoKKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSBGcmVlc2NhbGUsCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jhc2ljX21taW9fZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+CisKK2VudW0gbXhjX2dwaW9faHd0eXBlIHsKKwlJTVgxX0dQSU8sCS8qIHJ1bnMgb24gaS5teDEgKi8KKwlJTVgyMV9HUElPLAkvKiBydW5zIG9uIGkubXgyMSBhbmQgaS5teDI3ICovCisJSU1YMzFfR1BJTywJLyogcnVucyBvbiBhbGwgb3RoZXIgaS5teCAqLworfTsKKworLyogZGV2aWNlIHR5cGUgZGVwZW5kZW50IHN0dWZmICovCitzdHJ1Y3QgbXhjX2dwaW9faHdkYXRhIHsKKwl1bnNpZ25lZCBkcl9yZWc7CisJdW5zaWduZWQgZ2Rpcl9yZWc7CisJdW5zaWduZWQgcHNyX3JlZzsKKwl1bnNpZ25lZCBpY3IxX3JlZzsKKwl1bnNpZ25lZCBpY3IyX3JlZzsKKwl1bnNpZ25lZCBpbXJfcmVnOworCXVuc2lnbmVkIGlzcl9yZWc7CisJdW5zaWduZWQgbG93X2xldmVsOworCXVuc2lnbmVkIGhpZ2hfbGV2ZWw7CisJdW5zaWduZWQgcmlzZV9lZGdlOworCXVuc2lnbmVkIGZhbGxfZWRnZTsKK307CisKK3N0cnVjdCBteGNfZ3Bpb19wb3J0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCBpcnE7CisJaW50IGlycV9oaWdoOworCWludCB2aXJ0dWFsX2lycV9zdGFydDsKKwlzdHJ1Y3QgYmdwaW9fY2hpcCBiZ2M7CisJdTMyIGJvdGhfZWRnZXM7Cit9OworCitzdGF0aWMgc3RydWN0IG14Y19ncGlvX2h3ZGF0YSBpbXgxX2lteDIxX2dwaW9faHdkYXRhID0geworCS5kcl9yZWcJCT0gMHgxYywKKwkuZ2Rpcl9yZWcJPSAweDAwLAorCS5wc3JfcmVnCT0gMHgyNCwKKwkuaWNyMV9yZWcJPSAweDI4LAorCS5pY3IyX3JlZwk9IDB4MmMsCisJLmltcl9yZWcJPSAweDMwLAorCS5pc3JfcmVnCT0gMHgzNCwKKwkubG93X2xldmVsCT0gMHgwMywKKwkuaGlnaF9sZXZlbAk9IDB4MDIsCisJLnJpc2VfZWRnZQk9IDB4MDAsCisJLmZhbGxfZWRnZQk9IDB4MDEsCit9OworCitzdGF0aWMgc3RydWN0IG14Y19ncGlvX2h3ZGF0YSBpbXgzMV9ncGlvX2h3ZGF0YSA9IHsKKwkuZHJfcmVnCQk9IDB4MDAsCisJLmdkaXJfcmVnCT0gMHgwNCwKKwkucHNyX3JlZwk9IDB4MDgsCisJLmljcjFfcmVnCT0gMHgwYywKKwkuaWNyMl9yZWcJPSAweDEwLAorCS5pbXJfcmVnCT0gMHgxNCwKKwkuaXNyX3JlZwk9IDB4MTgsCisJLmxvd19sZXZlbAk9IDB4MDAsCisJLmhpZ2hfbGV2ZWwJPSAweDAxLAorCS5yaXNlX2VkZ2UJPSAweDAyLAorCS5mYWxsX2VkZ2UJPSAweDAzLAorfTsKKworc3RhdGljIGVudW0gbXhjX2dwaW9faHd0eXBlIG14Y19ncGlvX2h3dHlwZTsKK3N0YXRpYyBzdHJ1Y3QgbXhjX2dwaW9faHdkYXRhICpteGNfZ3Bpb19od2RhdGE7CisKKyNkZWZpbmUgR1BJT19EUgkJCShteGNfZ3Bpb19od2RhdGEtPmRyX3JlZykKKyNkZWZpbmUgR1BJT19HRElSCQkobXhjX2dwaW9faHdkYXRhLT5nZGlyX3JlZykKKyNkZWZpbmUgR1BJT19QU1IJCShteGNfZ3Bpb19od2RhdGEtPnBzcl9yZWcpCisjZGVmaW5lIEdQSU9fSUNSMQkJKG14Y19ncGlvX2h3ZGF0YS0+aWNyMV9yZWcpCisjZGVmaW5lIEdQSU9fSUNSMgkJKG14Y19ncGlvX2h3ZGF0YS0+aWNyMl9yZWcpCisjZGVmaW5lIEdQSU9fSU1SCQkobXhjX2dwaW9faHdkYXRhLT5pbXJfcmVnKQorI2RlZmluZSBHUElPX0lTUgkJKG14Y19ncGlvX2h3ZGF0YS0+aXNyX3JlZykKKworI2RlZmluZSBHUElPX0lOVF9MT1dfTEVWCShteGNfZ3Bpb19od2RhdGEtPmxvd19sZXZlbCkKKyNkZWZpbmUgR1BJT19JTlRfSElHSF9MRVYJKG14Y19ncGlvX2h3ZGF0YS0+aGlnaF9sZXZlbCkKKyNkZWZpbmUgR1BJT19JTlRfUklTRV9FREdFCShteGNfZ3Bpb19od2RhdGEtPnJpc2VfZWRnZSkKKyNkZWZpbmUgR1BJT19JTlRfRkFMTF9FREdFCShteGNfZ3Bpb19od2RhdGEtPmZhbGxfZWRnZSkKKyNkZWZpbmUgR1BJT19JTlRfTk9ORQkJMHg0CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG14Y19ncGlvX2RldnR5cGVbXSA9IHsKKwl7CisJCS5uYW1lID0gImlteDEtZ3BpbyIsCisJCS5kcml2ZXJfZGF0YSA9IElNWDFfR1BJTywKKwl9LCB7CisJCS5uYW1lID0gImlteDIxLWdwaW8iLAorCQkuZHJpdmVyX2RhdGEgPSBJTVgyMV9HUElPLAorCX0sIHsKKwkJLm5hbWUgPSAiaW14MzEtZ3BpbyIsCisJCS5kcml2ZXJfZGF0YSA9IElNWDMxX0dQSU8sCisJfSwgeworCQkvKiBzZW50aW5lbCAqLworCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG14Y19ncGlvX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDEtZ3BpbyIsIC5kYXRhID0gJm14Y19ncGlvX2RldnR5cGVbSU1YMV9HUElPXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyMS1ncGlvIiwgLmRhdGEgPSAmbXhjX2dwaW9fZGV2dHlwZVtJTVgyMV9HUElPXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgzMS1ncGlvIiwgLmRhdGEgPSAmbXhjX2dwaW9fZGV2dHlwZVtJTVgzMV9HUElPXSwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKKy8qCisgKiBNWDIgaGFzIG9uZSBpbnRlcnJ1cHQgKmZvciBhbGwqIGdwaW8gcG9ydHMuIFRoZSBsaXN0IGlzIHVzZWQKKyAqIHRvIHNhdmUgdGhlIHJlZmVyZW5jZXMgdG8gYWxsIHBvcnRzLCBzbyB0aGF0IG14Ml9ncGlvX2lycV9oYW5kbGVyCisgKiBjYW4gd2FsayB0aHJvdWdoIGFsbCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIExJU1RfSEVBRChteGNfZ3Bpb19wb3J0cyk7CisKKy8qIE5vdGU6IFRoaXMgZHJpdmVyIGFzc3VtZXMgMzIgR1BJT3MgYXJlIGhhbmRsZWQgaW4gb25lIHJlZ2lzdGVyICovCisKK3N0YXRpYyBpbnQgZ3Bpb19zZXRfaXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1MzIgdHlwZSkKK3sKKwl1MzIgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IG14Y19ncGlvX3BvcnQgKnBvcnQgPSBnYy0+cHJpdmF0ZTsKKwl1MzIgYml0LCB2YWw7CisJaW50IGVkZ2U7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBwb3J0LT5iYXNlOworCisJcG9ydC0+Ym90aF9lZGdlcyAmPSB+KDEgPDwgKGdwaW8gJiAzMSkpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CisJCWVkZ2UgPSBHUElPX0lOVF9SSVNFX0VER0U7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCQllZGdlID0gR1BJT19JTlRfRkFMTF9FREdFOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJdmFsID0gZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7CisJCWlmICh2YWwpIHsKKwkJCWVkZ2UgPSBHUElPX0lOVF9MT1dfTEVWOworCQkJcHJfZGVidWcoIm14Yzogc2V0IEdQSU8gJWQgdG8gbG93IHRyaWdnZXJcbiIsIGdwaW8pOworCQl9IGVsc2UgeworCQkJZWRnZSA9IEdQSU9fSU5UX0hJR0hfTEVWOworCQkJcHJfZGVidWcoIm14Yzogc2V0IEdQSU8gJWQgdG8gaGlnaCB0cmlnZ2VyXG4iLCBncGlvKTsKKwkJfQorCQlwb3J0LT5ib3RoX2VkZ2VzIHw9IDEgPDwgKGdwaW8gJiAzMSk7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgorCQllZGdlID0gR1BJT19JTlRfTE9XX0xFVjsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQllZGdlID0gR1BJT19JTlRfSElHSF9MRVY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlZyArPSBHUElPX0lDUjEgKyAoKGdwaW8gJiAweDEwKSA+PiAyKTsgLyogbG93ZXIgb3IgdXBwZXIgcmVnaXN0ZXIgKi8KKwliaXQgPSBncGlvICYgMHhmOworCXZhbCA9IHJlYWRsKHJlZykgJiB+KDB4MyA8PCAoYml0IDw8IDEpKTsKKwl3cml0ZWwodmFsIHwgKGVkZ2UgPDwgKGJpdCA8PCAxKSksIHJlZyk7CisJd3JpdGVsKDEgPDwgKGdwaW8gJiAweDFmKSwgcG9ydC0+YmFzZSArIEdQSU9fSVNSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBteGNfZmxpcF9lZGdlKHN0cnVjdCBteGNfZ3Bpb19wb3J0ICpwb3J0LCB1MzIgZ3BpbykKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IHBvcnQtPmJhc2U7CisJdTMyIGJpdCwgdmFsOworCWludCBlZGdlOworCisJcmVnICs9IEdQSU9fSUNSMSArICgoZ3BpbyAmIDB4MTApID4+IDIpOyAvKiBsb3dlciBvciB1cHBlciByZWdpc3RlciAqLworCWJpdCA9IGdwaW8gJiAweGY7CisJdmFsID0gcmVhZGwocmVnKTsKKwllZGdlID0gKHZhbCA+PiAoYml0IDw8IDEpKSAmIDM7CisJdmFsICY9IH4oMHgzIDw8IChiaXQgPDwgMSkpOworCWlmIChlZGdlID09IEdQSU9fSU5UX0hJR0hfTEVWKSB7CisJCWVkZ2UgPSBHUElPX0lOVF9MT1dfTEVWOworCQlwcl9kZWJ1ZygibXhjOiBzd2l0Y2ggR1BJTyAlZCB0byBsb3cgdHJpZ2dlclxuIiwgZ3Bpbyk7CisJfSBlbHNlIGlmIChlZGdlID09IEdQSU9fSU5UX0xPV19MRVYpIHsKKwkJZWRnZSA9IEdQSU9fSU5UX0hJR0hfTEVWOworCQlwcl9kZWJ1ZygibXhjOiBzd2l0Y2ggR1BJTyAlZCB0byBoaWdoIHRyaWdnZXJcbiIsIGdwaW8pOworCX0gZWxzZSB7CisJCXByX2VycigibXhjOiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIEdQSU8gJWQ6ICV4XG4iLAorCQkgICAgICAgZ3BpbywgZWRnZSk7CisJCXJldHVybjsKKwl9CisJd3JpdGVsKHZhbCB8IChlZGdlIDw8IChiaXQgPDwgMSkpLCByZWcpOworfQorCisvKiBoYW5kbGUgMzIgaW50ZXJydXB0cyBpbiBvbmUgc3RhdHVzIHJlZ2lzdGVyICovCitzdGF0aWMgdm9pZCBteGNfZ3Bpb19pcnFfaGFuZGxlcihzdHJ1Y3QgbXhjX2dwaW9fcG9ydCAqcG9ydCwgdTMyIGlycV9zdGF0KQoreworCXUzMiBncGlvX2lycV9ub19iYXNlID0gcG9ydC0+dmlydHVhbF9pcnFfc3RhcnQ7CisKKwl3aGlsZSAoaXJxX3N0YXQgIT0gMCkgeworCQlpbnQgaXJxb2Zmc2V0ID0gZmxzKGlycV9zdGF0KSAtIDE7CisKKwkJaWYgKHBvcnQtPmJvdGhfZWRnZXMgJiAoMSA8PCBpcnFvZmZzZXQpKQorCQkJbXhjX2ZsaXBfZWRnZShwb3J0LCBpcnFvZmZzZXQpOworCisJCWdlbmVyaWNfaGFuZGxlX2lycShncGlvX2lycV9ub19iYXNlICsgaXJxb2Zmc2V0KTsKKworCQlpcnFfc3RhdCAmPSB+KDEgPDwgaXJxb2Zmc2V0KTsKKwl9Cit9CisKKy8qIE1YMSBhbmQgTVgzIGhhcyBvbmUgaW50ZXJydXB0ICpwZXIqIGdwaW8gcG9ydCAqLworc3RhdGljIHZvaWQgbXgzX2dwaW9faXJxX2hhbmRsZXIodTMyIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXUzMiBpcnFfc3RhdDsKKwlzdHJ1Y3QgbXhjX2dwaW9fcG9ydCAqcG9ydCA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7CisKKwlpcnFfc3RhdCA9IHJlYWRsKHBvcnQtPmJhc2UgKyBHUElPX0lTUikgJiByZWFkbChwb3J0LT5iYXNlICsgR1BJT19JTVIpOworCisJbXhjX2dwaW9faXJxX2hhbmRsZXIocG9ydCwgaXJxX3N0YXQpOworfQorCisvKiBNWDIgaGFzIG9uZSBpbnRlcnJ1cHQgKmZvciBhbGwqIGdwaW8gcG9ydHMgKi8KK3N0YXRpYyB2b2lkIG14Ml9ncGlvX2lycV9oYW5kbGVyKHUzMiBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwl1MzIgaXJxX21zaywgaXJxX3N0YXQ7CisJc3RydWN0IG14Y19ncGlvX3BvcnQgKnBvcnQ7CisKKwkvKiB3YWxrIHRocm91Z2ggYWxsIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmbXhjX2dwaW9fcG9ydHMsIG5vZGUpIHsKKwkJaXJxX21zayA9IHJlYWRsKHBvcnQtPmJhc2UgKyBHUElPX0lNUik7CisJCWlmICghaXJxX21zaykKKwkJCWNvbnRpbnVlOworCisJCWlycV9zdGF0ID0gcmVhZGwocG9ydC0+YmFzZSArIEdQSU9fSVNSKSAmIGlycV9tc2s7CisJCWlmIChpcnFfc3RhdCkKKwkJCW14Y19ncGlvX2lycV9oYW5kbGVyKHBvcnQsIGlycV9zdGF0KTsKKwl9Cit9CisKKy8qCisgKiBTZXQgaW50ZXJydXB0IG51bWJlciAiaXJxIiBpbiB0aGUgR1BJTyBhcyBhIHdha2UtdXAgc291cmNlLgorICogV2hpbGUgc3lzdGVtIGlzIHJ1bm5pbmcsIGFsbCByZWdpc3RlcmVkIEdQSU8gaW50ZXJydXB0cyBuZWVkIHRvIGhhdmUKKyAqIHdha2UtdXAgZW5hYmxlZC4gV2hlbiBzeXN0ZW0gaXMgc3VzcGVuZGVkLCBvbmx5IHNlbGVjdGVkIEdQSU8gaW50ZXJydXB0cworICogbmVlZCB0byBoYXZlIHdha2UtdXAgZW5hYmxlZC4KKyAqIEBwYXJhbSAgaXJxICAgICAgICAgIGludGVycnVwdCBzb3VyY2UgbnVtYmVyCisgKiBAcGFyYW0gIGVuYWJsZSAgICAgICBlbmFibGUgYXMgd2FrZS11cCBpZiBlcXVhbCB0byBub24temVybworICogQHJldHVybiAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGdwaW9fc2V0X3dha2VfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCwgdTMyIGVuYWJsZSkKK3sKKwl1MzIgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7CisJdTMyIGdwaW9faWR4ID0gZ3BpbyAmIDB4MUY7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IG14Y19ncGlvX3BvcnQgKnBvcnQgPSBnYy0+cHJpdmF0ZTsKKworCWlmIChlbmFibGUpIHsKKwkJaWYgKHBvcnQtPmlycV9oaWdoICYmIChncGlvX2lkeCA+PSAxNikpCisJCQllbmFibGVfaXJxX3dha2UocG9ydC0+aXJxX2hpZ2gpOworCQllbHNlCisJCQllbmFibGVfaXJxX3dha2UocG9ydC0+aXJxKTsKKwl9IGVsc2UgeworCQlpZiAocG9ydC0+aXJxX2hpZ2ggJiYgKGdwaW9faWR4ID49IDE2KSkKKwkJCWRpc2FibGVfaXJxX3dha2UocG9ydC0+aXJxX2hpZ2gpOworCQllbHNlCisJCQlkaXNhYmxlX2lycV93YWtlKHBvcnQtPmlycSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBteGNfZ3Bpb19pbml0X2djKHN0cnVjdCBteGNfZ3Bpb19wb3J0ICpwb3J0KQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKKwlzdHJ1Y3QgaXJxX2NoaXBfdHlwZSAqY3Q7CisKKwlnYyA9IGlycV9hbGxvY19nZW5lcmljX2NoaXAoImdwaW8tbXhjIiwgMSwgcG9ydC0+dmlydHVhbF9pcnFfc3RhcnQsCisJCQkJICAgIHBvcnQtPmJhc2UsIGhhbmRsZV9sZXZlbF9pcnEpOworCWdjLT5wcml2YXRlID0gcG9ydDsKKworCWN0ID0gZ2MtPmNoaXBfdHlwZXM7CisJY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19hY2tfc2V0X2JpdDsKKwljdC0+Y2hpcC5pcnFfbWFzayA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CisJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlycV9nY19tYXNrX3NldF9iaXQ7CisJY3QtPmNoaXAuaXJxX3NldF90eXBlID0gZ3Bpb19zZXRfaXJxX3R5cGU7CisJY3QtPmNoaXAuaXJxX3NldF93YWtlID0gZ3Bpb19zZXRfd2FrZV9pcnE7CisJY3QtPnJlZ3MuYWNrID0gR1BJT19JU1I7CisJY3QtPnJlZ3MubWFzayA9IEdQSU9fSU1SOworCisJaXJxX3NldHVwX2dlbmVyaWNfY2hpcChnYywgSVJRX01TSygzMiksIElSUV9HQ19JTklUX05FU1RFRF9MT0NLLAorCQkJICAgICAgIElSUV9OT1JFUVVFU1QsIDApOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgbXhjX2dwaW9fZ2V0X2h3KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQorCQkJb2ZfbWF0Y2hfZGV2aWNlKG14Y19ncGlvX2R0X2lkcywgJnBkZXYtPmRldik7CisJZW51bSBteGNfZ3Bpb19od3R5cGUgaHd0eXBlOworCisJaWYgKG9mX2lkKQorCQlwZGV2LT5pZF9lbnRyeSA9IG9mX2lkLT5kYXRhOworCWh3dHlwZSA9IHBkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YTsKKworCWlmIChteGNfZ3Bpb19od3R5cGUpIHsKKwkJLyoKKwkJICogVGhlIGRyaXZlciB3b3JrcyB3aXRoIGEgcmVhc29uYWJsZSBwcmVzdXBwb3NpdGlvbiwKKwkJICogdGhhdCBpcyBhbGwgZ3BpbyBwb3J0cyBtdXN0IGJlIHRoZSBzYW1lIHR5cGUgd2hlbgorCQkgKiBydW5uaW5nIG9uIG9uZSBzb2MuCisJCSAqLworCQlCVUdfT04obXhjX2dwaW9faHd0eXBlICE9IGh3dHlwZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaHd0eXBlID09IElNWDMxX0dQSU8pCisJCW14Y19ncGlvX2h3ZGF0YSA9ICZpbXgzMV9ncGlvX2h3ZGF0YTsKKwllbHNlCisJCW14Y19ncGlvX2h3ZGF0YSA9ICZpbXgxX2lteDIxX2dwaW9faHdkYXRhOworCisJbXhjX2dwaW9faHd0eXBlID0gaHd0eXBlOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBteGNfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgbXhjX2dwaW9fcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlvcmVzOworCWludCBlcnI7CisKKwlteGNfZ3Bpb19nZXRfaHcocGRldik7CisKKwlwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG14Y19ncGlvX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghaW9yZXMpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXRfa2ZyZWU7CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSwKKwkJCQlwZGV2LT5uYW1lKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0X2tmcmVlOworCX0KKworCXBvcnQtPmJhc2UgPSBpb3JlbWFwKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcykpOworCWlmICghcG9ydC0+YmFzZSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWxlYXNlX21lbTsKKwl9CisKKwlwb3J0LT5pcnFfaGlnaCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7CisJcG9ydC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocG9ydC0+aXJxIDwgMCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKworCS8qIGRpc2FibGUgdGhlIGludGVycnVwdCBhbmQgY2xlYXIgdGhlIHN0YXR1cyAqLworCXdyaXRlbCgwLCBwb3J0LT5iYXNlICsgR1BJT19JTVIpOworCXdyaXRlbCh+MCwgcG9ydC0+YmFzZSArIEdQSU9fSVNSKTsKKworCWlmIChteGNfZ3Bpb19od3R5cGUgPT0gSU1YMjFfR1BJTykgeworCQkvKiBzZXR1cCBvbmUgaGFuZGxlciBmb3IgYWxsIEdQSU8gaW50ZXJydXB0cyAqLworCQlpZiAocGRldi0+aWQgPT0gMCkKKwkJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKHBvcnQtPmlycSwKKwkJCQkJCW14Ml9ncGlvX2lycV9oYW5kbGVyKTsKKwl9IGVsc2UgeworCQkvKiBzZXR1cCBvbmUgaGFuZGxlciBmb3IgZWFjaCBlbnRyeSAqLworCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwb3J0LT5pcnEsIG14M19ncGlvX2lycV9oYW5kbGVyKTsKKwkJaXJxX3NldF9oYW5kbGVyX2RhdGEocG9ydC0+aXJxLCBwb3J0KTsKKwkJaWYgKHBvcnQtPmlycV9oaWdoID4gMCkgeworCQkJLyogc2V0dXAgaGFuZGxlciBmb3IgR1BJTyAxNiB0byAzMSAqLworCQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIocG9ydC0+aXJxX2hpZ2gsCisJCQkJCQlteDNfZ3Bpb19pcnFfaGFuZGxlcik7CisJCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShwb3J0LT5pcnFfaGlnaCwgcG9ydCk7CisJCX0KKwl9CisKKwllcnIgPSBiZ3Bpb19pbml0KCZwb3J0LT5iZ2MsICZwZGV2LT5kZXYsIDQsCisJCQkgcG9ydC0+YmFzZSArIEdQSU9fUFNSLAorCQkJIHBvcnQtPmJhc2UgKyBHUElPX0RSLCBOVUxMLAorCQkJIHBvcnQtPmJhc2UgKyBHUElPX0dESVIsIE5VTEwsIGZhbHNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9pb3VubWFwOworCisJcG9ydC0+YmdjLmdjLmJhc2UgPSBwZGV2LT5pZCAqIDMyOworCXBvcnQtPmJnYy5kaXIgPSBwb3J0LT5iZ2MucmVhZF9yZWcocG9ydC0+YmdjLnJlZ19kaXIpOworCXBvcnQtPmJnYy5kYXRhID0gcG9ydC0+YmdjLnJlYWRfcmVnKHBvcnQtPmJnYy5yZWdfc2V0KTsKKworCWVyciA9IGdwaW9jaGlwX2FkZCgmcG9ydC0+YmdjLmdjKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9iZ3Bpb19yZW1vdmU7CisKKwkvKgorCSAqIEluIGR0IGNhc2UsIHdlIHVzZSBncGlvIG51bWJlciByYW5nZSBkeW5hbWljYWxseQorCSAqIGFsbG9jYXRlZCBieSBncGlvIGNvcmUuCisJICovCisJcG9ydC0+dmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyAobnAgPyBwb3J0LT5iZ2MuZ2MuYmFzZSA6CisJCQkJCQkJICAgICBwZGV2LT5pZCAqIDMyKTsKKworCS8qIGdwaW8tbXhjIGNhbiBiZSBhIGdlbmVyaWMgaXJxIGNoaXAgKi8KKwlteGNfZ3Bpb19pbml0X2djKHBvcnQpOworCisJbGlzdF9hZGRfdGFpbCgmcG9ydC0+bm9kZSwgJm14Y19ncGlvX3BvcnRzKTsKKworCXJldHVybiAwOworCitvdXRfYmdwaW9fcmVtb3ZlOgorCWJncGlvX3JlbW92ZSgmcG9ydC0+YmdjKTsKK291dF9pb3VubWFwOgorCWlvdW5tYXAocG9ydC0+YmFzZSk7CitvdXRfcmVsZWFzZV9tZW06CisJcmVsZWFzZV9tZW1fcmVnaW9uKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcykpOworb3V0X2tmcmVlOgorCWtmcmVlKHBvcnQpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcyBmYWlsZWQgd2l0aCBlcnJubyAlZFxuIiwgX19mdW5jX18sIGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXhjX2dwaW9fZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJncGlvLW14YyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBteGNfZ3Bpb19kdF9pZHMsCisJfSwKKwkucHJvYmUJCT0gbXhjX2dwaW9fcHJvYmUsCisJLmlkX3RhYmxlCT0gbXhjX2dwaW9fZGV2dHlwZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGdwaW9fbXhjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZteGNfZ3Bpb19kcml2ZXIpOworfQorcG9zdGNvcmVfaW5pdGNhbGwoZ3Bpb19teGNfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCAiCisJICAgICAgIkRhbmllbCBNYWNrIDxkYW5pZWxuY2FpYXEuZGU+LCAiCisJICAgICAgIkp1ZXJnZW4gQmVpc2VydCA8a2VybmVsQHBlbmd1dHJvbml4LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmVlc2NhbGUgTVhDIEdQSU8iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW14cy5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbXhzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1NWE4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW14cy5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogTVhDIEdQSU8gc3VwcG9ydC4gKGMpIDIwMDggRGFuaWVsIE1hY2sgPGRhbmllbEBjYWlhcS5kZT4KKyAqIENvcHlyaWdodCAyMDA4IEp1ZXJnZW4gQmVpc2VydCwga2VybmVsQHBlbmd1dHJvbml4LmRlCisgKgorICogQmFzZWQgb24gY29kZSBmcm9tIEZyZWVzY2FsZSwKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jhc2ljX21taW9fZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvbXhzLmg+CisKKyNkZWZpbmUgTVhTX1NFVAkJMHg0CisjZGVmaW5lIE1YU19DTFIJCTB4OAorCisjZGVmaW5lIFBJTkNUUkxfRE9VVChuKQkJKChjcHVfaXNfbXgyMygpID8gMHgwNTAwIDogMHgwNzAwKSArIChuKSAqIDB4MTApCisjZGVmaW5lIFBJTkNUUkxfRElOKG4pCQkoKGNwdV9pc19teDIzKCkgPyAweDA2MDAgOiAweDA5MDApICsgKG4pICogMHgxMCkKKyNkZWZpbmUgUElOQ1RSTF9ET0UobikJCSgoY3B1X2lzX214MjMoKSA/IDB4MDcwMCA6IDB4MGIwMCkgKyAobikgKiAweDEwKQorI2RlZmluZSBQSU5DVFJMX1BJTjJJUlEobikJKChjcHVfaXNfbXgyMygpID8gMHgwODAwIDogMHgxMDAwKSArIChuKSAqIDB4MTApCisjZGVmaW5lIFBJTkNUUkxfSVJRRU4obikJKChjcHVfaXNfbXgyMygpID8gMHgwOTAwIDogMHgxMTAwKSArIChuKSAqIDB4MTApCisjZGVmaW5lIFBJTkNUUkxfSVJRTEVWKG4pCSgoY3B1X2lzX214MjMoKSA/IDB4MGEwMCA6IDB4MTIwMCkgKyAobikgKiAweDEwKQorI2RlZmluZSBQSU5DVFJMX0lSUVBPTChuKQkoKGNwdV9pc19teDIzKCkgPyAweDBiMDAgOiAweDEzMDApICsgKG4pICogMHgxMCkKKyNkZWZpbmUgUElOQ1RSTF9JUlFTVEFUKG4pCSgoY3B1X2lzX214MjMoKSA/IDB4MGMwMCA6IDB4MTQwMCkgKyAobikgKiAweDEwKQorCisjZGVmaW5lIEdQSU9fSU5UX0ZBTExfRURHRQkweDAKKyNkZWZpbmUgR1BJT19JTlRfTE9XX0xFVgkweDEKKyNkZWZpbmUgR1BJT19JTlRfUklTRV9FREdFCTB4MgorI2RlZmluZSBHUElPX0lOVF9ISUdIX0xFVgkweDMKKyNkZWZpbmUgR1BJT19JTlRfTEVWX01BU0sJKDEgPDwgMCkKKyNkZWZpbmUgR1BJT19JTlRfUE9MX01BU0sJKDEgPDwgMSkKKworc3RydWN0IG14c19ncGlvX3BvcnQgeworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgaWQ7CisJaW50IGlycTsKKwlpbnQgdmlydHVhbF9pcnFfc3RhcnQ7CisJc3RydWN0IGJncGlvX2NoaXAgYmdjOworfTsKKworLyogTm90ZTogVGhpcyBkcml2ZXIgYXNzdW1lcyAzMiBHUElPcyBhcmUgaGFuZGxlZCBpbiBvbmUgcmVnaXN0ZXIgKi8KKworc3RhdGljIGludCBteHNfZ3Bpb19zZXRfaXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwl1MzIgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7CisJdTMyIHBpbl9tYXNrID0gMSA8PCAoZ3BpbyAmIDMxKTsKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgbXhzX2dwaW9fcG9ydCAqcG9ydCA9IGdjLT5wcml2YXRlOworCXZvaWQgX19pb21lbSAqcGluX2FkZHI7CisJaW50IGVkZ2U7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQllZGdlID0gR1BJT19JTlRfUklTRV9FREdFOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwkJZWRnZSA9IEdQSU9fSU5UX0ZBTExfRURHRTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6CisJCWVkZ2UgPSBHUElPX0lOVF9MT1dfTEVWOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6CisJCWVkZ2UgPSBHUElPX0lOVF9ISUdIX0xFVjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc2V0IGxldmVsIG9yIGVkZ2UgKi8KKwlwaW5fYWRkciA9IHBvcnQtPmJhc2UgKyBQSU5DVFJMX0lSUUxFVihwb3J0LT5pZCk7CisJaWYgKGVkZ2UgJiBHUElPX0lOVF9MRVZfTUFTSykKKwkJd3JpdGVsKHBpbl9tYXNrLCBwaW5fYWRkciArIE1YU19TRVQpOworCWVsc2UKKwkJd3JpdGVsKHBpbl9tYXNrLCBwaW5fYWRkciArIE1YU19DTFIpOworCisJLyogc2V0IHBvbGFyaXR5ICovCisJcGluX2FkZHIgPSBwb3J0LT5iYXNlICsgUElOQ1RSTF9JUlFQT0wocG9ydC0+aWQpOworCWlmIChlZGdlICYgR1BJT19JTlRfUE9MX01BU0spCisJCXdyaXRlbChwaW5fbWFzaywgcGluX2FkZHIgKyBNWFNfU0VUKTsKKwllbHNlCisJCXdyaXRlbChwaW5fbWFzaywgcGluX2FkZHIgKyBNWFNfQ0xSKTsKKworCXdyaXRlbCgxIDw8IChncGlvICYgMHgxZiksCisJICAgICAgIHBvcnQtPmJhc2UgKyBQSU5DVFJMX0lSUVNUQVQocG9ydC0+aWQpICsgTVhTX0NMUik7CisKKwlyZXR1cm4gMDsKK30KKworLyogTVhTIGhhcyBvbmUgaW50ZXJydXB0ICpwZXIqIGdwaW8gcG9ydCAqLworc3RhdGljIHZvaWQgbXhzX2dwaW9faXJxX2hhbmRsZXIodTMyIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXUzMiBpcnFfc3RhdDsKKwlzdHJ1Y3QgbXhzX2dwaW9fcG9ydCAqcG9ydCA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7CisJdTMyIGdwaW9faXJxX25vX2Jhc2UgPSBwb3J0LT52aXJ0dWFsX2lycV9zdGFydDsKKworCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9hY2soJmRlc2MtPmlycV9kYXRhKTsKKworCWlycV9zdGF0ID0gcmVhZGwocG9ydC0+YmFzZSArIFBJTkNUUkxfSVJRU1RBVChwb3J0LT5pZCkpICYKKwkJCXJlYWRsKHBvcnQtPmJhc2UgKyBQSU5DVFJMX0lSUUVOKHBvcnQtPmlkKSk7CisKKwl3aGlsZSAoaXJxX3N0YXQgIT0gMCkgeworCQlpbnQgaXJxb2Zmc2V0ID0gZmxzKGlycV9zdGF0KSAtIDE7CisJCWdlbmVyaWNfaGFuZGxlX2lycShncGlvX2lycV9ub19iYXNlICsgaXJxb2Zmc2V0KTsKKwkJaXJxX3N0YXQgJj0gfigxIDw8IGlycW9mZnNldCk7CisJfQorfQorCisvKgorICogU2V0IGludGVycnVwdCBudW1iZXIgImlycSIgaW4gdGhlIEdQSU8gYXMgYSB3YWtlLXVwIHNvdXJjZS4KKyAqIFdoaWxlIHN5c3RlbSBpcyBydW5uaW5nLCBhbGwgcmVnaXN0ZXJlZCBHUElPIGludGVycnVwdHMgbmVlZCB0byBoYXZlCisgKiB3YWtlLXVwIGVuYWJsZWQuIFdoZW4gc3lzdGVtIGlzIHN1c3BlbmRlZCwgb25seSBzZWxlY3RlZCBHUElPIGludGVycnVwdHMKKyAqIG5lZWQgdG8gaGF2ZSB3YWtlLXVwIGVuYWJsZWQuCisgKiBAcGFyYW0gIGlycSAgICAgICAgICBpbnRlcnJ1cHQgc291cmNlIG51bWJlcgorICogQHBhcmFtICBlbmFibGUgICAgICAgZW5hYmxlIGFzIHdha2UtdXAgaWYgZXF1YWwgdG8gbm9uLXplcm8KKyAqIEByZXR1cm4gICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBteHNfZ3Bpb19zZXRfd2FrZV9pcnEoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBteHNfZ3Bpb19wb3J0ICpwb3J0ID0gZ2MtPnByaXZhdGU7CisKKwlpZiAoZW5hYmxlKQorCQllbmFibGVfaXJxX3dha2UocG9ydC0+aXJxKTsKKwllbHNlCisJCWRpc2FibGVfaXJxX3dha2UocG9ydC0+aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbXhzX2dwaW9faW5pdF9nYyhzdHJ1Y3QgbXhzX2dwaW9fcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0OworCisJZ2MgPSBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKCJncGlvLW14cyIsIDEsIHBvcnQtPnZpcnR1YWxfaXJxX3N0YXJ0LAorCQkJCSAgICBwb3J0LT5iYXNlLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwlnYy0+cHJpdmF0ZSA9IHBvcnQ7CisKKwljdCA9IGdjLT5jaGlwX3R5cGVzOworCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrX3NldF9iaXQ7CisJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OworCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpcnFfZ2NfbWFza19zZXRfYml0OworCWN0LT5jaGlwLmlycV9zZXRfdHlwZSA9IG14c19ncGlvX3NldF9pcnFfdHlwZTsKKwljdC0+Y2hpcC5pcnFfc2V0X3dha2UgPSBteHNfZ3Bpb19zZXRfd2FrZV9pcnE7CisJY3QtPnJlZ3MuYWNrID0gUElOQ1RSTF9JUlFTVEFUKHBvcnQtPmlkKSArIE1YU19DTFI7CisJY3QtPnJlZ3MubWFzayA9IFBJTkNUUkxfSVJRRU4ocG9ydC0+aWQpOworCisJaXJxX3NldHVwX2dlbmVyaWNfY2hpcChnYywgSVJRX01TSygzMiksIDAsIElSUV9OT1JFUVVFU1QsIDApOworfQorCitzdGF0aWMgaW50IG14c19ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MgPSB0b19iZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgbXhzX2dwaW9fcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZihiZ2MsIHN0cnVjdCBteHNfZ3Bpb19wb3J0LCBiZ2MpOworCisJcmV0dXJuIHBvcnQtPnZpcnR1YWxfaXJxX3N0YXJ0ICsgb2Zmc2V0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBteHNfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0YXRpYyB2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IG14c19ncGlvX3BvcnQgKnBvcnQ7CisJc3RydWN0IHJlc291cmNlICppb3JlcyA9IE5VTEw7CisJaW50IGVycjsKKworCXBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXhzX2dwaW9fcG9ydCksIEdGUF9LRVJORUwpOworCWlmICghcG9ydCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwb3J0LT5pZCA9IHBkZXYtPmlkOworCXBvcnQtPnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhTX0dQSU9fSVJRX1NUQVJUICsgcG9ydC0+aWQgKiAzMjsKKworCS8qCisJICogbWFwIG1lbW9yeSByZWdpb24gb25seSBvbmNlLCBhcyBhbGwgdGhlIGdwaW8gcG9ydHMKKwkgKiBzaGFyZSB0aGUgc2FtZSBvbmUKKwkgKi8KKwlpZiAoIWJhc2UpIHsKKwkJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCQlpZiAoIWlvcmVzKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBvdXRfa2ZyZWU7CisJCX0KKworCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpb3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9yZXMpLAorCQkJCQlwZGV2LT5uYW1lKSkgeworCQkJZXJyID0gLUVCVVNZOworCQkJZ290byBvdXRfa2ZyZWU7CisJCX0KKworCQliYXNlID0gaW9yZW1hcChpb3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9yZXMpKTsKKwkJaWYgKCFiYXNlKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXRfcmVsZWFzZV9tZW07CisJCX0KKwl9CisJcG9ydC0+YmFzZSA9IGJhc2U7CisKKwlwb3J0LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChwb3J0LT5pcnEgPCAwKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2lvdW5tYXA7CisJfQorCisJLyoKKwkgKiBzZWxlY3QgdGhlIHBpbiBpbnRlcnJ1cHQgZnVuY3Rpb25hbGl0eSBidXQgaW5pdGlhbGx5CisJICogZGlzYWJsZSB0aGUgaW50ZXJydXB0cworCSAqLworCXdyaXRlbCh+MFUsIHBvcnQtPmJhc2UgKyBQSU5DVFJMX1BJTjJJUlEocG9ydC0+aWQpKTsKKwl3cml0ZWwoMCwgcG9ydC0+YmFzZSArIFBJTkNUUkxfSVJRRU4ocG9ydC0+aWQpKTsKKworCS8qIGNsZWFyIGFkZHJlc3MgaGFzIHRvIGJlIHVzZWQgdG8gY2xlYXIgSVJRU1RBVCBiaXRzICovCisJd3JpdGVsKH4wVSwgcG9ydC0+YmFzZSArIFBJTkNUUkxfSVJRU1RBVChwb3J0LT5pZCkgKyBNWFNfQ0xSKTsKKworCS8qIGdwaW8tbXhzIGNhbiBiZSBhIGdlbmVyaWMgaXJxIGNoaXAgKi8KKwlteHNfZ3Bpb19pbml0X2djKHBvcnQpOworCisJLyogc2V0dXAgb25lIGhhbmRsZXIgZm9yIGVhY2ggZW50cnkgKi8KKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwb3J0LT5pcnEsIG14c19ncGlvX2lycV9oYW5kbGVyKTsKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShwb3J0LT5pcnEsIHBvcnQpOworCisJZXJyID0gYmdwaW9faW5pdCgmcG9ydC0+YmdjLCAmcGRldi0+ZGV2LCA0LAorCQkJIHBvcnQtPmJhc2UgKyBQSU5DVFJMX0RJTihwb3J0LT5pZCksCisJCQkgcG9ydC0+YmFzZSArIFBJTkNUUkxfRE9VVChwb3J0LT5pZCksIE5VTEwsCisJCQkgcG9ydC0+YmFzZSArIFBJTkNUUkxfRE9FKHBvcnQtPmlkKSwgTlVMTCwgZmFsc2UpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2lvdW5tYXA7CisKKwlwb3J0LT5iZ2MuZ2MudG9faXJxID0gbXhzX2dwaW9fdG9faXJxOworCXBvcnQtPmJnYy5nYy5iYXNlID0gcG9ydC0+aWQgKiAzMjsKKworCWVyciA9IGdwaW9jaGlwX2FkZCgmcG9ydC0+YmdjLmdjKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9iZ3Bpb19yZW1vdmU7CisKKwlyZXR1cm4gMDsKKworb3V0X2JncGlvX3JlbW92ZToKKwliZ3Bpb19yZW1vdmUoJnBvcnQtPmJnYyk7CitvdXRfaW91bm1hcDoKKwlpZiAoaW9yZXMpCisJCWlvdW5tYXAocG9ydC0+YmFzZSk7CitvdXRfcmVsZWFzZV9tZW06CisJaWYgKGlvcmVzKQorCQlyZWxlYXNlX21lbV9yZWdpb24oaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSk7CitvdXRfa2ZyZWU6CisJa2ZyZWUocG9ydCk7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIGZhaWxlZCB3aXRoIGVycm5vICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBteHNfZ3Bpb19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImdwaW8tbXhzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gbXhzX2dwaW9fcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBteHNfZ3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXhzX2dwaW9fZHJpdmVyKTsKK30KK3Bvc3Rjb3JlX2luaXRjYWxsKG14c19ncGlvX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgIgorCSAgICAgICJEYW5pZWwgTWFjayA8ZGFuaWVsbmNhaWFxLmRlPiwgIgorCSAgICAgICJKdWVyZ2VuIEJlaXNlcnQgPGtlcm5lbEBwZW5ndXRyb25peC5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIE1YUyBHUElPIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1ub21hZGlrLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1ub21hZGlrLmMKaW5kZXggNDk2MWVmOS4uMmMyMTJjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbm9tYWRpay5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW5vbWFkaWsuYwpAQCAtNCw2ICs0LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5IFNUTWljcm9lbGVjdHJvbmljcwogICogQ29weXJpZ2h0IChDKSAyMDA5IEFsZXNzYW5kcm8gUnViaW5pIDxydWJpbmlAdW5pcHYuaXQ+CiAgKiAgIFJld3JpdHRlbiBiYXNlZCBvbiB3b3JrIGJ5IFByYWZ1bGxhIFdBREFTS0FSIDxwcmFmdWxsYS53YWRhc2thckBzdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBsaW5hcm8ub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtNDksNiArNTAsNyBAQAogCXUzMiAoKmdldF9zZWNvbmRhcnlfc3RhdHVzKSh1bnNpZ25lZCBpbnQgYmFuayk7CiAJdm9pZCAoKnNldF9pb2ZvcmNlKShib29sIGVuYWJsZSk7CiAJc3BpbmxvY2tfdCBsb2NrOworCWJvb2wgc2xlZXBtb2RlOwogCS8qIEtlZXAgdHJhY2sgb2YgY29uZmlndXJlZCBlZGdlcyAqLwogCXUzMiBlZGdlX3Jpc2luZzsKIAl1MzIgZWRnZV9mYWxsaW5nOwpAQCAtMzkzLDE0ICszOTUsMjUgQEAKICAqIEBncGlvOiBwaW4gbnVtYmVyCiAgKiBAbW9kZTogTk1LX0dQSU9fU0xQTV9JTlBVVCBvciBOTUtfR1BJT19TTFBNX05PQ0hBTkdFLAogICoKLSAqIFNldHMgdGhlIHNsZWVwIG1vZGUgb2YgYSBwaW4uICBJZiBAbW9kZSBpcyBOTUtfR1BJT19TTFBNX0lOUFVULCB0aGUgcGluIGlzCi0gKiBjaGFuZ2VkIHRvIGFuIGlucHV0ICh3aXRoIHB1bGx1cC9kb3duIGVuYWJsZWQpIGluIHNsZWVwIGFuZCBkZWVwIHNsZWVwLiAgSWYKLSAqIEBtb2RlIGlzIE5NS19HUElPX1NMUE1fTk9DSEFOR0UsIHRoZSBwaW4gcmVtYWlucyBpbiB0aGUgc3RhdGUgaXQgd2FzCi0gKiBjb25maWd1cmVkIGV2ZW4gd2hlbiBpbiBzbGVlcCBhbmQgZGVlcCBzbGVlcC4KKyAqIFRoaXMgcmVnaXN0ZXIgaXMgYWN0dWFsbHkgaW4gdGhlIHBpbm11eCBsYXllciwgbm90IHRoZSBHUElPIGJsb2NrIGl0c2VsZi4KKyAqIFRoZSBHUElPMUJfU0xQTSByZWdpc3RlciBkZWZpbmVzIHRoZSBHUElPIG1vZGUgd2hlbiBTTEVFUC9ERUVQLVNMRUVQCisgKiBtb2RlIGlzIGVudGVyZWQgKGkuZS4gd2hlbiBzaWduYWwgSU9GT1JDRSBpcyBISUdIIGJ5IHRoZSBwbGF0Zm9ybSBjb2RlKS4KKyAqIEVhY2ggR1BJTyBjYW4gYmUgY29uZmlndXJlZCB0byBiZSBmb3JjZWQgaW50byBHUElPIG1vZGUgd2hlbiBJT0ZPUkNFIGlzCisgKiBISUdILCBvdmVycmlkaW5nIHRoZSBub3JtYWwgc2V0dGluZyBkZWZpbmVkIGJ5IEdQSU9fQUZTRUx4IHJlZ2lzdGVycy4KKyAqIFdoZW4gSU9GT1JDRSByZXR1cm5zIExPVyAoYnkgc29mdHdhcmUsIGFmdGVyIFNMRUVQL0RFRVAtU0xFRVAgZXhpdCksCisgKiB0aGUgR1BJT3MgcmV0dXJuIHRvIHRoZSBub3JtYWwgc2V0dGluZyBkZWZpbmVkIGJ5IEdQSU9fQUZTRUx4IHJlZ2lzdGVycy4KICAqCi0gKiBPbiBEQjg1MDB2MiBvbndhcmRzLCB0aGlzIHNldHRpbmcgbG9zZXMgdGhlIHByZXZpb3VzIG1lYW5pbmcgYW5kIGluc3RlYWQKLSAqIGluZGljYXRlcyBpZiB3YWtldXAgZGV0ZWN0aW9uIGlzIGVuYWJsZWQgb24gdGhlIHBpbi4gIE5vdGUgdGhhdAotICogZW5hYmxlX2lycV93YWtlKCkgd2lsbCBhdXRvbWF0aWNhbGx5IGVuYWJsZSB3YWtldXAgZGV0ZWN0aW9uLgorICogSWYgQG1vZGUgaXMgTk1LX0dQSU9fU0xQTV9JTlBVVCwgdGhlIGNvcnJlc3BvbmRpbmcgR1BJTyBpcyBzd2l0Y2hlZCB0byBHUElPCisgKiBtb2RlIHdoZW4gc2lnbmFsIElPRk9SQ0UgaXMgSElHSCAoaS5lLiB3aGVuIFNMRUVQL0RFRVAtU0xFRVAgbW9kZSBpcworICogZW50ZXJlZCkgcmVnYXJkbGVzcyBvZiB0aGUgYWx0ZnVuY3Rpb24gc2VsZWN0ZWQuIEFsc28gd2FrZS11cCBkZXRlY3Rpb24gaXMKKyAqIEVOQUJMRUQuCisgKgorICogSWYgQG1vZGUgaXMgTk1LX0dQSU9fU0xQTV9OT0NIQU5HRSwgdGhlIGNvcnJlc3BvbmRpbmcgR1BJTyByZW1haW5zCisgKiBjb250cm9sbGVkIGJ5IE5NS19HUElPX0RBVEMsIE5NS19HUElPX0RBVFMsIE5NS19HUElPX0RJUiwgTk1LX0dQSU9fUERJUworICogKGZvciBhbHRmdW5jdGlvbiBHUElPKSBvciByZXNwZWN0aXZlIG9uLWNoaXAgcGVyaXBoZXJhbHMgKGZvciBvdGhlcgorICogYWx0ZnVuY3MpIHdoZW4gSU9GT1JDRSBpcyBISUdILiBBbHNvIHdha2UtdXAgZGV0ZWN0aW9uIERJU0FCTEVELgorICoKKyAqIE5vdGUgdGhhdCBlbmFibGVfaXJxX3dha2UoKSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHdha2V1cCBkZXRlY3Rpb24uCiAgKi8KIGludCBubWtfZ3Bpb19zZXRfc2xwbShpbnQgZ3BpbywgZW51bSBubWtfZ3Bpb19zbHBtIG1vZGUpCiB7CkBAIC01NTEsNiArNTY0LDEyIEBACiBzdGF0aWMgdm9pZCBfX25ta19ncGlvX3NldF93YWtlKHN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcCwKIAkJCQlpbnQgZ3BpbywgYm9vbCBvbikKIHsKKwlpZiAobm1rX2NoaXAtPnNsZWVwbW9kZSkgeworCQlfX25ta19ncGlvX3NldF9zbHBtKG5ta19jaGlwLCBncGlvIC0gbm1rX2NoaXAtPmNoaXAuYmFzZSwKKwkJCQkgICAgb24gPyBOTUtfR1BJT19TTFBNX1dBS0VVUF9FTkFCTEUKKwkJCQkgICAgOiBOTUtfR1BJT19TTFBNX1dBS0VVUF9ESVNBQkxFKTsKKwl9CisKIAlfX25ta19ncGlvX2lycV9tb2RpZnkobm1rX2NoaXAsIGdwaW8sIFdBS0UsIG9uKTsKIH0KIApAQCAtOTAxLDcgKzkyMCw3IEBACiAJCXdyaXRlbChjaGlwLT5md2ltc2MgJiBjaGlwLT5yZWFsX3dha2UsCiAJCSAgICAgICBjaGlwLT5hZGRyICsgTk1LX0dQSU9fRldJTVNDKTsKIAotCQlpZiAoY3B1X2lzX3U4NTAwdjIoKSkgeworCQlpZiAoY2hpcC0+c2xlZXBtb2RlKSB7CiAJCQljaGlwLT5zbHBtID0gcmVhZGwoY2hpcC0+YWRkciArIE5NS19HUElPX1NMUEMpOwogCiAJCQkvKiAwIC0+IHdha2V1cCBlbmFibGUgKi8KQEAgLTkyMyw3ICs5NDIsNyBAQAogCQl3cml0ZWwoY2hpcC0+cndpbXNjLCBjaGlwLT5hZGRyICsgTk1LX0dQSU9fUldJTVNDKTsKIAkJd3JpdGVsKGNoaXAtPmZ3aW1zYywgY2hpcC0+YWRkciArIE5NS19HUElPX0ZXSU1TQyk7CiAKLQkJaWYgKGNwdV9pc191ODUwMHYyKCkpCisJCWlmIChjaGlwLT5zbGVlcG1vZGUpCiAJCQl3cml0ZWwoY2hpcC0+c2xwbSwgY2hpcC0+YWRkciArIE5NS19HUElPX1NMUEMpOwogCX0KIH0KQEAgLTEwMTAsNiArMTAyOSw3IEBACiAJbm1rX2NoaXAtPnNlY29uZGFyeV9wYXJlbnRfaXJxID0gc2Vjb25kYXJ5X2lycTsKIAlubWtfY2hpcC0+Z2V0X3NlY29uZGFyeV9zdGF0dXMgPSBwZGF0YS0+Z2V0X3NlY29uZGFyeV9zdGF0dXM7CiAJbm1rX2NoaXAtPnNldF9pb2ZvcmNlID0gcGRhdGEtPnNldF9pb2ZvcmNlOworCW5ta19jaGlwLT5zbGVlcG1vZGUgPSBwZGF0YS0+c3VwcG9ydHNfc2xlZXBtb2RlOwogCXNwaW5fbG9ja19pbml0KCZubWtfY2hpcC0+bG9jayk7CiAKIAljaGlwID0gJm5ta19jaGlwLT5jaGlwOwpAQCAtMTA2NSw1ICsxMDg1LDMgQEAKIE1PRFVMRV9BVVRIT1IoIlByYWZ1bGxhIFdBREFTS0FSIGFuZCBBbGVzc2FuZHJvIFJ1YmluaSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJOb21hZGlrIEdQSU8gRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tb21hcC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tb21hcC5jCmluZGV4IDZjNTExOTEuLjA1OTk4NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW9tYXAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1vbWFwLmMKQEAgLTU0LDYgKzU0LDExIEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCWJvb2wgZGJja19mbGFnOwogCWludCBzdHJpZGU7CisJdTMyIHdpZHRoOworCisJdm9pZCAoKnNldF9kYXRhb3V0KShzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSk7CisKKwlzdHJ1Y3Qgb21hcF9ncGlvX3JlZ19vZmZzICpyZWdzOwogfTsKIAogI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCkBAIC03OSwxMjEgKzg0LDE4IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19iYW5rICpncGlvX2Jhbms7CiAKLXN0YXRpYyBpbnQgYmFua193aWR0aDsKLQogLyogVE9ETzogQW5hbHl6ZSByZW1vdmluZyBncGlvX2JhbmtfY291bnQgdXNhZ2UgZnJvbSBkcml2ZXIgY29kZSAqLwogaW50IGdwaW9fYmFua19jb3VudDsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZ3Bpb19iYW5rICpnZXRfZ3Bpb19iYW5rKGludCBncGlvKQotewotCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgewotCQlpZiAoT01BUF9HUElPX0lTX01QVUlPKGdwaW8pKQotCQkJcmV0dXJuICZncGlvX2JhbmtbMF07Ci0JCXJldHVybiAmZ3Bpb19iYW5rWzFdOwotCX0KLQlpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKLQkJaWYgKE9NQVBfR1BJT19JU19NUFVJTyhncGlvKSkKLQkJCXJldHVybiAmZ3Bpb19iYW5rWzBdOwotCQlyZXR1cm4gJmdwaW9fYmFua1sxICsgKGdwaW8gPj4gNCldOwotCX0KLQlpZiAoY3B1X2lzX29tYXA3eHgoKSkgewotCQlpZiAoT01BUF9HUElPX0lTX01QVUlPKGdwaW8pKQotCQkJcmV0dXJuICZncGlvX2JhbmtbMF07Ci0JCXJldHVybiAmZ3Bpb19iYW5rWzEgKyAoZ3BpbyA+PiA1KV07Ci0JfQotCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKLQkJcmV0dXJuICZncGlvX2JhbmtbZ3BpbyA+PiA1XTsKLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkgfHwgY3B1X2lzX29tYXA0NHh4KCkpCi0JCXJldHVybiAmZ3Bpb19iYW5rW2dwaW8gPj4gNV07Ci0JQlVHKCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdldF9ncGlvX2luZGV4KGludCBncGlvKQotewotCWlmIChjcHVfaXNfb21hcDd4eCgpKQotCQlyZXR1cm4gZ3BpbyAmIDB4MWY7Ci0JaWYgKGNwdV9pc19vbWFwMjR4eCgpKQotCQlyZXR1cm4gZ3BpbyAmIDB4MWY7Ci0JaWYgKGNwdV9pc19vbWFwMzR4eCgpIHx8IGNwdV9pc19vbWFwNDR4eCgpKQotCQlyZXR1cm4gZ3BpbyAmIDB4MWY7Ci0JcmV0dXJuIGdwaW8gJiAweDBmOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBncGlvX3ZhbGlkKGludCBncGlvKQotewotCWlmIChncGlvIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSAmJiBPTUFQX0dQSU9fSVNfTVBVSU8oZ3BpbykpIHsKLQkJaWYgKGdwaW8gPj0gT01BUF9NQVhfR1BJT19MSU5FUyArIDE2KQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGNwdV9pc19vbWFwMTV4eCgpICYmIGdwaW8gPCAxNikKLQkJcmV0dXJuIDA7Ci0JaWYgKChjcHVfaXNfb21hcDE2eHgoKSkgJiYgZ3BpbyA8IDY0KQotCQlyZXR1cm4gMDsKLQlpZiAoY3B1X2lzX29tYXA3eHgoKSAmJiBncGlvIDwgMTkyKQotCQlyZXR1cm4gMDsKLQlpZiAoY3B1X2lzX29tYXAyNDIwKCkgJiYgZ3BpbyA8IDEyOCkKLQkJcmV0dXJuIDA7Ci0JaWYgKGNwdV9pc19vbWFwMjQzMCgpICYmIGdwaW8gPCAxNjApCi0JCXJldHVybiAwOwotCWlmICgoY3B1X2lzX29tYXAzNHh4KCkgfHwgY3B1X2lzX29tYXA0NHh4KCkpICYmIGdwaW8gPCAxOTIpCi0JCXJldHVybiAwOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBjaGVja19ncGlvKGludCBncGlvKQotewotCWlmICh1bmxpa2VseShncGlvX3ZhbGlkKGdwaW8pIDwgMCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJvbWFwLWdwaW86IGludmFsaWQgR1BJTyAlZFxuIiwgZ3Bpbyk7Ci0JCWR1bXBfc3RhY2soKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KKyNkZWZpbmUgR1BJT19JTkRFWChiYW5rLCBncGlvKSAoZ3BpbyAlIGJhbmstPndpZHRoKQorI2RlZmluZSBHUElPX0JJVChiYW5rLCBncGlvKSAoMSA8PCBHUElPX0lOREVYKGJhbmssIGdwaW8pKQogCiBzdGF0aWMgdm9pZCBfc2V0X2dwaW9fZGlyZWN0aW9uKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgaXNfaW5wdXQpCiB7CiAJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwogCXUzMiBsOwogCi0Jc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQotCWNhc2UgTUVUSE9EX01QVUlPOgotCQlyZWcgKz0gT01BUF9NUFVJT19JT19DTlRMIC8gYmFuay0+c3RyaWRlOwotCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCi0JY2FzZSBNRVRIT0RfR1BJT18xNTEwOgotCQlyZWcgKz0gT01BUDE1MTBfR1BJT19ESVJfQ09OVFJPTDsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAotCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKLQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRElSRUNUSU9OOwotCQlicmVhazsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDczMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQODUwKQotCWNhc2UgTUVUSE9EX0dQSU9fN1hYOgotCQlyZWcgKz0gT01BUDdYWF9HUElPX0RJUl9DT05UUk9MOwotCQlicmVhazsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCi0JY2FzZSBNRVRIT0RfR1BJT18yNFhYOgotCQlyZWcgKz0gT01BUDI0WFhfR1BJT19PRTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA0KQotCWNhc2UgTUVUSE9EX0dQSU9fNDRYWDoKLQkJcmVnICs9IE9NQVA0X0dQSU9fT0U7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuOwotCX0KKwlyZWcgKz0gYmFuay0+cmVncy0+ZGlyZWN0aW9uOwogCWwgPSBfX3Jhd19yZWFkbChyZWcpOwogCWlmIChpc19pbnB1dCkKIAkJbCB8PSAxIDw8IGdwaW87CkBAIC0yMDIsMTY1ICsxMDQsNDggQEAKIAlfX3Jhd193cml0ZWwobCwgcmVnKTsKIH0KIAotc3RhdGljIHZvaWQgX3NldF9ncGlvX2RhdGFvdXQoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCBlbmFibGUpCisKKy8qIHNldCBkYXRhIG91dCB2YWx1ZSB1c2luZyBkZWRpY2F0ZSBzZXQvY2xlYXIgcmVnaXN0ZXIgKi8KK3N0YXRpYyB2b2lkIF9zZXRfZ3Bpb19kYXRhb3V0X3JlZyhzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7Ci0JdTMyIGwgPSAwOworCXUzMiBsID0gR1BJT19CSVQoYmFuaywgZ3Bpbyk7CiAKLQlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCi0JY2FzZSBNRVRIT0RfTVBVSU86Ci0JCXJlZyArPSBPTUFQX01QVUlPX09VVFBVVCAvIGJhbmstPnN0cmlkZTsKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlbmFibGUpCi0JCQlsIHw9IDEgPDwgZ3BpbzsKLQkJZWxzZQotCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKLQljYXNlIE1FVEhPRF9HUElPXzE1MTA6Ci0JCXJlZyArPSBPTUFQMTUxMF9HUElPX0RBVEFfT1VUUFVUOwotCQlsID0gX19yYXdfcmVhZGwocmVnKTsKLQkJaWYgKGVuYWJsZSkKLQkJCWwgfD0gMSA8PCBncGlvOwotCQllbHNlCi0JCQlsICY9IH4oMSA8PCBncGlvKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAotCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKLQkJaWYgKGVuYWJsZSkKLQkJCXJlZyArPSBPTUFQMTYxMF9HUElPX1NFVF9EQVRBT1VUOwotCQllbHNlCi0JCQlyZWcgKz0gT01BUDE2MTBfR1BJT19DTEVBUl9EQVRBT1VUOwotCQlsID0gMSA8PCBncGlvOwotCQlicmVhazsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDczMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQODUwKQotCWNhc2UgTUVUSE9EX0dQSU9fN1hYOgotCQlyZWcgKz0gT01BUDdYWF9HUElPX0RBVEFfT1VUUFVUOwotCQlsID0gX19yYXdfcmVhZGwocmVnKTsKLQkJaWYgKGVuYWJsZSkKLQkJCWwgfD0gMSA8PCBncGlvOwotCQllbHNlCi0JCQlsICY9IH4oMSA8PCBncGlvKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQotCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKLQkJaWYgKGVuYWJsZSkKLQkJCXJlZyArPSBPTUFQMjRYWF9HUElPX1NFVERBVEFPVVQ7Ci0JCWVsc2UKLQkJCXJlZyArPSBPTUFQMjRYWF9HUElPX0NMRUFSREFUQU9VVDsKLQkJbCA9IDEgPDwgZ3BpbzsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNAotCWNhc2UgTUVUSE9EX0dQSU9fNDRYWDoKLQkJaWYgKGVuYWJsZSkKLQkJCXJlZyArPSBPTUFQNF9HUElPX1NFVERBVEFPVVQ7Ci0JCWVsc2UKLQkJCXJlZyArPSBPTUFQNF9HUElPX0NMRUFSREFUQU9VVDsKLQkJbCA9IDEgPDwgZ3BpbzsKLQkJYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlXQVJOX09OKDEpOwotCQlyZXR1cm47Ci0JfQorCWlmIChlbmFibGUpCisJCXJlZyArPSBiYW5rLT5yZWdzLT5zZXRfZGF0YW91dDsKKwllbHNlCisJCXJlZyArPSBiYW5rLT5yZWdzLT5jbHJfZGF0YW91dDsKKworCV9fcmF3X3dyaXRlbChsLCByZWcpOworfQorCisvKiBzZXQgZGF0YSBvdXQgdmFsdWUgdXNpbmcgbWFzayByZWdpc3RlciAqLworc3RhdGljIHZvaWQgX3NldF9ncGlvX2RhdGFvdXRfbWFzayhzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBiYW5rLT5yZWdzLT5kYXRhb3V0OworCXUzMiBncGlvX2JpdCA9IEdQSU9fQklUKGJhbmssIGdwaW8pOworCXUzMiBsOworCisJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJaWYgKGVuYWJsZSkKKwkJbCB8PSBncGlvX2JpdDsKKwllbHNlCisJCWwgJj0gfmdwaW9fYml0OwogCV9fcmF3X3dyaXRlbChsLCByZWcpOwogfQogCiBzdGF0aWMgaW50IF9nZXRfZ3Bpb19kYXRhaW4oc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8pCiB7Ci0Jdm9pZCBfX2lvbWVtICpyZWc7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlICsgYmFuay0+cmVncy0+ZGF0YWluOwogCi0JaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZWcgPSBiYW5rLT5iYXNlOwotCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKLQljYXNlIE1FVEhPRF9NUFVJTzoKLQkJcmVnICs9IE9NQVBfTVBVSU9fSU5QVVRfTEFUQ0ggLyBiYW5rLT5zdHJpZGU7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKLQljYXNlIE1FVEhPRF9HUElPXzE1MTA6Ci0JCXJlZyArPSBPTUFQMTUxMF9HUElPX0RBVEFfSU5QVVQ7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKLQljYXNlIE1FVEhPRF9HUElPXzE2MTA6Ci0JCXJlZyArPSBPTUFQMTYxMF9HUElPX0RBVEFJTjsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDg1MCkKLQljYXNlIE1FVEhPRF9HUElPXzdYWDoKLQkJcmVnICs9IE9NQVA3WFhfR1BJT19EQVRBX0lOUFVUOwotCQlicmVhazsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCi0JY2FzZSBNRVRIT0RfR1BJT18yNFhYOgotCQlyZWcgKz0gT01BUDI0WFhfR1BJT19EQVRBSU47Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDQKLQljYXNlIE1FVEhPRF9HUElPXzQ0WFg6Ci0JCXJlZyArPSBPTUFQNF9HUElPX0RBVEFJTjsKLQkJYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIChfX3Jhd19yZWFkbChyZWcpCi0JCQkmICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSkgIT0gMDsKKwlyZXR1cm4gKF9fcmF3X3JlYWRsKHJlZykgJiBHUElPX0JJVChiYW5rLCBncGlvKSkgIT0gMDsKIH0KIAogc3RhdGljIGludCBfZ2V0X2dwaW9fZGF0YW91dChzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbykKIHsKLQl2b2lkIF9faW9tZW0gKnJlZzsKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBiYW5rLT5yZWdzLT5kYXRhb3V0OwogCi0JaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZWcgPSBiYW5rLT5iYXNlOwotCi0Jc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQotCWNhc2UgTUVUSE9EX01QVUlPOgotCQlyZWcgKz0gT01BUF9NUFVJT19PVVRQVVQgLyBiYW5rLT5zdHJpZGU7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKLQljYXNlIE1FVEhPRF9HUElPXzE1MTA6Ci0JCXJlZyArPSBPTUFQMTUxMF9HUElPX0RBVEFfT1VUUFVUOwotCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCi0JY2FzZSBNRVRIT0RfR1BJT18xNjEwOgotCQlyZWcgKz0gT01BUDE2MTBfR1BJT19EQVRBT1VUOwotCQlicmVhazsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDczMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQODUwKQotCWNhc2UgTUVUSE9EX0dQSU9fN1hYOgotCQlyZWcgKz0gT01BUDdYWF9HUElPX0RBVEFfT1VUUFVUOwotCQlicmVhazsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCi0JY2FzZSBNRVRIT0RfR1BJT18yNFhYOgotCQlyZWcgKz0gT01BUDI0WFhfR1BJT19EQVRBT1VUOwotCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVA0Ci0JY2FzZSBNRVRIT0RfR1BJT180NFhYOgotCQlyZWcgKz0gT01BUDRfR1BJT19EQVRBT1VUOwotCQlicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAoX19yYXdfcmVhZGwocmVnKSAmICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSkgIT0gMDsKKwlyZXR1cm4gKF9fcmF3X3JlYWRsKHJlZykgJiBHUElPX0JJVChiYW5rLCBncGlvKSkgIT0gMDsKIH0KIAogI2RlZmluZSBNT0RfUkVHX0JJVChyZWcsIGJpdF9tYXNrLCBzZXQpCVwKQEAgLTM4Myw3ICsxNjgsNyBAQAogc3RhdGljIHZvaWQgX3NldF9ncGlvX2RlYm91bmNlKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIHVuc2lnbmVkIGdwaW8sCiAJCXVuc2lnbmVkIGRlYm91bmNlKQogewotCXZvaWQgX19pb21lbQkJKnJlZyA9IGJhbmstPmJhc2U7CisJdm9pZCBfX2lvbWVtCQkqcmVnOwogCXUzMgkJCXZhbDsKIAl1MzIJCQlsOwogCkBAIC0zOTcsMjEgKzE4MiwxMiBAQAogCWVsc2UKIAkJZGVib3VuY2UgPSAoZGVib3VuY2UgLyAweDFmKSAtIDE7CiAKLQlsID0gMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKTsKKwlsID0gR1BJT19CSVQoYmFuaywgZ3Bpbyk7CiAKLQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzQ0WFgpCi0JCXJlZyArPSBPTUFQNF9HUElPX0RFQk9VTkNJTkdUSU1FOwotCWVsc2UKLQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fREVCT1VOQ0VfVkFMOwotCisJcmVnID0gYmFuay0+YmFzZSArIGJhbmstPnJlZ3MtPmRlYm91bmNlOwogCV9fcmF3X3dyaXRlbChkZWJvdW5jZSwgcmVnKTsKIAotCXJlZyA9IGJhbmstPmJhc2U7Ci0JaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT180NFhYKQotCQlyZWcgKz0gT01BUDRfR1BJT19ERUJPVU5DRU5BQkxFOwotCWVsc2UKLQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fREVCT1VOQ0VfRU47Ci0KKwlyZWcgPSBiYW5rLT5iYXNlICsgYmFuay0+cmVncy0+ZGVib3VuY2VfZW47CiAJdmFsID0gX19yYXdfcmVhZGwocmVnKTsKIAogCWlmIChkZWJvdW5jZSkgewpAQCAtNDMyLDcgKzIwOCw2IEBACiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gYmFuay0+YmFzZTsKIAl1MzIgZ3Bpb19iaXQgPSAxIDw8IGdwaW87Ci0JdTMyIHZhbDsKIAogCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewogCQlNT0RfUkVHX0JJVChPTUFQNF9HUElPX0xFVkVMREVURUNUMCwgZ3Bpb19iaXQsCkBAIC00NTUsMTUgKzIzMCw4IEBACiAJfQogCWlmIChsaWtlbHkoIShiYW5rLT5ub25fd2FrZXVwX2dwaW9zICYgZ3Bpb19iaXQpKSkgewogCQlpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKLQkJCWlmICh0cmlnZ2VyICE9IDApCi0JCQkJX19yYXdfd3JpdGVsKDEgPDwgZ3BpbywgYmFuay0+YmFzZSsKLQkJCQkJCU9NQVA0X0dQSU9fSVJRV0FLRU4wKTsKLQkJCWVsc2UgewotCQkJCXZhbCA9IF9fcmF3X3JlYWRsKGJhbmstPmJhc2UgKwotCQkJCQkJCU9NQVA0X0dQSU9fSVJRV0FLRU4wKTsKLQkJCQlfX3Jhd193cml0ZWwodmFsICYgKH4oMSA8PCBncGlvKSksIGJhbmstPmJhc2UgKwotCQkJCQkJCSBPTUFQNF9HUElPX0lSUVdBS0VOMCk7Ci0JCQl9CisJCQlNT0RfUkVHX0JJVChPTUFQNF9HUElPX0lSUVdBS0VOMCwgZ3Bpb19iaXQsCisJCQkJdHJpZ2dlciAhPSAwKTsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBHUElPIHdha2V1cCByZXF1ZXN0IGNhbiBvbmx5IGJlIGdlbmVyYXRlZCBvbiBlZGdlCkBAIC00NzcsOCArMjQ1LDkgQEAKIAkJCQkJKyBPTUFQMjRYWF9HUElPX0NMRUFSV0tVRU5BKTsKIAkJfQogCX0KLQkvKiBUaGlzIHBhcnQgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgYWx3YXlzIGZvciBPTUFQMzR4eCAqLwotCWlmIChjcHVfaXNfb21hcDM0eHgoKSB8fCAoYmFuay0+bm9uX3dha2V1cF9ncGlvcyAmIGdwaW9fYml0KSkgeworCS8qIFRoaXMgcGFydCBuZWVkcyB0byBiZSBleGVjdXRlZCBhbHdheXMgZm9yIE9NQVB7MzR4eCwgNDR4eH0gKi8KKwlpZiAoY3B1X2lzX29tYXAzNHh4KCkgfHwgY3B1X2lzX29tYXA0NHh4KCkgfHwKKwkJCShiYW5rLT5ub25fd2FrZXVwX2dwaW9zICYgZ3Bpb19iaXQpKSB7CiAJCS8qCiAJCSAqIExvZyB0aGUgZWRnZSBncGlvIGFuZCBtYW51YWxseSB0cmlnZ2VyIHRoZSBJUlEKIAkJICogYWZ0ZXIgcmVzdW1lIGlmIHRoZSBpbnB1dCBsZXZlbCBjaGFuZ2VzCkBAIC02MzYsOSArNDA1LDYgQEAKIAllbHNlCiAJCWdwaW8gPSBkLT5pcnEgLSBJSF9HUElPX0JBU0U7CiAKLQlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKHR5cGUgJiB+SVJRX1RZUEVfU0VOU0VfTUFTSykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTY0OSw3ICs0MTUsNyBAQAogCiAJYmFuayA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZiYW5rLT5sb2NrLCBmbGFncyk7Ci0JcmV0dmFsID0gX3NldF9ncGlvX3RyaWdnZXJpbmcoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHR5cGUpOworCXJldHZhbCA9IF9zZXRfZ3Bpb190cmlnZ2VyaW5nKGJhbmssIEdQSU9fSU5ERVgoYmFuaywgZ3BpbyksIHR5cGUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIAogCWlmICh0eXBlICYgKElSUV9UWVBFX0xFVkVMX0xPVyB8IElSUV9UWVBFX0xFVkVMX0hJR0gpKQpAQCAtNjY0LDE5NSArNDMwLDgxIEBACiB7CiAJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwogCi0Jc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQotCWNhc2UgTUVUSE9EX01QVUlPOgotCQkvKiBNUFVJTyBpcnFzdGF0dXMgaXMgcmVzZXQgYnkgcmVhZGluZyB0aGUgc3RhdHVzIHJlZ2lzdGVyLAotCQkgKiBzbyBkbyBub3RoaW5nIGhlcmUgKi8KLQkJcmV0dXJuOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKLQljYXNlIE1FVEhPRF9HUElPXzE1MTA6Ci0JCXJlZyArPSBPTUFQMTUxMF9HUElPX0lOVF9TVEFUVVM7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKLQljYXNlIE1FVEhPRF9HUElPXzE2MTA6Ci0JCXJlZyArPSBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzE7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNzMwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA4NTApCi0JY2FzZSBNRVRIT0RfR1BJT183WFg6Ci0JCXJlZyArPSBPTUFQN1hYX0dQSU9fSU5UX1NUQVRVUzsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQotCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKLQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fSVJRU1RBVFVTMTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA0KQotCWNhc2UgTUVUSE9EX0dQSU9fNDRYWDoKLQkJcmVnICs9IE9NQVA0X0dQSU9fSVJRU1RBVFVTMDsKLQkJYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlXQVJOX09OKDEpOwotCQlyZXR1cm47Ci0JfQorCXJlZyArPSBiYW5rLT5yZWdzLT5pcnFzdGF0dXM7CiAJX19yYXdfd3JpdGVsKGdwaW9fbWFzaywgcmVnKTsKIAogCS8qIFdvcmthcm91bmQgZm9yIGNsZWFyaW5nIERTUCBHUElPIGludGVycnVwdHMgdG8gYWxsb3cgcmV0ZW50aW9uICovCi0JaWYgKGNwdV9pc19vbWFwMjR4eCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpKQotCQlyZWcgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19JUlFTVEFUVVMyOwotCWVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKQotCQlyZWcgPSBiYW5rLT5iYXNlICsgT01BUDRfR1BJT19JUlFTVEFUVVMxOwotCi0JaWYgKGNwdV9pc19vbWFwMjR4eCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpIHx8IGNwdV9pc19vbWFwNDR4eCgpKSB7CisJaWYgKGJhbmstPnJlZ3MtPmlycXN0YXR1czIpIHsKKwkJcmVnID0gYmFuay0+YmFzZSArIGJhbmstPnJlZ3MtPmlycXN0YXR1czI7CiAJCV9fcmF3X3dyaXRlbChncGlvX21hc2ssIHJlZyk7CisJfQogCiAJLyogRmx1c2ggcG9zdGVkIHdyaXRlIGZvciB0aGUgaXJxIHN0YXR1cyB0byBhdm9pZCBzcHVyaW91cyBpbnRlcnJ1cHRzICovCiAJX19yYXdfcmVhZGwocmVnKTsKLQl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfY2xlYXJfZ3Bpb19pcnFzdGF0dXMoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8pCiB7Ci0JX2NsZWFyX2dwaW9faXJxYmFuayhiYW5rLCAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKKwlfY2xlYXJfZ3Bpb19pcnFiYW5rKGJhbmssIEdQSU9fQklUKGJhbmssIGdwaW8pKTsKIH0KIAogc3RhdGljIHUzMiBfZ2V0X2dwaW9faXJxYmFua19tYXNrKHN0cnVjdCBncGlvX2JhbmsgKmJhbmspCiB7CiAJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwotCWludCBpbnYgPSAwOwogCXUzMiBsOwotCXUzMiBtYXNrOworCXUzMiBtYXNrID0gKDEgPDwgYmFuay0+d2lkdGgpIC0gMTsKIAotCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKLQljYXNlIE1FVEhPRF9NUFVJTzoKLQkJcmVnICs9IE9NQVBfTVBVSU9fR1BJT19NQVNLSVQgLyBiYW5rLT5zdHJpZGU7Ci0JCW1hc2sgPSAweGZmZmY7Ci0JCWludiA9IDE7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKLQljYXNlIE1FVEhPRF9HUElPXzE1MTA6Ci0JCXJlZyArPSBPTUFQMTUxMF9HUElPX0lOVF9NQVNLOwotCQltYXNrID0gMHhmZmZmOwotCQlpbnYgPSAxOwotCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCi0JY2FzZSBNRVRIT0RfR1BJT18xNjEwOgotCQlyZWcgKz0gT01BUDE2MTBfR1BJT19JUlFFTkFCTEUxOwotCQltYXNrID0gMHhmZmZmOwotCQlicmVhazsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDczMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQODUwKQotCWNhc2UgTUVUSE9EX0dQSU9fN1hYOgotCQlyZWcgKz0gT01BUDdYWF9HUElPX0lOVF9NQVNLOwotCQltYXNrID0gMHhmZmZmZmZmZjsKLQkJaW52ID0gMTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQotCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKLQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fSVJRRU5BQkxFMTsKLQkJbWFzayA9IDB4ZmZmZmZmZmY7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNCkKLQljYXNlIE1FVEhPRF9HUElPXzQ0WFg6Ci0JCXJlZyArPSBPTUFQNF9HUElPX0lSUVNUQVRVU1NFVDA7Ci0JCW1hc2sgPSAweGZmZmZmZmZmOwotCQlicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiAwOwotCX0KLQorCXJlZyArPSBiYW5rLT5yZWdzLT5pcnFlbmFibGU7CiAJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JaWYgKGludikKKwlpZiAoYmFuay0+cmVncy0+aXJxZW5hYmxlX2ludikKIAkJbCA9IH5sOwogCWwgJj0gbWFzazsKIAlyZXR1cm4gbDsKIH0KIAotc3RhdGljIHZvaWQgX2VuYWJsZV9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaywgaW50IGVuYWJsZSkKK3N0YXRpYyB2b2lkIF9lbmFibGVfZ3Bpb19pcnFiYW5rKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvX21hc2spCiB7CiAJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwogCXUzMiBsOwogCi0Jc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQotCWNhc2UgTUVUSE9EX01QVUlPOgotCQlyZWcgKz0gT01BUF9NUFVJT19HUElPX01BU0tJVCAvIGJhbmstPnN0cmlkZTsKKwlpZiAoYmFuay0+cmVncy0+c2V0X2lycWVuYWJsZSkgeworCQlyZWcgKz0gYmFuay0+cmVncy0+c2V0X2lycWVuYWJsZTsKKwkJbCA9IGdwaW9fbWFzazsKKwl9IGVsc2UgeworCQlyZWcgKz0gYmFuay0+cmVncy0+aXJxZW5hYmxlOwogCQlsID0gX19yYXdfcmVhZGwocmVnKTsKLQkJaWYgKGVuYWJsZSkKLQkJCWwgJj0gfihncGlvX21hc2spOworCQlpZiAoYmFuay0+cmVncy0+aXJxZW5hYmxlX2ludikKKwkJCWwgJj0gfmdwaW9fbWFzazsKIAkJZWxzZQogCQkJbCB8PSBncGlvX21hc2s7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKLQljYXNlIE1FVEhPRF9HUElPXzE1MTA6Ci0JCXJlZyArPSBPTUFQMTUxMF9HUElPX0lOVF9NQVNLOwotCQlsID0gX19yYXdfcmVhZGwocmVnKTsKLQkJaWYgKGVuYWJsZSkKLQkJCWwgJj0gfihncGlvX21hc2spOwotCQllbHNlCi0JCQlsIHw9IGdwaW9fbWFzazsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAotCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKLQkJaWYgKGVuYWJsZSkKLQkJCXJlZyArPSBPTUFQMTYxMF9HUElPX1NFVF9JUlFFTkFCTEUxOwotCQllbHNlCi0JCQlyZWcgKz0gT01BUDE2MTBfR1BJT19DTEVBUl9JUlFFTkFCTEUxOwotCQlsID0gZ3Bpb19tYXNrOwotCQlicmVhazsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDczMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQODUwKQotCWNhc2UgTUVUSE9EX0dQSU9fN1hYOgotCQlyZWcgKz0gT01BUDdYWF9HUElPX0lOVF9NQVNLOwotCQlsID0gX19yYXdfcmVhZGwocmVnKTsKLQkJaWYgKGVuYWJsZSkKLQkJCWwgJj0gfihncGlvX21hc2spOwotCQllbHNlCi0JCQlsIHw9IGdwaW9fbWFzazsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQotCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKLQkJaWYgKGVuYWJsZSkKLQkJCXJlZyArPSBPTUFQMjRYWF9HUElPX1NFVElSUUVOQUJMRTE7Ci0JCWVsc2UKLQkJCXJlZyArPSBPTUFQMjRYWF9HUElPX0NMRUFSSVJRRU5BQkxFMTsKLQkJbCA9IGdwaW9fbWFzazsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNAotCWNhc2UgTUVUSE9EX0dQSU9fNDRYWDoKLQkJaWYgKGVuYWJsZSkKLQkJCXJlZyArPSBPTUFQNF9HUElPX0lSUVNUQVRVU1NFVDA7Ci0JCWVsc2UKLQkJCXJlZyArPSBPTUFQNF9HUElPX0lSUVNUQVRVU0NMUjA7Ci0JCWwgPSBncGlvX21hc2s7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuOwogCX0KKworCV9fcmF3X3dyaXRlbChsLCByZWcpOworfQorCitzdGF0aWMgdm9pZCBfZGlzYWJsZV9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaykKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7CisJdTMyIGw7CisKKwlpZiAoYmFuay0+cmVncy0+Y2xyX2lycWVuYWJsZSkgeworCQlyZWcgKz0gYmFuay0+cmVncy0+Y2xyX2lycWVuYWJsZTsKKwkJbCA9IGdwaW9fbWFzazsKKwl9IGVsc2UgeworCQlyZWcgKz0gYmFuay0+cmVncy0+aXJxZW5hYmxlOworCQlsID0gX19yYXdfcmVhZGwocmVnKTsKKwkJaWYgKGJhbmstPnJlZ3MtPmlycWVuYWJsZV9pbnYpCisJCQlsIHw9IGdwaW9fbWFzazsKKwkJZWxzZQorCQkJbCAmPSB+Z3Bpb19tYXNrOworCX0KKwogCV9fcmF3X3dyaXRlbChsLCByZWcpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX3NldF9ncGlvX2lycWVuYWJsZShzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKIHsKLQlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pLCBlbmFibGUpOworCV9lbmFibGVfZ3Bpb19pcnFiYW5rKGJhbmssIEdQSU9fQklUKGJhbmssIGdwaW8pKTsKIH0KIAogLyoKQEAgLTg2NSw1MCArNTE3LDMyIEBACiAgKi8KIHN0YXRpYyBpbnQgX3NldF9ncGlvX3dha2V1cChzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKIHsKLQl1bnNpZ25lZCBsb25nIHVuaW5pdGlhbGl6ZWRfdmFyKGZsYWdzKTsKKwl1MzIgZ3Bpb19iaXQgPSBHUElPX0JJVChiYW5rLCBncGlvKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAotCWNhc2UgTUVUSE9EX01QVUlPOgotCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGVuYWJsZSkKLQkJCWJhbmstPnN1c3BlbmRfd2FrZXVwIHw9ICgxIDw8IGdwaW8pOwotCQllbHNlCi0JCQliYW5rLT5zdXNwZW5kX3dha2V1cCAmPSB+KDEgPDwgZ3Bpbyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMlBMVVMKLQljYXNlIE1FVEhPRF9HUElPXzI0WFg6Ci0JY2FzZSBNRVRIT0RfR1BJT180NFhYOgotCQlpZiAoYmFuay0+bm9uX3dha2V1cF9ncGlvcyAmICgxIDw8IGdwaW8pKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBtb2RpZnkgd2FrZXVwIG9uICIKLQkJCQkJIm5vbi13YWtldXAgR1BJTyVkXG4iLAotCQkJCQkoYmFuayAtIGdwaW9fYmFuaykgKiAzMiArIGdwaW8pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGVuYWJsZSkKLQkJCWJhbmstPnN1c3BlbmRfd2FrZXVwIHw9ICgxIDw8IGdwaW8pOwotCQllbHNlCi0JCQliYW5rLT5zdXNwZW5kX3dha2V1cCAmPSB+KDEgPDwgZ3Bpbyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGVuYWJsZSBHUElPIHdha2V1cCBmb3IgbWV0aG9kICVpXG4iLAotCQkgICAgICAgYmFuay0+bWV0aG9kKTsKKwlpZiAoYmFuay0+bm9uX3dha2V1cF9ncGlvcyAmIGdwaW9fYml0KSB7CisJCWRldl9lcnIoYmFuay0+ZGV2LCAKKwkJCSJVbmFibGUgdG8gbW9kaWZ5IHdha2V1cCBvbiBub24td2FrZXVwIEdQSU8lZFxuIiwgZ3Bpbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZiYW5rLT5sb2NrLCBmbGFncyk7CisJaWYgKGVuYWJsZSkKKwkJYmFuay0+c3VzcGVuZF93YWtldXAgfD0gZ3Bpb19iaXQ7CisJZWxzZQorCQliYW5rLT5zdXNwZW5kX3dha2V1cCAmPSB+Z3Bpb19iaXQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYW5rLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX3Jlc2V0X2dwaW8oc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8pCiB7Ci0JX3NldF9ncGlvX2RpcmVjdGlvbihiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgMSk7CisJX3NldF9ncGlvX2RpcmVjdGlvbihiYW5rLCBHUElPX0lOREVYKGJhbmssIGdwaW8pLCAxKTsKIAlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDApOwogCV9jbGVhcl9ncGlvX2lycXN0YXR1cyhiYW5rLCBncGlvKTsKLQlfc2V0X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgSVJRX1RZUEVfTk9ORSk7CisJX3NldF9ncGlvX3RyaWdnZXJpbmcoYmFuaywgR1BJT19JTkRFWChiYW5rLCBncGlvKSwgSVJRX1RZUEVfTk9ORSk7CiB9CiAKIC8qIFVzZSBkaXNhYmxlX2lycV93YWtlKCkgYW5kIGVuYWJsZV9pcnFfd2FrZSgpIGZ1bmN0aW9ucyBmcm9tIGRyaXZlcnMgKi8KQEAgLTkxOCwxMCArNTUyLDggQEAKIAlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwogCWludCByZXR2YWw7CiAKLQlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCi0JCXJldHVybiAtRU5PREVWOwogCWJhbmsgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQlyZXR2YWwgPSBfc2V0X2dwaW9fd2FrZXVwKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBlbmFibGUpOworCXJldHZhbCA9IF9zZXRfZ3Bpb193YWtldXAoYmFuaywgZ3BpbywgZW5hYmxlKTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC0xMDM3LDMxICs2NjksNyBAQAogCWNoYWluZWRfaXJxX2VudGVyKGNoaXAsIGRlc2MpOwogCiAJYmFuayA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKLQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9NUFVJTykKLQkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKwotCQkJCU9NQVBfTVBVSU9fR1BJT19JTlQgLyBiYW5rLT5zdHJpZGU7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTVYWAotCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTUxMCkKLQkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTUxMF9HUElPX0lOVF9TVEFUVVM7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQotCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTYxMCkKLQkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzE7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDg1MCkKLQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzdYWCkKLQkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQN1hYX0dQSU9fSU5UX1NUQVRVUzsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCi0JaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18yNFhYKQotCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fSVJRU1RBVFVTMTsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDQpCi0JaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT180NFhYKQotCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVA0X0dQSU9fSVJRU1RBVFVTMDsKLSNlbmRpZgorCWlzcl9yZWcgPSBiYW5rLT5iYXNlICsgYmFuay0+cmVncy0+aXJxc3RhdHVzOwogCiAJaWYgKFdBUk5fT04oIWlzcl9yZWcpKQogCQlnb3RvIGV4aXQ7CkBAIC0xMDgzLDkgKzY5MSw5IEBACiAJCS8qIGNsZWFyIGVkZ2Ugc2Vuc2l0aXZlIGludGVycnVwdHMgYmVmb3JlIGhhbmRsZXIocykgYXJlCiAJCWNhbGxlZCBzbyB0aGF0IHdlIGRvbid0IG1pc3MgYW55IGludGVycnVwdCBvY2N1cnJlZCB3aGlsZQogCQlleGVjdXRpbmcgdGhlbSAqLwotCQlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCBpc3Jfc2F2ZWQgJiB+bGV2ZWxfbWFzaywgMCk7CisJCV9kaXNhYmxlX2dwaW9faXJxYmFuayhiYW5rLCBpc3Jfc2F2ZWQgJiB+bGV2ZWxfbWFzayk7CiAJCV9jbGVhcl9ncGlvX2lycWJhbmsoYmFuaywgaXNyX3NhdmVkICYgfmxldmVsX21hc2spOwotCQlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCBpc3Jfc2F2ZWQgJiB+bGV2ZWxfbWFzaywgMSk7CisJCV9lbmFibGVfZ3Bpb19pcnFiYW5rKGJhbmssIGlzcl9zYXZlZCAmIH5sZXZlbF9tYXNrKTsKIAogCQkvKiBpZiB0aGVyZSBpcyBvbmx5IGVkZ2Ugc2Vuc2l0aXZlIEdQSU8gcGluIGludGVycnVwdHMKIAkJY29uZmlndXJlZCwgd2UgY291bGQgdW5tYXNrIEdQSU8gYmFuayBpbnRlcnJ1cHQgaW1tZWRpYXRlbHkgKi8KQEAgLTExMDEsNyArNzA5LDcgQEAKIAogCQlncGlvX2lycSA9IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0OwogCQlmb3IgKDsgaXNyICE9IDA7IGlzciA+Pj0gMSwgZ3Bpb19pcnErKykgewotCQkJZ3Bpb19pbmRleCA9IGdldF9ncGlvX2luZGV4KGlycV90b19ncGlvKGdwaW9faXJxKSk7CisJCQlncGlvX2luZGV4ID0gR1BJT19JTkRFWChiYW5rLCBpcnFfdG9fZ3BpbyhncGlvX2lycSkpOwogCiAJCQlpZiAoIShpc3IgJiAxKSkKIAkJCQljb250aW51ZTsKQEAgLTExMzQsOCArNzQyLDExIEBACiB7CiAJdW5zaWduZWQgaW50IGdwaW8gPSBkLT5pcnEgLSBJSF9HUElPX0JBU0U7CiAJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFuay0+bG9jaywgZmxhZ3MpOwogCV9yZXNldF9ncGlvKGJhbmssIGdwaW8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgZ3Bpb19hY2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKQEAgLTExNTAsMjAgKzc2MSwyNSBAQAogewogCXVuc2lnbmVkIGludCBncGlvID0gZC0+aXJxIC0gSUhfR1BJT19CQVNFOwogCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIAlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDApOwotCV9zZXRfZ3Bpb190cmlnZ2VyaW5nKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBJUlFfVFlQRV9OT05FKTsKKwlfc2V0X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBHUElPX0lOREVYKGJhbmssIGdwaW8pLCBJUlFfVFlQRV9OT05FKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYW5rLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGdwaW9fdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJdW5zaWduZWQgaW50IGdwaW8gPSBkLT5pcnEgLSBJSF9HUElPX0JBU0U7CiAJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXVuc2lnbmVkIGludCBpcnFfbWFzayA9IDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3Bpbyk7CisJdW5zaWduZWQgaW50IGlycV9tYXNrID0gR1BJT19CSVQoYmFuaywgZ3Bpbyk7CiAJdTMyIHRyaWdnZXIgPSBpcnFkX2dldF90cmlnZ2VyX3R5cGUoZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZiYW5rLT5sb2NrLCBmbGFncyk7CiAJaWYgKHRyaWdnZXIpCi0JCV9zZXRfZ3Bpb190cmlnZ2VyaW5nKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCB0cmlnZ2VyKTsKKwkJX3NldF9ncGlvX3RyaWdnZXJpbmcoYmFuaywgR1BJT19JTkRFWChiYW5rLCBncGlvKSwgdHJpZ2dlcik7CiAKIAkvKiBGb3IgbGV2ZWwtdHJpZ2dlcmVkIEdQSU9zLCB0aGUgY2xlYXJpbmcgbXVzdCBiZSBkb25lIGFmdGVyCiAJICogdGhlIEhXIHNvdXJjZSBpcyBjbGVhcmVkLCB0aHVzIGFmdGVyIHRoZSBoYW5kbGVyIGhhcyBydW4gKi8KQEAgLTExNzMsNiArNzg5LDcgQEAKIAl9CiAKIAlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBncGlvX2lycV9jaGlwID0gewpAQCAtMTE4OSw0NSArODA2LDggQEAKIAogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCiAKLS8qIE1QVUlPIHVzZXMgdGhlIGFsd2F5cy1vbiAzMmsgY2xvY2sgKi8KLQotc3RhdGljIHZvaWQgbXB1aW9fYWNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JLyogVGhlIElTUiBpcyByZXNldCBhdXRvbWF0aWNhbGx5LCBzbyBkbyBub3RoaW5nIGhlcmUuICovCi19Ci0KLXN0YXRpYyB2b2lkIG1wdWlvX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQl1bnNpZ25lZCBpbnQgZ3BpbyA9IE9NQVBfTVBVSU8oZC0+aXJxIC0gSUhfTVBVSU9fQkFTRSk7Ci0Jc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCi0JX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgbXB1aW9fdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JdW5zaWduZWQgaW50IGdwaW8gPSBPTUFQX01QVUlPKGQtPmlycSAtIElIX01QVUlPX0JBU0UpOwotCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQotCV9zZXRfZ3Bpb19pcnFlbmFibGUoYmFuaywgZ3BpbywgMSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXB1aW9faXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIk1QVUlPIiwKLQkuaXJxX2Fjawk9IG1wdWlvX2Fja19pcnEsCi0JLmlycV9tYXNrCT0gbXB1aW9fbWFza19pcnEsCi0JLmlycV91bm1hc2sJPSBtcHVpb191bm1hc2tfaXJxLAotCS5pcnFfc2V0X3R5cGUJPSBncGlvX2lycV90eXBlLAotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCi0JLyogUkVWSVNJVDogYXNzdW1pbmcgb25seSAxNnh4IHN1cHBvcnRzIE1QVUlPIHdha2UgZXZlbnRzICovCi0JLmlycV9zZXRfd2FrZQk9IGdwaW9fd2FrZV9lbmFibGUsCi0jZW5kaWYKLX07Ci0KLQogI2RlZmluZSBiYW5rX2lzX21wdWlvKGJhbmspCSgoYmFuayktPm1ldGhvZCA9PSBNRVRIT0RfTVBVSU8pCiAKLQogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTEyODcsNyArODY3LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIG1wdWlvX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhPTUFQX01QVUlPKDApKTsKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gJmdwaW9fYmFua1swXTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YSgmb21hcF9tcHVpb19kZXZpY2UsIGJhbmspOwogCiAJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcF9tcHVpb19kcml2ZXIpID09IDApCkBAIC0xMzAwLDggKzg4MCw2IEBACiAKICNlbHNlCiAKLWV4dGVybiBzdHJ1Y3QgaXJxX2NoaXAgbXB1aW9faXJxX2NoaXA7Ci0KICNkZWZpbmUgYmFua19pc19tcHVpbyhiYW5rKQkwCiBzdGF0aWMgaW5saW5lIHZvaWQgbXB1aW9faW5pdCh2b2lkKSB7fQogCkBAIC0xMzI3LDMxICs5MDUsOCBAQAogCiBzdGF0aWMgaW50IGdwaW9faXNfaW5wdXQoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IG1hc2spCiB7Ci0Jdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOworCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZSArIGJhbmstPnJlZ3MtPmRpcmVjdGlvbjsKIAotCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7Ci0JY2FzZSBNRVRIT0RfTVBVSU86Ci0JCXJlZyArPSBPTUFQX01QVUlPX0lPX0NOVEwgLyBiYW5rLT5zdHJpZGU7Ci0JCWJyZWFrOwotCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKLQkJcmVnICs9IE9NQVAxNTEwX0dQSU9fRElSX0NPTlRST0w7Ci0JCWJyZWFrOwotCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKLQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRElSRUNUSU9OOwotCQlicmVhazsKLQljYXNlIE1FVEhPRF9HUElPXzdYWDoKLQkJcmVnICs9IE9NQVA3WFhfR1BJT19ESVJfQ09OVFJPTDsKLQkJYnJlYWs7Ci0JY2FzZSBNRVRIT0RfR1BJT18yNFhYOgotCQlyZWcgKz0gT01BUDI0WFhfR1BJT19PRTsKLQkJYnJlYWs7Ci0JY2FzZSBNRVRIT0RfR1BJT180NFhYOgotCQlyZWcgKz0gT01BUDRfR1BJT19PRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJV0FSTl9PTkNFKDEsICJncGlvX2lzX2lucHV0OiBpbmNvcnJlY3QgT01BUCBHUElPIG1ldGhvZCIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAJcmV0dXJuIF9fcmF3X3JlYWRsKHJlZykgJiBtYXNrOwogfQogCkBAIC0xMzYzLDkgKzkxOCw5IEBACiAJdTMyIG1hc2s7CiAKIAlncGlvID0gY2hpcC0+YmFzZSArIG9mZnNldDsKLQliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKwliYW5rID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBncGlvX2JhbmssIGNoaXApOwogCXJlZyA9IGJhbmstPmJhc2U7Ci0JbWFzayA9IDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3Bpbyk7CisJbWFzayA9IEdQSU9fQklUKGJhbmssIGdwaW8pOwogCiAJaWYgKGdwaW9faXNfaW5wdXQoYmFuaywgbWFzaykpCiAJCXJldHVybiBfZ2V0X2dwaW9fZGF0YWluKGJhbmssIGdwaW8pOwpAQCAtMTM4MCw3ICs5MzUsNyBAQAogCiAJYmFuayA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgZ3Bpb19iYW5rLCBjaGlwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYmFuay0+bG9jaywgZmxhZ3MpOwotCV9zZXRfZ3Bpb19kYXRhb3V0KGJhbmssIG9mZnNldCwgdmFsdWUpOworCWJhbmstPnNldF9kYXRhb3V0KGJhbmssIG9mZnNldCwgdmFsdWUpOwogCV9zZXRfZ3Bpb19kaXJlY3Rpb24oYmFuaywgb2Zmc2V0LCAwKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYW5rLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CkBAIC0xNDE0LDcgKzk2OSw3IEBACiAKIAliYW5rID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBncGlvX2JhbmssIGNoaXApOwogCXNwaW5fbG9ja19pcnFzYXZlKCZiYW5rLT5sb2NrLCBmbGFncyk7Ci0JX3NldF9ncGlvX2RhdGFvdXQoYmFuaywgb2Zmc2V0LCB2YWx1ZSk7CisJYmFuay0+c2V0X2RhdGFvdXQoYmFuaywgb2Zmc2V0LCB2YWx1ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFuay0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC0xNDMwLDE5ICs5ODUsMTcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ3Bpb19zaG93X3JldihzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rKQogeworCXN0YXRpYyBib29sIGNhbGxlZDsKIAl1MzIgcmV2OwogCi0JaWYgKGNwdV9pc19vbWFwMTZ4eCgpICYmICEoYmFuay0+bWV0aG9kICE9IE1FVEhPRF9NUFVJTykpCi0JCXJldiA9IF9fcmF3X3JlYWR3KGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX1JFVklTSU9OKTsKLQllbHNlIGlmIChjcHVfaXNfb21hcDI0eHgoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSkKLQkJcmV2ID0gX19yYXdfcmVhZGwoYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fUkVWSVNJT04pOwotCWVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKQotCQlyZXYgPSBfX3Jhd19yZWFkbChiYW5rLT5iYXNlICsgT01BUDRfR1BJT19SRVZJU0lPTik7Ci0JZWxzZQorCWlmIChjYWxsZWQgfHwgYmFuay0+cmVncy0+cmV2aXNpb24gPT0gVVNIUlRfTUFYKQogCQlyZXR1cm47CiAKLQlwcmludGsoS0VSTl9JTkZPICJPTUFQIEdQSU8gaGFyZHdhcmUgdmVyc2lvbiAlZC4lZFxuIiwKKwlyZXYgPSBfX3Jhd19yZWFkdyhiYW5rLT5iYXNlICsgYmFuay0+cmVncy0+cmV2aXNpb24pOworCXByX2luZm8oIk9NQVAgR1BJTyBoYXJkd2FyZSB2ZXJzaW9uICVkLiVkXG4iLAogCQkocmV2ID4+IDQpICYgMHgwZiwgcmV2ICYgMHgwZik7CisKKwljYWxsZWQgPSB0cnVlOwogfQogCiAvKiBUaGlzIGxvY2sgY2xhc3MgdGVsbHMgbG9ja2RlcCB0aGF0IEdQSU8gaXJxcyBhcmUgaW4gYSBkaWZmZXJlbnQKQEAgLTE1MjQsNyArMTA3NywzMSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ3Bpb19jaGlwX2luaXQoc3RydWN0IGdwaW9fYmFuayAqYmFuaykKK3N0YXRpYyBfX2luaXQgdm9pZAorb21hcF9tcHVpb19hbGxvY19nYyhzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCB1bnNpZ25lZCBpbnQgaXJxX3N0YXJ0LAorCQkgICAgdW5zaWduZWQgaW50IG51bSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0OworCisJZ2MgPSBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKCJNUFVJTyIsIDEsIGlycV9zdGFydCwgYmFuay0+YmFzZSwKKwkJCQkgICAgaGFuZGxlX3NpbXBsZV9pcnEpOworCWN0ID0gZ2MtPmNoaXBfdHlwZXM7CisKKwkvKiBOT1RFOiBObyBhY2sgcmVxdWlyZWQsIHJlYWRpbmcgSVJRIHN0YXR1cyBjbGVhcnMgaXQuICovCisJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19zZXRfYml0OworCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OworCWN0LT5jaGlwLmlycV9zZXRfdHlwZSA9IGdwaW9faXJxX3R5cGU7CisJLyogUkVWSVNJVDogYXNzdW1pbmcgb25seSAxNnh4IHN1cHBvcnRzIE1QVUlPIHdha2UgZXZlbnRzICovCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKQorCQljdC0+Y2hpcC5pcnFfc2V0X3dha2UgPSBncGlvX3dha2VfZW5hYmxlLAorCisJY3QtPnJlZ3MubWFzayA9IE9NQVBfTVBVSU9fR1BJT19JTlQgLyBiYW5rLT5zdHJpZGU7CisJaXJxX3NldHVwX2dlbmVyaWNfY2hpcChnYywgSVJRX01TSyhudW0pLCBJUlFfR0NfSU5JVF9NQVNLX0NBQ0hFLAorCQkJICAgICAgIElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBvbWFwX2dwaW9fY2hpcF9pbml0KHN0cnVjdCBncGlvX2JhbmsgKmJhbmspCiB7CiAJaW50IGo7CiAJc3RhdGljIGludCBncGlvOwpAQCAtMTU1MSwyMiArMTEyOCwyMyBAQAogCX0gZWxzZSB7CiAJCWJhbmstPmNoaXAubGFiZWwgPSAiZ3BpbyI7CiAJCWJhbmstPmNoaXAuYmFzZSA9IGdwaW87Ci0JCWdwaW8gKz0gYmFua193aWR0aDsKKwkJZ3BpbyArPSBiYW5rLT53aWR0aDsKIAl9Ci0JYmFuay0+Y2hpcC5uZ3BpbyA9IGJhbmtfd2lkdGg7CisJYmFuay0+Y2hpcC5uZ3BpbyA9IGJhbmstPndpZHRoOwogCiAJZ3Bpb2NoaXBfYWRkKCZiYW5rLT5jaGlwKTsKIAogCWZvciAoaiA9IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0OwotCQkgICAgIGogPCBiYW5rLT52aXJ0dWFsX2lycV9zdGFydCArIGJhbmtfd2lkdGg7IGorKykgeworCQkgICAgIGogPCBiYW5rLT52aXJ0dWFsX2lycV9zdGFydCArIGJhbmstPndpZHRoOyBqKyspIHsKIAkJaXJxX3NldF9sb2NrZGVwX2NsYXNzKGosICZncGlvX2xvY2tfY2xhc3MpOwogCQlpcnFfc2V0X2NoaXBfZGF0YShqLCBiYW5rKTsKLQkJaWYgKGJhbmtfaXNfbXB1aW8oYmFuaykpCi0JCQlpcnFfc2V0X2NoaXAoaiwgJm1wdWlvX2lycV9jaGlwKTsKLQkJZWxzZQorCQlpZiAoYmFua19pc19tcHVpbyhiYW5rKSkgeworCQkJb21hcF9tcHVpb19hbGxvY19nYyhiYW5rLCBqLCBiYW5rLT53aWR0aCk7CisJCX0gZWxzZSB7CiAJCQlpcnFfc2V0X2NoaXAoaiwgJmdwaW9faXJxX2NoaXApOwotCQlpcnFfc2V0X2hhbmRsZXIoaiwgaGFuZGxlX3NpbXBsZV9pcnEpOwotCQlzZXRfaXJxX2ZsYWdzKGosIElSUUZfVkFMSUQpOworCQkJaXJxX3NldF9oYW5kbGVyKGosIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwkJCXNldF9pcnFfZmxhZ3MoaiwgSVJRRl9WQUxJRCk7CisJCX0KIAl9CiAJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoYmFuay0+aXJxLCBncGlvX2lycV9oYW5kbGVyKTsKIAlpcnFfc2V0X2hhbmRsZXJfZGF0YShiYW5rLT5pcnEsIGJhbmspOwpAQCAtMTYwOCw3ICsxMTg2LDE0IEBACiAJYmFuay0+ZGV2ID0gJnBkZXYtPmRldjsKIAliYW5rLT5kYmNrX2ZsYWcgPSBwZGF0YS0+ZGJja19mbGFnOwogCWJhbmstPnN0cmlkZSA9IHBkYXRhLT5iYW5rX3N0cmlkZTsKLQliYW5rX3dpZHRoID0gcGRhdGEtPmJhbmtfd2lkdGg7CisJYmFuay0+d2lkdGggPSBwZGF0YS0+YmFua193aWR0aDsKKworCWJhbmstPnJlZ3MgPSBwZGF0YS0+cmVnczsKKworCWlmIChiYW5rLT5yZWdzLT5zZXRfZGF0YW91dCAmJiBiYW5rLT5yZWdzLT5jbHJfZGF0YW91dCkKKwkJYmFuay0+c2V0X2RhdGFvdXQgPSBfc2V0X2dwaW9fZGF0YW91dF9yZWc7CisJZWxzZQorCQliYW5rLT5zZXRfZGF0YW91dCA9IF9zZXRfZ3Bpb19kYXRhb3V0X21hc2s7CiAKIAlzcGluX2xvY2tfaW5pdCgmYmFuay0+bG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBjYTk1M3guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBjYTk1M3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNiOGZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcGNhOTUzeC5jCkBAIC0wLDAgKzEsNzYwIEBACisvKgorICogIFBDQTk1M3ggNC84LzE2IGJpdCBJL08gcG9ydHMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IEJlbiBHYXJkbmVyIDxiZ2FyZG5lckB3YWJ0ZWMuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwNyBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICoKKyAqICBEZXJpdmVkIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvcGNhOTUzOS5jCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3BjYTk1M3guaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaWZkZWYgQ09ORklHX09GX0dQSU8KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2VuZGlmCisKKyNkZWZpbmUgUENBOTUzWF9JTlBVVAkJMAorI2RlZmluZSBQQ0E5NTNYX09VVFBVVAkJMQorI2RlZmluZSBQQ0E5NTNYX0lOVkVSVAkJMgorI2RlZmluZSBQQ0E5NTNYX0RJUkVDVElPTgkzCisKKyNkZWZpbmUgUENBOTU3WF9JTgkJMAorI2RlZmluZSBQQ0E5NTdYX0lOVlJUCQkxCisjZGVmaW5lIFBDQTk1N1hfQktFTgkJMgorI2RlZmluZSBQQ0E5NTdYX1BVUEQJCTMKKyNkZWZpbmUgUENBOTU3WF9DRkcJCTQKKyNkZWZpbmUgUENBOTU3WF9PVVQJCTUKKyNkZWZpbmUgUENBOTU3WF9NU0sJCTYKKyNkZWZpbmUgUENBOTU3WF9JTlRTCQk3CisKKyNkZWZpbmUgUENBX0dQSU9fTUFTSwkJMHgwMEZGCisjZGVmaW5lIFBDQV9JTlQJCQkweDAxMDAKKyNkZWZpbmUgUENBOTUzWF9UWVBFCQkweDEwMDAKKyNkZWZpbmUgUENBOTU3WF9UWVBFCQkweDIwMDAKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBjYTk1M3hfaWRbXSA9IHsKKwl7ICJwY2E5NTM0IiwgOCAgfCBQQ0E5NTNYX1RZUEUgfCBQQ0FfSU5ULCB9LAorCXsgInBjYTk1MzUiLCAxNiB8IFBDQTk1M1hfVFlQRSB8IFBDQV9JTlQsIH0sCisJeyAicGNhOTUzNiIsIDQgIHwgUENBOTUzWF9UWVBFLCB9LAorCXsgInBjYTk1MzciLCA0ICB8IFBDQTk1M1hfVFlQRSB8IFBDQV9JTlQsIH0sCisJeyAicGNhOTUzOCIsIDggIHwgUENBOTUzWF9UWVBFIHwgUENBX0lOVCwgfSwKKwl7ICJwY2E5NTM5IiwgMTYgfCBQQ0E5NTNYX1RZUEUgfCBQQ0FfSU5ULCB9LAorCXsgInBjYTk1NTQiLCA4ICB8IFBDQTk1M1hfVFlQRSB8IFBDQV9JTlQsIH0sCisJeyAicGNhOTU1NSIsIDE2IHwgUENBOTUzWF9UWVBFIHwgUENBX0lOVCwgfSwKKwl7ICJwY2E5NTU2IiwgOCAgfCBQQ0E5NTNYX1RZUEUsIH0sCisJeyAicGNhOTU1NyIsIDggIHwgUENBOTUzWF9UWVBFLCB9LAorCXsgInBjYTk1NzQiLCA4ICB8IFBDQTk1N1hfVFlQRSB8IFBDQV9JTlQsIH0sCisJeyAicGNhOTU3NSIsIDE2IHwgUENBOTU3WF9UWVBFIHwgUENBX0lOVCwgfSwKKworCXsgIm1heDczMTAiLCA4ICB8IFBDQTk1M1hfVFlQRSwgfSwKKwl7ICJtYXg3MzEyIiwgMTYgfCBQQ0E5NTNYX1RZUEUgfCBQQ0FfSU5ULCB9LAorCXsgIm1heDczMTMiLCAxNiB8IFBDQTk1M1hfVFlQRSB8IFBDQV9JTlQsIH0sCisJeyAibWF4NzMxNSIsIDggIHwgUENBOTUzWF9UWVBFIHwgUENBX0lOVCwgfSwKKwl7ICJwY2E2MTA3IiwgOCAgfCBQQ0E5NTNYX1RZUEUgfCBQQ0FfSU5ULCB9LAorCXsgInRjYTY0MDgiLCA4ICB8IFBDQTk1M1hfVFlQRSB8IFBDQV9JTlQsIH0sCisJeyAidGNhNjQxNiIsIDE2IHwgUENBOTUzWF9UWVBFIHwgUENBX0lOVCwgfSwKKwkvKiBOWUVUOiAgeyAidGNhNjQyNCIsIDI0LCB9LCAqLworCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBwY2E5NTN4X2lkKTsKKworc3RydWN0IHBjYTk1M3hfY2hpcCB7CisJdW5zaWduZWQgZ3Bpb19zdGFydDsKKwl1aW50MTZfdCByZWdfb3V0cHV0OworCXVpbnQxNl90IHJlZ19kaXJlY3Rpb247CisJc3RydWN0IG11dGV4IGkyY19sb2NrOworCisjaWZkZWYgQ09ORklHX0dQSU9fUENBOTUzWF9JUlEKKwlzdHJ1Y3QgbXV0ZXggaXJxX2xvY2s7CisJdWludDE2X3QgaXJxX21hc2s7CisJdWludDE2X3QgaXJxX3N0YXQ7CisJdWludDE2X3QgaXJxX3RyaWdfcmFpc2U7CisJdWludDE2X3QgaXJxX3RyaWdfZmFsbDsKKwlpbnQJIGlycV9iYXNlOworI2VuZGlmCisKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBncGlvX2NoaXAgZ3Bpb19jaGlwOworCWNvbnN0IGNoYXIgKmNvbnN0ICpuYW1lczsKKwlpbnQJY2hpcF90eXBlOworfTsKKworc3RhdGljIGludCBwY2E5NTN4X3dyaXRlX3JlZyhzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1aW50MTZfdCB2YWwpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY2hpcC0+Z3Bpb19jaGlwLm5ncGlvIDw9IDgpCisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LCByZWcsIHZhbCk7CisJZWxzZSB7CisJCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7CisJCWNhc2UgUENBOTUzWF9UWVBFOgorCQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjaGlwLT5jbGllbnQsCisJCQkJCQkJcmVnIDw8IDEsIHZhbCk7CisJCQlicmVhazsKKwkJY2FzZSBQQ0E5NTdYX1RZUEU6CisJCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgcmVnIDw8IDEsCisJCQkJCQkJdmFsICYgMHhmZik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlicmVhazsKKwkJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCQkJCShyZWcgPDwgMSkgKyAxLAorCQkJCQkJCSh2YWwgJiAweGZmMDApID4+IDgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwgImZhaWxlZCB3cml0aW5nIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2E5NTN4X3JlYWRfcmVnKHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHVpbnQxNl90ICp2YWwpCit7CisJaW50IHJldDsKKworCWlmIChjaGlwLT5ncGlvX2NoaXAubmdwaW8gPD0gOCkKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgcmVnKTsKKwllbHNlCisJCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjaGlwLT5jbGllbnQsIHJlZyA8PCAxKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAiZmFpbGVkIHJlYWRpbmcgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCSp2YWwgPSAodWludDE2X3QpcmV0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjYTk1M3hfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZikKK3sKKwlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwOworCXVpbnQxNl90IHJlZ192YWw7CisJaW50IHJldCwgb2Zmc2V0ID0gMDsKKworCWNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBwY2E5NTN4X2NoaXAsIGdwaW9fY2hpcCk7CisKKwltdXRleF9sb2NrKCZjaGlwLT5pMmNfbG9jayk7CisJcmVnX3ZhbCA9IGNoaXAtPnJlZ19kaXJlY3Rpb24gfCAoMXUgPDwgb2ZmKTsKKworCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7CisJY2FzZSBQQ0E5NTNYX1RZUEU6CisJCW9mZnNldCA9IFBDQTk1M1hfRElSRUNUSU9OOworCQlicmVhazsKKwljYXNlIFBDQTk1N1hfVFlQRToKKwkJb2Zmc2V0ID0gUENBOTU3WF9DRkc7CisJCWJyZWFrOworCX0KKwlyZXQgPSBwY2E5NTN4X3dyaXRlX3JlZyhjaGlwLCBvZmZzZXQsIHJlZ192YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdDsKKworCWNoaXAtPnJlZ19kaXJlY3Rpb24gPSByZWdfdmFsOworCXJldCA9IDA7CitleGl0OgorCW11dGV4X3VubG9jaygmY2hpcC0+aTJjX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGNhOTUzeF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCisJCXVuc2lnbmVkIG9mZiwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwOworCXVpbnQxNl90IHJlZ192YWw7CisJaW50IHJldCwgb2Zmc2V0ID0gMDsKKworCWNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBwY2E5NTN4X2NoaXAsIGdwaW9fY2hpcCk7CisKKwltdXRleF9sb2NrKCZjaGlwLT5pMmNfbG9jayk7CisJLyogc2V0IG91dHB1dCBsZXZlbCAqLworCWlmICh2YWwpCisJCXJlZ192YWwgPSBjaGlwLT5yZWdfb3V0cHV0IHwgKDF1IDw8IG9mZik7CisJZWxzZQorCQlyZWdfdmFsID0gY2hpcC0+cmVnX291dHB1dCAmIH4oMXUgPDwgb2ZmKTsKKworCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7CisJY2FzZSBQQ0E5NTNYX1RZUEU6CisJCW9mZnNldCA9IFBDQTk1M1hfT1VUUFVUOworCQlicmVhazsKKwljYXNlIFBDQTk1N1hfVFlQRToKKwkJb2Zmc2V0ID0gUENBOTU3WF9PVVQ7CisJCWJyZWFrOworCX0KKwlyZXQgPSBwY2E5NTN4X3dyaXRlX3JlZyhjaGlwLCBvZmZzZXQsIHJlZ192YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdDsKKworCWNoaXAtPnJlZ19vdXRwdXQgPSByZWdfdmFsOworCisJLyogdGhlbiBkaXJlY3Rpb24gKi8KKwlyZWdfdmFsID0gY2hpcC0+cmVnX2RpcmVjdGlvbiAmIH4oMXUgPDwgb2ZmKTsKKwlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgeworCWNhc2UgUENBOTUzWF9UWVBFOgorCQlvZmZzZXQgPSBQQ0E5NTNYX0RJUkVDVElPTjsKKwkJYnJlYWs7CisJY2FzZSBQQ0E5NTdYX1RZUEU6CisJCW9mZnNldCA9IFBDQTk1N1hfQ0ZHOworCQlicmVhazsKKwl9CisJcmV0ID0gcGNhOTUzeF93cml0ZV9yZWcoY2hpcCwgb2Zmc2V0LCByZWdfdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXQ7CisKKwljaGlwLT5yZWdfZGlyZWN0aW9uID0gcmVnX3ZhbDsKKwlyZXQgPSAwOworZXhpdDoKKwltdXRleF91bmxvY2soJmNoaXAtPmkyY19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBjYTk1M3hfZ3Bpb19nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZikKK3sKKwlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwOworCXVpbnQxNl90IHJlZ192YWw7CisJaW50IHJldCwgb2Zmc2V0ID0gMDsKKworCWNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBwY2E5NTN4X2NoaXAsIGdwaW9fY2hpcCk7CisKKwltdXRleF9sb2NrKCZjaGlwLT5pMmNfbG9jayk7CisJc3dpdGNoIChjaGlwLT5jaGlwX3R5cGUpIHsKKwljYXNlIFBDQTk1M1hfVFlQRToKKwkJb2Zmc2V0ID0gUENBOTUzWF9JTlBVVDsKKwkJYnJlYWs7CisJY2FzZSBQQ0E5NTdYX1RZUEU6CisJCW9mZnNldCA9IFBDQTk1N1hfSU47CisJCWJyZWFrOworCX0KKwlyZXQgPSBwY2E5NTN4X3JlYWRfcmVnKGNoaXAsIG9mZnNldCwgJnJlZ192YWwpOworCW11dGV4X3VubG9jaygmY2hpcC0+aTJjX2xvY2spOworCWlmIChyZXQgPCAwKSB7CisJCS8qIE5PVEU6ICBkaWFnbm9zdGljIGFscmVhZHkgZW1pdHRlZDsgdGhhdCdzIGFsbCB3ZSBzaG91bGQKKwkJICogZG8gdW5sZXNzIGdwaW9fKl92YWx1ZV9jYW5zbGVlcCgpIGNhbGxzIGJlY29tZSBkaWZmZXJlbnQKKwkJICogZnJvbSB0aGVpciBub25zbGVlcGluZyBzaWJsaW5ncyAoYW5kIHJlcG9ydCBmYXVsdHMpLgorCQkgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIChyZWdfdmFsICYgKDF1IDw8IG9mZikpID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIHBjYTk1M3hfZ3Bpb19zZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZiwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwOworCXVpbnQxNl90IHJlZ192YWw7CisJaW50IHJldCwgb2Zmc2V0ID0gMDsKKworCWNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBwY2E5NTN4X2NoaXAsIGdwaW9fY2hpcCk7CisKKwltdXRleF9sb2NrKCZjaGlwLT5pMmNfbG9jayk7CisJaWYgKHZhbCkKKwkJcmVnX3ZhbCA9IGNoaXAtPnJlZ19vdXRwdXQgfCAoMXUgPDwgb2ZmKTsKKwllbHNlCisJCXJlZ192YWwgPSBjaGlwLT5yZWdfb3V0cHV0ICYgfigxdSA8PCBvZmYpOworCisJc3dpdGNoIChjaGlwLT5jaGlwX3R5cGUpIHsKKwljYXNlIFBDQTk1M1hfVFlQRToKKwkJb2Zmc2V0ID0gUENBOTUzWF9PVVRQVVQ7CisJCWJyZWFrOworCWNhc2UgUENBOTU3WF9UWVBFOgorCQlvZmZzZXQgPSBQQ0E5NTdYX09VVDsKKwkJYnJlYWs7CisJfQorCXJldCA9IHBjYTk1M3hfd3JpdGVfcmVnKGNoaXAsIG9mZnNldCwgcmVnX3ZhbCk7CisJaWYgKHJldCkKKwkJZ290byBleGl0OworCisJY2hpcC0+cmVnX291dHB1dCA9IHJlZ192YWw7CitleGl0OgorCW11dGV4X3VubG9jaygmY2hpcC0+aTJjX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBwY2E5NTN4X3NldHVwX2dwaW8oc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCwgaW50IGdwaW9zKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmdjOworCisJZ2MgPSAmY2hpcC0+Z3Bpb19jaGlwOworCisJZ2MtPmRpcmVjdGlvbl9pbnB1dCAgPSBwY2E5NTN4X2dwaW9fZGlyZWN0aW9uX2lucHV0OworCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gcGNhOTUzeF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJZ2MtPmdldCA9IHBjYTk1M3hfZ3Bpb19nZXRfdmFsdWU7CisJZ2MtPnNldCA9IHBjYTk1M3hfZ3Bpb19zZXRfdmFsdWU7CisJZ2MtPmNhbl9zbGVlcCA9IDE7CisKKwlnYy0+YmFzZSA9IGNoaXAtPmdwaW9fc3RhcnQ7CisJZ2MtPm5ncGlvID0gZ3Bpb3M7CisJZ2MtPmxhYmVsID0gY2hpcC0+Y2xpZW50LT5uYW1lOworCWdjLT5kZXYgPSAmY2hpcC0+Y2xpZW50LT5kZXY7CisJZ2MtPm93bmVyID0gVEhJU19NT0RVTEU7CisJZ2MtPm5hbWVzID0gY2hpcC0+bmFtZXM7Cit9CisKKyNpZmRlZiBDT05GSUdfR1BJT19QQ0E5NTNYX0lSUQorc3RhdGljIGludCBwY2E5NTN4X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmYpCit7CisJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcDsKKworCWNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBwY2E5NTN4X2NoaXAsIGdwaW9fY2hpcCk7CisJcmV0dXJuIGNoaXAtPmlycV9iYXNlICsgb2ZmOworfQorCitzdGF0aWMgdm9pZCBwY2E5NTN4X2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwljaGlwLT5pcnFfbWFzayAmPSB+KDEgPDwgKGQtPmlycSAtIGNoaXAtPmlycV9iYXNlKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjYTk1M3hfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCisJY2hpcC0+aXJxX21hc2sgfD0gMSA8PCAoZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2UpOworfQorCitzdGF0aWMgdm9pZCBwY2E5NTN4X2lycV9idXNfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCisJbXV0ZXhfbG9jaygmY2hpcC0+aXJxX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBwY2E5NTN4X2lycV9idXNfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1aW50MTZfdCBuZXdfaXJxczsKKwl1aW50MTZfdCBsZXZlbDsKKworCS8qIExvb2sgZm9yIGFueSBuZXdseSBzZXR1cCBpbnRlcnJ1cHQgKi8KKwluZXdfaXJxcyA9IGNoaXAtPmlycV90cmlnX2ZhbGwgfCBjaGlwLT5pcnFfdHJpZ19yYWlzZTsKKwluZXdfaXJxcyAmPSB+Y2hpcC0+cmVnX2RpcmVjdGlvbjsKKworCXdoaWxlIChuZXdfaXJxcykgeworCQlsZXZlbCA9IF9fZmZzKG5ld19pcnFzKTsKKwkJcGNhOTUzeF9ncGlvX2RpcmVjdGlvbl9pbnB1dCgmY2hpcC0+Z3Bpb19jaGlwLCBsZXZlbCk7CisJCW5ld19pcnFzICY9IH4oMSA8PCBsZXZlbCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5pcnFfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcGNhOTUzeF9pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdWludDE2X3QgbGV2ZWwgPSBkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZTsKKwl1aW50MTZfdCBtYXNrID0gMSA8PCBsZXZlbDsKKworCWlmICghKHR5cGUgJiBJUlFfVFlQRV9FREdFX0JPVEgpKSB7CisJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAiaXJxICVkOiB1bnN1cHBvcnRlZCB0eXBlICVkXG4iLAorCQkJZC0+aXJxLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpCisJCWNoaXAtPmlycV90cmlnX2ZhbGwgfD0gbWFzazsKKwllbHNlCisJCWNoaXAtPmlycV90cmlnX2ZhbGwgJj0gfm1hc2s7CisKKwlpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfUklTSU5HKQorCQljaGlwLT5pcnFfdHJpZ19yYWlzZSB8PSBtYXNrOworCWVsc2UKKwkJY2hpcC0+aXJxX3RyaWdfcmFpc2UgJj0gfm1hc2s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBwY2E5NTN4X2lycV9jaGlwID0geworCS5uYW1lCQkJPSAicGNhOTUzeCIsCisJLmlycV9tYXNrCQk9IHBjYTk1M3hfaXJxX21hc2ssCisJLmlycV91bm1hc2sJCT0gcGNhOTUzeF9pcnFfdW5tYXNrLAorCS5pcnFfYnVzX2xvY2sJCT0gcGNhOTUzeF9pcnFfYnVzX2xvY2ssCisJLmlycV9idXNfc3luY191bmxvY2sJPSBwY2E5NTN4X2lycV9idXNfc3luY191bmxvY2ssCisJLmlycV9zZXRfdHlwZQkJPSBwY2E5NTN4X2lycV9zZXRfdHlwZSwKK307CisKK3N0YXRpYyB1aW50MTZfdCBwY2E5NTN4X2lycV9wZW5kaW5nKHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXApCit7CisJdWludDE2X3QgY3VyX3N0YXQ7CisJdWludDE2X3Qgb2xkX3N0YXQ7CisJdWludDE2X3QgcGVuZGluZzsKKwl1aW50MTZfdCB0cmlnZ2VyOworCWludCByZXQsIG9mZnNldCA9IDA7CisKKwlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgeworCWNhc2UgUENBOTUzWF9UWVBFOgorCQlvZmZzZXQgPSBQQ0E5NTNYX0lOUFVUOworCQlicmVhazsKKwljYXNlIFBDQTk1N1hfVFlQRToKKwkJb2Zmc2V0ID0gUENBOTU3WF9JTjsKKwkJYnJlYWs7CisJfQorCXJldCA9IHBjYTk1M3hfcmVhZF9yZWcoY2hpcCwgb2Zmc2V0LCAmY3VyX3N0YXQpOworCWlmIChyZXQpCisJCXJldHVybiAwOworCisJLyogUmVtb3ZlIG91dHB1dCBwaW5zIGZyb20gdGhlIGVxdWF0aW9uICovCisJY3VyX3N0YXQgJj0gY2hpcC0+cmVnX2RpcmVjdGlvbjsKKworCW9sZF9zdGF0ID0gY2hpcC0+aXJxX3N0YXQ7CisJdHJpZ2dlciA9IChjdXJfc3RhdCBeIG9sZF9zdGF0KSAmIGNoaXAtPmlycV9tYXNrOworCisJaWYgKCF0cmlnZ2VyKQorCQlyZXR1cm4gMDsKKworCWNoaXAtPmlycV9zdGF0ID0gY3VyX3N0YXQ7CisKKwlwZW5kaW5nID0gKG9sZF9zdGF0ICYgY2hpcC0+aXJxX3RyaWdfZmFsbCkgfAorCQkgIChjdXJfc3RhdCAmIGNoaXAtPmlycV90cmlnX3JhaXNlKTsKKwlwZW5kaW5nICY9IHRyaWdnZXI7CisKKwlyZXR1cm4gcGVuZGluZzsKK30KKworc3RhdGljIGlycXJldHVybl90IHBjYTk1M3hfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGRldmlkOworCXVpbnQxNl90IHBlbmRpbmc7CisJdWludDE2X3QgbGV2ZWw7CisKKwlwZW5kaW5nID0gcGNhOTUzeF9pcnFfcGVuZGluZyhjaGlwKTsKKworCWlmICghcGVuZGluZykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJZG8geworCQlsZXZlbCA9IF9fZmZzKHBlbmRpbmcpOworCQloYW5kbGVfbmVzdGVkX2lycShsZXZlbCArIGNoaXAtPmlycV9iYXNlKTsKKworCQlwZW5kaW5nICY9IH4oMSA8PCBsZXZlbCk7CisJfSB3aGlsZSAocGVuZGluZyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcGNhOTUzeF9pcnFfc2V0dXAoc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkLAorCQkJICAgICBpbnQgaXJxX2Jhc2UpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0LCBvZmZzZXQgPSAwOworCisJaWYgKGlycV9iYXNlICE9IC0xCisJCQkmJiAoaWQtPmRyaXZlcl9kYXRhICYgUENBX0lOVCkpIHsKKwkJaW50IGx2bDsKKworCQlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgeworCQljYXNlIFBDQTk1M1hfVFlQRToKKwkJCW9mZnNldCA9IFBDQTk1M1hfSU5QVVQ7CisJCQlicmVhazsKKwkJY2FzZSBQQ0E5NTdYX1RZUEU6CisJCQlvZmZzZXQgPSBQQ0E5NTdYX0lOOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gcGNhOTUzeF9yZWFkX3JlZyhjaGlwLCBvZmZzZXQsICZjaGlwLT5pcnFfc3RhdCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9mYWlsZWQ7CisKKwkJLyoKKwkJICogVGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hpY2ggR1BJTyBsaW5lIGdlbmVyYXRlZCB0aGUKKwkJICogaW50ZXJydXB0LiAgV2UgaGF2ZSB0byByZWx5IG9uIHRoZSBwcmV2aW91cyByZWFkIGZvcgorCQkgKiB0aGlzIHB1cnBvc2UuCisJCSAqLworCQljaGlwLT5pcnFfc3RhdCAmPSBjaGlwLT5yZWdfZGlyZWN0aW9uOworCQltdXRleF9pbml0KCZjaGlwLT5pcnFfbG9jayk7CisKKwkJY2hpcC0+aXJxX2Jhc2UgPSBpcnFfYWxsb2NfZGVzY3MoLTEsIGlycV9iYXNlLCBjaGlwLT5ncGlvX2NoaXAubmdwaW8sIC0xKTsKKwkJaWYgKGNoaXAtPmlycV9iYXNlIDwgMCkKKwkJCWdvdG8gb3V0X2ZhaWxlZDsKKworCQlmb3IgKGx2bCA9IDA7IGx2bCA8IGNoaXAtPmdwaW9fY2hpcC5uZ3BpbzsgbHZsKyspIHsKKwkJCWludCBpcnEgPSBsdmwgKyBjaGlwLT5pcnFfYmFzZTsKKworCQkJaXJxX2NsZWFyX3N0YXR1c19mbGFncyhpcnEsIElSUV9OT1JFUVVFU1QpOworCQkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBjaGlwKTsKKwkJCWlycV9zZXRfY2hpcChpcnEsICZwY2E5NTN4X2lycV9jaGlwKTsKKwkJCWlycV9zZXRfbmVzdGVkX3RocmVhZChpcnEsIHRydWUpOworI2lmZGVmIENPTkZJR19BUk0KKwkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKKyNlbHNlCisJCQlpcnFfc2V0X25vcHJvYmUoaXJxKTsKKyNlbmRpZgorCQl9CisKKwkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2xpZW50LT5pcnEsCisJCQkJCSAgIE5VTEwsCisJCQkJCSAgIHBjYTk1M3hfaXJxX2hhbmRsZXIsCisJCQkJCSAgIElSUUZfVFJJR0dFUl9MT1cgfCBJUlFGX09ORVNIT1QsCisJCQkJCSAgIGRldl9uYW1lKCZjbGllbnQtPmRldiksIGNoaXApOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwKKwkJCQljbGllbnQtPmlycSk7CisJCQlnb3RvIG91dF9mYWlsZWQ7CisJCX0KKworCQljaGlwLT5ncGlvX2NoaXAudG9faXJxID0gcGNhOTUzeF9ncGlvX3RvX2lycTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2ZhaWxlZDoKKwljaGlwLT5pcnFfYmFzZSA9IC0xOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHBjYTk1M3hfaXJxX3RlYXJkb3duKHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXApCit7CisJaWYgKGNoaXAtPmlycV9iYXNlICE9IC0xKSB7CisJCWlycV9mcmVlX2Rlc2NzKGNoaXAtPmlycV9iYXNlLCBjaGlwLT5ncGlvX2NoaXAubmdwaW8pOworCQlmcmVlX2lycShjaGlwLT5jbGllbnQtPmlycSwgY2hpcCk7CisJfQorfQorI2Vsc2UgLyogQ09ORklHX0dQSU9fUENBOTUzWF9JUlEgKi8KK3N0YXRpYyBpbnQgcGNhOTUzeF9pcnFfc2V0dXAoc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkLAorCQkJICAgICBpbnQgaXJxX2Jhc2UpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKworCWlmIChpcnFfYmFzZSAhPSAtMSAmJiAoaWQtPmRyaXZlcl9kYXRhICYgUENBX0lOVCkpCisJCWRldl93YXJuKCZjbGllbnQtPmRldiwgImludGVycnVwdCBzdXBwb3J0IG5vdCBjb21waWxlZCBpblxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGNhOTUzeF9pcnFfdGVhcmRvd24oc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCkKK3sKK30KKyNlbmRpZgorCisvKgorICogSGFuZGxlcnMgZm9yIGFsdGVybmF0aXZlIHNvdXJjZXMgb2YgcGxhdGZvcm1fZGF0YQorICovCisjaWZkZWYgQ09ORklHX09GX0dQSU8KKy8qCisgKiBUcmFuc2xhdGUgT3BlbkZpcm13YXJlIG5vZGUgcHJvcGVydGllcyBpbnRvIHBsYXRmb3JtX2RhdGEKKyAqIFdBUk5JTkc6IFRoaXMgaXMgREVQUkVDQVRFRCBhbmQgd2lsbCBiZSByZW1vdmVkIGV2ZW50dWFsbHkhCisgKi8KK3ZvaWQKK3BjYTk1M3hfZ2V0X2FsdF9wZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgKmdwaW9fYmFzZSwgaW50ICppbnZlcnQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCWNvbnN0IF9fYmUzMiAqdmFsOworCWludCBzaXplOworCisJbm9kZSA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJKmdwaW9fYmFzZSA9IC0xOworCXZhbCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAibGludXgsZ3Bpby1iYXNlIiwgJnNpemUpOworCVdBUk4odmFsLCAiJXM6IGRldmljZS10cmVlIHByb3BlcnR5ICdsaW51eCxncGlvLWJhc2UnIGlzIGRlcHJlY2F0ZWQhIiwgX19mdW5jX18pOworCWlmICh2YWwpIHsKKwkJaWYgKHNpemUgIT0gc2l6ZW9mKCp2YWwpKQorCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiJXM6IHdyb25nIGxpbnV4LGdwaW8tYmFzZVxuIiwKKwkJCQkgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJZWxzZQorCQkJKmdwaW9fYmFzZSA9IGJlMzJfdG9fY3B1cCh2YWwpOworCX0KKworCXZhbCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicG9sYXJpdHkiLCBOVUxMKTsKKwlXQVJOKHZhbCwgIiVzOiBkZXZpY2UtdHJlZSBwcm9wZXJ0eSAncG9sYXJpdHknIGlzIGRlcHJlY2F0ZWQhIiwgX19mdW5jX18pOworCWlmICh2YWwpCisJCSppbnZlcnQgPSAqdmFsOworfQorI2Vsc2UKK3ZvaWQKK3BjYTk1M3hfZ2V0X2FsdF9wZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgKmdwaW9fYmFzZSwgaW50ICppbnZlcnQpCit7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgZGV2aWNlX3BjYTk1M3hfaW5pdChzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwLCBpbnQgaW52ZXJ0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBwY2E5NTN4X3JlYWRfcmVnKGNoaXAsIFBDQTk1M1hfT1VUUFVULCAmY2hpcC0+cmVnX291dHB1dCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBwY2E5NTN4X3JlYWRfcmVnKGNoaXAsIFBDQTk1M1hfRElSRUNUSU9OLAorCQkJICAgICAgICZjaGlwLT5yZWdfZGlyZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIHNldCBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xhcml0eSBpbnZlcnNpb24gKi8KKwlyZXQgPSBwY2E5NTN4X3dyaXRlX3JlZyhjaGlwLCBQQ0E5NTNYX0lOVkVSVCwgaW52ZXJ0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkZXZpY2VfcGNhOTU3eF9pbml0KHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCBpbnZlcnQpCit7CisJaW50IHJldDsKKwl1aW50MTZfdCB2YWwgPSAwOworCisJLyogTGV0IGV2ZXJ5IHBvcnQgaW4gcHJvcGVyIHN0YXRlLCB0aGF0IGNvdWxkIHNhdmUgcG93ZXIgKi8KKwlwY2E5NTN4X3dyaXRlX3JlZyhjaGlwLCBQQ0E5NTdYX1BVUEQsIDB4MCk7CisJcGNhOTUzeF93cml0ZV9yZWcoY2hpcCwgUENBOTU3WF9DRkcsIDB4ZmZmZik7CisJcGNhOTUzeF93cml0ZV9yZWcoY2hpcCwgUENBOTU3WF9PVVQsIDB4MCk7CisKKwlyZXQgPSBwY2E5NTN4X3JlYWRfcmVnKGNoaXAsIFBDQTk1N1hfSU4sICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IHBjYTk1M3hfcmVhZF9yZWcoY2hpcCwgUENBOTU3WF9PVVQsICZjaGlwLT5yZWdfb3V0cHV0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXQgPSBwY2E5NTN4X3JlYWRfcmVnKGNoaXAsIFBDQTk1N1hfQ0ZHLCAmY2hpcC0+cmVnX2RpcmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBzZXQgcGxhdGZvcm0gc3BlY2lmaWMgcG9sYXJpdHkgaW52ZXJzaW9uICovCisJcGNhOTUzeF93cml0ZV9yZWcoY2hpcCwgUENBOTU3WF9JTlZSVCwgaW52ZXJ0KTsKKworCS8qIFRvIGVuYWJsZSByZWdpc3RlciA2LCA3IHRvIGNvbnRyb2xsIHB1bGwgdXAgYW5kIHB1bGwgZG93biAqLworCXBjYTk1M3hfd3JpdGVfcmVnKGNoaXAsIFBDQTk1N1hfQktFTiwgMHgyMDIpOworCisJcmV0dXJuIDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGNhOTUzeF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwOworCWludCBpcnFfYmFzZT0wLCBpbnZlcnQ9MDsKKwlpbnQgcmV0ID0gMDsKKworCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNhOTUzeF9jaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKHBkYXRhKSB7CisJCWlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOworCQljaGlwLT5ncGlvX3N0YXJ0ID0gcGRhdGEtPmdwaW9fYmFzZTsKKwkJaW52ZXJ0ID0gcGRhdGEtPmludmVydDsKKwkJY2hpcC0+bmFtZXMgPSBwZGF0YS0+bmFtZXM7CisJfSBlbHNlIHsKKwkJcGNhOTUzeF9nZXRfYWx0X3BkYXRhKGNsaWVudCwgJmNoaXAtPmdwaW9fc3RhcnQsICZpbnZlcnQpOworI2lmZGVmIENPTkZJR19PRl9HUElPCisJCS8qIElmIEkyQyBub2RlIGhhcyBubyBpbnRlcnJ1cHRzIHByb3BlcnR5LCBkaXNhYmxlIEdQSU8gaW50ZXJydXB0cyAqLworCQlpZiAob2ZfZmluZF9wcm9wZXJ0eShjbGllbnQtPmRldi5vZl9ub2RlLCAiaW50ZXJydXB0cyIsIE5VTEwpID09IE5VTEwpCisJCQlpcnFfYmFzZSA9IC0xOworI2VuZGlmCisJfQorCisJY2hpcC0+Y2xpZW50ID0gY2xpZW50OworCisJY2hpcC0+Y2hpcF90eXBlID0gaWQtPmRyaXZlcl9kYXRhICYgKFBDQTk1M1hfVFlQRSB8IFBDQTk1N1hfVFlQRSk7CisKKwltdXRleF9pbml0KCZjaGlwLT5pMmNfbG9jayk7CisKKwkvKiBpbml0aWFsaXplIGNhY2hlZCByZWdpc3RlcnMgZnJvbSB0aGVpciBvcmlnaW5hbCB2YWx1ZXMuCisJICogd2UgY2FuJ3Qgc2hhcmUgdGhpcyBjaGlwIHdpdGggYW5vdGhlciBpMmMgbWFzdGVyLgorCSAqLworCXBjYTk1M3hfc2V0dXBfZ3BpbyhjaGlwLCBpZC0+ZHJpdmVyX2RhdGEgJiBQQ0FfR1BJT19NQVNLKTsKKworCWlmIChjaGlwLT5jaGlwX3R5cGUgPT0gUENBOTUzWF9UWVBFKQorCQlkZXZpY2VfcGNhOTUzeF9pbml0KGNoaXAsIGludmVydCk7CisJZWxzZSBpZiAoY2hpcC0+Y2hpcF90eXBlID09IFBDQTk1N1hfVFlQRSkKKwkJZGV2aWNlX3BjYTk1N3hfaW5pdChjaGlwLCBpbnZlcnQpOworCWVsc2UKKwkJZ290byBvdXRfZmFpbGVkOworCisJcmV0ID0gcGNhOTUzeF9pcnFfc2V0dXAoY2hpcCwgaWQsIGlycV9iYXNlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mYWlsZWQ7CisKKwlyZXQgPSBncGlvY2hpcF9hZGQoJmNoaXAtPmdwaW9fY2hpcCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZmFpbGVkX2lycTsKKworCWlmIChwZGF0YSAmJiBwZGF0YS0+c2V0dXApIHsKKwkJcmV0ID0gcGRhdGEtPnNldHVwKGNsaWVudCwgY2hpcC0+Z3Bpb19jaGlwLmJhc2UsCisJCQkJY2hpcC0+Z3Bpb19jaGlwLm5ncGlvLCBwZGF0YS0+Y29udGV4dCk7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAic2V0dXAgZmFpbGVkLCAlZFxuIiwgcmV0KTsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKKwlyZXR1cm4gMDsKKworb3V0X2ZhaWxlZF9pcnE6CisJcGNhOTUzeF9pcnFfdGVhcmRvd24oY2hpcCk7CitvdXRfZmFpbGVkOgorCWtmcmVlKGNoaXApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGNhOTUzeF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByZXQgPSAwOworCisJaWYgKHBkYXRhICYmIHBkYXRhLT50ZWFyZG93bikgeworCQlyZXQgPSBwZGF0YS0+dGVhcmRvd24oY2xpZW50LCBjaGlwLT5ncGlvX2NoaXAuYmFzZSwKKwkJCQljaGlwLT5ncGlvX2NoaXAubmdwaW8sIHBkYXRhLT5jb250ZXh0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgZmFpbGVkLCAlZFxuIiwKKwkJCQkJInRlYXJkb3duIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJmNoaXAtPmdwaW9fY2hpcCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGZhaWxlZCwgJWRcbiIsCisJCQkJImdwaW9jaGlwX3JlbW92ZSgpIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwY2E5NTN4X2lycV90ZWFyZG93bihjaGlwKTsKKwlrZnJlZShjaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHBjYTk1M3hfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInBjYTk1M3giLAorCX0sCisJLnByb2JlCQk9IHBjYTk1M3hfcHJvYmUsCisJLnJlbW92ZQkJPSBwY2E5NTN4X3JlbW92ZSwKKwkuaWRfdGFibGUJPSBwY2E5NTN4X2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGNhOTUzeF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZwY2E5NTN4X2RyaXZlcik7Cit9CisvKiByZWdpc3RlciBhZnRlciBpMmMgcG9zdGNvcmUgaW5pdGNhbGwgYW5kIGJlZm9yZQorICogc3Vic3lzIGluaXRjYWxscyB0aGF0IG1heSByZWx5IG9uIHRoZXNlIEdQSU9zCisgKi8KK3N1YnN5c19pbml0Y2FsbChwY2E5NTN4X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcGNhOTUzeF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnBjYTk1M3hfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHBjYTk1M3hfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoImVyaWMgbWlhbyA8ZXJpYy5taWFvQG1hcnZlbGwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHUElPIGV4cGFuZGVyIGRyaXZlciBmb3IgUENBOTUzeCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tcGNmODU3eC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tcGNmODU3eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNjlmZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1wY2Y4NTd4LmMKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHBjZjg1N3gsIHBjYTg1N3gsIGFuZCBwY2E5Njd4IEkyQyBHUElPIGV4cGFuZGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9wY2Y4NTd4Lmg+CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBjZjg1N3hfaWRbXSA9IHsKKwl7ICJwY2Y4NTc0IiwgOCB9LAorCXsgInBjZjg1NzRhIiwgOCB9LAorCXsgInBjYTg1NzQiLCA4IH0sCisJeyAicGNhOTY3MCIsIDggfSwKKwl7ICJwY2E5NjcyIiwgOCB9LAorCXsgInBjYTk2NzQiLCA4IH0sCisJeyAicGNmODU3NSIsIDE2IH0sCisJeyAicGNhODU3NSIsIDE2IH0sCisJeyAicGNhOTY3MSIsIDE2IH0sCisJeyAicGNhOTY3MyIsIDE2IH0sCisJeyAicGNhOTY3NSIsIDE2IH0sCisJeyAibWF4NzMyOCIsIDggfSwKKwl7ICJtYXg3MzI5IiwgOCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBwY2Y4NTd4X2lkKTsKKworLyoKKyAqIFRoZSBwY2Y4NTd4LCBwY2E4NTd4LCBhbmQgcGNhOTY3eCBjaGlwcyBvbmx5IGV4cG9zZSBvbmUgcmVhZCBhbmQgb25lCisgKiB3cml0ZSByZWdpc3Rlci4gIFdyaXRpbmcgYSAib25lIiBiaXQgKHRvIG1hdGNoIHRoZSByZXNldCBzdGF0ZSkgbGV0cworICogdGhhdCBwaW4gYmUgdXNlZCBhcyBhbiBpbnB1dDsgaXQncyBub3QgYW4gb3Blbi1kcmFpbiBtb2RlbCwgYnV0IGFjdHMKKyAqIGEgYml0IGxpa2Ugb25lLiAgVGhpcyBpcyBkZXNjcmliZWQgYXMgInF1YXNpLWJpZGlyZWN0aW9uYWwiOyByZWFkIHRoZQorICogY2hpcCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorICoKKyAqIE1hbnkgb3RoZXIgSTJDIEdQSU8gZXhwYW5kZXIgY2hpcHMgKGxpa2UgdGhlIHBjYTk1M3ggbW9kZWxzKSBoYXZlCisgKiBtb3JlIGNvbXBsZXggcmVnaXN0ZXIgbW9kZWxzIGFuZCBtb3JlIGNvbnZlbnRpb25hbCBjaXJjdWl0cnkgdXNpbmcKKyAqIHB1c2gvcHVsbCBkcml2ZXJzLiAgVGhleSBvZnRlbiB1c2UgdGhlIHNhbWUgMHgyMC4uMHgyNyBhZGRyZXNzZXMgYXMKKyAqIHBjZjg1N3ggcGFydHMsIG1ha2luZyB0aGUgImxlZ2FjeSIgSTJDIGRyaXZlciBtb2RlbCBwcm9ibGVtYXRpYy4KKyAqLworc3RydWN0IHBjZjg1N3ggeworCXN0cnVjdCBncGlvX2NoaXAJY2hpcDsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCXN0cnVjdCBtdXRleAkJbG9jazsJCS8qIHByb3RlY3QgJ291dCcgKi8KKwl1bnNpZ25lZAkJb3V0OwkJLyogc29mdHdhcmUgbGF0Y2ggKi8KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRhbGsgdG8gOC1iaXQgSS9PIGV4cGFuZGVyICovCisKK3N0YXRpYyBpbnQgcGNmODU3eF9pbnB1dDgoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBwY2Y4NTd4CSpncGlvID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBwY2Y4NTd4LCBjaGlwKTsKKwlpbnQJCXN0YXR1czsKKworCW11dGV4X2xvY2soJmdwaW8tPmxvY2spOworCWdwaW8tPm91dCB8PSAoMSA8PCBvZmZzZXQpOworCXN0YXR1cyA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGdwaW8tPmNsaWVudCwgZ3Bpby0+b3V0KTsKKwltdXRleF91bmxvY2soJmdwaW8tPmxvY2spOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBwY2Y4NTd4X2dldDgoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBwY2Y4NTd4CSpncGlvID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBwY2Y4NTd4LCBjaGlwKTsKKwlzMzIJCXZhbHVlOworCisJdmFsdWUgPSBpMmNfc21idXNfcmVhZF9ieXRlKGdwaW8tPmNsaWVudCk7CisJcmV0dXJuICh2YWx1ZSA8IDApID8gMCA6ICh2YWx1ZSAmICgxIDw8IG9mZnNldCkpOworfQorCitzdGF0aWMgaW50IHBjZjg1N3hfb3V0cHV0OChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcGNmODU3eAkqZ3BpbyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcGNmODU3eCwgY2hpcCk7CisJdW5zaWduZWQJYml0ID0gMSA8PCBvZmZzZXQ7CisJaW50CQlzdGF0dXM7CisKKwltdXRleF9sb2NrKCZncGlvLT5sb2NrKTsKKwlpZiAodmFsdWUpCisJCWdwaW8tPm91dCB8PSBiaXQ7CisJZWxzZQorCQlncGlvLT5vdXQgJj0gfmJpdDsKKwlzdGF0dXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShncGlvLT5jbGllbnQsIGdwaW8tPm91dCk7CisJbXV0ZXhfdW5sb2NrKCZncGlvLT5sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHBjZjg1N3hfc2V0OChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlwY2Y4NTd4X291dHB1dDgoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRhbGsgdG8gMTYtYml0IEkvTyBleHBhbmRlciAqLworCitzdGF0aWMgaW50IGkyY193cml0ZV9sZTE2KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiB3b3JkKQoreworCXU4IGJ1ZlsyXSA9IHsgd29yZCAmIDB4ZmYsIHdvcmQgPj4gOCwgfTsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAyKTsKKwlyZXR1cm4gKHN0YXR1cyA8IDApID8gc3RhdHVzIDogMDsKK30KKworc3RhdGljIGludCBpMmNfcmVhZF9sZTE2KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTggYnVmWzJdOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBidWYsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCXJldHVybiAoYnVmWzFdIDw8IDgpIHwgYnVmWzBdOworfQorCitzdGF0aWMgaW50IHBjZjg1N3hfaW5wdXQxNihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHBjZjg1N3gJKmdwaW8gPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHBjZjg1N3gsIGNoaXApOworCWludAkJc3RhdHVzOworCisJbXV0ZXhfbG9jaygmZ3Bpby0+bG9jayk7CisJZ3Bpby0+b3V0IHw9ICgxIDw8IG9mZnNldCk7CisJc3RhdHVzID0gaTJjX3dyaXRlX2xlMTYoZ3Bpby0+Y2xpZW50LCBncGlvLT5vdXQpOworCW11dGV4X3VubG9jaygmZ3Bpby0+bG9jayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHBjZjg1N3hfZ2V0MTYoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBwY2Y4NTd4CSpncGlvID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBwY2Y4NTd4LCBjaGlwKTsKKwlpbnQJCXZhbHVlOworCisJdmFsdWUgPSBpMmNfcmVhZF9sZTE2KGdwaW8tPmNsaWVudCk7CisJcmV0dXJuICh2YWx1ZSA8IDApID8gMCA6ICh2YWx1ZSAmICgxIDw8IG9mZnNldCkpOworfQorCitzdGF0aWMgaW50IHBjZjg1N3hfb3V0cHV0MTYoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHBjZjg1N3gJKmdwaW8gPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHBjZjg1N3gsIGNoaXApOworCXVuc2lnbmVkCWJpdCA9IDEgPDwgb2Zmc2V0OworCWludAkJc3RhdHVzOworCisJbXV0ZXhfbG9jaygmZ3Bpby0+bG9jayk7CisJaWYgKHZhbHVlKQorCQlncGlvLT5vdXQgfD0gYml0OworCWVsc2UKKwkJZ3Bpby0+b3V0ICY9IH5iaXQ7CisJc3RhdHVzID0gaTJjX3dyaXRlX2xlMTYoZ3Bpby0+Y2xpZW50LCBncGlvLT5vdXQpOworCW11dGV4X3VubG9jaygmZ3Bpby0+bG9jayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBwY2Y4NTd4X3NldDE2KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXBjZjg1N3hfb3V0cHV0MTYoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgcGNmODU3eF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcGNmODU3eF9wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKKwlzdHJ1Y3QgcGNmODU3eAkJCSpncGlvOworCWludAkJCQlzdGF0dXM7CisKKwlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGFcbiIpOworCX0KKworCS8qIEFsbG9jYXRlLCBpbml0aWFsaXplLCBhbmQgcmVnaXN0ZXIgdGhpcyBncGlvX2NoaXAuICovCisJZ3BpbyA9IGt6YWxsb2Moc2l6ZW9mICpncGlvLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdwaW8pCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmZ3Bpby0+bG9jayk7CisKKwlncGlvLT5jaGlwLmJhc2UgPSBwZGF0YSA/IHBkYXRhLT5ncGlvX2Jhc2UgOiAtMTsKKwlncGlvLT5jaGlwLmNhbl9zbGVlcCA9IDE7CisJZ3Bpby0+Y2hpcC5kZXYgPSAmY2xpZW50LT5kZXY7CisJZ3Bpby0+Y2hpcC5vd25lciA9IFRISVNfTU9EVUxFOworCisJLyogTk9URTogIHRoZSBPblNlbWkgamxjMTU2MmIgaXMgYWxzbyBsYXJnZWx5IGNvbXBhdGlibGUgd2l0aAorCSAqIHRoZXNlIHBhcnRzLCBub3RhYmx5IGZvciBvdXRwdXQuICBJdCBoYXMgYSBsb3ctcmVzb2x1dGlvbgorCSAqIERBQyBpbnN0ZWFkIG9mIHBpbiBjaGFuZ2UgSVJRczsgYW5kIGl0cyBpbnB1dHMgY2FuIGJlIHRoZQorCSAqIHJlc3VsdCBvZiBjb21wYXJhdG9ycy4KKwkgKi8KKworCS8qIDg1NzQgYWRkcmVzc2VzIGFyZSAweDIwLi4weDI3OyA4NTc0YSB1c2VzIDB4MzguLjB4M2Y7CisJICogOTY3MCwgOTY3MiwgOTc2NCwgYW5kIDk3NjRhIHVzZSBxdWl0ZSBhIHZhcmlldHkuCisJICoKKwkgKiBOT1RFOiB3ZSBkb24ndCBkaXN0aW5ndWlzaCBoZXJlIGJldHdlZW4gKjQgYW5kICo0YSBwYXJ0cy4KKwkgKi8KKwlncGlvLT5jaGlwLm5ncGlvID0gaWQtPmRyaXZlcl9kYXRhOworCWlmIChncGlvLT5jaGlwLm5ncGlvID09IDgpIHsKKwkJZ3Bpby0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBwY2Y4NTd4X2lucHV0ODsKKwkJZ3Bpby0+Y2hpcC5nZXQgPSBwY2Y4NTd4X2dldDg7CisJCWdwaW8tPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IHBjZjg1N3hfb3V0cHV0ODsKKwkJZ3Bpby0+Y2hpcC5zZXQgPSBwY2Y4NTd4X3NldDg7CisKKwkJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJSTJDX0ZVTkNfU01CVVNfQllURSkpCisJCQlzdGF0dXMgPSAtRUlPOworCisJCS8qIGZhaWwgaWYgdGhlcmUncyBubyBjaGlwIHByZXNlbnQgKi8KKwkJZWxzZQorCQkJc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZShjbGllbnQpOworCisJLyogJzc1Lyc3NWMgYWRkcmVzc2VzIGFyZSAweDIwLi4weDI3LCBqdXN0IGxpa2UgdGhlICc3NDsKKwkgKiB0aGUgJzc1YyBkb2Vzbid0IGhhdmUgYSBjdXJyZW50IHNvdXJjZSBwdWxsaW5nIGhpZ2guCisJICogOTY3MSwgOTY3MywgYW5kIDk3NjUgdXNlIHF1aXRlIGEgdmFyaWV0eSBvZiBhZGRyZXNzZXMuCisJICoKKwkgKiBOT1RFOiB3ZSBkb24ndCBkaXN0aW5ndWlzaCBoZXJlIGJldHdlZW4gJzc1IGFuZCAnNzVjIHBhcnRzLgorCSAqLworCX0gZWxzZSBpZiAoZ3Bpby0+Y2hpcC5uZ3BpbyA9PSAxNikgeworCQlncGlvLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IHBjZjg1N3hfaW5wdXQxNjsKKwkJZ3Bpby0+Y2hpcC5nZXQgPSBwY2Y4NTd4X2dldDE2OworCQlncGlvLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBwY2Y4NTd4X291dHB1dDE2OworCQlncGlvLT5jaGlwLnNldCA9IHBjZjg1N3hfc2V0MTY7CisKKwkJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCisJCQlzdGF0dXMgPSAtRUlPOworCisJCS8qIGZhaWwgaWYgdGhlcmUncyBubyBjaGlwIHByZXNlbnQgKi8KKwkJZWxzZQorCQkJc3RhdHVzID0gaTJjX3JlYWRfbGUxNihjbGllbnQpOworCisJfSBlbHNlIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJ1bnN1cHBvcnRlZCBudW1iZXIgb2YgZ3Bpb3NcbiIpOworCQlzdGF0dXMgPSAtRUlOVkFMOworCX0KKworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlncGlvLT5jaGlwLmxhYmVsID0gY2xpZW50LT5uYW1lOworCisJZ3Bpby0+Y2xpZW50ID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGdwaW8pOworCisJLyogTk9URTogIHRoZXNlIGNoaXBzIGhhdmUgc3RyYW5nZSAicXVhc2ktYmlkaXJlY3Rpb25hbCIgSS9PIHBpbnMuCisJICogV2UgY2FuJ3QgYWN0dWFsbHkga25vdyB3aGV0aGVyIGEgcGluIGlzIGNvbmZpZ3VyZWQgKGEpIGFzIG91dHB1dAorCSAqIGFuZCBkcml2aW5nIHRoZSBzaWduYWwgbG93LCBvciAoYikgYXMgaW5wdXQgYW5kIHJlcG9ydGluZyBhIGxvdworCSAqIHZhbHVlIC4uLiB3aXRob3V0IGtub3dpbmcgdGhlIGxhc3QgdmFsdWUgd3JpdHRlbiBzaW5jZSB0aGUgY2hpcAorCSAqIGNhbWUgb3V0IG9mIHJlc2V0IChpZiBhbnkpLiAgV2UgY2FuJ3QgcmVhZCB0aGUgbGF0Y2hlZCBvdXRwdXQuCisJICoKKwkgKiBJbiBzaG9ydCwgdGhlIG9ubHkgcmVsaWFibGUgc29sdXRpb24gZm9yIHNldHRpbmcgdXAgcGluIGRpcmVjdGlvbgorCSAqIGlzIHRvIGRvIGl0IGV4cGxpY2l0bHkuICBUaGUgc2V0dXAoKSBtZXRob2QgY2FuIGRvIHRoYXQsIGJ1dCBpdAorCSAqIG1heSBjYXVzZSB0cmFuc2llbnQgZ2xpdGNoaW5nIHNpbmNlIGl0IGNhbid0IGtub3cgdGhlIGxhc3QgdmFsdWUKKwkgKiB3cml0dGVuIChzb21lIHBpbnMgbWF5IG5lZWQgdG8gYmUgZHJpdmVuIGxvdykuCisJICoKKwkgKiBVc2luZyBwZGF0YS0+bl9sYXRjaCBhdm9pZHMgdGhhdCB0cm91YmxlLiAgV2hlbiBsZWZ0IGluaXRpYWxpemVkCisJICogdG8gemVybywgb3VyIHNvZnR3YXJlIGNvcHkgb2YgdGhlICJsYXRjaCIgdGhlbiBtYXRjaGVzIHRoZSBjaGlwJ3MKKwkgKiBhbGwtb25lcyByZXNldCBzdGF0ZS4gIE90aGVyd2lzZSBpdCBmbGFncyBwaW5zIHRvIGJlIGRyaXZlbiBsb3cuCisJICovCisJZ3Bpby0+b3V0ID0gcGRhdGEgPyB+cGRhdGEtPm5fbGF0Y2ggOiB+MDsKKworCXN0YXR1cyA9IGdwaW9jaGlwX2FkZCgmZ3Bpby0+Y2hpcCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKworCS8qIE5PVEU6IHRoZXNlIGNoaXBzIGNhbiBpc3N1ZSAic29tZSBwaW4tY2hhbmdlZCIgSVJRcywgd2hpY2ggd2UKKwkgKiBkb24ndCB5ZXQgZXZlbiB0cnkgdG8gdXNlLiAgQW1vbmcgb3RoZXIgaXNzdWVzLCB0aGUgcmVsZXZhbnQKKwkgKiBnZW5pcnEgc3RhdGUgaXNuJ3QgYXZhaWxhYmxlIHRvIG1vZHVsYXIgZHJpdmVyczsgYW5kIG1vc3QgaXJxCisJICogbWV0aG9kcyBjYW4ndCBiZSBjYWxsZWQgZnJvbSBzbGVlcGluZyBjb250ZXh0cy4KKwkgKi8KKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgImdwaW9zICVkLi4lZCBvbiBhICVzJXNcbiIsCisJCQlncGlvLT5jaGlwLmJhc2UsCisJCQlncGlvLT5jaGlwLmJhc2UgKyBncGlvLT5jaGlwLm5ncGlvIC0gMSwKKwkJCWNsaWVudC0+bmFtZSwKKwkJCWNsaWVudC0+aXJxID8gIiAoaXJxIGlnbm9yZWQpIiA6ICIiKTsKKworCS8qIExldCBwbGF0Zm9ybSBjb2RlIHNldCB1cCB0aGUgR1BJT3MgYW5kIHRoZWlyIHVzZXJzLgorCSAqIE5vdyBpcyB0aGUgZmlyc3QgdGltZSBhbnlvbmUgY291bGQgdXNlIHRoZW0uCisJICovCisJaWYgKHBkYXRhICYmIHBkYXRhLT5zZXR1cCkgeworCQlzdGF0dXMgPSBwZGF0YS0+c2V0dXAoY2xpZW50LAorCQkJCWdwaW8tPmNoaXAuYmFzZSwgZ3Bpby0+Y2hpcC5uZ3BpbywKKwkJCQlwZGF0YS0+Y29udGV4dCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAic2V0dXAgLS0+ICVkXG4iLCBzdGF0dXMpOworCX0KKworCXJldHVybiAwOworCitmYWlsOgorCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAicHJvYmUgZXJyb3IgJWQgZm9yICclcydcbiIsCisJCQlzdGF0dXMsIGNsaWVudC0+bmFtZSk7CisJa2ZyZWUoZ3Bpbyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBwY2Y4NTd4X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBwY2Y4NTd4X3BsYXRmb3JtX2RhdGEJKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcGNmODU3eAkJCSpncGlvID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50CQkJCXN0YXR1cyA9IDA7CisKKwlpZiAocGRhdGEgJiYgcGRhdGEtPnRlYXJkb3duKSB7CisJCXN0YXR1cyA9IHBkYXRhLT50ZWFyZG93bihjbGllbnQsCisJCQkJZ3Bpby0+Y2hpcC5iYXNlLCBncGlvLT5jaGlwLm5ncGlvLAorCQkJCXBkYXRhLT5jb250ZXh0KTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgLS0+ICVkXG4iLAorCQkJCQkidGVhcmRvd24iLCBzdGF0dXMpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCXN0YXR1cyA9IGdwaW9jaGlwX3JlbW92ZSgmZ3Bpby0+Y2hpcCk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlrZnJlZShncGlvKTsKKwllbHNlCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgLS0+ICVkXG4iLCAicmVtb3ZlIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGNmODU3eF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAicGNmODU3eCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCT0gcGNmODU3eF9wcm9iZSwKKwkucmVtb3ZlCT0gcGNmODU3eF9yZW1vdmUsCisJLmlkX3RhYmxlID0gcGNmODU3eF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBjZjg1N3hfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmcGNmODU3eF9kcml2ZXIpOworfQorLyogcmVnaXN0ZXIgYWZ0ZXIgaTJjIHBvc3Rjb3JlIGluaXRjYWxsIGFuZCBiZWZvcmUKKyAqIHN1YnN5cyBpbml0Y2FsbHMgdGhhdCBtYXkgcmVseSBvbiB0aGVzZSBHUElPcworICovCitzdWJzeXNfaW5pdGNhbGwocGNmODU3eF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHBjZjg1N3hfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZwY2Y4NTd4X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChwY2Y4NTd4X2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBCcm93bmVsbCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3BjaF9ncGlvLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1wY2guYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9ncGlvL3BjaF9ncGlvLmMKcmVuYW1lIHRvIGRyaXZlcnMvZ3Bpby9ncGlvLXBjaC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1wbDA2MS5jIGIvZHJpdmVycy9ncGlvL2dwaW8tcGwwNjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzVhMThmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcGwwNjEuYwpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBQcm92aWdlbnQgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRHJpdmVyIGZvciB0aGUgQVJNIFByaW1lQ2VsbCh0bSkgR2VuZXJhbCBQdXJwb3NlIElucHV0L091dHB1dCAoUEwwNjEpCisgKgorICogRGF0YSBzaGVldDogQVJNIERESSAwMTkwQiwgU2VwdGVtYmVyIDIwMDAKKyAqLworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIEdQSU9ESVIgMHg0MDAKKyNkZWZpbmUgR1BJT0lTICAweDQwNAorI2RlZmluZSBHUElPSUJFIDB4NDA4CisjZGVmaW5lIEdQSU9JRVYgMHg0MEMKKyNkZWZpbmUgR1BJT0lFICAweDQxMAorI2RlZmluZSBHUElPUklTIDB4NDE0CisjZGVmaW5lIEdQSU9NSVMgMHg0MTgKKyNkZWZpbmUgR1BJT0lDICAweDQxQworCisjZGVmaW5lIFBMMDYxX0dQSU9fTlIJOAorCitzdHJ1Y3QgcGwwNjFfZ3BpbyB7CisJLyogV2UgdXNlIGEgbGlzdCBvZiBwbDA2MV9ncGlvIHN0cnVjdHMgZm9yIGVhY2ggdHJpZ2dlciBJUlEgaW4gdGhlIG1haW4KKwkgKiBpbnRlcnJ1cHRzIGNvbnRyb2xsZXIgb2YgdGhlIHN5c3RlbS4gV2UgbmVlZCB0aGlzIHRvIHN1cHBvcnQgc3lzdGVtcworCSAqIGluIHdoaWNoIG1vcmUgdGhhdCBvbmUgUEwwNjFzIGFyZSBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgSVJRLiBUaGUgSVNSCisJICogaW50ZXJhdGVzIHRocm91Z2ggdGhpcyBsaXN0IHRvIGZpbmQgdGhlIHNvdXJjZSBvZiB0aGUgaW50ZXJydXB0LgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKworCS8qIEVhY2ggb2YgdGhlIHR3byBzcGlubG9ja3MgcHJvdGVjdHMgYSBkaWZmZXJlbnQgc2V0IG9mIGhhcmR3YXJlCisJICogcmVnaXRlcnMgYW5kIGRhdGEgc3RydWN0dXJzLiBUaGlzIGRlY291cGxlcyB0aGUgY29kZSBvZiB0aGUgSVJRIGZyb20KKwkgKiB0aGUgR1BJTyBjb2RlLiBUaGlzIGFsc28gbWFrZXMgdGhlIGNhc2Ugb2YgYSBHUElPIHJvdXRpbmUgY2FsbCBmcm9tCisJICogdGhlIElSUSBjb2RlIHNpbXBsZXIuCisJICovCisJc3BpbmxvY2tfdAkJbG9jazsJCS8qIEdQSU8gcmVnaXN0ZXJzICovCisJc3BpbmxvY2tfdAkJaXJxX2xvY2s7CS8qIElSUSByZWdpc3RlcnMgKi8KKworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJdW5zaWduZWQJCWlycV9iYXNlOworCXN0cnVjdCBncGlvX2NoaXAJZ2M7Cit9OworCitzdGF0aWMgaW50IHBsMDYxX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBwbDA2MV9ncGlvICpjaGlwID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgcGwwNjFfZ3BpbywgZ2MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBncGlvZGlyOworCisJaWYgKG9mZnNldCA+PSBnYy0+bmdwaW8pCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKwlncGlvZGlyID0gcmVhZGIoY2hpcC0+YmFzZSArIEdQSU9ESVIpOworCWdwaW9kaXIgJj0gfigxIDw8IG9mZnNldCk7CisJd3JpdGViKGdwaW9kaXIsIGNoaXAtPmJhc2UgKyBHUElPRElSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbDA2MV9kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQsCisJCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHBsMDYxX2dwaW8sIGdjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgZ3Bpb2RpcjsKKworCWlmIChvZmZzZXQgPj0gZ2MtPm5ncGlvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5sb2NrLCBmbGFncyk7CisJd3JpdGViKCEhdmFsdWUgPDwgb2Zmc2V0LCBjaGlwLT5iYXNlICsgKDEgPDwgKG9mZnNldCArIDIpKSk7CisJZ3Bpb2RpciA9IHJlYWRiKGNoaXAtPmJhc2UgKyBHUElPRElSKTsKKwlncGlvZGlyIHw9IDEgPDwgb2Zmc2V0OworCXdyaXRlYihncGlvZGlyLCBjaGlwLT5iYXNlICsgR1BJT0RJUik7CisKKwkvKgorCSAqIGdwaW8gdmFsdWUgaXMgc2V0IGFnYWluLCBiZWNhdXNlIHBsMDYxIGRvZXNuJ3QgYWxsb3cgdG8gc2V0IHZhbHVlIG9mCisJICogYSBncGlvIHBpbiBiZWZvcmUgY29uZmlndXJpbmcgaXQgaW4gT1VUIG1vZGUuCisJICovCisJd3JpdGViKCEhdmFsdWUgPDwgb2Zmc2V0LCBjaGlwLT5iYXNlICsgKDEgPDwgKG9mZnNldCArIDIpKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGwwNjFfZ2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHBsMDYxX2dwaW8gKmNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBwbDA2MV9ncGlvLCBnYyk7CisKKwlyZXR1cm4gISFyZWFkYihjaGlwLT5iYXNlICsgKDEgPDwgKG9mZnNldCArIDIpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBsMDYxX3NldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHBsMDYxX2dwaW8gKmNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBwbDA2MV9ncGlvLCBnYyk7CisKKwl3cml0ZWIoISF2YWx1ZSA8PCBvZmZzZXQsIGNoaXAtPmJhc2UgKyAoMSA8PCAob2Zmc2V0ICsgMikpKTsKK30KKworc3RhdGljIGludCBwbDA2MV90b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHBsMDYxX2dwaW8sIGdjKTsKKworCWlmIChjaGlwLT5pcnFfYmFzZSA9PSAodW5zaWduZWQpIC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjaGlwLT5pcnFfYmFzZSArIG9mZnNldDsKK30KKworLyoKKyAqIFBMMDYxIEdQSU8gSVJRCisgKi8KK3N0YXRpYyB2b2lkIHBsMDYxX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGdwaW9pZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5pcnFfbG9jaywgZmxhZ3MpOworCWdwaW9pZSA9IHJlYWRiKGNoaXAtPmJhc2UgKyBHUElPSUUpOworCWdwaW9pZSAmPSB+KDEgPDwgb2Zmc2V0KTsKKwl3cml0ZWIoZ3Bpb2llLCBjaGlwLT5iYXNlICsgR1BJT0lFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwbDA2MV9pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGdwaW9pZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5pcnFfbG9jaywgZmxhZ3MpOworCWdwaW9pZSA9IHJlYWRiKGNoaXAtPmJhc2UgKyBHUElPSUUpOworCWdwaW9pZSB8PSAxIDw8IG9mZnNldDsKKwl3cml0ZWIoZ3Bpb2llLCBjaGlwLT5iYXNlICsgR1BJT0lFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHBsMDYxX2lycV90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgdHJpZ2dlcikKK3sKKwlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGdwaW9pcywgZ3Bpb2liZSwgZ3Bpb2lldjsKKworCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBQTDA2MV9HUElPX05SKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5pcnFfbG9jaywgZmxhZ3MpOworCisJZ3Bpb2lldiA9IHJlYWRiKGNoaXAtPmJhc2UgKyBHUElPSUVWKTsKKworCWdwaW9pcyA9IHJlYWRiKGNoaXAtPmJhc2UgKyBHUElPSVMpOworCWlmICh0cmlnZ2VyICYgKElSUV9UWVBFX0xFVkVMX0hJR0ggfCBJUlFfVFlQRV9MRVZFTF9MT1cpKSB7CisJCWdwaW9pcyB8PSAxIDw8IG9mZnNldDsKKwkJaWYgKHRyaWdnZXIgJiBJUlFfVFlQRV9MRVZFTF9ISUdIKQorCQkJZ3Bpb2lldiB8PSAxIDw8IG9mZnNldDsKKwkJZWxzZQorCQkJZ3Bpb2lldiAmPSB+KDEgPDwgb2Zmc2V0KTsKKwl9IGVsc2UKKwkJZ3Bpb2lzICY9IH4oMSA8PCBvZmZzZXQpOworCXdyaXRlYihncGlvaXMsIGNoaXAtPmJhc2UgKyBHUElPSVMpOworCisJZ3Bpb2liZSA9IHJlYWRiKGNoaXAtPmJhc2UgKyBHUElPSUJFKTsKKwlpZiAoKHRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX0JPVEgpID09IElSUV9UWVBFX0VER0VfQk9USCkKKwkJZ3Bpb2liZSB8PSAxIDw8IG9mZnNldDsKKwllbHNlIHsKKwkJZ3Bpb2liZSAmPSB+KDEgPDwgb2Zmc2V0KTsKKwkJaWYgKHRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX1JJU0lORykKKwkJCWdwaW9pZXYgfD0gMSA8PCBvZmZzZXQ7CisJCWVsc2UgaWYgKHRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpCisJCQlncGlvaWV2ICY9IH4oMSA8PCBvZmZzZXQpOworCX0KKwl3cml0ZWIoZ3Bpb2liZSwgY2hpcC0+YmFzZSArIEdQSU9JQkUpOworCisJd3JpdGViKGdwaW9pZXYsIGNoaXAtPmJhc2UgKyBHUElPSUVWKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmlycV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBwbDA2MV9pcnFjaGlwID0geworCS5uYW1lCQk9ICJHUElPIiwKKwkuaXJxX2VuYWJsZQk9IHBsMDYxX2lycV9lbmFibGUsCisJLmlycV9kaXNhYmxlCT0gcGwwNjFfaXJxX2Rpc2FibGUsCisJLmlycV9zZXRfdHlwZQk9IHBsMDYxX2lycV90eXBlLAorfTsKKworc3RhdGljIHZvaWQgcGwwNjFfaXJxX2hhbmRsZXIodW5zaWduZWQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqY2hpcF9saXN0ID0gaXJxX2dldF9oYW5kbGVyX2RhdGEoaXJxKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IHBsMDYxX2dwaW8gKmNoaXA7CisKKwlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfYWNrKCZkZXNjLT5pcnFfZGF0YSk7CisJbGlzdF9mb3JfZWFjaChwdHIsIGNoaXBfbGlzdCkgeworCQl1bnNpZ25lZCBsb25nIHBlbmRpbmc7CisJCWludCBvZmZzZXQ7CisKKwkJY2hpcCA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgcGwwNjFfZ3BpbywgbGlzdCk7CisJCXBlbmRpbmcgPSByZWFkYihjaGlwLT5iYXNlICsgR1BJT01JUyk7CisJCXdyaXRlYihwZW5kaW5nLCBjaGlwLT5iYXNlICsgR1BJT0lDKTsKKworCQlpZiAocGVuZGluZyA9PSAwKQorCQkJY29udGludWU7CisKKwkJZm9yX2VhY2hfc2V0X2JpdChvZmZzZXQsICZwZW5kaW5nLCBQTDA2MV9HUElPX05SKQorCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHBsMDYxX3RvX2lycSgmY2hpcC0+Z2MsIG9mZnNldCkpOworCX0KKwlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfdW5tYXNrKCZkZXNjLT5pcnFfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcGwwNjFfcHJvYmUoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBhbWJhX2lkICppZCkKK3sKKwlzdHJ1Y3QgcGwwNjFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHBsMDYxX2dwaW8gKmNoaXA7CisJc3RydWN0IGxpc3RfaGVhZCAqY2hpcF9saXN0OworCWludCByZXQsIGlycSwgaTsKKwlzdGF0aWMgREVDTEFSRV9CSVRNQVAoaW5pdF9pcnEsIE5SX0lSUVMpOworCisJcGRhdGEgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZGV2LT5yZXMuc3RhcnQsCisJCQkJcmVzb3VyY2Vfc2l6ZSgmZGV2LT5yZXMpLCAicGwwNjEiKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCisJY2hpcC0+YmFzZSA9IGlvcmVtYXAoZGV2LT5yZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJmRldi0+cmVzKSk7CisJaWYgKGNoaXAtPmJhc2UgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2VfcmVnaW9uOworCX0KKworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+aXJxX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZjaGlwLT5saXN0KTsKKworCWNoaXAtPmdjLmRpcmVjdGlvbl9pbnB1dCA9IHBsMDYxX2RpcmVjdGlvbl9pbnB1dDsKKwljaGlwLT5nYy5kaXJlY3Rpb25fb3V0cHV0ID0gcGwwNjFfZGlyZWN0aW9uX291dHB1dDsKKwljaGlwLT5nYy5nZXQgPSBwbDA2MV9nZXRfdmFsdWU7CisJY2hpcC0+Z2Muc2V0ID0gcGwwNjFfc2V0X3ZhbHVlOworCWNoaXAtPmdjLnRvX2lycSA9IHBsMDYxX3RvX2lycTsKKwljaGlwLT5nYy5iYXNlID0gcGRhdGEtPmdwaW9fYmFzZTsKKwljaGlwLT5nYy5uZ3BpbyA9IFBMMDYxX0dQSU9fTlI7CisJY2hpcC0+Z2MubGFiZWwgPSBkZXZfbmFtZSgmZGV2LT5kZXYpOworCWNoaXAtPmdjLmRldiA9ICZkZXYtPmRldjsKKwljaGlwLT5nYy5vd25lciA9IFRISVNfTU9EVUxFOworCisJY2hpcC0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CisKKwlyZXQgPSBncGlvY2hpcF9hZGQoJmNoaXAtPmdjKTsKKwlpZiAocmV0KQorCQlnb3RvIGlvdW5tYXA7CisKKwkvKgorCSAqIGlycV9jaGlwIHN1cHBvcnQKKwkgKi8KKworCWlmIChjaGlwLT5pcnFfYmFzZSA9PSAodW5zaWduZWQpIC0xKQorCQlyZXR1cm4gMDsKKworCXdyaXRlYigwLCBjaGlwLT5iYXNlICsgR1BJT0lFKTsgLyogZGlzYWJsZSBpcnFzICovCisJaXJxID0gZGV2LT5pcnFbMF07CisJaWYgKGlycSA8IDApIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBpb3VubWFwOworCX0KKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihpcnEsIHBsMDYxX2lycV9oYW5kbGVyKTsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaXJxLCBpbml0X2lycSkpIHsgLyogbGlzdCBpbml0aWFsaXplZD8gKi8KKwkJY2hpcF9saXN0ID0ga21hbGxvYyhzaXplb2YoKmNoaXBfbGlzdCksIEdGUF9LRVJORUwpOworCQlpZiAoY2hpcF9saXN0ID09IE5VTEwpIHsKKwkJCWNsZWFyX2JpdChpcnEsIGluaXRfaXJxKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGlvdW5tYXA7CisJCX0KKwkJSU5JVF9MSVNUX0hFQUQoY2hpcF9saXN0KTsKKwkJaXJxX3NldF9oYW5kbGVyX2RhdGEoaXJxLCBjaGlwX2xpc3QpOworCX0gZWxzZQorCQljaGlwX2xpc3QgPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOworCWxpc3RfYWRkKCZjaGlwLT5saXN0LCBjaGlwX2xpc3QpOworCisJZm9yIChpID0gMDsgaSA8IFBMMDYxX0dQSU9fTlI7IGkrKykgeworCQlpZiAocGRhdGEtPmRpcmVjdGlvbnMgJiAoMSA8PCBpKSkKKwkJCXBsMDYxX2RpcmVjdGlvbl9vdXRwdXQoJmNoaXAtPmdjLCBpLAorCQkJCQlwZGF0YS0+dmFsdWVzICYgKDEgPDwgaSkpOworCQllbHNlCisJCQlwbDA2MV9kaXJlY3Rpb25faW5wdXQoJmNoaXAtPmdjLCBpKTsKKworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSArIGNoaXAtPmlycV9iYXNlLCAmcGwwNjFfaXJxY2hpcCwKKwkJCQkJIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwkJc2V0X2lycV9mbGFncyhpK2NoaXAtPmlycV9iYXNlLCBJUlFGX1ZBTElEKTsKKwkJaXJxX3NldF9jaGlwX2RhdGEoaSArIGNoaXAtPmlycV9iYXNlLCBjaGlwKTsKKwl9CisKKwlyZXR1cm4gMDsKKworaW91bm1hcDoKKwlpb3VubWFwKGNoaXAtPmJhc2UpOworcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRldi0+cmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZkZXYtPnJlcykpOworZnJlZV9tZW06CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGFtYmFfaWQgcGwwNjFfaWRzW10gPSB7CisJeworCQkuaWQJPSAweDAwMDQxMDYxLAorCQkubWFzawk9IDB4MDAwZmZmZmYsCisJfSwKKwl7IDAsIDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kcml2ZXIgcGwwNjFfZ3Bpb19kcml2ZXIgPSB7CisJLmRydiA9IHsKKwkJLm5hbWUJPSAicGwwNjFfZ3BpbyIsCisJfSwKKwkuaWRfdGFibGUJPSBwbDA2MV9pZHMsCisJLnByb2JlCQk9IHBsMDYxX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGwwNjFfZ3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIGFtYmFfZHJpdmVyX3JlZ2lzdGVyKCZwbDA2MV9ncGlvX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwocGwwNjFfZ3Bpb19pbml0KTsKKworTU9EVUxFX0FVVEhPUigiQmFydWNoIFNpYWNoIDxiYXJ1Y2hAdGtvcy5jby5pbD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUEwwNjEgR1BJTyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBsYXQtc2Ftc3VuZy5jIGIvZHJpdmVycy9ncGlvL2dwaW8tcGxhdC1zYW1zdW5nLmMKaW5kZXggZWEzN2MwNC4uZWY2N2YxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tcGxhdC1zYW1zdW5nLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcGxhdC1zYW1zdW5nLmMKQEAgLTEsNSArMSw0IEBACi0vKiBhcmNoL2FybS9wbGF0LXNhbXN1bmcvZ3Bpb2xpYi5jCi0gKgorLyoKICAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCiAgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKICAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3JkYzMyMXgtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2dwaW8tcmRjMzIxeC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2dwaW8vcmRjMzIxeC1ncGlvLmMKcmVuYW1lIHRvIGRyaXZlcnMvZ3Bpby9ncGlvLXJkYzMyMXguYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tczVwYzEwMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tczVwYzEwMC5jCmluZGV4IDI4NDIzOTQuLjdmODdiMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXM1cGMxMDAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zNXBjMTAwLmMKQEAgLTEsNCArMSw1IEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLXM1cGMxMDAvZ3Bpb2xpYi5jCisvKgorICogUzVQQzEwMCAtIEdQSU9saWIgc3VwcG9ydAogICoKICAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgogICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KQEAgLTYsOCArNyw2IEBACiAgKiAgQ29weXJpZ2h0IDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDbwogICogIEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+CiAgKgotICogUzVQQzEwMCAtIEdQSU9saWIgc3VwcG9ydAotICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1zNXB2MjEwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zNXB2MjEwLmMKaW5kZXggMWJhMjBhNy4uZWIxMmYxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tczVwdjIxMC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXM1cHYyMTAuYwpAQCAtMSwxMCArMSw5IEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLXM1cHYyMTAvZ3Bpb2xpYi5jCisvKgorICogUzVQVjIxMCAtIEdQSU9saWIgc3VwcG9ydAogICoKICAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgogICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCiAgKgotICogUzVQVjIxMCAtIEdQSU9saWIgc3VwcG9ydAotICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1zY2guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzUxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zY2guYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIEdQSU8gaW50ZXJmYWNlIGZvciBJbnRlbCBQb3Vsc2JvIFNDSAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgQ29tcHVMYWIgTHRkCisgKiAgQXV0aG9yOiBEZW5pcyBUdXJpc2NoZXYgPGRlbmlzQGNvbXB1bGFiLmNvLmlsPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgMiBhcyBwdWJsaXNoZWQKKyAqICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdwaW9fbG9jayk7CisKKyNkZWZpbmUgQ0dFTgkoMHgwMCkKKyNkZWZpbmUgQ0dJTwkoMHgwNCkKKyNkZWZpbmUgQ0dMVgkoMHgwOCkKKworI2RlZmluZSBSR0VOCSgweDIwKQorI2RlZmluZSBSR0lPCSgweDI0KQorI2RlZmluZSBSR0xWCSgweDI4KQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZ3Bpb19iYTsKKworc3RhdGljIGludCBzY2hfZ3Bpb19jb3JlX2RpcmVjdGlvbl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgIGdwaW9fbnVtKQoreworCXU4IGN1cnJfZGlyczsKKwl1bnNpZ25lZCBzaG9ydCBvZmZzZXQsIGJpdDsKKworCXNwaW5fbG9jaygmZ3Bpb19sb2NrKTsKKworCW9mZnNldCA9IENHSU8gKyBncGlvX251bSAvIDg7CisJYml0ID0gZ3Bpb19udW0gJSA4OworCisJY3Vycl9kaXJzID0gaW5iKGdwaW9fYmEgKyBvZmZzZXQpOworCisJaWYgKCEoY3Vycl9kaXJzICYgKDEgPDwgYml0KSkpCisJCW91dGIoY3Vycl9kaXJzIHwgKDEgPDwgYml0KSwgZ3Bpb19iYSArIG9mZnNldCk7CisKKwlzcGluX3VubG9jaygmZ3Bpb19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2hfZ3Bpb19jb3JlX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgZ3Bpb19udW0pCit7CisJaW50IHJlczsKKwl1bnNpZ25lZCBzaG9ydCBvZmZzZXQsIGJpdDsKKworCW9mZnNldCA9IENHTFYgKyBncGlvX251bSAvIDg7CisJYml0ID0gZ3Bpb19udW0gJSA4OworCisJcmVzID0gISEoaW5iKGdwaW9fYmEgKyBvZmZzZXQpICYgKDEgPDwgYml0KSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgc2NoX2dwaW9fY29yZV9zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGdwaW9fbnVtLCBpbnQgdmFsKQoreworCXU4IGN1cnJfdmFsczsKKwl1bnNpZ25lZCBzaG9ydCBvZmZzZXQsIGJpdDsKKworCXNwaW5fbG9jaygmZ3Bpb19sb2NrKTsKKworCW9mZnNldCA9IENHTFYgKyBncGlvX251bSAvIDg7CisJYml0ID0gZ3Bpb19udW0gJSA4OworCisJY3Vycl92YWxzID0gaW5iKGdwaW9fYmEgKyBvZmZzZXQpOworCisJaWYgKHZhbCkKKwkJb3V0YihjdXJyX3ZhbHMgfCAoMSA8PCBiaXQpLCBncGlvX2JhICsgb2Zmc2V0KTsKKwllbHNlCisJCW91dGIoKGN1cnJfdmFscyAmIH4oMSA8PCBiaXQpKSwgZ3Bpb19iYSArIG9mZnNldCk7CisJc3Bpbl91bmxvY2soJmdwaW9fbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgc2NoX2dwaW9fY29yZV9kaXJlY3Rpb25fb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLAorCQkJCQl1bnNpZ25lZCBncGlvX251bSwgaW50IHZhbCkKK3sKKwl1OCBjdXJyX2RpcnM7CisJdW5zaWduZWQgc2hvcnQgb2Zmc2V0LCBiaXQ7CisKKwlzY2hfZ3Bpb19jb3JlX3NldChnYywgZ3Bpb19udW0sIHZhbCk7CisKKwlzcGluX2xvY2soJmdwaW9fbG9jayk7CisKKwlvZmZzZXQgPSBDR0lPICsgZ3Bpb19udW0gLyA4OworCWJpdCA9IGdwaW9fbnVtICUgODsKKworCWN1cnJfZGlycyA9IGluYihncGlvX2JhICsgb2Zmc2V0KTsKKwlpZiAoY3Vycl9kaXJzICYgKDEgPDwgYml0KSkKKwkJb3V0YihjdXJyX2RpcnMgJiB+KDEgPDwgYml0KSwgZ3Bpb19iYSArIG9mZnNldCk7CisKKwlzcGluX3VubG9jaygmZ3Bpb19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgc2NoX2dwaW9fY29yZSA9IHsKKwkubGFiZWwJCQk9ICJzY2hfZ3Bpb19jb3JlIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5kaXJlY3Rpb25faW5wdXQJPSBzY2hfZ3Bpb19jb3JlX2RpcmVjdGlvbl9pbiwKKwkuZ2V0CQkJPSBzY2hfZ3Bpb19jb3JlX2dldCwKKwkuZGlyZWN0aW9uX291dHB1dAk9IHNjaF9ncGlvX2NvcmVfZGlyZWN0aW9uX291dCwKKwkuc2V0CQkJPSBzY2hfZ3Bpb19jb3JlX3NldCwKK307CisKK3N0YXRpYyBpbnQgc2NoX2dwaW9fcmVzdW1lX2RpcmVjdGlvbl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKKwkJCQkJdW5zaWduZWQgZ3Bpb19udW0pCit7CisJdTggY3Vycl9kaXJzOworCisJc3Bpbl9sb2NrKCZncGlvX2xvY2spOworCisJY3Vycl9kaXJzID0gaW5iKGdwaW9fYmEgKyBSR0lPKTsKKworCWlmICghKGN1cnJfZGlycyAmICgxIDw8IGdwaW9fbnVtKSkpCisJCW91dGIoY3Vycl9kaXJzIHwgKDEgPDwgZ3Bpb19udW0pICwgZ3Bpb19iYSArIFJHSU8pOworCisJc3Bpbl91bmxvY2soJmdwaW9fbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NoX2dwaW9fcmVzdW1lX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgZ3Bpb19udW0pCit7CisJcmV0dXJuICEhKGluYihncGlvX2JhICsgUkdMVikgJiAoMSA8PCBncGlvX251bSkpOworfQorCitzdGF0aWMgdm9pZCBzY2hfZ3Bpb19yZXN1bWVfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLAorCQkJCXVuc2lnbmVkIGdwaW9fbnVtLCBpbnQgdmFsKQoreworCXU4IGN1cnJfdmFsczsKKworCXNwaW5fbG9jaygmZ3Bpb19sb2NrKTsKKworCWN1cnJfdmFscyA9IGluYihncGlvX2JhICsgUkdMVik7CisKKwlpZiAodmFsKQorCQlvdXRiKGN1cnJfdmFscyB8ICgxIDw8IGdwaW9fbnVtKSwgZ3Bpb19iYSArIFJHTFYpOworCWVsc2UKKwkJb3V0YigoY3Vycl92YWxzICYgfigxIDw8IGdwaW9fbnVtKSksIGdwaW9fYmEgKyBSR0xWKTsKKworCXNwaW5fdW5sb2NrKCZncGlvX2xvY2spOworfQorCitzdGF0aWMgaW50IHNjaF9ncGlvX3Jlc3VtZV9kaXJlY3Rpb25fb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLAorCQkJCQl1bnNpZ25lZCBncGlvX251bSwgaW50IHZhbCkKK3sKKwl1OCBjdXJyX2RpcnM7CisKKwlzY2hfZ3Bpb19yZXN1bWVfc2V0KGdjLCBncGlvX251bSwgdmFsKTsKKworCXNwaW5fbG9jaygmZ3Bpb19sb2NrKTsKKworCWN1cnJfZGlycyA9IGluYihncGlvX2JhICsgUkdJTyk7CisJaWYgKGN1cnJfZGlycyAmICgxIDw8IGdwaW9fbnVtKSkKKwkJb3V0YihjdXJyX2RpcnMgJiB+KDEgPDwgZ3Bpb19udW0pLCBncGlvX2JhICsgUkdJTyk7CisKKwlzcGluX3VubG9jaygmZ3Bpb19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgc2NoX2dwaW9fcmVzdW1lID0geworCS5sYWJlbAkJCT0gInNjaF9ncGlvX3Jlc3VtZSIsCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuZGlyZWN0aW9uX2lucHV0CT0gc2NoX2dwaW9fcmVzdW1lX2RpcmVjdGlvbl9pbiwKKwkuZ2V0CQkJPSBzY2hfZ3Bpb19yZXN1bWVfZ2V0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gc2NoX2dwaW9fcmVzdW1lX2RpcmVjdGlvbl9vdXQsCisJLnNldAkJCT0gc2NoX2dwaW9fcmVzdW1lX3NldCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNjaF9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGVyciwgaWQ7CisKKwlpZCA9IHBkZXYtPmlkOworCWlmICghaWQpCisJCXJldHVybiAtRU5PREVWOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJZ3Bpb19iYSA9IHJlcy0+c3RhcnQ7CisKKwlzd2l0Y2ggKGlkKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9TQ0hfTFBDOgorCQkJc2NoX2dwaW9fY29yZS5iYXNlID0gMDsKKwkJCXNjaF9ncGlvX2NvcmUubmdwaW8gPSAxMDsKKworCQkJc2NoX2dwaW9fcmVzdW1lLmJhc2UgPSAxMDsKKwkJCXNjaF9ncGlvX3Jlc3VtZS5uZ3BpbyA9IDQ7CisKKwkJCS8qCisJCQkgKiBHUElPWzY6MF0gZW5hYmxlZCBieSBkZWZhdWx0CisJCQkgKiBHUElPNyBpcyBjb25maWd1cmVkIGJ5IHRoZSBDTUMgYXMgU0xQSU9WUgorCQkJICogRW5hYmxlIEdQSU9bOTo4XSBjb3JlIHBvd2VyZWQgZ3Bpb3MgZXhwbGljaXRseQorCQkJICovCisJCQlvdXRiKDB4MywgZ3Bpb19iYSArIENHRU4gKyAxKTsKKwkJCS8qCisJCQkgKiBTVVNfR1BJT1syOjBdIGVuYWJsZWQgYnkgZGVmYXVsdAorCQkJICogRW5hYmxlIFNVU19HUElPMyByZXN1bWUgcG93ZXJlZCBncGlvIGV4cGxpY2l0bHkKKwkJCSAqLworCQkJb3V0YigweDgsIGdwaW9fYmEgKyBSR0VOKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JVENfTFBDOgorCQkJc2NoX2dwaW9fY29yZS5iYXNlID0gMDsKKwkJCXNjaF9ncGlvX2NvcmUubmdwaW8gPSA1OworCisJCQlzY2hfZ3Bpb19yZXN1bWUuYmFzZSA9IDU7CisJCQlzY2hfZ3Bpb19yZXN1bWUubmdwaW8gPSA5OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCXNjaF9ncGlvX2NvcmUuZGV2ID0gJnBkZXYtPmRldjsKKwlzY2hfZ3Bpb19yZXN1bWUuZGV2ID0gJnBkZXYtPmRldjsKKworCWVyciA9IGdwaW9jaGlwX2FkZCgmc2NoX2dwaW9fY29yZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX3NjaF9ncGlvX2NvcmU7CisKKwllcnIgPSBncGlvY2hpcF9hZGQoJnNjaF9ncGlvX3Jlc3VtZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX3NjaF9ncGlvX3Jlc3VtZTsKKworCXJldHVybiAwOworCitlcnJfc2NoX2dwaW9fcmVzdW1lOgorCWVyciA9IGdwaW9jaGlwX3JlbW92ZSgmc2NoX2dwaW9fY29yZSk7CisJaWYgKGVycikKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgZmFpbGVkLCAlZFxuIiwKKwkJCQkiZ3Bpb2NoaXBfcmVtb3ZlKCkiLCBlcnIpOworCitlcnJfc2NoX2dwaW9fY29yZToKKwlyZWxlYXNlX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWdwaW9fYmEgPSAwOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc2NoX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaWYgKGdwaW9fYmEpIHsKKwkJaW50IGVycjsKKworCQllcnIgID0gZ3Bpb2NoaXBfcmVtb3ZlKCZzY2hfZ3Bpb19jb3JlKTsKKwkJaWYgKGVycikKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIGZhaWxlZCwgJWRcbiIsCisJCQkJImdwaW9jaGlwX3JlbW92ZSgpIiwgZXJyKTsKKwkJZXJyID0gZ3Bpb2NoaXBfcmVtb3ZlKCZzY2hfZ3Bpb19yZXN1bWUpOworCQlpZiAoZXJyKQorCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgZmFpbGVkLCAlZFxuIiwKKwkJCQkiZ3Bpb2NoaXBfcmVtb3ZlKCkiLCBlcnIpOworCisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKworCQlyZWxlYXNlX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCQlncGlvX2JhID0gMDsKKworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzY2hfZ3Bpb19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2NoX2dwaW8iLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzY2hfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNjaF9ncGlvX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzY2hfZ3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2NoX2dwaW9fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNjaF9ncGlvX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2NoX2dwaW9fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2NoX2dwaW9faW5pdCk7Cittb2R1bGVfZXhpdChzY2hfZ3Bpb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGVuaXMgVHVyaXNjaGV2IDxkZW5pc0Bjb21wdWxhYi5jby5pbD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR1BJTyBpbnRlcmZhY2UgZm9yIEludGVsIFBvdWxzYm8gU0NIIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNjaF9ncGlvIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vc3RtcGUtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2dwaW8tc3RtcGUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9ncGlvL3N0bXBlLWdwaW8uYwpyZW5hbWUgdG8gZHJpdmVycy9ncGlvL2dwaW8tc3RtcGUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3N4MTUweC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tc3gxNTB4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvZ3Bpby9zeDE1MHguYwpyZW5hbWUgdG8gZHJpdmVycy9ncGlvL2dwaW8tc3gxNTB4LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby90YzM1ODl4LWdwaW8uYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRjMzU4OXguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9ncGlvL3RjMzU4OXgtZ3Bpby5jCnJlbmFtZSB0byBkcml2ZXJzL2dwaW8vZ3Bpby10YzM1ODl4LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRlZ3JhLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10ZWdyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0N2ViNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby10ZWdyYS5jCkBAIC0wLDAgKzEsNDQxIEBACisvKgorICogYXJjaC9hcm0vbWFjaC10ZWdyYS9ncGlvLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgR29vZ2xlLCBJbmMKKyAqCisgKiBBdXRob3I6CisgKglFcmlrIEdpbGxpbmcgPGtvbmtlcnNAZ29vZ2xlLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8bWFjaC9pb21hcC5oPgorI2luY2x1ZGUgPG1hY2gvc3VzcGVuZC5oPgorCisjZGVmaW5lIEdQSU9fQkFOSyh4KQkJKCh4KSA+PiA1KQorI2RlZmluZSBHUElPX1BPUlQoeCkJCSgoKHgpID4+IDMpICYgMHgzKQorI2RlZmluZSBHUElPX0JJVCh4KQkJKCh4KSAmIDB4NykKKworI2RlZmluZSBHUElPX1JFRyh4KQkJKElPX1RPX1ZJUlQoVEVHUkFfR1BJT19CQVNFKSArCVwKKwkJCQkgR1BJT19CQU5LKHgpICogMHg4MCArCQlcCisJCQkJIEdQSU9fUE9SVCh4KSAqIDQpCisKKyNkZWZpbmUgR1BJT19DTkYoeCkJCShHUElPX1JFRyh4KSArIDB4MDApCisjZGVmaW5lIEdQSU9fT0UoeCkJCShHUElPX1JFRyh4KSArIDB4MTApCisjZGVmaW5lIEdQSU9fT1VUKHgpCQkoR1BJT19SRUcoeCkgKyAwWDIwKQorI2RlZmluZSBHUElPX0lOKHgpCQkoR1BJT19SRUcoeCkgKyAweDMwKQorI2RlZmluZSBHUElPX0lOVF9TVEEoeCkJCShHUElPX1JFRyh4KSArIDB4NDApCisjZGVmaW5lIEdQSU9fSU5UX0VOQih4KQkJKEdQSU9fUkVHKHgpICsgMHg1MCkKKyNkZWZpbmUgR1BJT19JTlRfTFZMKHgpCQkoR1BJT19SRUcoeCkgKyAweDYwKQorI2RlZmluZSBHUElPX0lOVF9DTFIoeCkJCShHUElPX1JFRyh4KSArIDB4NzApCisKKyNkZWZpbmUgR1BJT19NU0tfQ05GKHgpCQkoR1BJT19SRUcoeCkgKyAweDgwMCkKKyNkZWZpbmUgR1BJT19NU0tfT0UoeCkJCShHUElPX1JFRyh4KSArIDB4ODEwKQorI2RlZmluZSBHUElPX01TS19PVVQoeCkJCShHUElPX1JFRyh4KSArIDBYODIwKQorI2RlZmluZSBHUElPX01TS19JTlRfU1RBKHgpCShHUElPX1JFRyh4KSArIDB4ODQwKQorI2RlZmluZSBHUElPX01TS19JTlRfRU5CKHgpCShHUElPX1JFRyh4KSArIDB4ODUwKQorI2RlZmluZSBHUElPX01TS19JTlRfTFZMKHgpCShHUElPX1JFRyh4KSArIDB4ODYwKQorCisjZGVmaW5lIEdQSU9fSU5UX0xWTF9NQVNLCQkweDAxMDEwMQorI2RlZmluZSBHUElPX0lOVF9MVkxfRURHRV9SSVNJTkcJMHgwMDAxMDEKKyNkZWZpbmUgR1BJT19JTlRfTFZMX0VER0VfRkFMTElORwkweDAwMDEwMAorI2RlZmluZSBHUElPX0lOVF9MVkxfRURHRV9CT1RICQkweDAxMDEwMAorI2RlZmluZSBHUElPX0lOVF9MVkxfTEVWRUxfSElHSAkJMHgwMDAwMDEKKyNkZWZpbmUgR1BJT19JTlRfTFZMX0xFVkVMX0xPVwkJMHgwMDAwMDAKKworc3RydWN0IHRlZ3JhX2dwaW9fYmFuayB7CisJaW50IGJhbms7CisJaW50IGlycTsKKwlzcGlubG9ja190IGx2bF9sb2NrWzRdOworI2lmZGVmIENPTkZJR19QTQorCXUzMiBjbmZbNF07CisJdTMyIG91dFs0XTsKKwl1MzIgb2VbNF07CisJdTMyIGludF9lbmJbNF07CisJdTMyIGludF9sdmxbNF07CisjZW5kaWYKK307CisKKworc3RhdGljIHN0cnVjdCB0ZWdyYV9ncGlvX2JhbmsgdGVncmFfZ3Bpb19iYW5rc1tdID0geworCXsuYmFuayA9IDAsIC5pcnEgPSBJTlRfR1BJTzF9LAorCXsuYmFuayA9IDEsIC5pcnEgPSBJTlRfR1BJTzJ9LAorCXsuYmFuayA9IDIsIC5pcnEgPSBJTlRfR1BJTzN9LAorCXsuYmFuayA9IDMsIC5pcnEgPSBJTlRfR1BJTzR9LAorCXsuYmFuayA9IDQsIC5pcnEgPSBJTlRfR1BJTzV9LAorCXsuYmFuayA9IDUsIC5pcnEgPSBJTlRfR1BJTzZ9LAorCXsuYmFuayA9IDYsIC5pcnEgPSBJTlRfR1BJTzd9LAorfTsKKworc3RhdGljIGludCB0ZWdyYV9ncGlvX2NvbXBvc2UoaW50IGJhbmssIGludCBwb3J0LCBpbnQgYml0KQoreworCXJldHVybiAoYmFuayA8PCA1KSB8ICgocG9ydCAmIDB4MykgPDwgMykgfCAoYml0ICYgMHg3KTsKK30KKworc3RhdGljIHZvaWQgdGVncmFfZ3Bpb19tYXNrX3dyaXRlKHUzMiByZWcsIGludCBncGlvLCBpbnQgdmFsdWUpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IDB4MTAwIDw8IEdQSU9fQklUKGdwaW8pOworCWlmICh2YWx1ZSkKKwkJdmFsIHw9IDEgPDwgR1BJT19CSVQoZ3Bpbyk7CisJX19yYXdfd3JpdGVsKHZhbCwgcmVnKTsKK30KKwordm9pZCB0ZWdyYV9ncGlvX2VuYWJsZShpbnQgZ3BpbykKK3sKKwl0ZWdyYV9ncGlvX21hc2tfd3JpdGUoR1BJT19NU0tfQ05GKGdwaW8pLCBncGlvLCAxKTsKK30KKwordm9pZCB0ZWdyYV9ncGlvX2Rpc2FibGUoaW50IGdwaW8pCit7CisJdGVncmFfZ3Bpb19tYXNrX3dyaXRlKEdQSU9fTVNLX0NORihncGlvKSwgZ3BpbywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXRlZ3JhX2dwaW9fbWFza193cml0ZShHUElPX01TS19PVVQob2Zmc2V0KSwgb2Zmc2V0LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiAoX19yYXdfcmVhZGwoR1BJT19JTihvZmZzZXQpKSA+PiBHUElPX0JJVChvZmZzZXQpKSAmIDB4MTsKK30KKworc3RhdGljIGludCB0ZWdyYV9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJdGVncmFfZ3Bpb19tYXNrX3dyaXRlKEdQSU9fTVNLX09FKG9mZnNldCksIG9mZnNldCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKKwkJCQkJaW50IHZhbHVlKQoreworCXRlZ3JhX2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOworCXRlZ3JhX2dwaW9fbWFza193cml0ZShHUElPX01TS19PRShvZmZzZXQpLCBvZmZzZXQsIDEpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVncmFfZ3Bpb19jaGlwID0geworCS5sYWJlbAkJCT0gInRlZ3JhLWdwaW8iLAorCS5kaXJlY3Rpb25faW5wdXQJPSB0ZWdyYV9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKKwkuZ2V0CQkJPSB0ZWdyYV9ncGlvX2dldCwKKwkuZGlyZWN0aW9uX291dHB1dAk9IHRlZ3JhX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkuc2V0CQkJPSB0ZWdyYV9ncGlvX3NldCwKKwkuYmFzZQkJCT0gMCwKKwkubmdwaW8JCQk9IFRFR1JBX05SX0dQSU9TLAorfTsKKworc3RhdGljIHZvaWQgdGVncmFfZ3Bpb19pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlpbnQgZ3BpbyA9IGQtPmlycSAtIElOVF9HUElPX0JBU0U7CisKKwlfX3Jhd193cml0ZWwoMSA8PCBHUElPX0JJVChncGlvKSwgR1BJT19JTlRfQ0xSKGdwaW8pKTsKK30KKworc3RhdGljIHZvaWQgdGVncmFfZ3Bpb19pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJaW50IGdwaW8gPSBkLT5pcnEgLSBJTlRfR1BJT19CQVNFOworCisJdGVncmFfZ3Bpb19tYXNrX3dyaXRlKEdQSU9fTVNLX0lOVF9FTkIoZ3BpbyksIGdwaW8sIDApOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV9ncGlvX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCWludCBncGlvID0gZC0+aXJxIC0gSU5UX0dQSU9fQkFTRTsKKworCXRlZ3JhX2dwaW9fbWFza193cml0ZShHUElPX01TS19JTlRfRU5CKGdwaW8pLCBncGlvLCAxKTsKK30KKworc3RhdGljIGludCB0ZWdyYV9ncGlvX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQoreworCWludCBncGlvID0gZC0+aXJxIC0gSU5UX0dQSU9fQkFTRTsKKwlzdHJ1Y3QgdGVncmFfZ3Bpb19iYW5rICpiYW5rID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJaW50IHBvcnQgPSBHUElPX1BPUlQoZ3Bpbyk7CisJaW50IGx2bF90eXBlOworCWludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAodHlwZSAmIElSUV9UWVBFX1NFTlNFX01BU0spIHsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQlsdmxfdHlwZSA9IEdQSU9fSU5UX0xWTF9FREdFX1JJU0lORzsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwkJbHZsX3R5cGUgPSBHUElPX0lOVF9MVkxfRURHRV9GQUxMSU5HOworCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgorCQlsdmxfdHlwZSA9IEdQSU9fSU5UX0xWTF9FREdFX0JPVEg7CisJCWJyZWFrOworCisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQlsdmxfdHlwZSA9IEdQSU9fSU5UX0xWTF9MRVZFTF9ISUdIOworCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgorCQlsdmxfdHlwZSA9IEdQSU9fSU5UX0xWTF9MRVZFTF9MT1c7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmx2bF9sb2NrW3BvcnRdLCBmbGFncyk7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChHUElPX0lOVF9MVkwoZ3BpbykpOworCXZhbCAmPSB+KEdQSU9fSU5UX0xWTF9NQVNLIDw8IEdQSU9fQklUKGdwaW8pKTsKKwl2YWwgfD0gbHZsX3R5cGUgPDwgR1BJT19CSVQoZ3Bpbyk7CisJX19yYXdfd3JpdGVsKHZhbCwgR1BJT19JTlRfTFZMKGdwaW8pKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmx2bF9sb2NrW3BvcnRdLCBmbGFncyk7CisKKwlpZiAodHlwZSAmIChJUlFfVFlQRV9MRVZFTF9MT1cgfCBJUlFfVFlQRV9MRVZFTF9ISUdIKSkKKwkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX2xldmVsX2lycSk7CisJZWxzZSBpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX0ZBTExJTkcgfCBJUlFfVFlQRV9FREdFX1JJU0lORykpCisJCV9faXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLT5pcnEsIGhhbmRsZV9lZGdlX2lycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGVncmFfZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHRlZ3JhX2dwaW9fYmFuayAqYmFuazsKKwlpbnQgcG9ydDsKKwlpbnQgcGluOworCWludCB1bm1hc2tlZCA9IDA7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7CisKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKworCWJhbmsgPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOworCisJZm9yIChwb3J0ID0gMDsgcG9ydCA8IDQ7IHBvcnQrKykgeworCQlpbnQgZ3BpbyA9IHRlZ3JhX2dwaW9fY29tcG9zZShiYW5rLT5iYW5rLCBwb3J0LCAwKTsKKwkJdW5zaWduZWQgbG9uZyBzdGEgPSBfX3Jhd19yZWFkbChHUElPX0lOVF9TVEEoZ3BpbykpICYKKwkJCV9fcmF3X3JlYWRsKEdQSU9fSU5UX0VOQihncGlvKSk7CisJCXUzMiBsdmwgPSBfX3Jhd19yZWFkbChHUElPX0lOVF9MVkwoZ3BpbykpOworCisJCWZvcl9lYWNoX3NldF9iaXQocGluLCAmc3RhLCA4KSB7CisJCQlfX3Jhd193cml0ZWwoMSA8PCBwaW4sIEdQSU9fSU5UX0NMUihncGlvKSk7CisKKwkJCS8qIGlmIGdwaW8gaXMgZWRnZSB0cmlnZ2VyZWQsIGNsZWFyIGNvbmRpdGlvbgorCQkJICogYmVmb3JlIGV4ZWN1dGluZyB0aGUgaGFuZGVyIHNvIHRoYXQgd2UgZG9uJ3QKKwkJCSAqIG1pc3MgZWRnZXMKKwkJCSAqLworCQkJaWYgKGx2bCAmICgweDEwMCA8PCBwaW4pKSB7CisJCQkJdW5tYXNrZWQgPSAxOworCQkJCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7CisJCQl9CisKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShncGlvX3RvX2lycShncGlvICsgcGluKSk7CisJCX0KKwl9CisKKwlpZiAoIXVubWFza2VkKQorCQljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOworCit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3ZvaWQgdGVncmFfZ3Bpb19yZXN1bWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBiOworCWludCBwOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZm9yIChiID0gMDsgYiA8IEFSUkFZX1NJWkUodGVncmFfZ3Bpb19iYW5rcyk7IGIrKykgeworCQlzdHJ1Y3QgdGVncmFfZ3Bpb19iYW5rICpiYW5rID0gJnRlZ3JhX2dwaW9fYmFua3NbYl07CisKKwkJZm9yIChwID0gMDsgcCA8IEFSUkFZX1NJWkUoYmFuay0+b2UpOyBwKyspIHsKKwkJCXVuc2lnbmVkIGludCBncGlvID0gKGI8PDUpIHwgKHA8PDMpOworCQkJX19yYXdfd3JpdGVsKGJhbmstPmNuZltwXSwgR1BJT19DTkYoZ3BpbykpOworCQkJX19yYXdfd3JpdGVsKGJhbmstPm91dFtwXSwgR1BJT19PVVQoZ3BpbykpOworCQkJX19yYXdfd3JpdGVsKGJhbmstPm9lW3BdLCBHUElPX09FKGdwaW8pKTsKKwkJCV9fcmF3X3dyaXRlbChiYW5rLT5pbnRfbHZsW3BdLCBHUElPX0lOVF9MVkwoZ3BpbykpOworCQkJX19yYXdfd3JpdGVsKGJhbmstPmludF9lbmJbcF0sIEdQSU9fSU5UX0VOQihncGlvKSk7CisJCX0KKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3ZvaWQgdGVncmFfZ3Bpb19zdXNwZW5kKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYjsKKwlpbnQgcDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlmb3IgKGIgPSAwOyBiIDwgQVJSQVlfU0laRSh0ZWdyYV9ncGlvX2JhbmtzKTsgYisrKSB7CisJCXN0cnVjdCB0ZWdyYV9ncGlvX2JhbmsgKmJhbmsgPSAmdGVncmFfZ3Bpb19iYW5rc1tiXTsKKworCQlmb3IgKHAgPSAwOyBwIDwgQVJSQVlfU0laRShiYW5rLT5vZSk7IHArKykgeworCQkJdW5zaWduZWQgaW50IGdwaW8gPSAoYjw8NSkgfCAocDw8Myk7CisJCQliYW5rLT5jbmZbcF0gPSBfX3Jhd19yZWFkbChHUElPX0NORihncGlvKSk7CisJCQliYW5rLT5vdXRbcF0gPSBfX3Jhd19yZWFkbChHUElPX09VVChncGlvKSk7CisJCQliYW5rLT5vZVtwXSA9IF9fcmF3X3JlYWRsKEdQSU9fT0UoZ3BpbykpOworCQkJYmFuay0+aW50X2VuYltwXSA9IF9fcmF3X3JlYWRsKEdQSU9fSU5UX0VOQihncGlvKSk7CisJCQliYW5rLT5pbnRfbHZsW3BdID0gX19yYXdfcmVhZGwoR1BJT19JTlRfTFZMKGdwaW8pKTsKKwkJfQorCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfZ3Bpb193YWtlX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBlbmFibGUpCit7CisJc3RydWN0IHRlZ3JhX2dwaW9fYmFuayAqYmFuayA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXJldHVybiBpcnFfc2V0X2lycV93YWtlKGJhbmstPmlycSwgZW5hYmxlKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHRlZ3JhX2dwaW9faXJxX2NoaXAgPSB7CisJLm5hbWUJCT0gIkdQSU8iLAorCS5pcnFfYWNrCT0gdGVncmFfZ3Bpb19pcnFfYWNrLAorCS5pcnFfbWFzawk9IHRlZ3JhX2dwaW9faXJxX21hc2ssCisJLmlycV91bm1hc2sJPSB0ZWdyYV9ncGlvX2lycV91bm1hc2ssCisJLmlycV9zZXRfdHlwZQk9IHRlZ3JhX2dwaW9faXJxX3NldF90eXBlLAorI2lmZGVmIENPTkZJR19QTQorCS5pcnFfc2V0X3dha2UJPSB0ZWdyYV9ncGlvX3dha2VfZW5hYmxlLAorI2VuZGlmCit9OworCisKKy8qIFRoaXMgbG9jayBjbGFzcyB0ZWxscyBsb2NrZGVwIHRoYXQgR1BJTyBpcnFzIGFyZSBpbiBhIGRpZmZlcmVudAorICogY2F0ZWdvcnkgdGhhbiB0aGVpciBwYXJlbnRzLCBzbyBpdCB3b24ndCByZXBvcnQgZmFsc2UgcmVjdXJzaW9uLgorICovCitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGdwaW9fbG9ja19jbGFzczsKKworc3RhdGljIGludCBfX2luaXQgdGVncmFfZ3Bpb19pbml0KHZvaWQpCit7CisJc3RydWN0IHRlZ3JhX2dwaW9fYmFuayAqYmFuazsKKwlpbnQgaTsKKwlpbnQgajsKKworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQkJaW50IGdwaW8gPSB0ZWdyYV9ncGlvX2NvbXBvc2UoaSwgaiwgMCk7CisJCQlfX3Jhd193cml0ZWwoMHgwMCwgR1BJT19JTlRfRU5CKGdwaW8pKTsKKwkJfQorCX0KKworI2lmZGVmIENPTkZJR19PRl9HUElPCisJLyoKKwkgKiBUaGlzIGlzbid0IGlkZWFsLCBidXQgaXQgZ2V0cyB0aGluZ3MgaG9va2VkIHVwIHVudGlsIHRoaXMKKwkgKiBkcml2ZXIgaXMgY29udmVydGVkIGludG8gYSBwbGF0Zm9ybV9kZXZpY2UKKwkgKi8KKwl0ZWdyYV9ncGlvX2NoaXAub2Zfbm9kZSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsCisJCQkJCQkibnZpZGlhLHRlZ3JhMjAtZ3BpbyIpOworI2VuZGlmIC8qIENPTkZJR19PRl9HUElPICovCisKKwlncGlvY2hpcF9hZGQoJnRlZ3JhX2dwaW9fY2hpcCk7CisKKwlmb3IgKGkgPSBJTlRfR1BJT19CQVNFOyBpIDwgKElOVF9HUElPX0JBU0UgKyBURUdSQV9OUl9HUElPUyk7IGkrKykgeworCQliYW5rID0gJnRlZ3JhX2dwaW9fYmFua3NbR1BJT19CQU5LKGlycV90b19ncGlvKGkpKV07CisKKwkJaXJxX3NldF9sb2NrZGVwX2NsYXNzKGksICZncGlvX2xvY2tfY2xhc3MpOworCQlpcnFfc2V0X2NoaXBfZGF0YShpLCBiYW5rKTsKKwkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZ0ZWdyYV9ncGlvX2lycV9jaGlwLAorCQkJCQkgaGFuZGxlX3NpbXBsZV9pcnEpOworCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlZ3JhX2dwaW9fYmFua3MpOyBpKyspIHsKKwkJYmFuayA9ICZ0ZWdyYV9ncGlvX2JhbmtzW2ldOworCisJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGJhbmstPmlycSwgdGVncmFfZ3Bpb19pcnFfaGFuZGxlcik7CisJCWlycV9zZXRfaGFuZGxlcl9kYXRhKGJhbmstPmlycSwgYmFuayk7CisKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwkJCXNwaW5fbG9ja19pbml0KCZiYW5rLT5sdmxfbG9ja1tqXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKHRlZ3JhX2dwaW9faW5pdCk7CisKK3ZvaWQgX19pbml0IHRlZ3JhX2dwaW9fY29uZmlnKHN0cnVjdCB0ZWdyYV9ncGlvX3RhYmxlICp0YWJsZSwgaW50IG51bSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlpbnQgZ3BpbyA9IHRhYmxlW2ldLmdwaW87CisKKwkJaWYgKHRhYmxlW2ldLmVuYWJsZSkKKwkJCXRlZ3JhX2dwaW9fZW5hYmxlKGdwaW8pOworCQllbHNlCisJCQl0ZWdyYV9ncGlvX2Rpc2FibGUoZ3Bpbyk7CisJfQorfQorCisjaWZkZWYJQ09ORklHX0RFQlVHX0ZTCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworc3RhdGljIGludCBkYmdfZ3Bpb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdW51c2VkKQoreworCWludCBpOworCWludCBqOworCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCQlpbnQgZ3BpbyA9IHRlZ3JhX2dwaW9fY29tcG9zZShpLCBqLCAwKTsKKwkJCXNlcV9wcmludGYocywKKwkJCQkiJWQ6JWQgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTA2eFxuIiwKKwkJCQlpLCBqLAorCQkJCV9fcmF3X3JlYWRsKEdQSU9fQ05GKGdwaW8pKSwKKwkJCQlfX3Jhd19yZWFkbChHUElPX09FKGdwaW8pKSwKKwkJCQlfX3Jhd19yZWFkbChHUElPX09VVChncGlvKSksCisJCQkJX19yYXdfcmVhZGwoR1BJT19JTihncGlvKSksCisJCQkJX19yYXdfcmVhZGwoR1BJT19JTlRfU1RBKGdwaW8pKSwKKwkJCQlfX3Jhd19yZWFkbChHUElPX0lOVF9FTkIoZ3BpbykpLAorCQkJCV9fcmF3X3JlYWRsKEdQSU9fSU5UX0xWTChncGlvKSkpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRiZ19ncGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGRiZ19ncGlvX3Nob3csICZpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfZm9wcyA9IHsKKwkub3BlbgkJPSBkYmdfZ3Bpb19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0ZWdyYV9ncGlvX2RlYnVnaW5pdCh2b2lkKQoreworCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ0ZWdyYV9ncGlvIiwgU19JUlVHTywKKwkJCQkJTlVMTCwgTlVMTCwgJmRlYnVnX2ZvcHMpOworCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbCh0ZWdyYV9ncGlvX2RlYnVnaW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRpbWJlcmRhbGUuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRpbWJlcmRhbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTkzYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdGltYmVyZGFsZS5jCkBAIC0wLDAgKzEsMzc5IEBACisvKgorICogVGltYmVyZGFsZSBGUEdBIEdQSU8gZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBTdXBwb3J0czoKKyAqIFRpbWJlcmRhbGUgRlBHQSBHUElPCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWJfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRSAidGltYi1ncGlvIgorCisjZGVmaW5lIFRHUElPVkFMCTB4MDAKKyNkZWZpbmUgVEdQSU9ESVIJMHgwNAorI2RlZmluZSBUR1BJT19JRVIJMHgwOAorI2RlZmluZSBUR1BJT19JU1IJMHgwYworI2RlZmluZSBUR1BJT19JUFIJMHgxMAorI2RlZmluZSBUR1BJT19JQ1IJMHgxNAorI2RlZmluZSBUR1BJT19GTFIJMHgxOAorI2RlZmluZSBUR1BJT19MVlIJMHgxYworI2RlZmluZSBUR1BJT19WRVIJMHgyMAorI2RlZmluZSBUR1BJT19CRkxSCTB4MjQKKworc3RydWN0IHRpbWJncGlvIHsKKwl2b2lkIF9faW9tZW0JCSptZW1iYXNlOworCXNwaW5sb2NrX3QJCWxvY2s7IC8qIG11dHVhbCBleGNsdXNpb24gKi8KKwlzdHJ1Y3QgZ3Bpb19jaGlwCWdwaW87CisJaW50CQkJaXJxX2Jhc2U7CisJdW5zaWduZWQgbG9uZwkJbGFzdF9pZXI7Cit9OworCitzdGF0aWMgaW50IHRpbWJncGlvX3VwZGF0ZV9iaXQoc3RydWN0IGdwaW9fY2hpcCAqZ3BpbywgdW5zaWduZWQgaW5kZXgsCisJdW5zaWduZWQgb2Zmc2V0LCBib29sIGVuYWJsZWQpCit7CisJc3RydWN0IHRpbWJncGlvICp0Z3BpbyA9IGNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgdGltYmdwaW8sIGdwaW8pOworCXUzMiByZWc7CisKKwlzcGluX2xvY2soJnRncGlvLT5sb2NrKTsKKwlyZWcgPSBpb3JlYWQzMih0Z3Bpby0+bWVtYmFzZSArIG9mZnNldCk7CisKKwlpZiAoZW5hYmxlZCkKKwkJcmVnIHw9ICgxIDw8IGluZGV4KTsKKwllbHNlCisJCXJlZyAmPSB+KDEgPDwgaW5kZXgpOworCisJaW93cml0ZTMyKHJlZywgdGdwaW8tPm1lbWJhc2UgKyBvZmZzZXQpOworCXNwaW5fdW5sb2NrKCZ0Z3Bpby0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW1iZ3Bpb19ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1bnNpZ25lZCBucikKK3sKKwlyZXR1cm4gdGltYmdwaW9fdXBkYXRlX2JpdChncGlvLCBuciwgVEdQSU9ESVIsIHRydWUpOworfQorCitzdGF0aWMgaW50IHRpbWJncGlvX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2lnbmVkIG5yKQoreworCXN0cnVjdCB0aW1iZ3BpbyAqdGdwaW8gPSBjb250YWluZXJfb2YoZ3Bpbywgc3RydWN0IHRpbWJncGlvLCBncGlvKTsKKwl1MzIgdmFsdWU7CisKKwl2YWx1ZSA9IGlvcmVhZDMyKHRncGlvLT5tZW1iYXNlICsgVEdQSU9WQUwpOworCXJldHVybiAodmFsdWUgJiAoMSA8PCBucikpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgdGltYmdwaW9fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sCisJCQkJCQl1bnNpZ25lZCBuciwgaW50IHZhbCkKK3sKKwlyZXR1cm4gdGltYmdwaW9fdXBkYXRlX2JpdChncGlvLCBuciwgVEdQSU9ESVIsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgdGltYmdwaW9fZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ3BpbywKKwkJCQl1bnNpZ25lZCBuciwgaW50IHZhbCkKK3sKKwl0aW1iZ3Bpb191cGRhdGVfYml0KGdwaW8sIG5yLCBUR1BJT1ZBTCwgdmFsICE9IDApOworfQorCitzdGF0aWMgaW50IHRpbWJncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHRpbWJncGlvICp0Z3BpbyA9IGNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgdGltYmdwaW8sIGdwaW8pOworCisJaWYgKHRncGlvLT5pcnFfYmFzZSA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB0Z3Bpby0+aXJxX2Jhc2UgKyBvZmZzZXQ7Cit9CisKKy8qCisgKiBHUElPIElSUQorICovCitzdGF0aWMgdm9pZCB0aW1iZ3Bpb19pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHRpbWJncGlvICp0Z3BpbyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSB0Z3Bpby0+aXJxX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0Z3Bpby0+bG9jaywgZmxhZ3MpOworCXRncGlvLT5sYXN0X2llciAmPSB+KDEgPDwgb2Zmc2V0KTsKKwlpb3dyaXRlMzIodGdwaW8tPmxhc3RfaWVyLCB0Z3Bpby0+bWVtYmFzZSArIFRHUElPX0lFUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGdwaW8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdGltYmdwaW9faXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHRpbWJncGlvICp0Z3BpbyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSB0Z3Bpby0+aXJxX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0Z3Bpby0+bG9jaywgZmxhZ3MpOworCXRncGlvLT5sYXN0X2llciB8PSAxIDw8IG9mZnNldDsKKwlpb3dyaXRlMzIodGdwaW8tPmxhc3RfaWVyLCB0Z3Bpby0+bWVtYmFzZSArIFRHUElPX0lFUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGdwaW8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0aW1iZ3Bpb19pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIHRyaWdnZXIpCit7CisJc3RydWN0IHRpbWJncGlvICp0Z3BpbyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSB0Z3Bpby0+aXJxX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgbHZyLCBmbHIsIGJmbHIgPSAwOworCXUzMiB2ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiB0Z3Bpby0+Z3Bpby5uZ3BpbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2ZXIgPSBpb3JlYWQzMih0Z3Bpby0+bWVtYmFzZSArIFRHUElPX1ZFUik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGdwaW8tPmxvY2ssIGZsYWdzKTsKKworCWx2ciA9IGlvcmVhZDMyKHRncGlvLT5tZW1iYXNlICsgVEdQSU9fTFZSKTsKKwlmbHIgPSBpb3JlYWQzMih0Z3Bpby0+bWVtYmFzZSArIFRHUElPX0ZMUik7CisJaWYgKHZlciA+IDIpCisJCWJmbHIgPSBpb3JlYWQzMih0Z3Bpby0+bWVtYmFzZSArIFRHUElPX0JGTFIpOworCisJaWYgKHRyaWdnZXIgJiAoSVJRX1RZUEVfTEVWRUxfSElHSCB8IElSUV9UWVBFX0xFVkVMX0xPVykpIHsKKwkJYmZsciAmPSB+KDEgPDwgb2Zmc2V0KTsKKwkJZmxyICY9IH4oMSA8PCBvZmZzZXQpOworCQlpZiAodHJpZ2dlciAmIElSUV9UWVBFX0xFVkVMX0hJR0gpCisJCQlsdnIgfD0gMSA8PCBvZmZzZXQ7CisJCWVsc2UKKwkJCWx2ciAmPSB+KDEgPDwgb2Zmc2V0KTsKKwl9CisKKwlpZiAoKHRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX0JPVEgpID09IElSUV9UWVBFX0VER0VfQk9USCkgeworCQlpZiAodmVyIDwgMykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVsc2UgeworCQkJZmxyIHw9IDEgPDwgb2Zmc2V0OworCQkJYmZsciB8PSAxIDw8IG9mZnNldDsKKwkJfQorCX0gZWxzZSB7CisJCWJmbHIgJj0gfigxIDw8IG9mZnNldCk7CisJCWZsciB8PSAxIDw8IG9mZnNldDsKKwkJaWYgKHRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpCisJCQlsdnIgJj0gfigxIDw8IG9mZnNldCk7CisJCWVsc2UKKwkJCWx2ciB8PSAxIDw8IG9mZnNldDsKKwl9CisKKwlpb3dyaXRlMzIobHZyLCB0Z3Bpby0+bWVtYmFzZSArIFRHUElPX0xWUik7CisJaW93cml0ZTMyKGZsciwgdGdwaW8tPm1lbWJhc2UgKyBUR1BJT19GTFIpOworCWlmICh2ZXIgPiAyKQorCQlpb3dyaXRlMzIoYmZsciwgdGdwaW8tPm1lbWJhc2UgKyBUR1BJT19CRkxSKTsKKworCWlvd3JpdGUzMigxIDw8IG9mZnNldCwgdGdwaW8tPm1lbWJhc2UgKyBUR1BJT19JQ1IpOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGdwaW8tPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0aW1iZ3Bpb19pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCB0aW1iZ3BpbyAqdGdwaW8gPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgaXByOworCWludCBvZmZzZXQ7CisKKwlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfYWNrKGlycV9nZXRfaXJxX2RhdGEoaXJxKSk7CisJaXByID0gaW9yZWFkMzIodGdwaW8tPm1lbWJhc2UgKyBUR1BJT19JUFIpOworCWlvd3JpdGUzMihpcHIsIHRncGlvLT5tZW1iYXNlICsgVEdQSU9fSUNSKTsKKworCS8qCisJICogU29tZSB2ZXJzaW9ucyBvZiB0aGUgaGFyZHdhcmUgdHJhc2ggdGhlIElFUiByZWdpc3RlciBpZiBtb3JlIHRoYW4KKwkgKiBvbmUgaW50ZXJydXB0IGlzIHJlY2VpdmVkIHNpbXVsdGFuZW91c2x5LgorCSAqLworCWlvd3JpdGUzMigwLCB0Z3Bpby0+bWVtYmFzZSArIFRHUElPX0lFUik7CisKKwlmb3JfZWFjaF9zZXRfYml0KG9mZnNldCwgJmlwciwgdGdwaW8tPmdwaW8ubmdwaW8pCisJCWdlbmVyaWNfaGFuZGxlX2lycSh0aW1iZ3Bpb190b19pcnEoJnRncGlvLT5ncGlvLCBvZmZzZXQpKTsKKworCWlvd3JpdGUzMih0Z3Bpby0+bGFzdF9pZXIsIHRncGlvLT5tZW1iYXNlICsgVEdQSU9fSUVSKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB0aW1iZ3Bpb19pcnFjaGlwID0geworCS5uYW1lCQk9ICJHUElPIiwKKwkuaXJxX2VuYWJsZQk9IHRpbWJncGlvX2lycV9lbmFibGUsCisJLmlycV9kaXNhYmxlCT0gdGltYmdwaW9faXJxX2Rpc2FibGUsCisJLmlycV9zZXRfdHlwZQk9IHRpbWJncGlvX2lycV90eXBlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdGltYmdwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgZXJyLCBpOworCXN0cnVjdCBncGlvX2NoaXAgKmdjOworCXN0cnVjdCB0aW1iZ3BpbyAqdGdwaW87CisJc3RydWN0IHJlc291cmNlICppb21lbTsKKwlzdHJ1Y3QgdGltYmdwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCWlmICghcGRhdGEgfHwgcGRhdGEtPm5yX3BpbnMgPiAzMikgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9tZW07CisJfQorCisJaW9tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghaW9tZW0pIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJfbWVtOworCX0KKworCXRncGlvID0ga3phbGxvYyhzaXplb2YoKnRncGlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0Z3BpbykgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9tZW07CisJfQorCXRncGlvLT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKKworCXNwaW5fbG9ja19pbml0KCZ0Z3Bpby0+bG9jayk7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpb21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9tZW0pLAorCQlEUklWRVJfTkFNRSkpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGVycl9yZXF1ZXN0OworCX0KKworCXRncGlvLT5tZW1iYXNlID0gaW9yZW1hcChpb21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9tZW0pKTsKKwlpZiAoIXRncGlvLT5tZW1iYXNlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJZ2MgPSAmdGdwaW8tPmdwaW87CisKKwlnYy0+bGFiZWwgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlnYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlnYy0+ZGV2ID0gJnBkZXYtPmRldjsKKwlnYy0+ZGlyZWN0aW9uX2lucHV0ID0gdGltYmdwaW9fZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CisJZ2MtPmdldCA9IHRpbWJncGlvX2dwaW9fZ2V0OworCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gdGltYmdwaW9fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCWdjLT5zZXQgPSB0aW1iZ3Bpb19ncGlvX3NldDsKKwlnYy0+dG9faXJxID0gKGlycSA+PSAwICYmIHRncGlvLT5pcnFfYmFzZSA+IDApID8gdGltYmdwaW9fdG9faXJxIDogTlVMTDsKKwlnYy0+ZGJnX3Nob3cgPSBOVUxMOworCWdjLT5iYXNlID0gcGRhdGEtPmdwaW9fYmFzZTsKKwlnYy0+bmdwaW8gPSBwZGF0YS0+bnJfcGluczsKKwlnYy0+Y2FuX3NsZWVwID0gMDsKKworCWVyciA9IGdwaW9jaGlwX2FkZChnYyk7CisJaWYgKGVycikKKwkJZ290byBlcnJfY2hpcGFkZDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRncGlvKTsKKworCS8qIG1ha2Ugc3VyZSB0byBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoMHgwLCB0Z3Bpby0+bWVtYmFzZSArIFRHUElPX0lFUik7CisKKwlpZiAoaXJxIDwgMCB8fCB0Z3Bpby0+aXJxX2Jhc2UgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5yX3BpbnM7IGkrKykgeworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXJfbmFtZSh0Z3Bpby0+aXJxX2Jhc2UgKyBpLAorCQkJJnRpbWJncGlvX2lycWNoaXAsIGhhbmRsZV9zaW1wbGVfaXJxLCAibXV4Iik7CisJCWlycV9zZXRfY2hpcF9kYXRhKHRncGlvLT5pcnFfYmFzZSArIGksIHRncGlvKTsKKyNpZmRlZiBDT05GSUdfQVJNCisJCXNldF9pcnFfZmxhZ3ModGdwaW8tPmlycV9iYXNlICsgaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworI2VuZGlmCisJfQorCisJaXJxX3NldF9oYW5kbGVyX2RhdGEoaXJxLCB0Z3Bpbyk7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoaXJxLCB0aW1iZ3Bpb19pcnEpOworCisJcmV0dXJuIDA7CisKK2Vycl9jaGlwYWRkOgorCWlvdW5tYXAodGdwaW8tPm1lbWJhc2UpOworZXJyX2lvcmVtYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGlvbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb21lbSkpOworZXJyX3JlcXVlc3Q6CisJa2ZyZWUodGdwaW8pOworZXJyX21lbToKKwlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUiOiBGYWlsZWQgdG8gcmVnaXN0ZXIgR1BJT3M6ICVkXG4iLCBlcnIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdGltYmdwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgdGltYmdwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdGltYmdwaW8gKnRncGlvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJlc291cmNlICppb21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwlpZiAoaXJxID49IDAgJiYgdGdwaW8tPmlycV9iYXNlID4gMCkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5ucl9waW5zOyBpKyspIHsKKwkJCWlycV9zZXRfY2hpcCh0Z3Bpby0+aXJxX2Jhc2UgKyBpLCBOVUxMKTsKKwkJCWlycV9zZXRfY2hpcF9kYXRhKHRncGlvLT5pcnFfYmFzZSArIGksIE5VTEwpOworCQl9CisKKwkJaXJxX3NldF9oYW5kbGVyKGlycSwgTlVMTCk7CisJCWlycV9zZXRfaGFuZGxlcl9kYXRhKGlycSwgTlVMTCk7CisJfQorCisJZXJyID0gZ3Bpb2NoaXBfcmVtb3ZlKCZ0Z3Bpby0+Z3Bpbyk7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FIjogZmFpbGVkIHRvIHJlbW92ZSBncGlvX2NoaXBcbiIpOworCisJaW91bm1hcCh0Z3Bpby0+bWVtYmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGlvbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb21lbSkpOworCWtmcmVlKHRncGlvKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRpbWJncGlvX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9IERSSVZFUl9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSB0aW1iZ3Bpb19wcm9iZSwKKwkucmVtb3ZlCQk9IHRpbWJncGlvX3JlbW92ZSwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IF9faW5pdCB0aW1iZ3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdGltYmdwaW9fcGxhdGZvcm1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRpbWJncGlvX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdGltYmdwaW9fcGxhdGZvcm1fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGltYmdwaW9faW5pdCk7Cittb2R1bGVfZXhpdCh0aW1iZ3Bpb19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUaW1iZXJkYWxlIEdQSU8gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJNb2NlYW4gTGFib3JhdG9yaWVzIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiJEUklWRVJfTkFNRSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1OTEwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTkxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YzFjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTkxMC5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogVEkgVFBTNjU5MXggR1BJTyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKgorICogQXV0aG9yOiBHcmFlbWUgR3JlZ29yeSA8Z2dAc2xpbWxvZ2ljLmNvLnVrPgorICogQXV0aG9yOiBKb3JnZSBFZHVhcmRvIENhbmRlbGFyaWEgamVkdUBzbGltbG9naWMuY28udWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjU5MTAuaD4KKworc3RhdGljIGludCB0cHM2NTkxMF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCB0cHM2NTkxMCAqdHBzNjU5MTAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCB0cHM2NTkxMCwgZ3Bpbyk7CisJdWludDhfdCB2YWw7CisKKwl0cHM2NTkxMC0+cmVhZCh0cHM2NTkxMCwgVFBTNjU5MTBfR1BJTzAgKyBvZmZzZXQsIDEsICZ2YWwpOworCisJaWYgKHZhbCAmIEdQSU9fU1RTX01BU0spCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRwczY1OTEwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkgICAgICBpbnQgdmFsdWUpCit7CisJc3RydWN0IHRwczY1OTEwICp0cHM2NTkxMCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHRwczY1OTEwLCBncGlvKTsKKworCWlmICh2YWx1ZSkKKwkJdHBzNjU5MTBfc2V0X2JpdHModHBzNjU5MTAsIFRQUzY1OTEwX0dQSU8wICsgb2Zmc2V0LAorCQkJCQkJR1BJT19TRVRfTUFTSyk7CisJZWxzZQorCQl0cHM2NTkxMF9jbGVhcl9iaXRzKHRwczY1OTEwLCBUUFM2NTkxMF9HUElPMCArIG9mZnNldCwKKwkJCQkJCUdQSU9fU0VUX01BU0spOworfQorCitzdGF0aWMgaW50IHRwczY1OTEwX2dwaW9fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkJaW50IHZhbHVlKQoreworCXN0cnVjdCB0cHM2NTkxMCAqdHBzNjU5MTAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCB0cHM2NTkxMCwgZ3Bpbyk7CisKKwkvKiBTZXQgdGhlIGluaXRpYWwgdmFsdWUgKi8KKwl0cHM2NTkxMF9ncGlvX3NldChnYywgMCwgdmFsdWUpOworCisJcmV0dXJuIHRwczY1OTEwX3NldF9iaXRzKHRwczY1OTEwLCBUUFM2NTkxMF9HUElPMCArIG9mZnNldCwKKwkJCQkJCUdQSU9fQ0ZHX01BU0spOworfQorCitzdGF0aWMgaW50IHRwczY1OTEwX2dwaW9faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTAgKnRwczY1OTEwID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgdHBzNjU5MTAsIGdwaW8pOworCisJcmV0dXJuIHRwczY1OTEwX2NsZWFyX2JpdHModHBzNjU5MTAsIFRQUzY1OTEwX0dQSU8wICsgb2Zmc2V0LAorCQkJCQkJR1BJT19DRkdfTUFTSyk7Cit9CisKK3ZvaWQgdHBzNjU5MTBfZ3Bpb19pbml0KHN0cnVjdCB0cHM2NTkxMCAqdHBzNjU5MTAsIGludCBncGlvX2Jhc2UpCit7CisJaW50IHJldDsKKworCWlmICghZ3Bpb19iYXNlKQorCQlyZXR1cm47CisKKwl0cHM2NTkxMC0+Z3Bpby5vd25lcgkJPSBUSElTX01PRFVMRTsKKwl0cHM2NTkxMC0+Z3Bpby5sYWJlbAkJPSB0cHM2NTkxMC0+aTJjX2NsaWVudC0+bmFtZTsKKwl0cHM2NTkxMC0+Z3Bpby5kZXYJCT0gdHBzNjU5MTAtPmRldjsKKwl0cHM2NTkxMC0+Z3Bpby5iYXNlCQk9IGdwaW9fYmFzZTsKKworCXN3aXRjaCh0cHM2NTkxMF9jaGlwX2lkKHRwczY1OTEwKSkgeworCWNhc2UgVFBTNjU5MTA6CisJCXRwczY1OTEwLT5ncGlvLm5ncGlvCT0gNjsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMToKKwkJdHBzNjU5MTAtPmdwaW8ubmdwaW8JPSA5OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCXRwczY1OTEwLT5ncGlvLmNhbl9zbGVlcAk9IDE7CisKKwl0cHM2NTkxMC0+Z3Bpby5kaXJlY3Rpb25faW5wdXQJPSB0cHM2NTkxMF9ncGlvX2lucHV0OworCXRwczY1OTEwLT5ncGlvLmRpcmVjdGlvbl9vdXRwdXQJPSB0cHM2NTkxMF9ncGlvX291dHB1dDsKKwl0cHM2NTkxMC0+Z3Bpby5zZXQJCT0gdHBzNjU5MTBfZ3Bpb19zZXQ7CisJdHBzNjU5MTAtPmdwaW8uZ2V0CQk9IHRwczY1OTEwX2dwaW9fZ2V0OworCisJcmV0ID0gZ3Bpb2NoaXBfYWRkKCZ0cHM2NTkxMC0+Z3Bpbyk7CisKKwlpZiAocmV0KQorCQlkZXZfd2Fybih0cHM2NTkxMC0+ZGV2LCAiR1BJTyByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwgcmV0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXR3bDQwMzAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXR3bDQwMzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI0ZjIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdHdsNDAzMC5jCkBAIC0wLDAgKzEsNTEzIEBACisvKgorICogQWNjZXNzIHRvIEdQSU9zIG9uIFRXTDQwMzAvVFBTNjU5eDAgY2hpcHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBDb2RlIHJlLWFycmFuZ2VkIGFuZCBjbGVhbmVkIHVwIGJ5OgorICoJU3llZCBNb2hhbW1lZCBLaGFzaW0gPHgwa2hhc2ltQHRpLmNvbT4KKyAqCisgKiBJbml0aWFsIENvZGU6CisgKglBbmR5IExvd2UgLyBOaXNoYW50aCBNZW5vbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KKworCisvKgorICogVGhlIEdQSU8gInN1YmNoaXAiIHN1cHBvcnRzIDE4IEdQSU9zIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkIGFzCisgKiBpbnB1dHMgb3Igb3V0cHV0cywgd2l0aCBwdWxsdXBzIG9yIHB1bGxkb3ducyBvbiBlYWNoIHBpbi4gIEVhY2gKKyAqIEdQSU8gY2FuIHRyaWdnZXIgaW50ZXJydXB0cyBvbiBlaXRoZXIgb3IgYm90aCBlZGdlcy4KKyAqCisgKiBHUElPIGludGVycnVwdHMgY2FuIGJlIGZlZCB0byBlaXRoZXIgb2YgdHdvIElSUSBsaW5lczsgdGhpcyBpcworICogaW50ZW5kZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSBob3N0cy4KKyAqCisgKiBUaGVyZSBhcmUgYWxzbyB0d28gTEVEIHBpbnMgdXNlZCBzb21ldGltZXMgYXMgb3V0cHV0LW9ubHkgR1BJT3MuCisgKi8KKworCitzdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB0d2xfZ3Bpb2NoaXA7CitzdGF0aWMgaW50IHR3bDQwMzBfZ3Bpb19pcnFfYmFzZTsKKworLyogZ2VuaXJxIGludGVyZmFjZXMgYXJlIG5vdCBhdmFpbGFibGUgdG8gbW9kdWxlcyAqLworI2lmZGVmIE1PRFVMRQorI2RlZmluZSBpc19tb2R1bGUoKQl0cnVlCisjZWxzZQorI2RlZmluZSBpc19tb2R1bGUoKQlmYWxzZQorI2VuZGlmCisKKy8qIEdQSU9fQ1RSTCBGaWVsZHMgKi8KKyNkZWZpbmUgTUFTS19HUElPX0NUUkxfR1BJTzBDRDEJCUJJVCgwKQorI2RlZmluZSBNQVNLX0dQSU9fQ1RSTF9HUElPMUNEMgkJQklUKDEpCisjZGVmaW5lIE1BU0tfR1BJT19DVFJMX0dQSU9fT04JCUJJVCgyKQorCisvKiBNYXNrIGZvciBHUElPIHJlZ2lzdGVycyB3aGVuIGFnZ3JlZ2F0ZWQgaW50byBhIDMyLWJpdCBpbnRlZ2VyICovCisjZGVmaW5lIEdQSU9fMzJfTUFTSwkJCTB4MDAwM2ZmZmYKKworLyogRGF0YSBzdHJ1Y3R1cmVzICovCitzdGF0aWMgREVGSU5FX01VVEVYKGdwaW9fbG9jayk7CisKKy8qIHN0b3JlIHVzYWdlIG9mIGVhY2ggR1BJTy4gLSBlYWNoIGJpdCByZXByZXNlbnRzIG9uZSBHUElPICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdwaW9fdXNhZ2VfY291bnQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUbyBjb25maWd1cmUgVFdMNDAzMCBHUElPIG1vZHVsZSByZWdpc3RlcnMKKyAqLworc3RhdGljIGlubGluZSBpbnQgZ3Bpb190d2w0MDMwX3dyaXRlKHU4IGFkZHJlc3MsIHU4IGRhdGEpCit7CisJcmV0dXJuIHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfR1BJTywgZGF0YSwgYWRkcmVzcyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBMRUQgcmVnaXN0ZXIgb2Zmc2V0cyAodXNlIFRXTDQwMzBfTU9EVUxFX3tMRUQsUFdNQSxQV01CfSkpCisgKiBQV01zIEEgYW5kIEIgYXJlIGRlZGljYXRlZCB0byBMRURzIEEgYW5kIEIsIHJlc3BlY3RpdmVseS4KKyAqLworCisjZGVmaW5lIFRXTDQwMzBfTEVEX0xFREVOCTB4MAorCisvKiBMRURFTiBiaXRzICovCisjZGVmaW5lIExFREVOX0xFREFPTgkJQklUKDApCisjZGVmaW5lIExFREVOX0xFREJPTgkJQklUKDEpCisjZGVmaW5lIExFREVOX0xFREFFWFQJCUJJVCgyKQorI2RlZmluZSBMRURFTl9MRURCRVhUCQlCSVQoMykKKyNkZWZpbmUgTEVERU5fTEVEQVBXTQkJQklUKDQpCisjZGVmaW5lIExFREVOX0xFREJQV00JCUJJVCg1KQorI2RlZmluZSBMRURFTl9QV01fTEVOR1RIQQlCSVQoNikKKyNkZWZpbmUgTEVERU5fUFdNX0xFTkdUSEIJQklUKDcpCisKKyNkZWZpbmUgVFdMNDAzMF9QV014X1BXTXhPTgkweDAKKyNkZWZpbmUgVFdMNDAzMF9QV014X1BXTXhPRkYJMHgxCisKKyNkZWZpbmUgUFdNeE9OX0xFTkdUSAkJQklUKDcpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUbyByZWFkIGEgVFdMNDAzMCBHUElPIG1vZHVsZSByZWdpc3RlcgorICovCitzdGF0aWMgaW5saW5lIGludCBncGlvX3R3bDQwMzBfcmVhZCh1OCBhZGRyZXNzKQoreworCXU4IGRhdGE7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSB0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfR1BJTywgJmRhdGEsIGFkZHJlc3MpOworCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiBkYXRhOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTggY2FjaGVkX2xlZGVuOwkJLyogcHJvdGVjdGVkIGJ5IGdwaW9fbG9jayAqLworCisvKiBUaGUgTEVEIGxpbmVzIGFyZSBvcGVuIGRyYWluIG91dHB1dHMgLi4uIGEgRkVUIHB1bGxzIHRvIEdORCwgc28gYW4KKyAqIGV4dGVybmFsIHB1bGx1cCBpcyBuZWVkZWQuICBXZSBjb3VsZCBhbHNvIGV4cG9zZSB0aGUgaW50ZWdyYXRlZCBQV00KKyAqIGFzIGEgTEVEIGJyaWdodG5lc3MgY29udHJvbDsgd2UgaW5pdGlhbGl6ZSBpdCBhcyAiYWx3YXlzIG9uIi4KKyAqLworc3RhdGljIHZvaWQgdHdsNDAzMF9sZWRfc2V0X3ZhbHVlKGludCBsZWQsIGludCB2YWx1ZSkKK3sKKwl1OCBtYXNrID0gTEVERU5fTEVEQU9OIHwgTEVERU5fTEVEQVBXTTsKKwlpbnQgc3RhdHVzOworCisJaWYgKGxlZCkKKwkJbWFzayA8PD0gMTsKKworCW11dGV4X2xvY2soJmdwaW9fbG9jayk7CisJaWYgKHZhbHVlKQorCQljYWNoZWRfbGVkZW4gJj0gfm1hc2s7CisJZWxzZQorCQljYWNoZWRfbGVkZW4gfD0gbWFzazsKKwlzdGF0dXMgPSB0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX0xFRCwgY2FjaGVkX2xlZGVuLAorCQkJVFdMNDAzMF9MRURfTEVERU4pOworCW11dGV4X3VubG9jaygmZ3Bpb19sb2NrKTsKK30KKworc3RhdGljIGludCB0d2w0MDMwX3NldF9ncGlvX2RpcmVjdGlvbihpbnQgZ3BpbywgaW50IGlzX2lucHV0KQoreworCXU4IGRfYm5rID0gZ3BpbyA+PiAzOworCXU4IGRfbXNrID0gQklUKGdwaW8gJiAweDcpOworCXU4IHJlZyA9IDA7CisJdTggYmFzZSA9IFJFR19HUElPREFUQURJUjEgKyBkX2JuazsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmdwaW9fbG9jayk7CisJcmV0ID0gZ3Bpb190d2w0MDMwX3JlYWQoYmFzZSk7CisJaWYgKHJldCA+PSAwKSB7CisJCWlmIChpc19pbnB1dCkKKwkJCXJlZyA9IHJldCAmIH5kX21zazsKKwkJZWxzZQorCQkJcmVnID0gcmV0IHwgZF9tc2s7CisKKwkJcmV0ID0gZ3Bpb190d2w0MDMwX3dyaXRlKGJhc2UsIHJlZyk7CisJfQorCW11dGV4X3VubG9jaygmZ3Bpb19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR3bDQwMzBfc2V0X2dwaW9fZGF0YW91dChpbnQgZ3BpbywgaW50IGVuYWJsZSkKK3sKKwl1OCBkX2JuayA9IGdwaW8gPj4gMzsKKwl1OCBkX21zayA9IEJJVChncGlvICYgMHg3KTsKKwl1OCBiYXNlID0gMDsKKworCWlmIChlbmFibGUpCisJCWJhc2UgPSBSRUdfU0VUR1BJT0RBVEFPVVQxICsgZF9ibms7CisJZWxzZQorCQliYXNlID0gUkVHX0NMRUFSR1BJT0RBVEFPVVQxICsgZF9ibms7CisKKwlyZXR1cm4gZ3Bpb190d2w0MDMwX3dyaXRlKGJhc2UsIGRfbXNrKTsKK30KKworc3RhdGljIGludCB0d2w0MDMwX2dldF9ncGlvX2RhdGFpbihpbnQgZ3BpbykKK3sKKwl1OCBkX2JuayA9IGdwaW8gPj4gMzsKKwl1OCBkX29mZiA9IGdwaW8gJiAweDc7CisJdTggYmFzZSA9IDA7CisJaW50IHJldCA9IDA7CisKKwlpZiAodW5saWtlbHkoKGdwaW8gPj0gVFdMNDAzMF9HUElPX01BWCkKKwkJfHwgIShncGlvX3VzYWdlX2NvdW50ICYgQklUKGdwaW8pKSkpCisJCXJldHVybiAtRVBFUk07CisKKwliYXNlID0gUkVHX0dQSU9EQVRBSU4xICsgZF9ibms7CisJcmV0ID0gZ3Bpb190d2w0MDMwX3JlYWQoYmFzZSk7CisJaWYgKHJldCA+IDApCisJCXJldCA9IChyZXQgPj4gZF9vZmYpICYgMHgxOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCB0d2xfcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwltdXRleF9sb2NrKCZncGlvX2xvY2spOworCisJLyogU3VwcG9ydCB0aGUgdHdvIExFRCBvdXRwdXRzIGFzIG91dHB1dC1vbmx5IEdQSU9zLiAqLworCWlmIChvZmZzZXQgPj0gVFdMNDAzMF9HUElPX01BWCkgeworCQl1OAlsZWRjbHJfbWFzayA9IExFREVOX0xFREFPTiB8IExFREVOX0xFREFFWFQKKwkJCQl8IExFREVOX0xFREFQV00gfCBMRURFTl9QV01fTEVOR1RIQTsKKwkJdTgJbW9kdWxlID0gVFdMNDAzMF9NT0RVTEVfUFdNQTsKKworCQlvZmZzZXQgLT0gVFdMNDAzMF9HUElPX01BWDsKKwkJaWYgKG9mZnNldCkgeworCQkJbGVkY2xyX21hc2sgPDw9IDE7CisJCQltb2R1bGUgPSBUV0w0MDMwX01PRFVMRV9QV01COworCQl9CisKKwkJLyogaW5pdGlhbGl6ZSBQV00gdG8gYWx3YXlzLWRyaXZlICovCisJCXN0YXR1cyA9IHR3bF9pMmNfd3JpdGVfdTgobW9kdWxlLCAweDdmLAorCQkJCVRXTDQwMzBfUFdNeF9QV014T0ZGKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGRvbmU7CisJCXN0YXR1cyA9IHR3bF9pMmNfd3JpdGVfdTgobW9kdWxlLCAweDdmLAorCQkJCVRXTDQwMzBfUFdNeF9QV014T04pOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZG9uZTsKKworCQkvKiBpbml0IExFRCB0byBub3QtZHJpdmVuIChoaWdoKSAqLworCQltb2R1bGUgPSBUV0w0MDMwX01PRFVMRV9MRUQ7CisJCXN0YXR1cyA9IHR3bF9pMmNfcmVhZF91OChtb2R1bGUsICZjYWNoZWRfbGVkZW4sCisJCQkJVFdMNDAzMF9MRURfTEVERU4pOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZG9uZTsKKwkJY2FjaGVkX2xlZGVuICY9IH5sZWRjbHJfbWFzazsKKwkJc3RhdHVzID0gdHdsX2kyY193cml0ZV91OChtb2R1bGUsIGNhY2hlZF9sZWRlbiwKKwkJCQlUV0w0MDMwX0xFRF9MRURFTik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBkb25lOworCisJCXN0YXR1cyA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBvbiBmaXJzdCB1c2UsIHR1cm4gR1BJTyBtb2R1bGUgIm9uIiAqLworCWlmICghZ3Bpb191c2FnZV9jb3VudCkgeworCQlzdHJ1Y3QgdHdsNDAzMF9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCQl1OCB2YWx1ZSA9IE1BU0tfR1BJT19DVFJMX0dQSU9fT047CisKKwkJLyogb3B0aW9uYWxseSBoYXZlIHRoZSBmaXJzdCB0d28gR1BJT3Mgc3dpdGNoIHZNTUMxCisJCSAqIGFuZCB2TU1DMiBwb3dlciBzdXBwbGllcyBiYXNlZCBvbiBjYXJkIHByZXNlbmNlLgorCQkgKi8KKwkJcGRhdGEgPSBjaGlwLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJCXZhbHVlIHw9IHBkYXRhLT5tbWNfY2QgJiAweDAzOworCisJCXN0YXR1cyA9IGdwaW9fdHdsNDAzMF93cml0ZShSRUdfR1BJT19DVFJMLCB2YWx1ZSk7CisJfQorCisJaWYgKCFzdGF0dXMpCisJCWdwaW9fdXNhZ2VfY291bnQgfD0gKDB4MSA8PCBvZmZzZXQpOworCitkb25lOgorCW11dGV4X3VubG9jaygmZ3Bpb19sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCB0d2xfZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJaWYgKG9mZnNldCA+PSBUV0w0MDMwX0dQSU9fTUFYKSB7CisJCXR3bDQwMzBfbGVkX3NldF92YWx1ZShvZmZzZXQgLSBUV0w0MDMwX0dQSU9fTUFYLCAxKTsKKwkJcmV0dXJuOworCX0KKworCW11dGV4X2xvY2soJmdwaW9fbG9jayk7CisKKwlncGlvX3VzYWdlX2NvdW50ICY9IH5CSVQob2Zmc2V0KTsKKworCS8qIG9uIGxhc3QgdXNlLCBzd2l0Y2ggb2ZmIEdQSU8gbW9kdWxlICovCisJaWYgKCFncGlvX3VzYWdlX2NvdW50KQorCQlncGlvX3R3bDQwMzBfd3JpdGUoUkVHX0dQSU9fQ1RSTCwgMHgwKTsKKworCW11dGV4X3VubG9jaygmZ3Bpb19sb2NrKTsKK30KKworc3RhdGljIGludCB0d2xfZGlyZWN0aW9uX2luKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gKG9mZnNldCA8IFRXTDQwMzBfR1BJT19NQVgpCisJCT8gdHdsNDAzMF9zZXRfZ3Bpb19kaXJlY3Rpb24ob2Zmc2V0LCAxKQorCQk6IC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdHdsX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAob2Zmc2V0IDwgVFdMNDAzMF9HUElPX01BWCkKKwkJc3RhdHVzID0gdHdsNDAzMF9nZXRfZ3Bpb19kYXRhaW4ob2Zmc2V0KTsKKwllbHNlIGlmIChvZmZzZXQgPT0gVFdMNDAzMF9HUElPX01BWCkKKwkJc3RhdHVzID0gY2FjaGVkX2xlZGVuICYgTEVERU5fTEVEQU9OOworCWVsc2UKKwkJc3RhdHVzID0gY2FjaGVkX2xlZGVuICYgTEVERU5fTEVEQk9OOworCXJldHVybiAoc3RhdHVzIDwgMCkgPyAwIDogc3RhdHVzOworfQorCitzdGF0aWMgaW50IHR3bF9kaXJlY3Rpb25fb3V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCWlmIChvZmZzZXQgPCBUV0w0MDMwX0dQSU9fTUFYKSB7CisJCXR3bDQwMzBfc2V0X2dwaW9fZGF0YW91dChvZmZzZXQsIHZhbHVlKTsKKwkJcmV0dXJuIHR3bDQwMzBfc2V0X2dwaW9fZGlyZWN0aW9uKG9mZnNldCwgMCk7CisJfSBlbHNlIHsKKwkJdHdsNDAzMF9sZWRfc2V0X3ZhbHVlKG9mZnNldCAtIFRXTDQwMzBfR1BJT19NQVgsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZCB0d2xfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCWlmIChvZmZzZXQgPCBUV0w0MDMwX0dQSU9fTUFYKQorCQl0d2w0MDMwX3NldF9ncGlvX2RhdGFvdXQob2Zmc2V0LCB2YWx1ZSk7CisJZWxzZQorCQl0d2w0MDMwX2xlZF9zZXRfdmFsdWUob2Zmc2V0IC0gVFdMNDAzMF9HUElPX01BWCwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IHR3bF90b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiAodHdsNDAzMF9ncGlvX2lycV9iYXNlICYmIChvZmZzZXQgPCBUV0w0MDMwX0dQSU9fTUFYKSkKKwkJPyAodHdsNDAzMF9ncGlvX2lycV9iYXNlICsgb2Zmc2V0KQorCQk6IC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHR3bF9ncGlvY2hpcCA9IHsKKwkubGFiZWwJCQk9ICJ0d2w0MDMwIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5yZXF1ZXN0CQk9IHR3bF9yZXF1ZXN0LAorCS5mcmVlCQkJPSB0d2xfZnJlZSwKKwkuZGlyZWN0aW9uX2lucHV0CT0gdHdsX2RpcmVjdGlvbl9pbiwKKwkuZ2V0CQkJPSB0d2xfZ2V0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gdHdsX2RpcmVjdGlvbl9vdXQsCisJLnNldAkJCT0gdHdsX3NldCwKKwkudG9faXJxCQkJPSB0d2xfdG9faXJxLAorCS5jYW5fc2xlZXAJCT0gMSwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdwaW9fdHdsNDAzMF9wdWxscyh1MzIgdXBzLCB1MzIgZG93bnMpCit7CisJdTgJCW1lc3NhZ2VbNl07CisJdW5zaWduZWQJaSwgZ3Bpb19iaXQ7CisKKwkvKiBGb3IgbW9zdCBwaW5zLCBhIHB1bGxkb3duIHdhcyBlbmFibGVkIGJ5IGRlZmF1bHQuCisJICogV2Ugc2hvdWxkIGhhdmUgZGF0YSB0aGF0J3Mgc3BlY2lmaWMgdG8gdGhpcyBib2FyZC4KKwkgKi8KKwlmb3IgKGdwaW9fYml0ID0gMSwgaSA9IDE7IGkgPCA2OyBpKyspIHsKKwkJdTgJCWJpdF9tYXNrOworCQl1bnNpZ25lZAlqOworCisJCWZvciAoYml0X21hc2sgPSAwLCBqID0gMDsgaiA8IDg7IGogKz0gMiwgZ3Bpb19iaXQgPDw9IDEpIHsKKwkJCWlmICh1cHMgJiBncGlvX2JpdCkKKwkJCQliaXRfbWFzayB8PSAxIDw8IChqICsgMSk7CisJCQllbHNlIGlmIChkb3ducyAmIGdwaW9fYml0KQorCQkJCWJpdF9tYXNrIHw9IDEgPDwgKGogKyAwKTsKKwkJfQorCQltZXNzYWdlW2ldID0gYml0X21hc2s7CisJfQorCisJcmV0dXJuIHR3bF9pMmNfd3JpdGUoVFdMNDAzMF9NT0RVTEVfR1BJTywgbWVzc2FnZSwKKwkJCQlSRUdfR1BJT1BVUERDVFIxLCA1KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZ3Bpb190d2w0MDMwX2RlYm91bmNlKHUzMiBkZWJvdW5jZSwgdTggbW1jX2NkKQoreworCXU4CQltZXNzYWdlWzRdOworCisJLyogMzAgbXNlYyBvZiBkZWJvdW5jaW5nIGlzIGFsd2F5cyB1c2VkIGZvciBNTUMgY2FyZCBkZXRlY3QsCisJICogYW5kIGlzIG9wdGlvbmFsIGZvciBldmVyeXRoaW5nIGVsc2UuCisJICovCisJbWVzc2FnZVsxXSA9IChkZWJvdW5jZSAmIDB4ZmYpIHwgKG1tY19jZCAmIDB4MDMpOworCWRlYm91bmNlID4+PSA4OworCW1lc3NhZ2VbMl0gPSAoZGVib3VuY2UgJiAweGZmKTsKKwlkZWJvdW5jZSA+Pj0gODsKKwltZXNzYWdlWzNdID0gKGRlYm91bmNlICYgMHgwMyk7CisKKwlyZXR1cm4gdHdsX2kyY193cml0ZShUV0w0MDMwX01PRFVMRV9HUElPLCBtZXNzYWdlLAorCQkJCVJFR19HUElPX0RFQkVOMSwgMyk7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb190d2w0MDMwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworc3RhdGljIGludCBfX2RldmluaXQgZ3Bpb190d2w0MDMwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHR3bDQwMzBfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQ7CisKKwkvKiBtYXliZSBzZXR1cCBJUlFzICovCisJaWYgKHBkYXRhLT5pcnFfYmFzZSkgeworCQlpZiAoaXNfbW9kdWxlKCkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiY2FuJ3QgZGlzcGF0Y2ggSVJRcyBmcm9tIG1vZHVsZXNcbiIpOworCQkJZ290byBub19pcnFzOworCQl9CisJCXJldCA9IHR3bDQwMzBfc2loX3NldHVwKFRXTDQwMzBfTU9EVUxFX0dQSU8pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCVdBUk5fT04ocmV0ICE9IHBkYXRhLT5pcnFfYmFzZSk7CisJCXR3bDQwMzBfZ3Bpb19pcnFfYmFzZSA9IHJldDsKKwl9CisKK25vX2lycXM6CisJLyoKKwkgKiBOT1RFOiAgYm9hcmRzIG1heSB3YXN0ZSBwb3dlciBpZiB0aGV5IGRvbid0IHNldCBwdWxsdXBzCisJICogYW5kIHB1bGxkb3ducyBjb3JyZWN0bHkgLi4uIGRlZmF1bHQgZm9yIG5vbi1VTFBJIHBpbnMgaXMKKwkgKiBwdWxsZG93biwgYW5kIHNvbWUgb3RoZXIgcGlucyBtYXkgaGF2ZSBleHRlcm5hbCBwdWxsdXBzCisJICogb3IgcHVsbGRvd25zLiAgQ2FyZWZ1bCEKKwkgKi8KKwlyZXQgPSBncGlvX3R3bDQwMzBfcHVsbHMocGRhdGEtPnB1bGx1cHMsIHBkYXRhLT5wdWxsZG93bnMpOworCWlmIChyZXQpCisJCWRldl9kYmcoJnBkZXYtPmRldiwgInB1bGx1cHMgJS4wNXggJS4wNXggLS0+ICVkXG4iLAorCQkJCXBkYXRhLT5wdWxsdXBzLCBwZGF0YS0+cHVsbGRvd25zLAorCQkJCXJldCk7CisKKwlyZXQgPSBncGlvX3R3bDQwMzBfZGVib3VuY2UocGRhdGEtPmRlYm91bmNlLCBwZGF0YS0+bW1jX2NkKTsKKwlpZiAocmV0KQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJkZWJvdW5jZSAlLjAzeCAlLjAxeCAtLT4gJWRcbiIsCisJCQkJcGRhdGEtPmRlYm91bmNlLCBwZGF0YS0+bW1jX2NkLAorCQkJCXJldCk7CisKKwl0d2xfZ3Bpb2NoaXAuYmFzZSA9IHBkYXRhLT5ncGlvX2Jhc2U7CisJdHdsX2dwaW9jaGlwLm5ncGlvID0gVFdMNDAzMF9HUElPX01BWDsKKwl0d2xfZ3Bpb2NoaXAuZGV2ID0gJnBkZXYtPmRldjsKKworCS8qIE5PVEU6IHdlIGFzc3VtZSBWSUJSQV9DVEwuVklCUkFfRU4sIGluIE1PRFVMRV9BVURJT19WT0lDRSwKKwkgKiBpcyAoc3RpbGwpIGNsZWFyIGlmIHVzZV9sZWRzIGlzIHNldC4KKwkgKi8KKwlpZiAocGRhdGEtPnVzZV9sZWRzKQorCQl0d2xfZ3Bpb2NoaXAubmdwaW8gKz0gMjsKKworCXJldCA9IGdwaW9jaGlwX2FkZCgmdHdsX2dwaW9jaGlwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImNvdWxkIG5vdCByZWdpc3RlciBncGlvY2hpcCwgJWRcbiIsCisJCQkJcmV0KTsKKwkJdHdsX2dwaW9jaGlwLm5ncGlvID0gMDsKKwkJZ3Bpb190d2w0MDMwX3JlbW92ZShwZGV2KTsKKwl9IGVsc2UgaWYgKHBkYXRhLT5zZXR1cCkgeworCQlpbnQgc3RhdHVzOworCisJCXN0YXR1cyA9IHBkYXRhLT5zZXR1cCgmcGRldi0+ZGV2LAorCQkJCXBkYXRhLT5ncGlvX2Jhc2UsIFRXTDQwMzBfR1BJT19NQVgpOworCQlpZiAoc3RhdHVzKQorCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAic2V0dXAgLS0+ICVkXG4iLCBzdGF0dXMpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIENhbm5vdCB1c2UgX19kZXZleGl0IGFzIGdwaW9fdHdsNDAzMF9wcm9iZSgpIGNhbGxzIHVzICovCitzdGF0aWMgaW50IGdwaW9fdHdsNDAzMF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdHdsNDAzMF9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHN0YXR1czsKKworCWlmIChwZGF0YS0+dGVhcmRvd24pIHsKKwkJc3RhdHVzID0gcGRhdGEtPnRlYXJkb3duKCZwZGV2LT5kZXYsCisJCQkJcGRhdGEtPmdwaW9fYmFzZSwgVFdMNDAzMF9HUElPX01BWCk7CisJCWlmIChzdGF0dXMpIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgInRlYXJkb3duIC0tPiAlZFxuIiwgc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisKKwlzdGF0dXMgPSBncGlvY2hpcF9yZW1vdmUoJnR3bF9ncGlvY2hpcCk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoaXNfbW9kdWxlKCkpCisJCXJldHVybiAwOworCisJLyogUkVWSVNJVCBubyBzdXBwb3J0IHlldCBmb3IgZGVyZWdpc3RlcmluZyBhbGwgdGhlIElSUXMgKi8KKwlXQVJOX09OKDEpOworCXJldHVybiAtRUlPOworfQorCisvKiBOb3RlOiAgdGhpcyBoYXJkd2FyZSBsaXZlcyBpbnNpZGUgYW4gSTJDLWJhc2VkIG11bHRpLWZ1bmN0aW9uIGRldmljZS4gKi8KK01PRFVMRV9BTElBUygicGxhdGZvcm06dHdsNDAzMF9ncGlvIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9fdHdsNDAzMF9kcml2ZXIgPSB7CisJLmRyaXZlci5uYW1lCT0gInR3bDQwMzBfZ3BpbyIsCisJLmRyaXZlci5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5wcm9iZQkJPSBncGlvX3R3bDQwMzBfcHJvYmUsCisJLnJlbW92ZQkJPSBncGlvX3R3bDQwMzBfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ3Bpb190d2w0MDMwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZncGlvX3R3bDQwMzBfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChncGlvX3R3bDQwMzBfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBncGlvX3R3bDQwMzBfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZncGlvX3R3bDQwMzBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGdwaW9fdHdsNDAzMF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR1BJTyBpbnRlcmZhY2UgZm9yIFRXTDQwMzAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXUzMDAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXUzMDAuYwppbmRleCBkOTI3OTAxLi41M2U4MjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby11MzAwLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdTMwMC5jCkBAIC0xLDExICsxLDggQEAKIC8qCi0gKgotICogYXJjaC9hcm0vbWFjaC11MzAwL2dwaW8uYwotICoKKyAqIFUzMDAgR1BJTyBtb2R1bGUuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgU1QtRXJpY3Nzb24gQUIKICAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgotICogVTMwMCBHUElPIG1vZHVsZS4KICAqIFRoaXMgY2FuIGRyaXZlciBlaXRoZXIgb2YgdGhlIHR3byBiYXNpYyBHUElPIGNvcmVzCiAgKiBhdmFpbGFibGUgaW4gdGhlIFUzMDAgcGxhdGZvcm1zOgogICogQ09IIDkwMSAzMzUgICAtIFVzZWQgaW4gREIzMTUwIChVMzAwIDEuMCkgYW5kIERCMzIwMCAoVTMzMCAxLjApCkBAIC01ODEsOCArNTc4LDggQEAKIAlpZiAoIW1lbXJlcykKIAkJZ290byBlcnJfbm9fcmVzb3VyY2U7CiAKLQlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKG1lbXJlcy0+c3RhcnQsIG1lbXJlcy0+ZW5kIC0gbWVtcmVzLT5zdGFydCwgIkdQSU8gQ29udHJvbGxlciIpCi0JICAgID09IE5VTEwpIHsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW1yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbXJlcyksCisJCQkJIkdQSU8gQ29udHJvbGxlciIpKSB7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX25vX2lvcmVnaW9uOwogCX0KQEAgLTY0MCw3ICs2MzcsNyBAQAogCQlmcmVlX2lycShncGlvX3BvcnRzW2ldLmlycSwgJmdwaW9fcG9ydHNbaV0pOwogCWlvdW5tYXAodmlydGJhc2UpOwogIGVycl9ub19pb3JlbWFwOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW1yZXMtPnN0YXJ0LCBtZW1yZXMtPmVuZCAtIG1lbXJlcy0+c3RhcnQpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW1yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbXJlcykpOwogIGVycl9ub19pb3JlZ2lvbjoKICBlcnJfbm9fcmVzb3VyY2U6CiAJY2xrX2Rpc2FibGUoY2xrKTsKQEAgLTY2MCw3ICs2NTcsNyBAQAogCWZvciAoaSA9IDAgOyBpIDwgVTMwMF9HUElPX05VTV9QT1JUUzsgaSsrKQogCQlmcmVlX2lycShncGlvX3BvcnRzW2ldLmlycSwgJmdwaW9fcG9ydHNbaV0pOwogCWlvdW5tYXAodmlydGJhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW1yZXMtPnN0YXJ0LCBtZW1yZXMtPmVuZCAtIG1lbXJlcy0+c3RhcnQpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW1yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbXJlcykpOwogCWNsa19kaXNhYmxlKGNsayk7CiAJY2xrX3B1dChjbGspOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3VjYjE0MDBfZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdWNiMTQwMC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2dwaW8vdWNiMTQwMF9ncGlvLmMKcmVuYW1lIHRvIGRyaXZlcnMvZ3Bpby9ncGlvLXVjYjE0MDAuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tdnI0MXh4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby12cjQxeHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODcyM2NiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdnI0MXh4LmMKQEAgLTAsMCArMSw1ODUgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBORUMgVlI0MTAwIHNlcmllcyBHZW5lcmFsLXB1cnBvc2UgSS9PIFVuaXQuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCUF1dGhvcjogWW9pY2hpIFl1YXNhIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSAgWW9pY2hpIFl1YXNhIDx5dWFzYUBsaW51eC1taXBzLm9yZz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL3ZyNDF4eC9naXUuaD4KKyNpbmNsdWRlIDxhc20vdnI0MXh4L2lycS5oPgorI2luY2x1ZGUgPGFzbS92cjQxeHgvdnI0MXh4Lmg+CisKK01PRFVMRV9BVVRIT1IoIllvaWNoaSBZdWFzYSA8eXVhc2FAbGludXgtbWlwcy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5FQyBWUjQxMDAgc2VyaWVzIEdlbmVyYWwtcHVycG9zZSBJL08gVW5pdCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBHSVVJT1NFTEwJMHgwMAorI2RlZmluZSBHSVVJT1NFTEgJMHgwMgorI2RlZmluZSBHSVVQSU9ETAkweDA0CisjZGVmaW5lIEdJVVBJT0RICTB4MDYKKyNkZWZpbmUgR0lVSU5UU1RBVEwJMHgwOAorI2RlZmluZSBHSVVJTlRTVEFUSAkweDBhCisjZGVmaW5lIEdJVUlOVEVOTAkweDBjCisjZGVmaW5lIEdJVUlOVEVOSAkweDBlCisjZGVmaW5lIEdJVUlOVFRZUEwJMHgxMAorI2RlZmluZSBHSVVJTlRUWVBICTB4MTIKKyNkZWZpbmUgR0lVSU5UQUxTRUxMCTB4MTQKKyNkZWZpbmUgR0lVSU5UQUxTRUxICTB4MTYKKyNkZWZpbmUgR0lVSU5USFRTRUxMCTB4MTgKKyNkZWZpbmUgR0lVSU5USFRTRUxICTB4MWEKKyNkZWZpbmUgR0lVUE9EQVRMCTB4MWMKKyNkZWZpbmUgR0lVUE9EQVRFTgkweDFjCisjZGVmaW5lIEdJVVBPREFUSAkweDFlCisgI2RlZmluZSBQSU9FTjAJCTB4MDEwMAorICNkZWZpbmUgUElPRU4xCQkweDAyMDAKKyNkZWZpbmUgR0lVUE9EQVQJMHgxZQorI2RlZmluZSBHSVVGRURHRUlOSEwJMHgyMAorI2RlZmluZSBHSVVGRURHRUlOSEgJMHgyMgorI2RlZmluZSBHSVVSRURHRUlOSEwJMHgyNAorI2RlZmluZSBHSVVSRURHRUlOSEgJMHgyNgorCisjZGVmaW5lIEdJVVVTRVVQRE4JMHgxZTAKKyNkZWZpbmUgR0lVVEVSTVVQRE4JMHgxZTIKKworI2RlZmluZSBHUElPX0hBU19QVUxMVVBET1dOX0lPCQkweDAwMDEKKyNkZWZpbmUgR1BJT19IQVNfT1VUUFVUX0VOQUJMRQkJMHgwMDAyCisjZGVmaW5lIEdQSU9fSEFTX0lOVEVSUlVQVF9FREdFX1NFTEVDVAkweDAxMDAKKworZW51bSB7CisJR1BJT19JTlBVVCwKKwlHUElPX09VVFBVVCwKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ2l1X2xvY2spOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2l1X2ZsYWdzOworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpnaXVfYmFzZTsKKworI2RlZmluZSBnaXVfcmVhZChvZmZzZXQpCQlyZWFkdyhnaXVfYmFzZSArIChvZmZzZXQpKQorI2RlZmluZSBnaXVfd3JpdGUob2Zmc2V0LCB2YWx1ZSkJd3JpdGV3KCh2YWx1ZSksIGdpdV9iYXNlICsgKG9mZnNldCkpCisKKyNkZWZpbmUgR1BJT19QSU5fT0ZfSVJRKGlycSkJKChpcnEpIC0gR0lVX0lSUV9CQVNFKQorI2RlZmluZSBHSVVJTlRfSElHSF9PRkZTRVQJMTYKKyNkZWZpbmUgR0lVSU5UX0hJR0hfTUFYCQkzMgorCitzdGF0aWMgaW5saW5lIHUxNiBnaXVfc2V0KHUxNiBvZmZzZXQsIHUxNiBzZXQpCit7CisJdTE2IGRhdGE7CisKKwlkYXRhID0gZ2l1X3JlYWQob2Zmc2V0KTsKKwlkYXRhIHw9IHNldDsKKwlnaXVfd3JpdGUob2Zmc2V0LCBkYXRhKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBnaXVfY2xlYXIodTE2IG9mZnNldCwgdTE2IGNsZWFyKQoreworCXUxNiBkYXRhOworCisJZGF0YSA9IGdpdV9yZWFkKG9mZnNldCk7CisJZGF0YSAmPSB+Y2xlYXI7CisJZ2l1X3dyaXRlKG9mZnNldCwgZGF0YSk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgYWNrX2dpdWludF9sb3coc3RydWN0IGlycV9kYXRhICpkKQoreworCWdpdV93cml0ZShHSVVJTlRTVEFUTCwgMSA8PCBHUElPX1BJTl9PRl9JUlEoZC0+aXJxKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tfZ2l1aW50X2xvdyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJZ2l1X2NsZWFyKEdJVUlOVEVOTCwgMSA8PCBHUElPX1BJTl9PRl9JUlEoZC0+aXJxKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tfYWNrX2dpdWludF9sb3coc3RydWN0IGlycV9kYXRhICpkKQoreworCXVuc2lnbmVkIGludCBwaW47CisKKwlwaW4gPSBHUElPX1BJTl9PRl9JUlEoZC0+aXJxKTsKKwlnaXVfY2xlYXIoR0lVSU5URU5MLCAxIDw8IHBpbik7CisJZ2l1X3dyaXRlKEdJVUlOVFNUQVRMLCAxIDw8IHBpbik7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFza19naXVpbnRfbG93KHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlnaXVfc2V0KEdJVUlOVEVOTCwgMSA8PCBHUElPX1BJTl9PRl9JUlEoZC0+aXJxKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZ2l1aW50X2xvd19pcnFfY2hpcCA9IHsKKwkubmFtZQkJPSAiR0lVSU5UTCIsCisJLmlycV9hY2sJPSBhY2tfZ2l1aW50X2xvdywKKwkuaXJxX21hc2sJPSBtYXNrX2dpdWludF9sb3csCisJLmlycV9tYXNrX2Fjawk9IG1hc2tfYWNrX2dpdWludF9sb3csCisJLmlycV91bm1hc2sJPSB1bm1hc2tfZ2l1aW50X2xvdywKK307CisKK3N0YXRpYyB2b2lkIGFja19naXVpbnRfaGlnaChzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJZ2l1X3dyaXRlKEdJVUlOVFNUQVRILAorCQkgIDEgPDwgKEdQSU9fUElOX09GX0lSUShkLT5pcnEpIC0gR0lVSU5UX0hJR0hfT0ZGU0VUKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tfZ2l1aW50X2hpZ2goc3RydWN0IGlycV9kYXRhICpkKQoreworCWdpdV9jbGVhcihHSVVJTlRFTkgsIDEgPDwgKEdQSU9fUElOX09GX0lSUShkLT5pcnEpIC0gR0lVSU5UX0hJR0hfT0ZGU0VUKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tfYWNrX2dpdWludF9oaWdoKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1bnNpZ25lZCBpbnQgcGluOworCisJcGluID0gR1BJT19QSU5fT0ZfSVJRKGQtPmlycSkgLSBHSVVJTlRfSElHSF9PRkZTRVQ7CisJZ2l1X2NsZWFyKEdJVUlOVEVOSCwgMSA8PCBwaW4pOworCWdpdV93cml0ZShHSVVJTlRTVEFUSCwgMSA8PCBwaW4pOworfQorCitzdGF0aWMgdm9pZCB1bm1hc2tfZ2l1aW50X2hpZ2goc3RydWN0IGlycV9kYXRhICpkKQoreworCWdpdV9zZXQoR0lVSU5URU5ILCAxIDw8IChHUElPX1BJTl9PRl9JUlEoZC0+aXJxKSAtIEdJVUlOVF9ISUdIX09GRlNFVCkpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGdpdWludF9oaWdoX2lycV9jaGlwID0geworCS5uYW1lCQk9ICJHSVVJTlRIIiwKKwkuaXJxX2Fjawk9IGFja19naXVpbnRfaGlnaCwKKwkuaXJxX21hc2sJPSBtYXNrX2dpdWludF9oaWdoLAorCS5pcnFfbWFza19hY2sJPSBtYXNrX2Fja19naXVpbnRfaGlnaCwKKwkuaXJxX3VubWFzawk9IHVubWFza19naXVpbnRfaGlnaCwKK307CisKK3N0YXRpYyBpbnQgZ2l1X2dldF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MTYgcGVuZGwsIHBlbmRoLCBtYXNrbCwgbWFza2g7CisJaW50IGk7CisKKwlwZW5kbCA9IGdpdV9yZWFkKEdJVUlOVFNUQVRMKTsKKwlwZW5kaCA9IGdpdV9yZWFkKEdJVUlOVFNUQVRIKTsKKwltYXNrbCA9IGdpdV9yZWFkKEdJVUlOVEVOTCk7CisJbWFza2ggPSBnaXVfcmVhZChHSVVJTlRFTkgpOworCisJbWFza2wgJj0gcGVuZGw7CisJbWFza2ggJj0gcGVuZGg7CisKKwlpZiAobWFza2wpIHsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCWlmIChtYXNrbCAmICgxIDw8IGkpKQorCQkJCXJldHVybiBHSVVfSVJRKGkpOworCQl9CisJfSBlbHNlIGlmIChtYXNraCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJaWYgKG1hc2toICYgKDEgPDwgaSkpCisJCQkJcmV0dXJuIEdJVV9JUlEoaSArIEdJVUlOVF9ISUdIX09GRlNFVCk7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9FUlIgInNwdXJpb3VzIEdJVSBpbnRlcnJ1cHQ6ICUwNHgoJTA0eCksJTA0eCglMDR4KVxuIiwKKwkgICAgICAgbWFza2wsIHBlbmRsLCBtYXNraCwgcGVuZGgpOworCisJYXRvbWljX2luYygmaXJxX2Vycl9jb3VudCk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwordm9pZCB2cjQxeHhfc2V0X2lycV90cmlnZ2VyKHVuc2lnbmVkIGludCBwaW4sIGlycV90cmlnZ2VyX3QgdHJpZ2dlciwKKwkJCSAgICBpcnFfc2lnbmFsX3Qgc2lnbmFsKQoreworCXUxNiBtYXNrOworCisJaWYgKHBpbiA8IEdJVUlOVF9ISUdIX09GRlNFVCkgeworCQltYXNrID0gMSA8PCBwaW47CisJCWlmICh0cmlnZ2VyICE9IElSUV9UUklHR0VSX0xFVkVMKSB7CisJCQlnaXVfc2V0KEdJVUlOVFRZUEwsIG1hc2spOworCQkJaWYgKHNpZ25hbCA9PSBJUlFfU0lHTkFMX0hPTEQpCisJCQkJZ2l1X3NldChHSVVJTlRIVFNFTEwsIG1hc2spOworCQkJZWxzZQorCQkJCWdpdV9jbGVhcihHSVVJTlRIVFNFTEwsIG1hc2spOworCQkJaWYgKGdpdV9mbGFncyAmIEdQSU9fSEFTX0lOVEVSUlVQVF9FREdFX1NFTEVDVCkgeworCQkJCXN3aXRjaCAodHJpZ2dlcikgeworCQkJCWNhc2UgSVJRX1RSSUdHRVJfRURHRV9GQUxMSU5HOgorCQkJCQlnaXVfc2V0KEdJVUZFREdFSU5ITCwgbWFzayk7CisJCQkJCWdpdV9jbGVhcihHSVVSRURHRUlOSEwsIG1hc2spOworCQkJCQlicmVhazsKKwkJCQljYXNlIElSUV9UUklHR0VSX0VER0VfUklTSU5HOgorCQkJCQlnaXVfY2xlYXIoR0lVRkVER0VJTkhMLCBtYXNrKTsKKwkJCQkJZ2l1X3NldChHSVVSRURHRUlOSEwsIG1hc2spOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlnaXVfc2V0KEdJVUZFREdFSU5ITCwgbWFzayk7CisJCQkJCWdpdV9zZXQoR0lVUkVER0VJTkhMLCBtYXNrKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKEdJVV9JUlEocGluKSwKKwkJCQkJCSAmZ2l1aW50X2xvd19pcnFfY2hpcCwKKwkJCQkJCSBoYW5kbGVfZWRnZV9pcnEpOworCQl9IGVsc2UgeworCQkJZ2l1X2NsZWFyKEdJVUlOVFRZUEwsIG1hc2spOworCQkJZ2l1X2NsZWFyKEdJVUlOVEhUU0VMTCwgbWFzayk7CisJCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoR0lVX0lSUShwaW4pLAorCQkJCQkJICZnaXVpbnRfbG93X2lycV9jaGlwLAorCQkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOworCQl9CisJCWdpdV93cml0ZShHSVVJTlRTVEFUTCwgbWFzayk7CisJfSBlbHNlIGlmIChwaW4gPCBHSVVJTlRfSElHSF9NQVgpIHsKKwkJbWFzayA9IDEgPDwgKHBpbiAtIEdJVUlOVF9ISUdIX09GRlNFVCk7CisJCWlmICh0cmlnZ2VyICE9IElSUV9UUklHR0VSX0xFVkVMKSB7CisJCQlnaXVfc2V0KEdJVUlOVFRZUEgsIG1hc2spOworCQkJaWYgKHNpZ25hbCA9PSBJUlFfU0lHTkFMX0hPTEQpCisJCQkJZ2l1X3NldChHSVVJTlRIVFNFTEgsIG1hc2spOworCQkJZWxzZQorCQkJCWdpdV9jbGVhcihHSVVJTlRIVFNFTEgsIG1hc2spOworCQkJaWYgKGdpdV9mbGFncyAmIEdQSU9fSEFTX0lOVEVSUlVQVF9FREdFX1NFTEVDVCkgeworCQkJCXN3aXRjaCAodHJpZ2dlcikgeworCQkJCWNhc2UgSVJRX1RSSUdHRVJfRURHRV9GQUxMSU5HOgorCQkJCQlnaXVfc2V0KEdJVUZFREdFSU5ISCwgbWFzayk7CisJCQkJCWdpdV9jbGVhcihHSVVSRURHRUlOSEgsIG1hc2spOworCQkJCQlicmVhazsKKwkJCQljYXNlIElSUV9UUklHR0VSX0VER0VfUklTSU5HOgorCQkJCQlnaXVfY2xlYXIoR0lVRkVER0VJTkhILCBtYXNrKTsKKwkJCQkJZ2l1X3NldChHSVVSRURHRUlOSEgsIG1hc2spOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlnaXVfc2V0KEdJVUZFREdFSU5ISCwgbWFzayk7CisJCQkJCWdpdV9zZXQoR0lVUkVER0VJTkhILCBtYXNrKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKEdJVV9JUlEocGluKSwKKwkJCQkJCSAmZ2l1aW50X2hpZ2hfaXJxX2NoaXAsCisJCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJfSBlbHNlIHsKKwkJCWdpdV9jbGVhcihHSVVJTlRUWVBILCBtYXNrKTsKKwkJCWdpdV9jbGVhcihHSVVJTlRIVFNFTEgsIG1hc2spOworCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKEdJVV9JUlEocGluKSwKKwkJCQkJCSAmZ2l1aW50X2hpZ2hfaXJxX2NoaXAsCisJCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CisJCX0KKwkJZ2l1X3dyaXRlKEdJVUlOVFNUQVRILCBtYXNrKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2cjQxeHhfc2V0X2lycV90cmlnZ2VyKTsKKwordm9pZCB2cjQxeHhfc2V0X2lycV9sZXZlbCh1bnNpZ25lZCBpbnQgcGluLCBpcnFfbGV2ZWxfdCBsZXZlbCkKK3sKKwl1MTYgbWFzazsKKworCWlmIChwaW4gPCBHSVVJTlRfSElHSF9PRkZTRVQpIHsKKwkJbWFzayA9IDEgPDwgcGluOworCQlpZiAobGV2ZWwgPT0gSVJRX0xFVkVMX0hJR0gpCisJCQlnaXVfc2V0KEdJVUlOVEFMU0VMTCwgbWFzayk7CisJCWVsc2UKKwkJCWdpdV9jbGVhcihHSVVJTlRBTFNFTEwsIG1hc2spOworCQlnaXVfd3JpdGUoR0lVSU5UU1RBVEwsIG1hc2spOworCX0gZWxzZSBpZiAocGluIDwgR0lVSU5UX0hJR0hfTUFYKSB7CisJCW1hc2sgPSAxIDw8IChwaW4gLSBHSVVJTlRfSElHSF9PRkZTRVQpOworCQlpZiAobGV2ZWwgPT0gSVJRX0xFVkVMX0hJR0gpCisJCQlnaXVfc2V0KEdJVUlOVEFMU0VMSCwgbWFzayk7CisJCWVsc2UKKwkJCWdpdV9jbGVhcihHSVVJTlRBTFNFTEgsIG1hc2spOworCQlnaXVfd3JpdGUoR0lVSU5UU1RBVEgsIG1hc2spOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZyNDF4eF9zZXRfaXJxX2xldmVsKTsKKworc3RhdGljIGludCBnaXVfc2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sIGludCBkaXIpCit7CisJdTE2IG9mZnNldCwgbWFzaywgcmVnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocGluID49IGNoaXAtPm5ncGlvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwaW4gPCAxNikgeworCQlvZmZzZXQgPSBHSVVJT1NFTEw7CisJCW1hc2sgPSAxIDw8IHBpbjsKKwl9IGVsc2UgaWYgKHBpbiA8IDMyKSB7CisJCW9mZnNldCA9IEdJVUlPU0VMSDsKKwkJbWFzayA9IDEgPDwgKHBpbiAtIDE2KTsKKwl9IGVsc2UgeworCQlpZiAoZ2l1X2ZsYWdzICYgR1BJT19IQVNfT1VUUFVUX0VOQUJMRSkgeworCQkJb2Zmc2V0ID0gR0lVUE9EQVRFTjsKKwkJCW1hc2sgPSAxIDw8IChwaW4gLSAzMik7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHBpbikgeworCQkJY2FzZSA0ODoKKwkJCQlvZmZzZXQgPSBHSVVQT0RBVEg7CisJCQkJbWFzayA9IFBJT0VOMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDk6CisJCQkJb2Zmc2V0ID0gR0lVUE9EQVRIOworCQkJCW1hc2sgPSBQSU9FTjE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdpdV9sb2NrLCBmbGFncyk7CisKKwlyZWcgPSBnaXVfcmVhZChvZmZzZXQpOworCWlmIChkaXIgPT0gR1BJT19PVVRQVVQpCisJCXJlZyB8PSBtYXNrOworCWVsc2UKKwkJcmVnICY9IH5tYXNrOworCWdpdV93cml0ZShvZmZzZXQsIHJlZyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnaXVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB2cjQxeHhfZ3Bpb19wdWxsdXBkb3duKHVuc2lnbmVkIGludCBwaW4sIGdwaW9fcHVsbF90IHB1bGwpCit7CisJdTE2IHJlZywgbWFzazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKChnaXVfZmxhZ3MgJiBHUElPX0hBU19QVUxMVVBET1dOX0lPKSAhPSBHUElPX0hBU19QVUxMVVBET1dOX0lPKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHBpbiA+PSAxNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYXNrID0gMSA8PCBwaW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2l1X2xvY2ssIGZsYWdzKTsKKworCWlmIChwdWxsID09IEdQSU9fUFVMTF9VUCB8fCBwdWxsID09IEdQSU9fUFVMTF9ET1dOKSB7CisJCXJlZyA9IGdpdV9yZWFkKEdJVVRFUk1VUEROKTsKKwkJaWYgKHB1bGwgPT0gR1BJT19QVUxMX1VQKQorCQkJcmVnIHw9IG1hc2s7CisJCWVsc2UKKwkJCXJlZyAmPSB+bWFzazsKKwkJZ2l1X3dyaXRlKEdJVVRFUk1VUEROLCByZWcpOworCisJCXJlZyA9IGdpdV9yZWFkKEdJVVVTRVVQRE4pOworCQlyZWcgfD0gbWFzazsKKwkJZ2l1X3dyaXRlKEdJVVVTRVVQRE4sIHJlZyk7CisJfSBlbHNlIHsKKwkJcmVnID0gZ2l1X3JlYWQoR0lVVVNFVVBETik7CisJCXJlZyAmPSB+bWFzazsKKwkJZ2l1X3dyaXRlKEdJVVVTRVVQRE4sIHJlZyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2l1X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodnI0MXh4X2dwaW9fcHVsbHVwZG93bik7CisKK3N0YXRpYyBpbnQgdnI0MXh4X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbikKK3sKKwl1MTYgcmVnLCBtYXNrOworCisJaWYgKHBpbiA+PSBjaGlwLT5uZ3BpbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGluIDwgMTYpIHsKKwkJcmVnID0gZ2l1X3JlYWQoR0lVUElPREwpOworCQltYXNrID0gMSA8PCBwaW47CisJfSBlbHNlIGlmIChwaW4gPCAzMikgeworCQlyZWcgPSBnaXVfcmVhZChHSVVQSU9ESCk7CisJCW1hc2sgPSAxIDw8IChwaW4gLSAxNik7CisJfSBlbHNlIGlmIChwaW4gPCA0OCkgeworCQlyZWcgPSBnaXVfcmVhZChHSVVQT0RBVEwpOworCQltYXNrID0gMSA8PCAocGluIC0gMzIpOworCX0gZWxzZSB7CisJCXJlZyA9IGdpdV9yZWFkKEdJVVBPREFUSCk7CisJCW1hc2sgPSAxIDw8IChwaW4gLSA0OCk7CisJfQorCisJaWYgKHJlZyAmIG1hc2spCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZyNDF4eF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sCisJCQkgICAgaW50IHZhbHVlKQoreworCXUxNiBvZmZzZXQsIG1hc2ssIHJlZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHBpbiA+PSBjaGlwLT5uZ3BpbykKKwkJcmV0dXJuOworCisJaWYgKHBpbiA8IDE2KSB7CisJCW9mZnNldCA9IEdJVVBJT0RMOworCQltYXNrID0gMSA8PCBwaW47CisJfSBlbHNlIGlmIChwaW4gPCAzMikgeworCQlvZmZzZXQgPSBHSVVQSU9ESDsKKwkJbWFzayA9IDEgPDwgKHBpbiAtIDE2KTsKKwl9IGVsc2UgaWYgKHBpbiA8IDQ4KSB7CisJCW9mZnNldCA9IEdJVVBPREFUTDsKKwkJbWFzayA9IDEgPDwgKHBpbiAtIDMyKTsKKwl9IGVsc2UgeworCQlvZmZzZXQgPSBHSVVQT0RBVEg7CisJCW1hc2sgPSAxIDw8IChwaW4gLSA0OCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdpdV9sb2NrLCBmbGFncyk7CisKKwlyZWcgPSBnaXVfcmVhZChvZmZzZXQpOworCWlmICh2YWx1ZSkKKwkJcmVnIHw9IG1hc2s7CisJZWxzZQorCQlyZWcgJj0gfm1hc2s7CisJZ2l1X3dyaXRlKG9mZnNldCwgcmVnKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdpdV9sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIGludCB2cjQxeHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBnaXVfc2V0X2RpcmVjdGlvbihjaGlwLCBvZmZzZXQsIEdQSU9fSU5QVVQpOworfQorCitzdGF0aWMgaW50IHZyNDF4eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LAorCQkJCWludCB2YWx1ZSkKK3sKKwl2cjQxeHhfZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7CisKKwlyZXR1cm4gZ2l1X3NldF9kaXJlY3Rpb24oY2hpcCwgb2Zmc2V0LCBHUElPX09VVFBVVCk7Cit9CisKK3N0YXRpYyBpbnQgdnI0MXh4X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlpZiAob2Zmc2V0ID49IGNoaXAtPm5ncGlvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBHSVVfSVJRX0JBU0UgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHZyNDF4eF9ncGlvX2NoaXAgPSB7CisJLmxhYmVsCQkJPSAidnI0MXh4IiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5kaXJlY3Rpb25faW5wdXQJPSB2cjQxeHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCisJLmdldAkJCT0gdnI0MXh4X2dwaW9fZ2V0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gdnI0MXh4X2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkuc2V0CQkJPSB2cjQxeHhfZ3Bpb19zZXQsCisJLnRvX2lycQkJCT0gdnI0MXh4X2dwaW9fdG9faXJxLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZ2l1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdW5zaWduZWQgaW50IHRyaWdnZXIsIGksIHBpbjsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXA7CisJaW50IGlycSwgcmV0dmFsOworCisJc3dpdGNoIChwZGV2LT5pZCkgeworCWNhc2UgR1BJT181MFBJTlNfUFVMTFVQRE9XTjoKKwkJZ2l1X2ZsYWdzID0gR1BJT19IQVNfUFVMTFVQRE9XTl9JTzsKKwkJdnI0MXh4X2dwaW9fY2hpcC5uZ3BpbyA9IDUwOworCQlicmVhazsKKwljYXNlIEdQSU9fMzZQSU5TOgorCQl2cjQxeHhfZ3Bpb19jaGlwLm5ncGlvID0gMzY7CisJCWJyZWFrOworCWNhc2UgR1BJT180OFBJTlNfRURHRV9TRUxFQ1Q6CisJCWdpdV9mbGFncyA9IEdQSU9fSEFTX0lOVEVSUlVQVF9FREdFX1NFTEVDVDsKKwkJdnI0MXh4X2dwaW9fY2hpcC5uZ3BpbyA9IDQ4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJHSVU6IHVua25vd24gSUQgJWRcbiIsIHBkZXYtPmlkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FQlVTWTsKKworCWdpdV9iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghZ2l1X2Jhc2UpCisJCXJldHVybiAtRU5PTUVNOworCisJdnI0MXh4X2dwaW9fY2hpcC5kZXYgPSAmcGRldi0+ZGV2OworCisJcmV0dmFsID0gZ3Bpb2NoaXBfYWRkKCZ2cjQxeHhfZ3Bpb19jaGlwKTsKKworCWdpdV93cml0ZShHSVVJTlRFTkwsIDApOworCWdpdV93cml0ZShHSVVJTlRFTkgsIDApOworCisJdHJpZ2dlciA9IGdpdV9yZWFkKEdJVUlOVFRZUEgpIDw8IDE2OworCXRyaWdnZXIgfD0gZ2l1X3JlYWQoR0lVSU5UVFlQTCk7CisJZm9yIChpID0gR0lVX0lSUV9CQVNFOyBpIDw9IEdJVV9JUlFfTEFTVDsgaSsrKSB7CisJCXBpbiA9IEdQSU9fUElOX09GX0lSUShpKTsKKwkJaWYgKHBpbiA8IEdJVUlOVF9ISUdIX09GRlNFVCkKKwkJCWNoaXAgPSAmZ2l1aW50X2xvd19pcnFfY2hpcDsKKwkJZWxzZQorCQkJY2hpcCA9ICZnaXVpbnRfaGlnaF9pcnFfY2hpcDsKKworCQlpZiAodHJpZ2dlciAmICgxIDw8IHBpbikpCisJCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgY2hpcCwgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJZWxzZQorCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksIGNoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOworCisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCB8fCBpcnEgPj0gbnJfaXJxcykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiBjYXNjYWRlX2lycShpcnEsIGdpdV9nZXRfaXJxKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZ2l1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWlmIChnaXVfYmFzZSkgeworCQlpb3VubWFwKGdpdV9iYXNlKTsKKwkJZ2l1X2Jhc2UgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBnaXVfZGV2aWNlX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gZ2l1X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZ2l1X3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gIkdJVSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB2cjQxeHhfZ2l1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZnaXVfZGV2aWNlX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2cjQxeHhfZ2l1X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ2l1X2RldmljZV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh2cjQxeHhfZ2l1X2luaXQpOworbW9kdWxlX2V4aXQodnI0MXh4X2dpdV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby92eDg1NV9ncGlvLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby12eDg1NS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2dwaW8vdng4NTVfZ3Bpby5jCnJlbmFtZSB0byBkcml2ZXJzL2dwaW8vZ3Bpby12eDg1NS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzMXguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODMxeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjk0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzMXguYwpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIGdwaW9saWIgc3VwcG9ydCBmb3IgV29sZnNvbiBXTTgzMXggUE1JQ3MKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvcGRhdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2lycS5oPgorCitzdHJ1Y3Qgd204MzF4X2dwaW8geworCXN0cnVjdCB3bTgzMXggKndtODMxeDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHdtODMxeF9ncGlvICp0b193bTgzMXhfZ3BpbyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKQoreworCXJldHVybiBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHdtODMxeF9ncGlvLCBncGlvX2NoaXApOworfQorCitzdGF0aWMgaW50IHdtODMxeF9ncGlvX2RpcmVjdGlvbl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHdtODMxeF9ncGlvICp3bTgzMXhfZ3BpbyA9IHRvX3dtODMxeF9ncGlvKGNoaXApOworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IHdtODMxeF9ncGlvLT53bTgzMXg7CisJaW50IHZhbCA9IFdNODMxWF9HUE5fRElSOworCisJaWYgKHdtODMxeC0+aGFzX2dwaW9fZW5hKQorCQl2YWwgfD0gV004MzFYX0dQTl9UUkk7CisKKwlyZXR1cm4gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0dQSU8xX0NPTlRST0wgKyBvZmZzZXQsCisJCQkgICAgICAgV004MzFYX0dQTl9ESVIgfCBXTTgzMVhfR1BOX1RSSSB8CisJCQkgICAgICAgV004MzFYX0dQTl9GTl9NQVNLLCB2YWwpOworfQorCitzdGF0aWMgaW50IHdtODMxeF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHdtODMxeF9ncGlvICp3bTgzMXhfZ3BpbyA9IHRvX3dtODMxeF9ncGlvKGNoaXApOworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IHdtODMxeF9ncGlvLT53bTgzMXg7CisJaW50IHJldDsKKworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9HUElPX0xFVkVMKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChyZXQgJiAxIDw8IG9mZnNldCkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd204MzF4X2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCB3bTgzMXhfZ3BpbyAqd204MzF4X2dwaW8gPSB0b193bTgzMXhfZ3BpbyhjaGlwKTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfZ3Bpby0+d204MzF4OworCisJd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0dQSU9fTEVWRUwsIDEgPDwgb2Zmc2V0LAorCQkJdmFsdWUgPDwgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCB3bTgzMXhfZ3Bpb19kaXJlY3Rpb25fb3V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgd204MzF4X2dwaW8gKndtODMxeF9ncGlvID0gdG9fd204MzF4X2dwaW8oY2hpcCk7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gd204MzF4X2dwaW8tPndtODMxeDsKKwlpbnQgdmFsID0gMDsKKwlpbnQgcmV0OworCisJaWYgKHdtODMxeC0+aGFzX2dwaW9fZW5hKQorCQl2YWwgfD0gV004MzFYX0dQTl9UUkk7CisKKwlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfR1BJTzFfQ09OVFJPTCArIG9mZnNldCwKKwkJCSAgICAgIFdNODMxWF9HUE5fRElSIHwgV004MzFYX0dQTl9UUkkgfAorCQkJICAgICAgV004MzFYX0dQTl9GTl9NQVNLLCB2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQ2FuIG9ubHkgc2V0IEdQSU8gc3RhdGUgb25jZSBpdCdzIGluIG91dHB1dCBtb2RlICovCisJd204MzF4X2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204MzF4X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgd204MzF4X2dwaW8gKndtODMxeF9ncGlvID0gdG9fd204MzF4X2dwaW8oY2hpcCk7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gd204MzF4X2dwaW8tPndtODMxeDsKKworCWlmICghd204MzF4LT5pcnFfYmFzZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gd204MzF4LT5pcnFfYmFzZSArIFdNODMxWF9JUlFfR1BJT18xICsgb2Zmc2V0OworfQorCitzdGF0aWMgaW50IHdtODMxeF9ncGlvX3NldF9kZWJvdW5jZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkJICAgIHVuc2lnbmVkIGRlYm91bmNlKQoreworCXN0cnVjdCB3bTgzMXhfZ3BpbyAqd204MzF4X2dwaW8gPSB0b193bTgzMXhfZ3BpbyhjaGlwKTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfZ3Bpby0+d204MzF4OworCWludCByZWcgPSBXTTgzMVhfR1BJTzFfQ09OVFJPTCArIG9mZnNldDsKKwlpbnQgcmV0LCBmbjsKKworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIHJlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHJldCAmIFdNODMxWF9HUE5fRk5fTUFTSykgeworCWNhc2UgMDoKKwljYXNlIDE6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIE5vdCBpbiBHUElPIG1vZGUgKi8KKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoZGVib3VuY2UgPj0gMzIgJiYgZGVib3VuY2UgPD0gNjQpCisJCWZuID0gMDsKKwllbHNlIGlmIChkZWJvdW5jZSA+PSA0MDAwICYmIGRlYm91bmNlIDw9IDgwMDApCisJCWZuID0gMTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIHJlZywgV004MzFYX0dQTl9GTl9NQVNLLCBmbik7Cit9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3N0YXRpYyB2b2lkIHdtODMxeF9ncGlvX2RiZ19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgd204MzF4X2dwaW8gKndtODMxeF9ncGlvID0gdG9fd204MzF4X2dwaW8oY2hpcCk7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gd204MzF4X2dwaW8tPndtODMxeDsKKwlpbnQgaSwgdHJpc3RhdGVkOworCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm5ncGlvOyBpKyspIHsKKwkJaW50IGdwaW8gPSBpICsgY2hpcC0+YmFzZTsKKwkJaW50IHJlZzsKKwkJY29uc3QgY2hhciAqbGFiZWwsICpwdWxsLCAqcG93ZXJkb21haW47CisKKwkJLyogV2UgcmVwb3J0IHRoZSBHUElPIGV2ZW4gaWYgaXQncyBub3QgcmVxdWVzdGVkIHNpbmNlCisJCSAqIHdlJ3JlIGFsc28gcmVwb3J0aW5nIHRoaW5ncyBsaWtlIGFsdGVybmF0ZQorCQkgKiBmdW5jdGlvbnMgd2hpY2ggYXBwbHkgZXZlbiB3aGVuIHRoZSBHUElPIGlzIG5vdCBpbgorCQkgKiB1c2UgYXMgYSBHUElPLgorCQkgKi8KKwkJbGFiZWwgPSBncGlvY2hpcF9pc19yZXF1ZXN0ZWQoY2hpcCwgaSk7CisJCWlmICghbGFiZWwpCisJCQlsYWJlbCA9ICJVbnJlcXVlc3RlZCI7CisKKwkJc2VxX3ByaW50ZihzLCAiIGdwaW8tJS0zZCAoJS0yMC4yMHMpICIsIGdwaW8sIGxhYmVsKTsKKworCQlyZWcgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfR1BJTzFfQ09OVFJPTCArIGkpOworCQlpZiAocmVnIDwgMCkgeworCQkJZGV2X2Vycih3bTgzMXgtPmRldiwKKwkJCQkiR1BJTyBjb250cm9sICVkIHJlYWQgZmFpbGVkOiAlZFxuIiwKKwkJCQlncGlvLCByZWcpOworCQkJc2VxX3ByaW50ZihzLCAiXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChyZWcgJiBXTTgzMVhfR1BOX1BVTExfTUFTSykgeworCQljYXNlIFdNODMxWF9HUElPX1BVTExfTk9ORToKKwkJCXB1bGwgPSAibm9wdWxsIjsKKwkJCWJyZWFrOworCQljYXNlIFdNODMxWF9HUElPX1BVTExfRE9XTjoKKwkJCXB1bGwgPSAicHVsbGRvd24iOworCQkJYnJlYWs7CisJCWNhc2UgV004MzFYX0dQSU9fUFVMTF9VUDoKKwkJCXB1bGwgPSAicHVsbHVwIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHVsbCA9ICJJTlZBTElEIFBVTEwiOworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKGkgKyAxKSB7CisJCWNhc2UgMSAuLi4gMzoKKwkJY2FzZSA3IC4uLiA5OgorCQkJaWYgKHJlZyAmIFdNODMxWF9HUE5fUFdSX0RPTSkKKwkJCQlwb3dlcmRvbWFpbiA9ICJWUE1JQyI7CisJCQllbHNlCisJCQkJcG93ZXJkb21haW4gPSAiREJWREQiOworCQkJYnJlYWs7CisKKwkJY2FzZSA0IC4uLiA2OgorCQljYXNlIDEwIC4uLiAxMjoKKwkJCWlmIChyZWcgJiBXTTgzMVhfR1BOX1BXUl9ET00pCisJCQkJcG93ZXJkb21haW4gPSAiU1lTVkREIjsKKwkJCWVsc2UKKwkJCQlwb3dlcmRvbWFpbiA9ICJEQlZERCI7CisJCQlicmVhazsKKworCQljYXNlIDEzIC4uLiAxNjoKKwkJCXBvd2VyZG9tYWluID0gIlRQVkREIjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdHJpc3RhdGVkID0gcmVnICYgV004MzFYX0dQTl9UUkk7CisJCWlmICh3bTgzMXgtPmhhc19ncGlvX2VuYSkKKwkJCXRyaXN0YXRlZCA9ICF0cmlzdGF0ZWQ7CisKKwkJc2VxX3ByaW50ZihzLCAiICVzICVzICVzICVzJXNcbiIKKwkJCSAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXMlcyAoMHglNHgpXG4iLAorCQkJICAgcmVnICYgV004MzFYX0dQTl9ESVIgPyAiaW4iIDogIm91dCIsCisJCQkgICB3bTgzMXhfZ3Bpb19nZXQoY2hpcCwgaSkgPyAiaGlnaCIgOiAibG93IiwKKwkJCSAgIHB1bGwsCisJCQkgICBwb3dlcmRvbWFpbiwKKwkJCSAgIHJlZyAmIFdNODMxWF9HUE5fUE9MID8gIiIgOiAiIGludmVydGVkIiwKKwkJCSAgIHJlZyAmIFdNODMxWF9HUE5fT0QgPyAib3Blbi1kcmFpbiIgOiAiQ01PUyIsCisJCQkgICB0cmlzdGF0ZWQgPyAiIHRyaXN0YXRlZCIgOiAiIiwKKwkJCSAgIHJlZyk7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgd204MzF4X2dwaW9fZGJnX3Nob3cgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CisJLmxhYmVsCQkJPSAid204MzF4IiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5kaXJlY3Rpb25faW5wdXQJPSB3bTgzMXhfZ3Bpb19kaXJlY3Rpb25faW4sCisJLmdldAkJCT0gd204MzF4X2dwaW9fZ2V0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gd204MzF4X2dwaW9fZGlyZWN0aW9uX291dCwKKwkuc2V0CQkJPSB3bTgzMXhfZ3Bpb19zZXQsCisJLnRvX2lycQkJCT0gd204MzF4X2dwaW9fdG9faXJxLAorCS5zZXRfZGVib3VuY2UJCT0gd204MzF4X2dwaW9fc2V0X2RlYm91bmNlLAorCS5kYmdfc2hvdwkJPSB3bTgzMXhfZ3Bpb19kYmdfc2hvdywKKwkuY2FuX3NsZWVwCQk9IDEsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTgzMXhfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgd204MzF4X3BkYXRhICpwZGF0YSA9IHdtODMxeC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB3bTgzMXhfZ3BpbyAqd204MzF4X2dwaW87CisJaW50IHJldDsKKworCXdtODMxeF9ncGlvID0ga3phbGxvYyhzaXplb2YoKndtODMxeF9ncGlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHdtODMxeF9ncGlvID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd204MzF4X2dwaW8tPndtODMxeCA9IHdtODMxeDsKKwl3bTgzMXhfZ3Bpby0+Z3Bpb19jaGlwID0gdGVtcGxhdGVfY2hpcDsKKwl3bTgzMXhfZ3Bpby0+Z3Bpb19jaGlwLm5ncGlvID0gd204MzF4LT5udW1fZ3BpbzsKKwl3bTgzMXhfZ3Bpby0+Z3Bpb19jaGlwLmRldiA9ICZwZGV2LT5kZXY7CisJaWYgKHBkYXRhICYmIHBkYXRhLT5ncGlvX2Jhc2UpCisJCXdtODMxeF9ncGlvLT5ncGlvX2NoaXAuYmFzZSA9IHBkYXRhLT5ncGlvX2Jhc2U7CisJZWxzZQorCQl3bTgzMXhfZ3Bpby0+Z3Bpb19jaGlwLmJhc2UgPSAtMTsKKworCXJldCA9IGdwaW9jaGlwX2FkZCgmd204MzF4X2dwaW8tPmdwaW9fY2hpcCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIGdwaW9jaGlwLCAlZFxuIiwKKwkJCXJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdtODMxeF9ncGlvKTsKKworCXJldHVybiByZXQ7CisKK2VycjoKKwlrZnJlZSh3bTgzMXhfZ3Bpbyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgd204MzF4X2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdtODMxeF9ncGlvICp3bTgzMXhfZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJndtODMxeF9ncGlvLT5ncGlvX2NoaXApOworCWlmIChyZXQgPT0gMCkKKwkJa2ZyZWUod204MzF4X2dwaW8pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd204MzF4X2dwaW9fZHJpdmVyID0geworCS5kcml2ZXIubmFtZQk9ICJ3bTgzMXgtZ3BpbyIsCisJLmRyaXZlci5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5wcm9iZQkJPSB3bTgzMXhfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODMxeF9ncGlvX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3bTgzMXhfZ3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd204MzF4X2dwaW9fZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbCh3bTgzMXhfZ3Bpb19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHdtODMxeF9ncGlvX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmd204MzF4X2dwaW9fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHdtODMxeF9ncGlvX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR1BJTyBpbnRlcmZhY2UgZm9yIFdNODMxeCBQTUlDcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp3bTgzMXgtZ3BpbyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8td204MzUwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzNTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDZhZjUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8td204MzUwLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBncGlvbGliIHN1cHBvcnQgZm9yIFdvbGZzb24gV004MzV4IFBNSUNzCisgKgorICogQ29weXJpZ2h0IDIwMDkgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBBdXRob3I6IE1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL2dwaW8uaD4KKworc3RydWN0IHdtODM1MF9ncGlvX2RhdGEgeworCXN0cnVjdCB3bTgzNTAgKndtODM1MDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHdtODM1MF9ncGlvX2RhdGEgKnRvX3dtODM1MF9ncGlvKHN0cnVjdCBncGlvX2NoaXAgKmNoaXApCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3Qgd204MzUwX2dwaW9fZGF0YSwgZ3Bpb19jaGlwKTsKK30KKworc3RhdGljIGludCB3bTgzNTBfZ3Bpb19kaXJlY3Rpb25faW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCB3bTgzNTBfZ3Bpb19kYXRhICp3bTgzNTBfZ3BpbyA9IHRvX3dtODM1MF9ncGlvKGNoaXApOworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHdtODM1MF9ncGlvLT53bTgzNTA7CisKKwlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0dQSU9fQ09ORklHVVJBVElPTl9JX08sCisJCQkgICAgICAgMSA8PCBvZmZzZXQpOworfQorCitzdGF0aWMgaW50IHdtODM1MF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHdtODM1MF9ncGlvX2RhdGEgKndtODM1MF9ncGlvID0gdG9fd204MzUwX2dwaW8oY2hpcCk7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gd204MzUwX2dwaW8tPndtODM1MDsKKwlpbnQgcmV0OworCisJcmV0ID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0dQSU9fTEVWRUwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHJldCAmICgxIDw8IG9mZnNldCkpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdtODM1MF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgd204MzUwX2dwaW9fZGF0YSAqd204MzUwX2dwaW8gPSB0b193bTgzNTBfZ3BpbyhjaGlwKTsKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSB3bTgzNTBfZ3Bpby0+d204MzUwOworCisJaWYgKHZhbHVlKQorCQl3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfR1BJT19MRVZFTCwgMSA8PCBvZmZzZXQpOworCWVsc2UKKwkJd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfR1BJT19MRVZFTCwgMSA8PCBvZmZzZXQpOworfQorCitzdGF0aWMgaW50IHdtODM1MF9ncGlvX2RpcmVjdGlvbl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCB3bTgzNTBfZ3Bpb19kYXRhICp3bTgzNTBfZ3BpbyA9IHRvX3dtODM1MF9ncGlvKGNoaXApOworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHdtODM1MF9ncGlvLT53bTgzNTA7CisJaW50IHJldDsKKworCXJldCA9IHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0dQSU9fQ09ORklHVVJBVElPTl9JX08sCisJCQkJMSA8PCBvZmZzZXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogRG9uJ3QgaGF2ZSBhbiBhdG9taWMgZGlyZWN0aW9uL3ZhbHVlIHNldHVwICovCisJd204MzUwX2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgd204MzUwX2dwaW9fZGF0YSAqd204MzUwX2dwaW8gPSB0b193bTgzNTBfZ3BpbyhjaGlwKTsKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSB3bTgzNTBfZ3Bpby0+d204MzUwOworCisJaWYgKCF3bTgzNTAtPmlycV9iYXNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB3bTgzNTAtPmlycV9iYXNlICsgV004MzUwX0lSUV9HUElPKG9mZnNldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CisJLmxhYmVsCQkJPSAid204MzUwIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5kaXJlY3Rpb25faW5wdXQJPSB3bTgzNTBfZ3Bpb19kaXJlY3Rpb25faW4sCisJLmdldAkJCT0gd204MzUwX2dwaW9fZ2V0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gd204MzUwX2dwaW9fZGlyZWN0aW9uX291dCwKKwkuc2V0CQkJPSB3bTgzNTBfZ3Bpb19zZXQsCisJLnRvX2lycQkJCT0gd204MzUwX2dwaW9fdG9faXJxLAorCS5jYW5fc2xlZXAJCT0gMSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdtODM1MF9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCB3bTgzNTBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSB3bTgzNTAtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgd204MzUwX2dwaW9fZGF0YSAqd204MzUwX2dwaW87CisJaW50IHJldDsKKworCXdtODM1MF9ncGlvID0ga3phbGxvYyhzaXplb2YoKndtODM1MF9ncGlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHdtODM1MF9ncGlvID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd204MzUwX2dwaW8tPndtODM1MCA9IHdtODM1MDsKKwl3bTgzNTBfZ3Bpby0+Z3Bpb19jaGlwID0gdGVtcGxhdGVfY2hpcDsKKwl3bTgzNTBfZ3Bpby0+Z3Bpb19jaGlwLm5ncGlvID0gMTM7CisJd204MzUwX2dwaW8tPmdwaW9fY2hpcC5kZXYgPSAmcGRldi0+ZGV2OworCWlmIChwZGF0YSAmJiBwZGF0YS0+Z3Bpb19iYXNlKQorCQl3bTgzNTBfZ3Bpby0+Z3Bpb19jaGlwLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOworCWVsc2UKKwkJd204MzUwX2dwaW8tPmdwaW9fY2hpcC5iYXNlID0gLTE7CisKKwlyZXQgPSBncGlvY2hpcF9hZGQoJndtODM1MF9ncGlvLT5ncGlvX2NoaXApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCByZWdpc3RlciBncGlvY2hpcCwgJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3bTgzNTBfZ3Bpbyk7CisKKwlyZXR1cm4gcmV0OworCitlcnI6CisJa2ZyZWUod204MzUwX2dwaW8pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHdtODM1MF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3bTgzNTBfZ3Bpb19kYXRhICp3bTgzNTBfZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJndtODM1MF9ncGlvLT5ncGlvX2NoaXApOworCWlmIChyZXQgPT0gMCkKKwkJa2ZyZWUod204MzUwX2dwaW8pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd204MzUwX2dwaW9fZHJpdmVyID0geworCS5kcml2ZXIubmFtZQk9ICJ3bTgzNTAtZ3BpbyIsCisJLmRyaXZlci5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5wcm9iZQkJPSB3bTgzNTBfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODM1MF9ncGlvX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3bTgzNTBfZ3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd204MzUwX2dwaW9fZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbCh3bTgzNTBfZ3Bpb19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHdtODM1MF9ncGlvX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmd204MzUwX2dwaW9fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHdtODM1MF9ncGlvX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR1BJTyBpbnRlcmZhY2UgZm9yIFdNODM1MCBQTUlDcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp3bTgzNTAtZ3BpbyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8td204OTk0LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby13bTg5OTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjE5OGYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8td204OTk0LmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBncGlvbGliIHN1cHBvcnQgZm9yIFdvbGZzb24gV004OTk0CisgKgorICogQ29weXJpZ2h0IDIwMDkgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBBdXRob3I6IE1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd204OTk0L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204OTk0L3BkYXRhLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODk5NC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODk5NC9yZWdpc3RlcnMuaD4KKworc3RydWN0IHdtODk5NF9ncGlvIHsKKwlzdHJ1Y3Qgd204OTk0ICp3bTg5OTQ7CisJc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB3bTg5OTRfZ3BpbyAqdG9fd204OTk0X2dwaW8oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCB3bTg5OTRfZ3BpbywgZ3Bpb19jaGlwKTsKK30KKworc3RhdGljIGludCB3bTg5OTRfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgd204OTk0X2dwaW8gKndtODk5NF9ncGlvID0gdG9fd204OTk0X2dwaW8oY2hpcCk7CisJc3RydWN0IHdtODk5NCAqd204OTk0ID0gd204OTk0X2dwaW8tPndtODk5NDsKKworCXN3aXRjaCAod204OTk0LT50eXBlKSB7CisJY2FzZSBXTTg5NTg6CisJCXN3aXRjaCAob2Zmc2V0KSB7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCWNhc2UgNDoKKwkJY2FzZSA2OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTk0X2dwaW9fZGlyZWN0aW9uX2luKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgd204OTk0X2dwaW8gKndtODk5NF9ncGlvID0gdG9fd204OTk0X2dwaW8oY2hpcCk7CisJc3RydWN0IHdtODk5NCAqd204OTk0ID0gd204OTk0X2dwaW8tPndtODk5NDsKKworCXJldHVybiB3bTg5OTRfc2V0X2JpdHMod204OTk0LCBXTTg5OTRfR1BJT18xICsgb2Zmc2V0LAorCQkJICAgICAgIFdNODk5NF9HUE5fRElSLCBXTTg5OTRfR1BOX0RJUik7Cit9CisKK3N0YXRpYyBpbnQgd204OTk0X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgd204OTk0X2dwaW8gKndtODk5NF9ncGlvID0gdG9fd204OTk0X2dwaW8oY2hpcCk7CisJc3RydWN0IHdtODk5NCAqd204OTk0ID0gd204OTk0X2dwaW8tPndtODk5NDsKKwlpbnQgcmV0OworCisJcmV0ID0gd204OTk0X3JlZ19yZWFkKHdtODk5NCwgV004OTk0X0dQSU9fMSArIG9mZnNldCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAocmV0ICYgV004OTk0X0dQTl9MVkwpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTk0X2dwaW9fZGlyZWN0aW9uX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHdtODk5NF9ncGlvICp3bTg5OTRfZ3BpbyA9IHRvX3dtODk5NF9ncGlvKGNoaXApOworCXN0cnVjdCB3bTg5OTQgKndtODk5NCA9IHdtODk5NF9ncGlvLT53bTg5OTQ7CisKKwlyZXR1cm4gd204OTk0X3NldF9iaXRzKHdtODk5NCwgV004OTk0X0dQSU9fMSArIG9mZnNldCwKKwkJCSAgICAgICBXTTg5OTRfR1BOX0RJUiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHdtODk5NF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgd204OTk0X2dwaW8gKndtODk5NF9ncGlvID0gdG9fd204OTk0X2dwaW8oY2hpcCk7CisJc3RydWN0IHdtODk5NCAqd204OTk0ID0gd204OTk0X2dwaW8tPndtODk5NDsKKworCWlmICh2YWx1ZSkKKwkJdmFsdWUgPSBXTTg5OTRfR1BOX0xWTDsKKworCXdtODk5NF9zZXRfYml0cyh3bTg5OTQsIFdNODk5NF9HUElPXzEgKyBvZmZzZXQsIFdNODk5NF9HUE5fTFZMLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgd204OTk0X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgd204OTk0X2dwaW8gKndtODk5NF9ncGlvID0gdG9fd204OTk0X2dwaW8oY2hpcCk7CisJc3RydWN0IHdtODk5NCAqd204OTk0ID0gd204OTk0X2dwaW8tPndtODk5NDsKKworCWlmICghd204OTk0LT5pcnFfYmFzZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gd204OTk0LT5pcnFfYmFzZSArIG9mZnNldDsKK30KKworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgdm9pZCB3bTg5OTRfZ3Bpb19kYmdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBncGlvX2NoaXAgKmNoaXApCit7CisJc3RydWN0IHdtODk5NF9ncGlvICp3bTg5OTRfZ3BpbyA9IHRvX3dtODk5NF9ncGlvKGNoaXApOworCXN0cnVjdCB3bTg5OTQgKndtODk5NCA9IHdtODk5NF9ncGlvLT53bTg5OTQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bmdwaW87IGkrKykgeworCQlpbnQgZ3BpbyA9IGkgKyBjaGlwLT5iYXNlOworCQlpbnQgcmVnOworCQljb25zdCBjaGFyICpsYWJlbDsKKworCQkvKiBXZSByZXBvcnQgdGhlIEdQSU8gZXZlbiBpZiBpdCdzIG5vdCByZXF1ZXN0ZWQgc2luY2UKKwkJICogd2UncmUgYWxzbyByZXBvcnRpbmcgdGhpbmdzIGxpa2UgYWx0ZXJuYXRlCisJCSAqIGZ1bmN0aW9ucyB3aGljaCBhcHBseSBldmVuIHdoZW4gdGhlIEdQSU8gaXMgbm90IGluCisJCSAqIHVzZSBhcyBhIEdQSU8uCisJCSAqLworCQlsYWJlbCA9IGdwaW9jaGlwX2lzX3JlcXVlc3RlZChjaGlwLCBpKTsKKwkJaWYgKCFsYWJlbCkKKwkJCWxhYmVsID0gIlVucmVxdWVzdGVkIjsKKworCQlzZXFfcHJpbnRmKHMsICIgZ3Bpby0lLTNkICglLTIwLjIwcykgIiwgZ3BpbywgbGFiZWwpOworCisJCXJlZyA9IHdtODk5NF9yZWdfcmVhZCh3bTg5OTQsIFdNODk5NF9HUElPXzEgKyBpKTsKKwkJaWYgKHJlZyA8IDApIHsKKwkJCWRldl9lcnIod204OTk0LT5kZXYsCisJCQkJIkdQSU8gY29udHJvbCAlZCByZWFkIGZhaWxlZDogJWRcbiIsCisJCQkJZ3BpbywgcmVnKTsKKwkJCXNlcV9wcmludGYocywgIlxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE5vIGRlY29kZSB5ZXQ7IG5vdGUgdGhhdCBHUElPMiBpcyBzcGVjaWFsICovCisJCXNlcV9wcmludGYocywgIigleClcbiIsIHJlZyk7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgd204OTk0X2dwaW9fZGJnX3Nob3cgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CisJLmxhYmVsCQkJPSAid204OTk0IiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5yZXF1ZXN0CQk9IHdtODk5NF9ncGlvX3JlcXVlc3QsCisJLmRpcmVjdGlvbl9pbnB1dAk9IHdtODk5NF9ncGlvX2RpcmVjdGlvbl9pbiwKKwkuZ2V0CQkJPSB3bTg5OTRfZ3Bpb19nZXQsCisJLmRpcmVjdGlvbl9vdXRwdXQJPSB3bTg5OTRfZ3Bpb19kaXJlY3Rpb25fb3V0LAorCS5zZXQJCQk9IHdtODk5NF9ncGlvX3NldCwKKwkudG9faXJxCQkJPSB3bTg5OTRfZ3Bpb190b19pcnEsCisJLmRiZ19zaG93CQk9IHdtODk5NF9ncGlvX2RiZ19zaG93LAorCS5jYW5fc2xlZXAJCT0gMSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdtODk5NF9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdtODk5NCAqd204OTk0ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCB3bTg5OTRfcGRhdGEgKnBkYXRhID0gd204OTk0LT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHdtODk5NF9ncGlvICp3bTg5OTRfZ3BpbzsKKwlpbnQgcmV0OworCisJd204OTk0X2dwaW8gPSBremFsbG9jKHNpemVvZigqd204OTk0X2dwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAod204OTk0X2dwaW8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bTg5OTRfZ3Bpby0+d204OTk0ID0gd204OTk0OworCXdtODk5NF9ncGlvLT5ncGlvX2NoaXAgPSB0ZW1wbGF0ZV9jaGlwOworCXdtODk5NF9ncGlvLT5ncGlvX2NoaXAubmdwaW8gPSBXTTg5OTRfR1BJT19NQVg7CisJd204OTk0X2dwaW8tPmdwaW9fY2hpcC5kZXYgPSAmcGRldi0+ZGV2OworCWlmIChwZGF0YSAmJiBwZGF0YS0+Z3Bpb19iYXNlKQorCQl3bTg5OTRfZ3Bpby0+Z3Bpb19jaGlwLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOworCWVsc2UKKwkJd204OTk0X2dwaW8tPmdwaW9fY2hpcC5iYXNlID0gLTE7CisKKwlyZXQgPSBncGlvY2hpcF9hZGQoJndtODk5NF9ncGlvLT5ncGlvX2NoaXApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCByZWdpc3RlciBncGlvY2hpcCwgJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3bTg5OTRfZ3Bpbyk7CisKKwlyZXR1cm4gcmV0OworCitlcnI6CisJa2ZyZWUod204OTk0X2dwaW8pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHdtODk5NF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3bTg5OTRfZ3BpbyAqd204OTk0X2dwaW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZ3bTg5OTRfZ3Bpby0+Z3Bpb19jaGlwKTsKKwlpZiAocmV0ID09IDApCisJCWtmcmVlKHdtODk5NF9ncGlvKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdtODk5NF9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyLm5hbWUJPSAid204OTk0LWdwaW8iLAorCS5kcml2ZXIub3duZXIJPSBUSElTX01PRFVMRSwKKwkucHJvYmUJCT0gd204OTk0X2dwaW9fcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTg5OTRfZ3Bpb19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd204OTk0X2dwaW9faW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndtODk5NF9ncGlvX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwod204OTk0X2dwaW9faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3bTg5OTRfZ3Bpb19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndtODk5NF9ncGlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh3bTg5OTRfZ3Bpb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdQSU8gaW50ZXJmYWNlIGZvciBXTTg5OTQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06d204OTk0LWdwaW8iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby94aWxpbnhfZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2dwaW8teGlsaW54LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvZ3Bpby94aWxpbnhfZ3Bpby5jCnJlbmFtZSB0byBkcml2ZXJzL2dwaW8vZ3Bpby14aWxpbnguYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2l0ODc2MWVfZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2l0ODc2MWVfZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGZjNDNjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3Bpby9pdDg3NjFlX2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKgotICogIGl0ODc2MV9ncGlvLmMgLSBHUElPIGludGVyZmFjZSBmb3IgSVQ4NzYxRSBTdXBlciBJL08gY2hpcAotICoKLSAqICBBdXRob3I6IERlbmlzIFR1cmlzY2hldiA8ZGVuaXNAY29tcHVsYWIuY28uaWw+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAyIGFzIHB1Ymxpc2hlZAotICogIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotCi0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotCi0jZGVmaW5lIFNJT19DSElQX0lECQkweDg3NjEKLSNkZWZpbmUgQ0hJUF9JRF9ISUdIX0JZVEUJMHgyMAotI2RlZmluZSBDSElQX0lEX0xPV19CWVRFCTB4MjEKLQotc3RhdGljIHU4IHBvcnRzWzJdID0geyAweDJlLCAweDRlIH07Ci1zdGF0aWMgdTggcG9ydDsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhzaW9fbG9jayk7Ci0KLSNkZWZpbmUgR1BJT19OQU1FCQkiaXQ4NzYxLWdwaW8iCi0jZGVmaW5lIEdQSU9fQkFfSElHSF9CWVRFCTB4NjAKLSNkZWZpbmUgR1BJT19CQV9MT1dfQllURQkweDYxCi0jZGVmaW5lIEdQSU9fSU9TSVpFCQk0Ci0jZGVmaW5lIEdQSU8xWF9JTwkJMHhmMAotI2RlZmluZSBHUElPMlhfSU8JCTB4ZjEKLQotc3RhdGljIHUxNiBncGlvX2JhOwotCi1zdGF0aWMgdTggcmVhZF9yZWcodTggYWRkciwgdTggcG9ydCkKLXsKLQlvdXRiKGFkZHIsIHBvcnQpOwotCXJldHVybiBpbmIocG9ydCArIDEpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZV9yZWcodTggZGF0YSwgdTggYWRkciwgdTggcG9ydCkKLXsKLQlvdXRiKGFkZHIsIHBvcnQpOwotCW91dGIoZGF0YSwgcG9ydCArIDEpOwotfQotCi1zdGF0aWMgdm9pZCBlbnRlcl9jb25mX21vZGUodTggcG9ydCkKLXsKLQlvdXRiKDB4ODcsIHBvcnQpOwotCW91dGIoMHg2MSwgcG9ydCk7Ci0Jb3V0YigweDU1LCBwb3J0KTsKLQlvdXRiKChwb3J0ID09IDB4MmUpID8gMHg1NSA6IDB4YWEsIHBvcnQpOwotfQotCi1zdGF0aWMgdm9pZCBleGl0X2NvbmZfbW9kZSh1OCBwb3J0KQotewotCW91dGIoMHgyLCBwb3J0KTsKLQlvdXRiKDB4MiwgcG9ydCArIDEpOwotfQotCi1zdGF0aWMgdm9pZCBlbnRlcl9ncGlvX21vZGUodTggcG9ydCkKLXsKLQl3cml0ZV9yZWcoMHgyLCAweDcsIHBvcnQpOwotfQotCi1zdGF0aWMgaW50IGl0ODc2MWVfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGdwaW9fbnVtKQotewotCXUxNiByZWc7Ci0JdTggYml0OwotCi0JYml0ID0gZ3Bpb19udW0gJSA4OwotCXJlZyA9IChncGlvX251bSA+PSA4KSA/IGdwaW9fYmEgKyAxIDogZ3Bpb19iYTsKLQotCXJldHVybiAhIShpbmIocmVnKSAmICgxIDw8IGJpdCkpOwotfQotCi1zdGF0aWMgaW50IGl0ODc2MWVfZ3Bpb19kaXJlY3Rpb25faW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGdwaW9fbnVtKQotewotCXU4IGN1cnJfZGlyczsKLQl1OCBpb19yZWcsIGJpdDsKLQotCWJpdCA9IGdwaW9fbnVtICUgODsKLQlpb19yZWcgPSAoZ3Bpb19udW0gPj0gOCkgPyBHUElPMlhfSU8gOiBHUElPMVhfSU87Ci0KLQlzcGluX2xvY2soJnNpb19sb2NrKTsKLQotCWVudGVyX2NvbmZfbW9kZShwb3J0KTsKLQllbnRlcl9ncGlvX21vZGUocG9ydCk7Ci0KLQljdXJyX2RpcnMgPSByZWFkX3JlZyhpb19yZWcsIHBvcnQpOwotCi0JaWYgKGN1cnJfZGlycyAmICgxIDw8IGJpdCkpCi0JCXdyaXRlX3JlZyhjdXJyX2RpcnMgJiB+KDEgPDwgYml0KSwgaW9fcmVnLCBwb3J0KTsKLQotCWV4aXRfY29uZl9tb2RlKHBvcnQpOwotCi0Jc3Bpbl91bmxvY2soJnNpb19sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaXQ4NzYxZV9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKLQkJCQl1bnNpZ25lZCBncGlvX251bSwgaW50IHZhbCkKLXsKLQl1OCBjdXJyX3ZhbHMsIGJpdDsKLQl1MTYgcmVnOwotCi0JYml0ID0gZ3Bpb19udW0gJSA4OwotCXJlZyA9IChncGlvX251bSA+PSA4KSA/IGdwaW9fYmEgKyAxIDogZ3Bpb19iYTsKLQotCXNwaW5fbG9jaygmc2lvX2xvY2spOwotCi0JY3Vycl92YWxzID0gaW5iKHJlZyk7Ci0JaWYgKHZhbCkKLQkJb3V0YihjdXJyX3ZhbHMgfCAoMSA8PCBiaXQpICwgcmVnKTsKLQllbHNlCi0JCW91dGIoY3Vycl92YWxzICYgfigxIDw8IGJpdCksIHJlZyk7Ci0KLQlzcGluX3VubG9jaygmc2lvX2xvY2spOwotfQotCi1zdGF0aWMgaW50IGl0ODc2MWVfZ3Bpb19kaXJlY3Rpb25fb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLAotCQkJCQl1bnNpZ25lZCBncGlvX251bSwgaW50IHZhbCkKLXsKLQl1OCBjdXJyX2RpcnMsIGlvX3JlZywgYml0OwotCi0JYml0ID0gZ3Bpb19udW0gJSA4OwotCWlvX3JlZyA9IChncGlvX251bSA+PSA4KSA/IEdQSU8yWF9JTyA6IEdQSU8xWF9JTzsKLQotCWl0ODc2MWVfZ3Bpb19zZXQoZ2MsIGdwaW9fbnVtLCB2YWwpOwotCi0Jc3Bpbl9sb2NrKCZzaW9fbG9jayk7Ci0KLQllbnRlcl9jb25mX21vZGUocG9ydCk7Ci0JZW50ZXJfZ3Bpb19tb2RlKHBvcnQpOwotCi0JY3Vycl9kaXJzID0gcmVhZF9yZWcoaW9fcmVnLCBwb3J0KTsKLQotCWlmICghKGN1cnJfZGlycyAmICgxIDw8IGJpdCkpKQotCQl3cml0ZV9yZWcoY3Vycl9kaXJzIHwgKDEgPDwgYml0KSwgaW9fcmVnLCBwb3J0KTsKLQotCWV4aXRfY29uZl9tb2RlKHBvcnQpOwotCi0Jc3Bpbl91bmxvY2soJnNpb19sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgaXQ4NzYxZV9ncGlvX2NoaXAgPSB7Ci0JLmxhYmVsCQkJPSBHUElPX05BTUUsCi0JLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkuZ2V0CQkJPSBpdDg3NjFlX2dwaW9fZ2V0LAotCS5kaXJlY3Rpb25faW5wdXQJPSBpdDg3NjFlX2dwaW9fZGlyZWN0aW9uX2luLAotCS5zZXQJCQk9IGl0ODc2MWVfZ3Bpb19zZXQsCi0JLmRpcmVjdGlvbl9vdXRwdXQJPSBpdDg3NjFlX2dwaW9fZGlyZWN0aW9uX291dCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGl0ODc2MWVfZ3Bpb19pbml0KHZvaWQpCi17Ci0JaW50IGksIGlkLCBlcnI7Ci0KLQkvKiBjaGlwIGFuZCBwb3J0IGRldGVjdGlvbiAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvcnRzKTsgaSsrKSB7Ci0JCXNwaW5fbG9jaygmc2lvX2xvY2spOwotCQllbnRlcl9jb25mX21vZGUocG9ydHNbaV0pOwotCi0JCWlkID0gKHJlYWRfcmVnKENISVBfSURfSElHSF9CWVRFLCBwb3J0c1tpXSkgPDwgOCkgKwotCQkJCXJlYWRfcmVnKENISVBfSURfTE9XX0JZVEUsIHBvcnRzW2ldKTsKLQotCQlleGl0X2NvbmZfbW9kZShwb3J0c1tpXSk7Ci0JCXNwaW5fdW5sb2NrKCZzaW9fbG9jayk7Ci0KLQkJaWYgKGlkID09IFNJT19DSElQX0lEKSB7Ci0JCQlwb3J0ID0gcG9ydHNbaV07Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmICghcG9ydCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBmZXRjaCBHUElPIGJhc2UgYWRkcmVzcyAqLwotCWVudGVyX2NvbmZfbW9kZShwb3J0KTsKLQllbnRlcl9ncGlvX21vZGUocG9ydCk7Ci0JZ3Bpb19iYSA9IChyZWFkX3JlZyhHUElPX0JBX0hJR0hfQllURSwgcG9ydCkgPDwgOCkgKwotCQkJCXJlYWRfcmVnKEdQSU9fQkFfTE9XX0JZVEUsIHBvcnQpOwotCWV4aXRfY29uZl9tb2RlKHBvcnQpOwotCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihncGlvX2JhLCBHUElPX0lPU0laRSwgR1BJT19OQU1FKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWl0ODc2MWVfZ3Bpb19jaGlwLmJhc2UgPSAtMTsKLQlpdDg3NjFlX2dwaW9fY2hpcC5uZ3BpbyA9IDE2OwotCi0JZXJyID0gZ3Bpb2NoaXBfYWRkKCZpdDg3NjFlX2dwaW9fY2hpcCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZ3Bpb2NoaXBfYWRkX2VycjsKLQotCXJldHVybiAwOwotCi1ncGlvY2hpcF9hZGRfZXJyOgotCXJlbGVhc2VfcmVnaW9uKGdwaW9fYmEsIEdQSU9fSU9TSVpFKTsKLQlncGlvX2JhID0gMDsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXQ4NzYxZV9ncGlvX2V4aXQodm9pZCkKLXsKLQlpZiAoZ3Bpb19iYSkgewotCQlpbnQgcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZpdDg3NjFlX2dwaW9fY2hpcCk7Ci0KLQkJV0FSTihyZXQsICIlcygpOiBncGlvY2hpcF9yZW1vdmUoKSBmYWlsZWQsIHJldD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQotCQlyZWxlYXNlX3JlZ2lvbihncGlvX2JhLCBHUElPX0lPU0laRSk7Ci0JCWdwaW9fYmEgPSAwOwotCX0KLX0KLW1vZHVsZV9pbml0KGl0ODc2MWVfZ3Bpb19pbml0KTsKLW1vZHVsZV9leGl0KGl0ODc2MWVfZ3Bpb19leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiRGVuaXMgVHVyaXNjaGV2IDxkZW5pc0Bjb21wdWxhYi5jby5pbD4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiR1BJTyBpbnRlcmZhY2UgZm9yIElUODc2MUUgU3VwZXIgSS9PIGNoaXAiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9sYW5nd2VsbF9ncGlvLmMgYi9kcml2ZXJzL2dwaW8vbGFuZ3dlbGxfZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDY1NzFlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3Bpby9sYW5nd2VsbF9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyogbGFuZ3dlbGxfZ3Bpby5jIE1vb3Jlc3Rvd24gcGxhdGZvcm0gTGFuZ3dlbGwgY2hpcCBHUElPIGRyaXZlcgotICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAwOSwgIEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLS8qIFN1cHBvcnRzOgotICogTW9vcmVzdG93biBwbGF0Zm9ybSBMYW5nd2VsbCBjaGlwLgotICogTWVkZmllbGQgcGxhdGZvcm0gUGVud2VsbCBjaGlwLgotICogV2hpdG5leSBwb2ludC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLQotLyoKLSAqIExhbmd3ZWxsIGNoaXAgaGFzIDY0IHBpbnMgYW5kIHRodXMgdGhlcmUgYXJlIDIgMzJiaXQgcmVnaXN0ZXJzIHRvIGNvbnRyb2wKLSAqIGVhY2ggZmVhdHVyZSwgd2hpbGUgUGVud2VsbCBjaGlwIGhhcyA5NiBwaW5zIGZvciBlYWNoIGJsb2NrLCBhbmQgbmVlZCAzIDMyYml0Ci0gKiByZWdpc3RlcnMgdG8gY29udHJvbCB0aGVtLCBzbyB3ZSBvbmx5IGRlZmluZSB0aGUgb3JkZXIgaGVyZSBpbnN0ZWFkIG9mIGEKLSAqIHN0cnVjdHVyZSwgdG8gZ2V0IGEgYml0IG9mZnNldCBmb3IgYSBwaW4gKHVzZSBHUERSIGFzIGFuIGV4YW1wbGUpOgotICoKLSAqIG5yZWcgPSBuZ3BpbyAvIDMyOwotICogcmVnID0gb2Zmc2V0IC8gMzI7Ci0gKiBiaXQgPSBvZmZzZXQgJSAzMjsKLSAqIHJlZ19hZGRyID0gcmVnX2Jhc2UgKyBHUERSICogbnJlZyAqIDQgKyByZWcgKiA0OwotICoKLSAqIHNvIHRoZSBiaXQgb2YgcmVnX2FkZHIgaXMgdG8gY29udHJvbCBwaW4gb2Zmc2V0J3MgR1BEUiBmZWF0dXJlCi0qLwotCi1lbnVtIEdQSU9fUkVHIHsKLQlHUExSID0gMCwJLyogcGluIGxldmVsIHJlYWQtb25seSAqLwotCUdQRFIsCQkvKiBwaW4gZGlyZWN0aW9uICovCi0JR1BTUiwJCS8qIHBpbiBzZXQgKi8KLQlHUENSLAkJLyogcGluIGNsZWFyICovCi0JR1JFUiwJCS8qIHJpc2luZyBlZGdlIGRldGVjdCAqLwotCUdGRVIsCQkvKiBmYWxsaW5nIGVkZ2UgZGV0ZWN0ICovCi0JR0VEUiwJCS8qIGVkZ2UgZGV0ZWN0IHJlc3VsdCAqLwotfTsKLQotc3RydWN0IGxud19ncGlvIHsKLQlzdHJ1Y3QgZ3Bpb19jaGlwCQljaGlwOwotCXZvaWQJCQkJKnJlZ19iYXNlOwotCXNwaW5sb2NrX3QJCQlsb2NrOwotCXVuc2lnbmVkCQkJaXJxX2Jhc2U7Ci0Jc3RydWN0IHBjaV9kZXYJCQkqcGRldjsKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKmdwaW9fcmVnKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKLQkJCWVudW0gR1BJT19SRUcgcmVnX3R5cGUpCi17Ci0Jc3RydWN0IGxud19ncGlvICpsbncgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGxud19ncGlvLCBjaGlwKTsKLQl1bnNpZ25lZCBucmVnID0gY2hpcC0+bmdwaW8gLyAzMjsKLQl1OCByZWcgPSBvZmZzZXQgLyAzMjsKLQl2b2lkIF9faW9tZW0gKnB0cjsKLQotCXB0ciA9ICh2b2lkIF9faW9tZW0gKikobG53LT5yZWdfYmFzZSArIHJlZ190eXBlICogbnJlZyAqIDQgKyByZWcgKiA0KTsKLQlyZXR1cm4gcHRyOwotfQotCi1zdGF0aWMgaW50IGxud19ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jdm9pZCBfX2lvbWVtICpncGxyID0gZ3Bpb19yZWcoY2hpcCwgb2Zmc2V0LCBHUExSKTsKLQotCXJldHVybiByZWFkbChncGxyKSAmIEJJVChvZmZzZXQgJSAzMik7Ci19Ci0KLXN0YXRpYyB2b2lkIGxud19ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQl2b2lkIF9faW9tZW0gKmdwc3IsICpncGNyOwotCi0JaWYgKHZhbHVlKSB7Ci0JCWdwc3IgPSBncGlvX3JlZyhjaGlwLCBvZmZzZXQsIEdQU1IpOwotCQl3cml0ZWwoQklUKG9mZnNldCAlIDMyKSwgZ3Bzcik7Ci0JfSBlbHNlIHsKLQkJZ3BjciA9IGdwaW9fcmVnKGNoaXAsIG9mZnNldCwgR1BDUik7Ci0JCXdyaXRlbChCSVQob2Zmc2V0ICUgMzIpLCBncGNyKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbG53X2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgbG53X2dwaW8gKmxudyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbG53X2dwaW8sIGNoaXApOwotCXZvaWQgX19pb21lbSAqZ3BkciA9IGdwaW9fcmVnKGNoaXAsIG9mZnNldCwgR1BEUik7Ci0JdTMyIHZhbHVlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAobG53LT5wZGV2KQotCQlwbV9ydW50aW1lX2dldCgmbG53LT5wZGV2LT5kZXYpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmxudy0+bG9jaywgZmxhZ3MpOwotCXZhbHVlID0gcmVhZGwoZ3Bkcik7Ci0JdmFsdWUgJj0gfkJJVChvZmZzZXQgJSAzMik7Ci0Jd3JpdGVsKHZhbHVlLCBncGRyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsbnctPmxvY2ssIGZsYWdzKTsKLQotCWlmIChsbnctPnBkZXYpCi0JCXBtX3J1bnRpbWVfcHV0KCZsbnctPnBkZXYtPmRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsbndfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbG53X2dwaW8gKmxudyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbG53X2dwaW8sIGNoaXApOwotCXZvaWQgX19pb21lbSAqZ3BkciA9IGdwaW9fcmVnKGNoaXAsIG9mZnNldCwgR1BEUik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxud19ncGlvX3NldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKLQotCWlmIChsbnctPnBkZXYpCi0JCXBtX3J1bnRpbWVfZ2V0KCZsbnctPnBkZXYtPmRldik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbG53LT5sb2NrLCBmbGFncyk7Ci0JdmFsdWUgPSByZWFkbChncGRyKTsKLQl2YWx1ZSB8PSBCSVQob2Zmc2V0ICUgMzIpOwotCXdyaXRlbCh2YWx1ZSwgZ3Bkcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG53LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAobG53LT5wZGV2KQotCQlwbV9ydW50aW1lX3B1dCgmbG53LT5wZGV2LT5kZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbG53X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgbG53X2dwaW8gKmxudyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbG53X2dwaW8sIGNoaXApOwotCXJldHVybiBsbnctPmlycV9iYXNlICsgb2Zmc2V0OwotfQotCi1zdGF0aWMgaW50IGxud19pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIHR5cGUpCi17Ci0Jc3RydWN0IGxud19ncGlvICpsbncgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl1MzIgZ3BpbyA9IGQtPmlycSAtIGxudy0+aXJxX2Jhc2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsdWU7Ci0Jdm9pZCBfX2lvbWVtICpncmVyID0gZ3Bpb19yZWcoJmxudy0+Y2hpcCwgZ3BpbywgR1JFUik7Ci0Jdm9pZCBfX2lvbWVtICpnZmVyID0gZ3Bpb19yZWcoJmxudy0+Y2hpcCwgZ3BpbywgR0ZFUik7Ci0KLQlpZiAoZ3BpbyA+PSBsbnctPmNoaXAubmdwaW8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGxudy0+cGRldikKLQkJcG1fcnVudGltZV9nZXQoJmxudy0+cGRldi0+ZGV2KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZsbnctPmxvY2ssIGZsYWdzKTsKLQlpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfUklTSU5HKQotCQl2YWx1ZSA9IHJlYWRsKGdyZXIpIHwgQklUKGdwaW8gJSAzMik7Ci0JZWxzZQotCQl2YWx1ZSA9IHJlYWRsKGdyZXIpICYgKH5CSVQoZ3BpbyAlIDMyKSk7Ci0Jd3JpdGVsKHZhbHVlLCBncmVyKTsKLQotCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKQotCQl2YWx1ZSA9IHJlYWRsKGdmZXIpIHwgQklUKGdwaW8gJSAzMik7Ci0JZWxzZQotCQl2YWx1ZSA9IHJlYWRsKGdmZXIpICYgKH5CSVQoZ3BpbyAlIDMyKSk7Ci0Jd3JpdGVsKHZhbHVlLCBnZmVyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsbnctPmxvY2ssIGZsYWdzKTsKLQotCWlmIChsbnctPnBkZXYpCi0JCXBtX3J1bnRpbWVfcHV0KCZsbnctPnBkZXYtPmRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbG53X2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotfQotCi1zdGF0aWMgdm9pZCBsbndfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGxud19pcnFjaGlwID0gewotCS5uYW1lCQk9ICJMTlctR1BJTyIsCi0JLmlycV9tYXNrCT0gbG53X2lycV9tYXNrLAotCS5pcnFfdW5tYXNrCT0gbG53X2lycV91bm1hc2ssCi0JLmlycV9zZXRfdHlwZQk9IGxud19pcnFfdHlwZSwKLX07Ci0KLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShsbndfZ3Bpb19pZHMpID0geyAgIC8qIHBpbiBudW1iZXIgKi8KLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwODBmKSwgLmRyaXZlcl9kYXRhID0gNjQgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwODFmKSwgLmRyaXZlcl9kYXRhID0gOTYgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwODFhKSwgLmRyaXZlcl9kYXRhID0gOTYgfSwKLQl7IDAsIH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbG53X2dwaW9faWRzKTsKLQotc3RhdGljIHZvaWQgbG53X2lycV9oYW5kbGVyKHVuc2lnbmVkIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQotewotCXN0cnVjdCBpcnFfZGF0YSAqZGF0YSA9IGlycV9kZXNjX2dldF9pcnFfZGF0YShkZXNjKTsKLQlzdHJ1Y3QgbG53X2dwaW8gKmxudyA9IGlycV9kYXRhX2dldF9pcnFfaGFuZGxlcl9kYXRhKGRhdGEpOwotCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcChkYXRhKTsKLQl1MzIgYmFzZSwgZ3BpbywgbWFzazsKLQl1bnNpZ25lZCBsb25nIHBlbmRpbmc7Ci0Jdm9pZCBfX2lvbWVtICpnZWRyOwotCi0JLyogY2hlY2sgR1BJTyBjb250cm9sbGVyIHRvIGNoZWNrIHdoaWNoIHBpbiB0cmlnZ2VyZWQgdGhlIGludGVycnVwdCAqLwotCWZvciAoYmFzZSA9IDA7IGJhc2UgPCBsbnctPmNoaXAubmdwaW87IGJhc2UgKz0gMzIpIHsKLQkJZ2VkciA9IGdwaW9fcmVnKCZsbnctPmNoaXAsIGJhc2UsIEdFRFIpOwotCQlwZW5kaW5nID0gcmVhZGwoZ2Vkcik7Ci0JCXdoaWxlIChwZW5kaW5nKSB7Ci0JCQlncGlvID0gX19mZnMocGVuZGluZykgLSAxOwotCQkJbWFzayA9IEJJVChncGlvKTsKLQkJCXBlbmRpbmcgJj0gfm1hc2s7Ci0JCQkvKiBDbGVhciBiZWZvcmUgaGFuZGxpbmcgc28gd2UgY2FuJ3QgbG9zZSBhbiBlZGdlICovCi0JCQl3cml0ZWwobWFzaywgZ2Vkcik7Ci0JCQlnZW5lcmljX2hhbmRsZV9pcnEobG53LT5pcnFfYmFzZSArIGJhc2UgKyBncGlvKTsKLQkJfQotCX0KLQotCWNoaXAtPmlycV9lb2koZGF0YSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgbG53X2dwaW9fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxud19ncGlvX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbG53X2dwaW9fcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgZXJyID0gcG1fc2NoZWR1bGVfc3VzcGVuZChkZXYsIDUwMCk7Ci0KLQlpZiAoIWVycikKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gLUVCVVNZOwotfQotCi0jZWxzZQotI2RlZmluZSBsbndfZ3Bpb19ydW50aW1lX3N1c3BlbmQJTlVMTAotI2RlZmluZSBsbndfZ3Bpb19ydW50aW1lX3Jlc3VtZQkJTlVMTAotI2RlZmluZSBsbndfZ3Bpb19ydW50aW1lX2lkbGUJCU5VTEwKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgbG53X2dwaW9fcG1fb3BzID0gewotCS5ydW50aW1lX3N1c3BlbmQgPSBsbndfZ3Bpb19ydW50aW1lX3N1c3BlbmQsCi0JLnJ1bnRpbWVfcmVzdW1lID0gbG53X2dwaW9fcnVudGltZV9yZXN1bWUsCi0JLnJ1bnRpbWVfaWRsZSA9IGxud19ncGlvX3J1bnRpbWVfaWRsZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGxud19ncGlvX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQotewotCXZvaWQgKmJhc2U7Ci0JaW50IGk7Ci0JcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCBsZW47Ci0Jc3RydWN0IGxud19ncGlvICpsbnc7Ci0JdTMyIGlycV9iYXNlOwotCXUzMiBncGlvX2Jhc2U7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGRvbmU7Ci0KLQlyZXR2YWwgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJsYW5nd2VsbF9ncGlvIik7Ci0JaWYgKHJldHZhbCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlcnJvciByZXF1ZXN0aW5nIHJlc291cmNlc1xuIik7Ci0JCWdvdG8gZXJyMjsKLQl9Ci0JLyogZ2V0IHRoZSBpcnFfYmFzZSBmcm9tIGJhcjEgKi8KLQlzdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKLQlsZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOwotCWJhc2UgPSBpb3JlbWFwX25vY2FjaGUoc3RhcnQsIGxlbik7Ci0JaWYgKCFiYXNlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImVycm9yIG1hcHBpbmcgYmFyMVxuIik7Ci0JCWdvdG8gZXJyMzsKLQl9Ci0JaXJxX2Jhc2UgPSAqKHUzMiAqKWJhc2U7Ci0JZ3Bpb19iYXNlID0gKigodTMyICopYmFzZSArIDEpOwotCS8qIHJlbGVhc2UgdGhlIElPIG1hcHBpbmcsIHNpbmNlIHdlIGFscmVhZHkgZ2V0IHRoZSBpbmZvIGZyb20gYmFyMSAqLwotCWlvdW5tYXAoYmFzZSk7Ci0JLyogZ2V0IHRoZSByZWdpc3RlciBiYXNlIGZyb20gYmFyMCAqLwotCXN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCWxlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7Ci0JYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShzdGFydCwgbGVuKTsKLQlpZiAoIWJhc2UpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZXJyb3IgbWFwcGluZyBiYXIwXG4iKTsKLQkJcmV0dmFsID0gLUVGQVVMVDsKLQkJZ290byBlcnIzOwotCX0KLQotCWxudyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsbndfZ3BpbyksIEdGUF9LRVJORUwpOwotCWlmICghbG53KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGFsbG9jYXRlIGxhbmd3ZWxsX2dwaW8gY2hpcCBkYXRhXG4iKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBlcnI0OwotCX0KLQlsbnctPnJlZ19iYXNlID0gYmFzZTsKLQlsbnctPmlycV9iYXNlID0gaXJxX2Jhc2U7Ci0JbG53LT5jaGlwLmxhYmVsID0gZGV2X25hbWUoJnBkZXYtPmRldik7Ci0JbG53LT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IGxud19ncGlvX2RpcmVjdGlvbl9pbnB1dDsKLQlsbnctPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IGxud19ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7Ci0JbG53LT5jaGlwLmdldCA9IGxud19ncGlvX2dldDsKLQlsbnctPmNoaXAuc2V0ID0gbG53X2dwaW9fc2V0OwotCWxudy0+Y2hpcC50b19pcnEgPSBsbndfZ3Bpb190b19pcnE7Ci0JbG53LT5jaGlwLmJhc2UgPSBncGlvX2Jhc2U7Ci0JbG53LT5jaGlwLm5ncGlvID0gaWQtPmRyaXZlcl9kYXRhOwotCWxudy0+Y2hpcC5jYW5fc2xlZXAgPSAwOwotCWxudy0+cGRldiA9IHBkZXY7Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIGxudyk7Ci0JcmV0dmFsID0gZ3Bpb2NoaXBfYWRkKCZsbnctPmNoaXApOwotCWlmIChyZXR2YWwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibGFuZ3dlbGwgZ3Bpb2NoaXBfYWRkIGVycm9yICVkXG4iLCByZXR2YWwpOwotCQlnb3RvIGVycjU7Ci0JfQotCWlycV9zZXRfaGFuZGxlcl9kYXRhKHBkZXYtPmlycSwgbG53KTsKLQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwZGV2LT5pcnEsIGxud19pcnFfaGFuZGxlcik7Ci0JZm9yIChpID0gMDsgaSA8IGxudy0+Y2hpcC5uZ3BpbzsgaSsrKSB7Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGkgKyBsbnctPmlycV9iYXNlLCAmbG53X2lycWNoaXAsCi0JCQkJCSAgICAgIGhhbmRsZV9zaW1wbGVfaXJxLCAiZGVtdXgiKTsKLQkJaXJxX3NldF9jaGlwX2RhdGEoaSArIGxudy0+aXJxX2Jhc2UsIGxudyk7Ci0JfQotCi0Jc3Bpbl9sb2NrX2luaXQoJmxudy0+bG9jayk7Ci0KLQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnBkZXYtPmRldik7Ci0JcG1fcnVudGltZV9hbGxvdygmcGRldi0+ZGV2KTsKLQotCWdvdG8gZG9uZTsKLWVycjU6Ci0Ja2ZyZWUobG53KTsKLWVycjQ6Ci0JaW91bm1hcChiYXNlKTsKLWVycjM6Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLWVycjI6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotZG9uZToKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbG53X2dwaW9fZHJpdmVyID0gewotCS5uYW1lCQk9ICJsYW5nd2VsbF9ncGlvIiwKLQkuaWRfdGFibGUJPSBsbndfZ3Bpb19pZHMsCi0JLnByb2JlCQk9IGxud19ncGlvX3Byb2JlLAotCS5kcml2ZXIJCT0gewotCQkucG0JPSAmbG53X2dwaW9fcG1fb3BzLAotCX0sCi19OwotCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHdwX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbG53X2dwaW8gKmxudzsKLQlzdHJ1Y3QgZ3Bpb19jaGlwICpnYzsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJjOwotCWludCByZXR2YWwgPSAwOwotCi0JcmMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbG53ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxud19ncGlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFsbncpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJImNhbid0IGFsbG9jYXRlIHdoaXRuZXlwb2ludF9ncGlvIGNoaXAgZGF0YVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlsbnctPnJlZ19iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJjLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyYykpOwotCWlmIChsbnctPnJlZ19iYXNlID09IE5VTEwpIHsKLQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJZ290byBlcnJfa21hbGxvYzsKLQl9Ci0Jc3Bpbl9sb2NrX2luaXQoJmxudy0+bG9jayk7Ci0JZ2MgPSAmbG53LT5jaGlwOwotCWdjLT5sYWJlbCA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwotCWdjLT5vd25lciA9IFRISVNfTU9EVUxFOwotCWdjLT5kaXJlY3Rpb25faW5wdXQgPSBsbndfZ3Bpb19kaXJlY3Rpb25faW5wdXQ7Ci0JZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBsbndfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OwotCWdjLT5nZXQgPSBsbndfZ3Bpb19nZXQ7Ci0JZ2MtPnNldCA9IGxud19ncGlvX3NldDsKLQlnYy0+dG9faXJxID0gTlVMTDsKLQlnYy0+YmFzZSA9IDA7Ci0JZ2MtPm5ncGlvID0gNjQ7Ci0JZ2MtPmNhbl9zbGVlcCA9IDA7Ci0JcmV0dmFsID0gZ3Bpb2NoaXBfYWRkKGdjKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIndoaXRuZXlwb2ludCBncGlvY2hpcF9hZGQgZXJyb3IgJWRcbiIsCi0JCQkJCQkJCXJldHZhbCk7Ci0JCWdvdG8gZXJyX2lvcmVtYXA7Ci0JfQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGxudyk7Ci0JcmV0dXJuIDA7Ci1lcnJfaW9yZW1hcDoKLQlpb3VubWFwKGxudy0+cmVnX2Jhc2UpOwotZXJyX2ttYWxsb2M6Ci0Ja2ZyZWUobG53KTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCB3cF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBsbndfZ3BpbyAqbG53ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IGVycjsKLQllcnIgPSBncGlvY2hpcF9yZW1vdmUoJmxudy0+Y2hpcCk7Ci0JaWYgKGVycikKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlbW92ZSBncGlvX2NoaXAuXG4iKTsKLQlpb3VubWFwKGxudy0+cmVnX2Jhc2UpOwotCWtmcmVlKGxudyk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdwX2dwaW9fZHJpdmVyID0gewotCS5wcm9iZQkJPSB3cF9ncGlvX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aod3BfZ3Bpb19yZW1vdmUpLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJ3cF9ncGlvIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGxud19ncGlvX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCXJldCA9ICBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZsbndfZ3Bpb19kcml2ZXIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd3BfZ3Bpb19kcml2ZXIpOwotCWlmIChyZXQgPCAwKQotCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmxud19ncGlvX2RyaXZlcik7Ci0JcmV0dXJuIHJldDsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGxud19ncGlvX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL21heDczMDAuYyBiL2RyaXZlcnMvZ3Bpby9tYXg3MzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MmY2NjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL21heDczMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBkcml2ZXJzL2dwaW8vbWF4NzMwMC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFdvbGZyYW0gU2FuZywgUGVuZ3V0cm9uaXgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIENoZWNrIG1heDczMHguYyBmb3IgZnVydGhlciBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvbWF4NzMwMS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotc3RhdGljIGludCBtYXg3MzAwX2kyY193cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcsCi0JCQkJdW5zaWduZWQgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCi0JcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NzMwMF9pMmNfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQotCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtYXg3MzAwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBtYXg3MzAxICp0czsKLQlpbnQgcmV0OwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCi0JCQlJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQotCQlyZXR1cm4gLUVJTzsKLQotCXRzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1heDczMDEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXRzLT5yZWFkID0gbWF4NzMwMF9pMmNfcmVhZDsKLQl0cy0+d3JpdGUgPSBtYXg3MzAwX2kyY193cml0ZTsKLQl0cy0+ZGV2ID0gJmNsaWVudC0+ZGV2OwotCi0JcmV0ID0gX19tYXg3MzB4X3Byb2JlKHRzKTsKLQlpZiAocmV0KQotCQlrZnJlZSh0cyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgbWF4NzMwMF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlyZXR1cm4gX19tYXg3MzB4X3JlbW92ZSgmY2xpZW50LT5kZXYpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4NzMwMF9pZFtdID0gewotCXsgIm1heDczMDAiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1heDczMDBfaWQpOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4NzMwMF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibWF4NzMwMCIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlID0gbWF4NzMwMF9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AobWF4NzMwMF9yZW1vdmUpLAotCS5pZF90YWJsZSA9IG1heDczMDBfaWQsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtYXg3MzAwX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm1heDczMDBfZHJpdmVyKTsKLX0KLXN1YnN5c19pbml0Y2FsbChtYXg3MzAwX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbWF4NzMwMF9leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJm1heDczMDBfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1heDczMDBfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIldvbGZyYW0gU2FuZyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNQVg3MzAwIEdQSU8tRXhwYW5kZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9tYXg3MzAxLmMgYi9kcml2ZXJzL2dwaW8vbWF4NzMwMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmExMDBkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3Bpby9tYXg3MzAxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIGRyaXZlcnMvZ3Bpby9tYXg3MzAxLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgSnVlcmdlbiBCZWlzZXJ0LCBQZW5ndXRyb25peAotICogQ29weXJpZ2h0IChDKSAyMDA4IEd1ZW5uYWRpIExpYWtob3ZldHNraSwgUGVuZ3V0cm9uaXgKLSAqIENvcHlyaWdodCAoQykgMjAwOSBXb2xmcmFtIFNhbmcsIFBlbmd1dHJvbml4Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBDaGVjayBtYXg3MzB4LmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvbWF4NzMwMS5oPgotCi0vKiBBIHdyaXRlIHRvIHRoZSBNQVg3MzAxIG1lYW5zIG9uZSBtZXNzYWdlIHdpdGggb25lIHRyYW5zZmVyICovCi1zdGF0aWMgaW50IG1heDczMDFfc3BpX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZywKLQkJCQl1bnNpZ25lZCBpbnQgdmFsKQotewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0JdTE2IHdvcmQgPSAoKHJlZyAmIDB4N0YpIDw8IDgpIHwgKHZhbCAmIDB4RkYpOwotCi0JcmV0dXJuIHNwaV93cml0ZShzcGksIChjb25zdCB1OCAqKSZ3b3JkLCBzaXplb2Yod29yZCkpOwotfQotCi0vKiBBIHJlYWQgZnJvbSB0aGUgTUFYNzMwMSBtZWFucyB0d28gdHJhbnNmZXJzOyBoZXJlLCBvbmUgbWVzc2FnZSBlYWNoICovCi0KLXN0YXRpYyBpbnQgbWF4NzMwMV9zcGlfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCi17Ci0JaW50IHJldDsKLQl1MTYgd29yZDsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCi0Jd29yZCA9IDB4ODAwMCB8IChyZWcgPDwgOCk7Ci0JcmV0ID0gc3BpX3dyaXRlKHNwaSwgKGNvbnN0IHU4ICopJndvcmQsIHNpemVvZih3b3JkKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQkvKgotCSAqIFRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0LCB0aGF0IGEgdHJhbnNmZXIgd2l0aCBOVUxMIHR4X2J1ZiBzaGlmdHMgb3V0Ci0JICogemVybyBieXRlcyAoPU5PT1AgZm9yIE1BWDczMDEpCi0JICovCi0JcmV0ID0gc3BpX3JlYWQoc3BpLCAodTggKikmd29yZCwgc2l6ZW9mKHdvcmQpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldHVybiB3b3JkICYgMHhmZjsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgbWF4NzMwMV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBtYXg3MzAxICp0czsKLQlpbnQgcmV0OwotCi0JLyogYml0c19wZXJfd29yZCBjYW5ub3QgYmUgY29uZmlndXJlZCBpbiBwbGF0Zm9ybSBkYXRhICovCi0Jc3BpLT5iaXRzX3Blcl93b3JkID0gMTY7Ci0JcmV0ID0gc3BpX3NldHVwKHNwaSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQl0cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtYXg3MzAxKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl0cy0+cmVhZCA9IG1heDczMDFfc3BpX3JlYWQ7Ci0JdHMtPndyaXRlID0gbWF4NzMwMV9zcGlfd3JpdGU7Ci0JdHMtPmRldiA9ICZzcGktPmRldjsKLQotCXJldCA9IF9fbWF4NzMweF9wcm9iZSh0cyk7Ci0JaWYgKHJldCkKLQkJa2ZyZWUodHMpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IG1heDczMDFfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0JcmV0dXJuIF9fbWF4NzMweF9yZW1vdmUoJnNwaS0+ZGV2KTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIG1heDczMDFfaWRbXSA9IHsKLQl7ICJtYXg3MzAxIiwgMCB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBtYXg3MzAxX2lkKTsKLQotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1heDczMDFfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1heDczMDEiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZSA9IG1heDczMDFfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG1heDczMDFfcmVtb3ZlKSwKLQkuaWRfdGFibGUgPSBtYXg3MzAxX2lkLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbWF4NzMwMV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJm1heDczMDFfZHJpdmVyKTsKLX0KLS8qIHJlZ2lzdGVyIGFmdGVyIHNwaSBwb3N0Y29yZSBpbml0Y2FsbCBhbmQgYmVmb3JlCi0gKiBzdWJzeXMgaW5pdGNhbGxzIHRoYXQgbWF5IHJlbHkgb24gdGhlc2UgR1BJT3MKLSAqLwotc3Vic3lzX2luaXRjYWxsKG1heDczMDFfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtYXg3MzAxX2V4aXQodm9pZCkKLXsKLQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJm1heDczMDFfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1heDczMDFfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkp1ZXJnZW4gQmVpc2VydCwgV29sZnJhbSBTYW5nIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1BWDczMDEgR1BJTy1FeHBhbmRlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL21heDczMHguYyBiL2RyaXZlcnMvZ3Bpby9tYXg3MzB4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Y2U3NzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL21heDczMHguYworKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioKLSAqIGRyaXZlcnMvZ3Bpby9tYXg3MzAxLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgSnVlcmdlbiBCZWlzZXJ0LCBQZW5ndXRyb25peAotICogQ29weXJpZ2h0IChDKSAyMDA4IEd1ZW5uYWRpIExpYWtob3ZldHNraSwgUGVuZ3V0cm9uaXgKLSAqIENvcHlyaWdodCAoQykgMjAwOSBXb2xmcmFtIFNhbmcsIFBlbmd1dHJvbml4Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGUgTWF4aW0gTUFYNzMwMC8xIGRldmljZSBpcyBhbiBJMkMvU1BJIGRyaXZlbiBHUElPIGV4cGFuZGVyLiBUaGVyZSBhcmUKLSAqIDI4IEdQSU9zLiA4IG9mIHRoZW0gY2FuIHRyaWdnZXIgYW4gaW50ZXJydXB0LiBTZWUgZGF0YXNoZWV0IGZvciBtb3JlCi0gKiBkZXRhaWxzCi0gKiBOb3RlOgotICogLSBESU4gbXVzdCBiZSBzdGFibGUgYXQgdGhlIHJpc2luZyBlZGdlIG9mIGNsb2NrLgotICogLSB3aGVuIHdyaXRpbmc6Ci0gKiAgIC0gYWx3YXlzIGNsb2NrIGluIDE2IGNsb2NrcyBhdCBvbmNlCi0gKiAgIC0gYXQgRElOOiBEMTUgZmlyc3QsIEQwIGxhc3QKLSAqICAgLSBEMC4uRDcgPSBkYXRhYnl0ZSwgRDguLkQxNCA9IGNvbW1hbmRieXRlCi0gKiAgIC0gRDE1ID0gbG93IC0+IHdyaXRlIGNvbW1hbmQKLSAqIC0gd2hlbiByZWFkaW5nCi0gKiAgIC0gYWx3YXlzIGNsb2NrIGluIDE2IGNsb2NrcyBhdCBvbmNlCi0gKiAgIC0gYXQgRElOOiBEMTUgZmlyc3QsIEQwIGxhc3QKLSAqICAgLSBEMC4uRDcgPSBkdW1teSwgRDguLkQxNCA9IHJlZ2lzdGVyIGFkZHJlc3MKLSAqICAgLSBEMTUgPSBoaWdoIC0+IHJlYWQgY29tbWFuZAotICogICAtIHJhaXNlIENTIGFuZCBhc3NlcnQgaXQgYWdhaW4KLSAqICAgLSBhbHdheXMgY2xvY2sgaW4gMTYgY2xvY2tzIGF0IG9uY2UKLSAqICAgLSBhdCBET1VUOiBEMTUgZmlyc3QsIEQwIGxhc3QKLSAqICAgLSBEMC4uRDcgY29udGFpbnMgdGhlIGRhdGEgZnJvbSB0aGUgZmlyc3QgY3ljbGUKLSAqCi0gKiBUaGUgZHJpdmVyIGV4cG9ydHMgYSBzdGFuZGFyZCBncGlvY2hpcCBpbnRlcmZhY2UKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL21heDczMDEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0vKgotICogUGluIGNvbmZpZ3VyYXRpb25zLCBzZWUgTUFYNzMwMSBkYXRhc2hlZXQgcGFnZSA2Ci0gKi8KLSNkZWZpbmUgUElOX0NPTkZJR19NQVNLIDB4MDMKLSNkZWZpbmUgUElOX0NPTkZJR19JTl9QVUxMVVAgMHgwMwotI2RlZmluZSBQSU5fQ09ORklHX0lOX1dPX1BVTExVUCAweDAyCi0jZGVmaW5lIFBJTl9DT05GSUdfT1VUIDB4MDEKLQotI2RlZmluZSBQSU5fTlVNQkVSIDI4Ci0KLXN0YXRpYyBpbnQgbWF4NzMwMV9kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBtYXg3MzAxICp0cyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbWF4NzMwMSwgY2hpcCk7Ci0JdTggKmNvbmZpZzsKLQl1OCBvZmZzZXRfYml0cywgcGluX2NvbmZpZzsKLQlpbnQgcmV0OwotCi0JLyogRmlyc3QgNCBwaW5zIGFyZSB1bnVzZWQgaW4gdGhlIGNvbnRyb2xsZXIgKi8KLQlvZmZzZXQgKz0gNDsKLQlvZmZzZXRfYml0cyA9IChvZmZzZXQgJiAzKSA8PCAxOwotCi0JY29uZmlnID0gJnRzLT5wb3J0X2NvbmZpZ1tvZmZzZXQgPj4gMl07Ci0KLQlpZiAodHMtPmlucHV0X3B1bGx1cF9hY3RpdmUgJiBCSVQob2Zmc2V0KSkKLQkJcGluX2NvbmZpZyA9IFBJTl9DT05GSUdfSU5fUFVMTFVQOwotCWVsc2UKLQkJcGluX2NvbmZpZyA9IFBJTl9DT05GSUdfSU5fV09fUFVMTFVQOwotCi0JbXV0ZXhfbG9jaygmdHMtPmxvY2spOwotCi0JKmNvbmZpZyA9ICgqY29uZmlnICYgfihQSU5fQ09ORklHX01BU0sgPDwgb2Zmc2V0X2JpdHMpKQotCQkJICAgfCAocGluX2NvbmZpZyA8PCBvZmZzZXRfYml0cyk7Ci0KLQlyZXQgPSB0cy0+d3JpdGUodHMtPmRldiwgMHgwOCArIChvZmZzZXQgPj4gMiksICpjb25maWcpOwotCi0JbXV0ZXhfdW5sb2NrKCZ0cy0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fbWF4NzMwMV9zZXQoc3RydWN0IG1heDczMDEgKnRzLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlpZiAodmFsdWUpIHsKLQkJdHMtPm91dF9sZXZlbCB8PSAxIDw8IG9mZnNldDsKLQkJcmV0dXJuIHRzLT53cml0ZSh0cy0+ZGV2LCAweDIwICsgb2Zmc2V0LCAweDAxKTsKLQl9IGVsc2UgewotCQl0cy0+b3V0X2xldmVsICY9IH4oMSA8PCBvZmZzZXQpOwotCQlyZXR1cm4gdHMtPndyaXRlKHRzLT5kZXYsIDB4MjAgKyBvZmZzZXQsIDB4MDApOwotCX0KLX0KLQotc3RhdGljIGludCBtYXg3MzAxX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LAotCQkJCSAgICBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IG1heDczMDEgKnRzID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtYXg3MzAxLCBjaGlwKTsKLQl1OCAqY29uZmlnOwotCXU4IG9mZnNldF9iaXRzOwotCWludCByZXQ7Ci0KLQkvKiBGaXJzdCA0IHBpbnMgYXJlIHVudXNlZCBpbiB0aGUgY29udHJvbGxlciAqLwotCW9mZnNldCArPSA0OwotCW9mZnNldF9iaXRzID0gKG9mZnNldCAmIDMpIDw8IDE7Ci0KLQljb25maWcgPSAmdHMtPnBvcnRfY29uZmlnW29mZnNldCA+PiAyXTsKLQotCW11dGV4X2xvY2soJnRzLT5sb2NrKTsKLQotCSpjb25maWcgPSAoKmNvbmZpZyAmIH4oUElOX0NPTkZJR19NQVNLIDw8IG9mZnNldF9iaXRzKSkKLQkJCSAgIHwgKFBJTl9DT05GSUdfT1VUIDw8IG9mZnNldF9iaXRzKTsKLQotCXJldCA9IF9fbWF4NzMwMV9zZXQodHMsIG9mZnNldCwgdmFsdWUpOwotCi0JaWYgKCFyZXQpCi0JCXJldCA9IHRzLT53cml0ZSh0cy0+ZGV2LCAweDA4ICsgKG9mZnNldCA+PiAyKSwgKmNvbmZpZyk7Ci0KLQltdXRleF91bmxvY2soJnRzLT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NzMwMV9nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBtYXg3MzAxICp0cyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbWF4NzMwMSwgY2hpcCk7Ci0JaW50IGNvbmZpZywgbGV2ZWwgPSAtRUlOVkFMOwotCi0JLyogRmlyc3QgNCBwaW5zIGFyZSB1bnVzZWQgaW4gdGhlIGNvbnRyb2xsZXIgKi8KLQlvZmZzZXQgKz0gNDsKLQotCW11dGV4X2xvY2soJnRzLT5sb2NrKTsKLQotCWNvbmZpZyA9ICh0cy0+cG9ydF9jb25maWdbb2Zmc2V0ID4+IDJdID4+ICgob2Zmc2V0ICYgMykgPDwgMSkpCi0JCQkmIFBJTl9DT05GSUdfTUFTSzsKLQotCXN3aXRjaCAoY29uZmlnKSB7Ci0JY2FzZSBQSU5fQ09ORklHX09VVDoKLQkJLyogT3V0cHV0OiByZXR1cm4gY2FjaGVkIGxldmVsICovCi0JCWxldmVsID0gICEhKHRzLT5vdXRfbGV2ZWwgJiAoMSA8PCBvZmZzZXQpKTsKLQkJYnJlYWs7Ci0JY2FzZSBQSU5fQ09ORklHX0lOX1dPX1BVTExVUDoKLQljYXNlIFBJTl9DT05GSUdfSU5fUFVMTFVQOgotCQkvKiBJbnB1dDogcmVhZCBvdXQgKi8KLQkJbGV2ZWwgPSB0cy0+cmVhZCh0cy0+ZGV2LCAweDIwICsgb2Zmc2V0KSAmIDB4MDE7Ci0JfQotCW11dGV4X3VubG9jaygmdHMtPmxvY2spOwotCi0JcmV0dXJuIGxldmVsOwotfQotCi1zdGF0aWMgdm9pZCBtYXg3MzAxX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWF4NzMwMSAqdHMgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1heDczMDEsIGNoaXApOwotCi0JLyogRmlyc3QgNCBwaW5zIGFyZSB1bnVzZWQgaW4gdGhlIGNvbnRyb2xsZXIgKi8KLQlvZmZzZXQgKz0gNDsKLQotCW11dGV4X2xvY2soJnRzLT5sb2NrKTsKLQotCV9fbWF4NzMwMV9zZXQodHMsIG9mZnNldCwgdmFsdWUpOwotCi0JbXV0ZXhfdW5sb2NrKCZ0cy0+bG9jayk7Ci19Ci0KLWludCBfX2RldmluaXQgX19tYXg3MzB4X3Byb2JlKHN0cnVjdCBtYXg3MzAxICp0cykKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0cy0+ZGV2OwotCXN0cnVjdCBtYXg3MzAxX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwotCWludCBpLCByZXQ7Ci0KLQlwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+YmFzZSkgewotCQlkZXZfZXJyKGRldiwgImluY29ycmVjdCBvciBtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9pbml0KCZ0cy0+bG9jayk7Ci0JZGV2X3NldF9kcnZkYXRhKGRldiwgdHMpOwotCi0JLyogUG93ZXIgdXAgdGhlIGNoaXAgYW5kIGRpc2FibGUgSVJRIG91dHB1dCAqLwotCXRzLT53cml0ZShkZXYsIDB4MDQsIDB4MDEpOwotCi0JdHMtPmlucHV0X3B1bGx1cF9hY3RpdmUgPSBwZGF0YS0+aW5wdXRfcHVsbHVwX2FjdGl2ZTsKLQl0cy0+Y2hpcC5sYWJlbCA9IGRldi0+ZHJpdmVyLT5uYW1lOwotCi0JdHMtPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gbWF4NzMwMV9kaXJlY3Rpb25faW5wdXQ7Ci0JdHMtPmNoaXAuZ2V0ID0gbWF4NzMwMV9nZXQ7Ci0JdHMtPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IG1heDczMDFfZGlyZWN0aW9uX291dHB1dDsKLQl0cy0+Y2hpcC5zZXQgPSBtYXg3MzAxX3NldDsKLQotCXRzLT5jaGlwLmJhc2UgPSBwZGF0YS0+YmFzZTsKLQl0cy0+Y2hpcC5uZ3BpbyA9IFBJTl9OVU1CRVI7Ci0JdHMtPmNoaXAuY2FuX3NsZWVwID0gMTsKLQl0cy0+Y2hpcC5kZXYgPSBkZXY7Ci0JdHMtPmNoaXAub3duZXIgPSBUSElTX01PRFVMRTsKLQotCS8qCi0JICogaW5pdGlhbGl6ZSBwdWxsdXBzIGFjY29yZGluZyB0byBwbGF0Zm9ybSBkYXRhIGFuZCBjYWNoZSB0aGUKLQkgKiByZWdpc3RlciB2YWx1ZXMgZm9yIGxhdGVyIHVzZS4KLQkgKi8KLQlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7Ci0JCWludCBqOwotCQkvKgotCQkgKiBpbml0aWFsaXplIHBvcnRfY29uZmlnIHdpdGggIjB4QUEiLCB3aGljaCBtZWFucwotCQkgKiBpbnB1dCB3aXRoIGludGVybmFsIHB1bGx1cCBkaXNhYmxlZC4gVGhpcyBpcyBuZWVkZWQKLQkJICogdG8gYXZvaWQgd3JpdGluZyB6ZXJvcyAoaW4gdGhlIGlubmVyIGZvciBsb29wKSwKLQkJICogd2hpY2ggaXMgbm90IGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSBkYXRhc2hlZXQuCi0JCSAqLwotCQl0cy0+cG9ydF9jb25maWdbaV0gPSAweEFBOwotCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gKGkgLSAxKSAqIDQgKyBqOwotCQkJcmV0ID0gbWF4NzMwMV9kaXJlY3Rpb25faW5wdXQoJnRzLT5jaGlwLCBvZmZzZXQpOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGV4aXRfZGVzdHJveTsKLQkJfQotCX0KLQotCXJldCA9IGdwaW9jaGlwX2FkZCgmdHMtPmNoaXApOwotCWlmIChyZXQpCi0JCWdvdG8gZXhpdF9kZXN0cm95OwotCi0JcmV0dXJuIHJldDsKLQotZXhpdF9kZXN0cm95OgotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwotCW11dGV4X2Rlc3Ryb3koJnRzLT5sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoX19tYXg3MzB4X3Byb2JlKTsKLQotaW50IF9fZGV2ZXhpdCBfX21heDczMHhfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbWF4NzMwMSAqdHMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgcmV0OwotCi0JaWYgKHRzID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Ci0KLQkvKiBQb3dlciBkb3duIHRoZSBjaGlwIGFuZCBkaXNhYmxlIElSUSBvdXRwdXQgKi8KLQl0cy0+d3JpdGUoZGV2LCAweDA0LCAweDAwKTsKLQotCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmdHMtPmNoaXApOwotCWlmICghcmV0KSB7Ci0JCW11dGV4X2Rlc3Ryb3koJnRzLT5sb2NrKTsKLQkJa2ZyZWUodHMpOwotCX0gZWxzZQotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZW1vdmUgR1BJTyBjb250cm9sbGVyOiAlZFxuIiwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChfX21heDczMHhfcmVtb3ZlKTsKLQotTU9EVUxFX0FVVEhPUigiSnVlcmdlbiBCZWlzZXJ0LCBXb2xmcmFtIFNhbmciKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTUFYNzMweCBHUElPLUV4cGFuZGVycywgZ2VuZXJpYyBwYXJ0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL21heDczMnguYyBiL2RyaXZlcnMvZ3Bpby9tYXg3MzJ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjk1MWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL21heDczMnguYworKysgL2Rldi9udWxsCkBAIC0xLDcxNCArMCwwIEBACi0vKgotICogIG1heDczMnguYyAtIEkyQyBQb3J0IEV4cGFuZGVyIHdpdGggOC8xNiBJL08KLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3IE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA4IEphY2sgUmVuIDxqYWNrLnJlbkBtYXJ2ZWxsLmNvbT4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDggRXJpYyBNaWFvIDxlcmljLm1pYW9AbWFydmVsbC5jb20+Ci0gKgotICogIERlcml2ZWQgZnJvbSBkcml2ZXJzL2dwaW8vcGNhOTUzeC5jCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy9tYXg3MzJ4Lmg+Ci0KLQotLyoKLSAqIEVhY2ggcG9ydCBvZiBNQVg3MzJ4IChpbmNsdWRpbmcgTUFYNzMxOSkgZmFsbHMgaW50byBvbmUgb2YgdGhlCi0gKiBmb2xsb3dpbmcgdGhyZWUgdHlwZXM6Ci0gKgotICogICAtIFB1c2ggUHVsbCBPdXRwdXQKLSAqICAgLSBJbnB1dAotICogICAtIE9wZW4gRHJhaW4gSS9PCi0gKgotICogZGVzaWduYXRlZCBieSAnTycsICdJJyBhbmQgJ1AnIGluZGl2aWR1YWxseSBhY2NvcmRpbmcgdG8gTUFYSU0ncwotICogZGF0YXNoZWV0cy4gJ0knIGFuZCAnUCcgcG9ydHMgYXJlIGludGVycnVwdCBjYXBhYmxlcywgc29tZSB3aXRoCi0gKiBhIGRlZGljYXRlZCBpbnRlcnJ1cHQgbWFzay4KLSAqCi0gKiBUaGVyZSBhcmUgdHdvIGdyb3VwcyBvZiBJL08gcG9ydHMsIGVhY2ggZ3JvdXAgdXN1YWxseSBpbmNsdWRlcwotICogdXAgdG8gOCBJL08gcG9ydHMsIGFuZCBpcyBhY2Nlc3NlZCBieSBhIHNwZWNpZmljIEkyQyBhZGRyZXNzOgotICoKLSAqICAgLSBHcm91cCBBIDogYnkgSTJDIGFkZHJlc3MgMGInMTEweHh4eAotICogICAtIEdyb3VwIEIgOiBieSBJMkMgYWRkcmVzcyAwYicxMDF4eHh4Ci0gKgotICogd2hlcmUgJ3h4eHgnIGlzIGRlY2lkZWQgYnkgdGhlIGNvbm5lY3Rpb25zIG9mIHBpbiBBRDIvQUQwLiAgVGhlCi0gKiBhZGRyZXNzIHVzZWQgYWxzbyBhZmZlY3RzIHRoZSBpbml0aWFsIHN0YXRlIG9mIG91dHB1dCBzaWduYWxzLgotICoKLSAqIFdpdGhpbiBlYWNoIGdyb3VwIG9mIHBvcnRzLCB0aGVyZSBhcmUgZml2ZSBrbm93biBjb21iaW5hdGlvbnMgb2YKLSAqIEkvTyBwb3J0czogNEk0TywgNFA0TywgOEksIDhQLCA4Tywgc2VlIHRoZSBkZWZpbml0aW9ucyBiZWxvdyBmb3IKLSAqIHRoZSBkZXRhaWxlZCBvcmdhbml6YXRpb24gb2YgdGhlc2UgcG9ydHMuIE9ubHkgR291cCBBIGlzIGludGVycnVwdAotICogY2FwYWJsZS4KLSAqCi0gKiBHUElPIG51bWJlcnMgc3RhcnQgZnJvbSAnZ3Bpb19iYXNlICsgMCcgdG8gJ2dwaW9fYmFzZSArIDgvMTYnLAotICogYW5kIEdQSU9zIGZyb20gR1JPVVBfQSBhcmUgbnVtYmVyZWQgYmVmb3JlIHRob3NlIGZyb20gR1JPVVBfQgotICogKGlmIHRoZXJlIGFyZSB0d28gZ3JvdXBzKS4KLSAqCi0gKiBOT1RFOiBNQVg3MzI4L01BWDczMjkgYXJlIGRyb3AtaW4gcmVwbGFjZW1lbnRzIGZvciBQQ0Y4NTc0L2EsIHNvCi0gKiB0aGV5IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLgotICovCi0KLSNkZWZpbmUgUE9SVF9OT05FCTB4MAkvKiAnLycgTm8gUG9ydCAqLwotI2RlZmluZSBQT1JUX09VVFBVVAkweDEJLyogJ08nIFB1c2gtUHVsbCwgT3V0cHV0IE9ubHkgKi8KLSNkZWZpbmUgUE9SVF9JTlBVVAkweDIJLyogJ0knIElucHV0IE9ubHkgKi8KLSNkZWZpbmUgUE9SVF9PUEVORFJBSU4JMHgzCS8qICdQJyBPcGVuLURyYWluLCBJL08gKi8KLQotI2RlZmluZSBJT180STRPCQkweDVBQTUJLyogTzcgTzYgSTUgSTQgSTMgSTIgTzEgTzAgKi8KLSNkZWZpbmUgSU9fNFA0TwkJMHg1RkY1CS8qIE83IE82IFA1IFA0IFAzIFAyIE8xIE8wICovCi0jZGVmaW5lIElPXzhJCQkweEFBQUEJLyogSTcgSTYgSTUgSTQgSTMgSTIgSTEgSTAgKi8KLSNkZWZpbmUgSU9fOFAJCTB4RkZGRgkvKiBQNyBQNiBQNSBQNCBQMyBQMiBQMSBQMCAqLwotI2RlZmluZSBJT184TwkJMHg1NTU1CS8qIE83IE82IE81IE80IE8zIE8yIE8xIE8wICovCi0KLSNkZWZpbmUgR1JPVVBfQSh4KQkoKHgpICYgMHhmZmZmKQkvKiBJMkMgQWRkcjogMGInMTEweHh4eCAqLwotI2RlZmluZSBHUk9VUF9CKHgpCSgoeCkgPDwgMTYpCS8qIEkyQyBBZGRyOiAwYicxMDF4eHh4ICovCi0KLSNkZWZpbmUgSU5UX05PTkUJMHgwCS8qIE5vIGludGVycnVwdCBjYXBhYmlsaXR5ICovCi0jZGVmaW5lIElOVF9OT19NQVNLCTB4MQkvKiBIYXMgaW50ZXJydXB0cywgbm8gbWFzayAqLwotI2RlZmluZSBJTlRfSU5ERVBfTUFTSwkweDIJLyogSGFzIGludGVycnVwdHMsIGluZGVwZW5kZW50IG1hc2sgKi8KLSNkZWZpbmUgSU5UX01FUkdFRF9NQVNLIDB4MwkvKiBIYXMgaW50ZXJydXB0cywgbWVyZ2VkIG1hc2sgKi8KLQotI2RlZmluZSBJTlRfQ0FQUyh4KQkoKCh1aW50NjRfdCkoeCkpIDw8IDMyKQotCi1lbnVtIHsKLQlNQVg3MzE5LAotCU1BWDczMjAsCi0JTUFYNzMyMSwKLQlNQVg3MzIyLAotCU1BWDczMjMsCi0JTUFYNzMyNCwKLQlNQVg3MzI1LAotCU1BWDczMjYsCi0JTUFYNzMyNywKLX07Ci0KLXN0YXRpYyB1aW50NjRfdCBtYXg3MzJ4X2ZlYXR1cmVzW10gPSB7Ci0JW01BWDczMTldID0gR1JPVVBfQShJT184SSkgfCBJTlRfQ0FQUyhJTlRfTUVSR0VEX01BU0spLAotCVtNQVg3MzIwXSA9IEdST1VQX0IoSU9fOE8pLAotCVtNQVg3MzIxXSA9IEdST1VQX0EoSU9fOFApIHwgSU5UX0NBUFMoSU5UX05PX01BU0spLAotCVtNQVg3MzIyXSA9IEdST1VQX0EoSU9fNEk0TykgfCBJTlRfQ0FQUyhJTlRfTUVSR0VEX01BU0spLAotCVtNQVg3MzIzXSA9IEdST1VQX0EoSU9fNFA0TykgfCBJTlRfQ0FQUyhJTlRfSU5ERVBfTUFTSyksCi0JW01BWDczMjRdID0gR1JPVVBfQShJT184SSkgfCBHUk9VUF9CKElPXzhPKSB8IElOVF9DQVBTKElOVF9NRVJHRURfTUFTSyksCi0JW01BWDczMjVdID0gR1JPVVBfQShJT184UCkgfCBHUk9VUF9CKElPXzhPKSB8IElOVF9DQVBTKElOVF9OT19NQVNLKSwKLQlbTUFYNzMyNl0gPSBHUk9VUF9BKElPXzRJNE8pIHwgR1JPVVBfQihJT184TykgfCBJTlRfQ0FQUyhJTlRfTUVSR0VEX01BU0spLAotCVtNQVg3MzI3XSA9IEdST1VQX0EoSU9fNFA0TykgfCBHUk9VUF9CKElPXzhPKSB8IElOVF9DQVBTKElOVF9OT19NQVNLKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtYXg3MzJ4X2lkW10gPSB7Ci0JeyAibWF4NzMxOSIsIE1BWDczMTkgfSwKLQl7ICJtYXg3MzIwIiwgTUFYNzMyMCB9LAotCXsgIm1heDczMjEiLCBNQVg3MzIxIH0sCi0JeyAibWF4NzMyMiIsIE1BWDczMjIgfSwKLQl7ICJtYXg3MzIzIiwgTUFYNzMyMyB9LAotCXsgIm1heDczMjQiLCBNQVg3MzI0IH0sCi0JeyAibWF4NzMyNSIsIE1BWDczMjUgfSwKLQl7ICJtYXg3MzI2IiwgTUFYNzMyNiB9LAotCXsgIm1heDczMjciLCBNQVg3MzI3IH0sCi0JeyB9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtYXg3MzJ4X2lkKTsKLQotc3RydWN0IG1heDczMnhfY2hpcCB7Ci0Jc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7Ci0KLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwkvKiAibWFpbiIgY2xpZW50ICovCi0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudF9kdW1teTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50X2dyb3VwX2E7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudF9ncm91cF9iOwotCi0JdW5zaWduZWQgaW50CW1hc2tfZ3JvdXBfYTsKLQl1bnNpZ25lZCBpbnQJZGlyX2lucHV0OwotCXVuc2lnbmVkIGludAlkaXJfb3V0cHV0OwotCi0Jc3RydWN0IG11dGV4CWxvY2s7Ci0JdWludDhfdAkJcmVnX291dFsyXTsKLQotI2lmZGVmIENPTkZJR19HUElPX01BWDczMlhfSVJRCi0Jc3RydWN0IG11dGV4CWlycV9sb2NrOwotCWludAkJaXJxX2Jhc2U7Ci0JdWludDhfdAkJaXJxX21hc2s7Ci0JdWludDhfdAkJaXJxX21hc2tfY3VyOwotCXVpbnQ4X3QJCWlycV90cmlnX3JhaXNlOwotCXVpbnQ4X3QJCWlycV90cmlnX2ZhbGw7Ci0JdWludDhfdAkJaXJxX2ZlYXR1cmVzOwotI2VuZGlmCi19OwotCi1zdGF0aWMgaW50IG1heDczMnhfd3JpdGViKHN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAsIGludCBncm91cF9hLCB1aW50OF90IHZhbCkKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCWludCByZXQ7Ci0KLQljbGllbnQgPSBncm91cF9hID8gY2hpcC0+Y2xpZW50X2dyb3VwX2EgOiBjaGlwLT5jbGllbnRfZ3JvdXBfYjsKLQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjbGllbnQsIHZhbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgd3JpdGluZ1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NzMyeF9yZWFkYihzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwLCBpbnQgZ3JvdXBfYSwgdWludDhfdCAqdmFsKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0JaW50IHJldDsKLQotCWNsaWVudCA9IGdyb3VwX2EgPyBjaGlwLT5jbGllbnRfZ3JvdXBfYSA6IGNoaXAtPmNsaWVudF9ncm91cF9iOwotCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCByZWFkaW5nXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkqdmFsID0gKHVpbnQ4X3QpcmV0OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpc19ncm91cF9hKHN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZikKLXsKLQlyZXR1cm4gKDF1IDw8IG9mZikgJiBjaGlwLT5tYXNrX2dyb3VwX2E7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NzMyeF9ncGlvX2dldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2ZmKQotewotCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXA7Ci0JdWludDhfdCByZWdfdmFsOwotCWludCByZXQ7Ci0KLQljaGlwID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgbWF4NzMyeF9jaGlwLCBncGlvX2NoaXApOwotCi0JcmV0ID0gbWF4NzMyeF9yZWFkYihjaGlwLCBpc19ncm91cF9hKGNoaXAsIG9mZiksICZyZWdfdmFsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gcmVnX3ZhbCAmICgxdSA8PCAob2ZmICYgMHg3KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1heDczMnhfZ3Bpb19zZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZiwgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwOwotCXVpbnQ4X3QgcmVnX291dCwgbWFzayA9IDF1IDw8IChvZmYgJiAweDcpOwotCWludCByZXQ7Ci0KLQljaGlwID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgbWF4NzMyeF9jaGlwLCBncGlvX2NoaXApOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7Ci0KLQlyZWdfb3V0ID0gKG9mZiA+IDcpID8gY2hpcC0+cmVnX291dFsxXSA6IGNoaXAtPnJlZ19vdXRbMF07Ci0JcmVnX291dCA9ICh2YWwpID8gcmVnX291dCB8IG1hc2sgOiByZWdfb3V0ICYgfm1hc2s7Ci0KLQlyZXQgPSBtYXg3MzJ4X3dyaXRlYihjaGlwLCBpc19ncm91cF9hKGNoaXAsIG9mZiksIHJlZ19vdXQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCS8qIHVwZGF0ZSB0aGUgc2hhZG93IHJlZ2lzdGVyIHRoZW4gKi8KLQlpZiAob2ZmID4gNykKLQkJY2hpcC0+cmVnX291dFsxXSA9IHJlZ19vdXQ7Ci0JZWxzZQotCQljaGlwLT5yZWdfb3V0WzBdID0gcmVnX291dDsKLW91dDoKLQltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOwotfQotCi1zdGF0aWMgaW50IG1heDczMnhfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZikKLXsKLQlzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwOwotCXVuc2lnbmVkIGludCBtYXNrID0gMXUgPDwgb2ZmOwotCi0JY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IG1heDczMnhfY2hpcCwgZ3Bpb19jaGlwKTsKLQotCWlmICgobWFzayAmIGNoaXAtPmRpcl9pbnB1dCkgPT0gMCkgewotCQlkZXZfZGJnKCZjaGlwLT5jbGllbnQtPmRldiwgIiVzIHBvcnQgJWQgaXMgb3V0cHV0IG9ubHlcbiIsCi0JCQljaGlwLT5jbGllbnQtPm5hbWUsIG9mZik7Ci0JCXJldHVybiAtRUFDQ0VTOwotCX0KLQotCS8qCi0JICogT3Blbi1kcmFpbiBwaW5zIG11c3QgYmUgc2V0IHRvIGhpZ2ggaW1wZWRhbmNlICh3aGljaCBpcwotCSAqIGVxdWl2YWxlbnQgdG8gb3V0cHV0LWhpZ2gpIHRvIGJlIHR1cm5lZCBpbnRvIGFuIGlucHV0LgotCSAqLwotCWlmICgobWFzayAmIGNoaXAtPmRpcl9vdXRwdXQpKQotCQltYXg3MzJ4X2dwaW9fc2V0X3ZhbHVlKGdjLCBvZmYsIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NzMyeF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCi0JCXVuc2lnbmVkIG9mZiwgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwOwotCXVuc2lnbmVkIGludCBtYXNrID0gMXUgPDwgb2ZmOwotCi0JY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IG1heDczMnhfY2hpcCwgZ3Bpb19jaGlwKTsKLQotCWlmICgobWFzayAmIGNoaXAtPmRpcl9vdXRwdXQpID09IDApIHsKLQkJZGV2X2RiZygmY2hpcC0+Y2xpZW50LT5kZXYsICIlcyBwb3J0ICVkIGlzIGlucHV0IG9ubHlcbiIsCi0JCQljaGlwLT5jbGllbnQtPm5hbWUsIG9mZik7Ci0JCXJldHVybiAtRUFDQ0VTOwotCX0KLQotCW1heDczMnhfZ3Bpb19zZXRfdmFsdWUoZ2MsIG9mZiwgdmFsKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19HUElPX01BWDczMlhfSVJRCi1zdGF0aWMgaW50IG1heDczMnhfd3JpdGV3KHN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAsIHVpbnQxNl90IHZhbCkKLXsKLQlpbnQgcmV0OwotCi0JdmFsID0gY3B1X3RvX2xlMTYodmFsKTsKLQotCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjaGlwLT5jbGllbnRfZ3JvdXBfYSwgKGNoYXIgKikmdmFsLCAyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjaGlwLT5jbGllbnRfZ3JvdXBfYS0+ZGV2LCAiZmFpbGVkIHdyaXRpbmdcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1heDczMnhfcmVhZHcoc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCwgdWludDE2X3QgKnZhbCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNoaXAtPmNsaWVudF9ncm91cF9hLCAoY2hhciAqKXZhbCwgMik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2hpcC0+Y2xpZW50X2dyb3VwX2EtPmRldiwgImZhaWxlZCByZWFkaW5nXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkqdmFsID0gbGUxNl90b19jcHUoKnZhbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1heDczMnhfaXJxX3VwZGF0ZV9tYXNrKHN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXApCi17Ci0JdWludDE2X3QgbXNnOwotCi0JaWYgKGNoaXAtPmlycV9tYXNrID09IGNoaXAtPmlycV9tYXNrX2N1cikKLQkJcmV0dXJuOwotCi0JY2hpcC0+aXJxX21hc2sgPSBjaGlwLT5pcnFfbWFza19jdXI7Ci0KLQlpZiAoY2hpcC0+aXJxX2ZlYXR1cmVzID09IElOVF9OT19NQVNLKQotCQlyZXR1cm47Ci0KLQltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKLQotCXN3aXRjaCAoY2hpcC0+aXJxX2ZlYXR1cmVzKSB7Ci0JY2FzZSBJTlRfSU5ERVBfTUFTSzoKLQkJbXNnID0gKGNoaXAtPmlycV9tYXNrIDw8IDgpIHwgY2hpcC0+cmVnX291dFswXTsKLQkJbWF4NzMyeF93cml0ZXcoY2hpcCwgbXNnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElOVF9NRVJHRURfTUFTSzoKLQkJbXNnID0gY2hpcC0+aXJxX21hc2sgfCBjaGlwLT5yZWdfb3V0WzBdOwotCQltYXg3MzJ4X3dyaXRlYihjaGlwLCAxLCAodWludDhfdCltc2cpOwotCQlicmVhazsKLQl9Ci0KLQltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOwotfQotCi1zdGF0aWMgaW50IG1heDczMnhfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZikKLXsKLQlzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwOwotCi0JY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IG1heDczMnhfY2hpcCwgZ3Bpb19jaGlwKTsKLQlyZXR1cm4gY2hpcC0+aXJxX2Jhc2UgKyBvZmY7Ci19Ci0KLXN0YXRpYyB2b2lkIG1heDczMnhfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQotCWNoaXAtPmlycV9tYXNrX2N1ciAmPSB+KDEgPDwgKGQtPmlycSAtIGNoaXAtPmlycV9iYXNlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1heDczMnhfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0Jc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCi0JY2hpcC0+aXJxX21hc2tfY3VyIHw9IDEgPDwgKGQtPmlycSAtIGNoaXAtPmlycV9iYXNlKTsKLX0KLQotc3RhdGljIHZvaWQgbWF4NzMyeF9pcnFfYnVzX2xvY2soc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQotCW11dGV4X2xvY2soJmNoaXAtPmlycV9sb2NrKTsKLQljaGlwLT5pcnFfbWFza19jdXIgPSBjaGlwLT5pcnFfbWFzazsKLX0KLQotc3RhdGljIHZvaWQgbWF4NzMyeF9pcnFfYnVzX3N5bmNfdW5sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0KLQltYXg3MzJ4X2lycV91cGRhdGVfbWFzayhjaGlwKTsKLQltdXRleF91bmxvY2soJmNoaXAtPmlycV9sb2NrKTsKLX0KLQotc3RhdGljIGludCBtYXg3MzJ4X2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQotewotCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl1aW50MTZfdCBvZmYgPSBkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZTsKLQl1aW50MTZfdCBtYXNrID0gMSA8PCBvZmY7Ci0KLQlpZiAoIShtYXNrICYgY2hpcC0+ZGlyX2lucHV0KSkgewotCQlkZXZfZGJnKCZjaGlwLT5jbGllbnQtPmRldiwgIiVzIHBvcnQgJWQgaXMgb3V0cHV0IG9ubHlcbiIsCi0JCQljaGlwLT5jbGllbnQtPm5hbWUsIG9mZik7Ci0JCXJldHVybiAtRUFDQ0VTOwotCX0KLQotCWlmICghKHR5cGUgJiBJUlFfVFlQRV9FREdFX0JPVEgpKSB7Ci0JCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAiaXJxICVkOiB1bnN1cHBvcnRlZCB0eXBlICVkXG4iLAotCQkJZC0+aXJxLCB0eXBlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpCi0JCWNoaXAtPmlycV90cmlnX2ZhbGwgfD0gbWFzazsKLQllbHNlCi0JCWNoaXAtPmlycV90cmlnX2ZhbGwgJj0gfm1hc2s7Ci0KLQlpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfUklTSU5HKQotCQljaGlwLT5pcnFfdHJpZ19yYWlzZSB8PSBtYXNrOwotCWVsc2UKLQkJY2hpcC0+aXJxX3RyaWdfcmFpc2UgJj0gfm1hc2s7Ci0KLQlyZXR1cm4gbWF4NzMyeF9ncGlvX2RpcmVjdGlvbl9pbnB1dCgmY2hpcC0+Z3Bpb19jaGlwLCBvZmYpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIG1heDczMnhfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJCQk9ICJtYXg3MzJ4IiwKLQkuaXJxX21hc2sJCT0gbWF4NzMyeF9pcnFfbWFzaywKLQkuaXJxX3VubWFzawkJPSBtYXg3MzJ4X2lycV91bm1hc2ssCi0JLmlycV9idXNfbG9jawkJPSBtYXg3MzJ4X2lycV9idXNfbG9jaywKLQkuaXJxX2J1c19zeW5jX3VubG9jawk9IG1heDczMnhfaXJxX2J1c19zeW5jX3VubG9jaywKLQkuaXJxX3NldF90eXBlCQk9IG1heDczMnhfaXJxX3NldF90eXBlLAotfTsKLQotc3RhdGljIHVpbnQ4X3QgbWF4NzMyeF9pcnFfcGVuZGluZyhzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwKQotewotCXVpbnQ4X3QgY3VyX3N0YXQ7Ci0JdWludDhfdCBvbGRfc3RhdDsKLQl1aW50OF90IHRyaWdnZXI7Ci0JdWludDhfdCBwZW5kaW5nOwotCXVpbnQxNl90IHN0YXR1czsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbWF4NzMyeF9yZWFkdyhjaGlwLCAmc3RhdHVzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gMDsKLQotCXRyaWdnZXIgPSBzdGF0dXMgPj4gODsKLQl0cmlnZ2VyICY9IGNoaXAtPmlycV9tYXNrOwotCi0JaWYgKCF0cmlnZ2VyKQotCQlyZXR1cm4gMDsKLQotCWN1cl9zdGF0ID0gc3RhdHVzICYgMHhGRjsKLQljdXJfc3RhdCAmPSBjaGlwLT5pcnFfbWFzazsKLQotCW9sZF9zdGF0ID0gY3VyX3N0YXQgXiB0cmlnZ2VyOwotCi0JcGVuZGluZyA9IChvbGRfc3RhdCAmIGNoaXAtPmlycV90cmlnX2ZhbGwpIHwKLQkJICAoY3VyX3N0YXQgJiBjaGlwLT5pcnFfdHJpZ19yYWlzZSk7Ci0JcGVuZGluZyAmPSB0cmlnZ2VyOwotCi0JcmV0dXJuIHBlbmRpbmc7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBtYXg3MzJ4X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldmlkKQotewotCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBkZXZpZDsKLQl1aW50OF90IHBlbmRpbmc7Ci0JdWludDhfdCBsZXZlbDsKLQotCXBlbmRpbmcgPSBtYXg3MzJ4X2lycV9wZW5kaW5nKGNoaXApOwotCi0JaWYgKCFwZW5kaW5nKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLQlkbyB7Ci0JCWxldmVsID0gX19mZnMocGVuZGluZyk7Ci0JCWhhbmRsZV9uZXN0ZWRfaXJxKGxldmVsICsgY2hpcC0+aXJxX2Jhc2UpOwotCi0JCXBlbmRpbmcgJj0gfigxIDw8IGxldmVsKTsKLQl9IHdoaWxlIChwZW5kaW5nKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBtYXg3MzJ4X2lycV9zZXR1cChzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKLQlzdHJ1Y3QgbWF4NzMyeF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaW50IGhhc19pcnEgPSBtYXg3MzJ4X2ZlYXR1cmVzW2lkLT5kcml2ZXJfZGF0YV0gPj4gMzI7Ci0JaW50IHJldDsKLQotCWlmIChwZGF0YS0+aXJxX2Jhc2UgJiYgaGFzX2lycSAhPSBJTlRfTk9ORSkgewotCQlpbnQgbHZsOwotCi0JCWNoaXAtPmlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOwotCQljaGlwLT5pcnFfZmVhdHVyZXMgPSBoYXNfaXJxOwotCQltdXRleF9pbml0KCZjaGlwLT5pcnFfbG9jayk7Ci0KLQkJZm9yIChsdmwgPSAwOyBsdmwgPCBjaGlwLT5ncGlvX2NoaXAubmdwaW87IGx2bCsrKSB7Ci0JCQlpbnQgaXJxID0gbHZsICsgY2hpcC0+aXJxX2Jhc2U7Ci0KLQkJCWlmICghKGNoaXAtPmRpcl9pbnB1dCAmICgxIDw8IGx2bCkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGNoaXApOwotCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJm1heDczMnhfaXJxX2NoaXAsCi0JCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKLQkJCWlycV9zZXRfbmVzdGVkX3RocmVhZChpcnEsIDEpOwotI2lmZGVmIENPTkZJR19BUk0KLQkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKLSNlbHNlCi0JCQlpcnFfc2V0X25vcHJvYmUoaXJxKTsKLSNlbmRpZgotCQl9Ci0KLQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2xpZW50LT5pcnEsCi0JCQkJCSAgIE5VTEwsCi0JCQkJCSAgIG1heDczMnhfaXJxX2hhbmRsZXIsCi0JCQkJCSAgIElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9PTkVTSE9ULAotCQkJCQkgICBkZXZfbmFtZSgmY2xpZW50LT5kZXYpLCBjaGlwKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsCi0JCQkJY2xpZW50LT5pcnEpOwotCQkJZ290byBvdXRfZmFpbGVkOwotCQl9Ci0KLQkJY2hpcC0+Z3Bpb19jaGlwLnRvX2lycSA9IG1heDczMnhfZ3Bpb190b19pcnE7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLW91dF9mYWlsZWQ6Ci0JY2hpcC0+aXJxX2Jhc2UgPSAwOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1heDczMnhfaXJxX3RlYXJkb3duKHN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXApCi17Ci0JaWYgKGNoaXAtPmlycV9iYXNlKQotCQlmcmVlX2lycShjaGlwLT5jbGllbnQtPmlycSwgY2hpcCk7Ci19Ci0jZWxzZSAvKiBDT05GSUdfR1BJT19NQVg3MzJYX0lSUSAqLwotc3RhdGljIGludCBtYXg3MzJ4X2lycV9zZXR1cChzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKLQlzdHJ1Y3QgbWF4NzMyeF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaW50IGhhc19pcnEgPSBtYXg3MzJ4X2ZlYXR1cmVzW2lkLT5kcml2ZXJfZGF0YV0gPj4gMzI7Ci0KLQlpZiAocGRhdGEtPmlycV9iYXNlICYmIGhhc19pcnEgIT0gSU5UX05PTkUpCi0JCWRldl93YXJuKCZjbGllbnQtPmRldiwgImludGVycnVwdCBzdXBwb3J0IG5vdCBjb21waWxlZCBpblxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbWF4NzMyeF9pcnFfdGVhcmRvd24oc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCkKLXsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtYXg3MzJ4X3NldHVwX2dwaW8oc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCwKLQkJCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkLAotCQkJCQl1bnNpZ25lZCBncGlvX3N0YXJ0KQotewotCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gJmNoaXAtPmdwaW9fY2hpcDsKLQl1aW50MzJfdCBpZF9kYXRhID0gKHVpbnQzMl90KW1heDczMnhfZmVhdHVyZXNbaWQtPmRyaXZlcl9kYXRhXTsKLQlpbnQgaSwgcG9ydCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKywgaWRfZGF0YSA+Pj0gMikgewotCQl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgcG9ydDsKLQotCQlzd2l0Y2ggKGlkX2RhdGEgJiAweDMpIHsKLQkJY2FzZSBQT1JUX09VVFBVVDoKLQkJCWNoaXAtPmRpcl9vdXRwdXQgfD0gbWFzazsKLQkJCWJyZWFrOwotCQljYXNlIFBPUlRfSU5QVVQ6Ci0JCQljaGlwLT5kaXJfaW5wdXQgfD0gbWFzazsKLQkJCWJyZWFrOwotCQljYXNlIFBPUlRfT1BFTkRSQUlOOgotCQkJY2hpcC0+ZGlyX291dHB1dCB8PSBtYXNrOwotCQkJY2hpcC0+ZGlyX2lucHV0IHw9IG1hc2s7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGkgPCA4KQotCQkJY2hpcC0+bWFza19ncm91cF9hIHw9IG1hc2s7Ci0JCXBvcnQrKzsKLQl9Ci0KLQlpZiAoY2hpcC0+ZGlyX2lucHV0KQotCQlnYy0+ZGlyZWN0aW9uX2lucHV0ID0gbWF4NzMyeF9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKLQlpZiAoY2hpcC0+ZGlyX291dHB1dCkgewotCQlnYy0+ZGlyZWN0aW9uX291dHB1dCA9IG1heDczMnhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OwotCQlnYy0+c2V0ID0gbWF4NzMyeF9ncGlvX3NldF92YWx1ZTsKLQl9Ci0JZ2MtPmdldCA9IG1heDczMnhfZ3Bpb19nZXRfdmFsdWU7Ci0JZ2MtPmNhbl9zbGVlcCA9IDE7Ci0KLQlnYy0+YmFzZSA9IGdwaW9fc3RhcnQ7Ci0JZ2MtPm5ncGlvID0gcG9ydDsKLQlnYy0+bGFiZWwgPSBjaGlwLT5jbGllbnQtPm5hbWU7Ci0JZ2MtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlyZXR1cm4gcG9ydDsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgbWF4NzMyeF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgbWF4NzMyeF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKLQlzdHJ1Y3QgbWF4NzMyeF9jaGlwICpjaGlwOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjOwotCXVpbnQxNl90IGFkZHJfYSwgYWRkcl9iOwotCWludCByZXQsIG5yX3BvcnQ7Ci0KLQlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKHBkYXRhID09IE5VTEwpIHsKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtYXg3MzJ4X2NoaXApLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2hpcCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQljaGlwLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQlucl9wb3J0ID0gbWF4NzMyeF9zZXR1cF9ncGlvKGNoaXAsIGlkLCBwZGF0YS0+Z3Bpb19iYXNlKTsKLQotCWFkZHJfYSA9IChjbGllbnQtPmFkZHIgJiAweDBmKSB8IDB4NjA7Ci0JYWRkcl9iID0gKGNsaWVudC0+YWRkciAmIDB4MGYpIHwgMHg1MDsKLQotCXN3aXRjaCAoY2xpZW50LT5hZGRyICYgMHg3MCkgewotCWNhc2UgMHg2MDoKLQkJY2hpcC0+Y2xpZW50X2dyb3VwX2EgPSBjbGllbnQ7Ci0JCWlmIChucl9wb3J0ID4gOCkgewotCQkJYyA9IGkyY19uZXdfZHVtbXkoY2xpZW50LT5hZGFwdGVyLCBhZGRyX2IpOwotCQkJY2hpcC0+Y2xpZW50X2dyb3VwX2IgPSBjaGlwLT5jbGllbnRfZHVtbXkgPSBjOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMHg1MDoKLQkJY2hpcC0+Y2xpZW50X2dyb3VwX2IgPSBjbGllbnQ7Ci0JCWlmIChucl9wb3J0ID4gOCkgewotCQkJYyA9IGkyY19uZXdfZHVtbXkoY2xpZW50LT5hZGFwdGVyLCBhZGRyX2EpOwotCQkJY2hpcC0+Y2xpZW50X2dyb3VwX2EgPSBjaGlwLT5jbGllbnRfZHVtbXkgPSBjOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaW52YWxpZCBJMkMgYWRkcmVzcyBzcGVjaWZpZWQgJTAyeFxuIiwKLQkJCQljbGllbnQtPmFkZHIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9mYWlsZWQ7Ci0JfQotCi0JbXV0ZXhfaW5pdCgmY2hpcC0+bG9jayk7Ci0KLQltYXg3MzJ4X3JlYWRiKGNoaXAsIGlzX2dyb3VwX2EoY2hpcCwgMCksICZjaGlwLT5yZWdfb3V0WzBdKTsKLQlpZiAobnJfcG9ydCA+IDgpCi0JCW1heDczMnhfcmVhZGIoY2hpcCwgaXNfZ3JvdXBfYShjaGlwLCA4KSwgJmNoaXAtPnJlZ19vdXRbMV0pOwotCi0JcmV0ID0gbWF4NzMyeF9pcnFfc2V0dXAoY2hpcCwgaWQpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X2ZhaWxlZDsKLQotCXJldCA9IGdwaW9jaGlwX2FkZCgmY2hpcC0+Z3Bpb19jaGlwKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9mYWlsZWQ7Ci0KLQlpZiAocGRhdGEtPnNldHVwKSB7Ci0JCXJldCA9IHBkYXRhLT5zZXR1cChjbGllbnQsIGNoaXAtPmdwaW9fY2hpcC5iYXNlLAotCQkJCWNoaXAtPmdwaW9fY2hpcC5uZ3BpbywgcGRhdGEtPmNvbnRleHQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgInNldHVwIGZhaWxlZCwgJWRcbiIsIHJldCk7Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7Ci0JcmV0dXJuIDA7Ci0KLW91dF9mYWlsZWQ6Ci0JbWF4NzMyeF9pcnFfdGVhcmRvd24oY2hpcCk7Ci0Ja2ZyZWUoY2hpcCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgbWF4NzMyeF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbWF4NzMyeF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWludCByZXQ7Ci0KLQlpZiAocGRhdGEtPnRlYXJkb3duKSB7Ci0JCXJldCA9IHBkYXRhLT50ZWFyZG93bihjbGllbnQsIGNoaXAtPmdwaW9fY2hpcC5iYXNlLAotCQkJCWNoaXAtPmdwaW9fY2hpcC5uZ3BpbywgcGRhdGEtPmNvbnRleHQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBmYWlsZWQsICVkXG4iLAotCQkJCQkidGVhcmRvd24iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmY2hpcC0+Z3Bpb19jaGlwKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgZmFpbGVkLCAlZFxuIiwKLQkJCQkiZ3Bpb2NoaXBfcmVtb3ZlKCkiLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCW1heDczMnhfaXJxX3RlYXJkb3duKGNoaXApOwotCi0JLyogdW5yZWdpc3RlciBhbnkgZHVtbXkgaTJjX2NsaWVudCAqLwotCWlmIChjaGlwLT5jbGllbnRfZHVtbXkpCi0JCWkyY191bnJlZ2lzdGVyX2RldmljZShjaGlwLT5jbGllbnRfZHVtbXkpOwotCi0Ja2ZyZWUoY2hpcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXg3MzJ4X2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9ICJtYXg3MzJ4IiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJCT0gbWF4NzMyeF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1heDczMnhfcmVtb3ZlKSwKLQkuaWRfdGFibGUJPSBtYXg3MzJ4X2lkLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbWF4NzMyeF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtYXg3MzJ4X2RyaXZlcik7Ci19Ci0vKiByZWdpc3RlciBhZnRlciBpMmMgcG9zdGNvcmUgaW5pdGNhbGwgYW5kIGJlZm9yZQotICogc3Vic3lzIGluaXRjYWxscyB0aGF0IG1heSByZWx5IG9uIHRoZXNlIEdQSU9zCi0gKi8KLXN1YnN5c19pbml0Y2FsbChtYXg3MzJ4X2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbWF4NzMyeF9leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJm1heDczMnhfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1heDczMnhfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkVyaWMgTWlhbyA8ZXJpYy5taWFvQG1hcnZlbGwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJHUElPIGV4cGFuZGVyIGRyaXZlciBmb3IgTUFYNzMyWCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL21jMzM4ODAuYyBiL2RyaXZlcnMvZ3Bpby9tYzMzODgwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzc5NzUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL21jMzM4ODAuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogbWMzMzg4MC5jIE1DMzM4ODAgaGlnaC1zaWRlL2xvdy1zaWRlIHN3aXRjaCBHUElPIGRyaXZlcgotICogQ29weXJpZ2h0IChjKSAyMDA5IEludGVsIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotLyogU3VwcG9ydHM6Ci0gKiBGcmVlc2NhbGUgTUMzMzg4MCBoaWdoLXNpZGUvbG93LXNpZGUgc3dpdGNoCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvbWMzMzg4MC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNkZWZpbmUgRFJJVkVSX05BTUUgIm1jMzM4ODAiCi0KLS8qCi0gKiBQaW4gY29uZmlndXJhdGlvbnMsIHNlZSBNQVg3MzAxIGRhdGFzaGVldCBwYWdlIDYKLSAqLwotI2RlZmluZSBQSU5fQ09ORklHX01BU0sgMHgwMwotI2RlZmluZSBQSU5fQ09ORklHX0lOX1BVTExVUCAweDAzCi0jZGVmaW5lIFBJTl9DT05GSUdfSU5fV09fUFVMTFVQIDB4MDIKLSNkZWZpbmUgUElOX0NPTkZJR19PVVQgMHgwMQotCi0jZGVmaW5lIFBJTl9OVU1CRVIgOAotCi0KLS8qCi0gKiBTb21lIHJlZ2lzdGVycyBtdXN0IGJlIHJlYWQgYmFjayB0byBtb2RpZnkuCi0gKiBUbyBzYXZlIHRpbWUgd2UgY2FjaGUgdGhlbSBoZXJlIGluIG1lbW9yeQotICovCi1zdHJ1Y3QgbWMzMzg4MCB7Ci0Jc3RydWN0IG11dGV4CWxvY2s7CS8qIHByb3RlY3QgZnJvbSBzaW11bHRhbmVvdXMgYWNjZXNzZXMgKi8KLQl1OAkJcG9ydF9jb25maWc7Ci0Jc3RydWN0IGdwaW9fY2hpcCBjaGlwOwotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7Ci19OwotCi1zdGF0aWMgaW50IG1jMzM4ODBfd3JpdGVfY29uZmlnKHN0cnVjdCBtYzMzODgwICptYykKLXsKLQlyZXR1cm4gc3BpX3dyaXRlKG1jLT5zcGksICZtYy0+cG9ydF9jb25maWcsIHNpemVvZihtYy0+cG9ydF9jb25maWcpKTsKLX0KLQotCi1zdGF0aWMgaW50IF9fbWMzMzg4MF9zZXQoc3RydWN0IG1jMzM4ODAgKm1jLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlpZiAodmFsdWUpCi0JCW1jLT5wb3J0X2NvbmZpZyB8PSAxIDw8IG9mZnNldDsKLQllbHNlCi0JCW1jLT5wb3J0X2NvbmZpZyAmPSB+KDEgPDwgb2Zmc2V0KTsKLQotCXJldHVybiBtYzMzODgwX3dyaXRlX2NvbmZpZyhtYyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgbWMzMzg4MF9zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IG1jMzM4ODAgKm1jID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtYzMzODgwLCBjaGlwKTsKLQotCW11dGV4X2xvY2soJm1jLT5sb2NrKTsKLQotCV9fbWMzMzg4MF9zZXQobWMsIG9mZnNldCwgdmFsdWUpOwotCi0JbXV0ZXhfdW5sb2NrKCZtYy0+bG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IG1jMzM4ODBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgbWMzMzg4MCAqbWM7Ci0Jc3RydWN0IG1jMzM4ODBfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0JaW50IHJldDsKLQotCXBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+YmFzZSkgewotCQlkZXZfZGJnKCZzcGktPmRldiwgImluY29ycmVjdCBvciBtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKgotCSAqIGJpdHNfcGVyX3dvcmQgY2Fubm90IGJlIGNvbmZpZ3VyZWQgaW4gcGxhdGZvcm0gZGF0YQotCSAqLwotCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7Ci0KLQlyZXQgPSBzcGlfc2V0dXAoc3BpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCW1jID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1jMzM4ODApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1jKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW11dGV4X2luaXQoJm1jLT5sb2NrKTsKLQotCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIG1jKTsKLQotCW1jLT5zcGkgPSBzcGk7Ci0KLQltYy0+Y2hpcC5sYWJlbCA9IERSSVZFUl9OQU1FLAotCW1jLT5jaGlwLnNldCA9IG1jMzM4ODBfc2V0OwotCW1jLT5jaGlwLmJhc2UgPSBwZGF0YS0+YmFzZTsKLQltYy0+Y2hpcC5uZ3BpbyA9IFBJTl9OVU1CRVI7Ci0JbWMtPmNoaXAuY2FuX3NsZWVwID0gMTsKLQltYy0+Y2hpcC5kZXYgPSAmc3BpLT5kZXY7Ci0JbWMtPmNoaXAub3duZXIgPSBUSElTX01PRFVMRTsKLQotCW1jLT5wb3J0X2NvbmZpZyA9IDB4MDA7Ci0JLyogd3JpdGUgdHdpY2UsIGJlY2F1c2UgZHVyaW5nIGluaXRpYWxpc2F0aW9uIHRoZSBmaXJzdCBzZXR0aW5nCi0JICogaXMganVzdCBmb3IgdGVzdGluZyBTUEkgY29tbXVuaWNhdGlvbiwgYW5kIHRoZSBzZWNvbmQgaXMgdGhlCi0JICogInJlYWwiIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlyZXQgPSBtYzMzODgwX3dyaXRlX2NvbmZpZyhtYyk7Ci0JbWMtPnBvcnRfY29uZmlnID0gMHgwMDsKLQlpZiAoIXJldCkKLQkJcmV0ID0gbWMzMzg4MF93cml0ZV9jb25maWcobWMpOwotCi0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB3cml0aW5nIHRvICIgRFJJVkVSX05BTUUgIjogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXhpdF9kZXN0cm95OwotCX0KLQotCXJldCA9IGdwaW9jaGlwX2FkZCgmbWMtPmNoaXApOwotCWlmIChyZXQpCi0JCWdvdG8gZXhpdF9kZXN0cm95OwotCi0JcmV0dXJuIHJldDsKLQotZXhpdF9kZXN0cm95OgotCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIE5VTEwpOwotCW11dGV4X2Rlc3Ryb3koJm1jLT5sb2NrKTsKLQlrZnJlZShtYyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgbWMzMzg4MF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgbWMzMzg4MCAqbWM7Ci0JaW50IHJldDsKLQotCW1jID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7Ci0JaWYgKG1jID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7Ci0KLQlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJm1jLT5jaGlwKTsKLQlpZiAoIXJldCkgewotCQltdXRleF9kZXN0cm95KCZtYy0+bG9jayk7Ci0JCWtmcmVlKG1jKTsKLQl9IGVsc2UKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gcmVtb3ZlIHRoZSBHUElPIGNvbnRyb2xsZXI6ICVkXG4iLAotCQkJcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBtYzMzODgwX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQkJPSBEUklWRVJfTkFNRSwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlCQk9IG1jMzM4ODBfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtYzMzODgwX3JlbW92ZSksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtYzMzODgwX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmbWMzMzg4MF9kcml2ZXIpOwotfQotLyogcmVnaXN0ZXIgYWZ0ZXIgc3BpIHBvc3Rjb3JlIGluaXRjYWxsIGFuZCBiZWZvcmUKLSAqIHN1YnN5cyBpbml0Y2FsbHMgdGhhdCBtYXkgcmVseSBvbiB0aGVzZSBHUElPcwotICovCi1zdWJzeXNfaW5pdGNhbGwobWMzMzg4MF9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG1jMzM4ODBfZXhpdCh2b2lkKQotewotCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmbWMzMzg4MF9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQobWMzMzg4MF9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiTW9jZWFuIExhYm9yYXRvcmllcyA8aW5mb0Btb2NlYW4tbGFicy5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9tY3AyM3MwOC5jIGIvZHJpdmVycy9ncGlvL21jcDIzczA4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTA3NjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL21jcDIzczA4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoKLSAqIG1jcDIzczA4LmMgLSBTUEkgZ3BpbyBleHBhbmRlciBkcml2ZXIKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9tY3AyM3MwOC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0KLS8qKgotICogTUNQIHR5cGVzIHN1cHBvcnRlZCBieSBkcml2ZXIKLSAqLwotI2RlZmluZSBNQ1BfVFlQRV9TMDgJMAotI2RlZmluZSBNQ1BfVFlQRV9TMTcJMQotCi0vKiBSZWdpc3RlcnMgYXJlIGFsbCA4IGJpdHMgd2lkZS4KLSAqCi0gKiBUaGUgbWNwMjNzMTcgaGFzIHR3aWNlIGFzIG1hbnkgYml0cywgYW5kIGNhbiBiZSBjb25maWd1cmVkIHRvIHdvcmsKLSAqIHdpdGggZWl0aGVyIDE2IGJpdCByZWdpc3RlcnMgb3Igd2l0aCB0d28gYWRqYWNlbnQgOCBiaXQgYmFua3MuCi0gKgotICogQWxzbywgdGhlcmUgYXJlIEkyQyB2ZXJzaW9ucyBvZiBib3RoIGNoaXBzLgotICovCi0jZGVmaW5lIE1DUF9JT0RJUgkweDAwCQkvKiBpbml0L3Jlc2V0OiAgYWxsIG9uZXMgKi8KLSNkZWZpbmUgTUNQX0lQT0wJMHgwMQotI2RlZmluZSBNQ1BfR1BJTlRFTgkweDAyCi0jZGVmaW5lIE1DUF9ERUZWQUwJMHgwMwotI2RlZmluZSBNQ1BfSU5UQ09OCTB4MDQKLSNkZWZpbmUgTUNQX0lPQ09OCTB4MDUKLSMJZGVmaW5lIElPQ09OX1NFUU9QCSgxIDw8IDUpCi0jCWRlZmluZSBJT0NPTl9IQUVOCSgxIDw8IDMpCi0jCWRlZmluZSBJT0NPTl9PRFIJKDEgPDwgMikKLSMJZGVmaW5lIElPQ09OX0lOVFBPTAkoMSA8PCAxKQotI2RlZmluZSBNQ1BfR1BQVQkweDA2Ci0jZGVmaW5lIE1DUF9JTlRGCTB4MDcKLSNkZWZpbmUgTUNQX0lOVENBUAkweDA4Ci0jZGVmaW5lIE1DUF9HUElPCTB4MDkKLSNkZWZpbmUgTUNQX09MQVQJMHgwYQotCi1zdHJ1Y3QgbWNwMjNzMDg7Ci0KLXN0cnVjdCBtY3AyM3MwOF9vcHMgewotCWludAkoKnJlYWQpKHN0cnVjdCBtY3AyM3MwOCAqbWNwLCB1bnNpZ25lZCByZWcpOwotCWludAkoKndyaXRlKShzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCB2YWwpOwotCWludAkoKnJlYWRfcmVncykoc3RydWN0IG1jcDIzczA4ICptY3AsIHVuc2lnbmVkIHJlZywKLQkJCSAgICAgdTE2ICp2YWxzLCB1bnNpZ25lZCBuKTsKLX07Ci0KLXN0cnVjdCBtY3AyM3MwOCB7Ci0Jc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKLQl1OAkJCWFkZHI7Ci0KLQl1MTYJCQljYWNoZVsxMV07Ci0JLyogbG9jayBwcm90ZWN0cyB0aGUgY2FjaGVkIHZhbHVlcyAqLwotCXN0cnVjdCBtdXRleAkJbG9jazsKLQotCXN0cnVjdCBncGlvX2NoaXAJY2hpcDsKLQotCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwotCi0JY29uc3Qgc3RydWN0IG1jcDIzczA4X29wcwkqb3BzOwotfTsKLQotLyogQSBnaXZlbiBzcGlfZGV2aWNlIGNhbiByZXByZXNlbnQgdXAgdG8gZWlnaHQgbWNwMjNzeHggY2hpcHMKLSAqIHNoYXJpbmcgdGhlIHNhbWUgY2hpcHNlbGVjdCBidXQgdXNpbmcgZGlmZmVyZW50IGFkZHJlc3NlcwotICogKGUuZy4gY2hpcHMgIzAgYW5kICMzIG1pZ2h0IGJlIHBvcHVsYXRlZCwgYnV0IG5vdCAjMSBvciAkMikuCi0gKiBEcml2ZXIgZGF0YSBob2xkcyBhbGwgdGhlIHBlci1jaGlwIGRhdGEuCi0gKi8KLXN0cnVjdCBtY3AyM3MwOF9kcml2ZXJfZGF0YSB7Ci0JdW5zaWduZWQJCW5ncGlvOwotCXN0cnVjdCBtY3AyM3MwOAkJKm1jcFs4XTsKLQlzdHJ1Y3QgbWNwMjNzMDgJCWNoaXBbXTsKLX07Ci0KLXN0YXRpYyBpbnQgbWNwMjNzMDhfcmVhZChzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgcmVnKQotewotCXU4CXR4WzJdLCByeFsxXTsKLQlpbnQJc3RhdHVzOwotCi0JdHhbMF0gPSBtY3AtPmFkZHIgfCAweDAxOwotCXR4WzFdID0gcmVnOwotCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQobWNwLT5zcGksIHR4LCBzaXplb2YgdHgsIHJ4LCBzaXplb2YgcngpOwotCXJldHVybiAoc3RhdHVzIDwgMCkgPyBzdGF0dXMgOiByeFswXTsKLX0KLQotc3RhdGljIGludCBtY3AyM3MwOF93cml0ZShzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCB2YWwpCi17Ci0JdTgJdHhbM107Ci0KLQl0eFswXSA9IG1jcC0+YWRkcjsKLQl0eFsxXSA9IHJlZzsKLQl0eFsyXSA9IHZhbDsKLQlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChtY3AtPnNwaSwgdHgsIHNpemVvZiB0eCwgTlVMTCwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLW1jcDIzczA4X3JlYWRfcmVncyhzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgcmVnLCB1MTYgKnZhbHMsIHVuc2lnbmVkIG4pCi17Ci0JdTgJdHhbMl0sICp0bXA7Ci0JaW50CXN0YXR1czsKLQotCWlmICgobiArIHJlZykgPiBzaXplb2YgbWNwLT5jYWNoZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JdHhbMF0gPSBtY3AtPmFkZHIgfCAweDAxOwotCXR4WzFdID0gcmVnOwotCi0JdG1wID0gKHU4ICopdmFsczsKLQlzdGF0dXMgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKG1jcC0+c3BpLCB0eCwgc2l6ZW9mIHR4LCB0bXAsIG4pOwotCWlmIChzdGF0dXMgPj0gMCkgewotCQl3aGlsZSAobi0tKQotCQkJdmFsc1tuXSA9IHRtcFtuXTsgLyogZXhwYW5kIHRvIDE2Yml0ICovCi0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgbWNwMjNzMTdfcmVhZChzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgcmVnKQotewotCXU4CXR4WzJdLCByeFsyXTsKLQlpbnQJc3RhdHVzOwotCi0JdHhbMF0gPSBtY3AtPmFkZHIgfCAweDAxOwotCXR4WzFdID0gcmVnIDw8IDE7Ci0Jc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChtY3AtPnNwaSwgdHgsIHNpemVvZiB0eCwgcngsIHNpemVvZiByeCk7Ci0JcmV0dXJuIChzdGF0dXMgPCAwKSA/IHN0YXR1cyA6IChyeFswXSB8IChyeFsxXSA8PCA4KSk7Ci19Ci0KLXN0YXRpYyBpbnQgbWNwMjNzMTdfd3JpdGUoc3RydWN0IG1jcDIzczA4ICptY3AsIHVuc2lnbmVkIHJlZywgdW5zaWduZWQgdmFsKQotewotCXU4CXR4WzRdOwotCi0JdHhbMF0gPSBtY3AtPmFkZHI7Ci0JdHhbMV0gPSByZWcgPDwgMTsKLQl0eFsyXSA9IHZhbDsKLQl0eFszXSA9IHZhbCA+PiA4OwotCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKG1jcC0+c3BpLCB0eCwgc2l6ZW9mIHR4LCBOVUxMLCAwKTsKLX0KLQotc3RhdGljIGludAotbWNwMjNzMTdfcmVhZF9yZWdzKHN0cnVjdCBtY3AyM3MwOCAqbWNwLCB1bnNpZ25lZCByZWcsIHUxNiAqdmFscywgdW5zaWduZWQgbikKLXsKLQl1OAl0eFsyXTsKLQlpbnQJc3RhdHVzOwotCi0JaWYgKChuICsgcmVnKSA+IHNpemVvZiBtY3AtPmNhY2hlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQl0eFswXSA9IG1jcC0+YWRkciB8IDB4MDE7Ci0JdHhbMV0gPSByZWcgPDwgMTsKLQotCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQobWNwLT5zcGksIHR4LCBzaXplb2YgdHgsCi0JCQkJICAgICAodTggKil2YWxzLCBuICogMik7Ci0JaWYgKHN0YXR1cyA+PSAwKSB7Ci0JCXdoaWxlIChuLS0pCi0JCQl2YWxzW25dID0gX19sZTE2X3RvX2NwdSgoX19sZTE2KXZhbHNbbl0pOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWNwMjNzMDhfb3BzIG1jcDIzczA4X29wcyA9IHsKLQkucmVhZAkJPSBtY3AyM3MwOF9yZWFkLAotCS53cml0ZQkJPSBtY3AyM3MwOF93cml0ZSwKLQkucmVhZF9yZWdzCT0gbWNwMjNzMDhfcmVhZF9yZWdzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtY3AyM3MwOF9vcHMgbWNwMjNzMTdfb3BzID0gewotCS5yZWFkCQk9IG1jcDIzczE3X3JlYWQsCi0JLndyaXRlCQk9IG1jcDIzczE3X3dyaXRlLAotCS5yZWFkX3JlZ3MJPSBtY3AyM3MxN19yZWFkX3JlZ3MsCi19OwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgbWNwMjNzMDhfZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgbWNwMjNzMDgJKm1jcCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbWNwMjNzMDgsIGNoaXApOwotCWludCBzdGF0dXM7Ci0KLQltdXRleF9sb2NrKCZtY3AtPmxvY2spOwotCW1jcC0+Y2FjaGVbTUNQX0lPRElSXSB8PSAoMSA8PCBvZmZzZXQpOwotCXN0YXR1cyA9IG1jcC0+b3BzLT53cml0ZShtY3AsIE1DUF9JT0RJUiwgbWNwLT5jYWNoZVtNQ1BfSU9ESVJdKTsKLQltdXRleF91bmxvY2soJm1jcC0+bG9jayk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBtY3AyM3MwOF9nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBtY3AyM3MwOAkqbWNwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtY3AyM3MwOCwgY2hpcCk7Ci0JaW50IHN0YXR1czsKLQotCW11dGV4X2xvY2soJm1jcC0+bG9jayk7Ci0KLQkvKiBSRVZJU0lUIHJlYWRpbmcgdGhpcyBjbGVhcnMgYW55IElSUSAuLi4gKi8KLQlzdGF0dXMgPSBtY3AtPm9wcy0+cmVhZChtY3AsIE1DUF9HUElPKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJc3RhdHVzID0gMDsKLQllbHNlIHsKLQkJbWNwLT5jYWNoZVtNQ1BfR1BJT10gPSBzdGF0dXM7Ci0JCXN0YXR1cyA9ICEhKHN0YXR1cyAmICgxIDw8IG9mZnNldCkpOwotCX0KLQltdXRleF91bmxvY2soJm1jcC0+bG9jayk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBfX21jcDIzczA4X3NldChzdHJ1Y3QgbWNwMjNzMDggKm1jcCwgdW5zaWduZWQgbWFzaywgaW50IHZhbHVlKQotewotCXVuc2lnbmVkIG9sYXQgPSBtY3AtPmNhY2hlW01DUF9PTEFUXTsKLQotCWlmICh2YWx1ZSkKLQkJb2xhdCB8PSBtYXNrOwotCWVsc2UKLQkJb2xhdCAmPSB+bWFzazsKLQltY3AtPmNhY2hlW01DUF9PTEFUXSA9IG9sYXQ7Ci0JcmV0dXJuIG1jcC0+b3BzLT53cml0ZShtY3AsIE1DUF9PTEFULCBvbGF0KTsKLX0KLQotc3RhdGljIHZvaWQgbWNwMjNzMDhfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBtY3AyM3MwOAkqbWNwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtY3AyM3MwOCwgY2hpcCk7Ci0JdW5zaWduZWQgbWFzayA9IDEgPDwgb2Zmc2V0OwotCi0JbXV0ZXhfbG9jaygmbWNwLT5sb2NrKTsKLQlfX21jcDIzczA4X3NldChtY3AsIG1hc2ssIHZhbHVlKTsKLQltdXRleF91bmxvY2soJm1jcC0+bG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQKLW1jcDIzczA4X2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IG1jcDIzczA4CSptY3AgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1jcDIzczA4LCBjaGlwKTsKLQl1bnNpZ25lZCBtYXNrID0gMSA8PCBvZmZzZXQ7Ci0JaW50IHN0YXR1czsKLQotCW11dGV4X2xvY2soJm1jcC0+bG9jayk7Ci0Jc3RhdHVzID0gX19tY3AyM3MwOF9zZXQobWNwLCBtYXNrLCB2YWx1ZSk7Ci0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCW1jcC0+Y2FjaGVbTUNQX0lPRElSXSAmPSB+bWFzazsKLQkJc3RhdHVzID0gbWNwLT5vcHMtPndyaXRlKG1jcCwgTUNQX0lPRElSLCBtY3AtPmNhY2hlW01DUF9JT0RJUl0pOwotCX0KLQltdXRleF91bmxvY2soJm1jcC0+bG9jayk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCi0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLQotLyoKLSAqIFRoaXMgc2hvd3MgbW9yZSBpbmZvIHRoYW4gdGhlIGdlbmVyaWMgZ3BpbyBkdW1wIGNvZGU6Ci0gKiBwdWxsdXBzLCBkZWdsaXRjaGluZywgb3BlbiBkcmFpbiBkcml2ZS4KLSAqLwotc3RhdGljIHZvaWQgbWNwMjNzMDhfZGJnX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKQotewotCXN0cnVjdCBtY3AyM3MwOAkqbWNwOwotCWNoYXIJCWJhbms7Ci0JaW50CQl0OwotCXVuc2lnbmVkCW1hc2s7Ci0KLQltY3AgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1jcDIzczA4LCBjaGlwKTsKLQotCS8qIE5PVEU6IHdlIG9ubHkgaGFuZGxlIG9uZSBiYW5rIGZvciBub3cgLi4uICovCi0JYmFuayA9ICcwJyArICgobWNwLT5hZGRyID4+IDEpICYgMHg3KTsKLQotCW11dGV4X2xvY2soJm1jcC0+bG9jayk7Ci0JdCA9IG1jcC0+b3BzLT5yZWFkX3JlZ3MobWNwLCAwLCBtY3AtPmNhY2hlLCBBUlJBWV9TSVpFKG1jcC0+Y2FjaGUpKTsKLQlpZiAodCA8IDApIHsKLQkJc2VxX3ByaW50ZihzLCAiIEkvTyBFUlJPUiAlZFxuIiwgdCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlmb3IgKHQgPSAwLCBtYXNrID0gMTsgdCA8IGNoaXAtPm5ncGlvOyB0KyssIG1hc2sgPDw9IDEpIHsKLQkJY29uc3QgY2hhcgkqbGFiZWw7Ci0KLQkJbGFiZWwgPSBncGlvY2hpcF9pc19yZXF1ZXN0ZWQoY2hpcCwgdCk7Ci0JCWlmICghbGFiZWwpCi0JCQljb250aW51ZTsKLQotCQlzZXFfcHJpbnRmKHMsICIgZ3Bpby0lLTNkIFAlYy4lZCAoJS0xMnMpICVzICVzICVzIiwKLQkJCWNoaXAtPmJhc2UgKyB0LCBiYW5rLCB0LCBsYWJlbCwKLQkJCShtY3AtPmNhY2hlW01DUF9JT0RJUl0gJiBtYXNrKSA/ICJpbiAiIDogIm91dCIsCi0JCQkobWNwLT5jYWNoZVtNQ1BfR1BJT10gJiBtYXNrKSA/ICJoaSIgOiAibG8iLAotCQkJKG1jcC0+Y2FjaGVbTUNQX0dQUFVdICYgbWFzaykgPyAiICAiIDogInVwIik7Ci0JCS8qIE5PVEU6ICBpZ25vcmluZyB0aGUgaXJxLXJlbGF0ZWQgcmVnaXN0ZXJzICovCi0JCXNlcV9wcmludGYocywgIlxuIik7Ci0JfQotZG9uZToKLQltdXRleF91bmxvY2soJm1jcC0+bG9jayk7Ci19Ci0KLSNlbHNlCi0jZGVmaW5lIG1jcDIzczA4X2RiZ19zaG93CU5VTEwKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IG1jcDIzczA4X3Byb2JlX29uZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBhZGRyLAotCQkJICAgICAgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgYmFzZSwgdW5zaWduZWQgcHVsbHVwcykKLXsKLQlzdHJ1Y3QgbWNwMjNzMDhfZHJpdmVyX2RhdGEJKmRhdGEgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQlzdHJ1Y3QgbWNwMjNzMDgJCQkqbWNwID0gZGF0YS0+bWNwW2FkZHJdOwotCWludAkJCQlzdGF0dXM7Ci0KLQltdXRleF9pbml0KCZtY3AtPmxvY2spOwotCi0JbWNwLT5zcGkgPSBzcGk7Ci0JbWNwLT5hZGRyID0gMHg0MCB8IChhZGRyIDw8IDEpOwotCi0JbWNwLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IG1jcDIzczA4X2RpcmVjdGlvbl9pbnB1dDsKLQltY3AtPmNoaXAuZ2V0ID0gbWNwMjNzMDhfZ2V0OwotCW1jcC0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gbWNwMjNzMDhfZGlyZWN0aW9uX291dHB1dDsKLQltY3AtPmNoaXAuc2V0ID0gbWNwMjNzMDhfc2V0OwotCW1jcC0+Y2hpcC5kYmdfc2hvdyA9IG1jcDIzczA4X2RiZ19zaG93OwotCi0JaWYgKHR5cGUgPT0gTUNQX1RZUEVfUzE3KSB7Ci0JCW1jcC0+b3BzID0gJm1jcDIzczE3X29wczsKLQkJbWNwLT5jaGlwLm5ncGlvID0gMTY7Ci0JCW1jcC0+Y2hpcC5sYWJlbCA9ICJtY3AyM3MxNyI7Ci0JfSBlbHNlIHsKLQkJbWNwLT5vcHMgPSAmbWNwMjNzMDhfb3BzOwotCQltY3AtPmNoaXAubmdwaW8gPSA4OwotCQltY3AtPmNoaXAubGFiZWwgPSAibWNwMjNzMDgiOwotCX0KLQltY3AtPmNoaXAuYmFzZSA9IGJhc2U7Ci0JbWNwLT5jaGlwLmNhbl9zbGVlcCA9IDE7Ci0JbWNwLT5jaGlwLmRldiA9ICZzcGktPmRldjsKLQltY3AtPmNoaXAub3duZXIgPSBUSElTX01PRFVMRTsKLQotCS8qIHZlcmlmeSBNQ1BfSU9DT04uU0VRT1AgPSAwLCBzbyBzZXF1ZW50aWFsIHJlYWRzIHdvcmssCi0JICogYW5kIE1DUF9JT0NPTi5IQUVOID0gMSwgc28gd2Ugd29yayB3aXRoIGFsbCBjaGlwcy4KLQkgKi8KLQlzdGF0dXMgPSBtY3AtPm9wcy0+cmVhZChtY3AsIE1DUF9JT0NPTik7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCWdvdG8gZmFpbDsKLQlpZiAoKHN0YXR1cyAmIElPQ09OX1NFUU9QKSB8fCAhKHN0YXR1cyAmIElPQ09OX0hBRU4pKSB7Ci0JCS8qIG1jcDIzczE3IGhhcyBJT0NPTiB0d2ljZSwgbWFrZSBzdXJlIHRoZXkgYXJlIGluIHN5bmMgKi8KLQkJc3RhdHVzICY9IH4oSU9DT05fU0VRT1AgfCAoSU9DT05fU0VRT1AgPDwgOCkpOwotCQlzdGF0dXMgfD0gSU9DT05fSEFFTiB8IChJT0NPTl9IQUVOIDw8IDgpOwotCQlzdGF0dXMgPSBtY3AtPm9wcy0+d3JpdGUobWNwLCBNQ1BfSU9DT04sIHN0YXR1cyk7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJZ290byBmYWlsOwotCX0KLQotCS8qIGNvbmZpZ3VyZSB+MTAwSyBwdWxsdXBzICovCi0Jc3RhdHVzID0gbWNwLT5vcHMtPndyaXRlKG1jcCwgTUNQX0dQUFUsIHB1bGx1cHMpOwotCWlmIChzdGF0dXMgPCAwKQotCQlnb3RvIGZhaWw7Ci0KLQlzdGF0dXMgPSBtY3AtPm9wcy0+cmVhZF9yZWdzKG1jcCwgMCwgbWNwLT5jYWNoZSwgQVJSQVlfU0laRShtY3AtPmNhY2hlKSk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCWdvdG8gZmFpbDsKLQotCS8qIGRpc2FibGUgaW52ZXJ0ZXIgb24gaW5wdXQgKi8KLQlpZiAobWNwLT5jYWNoZVtNQ1BfSVBPTF0gIT0gMCkgewotCQltY3AtPmNhY2hlW01DUF9JUE9MXSA9IDA7Ci0JCXN0YXR1cyA9IG1jcC0+b3BzLT53cml0ZShtY3AsIE1DUF9JUE9MLCAwKTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogZGlzYWJsZSBpcnFzICovCi0JaWYgKG1jcC0+Y2FjaGVbTUNQX0dQSU5URU5dICE9IDApIHsKLQkJbWNwLT5jYWNoZVtNQ1BfR1BJTlRFTl0gPSAwOwotCQlzdGF0dXMgPSBtY3AtPm9wcy0+d3JpdGUobWNwLCBNQ1BfR1BJTlRFTiwgMCk7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJZ290byBmYWlsOwotCX0KLQotCXN0YXR1cyA9IGdwaW9jaGlwX2FkZCgmbWNwLT5jaGlwKTsKLWZhaWw6Ci0JaWYgKHN0YXR1cyA8IDApCi0JCWRldl9kYmcoJnNwaS0+ZGV2LCAiY2FuJ3Qgc2V0dXAgY2hpcCAlZCwgLS0+ICVkXG4iLAotCQkJCWFkZHIsIHN0YXR1cyk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBtY3AyM3MwOF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBtY3AyM3MwOF9wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKLQl1bnNpZ25lZAkJCWFkZHI7Ci0JdW5zaWduZWQJCQljaGlwcyA9IDA7Ci0Jc3RydWN0IG1jcDIzczA4X2RyaXZlcl9kYXRhCSpkYXRhOwotCWludAkJCQlzdGF0dXMsIHR5cGU7Ci0JdW5zaWduZWQJCQliYXNlOwotCi0JdHlwZSA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPmRyaXZlcl9kYXRhOwotCi0JcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmICghcGRhdGEgfHwgIWdwaW9faXNfdmFsaWQocGRhdGEtPmJhc2UpKSB7Ci0JCWRldl9kYmcoJnNwaS0+ZGV2LCAiaW52YWxpZCBvciBtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgQVJSQVlfU0laRShwZGF0YS0+Y2hpcCk7IGFkZHIrKykgewotCQlpZiAoIXBkYXRhLT5jaGlwW2FkZHJdLmlzX3ByZXNlbnQpCi0JCQljb250aW51ZTsKLQkJY2hpcHMrKzsKLQkJaWYgKCh0eXBlID09IE1DUF9UWVBFX1MwOCkgJiYgKGFkZHIgPiAzKSkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJIm1jcDIzczA4IG9ubHkgc3VwcG9ydHMgYWRkcmVzcyAwLi4zXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCWlmICghY2hpcHMpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mICpkYXRhICsgY2hpcHMgKiBzaXplb2Yoc3RydWN0IG1jcDIzczA4KSwKLQkJCUdGUF9LRVJORUwpOwotCWlmICghZGF0YSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0Jc3BpX3NldF9kcnZkYXRhKHNwaSwgZGF0YSk7Ci0KLQliYXNlID0gcGRhdGEtPmJhc2U7Ci0JZm9yIChhZGRyID0gMDsgYWRkciA8IEFSUkFZX1NJWkUocGRhdGEtPmNoaXApOyBhZGRyKyspIHsKLQkJaWYgKCFwZGF0YS0+Y2hpcFthZGRyXS5pc19wcmVzZW50KQotCQkJY29udGludWU7Ci0JCWNoaXBzLS07Ci0JCWRhdGEtPm1jcFthZGRyXSA9ICZkYXRhLT5jaGlwW2NoaXBzXTsKLQkJc3RhdHVzID0gbWNwMjNzMDhfcHJvYmVfb25lKHNwaSwgYWRkciwgdHlwZSwgYmFzZSwKLQkJCQkJICAgIHBkYXRhLT5jaGlwW2FkZHJdLnB1bGx1cHMpOwotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCWdvdG8gZmFpbDsKLQotCQliYXNlICs9ICh0eXBlID09IE1DUF9UWVBFX1MxNykgPyAxNiA6IDg7Ci0JfQotCWRhdGEtPm5ncGlvID0gYmFzZSAtIHBkYXRhLT5iYXNlOwotCi0JLyogTk9URTogIHRoZXNlIGNoaXBzIGhhdmUgYSByZWxhdGl2ZWx5IHNhbmUgSVJRIGZyYW1ld29yaywgd2l0aAotCSAqIHBlci1zaWduYWwgbWFza2luZyBhbmQgbGV2ZWwvZWRnZSB0cmlnZ2VyaW5nLiAgSXQncyBub3QgeWV0Ci0JICogaGFuZGxlZCBoZXJlLi4uCi0JICovCi0KLQlpZiAocGRhdGEtPnNldHVwKSB7Ci0JCXN0YXR1cyA9IHBkYXRhLT5zZXR1cChzcGksCi0JCQkJcGRhdGEtPmJhc2UsIGRhdGEtPm5ncGlvLAotCQkJCXBkYXRhLT5jb250ZXh0KTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwIC0tPiAlZFxuIiwgc3RhdHVzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZmFpbDoKLQlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgQVJSQVlfU0laRShkYXRhLT5tY3ApOyBhZGRyKyspIHsKLQkJaW50IHRtcDsKLQotCQlpZiAoIWRhdGEtPm1jcFthZGRyXSkKLQkJCWNvbnRpbnVlOwotCQl0bXAgPSBncGlvY2hpcF9yZW1vdmUoJmRhdGEtPm1jcFthZGRyXS0+Y2hpcCk7Ci0JCWlmICh0bXAgPCAwKQotCQkJZGV2X2Vycigmc3BpLT5kZXYsICIlcyAtLT4gJWRcbiIsICJyZW1vdmUiLCB0bXApOwotCX0KLQlrZnJlZShkYXRhKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IG1jcDIzczA4X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBtY3AyM3MwOF9kcml2ZXJfZGF0YQkqZGF0YSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwotCXN0cnVjdCBtY3AyM3MwOF9wbGF0Zm9ybV9kYXRhCSpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JdW5zaWduZWQJCQlhZGRyOwotCWludAkJCQlzdGF0dXMgPSAwOwotCi0JaWYgKHBkYXRhLT50ZWFyZG93bikgewotCQlzdGF0dXMgPSBwZGF0YS0+dGVhcmRvd24oc3BpLAotCQkJCXBkYXRhLT5iYXNlLCBkYXRhLT5uZ3BpbywKLQkJCQlwZGF0YS0+Y29udGV4dCk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzIC0tPiAlZFxuIiwgInRlYXJkb3duIiwgc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQl9Ci0KLQlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgQVJSQVlfU0laRShkYXRhLT5tY3ApOyBhZGRyKyspIHsKLQkJaW50IHRtcDsKLQotCQlpZiAoIWRhdGEtPm1jcFthZGRyXSkKLQkJCWNvbnRpbnVlOwotCi0JCXRtcCA9IGdwaW9jaGlwX3JlbW92ZSgmZGF0YS0+bWNwW2FkZHJdLT5jaGlwKTsKLQkJaWYgKHRtcCA8IDApIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXMgLS0+ICVkXG4iLCAicmVtb3ZlIiwgdG1wKTsKLQkJCXN0YXR1cyA9IHRtcDsKLQkJfQotCX0KLQlpZiAoc3RhdHVzID09IDApCi0JCWtmcmVlKGRhdGEpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBtY3AyM3MwOF9pZHNbXSA9IHsKLQl7ICJtY3AyM3MwOCIsIE1DUF9UWVBFX1MwOCB9LAotCXsgIm1jcDIzczE3IiwgTUNQX1RZUEVfUzE3IH0sCi0JeyB9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBtY3AyM3MwOF9pZHMpOwotCi1zdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgbWNwMjNzMDhfZHJpdmVyID0gewotCS5wcm9iZQkJPSBtY3AyM3MwOF9wcm9iZSwKLQkucmVtb3ZlCQk9IG1jcDIzczA4X3JlbW92ZSwKLQkuaWRfdGFibGUJPSBtY3AyM3MwOF9pZHMsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAibWNwMjNzMDgiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBfX2luaXQgbWNwMjNzMDhfaW5pdCh2b2lkKQotewotCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZtY3AyM3MwOF9kcml2ZXIpOwotfQotLyogcmVnaXN0ZXIgYWZ0ZXIgc3BpIHBvc3Rjb3JlIGluaXRjYWxsIGFuZCBiZWZvcmUKLSAqIHN1YnN5cyBpbml0Y2FsbHMgdGhhdCBtYXkgcmVseSBvbiB0aGVzZSBHUElPcwotICovCi1zdWJzeXNfaW5pdGNhbGwobWNwMjNzMDhfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtY3AyM3MwOF9leGl0KHZvaWQpCi17Ci0Jc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZtY3AyM3MwOF9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQobWNwMjNzMDhfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9tbF9pb2hfZ3Bpby5jIGIvZHJpdmVycy9ncGlvL21sX2lvaF9ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYzYyMWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL21sX2lvaF9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBPS0kgU0VNSUNPTkRVQ1RPUiBDby4sIExURC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLQotI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JPSE0gICAgICAgICAgICAgMHgxMERCCi0KLXN0cnVjdCBpb2hfcmVnX2NvbW4gewotCXUzMglpZW47Ci0JdTMyCWlzdGF0dXM7Ci0JdTMyCWlkaXNwOwotCXUzMglpY2xyOwotCXUzMglpbWFzazsKLQl1MzIJaW1hc2tjbHI7Ci0JdTMyCXBvOwotCXUzMglwaTsKLQl1MzIJcG07Ci0JdTMyCWltXzA7Ci0JdTMyCWltXzE7Ci0JdTMyCXJlc2VydmVkOwotfTsKLQotc3RydWN0IGlvaF9yZWdzIHsKLQlzdHJ1Y3QgaW9oX3JlZ19jb21uIHJlZ3NbOF07Ci0JdTMyIHJlc2VydmUxWzE2XTsKLQl1MzIgaW9oX3NlbF9yZWdbNF07Ci0JdTMyIHJlc2VydmUyWzExXTsKLQl1MzIgc3JzdDsKLX07Ci0KLS8qKgotICogc3RydWN0IGlvaF9ncGlvX3JlZ19kYXRhIC0gVGhlIHJlZ2lzdGVyIHN0b3JlIGRhdGEuCi0gKiBAcG9fcmVnOglUbyBzdG9yZSBjb250ZW50cyBvZiBQTyByZWdpc3Rlci4KLSAqIEBwbV9yZWc6CVRvIHN0b3JlIGNvbnRlbnRzIG9mIFBNIHJlZ2lzdGVyLgotICovCi1zdHJ1Y3QgaW9oX2dwaW9fcmVnX2RhdGEgewotCXUzMiBwb19yZWc7Ci0JdTMyIHBtX3JlZzsKLX07Ci0KLS8qKgotICogc3RydWN0IGlvaF9ncGlvIC0gR1BJTyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLgotICogQGJhc2U6CQkJUENJIGJhc2UgYWRkcmVzcyBvZiBNZW1vcnkgbWFwcGVkIEkvTyByZWdpc3Rlci4KLSAqIEByZWc6CQkJTWVtb3J5IG1hcHBlZCBJT0ggR1BJTyByZWdpc3RlciBsaXN0LgotICogQGRldjoJCQlQb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUuCi0gKiBAZ3BpbzoJCQlEYXRhIGZvciBHUElPIGluZnJhc3RydWN0dXJlLgotICogQGlvaF9ncGlvX3JlZzoJCU1lbW9yeSBtYXBwZWQgUmVnaXN0ZXIgZGF0YSBpcyBzYXZlZCBoZXJlCi0gKgkJCQl3aGVuIHN1c3BlbmQuCi0gKiBAY2g6CQkJCUluZGljYXRlIEdQSU8gY2hhbm5lbAotICovCi1zdHJ1Y3QgaW9oX2dwaW8gewotCXZvaWQgX19pb21lbSAqYmFzZTsKLQlzdHJ1Y3QgaW9oX3JlZ3MgX19pb21lbSAqcmVnOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW87Ci0Jc3RydWN0IGlvaF9ncGlvX3JlZ19kYXRhIGlvaF9ncGlvX3JlZzsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlpbnQgY2g7Ci19OwotCi1zdGF0aWMgY29uc3QgaW50IG51bV9wb3J0c1tdID0gezYsIDEyLCAxNiwgMTYsIDE1LCAxNiwgMTYsIDEyfTsKLQotc3RhdGljIHZvaWQgaW9oX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2lnbmVkIG5yLCBpbnQgdmFsKQotewotCXUzMiByZWdfdmFsOwotCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9CWNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgaW9oX2dwaW8sIGdwaW8pOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7Ci0JcmVnX3ZhbCA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBvKTsKLQlpZiAodmFsKQotCQlyZWdfdmFsIHw9ICgxIDw8IG5yKTsKLQllbHNlCi0JCXJlZ192YWwgJj0gfigxIDw8IG5yKTsKLQotCWlvd3JpdGUzMihyZWdfdmFsLCAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbyk7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKLX0KLQotc3RhdGljIGludCBpb2hfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ3BpbywgdW5zaWduZWQgbnIpCi17Ci0Jc3RydWN0IGlvaF9ncGlvICpjaGlwID0JY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCBpb2hfZ3BpbywgZ3Bpbyk7Ci0KLQlyZXR1cm4gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucGkpICYgKDEgPDwgbnIpOwotfQotCi1zdGF0aWMgaW50IGlvaF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ3BpbywgdW5zaWduZWQgbnIsCi0JCQkJICAgICBpbnQgdmFsKQotewotCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9CWNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgaW9oX2dwaW8sIGdwaW8pOwotCXUzMiBwbTsKLQl1MzIgcmVnX3ZhbDsKLQotCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOwotCXBtID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG0pICYKLQkJCQkJKCgxIDw8IG51bV9wb3J0c1tjaGlwLT5jaF0pIC0gMSk7Ci0JcG0gfD0gKDEgPDwgbnIpOwotCWlvd3JpdGUzMihwbSwgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG0pOwotCi0JcmVnX3ZhbCA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBvKTsKLQlpZiAodmFsKQotCQlyZWdfdmFsIHw9ICgxIDw8IG5yKTsKLQllbHNlCi0JCXJlZ192YWwgJj0gfigxIDw8IG5yKTsKLQlpb3dyaXRlMzIocmVnX3ZhbCwgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG8pOwotCi0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlvaF9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1bnNpZ25lZCBucikKLXsKLQlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAgPQljb250YWluZXJfb2YoZ3Bpbywgc3RydWN0IGlvaF9ncGlvLCBncGlvKTsKLQl1MzIgcG07Ci0KLQltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKLQlwbSA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBtKSAmCi0JCQkJKCgxIDw8IG51bV9wb3J0c1tjaGlwLT5jaF0pIC0gMSk7Ci0JcG0gJj0gfigxIDw8IG5yKTsKLQlpb3dyaXRlMzIocG0sICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBtKTsKLQltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLS8qCi0gKiBTYXZlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KLSAqLwotc3RhdGljIHZvaWQgaW9oX2dwaW9fc2F2ZV9yZWdfY29uZihzdHJ1Y3QgaW9oX2dwaW8gKmNoaXApCi17Ci0JY2hpcC0+aW9oX2dwaW9fcmVnLnBvX3JlZyA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBvKTsKLQljaGlwLT5pb2hfZ3Bpb19yZWcucG1fcmVnID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG0pOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiByZXN0b3JlcyB0aGUgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBvZiB0aGUgR1BJTyBkZXZpY2UuCi0gKi8KLXN0YXRpYyB2b2lkIGlvaF9ncGlvX3Jlc3RvcmVfcmVnX2NvbmYoc3RydWN0IGlvaF9ncGlvICpjaGlwKQotewotCS8qIHRvIHN0b3JlIGNvbnRlbnRzIG9mIFBPIHJlZ2lzdGVyICovCi0JaW93cml0ZTMyKGNoaXAtPmlvaF9ncGlvX3JlZy5wb19yZWcsICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBvKTsKLQkvKiB0byBzdG9yZSBjb250ZW50cyBvZiBQTSByZWdpc3RlciAqLwotCWlvd3JpdGUzMihjaGlwLT5pb2hfZ3Bpb19yZWcucG1fcmVnLCAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbSk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgaW9oX2dwaW9fc2V0dXAoc3RydWN0IGlvaF9ncGlvICpjaGlwLCBpbnQgbnVtX3BvcnQpCi17Ci0Jc3RydWN0IGdwaW9fY2hpcCAqZ3BpbyA9ICZjaGlwLT5ncGlvOwotCi0JZ3Bpby0+bGFiZWwgPSBkZXZfbmFtZShjaGlwLT5kZXYpOwotCWdwaW8tPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JZ3Bpby0+ZGlyZWN0aW9uX2lucHV0ID0gaW9oX2dwaW9fZGlyZWN0aW9uX2lucHV0OwotCWdwaW8tPmdldCA9IGlvaF9ncGlvX2dldDsKLQlncGlvLT5kaXJlY3Rpb25fb3V0cHV0ID0gaW9oX2dwaW9fZGlyZWN0aW9uX291dHB1dDsKLQlncGlvLT5zZXQgPSBpb2hfZ3Bpb19zZXQ7Ci0JZ3Bpby0+ZGJnX3Nob3cgPSBOVUxMOwotCWdwaW8tPmJhc2UgPSAtMTsKLQlncGlvLT5uZ3BpbyA9IG51bV9wb3J0OwotCWdwaW8tPmNhbl9zbGVlcCA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGlvaF9ncGlvX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldDsKLQlpbnQgaTsKLQlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXA7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwotCXZvaWQgX19pb21lbSAqY2hpcF9zYXZlOwotCi0JcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyA6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJZ290byBlcnJfcGNpX2VuYWJsZTsKLQl9Ci0KLQlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIEtCVUlMRF9NT0ROQU1FKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9yZXF1ZXN0X3JlZ2lvbnMgZmFpbGVkLSVkIiwgcmV0KTsKLQkJZ290byBlcnJfcmVxdWVzdF9yZWdpb25zOwotCX0KLQotCWJhc2UgPSBwY2lfaW9tYXAocGRldiwgMSwgMCk7Ci0JaWYgKGJhc2UgPT0gMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyA6IHBjaV9pb21hcCBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2lvbWFwOwotCX0KLQotCWNoaXBfc2F2ZSA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSAqIDgsIEdGUF9LRVJORUwpOwotCWlmIChjaGlwX3NhdmUgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyA6IGt6YWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9remFsbG9jOwotCX0KLQotCWNoaXAgPSBjaGlwX3NhdmU7Ci0JZm9yIChpID0gMDsgaSA8IDg7IGkrKywgY2hpcCsrKSB7Ci0JCWNoaXAtPmRldiA9ICZwZGV2LT5kZXY7Ci0JCWNoaXAtPmJhc2UgPSBiYXNlOwotCQljaGlwLT5yZWcgPSBjaGlwLT5iYXNlOwotCQljaGlwLT5jaCA9IGk7Ci0JCW11dGV4X2luaXQoJmNoaXAtPmxvY2spOwotCQlpb2hfZ3Bpb19zZXR1cChjaGlwLCBudW1fcG9ydHNbaV0pOwotCQlyZXQgPSBncGlvY2hpcF9hZGQoJmNoaXAtPmdwaW8pOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJT0ggZ3BpbzogRmFpbGVkIHRvIHJlZ2lzdGVyIEdQSU9cbiIpOwotCQkJZ290byBlcnJfZ3Bpb2NoaXBfYWRkOwotCQl9Ci0JfQotCi0JY2hpcCA9IGNoaXBfc2F2ZTsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgY2hpcCk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2dwaW9jaGlwX2FkZDoKLQlmb3IgKDsgaSAhPSAwOyBpLS0pIHsKLQkJY2hpcC0tOwotCQlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJmNoaXAtPmdwaW8pOwotCQlpZiAocmV0KQotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIGdwaW9jaGlwX3JlbW92ZSglZClcbiIsIGkpOwotCX0KLQlrZnJlZShjaGlwX3NhdmUpOwotCi1lcnJfa3phbGxvYzoKLQlwY2lfaW91bm1hcChwZGV2LCBiYXNlKTsKLQotZXJyX2lvbWFwOgotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0KLWVycl9yZXF1ZXN0X3JlZ2lvbnM6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCi1lcnJfcGNpX2VuYWJsZToKLQotCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIEZhaWxlZCByZXR1cm5zICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgaW9oX2dwaW9fcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCWludCBlcnI7Ci0JaW50IGk7Ci0Jc3RydWN0IGlvaF9ncGlvICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXZvaWQgX19pb21lbSAqY2hpcF9zYXZlOwotCi0JY2hpcF9zYXZlID0gY2hpcDsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBjaGlwKyspIHsKLQkJZXJyID0gZ3Bpb2NoaXBfcmVtb3ZlKCZjaGlwLT5ncGlvKTsKLQkJaWYgKGVycikKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCBncGlvY2hpcF9yZW1vdmVcbiIpOwotCX0KLQotCWNoaXAgPSBjaGlwX3NhdmU7Ci0JcGNpX2lvdW5tYXAocGRldiwgY2hpcC0+YmFzZSk7Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0Ja2ZyZWUoY2hpcCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgaW9oX2dwaW9fc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXMzMiByZXQ7Ci0Jc3RydWN0IGlvaF9ncGlvICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaW9oX2dwaW9fc2F2ZV9yZWdfY29uZihjaGlwKTsKLQlpb2hfZ3Bpb19yZXN0b3JlX3JlZ19jb25mKGNoaXApOwotCi0JcmV0ID0gcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfc2F2ZV9zdGF0ZSBGYWlsZWQtJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7Ci0JcmV0ID0gcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EMCwgMSk7Ci0JaWYgKHJldCkKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX2VuYWJsZV93YWtlIEZhaWxlZCAtJWRcbiIsIHJldCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpb2hfZ3Bpb19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JczMyIHJldDsKLQlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0KLQlyZXQgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QwLCAwKTsKLQotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKLQlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9lbmFibGVfZGV2aWNlIEZhaWxlZC0lZCAiLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQotCWlvd3JpdGUzMigweDAxLCAmY2hpcC0+cmVnLT5zcnN0KTsKLQlpb3dyaXRlMzIoMHgwMCwgJmNoaXAtPnJlZy0+c3JzdCk7Ci0JaW9oX2dwaW9fcmVzdG9yZV9yZWdfY29uZihjaGlwKTsKLQotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgaW9oX2dwaW9fc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGlvaF9ncGlvX3Jlc3VtZSBOVUxMCi0jZW5kaWYKLQotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGlvaF9ncGlvX3BjaWRldl9pZCkgPSB7Ci0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUk9ITSwgMHg4MDJFKSB9LAotCXsgMCwgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpb2hfZ3Bpb19wY2lkZXZfaWQpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaW9oX2dwaW9fZHJpdmVyID0gewotCS5uYW1lID0gIm1sX2lvaF9ncGlvIiwKLQkuaWRfdGFibGUgPSBpb2hfZ3Bpb19wY2lkZXZfaWQsCi0JLnByb2JlID0gaW9oX2dwaW9fcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGlvaF9ncGlvX3JlbW92ZSksCi0JLnN1c3BlbmQgPSBpb2hfZ3Bpb19zdXNwZW5kLAotCS5yZXN1bWUgPSBpb2hfZ3Bpb19yZXN1bWUKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlvaF9ncGlvX3BjaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlvaF9ncGlvX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChpb2hfZ3Bpb19wY2lfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpb2hfZ3Bpb19wY2lfZXhpdCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaW9oX2dwaW9fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGlvaF9ncGlvX3BjaV9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJPS0kgU0VNSUNPTkRVQ1RPUiBNTC1JT0ggc2VyaWVzIEdQSU8gRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vcGNhOTUzeC5jIGIvZHJpdmVycy9ncGlvL3BjYTk1M3guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1MWQ3YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwaW8vcGNhOTUzeC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzY5ICswLDAgQEAKLS8qCi0gKiAgcGNhOTUzeC5jIC0gNC84LzE2IGJpdCBJL08gcG9ydHMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA1IEJlbiBHYXJkbmVyIDxiZ2FyZG5lckB3YWJ0ZWMuY29tPgotICogIENvcHlyaWdodCAoQykgMjAwNyBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgotICoKLSAqICBEZXJpdmVkIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvcGNhOTUzOS5jCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3BjYTk1M3guaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaWZkZWYgQ09ORklHX09GX0dQSU8KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNlbmRpZgotCi0jZGVmaW5lIFBDQTk1M1hfSU5QVVQJCTAKLSNkZWZpbmUgUENBOTUzWF9PVVRQVVQJCTEKLSNkZWZpbmUgUENBOTUzWF9JTlZFUlQJCTIKLSNkZWZpbmUgUENBOTUzWF9ESVJFQ1RJT04JMwotCi0jZGVmaW5lIFBDQTk1N1hfSU4JCTAKLSNkZWZpbmUgUENBOTU3WF9JTlZSVAkJMQotI2RlZmluZSBQQ0E5NTdYX0JLRU4JCTIKLSNkZWZpbmUgUENBOTU3WF9QVVBECQkzCi0jZGVmaW5lIFBDQTk1N1hfQ0ZHCQk0Ci0jZGVmaW5lIFBDQTk1N1hfT1VUCQk1Ci0jZGVmaW5lIFBDQTk1N1hfTVNLCQk2Ci0jZGVmaW5lIFBDQTk1N1hfSU5UUwkJNwotCi0jZGVmaW5lIFBDQV9HUElPX01BU0sJCTB4MDBGRgotI2RlZmluZSBQQ0FfSU5UCQkJMHgwMTAwCi0jZGVmaW5lIFBDQTk1M1hfVFlQRQkJMHgxMDAwCi0jZGVmaW5lIFBDQTk1N1hfVFlQRQkJMHgyMDAwCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBwY2E5NTN4X2lkW10gPSB7Ci0JeyAicGNhOTUzNCIsIDggIHwgUENBOTUzWF9UWVBFIHwgUENBX0lOVCwgfSwKLQl7ICJwY2E5NTM1IiwgMTYgfCBQQ0E5NTNYX1RZUEUgfCBQQ0FfSU5ULCB9LAotCXsgInBjYTk1MzYiLCA0ICB8IFBDQTk1M1hfVFlQRSwgfSwKLQl7ICJwY2E5NTM3IiwgNCAgfCBQQ0E5NTNYX1RZUEUgfCBQQ0FfSU5ULCB9LAotCXsgInBjYTk1MzgiLCA4ICB8IFBDQTk1M1hfVFlQRSB8IFBDQV9JTlQsIH0sCi0JeyAicGNhOTUzOSIsIDE2IHwgUENBOTUzWF9UWVBFIHwgUENBX0lOVCwgfSwKLQl7ICJwY2E5NTU0IiwgOCAgfCBQQ0E5NTNYX1RZUEUgfCBQQ0FfSU5ULCB9LAotCXsgInBjYTk1NTUiLCAxNiB8IFBDQTk1M1hfVFlQRSB8IFBDQV9JTlQsIH0sCi0JeyAicGNhOTU1NiIsIDggIHwgUENBOTUzWF9UWVBFLCB9LAotCXsgInBjYTk1NTciLCA4ICB8IFBDQTk1M1hfVFlQRSwgfSwKLQl7ICJwY2E5NTc0IiwgOCAgfCBQQ0E5NTdYX1RZUEUgfCBQQ0FfSU5ULCB9LAotCXsgInBjYTk1NzUiLCAxNiB8IFBDQTk1N1hfVFlQRSB8IFBDQV9JTlQsIH0sCi0KLQl7ICJtYXg3MzEwIiwgOCAgfCBQQ0E5NTNYX1RZUEUsIH0sCi0JeyAibWF4NzMxMiIsIDE2IHwgUENBOTUzWF9UWVBFIHwgUENBX0lOVCwgfSwKLQl7ICJtYXg3MzEzIiwgMTYgfCBQQ0E5NTNYX1RZUEUgfCBQQ0FfSU5ULCB9LAotCXsgIm1heDczMTUiLCA4ICB8IFBDQTk1M1hfVFlQRSB8IFBDQV9JTlQsIH0sCi0JeyAicGNhNjEwNyIsIDggIHwgUENBOTUzWF9UWVBFIHwgUENBX0lOVCwgfSwKLQl7ICJ0Y2E2NDA4IiwgOCAgfCBQQ0E5NTNYX1RZUEUgfCBQQ0FfSU5ULCB9LAotCXsgInRjYTY0MTYiLCAxNiB8IFBDQTk1M1hfVFlQRSB8IFBDQV9JTlQsIH0sCi0JLyogTllFVDogIHsgInRjYTY0MjQiLCAyNCwgfSwgKi8KLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcGNhOTUzeF9pZCk7Ci0KLXN0cnVjdCBwY2E5NTN4X2NoaXAgewotCXVuc2lnbmVkIGdwaW9fc3RhcnQ7Ci0JdWludDE2X3QgcmVnX291dHB1dDsKLQl1aW50MTZfdCByZWdfZGlyZWN0aW9uOwotCXN0cnVjdCBtdXRleCBpMmNfbG9jazsKLQotI2lmZGVmIENPTkZJR19HUElPX1BDQTk1M1hfSVJRCi0Jc3RydWN0IG11dGV4IGlycV9sb2NrOwotCXVpbnQxNl90IGlycV9tYXNrOwotCXVpbnQxNl90IGlycV9zdGF0OwotCXVpbnQxNl90IGlycV90cmlnX3JhaXNlOwotCXVpbnQxNl90IGlycV90cmlnX2ZhbGw7Ci0JaW50CSBpcnFfYmFzZTsKLSNlbmRpZgotCi0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhICpkeW5fcGRhdGE7Ci0Jc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7Ci0JY29uc3QgY2hhciAqY29uc3QgKm5hbWVzOwotCWludAljaGlwX3R5cGU7Ci19OwotCi1zdGF0aWMgaW50IHBjYTk1M3hfd3JpdGVfcmVnKHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHVpbnQxNl90IHZhbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChjaGlwLT5ncGlvX2NoaXAubmdwaW8gPD0gOCkKLQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsIHJlZywgdmFsKTsKLQllbHNlIHsKLQkJc3dpdGNoIChjaGlwLT5jaGlwX3R5cGUpIHsKLQkJY2FzZSBQQ0E5NTNYX1RZUEU6Ci0JCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwKLQkJCQkJCQlyZWcgPDwgMSwgdmFsKTsKLQkJCWJyZWFrOwotCQljYXNlIFBDQTk1N1hfVFlQRToKLQkJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LCByZWcgPDwgMSwKLQkJCQkJCQl2YWwgJiAweGZmKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWJyZWFrOwotCQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsCi0JCQkJCQkJKHJlZyA8PCAxKSArIDEsCi0JCQkJCQkJKHZhbCAmIDB4ZmYwMCkgPj4gOCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAiZmFpbGVkIHdyaXRpbmcgcmVnaXN0ZXJcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBjYTk1M3hfcmVhZF9yZWcoc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCwgaW50IHJlZywgdWludDE2X3QgKnZhbCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKGNoaXAtPmdwaW9fY2hpcC5uZ3BpbyA8PSA4KQotCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LCByZWcpOwotCWVsc2UKLQkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwgcmVnIDw8IDEpOwotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJmYWlsZWQgcmVhZGluZyByZWdpc3RlclxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JKnZhbCA9ICh1aW50MTZfdClyZXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGNhOTUzeF9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2ZmKQotewotCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXA7Ci0JdWludDE2X3QgcmVnX3ZhbDsKLQlpbnQgcmV0LCBvZmZzZXQgPSAwOwotCi0JY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHBjYTk1M3hfY2hpcCwgZ3Bpb19jaGlwKTsKLQotCW11dGV4X2xvY2soJmNoaXAtPmkyY19sb2NrKTsKLQlyZWdfdmFsID0gY2hpcC0+cmVnX2RpcmVjdGlvbiB8ICgxdSA8PCBvZmYpOwotCi0Jc3dpdGNoIChjaGlwLT5jaGlwX3R5cGUpIHsKLQljYXNlIFBDQTk1M1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTUzWF9ESVJFQ1RJT047Ci0JCWJyZWFrOwotCWNhc2UgUENBOTU3WF9UWVBFOgotCQlvZmZzZXQgPSBQQ0E5NTdYX0NGRzsKLQkJYnJlYWs7Ci0JfQotCXJldCA9IHBjYTk1M3hfd3JpdGVfcmVnKGNoaXAsIG9mZnNldCwgcmVnX3ZhbCk7Ci0JaWYgKHJldCkKLQkJZ290byBleGl0OwotCi0JY2hpcC0+cmVnX2RpcmVjdGlvbiA9IHJlZ192YWw7Ci0JcmV0ID0gMDsKLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5pMmNfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwY2E5NTN4X2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKLQkJdW5zaWduZWQgb2ZmLCBpbnQgdmFsKQotewotCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXA7Ci0JdWludDE2X3QgcmVnX3ZhbDsKLQlpbnQgcmV0LCBvZmZzZXQgPSAwOwotCi0JY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHBjYTk1M3hfY2hpcCwgZ3Bpb19jaGlwKTsKLQotCW11dGV4X2xvY2soJmNoaXAtPmkyY19sb2NrKTsKLQkvKiBzZXQgb3V0cHV0IGxldmVsICovCi0JaWYgKHZhbCkKLQkJcmVnX3ZhbCA9IGNoaXAtPnJlZ19vdXRwdXQgfCAoMXUgPDwgb2ZmKTsKLQllbHNlCi0JCXJlZ192YWwgPSBjaGlwLT5yZWdfb3V0cHV0ICYgfigxdSA8PCBvZmYpOwotCi0Jc3dpdGNoIChjaGlwLT5jaGlwX3R5cGUpIHsKLQljYXNlIFBDQTk1M1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTUzWF9PVVRQVVQ7Ci0JCWJyZWFrOwotCWNhc2UgUENBOTU3WF9UWVBFOgotCQlvZmZzZXQgPSBQQ0E5NTdYX09VVDsKLQkJYnJlYWs7Ci0JfQotCXJldCA9IHBjYTk1M3hfd3JpdGVfcmVnKGNoaXAsIG9mZnNldCwgcmVnX3ZhbCk7Ci0JaWYgKHJldCkKLQkJZ290byBleGl0OwotCi0JY2hpcC0+cmVnX291dHB1dCA9IHJlZ192YWw7Ci0KLQkvKiB0aGVuIGRpcmVjdGlvbiAqLwotCXJlZ192YWwgPSBjaGlwLT5yZWdfZGlyZWN0aW9uICYgfigxdSA8PCBvZmYpOwotCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7Ci0JY2FzZSBQQ0E5NTNYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1M1hfRElSRUNUSU9OOwotCQlicmVhazsKLQljYXNlIFBDQTk1N1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTU3WF9DRkc7Ci0JCWJyZWFrOwotCX0KLQlyZXQgPSBwY2E5NTN4X3dyaXRlX3JlZyhjaGlwLCBvZmZzZXQsIHJlZ192YWwpOwotCWlmIChyZXQpCi0JCWdvdG8gZXhpdDsKLQotCWNoaXAtPnJlZ19kaXJlY3Rpb24gPSByZWdfdmFsOwotCXJldCA9IDA7Ci1leGl0OgotCW11dGV4X3VubG9jaygmY2hpcC0+aTJjX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcGNhOTUzeF9ncGlvX2dldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2ZmKQotewotCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXA7Ci0JdWludDE2X3QgcmVnX3ZhbDsKLQlpbnQgcmV0LCBvZmZzZXQgPSAwOwotCi0JY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHBjYTk1M3hfY2hpcCwgZ3Bpb19jaGlwKTsKLQotCW11dGV4X2xvY2soJmNoaXAtPmkyY19sb2NrKTsKLQlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgewotCWNhc2UgUENBOTUzWF9UWVBFOgotCQlvZmZzZXQgPSBQQ0E5NTNYX0lOUFVUOwotCQlicmVhazsKLQljYXNlIFBDQTk1N1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTU3WF9JTjsKLQkJYnJlYWs7Ci0JfQotCXJldCA9IHBjYTk1M3hfcmVhZF9yZWcoY2hpcCwgb2Zmc2V0LCAmcmVnX3ZhbCk7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5pMmNfbG9jayk7Ci0JaWYgKHJldCA8IDApIHsKLQkJLyogTk9URTogIGRpYWdub3N0aWMgYWxyZWFkeSBlbWl0dGVkOyB0aGF0J3MgYWxsIHdlIHNob3VsZAotCQkgKiBkbyB1bmxlc3MgZ3Bpb18qX3ZhbHVlX2NhbnNsZWVwKCkgY2FsbHMgYmVjb21lIGRpZmZlcmVudAotCQkgKiBmcm9tIHRoZWlyIG5vbnNsZWVwaW5nIHNpYmxpbmdzIChhbmQgcmVwb3J0IGZhdWx0cykuCi0JCSAqLwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gKHJlZ192YWwgJiAoMXUgPDwgb2ZmKSkgPyAxIDogMDsKLX0KLQotc3RhdGljIHZvaWQgcGNhOTUzeF9ncGlvX3NldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2ZmLCBpbnQgdmFsKQotewotCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXA7Ci0JdWludDE2X3QgcmVnX3ZhbDsKLQlpbnQgcmV0LCBvZmZzZXQgPSAwOwotCi0JY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHBjYTk1M3hfY2hpcCwgZ3Bpb19jaGlwKTsKLQotCW11dGV4X2xvY2soJmNoaXAtPmkyY19sb2NrKTsKLQlpZiAodmFsKQotCQlyZWdfdmFsID0gY2hpcC0+cmVnX291dHB1dCB8ICgxdSA8PCBvZmYpOwotCWVsc2UKLQkJcmVnX3ZhbCA9IGNoaXAtPnJlZ19vdXRwdXQgJiB+KDF1IDw8IG9mZik7Ci0KLQlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgewotCWNhc2UgUENBOTUzWF9UWVBFOgotCQlvZmZzZXQgPSBQQ0E5NTNYX09VVFBVVDsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0E5NTdYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1N1hfT1VUOwotCQlicmVhazsKLQl9Ci0JcmV0ID0gcGNhOTUzeF93cml0ZV9yZWcoY2hpcCwgb2Zmc2V0LCByZWdfdmFsKTsKLQlpZiAocmV0KQotCQlnb3RvIGV4aXQ7Ci0KLQljaGlwLT5yZWdfb3V0cHV0ID0gcmVnX3ZhbDsKLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5pMmNfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjYTk1M3hfc2V0dXBfZ3BpbyhzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwLCBpbnQgZ3Bpb3MpCi17Ci0Jc3RydWN0IGdwaW9fY2hpcCAqZ2M7Ci0KLQlnYyA9ICZjaGlwLT5ncGlvX2NoaXA7Ci0KLQlnYy0+ZGlyZWN0aW9uX2lucHV0ICA9IHBjYTk1M3hfZ3Bpb19kaXJlY3Rpb25faW5wdXQ7Ci0JZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBwY2E5NTN4X2dwaW9fZGlyZWN0aW9uX291dHB1dDsKLQlnYy0+Z2V0ID0gcGNhOTUzeF9ncGlvX2dldF92YWx1ZTsKLQlnYy0+c2V0ID0gcGNhOTUzeF9ncGlvX3NldF92YWx1ZTsKLQlnYy0+Y2FuX3NsZWVwID0gMTsKLQotCWdjLT5iYXNlID0gY2hpcC0+Z3Bpb19zdGFydDsKLQlnYy0+bmdwaW8gPSBncGlvczsKLQlnYy0+bGFiZWwgPSBjaGlwLT5jbGllbnQtPm5hbWU7Ci0JZ2MtPmRldiA9ICZjaGlwLT5jbGllbnQtPmRldjsKLQlnYy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQlnYy0+bmFtZXMgPSBjaGlwLT5uYW1lczsKLX0KLQotI2lmZGVmIENPTkZJR19HUElPX1BDQTk1M1hfSVJRCi1zdGF0aWMgaW50IHBjYTk1M3hfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZikKLXsKLQlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwOwotCi0JY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHBjYTk1M3hfY2hpcCwgZ3Bpb19jaGlwKTsKLQlyZXR1cm4gY2hpcC0+aXJxX2Jhc2UgKyBvZmY7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjYTk1M3hfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQotCWNoaXAtPmlycV9tYXNrICY9IH4oMSA8PCAoZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2UpKTsKLX0KLQotc3RhdGljIHZvaWQgcGNhOTUzeF9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0KLQljaGlwLT5pcnFfbWFzayB8PSAxIDw8IChkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjYTk1M3hfaXJxX2J1c19sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0KLQltdXRleF9sb2NrKCZjaGlwLT5pcnFfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjYTk1M3hfaXJxX2J1c19zeW5jX3VubG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0Jc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXVpbnQxNl90IG5ld19pcnFzOwotCXVpbnQxNl90IGxldmVsOwotCi0JLyogTG9vayBmb3IgYW55IG5ld2x5IHNldHVwIGludGVycnVwdCAqLwotCW5ld19pcnFzID0gY2hpcC0+aXJxX3RyaWdfZmFsbCB8IGNoaXAtPmlycV90cmlnX3JhaXNlOwotCW5ld19pcnFzICY9IH5jaGlwLT5yZWdfZGlyZWN0aW9uOwotCi0Jd2hpbGUgKG5ld19pcnFzKSB7Ci0JCWxldmVsID0gX19mZnMobmV3X2lycXMpOwotCQlwY2E5NTN4X2dwaW9fZGlyZWN0aW9uX2lucHV0KCZjaGlwLT5ncGlvX2NoaXAsIGxldmVsKTsKLQkJbmV3X2lycXMgJj0gfigxIDw8IGxldmVsKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmNoaXAtPmlycV9sb2NrKTsKLX0KLQotc3RhdGljIGludCBwY2E5NTN4X2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQotewotCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl1aW50MTZfdCBsZXZlbCA9IGQtPmlycSAtIGNoaXAtPmlycV9iYXNlOwotCXVpbnQxNl90IG1hc2sgPSAxIDw8IGxldmVsOwotCi0JaWYgKCEodHlwZSAmIElSUV9UWVBFX0VER0VfQk9USCkpIHsKLQkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJpcnEgJWQ6IHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIsCi0JCQlkLT5pcnEsIHR5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfRkFMTElORykKLQkJY2hpcC0+aXJxX3RyaWdfZmFsbCB8PSBtYXNrOwotCWVsc2UKLQkJY2hpcC0+aXJxX3RyaWdfZmFsbCAmPSB+bWFzazsKLQotCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpCi0JCWNoaXAtPmlycV90cmlnX3JhaXNlIHw9IG1hc2s7Ci0JZWxzZQotCQljaGlwLT5pcnFfdHJpZ19yYWlzZSAmPSB+bWFzazsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHBjYTk1M3hfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJCQk9ICJwY2E5NTN4IiwKLQkuaXJxX21hc2sJCT0gcGNhOTUzeF9pcnFfbWFzaywKLQkuaXJxX3VubWFzawkJPSBwY2E5NTN4X2lycV91bm1hc2ssCi0JLmlycV9idXNfbG9jawkJPSBwY2E5NTN4X2lycV9idXNfbG9jaywKLQkuaXJxX2J1c19zeW5jX3VubG9jawk9IHBjYTk1M3hfaXJxX2J1c19zeW5jX3VubG9jaywKLQkuaXJxX3NldF90eXBlCQk9IHBjYTk1M3hfaXJxX3NldF90eXBlLAotfTsKLQotc3RhdGljIHVpbnQxNl90IHBjYTk1M3hfaXJxX3BlbmRpbmcoc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCkKLXsKLQl1aW50MTZfdCBjdXJfc3RhdDsKLQl1aW50MTZfdCBvbGRfc3RhdDsKLQl1aW50MTZfdCBwZW5kaW5nOwotCXVpbnQxNl90IHRyaWdnZXI7Ci0JaW50IHJldCwgb2Zmc2V0ID0gMDsKLQotCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7Ci0JY2FzZSBQQ0E5NTNYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1M1hfSU5QVVQ7Ci0JCWJyZWFrOwotCWNhc2UgUENBOTU3WF9UWVBFOgotCQlvZmZzZXQgPSBQQ0E5NTdYX0lOOwotCQlicmVhazsKLQl9Ci0JcmV0ID0gcGNhOTUzeF9yZWFkX3JlZyhjaGlwLCBvZmZzZXQsICZjdXJfc3RhdCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBSZW1vdmUgb3V0cHV0IHBpbnMgZnJvbSB0aGUgZXF1YXRpb24gKi8KLQljdXJfc3RhdCAmPSBjaGlwLT5yZWdfZGlyZWN0aW9uOwotCi0Jb2xkX3N0YXQgPSBjaGlwLT5pcnFfc3RhdDsKLQl0cmlnZ2VyID0gKGN1cl9zdGF0IF4gb2xkX3N0YXQpICYgY2hpcC0+aXJxX21hc2s7Ci0KLQlpZiAoIXRyaWdnZXIpCi0JCXJldHVybiAwOwotCi0JY2hpcC0+aXJxX3N0YXQgPSBjdXJfc3RhdDsKLQotCXBlbmRpbmcgPSAob2xkX3N0YXQgJiBjaGlwLT5pcnFfdHJpZ19mYWxsKSB8Ci0JCSAgKGN1cl9zdGF0ICYgY2hpcC0+aXJxX3RyaWdfcmFpc2UpOwotCXBlbmRpbmcgJj0gdHJpZ2dlcjsKLQotCXJldHVybiBwZW5kaW5nOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgcGNhOTUzeF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZpZCkKLXsKLQlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwID0gZGV2aWQ7Ci0JdWludDE2X3QgcGVuZGluZzsKLQl1aW50MTZfdCBsZXZlbDsKLQotCXBlbmRpbmcgPSBwY2E5NTN4X2lycV9wZW5kaW5nKGNoaXApOwotCi0JaWYgKCFwZW5kaW5nKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLQlkbyB7Ci0JCWxldmVsID0gX19mZnMocGVuZGluZyk7Ci0JCWdlbmVyaWNfaGFuZGxlX2lycShsZXZlbCArIGNoaXAtPmlycV9iYXNlKTsKLQotCQlwZW5kaW5nICY9IH4oMSA8PCBsZXZlbCk7Ci0JfSB3aGlsZSAocGVuZGluZyk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgcGNhOTUzeF9pcnFfc2V0dXAoc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7Ci0Jc3RydWN0IHBjYTk1M3hfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWludCByZXQsIG9mZnNldCA9IDA7Ci0KLQlpZiAocGRhdGEtPmlycV9iYXNlICE9IC0xCi0JCQkmJiAoaWQtPmRyaXZlcl9kYXRhICYgUENBX0lOVCkpIHsKLQkJaW50IGx2bDsKLQotCQlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgewotCQljYXNlIFBDQTk1M1hfVFlQRToKLQkJCW9mZnNldCA9IFBDQTk1M1hfSU5QVVQ7Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0E5NTdYX1RZUEU6Ci0JCQlvZmZzZXQgPSBQQ0E5NTdYX0lOOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0ID0gcGNhOTUzeF9yZWFkX3JlZyhjaGlwLCBvZmZzZXQsICZjaGlwLT5pcnFfc3RhdCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dF9mYWlsZWQ7Ci0KLQkJLyoKLQkJICogVGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hpY2ggR1BJTyBsaW5lIGdlbmVyYXRlZCB0aGUKLQkJICogaW50ZXJydXB0LiAgV2UgaGF2ZSB0byByZWx5IG9uIHRoZSBwcmV2aW91cyByZWFkIGZvcgotCQkgKiB0aGlzIHB1cnBvc2UuCi0JCSAqLwotCQljaGlwLT5pcnFfc3RhdCAmPSBjaGlwLT5yZWdfZGlyZWN0aW9uOwotCQljaGlwLT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKLQkJbXV0ZXhfaW5pdCgmY2hpcC0+aXJxX2xvY2spOwotCi0JCWZvciAobHZsID0gMDsgbHZsIDwgY2hpcC0+Z3Bpb19jaGlwLm5ncGlvOyBsdmwrKykgewotCQkJaW50IGlycSA9IGx2bCArIGNoaXAtPmlycV9iYXNlOwotCi0JCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGNoaXApOwotCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJnBjYTk1M3hfaXJxX2NoaXAsCi0JCQkJCQkgaGFuZGxlX3NpbXBsZV9pcnEpOwotI2lmZGVmIENPTkZJR19BUk0KLQkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKLSNlbHNlCi0JCQlpcnFfc2V0X25vcHJvYmUoaXJxKTsKLSNlbmRpZgotCQl9Ci0KLQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2xpZW50LT5pcnEsCi0JCQkJCSAgIE5VTEwsCi0JCQkJCSAgIHBjYTk1M3hfaXJxX2hhbmRsZXIsCi0JCQkJCSAgIElSUUZfVFJJR0dFUl9SSVNJTkcgfAotCQkJCQkgICBJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfT05FU0hPVCwKLQkJCQkJICAgZGV2X25hbWUoJmNsaWVudC0+ZGV2KSwgY2hpcCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLAotCQkJCWNsaWVudC0+aXJxKTsKLQkJCWdvdG8gb3V0X2ZhaWxlZDsKLQkJfQotCi0JCWNoaXAtPmdwaW9fY2hpcC50b19pcnEgPSBwY2E5NTN4X2dwaW9fdG9faXJxOwotCX0KLQotCXJldHVybiAwOwotCi1vdXRfZmFpbGVkOgotCWNoaXAtPmlycV9iYXNlID0gLTE7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgcGNhOTUzeF9pcnFfdGVhcmRvd24oc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCkKLXsKLQlpZiAoY2hpcC0+aXJxX2Jhc2UgIT0gLTEpCi0JCWZyZWVfaXJxKGNoaXAtPmNsaWVudC0+aXJxLCBjaGlwKTsKLX0KLSNlbHNlIC8qIENPTkZJR19HUElPX1BDQTk1M1hfSVJRICovCi1zdGF0aWMgaW50IHBjYTk1M3hfaXJxX3NldHVwKHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OwotCXN0cnVjdCBwY2E5NTN4X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCWlmIChwZGF0YS0+aXJxX2Jhc2UgIT0gLTEgJiYgKGlkLT5kcml2ZXJfZGF0YSAmIFBDQV9JTlQpKQotCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJpbnRlcnJ1cHQgc3VwcG9ydCBub3QgY29tcGlsZWQgaW5cbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjYTk1M3hfaXJxX3RlYXJkb3duKHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXApCi17Ci19Ci0jZW5kaWYKLQotLyoKLSAqIEhhbmRsZXJzIGZvciBhbHRlcm5hdGl2ZSBzb3VyY2VzIG9mIHBsYXRmb3JtX2RhdGEKLSAqLwotI2lmZGVmIENPTkZJR19PRl9HUElPCi0vKgotICogVHJhbnNsYXRlIE9wZW5GaXJtd2FyZSBub2RlIHByb3BlcnRpZXMgaW50byBwbGF0Zm9ybV9kYXRhCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhICoKLXBjYTk1M3hfZ2V0X2FsdF9wZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBwY2E5NTN4X3BsYXRmb3JtX2RhdGEgKnBkYXRhOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKLQljb25zdCBfX2JlMzIgKnZhbDsKLQlpbnQgc2l6ZTsKLQotCW5vZGUgPSBjbGllbnQtPmRldi5vZl9ub2RlOwotCWlmIChub2RlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBkYXRhID09IE5VTEwpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgcGxhdGZvcm1fZGF0YVxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXBkYXRhLT5ncGlvX2Jhc2UgPSAtMTsKLQl2YWwgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImxpbnV4LGdwaW8tYmFzZSIsICZzaXplKTsKLQlpZiAodmFsKSB7Ci0JCWlmIChzaXplICE9IHNpemVvZigqdmFsKSkKLQkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIiVzOiB3cm9uZyBsaW51eCxncGlvLWJhc2VcbiIsCi0JCQkJIG5vZGUtPmZ1bGxfbmFtZSk7Ci0JCWVsc2UKLQkJCXBkYXRhLT5ncGlvX2Jhc2UgPSBiZTMyX3RvX2NwdXAodmFsKTsKLQl9Ci0KLQl2YWwgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgInBvbGFyaXR5IiwgTlVMTCk7Ci0JaWYgKHZhbCkKLQkJcGRhdGEtPmludmVydCA9ICp2YWw7Ci0KLQlyZXR1cm4gcGRhdGE7Ci19Ci0jZWxzZQotc3RhdGljIHN0cnVjdCBwY2E5NTN4X3BsYXRmb3JtX2RhdGEgKgotcGNhOTUzeF9nZXRfYWx0X3BkYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2RldmluaXQgZGV2aWNlX3BjYTk1M3hfaW5pdChzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwLCBpbnQgaW52ZXJ0KQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBwY2E5NTN4X3JlYWRfcmVnKGNoaXAsIFBDQTk1M1hfT1VUUFVULCAmY2hpcC0+cmVnX291dHB1dCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBwY2E5NTN4X3JlYWRfcmVnKGNoaXAsIFBDQTk1M1hfRElSRUNUSU9OLAotCQkJICAgICAgICZjaGlwLT5yZWdfZGlyZWN0aW9uKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCS8qIHNldCBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xhcml0eSBpbnZlcnNpb24gKi8KLQlyZXQgPSBwY2E5NTN4X3dyaXRlX3JlZyhjaGlwLCBQQ0E5NTNYX0lOVkVSVCwgaW52ZXJ0KTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQlyZXR1cm4gMDsKLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBkZXZpY2VfcGNhOTU3eF9pbml0KHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCBpbnZlcnQpCi17Ci0JaW50IHJldDsKLQl1aW50MTZfdCB2YWwgPSAwOwotCi0JLyogTGV0IGV2ZXJ5IHBvcnQgaW4gcHJvcGVyIHN0YXRlLCB0aGF0IGNvdWxkIHNhdmUgcG93ZXIgKi8KLQlwY2E5NTN4X3dyaXRlX3JlZyhjaGlwLCBQQ0E5NTdYX1BVUEQsIDB4MCk7Ci0JcGNhOTUzeF93cml0ZV9yZWcoY2hpcCwgUENBOTU3WF9DRkcsIDB4ZmZmZik7Ci0JcGNhOTUzeF93cml0ZV9yZWcoY2hpcCwgUENBOTU3WF9PVVQsIDB4MCk7Ci0KLQlyZXQgPSBwY2E5NTN4X3JlYWRfcmVnKGNoaXAsIFBDQTk1N1hfSU4sICZ2YWwpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCXJldCA9IHBjYTk1M3hfcmVhZF9yZWcoY2hpcCwgUENBOTU3WF9PVVQsICZjaGlwLT5yZWdfb3V0cHV0KTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQlyZXQgPSBwY2E5NTN4X3JlYWRfcmVnKGNoaXAsIFBDQTk1N1hfQ0ZHLCAmY2hpcC0+cmVnX2RpcmVjdGlvbik7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBzZXQgcGxhdGZvcm0gc3BlY2lmaWMgcG9sYXJpdHkgaW52ZXJzaW9uICovCi0JcGNhOTUzeF93cml0ZV9yZWcoY2hpcCwgUENBOTU3WF9JTlZSVCwgaW52ZXJ0KTsKLQotCS8qIFRvIGVuYWJsZSByZWdpc3RlciA2LCA3IHRvIGNvbnRyb2xsIHB1bGwgdXAgYW5kIHB1bGwgZG93biAqLwotCXBjYTk1M3hfd3JpdGVfcmVnKGNoaXAsIFBDQTk1N1hfQktFTiwgMHgyMDIpOwotCi0JcmV0dXJuIDA7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgcGNhOTUzeF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKLQlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwOwotCWludCByZXQgPSAwOwotCi0JY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2E5NTN4X2NoaXApLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2hpcCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAocGRhdGEgPT0gTlVMTCkgewotCQlwZGF0YSA9IHBjYTk1M3hfZ2V0X2FsdF9wZGF0YShjbGllbnQpOwotCQkvKgotCQkgKiBVbmxpa2Ugbm9ybWFsIHBsYXRmb3JtX2RhdGEsIHRoaXMgaXMgYWxsb2NhdGVkCi0JCSAqIGR5bmFtaWNhbGx5IGFuZCBtdXN0IGJlIGZyZWVkIGluIHRoZSBkcml2ZXIKLQkJICovCi0JCWNoaXAtPmR5bl9wZGF0YSA9IHBkYXRhOwotCX0KLQotCWlmIChwZGF0YSA9PSBOVUxMKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YVxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X2ZhaWxlZDsKLQl9Ci0KLQljaGlwLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQljaGlwLT5ncGlvX3N0YXJ0ID0gcGRhdGEtPmdwaW9fYmFzZTsKLQotCWNoaXAtPm5hbWVzID0gcGRhdGEtPm5hbWVzOwotCWNoaXAtPmNoaXBfdHlwZSA9IGlkLT5kcml2ZXJfZGF0YSAmIChQQ0E5NTNYX1RZUEUgfCBQQ0E5NTdYX1RZUEUpOwotCi0JbXV0ZXhfaW5pdCgmY2hpcC0+aTJjX2xvY2spOwotCi0JLyogaW5pdGlhbGl6ZSBjYWNoZWQgcmVnaXN0ZXJzIGZyb20gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLgotCSAqIHdlIGNhbid0IHNoYXJlIHRoaXMgY2hpcCB3aXRoIGFub3RoZXIgaTJjIG1hc3Rlci4KLQkgKi8KLQlwY2E5NTN4X3NldHVwX2dwaW8oY2hpcCwgaWQtPmRyaXZlcl9kYXRhICYgUENBX0dQSU9fTUFTSyk7Ci0KLQlpZiAoY2hpcC0+Y2hpcF90eXBlID09IFBDQTk1M1hfVFlQRSkKLQkJZGV2aWNlX3BjYTk1M3hfaW5pdChjaGlwLCBwZGF0YS0+aW52ZXJ0KTsKLQllbHNlIGlmIChjaGlwLT5jaGlwX3R5cGUgPT0gUENBOTU3WF9UWVBFKQotCQlkZXZpY2VfcGNhOTU3eF9pbml0KGNoaXAsIHBkYXRhLT5pbnZlcnQpOwotCWVsc2UKLQkJZ290byBvdXRfZmFpbGVkOwotCi0JcmV0ID0gcGNhOTUzeF9pcnFfc2V0dXAoY2hpcCwgaWQpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X2ZhaWxlZDsKLQotCXJldCA9IGdwaW9jaGlwX2FkZCgmY2hpcC0+Z3Bpb19jaGlwKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9mYWlsZWRfaXJxOwotCi0JaWYgKHBkYXRhLT5zZXR1cCkgewotCQlyZXQgPSBwZGF0YS0+c2V0dXAoY2xpZW50LCBjaGlwLT5ncGlvX2NoaXAuYmFzZSwKLQkJCQljaGlwLT5ncGlvX2NoaXAubmdwaW8sIHBkYXRhLT5jb250ZXh0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJzZXR1cCBmYWlsZWQsICVkXG4iLCByZXQpOwotCX0KLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOwotCXJldHVybiAwOwotCi1vdXRfZmFpbGVkX2lycToKLQlwY2E5NTN4X2lycV90ZWFyZG93bihjaGlwKTsKLW91dF9mYWlsZWQ6Ci0Ja2ZyZWUoY2hpcC0+ZHluX3BkYXRhKTsKLQlrZnJlZShjaGlwKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBjYTk1M3hfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHBjYTk1M3hfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChwZGF0YS0+dGVhcmRvd24pIHsKLQkJcmV0ID0gcGRhdGEtPnRlYXJkb3duKGNsaWVudCwgY2hpcC0+Z3Bpb19jaGlwLmJhc2UsCi0JCQkJY2hpcC0+Z3Bpb19jaGlwLm5ncGlvLCBwZGF0YS0+Y29udGV4dCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGZhaWxlZCwgJWRcbiIsCi0JCQkJCSJ0ZWFyZG93biIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZjaGlwLT5ncGlvX2NoaXApOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBmYWlsZWQsICVkXG4iLAotCQkJCSJncGlvY2hpcF9yZW1vdmUoKSIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcGNhOTUzeF9pcnFfdGVhcmRvd24oY2hpcCk7Ci0Ja2ZyZWUoY2hpcC0+ZHluX3BkYXRhKTsKLQlrZnJlZShjaGlwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHBjYTk1M3hfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gInBjYTk1M3giLAotCX0sCi0JLnByb2JlCQk9IHBjYTk1M3hfcHJvYmUsCi0JLnJlbW92ZQkJPSBwY2E5NTN4X3JlbW92ZSwKLQkuaWRfdGFibGUJPSBwY2E5NTN4X2lkLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcGNhOTUzeF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZwY2E5NTN4X2RyaXZlcik7Ci19Ci0vKiByZWdpc3RlciBhZnRlciBpMmMgcG9zdGNvcmUgaW5pdGNhbGwgYW5kIGJlZm9yZQotICogc3Vic3lzIGluaXRjYWxscyB0aGF0IG1heSByZWx5IG9uIHRoZXNlIEdQSU9zCi0gKi8KLXN1YnN5c19pbml0Y2FsbChwY2E5NTN4X2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcGNhOTUzeF9leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJnBjYTk1M3hfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHBjYTk1M3hfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoImVyaWMgbWlhbyA8ZXJpYy5taWFvQG1hcnZlbGwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJHUElPIGV4cGFuZGVyIGRyaXZlciBmb3IgUENBOTUzeCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3BjZjg1N3guYyBiL2RyaXZlcnMvZ3Bpby9wY2Y4NTd4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OWI0NzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL3BjZjg1N3guYworKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKgotICogcGNmODU3eCAtIGRyaXZlciBmb3IgcGNmODU3eCwgcGNhODU3eCwgYW5kIHBjYTk2N3ggSTJDIEdQSU8gZXhwYW5kZXJzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIEJyb3duZWxsCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3BjZjg1N3guaD4KLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcGNmODU3eF9pZFtdID0gewotCXsgInBjZjg1NzQiLCA4IH0sCi0JeyAicGNmODU3NGEiLCA4IH0sCi0JeyAicGNhODU3NCIsIDggfSwKLQl7ICJwY2E5NjcwIiwgOCB9LAotCXsgInBjYTk2NzIiLCA4IH0sCi0JeyAicGNhOTY3NCIsIDggfSwKLQl7ICJwY2Y4NTc1IiwgMTYgfSwKLQl7ICJwY2E4NTc1IiwgMTYgfSwKLQl7ICJwY2E5NjcxIiwgMTYgfSwKLQl7ICJwY2E5NjczIiwgMTYgfSwKLQl7ICJwY2E5Njc1IiwgMTYgfSwKLQl7ICJtYXg3MzI4IiwgOCB9LAotCXsgIm1heDczMjkiLCA4IH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHBjZjg1N3hfaWQpOwotCi0vKgotICogVGhlIHBjZjg1N3gsIHBjYTg1N3gsIGFuZCBwY2E5Njd4IGNoaXBzIG9ubHkgZXhwb3NlIG9uZSByZWFkIGFuZCBvbmUKLSAqIHdyaXRlIHJlZ2lzdGVyLiAgV3JpdGluZyBhICJvbmUiIGJpdCAodG8gbWF0Y2ggdGhlIHJlc2V0IHN0YXRlKSBsZXRzCi0gKiB0aGF0IHBpbiBiZSB1c2VkIGFzIGFuIGlucHV0OyBpdCdzIG5vdCBhbiBvcGVuLWRyYWluIG1vZGVsLCBidXQgYWN0cwotICogYSBiaXQgbGlrZSBvbmUuICBUaGlzIGlzIGRlc2NyaWJlZCBhcyAicXVhc2ktYmlkaXJlY3Rpb25hbCI7IHJlYWQgdGhlCi0gKiBjaGlwIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gKgotICogTWFueSBvdGhlciBJMkMgR1BJTyBleHBhbmRlciBjaGlwcyAobGlrZSB0aGUgcGNhOTUzeCBtb2RlbHMpIGhhdmUKLSAqIG1vcmUgY29tcGxleCByZWdpc3RlciBtb2RlbHMgYW5kIG1vcmUgY29udmVudGlvbmFsIGNpcmN1aXRyeSB1c2luZwotICogcHVzaC9wdWxsIGRyaXZlcnMuICBUaGV5IG9mdGVuIHVzZSB0aGUgc2FtZSAweDIwLi4weDI3IGFkZHJlc3NlcyBhcwotICogcGNmODU3eCBwYXJ0cywgbWFraW5nIHRoZSAibGVnYWN5IiBJMkMgZHJpdmVyIG1vZGVsIHByb2JsZW1hdGljLgotICovCi1zdHJ1Y3QgcGNmODU3eCB7Ci0Jc3RydWN0IGdwaW9fY2hpcAljaGlwOwotCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7Ci0Jc3RydWN0IG11dGV4CQlsb2NrOwkJLyogcHJvdGVjdCAnb3V0JyAqLwotCXVuc2lnbmVkCQlvdXQ7CQkvKiBzb2Z0d2FyZSBsYXRjaCAqLwotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGFsayB0byA4LWJpdCBJL08gZXhwYW5kZXIgKi8KLQotc3RhdGljIGludCBwY2Y4NTd4X2lucHV0OChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IHBjZjg1N3gJKmdwaW8gPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHBjZjg1N3gsIGNoaXApOwotCWludAkJc3RhdHVzOwotCi0JbXV0ZXhfbG9jaygmZ3Bpby0+bG9jayk7Ci0JZ3Bpby0+b3V0IHw9ICgxIDw8IG9mZnNldCk7Ci0Jc3RhdHVzID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoZ3Bpby0+Y2xpZW50LCBncGlvLT5vdXQpOwotCW11dGV4X3VubG9jaygmZ3Bpby0+bG9jayk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IHBjZjg1N3hfZ2V0OChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IHBjZjg1N3gJKmdwaW8gPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHBjZjg1N3gsIGNoaXApOwotCXMzMgkJdmFsdWU7Ci0KLQl2YWx1ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGUoZ3Bpby0+Y2xpZW50KTsKLQlyZXR1cm4gKHZhbHVlIDwgMCkgPyAwIDogKHZhbHVlICYgKDEgPDwgb2Zmc2V0KSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGNmODU3eF9vdXRwdXQ4KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBwY2Y4NTd4CSpncGlvID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBwY2Y4NTd4LCBjaGlwKTsKLQl1bnNpZ25lZAliaXQgPSAxIDw8IG9mZnNldDsKLQlpbnQJCXN0YXR1czsKLQotCW11dGV4X2xvY2soJmdwaW8tPmxvY2spOwotCWlmICh2YWx1ZSkKLQkJZ3Bpby0+b3V0IHw9IGJpdDsKLQllbHNlCi0JCWdwaW8tPm91dCAmPSB+Yml0OwotCXN0YXR1cyA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGdwaW8tPmNsaWVudCwgZ3Bpby0+b3V0KTsKLQltdXRleF91bmxvY2soJmdwaW8tPmxvY2spOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgcGNmODU3eF9zZXQ4KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXBjZjg1N3hfb3V0cHV0OChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGFsayB0byAxNi1iaXQgSS9PIGV4cGFuZGVyICovCi0KLXN0YXRpYyBpbnQgaTJjX3dyaXRlX2xlMTYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHdvcmQpCi17Ci0JdTggYnVmWzJdID0geyB3b3JkICYgMHhmZiwgd29yZCA+PiA4LCB9OwotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDIpOwotCXJldHVybiAoc3RhdHVzIDwgMCkgPyBzdGF0dXMgOiAwOwotfQotCi1zdGF0aWMgaW50IGkyY19yZWFkX2xlMTYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQl1OCBidWZbMl07Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGJ1ZiwgMik7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXJldHVybiBzdGF0dXM7Ci0JcmV0dXJuIChidWZbMV0gPDwgOCkgfCBidWZbMF07Ci19Ci0KLXN0YXRpYyBpbnQgcGNmODU3eF9pbnB1dDE2KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgcGNmODU3eAkqZ3BpbyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcGNmODU3eCwgY2hpcCk7Ci0JaW50CQlzdGF0dXM7Ci0KLQltdXRleF9sb2NrKCZncGlvLT5sb2NrKTsKLQlncGlvLT5vdXQgfD0gKDEgPDwgb2Zmc2V0KTsKLQlzdGF0dXMgPSBpMmNfd3JpdGVfbGUxNihncGlvLT5jbGllbnQsIGdwaW8tPm91dCk7Ci0JbXV0ZXhfdW5sb2NrKCZncGlvLT5sb2NrKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgcGNmODU3eF9nZXQxNihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IHBjZjg1N3gJKmdwaW8gPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHBjZjg1N3gsIGNoaXApOwotCWludAkJdmFsdWU7Ci0KLQl2YWx1ZSA9IGkyY19yZWFkX2xlMTYoZ3Bpby0+Y2xpZW50KTsKLQlyZXR1cm4gKHZhbHVlIDwgMCkgPyAwIDogKHZhbHVlICYgKDEgPDwgb2Zmc2V0KSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGNmODU3eF9vdXRwdXQxNihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgcGNmODU3eAkqZ3BpbyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcGNmODU3eCwgY2hpcCk7Ci0JdW5zaWduZWQJYml0ID0gMSA8PCBvZmZzZXQ7Ci0JaW50CQlzdGF0dXM7Ci0KLQltdXRleF9sb2NrKCZncGlvLT5sb2NrKTsKLQlpZiAodmFsdWUpCi0JCWdwaW8tPm91dCB8PSBiaXQ7Ci0JZWxzZQotCQlncGlvLT5vdXQgJj0gfmJpdDsKLQlzdGF0dXMgPSBpMmNfd3JpdGVfbGUxNihncGlvLT5jbGllbnQsIGdwaW8tPm91dCk7Ci0JbXV0ZXhfdW5sb2NrKCZncGlvLT5sb2NrKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjZjg1N3hfc2V0MTYoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JcGNmODU3eF9vdXRwdXQxNihjaGlwLCBvZmZzZXQsIHZhbHVlKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwY2Y4NTd4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBwY2Y4NTd4X3BsYXRmb3JtX2RhdGEJKnBkYXRhOwotCXN0cnVjdCBwY2Y4NTd4CQkJKmdwaW87Ci0JaW50CQkJCXN0YXR1czsKLQotCXBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAoIXBkYXRhKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YVxuIik7Ci0JfQotCi0JLyogQWxsb2NhdGUsIGluaXRpYWxpemUsIGFuZCByZWdpc3RlciB0aGlzIGdwaW9fY2hpcC4gKi8KLQlncGlvID0ga3phbGxvYyhzaXplb2YgKmdwaW8sIEdGUF9LRVJORUwpOwotCWlmICghZ3BpbykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltdXRleF9pbml0KCZncGlvLT5sb2NrKTsKLQotCWdwaW8tPmNoaXAuYmFzZSA9IHBkYXRhID8gcGRhdGEtPmdwaW9fYmFzZSA6IC0xOwotCWdwaW8tPmNoaXAuY2FuX3NsZWVwID0gMTsKLQlncGlvLT5jaGlwLmRldiA9ICZjbGllbnQtPmRldjsKLQlncGlvLT5jaGlwLm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQkvKiBOT1RFOiAgdGhlIE9uU2VtaSBqbGMxNTYyYiBpcyBhbHNvIGxhcmdlbHkgY29tcGF0aWJsZSB3aXRoCi0JICogdGhlc2UgcGFydHMsIG5vdGFibHkgZm9yIG91dHB1dC4gIEl0IGhhcyBhIGxvdy1yZXNvbHV0aW9uCi0JICogREFDIGluc3RlYWQgb2YgcGluIGNoYW5nZSBJUlFzOyBhbmQgaXRzIGlucHV0cyBjYW4gYmUgdGhlCi0JICogcmVzdWx0IG9mIGNvbXBhcmF0b3JzLgotCSAqLwotCi0JLyogODU3NCBhZGRyZXNzZXMgYXJlIDB4MjAuLjB4Mjc7IDg1NzRhIHVzZXMgMHgzOC4uMHgzZjsKLQkgKiA5NjcwLCA5NjcyLCA5NzY0LCBhbmQgOTc2NGEgdXNlIHF1aXRlIGEgdmFyaWV0eS4KLQkgKgotCSAqIE5PVEU6IHdlIGRvbid0IGRpc3Rpbmd1aXNoIGhlcmUgYmV0d2VlbiAqNCBhbmQgKjRhIHBhcnRzLgotCSAqLwotCWdwaW8tPmNoaXAubmdwaW8gPSBpZC0+ZHJpdmVyX2RhdGE7Ci0JaWYgKGdwaW8tPmNoaXAubmdwaW8gPT0gOCkgewotCQlncGlvLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IHBjZjg1N3hfaW5wdXQ4OwotCQlncGlvLT5jaGlwLmdldCA9IHBjZjg1N3hfZ2V0ODsKLQkJZ3Bpby0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gcGNmODU3eF9vdXRwdXQ4OwotCQlncGlvLT5jaGlwLnNldCA9IHBjZjg1N3hfc2V0ODsKLQotCQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKLQkJCQlJMkNfRlVOQ19TTUJVU19CWVRFKSkKLQkJCXN0YXR1cyA9IC1FSU87Ci0KLQkJLyogZmFpbCBpZiB0aGVyZSdzIG5vIGNoaXAgcHJlc2VudCAqLwotCQllbHNlCi0JCQlzdGF0dXMgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7Ci0KLQkvKiAnNzUvJzc1YyBhZGRyZXNzZXMgYXJlIDB4MjAuLjB4MjcsIGp1c3QgbGlrZSB0aGUgJzc0OwotCSAqIHRoZSAnNzVjIGRvZXNuJ3QgaGF2ZSBhIGN1cnJlbnQgc291cmNlIHB1bGxpbmcgaGlnaC4KLQkgKiA5NjcxLCA5NjczLCBhbmQgOTc2NSB1c2UgcXVpdGUgYSB2YXJpZXR5IG9mIGFkZHJlc3Nlcy4KLQkgKgotCSAqIE5PVEU6IHdlIGRvbid0IGRpc3Rpbmd1aXNoIGhlcmUgYmV0d2VlbiAnNzUgYW5kICc3NWMgcGFydHMuCi0JICovCi0JfSBlbHNlIGlmIChncGlvLT5jaGlwLm5ncGlvID09IDE2KSB7Ci0JCWdwaW8tPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gcGNmODU3eF9pbnB1dDE2OwotCQlncGlvLT5jaGlwLmdldCA9IHBjZjg1N3hfZ2V0MTY7Ci0JCWdwaW8tPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IHBjZjg1N3hfb3V0cHV0MTY7Ci0JCWdwaW8tPmNoaXAuc2V0ID0gcGNmODU3eF9zZXQxNjsKLQotCQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkKLQkJCXN0YXR1cyA9IC1FSU87Ci0KLQkJLyogZmFpbCBpZiB0aGVyZSdzIG5vIGNoaXAgcHJlc2VudCAqLwotCQllbHNlCi0JCQlzdGF0dXMgPSBpMmNfcmVhZF9sZTE2KGNsaWVudCk7Ci0KLQl9IGVsc2UgewotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgInVuc3VwcG9ydGVkIG51bWJlciBvZiBncGlvc1xuIik7Ci0JCXN0YXR1cyA9IC1FSU5WQUw7Ci0JfQotCi0JaWYgKHN0YXR1cyA8IDApCi0JCWdvdG8gZmFpbDsKLQotCWdwaW8tPmNoaXAubGFiZWwgPSBjbGllbnQtPm5hbWU7Ci0KLQlncGlvLT5jbGllbnQgPSBjbGllbnQ7Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZ3Bpbyk7Ci0KLQkvKiBOT1RFOiAgdGhlc2UgY2hpcHMgaGF2ZSBzdHJhbmdlICJxdWFzaS1iaWRpcmVjdGlvbmFsIiBJL08gcGlucy4KLQkgKiBXZSBjYW4ndCBhY3R1YWxseSBrbm93IHdoZXRoZXIgYSBwaW4gaXMgY29uZmlndXJlZCAoYSkgYXMgb3V0cHV0Ci0JICogYW5kIGRyaXZpbmcgdGhlIHNpZ25hbCBsb3csIG9yIChiKSBhcyBpbnB1dCBhbmQgcmVwb3J0aW5nIGEgbG93Ci0JICogdmFsdWUgLi4uIHdpdGhvdXQga25vd2luZyB0aGUgbGFzdCB2YWx1ZSB3cml0dGVuIHNpbmNlIHRoZSBjaGlwCi0JICogY2FtZSBvdXQgb2YgcmVzZXQgKGlmIGFueSkuICBXZSBjYW4ndCByZWFkIHRoZSBsYXRjaGVkIG91dHB1dC4KLQkgKgotCSAqIEluIHNob3J0LCB0aGUgb25seSByZWxpYWJsZSBzb2x1dGlvbiBmb3Igc2V0dGluZyB1cCBwaW4gZGlyZWN0aW9uCi0JICogaXMgdG8gZG8gaXQgZXhwbGljaXRseS4gIFRoZSBzZXR1cCgpIG1ldGhvZCBjYW4gZG8gdGhhdCwgYnV0IGl0Ci0JICogbWF5IGNhdXNlIHRyYW5zaWVudCBnbGl0Y2hpbmcgc2luY2UgaXQgY2FuJ3Qga25vdyB0aGUgbGFzdCB2YWx1ZQotCSAqIHdyaXR0ZW4gKHNvbWUgcGlucyBtYXkgbmVlZCB0byBiZSBkcml2ZW4gbG93KS4KLQkgKgotCSAqIFVzaW5nIHBkYXRhLT5uX2xhdGNoIGF2b2lkcyB0aGF0IHRyb3VibGUuICBXaGVuIGxlZnQgaW5pdGlhbGl6ZWQKLQkgKiB0byB6ZXJvLCBvdXIgc29mdHdhcmUgY29weSBvZiB0aGUgImxhdGNoIiB0aGVuIG1hdGNoZXMgdGhlIGNoaXAncwotCSAqIGFsbC1vbmVzIHJlc2V0IHN0YXRlLiAgT3RoZXJ3aXNlIGl0IGZsYWdzIHBpbnMgdG8gYmUgZHJpdmVuIGxvdy4KLQkgKi8KLQlncGlvLT5vdXQgPSBwZGF0YSA/IH5wZGF0YS0+bl9sYXRjaCA6IH4wOwotCi0Jc3RhdHVzID0gZ3Bpb2NoaXBfYWRkKCZncGlvLT5jaGlwKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJZ290byBmYWlsOwotCi0JLyogTk9URTogdGhlc2UgY2hpcHMgY2FuIGlzc3VlICJzb21lIHBpbi1jaGFuZ2VkIiBJUlFzLCB3aGljaCB3ZQotCSAqIGRvbid0IHlldCBldmVuIHRyeSB0byB1c2UuICBBbW9uZyBvdGhlciBpc3N1ZXMsIHRoZSByZWxldmFudAotCSAqIGdlbmlycSBzdGF0ZSBpc24ndCBhdmFpbGFibGUgdG8gbW9kdWxhciBkcml2ZXJzOyBhbmQgbW9zdCBpcnEKLQkgKiBtZXRob2RzIGNhbid0IGJlIGNhbGxlZCBmcm9tIHNsZWVwaW5nIGNvbnRleHRzLgotCSAqLwotCi0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiZ3Bpb3MgJWQuLiVkIG9uIGEgJXMlc1xuIiwKLQkJCWdwaW8tPmNoaXAuYmFzZSwKLQkJCWdwaW8tPmNoaXAuYmFzZSArIGdwaW8tPmNoaXAubmdwaW8gLSAxLAotCQkJY2xpZW50LT5uYW1lLAotCQkJY2xpZW50LT5pcnEgPyAiIChpcnEgaWdub3JlZCkiIDogIiIpOwotCi0JLyogTGV0IHBsYXRmb3JtIGNvZGUgc2V0IHVwIHRoZSBHUElPcyBhbmQgdGhlaXIgdXNlcnMuCi0JICogTm93IGlzIHRoZSBmaXJzdCB0aW1lIGFueW9uZSBjb3VsZCB1c2UgdGhlbS4KLQkgKi8KLQlpZiAocGRhdGEgJiYgcGRhdGEtPnNldHVwKSB7Ci0JCXN0YXR1cyA9IHBkYXRhLT5zZXR1cChjbGllbnQsCi0JCQkJZ3Bpby0+Y2hpcC5iYXNlLCBncGlvLT5jaGlwLm5ncGlvLAotCQkJCXBkYXRhLT5jb250ZXh0KTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJzZXR1cCAtLT4gJWRcbiIsIHN0YXR1cyk7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JZGV2X2RiZygmY2xpZW50LT5kZXYsICJwcm9iZSBlcnJvciAlZCBmb3IgJyVzJ1xuIiwKLQkJCXN0YXR1cywgY2xpZW50LT5uYW1lKTsKLQlrZnJlZShncGlvKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IHBjZjg1N3hfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHBjZjg1N3hfcGxhdGZvcm1fZGF0YQkqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBwY2Y4NTd4CQkJKmdwaW8gPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQJCQkJc3RhdHVzID0gMDsKLQotCWlmIChwZGF0YSAmJiBwZGF0YS0+dGVhcmRvd24pIHsKLQkJc3RhdHVzID0gcGRhdGEtPnRlYXJkb3duKGNsaWVudCwKLQkJCQlncGlvLT5jaGlwLmJhc2UsIGdwaW8tPmNoaXAubmdwaW8sCi0JCQkJcGRhdGEtPmNvbnRleHQpOwotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyAtLT4gJWRcbiIsCi0JCQkJCSJ0ZWFyZG93biIsIHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JfQotCi0Jc3RhdHVzID0gZ3Bpb2NoaXBfcmVtb3ZlKCZncGlvLT5jaGlwKTsKLQlpZiAoc3RhdHVzID09IDApCi0JCWtmcmVlKGdwaW8pOwotCWVsc2UKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyAtLT4gJWRcbiIsICJyZW1vdmUiLCBzdGF0dXMpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwY2Y4NTd4X2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9ICJwY2Y4NTd4IiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJPSBwY2Y4NTd4X3Byb2JlLAotCS5yZW1vdmUJPSBwY2Y4NTd4X3JlbW92ZSwKLQkuaWRfdGFibGUgPSBwY2Y4NTd4X2lkLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcGNmODU3eF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZwY2Y4NTd4X2RyaXZlcik7Ci19Ci0vKiByZWdpc3RlciBhZnRlciBpMmMgcG9zdGNvcmUgaW5pdGNhbGwgYW5kIGJlZm9yZQotICogc3Vic3lzIGluaXRjYWxscyB0aGF0IG1heSByZWx5IG9uIHRoZXNlIEdQSU9zCi0gKi8KLXN1YnN5c19pbml0Y2FsbChwY2Y4NTd4X2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcGNmODU3eF9leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJnBjZjg1N3hfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHBjZjg1N3hfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkRhdmlkIEJyb3duZWxsIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vcGwwNjEuYyBiL2RyaXZlcnMvZ3Bpby9wbDA2MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmNiMjhjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3Bpby9wbDA2MS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qCi0gKiAgbGludXgvZHJpdmVycy9ncGlvL3BsMDYxLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFByb3ZpZ2VudCBMdGQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBEcml2ZXIgZm9yIHRoZSBBUk0gUHJpbWVDZWxsKHRtKSBHZW5lcmFsIFB1cnBvc2UgSW5wdXQvT3V0cHV0IChQTDA2MSkKLSAqCi0gKiBEYXRhIHNoZWV0OiBBUk0gRERJIDAxOTBCLCBTZXB0ZW1iZXIgMjAwMAotICovCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgotI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwNjEuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNkZWZpbmUgR1BJT0RJUiAweDQwMAotI2RlZmluZSBHUElPSVMgIDB4NDA0Ci0jZGVmaW5lIEdQSU9JQkUgMHg0MDgKLSNkZWZpbmUgR1BJT0lFViAweDQwQwotI2RlZmluZSBHUElPSUUgIDB4NDEwCi0jZGVmaW5lIEdQSU9SSVMgMHg0MTQKLSNkZWZpbmUgR1BJT01JUyAweDQxOAotI2RlZmluZSBHUElPSUMgIDB4NDFDCi0KLSNkZWZpbmUgUEwwNjFfR1BJT19OUgk4Ci0KLXN0cnVjdCBwbDA2MV9ncGlvIHsKLQkvKiBXZSB1c2UgYSBsaXN0IG9mIHBsMDYxX2dwaW8gc3RydWN0cyBmb3IgZWFjaCB0cmlnZ2VyIElSUSBpbiB0aGUgbWFpbgotCSAqIGludGVycnVwdHMgY29udHJvbGxlciBvZiB0aGUgc3lzdGVtLiBXZSBuZWVkIHRoaXMgdG8gc3VwcG9ydCBzeXN0ZW1zCi0JICogaW4gd2hpY2ggbW9yZSB0aGF0IG9uZSBQTDA2MXMgYXJlIGNvbm5lY3RlZCB0byB0aGUgc2FtZSBJUlEuIFRoZSBJU1IKLQkgKiBpbnRlcmF0ZXMgdGhyb3VnaCB0aGlzIGxpc3QgdG8gZmluZCB0aGUgc291cmNlIG9mIHRoZSBpbnRlcnJ1cHQuCi0JICovCi0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCi0JLyogRWFjaCBvZiB0aGUgdHdvIHNwaW5sb2NrcyBwcm90ZWN0cyBhIGRpZmZlcmVudCBzZXQgb2YgaGFyZHdhcmUKLQkgKiByZWdpdGVycyBhbmQgZGF0YSBzdHJ1Y3R1cnMuIFRoaXMgZGVjb3VwbGVzIHRoZSBjb2RlIG9mIHRoZSBJUlEgZnJvbQotCSAqIHRoZSBHUElPIGNvZGUuIFRoaXMgYWxzbyBtYWtlcyB0aGUgY2FzZSBvZiBhIEdQSU8gcm91dGluZSBjYWxsIGZyb20KLQkgKiB0aGUgSVJRIGNvZGUgc2ltcGxlci4KLQkgKi8KLQlzcGlubG9ja190CQlsb2NrOwkJLyogR1BJTyByZWdpc3RlcnMgKi8KLQlzcGlubG9ja190CQlpcnFfbG9jazsJLyogSVJRIHJlZ2lzdGVycyAqLwotCi0Jdm9pZCBfX2lvbWVtCQkqYmFzZTsKLQl1bnNpZ25lZAkJaXJxX2Jhc2U7Ci0Jc3RydWN0IGdwaW9fY2hpcAlnYzsKLX07Ci0KLXN0YXRpYyBpbnQgcGwwNjFfZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IHBsMDYxX2dwaW8gKmNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBwbDA2MV9ncGlvLCBnYyk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBjaGFyIGdwaW9kaXI7Ci0KLQlpZiAob2Zmc2V0ID49IGdjLT5uZ3BpbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bG9jaywgZmxhZ3MpOwotCWdwaW9kaXIgPSByZWFkYihjaGlwLT5iYXNlICsgR1BJT0RJUik7Ci0JZ3Bpb2RpciAmPSB+KDEgPDwgb2Zmc2V0KTsKLQl3cml0ZWIoZ3Bpb2RpciwgY2hpcC0+YmFzZSArIEdQSU9ESVIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBsMDYxX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCwKLQkJaW50IHZhbHVlKQotewotCXN0cnVjdCBwbDA2MV9ncGlvICpjaGlwID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgcGwwNjFfZ3BpbywgZ2MpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciBncGlvZGlyOwotCi0JaWYgKG9mZnNldCA+PSBnYy0+bmdwaW8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKLQl3cml0ZWIoISF2YWx1ZSA8PCBvZmZzZXQsIGNoaXAtPmJhc2UgKyAoMSA8PCAob2Zmc2V0ICsgMikpKTsKLQlncGlvZGlyID0gcmVhZGIoY2hpcC0+YmFzZSArIEdQSU9ESVIpOwotCWdwaW9kaXIgfD0gMSA8PCBvZmZzZXQ7Ci0Jd3JpdGViKGdwaW9kaXIsIGNoaXAtPmJhc2UgKyBHUElPRElSKTsKLQotCS8qCi0JICogZ3BpbyB2YWx1ZSBpcyBzZXQgYWdhaW4sIGJlY2F1c2UgcGwwNjEgZG9lc24ndCBhbGxvdyB0byBzZXQgdmFsdWUgb2YKLQkgKiBhIGdwaW8gcGluIGJlZm9yZSBjb25maWd1cmluZyBpdCBpbiBPVVQgbW9kZS4KLQkgKi8KLQl3cml0ZWIoISF2YWx1ZSA8PCBvZmZzZXQsIGNoaXAtPmJhc2UgKyAoMSA8PCAob2Zmc2V0ICsgMikpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwbDA2MV9nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHBsMDYxX2dwaW8sIGdjKTsKLQotCXJldHVybiAhIXJlYWRiKGNoaXAtPmJhc2UgKyAoMSA8PCAob2Zmc2V0ICsgMikpKTsKLX0KLQotc3RhdGljIHZvaWQgcGwwNjFfc2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHBsMDYxX2dwaW8sIGdjKTsKLQotCXdyaXRlYighIXZhbHVlIDw8IG9mZnNldCwgY2hpcC0+YmFzZSArICgxIDw8IChvZmZzZXQgKyAyKSkpOwotfQotCi1zdGF0aWMgaW50IHBsMDYxX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBwbDA2MV9ncGlvICpjaGlwID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgcGwwNjFfZ3BpbywgZ2MpOwotCi0JaWYgKGNoaXAtPmlycV9iYXNlID09ICh1bnNpZ25lZCkgLTEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIGNoaXAtPmlycV9iYXNlICsgb2Zmc2V0OwotfQotCi0vKgotICogUEwwNjEgR1BJTyBJUlEKLSAqLwotc3RhdGljIHZvaWQgcGwwNjFfaXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBwbDA2MV9ncGlvICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JaW50IG9mZnNldCA9IGQtPmlycSAtIGNoaXAtPmlycV9iYXNlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggZ3Bpb2llOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmlycV9sb2NrLCBmbGFncyk7Ci0JZ3Bpb2llID0gcmVhZGIoY2hpcC0+YmFzZSArIEdQSU9JRSk7Ci0JZ3Bpb2llICY9IH4oMSA8PCBvZmZzZXQpOwotCXdyaXRlYihncGlvaWUsIGNoaXAtPmJhc2UgKyBHUElPSUUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBsMDYxX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBwbDA2MV9ncGlvICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JaW50IG9mZnNldCA9IGQtPmlycSAtIGNoaXAtPmlycV9iYXNlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggZ3Bpb2llOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmlycV9sb2NrLCBmbGFncyk7Ci0JZ3Bpb2llID0gcmVhZGIoY2hpcC0+YmFzZSArIEdQSU9JRSk7Ci0JZ3Bpb2llIHw9IDEgPDwgb2Zmc2V0OwotCXdyaXRlYihncGlvaWUsIGNoaXAtPmJhc2UgKyBHUElPSUUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgcGwwNjFfaXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCB0cmlnZ2VyKQotewotCXN0cnVjdCBwbDA2MV9ncGlvICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JaW50IG9mZnNldCA9IGQtPmlycSAtIGNoaXAtPmlycV9iYXNlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggZ3Bpb2lzLCBncGlvaWJlLCBncGlvaWV2OwotCi0JaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IFBMMDYxX0dQSU9fTlIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmlycV9sb2NrLCBmbGFncyk7Ci0KLQlncGlvaWV2ID0gcmVhZGIoY2hpcC0+YmFzZSArIEdQSU9JRVYpOwotCi0JZ3Bpb2lzID0gcmVhZGIoY2hpcC0+YmFzZSArIEdQSU9JUyk7Ci0JaWYgKHRyaWdnZXIgJiAoSVJRX1RZUEVfTEVWRUxfSElHSCB8IElSUV9UWVBFX0xFVkVMX0xPVykpIHsKLQkJZ3Bpb2lzIHw9IDEgPDwgb2Zmc2V0OwotCQlpZiAodHJpZ2dlciAmIElSUV9UWVBFX0xFVkVMX0hJR0gpCi0JCQlncGlvaWV2IHw9IDEgPDwgb2Zmc2V0OwotCQllbHNlCi0JCQlncGlvaWV2ICY9IH4oMSA8PCBvZmZzZXQpOwotCX0gZWxzZQotCQlncGlvaXMgJj0gfigxIDw8IG9mZnNldCk7Ci0Jd3JpdGViKGdwaW9pcywgY2hpcC0+YmFzZSArIEdQSU9JUyk7Ci0KLQlncGlvaWJlID0gcmVhZGIoY2hpcC0+YmFzZSArIEdQSU9JQkUpOwotCWlmICgodHJpZ2dlciAmIElSUV9UWVBFX0VER0VfQk9USCkgPT0gSVJRX1RZUEVfRURHRV9CT1RIKQotCQlncGlvaWJlIHw9IDEgPDwgb2Zmc2V0OwotCWVsc2UgewotCQlncGlvaWJlICY9IH4oMSA8PCBvZmZzZXQpOwotCQlpZiAodHJpZ2dlciAmIElSUV9UWVBFX0VER0VfUklTSU5HKQotCQkJZ3Bpb2lldiB8PSAxIDw8IG9mZnNldDsKLQkJZWxzZSBpZiAodHJpZ2dlciAmIElSUV9UWVBFX0VER0VfRkFMTElORykKLQkJCWdwaW9pZXYgJj0gfigxIDw8IG9mZnNldCk7Ci0JfQotCXdyaXRlYihncGlvaWJlLCBjaGlwLT5iYXNlICsgR1BJT0lCRSk7Ci0KLQl3cml0ZWIoZ3Bpb2lldiwgY2hpcC0+YmFzZSArIEdQSU9JRVYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+aXJxX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHBsMDYxX2lycWNoaXAgPSB7Ci0JLm5hbWUJCT0gIkdQSU8iLAotCS5pcnFfZW5hYmxlCT0gcGwwNjFfaXJxX2VuYWJsZSwKLQkuaXJxX2Rpc2FibGUJPSBwbDA2MV9pcnFfZGlzYWJsZSwKLQkuaXJxX3NldF90eXBlCT0gcGwwNjFfaXJxX3R5cGUsCi19OwotCi1zdGF0aWMgdm9pZCBwbDA2MV9pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpjaGlwX2xpc3QgPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKLQlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcDsKLQotCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9hY2soJmRlc2MtPmlycV9kYXRhKTsKLQlsaXN0X2Zvcl9lYWNoKHB0ciwgY2hpcF9saXN0KSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGVuZGluZzsKLQkJaW50IG9mZnNldDsKLQotCQljaGlwID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBwbDA2MV9ncGlvLCBsaXN0KTsKLQkJcGVuZGluZyA9IHJlYWRiKGNoaXAtPmJhc2UgKyBHUElPTUlTKTsKLQkJd3JpdGViKHBlbmRpbmcsIGNoaXAtPmJhc2UgKyBHUElPSUMpOwotCi0JCWlmIChwZW5kaW5nID09IDApCi0JCQljb250aW51ZTsKLQotCQlmb3JfZWFjaF9zZXRfYml0KG9mZnNldCwgJnBlbmRpbmcsIFBMMDYxX0dQSU9fTlIpCi0JCQlnZW5lcmljX2hhbmRsZV9pcnEocGwwNjFfdG9faXJxKCZjaGlwLT5nYywgb2Zmc2V0KSk7Ci0JfQotCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV91bm1hc2soJmRlc2MtPmlycV9kYXRhKTsKLX0KLQotc3RhdGljIGludCBwbDA2MV9wcm9iZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGFtYmFfaWQgKmlkKQotewotCXN0cnVjdCBwbDA2MV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKLQlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpjaGlwX2xpc3Q7Ci0JaW50IHJldCwgaXJxLCBpOwotCXN0YXRpYyBERUNMQVJFX0JJVE1BUChpbml0X2lycSwgTlJfSVJRUyk7Ci0KLQlwZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKHBkYXRhID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCi0JY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNoaXAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPnJlcy5zdGFydCwKLQkJCQlyZXNvdXJjZV9zaXplKCZkZXYtPnJlcyksICJwbDA2MSIpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBmcmVlX21lbTsKLQl9Ci0KLQljaGlwLT5iYXNlID0gaW9yZW1hcChkZXYtPnJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmZGV2LT5yZXMpKTsKLQlpZiAoY2hpcC0+YmFzZSA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gcmVsZWFzZV9yZWdpb247Ci0JfQotCi0Jc3Bpbl9sb2NrX2luaXQoJmNoaXAtPmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZjaGlwLT5pcnFfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNoaXAtPmxpc3QpOwotCi0JY2hpcC0+Z2MuZGlyZWN0aW9uX2lucHV0ID0gcGwwNjFfZGlyZWN0aW9uX2lucHV0OwotCWNoaXAtPmdjLmRpcmVjdGlvbl9vdXRwdXQgPSBwbDA2MV9kaXJlY3Rpb25fb3V0cHV0OwotCWNoaXAtPmdjLmdldCA9IHBsMDYxX2dldF92YWx1ZTsKLQljaGlwLT5nYy5zZXQgPSBwbDA2MV9zZXRfdmFsdWU7Ci0JY2hpcC0+Z2MudG9faXJxID0gcGwwNjFfdG9faXJxOwotCWNoaXAtPmdjLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOwotCWNoaXAtPmdjLm5ncGlvID0gUEwwNjFfR1BJT19OUjsKLQljaGlwLT5nYy5sYWJlbCA9IGRldl9uYW1lKCZkZXYtPmRldik7Ci0JY2hpcC0+Z2MuZGV2ID0gJmRldi0+ZGV2OwotCWNoaXAtPmdjLm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQljaGlwLT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKLQotCXJldCA9IGdwaW9jaGlwX2FkZCgmY2hpcC0+Z2MpOwotCWlmIChyZXQpCi0JCWdvdG8gaW91bm1hcDsKLQotCS8qCi0JICogaXJxX2NoaXAgc3VwcG9ydAotCSAqLwotCi0JaWYgKGNoaXAtPmlycV9iYXNlID09ICh1bnNpZ25lZCkgLTEpCi0JCXJldHVybiAwOwotCi0Jd3JpdGViKDAsIGNoaXAtPmJhc2UgKyBHUElPSUUpOyAvKiBkaXNhYmxlIGlycXMgKi8KLQlpcnEgPSBkZXYtPmlycVswXTsKLQlpZiAoaXJxIDwgMCkgewotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGlvdW5tYXA7Ci0JfQotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGlycSwgcGwwNjFfaXJxX2hhbmRsZXIpOwotCWlmICghdGVzdF9hbmRfc2V0X2JpdChpcnEsIGluaXRfaXJxKSkgeyAvKiBsaXN0IGluaXRpYWxpemVkPyAqLwotCQljaGlwX2xpc3QgPSBrbWFsbG9jKHNpemVvZigqY2hpcF9saXN0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChjaGlwX2xpc3QgPT0gTlVMTCkgewotCQkJY2xlYXJfYml0KGlycSwgaW5pdF9pcnEpOwotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gaW91bm1hcDsKLQkJfQotCQlJTklUX0xJU1RfSEVBRChjaGlwX2xpc3QpOwotCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShpcnEsIGNoaXBfbGlzdCk7Ci0JfSBlbHNlCi0JCWNoaXBfbGlzdCA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7Ci0JbGlzdF9hZGQoJmNoaXAtPmxpc3QsIGNoaXBfbGlzdCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUEwwNjFfR1BJT19OUjsgaSsrKSB7Ci0JCWlmIChwZGF0YS0+ZGlyZWN0aW9ucyAmICgxIDw8IGkpKQotCQkJcGwwNjFfZGlyZWN0aW9uX291dHB1dCgmY2hpcC0+Z2MsIGksCi0JCQkJCXBkYXRhLT52YWx1ZXMgJiAoMSA8PCBpKSk7Ci0JCWVsc2UKLQkJCXBsMDYxX2RpcmVjdGlvbl9pbnB1dCgmY2hpcC0+Z2MsIGkpOwotCi0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpICsgY2hpcC0+aXJxX2Jhc2UsICZwbDA2MV9pcnFjaGlwLAotCQkJCQkgaGFuZGxlX3NpbXBsZV9pcnEpOwotCQlzZXRfaXJxX2ZsYWdzKGkrY2hpcC0+aXJxX2Jhc2UsIElSUUZfVkFMSUQpOwotCQlpcnFfc2V0X2NoaXBfZGF0YShpICsgY2hpcC0+aXJxX2Jhc2UsIGNoaXApOwotCX0KLQotCXJldHVybiAwOwotCi1pb3VubWFwOgotCWlvdW5tYXAoY2hpcC0+YmFzZSk7Ci1yZWxlYXNlX3JlZ2lvbjoKLQlyZWxlYXNlX21lbV9yZWdpb24oZGV2LT5yZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJmRldi0+cmVzKSk7Ci1mcmVlX21lbToKLQlrZnJlZShjaGlwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYW1iYV9pZCBwbDA2MV9pZHNbXSA9IHsKLQl7Ci0JCS5pZAk9IDB4MDAwNDEwNjEsCi0JCS5tYXNrCT0gMHgwMDBmZmZmZiwKLQl9LAotCXsgMCwgMCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhbWJhX2RyaXZlciBwbDA2MV9ncGlvX2RyaXZlciA9IHsKLQkuZHJ2ID0gewotCQkubmFtZQk9ICJwbDA2MV9ncGlvIiwKLQl9LAotCS5pZF90YWJsZQk9IHBsMDYxX2lkcywKLQkucHJvYmUJCT0gcGwwNjFfcHJvYmUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBwbDA2MV9ncGlvX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gYW1iYV9kcml2ZXJfcmVnaXN0ZXIoJnBsMDYxX2dwaW9fZHJpdmVyKTsKLX0KLXN1YnN5c19pbml0Y2FsbChwbDA2MV9ncGlvX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJCYXJ1Y2ggU2lhY2ggPGJhcnVjaEB0a29zLmNvLmlsPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJQTDA2MSBHUElPIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3NjaF9ncGlvLmMgYi9kcml2ZXJzL2dwaW8vc2NoX2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwNjA0Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwaW8vc2NoX2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKgotICogIHNjaF9ncGlvLmMgLSBHUElPIGludGVyZmFjZSBmb3IgSW50ZWwgUG91bHNibyBTQ0gKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIENvbXB1TGFiIEx0ZAotICogIEF1dGhvcjogRGVuaXMgVHVyaXNjaGV2IDxkZW5pc0Bjb21wdWxhYi5jby5pbD4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIDIgYXMgcHVibGlzaGVkCi0gKiAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhncGlvX2xvY2spOwotCi0jZGVmaW5lIENHRU4JKDB4MDApCi0jZGVmaW5lIENHSU8JKDB4MDQpCi0jZGVmaW5lIENHTFYJKDB4MDgpCi0KLSNkZWZpbmUgUkdFTgkoMHgyMCkKLSNkZWZpbmUgUkdJTwkoMHgyNCkKLSNkZWZpbmUgUkdMVgkoMHgyOCkKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IGdwaW9fYmE7Ci0KLXN0YXRpYyBpbnQgc2NoX2dwaW9fY29yZV9kaXJlY3Rpb25faW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkICBncGlvX251bSkKLXsKLQl1OCBjdXJyX2RpcnM7Ci0JdW5zaWduZWQgc2hvcnQgb2Zmc2V0LCBiaXQ7Ci0KLQlzcGluX2xvY2soJmdwaW9fbG9jayk7Ci0KLQlvZmZzZXQgPSBDR0lPICsgZ3Bpb19udW0gLyA4OwotCWJpdCA9IGdwaW9fbnVtICUgODsKLQotCWN1cnJfZGlycyA9IGluYihncGlvX2JhICsgb2Zmc2V0KTsKLQotCWlmICghKGN1cnJfZGlycyAmICgxIDw8IGJpdCkpKQotCQlvdXRiKGN1cnJfZGlycyB8ICgxIDw8IGJpdCksIGdwaW9fYmEgKyBvZmZzZXQpOwotCi0Jc3Bpbl91bmxvY2soJmdwaW9fbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2NoX2dwaW9fY29yZV9nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGdwaW9fbnVtKQotewotCWludCByZXM7Ci0JdW5zaWduZWQgc2hvcnQgb2Zmc2V0LCBiaXQ7Ci0KLQlvZmZzZXQgPSBDR0xWICsgZ3Bpb19udW0gLyA4OwotCWJpdCA9IGdwaW9fbnVtICUgODsKLQotCXJlcyA9ICEhKGluYihncGlvX2JhICsgb2Zmc2V0KSAmICgxIDw8IGJpdCkpOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyB2b2lkIHNjaF9ncGlvX2NvcmVfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBncGlvX251bSwgaW50IHZhbCkKLXsKLQl1OCBjdXJyX3ZhbHM7Ci0JdW5zaWduZWQgc2hvcnQgb2Zmc2V0LCBiaXQ7Ci0KLQlzcGluX2xvY2soJmdwaW9fbG9jayk7Ci0KLQlvZmZzZXQgPSBDR0xWICsgZ3Bpb19udW0gLyA4OwotCWJpdCA9IGdwaW9fbnVtICUgODsKLQotCWN1cnJfdmFscyA9IGluYihncGlvX2JhICsgb2Zmc2V0KTsKLQotCWlmICh2YWwpCi0JCW91dGIoY3Vycl92YWxzIHwgKDEgPDwgYml0KSwgZ3Bpb19iYSArIG9mZnNldCk7Ci0JZWxzZQotCQlvdXRiKChjdXJyX3ZhbHMgJiB+KDEgPDwgYml0KSksIGdwaW9fYmEgKyBvZmZzZXQpOwotCXNwaW5fdW5sb2NrKCZncGlvX2xvY2spOwotfQotCi1zdGF0aWMgaW50IHNjaF9ncGlvX2NvcmVfZGlyZWN0aW9uX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKLQkJCQkJdW5zaWduZWQgZ3Bpb19udW0sIGludCB2YWwpCi17Ci0JdTggY3Vycl9kaXJzOwotCXVuc2lnbmVkIHNob3J0IG9mZnNldCwgYml0OwotCi0Jc2NoX2dwaW9fY29yZV9zZXQoZ2MsIGdwaW9fbnVtLCB2YWwpOwotCi0Jc3Bpbl9sb2NrKCZncGlvX2xvY2spOwotCi0Jb2Zmc2V0ID0gQ0dJTyArIGdwaW9fbnVtIC8gODsKLQliaXQgPSBncGlvX251bSAlIDg7Ci0KLQljdXJyX2RpcnMgPSBpbmIoZ3Bpb19iYSArIG9mZnNldCk7Ci0JaWYgKGN1cnJfZGlycyAmICgxIDw8IGJpdCkpCi0JCW91dGIoY3Vycl9kaXJzICYgfigxIDw8IGJpdCksIGdwaW9fYmEgKyBvZmZzZXQpOwotCi0Jc3Bpbl91bmxvY2soJmdwaW9fbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHNjaF9ncGlvX2NvcmUgPSB7Ci0JLmxhYmVsCQkJPSAic2NoX2dwaW9fY29yZSIsCi0JLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkuZGlyZWN0aW9uX2lucHV0CT0gc2NoX2dwaW9fY29yZV9kaXJlY3Rpb25faW4sCi0JLmdldAkJCT0gc2NoX2dwaW9fY29yZV9nZXQsCi0JLmRpcmVjdGlvbl9vdXRwdXQJPSBzY2hfZ3Bpb19jb3JlX2RpcmVjdGlvbl9vdXQsCi0JLnNldAkJCT0gc2NoX2dwaW9fY29yZV9zZXQsCi19OwotCi1zdGF0aWMgaW50IHNjaF9ncGlvX3Jlc3VtZV9kaXJlY3Rpb25faW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsCi0JCQkJCXVuc2lnbmVkIGdwaW9fbnVtKQotewotCXU4IGN1cnJfZGlyczsKLQotCXNwaW5fbG9jaygmZ3Bpb19sb2NrKTsKLQotCWN1cnJfZGlycyA9IGluYihncGlvX2JhICsgUkdJTyk7Ci0KLQlpZiAoIShjdXJyX2RpcnMgJiAoMSA8PCBncGlvX251bSkpKQotCQlvdXRiKGN1cnJfZGlycyB8ICgxIDw8IGdwaW9fbnVtKSAsIGdwaW9fYmEgKyBSR0lPKTsKLQotCXNwaW5fdW5sb2NrKCZncGlvX2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNjaF9ncGlvX3Jlc3VtZV9nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGdwaW9fbnVtKQotewotCXJldHVybiAhIShpbmIoZ3Bpb19iYSArIFJHTFYpICYgKDEgPDwgZ3Bpb19udW0pKTsKLX0KLQotc3RhdGljIHZvaWQgc2NoX2dwaW9fcmVzdW1lX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKLQkJCQl1bnNpZ25lZCBncGlvX251bSwgaW50IHZhbCkKLXsKLQl1OCBjdXJyX3ZhbHM7Ci0KLQlzcGluX2xvY2soJmdwaW9fbG9jayk7Ci0KLQljdXJyX3ZhbHMgPSBpbmIoZ3Bpb19iYSArIFJHTFYpOwotCi0JaWYgKHZhbCkKLQkJb3V0YihjdXJyX3ZhbHMgfCAoMSA8PCBncGlvX251bSksIGdwaW9fYmEgKyBSR0xWKTsKLQllbHNlCi0JCW91dGIoKGN1cnJfdmFscyAmIH4oMSA8PCBncGlvX251bSkpLCBncGlvX2JhICsgUkdMVik7Ci0KLQlzcGluX3VubG9jaygmZ3Bpb19sb2NrKTsKLX0KLQotc3RhdGljIGludCBzY2hfZ3Bpb19yZXN1bWVfZGlyZWN0aW9uX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKLQkJCQkJdW5zaWduZWQgZ3Bpb19udW0sIGludCB2YWwpCi17Ci0JdTggY3Vycl9kaXJzOwotCi0Jc2NoX2dwaW9fcmVzdW1lX3NldChnYywgZ3Bpb19udW0sIHZhbCk7Ci0KLQlzcGluX2xvY2soJmdwaW9fbG9jayk7Ci0KLQljdXJyX2RpcnMgPSBpbmIoZ3Bpb19iYSArIFJHSU8pOwotCWlmIChjdXJyX2RpcnMgJiAoMSA8PCBncGlvX251bSkpCi0JCW91dGIoY3Vycl9kaXJzICYgfigxIDw8IGdwaW9fbnVtKSwgZ3Bpb19iYSArIFJHSU8pOwotCi0Jc3Bpbl91bmxvY2soJmdwaW9fbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHNjaF9ncGlvX3Jlc3VtZSA9IHsKLQkubGFiZWwJCQk9ICJzY2hfZ3Bpb19yZXN1bWUiLAotCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JLmRpcmVjdGlvbl9pbnB1dAk9IHNjaF9ncGlvX3Jlc3VtZV9kaXJlY3Rpb25faW4sCi0JLmdldAkJCT0gc2NoX2dwaW9fcmVzdW1lX2dldCwKLQkuZGlyZWN0aW9uX291dHB1dAk9IHNjaF9ncGlvX3Jlc3VtZV9kaXJlY3Rpb25fb3V0LAotCS5zZXQJCQk9IHNjaF9ncGlvX3Jlc3VtZV9zZXQsCi19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzY2hfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCBlcnIsIGlkOwotCi0JaWQgPSBwZGV2LT5pZDsKLQlpZiAoIWlkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKLQlpZiAoIXJlcykKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWlmICghcmVxdWVzdF9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWdwaW9fYmEgPSByZXMtPnN0YXJ0OwotCi0Jc3dpdGNoIChpZCkgewotCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfU0NIX0xQQzoKLQkJCXNjaF9ncGlvX2NvcmUuYmFzZSA9IDA7Ci0JCQlzY2hfZ3Bpb19jb3JlLm5ncGlvID0gMTA7Ci0KLQkJCXNjaF9ncGlvX3Jlc3VtZS5iYXNlID0gMTA7Ci0JCQlzY2hfZ3Bpb19yZXN1bWUubmdwaW8gPSA0OwotCi0JCQkvKgotCQkJICogR1BJT1s2OjBdIGVuYWJsZWQgYnkgZGVmYXVsdAotCQkJICogR1BJTzcgaXMgY29uZmlndXJlZCBieSB0aGUgQ01DIGFzIFNMUElPVlIKLQkJCSAqIEVuYWJsZSBHUElPWzk6OF0gY29yZSBwb3dlcmVkIGdwaW9zIGV4cGxpY2l0bHkKLQkJCSAqLwotCQkJb3V0YigweDMsIGdwaW9fYmEgKyBDR0VOICsgMSk7Ci0JCQkvKgotCQkJICogU1VTX0dQSU9bMjowXSBlbmFibGVkIGJ5IGRlZmF1bHQKLQkJCSAqIEVuYWJsZSBTVVNfR1BJTzMgcmVzdW1lIHBvd2VyZWQgZ3BpbyBleHBsaWNpdGx5Ci0JCQkgKi8KLQkJCW91dGIoMHg4LCBncGlvX2JhICsgUkdFTik7Ci0JCQlicmVhazsKLQotCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfSVRDX0xQQzoKLQkJCXNjaF9ncGlvX2NvcmUuYmFzZSA9IDA7Ci0JCQlzY2hfZ3Bpb19jb3JlLm5ncGlvID0gNTsKLQotCQkJc2NoX2dwaW9fcmVzdW1lLmJhc2UgPSA1OwotCQkJc2NoX2dwaW9fcmVzdW1lLm5ncGlvID0gOTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlzY2hfZ3Bpb19jb3JlLmRldiA9ICZwZGV2LT5kZXY7Ci0Jc2NoX2dwaW9fcmVzdW1lLmRldiA9ICZwZGV2LT5kZXY7Ci0KLQllcnIgPSBncGlvY2hpcF9hZGQoJnNjaF9ncGlvX2NvcmUpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycl9zY2hfZ3Bpb19jb3JlOwotCi0JZXJyID0gZ3Bpb2NoaXBfYWRkKCZzY2hfZ3Bpb19yZXN1bWUpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycl9zY2hfZ3Bpb19yZXN1bWU7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3NjaF9ncGlvX3Jlc3VtZToKLQllcnIgPSBncGlvY2hpcF9yZW1vdmUoJnNjaF9ncGlvX2NvcmUpOwotCWlmIChlcnIpCi0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIGZhaWxlZCwgJWRcbiIsCi0JCQkJImdwaW9jaGlwX3JlbW92ZSgpIiwgZXJyKTsKLQotZXJyX3NjaF9ncGlvX2NvcmU6Ci0JcmVsZWFzZV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQlncGlvX2JhID0gMDsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IHNjaF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWlmIChncGlvX2JhKSB7Ci0JCWludCBlcnI7Ci0KLQkJZXJyICA9IGdwaW9jaGlwX3JlbW92ZSgmc2NoX2dwaW9fY29yZSk7Ci0JCWlmIChlcnIpCi0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBmYWlsZWQsICVkXG4iLAotCQkJCSJncGlvY2hpcF9yZW1vdmUoKSIsIGVycik7Ci0JCWVyciA9IGdwaW9jaGlwX3JlbW92ZSgmc2NoX2dwaW9fcmVzdW1lKTsKLQkJaWYgKGVycikKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIGZhaWxlZCwgJWRcbiIsCi0JCQkJImdwaW9jaGlwX3JlbW92ZSgpIiwgZXJyKTsKLQotCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7Ci0KLQkJcmVsZWFzZV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQkJZ3Bpb19iYSA9IDA7Ci0KLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2NoX2dwaW9fZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInNjaF9ncGlvIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJCT0gc2NoX2dwaW9fcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzY2hfZ3Bpb19yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgc2NoX2dwaW9faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNjaF9ncGlvX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzY2hfZ3Bpb19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNjaF9ncGlvX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHNjaF9ncGlvX2luaXQpOwotbW9kdWxlX2V4aXQoc2NoX2dwaW9fZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkRlbmlzIFR1cmlzY2hldiA8ZGVuaXNAY29tcHVsYWIuY28uaWw+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkdQSU8gaW50ZXJmYWNlIGZvciBJbnRlbCBQb3Vsc2JvIFNDSCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzY2hfZ3BpbyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3RpbWJncGlvLmMgYi9kcml2ZXJzL2dwaW8vdGltYmdwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2NTg3Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwaW8vdGltYmdwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi0vKgotICogdGltYmdwaW8uYyB0aW1iZXJkYWxlIEZQR0EgR1BJTyBkcml2ZXIKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLS8qIFN1cHBvcnRzOgotICogVGltYmVyZGFsZSBGUEdBIEdQSU8KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltYl9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jZGVmaW5lIERSSVZFUl9OQU1FICJ0aW1iLWdwaW8iCi0KLSNkZWZpbmUgVEdQSU9WQUwJMHgwMAotI2RlZmluZSBUR1BJT0RJUgkweDA0Ci0jZGVmaW5lIFRHUElPX0lFUgkweDA4Ci0jZGVmaW5lIFRHUElPX0lTUgkweDBjCi0jZGVmaW5lIFRHUElPX0lQUgkweDEwCi0jZGVmaW5lIFRHUElPX0lDUgkweDE0Ci0jZGVmaW5lIFRHUElPX0ZMUgkweDE4Ci0jZGVmaW5lIFRHUElPX0xWUgkweDFjCi0jZGVmaW5lIFRHUElPX1ZFUgkweDIwCi0jZGVmaW5lIFRHUElPX0JGTFIJMHgyNAotCi1zdHJ1Y3QgdGltYmdwaW8gewotCXZvaWQgX19pb21lbQkJKm1lbWJhc2U7Ci0Jc3BpbmxvY2tfdAkJbG9jazsgLyogbXV0dWFsIGV4Y2x1c2lvbiAqLwotCXN0cnVjdCBncGlvX2NoaXAJZ3BpbzsKLQlpbnQJCQlpcnFfYmFzZTsKLQl1bnNpZ25lZCBsb25nCQlsYXN0X2llcjsKLX07Ci0KLXN0YXRpYyBpbnQgdGltYmdwaW9fdXBkYXRlX2JpdChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1bnNpZ25lZCBpbmRleCwKLQl1bnNpZ25lZCBvZmZzZXQsIGJvb2wgZW5hYmxlZCkKLXsKLQlzdHJ1Y3QgdGltYmdwaW8gKnRncGlvID0gY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCB0aW1iZ3BpbywgZ3Bpbyk7Ci0JdTMyIHJlZzsKLQotCXNwaW5fbG9jaygmdGdwaW8tPmxvY2spOwotCXJlZyA9IGlvcmVhZDMyKHRncGlvLT5tZW1iYXNlICsgb2Zmc2V0KTsKLQotCWlmIChlbmFibGVkKQotCQlyZWcgfD0gKDEgPDwgaW5kZXgpOwotCWVsc2UKLQkJcmVnICY9IH4oMSA8PCBpbmRleCk7Ci0KLQlpb3dyaXRlMzIocmVnLCB0Z3Bpby0+bWVtYmFzZSArIG9mZnNldCk7Ci0Jc3Bpbl91bmxvY2soJnRncGlvLT5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRpbWJncGlvX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2lnbmVkIG5yKQotewotCXJldHVybiB0aW1iZ3Bpb191cGRhdGVfYml0KGdwaW8sIG5yLCBUR1BJT0RJUiwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgdGltYmdwaW9fZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ3BpbywgdW5zaWduZWQgbnIpCi17Ci0Jc3RydWN0IHRpbWJncGlvICp0Z3BpbyA9IGNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgdGltYmdwaW8sIGdwaW8pOwotCXUzMiB2YWx1ZTsKLQotCXZhbHVlID0gaW9yZWFkMzIodGdwaW8tPm1lbWJhc2UgKyBUR1BJT1ZBTCk7Ci0JcmV0dXJuICh2YWx1ZSAmICgxIDw8IG5yKSkgPyAxIDogMDsKLX0KLQotc3RhdGljIGludCB0aW1iZ3Bpb19ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ3BpbywKLQkJCQkJCXVuc2lnbmVkIG5yLCBpbnQgdmFsKQotewotCXJldHVybiB0aW1iZ3Bpb191cGRhdGVfYml0KGdwaW8sIG5yLCBUR1BJT0RJUiwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCB0aW1iZ3Bpb19ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLAotCQkJCXVuc2lnbmVkIG5yLCBpbnQgdmFsKQotewotCXRpbWJncGlvX3VwZGF0ZV9iaXQoZ3BpbywgbnIsIFRHUElPVkFMLCB2YWwgIT0gMCk7Ci19Ci0KLXN0YXRpYyBpbnQgdGltYmdwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgdGltYmdwaW8gKnRncGlvID0gY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCB0aW1iZ3BpbywgZ3Bpbyk7Ci0KLQlpZiAodGdwaW8tPmlycV9iYXNlIDw9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIHRncGlvLT5pcnFfYmFzZSArIG9mZnNldDsKLX0KLQotLyoKLSAqIEdQSU8gSVJRCi0gKi8KLXN0YXRpYyB2b2lkIHRpbWJncGlvX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3QgdGltYmdwaW8gKnRncGlvID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JaW50IG9mZnNldCA9IGQtPmlycSAtIHRncGlvLT5pcnFfYmFzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRncGlvLT5sb2NrLCBmbGFncyk7Ci0JdGdwaW8tPmxhc3RfaWVyICY9IH4oMSA8PCBvZmZzZXQpOwotCWlvd3JpdGUzMih0Z3Bpby0+bGFzdF9pZXIsIHRncGlvLT5tZW1iYXNlICsgVEdQSU9fSUVSKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0Z3Bpby0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCB0aW1iZ3Bpb19pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3QgdGltYmdwaW8gKnRncGlvID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JaW50IG9mZnNldCA9IGQtPmlycSAtIHRncGlvLT5pcnFfYmFzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRncGlvLT5sb2NrLCBmbGFncyk7Ci0JdGdwaW8tPmxhc3RfaWVyIHw9IDEgPDwgb2Zmc2V0OwotCWlvd3JpdGUzMih0Z3Bpby0+bGFzdF9pZXIsIHRncGlvLT5tZW1iYXNlICsgVEdQSU9fSUVSKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0Z3Bpby0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IHRpbWJncGlvX2lycV90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgdHJpZ2dlcikKLXsKLQlzdHJ1Y3QgdGltYmdwaW8gKnRncGlvID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JaW50IG9mZnNldCA9IGQtPmlycSAtIHRncGlvLT5pcnFfYmFzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBsdnIsIGZsciwgYmZsciA9IDA7Ci0JdTMyIHZlcjsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IHRncGlvLT5ncGlvLm5ncGlvKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXZlciA9IGlvcmVhZDMyKHRncGlvLT5tZW1iYXNlICsgVEdQSU9fVkVSKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ0Z3Bpby0+bG9jaywgZmxhZ3MpOwotCi0JbHZyID0gaW9yZWFkMzIodGdwaW8tPm1lbWJhc2UgKyBUR1BJT19MVlIpOwotCWZsciA9IGlvcmVhZDMyKHRncGlvLT5tZW1iYXNlICsgVEdQSU9fRkxSKTsKLQlpZiAodmVyID4gMikKLQkJYmZsciA9IGlvcmVhZDMyKHRncGlvLT5tZW1iYXNlICsgVEdQSU9fQkZMUik7Ci0KLQlpZiAodHJpZ2dlciAmIChJUlFfVFlQRV9MRVZFTF9ISUdIIHwgSVJRX1RZUEVfTEVWRUxfTE9XKSkgewotCQliZmxyICY9IH4oMSA8PCBvZmZzZXQpOwotCQlmbHIgJj0gfigxIDw8IG9mZnNldCk7Ci0JCWlmICh0cmlnZ2VyICYgSVJRX1RZUEVfTEVWRUxfSElHSCkKLQkJCWx2ciB8PSAxIDw8IG9mZnNldDsKLQkJZWxzZQotCQkJbHZyICY9IH4oMSA8PCBvZmZzZXQpOwotCX0KLQotCWlmICgodHJpZ2dlciAmIElSUV9UWVBFX0VER0VfQk9USCkgPT0gSVJRX1RZUEVfRURHRV9CT1RIKSB7Ci0JCWlmICh2ZXIgPCAzKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmbHIgfD0gMSA8PCBvZmZzZXQ7Ci0JCQliZmxyIHw9IDEgPDwgb2Zmc2V0OwotCQl9Ci0JfSBlbHNlIHsKLQkJYmZsciAmPSB+KDEgPDwgb2Zmc2V0KTsKLQkJZmxyIHw9IDEgPDwgb2Zmc2V0OwotCQlpZiAodHJpZ2dlciAmIElSUV9UWVBFX0VER0VfRkFMTElORykKLQkJCWx2ciAmPSB+KDEgPDwgb2Zmc2V0KTsKLQkJZWxzZQotCQkJbHZyIHw9IDEgPDwgb2Zmc2V0OwotCX0KLQotCWlvd3JpdGUzMihsdnIsIHRncGlvLT5tZW1iYXNlICsgVEdQSU9fTFZSKTsKLQlpb3dyaXRlMzIoZmxyLCB0Z3Bpby0+bWVtYmFzZSArIFRHUElPX0ZMUik7Ci0JaWYgKHZlciA+IDIpCi0JCWlvd3JpdGUzMihiZmxyLCB0Z3Bpby0+bWVtYmFzZSArIFRHUElPX0JGTFIpOwotCi0JaW93cml0ZTMyKDEgPDwgb2Zmc2V0LCB0Z3Bpby0+bWVtYmFzZSArIFRHUElPX0lDUik7Ci0KLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0Z3Bpby0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHRpbWJncGlvX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IHRpbWJncGlvICp0Z3BpbyA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7Ci0JdW5zaWduZWQgbG9uZyBpcHI7Ci0JaW50IG9mZnNldDsKLQotCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9hY2soaXJxX2dldF9pcnFfZGF0YShpcnEpKTsKLQlpcHIgPSBpb3JlYWQzMih0Z3Bpby0+bWVtYmFzZSArIFRHUElPX0lQUik7Ci0JaW93cml0ZTMyKGlwciwgdGdwaW8tPm1lbWJhc2UgKyBUR1BJT19JQ1IpOwotCi0JLyoKLQkgKiBTb21lIHZlcnNpb25zIG9mIHRoZSBoYXJkd2FyZSB0cmFzaCB0aGUgSUVSIHJlZ2lzdGVyIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQgc2ltdWx0YW5lb3VzbHkuCi0JICovCi0JaW93cml0ZTMyKDAsIHRncGlvLT5tZW1iYXNlICsgVEdQSU9fSUVSKTsKLQotCWZvcl9lYWNoX3NldF9iaXQob2Zmc2V0LCAmaXByLCB0Z3Bpby0+Z3Bpby5uZ3BpbykKLQkJZ2VuZXJpY19oYW5kbGVfaXJxKHRpbWJncGlvX3RvX2lycSgmdGdwaW8tPmdwaW8sIG9mZnNldCkpOwotCi0JaW93cml0ZTMyKHRncGlvLT5sYXN0X2llciwgdGdwaW8tPm1lbWJhc2UgKyBUR1BJT19JRVIpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHRpbWJncGlvX2lycWNoaXAgPSB7Ci0JLm5hbWUJCT0gIkdQSU8iLAotCS5pcnFfZW5hYmxlCT0gdGltYmdwaW9faXJxX2VuYWJsZSwKLQkuaXJxX2Rpc2FibGUJPSB0aW1iZ3Bpb19pcnFfZGlzYWJsZSwKLQkuaXJxX3NldF90eXBlCT0gdGltYmdwaW9faXJxX3R5cGUsCi19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCB0aW1iZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCBlcnIsIGk7Ci0Jc3RydWN0IGdwaW9fY2hpcCAqZ2M7Ci0Jc3RydWN0IHRpbWJncGlvICp0Z3BpbzsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmlvbWVtOwotCXN0cnVjdCB0aW1iZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCi0JaWYgKCFwZGF0YSB8fCBwZGF0YS0+bnJfcGlucyA+IDMyKSB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX21lbTsKLQl9Ci0KLQlpb21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFpb21lbSkgewotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9tZW07Ci0JfQotCi0JdGdwaW8gPSBremFsbG9jKHNpemVvZigqdGdwaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRncGlvKSB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX21lbTsKLQl9Ci0JdGdwaW8tPmlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnRncGlvLT5sb2NrKTsKLQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGlvbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb21lbSksCi0JCURSSVZFUl9OQU1FKSkgewotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyX3JlcXVlc3Q7Ci0JfQotCi0JdGdwaW8tPm1lbWJhc2UgPSBpb3JlbWFwKGlvbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb21lbSkpOwotCWlmICghdGdwaW8tPm1lbWJhc2UpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfaW9yZW1hcDsKLQl9Ci0KLQlnYyA9ICZ0Z3Bpby0+Z3BpbzsKLQotCWdjLT5sYWJlbCA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwotCWdjLT5vd25lciA9IFRISVNfTU9EVUxFOwotCWdjLT5kZXYgPSAmcGRldi0+ZGV2OwotCWdjLT5kaXJlY3Rpb25faW5wdXQgPSB0aW1iZ3Bpb19ncGlvX2RpcmVjdGlvbl9pbnB1dDsKLQlnYy0+Z2V0ID0gdGltYmdwaW9fZ3Bpb19nZXQ7Ci0JZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSB0aW1iZ3Bpb19ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7Ci0JZ2MtPnNldCA9IHRpbWJncGlvX2dwaW9fc2V0OwotCWdjLT50b19pcnEgPSAoaXJxID49IDAgJiYgdGdwaW8tPmlycV9iYXNlID4gMCkgPyB0aW1iZ3Bpb190b19pcnEgOiBOVUxMOwotCWdjLT5kYmdfc2hvdyA9IE5VTEw7Ci0JZ2MtPmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOwotCWdjLT5uZ3BpbyA9IHBkYXRhLT5ucl9waW5zOwotCWdjLT5jYW5fc2xlZXAgPSAwOwotCi0JZXJyID0gZ3Bpb2NoaXBfYWRkKGdjKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9jaGlwYWRkOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdGdwaW8pOwotCi0JLyogbWFrZSBzdXJlIHRvIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCWlvd3JpdGUzMigweDAsIHRncGlvLT5tZW1iYXNlICsgVEdQSU9fSUVSKTsKLQotCWlmIChpcnEgPCAwIHx8IHRncGlvLT5pcnFfYmFzZSA8PSAwKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnJfcGluczsgaSsrKSB7Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHRncGlvLT5pcnFfYmFzZSArIGksCi0JCQkmdGltYmdwaW9faXJxY2hpcCwgaGFuZGxlX3NpbXBsZV9pcnEsICJtdXgiKTsKLQkJaXJxX3NldF9jaGlwX2RhdGEodGdwaW8tPmlycV9iYXNlICsgaSwgdGdwaW8pOwotI2lmZGVmIENPTkZJR19BUk0KLQkJc2V0X2lycV9mbGFncyh0Z3Bpby0+aXJxX2Jhc2UgKyBpLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7Ci0jZW5kaWYKLQl9Ci0KLQlpcnFfc2V0X2hhbmRsZXJfZGF0YShpcnEsIHRncGlvKTsKLQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihpcnEsIHRpbWJncGlvX2lycSk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2NoaXBhZGQ6Ci0JaW91bm1hcCh0Z3Bpby0+bWVtYmFzZSk7Ci1lcnJfaW9yZW1hcDoKLQlyZWxlYXNlX21lbV9yZWdpb24oaW9tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvbWVtKSk7Ci1lcnJfcmVxdWVzdDoKLQlrZnJlZSh0Z3Bpbyk7Ci1lcnJfbWVtOgotCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSI6IEZhaWxlZCB0byByZWdpc3RlciBHUElPczogJWRcbiIsIGVycik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCB0aW1iZ3Bpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCB0aW1iZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCB0aW1iZ3BpbyAqdGdwaW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmlvbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQotCWlmIChpcnEgPj0gMCAmJiB0Z3Bpby0+aXJxX2Jhc2UgPiAwKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5yX3BpbnM7IGkrKykgewotCQkJaXJxX3NldF9jaGlwKHRncGlvLT5pcnFfYmFzZSArIGksIE5VTEwpOwotCQkJaXJxX3NldF9jaGlwX2RhdGEodGdwaW8tPmlycV9iYXNlICsgaSwgTlVMTCk7Ci0JCX0KLQotCQlpcnFfc2V0X2hhbmRsZXIoaXJxLCBOVUxMKTsKLQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoaXJxLCBOVUxMKTsKLQl9Ci0KLQllcnIgPSBncGlvY2hpcF9yZW1vdmUoJnRncGlvLT5ncGlvKTsKLQlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUiOiBmYWlsZWQgdG8gcmVtb3ZlIGdwaW9fY2hpcFxuIik7Ci0KLQlpb3VubWFwKHRncGlvLT5tZW1iYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oaW9tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvbWVtKSk7Ci0Ja2ZyZWUodGdwaW8pOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGltYmdwaW9fcGxhdGZvcm1fZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gRFJJVkVSX05BTUUsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlCQk9IHRpbWJncGlvX3Byb2JlLAotCS5yZW1vdmUJCT0gdGltYmdwaW9fcmVtb3ZlLAotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgX19pbml0IHRpbWJncGlvX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0aW1iZ3Bpb19wbGF0Zm9ybV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGltYmdwaW9fZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0aW1iZ3Bpb19wbGF0Zm9ybV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdCh0aW1iZ3Bpb19pbml0KTsKLW1vZHVsZV9leGl0KHRpbWJncGlvX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlRpbWJlcmRhbGUgR1BJTyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9BVVRIT1IoIk1vY2VhbiBMYWJvcmF0b3JpZXMiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06IkRSSVZFUl9OQU1FKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3RwczY1OTEwLWdwaW8uYyBiL2RyaXZlcnMvZ3Bpby90cHM2NTkxMC1ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMWRkZmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL3RwczY1OTEwLWdwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogdHBzNjU5MTAtZ3Bpby5jICAtLSAgVEkgVFBTNjU5MXgKLSAqCi0gKiBDb3B5cmlnaHQgMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCi0gKgotICogQXV0aG9yOiBHcmFlbWUgR3JlZ29yeSA8Z2dAc2xpbWxvZ2ljLmNvLnVrPgotICogQXV0aG9yOiBKb3JnZSBFZHVhcmRvIENhbmRlbGFyaWEgamVkdUBzbGltbG9naWMuY28udWs+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjU5MTAuaD4KLQotc3RhdGljIGludCB0cHM2NTkxMF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCB0cHM2NTkxMCAqdHBzNjU5MTAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCB0cHM2NTkxMCwgZ3Bpbyk7Ci0JdWludDhfdCB2YWw7Ci0KLQl0cHM2NTkxMC0+cmVhZCh0cHM2NTkxMCwgVFBTNjU5MTBfR1BJTzAgKyBvZmZzZXQsIDEsICZ2YWwpOwotCi0JaWYgKHZhbCAmIEdQSU9fU1RTX01BU0spCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRwczY1OTEwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQsCi0JCQkgICAgICBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IHRwczY1OTEwICp0cHM2NTkxMCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHRwczY1OTEwLCBncGlvKTsKLQotCWlmICh2YWx1ZSkKLQkJdHBzNjU5MTBfc2V0X2JpdHModHBzNjU5MTAsIFRQUzY1OTEwX0dQSU8wICsgb2Zmc2V0LAotCQkJCQkJR1BJT19TRVRfTUFTSyk7Ci0JZWxzZQotCQl0cHM2NTkxMF9jbGVhcl9iaXRzKHRwczY1OTEwLCBUUFM2NTkxMF9HUElPMCArIG9mZnNldCwKLQkJCQkJCUdQSU9fU0VUX01BU0spOwotfQotCi1zdGF0aWMgaW50IHRwczY1OTEwX2dwaW9fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQsCi0JCQkJaW50IHZhbHVlKQotewotCXN0cnVjdCB0cHM2NTkxMCAqdHBzNjU5MTAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCB0cHM2NTkxMCwgZ3Bpbyk7Ci0KLQkvKiBTZXQgdGhlIGluaXRpYWwgdmFsdWUgKi8KLQl0cHM2NTkxMF9ncGlvX3NldChnYywgMCwgdmFsdWUpOwotCi0JcmV0dXJuIHRwczY1OTEwX3NldF9iaXRzKHRwczY1OTEwLCBUUFM2NTkxMF9HUElPMCArIG9mZnNldCwKLQkJCQkJCUdQSU9fQ0ZHX01BU0spOwotfQotCi1zdGF0aWMgaW50IHRwczY1OTEwX2dwaW9faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgdHBzNjU5MTAgKnRwczY1OTEwID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgdHBzNjU5MTAsIGdwaW8pOwotCi0JcmV0dXJuIHRwczY1OTEwX2NsZWFyX2JpdHModHBzNjU5MTAsIFRQUzY1OTEwX0dQSU8wICsgb2Zmc2V0LAotCQkJCQkJR1BJT19DRkdfTUFTSyk7Ci19Ci0KLXZvaWQgdHBzNjU5MTBfZ3Bpb19pbml0KHN0cnVjdCB0cHM2NTkxMCAqdHBzNjU5MTAsIGludCBncGlvX2Jhc2UpCi17Ci0JaW50IHJldDsKLQotCWlmICghZ3Bpb19iYXNlKQotCQlyZXR1cm47Ci0KLQl0cHM2NTkxMC0+Z3Bpby5vd25lcgkJPSBUSElTX01PRFVMRTsKLQl0cHM2NTkxMC0+Z3Bpby5sYWJlbAkJPSB0cHM2NTkxMC0+aTJjX2NsaWVudC0+bmFtZTsKLQl0cHM2NTkxMC0+Z3Bpby5kZXYJCT0gdHBzNjU5MTAtPmRldjsKLQl0cHM2NTkxMC0+Z3Bpby5iYXNlCQk9IGdwaW9fYmFzZTsKLQotCXN3aXRjaCh0cHM2NTkxMF9jaGlwX2lkKHRwczY1OTEwKSkgewotCWNhc2UgVFBTNjU5MTA6Ci0JCXRwczY1OTEwLT5ncGlvLm5ncGlvCT0gNjsKLQljYXNlIFRQUzY1OTExOgotCQl0cHM2NTkxMC0+Z3Bpby5uZ3Bpbwk9IDk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KLQl0cHM2NTkxMC0+Z3Bpby5jYW5fc2xlZXAJPSAxOwotCi0JdHBzNjU5MTAtPmdwaW8uZGlyZWN0aW9uX2lucHV0CT0gdHBzNjU5MTBfZ3Bpb19pbnB1dDsKLQl0cHM2NTkxMC0+Z3Bpby5kaXJlY3Rpb25fb3V0cHV0CT0gdHBzNjU5MTBfZ3Bpb19vdXRwdXQ7Ci0JdHBzNjU5MTAtPmdwaW8uc2V0CQk9IHRwczY1OTEwX2dwaW9fc2V0OwotCXRwczY1OTEwLT5ncGlvLmdldAkJPSB0cHM2NTkxMF9ncGlvX2dldDsKLQotCXJldCA9IGdwaW9jaGlwX2FkZCgmdHBzNjU5MTAtPmdwaW8pOwotCi0JaWYgKHJldCkKLQkJZGV2X3dhcm4odHBzNjU5MTAtPmRldiwgIkdQSU8gcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsIHJldCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vdHdsNDAzMC1ncGlvLmMgYi9kcml2ZXJzL2dwaW8vdHdsNDAzMC1ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjM1YWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL3R3bDQwMzAtZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8qCi0gKiB0d2w0MDMwX2dwaW8uYyAtLSBhY2Nlc3MgdG8gR1BJT3Mgb24gVFdMNDAzMC9UUFM2NTl4MCBjaGlwcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIENvZGUgcmUtYXJyYW5nZWQgYW5kIGNsZWFuZWQgdXAgYnk6Ci0gKglTeWVkIE1vaGFtbWVkIEtoYXNpbSA8eDBraGFzaW1AdGkuY29tPgotICoKLSAqIEluaXRpYWwgQ29kZToKLSAqCUFuZHkgTG93ZSAvIE5pc2hhbnRoIE1lbm9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgotCi0KLS8qCi0gKiBUaGUgR1BJTyAic3ViY2hpcCIgc3VwcG9ydHMgMTggR1BJT3Mgd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgYXMKLSAqIGlucHV0cyBvciBvdXRwdXRzLCB3aXRoIHB1bGx1cHMgb3IgcHVsbGRvd25zIG9uIGVhY2ggcGluLiAgRWFjaAotICogR1BJTyBjYW4gdHJpZ2dlciBpbnRlcnJ1cHRzIG9uIGVpdGhlciBvciBib3RoIGVkZ2VzLgotICoKLSAqIEdQSU8gaW50ZXJydXB0cyBjYW4gYmUgZmVkIHRvIGVpdGhlciBvZiB0d28gSVJRIGxpbmVzOyB0aGlzIGlzCi0gKiBpbnRlbmRlZCB0byBzdXBwb3J0IG11bHRpcGxlIGhvc3RzLgotICoKLSAqIFRoZXJlIGFyZSBhbHNvIHR3byBMRUQgcGlucyB1c2VkIHNvbWV0aW1lcyBhcyBvdXRwdXQtb25seSBHUElPcy4KLSAqLwotCi0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHR3bF9ncGlvY2hpcDsKLXN0YXRpYyBpbnQgdHdsNDAzMF9ncGlvX2lycV9iYXNlOwotCi0vKiBnZW5pcnEgaW50ZXJmYWNlcyBhcmUgbm90IGF2YWlsYWJsZSB0byBtb2R1bGVzICovCi0jaWZkZWYgTU9EVUxFCi0jZGVmaW5lIGlzX21vZHVsZSgpCXRydWUKLSNlbHNlCi0jZGVmaW5lIGlzX21vZHVsZSgpCWZhbHNlCi0jZW5kaWYKLQotLyogR1BJT19DVFJMIEZpZWxkcyAqLwotI2RlZmluZSBNQVNLX0dQSU9fQ1RSTF9HUElPMENEMQkJQklUKDApCi0jZGVmaW5lIE1BU0tfR1BJT19DVFJMX0dQSU8xQ0QyCQlCSVQoMSkKLSNkZWZpbmUgTUFTS19HUElPX0NUUkxfR1BJT19PTgkJQklUKDIpCi0KLS8qIE1hc2sgZm9yIEdQSU8gcmVnaXN0ZXJzIHdoZW4gYWdncmVnYXRlZCBpbnRvIGEgMzItYml0IGludGVnZXIgKi8KLSNkZWZpbmUgR1BJT18zMl9NQVNLCQkJMHgwMDAzZmZmZgotCi0vKiBEYXRhIHN0cnVjdHVyZXMgKi8KLXN0YXRpYyBERUZJTkVfTVVURVgoZ3Bpb19sb2NrKTsKLQotLyogc3RvcmUgdXNhZ2Ugb2YgZWFjaCBHUElPLiAtIGVhY2ggYml0IHJlcHJlc2VudHMgb25lIEdQSU8gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ3Bpb191c2FnZV9jb3VudDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIFRvIGNvbmZpZ3VyZSBUV0w0MDMwIEdQSU8gbW9kdWxlIHJlZ2lzdGVycwotICovCi1zdGF0aWMgaW5saW5lIGludCBncGlvX3R3bDQwMzBfd3JpdGUodTggYWRkcmVzcywgdTggZGF0YSkKLXsKLQlyZXR1cm4gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9HUElPLCBkYXRhLCBhZGRyZXNzKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIExFRCByZWdpc3RlciBvZmZzZXRzICh1c2UgVFdMNDAzMF9NT0RVTEVfe0xFRCxQV01BLFBXTUJ9KSkKLSAqIFBXTXMgQSBhbmQgQiBhcmUgZGVkaWNhdGVkIHRvIExFRHMgQSBhbmQgQiwgcmVzcGVjdGl2ZWx5LgotICovCi0KLSNkZWZpbmUgVFdMNDAzMF9MRURfTEVERU4JMHgwCi0KLS8qIExFREVOIGJpdHMgKi8KLSNkZWZpbmUgTEVERU5fTEVEQU9OCQlCSVQoMCkKLSNkZWZpbmUgTEVERU5fTEVEQk9OCQlCSVQoMSkKLSNkZWZpbmUgTEVERU5fTEVEQUVYVAkJQklUKDIpCi0jZGVmaW5lIExFREVOX0xFREJFWFQJCUJJVCgzKQotI2RlZmluZSBMRURFTl9MRURBUFdNCQlCSVQoNCkKLSNkZWZpbmUgTEVERU5fTEVEQlBXTQkJQklUKDUpCi0jZGVmaW5lIExFREVOX1BXTV9MRU5HVEhBCUJJVCg2KQotI2RlZmluZSBMRURFTl9QV01fTEVOR1RIQglCSVQoNykKLQotI2RlZmluZSBUV0w0MDMwX1BXTXhfUFdNeE9OCTB4MAotI2RlZmluZSBUV0w0MDMwX1BXTXhfUFdNeE9GRgkweDEKLQotI2RlZmluZSBQV014T05fTEVOR1RICQlCSVQoNykKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIFRvIHJlYWQgYSBUV0w0MDMwIEdQSU8gbW9kdWxlIHJlZ2lzdGVyCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdHdsNDAzMF9yZWFkKHU4IGFkZHJlc3MpCi17Ci0JdTggZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHR3bF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9HUElPLCAmZGF0YSwgYWRkcmVzcyk7Ci0JcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IGRhdGE7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1OCBjYWNoZWRfbGVkZW47CQkvKiBwcm90ZWN0ZWQgYnkgZ3Bpb19sb2NrICovCi0KLS8qIFRoZSBMRUQgbGluZXMgYXJlIG9wZW4gZHJhaW4gb3V0cHV0cyAuLi4gYSBGRVQgcHVsbHMgdG8gR05ELCBzbyBhbgotICogZXh0ZXJuYWwgcHVsbHVwIGlzIG5lZWRlZC4gIFdlIGNvdWxkIGFsc28gZXhwb3NlIHRoZSBpbnRlZ3JhdGVkIFBXTQotICogYXMgYSBMRUQgYnJpZ2h0bmVzcyBjb250cm9sOyB3ZSBpbml0aWFsaXplIGl0IGFzICJhbHdheXMgb24iLgotICovCi1zdGF0aWMgdm9pZCB0d2w0MDMwX2xlZF9zZXRfdmFsdWUoaW50IGxlZCwgaW50IHZhbHVlKQotewotCXU4IG1hc2sgPSBMRURFTl9MRURBT04gfCBMRURFTl9MRURBUFdNOwotCWludCBzdGF0dXM7Ci0KLQlpZiAobGVkKQotCQltYXNrIDw8PSAxOwotCi0JbXV0ZXhfbG9jaygmZ3Bpb19sb2NrKTsKLQlpZiAodmFsdWUpCi0JCWNhY2hlZF9sZWRlbiAmPSB+bWFzazsKLQllbHNlCi0JCWNhY2hlZF9sZWRlbiB8PSBtYXNrOwotCXN0YXR1cyA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfTEVELCBjYWNoZWRfbGVkZW4sCi0JCQlUV0w0MDMwX0xFRF9MRURFTik7Ci0JbXV0ZXhfdW5sb2NrKCZncGlvX2xvY2spOwotfQotCi1zdGF0aWMgaW50IHR3bDQwMzBfc2V0X2dwaW9fZGlyZWN0aW9uKGludCBncGlvLCBpbnQgaXNfaW5wdXQpCi17Ci0JdTggZF9ibmsgPSBncGlvID4+IDM7Ci0JdTggZF9tc2sgPSBCSVQoZ3BpbyAmIDB4Nyk7Ci0JdTggcmVnID0gMDsKLQl1OCBiYXNlID0gUkVHX0dQSU9EQVRBRElSMSArIGRfYm5rOwotCWludCByZXQgPSAwOwotCi0JbXV0ZXhfbG9jaygmZ3Bpb19sb2NrKTsKLQlyZXQgPSBncGlvX3R3bDQwMzBfcmVhZChiYXNlKTsKLQlpZiAocmV0ID49IDApIHsKLQkJaWYgKGlzX2lucHV0KQotCQkJcmVnID0gcmV0ICYgfmRfbXNrOwotCQllbHNlCi0JCQlyZWcgPSByZXQgfCBkX21zazsKLQotCQlyZXQgPSBncGlvX3R3bDQwMzBfd3JpdGUoYmFzZSwgcmVnKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZncGlvX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdHdsNDAzMF9zZXRfZ3Bpb19kYXRhb3V0KGludCBncGlvLCBpbnQgZW5hYmxlKQotewotCXU4IGRfYm5rID0gZ3BpbyA+PiAzOwotCXU4IGRfbXNrID0gQklUKGdwaW8gJiAweDcpOwotCXU4IGJhc2UgPSAwOwotCi0JaWYgKGVuYWJsZSkKLQkJYmFzZSA9IFJFR19TRVRHUElPREFUQU9VVDEgKyBkX2JuazsKLQllbHNlCi0JCWJhc2UgPSBSRUdfQ0xFQVJHUElPREFUQU9VVDEgKyBkX2JuazsKLQotCXJldHVybiBncGlvX3R3bDQwMzBfd3JpdGUoYmFzZSwgZF9tc2spOwotfQotCi1zdGF0aWMgaW50IHR3bDQwMzBfZ2V0X2dwaW9fZGF0YWluKGludCBncGlvKQotewotCXU4IGRfYm5rID0gZ3BpbyA+PiAzOwotCXU4IGRfb2ZmID0gZ3BpbyAmIDB4NzsKLQl1OCBiYXNlID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh1bmxpa2VseSgoZ3BpbyA+PSBUV0w0MDMwX0dQSU9fTUFYKQotCQl8fCAhKGdwaW9fdXNhZ2VfY291bnQgJiBCSVQoZ3BpbykpKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWJhc2UgPSBSRUdfR1BJT0RBVEFJTjEgKyBkX2JuazsKLQlyZXQgPSBncGlvX3R3bDQwMzBfcmVhZChiYXNlKTsKLQlpZiAocmV0ID4gMCkKLQkJcmV0ID0gKHJldCA+PiBkX29mZikgJiAweDE7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHR3bF9yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQotCW11dGV4X2xvY2soJmdwaW9fbG9jayk7Ci0KLQkvKiBTdXBwb3J0IHRoZSB0d28gTEVEIG91dHB1dHMgYXMgb3V0cHV0LW9ubHkgR1BJT3MuICovCi0JaWYgKG9mZnNldCA+PSBUV0w0MDMwX0dQSU9fTUFYKSB7Ci0JCXU4CWxlZGNscl9tYXNrID0gTEVERU5fTEVEQU9OIHwgTEVERU5fTEVEQUVYVAotCQkJCXwgTEVERU5fTEVEQVBXTSB8IExFREVOX1BXTV9MRU5HVEhBOwotCQl1OAltb2R1bGUgPSBUV0w0MDMwX01PRFVMRV9QV01BOwotCi0JCW9mZnNldCAtPSBUV0w0MDMwX0dQSU9fTUFYOwotCQlpZiAob2Zmc2V0KSB7Ci0JCQlsZWRjbHJfbWFzayA8PD0gMTsKLQkJCW1vZHVsZSA9IFRXTDQwMzBfTU9EVUxFX1BXTUI7Ci0JCX0KLQotCQkvKiBpbml0aWFsaXplIFBXTSB0byBhbHdheXMtZHJpdmUgKi8KLQkJc3RhdHVzID0gdHdsX2kyY193cml0ZV91OChtb2R1bGUsIDB4N2YsCi0JCQkJVFdMNDAzMF9QV014X1BXTXhPRkYpOwotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQkJc3RhdHVzID0gdHdsX2kyY193cml0ZV91OChtb2R1bGUsIDB4N2YsCi0JCQkJVFdMNDAzMF9QV014X1BXTXhPTik7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJZ290byBkb25lOwotCi0JCS8qIGluaXQgTEVEIHRvIG5vdC1kcml2ZW4gKGhpZ2gpICovCi0JCW1vZHVsZSA9IFRXTDQwMzBfTU9EVUxFX0xFRDsKLQkJc3RhdHVzID0gdHdsX2kyY19yZWFkX3U4KG1vZHVsZSwgJmNhY2hlZF9sZWRlbiwKLQkJCQlUV0w0MDMwX0xFRF9MRURFTik7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJZ290byBkb25lOwotCQljYWNoZWRfbGVkZW4gJj0gfmxlZGNscl9tYXNrOwotCQlzdGF0dXMgPSB0d2xfaTJjX3dyaXRlX3U4KG1vZHVsZSwgY2FjaGVkX2xlZGVuLAotCQkJCVRXTDQwMzBfTEVEX0xFREVOKTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlnb3RvIGRvbmU7Ci0KLQkJc3RhdHVzID0gMDsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIG9uIGZpcnN0IHVzZSwgdHVybiBHUElPIG1vZHVsZSAib24iICovCi0JaWYgKCFncGlvX3VzYWdlX2NvdW50KSB7Ci0JCXN0cnVjdCB0d2w0MDMwX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0JCXU4IHZhbHVlID0gTUFTS19HUElPX0NUUkxfR1BJT19PTjsKLQotCQkvKiBvcHRpb25hbGx5IGhhdmUgdGhlIGZpcnN0IHR3byBHUElPcyBzd2l0Y2ggdk1NQzEKLQkJICogYW5kIHZNTUMyIHBvd2VyIHN1cHBsaWVzIGJhc2VkIG9uIGNhcmQgcHJlc2VuY2UuCi0JCSAqLwotCQlwZGF0YSA9IGNoaXAtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQkJdmFsdWUgfD0gcGRhdGEtPm1tY19jZCAmIDB4MDM7Ci0KLQkJc3RhdHVzID0gZ3Bpb190d2w0MDMwX3dyaXRlKFJFR19HUElPX0NUUkwsIHZhbHVlKTsKLQl9Ci0KLQlpZiAoIXN0YXR1cykKLQkJZ3Bpb191c2FnZV9jb3VudCB8PSAoMHgxIDw8IG9mZnNldCk7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZncGlvX2xvY2spOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIHR3bF9mcmVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlpZiAob2Zmc2V0ID49IFRXTDQwMzBfR1BJT19NQVgpIHsKLQkJdHdsNDAzMF9sZWRfc2V0X3ZhbHVlKG9mZnNldCAtIFRXTDQwMzBfR1BJT19NQVgsIDEpOwotCQlyZXR1cm47Ci0JfQotCi0JbXV0ZXhfbG9jaygmZ3Bpb19sb2NrKTsKLQotCWdwaW9fdXNhZ2VfY291bnQgJj0gfkJJVChvZmZzZXQpOwotCi0JLyogb24gbGFzdCB1c2UsIHN3aXRjaCBvZmYgR1BJTyBtb2R1bGUgKi8KLQlpZiAoIWdwaW9fdXNhZ2VfY291bnQpCi0JCWdwaW9fdHdsNDAzMF93cml0ZShSRUdfR1BJT19DVFJMLCAweDApOwotCi0JbXV0ZXhfdW5sb2NrKCZncGlvX2xvY2spOwotfQotCi1zdGF0aWMgaW50IHR3bF9kaXJlY3Rpb25faW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiAob2Zmc2V0IDwgVFdMNDAzMF9HUElPX01BWCkKLQkJPyB0d2w0MDMwX3NldF9ncGlvX2RpcmVjdGlvbihvZmZzZXQsIDEpCi0JCTogLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCB0d2xfZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQotCWlmIChvZmZzZXQgPCBUV0w0MDMwX0dQSU9fTUFYKQotCQlzdGF0dXMgPSB0d2w0MDMwX2dldF9ncGlvX2RhdGFpbihvZmZzZXQpOwotCWVsc2UgaWYgKG9mZnNldCA9PSBUV0w0MDMwX0dQSU9fTUFYKQotCQlzdGF0dXMgPSBjYWNoZWRfbGVkZW4gJiBMRURFTl9MRURBT047Ci0JZWxzZQotCQlzdGF0dXMgPSBjYWNoZWRfbGVkZW4gJiBMRURFTl9MRURCT047Ci0JcmV0dXJuIChzdGF0dXMgPCAwKSA/IDAgOiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgdHdsX2RpcmVjdGlvbl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JaWYgKG9mZnNldCA8IFRXTDQwMzBfR1BJT19NQVgpIHsKLQkJdHdsNDAzMF9zZXRfZ3Bpb19kYXRhb3V0KG9mZnNldCwgdmFsdWUpOwotCQlyZXR1cm4gdHdsNDAzMF9zZXRfZ3Bpb19kaXJlY3Rpb24ob2Zmc2V0LCAwKTsKLQl9IGVsc2UgewotCQl0d2w0MDMwX2xlZF9zZXRfdmFsdWUob2Zmc2V0IC0gVFdMNDAzMF9HUElPX01BWCwgdmFsdWUpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHR3bF9zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JaWYgKG9mZnNldCA8IFRXTDQwMzBfR1BJT19NQVgpCi0JCXR3bDQwMzBfc2V0X2dwaW9fZGF0YW91dChvZmZzZXQsIHZhbHVlKTsKLQllbHNlCi0JCXR3bDQwMzBfbGVkX3NldF92YWx1ZShvZmZzZXQgLSBUV0w0MDMwX0dQSU9fTUFYLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgdHdsX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JcmV0dXJuICh0d2w0MDMwX2dwaW9faXJxX2Jhc2UgJiYgKG9mZnNldCA8IFRXTDQwMzBfR1BJT19NQVgpKQotCQk/ICh0d2w0MDMwX2dwaW9faXJxX2Jhc2UgKyBvZmZzZXQpCi0JCTogLUVJTlZBTDsKLX0KLQotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdHdsX2dwaW9jaGlwID0gewotCS5sYWJlbAkJCT0gInR3bDQwMzAiLAotCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JLnJlcXVlc3QJCT0gdHdsX3JlcXVlc3QsCi0JLmZyZWUJCQk9IHR3bF9mcmVlLAotCS5kaXJlY3Rpb25faW5wdXQJPSB0d2xfZGlyZWN0aW9uX2luLAotCS5nZXQJCQk9IHR3bF9nZXQsCi0JLmRpcmVjdGlvbl9vdXRwdXQJPSB0d2xfZGlyZWN0aW9uX291dCwKLQkuc2V0CQkJPSB0d2xfc2V0LAotCS50b19pcnEJCQk9IHR3bF90b19pcnEsCi0JLmNhbl9zbGVlcAkJPSAxLAotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBfX2RldmluaXQgZ3Bpb190d2w0MDMwX3B1bGxzKHUzMiB1cHMsIHUzMiBkb3ducykKLXsKLQl1OAkJbWVzc2FnZVs2XTsKLQl1bnNpZ25lZAlpLCBncGlvX2JpdDsKLQotCS8qIEZvciBtb3N0IHBpbnMsIGEgcHVsbGRvd24gd2FzIGVuYWJsZWQgYnkgZGVmYXVsdC4KLQkgKiBXZSBzaG91bGQgaGF2ZSBkYXRhIHRoYXQncyBzcGVjaWZpYyB0byB0aGlzIGJvYXJkLgotCSAqLwotCWZvciAoZ3Bpb19iaXQgPSAxLCBpID0gMTsgaSA8IDY7IGkrKykgewotCQl1OAkJYml0X21hc2s7Ci0JCXVuc2lnbmVkCWo7Ci0KLQkJZm9yIChiaXRfbWFzayA9IDAsIGogPSAwOyBqIDwgODsgaiArPSAyLCBncGlvX2JpdCA8PD0gMSkgewotCQkJaWYgKHVwcyAmIGdwaW9fYml0KQotCQkJCWJpdF9tYXNrIHw9IDEgPDwgKGogKyAxKTsKLQkJCWVsc2UgaWYgKGRvd25zICYgZ3Bpb19iaXQpCi0JCQkJYml0X21hc2sgfD0gMSA8PCAoaiArIDApOwotCQl9Ci0JCW1lc3NhZ2VbaV0gPSBiaXRfbWFzazsKLQl9Ci0KLQlyZXR1cm4gdHdsX2kyY193cml0ZShUV0w0MDMwX01PRFVMRV9HUElPLCBtZXNzYWdlLAotCQkJCVJFR19HUElPUFVQRENUUjEsIDUpOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvX3R3bDQwMzBfZGVib3VuY2UodTMyIGRlYm91bmNlLCB1OCBtbWNfY2QpCi17Ci0JdTgJCW1lc3NhZ2VbNF07Ci0KLQkvKiAzMCBtc2VjIG9mIGRlYm91bmNpbmcgaXMgYWx3YXlzIHVzZWQgZm9yIE1NQyBjYXJkIGRldGVjdCwKLQkgKiBhbmQgaXMgb3B0aW9uYWwgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KLQkgKi8KLQltZXNzYWdlWzFdID0gKGRlYm91bmNlICYgMHhmZikgfCAobW1jX2NkICYgMHgwMyk7Ci0JZGVib3VuY2UgPj49IDg7Ci0JbWVzc2FnZVsyXSA9IChkZWJvdW5jZSAmIDB4ZmYpOwotCWRlYm91bmNlID4+PSA4OwotCW1lc3NhZ2VbM10gPSAoZGVib3VuY2UgJiAweDAzKTsKLQotCXJldHVybiB0d2xfaTJjX3dyaXRlKFRXTDQwMzBfTU9EVUxFX0dQSU8sIG1lc3NhZ2UsCi0JCQkJUkVHX0dQSU9fREVCRU4xLCAzKTsKLX0KLQotc3RhdGljIGludCBncGlvX3R3bDQwMzBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvX3R3bDQwMzBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgdHdsNDAzMF9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaW50IHJldDsKLQotCS8qIG1heWJlIHNldHVwIElSUXMgKi8KLQlpZiAocGRhdGEtPmlycV9iYXNlKSB7Ci0JCWlmIChpc19tb2R1bGUoKSkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCSJjYW4ndCBkaXNwYXRjaCBJUlFzIGZyb20gbW9kdWxlc1xuIik7Ci0JCQlnb3RvIG5vX2lycXM7Ci0JCX0KLQkJcmV0ID0gdHdsNDAzMF9zaWhfc2V0dXAoVFdMNDAzMF9NT0RVTEVfR1BJTyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJV0FSTl9PTihyZXQgIT0gcGRhdGEtPmlycV9iYXNlKTsKLQkJdHdsNDAzMF9ncGlvX2lycV9iYXNlID0gcmV0OwotCX0KLQotbm9faXJxczoKLQkvKgotCSAqIE5PVEU6ICBib2FyZHMgbWF5IHdhc3RlIHBvd2VyIGlmIHRoZXkgZG9uJ3Qgc2V0IHB1bGx1cHMKLQkgKiBhbmQgcHVsbGRvd25zIGNvcnJlY3RseSAuLi4gZGVmYXVsdCBmb3Igbm9uLVVMUEkgcGlucyBpcwotCSAqIHB1bGxkb3duLCBhbmQgc29tZSBvdGhlciBwaW5zIG1heSBoYXZlIGV4dGVybmFsIHB1bGx1cHMKLQkgKiBvciBwdWxsZG93bnMuICBDYXJlZnVsIQotCSAqLwotCXJldCA9IGdwaW9fdHdsNDAzMF9wdWxscyhwZGF0YS0+cHVsbHVwcywgcGRhdGEtPnB1bGxkb3ducyk7Ci0JaWYgKHJldCkKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAicHVsbHVwcyAlLjA1eCAlLjA1eCAtLT4gJWRcbiIsCi0JCQkJcGRhdGEtPnB1bGx1cHMsIHBkYXRhLT5wdWxsZG93bnMsCi0JCQkJcmV0KTsKLQotCXJldCA9IGdwaW9fdHdsNDAzMF9kZWJvdW5jZShwZGF0YS0+ZGVib3VuY2UsIHBkYXRhLT5tbWNfY2QpOwotCWlmIChyZXQpCi0JCWRldl9kYmcoJnBkZXYtPmRldiwgImRlYm91bmNlICUuMDN4ICUuMDF4IC0tPiAlZFxuIiwKLQkJCQlwZGF0YS0+ZGVib3VuY2UsIHBkYXRhLT5tbWNfY2QsCi0JCQkJcmV0KTsKLQotCXR3bF9ncGlvY2hpcC5iYXNlID0gcGRhdGEtPmdwaW9fYmFzZTsKLQl0d2xfZ3Bpb2NoaXAubmdwaW8gPSBUV0w0MDMwX0dQSU9fTUFYOwotCXR3bF9ncGlvY2hpcC5kZXYgPSAmcGRldi0+ZGV2OwotCi0JLyogTk9URTogd2UgYXNzdW1lIFZJQlJBX0NUTC5WSUJSQV9FTiwgaW4gTU9EVUxFX0FVRElPX1ZPSUNFLAotCSAqIGlzIChzdGlsbCkgY2xlYXIgaWYgdXNlX2xlZHMgaXMgc2V0LgotCSAqLwotCWlmIChwZGF0YS0+dXNlX2xlZHMpCi0JCXR3bF9ncGlvY2hpcC5uZ3BpbyArPSAyOwotCi0JcmV0ID0gZ3Bpb2NoaXBfYWRkKCZ0d2xfZ3Bpb2NoaXApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkiY291bGQgbm90IHJlZ2lzdGVyIGdwaW9jaGlwLCAlZFxuIiwKLQkJCQlyZXQpOwotCQl0d2xfZ3Bpb2NoaXAubmdwaW8gPSAwOwotCQlncGlvX3R3bDQwMzBfcmVtb3ZlKHBkZXYpOwotCX0gZWxzZSBpZiAocGRhdGEtPnNldHVwKSB7Ci0JCWludCBzdGF0dXM7Ci0KLQkJc3RhdHVzID0gcGRhdGEtPnNldHVwKCZwZGV2LT5kZXYsCi0JCQkJcGRhdGEtPmdwaW9fYmFzZSwgVFdMNDAzMF9HUElPX01BWCk7Ci0JCWlmIChzdGF0dXMpCi0JCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJzZXR1cCAtLT4gJWRcbiIsIHN0YXR1cyk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogQ2Fubm90IHVzZSBfX2RldmV4aXQgYXMgZ3Bpb190d2w0MDMwX3Byb2JlKCkgY2FsbHMgdXMgKi8KLXN0YXRpYyBpbnQgZ3Bpb190d2w0MDMwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB0d2w0MDMwX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKHBkYXRhLT50ZWFyZG93bikgewotCQlzdGF0dXMgPSBwZGF0YS0+dGVhcmRvd24oJnBkZXYtPmRldiwKLQkJCQlwZGF0YS0+Z3Bpb19iYXNlLCBUV0w0MDMwX0dQSU9fTUFYKTsKLQkJaWYgKHN0YXR1cykgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAidGVhcmRvd24gLS0+ICVkXG4iLCBzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCX0KLQotCXN0YXR1cyA9IGdwaW9jaGlwX3JlbW92ZSgmdHdsX2dwaW9jaGlwKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCWlmIChpc19tb2R1bGUoKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBSRVZJU0lUIG5vIHN1cHBvcnQgeWV0IGZvciBkZXJlZ2lzdGVyaW5nIGFsbCB0aGUgSVJRcyAqLwotCVdBUk5fT04oMSk7Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLS8qIE5vdGU6ICB0aGlzIGhhcmR3YXJlIGxpdmVzIGluc2lkZSBhbiBJMkMtYmFzZWQgbXVsdGktZnVuY3Rpb24gZGV2aWNlLiAqLwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0d2w0MDMwX2dwaW8iKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb190d2w0MDMwX2RyaXZlciA9IHsKLQkuZHJpdmVyLm5hbWUJPSAidHdsNDAzMF9ncGlvIiwKLQkuZHJpdmVyLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JLnByb2JlCQk9IGdwaW9fdHdsNDAzMF9wcm9iZSwKLQkucmVtb3ZlCQk9IGdwaW9fdHdsNDAzMF9yZW1vdmUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBncGlvX3R3bDQwMzBfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdwaW9fdHdsNDAzMF9kcml2ZXIpOwotfQotc3Vic3lzX2luaXRjYWxsKGdwaW9fdHdsNDAzMF9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGdwaW9fdHdsNDAzMF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdwaW9fdHdsNDAzMF9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoZ3Bpb190d2w0MDMwX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJHUElPIGludGVyZmFjZSBmb3IgVFdMNDAzMCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3ZyNDF4eF9naXUuYyBiL2RyaXZlcnMvZ3Bpby92cjQxeHhfZ2l1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNjViZTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL3ZyNDF4eF9naXUuYworKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi0vKgotICogIERyaXZlciBmb3IgTkVDIFZSNDEwMCBzZXJpZXMgR2VuZXJhbC1wdXJwb3NlIEkvTyBVbml0LgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKglBdXRob3I6IFlvaWNoaSBZdWFzYSA8c291cmNlQG12aXN0YS5jb20+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgIFlvaWNoaSBZdWFzYSA8eXVhc2FAbGludXgtbWlwcy5vcmc+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGFzbS92cjQxeHgvZ2l1Lmg+Ci0jaW5jbHVkZSA8YXNtL3ZyNDF4eC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vdnI0MXh4L3ZyNDF4eC5oPgotCi1NT0RVTEVfQVVUSE9SKCJZb2ljaGkgWXVhc2EgPHl1YXNhQGxpbnV4LW1pcHMub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJORUMgVlI0MTAwIHNlcmllcyBHZW5lcmFsLXB1cnBvc2UgSS9PIFVuaXQgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSNkZWZpbmUgR0lVSU9TRUxMCTB4MDAKLSNkZWZpbmUgR0lVSU9TRUxICTB4MDIKLSNkZWZpbmUgR0lVUElPREwJMHgwNAotI2RlZmluZSBHSVVQSU9ESAkweDA2Ci0jZGVmaW5lIEdJVUlOVFNUQVRMCTB4MDgKLSNkZWZpbmUgR0lVSU5UU1RBVEgJMHgwYQotI2RlZmluZSBHSVVJTlRFTkwJMHgwYwotI2RlZmluZSBHSVVJTlRFTkgJMHgwZQotI2RlZmluZSBHSVVJTlRUWVBMCTB4MTAKLSNkZWZpbmUgR0lVSU5UVFlQSAkweDEyCi0jZGVmaW5lIEdJVUlOVEFMU0VMTAkweDE0Ci0jZGVmaW5lIEdJVUlOVEFMU0VMSAkweDE2Ci0jZGVmaW5lIEdJVUlOVEhUU0VMTAkweDE4Ci0jZGVmaW5lIEdJVUlOVEhUU0VMSAkweDFhCi0jZGVmaW5lIEdJVVBPREFUTAkweDFjCi0jZGVmaW5lIEdJVVBPREFURU4JMHgxYwotI2RlZmluZSBHSVVQT0RBVEgJMHgxZQotICNkZWZpbmUgUElPRU4wCQkweDAxMDAKLSAjZGVmaW5lIFBJT0VOMQkJMHgwMjAwCi0jZGVmaW5lIEdJVVBPREFUCTB4MWUKLSNkZWZpbmUgR0lVRkVER0VJTkhMCTB4MjAKLSNkZWZpbmUgR0lVRkVER0VJTkhICTB4MjIKLSNkZWZpbmUgR0lVUkVER0VJTkhMCTB4MjQKLSNkZWZpbmUgR0lVUkVER0VJTkhICTB4MjYKLQotI2RlZmluZSBHSVVVU0VVUEROCTB4MWUwCi0jZGVmaW5lIEdJVVRFUk1VUEROCTB4MWUyCi0KLSNkZWZpbmUgR1BJT19IQVNfUFVMTFVQRE9XTl9JTwkJMHgwMDAxCi0jZGVmaW5lIEdQSU9fSEFTX09VVFBVVF9FTkFCTEUJCTB4MDAwMgotI2RlZmluZSBHUElPX0hBU19JTlRFUlJVUFRfRURHRV9TRUxFQ1QJMHgwMTAwCi0KLWVudW0gewotCUdQSU9fSU5QVVQsCi0JR1BJT19PVVRQVVQsCi19OwotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdpdV9sb2NrKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdpdV9mbGFnczsKLQotc3RhdGljIHZvaWQgX19pb21lbSAqZ2l1X2Jhc2U7Ci0KLSNkZWZpbmUgZ2l1X3JlYWQob2Zmc2V0KQkJcmVhZHcoZ2l1X2Jhc2UgKyAob2Zmc2V0KSkKLSNkZWZpbmUgZ2l1X3dyaXRlKG9mZnNldCwgdmFsdWUpCXdyaXRldygodmFsdWUpLCBnaXVfYmFzZSArIChvZmZzZXQpKQotCi0jZGVmaW5lIEdQSU9fUElOX09GX0lSUShpcnEpCSgoaXJxKSAtIEdJVV9JUlFfQkFTRSkKLSNkZWZpbmUgR0lVSU5UX0hJR0hfT0ZGU0VUCTE2Ci0jZGVmaW5lIEdJVUlOVF9ISUdIX01BWAkJMzIKLQotc3RhdGljIGlubGluZSB1MTYgZ2l1X3NldCh1MTYgb2Zmc2V0LCB1MTYgc2V0KQotewotCXUxNiBkYXRhOwotCi0JZGF0YSA9IGdpdV9yZWFkKG9mZnNldCk7Ci0JZGF0YSB8PSBzZXQ7Ci0JZ2l1X3dyaXRlKG9mZnNldCwgZGF0YSk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIGlubGluZSB1MTYgZ2l1X2NsZWFyKHUxNiBvZmZzZXQsIHUxNiBjbGVhcikKLXsKLQl1MTYgZGF0YTsKLQotCWRhdGEgPSBnaXVfcmVhZChvZmZzZXQpOwotCWRhdGEgJj0gfmNsZWFyOwotCWdpdV93cml0ZShvZmZzZXQsIGRhdGEpOwotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFja19naXVpbnRfbG93KHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlnaXVfd3JpdGUoR0lVSU5UU1RBVEwsIDEgPDwgR1BJT19QSU5fT0ZfSVJRKGQtPmlycSkpOwotfQotCi1zdGF0aWMgdm9pZCBtYXNrX2dpdWludF9sb3coc3RydWN0IGlycV9kYXRhICpkKQotewotCWdpdV9jbGVhcihHSVVJTlRFTkwsIDEgPDwgR1BJT19QSU5fT0ZfSVJRKGQtPmlycSkpOwotfQotCi1zdGF0aWMgdm9pZCBtYXNrX2Fja19naXVpbnRfbG93KHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQl1bnNpZ25lZCBpbnQgcGluOwotCi0JcGluID0gR1BJT19QSU5fT0ZfSVJRKGQtPmlycSk7Ci0JZ2l1X2NsZWFyKEdJVUlOVEVOTCwgMSA8PCBwaW4pOwotCWdpdV93cml0ZShHSVVJTlRTVEFUTCwgMSA8PCBwaW4pOwotfQotCi1zdGF0aWMgdm9pZCB1bm1hc2tfZ2l1aW50X2xvdyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JZ2l1X3NldChHSVVJTlRFTkwsIDEgPDwgR1BJT19QSU5fT0ZfSVJRKGQtPmlycSkpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGdpdWludF9sb3dfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIkdJVUlOVEwiLAotCS5pcnFfYWNrCT0gYWNrX2dpdWludF9sb3csCi0JLmlycV9tYXNrCT0gbWFza19naXVpbnRfbG93LAotCS5pcnFfbWFza19hY2sJPSBtYXNrX2Fja19naXVpbnRfbG93LAotCS5pcnFfdW5tYXNrCT0gdW5tYXNrX2dpdWludF9sb3csCi19OwotCi1zdGF0aWMgdm9pZCBhY2tfZ2l1aW50X2hpZ2goc3RydWN0IGlycV9kYXRhICpkKQotewotCWdpdV93cml0ZShHSVVJTlRTVEFUSCwKLQkJICAxIDw8IChHUElPX1BJTl9PRl9JUlEoZC0+aXJxKSAtIEdJVUlOVF9ISUdIX09GRlNFVCkpOwotfQotCi1zdGF0aWMgdm9pZCBtYXNrX2dpdWludF9oaWdoKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlnaXVfY2xlYXIoR0lVSU5URU5ILCAxIDw8IChHUElPX1BJTl9PRl9JUlEoZC0+aXJxKSAtIEdJVUlOVF9ISUdIX09GRlNFVCkpOwotfQotCi1zdGF0aWMgdm9pZCBtYXNrX2Fja19naXVpbnRfaGlnaChzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JdW5zaWduZWQgaW50IHBpbjsKLQotCXBpbiA9IEdQSU9fUElOX09GX0lSUShkLT5pcnEpIC0gR0lVSU5UX0hJR0hfT0ZGU0VUOwotCWdpdV9jbGVhcihHSVVJTlRFTkgsIDEgPDwgcGluKTsKLQlnaXVfd3JpdGUoR0lVSU5UU1RBVEgsIDEgPDwgcGluKTsKLX0KLQotc3RhdGljIHZvaWQgdW5tYXNrX2dpdWludF9oaWdoKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlnaXVfc2V0KEdJVUlOVEVOSCwgMSA8PCAoR1BJT19QSU5fT0ZfSVJRKGQtPmlycSkgLSBHSVVJTlRfSElHSF9PRkZTRVQpKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBnaXVpbnRfaGlnaF9pcnFfY2hpcCA9IHsKLQkubmFtZQkJPSAiR0lVSU5USCIsCi0JLmlycV9hY2sJPSBhY2tfZ2l1aW50X2hpZ2gsCi0JLmlycV9tYXNrCT0gbWFza19naXVpbnRfaGlnaCwKLQkuaXJxX21hc2tfYWNrCT0gbWFza19hY2tfZ2l1aW50X2hpZ2gsCi0JLmlycV91bm1hc2sJPSB1bm1hc2tfZ2l1aW50X2hpZ2gsCi19OwotCi1zdGF0aWMgaW50IGdpdV9nZXRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdTE2IHBlbmRsLCBwZW5kaCwgbWFza2wsIG1hc2toOwotCWludCBpOwotCi0JcGVuZGwgPSBnaXVfcmVhZChHSVVJTlRTVEFUTCk7Ci0JcGVuZGggPSBnaXVfcmVhZChHSVVJTlRTVEFUSCk7Ci0JbWFza2wgPSBnaXVfcmVhZChHSVVJTlRFTkwpOwotCW1hc2toID0gZ2l1X3JlYWQoR0lVSU5URU5IKTsKLQotCW1hc2tsICY9IHBlbmRsOwotCW1hc2toICY9IHBlbmRoOwotCi0JaWYgKG1hc2tsKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCQlpZiAobWFza2wgJiAoMSA8PCBpKSkKLQkJCQlyZXR1cm4gR0lVX0lSUShpKTsKLQkJfQotCX0gZWxzZSBpZiAobWFza2gpIHsKLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJCWlmIChtYXNraCAmICgxIDw8IGkpKQotCQkJCXJldHVybiBHSVVfSVJRKGkgKyBHSVVJTlRfSElHSF9PRkZTRVQpOwotCQl9Ci0JfQotCi0JcHJpbnRrKEtFUk5fRVJSICJzcHVyaW91cyBHSVUgaW50ZXJydXB0OiAlMDR4KCUwNHgpLCUwNHgoJTA0eClcbiIsCi0JICAgICAgIG1hc2tsLCBwZW5kbCwgbWFza2gsIHBlbmRoKTsKLQotCWF0b21pY19pbmMoJmlycV9lcnJfY291bnQpOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXZvaWQgdnI0MXh4X3NldF9pcnFfdHJpZ2dlcih1bnNpZ25lZCBpbnQgcGluLCBpcnFfdHJpZ2dlcl90IHRyaWdnZXIsCi0JCQkgICAgaXJxX3NpZ25hbF90IHNpZ25hbCkKLXsKLQl1MTYgbWFzazsKLQotCWlmIChwaW4gPCBHSVVJTlRfSElHSF9PRkZTRVQpIHsKLQkJbWFzayA9IDEgPDwgcGluOwotCQlpZiAodHJpZ2dlciAhPSBJUlFfVFJJR0dFUl9MRVZFTCkgewotCQkJZ2l1X3NldChHSVVJTlRUWVBMLCBtYXNrKTsKLQkJCWlmIChzaWduYWwgPT0gSVJRX1NJR05BTF9IT0xEKQotCQkJCWdpdV9zZXQoR0lVSU5USFRTRUxMLCBtYXNrKTsKLQkJCWVsc2UKLQkJCQlnaXVfY2xlYXIoR0lVSU5USFRTRUxMLCBtYXNrKTsKLQkJCWlmIChnaXVfZmxhZ3MgJiBHUElPX0hBU19JTlRFUlJVUFRfRURHRV9TRUxFQ1QpIHsKLQkJCQlzd2l0Y2ggKHRyaWdnZXIpIHsKLQkJCQljYXNlIElSUV9UUklHR0VSX0VER0VfRkFMTElORzoKLQkJCQkJZ2l1X3NldChHSVVGRURHRUlOSEwsIG1hc2spOwotCQkJCQlnaXVfY2xlYXIoR0lVUkVER0VJTkhMLCBtYXNrKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUlFfVFJJR0dFUl9FREdFX1JJU0lORzoKLQkJCQkJZ2l1X2NsZWFyKEdJVUZFREdFSU5ITCwgbWFzayk7Ci0JCQkJCWdpdV9zZXQoR0lVUkVER0VJTkhMLCBtYXNrKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJZ2l1X3NldChHSVVGRURHRUlOSEwsIG1hc2spOwotCQkJCQlnaXVfc2V0KEdJVVJFREdFSU5ITCwgbWFzayk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihHSVVfSVJRKHBpbiksCi0JCQkJCQkgJmdpdWludF9sb3dfaXJxX2NoaXAsCi0JCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKLQkJfSBlbHNlIHsKLQkJCWdpdV9jbGVhcihHSVVJTlRUWVBMLCBtYXNrKTsKLQkJCWdpdV9jbGVhcihHSVVJTlRIVFNFTEwsIG1hc2spOwotCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKEdJVV9JUlEocGluKSwKLQkJCQkJCSAmZ2l1aW50X2xvd19pcnFfY2hpcCwKLQkJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKLQkJfQotCQlnaXVfd3JpdGUoR0lVSU5UU1RBVEwsIG1hc2spOwotCX0gZWxzZSBpZiAocGluIDwgR0lVSU5UX0hJR0hfTUFYKSB7Ci0JCW1hc2sgPSAxIDw8IChwaW4gLSBHSVVJTlRfSElHSF9PRkZTRVQpOwotCQlpZiAodHJpZ2dlciAhPSBJUlFfVFJJR0dFUl9MRVZFTCkgewotCQkJZ2l1X3NldChHSVVJTlRUWVBILCBtYXNrKTsKLQkJCWlmIChzaWduYWwgPT0gSVJRX1NJR05BTF9IT0xEKQotCQkJCWdpdV9zZXQoR0lVSU5USFRTRUxILCBtYXNrKTsKLQkJCWVsc2UKLQkJCQlnaXVfY2xlYXIoR0lVSU5USFRTRUxILCBtYXNrKTsKLQkJCWlmIChnaXVfZmxhZ3MgJiBHUElPX0hBU19JTlRFUlJVUFRfRURHRV9TRUxFQ1QpIHsKLQkJCQlzd2l0Y2ggKHRyaWdnZXIpIHsKLQkJCQljYXNlIElSUV9UUklHR0VSX0VER0VfRkFMTElORzoKLQkJCQkJZ2l1X3NldChHSVVGRURHRUlOSEgsIG1hc2spOwotCQkJCQlnaXVfY2xlYXIoR0lVUkVER0VJTkhILCBtYXNrKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUlFfVFJJR0dFUl9FREdFX1JJU0lORzoKLQkJCQkJZ2l1X2NsZWFyKEdJVUZFREdFSU5ISCwgbWFzayk7Ci0JCQkJCWdpdV9zZXQoR0lVUkVER0VJTkhILCBtYXNrKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJZ2l1X3NldChHSVVGRURHRUlOSEgsIG1hc2spOwotCQkJCQlnaXVfc2V0KEdJVVJFREdFSU5ISCwgbWFzayk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihHSVVfSVJRKHBpbiksCi0JCQkJCQkgJmdpdWludF9oaWdoX2lycV9jaGlwLAotCQkJCQkJIGhhbmRsZV9lZGdlX2lycSk7Ci0JCX0gZWxzZSB7Ci0JCQlnaXVfY2xlYXIoR0lVSU5UVFlQSCwgbWFzayk7Ci0JCQlnaXVfY2xlYXIoR0lVSU5USFRTRUxILCBtYXNrKTsKLQkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihHSVVfSVJRKHBpbiksCi0JCQkJCQkgJmdpdWludF9oaWdoX2lycV9jaGlwLAotCQkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwotCQl9Ci0JCWdpdV93cml0ZShHSVVJTlRTVEFUSCwgbWFzayk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTF9HUEwodnI0MXh4X3NldF9pcnFfdHJpZ2dlcik7Ci0KLXZvaWQgdnI0MXh4X3NldF9pcnFfbGV2ZWwodW5zaWduZWQgaW50IHBpbiwgaXJxX2xldmVsX3QgbGV2ZWwpCi17Ci0JdTE2IG1hc2s7Ci0KLQlpZiAocGluIDwgR0lVSU5UX0hJR0hfT0ZGU0VUKSB7Ci0JCW1hc2sgPSAxIDw8IHBpbjsKLQkJaWYgKGxldmVsID09IElSUV9MRVZFTF9ISUdIKQotCQkJZ2l1X3NldChHSVVJTlRBTFNFTEwsIG1hc2spOwotCQllbHNlCi0JCQlnaXVfY2xlYXIoR0lVSU5UQUxTRUxMLCBtYXNrKTsKLQkJZ2l1X3dyaXRlKEdJVUlOVFNUQVRMLCBtYXNrKTsKLQl9IGVsc2UgaWYgKHBpbiA8IEdJVUlOVF9ISUdIX01BWCkgewotCQltYXNrID0gMSA8PCAocGluIC0gR0lVSU5UX0hJR0hfT0ZGU0VUKTsKLQkJaWYgKGxldmVsID09IElSUV9MRVZFTF9ISUdIKQotCQkJZ2l1X3NldChHSVVJTlRBTFNFTEgsIG1hc2spOwotCQllbHNlCi0JCQlnaXVfY2xlYXIoR0lVSU5UQUxTRUxILCBtYXNrKTsKLQkJZ2l1X3dyaXRlKEdJVUlOVFNUQVRILCBtYXNrKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2cjQxeHhfc2V0X2lycV9sZXZlbCk7Ci0KLXN0YXRpYyBpbnQgZ2l1X3NldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluLCBpbnQgZGlyKQotewotCXUxNiBvZmZzZXQsIG1hc2ssIHJlZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHBpbiA+PSBjaGlwLT5uZ3BpbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAocGluIDwgMTYpIHsKLQkJb2Zmc2V0ID0gR0lVSU9TRUxMOwotCQltYXNrID0gMSA8PCBwaW47Ci0JfSBlbHNlIGlmIChwaW4gPCAzMikgewotCQlvZmZzZXQgPSBHSVVJT1NFTEg7Ci0JCW1hc2sgPSAxIDw8IChwaW4gLSAxNik7Ci0JfSBlbHNlIHsKLQkJaWYgKGdpdV9mbGFncyAmIEdQSU9fSEFTX09VVFBVVF9FTkFCTEUpIHsKLQkJCW9mZnNldCA9IEdJVVBPREFURU47Ci0JCQltYXNrID0gMSA8PCAocGluIC0gMzIpOwotCQl9IGVsc2UgewotCQkJc3dpdGNoIChwaW4pIHsKLQkJCWNhc2UgNDg6Ci0JCQkJb2Zmc2V0ID0gR0lVUE9EQVRIOwotCQkJCW1hc2sgPSBQSU9FTjA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ5OgotCQkJCW9mZnNldCA9IEdJVVBPREFUSDsKLQkJCQltYXNrID0gUElPRU4xOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZnaXVfbG9jaywgZmxhZ3MpOwotCi0JcmVnID0gZ2l1X3JlYWQob2Zmc2V0KTsKLQlpZiAoZGlyID09IEdQSU9fT1VUUFVUKQotCQlyZWcgfD0gbWFzazsKLQllbHNlCi0JCXJlZyAmPSB+bWFzazsKLQlnaXVfd3JpdGUob2Zmc2V0LCByZWcpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2l1X2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgdnI0MXh4X2dwaW9fcHVsbHVwZG93bih1bnNpZ25lZCBpbnQgcGluLCBncGlvX3B1bGxfdCBwdWxsKQotewotCXUxNiByZWcsIG1hc2s7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgoZ2l1X2ZsYWdzICYgR1BJT19IQVNfUFVMTFVQRE9XTl9JTykgIT0gR1BJT19IQVNfUFVMTFVQRE9XTl9JTykKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChwaW4gPj0gMTUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWFzayA9IDEgPDwgcGluOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdpdV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAocHVsbCA9PSBHUElPX1BVTExfVVAgfHwgcHVsbCA9PSBHUElPX1BVTExfRE9XTikgewotCQlyZWcgPSBnaXVfcmVhZChHSVVURVJNVVBETik7Ci0JCWlmIChwdWxsID09IEdQSU9fUFVMTF9VUCkKLQkJCXJlZyB8PSBtYXNrOwotCQllbHNlCi0JCQlyZWcgJj0gfm1hc2s7Ci0JCWdpdV93cml0ZShHSVVURVJNVVBETiwgcmVnKTsKLQotCQlyZWcgPSBnaXVfcmVhZChHSVVVU0VVUEROKTsKLQkJcmVnIHw9IG1hc2s7Ci0JCWdpdV93cml0ZShHSVVVU0VVUEROLCByZWcpOwotCX0gZWxzZSB7Ci0JCXJlZyA9IGdpdV9yZWFkKEdJVVVTRVVQRE4pOwotCQlyZWcgJj0gfm1hc2s7Ci0JCWdpdV93cml0ZShHSVVVU0VVUEROLCByZWcpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdpdV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZyNDF4eF9ncGlvX3B1bGx1cGRvd24pOwotCi1zdGF0aWMgaW50IHZyNDF4eF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4pCi17Ci0JdTE2IHJlZywgbWFzazsKLQotCWlmIChwaW4gPj0gY2hpcC0+bmdwaW8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHBpbiA8IDE2KSB7Ci0JCXJlZyA9IGdpdV9yZWFkKEdJVVBJT0RMKTsKLQkJbWFzayA9IDEgPDwgcGluOwotCX0gZWxzZSBpZiAocGluIDwgMzIpIHsKLQkJcmVnID0gZ2l1X3JlYWQoR0lVUElPREgpOwotCQltYXNrID0gMSA8PCAocGluIC0gMTYpOwotCX0gZWxzZSBpZiAocGluIDwgNDgpIHsKLQkJcmVnID0gZ2l1X3JlYWQoR0lVUE9EQVRMKTsKLQkJbWFzayA9IDEgPDwgKHBpbiAtIDMyKTsKLQl9IGVsc2UgewotCQlyZWcgPSBnaXVfcmVhZChHSVVQT0RBVEgpOwotCQltYXNrID0gMSA8PCAocGluIC0gNDgpOwotCX0KLQotCWlmIChyZWcgJiBtYXNrKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB2cjQxeHhfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluLAotCQkJICAgIGludCB2YWx1ZSkKLXsKLQl1MTYgb2Zmc2V0LCBtYXNrLCByZWc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChwaW4gPj0gY2hpcC0+bmdwaW8pCi0JCXJldHVybjsKLQotCWlmIChwaW4gPCAxNikgewotCQlvZmZzZXQgPSBHSVVQSU9ETDsKLQkJbWFzayA9IDEgPDwgcGluOwotCX0gZWxzZSBpZiAocGluIDwgMzIpIHsKLQkJb2Zmc2V0ID0gR0lVUElPREg7Ci0JCW1hc2sgPSAxIDw8IChwaW4gLSAxNik7Ci0JfSBlbHNlIGlmIChwaW4gPCA0OCkgewotCQlvZmZzZXQgPSBHSVVQT0RBVEw7Ci0JCW1hc2sgPSAxIDw8IChwaW4gLSAzMik7Ci0JfSBlbHNlIHsKLQkJb2Zmc2V0ID0gR0lVUE9EQVRIOwotCQltYXNrID0gMSA8PCAocGluIC0gNDgpOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZnaXVfbG9jaywgZmxhZ3MpOwotCi0JcmVnID0gZ2l1X3JlYWQob2Zmc2V0KTsKLQlpZiAodmFsdWUpCi0JCXJlZyB8PSBtYXNrOwotCWVsc2UKLQkJcmVnICY9IH5tYXNrOwotCWdpdV93cml0ZShvZmZzZXQsIHJlZyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnaXVfbG9jaywgZmxhZ3MpOwotfQotCi0KLXN0YXRpYyBpbnQgdnI0MXh4X2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlyZXR1cm4gZ2l1X3NldF9kaXJlY3Rpb24oY2hpcCwgb2Zmc2V0LCBHUElPX0lOUFVUKTsKLX0KLQotc3RhdGljIGludCB2cjQxeHhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKLQkJCQlpbnQgdmFsdWUpCi17Ci0JdnI0MXh4X2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOwotCi0JcmV0dXJuIGdpdV9zZXRfZGlyZWN0aW9uKGNoaXAsIG9mZnNldCwgR1BJT19PVVRQVVQpOwotfQotCi1zdGF0aWMgaW50IHZyNDF4eF9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JaWYgKG9mZnNldCA+PSBjaGlwLT5uZ3BpbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gR0lVX0lSUV9CQVNFICsgb2Zmc2V0OwotfQotCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB2cjQxeHhfZ3Bpb19jaGlwID0gewotCS5sYWJlbAkJCT0gInZyNDF4eCIsCi0JLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkuZGlyZWN0aW9uX2lucHV0CT0gdnI0MXh4X2dwaW9fZGlyZWN0aW9uX2lucHV0LAotCS5nZXQJCQk9IHZyNDF4eF9ncGlvX2dldCwKLQkuZGlyZWN0aW9uX291dHB1dAk9IHZyNDF4eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCi0JLnNldAkJCT0gdnI0MXh4X2dwaW9fc2V0LAotCS50b19pcnEJCQk9IHZyNDF4eF9ncGlvX3RvX2lycSwKLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGdpdV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXVuc2lnbmVkIGludCB0cmlnZ2VyLCBpLCBwaW47Ci0Jc3RydWN0IGlycV9jaGlwICpjaGlwOwotCWludCBpcnEsIHJldHZhbDsKLQotCXN3aXRjaCAocGRldi0+aWQpIHsKLQljYXNlIEdQSU9fNTBQSU5TX1BVTExVUERPV046Ci0JCWdpdV9mbGFncyA9IEdQSU9fSEFTX1BVTExVUERPV05fSU87Ci0JCXZyNDF4eF9ncGlvX2NoaXAubmdwaW8gPSA1MDsKLQkJYnJlYWs7Ci0JY2FzZSBHUElPXzM2UElOUzoKLQkJdnI0MXh4X2dwaW9fY2hpcC5uZ3BpbyA9IDM2OwotCQlicmVhazsKLQljYXNlIEdQSU9fNDhQSU5TX0VER0VfU0VMRUNUOgotCQlnaXVfZmxhZ3MgPSBHUElPX0hBU19JTlRFUlJVUFRfRURHRV9TRUxFQ1Q7Ci0JCXZyNDF4eF9ncGlvX2NoaXAubmdwaW8gPSA0ODsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiR0lVOiB1bmtub3duIElEICVkXG4iLCBwZGV2LT5pZCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZXMpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlnaXVfYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7Ci0JaWYgKCFnaXVfYmFzZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl2cjQxeHhfZ3Bpb19jaGlwLmRldiA9ICZwZGV2LT5kZXY7Ci0KLQlyZXR2YWwgPSBncGlvY2hpcF9hZGQoJnZyNDF4eF9ncGlvX2NoaXApOwotCi0JZ2l1X3dyaXRlKEdJVUlOVEVOTCwgMCk7Ci0JZ2l1X3dyaXRlKEdJVUlOVEVOSCwgMCk7Ci0KLQl0cmlnZ2VyID0gZ2l1X3JlYWQoR0lVSU5UVFlQSCkgPDwgMTY7Ci0JdHJpZ2dlciB8PSBnaXVfcmVhZChHSVVJTlRUWVBMKTsKLQlmb3IgKGkgPSBHSVVfSVJRX0JBU0U7IGkgPD0gR0lVX0lSUV9MQVNUOyBpKyspIHsKLQkJcGluID0gR1BJT19QSU5fT0ZfSVJRKGkpOwotCQlpZiAocGluIDwgR0lVSU5UX0hJR0hfT0ZGU0VUKQotCQkJY2hpcCA9ICZnaXVpbnRfbG93X2lycV9jaGlwOwotCQllbHNlCi0JCQljaGlwID0gJmdpdWludF9oaWdoX2lycV9jaGlwOwotCi0JCWlmICh0cmlnZ2VyICYgKDEgPDwgcGluKSkKLQkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpLCBjaGlwLCBoYW5kbGVfZWRnZV9pcnEpOwotCQllbHNlCi0JCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgY2hpcCwgaGFuZGxlX2xldmVsX2lycSk7Ci0KLQl9Ci0KLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChpcnEgPCAwIHx8IGlycSA+PSBucl9pcnFzKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JcmV0dXJuIGNhc2NhZGVfaXJxKGlycSwgZ2l1X2dldF9pcnEpOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBnaXVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaWYgKGdpdV9iYXNlKSB7Ci0JCWlvdW5tYXAoZ2l1X2Jhc2UpOwotCQlnaXVfYmFzZSA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdpdV9kZXZpY2VfZHJpdmVyID0gewotCS5wcm9iZQkJPSBnaXVfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChnaXVfcmVtb3ZlKSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAiR0lVIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHZyNDF4eF9naXVfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdpdV9kZXZpY2VfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHZyNDF4eF9naXVfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZnaXVfZGV2aWNlX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHZyNDF4eF9naXVfaW5pdCk7Ci1tb2R1bGVfZXhpdCh2cjQxeHhfZ2l1X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3dtODMxeC1ncGlvLmMgYi9kcml2ZXJzL2dwaW8vd204MzF4LWdwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5NjQ0Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwaW8vd204MzF4LWdwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKgotICogd204MzF4LWdwaW8uYyAgLS0gIGdwaW9saWIgc3VwcG9ydCBmb3IgV29sZnNvbiBXTTgzMXggUE1JQ3MKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgotICoKLSAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvcGRhdGEuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2lycS5oPgotCi1zdHJ1Y3Qgd204MzF4X2dwaW8gewotCXN0cnVjdCB3bTgzMXggKndtODMxeDsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHdtODMxeF9ncGlvICp0b193bTgzMXhfZ3BpbyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKQotewotCXJldHVybiBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHdtODMxeF9ncGlvLCBncGlvX2NoaXApOwotfQotCi1zdGF0aWMgaW50IHdtODMxeF9ncGlvX2RpcmVjdGlvbl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IHdtODMxeF9ncGlvICp3bTgzMXhfZ3BpbyA9IHRvX3dtODMxeF9ncGlvKGNoaXApOwotCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IHdtODMxeF9ncGlvLT53bTgzMXg7Ci0JaW50IHZhbCA9IFdNODMxWF9HUE5fRElSOwotCi0JaWYgKHdtODMxeC0+aGFzX2dwaW9fZW5hKQotCQl2YWwgfD0gV004MzFYX0dQTl9UUkk7Ci0KLQlyZXR1cm4gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0dQSU8xX0NPTlRST0wgKyBvZmZzZXQsCi0JCQkgICAgICAgV004MzFYX0dQTl9ESVIgfCBXTTgzMVhfR1BOX1RSSSB8Ci0JCQkgICAgICAgV004MzFYX0dQTl9GTl9NQVNLLCB2YWwpOwotfQotCi1zdGF0aWMgaW50IHdtODMxeF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IHdtODMxeF9ncGlvICp3bTgzMXhfZ3BpbyA9IHRvX3dtODMxeF9ncGlvKGNoaXApOwotCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IHdtODMxeF9ncGlvLT53bTgzMXg7Ci0JaW50IHJldDsKLQotCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9HUElPX0xFVkVMKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChyZXQgJiAxIDw8IG9mZnNldCkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd204MzF4X2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCB3bTgzMXhfZ3BpbyAqd204MzF4X2dwaW8gPSB0b193bTgzMXhfZ3BpbyhjaGlwKTsKLQlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfZ3Bpby0+d204MzF4OwotCi0Jd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0dQSU9fTEVWRUwsIDEgPDwgb2Zmc2V0LAotCQkJdmFsdWUgPDwgb2Zmc2V0KTsKLX0KLQotc3RhdGljIGludCB3bTgzMXhfZ3Bpb19kaXJlY3Rpb25fb3V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgICB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3Qgd204MzF4X2dwaW8gKndtODMxeF9ncGlvID0gdG9fd204MzF4X2dwaW8oY2hpcCk7Ci0Jc3RydWN0IHdtODMxeCAqd204MzF4ID0gd204MzF4X2dwaW8tPndtODMxeDsKLQlpbnQgdmFsID0gMDsKLQlpbnQgcmV0OwotCi0JaWYgKHdtODMxeC0+aGFzX2dwaW9fZW5hKQotCQl2YWwgfD0gV004MzFYX0dQTl9UUkk7Ci0KLQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfR1BJTzFfQ09OVFJPTCArIG9mZnNldCwKLQkJCSAgICAgIFdNODMxWF9HUE5fRElSIHwgV004MzFYX0dQTl9UUkkgfAotCQkJICAgICAgV004MzFYX0dQTl9GTl9NQVNLLCB2YWwpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogQ2FuIG9ubHkgc2V0IEdQSU8gc3RhdGUgb25jZSBpdCdzIGluIG91dHB1dCBtb2RlICovCi0Jd204MzF4X2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd204MzF4X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3Qgd204MzF4X2dwaW8gKndtODMxeF9ncGlvID0gdG9fd204MzF4X2dwaW8oY2hpcCk7Ci0Jc3RydWN0IHdtODMxeCAqd204MzF4ID0gd204MzF4X2dwaW8tPndtODMxeDsKLQotCWlmICghd204MzF4LT5pcnFfYmFzZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gd204MzF4LT5pcnFfYmFzZSArIFdNODMxWF9JUlFfR1BJT18xICsgb2Zmc2V0OwotfQotCi1zdGF0aWMgaW50IHdtODMxeF9ncGlvX3NldF9kZWJvdW5jZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCi0JCQkJICAgIHVuc2lnbmVkIGRlYm91bmNlKQotewotCXN0cnVjdCB3bTgzMXhfZ3BpbyAqd204MzF4X2dwaW8gPSB0b193bTgzMXhfZ3BpbyhjaGlwKTsKLQlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfZ3Bpby0+d204MzF4OwotCWludCByZWcgPSBXTTgzMVhfR1BJTzFfQ09OVFJPTCArIG9mZnNldDsKLQlpbnQgcmV0LCBmbjsKLQotCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIHJlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlzd2l0Y2ggKHJldCAmIFdNODMxWF9HUE5fRk5fTUFTSykgewotCWNhc2UgMDoKLQljYXNlIDE6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIE5vdCBpbiBHUElPIG1vZGUgKi8KLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAoZGVib3VuY2UgPj0gMzIgJiYgZGVib3VuY2UgPD0gNjQpCi0JCWZuID0gMDsKLQllbHNlIGlmIChkZWJvdW5jZSA+PSA0MDAwICYmIGRlYm91bmNlIDw9IDgwMDApCi0JCWZuID0gMTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIHJlZywgV004MzFYX0dQTl9GTl9NQVNLLCBmbik7Ci19Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyB2b2lkIHdtODMxeF9ncGlvX2RiZ19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkKLXsKLQlzdHJ1Y3Qgd204MzF4X2dwaW8gKndtODMxeF9ncGlvID0gdG9fd204MzF4X2dwaW8oY2hpcCk7Ci0Jc3RydWN0IHdtODMxeCAqd204MzF4ID0gd204MzF4X2dwaW8tPndtODMxeDsKLQlpbnQgaSwgdHJpc3RhdGVkOwotCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPm5ncGlvOyBpKyspIHsKLQkJaW50IGdwaW8gPSBpICsgY2hpcC0+YmFzZTsKLQkJaW50IHJlZzsKLQkJY29uc3QgY2hhciAqbGFiZWwsICpwdWxsLCAqcG93ZXJkb21haW47Ci0KLQkJLyogV2UgcmVwb3J0IHRoZSBHUElPIGV2ZW4gaWYgaXQncyBub3QgcmVxdWVzdGVkIHNpbmNlCi0JCSAqIHdlJ3JlIGFsc28gcmVwb3J0aW5nIHRoaW5ncyBsaWtlIGFsdGVybmF0ZQotCQkgKiBmdW5jdGlvbnMgd2hpY2ggYXBwbHkgZXZlbiB3aGVuIHRoZSBHUElPIGlzIG5vdCBpbgotCQkgKiB1c2UgYXMgYSBHUElPLgotCQkgKi8KLQkJbGFiZWwgPSBncGlvY2hpcF9pc19yZXF1ZXN0ZWQoY2hpcCwgaSk7Ci0JCWlmICghbGFiZWwpCi0JCQlsYWJlbCA9ICJVbnJlcXVlc3RlZCI7Ci0KLQkJc2VxX3ByaW50ZihzLCAiIGdwaW8tJS0zZCAoJS0yMC4yMHMpICIsIGdwaW8sIGxhYmVsKTsKLQotCQlyZWcgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfR1BJTzFfQ09OVFJPTCArIGkpOwotCQlpZiAocmVnIDwgMCkgewotCQkJZGV2X2Vycih3bTgzMXgtPmRldiwKLQkJCQkiR1BJTyBjb250cm9sICVkIHJlYWQgZmFpbGVkOiAlZFxuIiwKLQkJCQlncGlvLCByZWcpOwotCQkJc2VxX3ByaW50ZihzLCAiXG4iKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc3dpdGNoIChyZWcgJiBXTTgzMVhfR1BOX1BVTExfTUFTSykgewotCQljYXNlIFdNODMxWF9HUElPX1BVTExfTk9ORToKLQkJCXB1bGwgPSAibm9wdWxsIjsKLQkJCWJyZWFrOwotCQljYXNlIFdNODMxWF9HUElPX1BVTExfRE9XTjoKLQkJCXB1bGwgPSAicHVsbGRvd24iOwotCQkJYnJlYWs7Ci0JCWNhc2UgV004MzFYX0dQSU9fUFVMTF9VUDoKLQkJCXB1bGwgPSAicHVsbHVwIjsKLQkJZGVmYXVsdDoKLQkJCXB1bGwgPSAiSU5WQUxJRCBQVUxMIjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoIChpICsgMSkgewotCQljYXNlIDEgLi4uIDM6Ci0JCWNhc2UgNyAuLi4gOToKLQkJCWlmIChyZWcgJiBXTTgzMVhfR1BOX1BXUl9ET00pCi0JCQkJcG93ZXJkb21haW4gPSAiVlBNSUMiOwotCQkJZWxzZQotCQkJCXBvd2VyZG9tYWluID0gIkRCVkREIjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgNCAuLi4gNjoKLQkJY2FzZSAxMCAuLi4gMTI6Ci0JCQlpZiAocmVnICYgV004MzFYX0dQTl9QV1JfRE9NKQotCQkJCXBvd2VyZG9tYWluID0gIlNZU1ZERCI7Ci0JCQllbHNlCi0JCQkJcG93ZXJkb21haW4gPSAiREJWREQiOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAxMyAuLi4gMTY6Ci0JCQlwb3dlcmRvbWFpbiA9ICJUUFZERCI7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJQlVHKCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXRyaXN0YXRlZCA9IHJlZyAmIFdNODMxWF9HUE5fVFJJOwotCQlpZiAod204MzF4LT5oYXNfZ3Bpb19lbmEpCi0JCQl0cmlzdGF0ZWQgPSAhdHJpc3RhdGVkOwotCi0JCXNlcV9wcmludGYocywgIiAlcyAlcyAlcyAlcyVzXG4iCi0JCQkgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzJXMgKDB4JTR4KVxuIiwKLQkJCSAgIHJlZyAmIFdNODMxWF9HUE5fRElSID8gImluIiA6ICJvdXQiLAotCQkJICAgd204MzF4X2dwaW9fZ2V0KGNoaXAsIGkpID8gImhpZ2giIDogImxvdyIsCi0JCQkgICBwdWxsLAotCQkJICAgcG93ZXJkb21haW4sCi0JCQkgICByZWcgJiBXTTgzMVhfR1BOX1BPTCA/ICIiIDogIiBpbnZlcnRlZCIsCi0JCQkgICByZWcgJiBXTTgzMVhfR1BOX09EID8gIm9wZW4tZHJhaW4iIDogIkNNT1MiLAotCQkJICAgdHJpc3RhdGVkID8gIiB0cmlzdGF0ZWQiIDogIiIsCi0JCQkgICByZWcpOwotCX0KLX0KLSNlbHNlCi0jZGVmaW5lIHdtODMxeF9ncGlvX2RiZ19zaG93IE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewotCS5sYWJlbAkJCT0gIndtODMxeCIsCi0JLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkuZGlyZWN0aW9uX2lucHV0CT0gd204MzF4X2dwaW9fZGlyZWN0aW9uX2luLAotCS5nZXQJCQk9IHdtODMxeF9ncGlvX2dldCwKLQkuZGlyZWN0aW9uX291dHB1dAk9IHdtODMxeF9ncGlvX2RpcmVjdGlvbl9vdXQsCi0JLnNldAkJCT0gd204MzF4X2dwaW9fc2V0LAotCS50b19pcnEJCQk9IHdtODMxeF9ncGlvX3RvX2lycSwKLQkuc2V0X2RlYm91bmNlCQk9IHdtODMxeF9ncGlvX3NldF9kZWJvdW5jZSwKLQkuZGJnX3Nob3cJCT0gd204MzF4X2dwaW9fZGJnX3Nob3csCi0JLmNhbl9zbGVlcAkJPSAxLAotfTsKLQotc3RhdGljIGludCBfX2RldmluaXQgd204MzF4X2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHdtODMxeF9wZGF0YSAqcGRhdGEgPSB3bTgzMXgtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgd204MzF4X2dwaW8gKndtODMxeF9ncGlvOwotCWludCByZXQ7Ci0KLQl3bTgzMXhfZ3BpbyA9IGt6YWxsb2Moc2l6ZW9mKCp3bTgzMXhfZ3BpbyksIEdGUF9LRVJORUwpOwotCWlmICh3bTgzMXhfZ3BpbyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXdtODMxeF9ncGlvLT53bTgzMXggPSB3bTgzMXg7Ci0Jd204MzF4X2dwaW8tPmdwaW9fY2hpcCA9IHRlbXBsYXRlX2NoaXA7Ci0Jd204MzF4X2dwaW8tPmdwaW9fY2hpcC5uZ3BpbyA9IHdtODMxeC0+bnVtX2dwaW87Ci0Jd204MzF4X2dwaW8tPmdwaW9fY2hpcC5kZXYgPSAmcGRldi0+ZGV2OwotCWlmIChwZGF0YSAmJiBwZGF0YS0+Z3Bpb19iYXNlKQotCQl3bTgzMXhfZ3Bpby0+Z3Bpb19jaGlwLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOwotCWVsc2UKLQkJd204MzF4X2dwaW8tPmdwaW9fY2hpcC5iYXNlID0gLTE7Ci0KLQlyZXQgPSBncGlvY2hpcF9hZGQoJndtODMxeF9ncGlvLT5ncGlvX2NoaXApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCByZWdpc3RlciBncGlvY2hpcCwgJWRcbiIsCi0JCQlyZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3bTgzMXhfZ3Bpbyk7Ci0KLQlyZXR1cm4gcmV0OwotCi1lcnI6Ci0Ja2ZyZWUod204MzF4X2dwaW8pOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IHdtODMxeF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB3bTgzMXhfZ3BpbyAqd204MzF4X2dwaW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZ3bTgzMXhfZ3Bpby0+Z3Bpb19jaGlwKTsKLQlpZiAocmV0ID09IDApCi0JCWtmcmVlKHdtODMxeF9ncGlvKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdtODMxeF9ncGlvX2RyaXZlciA9IHsKLQkuZHJpdmVyLm5hbWUJPSAid204MzF4LWdwaW8iLAotCS5kcml2ZXIub3duZXIJPSBUSElTX01PRFVMRSwKLQkucHJvYmUJCT0gd204MzF4X2dwaW9fcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTgzMXhfZ3Bpb19yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgd204MzF4X2dwaW9faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndtODMxeF9ncGlvX2RyaXZlcik7Ci19Ci1zdWJzeXNfaW5pdGNhbGwod204MzF4X2dwaW9faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB3bTgzMXhfZ3Bpb19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndtODMxeF9ncGlvX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdCh3bTgzMXhfZ3Bpb19leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkdQSU8gaW50ZXJmYWNlIGZvciBXTTgzMXggUE1JQ3MiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06d204MzF4LWdwaW8iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby93bTgzNTAtZ3Bpb2xpYi5jIGIvZHJpdmVycy9ncGlvL3dtODM1MC1ncGlvbGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OTk5OTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL3dtODM1MC1ncGlvbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIHdtODM1eC1ncGlvbGliLmMgIC0tICBncGlvbGliIHN1cHBvcnQgZm9yIFdvbGZzb24gV004MzV4IFBNSUNzCi0gKgotICogQ29weXJpZ2h0IDIwMDkgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KLSAqCi0gKiBBdXRob3I6IE1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL2dwaW8uaD4KLQotc3RydWN0IHdtODM1MF9ncGlvX2RhdGEgewotCXN0cnVjdCB3bTgzNTAgKndtODM1MDsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHdtODM1MF9ncGlvX2RhdGEgKnRvX3dtODM1MF9ncGlvKHN0cnVjdCBncGlvX2NoaXAgKmNoaXApCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3Qgd204MzUwX2dwaW9fZGF0YSwgZ3Bpb19jaGlwKTsKLX0KLQotc3RhdGljIGludCB3bTgzNTBfZ3Bpb19kaXJlY3Rpb25faW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCB3bTgzNTBfZ3Bpb19kYXRhICp3bTgzNTBfZ3BpbyA9IHRvX3dtODM1MF9ncGlvKGNoaXApOwotCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHdtODM1MF9ncGlvLT53bTgzNTA7Ci0KLQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0dQSU9fQ09ORklHVVJBVElPTl9JX08sCi0JCQkgICAgICAgMSA8PCBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW50IHdtODM1MF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IHdtODM1MF9ncGlvX2RhdGEgKndtODM1MF9ncGlvID0gdG9fd204MzUwX2dwaW8oY2hpcCk7Ci0Jc3RydWN0IHdtODM1MCAqd204MzUwID0gd204MzUwX2dwaW8tPndtODM1MDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0dQSU9fTEVWRUwpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHJldCAmICgxIDw8IG9mZnNldCkpCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHdtODM1MF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3Qgd204MzUwX2dwaW9fZGF0YSAqd204MzUwX2dwaW8gPSB0b193bTgzNTBfZ3BpbyhjaGlwKTsKLQlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSB3bTgzNTBfZ3Bpby0+d204MzUwOwotCi0JaWYgKHZhbHVlKQotCQl3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfR1BJT19MRVZFTCwgMSA8PCBvZmZzZXQpOwotCWVsc2UKLQkJd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfR1BJT19MRVZFTCwgMSA8PCBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW50IHdtODM1MF9ncGlvX2RpcmVjdGlvbl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCB3bTgzNTBfZ3Bpb19kYXRhICp3bTgzNTBfZ3BpbyA9IHRvX3dtODM1MF9ncGlvKGNoaXApOwotCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHdtODM1MF9ncGlvLT53bTgzNTA7Ci0JaW50IHJldDsKLQotCXJldCA9IHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0dQSU9fQ09ORklHVVJBVElPTl9JX08sCi0JCQkJMSA8PCBvZmZzZXQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogRG9uJ3QgaGF2ZSBhbiBhdG9taWMgZGlyZWN0aW9uL3ZhbHVlIHNldHVwICovCi0Jd204MzUwX2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd204MzUwX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3Qgd204MzUwX2dwaW9fZGF0YSAqd204MzUwX2dwaW8gPSB0b193bTgzNTBfZ3BpbyhjaGlwKTsKLQlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSB3bTgzNTBfZ3Bpby0+d204MzUwOwotCi0JaWYgKCF3bTgzNTAtPmlycV9iYXNlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiB3bTgzNTAtPmlycV9iYXNlICsgV004MzUwX0lSUV9HUElPKG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7Ci0JLmxhYmVsCQkJPSAid204MzUwIiwKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5kaXJlY3Rpb25faW5wdXQJPSB3bTgzNTBfZ3Bpb19kaXJlY3Rpb25faW4sCi0JLmdldAkJCT0gd204MzUwX2dwaW9fZ2V0LAotCS5kaXJlY3Rpb25fb3V0cHV0CT0gd204MzUwX2dwaW9fZGlyZWN0aW9uX291dCwKLQkuc2V0CQkJPSB3bTgzNTBfZ3Bpb19zZXQsCi0JLnRvX2lycQkJCT0gd204MzUwX2dwaW9fdG9faXJxLAotCS5jYW5fc2xlZXAJCT0gMSwKLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHdtODM1MF9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdtODM1MCAqd204MzUwID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCXN0cnVjdCB3bTgzNTBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSB3bTgzNTAtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgd204MzUwX2dwaW9fZGF0YSAqd204MzUwX2dwaW87Ci0JaW50IHJldDsKLQotCXdtODM1MF9ncGlvID0ga3phbGxvYyhzaXplb2YoKndtODM1MF9ncGlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHdtODM1MF9ncGlvID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jd204MzUwX2dwaW8tPndtODM1MCA9IHdtODM1MDsKLQl3bTgzNTBfZ3Bpby0+Z3Bpb19jaGlwID0gdGVtcGxhdGVfY2hpcDsKLQl3bTgzNTBfZ3Bpby0+Z3Bpb19jaGlwLm5ncGlvID0gMTM7Ci0Jd204MzUwX2dwaW8tPmdwaW9fY2hpcC5kZXYgPSAmcGRldi0+ZGV2OwotCWlmIChwZGF0YSAmJiBwZGF0YS0+Z3Bpb19iYXNlKQotCQl3bTgzNTBfZ3Bpby0+Z3Bpb19jaGlwLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOwotCWVsc2UKLQkJd204MzUwX2dwaW8tPmdwaW9fY2hpcC5iYXNlID0gLTE7Ci0KLQlyZXQgPSBncGlvY2hpcF9hZGQoJndtODM1MF9ncGlvLT5ncGlvX2NoaXApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCByZWdpc3RlciBncGlvY2hpcCwgJWRcbiIsCi0JCQlyZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3bTgzNTBfZ3Bpbyk7Ci0KLQlyZXR1cm4gcmV0OwotCi1lcnI6Ci0Ja2ZyZWUod204MzUwX2dwaW8pOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IHdtODM1MF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB3bTgzNTBfZ3Bpb19kYXRhICp3bTgzNTBfZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJndtODM1MF9ncGlvLT5ncGlvX2NoaXApOwotCWlmIChyZXQgPT0gMCkKLQkJa2ZyZWUod204MzUwX2dwaW8pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd204MzUwX2dwaW9fZHJpdmVyID0gewotCS5kcml2ZXIubmFtZQk9ICJ3bTgzNTAtZ3BpbyIsCi0JLmRyaXZlci5vd25lcgk9IFRISVNfTU9EVUxFLAotCS5wcm9iZQkJPSB3bTgzNTBfZ3Bpb19wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODM1MF9ncGlvX3JlbW92ZSksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCB3bTgzNTBfZ3Bpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd204MzUwX2dwaW9fZHJpdmVyKTsKLX0KLXN1YnN5c19pbml0Y2FsbCh3bTgzNTBfZ3Bpb19pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHdtODM1MF9ncGlvX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmd204MzUwX2dwaW9fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHdtODM1MF9ncGlvX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiR1BJTyBpbnRlcmZhY2UgZm9yIFdNODM1MCBQTUlDcyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp3bTgzNTAtZ3BpbyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3dtODk5NC1ncGlvLmMgYi9kcml2ZXJzL2dwaW8vd204OTk0LWdwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyMmJhYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwaW8vd204OTk0LWdwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKgotICogd204OTk0LWdwaW8uYyAgLS0gIGdwaW9saWIgc3VwcG9ydCBmb3IgV29sZnNvbiBXTTg5OTQKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgotICoKLSAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21mZC93bTg5OTQvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93bTg5OTQvcGRhdGEuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd204OTk0L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd204OTk0L3JlZ2lzdGVycy5oPgotCi1zdHJ1Y3Qgd204OTk0X2dwaW8gewotCXN0cnVjdCB3bTg5OTQgKndtODk5NDsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHdtODk5NF9ncGlvICp0b193bTg5OTRfZ3BpbyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKQotewotCXJldHVybiBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHdtODk5NF9ncGlvLCBncGlvX2NoaXApOwotfQotCi1zdGF0aWMgaW50IHdtODk5NF9ncGlvX3JlcXVlc3Qoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCB3bTg5OTRfZ3BpbyAqd204OTk0X2dwaW8gPSB0b193bTg5OTRfZ3BpbyhjaGlwKTsKLQlzdHJ1Y3Qgd204OTk0ICp3bTg5OTQgPSB3bTg5OTRfZ3Bpby0+d204OTk0OwotCi0Jc3dpdGNoICh3bTg5OTQtPnR5cGUpIHsKLQljYXNlIFdNODk1ODoKLQkJc3dpdGNoIChvZmZzZXQpIHsKLQkJY2FzZSAxOgotCQljYXNlIDI6Ci0JCWNhc2UgMzoKLQkJY2FzZSA0OgotCQljYXNlIDY6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3bTg5OTRfZ3Bpb19kaXJlY3Rpb25faW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCB3bTg5OTRfZ3BpbyAqd204OTk0X2dwaW8gPSB0b193bTg5OTRfZ3BpbyhjaGlwKTsKLQlzdHJ1Y3Qgd204OTk0ICp3bTg5OTQgPSB3bTg5OTRfZ3Bpby0+d204OTk0OwotCi0JcmV0dXJuIHdtODk5NF9zZXRfYml0cyh3bTg5OTQsIFdNODk5NF9HUElPXzEgKyBvZmZzZXQsCi0JCQkgICAgICAgV004OTk0X0dQTl9ESVIsIFdNODk5NF9HUE5fRElSKTsKLX0KLQotc3RhdGljIGludCB3bTg5OTRfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCB3bTg5OTRfZ3BpbyAqd204OTk0X2dwaW8gPSB0b193bTg5OTRfZ3BpbyhjaGlwKTsKLQlzdHJ1Y3Qgd204OTk0ICp3bTg5OTQgPSB3bTg5OTRfZ3Bpby0+d204OTk0OwotCWludCByZXQ7Ci0KLQlyZXQgPSB3bTg5OTRfcmVnX3JlYWQod204OTk0LCBXTTg5OTRfR1BJT18xICsgb2Zmc2V0KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChyZXQgJiBXTTg5OTRfR1BOX0xWTCkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3bTg5OTRfZ3Bpb19kaXJlY3Rpb25fb3V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgICB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3Qgd204OTk0X2dwaW8gKndtODk5NF9ncGlvID0gdG9fd204OTk0X2dwaW8oY2hpcCk7Ci0Jc3RydWN0IHdtODk5NCAqd204OTk0ID0gd204OTk0X2dwaW8tPndtODk5NDsKLQotCXJldHVybiB3bTg5OTRfc2V0X2JpdHMod204OTk0LCBXTTg5OTRfR1BJT18xICsgb2Zmc2V0LAotCQkJICAgICAgIFdNODk5NF9HUE5fRElSLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgd204OTk0X2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCB3bTg5OTRfZ3BpbyAqd204OTk0X2dwaW8gPSB0b193bTg5OTRfZ3BpbyhjaGlwKTsKLQlzdHJ1Y3Qgd204OTk0ICp3bTg5OTQgPSB3bTg5OTRfZ3Bpby0+d204OTk0OwotCi0JaWYgKHZhbHVlKQotCQl2YWx1ZSA9IFdNODk5NF9HUE5fTFZMOwotCi0Jd204OTk0X3NldF9iaXRzKHdtODk5NCwgV004OTk0X0dQSU9fMSArIG9mZnNldCwgV004OTk0X0dQTl9MVkwsIHZhbHVlKTsKLX0KLQotc3RhdGljIGludCB3bTg5OTRfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCB3bTg5OTRfZ3BpbyAqd204OTk0X2dwaW8gPSB0b193bTg5OTRfZ3BpbyhjaGlwKTsKLQlzdHJ1Y3Qgd204OTk0ICp3bTg5OTQgPSB3bTg5OTRfZ3Bpby0+d204OTk0OwotCi0JaWYgKCF3bTg5OTQtPmlycV9iYXNlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiB3bTg5OTQtPmlycV9iYXNlICsgb2Zmc2V0OwotfQotCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyB2b2lkIHdtODk5NF9ncGlvX2RiZ19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkKLXsKLQlzdHJ1Y3Qgd204OTk0X2dwaW8gKndtODk5NF9ncGlvID0gdG9fd204OTk0X2dwaW8oY2hpcCk7Ci0Jc3RydWN0IHdtODk5NCAqd204OTk0ID0gd204OTk0X2dwaW8tPndtODk5NDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5uZ3BpbzsgaSsrKSB7Ci0JCWludCBncGlvID0gaSArIGNoaXAtPmJhc2U7Ci0JCWludCByZWc7Ci0JCWNvbnN0IGNoYXIgKmxhYmVsOwotCi0JCS8qIFdlIHJlcG9ydCB0aGUgR1BJTyBldmVuIGlmIGl0J3Mgbm90IHJlcXVlc3RlZCBzaW5jZQotCQkgKiB3ZSdyZSBhbHNvIHJlcG9ydGluZyB0aGluZ3MgbGlrZSBhbHRlcm5hdGUKLQkJICogZnVuY3Rpb25zIHdoaWNoIGFwcGx5IGV2ZW4gd2hlbiB0aGUgR1BJTyBpcyBub3QgaW4KLQkJICogdXNlIGFzIGEgR1BJTy4KLQkJICovCi0JCWxhYmVsID0gZ3Bpb2NoaXBfaXNfcmVxdWVzdGVkKGNoaXAsIGkpOwotCQlpZiAoIWxhYmVsKQotCQkJbGFiZWwgPSAiVW5yZXF1ZXN0ZWQiOwotCi0JCXNlcV9wcmludGYocywgIiBncGlvLSUtM2QgKCUtMjAuMjBzKSAiLCBncGlvLCBsYWJlbCk7Ci0KLQkJcmVnID0gd204OTk0X3JlZ19yZWFkKHdtODk5NCwgV004OTk0X0dQSU9fMSArIGkpOwotCQlpZiAocmVnIDwgMCkgewotCQkJZGV2X2Vycih3bTg5OTQtPmRldiwKLQkJCQkiR1BJTyBjb250cm9sICVkIHJlYWQgZmFpbGVkOiAlZFxuIiwKLQkJCQlncGlvLCByZWcpOwotCQkJc2VxX3ByaW50ZihzLCAiXG4iKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogTm8gZGVjb2RlIHlldDsgbm90ZSB0aGF0IEdQSU8yIGlzIHNwZWNpYWwgKi8KLQkJc2VxX3ByaW50ZihzLCAiKCV4KVxuIiwgcmVnKTsKLQl9Ci19Ci0jZWxzZQotI2RlZmluZSB3bTg5OTRfZ3Bpb19kYmdfc2hvdyBOVUxMCi0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKLQkubGFiZWwJCQk9ICJ3bTg5OTQiLAotCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JLnJlcXVlc3QJCT0gd204OTk0X2dwaW9fcmVxdWVzdCwKLQkuZGlyZWN0aW9uX2lucHV0CT0gd204OTk0X2dwaW9fZGlyZWN0aW9uX2luLAotCS5nZXQJCQk9IHdtODk5NF9ncGlvX2dldCwKLQkuZGlyZWN0aW9uX291dHB1dAk9IHdtODk5NF9ncGlvX2RpcmVjdGlvbl9vdXQsCi0JLnNldAkJCT0gd204OTk0X2dwaW9fc2V0LAotCS50b19pcnEJCQk9IHdtODk5NF9ncGlvX3RvX2lycSwKLQkuZGJnX3Nob3cJCT0gd204OTk0X2dwaW9fZGJnX3Nob3csCi0JLmNhbl9zbGVlcAkJPSAxLAotfTsKLQotc3RhdGljIGludCBfX2RldmluaXQgd204OTk0X2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgd204OTk0ICp3bTg5OTQgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHdtODk5NF9wZGF0YSAqcGRhdGEgPSB3bTg5OTQtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgd204OTk0X2dwaW8gKndtODk5NF9ncGlvOwotCWludCByZXQ7Ci0KLQl3bTg5OTRfZ3BpbyA9IGt6YWxsb2Moc2l6ZW9mKCp3bTg5OTRfZ3BpbyksIEdGUF9LRVJORUwpOwotCWlmICh3bTg5OTRfZ3BpbyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXdtODk5NF9ncGlvLT53bTg5OTQgPSB3bTg5OTQ7Ci0Jd204OTk0X2dwaW8tPmdwaW9fY2hpcCA9IHRlbXBsYXRlX2NoaXA7Ci0Jd204OTk0X2dwaW8tPmdwaW9fY2hpcC5uZ3BpbyA9IFdNODk5NF9HUElPX01BWDsKLQl3bTg5OTRfZ3Bpby0+Z3Bpb19jaGlwLmRldiA9ICZwZGV2LT5kZXY7Ci0JaWYgKHBkYXRhICYmIHBkYXRhLT5ncGlvX2Jhc2UpCi0JCXdtODk5NF9ncGlvLT5ncGlvX2NoaXAuYmFzZSA9IHBkYXRhLT5ncGlvX2Jhc2U7Ci0JZWxzZQotCQl3bTg5OTRfZ3Bpby0+Z3Bpb19jaGlwLmJhc2UgPSAtMTsKLQotCXJldCA9IGdwaW9jaGlwX2FkZCgmd204OTk0X2dwaW8tPmdwaW9fY2hpcCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIGdwaW9jaGlwLCAlZFxuIiwKLQkJCXJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdtODk5NF9ncGlvKTsKLQotCXJldHVybiByZXQ7Ci0KLWVycjoKLQlrZnJlZSh3bTg5OTRfZ3Bpbyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgd204OTk0X2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdtODk5NF9ncGlvICp3bTg5OTRfZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJndtODk5NF9ncGlvLT5ncGlvX2NoaXApOwotCWlmIChyZXQgPT0gMCkKLQkJa2ZyZWUod204OTk0X2dwaW8pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd204OTk0X2dwaW9fZHJpdmVyID0gewotCS5kcml2ZXIubmFtZQk9ICJ3bTg5OTQtZ3BpbyIsCi0JLmRyaXZlci5vd25lcgk9IFRISVNfTU9EVUxFLAotCS5wcm9iZQkJPSB3bTg5OTRfZ3Bpb19wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODk5NF9ncGlvX3JlbW92ZSksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCB3bTg5OTRfZ3Bpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd204OTk0X2dwaW9fZHJpdmVyKTsKLX0KLXN1YnN5c19pbml0Y2FsbCh3bTg5OTRfZ3Bpb19pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHdtODk5NF9ncGlvX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmd204OTk0X2dwaW9fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHdtODk5NF9ncGlvX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiR1BJTyBpbnRlcmZhY2UgZm9yIFdNODk5NCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp3bTg5OTQtZ3BpbyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYwppbmRleCAzZTI1N2E1Li42MWUxZWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYwpAQCAtNDYsMTAgKzQ2LDExIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQkvKgogCQkgKiBCZWNhdXNlIHRoZSBrZXJuZWwtdXNlcnNwYWNlIEFCSSBpcyBmaXhlZCBhdCBhIDMyLWJpdCBvZmZzZXQKLQkJICogd2hpbGUgUENJIHJlc291cmNlcyBtYXkgbGl2ZSBhYm92ZSB0aGF0LCB3ZSBpZ25vcmUgdGhlIG1hcAotCQkgKiBvZmZzZXQgZm9yIG1hcHMgb2YgdHlwZSBfRFJNX0ZSQU1FQlVGRkVSIG9yIF9EUk1fUkVHSVNURVJTLgotCQkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgZWFjaCBkcml2ZXIgd2lsbCBoYXZlIG9ubHkgb25lIHJlc291cmNlIG9mCi0JCSAqIGVhY2ggdHlwZS4KKwkJICogd2hpbGUgUENJIHJlc291cmNlcyBtYXkgbGl2ZSBhYm92ZSB0aGF0LCB3ZSBvbmx5IGNvbXBhcmUgdGhlCisJCSAqIGxvd2VyIDMyIGJpdHMgb2YgdGhlIG1hcCBvZmZzZXQgZm9yIG1hcHMgb2YgdHlwZQorCQkgKiBfRFJNX0ZSQU1FQlVGRkVSIG9yIF9EUk1fUkVHSVNURVJTLgorCQkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgYSBkcml2ZXIgaGF2ZSBtb3JlIHRoYW4gb25lIHJlc291cmNlCisJCSAqIG9mIGVhY2ggdHlwZSwgdGhlIGxvd2VyIDMyIGJpdHMgYXJlIGRpZmZlcmVudC4KIAkJICovCiAJCWlmICghZW50cnktPm1hcCB8fAogCQkgICAgbWFwLT50eXBlICE9IGVudHJ5LT5tYXAtPnR5cGUgfHwKQEAgLTU5LDkgKzYwLDEyIEBACiAJCWNhc2UgX0RSTV9TSE06CiAJCQlpZiAobWFwLT5mbGFncyAhPSBfRFJNX0NPTlRBSU5TX0xPQ0spCiAJCQkJYnJlYWs7CisJCQlyZXR1cm4gZW50cnk7CiAJCWNhc2UgX0RSTV9SRUdJU1RFUlM6CiAJCWNhc2UgX0RSTV9GUkFNRV9CVUZGRVI6Ci0JCQlyZXR1cm4gZW50cnk7CisJCQlpZiAoKGVudHJ5LT5tYXAtPm9mZnNldCAmIDB4ZmZmZmZmZmYpID09CisJCQkgICAgKG1hcC0+b2Zmc2V0ICYgMHhmZmZmZmZmZikpCisJCQkJcmV0dXJuIGVudHJ5OwogCQlkZWZhdWx0OiAvKiBNYWtlIGdjYyBoYXBweSAqLwogCQkJOwogCQl9CkBAIC0xODMsOSArMTg3LDYgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAjZW5kaWYKLSNpZmRlZiBfX2FscGhhX18KLQkJbWFwLT5vZmZzZXQgKz0gZGV2LT5ob3NlLT5tZW1fc3BhY2UtPnN0YXJ0OwotI2VuZGlmCiAJCS8qIFNvbWUgZHJpdmVycyBwcmVpbml0aWFsaXplIHNvbWUgbWFwcywgd2l0aG91dCB0aGUgWCBTZXJ2ZXIKIAkJICogbmVlZGluZyB0byBiZSBhd2FyZSBvZiBpdC4gIFRoZXJlZm9yZSwgd2UganVzdCByZXR1cm4gc3VjY2VzcwogCQkgKiB3aGVuIHRoZSBzZXJ2ZXIgdHJpZXMgdG8gY3JlYXRlIGEgZHVwbGljYXRlIG1hcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKaW5kZXggODcyNzQ3Yy4uODJkYjE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKQEAgLTg4Niw5ICs4ODYsNiBAQAogCXRvdGFsX29iamVjdHMgKz0gZGV2LT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yOwogCXRvdGFsX29iamVjdHMgKz0gZGV2LT5tb2RlX2NvbmZpZy5udW1fZW5jb2RlcjsKIAotCWlmICh0b3RhbF9vYmplY3RzID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCiAJZ3JvdXAtPmlkX2xpc3QgPSBremFsbG9jKHRvdGFsX29iamVjdHMgKiBzaXplb2YodWludDMyX3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdyb3VwLT5pZF9saXN0KQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTExMTMsNyArMTExMCw3IEBACiAJaWYgKGNhcmRfcmVzLT5jb3VudF9mYnMgPj0gZmJfY291bnQpIHsKIAkJY29waWVkID0gMDsKIAkJZmJfaWQgPSAodWludDMyX3QgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY2FyZF9yZXMtPmZiX2lkX3B0cjsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmYiwgJmZpbGVfcHJpdi0+ZmJzLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmIsICZmaWxlX3ByaXYtPmZicywgZmlscF9oZWFkKSB7CiAJCQlpZiAocHV0X3VzZXIoZmItPmJhc2UuaWQsIGZiX2lkICsgY29waWVkKSkgewogCQkJCXJldCA9IC1FRkFVTFQ7CiAJCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCmluZGV4IDBhOTM1N2MuLjA5MjkyMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCkBAIC0xODQsOSArMTg0LDkgQEAKIAogYmFkOgogCWlmIChyYXdfZWRpZCkgewotCQlEUk1fRVJST1IoIlJhdyBFRElEOlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiUmF3IEVESUQ6XG4iKTsKIAkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoS0VSTl9FUlIsIERVTVBfUFJFRklYX05PTkUsIHJhd19lZGlkLCBFRElEX0xFTkdUSCk7Ci0JCXByaW50aygiXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI1OCw2ICsyNTgsMTcgQEAKIAlyZXR1cm4gcmV0ID09IDIgPyAwIDogLTE7CiB9CiAKK3N0YXRpYyBib29sIGRybV9lZGlkX2lzX3plcm8odTggKmluX2VkaWQsIGludCBsZW5ndGgpCit7CisJaW50IGk7CisJdTMyICpyYXdfZWRpZCA9ICh1MzIgKilpbl9lZGlkOworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aCAvIDQ7IGkrKykKKwkJaWYgKCoocmF3X2VkaWQgKyBpKSAhPSAwKQorCQkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgdTggKgogZHJtX2RvX2dldF9lZGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKQEAgLTI3Myw2ICsyODQsMTAgQEAKIAkJCWdvdG8gb3V0OwogCQlpZiAoZHJtX2VkaWRfYmxvY2tfdmFsaWQoYmxvY2spKQogCQkJYnJlYWs7CisJCWlmIChpID09IDAgJiYgZHJtX2VkaWRfaXNfemVybyhibG9jaywgRURJRF9MRU5HVEgpKSB7CisJCQljb25uZWN0b3ItPm51bGxfZWRpZF9jb3VudGVyKys7CisJCQlnb3RvIGNhcnA7CisJCX0KIAl9CiAJaWYgKGkgPT0gNCkKIAkJZ290byBjYXJwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKaW5kZXggNzRlNGZmNS4uNDAxMmZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgImRybVAuaCIKIAogLyoqIEBmaWxlIGRybV9nZW0uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9pb2MzMi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pb2MzMi5jCmluZGV4IGQ2MWQxODUuLjRhMDU4YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jMzIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvYzMyLmMKQEAgLTI4LDYgKzI4LDcgQEAKICAqIElOIFRIRSBTT0ZUV0FSRS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9jb3JlLmgiCkBAIC0yNTMsMTAgKzI1NCwxMCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW0zMi5oYW5kbGUgPSAodW5zaWduZWQgbG9uZyloYW5kbGU7Ci0JaWYgKG0zMi5oYW5kbGUgIT0gKHVuc2lnbmVkIGxvbmcpaGFuZGxlICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJpbnRrKEtFUk5fRVJSICJjb21wYXRfZHJtX2FkZG1hcCB0cnVuY2F0ZWQgaGFuZGxlIgotCQkgICAgICAgIiAlcCBmb3IgdHlwZSAlZCBvZmZzZXQgJXhcbiIsCi0JCSAgICAgICBoYW5kbGUsIG0zMi50eXBlLCBtMzIub2Zmc2V0KTsKKwlpZiAobTMyLmhhbmRsZSAhPSAodW5zaWduZWQgbG9uZyloYW5kbGUpCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUiAiY29tcGF0X2RybV9hZGRtYXAgdHJ1bmNhdGVkIGhhbmRsZSIKKwkJCQkgICAiICVwIGZvciB0eXBlICVkIG9mZnNldCAleFxuIiwKKwkJCQkgICBoYW5kbGUsIG0zMi50eXBlLCBtMzIub2Zmc2V0KTsKIAogCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm0zMiwgc2l6ZW9mKG0zMikpKQogCQlyZXR1cm4gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jCmluZGV4IGUxYWVlNGYuLmI2YTE5Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYwpAQCAtMjUxLDcgKzI1MSw3IEBACiB9CiAKIAotaW50IGRybV9wY2lfaXJxX2J5X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1faXJxX2J1c2lkICpwKQorc3RhdGljIGludCBkcm1fcGNpX2lycV9ieV9idXNpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2lycV9idXNpZCAqcCkKIHsKIAlpZiAoKHAtPmJ1c251bSA+PiA4KSAhPSBkcm1fZ2V0X3BjaV9kb21haW4oZGV2KSB8fAogCSAgICAocC0+YnVzbnVtICYgMHhmZikgIT0gZGV2LT5wZGV2LT5idXMtPm51bWJlciB8fApAQCAtMjkyLDYgKzI5Miw3IEBACiAJLmdldF9uYW1lID0gZHJtX3BjaV9nZXRfbmFtZSwKIAkuc2V0X2J1c2lkID0gZHJtX3BjaV9zZXRfYnVzaWQsCiAJLnNldF91bmlxdWUgPSBkcm1fcGNpX3NldF91bmlxdWUsCisJLmlycV9ieV9idXNpZCA9IGRybV9wY2lfaXJxX2J5X2J1c2lkLAogCS5hZ3BfaW5pdCA9IGRybV9wY2lfYWdwX2luaXQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3NjYXR0ZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc2NhdHRlci5jCmluZGV4IGQxNWUwOWIuLjc1MjVlMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc2NhdHRlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc2NhdHRlci5jCkBAIC04MywzMCArODMsMjYgQEAKIAlpZiAoZGV2LT5zZykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9LRVJORUwpOworCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1zZXQoZW50cnksIDAsIHNpemVvZigqZW50cnkpKTsKIAlwYWdlcyA9IChyZXF1ZXN0LT5zaXplICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CiAJRFJNX0RFQlVHKCJzaXplPSVsZCBwYWdlcz0lbGRcbiIsIHJlcXVlc3QtPnNpemUsIHBhZ2VzKTsKIAogCWVudHJ5LT5wYWdlcyA9IHBhZ2VzOwotCWVudHJ5LT5wYWdlbGlzdCA9IGttYWxsb2MocGFnZXMgKiBzaXplb2YoKmVudHJ5LT5wYWdlbGlzdCksIEdGUF9LRVJORUwpOworCWVudHJ5LT5wYWdlbGlzdCA9IGtjYWxsb2MocGFnZXMsIHNpemVvZigqZW50cnktPnBhZ2VsaXN0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbnRyeS0+cGFnZWxpc3QpIHsKIAkJa2ZyZWUoZW50cnkpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQltZW1zZXQoZW50cnktPnBhZ2VsaXN0LCAwLCBwYWdlcyAqIHNpemVvZigqZW50cnktPnBhZ2VsaXN0KSk7Ci0KLQllbnRyeS0+YnVzYWRkciA9IGttYWxsb2MocGFnZXMgKiBzaXplb2YoKmVudHJ5LT5idXNhZGRyKSwgR0ZQX0tFUk5FTCk7CisJZW50cnktPmJ1c2FkZHIgPSBrY2FsbG9jKHBhZ2VzLCBzaXplb2YoKmVudHJ5LT5idXNhZGRyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbnRyeS0+YnVzYWRkcikgewogCQlrZnJlZShlbnRyeS0+cGFnZWxpc3QpOwogCQlrZnJlZShlbnRyeSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoKHZvaWQgKillbnRyeS0+YnVzYWRkciwgMCwgcGFnZXMgKiBzaXplb2YoKmVudHJ5LT5idXNhZGRyKSk7CiAKIAllbnRyeS0+dmlydHVhbCA9IGRybV92bWFsbG9jX2RtYShwYWdlcyA8PCBQQUdFX1NISUZUKTsKIAlpZiAoIWVudHJ5LT52aXJ0dWFsKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMKaW5kZXggMmMzZmNiZC4uNWRiOTZkNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMKQEAgLTUyNiw3ICs1MjYsNyBAQAogc3RhdGljIHJlc291cmNlX3NpemVfdCBkcm1fY29yZV9nZXRfcmVnX29mcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogI2lmZGVmIF9fYWxwaGFfXwotCXJldHVybiBkZXYtPmhvc2UtPmRlbnNlX21lbV9iYXNlIC0gZGV2LT5ob3NlLT5tZW1fc3BhY2UtPnN0YXJ0OworCXJldHVybiBkZXYtPmhvc2UtPmRlbnNlX21lbV9iYXNlOwogI2Vsc2UKIAlyZXR1cm4gMDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwppbmRleCA1MWMyMjU3Li4wYTg5M2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwpAQCAtNzc2LDcgKzc3Niw3IEBACiAJc2VxX3ByaW50ZihtLCAiICBJTlNUUE06IDB4JTA4eFxuIiwgZXJyb3ItPmluc3RwbSk7CiAJc2VxX3ByaW50ZihtLCAiICBzZXFubzogMHglMDh4XG4iLCBlcnJvci0+c2Vxbm8pOwogCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5udW1fZmVuY2VfcmVnczsgaSsrKQogCQlzZXFfcHJpbnRmKG0sICIgIGZlbmNlWyVkXSA9ICUwOGxseFxuIiwgaSwgZXJyb3ItPmZlbmNlW2ldKTsKIAogCWlmIChlcnJvci0+YWN0aXZlX2JvKQpAQCAtMTIwNywxMyArMTIwNywxNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlzZXFfcHJpbnRmKG0sICJwb3dlciBjb250ZXh0ICIpOwotCWRlc2NyaWJlX29iaihtLCBkZXZfcHJpdi0+cHdyY3R4KTsKLQlzZXFfcHJpbnRmKG0sICJcbiIpOworCWlmIChkZXZfcHJpdi0+cHdyY3R4KSB7CisJCXNlcV9wcmludGYobSwgInBvd2VyIGNvbnRleHQgIik7CisJCWRlc2NyaWJlX29iaihtLCBkZXZfcHJpdi0+cHdyY3R4KTsKKwkJc2VxX3ByaW50ZihtLCAiXG4iKTsKKwl9CiAKLQlzZXFfcHJpbnRmKG0sICJyZW5kZXIgY29udGV4dCAiKTsKLQlkZXNjcmliZV9vYmoobSwgZGV2X3ByaXYtPnJlbmRlcmN0eCk7Ci0Jc2VxX3ByaW50ZihtLCAiXG4iKTsKKwlpZiAoZGV2X3ByaXYtPnJlbmRlcmN0eCkgeworCQlzZXFfcHJpbnRmKG0sICJyZW5kZXIgY29udGV4dCAiKTsKKwkJZGVzY3JpYmVfb2JqKG0sIGRldl9wcml2LT5yZW5kZXJjdHgpOworCQlzZXFfcHJpbnRmKG0sICJcbiIpOworCX0KIAogCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCmluZGV4IDAyMzllOTkuLjI5NmZiZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwpAQCAtMTI2NiwzMCArMTI2Niw2IEBACiAKIAlpbnRlbF9tb2Rlc2V0X2dlbV9pbml0KGRldik7CiAKLQlpZiAoSVNfSVZZQlJJREdFKGRldikpIHsKLQkJLyogU2hhcmUgcHJlICYgdW5pbnN0YWxsIGhhbmRsZXJzIHdpdGggSUxLL1NOQiAqLwotCQlkZXYtPmRyaXZlci0+aXJxX2hhbmRsZXIgPSBpdnlicmlkZ2VfaXJxX2hhbmRsZXI7Ci0JCWRldi0+ZHJpdmVyLT5pcnFfcHJlaW5zdGFsbCA9IGlyb25sYWtlX2lycV9wcmVpbnN0YWxsOwotCQlkZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsID0gaXZ5YnJpZGdlX2lycV9wb3N0aW5zdGFsbDsKLQkJZGV2LT5kcml2ZXItPmlycV91bmluc3RhbGwgPSBpcm9ubGFrZV9pcnFfdW5pbnN0YWxsOwotCQlkZXYtPmRyaXZlci0+ZW5hYmxlX3ZibGFuayA9IGl2eWJyaWRnZV9lbmFibGVfdmJsYW5rOwotCQlkZXYtPmRyaXZlci0+ZGlzYWJsZV92YmxhbmsgPSBpdnlicmlkZ2VfZGlzYWJsZV92Ymxhbms7Ci0JfSBlbHNlIGlmIChIQVNfUENIX1NQTElUKGRldikpIHsKLQkJZGV2LT5kcml2ZXItPmlycV9oYW5kbGVyID0gaXJvbmxha2VfaXJxX2hhbmRsZXI7Ci0JCWRldi0+ZHJpdmVyLT5pcnFfcHJlaW5zdGFsbCA9IGlyb25sYWtlX2lycV9wcmVpbnN0YWxsOwotCQlkZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsID0gaXJvbmxha2VfaXJxX3Bvc3RpbnN0YWxsOwotCQlkZXYtPmRyaXZlci0+aXJxX3VuaW5zdGFsbCA9IGlyb25sYWtlX2lycV91bmluc3RhbGw7Ci0JCWRldi0+ZHJpdmVyLT5lbmFibGVfdmJsYW5rID0gaXJvbmxha2VfZW5hYmxlX3ZibGFuazsKLQkJZGV2LT5kcml2ZXItPmRpc2FibGVfdmJsYW5rID0gaXJvbmxha2VfZGlzYWJsZV92Ymxhbms7Ci0JfSBlbHNlIHsKLQkJZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGw7Ci0JCWRldi0+ZHJpdmVyLT5pcnFfcG9zdGluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGw7Ci0JCWRldi0+ZHJpdmVyLT5pcnFfdW5pbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbDsKLQkJZGV2LT5kcml2ZXItPmlycV9oYW5kbGVyID0gaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXI7Ci0JCWRldi0+ZHJpdmVyLT5lbmFibGVfdmJsYW5rID0gaTkxNV9lbmFibGVfdmJsYW5rOwotCQlkZXYtPmRyaXZlci0+ZGlzYWJsZV92YmxhbmsgPSBpOTE1X2Rpc2FibGVfdmJsYW5rOwotCX0KLQogCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gY2xlYW51cF9nZW07CkBAIC0xOTY3LDcgKzE5NDMsNyBAQAogCWlmICghZGV2X3ByaXYtPm1tLmd0dCkgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBpbml0aWFsaXplIEdUVFxuIik7CiAJCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2lvbWFwZnJlZTsKKwkJZ290byBvdXRfcm1tYXA7CiAJfQogCiAJYWdwX3NpemUgPSBkZXZfcHJpdi0+bW0uZ3R0LT5ndHRfbWFwcGFibGVfZW50cmllcyA8PCBQQUdFX1NISUZUOwpAQCAtMjAxMSwxOCArMTk4NywxMyBAQAogCWlmIChkZXZfcHJpdi0+d3EgPT0gTlVMTCkgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgb3VyIHdvcmtxdWV1ZS5cbiIpOwogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9pb21hcGZyZWU7CisJCWdvdG8gb3V0X210cnJmcmVlOwogCX0KIAogCS8qIGVuYWJsZSBHRU0gYnkgZGVmYXVsdCAqLwogCWRldl9wcml2LT5oYXNfZ2VtID0gMTsKIAotCWRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIgPSBpOTE1X2dldF92YmxhbmtfY291bnRlcjsKLQlkZXYtPm1heF92YmxhbmtfY291bnQgPSAweGZmZmZmZjsgLyogb25seSAyNCBiaXRzIG9mIGZyYW1lIGNvdW50ICovCi0JaWYgKElTX0c0WChkZXYpIHx8IElTX0dFTjUoZGV2KSB8fCBJU19HRU42KGRldikgfHwgSVNfSVZZQlJJREdFKGRldikpIHsKLQkJZGV2LT5tYXhfdmJsYW5rX2NvdW50ID0gMHhmZmZmZmZmZjsgLyogZnVsbCAzMiBiaXQgY291bnRlciAqLwotCQlkZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyID0gZ200NV9nZXRfdmJsYW5rX2NvdW50ZXI7Ci0JfQorCWludGVsX2lycV9pbml0KGRldik7CiAKIAkvKiBUcnkgdG8gbWFrZSBzdXJlIE1DSEJBUiBpcyBlbmFibGVkIGJlZm9yZSBwb2tpbmcgYXQgaXQgKi8KIAlpbnRlbF9zZXR1cF9tY2hiYXIoZGV2KTsKQEAgLTIxMDMsMTMgKzIwNzQsMjEgQEAKIAlyZXR1cm4gMDsKIAogb3V0X2dlbV91bmxvYWQ6CisJaWYgKGRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlci5zaHJpbmspCisJCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlcik7CisKIAlpZiAoZGV2LT5wZGV2LT5tc2lfZW5hYmxlZCkKIAkJcGNpX2Rpc2FibGVfbXNpKGRldi0+cGRldik7CiAKIAlpbnRlbF90ZWFyZG93bl9nbWJ1cyhkZXYpOwogCWludGVsX3RlYXJkb3duX21jaGJhcihkZXYpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGRldl9wcml2LT53cSk7Ci1vdXRfaW9tYXBmcmVlOgorb3V0X210cnJmcmVlOgorCWlmIChkZXZfcHJpdi0+bW0uZ3R0X210cnIgPj0gMCkgeworCQltdHJyX2RlbChkZXZfcHJpdi0+bW0uZ3R0X210cnIsIGRldi0+YWdwLT5iYXNlLAorCQkJIGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX3NpemUgKiAxMDI0ICogMTAyNCk7CisJCWRldl9wcml2LT5tbS5ndHRfbXRyciA9IC0xOworCX0KIAlpb19tYXBwaW5nX2ZyZWUoZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nKTsKIG91dF9ybW1hcDoKIAlwY2lfaW91bm1hcChkZXYtPnBkZXYsIGRldl9wcml2LT5yZWdzKTsKQEAgLTIxODIsOSArMjE2MSw4IEBACiAJCS8qIEZsdXNoIGFueSBvdXRzdGFuZGluZyB1bnBpbl93b3JrLiAqLwogCQlmbHVzaF93b3JrcXVldWUoZGV2X3ByaXYtPndxKTsKIAotCQlpOTE1X2dlbV9mcmVlX2FsbF9waHlzX29iamVjdChkZXYpOwotCiAJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJaTkxNV9nZW1fZnJlZV9hbGxfcGh5c19vYmplY3QoZGV2KTsKIAkJaTkxNV9nZW1fY2xlYW51cF9yaW5nYnVmZmVyKGRldik7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlpZiAoSTkxNV9IQVNfRkJDKGRldikgJiYgaTkxNV9wb3dlcnNhdmUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwppbmRleCAwZGVmZDQyLi5lYjkxZTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKQEAgLTUyLDcgKzUyLDcgQEAKIHVuc2lnbmVkIGludCBpOTE1X3NlbWFwaG9yZXMgPSAwOwogbW9kdWxlX3BhcmFtX25hbWVkKHNlbWFwaG9yZXMsIGk5MTVfc2VtYXBob3JlcywgaW50LCAwNjAwKTsKIAotdW5zaWduZWQgaW50IGk5MTVfZW5hYmxlX3JjNiA9IDE7Cit1bnNpZ25lZCBpbnQgaTkxNV9lbmFibGVfcmM2ID0gMDsKIG1vZHVsZV9wYXJhbV9uYW1lZChpOTE1X2VuYWJsZV9yYzYsIGk5MTVfZW5hYmxlX3JjNiwgaW50LCAwNjAwKTsKIAogdW5zaWduZWQgaW50IGk5MTVfZW5hYmxlX2ZiYyA9IDA7CkBAIC01NzcsOCArNTc3LDEyIEBACiAJaWYgKGdldF9zZWNvbmRzKCkgLSBkZXZfcHJpdi0+bGFzdF9ncHVfcmVzZXQgPCA1KSB7CiAJCURSTV9FUlJPUigiR1BVIGhhbmdpbmcgdG9vIGZhc3QsIGRlY2xhcmluZyB3ZWRnZWQhXG4iKTsKIAl9IGVsc2Ugc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgeworCWNhc2UgNzoKIAljYXNlIDY6CiAJCXJldCA9IGdlbjZfZG9fcmVzZXQoZGV2LCBmbGFncyk7CisJCS8qIElmIHJlc2V0IHdpdGggYSB1c2VyIGZvcmNld2FrZSwgdHJ5IHRvIHJlc3RvcmUgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZkZXZfcHJpdi0+Zm9yY2V3YWtlX2NvdW50KSkKKwkJCV9fZ2VuNl9ndF9mb3JjZV93YWtlX2dldChkZXZfcHJpdik7CiAJCWJyZWFrOwogCWNhc2UgNToKIAkJcmV0ID0gaXJvbmxha2VfZG9fcmVzZXQoZGV2LCBmbGFncyk7CkBAIC03NjIsMTQgKzc2Niw2IEBACiAJLnJlc3VtZSA9IGk5MTVfcmVzdW1lLAogCiAJLmRldmljZV9pc19hZ3AgPSBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwLAotCS5lbmFibGVfdmJsYW5rID0gaTkxNV9lbmFibGVfdmJsYW5rLAotCS5kaXNhYmxlX3ZibGFuayA9IGk5MTVfZGlzYWJsZV92YmxhbmssCi0JLmdldF92YmxhbmtfdGltZXN0YW1wID0gaTkxNV9nZXRfdmJsYW5rX3RpbWVzdGFtcCwKLQkuZ2V0X3NjYW5vdXRfcG9zaXRpb24gPSBpOTE1X2dldF9jcnRjX3NjYW5vdXRwb3MsCi0JLmlycV9wcmVpbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwsCi0JLmlycV9wb3N0aW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKLQkuaXJxX3VuaW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwsCi0JLmlycV9oYW5kbGVyID0gaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXIsCiAJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKIAkubWFzdGVyX2NyZWF0ZSA9IGk5MTVfbWFzdGVyX2NyZWF0ZSwKIAkubWFzdGVyX2Rlc3Ryb3kgPSBpOTE1X21hc3Rlcl9kZXN0cm95LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggZWU2NjAzNS4uY2U3OTE0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC0yMTEsNiArMjExLDkgQEAKIAl2b2lkICgqZmRpX2xpbmtfdHJhaW4pKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiAJdm9pZCAoKmluaXRfY2xvY2tfZ2F0aW5nKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAl2b2lkICgqaW5pdF9wY2hfY2xvY2tfZ2F0aW5nKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwlpbnQgKCpxdWV1ZV9mbGlwKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIAkvKiBjbG9jayB1cGRhdGVzIGZvciBtb2RlIHNldCAqLwogCS8qIGN1cnNvciB1cGRhdGVzICovCiAJLyogcmVuZGVyIGNsb2NrIGluY3JlYXNlL2RlY3JlYXNlICovCkBAIC0yNTksNiArMjYyLDcgQEAKIH07CiAKICNkZWZpbmUgUVVJUktfUElQRUFfRk9SQ0UgKDE8PDApCisjZGVmaW5lIFFVSVJLX0xWRFNfU1NDX0RJU0FCTEUgKDE8PDEpCiAKIHN0cnVjdCBpbnRlbF9mYmRldjsKIApAQCAtNzE2LDYgKzcyMCw3IEBACiAJc3RydWN0IGludGVsX2ZiZGV2ICpmYmRldjsKIAogCXN0cnVjdCBkcm1fcHJvcGVydHkgKmJyb2FkY2FzdF9yZ2JfcHJvcGVydHk7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqZm9yY2VfYXVkaW9fcHJvcGVydHk7CiAKIAlhdG9taWNfdCBmb3JjZXdha2VfY291bnQ7CiB9IGRybV9pOTE1X3ByaXZhdGVfdDsKQEAgLTkwOSwxMyArOTE0LDYgQEAKIAl9IG1tOwogfTsKIAotZW51bSBpbnRlbF9jaGlwX2ZhbWlseSB7Ci0JQ0hJUF9JOFhYID0gMHgwMSwKLQlDSElQX0k5WFggPSAweDAyLAotCUNISVBfSTkxNSA9IDB4MDQsCi0JQ0hJUF9JOTY1ID0gMHgwOCwKLX07Ci0KICNkZWZpbmUgSU5URUxfSU5GTyhkZXYpCSgoKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICopIChkZXYpLT5kZXZfcHJpdmF0ZSktPmluZm8pCiAKICNkZWZpbmUgSVNfSTgzMChkZXYpCQkoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgzNTc3KQpAQCAtMTAwMCw4ICs5OTgsNiBAQAogCiBleHRlcm4gaW50IGk5MTVfc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogZXh0ZXJuIGludCBpOTE1X3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGk5MTVfc2F2ZV9kaXNwbGF5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgaTkxNV9yZXN0b3JlX2Rpc3BsYXkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IGk5MTVfbWFzdGVyX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKTsKIGV4dGVybiB2b2lkIGk5MTVfbWFzdGVyX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3Rlcik7CiAKQEAgLTEwMzYsMzMgKzEwMzIsMTIgQEAKIGV4dGVybiBpbnQgaTkxNV9pcnFfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIAotZXh0ZXJuIGlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7Ci1leHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7Ci1leHRlcm4gaW50IGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotCi1leHRlcm4gaXJxcmV0dXJuX3QgaXJvbmxha2VfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIGlyb25sYWtlX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIGludCBpcm9ubGFrZV9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBpcm9ubGFrZV9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotCi1leHRlcm4gaXJxcmV0dXJuX3QgaXZ5YnJpZGdlX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7Ci1leHRlcm4gdm9pZCBpdnlicmlkZ2VfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IGl2eWJyaWRnZV9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBpdnlicmlkZ2VfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGludGVsX2lycV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBleHRlcm4gaW50IGk5MTVfdmJsYW5rX3BpcGVfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogZXh0ZXJuIGludCBpOTE1X3ZibGFua19waXBlX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKLWV4dGVybiBpbnQgaTkxNV9lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKLWV4dGVybiB2b2lkIGk5MTVfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIGludCBpcm9ubGFrZV9lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKLWV4dGVybiB2b2lkIGlyb25sYWtlX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKLWV4dGVybiBpbnQgaXZ5YnJpZGdlX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIHZvaWQgaXZ5YnJpZGdlX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKLWV4dGVybiB1MzIgaTkxNV9nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwotZXh0ZXJuIHUzMiBnbTQ1X2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gaW50IGk5MTVfdmJsYW5rX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiAKQEAgLTEwNzMsMTMgKzEwNDgsNiBAQAogaTkxNV9kaXNhYmxlX3BpcGVzdGF0KGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBwaXBlLCB1MzIgbWFzayk7CiAKIHZvaWQgaW50ZWxfZW5hYmxlX2FzbGUgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotaW50IGk5MTVfZ2V0X3ZibGFua190aW1lc3RhbXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCi0JCQkgICAgICBpbnQgKm1heF9lcnJvciwKLQkJCSAgICAgIHN0cnVjdCB0aW1ldmFsICp2YmxhbmtfdGltZSwKLQkJCSAgICAgIHVuc2lnbmVkIGZsYWdzKTsKLQotaW50IGk5MTVfZ2V0X2NydGNfc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSwKLQkJCSAgICAgaW50ICp2cG9zLCBpbnQgKmhwb3MpOwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiBleHRlcm4gdm9pZCBpOTE1X2Rlc3Ryb3lfZXJyb3Jfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC0xMjI3LDcgKzExOTUsOSBAQAogdm9pZCBpOTE1X2dlbV9yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSk7CiAKIHVpbnQzMl90Ci1pOTE1X2dlbV9nZXRfdW5mZW5jZWRfZ3R0X2FsaWdubWVudChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKK2k5MTVfZ2VtX2dldF91bmZlbmNlZF9ndHRfYWxpZ25tZW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgIHVpbnQzMl90IHNpemUsCisJCQkJICAgIGludCB0aWxpbmdfbW9kZSk7CiAKIC8qIGk5MTVfZ2VtX2d0dC5jICovCiB2b2lkIGk5MTVfZ2VtX3Jlc3RvcmVfZ3R0X21hcHBpbmdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKaW5kZXggMGIyZTE2Ny4uYTA4N2UxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKICNpbmNsdWRlICJpOTE1X3RyYWNlLmgiCiAjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisjaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtMzU0LDEzICszNTUsMTIgQEAKIAkJICogcGFnZV9vZmZzZXQgPSBvZmZzZXQgd2l0aGluIHBhZ2UKIAkJICogcGFnZV9sZW5ndGggPSBieXRlcyB0byBjb3B5IGZvciB0aGlzIHBhZ2UKIAkJICovCi0JCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgKFBBR0VfU0laRS0xKTsKKwkJcGFnZV9vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShvZmZzZXQpOwogCQlwYWdlX2xlbmd0aCA9IHJlbWFpbjsKIAkJaWYgKChwYWdlX29mZnNldCArIHJlbWFpbikgPiBQQUdFX1NJWkUpCiAJCQlwYWdlX2xlbmd0aCA9IFBBR0VfU0laRSAtIHBhZ2Vfb2Zmc2V0OwogCi0JCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIG9mZnNldCA+PiBQQUdFX1NISUZULAotCQkJCQkgICBHRlBfSElHSFVTRVIgfCBfX0dGUF9SRUNMQUlNQUJMRSk7CisJCXBhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7CiAJCWlmIChJU19FUlIocGFnZSkpCiAJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKIApAQCAtNDUzLDkgKzQ1Myw5IEBACiAJCSAqIGRhdGFfcGFnZV9vZmZzZXQgPSBvZmZzZXQgd2l0aCBkYXRhX3BhZ2VfaW5kZXggcGFnZS4KIAkJICogcGFnZV9sZW5ndGggPSBieXRlcyB0byBjb3B5IGZvciB0aGlzIHBhZ2UKIAkJICovCi0JCXNobWVtX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgflBBR0VfTUFTSzsKKwkJc2htZW1fcGFnZV9vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShvZmZzZXQpOwogCQlkYXRhX3BhZ2VfaW5kZXggPSBkYXRhX3B0ciAvIFBBR0VfU0laRSAtIGZpcnN0X2RhdGFfcGFnZTsKLQkJZGF0YV9wYWdlX29mZnNldCA9IGRhdGFfcHRyICYgflBBR0VfTUFTSzsKKwkJZGF0YV9wYWdlX29mZnNldCA9IG9mZnNldF9pbl9wYWdlKGRhdGFfcHRyKTsKIAogCQlwYWdlX2xlbmd0aCA9IHJlbWFpbjsKIAkJaWYgKChzaG1lbV9wYWdlX29mZnNldCArIHBhZ2VfbGVuZ3RoKSA+IFBBR0VfU0laRSkKQEAgLTQ2MywxMCArNDYzLDExIEBACiAJCWlmICgoZGF0YV9wYWdlX29mZnNldCArIHBhZ2VfbGVuZ3RoKSA+IFBBR0VfU0laRSkKIAkJCXBhZ2VfbGVuZ3RoID0gUEFHRV9TSVpFIC0gZGF0YV9wYWdlX29mZnNldDsKIAotCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCwKLQkJCQkJICAgR0ZQX0hJR0hVU0VSIHwgX19HRlBfUkVDTEFJTUFCTEUpOwotCQlpZiAoSVNfRVJSKHBhZ2UpKQotCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CisJCXBhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7CisJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIocGFnZSk7CisJCQlnb3RvIG91dDsKKwkJfQogCiAJCWlmIChkb19iaXQxN19zd2l6emxpbmcpIHsKIAkJCXNsb3dfc2htZW1fYml0MTdfY29weShwYWdlLApAQCAtNjM4LDggKzYzOSw4IEBACiAJCSAqIHBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0IHdpdGhpbiBwYWdlCiAJCSAqIHBhZ2VfbGVuZ3RoID0gYnl0ZXMgdG8gY29weSBmb3IgdGhpcyBwYWdlCiAJCSAqLwotCQlwYWdlX2Jhc2UgPSAob2Zmc2V0ICYgfihQQUdFX1NJWkUtMSkpOwotCQlwYWdlX29mZnNldCA9IG9mZnNldCAmIChQQUdFX1NJWkUtMSk7CisJCXBhZ2VfYmFzZSA9IG9mZnNldCAmIFBBR0VfTUFTSzsKKwkJcGFnZV9vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShvZmZzZXQpOwogCQlwYWdlX2xlbmd0aCA9IHJlbWFpbjsKIAkJaWYgKChwYWdlX29mZnNldCArIHJlbWFpbikgPiBQQUdFX1NJWkUpCiAJCQlwYWdlX2xlbmd0aCA9IFBBR0VfU0laRSAtIHBhZ2Vfb2Zmc2V0OwpAQCAtNjUwLDcgKzY1MSw2IEBACiAJCSAqLwogCQlpZiAoZmFzdF91c2VyX3dyaXRlKGRldl9wcml2LT5tbS5ndHRfbWFwcGluZywgcGFnZV9iYXNlLAogCQkJCSAgICBwYWdlX29mZnNldCwgdXNlcl9kYXRhLCBwYWdlX2xlbmd0aCkpCi0KIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCXJlbWFpbiAtPSBwYWdlX2xlbmd0aDsKQEAgLTczMCw5ICs3MzAsOSBAQAogCQkgKiBwYWdlX2xlbmd0aCA9IGJ5dGVzIHRvIGNvcHkgZm9yIHRoaXMgcGFnZQogCQkgKi8KIAkJZ3R0X3BhZ2VfYmFzZSA9IG9mZnNldCAmIFBBR0VfTUFTSzsKLQkJZ3R0X3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgflBBR0VfTUFTSzsKKwkJZ3R0X3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2Uob2Zmc2V0KTsKIAkJZGF0YV9wYWdlX2luZGV4ID0gZGF0YV9wdHIgLyBQQUdFX1NJWkUgLSBmaXJzdF9kYXRhX3BhZ2U7Ci0JCWRhdGFfcGFnZV9vZmZzZXQgPSBkYXRhX3B0ciAmIH5QQUdFX01BU0s7CisJCWRhdGFfcGFnZV9vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShkYXRhX3B0cik7CiAKIAkJcGFnZV9sZW5ndGggPSByZW1haW47CiAJCWlmICgoZ3R0X3BhZ2Vfb2Zmc2V0ICsgcGFnZV9sZW5ndGgpID4gUEFHRV9TSVpFKQpAQCAtNzkxLDEzICs3OTEsMTIgQEAKIAkJICogcGFnZV9vZmZzZXQgPSBvZmZzZXQgd2l0aGluIHBhZ2UKIAkJICogcGFnZV9sZW5ndGggPSBieXRlcyB0byBjb3B5IGZvciB0aGlzIHBhZ2UKIAkJICovCi0JCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgKFBBR0VfU0laRS0xKTsKKwkJcGFnZV9vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShvZmZzZXQpOwogCQlwYWdlX2xlbmd0aCA9IHJlbWFpbjsKIAkJaWYgKChwYWdlX29mZnNldCArIHJlbWFpbikgPiBQQUdFX1NJWkUpCiAJCQlwYWdlX2xlbmd0aCA9IFBBR0VfU0laRSAtIHBhZ2Vfb2Zmc2V0OwogCi0JCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIG9mZnNldCA+PiBQQUdFX1NISUZULAotCQkJCQkgICBHRlBfSElHSFVTRVIgfCBfX0dGUF9SRUNMQUlNQUJMRSk7CisJCXBhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7CiAJCWlmIChJU19FUlIocGFnZSkpCiAJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKIApAQCAtODk2LDkgKzg5NSw5IEBACiAJCSAqIGRhdGFfcGFnZV9vZmZzZXQgPSBvZmZzZXQgd2l0aCBkYXRhX3BhZ2VfaW5kZXggcGFnZS4KIAkJICogcGFnZV9sZW5ndGggPSBieXRlcyB0byBjb3B5IGZvciB0aGlzIHBhZ2UKIAkJICovCi0JCXNobWVtX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgflBBR0VfTUFTSzsKKwkJc2htZW1fcGFnZV9vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShvZmZzZXQpOwogCQlkYXRhX3BhZ2VfaW5kZXggPSBkYXRhX3B0ciAvIFBBR0VfU0laRSAtIGZpcnN0X2RhdGFfcGFnZTsKLQkJZGF0YV9wYWdlX29mZnNldCA9IGRhdGFfcHRyICYgflBBR0VfTUFTSzsKKwkJZGF0YV9wYWdlX29mZnNldCA9IG9mZnNldF9pbl9wYWdlKGRhdGFfcHRyKTsKIAogCQlwYWdlX2xlbmd0aCA9IHJlbWFpbjsKIAkJaWYgKChzaG1lbV9wYWdlX29mZnNldCArIHBhZ2VfbGVuZ3RoKSA+IFBBR0VfU0laRSkKQEAgLTkwNiw4ICs5MDUsNyBAQAogCQlpZiAoKGRhdGFfcGFnZV9vZmZzZXQgKyBwYWdlX2xlbmd0aCkgPiBQQUdFX1NJWkUpCiAJCQlwYWdlX2xlbmd0aCA9IFBBR0VfU0laRSAtIGRhdGFfcGFnZV9vZmZzZXQ7CiAKLQkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQsCi0JCQkJCSAgIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKKwkJcGFnZSA9IHNobWVtX3JlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKIAkJaWYgKElTX0VSUihwYWdlKSkgewogCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKIAkJCWdvdG8gb3V0OwpAQCAtMTIxOCwxMSArMTIxNiwxMSBAQAogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQob2JqLCAwLCB0cnVlKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gdW5sb2NrOwotCX0KIAotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIHdyaXRlKTsKLQlpZiAocmV0KQotCQlnb3RvIHVubG9jazsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9iaiwgd3JpdGUpOworCQlpZiAocmV0KQorCQkJZ290byB1bmxvY2s7CisJfQogCiAJaWYgKG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKIAkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3B1dF9mZW5jZShvYmopOwpAQCAtMTM3NiwyNSArMTM3NCwyNCBAQAogfQogCiBzdGF0aWMgdWludDMyX3QKLWk5MTVfZ2VtX2dldF9ndHRfc2l6ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoraTkxNV9nZW1fZ2V0X2d0dF9zaXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHNpemUsIGludCB0aWxpbmdfbW9kZSkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKLQl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IGd0dF9zaXplOwogCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQgfHwKLQkgICAgb2JqLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQotCQlyZXR1cm4gb2JqLT5iYXNlLnNpemU7CisJICAgIHRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCisJCXJldHVybiBzaXplOwogCiAJLyogUHJldmlvdXMgY2hpcHMgbmVlZCBhIHBvd2VyLW9mLXR3byBmZW5jZSByZWdpb24gd2hlbiB0aWxpbmcgKi8KIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gMykKLQkJc2l6ZSA9IDEwMjQqMTAyNDsKKwkJZ3R0X3NpemUgPSAxMDI0KjEwMjQ7CiAJZWxzZQotCQlzaXplID0gNTEyKjEwMjQ7CisJCWd0dF9zaXplID0gNTEyKjEwMjQ7CiAKLQl3aGlsZSAoc2l6ZSA8IG9iai0+YmFzZS5zaXplKQotCQlzaXplIDw8PSAxOworCXdoaWxlIChndHRfc2l6ZSA8IHNpemUpCisJCWd0dF9zaXplIDw8PSAxOwogCi0JcmV0dXJuIHNpemU7CisJcmV0dXJuIGd0dF9zaXplOwogfQogCiAvKioKQEAgLTE0MDUsNTggKzE0MDIsNTIgQEAKICAqIHBvdGVudGlhbCBmZW5jZSByZWdpc3RlciBtYXBwaW5nLgogICovCiBzdGF0aWMgdWludDMyX3QKLWk5MTVfZ2VtX2dldF9ndHRfYWxpZ25tZW50KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9nZXRfZ3R0X2FsaWdubWVudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgdWludDMyX3Qgc2l6ZSwKKwkJCSAgIGludCB0aWxpbmdfbW9kZSkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKLQogCS8qCiAJICogTWluaW11bSBhbGlnbm1lbnQgaXMgNGsgKEdUVCBwYWdlIHNpemUpLCBidXQgbWlnaHQgYmUgZ3JlYXRlcgogCSAqIGlmIGEgZmVuY2UgcmVnaXN0ZXIgaXMgbmVlZGVkIGZvciB0aGUgb2JqZWN0LgogCSAqLwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0IHx8Ci0JICAgIG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKKwkgICAgdGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKIAkJcmV0dXJuIDQwOTY7CiAKIAkvKgogCSAqIFByZXZpb3VzIGNoaXBzIG5lZWQgdG8gYmUgYWxpZ25lZCB0byB0aGUgc2l6ZSBvZiB0aGUgc21hbGxlc3QKIAkgKiBmZW5jZSByZWdpc3RlciB0aGF0IGNhbiBjb250YWluIHRoZSBvYmplY3QuCiAJICovCi0JcmV0dXJuIGk5MTVfZ2VtX2dldF9ndHRfc2l6ZShvYmopOworCXJldHVybiBpOTE1X2dlbV9nZXRfZ3R0X3NpemUoZGV2LCBzaXplLCB0aWxpbmdfbW9kZSk7CiB9CiAKIC8qKgogICogaTkxNV9nZW1fZ2V0X3VuZmVuY2VkX2d0dF9hbGlnbm1lbnQgLSByZXR1cm4gcmVxdWlyZWQgR1RUIGFsaWdubWVudCBmb3IgYW4KICAqCQkJCQkgdW5mZW5jZWQgb2JqZWN0Ci0gKiBAb2JqOiBvYmplY3QgdG8gY2hlY2sKKyAqIEBkZXY6IHRoZSBkZXZpY2UKKyAqIEBzaXplOiBzaXplIG9mIHRoZSBvYmplY3QKKyAqIEB0aWxpbmdfbW9kZTogdGlsaW5nIG1vZGUgb2YgdGhlIG9iamVjdAogICoKICAqIFJldHVybiB0aGUgcmVxdWlyZWQgR1RUIGFsaWdubWVudCBmb3IgYW4gb2JqZWN0LCBvbmx5IHRha2luZyBpbnRvIGFjY291bnQKICAqIHVuZmVuY2VkIHRpbGVkIHN1cmZhY2UgcmVxdWlyZW1lbnRzLgogICovCiB1aW50MzJfdAotaTkxNV9nZW1fZ2V0X3VuZmVuY2VkX2d0dF9hbGlnbm1lbnQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK2k5MTVfZ2VtX2dldF91bmZlbmNlZF9ndHRfYWxpZ25tZW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgIHVpbnQzMl90IHNpemUsCisJCQkJICAgIGludCB0aWxpbmdfbW9kZSkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKLQlpbnQgdGlsZV9oZWlnaHQ7Ci0KIAkvKgogCSAqIE1pbmltdW0gYWxpZ25tZW50IGlzIDRrIChHVFQgcGFnZSBzaXplKSBmb3Igc2FuZSBody4KIAkgKi8KIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCB8fCBJU19HMzMoZGV2KSB8fAotCSAgICBvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCisJICAgIHRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCiAJCXJldHVybiA0MDk2OwogCi0JLyoKLQkgKiBPbGRlciBjaGlwcyBuZWVkIHVuZmVuY2VkIHRpbGVkIGJ1ZmZlcnMgdG8gYmUgYWxpZ25lZCB0byB0aGUgbGVmdAotCSAqIGVkZ2Ugb2YgYW4gZXZlbiB0aWxlIHJvdyAod2hlcmUgdGlsZSByb3dzIGFyZSBjb3VudGVkIGFzIGlmIHRoZSBibyBpcwotCSAqIHBsYWNlZCBpbiBhIGZlbmNlZCBndHQgcmVnaW9uKS4KKwkvKiBQcmV2aW91cyBoYXJkd2FyZSBob3dldmVyIG5lZWRzIHRvIGJlIGFsaWduZWQgdG8gYSBwb3dlci1vZi10d28KKwkgKiB0aWxlIGhlaWdodC4gVGhlIHNpbXBsZXN0IG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgdGhpcyBpcyB0byByZXVzZQorCSAqIHRoZSBwb3dlci1vZi10aWxlIG9iamVjdCBzaXplLgogCSAqLwotCWlmIChJU19HRU4yKGRldikgfHwKLQkgICAgKG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSAmJiBIQVNfMTI4X0JZVEVfWV9USUxJTkcoZGV2KSkpCi0JCXRpbGVfaGVpZ2h0ID0gMzI7Ci0JZWxzZQotCQl0aWxlX2hlaWdodCA9IDg7Ci0KLQlyZXR1cm4gdGlsZV9oZWlnaHQgKiBvYmotPnN0cmlkZSAqIDI7CisJcmV0dXJuIGk5MTVfZ2VtX2dldF9ndHRfc2l6ZShkZXYsIHNpemUsIHRpbGluZ19tb2RlKTsKIH0KIAogaW50CkBAIC0xNTU2LDEyICsxNTQ3LDEwIEBACiAKIAlpbm9kZSA9IG9iai0+YmFzZS5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCW1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCWdmcG1hc2sgfD0gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKTsKKwogCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKLQkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgaSwKLQkJCQkJICAgR0ZQX0hJR0hVU0VSIHwKLQkJCQkJICAgX19HRlBfQ09MRCB8Ci0JCQkJCSAgIF9fR0ZQX1JFQ0xBSU1BQkxFIHwKLQkJCQkJICAgZ2ZwbWFzayk7CisJCXBhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZV9nZnAobWFwcGluZywgaSwgZ2ZwbWFzayk7CiAJCWlmIChJU19FUlIocGFnZSkpCiAJCQlnb3RvIGVycl9wYWdlczsKIApAQCAtMTY5OSwxMyArMTY4OCwxMCBAQAogCS8qIE91ciBnb2FsIGhlcmUgaXMgdG8gcmV0dXJuIGFzIG11Y2ggb2YgdGhlIG1lbW9yeSBhcwogCSAqIGlzIHBvc3NpYmxlIGJhY2sgdG8gdGhlIHN5c3RlbSBhcyB3ZSBhcmUgY2FsbGVkIGZyb20gT09NLgogCSAqIFRvIGRvIHRoaXMgd2UgbXVzdCBpbnN0cnVjdCB0aGUgc2htZnMgdG8gZHJvcCBhbGwgb2YgaXRzCi0JICogYmFja2luZyBwYWdlcywgKm5vdyouIEhlcmUgd2UgbWlycm9yIHRoZSBhY3Rpb25zIHRha2VuCi0JICogd2hlbiBieSBzaG1lbV9kZWxldGVfaW5vZGUoKSB0byByZWxlYXNlIHRoZSBiYWNraW5nIHN0b3JlLgorCSAqIGJhY2tpbmcgcGFnZXMsICpub3cqLgogCSAqLwogCWlub2RlID0gb2JqLT5iYXNlLmZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgMCk7Ci0JaWYgKGlub2RlLT5pX29wLT50cnVuY2F0ZV9yYW5nZSkKLQkJaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKGlub2RlLCAwLCAobG9mZl90KS0xKTsKKwlzaG1lbV90cnVuY2F0ZV9yYW5nZShpbm9kZSwgMCwgKGxvZmZfdCktMSk7CiAKIAlvYmotPm1hZHYgPSBfX0k5MTVfTUFEVl9QVVJHRUQ7CiB9CkBAIC0yMDc4LDggKzIwNjQsOCBAQAogCQlpZiAoIWllcikgewogCQkJRFJNX0VSUk9SKCJzb21ldGhpbmcgKGxpa2VseSB2YmV0b29sKSBkaXNhYmxlZCAiCiAJCQkJICAiaW50ZXJydXB0cywgcmUtZW5hYmxpbmdcbiIpOwotCQkJaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwocmluZy0+ZGV2KTsKLQkJCWk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChyaW5nLT5kZXYpOworCQkJcmluZy0+ZGV2LT5kcml2ZXItPmlycV9wcmVpbnN0YWxsKHJpbmctPmRldik7CisJCQlyaW5nLT5kZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsKHJpbmctPmRldik7CiAJCX0KIAogCQl0cmFjZV9pOTE1X2dlbV9yZXF1ZXN0X3dhaXRfYmVnaW4ocmluZywgc2Vxbm8pOwpAQCAtMjc1MCw5ICsyNzM2LDE2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWZlbmNlX3NpemUgPSBpOTE1X2dlbV9nZXRfZ3R0X3NpemUob2JqKTsKLQlmZW5jZV9hbGlnbm1lbnQgPSBpOTE1X2dlbV9nZXRfZ3R0X2FsaWdubWVudChvYmopOwotCXVuZmVuY2VkX2FsaWdubWVudCA9IGk5MTVfZ2VtX2dldF91bmZlbmNlZF9ndHRfYWxpZ25tZW50KG9iaik7CisJZmVuY2Vfc2l6ZSA9IGk5MTVfZ2VtX2dldF9ndHRfc2l6ZShkZXYsCisJCQkJCSAgIG9iai0+YmFzZS5zaXplLAorCQkJCQkgICBvYmotPnRpbGluZ19tb2RlKTsKKwlmZW5jZV9hbGlnbm1lbnQgPSBpOTE1X2dlbV9nZXRfZ3R0X2FsaWdubWVudChkZXYsCisJCQkJCQkgICAgIG9iai0+YmFzZS5zaXplLAorCQkJCQkJICAgICBvYmotPnRpbGluZ19tb2RlKTsKKwl1bmZlbmNlZF9hbGlnbm1lbnQgPQorCQlpOTE1X2dlbV9nZXRfdW5mZW5jZWRfZ3R0X2FsaWdubWVudChkZXYsCisJCQkJCQkgICAgb2JqLT5iYXNlLnNpemUsCisJCQkJCQkgICAgb2JqLT50aWxpbmdfbW9kZSk7CiAKIAlpZiAoYWxpZ25tZW50ID09IDApCiAJCWFsaWdubWVudCA9IG1hcF9hbmRfZmVuY2VhYmxlID8gZmVuY2VfYWxpZ25tZW50IDoKQEAgLTI5MjQsOCArMjkxNyw2IEBACiAJICovCiAJd21iKCk7CiAKLQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKLQogCW9sZF93cml0ZV9kb21haW4gPSBvYmotPmJhc2Uud3JpdGVfZG9tYWluOwogCW9iai0+YmFzZS53cml0ZV9kb21haW4gPSAwOwogCkBAIC0zNTY1LDYgKzM1NTYsNyBAQAogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKIAogCW9iaiA9IGt6YWxsb2Moc2l6ZW9mKCpvYmopLCBHRlBfS0VSTkVMKTsKIAlpZiAob2JqID09IE5VTEwpCkBAIC0zNTc1LDYgKzM1NjcsOSBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwltYXBwaW5nID0gb2JqLT5iYXNlLmZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKKwltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVIgfCBfX0dGUF9SRUNMQUlNQUJMRSk7CisKIAlpOTE1X2dlbV9pbmZvX2FkZF9vYmooZGV2X3ByaXYsIHNpemUpOwogCiAJb2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CkBAIC0zOTUwLDggKzM5NDUsNyBAQAogCiAJcGFnZV9jb3VudCA9IG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpFOwogCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSByZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIGksCi0JCQkJCQkJR0ZQX0hJR0hVU0VSIHwgX19HRlBfUkVDTEFJTUFCTEUpOworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHNobWVtX3JlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIGkpOwogCQlpZiAoIUlTX0VSUihwYWdlKSkgewogCQkJY2hhciAqZHN0ID0ga21hcF9hdG9taWMocGFnZSk7CiAJCQltZW1jcHkoZHN0LCB2YWRkciArIGkqUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwpAQCAtNDAxMiw4ICs0MDA2LDcgQEAKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJCWNoYXIgKmRzdCwgKnNyYzsKIAotCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBpLAotCQkJCQkgICBHRlBfSElHSFVTRVIgfCBfX0dGUF9SRUNMQUlNQUJMRSk7CisJCXBhZ2UgPSBzaG1lbV9yZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBpKTsKIAkJaWYgKElTX0VSUihwYWdlKSkKIAkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKaW5kZXggMjBhNGNjNS4uNDkzNGNmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYwpAQCAtMTg3LDEwICsxODcsNiBAQAogCWlmICgoZmx1c2hfZG9tYWlucyB8IGludmFsaWRhdGVfZG9tYWlucykgJiBJOTE1X0dFTV9ET01BSU5fQ1BVKQogCQlpOTE1X2dlbV9jbGZsdXNoX29iamVjdChvYmopOwogCi0JLyogYmxvdyBhd2F5IG1hcHBpbmdzIGlmIG1hcHBlZCB0aHJvdWdoIEdUVCAqLwotCWlmICgoZmx1c2hfZG9tYWlucyB8IGludmFsaWRhdGVfZG9tYWlucykgJiBJOTE1X0dFTV9ET01BSU5fR1RUKQotCQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKLQogCWlmIChvYmotPmJhc2UucGVuZGluZ193cml0ZV9kb21haW4pCiAJCWNkLT5mbGlwcyB8PSBhdG9taWNfcmVhZCgmb2JqLT5wZW5kaW5nX2ZsaXApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV90aWxpbmcuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jCmluZGV4IDgyZDcwZmQuLjk5YzRmYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jCkBAIC0zNDgsNyArMzQ4LDkgQEAKIAkJLyogUmViaW5kIGlmIHdlIG5lZWQgYSBjaGFuZ2Ugb2YgYWxpZ25tZW50ICovCiAJCWlmICghb2JqLT5tYXBfYW5kX2ZlbmNlYWJsZSkgewogCQkJdTMyIHVuZmVuY2VkX2FsaWdubWVudCA9Ci0JCQkJaTkxNV9nZW1fZ2V0X3VuZmVuY2VkX2d0dF9hbGlnbm1lbnQob2JqKTsKKwkJCQlpOTE1X2dlbV9nZXRfdW5mZW5jZWRfZ3R0X2FsaWdubWVudChkZXYsCisJCQkJCQkJCSAgICBvYmotPmJhc2Uuc2l6ZSwKKwkJCQkJCQkJICAgIGFyZ3MtPnRpbGluZ19tb2RlKTsKIAkJCWlmIChvYmotPmd0dF9vZmZzZXQgJiAodW5mZW5jZWRfYWxpZ25tZW50IC0gMSkpCiAJCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwppbmRleCBiNzk2MTlhLi4zYjAzZjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogLyogQ2FsbGVkIGZyb20gZHJtIGdlbmVyaWMgY29kZSwgcGFzc2VkIGEgJ2NydGMnLCB3aGljaAogICogd2UgdXNlIGFzIGEgcGlwZSBpbmRleAogICovCi11MzIgaTkxNV9nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCitzdGF0aWMgdTMyIGk5MTVfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBoaWdoX2ZyYW1lOwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJcmV0dXJuIChoaWdoMSA8PCA4KSB8IGxvdzsKIH0KIAotdTMyIGdtNDVfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQorc3RhdGljIHUzMiBnbTQ1X2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZWcgPSBQSVBFX0ZSTUNPVU5UX0dNNDUocGlwZSk7CkBAIC0xOTgsNyArMTk4LDcgQEAKIAlyZXR1cm4gSTkxNV9SRUFEKHJlZyk7CiB9CiAKLWludCBpOTE1X2dldF9jcnRjX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUsCitzdGF0aWMgaW50IGk5MTVfZ2V0X2NydGNfc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSwKIAkJCSAgICAgaW50ICp2cG9zLCBpbnQgKmhwb3MpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTI2NCw3ICsyNjQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBpOTE1X2dldF92YmxhbmtfdGltZXN0YW1wKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlLAorc3RhdGljIGludCBpOTE1X2dldF92YmxhbmtfdGltZXN0YW1wKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlLAogCQkJICAgICAgaW50ICptYXhfZXJyb3IsCiAJCQkgICAgICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rX3RpbWUsCiAJCQkgICAgICB1bnNpZ25lZCBmbGFncykKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCQlEUk1fREVCVUdfRFJJVkVSKCJQQ0ggdHJhbnNjb2RlciBBIHVuZGVycnVuIGludGVycnVwdFxuIik7CiB9CiAKLWlycXJldHVybl90IGl2eWJyaWRnZV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCitzdGF0aWMgaXJxcmV0dXJuX3QgaXZ5YnJpZGdlX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNTE3LDcgKzUxNyw3IEBACiAJaWYgKGRlX2lpciAmIERFX1BJUEVBX1ZCTEFOS19JVkIpCiAJCWRybV9oYW5kbGVfdmJsYW5rKGRldiwgMCk7CiAKLQlpZiAoZGVfaWlyICYgREVfUElQRUJfVkJMQU5LX0lWQik7CisJaWYgKGRlX2lpciAmIERFX1BJUEVCX1ZCTEFOS19JVkIpCiAJCWRybV9oYW5kbGVfdmJsYW5rKGRldiwgMSk7CiAKIAkvKiBjaGVjayBldmVudCBmcm9tIFBDSCAqLwpAQCAtNTUwLDcgKzU1MCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaXJxcmV0dXJuX3QgaXJvbmxha2VfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQorc3RhdGljIGlycXJldHVybl90IGlyb25sYWtlX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTIwOSw3ICsxMjA5LDcgQEAKIAl9CiB9CiAKLWlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKK3N0YXRpYyBpcnFyZXR1cm5fdCBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBhcmc7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE0NTQsNyArMTQ1NCw3IEBACiAvKiBDYWxsZWQgZnJvbSBkcm0gZ2VuZXJpYyBjb2RlLCBwYXNzZWQgJ2NydGMnIHdoaWNoCiAgKiB3ZSB1c2UgYXMgYSBwaXBlIGluZGV4CiAgKi8KLWludCBpOTE1X2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCitzdGF0aWMgaW50IGk5MTVfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CkBAIC0xNDc4LDcgKzE0NzgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaXJvbmxha2VfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKK3N0YXRpYyBpbnQgaXJvbmxha2VfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CkBAIC0xNDk0LDcgKzE0OTQsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaXZ5YnJpZGdlX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCitzdGF0aWMgaW50IGl2eWJyaWRnZV9lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKQEAgLTE1MTMsNyArMTUxMyw3IEBACiAvKiBDYWxsZWQgZnJvbSBkcm0gZ2VuZXJpYyBjb2RlLCBwYXNzZWQgJ2NydGMnIHdoaWNoCiAgKiB3ZSB1c2UgYXMgYSBwaXBlIGluZGV4CiAgKi8KLXZvaWQgaTkxNV9kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKK3N0YXRpYyB2b2lkIGk5MTVfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwpAQCAtMTUyOSw3ICsxNTI5LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIH0KIAotdm9pZCBpcm9ubGFrZV9kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKQEAgLTE1NDAsNyArMTU0MCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CiB9CiAKLXZvaWQgaXZ5YnJpZGdlX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQorc3RhdGljIHZvaWQgaXZ5YnJpZGdlX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKQEAgLTE3MjgsNyArMTcyOCw3IEBACiAKIC8qIGRybV9kbWEuaCBob29rcwogKi8KLXZvaWQgaXJvbmxha2VfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTc0MCw2ICsxNzQwLDE3IEBACiAJCUlOSVRfV09SSygmZGV2X3ByaXYtPnJwc193b3JrLCBnZW42X3BtX3Jwc193b3JrKTsKIAogCUk5MTVfV1JJVEUoSFdTVEFNLCAweGVmZmUpOworCWlmIChJU19HRU42KGRldikgfHwgSVNfR0VONyhkZXYpKSB7CisJCS8qIFdvcmthcm91bmQgc3RhbGxzIG9ic2VydmVkIG9uIFNhbmR5IEJyaWRnZSBHUFVzIGJ5CisJCSAqIG1ha2luZyB0aGUgYmxpdHRlciBjb21tYW5kIHN0cmVhbWVyIGdlbmVyYXRlIGEKKwkJICogd3JpdGUgdG8gdGhlIEhhcmR3YXJlIFN0YXR1cyBQYWdlIGZvcgorCQkgKiBNSV9VU0VSX0lOVEVSUlVQVC4gIFRoaXMgYXBwZWFycyB0byBzZXJpYWxpemUgdGhlCisJCSAqIHByZXZpb3VzIHNlcW5vIHdyaXRlIG91dCBiZWZvcmUgdGhlIGludGVycnVwdAorCQkgKiBoYXBwZW5zLgorCQkgKi8KKwkJSTkxNV9XUklURShHRU42X0JMSVRURVJfSFdTVEFNLCB+R0VONl9CTElUVEVSX1VTRVJfSU5URVJSVVBUKTsKKwkJSTkxNV9XUklURShHRU42X0JTRF9IV1NUQU0sIH5HRU42X0JTRF9VU0VSX0lOVEVSUlVQVCk7CisJfQogCiAJLyogWFhYIGhvdHBsdWcgZnJvbSBQQ0ggKi8KIApAQCAtMTc1OCw3ICsxNzY5LDcgQEAKIAlQT1NUSU5HX1JFQUQoU0RFSUVSKTsKIH0KIAotaW50IGlyb25sYWtlX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBpcm9ubGFrZV9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCS8qIGVuYWJsZSBraW5kIG9mIGludGVycnVwdHMgYWx3YXlzIGVuYWJsZWQgKi8KQEAgLTE4MzAsNyArMTg0MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpdnlicmlkZ2VfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGl2eWJyaWRnZV9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCS8qIGVuYWJsZSBraW5kIG9mIGludGVycnVwdHMgYWx3YXlzIGVuYWJsZWQgKi8KQEAgLTE4ODAsNyArMTg5MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWludCBwaXBlOwpAQCAtMTkwNyw3ICsxOTE4LDcgQEAKICAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGludGVsX21vZGVzZXRfaW5pdCBvciBob3RwbHVnIGludGVycnVwdHMgd29uJ3QgYmUKICAqIGVuYWJsZWQgY29ycmVjdGx5LgogICovCi1pbnQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGVuYWJsZV9tYXNrID0gSTkxNV9JTlRFUlJVUFRfRU5BQkxFX0ZJWCB8IEk5MTVfSU5URVJSVVBUX0VOQUJMRV9WQVI7CkBAIC0xOTgzLDcgKzE5OTQsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGlyb25sYWtlX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0yMDAzLDcgKzIwMTQsNyBAQAogCUk5MTVfV1JJVEUoR1RJSVIsIEk5MTVfUkVBRChHVElJUikpOwogfQogCi12b2lkIGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHBpcGU7CkBAIC0yMDI5LDMgKzIwNDAsNDEgQEAKIAkJCSAgIEk5MTVfUkVBRChQSVBFU1RBVChwaXBlKSkgJiAweDgwMDBmZmZmKTsKIAlJOTE1X1dSSVRFKElJUiwgSTkxNV9SRUFEKElJUikpOwogfQorCit2b2lkIGludGVsX2lycV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRlciA9IGk5MTVfZ2V0X3ZibGFua19jb3VudGVyOworCWRldi0+bWF4X3ZibGFua19jb3VudCA9IDB4ZmZmZmZmOyAvKiBvbmx5IDI0IGJpdHMgb2YgZnJhbWUgY291bnQgKi8KKwlpZiAoSVNfRzRYKGRldikgfHwgSVNfR0VONShkZXYpIHx8IElTX0dFTjYoZGV2KSB8fCBJU19JVllCUklER0UoZGV2KSkgeworCQlkZXYtPm1heF92YmxhbmtfY291bnQgPSAweGZmZmZmZmZmOyAvKiBmdWxsIDMyIGJpdCBjb3VudGVyICovCisJCWRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIgPSBnbTQ1X2dldF92YmxhbmtfY291bnRlcjsKKwl9CisKKworCWRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX3RpbWVzdGFtcCA9IGk5MTVfZ2V0X3ZibGFua190aW1lc3RhbXA7CisJZGV2LT5kcml2ZXItPmdldF9zY2Fub3V0X3Bvc2l0aW9uID0gaTkxNV9nZXRfY3J0Y19zY2Fub3V0cG9zOworCisJaWYgKElTX0lWWUJSSURHRShkZXYpKSB7CisJCS8qIFNoYXJlIHByZSAmIHVuaW5zdGFsbCBoYW5kbGVycyB3aXRoIElMSy9TTkIgKi8KKwkJZGV2LT5kcml2ZXItPmlycV9oYW5kbGVyID0gaXZ5YnJpZGdlX2lycV9oYW5kbGVyOworCQlkZXYtPmRyaXZlci0+aXJxX3ByZWluc3RhbGwgPSBpcm9ubGFrZV9pcnFfcHJlaW5zdGFsbDsKKwkJZGV2LT5kcml2ZXItPmlycV9wb3N0aW5zdGFsbCA9IGl2eWJyaWRnZV9pcnFfcG9zdGluc3RhbGw7CisJCWRldi0+ZHJpdmVyLT5pcnFfdW5pbnN0YWxsID0gaXJvbmxha2VfaXJxX3VuaW5zdGFsbDsKKwkJZGV2LT5kcml2ZXItPmVuYWJsZV92YmxhbmsgPSBpdnlicmlkZ2VfZW5hYmxlX3ZibGFuazsKKwkJZGV2LT5kcml2ZXItPmRpc2FibGVfdmJsYW5rID0gaXZ5YnJpZGdlX2Rpc2FibGVfdmJsYW5rOworCX0gZWxzZSBpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CisJCWRldi0+ZHJpdmVyLT5pcnFfaGFuZGxlciA9IGlyb25sYWtlX2lycV9oYW5kbGVyOworCQlkZXYtPmRyaXZlci0+aXJxX3ByZWluc3RhbGwgPSBpcm9ubGFrZV9pcnFfcHJlaW5zdGFsbDsKKwkJZGV2LT5kcml2ZXItPmlycV9wb3N0aW5zdGFsbCA9IGlyb25sYWtlX2lycV9wb3N0aW5zdGFsbDsKKwkJZGV2LT5kcml2ZXItPmlycV91bmluc3RhbGwgPSBpcm9ubGFrZV9pcnFfdW5pbnN0YWxsOworCQlkZXYtPmRyaXZlci0+ZW5hYmxlX3ZibGFuayA9IGlyb25sYWtlX2VuYWJsZV92Ymxhbms7CisJCWRldi0+ZHJpdmVyLT5kaXNhYmxlX3ZibGFuayA9IGlyb25sYWtlX2Rpc2FibGVfdmJsYW5rOworCX0gZWxzZSB7CisJCWRldi0+ZHJpdmVyLT5pcnFfcHJlaW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsOworCQlkZXYtPmRyaXZlci0+aXJxX3Bvc3RpbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsOworCQlkZXYtPmRyaXZlci0+aXJxX3VuaW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGw7CisJCWRldi0+ZHJpdmVyLT5pcnFfaGFuZGxlciA9IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyOworCQlkZXYtPmRyaXZlci0+ZW5hYmxlX3ZibGFuayA9IGk5MTVfZW5hYmxlX3ZibGFuazsKKwkJZGV2LT5kcml2ZXItPmRpc2FibGVfdmJsYW5rID0gaTkxNV9kaXNhYmxlX3ZibGFuazsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAppbmRleCAyZjk2N2FmLi41ZDVkZWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKQEAgLTUzMSw2ICs1MzEsNyBAQAogI2RlZmluZSAgIEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTF9SQ19JTERMX01FU1NBR0VfRU5BQkxFCQkwCiAjZGVmaW5lICAgR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MX0lETEVfSU5ESUNBVE9SCQkJKDEgPDwgMykKIAorI2RlZmluZSBHRU42X0JTRF9IV1NUQU0JCQkweDEyMDk4CiAjZGVmaW5lIEdFTjZfQlNEX0lNUgkJCTB4MTIwYTgKICNkZWZpbmUgICBHRU42X0JTRF9VU0VSX0lOVEVSUlVQVAkoMSA8PCAxMikKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zdXNwZW5kLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYwppbmRleCA2MGE5NGQyLi41MjU3Y2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYwpAQCAtNTk3LDcgKzU5Nyw3IEBACiAJcmV0dXJuOwogfQogCi12b2lkIGk5MTVfc2F2ZV9kaXNwbGF5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpOTE1X3NhdmVfZGlzcGxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTY4OSw3ICs2ODksNyBAQAogCWk5MTVfc2F2ZV92Z2EoZGV2KTsKIH0KIAotdm9pZCBpOTE1X3Jlc3RvcmVfZGlzcGxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaTkxNV9yZXN0b3JlX2Rpc3BsYXkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC03ODAsNiArNzgwLDcgQEAKIAkJSTkxNV9XUklURShDUFVfVkdBQ05UUkwsIGRldl9wcml2LT5zYXZlVkdBQ05UUkwpOwogCWVsc2UKIAkJSTkxNV9XUklURShWR0FDTlRSTCwgZGV2X3ByaXYtPnNhdmVWR0FDTlRSTCk7CisKIAlJOTE1X1dSSVRFKFZHQTAsIGRldl9wcml2LT5zYXZlVkdBMCk7CiAJSTkxNV9XUklURShWR0ExLCBkZXZfcHJpdi0+c2F2ZVZHQTEpOwogCUk5MTVfV1JJVEUoVkdBX1BELCBkZXZfcHJpdi0+c2F2ZVZHQV9QRCk7CkBAIC03OTYsNiArNzk3LDggQEAKIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldi0+cGRldiwgTEJCLCAmZGV2X3ByaXYtPnNhdmVMQkIpOwogCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCiAJLyogSGFyZHdhcmUgc3RhdHVzIHBhZ2UgKi8KIAlkZXZfcHJpdi0+c2F2ZUhXUyA9IEk5MTVfUkVBRChIV1NfUEdBKTsKIApAQCAtODM1LDYgKzgzOCw4IEBACiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKIAkJZGV2X3ByaXYtPnNhdmVTV0YyW2ldID0gSTkxNV9SRUFEKFNXRjMwICsgKGkgPDwgMikpOwogCisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODQ1LDYgKzg1MCw4IEBACiAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LT5wZGV2LCBMQkIsIGRldl9wcml2LT5zYXZlTEJCKTsKIAorCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwogCS8qIEhhcmR3YXJlIHN0YXR1cyBwYWdlICovCiAJSTkxNV9XUklURShIV1NfUEdBLCBkZXZfcHJpdi0+c2F2ZUhXUyk7CiAKQEAgLTg2Miw2ICs4NjksNyBAQAogCQlJOTE1X1dSSVRFKElFUiwgZGV2X3ByaXYtPnNhdmVJRVIpOwogCQlJOTE1X1dSSVRFKElNUiwgZGV2X3ByaXYtPnNhdmVJTVIpOwogCX0KKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCWludGVsX2luaXRfY2xvY2tfZ2F0aW5nKGRldik7CiAKQEAgLTg3Myw2ICs4ODEsOCBAQAogCWlmIChJU19HRU42KGRldikpCiAJCWdlbjZfZW5hYmxlX3JwcyhkZXZfcHJpdik7CiAKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKIAkvKiBDYWNoZSBtb2RlIHN0YXRlICovCiAJSTkxNV9XUklURSAoQ0FDSEVfTU9ERV8wLCBkZXZfcHJpdi0+c2F2ZUNBQ0hFX01PREVfMCB8IDB4ZmZmZjAwMDApOwogCkBAIC04ODYsNiArODk2LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogCQlJOTE1X1dSSVRFKFNXRjMwICsgKGkgPDwgMiksIGRldl9wcml2LT5zYXZlU1dGMltpXSk7CiAKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwogCWludGVsX2kyY19yZXNldChkZXYpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jCmluZGV4IGU5M2Y5M2MuLjA5NzlkODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jCkBAIC0yODgsNiArMjg4LDggQEAKIAkJICogVGhpcyBtYXkgYmUgYSBEVkktSSBjb25uZWN0b3Igd2l0aCBhIHNoYXJlZCBEREMKIAkJICogbGluayBiZXR3ZWVuIGFuYWxvZyBhbmQgZGlnaXRhbCBvdXRwdXRzLCBzbyB3ZQogCQkgKiBoYXZlIHRvIGNoZWNrIHRoZSBFRElEIGlucHV0IHNwZWMgb2YgdGhlIGF0dGFjaGVkIGRldmljZS4KKwkJICoKKwkJICogT24gdGhlIG90aGVyIGhhbmQsIHdoYXQgc2hvdWxkIHdlIGRvIGlmIGl0IGlzIGEgYnJva2VuIEVESUQ/CiAJCSAqLwogCQlpZiAoZWRpZCAhPSBOVUxMKSB7CiAJCQlpc19kaWdpdGFsID0gZWRpZC0+aW5wdXQgJiBEUk1fRURJRF9JTlBVVF9ESUdJVEFMOwpAQCAtMjk4LDYgKzMwMCw4IEBACiAJCWlmICghaXNfZGlnaXRhbCkgewogCQkJRFJNX0RFQlVHX0tNUygiQ1JUIGRldGVjdGVkIHZpYSBEREM6MHg1MCBbRURJRF1cbiIpOwogCQkJcmV0dXJuIHRydWU7CisJCX0gZWxzZSB7CisJCQlEUk1fREVCVUdfS01TKCJDUlQgbm90IGRldGVjdGVkIHZpYSBEREM6MHg1MCBbRURJRCByZXBvcnRzIGEgZGlnaXRhbCBwYW5lbF1cbiIpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKaW5kZXggZjU1M2RkZmQuLjBmMWM3OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKQEAgLTM5ODMsNTQgKzM5ODMsNiBAQAogI2RlZmluZSBJTEtfTFAwX1BMQU5FX0xBVEVOQ1kJCTcwMAogI2RlZmluZSBJTEtfTFAwX0NVUlNPUl9MQVRFTkNZCQkxMzAwCiAKLXN0YXRpYyBib29sIGlyb25sYWtlX2NvbXB1dGVfd20wKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJIGludCBwaXBlLAotCQkJCSBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqZGlzcGxheSwKLQkJCQkgaW50IGRpc3BsYXlfbGF0ZW5jeV9ucywKLQkJCQkgY29uc3Qgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgKmN1cnNvciwKLQkJCQkgaW50IGN1cnNvcl9sYXRlbmN5X25zLAotCQkJCSBpbnQgKnBsYW5lX3dtLAotCQkJCSBpbnQgKmN1cnNvcl93bSkKLXsKLQlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7Ci0JaW50IGh0b3RhbCwgaGRpc3BsYXksIGNsb2NrLCBwaXhlbF9zaXplOwotCWludCBsaW5lX3RpbWVfdXMsIGxpbmVfY291bnQ7Ci0JaW50IGVudHJpZXMsIHRsYl9taXNzOwotCi0JY3J0YyA9IGludGVsX2dldF9jcnRjX2Zvcl9waXBlKGRldiwgcGlwZSk7Ci0JaWYgKGNydGMtPmZiID09IE5VTEwgfHwgIWNydGMtPmVuYWJsZWQpCi0JCXJldHVybiBmYWxzZTsKLQotCWh0b3RhbCA9IGNydGMtPm1vZGUuaHRvdGFsOwotCWhkaXNwbGF5ID0gY3J0Yy0+bW9kZS5oZGlzcGxheTsKLQljbG9jayA9IGNydGMtPm1vZGUuY2xvY2s7Ci0JcGl4ZWxfc2l6ZSA9IGNydGMtPmZiLT5iaXRzX3Blcl9waXhlbCAvIDg7Ci0KLQkvKiBVc2UgdGhlIHNtYWxsIGJ1ZmZlciBtZXRob2QgdG8gY2FsY3VsYXRlIHBsYW5lIHdhdGVybWFyayAqLwotCWVudHJpZXMgPSAoKGNsb2NrICogcGl4ZWxfc2l6ZSAvIDEwMDApICogZGlzcGxheV9sYXRlbmN5X25zKSAvIDEwMDA7Ci0JdGxiX21pc3MgPSBkaXNwbGF5LT5maWZvX3NpemUqZGlzcGxheS0+Y2FjaGVsaW5lX3NpemUgLSBoZGlzcGxheSAqIDg7Ci0JaWYgKHRsYl9taXNzID4gMCkKLQkJZW50cmllcyArPSB0bGJfbWlzczsKLQllbnRyaWVzID0gRElWX1JPVU5EX1VQKGVudHJpZXMsIGRpc3BsYXktPmNhY2hlbGluZV9zaXplKTsKLQkqcGxhbmVfd20gPSBlbnRyaWVzICsgZGlzcGxheS0+Z3VhcmRfc2l6ZTsKLQlpZiAoKnBsYW5lX3dtID4gKGludClkaXNwbGF5LT5tYXhfd20pCi0JCSpwbGFuZV93bSA9IGRpc3BsYXktPm1heF93bTsKLQotCS8qIFVzZSB0aGUgbGFyZ2UgYnVmZmVyIG1ldGhvZCB0byBjYWxjdWxhdGUgY3Vyc29yIHdhdGVybWFyayAqLwotCWxpbmVfdGltZV91cyA9ICgoaHRvdGFsICogMTAwMCkgLyBjbG9jayk7Ci0JbGluZV9jb3VudCA9IChjdXJzb3JfbGF0ZW5jeV9ucyAvIGxpbmVfdGltZV91cyArIDEwMDApIC8gMTAwMDsKLQllbnRyaWVzID0gbGluZV9jb3VudCAqIDY0ICogcGl4ZWxfc2l6ZTsKLQl0bGJfbWlzcyA9IGN1cnNvci0+Zmlmb19zaXplKmN1cnNvci0+Y2FjaGVsaW5lX3NpemUgLSBoZGlzcGxheSAqIDg7Ci0JaWYgKHRsYl9taXNzID4gMCkKLQkJZW50cmllcyArPSB0bGJfbWlzczsKLQllbnRyaWVzID0gRElWX1JPVU5EX1VQKGVudHJpZXMsIGN1cnNvci0+Y2FjaGVsaW5lX3NpemUpOwotCSpjdXJzb3Jfd20gPSBlbnRyaWVzICsgY3Vyc29yLT5ndWFyZF9zaXplOwotCWlmICgqY3Vyc29yX3dtID4gKGludCljdXJzb3ItPm1heF93bSkKLQkJKmN1cnNvcl93bSA9IChpbnQpY3Vyc29yLT5tYXhfd207Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQogLyoKICAqIENoZWNrIHRoZSB3bSByZXN1bHQuCiAgKgpAQCAtNDEzOSwxMiArNDA5MSwxMiBAQAogCXVuc2lnbmVkIGludCBlbmFibGVkOwogCiAJZW5hYmxlZCA9IDA7Ci0JaWYgKGlyb25sYWtlX2NvbXB1dGVfd20wKGRldiwgMCwKLQkJCQkgJmlyb25sYWtlX2Rpc3BsYXlfd21faW5mbywKLQkJCQkgSUxLX0xQMF9QTEFORV9MQVRFTkNZLAotCQkJCSAmaXJvbmxha2VfY3Vyc29yX3dtX2luZm8sCi0JCQkJIElMS19MUDBfQ1VSU09SX0xBVEVOQ1ksCi0JCQkJICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKKwlpZiAoZzR4X2NvbXB1dGVfd20wKGRldiwgMCwKKwkJCSAgICAmaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLAorCQkJICAgIElMS19MUDBfUExBTkVfTEFURU5DWSwKKwkJCSAgICAmaXJvbmxha2VfY3Vyc29yX3dtX2luZm8sCisJCQkgICAgSUxLX0xQMF9DVVJTT1JfTEFURU5DWSwKKwkJCSAgICAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7CiAJCUk5MTVfV1JJVEUoV00wX1BJUEVBX0lMSywKIAkJCSAgIChwbGFuZV93bSA8PCBXTTBfUElQRV9QTEFORV9TSElGVCkgfCBjdXJzb3Jfd20pOwogCQlEUk1fREVCVUdfS01TKCJGSUZPIHdhdGVybWFya3MgRm9yIHBpcGUgQSAtIgpAQCAtNDE1MywxMiArNDEwNSwxMiBAQAogCQllbmFibGVkIHw9IDE7CiAJfQogCi0JaWYgKGlyb25sYWtlX2NvbXB1dGVfd20wKGRldiwgMSwKLQkJCQkgJmlyb25sYWtlX2Rpc3BsYXlfd21faW5mbywKLQkJCQkgSUxLX0xQMF9QTEFORV9MQVRFTkNZLAotCQkJCSAmaXJvbmxha2VfY3Vyc29yX3dtX2luZm8sCi0JCQkJIElMS19MUDBfQ1VSU09SX0xBVEVOQ1ksCi0JCQkJICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKKwlpZiAoZzR4X2NvbXB1dGVfd20wKGRldiwgMSwKKwkJCSAgICAmaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLAorCQkJICAgIElMS19MUDBfUExBTkVfTEFURU5DWSwKKwkJCSAgICAmaXJvbmxha2VfY3Vyc29yX3dtX2luZm8sCisJCQkgICAgSUxLX0xQMF9DVVJTT1JfTEFURU5DWSwKKwkJCSAgICAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7CiAJCUk5MTVfV1JJVEUoV00wX1BJUEVCX0lMSywKIAkJCSAgIChwbGFuZV93bSA8PCBXTTBfUElQRV9QTEFORV9TSElGVCkgfCBjdXJzb3Jfd20pOwogCQlEUk1fREVCVUdfS01TKCJGSUZPIHdhdGVybWFya3MgRm9yIHBpcGUgQiAtIgpAQCAtNDIyMywxMCArNDE3NSwxMCBAQAogCXVuc2lnbmVkIGludCBlbmFibGVkOwogCiAJZW5hYmxlZCA9IDA7Ci0JaWYgKGlyb25sYWtlX2NvbXB1dGVfd20wKGRldiwgMCwKLQkJCQkgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5jeSwKLQkJCQkgJnNhbmR5YnJpZGdlX2N1cnNvcl93bV9pbmZvLCBsYXRlbmN5LAotCQkJCSAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7CisJaWYgKGc0eF9jb21wdXRlX3dtMChkZXYsIDAsCisJCQkgICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5jeSwKKwkJCSAgICAmc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8sIGxhdGVuY3ksCisJCQkgICAgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgewogCQlJOTE1X1dSSVRFKFdNMF9QSVBFQV9JTEssCiAJCQkgICAocGxhbmVfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKTsKIAkJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBwaXBlIEEgLSIKQEAgLTQyMzUsMTAgKzQxODcsMTAgQEAKIAkJZW5hYmxlZCB8PSAxOwogCX0KIAotCWlmIChpcm9ubGFrZV9jb21wdXRlX3dtMChkZXYsIDEsCi0JCQkJICZzYW5keWJyaWRnZV9kaXNwbGF5X3dtX2luZm8sIGxhdGVuY3ksCi0JCQkJICZzYW5keWJyaWRnZV9jdXJzb3Jfd21faW5mbywgbGF0ZW5jeSwKLQkJCQkgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgeworCWlmIChnNHhfY29tcHV0ZV93bTAoZGV2LCAxLAorCQkJICAgICZzYW5keWJyaWRnZV9kaXNwbGF5X3dtX2luZm8sIGxhdGVuY3ksCisJCQkgICAgJnNhbmR5YnJpZGdlX2N1cnNvcl93bV9pbmZvLCBsYXRlbmN5LAorCQkJICAgICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKIAkJSTkxNV9XUklURShXTTBfUElQRUJfSUxLLAogCQkJICAgKHBsYW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8IGN1cnNvcl93bSk7CiAJCURSTV9ERUJVR19LTVMoIkZJRk8gd2F0ZXJtYXJrcyBGb3IgcGlwZSBCIC0iCkBAIC00MzUzLDcgKzQzMDUsOCBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgaW50ZWxfcGFuZWxfdXNlX3NzYyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7Ci0JcmV0dXJuIGRldl9wcml2LT5sdmRzX3VzZV9zc2MgJiYgaTkxNV9wYW5lbF91c2Vfc3NjOworCXJldHVybiBkZXZfcHJpdi0+bHZkc191c2Vfc3NjICYmIGk5MTVfcGFuZWxfdXNlX3NzYworCQkmJiAhKGRldl9wcml2LT5xdWlya3MgJiBRVUlSS19MVkRTX1NTQ19ESVNBQkxFKTsKIH0KIAogc3RhdGljIGludCBpOXh4X2NydGNfbW9kZV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLApAQCAtNDczNSw2ICs0Njg4LDcgQEAKIAogCUk5MTVfV1JJVEUoRFNQQ05UUihwbGFuZSksIGRzcGNudHIpOwogCVBPU1RJTkdfUkVBRChEU1BDTlRSKHBsYW5lKSk7CisJaW50ZWxfZW5hYmxlX3BsYW5lKGRldl9wcml2LCBwbGFuZSwgcGlwZSk7CiAKIAlyZXQgPSBpbnRlbF9waXBlX3NldF9iYXNlKGNydGMsIHgsIHksIG9sZF9mYik7CiAKQEAgLTUyNjUsOCArNTIxOSw2IEBACiAKIAlJOTE1X1dSSVRFKERTUENOVFIocGxhbmUpLCBkc3BjbnRyKTsKIAlQT1NUSU5HX1JFQUQoRFNQQ05UUihwbGFuZSkpOwotCWlmICghSEFTX1BDSF9TUExJVChkZXYpKQotCQlpbnRlbF9lbmFibGVfcGxhbmUoZGV2X3ByaXYsIHBsYW5lLCBwaXBlKTsKIAogCXJldCA9IGludGVsX3BpcGVfc2V0X2Jhc2UoY3J0YywgeCwgeSwgb2xkX2ZiKTsKIApAQCAtNjMxMCw2ICs2MjYyLDE5NyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgaW50IGludGVsX2dlbjJfcXVldWVfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXUzMiBmbGlwX21hc2s7CisJaW50IHJldDsKKworCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwgb2JqLCBMUF9SSU5HKGRldl9wcml2KSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBPZmZzZXQgaW50byB0aGUgbmV3IGJ1ZmZlciBmb3IgY2FzZXMgb2Ygc2hhcmVkIGZicyBiZXR3ZWVuIENSVENzICovCisJb2Zmc2V0ID0gY3J0Yy0+eSAqIGZiLT5waXRjaCArIGNydGMtPnggKiBmYi0+Yml0c19wZXJfcGl4ZWwvODsKKworCXJldCA9IEJFR0lOX0xQX1JJTkcoNik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBDYW4ndCBxdWV1ZSBtdWx0aXBsZSBmbGlwcywgc28gd2FpdCBmb3IgdGhlIHByZXZpb3VzCisJICogb25lIHRvIGZpbmlzaCBiZWZvcmUgZXhlY3V0aW5nIHRoZSBuZXh0LgorCSAqLworCWlmIChpbnRlbF9jcnRjLT5wbGFuZSkKKwkJZmxpcF9tYXNrID0gTUlfV0FJVF9GT1JfUExBTkVfQl9GTElQOworCWVsc2UKKwkJZmxpcF9tYXNrID0gTUlfV0FJVF9GT1JfUExBTkVfQV9GTElQOworCU9VVF9SSU5HKE1JX1dBSVRfRk9SX0VWRU5UIHwgZmxpcF9tYXNrKTsKKwlPVVRfUklORyhNSV9OT09QKTsKKwlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVAgfAorCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7CisJT1VUX1JJTkcoZmItPnBpdGNoKTsKKwlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQgKyBvZmZzZXQpOworCU9VVF9SSU5HKE1JX05PT1ApOworCUFEVkFOQ0VfTFBfUklORygpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfZ2VuM19xdWV1ZV9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdTMyIGZsaXBfbWFzazsKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIExQX1JJTkcoZGV2X3ByaXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIE9mZnNldCBpbnRvIHRoZSBuZXcgYnVmZmVyIGZvciBjYXNlcyBvZiBzaGFyZWQgZmJzIGJldHdlZW4gQ1JUQ3MgKi8KKwlvZmZzZXQgPSBjcnRjLT55ICogZmItPnBpdGNoICsgY3J0Yy0+eCAqIGZiLT5iaXRzX3Blcl9waXhlbC84OworCisJcmV0ID0gQkVHSU5fTFBfUklORyg2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmIChpbnRlbF9jcnRjLT5wbGFuZSkKKwkJZmxpcF9tYXNrID0gTUlfV0FJVF9GT1JfUExBTkVfQl9GTElQOworCWVsc2UKKwkJZmxpcF9tYXNrID0gTUlfV0FJVF9GT1JfUExBTkVfQV9GTElQOworCU9VVF9SSU5HKE1JX1dBSVRfRk9SX0VWRU5UIHwgZmxpcF9tYXNrKTsKKwlPVVRfUklORyhNSV9OT09QKTsKKwlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVBfSTkxNSB8CisJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKKwlPVVRfUklORyhmYi0+cGl0Y2gpOworCU9VVF9SSU5HKG9iai0+Z3R0X29mZnNldCArIG9mZnNldCk7CisJT1VUX1JJTkcoTUlfTk9PUCk7CisKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGludGVsX2dlbjRfcXVldWVfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXVpbnQzMl90IHBmLCBwaXBlc3JjOworCWludCByZXQ7CisKKwlyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIG9iaiwgTFBfUklORyhkZXZfcHJpdikpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gQkVHSU5fTFBfUklORyg0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIGk5NjUrIHVzZXMgdGhlIGxpbmVhciBvciB0aWxlZCBvZmZzZXRzIGZyb20gdGhlCisJICogRGlzcGxheSBSZWdpc3RlcnMgKHdoaWNoIGRvIG5vdCBjaGFuZ2UgYWNyb3NzIGEgcGFnZS1mbGlwKQorCSAqIHNvIHdlIG5lZWQgb25seSByZXByb2dyYW0gdGhlIGJhc2UgYWRkcmVzcy4KKwkgKi8KKwlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVAgfAorCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7CisJT1VUX1JJTkcoZmItPnBpdGNoKTsKKwlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQgfCBvYmotPnRpbGluZ19tb2RlKTsKKworCS8qIFhYWCBFbmFibGluZyB0aGUgcGFuZWwtZml0dGVyIGFjcm9zcyBwYWdlLWZsaXAgaXMgc28gZmFyCisJICogdW50ZXN0ZWQgb24gbm9uLW5hdGl2ZSBtb2Rlcywgc28gaWdub3JlIGl0IGZvciBub3cuCisJICogcGYgPSBJOTE1X1JFQUQocGlwZSA9PSAwID8gUEZBX0NUTF8xIDogUEZCX0NUTF8xKSAmIFBGX0VOQUJMRTsKKwkgKi8KKwlwZiA9IDA7CisJcGlwZXNyYyA9IEk5MTVfUkVBRChQSVBFU1JDKGludGVsX2NydGMtPnBpcGUpKSAmIDB4MGZmZjBmZmY7CisJT1VUX1JJTkcocGYgfCBwaXBlc3JjKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGludGVsX2dlbjZfcXVldWVfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXVpbnQzMl90IHBmLCBwaXBlc3JjOworCWludCByZXQ7CisKKwlyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIG9iaiwgTFBfUklORyhkZXZfcHJpdikpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gQkVHSU5fTFBfUklORyg0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUCB8CisJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKKwlPVVRfUklORyhmYi0+cGl0Y2ggfCBvYmotPnRpbGluZ19tb2RlKTsKKwlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQpOworCisJcGYgPSBJOTE1X1JFQUQoUEZfQ1RMKGludGVsX2NydGMtPnBpcGUpKSAmIFBGX0VOQUJMRTsKKwlwaXBlc3JjID0gSTkxNV9SRUFEKFBJUEVTUkMoaW50ZWxfY3J0Yy0+cGlwZSkpICYgMHgwZmZmMGZmZjsKKwlPVVRfUklORyhwZiB8IHBpcGVzcmMpOworCUFEVkFOQ0VfTFBfUklORygpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBPbiBnZW43IHdlIGN1cnJlbnRseSB1c2UgdGhlIGJsaXQgcmluZyBiZWNhdXNlIChpbiBlYXJseSBzaWxpY29uIGF0IGxlYXN0KQorICogdGhlIHJlbmRlciByaW5nIGRvZXNuJ3QgZ2l2ZSB1cyBpbnRlcnJwdHMgZm9yIHBhZ2UgZmxpcCBjb21wbGV0aW9uLCB3aGljaAorICogbWVhbnMgY2xpZW50cyB3aWxsIGhhbmcgYWZ0ZXIgdGhlIGZpcnN0IGZsaXAgaXMgcXVldWVkLiAgRm9ydHVuYXRlbHkgdGhlCisgKiBibGl0IHJpbmcgZ2VuZXJhdGVzIGludGVycnVwdHMgcHJvcGVybHksIHNvIHVzZSBpdCBpbnN0ZWFkLgorICovCitzdGF0aWMgaW50IGludGVsX2dlbjdfcXVldWVfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tCQ1NdOworCWludCByZXQ7CisKKwlyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIG9iaiwgcmluZyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX0RJU1BMQVlfRkxJUF9JOTE1IHwgKGludGVsX2NydGMtPnBsYW5lIDw8IDE5KSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIChmYi0+cGl0Y2ggfCBvYmotPnRpbGluZ19tb2RlKSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIChvYmotPmd0dF9vZmZzZXQpKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgKE1JX05PT1ApKTsKKwlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbnRlbF9kZWZhdWx0X3F1ZXVlX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKwogc3RhdGljIGludCBpbnRlbF9jcnRjX3BhZ2VfZmxpcChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCiAJCQkJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZXZlbnQpCkBAIC02MzIwLDkgKzY0NjMsNyBAQAogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCXN0cnVjdCBpbnRlbF91bnBpbl93b3JrICp3b3JrOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG9mZnNldDsKLQlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7Ci0JdTMyIHBmLCBwaXBlc3JjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAogCXdvcmsgPSBremFsbG9jKHNpemVvZiAqd29yaywgR0ZQX0tFUk5FTCk7CkBAIC02MzUxLDkgKzY0OTIsNiBAQAogCW9iaiA9IGludGVsX2ZiLT5vYmo7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIExQX1JJTkcoZGV2X3ByaXYpKTsKLQlpZiAocmV0KQotCQlnb3RvIGNsZWFudXBfd29yazsKIAogCS8qIFJlZmVyZW5jZSB0aGUgb2JqZWN0cyBmb3IgdGhlIHNjaGVkdWxlZCB3b3JrLiAqLwogCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSgmd29yay0+b2xkX2ZiX29iai0+YmFzZSk7CkBAIC02MzY1LDkxICs2NTAzLDE4IEBACiAJaWYgKHJldCkKIAkJZ290byBjbGVhbnVwX29ianM7CiAKLQlpZiAoSVNfR0VOMyhkZXYpIHx8IElTX0dFTjIoZGV2KSkgewotCQl1MzIgZmxpcF9tYXNrOwotCi0JCS8qIENhbid0IHF1ZXVlIG11bHRpcGxlIGZsaXBzLCBzbyB3YWl0IGZvciB0aGUgcHJldmlvdXMKLQkJICogb25lIHRvIGZpbmlzaCBiZWZvcmUgZXhlY3V0aW5nIHRoZSBuZXh0LgotCQkgKi8KLQkJcmV0ID0gQkVHSU5fTFBfUklORygyKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gY2xlYW51cF9vYmpzOwotCi0JCWlmIChpbnRlbF9jcnRjLT5wbGFuZSkKLQkJCWZsaXBfbWFzayA9IE1JX1dBSVRfRk9SX1BMQU5FX0JfRkxJUDsKLQkJZWxzZQotCQkJZmxpcF9tYXNrID0gTUlfV0FJVF9GT1JfUExBTkVfQV9GTElQOwotCQlPVVRfUklORyhNSV9XQUlUX0ZPUl9FVkVOVCB8IGZsaXBfbWFzayk7Ci0JCU9VVF9SSU5HKE1JX05PT1ApOwotCQlBRFZBTkNFX0xQX1JJTkcoKTsKLQl9Ci0KIAl3b3JrLT5wZW5kaW5nX2ZsaXBfb2JqID0gb2JqOwogCiAJd29yay0+ZW5hYmxlX3N0YWxsX2NoZWNrID0gdHJ1ZTsKIAotCS8qIE9mZnNldCBpbnRvIHRoZSBuZXcgYnVmZmVyIGZvciBjYXNlcyBvZiBzaGFyZWQgZmJzIGJldHdlZW4gQ1JUQ3MgKi8KLQlvZmZzZXQgPSBjcnRjLT55ICogZmItPnBpdGNoICsgY3J0Yy0+eCAqIGZiLT5iaXRzX3Blcl9waXhlbC84OwotCi0JcmV0ID0gQkVHSU5fTFBfUklORyg0KTsKLQlpZiAocmV0KQotCQlnb3RvIGNsZWFudXBfb2JqczsKLQogCS8qIEJsb2NrIGNsaWVudHMgZnJvbSByZW5kZXJpbmcgdG8gdGhlIG5ldyBiYWNrIGJ1ZmZlciB1bnRpbAogCSAqIHRoZSBmbGlwIG9jY3VycyBhbmQgdGhlIG9iamVjdCBpcyBubyBsb25nZXIgdmlzaWJsZS4KIAkgKi8KIAlhdG9taWNfYWRkKDEgPDwgaW50ZWxfY3J0Yy0+cGxhbmUsICZ3b3JrLT5vbGRfZmJfb2JqLT5wZW5kaW5nX2ZsaXApOwogCi0Jc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgewotCWNhc2UgMjoKLQkJT1VUX1JJTkcoTUlfRElTUExBWV9GTElQIHwKLQkJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKLQkJT1VUX1JJTkcoZmItPnBpdGNoKTsKLQkJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0ICsgb2Zmc2V0KTsKLQkJT1VUX1JJTkcoTUlfTk9PUCk7Ci0JCWJyZWFrOwotCi0JY2FzZSAzOgotCQlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVBfSTkxNSB8Ci0JCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7Ci0JCU9VVF9SSU5HKGZiLT5waXRjaCk7Ci0JCU9VVF9SSU5HKG9iai0+Z3R0X29mZnNldCArIG9mZnNldCk7Ci0JCU9VVF9SSU5HKE1JX05PT1ApOwotCQlicmVhazsKLQotCWNhc2UgNDoKLQljYXNlIDU6Ci0JCS8qIGk5NjUrIHVzZXMgdGhlIGxpbmVhciBvciB0aWxlZCBvZmZzZXRzIGZyb20gdGhlCi0JCSAqIERpc3BsYXkgUmVnaXN0ZXJzICh3aGljaCBkbyBub3QgY2hhbmdlIGFjcm9zcyBhIHBhZ2UtZmxpcCkKLQkJICogc28gd2UgbmVlZCBvbmx5IHJlcHJvZ3JhbSB0aGUgYmFzZSBhZGRyZXNzLgotCQkgKi8KLQkJT1VUX1JJTkcoTUlfRElTUExBWV9GTElQIHwKLQkJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKLQkJT1VUX1JJTkcoZmItPnBpdGNoKTsKLQkJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0IHwgb2JqLT50aWxpbmdfbW9kZSk7Ci0KLQkJLyogWFhYIEVuYWJsaW5nIHRoZSBwYW5lbC1maXR0ZXIgYWNyb3NzIHBhZ2UtZmxpcCBpcyBzbyBmYXIKLQkJICogdW50ZXN0ZWQgb24gbm9uLW5hdGl2ZSBtb2Rlcywgc28gaWdub3JlIGl0IGZvciBub3cuCi0JCSAqIHBmID0gSTkxNV9SRUFEKHBpcGUgPT0gMCA/IFBGQV9DVExfMSA6IFBGQl9DVExfMSkgJiBQRl9FTkFCTEU7Ci0JCSAqLwotCQlwZiA9IDA7Ci0JCXBpcGVzcmMgPSBJOTE1X1JFQUQoUElQRVNSQyhwaXBlKSkgJiAweDBmZmYwZmZmOwotCQlPVVRfUklORyhwZiB8IHBpcGVzcmMpOwotCQlicmVhazsKLQotCWNhc2UgNjoKLQljYXNlIDc6Ci0JCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUCB8Ci0JCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7Ci0JCU9VVF9SSU5HKGZiLT5waXRjaCB8IG9iai0+dGlsaW5nX21vZGUpOwotCQlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQpOwotCi0JCXBmID0gSTkxNV9SRUFEKFBGX0NUTChwaXBlKSkgJiBQRl9FTkFCTEU7Ci0JCXBpcGVzcmMgPSBJOTE1X1JFQUQoUElQRVNSQyhwaXBlKSkgJiAweDBmZmYwZmZmOwotCQlPVVRfUklORyhwZiB8IHBpcGVzcmMpOwotCQlicmVhazsKLQl9Ci0JQURWQU5DRV9MUF9SSU5HKCk7CisJcmV0ID0gZGV2X3ByaXYtPmRpc3BsYXkucXVldWVfZmxpcChkZXYsIGNydGMsIGZiLCBvYmopOworCWlmIChyZXQpCisJCWdvdG8gY2xlYW51cF9wZW5kaW5nOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKQEAgLTY0NTcsMTAgKzY1MjIsMTEgQEAKIAogCXJldHVybiAwOwogCitjbGVhbnVwX3BlbmRpbmc6CisJYXRvbWljX3N1YigxIDw8IGludGVsX2NydGMtPnBsYW5lLCAmd29yay0+b2xkX2ZiX29iai0+cGVuZGluZ19mbGlwKTsKIGNsZWFudXBfb2JqczoKIAlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmd29yay0+b2xkX2ZiX29iai0+YmFzZSk7CiAJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7Ci1jbGVhbnVwX3dvcms6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CkBAIC03Njc1LDYgKzc3NDEsNyBAQAogCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gTlVMTDsKIAkJfSBlbHNlCiAJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBwaW5ldmlld191cGRhdGVfd207CisJCWRldl9wcml2LT5kaXNwbGF5LmluaXRfY2xvY2tfZ2F0aW5nID0gZ2VuM19pbml0X2Nsb2NrX2dhdGluZzsKIAl9IGVsc2UgaWYgKElTX0c0WChkZXYpKSB7CiAJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IGc0eF91cGRhdGVfd207CiAJCWRldl9wcml2LT5kaXNwbGF5LmluaXRfY2xvY2tfZ2F0aW5nID0gZzR4X2luaXRfY2xvY2tfZ2F0aW5nOwpAQCAtNzcwNCw2ICs3NzcxLDMxIEBACiAJCWVsc2UKIAkJCWRldl9wcml2LT5kaXNwbGF5LmdldF9maWZvX3NpemUgPSBpODMwX2dldF9maWZvX3NpemU7CiAJfQorCisJLyogRGVmYXVsdCBqdXN0IHJldHVybnMgLUVOT0RFViB0byBpbmRpY2F0ZSB1bnN1cHBvcnRlZCAqLworCWRldl9wcml2LT5kaXNwbGF5LnF1ZXVlX2ZsaXAgPSBpbnRlbF9kZWZhdWx0X3F1ZXVlX2ZsaXA7CisKKwlzd2l0Y2ggKElOVEVMX0lORk8oZGV2KS0+Z2VuKSB7CisJY2FzZSAyOgorCQlkZXZfcHJpdi0+ZGlzcGxheS5xdWV1ZV9mbGlwID0gaW50ZWxfZ2VuMl9xdWV1ZV9mbGlwOworCQlicmVhazsKKworCWNhc2UgMzoKKwkJZGV2X3ByaXYtPmRpc3BsYXkucXVldWVfZmxpcCA9IGludGVsX2dlbjNfcXVldWVfZmxpcDsKKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJY2FzZSA1OgorCQlkZXZfcHJpdi0+ZGlzcGxheS5xdWV1ZV9mbGlwID0gaW50ZWxfZ2VuNF9xdWV1ZV9mbGlwOworCQlicmVhazsKKworCWNhc2UgNjoKKwkJZGV2X3ByaXYtPmRpc3BsYXkucXVldWVfZmxpcCA9IGludGVsX2dlbjZfcXVldWVfZmxpcDsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlkZXZfcHJpdi0+ZGlzcGxheS5xdWV1ZV9mbGlwID0gaW50ZWxfZ2VuN19xdWV1ZV9mbGlwOworCQlicmVhazsKKwl9CiB9CiAKIC8qCkBAIC03NzE5LDYgKzc4MTEsMTUgQEAKIAlEUk1fREVCVUdfRFJJVkVSKCJhcHBseWluZyBwaXBlIGEgZm9yY2UgcXVpcmtcbiIpOwogfQogCisvKgorICogU29tZSBtYWNoaW5lcyAoTGVub3ZvIFUxNjApIGRvIG5vdCB3b3JrIHdpdGggU1NDIG9uIExWRFMgZm9yIHNvbWUgcmVhc29uCisgKi8KK3N0YXRpYyB2b2lkIHF1aXJrX3NzY19mb3JjZV9kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkZXZfcHJpdi0+cXVpcmtzIHw9IFFVSVJLX0xWRFNfU1NDX0RJU0FCTEU7Cit9CisKIHN0cnVjdCBpbnRlbF9xdWlyayB7CiAJaW50IGRldmljZTsKIAlpbnQgc3Vic3lzdGVtX3ZlbmRvcjsKQEAgLTc3NDcsNiArNzg0OCw5IEBACiAJLyogODU1ICYgYmVmb3JlIG5lZWQgdG8gbGVhdmUgcGlwZSBBICYgZHBsbCBBIHVwICovCiAJeyAweDM1ODIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHF1aXJrX3BpcGVhX2ZvcmNlIH0sCiAJeyAweDI1NjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHF1aXJrX3BpcGVhX2ZvcmNlIH0sCisKKwkvKiBMZW5vdm8gVTE2MCBjYW5ub3QgdXNlIFNTQyBvbiBMVkRTICovCisJeyAweDAwNDYsIDB4MTdhYSwgMHgzOTIwLCBxdWlya19zc2NfZm9yY2VfZGlzYWJsZSB9LAogfTsKIAogc3RhdGljIHZvaWQgaW50ZWxfaW5pdF9xdWlya3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCmluZGV4IGE0ZDgwMzEuLmUyYWNlZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYwpAQCAtNTAsNyArNTAsNiBAQAogCWJvb2wgaGFzX2F1ZGlvOwogCWludCBmb3JjZV9hdWRpbzsKIAl1aW50MzJfdCBjb2xvcl9yYW5nZTsKLQlpbnQgZHBtc19tb2RlOwogCXVpbnQ4X3QgbGlua19idzsKIAl1aW50OF90IGxhbmVfY291bnQ7CiAJdWludDhfdCBkcGNkWzRdOwpAQCAtNTksOCArNTgsNiBAQAogCWJvb2wgaXNfcGNoX2VkcDsKIAl1aW50OF90CXRyYWluX3NldFs0XTsKIAl1aW50OF90IGxpbmtfc3RhdHVzW0RQX0xJTktfU1RBVFVTX1NJWkVdOwotCi0Jc3RydWN0IGRybV9wcm9wZXJ0eSAqZm9yY2VfYXVkaW9fcHJvcGVydHk7CiB9OwogCiAvKioKQEAgLTE0MCw4ICsxMzcsOCBAQAogewogCWludCBtYXhfbGFuZV9jb3VudCA9IDQ7CiAKLQlpZiAoaW50ZWxfZHAtPmRwY2RbMF0gPj0gMHgxMSkgewotCQltYXhfbGFuZV9jb3VudCA9IGludGVsX2RwLT5kcGNkWzJdICYgMHgxZjsKKwlpZiAoaW50ZWxfZHAtPmRwY2RbRFBfRFBDRF9SRVZdID49IDB4MTEpIHsKKwkJbWF4X2xhbmVfY291bnQgPSBpbnRlbF9kcC0+ZHBjZFtEUF9NQVhfTEFORV9DT1VOVF0gJiAweDFmOwogCQlzd2l0Y2ggKG1heF9sYW5lX2NvdW50KSB7CiAJCWNhc2UgMTogY2FzZSAyOiBjYXNlIDQ6CiAJCQlicmVhazsKQEAgLTE1NSw3ICsxNTIsNyBAQAogc3RhdGljIGludAogaW50ZWxfZHBfbWF4X2xpbmtfYncoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKIHsKLQlpbnQgbWF4X2xpbmtfYncgPSBpbnRlbF9kcC0+ZHBjZFsxXTsKKwlpbnQgbWF4X2xpbmtfYncgPSBpbnRlbF9kcC0+ZHBjZFtEUF9NQVhfTElOS19SQVRFXTsKIAogCXN3aXRjaCAobWF4X2xpbmtfYncpIHsKIAljYXNlIERQX0xJTktfQldfMV82MjoKQEAgLTc3Niw3ICs3NzMsOCBAQAogCS8qCiAJICogQ2hlY2sgZm9yIERQQ0QgdmVyc2lvbiA+IDEuMSBhbmQgZW5oYW5jZWQgZnJhbWluZyBzdXBwb3J0CiAJICovCi0JaWYgKGludGVsX2RwLT5kcGNkWzBdID49IDB4MTEgJiYgKGludGVsX2RwLT5kcGNkWzJdICYgRFBfRU5IQU5DRURfRlJBTUVfQ0FQKSkgeworCWlmIChpbnRlbF9kcC0+ZHBjZFtEUF9EUENEX1JFVl0gPj0gMHgxMSAmJgorCSAgICAoaW50ZWxfZHAtPmRwY2RbRFBfTUFYX0xBTkVfQ09VTlRdICYgRFBfRU5IQU5DRURfRlJBTUVfQ0FQKSkgewogCQlpbnRlbF9kcC0+bGlua19jb25maWd1cmF0aW9uWzFdIHw9IERQX0xBTkVfQ09VTlRfRU5IQU5DRURfRlJBTUVfRU47CiAJCWludGVsX2RwLT5EUCB8PSBEUF9FTkhBTkNFRF9GUkFNSU5HOwogCX0KQEAgLTk0NCwxMSArOTQyLDQ0IEBACiAJdWRlbGF5KDIwMCk7CiB9CiAKKy8qIElmIHRoZSBzaW5rIHN1cHBvcnRzIGl0LCB0cnkgdG8gc2V0IHRoZSBwb3dlciBzdGF0ZSBhcHByb3ByaWF0ZWx5ICovCitzdGF0aWMgdm9pZCBpbnRlbF9kcF9zaW5rX2RwbXMoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwgaW50IG1vZGUpCit7CisJaW50IHJldCwgaTsKKworCS8qIFNob3VsZCBoYXZlIGEgdmFsaWQgRFBDRCBieSB0aGlzIHBvaW50ICovCisJaWYgKGludGVsX2RwLT5kcGNkW0RQX0RQQ0RfUkVWXSA8IDB4MTEpCisJCXJldHVybjsKKworCWlmIChtb2RlICE9IERSTV9NT0RFX0RQTVNfT04pIHsKKwkJcmV0ID0gaW50ZWxfZHBfYXV4X25hdGl2ZV93cml0ZV8xKGludGVsX2RwLCBEUF9TRVRfUE9XRVIsCisJCQkJCQkgIERQX1NFVF9QT1dFUl9EMyk7CisJCWlmIChyZXQgIT0gMSkKKwkJCURSTV9ERUJVR19EUklWRVIoImZhaWxlZCB0byB3cml0ZSBzaW5rIHBvd2VyIHN0YXRlXG4iKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXaGVuIHR1cm5pbmcgb24sIHdlIG5lZWQgdG8gcmV0cnkgZm9yIDFtcyB0byBnaXZlIHRoZSBzaW5rCisJCSAqIHRpbWUgdG8gd2FrZSB1cC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCXJldCA9IGludGVsX2RwX2F1eF9uYXRpdmVfd3JpdGVfMShpbnRlbF9kcCwKKwkJCQkJCQkgIERQX1NFVF9QT1dFUiwKKwkJCQkJCQkgIERQX1NFVF9QT1dFUl9EMCk7CisJCQlpZiAocmV0ID09IDEpCisJCQkJYnJlYWs7CisJCQltc2xlZXAoMSk7CisJCX0KKwl9Cit9CisKIHN0YXRpYyB2b2lkIGludGVsX2RwX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBlbmNfdG9faW50ZWxfZHAoZW5jb2Rlcik7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAorCS8qIFdha2UgdXAgdGhlIHNpbmsgZmlyc3QgKi8KKwlpbnRlbF9kcF9zaW5rX2RwbXMoaW50ZWxfZHAsIERSTV9NT0RFX0RQTVNfT04pOworCiAJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKIAkJaXJvbmxha2VfZWRwX2JhY2tsaWdodF9vZmYoZGV2KTsKIAkJaXJvbmxha2VfZWRwX3BhbmVsX29mZihkZXYpOwpAQCAtOTkyLDYgKzEwMjMsNyBAQAogCWlmIChtb2RlICE9IERSTV9NT0RFX0RQTVNfT04pIHsKIAkJaWYgKGlzX2VkcChpbnRlbF9kcCkpCiAJCQlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29mZihkZXYpOworCQlpbnRlbF9kcF9zaW5rX2RwbXMoaW50ZWxfZHAsIG1vZGUpOwogCQlpbnRlbF9kcF9saW5rX2Rvd24oaW50ZWxfZHApOwogCQlpZiAoaXNfZWRwKGludGVsX2RwKSkKIAkJCWlyb25sYWtlX2VkcF9wYW5lbF9vZmYoZGV2KTsKQEAgLTEwMDAsNiArMTAzMiw3IEBACiAJfSBlbHNlIHsKIAkJaWYgKGlzX2VkcChpbnRlbF9kcCkpCiAJCQlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29uKGludGVsX2RwKTsKKwkJaW50ZWxfZHBfc2lua19kcG1zKGludGVsX2RwLCBtb2RlKTsKIAkJaWYgKCEoZHBfcmVnICYgRFBfUE9SVF9FTikpIHsKIAkJCWludGVsX2RwX3N0YXJ0X2xpbmtfdHJhaW4oaW50ZWxfZHApOwogCQkJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKQEAgLTEwMTEsNyArMTA0NCwzMSBAQAogCQlpZiAoaXNfZWRwKGludGVsX2RwKSkKIAkJCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb24oZGV2KTsKIAl9Ci0JaW50ZWxfZHAtPmRwbXNfbW9kZSA9IG1vZGU7Cit9CisKKy8qCisgKiBOYXRpdmUgcmVhZCB3aXRoIHJldHJ5IGZvciBsaW5rIHN0YXR1cyBhbmQgcmVjZWl2ZXIgY2FwYWJpbGl0eSByZWFkcyBmb3IKKyAqIGNhc2VzIHdoZXJlIHRoZSBzaW5rIG1heSBzdGlsbCBiZSBhc2xlZXAuCisgKi8KK3N0YXRpYyBib29sCitpbnRlbF9kcF9hdXhfbmF0aXZlX3JlYWRfcmV0cnkoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwgdWludDE2X3QgYWRkcmVzcywKKwkJCSAgICAgICB1aW50OF90ICpyZWN2LCBpbnQgcmVjdl9ieXRlcykKK3sKKwlpbnQgcmV0LCBpOworCisJLyoKKwkgKiBTaW5rcyBhcmUgKnN1cHBvc2VkKiB0byBjb21lIHVwIHdpdGhpbiAxbXMgZnJvbSBhbiBvZmYgc3RhdGUsCisJICogYnV0IHdlJ3JlIGFsc28gc3VwcG9zZWQgdG8gcmV0cnkgMyB0aW1lcyBwZXIgdGhlIHNwZWMuCisJICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlyZXQgPSBpbnRlbF9kcF9hdXhfbmF0aXZlX3JlYWQoaW50ZWxfZHAsIGFkZHJlc3MsIHJlY3YsCisJCQkJCSAgICAgICByZWN2X2J5dGVzKTsKKwkJaWYgKHJldCA9PSByZWN2X2J5dGVzKQorCQkJcmV0dXJuIHRydWU7CisJCW1zbGVlcCgxKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qCkBAIC0xMDIxLDE0ICsxMDc4LDEwIEBACiBzdGF0aWMgYm9vbAogaW50ZWxfZHBfZ2V0X2xpbmtfc3RhdHVzKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IGludGVsX2RwX2F1eF9uYXRpdmVfcmVhZChpbnRlbF9kcCwKLQkJCQkgICAgICAgRFBfTEFORTBfMV9TVEFUVVMsCi0JCQkJICAgICAgIGludGVsX2RwLT5saW5rX3N0YXR1cywgRFBfTElOS19TVEFUVVNfU0laRSk7Ci0JaWYgKHJldCAhPSBEUF9MSU5LX1NUQVRVU19TSVpFKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHRydWU7CisJcmV0dXJuIGludGVsX2RwX2F1eF9uYXRpdmVfcmVhZF9yZXRyeShpbnRlbF9kcCwKKwkJCQkJICAgICAgRFBfTEFORTBfMV9TVEFUVVMsCisJCQkJCSAgICAgIGludGVsX2RwLT5saW5rX3N0YXR1cywKKwkJCQkJICAgICAgRFBfTElOS19TVEFUVVNfU0laRSk7CiB9CiAKIHN0YXRpYyB1aW50OF90CkBAIC0xNTE3LDYgKzE1NzAsOCBAQAogc3RhdGljIHZvaWQKIGludGVsX2RwX2NoZWNrX2xpbmtfc3RhdHVzKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCiB7CisJaW50IHJldDsKKwogCWlmICghaW50ZWxfZHAtPmJhc2UuYmFzZS5jcnRjKQogCQlyZXR1cm47CiAKQEAgLTE1MjUsNiArMTU4MCwxNSBAQAogCQlyZXR1cm47CiAJfQogCisJLyogVHJ5IHRvIHJlYWQgcmVjZWl2ZXIgc3RhdHVzIGlmIHRoZSBsaW5rIGFwcGVhcnMgdG8gYmUgdXAgKi8KKwlyZXQgPSBpbnRlbF9kcF9hdXhfbmF0aXZlX3JlYWQoaW50ZWxfZHAsCisJCQkJICAgICAgIDB4MDAwLCBpbnRlbF9kcC0+ZHBjZCwKKwkJCQkgICAgICAgc2l6ZW9mIChpbnRlbF9kcC0+ZHBjZCkpOworCWlmIChyZXQgIT0gc2l6ZW9mKGludGVsX2RwLT5kcGNkKSkgeworCQlpbnRlbF9kcF9saW5rX2Rvd24oaW50ZWxfZHApOworCQlyZXR1cm47CisJfQorCiAJaWYgKCFpbnRlbF9jaGFubmVsX2VxX29rKGludGVsX2RwKSkgewogCQlpbnRlbF9kcF9zdGFydF9saW5rX3RyYWluKGludGVsX2RwKTsKIAkJaW50ZWxfZHBfY29tcGxldGVfbGlua190cmFpbihpbnRlbF9kcCk7CkBAIC0xNTM1LDYgKzE1OTksNyBAQAogaXJvbmxha2VfZHBfZGV0ZWN0KHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCiB7CiAJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXM7CisJYm9vbCByZXQ7CiAKIAkvKiBDYW4ndCBkaXNjb25uZWN0IGVEUCwgYnV0IHlvdSBjYW4gY2xvc2UgdGhlIGxpZC4uLiAqLwogCWlmIChpc19lZHAoaW50ZWxfZHApKSB7CkBAIC0xNTQ1LDEzICsxNjEwLDExIEBACiAJfQogCiAJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Ci0JaWYgKGludGVsX2RwX2F1eF9uYXRpdmVfcmVhZChpbnRlbF9kcCwKLQkJCQkgICAgIDB4MDAwLCBpbnRlbF9kcC0+ZHBjZCwKLQkJCQkgICAgIHNpemVvZiAoaW50ZWxfZHAtPmRwY2QpKQotCSAgICA9PSBzaXplb2YoaW50ZWxfZHAtPmRwY2QpKSB7Ci0JCWlmIChpbnRlbF9kcC0+ZHBjZFswXSAhPSAwKQotCQkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7Ci0JfQorCXJldCA9IGludGVsX2RwX2F1eF9uYXRpdmVfcmVhZF9yZXRyeShpbnRlbF9kcCwKKwkJCQkJICAgICAweDAwMCwgaW50ZWxfZHAtPmRwY2QsCisJCQkJCSAgICAgc2l6ZW9mIChpbnRlbF9kcC0+ZHBjZCkpOworCWlmIChyZXQgJiYgaW50ZWxfZHAtPmRwY2RbRFBfRFBDRF9SRVZdICE9IDApCisJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwogCURSTV9ERUJVR19LTVMoIkRQQ0Q6ICVoeCVoeCVoeCVoeFxuIiwgaW50ZWxfZHAtPmRwY2RbMF0sCiAJCSAgICAgIGludGVsX2RwLT5kcGNkWzFdLCBpbnRlbF9kcC0+ZHBjZFsyXSwgaW50ZWxfZHAtPmRwY2RbM10pOwogCXJldHVybiBzdGF0dXM7CkBAIC0xNTg4LDcgKzE2NTEsNyBAQAogCWlmIChpbnRlbF9kcF9hdXhfbmF0aXZlX3JlYWQoaW50ZWxfZHAsIDB4MDAwLCBpbnRlbF9kcC0+ZHBjZCwKIAkJCQkgICAgIHNpemVvZiAoaW50ZWxfZHAtPmRwY2QpKSA9PSBzaXplb2YgKGludGVsX2RwLT5kcGNkKSkKIAl7Ci0JCWlmIChpbnRlbF9kcC0+ZHBjZFswXSAhPSAwKQorCQlpZiAoaW50ZWxfZHAtPmRwY2RbRFBfRFBDRF9SRVZdICE9IDApCiAJCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIAl9CiAKQEAgLTE3MDIsNyArMTc2NSw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChwcm9wZXJ0eSA9PSBpbnRlbF9kcC0+Zm9yY2VfYXVkaW9fcHJvcGVydHkpIHsKKwlpZiAocHJvcGVydHkgPT0gZGV2X3ByaXYtPmZvcmNlX2F1ZGlvX3Byb3BlcnR5KSB7CiAJCWludCBpID0gdmFsOwogCQlib29sIGhhc19hdWRpbzsKIApAQCAtMTc5Miw4ICsxODU1LDcgQEAKIHsKIAlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gY29udGFpbmVyX29mKGludGVsX2VuY29kZXIsIHN0cnVjdCBpbnRlbF9kcCwgYmFzZSk7CiAKLQlpZiAoaW50ZWxfZHAtPmRwbXNfbW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKQotCQlpbnRlbF9kcF9jaGVja19saW5rX3N0YXR1cyhpbnRlbF9kcCk7CisJaW50ZWxfZHBfY2hlY2tfbGlua19zdGF0dXMoaW50ZWxfZHApOwogfQogCiAvKiBSZXR1cm4gd2hpY2ggRFAgUG9ydCBzaG91bGQgYmUgc2VsZWN0ZWQgZm9yIFRyYW5zY29kZXIgRFAgY29udHJvbCAqLwpAQCAtMTg0MSwxNiArMTkwMyw3IEBACiBzdGF0aWMgdm9pZAogaW50ZWxfZHBfYWRkX3Byb3BlcnRpZXMoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7Ci0KLQlpbnRlbF9kcC0+Zm9yY2VfYXVkaW9fcHJvcGVydHkgPQotCQlkcm1fcHJvcGVydHlfY3JlYXRlKGRldiwgRFJNX01PREVfUFJPUF9SQU5HRSwgImZvcmNlX2F1ZGlvIiwgMik7Ci0JaWYgKGludGVsX2RwLT5mb3JjZV9hdWRpb19wcm9wZXJ0eSkgewotCQlpbnRlbF9kcC0+Zm9yY2VfYXVkaW9fcHJvcGVydHktPnZhbHVlc1swXSA9IC0xOwotCQlpbnRlbF9kcC0+Zm9yY2VfYXVkaW9fcHJvcGVydHktPnZhbHVlc1sxXSA9IDE7Ci0JCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwgaW50ZWxfZHAtPmZvcmNlX2F1ZGlvX3Byb3BlcnR5LCAwKTsKLQl9Ci0KKwlpbnRlbF9hdHRhY2hfZm9yY2VfYXVkaW9fcHJvcGVydHkoY29ubmVjdG9yKTsKIAlpbnRlbF9hdHRhY2hfYnJvYWRjYXN0X3JnYl9wcm9wZXJ0eShjb25uZWN0b3IpOwogfQogCkBAIC0xODcwLDcgKzE5MjMsNiBAQAogCQlyZXR1cm47CiAKIAlpbnRlbF9kcC0+b3V0cHV0X3JlZyA9IG91dHB1dF9yZWc7Ci0JaW50ZWxfZHAtPmRwbXNfbW9kZSA9IC0xOwogCiAJaW50ZWxfY29ubmVjdG9yID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGludGVsX2Nvbm5lY3RvciksIEdGUF9LRVJORUwpOwogCWlmICghaW50ZWxfY29ubmVjdG9yKSB7CkBAIC0xOTY1LDggKzIwMTcsOSBAQAogCQkJCQkgICAgICAgc2l6ZW9mKGludGVsX2RwLT5kcGNkKSk7CiAJCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwKTsKIAkJaWYgKHJldCA9PSBzaXplb2YoaW50ZWxfZHAtPmRwY2QpKSB7Ci0JCQlpZiAoaW50ZWxfZHAtPmRwY2RbMF0gPj0gMHgxMSkKLQkJCQlkZXZfcHJpdi0+bm9fYXV4X2hhbmRzaGFrZSA9IGludGVsX2RwLT5kcGNkWzNdICYKKwkJCWlmIChpbnRlbF9kcC0+ZHBjZFtEUF9EUENEX1JFVl0gPj0gMHgxMSkKKwkJCQlkZXZfcHJpdi0+bm9fYXV4X2hhbmRzaGFrZSA9CisJCQkJCWludGVsX2RwLT5kcGNkW0RQX01BWF9ET1dOU1BSRUFEXSAmCiAJCQkJCURQX05PX0FVWF9IQU5EU0hBS0VfTElOS19UUkFJTklORzsKIAkJfSBlbHNlIHsKIAkJCS8qIGlmIHRoaXMgZmFpbHMsIHByZXN1bWUgdGhlIGRldmljZSBpcyBhIGdob3N0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCmluZGV4IDgzMWQ3YTQuLjlmZmE2MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCkBAIC0yMzYsNiArMjM2LDcgQEAKIGludCBpbnRlbF9kZGNfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwogZXh0ZXJuIGJvb2wgaW50ZWxfZGRjX3Byb2JlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9lbmNvZGVyLCBpbnQgZGRjX2J1cyk7CiAKK2V4dGVybiB2b2lkIGludGVsX2F0dGFjaF9mb3JjZV9hdWRpb19wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKIGV4dGVybiB2b2lkIGludGVsX2F0dGFjaF9icm9hZGNhc3RfcmdiX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwogCiBleHRlcm4gdm9pZCBpbnRlbF9jcnRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYwppbmRleCBmMjg5Yjg2Li5hYTBhOGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCkBAIC00NSw3ICs0NSw2IEBACiAJYm9vbCBoYXNfaGRtaV9zaW5rOwogCWJvb2wgaGFzX2F1ZGlvOwogCWludCBmb3JjZV9hdWRpbzsKLQlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpmb3JjZV9hdWRpb19wcm9wZXJ0eTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50ZWxfaGRtaSAqZW5jX3RvX2ludGVsX2hkbWkoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQpAQCAtMTk0LDcgKzE5Myw3IEBACiAJaWYgKG1vZGUtPmNsb2NrID4gMTY1MDAwKQogCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOwogCWlmIChtb2RlLT5jbG9jayA8IDIwMDAwKQotCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCQlyZXR1cm4gTU9ERV9DTE9DS19MT1c7CiAKIAlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFNDQU4pCiAJCXJldHVybiBNT0RFX05PX0RCTEVTQ0FOOwpAQCAtMjg3LDcgKzI4Niw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChwcm9wZXJ0eSA9PSBpbnRlbF9oZG1pLT5mb3JjZV9hdWRpb19wcm9wZXJ0eSkgeworCWlmIChwcm9wZXJ0eSA9PSBkZXZfcHJpdi0+Zm9yY2VfYXVkaW9fcHJvcGVydHkpIHsKIAkJaW50IGkgPSB2YWw7CiAJCWJvb2wgaGFzX2F1ZGlvOwogCkBAIC0zNjUsMTYgKzM2NCw3IEBACiBzdGF0aWMgdm9pZAogaW50ZWxfaGRtaV9hZGRfcHJvcGVydGllcyhzdHJ1Y3QgaW50ZWxfaGRtaSAqaW50ZWxfaGRtaSwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7Ci0KLQlpbnRlbF9oZG1pLT5mb3JjZV9hdWRpb19wcm9wZXJ0eSA9Ci0JCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFLCAiZm9yY2VfYXVkaW8iLCAyKTsKLQlpZiAoaW50ZWxfaGRtaS0+Zm9yY2VfYXVkaW9fcHJvcGVydHkpIHsKLQkJaW50ZWxfaGRtaS0+Zm9yY2VfYXVkaW9fcHJvcGVydHktPnZhbHVlc1swXSA9IC0xOwotCQlpbnRlbF9oZG1pLT5mb3JjZV9hdWRpb19wcm9wZXJ0eS0+dmFsdWVzWzFdID0gMTsKLQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBpbnRlbF9oZG1pLT5mb3JjZV9hdWRpb19wcm9wZXJ0eSwgMCk7Ci0JfQotCisJaW50ZWxfYXR0YWNoX2ZvcmNlX2F1ZGlvX3Byb3BlcnR5KGNvbm5lY3Rvcik7CiAJaW50ZWxfYXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkoY29ubmVjdG9yKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaTJjLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYwppbmRleCBkM2I5MDNiLi5kOThjZWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYwpAQCAtNDAxLDggKzQwMSw3IEBACiAJCWJ1cy0+cmVnMCA9IGkgfCBHTUJVU19SQVRFXzEwMEtIWjsKIAogCQkvKiBYWFggZm9yY2UgYml0IGJhbmdpbmcgdW50aWwgR01CVVMgaXMgZnVsbHkgZGVidWdnZWQgKi8KLQkJaWYgKElTX0dFTjIoZGV2KSkKLQkJCWJ1cy0+Zm9yY2VfYml0ID0gaW50ZWxfZ3Bpb19jcmVhdGUoZGV2X3ByaXYsIGkpOworCQlidXMtPmZvcmNlX2JpdCA9IGludGVsX2dwaW9fY3JlYXRlKGRldl9wcml2LCBpKTsKIAl9CiAKIAlpbnRlbF9pMmNfcmVzZXQoZGV2X3ByaXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKaW5kZXggNjdjYjA3Ni4uYjI4ZjdiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwpAQCAtNzI3LDYgKzcyNywxNCBAQAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJVODAwIiksCiAJCX0sCiAJfSwKKwl7CisJCS5jYWxsYmFjayA9IGludGVsX25vX2x2ZHNfZG1pX2NhbGxiYWNrLAorCQkuaWRlbnQgPSAiQXN1cyBFZWVCb3ggUEMgRUIxMDA3IiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiRUIxMDA3IiksCisJCX0sCisJfSwKIAogCXsgfQkvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21vZGVzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9tb2Rlcy5jCmluZGV4IDkwMzRkZDhmLi4zYjI2YTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9tb2Rlcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21vZGVzLmMKQEAgLTgxLDYgKzgxLDM2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmZvcmNlX2F1ZGlvX25hbWVzW10gPSB7CisJIm9mZiIsCisJImF1dG8iLAorCSJvbiIsCit9OworCit2b2lkCitpbnRlbF9hdHRhY2hfZm9yY2VfYXVkaW9fcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wOworCWludCBpOworCisJcHJvcCA9IGRldl9wcml2LT5mb3JjZV9hdWRpb19wcm9wZXJ0eTsKKwlpZiAocHJvcCA9PSBOVUxMKSB7CisJCXByb3AgPSBkcm1fcHJvcGVydHlfY3JlYXRlKGRldiwgRFJNX01PREVfUFJPUF9FTlVNLAorCQkJCQkgICAiYXVkaW8iLAorCQkJCQkgICBBUlJBWV9TSVpFKGZvcmNlX2F1ZGlvX25hbWVzKSk7CisJCWlmIChwcm9wID09IE5VTEwpCisJCQlyZXR1cm47CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZm9yY2VfYXVkaW9fbmFtZXMpOyBpKyspCisJCQlkcm1fcHJvcGVydHlfYWRkX2VudW0ocHJvcCwgaSwgaS0xLCBmb3JjZV9hdWRpb19uYW1lc1tpXSk7CisKKwkJZGV2X3ByaXYtPmZvcmNlX2F1ZGlvX3Byb3BlcnR5ID0gcHJvcDsKKwl9CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBwcm9wLCAwKTsKK30KKwogc3RhdGljIGNvbnN0IGNoYXIgKmJyb2FkY2FzdF9yZ2JfbmFtZXNbXSA9IHsKIAkiRnVsbCIsCiAJIkxpbWl0ZWQgMTY6MjM1IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYwppbmRleCBhNjcwYzAwLi45ZTI5NTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jCkBAIC0xNDA5LDYgKzE0MDksMTEgQEAKIAlvdmVybGF5ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGludGVsX292ZXJsYXkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW92ZXJsYXkpCiAJCXJldHVybjsKKworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlpZiAoV0FSTl9PTihkZXZfcHJpdi0+b3ZlcmxheSkpCisJCWdvdG8gb3V0X2ZyZWU7CisKIAlvdmVybGF5LT5kZXYgPSBkZXY7CiAKIAlyZWdfYm8gPSBpOTE1X2dlbV9hbGxvY19vYmplY3QoZGV2LCBQQUdFX1NJWkUpOwpAQCAtMTQ0OCw3ICsxNDUzLDcgQEAKIAogCXJlZ3MgPSBpbnRlbF9vdmVybGF5X21hcF9yZWdzKG92ZXJsYXkpOwogCWlmICghcmVncykKLQkJZ290byBvdXRfZnJlZV9ibzsKKwkJZ290byBvdXRfdW5waW5fYm87CiAKIAltZW1zZXQocmVncywgMCwgc2l6ZW9mKHN0cnVjdCBvdmVybGF5X3JlZ2lzdGVycykpOwogCXVwZGF0ZV9wb2x5cGhhc2VfZmlsdGVyKHJlZ3MpOwpAQCAtMTQ1NywxNCArMTQ2MiwxNyBAQAogCWludGVsX292ZXJsYXlfdW5tYXBfcmVncyhvdmVybGF5LCByZWdzKTsKIAogCWRldl9wcml2LT5vdmVybGF5ID0gb3ZlcmxheTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlEUk1fSU5GTygiaW5pdGlhbGl6ZWQgb3ZlcmxheSBzdXBwb3J0XG4iKTsKIAlyZXR1cm47CiAKIG91dF91bnBpbl9ibzoKLQlpOTE1X2dlbV9vYmplY3RfdW5waW4ocmVnX2JvKTsKKwlpZiAoIU9WRVJMQVlfTkVFRFNfUEhZU0lDQUwoZGV2KSkKKwkJaTkxNV9nZW1fb2JqZWN0X3VucGluKHJlZ19ibyk7CiBvdXRfZnJlZV9ibzoKIAlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmcmVnX2JvLT5iYXNlKTsKIG91dF9mcmVlOgorCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWtmcmVlKG92ZXJsYXkpOwogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaAppbmRleCBjMGUwZWU2Li4zOWFjMmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5oCkBAIC0xNjUsNyArMTY1LDcgQEAKIGludCBfX211c3RfY2hlY2sgaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKTsKIHN0YXRpYyBpbmxpbmUgaW50IGludGVsX3dhaXRfcmluZ19pZGxlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKLQlyZXR1cm4gaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihyaW5nLCByaW5nLT5zcGFjZSAtIDgpOworCXJldHVybiBpbnRlbF93YWl0X3JpbmdfYnVmZmVyKHJpbmcsIHJpbmctPnNpemUgLSA4KTsKIH0KIAogaW50IF9fbXVzdF9jaGVjayBpbnRlbF9yaW5nX2JlZ2luKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgaW50IG4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCmluZGV4IDc1NDA4NmYuLjMwZmU1NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKQEAgLTE0OCw4ICsxNDgsNiBAQAogCWludCAgIGZvcm1hdF9zdXBwb3J0ZWRfbnVtOwogCXN0cnVjdCBkcm1fcHJvcGVydHkgKnR2X2Zvcm1hdDsKIAotCXN0cnVjdCBkcm1fcHJvcGVydHkgKmZvcmNlX2F1ZGlvX3Byb3BlcnR5OwotCiAJLyogYWRkIHRoZSBwcm9wZXJ0eSBmb3IgdGhlIFNEVk8tVFYgKi8KIAlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpsZWZ0OwogCXN0cnVjdCBkcm1fcHJvcGVydHkgKnJpZ2h0OwpAQCAtMTcxMiw3ICsxNzEwLDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHByb3BlcnR5ID09IGludGVsX3Nkdm9fY29ubmVjdG9yLT5mb3JjZV9hdWRpb19wcm9wZXJ0eSkgeworCWlmIChwcm9wZXJ0eSA9PSBkZXZfcHJpdi0+Zm9yY2VfYXVkaW9fcHJvcGVydHkpIHsKIAkJaW50IGkgPSB2YWw7CiAJCWJvb2wgaGFzX2F1ZGlvOwogCkBAIC0yMDM3LDE1ICsyMDM1LDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5iYXNlLmJhc2UuZGV2OwogCi0JY29ubmVjdG9yLT5mb3JjZV9hdWRpb19wcm9wZXJ0eSA9Ci0JCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFLCAiZm9yY2VfYXVkaW8iLCAyKTsKLQlpZiAoY29ubmVjdG9yLT5mb3JjZV9hdWRpb19wcm9wZXJ0eSkgewotCQljb25uZWN0b3ItPmZvcmNlX2F1ZGlvX3Byb3BlcnR5LT52YWx1ZXNbMF0gPSAtMTsKLQkJY29ubmVjdG9yLT5mb3JjZV9hdWRpb19wcm9wZXJ0eS0+dmFsdWVzWzFdID0gMTsKLQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZS5iYXNlLAotCQkJCQkgICAgICBjb25uZWN0b3ItPmZvcmNlX2F1ZGlvX3Byb3BlcnR5LCAwKTsKLQl9Ci0KKwlpbnRlbF9hdHRhY2hfZm9yY2VfYXVkaW9fcHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZS5iYXNlKTsKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCAmJiBJU19NT0JJTEUoZGV2KSkKIAkJaW50ZWxfYXR0YWNoX2Jyb2FkY2FzdF9yZ2JfcHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZS5iYXNlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZHJ2LmgKaW5kZXggMTA4NGZhNC4uNTQ1NThhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZHJ2LmgKQEAgLTE5NSwyOSArMTk1LDEwIEBACiAKICNkZWZpbmUgbWdhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKQlEUk1fV1JJVEVNRU1PUllCQVJSSUVSKCkKIAotI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9fYWxwaGFfXykKLSNkZWZpbmUgTUdBX0JBU0UocmVnKQkJKCh1bnNpZ25lZCBsb25nKShkZXZfcHJpdi0+bW1pby0+aGFuZGxlKSkKLSNkZWZpbmUgTUdBX0FERFIocmVnKQkJKE1HQV9CQVNFKHJlZykgKyByZWcpCi0KLSNkZWZpbmUgTUdBX0RFUkVGKHJlZykJCSgqKHZvbGF0aWxlIHUzMiAqKU1HQV9BRERSKHJlZykpCi0jZGVmaW5lIE1HQV9ERVJFRjgocmVnKQkJKCoodm9sYXRpbGUgdTggKilNR0FfQUREUihyZWcpKQotCi0jZGVmaW5lIE1HQV9SRUFEKHJlZykJCShfTUdBX1JFQUQoKHUzMiAqKU1HQV9BRERSKHJlZykpKQotI2RlZmluZSBNR0FfUkVBRDgocmVnKQkJKF9NR0FfUkVBRCgodTggKilNR0FfQUREUihyZWcpKSkKLSNkZWZpbmUgTUdBX1dSSVRFKHJlZywgdmFsKQlkbyB7IERSTV9XUklURU1FTU9SWUJBUlJJRVIoKTsgTUdBX0RFUkVGKHJlZykgPSB2YWw7IH0gd2hpbGUgKDApCi0jZGVmaW5lIE1HQV9XUklURTgocmVnLCB2YWwpCWRvIHsgRFJNX1dSSVRFTUVNT1JZQkFSUklFUigpOyBNR0FfREVSRUY4KHJlZykgPSB2YWw7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgdTMyIF9NR0FfUkVBRCh1MzIgKmFkZHIpCi17Ci0JRFJNX01FTU9SWUJBUlJJRVIoKTsKLQlyZXR1cm4gKih2b2xhdGlsZSB1MzIgKilhZGRyOwotfQotI2Vsc2UKICNkZWZpbmUgTUdBX1JFQUQ4KHJlZykJCURSTV9SRUFEOChkZXZfcHJpdi0+bW1pbywgKHJlZykpCiAjZGVmaW5lIE1HQV9SRUFEKHJlZykJCURSTV9SRUFEMzIoZGV2X3ByaXYtPm1taW8sIChyZWcpKQogI2RlZmluZSBNR0FfV1JJVEU4KHJlZywgdmFsKQlEUk1fV1JJVEU4KGRldl9wcml2LT5tbWlvLCAocmVnKSwgKHZhbCkpCiAjZGVmaW5lIE1HQV9XUklURShyZWcsIHZhbCkJRFJNX1dSSVRFMzIoZGV2X3ByaXYtPm1taW8sIChyZWcpLCAodmFsKSkKLSNlbmRpZgogCiAjZGVmaW5lIERXR1JFRzAJCTB4MWMwMAogI2RlZmluZSBEV0dSRUcwX0VORAkweDFkZmYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMKaW5kZXggZjBkNDU5Yi4uNTI1NzQ0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMKQEAgLTI2Miw3ICsyNjIsNiBAQAogCQl2Z2FfY291bnQrKzsKIAogCQlyZXR2YWwgPSBub3V2ZWF1X2RzbV9wY2lfcHJvYmUocGRldik7Ci0JCXByaW50aygicmV0IHZhbCBpcyAlZFxuIiwgcmV0dmFsKTsKIAkJaWYgKHJldHZhbCAmIE5PVVZFQVVfRFNNX0hBU19NVVgpCiAJCQloYXNfZHNtIHw9IDE7CiAJCWlmIChyZXR2YWwgJiBOT1VWRUFVX0RTTV9IQVNfT1BUKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jCmluZGV4IDRiOWY0NDkuLjczNDcwNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmVuY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMKQEAgLTMzOSwxMSArMzM5LDEyIEBACiAJaW50IHJldDsKIAogCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4ODQpIHsKLQkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAzKTsKKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCA0KTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKLQkJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCBOVl9TV19TRU1BUEhPUkVfT0ZGU0VULCAyKTsKKwkJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCBOVl9TV19ETUFfU0VNQVBIT1JFLCAzKTsKKwkJT1VUX1JJTkcgIChjaGFuLCBOdlNlbWEpOwogCQlPVVRfUklORyAgKGNoYW4sIHNlbWEtPm1lbS0+c3RhcnQpOwogCQlPVVRfUklORyAgKGNoYW4sIDEpOwogCX0gZWxzZQpAQCAtMzUxLDEwICszNTIsMTIgQEAKIAkJc3RydWN0IG5vdXZlYXVfdm1hICp2bWEgPSAmZGV2X3ByaXYtPmZlbmNlLmJvLT52bWE7CiAJCXU2NCBvZmZzZXQgPSB2bWEtPm9mZnNldCArIHNlbWEtPm1lbS0+c3RhcnQ7CiAKLQkJcmV0ID0gUklOR19TUEFDRShjaGFuLCA1KTsKKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCA3KTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKKwkJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCBOVl9TV19ETUFfU0VNQVBIT1JFLCAxKTsKKwkJT1VUX1JJTkcgIChjaGFuLCBjaGFuLT52cmFtX2hhbmRsZSk7CiAJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgMHgwMDEwLCA0KTsKIAkJT1VUX1JJTkcgIChjaGFuLCB1cHBlcl8zMl9iaXRzKG9mZnNldCkpOwogCQlPVVRfUklORyAgKGNoYW4sIGxvd2VyXzMyX2JpdHMob2Zmc2V0KSk7CkBAIC0zOTQsMTEgKzM5NywxMiBAQAogCWludCByZXQ7CiAKIAlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDg0KSB7Ci0JCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgNCk7CisJCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgNSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgTlZfU1dfU0VNQVBIT1JFX09GRlNFVCwgMSk7CisJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgTlZfU1dfRE1BX1NFTUFQSE9SRSwgMik7CisJCU9VVF9SSU5HICAoY2hhbiwgTnZTZW1hKTsKIAkJT1VUX1JJTkcgIChjaGFuLCBzZW1hLT5tZW0tPnN0YXJ0KTsKIAkJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCBOVl9TV19TRU1BUEhPUkVfUkVMRUFTRSwgMSk7CiAJCU9VVF9SSU5HICAoY2hhbiwgMSk7CkBAIC00MDcsMTAgKzQxMSwxMiBAQAogCQlzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSA9ICZkZXZfcHJpdi0+ZmVuY2UuYm8tPnZtYTsKIAkJdTY0IG9mZnNldCA9IHZtYS0+b2Zmc2V0ICsgc2VtYS0+bWVtLT5zdGFydDsKIAotCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDUpOworCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDcpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAorCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViU3csIE5WX1NXX0RNQV9TRU1BUEhPUkUsIDEpOworCQlPVVRfUklORyAgKGNoYW4sIGNoYW4tPnZyYW1faGFuZGxlKTsKIAkJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCAweDAwMTAsIDQpOwogCQlPVVRfUklORyAgKGNoYW4sIHVwcGVyXzMyX2JpdHMob2Zmc2V0KSk7CiAJCU9VVF9SSU5HICAoY2hhbiwgbG93ZXJfMzJfYml0cyhvZmZzZXQpKTsKQEAgLTUwNCwyMiArNTEwLDIyIEBACiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmogPSBOVUxMOwogCWludCByZXQ7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl9DMCkKLQkJZ290byBvdXRfaW5pdGlhbGlzZWQ7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9DMCkgeworCQkvKiBDcmVhdGUgYW4gTlZfU1cgb2JqZWN0IGZvciB2YXJpb3VzIHN5bmMgcHVycG9zZXMgKi8KKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIE52U3csIE5WX1NXKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKLQkvKiBDcmVhdGUgYW4gTlZfU1cgb2JqZWN0IGZvciB2YXJpb3VzIHN5bmMgcHVycG9zZXMgKi8KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgTnZTdywgTlZfU1cpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JLyogd2UgbGVhdmUgc3ViY2hhbm5lbCBlbXB0eSBmb3IgbnZjMCAqLwotCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViU3csIDAsIDEpOwotCU9VVF9SSU5HKGNoYW4sIE52U3cpOworCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViU3csIDAsIDEpOworCQlPVVRfUklORyAgKGNoYW4sIE52U3cpOworCQlGSVJFX1JJTkcgKGNoYW4pOworCX0KIAotCS8qIENyZWF0ZSBhIERNQSBvYmplY3QgZm9yIHRoZSBzaGFyZWQgY3Jvc3MtY2hhbm5lbCBzeW5jIGFyZWEuICovCisJLyogU2V0dXAgYXJlYSBvZiBtZW1vcnkgc2hhcmVkIGJldHdlZW4gYWxsIGNoYW5uZWxzIGZvciB4LWNoYW4gc3luYyAqLwogCWlmIChVU0VfU0VNQShkZXYpICYmIGRldl9wcml2LT5jaGlwc2V0IDwgMHg4NCkgewogCQlzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSA9ICZkZXZfcHJpdi0+ZmVuY2UuYm8tPmJvLm1lbTsKIApAQCAtNTM0LDIzICs1NDAsOCBAQAogCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJm9iaik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCi0JCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViU3csIE5WX1NXX0RNQV9TRU1BUEhPUkUsIDEpOwotCQlPVVRfUklORyhjaGFuLCBOdlNlbWEpOwotCX0gZWxzZSB7Ci0JCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViU3csIE5WX1NXX0RNQV9TRU1BUEhPUkUsIDEpOwotCQlPVVRfUklORyAgKGNoYW4sIGNoYW4tPnZyYW1faGFuZGxlKTsgLyogd2hvbGUgVk0gKi8KIAl9CiAKLQlGSVJFX1JJTkcoY2hhbik7Ci0KLW91dF9pbml0aWFsaXNlZDoKIAlJTklUX0xJU1RfSEVBRCgmY2hhbi0+ZmVuY2UucGVuZGluZyk7CiAJc3Bpbl9sb2NrX2luaXQoJmNoYW4tPmZlbmNlLmxvY2spOwogCWF0b21pY19zZXQoJmNoYW4tPmZlbmNlLmxhc3Rfc2VxdWVuY2VfaXJxLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaHcuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaHcuYwppbmRleCAwNTNlZGY5Li5iYTg5NmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2h3LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ody5jCkBAIC05MDAsNiArOTAwLDcgQEAKIAl9CiAJLyogTlYxMSBhbmQgTlYyMCBkb24ndCBoYXZlIHRoaXMsIHRoZXkgc3RvcCBhdCAweDUyLiAqLwogCWlmIChudl9nZjRfZGlzcF9hcmNoKGRldikpIHsKKwkJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV80Mik7CiAJCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNTMpOwogCQlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzU0KTsKIApAQCAtMTAwMyw2ICsxMDA0LDcgQEAKIAkJCW5vdXZlYXVfd2FpdF9lcShkZXYsIDY1MDAwMDAwMCwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SLCAweDgsIDB4MCk7CiAJCX0KIAorCQl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzQyKTsKIAkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV81Myk7CiAJCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNTQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tZW0uYwppbmRleCAyOTYwZjU4Li41ZWUxNGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMKQEAgLTM5Nyw3ICszOTcsNyBAQAogCQlpZiAocGNpX2RtYV9zdXBwb3J0ZWQoZGV2LT5wZGV2LCBETUFfQklUX01BU0soNDApKSkKIAkJCWRtYV9iaXRzID0gNDA7CiAJfSBlbHNlCi0JaWYgKGRybV9wY2lfZGV2aWNlX2lzX3BjaWUoZGV2KSAmJgorCWlmICgwICYmIGRybV9wY2lfZGV2aWNlX2lzX3BjaWUoZGV2KSAmJgogCSAgICBkZXZfcHJpdi0+Y2hpcHNldCAgPiAweDQwICYmCiAJICAgIGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NDUpIHsKIAkJaWYgKHBjaV9kbWFfc3VwcG9ydGVkKGRldi0+cGRldiwgRE1BX0JJVF9NQVNLKDM5KSkpCkBAIC04NjgsNyArODY4LDkgQEAKIAkJbm91dmVhdV92bV91bm1hcCgmbm9kZS0+dG1wX3ZtYSk7CiAJCW5vdXZlYXVfdm1fcHV0KCZub2RlLT50bXBfdm1hKTsKIAl9CisKIAltZW0tPm1tX25vZGUgPSBOVUxMOworCWtmcmVlKG5vZGUpOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3BlcmYuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcGVyZi5jCmluZGV4IDkyMmZiNmIuLmVmOWRlYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcGVyZi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcGVyZi5jCkBAIC0xODIsNiArMTgyLDExIEBACiAJCWVudHJpZXMgICA9IHBlcmZbMl07CiAJfQogCisJaWYgKGVudHJpZXMgPiBOT1VWRUFVX1BNX01BWF9MRVZFTCkgeworCQlOVl9ERUJVRyhkZXYsICJwZXJmIHRhYmxlIGhhcyB0b28gbWFueSBlbnRyaWVzIC0gYnVnZ3kgdmJpb3M/XG4iKTsKKwkJZW50cmllcyA9IE5PVVZFQVVfUE1fTUFYX0xFVkVMOworCX0KKwogCWVudHJ5ID0gcGVyZiArIGhlYWRlcmxlbjsKIAlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CiAJCXN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICpwZXJmbHZsID0gJnBtLT5wZXJmbHZsW3BtLT5ucl9wZXJmbHZsXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYwppbmRleCBjNzcxMTFlLi44MmZhZDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jCkBAIC00NTgsNyArNDU4LDcgQEAKIAkJZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlID0gTk9VVkVBVV9HQVJUX0hXOwogCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmZ1bmMgPSAmbnY1MF9zZ2RtYV9iYWNrZW5kOwogCX0gZWxzZQotCWlmIChkcm1fcGNpX2RldmljZV9pc19wY2llKGRldikgJiYKKwlpZiAoMCAmJiBkcm1fcGNpX2RldmljZV9pc19wY2llKGRldikgJiYKIAkgICAgZGV2X3ByaXYtPmNoaXBzZXQgPiAweDQwICYmIGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NDUpIHsKIAkJaWYgKG52NDRfZ3JhcGhfY2xhc3MoZGV2KSkgewogCQkJZGV2X3ByaXYtPmdhcnRfaW5mby5mdW5jID0gJm52NDRfc2dkbWFfYmFja2VuZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuYwppbmRleCAzOGVhNjYyLi43MzFhY2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jCkBAIC01NjMsNjggKzU2Myw2OCBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3RpbWVyOwogCi0Jc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7Ci0JY2FzZSBOVl8wNDoKLQkJbnYwNF9ncmFwaF9jcmVhdGUoZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBOVl8xMDoKLQkJbnYxMF9ncmFwaF9jcmVhdGUoZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBOVl8yMDoKLQljYXNlIE5WXzMwOgotCQludjIwX2dyYXBoX2NyZWF0ZShkZXYpOwotCQlicmVhazsKLQljYXNlIE5WXzQwOgotCQludjQwX2dyYXBoX2NyZWF0ZShkZXYpOwotCQlicmVhazsKLQljYXNlIE5WXzUwOgotCQludjUwX2dyYXBoX2NyZWF0ZShkZXYpOwotCQlicmVhazsKLQljYXNlIE5WX0MwOgotCQludmMwX2dyYXBoX2NyZWF0ZShkZXYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7Ci0JY2FzZSAweDg0OgotCWNhc2UgMHg4NjoKLQljYXNlIDB4OTI6Ci0JY2FzZSAweDk0OgotCWNhc2UgMHg5NjoKLQljYXNlIDB4YTA6Ci0JCW52ODRfY3J5cHRfY3JlYXRlKGRldik7Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAoZGV2X3ByaXYtPmNhcmRfdHlwZSkgewotCWNhc2UgTlZfNTA6Ci0JCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKLQkJY2FzZSAweGEzOgotCQljYXNlIDB4YTU6Ci0JCWNhc2UgMHhhODoKLQkJY2FzZSAweGFmOgotCQkJbnZhM19jb3B5X2NyZWF0ZShkZXYpOworCWlmICghbm91dmVhdV9ub2FjY2VsKSB7CisJCXN3aXRjaCAoZGV2X3ByaXYtPmNhcmRfdHlwZSkgeworCQljYXNlIE5WXzA0OgorCQkJbnYwNF9ncmFwaF9jcmVhdGUoZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIE5WXzEwOgorCQkJbnYxMF9ncmFwaF9jcmVhdGUoZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIE5WXzIwOgorCQljYXNlIE5WXzMwOgorCQkJbnYyMF9ncmFwaF9jcmVhdGUoZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIE5WXzQwOgorCQkJbnY0MF9ncmFwaF9jcmVhdGUoZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIE5WXzUwOgorCQkJbnY1MF9ncmFwaF9jcmVhdGUoZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIE5WX0MwOgorCQkJbnZjMF9ncmFwaF9jcmVhdGUoZGV2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KLQkJYnJlYWs7Ci0JY2FzZSBOVl9DMDoKLQkJbnZjMF9jb3B5X2NyZWF0ZShkZXYsIDApOwotCQludmMwX2NvcHlfY3JlYXRlKGRldiwgMSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KIAotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKQotCQludjQwX21wZWdfY3JlYXRlKGRldik7Ci0JZWxzZQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwICYmCi0JICAgIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4OTggfHwgZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHhhMCkpCi0JCW52NTBfbXBlZ19jcmVhdGUoZGV2KTsKKwkJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCQljYXNlIDB4ODQ6CisJCWNhc2UgMHg4NjoKKwkJY2FzZSAweDkyOgorCQljYXNlIDB4OTQ6CisJCWNhc2UgMHg5NjoKKwkJY2FzZSAweGEwOgorCQkJbnY4NF9jcnlwdF9jcmVhdGUoZGV2KTsKKwkJCWJyZWFrOworCQl9CiAKLQlpZiAoIW5vdXZlYXVfbm9hY2NlbCkgeworCQlzd2l0Y2ggKGRldl9wcml2LT5jYXJkX3R5cGUpIHsKKwkJY2FzZSBOVl81MDoKKwkJCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwkJCWNhc2UgMHhhMzoKKwkJCWNhc2UgMHhhNToKKwkJCWNhc2UgMHhhODoKKwkJCWNhc2UgMHhhZjoKKwkJCQludmEzX2NvcHlfY3JlYXRlKGRldik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOVl9DMDoKKwkJCW52YzBfY29weV9jcmVhdGUoZGV2LCAwKTsKKwkJCW52YzBfY29weV9jcmVhdGUoZGV2LCAxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl80MCkKKwkJCW52NDBfbXBlZ19jcmVhdGUoZGV2KTsKKwkJZWxzZQorCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCAmJgorCQkgICAgKGRldl9wcml2LT5jaGlwc2V0IDwgMHg5OCB8fCBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweGEwKSkKKwkJCW52NTBfbXBlZ19jcmVhdGUoZGV2KTsKKwogCQlmb3IgKGUgPSAwOyBlIDwgTlZPQkpfRU5HSU5FX05SOyBlKyspIHsKIAkJCWlmIChkZXZfcHJpdi0+ZW5nW2VdKSB7CiAJCQkJcmV0ID0gZGV2X3ByaXYtPmVuZ1tlXS0+aW5pdChkZXYsIGUpOwpAQCAtODgwLDggKzg4MCw4IEBACiAKICNpZmRlZiBfX0JJR19FTkRJQU4KIAkvKiBQdXQgdGhlIGNhcmQgaW4gQkUgbW9kZSBpZiBpdCdzIG5vdCAqLwotCWlmIChudl9yZDMyKGRldiwgTlYwM19QTUNfQk9PVF8xKSkKLQkJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0JPT1RfMSwgMHgwMDAwMDAwMSk7CisJaWYgKG52X3JkMzIoZGV2LCBOVjAzX1BNQ19CT09UXzEpICE9IDB4MDEwMDAwMDEpCisJCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19CT09UXzEsIDB4MDEwMDAwMDEpOwogCiAJRFJNX01FTU9SWUJBUlJJRVIoKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5jCmluZGV4IDAwNTllNmYuLjUxOWE2YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmMKQEAgLTU4LDYgKzU4LDcgQEAKIAkJCW51bSAtPSBsZW47CiAJCQlwdGUgKz0gbGVuOwogCQkJaWYgKHVubGlrZWx5KGVuZCA+PSBtYXgpKSB7CisJCQkJcGh5cyArPSBsZW4gPDwgKGJpdHMgKyAxMik7CiAJCQkJcGRlKys7CiAJCQkJcHRlID0gMDsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMKaW5kZXggM2M3OGJjOC4uZjFhM2FlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMKQEAgLTM3Niw3ICszNzYsMTAgQEAKIAkgKi8KIAogCS8qIGZyYW1lYnVmZmVyIGNhbiBiZSBsYXJnZXIgdGhhbiBjcnRjIHNjYW5vdXQgYXJlYS4gKi8KLQlyZWdwLT5DUlRDW05WX0NJT19DUkVfUlBDMF9JTkRFWF0gPSBYTEFURShmYi0+cGl0Y2ggLyA4LCA4LCBOVl9DSU9fQ1JFX1JQQzBfT0ZGU0VUXzEwXzgpOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9SUEMwX0lOREVYXSA9CisJCVhMQVRFKGZiLT5waXRjaCAvIDgsIDgsIE5WX0NJT19DUkVfUlBDMF9PRkZTRVRfMTBfOCk7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFXzQyXSA9CisJCVhMQVRFKGZiLT5waXRjaCAvIDgsIDExLCBOVl9DSU9fQ1JFXzQyX09GRlNFVF8xMSk7CiAJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX1JQQzFfSU5ERVhdID0gbW9kZS0+Y3J0Y19oZGlzcGxheSA8IDEyODAgPwogCQkJCQkgICAgTUFTSyhOVl9DSU9fQ1JFX1JQQzFfTEFSR0UpIDogMHgwMDsKIAlyZWdwLT5DUlRDW05WX0NJT19DUkVfTFNSX0lOREVYXSA9IFhMQVRFKGhvcml6QmxhbmtFbmQsIDYsIE5WX0NJT19DUkVfTFNSX0hCRV82KSB8CkBAIC04MjQsOCArODI3LDExIEBACiAJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfT0ZGU0VUX0lOREVYXSA9IGRybV9mYi0+cGl0Y2ggPj4gMzsKIAlyZWdwLT5DUlRDW05WX0NJT19DUkVfUlBDMF9JTkRFWF0gPQogCQlYTEFURShkcm1fZmItPnBpdGNoID4+IDMsIDgsIE5WX0NJT19DUkVfUlBDMF9PRkZTRVRfMTBfOCk7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFXzQyXSA9CisJCVhMQVRFKGRybV9mYi0+cGl0Y2ggLyA4LCAxMSwgTlZfQ0lPX0NSRV80Ml9PRkZTRVRfMTEpOwogCWNydGNfd3JfY2lvX3N0YXRlKGNydGMsIHJlZ3AsIE5WX0NJT19DUkVfUlBDMF9JTkRFWCk7CiAJY3J0Y193cl9jaW9fc3RhdGUoY3J0YywgcmVncCwgTlZfQ0lPX0NSX09GRlNFVF9JTkRFWCk7CisJY3J0Y193cl9jaW9fc3RhdGUoY3J0YywgcmVncCwgTlZfQ0lPX0NSRV80Mik7CiAKIAkvKiBVcGRhdGUgdGhlIGZyYW1lYnVmZmVyIGxvY2F0aW9uLiAqLwogCXJlZ3AtPmZiX3N0YXJ0ID0gbnZfY3J0Yy0+ZmIub2Zmc2V0ICYgfjM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCmluZGV4IDc0YTNmNjguLjA4ZGE0NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCkBAIC00MDksNyArNDA5LDcgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkaXNwYy0+c3luYzsKIAlpbnQgcmV0OwogCi0JcmV0ID0gUklOR19TUEFDRShldm8sIDI0KTsKKwlyZXQgPSBSSU5HX1NQQUNFKGV2bywgY2hhbiA/IDI1IDogMjcpOwogCWlmICh1bmxpa2VseShyZXQpKQogCQlyZXR1cm4gcmV0OwogCkBAIC00NTgsOCArNDU4LDE5IEBACiAJLyogcXVldWUgdGhlIGZsaXAgb24gdGhlIGNydGMncyAiZGlzcGxheSBzeW5jIiBjaGFubmVsICovCiAJQkVHSU5fUklORyhldm8sIDAsIDB4MDEwMCwgMSk7CiAJT1VUX1JJTkcgIChldm8sIDB4ZmZmZTAwMDApOwotCUJFR0lOX1JJTkcoZXZvLCAwLCAweDAwODQsIDUpOwotCU9VVF9SSU5HICAoZXZvLCBjaGFuID8gMHgwMDAwMDEwMCA6IDB4MDAwMDAwMTApOworCWlmIChjaGFuKSB7CisJCUJFR0lOX1JJTkcoZXZvLCAwLCAweDAwODQsIDEpOworCQlPVVRfUklORyAgKGV2bywgMHgwMDAwMDEwMCk7CisJfSBlbHNlIHsKKwkJQkVHSU5fUklORyhldm8sIDAsIDB4MDA4NCwgMSk7CisJCU9VVF9SSU5HICAoZXZvLCAweDAwMDAwMDEwKTsKKwkJLyogYWxsb3dzIGdhbW1hIHNvbWVob3csIFBESVNQIHdpbGwgYml0Y2ggYXQgeW91IGlmCisJCSAqIHlvdSBkb24ndCB3YWl0IGZvciB2YmxhbmsgYmVmb3JlIGNoYW5naW5nIHRoaXMuLgorCQkgKi8KKwkJQkVHSU5fUklORyhldm8sIDAsIDB4MDBlMCwgMSk7CisJCU9VVF9SSU5HICAoZXZvLCAweDQwMDAwMDAwKTsKKwl9CisJQkVHSU5fUklORyhldm8sIDAsIDB4MDA4OCwgNCk7CiAJT1VUX1JJTkcgIChldm8sIGRpc3BjLT5zZW0ub2Zmc2V0KTsKIAlPVVRfUklORyAgKGV2bywgMHhmMDBkMDAwMCB8IGRpc3BjLT5zZW0udmFsdWUpOwogCU9VVF9SSU5HICAoZXZvLCAweDc0YjFlMDAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JhcGguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JhcGguYwppbmRleCBlMjVjYmI0Li40MDY4MGYyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmFwaC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JhcGguYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZ3JjdHguaCIKICNpbmNsdWRlICJub3V2ZWF1X2RtYS5oIgogI2luY2x1ZGUgIm5vdXZlYXVfdm0uaCIKLSNpbmNsdWRlICJub3V2ZWF1X3JhbWh0LmgiCiAjaW5jbHVkZSAibnY1MF9ldm8uaCIKIAogc3RydWN0IG52NTBfZ3JhcGhfZW5naW5lIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252cmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udnJlZy5oCmluZGV4IGZlMGYyNTMuLmJiZmIxYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252cmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZyZWcuaApAQCAtMjc3LDYgKzI3Nyw4IEBACiAjCQlkZWZpbmUgTlZfQ0lPX0NSRV9FQlJfVkRFXzExCQkyOjIKICMJCWRlZmluZSBOVl9DSU9fQ1JFX0VCUl9WUlNfMTEJCTQ6NAogIwkJZGVmaW5lIE5WX0NJT19DUkVfRUJSX1ZCU18xMQkJNjo2CisjCWRlZmluZSBOVl9DSU9fQ1JFXzQyCQkJMHg0MgorIwkJZGVmaW5lIE5WX0NJT19DUkVfNDJfT0ZGU0VUXzExCQk2OjYKICMJZGVmaW5lIE5WX0NJT19DUkVfNDMJCQkweDQzCiAjCWRlZmluZSBOVl9DSU9fQ1JFXzQ0CQkJMHg0NAkvKiBoZWFkIGNvbnRyb2wgKi8KICMJZGVmaW5lIE5WX0NJT19DUkVfQ1NCCQkJMHg0NQkvKiBjb2xvdXIgc2F0dXJhdGlvbiBib29zdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9LY29uZmlnCmluZGV4IDk3NDZmZWUuLmVhOTJiYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL0tjb25maWcKQEAgLTI4LDExICsyOCw0IEBACiAJICBUaGUga2VybmVsIHdpbGwgYWxzbyBwZXJmb3JtIHNlY3VyaXR5IGNoZWNrIG9uIGNvbW1hbmQgc3RyZWFtCiAJICBwcm92aWRlZCBieSB0aGUgdXNlciwgd2Ugd2FudCB0byBjYXRjaCBhbmQgZm9yYmlkIGFueSBpbGxlZ2FsIHVzZQogCSAgb2YgdGhlIEdQVSBzdWNoIGFzIERNQSBpbnRvIHJhbmRvbSBzeXN0ZW0gbWVtb3J5IG9yIGludG8gbWVtb3J5Ci0JICBub3Qgb3duZWQgYnkgdGhlIHByb2Nlc3Mgc3VwcGx5aW5nIHRoZSBjb21tYW5kIHN0cmVhbS4gVGhpcyBwYXJ0Ci0JICBvZiB0aGUgY29kZSBpcyBzdGlsbCBpbmNvbXBsZXRlIGFuZCB0aGlzIHdoeSB3ZSBwcm9wb3NlIHRoYXQgcGF0Y2gKLQkgIGFzIGEgc3RhZ2luZyBkcml2ZXIgYWRkaXRpb24sIGZ1dHVyZSBzZWN1cml0eSBtaWdodCBmb3JiaWQgY3VycmVudAotCSAgZXhwZXJpbWVudGFsIHVzZXJzcGFjZSB0byBydW4uCi0KLQkgIFRoaXMgY29kZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgaGFyZHdhcmUgOiBSMVhYLFIyWFgsUjNYWCxSNFhYLFI1WFgKLQkgIChyYWRlb24gdXAgdG8gWDE5NTApLiBXb3JrcyBpcyB1bmRlcndheSB0byBwcm92aWRlIHN1cHBvcnQgZm9yIFI2WFgsCi0JICBSN1hYIGFuZCBuZXdlciBoYXJkd2FyZSAocmFkZW9uIGZyb20gSEQyWFhYIHRvIEhENFhYWCkuCisJICBub3Qgb3duZWQgYnkgdGhlIHByb2Nlc3Mgc3VwcGx5aW5nIHRoZSBjb21tYW5kIHN0cmVhbS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3MuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3MuaAppbmRleCA0OTYxMWUyLi4xYjUwYWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvcy5oCkBAIC0xMjAwLDYgKzEyMDAsNyBAQAogI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0JMQU5LSU5HX09GRiAgIDB4MTAKICNkZWZpbmUgRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9CTEFOS0lORyAgICAgICAweDExCiAjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0RBQ0xPQURfREVURUNUSU9OICAgICAgMHgxMgorI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19ERENfU0VUVVAgICAgICAgICAgICAgIDB4MTQKIAogLy8gdWNDb25maWcKICNkZWZpbmUgRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRFBMSU5LUkFURV9NQVNLCQkJCTB4MDMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKaW5kZXggZWM4NDg3OC4uOTU0MTk5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKQEAgLTY3MSw2ICs2NzEsMTMgQEAKIAkJCQkJCQkJRElTUFBMTF9DT05GSUdfRFVBTF9MSU5LOwogCQkJCQl9CiAJCQkJfQorCQkJCWlmIChyYWRlb25fZW5jb2Rlcl9pc19kcF9icmlkZ2UoZW5jb2RlcikpIHsKKwkJCQkJc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciA9IHJhZGVvbl9hdG9tX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOworCQkJCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKmV4dF9yYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGV4dF9lbmNvZGVyKTsKKwkJCQkJYXJncy52My5zSW5wdXQudWNFeHRUcmFuc21pdHRlcklEID0gZXh0X3JhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkOworCQkJCX0gZWxzZQorCQkJCQlhcmdzLnYzLnNJbnB1dC51Y0V4dFRyYW5zbWl0dGVySUQgPSAwOworCiAJCQkJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsCiAJCQkJCQkgICBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwogCQkJCWFkanVzdGVkX2Nsb2NrID0gbGUzMl90b19jcHUoYXJncy52My5zT3V0cHV0LnVsRGlzcFBsbEZyZXEpICogMTA7CkBAIC0xMDQ1LDcgKzEwNTIsNyBAQAogCXVpbnQ2NF90IGZiX2xvY2F0aW9uOwogCXVpbnQzMl90IGZiX2Zvcm1hdCwgZmJfcGl0Y2hfcGl4ZWxzLCB0aWxpbmdfZmxhZ3M7CiAJdTMyIGZiX3N3YXAgPSBFVkVSR1JFRU5fR1JQSF9FTkRJQU5fU1dBUChFVkVSR1JFRU5fR1JQSF9FTkRJQU5fTk9ORSk7Ci0JdTMyIHRtcDsKKwl1MzIgdG1wLCB2aWV3cG9ydF93LCB2aWV3cG9ydF9oOwogCWludCByOwogCiAJLyogbm8gZmIgYm91bmQgKi8KQEAgLTExNzEsOCArMTE3OCwxMCBAQAogCXkgJj0gfjE7CiAJV1JFRzMyKEVWRVJHUkVFTl9WSUVXUE9SVF9TVEFSVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKIAkgICAgICAgKHggPDwgMTYpIHwgeSk7CisJdmlld3BvcnRfdyA9IGNydGMtPm1vZGUuaGRpc3BsYXk7CisJdmlld3BvcnRfaCA9IChjcnRjLT5tb2RlLnZkaXNwbGF5ICsgMSkgJiB+MTsKIAlXUkVHMzIoRVZFUkdSRUVOX1ZJRVdQT1JUX1NJWkUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsCi0JICAgICAgIChjcnRjLT5tb2RlLmhkaXNwbGF5IDw8IDE2KSB8IGNydGMtPm1vZGUudmRpc3BsYXkpOworCSAgICAgICAodmlld3BvcnRfdyA8PCAxNikgfCB2aWV3cG9ydF9oKTsKIAogCS8qIHBhZ2VmbGlwIHNldHVwICovCiAJLyogbWFrZSBzdXJlIGZsaXAgaXMgYXQgdmIgcmF0aGVyIHRoYW4gaGIgKi8KQEAgLTEyMTMsNyArMTIyMiw3IEBACiAJdWludDY0X3QgZmJfbG9jYXRpb247CiAJdWludDMyX3QgZmJfZm9ybWF0LCBmYl9waXRjaF9waXhlbHMsIHRpbGluZ19mbGFnczsKIAl1MzIgZmJfc3dhcCA9IFI2MDBfRDFHUlBIX1NXQVBfRU5ESUFOX05PTkU7Ci0JdTMyIHRtcDsKKwl1MzIgdG1wLCB2aWV3cG9ydF93LCB2aWV3cG9ydF9oOwogCWludCByOwogCiAJLyogbm8gZmIgYm91bmQgKi8KQEAgLTEzMzgsOCArMTM0NywxMCBAQAogCXkgJj0gfjE7CiAJV1JFRzMyKEFWSVZPX0QxTU9ERV9WSUVXUE9SVF9TVEFSVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKIAkgICAgICAgKHggPDwgMTYpIHwgeSk7CisJdmlld3BvcnRfdyA9IGNydGMtPm1vZGUuaGRpc3BsYXk7CisJdmlld3BvcnRfaCA9IChjcnRjLT5tb2RlLnZkaXNwbGF5ICsgMSkgJiB+MTsKIAlXUkVHMzIoQVZJVk9fRDFNT0RFX1ZJRVdQT1JUX1NJWkUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsCi0JICAgICAgIChjcnRjLT5tb2RlLmhkaXNwbGF5IDw8IDE2KSB8IGNydGMtPm1vZGUudmRpc3BsYXkpOworCSAgICAgICAodmlld3BvcnRfdyA8PCAxNikgfCB2aWV3cG9ydF9oKTsKIAogCS8qIHBhZ2VmbGlwIHNldHVwICovCiAJLyogbWFrZSBzdXJlIGZsaXAgaXMgYXQgdmIgcmF0aGVyIHRoYW4gaGIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2F5bWFuX2JsaXRfc2hhZGVycy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jYXltYW5fYmxpdF9zaGFkZXJzLmMKaW5kZXggZTE0OGFiMC4uN2I0ZWViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jYXltYW5fYmxpdF9zaGFkZXJzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jYXltYW5fYmxpdF9zaGFkZXJzLmMKQEAgLTM5LDE3ICszOSwzMzUgQEAKIAogY29uc3QgdTMyIGNheW1hbl9kZWZhdWx0X3N0YXRlW10gPQogewotCS8qIFhYWCBmaWxsIGluIGFkZGl0aW9uYWwgYmxpdCBzdGF0ZSAqLworCTB4YzAwNjY5MDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDYwLCAvKiBEQl9SRU5ERVJfQ09OVFJPTCAqLworCTB4MDAwMDAwMDAsIC8qIERCX0NPVU5UX0NPTlRST0wgKi8KKwkweDAwMDAwMDAwLCAvKiBEQl9ERVBUSF9WSUVXICovCisJMHgwMDAwMDAyYSwgLyogREJfUkVOREVSX09WRVJSSURFICovCisJMHgwMDAwMDAwMCwgLyogREJfUkVOREVSX09WRVJSSURFMiAqLworCTB4MDAwMDAwMDAsIC8qIERCX0hUSUxFX0RBVEFfQkFTRSAqLwogCiAJMHhjMDAyNjkwMCwKLQkweDAwMDAwMzE2LAotCTB4MDAwMDAwMGUsIC8qIFZHVF9WRVJURVhfUkVVU0VfQkxPQ0tfQ05UTCAqLwotCTB4MDAwMDAwMTAsIC8qICAqLworCTB4MDAwMDAwMGEsCisJMHgwMDAwMDAwMCwgLyogREJfU1RFTkNJTF9DTEVBUiAqLworCTB4MDAwMDAwMDAsIC8qIERCX0RFUFRIX0NMRUFSICovCisKKwkweGMwMDM2OTAwLAorCTB4MDAwMDAwMGYsCisJMHgwMDAwMDAwMCwgLyogREJfREVQVEhfSU5GTyAqLworCTB4MDAwMDAwMDAsIC8qIERCX1pfSU5GTyAqLworCTB4MDAwMDAwMDAsIC8qIERCX1NURU5DSUxfSU5GTyAqLworCisJMHhjMDAxNjkwMCwKKwkweDAwMDAwMDgwLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NDX1dJTkRPV19PRkZTRVQgKi8KKworCTB4YzAwZDY5MDAsCisJMHgwMDAwMDA4MywKKwkweDAwMDBmZmZmLCAvKiBQQV9TQ19DTElQUkVDVF9SVUxFICovCisJMHgwMDAwMDAwMCwgLyogUEFfU0NfQ0xJUFJFQ1RfMF9UTCAqLworCTB4MjAwMDIwMDAsIC8qIFBBX1NDX0NMSVBSRUNUXzBfQlIgKi8KKwkweDAwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHgwMDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4MDAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweGFhYWFhYWFhLCAvKiBQQV9TQ19FREdFUlVMRSAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NVX0hBUkRXQVJFX1NDUkVFTl9PRkZTRVQgKi8KKwkweDAwMDAwMDBmLCAvKiBDQl9UQVJHRVRfTUFTSyAqLworCTB4MDAwMDAwMGYsIC8qIENCX1NIQURFUl9NQVNLICovCisKKwkweGMwMjI2OTAwLAorCTB4MDAwMDAwOTQsCisJMHg4MDAwMDAwMCwgLyogUEFfU0NfVlBPUlRfU0NJU1NPUl8wX1RMICovCisJMHgyMDAwMjAwMCwgLyogUEFfU0NfVlBPUlRfU0NJU1NPUl8wX0JSICovCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHg4MDAwMDAwMCwKKwkweDIwMDAyMDAwLAorCTB4ODAwMDAwMDAsCisJMHgyMDAwMjAwMCwKKwkweDgwMDAwMDAwLAorCTB4MjAwMDIwMDAsCisJMHgwMDAwMDAwMCwgLyogUEFfU0NfVlBPUlRfWk1JTl8wICovCisJMHgzZjgwMDAwMCwgLyogUEFfU0NfVlBPUlRfWk1BWF8wICovCisKKwkweGMwMDE2OTAwLAorCTB4MDAwMDAwZDQsCisJMHgwMDAwMDAwMCwgLyogU1hfTUlTQyAqLwogCiAJMHhjMDAyNjkwMCwKIAkweDAwMDAwMGQ5LAogCTB4MDAwMDAwMDAsIC8qIENQX1JJTkdJRCAqLwogCTB4MDAwMDAwMDAsIC8qIENQX1ZNSUQgKi8KKworCTB4YzAwOTY5MDAsCisJMHgwMDAwMDEwMCwKKwkweDAwZmZmZmZmLCAvKiBWR1RfTUFYX1ZUWF9JTkRYICovCisJMHgwMDAwMDAwMCwgLyogVkdUX01JTl9WVFhfSU5EWCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9JTkRYX09GRlNFVCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9NVUxUSV9QUklNX0lCX1JFU0VUX0lORFggKi8KKwkweDAwMDAwMDAwLCAvKiBTWF9BTFBIQV9URVNUX0NPTlRST0wgKi8KKwkweDAwMDAwMDAwLCAvKiBDQl9CTEVORF9SRUQgKi8KKwkweDAwMDAwMDAwLCAvKiBDQl9CTEVORF9HUkVFTiAqLworCTB4MDAwMDAwMDAsIC8qIENCX0JMRU5EX0JMVUUgKi8KKwkweDAwMDAwMDAwLCAvKiBDQl9CTEVORF9BTFBIQSAqLworCisJMHhjMDAxNjkwMCwKKwkweDAwMDAwMTg3LAorCTB4MDAwMDAxMDAsIC8qIFNQSV9WU19PVVRfSURfMCAqLworCisJMHhjMDAyNjkwMCwKKwkweDAwMDAwMTkxLAorCTB4MDAwMDAxMDAsIC8qIFNQSV9QU19JTlBVVF9DTlRMXzAgKi8KKwkweDAwMDAwMTAxLCAvKiBTUElfUFNfSU5QVVRfQ05UTF8xICovCisKKwkweGMwMDE2OTAwLAorCTB4MDAwMDAxYjEsCisJMHgwMDAwMDAwMCwgLyogU1BJX1ZTX09VVF9DT05GSUcgKi8KKworCTB4YzAxMDY5MDAsCisJMHgwMDAwMDFiMywKKwkweDIwMDAwMDAxLCAvKiBTUElfUFNfSU5fQ09OVFJPTF8wICovCisJMHgwMDAwMDAwMCwgLyogU1BJX1BTX0lOX0NPTlRST0xfMSAqLworCTB4MDAwMDAwMDAsIC8qIFNQSV9JTlRFUlBfQ09OVFJPTF8wICovCisJMHgwMDAwMDAwMCwgLyogU1BJX0lOUFVUX1ogKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfRk9HX0NOVEwgKi8KKwkweDAwMTAwMDAwLCAvKiBTUElfQkFSWUNfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFNQSV9QU19JTl9DT05UUk9MXzIgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfQ09NUFVURV9JTlBVVF9DTlRMICovCisJMHgwMDAwMDAwMCwgLyogU1BJX0NPTVBVVEVfTlVNX1RIUkVBRF9YICovCisJMHgwMDAwMDAwMCwgLyogU1BJX0NPTVBVVEVfTlVNX1RIUkVBRF9ZICovCisJMHgwMDAwMDAwMCwgLyogU1BJX0NPTVBVVEVfTlVNX1RIUkVBRF9aICovCisJMHgwMDAwMDAwMCwgLyogU1BJX0dQUl9NR01UICovCisJMHgwMDAwMDAwMCwgLyogU1BJX0xEU19NR01UICovCisJMHgwMDAwMDAwMCwgLyogU1BJX1NUQUNLX01HTVQgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfV0FWRV9NR01UXzEgKi8KKwkweDAwMDAwMDAwLCAvKiBTUElfV0FWRV9NR01UXzIgKi8KKworCTB4YzAwMTY5MDAsCisJMHgwMDAwMDFlMCwKKwkweDAwMDAwMDAwLCAvKiBDQl9CTEVORDBfQ09OVFJPTCAqLworCisJMHhjMDBlNjkwMCwKKwkweDAwMDAwMjAwLAorCTB4MDAwMDAwMDAsIC8qIERCX0RFUFRIX0NPTlRST0wgKi8KKwkweDAwMDAwMDAwLCAvKiBEQl9FUUFBICovCisJMHgwMGNjMDAxMCwgLyogQ0JfQ09MT1JfQ09OVFJPTCAqLworCTB4MDAwMDAyMTAsIC8qIERCX1NIQURFUl9DT05UUk9MICovCisJMHgwMDAxMDAwMCwgLyogUEFfQ0xfQ0xJUF9DTlRMICovCisJMHgwMDAwMDAwNCwgLyogUEFfU1VfU0NfTU9ERV9DTlRMICovCisJMHgwMDAwMDEwMCwgLyogUEFfQ0xfVlRFX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9DTF9WU19PVVRfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFBBX0NMX05BTklORl9DTlRMICovCisJMHgwMDAwMDAwMCwgLyogUEFfU1VfTElORV9TVElQUExFX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TVV9MSU5FX1NUSVBQTEVfU0NBTEUgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TVV9QUklNX0ZJTFRFUl9DTlRMICovCisJMHgwMDAwMDAwMCwgLyogICovCisJMHgwMDAwMDAwMCwgLyogICovCisKKwkweGMwMDI2OTAwLAorCTB4MDAwMDAyMjksCisJMHgwMDAwMDAwMCwgLyogU1FfUEdNX1NUQVJUX0ZTICovCisJMHgwMDAwMDAwMCwKKworCTB4YzAwMTY5MDAsCisJMHgwMDAwMDIzYiwKKwkweDAwMDAwMDAwLCAvKiBTUV9MRFNfQUxMT0NfUFMgKi8KKworCTB4YzAwNjY5MDAsCisJMHgwMDAwMDI0MCwKKwkweDAwMDAwMDAwLCAvKiBTUV9FU0dTX1JJTkdfSVRFTVNJWkUgKi8KKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisKKwkweGMwMDQ2OTAwLAorCTB4MDAwMDAyNDcsCisJMHgwMDAwMDAwMCwgLyogU1FfR1NfVkVSVF9JVEVNU0laRSAqLworCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCisJMHhjMDExNjkwMCwKKwkweDAwMDAwMjgwLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BPSU5UX1NJWkUgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TVV9QT0lOVF9NSU5NQVggKi8KKwkweDAwMDAwMDA4LCAvKiBQQV9TVV9MSU5FX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19MSU5FX1NUSVBQTEUgKi8KKwkweDAwMDAwMDAwLCAvKiBWR1RfT1VUUFVUX1BBVEhfQ05UTCAqLworCTB4MDAwMDAwMDAsIC8qIFZHVF9IT1NfQ05UTCAqLworCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgLyogVkdUX0dTX01PREUgKi8KKworCTB4YzAwMjY5MDAsCisJMHgwMDAwMDI5MiwKKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19NT0RFX0NOVExfMCAqLworCTB4MDAwMDAwMDAsIC8qIFBBX1NDX01PREVfQ05UTF8xICovCisKKwkweGMwMDE2OTAwLAorCTB4MDAwMDAyYTEsCisJMHgwMDAwMDAwMCwgLyogVkdUX1BSSU1JVElWRUlEX0VOICovCisKKwkweGMwMDE2OTAwLAorCTB4MDAwMDAyYTUsCisJMHgwMDAwMDAwMCwgLyogVkdUX01VTFRJX1BSSU1fSUJfUkVTRVRfRU4gKi8KKworCTB4YzAwMjY5MDAsCisJMHgwMDAwMDJhOCwKKwkweDAwMDAwMDAwLCAvKiBWR1RfSU5TVEFOQ0VfU1RFUF9SQVRFXzAgKi8KKwkweDAwMDAwMDAwLAorCisJMHhjMDAyNjkwMCwKKwkweDAwMDAwMmFkLAorCTB4MDAwMDAwMDAsIC8qIFZHVF9SRVVTRV9PRkYgKi8KKwkweDAwMDAwMDAwLAorCisJMHhjMDAxNjkwMCwKKwkweDAwMDAwMmQ1LAorCTB4MDAwMDAwMDAsIC8qIFZHVF9TSEFERVJfU1RBR0VTX0VOICovCisKKwkweGMwMDE2OTAwLAorCTB4MDAwMDAyZGMsCisJMHgwMDAwYWEwMCwgLyogREJfQUxQSEFfVE9fTUFTSyAqLworCisJMHhjMDA2NjkwMCwKKwkweDAwMDAwMmRlLAorCTB4MDAwMDAwMDAsIC8qIFBBX1NVX1BPTFlfT0ZGU0VUX0RCX0ZNVF9DTlRMICovCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCisJMHhjMDAyNjkwMCwKKwkweDAwMDAwMmU1LAorCTB4MDAwMDAwMDAsIC8qIFZHVF9TVFJNT1VUX0NPTkZJRyAqLworCTB4MDAwMDAwMDAsCisKKwkweGMwMWI2OTAwLAorCTB4MDAwMDAyZjUsCisJMHg3NjU0MzIxMCwgLyogUEFfU0NfQ0VOVFJPSURfUFJJT1JJVFlfMCAqLworCTB4ZmVkY2JhOTgsIC8qIFBBX1NDX0NFTlRST0lEX1BSSU9SSVRZXzEgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19MSU5FX0NOVEwgKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19BQV9DT05GSUcgKi8KKwkweDAwMDAwMDA1LCAvKiBQQV9TVV9WVFhfQ05UTCAqLworCTB4M2Y4MDAwMDAsIC8qIFBBX0NMX0dCX1ZFUlRfQ0xJUF9BREogKi8KKwkweDNmODAwMDAwLCAvKiBQQV9DTF9HQl9WRVJUX0RJU0NfQURKICovCisJMHgzZjgwMDAwMCwgLyogUEFfQ0xfR0JfSE9SWl9DTElQX0FESiAqLworCTB4M2Y4MDAwMDAsIC8qIFBBX0NMX0dCX0hPUlpfRElTQ19BREogKi8KKwkweDAwMDAwMDAwLCAvKiBQQV9TQ19BQV9TQU1QTEVfTE9DU19QSVhFTF9YMFkwXzAgKi8KKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwKKwkweGZmZmZmZmZmLCAvKiBQQV9TQ19BQV9NQVNLX1gwWTBfWDFZMCAqLworCTB4ZmZmZmZmZmYsCisKKwkweGMwMDI2OTAwLAorCTB4MDAwMDAzMTYsCisJMHgwMDAwMDAwZSwgLyogVkdUX1ZFUlRFWF9SRVVTRV9CTE9DS19DTlRMICovCisJMHgwMDAwMDAxMCwgLyogICovCiB9OwogCitjb25zdCB1MzIgY2F5bWFuX3ZzW10gPQoreworCTB4MDAwMDAwMDQsCisJMHg4MDQwMDQwMCwKKwkweDAwMDBhMDNjLAorCTB4OTUwMDA2ODgsCisJMHgwMDAwNDAwMCwKKwkweDE1MDAwNjg4LAorCTB4MDAwMDAwMDAsCisJMHg4ODAwMDAwMCwKKwkweDA0MDAwMDAwLAorCTB4Njc5NjEwMDEsCisjaWZkZWYgX19CSUdfRU5ESUFOCisJMHgwMDAyMDAwMCwKKyNlbHNlCisJMHgwMDAwMDAwMCwKKyNlbmRpZgorCTB4MDAwMDAwMDAsCisJMHgwNDAwMDAwMCwKKwkweDY3OTYxMDAwLAorI2lmZGVmIF9fQklHX0VORElBTgorCTB4MDAwMjAwMDgsCisjZWxzZQorCTB4MDAwMDAwMDgsCisjZW5kaWYKKwkweDAwMDAwMDAwLAorfTsKKworY29uc3QgdTMyIGNheW1hbl9wc1tdID0KK3sKKwkweDAwMDAwMDA0LAorCTB4YTAwYzAwMDAsCisJMHgwMDAwMDAwOCwKKwkweDgwNDAwMDAwLAorCTB4MDAwMDAwMDAsCisJMHg5NTAwMDY4OCwKKwkweDAwMDAwMDAwLAorCTB4ODgwMDAwMDAsCisJMHgwMDM4MDQwMCwKKwkweDAwMTQ2YjEwLAorCTB4MDAzODAwMDAsCisJMHgyMDE0NmIxMCwKKwkweDAwMzgwNDAwLAorCTB4NDAxNDZiMDAsCisJMHg4MDM4MDAwMCwKKwkweDYwMTQ2YjAwLAorCTB4MDAwMDAwMTAsCisJMHgwMDBkMTAwMCwKKwkweGIwODAwMDAwLAorCTB4MDAwMDAwMDAsCit9OworCitjb25zdCB1MzIgY2F5bWFuX3BzX3NpemUgPSBBUlJBWV9TSVpFKGNheW1hbl9wcyk7Citjb25zdCB1MzIgY2F5bWFuX3ZzX3NpemUgPSBBUlJBWV9TSVpFKGNheW1hbl92cyk7CiBjb25zdCB1MzIgY2F5bWFuX2RlZmF1bHRfc2l6ZSA9IEFSUkFZX1NJWkUoY2F5bWFuX2RlZmF1bHRfc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jYXltYW5fYmxpdF9zaGFkZXJzLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2NheW1hbl9ibGl0X3NoYWRlcnMuaAppbmRleCAzM2I3NWU1ZC4uZjVkMGU5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jYXltYW5fYmxpdF9zaGFkZXJzLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jYXltYW5fYmxpdF9zaGFkZXJzLmgKQEAgLTI1LDggKzI1LDExIEBACiAjaWZuZGVmIENBWU1BTl9CTElUX1NIQURFUlNfSAogI2RlZmluZSBDQVlNQU5fQkxJVF9TSEFERVJTX0gKIAorZXh0ZXJuIGNvbnN0IHUzMiBjYXltYW5fcHNbXTsKK2V4dGVybiBjb25zdCB1MzIgY2F5bWFuX3ZzW107CiBleHRlcm4gY29uc3QgdTMyIGNheW1hbl9kZWZhdWx0X3N0YXRlW107CiAKK2V4dGVybiBjb25zdCB1MzIgY2F5bWFuX3BzX3NpemUsIGNheW1hbl92c19zaXplOwogZXh0ZXJuIGNvbnN0IHUzMiBjYXltYW5fZGVmYXVsdF9zaXplOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCmluZGV4IDdjMzc2MzguLjE1YmQwNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYwpAQCAtODgsMjEgKzg4LDQwIEBACiAvKiBnZXQgdGVtcGVyYXR1cmUgaW4gbWlsbGlkZWdyZWVzICovCiBpbnQgZXZlcmdyZWVuX2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCXUzMiB0ZW1wID0gKFJSRUczMihDR19NVUxUX1RIRVJNQUxfU1RBVFVTKSAmIEFTSUNfVF9NQVNLKSA+PgotCQlBU0lDX1RfU0hJRlQ7Ci0JdTMyIGFjdHVhbF90ZW1wID0gMDsKKwl1MzIgdGVtcCwgdG9mZnNldDsKKwlpbnQgYWN0dWFsX3RlbXAgPSAwOwogCi0JaWYgKHRlbXAgJiAweDQwMCkKLQkJYWN0dWFsX3RlbXAgPSAtMjU2OwotCWVsc2UgaWYgKHRlbXAgJiAweDIwMCkKLQkJYWN0dWFsX3RlbXAgPSAyNTU7Ci0JZWxzZSBpZiAodGVtcCAmIDB4MTAwKSB7Ci0JCWFjdHVhbF90ZW1wID0gdGVtcCAmIDB4MWZmOwotCQlhY3R1YWxfdGVtcCB8PSB+MHgxZmY7Ci0JfSBlbHNlCi0JCWFjdHVhbF90ZW1wID0gdGVtcCAmIDB4ZmY7CisJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX0pVTklQRVIpIHsKKwkJdG9mZnNldCA9IChSUkVHMzIoQ0dfVEhFUk1BTF9DVFJMKSAmIFRPRkZTRVRfTUFTSykgPj4KKwkJCVRPRkZTRVRfU0hJRlQ7CisJCXRlbXAgPSAoUlJFRzMyKENHX1RTMF9TVEFUVVMpICYgVFMwX0FEQ19ET1VUX01BU0spID4+CisJCQlUUzBfQURDX0RPVVRfU0hJRlQ7CiAKLQlyZXR1cm4gKGFjdHVhbF90ZW1wICogMTAwMCkgLyAyOworCQlpZiAodG9mZnNldCAmIDB4MTAwKQorCQkJYWN0dWFsX3RlbXAgPSB0ZW1wIC8gMiAtICgweDIwMCAtIHRvZmZzZXQpOworCQllbHNlCisJCQlhY3R1YWxfdGVtcCA9IHRlbXAgLyAyICsgdG9mZnNldDsKKworCQlhY3R1YWxfdGVtcCA9IGFjdHVhbF90ZW1wICogMTAwMDsKKworCX0gZWxzZSB7CisJCXRlbXAgPSAoUlJFRzMyKENHX01VTFRfVEhFUk1BTF9TVEFUVVMpICYgQVNJQ19UX01BU0spID4+CisJCQlBU0lDX1RfU0hJRlQ7CisKKwkJaWYgKHRlbXAgJiAweDQwMCkKKwkJCWFjdHVhbF90ZW1wID0gLTI1NjsKKwkJZWxzZSBpZiAodGVtcCAmIDB4MjAwKQorCQkJYWN0dWFsX3RlbXAgPSAyNTU7CisJCWVsc2UgaWYgKHRlbXAgJiAweDEwMCkgeworCQkJYWN0dWFsX3RlbXAgPSB0ZW1wICYgMHgxZmY7CisJCQlhY3R1YWxfdGVtcCB8PSB+MHgxZmY7CisJCX0gZWxzZQorCQkJYWN0dWFsX3RlbXAgPSB0ZW1wICYgMHhmZjsKKworCQlhY3R1YWxfdGVtcCA9IChhY3R1YWxfdGVtcCAqIDEwMDApIC8gMjsKKwl9CisKKwlyZXR1cm4gYWN0dWFsX3RlbXA7CiB9CiAKIGludCBzdW1vX2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpAQCAtMTIxLDExICsxNDAsMTcgQEAKIAlzdHJ1Y3QgcmFkZW9uX3ZvbHRhZ2UgKnZvbHRhZ2UgPSAmcHMtPmNsb2NrX2luZm9bcmVxX2NtX2lkeF0udm9sdGFnZTsKIAogCWlmICh2b2x0YWdlLT50eXBlID09IFZPTFRBR0VfU1cpIHsKKwkJLyogMHhmZjAxIGlzIGEgZmxhZyByYXRoZXIgdGhlbiBhbiBhY3R1YWwgdm9sdGFnZSAqLworCQlpZiAodm9sdGFnZS0+dm9sdGFnZSA9PSAweGZmMDEpCisJCQlyZXR1cm47CiAJCWlmICh2b2x0YWdlLT52b2x0YWdlICYmICh2b2x0YWdlLT52b2x0YWdlICE9IHJkZXYtPnBtLmN1cnJlbnRfdmRkYykpIHsKIAkJCXJhZGVvbl9hdG9tX3NldF92b2x0YWdlKHJkZXYsIHZvbHRhZ2UtPnZvbHRhZ2UsIFNFVF9WT0xUQUdFX1RZUEVfQVNJQ19WRERDKTsKIAkJCXJkZXYtPnBtLmN1cnJlbnRfdmRkYyA9IHZvbHRhZ2UtPnZvbHRhZ2U7CiAJCQlEUk1fREVCVUcoIlNldHRpbmc6IHZkZGM6ICVkXG4iLCB2b2x0YWdlLT52b2x0YWdlKTsKIAkJfQorCQkvKiAweGZmMDEgaXMgYSBmbGFnIHJhdGhlciB0aGVuIGFuIGFjdHVhbCB2b2x0YWdlICovCisJCWlmICh2b2x0YWdlLT52ZGRjaSA9PSAweGZmMDEpCisJCQlyZXR1cm47CiAJCWlmICh2b2x0YWdlLT52ZGRjaSAmJiAodm9sdGFnZS0+dmRkY2kgIT0gcmRldi0+cG0uY3VycmVudF92ZGRjaSkpIHsKIAkJCXJhZGVvbl9hdG9tX3NldF92b2x0YWdlKHJkZXYsIHZvbHRhZ2UtPnZkZGNpLCBTRVRfVk9MVEFHRV9UWVBFX0FTSUNfVkREQ0kpOwogCQkJcmRldi0+cG0uY3VycmVudF92ZGRjaSA9IHZvbHRhZ2UtPnZkZGNpOwpAQCAtOTYwLDE3ICs5ODUsMTkgQEAKIHsKIAlzYXZlLT52Z2FfY29udHJvbFswXSA9IFJSRUczMihEMVZHQV9DT05UUk9MKTsKIAlzYXZlLT52Z2FfY29udHJvbFsxXSA9IFJSRUczMihEMlZHQV9DT05UUk9MKTsKLQlzYXZlLT52Z2FfY29udHJvbFsyXSA9IFJSRUczMihFVkVSR1JFRU5fRDNWR0FfQ09OVFJPTCk7Ci0Jc2F2ZS0+dmdhX2NvbnRyb2xbM10gPSBSUkVHMzIoRVZFUkdSRUVOX0Q0VkdBX0NPTlRST0wpOwotCXNhdmUtPnZnYV9jb250cm9sWzRdID0gUlJFRzMyKEVWRVJHUkVFTl9ENVZHQV9DT05UUk9MKTsKLQlzYXZlLT52Z2FfY29udHJvbFs1XSA9IFJSRUczMihFVkVSR1JFRU5fRDZWR0FfQ09OVFJPTCk7CiAJc2F2ZS0+dmdhX3JlbmRlcl9jb250cm9sID0gUlJFRzMyKFZHQV9SRU5ERVJfQ09OVFJPTCk7CiAJc2F2ZS0+dmdhX2hkcF9jb250cm9sID0gUlJFRzMyKFZHQV9IRFBfQ09OVFJPTCk7CiAJc2F2ZS0+Y3J0Y19jb250cm9sWzBdID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VUKTsKIAlzYXZlLT5jcnRjX2NvbnRyb2xbMV0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQpOwotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgeworCQlzYXZlLT52Z2FfY29udHJvbFsyXSA9IFJSRUczMihFVkVSR1JFRU5fRDNWR0FfQ09OVFJPTCk7CisJCXNhdmUtPnZnYV9jb250cm9sWzNdID0gUlJFRzMyKEVWRVJHUkVFTl9ENFZHQV9DT05UUk9MKTsKIAkJc2F2ZS0+Y3J0Y19jb250cm9sWzJdID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKTsKIAkJc2F2ZS0+Y3J0Y19jb250cm9sWzNdID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VUKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKKwkJc2F2ZS0+dmdhX2NvbnRyb2xbNF0gPSBSUkVHMzIoRVZFUkdSRUVOX0Q1VkdBX0NPTlRST0wpOworCQlzYXZlLT52Z2FfY29udHJvbFs1XSA9IFJSRUczMihFVkVSR1JFRU5fRDZWR0FfQ09OVFJPTCk7CiAJCXNhdmUtPmNydGNfY29udHJvbFs0XSA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCk7CiAJCXNhdmUtPmNydGNfY29udHJvbFs1XSA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCk7CiAJfQpAQCAtOTc5LDM1ICsxMDA2LDQ1IEBACiAJV1JFRzMyKFZHQV9SRU5ERVJfQ09OVFJPTCwgMCk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMSk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMSk7Ci0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDEpOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAxKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMSk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDEpOwogCX0KIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIDApOwogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMCk7CisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJfQogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIDApOwogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDApOwotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMCk7CisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAl9CiAKIAlXUkVHMzIoRDFWR0FfQ09OVFJPTCwgMCk7CiAJV1JFRzMyKEQyVkdBX0NPTlRST0wsIDApOwotCVdSRUczMihFVkVSR1JFRU5fRDNWR0FfQ09OVFJPTCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9ENFZHQV9DT05UUk9MLCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0Q1VkdBX0NPTlRST0wsIDApOwotCVdSRUczMihFVkVSR1JFRU5fRDZWR0FfQ09OVFJPTCwgMCk7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKKwkJV1JFRzMyKEVWRVJHUkVFTl9EM1ZHQV9DT05UUk9MLCAwKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9ENFZHQV9DT05UUk9MLCAwKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKKwkJV1JFRzMyKEVWRVJHUkVFTl9ENVZHQV9DT05UUk9MLCAwKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9ENlZHQV9DT05UUk9MLCAwKTsKKwl9CiB9CiAKIHZvaWQgZXZlcmdyZWVuX21jX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IGV2ZXJncmVlbl9tY19zYXZlICpzYXZlKQpAQCAtMTAzMCw3ICsxMDY3LDcgQEAKIAlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsCiAJICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CiAKLQlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULAogCQkgICAgICAgdXBwZXJfMzJfYml0cyhyZGV2LT5tYy52cmFtX3N0YXJ0KSk7CiAJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULApAQCAtMTA0OCw3ICsxMDg1LDggQEAKIAkJICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CiAJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwKIAkJICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7Ci0KKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULAogCQkgICAgICAgdXBwZXJfMzJfYml0cyhyZGV2LT5tYy52cmFtX3N0YXJ0KSk7CiAJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULApAQCAtMTA3NiwzMSArMTExNCw0MSBAQAogCS8qIFJlc3RvcmUgdmlkZW8gc3RhdGUgKi8KIAlXUkVHMzIoRDFWR0FfQ09OVFJPTCwgc2F2ZS0+dmdhX2NvbnRyb2xbMF0pOwogCVdSRUczMihEMlZHQV9DT05UUk9MLCBzYXZlLT52Z2FfY29udHJvbFsxXSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9EM1ZHQV9DT05UUk9MLCBzYXZlLT52Z2FfY29udHJvbFsyXSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9ENFZHQV9DT05UUk9MLCBzYXZlLT52Z2FfY29udHJvbFszXSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9ENVZHQV9DT05UUk9MLCBzYXZlLT52Z2FfY29udHJvbFs0XSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9ENlZHQV9DT05UUk9MLCBzYXZlLT52Z2FfY29udHJvbFs1XSk7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKKwkJV1JFRzMyKEVWRVJHUkVFTl9EM1ZHQV9DT05UUk9MLCBzYXZlLT52Z2FfY29udHJvbFsyXSk7CisJCVdSRUczMihFVkVSR1JFRU5fRDRWR0FfQ09OVFJPTCwgc2F2ZS0+dmdhX2NvbnRyb2xbM10pOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgeworCQlXUkVHMzIoRVZFUkdSRUVOX0Q1VkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzRdKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9ENlZHQV9DT05UUk9MLCBzYXZlLT52Z2FfY29udHJvbFs1XSk7CisJfQogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIDEpOwogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDEpOwotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAxKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMSk7CisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDEpOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAxKTsKIAl9CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbMF0pOwogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzFdKTsKLQlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbMl0pOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFszXSk7CisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzRdKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbNV0pOwogCX0KIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDApOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJfQpAQCAtMTQxNSw2ICsxNDYzLDggQEAKIAljYXNlIENISVBfQ0VEQVI6CiAJY2FzZSBDSElQX1JFRFdPT0Q6CiAJY2FzZSBDSElQX1BBTE06CisJY2FzZSBDSElQX1NVTU86CisJY2FzZSBDSElQX1NVTU8yOgogCWNhc2UgQ0hJUF9UVVJLUzoKIAljYXNlIENISVBfQ0FJQ09TOgogCQlmb3JjZV9ub19zd2l6emxlID0gZmFsc2U7CkBAIC0xNTQ0LDYgKzE1OTQsOCBAQAogCWNhc2UgQ0hJUF9SRURXT09EOgogCWNhc2UgQ0hJUF9DRURBUjoKIAljYXNlIENISVBfUEFMTToKKwljYXNlIENISVBfU1VNTzoKKwljYXNlIENISVBfU1VNTzI6CiAJY2FzZSBDSElQX1RVUktTOgogCWNhc2UgQ0hJUF9DQUlDT1M6CiAJZGVmYXVsdDoKQEAgLTE2ODksNiArMTc0MSw1NCBAQAogCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX2hpel90aWxlX2ZpZm9fc2l6ZSA9IDB4MzA7CiAJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfZWFybHl6X3RpbGVfZmlmb19zaXplID0gMHgxMzA7CiAJCWJyZWFrOworCWNhc2UgQ0hJUF9TVU1POgorCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXMgPSAxOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9waXBlcyA9IDQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3RpbGVfcGlwZXMgPSAyOworCQlpZiAocmRldi0+cGRldi0+ZGV2aWNlID09IDB4OTY0OCkKKwkJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3NpbWRzID0gMzsKKwkJZWxzZSBpZiAoKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDk2NDcpIHx8CisJCQkgKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDk2NGEpKQorCQkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc2ltZHMgPSA0OworCQllbHNlCisJCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zaW1kcyA9IDU7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2JhY2tlbmRzID0gMiAqIHJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubnVtX3NlczsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3BycyA9IDI1NjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfdGhyZWFkcyA9IDI0ODsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3NfdGhyZWFkcyA9IDMyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zdGFja19lbnRyaWVzID0gMjU2OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X251bV9vZl9zZXRzID0gNDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3NpemUgPSAyNTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9wb3Nfc2l6ZSA9IDY0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfc214X3NpemUgPSAxOTI7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2h3X2NvbnRleHRzID0gODsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zcV9udW1fY2ZfaW5zdHMgPSAyOworCisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfcHJpbV9maWZvX3NpemUgPSAweDQwOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX2hpel90aWxlX2ZpZm9fc2l6ZSA9IDB4MzA7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfZWFybHl6X3RpbGVfZmlmb19zaXplID0gMHgxMzA7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9TVU1PMjoKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5udW1fc2VzID0gMTsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfcGlwZXMgPSA0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF90aWxlX3BpcGVzID0gNDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc2ltZHMgPSAyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9iYWNrZW5kcyA9IDEgKiByZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXM7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dwcnMgPSAyNTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3RocmVhZHMgPSAyNDg7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dzX3RocmVhZHMgPSAzMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc3RhY2tfZW50cmllcyA9IDUxMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9udW1fb2Zfc2V0cyA9IDQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9zaXplID0gMjU2OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfcG9zX3NpemUgPSA2NDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3NteF9zaXplID0gMTkyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9od19jb250ZXh0cyA9IDg7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3FfbnVtX2NmX2luc3RzID0gMjsKKworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX3ByaW1fZmlmb19zaXplID0gMHg0MDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19oaXpfdGlsZV9maWZvX3NpemUgPSAweDMwOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX2Vhcmx5el90aWxlX2ZpZm9fc2l6ZSA9IDB4MTMwOworCQlicmVhazsKIAljYXNlIENISVBfQkFSVFM6CiAJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubnVtX3NlcyA9IDI7CiAJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3BpcGVzID0gNDsKQEAgLTE5MDAsNyArMjAwMCw3IEBACiAJCQlnYl9iYWNrZW5kX21hcCA9IDB4NjY0NDIyMDA7CiAJCQlicmVhazsKIAkJY2FzZSBDSElQX0pVTklQRVI6Ci0JCQlnYl9iYWNrZW5kX21hcCA9IDB4MDAwMDY0MjA7CisJCQlnYl9iYWNrZW5kX21hcCA9IDB4MDAwMDIyMDA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWdiX2JhY2tlbmRfbWFwID0KQEAgLTE5MzYsOSArMjAzNiw5IEBACiAJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4udGlsZV9jb25maWcgfD0gKDMgPDwgMCk7CiAJCWJyZWFrOwogCX0KLQkvKiBudW0gYmFua3MgaXMgOCBvbiBhbGwgZnVzaW9uIGFzaWNzICovCisJLyogbnVtIGJhbmtzIGlzIDggb24gYWxsIGZ1c2lvbiBhc2ljcy4gMCA9IDQsIDEgPSA4LCAyID0gMTYgKi8KIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKQotCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnRpbGVfY29uZmlnIHw9IDggPDwgNDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi50aWxlX2NvbmZpZyB8PSAxIDw8IDQ7CiAJZWxzZQogCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnRpbGVfY29uZmlnIHw9CiAJCQkoKG1jX2FyYl9yYW1jZmcgJiBOT09GQkFOS19NQVNLKSA+PiBOT09GQkFOS19TSElGVCkgPDwgNDsKQEAgLTIwMzksNiArMjEzOSw4IEBACiAJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKIAljYXNlIENISVBfQ0VEQVI6CiAJY2FzZSBDSElQX1BBTE06CisJY2FzZSBDSElQX1NVTU86CisJY2FzZSBDSElQX1NVTU8yOgogCWNhc2UgQ0hJUF9DQUlDT1M6CiAJCS8qIG5vIHZlcnRleCBjYWNoZSAqLwogCQlzcV9jb25maWcgJj0gflZDX0VOQUJMRTsKQEAgLTIwNjAsNiArMjE2Miw4IEBACiAJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKIAljYXNlIENISVBfQ0VEQVI6CiAJY2FzZSBDSElQX1BBTE06CisJY2FzZSBDSElQX1NVTU86CisJY2FzZSBDSElQX1NVTU8yOgogCQlwc190aHJlYWRfY291bnQgPSA5NjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTIwOTksNiArMjIwMyw4IEBACiAJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKIAljYXNlIENISVBfQ0VEQVI6CiAJY2FzZSBDSElQX1BBTE06CisJY2FzZSBDSElQX1NVTU86CisJY2FzZSBDSElQX1NVTU8yOgogCWNhc2UgQ0hJUF9DQUlDT1M6CiAJCXZndF9jYWNoZV9pbnZhbGlkYXRpb24gPSBDQUNIRV9JTlZBTElEQVRJT04oVENfT05MWSk7CiAJCWJyZWFrOwpAQCAtMjE2NSw3ICsyMjcxLDEwIEBACiAKIAkvKiBHZXQgVlJBTSBpbmZvcm1hdGlvbnMgKi8KIAlyZGV2LT5tYy52cmFtX2lzX2RkciA9IHRydWU7Ci0JdG1wID0gUlJFRzMyKE1DX0FSQl9SQU1DRkcpOworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCisJCXRtcCA9IFJSRUczMihGVVNfTUNfQVJCX1JBTUNGRyk7CisJZWxzZQorCQl0bXAgPSBSUkVHMzIoTUNfQVJCX1JBTUNGRyk7CiAJaWYgKHRtcCAmIENIQU5TSVpFX09WRVJSSURFKSB7CiAJCWNoYW5zaXplID0gMTY7CiAJfSBlbHNlIGlmICh0bXAgJiBDSEFOU0laRV9NQVNLKSB7CkBAIC0yMzMxLDE4ICsyNDQwLDIyIEBACiAJV1JFRzMyKEdSQk1fSU5UX0NOVEwsIDApOwogCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIDApOwogCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDApOwotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgewogCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMCk7CisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CiAJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOwogCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAl9CiAKIAlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIDApOwogCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CiAJCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMCk7CisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CiAJCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJfQpAQCAtMjQ2MSwxOSArMjU3NCwyNSBAQAogCiAJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgY3J0YzEpOwogCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIGNydGMyKTsKLQlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKIAkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgY3J0YzMpOwogCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBjcnRjNCk7CisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CiAJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIGNydGM1KTsKIAkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgY3J0YzYpOwogCX0KIAogCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgZ3JwaDEpOwogCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgZ3JwaDIpOwotCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgZ3JwaDMpOwotCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgZ3JwaDQpOwotCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgZ3JwaDUpOwotCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgZ3JwaDYpOworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CisJCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgZ3JwaDMpOworCQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIGdycGg0KTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKKwkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBncnBoNSk7CisJCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgZ3JwaDYpOworCX0KIAogCVdSRUczMihEQ19IUEQxX0lOVF9DT05UUk9MLCBocGQxKTsKIAlXUkVHMzIoRENfSFBEMl9JTlRfQ09OVFJPTCwgaHBkMik7CkBAIC0yNDk3LDUzICsyNjE2LDU3IEBACiAJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDUgPSBSUkVHMzIoRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFNSk7CiAJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDFncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VUKTsKIAlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kMmdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQpOwotCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQzZ3JwaF9pbnQgPSBSUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCk7Ci0JcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDRncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VUKTsKLQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNWdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQpOwotCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ2Z3JwaF9pbnQgPSBSUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCk7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKKwkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDNncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKTsKKwkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDRncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VUKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKKwkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDVncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VUKTsKKwkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDZncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKKwl9CiAKIAlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDFncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQogCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOwogCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kMmdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCiAJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQzZ3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKLQkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKLQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDRncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQotCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOwotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNWdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCi0JCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ2Z3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKLQkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKLQogCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCAmIExCX0QxX1ZCTEFOS19JTlRFUlJVUFQpCiAJCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7CiAJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50ICYgTEJfRDFfVkxJTkVfSU5URVJSVVBUKQogCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKLQogCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250ICYgTEJfRDJfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKIAlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udCAmIExCX0QyX1ZMSU5FX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7CiAKLQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDIgJiBMQl9EM19WQkxBTktfSU5URVJSVVBUKQotCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOwotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmIExCX0QzX1ZMSU5FX0lOVEVSUlVQVCkKLQkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQzZ3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKKwkJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNGdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCisJCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDIgJiBMQl9EM19WQkxBTktfSU5URVJSVVBUKQorCQkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQyICYgTEJfRDNfVkxJTkVfSU5URVJSVVBUKQorCQkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmIExCX0Q0X1ZCTEFOS19JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDMgJiBMQl9ENF9WTElORV9JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKKwl9CiAKLQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDMgJiBMQl9ENF9WQkxBTktfSU5URVJSVVBUKQotCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOwotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmIExCX0Q0X1ZMSU5FX0lOVEVSUlVQVCkKLQkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7Ci0KLQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WQkxBTktfSU5URVJSVVBUKQotCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOwotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmIExCX0Q1X1ZMSU5FX0lOVEVSUlVQVCkKLQkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7Ci0KLQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDUgJiBMQl9ENl9WQkxBTktfSU5URVJSVVBUKQotCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOwotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmIExCX0Q2X1ZMSU5FX0lOVEVSUlVQVCkKLQkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ1Z3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKKwkJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNmdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCisJCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WQkxBTktfSU5URVJSVVBUKQorCQkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ0ICYgTEJfRDVfVkxJTkVfSU5URVJSVVBUKQorCQkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmIExCX0Q2X1ZCTEFOS19JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDUgJiBMQl9ENl9WTElORV9JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKKwl9CiAKIAlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnQgJiBEQ19IUEQxX0lOVEVSUlVQVCkgewogCQl0bXAgPSBSUkVHMzIoRENfSFBEMV9JTlRfQ09OVFJPTCk7CkBAIC0yNjE4LDI4ICsyNzQxLDI1IEBACiAKIGludCBldmVyZ3JlZW5faXJxX3Byb2Nlc3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JdTMyIHdwdHIgPSBldmVyZ3JlZW5fZ2V0X2loX3dwdHIocmRldik7Ci0JdTMyIHJwdHIgPSByZGV2LT5paC5ycHRyOworCXUzMiB3cHRyOworCXUzMiBycHRyOwogCXUzMiBzcmNfaWQsIHNyY19kYXRhOwogCXUzMiByaW5nX2luZGV4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYm9vbCBxdWV1ZV9ob3RwbHVnID0gZmFsc2U7CiAKLQlEUk1fREVCVUcoInI2MDBfaXJxX3Byb2Nlc3Mgc3RhcnQ6IHJwdHIgJWQsIHdwdHIgJWRcbiIsIHJwdHIsIHdwdHIpOwotCWlmICghcmRldi0+aWguZW5hYmxlZCkKKwlpZiAoIXJkZXYtPmloLmVuYWJsZWQgfHwgcmRldi0+c2h1dGRvd24pCiAJCXJldHVybiBJUlFfTk9ORTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZyZGV2LT5paC5sb2NrLCBmbGFncyk7CisJd3B0ciA9IGV2ZXJncmVlbl9nZXRfaWhfd3B0cihyZGV2KTsKKwlycHRyID0gcmRldi0+aWgucnB0cjsKKwlEUk1fREVCVUcoInI2MDBfaXJxX3Byb2Nlc3Mgc3RhcnQ6IHJwdHIgJWQsIHdwdHIgJWRcbiIsIHJwdHIsIHdwdHIpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJkZXYtPmloLmxvY2ssIGZsYWdzKTsKIAlpZiAocnB0ciA9PSB3cHRyKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmloLmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KLQlpZiAocmRldi0+c2h1dGRvd24pIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+aWgubG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCiByZXN0YXJ0X2loOgogCS8qIGRpc3BsYXkgaW50ZXJydXB0cyAqLwogCWV2ZXJncmVlbl9pcnFfYWNrKHJkZXYpOwpAQCAtMjg2OCw3ICsyOTg4LDcgQEAKIAkJCXJhZGVvbl9mZW5jZV9wcm9jZXNzKHJkZXYpOwogCQkJYnJlYWs7CiAJCWNhc2UgMjMzOiAvKiBHVUkgSURMRSAqLwotCQkJRFJNX0RFQlVHKCJJSDogQ1AgRU9QXG4iKTsKKwkJCURSTV9ERUJVRygiSUg6IEdVSSBpZGxlXG4iKTsKIAkJCXJkZXYtPnBtLmd1aV9pZGxlID0gdHJ1ZTsKIAkJCXdha2VfdXAoJnJkZXYtPmlycS5pZGxlX3F1ZXVlKTsKIAkJCWJyZWFrOwpAQCAtMzE1NCw2ICszMjc0LDcgQEAKIAlyNzAwX2NwX2ZpbmkocmRldik7CiAJcjYwMF9pcnFfZmluaShyZGV2KTsKIAlyYWRlb25fd2JfZmluaShyZGV2KTsKKwlyYWRlb25faWJfcG9vbF9maW5pKHJkZXYpOwogCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CiAJZXZlcmdyZWVuX3BjaWVfZ2FydF9maW5pKHJkZXYpOwogCXJhZGVvbl9nZW1fZmluaShyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2JsaXRfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9ibGl0X2ttcy5jCmluZGV4IGJhMDZhNjkuLjJlYjI1MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2JsaXRfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fYmxpdF9rbXMuYwpAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSAiZXZlcmdyZWVuZC5oIgogI2luY2x1ZGUgImV2ZXJncmVlbl9ibGl0X3NoYWRlcnMuaCIKKyNpbmNsdWRlICJjYXltYW5fYmxpdF9zaGFkZXJzLmgiCiAKICNkZWZpbmUgRElfUFRfUkVDVExJU1QgICAgICAgIDB4MTEKICNkZWZpbmUgRElfSU5ERVhfU0laRV8xNl9CSVQgIDB4MApAQCAtMTUyLDYgKzE1Myw4IEBACiAKIAlpZiAoKHJkZXYtPmZhbWlseSA9PSBDSElQX0NFREFSKSB8fAogCSAgICAocmRldi0+ZmFtaWx5ID09IENISVBfUEFMTSkgfHwKKwkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1NVTU8pIHx8CisJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9TVU1PMikgfHwKIAkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX0NBSUNPUykpCiAJCWNwX3NldF9zdXJmYWNlX3N5bmMocmRldiwKIAkJCQkgICAgUEFDS0VUM19UQ19BQ1RJT05fRU5BLCA0OCwgZ3B1X2FkZHIpOwpAQCAtMTk5LDYgKzIwMiwxNiBAQAogc2V0X3NjaXNzb3JzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgeDEsIGludCB5MSwKIAkgICAgIGludCB4MiwgaW50IHkyKQogeworCS8qIHdvcmthcm91bmQgc29tZSBodyBidWdzICovCisJaWYgKHgyID09IDApCisJCXgxID0gMTsKKwlpZiAoeTIgPT0gMCkKKwkJeTEgPSAxOworCWlmIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DQVlNQU4pIHsKKwkJaWYgKCh4MiA9PSAxKSAmJiAoeTIgPT0gMSkpCisJCQl4MiA9IDI7CisJfQorCiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUEFDS0VUMyhQQUNLRVQzX1NFVF9DT05URVhUX1JFRywgMikpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIChQQV9TQ19TQ1JFRU5fU0NJU1NPUl9UTCAtIFBBQ0tFVDNfU0VUX0NPTlRFWFRfUkVHX1NUQVJUKSA+PiAyKTsKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCAoeDEgPDwgMCkgfCAoeTEgPDwgMTYpKTsKQEAgLTIzOSw3ICsyNTIsNyBAQAogCiB9CiAKLS8qIGVtaXRzIDM2ICovCisvKiBlbWl0cyAzOSAqLwogc3RhdGljIHZvaWQKIHNldF9kZWZhdWx0X3N0YXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewpAQCAtMjU1LDIzOCArMjY4LDI4OSBAQAogCXU2NCBncHVfYWRkcjsKIAlpbnQgZHdvcmRzOwogCi0Jc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKLQljYXNlIENISVBfQ0VEQVI6Ci0JZGVmYXVsdDoKLQkJbnVtX3BzX2dwcnMgPSA5MzsKLQkJbnVtX3ZzX2dwcnMgPSA0NjsKLQkJbnVtX3RlbXBfZ3BycyA9IDQ7Ci0JCW51bV9nc19ncHJzID0gMzE7Ci0JCW51bV9lc19ncHJzID0gMzE7Ci0JCW51bV9oc19ncHJzID0gMjM7Ci0JCW51bV9sc19ncHJzID0gMjM7Ci0JCW51bV9wc190aHJlYWRzID0gOTY7Ci0JCW51bV92c190aHJlYWRzID0gMTY7Ci0JCW51bV9nc190aHJlYWRzID0gMTY7Ci0JCW51bV9lc190aHJlYWRzID0gMTY7Ci0JCW51bV9oc190aHJlYWRzID0gMTY7Ci0JCW51bV9sc190aHJlYWRzID0gMTY7Ci0JCW51bV9wc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV92c19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9nc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9lc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9oc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9sc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCWJyZWFrOwotCWNhc2UgQ0hJUF9SRURXT09EOgotCQludW1fcHNfZ3BycyA9IDkzOwotCQludW1fdnNfZ3BycyA9IDQ2OwotCQludW1fdGVtcF9ncHJzID0gNDsKLQkJbnVtX2dzX2dwcnMgPSAzMTsKLQkJbnVtX2VzX2dwcnMgPSAzMTsKLQkJbnVtX2hzX2dwcnMgPSAyMzsKLQkJbnVtX2xzX2dwcnMgPSAyMzsKLQkJbnVtX3BzX3RocmVhZHMgPSAxMjg7Ci0JCW51bV92c190aHJlYWRzID0gMjA7Ci0JCW51bV9nc190aHJlYWRzID0gMjA7Ci0JCW51bV9lc190aHJlYWRzID0gMjA7Ci0JCW51bV9oc190aHJlYWRzID0gMjA7Ci0JCW51bV9sc190aHJlYWRzID0gMjA7Ci0JCW51bV9wc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV92c19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9nc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9lc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9oc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9sc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCWJyZWFrOwotCWNhc2UgQ0hJUF9KVU5JUEVSOgotCQludW1fcHNfZ3BycyA9IDkzOwotCQludW1fdnNfZ3BycyA9IDQ2OwotCQludW1fdGVtcF9ncHJzID0gNDsKLQkJbnVtX2dzX2dwcnMgPSAzMTsKLQkJbnVtX2VzX2dwcnMgPSAzMTsKLQkJbnVtX2hzX2dwcnMgPSAyMzsKLQkJbnVtX2xzX2dwcnMgPSAyMzsKLQkJbnVtX3BzX3RocmVhZHMgPSAxMjg7Ci0JCW51bV92c190aHJlYWRzID0gMjA7Ci0JCW51bV9nc190aHJlYWRzID0gMjA7Ci0JCW51bV9lc190aHJlYWRzID0gMjA7Ci0JCW51bV9oc190aHJlYWRzID0gMjA7Ci0JCW51bV9sc190aHJlYWRzID0gMjA7Ci0JCW51bV9wc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV92c19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9nc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9lc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9oc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9sc19zdGFja19lbnRyaWVzID0gODU7Ci0JCWJyZWFrOwotCWNhc2UgQ0hJUF9DWVBSRVNTOgotCWNhc2UgQ0hJUF9IRU1MT0NLOgotCQludW1fcHNfZ3BycyA9IDkzOwotCQludW1fdnNfZ3BycyA9IDQ2OwotCQludW1fdGVtcF9ncHJzID0gNDsKLQkJbnVtX2dzX2dwcnMgPSAzMTsKLQkJbnVtX2VzX2dwcnMgPSAzMTsKLQkJbnVtX2hzX2dwcnMgPSAyMzsKLQkJbnVtX2xzX2dwcnMgPSAyMzsKLQkJbnVtX3BzX3RocmVhZHMgPSAxMjg7Ci0JCW51bV92c190aHJlYWRzID0gMjA7Ci0JCW51bV9nc190aHJlYWRzID0gMjA7Ci0JCW51bV9lc190aHJlYWRzID0gMjA7Ci0JCW51bV9oc190aHJlYWRzID0gMjA7Ci0JCW51bV9sc190aHJlYWRzID0gMjA7Ci0JCW51bV9wc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV92c19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9nc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9lc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9oc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9sc19zdGFja19lbnRyaWVzID0gODU7Ci0JCWJyZWFrOwotCWNhc2UgQ0hJUF9QQUxNOgotCQludW1fcHNfZ3BycyA9IDkzOwotCQludW1fdnNfZ3BycyA9IDQ2OwotCQludW1fdGVtcF9ncHJzID0gNDsKLQkJbnVtX2dzX2dwcnMgPSAzMTsKLQkJbnVtX2VzX2dwcnMgPSAzMTsKLQkJbnVtX2hzX2dwcnMgPSAyMzsKLQkJbnVtX2xzX2dwcnMgPSAyMzsKLQkJbnVtX3BzX3RocmVhZHMgPSA5NjsKLQkJbnVtX3ZzX3RocmVhZHMgPSAxNjsKLQkJbnVtX2dzX3RocmVhZHMgPSAxNjsKLQkJbnVtX2VzX3RocmVhZHMgPSAxNjsKLQkJbnVtX2hzX3RocmVhZHMgPSAxNjsKLQkJbnVtX2xzX3RocmVhZHMgPSAxNjsKLQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA0MjsKLQkJYnJlYWs7Ci0JY2FzZSBDSElQX0JBUlRTOgotCQludW1fcHNfZ3BycyA9IDkzOwotCQludW1fdnNfZ3BycyA9IDQ2OwotCQludW1fdGVtcF9ncHJzID0gNDsKLQkJbnVtX2dzX2dwcnMgPSAzMTsKLQkJbnVtX2VzX2dwcnMgPSAzMTsKLQkJbnVtX2hzX2dwcnMgPSAyMzsKLQkJbnVtX2xzX2dwcnMgPSAyMzsKLQkJbnVtX3BzX3RocmVhZHMgPSAxMjg7Ci0JCW51bV92c190aHJlYWRzID0gMjA7Ci0JCW51bV9nc190aHJlYWRzID0gMjA7Ci0JCW51bV9lc190aHJlYWRzID0gMjA7Ci0JCW51bV9oc190aHJlYWRzID0gMjA7Ci0JCW51bV9sc190aHJlYWRzID0gMjA7Ci0JCW51bV9wc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV92c19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9nc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9lc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9oc19zdGFja19lbnRyaWVzID0gODU7Ci0JCW51bV9sc19zdGFja19lbnRyaWVzID0gODU7Ci0JCWJyZWFrOwotCWNhc2UgQ0hJUF9UVVJLUzoKLQkJbnVtX3BzX2dwcnMgPSA5MzsKLQkJbnVtX3ZzX2dwcnMgPSA0NjsKLQkJbnVtX3RlbXBfZ3BycyA9IDQ7Ci0JCW51bV9nc19ncHJzID0gMzE7Ci0JCW51bV9lc19ncHJzID0gMzE7Ci0JCW51bV9oc19ncHJzID0gMjM7Ci0JCW51bV9sc19ncHJzID0gMjM7Ci0JCW51bV9wc190aHJlYWRzID0gMTI4OwotCQludW1fdnNfdGhyZWFkcyA9IDIwOwotCQludW1fZ3NfdGhyZWFkcyA9IDIwOwotCQludW1fZXNfdGhyZWFkcyA9IDIwOwotCQludW1faHNfdGhyZWFkcyA9IDIwOwotCQludW1fbHNfdGhyZWFkcyA9IDIwOwotCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDQyOwotCQludW1fdnNfc3RhY2tfZW50cmllcyA9IDQyOwotCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDQyOwotCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDQyOwotCQludW1faHNfc3RhY2tfZW50cmllcyA9IDQyOwotCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDQyOwotCQlicmVhazsKLQljYXNlIENISVBfQ0FJQ09TOgotCQludW1fcHNfZ3BycyA9IDkzOwotCQludW1fdnNfZ3BycyA9IDQ2OwotCQludW1fdGVtcF9ncHJzID0gNDsKLQkJbnVtX2dzX2dwcnMgPSAzMTsKLQkJbnVtX2VzX2dwcnMgPSAzMTsKLQkJbnVtX2hzX2dwcnMgPSAyMzsKLQkJbnVtX2xzX2dwcnMgPSAyMzsKLQkJbnVtX3BzX3RocmVhZHMgPSAxMjg7Ci0JCW51bV92c190aHJlYWRzID0gMTA7Ci0JCW51bV9nc190aHJlYWRzID0gMTA7Ci0JCW51bV9lc190aHJlYWRzID0gMTA7Ci0JCW51bV9oc190aHJlYWRzID0gMTA7Ci0JCW51bV9sc190aHJlYWRzID0gMTA7Ci0JCW51bV9wc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV92c19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9nc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9lc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9oc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCW51bV9sc19zdGFja19lbnRyaWVzID0gNDI7Ci0JCWJyZWFrOwotCX0KLQotCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfQ0VEQVIpIHx8Ci0JICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9QQUxNKSB8fAotCSAgICAocmRldi0+ZmFtaWx5ID09IENISVBfQ0FJQ09TKSkKLQkJc3FfY29uZmlnID0gMDsKLQllbHNlCi0JCXNxX2NvbmZpZyA9IFZDX0VOQUJMRTsKLQotCXNxX2NvbmZpZyB8PSAoRVhQT1JUX1NSQ19DIHwKLQkJICAgICAgQ1NfUFJJTygwKSB8Ci0JCSAgICAgIExTX1BSSU8oMCkgfAotCQkgICAgICBIU19QUklPKDApIHwKLQkJICAgICAgUFNfUFJJTygwKSB8Ci0JCSAgICAgIFZTX1BSSU8oMSkgfAotCQkgICAgICBHU19QUklPKDIpIHwKLQkJICAgICAgRVNfUFJJTygzKSk7Ci0KLQlzcV9ncHJfcmVzb3VyY2VfbWdtdF8xID0gKE5VTV9QU19HUFJTKG51bV9wc19ncHJzKSB8Ci0JCQkJICBOVU1fVlNfR1BSUyhudW1fdnNfZ3BycykgfAotCQkJCSAgTlVNX0NMQVVTRV9URU1QX0dQUlMobnVtX3RlbXBfZ3BycykpOwotCXNxX2dwcl9yZXNvdXJjZV9tZ210XzIgPSAoTlVNX0dTX0dQUlMobnVtX2dzX2dwcnMpIHwKLQkJCQkgIE5VTV9FU19HUFJTKG51bV9lc19ncHJzKSk7Ci0Jc3FfZ3ByX3Jlc291cmNlX21nbXRfMyA9IChOVU1fSFNfR1BSUyhudW1faHNfZ3BycykgfAotCQkJCSAgTlVNX0xTX0dQUlMobnVtX2xzX2dwcnMpKTsKLQlzcV90aHJlYWRfcmVzb3VyY2VfbWdtdCA9IChOVU1fUFNfVEhSRUFEUyhudW1fcHNfdGhyZWFkcykgfAotCQkJCSAgIE5VTV9WU19USFJFQURTKG51bV92c190aHJlYWRzKSB8Ci0JCQkJICAgTlVNX0dTX1RIUkVBRFMobnVtX2dzX3RocmVhZHMpIHwKLQkJCQkgICBOVU1fRVNfVEhSRUFEUyhudW1fZXNfdGhyZWFkcykpOwotCXNxX3RocmVhZF9yZXNvdXJjZV9tZ210XzIgPSAoTlVNX0hTX1RIUkVBRFMobnVtX2hzX3RocmVhZHMpIHwKLQkJCQkgICAgIE5VTV9MU19USFJFQURTKG51bV9sc190aHJlYWRzKSk7Ci0Jc3Ffc3RhY2tfcmVzb3VyY2VfbWdtdF8xID0gKE5VTV9QU19TVEFDS19FTlRSSUVTKG51bV9wc19zdGFja19lbnRyaWVzKSB8Ci0JCQkJICAgIE5VTV9WU19TVEFDS19FTlRSSUVTKG51bV92c19zdGFja19lbnRyaWVzKSk7Ci0Jc3Ffc3RhY2tfcmVzb3VyY2VfbWdtdF8yID0gKE5VTV9HU19TVEFDS19FTlRSSUVTKG51bV9nc19zdGFja19lbnRyaWVzKSB8Ci0JCQkJICAgIE5VTV9FU19TVEFDS19FTlRSSUVTKG51bV9lc19zdGFja19lbnRyaWVzKSk7Ci0Jc3Ffc3RhY2tfcmVzb3VyY2VfbWdtdF8zID0gKE5VTV9IU19TVEFDS19FTlRSSUVTKG51bV9oc19zdGFja19lbnRyaWVzKSB8Ci0JCQkJICAgIE5VTV9MU19TVEFDS19FTlRSSUVTKG51bV9sc19zdGFja19lbnRyaWVzKSk7Ci0KIAkvKiBzZXQgY2xlYXIgY29udGV4dCBzdGF0ZSAqLwogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19DTEVBUl9TVEFURSwgMCkpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDApOwogCi0JLyogZGlzYWJsZSBkeW4gZ3BycyAqLwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19TRVRfQ09ORklHX1JFRywgMSkpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIChTUV9EWU5fR1BSX0NOVExfUFNfRkxVU0hfUkVRIC0gUEFDS0VUM19TRVRfQ09ORklHX1JFR19TVEFSVCkgPj4gMik7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CisJaWYgKHJkZXYtPmZhbWlseSA8IENISVBfQ0FZTUFOKSB7CisJCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CisJCWNhc2UgQ0hJUF9DRURBUjoKKwkJZGVmYXVsdDoKKwkJCW51bV9wc19ncHJzID0gOTM7CisJCQludW1fdnNfZ3BycyA9IDQ2OworCQkJbnVtX3RlbXBfZ3BycyA9IDQ7CisJCQludW1fZ3NfZ3BycyA9IDMxOworCQkJbnVtX2VzX2dwcnMgPSAzMTsKKwkJCW51bV9oc19ncHJzID0gMjM7CisJCQludW1fbHNfZ3BycyA9IDIzOworCQkJbnVtX3BzX3RocmVhZHMgPSA5NjsKKwkJCW51bV92c190aHJlYWRzID0gMTY7CisJCQludW1fZ3NfdGhyZWFkcyA9IDE2OworCQkJbnVtX2VzX3RocmVhZHMgPSAxNjsKKwkJCW51bV9oc190aHJlYWRzID0gMTY7CisJCQludW1fbHNfdGhyZWFkcyA9IDE2OworCQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV92c19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9oc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJYnJlYWs7CisJCWNhc2UgQ0hJUF9SRURXT09EOgorCQkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJCW51bV92c19ncHJzID0gNDY7CisJCQludW1fdGVtcF9ncHJzID0gNDsKKwkJCW51bV9nc19ncHJzID0gMzE7CisJCQludW1fZXNfZ3BycyA9IDMxOworCQkJbnVtX2hzX2dwcnMgPSAyMzsKKwkJCW51bV9sc19ncHJzID0gMjM7CisJCQludW1fcHNfdGhyZWFkcyA9IDEyODsKKwkJCW51bV92c190aHJlYWRzID0gMjA7CisJCQludW1fZ3NfdGhyZWFkcyA9IDIwOworCQkJbnVtX2VzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9oc190aHJlYWRzID0gMjA7CisJCQludW1fbHNfdGhyZWFkcyA9IDIwOworCQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV92c19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9oc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJYnJlYWs7CisJCWNhc2UgQ0hJUF9KVU5JUEVSOgorCQkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJCW51bV92c19ncHJzID0gNDY7CisJCQludW1fdGVtcF9ncHJzID0gNDsKKwkJCW51bV9nc19ncHJzID0gMzE7CisJCQludW1fZXNfZ3BycyA9IDMxOworCQkJbnVtX2hzX2dwcnMgPSAyMzsKKwkJCW51bV9sc19ncHJzID0gMjM7CisJCQludW1fcHNfdGhyZWFkcyA9IDEyODsKKwkJCW51bV92c190aHJlYWRzID0gMjA7CisJCQludW1fZ3NfdGhyZWFkcyA9IDIwOworCQkJbnVtX2VzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9oc190aHJlYWRzID0gMjA7CisJCQludW1fbHNfdGhyZWFkcyA9IDIwOworCQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV92c19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV9oc19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJYnJlYWs7CisJCWNhc2UgQ0hJUF9DWVBSRVNTOgorCQljYXNlIENISVBfSEVNTE9DSzoKKwkJCW51bV9wc19ncHJzID0gOTM7CisJCQludW1fdnNfZ3BycyA9IDQ2OworCQkJbnVtX3RlbXBfZ3BycyA9IDQ7CisJCQludW1fZ3NfZ3BycyA9IDMxOworCQkJbnVtX2VzX2dwcnMgPSAzMTsKKwkJCW51bV9oc19ncHJzID0gMjM7CisJCQludW1fbHNfZ3BycyA9IDIzOworCQkJbnVtX3BzX3RocmVhZHMgPSAxMjg7CisJCQludW1fdnNfdGhyZWFkcyA9IDIwOworCQkJbnVtX2dzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9lc190aHJlYWRzID0gMjA7CisJCQludW1faHNfdGhyZWFkcyA9IDIwOworCQkJbnVtX2xzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9wc19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1fdnNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV9lc19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1faHNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCWJyZWFrOworCQljYXNlIENISVBfUEFMTToKKwkJCW51bV9wc19ncHJzID0gOTM7CisJCQludW1fdnNfZ3BycyA9IDQ2OworCQkJbnVtX3RlbXBfZ3BycyA9IDQ7CisJCQludW1fZ3NfZ3BycyA9IDMxOworCQkJbnVtX2VzX2dwcnMgPSAzMTsKKwkJCW51bV9oc19ncHJzID0gMjM7CisJCQludW1fbHNfZ3BycyA9IDIzOworCQkJbnVtX3BzX3RocmVhZHMgPSA5NjsKKwkJCW51bV92c190aHJlYWRzID0gMTY7CisJCQludW1fZ3NfdGhyZWFkcyA9IDE2OworCQkJbnVtX2VzX3RocmVhZHMgPSAxNjsKKwkJCW51bV9oc190aHJlYWRzID0gMTY7CisJCQludW1fbHNfdGhyZWFkcyA9IDE2OworCQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV92c19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9oc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJYnJlYWs7CisJCWNhc2UgQ0hJUF9TVU1POgorCQkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJCW51bV92c19ncHJzID0gNDY7CisJCQludW1fdGVtcF9ncHJzID0gNDsKKwkJCW51bV9nc19ncHJzID0gMzE7CisJCQludW1fZXNfZ3BycyA9IDMxOworCQkJbnVtX2hzX2dwcnMgPSAyMzsKKwkJCW51bV9sc19ncHJzID0gMjM7CisJCQludW1fcHNfdGhyZWFkcyA9IDk2OworCQkJbnVtX3ZzX3RocmVhZHMgPSAyNTsKKwkJCW51bV9nc190aHJlYWRzID0gMjU7CisJCQludW1fZXNfdGhyZWFkcyA9IDI1OworCQkJbnVtX2hzX3RocmVhZHMgPSAyNTsKKwkJCW51bV9sc190aHJlYWRzID0gMjU7CisJCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9nc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9sc19zdGFja19lbnRyaWVzID0gNDI7CisJCQlicmVhazsKKwkJY2FzZSBDSElQX1NVTU8yOgorCQkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJCW51bV92c19ncHJzID0gNDY7CisJCQludW1fdGVtcF9ncHJzID0gNDsKKwkJCW51bV9nc19ncHJzID0gMzE7CisJCQludW1fZXNfZ3BycyA9IDMxOworCQkJbnVtX2hzX2dwcnMgPSAyMzsKKwkJCW51bV9sc19ncHJzID0gMjM7CisJCQludW1fcHNfdGhyZWFkcyA9IDk2OworCQkJbnVtX3ZzX3RocmVhZHMgPSAyNTsKKwkJCW51bV9nc190aHJlYWRzID0gMjU7CisJCQludW1fZXNfdGhyZWFkcyA9IDI1OworCQkJbnVtX2hzX3RocmVhZHMgPSAyNTsKKwkJCW51bV9sc190aHJlYWRzID0gMjU7CisJCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV9nc19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV9sc19zdGFja19lbnRyaWVzID0gODU7CisJCQlicmVhazsKKwkJY2FzZSBDSElQX0JBUlRTOgorCQkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJCW51bV92c19ncHJzID0gNDY7CisJCQludW1fdGVtcF9ncHJzID0gNDsKKwkJCW51bV9nc19ncHJzID0gMzE7CisJCQludW1fZXNfZ3BycyA9IDMxOworCQkJbnVtX2hzX2dwcnMgPSAyMzsKKwkJCW51bV9sc19ncHJzID0gMjM7CisJCQludW1fcHNfdGhyZWFkcyA9IDEyODsKKwkJCW51bV92c190aHJlYWRzID0gMjA7CisJCQludW1fZ3NfdGhyZWFkcyA9IDIwOworCQkJbnVtX2VzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9oc190aHJlYWRzID0gMjA7CisJCQludW1fbHNfdGhyZWFkcyA9IDIwOworCQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV92c19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDg1OworCQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA4NTsKKwkJCW51bV9oc19zdGFja19lbnRyaWVzID0gODU7CisJCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDg1OworCQkJYnJlYWs7CisJCWNhc2UgQ0hJUF9UVVJLUzoKKwkJCW51bV9wc19ncHJzID0gOTM7CisJCQludW1fdnNfZ3BycyA9IDQ2OworCQkJbnVtX3RlbXBfZ3BycyA9IDQ7CisJCQludW1fZ3NfZ3BycyA9IDMxOworCQkJbnVtX2VzX2dwcnMgPSAzMTsKKwkJCW51bV9oc19ncHJzID0gMjM7CisJCQludW1fbHNfZ3BycyA9IDIzOworCQkJbnVtX3BzX3RocmVhZHMgPSAxMjg7CisJCQludW1fdnNfdGhyZWFkcyA9IDIwOworCQkJbnVtX2dzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9lc190aHJlYWRzID0gMjA7CisJCQludW1faHNfdGhyZWFkcyA9IDIwOworCQkJbnVtX2xzX3RocmVhZHMgPSAyMDsKKwkJCW51bV9wc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fdnNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9lc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1faHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCWJyZWFrOworCQljYXNlIENISVBfQ0FJQ09TOgorCQkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJCW51bV92c19ncHJzID0gNDY7CisJCQludW1fdGVtcF9ncHJzID0gNDsKKwkJCW51bV9nc19ncHJzID0gMzE7CisJCQludW1fZXNfZ3BycyA9IDMxOworCQkJbnVtX2hzX2dwcnMgPSAyMzsKKwkJCW51bV9sc19ncHJzID0gMjM7CisJCQludW1fcHNfdGhyZWFkcyA9IDEyODsKKwkJCW51bV92c190aHJlYWRzID0gMTA7CisJCQludW1fZ3NfdGhyZWFkcyA9IDEwOworCQkJbnVtX2VzX3RocmVhZHMgPSAxMDsKKwkJCW51bV9oc190aHJlYWRzID0gMTA7CisJCQludW1fbHNfdGhyZWFkcyA9IDEwOworCQkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV92c19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDQyOworCQkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJCW51bV9oc19zdGFja19lbnRyaWVzID0gNDI7CisJCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDQyOworCQkJYnJlYWs7CisJCX0KIAotCS8qIFNRIGNvbmZpZyAqLwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19TRVRfQ09ORklHX1JFRywgMTEpKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAoU1FfQ09ORklHIC0gUEFDS0VUM19TRVRfQ09ORklHX1JFR19TVEFSVCkgPj4gMik7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgc3FfY29uZmlnKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9ncHJfcmVzb3VyY2VfbWdtdF8xKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9ncHJfcmVzb3VyY2VfbWdtdF8yKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9ncHJfcmVzb3VyY2VfbWdtdF8zKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV90aHJlYWRfcmVzb3VyY2VfbWdtdCk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgc3FfdGhyZWFkX3Jlc291cmNlX21nbXRfMik7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgc3Ffc3RhY2tfcmVzb3VyY2VfbWdtdF8xKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9zdGFja19yZXNvdXJjZV9tZ210XzIpOwotCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX3N0YWNrX3Jlc291cmNlX21nbXRfMyk7CisJCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfQ0VEQVIpIHx8CisJCSAgICAocmRldi0+ZmFtaWx5ID09IENISVBfUEFMTSkgfHwKKwkJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9TVU1PKSB8fAorCQkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1NVTU8yKSB8fAorCQkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX0NBSUNPUykpCisJCQlzcV9jb25maWcgPSAwOworCQllbHNlCisJCQlzcV9jb25maWcgPSBWQ19FTkFCTEU7CisKKwkJc3FfY29uZmlnIHw9IChFWFBPUlRfU1JDX0MgfAorCQkJICAgICAgQ1NfUFJJTygwKSB8CisJCQkgICAgICBMU19QUklPKDApIHwKKwkJCSAgICAgIEhTX1BSSU8oMCkgfAorCQkJICAgICAgUFNfUFJJTygwKSB8CisJCQkgICAgICBWU19QUklPKDEpIHwKKwkJCSAgICAgIEdTX1BSSU8oMikgfAorCQkJICAgICAgRVNfUFJJTygzKSk7CisKKwkJc3FfZ3ByX3Jlc291cmNlX21nbXRfMSA9IChOVU1fUFNfR1BSUyhudW1fcHNfZ3BycykgfAorCQkJCQkgIE5VTV9WU19HUFJTKG51bV92c19ncHJzKSB8CisJCQkJCSAgTlVNX0NMQVVTRV9URU1QX0dQUlMobnVtX3RlbXBfZ3BycykpOworCQlzcV9ncHJfcmVzb3VyY2VfbWdtdF8yID0gKE5VTV9HU19HUFJTKG51bV9nc19ncHJzKSB8CisJCQkJCSAgTlVNX0VTX0dQUlMobnVtX2VzX2dwcnMpKTsKKwkJc3FfZ3ByX3Jlc291cmNlX21nbXRfMyA9IChOVU1fSFNfR1BSUyhudW1faHNfZ3BycykgfAorCQkJCQkgIE5VTV9MU19HUFJTKG51bV9sc19ncHJzKSk7CisJCXNxX3RocmVhZF9yZXNvdXJjZV9tZ210ID0gKE5VTV9QU19USFJFQURTKG51bV9wc190aHJlYWRzKSB8CisJCQkJCSAgIE5VTV9WU19USFJFQURTKG51bV92c190aHJlYWRzKSB8CisJCQkJCSAgIE5VTV9HU19USFJFQURTKG51bV9nc190aHJlYWRzKSB8CisJCQkJCSAgIE5VTV9FU19USFJFQURTKG51bV9lc190aHJlYWRzKSk7CisJCXNxX3RocmVhZF9yZXNvdXJjZV9tZ210XzIgPSAoTlVNX0hTX1RIUkVBRFMobnVtX2hzX3RocmVhZHMpIHwKKwkJCQkJICAgICBOVU1fTFNfVEhSRUFEUyhudW1fbHNfdGhyZWFkcykpOworCQlzcV9zdGFja19yZXNvdXJjZV9tZ210XzEgPSAoTlVNX1BTX1NUQUNLX0VOVFJJRVMobnVtX3BzX3N0YWNrX2VudHJpZXMpIHwKKwkJCQkJICAgIE5VTV9WU19TVEFDS19FTlRSSUVTKG51bV92c19zdGFja19lbnRyaWVzKSk7CisJCXNxX3N0YWNrX3Jlc291cmNlX21nbXRfMiA9IChOVU1fR1NfU1RBQ0tfRU5UUklFUyhudW1fZ3Nfc3RhY2tfZW50cmllcykgfAorCQkJCQkgICAgTlVNX0VTX1NUQUNLX0VOVFJJRVMobnVtX2VzX3N0YWNrX2VudHJpZXMpKTsKKwkJc3Ffc3RhY2tfcmVzb3VyY2VfbWdtdF8zID0gKE5VTV9IU19TVEFDS19FTlRSSUVTKG51bV9oc19zdGFja19lbnRyaWVzKSB8CisJCQkJCSAgICBOVU1fTFNfU1RBQ0tfRU5UUklFUyhudW1fbHNfc3RhY2tfZW50cmllcykpOworCisJCS8qIGRpc2FibGUgZHluIGdwcnMgKi8KKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUEFDS0VUMyhQQUNLRVQzX1NFVF9DT05GSUdfUkVHLCAxKSk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIChTUV9EWU5fR1BSX0NOVExfUFNfRkxVU0hfUkVRIC0gUEFDS0VUM19TRVRfQ09ORklHX1JFR19TVEFSVCkgPj4gMik7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDApOworCisJCS8qIHNldHVwIExEUyAqLworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfU0VUX0NPTkZJR19SRUcsIDEpKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgKFNRX0xEU19SRVNPVVJDRV9NR01UIC0gUEFDS0VUM19TRVRfQ09ORklHX1JFR19TVEFSVCkgPj4gMik7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDB4MTAwMDEwMDApOworCisJCS8qIFNRIGNvbmZpZyAqLworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfU0VUX0NPTkZJR19SRUcsIDExKSk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIChTUV9DT05GSUcgLSBQQUNLRVQzX1NFVF9DT05GSUdfUkVHX1NUQVJUKSA+PiAyKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgc3FfY29uZmlnKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgc3FfZ3ByX3Jlc291cmNlX21nbXRfMSk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX2dwcl9yZXNvdXJjZV9tZ210XzIpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9ncHJfcmVzb3VyY2VfbWdtdF8zKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDApOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV90aHJlYWRfcmVzb3VyY2VfbWdtdCk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX3RocmVhZF9yZXNvdXJjZV9tZ210XzIpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9zdGFja19yZXNvdXJjZV9tZ210XzEpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9zdGFja19yZXNvdXJjZV9tZ210XzIpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzcV9zdGFja19yZXNvdXJjZV9tZ210XzMpOworCX0KIAogCS8qIENPTlRFWFRfQ09OVFJPTCAqLwogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDB4YzAwMTI4MDApOwpAQCAtNTYwLDcgKzYyNCwxMCBAQAogCW11dGV4X2luaXQoJnJkZXYtPnI2MDBfYmxpdC5tdXRleCk7CiAJcmRldi0+cjYwMF9ibGl0LnN0YXRlX29mZnNldCA9IDA7CiAKLQlyZGV2LT5yNjAwX2JsaXQuc3RhdGVfbGVuID0gZXZlcmdyZWVuX2RlZmF1bHRfc2l6ZTsKKwlpZiAocmRldi0+ZmFtaWx5IDwgQ0hJUF9DQVlNQU4pCisJCXJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9sZW4gPSBldmVyZ3JlZW5fZGVmYXVsdF9zaXplOworCWVsc2UKKwkJcmRldi0+cjYwMF9ibGl0LnN0YXRlX2xlbiA9IGNheW1hbl9kZWZhdWx0X3NpemU7CiAKIAlkd29yZHMgPSByZGV2LT5yNjAwX2JsaXQuc3RhdGVfbGVuOwogCXdoaWxlIChkd29yZHMgJiAweGYpIHsKQEAgLTU3MiwxMSArNjM5LDE3IEBACiAJb2JqX3NpemUgPSBBTElHTihvYmpfc2l6ZSwgMjU2KTsKIAogCXJkZXYtPnI2MDBfYmxpdC52c19vZmZzZXQgPSBvYmpfc2l6ZTsKLQlvYmpfc2l6ZSArPSBldmVyZ3JlZW5fdnNfc2l6ZSAqIDQ7CisJaWYgKHJkZXYtPmZhbWlseSA8IENISVBfQ0FZTUFOKQorCQlvYmpfc2l6ZSArPSBldmVyZ3JlZW5fdnNfc2l6ZSAqIDQ7CisJZWxzZQorCQlvYmpfc2l6ZSArPSBjYXltYW5fdnNfc2l6ZSAqIDQ7CiAJb2JqX3NpemUgPSBBTElHTihvYmpfc2l6ZSwgMjU2KTsKIAogCXJkZXYtPnI2MDBfYmxpdC5wc19vZmZzZXQgPSBvYmpfc2l6ZTsKLQlvYmpfc2l6ZSArPSBldmVyZ3JlZW5fcHNfc2l6ZSAqIDQ7CisJaWYgKHJkZXYtPmZhbWlseSA8IENISVBfQ0FZTUFOKQorCQlvYmpfc2l6ZSArPSBldmVyZ3JlZW5fcHNfc2l6ZSAqIDQ7CisJZWxzZQorCQlvYmpfc2l6ZSArPSBjYXltYW5fcHNfc2l6ZSAqIDQ7CiAJb2JqX3NpemUgPSBBTElHTihvYmpfc2l6ZSwgMjU2KTsKIAogCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIG9ial9zaXplLCBQQUdFX1NJWkUsIHRydWUsIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCkBAIC01OTksMTYgKzY3MiwyOSBAQAogCQlyZXR1cm4gcjsKIAl9CiAKLQltZW1jcHlfdG9pbyhwdHIgKyByZGV2LT5yNjAwX2JsaXQuc3RhdGVfb2Zmc2V0LAotCQkgICAgZXZlcmdyZWVuX2RlZmF1bHRfc3RhdGUsIHJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9sZW4gKiA0KTsKKwlpZiAocmRldi0+ZmFtaWx5IDwgQ0hJUF9DQVlNQU4pIHsKKwkJbWVtY3B5X3RvaW8ocHRyICsgcmRldi0+cjYwMF9ibGl0LnN0YXRlX29mZnNldCwKKwkJCSAgICBldmVyZ3JlZW5fZGVmYXVsdF9zdGF0ZSwgcmRldi0+cjYwMF9ibGl0LnN0YXRlX2xlbiAqIDQpOwogCi0JaWYgKG51bV9wYWNrZXQycykKLQkJbWVtY3B5X3RvaW8ocHRyICsgcmRldi0+cjYwMF9ibGl0LnN0YXRlX29mZnNldCArIChyZGV2LT5yNjAwX2JsaXQuc3RhdGVfbGVuICogNCksCi0JCQkgICAgcGFja2V0MnMsIG51bV9wYWNrZXQycyAqIDQpOwotCWZvciAoaSA9IDA7IGkgPCBldmVyZ3JlZW5fdnNfc2l6ZTsgaSsrKQotCQkqKHUzMiAqKSgodW5zaWduZWQgbG9uZylwdHIgKyByZGV2LT5yNjAwX2JsaXQudnNfb2Zmc2V0ICsgaSAqIDQpID0gY3B1X3RvX2xlMzIoZXZlcmdyZWVuX3ZzW2ldKTsKLQlmb3IgKGkgPSAwOyBpIDwgZXZlcmdyZWVuX3BzX3NpemU7IGkrKykKLQkJKih1MzIgKikoKHVuc2lnbmVkIGxvbmcpcHRyICsgcmRldi0+cjYwMF9ibGl0LnBzX29mZnNldCArIGkgKiA0KSA9IGNwdV90b19sZTMyKGV2ZXJncmVlbl9wc1tpXSk7CisJCWlmIChudW1fcGFja2V0MnMpCisJCQltZW1jcHlfdG9pbyhwdHIgKyByZGV2LT5yNjAwX2JsaXQuc3RhdGVfb2Zmc2V0ICsgKHJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9sZW4gKiA0KSwKKwkJCQkgICAgcGFja2V0MnMsIG51bV9wYWNrZXQycyAqIDQpOworCQlmb3IgKGkgPSAwOyBpIDwgZXZlcmdyZWVuX3ZzX3NpemU7IGkrKykKKwkJCSoodTMyICopKCh1bnNpZ25lZCBsb25nKXB0ciArIHJkZXYtPnI2MDBfYmxpdC52c19vZmZzZXQgKyBpICogNCkgPSBjcHVfdG9fbGUzMihldmVyZ3JlZW5fdnNbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgZXZlcmdyZWVuX3BzX3NpemU7IGkrKykKKwkJCSoodTMyICopKCh1bnNpZ25lZCBsb25nKXB0ciArIHJkZXYtPnI2MDBfYmxpdC5wc19vZmZzZXQgKyBpICogNCkgPSBjcHVfdG9fbGUzMihldmVyZ3JlZW5fcHNbaV0pOworCX0gZWxzZSB7CisJCW1lbWNweV90b2lvKHB0ciArIHJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9vZmZzZXQsCisJCQkgICAgY2F5bWFuX2RlZmF1bHRfc3RhdGUsIHJkZXYtPnI2MDBfYmxpdC5zdGF0ZV9sZW4gKiA0KTsKKworCQlpZiAobnVtX3BhY2tldDJzKQorCQkJbWVtY3B5X3RvaW8ocHRyICsgcmRldi0+cjYwMF9ibGl0LnN0YXRlX29mZnNldCArIChyZGV2LT5yNjAwX2JsaXQuc3RhdGVfbGVuICogNCksCisJCQkJICAgIHBhY2tldDJzLCBudW1fcGFja2V0MnMgKiA0KTsKKwkJZm9yIChpID0gMDsgaSA8IGNheW1hbl92c19zaXplOyBpKyspCisJCQkqKHUzMiAqKSgodW5zaWduZWQgbG9uZylwdHIgKyByZGV2LT5yNjAwX2JsaXQudnNfb2Zmc2V0ICsgaSAqIDQpID0gY3B1X3RvX2xlMzIoY2F5bWFuX3ZzW2ldKTsKKwkJZm9yIChpID0gMDsgaSA8IGNheW1hbl9wc19zaXplOyBpKyspCisJCQkqKHUzMiAqKSgodW5zaWduZWQgbG9uZylwdHIgKyByZGV2LT5yNjAwX2JsaXQucHNfb2Zmc2V0ICsgaSAqIDQpID0gY3B1X3RvX2xlMzIoY2F5bWFuX3BzW2ldKTsKKwl9CiAJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7CiAJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7CiAKQEAgLTY5Miw3ICs3NzgsNyBAQAogCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbG9vcHMgY29ycmVjdGx5ICovCiAJcmluZ19zaXplID0gbnVtX2xvb3BzICogZHdvcmRzX3Blcl9sb29wOwogCS8qIHNldCBkZWZhdWx0ICArIHNoYWRlcnMgKi8KLQlyaW5nX3NpemUgKz0gNTI7IC8qIHNoYWRlcnMgKyBkZWYgc3RhdGUgKi8KKwlyaW5nX3NpemUgKz0gNTU7IC8qIHNoYWRlcnMgKyBkZWYgc3RhdGUgKi8KIAlyaW5nX3NpemUgKz0gMTA7IC8qIGZlbmNlIGVtaXQgZm9yIFZCIElCICovCiAJcmluZ19zaXplICs9IDU7IC8qIGRvbmUgY29weSAqLwogCXJpbmdfc2l6ZSArPSAxMDsgLyogZmVuY2UgZW1pdCBmb3IgZG9uZSBjb3B5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbmQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCmluZGV4IGYzN2U5MWUuLmI3YjI3MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCkBAIC0xNjgsMTAgKzE2OCwxNiBAQAogI2RlZmluZQkJU0VfREJfQlVTWQkJCQkJKDEgPDwgMzApCiAjZGVmaW5lCQlTRV9DQl9CVVNZCQkJCQkoMSA8PCAzMSkKIC8qIGV2ZXJncmVlbiAqLworI2RlZmluZQlDR19USEVSTUFMX0NUUkwJCQkJCTB4NzJjCisjZGVmaW5lCQlUT0ZGU0VUX01BU0sJCQkgICAgICAgIDB4MDAwMDNGRTAKKyNkZWZpbmUJCVRPRkZTRVRfU0hJRlQJCQkgICAgICAgIDUKICNkZWZpbmUJQ0dfTVVMVF9USEVSTUFMX1NUQVRVUwkJCQkweDc0MAogI2RlZmluZQkJQVNJQ19UKHgpCQkJICAgICAgICAoKHgpIDw8IDE2KQotI2RlZmluZQkJQVNJQ19UX01BU0sJCQkgICAgICAgIDB4N0ZGMDAwMAorI2RlZmluZQkJQVNJQ19UX01BU0sJCQkgICAgICAgIDB4MDdGRjAwMDAKICNkZWZpbmUJCUFTSUNfVF9TSElGVAkJCSAgICAgICAgMTYKKyNkZWZpbmUJQ0dfVFMwX1NUQVRVUwkJCQkJMHg3NjAKKyNkZWZpbmUJCVRTMF9BRENfRE9VVF9NQVNLCQkJMHgwMDAwMDNGRgorI2RlZmluZQkJVFMwX0FEQ19ET1VUX1NISUZUCQkJMAogLyogQVBVICovCiAjZGVmaW5lCUNHX1RIRVJNQUxfU1RBVFVTCQkJICAgICAgICAweDY3OAogCkBAIC00NjAsNyArNDY2LDcgQEAKICNkZWZpbmUgSUhfUkJfV1BUUl9BRERSX0xPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlMTQKICNkZWZpbmUgSUhfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlMTgKICMgICAgICAgZGVmaW5lIEVOQUJMRV9JTlRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQotIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgMikKKyMgICAgICAgZGVmaW5lIElIX01DX1NXQVAoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDEpCiAjICAgICAgIGRlZmluZSBJSF9NQ19TV0FQX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUF8xNkJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICMgICAgICAgZGVmaW5lIElIX01DX1NXQVBfMzJCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAyCkBAIC01NDEsNyArNTQ3LDcgQEAKICMgICAgICAgZGVmaW5lIExCX0Q1X1ZCTEFOS19JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgKDEgPDwgMykKICMgICAgICAgZGVmaW5lIERDX0hQRDVfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTcpCiAjICAgICAgIGRlZmluZSBEQ19IUEQ1X1JYX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE4KQotI2RlZmluZSBESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUU1ICAgICAgICAgICAgICAgICAweDYwNTAKKyNkZWZpbmUgRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFNSAgICAgICAgICAgICAgICAgMHg2MTUwCiAjICAgICAgIGRlZmluZSBMQl9ENl9WTElORV9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICgxIDw8IDIpCiAjICAgICAgIGRlZmluZSBMQl9ENl9WQkxBTktfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCiAjICAgICAgIGRlZmluZSBEQ19IUEQ2X0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaS5jCmluZGV4IGIyMDViYTEuLjU1OWRiZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pLmMKQEAgLTEzODcsMTQgKzEzODcsMTIgQEAKIAkJcmV0dXJuIHI7CiAJY2F5bWFuX2dwdV9pbml0KHJkZXYpOwogCi0jaWYgMAotCXIgPSBjYXltYW5fYmxpdF9pbml0KHJkZXYpOworCXIgPSBldmVyZ3JlZW5fYmxpdF9pbml0KHJkZXYpOwogCWlmIChyKSB7Ci0JCWNheW1hbl9ibGl0X2ZpbmkocmRldik7CisJCWV2ZXJncmVlbl9ibGl0X2ZpbmkocmRldik7CiAJCXJkZXYtPmFzaWMtPmNvcHkgPSBOVUxMOwogCQlkZXZfd2FybihyZGV2LT5kZXYsICJmYWlsZWQgYmxpdHRlciAoJWQpIGZhbGxpbmcgYmFjayB0byBtZW1jcHlcbiIsIHIpOwogCX0KLSNlbmRpZgogCiAJLyogYWxsb2NhdGUgd2IgYnVmZmVyICovCiAJciA9IHJhZGVvbl93Yl9pbml0KHJkZXYpOwpAQCAtMTQ1Miw3ICsxNDUwLDcgQEAKIAogaW50IGNheW1hbl9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCS8qIGludCByOyAqLworCWludCByOwogCiAJLyogRklYTUU6IHdlIHNob3VsZCB3YWl0IGZvciByaW5nIHRvIGJlIGVtcHR5ICovCiAJY2F5bWFuX2NwX2VuYWJsZShyZGV2LCBmYWxzZSk7CkBAIC0xNDYxLDE0ICsxNDU5LDEzIEBACiAJcmFkZW9uX3diX2Rpc2FibGUocmRldik7CiAJY2F5bWFuX3BjaWVfZ2FydF9kaXNhYmxlKHJkZXYpOwogCi0jaWYgMAogCS8qIHVucGluIHNoYWRlcnMgYm8gKi8KIAlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmosIGZhbHNlKTsKIAlpZiAobGlrZWx5KHIgPT0gMCkpIHsKIAkJcmFkZW9uX2JvX3VucGluKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKIAkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7CiAJfQotI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU4MCwxMCArMTU3NywxMSBAQAogCiB2b2lkIGNheW1hbl9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCS8qIGNheW1hbl9ibGl0X2ZpbmkocmRldik7ICovCisJZXZlcmdyZWVuX2JsaXRfZmluaShyZGV2KTsKIAljYXltYW5fY3BfZmluaShyZGV2KTsKIAlyNjAwX2lycV9maW5pKHJkZXYpOwogCXJhZGVvbl93Yl9maW5pKHJkZXYpOworCXJhZGVvbl9pYl9wb29sX2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAljYXltYW5fcGNpZV9nYXJ0X2ZpbmkocmRldik7CiAJcmFkZW9uX2dlbV9maW5pKHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaWQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlkLmgKaW5kZXggOTczNjc0Ni4uNDY3Mjg2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaWQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pZC5oCkBAIC0zMjAsNyArMzIwLDcgQEAKICNkZWZpbmUJQ0dUU19VU0VSX1RDQ19ESVNBQkxFCQkJCTB4OTE0QwogI2RlZmluZQkJVENDX0RJU0FCTEVfTUFTSwkJCQkweEZGRkYwMDAwCiAjZGVmaW5lCQlUQ0NfRElTQUJMRV9TSElGVAkJCQkxNgotI2RlZmluZQlDR1RTX1NNX0NUUkxfUkVHCQkJCTB4OTE1QworI2RlZmluZQlDR1RTX1NNX0NUUkxfUkVHCQkJCTB4OTE1MAogI2RlZmluZQkJT1ZFUlJJREUJCQkJKDEgPDwgMjEpCiAKICNkZWZpbmUJVEFfQ05UTF9BVVgJCQkJCTB4OTUwOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwX3RyYWNrLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBfdHJhY2suaAppbmRleCAyZmVmOWRlLi42ODZmOWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBfdHJhY2suaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBfdHJhY2suaApAQCAtNjMsNyArNjMsNyBAQAogCXVuc2lnbmVkCQkJbnVtX2FycmF5czsKIAl1bnNpZ25lZAkJCW1heF9pbmR4OwogCXVuc2lnbmVkCQkJY29sb3JfY2hhbm5lbF9tYXNrOwotCXN0cnVjdCByMTAwX2NzX3RyYWNrX2FycmF5CWFycmF5c1sxMV07CisJc3RydWN0IHIxMDBfY3NfdHJhY2tfYXJyYXkJYXJyYXlzWzE2XTsKIAlzdHJ1Y3QgcjEwMF9jc190cmFja19jYiAJY2JbUjMwMF9NQVhfQ0JdOwogCXN0cnVjdCByMTAwX2NzX3RyYWNrX2NiIAl6YjsKIAlzdHJ1Y3QgcjEwMF9jc190cmFja19jYiAJYWE7CkBAIC0xNDYsNiArMTQ2LDEyIEBACiAJaWIgPSBwLT5pYi0+cHRyOwogCXRyYWNrID0gKHN0cnVjdCByMTAwX2NzX3RyYWNrICopcC0+dHJhY2s7CiAJYyA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4KyspICYgMHgxRjsKKwlpZiAoYyA+IDE2KSB7CisJICAgIERSTV9FUlJPUigiT25seSAxNiB2ZXJ0ZXggYnVmZmVycyBhcmUgYWxsb3dlZCAlZFxuIiwKKwkJICAgICAgcGt0LT5vcGNvZGUpOworCSAgICByMTAwX2NzX2R1bXBfcGFja2V0KHAsIHBrdCk7CisJICAgIHJldHVybiAtRUlOVkFMOworCX0KIAl0cmFjay0+bnVtX2FycmF5cyA9IGM7CiAJZm9yIChpID0gMDsgaSA8IChjIC0gMSk7IGkrPTIsIGlkeCs9MykgewogCQlyID0gcjEwMF9jc19wYWNrZXRfbmV4dF9yZWxvYyhwLCAmcmVsb2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYwppbmRleCA2ZjI3NTkzLi5iYzU0YjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYwpAQCAtODcsNiArODcsMTAgQEAKIE1PRFVMRV9GSVJNV0FSRSgicmFkZW9uL1BBTE1fcGZwLmJpbiIpOwogTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vUEFMTV9tZS5iaW4iKTsKIE1PRFVMRV9GSVJNV0FSRSgicmFkZW9uL1NVTU9fcmxjLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vU1VNT19wZnAuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9TVU1PX21lLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vU1VNTzJfcGZwLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vU1VNTzJfbWUuYmluIik7CiAKIGludCByNjAwX2RlYnVnZnNfbWNfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIApAQCAtNTg2LDYgKzU5MCw5IEBACiAJc3RydWN0IHJhZGVvbl92b2x0YWdlICp2b2x0YWdlID0gJnBzLT5jbG9ja19pbmZvW3JlcV9jbV9pZHhdLnZvbHRhZ2U7CiAKIAlpZiAoKHZvbHRhZ2UtPnR5cGUgPT0gVk9MVEFHRV9TVykgJiYgdm9sdGFnZS0+dm9sdGFnZSkgeworCQkvKiAweGZmMDEgaXMgYSBmbGFnIHJhdGhlciB0aGVuIGFuIGFjdHVhbCB2b2x0YWdlICovCisJCWlmICh2b2x0YWdlLT52b2x0YWdlID09IDB4ZmYwMSkKKwkJCXJldHVybjsKIAkJaWYgKHZvbHRhZ2UtPnZvbHRhZ2UgIT0gcmRldi0+cG0uY3VycmVudF92ZGRjKSB7CiAJCQlyYWRlb25fYXRvbV9zZXRfdm9sdGFnZShyZGV2LCB2b2x0YWdlLT52b2x0YWdlLCBTRVRfVk9MVEFHRV9UWVBFX0FTSUNfVkREQyk7CiAJCQlyZGV2LT5wbS5jdXJyZW50X3ZkZGMgPSB2b2x0YWdlLT52b2x0YWdlOwpAQCAtMjAyNCw2ICsyMDMxLDE0IEBACiAJCWNoaXBfbmFtZSA9ICJQQUxNIjsKIAkJcmxjX2NoaXBfbmFtZSA9ICJTVU1PIjsKIAkJYnJlYWs7CisJY2FzZSBDSElQX1NVTU86CisJCWNoaXBfbmFtZSA9ICJTVU1PIjsKKwkJcmxjX2NoaXBfbmFtZSA9ICJTVU1PIjsKKwkJYnJlYWs7CisJY2FzZSBDSElQX1NVTU8yOgorCQljaGlwX25hbWUgPSAiU1VNTzIiOworCQlybGNfY2hpcF9uYW1lID0gIlNVTU8iOworCQlicmVhazsKIAlkZWZhdWx0OiBCVUcoKTsKIAl9CiAKQEAgLTI2MTMsNiArMjYyOCw3IEBACiAJcjYwMF9jcF9maW5pKHJkZXYpOwogCXI2MDBfaXJxX2ZpbmkocmRldik7CiAJcmFkZW9uX3diX2ZpbmkocmRldik7CisJcmFkZW9uX2liX3Bvb2xfZmluaShyZGV2KTsKIAlyYWRlb25faXJxX2ttc19maW5pKHJkZXYpOwogCXI2MDBfcGNpZV9nYXJ0X2ZpbmkocmRldik7CiAJcmFkZW9uX2FncF9maW5pKHJkZXYpOwpAQCAtMzI4MiwyNyArMzI5OCwyNiBAQAogCiBpbnQgcjYwMF9pcnFfcHJvY2VzcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQl1MzIgd3B0ciA9IHI2MDBfZ2V0X2loX3dwdHIocmRldik7Ci0JdTMyIHJwdHIgPSByZGV2LT5paC5ycHRyOworCXUzMiB3cHRyOworCXUzMiBycHRyOwogCXUzMiBzcmNfaWQsIHNyY19kYXRhOwogCXUzMiByaW5nX2luZGV4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYm9vbCBxdWV1ZV9ob3RwbHVnID0gZmFsc2U7CiAKLQlEUk1fREVCVUcoInI2MDBfaXJxX3Byb2Nlc3Mgc3RhcnQ6IHJwdHIgJWQsIHdwdHIgJWRcbiIsIHJwdHIsIHdwdHIpOwotCWlmICghcmRldi0+aWguZW5hYmxlZCkKKwlpZiAoIXJkZXYtPmloLmVuYWJsZWQgfHwgcmRldi0+c2h1dGRvd24pCiAJCXJldHVybiBJUlFfTk9ORTsKIAorCXdwdHIgPSByNjAwX2dldF9paF93cHRyKHJkZXYpOworCXJwdHIgPSByZGV2LT5paC5ycHRyOworCURSTV9ERUJVRygicjYwMF9pcnFfcHJvY2VzcyBzdGFydDogcnB0ciAlZCwgd3B0ciAlZFxuIiwgcnB0ciwgd3B0cik7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcmRldi0+aWgubG9jaywgZmxhZ3MpOwogCiAJaWYgKHJwdHIgPT0gd3B0cikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGV2LT5paC5sb2NrLCBmbGFncyk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9Ci0JaWYgKHJkZXYtPnNodXRkb3duKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmloLmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KIAogcmVzdGFydF9paDoKIAkvKiBkaXNwbGF5IGludGVycnVwdHMgKi8KQEAgLTM0MzIsNyArMzQ0Nyw3IEBACiAJCQlyYWRlb25fZmVuY2VfcHJvY2VzcyhyZGV2KTsKIAkJCWJyZWFrOwogCQljYXNlIDIzMzogLyogR1VJIElETEUgKi8KLQkJCURSTV9ERUJVRygiSUg6IENQIEVPUFxuIik7CisJCQlEUk1fREVCVUcoIklIOiBHVUkgaWRsZVxuIik7CiAJCQlyZGV2LT5wbS5ndWlfaWRsZSA9IHRydWU7CiAJCQl3YWtlX3VwKCZyZGV2LT5pcnEuaWRsZV9xdWV1ZSk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMKaW5kZXggZmQxOGJlOS4uOTA5YmRhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMKQEAgLTcxLDIwICs3MSwyMSBAQAogCXU2NAkJCWRiX2JvX21jOwogfTsKIAotI2RlZmluZSBGTVRfOF9CSVQoZm10LCB2YykgW2ZtdF0gPSB7IDEsIDEsIDEsIHZjIH0KLSNkZWZpbmUgRk1UXzE2X0JJVChmbXQsIHZjKSBbZm10XSA9IHsgMSwgMSwgMiwgdmMgfQotI2RlZmluZSBGTVRfMjRfQklUKGZtdCkgW2ZtdF0gPSB7IDEsIDEsIDMsIDAgfQotI2RlZmluZSBGTVRfMzJfQklUKGZtdCwgdmMpIFtmbXRdID0geyAxLCAxLCA0LCB2YyB9Ci0jZGVmaW5lIEZNVF80OF9CSVQoZm10KSBbZm10XSA9IHsgMSwgMSwgNiwgMCB9Ci0jZGVmaW5lIEZNVF82NF9CSVQoZm10LCB2YykgW2ZtdF0gPSB7IDEsIDEsIDgsIHZjIH0KLSNkZWZpbmUgRk1UXzk2X0JJVChmbXQpIFtmbXRdID0geyAxLCAxLCAxMiwgMCB9Ci0jZGVmaW5lIEZNVF8xMjhfQklUKGZtdCwgdmMpIFtmbXRdID0geyAxLCAxLCAxNiwgdmMgfQorI2RlZmluZSBGTVRfOF9CSVQoZm10LCB2YykgICBbZm10XSA9IHsgMSwgMSwgMSwgdmMsIENISVBfUjYwMCB9CisjZGVmaW5lIEZNVF8xNl9CSVQoZm10LCB2YykgIFtmbXRdID0geyAxLCAxLCAyLCB2YywgQ0hJUF9SNjAwIH0KKyNkZWZpbmUgRk1UXzI0X0JJVChmbXQpICAgICAgW2ZtdF0gPSB7IDEsIDEsIDMsICAwLCBDSElQX1I2MDAgfQorI2RlZmluZSBGTVRfMzJfQklUKGZtdCwgdmMpICBbZm10XSA9IHsgMSwgMSwgNCwgdmMsIENISVBfUjYwMCB9CisjZGVmaW5lIEZNVF80OF9CSVQoZm10KSAgICAgIFtmbXRdID0geyAxLCAxLCA2LCAgMCwgQ0hJUF9SNjAwIH0KKyNkZWZpbmUgRk1UXzY0X0JJVChmbXQsIHZjKSAgW2ZtdF0gPSB7IDEsIDEsIDgsIHZjLCBDSElQX1I2MDAgfQorI2RlZmluZSBGTVRfOTZfQklUKGZtdCkgICAgICBbZm10XSA9IHsgMSwgMSwgMTIsIDAsIENISVBfUjYwMCB9CisjZGVmaW5lIEZNVF8xMjhfQklUKGZtdCwgdmMpIFtmbXRdID0geyAxLCAxLCAxNix2YywgQ0hJUF9SNjAwIH0KIAogc3RydWN0IGdwdV9mb3JtYXRzIHsKIAl1bnNpZ25lZCBibG9ja3dpZHRoOwogCXVuc2lnbmVkIGJsb2NraGVpZ2h0OwogCXVuc2lnbmVkIGJsb2Nrc2l6ZTsKIAl1bnNpZ25lZCB2YWxpZF9jb2xvcjsKKwllbnVtIHJhZGVvbl9mYW1pbHkgbWluX2ZhbWlseTsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZ3B1X2Zvcm1hdHMgY29sb3JfZm9ybWF0c190YWJsZVtdID0gewpAQCAtMTU0LDcgKzE1NSwxMSBAQAogCVtWXzAzODAwNF9GTVRfQkMzXSA9IHsgNCwgNCwgMTYsIDAgfSwKIAlbVl8wMzgwMDRfRk1UX0JDNF0gPSB7IDQsIDQsIDgsIDAgfSwKIAlbVl8wMzgwMDRfRk1UX0JDNV0gPSB7IDQsIDQsIDE2LCAwfSwKKwlbVl8wMzgwMDRfRk1UX0JDNl0gPSB7IDQsIDQsIDE2LCAwLCBDSElQX0NFREFSfSwgLyogRXZlcmdyZWVuLW9ubHkgKi8KKwlbVl8wMzgwMDRfRk1UX0JDN10gPSB7IDQsIDQsIDE2LCAwLCBDSElQX0NFREFSfSwgLyogRXZlcmdyZWVuLW9ubHkgKi8KIAorCS8qIFRoZSBvdGhlciBFdmVyZ3JlZW4gZm9ybWF0cyAqLworCVtWXzAzODAwNF9GTVRfMzJfQVNfMzJfMzJfMzJfMzJdID0geyAxLCAxLCA0LCAwLCBDSElQX0NFREFSfSwKIH07CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBmbXRfaXNfdmFsaWRfY29sb3IodTMyIGZvcm1hdCkKQEAgLTE2OCwxMSArMTczLDE0IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgZm10X2lzX3ZhbGlkX3RleHR1cmUodTMyIGZvcm1hdCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmbXRfaXNfdmFsaWRfdGV4dHVyZSh1MzIgZm9ybWF0LCBlbnVtIHJhZGVvbl9mYW1pbHkgZmFtaWx5KQogewogCWlmIChmb3JtYXQgPj0gQVJSQVlfU0laRShjb2xvcl9mb3JtYXRzX3RhYmxlKSkKIAkJcmV0dXJuIGZhbHNlOwogCQorCWlmIChmYW1pbHkgPCBjb2xvcl9mb3JtYXRzX3RhYmxlW2Zvcm1hdF0ubWluX2ZhbWlseSkKKwkJcmV0dXJuIGZhbHNlOworCiAJaWYgKGNvbG9yX2Zvcm1hdHNfdGFibGVbZm9ybWF0XS5ibG9ja3dpZHRoID4gMCkKIAkJcmV0dXJuIHRydWU7CiAKQEAgLTEzMjUsNyArMTMzMyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlmb3JtYXQgPSBHXzAzODAwNF9EQVRBX0ZPUk1BVCh3b3JkMSk7Ci0JaWYgKCFmbXRfaXNfdmFsaWRfdGV4dHVyZShmb3JtYXQpKSB7CisJaWYgKCFmbXRfaXNfdmFsaWRfdGV4dHVyZShmb3JtYXQsIHAtPmZhbWlseSkpIHsKIAkJZGV2X3dhcm4ocC0+ZGV2LCAiJXM6JWQgdGV4dHVyZSBpbnZhbGlkIGZvcm1hdCAlZFxuIiwKIAkJCSBfX2Z1bmNfXywgX19MSU5FX18sIGZvcm1hdCk7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCmluZGV4IGIyYjk0NGIuLjAyNDVhZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKQEAgLTUzNiw3ICs1MzYsNyBAQAogI2RlZmluZSBJSF9SQl9XUFRSX0FERFJfTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2UxNAogI2RlZmluZSBJSF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2UxOAogIyAgICAgICBkZWZpbmUgRU5BQkxFX0lOVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCi0jICAgICAgIGRlZmluZSBJSF9NQ19TV0FQKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA8PCAyKQorIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgMSkKICMgICAgICAgZGVmaW5lIElIX01DX1NXQVBfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAjICAgICAgIGRlZmluZSBJSF9NQ19TV0FQXzE2QklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUF8zMkJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKQEAgLTEzMDksNiArMTMwOSw5IEBACiAjZGVmaW5lICAgICBWXzAzODAwNF9GTVRfQkMzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzMwogI2RlZmluZSAgICAgVl8wMzgwMDRfRk1UX0JDNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzQKICNkZWZpbmUgICAgIFZfMDM4MDA0X0ZNVF9CQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDM1CisjZGVmaW5lICAgICBWXzAzODAwNF9GTVRfQkM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzNgorI2RlZmluZSAgICAgVl8wMzgwMDRfRk1UX0JDNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzcKKyNkZWZpbmUgICAgIFZfMDM4MDA0X0ZNVF8zMl9BU18zMl8zMl8zMl8zMiAgICAgICAgICAgICAweDAwMDAwMDM4CiAjZGVmaW5lIFJfMDM4MDEwX1NRX1RFWF9SRVNPVVJDRV9XT1JENF8wICAgICAgICAgICAgIDB4MDM4MDEwCiAjZGVmaW5lICAgU18wMzgwMTBfRk9STUFUX0NPTVBfWCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDApCiAjZGVmaW5lICAgR18wMzgwMTBfRk9STUFUX0NPTVBfWCh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaAppbmRleCBiYTY0M2I1Li5lZjBlMGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKQEAgLTE2NSw2ICsxNjUsNyBAQAogCXVpbnQzMl90IGRlZmF1bHRfc2NsazsKIAl1aW50MzJfdCBkZWZhdWx0X2Rpc3BjbGs7CiAJdWludDMyX3QgZHBfZXh0Y2xrOworCXVpbnQzMl90IG1heF9waXhlbF9jbG9jazsKIH07CiAKIC8qCkBAIC0xNzgsNiArMTc5LDcgQEAKIHZvaWQgcmFkZW9uX2NvbWJpb3NfZ2V0X3Bvd2VyX21vZGVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcmFkZW9uX2F0b21iaW9zX2dldF9wb3dlcl9tb2RlcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJhZGVvbl9hdG9tX3NldF92b2x0YWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MTYgdm9sdGFnZV9sZXZlbCwgdTggdm9sdGFnZV90eXBlKTsKK2ludCByYWRlb25fYXRvbV9nZXRfbWF4X3ZkZGMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUxNiAqdm9sdGFnZSk7CiB2b2lkIHJzNjkwX3BtX2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCBydjZ4eF9nZXRfdGVtcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gaW50IHJ2NzcwX2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYwppbmRleCBkOTQ4MjY1Li5iMjQ0OTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jCkBAIC05MDYsOSArOTA2LDkgQEAKIAkuZ2V0X3ZibGFua19jb3VudGVyID0gJmV2ZXJncmVlbl9nZXRfdmJsYW5rX2NvdW50ZXIsCiAJLmZlbmNlX3JpbmdfZW1pdCA9ICZyNjAwX2ZlbmNlX3JpbmdfZW1pdCwKIAkuY3NfcGFyc2UgPSAmZXZlcmdyZWVuX2NzX3BhcnNlLAotCS5jb3B5X2JsaXQgPSBOVUxMLAotCS5jb3B5X2RtYSA9IE5VTEwsCi0JLmNvcHkgPSBOVUxMLAorCS5jb3B5X2JsaXQgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weV9kbWEgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weSA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAogCS5nZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9lbmdpbmVfY2xvY2ssCiAJLnNldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X2VuZ2luZV9jbG9jaywKIAkuZ2V0X21lbW9yeV9jbG9jayA9ICZyYWRlb25fYXRvbV9nZXRfbWVtb3J5X2Nsb2NrLApAQCAtOTM4LDYgKzkzOCwxMyBAQAogaW50IHJhZGVvbl9hc2ljX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJcmFkZW9uX3JlZ2lzdGVyX2FjY2Vzc29yX2luaXQocmRldik7CisKKwkvKiBzZXQgdGhlIG51bWJlciBvZiBjcnRjcyAqLworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9TSU5HTEVfQ1JUQykKKwkJcmRldi0+bnVtX2NydGMgPSAxOworCWVsc2UKKwkJcmRldi0+bnVtX2NydGMgPSAyOworCiAJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKIAljYXNlIENISVBfUjEwMDoKIAljYXNlIENISVBfUlYxMDA6CkBAIC0xMDE3LDE4ICsxMDI0LDMyIEBACiAJY2FzZSBDSElQX0pVTklQRVI6CiAJY2FzZSBDSElQX0NZUFJFU1M6CiAJY2FzZSBDSElQX0hFTUxPQ0s6CisJCS8qIHNldCBudW0gY3J0Y3MgKi8KKwkJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX0NFREFSKQorCQkJcmRldi0+bnVtX2NydGMgPSA0OworCQllbHNlCisJCQlyZGV2LT5udW1fY3J0YyA9IDY7CiAJCXJkZXYtPmFzaWMgPSAmZXZlcmdyZWVuX2FzaWM7CiAJCWJyZWFrOwogCWNhc2UgQ0hJUF9QQUxNOgorCWNhc2UgQ0hJUF9TVU1POgorCWNhc2UgQ0hJUF9TVU1PMjoKIAkJcmRldi0+YXNpYyA9ICZzdW1vX2FzaWM7CiAJCWJyZWFrOwogCWNhc2UgQ0hJUF9CQVJUUzoKIAljYXNlIENISVBfVFVSS1M6CiAJY2FzZSBDSElQX0NBSUNPUzoKKwkJLyogc2V0IG51bSBjcnRjcyAqLworCQlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfQ0FJQ09TKQorCQkJcmRldi0+bnVtX2NydGMgPSA0OworCQllbHNlCisJCQlyZGV2LT5udW1fY3J0YyA9IDY7CiAJCXJkZXYtPmFzaWMgPSAmYnRjX2FzaWM7CiAJCWJyZWFrOwogCWNhc2UgQ0hJUF9DQVlNQU46CiAJCXJkZXYtPmFzaWMgPSAmY2F5bWFuX2FzaWM7CisJCS8qIHNldCBudW0gY3J0Y3MgKi8KKwkJcmRldi0+bnVtX2NydGMgPSA2OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBGSVhNRTogbm90IHN1cHBvcnRlZCB5ZXQgKi8KQEAgLTEwNDAsMTggKzEwNjEsNiBAQAogCQlyZGV2LT5hc2ljLT5zZXRfbWVtb3J5X2Nsb2NrID0gTlVMTDsKIAl9CiAKLQkvKiBzZXQgdGhlIG51bWJlciBvZiBjcnRjcyAqLwotCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9TSU5HTEVfQ1JUQykKLQkJcmRldi0+bnVtX2NydGMgPSAxOwotCWVsc2UgewotCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkKLQkJCXJkZXYtPm51bV9jcnRjID0gMjsKLQkJZWxzZSBpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQotCQkJcmRldi0+bnVtX2NydGMgPSA2OwotCQllbHNlCi0JCQlyZGV2LT5udW1fY3J0YyA9IDI7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCmluZGV4IDkwZGZiMmIuLmJmMmI2MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYwpAQCAtMTI0Niw2ICsxMjQ2LDEwIEBACiAJCX0KIAkJKmRjcGxsID0gKnAxcGxsOwogCisJCXJkZXYtPmNsb2NrLm1heF9waXhlbF9jbG9jayA9IGxlMTZfdG9fY3B1KGZpcm13YXJlX2luZm8tPmluZm8udXNNYXhQaXhlbENsb2NrKTsKKwkJaWYgKHJkZXYtPmNsb2NrLm1heF9waXhlbF9jbG9jayA9PSAwKQorCQkJcmRldi0+Y2xvY2subWF4X3BpeGVsX2Nsb2NrID0gNDAwMDA7CisKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC0yMzE2LDYgKzIzMjAsMTQgQEAKIAkJCWxlMTZfdG9fY3B1KGNsb2NrX2luZm8tPnI2MDAudXNWRERDKTsKIAl9CiAKKwkvKiBwYXRjaCB1cCB2ZGRjIGlmIG5lY2Vzc2FyeSAqLworCWlmIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS52b2x0YWdlLnZvbHRhZ2UgPT0gMHhmZjAxKSB7CisJCXUxNiB2ZGRjOworCisJCWlmIChyYWRlb25fYXRvbV9nZXRfbWF4X3ZkZGMocmRldiwgJnZkZGMpID09IDApCisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS52b2x0YWdlLnZvbHRhZ2UgPSB2ZGRjOworCX0KKwogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApIHsKIAkJLyogc2tpcCBpbnZhbGlkIG1vZGVzICovCiAJCWlmIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5zY2xrID09IDApCkBAIC0yNjAzLDYgKzI2MTUsMTAgQEAKIAlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKIAkJcmV0dXJuOwogCisJLyogMHhmZjAxIGlzIGEgZmxhZyByYXRoZXIgdGhlbiBhbiBhY3R1YWwgdm9sdGFnZSAqLworCWlmICh2b2x0YWdlX2xldmVsID09IDB4ZmYwMSkKKwkJcmV0dXJuOworCiAJc3dpdGNoIChjcmV2KSB7CiAJY2FzZSAxOgogCQlhcmdzLnYxLnVjVm9sdGFnZVR5cGUgPSB2b2x0YWdlX3R5cGU7CkBAIC0yNjIyLDcgKzI2MzgsMzUgQEAKIAlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKIH0KIAoraW50IHJhZGVvbl9hdG9tX2dldF9tYXhfdmRkYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCSAgICAgdTE2ICp2b2x0YWdlKQoreworCXVuaW9uIHNldF92b2x0YWdlIGFyZ3M7CisJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgU2V0Vm9sdGFnZSk7CisJdTggZnJldiwgY3JldjsKIAorCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY3JldikgeworCWNhc2UgMToKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSAyOgorCQlhcmdzLnYyLnVjVm9sdGFnZVR5cGUgPSBTRVRfVk9MVEFHRV9HRVRfTUFYX1ZPTFRBR0U7CisJCWFyZ3MudjIudWNWb2x0YWdlTW9kZSA9IDA7CisJCWFyZ3MudjIudXNWb2x0YWdlTGV2ZWwgPSAwOworCisJCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworCisJCSp2b2x0YWdlID0gbGUxNl90b19jcHUoYXJncy52Mi51c1ZvbHRhZ2VMZXZlbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQogCiB2b2lkIHJhZGVvbl9hdG9tX2luaXRpYWxpemVfYmlvc19zY3JhdGNoX3JlZ3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYwppbmRleCAxYWJhODVjLi4yMjlhMjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIHN0YXRpYyBib29sIHJhZGVvbl9hdHJtX2dldF9iaW9zKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCWludCByZXQ7Ci0JaW50IHNpemUgPSA2NCAqIDEwMjQ7CisJaW50IHNpemUgPSAyNTYgKiAxMDI0OwogCWludCBpOwogCiAJaWYgKCFyYWRlb25fYXRybV9zdXBwb3J0ZWQocmRldi0+cGRldikpCkBAIC0zMzEsNyArMzMxLDcgQEAKIAogCXNlcHJvbV9jbnRsMSA9IFJSRUczMihSQURFT05fU0VQUk9NX0NOVEwxKTsKIAl2aXBoX2NvbnRyb2wgPSBSUkVHMzIoUkFERU9OX1ZJUEhfQ09OVFJPTCk7Ci0JYnVzX2NudGwgPSBSUkVHMzIoUkFERU9OX0JVU19DTlRMKTsKKwlidXNfY250bCA9IFJSRUczMihSVjM3MF9CVVNfQ05UTCk7CiAJZDF2Z2FfY29udHJvbCA9IFJSRUczMihBVklWT19EMVZHQV9DT05UUk9MKTsKIAlkMnZnYV9jb250cm9sID0gUlJFRzMyKEFWSVZPX0QyVkdBX0NPTlRST0wpOwogCXZnYV9yZW5kZXJfY29udHJvbCA9IFJSRUczMihBVklWT19WR0FfUkVOREVSX0NPTlRST0wpOwpAQCAtMzUwLDcgKzM1MCw3IEBACiAJV1JFRzMyKFJBREVPTl9WSVBIX0NPTlRST0wsICh2aXBoX2NvbnRyb2wgJiB+UkFERU9OX1ZJUEhfRU4pKTsKIAogCS8qIGVuYWJsZSB0aGUgcm9tICovCi0JV1JFRzMyKFJBREVPTl9CVVNfQ05UTCwgKGJ1c19jbnRsICYgflJBREVPTl9CVVNfQklPU19ESVNfUk9NKSk7CisJV1JFRzMyKFJWMzcwX0JVU19DTlRMLCAoYnVzX2NudGwgJiB+UlYzNzBfQlVTX0JJT1NfRElTX1JPTSkpOwogCiAJLyogRGlzYWJsZSBWR0EgbW9kZSAqLwogCVdSRUczMihBVklWT19EMVZHQV9DT05UUk9MLApAQCAtMzY3LDcgKzM2Nyw3IEBACiAJLyogcmVzdG9yZSByZWdzICovCiAJV1JFRzMyKFJBREVPTl9TRVBST01fQ05UTDEsIHNlcHJvbV9jbnRsMSk7CiAJV1JFRzMyKFJBREVPTl9WSVBIX0NPTlRST0wsIHZpcGhfY29udHJvbCk7Ci0JV1JFRzMyKFJBREVPTl9CVVNfQ05UTCwgYnVzX2NudGwpOworCVdSRUczMihSVjM3MF9CVVNfQ05UTCwgYnVzX2NudGwpOwogCVdSRUczMihBVklWT19EMVZHQV9DT05UUk9MLCBkMXZnYV9jb250cm9sKTsKIAlXUkVHMzIoQVZJVk9fRDJWR0FfQ09OVFJPTCwgZDJ2Z2FfY29udHJvbCk7CiAJV1JFRzMyKEFWSVZPX1ZHQV9SRU5ERVJfQ09OVFJPTCwgdmdhX3JlbmRlcl9jb250cm9sKTsKQEAgLTM5MCw3ICszOTAsMTAgQEAKIAogCXNlcHJvbV9jbnRsMSA9IFJSRUczMihSQURFT05fU0VQUk9NX0NOVEwxKTsKIAl2aXBoX2NvbnRyb2wgPSBSUkVHMzIoUkFERU9OX1ZJUEhfQ09OVFJPTCk7Ci0JYnVzX2NudGwgPSBSUkVHMzIoUkFERU9OX0JVU19DTlRMKTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkKKwkJYnVzX2NudGwgPSBSUkVHMzIoUlYzNzBfQlVTX0NOVEwpOworCWVsc2UKKwkJYnVzX2NudGwgPSBSUkVHMzIoUkFERU9OX0JVU19DTlRMKTsKIAljcnRjX2dlbl9jbnRsID0gUlJFRzMyKFJBREVPTl9DUlRDX0dFTl9DTlRMKTsKIAljcnRjMl9nZW5fY250bCA9IDA7CiAJY3J0Y19leHRfY250bCA9IFJSRUczMihSQURFT05fQ1JUQ19FWFRfQ05UTCk7CkBAIC00MTIsNyArNDE1LDEwIEBACiAJV1JFRzMyKFJBREVPTl9WSVBIX0NPTlRST0wsICh2aXBoX2NvbnRyb2wgJiB+UkFERU9OX1ZJUEhfRU4pKTsKIAogCS8qIGVuYWJsZSB0aGUgcm9tICovCi0JV1JFRzMyKFJBREVPTl9CVVNfQ05UTCwgKGJ1c19jbnRsICYgflJBREVPTl9CVVNfQklPU19ESVNfUk9NKSk7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSUUpCisJCVdSRUczMihSVjM3MF9CVVNfQ05UTCwgKGJ1c19jbnRsICYgflJWMzcwX0JVU19CSU9TX0RJU19ST00pKTsKKwllbHNlCisJCVdSRUczMihSQURFT05fQlVTX0NOVEwsIChidXNfY250bCAmIH5SQURFT05fQlVTX0JJT1NfRElTX1JPTSkpOwogCiAJLyogVHVybiBvZmYgbWVtIHJlcXVlc3RzIGFuZCBDUlRDIGZvciBib3RoIGNvbnRyb2xsZXJzICovCiAJV1JFRzMyKFJBREVPTl9DUlRDX0dFTl9DTlRMLApAQCAtNDM5LDcgKzQ0NSwxMCBAQAogCS8qIHJlc3RvcmUgcmVncyAqLwogCVdSRUczMihSQURFT05fU0VQUk9NX0NOVEwxLCBzZXByb21fY250bDEpOwogCVdSRUczMihSQURFT05fVklQSF9DT05UUk9MLCB2aXBoX2NvbnRyb2wpOwotCVdSRUczMihSQURFT05fQlVTX0NOVEwsIGJ1c19jbnRsKTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkKKwkJV1JFRzMyKFJWMzcwX0JVU19DTlRMLCBidXNfY250bCk7CisJZWxzZQorCQlXUkVHMzIoUkFERU9OX0JVU19DTlRMLCBidXNfY250bCk7CiAJV1JFRzMyKFJBREVPTl9DUlRDX0dFTl9DTlRMLCBjcnRjX2dlbl9jbnRsKTsKIAlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9TSU5HTEVfQ1JUQykpIHsKIAkJV1JFRzMyKFJBREVPTl9DUlRDMl9HRU5fQ05UTCwgY3J0YzJfZ2VuX2NudGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY2xvY2tzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jbG9ja3MuYwppbmRleCA1MjQ5YWY4Li4yZDQ4ZTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jbG9ja3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jbG9ja3MuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAJcDFwbGwtPnJlZmVyZW5jZV9kaXYgPSBSUkVHMzJfUExMKFJBREVPTl9QUExMX1JFRl9ESVYpICYgMHgzZmY7CiAJaWYgKHAxcGxsLT5yZWZlcmVuY2VfZGl2IDwgMikKIAkJcDFwbGwtPnJlZmVyZW5jZV9kaXYgPSAxMjsKLQlwMnBsbC0+cmVmZXJlbmNlX2RpdiA9IHAxcGxsLT5yZWZlcmVuY2VfZGl2OwkKKwlwMnBsbC0+cmVmZXJlbmNlX2RpdiA9IHAxcGxsLT5yZWZlcmVuY2VfZGl2OwogCiAJLyogVGhlc2UgYXJlbid0IGluIHRoZSBkZXZpY2UtdHJlZSAqLwogCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SNDIwKSB7CkBAIC0xMzksNiArMTM5LDggQEAKIAkJcDJwbGwtPnBsbF9vdXRfbWluID0gMTI1MDA7CiAJCXAycGxsLT5wbGxfb3V0X21heCA9IDM1MDAwOwogCX0KKwkvKiBub3Qgc3VyZSB3aGF0IHRoZSBtYXggc2hvdWxkIGJlIGluIGFsbCBjYXNlcyAqLworCXJkZXYtPmNsb2NrLm1heF9waXhlbF9jbG9jayA9IDM1MDAwOwogCiAJc3BsbC0+cmVmZXJlbmNlX2ZyZXEgPSBtcGxsLT5yZWZlcmVuY2VfZnJlcSA9IHAxcGxsLT5yZWZlcmVuY2VfZnJlcTsKIAlzcGxsLT5yZWZlcmVuY2VfZGl2ID0gbXBsbC0+cmVmZXJlbmNlX2RpdiA9CkBAIC0xNTEsNyArMTUzLDcgQEAKIAllbHNlCiAJCXJkZXYtPmNsb2NrLmRlZmF1bHRfc2NsayA9CiAJCQlyYWRlb25fbGVnYWN5X2dldF9lbmdpbmVfY2xvY2socmRldik7Ci0JCQkKKwogCXZhbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgIkFUWSxNQ0xLIiwgTlVMTCk7CiAJaWYgKHZhbCAmJiAqdmFsKQogCQlyZGV2LT5jbG9jay5kZWZhdWx0X21jbGsgPSAoKnZhbCkgLyAxMDsKQEAgLTE2MCw3ICsxNjIsNyBAQAogCQkJcmFkZW9uX2xlZ2FjeV9nZXRfbWVtb3J5X2Nsb2NrKHJkZXYpOwogCiAJRFJNX0lORk8oIlVzaW5nIGRldmljZS10cmVlIGNsb2NrIGluZm9cbiIpOwotCQorCiAJcmV0dXJuIHRydWU7CiB9CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jCmluZGV4IDViOTkxZjcuLmU0NTk0NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMKQEAgLTg2Niw2ICs4NjYsMTEgQEAKIAkJcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrID0gc2NsazsKIAkJcmRldi0+Y2xvY2suZGVmYXVsdF9tY2xrID0gbWNsazsKIAorCQlpZiAoUkJJT1MzMihwbGxfaW5mbyArIDB4MTYpKQorCQkJcmRldi0+Y2xvY2subWF4X3BpeGVsX2Nsb2NrID0gUkJJT1MzMihwbGxfaW5mbyArIDB4MTYpOworCQllbHNlCisJCQlyZGV2LT5jbG9jay5tYXhfcGl4ZWxfY2xvY2sgPSAzNTAwMDsgLyogbWlnaHQgbmVlZCBzb21ldGhpbmcgYXNpYyBzcGVjaWZpYyAqLworCiAJCXJldHVybiB0cnVlOwogCX0KIAlyZXR1cm4gZmFsc2U7CkBAIC0xNTQ4LDEwICsxNTUzLDEyIEBACiAJCQkgICAocmRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDRhNDgpKSB7CiAJCQkvKiBNYWMgWDgwMCAqLwogCQkJcmRldi0+bW9kZV9pbmZvLmNvbm5lY3Rvcl90YWJsZSA9IENUX01BQ19YODAwOwotCQl9IGVsc2UgaWYgKChyZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg0MTUwKSAmJgorCQl9IGVsc2UgaWYgKChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyTWFjNywyIikgfHwKKwkJCSAgICBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyTWFjNywzIikpICYmCisJCQkgICAocmRldi0+cGRldi0+ZGV2aWNlID09IDB4NDE1MCkgJiYKIAkJCSAgIChyZGV2LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAwMikgJiYKIAkJCSAgIChyZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4NDE1MCkpIHsKLQkJCS8qIE1hYyBHNSA5NjAwICovCisJCQkvKiBNYWMgRzUgdG93ZXIgOTYwMCAqLwogCQkJcmRldi0+bW9kZV9pbmZvLmNvbm5lY3Rvcl90YWJsZSA9IENUX01BQ19HNV85NjAwOwogCQl9IGVsc2UKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYwppbmRleCBlZTFkY2NiLi45NzkyZDRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCkBAIC00NCwxMiArNDQsMjAgQEAKIHJhZGVvbl9sZWdhY3lfYmFja2xpZ2h0X2luaXQoc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciwKIAkJCSAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmRybV9jb25uZWN0b3IpOwogCitib29sIHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19kcF9icmlkZ2Uoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CisKIHZvaWQgcmFkZW9uX2Nvbm5lY3Rvcl9ob3RwbHVnKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAorCS8qIGJhaWwgaWYgdGhlIGNvbm5lY3RvciBkb2VzIG5vdCBoYXZlIGhwZCBwaW4sIGUuZy4sCisJICogVkdBLCBUViwgZXRjLgorCSAqLworCWlmIChyYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkID09IFJBREVPTl9IUERfTk9ORSkKKwkJcmV0dXJuOworCiAJcmFkZW9uX2hwZF9zZXRfcG9sYXJpdHkocmRldiwgcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCk7CiAKIAkvKiBwb3dlcmluZyB1cC9kb3duIHRoZSBlRFAgcGFuZWwgZ2VuZXJhdGVzIGhwZCBldmVudHMgd2hpY2gKQEAgLTYyNiw4ICs2MzQsMTQgQEAKIHN0YXRpYyBpbnQgcmFkZW9uX3ZnYV9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCiAJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCiAJLyogWFhYIGNoZWNrIG1vZGUgYmFuZHdpZHRoICovCi0JLyogWFhYIHZlcmlmeSBhZ2FpbnN0IG1heCBEQUMgb3V0cHV0IGZyZXF1ZW5jeSAqLworCisJaWYgKChtb2RlLT5jbG9jayAvIDEwKSA+IHJkZXYtPmNsb2NrLm1heF9waXhlbF9jbG9jaykKKwkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKKwogCXJldHVybiBNT0RFX09LOwogfQogCkBAIC04MzAsNiArODQ0LDEzIEBACiAJCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgewogCQkJRFJNX0VSUk9SKCIlczogcHJvYmVkIGEgbW9uaXRvciBidXQgbm98aW52YWxpZCBFRElEXG4iLAogCQkJCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkJLyogcnM2OTAgc2VlbXMgdG8gaGF2ZSBhIHByb2JsZW0gd2l0aCBjb25uZWN0b3JzIG5vdCBleGlzdGluZyBhbmQgYWx3YXlzCisJCQkgKiByZXR1cm4gYSBibG9jayBvZiAwJ3MuIElmIHdlIHNlZSB0aGlzIGp1c3Qgc3RvcCBwb2xsaW5nIG9uIHRoaXMgb3V0cHV0ICovCisJCQlpZiAoKHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNjkwIHx8IHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNzQwKSAmJiByYWRlb25fY29ubmVjdG9yLT5iYXNlLm51bGxfZWRpZF9jb3VudGVyKSB7CisJCQkJcmV0ID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJCQkJRFJNX0VSUk9SKCIlczogZGV0ZWN0ZWQgUlM2OTAgZmxvYXRpbmcgYnVzIGJ1Zywgc3RvcHBpbmcgZGRjIGRldGVjdFxuIiwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCQlyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzID0gTlVMTDsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCXJhZGVvbl9jb25uZWN0b3ItPnVzZV9kaWdpdGFsID0gISEocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZC0+aW5wdXQgJiBEUk1fRURJRF9JTlBVVF9ESUdJVEFMKTsKIApAQCAtMTAxNSw2ICsxMDM2LDExIEBACiAJCX0gZWxzZQogCQkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKIAl9CisKKwkvKiBjaGVjayBhZ2FpbnN0IHRoZSBtYXggcGl4ZWwgY2xvY2sgKi8KKwlpZiAoKG1vZGUtPmNsb2NrIC8gMTApID4gcmRldi0+Y2xvY2subWF4X3BpeGVsX2Nsb2NrKQorCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCiAJcmV0dXJuIE1PREVfT0s7CiB9CiAKQEAgLTEwNTIsMTAgKzEwNzgsMTEgQEAKIHsKIAlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqcmFkZW9uX2RpZ19jb25uZWN0b3IgPSByYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSByYWRlb25fYmVzdF9zaW5nbGVfZW5jb2Rlcihjb25uZWN0b3IpOwogCWludCByZXQ7CiAKLQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKSB7Ci0JCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlpZiAoKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgfHwKKwkgICAgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpKSB7CiAJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwogCiAJCWlmICghcmFkZW9uX2RpZ19jb25uZWN0b3ItPmVkcF9vbikKQEAgLTEwNjcsNyArMTA5NCw2IEBACiAJCQkJCQkgICAgIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09GRik7CiAKIAkJaWYgKHJldCA+IDApIHsKLQkJCWVuY29kZXIgPSByYWRlb25fYmVzdF9zaW5nbGVfZW5jb2Rlcihjb25uZWN0b3IpOwogCQkJaWYgKGVuY29kZXIpIHsKIAkJCQlyYWRlb25fZml4dXBfbHZkc19uYXRpdmVfbW9kZShlbmNvZGVyLCBjb25uZWN0b3IpOwogCQkJCS8qIGFkZCBzY2FsZWQgbW9kZXMgKi8KQEAgLTEwOTEsOCArMTExNywxNCBAQAogCQkJLyogYWRkIHNjYWxlZCBtb2RlcyAqLwogCQkJcmFkZW9uX2FkZF9jb21tb25fbW9kZXMoZW5jb2RlciwgY29ubmVjdG9yKTsKIAkJfQotCX0gZWxzZQorCX0gZWxzZSB7CisJCS8qIG5lZWQgdG8gc2V0dXAgZGRjIG9uIHRoZSBicmlkZ2UgKi8KKwkJaWYgKHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19kcF9icmlkZ2UoY29ubmVjdG9yKSkgeworCQkJaWYgKGVuY29kZXIpCisJCQkJcmFkZW9uX2F0b21fZXh0X2VuY29kZXJfc2V0dXBfZGRjKGVuY29kZXIpOworCQl9CiAJCXJldCA9IHJhZGVvbl9kZGNfZ2V0X21vZGVzKHJhZGVvbl9jb25uZWN0b3IpOworCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMTc2LDE0ICsxMjA4LDE1IEBACiAJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyByZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKIAlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqcmFkZW9uX2RpZ19jb25uZWN0b3IgPSByYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSByYWRlb25fYmVzdF9zaW5nbGVfZW5jb2Rlcihjb25uZWN0b3IpOwogCiAJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpIHsKIAkJa2ZyZWUocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCk7CiAJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSBOVUxMOwogCX0KIAotCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApIHsKLQkJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gcmFkZW9uX2Jlc3Rfc2luZ2xlX2VuY29kZXIoY29ubmVjdG9yKTsKKwlpZiAoKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgfHwKKwkgICAgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpKSB7CiAJCWlmIChlbmNvZGVyKSB7CiAJCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CiAJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmF0aXZlX21vZGUgPSAmcmFkZW9uX2VuY29kZXItPm5hdGl2ZV9tb2RlOwpAQCAtMTIwMyw2ICsxMjM2LDExIEBACiAJCQlhdG9tYmlvc19zZXRfZWRwX3BhbmVsX3Bvd2VyKGNvbm5lY3RvciwKIAkJCQkJCSAgICAgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fUE9XRVJfT0ZGKTsKIAl9IGVsc2UgeworCQkvKiBuZWVkIHRvIHNldHVwIGRkYyBvbiB0aGUgYnJpZGdlICovCisJCWlmIChyYWRlb25fY29ubmVjdG9yX2VuY29kZXJfaXNfZHBfYnJpZGdlKGNvbm5lY3RvcikpIHsKKwkJCWlmIChlbmNvZGVyKQorCQkJCXJhZGVvbl9hdG9tX2V4dF9lbmNvZGVyX3NldHVwX2RkYyhlbmNvZGVyKTsKKwkJfQogCQlyYWRlb25fZGlnX2Nvbm5lY3Rvci0+ZHBfc2lua190eXBlID0gcmFkZW9uX2RwX2dldHNpbmt0eXBlKHJhZGVvbl9jb25uZWN0b3IpOwogCQlpZiAocmFkZW9uX2hwZF9zZW5zZShyZGV2LCByYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKSkgewogCQkJcmV0ID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CkBAIC0xMjE3LDYgKzEyNTUsMTYgQEAKIAkJCQkJcmV0ID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CiAJCQl9CiAJCX0KKworCQlpZiAoKHJldCA9PSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZCkgJiYKKwkJICAgIHJhZGVvbl9jb25uZWN0b3ItPmRhY19sb2FkX2RldGVjdCkgeworCQkJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gcmFkZW9uX2Jlc3Rfc2luZ2xlX2VuY29kZXIoY29ubmVjdG9yKTsKKwkJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmVuY29kZXJfZnVuY3M7CisJCQlpZiAoZW5jb2RlcikgeworCQkJCWVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwkJCQlyZXQgPSBlbmNvZGVyX2Z1bmNzLT5kZXRlY3QoZW5jb2RlciwgY29ubmVjdG9yKTsKKwkJCX0KKwkJfQogCX0KIAogCXJhZGVvbl9jb25uZWN0b3JfdXBkYXRlX3NjcmF0Y2hfcmVncyhjb25uZWN0b3IsIHJldCk7CkBAIC0xMjMxLDcgKzEyNzksOCBAQAogCiAJLyogWFhYIGNoZWNrIG1vZGUgYmFuZHdpZHRoICovCiAKLQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKSB7CisJaWYgKChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApIHx8CisJICAgIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKSkgewogCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSByYWRlb25fYmVzdF9zaW5nbGVfZW5jb2Rlcihjb25uZWN0b3IpOwogCiAJCWlmICgobW9kZS0+aGRpc3BsYXkgPCAzMjApIHx8IChtb2RlLT52ZGlzcGxheSA8IDI0MCkpCkBAIC0xMjQxLDcgKzEyOTAsNyBAQAogCQkJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwogCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5hdGl2ZV9tb2RlID0gJnJhZGVvbl9lbmNvZGVyLT5uYXRpdmVfbW9kZTsKIAotCQkvKiBBVklWTyBoYXJkd2FyZSBzdXBwb3J0cyBkb3duc2NhbGluZyBtb2RlcyBsYXJnZXIgdGhhbiB0aGUgcGFuZWwKKwkJCS8qIEFWSVZPIGhhcmR3YXJlIHN1cHBvcnRzIGRvd25zY2FsaW5nIG1vZGVzIGxhcmdlciB0aGFuIHRoZSBwYW5lbAogCQkJICogdG8gdGhlIHBhbmVsIHNpemUsIGJ1dCBJJ20gbm90IHN1cmUgdGhpcyBpcyBkZXNpcmFibGUuCiAJCQkgKi8KIAkJCWlmICgobW9kZS0+aGRpc3BsYXkgPiBuYXRpdmVfbW9kZS0+aGRpc3BsYXkpIHx8CkBAIC0xMzkwLDYgKzE0MzksMTAgQEAKIAkJZGVmYXVsdDoKIAkJCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSB0cnVlOwogCQkJY29ubmVjdG9yLT5kb3VibGVzY2FuX2FsbG93ZWQgPSB0cnVlOworCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGFjX2xvYWRfZGV0ZWN0ID0gdHJ1ZTsKKwkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAorCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLmxvYWRfZGV0ZWN0X3Byb3BlcnR5LAorCQkJCQkJICAgICAgMSk7CiAJCQlicmVhazsKIAkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSToKIAkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRDoKQEAgLTE0MTEsNiArMTQ2NCwxMiBAQAogCQkJCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gdHJ1ZTsKIAkJCWVsc2UKIAkJCQljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IGZhbHNlOworCQkJaWYgKGNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJKSB7CisJCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGFjX2xvYWRfZGV0ZWN0ID0gdHJ1ZTsKKwkJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKKwkJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8ubG9hZF9kZXRlY3RfcHJvcGVydHksCisJCQkJCQkJICAgICAgMSk7CisJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUzoKIAkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfZURQOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMKaW5kZXggOGMxOTE2OS4uZmFlMDBjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jCkBAIC0yMjgsNiArMjI4LDcgQEAKIAlwYXJzZXIuZmlscCA9IGZpbHA7CiAJcGFyc2VyLnJkZXYgPSByZGV2OwogCXBhcnNlci5kZXYgPSByZGV2LT5kZXY7CisJcGFyc2VyLmZhbWlseSA9IHJkZXYtPmZhbWlseTsKIAlyID0gcmFkZW9uX2NzX3BhcnNlcl9pbml0KCZwYXJzZXIsIGRhdGEpOwogCWlmIChyKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHRvIGluaXRpYWxpemUgcGFyc2VyICFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYwppbmRleCA1YjYxMzY0Li43Y2ZhYTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYwpAQCAtODIsNiArODIsOCBAQAogCSJDWVBSRVNTIiwKIAkiSEVNTE9DSyIsCiAJIlBBTE0iLAorCSJTVU1PIiwKKwkiU1VNTzIiLAogCSJCQVJUUyIsCiAJIlRVUktTIiwKIAkiQ0FJQ09TIiwKQEAgLTIxMyw2ICsyMTUsOCBAQAogCQlyZXR1cm4gcjsKIAl9CiAKKwkvKiBjbGVhciB3YiBtZW1vcnkgKi8KKwltZW1zZXQoKGNoYXIgKilyZGV2LT53Yi53YiwgMCwgUkFERU9OX0dQVV9QQUdFX1NJWkUpOwogCS8qIGRpc2FibGUgZXZlbnRfd3JpdGUgZmVuY2VzICovCiAJcmRldi0+d2IudXNlX2V2ZW50ID0gZmFsc2U7CiAJLyogZGlzYWJsZWQgdmlhIG1vZHVsZSBwYXJhbSAqLwpAQCAtNzUyLDYgKzc1Niw3IEBACiAJZG1hX2JpdHMgPSByZGV2LT5uZWVkX2RtYTMyID8gMzIgOiA0MDsKIAlyID0gcGNpX3NldF9kbWFfbWFzayhyZGV2LT5wZGV2LCBETUFfQklUX01BU0soZG1hX2JpdHMpKTsKIAlpZiAocikgeworCQlyZGV2LT5uZWVkX2RtYTMyID0gdHJ1ZTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAicmFkZW9uOiBObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKaW5kZXggYWUyNDdlZS4uMjkyZjczZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYwpAQCAtMjY0LDYgKzI2NCw4IEBACiAJCXJhZGVvbl9ib191bnJlc2VydmUod29yay0+b2xkX3Jibyk7CiAJfSBlbHNlCiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlc2VydmUgYnVmZmVyIGFmdGVyIGZsaXBcbiIpOworCisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoJndvcmstPm9sZF9yYm8tPmdlbV9iYXNlKTsKIAlrZnJlZSh3b3JrKTsKIH0KIApAQCAtMzcxLDYgKzM3Myw4IEBACiAJbmV3X3JhZGVvbl9mYiA9IHRvX3JhZGVvbl9mcmFtZWJ1ZmZlcihmYik7CiAJLyogc2NoZWR1bGUgdW5waW4gb2YgdGhlIG9sZCBidWZmZXIgKi8KIAlvYmogPSBvbGRfcmFkZW9uX2ZiLT5vYmo7CisJLyogdGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgb2xkIG9iamVjdCAqLworCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZShvYmopOwogCXJibyA9IGdlbV90b19yYWRlb25fYm8ob2JqKTsKIAl3b3JrLT5vbGRfcmJvID0gcmJvOwogCUlOSVRfV09SSygmd29yay0+d29yaywgcmFkZW9uX3VucGluX3dvcmtfZnVuYyk7CkBAIC0zNzgsMTIgKzM4Miw5IEBACiAJLyogV2UgYm9ycm93IHRoZSBldmVudCBzcGluIGxvY2sgZm9yIHByb3RlY3RpbmcgdW5waW5fd29yayAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAlpZiAocmFkZW9uX2NydGMtPnVucGluX3dvcmspIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7Ci0JCWtmcmVlKHdvcmspOwotCQlyYWRlb25fZmVuY2VfdW5yZWYoJmZlbmNlKTsKLQogCQlEUk1fREVCVUdfRFJJVkVSKCJmbGlwIHF1ZXVlOiBjcnRjIGFscmVhZHkgYnVzeVxuIik7Ci0JCXJldHVybiAtRUJVU1k7CisJCXIgPSAtRUJVU1k7CisJCWdvdG8gdW5sb2NrX2ZyZWU7CiAJfQogCXJhZGVvbl9jcnRjLT51bnBpbl93b3JrID0gd29yazsKIAlyYWRlb25fY3J0Yy0+ZGVmZXJyZWRfZmxpcF9jb21wbGV0aW9uID0gMDsKQEAgLTQ5Nyw2ICs0OTgsOCBAQAogcGZsaXBfY2xlYW51cDoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAJcmFkZW9uX2NydGMtPnVucGluX3dvcmsgPSBOVUxMOwordW5sb2NrX2ZyZWU6CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQob2xkX3JhZGVvbl9mYi0+b2JqKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAlyYWRlb25fZmVuY2VfdW5yZWYoJmZlbmNlKTsKIAlrZnJlZSh3b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKaW5kZXggMWQzMzA2MC4uNzNkZmJlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKQEAgLTExMyw3ICsxMTMsNyBAQAogaW50IHJhZGVvbl90ZXN0aW5nID0gMDsKIGludCByYWRlb25fY29ubmVjdG9yX3RhYmxlID0gMDsKIGludCByYWRlb25fdHYgPSAxOwotaW50IHJhZGVvbl9hdWRpbyA9IDE7CitpbnQgcmFkZW9uX2F1ZGlvID0gMDsKIGludCByYWRlb25fZGlzcF9wcmlvcml0eSA9IDA7CiBpbnQgcmFkZW9uX2h3X2kyYyA9IDA7CiBpbnQgcmFkZW9uX3BjaWVfZ2VuMiA9IDA7CkBAIC0xNTEsNyArMTUxLDcgQEAKIE1PRFVMRV9QQVJNX0RFU0ModHYsICJUViBlbmFibGUgKDAgPSBkaXNhYmxlKSIpOwogbW9kdWxlX3BhcmFtX25hbWVkKHR2LCByYWRlb25fdHYsIGludCwgMDQ0NCk7CiAKLU1PRFVMRV9QQVJNX0RFU0MoYXVkaW8sICJBdWRpbyBlbmFibGUgKDAgPSBkaXNhYmxlKSIpOworTU9EVUxFX1BBUk1fREVTQyhhdWRpbywgIkF1ZGlvIGVuYWJsZSAoMSA9IGVuYWJsZSkiKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChhdWRpbywgcmFkZW9uX2F1ZGlvLCBpbnQsIDA0NDQpOwogCiBNT0RVTEVfUEFSTV9ERVNDKGRpc3BfcHJpb3JpdHksICJEaXNwbGF5IFByaW9yaXR5ICgwID0gYXV0bywgMSA9IG5vcm1hbCwgMiA9IGhpZ2gpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYwppbmRleCAxYjU1NzU1Li5iMjkzNDg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKQEAgLTM2Nyw3ICszNjcsOCBAQAogCX0KIAogCWlmIChBU0lDX0lTX0RDRTMocmRldikgJiYKLQkgICAgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSkgeworCSAgICAoKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB8fAorCSAgICAgcmFkZW9uX2VuY29kZXJfaXNfZHBfYnJpZGdlKGVuY29kZXIpKSkgewogCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CiAJCXJhZGVvbl9kcF9zZXRfbGlua19jb25maWcoY29ubmVjdG9yLCBtb2RlKTsKIAl9CkBAIC02NjAsMjEgKzY2MSwxNiBAQAogCWlmIChyYWRlb25fZW5jb2Rlcl9pc19kcF9icmlkZ2UoZW5jb2RlcikpCiAJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EUDsKIAorCS8qIERWTyBpcyBhbHdheXMgRFZPICovCisJaWYgKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEFUT01fRU5DT0RFUl9NT0RFX0RWTykKKwkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RWTzsKKwogCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwotCWlmICghY29ubmVjdG9yKSB7Ci0JCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKLQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfQ1JUOwotCQl9Ci0JfQorCS8qIGlmIHdlIGRvbid0IGhhdmUgYW4gYWN0aXZlIGRldmljZSB5ZXQsIGp1c3QgdXNlIG9uZSBvZgorCSAqIHRoZSBjb25uZWN0b3JzIHRpZWQgdG8gdGhlIGVuY29kZXIuCisJICovCisJaWYgKCFjb25uZWN0b3IpCisJCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyX2luaXQoZW5jb2Rlcik7CiAJcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAogCXN3aXRjaCAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSkgewpAQCAtOTU0LDEwICs5NTAsMTUgQEAKIAlpbnQgZHBfbGFuZV9jb3VudCA9IDA7CiAJaW50IGNvbm5lY3Rvcl9vYmplY3RfaWQgPSAwOwogCWludCBpZ3BfbGFuZV9pbmZvID0gMDsKKwlpbnQgZGlnX2VuY29kZXIgPSBkaWctPmRpZ19lbmNvZGVyOwogCi0JaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9JTklUKQorCWlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fSU5JVCkgewogCQljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2Rlcl9pbml0KGVuY29kZXIpOwotCWVsc2UKKwkJLyoganVzdCBuZWVkZWQgdG8gYXZvaWQgYmFpbGluZyBpbiB0aGUgZW5jb2RlciBjaGVjay4gIHRoZSBlbmNvZGVyCisJCSAqIGlzbid0IHVzZWQgZm9yIGluaXQKKwkJICovCisJCWRpZ19lbmNvZGVyID0gMDsKKwl9IGVsc2UKIAkJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CiAKIAlpZiAoY29ubmVjdG9yKSB7CkBAIC05NzMsNyArOTc0LDcgQEAKIAl9CiAKIAkvKiBubyBkaWcgZW5jb2RlciBhc3NpZ25lZCAqLwotCWlmIChkaWctPmRpZ19lbmNvZGVyID09IC0xKQorCWlmIChkaWdfZW5jb2RlciA9PSAtMSkKIAkJcmV0dXJuOwogCiAJaWYgKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2RlcikgPT0gQVRPTV9FTkNPREVSX01PREVfRFApCkBAIC0xMDIzLDcgKzEwMjQsNyBAQAogCiAJCWlmIChkaWctPmxpbmtiKQogCQkJYXJncy52My5hY0NvbmZpZy51Y0xpbmtTZWwgPSAxOwotCQlpZiAoZGlnLT5kaWdfZW5jb2RlciAmIDEpCisJCWlmIChkaWdfZW5jb2RlciAmIDEpCiAJCQlhcmdzLnYzLmFjQ29uZmlnLnVjRW5jb2RlclNlbCA9IDE7CiAKIAkJLyogU2VsZWN0IHRoZSBQTEwgZm9yIHRoZSBQSFkKQEAgLTEwNzMsNyArMTA3NCw3IEBACiAJCQkJYXJncy52My5hY0NvbmZpZy5mRHVhbExpbmtDb25uZWN0b3IgPSAxOwogCQl9CiAJfSBlbHNlIGlmIChBU0lDX0lTX0RDRTMyKHJkZXYpKSB7Ci0JCWFyZ3MudjIuYWNDb25maWcudWNFbmNvZGVyU2VsID0gZGlnLT5kaWdfZW5jb2RlcjsKKwkJYXJncy52Mi5hY0NvbmZpZy51Y0VuY29kZXJTZWwgPSBkaWdfZW5jb2RlcjsKIAkJaWYgKGRpZy0+bGlua2IpCiAJCQlhcmdzLnYyLmFjQ29uZmlnLnVjTGlua1NlbCA9IDE7CiAKQEAgLTEwODksOSArMTA5MCwxMCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoaXNfZHApCisJCWlmIChpc19kcCkgewogCQkJYXJncy52Mi5hY0NvbmZpZy5mQ29oZXJlbnRNb2RlID0gMTsKLQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQpKSB7CisJCQlhcmdzLnYyLmFjQ29uZmlnLmZEUENvbm5lY3RvciA9IDE7CisJCX0gZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQpKSB7CiAJCQlpZiAoZGlnLT5jb2hlcmVudF9tb2RlKQogCQkJCWFyZ3MudjIuYWNDb25maWcuZkNvaGVyZW50TW9kZSA9IDE7CiAJCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQpAQCAtMTEwMCw3ICsxMTAyLDcgQEAKIAl9IGVsc2UgewogCQlhcmdzLnYxLnVjQ29uZmlnID0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfQ0xLU1JDX1BQTEw7CiAKLQkJaWYgKGRpZy0+ZGlnX2VuY29kZXIpCisJCWlmIChkaWdfZW5jb2RlcikKIAkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfRElHMl9FTkNPREVSOwogCQllbHNlCiAJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0RJRzFfRU5DT0RFUjsKQEAgLTE0MzAsNyArMTQzMiwxMSBAQAogCWlmIChpc19kaWcpIHsKIAkJc3dpdGNoIChtb2RlKSB7CiAJCWNhc2UgRFJNX01PREVfRFBNU19PTjoKLQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9FTkFCTEVfT1VUUFVULCAwLCAwKTsKKwkJCS8qIHNvbWUgZWFybHkgZGNlMy4yIGJvYXJkcyBoYXZlIGEgYnVnIGluIHRoZWlyIHRyYW5zbWl0dGVyIGNvbnRyb2wgdGFibGUgKi8KKwkJCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfUlY3MTApIHx8IChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjczMCkpCisJCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0VOQUJMRSwgMCwgMCk7CisJCQllbHNlCisJCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0VOQUJMRV9PVVRQVVQsIDAsIDApOwogCQkJaWYgKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2RlcikgPT0gQVRPTV9FTkNPREVSX01PREVfRFApIHsKIAkJCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CiAKQEAgLTE1MjEsMjYgKzE1MjcsMjkgQEAKIAl9CiAKIAlpZiAoZXh0X2VuY29kZXIpIHsKLQkJaW50IGFjdGlvbjsKLQogCQlzd2l0Y2ggKG1vZGUpIHsKIAkJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgogCQlkZWZhdWx0OgotCQkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpCi0JCQkJYWN0aW9uID0gRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5BQkxFX09VVFBVVDsKLQkJCWVsc2UKLQkJCQlhY3Rpb24gPSBBVE9NX0VOQUJMRTsKKwkJCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKSB7CisJCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5BQkxFX09VVFBVVCk7CisJCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9CTEFOS0lOR19PRkYpOworCQkJfSBlbHNlCisJCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwgQVRPTV9FTkFCTEUpOwogCQkJYnJlYWs7CiAJCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgogCQljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKIAkJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKLQkJCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKQotCQkJCWFjdGlvbiA9IEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0RJU0FCTEVfT1VUUFVUOwotCQkJZWxzZQotCQkJCWFjdGlvbiA9IEFUT01fRElTQUJMRTsKKwkJCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKSB7CisJCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9CTEFOS0lORyk7CisJCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRElTQUJMRV9PVVRQVVQpOworCQkJfSBlbHNlCisJCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsIGFjdGlvbik7CiAJfQogCiAJcmFkZW9uX2F0b21iaW9zX2VuY29kZXJfZHBtc19zY3JhdGNoX3JlZ3MoZW5jb2RlciwgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikgPyB0cnVlIDogZmFsc2UpOwpAQCAtMTk5OSw2ICsyMDA4LDY1IEBACiAJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwogfQogCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cworcmFkZW9uX2F0b21fZGlnX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZXh0X2VuY29kZXIgPSByYWRlb25fYXRvbV9nZXRfZXh0ZXJuYWxfZW5jb2RlcihlbmNvZGVyKTsKKwl1MzIgYmlvc18wX3NjcmF0Y2g7CisKKwlpZiAoIUFTSUNfSVNfRENFNChyZGV2KSkKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKKworCWlmICghZXh0X2VuY29kZXIpCisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247CisKKwlpZiAoKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlRfU1VQUE9SVCkgPT0gMCkKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKKworCS8qIGxvYWQgZGV0ZWN0IG9uIHRoZSBkcCBicmlkZ2UgKi8KKwlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19EQUNMT0FEX0RFVEVDVElPTik7CisKKwliaW9zXzBfc2NyYXRjaCA9IFJSRUczMihSNjAwX0JJT1NfMF9TQ1JBVENIKTsKKworCURSTV9ERUJVR19LTVMoIkJpb3MgMCBzY3JhdGNoICV4ICUwOHhcbiIsIGJpb3NfMF9zY3JhdGNoLCByYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyk7CisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlQxX1NVUFBPUlQpIHsKKwkJaWYgKGJpb3NfMF9zY3JhdGNoICYgQVRPTV9TMF9DUlQxX01BU0spCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJfQorCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMl9TVVBQT1JUKSB7CisJCWlmIChiaW9zXzBfc2NyYXRjaCAmIEFUT01fUzBfQ1JUMl9NQVNLKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCX0KKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NWX1NVUFBPUlQpIHsKKwkJaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfQ1ZfTUFTS3xBVE9NX1MwX0NWX01BU0tfQSkpCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJfQorCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpIHsKKwkJaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfVFYxX0NPTVBPU0lURSB8IEFUT01fUzBfVFYxX0NPTVBPU0lURV9BKSkKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsgLyogQ1RWICovCisJCWVsc2UgaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfVFYxX1NWSURFTyB8IEFUT01fUzBfVFYxX1NWSURFT19BKSkKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsgLyogU1RWICovCisJfQorCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKK30KKwordm9pZAorcmFkZW9uX2F0b21fZXh0X2VuY29kZXJfc2V0dXBfZGRjKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2F0b21fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7CisKKwlpZiAoZXh0X2VuY29kZXIpCisJCS8qIGRkY19zZXR1cCBvbiB0aGUgZHAgYnJpZGdlICovCisJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19ERENfU0VUVVApOworCit9CisKIHN0YXRpYyB2b2lkIHJhZGVvbl9hdG9tX2VuY29kZXJfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwpAQCAtMjE2Miw3ICsyMjMwLDcgQEAKIAkubW9kZV9zZXQgPSByYWRlb25fYXRvbV9lbmNvZGVyX21vZGVfc2V0LAogCS5jb21taXQgPSByYWRlb25fYXRvbV9lbmNvZGVyX2NvbW1pdCwKIAkuZGlzYWJsZSA9IHJhZGVvbl9hdG9tX2VuY29kZXJfZGlzYWJsZSwKLQkvKiBubyBkZXRlY3QgZm9yIFRNRFMvTFZEUyB5ZXQgKi8KKwkuZGV0ZWN0ID0gcmFkZW9uX2F0b21fZGlnX2RldGVjdCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIHJhZGVvbl9hdG9tX2RhY19oZWxwZXJfZnVuY3MgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYW1pbHkuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZhbWlseS5oCmluZGV4IDZmMWQ5ZTUuLmVjMmYxZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZhbWlseS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZhbWlseS5oCkBAIC04MSw2ICs4MSw4IEBACiAJQ0hJUF9DWVBSRVNTLAogCUNISVBfSEVNTE9DSywKIAlDSElQX1BBTE0sCisJQ0hJUF9TVU1PLAorCUNISVBfU1VNTzIsCiAJQ0hJUF9CQVJUUywKIAlDSElQX1RVUktTLAogCUNISVBfQ0FJQ09TLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMKaW5kZXggMWY4MjI5NC4uMDIxZDJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jCkBAIC00MCw2ICs0MCwzNSBAQAogI2luY2x1ZGUgInJhZGVvbi5oIgogI2luY2x1ZGUgInJhZGVvbl90cmFjZS5oIgogCitzdGF0aWMgdm9pZCByYWRlb25fZmVuY2Vfd3JpdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUzMiBzZXEpCit7CisJaWYgKHJkZXYtPndiLmVuYWJsZWQpIHsKKwkJdTMyIHNjcmF0Y2hfaW5kZXg7CisJCWlmIChyZGV2LT53Yi51c2VfZXZlbnQpCisJCQlzY3JhdGNoX2luZGV4ID0gUjYwMF9XQl9FVkVOVF9PRkZTRVQgKyByZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcgLSByZGV2LT5zY3JhdGNoLnJlZ19iYXNlOworCQllbHNlCisJCQlzY3JhdGNoX2luZGV4ID0gUkFERU9OX1dCX1NDUkFUQ0hfT0ZGU0VUICsgcmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnIC0gcmRldi0+c2NyYXRjaC5yZWdfYmFzZTsKKwkJcmRldi0+d2Iud2Jbc2NyYXRjaF9pbmRleC80XSA9IGNwdV90b19sZTMyKHNlcSk7OworCX0gZWxzZQorCQlXUkVHMzIocmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnLCBzZXEpOworfQorCitzdGF0aWMgdTMyIHJhZGVvbl9mZW5jZV9yZWFkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXUzMiBzZXE7CisKKwlpZiAocmRldi0+d2IuZW5hYmxlZCkgeworCQl1MzIgc2NyYXRjaF9pbmRleDsKKwkJaWYgKHJkZXYtPndiLnVzZV9ldmVudCkKKwkJCXNjcmF0Y2hfaW5kZXggPSBSNjAwX1dCX0VWRU5UX09GRlNFVCArIHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZyAtIHJkZXYtPnNjcmF0Y2gucmVnX2Jhc2U7CisJCWVsc2UKKwkJCXNjcmF0Y2hfaW5kZXggPSBSQURFT05fV0JfU0NSQVRDSF9PRkZTRVQgKyByZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcgLSByZGV2LT5zY3JhdGNoLnJlZ19iYXNlOworCQlzZXEgPSBsZTMyX3RvX2NwdShyZGV2LT53Yi53YltzY3JhdGNoX2luZGV4LzRdKTsKKwl9IGVsc2UKKwkJc2VxID0gUlJFRzMyKHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZyk7CisJcmV0dXJuIHNlcTsKK30KKwogaW50IHJhZGVvbl9mZW5jZV9lbWl0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZSkKIHsKIAl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKQEAgLTUwLDEyICs3OSwxMiBAQAogCQlyZXR1cm4gMDsKIAl9CiAJZmVuY2UtPnNlcSA9IGF0b21pY19hZGRfcmV0dXJuKDEsICZyZGV2LT5mZW5jZV9kcnYuc2VxKTsKLQlpZiAoIXJkZXYtPmNwLnJlYWR5KSB7CisJaWYgKCFyZGV2LT5jcC5yZWFkeSkKIAkJLyogRklYTUU6IGNwIGlzIG5vdCBydW5uaW5nIGFzc3VtZSBldmVyeXRoaW5ncyBpcyBkb25lIHJpZ2h0CiAJCSAqIGF3YXkKIAkJICovCi0JCVdSRUczMihyZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcsIGZlbmNlLT5zZXEpOwotCX0gZWxzZQorCQlyYWRlb25fZmVuY2Vfd3JpdGUocmRldiwgZmVuY2UtPnNlcSk7CisJZWxzZQogCQlyYWRlb25fZmVuY2VfcmluZ19lbWl0KHJkZXYsIGZlbmNlKTsKIAogCXRyYWNlX3JhZGVvbl9mZW5jZV9lbWl0KHJkZXYtPmRkZXYsIGZlbmNlLT5zZXEpOwpAQCAtNzMsMTUgKzEwMiw3IEBACiAJYm9vbCB3YWtlID0gZmFsc2U7CiAJdW5zaWduZWQgbG9uZyBjamlmZmllczsKIAotCWlmIChyZGV2LT53Yi5lbmFibGVkKSB7Ci0JCXUzMiBzY3JhdGNoX2luZGV4OwotCQlpZiAocmRldi0+d2IudXNlX2V2ZW50KQotCQkJc2NyYXRjaF9pbmRleCA9IFI2MDBfV0JfRVZFTlRfT0ZGU0VUICsgcmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnIC0gcmRldi0+c2NyYXRjaC5yZWdfYmFzZTsKLQkJZWxzZQotCQkJc2NyYXRjaF9pbmRleCA9IFJBREVPTl9XQl9TQ1JBVENIX09GRlNFVCArIHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZyAtIHJkZXYtPnNjcmF0Y2gucmVnX2Jhc2U7Ci0JCXNlcSA9IGxlMzJfdG9fY3B1KHJkZXYtPndiLndiW3NjcmF0Y2hfaW5kZXgvNF0pOwotCX0gZWxzZQotCQlzZXEgPSBSUkVHMzIocmRldi0+ZmVuY2VfZHJ2LnNjcmF0Y2hfcmVnKTsKKwlzZXEgPSByYWRlb25fZmVuY2VfcmVhZChyZGV2KTsKIAlpZiAoc2VxICE9IHJkZXYtPmZlbmNlX2Rydi5sYXN0X3NlcSkgewogCQlyZGV2LT5mZW5jZV9kcnYubGFzdF9zZXEgPSBzZXE7CiAJCXJkZXYtPmZlbmNlX2Rydi5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOwpAQCAtMjUxLDcgKzI3Miw3IEBACiAJCQlyID0gcmFkZW9uX2dwdV9yZXNldChyZGV2KTsKIAkJCWlmIChyKQogCQkJCXJldHVybiByOwotCQkJV1JFRzMyKHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZywgZmVuY2UtPnNlcSk7CisJCQlyYWRlb25fZmVuY2Vfd3JpdGUocmRldiwgZmVuY2UtPnNlcSk7CiAJCQlyZGV2LT5ncHVfbG9ja3VwID0gZmFsc2U7CiAJCX0KIAkJdGltZW91dCA9IFJBREVPTl9GRU5DRV9KSUZGSUVTX1RJTUVPVVQ7CkBAIC0zNTEsNyArMzcyLDcgQEAKIAkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmZlbmNlX2Rydi5sb2NrLCBpcnFfZmxhZ3MpOwogCQlyZXR1cm4gcjsKIAl9Ci0JV1JFRzMyKHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZywgMCk7CisJcmFkZW9uX2ZlbmNlX3dyaXRlKHJkZXYsIDApOwogCWF0b21pY19zZXQoJnJkZXYtPmZlbmNlX2Rydi5zZXEsIDApOwogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5mZW5jZV9kcnYuY3JlYXRlZCk7CiAJSU5JVF9MSVNUX0hFQUQoJnJkZXYtPmZlbmNlX2Rydi5lbWl0ZWQpOwpAQCAtMzkxLDcgKzQxMiw3IEBACiAJc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2U7CiAKIAlzZXFfcHJpbnRmKG0sICJMYXN0IHNpZ25hbGVkIGZlbmNlIDB4JTA4WFxuIiwKLQkJICAgUlJFRzMyKHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZykpOworCQkgICByYWRlb25fZmVuY2VfcmVhZChyZGV2KSk7CiAJaWYgKCFsaXN0X2VtcHR5KCZyZGV2LT5mZW5jZV9kcnYuZW1pdGVkKSkgewogCQkgICBmZW5jZSA9IGxpc3RfZW50cnkocmRldi0+ZmVuY2VfZHJ2LmVtaXRlZC5wcmV2LAogCQkJCSAgICAgIHN0cnVjdCByYWRlb25fZmVuY2UsIGxpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tZW0uYwppbmRleCBlZDk1MTU1Li45ODg1NDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tZW0uYwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJaWYgKCFibG9ja3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JKmhlYXAgPSBrbWFsbG9jKHNpemVvZigqKmhlYXApLCBHRlBfS0VSTkVMKTsKKwkqaGVhcCA9IGt6YWxsb2Moc2l6ZW9mKCoqaGVhcCksIEdGUF9LRVJORUwpOwogCWlmICghKmhlYXApIHsKIAkJa2ZyZWUoYmxvY2tzKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNTAsNyArMTUwLDYgQEAKIAlibG9ja3MtPmZpbGVfcHJpdiA9IE5VTEw7CiAJYmxvY2tzLT5uZXh0ID0gYmxvY2tzLT5wcmV2ID0gKmhlYXA7CiAKLQltZW1zZXQoKmhlYXAsIDAsIHNpemVvZigqKmhlYXApKTsKIAkoKmhlYXApLT5maWxlX3ByaXYgPSAoc3RydWN0IGRybV9maWxlICopIC0gMTsKIAkoKmhlYXApLT5uZXh0ID0gKCpoZWFwKS0+cHJldiA9IGJsb2NrczsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaAppbmRleCA5NzdhMzQxLi42ZGY0ZTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oCkBAIC00ODMsNiArNDgzLDggQEAKIGV4dGVybiB2b2lkIGF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCiAJCQkJCSAgIGludCBhY3Rpb24sIHVpbnQ4X3QgbGFuZV9udW0sCiAJCQkJCSAgIHVpbnQ4X3QgbGFuZV9zZXQpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2F0b21fZXh0X2VuY29kZXJfc2V0dXBfZGRjKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CitleHRlcm4gc3RydWN0IGRybV9lbmNvZGVyICpyYWRlb25fYXRvbV9nZXRfZXh0ZXJuYWxfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogZXh0ZXJuIGludCByYWRlb25fZHBfaTJjX2F1eF9jaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBtb2RlLAogCQkJCXU4IHdyaXRlX2J5dGUsIHU4ICpyZWFkX2J5dGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYwppbmRleCA4NmVkYTFlLi5hYWExOWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKQEAgLTQ4Nyw2ICs0ODcsNyBAQAogCWNhc2UgVEhFUk1BTF9UWVBFX1JWNlhYOgogCWNhc2UgVEhFUk1BTF9UWVBFX1JWNzcwOgogCWNhc2UgVEhFUk1BTF9UWVBFX0VWRVJHUkVFTjoKKwljYXNlIFRIRVJNQUxfVFlQRV9OSToKIAljYXNlIFRIRVJNQUxfVFlQRV9TVU1POgogCQlyZGV2LT5wbS5pbnRfaHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKHJkZXYtPmRldik7CiAJCWlmIChJU19FUlIocmRldi0+cG0uaW50X2h3bW9uX2RldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKaW5kZXggZWM5M2E3NS4uYmM0NGEzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKQEAgLTMwMCw2ICszMDAsOCBAQAogIyAgICAgICBkZWZpbmUgUkFERU9OX0JVU19SRUFEX0JVUlNUICAgICAgICAgKDEgPDwgMzApCiAjZGVmaW5lIFJBREVPTl9CVVNfQ05UTDEgICAgICAgICAgICAgICAgICAgIDB4MDAzNAogIyAgICAgICBkZWZpbmUgUkFERU9OX0JVU19XQUlUX09OX0xPQ0tfRU4gICAgKDEgPDwgNCkKKyNkZWZpbmUgUlYzNzBfQlVTX0NOVEwgICAgICAgICAgICAgICAgICAgICAgMHgwMDRjCisjICAgICAgIGRlZmluZSBSVjM3MF9CVVNfQklPU19ESVNfUk9NICAgICAgICAoMSA8PCAyKQogLyogcnYzNzAvcnYzODAsIHJ2NDEwLCByNDIzL3I0MzAvcjQ4MCwgcjV4eCAqLwogI2RlZmluZSBSQURFT05fTVNJX1JFQVJNX0VOCQkgICAgMHgwMTYwCiAjCWRlZmluZSBSVjM3MF9NU0lfUkVBUk1fRU4JICAgICAoMSA8PCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9yNjAwIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9yNjAwCmluZGV4IDkyZjE5MDAuLmVhNDk3NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmVnX3NyY3MvcjYwMAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3I2MDAKQEAgLTc1OCw2ICs3NTgsNSBAQAogMHgwMDAwOTcxNCBWQ19FTkhBTkNFCiAweDAwMDA5ODMwIERCX0RFQlVHCiAweDAwMDA5ODM4IERCX1dBVEVSTUFSS1MKLTB4MDAwMjhEMjggREJfU1JFU1VMVFNfQ09NUEFSRV9TVEFURTAKIDB4MDAwMjhENDQgREJfQUxQSEFfVE9fTUFTSwogMHgwMDAwOTcwMCBWQ19DTlRMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKaW5kZXggNmUzYjExZS4uMWY1ODUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYwpAQCAtNDI2LDcgKzQyNiw3IEBACiAJcmV0dXJuIHJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fYWxsb2MocmRldik7CiB9CiAKLWludCByczYwMF9nYXJ0X2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3N0YXRpYyBpbnQgcnM2MDBfZ2FydF9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIHRtcDsKIAlpbnQgciwgaTsKQEAgLTQ0MCw4ICs0NDAsOCBAQAogCQlyZXR1cm4gcjsKIAlyYWRlb25fZ2FydF9yZXN0b3JlKHJkZXYpOwogCS8qIEVuYWJsZSBidXMgbWFzdGVyICovCi0JdG1wID0gUlJFRzMyKFJfMDAwMDRDX0JVU19DTlRMKSAmIENfMDAwMDRDX0JVU19NQVNURVJfRElTOwotCVdSRUczMihSXzAwMDA0Q19CVVNfQ05UTCwgdG1wKTsKKwl0bXAgPSBSUkVHMzIoUkFERU9OX0JVU19DTlRMKSAmIH5SUzYwMF9CVVNfTUFTVEVSX0RJUzsKKwlXUkVHMzIoUkFERU9OX0JVU19DTlRMLCB0bXApOwogCS8qIEZJWE1FOiBzZXR1cCBkZWZhdWx0IHBhZ2UgKi8KIAlXUkVHMzJfTUMoUl8wMDAxMDBfTUNfUFQwX0NOVEwsCiAJCSAgKFNfMDAwMTAwX0VGRkVDVElWRV9MMl9DQUNIRV9TSVpFKDYpIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwppbmRleCBlZjhhNWJhLi40ZGU1MTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCkBAIC0xMDUsNiArMTA1LDkgQEAKIAlzdHJ1Y3QgcmFkZW9uX3ZvbHRhZ2UgKnZvbHRhZ2UgPSAmcHMtPmNsb2NrX2luZm9bcmVxX2NtX2lkeF0udm9sdGFnZTsKIAogCWlmICgodm9sdGFnZS0+dHlwZSA9PSBWT0xUQUdFX1NXKSAmJiB2b2x0YWdlLT52b2x0YWdlKSB7CisJCS8qIDB4ZmYwMSBpcyBhIGZsYWcgcmF0aGVyIHRoZW4gYW4gYWN0dWFsIHZvbHRhZ2UgKi8KKwkJaWYgKHZvbHRhZ2UtPnZvbHRhZ2UgPT0gMHhmZjAxKQorCQkJcmV0dXJuOwogCQlpZiAodm9sdGFnZS0+dm9sdGFnZSAhPSByZGV2LT5wbS5jdXJyZW50X3ZkZGMpIHsKIAkJCXJhZGVvbl9hdG9tX3NldF92b2x0YWdlKHJkZXYsIHZvbHRhZ2UtPnZvbHRhZ2UsIFNFVF9WT0xUQUdFX1RZUEVfQVNJQ19WRERDKTsKIAkJCXJkZXYtPnBtLmN1cnJlbnRfdmRkYyA9IHZvbHRhZ2UtPnZvbHRhZ2U7CkBAIC01NzIsNiArNTc1LDEyIEBACiAJZWxzZQogCQl0Y3BfY2hhbl9zdGVlciA9IDB4MDBmYWM2ODg7CiAKKwkvKiBSVjc3MCBDRSBoYXMgc3BlY2lhbCBjaHJlbWFwIHNldHVwICovCisJaWYgKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDk0NGUpIHsKKwkJdGNwX2NoYW5fc3RlZXIgPSAweDAwYjA4YjA4OworCQltY19zaGFyZWRfY2hyZW1hcCA9IDB4MDBiMDhiMDg7CisJfQorCiAJV1JFRzMyKFRDUF9DSEFOX1NURUVSLCB0Y3BfY2hhbl9zdGVlcik7CiAJV1JFRzMyKE1DX1NIQVJFRF9DSFJFTUFQLCBtY19zaGFyZWRfY2hyZW1hcCk7CiB9CkBAIC0xMzU5LDYgKzEzNjgsNyBAQAogCXI3MDBfY3BfZmluaShyZGV2KTsKIAlyNjAwX2lycV9maW5pKHJkZXYpOwogCXJhZGVvbl93Yl9maW5pKHJkZXYpOworCXJhZGVvbl9pYl9wb29sX2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAlydjc3MF9wY2llX2dhcnRfZmluaShyZGV2KTsKIAlydjc3MF92cmFtX3NjcmF0Y2hfZmluaShyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zYXZhZ2Uvc2F2YWdlX2JjaS5jIGIvZHJpdmVycy9ncHUvZHJtL3NhdmFnZS9zYXZhZ2VfYmNpLmMKaW5kZXggYmY1ZjgzZS4uY2IxZWU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3NhdmFnZS9zYXZhZ2VfYmNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3NhdmFnZS9zYXZhZ2VfYmNpLmMKQEAgLTY0Nyw5ICs2NDcsNiBAQAogCXJldCA9IGRybV9hZGRtYXAoZGV2LCBhcGVydHVyZV9iYXNlLCBTQVZBR0VfQVBFUlRVUkVfU0laRSwKIAkJCSBfRFJNX0ZSQU1FX0JVRkZFUiwgX0RSTV9XUklURV9DT01CSU5JTkcsCiAJCQkgJmRldl9wcml2LT5hcGVydHVyZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zaXMvc2lzX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfZHJ2LmgKaW5kZXggZWY5NDBiYS4uMTk0MzAzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfZHJ2LmgKQEAgLTQ4LDggKzQ4LDggQEAKIAogCiAjZGVmaW5lIFNJU19CQVNFIChkZXZfcHJpdi0+bW1pbykKLSNkZWZpbmUgU0lTX1JFQUQocmVnKSAgICAgICAgIERSTV9SRUFEMzIoU0lTX0JBU0UsIHJlZyk7Ci0jZGVmaW5lIFNJU19XUklURShyZWcsIHZhbCkgICBEUk1fV1JJVEUzMihTSVNfQkFTRSwgcmVnLCB2YWwpOworI2RlZmluZSBTSVNfUkVBRChyZWcpICAgICAgICAgRFJNX1JFQUQzMihTSVNfQkFTRSwgcmVnKQorI2RlZmluZSBTSVNfV1JJVEUocmVnLCB2YWwpICAgRFJNX1dSSVRFMzIoU0lTX0JBU0UsIHJlZywgdmFsKQogCiB0eXBlZGVmIHN0cnVjdCBkcm1fc2lzX3ByaXZhdGUgewogCWRybV9sb2NhbF9tYXBfdCAqbW1pbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jCmluZGV4IDkwZTIzZTAuLjU4YzI3MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fdHQuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDg0LDcgKzQ4NSw3IEBACiAJc3dhcF9zcGFjZSA9IHN3YXBfc3RvcmFnZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOwogCiAJZm9yIChpID0gMDsgaSA8IHR0bS0+bnVtX3BhZ2VzOyArK2kpIHsKLQkJZnJvbV9wYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2Uoc3dhcF9zcGFjZSwgaSwgTlVMTCk7CisJCWZyb21fcGFnZSA9IHNobWVtX3JlYWRfbWFwcGluZ19wYWdlKHN3YXBfc3BhY2UsIGkpOwogCQlpZiAoSVNfRVJSKGZyb21fcGFnZSkpIHsKIAkJCXJldCA9IFBUUl9FUlIoZnJvbV9wYWdlKTsKIAkJCWdvdG8gb3V0X2VycjsKQEAgLTU1Nyw3ICs1NTgsNyBAQAogCQlmcm9tX3BhZ2UgPSB0dG0tPnBhZ2VzW2ldOwogCQlpZiAodW5saWtlbHkoZnJvbV9wYWdlID09IE5VTEwpKQogCQkJY29udGludWU7Ci0JCXRvX3BhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShzd2FwX3NwYWNlLCBpLCBOVUxMKTsKKwkJdG9fcGFnZSA9IHNobWVtX3JlYWRfbWFwcGluZ19wYWdlKHN3YXBfc3BhY2UsIGkpOwogCQlpZiAodW5saWtlbHkoSVNfRVJSKHRvX3BhZ2UpKSkgewogCQkJcmV0ID0gUFRSX0VSUih0b19wYWdlKTsKIAkJCWdvdG8gb3V0X2VycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X292ZXJsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X292ZXJsYXkuYwppbmRleCBmMWE1MmY5Li4wN2NlMDJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9vdmVybGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfb3ZlcmxheS5jCkBAIC01ODUsMTEgKzU4NSwxMCBAQAogCQlyZXR1cm4gLUVOT1NZUzsKIAl9CiAKLQlvdmVybGF5ID0ga21hbGxvYyhzaXplb2YoKm92ZXJsYXkpLCBHRlBfS0VSTkVMKTsKKwlvdmVybGF5ID0ga3phbGxvYyhzaXplb2YoKm92ZXJsYXkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW92ZXJsYXkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtc2V0KG92ZXJsYXksIDAsIHNpemVvZigqb3ZlcmxheSkpOwogCW11dGV4X2luaXQoJm92ZXJsYXktPm11dGV4KTsKIAlmb3IgKGkgPSAwOyBpIDwgVk1XX01BWF9OVU1fU1RSRUFNUzsgaSsrKSB7CiAJCW92ZXJsYXktPnN0cmVhbVtpXS5idWYgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfcmVzb3VyY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3Jlc291cmNlLmMKaW5kZXggNTQwOGIxYi4uYmZlMWJjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfcmVzb3VyY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9yZXNvdXJjZS5jCkBAIC02MTIsMTEgKzYxMiw5IEBACiAJICAgIHNyZi0+c2l6ZXNbMF0uaGVpZ2h0ID09IDY0ICYmCiAJICAgIHNyZi0+Zm9ybWF0ID09IFNWR0EzRF9BOFI4RzhCOCkgewogCi0JCXNyZi0+c25vb3Blci5pbWFnZSA9IGttYWxsb2MoNjQgKiA2NCAqIDQsIEdGUF9LRVJORUwpOwotCQkvKiBjbGVhciB0aGUgaW1hZ2UgKi8KLQkJaWYgKHNyZi0+c25vb3Blci5pbWFnZSkgewotCQkJbWVtc2V0KHNyZi0+c25vb3Blci5pbWFnZSwgMHgwMCwgNjQgKiA2NCAqIDQpOwotCQl9IGVsc2UgeworCQkvKiBhbGxvY2F0ZSBpbWFnZSBhcmVhIGFuZCBjbGVhciBpdCAqLworCQlzcmYtPnNub29wZXIuaW1hZ2UgPSBremFsbG9jKDY0ICogNjQgKiA0LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzcmYtPnNub29wZXIuaW1hZ2UpIHsKIAkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGN1cnNvcl9pbWFnZVxuIik7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBvdXRfZXJyMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L3ZnYS92Z2FhcmIuYyBiL2RyaXZlcnMvZ3B1L3ZnYS92Z2FhcmIuYwppbmRleCA4YTEwMjFmLi5jNzJmMWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS92Z2EvdmdhYXJiLmMKKysrIGIvZHJpdmVycy9ncHUvdmdhL3ZnYWFyYi5jCkBAIC0xMTcxLDEwICsxMTcxLDkgQEAKIAogCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwogCi0JcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2Z2FfYXJiX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAocHJpdiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IHByaXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL0tjb25maWcgYi9kcml2ZXJzL2hpZC9LY29uZmlnCmluZGV4IDY3ZDJhNzUuLjMwNmIxNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL0tjb25maWcKKysrIGIvZHJpdmVycy9oaWQvS2NvbmZpZwpAQCAtMTcyLDYgKzE3MiwyMCBAQAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBFemtleSBCVEMgODE5MyBrZXlib2FyZC4KIAorY29uZmlnIEhJRF9IT0xURUsKKwl0cmlzdGF0ZSAiSG9sdGVrIE9uIExpbmUgR3JpcCBiYXNlZCBnYW1lIGNvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgSG9sdGVrIE9uIExpbmUgR3JpcCBiYXNlZCBnYW1lIGNvbnRyb2xsZXIuCisKK2NvbmZpZyBIT0xURUtfRkYKKwlib29sICJIb2x0ZWsgT24gTGluZSBHcmlwIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBISURfSE9MVEVLCisJc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgSG9sdGVrIE9uIExpbmUgR3JpcCBiYXNlZCBnYW1lIGNvbnRyb2xsZXIKKwkgIGFuZCB3YW50IHRvIGhhdmUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgaXQuCisKIGNvbmZpZyBISURfS0VZVE9VQ0gKIAl0cmlzdGF0ZSAiS2V5dG91Y2ggSElEIGRldmljZXMiCiAJZGVwZW5kcyBvbiBVU0JfSElECkBAIC0zMDUsNiArMzE5LDcgQEAKIAkgIC0gM00gUENUIHRvdWNoIHNjcmVlbnMKIAkgIC0gQWN0aW9uU3RhciBkdWFsIHRvdWNoIHBhbmVscwogCSAgLSBDYW5kbyBkdWFsIHRvdWNoIHBhbmVscworCSAgLSBDaHVuZ2h3YSBwYW5lbHMKIAkgIC0gQ1ZUb3VjaCBwYW5lbHMKIAkgIC0gQ3lwcmVzcyBUcnVlVG91Y2ggcGFuZWxzCiAJICAtIEVsbyBUb3VjaFN5c3RlbXMgSW50ZWxsaVRvdWNoIFBsdXMgcGFuZWxzCkBAIC0zMjEsNiArMzM2LDcgQEAKIAkgIC0gU3RhbnR1bSBtdWx0aXRvdWNoIHBhbmVscwogCSAgLSBUb3VjaCBJbnRlcm5hdGlvbmFsIFBhbmVscwogCSAgLSBVbml0ZWMgUGFuZWxzCisJICAtIFhBVCBvcHRpY2FsIHRvdWNoIHBhbmVscwogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCkBAIC00MzQsNiArNDUwLDcgQEAKIGNvbmZpZyBISURfUk9DQ0FUCiAJdHJpc3RhdGUgIlJvY2NhdCBzcGVjaWFsIGV2ZW50IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0JfSElECisJc2VsZWN0IEhJRF9ST0NDQVRfQ09NTU9OCiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIFJvY2NhdCBzcGVjaWFsIGV2ZW50cy4KIAlTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgUm9jY2F0IG1vdXNlIG9yIGtleWJvYXJkIGFuZCB3YW50IE9TRCBvcgpAQCAtNDQxLDQ0ICs0NTgsNDAgQEAKIAogY29uZmlnIEhJRF9ST0NDQVRfQ09NTU9OCiAJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIEhJRF9ST0NDQVQKIAogY29uZmlnIEhJRF9ST0NDQVRfQVJWTwogCXRyaXN0YXRlICJSb2NjYXQgQXJ2byBrZXlib2FyZCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCX0hJRAotCXNlbGVjdCBISURfUk9DQ0FUCi0Jc2VsZWN0IEhJRF9ST0NDQVRfQ09NTU9OCisJZGVwZW5kcyBvbiBISURfUk9DQ0FUCiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIFJvY2NhdCBBcnZvIGtleWJvYXJkLgogCiBjb25maWcgSElEX1JPQ0NBVF9LT05FCiAJdHJpc3RhdGUgIlJvY2NhdCBLb25lIE1vdXNlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0JfSElECi0Jc2VsZWN0IEhJRF9ST0NDQVQKLQlzZWxlY3QgSElEX1JPQ0NBVF9DT01NT04KKwlkZXBlbmRzIG9uIEhJRF9ST0NDQVQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgUm9jY2F0IEtvbmUgbW91c2UuCiAKIGNvbmZpZyBISURfUk9DQ0FUX0tPTkVQTFVTCiAJdHJpc3RhdGUgIlJvY2NhdCBLb25lWytdIG1vdXNlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0JfSElECi0Jc2VsZWN0IEhJRF9ST0NDQVQKLQlzZWxlY3QgSElEX1JPQ0NBVF9DT01NT04KKwlkZXBlbmRzIG9uIEhJRF9ST0NDQVQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgUm9jY2F0IEtvbmVbK10gbW91c2UuCiAKIGNvbmZpZyBISURfUk9DQ0FUX0tPVkFQTFVTCiAJdHJpc3RhdGUgIlJvY2NhdCBLb3ZhWytdIG1vdXNlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0JfSElECi0Jc2VsZWN0IEhJRF9ST0NDQVQKLQlzZWxlY3QgSElEX1JPQ0NBVF9DT01NT04KKwlkZXBlbmRzIG9uIEhJRF9ST0NDQVQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgUm9jY2F0IEtvdmFbK10gbW91c2UuCiAKIGNvbmZpZyBISURfUk9DQ0FUX1BZUkEKIAl0cmlzdGF0ZSAiUm9jY2F0IFB5cmEgbW91c2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9ISUQKLQlzZWxlY3QgSElEX1JPQ0NBVAotCXNlbGVjdCBISURfUk9DQ0FUX0NPTU1PTgorCWRlcGVuZHMgb24gSElEX1JPQ0NBVAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBSb2NjYXQgUHlyYSBtb3VzZS4KIApAQCAtNDk0LDYgKzUwNywxMiBAQAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBTb255IFBTMyBjb250cm9sbGVyLgogCitjb25maWcgSElEX1NQRUVETElOSworCXRyaXN0YXRlICJTcGVlZGxpbmsgVkFEIENlemFubmUgbW91c2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgU3BlZWRsaW5rIFZpY2lvdXMgYW5kIERpdmluZSBDZXphbm5lIG1vdXNlLgorCiBjb25maWcgSElEX1NVTlBMVVMKIAl0cmlzdGF0ZSAiU3VucGx1cyB3aXJlbGVzcyBkZXNrdG9wIgogCWRlcGVuZHMgb24gVVNCX0hJRApAQCAtNTY3LDYgKzU4NiwxMiBAQAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgcG93ZXIgc3VwcGx5IHN0YXR1cyBtb25pdG9yaW5nIGZvcgogCSAgV2Fjb20gQmx1ZXRvb3RoIGRldmljZXMuCiAKK2NvbmZpZyBISURfV0lJTU9URQorCXRyaXN0YXRlICJOaW50ZW5kbyBXaWkgUmVtb3RlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCVF9ISURQCisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIHRoZSBOaW50ZW5kbyBXaWkgUmVtb3RlIGJsdWV0b290aCBkZXZpY2UuCisKIGNvbmZpZyBISURfWkVST1BMVVMKIAl0cmlzdGF0ZSAiWmVyb3BsdXMgYmFzZWQgZ2FtZSBjb250cm9sbGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0JfSElECmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9NYWtlZmlsZSBiL2RyaXZlcnMvaGlkL01ha2VmaWxlCmluZGV4IGY4Y2M0ZWEuLjBhMGEzOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaGlkL01ha2VmaWxlCkBAIC0zNyw2ICszNyw3IEBACiBvYmotJChDT05GSUdfSElEX0VMRUNPTSkJKz0gaGlkLWVsZWNvbS5vCiBvYmotJChDT05GSUdfSElEX0VaS0VZKQkJKz0gaGlkLWV6a2V5Lm8KIG9iai0kKENPTkZJR19ISURfR1lSQVRJT04pCSs9IGhpZC1neXJhdGlvbi5vCitvYmotJChDT05GSUdfSElEX0hPTFRFSykJKz0gaGlkLWhvbHRla2ZmLm8KIG9iai0kKENPTkZJR19ISURfS0VOU0lOR1RPTikJKz0gaGlkLWtlbnNpbmd0b24ubwogb2JqLSQoQ09ORklHX0hJRF9LRVlUT1VDSCkJKz0gaGlkLWtleXRvdWNoLm8KIG9iai0kKENPTkZJR19ISURfS1lFKQkJKz0gaGlkLWt5ZS5vCkBAIC02Myw2ICs2NCw3IEBACiBvYmotJChDT05GSUdfSElEX1NBTVNVTkcpCSs9IGhpZC1zYW1zdW5nLm8KIG9iai0kKENPTkZJR19ISURfU01BUlRKT1lQTFVTKQkrPSBoaWQtc2pveS5vCiBvYmotJChDT05GSUdfSElEX1NPTlkpCQkrPSBoaWQtc29ueS5vCitvYmotJChDT05GSUdfSElEX1NQRUVETElOSykJKz0gaGlkLXNwZWVkbGluay5vCiBvYmotJChDT05GSUdfSElEX1NVTlBMVVMpCSs9IGhpZC1zdW5wbHVzLm8KIG9iai0kKENPTkZJR19ISURfR1JFRU5BU0lBKQkrPSBoaWQtZ2FmZi5vCiBvYmotJChDT05GSUdfSElEX1RIUlVTVE1BU1RFUikJKz0gaGlkLXRtZmYubwpAQCAtNzMsNiArNzUsNyBAQAogb2JqLSQoQ09ORklHX0hJRF9aWURBQ1JPTikJKz0gaGlkLXp5ZGFjcm9uLm8KIG9iai0kKENPTkZJR19ISURfV0FDT00pCQkrPSBoaWQtd2Fjb20ubwogb2JqLSQoQ09ORklHX0hJRF9XQUxUT1ApCSs9IGhpZC13YWx0b3Aubworb2JqLSQoQ09ORklHX0hJRF9XSUlNT1RFKQkrPSBoaWQtd2lpbW90ZS5vCiAKIG9iai0kKENPTkZJR19VU0JfSElEKQkJKz0gdXNiaGlkLwogb2JqLSQoQ09ORklHX1VTQl9NT1VTRSkJCSs9IHVzYmhpZC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1heGZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtYXhmZi5jCmluZGV4IGI0NTU0MjguLjEyMTUxNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1heGZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWF4ZmYuYwpAQCAtMTU0LDYgKzE1NCw3IEBACiAJZXJyb3IgPSBoaWRfaHdfb3BlbihoZGV2KTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgb3BlbiBmYWlsZWRcbiIpOworCQloaWRfaHdfc3RvcChoZGV2KTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKaW5kZXggYzk1N2M0Yi4uMWE1Y2YwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCkBAIC0xMzU5LDYgKzEzNTksNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSEVSUlksIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OX1NPTEFSKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfVEFDVElDQUxfUEFEKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfV0lSRUxFU1MpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NIVU5HSFdBVCwgVVNCX0RFVklDRV9JRF9DSFVOR0hXQVRfTVVMVElUT1VDSCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ1JFQVRJVkVMQUJTLCBVU0JfREVWSUNFX0lEX1BST0RJS0VZU19QQ01JREkpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NWVE9VQ0gsIFVTQl9ERVZJQ0VfSURfQ1ZUT1VDSF9TQ1JFRU4pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzEpIH0sCkBAIC0xMzg3LDYgKzEzODgsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HWVJBVElPTiwgVVNCX0RFVklDRV9JRF9HWVJBVElPTl9SRU1PVEVfMikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1lSQVRJT04sIFVTQl9ERVZJQ0VfSURfR1lSQVRJT05fUkVNT1RFXzMpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0hBTlZPTiwgVVNCX0RFVklDRV9JRF9IQU5WT05fTVVMVElUT1VDSCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfSE9MVEVLLCBVU0JfREVWSUNFX0lEX0hPTFRFS19PTl9MSU5FX0dSSVApIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0lMSVRFSywgVVNCX0RFVklDRV9JRF9JTElURUtfTVVMVElUT1VDSCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfSVJUT1VDSFNZU1RFTVMsIFVTQl9ERVZJQ0VfSURfSVJUT1VDSF9JTkZSQVJFRF9VU0IpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tFTlNJTkdUT04sIFVTQl9ERVZJQ0VfSURfS1NfU0xJTUJMQURFKSB9LApAQCAtMTQyMiwxMiArMTQyNCwxNSBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9TUEFDRVRSQVZFTExFUikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfU1BBQ0VOQVZJR0FUT1IpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xVTUlPLCBVU0JfREVWSUNFX0lEX0NSWVNUQUxUT1VDSCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTFVNSU8sIFVTQl9ERVZJQ0VfSURfQ1JZU1RBTFRPVUNIX0RVQUwpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPQ0hJUCwgVVNCX0RFVklDRV9JRF9QSUNPTENEKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST0NISVAsIFVTQl9ERVZJQ0VfSURfUElDT0xDRF9CT09UTE9BREVSKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfQ09NRk9SVF9NT1VTRV80NTAwKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfU0lERVdJTkRFUl9HVikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX05FNEspIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19MSzZLKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX1VTQikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX0RJR0lUQUxfTUVESUFfM0spIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9XSVJFTEVTU19PUFRJQ0FMX0RFU0tUT1BfM18wKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NT05URVJFWSwgVVNCX0RFVklDRV9JRF9HRU5JVVNfS0IyOUUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX05UUklHLCBVU0JfREVWSUNFX0lEX05UUklHX1RPVUNIX1NDUkVFTikgfSwKQEAgLTE0ODksNiArMTQ5NCw3IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfV1A0MDMwVSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9XUDU1NDBVKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9VQ0xPR0lDLCBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1dQODA2MFUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfV1AxMDYyKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9VTklURUMsIFVTQl9ERVZJQ0VfSURfVU5JVEVDX1VTQl9UT1VDSF8wNzA5KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9VTklURUMsIFVTQl9ERVZJQ0VfSURfVU5JVEVDX1VTQl9UT1VDSF8wQTE5KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfU01BUlRKT1lfUExVUykgfSwKQEAgLTE0OTcsMTEgKzE1MDMsMTQgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FMVE9QLCBVU0JfREVWSUNFX0lEX1dBTFRPUF9TTElNX1RBQkxFVF8xMl8xX0lOQ0gpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBTFRPUCwgVVNCX0RFVklDRV9JRF9XQUxUT1BfTUVESUFfVEFCTEVUXzEwXzZfSU5DSCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FMVE9QLCBVU0JfREVWSUNFX0lEX1dBTFRPUF9NRURJQV9UQUJMRVRfMTRfMV9JTkNIKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9YQVQsIFVTQl9ERVZJQ0VfSURfWEFUX0NTUikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfWF9URU5TSU9OUywgVVNCX0RFVklDRV9JRF9TUEVFRExJTktfVkFEX0NFWkFOTkUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1pFUk9QTFVTLCAweDAwMDUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1pFUk9QTFVTLCAweDAwMzApIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1pZREFDUk9OLCBVU0JfREVWSUNFX0lEX1pZREFDUk9OX1JFTU9URV9DT05UUk9MKSB9LAogCiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19QUkVTRU5URVJfOEtfQlQpIH0sCisJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX05JTlRFTkRPLCBVU0JfREVWSUNFX0lEX05JTlRFTkRPX1dJSU1PVEUpIH0sCiAJeyB9CiB9OwogCkBAIC0xNzY5LDcgKzE3NzgsNiBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDcpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0lNQVRJT04sIFVTQl9ERVZJQ0VfSURfRElTQ19TVEFLS0EpIH0sCi0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0pFU1MsIFVTQl9ERVZJQ0VfSURfSkVTU19ZVVJFWCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfS0JHRUFSLCBVU0JfREVWSUNFX0lEX0tCR0VBUl9KQU1TVFVESU8pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tXT1JMRCwgVVNCX0RFVklDRV9JRF9LV09STERfUkFESU9fRk03MDApIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tZRSwgVVNCX0RFVklDRV9JRF9LWUVfR1BFTl81NjApIH0sCkBAIC0xOTEwLDYgKzE5MTgsMTEgQEAKIAkJICAgIGhkZXYtPnByb2R1Y3QgPD0gVVNCX0RFVklDRV9JRF9IQU5XQU5HX1RBQkxFVF9MQVNUKQogCQkJcmV0dXJuIHRydWU7CiAJCWJyZWFrOworCWNhc2UgVVNCX1ZFTkRPUl9JRF9KRVNTOgorCQlpZiAoaGRldi0+cHJvZHVjdCA9PSBVU0JfREVWSUNFX0lEX0pFU1NfWVVSRVggJiYKKwkJCQloZGV2LT50eXBlID09IEhJRF9UWVBFX1VTQk5PTkUpCisJCQlyZXR1cm4gdHJ1ZTsKKwlicmVhazsKIAl9CiAKIAlpZiAoaGRldi0+dHlwZSA9PSBISURfVFlQRV9VU0JNT1VTRSAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWVtc2ZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtZW1zZmYuYwppbmRleCA4MTg3N2M2Li5hNWRjMTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZW1zZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtZW1zZmYuYwpAQCAtMTI2LDcgKzEyNiwxMiBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQllbXNmZl9pbml0KGhkZXYpOworCXJldCA9IGVtc2ZmX2luaXQoaGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJmb3JjZSBmZWVkYmFjayBpbml0IGZhaWxlZFxuIik7CisJCWhpZF9od19zdG9wKGhkZXYpOworCQlnb3RvIGVycjsKKwl9CiAKIAlyZXR1cm4gMDsKIGVycjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1ob2x0ZWtmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWhvbHRla2ZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlM2EwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1ob2x0ZWtmZi5jCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogIEZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIEhvbHRlayBPbiBMaW5lIEdyaXAgYmFzZWQgZ2FtZXBhZHMKKyAqCisgKiAgVGhlc2UgaW5jbHVkZSBhdCBsZWFzdCBhIEJyYXppbGlhbiAiQ2xvbmUgSm95cGFkIFN1cGVyIFBvd2VyIEZpcmUiCisgKiAgd2hpY2ggdXNlcyB2ZW5kb3IgSUQgMHgxMjQxIGFuZCBpZGVudGlmaWVzIGFzICJIT0xURUsgT24gTGluZSBHcmlwIi4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAaWtpLmZpPgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworI2lmZGVmIENPTkZJR19IT0xURUtfRkYKKyNpbmNsdWRlICJ1c2JoaWQvdXNiaGlkLmgiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAaWtpLmZpPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBIb2x0ZWsgT24gTGluZSBHcmlwIGJhc2VkIGRldmljZXMiKTsKKworLyoKKyAqIFRoZXNlIGNvbW1hbmRzIGFuZCBwYXJhbWV0ZXJzIGFyZSBjdXJyZW50bHkga25vd246CisgKgorICogYnl0ZSAwOiBjb21tYW5kIGlkOgorICogCTAxICBzZXQgZWZmZWN0IHBhcmFtZXRlcnMKKyAqIAkwMiAgcGxheSBzcGVjaWZpZWQgZWZmZWN0CisgKiAJMDMgIHN0b3Agc3BlY2lmaWVkIGVmZmVjdAorICogCTA0ICBzdG9wIGFsbCBlZmZlY3RzCisgKiAJMDYgIHN0b3AgYWxsIGVmZmVjdHMKKyAqIAkodGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAwNCBhbmQgMDYgaXNuJ3Qga25vd247IHdpbiBkcml2ZXIKKyAqIAkgc2VuZHMgMDYsMDQgb24gYXBwbGljYXRpb24gaW5pdCwgYW5kIDA2IG90aGVyd2lzZSkKKyAqIAorICogQ29tbWFuZHMgMDEgYW5kIDAyIG5lZWQgdG8gYmUgc2VudCBhcyBwYWlycywgaS5lLiB5b3UgbmVlZCB0byBzZW5kIDAxCisgKiBiZWZvcmUgZWFjaCAwMi4KKyAqCisgKiBUaGUgcmVzdCBvZiB0aGUgYnl0ZXMgYXJlIHBhcmFtZXRlcnMuIENvbW1hbmQgMDEgdGFrZXMgYWxsIG9mIHRoZW0sIGFuZAorICogY29tbWFuZHMgMDIsMDMgdGFrZSBvbmx5IHRoZSBlZmZlY3QgaWQuCisgKgorICogYnl0ZSAxOgorICoJYml0cyAwLTM6IGVmZmVjdCBpZDoKKyAqIAkJMTogdmVyeSBzdHJvbmcgcnVtYmxlCisgKiAJCTI6IHBlcmlvZGljIHJ1bWJsZSwgc2hvcnQgaW50ZXJ2YWxzCisgKiAJCTM6IHZlcnkgc3Ryb25nIHJ1bWJsZQorICogCQk0OiBwZXJpb2RpYyBydW1ibGUsIGxvbmcgaW50ZXJ2YWxzCisgKiAJCTU6IHdlYWsgcGVyaW9kaWMgcnVtYmxlLCBsb25nIGludGVydmFscworICogCQk2OiB3ZWFrIHBlcmlvZGljIHJ1bWJsZSwgc2hvcnQgaW50ZXJ2YWxzCisgKiAJCTc6IHBlcmlvZGljIHJ1bWJsZSwgc2hvcnQgaW50ZXJ2YWxzCisgKiAJCTg6IHN0cm9uZyBwZXJpb2RpYyBydW1ibGUsIHNob3J0IGludGVydmFscworICogCQk5OiB2ZXJ5IHN0cm9uZyBydW1ibGUKKyAqIAkJYTogY2F1c2VzIGFuIGVycm9yCisgKiAJCWI6IHZlcnkgc3Ryb25nIHBlcmlvZGljIHJ1bWJsZSwgdmVyeSBzaG9ydCBpbnRlcnZhbHMKKyAqIAkJYy1mOiBub3RoaW5nCisgKgliaXQgNjogcmlnaHQgKHdlYWspIG1vdG9yIGVuYWJsZWQKKyAqCWJpdCA3OiBsZWZ0IChzdHJvbmcpIG1vdG9yIGVuYWJsZWQKKyAqCisgKiBieXRlcyAyLTM6ICB0aW1lIGluIG1pbGxpc2Vjb25kcywgYmlnLWVuZGlhbgorICogYnl0ZXMgNS02OiAgdW5rbm93biAod2luIGRyaXZlciBzZWVtcyB0byB1c2UgYXQgbGVhc3QgMTBlMCB3aXRoIGVmZmVjdCAxCisgKiAJCSAgICAgICBhbmQgMDAxNCB3aXRoIGVmZmVjdCA2KQorICogYnl0ZSA3OgorICoJYml0cyAwLTM6IGVmZmVjdCBtYWduaXR1ZGUKKyAqLworCisjZGVmaW5lIEhPTFRFS0ZGX01TR19MRU5HVEggICAgIDcKKworc3RhdGljIGNvbnN0IHU4IHN0YXJ0X2VmZmVjdF8xW10gPSB7IDB4MDIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKK3N0YXRpYyBjb25zdCB1OCBzdG9wX2FsbDRbXSA9CSAgIHsgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9Oworc3RhdGljIGNvbnN0IHU4IHN0b3BfYWxsNltdID0JICAgeyAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKK3N0cnVjdCBob2x0ZWtmZl9kZXZpY2UgeworCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkOworfTsKKworc3RhdGljIHZvaWQgaG9sdGVrZmZfc2VuZChzdHJ1Y3QgaG9sdGVrZmZfZGV2aWNlICpob2x0ZWtmZiwKKwkJCSAgc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwKKwkJCSAgY29uc3QgdTggZGF0YVtIT0xURUtGRl9NU0dfTEVOR1RIXSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIT0xURUtGRl9NU0dfTEVOR1RIOyBpKyspIHsKKwkJaG9sdGVrZmYtPmZpZWxkLT52YWx1ZVtpXSA9IGRhdGFbaV07CisJfQorCisJZGJnX2hpZCgic2VuZGluZyAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBkYXRhWzBdLAorCQlkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLCBkYXRhWzRdLCBkYXRhWzVdLCBkYXRhWzZdKTsKKworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgaG9sdGVrZmYtPmZpZWxkLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKK30KKworc3RhdGljIGludCBob2x0ZWtmZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGhvbHRla2ZmX2RldmljZSAqaG9sdGVrZmYgPSBkYXRhOworCWludCBsZWZ0LCByaWdodDsKKwkvKiBlZmZlY3QgdHlwZSAxLCBsZW5ndGggNjU1MzUgbXNlYyAqLworCXU4IGJ1ZltIT0xURUtGRl9NU0dfTEVOR1RIXSA9CisJCXsgMHgwMSwgMHgwMSwgMHhmZiwgMHhmZiwgMHgxMCwgMHhlMCwgMHgwMCB9OworCisJbGVmdCA9IGVmZmVjdC0+dS5ydW1ibGUuc3Ryb25nX21hZ25pdHVkZTsKKwlyaWdodCA9IGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGU7CisJZGJnX2hpZCgiY2FsbGVkIHdpdGggMHglMDR4IDB4JTA0eFxuIiwgbGVmdCwgcmlnaHQpOworCisJaWYgKCFsZWZ0ICYmICFyaWdodCkgeworCQlob2x0ZWtmZl9zZW5kKGhvbHRla2ZmLCBoaWQsIHN0b3BfYWxsNik7CisJCXJldHVybiAwOworCX0KKworCWlmIChsZWZ0KQorCQlidWZbMV0gfD0gMHg4MDsKKwlpZiAocmlnaHQpCisJCWJ1ZlsxXSB8PSAweDQwOworCisJLyogVGhlIGRldmljZSB0YWtlcyBhIHNpbmdsZSBtYWduaXR1ZGUsIHNvIHdlIGp1c3Qgc3VtIHRoZW0gdXAuICovCisJYnVmWzZdID0gbWluKDB4ZiwgKGxlZnQgPj4gMTIpICsgKHJpZ2h0ID4+IDEyKSk7CisKKwlob2x0ZWtmZl9zZW5kKGhvbHRla2ZmLCBoaWQsIGJ1Zik7CisJaG9sdGVrZmZfc2VuZChob2x0ZWtmZiwgaGlkLCBzdGFydF9lZmZlY3RfMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBob2x0ZWtmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IGhvbHRla2ZmX2RldmljZSAqaG9sdGVrZmY7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoaGlkLT5pbnB1dHMubmV4dCwKKwkJCQkJCXN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0KKwkJCSZoaWQtPnJlcG9ydF9lbnVtW0hJRF9PVVRQVVRfUkVQT1JUXS5yZXBvcnRfbGlzdDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBoaWRpbnB1dC0+aW5wdXQ7CisJaW50IGVycm9yOworCisJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7CisJCWhpZF9lcnIoaGlkLCAibm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKKworCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSB8fCByZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgIT0gNykgeworCQloaWRfZXJyKGhpZCwgInVuZXhwZWN0ZWQgb3V0cHV0IHJlcG9ydCBsYXlvdXRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlob2x0ZWtmZiA9IGt6YWxsb2Moc2l6ZW9mKCpob2x0ZWtmZiksIEdGUF9LRVJORUwpOworCWlmICghaG9sdGVrZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJc2V0X2JpdChGRl9SVU1CTEUsIGRldi0+ZmZiaXQpOworCisJaG9sdGVrZmYtPmZpZWxkID0gcmVwb3J0LT5maWVsZFswXTsKKworCS8qIGluaXRpYWxpemUgdGhlIHNhbWUgd2F5IGFzIHdpbiBkcml2ZXIgZG9lcyAqLworCWhvbHRla2ZmX3NlbmQoaG9sdGVrZmYsIGhpZCwgc3RvcF9hbGw0KTsKKwlob2x0ZWtmZl9zZW5kKGhvbHRla2ZmLCBoaWQsIHN0b3BfYWxsNik7CisKKwllcnJvciA9IGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKGRldiwgaG9sdGVrZmYsIGhvbHRla2ZmX3BsYXkpOworCWlmIChlcnJvcikgeworCQlrZnJlZShob2x0ZWtmZik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwloaWRfaW5mbyhoaWQsICJGb3JjZSBmZWVkYmFjayBmb3IgSG9sdGVrIE9uIExpbmUgR3JpcCBiYXNlZCBkZXZpY2VzIGJ5IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAaWtpLmZpPlxuIik7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBob2x0ZWtmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBob2x0ZWtfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOworCWlmIChyZXQpIHsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJaG9sdGVrZmZfaW5pdChoZGV2KTsKKworCXJldHVybiAwOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBob2x0ZWtfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9IT0xURUssIFVTQl9ERVZJQ0VfSURfSE9MVEVLX09OX0xJTkVfR1JJUCkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgaG9sdGVrX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgaG9sdGVrX2RyaXZlciA9IHsKKwkubmFtZSA9ICJob2x0ZWsiLAorCS5pZF90YWJsZSA9IGhvbHRla19kZXZpY2VzLAorCS5wcm9iZSA9IGhvbHRla19wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGhvbHRla19pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmhvbHRla19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaG9sdGVrX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmhvbHRla19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChob2x0ZWtfaW5pdCk7Cittb2R1bGVfZXhpdChob2x0ZWtfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaCBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAppbmRleCAwYjM3NGE2Li5kYjYzY2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCkBAIC0xNzMsNiArMTczLDkgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DSElDT05ZX01VTFRJX1RPVUNICTB4YjE5ZAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NISUNPTllfV0lSRUxFU1MJMHgwNjE4CiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSFVOR0hXQVQJCTB4MjI0NworI2RlZmluZSBVU0JfREVWSUNFX0lEX0NIVU5HSFdBVF9NVUxUSVRPVUNICTB4MDAwMQorCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0lEQwkJMHgxNjc3CiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DTUVESUEJCTB4MGQ4YwpAQCAtMzQ3LDYgKzM1MCw5IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfSUxJVEVLCQkweDIyMmEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9JTElURUtfTVVMVElUT1VDSAkweDAwMDEKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX0hPTFRFSwkJMHgxMjQxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfSE9MVEVLX09OX0xJTkVfR1JJUAkweDUwMTUKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX0lNQVRJT04JCTB4MDcxOAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJU0NfU1RBS0tBCTB4ZDAwMAogCkBAIC00NDYsNiArNDUyLDcgQEAKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0xVTUlPCQkweDIwMmUKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DUllTVEFMVE9VQ0gJMHgwMDA2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1JZU1RBTFRPVUNIX0RVQUwJMHgwMDA3CiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NQ0MJCTB4MDlkYgogI2RlZmluZSBVU0JfREVWSUNFX0lEX01DQ19QTUQxMDI0TFMJMHgwMDc2CkBAIC00NjgsNiArNDc1LDggQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9NU19MSzZLCQkweDAwZjkKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9NU19QUkVTRU5URVJfOEtfQlQJMHgwNzAxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX1VTQgkweDA3MTMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9NU19ESUdJVEFMX01FRElBXzNLCTB4MDczMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX01TX0NPTUZPUlRfTU9VU0VfNDUwMAkweDA3NmMKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX01PSk8JCTB4ODI4MgogI2RlZmluZSBVU0JfREVWSUNFX0lEX1JFVFJPX0FEQVBURVIJMHgzMjAxCkBAIC00OTEsNiArNTAwLDkgQEAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ORVhUV0lORE9XCTB4MTkyNgogI2RlZmluZSBVU0JfREVWSUNFX0lEX05FWFRXSU5ET1dfVE9VQ0hTQ1JFRU4JMHgwMDAzCiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9OSU5URU5ETwkJMHgwNTdlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTklOVEVORE9fV0lJTU9URQkweDAzMDYKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX05UUklHCQkweDFiOTYKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9OVFJJR19UT1VDSF9TQ1JFRU4gICAweDAwMDEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9OVFJJR19UT1VDSF9TQ1JFRU5fMSAgIDB4MDAwMwpAQCAtNjIyLDkgKzYzNCwxMSBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1VDTE9HSUMJCTB4NTU0MwogI2RlZmluZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1BGMTIwOQkweDAwNDIKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9LTkE1CTB4NjAwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1RXQTYwCTB4MDA2NAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1dQNDAzMFUJMHgwMDAzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfV1A1NTQwVQkweDAwMDQKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9XUDgwNjBVCTB4MDAwNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1dQMTA2MgkweDAwNjQKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1VOSVRFQwkweDIyN2QKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9VTklURUNfVVNCX1RPVUNIXzA3MDkJMHgwNzA5CkBAIC02NTgsNiArNjcyLDEyIEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfV0lTRUdST1VQX0xURDIJMHg2Njc3CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU01BUlRKT1lfRFVBTF9QTFVTIDB4ODgwMgogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfWF9URU5TSU9OUyAgICAgICAgICAgICAgIDB4MWFlNworI2RlZmluZSBVU0JfREVWSUNFX0lEX1NQRUVETElOS19WQURfQ0VaQU5ORSAgICAweDkwMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1hBVAkweDI1MDUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9YQVRfQ1NSCTB4MDIyMAorCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfWUVBTElOSwkJMHg2OTkzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfWUVBTElOS19QMUtfUDRLX0IySwkweGIwMDEKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwppbmRleCAyMWYyMDVmLi5hN2Y5MTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwpAQCAtNDEsNiArNDEsNjYgQEAKICNkZWZpbmUgTEdfRkYzCQkJMHgxMDAwCiAjZGVmaW5lIExHX0ZGNAkJCTB4MjAwMAogCisvKiBTaXplIG9mIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yIG9mIHRoZSBEcml2aW5nIEZvcmNlIFBybyB3aGVlbCAqLworI2RlZmluZSBERlBfUkRFU0NfT1JJR19TSVpFCTk3CisKKy8qIEZpeGVkIHJlcG9ydCBkZXNjcmlwdG9yIGZvciBMb2dpdGVjaCBEcml2aW5nIEZvcmNlIFBybyB3aGVlbCBjb250cm9sbGVyCisgKgorICogVGhlIG9yaWdpbmFsIGRlc2NyaXB0b3IgaGlkZXMgdGhlIHNlcGFyYXRlIHRocm90dGxlIGFuZCBicmFrZSBheGVzIGluCisgKiBhIGN1c3RvbSB2ZW5kb3IgdXNhZ2UgcGFnZSwgcHJvdmlkaW5nIG9ubHkgYSBjb21iaW5lZCB2YWx1ZSBhcworICogR2VuZXJpY0Rlc2t0b3AuWS4KKyAqIFRoaXMgZGVzY3JpcHRvciByZW1vdmVzIHRoZSBjb21iaW5lZCBZIGF4aXMgYW5kIGluc3RlYWQgcmVwb3J0cworICogc2VwYXJhdGUgdGhyb3R0bGUgKFkpIGFuZCBicmFrZSAoUlopLgorICovCitzdGF0aWMgX191OCBkZnBfcmRlc2NfZml4ZWRbXSA9IHsKKzB4MDUsIDB4MDEsICAgICAgICAgLyogIFVzYWdlIFBhZ2UgKERlc2t0b3ApLCAgICAgICAgICAgICAgICAgICAqLworMHgwOSwgMHgwNCwgICAgICAgICAvKiAgVXNhZ2UgKEpveXN0aWspLCAgICAgICAgICAgICAgICAgICAgICAgICovCisweEExLCAweDAxLCAgICAgICAgIC8qICBDb2xsZWN0aW9uIChBcHBsaWNhdGlvbiksICAgICAgICAgICAgICAgKi8KKzB4QTEsIDB4MDIsICAgICAgICAgLyogICAgICBDb2xsZWN0aW9uIChMb2dpY2FsKSwgICAgICAgICAgICAgICAqLworMHg5NSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgQ291bnQgKDEpLCAgICAgICAgICAgICAgICovCisweDc1LCAweDBFLCAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBTaXplICgxNCksICAgICAgICAgICAgICAgKi8KKzB4MTQsICAgICAgICAgICAgICAgLyogICAgICAgICAgTG9naWNhbCBNaW5pbXVtICgwKSwgICAgICAgICAgICAqLworMHgyNiwgMHhGRiwgMHgzRiwgICAvKiAgICAgICAgICBMb2dpY2FsIE1heGltdW0gKDE2MzgzKSwgICAgICAgICovCisweDM0LCAgICAgICAgICAgICAgIC8qICAgICAgICAgIFBoeXNpY2FsIE1pbmltdW0gKDApLCAgICAgICAgICAgKi8KKzB4NDYsIDB4RkYsIDB4M0YsICAgLyogICAgICAgICAgUGh5c2ljYWwgTWF4aW11bSAoMTYzODMpLCAgICAgICAqLworMHgwOSwgMHgzMCwgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoWCksICAgICAgICAgICAgICAgICAgICAgICovCisweDgxLCAweDAyLCAgICAgICAgIC8qICAgICAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAgICAgKi8KKzB4OTUsIDB4MEUsICAgICAgICAgLyogICAgICAgICAgUmVwb3J0IENvdW50ICgxNCksICAgICAgICAgICAgICAqLworMHg3NSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgU2l6ZSAoMSksICAgICAgICAgICAgICAgICovCisweDI1LCAweDAxLCAgICAgICAgIC8qICAgICAgICAgIExvZ2ljYWwgTWF4aW11bSAoMSksICAgICAgICAgICAgKi8KKzB4NDUsIDB4MDEsICAgICAgICAgLyogICAgICAgICAgUGh5c2ljYWwgTWF4aW11bSAoMSksICAgICAgICAgICAqLworMHgwNSwgMHgwOSwgICAgICAgICAvKiAgICAgICAgICBVc2FnZSBQYWdlIChCdXR0b24pLCAgICAgICAgICAgICovCisweDE5LCAweDAxLCAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIE1pbmltdW0gKDAxaCksICAgICAgICAgICAgKi8KKzB4MjksIDB4MEUsICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgTWF4aW11bSAoMEVoKSwgICAgICAgICAgICAqLworMHg4MSwgMHgwMiwgICAgICAgICAvKiAgICAgICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgICAgICovCisweDA1LCAweDAxLCAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIFBhZ2UgKERlc2t0b3ApLCAgICAgICAgICAgKi8KKzB4OTUsIDB4MDEsICAgICAgICAgLyogICAgICAgICAgUmVwb3J0IENvdW50ICgxKSwgICAgICAgICAgICAgICAqLworMHg3NSwgMHgwNCwgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgU2l6ZSAoNCksICAgICAgICAgICAgICAgICovCisweDI1LCAweDA3LCAgICAgICAgIC8qICAgICAgICAgIExvZ2ljYWwgTWF4aW11bSAoNyksICAgICAgICAgICAgKi8KKzB4NDYsIDB4M0IsIDB4MDEsICAgLyogICAgICAgICAgUGh5c2ljYWwgTWF4aW11bSAoMzE1KSwgICAgICAgICAqLworMHg2NSwgMHgxNCwgICAgICAgICAvKiAgICAgICAgICBVbml0IChEZWdyZWVzKSwgICAgICAgICAgICAgICAgICovCisweDA5LCAweDM5LCAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIChIYXQgU3dpdGNoKSwgICAgICAgICAgICAgKi8KKzB4ODEsIDB4NDIsICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKFZhcmlhYmxlLCBOdWxsc3RhdGUpLCAgICAqLworMHg2NSwgMHgwMCwgICAgICAgICAvKiAgICAgICAgICBVbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisweDI2LCAweEZGLCAweDAwLCAgIC8qICAgICAgICAgIExvZ2ljYWwgTWF4aW11bSAoMjU1KSwgICAgICAgICAgKi8KKzB4NDYsIDB4RkYsIDB4MDAsICAgLyogICAgICAgICAgUGh5c2ljYWwgTWF4aW11bSAoMjU1KSwgICAgICAgICAqLworMHg3NSwgMHgwOCwgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgU2l6ZSAoOCksICAgICAgICAgICAgICAgICovCisweDgxLCAweDAxLCAgICAgICAgIC8qICAgICAgICAgIElucHV0IChDb25zdGFudCksICAgICAgICAgICAgICAgKi8KKzB4MDksIDB4MzEsICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgKFkpLCAgICAgICAgICAgICAgICAgICAgICAqLworMHg4MSwgMHgwMiwgICAgICAgICAvKiAgICAgICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgICAgICovCisweDA5LCAweDM1LCAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIChSeiksICAgICAgICAgICAgICAgICAgICAgKi8KKzB4ODEsIDB4MDIsICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICAgICAqLworMHg4MSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBJbnB1dCAoQ29uc3RhbnQpLCAgICAgICAgICAgICAgICovCisweEMwLCAgICAgICAgICAgICAgIC8qICAgICAgRW5kIENvbGxlY3Rpb24sICAgICAgICAgICAgICAgICAgICAgKi8KKzB4QTEsIDB4MDIsICAgICAgICAgLyogICAgICBDb2xsZWN0aW9uIChMb2dpY2FsKSwgICAgICAgICAgICAgICAqLworMHgwOSwgMHgwMiwgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoMDJoKSwgICAgICAgICAgICAgICAgICAgICovCisweDk1LCAweDA3LCAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBDb3VudCAoNyksICAgICAgICAgICAgICAgKi8KKzB4OTEsIDB4MDIsICAgICAgICAgLyogICAgICAgICAgT3V0cHV0IChWYXJpYWJsZSksICAgICAgICAgICAgICAqLworMHhDMCwgICAgICAgICAgICAgICAvKiAgICAgIEVuZCBDb2xsZWN0aW9uLCAgICAgICAgICAgICAgICAgICAgICovCisweEMwICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKKwogLyoKICAqIENlcnRhaW4gTG9naXRlY2gga2V5Ym9hcmRzIHNlbmQgaW4gcmVwb3J0ICMzIGtleXMgd2hpY2ggYXJlIGZhcgogICogYWJvdmUgdGhlIGxvZ2ljYWwgbWF4aW11bSBkZXNjcmliZWQgaW4gZGVzY3JpcHRvci4gVGhpcyBleHRlbmRzCkBAIC03NCw2ICsxMzQsMTggQEAKIAkJcmRlc2NbNDddID0gMHg5NTsKIAkJcmRlc2NbNDhdID0gMHgwQjsKIAl9CisKKwlzd2l0Y2ggKGhkZXYtPnByb2R1Y3QpIHsKKwljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfREZQX1dIRUVMOgorCQlpZiAoKnJzaXplID09IERGUF9SREVTQ19PUklHX1NJWkUpIHsKKwkJCWhpZF9pbmZvKGhkZXYsCisJCQkJImZpeGluZyB1cCBMb2dpdGVjaCBEcml2aW5nIEZvcmNlIFBybyByZXBvcnQgZGVzY3JpcHRvclxuIik7CisJCQlyZGVzYyA9IGRmcF9yZGVzY19maXhlZDsKKwkJCSpyc2l6ZSA9IHNpemVvZihkZnBfcmRlc2NfZml4ZWQpOworCQl9CisJCWJyZWFrOworCX0KKwogCXJldHVybiByZGVzYzsKIH0KIApAQCAtMzgwLDcgKzQ1Miw3IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0cyN19XSEVFTCksCiAJCS5kcml2ZXJfZGF0YSA9IExHX0ZGIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0RGUF9XSEVFTCksCi0JCS5kcml2ZXJfZGF0YSA9IExHX0ZGIH0sCisJCS5kcml2ZXJfZGF0YSA9IExHX05PR0VUIHwgTEdfRkYgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0lJX1dIRUVMKSwKIAkJLmRyaXZlcl9kYXRhID0gTEdfRkY0IH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dJTkdNQU5fRkZHICksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbWFnaWNtb3VzZS5jIGIvZHJpdmVycy9oaWQvaGlkLW1hZ2ljbW91c2UuYwppbmRleCBhNWVkYTRjLi4wZWM5MWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbWFnaWNtb3VzZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1tYWdpY21vdXNlLmMKQEAgLTUwMSwxNyArNTAxLDkgQEAKIAl9CiAJcmVwb3J0LT5zaXplID0gNjsKIAotCS8qCi0JICogVGhlIGRldmljZSByZXBvbmRzIHdpdGggJ2ludmFsaWQgcmVwb3J0IGlkJyB3aGVuIGZlYXR1cmUKLQkgKiByZXBvcnQgc3dpdGNoaW5nIGl0IGludG8gbXVsdGl0b3VjaCBtb2RlIGlzIHNlbnQgdG8gaXQuCi0JICoKLQkgKiBUaGlzIHJlc3VsdHMgaW4gLUVJTyBmcm9tIHRoZSBfcmF3IGxvdy1sZXZlbCB0cmFuc3BvcnQgY2FsbGJhY2ssCi0JICogYnV0IHRoZXJlIHNlZW1zIHRvIGJlIG5vIG90aGVyIHdheSBvZiBzd2l0Y2hpbmcgdGhlIG1vZGUuCi0JICogVGh1cyB0aGUgc3VwZXItdWdseSBoYWNreSBzdWNjZXNzIGNoZWNrIGJlbG93LgotCSAqLwogCXJldCA9IGhkZXYtPmhpZF9vdXRwdXRfcmF3X3JlcG9ydChoZGV2LCBmZWF0dXJlLCBzaXplb2YoZmVhdHVyZSksCiAJCQlISURfRkVBVFVSRV9SRVBPUlQpOwotCWlmIChyZXQgIT0gLUVJTykgeworCWlmIChyZXQgIT0gc2l6ZW9mKGZlYXR1cmUpKSB7CiAJCWhpZF9lcnIoaGRldiwgInVuYWJsZSB0byByZXF1ZXN0IHRvdWNoIGRhdGEgKCVkKVxuIiwgcmV0KTsKIAkJZ290byBlcnJfc3RvcF9odzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbWljcm9zb2Z0LmMgYi9kcml2ZXJzL2hpZC9oaWQtbWljcm9zb2Z0LmMKaW5kZXggMGY2ZmM1NC4uZTVjNjk5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW1pY3Jvc29mdC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1taWNyb3NvZnQuYwpAQCAtMjMsMTEgKzIzLDEyIEBACiAKICNpbmNsdWRlICJoaWQtaWRzLmgiCiAKLSNkZWZpbmUgTVNfSElESU5QVVQJMHgwMQotI2RlZmluZSBNU19FUkdPTk9NWQkweDAyCi0jZGVmaW5lIE1TX1BSRVNFTlRFUgkweDA0Ci0jZGVmaW5lIE1TX1JERVNDCTB4MDgKLSNkZWZpbmUgTVNfTk9HRVQJMHgxMAorI2RlZmluZSBNU19ISURJTlBVVAkJMHgwMQorI2RlZmluZSBNU19FUkdPTk9NWQkJMHgwMgorI2RlZmluZSBNU19QUkVTRU5URVIJCTB4MDQKKyNkZWZpbmUgTVNfUkRFU0MJCTB4MDgKKyNkZWZpbmUgTVNfTk9HRVQJCTB4MTAKKyNkZWZpbmUgTVNfRFVQTElDQVRFX1VTQUdFUwkweDIwCiAKIC8qCiAgKiBNaWNyb3NvZnQgV2lyZWxlc3MgRGVza3RvcCBSZWNlaXZlciAoTW9kZWwgMTAyOCkgaGFzCkBAIC0xMDksNiArMTEwLDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbXNfaW5wdXRfbWFwcGVkKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKWhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmIChxdWlya3MgJiBNU19EVVBMSUNBVEVfVVNBR0VTKQorCQljbGVhcl9iaXQodXNhZ2UtPmNvZGUsICpiaXQpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbXNfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAogCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCiB7CkBAIC0xNzksOCArMTkyLDEyIEBACiAJCS5kcml2ZXJfZGF0YSA9IE1TX0VSR09OT01ZIHwgTVNfUkRFU0MgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX1BSRVNFTlRFUl84S19VU0IpLAogCQkuZHJpdmVyX2RhdGEgPSBNU19QUkVTRU5URVIgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX0RJR0lUQUxfTUVESUFfM0spLAorCQkuZHJpdmVyX2RhdGEgPSBNU19FUkdPTk9NWSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfV0lSRUxFU1NfT1BUSUNBTF9ERVNLVE9QXzNfMCksCiAJCS5kcml2ZXJfZGF0YSA9IE1TX05PR0VUIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19DT01GT1JUX01PVVNFXzQ1MDApLAorCQkuZHJpdmVyX2RhdGEgPSBNU19EVVBMSUNBVEVfVVNBR0VTIH0sCiAKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX1BSRVNFTlRFUl84S19CVCksCiAJCS5kcml2ZXJfZGF0YSA9IE1TX1BSRVNFTlRFUiB9LApAQCAtMTkzLDYgKzIxMCw3IEBACiAJLmlkX3RhYmxlID0gbXNfZGV2aWNlcywKIAkucmVwb3J0X2ZpeHVwID0gbXNfcmVwb3J0X2ZpeHVwLAogCS5pbnB1dF9tYXBwaW5nID0gbXNfaW5wdXRfbWFwcGluZywKKwkuaW5wdXRfbWFwcGVkID0gbXNfaW5wdXRfbWFwcGVkLAogCS5ldmVudCA9IG1zX2V2ZW50LAogCS5wcm9iZSA9IG1zX3Byb2JlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1tdWx0aXRvdWNoLmMgYi9kcml2ZXJzL2hpZC9oaWQtbXVsdGl0b3VjaC5jCmluZGV4IGVjZDRkMmRiLi41OGQwZTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbXVsdGl0b3VjaC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1tdWx0aXRvdWNoLmMKQEAgLTY0LDYgKzY0LDcgQEAKIAlzdHJ1Y3QgbXRfY2xhc3MgKm10Y2xhc3M7CS8qIG91ciBtdCBkZXZpY2UgY2xhc3MgKi8KIAl1bnNpZ25lZCBsYXN0X2ZpZWxkX2luZGV4OwkvKiBsYXN0IGZpZWxkIGluZGV4IG9mIHRoZSByZXBvcnQgKi8KIAl1bnNpZ25lZCBsYXN0X3Nsb3RfZmllbGQ7CS8qIHRoZSBsYXN0IGZpZWxkIG9mIGEgc2xvdCAqLworCWludCBsYXN0X210X2NvbGxlY3Rpb247CS8qIGxhc3Qga25vd24gbXQtcmVsYXRlZCBjb2xsZWN0aW9uICovCiAJX19zOCBpbnB1dG1vZGU7CQkvKiBJbnB1dE1vZGUgSElEIGZlYXR1cmUsIC0xIGlmIG5vbi1leGlzdGVudCAqLwogCV9fdTggbnVtX3JlY2VpdmVkOwkvKiBob3cgbWFueSBjb250YWN0cyB3ZSByZWNlaXZlZCAqLwogCV9fdTggbnVtX2V4cGVjdGVkOwkvKiBleHBlY3RlZCBsYXN0IGNvbnRhY3QgaW5kZXggKi8KQEAgLTIyNSw4ICsyMjYsMTAgQEAKIAkJCQljbHMtPnNuX21vdmUpOwogCQkJLyogdG91Y2hzY3JlZW4gZW11bGF0aW9uICovCiAJCQlzZXRfYWJzKGhpLT5pbnB1dCwgQUJTX1gsIGZpZWxkLCBjbHMtPnNuX21vdmUpOwotCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7Ci0JCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKKwkJCWlmICh0ZC0+bGFzdF9tdF9jb2xsZWN0aW9uID09IHVzYWdlLT5jb2xsZWN0aW9uX2luZGV4KSB7CisJCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7CisJCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQl9CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSBISURfR0RfWToKIAkJCWlmIChxdWlya3MgJiBNVF9RVUlSS19FR0FMQVhfWFlaX0ZJWFVQKQpAQCAtMjM3LDggKzI0MCwxMCBAQAogCQkJCWNscy0+c25fbW92ZSk7CiAJCQkvKiB0b3VjaHNjcmVlbiBlbXVsYXRpb24gKi8KIAkJCXNldF9hYnMoaGktPmlucHV0LCBBQlNfWSwgZmllbGQsIGNscy0+c25fbW92ZSk7Ci0JCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKLQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJaWYgKHRkLT5sYXN0X210X2NvbGxlY3Rpb24gPT0gdXNhZ2UtPmNvbGxlY3Rpb25faW5kZXgpIHsKKwkJCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKKwkJCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKKwkJCX0KIAkJCXJldHVybiAxOwogCQl9CiAJCXJldHVybiAwOwpAQCAtMjQ2LDMxICsyNTEsNDIgQEAKIAljYXNlIEhJRF9VUF9ESUdJVElaRVI6CiAJCXN3aXRjaCAodXNhZ2UtPmhpZCkgewogCQljYXNlIEhJRF9ER19JTlJBTkdFOgotCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7Ci0JCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKKwkJCWlmICh0ZC0+bGFzdF9tdF9jb2xsZWN0aW9uID09IHVzYWdlLT5jb2xsZWN0aW9uX2luZGV4KSB7CisJCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7CisJCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQl9CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSBISURfREdfQ09ORklERU5DRToKLQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwotCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQlpZiAodGQtPmxhc3RfbXRfY29sbGVjdGlvbiA9PSB1c2FnZS0+Y29sbGVjdGlvbl9pbmRleCkgeworCQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOworCQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJfQogCQkJcmV0dXJuIDE7CiAJCWNhc2UgSElEX0RHX1RJUFNXSVRDSDoKIAkJCWhpZF9tYXBfdXNhZ2UoaGksIHVzYWdlLCBiaXQsIG1heCwgRVZfS0VZLCBCVE5fVE9VQ0gpOwogCQkJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaGktPmlucHV0LCBFVl9LRVksIEJUTl9UT1VDSCk7Ci0JCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKLQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJaWYgKHRkLT5sYXN0X210X2NvbGxlY3Rpb24gPT0gdXNhZ2UtPmNvbGxlY3Rpb25faW5kZXgpIHsKKwkJCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKKwkJCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKKwkJCX0KIAkJCXJldHVybiAxOwogCQljYXNlIEhJRF9ER19DT05UQUNUSUQ6CisJCQlpZiAoIXRkLT5tYXhjb250YWN0cykKKwkJCQl0ZC0+bWF4Y29udGFjdHMgPSBNVF9ERUZBVUxUX01BWENPTlRBQ1Q7CiAJCQlpbnB1dF9tdF9pbml0X3Nsb3RzKGhpLT5pbnB1dCwgdGQtPm1heGNvbnRhY3RzKTsKIAkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwogCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQl0ZC0+bGFzdF9tdF9jb2xsZWN0aW9uID0gdXNhZ2UtPmNvbGxlY3Rpb25faW5kZXg7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSBISURfREdfV0lEVEg6CiAJCQloaWRfbWFwX3VzYWdlKGhpLCB1c2FnZSwgYml0LCBtYXgsCiAJCQkJCUVWX0FCUywgQUJTX01UX1RPVUNIX01BSk9SKTsKIAkJCXNldF9hYnMoaGktPmlucHV0LCBBQlNfTVRfVE9VQ0hfTUFKT1IsIGZpZWxkLAogCQkJCWNscy0+c25fd2lkdGgpOwotCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7Ci0JCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKKwkJCWlmICh0ZC0+bGFzdF9tdF9jb2xsZWN0aW9uID09IHVzYWdlLT5jb2xsZWN0aW9uX2luZGV4KSB7CisJCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7CisJCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQl9CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSBISURfREdfSEVJR0hUOgogCQkJaGlkX21hcF91c2FnZShoaSwgdXNhZ2UsIGJpdCwgbWF4LApAQCAtMjc5LDggKzI5NSwxMCBAQAogCQkJCWNscy0+c25faGVpZ2h0KTsKIAkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGhpLT5pbnB1dCwKIAkJCQkJQUJTX01UX09SSUVOVEFUSU9OLCAwLCAxLCAwLCAwKTsKLQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwotCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQlpZiAodGQtPmxhc3RfbXRfY29sbGVjdGlvbiA9PSB1c2FnZS0+Y29sbGVjdGlvbl9pbmRleCkgeworCQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOworCQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJfQogCQkJcmV0dXJuIDE7CiAJCWNhc2UgSElEX0RHX1RJUFBSRVNTVVJFOgogCQkJaWYgKHF1aXJrcyAmIE1UX1FVSVJLX0VHQUxBWF9YWVpfRklYVVApCkBAIC0yOTIsMTYgKzMxMCwyMCBAQAogCQkJLyogdG91Y2hzY3JlZW4gZW11bGF0aW9uICovCiAJCQlzZXRfYWJzKGhpLT5pbnB1dCwgQUJTX1BSRVNTVVJFLCBmaWVsZCwKIAkJCQljbHMtPnNuX3ByZXNzdXJlKTsKLQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwotCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQlpZiAodGQtPmxhc3RfbXRfY29sbGVjdGlvbiA9PSB1c2FnZS0+Y29sbGVjdGlvbl9pbmRleCkgeworCQkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOworCQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJfQogCQkJcmV0dXJuIDE7CiAJCWNhc2UgSElEX0RHX0NPTlRBQ1RDT1VOVDoKLQkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OworCQkJaWYgKHRkLT5sYXN0X210X2NvbGxlY3Rpb24gPT0gdXNhZ2UtPmNvbGxlY3Rpb25faW5kZXgpCisJCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSBISURfREdfQ09OVEFDVE1BWDoKIAkJCS8qIHdlIGRvbid0IHNldCB0ZC0+bGFzdF9zbG90X2ZpZWxkIGFzIGNvbnRhY3Rjb3VudCBhbmQKIAkJCSAqIGNvbnRhY3QgbWF4IGFyZSBnbG9iYWwgdG8gdGhlIHJlcG9ydCAqLwotCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CisJCQlpZiAodGQtPmxhc3RfbXRfY29sbGVjdGlvbiA9PSB1c2FnZS0+Y29sbGVjdGlvbl9pbmRleCkKKwkJCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKIAkJCXJldHVybiAtMTsKIAkJfQogCQkvKiBsZXQgaGlkLWlucHV0IGRlY2lkZSBmb3IgdGhlIG90aGVycyAqLwpAQCAtNTE2LDYgKzUzOCw3IEBACiAJfQogCXRkLT5tdGNsYXNzID0gbXRjbGFzczsKIAl0ZC0+aW5wdXRtb2RlID0gLTE7CisJdGQtPmxhc3RfbXRfY29sbGVjdGlvbiA9IC0xOwogCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCB0ZCk7CiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CkBAIC01MjYsOSArNTQ5LDYgQEAKIAlpZiAocmV0KQogCQlnb3RvIGZhaWw7CiAKLQlpZiAoIXRkLT5tYXhjb250YWN0cykKLQkJdGQtPm1heGNvbnRhY3RzID0gTVRfREVGQVVMVF9NQVhDT05UQUNUOwotCiAJdGQtPnNsb3RzID0ga3phbGxvYyh0ZC0+bWF4Y29udGFjdHMgKiBzaXplb2Yoc3RydWN0IG10X3Nsb3QpLAogCQkJCUdGUF9LRVJORUwpOwogCWlmICghdGQtPnNsb3RzKSB7CkBAIC01OTMsNiArNjEzLDExIEBACiAJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0FORE8sCiAJCQlVU0JfREVWSUNFX0lEX0NBTkRPX01VTFRJX1RPVUNIXzE1XzYpIH0sCiAKKwkvKiBDaHVuZ2h3YSBUZWxlY29tIHRvdWNoIHBhbmVscyAqLworCXsgIC5kcml2ZXJfZGF0YSA9IE1UX0NMU19ERUZBVUxULAorCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NIVU5HSFdBVCwKKwkJCVVTQl9ERVZJQ0VfSURfQ0hVTkdIV0FUX01VTFRJVE9VQ0gpIH0sCisKIAkvKiBDVlRvdWNoIHBhbmVscyAqLwogCXsgLmRyaXZlcl9kYXRhID0gTVRfQ0xTX0RFRkFVTFQsCiAJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ1ZUT1VDSCwKQEAgLTY1MSw2ICs2NzYsOSBAQAogCXsgLmRyaXZlcl9kYXRhID0gTVRfQ0xTX0NPTkZJREVOQ0VfTUlOVVNfT05FLAogCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xVTUlPLAogCQkJVVNCX0RFVklDRV9JRF9DUllTVEFMVE9VQ0gpIH0sCisJeyAuZHJpdmVyX2RhdGEgPSBNVF9DTFNfQ09ORklERU5DRV9NSU5VU19PTkUsCisJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTFVNSU8sCisJCQlVU0JfREVWSUNFX0lEX0NSWVNUQUxUT1VDSF9EVUFMKSB9LAogCiAJLyogTW9zQXJ0IHBhbmVscyAqLwogCXsgLmRyaXZlcl9kYXRhID0gTVRfQ0xTX0NPTkZJREVOQ0VfTUlOVVNfT05FLApAQCAtNjgxLDEwICs3MDksMTAgQEAKIAkJSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TVEFOVFVNLAogCQkJVVNCX0RFVklDRV9JRF9NVFApfSwKIAl7IC5kcml2ZXJfZGF0YSA9IE1UX0NMU19DT05GSURFTkNFLAotCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NUQU5UVU0sCisJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU1RBTlRVTV9TVE0sCiAJCQlVU0JfREVWSUNFX0lEX01UUF9TVE0pfSwKIAl7IC5kcml2ZXJfZGF0YSA9IE1UX0NMU19DT05GSURFTkNFLAotCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NUQU5UVU0sCisJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU1RBTlRVTV9TSVRST05JWCwKIAkJCVVTQl9ERVZJQ0VfSURfTVRQX1NJVFJPTklYKX0sCiAKIAkvKiBUb3VjaCBJbnRlcm5hdGlvbmFsIHBhbmVscyAqLwpAQCAtNjk5LDYgKzcyNywxMCBAQAogCXsgLmRyaXZlcl9kYXRhID0gTVRfQ0xTX0RFRkFVTFQsCiAJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVU5JVEVDLAogCQkJVVNCX0RFVklDRV9JRF9VTklURUNfVVNCX1RPVUNIXzBBMTkpIH0sCisJLyogWEFUICovCisJeyAuZHJpdmVyX2RhdGEgPSBNVF9DTFNfREVGQVVMVCwKKwkJSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9YQVQsCisJCQlVU0JfREVWSUNFX0lEX1hBVF9DU1IpIH0sCiAKIAl7IH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcHJvZGlrZXlzLmMgYi9kcml2ZXJzL2hpZC9oaWQtcHJvZGlrZXlzLmMKaW5kZXggYWIxOWYyOS4uMTU4YjM4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXByb2Rpa2V5cy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1wcm9kaWtleXMuYwpAQCAtNDQsOCArNDQsNiBAQAogCXN0cnVjdCBwY21pZGlfc25kCSpwbTsgLyogcGNtaWRpIGRldmljZSBjb250ZXh0ICovCiB9OwogCi1zdHJ1Y3QgcGNtaWRpX3NuZDsKLQogc3RydWN0IHBjbWlkaV9zdXN0YWluIHsKIAl1bnNpZ25lZCBsb25nCQlpbl91c2U7CiAJc3RydWN0IHBjbWlkaV9zbmQJKnBtOwpAQCAtMjQyLDcgKzI0MCw3IEBACiAJcmV0dXJuOwogfQogCi12b2lkIHBjbWlkaV9zdXN0YWluZWRfbm90ZV9yZWxlYXNlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIHBjbWlkaV9zdXN0YWluZWRfbm90ZV9yZWxlYXNlKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgcGNtaWRpX3N1c3RhaW4gKnBtcyA9IChzdHJ1Y3QgcGNtaWRpX3N1c3RhaW4gKilkYXRhOwogCkBAIC0yNTAsNyArMjQ4LDcgQEAKIAlwbXMtPmluX3VzZSA9IDA7CiB9CiAKLXZvaWQgaW5pdF9zdXN0YWluX3RpbWVycyhzdHJ1Y3QgcGNtaWRpX3NuZCAqcG0pCitzdGF0aWMgdm9pZCBpbml0X3N1c3RhaW5fdGltZXJzKHN0cnVjdCBwY21pZGlfc25kICpwbSkKIHsKIAlzdHJ1Y3QgcGNtaWRpX3N1c3RhaW4gKnBtczsKIAl1bnNpZ25lZCBpOwpAQCAtMjY0LDcgKzI2Miw3IEBACiAJfQogfQogCi12b2lkIHN0b3Bfc3VzdGFpbl90aW1lcnMoc3RydWN0IHBjbWlkaV9zbmQgKnBtKQorc3RhdGljIHZvaWQgc3RvcF9zdXN0YWluX3RpbWVycyhzdHJ1Y3QgcGNtaWRpX3NuZCAqcG0pCiB7CiAJc3RydWN0IHBjbWlkaV9zdXN0YWluICpwbXM7CiAJdW5zaWduZWQgaTsKQEAgLTQ5OSw3ICs0OTcsNyBAQAogCXJldHVybiAxOwogfQogCi1pbnQgcGNtaWRpX2hhbmRsZV9yZXBvcnQoCitzdGF0aWMgaW50IHBjbWlkaV9oYW5kbGVfcmVwb3J0KAogCXN0cnVjdCBwY21pZGlfc25kICpwbSwgdW5zaWduZWQgcmVwb3J0X2lkLCB1OCAqZGF0YSwgaW50IHNpemUpCiB7CiAJaW50IHJldCA9IDA7CkBAIC01MTgsNyArNTE2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIHBjbWlkaV9zZXR1cF9leHRyYV9rZXlzKHN0cnVjdCBwY21pZGlfc25kICpwbSwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCitzdGF0aWMgdm9pZCBwY21pZGlfc2V0dXBfZXh0cmFfa2V5cygKKwlzdHJ1Y3QgcGNtaWRpX3NuZCAqcG0sIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQogewogCS8qIHJlYXNzaWduZWQgZnVuY3Rpb25hbGl0eSBmb3IgTi9BIGtleXMKIAkJTVkgUElDVFVSRVMgPT4JS0VZX1dPUkRQUk9DRVNTT1IKQEAgLTYwMiw3ICs2MDEsNyBAQAogCS50cmlnZ2VyID0gcGNtaWRpX2luX3RyaWdnZXIKIH07CiAKLWludCBwY21pZGlfc25kX2luaXRpYWxpc2Uoc3RydWN0IHBjbWlkaV9zbmQgKnBtKQorc3RhdGljIGludCBwY21pZGlfc25kX2luaXRpYWxpc2Uoc3RydWN0IHBjbWlkaV9zbmQgKnBtKQogewogCXN0YXRpYyBpbnQgZGV2OwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKQEAgLTcyMCw3ICs3MTksNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBwY21pZGlfc25kX3Rlcm1pbmF0ZShzdHJ1Y3QgcGNtaWRpX3NuZCAqcG0pCitzdGF0aWMgaW50IHBjbWlkaV9zbmRfdGVybWluYXRlKHN0cnVjdCBwY21pZGlfc25kICpwbSkKIHsKIAlpZiAocG0tPmNhcmQpIHsKIAkJc3RvcF9zdXN0YWluX3RpbWVycyhwbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWFydm8uYyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtYXJ2by5jCmluZGV4IDIzMDc0NzEuLjA5M2JmYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtYXJ2by5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtYXJ2by5jCkBAIC0zOSw3ICszOSw3IEBACiAJaW50IHJldHZhbDsKIAogCW11dGV4X2xvY2soJmFydm8tPmFydm9fbG9jayk7Ci0JcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEFSVk9fVVNCX0NPTU1BTkRfTU9ERV9LRVksCisJcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEFSVk9fQ09NTUFORF9NT0RFX0tFWSwKIAkJCSZ0ZW1wX2J1Ziwgc2l6ZW9mKHN0cnVjdCBhcnZvX21vZGVfa2V5KSk7CiAJbXV0ZXhfdW5sb2NrKCZhcnZvLT5hcnZvX2xvY2spOwogCWlmIChyZXR2YWwpCkBAIC02Nyw3ICs2Nyw3IEBACiAJdGVtcF9idWYuc3RhdGUgPSBzdGF0ZTsKIAogCW11dGV4X2xvY2soJmFydm8tPmFydm9fbG9jayk7Ci0JcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9zZW5kKHVzYl9kZXYsIEFSVk9fVVNCX0NPTU1BTkRfTU9ERV9LRVksCisJcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9zZW5kKHVzYl9kZXYsIEFSVk9fQ09NTUFORF9NT0RFX0tFWSwKIAkJCSZ0ZW1wX2J1Ziwgc2l6ZW9mKHN0cnVjdCBhcnZvX21vZGVfa2V5KSk7CiAJbXV0ZXhfdW5sb2NrKCZhcnZvLT5hcnZvX2xvY2spOwogCWlmIChyZXR2YWwpCkBAIC04Nyw3ICs4Nyw3IEBACiAJaW50IHJldHZhbDsKIAogCW11dGV4X2xvY2soJmFydm8tPmFydm9fbG9jayk7Ci0JcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEFSVk9fVVNCX0NPTU1BTkRfS0VZX01BU0ssCisJcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEFSVk9fQ09NTUFORF9LRVlfTUFTSywKIAkJCSZ0ZW1wX2J1Ziwgc2l6ZW9mKHN0cnVjdCBhcnZvX2tleV9tYXNrKSk7CiAJbXV0ZXhfdW5sb2NrKCZhcnZvLT5hcnZvX2xvY2spOwogCWlmIChyZXR2YWwpCkBAIC0xMTUsNyArMTE1LDcgQEAKIAl0ZW1wX2J1Zi5rZXlfbWFzayA9IGtleV9tYXNrOwogCiAJbXV0ZXhfbG9jaygmYXJ2by0+YXJ2b19sb2NrKTsKLQlyZXR2YWwgPSByb2NjYXRfY29tbW9uX3NlbmQodXNiX2RldiwgQVJWT19VU0JfQ09NTUFORF9LRVlfTUFTSywKKwlyZXR2YWwgPSByb2NjYXRfY29tbW9uX3NlbmQodXNiX2RldiwgQVJWT19DT01NQU5EX0tFWV9NQVNLLAogCQkJJnRlbXBfYnVmLCBzaXplb2Yoc3RydWN0IGFydm9fa2V5X21hc2spKTsKIAltdXRleF91bmxvY2soJmFydm8tPmFydm9fbG9jayk7CiAJaWYgKHJldHZhbCkKQEAgLTEzMCw3ICsxMzAsNyBAQAogCXN0cnVjdCBhcnZvX2FjdHVhbF9wcm9maWxlIHRlbXBfYnVmOwogCWludCByZXR2YWw7CiAKLQlyZXR2YWwgPSByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgQVJWT19VU0JfQ09NTUFORF9BQ1RVQUxfUFJPRklMRSwKKwlyZXR2YWwgPSByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgQVJWT19DT01NQU5EX0FDVFVBTF9QUk9GSUxFLAogCQkJJnRlbXBfYnVmLCBzaXplb2Yoc3RydWN0IGFydm9fYWN0dWFsX3Byb2ZpbGUpKTsKIAogCWlmIChyZXR2YWwpCkBAIC0xNjMsMTEgKzE2MywxNCBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKKwlpZiAocHJvZmlsZSA8IDEgfHwgcHJvZmlsZSA+IDUpCisJCXJldHVybiAtRUlOVkFMOworCiAJdGVtcF9idWYuY29tbWFuZCA9IEFSVk9fQ09NTUFORF9BQ1RVQUxfUFJPRklMRTsKIAl0ZW1wX2J1Zi5hY3R1YWxfcHJvZmlsZSA9IHByb2ZpbGU7CiAKIAltdXRleF9sb2NrKCZhcnZvLT5hcnZvX2xvY2spOwotCXJldHZhbCA9IHJvY2NhdF9jb21tb25fc2VuZCh1c2JfZGV2LCBBUlZPX1VTQl9DT01NQU5EX0FDVFVBTF9QUk9GSUxFLAorCXJldHZhbCA9IHJvY2NhdF9jb21tb25fc2VuZCh1c2JfZGV2LCBBUlZPX0NPTU1BTkRfQUNUVUFMX1BST0ZJTEUsCiAJCQkmdGVtcF9idWYsIHNpemVvZihzdHJ1Y3QgYXJ2b19hY3R1YWxfcHJvZmlsZSkpOwogCWlmICghcmV0dmFsKSB7CiAJCWFydm8tPmFjdHVhbF9wcm9maWxlID0gcHJvZmlsZTsKQEAgLTIyNSw3ICsyMjgsNyBAQAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7CiAJcmV0dXJuIGFydm9fc3lzZnNfd3JpdGUoZnAsIGtvYmosIGJ1Ziwgb2ZmLCBjb3VudCwKLQkJCXNpemVvZihzdHJ1Y3QgYXJ2b19idXR0b24pLCBBUlZPX1VTQl9DT01NQU5EX0JVVFRPTik7CisJCQlzaXplb2Yoc3RydWN0IGFydm9fYnV0dG9uKSwgQVJWT19DT01NQU5EX0JVVFRPTik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFydm9fc3lzZnNfcmVhZF9pbmZvKHN0cnVjdCBmaWxlICpmcCwKQEAgLTIzMyw3ICsyMzYsNyBAQAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7CiAJcmV0dXJuIGFydm9fc3lzZnNfcmVhZChmcCwga29iaiwgYnVmLCBvZmYsIGNvdW50LAotCQkJc2l6ZW9mKHN0cnVjdCBhcnZvX2luZm8pLCBBUlZPX1VTQl9DT01NQU5EX0lORk8pOworCQkJc2l6ZW9mKHN0cnVjdCBhcnZvX2luZm8pLCBBUlZPX0NPTU1BTkRfSU5GTyk7CiB9CiAKIApAQCAtMzk5LDcgKzQwMiw3IEBACiAJaWYgKHNpemUgIT0gMykKIAkJcmV0dXJuIDA7CiAKLQlpZiAoYXJ2by0+cm9jY2F0X2NsYWltZWQpCisJaWYgKGFydm8gJiYgYXJ2by0+cm9jY2F0X2NsYWltZWQpCiAJCWFydm9fcmVwb3J0X3RvX2NocmRldihhcnZvLCBkYXRhKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1hcnZvLmggYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWFydm8uaAppbmRleCBkMjg0YTc4Li5jZTg0MTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWFydm8uaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWFydm8uaApAQCAtNDYsMTkgKzQ2LDYgQEAKIAlBUlZPX0NPTU1BTkRfQUNUVUFMX1BST0ZJTEUgPSAweDcsCiB9OwogCi1lbnVtIGFydm9fdXNiX2NvbW1hbmRzIHsKLQlBUlZPX1VTQl9DT01NQU5EX01PREVfS0VZID0gMHgzMDMsCi0JLyoKLQkgKiByZWFkL3dyaXRlCi0JICogUmVhZCB1c2VzIGJvdGggaW5kZXggYnl0ZXMgYXMgcHJvZmlsZS9rZXkgaW5kZXhlcwotCSAqIFdyaXRlIGhhcyBpbmRleCAwLCBwcm9maWxlL2tleSBpcyBkZXRlcm1pbmVkIGJ5IHBheWxvYWQKLQkgKi8KLQlBUlZPX1VTQl9DT01NQU5EX0JVVFRPTiA9IDB4MzA0LAotCUFSVk9fVVNCX0NPTU1BTkRfSU5GTyA9IDB4MzA1LAotCUFSVk9fVVNCX0NPTU1BTkRfS0VZX01BU0sgPSAweDMwNiwKLQlBUlZPX1VTQl9DT01NQU5EX0FDVFVBTF9QUk9GSUxFID0gMHgzMDcsCi19OwotCiBzdHJ1Y3QgYXJ2b19zcGVjaWFsX3JlcG9ydCB7CiAJdWludDhfdCB1bmtub3duMTsgLyogYWx3YXlzIDB4MDEgKi8KIAl1aW50OF90IGV2ZW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1jb21tb24uYyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtY29tbW9uLmMKaW5kZXggMTNiMWViMC4uZWRmODk4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1jb21tb24uYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWNvbW1vbi5jCkBAIC0xMSwxMCArMTEsMTYgQEAKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAiaGlkLXJvY2NhdC1jb21tb24uaCIKIAotaW50IHJvY2NhdF9jb21tb25fcmVjZWl2ZShzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdWludCB1c2JfY29tbWFuZCwKK3N0YXRpYyBpbmxpbmUgdWludDE2X3Qgcm9jY2F0X2NvbW1vbl9mZWF0dXJlX3JlcG9ydCh1aW50OF90IHJlcG9ydF9pZCkKK3sKKwlyZXR1cm4gMHgzMDAgfCByZXBvcnRfaWQ7Cit9CisKK2ludCByb2NjYXRfY29tbW9uX3JlY2VpdmUoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVpbnQgcmVwb3J0X2lkLAogCQl2b2lkICpkYXRhLCB1aW50IHNpemUpCiB7CiAJY2hhciAqYnVmOwpAQCAtMjUsOSArMzEsMTAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlsZW4gPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3JjdmN0cmxwaXBlKHVzYl9kZXYsIDApLAotCQkJVVNCX1JFUV9DTEVBUl9GRUFUVVJFLAorCQkJSElEX1JFUV9HRVRfUkVQT1JULAogCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9JTiwKLQkJCXVzYl9jb21tYW5kLCAwLCBidWYsIHNpemUsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKwkJCXJvY2NhdF9jb21tb25fZmVhdHVyZV9yZXBvcnQocmVwb3J0X2lkKSwKKwkJCTAsIGJ1Ziwgc2l6ZSwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwogCiAJbWVtY3B5KGRhdGEsIGJ1Ziwgc2l6ZSk7CiAJa2ZyZWUoYnVmKTsKQEAgLTM1LDcgKzQyLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJvY2NhdF9jb21tb25fcmVjZWl2ZSk7CiAKLWludCByb2NjYXRfY29tbW9uX3NlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVpbnQgdXNiX2NvbW1hbmQsCitpbnQgcm9jY2F0X2NvbW1vbl9zZW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1aW50IHJlcG9ydF9pZCwKIAkJdm9pZCBjb25zdCAqZGF0YSwgdWludCBzaXplKQogewogCWNoYXIgKmJ1ZjsKQEAgLTQ4LDkgKzU1LDEwIEBACiAJbWVtY3B5KGJ1ZiwgZGF0YSwgc2l6ZSk7CiAKIAlsZW4gPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3NuZGN0cmxwaXBlKHVzYl9kZXYsIDApLAotCQkJVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTiwKKwkJCUhJRF9SRVFfU0VUX1JFUE9SVCwKIAkJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfT1VULAotCQkJdXNiX2NvbW1hbmQsIDAsIGJ1Ziwgc2l6ZSwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCQkJcm9jY2F0X2NvbW1vbl9mZWF0dXJlX3JlcG9ydChyZXBvcnRfaWQpLAorCQkJMCwgYnVmLCBzaXplLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAKIAlrZnJlZShidWYpOwogCXJldHVybiAoKGxlbiA8IDApID8gbGVuIDogKChsZW4gIT0gc2l6ZSkgPyAtRUlPIDogMCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1jb21tb24uaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtY29tbW9uLmgKaW5kZXggZmU0NWZhZS4uOWE1YmM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1jb21tb24uaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWNvbW1vbi5oCkBAIC0xNSw5ICsxNSw5IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotaW50IHJvY2NhdF9jb21tb25fcmVjZWl2ZShzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdWludCB1c2JfY29tbWFuZCwKK2ludCByb2NjYXRfY29tbW9uX3JlY2VpdmUoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVpbnQgcmVwb3J0X2lkLAogCQl2b2lkICpkYXRhLCB1aW50IHNpemUpOwotaW50IHJvY2NhdF9jb21tb25fc2VuZChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdWludCB1c2JfY29tbWFuZCwKK2ludCByb2NjYXRfY29tbW9uX3NlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVpbnQgcmVwb3J0X2lkLAogCQl2b2lkIGNvbnN0ICpkYXRhLCB1aW50IHNpemUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5jIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmMKaW5kZXggYTU3ODM4ZC4uMmI4ZjNhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmMKQEAgLTM3LDYgKzM3LDQ3IEBACiAKIHN0YXRpYyB1aW50IHByb2ZpbGVfbnVtYmVyc1s1XSA9IHswLCAxLCAyLCAzLCA0fTsKIAorc3RhdGljIGludCBrb25lX3JlY2VpdmUoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVpbnQgdXNiX2NvbW1hbmQsCisJCXZvaWQgKmRhdGEsIHVpbnQgc2l6ZSkKK3sKKwljaGFyICpidWY7CisJaW50IGxlbjsKKworCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2JfcmN2Y3RybHBpcGUodXNiX2RldiwgMCksCisJCQlISURfUkVRX0dFVF9SRVBPUlQsCisJCQlVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX0lOLAorCQkJdXNiX2NvbW1hbmQsIDAsIGJ1Ziwgc2l6ZSwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCisJbWVtY3B5KGRhdGEsIGJ1Ziwgc2l6ZSk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gKChsZW4gPCAwKSA/IGxlbiA6ICgobGVuICE9IHNpemUpID8gLUVJTyA6IDApKTsKK30KKworc3RhdGljIGludCBrb25lX3NlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVpbnQgdXNiX2NvbW1hbmQsCisJCXZvaWQgY29uc3QgKmRhdGEsIHVpbnQgc2l6ZSkKK3sKKwljaGFyICpidWY7CisJaW50IGxlbjsKKworCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShidWYsIGRhdGEsIHNpemUpOworCisJbGVuID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCUhJRF9SRVFfU0VUX1JFUE9SVCwKKwkJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfT1VULAorCQkJdXNiX2NvbW1hbmQsIDAsIGJ1Ziwgc2l6ZSwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gKChsZW4gPCAwKSA/IGxlbiA6ICgobGVuICE9IHNpemUpID8gLUVJTyA6IDApKTsKK30KKwogLyoga29uZV9jbGFzcyBpcyB1c2VkIGZvciBjcmVhdGluZyBzeXNmcyBhdHRyaWJ1dGVzIHZpYSByb2NjYXQgY2hhciBkZXZpY2UgKi8KIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKmtvbmVfY2xhc3M7CiAKQEAgLTY4LDcgKzEwOSw3IEBACiAJCSAqLwogCQltc2xlZXAoODApOwogCi0JCXJldHZhbCA9IHJvY2NhdF9jb21tb25fcmVjZWl2ZSh1c2JfZGV2LAorCQlyZXR2YWwgPSBrb25lX3JlY2VpdmUodXNiX2RldiwKIAkJCQlrb25lX2NvbW1hbmRfY29uZmlybV93cml0ZSwgJmRhdGEsIDEpOwogCQlpZiAocmV0dmFsKQogCQkJcmV0dXJuIHJldHZhbDsKQEAgLTk2LDcgKzEzNyw3IEBACiBzdGF0aWMgaW50IGtvbmVfZ2V0X3NldHRpbmdzKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAogCQlzdHJ1Y3Qga29uZV9zZXR0aW5ncyAqYnVmKQogewotCXJldHVybiByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2Rldiwga29uZV9jb21tYW5kX3NldHRpbmdzLCBidWYsCisJcmV0dXJuIGtvbmVfcmVjZWl2ZSh1c2JfZGV2LCBrb25lX2NvbW1hbmRfc2V0dGluZ3MsIGJ1ZiwKIAkJCXNpemVvZihzdHJ1Y3Qga29uZV9zZXR0aW5ncykpOwogfQogCkBAIC0xMDksNyArMTUwLDcgQEAKIAkJc3RydWN0IGtvbmVfc2V0dGluZ3MgY29uc3QgKnNldHRpbmdzKQogewogCWludCByZXR2YWw7Ci0JcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9zZW5kKHVzYl9kZXYsIGtvbmVfY29tbWFuZF9zZXR0aW5ncywKKwlyZXR2YWwgPSBrb25lX3NlbmQodXNiX2Rldiwga29uZV9jb21tYW5kX3NldHRpbmdzLAogCQkJc2V0dGluZ3MsIHNpemVvZihzdHJ1Y3Qga29uZV9zZXR0aW5ncykpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC0xODIsNyArMjIzLDcgQEAKIAlpbnQgcmV0dmFsOwogCXVpbnQ4X3QgZGF0YTsKIAotCXJldHZhbCA9IHJvY2NhdF9jb21tb25fcmVjZWl2ZSh1c2JfZGV2LCBrb25lX2NvbW1hbmRfd2VpZ2h0LCAmZGF0YSwgMSk7CisJcmV0dmFsID0ga29uZV9yZWNlaXZlKHVzYl9kZXYsIGtvbmVfY29tbWFuZF93ZWlnaHQsICZkYXRhLCAxKTsKIAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC0yMDEsNyArMjQyLDcgQEAKIAlpbnQgcmV0dmFsOwogCXVpbnQxNl90IGRhdGE7CiAKLQlyZXR2YWwgPSByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2Rldiwga29uZV9jb21tYW5kX2Zpcm13YXJlX3ZlcnNpb24sCisJcmV0dmFsID0ga29uZV9yZWNlaXZlKHVzYl9kZXYsIGtvbmVfY29tbWFuZF9maXJtd2FyZV92ZXJzaW9uLAogCQkJJmRhdGEsIDIpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC0zODQsNyArNDI1LDcgQEAKIHsKIAl1bnNpZ25lZCBjaGFyIHZhbHVlOwogCXZhbHVlID0gbnVtYmVyOwotCXJldHVybiByb2NjYXRfY29tbW9uX3NlbmQodXNiX2Rldiwga29uZV9jb21tYW5kX2NhbGlicmF0ZSwgJnZhbHVlLCAxKTsKKwlyZXR1cm4ga29uZV9zZW5kKHVzYl9kZXYsIGtvbmVfY29tbWFuZF9jYWxpYnJhdGUsICZ2YWx1ZSwgMSk7CiB9CiAKIC8qCkBAIC03OTEsNiArODMyLDkgQEAKIAlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGtvbmVfbW91c2VfZXZlbnQpKQogCQlyZXR1cm4gMDsKIAorCWlmIChrb25lID09IE5VTEwpCisJCXJldHVybiAwOworCiAJLyoKIAkgKiBGaXJtd2FyZSAxLjM4IGludHJvZHVjZWQgbmV3IGJlaGF2aW91ciBmb3IgdGlsdCBhbmQgc3BlY2lhbCBidXR0b25zLgogCSAqIFByZXNzZWQgYnV0dG9uIGlzIHJlcG9ydGVkIGluIGVhY2ggbW92ZW1lbnQgZXZlbnQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmUuaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCmluZGV4IDQxMDlhMDIuLjY0YWJiNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCkBAIC0xNjYsNyArMTY2LDcgQEAKIAkvKiBvc2QgZXZlbnRzIGFyZSB0aG91Z2h0IHRvIGJlIGRpc3BsYXkgb24gc2NyZWVuICovCiAJa29uZV9tb3VzZV9ldmVudF9vc2RfZHBpID0gMHhhMCwKIAlrb25lX21vdXNlX2V2ZW50X29zZF9wcm9maWxlID0gMHhiMCwKLQkvKiBUT0RPIGNsYXJpZnkgbWVhbmluZyBhbmQgb2NjdXJyZW5jZSBvZiBrb25lX21vdXNlX2V2ZW50X2NhbGlicmF0aW9uICovCisJLyogVE9ETyBjbGFyaWZ5IG1lYW5pbmcgYW5kIG9jY3VyZW5jZSBvZiBrb25lX21vdXNlX2V2ZW50X2NhbGlicmF0aW9uICovCiAJa29uZV9tb3VzZV9ldmVudF9jYWxpYnJhdGlvbiA9IDB4YzAsCiAJa29uZV9tb3VzZV9ldmVudF9jYWxsX292ZXJsb25nX21hY3JvID0gMHhlMCwKIAkvKiBzd2l0Y2ggZXZlbnRzIG5vdGlmeSBpZiB1c2VyIGNoYW5nZWQgdmFsdWVzIHdpdGggbW91c2VidXR0b24gY2xpY2sgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZXBsdXMuYyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZXBsdXMuYwppbmRleCA1YjY0MGE3Li41OWU0Nzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmVwbHVzLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lcGx1cy5jCkBAIC01MCw3ICs1MCw3IEBACiAJY29udHJvbC52YWx1ZSA9IHZhbHVlOwogCWNvbnRyb2wucmVxdWVzdCA9IHJlcXVlc3Q7CiAKLQlyZXR1cm4gcm9jY2F0X2NvbW1vbl9zZW5kKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX0NPTlRST0wsCisJcmV0dXJuIHJvY2NhdF9jb21tb25fc2VuZCh1c2JfZGV2LCBLT05FUExVU19DT01NQU5EX0NPTlRST0wsCiAJCQkmY29udHJvbCwgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19jb250cm9sKSk7CiB9CiAKQEAgLTYwLDcgKzYwLDcgQEAKIAlzdHJ1Y3Qga29uZXBsdXNfY29udHJvbCBjb250cm9sOwogCiAJZG8gewotCQlyZXR2YWwgPSByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfQ09OVFJPTCwKKwkJcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEtPTkVQTFVTX0NPTU1BTkRfQ09OVFJPTCwKIAkJCQkmY29udHJvbCwgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19jb250cm9sKSk7CiAKIAkJLyogY2hlY2sgaWYgd2UgZ2V0IGEgY29tcGxldGVseSB3cm9uZyBhbnN3ZXIgKi8KQEAgLTEyMCw3ICsxMjAsNyBAQAogc3RhdGljIGludCBrb25lcGx1c19nZXRfaW5mbyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKIAkJc3RydWN0IGtvbmVwbHVzX2luZm8gKmJ1ZikKIHsKLQlyZXR1cm4gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX0lORk8sCisJcmV0dXJuIHJvY2NhdF9jb21tb25fcmVjZWl2ZSh1c2JfZGV2LCBLT05FUExVU19DT01NQU5EX0lORk8sCiAJCQlidWYsIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfaW5mbykpOwogfQogCkBAIC0xMzQsMTQgKzEzNCwxNCBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlyZXR1cm4gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MsCisJcmV0dXJuIHJvY2NhdF9jb21tb25fcmVjZWl2ZSh1c2JfZGV2LCBLT05FUExVU19DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MsCiAJCQlidWYsIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpOwogfQogCiBzdGF0aWMgaW50IGtvbmVwbHVzX3NldF9wcm9maWxlX3NldHRpbmdzKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAogCQlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyBjb25zdCAqc2V0dGluZ3MpCiB7Ci0JcmV0dXJuIGtvbmVwbHVzX3NlbmQodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUywKKwlyZXR1cm4ga29uZXBsdXNfc2VuZCh1c2JfZGV2LCBLT05FUExVU19DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MsCiAJCQlzZXR0aW5ncywgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSk7CiB9CiAKQEAgLTE1NSwxNCArMTU1LDE0IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXJldHVybiByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9CVVRUT05TLAorCXJldHVybiByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfQ09NTUFORF9QUk9GSUxFX0JVVFRPTlMsCiAJCQlidWYsIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zKSk7CiB9CiAKIHN0YXRpYyBpbnQga29uZXBsdXNfc2V0X3Byb2ZpbGVfYnV0dG9ucyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKIAkJc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucyBjb25zdCAqYnV0dG9ucykKIHsKLQlyZXR1cm4ga29uZXBsdXNfc2VuZCh1c2JfZGV2LCBLT05FUExVU19VU0JfQ09NTUFORF9QUk9GSUxFX0JVVFRPTlMsCisJcmV0dXJuIGtvbmVwbHVzX3NlbmQodXNiX2RldiwgS09ORVBMVVNfQ09NTUFORF9QUk9GSUxFX0JVVFRPTlMsCiAJCQlidXR0b25zLCBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucykpOwogfQogCkBAIC0xNzIsNyArMTcyLDcgQEAKIAlzdHJ1Y3Qga29uZXBsdXNfYWN0dWFsX3Byb2ZpbGUgYnVmOwogCWludCByZXR2YWw7CiAKLQlyZXR2YWwgPSByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfQUNUVUFMX1BST0ZJTEUsCisJcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEtPTkVQTFVTX0NPTU1BTkRfQUNUVUFMX1BST0ZJTEUsCiAJCQkmYnVmLCBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX2FjdHVhbF9wcm9maWxlKSk7CiAKIAlyZXR1cm4gcmV0dmFsID8gcmV0dmFsIDogYnVmLmFjdHVhbF9wcm9maWxlOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJYnVmLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX2FjdHVhbF9wcm9maWxlKTsKIAlidWYuYWN0dWFsX3Byb2ZpbGUgPSBuZXdfcHJvZmlsZTsKIAotCXJldHVybiBrb25lcGx1c19zZW5kKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX0FDVFVBTF9QUk9GSUxFLAorCXJldHVybiBrb25lcGx1c19zZW5kKHVzYl9kZXYsIEtPTkVQTFVTX0NPTU1BTkRfQUNUVUFMX1BST0ZJTEUsCiAJCQkmYnVmLCBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX2FjdHVhbF9wcm9maWxlKSk7CiB9CiAKQEAgLTI0MCwxMiArMjQwLDIwIEBACiAJcmV0dXJuIHJlYWxfc2l6ZTsKIH0KIAorc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGVfdGFsayhzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGtvbmVwbHVzX3N5c2ZzX3dyaXRlKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3RhbGspLCBLT05FUExVU19DT01NQU5EX1RBTEspOworfQorCiBzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc193cml0ZV9tYWNybyhzdHJ1Y3QgZmlsZSAqZnAsCiAJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7CiAJcmV0dXJuIGtvbmVwbHVzX3N5c2ZzX3dyaXRlKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCi0JCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX21hY3JvKSwgS09ORVBMVVNfVVNCX0NPTU1BTkRfTUFDUk8pOworCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19tYWNybyksIEtPTkVQTFVTX0NPTU1BTkRfTUFDUk8pOwogfQogCiBzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc19yZWFkX3NlbnNvcihzdHJ1Y3QgZmlsZSAqZnAsCkBAIC0yNTMsNyArMjYxLDcgQEAKIAkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewogCXJldHVybiBrb25lcGx1c19zeXNmc19yZWFkKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCi0JCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3NlbnNvciksIEtPTkVQTFVTX1VTQl9DT01NQU5EX1NFTlNPUik7CisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3NlbnNvciksIEtPTkVQTFVTX0NPTU1BTkRfU0VOU09SKTsKIH0KIAogc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGVfc2Vuc29yKHN0cnVjdCBmaWxlICpmcCwKQEAgLTI2MSw3ICsyNjksNyBAQAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7CiAJcmV0dXJuIGtvbmVwbHVzX3N5c2ZzX3dyaXRlKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCi0JCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3NlbnNvciksIEtPTkVQTFVTX1VTQl9DT01NQU5EX1NFTlNPUik7CisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3NlbnNvciksIEtPTkVQTFVTX0NPTU1BTkRfU0VOU09SKTsKIH0KIAogc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGVfdGN1KHN0cnVjdCBmaWxlICpmcCwKQEAgLTI2OSw3ICsyNzcsNyBAQAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7CiAJcmV0dXJuIGtvbmVwbHVzX3N5c2ZzX3dyaXRlKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCi0JCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3RjdSksIEtPTkVQTFVTX1VTQl9DT01NQU5EX1RDVSk7CisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3RjdSksIEtPTkVQTFVTX0NPTU1BTkRfVENVKTsKIH0KIAogc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfcmVhZF90Y3VfaW1hZ2Uoc3RydWN0IGZpbGUgKmZwLApAQCAtMjc3LDcgKzI4NSw3IEBACiAJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKIAlyZXR1cm4ga29uZXBsdXNfc3lzZnNfcmVhZChmcCwga29iaiwgYnVmLCBvZmYsIGNvdW50LAotCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c190Y3VfaW1hZ2UpLCBLT05FUExVU19VU0JfQ09NTUFORF9UQ1UpOworCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c190Y3VfaW1hZ2UpLCBLT05FUExVU19DT01NQU5EX1RDVSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3Moc3RydWN0IGZpbGUgKmZwLApAQCAtNDIzLDYgKzQzMSw5IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAorCWlmIChwcm9maWxlID4gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAltdXRleF9sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CiAKIAlyZXR2YWwgPSBrb25lcGx1c19zZXRfYWN0dWFsX3Byb2ZpbGUodXNiX2RldiwgcHJvZmlsZSk7CkBAIC00MzEsNyArNDQyLDcgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlrb25lcGx1cy0+YWN0dWFsX3Byb2ZpbGUgPSBwcm9maWxlOworCWtvbmVwbHVzX3Byb2ZpbGVfYWN0aXZhdGVkKGtvbmVwbHVzLCBwcm9maWxlKTsKIAogCXJvY2NhdF9yZXBvcnQudHlwZSA9IEtPTkVQTFVTX01PVVNFX1JFUE9SVF9CVVRUT05fVFlQRV9QUk9GSUxFOwogCXJvY2NhdF9yZXBvcnQuZGF0YTEgPSBwcm9maWxlICsgMTsKQEAgLTU1Nyw2ICs1NjgsMTEgQEAKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX21hY3JvKSwKIAkJLndyaXRlID0ga29uZXBsdXNfc3lzZnNfd3JpdGVfbWFjcm8KIAl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInRhbGsiLCAubW9kZSA9IDAyMjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3RhbGspLAorCQkud3JpdGUgPSBrb25lcGx1c19zeXNmc193cml0ZV90YWxrCisJfSwKIAlfX0FUVFJfTlVMTAogfTsKIApAQCAtNzM4LDYgKzc1NCw5IEBACiAJCQkhPSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKQogCQlyZXR1cm4gMDsKIAorCWlmIChrb25lcGx1cyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwogCWtvbmVwbHVzX2tlZXBfdmFsdWVzX3VwX3RvX2RhdGUoa29uZXBsdXMsIGRhdGEpOwogCiAJaWYgKGtvbmVwbHVzLT5yb2NjYXRfY2xhaW1lZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZXBsdXMuaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZXBsdXMuaAppbmRleCBjNTdhMzc2Li5jMDMzMzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmVwbHVzLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lcGx1cy5oCkBAIC0xNCw2ICsxNCwxMiBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAorc3RydWN0IGtvbmVwbHVzX3RhbGsgeworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9UQUxLICovCisJdWludDhfdCBzaXplOyAvKiBhbHdheXMgMHgxMCAqLworCXVpbnQ4X3QgZGF0YVsxNF07Cit9IF9fcGFja2VkOworCiAvKgogICogY2FzZSAxOiB3cml0ZXMgcmVxdWVzdCA4MCBhbmQgcmVhZHMgdmFsdWUgMQogICoKQEAgLTEzNywyNiArMTQzLDE0IEBACiAJS09ORVBMVVNfQ09NTUFORF9QUk9GSUxFX0JVVFRPTlMgPSAweDcsCiAJS09ORVBMVVNfQ09NTUFORF9NQUNSTyA9IDB4OCwKIAlLT05FUExVU19DT01NQU5EX0lORk8gPSAweDksCisJS09ORVBMVVNfQ09NTUFORF9UQ1UgPSAweGMsCiAJS09ORVBMVVNfQ09NTUFORF9FID0gMHhlLAogCUtPTkVQTFVTX0NPTU1BTkRfU0VOU09SID0gMHhmLAorCUtPTkVQTFVTX0NPTU1BTkRfVEFMSyA9IDB4MTAsCiAJS09ORVBMVVNfQ09NTUFORF9GSVJNV0FSRV9XUklURSA9IDB4MWIsCiAJS09ORVBMVVNfQ09NTUFORF9GSVJNV0FSRV9XUklURV9DT05UUk9MID0gMHgxYywKIH07CiAKLWVudW0ga29uZXBsdXNfdXNiX2NvbW1hbmRzIHsKLQlLT05FUExVU19VU0JfQ09NTUFORF9DT05UUk9MID0gMHgzMDQsCi0JS09ORVBMVVNfVVNCX0NPTU1BTkRfQUNUVUFMX1BST0ZJTEUgPSAweDMwNSwKLQlLT05FUExVU19VU0JfQ09NTUFORF9QUk9GSUxFX1NFVFRJTkdTID0gMHgzMDYsCi0JS09ORVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9CVVRUT05TID0gMHgzMDcsCi0JS09ORVBMVVNfVVNCX0NPTU1BTkRfTUFDUk8gPSAweDMwOCwKLQlLT05FUExVU19VU0JfQ09NTUFORF9JTkZPID0gMHgzMDksCi0JS09ORVBMVVNfVVNCX0NPTU1BTkRfVENVID0gMHgzMGMsCi0JS09ORVBMVVNfVVNCX0NPTU1BTkRfRSA9IDB4MzBlLAotCUtPTkVQTFVTX1VTQl9DT01NQU5EX1NFTlNPUiA9IDB4MzBmLAotCUtPTkVQTFVTX1VTQl9DT01NQU5EX0ZJUk1XQVJFX1dSSVRFID0gMHgzMWIsCi0JS09ORVBMVVNfVVNCX0NPTU1BTkRfRklSTVdBUkVfV1JJVEVfQ09OVFJPTCA9IDB4MzFjLAotfTsKLQogZW51bSBrb25lcGx1c19tb3VzZV9yZXBvcnRfbnVtYmVycyB7CiAJS09ORVBMVVNfTU9VU0VfUkVQT1JUX05VTUJFUl9ISUQgPSAxLAogCUtPTkVQTFVTX01PVVNFX1JFUE9SVF9OVU1CRVJfQVVESU8gPSAyLApAQCAtMTkzLDYgKzE4Nyw3IEBACiAJICogZGF0YTIgPSBhY3Rpb24KIAkgKi8KIAlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX1RZUEVfTVVMVElNRURJQSA9IDB4ZjAsCisJS09ORVBMVVNfTU9VU0VfUkVQT1JUX1RBTEsgPSAweGZmLAogfTsKIAogZW51bSBrb25lcGx1c19tb3VzZV9yZXBvcnRfYnV0dG9uX2FjdGlvbiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvdmFwbHVzLmMgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvdmFwbHVzLmMKaW5kZXggOTg0YmUyZi4uMWY4MzM2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb3ZhcGx1cy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta292YXBsdXMuYwpAQCAtNTgsNyArNTgsNyBAQAogCWNvbnRyb2wudmFsdWUgPSB2YWx1ZTsKIAljb250cm9sLnJlcXVlc3QgPSByZXF1ZXN0OwogCi0JcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9zZW5kKHVzYl9kZXYsIEtPVkFQTFVTX1VTQl9DT01NQU5EX0NPTlRST0wsCisJcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9zZW5kKHVzYl9kZXYsIEtPVkFQTFVTX0NPTU1BTkRfQ09OVFJPTCwKIAkJCSZjb250cm9sLCBzaXplb2Yoc3RydWN0IGtvdmFwbHVzX2NvbnRyb2wpKTsKIAogCXJldHVybiByZXR2YWw7CkBAIC03MCw3ICs3MCw3IEBACiAJc3RydWN0IGtvdmFwbHVzX2NvbnRyb2wgY29udHJvbDsKIAogCWRvIHsKLQkJcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEtPVkFQTFVTX1VTQl9DT01NQU5EX0NPTlRST0wsCisJCXJldHZhbCA9IHJvY2NhdF9jb21tb25fcmVjZWl2ZSh1c2JfZGV2LCBLT1ZBUExVU19DT01NQU5EX0NPTlRST0wsCiAJCQkJJmNvbnRyb2wsIHNpemVvZihzdHJ1Y3Qga292YXBsdXNfY29udHJvbCkpOwogCiAJCS8qIGNoZWNrIGlmIHdlIGdldCBhIGNvbXBsZXRlbHkgd3JvbmcgYW5zd2VyICovCkBAIC05MCw3ICs5MCw3IEBACiAJCWlmIChjb250cm9sLnZhbHVlID09IEtPVkFQTFVTX0NPTlRST0xfUkVRVUVTVF9TVEFUVVNfT1ZFUkxPQUQpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQloaWRfZXJyKHVzYl9kZXYsICJrb3ZhcGx1c19yZWNlaXZlX2NvbnRyb2xfc3RhdHVzOiAiCisJCWhpZF9lcnIodXNiX2RldiwgInJvY2NhdF9jb21tb25fcmVjZWl2ZV9jb250cm9sX3N0YXR1czogIgogCQkJCSJ1bmtub3duIHJlc3BvbnNlIHZhbHVlIDB4JXhcbiIsIGNvbnRyb2wudmFsdWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9IHdoaWxlICgxKTsKQEAgLTExOSw3ICsxMTksNyBAQAogc3RhdGljIGludCBrb3ZhcGx1c19nZXRfaW5mbyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKIAkJc3RydWN0IGtvdmFwbHVzX2luZm8gKmJ1ZikKIHsKLQlyZXR1cm4gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEtPVkFQTFVTX1VTQl9DT01NQU5EX0lORk8sCisJcmV0dXJuIHJvY2NhdF9jb21tb25fcmVjZWl2ZSh1c2JfZGV2LCBLT1ZBUExVU19DT01NQU5EX0lORk8sCiAJCQlidWYsIHNpemVvZihzdHJ1Y3Qga292YXBsdXNfaW5mbykpOwogfQogCkBAIC0xMzMsMTQgKzEzMywxNCBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlyZXR1cm4gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEtPVkFQTFVTX1VTQl9DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MsCisJcmV0dXJuIHJvY2NhdF9jb21tb25fcmVjZWl2ZSh1c2JfZGV2LCBLT1ZBUExVU19DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MsCiAJCQlidWYsIHNpemVvZihzdHJ1Y3Qga292YXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpOwogfQogCiBzdGF0aWMgaW50IGtvdmFwbHVzX3NldF9wcm9maWxlX3NldHRpbmdzKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAogCQlzdHJ1Y3Qga292YXBsdXNfcHJvZmlsZV9zZXR0aW5ncyBjb25zdCAqc2V0dGluZ3MpCiB7Ci0JcmV0dXJuIGtvdmFwbHVzX3NlbmQodXNiX2RldiwgS09WQVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUywKKwlyZXR1cm4ga292YXBsdXNfc2VuZCh1c2JfZGV2LCBLT1ZBUExVU19DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MsCiAJCQlzZXR0aW5ncywgc2l6ZW9mKHN0cnVjdCBrb3ZhcGx1c19wcm9maWxlX3NldHRpbmdzKSk7CiB9CiAKQEAgLTE1NCwxNCArMTU0LDE0IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXJldHVybiByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgS09WQVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9CVVRUT05TLAorCXJldHVybiByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgS09WQVBMVVNfQ09NTUFORF9QUk9GSUxFX0JVVFRPTlMsCiAJCQlidWYsIHNpemVvZihzdHJ1Y3Qga292YXBsdXNfcHJvZmlsZV9idXR0b25zKSk7CiB9CiAKIHN0YXRpYyBpbnQga292YXBsdXNfc2V0X3Byb2ZpbGVfYnV0dG9ucyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKIAkJc3RydWN0IGtvdmFwbHVzX3Byb2ZpbGVfYnV0dG9ucyBjb25zdCAqYnV0dG9ucykKIHsKLQlyZXR1cm4ga292YXBsdXNfc2VuZCh1c2JfZGV2LCBLT1ZBUExVU19VU0JfQ09NTUFORF9QUk9GSUxFX0JVVFRPTlMsCisJcmV0dXJuIGtvdmFwbHVzX3NlbmQodXNiX2RldiwgS09WQVBMVVNfQ09NTUFORF9QUk9GSUxFX0JVVFRPTlMsCiAJCQlidXR0b25zLCBzaXplb2Yoc3RydWN0IGtvdmFwbHVzX3Byb2ZpbGVfYnV0dG9ucykpOwogfQogCkBAIC0xNzEsNyArMTcxLDcgQEAKIAlzdHJ1Y3Qga292YXBsdXNfYWN0dWFsX3Byb2ZpbGUgYnVmOwogCWludCByZXR2YWw7CiAKLQlyZXR2YWwgPSByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgS09WQVBMVVNfVVNCX0NPTU1BTkRfQUNUVUFMX1BST0ZJTEUsCisJcmV0dmFsID0gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIEtPVkFQTFVTX0NPTU1BTkRfQUNUVUFMX1BST0ZJTEUsCiAJCQkmYnVmLCBzaXplb2Yoc3RydWN0IGtvdmFwbHVzX2FjdHVhbF9wcm9maWxlKSk7CiAKIAlyZXR1cm4gcmV0dmFsID8gcmV0dmFsIDogYnVmLmFjdHVhbF9wcm9maWxlOwpAQCAtMTg2LDcgKzE4Niw3IEBACiAJYnVmLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvdmFwbHVzX2FjdHVhbF9wcm9maWxlKTsKIAlidWYuYWN0dWFsX3Byb2ZpbGUgPSBuZXdfcHJvZmlsZTsKIAotCXJldHVybiBrb3ZhcGx1c19zZW5kKHVzYl9kZXYsIEtPVkFQTFVTX1VTQl9DT01NQU5EX0FDVFVBTF9QUk9GSUxFLAorCXJldHVybiBrb3ZhcGx1c19zZW5kKHVzYl9kZXYsIEtPVkFQTFVTX0NPTU1BTkRfQUNUVUFMX1BST0ZJTEUsCiAJCQkmYnVmLCBzaXplb2Yoc3RydWN0IGtvdmFwbHVzX2FjdHVhbF9wcm9maWxlKSk7CiB9CiAKQEAgLTMzNyw3ICszMzcsNyBAQAogCiAJbXV0ZXhfbG9jaygma292YXBsdXMtPmtvdmFwbHVzX2xvY2spOwogCXJldHZhbCA9IGtvdmFwbHVzX3NldF9hY3R1YWxfcHJvZmlsZSh1c2JfZGV2LCBwcm9maWxlKTsKLQlrb3ZhcGx1cy0+YWN0dWFsX3Byb2ZpbGUgPSBwcm9maWxlOworCWtvdmFwbHVzX3Byb2ZpbGVfYWN0aXZhdGVkKGtvdmFwbHVzLCBwcm9maWxlKTsKIAltdXRleF91bmxvY2soJmtvdmFwbHVzLT5rb3ZhcGx1c19sb2NrKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtNjYyLDYgKzY2Miw5IEBACiAJCQkhPSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKQogCQlyZXR1cm4gMDsKIAorCWlmIChrb3ZhcGx1cyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwogCWtvdmFwbHVzX2tlZXBfdmFsdWVzX3VwX3RvX2RhdGUoa292YXBsdXMsIGRhdGEpOwogCiAJaWYgKGtvdmFwbHVzLT5yb2NjYXRfY2xhaW1lZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta292YXBsdXMuaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta292YXBsdXMuaAppbmRleCBjZTQwNjA3Li5mYjJhZWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvdmFwbHVzLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb3ZhcGx1cy5oCkBAIC04MywxNSArODMsNiBAQAogCUtPVkFQTFVTX0NPTU1BTkRfQSA9IDB4YSwKIH07CiAKLWVudW0ga292YXBsdXNfdXNiX2NvbW1hbmRzIHsKLQlLT1ZBUExVU19VU0JfQ09NTUFORF9DT05UUk9MID0gMHgzMDQsCi0JS09WQVBMVVNfVVNCX0NPTU1BTkRfQUNUVUFMX1BST0ZJTEUgPSAweDMwNSwKLQlLT1ZBUExVU19VU0JfQ09NTUFORF9QUk9GSUxFX1NFVFRJTkdTID0gMHgzMDYsCi0JS09WQVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9CVVRUT05TID0gMHgzMDcsCi0JS09WQVBMVVNfVVNCX0NPTU1BTkRfSU5GTyA9IDB4MzA5LAotCUtPVkFQTFVTX1VTQl9DT01NQU5EX0EgPSAweDMwYSwKLX07Ci0KIGVudW0ga292YXBsdXNfbW91c2VfcmVwb3J0X251bWJlcnMgewogCUtPVkFQTFVTX01PVVNFX1JFUE9SVF9OVU1CRVJfTU9VU0UgPSAxLAogCUtPVkFQTFVTX01PVVNFX1JFUE9SVF9OVU1CRVJfQVVESU8gPSAyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1weXJhLmMgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuYwppbmRleCAzODI4MGMwLi44MTQwNzc2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1weXJhLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1weXJhLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAljb250cm9sLnZhbHVlID0gdmFsdWU7CiAJY29udHJvbC5yZXF1ZXN0ID0gcmVxdWVzdDsKIAotCXJldHVybiByb2NjYXRfY29tbW9uX3NlbmQodXNiX2RldiwgUFlSQV9VU0JfQ09NTUFORF9DT05UUk9MLAorCXJldHVybiByb2NjYXRfY29tbW9uX3NlbmQodXNiX2RldiwgUFlSQV9DT01NQU5EX0NPTlRST0wsCiAJCQkmY29udHJvbCwgc2l6ZW9mKHN0cnVjdCBweXJhX2NvbnRyb2wpKTsKIH0KIApAQCAtNjQsNyArNjQsNyBAQAogCiAJZG8gewogCQltc2xlZXAoMTApOwotCQlyZXR2YWwgPSByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgUFlSQV9VU0JfQ09NTUFORF9DT05UUk9MLAorCQlyZXR2YWwgPSByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgUFlSQV9DT01NQU5EX0NPTlRST0wsCiAJCQkJJmNvbnRyb2wsIHNpemVvZihzdHJ1Y3QgcHlyYV9jb250cm9sKSk7CiAKIAkJLyogcmVxdWVzdGVkIHRvbyBlYXJseSwgdHJ5IGFnYWluICovCkBAIC04OSw3ICs4OSw3IEBACiAJCQlQWVJBX0NPTlRST0xfUkVRVUVTVF9QUk9GSUxFX1NFVFRJTkdTKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwotCXJldHVybiByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgUFlSQV9VU0JfQ09NTUFORF9QUk9GSUxFX1NFVFRJTkdTLAorCXJldHVybiByb2NjYXRfY29tbW9uX3JlY2VpdmUodXNiX2RldiwgUFlSQV9DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MsCiAJCQlidWYsIHNpemVvZihzdHJ1Y3QgcHlyYV9wcm9maWxlX3NldHRpbmdzKSk7CiB9CiAKQEAgLTEwMSwyMCArMTAxLDIwIEBACiAJCQlQWVJBX0NPTlRST0xfUkVRVUVTVF9QUk9GSUxFX0JVVFRPTlMpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7Ci0JcmV0dXJuIHJvY2NhdF9jb21tb25fcmVjZWl2ZSh1c2JfZGV2LCBQWVJBX1VTQl9DT01NQU5EX1BST0ZJTEVfQlVUVE9OUywKKwlyZXR1cm4gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIFBZUkFfQ09NTUFORF9QUk9GSUxFX0JVVFRPTlMsCiAJCQlidWYsIHNpemVvZihzdHJ1Y3QgcHlyYV9wcm9maWxlX2J1dHRvbnMpKTsKIH0KIAogc3RhdGljIGludCBweXJhX2dldF9zZXR0aW5ncyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKIAkJc3RydWN0IHB5cmFfc2V0dGluZ3MgKmJ1ZikKIHsKLQlyZXR1cm4gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIFBZUkFfVVNCX0NPTU1BTkRfU0VUVElOR1MsCisJcmV0dXJuIHJvY2NhdF9jb21tb25fcmVjZWl2ZSh1c2JfZGV2LCBQWVJBX0NPTU1BTkRfU0VUVElOR1MsCiAJCQlidWYsIHNpemVvZihzdHJ1Y3QgcHlyYV9zZXR0aW5ncykpOwogfQogCiBzdGF0aWMgaW50IHB5cmFfZ2V0X2luZm8oc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHN0cnVjdCBweXJhX2luZm8gKmJ1ZikKIHsKLQlyZXR1cm4gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIFBZUkFfVVNCX0NPTU1BTkRfSU5GTywKKwlyZXR1cm4gcm9jY2F0X2NvbW1vbl9yZWNlaXZlKHVzYl9kZXYsIFBZUkFfQ09NTUFORF9JTkZPLAogCQkJYnVmLCBzaXplb2Yoc3RydWN0IHB5cmFfaW5mbykpOwogfQogCkBAIC0xMzEsMjYgKzEzMSwyMiBAQAogc3RhdGljIGludCBweXJhX3NldF9wcm9maWxlX3NldHRpbmdzKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAogCQlzdHJ1Y3QgcHlyYV9wcm9maWxlX3NldHRpbmdzIGNvbnN0ICpzZXR0aW5ncykKIHsKLQlyZXR1cm4gcHlyYV9zZW5kKHVzYl9kZXYsIFBZUkFfVVNCX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUywgc2V0dGluZ3MsCisJcmV0dXJuIHB5cmFfc2VuZCh1c2JfZGV2LCBQWVJBX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUywgc2V0dGluZ3MsCiAJCQlzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncykpOwogfQogCiBzdGF0aWMgaW50IHB5cmFfc2V0X3Byb2ZpbGVfYnV0dG9ucyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKIAkJc3RydWN0IHB5cmFfcHJvZmlsZV9idXR0b25zIGNvbnN0ICpidXR0b25zKQogewotCXJldHVybiBweXJhX3NlbmQodXNiX2RldiwgUFlSQV9VU0JfQ09NTUFORF9QUk9GSUxFX0JVVFRPTlMsIGJ1dHRvbnMsCisJcmV0dXJuIHB5cmFfc2VuZCh1c2JfZGV2LCBQWVJBX0NPTU1BTkRfUFJPRklMRV9CVVRUT05TLCBidXR0b25zLAogCQkJc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucykpOwogfQogCiBzdGF0aWMgaW50IHB5cmFfc2V0X3NldHRpbmdzKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAogCQlzdHJ1Y3QgcHlyYV9zZXR0aW5ncyBjb25zdCAqc2V0dGluZ3MpCiB7Ci0JaW50IHJldHZhbDsKLQlyZXR2YWwgPSByb2NjYXRfY29tbW9uX3NlbmQodXNiX2RldiwgUFlSQV9VU0JfQ09NTUFORF9TRVRUSU5HUywgc2V0dGluZ3MsCisJcmV0dXJuIHB5cmFfc2VuZCh1c2JfZGV2LCBQWVJBX0NPTU1BTkRfU0VUVElOR1MsIHNldHRpbmdzLAogCQkJc2l6ZW9mKHN0cnVjdCBweXJhX3NldHRpbmdzKSk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQlyZXR1cm4gcHlyYV9yZWNlaXZlX2NvbnRyb2xfc3RhdHVzKHVzYl9kZXYpOwogfQogCiBzdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3Moc3RydWN0IGZpbGUgKmZwLApAQCAtNjQxLDYgKzYzNyw5IEBACiAJCQkhPSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKQogCQlyZXR1cm4gMDsKIAorCWlmIChweXJhID09IE5VTEwpCisJCXJldHVybiAwOworCiAJcHlyYV9rZWVwX3ZhbHVlc191cF90b19kYXRlKHB5cmEsIGRhdGEpOwogCiAJaWYgKHB5cmEtPnJvY2NhdF9jbGFpbWVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1weXJhLmggYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuaAppbmRleCAxNGNiYmUxLi4wNDQyZDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuaApAQCAtODMsMTUgKzgzLDYgQEAKIAlQWVJBX0NPTU1BTkRfQiA9IDB4YgogfTsKIAotZW51bSBweXJhX3VzYl9jb21tYW5kcyB7Ci0JUFlSQV9VU0JfQ09NTUFORF9DT05UUk9MID0gMHgzMDQsCi0JUFlSQV9VU0JfQ09NTUFORF9TRVRUSU5HUyA9IDB4MzA1LAotCVBZUkFfVVNCX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUyA9IDB4MzA2LAotCVBZUkFfVVNCX0NPTU1BTkRfUFJPRklMRV9CVVRUT05TID0gMHgzMDcsCi0JUFlSQV9VU0JfQ09NTUFORF9JTkZPID0gMHgzMDksCi0JUFlSQV9VU0JfQ09NTUFORF9CID0gMHgzMGIgLyogd3JpdGVzIDMgYnl0ZXMgKi8KLX07Ci0KIGVudW0gcHlyYV9tb3VzZV9yZXBvcnRfbnVtYmVycyB7CiAJUFlSQV9NT1VTRV9SRVBPUlRfTlVNQkVSX0hJRCA9IDEsCiAJUFlSQV9NT1VTRV9SRVBPUlRfTlVNQkVSX0FVRElPID0gMiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zb255LmMgYi9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCmluZGV4IDkzNmM5MTEuLjVjZDI1YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1zb255LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXNvbnkuYwpAQCAtMjgsNiArMjgsMTIgQEAKICNkZWZpbmUgU0lYQVhJU19DT05UUk9MTEVSX1VTQiAgKDEgPDwgMSkKICNkZWZpbmUgU0lYQVhJU19DT05UUk9MTEVSX0JUICAgKDEgPDwgMikKIAorc3RhdGljIGNvbnN0IHU4IHNpeGF4aXNfcmRlc2NfZml4dXBbXSA9IHsKKwkweDk1LCAweDEzLCAweDA5LCAweDAxLCAweDgxLCAweDAyLCAweDk1LCAweDBDLAorCTB4ODEsIDB4MDEsIDB4NzUsIDB4MTAsIDB4OTUsIDB4MDQsIDB4MjYsIDB4RkYsCisJMHgwMywgMHg0NiwgMHhGRiwgMHgwMywgMHgwOSwgMHgwMSwgMHg4MSwgMHgwMgorfTsKKwogc3RydWN0IHNvbnlfc2MgewogCXVuc2lnbmVkIGxvbmcgcXVpcmtzOwogfTsKQEAgLTQzLDkgKzQ5LDM3IEBACiAJCWhpZF9pbmZvKGhkZXYsICJGaXhpbmcgdXAgU29ueSBWYWlvIFZHWCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzU1XSA9IDB4MDY7CiAJfQorCisJLyogVGhlIEhJRCBkZXNjcmlwdG9yIGV4cG9zZWQgb3ZlciBCVCBoYXMgYSB0cmFpbGluZyB6ZXJvIGJ5dGUgKi8KKwlpZiAoKCgoc2MtPnF1aXJrcyAmIFNJWEFYSVNfQ09OVFJPTExFUl9VU0IpICYmICpyc2l6ZSA9PSAxNDgpIHx8CisJCQkoKHNjLT5xdWlya3MgJiBTSVhBWElTX0NPTlRST0xMRVJfQlQpICYmICpyc2l6ZSA9PSAxNDkpKSAmJgorCQkJcmRlc2NbODNdID09IDB4NzUpIHsKKwkJaGlkX2luZm8oaGRldiwgIkZpeGluZyB1cCBTb255IFNpeGF4aXMgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOworCQltZW1jcHkoKHZvaWQgKikmcmRlc2NbODNdLCAodm9pZCAqKSZzaXhheGlzX3JkZXNjX2ZpeHVwLAorCQkJc2l6ZW9mKHNpeGF4aXNfcmRlc2NfZml4dXApKTsKKwl9CiAJcmV0dXJuIHJkZXNjOwogfQogCitzdGF0aWMgaW50IHNvbnlfcmF3X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0LAorCQlfX3U4ICpyZCwgaW50IHNpemUpCit7CisJc3RydWN0IHNvbnlfc2MgKnNjID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCisJLyogU2l4YXhpcyBISUQgcmVwb3J0IGhhcyBhY2NsZXJvbWV0ZXJzL2d5cm8gd2l0aCBNU0J5dGUgZmlyc3QsIHRoaXMKKwkgKiBoYXMgdG8gYmUgQllURV9TV0FQUEVEIGJlZm9yZSBwYXNzaW5nIHVwIHRvIGpveXN0aWNrIGludGVyZmFjZQorCSAqLworCWlmICgoc2MtPnF1aXJrcyAmIChTSVhBWElTX0NPTlRST0xMRVJfVVNCIHwgU0lYQVhJU19DT05UUk9MTEVSX0JUKSkgJiYKKwkJCXJkWzBdID09IDB4MDEgJiYgc2l6ZSA9PSA0OSkgeworCQlzd2FwKHJkWzQxXSwgcmRbNDJdKTsKKwkJc3dhcChyZFs0M10sIHJkWzQ0XSk7CisJCXN3YXAocmRbNDVdLCByZFs0Nl0pOworCQlzd2FwKHJkWzQ3XSwgcmRbNDhdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFRoZSBTb255IFNpeGF4aXMgZG9lcyBub3QgaGFuZGxlIEhJRCBPdXRwdXQgUmVwb3J0cyBvbiB0aGUgSW50ZXJydXB0IEVQCiAgKiBsaWtlIGl0IHNob3VsZCBhY2NvcmRpbmcgdG8gdXNiaGlkL2hpZC1jb3JlLmM6OnVzYmhpZF9vdXRwdXRfcmF3X3JlcG9ydCgpCkBAIC0xOTQsNiArMjI4LDcgQEAKIAkucHJvYmUgPSBzb255X3Byb2JlLAogCS5yZW1vdmUgPSBzb255X3JlbW92ZSwKIAkucmVwb3J0X2ZpeHVwID0gc29ueV9yZXBvcnRfZml4dXAsCisJLnJhd19ldmVudCA9IHNvbnlfcmF3X2V2ZW50CiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzb255X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zcGVlZGxpbmsuYyBiL2RyaXZlcnMvaGlkL2hpZC1zcGVlZGxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDIwMTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLXNwZWVkbGluay5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiAgSElEIGRyaXZlciBmb3IgU3BlZWRsaW5rIFZpY2lvdXMgYW5kIERpdmluZSBDZXphbm5lIChVU0IgbW91c2UpLgorICogIEZpeGVzICJqdW1weSIgY3Vyc29yIGFuZCByZW1vdmVzIG5vbmV4aXN0ZW50IGtleWJvYXJkIExFRFMgZnJvbQorICogIHRoZSBISUQgZGVzY3JpcHRvci4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIFN0ZWZhbiBLcml3YW5layA8bWFpbEBzdGVmYW5rcml3YW5lay5kZT4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisjaW5jbHVkZSAidXNiaGlkL3VzYmhpZC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgc3BlZWRsaW5rX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfWF9URU5TSU9OUywgVVNCX0RFVklDRV9JRF9TUEVFRExJTktfVkFEX0NFWkFOTkUpfSwKKwl7IH0KK307CisKK3N0YXRpYyBpbnQgc3BlZWRsaW5rX2lucHV0X21hcHBpbmcoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCisJCXN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCS8qCisJICogVGhlIENlemFubmUgbW91c2UgaGFzIGEgc2Vjb25kICJrZXlib2FyZCIgVVNCIGVuZHBvaW50IGZvciBpdCBpcworCSAqIGFibGUgdG8gbWFwIGtleWJvYXJkIGV2ZW50cyB0byB0aGUgYnV0dG9uIHByZXNzZXMuCisJICogSXQgc2VuZHMgYSBzdGFuZGFyZCBrZXlib2FyZCByZXBvcnQgZGVzY3JpcHRvciwgdGhvdWdoLCB3aG9zZQorCSAqIExFRHMgd2UgaWdub3JlLgorCSAqLworCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSB7CisJY2FzZSBISURfVVBfTEVEOgorCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwZWVkbGlua19ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCisJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKK3sKKwkvKiBObyBvdGhlciBjb25kaXRpb25zIGR1ZSB0byB1c2FnZV90YWJsZS4gKi8KKwkvKiBGaXggImp1bXB5IiBjdXJzb3IgKGludmFsaWQgZXZlbnRzIHNlbnQgYnkgZGV2aWNlKS4gKi8KKwlpZiAodmFsdWUgPT0gMjU2KQorCQlyZXR1cm4gMTsKKwkvKiBEcm9wIHVzZWxlc3MgZGlzdGFuY2UgMCBldmVudHMgKG9uIGJ1dHRvbiBjbGlja3MgZXRjLikgYXMgd2VsbCAqLworCWlmICh2YWx1ZSA9PSAwKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgc3BlZWRsaW5rX2RldmljZXMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF91c2FnZV9pZCBzcGVlZGxpbmtfZ3JhYmJlZF91c2FnZXNbXSA9IHsKKwl7IEhJRF9HRF9YLCBFVl9SRUwsIDAgfSwKKwl7IEhJRF9HRF9ZLCBFVl9SRUwsIDEgfSwKKwl7IEhJRF9BTllfSUQgLSAxLCBISURfQU5ZX0lEIC0gMSwgSElEX0FOWV9JRCAtIDF9Cit9OworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgc3BlZWRsaW5rX2RyaXZlciA9IHsKKwkubmFtZSA9ICJzcGVlZGxpbmsiLAorCS5pZF90YWJsZSA9IHNwZWVkbGlua19kZXZpY2VzLAorCS51c2FnZV90YWJsZSA9IHNwZWVkbGlua19ncmFiYmVkX3VzYWdlcywKKwkuaW5wdXRfbWFwcGluZyA9IHNwZWVkbGlua19pbnB1dF9tYXBwaW5nLAorCS5ldmVudCA9IHNwZWVkbGlua19ldmVudCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNwZWVkbGlua19pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnNwZWVkbGlua19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BlZWRsaW5rX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJnNwZWVkbGlua19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzcGVlZGxpbmtfaW5pdCk7Cittb2R1bGVfZXhpdChzcGVlZGxpbmtfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtdWNsb2dpYy5jIGIvZHJpdmVycy9oaWQvaGlkLXVjbG9naWMuYwppbmRleCAwNWZkYzg1YS4uZTE1NzMyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXVjbG9naWMuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtdWNsb2dpYy5jCkBAIC0zNDMsNiArMzQzLDE5MyBAQAogfTsKIAogLyoKKyAqIE9yaWdpbmFsIFdQMTA2MiByZXBvcnQgZGVzY3JpcHRvci4KKyAqCisgKiBPbmx5IHJlcG9ydCBJRCA5IGlzIGFjdHVhbGx5IHVzZWQuCisgKgorICogIFVzYWdlIFBhZ2UgKERpZ2l0aXplciksICAgICAgICAgOyBEaWdpdGl6ZXIgKDBEaCkKKyAqICBVc2FnZSAoUGVuKSwgICAgICAgICAgICAgICAgICAgIDsgUGVuICgwMmgsIGFwcGxpY2F0aW9uIGNvbGxlY3Rpb24pCisgKiAgQ29sbGVjdGlvbiAoQXBwbGljYXRpb24pLAorICogICAgUmVwb3J0IElEICg3KSwKKyAqICAgIFVzYWdlIChTdHlsdXMpLCAgICAgICAgICAgICAgIDsgU3R5bHVzICgyMGgsIGxvZ2ljYWwgY29sbGVjdGlvbikKKyAqICAgIENvbGxlY3Rpb24gKFBoeXNpY2FsKSwKKyAqICAgICAgVXNhZ2UgKFRpcCBTd2l0Y2gpLCAgICAgICAgIDsgVGlwIHN3aXRjaCAoNDJoLCBtb21lbnRhcnkgY29udHJvbCkKKyAqICAgICAgVXNhZ2UgKEJhcnJlbCBTd2l0Y2gpLCAgICAgIDsgQmFycmVsIHN3aXRjaCAoNDRoLCBtb21lbnRhcnkgY29udHJvbCkKKyAqICAgICAgVXNhZ2UgKEVyYXNlciksICAgICAgICAgICAgIDsgRXJhc2VyICg0NWgsIG1vbWVudGFyeSBjb250cm9sKQorICogICAgICBMb2dpY2FsIE1pbmltdW0gKDApLAorICogICAgICBMb2dpY2FsIE1heGltdW0gKDEpLAorICogICAgICBSZXBvcnQgU2l6ZSAoMSksCisgKiAgICAgIFJlcG9ydCBDb3VudCAoMyksCisgKiAgICAgIElucHV0IChWYXJpYWJsZSksCisgKiAgICAgIFJlcG9ydCBDb3VudCAoMyksCisgKiAgICAgIElucHV0IChDb25zdGFudCwgVmFyaWFibGUpLAorICogICAgICBVc2FnZSAoSW4gUmFuZ2UpLCAgICAgICAgICAgOyBJbiByYW5nZSAoMzJoLCBtb21lbnRhcnkgY29udHJvbCkKKyAqICAgICAgUmVwb3J0IENvdW50ICgxKSwKKyAqICAgICAgSW5wdXQgKFZhcmlhYmxlKSwKKyAqICAgICAgUmVwb3J0IENvdW50ICgxKSwKKyAqICAgICAgSW5wdXQgKENvbnN0YW50LCBWYXJpYWJsZSksCisgKiAgICAgIFVzYWdlIFBhZ2UgKERlc2t0b3ApLCAgICAgICA7IEdlbmVyaWMgZGVza3RvcCBjb250cm9scyAoMDFoKQorICogICAgICBVc2FnZSAoWCksICAgICAgICAgICAgICAgICAgOyBYICgzMGgsIGR5bmFtaWMgdmFsdWUpCisgKiAgICAgIFJlcG9ydCBTaXplICgxNiksCisgKiAgICAgIFJlcG9ydCBDb3VudCAoMSksCisgKiAgICAgIFB1c2gsCisgKiAgICAgIFVuaXQgRXhwb25lbnQgKDEzKSwKKyAqICAgICAgVW5pdCAoSW5jaCksCisgKiAgICAgIFBoeXNpY2FsIE1pbmltdW0gKDApLAorICogICAgICBQaHlzaWNhbCBNYXhpbXVtICgxMDAwMCksCisgKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoMjAwMDApLAorICogICAgICBJbnB1dCAoVmFyaWFibGUpLAorICogICAgICBVc2FnZSAoWSksICAgICAgICAgICAgICAgICAgOyBZICgzMWgsIGR5bmFtaWMgdmFsdWUpCisgKiAgICAgIFBoeXNpY2FsIE1heGltdW0gKDY1ODMpLAorICogICAgICBMb2dpY2FsIE1heGltdW0gKDEzMTY2KSwKKyAqICAgICAgSW5wdXQgKFZhcmlhYmxlKSwKKyAqICAgICAgUG9wLAorICogICAgICBVc2FnZSBQYWdlIChEaWdpdGl6ZXIpLCAgICAgOyBEaWdpdGl6ZXIgKDBEaCkKKyAqICAgICAgVXNhZ2UgKFRpcCBQcmVzc3VyZSksICAgICAgIDsgVGlwIHByZXNzdXJlICgzMGgsIGR5bmFtaWMgdmFsdWUpCisgKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoMTAyMyksCisgKiAgICAgIElucHV0IChWYXJpYWJsZSksCisgKiAgICAgIFJlcG9ydCBTaXplICgxNiksCisgKiAgICBFbmQgQ29sbGVjdGlvbiwKKyAqICBFbmQgQ29sbGVjdGlvbiwKKyAqICBVc2FnZSBQYWdlIChEZXNrdG9wKSwgICAgICAgICAgIDsgR2VuZXJpYyBkZXNrdG9wIGNvbnRyb2xzICgwMWgpCisgKiAgVXNhZ2UgKE1vdXNlKSwgICAgICAgICAgICAgICAgICA7IE1vdXNlICgwMmgsIGFwcGxpY2F0aW9uIGNvbGxlY3Rpb24pCisgKiAgQ29sbGVjdGlvbiAoQXBwbGljYXRpb24pLAorICogICAgUmVwb3J0IElEICg4KSwKKyAqICAgIFVzYWdlIChQb2ludGVyKSwgICAgICAgICAgICAgIDsgUG9pbnRlciAoMDFoLCBwaHlzaWNhbCBjb2xsZWN0aW9uKQorICogICAgQ29sbGVjdGlvbiAoUGh5c2ljYWwpLAorICogICAgICBVc2FnZSBQYWdlIChCdXR0b24pLCAgICAgICAgOyBCdXR0b24gKDA5aCkKKyAqICAgICAgVXNhZ2UgTWluaW11bSAoMDFoKSwKKyAqICAgICAgVXNhZ2UgTWF4aW11bSAoMDNoKSwKKyAqICAgICAgTG9naWNhbCBNaW5pbXVtICgwKSwKKyAqICAgICAgTG9naWNhbCBNYXhpbXVtICgxKSwKKyAqICAgICAgUmVwb3J0IENvdW50ICgzKSwKKyAqICAgICAgUmVwb3J0IFNpemUgKDEpLAorICogICAgICBJbnB1dCAoVmFyaWFibGUpLAorICogICAgICBSZXBvcnQgQ291bnQgKDUpLAorICogICAgICBJbnB1dCAoQ29uc3RhbnQpLAorICogICAgICBVc2FnZSBQYWdlIChEZXNrdG9wKSwgICAgICAgOyBHZW5lcmljIGRlc2t0b3AgY29udHJvbHMgKDAxaCkKKyAqICAgICAgVXNhZ2UgKFgpLCAgICAgICAgICAgICAgICAgIDsgWCAoMzBoLCBkeW5hbWljIHZhbHVlKQorICogICAgICBVc2FnZSAoWSksICAgICAgICAgICAgICAgICAgOyBZICgzMWgsIGR5bmFtaWMgdmFsdWUpCisgKiAgICAgIFVzYWdlIChXaGVlbCksICAgICAgICAgICAgICA7IFdoZWVsICgzOGgsIGR5bmFtaWMgdmFsdWUpCisgKiAgICAgIFVzYWdlICgwMGgpLAorICogICAgICBMb2dpY2FsIE1pbmltdW0gKC0xMjcpLAorICogICAgICBMb2dpY2FsIE1heGltdW0gKDEyNyksCisgKiAgICAgIFJlcG9ydCBTaXplICg4KSwKKyAqICAgICAgUmVwb3J0IENvdW50ICg0KSwKKyAqICAgICAgSW5wdXQgKFZhcmlhYmxlLCBSZWxhdGl2ZSksCisgKiAgICBFbmQgQ29sbGVjdGlvbiwKKyAqICBFbmQgQ29sbGVjdGlvbiwKKyAqICBVc2FnZSBQYWdlIChEZXNrdG9wKSwgICAgICAgICAgIDsgR2VuZXJpYyBkZXNrdG9wIGNvbnRyb2xzICgwMWgpCisgKiAgVXNhZ2UgKE1vdXNlKSwgICAgICAgICAgICAgICAgICA7IE1vdXNlICgwMmgsIGFwcGxpY2F0aW9uIGNvbGxlY3Rpb24pCisgKiAgQ29sbGVjdGlvbiAoQXBwbGljYXRpb24pLAorICogICAgUmVwb3J0IElEICg5KSwKKyAqICAgIFVzYWdlIChQb2ludGVyKSwgICAgICAgICAgICAgIDsgUG9pbnRlciAoMDFoLCBwaHlzaWNhbCBjb2xsZWN0aW9uKQorICogICAgQ29sbGVjdGlvbiAoUGh5c2ljYWwpLAorICogICAgICBVc2FnZSBQYWdlIChCdXR0b24pLCAgICAgICAgOyBCdXR0b24gKDA5aCkKKyAqICAgICAgVXNhZ2UgTWluaW11bSAoMDFoKSwKKyAqICAgICAgVXNhZ2UgTWF4aW11bSAoMDNoKSwKKyAqICAgICAgTG9naWNhbCBNaW5pbXVtICgwKSwKKyAqICAgICAgTG9naWNhbCBNYXhpbXVtICgxKSwKKyAqICAgICAgUmVwb3J0IENvdW50ICgzKSwKKyAqICAgICAgUmVwb3J0IFNpemUgKDEpLAorICogICAgICBJbnB1dCAoVmFyaWFibGUpLAorICogICAgICBSZXBvcnQgQ291bnQgKDQpLAorICogICAgICBJbnB1dCAoQ29uc3RhbnQpLAorICogICAgICBVc2FnZSBQYWdlIChEaWdpdGl6ZXIpLCAgICAgOyBEaWdpdGl6ZXIgKDBEaCkKKyAqICAgICAgVXNhZ2UgKEluIFJhbmdlKSwgICAgICAgICAgIDsgSW4gcmFuZ2UgKDMyaCwgbW9tZW50YXJ5IGNvbnRyb2wpCisgKiAgICAgIFJlcG9ydCBDb3VudCAoMSksCisgKiAgICAgIElucHV0IChWYXJpYWJsZSksCisgKiAgICAgIFVzYWdlIFBhZ2UgKERlc2t0b3ApLCAgICAgICA7IEdlbmVyaWMgZGVza3RvcCBjb250cm9scyAoMDFoKQorICogICAgICBVc2FnZSAoWCksICAgICAgICAgICAgICAgICAgOyBYICgzMGgsIGR5bmFtaWMgdmFsdWUpCisgKiAgICAgIFJlcG9ydCBTaXplICgxNiksCisgKiAgICAgIFJlcG9ydCBDb3VudCAoMSksCisgKiAgICAgIFB1c2gsCisgKiAgICAgIFVuaXQgRXhwb25lbnQgKDEzKSwKKyAqICAgICAgVW5pdCAoSW5jaCksCisgKiAgICAgIFBoeXNpY2FsIE1pbmltdW0gKDApLAorICogICAgICBQaHlzaWNhbCBNYXhpbXVtICgxMDAwMCksCisgKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoMjAwMDApLAorICogICAgICBJbnB1dCAoVmFyaWFibGUpLAorICogICAgICBVc2FnZSAoWSksICAgICAgICAgICAgICAgICAgOyBZICgzMWgsIGR5bmFtaWMgdmFsdWUpCisgKiAgICAgIFBoeXNpY2FsIE1heGltdW0gKDY1ODMpLAorICogICAgICBMb2dpY2FsIE1heGltdW0gKDEzMTY2KSwKKyAqICAgICAgSW5wdXQgKFZhcmlhYmxlKSwKKyAqICAgICAgUG9wLAorICogICAgICBVc2FnZSBQYWdlIChEaWdpdGl6ZXIpLCAgICAgOyBEaWdpdGl6ZXIgKDBEaCkKKyAqICAgICAgVXNhZ2UgKFRpcCBQcmVzc3VyZSksICAgICAgIDsgVGlwIHByZXNzdXJlICgzMGgsIGR5bmFtaWMgdmFsdWUpCisgKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoMTAyMyksCisgKiAgICAgIFJlcG9ydCBDb3VudCAoMSksCisgKiAgICAgIFJlcG9ydCBTaXplICgxNiksCisgKiAgICAgIElucHV0IChWYXJpYWJsZSksCisgKiAgICBFbmQgQ29sbGVjdGlvbiwKKyAqICBFbmQgQ29sbGVjdGlvbiwKKyAqICBVc2FnZSBQYWdlIChEZXNrdG9wKSwgICAgICAgICAgIDsgR2VuZXJpYyBkZXNrdG9wIGNvbnRyb2xzICgwMWgpCisgKiAgVXNhZ2UgKDAwaCksCisgKiAgQ29sbGVjdGlvbiAoQXBwbGljYXRpb24pLAorICogICAgUmVwb3J0IElEICg0KSwKKyAqICAgIExvZ2ljYWwgTWluaW11bSAoMCksCisgKiAgICBMb2dpY2FsIE1heGltdW0gKDI1NSksCisgKiAgICBVc2FnZSAoMDBoKSwKKyAqICAgIFJlcG9ydCBTaXplICg4KSwKKyAqICAgIFJlcG9ydCBDb3VudCAoMyksCisgKiAgICBGZWF0dXJlIChWYXJpYWJsZSksCisgKiAgRW5kIENvbGxlY3Rpb24KKyAqLworCisvKiBTaXplIG9mIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yIG9mIFdQMTA2MiB0YWJsZXQgKi8KKyNkZWZpbmUgV1AxMDYyX1JERVNDX09SSUdfU0laRQkyNTQKKworLyoKKyAqIEZpeGVkIFdQMTA2MiByZXBvcnQgZGVzY3JpcHRvci4KKyAqCisgKiBSZW1vdmVkIHVudXNlZCByZXBvcnRzLCBjb3JyZWN0ZWQgc2Vjb25kIGJhcnJlbCBidXR0b24gdXNhZ2UgY29kZSwgcGh5c2ljYWwKKyAqIHVuaXRzLgorICovCitzdGF0aWMgX191OCB3cDEwNjJfcmRlc2NfZml4ZWRbXSA9IHsKKwkweDA1LCAweDBELCAgICAgICAgIC8qICBVc2FnZSBQYWdlIChEaWdpdGl6ZXIpLCAgICAgICAgICAgICAqLworCTB4MDksIDB4MDIsICAgICAgICAgLyogIFVzYWdlIChQZW4pLCAgICAgICAgICAgICAgICAgICAgICAgICovCisJMHhBMSwgMHgwMSwgICAgICAgICAvKiAgQ29sbGVjdGlvbiAoQXBwbGljYXRpb24pLCAgICAgICAgICAgKi8KKwkweDg1LCAweDA5LCAgICAgICAgIC8qICAgICAgUmVwb3J0IElEICg5KSwgICAgICAgICAgICAgICAgICAqLworCTB4MDksIDB4MjAsICAgICAgICAgLyogICAgICBVc2FnZSAoU3R5bHVzKSwgICAgICAgICAgICAgICAgICovCisJMHhBMCwgICAgICAgICAgICAgICAvKiAgICAgIENvbGxlY3Rpb24gKFBoeXNpY2FsKSwgICAgICAgICAgKi8KKwkweDc1LCAweDAxLCAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBTaXplICgxKSwgICAgICAgICAgICAqLworCTB4MDksIDB4NDIsICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgKFRpcCBTd2l0Y2gpLCAgICAgICAgICovCisJMHgwOSwgMHg0NCwgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoQmFycmVsIFN3aXRjaCksICAgICAgKi8KKwkweDA5LCAweDQ2LCAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIChUYWJsZXQgUGljayksICAgICAgICAqLworCTB4MTQsICAgICAgICAgICAgICAgLyogICAgICAgICAgTG9naWNhbCBNaW5pbXVtICgwKSwgICAgICAgICovCisJMHgyNSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBMb2dpY2FsIE1heGltdW0gKDEpLCAgICAgICAgKi8KKwkweDk1LCAweDAzLCAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBDb3VudCAoMyksICAgICAgICAgICAqLworCTB4ODEsIDB4MDIsICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisJMHg5NSwgMHgwNCwgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgQ291bnQgKDQpLCAgICAgICAgICAgKi8KKwkweDgxLCAweDAxLCAgICAgICAgIC8qICAgICAgICAgIElucHV0IChDb25zdGFudCksICAgICAgICAgICAqLworCTB4MDksIDB4MzIsICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgKEluIFJhbmdlKSwgICAgICAgICAgICovCisJMHg5NSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgQ291bnQgKDEpLCAgICAgICAgICAgKi8KKwkweDgxLCAweDAyLCAgICAgICAgIC8qICAgICAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAqLworCTB4NzUsIDB4MTAsICAgICAgICAgLyogICAgICAgICAgUmVwb3J0IFNpemUgKDE2KSwgICAgICAgICAgICovCisJMHg5NSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgQ291bnQgKDEpLCAgICAgICAgICAgKi8KKwkweDE0LCAgICAgICAgICAgICAgIC8qICAgICAgICAgIExvZ2ljYWwgTWluaW11bSAoMCksICAgICAgICAqLworCTB4QTQsICAgICAgICAgICAgICAgLyogICAgICAgICAgUHVzaCwgICAgICAgICAgICAgICAgICAgICAgICovCisJMHgwNSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBVc2FnZSBQYWdlIChEZXNrdG9wKSwgICAgICAgKi8KKwkweDU1LCAweEZELCAgICAgICAgIC8qICAgICAgICAgIFVuaXQgRXhwb25lbnQgKC0zKSwgICAgICAgICAqLworCTB4NjUsIDB4MTMsICAgICAgICAgLyogICAgICAgICAgVW5pdCAoSW5jaCksICAgICAgICAgICAgICAgICovCisJMHgzNCwgICAgICAgICAgICAgICAvKiAgICAgICAgICBQaHlzaWNhbCBNaW5pbXVtICgwKSwgICAgICAgKi8KKwkweDA5LCAweDMwLCAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIChYKSwgICAgICAgICAgICAgICAgICAqLworCTB4NDYsIDB4MTAsIDB4MjcsICAgLyogICAgICAgICAgUGh5c2ljYWwgTWF4aW11bSAoMTAwMDApLCAgICovCisJMHgyNiwgMHgyMCwgMHg0RSwgICAvKiAgICAgICAgICBMb2dpY2FsIE1heGltdW0gKDIwMDAwKSwgICAgKi8KKwkweDgxLCAweDAyLCAgICAgICAgIC8qICAgICAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAqLworCTB4MDksIDB4MzEsICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgKFkpLCAgICAgICAgICAgICAgICAgICovCisJMHg0NiwgMHhCNywgMHgxOSwgICAvKiAgICAgICAgICBQaHlzaWNhbCBNYXhpbXVtICg2NTgzKSwgICAgKi8KKwkweDI2LCAweDZFLCAweDMzLCAgIC8qICAgICAgICAgIExvZ2ljYWwgTWF4aW11bSAoMTMxNjYpLCAgICAqLworCTB4ODEsIDB4MDIsICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisJMHhCNCwgICAgICAgICAgICAgICAvKiAgICAgICAgICBQb3AsICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkweDA5LCAweDMwLCAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIChUaXAgUHJlc3N1cmUpLCAgICAgICAqLworCTB4MjYsIDB4RkYsIDB4MDMsICAgLyogICAgICAgICAgTG9naWNhbCBNYXhpbXVtICgxMDIzKSwgICAgICovCisJMHg4MSwgMHgwMiwgICAgICAgICAvKiAgICAgICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgKi8KKwkweEMwLCAgICAgICAgICAgICAgIC8qICAgICAgRW5kIENvbGxlY3Rpb24sICAgICAgICAgICAgICAgICAqLworCTB4QzAgICAgICAgICAgICAgICAgLyogIEVuZCBDb2xsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICovCit9OworCisvKgogICogT3JpZ2luYWwgUEYxMjA5IHJlcG9ydCBkZXNjcmlwdG9yLgogICoKICAqIFRoZSBkZXNjcmlwdG9yIGlzIHNpbWlsYXIgdG8gV1BYWFhYVSBkZXNjcmlwdG9ycywgd2l0aCBhbiBhZGRpdGlvbiBvZiBhCkBAIC01ODQsNiArNzcxLDEyIEBACiAJCQkqcnNpemUgPSBzaXplb2Yod3A4MDYwdV9yZGVzY19maXhlZCk7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1dQMTA2MjoKKwkJaWYgKCpyc2l6ZSA9PSBXUDEwNjJfUkRFU0NfT1JJR19TSVpFKSB7CisJCQlyZGVzYyA9IHdwMTA2Ml9yZGVzY19maXhlZDsKKwkJCSpyc2l6ZSA9IHNpemVvZih3cDEwNjJfcmRlc2NfZml4ZWQpOworCQl9CisJCWJyZWFrOwogCX0KIAogCXJldHVybiByZGVzYzsKQEAgLTU5OCw2ICs3OTEsOCBAQAogCQkJCVVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfV1A1NTQwVSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywKIAkJCQlVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1dQODA2MFUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1VDTE9HSUMsCisJCQkJVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9XUDEwNjIpIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHVjbG9naWNfZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtd2lpbW90ZS5jIGIvZHJpdmVycy9oaWQvaGlkLXdpaW1vdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTk0MzgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLXdpaW1vdGUuYwpAQCAtMCwwICsxLDQ4OSBAQAorLyoKKyAqIEhJRCBkcml2ZXIgZm9yIE5pbnRlbmRvIFdpaW1vdGUgZGV2aWNlcworICogQ29weXJpZ2h0IChjKSAyMDExIERhdmlkIEhlcnJtYW5uCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKyNkZWZpbmUgV0lJTU9URV9WRVJTSU9OICIwLjEiCisjZGVmaW5lIFdJSU1PVEVfTkFNRSAiTmludGVuZG8gV2lpIFJlbW90ZSIKKyNkZWZpbmUgV0lJTU9URV9CVUZTSVpFIDMyCisKK3N0cnVjdCB3aWltb3RlX2J1ZiB7CisJX191OCBkYXRhW0hJRF9NQVhfQlVGRkVSX1NJWkVdOworCXNpemVfdCBzaXplOworfTsKKworc3RydWN0IHdpaW1vdGVfc3RhdGUgeworCXNwaW5sb2NrX3QgbG9jazsKKwlfX3U4IGZsYWdzOworfTsKKworc3RydWN0IHdpaW1vdGVfZGF0YSB7CisJYXRvbWljX3QgcmVhZHk7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhkZXY7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisKKwlzcGlubG9ja190IHFsb2NrOworCV9fdTggaGVhZDsKKwlfX3U4IHRhaWw7CisJc3RydWN0IHdpaW1vdGVfYnVmIG91dHFbV0lJTU9URV9CVUZTSVpFXTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya2VyOworCisJc3RydWN0IHdpaW1vdGVfc3RhdGUgc3RhdGU7Cit9OworCisjZGVmaW5lIFdJSVBST1RPX0ZMQUdfTEVEMSAweDAxCisjZGVmaW5lIFdJSVBST1RPX0ZMQUdfTEVEMiAweDAyCisjZGVmaW5lIFdJSVBST1RPX0ZMQUdfTEVEMyAweDA0CisjZGVmaW5lIFdJSVBST1RPX0ZMQUdfTEVENCAweDA4CisjZGVmaW5lIFdJSVBST1RPX0ZMQUdTX0xFRFMgKFdJSVBST1RPX0ZMQUdfTEVEMSB8IFdJSVBST1RPX0ZMQUdfTEVEMiB8IFwKKwkJCQkJV0lJUFJPVE9fRkxBR19MRUQzIHwgV0lJUFJPVE9fRkxBR19MRUQ0KQorCitlbnVtIHdpaXByb3RvX3JlcXMgeworCVdJSVBST1RPX1JFUV9MRUQgPSAweDExLAorCVdJSVBST1RPX1JFUV9EUk1fSyA9IDB4MzAsCit9OworCitlbnVtIHdpaXByb3RvX2tleXMgeworCVdJSVBST1RPX0tFWV9MRUZULAorCVdJSVBST1RPX0tFWV9SSUdIVCwKKwlXSUlQUk9UT19LRVlfVVAsCisJV0lJUFJPVE9fS0VZX0RPV04sCisJV0lJUFJPVE9fS0VZX1BMVVMsCisJV0lJUFJPVE9fS0VZX01JTlVTLAorCVdJSVBST1RPX0tFWV9PTkUsCisJV0lJUFJPVE9fS0VZX1RXTywKKwlXSUlQUk9UT19LRVlfQSwKKwlXSUlQUk9UT19LRVlfQiwKKwlXSUlQUk9UT19LRVlfSE9NRSwKKwlXSUlQUk9UT19LRVlfQ09VTlQKK307CisKK3N0YXRpYyBfX3UxNiB3aWlwcm90b19rZXltYXBbXSA9IHsKKwlLRVlfTEVGVCwJLyogV0lJUFJPVE9fS0VZX0xFRlQgKi8KKwlLRVlfUklHSFQsCS8qIFdJSVBST1RPX0tFWV9SSUdIVCAqLworCUtFWV9VUCwJCS8qIFdJSVBST1RPX0tFWV9VUCAqLworCUtFWV9ET1dOLAkvKiBXSUlQUk9UT19LRVlfRE9XTiAqLworCUtFWV9ORVhULAkvKiBXSUlQUk9UT19LRVlfUExVUyAqLworCUtFWV9QUkVWSU9VUywJLyogV0lJUFJPVE9fS0VZX01JTlVTICovCisJQlROXzEsCQkvKiBXSUlQUk9UT19LRVlfT05FICovCisJQlROXzIsCQkvKiBXSUlQUk9UT19LRVlfVFdPICovCisJQlROX0EsCQkvKiBXSUlQUk9UT19LRVlfQSAqLworCUJUTl9CLAkJLyogV0lJUFJPVE9fS0VZX0IgKi8KKwlCVE5fTU9ERSwJLyogV0lJUFJPVE9fS0VZX0hPTUUgKi8KK307CisKKyNkZWZpbmUgZGV2X3RvX3dpaShwZGV2KSBoaWRfZ2V0X2RydmRhdGEoY29udGFpbmVyX29mKHBkZXYsIHN0cnVjdCBoaWRfZGV2aWNlLCBcCisJCQkJCQkJCQlkZXYpKQorCitzdGF0aWMgc3NpemVfdCB3aWltb3RlX2hpZF9zZW5kKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBfX3U4ICpidWZmZXIsCisJCQkJCQkJCXNpemVfdCBjb3VudCkKK3sKKwlfX3U4ICpidWY7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoIWhkZXYtPmhpZF9vdXRwdXRfcmF3X3JlcG9ydCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlidWYgPSBrbWVtZHVwKGJ1ZmZlciwgY291bnQsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGhkZXYtPmhpZF9vdXRwdXRfcmF3X3JlcG9ydChoZGV2LCBidWYsIGNvdW50LCBISURfT1VUUFVUX1JFUE9SVCk7CisKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdpaW1vdGVfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgd2lpbW90ZV9kYXRhICp3ZGF0YSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2lpbW90ZV9kYXRhLAorCQkJCQkJCQkJd29ya2VyKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndkYXRhLT5xbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKHdkYXRhLT5oZWFkICE9IHdkYXRhLT50YWlsKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndkYXRhLT5xbG9jaywgZmxhZ3MpOworCQl3aWltb3RlX2hpZF9zZW5kKHdkYXRhLT5oZGV2LCB3ZGF0YS0+b3V0cVt3ZGF0YS0+dGFpbF0uZGF0YSwKKwkJCQkJCXdkYXRhLT5vdXRxW3dkYXRhLT50YWlsXS5zaXplKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndkYXRhLT5xbG9jaywgZmxhZ3MpOworCisJCXdkYXRhLT50YWlsID0gKHdkYXRhLT50YWlsICsgMSkgJSBXSUlNT1RFX0JVRlNJWkU7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2RhdGEtPnFsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHdpaW1vdGVfcXVldWUoc3RydWN0IHdpaW1vdGVfZGF0YSAqd2RhdGEsIGNvbnN0IF9fdTggKmJ1ZmZlciwKKwkJCQkJCQkJc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX191OCBuZXdoZWFkOworCisJaWYgKGNvdW50ID4gSElEX01BWF9CVUZGRVJfU0laRSkgeworCQloaWRfd2Fybih3ZGF0YS0+aGRldiwgIlNlbmRpbmcgdG9vIGxhcmdlIG91dHB1dCByZXBvcnRcbiIpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBDb3B5IG5ldyByZXF1ZXN0IGludG8gb3VyIG91dHB1dCBxdWV1ZSBhbmQgY2hlY2sgd2hldGhlciB0aGUKKwkgKiBxdWV1ZSBpcyBmdWxsLiBJZiBpdCBpcyBmdWxsLCBkaXNjYXJkIHRoaXMgcmVxdWVzdC4KKwkgKiBJZiBpdCBpcyBlbXB0eSB3ZSBuZWVkIHRvIHN0YXJ0IGEgbmV3IHdvcmtlciB0aGF0IHdpbGwKKwkgKiBzZW5kIG91dCB0aGUgYnVmZmVyIHRvIHRoZSBoaWQgZGV2aWNlLgorCSAqIElmIHRoZSBxdWV1ZSBpcyBub3QgZW1wdHksIHRoZW4gdGhlcmUgbXVzdCBiZSBhIHdvcmtlcgorCSAqIHRoYXQgaXMgY3VycmVudGx5IHNlbmRpbmcgb3V0IG91ciBidWZmZXIgYW5kIHRoaXMgd29ya2VyCisJICogd2lsbCByZXNjaGVkdWxlIGl0c2VsZiB1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHkuCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2RhdGEtPnFsb2NrLCBmbGFncyk7CisKKwltZW1jcHkod2RhdGEtPm91dHFbd2RhdGEtPmhlYWRdLmRhdGEsIGJ1ZmZlciwgY291bnQpOworCXdkYXRhLT5vdXRxW3dkYXRhLT5oZWFkXS5zaXplID0gY291bnQ7CisJbmV3aGVhZCA9ICh3ZGF0YS0+aGVhZCArIDEpICUgV0lJTU9URV9CVUZTSVpFOworCisJaWYgKHdkYXRhLT5oZWFkID09IHdkYXRhLT50YWlsKSB7CisJCXdkYXRhLT5oZWFkID0gbmV3aGVhZDsKKwkJc2NoZWR1bGVfd29yaygmd2RhdGEtPndvcmtlcik7CisJfSBlbHNlIGlmIChuZXdoZWFkICE9IHdkYXRhLT50YWlsKSB7CisJCXdkYXRhLT5oZWFkID0gbmV3aGVhZDsKKwl9IGVsc2UgeworCQloaWRfd2Fybih3ZGF0YS0+aGRldiwgIk91dHB1dCBxdWV1ZSBpcyBmdWxsIik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2RhdGEtPnFsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHdpaXByb3RvX3JlcV9sZWRzKHN0cnVjdCB3aWltb3RlX2RhdGEgKndkYXRhLCBpbnQgbGVkcykKK3sKKwlfX3U4IGNtZFsyXTsKKworCWxlZHMgJj0gV0lJUFJPVE9fRkxBR1NfTEVEUzsKKwlpZiAoKHdkYXRhLT5zdGF0ZS5mbGFncyAmIFdJSVBST1RPX0ZMQUdTX0xFRFMpID09IGxlZHMpCisJCXJldHVybjsKKwl3ZGF0YS0+c3RhdGUuZmxhZ3MgPSAod2RhdGEtPnN0YXRlLmZsYWdzICYgfldJSVBST1RPX0ZMQUdTX0xFRFMpIHwgbGVkczsKKworCWNtZFswXSA9IFdJSVBST1RPX1JFUV9MRUQ7CisJY21kWzFdID0gMDsKKworCWlmIChsZWRzICYgV0lJUFJPVE9fRkxBR19MRUQxKQorCQljbWRbMV0gfD0gMHgxMDsKKwlpZiAobGVkcyAmIFdJSVBST1RPX0ZMQUdfTEVEMikKKwkJY21kWzFdIHw9IDB4MjA7CisJaWYgKGxlZHMgJiBXSUlQUk9UT19GTEFHX0xFRDMpCisJCWNtZFsxXSB8PSAweDQwOworCWlmIChsZWRzICYgV0lJUFJPVE9fRkxBR19MRUQ0KQorCQljbWRbMV0gfD0gMHg4MDsKKworCXdpaW1vdGVfcXVldWUod2RhdGEsIGNtZCwgc2l6ZW9mKGNtZCkpOworfQorCisjZGVmaW5lIHdpaWZzX2xlZF9zaG93X3NldChudW0pCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgd2lpZnNfbGVkX3Nob3dfIyNudW0oc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHdpaW1vdGVfZGF0YSAqd2RhdGEgPSBkZXZfdG9fd2lpKGRldik7CQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQkJXAorCWludCBzdGF0ZTsJCQkJCQkJXAorCQkJCQkJCQkJXAorCWlmICghYXRvbWljX3JlYWQoJndkYXRhLT5yZWFkeSkpCQkJCVwKKwkJcmV0dXJuIC1FQlVTWTsJCQkJCQlcCisJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2lycXNhdmUoJndkYXRhLT5zdGF0ZS5sb2NrLCBmbGFncyk7CQkJXAorCXN0YXRlID0gISEod2RhdGEtPnN0YXRlLmZsYWdzICYgV0lJUFJPVE9fRkxBR19MRUQjI251bSk7CVwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3ZGF0YS0+c3RhdGUubG9jaywgZmxhZ3MpOwkJXAorCQkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzdGF0ZSk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCB3aWlmc19sZWRfc2V0XyMjbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB3aWltb3RlX2RhdGEgKndkYXRhID0gZGV2X3RvX3dpaShkZXYpOwkJCVwKKwlpbnQgdG1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQkJXAorCV9fdTggc3RhdGU7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAoIWF0b21pY19yZWFkKCZ3ZGF0YS0+cmVhZHkpKQkJCQlcCisJCXJldHVybiAtRUJVU1k7CQkJCQkJXAorCQkJCQkJCQkJXAorCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZGF0YS0+c3RhdGUubG9jaywgZmxhZ3MpOwkJCVwKKwkJCQkJCQkJCVwKKwlzdGF0ZSA9IHdkYXRhLT5zdGF0ZS5mbGFnczsJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAodG1wKQkJCQkJCQlcCisJCXdpaXByb3RvX3JlcV9sZWRzKHdkYXRhLCBzdGF0ZSB8IFdJSVBST1RPX0ZMQUdfTEVEIyNudW0pO1wKKwllbHNlCQkJCQkJCQlcCisJCXdpaXByb3RvX3JlcV9sZWRzKHdkYXRhLCBzdGF0ZSAmIH5XSUlQUk9UT19GTEFHX0xFRCMjbnVtKTtcCisJCQkJCQkJCQlcCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2RhdGEtPnN0YXRlLmxvY2ssIGZsYWdzKTsJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIobGVkIyNudW0sIFNfSVJVR08gfCBTX0lXVVNSLCB3aWlmc19sZWRfc2hvd18jI251bSwJXAorCQkJCQkJd2lpZnNfbGVkX3NldF8jI251bSkKKword2lpZnNfbGVkX3Nob3dfc2V0KDEpOword2lpZnNfbGVkX3Nob3dfc2V0KDIpOword2lpZnNfbGVkX3Nob3dfc2V0KDMpOword2lpZnNfbGVkX3Nob3dfc2V0KDQpOworCitzdGF0aWMgaW50IHdpaW1vdGVfaW5wdXRfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCQkJCXVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHdpaW1vdGVfZGF0YSAqd2RhdGEgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFhdG9taWNfcmVhZCgmd2RhdGEtPnJlYWR5KSkKKwkJcmV0dXJuIC1FQlVTWTsKKwkvKiBzbXBfcm1iOiBNYWtlIHN1cmUgd2RhdGEtPnh5IGlzIGF2YWlsYWJsZSB3aGVuIHdkYXRhLT5yZWFkeSBpcyAxICovCisJc21wX3JtYigpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZXJfa2V5cyhzdHJ1Y3Qgd2lpbW90ZV9kYXRhICp3ZGF0YSwgY29uc3QgX191OCAqcGF5bG9hZCkKK3sKKwlpbnB1dF9yZXBvcnRfa2V5KHdkYXRhLT5pbnB1dCwgd2lpcHJvdG9fa2V5bWFwW1dJSVBST1RPX0tFWV9MRUZUXSwKKwkJCQkJCQkhIShwYXlsb2FkWzBdICYgMHgwMSkpOworCWlucHV0X3JlcG9ydF9rZXkod2RhdGEtPmlucHV0LCB3aWlwcm90b19rZXltYXBbV0lJUFJPVE9fS0VZX1JJR0hUXSwKKwkJCQkJCQkhIShwYXlsb2FkWzBdICYgMHgwMikpOworCWlucHV0X3JlcG9ydF9rZXkod2RhdGEtPmlucHV0LCB3aWlwcm90b19rZXltYXBbV0lJUFJPVE9fS0VZX0RPV05dLAorCQkJCQkJCSEhKHBheWxvYWRbMF0gJiAweDA0KSk7CisJaW5wdXRfcmVwb3J0X2tleSh3ZGF0YS0+aW5wdXQsIHdpaXByb3RvX2tleW1hcFtXSUlQUk9UT19LRVlfVVBdLAorCQkJCQkJCSEhKHBheWxvYWRbMF0gJiAweDA4KSk7CisJaW5wdXRfcmVwb3J0X2tleSh3ZGF0YS0+aW5wdXQsIHdpaXByb3RvX2tleW1hcFtXSUlQUk9UT19LRVlfUExVU10sCisJCQkJCQkJISEocGF5bG9hZFswXSAmIDB4MTApKTsKKwlpbnB1dF9yZXBvcnRfa2V5KHdkYXRhLT5pbnB1dCwgd2lpcHJvdG9fa2V5bWFwW1dJSVBST1RPX0tFWV9UV09dLAorCQkJCQkJCSEhKHBheWxvYWRbMV0gJiAweDAxKSk7CisJaW5wdXRfcmVwb3J0X2tleSh3ZGF0YS0+aW5wdXQsIHdpaXByb3RvX2tleW1hcFtXSUlQUk9UT19LRVlfT05FXSwKKwkJCQkJCQkhIShwYXlsb2FkWzFdICYgMHgwMikpOworCWlucHV0X3JlcG9ydF9rZXkod2RhdGEtPmlucHV0LCB3aWlwcm90b19rZXltYXBbV0lJUFJPVE9fS0VZX0JdLAorCQkJCQkJCSEhKHBheWxvYWRbMV0gJiAweDA0KSk7CisJaW5wdXRfcmVwb3J0X2tleSh3ZGF0YS0+aW5wdXQsIHdpaXByb3RvX2tleW1hcFtXSUlQUk9UT19LRVlfQV0sCisJCQkJCQkJISEocGF5bG9hZFsxXSAmIDB4MDgpKTsKKwlpbnB1dF9yZXBvcnRfa2V5KHdkYXRhLT5pbnB1dCwgd2lpcHJvdG9fa2V5bWFwW1dJSVBST1RPX0tFWV9NSU5VU10sCisJCQkJCQkJISEocGF5bG9hZFsxXSAmIDB4MTApKTsKKwlpbnB1dF9yZXBvcnRfa2V5KHdkYXRhLT5pbnB1dCwgd2lpcHJvdG9fa2V5bWFwW1dJSVBST1RPX0tFWV9IT01FXSwKKwkJCQkJCQkhIShwYXlsb2FkWzFdICYgMHg4MCkpOworCWlucHV0X3N5bmMod2RhdGEtPmlucHV0KTsKK30KKworc3RydWN0IHdpaXByb3RvX2hhbmRsZXIgeworCV9fdTggaWQ7CisJc2l6ZV90IHNpemU7CisJdm9pZCAoKmZ1bmMpKHN0cnVjdCB3aWltb3RlX2RhdGEgKndkYXRhLCBjb25zdCBfX3U4ICpwYXlsb2FkKTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd2lpcHJvdG9faGFuZGxlciBoYW5kbGVyc1tdID0geworCXsgLmlkID0gV0lJUFJPVE9fUkVRX0RSTV9LLCAuc2l6ZSA9IDIsIC5mdW5jID0gaGFuZGxlcl9rZXlzIH0sCisJeyAuaWQgPSAwIH0KK307CisKK3N0YXRpYyBpbnQgd2lpbW90ZV9oaWRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQsCisJCQkJCQkJdTggKnJhd19kYXRhLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgd2lpbW90ZV9kYXRhICp3ZGF0YSA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKwlzdHJ1Y3Qgd2lpcHJvdG9faGFuZGxlciAqaDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFhdG9taWNfcmVhZCgmd2RhdGEtPnJlYWR5KSkKKwkJcmV0dXJuIC1FQlVTWTsKKwkvKiBzbXBfcm1iOiBNYWtlIHN1cmUgd2RhdGEtPnh5IGlzIGF2YWlsYWJsZSB3aGVuIHdkYXRhLT5yZWFkeSBpcyAxICovCisJc21wX3JtYigpOworCisJaWYgKHNpemUgPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZGF0YS0+c3RhdGUubG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaGFuZGxlcnNbaV0uaWQ7ICsraSkgeworCQloID0gJmhhbmRsZXJzW2ldOworCQlpZiAoaC0+aWQgPT0gcmF3X2RhdGFbMF0gJiYgaC0+c2l6ZSA8IHNpemUpCisJCQloLT5mdW5jKHdkYXRhLCAmcmF3X2RhdGFbMV0pOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndkYXRhLT5zdGF0ZS5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB3aWltb3RlX2RhdGEgKndpaW1vdGVfY3JlYXRlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCXN0cnVjdCB3aWltb3RlX2RhdGEgKndkYXRhOworCWludCBpOworCisJd2RhdGEgPSBremFsbG9jKHNpemVvZigqd2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdkYXRhKQorCQlyZXR1cm4gTlVMTDsKKworCXdkYXRhLT5pbnB1dCA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghd2RhdGEtPmlucHV0KSB7CisJCWtmcmVlKHdkYXRhKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJd2RhdGEtPmhkZXYgPSBoZGV2OworCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCB3ZGF0YSk7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YSh3ZGF0YS0+aW5wdXQsIHdkYXRhKTsKKwl3ZGF0YS0+aW5wdXQtPmV2ZW50ID0gd2lpbW90ZV9pbnB1dF9ldmVudDsKKwl3ZGF0YS0+aW5wdXQtPmRldi5wYXJlbnQgPSAmd2RhdGEtPmhkZXYtPmRldjsKKwl3ZGF0YS0+aW5wdXQtPmlkLmJ1c3R5cGUgPSB3ZGF0YS0+aGRldi0+YnVzOworCXdkYXRhLT5pbnB1dC0+aWQudmVuZG9yID0gd2RhdGEtPmhkZXYtPnZlbmRvcjsKKwl3ZGF0YS0+aW5wdXQtPmlkLnByb2R1Y3QgPSB3ZGF0YS0+aGRldi0+cHJvZHVjdDsKKwl3ZGF0YS0+aW5wdXQtPmlkLnZlcnNpb24gPSB3ZGF0YS0+aGRldi0+dmVyc2lvbjsKKwl3ZGF0YS0+aW5wdXQtPm5hbWUgPSBXSUlNT1RFX05BTUU7CisKKwlzZXRfYml0KEVWX0tFWSwgd2RhdGEtPmlucHV0LT5ldmJpdCk7CisJZm9yIChpID0gMDsgaSA8IFdJSVBST1RPX0tFWV9DT1VOVDsgKytpKQorCQlzZXRfYml0KHdpaXByb3RvX2tleW1hcFtpXSwgd2RhdGEtPmlucHV0LT5rZXliaXQpOworCisJc3Bpbl9sb2NrX2luaXQoJndkYXRhLT5xbG9jayk7CisJSU5JVF9XT1JLKCZ3ZGF0YS0+d29ya2VyLCB3aWltb3RlX3dvcmtlcik7CisKKwlzcGluX2xvY2tfaW5pdCgmd2RhdGEtPnN0YXRlLmxvY2spOworCisJcmV0dXJuIHdkYXRhOworfQorCitzdGF0aWMgdm9pZCB3aWltb3RlX2Rlc3Ryb3koc3RydWN0IHdpaW1vdGVfZGF0YSAqd2RhdGEpCit7CisJa2ZyZWUod2RhdGEpOworfQorCitzdGF0aWMgaW50IHdpaW1vdGVfaGlkX3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgd2lpbW90ZV9kYXRhICp3ZGF0YTsKKwlpbnQgcmV0OworCisJd2RhdGEgPSB3aWltb3RlX2NyZWF0ZShoZGV2KTsKKwlpZiAoIXdkYXRhKSB7CisJCWhpZF9lcnIoaGRldiwgIkNhbid0IGFsbG9jIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfbGVkMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9sZWQyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmhkZXYtPmRldiwgJmRldl9hdHRyX2xlZDMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfbGVkNCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBoaWRfcGFyc2UoaGRldik7CisJaWYgKHJldCkgeworCQloaWRfZXJyKGhkZXYsICJISUQgcGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0hJRFJBVyk7CisJaWYgKHJldCkgeworCQloaWRfZXJyKGhkZXYsICJIVyBzdGFydCBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uod2RhdGEtPmlucHV0KTsKKwlpZiAocmV0KSB7CisJCWhpZF9lcnIoaGRldiwgIkNhbm5vdCByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9zdG9wOworCX0KKworCS8qIHNtcF93bWI6IFdyaXRlIHdkYXRhLT54eSBmaXJzdCBiZWZvcmUgd2RhdGEtPnJlYWR5IGlzIHNldCB0byAxICovCisJc21wX3dtYigpOworCWF0b21pY19zZXQoJndkYXRhLT5yZWFkeSwgMSk7CisJaGlkX2luZm8oaGRldiwgIk5ldyBkZXZpY2UgcmVnaXN0ZXJlZFxuIik7CisKKwkvKiBieSBkZWZhdWx0IHNldCBsZWQxIGFmdGVyIGRldmljZSBpbml0aWFsaXphdGlvbiAqLworCXNwaW5fbG9ja19pcnEoJndkYXRhLT5zdGF0ZS5sb2NrKTsKKwl3aWlwcm90b19yZXFfbGVkcyh3ZGF0YSwgV0lJUFJPVE9fRkxBR19MRUQxKTsKKwlzcGluX3VubG9ja19pcnEoJndkYXRhLT5zdGF0ZS5sb2NrKTsKKworCXJldHVybiAwOworCitlcnJfc3RvcDoKKwloaWRfaHdfc3RvcChoZGV2KTsKK2VycjoKKwlpbnB1dF9mcmVlX2RldmljZSh3ZGF0YS0+aW5wdXQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfbGVkMSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9sZWQyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmhkZXYtPmRldiwgJmRldl9hdHRyX2xlZDMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfbGVkNCk7CisJd2lpbW90ZV9kZXN0cm95KHdkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3aWltb3RlX2hpZF9yZW1vdmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJc3RydWN0IHdpaW1vdGVfZGF0YSAqd2RhdGEgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwloaWRfaW5mbyhoZGV2LCAiRGV2aWNlIHJlbW92ZWRcbiIpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9sZWQxKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmhkZXYtPmRldiwgJmRldl9hdHRyX2xlZDIpOworCWRldmljZV9yZW1vdmVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfbGVkMyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9sZWQ0KTsKKworCWhpZF9od19zdG9wKGhkZXYpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHdkYXRhLT5pbnB1dCk7CisKKwljYW5jZWxfd29ya19zeW5jKCZ3ZGF0YS0+d29ya2VyKTsKKwl3aWltb3RlX2Rlc3Ryb3kod2RhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgd2lpbW90ZV9oaWRfZGV2aWNlc1tdID0geworCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9OSU5URU5ETywKKwkJCQlVU0JfREVWSUNFX0lEX05JTlRFTkRPX1dJSU1PVEUpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHdpaW1vdGVfaGlkX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgd2lpbW90ZV9oaWRfZHJpdmVyID0geworCS5uYW1lID0gIndpaW1vdGUiLAorCS5pZF90YWJsZSA9IHdpaW1vdGVfaGlkX2RldmljZXMsCisJLnByb2JlID0gd2lpbW90ZV9oaWRfcHJvYmUsCisJLnJlbW92ZSA9IHdpaW1vdGVfaGlkX3JlbW92ZSwKKwkucmF3X2V2ZW50ID0gd2lpbW90ZV9oaWRfZXZlbnQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3aWltb3RlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigmd2lpbW90ZV9oaWRfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIkNhbid0IHJlZ2lzdGVyIHdpaW1vdGUgaGlkIGRyaXZlclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2lpbW90ZV9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZ3aWltb3RlX2hpZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh3aWltb3RlX2luaXQpOworbW9kdWxlX2V4aXQod2lpbW90ZV9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEhlcnJtYW5uIDxkaC5oZXJybWFubkBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oV0lJTU9URV9OQU1FICIgRGV2aWNlIERyaXZlciIpOworTU9EVUxFX1ZFUlNJT04oV0lJTU9URV9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKaW5kZXggMzhjMjYxYS4uYWQ5NzhmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKQEAgLTExOTEsNiArMTE5MSw4IEBACiAJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PQogCQkJVVNCX0lOVEVSRkFDRV9QUk9UT0NPTF9NT1VTRSkKIAkJaGlkLT50eXBlID0gSElEX1RZUEVfVVNCTU9VU0U7CisJZWxzZSBpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVByb3RvY29sID09IDApCisJCWhpZC0+dHlwZSA9IEhJRF9UWVBFX1VTQk5PTkU7CiAKIAlpZiAoZGV2LT5tYW51ZmFjdHVyZXIpCiAJCXN0cmxjcHkoaGlkLT5uYW1lLCBkZXYtPm1hbnVmYWN0dXJlciwgc2l6ZW9mKGhpZC0+bmFtZSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKaW5kZXggMGUzMGIxNC4uNjIxOTU5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCkBAIC03NCw2ICs3NCw3IEBACiAJeyBVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfUEYxMjA5LCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9XUDQwMzBVLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9LTkE1LCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKKwl7IFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9UV0E2MCwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfV1A1NTQwVSwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfV1A4MDYwVSwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1dBTFRPUCwgVVNCX0RFVklDRV9JRF9XQUxUT1BfTUVESUFfVEFCTEVUXzEwXzZfSU5DSCwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKaW5kZXggZmYzYzY0NC4uN2MxMTg4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYwpAQCAtMjQ4LDEyICsyNDgsMTUgQEAKIAkJCXVzYmhpZF9jbG9zZShsaXN0LT5oaWRkZXYtPmhpZCk7CiAJCQl1c2JoaWRfcHV0X3Bvd2VyKGxpc3QtPmhpZGRldi0+aGlkKTsKIAkJfSBlbHNlIHsKKwkJCW11dGV4X3VubG9jaygmbGlzdC0+aGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKIAkJCWtmcmVlKGxpc3QtPmhpZGRldik7CisJCQlrZnJlZShsaXN0KTsKKwkJCXJldHVybiAwOwogCQl9CiAJfQogCi0Ja2ZyZWUobGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZsaXN0LT5oaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCWtmcmVlKGxpc3QpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MjMsMTAgKzkyNiwxMSBAQAogCXVzYl9kZXJlZ2lzdGVyX2Rldih1c2JoaWQtPmludGYsICZoaWRkZXZfY2xhc3MpOwogCiAJaWYgKGhpZGRldi0+b3BlbikgeworCQltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CiAJCXVzYmhpZF9jbG9zZShoaWRkZXYtPmhpZCk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGlkZGV2LT53YWl0KTsKIAl9IGVsc2UgeworCQltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CiAJCWtmcmVlKGhpZGRldik7CiAJfQotCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwppbmRleCAxNmRiODNjLi4wNTk4Y2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKKysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC0zMzMsNyArMzMzLDcgQEAKIAkgICAgRjcxODU4RkcKIAkgICAgRjcxODYyRkcKIAkgICAgRjcxODYzRkcKLQkgICAgRjcxODY5Ri9FCisJICAgIEY3MTg2OUYvRS9BCiAJICAgIEY3MTg4MkZHCiAJICAgIEY3MTg4M0ZHCiAJICAgIEY3MTg4OUZHL0VEL0EKQEAgLTEwNDEsOCArMTA0MSwxMyBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc21zYzQ3YjM5Ny4KIAorY29uZmlnIFNFTlNPUlNfU0NINTZYWF9DT01NT04KKwl0cmlzdGF0ZQorCWRlZmF1bHQgbgorCiBjb25maWcgU0VOU09SU19TQ0g1NjI3CiAJdHJpc3RhdGUgIlNNU0MgU0NINTYyNyIKKwlzZWxlY3QgU0VOU09SU19TQ0g1NlhYX0NPTU1PTgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZwogCSAgZmVhdHVyZXMgb2YgdGhlIFNNU0MgU0NINTYyNyBTdXBlci1JL08gY2hpcC4KQEAgLTEwNTAsNiArMTA1NSwyMSBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc2NoNTYyNy4KIAorY29uZmlnIFNFTlNPUlNfU0NINTYzNgorCXRyaXN0YXRlICJTTVNDIFNDSDU2MzYiCisJc2VsZWN0IFNFTlNPUlNfU0NINTZYWF9DT01NT04KKwloZWxwCisJICBTTVNDIFNDSDU2MzYgU3VwZXIgSS9PIGNoaXBzIGluY2x1ZGUgYW4gZW1iZWRkZWQgbWljcm9jb250cm9sbGVyIGZvcgorCSAgaGFyZHdhcmUgbW9uaXRvcmluZyBzb2x1dGlvbnMsIGFsbG93aW5nIG1vdGhlcmJvYXJkIG1hbnVmYWN0dXJlcnMgdG8KKwkgIGNyZWF0ZSB0aGVpciBvd24gY3VzdG9tIGh3bW9uIHNvbHV0aW9uIGJhc2VkIHVwb24gdGhlIFNDSDU2MzYuCisKKwkgIEN1cnJlbnRseSB0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIHRoZSBGdWppdHN1IFRoZXNldXMgU0NINTYzNiBiYXNlZAorCSAgaHdtb24gc29sdXRpb24uIFNheSB5ZXMgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgRnVqaXRzdQorCSAgVGhlc2V1cycgaGFyZHdhcmUgbW9uaXRvcmluZyBmZWF0dXJlcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc2NoNTYzNi4KKwogY29uZmlnIFNFTlNPUlNfQURTMTAxNQogCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBBRFMxMDE1IgogCWRlcGVuZHMgb24gSTJDCkBAIC0xMTQyLDYgKzExNjIsNyBAQAogY29uZmlnIFNFTlNPUlNfVklBX0NQVVRFTVAKIAl0cmlzdGF0ZSAiVklBIENQVSB0ZW1wZXJhdHVyZSBzZW5zb3IiCiAJZGVwZW5kcyBvbiBYODYKKwlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSB0ZW1wZXJhdHVyZQogCSAgc2Vuc29yIGluc2lkZSB5b3VyIENQVS4gU3VwcG9ydGVkIGFyZSBhbGwga25vd24gdmFyaWFudHMgb2YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCmluZGV4IDI4MDYxY2YuLmQ3OTk1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpAQCAtOTUsNyArOTUsOSBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfUEM4NzQyNykJKz0gcGM4NzQyNy5vCiBvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTkxKQkrPSBwY2Y4NTkxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1MzQykJKz0gczNjLWh3bW9uLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1NDSDU2WFhfQ09NTU9OKSs9IHNjaDU2eHgtY29tbW9uLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1NDSDU2MjcpCSs9IHNjaDU2Mjcubworb2JqLSQoQ09ORklHX1NFTlNPUlNfU0NINTYzNikJKz0gc2NoNTYzNi5vCiBvYmotJChDT05GSUdfU0VOU09SU19TSFQxNSkJKz0gc2h0MTUubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfU0hUMjEpCSs9IHNodDIxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1NJUzU1OTUpCSs9IHNpczU1OTUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMjc1LmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEyNzUuYwppbmRleCBjMmVlMjA0Li44YmMxYmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEyNzUuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEyNzUuYwpAQCAtMzIsNiArMzIsNyBAQAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgY29uZmlnOworCWludCByZXQ7CiAJc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvICppbmZvOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCkBAIC00MywzMCArNDQsMzIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAljb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMjc1X1BNT05fQ09ORklHKTsKLQlpZiAoY29uZmlnIDwgMCkKLQkJcmV0dXJuIGNvbmZpZzsKKwlpZiAoY29uZmlnIDwgMCkgeworCQlyZXQgPSBjb25maWc7CisJCWdvdG8gZXJyX21lbTsKKwl9CiAKIAlpbmZvLT5wYWdlcyA9IDE7CiAJaW5mby0+ZGlyZWN0W1BTQ19WT0xUQUdFX0lOXSA9IHRydWU7CiAJaW5mby0+ZGlyZWN0W1BTQ19WT0xUQUdFX09VVF0gPSB0cnVlOwogCWluZm8tPmRpcmVjdFtQU0NfQ1VSUkVOVF9PVVRdID0gdHJ1ZTsKLQlpbmZvLT5tW1BTQ19DVVJSRU5UX09VVF0gPSA4MDA7CisJaW5mby0+bVtQU0NfQ1VSUkVOVF9PVVRdID0gODA3OwogCWluZm8tPmJbUFNDX0NVUlJFTlRfT1VUXSA9IDIwNDc1OwogCWluZm8tPlJbUFNDX0NVUlJFTlRfT1VUXSA9IC0xOwogCWluZm8tPmZ1bmNbMF0gPSBQTUJVU19IQVZFX0lPVVQgfCBQTUJVU19IQVZFX1NUQVRVU19JT1VUOwogCiAJaWYgKGNvbmZpZyAmIEFETTEyNzVfVlJBTkdFKSB7Ci0JCWluZm8tPm1bUFNDX1ZPTFRBR0VfSU5dID0gMTkwNDU7CisJCWluZm8tPm1bUFNDX1ZPTFRBR0VfSU5dID0gMTkxOTk7CiAJCWluZm8tPmJbUFNDX1ZPTFRBR0VfSU5dID0gMDsKIAkJaW5mby0+UltQU0NfVk9MVEFHRV9JTl0gPSAtMjsKLQkJaW5mby0+bVtQU0NfVk9MVEFHRV9PVVRdID0gMTkwNDU7CisJCWluZm8tPm1bUFNDX1ZPTFRBR0VfT1VUXSA9IDE5MTk5OwogCQlpbmZvLT5iW1BTQ19WT0xUQUdFX09VVF0gPSAwOwogCQlpbmZvLT5SW1BTQ19WT0xUQUdFX09VVF0gPSAtMjsKIAl9IGVsc2UgewotCQlpbmZvLT5tW1BTQ19WT0xUQUdFX0lOXSA9IDY2NjY7CisJCWluZm8tPm1bUFNDX1ZPTFRBR0VfSU5dID0gNjcyMDsKIAkJaW5mby0+YltQU0NfVk9MVEFHRV9JTl0gPSAwOwogCQlpbmZvLT5SW1BTQ19WT0xUQUdFX0lOXSA9IC0xOwotCQlpbmZvLT5tW1BTQ19WT0xUQUdFX09VVF0gPSA2NjY2OworCQlpbmZvLT5tW1BTQ19WT0xUQUdFX09VVF0gPSA2NzIwOwogCQlpbmZvLT5iW1BTQ19WT0xUQUdFX09VVF0gPSAwOwogCQlpbmZvLT5SW1BTQ19WT0xUQUdFX09VVF0gPSAtMTsKIAl9CkBAIC03Niw3ICs3OSwxNCBAQAogCWVsc2UKIAkJaW5mby0+ZnVuY1swXSB8PSBQTUJVU19IQVZFX1ZJTiB8IFBNQlVTX0hBVkVfU1RBVFVTX0lOUFVUOwogCi0JcmV0dXJuIHBtYnVzX2RvX3Byb2JlKGNsaWVudCwgaWQsIGluZm8pOworCXJldCA9IHBtYnVzX2RvX3Byb2JlKGNsaWVudCwgaWQsIGluZm8pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX21lbTsKKwlyZXR1cm4gMDsKKworZXJyX21lbToKKwlrZnJlZShpbmZvKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGFkbTEyNzVfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FzdXNfYXRrMDExMC5jIGIvZHJpdmVycy9od21vbi9hc3VzX2F0azAxMTAuYwppbmRleCBiNWU4OTIwLi4wMGU5ODUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FzdXNfYXRrMDExMC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYXN1c19hdGswMTEwLmMKQEAgLTI2OCw2ICsyNjgsNyBAQAogc3RhdGljIHZvaWQgYXRrX2luaXRfYXR0cmlidXRlKHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpuYW1lLAogCQlzeXNmc19zaG93X2Z1bmMgc2hvdykKIHsKKwlzeXNmc19hdHRyX2luaXQoJmF0dHItPmF0dHIpOwogCWF0dHItPmF0dHIubmFtZSA9IG5hbWU7CiAJYXR0ci0+YXR0ci5tb2RlID0gMDQ0NDsKIAlhdHRyLT5zaG93ID0gc2hvdzsKQEAgLTY3Myw2ICs2NzQsNyBAQAogCWVsc2UKIAkJZXJyID0gLUVJTzsKIAorCUFDUElfRlJFRShyZXQpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTExODgsMTkgKzExOTAsMTUgQEAKIAlpbnQgZXJyOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmZGF0YS0+c2Vuc29yX2xpc3QsIGxpc3QpIHsKLQkJc3lzZnNfYXR0cl9pbml0KCZzLT5pbnB1dF9hdHRyLmF0dHIpOwogCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGF0YS0+aHdtb25fZGV2LCAmcy0+aW5wdXRfYXR0cik7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwotCQlzeXNmc19hdHRyX2luaXQoJnMtPmxhYmVsX2F0dHIuYXR0cik7CiAJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkYXRhLT5od21vbl9kZXYsICZzLT5sYWJlbF9hdHRyKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JCXN5c2ZzX2F0dHJfaW5pdCgmcy0+bGltaXQxX2F0dHIuYXR0cik7CiAJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkYXRhLT5od21vbl9kZXYsICZzLT5saW1pdDFfYXR0cik7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwotCQlzeXNmc19hdHRyX2luaXQoJnMtPmxpbWl0Ml9hdHRyLmF0dHIpOwogCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGF0YS0+aHdtb25fZGV2LCAmcy0+bGltaXQyX2F0dHIpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYyBiL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYwppbmRleCA4NWU5Mzc5Li4wMDcwZDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKKysrIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCkBAIC05Nyw5ICs5Nyw3IEBACiBzdHJ1Y3QgcGRldl9lbnRyeSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0JdW5zaWduZWQgaW50IGNwdTsKIAl1MTYgcGh5c19wcm9jX2lkOwotCXUxNiBjcHVfY29yZV9pZDsKIH07CiAKIHN0YXRpYyBMSVNUX0hFQUQocGRldl9saXN0KTsKQEAgLTY1Myw5ICs2NTEsNyBAQAogCX0KIAogCXBkZXZfZW50cnktPnBkZXYgPSBwZGV2OwotCXBkZXZfZW50cnktPmNwdSA9IGNwdTsKIAlwZGV2X2VudHJ5LT5waHlzX3Byb2NfaWQgPSBUT19QSFlTX0lEKGNwdSk7Ci0JcGRldl9lbnRyeS0+Y3B1X2NvcmVfaWQgPSBUT19DT1JFX0lEKGNwdSk7CiAKIAlsaXN0X2FkZF90YWlsKCZwZGV2X2VudHJ5LT5saXN0LCAmcGRldl9saXN0KTsKIAltdXRleF91bmxvY2soJnBkZXZfbGlzdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2VtYzZ3MjAxLmMgYi9kcml2ZXJzL2h3bW9uL2VtYzZ3MjAxLmMKaW5kZXggZTBlZjMyMy4uMDA2NDQzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9lbWM2dzIwMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vZW1jNncyMDEuYwpAQCAtNzgsOCArNzgsOSBAQAogCiAJbHNiID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKIAltc2IgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcgKyAxKTsKLQlpZiAobHNiIDwgMCB8fCBtc2IgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiMTYtYml0IHJlYWQgZmFpbGVkIGF0IDB4JTAyeFxuIiwgcmVnKTsKKwlpZiAodW5saWtlbHkobHNiIDwgMCB8fCBtc2IgPCAwKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVkLWJpdCAlcyBmYWlsZWQgYXQgMHglMDJ4XG4iLAorCQkJMTYsICJyZWFkIiwgcmVnKTsKIAkJcmV0dXJuIDB4RkZGRjsJLyogQXJiaXRyYXJ5IHZhbHVlICovCiAJfQogCkBAIC05NSwxMCArOTYsMzkgQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsICYgMHhmZik7Ci0JaWYgKCFlcnIpCisJaWYgKGxpa2VseSghZXJyKSkKIAkJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZyArIDEsIHZhbCA+PiA4KTsKLQlpZiAoZXJyIDwgMCkKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIxNi1iaXQgd3JpdGUgZmFpbGVkIGF0IDB4JTAyeFxuIiwgcmVnKTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJWQtYml0ICVzIGZhaWxlZCBhdCAweCUwMnhcbiIsCisJCQkxNiwgIndyaXRlIiwgcmVnKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIFJlYWQgOC1iaXQgdmFsdWUgZnJvbSByZWdpc3RlciAqLworc3RhdGljIHU4IGVtYzZ3MjAxX3JlYWQ4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgdmFsOworCisJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwlpZiAodW5saWtlbHkodmFsIDwgMCkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlZC1iaXQgJXMgZmFpbGVkIGF0IDB4JTAyeFxuIiwKKwkJCTgsICJyZWFkIiwgcmVnKTsKKwkJcmV0dXJuIDB4MDA7CS8qIEFyYml0cmFyeSB2YWx1ZSAqLworCX0KKworCXJldHVybiB2YWw7Cit9CisKKy8qIFdyaXRlIDgtYml0IHZhbHVlIHRvIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IGVtYzZ3MjAxX3dyaXRlOChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsKTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJWQtYml0ICVzIGZhaWxlZCBhdCAweCUwMnhcbiIsCisJCQk4LCAid3JpdGUiLCByZWcpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTExNCwyNSArMTQ0LDI1IEBACiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgewogCQlmb3IgKG5yID0gMDsgbnIgPCA2OyBucisrKSB7CiAJCQlkYXRhLT5pbltpbnB1dF1bbnJdID0KLQkJCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCWVtYzZ3MjAxX3JlYWQ4KGNsaWVudCwKIAkJCQkJCUVNQzZXMjAxX1JFR19JTihucikpOwogCQkJZGF0YS0+aW5bbWluXVtucl0gPQotCQkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJZW1jNncyMDFfcmVhZDgoY2xpZW50LAogCQkJCQkJRU1DNlcyMDFfUkVHX0lOX0xPVyhucikpOwogCQkJZGF0YS0+aW5bbWF4XVtucl0gPQotCQkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJZW1jNncyMDFfcmVhZDgoY2xpZW50LAogCQkJCQkJRU1DNlcyMDFfUkVHX0lOX0hJR0gobnIpKTsKIAkJfQogCiAJCWZvciAobnIgPSAwOyBuciA8IDY7IG5yKyspIHsKIAkJCWRhdGEtPnRlbXBbaW5wdXRdW25yXSA9Ci0JCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQllbWM2dzIwMV9yZWFkOChjbGllbnQsCiAJCQkJCQlFTUM2VzIwMV9SRUdfVEVNUChucikpOwogCQkJZGF0YS0+dGVtcFttaW5dW25yXSA9Ci0JCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQllbWM2dzIwMV9yZWFkOChjbGllbnQsCiAJCQkJCQlFTUM2VzIwMV9SRUdfVEVNUF9MT1cobnIpKTsKIAkJCWRhdGEtPnRlbXBbbWF4XVtucl0gPQotCQkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJZW1jNncyMDFfcmVhZDgoY2xpZW50LAogCQkJCQkJRU1DNlcyMDFfUkVHX1RFTVBfSElHSChucikpOwogCQl9CiAKQEAgLTE5Miw3ICsyMjIsNyBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPmluW3NmXVtucl0gPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKLQllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCBkYXRhLT5pbltzZl1bbnJdKTsKKwllcnIgPSBlbWM2dzIwMV93cml0ZTgoY2xpZW50LCByZWcsIGRhdGEtPmluW3NmXVtucl0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiBjb3VudDsKQEAgLTIyOSw3ICsyNTksNyBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPnRlbXBbc2ZdW25yXSA9IFNFTlNPUlNfTElNSVQodmFsLCAtMTI3LCAxMjgpOwotCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIGRhdGEtPnRlbXBbc2ZdW25yXSk7CisJZXJyID0gZW1jNncyMDFfd3JpdGU4KGNsaWVudCwgcmVnLCBkYXRhLT50ZW1wW3NmXVtucl0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiBjb3VudDsKQEAgLTQ0NCw3ICs0NzQsNyBAQAogCiAJLyogQ2hlY2sgY29uZmlndXJhdGlvbiAqLwogCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEVNQzZXMjAxX1JFR19DT05GSUcpOwotCWlmICgoY29uZmlnICYgMHhGNCkgIT0gMHgwNCkKKwlpZiAoY29uZmlnIDwgMCB8fCAoY29uZmlnICYgMHhGNCkgIT0gMHgwNCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKCEoY29uZmlnICYgMHgwMSkpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNb25pdG9yaW5nIG5vdCBlbmFibGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYyBiL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYwppbmRleCBhNGE5NGEwLi4yZDk2ZWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Y3MTg4MmZnLmMKKysrIGIvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jCkBAIC01Miw2ICs1Miw3IEBACiAjZGVmaW5lIFNJT19GNzE4NThfSUQJCTB4MDUwNyAgLyogQ2hpcHNldCBJRCAqLwogI2RlZmluZSBTSU9fRjcxODYyX0lECQkweDA2MDEJLyogQ2hpcHNldCBJRCAqLwogI2RlZmluZSBTSU9fRjcxODY5X0lECQkweDA4MTQJLyogQ2hpcHNldCBJRCAqLworI2RlZmluZSBTSU9fRjcxODY5QV9JRAkJMHgxMDA3CS8qIENoaXBzZXQgSUQgKi8KICNkZWZpbmUgU0lPX0Y3MTg4Ml9JRAkJMHgwNTQxCS8qIENoaXBzZXQgSUQgKi8KICNkZWZpbmUgU0lPX0Y3MTg4OV9JRAkJMHgwNzIzCS8qIENoaXBzZXQgSUQgKi8KICNkZWZpbmUgU0lPX0Y3MTg4OUVfSUQJCTB4MDkwOQkvKiBDaGlwc2V0IElEICovCkBAIC0xMDgsOCArMTA5LDggQEAKIG1vZHVsZV9wYXJhbShmb3JjZV9pZCwgdXNob3J0LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfaWQsICJPdmVycmlkZSB0aGUgZGV0ZWN0ZWQgZGV2aWNlIElEIik7CiAKLWVudW0gY2hpcHMgeyBmNzE4MDhlLCBmNzE4MDhhLCBmNzE4NThmZywgZjcxODYyZmcsIGY3MTg2OSwgZjcxODgyZmcsIGY3MTg4OWZnLAotCSAgICAgZjcxODg5ZWQsIGY3MTg4OWEsIGY4MDAwLCBmODE4NjVmIH07CitlbnVtIGNoaXBzIHsgZjcxODA4ZSwgZjcxODA4YSwgZjcxODU4ZmcsIGY3MTg2MmZnLCBmNzE4NjksIGY3MTg2OWEsIGY3MTg4MmZnLAorCSAgICAgZjcxODg5ZmcsIGY3MTg4OWVkLCBmNzE4ODlhLCBmODAwMCwgZjgxODY1ZiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZjcxODgyZmdfbmFtZXNbXSA9IHsKIAkiZjcxODA4ZSIsCkBAIC0xMTcsNiArMTE4LDcgQEAKIAkiZjcxODU4ZmciLAogCSJmNzE4NjJmZyIsCiAJImY3MTg2OSIsIC8qIEJvdGggZjcxODY5ZiBhbmQgZjcxODY5ZSwgcmVnLiBjb21wYXRpYmxlIGFuZCBzYW1lIGlkICovCisJImY3MTg2OWEiLAogCSJmNzE4ODJmZyIsCiAJImY3MTg4OWZnIiwgLyogZjgxODAxdSB0b28sIHNhbWUgaWQgKi8KIAkiZjcxODg5ZWQiLApAQCAtMTMxLDYgKzEzMyw3IEBACiAJW2Y3MTg1OGZnXQk9IHsgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCB9LAogCVtmNzE4NjJmZ10JPSB7IDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfSwKIAlbZjcxODY5XQk9IHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9LAorCVtmNzE4NjlhXQk9IHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9LAogCVtmNzE4ODJmZ10JPSB7IDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfSwKIAlbZjcxODg5ZmddCT0geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH0sCiAJW2Y3MTg4OWVkXQk9IHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9LApAQCAtMTQ1LDYgKzE0OCw3IEBACiAJW2Y3MTg1OGZnXQk9IDAsCiAJW2Y3MTg2MmZnXQk9IDAsCiAJW2Y3MTg2OV0JPSAwLAorCVtmNzE4NjlhXQk9IDAsCiAJW2Y3MTg4MmZnXQk9IDEsCiAJW2Y3MTg4OWZnXQk9IDEsCiAJW2Y3MTg4OWVkXQk9IDEsCkBAIC0xNTksNiArMTYzLDcgQEAKIAlbZjcxODU4ZmddCT0gMCwKIAlbZjcxODYyZmddCT0gMSwKIAlbZjcxODY5XQk9IDEsCisJW2Y3MTg2OWFdCT0gMSwKIAlbZjcxODgyZmddCT0gMSwKIAlbZjcxODg5ZmddCT0gMSwKIAlbZjcxODg5ZWRdCT0gMSwKQEAgLTE3Myw2ICsxNzgsNyBAQAogCVtmNzE4NThmZ10JPSAzLAogCVtmNzE4NjJmZ10JPSAzLAogCVtmNzE4NjldCT0gMywKKwlbZjcxODY5YV0JPSAzLAogCVtmNzE4ODJmZ10JPSA0LAogCVtmNzE4ODlmZ10JPSAzLAogCVtmNzE4ODllZF0JPSAzLApAQCAtMTg3LDYgKzE5Myw3IEBACiAJW2Y3MTg1OGZnXQk9IDAsCiAJW2Y3MTg2MmZnXQk9IDEsCiAJW2Y3MTg2OV0JPSAxLAorCVtmNzE4NjlhXQk9IDEsCiAJW2Y3MTg4MmZnXQk9IDEsCiAJW2Y3MTg4OWZnXQk9IDEsCiAJW2Y3MTg4OWVkXQk9IDEsCkBAIC0yMDEsNiArMjA4LDcgQEAKIAlbZjcxODU4ZmddCT0gMywKIAlbZjcxODYyZmddCT0gMywKIAlbZjcxODY5XQk9IDMsCisJW2Y3MTg2OWFdCT0gMywKIAlbZjcxODgyZmddCT0gMywKIAlbZjcxODg5ZmddCT0gMywKIAlbZjcxODg5ZWRdCT0gMywKQEAgLTIyNDMsNiArMjI1MSw3IEBACiAJCWNhc2UgZjcxODA4ZToKIAkJY2FzZSBmNzE4MDhhOgogCQljYXNlIGY3MTg2OToKKwkJY2FzZSBmNzE4NjlhOgogCQkJLyogVGhlc2UgYWx3YXlzIGhhdmUgc2lnbmVkIGF1dG8gcG9pbnQgdGVtcHMgKi8KIAkJCWRhdGEtPmF1dG9fcG9pbnRfdGVtcF9zaWduZWQgPSAxOwogCQkJLyogRmFsbCB0aHJvdWdoIHRvIHNlbGVjdCBjb3JyZWN0IGZhbi9wd20gcmVnIGJhbmshICovCkBAIC0yMzA1LDYgKzIzMTQsNyBAQAogCQljYXNlIGY3MTgwOGU6CiAJCWNhc2UgZjcxODA4YToKIAkJY2FzZSBmNzE4Njk6CisJCWNhc2UgZjcxODY5YToKIAkJY2FzZSBmNzE4ODlmZzoKIAkJY2FzZSBmNzE4ODllZDoKIAkJY2FzZSBmNzE4ODlhOgpAQCAtMjUyOCw2ICsyNTM4LDkgQEAKIAljYXNlIFNJT19GNzE4NjlfSUQ6CiAJCXNpb19kYXRhLT50eXBlID0gZjcxODY5OwogCQlicmVhazsKKwljYXNlIFNJT19GNzE4NjlBX0lEOgorCQlzaW9fZGF0YS0+dHlwZSA9IGY3MTg2OWE7CisJCWJyZWFrOwogCWNhc2UgU0lPX0Y3MTg4Ml9JRDoKIAkJc2lvX2RhdGEtPnR5cGUgPSBmNzE4ODJmZzsKIAkJYnJlYWs7CkBAIC0yNjYyLDcgKzI2NzUsNyBAQAogfQogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkY3MTg4MkZHIEhhcmR3YXJlIE1vbml0b3JpbmcgRHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJIYW5zIEVkZ2luZ3RvbiwgSGFucyBkZSBHb2VkZSAoaGRlZ29lZGVAcmVkaGF0LmNvbSkiKTsKK01PRFVMRV9BVVRIT1IoIkhhbnMgRWRnaW5ndG9uLCBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBtb2R1bGVfaW5pdChmNzE4ODJmZ19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZ2w1MjBzbS5jIGIvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKaW5kZXggZWM1ODgwMi4uMTMxZWE4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKKysrIGIvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKQEAgLTI3Myw3ICsyNzMsNyBAQAogCiAjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQogI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wID8gMCA6ICg0ODAwMDAvKCh2YWwpIDw8IChkaXYpKSkpCi0jZGVmaW5lIEZBTl9UT19SRUcodmFsLGRpdikgKCh2YWwpPD0wPzA6U0VOU09SU19MSU1JVCgoNDgwMDAwICsgKCh2YWwpIDw8ICgoZGl2KS0xKSkpIC8gKCh2YWwpIDw8IChkaXYpKSwgMSwgMjU1KSk7CisjZGVmaW5lIEZBTl9UT19SRUcodmFsLGRpdikgKCh2YWwpPD0wPzA6U0VOU09SU19MSU1JVCgoNDgwMDAwICsgKCh2YWwpIDw8ICgoZGl2KS0xKSkpIC8gKCh2YWwpIDw8IChkaXYpKSwgMSwgMjU1KSkKIAogc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgICBjaGFyICpidWYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2h3bW9uLXZpZC5jIGIvZHJpdmVycy9od21vbi9od21vbi12aWQuYwppbmRleCAyNTgyYmZlLi45MzJkYThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2h3bW9uLXZpZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMKQEAgLTE0MCw3ICsxNDAsMTEgQEAKIAkJcmV0dXJuKHZhbCAmIDB4MTAgPyA5NzUgLSAodmFsICYgMHhGKSAqIDI1IDoKIAkJCQkgICAgMTc1MCAtIHZhbCAqIDUwKTsKIAljYXNlIDEzOgorCWNhc2UgMTMxOgogCQl2YWwgJj0gMHgzZjsKKwkJLyogRXhjZXB0aW9uIGZvciBFZGVuIFVMViA1MDAgTUh6ICovCisJCWlmICh2cm0gPT0gMTMxICYmIHZhbCA9PSAweDNmKQorCQkJdmFsKys7CiAJCXJldHVybigxNzA4IC0gdmFsICogMTYpOwogCWNhc2UgMTQ6CQkvKiBJbnRlbCBDb3JlICovCiAJCQkJLyogY29tcHV0ZSBpbiB1Viwgcm91bmQgdG8gbVYgKi8KQEAgLTIwMiwxNCArMjA2LDQ4IEBACiAKIAl7WDg2X1ZFTkRPUl9DRU5UQVVSLCAweDYsIDB4NywgQU5ZLCA4NX0sCS8qIEVkZW4gRVNQL0V6cmEgKi8KIAl7WDg2X1ZFTkRPUl9DRU5UQVVSLCAweDYsIDB4OCwgMHg3LCA4NX0sCS8qIEV6cmEgVCAqLwotCXtYODZfVkVORE9SX0NFTlRBVVIsIDB4NiwgMHg5LCAweDcsIDg1fSwJLyogTmVtaWFoICovCisJe1g4Nl9WRU5ET1JfQ0VOVEFVUiwgMHg2LCAweDksIDB4NywgODV9LAkvKiBOZWhlbWlhaCAqLwogCXtYODZfVkVORE9SX0NFTlRBVVIsIDB4NiwgMHg5LCBBTlksIDE3fSwJLyogQzMtTSwgRWRlbi1OICovCiAJe1g4Nl9WRU5ET1JfQ0VOVEFVUiwgMHg2LCAweEEsIDB4NywgMH0sCQkvKiBObyBpbmZvcm1hdGlvbiAqLwotCXtYODZfVkVORE9SX0NFTlRBVVIsIDB4NiwgMHhBLCBBTlksIDEzfSwJLyogQzcsIEVzdGhlciAqLworCXtYODZfVkVORE9SX0NFTlRBVVIsIDB4NiwgMHhBLCBBTlksIDEzfSwJLyogQzctTSwgQzcsIEVkZW4gKEVzdGhlcikgKi8KKwl7WDg2X1ZFTkRPUl9DRU5UQVVSLCAweDYsIDB4RCwgQU5ZLCAxMzR9LAkvKiBDNy1ELCBDNy1NLCBDNywgRWRlbiAoRXN0aGVyKSAqLwogCiAJe1g4Nl9WRU5ET1JfVU5LTk9XTiwgQU5ZLCBBTlksIEFOWSwgMH0JCS8qIHN0b3AgaGVyZSAqLwogfTsKIAorLyoKKyAqIFNwZWNpYWwgY2FzZSBmb3IgVklBIG1vZGVsIEQ6IHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHBvc3NpYmxlCisgKiBWSUQgdGFibGVzLCBzbyB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgZmlyc3QsIHdoaWNoIG9uZSBtdXN0IGJlCisgKiB1c2VkLiBUaGlzIHJlc29sdmVzIHRlbXBvcmFyeSBkcm0gdmFsdWUgMTM0IHRvIDE0IChJbnRlbCBDb3JlCisgKiA3LWJpdCBWSUQpLCAxMyAoUGVudGl1bSBNIDYtYml0IFZJRCkgb3IgMTMxIChQZW50aXVtIE0gNi1iaXQgVklECisgKiArIHF1aXJrIGZvciBFZGVuIFVMViA1MDAgTUh6KS4KKyAqIE5vdGU6IHNvbWV0aGluZyBzaW1pbGFyIG1pZ2h0IGJlIG5lZWRlZCBmb3IgbW9kZWwgQSwgSSdtIG5vdCBzdXJlLgorICovCitzdGF0aWMgdTggZ2V0X3ZpYV9tb2RlbF9kX3ZybSh2b2lkKQoreworCXVuc2lnbmVkIGludCB2aWQsIGJyYW5kLCBkdW1teTsKKwlzdGF0aWMgY29uc3QgY2hhciAqYnJhbmRzWzRdID0geworCQkiQzctTSIsICJDNyIsICJFZGVuIiwgIkM3LUQiCisJfTsKKworCXJkbXNyKDB4MTk4LCBkdW1teSwgdmlkKTsKKwl2aWQgJj0gMHhmZjsKKworCXJkbXNyKDB4MTE1NCwgYnJhbmQsIGR1bW15KTsKKwlicmFuZCA9ICgoYnJhbmQgPj4gNCkgXiAoYnJhbmQgPj4gMikpICYgMHgwMzsKKworCWlmICh2aWQgPiAweDNmKSB7CisJCXByX2luZm8oIlVzaW5nICVkLWJpdCBWSUQgdGFibGUgZm9yIFZJQSAlcyBDUFVcbiIsCisJCQk3LCBicmFuZHNbYnJhbmRdKTsKKwkJcmV0dXJuIDE0OworCX0gZWxzZSB7CisJCXByX2luZm8oIlVzaW5nICVkLWJpdCBWSUQgdGFibGUgZm9yIFZJQSAlcyBDUFVcbiIsCisJCQk2LCBicmFuZHNbYnJhbmRdKTsKKwkJLyogRW5hYmxlIHF1aXJrIGZvciBFZGVuICovCisJCXJldHVybiBicmFuZCA9PSAyID8gMTMxIDogMTM7CisJfQorfQorCiBzdGF0aWMgdTggZmluZF92cm0odTggZWZmX2ZhbWlseSwgdTggZWZmX21vZGVsLCB1OCBlZmZfc3RlcHBpbmcsIHU4IHZlbmRvcikKIHsKIAlpbnQgaSA9IDA7CkBAIC0yNDcsNiArMjg1LDggQEAKIAkJZWZmX21vZGVsICs9ICgoZWF4ICYgMHgwMDBGMDAwMCk+PjE2KTw8NDsKIAl9CiAJdnJtX3JldCA9IGZpbmRfdnJtKGVmZl9mYW1pbHksIGVmZl9tb2RlbCwgZWZmX3N0ZXBwaW5nLCBjLT54ODZfdmVuZG9yKTsKKwlpZiAodnJtX3JldCA9PSAxMzQpCisJCXZybV9yZXQgPSBnZXRfdmlhX21vZGVsX2RfdnJtKCk7CiAJaWYgKHZybV9yZXQgPT0gMCkKIAkJcHJfaW5mbygiVW5rbm93biBWUk0gdmVyc2lvbiBvZiB5b3VyIHg4NiBDUFVcbiIpOwogCXJldHVybiB2cm1fcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pYm1hZW0uYyBiL2RyaXZlcnMvaHdtb24vaWJtYWVtLmMKaW5kZXggNTM3NDA5ZC4uMWE0MDljNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pYm1hZW0uYworKysgYi9kcml2ZXJzL2h3bW9uL2libWFlbS5jCkBAIC05NDcsNiArOTQ3LDcgQEAKIAogCS8qIFNldCB1cCByZWFkLW9ubHkgc2Vuc29ycyAqLwogCXdoaWxlIChyby0+bGFiZWwpIHsKKwkJc3lzZnNfYXR0cl9pbml0KCZzZW5zb3JzLT5kZXZfYXR0ci5hdHRyKTsKIAkJc2Vuc29ycy0+ZGV2X2F0dHIuYXR0ci5uYW1lID0gcm8tPmxhYmVsOwogCQlzZW5zb3JzLT5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwogCQlzZW5zb3JzLT5kZXZfYXR0ci5zaG93ID0gcm8tPnNob3c7CkBAIC05NjMsNiArOTY0LDcgQEAKIAogCS8qIFNldCB1cCByZWFkLXdyaXRlIHNlbnNvcnMgKi8KIAl3aGlsZSAocnctPmxhYmVsKSB7CisJCXN5c2ZzX2F0dHJfaW5pdCgmc2Vuc29ycy0+ZGV2X2F0dHIuYXR0cik7CiAJCXNlbnNvcnMtPmRldl9hdHRyLmF0dHIubmFtZSA9IHJ3LT5sYWJlbDsKIAkJc2Vuc29ycy0+ZGV2X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1I7CiAJCXNlbnNvcnMtPmRldl9hdHRyLnNob3cgPSBydy0+c2hvdzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMgYi9kcml2ZXJzL2h3bW9uL2libXBleC5jCmluZGV4IDA2ZDRlYWYuLjQxZGJmODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMKKysrIGIvZHJpdmVycy9od21vbi9pYm1wZXguYwpAQCAtMzU4LDYgKzM1OCw3IEBACiAJZWxzZSBpZiAodHlwZSA9PSBQT1dFUl9TRU5TT1IpCiAJCXNwcmludGYobiwgcG93ZXJfc2Vuc29yX25hbWVfdGVtcGxhdGVzW2Z1bmNdLCAicG93ZXIiLCBjb3VudGVyKTsKIAorCXN5c2ZzX2F0dHJfaW5pdCgmZGF0YS0+c2Vuc29yc1tzZW5zb3JdLmF0dHJbZnVuY10uZGV2X2F0dHIuYXR0cik7CiAJZGF0YS0+c2Vuc29yc1tzZW5zb3JdLmF0dHJbZnVuY10uZGV2X2F0dHIuYXR0ci5uYW1lID0gbjsKIAlkYXRhLT5zZW5zb3JzW3NlbnNvcl0uYXR0cltmdW5jXS5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwogCWRhdGEtPnNlbnNvcnNbc2Vuc29yXS5hdHRyW2Z1bmNdLmRldl9hdHRyLnNob3cgPSBpYm1wZXhfc2hvd19zZW5zb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2l0ODcuYyBiL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCmluZGV4IGJiNjQwNWIuLmQ5MTI2NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCisrKyBiL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCkBAIC0xMTcyLDYgKzExNzIsMzIgQEAKIAlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIChkYXRhLT5hbGFybXMgPj4gYml0bnIpICYgMSk7CiB9CisKK3N0YXRpYyBzc2l6ZV90IGNsZWFyX2ludHJ1c2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisJCSphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJbG9uZyB2YWw7CisJaW50IGNvbmZpZzsKKworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCB8fCB2YWwgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJY29uZmlnID0gaXQ4N19yZWFkX3ZhbHVlKGRhdGEsIElUODdfUkVHX0NPTkZJRyk7CisJaWYgKGNvbmZpZyA8IDApIHsKKwkJY291bnQgPSBjb25maWc7CisJfSBlbHNlIHsKKwkJY29uZmlnIHw9IDEgPDwgNTsKKwkJaXQ4N193cml0ZV92YWx1ZShkYXRhLCBJVDg3X1JFR19DT05GSUcsIGNvbmZpZyk7CisJCS8qIEludmFsaWRhdGUgY2FjaGUgdG8gZm9yY2UgcmUtcmVhZCAqLworCQlkYXRhLT52YWxpZCA9IDA7CisJfQorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgOCk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgOSk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTApOwpAQCAtMTE4OCw2ICsxMjE0LDggQEAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDE2KTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDE3KTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDE4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW50cnVzaW9uMF9hbGFybSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgIHNob3dfYWxhcm0sIGNsZWFyX2ludHJ1c2lvbiwgNCk7CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfYmVlcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljaGFyICpidWYpCkBAIC0xMzUwLDYgKzEzNzgsNyBAQAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAogCSZkZXZfYXR0cl9hbGFybXMuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ludHJ1c2lvbjBfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmZGV2X2F0dHJfbmFtZS5hdHRyLAogCU5VTEwKIH07CkBAIC0xNTM4LDcgKzE1NjcsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaXQ4N19ncm91cF9sYWJlbCA9IHsKLQkuYXR0cnMgPSBpdDg3X2F0dHJpYnV0ZXNfdmlkLAorCS5hdHRycyA9IGl0ODdfYXR0cmlidXRlc19sYWJlbCwKIH07CiAKIC8qIFN1cGVySU8gZGV0ZWN0aW9uIC0gd2lsbCBjaGFuZ2UgaXNhX2FkZHJlc3MgaWYgYSBjaGlwIGlzIGZvdW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzguYyBiL2RyaXZlcnMvaHdtb24vbG03OC5jCmluZGV4IDRjYjI0ZWEuLjZkZjBiNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03OC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03OC5jCkBAIC0yLDcgKzIsNyBAQAogICAgIGxtNzguYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCiAgICAgICAgICAgICAgbW9uaXRvcmluZwogICAgIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDcgICAgICAgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICAgIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CiAKICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yNiwyMyArMjYsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLS8qIElTQSBkZXZpY2UsIGlmIGZvdW5kICovCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKyNpZmRlZiBDT05GSUdfSVNBCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNlbmRpZgogCiAvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwKIAkJCQkJCTB4MmUsIDB4MmYsIEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgaXNhX2FkZHJlc3MgPSAweDI5MDsKLQogZW51bSBjaGlwcyB7IGxtNzgsIGxtNzkgfTsKIAogLyogTWFueSBMTTc4IGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KQEAgLTE0Myw1MCArMTQxLDEyIEBACiB9OwogCiAKLXN0YXRpYyBpbnQgbG03OF9pMmNfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pOwotc3RhdGljIGludCBsbTc4X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpOwotc3RhdGljIGludCBsbTc4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGxtNzhfaXNhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwotc3RhdGljIGludCBfX2RldmV4aXQgbG03OF9pc2FfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwotCiBzdGF0aWMgaW50IGxtNzhfcmVhZF92YWx1ZShzdHJ1Y3QgbG03OF9kYXRhICpkYXRhLCB1OCByZWcpOwogc3RhdGljIGludCBsbTc4X3dyaXRlX3ZhbHVlKHN0cnVjdCBsbTc4X2RhdGEgKmRhdGEsIHU4IHJlZywgdTggdmFsdWUpOwogc3RhdGljIHN0cnVjdCBsbTc4X2RhdGEgKmxtNzhfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgbG03OF9pbml0X2RldmljZShzdHJ1Y3QgbG03OF9kYXRhICpkYXRhKTsKIAogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbG03OF9pMmNfaWRbXSA9IHsKLQl7ICJsbTc4IiwgbG03OCB9LAotCXsgImxtNzkiLCBsbTc5IH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGxtNzhfaTJjX2lkKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtNzhfZHJpdmVyID0gewotCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAibG03OCIsCi0JfSwKLQkucHJvYmUJCT0gbG03OF9pMmNfcHJvYmUsCi0JLnJlbW92ZQkJPSBsbTc4X2kyY19yZW1vdmUsCi0JLmlkX3RhYmxlCT0gbG03OF9pMmNfaWQsCi0JLmRldGVjdAkJPSBsbTc4X2kyY19kZXRlY3QsCi0JLmFkZHJlc3NfbGlzdAk9IG5vcm1hbF9pMmMsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBsbTc4X2lzYV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JCS5uYW1lCT0gImxtNzgiLAotCX0sCi0JLnByb2JlCQk9IGxtNzhfaXNhX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobG03OF9pc2FfcmVtb3ZlKSwKLX07Ci0KLQogLyogNyBWb2x0YWdlcyAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKIAkJICAgICAgIGNoYXIgKmJ1ZikKQEAgLTUxNCw2ICs0NzQsMTYgQEAKIAkuYXR0cnMgPSBsbTc4X2F0dHJpYnV0ZXMsCiB9OwogCisvKgorICogSVNBIHJlbGF0ZWQgY29kZQorICovCisjaWZkZWYgQ09ORklHX0lTQQorCisvKiBJU0EgZGV2aWNlLCBpZiBmb3VuZCAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpc2FfYWRkcmVzcyA9IDB4MjkwOworCiAvKiBJMkMgZGV2aWNlcyBnZXQgdGhpcyBuYW1lIGF0dHJpYnV0ZSBhdXRvbWF0aWNhbGx5LCBidXQgZm9yIElTQSBkZXZpY2VzCiAgICB3ZSBtdXN0IGNyZWF0ZSBpdCBieSBvdXJzZWx2ZXMuICovCiBzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQpAQCAtNTI1LDYgKzQ5NSwxMSBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCk7CiAKK3N0YXRpYyBzdHJ1Y3QgbG03OF9kYXRhICpsbTc4X2RhdGFfaWZfaXNhKHZvaWQpCit7CisJcmV0dXJuIHBkZXYgPyBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSA6IE5VTEw7Cit9CisKIC8qIFJldHVybnMgMSBpZiB0aGUgSTJDIGNoaXAgYXBwZWFycyB0byBiZSBhbiBhbGlhcyBvZiB0aGUgSVNBIGNoaXAgKi8KIHN0YXRpYyBpbnQgbG03OF9hbGlhc19kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY2hpcGlkKQogewpAQCAtNTU4LDEyICs1MzMsMjQgQEAKIAogCXJldHVybiAxOwogfQorI2Vsc2UgLyogIUNPTkZJR19JU0EgKi8KKworc3RhdGljIGludCBsbTc4X2FsaWFzX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjaGlwaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG03OF9kYXRhICpsbTc4X2RhdGFfaWZfaXNhKHZvaWQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLwogCiBzdGF0aWMgaW50IGxtNzhfaTJjX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJICAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewogCWludCBpOwotCXN0cnVjdCBsbTc4X2RhdGEgKmlzYSA9IHBkZXYgPyBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSA6IE5VTEw7CisJc3RydWN0IGxtNzhfZGF0YSAqaXNhID0gbG03OF9kYXRhX2lmX2lzYSgpOwogCWNvbnN0IGNoYXIgKmNsaWVudF9uYW1lOwogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKIAlpbnQgYWRkcmVzcyA9IGNsaWVudC0+YWRkcjsKQEAgLTY2Myw3NiArNjUwLDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGxtNzhfaXNhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGxtNzhfaTJjX2lkW10gPSB7CisJeyAibG03OCIsIGxtNzggfSwKKwl7ICJsbTc5IiwgbG03OSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsbTc4X2kyY19pZCk7CiAKLQkvKiBSZXNlcnZlIHRoZSBJU0EgcmVnaW9uICovCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOwotCWlmICghcmVxdWVzdF9yZWdpb24ocmVzLT5zdGFydCArIExNNzhfQUREUl9SRUdfT0ZGU0VULCAyLCAibG03OCIpKSB7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICghKGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbG03OF9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXhpdF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0JbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7Ci0JZGF0YS0+aXNhX2FkZHIgPSByZXMtPnN0YXJ0OwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOwotCi0JaWYgKGxtNzhfcmVhZF92YWx1ZShkYXRhLCBMTTc4X1JFR19DSElQSUQpICYgMHg4MCkgewotCQlkYXRhLT50eXBlID0gbG03OTsKLQkJZGF0YS0+bmFtZSA9ICJsbTc5IjsKLQl9IGVsc2UgewotCQlkYXRhLT50eXBlID0gbG03ODsKLQkJZGF0YS0+bmFtZSA9ICJsbTc4IjsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBMTTc4IGNoaXAgKi8KLQlsbTc4X2luaXRfZGV2aWNlKGRhdGEpOwotCi0JLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQlpZiAoKGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZsbTc4X2dyb3VwKSkKLQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfbmFtZSkpKQotCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOwotCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwotCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewotCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7Ci0JCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLSBleGl0X3JlbW92ZV9maWxlczoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmbG03OF9ncm91cCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKLQlrZnJlZShkYXRhKTsKLSBleGl0X3JlbGVhc2VfcmVnaW9uOgotCXJlbGVhc2VfcmVnaW9uKHJlcy0+c3RhcnQgKyBMTTc4X0FERFJfUkVHX09GRlNFVCwgMik7Ci0gZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBsbTc4X2lzYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZsbTc4X2dyb3VwKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX25hbWUpOwotCWtmcmVlKGRhdGEpOwotCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOwotCXJlbGVhc2VfcmVnaW9uKHJlcy0+c3RhcnQgKyBMTTc4X0FERFJfUkVHX09GRlNFVCwgMik7Ci0KLQlyZXR1cm4gMDsKLX0KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTc4X2RyaXZlciA9IHsKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImxtNzgiLAorCX0sCisJLnByb2JlCQk9IGxtNzhfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gbG03OF9pMmNfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGxtNzhfaTJjX2lkLAorCS5kZXRlY3QJCT0gbG03OF9pMmNfZGV0ZWN0LAorCS5hZGRyZXNzX2xpc3QJPSBub3JtYWxfaTJjLAorfTsKIAogLyogVGhlIFNNQnVzIGxvY2tzIGl0c2VsZiwgYnV0IElTQSBhY2Nlc3MgbXVzdCBiZSBsb2NrZWQgZXhwbGljaXRseSEgCiAgICBXZSBkb24ndCB3YW50IHRvIGxvY2sgdGhlIHdob2xlIElTQSBidXMsIHNvIHdlIGxvY2sgZWFjaCBjbGllbnQKQEAgLTc0Myw2ICs2NzgsNyBAQAogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAKKyNpZmRlZiBDT05GSUdfSVNBCiAJaWYgKCFjbGllbnQpIHsgLyogSVNBIGRldmljZSAqLwogCQlpbnQgcmVzOwogCQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTc1MSw2ICs2ODcsNyBAQAogCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOwogCQlyZXR1cm4gcmVzOwogCX0gZWxzZQorI2VuZGlmCiAJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwogfQogCkBAIC03NjUsNiArNzAyLDcgQEAKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCisjaWZkZWYgQ09ORklHX0lTQQogCWlmICghY2xpZW50KSB7IC8qIElTQSBkZXZpY2UgKi8KIAkJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CiAJCW91dGJfcChyZWcsIGRhdGEtPmlzYV9hZGRyICsgTE03OF9BRERSX1JFR19PRkZTRVQpOwpAQCAtNzcyLDYgKzcxMCw3IEBACiAJCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAJCXJldHVybiAwOwogCX0gZWxzZQorI2VuZGlmCiAJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CiB9CiAKQEAgLTg0OSw2ICs3ODgsODggQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAorI2lmZGVmIENPTkZJR19JU0EKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxtNzhfaXNhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbG03OF9kYXRhICpkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJLyogUmVzZXJ2ZSB0aGUgSVNBIHJlZ2lvbiAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHJlcy0+c3RhcnQgKyBMTTc4X0FERFJfUkVHX09GRlNFVCwgMiwgImxtNzgiKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxtNzhfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfcmVsZWFzZV9yZWdpb247CisJfQorCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOworCWRhdGEtPmlzYV9hZGRyID0gcmVzLT5zdGFydDsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKKworCWlmIChsbTc4X3JlYWRfdmFsdWUoZGF0YSwgTE03OF9SRUdfQ0hJUElEKSAmIDB4ODApIHsKKwkJZGF0YS0+dHlwZSA9IGxtNzk7CisJCWRhdGEtPm5hbWUgPSAibG03OSI7CisJfSBlbHNlIHsKKwkJZGF0YS0+dHlwZSA9IGxtNzg7CisJCWRhdGEtPm5hbWUgPSAibG03OCI7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgTE03OCBjaGlwICovCisJbG03OF9pbml0X2RldmljZShkYXRhKTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmbG03OF9ncm91cCkpCisJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX25hbWUpKSkKKwkJZ290byBleGl0X3JlbW92ZV9maWxlczsKKworCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOworCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOworCX0KKworCXJldHVybiAwOworCisgZXhpdF9yZW1vdmVfZmlsZXM6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmxtNzhfZ3JvdXApOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfbmFtZSk7CisJa2ZyZWUoZGF0YSk7CisgZXhpdF9yZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihyZXMtPnN0YXJ0ICsgTE03OF9BRERSX1JFR19PRkZTRVQsIDIpOworIGV4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbG03OF9pc2FfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGxtNzhfZGF0YSAqZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmbG03OF9ncm91cCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKKwlrZnJlZShkYXRhKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwlyZWxlYXNlX3JlZ2lvbihyZXMtPnN0YXJ0ICsgTE03OF9BRERSX1JFR19PRkZTRVQsIDIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGxtNzhfaXNhX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm5hbWUJPSAibG03OCIsCisJfSwKKwkucHJvYmUJCT0gbG03OF9pc2FfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChsbTc4X2lzYV9yZW1vdmUpLAorfTsKKwogLyogcmV0dXJuIDEgaWYgYSBzdXBwb3J0ZWQgY2hpcCBpcyBmb3VuZCwgMCBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgX19pbml0IGxtNzhfaXNhX2ZvdW5kKHVuc2lnbmVkIHNob3J0IGFkZHJlc3MpCiB7CkBAIC05NjksMTIgKzk5MCwxMCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHNtX2xtNzhfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgbG03OF9pc2FfcmVnaXN0ZXIodm9pZCkKIHsKIAlpbnQgcmVzOwogCi0JLyogV2UgcmVnaXN0ZXIgdGhlIElTQSBkZXZpY2UgZmlyc3QsIHNvIHRoYXQgd2UgY2FuIHNraXAgdGhlCi0JICogcmVnaXN0cmF0aW9uIG9mIGFuIEkyQyBpbnRlcmZhY2UgdG8gdGhlIHNhbWUgZGV2aWNlLiAqLwogCWlmIChsbTc4X2lzYV9mb3VuZChpc2FfYWRkcmVzcykpIHsKIAkJcmVzID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZsbTc4X2lzYV9kcml2ZXIpOwogCQlpZiAocmVzKQpAQCAtOTg2LDYgKzEwMDUsNDMgQEAKIAkJCWdvdG8gZXhpdF91bnJlZ19pc2FfZHJpdmVyOwogCX0KIAorCXJldHVybiAwOworCisgZXhpdF91bnJlZ19pc2FfZHJpdmVyOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZsbTc4X2lzYV9kcml2ZXIpOworIGV4aXQ6CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgbG03OF9pc2FfdW5yZWdpc3Rlcih2b2lkKQoreworCWlmIChwZGV2KSB7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOworCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbG03OF9pc2FfZHJpdmVyKTsKKwl9Cit9CisjZWxzZSAvKiAhQ09ORklHX0lTQSAqLworCitzdGF0aWMgaW50IF9faW5pdCBsbTc4X2lzYV9yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsbTc4X2lzYV91bnJlZ2lzdGVyKHZvaWQpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworCitzdGF0aWMgaW50IF9faW5pdCBzbV9sbTc4X2luaXQodm9pZCkKK3sKKwlpbnQgcmVzOworCisJLyogV2UgcmVnaXN0ZXIgdGhlIElTQSBkZXZpY2UgZmlyc3QsIHNvIHRoYXQgd2UgY2FuIHNraXAgdGhlCisJICogcmVnaXN0cmF0aW9uIG9mIGFuIEkyQyBpbnRlcmZhY2UgdG8gdGhlIHNhbWUgZGV2aWNlLiAqLworCXJlcyA9IGxtNzhfaXNhX3JlZ2lzdGVyKCk7CisJaWYgKHJlcykKKwkJZ290byBleGl0OworCiAJcmVzID0gaTJjX2FkZF9kcml2ZXIoJmxtNzhfZHJpdmVyKTsKIAlpZiAocmVzKQogCQlnb3RvIGV4aXRfdW5yZWdfaXNhX2RldmljZTsKQEAgLTk5MywyNSArMTA0OSwxOCBAQAogCXJldHVybiAwOwogCiAgZXhpdF91bnJlZ19pc2FfZGV2aWNlOgotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwotIGV4aXRfdW5yZWdfaXNhX2RyaXZlcjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbG03OF9pc2FfZHJpdmVyKTsKKwlsbTc4X2lzYV91bnJlZ2lzdGVyKCk7CiAgZXhpdDoKIAlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc21fbG03OF9leGl0KHZvaWQpCiB7Ci0JaWYgKHBkZXYpIHsKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7Ci0JCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZsbTc4X2lzYV9kcml2ZXIpOwotCX0KKwlsbTc4X2lzYV91bnJlZ2lzdGVyKCk7CiAJaTJjX2RlbF9kcml2ZXIoJmxtNzhfZHJpdmVyKTsKIH0KIAotCi0KLU1PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4iKTsKK01PRFVMRV9BVVRIT1IoIkZyb2RvIExvb2lqYWFyZCwgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkxNNzgvTE03OSBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTk1MjQxLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwppbmRleCAxYTZkZmI2Li5kM2I0NjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwpAQCAtOTgsMTEgKzk4LDE2IEBACiB9OwogCiAvKiBDb252ZXJzaW9ucyAqLwotc3RhdGljIGludCBUZW1wRnJvbVJlZyh1OCB2YWxfaCwgdTggdmFsX2wpCitzdGF0aWMgaW50IHRlbXBfZnJvbV9yZWdfc2lnbmVkKHU4IHZhbF9oLCB1OCB2YWxfbCkKIHsKLQlpZiAodmFsX2ggJiAweDgwKQotCQlyZXR1cm4gdmFsX2ggLSAweDEwMDsKLQlyZXR1cm4gdmFsX2ggKiAxMDAwICsgdmFsX2wgKiAxMDAwIC8gMjU2OworCXMxNiB2YWxfaGwgPSAodmFsX2ggPDwgOCkgfCB2YWxfbDsKKwlyZXR1cm4gdmFsX2hsICogMTAwMCAvIDI1NjsKK30KKworc3RhdGljIGludCB0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKHU4IHZhbF9oLCB1OCB2YWxfbCkKK3sKKwl1MTYgdmFsX2hsID0gKHZhbF9oIDw8IDgpIHwgdmFsX2w7CisJcmV0dXJuIHZhbF9obCAqIDEwMDAgLyAyNTY7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbG05NTI0MV9kYXRhICpsbTk1MjQxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMTM1LDEwICsxNDAsMTMgQEAKIAkJCSAgY2hhciAqYnVmKQogewogCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBsbTk1MjQxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLAotCQlUZW1wRnJvbVJlZyhkYXRhLT50ZW1wW3RvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXhdLAotCQkJICAgIGRhdGEtPnRlbXBbdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCArIDFdKSk7CisJCQlpbmRleCA9PSAwIHx8IChkYXRhLT5jb25maWcgJiAoMSA8PCAoaW5kZXggLyAyKSkpID8KKwkJdGVtcF9mcm9tX3JlZ19zaWduZWQoZGF0YS0+dGVtcFtpbmRleF0sIGRhdGEtPnRlbXBbaW5kZXggKyAxXSkgOgorCQl0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKGRhdGEtPnRlbXBbaW5kZXhdLAorCQkJCSAgICAgICBkYXRhLT50ZW1wW2luZGV4ICsgMV0pKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCkBAIC0zMzksNyArMzQ3LDcgQEAKIAlpZiAoKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTk1MjQxX1JFR19SX01BTl9JRCkKIAkgICAgID09IE1BTlVGQUNUVVJFUl9JRCkKIAkgICAgJiYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTk1MjQxX1JFR19SX0NISVBfSUQpCi0JCT49IERFRkFVTFRfUkVWSVNJT04pKSB7CisJCT09IERFRkFVTFRfUkVWSVNJT04pKSB7CiAJCW5hbWUgPSBERVZOQU1FOwogCX0gZWxzZSB7CiAJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIkxNOTUyNDEgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnhcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL21heDExMTEuYyBiL2RyaXZlcnMvaHdtb24vbWF4MTExMS5jCmluZGV4IDEyYTU0YWEuLmM5N2I3OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbWF4MTExMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbWF4MTExMS5jCkBAIC0zOCw4ICszOCwxMCBAQAogCXN0cnVjdCBkZXZpY2UJCSpod21vbl9kZXY7CiAJc3RydWN0IHNwaV9tZXNzYWdlCW1zZzsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhmZXJbMl07Ci0JdWludDhfdCAqdHhfYnVmOwotCXVpbnQ4X3QgKnJ4X2J1ZjsKKwl1aW50OF90IHR4X2J1ZltNQVgxMTExX1RYX0JVRl9TSVpFXTsKKwl1aW50OF90IHJ4X2J1ZltNQVgxMTExX1JYX0JVRl9TSVpFXTsKKwlzdHJ1Y3QgbXV0ZXgJCWRydmRhdGFfbG9jazsKKwkvKiBwcm90ZWN0IG1zZywgeGZlciBhbmQgYnVmZmVycyBmcm9tIG11bHRpcGxlIGFjY2VzcyAqLwogfTsKIAogc3RhdGljIGludCBtYXgxMTExX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgY2hhbm5lbCkKQEAgLTQ4LDYgKzUwLDkgQEAKIAl1aW50OF90IHYxLCB2MjsKIAlpbnQgZXJyOwogCisJLyogd3JpdGluZyB0byBkcnZkYXRhIHN0cnVjdCBpcyBub3QgdGhyZWFkIHNhZmUsIHdhaXQgb24gbXV0ZXggKi8KKwltdXRleF9sb2NrKCZkYXRhLT5kcnZkYXRhX2xvY2spOworCiAJZGF0YS0+dHhfYnVmWzBdID0gKGNoYW5uZWwgPDwgTUFYMTExMV9DVFJMX1NFTF9TSCkgfAogCQlNQVgxMTExX0NUUkxfUEQwIHwgTUFYMTExMV9DVFJMX1BEMSB8CiAJCU1BWDExMTFfQ1RSTF9TR0wgfCBNQVgxMTExX0NUUkxfVU5JIHwgTUFYMTExMV9DVFJMX1NUUjsKQEAgLTU1LDEyICs2MCwxNSBAQAogCWVyciA9IHNwaV9zeW5jKGRhdGEtPnNwaSwgJmRhdGEtPm1zZyk7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2VycihkZXYsICJzcGlfc3luYyBmYWlsZWQgd2l0aCAlZFxuIiwgZXJyKTsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5kcnZkYXRhX2xvY2spOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCXYxID0gZGF0YS0+cnhfYnVmWzBdOwogCXYyID0gZGF0YS0+cnhfYnVmWzFdOwogCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5kcnZkYXRhX2xvY2spOworCiAJaWYgKCh2MSAmIDB4YzApIHx8ICh2MiAmIDB4M2YpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTIzLDMzICsxMzEsMjMgQEAKIAkuYXR0cnMJPSBtYXgxMTExX2F0dHJpYnV0ZXMsCiB9OwogCi1zdGF0aWMgaW50IHNldHVwX3RyYW5zZmVyKHN0cnVjdCBtYXgxMTExX2RhdGEgKmRhdGEpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzZXR1cF90cmFuc2ZlcihzdHJ1Y3QgbWF4MTExMV9kYXRhICpkYXRhKQogewogCXN0cnVjdCBzcGlfbWVzc2FnZSAqbTsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4OwogCi0JZGF0YS0+dHhfYnVmID0ga21hbGxvYyhNQVgxMTExX1RYX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEtPnR4X2J1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkYXRhLT5yeF9idWYgPSBrbWFsbG9jKE1BWDExMTFfUlhfQlVGX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghZGF0YS0+cnhfYnVmKSB7Ci0JCWtmcmVlKGRhdGEtPnR4X2J1Zik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQogCW0gPSAmZGF0YS0+bXNnOwogCXggPSAmZGF0YS0+eGZlclswXTsKIAogCXNwaV9tZXNzYWdlX2luaXQobSk7CiAKIAl4LT50eF9idWYgPSAmZGF0YS0+dHhfYnVmWzBdOwotCXgtPmxlbiA9IDE7CisJeC0+bGVuID0gTUFYMTExMV9UWF9CVUZfU0laRTsKIAlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCBtKTsKIAogCXgrKzsKIAl4LT5yeF9idWYgPSAmZGF0YS0+cnhfYnVmWzBdOwotCXgtPmxlbiA9IDI7CisJeC0+bGVuID0gTUFYMTExMV9SWF9CVUZfU0laRTsKIAlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCBtKTsKIAogCXJldHVybiAwOwpAQCAtMTc2LDEzICsxNzQsMTUgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9mcmVlX2RhdGE7CiAKKwltdXRleF9pbml0KCZkYXRhLT5kcnZkYXRhX2xvY2spOworCiAJZGF0YS0+c3BpID0gc3BpOwogCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGRhdGEpOwogCiAJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzcGktPmRldi5rb2JqLCAmbWF4MTExMV9hdHRyX2dyb3VwKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBhdHRyaWJ1dGUgZ3JvdXBcbiIpOwotCQlnb3RvIGVycl9mcmVlX2FsbDsKKwkJZ290byBlcnJfZnJlZV9kYXRhOwogCX0KIAogCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcigmc3BpLT5kZXYpOwpAQCAtMTk5LDkgKzE5OSw2IEBACiAKIGVycl9yZW1vdmU6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzcGktPmRldi5rb2JqLCAmbWF4MTExMV9hdHRyX2dyb3VwKTsKLWVycl9mcmVlX2FsbDoKLQlrZnJlZShkYXRhLT5yeF9idWYpOwotCWtmcmVlKGRhdGEtPnR4X2J1Zik7CiBlcnJfZnJlZV9kYXRhOgogCWtmcmVlKGRhdGEpOwogCXJldHVybiBlcnI7CkBAIC0yMTMsOCArMjEwLDcgQEAKIAogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzcGktPmRldi5rb2JqLCAmbWF4MTExMV9hdHRyX2dyb3VwKTsKLQlrZnJlZShkYXRhLT5yeF9idWYpOwotCWtmcmVlKGRhdGEtPnR4X2J1Zik7CisJbXV0ZXhfZGVzdHJveSgmZGF0YS0+ZHJ2ZGF0YV9sb2NrKTsKIAlrZnJlZShkYXRhKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXMuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMuYwppbmRleCA5OGUyZTI4Li45YjFmMGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BtYnVzLmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy5jCkBAIC00NywyMiArNDcsMjkgQEAKIAlpZiAoaW5mby0+ZnVuY1swXQogCSAgICAmJiBwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfU1RBVFVTX0lOUFVUKSkKIAkJaW5mby0+ZnVuY1swXSB8PSBQTUJVU19IQVZFX1NUQVRVU19JTlBVVDsKLQlpZiAocG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1JFQURfRkFOX1NQRUVEXzEpKSB7CisJaWYgKHBtYnVzX2NoZWNrX2J5dGVfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19GQU5fQ09ORklHXzEyKSAmJgorCSAgICBwbWJ1c19jaGVja193b3JkX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfUkVBRF9GQU5fU1BFRURfMSkpIHsKIAkJaW5mby0+ZnVuY1swXSB8PSBQTUJVU19IQVZFX0ZBTjEyOwogCQlpZiAocG1idXNfY2hlY2tfYnl0ZV9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1NUQVRVU19GQU5fMTIpKQogCQkJaW5mby0+ZnVuY1swXSB8PSBQTUJVU19IQVZFX1NUQVRVU19GQU4xMjsKIAl9Ci0JaWYgKHBtYnVzX2NoZWNrX3dvcmRfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19SRUFEX0ZBTl9TUEVFRF8zKSkgeworCWlmIChwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfRkFOX0NPTkZJR18zNCkgJiYKKwkgICAgcG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1JFQURfRkFOX1NQRUVEXzMpKSB7CiAJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9GQU4zNDsKIAkJaWYgKHBtYnVzX2NoZWNrX2J5dGVfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19TVEFUVVNfRkFOXzM0KSkKIAkJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9TVEFUVVNfRkFOMzQ7CiAJfQotCWlmIChwbWJ1c19jaGVja193b3JkX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfUkVBRF9URU1QRVJBVFVSRV8xKSkgeworCWlmIChwbWJ1c19jaGVja193b3JkX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfUkVBRF9URU1QRVJBVFVSRV8xKSkKIAkJaW5mby0+ZnVuY1swXSB8PSBQTUJVU19IQVZFX1RFTVA7Ci0JCWlmIChwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKGNsaWVudCwgMCwKLQkJCQkJICAgICAgUE1CVVNfU1RBVFVTX1RFTVBFUkFUVVJFKSkKKwlpZiAocG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1JFQURfVEVNUEVSQVRVUkVfMikpCisJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9URU1QMjsKKwlpZiAocG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1JFQURfVEVNUEVSQVRVUkVfMykpCisJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9URU1QMzsKKwlpZiAoaW5mby0+ZnVuY1swXSAmIChQTUJVU19IQVZFX1RFTVAgfCBQTUJVU19IQVZFX1RFTVAyCisJCQkgICAgIHwgUE1CVVNfSEFWRV9URU1QMykKKwkgICAgJiYgcG1idXNfY2hlY2tfYnl0ZV9yZWdpc3RlcihjbGllbnQsIDAsCisJCQkJCSBQTUJVU19TVEFUVVNfVEVNUEVSQVRVUkUpKQogCQkJaW5mby0+ZnVuY1swXSB8PSBQTUJVU19IQVZFX1NUQVRVU19URU1QOwotCX0KIAogCS8qIFNlbnNvcnMgZGV0ZWN0ZWQgb24gYWxsIHBhZ2VzICovCiAJZm9yIChwYWdlID0gMDsgcGFnZSA8IGluZm8tPnBhZ2VzOyBwYWdlKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXNfY29yZS5jIGIvZHJpdmVycy9od21vbi9wbWJ1c19jb3JlLmMKaW5kZXggMzU0NzcwZS4uOGUzMWE4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wbWJ1c19jb3JlLmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1c19jb3JlLmMKQEAgLTM2Miw4ICszNjIsOCBAQAogICogQ29udmVydCBsaW5lYXIgc2Vuc29yIHZhbHVlcyB0byBtaWxsaS0gb3IgbWljcm8tdW5pdHMKICAqIGRlcGVuZGluZyBvbiBzZW5zb3IgdHlwZS4KICAqLwotc3RhdGljIGludCBwbWJ1c19yZWcyZGF0YV9saW5lYXIoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsCi0JCQkJIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcikKK3N0YXRpYyBsb25nIHBtYnVzX3JlZzJkYXRhX2xpbmVhcihzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSwKKwkJCQkgIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcikKIHsKIAlzMTYgZXhwb25lbnQ7CiAJczMyIG1hbnRpc3NhOwpAQCAtMzk3LDE1ICszOTcsMTUgQEAKIAllbHNlCiAJCXZhbCA+Pj0gLWV4cG9uZW50OwogCi0JcmV0dXJuIChpbnQpdmFsOworCXJldHVybiB2YWw7CiB9CiAKIC8qCiAgKiBDb252ZXJ0IGRpcmVjdCBzZW5zb3IgdmFsdWVzIHRvIG1pbGxpLSBvciBtaWNyby11bml0cwogICogZGVwZW5kaW5nIG9uIHNlbnNvciB0eXBlLgogICovCi1zdGF0aWMgaW50IHBtYnVzX3JlZzJkYXRhX2RpcmVjdChzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSwKLQkJCQkgc3RydWN0IHBtYnVzX3NlbnNvciAqc2Vuc29yKQorc3RhdGljIGxvbmcgcG1idXNfcmVnMmRhdGFfZGlyZWN0KHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLAorCQkJCSAgc3RydWN0IHBtYnVzX3NlbnNvciAqc2Vuc29yKQogewogCWxvbmcgdmFsID0gKHMxNikgc2Vuc29yLT5kYXRhOwogCWxvbmcgbSwgYiwgUjsKQEAgLTQ0MCwxMiArNDQwLDEyIEBACiAJCVIrKzsKIAl9CiAKLQlyZXR1cm4gKGludCkoKHZhbCAtIGIpIC8gbSk7CisJcmV0dXJuICh2YWwgLSBiKSAvIG07CiB9CiAKLXN0YXRpYyBpbnQgcG1idXNfcmVnMmRhdGEoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcikKK3N0YXRpYyBsb25nIHBtYnVzX3JlZzJkYXRhKHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLCBzdHJ1Y3QgcG1idXNfc2Vuc29yICpzZW5zb3IpCiB7Ci0JaW50IHZhbDsKKwlsb25nIHZhbDsKIAogCWlmIChkYXRhLT5pbmZvLT5kaXJlY3Rbc2Vuc29yLT5jbGFzc10pCiAJCXZhbCA9IHBtYnVzX3JlZzJkYXRhX2RpcmVjdChkYXRhLCBzZW5zb3IpOwpAQCAtNjE5LDcgKzYxOSw3IEBACiAJaWYgKCFzMSAmJiAhczIpCiAJCSp2YWwgPSAhIXJlZ3ZhbDsKIAllbHNlIHsKLQkJaW50IHYxLCB2MjsKKwkJbG9uZyB2MSwgdjI7CiAJCXN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcjEsICpzZW5zb3IyOwogCiAJCXNlbnNvcjEgPSAmZGF0YS0+c2Vuc29yc1tzMV07CkBAIC02NjEsNyArNjYxLDcgQEAKIAlpZiAoc2Vuc29yLT5kYXRhIDwgMCkKIAkJcmV0dXJuIHNlbnNvci0+ZGF0YTsKIAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBwbWJ1c19yZWcyZGF0YShkYXRhLCBzZW5zb3IpKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIHBtYnVzX3JlZzJkYXRhKGRhdGEsIHNlbnNvcikpOwogfQogCiBzdGF0aWMgc3NpemVfdCBwbWJ1c19zZXRfc2Vuc29yKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTE0MzAsMTQgKzE0MzAsOSBAQAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCS8qCi0JICogQmFpbCBvdXQgaWYgc3RhdHVzIHJlZ2lzdGVyIG9yIFBNQnVzIHJldmlzaW9uIHJlZ2lzdGVyCi0JICogZG9lcyBub3QgZXhpc3QuCi0JICovCi0JaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFBNQlVTX1NUQVRVU19CWVRFKSA8IDAKLQkgICAgfHwgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgUE1CVVNfUkVWSVNJT04pIDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKLQkJCSJTdGF0dXMgb3IgcmV2aXNpb24gcmVnaXN0ZXIgbm90IGZvdW5kXG4iKTsKKwkvKiBCYWlsIG91dCBpZiBQTUJ1cyBzdGF0dXMgcmVnaXN0ZXIgZG9lcyBub3QgZXhpc3QuICovCisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFBNQlVTX1NUQVRVU19CWVRFKSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJQTUJ1cyBzdGF0dXMgcmVnaXN0ZXIgbm90IGZvdW5kXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXRfZGF0YTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3MzYy1od21vbi5jIGIvZHJpdmVycy9od21vbi9zM2MtaHdtb24uYwppbmRleCA5MmI0MmRiLi5iMzlmNTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3MzYy1od21vbi5jCisrKyBiL2RyaXZlcnMvaHdtb24vczNjLWh3bW9uLmMKQEAgLTIzMiw2ICsyMzIsNyBAQAogCiAJYXR0ciA9ICZhdHRycy0+aW47CiAJYXR0ci0+aW5kZXggPSBjaGFubmVsOworCXN5c2ZzX2F0dHJfaW5pdCgmYXR0ci0+ZGV2X2F0dHIuYXR0cik7CiAJYXR0ci0+ZGV2X2F0dHIuYXR0ci5uYW1lICA9IGF0dHJzLT5pbl9uYW1lOwogCWF0dHItPmRldl9hdHRyLmF0dHIubW9kZSAgPSBTX0lSVUdPOwogCWF0dHItPmRldl9hdHRyLnNob3cgPSBzM2NfaHdtb25fY2hfc2hvdzsKQEAgLTI0OSw2ICsyNTAsNyBAQAogCiAJCWF0dHIgPSAmYXR0cnMtPmxhYmVsOwogCQlhdHRyLT5pbmRleCA9IGNoYW5uZWw7CisJCXN5c2ZzX2F0dHJfaW5pdCgmYXR0ci0+ZGV2X2F0dHIuYXR0cik7CiAJCWF0dHItPmRldl9hdHRyLmF0dHIubmFtZSAgPSBhdHRycy0+bGFiZWxfbmFtZTsKIAkJYXR0ci0+ZGV2X2F0dHIuYXR0ci5tb2RlICA9IFNfSVJVR087CiAJCWF0dHItPmRldl9hdHRyLnNob3cgPSBzM2NfaHdtb25fbGFiZWxfc2hvdzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc2NoNTYyNy5jIGIvZHJpdmVycy9od21vbi9zY2g1NjI3LmMKaW5kZXggMDIwYzg3Mi4uZTNiNWM2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zY2g1NjI3LmMKKysrIGIvZHJpdmVycy9od21vbi9zY2g1NjI3LmMKQEAgLTI4LDMzICsyOCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInNjaDU2eHgtY29tbW9uLmgiCiAKICNkZWZpbmUgRFJWTkFNRSAic2NoNTYyNyIKICNkZWZpbmUgREVWTkFNRSBEUlZOQU1FIC8qIFdlIG9ubHkgc3VwcG9ydCBvbmUgbW9kZWwgKi8KIAotI2RlZmluZSBTSU9fU0NINTYyN19FTV9MRAkweDBDCS8qIEVtYmVkZGVkIE1pY3JvY29udHJvbGxlciBMRCAqLwotI2RlZmluZSBTSU9fVU5MT0NLX0tFWQkJMHg1NQkvKiBLZXkgdG8gZW5hYmxlIFN1cGVyLUkvTyAqLwotI2RlZmluZSBTSU9fTE9DS19LRVkJCTB4QUEJLyogS2V5IHRvIGRpc2FibGUgU3VwZXItSS9PICovCi0KLSNkZWZpbmUgU0lPX1JFR19MRFNFTAkJMHgwNwkvKiBMb2dpY2FsIGRldmljZSBzZWxlY3QgKi8KLSNkZWZpbmUgU0lPX1JFR19ERVZJRAkJMHgyMAkvKiBEZXZpY2UgSUQgKi8KLSNkZWZpbmUgU0lPX1JFR19FTkFCTEUJCTB4MzAJLyogTG9naWNhbCBkZXZpY2UgZW5hYmxlICovCi0jZGVmaW5lIFNJT19SRUdfQUREUgkJMHg2NgkvKiBMb2dpY2FsIGRldmljZSBhZGRyZXNzICgyIGJ5dGVzKSAqLwotCi0jZGVmaW5lIFNJT19TQ0g1NjI3X0lECQkweEM2CS8qIENoaXBzZXQgSUQgKi8KLQotI2RlZmluZSBSRUdJT05fTEVOR1RICQk5Ci0KICNkZWZpbmUgU0NINTYyN19IV01PTl9JRAkJMHhhNQogI2RlZmluZSBTQ0g1NjI3X0NPTVBBTllfSUQJCTB4NWMKICNkZWZpbmUgU0NINTYyN19QUklNQVJZX0lECQkweGEwCiAKLSNkZWZpbmUgU0NINTYyN19DTURfUkVBRAkJMHgwMgotI2RlZmluZSBTQ0g1NjI3X0NNRF9XUklURQkJMHgwMwotCiAjZGVmaW5lIFNDSDU2MjdfUkVHX0JVSUxEX0NPREUJCTB4MzkKICNkZWZpbmUgU0NINTYyN19SRUdfQlVJTERfSUQJCTB4M2EKICNkZWZpbmUgU0NINTYyN19SRUdfSFdNT05fSUQJCTB4M2MKQEAgLTExMSwxODIgKzkzLDYgQEAKIAl1MTYgaW5bU0NINTYyN19OT19JTl07CiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2NoNTYyN19wZGV2OwotCi0vKiBTdXBlciBJL08gZnVuY3Rpb25zICovCi1zdGF0aWMgaW5saW5lIGludCBzdXBlcmlvX2luYihpbnQgYmFzZSwgaW50IHJlZykKLXsKLQlvdXRiKHJlZywgYmFzZSk7Ci0JcmV0dXJuIGluYihiYXNlICsgMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHN1cGVyaW9fZW50ZXIoaW50IGJhc2UpCi17Ci0JLyogRG9uJ3Qgc3RlcCBvbiBvdGhlciBkcml2ZXJzJyBJL08gc3BhY2UgYnkgYWNjaWRlbnQgKi8KLQlpZiAoIXJlcXVlc3RfbXV4ZWRfcmVnaW9uKGJhc2UsIDIsIERSVk5BTUUpKSB7Ci0JCXByX2VycigiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLCBiYXNlKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlvdXRiKFNJT19VTkxPQ0tfS0VZLCBiYXNlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19zZWxlY3QoaW50IGJhc2UsIGludCBsZCkKLXsKLQlvdXRiKFNJT19SRUdfTERTRUwsIGJhc2UpOwotCW91dGIobGQsIGJhc2UgKyAxKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fZXhpdChpbnQgYmFzZSkKLXsKLQlvdXRiKFNJT19MT0NLX0tFWSwgYmFzZSk7Ci0JcmVsZWFzZV9yZWdpb24oYmFzZSwgMik7Ci19Ci0KLXN0YXRpYyBpbnQgc2NoNTYyN19zZW5kX2NtZChzdHJ1Y3Qgc2NoNTYyN19kYXRhICpkYXRhLCB1OCBjbWQsIHUxNiByZWcsIHU4IHYpCi17Ci0JdTggdmFsOwotCWludCBpOwotCS8qCi0JICogQWNjb3JkaW5nIHRvIFNNU0MgZm9yIHRoZSBjb21tYW5kcyB3ZSB1c2UgdGhlIG1heGltdW0gdGltZSBmb3IKLQkgKiB0aGUgRU0gdG8gcmVzcG9uZCBpcyAxNSBtcywgYnV0IHRlc3Rpbmcgc2hvd3MgaW4gcHJhY3RpY2UgaXQKLQkgKiByZXNwb25kcyB3aXRoaW4gMTUtMzIgcmVhZHMsIHNvIHdlIGZpcnN0IGJ1c3kgcG9sbCwgYW5kIGlmCi0JICogdGhhdCBmYWlscyBzbGVlcCBhIGJpdCBhbmQgdHJ5IGFnYWluIHVudGlsIHdlIGFyZSB3YXkgcGFzdAotCSAqIHRoZSAxNSBtcyBtYXhpbXVtIHJlc3BvbnNlIHRpbWUuCi0JICovCi0JY29uc3QgaW50IG1heF9idXN5X3BvbGxzID0gNjQ7Ci0JY29uc3QgaW50IG1heF9sYXp5X3BvbGxzID0gMzI7Ci0KLQkvKiAoT3B0aW9uYWwpIFdyaXRlLUNsZWFyIHRoZSBFQyB0byBIb3N0IE1haWxib3ggUmVnaXN0ZXIgKi8KLQl2YWwgPSBpbmIoZGF0YS0+YWRkciArIDEpOwotCW91dGIodmFsLCBkYXRhLT5hZGRyICsgMSk7Ci0KLQkvKiBTZXQgTWFpbGJveCBBZGRyZXNzIFBvaW50ZXIgdG8gZmlyc3QgbG9jYXRpb24gaW4gUmVnaW9uIDEgKi8KLQlvdXRiKDB4MDAsIGRhdGEtPmFkZHIgKyAyKTsKLQlvdXRiKDB4ODAsIGRhdGEtPmFkZHIgKyAzKTsKLQotCS8qIFdyaXRlIFJlcXVlc3QgUGFja2V0IEhlYWRlciAqLwotCW91dGIoY21kLCBkYXRhLT5hZGRyICsgNCk7IC8qIFZSRUcgQWNjZXNzIFR5cGUgcmVhZDoweDAyIHdyaXRlOjB4MDMgKi8KLQlvdXRiKDB4MDEsIGRhdGEtPmFkZHIgKyA1KTsgLyogIyBvZiBFbnRyaWVzOiAxIEJ5dGUgKDgtYml0KSAqLwotCW91dGIoMHgwNCwgZGF0YS0+YWRkciArIDIpOyAvKiBNYWlsYm94IEFQIHRvIGZpcnN0IGRhdGEgZW50cnkgbG9jLiAqLwotCi0JLyogV3JpdGUgVmFsdWUgZmllbGQgKi8KLQlpZiAoY21kID09IFNDSDU2MjdfQ01EX1dSSVRFKQotCQlvdXRiKHYsIGRhdGEtPmFkZHIgKyA0KTsKLQotCS8qIFdyaXRlIEFkZHJlc3MgZmllbGQgKi8KLQlvdXRiKHJlZyAmIDB4ZmYsIGRhdGEtPmFkZHIgKyA2KTsKLQlvdXRiKHJlZyA+PiA4LCBkYXRhLT5hZGRyICsgNyk7Ci0KLQkvKiBFeGVjdXRlIHRoZSBSYW5kb20gQWNjZXNzIENvbW1hbmQgKi8KLQlvdXRiKDB4MDEsIGRhdGEtPmFkZHIpOyAvKiBXcml0ZSAwMWggdG8gdGhlIEhvc3QtdG8tRUMgcmVnaXN0ZXIgKi8KLQotCS8qIEVNIEludGVyZmFjZSBQb2xsaW5nICJBbGdvcml0aG0iICovCi0JZm9yIChpID0gMDsgaSA8IG1heF9idXN5X3BvbGxzICsgbWF4X2xhenlfcG9sbHM7IGkrKykgewotCQlpZiAoaSA+PSBtYXhfYnVzeV9wb2xscykKLQkJCW1zbGVlcCgxKTsKLQkJLyogUmVhZCBJbnRlcnJ1cHQgc291cmNlIFJlZ2lzdGVyICovCi0JCXZhbCA9IGluYihkYXRhLT5hZGRyICsgOCk7Ci0JCS8qIFdyaXRlIENsZWFyIHRoZSBpbnRlcnJ1cHQgc291cmNlIGJpdHMgKi8KLQkJaWYgKHZhbCkKLQkJCW91dGIodmFsLCBkYXRhLT5hZGRyICsgOCk7Ci0JCS8qIENvbW1hbmQgQ29tcGxldGVkID8gKi8KLQkJaWYgKHZhbCAmIDB4MDEpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gbWF4X2J1c3lfcG9sbHMgKyBtYXhfbGF6eV9wb2xscykgewotCQlwcl9lcnIoIk1heCByZXRyaWVzIGV4Y2VlZGVkIHJlYWRpbmcgdmlydHVhbCAiCi0JCSAgICAgICAicmVnaXN0ZXIgMHglMDRoeCAoJWQpXG4iLCByZWcsIDEpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqIEFjY29yZGluZyB0byBTTVNDIHdlIG1heSBuZWVkIHRvIHJldHJ5IHRoaXMsIGJ1dCBzb2ZhciBJJ3ZlIGFsd2F5cwotCSAqIHNlZW4gdGhpcyBzdWNjZWVkIGluIDEgdHJ5LgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBtYXhfYnVzeV9wb2xsczsgaSsrKSB7Ci0JCS8qIFJlYWQgRUMtdG8tSG9zdCBSZWdpc3RlciAqLwotCQl2YWwgPSBpbmIoZGF0YS0+YWRkciArIDEpOwotCQkvKiBDb21tYW5kIENvbXBsZXRlZCA/ICovCi0JCWlmICh2YWwgPT0gMHgwMSkKLQkJCWJyZWFrOwotCi0JCWlmIChpID09IDApCi0JCQlwcl93YXJuKCJFQyByZXBvcnRzOiAweCUwMnggcmVhZGluZyB2aXJ0dWFsIHJlZ2lzdGVyICIKLQkJCQkiMHglMDRoeFxuIiwgKHVuc2lnbmVkIGludCl2YWwsIHJlZyk7Ci0JfQotCWlmIChpID09IG1heF9idXN5X3BvbGxzKSB7Ci0JCXByX2VycigiTWF4IHJldHJpZXMgZXhjZWVkZWQgcmVhZGluZyB2aXJ0dWFsICIKLQkJICAgICAgICJyZWdpc3RlciAweCUwNGh4ICglZClcbiIsIHJlZywgMik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qCi0JICogQWNjb3JkaW5nIHRvIHRoZSBTTVNDIGFwcCBub3RlIHdlIHNob3VsZCBub3cgZG86Ci0JICoKLQkgKiBTZXQgTWFpbGJveCBBZGRyZXNzIFBvaW50ZXIgdG8gZmlyc3QgbG9jYXRpb24gaW4gUmVnaW9uIDEgKgotCSAqIG91dGIoMHgwMCwgZGF0YS0+YWRkciArIDIpOwotCSAqIG91dGIoMHg4MCwgZGF0YS0+YWRkciArIDMpOwotCSAqCi0JICogQnV0IGlmIHdlIGRvIHRoYXQgdGhpbmdzIGRvbid0IHdvcmssIHNvIGxldCdzIG5vdC4KLQkgKi8KLQotCS8qIFJlYWQgVmFsdWUgZmllbGQgKi8KLQlpZiAoY21kID09IFNDSDU2MjdfQ01EX1JFQUQpCi0JCXJldHVybiBpbmIoZGF0YS0+YWRkciArIDQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2NoNTYyN19yZWFkX3ZpcnR1YWxfcmVnKHN0cnVjdCBzY2g1NjI3X2RhdGEgKmRhdGEsIHUxNiByZWcpCi17Ci0JcmV0dXJuIHNjaDU2Mjdfc2VuZF9jbWQoZGF0YSwgU0NINTYyN19DTURfUkVBRCwgcmVnLCAwKTsKLX0KLQotc3RhdGljIGludCBzY2g1NjI3X3dyaXRlX3ZpcnR1YWxfcmVnKHN0cnVjdCBzY2g1NjI3X2RhdGEgKmRhdGEsCi0JCQkJICAgICB1MTYgcmVnLCB1OCB2YWwpCi17Ci0JcmV0dXJuIHNjaDU2Mjdfc2VuZF9jbWQoZGF0YSwgU0NINTYyN19DTURfV1JJVEUsIHJlZywgdmFsKTsKLX0KLQotc3RhdGljIGludCBzY2g1NjI3X3JlYWRfdmlydHVhbF9yZWcxNihzdHJ1Y3Qgc2NoNTYyN19kYXRhICpkYXRhLCB1MTYgcmVnKQotewotCWludCBsc2IsIG1zYjsKLQotCS8qIFJlYWQgTFNCIGZpcnN0LCB0aGlzIHdpbGwgY2F1c2UgdGhlIG1hdGNoaW5nIE1TQiB0byBiZSBsYXRjaGVkICovCi0JbHNiID0gc2NoNTYyN19yZWFkX3ZpcnR1YWxfcmVnKGRhdGEsIHJlZyk7Ci0JaWYgKGxzYiA8IDApCi0JCXJldHVybiBsc2I7Ci0KLQltc2IgPSBzY2g1NjI3X3JlYWRfdmlydHVhbF9yZWcoZGF0YSwgcmVnICsgMSk7Ci0JaWYgKG1zYiA8IDApCi0JCXJldHVybiBtc2I7Ci0KLQlyZXR1cm4gbHNiIHwgKG1zYiA8PCA4KTsKLX0KLQotc3RhdGljIGludCBzY2g1NjI3X3JlYWRfdmlydHVhbF9yZWcxMihzdHJ1Y3Qgc2NoNTYyN19kYXRhICpkYXRhLCB1MTYgbXNiX3JlZywKLQkJCQkgICAgICB1MTYgbHNuX3JlZywgaW50IGhpZ2hfbmliYmxlKQotewotCWludCBtc2IsIGxzbjsKLQotCS8qIFJlYWQgTVNCIGZpcnN0LCB0aGlzIHdpbGwgY2F1c2UgdGhlIG1hdGNoaW5nIExTTiB0byBiZSBsYXRjaGVkICovCi0JbXNiID0gc2NoNTYyN19yZWFkX3ZpcnR1YWxfcmVnKGRhdGEsIG1zYl9yZWcpOwotCWlmIChtc2IgPCAwKQotCQlyZXR1cm4gbXNiOwotCi0JbHNuID0gc2NoNTYyN19yZWFkX3ZpcnR1YWxfcmVnKGRhdGEsIGxzbl9yZWcpOwotCWlmIChsc24gPCAwKQotCQlyZXR1cm4gbHNuOwotCi0JaWYgKGhpZ2hfbmliYmxlKQotCQlyZXR1cm4gKG1zYiA8PCA0KSB8IChsc24gPj4gNCk7Ci0JZWxzZQotCQlyZXR1cm4gKG1zYiA8PCA0KSB8IChsc24gJiAweDBmKTsKLX0KLQogc3RhdGljIHN0cnVjdCBzY2g1NjI3X2RhdGEgKnNjaDU2MjdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNjaDU2MjdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtMjk3LDcgKzEwMyw3IEBACiAKIAkvKiBUcmlnZ2VyIGEgVmJhdCB2b2x0YWdlIG1lYXN1cmVtZW50IGV2ZXJ5IDUgbWludXRlcyAqLwogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfYmF0dGVyeSArIDMwMCAqIEhaKSkgewotCQlzY2g1NjI3X3dyaXRlX3ZpcnR1YWxfcmVnKGRhdGEsIFNDSDU2MjdfUkVHX0NUUkwsCisJCXNjaDU2eHhfd3JpdGVfdmlydHVhbF9yZWcoZGF0YS0+YWRkciwgU0NINTYyN19SRUdfQ1RSTCwKIAkJCQkJICBkYXRhLT5jb250cm9sIHwgMHgxMCk7CiAJCWRhdGEtPmxhc3RfYmF0dGVyeSA9IGppZmZpZXM7CiAJfQpAQCAtMzA1LDcgKzExMSw3IEBACiAJLyogQ2FjaGUgdGhlIHZhbHVlcyBmb3IgMSBzZWNvbmQgKi8KIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWikgfHwgIWRhdGEtPnZhbGlkKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBTQ0g1NjI3X05PX1RFTVBTOyBpKyspIHsKLQkJCXZhbCA9IHNjaDU2MjdfcmVhZF92aXJ0dWFsX3JlZzEyKGRhdGEsCisJCQl2YWwgPSBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcxMihkYXRhLT5hZGRyLAogCQkJCVNDSDU2MjdfUkVHX1RFTVBfTVNCW2ldLAogCQkJCVNDSDU2MjdfUkVHX1RFTVBfTFNOW2ldLAogCQkJCVNDSDU2MjdfUkVHX1RFTVBfSElHSF9OSUJCTEVbaV0pOwpAQCAtMzE3LDcgKzEyMyw3IEBACiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgU0NINTYyN19OT19GQU5TOyBpKyspIHsKLQkJCXZhbCA9IHNjaDU2MjdfcmVhZF92aXJ0dWFsX3JlZzE2KGRhdGEsCisJCQl2YWwgPSBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcxNihkYXRhLT5hZGRyLAogCQkJCQkJCSBTQ0g1NjI3X1JFR19GQU5baV0pOwogCQkJaWYgKHVubGlrZWx5KHZhbCA8IDApKSB7CiAJCQkJcmV0ID0gRVJSX1BUUih2YWwpOwpAQCAtMzI3LDcgKzEzMyw3IEBACiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgU0NINTYyN19OT19JTjsgaSsrKSB7Ci0JCQl2YWwgPSBzY2g1NjI3X3JlYWRfdmlydHVhbF9yZWcxMihkYXRhLAorCQkJdmFsID0gc2NoNTZ4eF9yZWFkX3ZpcnR1YWxfcmVnMTIoZGF0YS0+YWRkciwKIAkJCQlTQ0g1NjI3X1JFR19JTl9NU0JbaV0sCiAJCQkJU0NINTYyN19SRUdfSU5fTFNOW2ldLAogCQkJCVNDSDU2MjdfUkVHX0lOX0hJR0hfTklCQkxFW2ldKTsKQEAgLTM1NSwxOCArMTYxLDIxIEBACiAJCSAqIE5vdGUgd2hhdCBTTVNDIGNhbGxzIEFCUywgaXMgd2hhdCBsbV9zZW5zb3JzIGNhbGxzIG1heAogCQkgKiAoYWthIGhpZ2gpLCBhbmQgSElHSCBpcyB3aGF0IGxtX3NlbnNvcnMgY2FsbHMgY3JpdC4KIAkJICovCi0JCXZhbCA9IHNjaDU2MjdfcmVhZF92aXJ0dWFsX3JlZyhkYXRhLCBTQ0g1NjI3X1JFR19URU1QX0FCU1tpXSk7CisJCXZhbCA9IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZyhkYXRhLT5hZGRyLAorCQkJCQkgICAgICAgU0NINTYyN19SRUdfVEVNUF9BQlNbaV0pOwogCQlpZiAodmFsIDwgMCkKIAkJCXJldHVybiB2YWw7CiAJCWRhdGEtPnRlbXBfbWF4W2ldID0gdmFsOwogCi0JCXZhbCA9IHNjaDU2MjdfcmVhZF92aXJ0dWFsX3JlZyhkYXRhLCBTQ0g1NjI3X1JFR19URU1QX0hJR0hbaV0pOworCQl2YWwgPSBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcoZGF0YS0+YWRkciwKKwkJCQkJICAgICAgIFNDSDU2MjdfUkVHX1RFTVBfSElHSFtpXSk7CiAJCWlmICh2YWwgPCAwKQogCQkJcmV0dXJuIHZhbDsKIAkJZGF0YS0+dGVtcF9jcml0W2ldID0gdmFsOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgU0NINTYyN19OT19GQU5TOyBpKyspIHsKLQkJdmFsID0gc2NoNTYyN19yZWFkX3ZpcnR1YWxfcmVnMTYoZGF0YSwgU0NINTYyN19SRUdfRkFOX01JTltpXSk7CisJCXZhbCA9IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZzE2KGRhdGEtPmFkZHIsCisJCQkJCQkgU0NINTYyN19SRUdfRkFOX01JTltpXSk7CiAJCWlmICh2YWwgPCAwKQogCQkJcmV0dXJuIHZhbDsKIAkJZGF0YS0+ZmFuX21pbltpXSA9IHZhbDsKQEAgLTY2Nyw3ICs0NzYsNyBAQAogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKIAotCXZhbCA9IHNjaDU2MjdfcmVhZF92aXJ0dWFsX3JlZyhkYXRhLCBTQ0g1NjI3X1JFR19IV01PTl9JRCk7CisJdmFsID0gc2NoNTZ4eF9yZWFkX3ZpcnR1YWxfcmVnKGRhdGEtPmFkZHIsIFNDSDU2MjdfUkVHX0hXTU9OX0lEKTsKIAlpZiAodmFsIDwgMCkgewogCQllcnIgPSB2YWw7CiAJCWdvdG8gZXJyb3I7CkBAIC02NzksNyArNDg4LDcgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQl2YWwgPSBzY2g1NjI3X3JlYWRfdmlydHVhbF9yZWcoZGF0YSwgU0NINTYyN19SRUdfQ09NUEFOWV9JRCk7CisJdmFsID0gc2NoNTZ4eF9yZWFkX3ZpcnR1YWxfcmVnKGRhdGEtPmFkZHIsIFNDSDU2MjdfUkVHX0NPTVBBTllfSUQpOwogCWlmICh2YWwgPCAwKSB7CiAJCWVyciA9IHZhbDsKIAkJZ290byBlcnJvcjsKQEAgLTY5MSw3ICs1MDAsNyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCXZhbCA9IHNjaDU2MjdfcmVhZF92aXJ0dWFsX3JlZyhkYXRhLCBTQ0g1NjI3X1JFR19QUklNQVJZX0lEKTsKKwl2YWwgPSBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcoZGF0YS0+YWRkciwgU0NINTYyN19SRUdfUFJJTUFSWV9JRCk7CiAJaWYgKHZhbCA8IDApIHsKIAkJZXJyID0gdmFsOwogCQlnb3RvIGVycm9yOwpAQCAtNzAzLDI1ICs1MTIsMjggQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlidWlsZF9jb2RlID0gc2NoNTYyN19yZWFkX3ZpcnR1YWxfcmVnKGRhdGEsIFNDSDU2MjdfUkVHX0JVSUxEX0NPREUpOworCWJ1aWxkX2NvZGUgPSBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcoZGF0YS0+YWRkciwKKwkJCQkJICAgICAgU0NINTYyN19SRUdfQlVJTERfQ09ERSk7CiAJaWYgKGJ1aWxkX2NvZGUgPCAwKSB7CiAJCWVyciA9IGJ1aWxkX2NvZGU7CiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JYnVpbGRfaWQgPSBzY2g1NjI3X3JlYWRfdmlydHVhbF9yZWcxNihkYXRhLCBTQ0g1NjI3X1JFR19CVUlMRF9JRCk7CisJYnVpbGRfaWQgPSBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcxNihkYXRhLT5hZGRyLAorCQkJCQkgICAgICBTQ0g1NjI3X1JFR19CVUlMRF9JRCk7CiAJaWYgKGJ1aWxkX2lkIDwgMCkgewogCQllcnIgPSBidWlsZF9pZDsKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlod21vbl9yZXYgPSBzY2g1NjI3X3JlYWRfdmlydHVhbF9yZWcoZGF0YSwgU0NINTYyN19SRUdfSFdNT05fUkVWKTsKKwlod21vbl9yZXYgPSBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcoZGF0YS0+YWRkciwKKwkJCQkJICAgICBTQ0g1NjI3X1JFR19IV01PTl9SRVYpOwogCWlmIChod21vbl9yZXYgPCAwKSB7CiAJCWVyciA9IGh3bW9uX3JldjsKIAkJZ290byBlcnJvcjsKIAl9CiAKLQl2YWwgPSBzY2g1NjI3X3JlYWRfdmlydHVhbF9yZWcoZGF0YSwgU0NINTYyN19SRUdfQ1RSTCk7CisJdmFsID0gc2NoNTZ4eF9yZWFkX3ZpcnR1YWxfcmVnKGRhdGEtPmFkZHIsIFNDSDU2MjdfUkVHX0NUUkwpOwogCWlmICh2YWwgPCAwKSB7CiAJCWVyciA9IHZhbDsKIAkJZ290byBlcnJvcjsKQEAgLTczNCw3ICs1NDYsNyBAQAogCX0KIAkvKiBUcmlnZ2VyIGEgVmJhdCB2b2x0YWdlIG1lYXN1cmVtZW50LCBzbyB0aGF0IHdlIGdldCBhIHZhbGlkIHJlYWRpbmcKIAkgICB0aGUgZmlyc3QgdGltZSB3ZSByZWFkIFZiYXQgKi8KLQlzY2g1NjI3X3dyaXRlX3ZpcnR1YWxfcmVnKGRhdGEsIFNDSDU2MjdfUkVHX0NUUkwsCisJc2NoNTZ4eF93cml0ZV92aXJ0dWFsX3JlZyhkYXRhLT5hZGRyLCBTQ0g1NjI3X1JFR19DVFJMLAogCQkJCSAgZGF0YS0+Y29udHJvbCB8IDB4MTApOwogCWRhdGEtPmxhc3RfYmF0dGVyeSA9IGppZmZpZXM7CiAKQEAgLTc0Niw2ICs1NTgsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3I7CiAKKwlwcl9pbmZvKCJmb3VuZCAlcyBjaGlwIGF0ICUjaHhcbiIsIERFVk5BTUUsIGRhdGEtPmFkZHIpOwogCXByX2luZm8oImZpcm13YXJlIGJ1aWxkOiBjb2RlIDB4JTAyWCwgaWQgMHglMDRYLCBod21vbjogcmV2IDB4JTAyWFxuIiwKIAkJYnVpbGRfY29kZSwgYnVpbGRfaWQsIGh3bW9uX3Jldik7CiAKQEAgLTc2OCw4NSArNTgxLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzY2g1NjI3X2ZpbmQoaW50IHNpb2FkZHIsIHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQotewotCXU4IGRldmlkOwotCWludCBlcnIgPSBzdXBlcmlvX2VudGVyKHNpb2FkZHIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlkZXZpZCA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWSUQpOwotCWlmIChkZXZpZCAhPSBTSU9fU0NINTYyN19JRCkgewotCQlwcl9kZWJ1ZygiVW5zdXBwb3J0ZWQgZGV2aWNlIGlkOiAweCUwMnhcbiIsCi0JCQkgKHVuc2lnbmVkIGludClkZXZpZCk7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlzdXBlcmlvX3NlbGVjdChzaW9hZGRyLCBTSU9fU0NINTYyN19FTV9MRCk7Ci0KLQlpZiAoIShzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0VOQUJMRSkgJiAweDAxKSkgewotCQlwcl93YXJuKCJEZXZpY2Ugbm90IGFjdGl2YXRlZFxuIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKgotCSAqIFdhcm5pbmcgdGhlIG9yZGVyIG9mIHRoZSBsb3cgLyBoaWdoIGJ5dGUgaXMgdGhlIG90aGVyIHdheSBhcm91bmQKLQkgKiBhcyBvbiBtb3N0IG90aGVyIHN1cGVyaW8gZGV2aWNlcyEhCi0JICovCi0JKmFkZHJlc3MgPSBzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0FERFIpIHwKLQkJICAgc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19BRERSICsgMSkgPDwgODsKLQlpZiAoKmFkZHJlc3MgPT0gMCkgewotCQlwcl93YXJuKCJCYXNlIGFkZHJlc3Mgbm90IHNldFxuIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwcl9pbmZvKCJGb3VuZCAlcyBjaGlwIGF0ICUjaHhcbiIsIERFVk5BTUUsICphZGRyZXNzKTsKLWV4aXQ6Ci0Jc3VwZXJpb19leGl0KHNpb2FkZHIpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNjaDU2MjdfZGV2aWNlX2FkZCh1bnNpZ25lZCBzaG9ydCBhZGRyZXNzKQotewotCXN0cnVjdCByZXNvdXJjZSByZXMgPSB7Ci0JCS5zdGFydAk9IGFkZHJlc3MsCi0JCS5lbmQJPSBhZGRyZXNzICsgUkVHSU9OX0xFTkdUSCAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCi0JfTsKLQlpbnQgZXJyOwotCi0Jc2NoNTYyN19wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGFkZHJlc3MpOwotCWlmICghc2NoNTYyN19wZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJlcy5uYW1lID0gc2NoNTYyN19wZGV2LT5uYW1lOwotCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7Ci0JaWYgKGVycikKLQkJZ290byBleGl0X2RldmljZV9wdXQ7Ci0KLQllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhzY2g1NjI3X3BkZXYsICZyZXMsIDEpOwotCWlmIChlcnIpIHsKLQkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkXG4iKTsKLQkJZ290byBleGl0X2RldmljZV9wdXQ7Ci0JfQotCi0JZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzY2g1NjI3X3BkZXYpOwotCWlmIChlcnIpIHsKLQkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkXG4iKTsKLQkJZ290byBleGl0X2RldmljZV9wdXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWV4aXRfZGV2aWNlX3B1dDoKLQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNjaDU2MjdfcGRldik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzY2g1NjI3X2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkub3duZXIJPSBUSElTX01PRFVMRSwKQEAgLTg1OCwzNiArNTkyLDE2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNjaDU2MjdfaW5pdCh2b2lkKQogewotCWludCBlcnIgPSAtRU5PREVWOwotCXVuc2lnbmVkIHNob3J0IGFkZHJlc3M7Ci0KLQlpZiAoc2NoNTYyN19maW5kKDB4NGUsICZhZGRyZXNzKSAmJiBzY2g1NjI3X2ZpbmQoMHgyZSwgJmFkZHJlc3MpKQotCQlnb3RvIGV4aXQ7Ci0KLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNjaDU2MjdfZHJpdmVyKTsKLQlpZiAoZXJyKQotCQlnb3RvIGV4aXQ7Ci0KLQllcnIgPSBzY2g1NjI3X2RldmljZV9hZGQoYWRkcmVzcyk7Ci0JaWYgKGVycikKLQkJZ290byBleGl0X2RyaXZlcjsKLQotCXJldHVybiAwOwotCi1leGl0X2RyaXZlcjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2NoNTYyN19kcml2ZXIpOwotZXhpdDoKLQlyZXR1cm4gZXJyOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNjaDU2MjdfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNjaDU2MjdfZXhpdCh2b2lkKQogewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNjaDU2MjdfcGRldik7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNjaDU2MjdfZHJpdmVyKTsKIH0KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTTVNDIFNDSDU2MjcgSGFyZHdhcmUgTW9uaXRvcmluZyBEcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIkhhbnMgZGUgR29lZGUgKGhkZWdvZWRlQHJlZGhhdC5jb20pIik7CitNT0RVTEVfQVVUSE9SKCJIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBtb2R1bGVfaW5pdChzY2g1NjI3X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zY2g1NjM2LmMgYi9kcml2ZXJzL2h3bW9uL3NjaDU2MzYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDQ0MDdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9zY2g1NjM2LmMKQEAgLTAsMCArMSw1MzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29weXJpZ2h0IChDKSAyMDExIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+ICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgInNjaDU2eHgtY29tbW9uLmgiCisKKyNkZWZpbmUgRFJWTkFNRSAic2NoNTYzNiIKKyNkZWZpbmUgREVWTkFNRSAidGhlc2V1cyIgLyogV2Ugb25seSBzdXBwb3J0IG9uZSBtb2RlbCBmb3Igbm93ICovCisKKyNkZWZpbmUgU0NINTYzNl9SRUdfRlVKSVRTVV9JRAkJMHg3ODAKKyNkZWZpbmUgU0NINTYzNl9SRUdfRlVKSVRTVV9SRVYJCTB4NzgzCisKKyNkZWZpbmUgU0NINTYzNl9OT19JTlMJCQk1CisjZGVmaW5lIFNDSDU2MzZfTk9fVEVNUFMJCTE2CisjZGVmaW5lIFNDSDU2MzZfTk9fRkFOUwkJCTgKKworc3RhdGljIGNvbnN0IHUxNiBTQ0g1NjM2X1JFR19JTl9WQUxbU0NINTYzNl9OT19JTlNdID0geworCTB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MTg5IH07CitzdGF0aWMgY29uc3QgdTE2IFNDSDU2MzZfUkVHX0lOX0ZBQ1RPUlNbU0NINTYzNl9OT19JTlNdID0geworCTQ0MDAsIDE1MDAsIDQwMDAsIDQ0MDAsIDE2MDAwIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IFNDSDU2MzZfSU5fTEFCRUxTW1NDSDU2MzZfTk9fSU5TXSA9IHsKKwkiMy4zViIsICJWUkVGIiwgIlZCQVQiLCAiMy4zQVVYIiwgIjEyViIgfTsKKworc3RhdGljIGNvbnN0IHUxNiBTQ0g1NjM2X1JFR19URU1QX1ZBTFtTQ0g1NjM2X05PX1RFTVBTXSA9IHsKKwkweDJCLCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJBLCAweDE4MCwgMHgxODEsCisJMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4QSwgMHg4QiwgMHg4QyB9OworI2RlZmluZSBTQ0g1NjM2X1JFR19URU1QX0NUUkwoaSkJKDB4NzkwICsgKGkpKQorI2RlZmluZSBTQ0g1NjM2X1RFTVBfV09SS0lORwkJMHgwMQorI2RlZmluZSBTQ0g1NjM2X1RFTVBfQUxBUk0JCTB4MDIKKyNkZWZpbmUgU0NINTYzNl9URU1QX0RFQUNUSVZBVEVECTB4ODAKKworc3RhdGljIGNvbnN0IHUxNiBTQ0g1NjM2X1JFR19GQU5fVkFMW1NDSDU2MzZfTk9fRkFOU10gPSB7CisJMHgyQywgMHgyRSwgMHgzMCwgMHgzMiwgMHg2MiwgMHg2NCwgMHg2NiwgMHg2OCB9OworI2RlZmluZSBTQ0g1NjM2X1JFR19GQU5fQ1RSTChpKQkJKDB4ODgwICsgKGkpKQorLyogRkFVTFQgaW4gZGF0YXNoZWV0LCBidXQgYWN0cyBhcyBhbiBhbGFybSAqLworI2RlZmluZSBTQ0g1NjM2X0ZBTl9BTEFSTQkJMHgwNAorI2RlZmluZSBTQ0g1NjM2X0ZBTl9OT1RfUFJFU0VOVAkJMHgwOAorI2RlZmluZSBTQ0g1NjM2X0ZBTl9ERUFDVElWQVRFRAkJMHg4MAorCisKK3N0cnVjdCBzY2g1NjM2X2RhdGEgeworCXVuc2lnbmVkIHNob3J0IGFkZHI7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCisJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKwl1OCBpbltTQ0g1NjM2X05PX0lOU107CisJdTggdGVtcF92YWxbU0NINTYzNl9OT19URU1QU107CisJdTggdGVtcF9jdHJsW1NDSDU2MzZfTk9fVEVNUFNdOworCXUxNiBmYW5fdmFsW1NDSDU2MzZfTk9fRkFOU107CisJdTggZmFuX2N0cmxbU0NINTYzNl9OT19GQU5TXTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2NoNTYzNl9kYXRhICpzY2g1NjM2X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY2g1NjM2X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2NoNTYzNl9kYXRhICpyZXQgPSBkYXRhOworCWludCBpLCB2YWw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBDYWNoZSB0aGUgdmFsdWVzIGZvciAxIHNlY29uZCAqLworCWlmIChkYXRhLT52YWxpZCAmJiAhdGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWikpCisJCWdvdG8gYWJvcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NINTYzNl9OT19JTlM7IGkrKykgeworCQl2YWwgPSBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcoZGF0YS0+YWRkciwKKwkJCQkJICAgICAgIFNDSDU2MzZfUkVHX0lOX1ZBTFtpXSk7CisJCWlmICh1bmxpa2VseSh2YWwgPCAwKSkgeworCQkJcmV0ID0gRVJSX1BUUih2YWwpOworCQkJZ290byBhYm9ydDsKKwkJfQorCQlkYXRhLT5pbltpXSA9IHZhbDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NINTYzNl9OT19URU1QUzsgaSsrKSB7CisJCWlmIChkYXRhLT50ZW1wX2N0cmxbaV0gJiBTQ0g1NjM2X1RFTVBfREVBQ1RJVkFURUQpCisJCQljb250aW51ZTsKKworCQl2YWwgPSBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcoZGF0YS0+YWRkciwKKwkJCQkJICAgICAgIFNDSDU2MzZfUkVHX1RFTVBfVkFMW2ldKTsKKwkJaWYgKHVubGlrZWx5KHZhbCA8IDApKSB7CisJCQlyZXQgPSBFUlJfUFRSKHZhbCk7CisJCQlnb3RvIGFib3J0OworCQl9CisJCWRhdGEtPnRlbXBfdmFsW2ldID0gdmFsOworCisJCXZhbCA9IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZyhkYXRhLT5hZGRyLAorCQkJCQkgICAgICAgU0NINTYzNl9SRUdfVEVNUF9DVFJMKGkpKTsKKwkJaWYgKHVubGlrZWx5KHZhbCA8IDApKSB7CisJCQlyZXQgPSBFUlJfUFRSKHZhbCk7CisJCQlnb3RvIGFib3J0OworCQl9CisJCWRhdGEtPnRlbXBfY3RybFtpXSA9IHZhbDsKKwkJLyogQWxhcm1zIG5lZWQgdG8gYmUgZXhwbGljaXRseSB3cml0ZS1jbGVhcmVkICovCisJCWlmICh2YWwgJiBTQ0g1NjM2X1RFTVBfQUxBUk0pIHsKKwkJCXNjaDU2eHhfd3JpdGVfdmlydHVhbF9yZWcoZGF0YS0+YWRkciwKKwkJCQkJCVNDSDU2MzZfUkVHX1RFTVBfQ1RSTChpKSwgdmFsKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBTQ0g1NjM2X05PX0ZBTlM7IGkrKykgeworCQlpZiAoZGF0YS0+ZmFuX2N0cmxbaV0gJiBTQ0g1NjM2X0ZBTl9ERUFDVElWQVRFRCkKKwkJCWNvbnRpbnVlOworCisJCXZhbCA9IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZzE2KGRhdGEtPmFkZHIsCisJCQkJCQkgU0NINTYzNl9SRUdfRkFOX1ZBTFtpXSk7CisJCWlmICh1bmxpa2VseSh2YWwgPCAwKSkgeworCQkJcmV0ID0gRVJSX1BUUih2YWwpOworCQkJZ290byBhYm9ydDsKKwkJfQorCQlkYXRhLT5mYW5fdmFsW2ldID0gdmFsOworCisJCXZhbCA9IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZyhkYXRhLT5hZGRyLAorCQkJCQkgICAgICAgU0NINTYzNl9SRUdfRkFOX0NUUkwoaSkpOworCQlpZiAodW5saWtlbHkodmFsIDwgMCkpIHsKKwkJCXJldCA9IEVSUl9QVFIodmFsKTsKKwkJCWdvdG8gYWJvcnQ7CisJCX0KKwkJZGF0YS0+ZmFuX2N0cmxbaV0gPSB2YWw7CisJCS8qIEFsYXJtcyBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgd3JpdGUtY2xlYXJlZCAqLworCQlpZiAodmFsICYgU0NINTYzNl9GQU5fQUxBUk0pIHsKKwkJCXNjaDU2eHhfd3JpdGVfdmlydHVhbF9yZWcoZGF0YS0+YWRkciwKKwkJCQkJCVNDSDU2MzZfUkVHX0ZBTl9DVFJMKGkpLCB2YWwpOworCQl9CisJfQorCisJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwlkYXRhLT52YWxpZCA9IDE7CithYm9ydDoKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlZ190b19ycG0odTE2IHJlZykKK3sKKwlpZiAocmVnID09IDApCisJCXJldHVybiAtRUlPOworCWlmIChyZWcgPT0gMHhmZmZmKQorCQlyZXR1cm4gMDsKKworCXJldHVybiA1NDAwNTQwIC8gcmVnOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwljaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIERFVk5BTUUpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3Qgc2NoNTYzNl9kYXRhICpkYXRhID0gc2NoNTYzNl91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IHZhbDsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJdmFsID0gRElWX1JPVU5EX0NMT1NFU1QoCisJCWRhdGEtPmluW2F0dHItPmluZGV4XSAqIFNDSDU2MzZfUkVHX0lOX0ZBQ1RPUlNbYXR0ci0+aW5kZXhdLAorCQkyNTUpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luX2xhYmVsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAorCQkJU0NINTYzNl9JTl9MQUJFTFNbYXR0ci0+aW5kZXhdKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3Qgc2NoNTYzNl9kYXRhICpkYXRhID0gc2NoNTYzNl91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IHZhbDsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJdmFsID0gKGRhdGEtPnRlbXBfdmFsW2F0dHItPmluZGV4XSAtIDY0KSAqIDEwMDA7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9mYXVsdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisJKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHNjaDU2MzZfZGF0YSAqZGF0YSA9IHNjaDU2MzZfdXBkYXRlX2RldmljZShkZXYpOworCWludCB2YWw7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCXZhbCA9IChkYXRhLT50ZW1wX2N0cmxbYXR0ci0+aW5kZXhdICYgU0NINTYzNl9URU1QX1dPUktJTkcpID8gMCA6IDE7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisJKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHNjaDU2MzZfZGF0YSAqZGF0YSA9IHNjaDU2MzZfdXBkYXRlX2RldmljZShkZXYpOworCWludCB2YWw7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCXZhbCA9IChkYXRhLT50ZW1wX2N0cmxbYXR0ci0+aW5kZXhdICYgU0NINTYzNl9URU1QX0FMQVJNKSA/IDEgOiAwOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisJKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHNjaDU2MzZfZGF0YSAqZGF0YSA9IHNjaDU2MzZfdXBkYXRlX2RldmljZShkZXYpOworCWludCB2YWw7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCXZhbCA9IHJlZ190b19ycG0oZGF0YS0+ZmFuX3ZhbFthdHRyLT5pbmRleF0pOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gdmFsOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2ZhdWx0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3Qgc2NoNTYzNl9kYXRhICpkYXRhID0gc2NoNTYzNl91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IHZhbDsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJdmFsID0gKGRhdGEtPmZhbl9jdHJsW2F0dHItPmluZGV4XSAmIFNDSDU2MzZfRkFOX05PVF9QUkVTRU5UKSA/IDEgOiAwOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisJKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHNjaDU2MzZfZGF0YSAqZGF0YSA9IHNjaDU2MzZfdXBkYXRlX2RldmljZShkZXYpOworCWludCB2YWw7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCXZhbCA9IChkYXRhLT5mYW5fY3RybFthdHRyLT5pbmRleF0gJiBTQ0g1NjM2X0ZBTl9BTEFSTSkgPyAxIDogMDsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgdmFsKTsKK30KKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzY2g1NjM2X2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUihuYW1lLCAwNDQ0LCBzaG93X25hbWUsIE5VTEwsIDApLAorCVNFTlNPUl9BVFRSKGluMF9pbnB1dCwgMDQ0NCwgc2hvd19pbl92YWx1ZSwgTlVMTCwgMCksCisJU0VOU09SX0FUVFIoaW4wX2xhYmVsLCAwNDQ0LCBzaG93X2luX2xhYmVsLCBOVUxMLCAwKSwKKwlTRU5TT1JfQVRUUihpbjFfaW5wdXQsIDA0NDQsIHNob3dfaW5fdmFsdWUsIE5VTEwsIDEpLAorCVNFTlNPUl9BVFRSKGluMV9sYWJlbCwgMDQ0NCwgc2hvd19pbl9sYWJlbCwgTlVMTCwgMSksCisJU0VOU09SX0FUVFIoaW4yX2lucHV0LCAwNDQ0LCBzaG93X2luX3ZhbHVlLCBOVUxMLCAyKSwKKwlTRU5TT1JfQVRUUihpbjJfbGFiZWwsIDA0NDQsIHNob3dfaW5fbGFiZWwsIE5VTEwsIDIpLAorCVNFTlNPUl9BVFRSKGluM19pbnB1dCwgMDQ0NCwgc2hvd19pbl92YWx1ZSwgTlVMTCwgMyksCisJU0VOU09SX0FUVFIoaW4zX2xhYmVsLCAwNDQ0LCBzaG93X2luX2xhYmVsLCBOVUxMLCAzKSwKKwlTRU5TT1JfQVRUUihpbjRfaW5wdXQsIDA0NDQsIHNob3dfaW5fdmFsdWUsIE5VTEwsIDQpLAorCVNFTlNPUl9BVFRSKGluNF9sYWJlbCwgMDQ0NCwgc2hvd19pbl9sYWJlbCwgTlVMTCwgNCksCit9OworCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHNjaDU2MzZfdGVtcF9hdHRyW10gPSB7CisJU0VOU09SX0FUVFIodGVtcDFfaW5wdXQsIDA0NDQsIHNob3dfdGVtcF92YWx1ZSwgTlVMTCwgMCksCisJU0VOU09SX0FUVFIodGVtcDFfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMCksCisJU0VOU09SX0FUVFIodGVtcDFfYWxhcm0sIDA0NDQsIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgMCksCisJU0VOU09SX0FUVFIodGVtcDJfaW5wdXQsIDA0NDQsIHNob3dfdGVtcF92YWx1ZSwgTlVMTCwgMSksCisJU0VOU09SX0FUVFIodGVtcDJfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMSksCisJU0VOU09SX0FUVFIodGVtcDJfYWxhcm0sIDA0NDQsIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgMSksCisJU0VOU09SX0FUVFIodGVtcDNfaW5wdXQsIDA0NDQsIHNob3dfdGVtcF92YWx1ZSwgTlVMTCwgMiksCisJU0VOU09SX0FUVFIodGVtcDNfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMiksCisJU0VOU09SX0FUVFIodGVtcDNfYWxhcm0sIDA0NDQsIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgMiksCisJU0VOU09SX0FUVFIodGVtcDRfaW5wdXQsIDA0NDQsIHNob3dfdGVtcF92YWx1ZSwgTlVMTCwgMyksCisJU0VOU09SX0FUVFIodGVtcDRfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMyksCisJU0VOU09SX0FUVFIodGVtcDRfYWxhcm0sIDA0NDQsIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgMyksCisJU0VOU09SX0FUVFIodGVtcDVfaW5wdXQsIDA0NDQsIHNob3dfdGVtcF92YWx1ZSwgTlVMTCwgNCksCisJU0VOU09SX0FUVFIodGVtcDVfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgNCksCisJU0VOU09SX0FUVFIodGVtcDVfYWxhcm0sIDA0NDQsIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgNCksCisJU0VOU09SX0FUVFIodGVtcDZfaW5wdXQsIDA0NDQsIHNob3dfdGVtcF92YWx1ZSwgTlVMTCwgNSksCisJU0VOU09SX0FUVFIodGVtcDZfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgNSksCisJU0VOU09SX0FUVFIodGVtcDZfYWxhcm0sIDA0NDQsIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgNSksCisJU0VOU09SX0FUVFIodGVtcDdfaW5wdXQsIDA0NDQsIHNob3dfdGVtcF92YWx1ZSwgTlVMTCwgNiksCisJU0VOU09SX0FUVFIodGVtcDdfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgNiksCisJU0VOU09SX0FUVFIodGVtcDdfYWxhcm0sIDA0NDQsIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgNiksCisJU0VOU09SX0FUVFIodGVtcDhfaW5wdXQsIDA0NDQsIHNob3dfdGVtcF92YWx1ZSwgTlVMTCwgNyksCisJU0VOU09SX0FUVFIodGVtcDhfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgNyksCisJU0VOU09SX0FUVFIodGVtcDhfYWxhcm0sIDA0NDQsIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgNyksCisJU0VOU09SX0FUVFIodGVtcDlfaW5wdXQsIDA0NDQsIHNob3dfdGVtcF92YWx1ZSwgTlVMTCwgOCksCisJU0VOU09SX0FUVFIodGVtcDlfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgOCksCisJU0VOU09SX0FUVFIodGVtcDlfYWxhcm0sIDA0NDQsIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgOCksCisJU0VOU09SX0FUVFIodGVtcDEwX2lucHV0LCAwNDQ0LCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDkpLAorCVNFTlNPUl9BVFRSKHRlbXAxMF9mYXVsdCwgMDQ0NCwgc2hvd190ZW1wX2ZhdWx0LCBOVUxMLCA5KSwKKwlTRU5TT1JfQVRUUih0ZW1wMTBfYWxhcm0sIDA0NDQsIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgOSksCisJU0VOU09SX0FUVFIodGVtcDExX2lucHV0LCAwNDQ0LCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDEwKSwKKwlTRU5TT1JfQVRUUih0ZW1wMTFfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMTApLAorCVNFTlNPUl9BVFRSKHRlbXAxMV9hbGFybSwgMDQ0NCwgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAxMCksCisJU0VOU09SX0FUVFIodGVtcDEyX2lucHV0LCAwNDQ0LCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDExKSwKKwlTRU5TT1JfQVRUUih0ZW1wMTJfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMTEpLAorCVNFTlNPUl9BVFRSKHRlbXAxMl9hbGFybSwgMDQ0NCwgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAxMSksCisJU0VOU09SX0FUVFIodGVtcDEzX2lucHV0LCAwNDQ0LCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDEyKSwKKwlTRU5TT1JfQVRUUih0ZW1wMTNfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMTIpLAorCVNFTlNPUl9BVFRSKHRlbXAxM19hbGFybSwgMDQ0NCwgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAxMiksCisJU0VOU09SX0FUVFIodGVtcDE0X2lucHV0LCAwNDQ0LCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDEzKSwKKwlTRU5TT1JfQVRUUih0ZW1wMTRfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMTMpLAorCVNFTlNPUl9BVFRSKHRlbXAxNF9hbGFybSwgMDQ0NCwgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAxMyksCisJU0VOU09SX0FUVFIodGVtcDE1X2lucHV0LCAwNDQ0LCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDE0KSwKKwlTRU5TT1JfQVRUUih0ZW1wMTVfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMTQpLAorCVNFTlNPUl9BVFRSKHRlbXAxNV9hbGFybSwgMDQ0NCwgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAxNCksCisJU0VOU09SX0FUVFIodGVtcDE2X2lucHV0LCAwNDQ0LCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDE1KSwKKwlTRU5TT1JfQVRUUih0ZW1wMTZfZmF1bHQsIDA0NDQsIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMTUpLAorCVNFTlNPUl9BVFRSKHRlbXAxNl9hbGFybSwgMDQ0NCwgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAxNSksCit9OworCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHNjaDU2MzZfZmFuX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUihmYW4xX2lucHV0LCAwNDQ0LCBzaG93X2Zhbl92YWx1ZSwgTlVMTCwgMCksCisJU0VOU09SX0FUVFIoZmFuMV9mYXVsdCwgMDQ0NCwgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDApLAorCVNFTlNPUl9BVFRSKGZhbjFfYWxhcm0sIDA0NDQsIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAwKSwKKwlTRU5TT1JfQVRUUihmYW4yX2lucHV0LCAwNDQ0LCBzaG93X2Zhbl92YWx1ZSwgTlVMTCwgMSksCisJU0VOU09SX0FUVFIoZmFuMl9mYXVsdCwgMDQ0NCwgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDEpLAorCVNFTlNPUl9BVFRSKGZhbjJfYWxhcm0sIDA0NDQsIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAxKSwKKwlTRU5TT1JfQVRUUihmYW4zX2lucHV0LCAwNDQ0LCBzaG93X2Zhbl92YWx1ZSwgTlVMTCwgMiksCisJU0VOU09SX0FUVFIoZmFuM19mYXVsdCwgMDQ0NCwgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDIpLAorCVNFTlNPUl9BVFRSKGZhbjNfYWxhcm0sIDA0NDQsIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAyKSwKKwlTRU5TT1JfQVRUUihmYW40X2lucHV0LCAwNDQ0LCBzaG93X2Zhbl92YWx1ZSwgTlVMTCwgMyksCisJU0VOU09SX0FUVFIoZmFuNF9mYXVsdCwgMDQ0NCwgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDMpLAorCVNFTlNPUl9BVFRSKGZhbjRfYWxhcm0sIDA0NDQsIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAzKSwKKwlTRU5TT1JfQVRUUihmYW41X2lucHV0LCAwNDQ0LCBzaG93X2Zhbl92YWx1ZSwgTlVMTCwgNCksCisJU0VOU09SX0FUVFIoZmFuNV9mYXVsdCwgMDQ0NCwgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDQpLAorCVNFTlNPUl9BVFRSKGZhbjVfYWxhcm0sIDA0NDQsIHNob3dfZmFuX2FsYXJtLCBOVUxMLCA0KSwKKwlTRU5TT1JfQVRUUihmYW42X2lucHV0LCAwNDQ0LCBzaG93X2Zhbl92YWx1ZSwgTlVMTCwgNSksCisJU0VOU09SX0FUVFIoZmFuNl9mYXVsdCwgMDQ0NCwgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDUpLAorCVNFTlNPUl9BVFRSKGZhbjZfYWxhcm0sIDA0NDQsIHNob3dfZmFuX2FsYXJtLCBOVUxMLCA1KSwKKwlTRU5TT1JfQVRUUihmYW43X2lucHV0LCAwNDQ0LCBzaG93X2Zhbl92YWx1ZSwgTlVMTCwgNiksCisJU0VOU09SX0FUVFIoZmFuN19mYXVsdCwgMDQ0NCwgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDYpLAorCVNFTlNPUl9BVFRSKGZhbjdfYWxhcm0sIDA0NDQsIHNob3dfZmFuX2FsYXJtLCBOVUxMLCA2KSwKKwlTRU5TT1JfQVRUUihmYW44X2lucHV0LCAwNDQ0LCBzaG93X2Zhbl92YWx1ZSwgTlVMTCwgNyksCisJU0VOU09SX0FUVFIoZmFuOF9mYXVsdCwgMDQ0NCwgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDcpLAorCVNFTlNPUl9BVFRSKGZhbjhfYWxhcm0sIDA0NDQsIHNob3dfZmFuX2FsYXJtLCBOVUxMLCA3KSwKK307CisKK3N0YXRpYyBpbnQgc2NoNTYzNl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2NoNTYzNl9kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlpZiAoZGF0YS0+aHdtb25fZGV2KQorCQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2NoNTYzNl9hdHRyKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJnNjaDU2MzZfYXR0cltpXS5kZXZfYXR0cik7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NINTYzNl9OT19URU1QUyAqIDM7IGkrKykKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsCisJCQkJICAgJnNjaDU2MzZfdGVtcF9hdHRyW2ldLmRldl9hdHRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0g1NjM2X05PX0ZBTlMgKiAzOyBpKyspCisJCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LAorCQkJCSAgICZzY2g1NjM2X2Zhbl9hdHRyW2ldLmRldl9hdHRyKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNjaDU2MzZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2NoNTYzNl9kYXRhICpkYXRhOworCWludCBpLCBlcnIsIHZhbCwgcmV2aXNpb25bMl07CisJY2hhciBpZFs0XTsKKworCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NoNTYzNl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEtPmFkZHIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCktPnN0YXJ0OworCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJdmFsID0gc2NoNTZ4eF9yZWFkX3ZpcnR1YWxfcmVnKGRhdGEtPmFkZHIsCisJCQkJCSAgICAgICBTQ0g1NjM2X1JFR19GVUpJVFNVX0lEICsgaSk7CisJCWlmICh2YWwgPCAwKSB7CisJCQlwcl9lcnIoIkNvdWxkIG5vdCByZWFkIEZ1aml0c3UgaWQgYnl0ZSBhdCAlI3hcbiIsCisJCQkJU0NINTYzNl9SRUdfRlVKSVRTVV9JRCArIGkpOworCQkJZXJyID0gdmFsOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlpZFtpXSA9IHZhbDsKKwl9CisJaWRbaV0gPSAnXDAnOworCisJaWYgKHN0cmNtcChpZCwgIlRIUyIpKSB7CisJCXByX2VycigiVW5rbm93biBGdWppdHN1IGlkOiAlMDJ4JTAyeCUwMnhcbiIsCisJCSAgICAgICBpZFswXSwgaWRbMV0sIGlkWzJdKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXZhbCA9IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZyhkYXRhLT5hZGRyLAorCQkJCQkgICAgICAgU0NINTYzNl9SRUdfRlVKSVRTVV9SRVYgKyBpKTsKKwkJaWYgKHZhbCA8IDApIHsKKwkJCWVyciA9IHZhbDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcmV2aXNpb25baV0gPSB2YWw7CisJfQorCXByX2luZm8oIkZvdW5kICVzIGNoaXAgYXQgJSNoeCwgcmV2aXNvbjogJWQuJTAyZFxuIiwgREVWTkFNRSwKKwkJZGF0YS0+YWRkciwgcmV2aXNpb25bMF0sIHJldmlzaW9uWzFdKTsKKworCS8qIFJlYWQgYWxsIHRlbXAgKyBmYW4gY3RybCByZWdpc3RlcnMgdG8gZGV0ZXJtaW5lIHdoaWNoIGFyZSBhY3RpdmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0NINTYzNl9OT19URU1QUzsgaSsrKSB7CisJCXZhbCA9IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZyhkYXRhLT5hZGRyLAorCQkJCQkgICAgICAgU0NINTYzNl9SRUdfVEVNUF9DVFJMKGkpKTsKKwkJaWYgKHVubGlrZWx5KHZhbCA8IDApKSB7CisJCQllcnIgPSB2YWw7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWRhdGEtPnRlbXBfY3RybFtpXSA9IHZhbDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NINTYzNl9OT19GQU5TOyBpKyspIHsKKwkJdmFsID0gc2NoNTZ4eF9yZWFkX3ZpcnR1YWxfcmVnKGRhdGEtPmFkZHIsCisJCQkJCSAgICAgICBTQ0g1NjM2X1JFR19GQU5fQ1RSTChpKSk7CisJCWlmICh1bmxpa2VseSh2YWwgPCAwKSkgeworCQkJZXJyID0gdmFsOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkYXRhLT5mYW5fY3RybFtpXSA9IHZhbDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzY2g1NjM2X2F0dHIpOyBpKyspIHsKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsCisJCQkJCSAmc2NoNTYzNl9hdHRyW2ldLmRldl9hdHRyKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IChTQ0g1NjM2X05PX1RFTVBTICogMyk7IGkrKykgeworCQlpZiAoZGF0YS0+dGVtcF9jdHJsW2kvM10gJiBTQ0g1NjM2X1RFTVBfREVBQ1RJVkFURUQpCisJCQljb250aW51ZTsKKworCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwKKwkJCQkJJnNjaDU2MzZfdGVtcF9hdHRyW2ldLmRldl9hdHRyKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IChTQ0g1NjM2X05PX0ZBTlMgKiAzKTsgaSsrKSB7CisJCWlmIChkYXRhLT5mYW5fY3RybFtpLzNdICYgU0NINTYzNl9GQU5fREVBQ1RJVkFURUQpCisJCQljb250aW51ZTsKKworCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwKKwkJCQkJJnNjaDU2MzZfZmFuX2F0dHJbaV0uZGV2X2F0dHIpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKKwkJZGF0YS0+aHdtb25fZGV2ID0gTlVMTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJc2NoNTYzNl9yZW1vdmUocGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2NoNTYzNl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gRFJWTkFNRSwKKwl9LAorCS5wcm9iZQkJPSBzY2g1NjM2X3Byb2JlLAorCS5yZW1vdmUJCT0gc2NoNTYzNl9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzY2g1NjM2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzY2g1NjM2X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzY2g1NjM2X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2NoNTYzNl9kcml2ZXIpOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIlNNU0MgU0NINTYzNiBIYXJkd2FyZSBNb25pdG9yaW5nIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2NoNTYzNl9pbml0KTsKK21vZHVsZV9leGl0KHNjaDU2MzZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NjaDU2eHgtY29tbW9uLmMgYi9kcml2ZXJzL2h3bW9uL3NjaDU2eHgtY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjMzJlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vc2NoNTZ4eC1jb21tb24uYwpAQCAtMCwwICsxLDM0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAic2NoNTZ4eC1jb21tb24uaCIKKworI2RlZmluZSBTSU9fU0NINTZYWF9MRF9FTQkweDBDCS8qIEVtYmVkZGVkIHVDb250cm9sbGVyIExvZ2ljYWwgRGV2ICovCisjZGVmaW5lIFNJT19VTkxPQ0tfS0VZCQkweDU1CS8qIEtleSB0byBlbmFibGUgU3VwZXItSS9PICovCisjZGVmaW5lIFNJT19MT0NLX0tFWQkJMHhBQQkvKiBLZXkgdG8gZGlzYWJsZSBTdXBlci1JL08gKi8KKworI2RlZmluZSBTSU9fUkVHX0xEU0VMCQkweDA3CS8qIExvZ2ljYWwgZGV2aWNlIHNlbGVjdCAqLworI2RlZmluZSBTSU9fUkVHX0RFVklECQkweDIwCS8qIERldmljZSBJRCAqLworI2RlZmluZSBTSU9fUkVHX0VOQUJMRQkJMHgzMAkvKiBMb2dpY2FsIGRldmljZSBlbmFibGUgKi8KKyNkZWZpbmUgU0lPX1JFR19BRERSCQkweDY2CS8qIExvZ2ljYWwgZGV2aWNlIGFkZHJlc3MgKDIgYnl0ZXMpICovCisKKyNkZWZpbmUgU0lPX1NDSDU2MjdfSUQJCTB4QzYJLyogQ2hpcHNldCBJRCAqLworI2RlZmluZSBTSU9fU0NINTYzNl9JRAkJMHhDNwkvKiBDaGlwc2V0IElEICovCisKKyNkZWZpbmUgUkVHSU9OX0xFTkdUSAkJOQorCisjZGVmaW5lIFNDSDU2WFhfQ01EX1JFQUQJMHgwMgorI2RlZmluZSBTQ0g1NlhYX0NNRF9XUklURQkweDAzCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzY2g1Nnh4X3BkZXY7CisKKy8qIFN1cGVyIEkvTyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHN1cGVyaW9faW5iKGludCBiYXNlLCBpbnQgcmVnKQoreworCW91dGIocmVnLCBiYXNlKTsKKwlyZXR1cm4gaW5iKGJhc2UgKyAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3VwZXJpb19lbnRlcihpbnQgYmFzZSkKK3sKKwkvKiBEb24ndCBzdGVwIG9uIG90aGVyIGRyaXZlcnMnIEkvTyBzcGFjZSBieSBhY2NpZGVudCAqLworCWlmICghcmVxdWVzdF9tdXhlZF9yZWdpb24oYmFzZSwgMiwgInNjaDU2eHgiKSkgeworCQlwcl9lcnIoIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwgYmFzZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJb3V0YihTSU9fVU5MT0NLX0tFWSwgYmFzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fc2VsZWN0KGludCBiYXNlLCBpbnQgbGQpCit7CisJb3V0YihTSU9fUkVHX0xEU0VMLCBiYXNlKTsKKwlvdXRiKGxkLCBiYXNlICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdXBlcmlvX2V4aXQoaW50IGJhc2UpCit7CisJb3V0YihTSU9fTE9DS19LRVksIGJhc2UpOworCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDIpOworfQorCitzdGF0aWMgaW50IHNjaDU2eHhfc2VuZF9jbWQodTE2IGFkZHIsIHU4IGNtZCwgdTE2IHJlZywgdTggdikKK3sKKwl1OCB2YWw7CisJaW50IGk7CisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gU01TQyBmb3IgdGhlIGNvbW1hbmRzIHdlIHVzZSB0aGUgbWF4aW11bSB0aW1lIGZvcgorCSAqIHRoZSBFTSB0byByZXNwb25kIGlzIDE1IG1zLCBidXQgdGVzdGluZyBzaG93cyBpbiBwcmFjdGljZSBpdAorCSAqIHJlc3BvbmRzIHdpdGhpbiAxNS0zMiByZWFkcywgc28gd2UgZmlyc3QgYnVzeSBwb2xsLCBhbmQgaWYKKwkgKiB0aGF0IGZhaWxzIHNsZWVwIGEgYml0IGFuZCB0cnkgYWdhaW4gdW50aWwgd2UgYXJlIHdheSBwYXN0CisJICogdGhlIDE1IG1zIG1heGltdW0gcmVzcG9uc2UgdGltZS4KKwkgKi8KKwljb25zdCBpbnQgbWF4X2J1c3lfcG9sbHMgPSA2NDsKKwljb25zdCBpbnQgbWF4X2xhenlfcG9sbHMgPSAzMjsKKworCS8qIChPcHRpb25hbCkgV3JpdGUtQ2xlYXIgdGhlIEVDIHRvIEhvc3QgTWFpbGJveCBSZWdpc3RlciAqLworCXZhbCA9IGluYihhZGRyICsgMSk7CisJb3V0Yih2YWwsIGFkZHIgKyAxKTsKKworCS8qIFNldCBNYWlsYm94IEFkZHJlc3MgUG9pbnRlciB0byBmaXJzdCBsb2NhdGlvbiBpbiBSZWdpb24gMSAqLworCW91dGIoMHgwMCwgYWRkciArIDIpOworCW91dGIoMHg4MCwgYWRkciArIDMpOworCisJLyogV3JpdGUgUmVxdWVzdCBQYWNrZXQgSGVhZGVyICovCisJb3V0YihjbWQsIGFkZHIgKyA0KTsgLyogVlJFRyBBY2Nlc3MgVHlwZSByZWFkOjB4MDIgd3JpdGU6MHgwMyAqLworCW91dGIoMHgwMSwgYWRkciArIDUpOyAvKiAjIG9mIEVudHJpZXM6IDEgQnl0ZSAoOC1iaXQpICovCisJb3V0YigweDA0LCBhZGRyICsgMik7IC8qIE1haWxib3ggQVAgdG8gZmlyc3QgZGF0YSBlbnRyeSBsb2MuICovCisKKwkvKiBXcml0ZSBWYWx1ZSBmaWVsZCAqLworCWlmIChjbWQgPT0gU0NINTZYWF9DTURfV1JJVEUpCisJCW91dGIodiwgYWRkciArIDQpOworCisJLyogV3JpdGUgQWRkcmVzcyBmaWVsZCAqLworCW91dGIocmVnICYgMHhmZiwgYWRkciArIDYpOworCW91dGIocmVnID4+IDgsIGFkZHIgKyA3KTsKKworCS8qIEV4ZWN1dGUgdGhlIFJhbmRvbSBBY2Nlc3MgQ29tbWFuZCAqLworCW91dGIoMHgwMSwgYWRkcik7IC8qIFdyaXRlIDAxaCB0byB0aGUgSG9zdC10by1FQyByZWdpc3RlciAqLworCisJLyogRU0gSW50ZXJmYWNlIFBvbGxpbmcgIkFsZ29yaXRobSIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2J1c3lfcG9sbHMgKyBtYXhfbGF6eV9wb2xsczsgaSsrKSB7CisJCWlmIChpID49IG1heF9idXN5X3BvbGxzKQorCQkJbXNsZWVwKDEpOworCQkvKiBSZWFkIEludGVycnVwdCBzb3VyY2UgUmVnaXN0ZXIgKi8KKwkJdmFsID0gaW5iKGFkZHIgKyA4KTsKKwkJLyogV3JpdGUgQ2xlYXIgdGhlIGludGVycnVwdCBzb3VyY2UgYml0cyAqLworCQlpZiAodmFsKQorCQkJb3V0Yih2YWwsIGFkZHIgKyA4KTsKKwkJLyogQ29tbWFuZCBDb21wbGV0ZWQgPyAqLworCQlpZiAodmFsICYgMHgwMSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBtYXhfYnVzeV9wb2xscyArIG1heF9sYXp5X3BvbGxzKSB7CisJCXByX2VycigiTWF4IHJldHJpZXMgZXhjZWVkZWQgcmVhZGluZyB2aXJ0dWFsICIKKwkJICAgICAgICJyZWdpc3RlciAweCUwNGh4ICglZClcbiIsIHJlZywgMSk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qCisJICogQWNjb3JkaW5nIHRvIFNNU0Mgd2UgbWF5IG5lZWQgdG8gcmV0cnkgdGhpcywgYnV0IHNvZmFyIEkndmUgYWx3YXlzCisJICogc2VlbiB0aGlzIHN1Y2NlZWQgaW4gMSB0cnkuCisJICovCisJZm9yIChpID0gMDsgaSA8IG1heF9idXN5X3BvbGxzOyBpKyspIHsKKwkJLyogUmVhZCBFQy10by1Ib3N0IFJlZ2lzdGVyICovCisJCXZhbCA9IGluYihhZGRyICsgMSk7CisJCS8qIENvbW1hbmQgQ29tcGxldGVkID8gKi8KKwkJaWYgKHZhbCA9PSAweDAxKQorCQkJYnJlYWs7CisKKwkJaWYgKGkgPT0gMCkKKwkJCXByX3dhcm4oIkVDIHJlcG9ydHM6IDB4JTAyeCByZWFkaW5nIHZpcnR1YWwgcmVnaXN0ZXIgIgorCQkJCSIweCUwNGh4XG4iLCAodW5zaWduZWQgaW50KXZhbCwgcmVnKTsKKwl9CisJaWYgKGkgPT0gbWF4X2J1c3lfcG9sbHMpIHsKKwkJcHJfZXJyKCJNYXggcmV0cmllcyBleGNlZWRlZCByZWFkaW5nIHZpcnR1YWwgIgorCQkgICAgICAgInJlZ2lzdGVyIDB4JTA0aHggKCVkKVxuIiwgcmVnLCAyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gdGhlIFNNU0MgYXBwIG5vdGUgd2Ugc2hvdWxkIG5vdyBkbzoKKwkgKgorCSAqIFNldCBNYWlsYm94IEFkZHJlc3MgUG9pbnRlciB0byBmaXJzdCBsb2NhdGlvbiBpbiBSZWdpb24gMSAqCisJICogb3V0YigweDAwLCBhZGRyICsgMik7CisJICogb3V0YigweDgwLCBhZGRyICsgMyk7CisJICoKKwkgKiBCdXQgaWYgd2UgZG8gdGhhdCB0aGluZ3MgZG9uJ3Qgd29yaywgc28gbGV0J3Mgbm90LgorCSAqLworCisJLyogUmVhZCBWYWx1ZSBmaWVsZCAqLworCWlmIChjbWQgPT0gU0NINTZYWF9DTURfUkVBRCkKKwkJcmV0dXJuIGluYihhZGRyICsgNCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZyh1MTYgYWRkciwgdTE2IHJlZykKK3sKKwlyZXR1cm4gc2NoNTZ4eF9zZW5kX2NtZChhZGRyLCBTQ0g1NlhYX0NNRF9SRUFELCByZWcsIDApOworfQorRVhQT1JUX1NZTUJPTChzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcpOworCitpbnQgc2NoNTZ4eF93cml0ZV92aXJ0dWFsX3JlZyh1MTYgYWRkciwgdTE2IHJlZywgdTggdmFsKQoreworCXJldHVybiBzY2g1Nnh4X3NlbmRfY21kKGFkZHIsIFNDSDU2WFhfQ01EX1dSSVRFLCByZWcsIHZhbCk7Cit9CitFWFBPUlRfU1lNQk9MKHNjaDU2eHhfd3JpdGVfdmlydHVhbF9yZWcpOworCitpbnQgc2NoNTZ4eF9yZWFkX3ZpcnR1YWxfcmVnMTYodTE2IGFkZHIsIHUxNiByZWcpCit7CisJaW50IGxzYiwgbXNiOworCisJLyogUmVhZCBMU0IgZmlyc3QsIHRoaXMgd2lsbCBjYXVzZSB0aGUgbWF0Y2hpbmcgTVNCIHRvIGJlIGxhdGNoZWQgKi8KKwlsc2IgPSBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcoYWRkciwgcmVnKTsKKwlpZiAobHNiIDwgMCkKKwkJcmV0dXJuIGxzYjsKKworCW1zYiA9IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZyhhZGRyLCByZWcgKyAxKTsKKwlpZiAobXNiIDwgMCkKKwkJcmV0dXJuIG1zYjsKKworCXJldHVybiBsc2IgfCAobXNiIDw8IDgpOworfQorRVhQT1JUX1NZTUJPTChzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcxNik7CisKK2ludCBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcxMih1MTYgYWRkciwgdTE2IG1zYl9yZWcsIHUxNiBsc25fcmVnLAorCQkJICAgICAgIGludCBoaWdoX25pYmJsZSkKK3sKKwlpbnQgbXNiLCBsc247CisKKwkvKiBSZWFkIE1TQiBmaXJzdCwgdGhpcyB3aWxsIGNhdXNlIHRoZSBtYXRjaGluZyBMU04gdG8gYmUgbGF0Y2hlZCAqLworCW1zYiA9IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZyhhZGRyLCBtc2JfcmVnKTsKKwlpZiAobXNiIDwgMCkKKwkJcmV0dXJuIG1zYjsKKworCWxzbiA9IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZyhhZGRyLCBsc25fcmVnKTsKKwlpZiAobHNuIDwgMCkKKwkJcmV0dXJuIGxzbjsKKworCWlmIChoaWdoX25pYmJsZSkKKwkJcmV0dXJuIChtc2IgPDwgNCkgfCAobHNuID4+IDQpOworCWVsc2UKKwkJcmV0dXJuIChtc2IgPDwgNCkgfCAobHNuICYgMHgwZik7Cit9CitFWFBPUlRfU1lNQk9MKHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZzEyKTsKKworc3RhdGljIGludCBfX2luaXQgc2NoNTZ4eF9maW5kKGludCBzaW9hZGRyLCB1bnNpZ25lZCBzaG9ydCAqYWRkcmVzcywKKwkJCSAgICAgICBjb25zdCBjaGFyICoqbmFtZSkKK3sKKwl1OCBkZXZpZDsKKwlpbnQgZXJyOworCisJZXJyID0gc3VwZXJpb19lbnRlcihzaW9hZGRyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZGV2aWQgPSBzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0RFVklEKTsKKwlzd2l0Y2ggKGRldmlkKSB7CisJY2FzZSBTSU9fU0NINTYyN19JRDoKKwkJKm5hbWUgPSAic2NoNTYyNyI7CisJCWJyZWFrOworCWNhc2UgU0lPX1NDSDU2MzZfSUQ6CisJCSpuYW1lID0gInNjaDU2MzYiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiVW5zdXBwb3J0ZWQgZGV2aWNlIGlkOiAweCUwMnhcbiIsCisJCQkgKHVuc2lnbmVkIGludClkZXZpZCk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlzdXBlcmlvX3NlbGVjdChzaW9hZGRyLCBTSU9fU0NINTZYWF9MRF9FTSk7CisKKwlpZiAoIShzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0VOQUJMRSkgJiAweDAxKSkgeworCQlwcl93YXJuKCJEZXZpY2Ugbm90IGFjdGl2YXRlZFxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKgorCSAqIFdhcm5pbmcgdGhlIG9yZGVyIG9mIHRoZSBsb3cgLyBoaWdoIGJ5dGUgaXMgdGhlIG90aGVyIHdheSBhcm91bmQKKwkgKiBhcyBvbiBtb3N0IG90aGVyIHN1cGVyaW8gZGV2aWNlcyEhCisJICovCisJKmFkZHJlc3MgPSBzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0FERFIpIHwKKwkJICAgc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19BRERSICsgMSkgPDwgODsKKwlpZiAoKmFkZHJlc3MgPT0gMCkgeworCQlwcl93YXJuKCJCYXNlIGFkZHJlc3Mgbm90IHNldFxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJc3VwZXJpb19leGl0KHNpb2FkZHIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNjaDU2eHhfZGV2aWNlX2FkZCh1bnNpZ25lZCBzaG9ydCBhZGRyZXNzLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCByZXNvdXJjZSByZXMgPSB7CisJCS5zdGFydAk9IGFkZHJlc3MsCisJCS5lbmQJPSBhZGRyZXNzICsgUkVHSU9OX0xFTkdUSCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCisJfTsKKwlpbnQgZXJyOworCisJc2NoNTZ4eF9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKG5hbWUsIGFkZHJlc3MpOworCWlmICghc2NoNTZ4eF9wZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcy5uYW1lID0gc2NoNTZ4eF9wZGV2LT5uYW1lOworCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2RldmljZV9wdXQ7CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhzY2g1Nnh4X3BkZXYsICZyZXMsIDEpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBleGl0X2RldmljZV9wdXQ7CisJfQorCisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzY2g1Nnh4X3BkZXYpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBleGl0X2RldmljZV9wdXQ7CisJfQorCisJcmV0dXJuIDA7CisKK2V4aXRfZGV2aWNlX3B1dDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNjaDU2eHhfcGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzY2g1Nnh4X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIHNob3J0IGFkZHJlc3M7CisJY29uc3QgY2hhciAqbmFtZTsKKworCWVyciA9IHNjaDU2eHhfZmluZCgweDRlLCAmYWRkcmVzcywgJm5hbWUpOworCWlmIChlcnIpCisJCWVyciA9IHNjaDU2eHhfZmluZCgweDJlLCAmYWRkcmVzcywgJm5hbWUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gc2NoNTZ4eF9kZXZpY2VfYWRkKGFkZHJlc3MsIG5hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2NoNTZ4eF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc2NoNTZ4eF9wZGV2KTsKK30KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTTVNDIFNDSDU2eHggSGFyZHdhcmUgTW9uaXRvcmluZyBDb21tb24gQ29kZSIpOworTU9EVUxFX0FVVEhPUigiSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2NoNTZ4eF9pbml0KTsKK21vZHVsZV9leGl0KHNjaDU2eHhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NjaDU2eHgtY29tbW9uLmggYi9kcml2ZXJzL2h3bW9uL3NjaDU2eHgtY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlYWYzYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vc2NoNTZ4eC1jb21tb24uaApAQCAtMCwwICsxLDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+ICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgc2NoNTZ4eF9yZWFkX3ZpcnR1YWxfcmVnKHUxNiBhZGRyLCB1MTYgcmVnKTsKK2ludCBzY2g1Nnh4X3dyaXRlX3ZpcnR1YWxfcmVnKHUxNiBhZGRyLCB1MTYgcmVnLCB1OCB2YWwpOworaW50IHNjaDU2eHhfcmVhZF92aXJ0dWFsX3JlZzE2KHUxNiBhZGRyLCB1MTYgcmVnKTsKK2ludCBzY2g1Nnh4X3JlYWRfdmlydHVhbF9yZWcxMih1MTYgYWRkciwgdTE2IG1zYl9yZWcsIHUxNiBsc25fcmVnLAorCQkJICAgICAgIGludCBoaWdoX25pYmJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NodDE1LmMgYi9kcml2ZXJzL2h3bW9uL3NodDE1LmMKaW5kZXggY2Y0MzMwYi4uN2QyMzFjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zaHQxNS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc2h0MTUuYwpAQCAtNjcxLDcgKzY3MSw3IEBACiAgKiBAYnVmOglzeXNmcyBidWZmZXIgdG8gcmVhZCB0aGUgbmV3IGhlYXRlciBzdGF0ZSBmcm9tLgogICogQGNvdW50OglsZW5ndGggb2YgdGhlIGRhdGEuCiAgKgotICogV2lsbCBiZSBjYWxsZWQgb24gcmVhZCBhY2Nlc3MgdG8gaGVhdGVyX2VuYWJsZSBzeXNmcyBhdHRyaWJ1dGUuCisgKiBXaWxsIGJlIGNhbGxlZCBvbiB3cml0ZSBhY2Nlc3MgdG8gaGVhdGVyX2VuYWJsZSBzeXNmcyBhdHRyaWJ1dGUuCiAgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBkZWNvZGVkLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci4KICAqLwogc3RhdGljIHNzaXplX3Qgc2h0MTVfc3RvcmVfaGVhdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdmlhLWNwdXRlbXAuYyBiL2RyaXZlcnMvaHdtb24vdmlhLWNwdXRlbXAuYwppbmRleCAwZDE4ZGU0Li44ZWFjNjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3ZpYS1jcHV0ZW1wLmMKKysrIGIvZHJpdmVycy9od21vbi92aWEtY3B1dGVtcC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KQEAgLTQ4LDggKzQ5LDEwIEBACiBzdHJ1Y3QgdmlhX2NwdXRlbXBfZGF0YSB7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogCWNvbnN0IGNoYXIgKm5hbWU7CisJdTggdnJtOwogCXUzMiBpZDsKLQl1MzIgbXNyOworCXUzMiBtc3JfdGVtcDsKKwl1MzIgbXNyX3ZpZDsKIH07CiAKIC8qCkBAIC03NywxMyArODAsMjcgQEAKIAl1MzIgZWF4LCBlZHg7CiAJaW50IGVycjsKIAotCWVyciA9IHJkbXNyX3NhZmVfb25fY3B1KGRhdGEtPmlkLCBkYXRhLT5tc3IsICZlYXgsICZlZHgpOworCWVyciA9IHJkbXNyX3NhZmVfb25fY3B1KGRhdGEtPmlkLCBkYXRhLT5tc3JfdGVtcCwgJmVheCwgJmVkeCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsICgodW5zaWduZWQgbG9uZyllYXggJiAweGZmZmZmZikgKiAxMDAwKTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19jcHVfdmlkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aWFfY3B1dGVtcF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIGVheCwgZWR4OworCWludCBlcnI7CisKKwllcnIgPSByZG1zcl9zYWZlX29uX2NwdShkYXRhLT5pZCwgZGF0YS0+bXNyX3ZpZCwgJmVheCwgJmVkeCk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmlkX2Zyb21fcmVnKH5lZHggJiAweDdmLCBkYXRhLT52cm0pKTsKK30KKwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLAogCQkJICBTSE9XX1RFTVApOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9sYWJlbCwgU19JUlVHTywgc2hvd19uYW1lLCBOVUxMLCBTSE9XX0xBQkVMKTsKQEAgLTEwMCw2ICsxMTcsOSBAQAogCS5hdHRycyA9IHZpYV9jcHV0ZW1wX2F0dHJpYnV0ZXMsCiB9OwogCisvKiBPcHRpb25hbCBhdHRyaWJ1dGVzICovCitzdGF0aWMgREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIHNob3dfY3B1X3ZpZCwgTlVMTCk7CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHZpYV9jcHV0ZW1wX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHZpYV9jcHV0ZW1wX2RhdGEgKmRhdGE7CkBAIC0xMjIsMTEgKzE0MiwxMiBAQAogCQkvKiBDNyBBICovCiAJY2FzZSAweEQ6CiAJCS8qIEM3IEQgKi8KLQkJZGF0YS0+bXNyID0gMHgxMTY5OworCQlkYXRhLT5tc3JfdGVtcCA9IDB4MTE2OTsKKwkJZGF0YS0+bXNyX3ZpZCA9IDB4MTk4OwogCQlicmVhazsKIAljYXNlIDB4RjoKIAkJLyogTmFubyAqLwotCQlkYXRhLT5tc3IgPSAweDE0MjM7CisJCWRhdGEtPm1zcl90ZW1wID0gMHgxNDIzOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnIgPSAtRU5PREVWOwpAQCAtMTM0LDcgKzE1NSw3IEBACiAJfQogCiAJLyogdGVzdCBpZiB3ZSBjYW4gYWNjZXNzIHRoZSBURU1QRVJBVFVSRSBNU1IgKi8KLQllcnIgPSByZG1zcl9zYWZlX29uX2NwdShkYXRhLT5pZCwgZGF0YS0+bXNyLCAmZWF4LCAmZWR4KTsKKwllcnIgPSByZG1zcl9zYWZlX29uX2NwdShkYXRhLT5pZCwgZGF0YS0+bXNyX3RlbXAsICZlYXgsICZlZHgpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJIlVuYWJsZSB0byBhY2Nlc3MgVEVNUEVSQVRVUkUgTVNSLCBnaXZpbmcgdXBcbiIpOwpAQCAtMTQ3LDYgKzE2OCwxNSBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9mcmVlOwogCisJaWYgKGRhdGEtPm1zcl92aWQpCisJCWRhdGEtPnZybSA9IHZpZF93aGljaF92cm0oKTsKKworCWlmIChkYXRhLT52cm0pIHsKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9jcHUwX3ZpZCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfcmVtb3ZlOworCX0KKwogCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2KTsKIAlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKIAkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwpAQCAtMTU4LDYgKzE4OCw4IEBACiAJcmV0dXJuIDA7CiAKIGV4aXRfcmVtb3ZlOgorCWlmIChkYXRhLT52cm0pCisJCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZ2aWFfY3B1dGVtcF9ncm91cCk7CiBleGl0X2ZyZWU6CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CkBAIC0xNzEsNiArMjAzLDggQEAKIAlzdHJ1Y3QgdmlhX2NwdXRlbXBfZGF0YSAqZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKKwlpZiAoZGF0YS0+dnJtKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2NwdTBfdmlkKTsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmdmlhX2NwdXRlbXBfZ3JvdXApOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWtmcmVlKGRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvS2NvbmZpZyBiL2RyaXZlcnMvaTJjL0tjb25maWcKaW5kZXggMzBmMDZlOS4uNWYxM2M2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvS2NvbmZpZworKysgYi9kcml2ZXJzL2kyYy9LY29uZmlnCkBAIC03LDcgKzcsNyBAQAogCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAJc2VsZWN0IFJUX01VVEVYRVMKIAktLS1oZWxwLS0tCi0JICBJMkMgKHByb25vdW5jZTogSS1zcXVhcmUtQykgaXMgYSBzbG93IHNlcmlhbCBidXMgcHJvdG9jb2wgdXNlZCBpbgorCSAgSTJDIChwcm9ub3VuY2U6IEktc3F1YXJlZC1DKSBpcyBhIHNsb3cgc2VyaWFsIGJ1cyBwcm90b2NvbCB1c2VkIGluCiAJICBtYW55IG1pY3JvIGNvbnRyb2xsZXIgYXBwbGljYXRpb25zIGFuZCBkZXZlbG9wZWQgYnkgUGhpbGlwcy4gIFNNQnVzLAogCSAgb3IgU3lzdGVtIE1hbmFnZW1lbnQgQnVzIGlzIGEgc3Vic2V0IG9mIHRoZSBJMkMgcHJvdG9jb2wuICBNb3JlCiAJICBpbmZvcm1hdGlvbiBpcyBjb250YWluZWQgaW4gdGhlIGRpcmVjdG9yeSA8ZmlsZTpEb2N1bWVudGF0aW9uL2kyYy8+LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbGkxNTM1LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUuYwppbmRleCBkZDM2NDE3Li5iNjgwN2RiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUuYwpAQCAtMSwyMyArMSwyMyBAQAogLyoKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sIAotICAgICAgICAgICAgICAgICAgICAgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+LAotICAgICAgICAgICAgICAgICAgICAgICAgRGFuIEVhdG9uIDxkYW4uZWF0b25Acm9ja2V0bG9naXguY29tPiBhbmQgCi0gICAgICAgICAgICAgICAgICAgICAgICBTdGVwaGVuIFJvdXNzZXQ8c3RlcGhlbi5yb3Vzc2V0QHJvY2tldGxvZ2l4LmNvbT4gCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqIENvcHlyaWdodCAoYykgMjAwMCAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKKyAqICAgICAgICAgICAgICAgICAgICAgIFBoaWxpcCBFZGVsYnJvY2sgPHBoaWxAbmV0cm9lZGdlLmNvbT4sCisgKiAgICAgICAgICAgICAgICAgICAgICBNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+LAorICogICAgICAgICAgICAgICAgICAgICAgRGFuIEVhdG9uIDxkYW4uZWF0b25Acm9ja2V0bG9naXguY29tPiBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIFN0ZXBoZW4gUm91c3NldCA8c3RlcGhlbi5yb3Vzc2V0QHJvY2tldGxvZ2l4LmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAogLyoKQEAgLTI1NCw4ICsyNTQsOCBAQAogCWlmICh0ZW1wICYgKEFMSTE1MzVfU1RTX0VSUiB8IEFMSTE1MzVfU1RTX0JVU1kpKSB7CiAJCS8qIGRvIGEgY2xlYXItb24td3JpdGUgKi8KIAkJb3V0Yl9wKDB4RkYsIFNNQkhTVFNUUyk7Ci0JCWlmICgodGVtcCA9IGluYl9wKFNNQkhTVFNUUykpICYKLQkJICAgIChBTEkxNTM1X1NUU19FUlIgfCBBTEkxNTM1X1NUU19CVVNZKSkgeworCQl0ZW1wID0gaW5iX3AoU01CSFNUU1RTKTsKKwkJaWYgKHRlbXAgJiAoQUxJMTUzNV9TVFNfRVJSIHwgQUxJMTUzNV9TVFNfQlVTWSkpIHsKIAkJCS8qIFRoaXMgaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUgY29ycmVjdGFibGUgb25seSBieSBhCiAJCQkgKiBwb3dlciByZXNldCBhcyBvbmUgb2YgdGhlIGJpdHMgbm93IGFwcGVhcnMgdG8gYmUKIAkJCSAqIHN0dWNrICovCkBAIC0yNjcsOSArMjY3LDggQEAKIAkJfQogCX0gZWxzZSB7CiAJCS8qIGNoZWNrIGFuZCBjbGVhciBkb25lIGJpdCAqLwotCQlpZiAodGVtcCAmIEFMSTE1MzVfU1RTX0RPTkUpIHsKKwkJaWYgKHRlbXAgJiBBTEkxNTM1X1NUU19ET05FKQogCQkJb3V0Yl9wKHRlbXAsIFNNQkhTVFNUUyk7Ci0JCX0KIAl9CiAKIAkvKiBzdGFydCB0aGUgdHJhbnNhY3Rpb24gYnkgd3JpdGluZyBhbnl0aGluZyB0byB0aGUgc3RhcnQgcmVnaXN0ZXIgKi8KQEAgLTI3OCw3ICsyNzcsNyBAQAogCS8qIFdlIHdpbGwgYWx3YXlzIHdhaXQgZm9yIGEgZnJhY3Rpb24gb2YgYSBzZWNvbmQhICovCiAJdGltZW91dCA9IDA7CiAJZG8gewotCQltc2xlZXAoMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAkJdGVtcCA9IGluYl9wKFNNQkhTVFNUUyk7CiAJfSB3aGlsZSAoKCh0ZW1wICYgQUxJMTUzNV9TVFNfQlVTWSkgJiYgISh0ZW1wICYgQUxJMTUzNV9TVFNfSURMRSkpCiAJCSAmJiAodGltZW91dCsrIDwgTUFYX1RJTUVPVVQpKTsKQEAgLTMyNSwxMiArMzI0LDEyIEBACiAJLyogdGFrZSBjb25zZXF1ZW50IGFjdGlvbnMgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KIAlpZiAoISh0ZW1wICYgQUxJMTUzNV9TVFNfRE9ORSkpIHsKIAkJLyogaXNzdWUgImtpbGwiIHRvIHJlc2V0IGhvc3QgY29udHJvbGxlciAqLwotCQlvdXRiX3AoQUxJMTUzNV9LSUxMLFNNQkhTVFRZUCk7Ci0JCW91dGJfcCgweEZGLFNNQkhTVFNUUyk7CisJCW91dGJfcChBTEkxNTM1X0tJTEwsIFNNQkhTVFRZUCk7CisJCW91dGJfcCgweEZGLCBTTUJIU1RTVFMpOwogCX0gZWxzZSBpZiAodGVtcCAmIEFMSTE1MzVfU1RTX0VSUikgewogCQkvKiBpc3N1ZSAidGltZW91dCIgdG8gcmVzZXQgYWxsIGRldmljZXMgb24gYnVzICovCi0JCW91dGJfcChBTEkxNTM1X1RfT1VULFNNQkhTVFRZUCk7Ci0JCW91dGJfcCgweEZGLFNNQkhTVFNUUyk7CisJCW91dGJfcChBTEkxNTM1X1RfT1VULCBTTUJIU1RUWVApOworCQlvdXRiX3AoMHhGRiwgU01CSFNUU1RTKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMzUxLDcgKzM1MCw3IEBACiAJZm9yICh0aW1lb3V0ID0gMDsKIAkgICAgICh0aW1lb3V0IDwgTUFYX1RJTUVPVVQpICYmICEodGVtcCAmIEFMSTE1MzVfU1RTX0lETEUpOwogCSAgICAgdGltZW91dCsrKSB7Ci0JCW1zbGVlcCgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCQl0ZW1wID0gaW5iX3AoU01CSFNUU1RTKTsKIAl9CiAJaWYgKHRpbWVvdXQgPj0gTUFYX1RJTUVPVVQpCkBAIC00ODAsMTIgKzQ3OSwxMiBAQAogCS5hbGdvCQk9ICZzbWJ1c19hbGdvcml0aG0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWxpMTUzNV9pZHNbXSA9IHsKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShhbGkxNTM1X2lkcykgPSB7CiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTcxMDEpIH0sCiAJeyB9LAogfTsKIAotTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBhbGkxNTM1X2lkcyk7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWxpMTUzNV9pZHMpOwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhbGkxNTM1X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmZpbi10d2kuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmZpbi10d2kuYwppbmRleCA1MmI1NDVhLi5jYmM5OGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jCkBAIC0xOTMsNyArMTkzLDEzIEBACiAJCXJldHVybjsKIAl9CiAJaWYgKHR3aV9pbnRfc3RhdHVzICYgTUNPTVApIHsKLQkJaWYgKGlmYWNlLT5jdXJfbW9kZSA9PSBUV0lfSTJDX01PREVfQ09NQklORUQpIHsKKwkJaWYgKChyZWFkX01BU1RFUl9DVEwoaWZhY2UpICYgTUVOKSA9PSAwICYmCisJCQkoaWZhY2UtPmN1cl9tb2RlID09IFRXSV9JMkNfTU9ERV9SRVBFQVQgfHwKKwkJCWlmYWNlLT5jdXJfbW9kZSA9PSBUV0lfSTJDX01PREVfQ09NQklORUQpKSB7CisJCQlpZmFjZS0+cmVzdWx0ID0gLTE7CisJCQl3cml0ZV9JTlRfTUFTSyhpZmFjZSwgMCk7CisJCQl3cml0ZV9NQVNURVJfQ1RMKGlmYWNlLCAwKTsKKwkJfSBlbHNlIGlmIChpZmFjZS0+Y3VyX21vZGUgPT0gVFdJX0kyQ19NT0RFX0NPTUJJTkVEKSB7CiAJCQlpZiAoaWZhY2UtPnJlYWROdW0gPT0gMCkgewogCQkJCS8qIHNldCB0aGUgcmVhZCBudW1iZXIgdG8gMSBhbmQgYXNrIGZvciBtYW51YWwKIAkJCQkgKiBzdG9wIGluIGJsb2NrIGNvbWJpbmUgbW9kZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcG0uYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3BtLmMKaW5kZXggM2EyMDk2MS4uYjFkOWNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcG0uYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNwbS5jCkBAIC02NjIsMTEgKzY2Miw4IEBACiAJLyogcmVnaXN0ZXIgbmV3IGFkYXB0ZXIgdG8gaTJjIG1vZHVsZS4uLiAqLwogCiAJZGF0YSA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+ZGV2Lm9mX25vZGUsICJsaW51eCxpMmMtaW5kZXgiLCAmbGVuKTsKLQlpZiAoZGF0YSAmJiBsZW4gPT0gNCkgewotCQljcG0tPmFkYXAubnIgPSAqZGF0YTsKLQkJcmVzdWx0ID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKCZjcG0tPmFkYXApOwotCX0gZWxzZQotCQlyZXN1bHQgPSBpMmNfYWRkX2FkYXB0ZXIoJmNwbS0+YWRhcCk7CisJY3BtLT5hZGFwLm5yID0gKGRhdGEgJiYgbGVuID09IDQpID8gYmUzMl90b19jcHVwKGRhdGEpIDogLTE7CisJcmVzdWx0ID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKCZjcG0tPmFkYXApOwogCiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJZGV2X2Vycigmb2ZkZXYtPmRldiwgIlVuYWJsZSB0byByZWdpc3RlciB3aXRoIEkyQ1xuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWhpZ2hsYW5kZXIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaGlnaGxhbmRlci5jCmluZGV4IDNkZjFiYzguLjM4NzZhMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaGlnaGxhbmRlci5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaGlnaGxhbmRlci5jCkBAIC0yMjcsNyArMjI3LDcgQEAKIAogCS8qCiAJICogVGhlIFIwUDc3ODBMQzAwMTFSTCBGUEdBIG5lZWRzIGEgc2lnbmlmaWNhbnQgZGVsYXkgYmV0d2VlbgotCSAqIGRhdGEgcmVhZCBjeWNsZXMsIG90aGVyd2lzZSB0aGUgdHJhbnNjaWV2ZXIgZ2V0cyBjb25mdXNlZCBhbmQKKwkgKiBkYXRhIHJlYWQgY3ljbGVzLCBvdGhlcndpc2UgdGhlIHRyYW5zY2VpdmVyIGdldHMgY29uZnVzZWQgYW5kCiAJICogZ2FyYmFnZSBpcyByZXR1cm5lZCB3aGVuIHRoZSByZWFkIGlzIHN1YnNlcXVlbnRseSBhYm9ydGVkLgogCSAqCiAJICogSXQgaXMgbm90IHN1ZmZpY2llbnQgdG8gd2FpdCBmb3IgQkJTWS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKaW5kZXggNThhNThjNy4uMWE3NjZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKQEAgLTIwNCw3ICsyMDQsNyBAQAogCXUxNgkJCWVycmF0YTsKIH07CiAKLWNvbnN0IHN0YXRpYyB1OCByZWdfbWFwW10gPSB7CitzdGF0aWMgY29uc3QgdTggcmVnX21hcFtdID0gewogCVtPTUFQX0kyQ19SRVZfUkVHXSA9IDB4MDAsCiAJW09NQVBfSTJDX0lFX1JFR10gPSAweDAxLAogCVtPTUFQX0kyQ19TVEFUX1JFR10gPSAweDAyLApAQCAtMjI1LDcgKzIyNSw3IEBACiAJW09NQVBfSTJDX0JVRlNUQVRfUkVHXSA9IDB4MTAsCiB9OwogCi1jb25zdCBzdGF0aWMgdTggb21hcDRfcmVnX21hcFtdID0geworc3RhdGljIGNvbnN0IHU4IG9tYXA0X3JlZ19tYXBbXSA9IHsKIAlbT01BUF9JMkNfUkVWX1JFR10gPSAweDA0LAogCVtPTUFQX0kyQ19JRV9SRUddID0gMHgyYywKIAlbT01BUF9JMkNfU1RBVF9SRUddID0gMHgyOCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCmluZGV4IGY1OTIyNGEuLmQ2MDM2NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYwpAQCAtMTA3OSw3ICsxMDc5LDcgQEAKIAkgKiBUaGUgcmVhc29uIHRvIGRvIHNvIGlzIHRvIGF2b2lkIHN5c2ZzIG5hbWVzIHRoYXQgb25seSBtYWtlCiAJICogc2Vuc2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgYWRhcHRlcnMuCiAJICovCi0JaTJjLT5hZGFwLm5yID0gZGV2LT5pZCAhPSAtMSA/IGRldi0+aWQgOiAwOworCWkyYy0+YWRhcC5uciA9IGRldi0+aWQ7CiAJc25wcmludGYoaTJjLT5hZGFwLm5hbWUsIHNpemVvZihpMmMtPmFkYXAubmFtZSksICJweGFfaTJjLWkyYy4ldSIsCiAJCSBpMmMtPmFkYXAubnIpOwogCkBAIC0xMTQyLDEwICsxMTQyLDcgQEAKIAlpMmMtPmFkYXAuZGV2Lm9mX25vZGUgPSBkZXYtPmRldi5vZl9ub2RlOwogI2VuZGlmCiAKLQlpZiAoaTJjX3R5cGUgPT0gUkVHU19DRTQxMDApCi0JCXJldCA9IGkyY19hZGRfYWRhcHRlcigmaTJjLT5hZGFwKTsKLQllbHNlCi0JCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcigmaTJjLT5hZGFwKTsKKwlyZXQgPSBpMmNfYWRkX251bWJlcmVkX2FkYXB0ZXIoJmkyYy0+YWRhcCk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiSTJDOiBGYWlsZWQgdG8gYWRkIGJ1c1xuIik7CiAJCWdvdG8gZWFkYXB0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYwppbmRleCA2YzAwYzEwLi5mODRhNjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYwpAQCAtMjQ4LDEyICsyNDgsMTIgQEAKIAlyZXR1cm4gaTJjLT5tc2dfcHRyID49IGkyYy0+bXNnLT5sZW47CiB9CiAKLS8qIGkyc19zM2NfaXJxX25leHRieXRlCisvKiBpMmNfczNjX2lycV9uZXh0Ynl0ZQogICoKICAqIHByb2Nlc3MgYW4gaW50ZXJydXB0IGFuZCB3b3JrIG91dCB3aGF0IHRvIGRvCiAgKi8KIAotc3RhdGljIGludCBpMnNfczNjX2lycV9uZXh0Ynl0ZShzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYywgdW5zaWduZWQgbG9uZyBpaWNzdGF0KQorc3RhdGljIGludCBpMmNfczNjX2lycV9uZXh0Ynl0ZShzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYywgdW5zaWduZWQgbG9uZyBpaWNzdGF0KQogewogCXVuc2lnbmVkIGxvbmcgdG1wOwogCXVuc2lnbmVkIGNoYXIgYnl0ZTsKQEAgLTI2NCw3ICsyNjQsNiBAQAogCWNhc2UgU1RBVEVfSURMRToKIAkJZGV2X2VycihpMmMtPmRldiwgIiVzOiBjYWxsZWQgaW4gU1RBVEVfSURMRVxuIiwgX19mdW5jX18pOwogCQlnb3RvIG91dDsKLQkJYnJlYWs7CiAKIAljYXNlIFNUQVRFX1NUT1A6CiAJCWRldl9lcnIoaTJjLT5kZXYsICIlczogY2FsbGVkIGluIFNUQVRFX1NUT1BcbiIsIF9fZnVuY19fKTsKQEAgLTQ0NCw3ICs0NDMsNyBAQAogCS8qIHByZXR0eSBtdWNoIHRoaXMgbGVhdmVzIHVzIHdpdGggdGhlIGZhY3QgdGhhdCB3ZSd2ZQogCSAqIHRyYW5zbWl0dGVkIG9yIHJlY2VpdmVkIHdoYXRldmVyIGJ5dGUgd2UgbGFzdCBzZW50ICovCiAKLQlpMnNfczNjX2lycV9uZXh0Ynl0ZShpMmMsIHN0YXR1cyk7CisJaTJjX3MzY19pcnFfbmV4dGJ5dGUoaTJjLCBzdGF0dXMpOwogCiAgb3V0OgogCXJldHVybiBJUlFfSEFORExFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczYwMDAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczYwMDAuYwppbmRleCBjYjVkMDFlLi5jNjRiYTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXM2MDAwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zNjAwMC5jCkBAIC0zNDEsMTAgKzM0MSw3IEBACiAJaTJjX3dyMTYoaWZhY2UsIFM2X0kyQ19UWFRMLCAwKTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaWZhY2UpOwotCWlmIChidXNfbnVtIDwgMCkKLQkJcmMgPSBpMmNfYWRkX2FkYXB0ZXIocF9hZGFwKTsKLQllbHNlCi0JCXJjID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKHBfYWRhcCk7CisJcmMgPSBpMmNfYWRkX251bWJlcmVkX2FkYXB0ZXIocF9hZGFwKTsKIAlpZiAocmMpCiAJCWdvdG8gZXJyX2lycV9mcmVlOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10YW9zLWV2bS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10YW9zLWV2bS5jCmluZGV4IGRkMzljMWUuLjI2YzM1MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGFvcy1ldm0uYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRhb3MtZXZtLmMKQEAgLTIzNCw3ICsyMzQsNyBAQAogCiAJaWYgKHRhb3MtPnN0YXRlICE9IFRBT1NfU1RBVEVfSURMRSkgewogCQllcnIgPSAtRU5PREVWOwotCQlkZXZfZGJnKCZzZXJpby0+ZGV2LCAiVEFPUyBFVk0gcmVzZXQgZmFpbGVkIChzdGF0ZT0lZCwgIgorCQlkZXZfZXJyKCZzZXJpby0+ZGV2LCAiVEFPUyBFVk0gcmVzZXQgZmFpbGVkIChzdGF0ZT0lZCwgIgogCQkJInBvcz0lZClcbiIsIHRhb3MtPnN0YXRlLCB0YW9zLT5wb3MpOwogCQlnb3RvIGV4aXRfY2xvc2U7CiAJfQpAQCAtMjU1LDcgKzI1NSw3IEBACiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKDI1MCkpOwogCWlmICh0YW9zLT5zdGF0ZSAhPSBUQU9TX1NUQVRFX0lETEUpIHsKIAkJZXJyID0gLUVOT0RFVjsKLQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiRWNobyBvZmYgZmFpbGVkICIKKwkJZGV2X2Vycigmc2VyaW8tPmRldiwgIlRBT1MgRVZNIGVjaG8gb2ZmIGZhaWxlZCAiCiAJCQkiKHN0YXRlPSVkKVxuIiwgdGFvcy0+c3RhdGUpOwogCQlnb3RvIGV4aXRfY2xvc2U7CiAJfQpAQCAtMjYzLDcgKzI2Myw3IEBACiAJZXJyID0gaTJjX2FkZF9hZGFwdGVyKGFkYXB0ZXIpOwogCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9jbG9zZTsKLQlkZXZfZGJnKCZzZXJpby0+ZGV2LCAiQ29ubmVjdGVkIHRvIFRBT1MgRVZNXG4iKTsKKwlkZXZfaW5mbygmc2VyaW8tPmRldiwgIkNvbm5lY3RlZCB0byBUQU9TIEVWTVxuIik7CiAKIAl0YW9zLT5jbGllbnQgPSB0YW9zX2luc3RhbnRpYXRlX2RldmljZShhZGFwdGVyKTsKIAlyZXR1cm4gMDsKQEAgLTI4OCw3ICsyODgsNyBAQAogCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKIAlrZnJlZSh0YW9zKTsKIAotCWRldl9kYmcoJnNlcmlvLT5kZXYsICJEaXNjb25uZWN0ZWQgZnJvbSBUQU9TIEVWTVxuIik7CisJZGV2X2luZm8oJnNlcmlvLT5kZXYsICJEaXNjb25uZWN0ZWQgZnJvbSBUQU9TIEVWTVxuIik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2VyaW9fZGV2aWNlX2lkIHRhb3Nfc2VyaW9faWRzW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRlZ3JhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRlZ3JhLmMKaW5kZXggNGQ5MzE5Ni4uZmIzYjRmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10ZWdyYS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGVncmEuYwpAQCAtNDAsOCArNDAsMTAgQEAKICNkZWZpbmUgSTJDX0NORkdfTkVXX01BU1RFUl9GU00JCQkoMTw8MTEpCiAjZGVmaW5lIEkyQ19TVEFUVVMJCQkJMHgwMUMKICNkZWZpbmUgSTJDX1NMX0NORkcJCQkJMHgwMjAKKyNkZWZpbmUgSTJDX1NMX0NORkdfTkFDSwkJCSgxPDwxKQogI2RlZmluZSBJMkNfU0xfQ05GR19ORVdTTAkJCSgxPDwyKQogI2RlZmluZSBJMkNfU0xfQUREUjEJCQkJMHgwMmMKKyNkZWZpbmUgSTJDX1NMX0FERFIyCQkJCTB4MDMwCiAjZGVmaW5lIEkyQ19UWF9GSUZPCQkJCTB4MDUwCiAjZGVmaW5lIEkyQ19SWF9GSUZPCQkJCTB4MDU0CiAjZGVmaW5lIEkyQ19QQUNLRVRfVFJBTlNGRVJfU1RBVFVTCQkweDA1OApAQCAtMzM3LDcgKzMzOSwxMSBAQAogCiAJaWYgKCFpMmNfZGV2LT5pc19kdmMpIHsKIAkJdTMyIHNsX2NmZyA9IGkyY19yZWFkbChpMmNfZGV2LCBJMkNfU0xfQ05GRyk7Ci0JCWkyY193cml0ZWwoaTJjX2Rldiwgc2xfY2ZnIHwgSTJDX1NMX0NORkdfTkVXU0wsIEkyQ19TTF9DTkZHKTsKKwkJc2xfY2ZnIHw9IEkyQ19TTF9DTkZHX05BQ0sgfCBJMkNfU0xfQ05GR19ORVdTTDsKKwkJaTJjX3dyaXRlbChpMmNfZGV2LCBzbF9jZmcsIEkyQ19TTF9DTkZHKTsKKwkJaTJjX3dyaXRlbChpMmNfZGV2LCAweGZjLCBJMkNfU0xfQUREUjEpOworCQlpMmNfd3JpdGVsKGkyY19kZXYsIDB4MDAsIEkyQ19TTF9BRERSMik7CisKIAl9CiAKIAl2YWwgPSA3IDw8IEkyQ19GSUZPX0NPTlRST0xfVFhfVFJJR19TSElGVCB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9pMmMtY29yZS5jIGIvZHJpdmVycy9pMmMvaTJjLWNvcmUuYwppbmRleCA5YTU4OTk0Li4xMzEwNzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCisrKyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKQEAgLTkyNSw2ICs5MjUsOSBAQAogICogb3Igb3RoZXJ3aXNlIGJ1aWx0IGluIHRvIHRoZSBzeXN0ZW0ncyBtYWluYm9hcmQsIGFuZCB3aGVyZSBpMmNfYm9hcmRfaW5mbwogICogaXMgdXNlZCB0byBwcm9wZXJseSBjb25maWd1cmUgSTJDIGRldmljZXMuCiAgKgorICogSWYgdGhlIHJlcXVlc3RlZCBidXMgbnVtYmVyIGlzIHNldCB0byAtMSwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmVoYXZlCisgKiBpZGVudGljYWxseSB0byBpMmNfYWRkX2FkYXB0ZXIsIGFuZCB3aWxsIGR5bmFtaWNhbGx5IGFzc2lnbiBhIGJ1cyBudW1iZXIuCisgKgogICogSWYgbm8gZGV2aWNlcyBoYXZlIHByZS1iZWVuIGRlY2xhcmVkIGZvciB0aGlzIGJ1cywgdGhlbiBiZSBzdXJlIHRvCiAgKiByZWdpc3RlciB0aGUgYWRhcHRlciBiZWZvcmUgYW55IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBvbmVzLiAgT3RoZXJ3aXNlCiAgKiB0aGUgcmVxdWlyZWQgYnVzIElEIG1heSBub3QgYmUgYXZhaWxhYmxlLgpAQCAtOTQwLDYgKzk0Myw4IEBACiAJaW50CWlkOwogCWludAlzdGF0dXM7CiAKKwlpZiAoYWRhcC0+bnIgPT0gLTEpIC8qIC0xIG1lYW5zIGR5bmFtaWNhbGx5IGFzc2lnbiBidXMgaWQgKi8KKwkJcmV0dXJuIGkyY19hZGRfYWRhcHRlcihhZGFwKTsKIAlpZiAoYWRhcC0+bnIgJiB+TUFYX0lEX01BU0spCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9tdXhlcy9wY2E5NTR4LmMgYi9kcml2ZXJzL2kyYy9tdXhlcy9wY2E5NTR4LmMKaW5kZXggNTRlMWNlNy4uNmY4OTUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvbXV4ZXMvcGNhOTU0eC5jCisrKyBiL2RyaXZlcnMvaTJjL211eGVzL3BjYTk1NHguYwpAQCAtMjAxLDEwICsyMDEsMTEgQEAKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOwogCi0JLyogUmVhZCB0aGUgbXV4IHJlZ2lzdGVyIGF0IGFkZHIgdG8gdmVyaWZ5Ci0JICogdGhhdCB0aGUgbXV4IGlzIGluIGZhY3QgcHJlc2VudC4KKwkvKiBXcml0ZSB0aGUgbXV4IHJlZ2lzdGVyIGF0IGFkZHIgdG8gdmVyaWZ5CisJICogdGhhdCB0aGUgbXV4IGlzIGluIGZhY3QgcHJlc2VudC4gVGhpcyBhbHNvCisJICogaW5pdGlhbGl6ZXMgdGhlIG11eCB0byBkaXNjb25uZWN0ZWQgc3RhdGUuCiAJICovCi0JaWYgKGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KSA8IDApIHsKKwlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCAwKSA8IDApIHsKIAkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAicHJvYmUgZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2ZyZWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwppbmRleCAxNDRkMjcyLi4wNGIwOTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwpAQCAtNzc4LDcgKzc3OCw4IEBACiAJCQkJCXNlY3Rvcl90IGJsb2NrKQogewogCXN0cnVjdCBpZGVfY21kIGNtZDsKLQlpbnQgdXB0b2RhdGUgPSAwLCBuc2VjdG9yczsKKwlpbnQgdXB0b2RhdGUgPSAwOworCXVuc2lnbmVkIGludCBuc2VjdG9yczsKIAogCWlkZV9kZWJ1Z19sb2coSURFX0RCR19SUSwgImNtZDogMHgleCwgYmxvY2s6ICVsbHUiLAogCQkJCSAgcnEtPmNtZFswXSwgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wYWxtX2JrMzcxMC5jIGIvZHJpdmVycy9pZGUvcGFsbV9iazM3MTAuYwppbmRleCA5ZThmNGUxLi43MTJjNzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wYWxtX2JrMzcxMC5jCisrKyBiL2RyaXZlcnMvaWRlL3BhbG1fYmszNzEwLmMKQEAgLTM0Miw3ICszNDIsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQltZW1fc2l6ZSA9IG1lbS0+ZW5kIC0gbWVtLT5zdGFydCArIDE7CisJbWVtX3NpemUgPSByZXNvdXJjZV9zaXplKG1lbSk7CiAJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCBtZW1fc2l6ZSwgInBhbG1fYmszNzEwIikgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZXF1ZXN0IG1lbW9yeSByZWdpb25cbiIpOwogCQlyZXR1cm4gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMgYi9kcml2ZXJzL2lkZS90eDQ5MzlpZGUuYwppbmRleCBiZWQzZTM5Li43MWMyMzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS90eDQ5MzlpZGUuYworKysgYi9kcml2ZXJzL2lkZS90eDQ5MzlpZGUuYwpAQCAtNTUxLDEwICs1NTEsMTAgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCi0JCQkJICAgICByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxLCAidHg0OTM4aWRlIikpCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcyksICJ0eDQ5MzhpZGUiKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAltYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCi0JCQkJCSAgICAgIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCQkJCQkgICAgICByZXNvdXJjZV9zaXplKHJlcykpOwogCWlmICghbWFwYmFzZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAltZW1zZXQoJmh3LCAwLCBzaXplb2YoaHcpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTgwMjE1NC9NYWtlZmlsZSBiL2RyaXZlcnMvaWVlZTgwMjE1NC9NYWtlZmlsZQppbmRleCA2ODk5OTEzLi44MDBhMzg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWU4MDIxNTQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pZWVlODAyMTU0L01ha2VmaWxlCkBAIC0xLDMgKzEgQEAKIG9iai0kKENPTkZJR19JRUVFODAyMTU0X0ZBS0VIQVJEKSArPSBmYWtlaGFyZC5vCi0KLWNjZmxhZ3MteSA6PSAtRERFQlVHIC1EQ09ORklHX0ZGRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlODAyMTU0L2Zha2VoYXJkLmMgYi9kcml2ZXJzL2llZWU4MDIxNTQvZmFrZWhhcmQuYwppbmRleCBhNWE0OWExLi5lYjBlMmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWU4MDIxNTQvZmFrZWhhcmQuYworKysgYi9kcml2ZXJzL2llZWU4MDIxNTQvZmFrZWhhcmQuYwpAQCAtMzcwLDggKzM3MCw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXBoeS0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBkZXY7Ci0KIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgIlx4YmFceGJlXHhjYVx4ZmVceGRlXHhhZFx4YmVceGVmIiwKIAkJCWRldi0+YWRkcl9sZW4pOwogCW1lbWNweShkZXYtPnBlcm1fYWRkciwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMKaW5kZXggOGUyMWQ0NS4uMjM2YWQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2FkZHIuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAKIAluZWlnaCA9IG5laWdoX2xvb2t1cCgmYXJwX3RibCwgJnJ0LT5ydF9nYXRld2F5LCBydC0+ZHN0LmRldik7CiAJaWYgKCFuZWlnaCB8fCAhKG5laWdoLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKSB7Ci0JCW5laWdoX2V2ZW50X3NlbmQocnQtPmRzdC5uZWlnaGJvdXIsIE5VTEwpOworCQluZWlnaF9ldmVudF9zZW5kKGRzdF9nZXRfbmVpZ2hib3VyKCZydC0+ZHN0KSwgTlVMTCk7CiAJCXJldCA9IC1FTk9EQVRBOwogCQlpZiAobmVpZ2gpCiAJCQlnb3RvIHJlbGVhc2U7CkBAIC0yNzMsOSArMjczLDEwIEBACiAJCWdvdG8gcHV0OwogCX0KIAotCW5laWdoID0gZHN0LT5uZWlnaGJvdXI7CisJbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOwogCWlmICghbmVpZ2ggfHwgIShuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSkgewotCQluZWlnaF9ldmVudF9zZW5kKGRzdC0+bmVpZ2hib3VyLCBOVUxMKTsKKwkJaWYgKG5laWdoKQorCQkJbmVpZ2hfZXZlbnRfc2VuZChuZWlnaCwgTlVMTCk7CiAJCXJldCA9IC1FTk9EQVRBOwogCQlnb3RvIHB1dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jYWNoZS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY2FjaGUuYwppbmRleCBmOWJhN2Q3Li45MzUzOTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jYWNoZS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NhY2hlLmMKQEAgLTMwMiw3ICszMDIsOCBAQAogCSAgICBldmVudC0+ZXZlbnQgPT0gSUJfRVZFTlRfTElEX0NIQU5HRSAgfHwKIAkgICAgZXZlbnQtPmV2ZW50ID09IElCX0VWRU5UX1BLRVlfQ0hBTkdFIHx8CiAJICAgIGV2ZW50LT5ldmVudCA9PSBJQl9FVkVOVF9TTV9DSEFOR0UgICB8fAotCSAgICBldmVudC0+ZXZlbnQgPT0gSUJfRVZFTlRfQ0xJRU5UX1JFUkVHSVNURVIpIHsKKwkgICAgZXZlbnQtPmV2ZW50ID09IElCX0VWRU5UX0NMSUVOVF9SRVJFR0lTVEVSIHx8CisJICAgIGV2ZW50LT5ldmVudCA9PSBJQl9FVkVOVF9HSURfQ0hBTkdFKSB7CiAJCXdvcmsgPSBrbWFsbG9jKHNpemVvZiAqd29yaywgR0ZQX0FUT01JQyk7CiAJCWlmICh3b3JrKSB7CiAJCQlJTklUX1dPUksoJndvcmstPndvcmssIGliX2NhY2hlX3Rhc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMKaW5kZXggZjYyZjUyZi4uZmMwZjJiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jCkBAIC0zNjQxLDcgKzM2NDEsOCBAQAogCiBzdGF0aWMgY2hhciAqY21fZGV2bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIG1vZGVfdCAqbW9kZSkKIHsKLQkqbW9kZSA9IDA2NjY7CisJaWYgKG1vZGUpCisJCSptb2RlID0gMDY2NjsKIAlyZXR1cm4ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJpbmZpbmliYW5kLyVzIiwgZGV2X25hbWUoZGV2KSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKaW5kZXggYjZhMzNiMy4uY2E0YzVkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKQEAgLTM1OSw2ICszNTksMTAgQEAKIAllbnVtIHJkbWFfbGlua19sYXllciBkZXZfbGwgPSBkZXZfYWRkci0+ZGV2X3R5cGUgPT0gQVJQSFJEX0lORklOSUJBTkQgPwogCQlJQl9MSU5LX0xBWUVSX0lORklOSUJBTkQgOiBJQl9MSU5LX0xBWUVSX0VUSEVSTkVUOwogCisJaWYgKGRldl9sbCAhPSBJQl9MSU5LX0xBWUVSX0lORklOSUJBTkQgJiYKKwkgICAgaWRfcHJpdi0+aWQucHMgPT0gUkRNQV9QU19JUE9JQikKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAltdXRleF9sb2NrKCZsb2NrKTsKIAlpYm9lX2FkZHJfZ2V0X3NnaWQoZGV2X2FkZHIsICZpYm9lX2dpZCk7CiAJbWVtY3B5KCZnaWQsIGRldl9hZGRyLT5zcmNfZGV2X2FkZHIgKwpAQCAtNDA2LDExICs0MTAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNtYV9oYXNfY21fZGV2KHN0cnVjdCByZG1hX2lkX3ByaXZhdGUgKmlkX3ByaXYpCi17Ci0JcmV0dXJuIChpZF9wcml2LT5pZC5kZXZpY2UgJiYgaWRfcHJpdi0+Y21faWQuaWIpOwotfQotCiBzdHJ1Y3QgcmRtYV9jbV9pZCAqcmRtYV9jcmVhdGVfaWQocmRtYV9jbV9ldmVudF9oYW5kbGVyIGV2ZW50X2hhbmRsZXIsCiAJCQkJICB2b2lkICpjb250ZXh0LCBlbnVtIHJkbWFfcG9ydF9zcGFjZSBwcywKIAkJCQkgIGVudW0gaWJfcXBfdHlwZSBxcF90eXBlKQpAQCAtOTIwLDExICs5MTksMTEgQEAKIAlpZiAoaWRfcHJpdi0+Y21hX2RldikgewogCQlzd2l0Y2ggKHJkbWFfbm9kZV9nZXRfdHJhbnNwb3J0KGlkX3ByaXYtPmlkLmRldmljZS0+bm9kZV90eXBlKSkgewogCQljYXNlIFJETUFfVFJBTlNQT1JUX0lCOgotCQkJaWYgKGlkX3ByaXYtPmNtX2lkLmliICYmICFJU19FUlIoaWRfcHJpdi0+Y21faWQuaWIpKQorCQkJaWYgKGlkX3ByaXYtPmNtX2lkLmliKQogCQkJCWliX2Rlc3Ryb3lfY21faWQoaWRfcHJpdi0+Y21faWQuaWIpOwogCQkJYnJlYWs7CiAJCWNhc2UgUkRNQV9UUkFOU1BPUlRfSVdBUlA6Ci0JCQlpZiAoaWRfcHJpdi0+Y21faWQuaXcgJiYgIUlTX0VSUihpZF9wcml2LT5jbV9pZC5pdykpCisJCQlpZiAoaWRfcHJpdi0+Y21faWQuaXcpCiAJCQkJaXdfZGVzdHJveV9jbV9pZChpZF9wcml2LT5jbV9pZC5pdyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTEwODUsMTIgKzEwODQsMTIgQEAKIAogCWlmIChjbWFfZ2V0X25ldF9pbmZvKGliX2V2ZW50LT5wcml2YXRlX2RhdGEsIGxpc3Rlbl9pZC0+cHMsCiAJCQkgICAgICZpcF92ZXIsICZwb3J0LCAmc3JjLCAmZHN0KSkKLQkJZ290byBlcnI7CisJCXJldHVybiBOVUxMOwogCiAJaWQgPSByZG1hX2NyZWF0ZV9pZChsaXN0ZW5faWQtPmV2ZW50X2hhbmRsZXIsIGxpc3Rlbl9pZC0+Y29udGV4dCwKIAkJCSAgICBsaXN0ZW5faWQtPnBzLCBpYl9ldmVudC0+cGFyYW0ucmVxX3JjdmQucXBfdHlwZSk7CiAJaWYgKElTX0VSUihpZCkpCi0JCWdvdG8gZXJyOworCQlyZXR1cm4gTlVMTDsKIAogCWNtYV9zYXZlX25ldF9pbmZvKCZpZC0+cm91dGUuYWRkciwgJmxpc3Rlbl9pZC0+cm91dGUuYWRkciwKIAkJCSAgaXBfdmVyLCBwb3J0LCBzcmMsIGRzdCk7CkBAIC0xMTAwLDcgKzEwOTksNyBAQAogCXJ0LT5wYXRoX3JlYyA9IGttYWxsb2Moc2l6ZW9mICpydC0+cGF0aF9yZWMgKiBydC0+bnVtX3BhdGhzLAogCQkJICAgICAgIEdGUF9LRVJORUwpOwogCWlmICghcnQtPnBhdGhfcmVjKQotCQlnb3RvIGRlc3Ryb3lfaWQ7CisJCWdvdG8gZXJyOwogCiAJcnQtPnBhdGhfcmVjWzBdID0gKmliX2V2ZW50LT5wYXJhbS5yZXFfcmN2ZC5wcmltYXJ5X3BhdGg7CiAJaWYgKHJ0LT5udW1fcGF0aHMgPT0gMikKQEAgLTExMTQsNyArMTExMyw3IEBACiAJCXJldCA9IHJkbWFfdHJhbnNsYXRlX2lwKChzdHJ1Y3Qgc29ja2FkZHIgKikgJnJ0LT5hZGRyLnNyY19hZGRyLAogCQkJCQkmcnQtPmFkZHIuZGV2X2FkZHIpOwogCQlpZiAocmV0KQotCQkJZ290byBkZXN0cm95X2lkOworCQkJZ290byBlcnI7CiAJfQogCXJkbWFfYWRkcl9zZXRfZGdpZCgmcnQtPmFkZHIuZGV2X2FkZHIsICZydC0+cGF0aF9yZWNbMF0uZGdpZCk7CiAKQEAgLTExMjIsOSArMTEyMSw4IEBACiAJaWRfcHJpdi0+c3RhdGUgPSBSRE1BX0NNX0NPTk5FQ1Q7CiAJcmV0dXJuIGlkX3ByaXY7CiAKLWRlc3Ryb3lfaWQ6Ci0JcmRtYV9kZXN0cm95X2lkKGlkKTsKIGVycjoKKwlyZG1hX2Rlc3Ryb3lfaWQoaWQpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0xNDY4LDEzICsxNDY2LDE1IEBACiB7CiAJc3RydWN0IGliX2NtX2NvbXBhcmVfZGF0YSBjb21wYXJlX2RhdGE7CiAJc3RydWN0IHNvY2thZGRyICphZGRyOworCXN0cnVjdCBpYl9jbV9pZAkqaWQ7CiAJX19iZTY0IHN2Y19pZDsKIAlpbnQgcmV0OwogCi0JaWRfcHJpdi0+Y21faWQuaWIgPSBpYl9jcmVhdGVfY21faWQoaWRfcHJpdi0+aWQuZGV2aWNlLCBjbWFfcmVxX2hhbmRsZXIsCi0JCQkJCSAgICBpZF9wcml2KTsKLQlpZiAoSVNfRVJSKGlkX3ByaXYtPmNtX2lkLmliKSkKLQkJcmV0dXJuIFBUUl9FUlIoaWRfcHJpdi0+Y21faWQuaWIpOworCWlkID0gaWJfY3JlYXRlX2NtX2lkKGlkX3ByaXYtPmlkLmRldmljZSwgY21hX3JlcV9oYW5kbGVyLCBpZF9wcml2KTsKKwlpZiAoSVNfRVJSKGlkKSkKKwkJcmV0dXJuIFBUUl9FUlIoaWQpOworCisJaWRfcHJpdi0+Y21faWQuaWIgPSBpZDsKIAogCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopICZpZF9wcml2LT5pZC5yb3V0ZS5hZGRyLnNyY19hZGRyOwogCXN2Y19pZCA9IGNtYV9nZXRfc2VydmljZV9pZChpZF9wcml2LT5pZC5wcywgYWRkcik7CkBAIC0xNDk3LDEyICsxNDk3LDE1IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKwlzdHJ1Y3QgaXdfY21faWQJKmlkOwogCi0JaWRfcHJpdi0+Y21faWQuaXcgPSBpd19jcmVhdGVfY21faWQoaWRfcHJpdi0+aWQuZGV2aWNlLAotCQkJCQkgICAgaXdfY29ubl9yZXFfaGFuZGxlciwKLQkJCQkJICAgIGlkX3ByaXYpOwotCWlmIChJU19FUlIoaWRfcHJpdi0+Y21faWQuaXcpKQotCQlyZXR1cm4gUFRSX0VSUihpZF9wcml2LT5jbV9pZC5pdyk7CisJaWQgPSBpd19jcmVhdGVfY21faWQoaWRfcHJpdi0+aWQuZGV2aWNlLAorCQkJICAgICBpd19jb25uX3JlcV9oYW5kbGVyLAorCQkJICAgICBpZF9wcml2KTsKKwlpZiAoSVNfRVJSKGlkKSkKKwkJcmV0dXJuIFBUUl9FUlIoaWQpOworCisJaWRfcHJpdi0+Y21faWQuaXcgPSBpZDsKIAogCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmlkX3ByaXYtPmlkLnJvdXRlLmFkZHIuc3JjX2FkZHI7CiAJaWRfcHJpdi0+Y21faWQuaXctPmxvY2FsX2FkZHIgPSAqc2luOwpAQCAtMjQ4NCw2ICsyNDg3LDcgQEAKIHsKIAlzdHJ1Y3QgaWJfY21fc2lkcl9yZXFfcGFyYW0gcmVxOwogCXN0cnVjdCByZG1hX3JvdXRlICpyb3V0ZTsKKwlzdHJ1Y3QgaWJfY21faWQJKmlkOwogCWludCByZXQ7CiAKIAlyZXEucHJpdmF0ZV9kYXRhX2xlbiA9IHNpemVvZihzdHJ1Y3QgY21hX2hkcikgKwpAQCAtMjUwMSwxMiArMjUwNSwxMyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JaWRfcHJpdi0+Y21faWQuaWIgPSBpYl9jcmVhdGVfY21faWQoaWRfcHJpdi0+aWQuZGV2aWNlLAotCQkJCQkgICAgY21hX3NpZHJfcmVwX2hhbmRsZXIsIGlkX3ByaXYpOwotCWlmIChJU19FUlIoaWRfcHJpdi0+Y21faWQuaWIpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaWRfcHJpdi0+Y21faWQuaWIpOworCWlkID0gaWJfY3JlYXRlX2NtX2lkKGlkX3ByaXYtPmlkLmRldmljZSwgY21hX3NpZHJfcmVwX2hhbmRsZXIsCisJCQkgICAgIGlkX3ByaXYpOworCWlmIChJU19FUlIoaWQpKSB7CisJCXJldCA9IFBUUl9FUlIoaWQpOwogCQlnb3RvIG91dDsKIAl9CisJaWRfcHJpdi0+Y21faWQuaWIgPSBpZDsKIAogCXJlcS5wYXRoID0gcm91dGUtPnBhdGhfcmVjOwogCXJlcS5zZXJ2aWNlX2lkID0gY21hX2dldF9zZXJ2aWNlX2lkKGlkX3ByaXYtPmlkLnBzLApAQCAtMjUzMCw2ICsyNTM1LDcgQEAKIAlzdHJ1Y3QgaWJfY21fcmVxX3BhcmFtIHJlcTsKIAlzdHJ1Y3QgcmRtYV9yb3V0ZSAqcm91dGU7CiAJdm9pZCAqcHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpYl9jbV9pZAkqaWQ7CiAJaW50IG9mZnNldCwgcmV0OwogCiAJbWVtc2V0KCZyZXEsIDAsIHNpemVvZiByZXEpOwpAQCAtMjU0MywxMiArMjU0OSwxMiBAQAogCQltZW1jcHkocHJpdmF0ZV9kYXRhICsgb2Zmc2V0LCBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGEsCiAJCSAgICAgICBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKIAotCWlkX3ByaXYtPmNtX2lkLmliID0gaWJfY3JlYXRlX2NtX2lkKGlkX3ByaXYtPmlkLmRldmljZSwgY21hX2liX2hhbmRsZXIsCi0JCQkJCSAgICBpZF9wcml2KTsKLQlpZiAoSVNfRVJSKGlkX3ByaXYtPmNtX2lkLmliKSkgewotCQlyZXQgPSBQVFJfRVJSKGlkX3ByaXYtPmNtX2lkLmliKTsKKwlpZCA9IGliX2NyZWF0ZV9jbV9pZChpZF9wcml2LT5pZC5kZXZpY2UsIGNtYV9pYl9oYW5kbGVyLCBpZF9wcml2KTsKKwlpZiAoSVNfRVJSKGlkKSkgeworCQlyZXQgPSBQVFJfRVJSKGlkKTsKIAkJZ290byBvdXQ7CiAJfQorCWlkX3ByaXYtPmNtX2lkLmliID0gaWQ7CiAKIAlyb3V0ZSA9ICZpZF9wcml2LT5pZC5yb3V0ZTsKIAlyZXQgPSBjbWFfZm9ybWF0X2hkcihwcml2YXRlX2RhdGEsIGlkX3ByaXYtPmlkLnBzLCByb3V0ZSk7CkBAIC0yNTc3LDggKzI1ODMsOCBAQAogCiAJcmV0ID0gaWJfc2VuZF9jbV9yZXEoaWRfcHJpdi0+Y21faWQuaWIsICZyZXEpOwogb3V0OgotCWlmIChyZXQgJiYgIUlTX0VSUihpZF9wcml2LT5jbV9pZC5pYikpIHsKLQkJaWJfZGVzdHJveV9jbV9pZChpZF9wcml2LT5jbV9pZC5pYik7CisJaWYgKHJldCAmJiAhSVNfRVJSKGlkKSkgeworCQlpYl9kZXN0cm95X2NtX2lkKGlkKTsKIAkJaWRfcHJpdi0+Y21faWQuaWIgPSBOVUxMOwogCX0KIApAQCAtMjU5NSwxMCArMjYwMSw4IEBACiAJc3RydWN0IGl3X2NtX2Nvbm5fcGFyYW0gaXdfcGFyYW07CiAKIAljbV9pZCA9IGl3X2NyZWF0ZV9jbV9pZChpZF9wcml2LT5pZC5kZXZpY2UsIGNtYV9pd19oYW5kbGVyLCBpZF9wcml2KTsKLQlpZiAoSVNfRVJSKGNtX2lkKSkgewotCQlyZXQgPSBQVFJfRVJSKGNtX2lkKTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChJU19FUlIoY21faWQpKQorCQlyZXR1cm4gUFRSX0VSUihjbV9pZCk7CiAKIAlpZF9wcml2LT5jbV9pZC5pdyA9IGNtX2lkOwogCkBAIC0yNjIyLDcgKzI2MjYsNyBAQAogCQlpd19wYXJhbS5xcG4gPSBjb25uX3BhcmFtLT5xcF9udW07CiAJcmV0ID0gaXdfY21fY29ubmVjdChjbV9pZCwgJml3X3BhcmFtKTsKIG91dDoKLQlpZiAocmV0ICYmICFJU19FUlIoY21faWQpKSB7CisJaWYgKHJldCkgewogCQlpd19kZXN0cm95X2NtX2lkKGNtX2lkKTsKIAkJaWRfcHJpdi0+Y21faWQuaXcgPSBOVUxMOwogCX0KQEAgLTI3OTUsNyArMjc5OSw3IEBACiAJaW50IHJldDsKIAogCWlkX3ByaXYgPSBjb250YWluZXJfb2YoaWQsIHN0cnVjdCByZG1hX2lkX3ByaXZhdGUsIGlkKTsKLQlpZiAoIWNtYV9oYXNfY21fZGV2KGlkX3ByaXYpKQorCWlmICghaWRfcHJpdi0+Y21faWQuaWIpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3dpdGNoIChpZC0+ZGV2aWNlLT5ub2RlX3R5cGUpIHsKQEAgLTI4MTcsNyArMjgyMSw3IEBACiAJaW50IHJldDsKIAogCWlkX3ByaXYgPSBjb250YWluZXJfb2YoaWQsIHN0cnVjdCByZG1hX2lkX3ByaXZhdGUsIGlkKTsKLQlpZiAoIWNtYV9oYXNfY21fZGV2KGlkX3ByaXYpKQorCWlmICghaWRfcHJpdi0+Y21faWQuaWIpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3dpdGNoIChyZG1hX25vZGVfZ2V0X3RyYW5zcG9ydChpZC0+ZGV2aWNlLT5ub2RlX3R5cGUpKSB7CkBAIC0yODQ4LDcgKzI4NTIsNyBAQAogCWludCByZXQ7CiAKIAlpZF9wcml2ID0gY29udGFpbmVyX29mKGlkLCBzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlLCBpZCk7Ci0JaWYgKCFjbWFfaGFzX2NtX2RldihpZF9wcml2KSkKKwlpZiAoIWlkX3ByaXYtPmNtX2lkLmliKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXN3aXRjaCAocmRtYV9ub2RlX2dldF90cmFuc3BvcnQoaWQtPmRldmljZS0+bm9kZV90eXBlKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvZGV2aWNlLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9kZXZpY2UuYwppbmRleCA0MDA3ZjcyLi5lNzExZGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9kZXZpY2UuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9kZXZpY2UuYwpAQCAtNjI3LDYgKzYyNyw5IEBACiAJCSAgICAgaW50IGRldmljZV9tb2RpZnlfbWFzaywKIAkJICAgICBzdHJ1Y3QgaWJfZGV2aWNlX21vZGlmeSAqZGV2aWNlX21vZGlmeSkKIHsKKwlpZiAoIWRldmljZS0+bW9kaWZ5X2RldmljZSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKIAlyZXR1cm4gZGV2aWNlLT5tb2RpZnlfZGV2aWNlKGRldmljZSwgZGV2aWNlX21vZGlmeV9tYXNrLAogCQkJCSAgICAgZGV2aWNlX21vZGlmeSk7CiB9CkBAIC02NDcsNiArNjUwLDkgQEAKIAkJICAgdTggcG9ydF9udW0sIGludCBwb3J0X21vZGlmeV9tYXNrLAogCQkgICBzdHJ1Y3QgaWJfcG9ydF9tb2RpZnkgKnBvcnRfbW9kaWZ5KQogeworCWlmICghZGV2aWNlLT5tb2RpZnlfcG9ydCkKKwkJcmV0dXJuIC1FTk9TWVM7CisKIAlpZiAocG9ydF9udW0gPCBzdGFydF9wb3J0KGRldmljZSkgfHwgcG9ydF9udW0gPiBlbmRfcG9ydChkZXZpY2UpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbmV0bGluay5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbmV0bGluay5jCmluZGV4IDRhNWFiYWYuLjkyMjdmNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL25ldGxpbmsuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9uZXRsaW5rLmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJcmV0dXJuIG5ldGxpbmtfZHVtcF9zdGFydChubHMsIHNrYiwgbmxoLAogCQkJCQkJICBjbGllbnQtPmNiX3RhYmxlW29wXS5kdW1wLAotCQkJCQkJICBOVUxMKTsKKwkJCQkJCSAgTlVMTCwgMCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCmluZGV4IGU0OWE4NWYuLjU2ODk4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwpAQCAtODI2LDcgKzgyNiw4IEBACiAKIHN0YXRpYyBjaGFyICp1dmVyYnNfZGV2bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIG1vZGVfdCAqbW9kZSkKIHsKLQkqbW9kZSA9IDA2NjY7CisJaWYgKG1vZGUpCisJCSptb2RlID0gMDY2NjsKIAlyZXR1cm4ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJpbmZpbmliYW5kLyVzIiwgZGV2X25hbWUoZGV2KSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyLmMKaW5kZXggMGNmYzQ1NS4uNDQ0NDcwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9wcm92aWRlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3Byb3ZpZGVyLmMKaW5kZXggYWVlYmM0ZC4uZjEwMWJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3Byb3ZpZGVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3Byb3ZpZGVyLmMKQEAgLTk5LDE0ICs5OSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYzJfbW9kaWZ5X3BvcnQoc3RydWN0IGliX2RldmljZSAqaWJkZXYsCi0JCQkgIHU4IHBvcnQsIGludCBwb3J0X21vZGlmeV9tYXNrLAotCQkJICBzdHJ1Y3QgaWJfcG9ydF9tb2RpZnkgKnByb3BzKQotewotCXByX2RlYnVnKCIlczoldVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBjMl9xdWVyeV9wa2V5KHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAogCQkJIHU4IHBvcnQsIHUxNiBpbmRleCwgdTE2ICogcGtleSkKIHsKQEAgLTgxNyw3ICs4MDksNiBAQAogCWRldi0+aWJkZXYuZG1hX2RldmljZSA9ICZkZXYtPnBjaWRldi0+ZGV2OwogCWRldi0+aWJkZXYucXVlcnlfZGV2aWNlID0gYzJfcXVlcnlfZGV2aWNlOwogCWRldi0+aWJkZXYucXVlcnlfcG9ydCA9IGMyX3F1ZXJ5X3BvcnQ7Ci0JZGV2LT5pYmRldi5tb2RpZnlfcG9ydCA9IGMyX21vZGlmeV9wb3J0OwogCWRldi0+aWJkZXYucXVlcnlfcGtleSA9IGMyX3F1ZXJ5X3BrZXk7CiAJZGV2LT5pYmRldi5xdWVyeV9naWQgPSBjMl9xdWVyeV9naWQ7CiAJZGV2LT5pYmRldi5hbGxvY191Y29udGV4dCA9IGMyX2FsbG9jX3Vjb250ZXh0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX2NtLmMKaW5kZXggMGE1MDA4Zi4uMTdiZjlkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9jbS5jCkBAIC0xMzI4LDYgKzEzMjgsNyBAQAogCXN0cnVjdCBpd2NoX2VwICpjaGlsZF9lcCwgKnBhcmVudF9lcCA9IGN0eDsKIAlzdHJ1Y3QgY3BsX3Bhc3NfYWNjZXB0X3JlcSAqcmVxID0gY3BsaGRyKHNrYik7CiAJdW5zaWduZWQgaW50IGh3dGlkID0gR0VUX1RJRChyZXEpOworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKIAlzdHJ1Y3QgbDJ0X2VudHJ5ICpsMnQ7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CkBAIC0xMzY0LDcgKzEzNjUsOCBAQAogCQlnb3RvIHJlamVjdDsKIAl9CiAJZHN0ID0gJnJ0LT5kc3Q7Ci0JbDJ0ID0gdDNfbDJ0X2dldCh0ZGV2LCBkc3QtPm5laWdoYm91ciwgZHN0LT5uZWlnaGJvdXItPmRldik7CisJbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOworCWwydCA9IHQzX2wydF9nZXQodGRldiwgbmVpZ2gsIG5laWdoLT5kZXYpOwogCWlmICghbDJ0KSB7CiAJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIC0gZmFpbGVkIHRvIGFsbG9jYXRlIGwydCBlbnRyeSFcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7CkBAIC0xODc0LDEwICsxODc2LDExIEBACiAKIGludCBpd2NoX2Nvbm5lY3Qoc3RydWN0IGl3X2NtX2lkICpjbV9pZCwgc3RydWN0IGl3X2NtX2Nvbm5fcGFyYW0gKmNvbm5fcGFyYW0pCiB7Ci0JaW50IGVyciA9IDA7CiAJc3RydWN0IGl3Y2hfZGV2ICpoID0gdG9faXdjaF9kZXYoY21faWQtPmRldmljZSk7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CiAJc3RydWN0IGl3Y2hfZXAgKmVwOwogCXN0cnVjdCBydGFibGUgKnJ0OworCWludCBlcnIgPSAwOwogCiAJaWYgKGlzX2xvb3BiYWNrX2RzdChjbV9pZCkpIHsKIAkJZXJyID0gLUVOT1NZUzsKQEAgLTE5MzMsOSArMTkzNiwxMCBAQAogCX0KIAllcC0+ZHN0ID0gJnJ0LT5kc3Q7CiAKKwluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyKGVwLT5kc3QpOworCiAJLyogZ2V0IGEgbDJ0IGVudHJ5ICovCi0JZXAtPmwydCA9IHQzX2wydF9nZXQoZXAtPmNvbS50ZGV2LCBlcC0+ZHN0LT5uZWlnaGJvdXIsCi0JCQkgICAgIGVwLT5kc3QtPm5laWdoYm91ci0+ZGV2KTsKKwllcC0+bDJ0ID0gdDNfbDJ0X2dldChlcC0+Y29tLnRkZXYsIG5laWdoLCBuZWlnaC0+ZGV2KTsKIAlpZiAoIWVwLT5sMnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIE1PRCAiJXMgLSBjYW5ub3QgYWxsb2MgbDJlLlxuIiwgX19mdW5jX18pOwogCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmMKaW5kZXggMmUyNzQxMy4uYzdkOTQxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5jCkBAIC02MSwxMyArNjEsNiBAQAogI2luY2x1ZGUgIml3Y2hfdXNlci5oIgogI2luY2x1ZGUgImNvbW1vbi5oIgogCi1zdGF0aWMgaW50IGl3Y2hfbW9kaWZ5X3BvcnQoc3RydWN0IGliX2RldmljZSAqaWJkZXYsCi0JCQkgICAgdTggcG9ydCwgaW50IHBvcnRfbW9kaWZ5X21hc2ssCi0JCQkgICAgc3RydWN0IGliX3BvcnRfbW9kaWZ5ICpwcm9wcykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQogc3RhdGljIHN0cnVjdCBpYl9haCAqaXdjaF9haF9jcmVhdGUoc3RydWN0IGliX3BkICpwZCwKIAkJCQkgICAgc3RydWN0IGliX2FoX2F0dHIgKmFoX2F0dHIpCiB7CkBAIC0xMzkyLDcgKzEzODUsNiBAQAogCWRldi0+aWJkZXYuZG1hX2RldmljZSA9ICYoZGV2LT5yZGV2LnJuaWNfaW5mby5wZGV2LT5kZXYpOwogCWRldi0+aWJkZXYucXVlcnlfZGV2aWNlID0gaXdjaF9xdWVyeV9kZXZpY2U7CiAJZGV2LT5pYmRldi5xdWVyeV9wb3J0ID0gaXdjaF9xdWVyeV9wb3J0OwotCWRldi0+aWJkZXYubW9kaWZ5X3BvcnQgPSBpd2NoX21vZGlmeV9wb3J0OwogCWRldi0+aWJkZXYucXVlcnlfcGtleSA9IGl3Y2hfcXVlcnlfcGtleTsKIAlkZXYtPmliZGV2LnF1ZXJ5X2dpZCA9IGl3Y2hfcXVlcnlfZ2lkOwogCWRldi0+aWJkZXYuYWxsb2NfdWNvbnRleHQgPSBpd2NoX2FsbG9jX3Vjb250ZXh0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYwppbmRleCBmNjYwY2QwLi43N2Y3NjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYwpAQCAtMTMyNSw2ICsxMzI1LDcgQEAKIAl1bnNpZ25lZCBpbnQgc3RpZCA9IEdFVF9QT1BFTl9USUQobnRvaGwocmVxLT50b3Nfc3RpZCkpOwogCXN0cnVjdCB0aWRfaW5mbyAqdCA9IGRldi0+cmRldi5sbGRpLnRpZHM7CiAJdW5zaWduZWQgaW50IGh3dGlkID0gR0VUX1RJRChyZXEpOworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKIAlzdHJ1Y3QgbDJ0X2VudHJ5ICpsMnQ7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CkBAIC0xMzU3LDExICsxMzU4LDExIEBACiAJCWdvdG8gcmVqZWN0OwogCX0KIAlkc3QgPSAmcnQtPmRzdDsKLQlpZiAoZHN0LT5uZWlnaGJvdXItPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spIHsKKwluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCk7CisJaWYgKG5laWdoLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSB7CiAJCXBkZXYgPSBpcF9kZXZfZmluZCgmaW5pdF9uZXQsIHBlZXJfaXApOwogCQlCVUdfT04oIXBkZXYpOwotCQlsMnQgPSBjeGdiNF9sMnRfZ2V0KGRldi0+cmRldi5sbGRpLmwydCwgZHN0LT5uZWlnaGJvdXIsCi0JCQkJICAgIHBkZXYsIDApOworCQlsMnQgPSBjeGdiNF9sMnRfZ2V0KGRldi0+cmRldi5sbGRpLmwydCwgbmVpZ2gsIHBkZXYsIDApOwogCQltdHUgPSBwZGV2LT5tdHU7CiAJCXR4X2NoYW4gPSBjeGdiNF9wb3J0X2NoYW4ocGRldik7CiAJCXNtYWNfaWR4ID0gKGN4Z2I0X3BvcnRfdmlpZChwZGV2KSAmIDB4N0YpIDw8IDE7CkBAIC0xMzcyLDE3ICsxMzczLDE2IEBACiAJCXJzc19xaWQgPSBkZXYtPnJkZXYubGxkaS5yeHFfaWRzW2N4Z2I0X3BvcnRfaWR4KHBkZXYpICogc3RlcF07CiAJCWRldl9wdXQocGRldik7CiAJfSBlbHNlIHsKLQkJbDJ0ID0gY3hnYjRfbDJ0X2dldChkZXYtPnJkZXYubGxkaS5sMnQsIGRzdC0+bmVpZ2hib3VyLAotCQkJCQlkc3QtPm5laWdoYm91ci0+ZGV2LCAwKTsKKwkJbDJ0ID0gY3hnYjRfbDJ0X2dldChkZXYtPnJkZXYubGxkaS5sMnQsIG5laWdoLCBuZWlnaC0+ZGV2LCAwKTsKIAkJbXR1ID0gZHN0X210dShkc3QpOwotCQl0eF9jaGFuID0gY3hnYjRfcG9ydF9jaGFuKGRzdC0+bmVpZ2hib3VyLT5kZXYpOwotCQlzbWFjX2lkeCA9IChjeGdiNF9wb3J0X3ZpaWQoZHN0LT5uZWlnaGJvdXItPmRldikgJiAweDdGKSA8PCAxOworCQl0eF9jaGFuID0gY3hnYjRfcG9ydF9jaGFuKG5laWdoLT5kZXYpOworCQlzbWFjX2lkeCA9IChjeGdiNF9wb3J0X3ZpaWQobmVpZ2gtPmRldikgJiAweDdGKSA8PCAxOwogCQlzdGVwID0gZGV2LT5yZGV2LmxsZGkubnR4cSAvIGRldi0+cmRldi5sbGRpLm5jaGFuOwotCQl0eHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgoZHN0LT5uZWlnaGJvdXItPmRldikgKiBzdGVwOwotCQljdHJscV9pZHggPSBjeGdiNF9wb3J0X2lkeChkc3QtPm5laWdoYm91ci0+ZGV2KTsKKwkJdHhxX2lkeCA9IGN4Z2I0X3BvcnRfaWR4KG5laWdoLT5kZXYpICogc3RlcDsKKwkJY3RybHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgobmVpZ2gtPmRldik7CiAJCXN0ZXAgPSBkZXYtPnJkZXYubGxkaS5ucnhxIC8gZGV2LT5yZGV2LmxsZGkubmNoYW47CiAJCXJzc19xaWQgPSBkZXYtPnJkZXYubGxkaS5yeHFfaWRzWwotCQkJICBjeGdiNF9wb3J0X2lkeChkc3QtPm5laWdoYm91ci0+ZGV2KSAqIHN0ZXBdOworCQkJICBjeGdiNF9wb3J0X2lkeChuZWlnaC0+ZGV2KSAqIHN0ZXBdOwogCX0KIAlpZiAoIWwydCkgewogCQlwcmludGsoS0VSTl9FUlIgTU9EICIlcyAtIGZhaWxlZCB0byBhbGxvY2F0ZSBsMnQgZW50cnkhXG4iLApAQCAtMTQ2Myw5ICsxNDYzLDkgQEAKIAlzdHJ1Y3QgYzRpd19xcF9hdHRyaWJ1dGVzIGF0dHJzOwogCWludCBkaXNjb25uZWN0ID0gMTsKIAlpbnQgcmVsZWFzZSA9IDA7Ci0JaW50IGFib3J0ID0gMDsKIAlzdHJ1Y3QgdGlkX2luZm8gKnQgPSBkZXYtPnJkZXYubGxkaS50aWRzOwogCXVuc2lnbmVkIGludCB0aWQgPSBHRVRfVElEKGhkcik7CisJaW50IHJldDsKIAogCWVwID0gbG9va3VwX3RpZCh0LCB0aWQpOwogCVBEQkcoIiVzIGVwICVwIHRpZCAldVxuIiwgX19mdW5jX18sIGVwLCBlcC0+aHd0aWQpOwpAQCAtMTUwMSwxMCArMTUwMSwxMiBAQAogCQlzdGFydF9lcF90aW1lcihlcCk7CiAJCV9fc3RhdGVfc2V0KCZlcC0+Y29tLCBDTE9TSU5HKTsKIAkJYXR0cnMubmV4dF9zdGF0ZSA9IEM0SVdfUVBfU1RBVEVfQ0xPU0lORzsKLQkJYWJvcnQgPSBjNGl3X21vZGlmeV9xcChlcC0+Y29tLnFwLT5yaHAsIGVwLT5jb20ucXAsCisJCXJldCA9IGM0aXdfbW9kaWZ5X3FwKGVwLT5jb20ucXAtPnJocCwgZXAtPmNvbS5xcCwKIAkJCQkgICAgICAgQzRJV19RUF9BVFRSX05FWFRfU1RBVEUsICZhdHRycywgMSk7Ci0JCXBlZXJfY2xvc2VfdXBjYWxsKGVwKTsKLQkJZGlzY29ubmVjdCA9IDE7CisJCWlmIChyZXQgIT0gLUVDT05OUkVTRVQpIHsKKwkJCXBlZXJfY2xvc2VfdXBjYWxsKGVwKTsKKwkJCWRpc2Nvbm5lY3QgPSAxOworCQl9CiAJCWJyZWFrOwogCWNhc2UgQUJPUlRJTkc6CiAJCWRpc2Nvbm5lY3QgPSAwOwpAQCAtMTg0NSw2ICsxODQ3LDcgQEAKIAlzdHJ1Y3QgYzRpd19lcCAqZXA7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBkZXY7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CiAJaW50IHN0ZXA7CiAKIAlpZiAoKGNvbm5fcGFyYW0tPm9yZCA+IGM0aXdfbWF4X3JlYWRfZGVwdGgpIHx8CkBAIC0xOTA2LDE0ICsxOTA5LDE1IEBACiAJfQogCWVwLT5kc3QgPSAmcnQtPmRzdDsKIAorCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoZXAtPmRzdCk7CisKIAkvKiBnZXQgYSBsMnQgZW50cnkgKi8KLQlpZiAoZXAtPmRzdC0+bmVpZ2hib3VyLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSB7CisJaWYgKG5laWdoLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSB7CiAJCVBEQkcoIiVzIExPT1BCQUNLXG4iLCBfX2Z1bmNfXyk7CiAJCXBkZXYgPSBpcF9kZXZfZmluZCgmaW5pdF9uZXQsCiAJCQkJICAgY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkcik7CiAJCWVwLT5sMnQgPSBjeGdiNF9sMnRfZ2V0KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubDJ0LAotCQkJCQllcC0+ZHN0LT5uZWlnaGJvdXIsCi0JCQkJCXBkZXYsIDApOworCQkJCQluZWlnaCwgcGRldiwgMCk7CiAJCWVwLT5tdHUgPSBwZGV2LT5tdHU7CiAJCWVwLT50eF9jaGFuID0gY3hnYjRfcG9ydF9jaGFuKHBkZXYpOwogCQllcC0+c21hY19pZHggPSAoY3hnYjRfcG9ydF92aWlkKHBkZXYpICYgMHg3RikgPDwgMTsKQEAgLTE5MjgsMjAgKzE5MzIsMTggQEAKIAkJZGV2X3B1dChwZGV2KTsKIAl9IGVsc2UgewogCQllcC0+bDJ0ID0gY3hnYjRfbDJ0X2dldChlcC0+Y29tLmRldi0+cmRldi5sbGRpLmwydCwKLQkJCQkJZXAtPmRzdC0+bmVpZ2hib3VyLAotCQkJCQllcC0+ZHN0LT5uZWlnaGJvdXItPmRldiwgMCk7CisJCQkJCW5laWdoLCBuZWlnaC0+ZGV2LCAwKTsKIAkJZXAtPm10dSA9IGRzdF9tdHUoZXAtPmRzdCk7Ci0JCWVwLT50eF9jaGFuID0gY3hnYjRfcG9ydF9jaGFuKGVwLT5kc3QtPm5laWdoYm91ci0+ZGV2KTsKLQkJZXAtPnNtYWNfaWR4ID0gKGN4Z2I0X3BvcnRfdmlpZChlcC0+ZHN0LT5uZWlnaGJvdXItPmRldikgJgotCQkJCTB4N0YpIDw8IDE7CisJCWVwLT50eF9jaGFuID0gY3hnYjRfcG9ydF9jaGFuKG5laWdoLT5kZXYpOworCQllcC0+c21hY19pZHggPSAoY3hnYjRfcG9ydF92aWlkKG5laWdoLT5kZXYpICYgMHg3RikgPDwgMTsKIAkJc3RlcCA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubnR4cSAvCiAJCSAgICAgICBlcC0+Y29tLmRldi0+cmRldi5sbGRpLm5jaGFuOwotCQllcC0+dHhxX2lkeCA9IGN4Z2I0X3BvcnRfaWR4KGVwLT5kc3QtPm5laWdoYm91ci0+ZGV2KSAqIHN0ZXA7Ci0JCWVwLT5jdHJscV9pZHggPSBjeGdiNF9wb3J0X2lkeChlcC0+ZHN0LT5uZWlnaGJvdXItPmRldik7CisJCWVwLT50eHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgobmVpZ2gtPmRldikgKiBzdGVwOworCQllcC0+Y3RybHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgobmVpZ2gtPmRldik7CiAJCXN0ZXAgPSBlcC0+Y29tLmRldi0+cmRldi5sbGRpLm5yeHEgLwogCQkgICAgICAgZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5uY2hhbjsKIAkJZXAtPnJzc19xaWQgPSBlcC0+Y29tLmRldi0+cmRldi5sbGRpLnJ4cV9pZHNbCi0JCQkgICAgICBjeGdiNF9wb3J0X2lkeChlcC0+ZHN0LT5uZWlnaGJvdXItPmRldikgKiBzdGVwXTsKKwkJCSAgICAgIGN4Z2I0X3BvcnRfaWR4KG5laWdoLT5kZXYpICogc3RlcF07CiAJfQogCWlmICghZXAtPmwydCkgewogCQlwcmludGsoS0VSTl9FUlIgTU9EICIlcyAtIGNhbm5vdCBhbGxvYyBsMmUuXG4iLCBfX2Z1bmNfXyk7CkBAIC0yMTA5LDE1ICsyMTExLDE2IEBACiAJCWJyZWFrOwogCX0KIAotCW11dGV4X3VubG9jaygmZXAtPmNvbS5tdXRleCk7CiAJaWYgKGNsb3NlKSB7Ci0JCWlmIChhYnJ1cHQpCi0JCQlyZXQgPSBhYm9ydF9jb25uZWN0aW9uKGVwLCBOVUxMLCBnZnApOwotCQllbHNlCisJCWlmIChhYnJ1cHQpIHsKKwkJCWNsb3NlX2NvbXBsZXRlX3VwY2FsbChlcCk7CisJCQlyZXQgPSBzZW5kX2Fib3J0KGVwLCBOVUxMLCBnZnApOworCQl9IGVsc2UKIAkJCXJldCA9IHNlbmRfaGFsZmNsb3NlKGVwLCBnZnApOwogCQlpZiAocmV0KQogCQkJZmF0YWwgPSAxOwogCX0KKwltdXRleF91bmxvY2soJmVwLT5jb20ubXV0ZXgpOwogCWlmIChmYXRhbCkKIAkJcmVsZWFzZV9lcF9yZXNvdXJjZXMoZXApOwogCXJldHVybiByZXQ7CkBAIC0yMzAxLDYgKzIzMDQsMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwZWVyX2Fib3J0X2ludHIoc3RydWN0IGM0aXdfZGV2ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNwbF9hYm9ydF9yZXFfcnNzICpyZXEgPSBjcGxoZHIoc2tiKTsKKwlzdHJ1Y3QgYzRpd19lcCAqZXA7CisJc3RydWN0IHRpZF9pbmZvICp0ID0gZGV2LT5yZGV2LmxsZGkudGlkczsKKwl1bnNpZ25lZCBpbnQgdGlkID0gR0VUX1RJRChyZXEpOworCisJZXAgPSBsb29rdXBfdGlkKHQsIHRpZCk7CisJaWYgKGlzX25lZ19hZHZfYWJvcnQocmVxLT5zdGF0dXMpKSB7CisJCVBEQkcoIiVzIG5lZ19hZHZfYWJvcnQgZXAgJXAgdGlkICV1XG4iLCBfX2Z1bmNfXywgZXAsCisJCSAgICAgZXAtPmh3dGlkKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKwlQREJHKCIlcyBlcCAlcCB0aWQgJXUgc3RhdGUgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkLAorCSAgICAgZXAtPmNvbS5zdGF0ZSk7CisKKwkvKgorCSAqIFdha2UgdXAgYW55IHRocmVhZHMgaW4gcmRtYV9pbml0KCkgb3IgcmRtYV9maW5pKCkuCisJICovCisJYzRpd193YWtlX3VwKCZlcC0+Y29tLndyX3dhaXQsIC1FQ09OTlJFU0VUKTsKKwlzY2hlZChkZXYsIHNrYik7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBNb3N0IHVwY2FsbHMgZnJvbSB0aGUgVDQgQ29yZSBnbyB0byBzY2hlZCgpIHRvCiAgKiBzY2hlZHVsZSB0aGUgcHJvY2Vzc2luZyBvbiBhIHdvcmsgcXVldWUuCkBAIC0yMzE3LDcgKzIzNDUsNyBAQAogCVtDUExfUEFTU19FU1RBQkxJU0hdID0gc2NoZWQsCiAJW0NQTF9QRUVSX0NMT1NFXSA9IHNjaGVkLAogCVtDUExfQ0xPU0VfQ09OX1JQTF0gPSBzY2hlZCwKLQlbQ1BMX0FCT1JUX1JFUV9SU1NdID0gc2NoZWQsCisJW0NQTF9BQk9SVF9SRVFfUlNTXSA9IHBlZXJfYWJvcnRfaW50ciwKIAlbQ1BMX1JETUFfVEVSTUlOQVRFXSA9IHNjaGVkLAogCVtDUExfRlc0X0FDS10gPSBzY2hlZCwKIAlbQ1BMX1NFVF9UQ0JfUlBMXSA9IHNldF90Y2JfcnBsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYwppbmRleCA4ZDhmOGFkLi4xNzIwZGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYwpAQCAtODAxLDYgKzgwMSwxMCBAQAogCWlmICh1Y29udGV4dCkgewogCQltZW1zaXplID0gcm91bmR1cChtZW1zaXplLCBQQUdFX1NJWkUpOwogCQlod2VudHJpZXMgPSBtZW1zaXplIC8gc2l6ZW9mICpjaHAtPmNxLnF1ZXVlOworCQl3aGlsZSAoaHdlbnRyaWVzID4gVDRfTUFYX0lRX1NJWkUpIHsKKwkJCW1lbXNpemUgLT0gUEFHRV9TSVpFOworCQkJaHdlbnRyaWVzID0gbWVtc2l6ZSAvIHNpemVvZiAqY2hwLT5jcS5xdWV1ZTsKKwkJfQogCX0KIAljaHAtPmNxLnNpemUgPSBod2VudHJpZXM7CiAJY2hwLT5jcS5tZW1zaXplID0gbWVtc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9tZW0uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9tZW0uYwppbmRleCAyNzNmZmU0Li4wMzQ3ZWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvbWVtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L21lbS5jCkBAIC02MjUsNyArNjI1LDcgQEAKIAltaHAtPmF0dHIucGVybXMgPSBjNGl3X2liX3RvX3RwdF9hY2Nlc3MoYWNjKTsKIAltaHAtPmF0dHIudmFfZmJvID0gdmlydDsKIAltaHAtPmF0dHIucGFnZV9zaXplID0gc2hpZnQgLSAxMjsKLQltaHAtPmF0dHIubGVuID0gKHUzMikgbGVuZ3RoOworCW1ocC0+YXR0ci5sZW4gPSBsZW5ndGg7CiAKIAllcnIgPSByZWdpc3Rlcl9tZW0ocmhwLCBwaHAsIG1ocCwgc2hpZnQpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9wcm92aWRlci5jCmluZGV4IDViOWU0MjIuLjI0N2ZlNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9wcm92aWRlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9wcm92aWRlci5jCkBAIC01OCwxMyArNTgsNiBAQAogbW9kdWxlX3BhcmFtKGZhc3RyZWdfc3VwcG9ydCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZmFzdHJlZ19zdXBwb3J0LCAiQWR2ZXJ0aXNlIGZhc3RyZWcgc3VwcG9ydCAoZGVmYXVsdD0xKSIpOwogCi1zdGF0aWMgaW50IGM0aXdfbW9kaWZ5X3BvcnQoc3RydWN0IGliX2RldmljZSAqaWJkZXYsCi0JCQkgICAgdTggcG9ydCwgaW50IHBvcnRfbW9kaWZ5X21hc2ssCi0JCQkgICAgc3RydWN0IGliX3BvcnRfbW9kaWZ5ICpwcm9wcykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQogc3RhdGljIHN0cnVjdCBpYl9haCAqYzRpd19haF9jcmVhdGUoc3RydWN0IGliX3BkICpwZCwKIAkJCQkgICAgc3RydWN0IGliX2FoX2F0dHIgKmFoX2F0dHIpCiB7CkBAIC00NTYsNyArNDQ5LDYgQEAKIAlkZXYtPmliZGV2LmRtYV9kZXZpY2UgPSAmKGRldi0+cmRldi5sbGRpLnBkZXYtPmRldik7CiAJZGV2LT5pYmRldi5xdWVyeV9kZXZpY2UgPSBjNGl3X3F1ZXJ5X2RldmljZTsKIAlkZXYtPmliZGV2LnF1ZXJ5X3BvcnQgPSBjNGl3X3F1ZXJ5X3BvcnQ7Ci0JZGV2LT5pYmRldi5tb2RpZnlfcG9ydCA9IGM0aXdfbW9kaWZ5X3BvcnQ7CiAJZGV2LT5pYmRldi5xdWVyeV9wa2V5ID0gYzRpd19xdWVyeV9wa2V5OwogCWRldi0+aWJkZXYucXVlcnlfZ2lkID0gYzRpd19xdWVyeV9naWQ7CiAJZGV2LT5pYmRldi5hbGxvY191Y29udGV4dCA9IGM0aXdfYWxsb2NfdWNvbnRleHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCmluZGV4IDNiNzczYjAuLmE0MTU3OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCkBAIC0xMjA3LDExICsxMjA3LDggQEAKIAkJCQljNGl3X2dldF9lcCgmcWhwLT5lcC0+Y29tKTsKIAkJCX0KIAkJCXJldCA9IHJkbWFfZmluaShyaHAsIHFocCwgZXApOwotCQkJaWYgKHJldCkgewotCQkJCWlmIChpbnRlcm5hbCkKLQkJCQkJYzRpd19nZXRfZXAoJnFocC0+ZXAtPmNvbSk7CisJCQlpZiAocmV0KQogCQkJCWdvdG8gZXJyOwotCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgQzRJV19RUF9TVEFURV9URVJNSU5BVEU6CiAJCQlzZXRfc3RhdGUocWhwLCBDNElXX1FQX1NUQVRFX1RFUk1JTkFURSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcmVzb3VyY2UuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9yZXNvdXJjZS5jCmluZGV4IDRmYjUwZDUuLjQwN2ZmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9yZXNvdXJjZS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9yZXNvdXJjZS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2dlbmFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaW5jbHVkZSAiaXdfY3hnYjQuaCIKIAogI2RlZmluZSBSQU5ET01fU0laRSAxNgpAQCAtMzExLDggKzMxMiw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2VuX3Bvb2xfYWxsb2MocmRldi0+cGJsX3Bvb2wsIHNpemUpOwogCVBEQkcoIiVzIGFkZHIgMHgleCBzaXplICVkXG4iLCBfX2Z1bmNfXywgKHUzMilhZGRyLCBzaXplKTsKLQlpZiAoIWFkZHIgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HIE1PRCAiJXM6IE91dCBvZiBQQkwgbWVtb3J5XG4iLAorCWlmICghYWRkcikKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fV0FSTklORyBNT0QgIiVzOiBPdXQgb2YgUEJMIG1lbW9yeVxuIiwKIAkJICAgICAgIHBjaV9uYW1lKHJkZXYtPmxsZGkucGRldikpOwogCXJldHVybiAodTMyKWFkZHI7CiB9CkBAIC0zNzMsOCArMzc0LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZW5fcG9vbF9hbGxvYyhyZGV2LT5ycXRfcG9vbCwgc2l6ZSA8PCA2KTsKIAlQREJHKCIlcyBhZGRyIDB4JXggc2l6ZSAlZFxuIiwgX19mdW5jX18sICh1MzIpYWRkciwgc2l6ZSA8PCA2KTsKLQlpZiAoIWFkZHIgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HIE1PRCAiJXM6IE91dCBvZiBSUVQgbWVtb3J5XG4iLAorCWlmICghYWRkcikKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fV0FSTklORyBNT0QgIiVzOiBPdXQgb2YgUlFUIG1lbW9yeVxuIiwKIAkJICAgICAgIHBjaV9uYW1lKHJkZXYtPmxsZGkucGRldikpOwogCXJldHVybiAodTMyKWFkZHI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCmluZGV4IGVlNzlhMmQuLjg2OTdlY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKICNpbmNsdWRlICJpcGF0aF9rZXJuZWwuaCIKQEAgLTE2ODQsMTcgKzE2ODUsMTkgQEAKIAkgKiBpbmZvcm1hdGlvbi4gIFRoZXJlIG1heSBiZSBzb21lIGlzc3VlcyB3aXRoIGR1YWwgY29yZSBudW1iZXJpbmcKIAkgKiBhcyB3ZWxsLiAgVGhpcyBuZWVkcyBtb3JlIHdvcmsgcHJpb3IgdG8gcmVsZWFzZS4KIAkgKi8KLQlpZiAoIWNwdW1hc2tfZW1wdHkoJmN1cnJlbnQtPmNwdXNfYWxsb3dlZCkgJiYKLQkgICAgIWNwdW1hc2tfZnVsbCgmY3VycmVudC0+Y3B1c19hbGxvd2VkKSkgeworCWlmICghY3B1bWFza19lbXB0eSh0c2tfY3B1c19hbGxvd2VkKGN1cnJlbnQpKSAmJgorCSAgICAhY3B1bWFza19mdWxsKHRza19jcHVzX2FsbG93ZWQoY3VycmVudCkpKSB7CiAJCWludCBuY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpLCBjdXJjcHUgPSAtMSwgbnNldCA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBuY3B1czsgaSsrKQotCQkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoaSwgJmN1cnJlbnQtPmNwdXNfYWxsb3dlZCkpIHsKKwkJZ2V0X29ubGluZV9jcHVzKCk7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKKwkJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGksIHRza19jcHVzX2FsbG93ZWQoY3VycmVudCkpKSB7CiAJCQkJaXBhdGhfY2RiZyhQUk9DLCAiJXNbJXVdIGFmZmluaXR5IHNldCBmb3IgIgogCQkJCQkgICAiY3B1ICVkLyVkXG4iLCBjdXJyZW50LT5jb21tLAogCQkJCQkgICBjdXJyZW50LT5waWQsIGksIG5jcHVzKTsKIAkJCQljdXJjcHUgPSBpOwogCQkJCW5zZXQrKzsKIAkJCX0KKwkJcHV0X29ubGluZV9jcHVzKCk7CiAJCWlmIChjdXJjcHUgIT0gLTEgJiYgbnNldCAhPSBuY3B1cykgewogCQkJaWYgKG5wcmVzZW50KSB7CiAJCQkJcHJlZnVuaXQgPSBjdXJjcHUgLyAobmNwdXMgLyBucHJlc2VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfbWFkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfbWFkLmMKaW5kZXggY2ViOThlZS4uNDNmMmQwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9tYWQuYwpAQCAtMzIsNiArMzIsNyBAQAogICovCiAKICNpbmNsdWRlIDxyZG1hL2liX3NtaS5oPgorI2luY2x1ZGUgPHJkbWEvaWJfcG1hLmg+CiAKICNpbmNsdWRlICJpcGF0aF9rZXJuZWwuaCIKICNpbmNsdWRlICJpcGF0aF92ZXJicy5oIgpAQCAtNzg5LDE1MSArNzkwLDE4IEBACiAJcmV0dXJuIHJlY3Zfc3Vibl9nZXRfcGtleXRhYmxlKHNtcCwgaWJkZXYpOwogfQogCi0jZGVmaW5lIElCX1BNQV9DTEFTU19QT1JUX0lORk8JCWNwdV90b19iZTE2KDB4MDAwMSkKLSNkZWZpbmUgSUJfUE1BX1BPUlRfU0FNUExFU19DT05UUk9MCWNwdV90b19iZTE2KDB4MDAxMCkKLSNkZWZpbmUgSUJfUE1BX1BPUlRfU0FNUExFU19SRVNVTFQJY3B1X3RvX2JlMTYoMHgwMDExKQotI2RlZmluZSBJQl9QTUFfUE9SVF9DT1VOVEVSUwkJY3B1X3RvX2JlMTYoMHgwMDEyKQotI2RlZmluZSBJQl9QTUFfUE9SVF9DT1VOVEVSU19FWFQJY3B1X3RvX2JlMTYoMHgwMDFEKQotI2RlZmluZSBJQl9QTUFfUE9SVF9TQU1QTEVTX1JFU1VMVF9FWFQJY3B1X3RvX2JlMTYoMHgwMDFFKQotCi1zdHJ1Y3QgaWJfcGVyZiB7Ci0JdTggYmFzZV92ZXJzaW9uOwotCXU4IG1nbXRfY2xhc3M7Ci0JdTggY2xhc3NfdmVyc2lvbjsKLQl1OCBtZXRob2Q7Ci0JX19iZTE2IHN0YXR1czsKLQlfX2JlMTYgdW51c2VkOwotCV9fYmU2NCB0aWQ7Ci0JX19iZTE2IGF0dHJfaWQ7Ci0JX19iZTE2IHJlc3Y7Ci0JX19iZTMyIGF0dHJfbW9kOwotCXU4IHJlc2VydmVkWzQwXTsKLQl1OCBkYXRhWzE5Ml07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGliX3BtYV9jbGFzc3BvcnRpbmZvIHsKLQl1OCBiYXNlX3ZlcnNpb247Ci0JdTggY2xhc3NfdmVyc2lvbjsKLQlfX2JlMTYgY2FwX21hc2s7Ci0JdTggcmVzZXJ2ZWRbM107Ci0JdTggcmVzcF90aW1lX3ZhbHVlOwkvKiBvbmx5IGxvd2VyIDUgYml0cyAqLwotCXVuaW9uIGliX2dpZCByZWRpcmVjdF9naWQ7Ci0JX19iZTMyIHJlZGlyZWN0X3RjX3NsX2ZsOwkvKiA4LCA0LCAyMCBiaXRzIHJlc3BlY3RpdmVseSAqLwotCV9fYmUxNiByZWRpcmVjdF9saWQ7Ci0JX19iZTE2IHJlZGlyZWN0X3BrZXk7Ci0JX19iZTMyIHJlZGlyZWN0X3FwOwkvKiBvbmx5IGxvd2VyIDI0IGJpdHMgKi8KLQlfX2JlMzIgcmVkaXJlY3RfcWtleTsKLQl1bmlvbiBpYl9naWQgdHJhcF9naWQ7Ci0JX19iZTMyIHRyYXBfdGNfc2xfZmw7CS8qIDgsIDQsIDIwIGJpdHMgcmVzcGVjdGl2ZWx5ICovCi0JX19iZTE2IHRyYXBfbGlkOwotCV9fYmUxNiB0cmFwX3BrZXk7Ci0JX19iZTMyIHRyYXBfaGxfcXA7CS8qIDgsIDI0IGJpdHMgcmVzcGVjdGl2ZWx5ICovCi0JX19iZTMyIHRyYXBfcWtleTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWJfcG1hX3BvcnRzYW1wbGVzY29udHJvbCB7Ci0JdTggb3Bjb2RlOwotCXU4IHBvcnRfc2VsZWN0OwotCXU4IHRpY2s7Ci0JdTggY291bnRlcl93aWR0aDsJLyogb25seSBsb3dlciAzIGJpdHMgKi8KLQlfX2JlMzIgY291bnRlcl9tYXNrMF85OwkvKiAyLCAxMCAqIDMsIGJpdHMgKi8KLQlfX2JlMTYgY291bnRlcl9tYXNrMTBfMTQ7CS8qIDEsIDUgKiAzLCBiaXRzICovCi0JdTggc2FtcGxlX21lY2hhbmlzbXM7Ci0JdTggc2FtcGxlX3N0YXR1czsJLyogb25seSBsb3dlciAyIGJpdHMgKi8KLQlfX2JlNjQgb3B0aW9uX21hc2s7Ci0JX19iZTY0IHZlbmRvcl9tYXNrOwotCV9fYmUzMiBzYW1wbGVfc3RhcnQ7Ci0JX19iZTMyIHNhbXBsZV9pbnRlcnZhbDsKLQlfX2JlMTYgdGFnOwotCV9fYmUxNiBjb3VudGVyX3NlbGVjdFsxNV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGliX3BtYV9wb3J0c2FtcGxlc3Jlc3VsdCB7Ci0JX19iZTE2IHRhZzsKLQlfX2JlMTYgc2FtcGxlX3N0YXR1czsJLyogb25seSBsb3dlciAyIGJpdHMgKi8KLQlfX2JlMzIgY291bnRlclsxNV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGliX3BtYV9wb3J0c2FtcGxlc3Jlc3VsdF9leHQgewotCV9fYmUxNiB0YWc7Ci0JX19iZTE2IHNhbXBsZV9zdGF0dXM7CS8qIG9ubHkgbG93ZXIgMiBiaXRzICovCi0JX19iZTMyIGV4dGVuZGVkX3dpZHRoOwkvKiBvbmx5IHVwcGVyIDIgYml0cyAqLwotCV9fYmU2NCBjb3VudGVyWzE1XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWJfcG1hX3BvcnRjb3VudGVycyB7Ci0JdTggcmVzZXJ2ZWQ7Ci0JdTggcG9ydF9zZWxlY3Q7Ci0JX19iZTE2IGNvdW50ZXJfc2VsZWN0OwotCV9fYmUxNiBzeW1ib2xfZXJyb3JfY291bnRlcjsKLQl1OCBsaW5rX2Vycm9yX3JlY292ZXJ5X2NvdW50ZXI7Ci0JdTggbGlua19kb3duZWRfY291bnRlcjsKLQlfX2JlMTYgcG9ydF9yY3ZfZXJyb3JzOwotCV9fYmUxNiBwb3J0X3Jjdl9yZW1waHlzX2Vycm9yczsKLQlfX2JlMTYgcG9ydF9yY3Zfc3dpdGNoX3JlbGF5X2Vycm9yczsKLQlfX2JlMTYgcG9ydF94bWl0X2Rpc2NhcmRzOwotCXU4IHBvcnRfeG1pdF9jb25zdHJhaW50X2Vycm9yczsKLQl1OCBwb3J0X3Jjdl9jb25zdHJhaW50X2Vycm9yczsKLQl1OCByZXNlcnZlZDE7Ci0JdTggbGxpX2Vib3JfZXJyb3JzOwkvKiA0LCA0LCBiaXRzICovCi0JX19iZTE2IHJlc2VydmVkMjsKLQlfX2JlMTYgdmwxNV9kcm9wcGVkOwotCV9fYmUzMiBwb3J0X3htaXRfZGF0YTsKLQlfX2JlMzIgcG9ydF9yY3ZfZGF0YTsKLQlfX2JlMzIgcG9ydF94bWl0X3BhY2tldHM7Ci0JX19iZTMyIHBvcnRfcmN2X3BhY2tldHM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotI2RlZmluZSBJQl9QTUFfU0VMX1NZTUJPTF9FUlJPUgkJCWNwdV90b19iZTE2KDB4MDAwMSkKLSNkZWZpbmUgSUJfUE1BX1NFTF9MSU5LX0VSUk9SX1JFQ09WRVJZCQljcHVfdG9fYmUxNigweDAwMDIpCi0jZGVmaW5lIElCX1BNQV9TRUxfTElOS19ET1dORUQJCQljcHVfdG9fYmUxNigweDAwMDQpCi0jZGVmaW5lIElCX1BNQV9TRUxfUE9SVF9SQ1ZfRVJST1JTCQljcHVfdG9fYmUxNigweDAwMDgpCi0jZGVmaW5lIElCX1BNQV9TRUxfUE9SVF9SQ1ZfUkVNUEhZU19FUlJPUlMJY3B1X3RvX2JlMTYoMHgwMDEwKQotI2RlZmluZSBJQl9QTUFfU0VMX1BPUlRfWE1JVF9ESVNDQVJEUwkJY3B1X3RvX2JlMTYoMHgwMDQwKQotI2RlZmluZSBJQl9QTUFfU0VMX0xPQ0FMX0xJTktfSU5URUdSSVRZX0VSUk9SUwljcHVfdG9fYmUxNigweDAyMDApCi0jZGVmaW5lIElCX1BNQV9TRUxfRVhDRVNTSVZFX0JVRkZFUl9PVkVSUlVOUwljcHVfdG9fYmUxNigweDA0MDApCi0jZGVmaW5lIElCX1BNQV9TRUxfUE9SVF9WTDE1X0RST1BQRUQJCWNwdV90b19iZTE2KDB4MDgwMCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1hNSVRfREFUQQkJY3B1X3RvX2JlMTYoMHgxMDAwKQotI2RlZmluZSBJQl9QTUFfU0VMX1BPUlRfUkNWX0RBVEEJCWNwdV90b19iZTE2KDB4MjAwMCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1hNSVRfUEFDS0VUUwkJY3B1X3RvX2JlMTYoMHg0MDAwKQotI2RlZmluZSBJQl9QTUFfU0VMX1BPUlRfUkNWX1BBQ0tFVFMJCWNwdV90b19iZTE2KDB4ODAwMCkKLQotc3RydWN0IGliX3BtYV9wb3J0Y291bnRlcnNfZXh0IHsKLQl1OCByZXNlcnZlZDsKLQl1OCBwb3J0X3NlbGVjdDsKLQlfX2JlMTYgY291bnRlcl9zZWxlY3Q7Ci0JX19iZTMyIHJlc2VydmVkMTsKLQlfX2JlNjQgcG9ydF94bWl0X2RhdGE7Ci0JX19iZTY0IHBvcnRfcmN2X2RhdGE7Ci0JX19iZTY0IHBvcnRfeG1pdF9wYWNrZXRzOwotCV9fYmU2NCBwb3J0X3Jjdl9wYWNrZXRzOwotCV9fYmU2NCBwb3J0X3VuaWNhc3RfeG1pdF9wYWNrZXRzOwotCV9fYmU2NCBwb3J0X3VuaWNhc3RfcmN2X3BhY2tldHM7Ci0JX19iZTY0IHBvcnRfbXVsdGljYXN0X3htaXRfcGFja2V0czsKLQlfX2JlNjQgcG9ydF9tdWx0aWNhc3RfcmN2X3BhY2tldHM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotI2RlZmluZSBJQl9QTUFfU0VMWF9QT1JUX1hNSVRfREFUQQkJY3B1X3RvX2JlMTYoMHgwMDAxKQotI2RlZmluZSBJQl9QTUFfU0VMWF9QT1JUX1JDVl9EQVRBCQljcHVfdG9fYmUxNigweDAwMDIpCi0jZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfWE1JVF9QQUNLRVRTCQljcHVfdG9fYmUxNigweDAwMDQpCi0jZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfUkNWX1BBQ0tFVFMJCWNwdV90b19iZTE2KDB4MDAwOCkKLSNkZWZpbmUgSUJfUE1BX1NFTFhfUE9SVF9VTklfWE1JVF9QQUNLRVRTCWNwdV90b19iZTE2KDB4MDAxMCkKLSNkZWZpbmUgSUJfUE1BX1NFTFhfUE9SVF9VTklfUkNWX1BBQ0tFVFMJY3B1X3RvX2JlMTYoMHgwMDIwKQotI2RlZmluZSBJQl9QTUFfU0VMWF9QT1JUX01VTFRJX1hNSVRfUEFDS0VUUwljcHVfdG9fYmUxNigweDAwNDApCi0jZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfTVVMVElfUkNWX1BBQ0tFVFMJY3B1X3RvX2JlMTYoMHgwMDgwKQotCi1zdGF0aWMgaW50IHJlY3ZfcG1hX2dldF9jbGFzc3BvcnRpbmZvKHN0cnVjdCBpYl9wZXJmICpwbXApCitzdGF0aWMgaW50IHJlY3ZfcG1hX2dldF9jbGFzc3BvcnRpbmZvKHN0cnVjdCBpYl9wbWFfbWFkICpwbXApCiB7Ci0Jc3RydWN0IGliX3BtYV9jbGFzc3BvcnRpbmZvICpwID0KLQkJKHN0cnVjdCBpYl9wbWFfY2xhc3Nwb3J0aW5mbyAqKXBtcC0+ZGF0YTsKKwlzdHJ1Y3QgaWJfY2xhc3NfcG9ydF9pbmZvICpwID0KKwkJKHN0cnVjdCBpYl9jbGFzc19wb3J0X2luZm8gKilwbXAtPmRhdGE7CiAKIAltZW1zZXQocG1wLT5kYXRhLCAwLCBzaXplb2YocG1wLT5kYXRhKSk7CiAKLQlpZiAocG1wLT5hdHRyX21vZCAhPSAwKQotCQlwbXAtPnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKKwlpZiAocG1wLT5tYWRfaGRyLmF0dHJfbW9kICE9IDApCisJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CiAKIAkvKiBJbmRpY2F0ZSBBbGxQb3J0U2VsZWN0IGlzIHZhbGlkIChvbmx5IG9uZSBwb3J0IGFueXdheSkgKi8KLQlwLT5jYXBfbWFzayA9IGNwdV90b19iZTE2KDEgPDwgOCk7CisJcC0+Y2FwYWJpbGl0eV9tYXNrID0gY3B1X3RvX2JlMTYoMSA8PCA4KTsKIAlwLT5iYXNlX3ZlcnNpb24gPSAxOwogCXAtPmNsYXNzX3ZlcnNpb24gPSAxOwogCS8qCkBAIC05NTcsNyArODI1LDcgQEAKIAkJCQkgICAgQ09VTlRFUl9NQVNLKDEsIDMpIHwgXAogCQkJCSAgICBDT1VOVEVSX01BU0soMSwgNCkpCiAKLXN0YXRpYyBpbnQgcmVjdl9wbWFfZ2V0X3BvcnRzYW1wbGVzY29udHJvbChzdHJ1Y3QgaWJfcGVyZiAqcG1wLAorc3RhdGljIGludCByZWN2X3BtYV9nZXRfcG9ydHNhbXBsZXNjb250cm9sKHN0cnVjdCBpYl9wbWFfbWFkICpwbXAsCiAJCQkJCSAgIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCB1OCBwb3J0KQogewogCXN0cnVjdCBpYl9wbWFfcG9ydHNhbXBsZXNjb250cm9sICpwID0KQEAgLTk3MCw5ICs4MzgsOSBAQAogCW1lbXNldChwbXAtPmRhdGEsIDAsIHNpemVvZihwbXAtPmRhdGEpKTsKIAogCXAtPnBvcnRfc2VsZWN0ID0gcG9ydF9zZWxlY3Q7Ci0JaWYgKHBtcC0+YXR0cl9tb2QgIT0gMCB8fAorCWlmIChwbXAtPm1hZF9oZHIuYXR0cl9tb2QgIT0gMCB8fAogCSAgICAocG9ydF9zZWxlY3QgIT0gcG9ydCAmJiBwb3J0X3NlbGVjdCAhPSAweEZGKSkKLQkJcG1wLT5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CisJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CiAJLyoKIAkgKiBUaWNrcyBhcmUgMTB4IHRoZSBsaW5rIHRyYW5zZmVyIHBlcmlvZCB3aGljaCBmb3IgMi41R2JzIGlzIDQKIAkgKiBuc2VjLiAgMCA9PSA0IG5zZWMuLCAxID09IDggbnNlYy4sIC4uLiwgMjU1ID09IDEwMjAgbnNlYy4gIFNhbXBsZQpAQCAtMTAwNiw3ICs4NzQsNyBAQAogCXJldHVybiByZXBseSgoc3RydWN0IGliX3NtcCAqKSBwbXApOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfcG1hX3NldF9wb3J0c2FtcGxlc2NvbnRyb2woc3RydWN0IGliX3BlcmYgKnBtcCwKK3N0YXRpYyBpbnQgcmVjdl9wbWFfc2V0X3BvcnRzYW1wbGVzY29udHJvbChzdHJ1Y3QgaWJfcG1hX21hZCAqcG1wLAogCQkJCQkgICBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgdTggcG9ydCkKIHsKIAlzdHJ1Y3QgaWJfcG1hX3BvcnRzYW1wbGVzY29udHJvbCAqcCA9CkBAIC0xMDE3LDkgKzg4NSw5IEBACiAJdTggc3RhdHVzOwogCWludCByZXQ7CiAKLQlpZiAocG1wLT5hdHRyX21vZCAhPSAwIHx8CisJaWYgKHBtcC0+bWFkX2hkci5hdHRyX21vZCAhPSAwIHx8CiAJICAgIChwLT5wb3J0X3NlbGVjdCAhPSBwb3J0ICYmIHAtPnBvcnRfc2VsZWN0ICE9IDB4RkYpKSB7Ci0JCXBtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOworCQlwbXAtPm1hZF9oZHIuc3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOwogCQlyZXQgPSByZXBseSgoc3RydWN0IGliX3NtcCAqKSBwbXApOwogCQlnb3RvIGJhaWw7CiAJfQpAQCAtMTA5Myw3ICs5NjEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcmVjdl9wbWFfZ2V0X3BvcnRzYW1wbGVzcmVzdWx0KHN0cnVjdCBpYl9wZXJmICpwbXAsCitzdGF0aWMgaW50IHJlY3ZfcG1hX2dldF9wb3J0c2FtcGxlc3Jlc3VsdChzdHJ1Y3QgaWJfcG1hX21hZCAqcG1wLAogCQkJCQkgIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2KQogewogCXN0cnVjdCBpYl9wbWFfcG9ydHNhbXBsZXNyZXN1bHQgKnAgPQpAQCAtMTExOCw3ICs5ODYsNyBAQAogCXJldHVybiByZXBseSgoc3RydWN0IGliX3NtcCAqKSBwbXApOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfcG1hX2dldF9wb3J0c2FtcGxlc3Jlc3VsdF9leHQoc3RydWN0IGliX3BlcmYgKnBtcCwKK3N0YXRpYyBpbnQgcmVjdl9wbWFfZ2V0X3BvcnRzYW1wbGVzcmVzdWx0X2V4dChzdHJ1Y3QgaWJfcG1hX21hZCAqcG1wLAogCQkJCQkgICAgICBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldikKIHsKIAlzdHJ1Y3QgaWJfcG1hX3BvcnRzYW1wbGVzcmVzdWx0X2V4dCAqcCA9CkBAIC0xMTQ1LDcgKzEwMTMsNyBAQAogCXJldHVybiByZXBseSgoc3RydWN0IGliX3NtcCAqKSBwbXApOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfcG1hX2dldF9wb3J0Y291bnRlcnMoc3RydWN0IGliX3BlcmYgKnBtcCwKK3N0YXRpYyBpbnQgcmVjdl9wbWFfZ2V0X3BvcnRjb3VudGVycyhzdHJ1Y3QgaWJfcG1hX21hZCAqcG1wLAogCQkJCSAgICAgc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHU4IHBvcnQpCiB7CiAJc3RydWN0IGliX3BtYV9wb3J0Y291bnRlcnMgKnAgPSAoc3RydWN0IGliX3BtYV9wb3J0Y291bnRlcnMgKikKQEAgLTExNzksOSArMTA0Nyw5IEBACiAJbWVtc2V0KHBtcC0+ZGF0YSwgMCwgc2l6ZW9mKHBtcC0+ZGF0YSkpOwogCiAJcC0+cG9ydF9zZWxlY3QgPSBwb3J0X3NlbGVjdDsKLQlpZiAocG1wLT5hdHRyX21vZCAhPSAwIHx8CisJaWYgKHBtcC0+bWFkX2hkci5hdHRyX21vZCAhPSAwIHx8CiAJICAgIChwb3J0X3NlbGVjdCAhPSBwb3J0ICYmIHBvcnRfc2VsZWN0ICE9IDB4RkYpKQotCQlwbXAtPnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKKwkJcG1wLT5tYWRfaGRyLnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKIAogCWlmIChjbnRycy5zeW1ib2xfZXJyb3JfY291bnRlciA+IDB4RkZGRlVMKQogCQlwLT5zeW1ib2xfZXJyb3JfY291bnRlciA9IGNwdV90b19iZTE2KDB4RkZGRik7CkBAIC0xMjE2LDcgKzEwODQsNyBAQAogCQljbnRycy5sb2NhbF9saW5rX2ludGVncml0eV9lcnJvcnMgPSAweEZVTDsKIAlpZiAoY250cnMuZXhjZXNzaXZlX2J1ZmZlcl9vdmVycnVuX2Vycm9ycyA+IDB4RlVMKQogCQljbnRycy5leGNlc3NpdmVfYnVmZmVyX292ZXJydW5fZXJyb3JzID0gMHhGVUw7Ci0JcC0+bGxpX2Vib3JfZXJyb3JzID0gKGNudHJzLmxvY2FsX2xpbmtfaW50ZWdyaXR5X2Vycm9ycyA8PCA0KSB8CisJcC0+bGlua19vdmVycnVuX2Vycm9ycyA9IChjbnRycy5sb2NhbF9saW5rX2ludGVncml0eV9lcnJvcnMgPDwgNCkgfAogCQljbnRycy5leGNlc3NpdmVfYnVmZmVyX292ZXJydW5fZXJyb3JzOwogCWlmIChjbnRycy52bDE1X2Ryb3BwZWQgPiAweEZGRkZVTCkKIAkJcC0+dmwxNV9kcm9wcGVkID0gY3B1X3RvX2JlMTYoMHhGRkZGKTsKQEAgLTEyNDQsNyArMTExMiw3IEBACiAJcmV0dXJuIHJlcGx5KChzdHJ1Y3QgaWJfc21wICopIHBtcCk7CiB9CiAKLXN0YXRpYyBpbnQgcmVjdl9wbWFfZ2V0X3BvcnRjb3VudGVyc19leHQoc3RydWN0IGliX3BlcmYgKnBtcCwKK3N0YXRpYyBpbnQgcmVjdl9wbWFfZ2V0X3BvcnRjb3VudGVyc19leHQoc3RydWN0IGliX3BtYV9tYWQgKnBtcCwKIAkJCQkJIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCB1OCBwb3J0KQogewogCXN0cnVjdCBpYl9wbWFfcG9ydGNvdW50ZXJzX2V4dCAqcCA9CkBAIC0xMjY1LDkgKzExMzMsOSBAQAogCW1lbXNldChwbXAtPmRhdGEsIDAsIHNpemVvZihwbXAtPmRhdGEpKTsKIAogCXAtPnBvcnRfc2VsZWN0ID0gcG9ydF9zZWxlY3Q7Ci0JaWYgKHBtcC0+YXR0cl9tb2QgIT0gMCB8fAorCWlmIChwbXAtPm1hZF9oZHIuYXR0cl9tb2QgIT0gMCB8fAogCSAgICAocG9ydF9zZWxlY3QgIT0gcG9ydCAmJiBwb3J0X3NlbGVjdCAhPSAweEZGKSkKLQkJcG1wLT5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CisJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CiAKIAlwLT5wb3J0X3htaXRfZGF0YSA9IGNwdV90b19iZTY0KHN3b3Jkcyk7CiAJcC0+cG9ydF9yY3ZfZGF0YSA9IGNwdV90b19iZTY0KHJ3b3Jkcyk7CkBAIC0xMjgxLDcgKzExNDksNyBAQAogCXJldHVybiByZXBseSgoc3RydWN0IGliX3NtcCAqKSBwbXApOwogfQogCi1zdGF0aWMgaW50IHJlY3ZfcG1hX3NldF9wb3J0Y291bnRlcnMoc3RydWN0IGliX3BlcmYgKnBtcCwKK3N0YXRpYyBpbnQgcmVjdl9wbWFfc2V0X3BvcnRjb3VudGVycyhzdHJ1Y3QgaWJfcG1hX21hZCAqcG1wLAogCQkJCSAgICAgc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHU4IHBvcnQpCiB7CiAJc3RydWN0IGliX3BtYV9wb3J0Y291bnRlcnMgKnAgPSAoc3RydWN0IGliX3BtYV9wb3J0Y291bnRlcnMgKikKQEAgLTEzNDQsNyArMTIxMiw3IEBACiAJcmV0dXJuIHJlY3ZfcG1hX2dldF9wb3J0Y291bnRlcnMocG1wLCBpYmRldiwgcG9ydCk7CiB9CiAKLXN0YXRpYyBpbnQgcmVjdl9wbWFfc2V0X3BvcnRjb3VudGVyc19leHQoc3RydWN0IGliX3BlcmYgKnBtcCwKK3N0YXRpYyBpbnQgcmVjdl9wbWFfc2V0X3BvcnRjb3VudGVyc19leHQoc3RydWN0IGliX3BtYV9tYWQgKnBtcCwKIAkJCQkJIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCB1OCBwb3J0KQogewogCXN0cnVjdCBpYl9wbWFfcG9ydGNvdW50ZXJzICpwID0gKHN0cnVjdCBpYl9wbWFfcG9ydGNvdW50ZXJzICopCkBAIC0xNTE4LDE5ICsxMzg2LDE5IEBACiAJCQlzdHJ1Y3QgaWJfbWFkICppbl9tYWQsCiAJCQlzdHJ1Y3QgaWJfbWFkICpvdXRfbWFkKQogewotCXN0cnVjdCBpYl9wZXJmICpwbXAgPSAoc3RydWN0IGliX3BlcmYgKilvdXRfbWFkOworCXN0cnVjdCBpYl9wbWFfbWFkICpwbXAgPSAoc3RydWN0IGliX3BtYV9tYWQgKilvdXRfbWFkOwogCWludCByZXQ7CiAKIAkqb3V0X21hZCA9ICppbl9tYWQ7Ci0JaWYgKHBtcC0+Y2xhc3NfdmVyc2lvbiAhPSAxKSB7Ci0JCXBtcC0+c3RhdHVzIHw9IElCX1NNUF9VTlNVUF9WRVJTSU9OOworCWlmIChwbXAtPm1hZF9oZHIuY2xhc3NfdmVyc2lvbiAhPSAxKSB7CisJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX1VOU1VQX1ZFUlNJT047CiAJCXJldCA9IHJlcGx5KChzdHJ1Y3QgaWJfc21wICopIHBtcCk7CiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzd2l0Y2ggKHBtcC0+bWV0aG9kKSB7CisJc3dpdGNoIChwbXAtPm1hZF9oZHIubWV0aG9kKSB7CiAJY2FzZSBJQl9NR01UX01FVEhPRF9HRVQ6Ci0JCXN3aXRjaCAocG1wLT5hdHRyX2lkKSB7CisJCXN3aXRjaCAocG1wLT5tYWRfaGRyLmF0dHJfaWQpIHsKIAkJY2FzZSBJQl9QTUFfQ0xBU1NfUE9SVF9JTkZPOgogCQkJcmV0ID0gcmVjdl9wbWFfZ2V0X2NsYXNzcG9ydGluZm8ocG1wKTsKIAkJCWdvdG8gYmFpbDsKQEAgLTE1NTQsMTMgKzE0MjIsMTMgQEAKIAkJCQkJCQkgICAgcG9ydF9udW0pOwogCQkJZ290byBiYWlsOwogCQlkZWZhdWx0OgotCQkJcG1wLT5zdGF0dXMgfD0gSUJfU01QX1VOU1VQX01FVEhfQVRUUjsKKwkJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX1VOU1VQX01FVEhfQVRUUjsKIAkJCXJldCA9IHJlcGx5KChzdHJ1Y3QgaWJfc21wICopIHBtcCk7CiAJCQlnb3RvIGJhaWw7CiAJCX0KIAogCWNhc2UgSUJfTUdNVF9NRVRIT0RfU0VUOgotCQlzd2l0Y2ggKHBtcC0+YXR0cl9pZCkgeworCQlzd2l0Y2ggKHBtcC0+bWFkX2hkci5hdHRyX2lkKSB7CiAJCWNhc2UgSUJfUE1BX1BPUlRfU0FNUExFU19DT05UUk9MOgogCQkJcmV0ID0gcmVjdl9wbWFfc2V0X3BvcnRzYW1wbGVzY29udHJvbChwbXAsIGliZGV2LAogCQkJCQkJCSAgICAgIHBvcnRfbnVtKTsKQEAgLTE1NzQsNyArMTQ0Miw3IEBACiAJCQkJCQkJICAgIHBvcnRfbnVtKTsKIAkJCWdvdG8gYmFpbDsKIAkJZGVmYXVsdDoKLQkJCXBtcC0+c3RhdHVzIHw9IElCX1NNUF9VTlNVUF9NRVRIX0FUVFI7CisJCQlwbXAtPm1hZF9oZHIuc3RhdHVzIHw9IElCX1NNUF9VTlNVUF9NRVRIX0FUVFI7CiAJCQlyZXQgPSByZXBseSgoc3RydWN0IGliX3NtcCAqKSBwbXApOwogCQkJZ290byBiYWlsOwogCQl9CkBAIC0xNTg4LDcgKzE0NTYsNyBAQAogCQlyZXQgPSBJQl9NQURfUkVTVUxUX1NVQ0NFU1M7CiAJCWdvdG8gYmFpbDsKIAlkZWZhdWx0OgotCQlwbXAtPnN0YXR1cyB8PSBJQl9TTVBfVU5TVVBfTUVUSE9EOworCQlwbXAtPm1hZF9oZHIuc3RhdHVzIHw9IElCX1NNUF9VTlNVUF9NRVRIT0Q7CiAJCXJldCA9IHJlcGx5KChzdHJ1Y3QgaWJfc21wICopIHBtcCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCmluZGV4IDU3ZmZhNTAuLmYzNmRhOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCkBAIC0zNSw2ICszNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2NtZC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPHJkbWEvaWJfcG1hLmg+CiAKICNpbmNsdWRlICJtbHg0X2liLmgiCiAKQEAgLTIzMiw3ICsyMzMsNyBAQAogCX0KIH0KIAotaW50IG1seDRfaWJfcHJvY2Vzc19tYWQoc3RydWN0IGliX2RldmljZSAqaWJkZXYsIGludCBtYWRfZmxhZ3MsCXU4IHBvcnRfbnVtLAorc3RhdGljIGludCBpYl9wcm9jZXNzX21hZChzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgaW50IG1hZF9mbGFncywgdTggcG9ydF9udW0sCiAJCQlzdHJ1Y3QgaWJfd2MgKmluX3djLCBzdHJ1Y3QgaWJfZ3JoICppbl9ncmgsCiAJCQlzdHJ1Y3QgaWJfbWFkICppbl9tYWQsIHN0cnVjdCBpYl9tYWQgKm91dF9tYWQpCiB7CkBAIC0zMDIsNiArMzAzLDcxIEBACiAJcmV0dXJuIElCX01BRF9SRVNVTFRfU1VDQ0VTUyB8IElCX01BRF9SRVNVTFRfUkVQTFk7CiB9CiAKK3N0YXRpYyB2b2lkIGVkaXRfY291bnRlcihzdHJ1Y3QgbWx4NF9jb3VudGVyICpjbnQsCisJCQkJCXN0cnVjdCBpYl9wbWFfcG9ydGNvdW50ZXJzICpwbWFfY250KQoreworCXBtYV9jbnQtPnBvcnRfeG1pdF9kYXRhID0gY3B1X3RvX2JlMzIoKGJlNjRfdG9fY3B1KGNudC0+dHhfYnl0ZXMpPj4yKSk7CisJcG1hX2NudC0+cG9ydF9yY3ZfZGF0YSAgPSBjcHVfdG9fYmUzMigoYmU2NF90b19jcHUoY250LT5yeF9ieXRlcyk+PjIpKTsKKwlwbWFfY250LT5wb3J0X3htaXRfcGFja2V0cyA9IGNwdV90b19iZTMyKGJlNjRfdG9fY3B1KGNudC0+dHhfZnJhbWVzKSk7CisJcG1hX2NudC0+cG9ydF9yY3ZfcGFja2V0cyAgPSBjcHVfdG9fYmUzMihiZTY0X3RvX2NwdShjbnQtPnJ4X2ZyYW1lcykpOworfQorCitzdGF0aWMgaW50IGlib2VfcHJvY2Vzc19tYWQoc3RydWN0IGliX2RldmljZSAqaWJkZXYsIGludCBtYWRfZmxhZ3MsIHU4IHBvcnRfbnVtLAorCQkJc3RydWN0IGliX3djICppbl93Yywgc3RydWN0IGliX2dyaCAqaW5fZ3JoLAorCQkJc3RydWN0IGliX21hZCAqaW5fbWFkLCBzdHJ1Y3QgaWJfbWFkICpvdXRfbWFkKQoreworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OworCXN0cnVjdCBtbHg0X2liX2RldiAqZGV2ID0gdG9fbWRldihpYmRldik7CisJaW50IGVycjsKKwl1MzIgaW5tb2QgPSBkZXYtPmNvdW50ZXJzW3BvcnRfbnVtIC0gMV0gJiAweGZmZmY7CisJdTggbW9kZTsKKworCWlmIChpbl9tYWQtPm1hZF9oZHIubWdtdF9jbGFzcyAhPSBJQl9NR01UX0NMQVNTX1BFUkZfTUdNVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYtPmRldik7CisJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJcmV0dXJuIElCX01BRF9SRVNVTFRfRkFJTFVSRTsKKworCWVyciA9IG1seDRfY21kX2JveChkZXYtPmRldiwgMCwgbWFpbGJveC0+ZG1hLCBpbm1vZCwgMCwKKwkJCSAgIE1MWDRfQ01EX1FVRVJZX0lGX1NUQVQsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQyk7CisJaWYgKGVycikKKwkJZXJyID0gSUJfTUFEX1JFU1VMVF9GQUlMVVJFOworCWVsc2UgeworCQltZW1zZXQob3V0X21hZC0+ZGF0YSwgMCwgc2l6ZW9mIG91dF9tYWQtPmRhdGEpOworCQltb2RlID0gKChzdHJ1Y3QgbWx4NF9jb3VudGVyICopbWFpbGJveC0+YnVmKS0+Y291bnRlcl9tb2RlOworCQlzd2l0Y2ggKG1vZGUgJiAweGYpIHsKKwkJY2FzZSAwOgorCQkJZWRpdF9jb3VudGVyKG1haWxib3gtPmJ1ZiwKKwkJCQkJCSh2b2lkICopKG91dF9tYWQtPmRhdGEgKyA0MCkpOworCQkJZXJyID0gSUJfTUFEX1JFU1VMVF9TVUNDRVNTIHwgSUJfTUFEX1JFU1VMVF9SRVBMWTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gSUJfTUFEX1JFU1VMVF9GQUlMVVJFOworCQl9CisJfQorCisJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldi0+ZGV2LCBtYWlsYm94KTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbHg0X2liX3Byb2Nlc3NfbWFkKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBpbnQgbWFkX2ZsYWdzLCB1OCBwb3J0X251bSwKKwkJCXN0cnVjdCBpYl93YyAqaW5fd2MsIHN0cnVjdCBpYl9ncmggKmluX2dyaCwKKwkJCXN0cnVjdCBpYl9tYWQgKmluX21hZCwgc3RydWN0IGliX21hZCAqb3V0X21hZCkKK3sKKwlzd2l0Y2ggKHJkbWFfcG9ydF9nZXRfbGlua19sYXllcihpYmRldiwgcG9ydF9udW0pKSB7CisJY2FzZSBJQl9MSU5LX0xBWUVSX0lORklOSUJBTkQ6CisJCXJldHVybiBpYl9wcm9jZXNzX21hZChpYmRldiwgbWFkX2ZsYWdzLCBwb3J0X251bSwgaW5fd2MsCisJCQkJICAgICAgaW5fZ3JoLCBpbl9tYWQsIG91dF9tYWQpOworCWNhc2UgSUJfTElOS19MQVlFUl9FVEhFUk5FVDoKKwkJcmV0dXJuIGlib2VfcHJvY2Vzc19tYWQoaWJkZXYsIG1hZF9mbGFncywgcG9ydF9udW0sIGluX3djLAorCQkJCQkgIGluX2dyaCwgaW5fbWFkLCBvdXRfbWFkKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHNlbmRfaGFuZGxlcihzdHJ1Y3QgaWJfbWFkX2FnZW50ICphZ2VudCwKIAkJCSBzdHJ1Y3QgaWJfbWFkX3NlbmRfd2MgKm1hZF9zZW5kX3djKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jCmluZGV4IGZiZTE5NzMuLmZhNjQzZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMKQEAgLTgxNiw3ICs4MTYsNyBAQAogCQltZW1jcHkoZ3ctPmRldi0+aWJvZS5naWRfdGFibGVbZ3ctPnBvcnQgLSAxXSwgZ3ctPmdpZHMsIHNpemVvZiBndy0+Z2lkcyk7CiAJCWV2ZW50LmRldmljZSA9ICZndy0+ZGV2LT5pYl9kZXY7CiAJCWV2ZW50LmVsZW1lbnQucG9ydF9udW0gPSBndy0+cG9ydDsKLQkJZXZlbnQuZXZlbnQgICAgPSBJQl9FVkVOVF9MSURfQ0hBTkdFOworCQlldmVudC5ldmVudCAgICA9IElCX0VWRU5UX0dJRF9DSEFOR0U7CiAJCWliX2Rpc3BhdGNoX2V2ZW50KCZldmVudCk7CiAJfQogCkBAIC0xMDk4LDExICsxMDk4LDIxIEBACiAJaWYgKGluaXRfbm9kZV9kYXRhKGliZGV2KSkKIAkJZ290byBlcnJfbWFwOwogCisJZm9yIChpID0gMDsgaSA8IGliZGV2LT5udW1fcG9ydHM7ICsraSkgeworCQlpZiAobWx4NF9pYl9wb3J0X2xpbmtfbGF5ZXIoJmliZGV2LT5pYl9kZXYsIGkgKyAxKSA9PQorCQkJCQkJSUJfTElOS19MQVlFUl9FVEhFUk5FVCkgeworCQkJZXJyID0gbWx4NF9jb3VudGVyX2FsbG9jKGliZGV2LT5kZXYsICZpYmRldi0+Y291bnRlcnNbaV0pOworCQkJaWYgKGVycikKKwkJCQlpYmRldi0+Y291bnRlcnNbaV0gPSAtMTsKKwkJfSBlbHNlCisJCQkJaWJkZXYtPmNvdW50ZXJzW2ldID0gLTE7CisJfQorCiAJc3Bpbl9sb2NrX2luaXQoJmliZGV2LT5zbV9sb2NrKTsKIAltdXRleF9pbml0KCZpYmRldi0+Y2FwX21hc2tfbXV0ZXgpOwogCiAJaWYgKGliX3JlZ2lzdGVyX2RldmljZSgmaWJkZXYtPmliX2RldiwgTlVMTCkpCi0JCWdvdG8gZXJyX21hcDsKKwkJZ290byBlcnJfY291bnRlcjsKIAogCWlmIChtbHg0X2liX21hZF9pbml0KGliZGV2KSkKIAkJZ290byBlcnJfcmVnOwpAQCAtMTEzMiw2ICsxMTQyLDEwIEBACiBlcnJfcmVnOgogCWliX3VucmVnaXN0ZXJfZGV2aWNlKCZpYmRldi0+aWJfZGV2KTsKIAorZXJyX2NvdW50ZXI6CisJZm9yICg7IGk7IC0taSkKKwkJbWx4NF9jb3VudGVyX2ZyZWUoaWJkZXYtPmRldiwgaWJkZXYtPmNvdW50ZXJzW2kgLSAxXSk7CisKIGVycl9tYXA6CiAJaW91bm1hcChpYmRldi0+dWFyX21hcCk7CiAKQEAgLTExNjAsNyArMTE3NCw4IEBACiAJCWliZGV2LT5pYm9lLm5iLm5vdGlmaWVyX2NhbGwgPSBOVUxMOwogCX0KIAlpb3VubWFwKGliZGV2LT51YXJfbWFwKTsKLQorCWZvciAocCA9IDA7IHAgPCBpYmRldi0+bnVtX3BvcnRzOyArK3ApCisJCW1seDRfY291bnRlcl9mcmVlKGliZGV2LT5kZXYsIGliZGV2LT5jb3VudGVyc1twXSk7CiAJbWx4NF9mb3JlYWNoX3BvcnQocCwgZGV2LCBNTFg0X1BPUlRfVFlQRV9JQikKIAkJbWx4NF9DTE9TRV9QT1JUKGRldiwgcCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaAppbmRleCAyYTMyMmYyLi5lNGJmMmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tbHg0X2liLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWx4NF9pYi5oCkBAIC0xOTMsNiArMTkzLDcgQEAKIAlzdHJ1Y3QgbXV0ZXgJCWNhcF9tYXNrX211dGV4OwogCWJvb2wJCQlpYl9hY3RpdmU7CiAJc3RydWN0IG1seDRfaWJfaWJvZQlpYm9lOworCWludAkJCWNvdW50ZXJzW01MWDRfTUFYX1BPUlRTXTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1seDRfaWJfZGV2ICp0b19tZGV2KHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMKaW5kZXggMjAwMWYyMC4uM2E5MWQ5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jCkBAIC04OTMsNyArODkzLDYgQEAKIAkJCS0tcGF0aC0+c3RhdGljX3JhdGU7CiAJfSBlbHNlCiAJCXBhdGgtPnN0YXRpY19yYXRlID0gMDsKLQlwYXRoLT5jb3VudGVyX2luZGV4ID0gMHhmZjsKIAogCWlmIChhaC0+YWhfZmxhZ3MgJiBJQl9BSF9HUkgpIHsKIAkJaWYgKGFoLT5ncmguc2dpZF9pbmRleCA+PSBkZXYtPmRldi0+Y2Fwcy5naWRfdGFibGVfbGVuW3BvcnRdKSB7CkBAIC0xMDM0LDYgKzEwMzMsMTUgQEAKIAkJfQogCX0KIAorCWlmIChjdXJfc3RhdGUgPT0gSUJfUVBTX0lOSVQgJiYgbmV3X3N0YXRlID09IElCX1FQU19SVFIpIHsKKwkJaWYgKGRldi0+Y291bnRlcnNbcXAtPnBvcnQgLSAxXSAhPSAtMSkgeworCQkJY29udGV4dC0+cHJpX3BhdGguY291bnRlcl9pbmRleCA9CisJCQkJCQlkZXYtPmNvdW50ZXJzW3FwLT5wb3J0IC0gMV07CisJCQlvcHRwYXIgfD0gTUxYNF9RUF9PUFRQQVJfQ09VTlRFUl9JTkRFWDsKKwkJfSBlbHNlCisJCQljb250ZXh0LT5wcmlfcGF0aC5jb3VudGVyX2luZGV4ID0gMHhmZjsKKwl9CisKIAlpZiAoYXR0cl9tYXNrICYgSUJfUVBfUEtFWV9JTkRFWCkgewogCQljb250ZXh0LT5wcmlfcGF0aC5wa2V5X2luZGV4ID0gYXR0ci0+cGtleV9pbmRleDsKIAkJb3B0cGFyIHw9IE1MWDRfUVBfT1BUUEFSX1BLRVlfSU5ERVg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMKaW5kZXggN2JmYTJhMS4uMzA4MmIzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYwpAQCAtMzAxLDYgKzMwMSwzOCBAQAogCXJldHVybiBlcnI7CiB9CiAKKworc3RhdGljIGludCBtdGhjYV9zdGF0dXNfdG9fZXJybm8odTggc3RhdHVzKQoreworCXN0YXRpYyBjb25zdCBpbnQgdHJhbnNfdGFibGVbXSA9IHsKKwkJW01USENBX0NNRF9TVEFUX0lOVEVSTkFMX0VSUl0gICA9IC1FSU8sCisJCVtNVEhDQV9DTURfU1RBVF9CQURfT1BdICAgICAgICAgPSAtRVBFUk0sCisJCVtNVEhDQV9DTURfU1RBVF9CQURfUEFSQU1dICAgICAgPSAtRUlOVkFMLAorCQlbTVRIQ0FfQ01EX1NUQVRfQkFEX1NZU19TVEFURV0gID0gLUVOWElPLAorCQlbTVRIQ0FfQ01EX1NUQVRfQkFEX1JFU09VUkNFXSAgID0gLUVCQURGLAorCQlbTVRIQ0FfQ01EX1NUQVRfUkVTT1VSQ0VfQlVTWV0gID0gLUVCVVNZLAorCQlbTVRIQ0FfQ01EX1NUQVRfRERSX01FTV9FUlJdICAgID0gLUVOT01FTSwKKwkJW01USENBX0NNRF9TVEFUX0VYQ0VFRF9MSU1dICAgICA9IC1FTk9NRU0sCisJCVtNVEhDQV9DTURfU1RBVF9CQURfUkVTX1NUQVRFXSAgPSAtRUJBREYsCisJCVtNVEhDQV9DTURfU1RBVF9CQURfSU5ERVhdICAgICAgPSAtRUJBREYsCisJCVtNVEhDQV9DTURfU1RBVF9CQURfTlZNRU1dICAgICAgPSAtRUZBVUxULAorCQlbTVRIQ0FfQ01EX1NUQVRfQkFEX1FQRUVfU1RBVEVdID0gLUVJTlZBTCwKKwkJW01USENBX0NNRF9TVEFUX0JBRF9TRUdfUEFSQU1dICA9IC1FRkFVTFQsCisJCVtNVEhDQV9DTURfU1RBVF9SRUdfQk9VTkRdICAgICAgPSAtRUJVU1ksCisJCVtNVEhDQV9DTURfU1RBVF9MQU1fTk9UX1BSRV0gICAgPSAtRUFHQUlOLAorCQlbTVRIQ0FfQ01EX1NUQVRfQkFEX1BLVF0gICAgICAgID0gLUVCQURNU0csCisJCVtNVEhDQV9DTURfU1RBVF9CQURfU0laRV0gICAgICAgPSAtRU5PTUVNLAorCX07CisKKwlpZiAoc3RhdHVzID49IEFSUkFZX1NJWkUodHJhbnNfdGFibGUpIHx8CisJCQkoc3RhdHVzICE9IE1USENBX0NNRF9TVEFUX09LCisJCQkgJiYgdHJhbnNfdGFibGVbc3RhdHVzXSA9PSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdHJhbnNfdGFibGVbc3RhdHVzXTsKK30KKworCiBzdGF0aWMgaW50IG10aGNhX2NtZF9wb2xsKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKIAkJCSAgdTY0IGluX3BhcmFtLAogCQkJICB1NjQgKm91dF9wYXJhbSwKQEAgLTMwOCwxMSArMzQwLDExIEBACiAJCQkgIHUzMiBpbl9tb2RpZmllciwKIAkJCSAgdTggb3BfbW9kaWZpZXIsCiAJCQkgIHUxNiBvcCwKLQkJCSAgdW5zaWduZWQgbG9uZyB0aW1lb3V0LAotCQkJICB1OCAqc3RhdHVzKQorCQkJICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7CiAJaW50IGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBlbmQ7CisJdTggc3RhdHVzOwogCiAJZG93bigmZGV2LT5jbWQucG9sbF9zZW0pOwogCkBAIC0zNDEsNyArMzczLDEyIEBACiAJCQkodTY0KSBiZTMyX3RvX2NwdSgoX19mb3JjZSBfX2JlMzIpCiAJCQkJCSAgX19yYXdfcmVhZGwoZGV2LT5oY3IgKyBIQ1JfT1VUX1BBUkFNX09GRlNFVCArIDQpKTsKIAotCSpzdGF0dXMgPSBiZTMyX3RvX2NwdSgoX19mb3JjZSBfX2JlMzIpIF9fcmF3X3JlYWRsKGRldi0+aGNyICsgSENSX1NUQVRVU19PRkZTRVQpKSA+PiAyNDsKKwlzdGF0dXMgPSBiZTMyX3RvX2NwdSgoX19mb3JjZSBfX2JlMzIpIF9fcmF3X3JlYWRsKGRldi0+aGNyICsgSENSX1NUQVRVU19PRkZTRVQpKSA+PiAyNDsKKwlpZiAoc3RhdHVzKSB7CisJCW10aGNhX2RiZyhkZXYsICJDb21tYW5kICUwMnggY29tcGxldGVkIHdpdGggc3RhdHVzICUwMnhcbiIsCisJCQkgIG9wLCBzdGF0dXMpOworCQllcnIgPSBtdGhjYV9zdGF0dXNfdG9fZXJybm8oc3RhdHVzKTsKKwl9CiAKIG91dDoKIAl1cCgmZGV2LT5jbWQucG9sbF9zZW0pOwpAQCAtMzc0LDggKzQxMSw3IEBACiAJCQkgIHUzMiBpbl9tb2RpZmllciwKIAkJCSAgdTggb3BfbW9kaWZpZXIsCiAJCQkgIHUxNiBvcCwKLQkJCSAgdW5zaWduZWQgbG9uZyB0aW1lb3V0LAotCQkJICB1OCAqc3RhdHVzKQorCQkJICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IG10aGNhX2NtZF9jb250ZXh0ICpjb250ZXh0OwpAQCAtNDA3LDEwICs0NDMsMTEgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCSpzdGF0dXMgPSBjb250ZXh0LT5zdGF0dXM7Ci0JaWYgKCpzdGF0dXMpCisJaWYgKGNvbnRleHQtPnN0YXR1cykgewogCQltdGhjYV9kYmcoZGV2LCAiQ29tbWFuZCAlMDJ4IGNvbXBsZXRlZCB3aXRoIHN0YXR1cyAlMDJ4XG4iLAotCQkJICBvcCwgKnN0YXR1cyk7CisJCQkgIG9wLCBjb250ZXh0LT5zdGF0dXMpOworCQllcnIgPSBtdGhjYV9zdGF0dXNfdG9fZXJybm8oY29udGV4dC0+c3RhdHVzKTsKKwl9CiAKIAlpZiAob3V0X2lzX2ltbSkKIAkJKm91dF9wYXJhbSA9IGNvbnRleHQtPm91dF9wYXJhbTsKQEAgLTQzMiwxNyArNDY5LDE2IEBACiAJCQkgdTMyIGluX21vZGlmaWVyLAogCQkJIHU4IG9wX21vZGlmaWVyLAogCQkJIHUxNiBvcCwKLQkJCSB1bnNpZ25lZCBsb25nIHRpbWVvdXQsCi0JCQkgdTggKnN0YXR1cykKKwkJCSB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7CiAJaWYgKGRldi0+Y21kLmZsYWdzICYgTVRIQ0FfQ01EX1VTRV9FVkVOVFMpCiAJCXJldHVybiBtdGhjYV9jbWRfd2FpdChkZXYsIGluX3BhcmFtLCAmb3V0X3BhcmFtLCAwLAogCQkJCSAgICAgIGluX21vZGlmaWVyLCBvcF9tb2RpZmllciwgb3AsCi0JCQkJICAgICAgdGltZW91dCwgc3RhdHVzKTsKKwkJCQkgICAgICB0aW1lb3V0KTsKIAllbHNlCiAJCXJldHVybiBtdGhjYV9jbWRfcG9sbChkZXYsIGluX3BhcmFtLCAmb3V0X3BhcmFtLCAwLAogCQkJCSAgICAgIGluX21vZGlmaWVyLCBvcF9tb2RpZmllciwgb3AsCi0JCQkJICAgICAgdGltZW91dCwgc3RhdHVzKTsKKwkJCQkgICAgICB0aW1lb3V0KTsKIH0KIAogLyogSW52b2tlIGEgY29tbWFuZCB3aXRoIG5vIG91dHB1dCBwYXJhbWV0ZXIgKi8KQEAgLTQ1MSwxMSArNDg3LDEwIEBACiAJCSAgICAgdTMyIGluX21vZGlmaWVyLAogCQkgICAgIHU4IG9wX21vZGlmaWVyLAogCQkgICAgIHUxNiBvcCwKLQkJICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQsCi0JCSAgICAgdTggKnN0YXR1cykKKwkJICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7CiAJcmV0dXJuIG10aGNhX2NtZF9ib3goZGV2LCBpbl9wYXJhbSwgMCwgaW5fbW9kaWZpZXIsCi0JCQkgICAgIG9wX21vZGlmaWVyLCBvcCwgdGltZW91dCwgc3RhdHVzKTsKKwkJCSAgICAgb3BfbW9kaWZpZXIsIG9wLCB0aW1lb3V0KTsKIH0KIAogLyoKQEAgLTQ2OSwxNyArNTA0LDE2IEBACiAJCQkgdTMyIGluX21vZGlmaWVyLAogCQkJIHU4IG9wX21vZGlmaWVyLAogCQkJIHUxNiBvcCwKLQkJCSB1bnNpZ25lZCBsb25nIHRpbWVvdXQsCi0JCQkgdTggKnN0YXR1cykKKwkJCSB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7CiAJaWYgKGRldi0+Y21kLmZsYWdzICYgTVRIQ0FfQ01EX1VTRV9FVkVOVFMpCiAJCXJldHVybiBtdGhjYV9jbWRfd2FpdChkZXYsIGluX3BhcmFtLCBvdXRfcGFyYW0sIDEsCiAJCQkJICAgICAgaW5fbW9kaWZpZXIsIG9wX21vZGlmaWVyLCBvcCwKLQkJCQkgICAgICB0aW1lb3V0LCBzdGF0dXMpOworCQkJCSAgICAgIHRpbWVvdXQpOwogCWVsc2UKIAkJcmV0dXJuIG10aGNhX2NtZF9wb2xsKGRldiwgaW5fcGFyYW0sIG91dF9wYXJhbSwgMSwKIAkJCQkgICAgICBpbl9tb2RpZmllciwgb3BfbW9kaWZpZXIsIG9wLAotCQkJCSAgICAgIHRpbWVvdXQsIHN0YXR1cyk7CisJCQkJICAgICAgdGltZW91dCk7CiB9CiAKIGludCBtdGhjYV9jbWRfaW5pdChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCkBAIC01OTYsMTQgKzYzMCwxNCBAQAogCWtmcmVlKG1haWxib3gpOwogfQogCi1pbnQgbXRoY2FfU1lTX0VOKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cykKK2ludCBtdGhjYV9TWVNfRU4oc3RydWN0IG10aGNhX2RldiAqZGV2KQogewogCXU2NCBvdXQ7CiAJaW50IHJldDsKIAotCXJldCA9IG10aGNhX2NtZF9pbW0oZGV2LCAwLCAmb3V0LCAwLCAwLCBDTURfU1lTX0VOLCBDTURfVElNRV9DTEFTU19ELCBzdGF0dXMpOworCXJldCA9IG10aGNhX2NtZF9pbW0oZGV2LCAwLCAmb3V0LCAwLCAwLCBDTURfU1lTX0VOLCBDTURfVElNRV9DTEFTU19EKTsKIAotCWlmICgqc3RhdHVzID09IE1USENBX0NNRF9TVEFUX0REUl9NRU1fRVJSKQorCWlmIChyZXQgPT0gLUVOT01FTSkKIAkJbXRoY2Ffd2FybihkZXYsICJTWVNfRU4gRERSIGVycm9yOiBzeW49JXgsIHNvY2s9JWQsICIKIAkJCSAgICJzbGFkZHI9JWQsIFNQRCBzb3VyY2U9JXNcbiIsCiAJCQkgICAoaW50KSAob3V0ID4+IDYpICYgMHhmLCAoaW50KSAob3V0ID4+IDQpICYgMywKQEAgLTYxMiwxMyArNjQ2LDEzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG10aGNhX1NZU19ESVMoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1OCAqc3RhdHVzKQoraW50IG10aGNhX1NZU19ESVMoc3RydWN0IG10aGNhX2RldiAqZGV2KQogewotCXJldHVybiBtdGhjYV9jbWQoZGV2LCAwLCAwLCAwLCBDTURfU1lTX0RJUywgQ01EX1RJTUVfQ0xBU1NfQywgc3RhdHVzKTsKKwlyZXR1cm4gbXRoY2FfY21kKGRldiwgMCwgMCwgMCwgQ01EX1NZU19ESVMsIENNRF9USU1FX0NMQVNTX0MpOwogfQogCiBzdGF0aWMgaW50IG10aGNhX21hcF9jbWQoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MTYgb3AsIHN0cnVjdCBtdGhjYV9pY20gKmljbSwKLQkJCSB1NjQgdmlydCwgdTggKnN0YXR1cykKKwkJCSB1NjQgdmlydCkKIHsKIAlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAlzdHJ1Y3QgbXRoY2FfaWNtX2l0ZXIgaXRlcjsKQEAgLTY2Niw4ICs3MDAsOCBAQAogCiAJCQlpZiAoKytuZW50ID09IE1USENBX01BSUxCT1hfU0laRSAvIDE2KSB7CiAJCQkJZXJyID0gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBuZW50LCAwLCBvcCwKLQkJCQkJCUNNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7Ci0JCQkJaWYgKGVyciB8fCAqc3RhdHVzKQorCQkJCQkJQ01EX1RJTUVfQ0xBU1NfQik7CisJCQkJaWYgKGVycikKIAkJCQkJZ290byBvdXQ7CiAJCQkJbmVudCA9IDA7CiAJCQl9CkBAIC02NzYsNyArNzEwLDcgQEAKIAogCWlmIChuZW50KQogCQllcnIgPSBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIG5lbnQsIDAsIG9wLAotCQkJCUNNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CisJCQkJQ01EX1RJTUVfQ0xBU1NfQik7CiAKIAlzd2l0Y2ggKG9wKSB7CiAJY2FzZSBDTURfTUFQX0ZBOgpAQCAtNjk2LDE5ICs3MzAsMTkgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbXRoY2FfTUFQX0ZBKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX2ljbSAqaWNtLCB1OCAqc3RhdHVzKQoraW50IG10aGNhX01BUF9GQShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9pY20gKmljbSkKIHsKLQlyZXR1cm4gbXRoY2FfbWFwX2NtZChkZXYsIENNRF9NQVBfRkEsIGljbSwgLTEsIHN0YXR1cyk7CisJcmV0dXJuIG10aGNhX21hcF9jbWQoZGV2LCBDTURfTUFQX0ZBLCBpY20sIC0xKTsKIH0KIAotaW50IG10aGNhX1VOTUFQX0ZBKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cykKK2ludCBtdGhjYV9VTk1BUF9GQShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7Ci0JcmV0dXJuIG10aGNhX2NtZChkZXYsIDAsIDAsIDAsIENNRF9VTk1BUF9GQSwgQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKKwlyZXR1cm4gbXRoY2FfY21kKGRldiwgMCwgMCwgMCwgQ01EX1VOTUFQX0ZBLCBDTURfVElNRV9DTEFTU19CKTsKIH0KIAotaW50IG10aGNhX1JVTl9GVyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfUlVOX0ZXKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKLQlyZXR1cm4gbXRoY2FfY21kKGRldiwgMCwgMCwgMCwgQ01EX1JVTl9GVywgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKKwlyZXR1cm4gbXRoY2FfY21kKGRldiwgMCwgMCwgMCwgQ01EX1JVTl9GVywgQ01EX1RJTUVfQ0xBU1NfQSk7CiB9CiAKIHN0YXRpYyB2b2lkIG10aGNhX3NldHVwX2NtZF9kb29yYmVsbHMoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1NjQgYmFzZSkKQEAgLTczNyw3ICs3NzEsNyBAQAogCW10aGNhX2RiZyhkZXYsICJNYXBwZWQgZG9vcmJlbGwgcGFnZSBmb3IgcG9zdGluZyBGVyBjb21tYW5kc1xuIik7CiB9CiAKLWludCBtdGhjYV9RVUVSWV9GVyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfUVVFUllfRlcoc3RydWN0IG10aGNhX2RldiAqZGV2KQogewogCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXUzMiAqb3V0Ym94OwpAQCAtNzcxLDcgKzgwNSw3IEBACiAJb3V0Ym94ID0gbWFpbGJveC0+YnVmOwogCiAJZXJyID0gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgMCwgMCwgQ01EX1FVRVJZX0ZXLAotCQkJICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CisJCQkgICAgQ01EX1RJTUVfQ0xBU1NfQSk7CiAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKQEAgLTg0Myw3ICs4NzcsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBtdGhjYV9FTkFCTEVfTEFNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cykKK2ludCBtdGhjYV9FTkFCTEVfTEFNKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAl1OCBpbmZvOwpAQCAtODY0LDE0ICs4OTgsMTEgQEAKIAlvdXRib3ggPSBtYWlsYm94LT5idWY7CiAKIAllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCAwLCAwLCBDTURfRU5BQkxFX0xBTSwKLQkJCSAgICBDTURfVElNRV9DTEFTU19DLCBzdGF0dXMpOworCQkJICAgIENNRF9USU1FX0NMQVNTX0MpOwogCiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlpZiAoKnN0YXR1cyA9PSBNVEhDQV9DTURfU1RBVF9MQU1fTk9UX1BSRSkKLQkJZ290byBvdXQ7Ci0KIAlNVEhDQV9HRVQoZGV2LT5kZHJfc3RhcnQsIG91dGJveCwgRU5BQkxFX0xBTV9TVEFSVF9PRkZTRVQpOwogCU1USENBX0dFVChkZXYtPmRkcl9lbmQsICAgb3V0Ym94LCBFTkFCTEVfTEFNX0VORF9PRkZTRVQpOwogCU1USENBX0dFVChpbmZvLCAgICAgICAgICAgb3V0Ym94LCBFTkFCTEVfTEFNX0lORk9fT0ZGU0VUKTsKQEAgLTg5NiwxMiArOTI3LDEyIEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG10aGNhX0RJU0FCTEVfTEFNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cykKK2ludCBtdGhjYV9ESVNBQkxFX0xBTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7Ci0JcmV0dXJuIG10aGNhX2NtZChkZXYsIDAsIDAsIDAsIENNRF9TWVNfRElTLCBDTURfVElNRV9DTEFTU19DLCBzdGF0dXMpOworCXJldHVybiBtdGhjYV9jbWQoZGV2LCAwLCAwLCAwLCBDTURfU1lTX0RJUywgQ01EX1RJTUVfQ0xBU1NfQyk7CiB9CiAKLWludCBtdGhjYV9RVUVSWV9ERFIoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1OCAqc3RhdHVzKQoraW50IG10aGNhX1FVRVJZX0REUihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTggaW5mbzsKQEAgLTkyMiw3ICs5NTMsNyBAQAogCW91dGJveCA9IG1haWxib3gtPmJ1ZjsKIAogCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIDAsIDAsIENNRF9RVUVSWV9ERFIsCi0JCQkgICAgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKKwkJCSAgICBDTURfVElNRV9DTEFTU19BKTsKIAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtOTUyLDcgKzk4Myw3IEBACiB9CiAKIGludCBtdGhjYV9RVUVSWV9ERVZfTElNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKLQkJCXN0cnVjdCBtdGhjYV9kZXZfbGltICpkZXZfbGltLCB1OCAqc3RhdHVzKQorCQkJc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0pCiB7CiAJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTMyICpvdXRib3g7CkBAIC0xMDI4LDcgKzEwNTksNyBAQAogCW91dGJveCA9IG1haWxib3gtPmJ1ZjsKIAogCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIDAsIDAsIENNRF9RVUVSWV9ERVZfTElNLAotCQkJICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CisJCQkgICAgQ01EX1RJTUVfQ0xBU1NfQSk7CiAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKQEAgLTEyMzIsNyArMTI2Myw3IEBACiB9CiAKIGludCBtdGhjYV9RVUVSWV9BREFQVEVSKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKLQkJCXN0cnVjdCBtdGhjYV9hZGFwdGVyICphZGFwdGVyLCB1OCAqc3RhdHVzKQorCQkJc3RydWN0IG10aGNhX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTMyICpvdXRib3g7CkBAIC0xMjUxLDcgKzEyODIsNyBAQAogCW91dGJveCA9IG1haWxib3gtPmJ1ZjsKIAogCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIDAsIDAsIENNRF9RVUVSWV9BREFQVEVSLAotCQkJICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CisJCQkgICAgQ01EX1RJTUVfQ0xBU1NfQSk7CiAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKQEAgLTEyNzUsOCArMTMwNiw3IEBACiB9CiAKIGludCBtdGhjYV9JTklUX0hDQShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCi0JCSAgIHN0cnVjdCBtdGhjYV9pbml0X2hjYV9wYXJhbSAqcGFyYW0sCi0JCSAgIHU4ICpzdGF0dXMpCisJCSAgIHN0cnVjdCBtdGhjYV9pbml0X2hjYV9wYXJhbSAqcGFyYW0pCiB7CiAJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJX19iZTMyICppbmJveDsKQEAgLTEzOTMsNyArMTQyMyw4IEBACiAJCU1USENBX1BVVChpbmJveCwgcGFyYW0tPnVhcmNfYmFzZSwgICBJTklUX0hDQV9VQVJfQ1RYX0JBU0VfT0ZGU0VUKTsKIAl9CiAKLQllcnIgPSBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIDAsIDAsIENNRF9JTklUX0hDQSwgQ01EX1RJTUVfQ0xBU1NfRCwgc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIDAsIDAsCisJCQlDTURfSU5JVF9IQ0EsIENNRF9USU1FX0NMQVNTX0QpOwogCiAJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKQEAgLTE0MDEsNyArMTQzMiw3IEBACiAKIGludCBtdGhjYV9JTklUX0lCKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKIAkJICBzdHJ1Y3QgbXRoY2FfaW5pdF9pYl9wYXJhbSAqcGFyYW0sCi0JCSAgaW50IHBvcnQsIHU4ICpzdGF0dXMpCisJCSAgaW50IHBvcnQpCiB7CiAJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTMyICppbmJveDsKQEAgLTE0NDUsMjQgKzE0NzYsMjQgQEAKIAlNVEhDQV9QVVQoaW5ib3gsIHBhcmFtLT5zaV9ndWlkLCAgIElOSVRfSUJfU0lfR1VJRF9PRkZTRVQpOwogCiAJZXJyID0gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBwb3J0LCAwLCBDTURfSU5JVF9JQiwKLQkJCUNNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CisJCQlDTURfVElNRV9DTEFTU19BKTsKIAogCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiAKLWludCBtdGhjYV9DTE9TRV9JQihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBwb3J0LCB1OCAqc3RhdHVzKQoraW50IG10aGNhX0NMT1NFX0lCKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHBvcnQpCiB7Ci0JcmV0dXJuIG10aGNhX2NtZChkZXYsIDAsIHBvcnQsIDAsIENNRF9DTE9TRV9JQiwgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKKwlyZXR1cm4gbXRoY2FfY21kKGRldiwgMCwgcG9ydCwgMCwgQ01EX0NMT1NFX0lCLCBDTURfVElNRV9DTEFTU19BKTsKIH0KIAotaW50IG10aGNhX0NMT1NFX0hDQShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBwYW5pYywgdTggKnN0YXR1cykKK2ludCBtdGhjYV9DTE9TRV9IQ0Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgcGFuaWMpCiB7Ci0JcmV0dXJuIG10aGNhX2NtZChkZXYsIDAsIDAsIHBhbmljLCBDTURfQ0xPU0VfSENBLCBDTURfVElNRV9DTEFTU19DLCBzdGF0dXMpOworCXJldHVybiBtdGhjYV9jbWQoZGV2LCAwLCAwLCBwYW5pYywgQ01EX0NMT1NFX0hDQSwgQ01EX1RJTUVfQ0xBU1NfQyk7CiB9CiAKIGludCBtdGhjYV9TRVRfSUIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2Ffc2V0X2liX3BhcmFtICpwYXJhbSwKLQkJIGludCBwb3J0LCB1OCAqc3RhdHVzKQorCQkgaW50IHBvcnQpCiB7CiAJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTMyICppbmJveDsKQEAgLTE0OTEsMTggKzE1MjIsMTggQEAKIAlNVEhDQV9QVVQoaW5ib3gsIHBhcmFtLT5zaV9ndWlkLCAgU0VUX0lCX1NJX0dVSURfT0ZGU0VUKTsKIAogCWVyciA9IG10aGNhX2NtZChkZXYsIG1haWxib3gtPmRtYSwgcG9ydCwgMCwgQ01EX1NFVF9JQiwKLQkJCUNNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CisJCQlDTURfVElNRV9DTEFTU19CKTsKIAogCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiAKLWludCBtdGhjYV9NQVBfSUNNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX2ljbSAqaWNtLCB1NjQgdmlydCwgdTggKnN0YXR1cykKK2ludCBtdGhjYV9NQVBfSUNNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX2ljbSAqaWNtLCB1NjQgdmlydCkKIHsKLQlyZXR1cm4gbXRoY2FfbWFwX2NtZChkZXYsIENNRF9NQVBfSUNNLCBpY20sIHZpcnQsIHN0YXR1cyk7CisJcmV0dXJuIG10aGNhX21hcF9jbWQoZGV2LCBDTURfTUFQX0lDTSwgaWNtLCB2aXJ0KTsKIH0KIAotaW50IG10aGNhX01BUF9JQ01fcGFnZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU2NCBkbWFfYWRkciwgdTY0IHZpcnQsIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfTUFQX0lDTV9wYWdlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTY0IGRtYV9hZGRyLCB1NjQgdmlydCkKIHsKIAlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAlfX2JlNjQgKmluYm94OwpAQCAtMTUxNyw3ICsxNTQ4LDcgQEAKIAlpbmJveFsxXSA9IGNwdV90b19iZTY0KGRtYV9hZGRyKTsKIAogCWVyciA9IG10aGNhX2NtZChkZXYsIG1haWxib3gtPmRtYSwgMSwgMCwgQ01EX01BUF9JQ00sCi0JCQlDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOworCQkJQ01EX1RJTUVfQ0xBU1NfQik7CiAKIAltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIApAQCAtMTUyOCwzMSArMTU1OSwzMSBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBtdGhjYV9VTk1BUF9JQ00oc3RydWN0IG10aGNhX2RldiAqZGV2LCB1NjQgdmlydCwgdTMyIHBhZ2VfY291bnQsIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfVU5NQVBfSUNNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTY0IHZpcnQsIHUzMiBwYWdlX2NvdW50KQogewogCW10aGNhX2RiZyhkZXYsICJVbm1hcHBpbmcgJWQgcGFnZXMgYXQgJWxseCBmcm9tIElDTS5cbiIsCiAJCSAgcGFnZV9jb3VudCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgdmlydCk7CiAKLQlyZXR1cm4gbXRoY2FfY21kKGRldiwgdmlydCwgcGFnZV9jb3VudCwgMCwgQ01EX1VOTUFQX0lDTSwgQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKKwlyZXR1cm4gbXRoY2FfY21kKGRldiwgdmlydCwgcGFnZV9jb3VudCwgMCwKKwkJCUNNRF9VTk1BUF9JQ00sIENNRF9USU1FX0NMQVNTX0IpOwogfQogCi1pbnQgbXRoY2FfTUFQX0lDTV9BVVgoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfaWNtICppY20sIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfTUFQX0lDTV9BVVgoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfaWNtICppY20pCiB7Ci0JcmV0dXJuIG10aGNhX21hcF9jbWQoZGV2LCBDTURfTUFQX0lDTV9BVVgsIGljbSwgLTEsIHN0YXR1cyk7CisJcmV0dXJuIG10aGNhX21hcF9jbWQoZGV2LCBDTURfTUFQX0lDTV9BVVgsIGljbSwgLTEpOwogfQogCi1pbnQgbXRoY2FfVU5NQVBfSUNNX0FVWChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfVU5NQVBfSUNNX0FVWChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7Ci0JcmV0dXJuIG10aGNhX2NtZChkZXYsIDAsIDAsIDAsIENNRF9VTk1BUF9JQ01fQVVYLCBDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOworCXJldHVybiBtdGhjYV9jbWQoZGV2LCAwLCAwLCAwLCBDTURfVU5NQVBfSUNNX0FVWCwgQ01EX1RJTUVfQ0xBU1NfQik7CiB9CiAKLWludCBtdGhjYV9TRVRfSUNNX1NJWkUoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1NjQgaWNtX3NpemUsIHU2NCAqYXV4X3BhZ2VzLAotCQkgICAgICAgdTggKnN0YXR1cykKK2ludCBtdGhjYV9TRVRfSUNNX1NJWkUoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1NjQgaWNtX3NpemUsIHU2NCAqYXV4X3BhZ2VzKQogewotCWludCByZXQgPSBtdGhjYV9jbWRfaW1tKGRldiwgaWNtX3NpemUsIGF1eF9wYWdlcywgMCwgMCwgQ01EX1NFVF9JQ01fU0laRSwKLQkJCQlDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOworCWludCByZXQgPSBtdGhjYV9jbWRfaW1tKGRldiwgaWNtX3NpemUsIGF1eF9wYWdlcywgMCwKKwkJCTAsIENNRF9TRVRfSUNNX1NJWkUsIENNRF9USU1FX0NMQVNTX0EpOwogCi0JaWYgKHJldCB8fCBzdGF0dXMpCisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCS8qCkBAIC0xNTY2LDc0ICsxNTk3LDczIEBACiB9CiAKIGludCBtdGhjYV9TVzJIV19NUFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKLQkJICAgIGludCBtcHRfaW5kZXgsIHU4ICpzdGF0dXMpCisJCSAgICBpbnQgbXB0X2luZGV4KQogewogCXJldHVybiBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIG1wdF9pbmRleCwgMCwgQ01EX1NXMkhXX01QVCwKLQkJCSBDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOworCQkJIENNRF9USU1FX0NMQVNTX0IpOwogfQogCiBpbnQgbXRoY2FfSFcyU1dfTVBUKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCi0JCSAgICBpbnQgbXB0X2luZGV4LCB1OCAqc3RhdHVzKQorCQkgICAgaW50IG1wdF9pbmRleCkKIHsKIAlyZXR1cm4gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3ggPyBtYWlsYm94LT5kbWEgOiAwLCBtcHRfaW5kZXgsCiAJCQkgICAgICFtYWlsYm94LCBDTURfSFcyU1dfTVBULAotCQkJICAgICBDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOworCQkJICAgICBDTURfVElNRV9DTEFTU19CKTsKIH0KIAogaW50IG10aGNhX1dSSVRFX01UVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAotCQkgICAgaW50IG51bV9tdHQsIHU4ICpzdGF0dXMpCisJCSAgICBpbnQgbnVtX210dCkKIHsKIAlyZXR1cm4gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBudW1fbXR0LCAwLCBDTURfV1JJVEVfTVRULAotCQkJIENNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CisJCQkgQ01EX1RJTUVfQ0xBU1NfQik7CiB9CiAKLWludCBtdGhjYV9TWU5DX1RQVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfU1lOQ19UUFQoc3RydWN0IG10aGNhX2RldiAqZGV2KQogewotCXJldHVybiBtdGhjYV9jbWQoZGV2LCAwLCAwLCAwLCBDTURfU1lOQ19UUFQsIENNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CisJcmV0dXJuIG10aGNhX2NtZChkZXYsIDAsIDAsIDAsIENNRF9TWU5DX1RQVCwgQ01EX1RJTUVfQ0xBU1NfQik7CiB9CiAKIGludCBtdGhjYV9NQVBfRVEoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1NjQgZXZlbnRfbWFzaywgaW50IHVubWFwLAotCQkgaW50IGVxX251bSwgdTggKnN0YXR1cykKKwkJIGludCBlcV9udW0pCiB7CiAJbXRoY2FfZGJnKGRldiwgIiVzIG1hc2sgJTAxNmxseCBmb3IgZXFuICVkXG4iLAogCQkgIHVubWFwID8gIkNsZWFyaW5nIiA6ICJTZXR0aW5nIiwKIAkJICAodW5zaWduZWQgbG9uZyBsb25nKSBldmVudF9tYXNrLCBlcV9udW0pOwogCXJldHVybiBtdGhjYV9jbWQoZGV2LCBldmVudF9tYXNrLCAodW5tYXAgPDwgMzEpIHwgZXFfbnVtLAotCQkJIDAsIENNRF9NQVBfRVEsIENNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CisJCQkgMCwgQ01EX01BUF9FUSwgQ01EX1RJTUVfQ0xBU1NfQik7CiB9CiAKIGludCBtdGhjYV9TVzJIV19FUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAotCQkgICBpbnQgZXFfbnVtLCB1OCAqc3RhdHVzKQorCQkgICBpbnQgZXFfbnVtKQogewogCXJldHVybiBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGVxX251bSwgMCwgQ01EX1NXMkhXX0VRLAotCQkJIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CisJCQkgQ01EX1RJTUVfQ0xBU1NfQSk7CiB9CiAKIGludCBtdGhjYV9IVzJTV19FUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAotCQkgICBpbnQgZXFfbnVtLCB1OCAqc3RhdHVzKQorCQkgICBpbnQgZXFfbnVtKQogewogCXJldHVybiBtdGhjYV9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCBlcV9udW0sIDAsCiAJCQkgICAgIENNRF9IVzJTV19FUSwKLQkJCSAgICAgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKKwkJCSAgICAgQ01EX1RJTUVfQ0xBU1NfQSk7CiB9CiAKIGludCBtdGhjYV9TVzJIV19DUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAotCQkgICBpbnQgY3FfbnVtLCB1OCAqc3RhdHVzKQorCQkgICBpbnQgY3FfbnVtKQogewogCXJldHVybiBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGNxX251bSwgMCwgQ01EX1NXMkhXX0NRLAotCQkJQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKKwkJCUNNRF9USU1FX0NMQVNTX0EpOwogfQogCiBpbnQgbXRoY2FfSFcyU1dfQ1Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKLQkJICAgaW50IGNxX251bSwgdTggKnN0YXR1cykKKwkJICAgaW50IGNxX251bSkKIHsKIAlyZXR1cm4gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgY3FfbnVtLCAwLAogCQkJICAgICBDTURfSFcyU1dfQ1EsCi0JCQkgICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CisJCQkgICAgIENNRF9USU1FX0NMQVNTX0EpOwogfQogCi1pbnQgbXRoY2FfUkVTSVpFX0NRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IGNxX251bSwgdTMyIGxrZXksIHU4IGxvZ19zaXplLAotCQkgICAgdTggKnN0YXR1cykKK2ludCBtdGhjYV9SRVNJWkVfQ1Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgY3FfbnVtLCB1MzIgbGtleSwgdTggbG9nX3NpemUpCiB7CiAJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJX19iZTMyICppbmJveDsKQEAgLTE2NTcsNDQgKzE2ODcsNDMgQEAKIAlNVEhDQV9QVVQoaW5ib3gsIGxrZXksICAgICBSRVNJWkVfQ1FfTEtFWV9PRkZTRVQpOwogCiAJZXJyID0gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBjcV9udW0sIDEsIENNRF9SRVNJWkVfQ1EsCi0JCQlDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOworCQkJQ01EX1RJTUVfQ0xBU1NfQik7CiAKIAltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgbXRoY2FfU1cySFdfU1JRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCi0JCSAgICBpbnQgc3JxX251bSwgdTggKnN0YXR1cykKKwkJICAgIGludCBzcnFfbnVtKQogewogCXJldHVybiBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIHNycV9udW0sIDAsIENNRF9TVzJIV19TUlEsCi0JCQlDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOworCQkJQ01EX1RJTUVfQ0xBU1NfQSk7CiB9CiAKIGludCBtdGhjYV9IVzJTV19TUlEoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKLQkJICAgIGludCBzcnFfbnVtLCB1OCAqc3RhdHVzKQorCQkgICAgaW50IHNycV9udW0pCiB7CiAJcmV0dXJuIG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIHNycV9udW0sIDAsCiAJCQkgICAgIENNRF9IVzJTV19TUlEsCi0JCQkgICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CisJCQkgICAgIENNRF9USU1FX0NMQVNTX0EpOwogfQogCiBpbnQgbXRoY2FfUVVFUllfU1JRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTMyIG51bSwKLQkJICAgIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LCB1OCAqc3RhdHVzKQorCQkgICAgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gpCiB7CiAJcmV0dXJuIG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIG51bSwgMCwKLQkJCSAgICAgQ01EX1FVRVJZX1NSUSwgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKKwkJCSAgICAgQ01EX1FVRVJZX1NSUSwgQ01EX1RJTUVfQ0xBU1NfQSk7CiB9CiAKLWludCBtdGhjYV9BUk1fU1JRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHNycV9udW0sIGludCBsaW1pdCwgdTggKnN0YXR1cykKK2ludCBtdGhjYV9BUk1fU1JRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHNycV9udW0sIGludCBsaW1pdCkKIHsKIAlyZXR1cm4gbXRoY2FfY21kKGRldiwgbGltaXQsIHNycV9udW0sIDAsIENNRF9BUk1fU1JRLAotCQkJIENNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CisJCQkgQ01EX1RJTUVfQ0xBU1NfQik7CiB9CiAKIGludCBtdGhjYV9NT0RJRllfUVAoc3RydWN0IG10aGNhX2RldiAqZGV2LCBlbnVtIGliX3FwX3N0YXRlIGN1ciwKIAkJICAgIGVudW0gaWJfcXBfc3RhdGUgbmV4dCwgdTMyIG51bSwgaW50IGlzX2VlLAotCQkgICAgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsIHUzMiBvcHRtYXNrLAotCQkgICAgdTggKnN0YXR1cykKKwkJICAgIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LCB1MzIgb3B0bWFzaykKIHsKIAlzdGF0aWMgY29uc3QgdTE2IG9wW0lCX1FQU19FUlIgKyAxXVtJQl9RUFNfRVJSICsgMV0gPSB7CiAJCVtJQl9RUFNfUkVTRVRdID0gewpAQCAtMTc1NSw3ICsxNzg0LDcgQEAKIAogCQllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgbWFpbGJveCA/IG1haWxib3gtPmRtYSA6IDAsCiAJCQkJICAgICghIWlzX2VlIDw8IDI0KSB8IG51bSwgb3BfbW9kLAotCQkJCSAgICBvcFtjdXJdW25leHRdLCBDTURfVElNRV9DTEFTU19DLCBzdGF0dXMpOworCQkJCSAgICBvcFtjdXJdW25leHRdLCBDTURfVElNRV9DTEFTU19DKTsKIAogCQlpZiAoMCAmJiBtYWlsYm94KSB7CiAJCQlpbnQgaTsKQEAgLTE3ODksMjEgKzE4MTgsMjAgQEAKIAkJfQogCiAJCWVyciA9IG10aGNhX2NtZChkZXYsIG1haWxib3gtPmRtYSwgb3B0bWFzayB8ICghIWlzX2VlIDw8IDI0KSB8IG51bSwKLQkJCQlvcF9tb2QsIG9wW2N1cl1bbmV4dF0sIENNRF9USU1FX0NMQVNTX0MsIHN0YXR1cyk7CisJCQkJb3BfbW9kLCBvcFtjdXJdW25leHRdLCBDTURfVElNRV9DTEFTU19DKTsKIAl9CiAKIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgbXRoY2FfUVVFUllfUVAoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MzIgbnVtLCBpbnQgaXNfZWUsCi0JCSAgIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LCB1OCAqc3RhdHVzKQorCQkgICBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCkKIHsKIAlyZXR1cm4gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgKCEhaXNfZWUgPDwgMjQpIHwgbnVtLCAwLAotCQkJICAgICBDTURfUVVFUllfUVBFRSwgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKKwkJCSAgICAgQ01EX1FVRVJZX1FQRUUsIENNRF9USU1FX0NMQVNTX0EpOwogfQogCi1pbnQgbXRoY2FfQ09ORl9TUEVDSUFMX1FQKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHR5cGUsIHUzMiBxcG4sCi0JCQkgIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfQ09ORl9TUEVDSUFMX1FQKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHR5cGUsIHUzMiBxcG4pCiB7CiAJdTggb3BfbW9kOwogCkBAIC0xODI1LDEyICsxODUzLDEyIEBACiAJfQogCiAJcmV0dXJuIG10aGNhX2NtZChkZXYsIDAsIHFwbiwgb3BfbW9kLCBDTURfQ09ORl9TUEVDSUFMX1FQLAotCQkJIENNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CisJCQkgQ01EX1RJTUVfQ0xBU1NfQik7CiB9CiAKIGludCBtdGhjYV9NQURfSUZDKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IGlnbm9yZV9ta2V5LCBpbnQgaWdub3JlX2JrZXksCiAJCSAgaW50IHBvcnQsIHN0cnVjdCBpYl93YyAqaW5fd2MsIHN0cnVjdCBpYl9ncmggKmluX2dyaCwKLQkJICB2b2lkICppbl9tYWQsIHZvaWQgKnJlc3BvbnNlX21hZCwgdTggKnN0YXR1cykKKwkJICB2b2lkICppbl9tYWQsIHZvaWQgKnJlc3BvbnNlX21hZCkKIHsKIAlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqaW5tYWlsYm94LCAqb3V0bWFpbGJveDsKIAl2b2lkICppbmJveDsKQEAgLTE4OTcsOSArMTkyNSw5IEBACiAKIAllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgaW5tYWlsYm94LT5kbWEsIG91dG1haWxib3gtPmRtYSwKIAkJCSAgICBpbl9tb2RpZmllciwgb3BfbW9kaWZpZXIsCi0JCQkgICAgQ01EX01BRF9JRkMsIENNRF9USU1FX0NMQVNTX0MsIHN0YXR1cyk7CisJCQkgICAgQ01EX01BRF9JRkMsIENNRF9USU1FX0NMQVNTX0MpOwogCi0JaWYgKCFlcnIgJiYgISpzdGF0dXMpCisJaWYgKCFlcnIpCiAJCW1lbWNweShyZXNwb25zZV9tYWQsIG91dG1haWxib3gtPmJ1ZiwgMjU2KTsKIAogCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIGlubWFpbGJveCk7CkBAIC0xOTA4LDMzICsxOTM2LDMzIEBACiB9CiAKIGludCBtdGhjYV9SRUFEX01HTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBpbmRleCwKLQkJICAgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsIHU4ICpzdGF0dXMpCisJCSAgIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94KQogewogCXJldHVybiBtdGhjYV9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCBpbmRleCwgMCwKLQkJCSAgICAgQ01EX1JFQURfTUdNLCBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOworCQkJICAgICBDTURfUkVBRF9NR00sIENNRF9USU1FX0NMQVNTX0EpOwogfQogCiBpbnQgbXRoY2FfV1JJVEVfTUdNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IGluZGV4LAotCQkgICAgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsIHU4ICpzdGF0dXMpCisJCSAgICBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCkKIHsKIAlyZXR1cm4gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBpbmRleCwgMCwgQ01EX1dSSVRFX01HTSwKLQkJCSBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOworCQkJIENNRF9USU1FX0NMQVNTX0EpOwogfQogCiBpbnQgbXRoY2FfTUdJRF9IQVNIKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCi0JCSAgICB1MTYgKmhhc2gsIHU4ICpzdGF0dXMpCisJCSAgICB1MTYgKmhhc2gpCiB7CiAJdTY0IGltbTsKIAlpbnQgZXJyOwogCiAJZXJyID0gbXRoY2FfY21kX2ltbShkZXYsIG1haWxib3gtPmRtYSwgJmltbSwgMCwgMCwgQ01EX01HSURfSEFTSCwKLQkJCSAgICBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOworCQkJICAgIENNRF9USU1FX0NMQVNTX0EpOwogCiAJKmhhc2ggPSBpbW07CiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG10aGNhX05PUChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfTk9QKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKLQlyZXR1cm4gbXRoY2FfY21kKGRldiwgMCwgMHgxZiwgMCwgQ01EX05PUCwgbXNlY3NfdG9famlmZmllcygxMDApLCBzdGF0dXMpOworCXJldHVybiBtdGhjYV9jbWQoZGV2LCAwLCAweDFmLCAwLCBDTURfTk9QLCBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5oCmluZGV4IDZlZmQzMjYuLmY5NTIyNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmgKQEAgLTI1Miw3OSArMjUyLDc0IEBACiAJCQkJCSAgZ2ZwX3QgZ2ZwX21hc2spOwogdm9pZCBtdGhjYV9mcmVlX21haWxib3goc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCk7CiAKLWludCBtdGhjYV9TWVNfRU4oc3RydWN0IG10aGNhX2RldiAqZGV2LCB1OCAqc3RhdHVzKTsKLWludCBtdGhjYV9TWVNfRElTKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfTUFQX0ZBKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX2ljbSAqaWNtLCB1OCAqc3RhdHVzKTsKLWludCBtdGhjYV9VTk1BUF9GQShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX1JVTl9GVyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX1FVRVJZX0ZXKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfRU5BQkxFX0xBTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX0RJU0FCTEVfTEFNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfUVVFUllfRERSKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cyk7CitpbnQgbXRoY2FfU1lTX0VOKHN0cnVjdCBtdGhjYV9kZXYgKmRldik7CitpbnQgbXRoY2FfU1lTX0RJUyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOworaW50IG10aGNhX01BUF9GQShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9pY20gKmljbSk7CitpbnQgbXRoY2FfVU5NQVBfRkEoc3RydWN0IG10aGNhX2RldiAqZGV2KTsKK2ludCBtdGhjYV9SVU5fRlcoc3RydWN0IG10aGNhX2RldiAqZGV2KTsKK2ludCBtdGhjYV9RVUVSWV9GVyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOworaW50IG10aGNhX0VOQUJMRV9MQU0oc3RydWN0IG10aGNhX2RldiAqZGV2KTsKK2ludCBtdGhjYV9ESVNBQkxFX0xBTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOworaW50IG10aGNhX1FVRVJZX0REUihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOwogaW50IG10aGNhX1FVRVJZX0RFVl9MSU0oc3RydWN0IG10aGNhX2RldiAqZGV2LAotCQkJc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0sIHU4ICpzdGF0dXMpOworCQkJc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0pOwogaW50IG10aGNhX1FVRVJZX0FEQVBURVIoc3RydWN0IG10aGNhX2RldiAqZGV2LAotCQkJc3RydWN0IG10aGNhX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpzdGF0dXMpOworCQkJc3RydWN0IG10aGNhX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IG10aGNhX0lOSVRfSENBKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKLQkJICAgc3RydWN0IG10aGNhX2luaXRfaGNhX3BhcmFtICpwYXJhbSwKLQkJICAgdTggKnN0YXR1cyk7CisJCSAgIHN0cnVjdCBtdGhjYV9pbml0X2hjYV9wYXJhbSAqcGFyYW0pOwogaW50IG10aGNhX0lOSVRfSUIoc3RydWN0IG10aGNhX2RldiAqZGV2LAogCQkgIHN0cnVjdCBtdGhjYV9pbml0X2liX3BhcmFtICpwYXJhbSwKLQkJICBpbnQgcG9ydCwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfQ0xPU0VfSUIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgcG9ydCwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfQ0xPU0VfSENBKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHBhbmljLCB1OCAqc3RhdHVzKTsKKwkJICBpbnQgcG9ydCk7CitpbnQgbXRoY2FfQ0xPU0VfSUIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgcG9ydCk7CitpbnQgbXRoY2FfQ0xPU0VfSENBKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHBhbmljKTsKIGludCBtdGhjYV9TRVRfSUIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2Ffc2V0X2liX3BhcmFtICpwYXJhbSwKLQkJIGludCBwb3J0LCB1OCAqc3RhdHVzKTsKLWludCBtdGhjYV9NQVBfSUNNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX2ljbSAqaWNtLCB1NjQgdmlydCwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfTUFQX0lDTV9wYWdlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTY0IGRtYV9hZGRyLCB1NjQgdmlydCwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfVU5NQVBfSUNNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTY0IHZpcnQsIHUzMiBwYWdlX2NvdW50LCB1OCAqc3RhdHVzKTsKLWludCBtdGhjYV9NQVBfSUNNX0FVWChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9pY20gKmljbSwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfVU5NQVBfSUNNX0FVWChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX1NFVF9JQ01fU0laRShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU2NCBpY21fc2l6ZSwgdTY0ICphdXhfcGFnZXMsCi0JCSAgICAgICB1OCAqc3RhdHVzKTsKKwkJIGludCBwb3J0KTsKK2ludCBtdGhjYV9NQVBfSUNNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX2ljbSAqaWNtLCB1NjQgdmlydCk7CitpbnQgbXRoY2FfTUFQX0lDTV9wYWdlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTY0IGRtYV9hZGRyLCB1NjQgdmlydCk7CitpbnQgbXRoY2FfVU5NQVBfSUNNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTY0IHZpcnQsIHUzMiBwYWdlX2NvdW50KTsKK2ludCBtdGhjYV9NQVBfSUNNX0FVWChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9pY20gKmljbSk7CitpbnQgbXRoY2FfVU5NQVBfSUNNX0FVWChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOworaW50IG10aGNhX1NFVF9JQ01fU0laRShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU2NCBpY21fc2l6ZSwgdTY0ICphdXhfcGFnZXMpOwogaW50IG10aGNhX1NXMkhXX01QVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAotCQkgICAgaW50IG1wdF9pbmRleCwgdTggKnN0YXR1cyk7CisJCSAgICBpbnQgbXB0X2luZGV4KTsKIGludCBtdGhjYV9IVzJTV19NUFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKLQkJICAgIGludCBtcHRfaW5kZXgsIHU4ICpzdGF0dXMpOworCQkgICAgaW50IG1wdF9pbmRleCk7CiBpbnQgbXRoY2FfV1JJVEVfTVRUKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCi0JCSAgICBpbnQgbnVtX210dCwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfU1lOQ19UUFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1OCAqc3RhdHVzKTsKKwkJICAgIGludCBudW1fbXR0KTsKK2ludCBtdGhjYV9TWU5DX1RQVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOwogaW50IG10aGNhX01BUF9FUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU2NCBldmVudF9tYXNrLCBpbnQgdW5tYXAsCi0JCSBpbnQgZXFfbnVtLCB1OCAqc3RhdHVzKTsKKwkJIGludCBlcV9udW0pOwogaW50IG10aGNhX1NXMkhXX0VRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCi0JCSAgIGludCBlcV9udW0sIHU4ICpzdGF0dXMpOworCQkgICBpbnQgZXFfbnVtKTsKIGludCBtdGhjYV9IVzJTV19FUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAotCQkgICBpbnQgZXFfbnVtLCB1OCAqc3RhdHVzKTsKKwkJICAgaW50IGVxX251bSk7CiBpbnQgbXRoY2FfU1cySFdfQ1Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKLQkJICAgaW50IGNxX251bSwgdTggKnN0YXR1cyk7CisJCSAgIGludCBjcV9udW0pOwogaW50IG10aGNhX0hXMlNXX0NRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCi0JCSAgIGludCBjcV9udW0sIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX1JFU0laRV9DUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBjcV9udW0sIHUzMiBsa2V5LCB1OCBsb2dfc2l6ZSwKLQkJICAgIHU4ICpzdGF0dXMpOworCQkgICBpbnQgY3FfbnVtKTsKK2ludCBtdGhjYV9SRVNJWkVfQ1Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgY3FfbnVtLCB1MzIgbGtleSwgdTggbG9nX3NpemUpOwogaW50IG10aGNhX1NXMkhXX1NSUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAotCQkgICAgaW50IHNycV9udW0sIHU4ICpzdGF0dXMpOworCQkgICAgaW50IHNycV9udW0pOwogaW50IG10aGNhX0hXMlNXX1NSUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAotCQkgICAgaW50IHNycV9udW0sIHU4ICpzdGF0dXMpOworCQkgICAgaW50IHNycV9udW0pOwogaW50IG10aGNhX1FVRVJZX1NSUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBudW0sCi0JCSAgICBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfQVJNX1NSUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBzcnFfbnVtLCBpbnQgbGltaXQsIHU4ICpzdGF0dXMpOworCQkgICAgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gpOworaW50IG10aGNhX0FSTV9TUlEoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgc3JxX251bSwgaW50IGxpbWl0KTsKIGludCBtdGhjYV9NT0RJRllfUVAoc3RydWN0IG10aGNhX2RldiAqZGV2LCBlbnVtIGliX3FwX3N0YXRlIGN1ciwKIAkJICAgIGVudW0gaWJfcXBfc3RhdGUgbmV4dCwgdTMyIG51bSwgaW50IGlzX2VlLAotCQkgICAgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsIHUzMiBvcHRtYXNrLAotCQkgICAgdTggKnN0YXR1cyk7CisJCSAgICBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwgdTMyIG9wdG1hc2spOwogaW50IG10aGNhX1FVRVJZX1FQKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTMyIG51bSwgaW50IGlzX2VlLAotCQkgICBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfQ09ORl9TUEVDSUFMX1FQKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHR5cGUsIHUzMiBxcG4sCi0JCQkgIHU4ICpzdGF0dXMpOworCQkgICBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCk7CitpbnQgbXRoY2FfQ09ORl9TUEVDSUFMX1FQKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHR5cGUsIHUzMiBxcG4pOwogaW50IG10aGNhX01BRF9JRkMoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgaWdub3JlX21rZXksIGludCBpZ25vcmVfYmtleSwKIAkJICBpbnQgcG9ydCwgc3RydWN0IGliX3djICppbl93Yywgc3RydWN0IGliX2dyaCAqaW5fZ3JoLAotCQkgIHZvaWQgKmluX21hZCwgdm9pZCAqcmVzcG9uc2VfbWFkLCB1OCAqc3RhdHVzKTsKKwkJICB2b2lkICppbl9tYWQsIHZvaWQgKnJlc3BvbnNlX21hZCk7CiBpbnQgbXRoY2FfUkVBRF9NR00oc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgaW5kZXgsCi0JCSAgIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LCB1OCAqc3RhdHVzKTsKKwkJICAgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gpOwogaW50IG10aGNhX1dSSVRFX01HTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBpbmRleCwKLQkJICAgIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LCB1OCAqc3RhdHVzKTsKKwkJICAgIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94KTsKIGludCBtdGhjYV9NR0lEX0hBU0goc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKLQkJICAgIHUxNiAqaGFzaCwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfTk9QKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cyk7CisJCSAgICB1MTYgKmhhc2gpOworaW50IG10aGNhX05PUChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOwogCiAjZW5kaWYgLyogTVRIQ0FfQ01EX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMKaW5kZXggMThlZTNmYS4uNTMxNTdiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMKQEAgLTc3OSw3ICs3NzksNiBAQAogCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXN0cnVjdCBtdGhjYV9jcV9jb250ZXh0ICpjcV9jb250ZXh0OwogCWludCBlcnIgPSAtRU5PTUVNOwotCXU4IHN0YXR1czsKIAogCWNxLT5pYmNxLmNxZSAgPSBuZW50IC0gMTsKIAljcS0+aXNfa2VybmVsID0gIWN0eDsKQEAgLTg0NywxOSArODQ2LDEyIEBACiAJCWNxX2NvbnRleHQtPnN0YXRlX2RiID0gY3B1X3RvX2JlMzIoY3EtPmFybV9kYl9pbmRleCk7CiAJfQogCi0JZXJyID0gbXRoY2FfU1cySFdfQ1EoZGV2LCBtYWlsYm94LCBjcS0+Y3FuLCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9TVzJIV19DUShkZXYsIG1haWxib3gsIGNxLT5jcW4pOwogCWlmIChlcnIpIHsKIAkJbXRoY2Ffd2FybihkZXYsICJTVzJIV19DUSBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfbXI7CiAJfQogCi0JaWYgKHN0YXR1cykgewotCQltdGhjYV93YXJuKGRldiwgIlNXMkhXX0NRIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsCi0JCQkgICBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9vdXRfZnJlZV9tcjsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxKCZkZXYtPmNxX3RhYmxlLmxvY2spOwogCWlmIChtdGhjYV9hcnJheV9zZXQoJmRldi0+Y3FfdGFibGUuY3EsCiAJCQkgICAgY3EtPmNxbiAmIChkZXYtPmxpbWl0cy5udW1fY3FzIC0gMSksCkBAIC05MTUsNyArOTA3LDYgQEAKIHsKIAlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAlpbnQgZXJyOwotCXU4IHN0YXR1czsKIAogCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CiAJaWYgKElTX0VSUihtYWlsYm94KSkgewpAQCAtOTIzLDExICs5MTQsOSBAQAogCQlyZXR1cm47CiAJfQogCi0JZXJyID0gbXRoY2FfSFcyU1dfQ1EoZGV2LCBtYWlsYm94LCBjcS0+Y3FuLCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9IVzJTV19DUShkZXYsIG1haWxib3gsIGNxLT5jcW4pOwogCWlmIChlcnIpCiAJCW10aGNhX3dhcm4oZGV2LCAiSFcyU1dfQ1EgZmFpbGVkICglZClcbiIsIGVycik7Ci0JZWxzZSBpZiAoc3RhdHVzKQotCQltdGhjYV93YXJuKGRldiwgIkhXMlNXX0NRIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsIHN0YXR1cyk7CiAKIAlpZiAoMCkgewogCQlfX2JlMzIgKmN0eCA9IG1haWxib3gtPmJ1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9lcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2VxLmMKaW5kZXggNzY3ODVjNi4uN2M5ZDM1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2VxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2VxLmMKQEAgLTQ3NCw3ICs0NzQsNiBAQAogCXN0cnVjdCBtdGhjYV9lcV9jb250ZXh0ICplcV9jb250ZXh0OwogCWludCBlcnIgPSAtRU5PTUVNOwogCWludCBpOwotCXU4IHN0YXR1czsKIAogCWVxLT5kZXYgID0gZGV2OwogCWVxLT5uZW50ID0gcm91bmR1cF9wb3dfb2ZfdHdvKG1heChuZW50LCAyKSk7CkBAIC01NDMsMTUgKzU0Miw5IEBACiAJZXFfY29udGV4dC0+aW50ciAgICAgICAgICAgID0gaW50cjsKIAllcV9jb250ZXh0LT5sa2V5ICAgICAgICAgICAgPSBjcHVfdG9fYmUzMihlcS0+bXIuaWJtci5sa2V5KTsKIAotCWVyciA9IG10aGNhX1NXMkhXX0VRKGRldiwgbWFpbGJveCwgZXEtPmVxbiwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfU1cySFdfRVEoZGV2LCBtYWlsYm94LCBlcS0+ZXFuKTsKIAlpZiAoZXJyKSB7Ci0JCW10aGNhX3dhcm4oZGV2LCAiU1cySFdfRVEgZmFpbGVkICglZClcbiIsIGVycik7Ci0JCWdvdG8gZXJyX291dF9mcmVlX21yOwotCX0KLQlpZiAoc3RhdHVzKSB7Ci0JCW10aGNhX3dhcm4oZGV2LCAiU1cySFdfRVEgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeFxuIiwKLQkJCSAgIHN0YXR1cyk7Ci0JCWVyciA9IC1FSU5WQUw7CisJCW10aGNhX3dhcm4oZGV2LCAiU1cySFdfRVEgcmV0dXJuZWQgJWRcbiIsIGVycik7CiAJCWdvdG8gZXJyX291dF9mcmVlX21yOwogCX0KIApAQCAtNTk3LDcgKzU5MCw2IEBACiB7CiAJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJaW50IGVycjsKLQl1OCBzdGF0dXM7CiAJaW50IG5wYWdlcyA9IChlcS0+bmVudCAqIE1USENBX0VRX0VOVFJZX1NJWkUgKyBQQUdFX1NJWkUgLSAxKSAvCiAJCVBBR0VfU0laRTsKIAlpbnQgaTsKQEAgLTYwNiwxMSArNTk4LDkgQEAKIAlpZiAoSVNfRVJSKG1haWxib3gpKQogCQlyZXR1cm47CiAKLQllcnIgPSBtdGhjYV9IVzJTV19FUShkZXYsIG1haWxib3gsIGVxLT5lcW4sICZzdGF0dXMpOworCWVyciA9IG10aGNhX0hXMlNXX0VRKGRldiwgbWFpbGJveCwgZXEtPmVxbik7CiAJaWYgKGVycikKLQkJbXRoY2Ffd2FybihkZXYsICJIVzJTV19FUSBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQlpZiAoc3RhdHVzKQotCQltdGhjYV93YXJuKGRldiwgIkhXMlNXX0VRIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsIHN0YXR1cyk7CisJCW10aGNhX3dhcm4oZGV2LCAiSFcyU1dfRVEgcmV0dXJuZWQgJWRcbiIsIGVycik7CiAKIAlkZXYtPmVxX3RhYmxlLmFybV9tYXNrICY9IH5lcS0+ZXFuX21hc2s7CiAKQEAgLTczOCw3ICs3MjgsNiBAQAogaW50IG10aGNhX21hcF9lcV9pY20oc3RydWN0IG10aGNhX2RldiAqZGV2LCB1NjQgaWNtX3ZpcnQpCiB7CiAJaW50IHJldDsKLQl1OCBzdGF0dXM7CiAKIAkvKgogCSAqIFdlIGFzc3VtZSB0aGF0IG1hcHBpbmcgb25lIHBhZ2UgaXMgZW5vdWdoIGZvciB0aGUgd2hvbGUgRVEKQEAgLTc1Nyw5ICs3NDYsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZXQgPSBtdGhjYV9NQVBfSUNNX3BhZ2UoZGV2LCBkZXYtPmVxX3RhYmxlLmljbV9kbWEsIGljbV92aXJ0LCAmc3RhdHVzKTsKLQlpZiAoIXJldCAmJiBzdGF0dXMpCi0JCXJldCA9IC1FSU5WQUw7CisJcmV0ID0gbXRoY2FfTUFQX0lDTV9wYWdlKGRldiwgZGV2LT5lcV90YWJsZS5pY21fZG1hLCBpY21fdmlydCk7CiAJaWYgKHJldCkgewogCQlwY2lfdW5tYXBfcGFnZShkZXYtPnBkZXYsIGRldi0+ZXFfdGFibGUuaWNtX2RtYSwgUEFHRV9TSVpFLAogCQkJICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CkBAIC03NzEsOSArNzU4LDcgQEAKIAogdm9pZCBtdGhjYV91bm1hcF9lcV9pY20oc3RydWN0IG10aGNhX2RldiAqZGV2KQogewotCXU4IHN0YXR1czsKLQotCW10aGNhX1VOTUFQX0lDTShkZXYsIGRldi0+ZXFfdGFibGUuaWNtX3ZpcnQsIDEsICZzdGF0dXMpOworCW10aGNhX1VOTUFQX0lDTShkZXYsIGRldi0+ZXFfdGFibGUuaWNtX3ZpcnQsIDEpOwogCXBjaV91bm1hcF9wYWdlKGRldi0+cGRldiwgZGV2LT5lcV90YWJsZS5pY21fZG1hLCBQQUdFX1NJWkUsCiAJCSAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCV9fZnJlZV9wYWdlKGRldi0+ZXFfdGFibGUuaWNtX3BhZ2UpOwpAQCAtNzgyLDcgKzc2Nyw2IEBACiBpbnQgbXRoY2FfaW5pdF9lcV90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJaW50IGVycjsKLQl1OCBzdGF0dXM7CiAJdTggaW50cjsKIAlpbnQgaTsKIApAQCAtODY0LDIyICs4NDgsMTYgQEAKIAl9CiAKIAllcnIgPSBtdGhjYV9NQVBfRVEoZGV2LCBhc3luY19tYXNrKGRldiksCi0JCQkgICAwLCBkZXYtPmVxX3RhYmxlLmVxW01USENBX0VRX0FTWU5DXS5lcW4sICZzdGF0dXMpOworCQkJICAgMCwgZGV2LT5lcV90YWJsZS5lcVtNVEhDQV9FUV9BU1lOQ10uZXFuKTsKIAlpZiAoZXJyKQogCQltdGhjYV93YXJuKGRldiwgIk1BUF9FUSBmb3IgYXN5bmMgRVEgJWQgZmFpbGVkICglZClcbiIsCiAJCQkgICBkZXYtPmVxX3RhYmxlLmVxW01USENBX0VRX0FTWU5DXS5lcW4sIGVycik7Ci0JaWYgKHN0YXR1cykKLQkJbXRoY2Ffd2FybihkZXYsICJNQVBfRVEgZm9yIGFzeW5jIEVRICVkIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsCi0JCQkgICBkZXYtPmVxX3RhYmxlLmVxW01USENBX0VRX0FTWU5DXS5lcW4sIHN0YXR1cyk7CiAKIAllcnIgPSBtdGhjYV9NQVBfRVEoZGV2LCBNVEhDQV9DTURfRVZFTlRfTUFTSywKLQkJCSAgIDAsIGRldi0+ZXFfdGFibGUuZXFbTVRIQ0FfRVFfQ01EXS5lcW4sICZzdGF0dXMpOworCQkJICAgMCwgZGV2LT5lcV90YWJsZS5lcVtNVEhDQV9FUV9DTURdLmVxbik7CiAJaWYgKGVycikKIAkJbXRoY2Ffd2FybihkZXYsICJNQVBfRVEgZm9yIGNtZCBFUSAlZCBmYWlsZWQgKCVkKVxuIiwKIAkJCSAgIGRldi0+ZXFfdGFibGUuZXFbTVRIQ0FfRVFfQ01EXS5lcW4sIGVycik7Ci0JaWYgKHN0YXR1cykKLQkJbXRoY2Ffd2FybihkZXYsICJNQVBfRVEgZm9yIGNtZCBFUSAlZCByZXR1cm5lZCBzdGF0dXMgMHglMDJ4XG4iLAotCQkJICAgZGV2LT5lcV90YWJsZS5lcVtNVEhDQV9FUV9DTURdLmVxbiwgc3RhdHVzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBNVEhDQV9OVU1fRVE7ICsraSkKIAkJaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkKQEAgLTkwOSwxNSArODg3LDE0IEBACiAKIHZvaWQgbXRoY2FfY2xlYW51cF9lcV90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7Ci0JdTggc3RhdHVzOwogCWludCBpOwogCiAJbXRoY2FfZnJlZV9pcnFzKGRldik7CiAKIAltdGhjYV9NQVBfRVEoZGV2LCBhc3luY19tYXNrKGRldiksCi0JCSAgICAgMSwgZGV2LT5lcV90YWJsZS5lcVtNVEhDQV9FUV9BU1lOQ10uZXFuLCAmc3RhdHVzKTsKKwkJICAgICAxLCBkZXYtPmVxX3RhYmxlLmVxW01USENBX0VRX0FTWU5DXS5lcW4pOwogCW10aGNhX01BUF9FUShkZXYsIE1USENBX0NNRF9FVkVOVF9NQVNLLAotCQkgICAgIDEsIGRldi0+ZXFfdGFibGUuZXFbTVRIQ0FfRVFfQ01EXS5lcW4sICZzdGF0dXMpOworCQkgICAgIDEsIGRldi0+ZXFfdGFibGUuZXFbTVRIQ0FfRVFfQ01EXS5lcW4pOwogCiAJZm9yIChpID0gMDsgaSA8IE1USENBX05VTV9FUTsgKytpKQogCQltdGhjYV9mcmVlX2VxKGRldiwgJmRldi0+ZXFfdGFibGUuZXFbaV0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21hZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21hZC5jCmluZGV4IDAzYTU5NTM0Li5iNmY3ZjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21hZC5jCkBAIC0yMDEsNyArMjAxLDYgQEAKIAkJICAgICAgc3RydWN0IGliX21hZCAqb3V0X21hZCkKIHsKIAlpbnQgZXJyOwotCXU4IHN0YXR1czsKIAl1MTYgc2xpZCA9IGluX3djID8gaW5fd2MtPnNsaWQgOiBiZTE2X3RvX2NwdShJQl9MSURfUEVSTUlTU0lWRSk7CiAJdTE2IHByZXZfbGlkID0gMDsKIAlzdHJ1Y3QgaWJfcG9ydF9hdHRyIHBhdHRyOwpAQCAtMjUyLDE3ICsyNTEsMTEgQEAKIAllcnIgPSBtdGhjYV9NQURfSUZDKHRvX21kZXYoaWJkZXYpLAogCQkJICAgIG1hZF9mbGFncyAmIElCX01BRF9JR05PUkVfTUtFWSwKIAkJCSAgICBtYWRfZmxhZ3MgJiBJQl9NQURfSUdOT1JFX0JLRVksCi0JCQkgICAgcG9ydF9udW0sIGluX3djLCBpbl9ncmgsIGluX21hZCwgb3V0X21hZCwKLQkJCSAgICAmc3RhdHVzKTsKLQlpZiAoZXJyKSB7Ci0JCW10aGNhX2Vycih0b19tZGV2KGliZGV2KSwgIk1BRF9JRkMgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIElCX01BRF9SRVNVTFRfRkFJTFVSRTsKLQl9Ci0JaWYgKHN0YXR1cyA9PSBNVEhDQV9DTURfU1RBVF9CQURfUEtUKQorCQkJICAgIHBvcnRfbnVtLCBpbl93YywgaW5fZ3JoLCBpbl9tYWQsIG91dF9tYWQpOworCWlmIChlcnIgPT0gLUVCQURNU0cpCiAJCXJldHVybiBJQl9NQURfUkVTVUxUX1NVQ0NFU1M7Ci0JaWYgKHN0YXR1cykgewotCQltdGhjYV9lcnIodG9fbWRldihpYmRldiksICJNQURfSUZDIHJldHVybmVkIHN0YXR1cyAlMDJ4XG4iLAotCQkJICBzdGF0dXMpOworCWVsc2UgaWYgKGVycikgeworCQltdGhjYV9lcnIodG9fbWRldihpYmRldiksICJNQURfSUZDIHJldHVybmVkICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gSUJfTUFEX1JFU1VMVF9GQUlMVVJFOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMKaW5kZXggZjI0Yjc5Yi4uYWExMmE1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAl9IGVsc2UgaWYgKCEobWRldi0+bXRoY2FfZmxhZ3MgJiBNVEhDQV9GTEFHX1BDSUUpKQogCQltdGhjYV9pbmZvKG1kZXYsICJObyBQQ0ktWCBjYXBhYmlsaXR5LCBub3Qgc2V0dGluZyBSQkMuXG4iKTsKIAotCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KG1kZXYtPnBkZXYsIFBDSV9DQVBfSURfRVhQKSkgeworCWlmIChwY2lfaXNfcGNpZShtZGV2LT5wZGV2KSkgewogCQlpZiAocGNpZV9zZXRfcmVhZHJxKG1kZXYtPnBkZXYsIDQwOTYpKSB7CiAJCQltdGhjYV9lcnIobWRldiwgIkNvdWxkbid0IHdyaXRlIFBDSSBFeHByZXNzIHJlYWQgcmVxdWVzdCwgIgogCQkJCSJhYm9ydGluZy5cbiIpOwpAQCAtMTY1LDE5ICsxNjUsMTQgQEAKIHN0YXRpYyBpbnQgbXRoY2FfZGV2X2xpbShzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2LCBzdHJ1Y3QgbXRoY2FfZGV2X2xpbSAqZGV2X2xpbSkKIHsKIAlpbnQgZXJyOwotCXU4IHN0YXR1czsKIAogCW1kZXYtPmxpbWl0cy5tdHRfc2VnX3NpemUgPSAoMSA8PCBsb2dfbXR0c19wZXJfc2VnKSAqIDg7Ci0JZXJyID0gbXRoY2FfUVVFUllfREVWX0xJTShtZGV2LCBkZXZfbGltLCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9RVUVSWV9ERVZfTElNKG1kZXYsIGRldl9saW0pOwogCWlmIChlcnIpIHsKLQkJbXRoY2FfZXJyKG1kZXYsICJRVUVSWV9ERVZfTElNIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQltdGhjYV9lcnIobWRldiwgIlFVRVJZX0RFVl9MSU0gY29tbWFuZCByZXR1cm5lZCAlZCIKKwkJCQkiLCBhYm9ydGluZy5cbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQotCWlmIChzdGF0dXMpIHsKLQkJbXRoY2FfZXJyKG1kZXYsICJRVUVSWV9ERVZfTElNIHJldHVybmVkIHN0YXR1cyAweCUwMngsICIKLQkJCSAgImFib3J0aW5nLlxuIiwgc3RhdHVzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCWlmIChkZXZfbGltLT5taW5fcGFnZV9zeiA+IFBBR0VfU0laRSkgewogCQltdGhjYV9lcnIobWRldiwgIkhDQSBtaW5pbXVtIHBhZ2Ugc2l6ZSBvZiAlZCBiaWdnZXIgdGhhbiAiCiAJCQkgICJrZXJuZWwgUEFHRV9TSVpFIG9mICVsZCwgYWJvcnRpbmcuXG4iLApAQCAtMjkzLDQ5ICsyODgsMzIgQEAKIHN0YXRpYyBpbnQgbXRoY2FfaW5pdF90YXZvcihzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2KQogewogCXM2NCBzaXplOwotCXU4IHN0YXR1czsKIAlpbnQgZXJyOwogCXN0cnVjdCBtdGhjYV9kZXZfbGltICAgICAgICBkZXZfbGltOwogCXN0cnVjdCBtdGhjYV9wcm9maWxlICAgICAgICBwcm9maWxlOwogCXN0cnVjdCBtdGhjYV9pbml0X2hjYV9wYXJhbSBpbml0X2hjYTsKIAotCWVyciA9IG10aGNhX1NZU19FTihtZGV2LCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9TWVNfRU4obWRldik7CiAJaWYgKGVycikgewotCQltdGhjYV9lcnIobWRldiwgIlNZU19FTiBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJbXRoY2FfZXJyKG1kZXYsICJTWVNfRU4gY29tbWFuZCByZXR1cm5lZCAlZCwgYWJvcnRpbmcuXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlpZiAoc3RhdHVzKSB7Ci0JCW10aGNhX2VycihtZGV2LCAiU1lTX0VOIHJldHVybmVkIHN0YXR1cyAweCUwMngsICIKLQkJCSAgImFib3J0aW5nLlxuIiwgc3RhdHVzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCi0JZXJyID0gbXRoY2FfUVVFUllfRlcobWRldiwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfUVVFUllfRlcobWRldik7CiAJaWYgKGVycikgewotCQltdGhjYV9lcnIobWRldiwgIlFVRVJZX0ZXIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQltdGhjYV9lcnIobWRldiwgIlFVRVJZX0ZXIGNvbW1hbmQgcmV0dXJuZWQgJWQsIgorCQkJCSIgYWJvcnRpbmcuXG4iLCBlcnIpOwogCQlnb3RvIGVycl9kaXNhYmxlOwogCX0KLQlpZiAoc3RhdHVzKSB7Ci0JCW10aGNhX2VycihtZGV2LCAiUVVFUllfRlcgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeCwgIgotCQkJICAiYWJvcnRpbmcuXG4iLCBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9kaXNhYmxlOwotCX0KLQllcnIgPSBtdGhjYV9RVUVSWV9ERFIobWRldiwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfUVVFUllfRERSKG1kZXYpOwogCWlmIChlcnIpIHsKLQkJbXRoY2FfZXJyKG1kZXYsICJRVUVSWV9ERFIgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX2Rpc2FibGU7Ci0JfQotCWlmIChzdGF0dXMpIHsKLQkJbXRoY2FfZXJyKG1kZXYsICJRVUVSWV9ERFIgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeCwgIgotCQkJICAiYWJvcnRpbmcuXG4iLCBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOworCQltdGhjYV9lcnIobWRldiwgIlFVRVJZX0REUiBjb21tYW5kIHJldHVybmVkICVkLCBhYm9ydGluZy5cbiIsIGVycik7CiAJCWdvdG8gZXJyX2Rpc2FibGU7CiAJfQogCiAJZXJyID0gbXRoY2FfZGV2X2xpbShtZGV2LCAmZGV2X2xpbSk7CiAJaWYgKGVycikgewotCQltdGhjYV9lcnIobWRldiwgIlFVRVJZX0RFVl9MSU0gY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCW10aGNhX2VycihtZGV2LCAiUVVFUllfREVWX0xJTSBjb21tYW5kIHJldHVybmVkICVkLCBhYm9ydGluZy5cbiIsIGVycik7CiAJCWdvdG8gZXJyX2Rpc2FibGU7CiAJfQogCkBAIC0zNTEsMjkgKzMyOSwyMiBAQAogCQlnb3RvIGVycl9kaXNhYmxlOwogCX0KIAotCWVyciA9IG10aGNhX0lOSVRfSENBKG1kZXYsICZpbml0X2hjYSwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfSU5JVF9IQ0EobWRldiwgJmluaXRfaGNhKTsKIAlpZiAoZXJyKSB7Ci0JCW10aGNhX2VycihtZGV2LCAiSU5JVF9IQ0EgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX2Rpc2FibGU7Ci0JfQotCWlmIChzdGF0dXMpIHsKLQkJbXRoY2FfZXJyKG1kZXYsICJJTklUX0hDQSByZXR1cm5lZCBzdGF0dXMgMHglMDJ4LCAiCi0JCQkgICJhYm9ydGluZy5cbiIsIHN0YXR1cyk7Ci0JCWVyciA9IC1FSU5WQUw7CisJCW10aGNhX2VycihtZGV2LCAiSU5JVF9IQ0EgY29tbWFuZCByZXR1cm5lZCAlZCwgYWJvcnRpbmcuXG4iLCBlcnIpOwogCQlnb3RvIGVycl9kaXNhYmxlOwogCX0KIAogCXJldHVybiAwOwogCiBlcnJfZGlzYWJsZToKLQltdGhjYV9TWVNfRElTKG1kZXYsICZzdGF0dXMpOworCW10aGNhX1NZU19ESVMobWRldik7CiAKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IG10aGNhX2xvYWRfZncoc3RydWN0IG10aGNhX2RldiAqbWRldikKIHsKLQl1OCBzdGF0dXM7CiAJaW50IGVycjsKIAogCS8qIEZJWE1FOiB1c2UgSENBLWF0dGFjaGVkIG1lbW9yeSBmb3IgRlcgaWYgcHJlc2VudCAqLwpAQCAtMzg2LDMxICszNTcsMjEgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZXJyID0gbXRoY2FfTUFQX0ZBKG1kZXYsIG1kZXYtPmZ3LmFyYmVsLmZ3X2ljbSwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfTUFQX0ZBKG1kZXYsIG1kZXYtPmZ3LmFyYmVsLmZ3X2ljbSk7CiAJaWYgKGVycikgewotCQltdGhjYV9lcnIobWRldiwgIk1BUF9GQSBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJbXRoY2FfZXJyKG1kZXYsICJNQVBfRkEgY29tbWFuZCByZXR1cm5lZCAlZCwgYWJvcnRpbmcuXG4iLCBlcnIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KLQlpZiAoc3RhdHVzKSB7Ci0JCW10aGNhX2VycihtZGV2LCAiTUFQX0ZBIHJldHVybmVkIHN0YXR1cyAweCUwMngsIGFib3J0aW5nLlxuIiwgc3RhdHVzKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBlcnJfZnJlZTsKLQl9Ci0JZXJyID0gbXRoY2FfUlVOX0ZXKG1kZXYsICZzdGF0dXMpOworCWVyciA9IG10aGNhX1JVTl9GVyhtZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCW10aGNhX2VycihtZGV2LCAiUlVOX0ZXIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOwotCQlnb3RvIGVycl91bm1hcF9mYTsKLQl9Ci0JaWYgKHN0YXR1cykgewotCQltdGhjYV9lcnIobWRldiwgIlJVTl9GVyByZXR1cm5lZCBzdGF0dXMgMHglMDJ4LCBhYm9ydGluZy5cbiIsIHN0YXR1cyk7Ci0JCWVyciA9IC1FSU5WQUw7CisJCW10aGNhX2VycihtZGV2LCAiUlVOX0ZXIGNvbW1hbmQgcmV0dXJuZWQgJWQsIGFib3J0aW5nLlxuIiwgZXJyKTsKIAkJZ290byBlcnJfdW5tYXBfZmE7CiAJfQogCiAJcmV0dXJuIDA7CiAKIGVycl91bm1hcF9mYToKLQltdGhjYV9VTk1BUF9GQShtZGV2LCAmc3RhdHVzKTsKKwltdGhjYV9VTk1BUF9GQShtZGV2KTsKIAogZXJyX2ZyZWU6CiAJbXRoY2FfZnJlZV9pY20obWRldiwgbWRldi0+ZncuYXJiZWwuZndfaWNtLCAwKTsKQEAgLTQyMywxOSArMzg0LDEzIEBACiAJCQkgIHU2NCBpY21fc2l6ZSkKIHsKIAl1NjQgYXV4X3BhZ2VzOwotCXU4IHN0YXR1czsKIAlpbnQgZXJyOwogCi0JZXJyID0gbXRoY2FfU0VUX0lDTV9TSVpFKG1kZXYsIGljbV9zaXplLCAmYXV4X3BhZ2VzLCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9TRVRfSUNNX1NJWkUobWRldiwgaWNtX3NpemUsICZhdXhfcGFnZXMpOwogCWlmIChlcnIpIHsKLQkJbXRoY2FfZXJyKG1kZXYsICJTRVRfSUNNX1NJWkUgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCW10aGNhX2VycihtZGV2LCAiU0VUX0lDTV9TSVpFIGNvbW1hbmQgcmV0dXJuZWQgJWQsIGFib3J0aW5nLlxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0JaWYgKHN0YXR1cykgewotCQltdGhjYV9lcnIobWRldiwgIlNFVF9JQ01fU0laRSByZXR1cm5lZCBzdGF0dXMgMHglMDJ4LCAiCi0JCQkgICJhYm9ydGluZy5cbiIsIHN0YXR1cyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAogCW10aGNhX2RiZyhtZGV2LCAiJWxsZCBLQiBvZiBIQ0EgY29udGV4dCByZXF1aXJlcyAlbGxkIEtCIGF1eCBtZW1vcnkuXG4iLAogCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIGljbV9zaXplID4+IDEwLApAQCAtNDQ4LDE0ICs0MDMsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQllcnIgPSBtdGhjYV9NQVBfSUNNX0FVWChtZGV2LCBtZGV2LT5mdy5hcmJlbC5hdXhfaWNtLCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9NQVBfSUNNX0FVWChtZGV2LCBtZGV2LT5mdy5hcmJlbC5hdXhfaWNtKTsKIAlpZiAoZXJyKSB7Ci0JCW10aGNhX2VycihtZGV2LCAiTUFQX0lDTV9BVVggY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX2ZyZWVfYXV4OwotCX0KLQlpZiAoc3RhdHVzKSB7Ci0JCW10aGNhX2VycihtZGV2LCAiTUFQX0lDTV9BVVggcmV0dXJuZWQgc3RhdHVzIDB4JTAyeCwgYWJvcnRpbmcuXG4iLCBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOworCQltdGhjYV9lcnIobWRldiwgIk1BUF9JQ01fQVVYIHJldHVybmVkICVkLCBhYm9ydGluZy5cbiIsIGVycik7CiAJCWdvdG8gZXJyX2ZyZWVfYXV4OwogCX0KIApAQCAtNTk2LDcgKzU0Niw3IEBACiAJbXRoY2FfdW5tYXBfZXFfaWNtKG1kZXYpOwogCiBlcnJfdW5tYXBfYXV4OgotCW10aGNhX1VOTUFQX0lDTV9BVVgobWRldiwgJnN0YXR1cyk7CisJbXRoY2FfVU5NQVBfSUNNX0FVWChtZGV2KTsKIAogZXJyX2ZyZWVfYXV4OgogCW10aGNhX2ZyZWVfaWNtKG1kZXYsIG1kZXYtPmZ3LmFyYmVsLmF1eF9pY20sIDApOwpAQCAtNjA2LDcgKzU1Niw2IEBACiAKIHN0YXRpYyB2b2lkIG10aGNhX2ZyZWVfaWNtcyhzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2KQogewotCXU4IHN0YXR1czsKIAogCW10aGNhX2ZyZWVfaWNtX3RhYmxlKG1kZXYsIG1kZXYtPm1jZ190YWJsZS50YWJsZSk7CiAJaWYgKG1kZXYtPm10aGNhX2ZsYWdzICYgTVRIQ0FfRkxBR19TUlEpCkBAIC02MTksNyArNTY4LDcgQEAKIAltdGhjYV9mcmVlX2ljbV90YWJsZShtZGV2LCBtZGV2LT5tcl90YWJsZS5tdHRfdGFibGUpOwogCW10aGNhX3VubWFwX2VxX2ljbShtZGV2KTsKIAotCW10aGNhX1VOTUFQX0lDTV9BVVgobWRldiwgJnN0YXR1cyk7CisJbXRoY2FfVU5NQVBfSUNNX0FVWChtZGV2KTsKIAltdGhjYV9mcmVlX2ljbShtZGV2LCBtZGV2LT5mdy5hcmJlbC5hdXhfaWNtLCAwKTsKIH0KIApAQCAtNjI5LDQzICs1NzgsMzIgQEAKIAlzdHJ1Y3QgbXRoY2FfcHJvZmlsZSAgICAgICAgcHJvZmlsZTsKIAlzdHJ1Y3QgbXRoY2FfaW5pdF9oY2FfcGFyYW0gaW5pdF9oY2E7CiAJczY0IGljbV9zaXplOwotCXU4IHN0YXR1czsKIAlpbnQgZXJyOwogCi0JZXJyID0gbXRoY2FfUVVFUllfRlcobWRldiwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfUVVFUllfRlcobWRldik7CiAJaWYgKGVycikgewotCQltdGhjYV9lcnIobWRldiwgIlFVRVJZX0ZXIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQltdGhjYV9lcnIobWRldiwgIlFVRVJZX0ZXIGNvbW1hbmQgZmFpbGVkICVkLCBhYm9ydGluZy5cbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQotCWlmIChzdGF0dXMpIHsKLQkJbXRoY2FfZXJyKG1kZXYsICJRVUVSWV9GVyByZXR1cm5lZCBzdGF0dXMgMHglMDJ4LCAiCi0JCQkgICJhYm9ydGluZy5cbiIsIHN0YXR1cyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAotCWVyciA9IG10aGNhX0VOQUJMRV9MQU0obWRldiwgJnN0YXR1cyk7Ci0JaWYgKGVycikgewotCQltdGhjYV9lcnIobWRldiwgIkVOQUJMRV9MQU0gY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCWlmIChzdGF0dXMgPT0gTVRIQ0FfQ01EX1NUQVRfTEFNX05PVF9QUkUpIHsKKwllcnIgPSBtdGhjYV9FTkFCTEVfTEFNKG1kZXYpOworCWlmIChlcnIgPT0gLUVBR0FJTikgewogCQltdGhjYV9kYmcobWRldiwgIk5vIEhDQS1hdHRhY2hlZCBtZW1vcnkgKHJ1bm5pbmcgaW4gTWVtRnJlZSBtb2RlKVxuIik7CiAJCW1kZXYtPm10aGNhX2ZsYWdzIHw9IE1USENBX0ZMQUdfTk9fTEFNOwotCX0gZWxzZSBpZiAoc3RhdHVzKSB7Ci0JCW10aGNhX2VycihtZGV2LCAiRU5BQkxFX0xBTSByZXR1cm5lZCBzdGF0dXMgMHglMDJ4LCAiCi0JCQkgICJhYm9ydGluZy5cbiIsIHN0YXR1cyk7Ci0JCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoZXJyKSB7CisJCW10aGNhX2VycihtZGV2LCAiRU5BQkxFX0xBTSByZXR1cm5lZCAlZCwgYWJvcnRpbmcuXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOwogCX0KIAogCWVyciA9IG10aGNhX2xvYWRfZncobWRldik7CiAJaWYgKGVycikgewotCQltdGhjYV9lcnIobWRldiwgIkZhaWxlZCB0byBzdGFydCBGVywgYWJvcnRpbmcuXG4iKTsKKwkJbXRoY2FfZXJyKG1kZXYsICJMb2FkaW5nIEZXIHJldHVybmVkICVkLCBhYm9ydGluZy5cbiIsIGVycik7CiAJCWdvdG8gZXJyX2Rpc2FibGU7CiAJfQogCiAJZXJyID0gbXRoY2FfZGV2X2xpbShtZGV2LCAmZGV2X2xpbSk7CiAJaWYgKGVycikgewotCQltdGhjYV9lcnIobWRldiwgIlFVRVJZX0RFVl9MSU0gY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCW10aGNhX2VycihtZGV2LCAiUVVFUllfREVWX0xJTSByZXR1cm5lZCAlZCwgYWJvcnRpbmcuXG4iLCBlcnIpOwogCQlnb3RvIGVycl9zdG9wX2Z3OwogCX0KIApAQCAtNjg1LDE1ICs2MjMsOSBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3N0b3BfZnc7CiAKLQllcnIgPSBtdGhjYV9JTklUX0hDQShtZGV2LCAmaW5pdF9oY2EsICZzdGF0dXMpOworCWVyciA9IG10aGNhX0lOSVRfSENBKG1kZXYsICZpbml0X2hjYSk7CiAJaWYgKGVycikgewotCQltdGhjYV9lcnIobWRldiwgIklOSVRfSENBIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOwotCQlnb3RvIGVycl9mcmVlX2ljbTsKLQl9Ci0JaWYgKHN0YXR1cykgewotCQltdGhjYV9lcnIobWRldiwgIklOSVRfSENBIHJldHVybmVkIHN0YXR1cyAweCUwMngsICIKLQkJCSAgImFib3J0aW5nLlxuIiwgc3RhdHVzKTsKLQkJZXJyID0gLUVJTlZBTDsKKwkJbXRoY2FfZXJyKG1kZXYsICJJTklUX0hDQSBjb21tYW5kIHJldHVybmVkICVkLCBhYm9ydGluZy5cbiIsIGVycik7CiAJCWdvdG8gZXJyX2ZyZWVfaWNtOwogCX0KIApAQCAtNzAzLDM3ICs2MzUsMzQgQEAKIAltdGhjYV9mcmVlX2ljbXMobWRldik7CiAKIGVycl9zdG9wX2Z3OgotCW10aGNhX1VOTUFQX0ZBKG1kZXYsICZzdGF0dXMpOworCW10aGNhX1VOTUFQX0ZBKG1kZXYpOwogCW10aGNhX2ZyZWVfaWNtKG1kZXYsIG1kZXYtPmZ3LmFyYmVsLmZ3X2ljbSwgMCk7CiAKIGVycl9kaXNhYmxlOgogCWlmICghKG1kZXYtPm10aGNhX2ZsYWdzICYgTVRIQ0FfRkxBR19OT19MQU0pKQotCQltdGhjYV9ESVNBQkxFX0xBTShtZGV2LCAmc3RhdHVzKTsKKwkJbXRoY2FfRElTQUJMRV9MQU0obWRldik7CiAKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBtdGhjYV9jbG9zZV9oY2Eoc3RydWN0IG10aGNhX2RldiAqbWRldikKIHsKLQl1OCBzdGF0dXM7Ci0KLQltdGhjYV9DTE9TRV9IQ0EobWRldiwgMCwgJnN0YXR1cyk7CisJbXRoY2FfQ0xPU0VfSENBKG1kZXYsIDApOwogCiAJaWYgKG10aGNhX2lzX21lbWZyZWUobWRldikpIHsKIAkJbXRoY2FfZnJlZV9pY21zKG1kZXYpOwogCi0JCW10aGNhX1VOTUFQX0ZBKG1kZXYsICZzdGF0dXMpOworCQltdGhjYV9VTk1BUF9GQShtZGV2KTsKIAkJbXRoY2FfZnJlZV9pY20obWRldiwgbWRldi0+ZncuYXJiZWwuZndfaWNtLCAwKTsKIAogCQlpZiAoIShtZGV2LT5tdGhjYV9mbGFncyAmIE1USENBX0ZMQUdfTk9fTEFNKSkKLQkJCW10aGNhX0RJU0FCTEVfTEFNKG1kZXYsICZzdGF0dXMpOworCQkJbXRoY2FfRElTQUJMRV9MQU0obWRldik7CiAJfSBlbHNlCi0JCW10aGNhX1NZU19ESVMobWRldiwgJnN0YXR1cyk7CisJCW10aGNhX1NZU19ESVMobWRldik7CiB9CiAKIHN0YXRpYyBpbnQgbXRoY2FfaW5pdF9oY2Eoc3RydWN0IG10aGNhX2RldiAqbWRldikKIHsKLQl1OCBzdGF0dXM7CiAJaW50IGVycjsKIAlzdHJ1Y3QgbXRoY2FfYWRhcHRlciBhZGFwdGVyOwogCkBAIC03NDUsMTUgKzY3NCw5IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IG10aGNhX1FVRVJZX0FEQVBURVIobWRldiwgJmFkYXB0ZXIsICZzdGF0dXMpOworCWVyciA9IG10aGNhX1FVRVJZX0FEQVBURVIobWRldiwgJmFkYXB0ZXIpOwogCWlmIChlcnIpIHsKLQkJbXRoY2FfZXJyKG1kZXYsICJRVUVSWV9BREFQVEVSIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOwotCQlnb3RvIGVycl9jbG9zZTsKLQl9Ci0JaWYgKHN0YXR1cykgewotCQltdGhjYV9lcnIobWRldiwgIlFVRVJZX0FEQVBURVIgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeCwgIgotCQkJICAiYWJvcnRpbmcuXG4iLCBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOworCQltdGhjYV9lcnIobWRldiwgIlFVRVJZX0FEQVBURVIgY29tbWFuZCByZXR1cm5lZCAlZCwgYWJvcnRpbmcuXG4iLCBlcnIpOwogCQlnb3RvIGVycl9jbG9zZTsKIAl9CiAKQEAgLTc3Miw3ICs2OTUsNiBAQAogc3RhdGljIGludCBtdGhjYV9zZXR1cF9oY2Eoc3RydWN0IG10aGNhX2RldiAqZGV2KQogewogCWludCBlcnI7Ci0JdTggc3RhdHVzOwogCiAJTVRIQ0FfSU5JVF9ET09SQkVMTF9MT0NLKCZkZXYtPmRvb3JiZWxsX2xvY2spOwogCkBAIC04MzMsOCArNzU1LDggQEAKIAkJZ290byBlcnJfZXFfdGFibGVfZnJlZTsKIAl9CiAKLQllcnIgPSBtdGhjYV9OT1AoZGV2LCAmc3RhdHVzKTsKLQlpZiAoZXJyIHx8IHN0YXR1cykgeworCWVyciA9IG10aGNhX05PUChkZXYpOworCWlmIChlcnIpIHsKIAkJaWYgKGRldi0+bXRoY2FfZmxhZ3MgJiBNVEhDQV9GTEFHX01TSV9YKSB7CiAJCQltdGhjYV93YXJuKGRldiwgIk5PUCBjb21tYW5kIGZhaWxlZCB0byBnZW5lcmF0ZSBpbnRlcnJ1cHQgIgogCQkJCSAgICIoSVJRICVkKS5cbiIsCkBAIC0xMTY2LDcgKzEwODgsNiBAQAogc3RhdGljIHZvaWQgX19tdGhjYV9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBtdGhjYV9kZXYgKm1kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JdTggc3RhdHVzOwogCWludCBwOwogCiAJaWYgKG1kZXYpIHsKQEAgLTExNzQsNyArMTA5NSw3IEBACiAJCW10aGNhX3VucmVnaXN0ZXJfZGV2aWNlKG1kZXYpOwogCiAJCWZvciAocCA9IDE7IHAgPD0gbWRldi0+bGltaXRzLm51bV9wb3J0czsgKytwKQotCQkJbXRoY2FfQ0xPU0VfSUIobWRldiwgcCwgJnN0YXR1cyk7CisJCQltdGhjYV9DTE9TRV9JQihtZGV2LCBwKTsKIAogCQltdGhjYV9jbGVhbnVwX21jZ190YWJsZShtZGV2KTsKIAkJbXRoY2FfY2xlYW51cF9hdl90YWJsZShtZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tY2cuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tY2cuYwppbmRleCA1MTU3OTBhLi42MzA0YWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWNnLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21jZy5jCkBAIC02OCw3ICs2OCw2IEBACiAJc3RydWN0IG10aGNhX21nbSAqbWdtID0gbWdtX21haWxib3gtPmJ1ZjsKIAl1OCAqbWdpZDsKIAlpbnQgZXJyOwotCXU4IHN0YXR1czsKIAogCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CiAJaWYgKElTX0VSUihtYWlsYm94KSkKQEAgLTc3LDEyICs3Niw5IEBACiAKIAltZW1jcHkobWdpZCwgZ2lkLCAxNik7CiAKLQllcnIgPSBtdGhjYV9NR0lEX0hBU0goZGV2LCBtYWlsYm94LCBoYXNoLCAmc3RhdHVzKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQlpZiAoc3RhdHVzKSB7Ci0JCW10aGNhX2VycihkZXYsICJNR0lEX0hBU0ggcmV0dXJuZWQgc3RhdHVzICUwMnhcbiIsIHN0YXR1cyk7Ci0JCWVyciA9IC1FSU5WQUw7CisJZXJyID0gbXRoY2FfTUdJRF9IQVNIKGRldiwgbWFpbGJveCwgaGFzaCk7CisJaWYgKGVycikgeworCQltdGhjYV9lcnIoZGV2LCAiTUdJRF9IQVNIIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTkzLDEyICs4OSw5IEBACiAJKnByZXYgID0gLTE7CiAKIAlkbyB7Ci0JCWVyciA9IG10aGNhX1JFQURfTUdNKGRldiwgKmluZGV4LCBtZ21fbWFpbGJveCwgJnN0YXR1cyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKLQkJaWYgKHN0YXR1cykgewotCQkJbXRoY2FfZXJyKGRldiwgIlJFQURfTUdNIHJldHVybmVkIHN0YXR1cyAlMDJ4XG4iLCBzdGF0dXMpOwotCQkJZXJyID0gLUVJTlZBTDsKKwkJZXJyID0gbXRoY2FfUkVBRF9NR00oZGV2LCAqaW5kZXgsIG1nbV9tYWlsYm94KTsKKwkJaWYgKGVycikgeworCQkJbXRoY2FfZXJyKGRldiwgIlJFQURfTUdNIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQkJZ290byBvdXQ7CiAJCX0KIApAQCAtMTM0LDcgKzEyNyw2IEBACiAJaW50IGxpbmsgPSAwOwogCWludCBpOwogCWludCBlcnI7Ci0JdTggc3RhdHVzOwogCiAJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKIAlpZiAoSVNfRVJSKG1haWxib3gpKQpAQCAtMTYwLDEyICsxNTIsOSBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsIGluZGV4LCBtYWlsYm94LCAmc3RhdHVzKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0OwotCQlpZiAoc3RhdHVzKSB7Ci0JCQltdGhjYV9lcnIoZGV2LCAiUkVBRF9NR00gcmV0dXJuZWQgc3RhdHVzICUwMnhcbiIsIHN0YXR1cyk7Ci0JCQllcnIgPSAtRUlOVkFMOworCQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsIGluZGV4LCBtYWlsYm94KTsKKwkJaWYgKGVycikgeworCQkJbXRoY2FfZXJyKGRldiwgIlJFQURfTUdNIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJbWVtc2V0KG1nbSwgMCwgc2l6ZW9mICptZ20pOwpAQCAtMTg5LDExICsxNzgsOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQllcnIgPSBtdGhjYV9XUklURV9NR00oZGV2LCBpbmRleCwgbWFpbGJveCwgJnN0YXR1cyk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0JaWYgKHN0YXR1cykgewotCQltdGhjYV9lcnIoZGV2LCAiV1JJVEVfTUdNIHJldHVybmVkIHN0YXR1cyAlMDJ4XG4iLCBzdGF0dXMpOworCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIGluZGV4LCBtYWlsYm94KTsKKwlpZiAoZXJyKSB7CisJCW10aGNhX2VycihkZXYsICJXUklURV9NR00gZmFpbGVkICVkXG4iLCBlcnIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMDEsMjQgKzE4OCwxNyBAQAogCWlmICghbGluaykKIAkJZ290byBvdXQ7CiAKLQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsIHByZXYsIG1haWxib3gsICZzdGF0dXMpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCWlmIChzdGF0dXMpIHsKLQkJbXRoY2FfZXJyKGRldiwgIlJFQURfTUdNIHJldHVybmVkIHN0YXR1cyAlMDJ4XG4iLCBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOworCWVyciA9IG10aGNhX1JFQURfTUdNKGRldiwgcHJldiwgbWFpbGJveCk7CisJaWYgKGVycikgeworCQltdGhjYV9lcnIoZGV2LCAiUkVBRF9NR00gZmFpbGVkICVkXG4iLCBlcnIpOwogCQlnb3RvIG91dDsKIAl9CiAKIAltZ20tPm5leHRfZ2lkX2luZGV4ID0gY3B1X3RvX2JlMzIoaW5kZXggPDwgNik7CiAKLQllcnIgPSBtdGhjYV9XUklURV9NR00oZGV2LCBwcmV2LCBtYWlsYm94LCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9XUklURV9NR00oZGV2LCBwcmV2LCBtYWlsYm94KTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQlpZiAoc3RhdHVzKSB7Ci0JCW10aGNhX2VycihkZXYsICJXUklURV9NR00gcmV0dXJuZWQgc3RhdHVzICUwMnhcbiIsIHN0YXR1cyk7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JfQorCQltdGhjYV9lcnIoZGV2LCAiV1JJVEVfTUdNIHJldHVybmVkICVkXG4iLCBlcnIpOwogCiAgb3V0OgogCWlmIChlcnIgJiYgbGluayAmJiBpbmRleCAhPSAtMSkgewpAQCAtMjQwLDcgKzIyMCw2IEBACiAJaW50IHByZXYsIGluZGV4OwogCWludCBpLCBsb2M7CiAJaW50IGVycjsKLQl1OCBzdGF0dXM7CiAKIAltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOwogCWlmIChJU19FUlIobWFpbGJveCkpCkBAIC0yNzUsMTIgKzI1NCw5IEBACiAJbWdtLT5xcFtsb2NdICAgPSBtZ20tPnFwW2kgLSAxXTsKIAltZ20tPnFwW2kgLSAxXSA9IDA7CiAKLQllcnIgPSBtdGhjYV9XUklURV9NR00oZGV2LCBpbmRleCwgbWFpbGJveCwgJnN0YXR1cyk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0JaWYgKHN0YXR1cykgewotCQltdGhjYV9lcnIoZGV2LCAiV1JJVEVfTUdNIHJldHVybmVkIHN0YXR1cyAlMDJ4XG4iLCBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOworCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIGluZGV4LCBtYWlsYm94KTsKKwlpZiAoZXJyKSB7CisJCW10aGNhX2VycihkZXYsICJXUklURV9NR00gcmV0dXJuZWQgJWRcbiIsIGVycik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjkyLDI0ICsyNjgsMTcgQEAKIAkJaW50IGFtZ21faW5kZXhfdG9fZnJlZSA9IGJlMzJfdG9fY3B1KG1nbS0+bmV4dF9naWRfaW5kZXgpID4+IDY7CiAJCWlmIChhbWdtX2luZGV4X3RvX2ZyZWUpIHsKIAkJCWVyciA9IG10aGNhX1JFQURfTUdNKGRldiwgYW1nbV9pbmRleF90b19mcmVlLAotCQkJCQkgICAgIG1haWxib3gsICZzdGF0dXMpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIG91dDsKLQkJCWlmIChzdGF0dXMpIHsKLQkJCQltdGhjYV9lcnIoZGV2LCAiUkVBRF9NR00gcmV0dXJuZWQgc3RhdHVzICUwMnhcbiIsCi0JCQkJCSAgc3RhdHVzKTsKLQkJCQllcnIgPSAtRUlOVkFMOworCQkJCQkgICAgIG1haWxib3gpOworCQkJaWYgKGVycikgeworCQkJCW10aGNhX2VycihkZXYsICJSRUFEX01HTSByZXR1cm5lZCAlZFxuIiwgZXJyKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJfSBlbHNlCiAJCQltZW1zZXQobWdtLT5naWQsIDAsIDE2KTsKIAotCQllcnIgPSBtdGhjYV9XUklURV9NR00oZGV2LCBpbmRleCwgbWFpbGJveCwgJnN0YXR1cyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKLQkJaWYgKHN0YXR1cykgewotCQkJbXRoY2FfZXJyKGRldiwgIldSSVRFX01HTSByZXR1cm5lZCBzdGF0dXMgJTAyeFxuIiwgc3RhdHVzKTsKLQkJCWVyciA9IC1FSU5WQUw7CisJCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIGluZGV4LCBtYWlsYm94KTsKKwkJaWYgKGVycikgeworCQkJbXRoY2FfZXJyKGRldiwgIldSSVRFX01HTSByZXR1cm5lZCAlZFxuIiwgZXJyKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCWlmIChhbWdtX2luZGV4X3RvX2ZyZWUpIHsKQEAgLTMxOSwyMyArMjg4LDE3IEBACiAJfSBlbHNlIHsKIAkJLyogUmVtb3ZlIGVudHJ5IGZyb20gQU1HTSAqLwogCQlpbnQgY3Vycl9uZXh0X2luZGV4ID0gYmUzMl90b19jcHUobWdtLT5uZXh0X2dpZF9pbmRleCkgPj4gNjsKLQkJZXJyID0gbXRoY2FfUkVBRF9NR00oZGV2LCBwcmV2LCBtYWlsYm94LCAmc3RhdHVzKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0OwotCQlpZiAoc3RhdHVzKSB7Ci0JCQltdGhjYV9lcnIoZGV2LCAiUkVBRF9NR00gcmV0dXJuZWQgc3RhdHVzICUwMnhcbiIsIHN0YXR1cyk7Ci0JCQllcnIgPSAtRUlOVkFMOworCQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsIHByZXYsIG1haWxib3gpOworCQlpZiAoZXJyKSB7CisJCQltdGhjYV9lcnIoZGV2LCAiUkVBRF9NR00gcmV0dXJuZWQgJWRcbiIsIGVycik7CiAJCQlnb3RvIG91dDsKIAkJfQogCiAJCW1nbS0+bmV4dF9naWRfaW5kZXggPSBjcHVfdG9fYmUzMihjdXJyX25leHRfaW5kZXggPDwgNik7CiAKLQkJZXJyID0gbXRoY2FfV1JJVEVfTUdNKGRldiwgcHJldiwgbWFpbGJveCwgJnN0YXR1cyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKLQkJaWYgKHN0YXR1cykgewotCQkJbXRoY2FfZXJyKGRldiwgIldSSVRFX01HTSByZXR1cm5lZCBzdGF0dXMgJTAyeFxuIiwgc3RhdHVzKTsKLQkJCWVyciA9IC1FSU5WQUw7CisJCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIHByZXYsIG1haWxib3gpOworCQlpZiAoZXJyKSB7CisJCQltdGhjYV9lcnIoZGV2LCAiV1JJVEVfTUdNIHJldHVybmVkICVkXG4iLCBlcnIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJQlVHX09OKGluZGV4IDwgZGV2LT5saW1pdHMubnVtX21nbXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21lbWZyZWUuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tZW1mcmVlLmMKaW5kZXggOGMyYTgzNy4uN2QyZTQyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21lbWZyZWUuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWVtZnJlZS5jCkBAIC0yMjMsNyArMjIzLDYgQEAKIHsKIAlpbnQgaSA9IChvYmogJiAodGFibGUtPm51bV9vYmogLSAxKSkgKiB0YWJsZS0+b2JqX3NpemUgLyBNVEhDQV9UQUJMRV9DSFVOS19TSVpFOwogCWludCByZXQgPSAwOwotCXU4IHN0YXR1czsKIAogCW11dGV4X2xvY2soJnRhYmxlLT5tdXRleCk7CiAKQEAgLTI0MCw4ICsyMzksOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAobXRoY2FfTUFQX0lDTShkZXYsIHRhYmxlLT5pY21baV0sIHRhYmxlLT52aXJ0ICsgaSAqIE1USENBX1RBQkxFX0NIVU5LX1NJWkUsCi0JCQkgICZzdGF0dXMpIHx8IHN0YXR1cykgeworCWlmIChtdGhjYV9NQVBfSUNNKGRldiwgdGFibGUtPmljbVtpXSwKKwkJCSAgdGFibGUtPnZpcnQgKyBpICogTVRIQ0FfVEFCTEVfQ0hVTktfU0laRSkpIHsKIAkJbXRoY2FfZnJlZV9pY20oZGV2LCB0YWJsZS0+aWNtW2ldLCB0YWJsZS0+Y29oZXJlbnQpOwogCQl0YWJsZS0+aWNtW2ldID0gTlVMTDsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTI1OCw3ICsyNTcsNiBAQAogdm9pZCBtdGhjYV90YWJsZV9wdXQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfaWNtX3RhYmxlICp0YWJsZSwgaW50IG9iaikKIHsKIAlpbnQgaTsKLQl1OCBzdGF0dXM7CiAKIAlpZiAoIW10aGNhX2lzX21lbWZyZWUoZGV2KSkKIAkJcmV0dXJuOwpAQCAtMjY5LDggKzI2Nyw3IEBACiAKIAlpZiAoLS10YWJsZS0+aWNtW2ldLT5yZWZjb3VudCA9PSAwKSB7CiAJCW10aGNhX1VOTUFQX0lDTShkZXYsIHRhYmxlLT52aXJ0ICsgaSAqIE1USENBX1RBQkxFX0NIVU5LX1NJWkUsCi0JCQkJTVRIQ0FfVEFCTEVfQ0hVTktfU0laRSAvIE1USENBX0lDTV9QQUdFX1NJWkUsCi0JCQkJJnN0YXR1cyk7CisJCQkJTVRIQ0FfVEFCTEVfQ0hVTktfU0laRSAvIE1USENBX0lDTV9QQUdFX1NJWkUpOwogCQltdGhjYV9mcmVlX2ljbShkZXYsIHRhYmxlLT5pY21baV0sIHRhYmxlLT5jb2hlcmVudCk7CiAJCXRhYmxlLT5pY21baV0gPSBOVUxMOwogCX0KQEAgLTM2Niw3ICszNjMsNiBAQAogCWludCBudW1faWNtOwogCXVuc2lnbmVkIGNodW5rX3NpemU7CiAJaW50IGk7Ci0JdTggc3RhdHVzOwogCiAJb2JqX3Blcl9jaHVuayA9IE1USENBX1RBQkxFX0NIVU5LX1NJWkUgLyBvYmpfc2l6ZTsKIAludW1faWNtID0gRElWX1JPVU5EX1VQKG5vYmosIG9ial9wZXJfY2h1bmspOwpAQCAtMzk2LDggKzM5Miw4IEBACiAJCQkJCQlfX0dGUF9OT1dBUk4sIHVzZV9jb2hlcmVudCk7CiAJCWlmICghdGFibGUtPmljbVtpXSkKIAkJCWdvdG8gZXJyOwotCQlpZiAobXRoY2FfTUFQX0lDTShkZXYsIHRhYmxlLT5pY21baV0sIHZpcnQgKyBpICogTVRIQ0FfVEFCTEVfQ0hVTktfU0laRSwKLQkJCQkgICZzdGF0dXMpIHx8IHN0YXR1cykgeworCQlpZiAobXRoY2FfTUFQX0lDTShkZXYsIHRhYmxlLT5pY21baV0sCisJCQkJICB2aXJ0ICsgaSAqIE1USENBX1RBQkxFX0NIVU5LX1NJWkUpKSB7CiAJCQltdGhjYV9mcmVlX2ljbShkZXYsIHRhYmxlLT5pY21baV0sIHRhYmxlLT5jb2hlcmVudCk7CiAJCQl0YWJsZS0+aWNtW2ldID0gTlVMTDsKIAkJCWdvdG8gZXJyOwpAQCAtNDE2LDggKzQxMiw3IEBACiAJZm9yIChpID0gMDsgaSA8IG51bV9pY207ICsraSkKIAkJaWYgKHRhYmxlLT5pY21baV0pIHsKIAkJCW10aGNhX1VOTUFQX0lDTShkZXYsIHZpcnQgKyBpICogTVRIQ0FfVEFCTEVfQ0hVTktfU0laRSwKLQkJCQkJTVRIQ0FfVEFCTEVfQ0hVTktfU0laRSAvIE1USENBX0lDTV9QQUdFX1NJWkUsCi0JCQkJCSZzdGF0dXMpOworCQkJCQlNVEhDQV9UQUJMRV9DSFVOS19TSVpFIC8gTVRIQ0FfSUNNX1BBR0VfU0laRSk7CiAJCQltdGhjYV9mcmVlX2ljbShkZXYsIHRhYmxlLT5pY21baV0sIHRhYmxlLT5jb2hlcmVudCk7CiAJCX0KIApAQCAtNDI5LDEzICs0MjQsMTIgQEAKIHZvaWQgbXRoY2FfZnJlZV9pY21fdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfaWNtX3RhYmxlICp0YWJsZSkKIHsKIAlpbnQgaTsKLQl1OCBzdGF0dXM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgdGFibGUtPm51bV9pY207ICsraSkKIAkJaWYgKHRhYmxlLT5pY21baV0pIHsKLQkJCW10aGNhX1VOTUFQX0lDTShkZXYsIHRhYmxlLT52aXJ0ICsgaSAqIE1USENBX1RBQkxFX0NIVU5LX1NJWkUsCi0JCQkJCU1USENBX1RBQkxFX0NIVU5LX1NJWkUgLyBNVEhDQV9JQ01fUEFHRV9TSVpFLAotCQkJCQkmc3RhdHVzKTsKKwkJCW10aGNhX1VOTUFQX0lDTShkZXYsCisJCQkJCXRhYmxlLT52aXJ0ICsgaSAqIE1USENBX1RBQkxFX0NIVU5LX1NJWkUsCisJCQkJCU1USENBX1RBQkxFX0NIVU5LX1NJWkUgLyBNVEhDQV9JQ01fUEFHRV9TSVpFKTsKIAkJCW10aGNhX2ZyZWVfaWNtKGRldiwgdGFibGUtPmljbVtpXSwgdGFibGUtPmNvaGVyZW50KTsKIAkJfQogCkBAIC00NTQsNyArNDQ4LDYgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZXNbMV07CiAJaW50IHJldCA9IDA7Ci0JdTggc3RhdHVzOwogCWludCBpOwogCiAJaWYgKCFtdGhjYV9pc19tZW1mcmVlKGRldikpCkBAIC00OTQsOSArNDg3LDcgQEAKIAl9CiAKIAlyZXQgPSBtdGhjYV9NQVBfSUNNX3BhZ2UoZGV2LCBzZ19kbWFfYWRkcmVzcygmZGJfdGFiLT5wYWdlW2ldLm1lbSksCi0JCQkJIG10aGNhX3VhcmNfdmlydChkZXYsIHVhciwgaSksICZzdGF0dXMpOwotCWlmICghcmV0ICYmIHN0YXR1cykKLQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkgbXRoY2FfdWFyY192aXJ0KGRldiwgdWFyLCBpKSk7CiAJaWYgKHJldCkgewogCQlwY2lfdW5tYXBfc2coZGV2LT5wZGV2LCAmZGJfdGFiLT5wYWdlW2ldLm1lbSwgMSwgUENJX0RNQV9UT0RFVklDRSk7CiAJCXB1dF9wYWdlKHNnX3BhZ2UoJmRiX3RhYi0+cGFnZVtpXS5tZW0pKTsKQEAgLTU1NywxNCArNTQ4LDEzIEBACiAJCQkgICAgICAgc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGUgKmRiX3RhYikKIHsKIAlpbnQgaTsKLQl1OCBzdGF0dXM7CiAKIAlpZiAoIW10aGNhX2lzX21lbWZyZWUoZGV2KSkKIAkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgaSA8IGRldi0+dWFyX3RhYmxlLnVhcmNfc2l6ZSAvIE1USENBX0lDTV9QQUdFX1NJWkU7ICsraSkgewogCQlpZiAoZGJfdGFiLT5wYWdlW2ldLnV2aXJ0KSB7Ci0JCQltdGhjYV9VTk1BUF9JQ00oZGV2LCBtdGhjYV91YXJjX3ZpcnQoZGV2LCB1YXIsIGkpLCAxLCAmc3RhdHVzKTsKKwkJCW10aGNhX1VOTUFQX0lDTShkZXYsIG10aGNhX3VhcmNfdmlydChkZXYsIHVhciwgaSksIDEpOwogCQkJcGNpX3VubWFwX3NnKGRldi0+cGRldiwgJmRiX3RhYi0+cGFnZVtpXS5tZW0sIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQkJcHV0X3BhZ2Uoc2dfcGFnZSgmZGJfdGFiLT5wYWdlW2ldLm1lbSkpOwogCQl9CkBAIC01ODEsNyArNTcxLDYgQEAKIAlpbnQgaSwgajsKIAlzdHJ1Y3QgbXRoY2FfZGJfcGFnZSAqcGFnZTsKIAlpbnQgcmV0ID0gMDsKLQl1OCBzdGF0dXM7CiAKIAltdXRleF9sb2NrKCZkZXYtPmRiX3RhYi0+bXV0ZXgpOwogCkBAIC02NDQsOSArNjMzLDcgQEAKIAltZW1zZXQocGFnZS0+ZGJfcmVjLCAwLCBNVEhDQV9JQ01fUEFHRV9TSVpFKTsKIAogCXJldCA9IG10aGNhX01BUF9JQ01fcGFnZShkZXYsIHBhZ2UtPm1hcHBpbmcsCi0JCQkJIG10aGNhX3VhcmNfdmlydChkZXYsICZkZXYtPmRyaXZlcl91YXIsIGkpLCAmc3RhdHVzKTsKLQlpZiAoIXJldCAmJiBzdGF0dXMpCi0JCXJldCA9IC1FSU5WQUw7CisJCQkJIG10aGNhX3VhcmNfdmlydChkZXYsICZkZXYtPmRyaXZlcl91YXIsIGkpKTsKIAlpZiAocmV0KSB7CiAJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgTVRIQ0FfSUNNX1BBR0VfU0laRSwKIAkJCQkgIHBhZ2UtPmRiX3JlYywgcGFnZS0+bWFwcGluZyk7CkBAIC02NzgsNyArNjY1LDYgQEAKIHsKIAlpbnQgaSwgajsKIAlzdHJ1Y3QgbXRoY2FfZGJfcGFnZSAqcGFnZTsKLQl1OCBzdGF0dXM7CiAKIAlpID0gZGJfaW5kZXggLyBNVEhDQV9EQl9SRUNfUEVSX1BBR0U7CiAJaiA9IGRiX2luZGV4ICUgTVRIQ0FfREJfUkVDX1BFUl9QQUdFOwpAQCAtNjk0LDcgKzY4MCw3IEBACiAKIAlpZiAoYml0bWFwX2VtcHR5KHBhZ2UtPnVzZWQsIE1USENBX0RCX1JFQ19QRVJfUEFHRSkgJiYKIAkgICAgaSA+PSBkZXYtPmRiX3RhYi0+bWF4X2dyb3VwMSAtIDEpIHsKLQkJbXRoY2FfVU5NQVBfSUNNKGRldiwgbXRoY2FfdWFyY192aXJ0KGRldiwgJmRldi0+ZHJpdmVyX3VhciwgaSksIDEsICZzdGF0dXMpOworCQltdGhjYV9VTk1BUF9JQ00oZGV2LCBtdGhjYV91YXJjX3ZpcnQoZGV2LCAmZGV2LT5kcml2ZXJfdWFyLCBpKSwgMSk7CiAKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LCBNVEhDQV9JQ01fUEFHRV9TSVpFLAogCQkJCSAgcGFnZS0+ZGJfcmVjLCBwYWdlLT5tYXBwaW5nKTsKQEAgLTc0NSw3ICs3MzEsNiBAQAogdm9pZCBtdGhjYV9jbGVhbnVwX2RiX3RhYihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJaW50IGk7Ci0JdTggc3RhdHVzOwogCiAJaWYgKCFtdGhjYV9pc19tZW1mcmVlKGRldikpCiAJCXJldHVybjsKQEAgLTc2Myw3ICs3NDgsNyBAQAogCQlpZiAoIWJpdG1hcF9lbXB0eShkZXYtPmRiX3RhYi0+cGFnZVtpXS51c2VkLCBNVEhDQV9EQl9SRUNfUEVSX1BBR0UpKQogCQkJbXRoY2Ffd2FybihkZXYsICJLZXJuZWwgVUFSQyBwYWdlICVkIG5vdCBlbXB0eVxuIiwgaSk7CiAKLQkJbXRoY2FfVU5NQVBfSUNNKGRldiwgbXRoY2FfdWFyY192aXJ0KGRldiwgJmRldi0+ZHJpdmVyX3VhciwgaSksIDEsICZzdGF0dXMpOworCQltdGhjYV9VTk1BUF9JQ00oZGV2LCBtdGhjYV91YXJjX3ZpcnQoZGV2LCAmZGV2LT5kcml2ZXJfdWFyLCBpKSwgMSk7CiAKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LCBNVEhDQV9JQ01fUEFHRV9TSVpFLAogCQkJCSAgZGV2LT5kYl90YWItPnBhZ2VbaV0uZGJfcmVjLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21yLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYwppbmRleCA0NDA0NWM4Li5hYjg3NmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYwpAQCAtMjU3LDcgKzI1Nyw2IEBACiAJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJX19iZTY0ICptdHRfZW50cnk7CiAJaW50IGVyciA9IDA7Ci0JdTggc3RhdHVzOwogCWludCBpOwogCiAJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKQEAgLTI4MSwxNyArMjgwLDExIEBACiAJCWlmIChpICYgMSkKIAkJCW10dF9lbnRyeVtpICsgMl0gPSAwOwogCi0JCWVyciA9IG10aGNhX1dSSVRFX01UVChkZXYsIG1haWxib3gsIChpICsgMSkgJiB+MSwgJnN0YXR1cyk7CisJCWVyciA9IG10aGNhX1dSSVRFX01UVChkZXYsIG1haWxib3gsIChpICsgMSkgJiB+MSk7CiAJCWlmIChlcnIpIHsKIAkJCW10aGNhX3dhcm4oZGV2LCAiV1JJVEVfTVRUIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJaWYgKHN0YXR1cykgewotCQkJbXRoY2Ffd2FybihkZXYsICJXUklURV9NVFQgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeFxuIiwKLQkJCQkgICBzdGF0dXMpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9CiAKIAkJbGlzdF9sZW4gICAgLT0gaTsKIAkJc3RhcnRfaW5kZXggKz0gaTsKQEAgLTQ0MSw3ICs0MzQsNiBAQAogCXUzMiBrZXk7CiAJaW50IGk7CiAJaW50IGVycjsKLQl1OCBzdGF0dXM7CiAKIAlXQVJOX09OKGJ1ZmZlcl9zaXplX3NoaWZ0ID49IDMyKTsKIApAQCAtNDk3LDE2ICs0ODksMTAgQEAKIAl9CiAKIAllcnIgPSBtdGhjYV9TVzJIV19NUFQoZGV2LCBtYWlsYm94LAotCQkJICAgICAga2V5ICYgKGRldi0+bGltaXRzLm51bV9tcHRzIC0gMSksCi0JCQkgICAgICAmc3RhdHVzKTsKKwkJCSAgICAgIGtleSAmIChkZXYtPmxpbWl0cy5udW1fbXB0cyAtIDEpKTsKIAlpZiAoZXJyKSB7CiAJCW10aGNhX3dhcm4oZGV2LCAiU1cySFdfTVBUIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGVycl9vdXRfbWFpbGJveDsKLQl9IGVsc2UgaWYgKHN0YXR1cykgewotCQltdGhjYV93YXJuKGRldiwgIlNXMkhXX01QVCByZXR1cm5lZCBzdGF0dXMgMHglMDJ4XG4iLAotCQkJICAgc3RhdHVzKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBlcnJfb3V0X21haWxib3g7CiAJfQogCiAJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CkBAIC01NjcsMTcgKzU1MywxMiBAQAogdm9pZCBtdGhjYV9mcmVlX21yKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21yICptcikKIHsKIAlpbnQgZXJyOwotCXU4IHN0YXR1czsKIAogCWVyciA9IG10aGNhX0hXMlNXX01QVChkZXYsIE5VTEwsCiAJCQkgICAgICBrZXlfdG9faHdfaW5kZXgoZGV2LCBtci0+aWJtci5sa2V5KSAmCi0JCQkgICAgICAoZGV2LT5saW1pdHMubnVtX21wdHMgLSAxKSwKLQkJCSAgICAgICZzdGF0dXMpOworCQkJICAgICAgKGRldi0+bGltaXRzLm51bV9tcHRzIC0gMSkpOwogCWlmIChlcnIpCiAJCW10aGNhX3dhcm4oZGV2LCAiSFcyU1dfTVBUIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCWVsc2UgaWYgKHN0YXR1cykKLQkJbXRoY2Ffd2FybihkZXYsICJIVzJTV19NUFQgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeFxuIiwKLQkJCSAgIHN0YXR1cyk7CiAKIAltdGhjYV9mcmVlX3JlZ2lvbihkZXYsIG1yLT5pYm1yLmxrZXkpOwogCW10aGNhX2ZyZWVfbXR0KGRldiwgbXItPm10dCk7CkBAIC01OTAsNyArNTcxLDYgQEAKIAlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAl1NjQgbXR0X3NlZzsKIAl1MzIga2V5LCBpZHg7Ci0JdTggc3RhdHVzOwogCWludCBsaXN0X2xlbiA9IG1yLT5hdHRyLm1heF9wYWdlczsKIAlpbnQgZXJyID0gLUVOT01FTTsKIAlpbnQgaTsKQEAgLTY3MiwxOCArNjUyLDExIEBACiAJfQogCiAJZXJyID0gbXRoY2FfU1cySFdfTVBUKGRldiwgbWFpbGJveCwKLQkJCSAgICAgIGtleSAmIChkZXYtPmxpbWl0cy5udW1fbXB0cyAtIDEpLAotCQkJICAgICAgJnN0YXR1cyk7CisJCQkgICAgICBrZXkgJiAoZGV2LT5saW1pdHMubnVtX21wdHMgLSAxKSk7CiAJaWYgKGVycikgewogCQltdGhjYV93YXJuKGRldiwgIlNXMkhXX01QVCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBlcnJfb3V0X21haWxib3hfZnJlZTsKIAl9Ci0JaWYgKHN0YXR1cykgewotCQltdGhjYV93YXJuKGRldiwgIlNXMkhXX01QVCByZXR1cm5lZCBzdGF0dXMgMHglMDJ4XG4iLAotCQkJICAgc3RhdHVzKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBlcnJfb3V0X21haWxib3hfZnJlZTsKLQl9CiAKIAltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKaW5kZXggMWUwYjRiNi4uMzY1ZmUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKQEAgLTYzLDggKzYzLDYgQEAKIAlpbnQgZXJyID0gLUVOT01FTTsKIAlzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2ID0gdG9fbWRldihpYmRldik7CiAKLQl1OCBzdGF0dXM7Ci0KIAlpbl9tYWQgID0ga3phbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CiAJb3V0X21hZCA9IGttYWxsb2Moc2l6ZW9mICpvdXRfbWFkLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluX21hZCB8fCAhb3V0X21hZCkKQEAgLTc4LDE0ICs3Niw5IEBACiAJaW5fbWFkLT5hdHRyX2lkID0gSUJfU01QX0FUVFJfTk9ERV9JTkZPOwogCiAJZXJyID0gbXRoY2FfTUFEX0lGQyhtZGV2LCAxLCAxLAotCQkJICAgIDEsIE5VTEwsIE5VTEwsIGluX21hZCwgb3V0X21hZCwKLQkJCSAgICAmc3RhdHVzKTsKKwkJCSAgICAxLCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWlmIChzdGF0dXMpIHsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQogCiAJcHJvcHMtPmRldmljZV9jYXBfZmxhZ3MgICAgPSBtZGV2LT5kZXZpY2VfY2FwX2ZsYWdzOwogCXByb3BzLT52ZW5kb3JfaWQgICAgICAgICAgID0gYmUzMl90b19jcHVwKChfX2JlMzIgKikgKG91dF9tYWQtPmRhdGEgKyAzNikpICYKQEAgLTE0MSw3ICsxMzQsNiBAQAogCXN0cnVjdCBpYl9zbXAgKmluX21hZCAgPSBOVUxMOwogCXN0cnVjdCBpYl9zbXAgKm91dF9tYWQgPSBOVUxMOwogCWludCBlcnIgPSAtRU5PTUVNOwotCXU4IHN0YXR1czsKIAogCWluX21hZCAgPSBremFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKIAlvdXRfbWFkID0ga21hbGxvYyhzaXplb2YgKm91dF9tYWQsIEdGUF9LRVJORUwpOwpAQCAtMTU1LDE0ICsxNDcsOSBAQAogCWluX21hZC0+YXR0cl9tb2QgPSBjcHVfdG9fYmUzMihwb3J0KTsKIAogCWVyciA9IG10aGNhX01BRF9JRkModG9fbWRldihpYmRldiksIDEsIDEsCi0JCQkgICAgcG9ydCwgTlVMTCwgTlVMTCwgaW5fbWFkLCBvdXRfbWFkLAotCQkJICAgICZzdGF0dXMpOworCQkJICAgIHBvcnQsIE5VTEwsIE5VTEwsIGluX21hZCwgb3V0X21hZCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JaWYgKHN0YXR1cykgewotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9CiAKIAlwcm9wcy0+bGlkICAgICAgICAgICAgICAgPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSAob3V0X21hZC0+ZGF0YSArIDE2KSk7CiAJcHJvcHMtPmxtYyAgICAgICAgICAgICAgID0gb3V0X21hZC0+ZGF0YVszNF0gJiAweDc7CkBAIC0yMTQsNyArMjAxLDYgQEAKIAlzdHJ1Y3QgbXRoY2Ffc2V0X2liX3BhcmFtIHNldF9pYjsKIAlzdHJ1Y3QgaWJfcG9ydF9hdHRyIGF0dHI7CiAJaW50IGVycjsKLQl1OCBzdGF0dXM7CiAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0b19tZGV2KGliZGV2KS0+Y2FwX21hc2tfbXV0ZXgpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwpAQCAtMjI5LDE0ICsyMTUsOSBAQAogCXNldF9pYi5jYXBfbWFzayA9IChhdHRyLnBvcnRfY2FwX2ZsYWdzIHwgcHJvcHMtPnNldF9wb3J0X2NhcF9tYXNrKSAmCiAJCX5wcm9wcy0+Y2xyX3BvcnRfY2FwX21hc2s7CiAKLQllcnIgPSBtdGhjYV9TRVRfSUIodG9fbWRldihpYmRldiksICZzZXRfaWIsIHBvcnQsICZzdGF0dXMpOworCWVyciA9IG10aGNhX1NFVF9JQih0b19tZGV2KGliZGV2KSwgJnNldF9pYiwgcG9ydCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JaWYgKHN0YXR1cykgewotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KIG91dDoKIAltdXRleF91bmxvY2soJnRvX21kZXYoaWJkZXYpLT5jYXBfbWFza19tdXRleCk7CiAJcmV0dXJuIGVycjsKQEAgLTI0OCw3ICsyMjksNiBAQAogCXN0cnVjdCBpYl9zbXAgKmluX21hZCAgPSBOVUxMOwogCXN0cnVjdCBpYl9zbXAgKm91dF9tYWQgPSBOVUxMOwogCWludCBlcnIgPSAtRU5PTUVNOwotCXU4IHN0YXR1czsKIAogCWluX21hZCAgPSBremFsbG9jKHNpemVvZiAqaW5fbWFkLCBHRlBfS0VSTkVMKTsKIAlvdXRfbWFkID0ga21hbGxvYyhzaXplb2YgKm91dF9tYWQsIEdGUF9LRVJORUwpOwpAQCAtMjYwLDE0ICsyNDAsOSBAQAogCWluX21hZC0+YXR0cl9tb2QgPSBjcHVfdG9fYmUzMihpbmRleCAvIDMyKTsKIAogCWVyciA9IG10aGNhX01BRF9JRkModG9fbWRldihpYmRldiksIDEsIDEsCi0JCQkgICAgcG9ydCwgTlVMTCwgTlVMTCwgaW5fbWFkLCBvdXRfbWFkLAotCQkJICAgICZzdGF0dXMpOworCQkJICAgIHBvcnQsIE5VTEwsIE5VTEwsIGluX21hZCwgb3V0X21hZCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JaWYgKHN0YXR1cykgewotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9CiAKIAkqcGtleSA9IGJlMTZfdG9fY3B1KCgoX19iZTE2ICopIG91dF9tYWQtPmRhdGEpW2luZGV4ICUgMzJdKTsKIApAQCAtMjgzLDcgKzI1OCw2IEBACiAJc3RydWN0IGliX3NtcCAqaW5fbWFkICA9IE5VTEw7CiAJc3RydWN0IGliX3NtcCAqb3V0X21hZCA9IE5VTEw7CiAJaW50IGVyciA9IC1FTk9NRU07Ci0JdTggc3RhdHVzOwogCiAJaW5fbWFkICA9IGt6YWxsb2Moc2l6ZW9mICppbl9tYWQsIEdGUF9LRVJORUwpOwogCW91dF9tYWQgPSBrbWFsbG9jKHNpemVvZiAqb3V0X21hZCwgR0ZQX0tFUk5FTCk7CkBAIC0yOTUsMTQgKzI2OSw5IEBACiAJaW5fbWFkLT5hdHRyX21vZCA9IGNwdV90b19iZTMyKHBvcnQpOwogCiAJZXJyID0gbXRoY2FfTUFEX0lGQyh0b19tZGV2KGliZGV2KSwgMSwgMSwKLQkJCSAgICBwb3J0LCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQsCi0JCQkgICAgJnN0YXR1cyk7CisJCQkgICAgcG9ydCwgTlVMTCwgTlVMTCwgaW5fbWFkLCBvdXRfbWFkKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQlpZiAoc3RhdHVzKSB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KIAogCW1lbWNweShnaWQtPnJhdywgb3V0X21hZC0+ZGF0YSArIDgsIDgpOwogCkBAIC0zMTEsMTQgKzI4MCw5IEBACiAJaW5fbWFkLT5hdHRyX21vZCA9IGNwdV90b19iZTMyKGluZGV4IC8gOCk7CiAKIAllcnIgPSBtdGhjYV9NQURfSUZDKHRvX21kZXYoaWJkZXYpLCAxLCAxLAotCQkJICAgIHBvcnQsIE5VTEwsIE5VTEwsIGluX21hZCwgb3V0X21hZCwKLQkJCSAgICAmc3RhdHVzKTsKKwkJCSAgICBwb3J0LCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWlmIChzdGF0dXMpIHsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQogCiAJbWVtY3B5KGdpZC0+cmF3ICsgOCwgb3V0X21hZC0+ZGF0YSArIChpbmRleCAlIDgpICogOCwgOCk7CiAKQEAgLTgwMCw3ICs3NjQsNiBAQAogCXN0cnVjdCBtdGhjYV9jcSAqY3EgPSB0b19tY3EoaWJjcSk7CiAJc3RydWN0IG10aGNhX3Jlc2l6ZV9jcSB1Y21kOwogCXUzMiBsa2V5OwotCXU4IHN0YXR1czsKIAlpbnQgcmV0OwogCiAJaWYgKGVudHJpZXMgPCAxIHx8IGVudHJpZXMgPiBkZXYtPmxpbWl0cy5tYXhfY3FlcykKQEAgLTgyNyw5ICs3OTAsNyBAQAogCQlsa2V5ID0gdWNtZC5sa2V5OwogCX0KIAotCXJldCA9IG10aGNhX1JFU0laRV9DUShkZXYsIGNxLT5jcW4sIGxrZXksIGlsb2cyKGVudHJpZXMpLCAmc3RhdHVzKTsKLQlpZiAoc3RhdHVzKQotCQlyZXQgPSAtRUlOVkFMOworCXJldCA9IG10aGNhX1JFU0laRV9DUShkZXYsIGNxLT5jcW4sIGxrZXksIGlsb2cyKGVudHJpZXMpKTsKIAogCWlmIChyZXQpIHsKIAkJaWYgKGNxLT5yZXNpemVfYnVmKSB7CkBAIC0xMTYxLDcgKzExMjIsNiBAQAogewogCXN0cnVjdCBpYl9mbXIgKmZtcjsKIAlpbnQgZXJyOwotCXU4IHN0YXR1czsKIAlzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2ID0gTlVMTDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZm1yLCBmbXJfbGlzdCwgbGlzdCkgewpAQCAtMTE4MiwxMiArMTE0Miw4IEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoZm1yLCBmbXJfbGlzdCwgbGlzdCkKIAkJCW10aGNhX3Rhdm9yX2Ztcl91bm1hcChtZGV2LCB0b19tZm1yKGZtcikpOwogCi0JZXJyID0gbXRoY2FfU1lOQ19UUFQobWRldiwgJnN0YXR1cyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQlpZiAoc3RhdHVzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKKwllcnIgPSBtdGhjYV9TWU5DX1RQVChtZGV2KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgc3NpemVfdCBzaG93X3JldihzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtMTI1Myw3ICsxMjA5LDYgQEAKIAlzdHJ1Y3QgaWJfc21wICppbl9tYWQgID0gTlVMTDsKIAlzdHJ1Y3QgaWJfc21wICpvdXRfbWFkID0gTlVMTDsKIAlpbnQgZXJyID0gLUVOT01FTTsKLQl1OCBzdGF0dXM7CiAKIAlpbl9tYWQgID0ga3phbGxvYyhzaXplb2YgKmluX21hZCwgR0ZQX0tFUk5FTCk7CiAJb3V0X21hZCA9IGttYWxsb2Moc2l6ZW9mICpvdXRfbWFkLCBHRlBfS0VSTkVMKTsKQEAgLTEyNjQsMjggKzEyMTksMTggQEAKIAlpbl9tYWQtPmF0dHJfaWQgPSBJQl9TTVBfQVRUUl9OT0RFX0RFU0M7CiAKIAllcnIgPSBtdGhjYV9NQURfSUZDKGRldiwgMSwgMSwKLQkJCSAgICAxLCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQsCi0JCQkgICAgJnN0YXR1cyk7CisJCQkgICAgMSwgTlVMTCwgTlVMTCwgaW5fbWFkLCBvdXRfbWFkKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQlpZiAoc3RhdHVzKSB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KIAogCW1lbWNweShkZXYtPmliX2Rldi5ub2RlX2Rlc2MsIG91dF9tYWQtPmRhdGEsIDY0KTsKIAogCWluX21hZC0+YXR0cl9pZCA9IElCX1NNUF9BVFRSX05PREVfSU5GTzsKIAogCWVyciA9IG10aGNhX01BRF9JRkMoZGV2LCAxLCAxLAotCQkJICAgIDEsIE5VTEwsIE5VTEwsIGluX21hZCwgb3V0X21hZCwKLQkJCSAgICAmc3RhdHVzKTsKKwkJCSAgICAxLCBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWlmIChzdGF0dXMpIHsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQogCiAJaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkKIAkJZGV2LT5yZXZfaWQgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSAob3V0X21hZC0+ZGF0YSArIDMyKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jCmluZGV4IGEzNGM5ZDMuLjk2MDEwNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jCkBAIC0zMDgsNyArMzA4LDYgQEAKIHN0YXRpYyB2b2lkIGluaXRfcG9ydChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBwb3J0KQogewogCWludCBlcnI7Ci0JdTggc3RhdHVzOwogCXN0cnVjdCBtdGhjYV9pbml0X2liX3BhcmFtIHBhcmFtOwogCiAJbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mIHBhcmFtKTsKQEAgLTMxOSwxMSArMzE4LDkgQEAKIAlwYXJhbS5naWRfY2FwICAgID0gZGV2LT5saW1pdHMuZ2lkX3RhYmxlX2xlbjsKIAlwYXJhbS5wa2V5X2NhcCAgID0gZGV2LT5saW1pdHMucGtleV90YWJsZV9sZW47CiAKLQllcnIgPSBtdGhjYV9JTklUX0lCKGRldiwgJnBhcmFtLCBwb3J0LCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9JTklUX0lCKGRldiwgJnBhcmFtLCBwb3J0KTsKIAlpZiAoZXJyKQogCQltdGhjYV93YXJuKGRldiwgIklOSVRfSUIgZmFpbGVkLCByZXR1cm4gY29kZSAlZC5cbiIsIGVycik7Ci0JaWYgKHN0YXR1cykKLQkJbXRoY2Ffd2FybihkZXYsICJJTklUX0lCIHJldHVybmVkIHN0YXR1cyAlMDJ4LlxuIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIF9fYmUzMiBnZXRfaHdfYWNjZXNzX2ZsYWdzKHN0cnVjdCBtdGhjYV9xcCAqcXAsIGNvbnN0IHN0cnVjdCBpYl9xcF9hdHRyICphdHRyLApAQCAtNDMzLDcgKzQzMCw2IEBACiAJc3RydWN0IG10aGNhX3FwX3BhcmFtICpxcF9wYXJhbTsKIAlzdHJ1Y3QgbXRoY2FfcXBfY29udGV4dCAqY29udGV4dDsKIAlpbnQgbXRoY2Ffc3RhdGU7Ci0JdTggc3RhdHVzOwogCiAJbXV0ZXhfbG9jaygmcXAtPm11dGV4KTsKIApAQCAtNDQ4LDEyICs0NDQsOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQllcnIgPSBtdGhjYV9RVUVSWV9RUChkZXYsIHFwLT5xcG4sIDAsIG1haWxib3gsICZzdGF0dXMpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X21haWxib3g7Ci0JaWYgKHN0YXR1cykgewotCQltdGhjYV93YXJuKGRldiwgIlFVRVJZX1FQIHJldHVybmVkIHN0YXR1cyAlMDJ4XG4iLCBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOworCWVyciA9IG10aGNhX1FVRVJZX1FQKGRldiwgcXAtPnFwbiwgMCwgbWFpbGJveCk7CisJaWYgKGVycikgeworCQltdGhjYV93YXJuKGRldiwgIlFVRVJZX1FQIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIG91dF9tYWlsYm94OwogCX0KIApAQCAtNTU1LDcgKzU0OCw2IEBACiAJc3RydWN0IG10aGNhX3FwX3BhcmFtICpxcF9wYXJhbTsKIAlzdHJ1Y3QgbXRoY2FfcXBfY29udGV4dCAqcXBfY29udGV4dDsKIAl1MzIgc3FkX2V2ZW50ID0gMDsKLQl1OCBzdGF0dXM7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKIAltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOwpAQCAtNzgxLDEzICs3NzMsMTAgQEAKIAkJc3FkX2V2ZW50ID0gMSA8PCAzMTsKIAogCWVyciA9IG10aGNhX01PRElGWV9RUChkZXYsIGN1cl9zdGF0ZSwgbmV3X3N0YXRlLCBxcC0+cXBuLCAwLAotCQkJICAgICAgbWFpbGJveCwgc3FkX2V2ZW50LCAmc3RhdHVzKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9tYWlsYm94OwotCWlmIChzdGF0dXMpIHsKLQkJbXRoY2Ffd2FybihkZXYsICJtb2RpZnkgUVAgJWQtPiVkIHJldHVybmVkIHN0YXR1cyAlMDJ4LlxuIiwKLQkJCSAgIGN1cl9zdGF0ZSwgbmV3X3N0YXRlLCBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOworCQkJICAgICAgbWFpbGJveCwgc3FkX2V2ZW50KTsKKwlpZiAoZXJyKSB7CisJCW10aGNhX3dhcm4oZGV2LCAibW9kaWZ5IFFQICVkLT4lZCByZXR1cm5lZCAlZC5cbiIsCisJCQkgICBjdXJfc3RhdGUsIG5ld19zdGF0ZSwgZXJyKTsKIAkJZ290byBvdXRfbWFpbGJveDsKIAl9CiAKQEAgLTgxNyw3ICs4MDYsNyBAQAogCQkgICAgY3VyX3N0YXRlICE9IElCX1FQU19FUlIgJiYKIAkJICAgIChuZXdfc3RhdGUgPT0gSUJfUVBTX1JFU0VUIHx8CiAJCSAgICAgbmV3X3N0YXRlID09IElCX1FQU19FUlIpKQotCQkJbXRoY2FfQ0xPU0VfSUIoZGV2LCBxcC0+cG9ydCwgJnN0YXR1cyk7CisJCQltdGhjYV9DTE9TRV9JQihkZXYsIHFwLT5wb3J0KTsKIAl9CiAKIAkvKgpAQCAtMTQyOSw3ICsxNDE4LDYgQEAKIHZvaWQgbXRoY2FfZnJlZV9xcChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCiAJCSAgIHN0cnVjdCBtdGhjYV9xcCAqcXApCiB7Ci0JdTggc3RhdHVzOwogCXN0cnVjdCBtdGhjYV9jcSAqc2VuZF9jcTsKIAlzdHJ1Y3QgbXRoY2FfY3EgKnJlY3ZfY3E7CiAKQEAgLTE0NTQsNyArMTQ0Miw3IEBACiAKIAlpZiAocXAtPnN0YXRlICE9IElCX1FQU19SRVNFVCkKIAkJbXRoY2FfTU9ESUZZX1FQKGRldiwgcXAtPnN0YXRlLCBJQl9RUFNfUkVTRVQsIHFwLT5xcG4sIDAsCi0JCQkJTlVMTCwgMCwgJnN0YXR1cyk7CisJCQkJTlVMTCwgMCk7CiAKIAkvKgogCSAqIElmIHRoaXMgaXMgYSB1c2Vyc3BhY2UgUVAsIHRoZSBidWZmZXJzLCBNUiwgQ1FzIGFuZCBzbyBvbgpAQCAtMjI2Myw3ICsyMjUxLDYgQEAKIGludCBtdGhjYV9pbml0X3FwX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlpbnQgZXJyOwotCXU4IHN0YXR1czsKIAlpbnQgaTsKIAogCXNwaW5fbG9ja19pbml0KCZkZXYtPnFwX3RhYmxlLmxvY2spOwpAQCAtMjI5MCwxNSArMjI3NywxMCBAQAogCiAJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgewogCQllcnIgPSBtdGhjYV9DT05GX1NQRUNJQUxfUVAoZGV2LCBpID8gSUJfUVBUX0dTSSA6IElCX1FQVF9TTUksCi0JCQkJCSAgICBkZXYtPnFwX3RhYmxlLnNxcF9zdGFydCArIGkgKiAyLAotCQkJCQkgICAgJnN0YXR1cyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXQ7Ci0JCWlmIChzdGF0dXMpIHsKKwkJCQkgICAgZGV2LT5xcF90YWJsZS5zcXBfc3RhcnQgKyBpICogMik7CisJCWlmIChlcnIpIHsKIAkJCW10aGNhX3dhcm4oZGV2LCAiQ09ORl9TUEVDSUFMX1FQIHJldHVybmVkICIKLQkJCQkgICAic3RhdHVzICUwMngsIGFib3J0aW5nLlxuIiwKLQkJCQkgICBzdGF0dXMpOwotCQkJZXJyID0gLUVJTlZBTDsKKwkJCQkgICAiJWQsIGFib3J0aW5nLlxuIiwgZXJyKTsKIAkJCWdvdG8gZXJyX291dDsKIAkJfQogCX0KQEAgLTIzMDYsNyArMjI4OCw3IEBACiAKICBlcnJfb3V0OgogCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpCi0JCW10aGNhX0NPTkZfU1BFQ0lBTF9RUChkZXYsIGksIDAsICZzdGF0dXMpOworCQltdGhjYV9DT05GX1NQRUNJQUxfUVAoZGV2LCBpLCAwKTsKIAogCW10aGNhX2FycmF5X2NsZWFudXAoJmRldi0+cXBfdGFibGUucXAsIGRldi0+bGltaXRzLm51bV9xcHMpOwogCW10aGNhX2FsbG9jX2NsZWFudXAoJmRldi0+cXBfdGFibGUuYWxsb2MpOwpAQCAtMjMxNywxMCArMjI5OSw5IEBACiB2b2lkIG10aGNhX2NsZWFudXBfcXBfdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2KQogewogCWludCBpOwotCXU4IHN0YXR1czsKIAogCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpCi0JCW10aGNhX0NPTkZfU1BFQ0lBTF9RUChkZXYsIGksIDAsICZzdGF0dXMpOworCQltdGhjYV9DT05GX1NQRUNJQUxfUVAoZGV2LCBpLCAwKTsKIAogCW10aGNhX2FycmF5X2NsZWFudXAoJmRldi0+cXBfdGFibGUucXAsIGRldi0+bGltaXRzLm51bV9xcHMpOwogCW10aGNhX2FsbG9jX2NsZWFudXAoJmRldi0+cXBfdGFibGUuYWxsb2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Jlc2V0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcmVzZXQuYwppbmRleCAyYTEzYTE2Li40ZmEzNTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcmVzZXQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcmVzZXQuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJfQogCiAJaGNhX3BjaXhfY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShtZGV2LT5wZGV2LCBQQ0lfQ0FQX0lEX1BDSVgpOwotCWhjYV9wY2llX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkobWRldi0+cGRldiwgUENJX0NBUF9JRF9FWFApOworCWhjYV9wY2llX2NhcCA9IHBjaV9wY2llX2NhcChtZGV2LT5wZGV2KTsKIAogCWlmIChicmlkZ2UpIHsKIAkJYnJpZGdlX2hlYWRlciA9IGttYWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9zcnEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9zcnEuYwppbmRleCA0ZmFiZTYyLi5kMjJmOTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2Ffc3JxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3NycS5jCkBAIC0yMDAsNyArMjAwLDYgQEAKIAkJICAgIHN0cnVjdCBpYl9zcnFfYXR0ciAqYXR0ciwgc3RydWN0IG10aGNhX3NycSAqc3JxKQogewogCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwotCXU4IHN0YXR1czsKIAlpbnQgZHM7CiAJaW50IGVycjsKIApAQCAtMjY2LDE4ICsyNjUsMTIgQEAKIAllbHNlCiAJCW10aGNhX3Rhdm9yX2luaXRfc3JxX2NvbnRleHQoZGV2LCBwZCwgc3JxLCBtYWlsYm94LT5idWYpOwogCi0JZXJyID0gbXRoY2FfU1cySFdfU1JRKGRldiwgbWFpbGJveCwgc3JxLT5zcnFuLCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9TVzJIV19TUlEoZGV2LCBtYWlsYm94LCBzcnEtPnNycW4pOwogCiAJaWYgKGVycikgewogCQltdGhjYV93YXJuKGRldiwgIlNXMkhXX1NSUSBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfYnVmOwogCX0KLQlpZiAoc3RhdHVzKSB7Ci0JCW10aGNhX3dhcm4oZGV2LCAiU1cySFdfU1JRIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsCi0JCQkgICBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9vdXRfZnJlZV9idWY7Ci0JfQogCiAJc3Bpbl9sb2NrX2lycSgmZGV2LT5zcnFfdGFibGUubG9jayk7CiAJaWYgKG10aGNhX2FycmF5X3NldCgmZGV2LT5zcnFfdGFibGUuc3JxLApAQCAtMjk5LDExICsyOTIsOSBAQAogCXJldHVybiAwOwogCiBlcnJfb3V0X2ZyZWVfc3JxOgotCWVyciA9IG10aGNhX0hXMlNXX1NSUShkZXYsIG1haWxib3gsIHNycS0+c3JxbiwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfSFcyU1dfU1JRKGRldiwgbWFpbGJveCwgc3JxLT5zcnFuKTsKIAlpZiAoZXJyKQogCQltdGhjYV93YXJuKGRldiwgIkhXMlNXX1NSUSBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQllbHNlIGlmIChzdGF0dXMpCi0JCW10aGNhX3dhcm4oZGV2LCAiSFcyU1dfU1JRIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsIHN0YXR1cyk7CiAKIGVycl9vdXRfZnJlZV9idWY6CiAJaWYgKCFwZC0+aWJwZC51b2JqZWN0KQpAQCAtMzQwLDcgKzMzMSw2IEBACiB7CiAJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJaW50IGVycjsKLQl1OCBzdGF0dXM7CiAKIAltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOwogCWlmIChJU19FUlIobWFpbGJveCkpIHsKQEAgLTM0OCwxMSArMzM4LDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCWVyciA9IG10aGNhX0hXMlNXX1NSUShkZXYsIG1haWxib3gsIHNycS0+c3JxbiwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfSFcyU1dfU1JRKGRldiwgbWFpbGJveCwgc3JxLT5zcnFuKTsKIAlpZiAoZXJyKQogCQltdGhjYV93YXJuKGRldiwgIkhXMlNXX1NSUSBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQllbHNlIGlmIChzdGF0dXMpCi0JCW10aGNhX3dhcm4oZGV2LCAiSFcyU1dfU1JRIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsIHN0YXR1cyk7CiAKIAlzcGluX2xvY2tfaXJxKCZkZXYtPnNycV90YWJsZS5sb2NrKTsKIAltdGhjYV9hcnJheV9jbGVhcigmZGV2LT5zcnFfdGFibGUuc3JxLApAQCAtMzc4LDggKzM2Niw3IEBACiB7CiAJc3RydWN0IG10aGNhX2RldiAqZGV2ID0gdG9fbWRldihpYnNycS0+ZGV2aWNlKTsKIAlzdHJ1Y3QgbXRoY2Ffc3JxICpzcnEgPSB0b19tc3JxKGlic3JxKTsKLQlpbnQgcmV0OwotCXU4IHN0YXR1czsKKwlpbnQgcmV0ID0gMDsKIAogCS8qIFdlIGRvbid0IHN1cHBvcnQgcmVzaXppbmcgU1JRcyAoeWV0PykgKi8KIAlpZiAoYXR0cl9tYXNrICYgSUJfU1JRX01BWF9XUikKQEAgLTM5MSwxNiArMzc4LDExIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQltdXRleF9sb2NrKCZzcnEtPm11dGV4KTsKLQkJcmV0ID0gbXRoY2FfQVJNX1NSUShkZXYsIHNycS0+c3JxbiwgYXR0ci0+c3JxX2xpbWl0LCAmc3RhdHVzKTsKKwkJcmV0ID0gbXRoY2FfQVJNX1NSUShkZXYsIHNycS0+c3JxbiwgYXR0ci0+c3JxX2xpbWl0KTsKIAkJbXV0ZXhfdW5sb2NrKCZzcnEtPm11dGV4KTsKLQotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQkJaWYgKHN0YXR1cykKLQkJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIGludCBtdGhjYV9xdWVyeV9zcnEoc3RydWN0IGliX3NycSAqaWJzcnEsIHN0cnVjdCBpYl9zcnFfYXR0ciAqc3JxX2F0dHIpCkBAIC00MTAsMTQgKzM5MiwxMyBAQAogCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXN0cnVjdCBtdGhjYV9hcmJlbF9zcnFfY29udGV4dCAqYXJiZWxfY3R4OwogCXN0cnVjdCBtdGhjYV90YXZvcl9zcnFfY29udGV4dCAqdGF2b3JfY3R4OwotCXU4IHN0YXR1czsKIAlpbnQgZXJyOwogCiAJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKIAlpZiAoSVNfRVJSKG1haWxib3gpKQogCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKIAotCWVyciA9IG10aGNhX1FVRVJZX1NSUShkZXYsIHNycS0+c3JxbiwgbWFpbGJveCwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfUVVFUllfU1JRKGRldiwgc3JxLT5zcnFuLCBtYWlsYm94KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMKaW5kZXggZTc0Y2RmOS4uNzNiYzE4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jCkBAIC0xMTUxLDcgKzExNTEsNyBAQAogCX0KIAogCWlmICgobmVpZ2ggPT0gTlVMTCkgfHwgKCEobmVpZ2gtPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkpKQotCQluZWlnaF9ldmVudF9zZW5kKHJ0LT5kc3QubmVpZ2hib3VyLCBOVUxMKTsKKwkJbmVpZ2hfZXZlbnRfc2VuZChkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCksIE5VTEwpOwogCiAJaXBfcnRfcHV0KHJ0KTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfaHcuYwppbmRleCA5NmZhOWE0Li5iZTM2Y2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2h3LmMKQEAgLTI5MTcsMjQgKzI5MTcsMTkgQEAKIAkJCQkJZ290byBza2lwX3J4X2luZGljYXRlMDsKIAogCi0JCQkJaWYgKChjcWVfbWlzYyAmIE5FU19OSUNfQ1FFX1RBR19WQUxJRCkgJiYKLQkJCQkgICAgKG5lc3ZuaWMtPnZsYW5fZ3JwICE9IE5VTEwpKSB7CisJCQkJaWYgKGNxZV9taXNjICYgTkVTX05JQ19DUUVfVEFHX1ZBTElEKSB7CiAJCQkJCXZsYW5fdGFnID0gKHUxNikobGUzMl90b19jcHUoCiAJCQkJCQkJY3EtPmNxX3ZiYXNlW2hlYWRdLmNxZV93b3Jkc1tORVNfTklDX0NRRV9UQUdfUEtUX1RZUEVfSURYXSkKIAkJCQkJCQk+PiAxNik7CiAJCQkJCW5lc19kZWJ1ZyhORVNfREJHX0NRLCAiJXM6IFJlcG9ydGluZyBzdHJpcHBlZCBWTEFOIHBhY2tldC4gVGFnID0gMHglMDRYXG4iLAogCQkJCQkJCW5lc3ZuaWMtPm5ldGRldi0+bmFtZSwgdmxhbl90YWcpOwotCQkJCQlpZiAobmVzX3VzZV9scm8pCi0JCQkJCQlscm9fdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKCZuZXN2bmljLT5scm9fbWdyLCByeF9za2IsCi0JCQkJCQkJCW5lc3ZuaWMtPnZsYW5fZ3JwLCB2bGFuX3RhZywgTlVMTCk7Ci0JCQkJCWVsc2UKLQkJCQkJCW5lc192bGFuX3J4KHJ4X3NrYiwgbmVzdm5pYy0+dmxhbl9ncnAsIHZsYW5fdGFnKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobmVzX3VzZV9scm8pCi0JCQkJCQlscm9fcmVjZWl2ZV9za2IoJm5lc3ZuaWMtPmxyb19tZ3IsIHJ4X3NrYiwgTlVMTCk7Ci0JCQkJCWVsc2UKLQkJCQkJCW5lc19uZXRpZl9yeChyeF9za2IpOworCisJCQkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcocnhfc2tiLCB2bGFuX3RhZyk7CiAJCQkJfQorCQkJCWlmIChuZXNfdXNlX2xybykKKwkJCQkJbHJvX3JlY2VpdmVfc2tiKCZuZXN2bmljLT5scm9fbWdyLCByeF9za2IsIE5VTEwpOworCQkJCWVsc2UKKwkJCQkJbmV0aWZfcmVjZWl2ZV9za2Iocnhfc2tiKTsKIAogc2tpcF9yeF9pbmRpY2F0ZTA6CiAJCQkJOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfaHcuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2h3LmgKaW5kZXggOTE1OTQxMS4uYzMyNDE0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfaHcuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5oCkBAIC0xMjExLDcgKzEyMTEsNiBAQAogCS8qIHZvaWQgKm1lbTsgKi8KIAlzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0Jc3RydWN0IHZsYW5fZ3JvdXAgKnZsYW5fZ3JwOwogCWF0b21pY190ICAgICAgICAgIHJ4X3NrYnNfbmVlZGVkOwogCWF0b21pY190ICAgICAgICAgIHJ4X3NrYl90aW1lcl9ydW5uaW5nOwogCWludCAgICAgICAgICAgICAgIGJ1ZGdldDsKQEAgLTEzNTcsNyArMTM1Niw0IEBACiAjZGVmaW5lIE5FU19MSU5LX1JFQ0hFQ0tfREVMQVkJbXNlY3NfdG9famlmZmllcyg1MCkKICNkZWZpbmUgTkVTX0xJTktfUkVDSEVDS19NQVgJNjAKIAotI2RlZmluZSBuZXNfdmxhbl9yeCB2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2IKLSNkZWZpbmUgbmVzX25ldGlmX3J4IG5ldGlmX3JlY2VpdmVfc2tiCi0KICNlbmRpZgkJLyogX19ORVNfSFdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYwppbmRleCBkM2ExYzQxLi45ZDdmZmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYwpAQCAtMTU4NCwyMyArMTU4NCwxOSBAQAogCS5zZXRfcGF1c2VwYXJhbSA9IG5lc19uZXRkZXZfc2V0X3BhdXNlcGFyYW0sCiB9OwogCi0KLXN0YXRpYyB2b2lkIG5lc19uZXRkZXZfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQorc3RhdGljIHZvaWQgbmVzX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCB1MzIgZmVhdHVyZXMpCiB7Ci0Jc3RydWN0IG5lc192bmljICpuZXN2bmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2ID0gbmVzdm5pYy0+bmVzZGV2OwogCXN0cnVjdCBuZXNfYWRhcHRlciAqbmVzYWRhcHRlciA9IG5lc2Rldi0+bmVzYWRhcHRlcjsKIAl1MzIgdTMydGVtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5lc2FkYXB0ZXItPnBoeV9sb2NrLCBmbGFncyk7Ci0JbmVzdm5pYy0+dmxhbl9ncnAgPSBncnA7CiAKIAluZXNfZGVidWcoTkVTX0RCR19ORVRERVYsICIlczogJXNcbiIsIF9fZnVuY19fLCBuZXRkZXYtPm5hbWUpOwogCiAJLyogRW5hYmxlL0Rpc2FibGUgVkxBTiBTdHJpcHBpbmcgKi8KIAl1MzJ0ZW1wID0gbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfUENJWF9ESUFHKTsKLQlpZiAoZ3JwKQorCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKIAkJdTMydGVtcCAmPSAweGZkZmZmZmZmOwogCWVsc2UKIAkJdTMydGVtcAl8PSAweDAyMDAwMDAwOwpAQCAtMTYwOSwxNyArMTYwNSw0NCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5lc2FkYXB0ZXItPnBoeV9sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyB1MzIgbmVzX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCit7CisJLyoKKwkgKiBTaW5jZSB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBzZXBhcmF0ZSByeC90eCB2bGFuIGFjY2VsCisJICogZW5hYmxlL2Rpc2FibGUgbWFrZSBzdXJlIHR4IGZsYWcgaXMgYWx3YXlzIGluIHNhbWUgc3RhdGUgYXMgcnguCisJICovCisJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQlmZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFg7CisJZWxzZQorCQlmZWF0dXJlcyAmPSB+TkVUSUZfRl9IV19WTEFOX1RYOworCisJcmV0dXJuIGZlYXR1cmVzOworfQorCitzdGF0aWMgaW50IG5lc19zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQoreworCXN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldiA9IG5lc3ZuaWMtPm5lc2RldjsKKwl1MzIgY2hhbmdlZCA9IG5ldGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKKworCWlmIChjaGFuZ2VkICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQluZXNfdmxhbl9tb2RlKG5ldGRldiwgbmVzZGV2LCBmZWF0dXJlcyk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXNfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4gCQk9IG5lc19uZXRkZXZfb3BlbiwKKwkubmRvX29wZW4JCT0gbmVzX25ldGRldl9vcGVuLAogCS5uZG9fc3RvcAkJPSBuZXNfbmV0ZGV2X3N0b3AsCi0JLm5kb19zdGFydF94bWl0IAk9IG5lc19uZXRkZXZfc3RhcnRfeG1pdCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gbmVzX25ldGRldl9zdGFydF94bWl0LAogCS5uZG9fZ2V0X3N0YXRzCQk9IG5lc19uZXRkZXZfZ2V0X3N0YXRzLAotCS5uZG9fdHhfdGltZW91dCAJPSBuZXNfbmV0ZGV2X3R4X3RpbWVvdXQsCisJLm5kb190eF90aW1lb3V0CQk9IG5lc19uZXRkZXZfdHhfdGltZW91dCwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IG5lc19uZXRkZXZfc2V0X21hY19hZGRyZXNzLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gbmVzX25ldGRldl9zZXRfbXVsdGljYXN0X2xpc3QsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IG5lc19uZXRkZXZfY2hhbmdlX210dSwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLQkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIgCT0gbmVzX25ldGRldl92bGFuX3J4X3JlZ2lzdGVyLAorCS5uZG9fZml4X2ZlYXR1cmVzCT0gbmVzX2ZpeF9mZWF0dXJlcywKKwkubmRvX3NldF9mZWF0dXJlcwk9IG5lc19zZXRfZmVhdHVyZXMsCiB9OwogCiAvKioKQEAgLTE2NTYsNyArMTY3OSw3IEBACiAJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZuZXNfZXRodG9vbF9vcHM7CiAJbmV0aWZfbmFwaV9hZGQobmV0ZGV2LCAmbmVzdm5pYy0+bmFwaSwgbmVzX25ldGRldl9wb2xsLCAxMjgpOwogCW5lc19kZWJ1ZyhORVNfREJHX0lOSVQsICJFbmFibGluZyBWTEFOIEluc2VydC9EZWxldGUuXG4iKTsKLQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKKwluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWDsKIAogCS8qIEZpbGwgaW4gdGhlIHBvcnQgc3RydWN0dXJlICovCiAJbmVzdm5pYy0+bmV0ZGV2ID0gbmV0ZGV2OwpAQCAtMTY4Myw3ICsxNzA2LDggQEAKIAluZXRkZXYtPmRldl9hZGRyWzVdID0gKHU4KXU2NHRlbXA7CiAJbWVtY3B5KG5ldGRldi0+cGVybV9hZGRyLCBuZXRkZXYtPmRldl9hZGRyLCA2KTsKIAotCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1JYQ1NVTSB8IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07CisJbmV0ZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTSB8CisJCQkgICAgICBORVRJRl9GX0hXX1ZMQU5fUlg7CiAJaWYgKChuZXN2bmljLT5sb2dpY2FsX3BvcnQgPCAyKSB8fCAobmVzZGV2LT5uZXNhZGFwdGVyLT5od19yZXYgIT0gTkUwMjBfUkVWKSkKIAkJbmV0ZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKIAluZXRkZXYtPmZlYXR1cmVzIHw9IG5ldGRldi0+aHdfZmVhdHVyZXM7CkBAIC0xODE1LDYgKzE4MzksOCBAQAogCQluZXNfaW5pdF9waHkobmVzZGV2KTsKIAl9CiAKKwluZXNfdmxhbl9tb2RlKG5ldGRldiwgbmVzZGV2LCBuZXRkZXYtPmZlYXR1cmVzKTsKKwogCXJldHVybiBuZXRkZXY7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc192ZXJicy5jCmluZGV4IDk1Y2E5M2MuLjlmMmY3ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfdmVyYnMuYwpAQCAtNjA1LDE2ICs2MDUsNiBAQAogCiAKIC8qKgotICogbmVzX21vZGlmeV9wb3J0Ci0gKi8KLXN0YXRpYyBpbnQgbmVzX21vZGlmeV9wb3J0KHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCB1OCBwb3J0LAotCQlpbnQgcG9ydF9tb2RpZnlfbWFzaywgc3RydWN0IGliX3BvcnRfbW9kaWZ5ICpwcm9wcykKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKioKICAqIG5lc19xdWVyeV9wa2V5CiAgKi8KIHN0YXRpYyBpbnQgbmVzX3F1ZXJ5X3BrZXkoc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHU4IHBvcnQsIHUxNiBpbmRleCwgdTE2ICpwa2V5KQpAQCAtMzg4Miw3ICszODcyLDYgQEAKIAluZXNpYmRldi0+aWJkZXYuZGV2LnBhcmVudCA9ICZuZXNkZXYtPnBjaWRldi0+ZGV2OwogCW5lc2liZGV2LT5pYmRldi5xdWVyeV9kZXZpY2UgPSBuZXNfcXVlcnlfZGV2aWNlOwogCW5lc2liZGV2LT5pYmRldi5xdWVyeV9wb3J0ID0gbmVzX3F1ZXJ5X3BvcnQ7Ci0JbmVzaWJkZXYtPmliZGV2Lm1vZGlmeV9wb3J0ID0gbmVzX21vZGlmeV9wb3J0OwogCW5lc2liZGV2LT5pYmRldi5xdWVyeV9wa2V5ID0gbmVzX3F1ZXJ5X3BrZXk7CiAJbmVzaWJkZXYtPmliZGV2LnF1ZXJ5X2dpZCA9IG5lc19xdWVyeV9naWQ7CiAJbmVzaWJkZXYtPmliZGV2LmFsbG9jX3Vjb250ZXh0ID0gbmVzX2FsbG9jX3Vjb250ZXh0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliLmgKaW5kZXggNzY5YTFkOS4uYzk2MjRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYi5oCkBAIC0xMDEyLDYgKzEwMTIsOCBAQAogCXU4IHBzeG1pdHdhaXRfc3VwcG9ydGVkOwogCS8qIGN5Y2xlIGxlbmd0aCBvZiBQUyogY291bnRlcnMgaW4gSFcgKGluIHBpY29zZWNvbmRzKSAqLwogCXUxNiBwc3htaXR3YWl0X2NoZWNrX3JhdGU7CisJLyogaGlnaCB2b2x1bWUgb3ZlcmZsb3cgZXJyb3JzIGRlZmVyZWQgdG8gdGFza2xldCAqLworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBlcnJvcl90YXNrbGV0OwogfTsKIAogLyogaG9sX3N0YXRlIHZhbHVlcyAqLwpAQCAtMTQzMyw2ICsxNDM1LDcgQEAKIHN0cnVjdCBxaWJfaHdlcnJvcl9tc2dzIHsKIAl1NjQgbWFzazsKIAljb25zdCBjaGFyICptc2c7CisJc2l6ZV90IHN6OwogfTsKIAogI2RlZmluZSBRTE9HSUNfSUJfSFdFX01TRyhhLCBiKSB7IC5tYXNrID0gYSwgLm1zZyA9IGIgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZpbGVfb3BzLmMKaW5kZXggNDA2ZmNhNS4uMjYyNTMwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZmlsZV9vcHMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9maWxlX29wcy5jCkBAIC0xNTI3LDYgKzE1MjcsNyBAQAogCQlzdHJ1Y3QgcWliX2ZpbGVkYXRhICpmZCA9IGZwLT5wcml2YXRlX2RhdGE7CiAJCWNvbnN0IHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCA9IGZkLT5yY2Q7CiAJCWNvbnN0IHN0cnVjdCBxaWJfZGV2ZGF0YSAqZGQgPSByY2QtPmRkOworCQl1bnNpZ25lZCBpbnQgd2VpZ2h0OwogCiAJCWlmIChkZC0+ZmxhZ3MgJiBRSUJfSEFTX1NFTkRfRE1BKSB7CiAJCQlmZC0+cHEgPSBxaWJfdXNlcl9zZG1hX3F1ZXVlX2NyZWF0ZSgmZGQtPnBjaWRldi0+ZGV2LApAQCAtMTU0NSw4ICsxNTQ2LDggQEAKIAkJICogaXQganVzdCBtZWFucyB0aGF0IHNvb25lciBvciBsYXRlciB3ZSBkb24ndCByZWNvbW1lbmQKIAkJICogYSBjcHUsIGFuZCBsZXQgdGhlIHNjaGVkdWxlciBkbyBpdCdzIGJlc3QuCiAJCSAqLwotCQlpZiAoIXJldCAmJiBjcHVzX3dlaWdodChjdXJyZW50LT5jcHVzX2FsbG93ZWQpID49Ci0JCSAgICBxaWJfY3B1bGlzdF9jb3VudCkgeworCQl3ZWlnaHQgPSBjcHVtYXNrX3dlaWdodCh0c2tfY3B1c19hbGxvd2VkKGN1cnJlbnQpKTsKKwkJaWYgKCFyZXQgJiYgd2VpZ2h0ID49IHFpYl9jcHVsaXN0X2NvdW50KSB7CiAJCQlpbnQgY3B1OwogCQkJY3B1ID0gZmluZF9maXJzdF96ZXJvX2JpdChxaWJfY3B1bGlzdCwKIAkJCQkJCSAgcWliX2NwdWxpc3RfY291bnQpOwpAQCAtMTU1NCwxMyArMTU1NSwxMyBAQAogCQkJCV9fc2V0X2JpdChjcHUsIHFpYl9jcHVsaXN0KTsKIAkJCQlmZC0+cmVjX2NwdV9udW0gPSBjcHU7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoY3B1c193ZWlnaHQoY3VycmVudC0+Y3B1c19hbGxvd2VkKSA9PSAxICYmCi0JCQl0ZXN0X2JpdChmaXJzdF9jcHUoY3VycmVudC0+Y3B1c19hbGxvd2VkKSwKKwkJfSBlbHNlIGlmICh3ZWlnaHQgPT0gMSAmJgorCQkJdGVzdF9iaXQoY3B1bWFza19maXJzdCh0c2tfY3B1c19hbGxvd2VkKGN1cnJlbnQpKSwKIAkJCQkgcWliX2NwdWxpc3QpKQogCQkJcWliX2RldmluZm8oZGQtPnBjaWRldiwgIiVzIFBJRCAldSBhZmZpbml0eSAiCiAJCQkJICAgICJzZXQgdG8gY3B1ICVkOyBhbHJlYWR5IGFsbG9jYXRlZFxuIiwKIAkJCQkgICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAotCQkJCSAgICBmaXJzdF9jcHUoY3VycmVudC0+Y3B1c19hbGxvd2VkKSk7CisJCQkJICAgIGNwdW1hc2tfZmlyc3QodHNrX2NwdXNfYWxsb3dlZChjdXJyZW50KSkpOwogCX0KIAogCW11dGV4X3VubG9jaygmcWliX211dGV4KTsKQEAgLTE5MDQsOCArMTkwNSw5IEBACiAJc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkOwogCXVuc2lnbmVkIGN0eHQ7CiAJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9jaygmcHBkLT5kZC0+dWN0eHRfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBwZC0+ZGQtPnVjdHh0X2xvY2ssIGZsYWdzKTsKIAlmb3IgKGN0eHQgPSBwcGQtPmRkLT5maXJzdF91c2VyX2N0eHQ7IGN0eHQgPCBwcGQtPmRkLT5jZmdjdHh0czsKIAkgICAgIGN0eHQrKykgewogCQlyY2QgPSBwcGQtPmRkLT5yY2RbY3R4dF07CkBAIC0xOTI0LDcgKzE5MjYsNyBAQAogCQlyZXQgPSAxOwogCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2soJnBwZC0+ZGQtPnVjdHh0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwZC0+ZGQtPnVjdHh0X2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MjIwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MjIwLmMKaW5kZXggYzc2NWEyZS4uZTFmOTQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzIyMC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTcyMjAuYwpAQCAtMjQzNCw2ICsyNDM0LDcgQEAKIAlpbnQgbHNiLCByZXQgPSAwLCBzZXRmb3JjZSA9IDA7CiAJdTE2IGxjbWQsIGxpY21kOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHRtcCA9IDA7CiAKIAlzd2l0Y2ggKHdoaWNoKSB7CiAJY2FzZSBRSUJfSUJfQ0ZHX0xJRExNQzoKQEAgLTI0NjcsOSArMjQ2OCw2IEBACiAJCW1hc2tyID0gSUJBNzIyMF9JQkNfV0lEVEhfTUFTSzsKIAkJbHNiID0gSUJBNzIyMF9JQkNfV0lEVEhfU0hJRlQ7CiAJCXNldGZvcmNlID0gMTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBwZC0+bGZsYWdzX2xvY2ssIGZsYWdzKTsKLQkJcHBkLT5sZmxhZ3MgfD0gUUlCTF9JQl9GT1JDRV9OT1RJRlk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwZC0+bGZsYWdzX2xvY2ssIGZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFJQl9JQl9DRkdfU1BEX0VOQjogLyogc2V0IGFsbG93ZWQgTGluayBzcGVlZHMgKi8KQEAgLTI2NDMsNiArMjY0MSwyOCBAQAogCQkJZ290byBiYWlsOwogCQl9CiAJCXFpYl9zZXRfaWJfNzIyMF9sc3RhdGUocHBkLCBsY21kLCBsaWNtZCk7CisKKwkJbWFza3IgPSBJQkE3MjIwX0lCQ19XSURUSF9NQVNLOworCQlsc2IgPSBJQkE3MjIwX0lCQ19XSURUSF9TSElGVDsKKwkJdG1wID0gKHBwZC0+Y3BzcGVjLT5pYmNkZHJjdHJsID4+IGxzYikgJiBtYXNrcjsKKwkJLyogSWYgdGhlIHdpZHRoIGFjdGl2ZSBvbiB0aGUgY2hpcCBkb2VzIG5vdCBtYXRjaCB0aGUKKwkJICogd2lkdGggaW4gdGhlIHNoYWRvdyByZWdpc3Rlciwgd3JpdGUgdGhlIG5ldyBhY3RpdmUKKwkJICogd2lkdGggdG8gdGhlIGNoaXAuCisJCSAqIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc3BlZWQgYXMgdGhlIHNwZWVkIGlzIHRha2VuCisJCSAqIGNhcmUgb2YgYnkgc2V0XzcyMjBfaWJzcGVlZF9mYXN0IGNhbGxlZCBieSBpYl91cGRvd24uCisJCSAqLworCQlpZiAocHBkLT5saW5rX3dpZHRoX2VuYWJsZWQtMSAhPSB0bXApIHsKKwkJCXBwZC0+Y3BzcGVjLT5pYmNkZHJjdHJsICY9IH4obWFza3IgPDwgbHNiKTsKKwkJCXBwZC0+Y3BzcGVjLT5pYmNkZHJjdHJsIHw9CisJCQkJKCgodTY0KShwcGQtPmxpbmtfd2lkdGhfZW5hYmxlZC0xKSAmIG1hc2tyKSA8PAorCQkJCSBsc2IpOworCQkJcWliX3dyaXRlX2tyZWcoZGQsIGtyX2liY2RkcmN0cmwsCisJCQkJICAgICAgIHBwZC0+Y3BzcGVjLT5pYmNkZHJjdHJsKTsKKwkJCXFpYl93cml0ZV9rcmVnKGRkLCBrcl9zY3JhdGNoLCAwKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcGQtPmxmbGFnc19sb2NrLCBmbGFncyk7CisJCQlwcGQtPmxmbGFncyB8PSBRSUJMX0lCX0ZPUkNFX05PVElGWTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwZC0+bGZsYWdzX2xvY2ssIGZsYWdzKTsKKwkJfQogCQlnb3RvIGJhaWw7CiAKIAljYXNlIFFJQl9JQl9DRkdfSFJUQlQ6IC8qIHNldCBIZWFydGJlYXQgb2ZmL2VuYWJsZS9hdXRvICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMKaW5kZXggOWY1M2U2OC4uNWVhOWVjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYwpAQCAtMTE0LDYgKzExNCwxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKHNpbmdsZXBvcnQsIHFpYl9zaW5nbGVwb3J0LCB1c2hvcnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhzaW5nbGVwb3J0LCAiVXNlIG9ubHkgSUIgcG9ydCAxOyBtb3JlIHBlci1wb3J0IGJ1ZmZlciBzcGFjZSIpOwogCitzdGF0aWMgdXNob3J0IHFpYl9rcmN2cTAxX25vX21zaTsKK21vZHVsZV9wYXJhbV9uYW1lZChrcmN2cTAxX25vX21zaSwgcWliX2tyY3ZxMDFfbm9fbXNpLCB1c2hvcnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhrcmN2cTAxX25vX21zaSwgIk5vIE1TSSBmb3Iga2N0eCA8IDIiKTsKKwogLyoKICAqIFJlY2VpdmUgaGVhZGVyIHF1ZXVlIHNpemVzCiAgKi8KQEAgLTM5Nyw3ICs0MDEsNiBAQAogI2RlZmluZSBjcnBfdHhkcm9wcGVkcGt0IENSRUdfSURYKFR4RHJvcHBlZFBrdENudCkKICNkZWZpbmUgY3JwX3R4aGRyZXJyIENSRUdfSURYKFR4SGVhZGVyc0VyckNudCkKICNkZWZpbmUgY3JwX3R4bGVuZXJyIENSRUdfSURYKFR4TGVuRXJyQ250KQotI2RlZmluZSBjcnBfdHhsZW5lcnIgQ1JFR19JRFgoVHhMZW5FcnJDbnQpCiAjZGVmaW5lIGNycF90eG1pbm1heGxlbmVyciBDUkVHX0lEWChUeE1heE1pbkxlbkVyckNudCkKICNkZWZpbmUgY3JwX3R4c2RtYWRlc2MgQ1JFR19JRFgoVHhTRG1hRGVzY0NudCkKICNkZWZpbmUgY3JwX3R4dW5kZXJydW4gQ1JFR19JRFgoVHhVbmRlcnJ1bkNudCkKQEAgLTQ2OSw2ICs0NzIsOCBAQAogI2RlZmluZSBJQl83MzIyX0xUX1NUQVRFX1JFQ09WRVJJRExFICAgICAweDBmCiAjZGVmaW5lIElCXzczMjJfTFRfU1RBVEVfQ0ZHRU5IICAgICAgICAgIDB4MTAKICNkZWZpbmUgSUJfNzMyMl9MVF9TVEFURV9DRkdURVNUICAgICAgICAgMHgxMQorI2RlZmluZSBJQl83MzIyX0xUX1NUQVRFX0NGR1dBSVRSTVRURVNUICAweDEyCisjZGVmaW5lIElCXzczMjJfTFRfU1RBVEVfQ0ZHV0FJVEVOSCAgICAgIDB4MTMKIAogLyogbGluayBzdGF0ZSBtYWNoaW5lIHN0YXRlcyBmcm9tIElCQyAqLwogI2RlZmluZSBJQl83MzIyX0xfU1RBVEVfRE9XTiAgICAgICAgICAgICAweDAKQEAgLTQ5OCw4ICs1MDMsMTAgQEAKIAkJSUJfUEhZU1BPUlRTVEFURV9MSU5LX0VSUl9SRUNPVkVSLAogCVtJQl83MzIyX0xUX1NUQVRFX0NGR0VOSF0gPSBJQl9QSFlTUE9SVFNUQVRFX0NGR19FTkgsCiAJW0lCXzczMjJfTFRfU1RBVEVfQ0ZHVEVTVF0gPSBJQl9QSFlTUE9SVFNUQVRFX0NGR19UUkFJTiwKLQlbMHgxMl0gPSBJQl9QSFlTUE9SVFNUQVRFX0NGR19UUkFJTiwKLQlbMHgxM10gPSBJQl9QSFlTUE9SVFNUQVRFX0NGR19XQUlUX0VOSCwKKwlbSUJfNzMyMl9MVF9TVEFURV9DRkdXQUlUUk1UVEVTVF0gPQorCQlJQl9QSFlTUE9SVFNUQVRFX0NGR19UUkFJTiwKKwlbSUJfNzMyMl9MVF9TVEFURV9DRkdXQUlURU5IXSA9CisJCUlCX1BIWVNQT1JUU1RBVEVfQ0ZHX1dBSVRfRU5ILAogCVsweDE0XSA9IElCX1BIWVNQT1JUU1RBVEVfQ0ZHX1RSQUlOLAogCVsweDE1XSA9IElCX1BIWVNQT1JUU1RBVEVfQ0ZHX1RSQUlOLAogCVsweDE2XSA9IElCX1BIWVNQT1JUU1RBVEVfQ0ZHX1RSQUlOLApAQCAtMTEwMyw5ICsxMTEwLDkgQEAKICNkZWZpbmUgQVVUT05FR19UUklFUyAzIC8qIHNlcXVlbnRpYWwgcmV0cmllcyB0byBuZWdvdGlhdGUgRERSICovCiAKICNkZWZpbmUgSFdFX0FVVE8oZmxkbmFtZSkgeyAubWFzayA9IFNZTV9NQVNLKEh3RXJyTWFzaywgZmxkbmFtZSMjTWFzayksIFwKLQkubXNnID0gI2ZsZG5hbWUgfQorCS5tc2cgPSAjZmxkbmFtZSAsIC5zeiA9IHNpemVvZigjZmxkbmFtZSkgfQogI2RlZmluZSBIV0VfQVVUT19QKGZsZG5hbWUsIHBvcnQpIHsgLm1hc2sgPSBTWU1fTUFTSyhId0Vyck1hc2ssIFwKLQlmbGRuYW1lIyNNYXNrIyNfIyNwb3J0KSwgLm1zZyA9ICNmbGRuYW1lIH0KKwlmbGRuYW1lIyNNYXNrIyNfIyNwb3J0KSwgLm1zZyA9ICNmbGRuYW1lICwgLnN6ID0gc2l6ZW9mKCNmbGRuYW1lKSB9CiBzdGF0aWMgY29uc3Qgc3RydWN0IHFpYl9od2Vycm9yX21zZ3MgcWliXzczMjJfaHdlcnJvcl9tc2dzW10gPSB7CiAJSFdFX0FVVE9fUChJQlNlcmRlc1BDbGtOb3REZXRlY3QsIDEpLAogCUhXRV9BVVRPX1AoSUJTZXJkZXNQQ2xrTm90RGV0ZWN0LCAwKSwKQEAgLTExMjMsMTQgKzExMzAsMTYgQEAKIAlIV0VfQVVUT19QKElCQ0J1c0Zyb21TUENQYXJpdHlFcnIsIDApLAogCUhXRV9BVVRPKHN0YXR1c1ZhbGlkTm9Fb3ApLAogCUhXRV9BVVRPKExBVHJpZ2dlcmVkKSwKLQl7IC5tYXNrID0gMCB9CisJeyAubWFzayA9IDAsIC5zeiA9IDAgfQogfTsKIAogI2RlZmluZSBFX0FVVE8oZmxkbmFtZSkgeyAubWFzayA9IFNZTV9NQVNLKEVyck1hc2ssIGZsZG5hbWUjI01hc2spLCBcCi0JLm1zZyA9ICNmbGRuYW1lIH0KKwkubXNnID0gI2ZsZG5hbWUsIC5zeiA9IHNpemVvZigjZmxkbmFtZSkgfQogI2RlZmluZSBFX1BfQVVUTyhmbGRuYW1lKSB7IC5tYXNrID0gU1lNX01BU0soRXJyTWFza18wLCBmbGRuYW1lIyNNYXNrKSwgXAotCS5tc2cgPSAjZmxkbmFtZSB9CisJLm1zZyA9ICNmbGRuYW1lLCAuc3ogPSBzaXplb2YoI2ZsZG5hbWUpIH0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcWliX2h3ZXJyb3JfbXNncyBxaWJfNzMyMmVycm9yX21zZ3NbXSA9IHsKKwlFX0FVVE8oUmN2RWdyRnVsbEVyciksCisJRV9BVVRPKFJjdkhkckZ1bGxFcnIpLAogCUVfQVVUTyhSZXNldE5lZ2F0ZWQpLAogCUVfQVVUTyhIYXJkd2FyZUVyciksCiAJRV9BVVRPKEludmFsaWRBZGRyRXJyKSwKQEAgLTExNDMsOSArMTE1Miw3IEBACiAJRV9BVVRPKFNlbmRTcGVjaWFsVHJpZ2dlckVyciksCiAJRV9BVVRPKFNEbWFXcm9uZ1BvcnRFcnIpLAogCUVfQVVUTyhTRG1hQnVmTWFza0R1cGxpY2F0ZUVyciksCi0JRV9BVVRPKFJjdkhkckZ1bGxFcnIpLAotCUVfQVVUTyhSY3ZFZ3JGdWxsRXJyKSwKLQl7IC5tYXNrID0gMCB9CisJeyAubWFzayA9IDAsIC5zeiA9IDAgfQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCAgcWliX2h3ZXJyb3JfbXNncyBxaWJfNzMyMnBfZXJyb3JfbXNnc1tdID0gewpAQCAtMTE1NSw3ICsxMTYyLDggQEAKIAkvKgogCSAqIFNEbWFIYWx0RXJyIGlzIG5vdCByZWFsbHkgYW4gZXJyb3IsIG1ha2UgaXQgY2xlYXJlcjsKIAkgKi8KLQl7Lm1hc2sgPSBTWU1fTUFTSyhFcnJNYXNrXzAsIFNEbWFIYWx0RXJyTWFzayksIC5tc2cgPSAiU0RtYUhhbHRlZCJ9LAorCXsubWFzayA9IFNZTV9NQVNLKEVyck1hc2tfMCwgU0RtYUhhbHRFcnJNYXNrKSwgLm1zZyA9ICJTRG1hSGFsdGVkIiwKKwkJLnN6ID0gMTF9LAogCUVfUF9BVVRPKFNEbWFEZXNjQWRkck1pc2FsaWduRXJyKSwKIAlFX1BfQVVUTyhTRG1hVW5leHBEYXRhRXJyKSwKIAlFX1BfQVVUTyhTRG1hTWlzc2luZ0R3RXJyKSwKQEAgLTExOTEsNyArMTE5OSw3IEBACiAJRV9QX0FVVE8oUmN2SUNSQ0VyciksCiAJRV9QX0FVVE8oUmN2VkNSQ0VyciksCiAJRV9QX0FVVE8oUmN2Rm9ybWF0RXJyKSwKLQl7IC5tYXNrID0gMCB9CisJeyAubWFzayA9IDAsIC5zeiA9IDAgfQogfTsKIAogLyoKQEAgLTExOTksMTcgKzEyMDcsMTcgQEAKICAqIGNvbnRleHQKICAqLwogI2RlZmluZSBJTlRSX0FVVE8oZmxkbmFtZSkgeyAubWFzayA9IFNZTV9NQVNLKEludE1hc2ssIGZsZG5hbWUjI01hc2spLCBcCi0JLm1zZyA9ICNmbGRuYW1lIH0KKwkubXNnID0gI2ZsZG5hbWUsIC5zeiA9IHNpemVvZigjZmxkbmFtZSkgfQogLyogQmVsb3cgZ2VuZXJhdGVzICJhdXRvLW1lc3NhZ2UiIGZvciBpbnRlcnJ1cHRzIHNwZWNpZmljIHRvIGEgcG9ydCAqLwogI2RlZmluZSBJTlRSX0FVVE9fUChmbGRuYW1lKSB7IC5tYXNrID0gTUFTS19BQ1JPU1MoXAogCVNZTV9MU0IoSW50TWFzaywgZmxkbmFtZSMjTWFzayMjXzApLCBcCiAJU1lNX0xTQihJbnRNYXNrLCBmbGRuYW1lIyNNYXNrIyNfMSkpLCBcCi0JLm1zZyA9ICNmbGRuYW1lICJfUCIgfQorCS5tc2cgPSAjZmxkbmFtZSAiX1AiLCAuc3ogPSBzaXplb2YoI2ZsZG5hbWUgIl9QIikgfQogLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU2VyRGVzVHJpbURvbmUgYml0cyBhcmUgcmV2ZXJzZWQgKi8KICNkZWZpbmUgSU5UUl9BVVRPX1BJKGZsZG5hbWUpIHsgLm1hc2sgPSBNQVNLX0FDUk9TUyhcCiAJU1lNX0xTQihJbnRNYXNrLCBmbGRuYW1lIyNNYXNrIyNfMSksIFwKIAlTWU1fTFNCKEludE1hc2ssIGZsZG5hbWUjI01hc2sjI18wKSksIFwKLQkubXNnID0gI2ZsZG5hbWUgIl9QIiB9CisJLm1zZyA9ICNmbGRuYW1lICJfUCIsIC5zeiA9IHNpemVvZigjZmxkbmFtZSAiX1AiKSB9CiAvKgogICogQmVsb3cgZ2VuZXJhdGVzICJhdXRvLW1lc3NhZ2UiIGZvciBpbnRlcnJ1cHRzIHNwZWNpZmljIHRvIGEgY29udGV4dCwKICAqIHdpdGggY3R4dC1udW1iZXIgYXBwZW5kZWQKQEAgLTEyMTcsNyArMTIyNSw3IEBACiAjZGVmaW5lIElOVFJfQVVUT19DKGZsZG5hbWUpIHsgLm1hc2sgPSBNQVNLX0FDUk9TUyhcCiAJU1lNX0xTQihJbnRNYXNrLCBmbGRuYW1lIyMwSW50TWFzayksIFwKIAlTWU1fTFNCKEludE1hc2ssIGZsZG5hbWUjIzE3SW50TWFzaykpLCBcCi0JLm1zZyA9ICNmbGRuYW1lICJfQyJ9CisJLm1zZyA9ICNmbGRuYW1lICJfQyIsIC5zeiA9IHNpemVvZigjZmxkbmFtZSAiX0MiKSB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgIHFpYl9od2Vycm9yX21zZ3MgcWliXzczMjJfaW50cl9tc2dzW10gPSB7CiAJSU5UUl9BVVRPX1AoU0RtYUludCksCkBAIC0xMjMxLDExICsxMjM5LDEyIEBACiAJSU5UUl9BVVRPX1AoU2VuZERvbmVJbnQpLAogCUlOVFJfQVVUTyhTZW5kQnVmQXZhaWxJbnQpLAogCUlOVFJfQVVUT19DKFJjdkF2YWlsKSwKLQl7IC5tYXNrID0gMCB9CisJeyAubWFzayA9IDAsIC5zeiA9IDAgfQogfTsKIAogI2RlZmluZSBUWFNZTVBUT01fQVVUT19QKGZsZG5hbWUpIFwKLQl7IC5tYXNrID0gU1lNX01BU0soU2VuZEhkckVyclN5bXB0b21fMCwgZmxkbmFtZSksIC5tc2cgPSAjZmxkbmFtZSB9CisJeyAubWFzayA9IFNZTV9NQVNLKFNlbmRIZHJFcnJTeW1wdG9tXzAsIGZsZG5hbWUpLCBcCisJLm1zZyA9ICNmbGRuYW1lLCAuc3ogPSBzaXplb2YoI2ZsZG5hbWUpIH0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgIHFpYl9od2Vycm9yX21zZ3MgaGRyY2hrX21zZ3NbXSA9IHsKIAlUWFNZTVBUT01fQVVUT19QKE5vbktleVBhY2tldCksCiAJVFhTWU1QVE9NX0FVVE9fUChHUkhGYWlsKSwKQEAgLTEyNDQsNyArMTI1Myw3IEBACiAJVFhTWU1QVE9NX0FVVE9fUChTTElERmFpbCksCiAJVFhTWU1QVE9NX0FVVE9fUChSYXdJUFY2KSwKIAlUWFNZTVBUT01fQVVUT19QKFBhY2tldFRvb1NtYWxsKSwKLQl7IC5tYXNrID0gMCB9CisJeyAubWFzayA9IDAsIC5zeiA9IDAgfQogfTsKIAogI2RlZmluZSBJQkE3MzIyX0hEUkhFQURfUEtUSU5UX1NISUZUIDMyIC8qIGludGVycnVwdCBjbnQgaW4gdXBwZXIgMzIgYml0cyAqLwpAQCAtMTI4OSw3ICsxMjk4LDcgQEAKIAl1NjQgdGhlc2UsIGxtYXNrOwogCWludCB0b29rLCBtdWx0aSwgbiA9IDA7CiAKLQl3aGlsZSAobXNwICYmIG1zcC0+bWFzaykgeworCXdoaWxlIChlcnJzICYmIG1zcCAmJiBtc3AtPm1hc2spIHsKIAkJbXVsdGkgPSAobXNwLT5tYXNrICYgKG1zcC0+bWFzayAtIDEpKTsKIAkJd2hpbGUgKGVycnMgJiBtc3AtPm1hc2spIHsKIAkJCXRoZXNlID0gKGVycnMgJiBtc3AtPm1hc2spOwpAQCAtMTMwMCw5ICsxMzA5LDE0IEBACiAJCQkJCSptc2crKyA9ICcsJzsKIAkJCQkJbGVuLS07CiAJCQkJfQotCQkJCXRvb2sgPSBzY25wcmludGYobXNnLCBsZW4sICIlcyIsIG1zcC0+bXNnKTsKKwkJCQlCVUdfT04oIW1zcC0+c3opOworCQkJCS8qIG1zcC0+c3ogY291bnRzIHRoZSBudWwgKi8KKwkJCQl0b29rID0gbWluX3Qoc2l6ZV90LCBtc3AtPnN6IC0gKHNpemVfdCkxLCBsZW4pOworCQkJCW1lbWNweShtc2csICBtc3AtPm1zZywgdG9vayk7CiAJCQkJbGVuIC09IHRvb2s7CiAJCQkJbXNnICs9IHRvb2s7CisJCQkJaWYgKGxlbikKKwkJCQkJKm1zZyA9ICdcMCc7CiAJCQl9CiAJCQllcnJzICY9IH5sbWFzazsKIAkJCWlmIChsZW4gJiYgbXVsdGkpIHsKQEAgLTE2NDAsNiArMTY1NCwxNCBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIHZvaWQgcWliX2Vycm9yX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBxaWJfZGV2ZGF0YSAqZGQgPSAoc3RydWN0IHFpYl9kZXZkYXRhICopZGF0YTsKKworCWhhbmRsZV83MzIyX2Vycm9ycyhkZCk7CisJcWliX3dyaXRlX2tyZWcoZGQsIGtyX2Vycm1hc2ssIGRkLT5jc3BlYy0+ZXJyb3JtYXNrKTsKK30KKwogc3RhdGljIHZvaWQgcmVlbmFibGVfY2hhc2UodW5zaWduZWQgbG9uZyBvcGFxdWUpCiB7CiAJc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZCA9IChzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqKW9wYXF1ZTsKQEAgLTE2OTIsNyArMTcxNCw5IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChpYmNsdCA9PSBJQl83MzIyX0xUX1NUQVRFX0NGR1RFU1QgJiYKKwlpZiAoKChpYmNsdCA+PSBJQl83MzIyX0xUX1NUQVRFX0NGR1RFU1QgJiYKKwkgICAgICBpYmNsdCA8PSBJQl83MzIyX0xUX1NUQVRFX0NGR1dBSVRFTkgpIHx8CisJICAgICBpYmNsdCA9PSBJQl83MzIyX0xUX1NUQVRFX0xJTktVUCkgJiYKIAkgICAgKGliY3N0ICYgU1lNX01BU0soSUJDU3RhdHVzQV8wLCBMaW5rU3BlZWRRRFIpKSkgewogCQlmb3JjZV9oMShwcGQpOwogCQlwcGQtPmNwc3BlYy0+cWRyX3JlZm9yY2UgPSAxOwpAQCAtMjcxOSw4ICsyNzQzLDEwIEBACiAJCXVua25vd25fNzMyMl9pYml0cyhkZCwgaXN0YXQpOwogCWlmIChpc3RhdCAmIFFJQl9JX0dQSU8pCiAJCXVua25vd25fNzMyMl9ncGlvX2ludHIoZGQpOwotCWlmIChpc3RhdCAmIFFJQl9JX0NfRVJST1IpCi0JCWhhbmRsZV83MzIyX2Vycm9ycyhkZCk7CisJaWYgKGlzdGF0ICYgUUlCX0lfQ19FUlJPUikgeworCQlxaWJfd3JpdGVfa3JlZyhkZCwga3JfZXJybWFzaywgMFVMTCk7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmRkLT5lcnJvcl90YXNrbGV0KTsKKwl9CiAJaWYgKGlzdGF0ICYgSU5UX01BU0tfUChFcnIsIDApICYmIGRkLT5yY2RbMF0pCiAJCWhhbmRsZV83MzIyX3BfZXJyb3JzKGRkLT5yY2RbMF0tPnBwZCk7CiAJaWYgKGlzdGF0ICYgSU5UX01BU0tfUChFcnIsIDEpICYmIGRkLT5yY2RbMV0pCkBAIC0zMTE5LDYgKzMxNDUsOCBAQAogCQkJYXJnID0gZGQtPnJjZFtjdHh0XTsKIAkJCWlmICghYXJnKQogCQkJCWNvbnRpbnVlOworCQkJaWYgKHFpYl9rcmN2cTAxX25vX21zaSAmJiBjdHh0IDwgMikKKwkJCQljb250aW51ZTsKIAkJCWxzYiA9IFFJQl9JX1JDVkFWQUlMX0xTQiArIGN0eHQ7CiAJCQloYW5kbGVyID0gcWliXzczMjJwaW50cjsKIAkJCW5hbWUgPSBRSUJfRFJWX05BTUUgIiAoa2N0eCkiOwpAQCAtMzE1Myw2ICszMTgxLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWRpcmVjdCk7IGkrKykKIAkJcWliX3dyaXRlX2tyZWcoZGQsIGtyX2ludHJlZGlyZWN0ICsgaSwgcmVkaXJlY3RbaV0pOwogCWRkLT5jc3BlYy0+bWFpbl9pbnRfbWFzayA9IG1hc2s7CisJdGFza2xldF9pbml0KCZkZC0+ZXJyb3JfdGFza2xldCwgcWliX2Vycm9yX3Rhc2tsZXQsCisJCSh1bnNpZ25lZCBsb25nKWRkKTsKIGJhaWw6OwogfQogCkBAIC02NzgyLDYgKzY4MTIsMTAgQEAKIAkJICAgIChpID49IEFSUkFZX1NJWkUoaXJxX3RhYmxlKSAmJgogCQkgICAgIGRkLT5yY2RbaSAtIEFSUkFZX1NJWkUoaXJxX3RhYmxlKV0pKQogCQkJYWN0dWFsX2NudCsrOworCS8qIHJlZHVjZSBieSBjdHh0J3MgPCAyICovCisJaWYgKHFpYl9rcmN2cTAxX25vX21zaSkKKwkJYWN0dWFsX2NudCAtPSBkZC0+bnVtX3Bwb3J0czsKKwogCXRhYnNpemUgPSBhY3R1YWxfY250OwogCWRkLT5jc3BlYy0+bXNpeF9lbnRyaWVzID0ga21hbGxvYyh0YWJzaXplICoKIAkJCXNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSksIEdGUF9LRVJORUwpOwpAQCAtNzMwMSwxMiArNzMzNSwxNyBAQAogc3RhdGljIHZvaWQgc2VyZGVzXzczMjJfbG9zX2VuYWJsZShzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkLCBpbnQgZW5hYmxlKQogewogCXU2NCBkYXRhID0gcWliX3JlYWRfa3JlZ19wb3J0KHBwZCwga3JwX3NlcmRlc2N0cmwpOwotCXByaW50ayhLRVJOX0lORk8gUUlCX0RSVl9OQU1FICIgSUIldToldSBUdXJuaW5nIExPUyAlc1xuIiwKLQkJcHBkLT5kZC0+dW5pdCwgcHBkLT5wb3J0LCAoZW5hYmxlID8gIm9uIiA6ICJvZmYiKSk7Ci0JaWYgKGVuYWJsZSkKKwl1OCBzdGF0ZSA9IFNZTV9GSUVMRChkYXRhLCBJQlNlcmRlc0N0cmxfMCwgUlhMT1NFTik7CisKKwlpZiAoZW5hYmxlICYmICFzdGF0ZSkgeworCQlwcmludGsoS0VSTl9JTkZPIFFJQl9EUlZfTkFNRSAiIElCJXU6JXUgVHVybmluZyBMT1Mgb25cbiIsCisJCQlwcGQtPmRkLT51bml0LCBwcGQtPnBvcnQpOwogCQlkYXRhIHw9IFNZTV9NQVNLKElCU2VyZGVzQ3RybF8wLCBSWExPU0VOKTsKLQllbHNlCisJfSBlbHNlIGlmICghZW5hYmxlICYmIHN0YXRlKSB7CisJCXByaW50ayhLRVJOX0lORk8gUUlCX0RSVl9OQU1FICIgSUIldToldSBUdXJuaW5nIExPUyBvZmZcbiIsCisJCQlwcGQtPmRkLT51bml0LCBwcGQtPnBvcnQpOwogCQlkYXRhICY9IH5TWU1fTUFTSyhJQlNlcmRlc0N0cmxfMCwgUlhMT1NFTik7CisJfQogCXFpYl93cml0ZV9rcmVnX3BvcnQocHBkLCBrcnBfc2VyZGVzY3RybCwgZGF0YSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ludHIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ludHIuYwppbmRleCBhNjkzYzU2Li42YWU1N2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbnRyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaW50ci5jCkBAIC05Niw4ICs5NiwxMiBAQAogCSAqIHN0YXRlcywgb3IgaWYgaXQgdHJhbnNpdGlvbnMgZnJvbSBhbnkgb2YgdGhlIHVwIChJTklUIG9yIGJldHRlcikKIAkgKiBzdGF0ZXMgaW50byBhbnkgb2YgdGhlIGRvd24gc3RhdGVzIChleGNlcHQgbGluayByZWNvdmVyeSksIHRoZW4KIAkgKiBjYWxsIHRoZSBjaGlwLXNwZWNpZmljIGNvZGUgdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb25zLgorCSAqCisJICogcHBkLT5sZmxhZ3MgY291bGQgYmUgMCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBpbnRlcnJ1cHQKKwkgKiBoYW5kbGVycyBoYXMgYmVlbiBjYWxsZWQgYnV0IHRoZSBsaW5rIGlzIGFscmVhZHkgdXAuCiAJICovCi0JaWYgKGxzdGF0ZSA+PSBJQl9QT1JUX0lOSVQgJiYgKHBwZC0+bGZsYWdzICYgUUlCTF9MSU5LRE9XTikgJiYKKwlpZiAobHN0YXRlID49IElCX1BPUlRfSU5JVCAmJgorCSAgICAoIXBwZC0+bGZsYWdzIHx8IChwcGQtPmxmbGFncyAmIFFJQkxfTElOS0RPV04pKSAmJgogCSAgICBsdHN0YXRlID09IElCX1BIWVNQT1JUU1RBVEVfTElOS1VQKSB7CiAJCS8qIHRyYW5zaXRpb25lZCB0byBVUCAqLwogCQlpZiAoZGQtPmZfaWJfdXBkb3duKHBwZCwgMSwgaWJjcykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX21hZC5jCmluZGV4IDhmZDNkZjUuLjNiMzc0NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX21hZC5jCkBAIC0xMTI1LDIyICsxMTI1LDIyIEBACiAJcmV0dXJuIElCX01BRF9SRVNVTFRfU1VDQ0VTUyB8IElCX01BRF9SRVNVTFRfQ09OU1VNRUQ7CiB9CiAKLXN0YXRpYyBpbnQgcG1hX2dldF9jbGFzc3BvcnRpbmZvKHN0cnVjdCBpYl9wZXJmICpwbXAsCitzdGF0aWMgaW50IHBtYV9nZXRfY2xhc3Nwb3J0aW5mbyhzdHJ1Y3QgaWJfcG1hX21hZCAqcG1wLAogCQkJCSBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldikKIHsKLQlzdHJ1Y3QgaWJfcG1hX2NsYXNzcG9ydGluZm8gKnAgPQotCQkoc3RydWN0IGliX3BtYV9jbGFzc3BvcnRpbmZvICopcG1wLT5kYXRhOworCXN0cnVjdCBpYl9jbGFzc19wb3J0X2luZm8gKnAgPQorCQkoc3RydWN0IGliX2NsYXNzX3BvcnRfaW5mbyAqKXBtcC0+ZGF0YTsKIAlzdHJ1Y3QgcWliX2RldmRhdGEgKmRkID0gZGRfZnJvbV9pYmRldihpYmRldik7CiAKIAltZW1zZXQocG1wLT5kYXRhLCAwLCBzaXplb2YocG1wLT5kYXRhKSk7CiAKLQlpZiAocG1wLT5hdHRyX21vZCAhPSAwKQotCQlwbXAtPnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKKwlpZiAocG1wLT5tYWRfaGRyLmF0dHJfbW9kICE9IDApCisJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CiAKIAkvKiBOb3RlIHRoYXQgQWxsUG9ydFNlbGVjdCBpcyBub3QgdmFsaWQgKi8KIAlwLT5iYXNlX3ZlcnNpb24gPSAxOwogCXAtPmNsYXNzX3ZlcnNpb24gPSAxOwotCXAtPmNhcF9tYXNrID0gSUJfUE1BX0NMQVNTX0NBUF9FWFRfV0lEVEg7CisJcC0+Y2FwYWJpbGl0eV9tYXNrID0gSUJfUE1BX0NMQVNTX0NBUF9FWFRfV0lEVEg7CiAJLyoKIAkgKiBTZXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIENNMiB0byBpbmRpY2F0ZSBzdXBwb3J0IGZvcgogCSAqIGNvbmdlc3Rpb24gc3RhdGlzdGljcwpAQCAtMTE1NCw3ICsxMTU0LDcgQEAKIAlyZXR1cm4gcmVwbHkoKHN0cnVjdCBpYl9zbXAgKikgcG1wKTsKIH0KIAotc3RhdGljIGludCBwbWFfZ2V0X3BvcnRzYW1wbGVzY29udHJvbChzdHJ1Y3QgaWJfcGVyZiAqcG1wLAorc3RhdGljIGludCBwbWFfZ2V0X3BvcnRzYW1wbGVzY29udHJvbChzdHJ1Y3QgaWJfcG1hX21hZCAqcG1wLAogCQkJCSAgICAgIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCB1OCBwb3J0KQogewogCXN0cnVjdCBpYl9wbWFfcG9ydHNhbXBsZXNjb250cm9sICpwID0KQEAgLTExNjksOCArMTE2OSw4IEBACiAJbWVtc2V0KHBtcC0+ZGF0YSwgMCwgc2l6ZW9mKHBtcC0+ZGF0YSkpOwogCiAJcC0+cG9ydF9zZWxlY3QgPSBwb3J0X3NlbGVjdDsKLQlpZiAocG1wLT5hdHRyX21vZCAhPSAwIHx8IHBvcnRfc2VsZWN0ICE9IHBvcnQpIHsKLQkJcG1wLT5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CisJaWYgKHBtcC0+bWFkX2hkci5hdHRyX21vZCAhPSAwIHx8IHBvcnRfc2VsZWN0ICE9IHBvcnQpIHsKKwkJcG1wLT5tYWRfaGRyLnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKIAkJZ290byBiYWlsOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWJwLT5sb2NrLCBmbGFncyk7CkBAIC0xMTkyLDcgKzExOTIsNyBAQAogCXJldHVybiByZXBseSgoc3RydWN0IGliX3NtcCAqKSBwbXApOwogfQogCi1zdGF0aWMgaW50IHBtYV9zZXRfcG9ydHNhbXBsZXNjb250cm9sKHN0cnVjdCBpYl9wZXJmICpwbXAsCitzdGF0aWMgaW50IHBtYV9zZXRfcG9ydHNhbXBsZXNjb250cm9sKHN0cnVjdCBpYl9wbWFfbWFkICpwbXAsCiAJCQkJICAgICAgc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHU4IHBvcnQpCiB7CiAJc3RydWN0IGliX3BtYV9wb3J0c2FtcGxlc2NvbnRyb2wgKnAgPQpAQCAtMTIwNSw4ICsxMjA1LDggQEAKIAl1OCBzdGF0dXMsIHhtaXRfZmxhZ3M7CiAJaW50IHJldDsKIAotCWlmIChwbXAtPmF0dHJfbW9kICE9IDAgfHwgcC0+cG9ydF9zZWxlY3QgIT0gcG9ydCkgewotCQlwbXAtPnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKKwlpZiAocG1wLT5tYWRfaGRyLmF0dHJfbW9kICE9IDAgfHwgcC0+cG9ydF9zZWxlY3QgIT0gcG9ydCkgeworCQlwbXAtPm1hZF9oZHIuc3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOwogCQlyZXQgPSByZXBseSgoc3RydWN0IGliX3NtcCAqKSBwbXApOwogCQlnb3RvIGJhaWw7CiAJfQpAQCAtMTMyMSw3ICsxMzIxLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHBtYV9nZXRfcG9ydHNhbXBsZXNyZXN1bHQoc3RydWN0IGliX3BlcmYgKnBtcCwKK3N0YXRpYyBpbnQgcG1hX2dldF9wb3J0c2FtcGxlc3Jlc3VsdChzdHJ1Y3QgaWJfcG1hX21hZCAqcG1wLAogCQkJCSAgICAgc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHU4IHBvcnQpCiB7CiAJc3RydWN0IGliX3BtYV9wb3J0c2FtcGxlc3Jlc3VsdCAqcCA9CkBAIC0xMzYwLDcgKzEzNjAsNyBAQAogCXJldHVybiByZXBseSgoc3RydWN0IGliX3NtcCAqKSBwbXApOwogfQogCi1zdGF0aWMgaW50IHBtYV9nZXRfcG9ydHNhbXBsZXNyZXN1bHRfZXh0KHN0cnVjdCBpYl9wZXJmICpwbXAsCitzdGF0aWMgaW50IHBtYV9nZXRfcG9ydHNhbXBsZXNyZXN1bHRfZXh0KHN0cnVjdCBpYl9wbWFfbWFkICpwbXAsCiAJCQkJCSBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgdTggcG9ydCkKIHsKIAlzdHJ1Y3QgaWJfcG1hX3BvcnRzYW1wbGVzcmVzdWx0X2V4dCAqcCA9CkBAIC0xNDAyLDcgKzE0MDIsNyBAQAogCXJldHVybiByZXBseSgoc3RydWN0IGliX3NtcCAqKSBwbXApOwogfQogCi1zdGF0aWMgaW50IHBtYV9nZXRfcG9ydGNvdW50ZXJzKHN0cnVjdCBpYl9wZXJmICpwbXAsCitzdGF0aWMgaW50IHBtYV9nZXRfcG9ydGNvdW50ZXJzKHN0cnVjdCBpYl9wbWFfbWFkICpwbXAsCiAJCQkJc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHU4IHBvcnQpCiB7CiAJc3RydWN0IGliX3BtYV9wb3J0Y291bnRlcnMgKnAgPSAoc3RydWN0IGliX3BtYV9wb3J0Y291bnRlcnMgKikKQEAgLTE0MzYsOCArMTQzNiw4IEBACiAJbWVtc2V0KHBtcC0+ZGF0YSwgMCwgc2l6ZW9mKHBtcC0+ZGF0YSkpOwogCiAJcC0+cG9ydF9zZWxlY3QgPSBwb3J0X3NlbGVjdDsKLQlpZiAocG1wLT5hdHRyX21vZCAhPSAwIHx8IHBvcnRfc2VsZWN0ICE9IHBvcnQpCi0JCXBtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOworCWlmIChwbXAtPm1hZF9oZHIuYXR0cl9tb2QgIT0gMCB8fCBwb3J0X3NlbGVjdCAhPSBwb3J0KQorCQlwbXAtPm1hZF9oZHIuc3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOwogCiAJaWYgKGNudHJzLnN5bWJvbF9lcnJvcl9jb3VudGVyID4gMHhGRkZGVUwpCiAJCXAtPnN5bWJvbF9lcnJvcl9jb3VudGVyID0gY3B1X3RvX2JlMTYoMHhGRkZGKTsKQEAgLTE0NzIsNyArMTQ3Miw3IEBACiAJCWNudHJzLmxvY2FsX2xpbmtfaW50ZWdyaXR5X2Vycm9ycyA9IDB4RlVMOwogCWlmIChjbnRycy5leGNlc3NpdmVfYnVmZmVyX292ZXJydW5fZXJyb3JzID4gMHhGVUwpCiAJCWNudHJzLmV4Y2Vzc2l2ZV9idWZmZXJfb3ZlcnJ1bl9lcnJvcnMgPSAweEZVTDsKLQlwLT5sbGlfZWJvcl9lcnJvcnMgPSAoY250cnMubG9jYWxfbGlua19pbnRlZ3JpdHlfZXJyb3JzIDw8IDQpIHwKKwlwLT5saW5rX292ZXJydW5fZXJyb3JzID0gKGNudHJzLmxvY2FsX2xpbmtfaW50ZWdyaXR5X2Vycm9ycyA8PCA0KSB8CiAJCWNudHJzLmV4Y2Vzc2l2ZV9idWZmZXJfb3ZlcnJ1bl9lcnJvcnM7CiAJaWYgKGNudHJzLnZsMTVfZHJvcHBlZCA+IDB4RkZGRlVMKQogCQlwLT52bDE1X2Ryb3BwZWQgPSBjcHVfdG9fYmUxNigweEZGRkYpOwpAQCAtMTUwMCw3ICsxNTAwLDcgQEAKIAlyZXR1cm4gcmVwbHkoKHN0cnVjdCBpYl9zbXAgKikgcG1wKTsKIH0KIAotc3RhdGljIGludCBwbWFfZ2V0X3BvcnRjb3VudGVyc19jb25nKHN0cnVjdCBpYl9wZXJmICpwbXAsCitzdGF0aWMgaW50IHBtYV9nZXRfcG9ydGNvdW50ZXJzX2Nvbmcoc3RydWN0IGliX3BtYV9tYWQgKnBtcCwKIAkJCQkgICAgIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCB1OCBwb3J0KQogewogCS8qIENvbmdlc3Rpb24gUE1BIHBhY2tldHMgc3RhcnQgYXQgb2Zmc2V0IDI0IG5vdCA2NCAqLwpAQCAtMTUxMCw3ICsxNTEwLDcgQEAKIAlzdHJ1Y3QgcWliX2licG9ydCAqaWJwID0gdG9faXBvcnQoaWJkZXYsIHBvcnQpOwogCXN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQgPSBwcGRfZnJvbV9pYnAoaWJwKTsKIAlzdHJ1Y3QgcWliX2RldmRhdGEgKmRkID0gZGRfZnJvbV9wcGQocHBkKTsKLQl1MzIgcG9ydF9zZWxlY3QgPSBiZTMyX3RvX2NwdShwbXAtPmF0dHJfbW9kKSAmIDB4RkY7CisJdTMyIHBvcnRfc2VsZWN0ID0gYmUzMl90b19jcHUocG1wLT5tYWRfaGRyLmF0dHJfbW9kKSAmIDB4RkY7CiAJdTY0IHhtaXRfd2FpdF9jb3VudGVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTE1MTksOSArMTUxOSw5IEBACiAJICogU0VUIG1ldGhvZCBlbmRzIHVwIGNhbGxpbmcgdGhpcyBhbnl3YXkuCiAJICovCiAJaWYgKCFkZC0+cHN4bWl0d2FpdF9zdXBwb3J0ZWQpCi0JCXBtcC0+c3RhdHVzIHw9IElCX1NNUF9VTlNVUF9NRVRIX0FUVFI7CisJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX1VOU1VQX01FVEhfQVRUUjsKIAlpZiAocG9ydF9zZWxlY3QgIT0gcG9ydCkKLQkJcG1wLT5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CisJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CiAKIAlxaWJfZ2V0X2NvdW50ZXJzKHBwZCwgJmNudHJzKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHBkLT5pYnBvcnRfZGF0YS5sb2NrLCBmbGFncyk7CkBAIC0xNjAzLDcgKzE2MDMsNyBAQAogCQljbnRycy5sb2NhbF9saW5rX2ludGVncml0eV9lcnJvcnMgPSAweEZVTDsKIAlpZiAoY250cnMuZXhjZXNzaXZlX2J1ZmZlcl9vdmVycnVuX2Vycm9ycyA+IDB4RlVMKQogCQljbnRycy5leGNlc3NpdmVfYnVmZmVyX292ZXJydW5fZXJyb3JzID0gMHhGVUw7Ci0JcC0+bGxpX2Vib3JfZXJyb3JzID0gKGNudHJzLmxvY2FsX2xpbmtfaW50ZWdyaXR5X2Vycm9ycyA8PCA0KSB8CisJcC0+bGlua19vdmVycnVuX2Vycm9ycyA9IChjbnRycy5sb2NhbF9saW5rX2ludGVncml0eV9lcnJvcnMgPDwgNCkgfAogCQljbnRycy5leGNlc3NpdmVfYnVmZmVyX292ZXJydW5fZXJyb3JzOwogCWlmIChjbnRycy52bDE1X2Ryb3BwZWQgPiAweEZGRkZVTCkKIAkJcC0+dmwxNV9kcm9wcGVkID0gY3B1X3RvX2JlMTYoMHhGRkZGKTsKQEAgLTE2MTMsNyArMTYxMyw3IEBACiAJcmV0dXJuIHJlcGx5KChzdHJ1Y3QgaWJfc21wICopcG1wKTsKIH0KIAotc3RhdGljIGludCBwbWFfZ2V0X3BvcnRjb3VudGVyc19leHQoc3RydWN0IGliX3BlcmYgKnBtcCwKK3N0YXRpYyBpbnQgcG1hX2dldF9wb3J0Y291bnRlcnNfZXh0KHN0cnVjdCBpYl9wbWFfbWFkICpwbXAsCiAJCQkJICAgIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCB1OCBwb3J0KQogewogCXN0cnVjdCBpYl9wbWFfcG9ydGNvdW50ZXJzX2V4dCAqcCA9CkBAIC0xNjI2LDggKzE2MjYsOCBAQAogCW1lbXNldChwbXAtPmRhdGEsIDAsIHNpemVvZihwbXAtPmRhdGEpKTsKIAogCXAtPnBvcnRfc2VsZWN0ID0gcG9ydF9zZWxlY3Q7Ci0JaWYgKHBtcC0+YXR0cl9tb2QgIT0gMCB8fCBwb3J0X3NlbGVjdCAhPSBwb3J0KSB7Ci0JCXBtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOworCWlmIChwbXAtPm1hZF9oZHIuYXR0cl9tb2QgIT0gMCB8fCBwb3J0X3NlbGVjdCAhPSBwb3J0KSB7CisJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CiAJCWdvdG8gYmFpbDsKIAl9CiAKQEAgLTE2NTIsNyArMTY1Miw3IEBACiAJcmV0dXJuIHJlcGx5KChzdHJ1Y3QgaWJfc21wICopIHBtcCk7CiB9CiAKLXN0YXRpYyBpbnQgcG1hX3NldF9wb3J0Y291bnRlcnMoc3RydWN0IGliX3BlcmYgKnBtcCwKK3N0YXRpYyBpbnQgcG1hX3NldF9wb3J0Y291bnRlcnMoc3RydWN0IGliX3BtYV9tYWQgKnBtcCwKIAkJCQlzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgdTggcG9ydCkKIHsKIAlzdHJ1Y3QgaWJfcG1hX3BvcnRjb3VudGVycyAqcCA9IChzdHJ1Y3QgaWJfcG1hX3BvcnRjb3VudGVycyAqKQpAQCAtMTcxNSwxNCArMTcxNSwxNCBAQAogCXJldHVybiBwbWFfZ2V0X3BvcnRjb3VudGVycyhwbXAsIGliZGV2LCBwb3J0KTsKIH0KIAotc3RhdGljIGludCBwbWFfc2V0X3BvcnRjb3VudGVyc19jb25nKHN0cnVjdCBpYl9wZXJmICpwbXAsCitzdGF0aWMgaW50IHBtYV9zZXRfcG9ydGNvdW50ZXJzX2Nvbmcoc3RydWN0IGliX3BtYV9tYWQgKnBtcCwKIAkJCQkgICAgIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCB1OCBwb3J0KQogewogCXN0cnVjdCBxaWJfaWJwb3J0ICppYnAgPSB0b19pcG9ydChpYmRldiwgcG9ydCk7CiAJc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZCA9IHBwZF9mcm9tX2licChpYnApOwogCXN0cnVjdCBxaWJfZGV2ZGF0YSAqZGQgPSBkZF9mcm9tX3BwZChwcGQpOwogCXN0cnVjdCBxaWJfdmVyYnNfY291bnRlcnMgY250cnM7Ci0JdTMyIGNvdW50ZXJfc2VsZWN0ID0gKGJlMzJfdG9fY3B1KHBtcC0+YXR0cl9tb2QpID4+IDI0KSAmIDB4RkY7CisJdTMyIGNvdW50ZXJfc2VsZWN0ID0gKGJlMzJfdG9fY3B1KHBtcC0+bWFkX2hkci5hdHRyX21vZCkgPj4gMjQpICYgMHhGRjsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xNzY2LDcgKzE3NjYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcG1hX3NldF9wb3J0Y291bnRlcnNfZXh0KHN0cnVjdCBpYl9wZXJmICpwbXAsCitzdGF0aWMgaW50IHBtYV9zZXRfcG9ydGNvdW50ZXJzX2V4dChzdHJ1Y3QgaWJfcG1hX21hZCAqcG1wLAogCQkJCSAgICBzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgdTggcG9ydCkKIHsKIAlzdHJ1Y3QgaWJfcG1hX3BvcnRjb3VudGVycyAqcCA9IChzdHJ1Y3QgaWJfcG1hX3BvcnRjb3VudGVycyAqKQpAQCAtMTk1OSwxOSArMTk1OSwxOSBAQAogCQkJc3RydWN0IGliX21hZCAqaW5fbWFkLAogCQkJc3RydWN0IGliX21hZCAqb3V0X21hZCkKIHsKLQlzdHJ1Y3QgaWJfcGVyZiAqcG1wID0gKHN0cnVjdCBpYl9wZXJmICopb3V0X21hZDsKKwlzdHJ1Y3QgaWJfcG1hX21hZCAqcG1wID0gKHN0cnVjdCBpYl9wbWFfbWFkICopb3V0X21hZDsKIAlpbnQgcmV0OwogCiAJKm91dF9tYWQgPSAqaW5fbWFkOwotCWlmIChwbXAtPmNsYXNzX3ZlcnNpb24gIT0gMSkgewotCQlwbXAtPnN0YXR1cyB8PSBJQl9TTVBfVU5TVVBfVkVSU0lPTjsKKwlpZiAocG1wLT5tYWRfaGRyLmNsYXNzX3ZlcnNpb24gIT0gMSkgeworCQlwbXAtPm1hZF9oZHIuc3RhdHVzIHw9IElCX1NNUF9VTlNVUF9WRVJTSU9OOwogCQlyZXQgPSByZXBseSgoc3RydWN0IGliX3NtcCAqKSBwbXApOwogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3dpdGNoIChwbXAtPm1ldGhvZCkgeworCXN3aXRjaCAocG1wLT5tYWRfaGRyLm1ldGhvZCkgewogCWNhc2UgSUJfTUdNVF9NRVRIT0RfR0VUOgotCQlzd2l0Y2ggKHBtcC0+YXR0cl9pZCkgeworCQlzd2l0Y2ggKHBtcC0+bWFkX2hkci5hdHRyX2lkKSB7CiAJCWNhc2UgSUJfUE1BX0NMQVNTX1BPUlRfSU5GTzoKIAkJCXJldCA9IHBtYV9nZXRfY2xhc3Nwb3J0aW5mbyhwbXAsIGliZGV2KTsKIAkJCWdvdG8gYmFpbDsKQEAgLTE5OTQsMTMgKzE5OTQsMTMgQEAKIAkJCXJldCA9IHBtYV9nZXRfcG9ydGNvdW50ZXJzX2NvbmcocG1wLCBpYmRldiwgcG9ydCk7CiAJCQlnb3RvIGJhaWw7CiAJCWRlZmF1bHQ6Ci0JCQlwbXAtPnN0YXR1cyB8PSBJQl9TTVBfVU5TVVBfTUVUSF9BVFRSOworCQkJcG1wLT5tYWRfaGRyLnN0YXR1cyB8PSBJQl9TTVBfVU5TVVBfTUVUSF9BVFRSOwogCQkJcmV0ID0gcmVwbHkoKHN0cnVjdCBpYl9zbXAgKikgcG1wKTsKIAkJCWdvdG8gYmFpbDsKIAkJfQogCiAJY2FzZSBJQl9NR01UX01FVEhPRF9TRVQ6Ci0JCXN3aXRjaCAocG1wLT5hdHRyX2lkKSB7CisJCXN3aXRjaCAocG1wLT5tYWRfaGRyLmF0dHJfaWQpIHsKIAkJY2FzZSBJQl9QTUFfUE9SVF9TQU1QTEVTX0NPTlRST0w6CiAJCQlyZXQgPSBwbWFfc2V0X3BvcnRzYW1wbGVzY29udHJvbChwbXAsIGliZGV2LCBwb3J0KTsKIAkJCWdvdG8gYmFpbDsKQEAgLTIwMTQsNyArMjAxNCw3IEBACiAJCQlyZXQgPSBwbWFfc2V0X3BvcnRjb3VudGVyc19jb25nKHBtcCwgaWJkZXYsIHBvcnQpOwogCQkJZ290byBiYWlsOwogCQlkZWZhdWx0OgotCQkJcG1wLT5zdGF0dXMgfD0gSUJfU01QX1VOU1VQX01FVEhfQVRUUjsKKwkJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX1VOU1VQX01FVEhfQVRUUjsKIAkJCXJldCA9IHJlcGx5KChzdHJ1Y3QgaWJfc21wICopIHBtcCk7CiAJCQlnb3RvIGJhaWw7CiAJCX0KQEAgLTIwMzAsNyArMjAzMCw3IEBACiAJCWdvdG8gYmFpbDsKIAogCWRlZmF1bHQ6Ci0JCXBtcC0+c3RhdHVzIHw9IElCX1NNUF9VTlNVUF9NRVRIT0Q7CisJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX1VOU1VQX01FVEhPRDsKIAkJcmV0ID0gcmVwbHkoKHN0cnVjdCBpYl9zbXAgKikgcG1wKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX21hZC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfbWFkLmgKaW5kZXggNzg0MGFiNS4uZWNjNDE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfbWFkLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfbWFkLmgKQEAgLTMyLDYgKzMyLDggQEAKICAqIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxyZG1hL2liX3BtYS5oPgorCiAjZGVmaW5lIElCX1NNUF9VTlNVUF9WRVJTSU9OICAgIGNwdV90b19iZTE2KDB4MDAwNCkKICNkZWZpbmUgSUJfU01QX1VOU1VQX01FVEhPRCAgICAgY3B1X3RvX2JlMTYoMHgwMDA4KQogI2RlZmluZSBJQl9TTVBfVU5TVVBfTUVUSF9BVFRSICBjcHVfdG9fYmUxNigweDAwMEMpCkBAIC0xODAsMTA5ICsxODIsOCBAQAogI2RlZmluZSBJQl9WTEFSQl9ISUdIUFJJXzBfMzEgICAzCiAjZGVmaW5lIElCX1ZMQVJCX0hJR0hQUklfMzJfNjMgIDQKIAotLyoKLSAqIFBNQSBjbGFzcyBwb3J0aW5mbyBjYXBhYmlsaXR5IG1hc2sgYml0cwotICovCi0jZGVmaW5lIElCX1BNQV9DTEFTU19DQVBfQUxMUE9SVFNFTEVDVCAgY3B1X3RvX2JlMTYoMSA8PCA4KQotI2RlZmluZSBJQl9QTUFfQ0xBU1NfQ0FQX0VYVF9XSURUSCAgICAgIGNwdV90b19iZTE2KDEgPDwgOSkKLSNkZWZpbmUgSUJfUE1BX0NMQVNTX0NBUF9YTUlUX1dBSVQgICAgICBjcHVfdG9fYmUxNigxIDw8IDEyKQotCi0jZGVmaW5lIElCX1BNQV9DTEFTU19QT1JUX0lORk8gICAgICAgICAgY3B1X3RvX2JlMTYoMHgwMDAxKQotI2RlZmluZSBJQl9QTUFfUE9SVF9TQU1QTEVTX0NPTlRST0wgICAgIGNwdV90b19iZTE2KDB4MDAxMCkKLSNkZWZpbmUgSUJfUE1BX1BPUlRfU0FNUExFU19SRVNVTFQgICAgICBjcHVfdG9fYmUxNigweDAwMTEpCi0jZGVmaW5lIElCX1BNQV9QT1JUX0NPVU5URVJTICAgICAgICAgICAgY3B1X3RvX2JlMTYoMHgwMDEyKQotI2RlZmluZSBJQl9QTUFfUE9SVF9DT1VOVEVSU19FWFQgICAgICAgIGNwdV90b19iZTE2KDB4MDAxRCkKLSNkZWZpbmUgSUJfUE1BX1BPUlRfU0FNUExFU19SRVNVTFRfRVhUICBjcHVfdG9fYmUxNigweDAwMUUpCiAjZGVmaW5lIElCX1BNQV9QT1JUX0NPVU5URVJTX0NPTkcgICAgICAgY3B1X3RvX2JlMTYoMHhGRjAwKQogCi1zdHJ1Y3QgaWJfcGVyZiB7Ci0JdTggYmFzZV92ZXJzaW9uOwotCXU4IG1nbXRfY2xhc3M7Ci0JdTggY2xhc3NfdmVyc2lvbjsKLQl1OCBtZXRob2Q7Ci0JX19iZTE2IHN0YXR1czsKLQlfX2JlMTYgdW51c2VkOwotCV9fYmU2NCB0aWQ7Ci0JX19iZTE2IGF0dHJfaWQ7Ci0JX19iZTE2IHJlc3Y7Ci0JX19iZTMyIGF0dHJfbW9kOwotCXU4IHJlc2VydmVkWzQwXTsKLQl1OCBkYXRhWzE5Ml07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGliX3BtYV9jbGFzc3BvcnRpbmZvIHsKLQl1OCBiYXNlX3ZlcnNpb247Ci0JdTggY2xhc3NfdmVyc2lvbjsKLQlfX2JlMTYgY2FwX21hc2s7Ci0JdTggcmVzZXJ2ZWRbM107Ci0JdTggcmVzcF90aW1lX3ZhbHVlOyAgICAgLyogb25seSBsb3dlciA1IGJpdHMgKi8KLQl1bmlvbiBpYl9naWQgcmVkaXJlY3RfZ2lkOwotCV9fYmUzMiByZWRpcmVjdF90Y19zbF9mbDsgICAgICAgLyogOCwgNCwgMjAgYml0cyByZXNwZWN0aXZlbHkgKi8KLQlfX2JlMTYgcmVkaXJlY3RfbGlkOwotCV9fYmUxNiByZWRpcmVjdF9wa2V5OwotCV9fYmUzMiByZWRpcmVjdF9xcDsgICAgIC8qIG9ubHkgbG93ZXIgMjQgYml0cyAqLwotCV9fYmUzMiByZWRpcmVjdF9xa2V5OwotCXVuaW9uIGliX2dpZCB0cmFwX2dpZDsKLQlfX2JlMzIgdHJhcF90Y19zbF9mbDsgICAvKiA4LCA0LCAyMCBiaXRzIHJlc3BlY3RpdmVseSAqLwotCV9fYmUxNiB0cmFwX2xpZDsKLQlfX2JlMTYgdHJhcF9wa2V5OwotCV9fYmUzMiB0cmFwX2hsX3FwOyAgICAgIC8qIDgsIDI0IGJpdHMgcmVzcGVjdGl2ZWx5ICovCi0JX19iZTMyIHRyYXBfcWtleTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWJfcG1hX3BvcnRzYW1wbGVzY29udHJvbCB7Ci0JdTggb3Bjb2RlOwotCXU4IHBvcnRfc2VsZWN0OwotCXU4IHRpY2s7Ci0JdTggY291bnRlcl93aWR0aDsgICAgICAgLyogb25seSBsb3dlciAzIGJpdHMgKi8KLQlfX2JlMzIgY291bnRlcl9tYXNrMF85OyAvKiAyLCAxMCAqIDMsIGJpdHMgKi8KLQlfX2JlMTYgY291bnRlcl9tYXNrMTBfMTQ7ICAgICAgIC8qIDEsIDUgKiAzLCBiaXRzICovCi0JdTggc2FtcGxlX21lY2hhbmlzbXM7Ci0JdTggc2FtcGxlX3N0YXR1czsgICAgICAgLyogb25seSBsb3dlciAyIGJpdHMgKi8KLQlfX2JlNjQgb3B0aW9uX21hc2s7Ci0JX19iZTY0IHZlbmRvcl9tYXNrOwotCV9fYmUzMiBzYW1wbGVfc3RhcnQ7Ci0JX19iZTMyIHNhbXBsZV9pbnRlcnZhbDsKLQlfX2JlMTYgdGFnOwotCV9fYmUxNiBjb3VudGVyX3NlbGVjdFsxNV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGliX3BtYV9wb3J0c2FtcGxlc3Jlc3VsdCB7Ci0JX19iZTE2IHRhZzsKLQlfX2JlMTYgc2FtcGxlX3N0YXR1czsgICAvKiBvbmx5IGxvd2VyIDIgYml0cyAqLwotCV9fYmUzMiBjb3VudGVyWzE1XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWJfcG1hX3BvcnRzYW1wbGVzcmVzdWx0X2V4dCB7Ci0JX19iZTE2IHRhZzsKLQlfX2JlMTYgc2FtcGxlX3N0YXR1czsgICAvKiBvbmx5IGxvd2VyIDIgYml0cyAqLwotCV9fYmUzMiBleHRlbmRlZF93aWR0aDsgIC8qIG9ubHkgdXBwZXIgMiBiaXRzICovCi0JX19iZTY0IGNvdW50ZXJbMTVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpYl9wbWFfcG9ydGNvdW50ZXJzIHsKLQl1OCByZXNlcnZlZDsKLQl1OCBwb3J0X3NlbGVjdDsKLQlfX2JlMTYgY291bnRlcl9zZWxlY3Q7Ci0JX19iZTE2IHN5bWJvbF9lcnJvcl9jb3VudGVyOwotCXU4IGxpbmtfZXJyb3JfcmVjb3ZlcnlfY291bnRlcjsKLQl1OCBsaW5rX2Rvd25lZF9jb3VudGVyOwotCV9fYmUxNiBwb3J0X3Jjdl9lcnJvcnM7Ci0JX19iZTE2IHBvcnRfcmN2X3JlbXBoeXNfZXJyb3JzOwotCV9fYmUxNiBwb3J0X3Jjdl9zd2l0Y2hfcmVsYXlfZXJyb3JzOwotCV9fYmUxNiBwb3J0X3htaXRfZGlzY2FyZHM7Ci0JdTggcG9ydF94bWl0X2NvbnN0cmFpbnRfZXJyb3JzOwotCXU4IHBvcnRfcmN2X2NvbnN0cmFpbnRfZXJyb3JzOwotCXU4IHJlc2VydmVkMTsKLQl1OCBsbGlfZWJvcl9lcnJvcnM7ICAgICAvKiA0LCA0LCBiaXRzICovCi0JX19iZTE2IHJlc2VydmVkMjsKLQlfX2JlMTYgdmwxNV9kcm9wcGVkOwotCV9fYmUzMiBwb3J0X3htaXRfZGF0YTsKLQlfX2JlMzIgcG9ydF9yY3ZfZGF0YTsKLQlfX2JlMzIgcG9ydF94bWl0X3BhY2tldHM7Ci0JX19iZTMyIHBvcnRfcmN2X3BhY2tldHM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQogc3RydWN0IGliX3BtYV9wb3J0Y291bnRlcnNfY29uZyB7CiAJdTggcmVzZXJ2ZWQ7CiAJdTggcmVzZXJ2ZWQxOwpAQCAtMjk3LDcgKzE5OCw3IEBACiAJdTggcG9ydF94bWl0X2NvbnN0cmFpbnRfZXJyb3JzOwogCXU4IHBvcnRfcmN2X2NvbnN0cmFpbnRfZXJyb3JzOwogCXU4IHJlc2VydmVkMjsKLQl1OCBsbGlfZWJvcl9lcnJvcnM7ICAgIC8qIDQsIDQsIGJpdHMgKi8KKwl1OCBsaW5rX292ZXJydW5fZXJyb3JzOyAvKiBMb2NhbExpbms6IDc6NCwgQnVmZmVyT3ZlcnJ1bjogMzowICovCiAJX19iZTE2IHJlc2VydmVkMzsKIAlfX2JlMTYgdmwxNV9kcm9wcGVkOwogCV9fYmU2NCBwb3J0X3htaXRfZGF0YTsKQEAgLTMxNiw0OSArMjE3LDExIEBACiAvKiBudW1iZXIgb2YgNG5zZWMgY3ljbGVzIGVxdWFsaW5nIDJzZWNzICovCiAjZGVmaW5lIFFJQl9DT05HX1RJTUVSX1BTSU5URVJWQUwgICAgICAgICAgICAgICAweDFEQ0Q2NEVDCiAKLSNkZWZpbmUgSUJfUE1BX1NFTF9TWU1CT0xfRVJST1IgICAgICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MDAwMSkKLSNkZWZpbmUgSUJfUE1BX1NFTF9MSU5LX0VSUk9SX1JFQ09WRVJZICAgICAgICAgIGNwdV90b19iZTE2KDB4MDAwMikKLSNkZWZpbmUgSUJfUE1BX1NFTF9MSU5LX0RPV05FRCAgICAgICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MDAwNCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1JDVl9FUlJPUlMgICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MDAwOCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1JDVl9SRU1QSFlTX0VSUk9SUyAgICAgIGNwdV90b19iZTE2KDB4MDAxMCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1hNSVRfRElTQ0FSRFMgICAgICAgICAgIGNwdV90b19iZTE2KDB4MDA0MCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9MT0NBTF9MSU5LX0lOVEVHUklUWV9FUlJPUlMgIGNwdV90b19iZTE2KDB4MDIwMCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9FWENFU1NJVkVfQlVGRkVSX09WRVJSVU5TICAgIGNwdV90b19iZTE2KDB4MDQwMCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1ZMMTVfRFJPUFBFRCAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MDgwMCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1hNSVRfREFUQSAgICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MTAwMCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1JDVl9EQVRBICAgICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MjAwMCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1hNSVRfUEFDS0VUUyAgICAgICAgICAgIGNwdV90b19iZTE2KDB4NDAwMCkKLSNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1JDVl9QQUNLRVRTICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4ODAwMCkKLQogI2RlZmluZSBJQl9QTUFfU0VMX0NPTkdfQUxMICAgICAgICAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBJQl9QTUFfU0VMX0NPTkdfUE9SVF9EQVRBICAgICAgICAgICAgICAgMHgwMgogI2RlZmluZSBJQl9QTUFfU0VMX0NPTkdfWE1JVCAgICAgICAgICAgICAgICAgICAgMHgwNAogI2RlZmluZSBJQl9QTUFfU0VMX0NPTkdfUk9VVElORyAgICAgICAgICAgICAgICAgMHgwOAogCi1zdHJ1Y3QgaWJfcG1hX3BvcnRjb3VudGVyc19leHQgewotCXU4IHJlc2VydmVkOwotCXU4IHBvcnRfc2VsZWN0OwotCV9fYmUxNiBjb3VudGVyX3NlbGVjdDsKLQlfX2JlMzIgcmVzZXJ2ZWQxOwotCV9fYmU2NCBwb3J0X3htaXRfZGF0YTsKLQlfX2JlNjQgcG9ydF9yY3ZfZGF0YTsKLQlfX2JlNjQgcG9ydF94bWl0X3BhY2tldHM7Ci0JX19iZTY0IHBvcnRfcmN2X3BhY2tldHM7Ci0JX19iZTY0IHBvcnRfdW5pY2FzdF94bWl0X3BhY2tldHM7Ci0JX19iZTY0IHBvcnRfdW5pY2FzdF9yY3ZfcGFja2V0czsKLQlfX2JlNjQgcG9ydF9tdWx0aWNhc3RfeG1pdF9wYWNrZXRzOwotCV9fYmU2NCBwb3J0X211bHRpY2FzdF9yY3ZfcGFja2V0czsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0jZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfWE1JVF9EQVRBICAgICAgICAgICAgICBjcHVfdG9fYmUxNigweDAwMDEpCi0jZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfUkNWX0RBVEEgICAgICAgICAgICAgICBjcHVfdG9fYmUxNigweDAwMDIpCi0jZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfWE1JVF9QQUNLRVRTICAgICAgICAgICBjcHVfdG9fYmUxNigweDAwMDQpCi0jZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfUkNWX1BBQ0tFVFMgICAgICAgICAgICBjcHVfdG9fYmUxNigweDAwMDgpCi0jZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfVU5JX1hNSVRfUEFDS0VUUyAgICAgICBjcHVfdG9fYmUxNigweDAwMTApCi0jZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfVU5JX1JDVl9QQUNLRVRTICAgICAgICBjcHVfdG9fYmUxNigweDAwMjApCi0jZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfTVVMVElfWE1JVF9QQUNLRVRTICAgICBjcHVfdG9fYmUxNigweDAwNDApCi0jZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfTVVMVElfUkNWX1BBQ0tFVFMgICAgICBjcHVfdG9fYmUxNigweDAwODApCi0KIC8qCiAgKiBUaGUgUG9ydFNhbXBsZXNDb250cm9sLkNvdW50ZXJNYXNrcyBmaWVsZCBpcyBhbiBhcnJheSBvZiAzIGJpdCBmaWVsZHMKICAqIHdoaWNoIHNwZWNpZnkgdGhlIE4ndGggY291bnRlcidzIGNhcGFiaWxpdGllcy4gU2VlIGNoLiAxNi4xLjMuMi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3BjaWUuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3BjaWUuYwppbmRleCA4OTFjYzJmLi40NDI2NzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9wY2llLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcGNpZS5jCkBAIC0yNTUsNyArMjU1LDcgQEAKIAl1MTYgbGlua3N0YXQsIHNwZWVkOwogCWludCBwb3MgPSAwLCBwb3NlLCByZXQgPSAxOwogCi0JcG9zZSA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGQtPnBjaWRldiwgUENJX0NBUF9JRF9FWFApOworCXBvc2UgPSBwY2lfcGNpZV9jYXAoZGQtPnBjaWRldik7CiAJaWYgKCFwb3NlKSB7CiAJCXFpYl9kZXZfZXJyKGRkLCAiQ2FuJ3QgZmluZCBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5IVxuIik7CiAJCS8qIHNldCB1cCBzb21ldGhpbmcuLi4gKi8KQEAgLTUwOSw3ICs1MDksNyBAQAogCQlxaWJfZGV2aW5mbyhkZC0+cGNpZGV2LCAiUGFyZW50IG5vdCByb290XG4iKTsKIAkJcmV0dXJuIDE7CiAJfQotCXBwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBhcmVudCwgUENJX0NBUF9JRF9FWFApOworCXBwb3MgPSBwY2lfcGNpZV9jYXAocGFyZW50KTsKIAlpZiAoIXBwb3MpCiAJCXJldHVybiAxOwogCWlmIChwYXJlbnQtPnZlbmRvciAhPSAweDgwODYpCkBAIC01NzgsMTQgKzU3OCwxNCBAQAogCQlxaWJfZGV2aW5mbyhkZC0+cGNpZGV2LCAiUGFyZW50IG5vdCByb290XG4iKTsKIAkJZ290byBiYWlsOwogCX0KLQlwcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwYXJlbnQsIFBDSV9DQVBfSURfRVhQKTsKKwlwcG9zID0gcGNpX3BjaWVfY2FwKHBhcmVudCk7CiAJaWYgKHBwb3MpIHsKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGFyZW50LCBwcG9zICsgUENJX0VYUF9ERVZDQVAsICZwY2Fwcyk7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBhcmVudCwgcHBvcyArIFBDSV9FWFBfREVWQ1RMLCAmcGN0bCk7CiAJfSBlbHNlCiAJCWdvdG8gYmFpbDsKIAkvKiBGaW5kIG91dCBzdXBwb3J0ZWQgYW5kIGNvbmZpZ3VyZWQgdmFsdWVzIGZvciBlbmRwb2ludCAodXMpICovCi0JZXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGQtPnBjaWRldiwgUENJX0NBUF9JRF9FWFApOworCWVwb3MgPSBwY2lfcGNpZV9jYXAoZGQtPnBjaWRldik7CiAJaWYgKGVwb3MpIHsKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGQtPnBjaWRldiwgZXBvcyArIFBDSV9FWFBfREVWQ0FQLCAmZWNhcHMpOwogCQlwY2lfcmVhZF9jb25maWdfd29yZChkZC0+cGNpZGV2LCBlcG9zICsgUENJX0VYUF9ERVZDVEwsICZlY3RsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3N5c2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zeXNmcy5jCmluZGV4IGQ1MGEzM2YuLjE0ZDEyOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc3lzZnMuYwpAQCAtNTA3LDYgKzUwNywxOCBAQAogCQlkZC0+Zmlyc3RfdXNlcl9jdHh0KTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19uZnJlZWN0eHRzKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHFpYl9pYmRldiAqZGV2ID0KKwkJY29udGFpbmVyX29mKGRldmljZSwgc3RydWN0IHFpYl9pYmRldiwgaWJkZXYuZGV2KTsKKwlzdHJ1Y3QgcWliX2RldmRhdGEgKmRkID0gZGRfZnJvbV9kZXYoZGV2KTsKKworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgdXNlciBwb3J0cyAoY29udGV4dHMpIGF2YWlsYWJsZS4gKi8KKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIGRkLT5jZmdjdHh0cyAtCisJCWRkLT5maXJzdF91c2VyX2N0eHQgLSAodTMyKXFpYl9zdGF0cy5zcHNfY3R4dHMpOworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X3NlcmlhbChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCiAJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtNjA0LDYgKzYxNiw3IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoYm9hcmRfaWQsIFNfSVJVR08sIHNob3dfaGNhLCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih2ZXJzaW9uLCBTX0lSVUdPLCBzaG93X3ZlcnNpb24sIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKG5jdHh0cywgU19JUlVHTywgc2hvd19uY3R4dHMsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKG5mcmVlY3R4dHMsIFNfSVJVR08sIHNob3dfbmZyZWVjdHh0cywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoc2VyaWFsLCBTX0lSVUdPLCBzaG93X3NlcmlhbCwgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoYm9hcmR2ZXJzaW9uLCBTX0lSVUdPLCBzaG93X2JvYXJkdmVyc2lvbiwgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIobG9nZ2VkX2Vycm9ycywgU19JUlVHTywgc2hvd19sb2dnZWRfZXJycywgTlVMTCk7CkBAIC02MTcsNiArNjMwLDcgQEAKIAkmZGV2X2F0dHJfYm9hcmRfaWQsCiAJJmRldl9hdHRyX3ZlcnNpb24sCiAJJmRldl9hdHRyX25jdHh0cywKKwkmZGV2X2F0dHJfbmZyZWVjdHh0cywKIAkmZGV2X2F0dHJfc2VyaWFsLAogCSZkZXZfYXR0cl9ib2FyZHZlcnNpb24sCiAJJmRldl9hdHRyX2xvZ2dlZF9lcnJvcnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCmluZGV4IDg2YWRkY2EuLjQzZjg5YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCkBAIC01NjAsOSArNTYwLDExIEBACiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBvaWJfcGF0aCAqcGF0aDsKIAlzdHJ1Y3QgaXBvaWJfbmVpZ2ggKm5laWdoOworCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCW5laWdoID0gaXBvaWJfbmVpZ2hfYWxsb2Moc2tiX2RzdChza2IpLT5uZWlnaGJvdXIsIHNrYi0+ZGV2KTsKKwluID0gZHN0X2dldF9uZWlnaGJvdXIoc2tiX2RzdChza2IpKTsKKwluZWlnaCA9IGlwb2liX25laWdoX2FsbG9jKG4sIHNrYi0+ZGV2KTsKIAlpZiAoIW5laWdoKSB7CiAJCSsrZGV2LT5zdGF0cy50eF9kcm9wcGVkOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtNTcxLDkgKzU3Myw5IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JcGF0aCA9IF9fcGF0aF9maW5kKGRldiwgc2tiX2RzdChza2IpLT5uZWlnaGJvdXItPmhhICsgNCk7CisJcGF0aCA9IF9fcGF0aF9maW5kKGRldiwgbi0+aGEgKyA0KTsKIAlpZiAoIXBhdGgpIHsKLQkJcGF0aCA9IHBhdGhfcmVjX2NyZWF0ZShkZXYsIHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyLT5oYSArIDQpOworCQlwYXRoID0gcGF0aF9yZWNfY3JlYXRlKGRldiwgbi0+aGEgKyA0KTsKIAkJaWYgKCFwYXRoKQogCQkJZ290byBlcnJfcGF0aDsKIApAQCAtNjA3LDcgKzYwOSw3IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlpcG9pYl9zZW5kKGRldiwgc2tiLCBwYXRoLT5haCwgSVBPSUJfUVBOKHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyLT5oYSkpOworCQkJaXBvaWJfc2VuZChkZXYsIHNrYiwgcGF0aC0+YWgsIElQT0lCX1FQTihuLT5oYSkpOwogCQkJcmV0dXJuOwogCQl9CiAJfSBlbHNlIHsKQEAgLTYzNywxNyArNjM5LDIwIEBACiBzdGF0aWMgdm9pZCBpcG9pYl9wYXRoX2xvb2t1cChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KHNrYi0+ZGV2KTsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7CisJc3RydWN0IG5laWdoYm91ciAqbjsKIAogCS8qIExvb2sgdXAgcGF0aCByZWNvcmQgZm9yIHVuaWNhc3RzICovCi0JaWYgKHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyLT5oYVs0XSAhPSAweGZmKSB7CisJbiA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCk7CisJaWYgKG4tPmhhWzRdICE9IDB4ZmYpIHsKIAkJbmVpZ2hfYWRkX3BhdGgoc2tiLCBkZXYpOwogCQlyZXR1cm47CiAJfQogCiAJLyogQWRkIGluIHRoZSBQX0tleSBmb3IgbXVsdGljYXN0cyAqLwotCXNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyLT5oYVs4XSA9IChwcml2LT5wa2V5ID4+IDgpICYgMHhmZjsKLQlza2JfZHN0KHNrYiktPm5laWdoYm91ci0+aGFbOV0gPSBwcml2LT5wa2V5ICYgMHhmZjsKLQlpcG9pYl9tY2FzdF9zZW5kKGRldiwgc2tiX2RzdChza2IpLT5uZWlnaGJvdXItPmhhICsgNCwgc2tiKTsKKwluLT5oYVs4XSA9IChwcml2LT5wa2V5ID4+IDgpICYgMHhmZjsKKwluLT5oYVs5XSA9IHByaXYtPnBrZXkgJiAweGZmOworCWlwb2liX21jYXN0X3NlbmQoZGV2LCBuLT5oYSArIDQsIHNrYik7CiB9CiAKIHN0YXRpYyB2b2lkIHVuaWNhc3RfYXJwX3NlbmQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTcxMiwxOCArNzE3LDIwIEBACiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBvaWJfbmVpZ2ggKm5laWdoOworCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChsaWtlbHkoc2tiX2RzdChza2IpICYmIHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyKSkgewotCQlpZiAodW5saWtlbHkoISp0b19pcG9pYl9uZWlnaChza2JfZHN0KHNrYiktPm5laWdoYm91cikpKSB7CisJbiA9IGRzdF9nZXRfbmVpZ2hib3VyKHNrYl9kc3Qoc2tiKSk7CisJaWYgKGxpa2VseShza2JfZHN0KHNrYikgJiYgbikpIHsKKwkJaWYgKHVubGlrZWx5KCEqdG9faXBvaWJfbmVpZ2gobikpKSB7CiAJCQlpcG9pYl9wYXRoX2xvb2t1cChza2IsIGRldik7CiAJCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCQl9CiAKLQkJbmVpZ2ggPSAqdG9faXBvaWJfbmVpZ2goc2tiX2RzdChza2IpLT5uZWlnaGJvdXIpOworCQluZWlnaCA9ICp0b19pcG9pYl9uZWlnaChuKTsKIAogCQlpZiAodW5saWtlbHkoKG1lbWNtcCgmbmVpZ2gtPmRnaWQucmF3LAotCQkJCSAgICAgc2tiX2RzdChza2IpLT5uZWlnaGJvdXItPmhhICsgNCwKKwkJCQkgICAgIG4tPmhhICsgNCwKIAkJCQkgICAgIHNpemVvZih1bmlvbiBpYl9naWQpKSkgfHwKIAkJCSAgICAgKG5laWdoLT5kZXYgIT0gZGV2KSkpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC03NDksNyArNzU2LDcgQEAKIAkJCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCQkJfQogCQl9IGVsc2UgaWYgKG5laWdoLT5haCkgewotCQkJaXBvaWJfc2VuZChkZXYsIHNrYiwgbmVpZ2gtPmFoLCBJUE9JQl9RUE4oc2tiX2RzdChza2IpLT5uZWlnaGJvdXItPmhhKSk7CisJCQlpcG9pYl9zZW5kKGRldiwgc2tiLCBuZWlnaC0+YWgsIElQT0lCX1FQTihuLT5oYSkpOwogCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAkJfQogCkBAIC04MTIsNiArODE5LDggQEAKIAkJCSAgICAgY29uc3Qgdm9pZCAqZGFkZHIsIGNvbnN0IHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCiB7CiAJc3RydWN0IGlwb2liX2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuOwogCiAJaGVhZGVyID0gKHN0cnVjdCBpcG9pYl9oZWFkZXIgKikgc2tiX3B1c2goc2tiLCBzaXplb2YgKmhlYWRlcik7CiAKQEAgLTgyMyw3ICs4MzIsMTEgQEAKIAkgKiBkZXN0aW5hdGlvbiBhZGRyZXNzIG9udG8gdGhlIGZyb250IG9mIHRoZSBza2Igc28gd2UgY2FuCiAJICogZmlndXJlIG91dCB3aGVyZSB0byBzZW5kIHRoZSBwYWNrZXQgbGF0ZXIuCiAJICovCi0JaWYgKCghc2tiX2RzdChza2IpIHx8ICFza2JfZHN0KHNrYiktPm5laWdoYm91cikgJiYgZGFkZHIpIHsKKwlkc3QgPSBza2JfZHN0KHNrYik7CisJbiA9IE5VTEw7CisJaWYgKGRzdCkKKwkJbiA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCk7CisJaWYgKCghZHN0IHx8ICFuKSAmJiBkYWRkcikgewogCQlzdHJ1Y3QgaXBvaWJfcHNldWRvaGVhZGVyICpwaGRyID0KIAkJCShzdHJ1Y3QgaXBvaWJfcHNldWRvaGVhZGVyICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mICpwaGRyKTsKIAkJbWVtY3B5KHBoZHItPmh3YWRkciwgZGFkZHIsIElORklOSUJBTkRfQUxFTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYwppbmRleCAzODcxYWM2Li5lY2VhNGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKQEAgLTI1OCwxMSArMjU4LDE1IEBACiAJbmV0aWZfdHhfbG9ja19iaChkZXYpOwogCXdoaWxlICghc2tiX3F1ZXVlX2VtcHR5KCZtY2FzdC0+cGt0X3F1ZXVlKSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2tiX2RlcXVldWUoJm1jYXN0LT5wa3RfcXVldWUpOworCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7CisJCXN0cnVjdCBuZWlnaGJvdXIgKm4gPSBOVUxMOworCiAJCW5ldGlmX3R4X3VubG9ja19iaChkZXYpOwogCiAJCXNrYi0+ZGV2ID0gZGV2OwotCi0JCWlmICghc2tiX2RzdChza2IpIHx8ICFza2JfZHN0KHNrYiktPm5laWdoYm91cikgeworCQlpZiAoZHN0KQorCQkJbiA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCk7CisJCWlmICghZHN0IHx8ICFuKSB7CiAJCQkvKiBwdXQgcHNldWRvaGVhZGVyIGJhY2sgb24gZm9yIG5leHQgdGltZSAqLwogCQkJc2tiX3B1c2goc2tiLCBzaXplb2YgKHN0cnVjdCBpcG9pYl9wc2V1ZG9oZWFkZXIpKTsKIAkJfQpAQCAtNzE1LDExICs3MTksMTMgQEAKIAogb3V0OgogCWlmIChtY2FzdCAmJiBtY2FzdC0+YWgpIHsKLQkJaWYgKHNrYl9kc3Qoc2tiKQkJJiYKLQkJICAgIHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyICYmCi0JCSAgICAhKnRvX2lwb2liX25laWdoKHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyKSkgewotCQkJc3RydWN0IGlwb2liX25laWdoICpuZWlnaCA9IGlwb2liX25laWdoX2FsbG9jKHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyLAotCQkJCQkJCQkJc2tiLT5kZXYpOworCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7CisJCXN0cnVjdCBuZWlnaGJvdXIgKm4gPSBOVUxMOworCQlpZiAoZHN0KQorCQkJbiA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCk7CisJCWlmIChuICYmICEqdG9faXBvaWJfbmVpZ2gobikpIHsKKwkJCXN0cnVjdCBpcG9pYl9uZWlnaCAqbmVpZ2ggPSBpcG9pYl9uZWlnaF9hbGxvYyhuLAorCQkJCQkJCQkgICAgICBza2ItPmRldik7CiAKIAkJCWlmIChuZWlnaCkgewogCQkJCWtyZWZfZ2V0KCZtY2FzdC0+YWgtPnJlZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuaAppbmRleCAyZjAyYWIwLi4zNDJjYmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxzY3NpL2xpYmlzY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oPgogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwppbmRleCBlZTE2NWZkLi43ZDUxMDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwpAQCAtMjEyNyw2ICsyMTI3LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl0YXJnZXRfaG9zdC0+dHJhbnNwb3J0dCAgPSBpYl9zcnBfdHJhbnNwb3J0X3RlbXBsYXRlOworCXRhcmdldF9ob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisJdGFyZ2V0X2hvc3QtPm1heF9pZCAgICAgID0gMTsKIAl0YXJnZXRfaG9zdC0+bWF4X2x1biAgICAgPSBTUlBfTUFYX0xVTjsKIAl0YXJnZXRfaG9zdC0+bWF4X2NtZF9sZW4gPSBzaXplb2YgKChzdHJ1Y3Qgc3JwX2NtZCAqKSAodm9pZCAqKSAwTCktPmNkYjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9ldmRldi5jIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCmluZGV4IGJlMDkyMWUuLjRjZjI1MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKQEAgLTExMSw3ICsxMTEsOCBAQAogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmV2ZGV2LT53YWl0KTsKKwlpZiAodHlwZSA9PSBFVl9TWU4gJiYgY29kZSA9PSBTWU5fUkVQT1JUKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmV2ZGV2LT53YWl0KTsKIH0KIAogc3RhdGljIGludCBldmRldl9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCmluZGV4IDViOGY1OWQuLmMzNTFhYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogI2lmIGRlZmluZWQoX19pMzg2X18pCiAKLSNpbmNsdWRlIDxhc20vaTgyNTMuaD4KKyNpbmNsdWRlIDxsaW51eC9pODI1My5oPgogCiAjZGVmaW5lIERFTFRBKHgseSkgICAgICAoKHkpLSh4KSsoKHkpPCh4KT8xMTkzMTgyL0haOjApKQogI2RlZmluZSBHRVRfVElNRSh4KSAgICAgZG8geyB4ID0gZ2V0X3RpbWVfcGl0KCk7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKaW5kZXggNzVlMTFjNy4uZGEzOGQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwpAQCAtMTc1Niw3ICsxNzU2LDcgQEAKIAl9IGVsc2UgaWYgKHRlc3RfYml0KEFCU19NVF9UUkFDS0lOR19JRCwgZGV2LT5hYnNiaXQpKSB7CiAJCW10X3Nsb3RzID0gZGV2LT5hYnNpbmZvW0FCU19NVF9UUkFDS0lOR19JRF0ubWF4aW11bSAtCiAJCQkgICBkZXYtPmFic2luZm9bQUJTX01UX1RSQUNLSU5HX0lEXS5taW5pbXVtICsgMSwKLQkJY2xhbXAobXRfc2xvdHMsIDIsIDMyKTsKKwkJbXRfc2xvdHMgPSBjbGFtcChtdF9zbG90cywgMiwgMzIpOwogCX0gZWxzZSBpZiAodGVzdF9iaXQoQUJTX01UX1BPU0lUSU9OX1gsIGRldi0+YWJzYml0KSkgewogCQltdF9zbG90cyA9IDI7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW5hbG9nLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jCmluZGV4IDRhZmUwYTMuLjk4ODI5NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW5hbG9nLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbmFsb2cuYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAKICNpZmRlZiBfX2kzODZfXwogCi0jaW5jbHVkZSA8YXNtL2k4MjUzLmg+CisjaW5jbHVkZSA8bGludXgvaTgyNTMuaD4KIAogI2RlZmluZSBHRVRfVElNRSh4KQlkbyB7IGlmIChjcHVfaGFzX3RzYykgcmR0c2NsKHgpOyBlbHNlIHggPSBnZXRfdGltZV9waXQoKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgREVMVEEoeCx5KQkoY3B1X2hhc190c2MgPyAoKHkpIC0gKHgpKSA6ICgoeCkgLSAoeSkgKyAoKHgpIDwgKHkpID8gQ0xPQ0tfVElDS19SQVRFIC8gSFogOiAwKSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMKaW5kZXggZjIzYTc0My4uMzNkMGJkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYwpAQCAtMjA5LDYgKzIwOSw3IEBACiAjZW5kaWYKIAkJfQogCX0KKwlpbnB1dF9zeW5jKG9tYXBfa3BfZGF0YS0+aW5wdXQpOwogCW1lbWNweShrZXlwYWRfc3RhdGUsIG5ld19zdGF0ZSwgc2l6ZW9mKGtleXBhZF9zdGF0ZSkpOwogCiAJaWYgKGtleV9kb3duKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3BtaWM4eHh4LWtleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9wbWljOHh4eC1rZXlwYWQuYwppbmRleCA0MGIwMmFlLi42MjI5YzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3BtaWM4eHh4LWtleXBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcG1pYzh4eHgta2V5cGFkLmMKQEAgLTUyMCw3ICs1MjAsOCBAQAogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBwbWljOHh4eF9rcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWNvbnN0IHN0cnVjdCBwbTh4eHhfa2V5cGFkX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gbWZkX2dldF9kYXRhKHBkZXYpOworCWNvbnN0IHN0cnVjdCBwbTh4eHhfa2V5cGFkX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwkJCQkJZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAljb25zdCBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhICprZXltYXBfZGF0YTsKIAlzdHJ1Y3QgcG1pYzh4eHhfa3AgKmtwOwogCWludCByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc2hfa2V5c2MuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc2hfa2V5c2MuYwppbmRleCA4MzRjZjk4Li42ODc2NzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3NoX2tleXNjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zaF9rZXlzYy5jCkBAIC0zMiw3ICszMiw3IEBACiAJW1NIX0tFWVNDX01PREVfM10gPSB7IDIsIDQsIDcgfSwKIAlbU0hfS0VZU0NfTU9ERV80XSA9IHsgMywgNiwgNiB9LAogCVtTSF9LRVlTQ19NT0RFXzVdID0geyA0LCA2LCA3IH0sCi0JW1NIX0tFWVNDX01PREVfNl0gPSB7IDUsIDcsIDcgfSwKKwlbU0hfS0VZU0NfTU9ERV82XSA9IHsgNSwgOCwgOCB9LAogfTsKIAogc3RydWN0IHNoX2tleXNjX3ByaXYgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3Bjc3Brci5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3Bjc3Brci5jCmluZGV4IGYwODBkZDMuLjM0ZjRkMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9wY3Nwa3IuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvcGNzcGtyLmMKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2k4MjUzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yNSwxNCArMjYsNiBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpwY3Nwa3IiKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01JUFMpIHx8IGRlZmluZWQoQ09ORklHX1g4NikKLS8qIFVzZSB0aGUgZ2xvYmFsIFBJVCBsb2NrICEgKi8KLSNpbmNsdWRlIDxhc20vaTgyNTMuaD4KLSNlbHNlCi0jaW5jbHVkZSA8YXNtLzgyNTNwaXQuaD4KLXN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGk4MjUzX2xvY2spOwotI2VuZGlmCi0KIHN0YXRpYyBpbnQgcGNzcGtyX2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCiB7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9wbWljOHh4eC1wd3JrZXkuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9wbWljOHh4eC1wd3JrZXkuYwppbmRleCA5N2UwN2U3Li5iM2NmYjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvcG1pYzh4eHgtcHdya2V5LmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3BtaWM4eHh4LXB3cmtleS5jCkBAIC05MCw3ICs5MCw4IEBACiAJdW5zaWduZWQgaW50IGRlbGF5OwogCXU4IHBvbl9jbnRsOwogCXN0cnVjdCBwbWljOHh4eF9wd3JrZXkgKnB3cmtleTsKLQljb25zdCBzdHJ1Y3QgcG04eHh4X3B3cmtleV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IG1mZF9nZXRfZGF0YShwZGV2KTsKKwljb25zdCBzdHJ1Y3QgcG04eHh4X3B3cmtleV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJCQkJCWRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAKIAlpZiAoIXBkYXRhKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInBvd2VyIGtleSBwbGF0Zm9ybSBkYXRhIG5vdCBzdXBwbGllZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKaW5kZXggMjU3ZTAzMy4uMDExMGI1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJCWlmIChzaXplID09IDApCiAJCQlzaXplID0geHJlcyA/IDogMTsKIAotCQljbGFtcCh2YWx1ZSwgbWluLCBtYXgpOworCQl2YWx1ZSA9IGNsYW1wKHZhbHVlLCBtaW4sIG1heCk7CiAKIAkJbW91c2VkZXYtPnBhY2tldC54ID0gKCh2YWx1ZSAtIG1pbikgKiB4cmVzKSAvIHNpemU7CiAJCW1vdXNlZGV2LT5wYWNrZXQuYWJzX2V2ZW50ID0gMTsKQEAgLTIwMSw3ICsyMDEsNyBAQAogCQlpZiAoc2l6ZSA9PSAwKQogCQkJc2l6ZSA9IHlyZXMgPyA6IDE7CiAKLQkJY2xhbXAodmFsdWUsIG1pbiwgbWF4KTsKKwkJdmFsdWUgPSBjbGFtcCh2YWx1ZSwgbWluLCBtYXgpOwogCiAJCW1vdXNlZGV2LT5wYWNrZXQueSA9IHlyZXMgLSAoKHZhbHVlIC0gbWluKSAqIHlyZXMpIC8gc2l6ZTsKIAkJbW91c2VkZXYtPnBhY2tldC5hYnNfZXZlbnQgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMKaW5kZXggOTgwYWY5NC4uMDdhODM2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2xpYnBzMi5jCkBAIC0yMTAsNyArMjEwLDcgQEAKIAkvKgogCSAqIFNvbWUgZGV2aWNlcyAoU3luYXB0aWNzKSBwZWZvcm0gdGhlIHJlc2V0IGJlZm9yZQogCSAqIEFDS2luZyB0aGUgcmVzZXQgY29tbWFuZCwgYW5kIHNvIGl0IGNhbiB0YWtlIGEgbG9uZwotCSAqIHRpbWUgYmVmb3JlIHRoZSBBQ0sgYXJycml2ZXMuCisJICogdGltZSBiZWZvcmUgdGhlIEFDSyBhcnJpdmVzLgogCSAqLwogCWlmIChwczJfc2VuZGJ5dGUocHMyZGV2LCBjb21tYW5kICYgMHhmZiwKIAkJCSBjb21tYW5kID09IFBTMl9DTURfUkVTRVRfQkFUID8gMTAwMCA6IDIwMCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NhMTExMXBzMi5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zYTExMTFwczIuYwppbmRleCBkNTU4NzRlLi40NGZjOGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NhMTExMXBzMi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2ExMTExcHMyLmMKQEAgLTMwMCw4ICszMDAsNyBAQAogCiAgb3V0OgogCXNhMTExMV9kaXNhYmxlX2RldmljZShwczJpZi0+ZGV2KTsKLQlyZWxlYXNlX21lbV9yZWdpb24oZGV2LT5yZXMuc3RhcnQsCi0JCQkgICBkZXYtPnJlcy5lbmQgLSBkZXYtPnJlcy5zdGFydCArIDEpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihkZXYtPnJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmZGV2LT5yZXMpKTsKICBmcmVlOgogCXNhMTExMV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogCWtmcmVlKHBzMmlmKTsKQEAgLTMxNyw4ICszMTYsNyBAQAogCXN0cnVjdCBwczJpZiAqcHMyaWYgPSBzYTExMTFfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXNlcmlvX3VucmVnaXN0ZXJfcG9ydChwczJpZi0+aW8pOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihkZXYtPnJlcy5zdGFydCwKLQkJCSAgIGRldi0+cmVzLmVuZCAtIGRldi0+cmVzLnN0YXJ0ICsgMSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRldi0+cmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZkZXYtPnJlcykpOwogCXNhMTExMV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogCiAJa2ZyZWUocHMyaWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9LY29uZmlnIGIvZHJpdmVycy9pb21tdS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1N2IzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lvbW11L0tjb25maWcKQEAgLTAsMCArMSwxMTAgQEAKKyMgSU9NTVVfQVBJIGFsd2F5cyBnZXRzIHNlbGVjdGVkIGJ5IHdob2V2ZXIgd2FudHMgaXQuCitjb25maWcgSU9NTVVfQVBJCisJYm9vbAorCittZW51Y29uZmlnIElPTU1VX1NVUFBPUlQKKwlib29sICJJT01NVSBIYXJkd2FyZSBTdXBwb3J0IgorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29tcGlsZSBkZXZpY2UgZHJpdmVycyBmb3IgSU8gTWVtb3J5CisJICBNYW5hZ2VtZW50IFVuaXRzIGludG8gdGhlIGtlcm5lbC4gVGhlc2UgZGV2aWNlcyB1c3VhbGx5IGFsbG93IHRvCisJICByZW1hcCBETUEgcmVxdWVzdHMgYW5kL29yIHJlbWFwIGludGVycnVwdHMgZnJvbSBvdGhlciBkZXZpY2VzIG9uIHRoZQorCSAgc3lzdGVtLgorCitpZiBJT01NVV9TVVBQT1JUCisKKyMgTVNNIElPTU1VIHN1cHBvcnQKK2NvbmZpZyBNU01fSU9NTVUKKwlib29sICJNU00gSU9NTVUgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfTVNNOFg2MCB8fCBBUkNIX01TTTg5NjAKKwlzZWxlY3QgSU9NTVVfQVBJCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIElPTU1VcyBmb3VuZCBvbiBjZXJ0YWluIFF1YWxjb21tIFNPQ3MuCisJICBUaGVzZSBJT01NVXMgYWxsb3cgdmlydHVhbGl6YXRpb24gb2YgdGhlIGFkZHJlc3Mgc3BhY2UgdXNlZCBieSBtb3N0CisJICBjb3JlcyB3aXRoaW4gdGhlIG11bHRpbWVkaWEgc3Vic3lzdGVtLgorCisJICBJZiB1bnN1cmUsIHNheSBOIGhlcmUuCisKK2NvbmZpZyBJT01NVV9QR1RBQkxFU19MMgorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIE1TTV9JT01NVSAmJiBNTVUgJiYgU01QICYmIENQVV9EQ0FDSEVfRElTQUJMRT1uCisKKyMgQU1EIElPTU1VIHN1cHBvcnQKK2NvbmZpZyBBTURfSU9NTVUKKwlib29sICJBTUQgSU9NTVUgc3VwcG9ydCIKKwlzZWxlY3QgU1dJT1RMQgorCXNlbGVjdCBQQ0lfTVNJCisJc2VsZWN0IFBDSV9JT1YKKwlzZWxlY3QgSU9NTVVfQVBJCisJZGVwZW5kcyBvbiBYODZfNjQgJiYgUENJICYmIEFDUEkKKwktLS1oZWxwLS0tCisJICBXaXRoIHRoaXMgb3B0aW9uIHlvdSBjYW4gZW5hYmxlIHN1cHBvcnQgZm9yIEFNRCBJT01NVSBoYXJkd2FyZSBpbgorCSAgeW91ciBzeXN0ZW0uIEFuIElPTU1VIGlzIGEgaGFyZHdhcmUgY29tcG9uZW50IHdoaWNoIHByb3ZpZGVzCisJICByZW1hcHBpbmcgb2YgRE1BIG1lbW9yeSBhY2Nlc3NlcyBmcm9tIGRldmljZXMuIFdpdGggYW4gQU1EIElPTU1VIHlvdQorCSAgY2FuIGlzb2xhdGUgdGhlIHRoZSBETUEgbWVtb3J5IG9mIGRpZmZlcmVudCBkZXZpY2VzIGFuZCBwcm90ZWN0IHRoZQorCSAgc3lzdGVtIGZyb20gbWlzYmVoYXZpbmcgZGV2aWNlIGRyaXZlcnMgb3IgaGFyZHdhcmUuCisKKwkgIFlvdSBjYW4gZmluZCBvdXQgaWYgeW91ciBzeXN0ZW0gaGFzIGFuIEFNRCBJT01NVSBpZiB5b3UgbG9vayBpbnRvCisJICB5b3VyIEJJT1MgZm9yIGFuIG9wdGlvbiB0byBlbmFibGUgaXQgb3IgaWYgeW91IGhhdmUgYW4gSVZSUyBBQ1BJCisJICB0YWJsZS4KKworY29uZmlnIEFNRF9JT01NVV9TVEFUUworCWJvb2wgIkV4cG9ydCBBTUQgSU9NTVUgc3RhdGlzdGljcyB0byBkZWJ1Z2ZzIgorCWRlcGVuZHMgb24gQU1EX0lPTU1VCisJc2VsZWN0IERFQlVHX0ZTCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBjb2RlIGluIHRoZSBBTUQgSU9NTVUgZHJpdmVyIHRvIGNvbGxlY3QgdmFyaW91cworCSAgc3RhdGlzdGljcyBhYm91dCB3aGF0cyBoYXBwZW5pbmcgaW4gdGhlIGRyaXZlciBhbmQgZXhwb3J0cyB0aGF0CisJICBpbmZvcm1hdGlvbiB0byB1c2Vyc3BhY2UgdmlhIGRlYnVnZnMuCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisjIEludGVsIElPTU1VIHN1cHBvcnQKK2NvbmZpZyBETUFSCisJYm9vbCAiU3VwcG9ydCBmb3IgRE1BIFJlbWFwcGluZyBEZXZpY2VzIgorCWRlcGVuZHMgb24gUENJX01TSSAmJiBBQ1BJICYmIChYODYgfHwgSUE2NF9HRU5FUklDKQorCXNlbGVjdCBJT01NVV9BUEkKKwloZWxwCisJICBETUEgcmVtYXBwaW5nIChETUFSKSBkZXZpY2VzIHN1cHBvcnQgZW5hYmxlcyBpbmRlcGVuZGVudCBhZGRyZXNzCisJICB0cmFuc2xhdGlvbnMgZm9yIERpcmVjdCBNZW1vcnkgQWNjZXNzIChETUEpIGZyb20gZGV2aWNlcy4KKwkgIFRoZXNlIERNQSByZW1hcHBpbmcgZGV2aWNlcyBhcmUgcmVwb3J0ZWQgdmlhIEFDUEkgdGFibGVzCisJICBhbmQgaW5jbHVkZSBQQ0kgZGV2aWNlIHNjb3BlIGNvdmVyZWQgYnkgdGhlc2UgRE1BCisJICByZW1hcHBpbmcgZGV2aWNlcy4KKworY29uZmlnIERNQVJfREVGQVVMVF9PTgorCWRlZl9ib29sIHkKKwlwcm9tcHQgIkVuYWJsZSBETUEgUmVtYXBwaW5nIERldmljZXMgYnkgZGVmYXVsdCIKKwlkZXBlbmRzIG9uIERNQVIKKwloZWxwCisJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBlbmFibGUgYSBETUFSIGRldmljZSBhdCBib290IHRpbWUgaWYKKwkgIG9uZSBpcyBmb3VuZC4gSWYgdGhpcyBvcHRpb24gaXMgbm90IHNlbGVjdGVkLCBETUFSIHN1cHBvcnQgY2FuCisJICBiZSBlbmFibGVkIGJ5IHBhc3NpbmcgaW50ZWxfaW9tbXU9b24gdG8gdGhlIGtlcm5lbC4KKworY29uZmlnIERNQVJfQlJPS0VOX0dGWF9XQQorCWJvb2wgIldvcmthcm91bmQgYnJva2VuIGdyYXBoaWNzIGRyaXZlcnMgKGdvaW5nIGF3YXkgc29vbikiCisJZGVwZW5kcyBvbiBETUFSICYmIEJST0tFTiAmJiBYODYKKwktLS1oZWxwLS0tCisJICBDdXJyZW50IEdyYXBoaWNzIGRyaXZlcnMgdGVuZCB0byB1c2UgcGh5c2ljYWwgYWRkcmVzcworCSAgZm9yIERNQSBhbmQgYXZvaWQgdXNpbmcgRE1BIEFQSXMuIFNldHRpbmcgdGhpcyBjb25maWcKKwkgIG9wdGlvbiBwZXJtaXRzIHRoZSBJT01NVSBkcml2ZXIgdG8gc2V0IGEgdW5pdHkgbWFwIGZvcgorCSAgYWxsIHRoZSBPUy12aXNpYmxlIG1lbW9yeS4gSGVuY2UgdGhlIGRyaXZlciBjYW4gY29udGludWUKKwkgIHRvIHVzZSBwaHlzaWNhbCBhZGRyZXNzZXMgZm9yIERNQSwgYXQgbGVhc3QgdW50aWwgdGhpcworCSAgb3B0aW9uIGlzIHJlbW92ZWQgaW4gdGhlIDIuNi4zMiBrZXJuZWwuCisKK2NvbmZpZyBETUFSX0ZMT1BQWV9XQQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIERNQVIgJiYgWDg2CisJLS0taGVscC0tLQorCSAgRmxvcHB5IGRpc2sgZHJpdmVycyBhcmUga25vd24gdG8gYnlwYXNzIERNQSBBUEkgY2FsbHMKKwkgIHRoZXJlYnkgZmFpbGluZyB0byB3b3JrIHdoZW4gSU9NTVUgaXMgZW5hYmxlZC4gVGhpcworCSAgd29ya2Fyb3VuZCB3aWxsIHNldHVwIGEgMToxIG1hcHBpbmcgZm9yIHRoZSBmaXJzdAorCSAgMTZNaUIgdG8gbWFrZSBmbG9wcHkgKGFuIElTQSBkZXZpY2UpIHdvcmsuCisKK2NvbmZpZyBJTlRSX1JFTUFQCisJYm9vbCAiU3VwcG9ydCBmb3IgSW50ZXJydXB0IFJlbWFwcGluZyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFg4Nl82NCAmJiBYODZfSU9fQVBJQyAmJiBQQ0lfTVNJICYmIEFDUEkgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgU3VwcG9ydHMgSW50ZXJydXB0IHJlbWFwcGluZyBmb3IgSU8tQVBJQyBhbmQgTVNJIGRldmljZXMuCisJICBUbyB1c2UgeDJhcGljIG1vZGUgaW4gdGhlIENQVSdzIHdoaWNoIHN1cHBvcnQgeDJBUElDIGVuaGFuY2VtZW50cyBvcgorCSAgdG8gc3VwcG9ydCBwbGF0Zm9ybXMgd2l0aCBDUFUncyBoYXZpbmcgPiA4IGJpdCBBUElDIElELCBzYXkgWS4KKworZW5kaWYgIyBJT01NVV9TVVBQT1JUCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L01ha2VmaWxlIGIvZHJpdmVycy9pb21tdS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRkNzdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pb21tdS9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai0kKENPTkZJR19JT01NVV9BUEkpICs9IGlvbW11Lm8KK29iai0kKENPTkZJR19NU01fSU9NTVUpICs9IG1zbV9pb21tdS5vIG1zbV9pb21tdV9kZXYubworb2JqLSQoQ09ORklHX0FNRF9JT01NVSkgKz0gYW1kX2lvbW11Lm8gYW1kX2lvbW11X2luaXQubworb2JqLSQoQ09ORklHX0RNQVIpICs9IGRtYXIubyBpb3ZhLm8gaW50ZWwtaW9tbXUubworb2JqLSQoQ09ORklHX0lOVFJfUkVNQVApICs9IGRtYXIubyBpbnRyX3JlbWFwcGluZy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTRmOGRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXUuYwpAQCAtMCwwICsxLDI4MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBBdXRob3I6IEpvZXJnIFJvZWRlbCA8am9lcmcucm9lZGVsQGFtZC5jb20+CisgKiAgICAgICAgIExlbyBEdXJhbiA8bGVvLmR1cmFuQGFtZC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1hdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb21tdS1oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYW1kLWlvbW11Lmg+CisjaW5jbHVkZSA8YXNtL21zaWRlZi5oPgorI2luY2x1ZGUgPGFzbS9wcm90by5oPgorI2luY2x1ZGUgPGFzbS9pb21tdS5oPgorI2luY2x1ZGUgPGFzbS9nYXJ0Lmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSAiYW1kX2lvbW11X3Byb3RvLmgiCisjaW5jbHVkZSAiYW1kX2lvbW11X3R5cGVzLmgiCisKKyNkZWZpbmUgQ01EX1NFVF9UWVBFKGNtZCwgdCkgKChjbWQpLT5kYXRhWzFdIHw9ICgodCkgPDwgMjgpKQorCisjZGVmaW5lIExPT1BfVElNRU9VVAkxMDAwMDAKKworc3RhdGljIERFRklORV9SV0xPQ0soYW1kX2lvbW11X2RldnRhYmxlX2xvY2spOworCisvKiBBIGxpc3Qgb2YgcHJlYWxsb2NhdGVkIHByb3RlY3Rpb24gZG9tYWlucyAqLworc3RhdGljIExJU1RfSEVBRChpb21tdV9wZF9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9tbXVfcGRfbGlzdF9sb2NrKTsKKworLyogTGlzdCBvZiBhbGwgYXZhaWxhYmxlIGRldl9kYXRhIHN0cnVjdHVyZXMgKi8KK3N0YXRpYyBMSVNUX0hFQUQoZGV2X2RhdGFfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRldl9kYXRhX2xpc3RfbG9jayk7CisKKy8qCisgKiBEb21haW4gZm9yIHVudHJhbnNsYXRlZCBkZXZpY2VzIC0gb25seSBhbGxvY2F0ZWQKKyAqIGlmIGlvbW11PXB0IHBhc3NlZCBvbiBrZXJuZWwgY21kIGxpbmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKnB0X2RvbWFpbjsKKworc3RhdGljIHN0cnVjdCBpb21tdV9vcHMgYW1kX2lvbW11X29wczsKKworLyoKKyAqIGdlbmVyYWwgc3RydWN0IHRvIG1hbmFnZSBjb21tYW5kcyBzZW5kIHRvIGFuIElPTU1VCisgKi8KK3N0cnVjdCBpb21tdV9jbWQgeworCXUzMiBkYXRhWzRdOworfTsKKworc3RhdGljIHZvaWQgdXBkYXRlX2RvbWFpbihzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSGVscGVyIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IGlvbW11X2Rldl9kYXRhICphbGxvY19kZXZfZGF0YSh1MTYgZGV2aWQpCit7CisJc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RhdGEgPSBremFsbG9jKHNpemVvZigqZGV2X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldl9kYXRhKQorCQlyZXR1cm4gTlVMTDsKKworCWRldl9kYXRhLT5kZXZpZCA9IGRldmlkOworCWF0b21pY19zZXQoJmRldl9kYXRhLT5iaW5kLCAwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfZGF0YV9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZkZXZfZGF0YS0+ZGV2X2RhdGFfbGlzdCwgJmRldl9kYXRhX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9kYXRhX2xpc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGRldl9kYXRhOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2Rldl9kYXRhKHN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfZGF0YV9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmZGV2X2RhdGEtPmRldl9kYXRhX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9kYXRhX2xpc3RfbG9jaywgZmxhZ3MpOworCisJa2ZyZWUoZGV2X2RhdGEpOworfQorCitzdGF0aWMgc3RydWN0IGlvbW11X2Rldl9kYXRhICpzZWFyY2hfZGV2X2RhdGEodTE2IGRldmlkKQoreworCXN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfZGF0YV9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldl9kYXRhLCAmZGV2X2RhdGFfbGlzdCwgZGV2X2RhdGFfbGlzdCkgeworCQlpZiAoZGV2X2RhdGEtPmRldmlkID09IGRldmlkKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWRldl9kYXRhID0gTlVMTDsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfZGF0YV9saXN0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBkZXZfZGF0YTsKK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZmluZF9kZXZfZGF0YSh1MTYgZGV2aWQpCit7CisJc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YTsKKworCWRldl9kYXRhID0gc2VhcmNoX2Rldl9kYXRhKGRldmlkKTsKKworCWlmIChkZXZfZGF0YSA9PSBOVUxMKQorCQlkZXZfZGF0YSA9IGFsbG9jX2Rldl9kYXRhKGRldmlkKTsKKworCXJldHVybiBkZXZfZGF0YTsKK30KKworc3RhdGljIGlubGluZSB1MTYgZ2V0X2RldmljZV9pZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisKKwlyZXR1cm4gY2FsY19kZXZpZChwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4pOworfQorCitzdGF0aWMgc3RydWN0IGlvbW11X2Rldl9kYXRhICpnZXRfZGV2X2RhdGEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPmFyY2hkYXRhLmlvbW11OworfQorCisvKgorICogSW4gdGhpcyBmdW5jdGlvbiB0aGUgbGlzdCBvZiBwcmVhbGxvY2F0ZWQgcHJvdGVjdGlvbiBkb21haW5zIGlzIHRyYXZlcnNlZCB0bworICogZmluZCB0aGUgZG9tYWluIGZvciBhIHNwZWNpZmljIGRldmljZQorICovCitzdGF0aWMgc3RydWN0IGRtYV9vcHNfZG9tYWluICpmaW5kX3Byb3RlY3Rpb25fZG9tYWluKHUxNiBkZXZpZCkKK3sKKwlzdHJ1Y3QgZG1hX29wc19kb21haW4gKmVudHJ5LCAqcmV0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBhbGlhcyA9IGFtZF9pb21tdV9hbGlhc190YWJsZVtkZXZpZF07CisKKwlpZiAobGlzdF9lbXB0eSgmaW9tbXVfcGRfbGlzdCkpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11X3BkX2xpc3RfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmlvbW11X3BkX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGVudHJ5LT50YXJnZXRfZGV2ID09IGRldmlkIHx8CisJCSAgICBlbnRyeS0+dGFyZ2V0X2RldiA9PSBhbGlhcykgeworCQkJcmV0ID0gZW50cnk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11X3BkX2xpc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBkcml2ZXIgZ290IGEgdmFsaWQgZGV2aWNlIGZyb20gdGhlIGNhbGxlciB0bworICogYXZvaWQgZGVyZWZlcmVuY2luZyBpbnZhbGlkIHBvaW50ZXJzLgorICovCitzdGF0aWMgYm9vbCBjaGVja19kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXUxNiBkZXZpZDsKKworCWlmICghZGV2IHx8ICFkZXYtPmRtYV9tYXNrKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBObyBkZXZpY2Ugb3Igbm8gUENJIGRldmljZSAqLworCWlmIChkZXYtPmJ1cyAhPSAmcGNpX2J1c190eXBlKQorCQlyZXR1cm4gZmFsc2U7CisKKwlkZXZpZCA9IGdldF9kZXZpY2VfaWQoZGV2KTsKKworCS8qIE91dCBvZiBvdXIgc2NvcGU/ICovCisJaWYgKGRldmlkID4gYW1kX2lvbW11X2xhc3RfYmRmKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGlvbW11X2luaXRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOworCXUxNiBhbGlhczsKKworCWlmIChkZXYtPmFyY2hkYXRhLmlvbW11KQorCQlyZXR1cm4gMDsKKworCWRldl9kYXRhID0gZmluZF9kZXZfZGF0YShnZXRfZGV2aWNlX2lkKGRldikpOworCWlmICghZGV2X2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJYWxpYXMgPSBhbWRfaW9tbXVfYWxpYXNfdGFibGVbZGV2X2RhdGEtPmRldmlkXTsKKwlpZiAoYWxpYXMgIT0gZGV2X2RhdGEtPmRldmlkKSB7CisJCXN0cnVjdCBpb21tdV9kZXZfZGF0YSAqYWxpYXNfZGF0YTsKKworCQlhbGlhc19kYXRhID0gZmluZF9kZXZfZGF0YShhbGlhcyk7CisJCWlmIChhbGlhc19kYXRhID09IE5VTEwpIHsKKwkJCXByX2VycigiQU1ELVZpOiBXYXJuaW5nOiBVbmhhbmRsZWQgZGV2aWNlICVzXG4iLAorCQkJCQlkZXZfbmFtZShkZXYpKTsKKwkJCWZyZWVfZGV2X2RhdGEoZGV2X2RhdGEpOworCQkJcmV0dXJuIC1FTk9UU1VQUDsKKwkJfQorCQlkZXZfZGF0YS0+YWxpYXNfZGF0YSA9IGFsaWFzX2RhdGE7CisJfQorCisJZGV2LT5hcmNoZGF0YS5pb21tdSA9IGRldl9kYXRhOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X2lnbm9yZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXUxNiBkZXZpZCwgYWxpYXM7CisKKwlkZXZpZCA9IGdldF9kZXZpY2VfaWQoZGV2KTsKKwlhbGlhcyA9IGFtZF9pb21tdV9hbGlhc190YWJsZVtkZXZpZF07CisKKwltZW1zZXQoJmFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLCAwLCBzaXplb2Yoc3RydWN0IGRldl90YWJsZV9lbnRyeSkpOworCW1lbXNldCgmYW1kX2lvbW11X2Rldl90YWJsZVthbGlhc10sIDAsIHNpemVvZihzdHJ1Y3QgZGV2X3RhYmxlX2VudHJ5KSk7CisKKwlhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtkZXZpZF0gPSBOVUxMOworCWFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2FsaWFzXSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X3VuaW5pdF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qCisJICogTm90aGluZyB0byBkbyBoZXJlIC0gd2Uga2VlcCBkZXZfZGF0YSBhcm91bmQgZm9yIHVucGx1Z2dlZCBkZXZpY2VzCisJICogYW5kIHJldXNlIGl0IHdoZW4gdGhlIGRldmljZSBpcyByZS1wbHVnZ2VkIC0gbm90IGRvaW5nIHNvIHdvdWxkCisJICogaW50cm9kdWNlIGEgdG9uIG9mIHJhY2VzLgorCSAqLworfQorCit2b2lkIF9faW5pdCBhbWRfaW9tbXVfdW5pbml0X2RldmljZXModm9pZCkKK3sKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhLCAqbjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisKKwlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKKworCQlpZiAoIWNoZWNrX2RldmljZSgmcGRldi0+ZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCWlvbW11X3VuaW5pdF9kZXZpY2UoJnBkZXYtPmRldik7CisJfQorCisJLyogRnJlZSBhbGwgb2Ygb3VyIGRldl9kYXRhIHN0cnVjdHVyZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2X2RhdGEsIG4sICZkZXZfZGF0YV9saXN0LCBkZXZfZGF0YV9saXN0KQorCQlmcmVlX2Rldl9kYXRhKGRldl9kYXRhKTsKK30KKworaW50IF9faW5pdCBhbWRfaW9tbXVfaW5pdF9kZXZpY2VzKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCWludCByZXQgPSAwOworCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisKKwkJaWYgKCFjaGVja19kZXZpY2UoJnBkZXYtPmRldikpCisJCQljb250aW51ZTsKKworCQlyZXQgPSBpb21tdV9pbml0X2RldmljZSgmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCA9PSAtRU5PVFNVUFApCisJCQlpb21tdV9pZ25vcmVfZGV2aWNlKCZwZGV2LT5kZXYpOworCQllbHNlIGlmIChyZXQpCisJCQlnb3RvIG91dF9mcmVlOworCX0KKworCXJldHVybiAwOworCitvdXRfZnJlZToKKworCWFtZF9pb21tdV91bmluaXRfZGV2aWNlcygpOworCisJcmV0dXJuIHJldDsKK30KKyNpZmRlZiBDT05GSUdfQU1EX0lPTU1VX1NUQVRTCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBjb2RlIGZvciBzdGF0aXN0aWNzIGNvbGxlY3Rpb24KKyAqLworCitERUNMQVJFX1NUQVRTX0NPVU5URVIoY29tcGxfd2FpdCk7CitERUNMQVJFX1NUQVRTX0NPVU5URVIoY250X21hcF9zaW5nbGUpOworREVDTEFSRV9TVEFUU19DT1VOVEVSKGNudF91bm1hcF9zaW5nbGUpOworREVDTEFSRV9TVEFUU19DT1VOVEVSKGNudF9tYXBfc2cpOworREVDTEFSRV9TVEFUU19DT1VOVEVSKGNudF91bm1hcF9zZyk7CitERUNMQVJFX1NUQVRTX0NPVU5URVIoY250X2FsbG9jX2NvaGVyZW50KTsKK0RFQ0xBUkVfU1RBVFNfQ09VTlRFUihjbnRfZnJlZV9jb2hlcmVudCk7CitERUNMQVJFX1NUQVRTX0NPVU5URVIoY3Jvc3NfcGFnZSk7CitERUNMQVJFX1NUQVRTX0NPVU5URVIoZG9tYWluX2ZsdXNoX3NpbmdsZSk7CitERUNMQVJFX1NUQVRTX0NPVU5URVIoZG9tYWluX2ZsdXNoX2FsbCk7CitERUNMQVJFX1NUQVRTX0NPVU5URVIoYWxsb2NlZF9pb19tZW0pOworREVDTEFSRV9TVEFUU19DT1VOVEVSKHRvdGFsX21hcF9yZXF1ZXN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzdGF0c19kaXI7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVfZmZsdXNoOworCitzdGF0aWMgdm9pZCBhbWRfaW9tbXVfc3RhdHNfYWRkKHN0cnVjdCBfX2lvbW11X2NvdW50ZXIgKmNudCkKK3sKKwlpZiAoc3RhdHNfZGlyID09IE5VTEwpCisJCXJldHVybjsKKworCWNudC0+ZGVudCA9IGRlYnVnZnNfY3JlYXRlX3U2NChjbnQtPm5hbWUsIDA0NDQsIHN0YXRzX2RpciwKKwkJCQkgICAgICAgJmNudC0+dmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBhbWRfaW9tbXVfc3RhdHNfaW5pdCh2b2lkKQoreworCXN0YXRzX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigiYW1kLWlvbW11IiwgTlVMTCk7CisJaWYgKHN0YXRzX2RpciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlkZV9mZmx1c2ggID0gZGVidWdmc19jcmVhdGVfYm9vbCgiZnVsbGZsdXNoIiwgMDQ0NCwgc3RhdHNfZGlyLAorCQkJCQkgKHUzMiAqKSZhbWRfaW9tbXVfdW5tYXBfZmx1c2gpOworCisJYW1kX2lvbW11X3N0YXRzX2FkZCgmY29tcGxfd2FpdCk7CisJYW1kX2lvbW11X3N0YXRzX2FkZCgmY250X21hcF9zaW5nbGUpOworCWFtZF9pb21tdV9zdGF0c19hZGQoJmNudF91bm1hcF9zaW5nbGUpOworCWFtZF9pb21tdV9zdGF0c19hZGQoJmNudF9tYXBfc2cpOworCWFtZF9pb21tdV9zdGF0c19hZGQoJmNudF91bm1hcF9zZyk7CisJYW1kX2lvbW11X3N0YXRzX2FkZCgmY250X2FsbG9jX2NvaGVyZW50KTsKKwlhbWRfaW9tbXVfc3RhdHNfYWRkKCZjbnRfZnJlZV9jb2hlcmVudCk7CisJYW1kX2lvbW11X3N0YXRzX2FkZCgmY3Jvc3NfcGFnZSk7CisJYW1kX2lvbW11X3N0YXRzX2FkZCgmZG9tYWluX2ZsdXNoX3NpbmdsZSk7CisJYW1kX2lvbW11X3N0YXRzX2FkZCgmZG9tYWluX2ZsdXNoX2FsbCk7CisJYW1kX2lvbW11X3N0YXRzX2FkZCgmYWxsb2NlZF9pb19tZW0pOworCWFtZF9pb21tdV9zdGF0c19hZGQoJnRvdGFsX21hcF9yZXF1ZXN0cyk7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEludGVycnVwdCBoYW5kbGluZyBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZHVtcF9kdGVfZW50cnkodTE2IGRldmlkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwkJcHJfZXJyKCJBTUQtVmk6IERURVslZF06ICUwOHhcbiIsIGksCisJCQlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhW2ldKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9jb21tYW5kKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQoreworCXN0cnVjdCBpb21tdV9jbWQgKmNtZCA9IHBoeXNfdG9fdmlydChwaHlzX2FkZHIpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwkJcHJfZXJyKCJBTUQtVmk6IENNRFslZF06ICUwOHhcbiIsIGksIGNtZC0+ZGF0YVtpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X3ByaW50X2V2ZW50KHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCB2b2lkICpfX2V2dCkKK3sKKwl1MzIgKmV2ZW50ID0gX19ldnQ7CisJaW50IHR5cGUgID0gKGV2ZW50WzFdID4+IEVWRU5UX1RZUEVfU0hJRlQpICAmIEVWRU5UX1RZUEVfTUFTSzsKKwlpbnQgZGV2aWQgPSAoZXZlbnRbMF0gPj4gRVZFTlRfREVWSURfU0hJRlQpICYgRVZFTlRfREVWSURfTUFTSzsKKwlpbnQgZG9taWQgPSAoZXZlbnRbMV0gPj4gRVZFTlRfRE9NSURfU0hJRlQpICYgRVZFTlRfRE9NSURfTUFTSzsKKwlpbnQgZmxhZ3MgPSAoZXZlbnRbMV0gPj4gRVZFTlRfRkxBR1NfU0hJRlQpICYgRVZFTlRfRkxBR1NfTUFTSzsKKwl1NjQgYWRkcmVzcyA9ICh1NjQpKCgodTY0KWV2ZW50WzNdKSA8PCAzMikgfCBldmVudFsyXTsKKworCXByaW50ayhLRVJOX0VSUiAiQU1ELVZpOiBFdmVudCBsb2dnZWQgWyIpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFVkVOVF9UWVBFX0lMTF9ERVY6CisJCXByaW50aygiSUxMRUdBTF9ERVZfVEFCTEVfRU5UUlkgZGV2aWNlPSUwMng6JTAyeC4leCAiCisJCSAgICAgICAiYWRkcmVzcz0weCUwMTZsbHggZmxhZ3M9MHglMDR4XVxuIiwKKwkJICAgICAgIFBDSV9CVVMoZGV2aWQpLCBQQ0lfU0xPVChkZXZpZCksIFBDSV9GVU5DKGRldmlkKSwKKwkJICAgICAgIGFkZHJlc3MsIGZsYWdzKTsKKwkJZHVtcF9kdGVfZW50cnkoZGV2aWQpOworCQlicmVhazsKKwljYXNlIEVWRU5UX1RZUEVfSU9fRkFVTFQ6CisJCXByaW50aygiSU9fUEFHRV9GQVVMVCBkZXZpY2U9JTAyeDolMDJ4LiV4ICIKKwkJICAgICAgICJkb21haW49MHglMDR4IGFkZHJlc3M9MHglMDE2bGx4IGZsYWdzPTB4JTA0eF1cbiIsCisJCSAgICAgICBQQ0lfQlVTKGRldmlkKSwgUENJX1NMT1QoZGV2aWQpLCBQQ0lfRlVOQyhkZXZpZCksCisJCSAgICAgICBkb21pZCwgYWRkcmVzcywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIEVWRU5UX1RZUEVfREVWX1RBQl9FUlI6CisJCXByaW50aygiREVWX1RBQl9IQVJEV0FSRV9FUlJPUiBkZXZpY2U9JTAyeDolMDJ4LiV4ICIKKwkJICAgICAgICJhZGRyZXNzPTB4JTAxNmxseCBmbGFncz0weCUwNHhdXG4iLAorCQkgICAgICAgUENJX0JVUyhkZXZpZCksIFBDSV9TTE9UKGRldmlkKSwgUENJX0ZVTkMoZGV2aWQpLAorCQkgICAgICAgYWRkcmVzcywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIEVWRU5UX1RZUEVfUEFHRV9UQUJfRVJSOgorCQlwcmludGsoIlBBR0VfVEFCX0hBUkRXQVJFX0VSUk9SIGRldmljZT0lMDJ4OiUwMnguJXggIgorCQkgICAgICAgImRvbWFpbj0weCUwNHggYWRkcmVzcz0weCUwMTZsbHggZmxhZ3M9MHglMDR4XVxuIiwKKwkJICAgICAgIFBDSV9CVVMoZGV2aWQpLCBQQ0lfU0xPVChkZXZpZCksIFBDSV9GVU5DKGRldmlkKSwKKwkJICAgICAgIGRvbWlkLCBhZGRyZXNzLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgRVZFTlRfVFlQRV9JTExfQ01EOgorCQlwcmludGsoIklMTEVHQUxfQ09NTUFORF9FUlJPUiBhZGRyZXNzPTB4JTAxNmxseF1cbiIsIGFkZHJlc3MpOworCQlkdW1wX2NvbW1hbmQoYWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgRVZFTlRfVFlQRV9DTURfSEFSRF9FUlI6CisJCXByaW50aygiQ09NTUFORF9IQVJEV0FSRV9FUlJPUiBhZGRyZXNzPTB4JTAxNmxseCAiCisJCSAgICAgICAiZmxhZ3M9MHglMDR4XVxuIiwgYWRkcmVzcywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIEVWRU5UX1RZUEVfSU9UTEJfSU5WX1RPOgorCQlwcmludGsoIklPVExCX0lOVl9USU1FT1VUIGRldmljZT0lMDJ4OiUwMnguJXggIgorCQkgICAgICAgImFkZHJlc3M9MHglMDE2bGx4XVxuIiwKKwkJICAgICAgIFBDSV9CVVMoZGV2aWQpLCBQQ0lfU0xPVChkZXZpZCksIFBDSV9GVU5DKGRldmlkKSwKKwkJICAgICAgIGFkZHJlc3MpOworCQlicmVhazsKKwljYXNlIEVWRU5UX1RZUEVfSU5WX0RFVl9SRVE6CisJCXByaW50aygiSU5WQUxJRF9ERVZJQ0VfUkVRVUVTVCBkZXZpY2U9JTAyeDolMDJ4LiV4ICIKKwkJICAgICAgICJhZGRyZXNzPTB4JTAxNmxseCBmbGFncz0weCUwNHhdXG4iLAorCQkgICAgICAgUENJX0JVUyhkZXZpZCksIFBDSV9TTE9UKGRldmlkKSwgUENJX0ZVTkMoZGV2aWQpLAorCQkgICAgICAgYWRkcmVzcywgZmxhZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIlVOS05PV04gdHlwZT0weCUwMnhdXG4iLCB0eXBlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X3BvbGxfZXZlbnRzKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCXUzMiBoZWFkLCB0YWlsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKworCWhlYWQgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19FVlRfSEVBRF9PRkZTRVQpOworCXRhaWwgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19FVlRfVEFJTF9PRkZTRVQpOworCisJd2hpbGUgKGhlYWQgIT0gdGFpbCkgeworCQlpb21tdV9wcmludF9ldmVudChpb21tdSwgaW9tbXUtPmV2dF9idWYgKyBoZWFkKTsKKwkJaGVhZCA9IChoZWFkICsgRVZFTlRfRU5UUllfU0laRSkgJSBpb21tdS0+ZXZ0X2J1Zl9zaXplOworCX0KKworCXdyaXRlbChoZWFkLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19FVlRfSEVBRF9PRkZTRVQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKK30KKworaXJxcmV0dXJuX3QgYW1kX2lvbW11X2ludF90aHJlYWQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKKworCWZvcl9lYWNoX2lvbW11KGlvbW11KQorCQlpb21tdV9wb2xsX2V2ZW50cyhpb21tdSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2lycXJldHVybl90IGFtZF9pb21tdV9pbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSU9NTVUgY29tbWFuZCBxdWV1aW5nIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHdhaXRfb25fc2VtKHZvbGF0aWxlIHU2NCAqc2VtKQoreworCWludCBpID0gMDsKKworCXdoaWxlICgqc2VtID09IDAgJiYgaSA8IExPT1BfVElNRU9VVCkgeworCQl1ZGVsYXkoMSk7CisJCWkgKz0gMTsKKwl9CisKKwlpZiAoaSA9PSBMT09QX1RJTUVPVVQpIHsKKwkJcHJfYWxlcnQoIkFNRC1WaTogQ29tcGxldGlvbi1XYWl0IGxvb3AgdGltZWQgb3V0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfY21kX3RvX2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwKKwkJCSAgICAgICBzdHJ1Y3QgaW9tbXVfY21kICpjbWQsCisJCQkgICAgICAgdTMyIHRhaWwpCit7CisJdTggKnRhcmdldDsKKworCXRhcmdldCA9IGlvbW11LT5jbWRfYnVmICsgdGFpbDsKKwl0YWlsICAgPSAodGFpbCArIHNpemVvZigqY21kKSkgJSBpb21tdS0+Y21kX2J1Zl9zaXplOworCisJLyogQ29weSBjb21tYW5kIHRvIGJ1ZmZlciAqLworCW1lbWNweSh0YXJnZXQsIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKworCS8qIFRlbGwgdGhlIElPTU1VIGFib3V0IGl0ICovCisJd3JpdGVsKHRhaWwsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9UQUlMX09GRlNFVCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2NvbXBsZXRpb25fd2FpdChzdHJ1Y3QgaW9tbXVfY21kICpjbWQsIHU2NCBhZGRyZXNzKQoreworCVdBUk5fT04oYWRkcmVzcyAmIDB4N1VMTCk7CisKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCWNtZC0+ZGF0YVswXSA9IGxvd2VyXzMyX2JpdHMoX19wYShhZGRyZXNzKSkgfCBDTURfQ09NUExfV0FJVF9TVE9SRV9NQVNLOworCWNtZC0+ZGF0YVsxXSA9IHVwcGVyXzMyX2JpdHMoX19wYShhZGRyZXNzKSk7CisJY21kLT5kYXRhWzJdID0gMTsKKwlDTURfU0VUX1RZUEUoY21kLCBDTURfQ09NUExfV0FJVCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2ludl9kdGUoc3RydWN0IGlvbW11X2NtZCAqY21kLCB1MTYgZGV2aWQpCit7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKKwljbWQtPmRhdGFbMF0gPSBkZXZpZDsKKwlDTURfU0VUX1RZUEUoY21kLCBDTURfSU5WX0RFVl9FTlRSWSk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2ludl9pb21tdV9wYWdlcyhzdHJ1Y3QgaW9tbXVfY21kICpjbWQsIHU2NCBhZGRyZXNzLAorCQkJCSAgc2l6ZV90IHNpemUsIHUxNiBkb21pZCwgaW50IHBkZSkKK3sKKwl1NjQgcGFnZXM7CisJaW50IHM7CisKKwlwYWdlcyA9IGlvbW11X251bV9wYWdlcyhhZGRyZXNzLCBzaXplLCBQQUdFX1NJWkUpOworCXMgICAgID0gMDsKKworCWlmIChwYWdlcyA+IDEpIHsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSB0byBmbHVzaCBtb3JlIHRoYW4gb25lIHBhZ2UsIGZsdXNoIGFsbAorCQkgKiBUTEIgZW50cmllcyBmb3IgdGhpcyBkb21haW4KKwkJICovCisJCWFkZHJlc3MgPSBDTURfSU5WX0lPTU1VX0FMTF9QQUdFU19BRERSRVNTOworCQlzID0gMTsKKwl9CisKKwlhZGRyZXNzICY9IFBBR0VfTUFTSzsKKworCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7CisJY21kLT5kYXRhWzFdIHw9IGRvbWlkOworCWNtZC0+ZGF0YVsyXSAgPSBsb3dlcl8zMl9iaXRzKGFkZHJlc3MpOworCWNtZC0+ZGF0YVszXSAgPSB1cHBlcl8zMl9iaXRzKGFkZHJlc3MpOworCUNNRF9TRVRfVFlQRShjbWQsIENNRF9JTlZfSU9NTVVfUEFHRVMpOworCWlmIChzKSAvKiBzaXplIGJpdCAtIHdlIGZsdXNoIG1vcmUgdGhhbiBvbmUgNGtiIHBhZ2UgKi8KKwkJY21kLT5kYXRhWzJdIHw9IENNRF9JTlZfSU9NTVVfUEFHRVNfU0laRV9NQVNLOworCWlmIChwZGUpIC8qIFBERSBiaXQgLSB3ZSB3YW4ndCBmbHVzaCBldmVyeXRoaW5nIG5vdCBvbmx5IHRoZSBQVEVzICovCisJCWNtZC0+ZGF0YVsyXSB8PSBDTURfSU5WX0lPTU1VX1BBR0VTX1BERV9NQVNLOworfQorCitzdGF0aWMgdm9pZCBidWlsZF9pbnZfaW90bGJfcGFnZXMoc3RydWN0IGlvbW11X2NtZCAqY21kLCB1MTYgZGV2aWQsIGludCBxZGVwLAorCQkJCSAgdTY0IGFkZHJlc3MsIHNpemVfdCBzaXplKQoreworCXU2NCBwYWdlczsKKwlpbnQgczsKKworCXBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGFkZHJlc3MsIHNpemUsIFBBR0VfU0laRSk7CisJcyAgICAgPSAwOworCisJaWYgKHBhZ2VzID4gMSkgeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIHRvIGZsdXNoIG1vcmUgdGhhbiBvbmUgcGFnZSwgZmx1c2ggYWxsCisJCSAqIFRMQiBlbnRyaWVzIGZvciB0aGlzIGRvbWFpbgorCQkgKi8KKwkJYWRkcmVzcyA9IENNRF9JTlZfSU9NTVVfQUxMX1BBR0VTX0FERFJFU1M7CisJCXMgPSAxOworCX0KKworCWFkZHJlc3MgJj0gUEFHRV9NQVNLOworCisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKKwljbWQtPmRhdGFbMF0gID0gZGV2aWQ7CisJY21kLT5kYXRhWzBdIHw9IChxZGVwICYgMHhmZikgPDwgMjQ7CisJY21kLT5kYXRhWzFdICA9IGRldmlkOworCWNtZC0+ZGF0YVsyXSAgPSBsb3dlcl8zMl9iaXRzKGFkZHJlc3MpOworCWNtZC0+ZGF0YVszXSAgPSB1cHBlcl8zMl9iaXRzKGFkZHJlc3MpOworCUNNRF9TRVRfVFlQRShjbWQsIENNRF9JTlZfSU9UTEJfUEFHRVMpOworCWlmIChzKQorCQljbWQtPmRhdGFbMl0gfD0gQ01EX0lOVl9JT01NVV9QQUdFU19TSVpFX01BU0s7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2ludl9hbGwoc3RydWN0IGlvbW11X2NtZCAqY21kKQoreworCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7CisJQ01EX1NFVF9UWVBFKGNtZCwgQ01EX0lOVl9BTEwpOworfQorCisvKgorICogV3JpdGVzIHRoZSBjb21tYW5kIHRvIHRoZSBJT01NVXMgY29tbWFuZCBidWZmZXIgYW5kIGluZm9ybXMgdGhlCisgKiBoYXJkd2FyZSBhYm91dCB0aGUgbmV3IGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgaW9tbXVfcXVldWVfY29tbWFuZChzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgc3RydWN0IGlvbW11X2NtZCAqY21kKQoreworCXUzMiBsZWZ0LCB0YWlsLCBoZWFkLCBuZXh0X3RhaWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVdBUk5fT04oaW9tbXUtPmNtZF9idWZfc2l6ZSAmIENNRF9CVUZGRVJfVU5JTklUSUFMSVpFRCk7CisKK2FnYWluOgorCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCisJaGVhZCAgICAgID0gcmVhZGwoaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fQ01EX0hFQURfT0ZGU0VUKTsKKwl0YWlsICAgICAgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19DTURfVEFJTF9PRkZTRVQpOworCW5leHRfdGFpbCA9ICh0YWlsICsgc2l6ZW9mKCpjbWQpKSAlIGlvbW11LT5jbWRfYnVmX3NpemU7CisJbGVmdCAgICAgID0gKGhlYWQgLSBuZXh0X3RhaWwpICUgaW9tbXUtPmNtZF9idWZfc2l6ZTsKKworCWlmIChsZWZ0IDw9IDIpIHsKKwkJc3RydWN0IGlvbW11X2NtZCBzeW5jX2NtZDsKKwkJdm9sYXRpbGUgdTY0IHNlbSA9IDA7CisJCWludCByZXQ7CisKKwkJYnVpbGRfY29tcGxldGlvbl93YWl0KCZzeW5jX2NtZCwgKHU2NCkmc2VtKTsKKwkJY29weV9jbWRfdG9fYnVmZmVyKGlvbW11LCAmc3luY19jbWQsIHRhaWwpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKChyZXQgPSB3YWl0X29uX3NlbSgmc2VtKSkgIT0gMCkKKwkJCXJldHVybiByZXQ7CisKKwkJZ290byBhZ2FpbjsKKwl9CisKKwljb3B5X2NtZF90b19idWZmZXIoaW9tbXUsIGNtZCwgdGFpbCk7CisKKwkvKiBXZSBuZWVkIHRvIHN5bmMgbm93IHRvIG1ha2Ugc3VyZSBhbGwgY29tbWFuZHMgYXJlIHByb2Nlc3NlZCAqLworCWlvbW11LT5uZWVkX3N5bmMgPSB0cnVlOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBxdWV1ZXMgYSBjb21wbGV0aW9uIHdhaXQgY29tbWFuZCBpbnRvIHRoZSBjb21tYW5kCisgKiBidWZmZXIgb2YgYW4gSU9NTVUKKyAqLworc3RhdGljIGludCBpb21tdV9jb21wbGV0aW9uX3dhaXQoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJc3RydWN0IGlvbW11X2NtZCBjbWQ7CisJdm9sYXRpbGUgdTY0IHNlbSA9IDA7CisJaW50IHJldDsKKworCWlmICghaW9tbXUtPm5lZWRfc3luYykKKwkJcmV0dXJuIDA7CisKKwlidWlsZF9jb21wbGV0aW9uX3dhaXQoJmNtZCwgKHU2NCkmc2VtKTsKKworCXJldCA9IGlvbW11X3F1ZXVlX2NvbW1hbmQoaW9tbXUsICZjbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gd2FpdF9vbl9zZW0oJnNlbSk7Cit9CisKK3N0YXRpYyBpbnQgaW9tbXVfZmx1c2hfZHRlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCB1MTYgZGV2aWQpCit7CisJc3RydWN0IGlvbW11X2NtZCBjbWQ7CisKKwlidWlsZF9pbnZfZHRlKCZjbWQsIGRldmlkKTsKKworCXJldHVybiBpb21tdV9xdWV1ZV9jb21tYW5kKGlvbW11LCAmY21kKTsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfZmx1c2hfZHRlX2FsbChzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwl1MzIgZGV2aWQ7CisKKwlmb3IgKGRldmlkID0gMDsgZGV2aWQgPD0gMHhmZmZmOyArK2RldmlkKQorCQlpb21tdV9mbHVzaF9kdGUoaW9tbXUsIGRldmlkKTsKKworCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaGVhdnkgbG9ja2luZyBhbmQgbWF5IGRpc2FibGUgaXJxcyBmb3Igc29tZSB0aW1lLiBCdXQKKyAqIHRoaXMgaXMgbm8gaXNzdWUgYmVjYXVzZSBpdCBpcyBvbmx5IGNhbGxlZCBkdXJpbmcgcmVzdW1lLgorICovCitzdGF0aWMgdm9pZCBpb21tdV9mbHVzaF90bGJfYWxsKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCXUzMiBkb21faWQ7CisKKwlmb3IgKGRvbV9pZCA9IDA7IGRvbV9pZCA8PSAweGZmZmY7ICsrZG9tX2lkKSB7CisJCXN0cnVjdCBpb21tdV9jbWQgY21kOworCQlidWlsZF9pbnZfaW9tbXVfcGFnZXMoJmNtZCwgMCwgQ01EX0lOVl9JT01NVV9BTExfUEFHRVNfQUREUkVTUywKKwkJCQkgICAgICBkb21faWQsIDEpOworCQlpb21tdV9xdWV1ZV9jb21tYW5kKGlvbW11LCAmY21kKTsKKwl9CisKKwlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOworfQorCitzdGF0aWMgdm9pZCBpb21tdV9mbHVzaF9hbGwoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJc3RydWN0IGlvbW11X2NtZCBjbWQ7CisKKwlidWlsZF9pbnZfYWxsKCZjbWQpOworCisJaW9tbXVfcXVldWVfY29tbWFuZChpb21tdSwgJmNtZCk7CisJaW9tbXVfY29tcGxldGlvbl93YWl0KGlvbW11KTsKK30KKwordm9pZCBpb21tdV9mbHVzaF9hbGxfY2FjaGVzKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCWlmIChpb21tdV9mZWF0dXJlKGlvbW11LCBGRUFUVVJFX0lBKSkgeworCQlpb21tdV9mbHVzaF9hbGwoaW9tbXUpOworCX0gZWxzZSB7CisJCWlvbW11X2ZsdXNoX2R0ZV9hbGwoaW9tbXUpOworCQlpb21tdV9mbHVzaF90bGJfYWxsKGlvbW11KTsKKwl9Cit9CisKKy8qCisgKiBDb21tYW5kIHNlbmQgZnVuY3Rpb24gZm9yIGZsdXNoaW5nIG9uLWRldmljZSBUTEIKKyAqLworc3RhdGljIGludCBkZXZpY2VfZmx1c2hfaW90bGIoc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YSwKKwkJCSAgICAgIHU2NCBhZGRyZXNzLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgaW9tbXVfY21kIGNtZDsKKwlpbnQgcWRlcDsKKworCXFkZXAgICAgID0gZGV2X2RhdGEtPmF0cy5xZGVwOworCWlvbW11ICAgID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2X2RhdGEtPmRldmlkXTsKKworCWJ1aWxkX2ludl9pb3RsYl9wYWdlcygmY21kLCBkZXZfZGF0YS0+ZGV2aWQsIHFkZXAsIGFkZHJlc3MsIHNpemUpOworCisJcmV0dXJuIGlvbW11X3F1ZXVlX2NvbW1hbmQoaW9tbXUsICZjbWQpOworfQorCisvKgorICogQ29tbWFuZCBzZW5kIGZ1bmN0aW9uIGZvciBpbnZhbGlkYXRpbmcgYSBkZXZpY2UgdGFibGUgZW50cnkKKyAqLworc3RhdGljIGludCBkZXZpY2VfZmx1c2hfZHRlKHN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGEpCit7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CisJaW50IHJldDsKKworCWlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2X2RhdGEtPmRldmlkXTsKKworCXJldCA9IGlvbW11X2ZsdXNoX2R0ZShpb21tdSwgZGV2X2RhdGEtPmRldmlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGRldl9kYXRhLT5hdHMuZW5hYmxlZCkKKwkJcmV0ID0gZGV2aWNlX2ZsdXNoX2lvdGxiKGRldl9kYXRhLCAwLCB+MFVMKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUTEIgaW52YWxpZGF0aW9uIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBmcm9tIHRoZSBtYXBwaW5nIGZ1bmN0aW9ucy4KKyAqIEl0IGludmFsaWRhdGVzIGEgc2luZ2xlIFBURSBpZiB0aGUgcmFuZ2UgdG8gZmx1c2ggaXMgd2l0aGluIGEgc2luZ2xlCisgKiBwYWdlLiBPdGhlcndpc2UgaXQgZmx1c2hlcyB0aGUgd2hvbGUgVExCIG9mIHRoZSBJT01NVS4KKyAqLworc3RhdGljIHZvaWQgX19kb21haW5fZmx1c2hfcGFnZXMoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4sCisJCQkJIHU2NCBhZGRyZXNzLCBzaXplX3Qgc2l6ZSwgaW50IHBkZSkKK3sKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOworCXN0cnVjdCBpb21tdV9jbWQgY21kOworCWludCByZXQgPSAwLCBpOworCisJYnVpbGRfaW52X2lvbW11X3BhZ2VzKCZjbWQsIGFkZHJlc3MsIHNpemUsIGRvbWFpbi0+aWQsIHBkZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYW1kX2lvbW11c19wcmVzZW50OyArK2kpIHsKKwkJaWYgKCFkb21haW4tPmRldl9pb21tdVtpXSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIERldmljZXMgb2YgdGhpcyBkb21haW4gYXJlIGJlaGluZCB0aGlzIElPTU1VCisJCSAqIFdlIG5lZWQgYSBUTEIgZmx1c2gKKwkJICovCisJCXJldCB8PSBpb21tdV9xdWV1ZV9jb21tYW5kKGFtZF9pb21tdXNbaV0sICZjbWQpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2X2RhdGEsICZkb21haW4tPmRldl9saXN0LCBsaXN0KSB7CisKKwkJaWYgKCFkZXZfZGF0YS0+YXRzLmVuYWJsZWQpCisJCQljb250aW51ZTsKKworCQlyZXQgfD0gZGV2aWNlX2ZsdXNoX2lvdGxiKGRldl9kYXRhLCBhZGRyZXNzLCBzaXplKTsKKwl9CisKKwlXQVJOX09OKHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvbWFpbl9mbHVzaF9wYWdlcyhzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiwKKwkJCSAgICAgICB1NjQgYWRkcmVzcywgc2l6ZV90IHNpemUpCit7CisJX19kb21haW5fZmx1c2hfcGFnZXMoZG9tYWluLCBhZGRyZXNzLCBzaXplLCAwKTsKK30KKworLyogRmx1c2ggdGhlIHdob2xlIElPL1RMQiBmb3IgYSBnaXZlbiBwcm90ZWN0aW9uIGRvbWFpbiAqLworc3RhdGljIHZvaWQgZG9tYWluX2ZsdXNoX3RsYihzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKK3sKKwlfX2RvbWFpbl9mbHVzaF9wYWdlcyhkb21haW4sIDAsIENNRF9JTlZfSU9NTVVfQUxMX1BBR0VTX0FERFJFU1MsIDApOworfQorCisvKiBGbHVzaCB0aGUgd2hvbGUgSU8vVExCIGZvciBhIGdpdmVuIHByb3RlY3Rpb24gZG9tYWluIC0gaW5jbHVkaW5nIFBERSAqLworc3RhdGljIHZvaWQgZG9tYWluX2ZsdXNoX3RsYl9wZGUoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCit7CisJX19kb21haW5fZmx1c2hfcGFnZXMoZG9tYWluLCAwLCBDTURfSU5WX0lPTU1VX0FMTF9QQUdFU19BRERSRVNTLCAxKTsKK30KKworc3RhdGljIHZvaWQgZG9tYWluX2ZsdXNoX2NvbXBsZXRlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFtZF9pb21tdXNfcHJlc2VudDsgKytpKSB7CisJCWlmICghZG9tYWluLT5kZXZfaW9tbXVbaV0pCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBEZXZpY2VzIG9mIHRoaXMgZG9tYWluIGFyZSBiZWhpbmQgdGhpcyBJT01NVQorCQkgKiBXZSBuZWVkIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24gb2YgYWxsIGNvbW1hbmRzLgorCQkgKi8KKwkJaW9tbXVfY29tcGxldGlvbl93YWl0KGFtZF9pb21tdXNbaV0pOworCX0KK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBmbHVzaGVzIHRoZSBEVEVzIGZvciBhbGwgZGV2aWNlcyBpbiBkb21haW4KKyAqLworc3RhdGljIHZvaWQgZG9tYWluX2ZsdXNoX2RldmljZXMoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCit7CisJc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfZGF0YSwgJmRvbWFpbi0+ZGV2X2xpc3QsIGxpc3QpCisJCWRldmljZV9mbHVzaF9kdGUoZGV2X2RhdGEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgdXNlZCB0aGUgY3JlYXRlIHRoZSBwYWdlIHRhYmxlIG1hcHBpbmdzIGZvcgorICogdW5pdHkgbWFwcGVkIHJlZ2lvbnMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIGFub3RoZXIgbGV2ZWwgdG8gYW4gSU8gcGFnZSB0YWJsZS4gQWRkaW5nCisgKiBhbm90aGVyIGxldmVsIGluY3JlYXNlcyB0aGUgc2l6ZSBvZiB0aGUgYWRkcmVzcyBzcGFjZSBieSA5IGJpdHMgdG8gYSBzaXplIHVwCisgKiB0byA2NCBiaXRzLgorICovCitzdGF0aWMgYm9vbCBpbmNyZWFzZV9hZGRyZXNzX3NwYWNlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluLAorCQkJCSAgIGdmcF90IGdmcCkKK3sKKwl1NjQgKnB0ZTsKKworCWlmIChkb21haW4tPm1vZGUgPT0gUEFHRV9NT0RFXzZfTEVWRUwpCisJCS8qIGFkZHJlc3Mgc3BhY2UgYWxyZWFkeSA2NCBiaXQgbGFyZ2UgKi8KKwkJcmV0dXJuIGZhbHNlOworCisJcHRlID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoZ2ZwKTsKKwlpZiAoIXB0ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJKnB0ZSAgICAgICAgICAgICA9IFBNX0xFVkVMX1BERShkb21haW4tPm1vZGUsCisJCQkJCXZpcnRfdG9fcGh5cyhkb21haW4tPnB0X3Jvb3QpKTsKKwlkb21haW4tPnB0X3Jvb3QgID0gcHRlOworCWRvbWFpbi0+bW9kZSAgICArPSAxOworCWRvbWFpbi0+dXBkYXRlZCAgPSB0cnVlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1NjQgKmFsbG9jX3B0ZShzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZSwKKwkJICAgICAgdTY0ICoqcHRlX3BhZ2UsCisJCSAgICAgIGdmcF90IGdmcCkKK3sKKwlpbnQgbGV2ZWwsIGVuZF9sdmw7CisJdTY0ICpwdGUsICpwYWdlOworCisJQlVHX09OKCFpc19wb3dlcl9vZl8yKHBhZ2Vfc2l6ZSkpOworCisJd2hpbGUgKGFkZHJlc3MgPiBQTV9MRVZFTF9TSVpFKGRvbWFpbi0+bW9kZSkpCisJCWluY3JlYXNlX2FkZHJlc3Nfc3BhY2UoZG9tYWluLCBnZnApOworCisJbGV2ZWwgICA9IGRvbWFpbi0+bW9kZSAtIDE7CisJcHRlICAgICA9ICZkb21haW4tPnB0X3Jvb3RbUE1fTEVWRUxfSU5ERVgobGV2ZWwsIGFkZHJlc3MpXTsKKwlhZGRyZXNzID0gUEFHRV9TSVpFX0FMSUdOKGFkZHJlc3MsIHBhZ2Vfc2l6ZSk7CisJZW5kX2x2bCA9IFBBR0VfU0laRV9MRVZFTChwYWdlX3NpemUpOworCisJd2hpbGUgKGxldmVsID4gZW5kX2x2bCkgeworCQlpZiAoIUlPTU1VX1BURV9QUkVTRU5UKCpwdGUpKSB7CisJCQlwYWdlID0gKHU2NCAqKWdldF96ZXJvZWRfcGFnZShnZnApOworCQkJaWYgKCFwYWdlKQorCQkJCXJldHVybiBOVUxMOworCQkJKnB0ZSA9IFBNX0xFVkVMX1BERShsZXZlbCwgdmlydF90b19waHlzKHBhZ2UpKTsKKwkJfQorCisJCS8qIE5vIGxldmVsIHNraXBwaW5nIHN1cHBvcnQgeWV0ICovCisJCWlmIChQTV9QVEVfTEVWRUwoKnB0ZSkgIT0gbGV2ZWwpCisJCQlyZXR1cm4gTlVMTDsKKworCQlsZXZlbCAtPSAxOworCisJCXB0ZSA9IElPTU1VX1BURV9QQUdFKCpwdGUpOworCisJCWlmIChwdGVfcGFnZSAmJiBsZXZlbCA9PSBlbmRfbHZsKQorCQkJKnB0ZV9wYWdlID0gcHRlOworCisJCXB0ZSA9ICZwdGVbUE1fTEVWRUxfSU5ERVgobGV2ZWwsIGFkZHJlc3MpXTsKKwl9CisKKwlyZXR1cm4gcHRlOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlcmUgaXMgYSBQVEUgZm9yIGEgZ2l2ZW4gZG1hIGFkZHJlc3MuIElmCisgKiB0aGVyZSBpcyBvbmUsIGl0IHJldHVybnMgdGhlIHBvaW50ZXIgdG8gaXQuCisgKi8KK3N0YXRpYyB1NjQgKmZldGNoX3B0ZShzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCWludCBsZXZlbDsKKwl1NjQgKnB0ZTsKKworCWlmIChhZGRyZXNzID4gUE1fTEVWRUxfU0laRShkb21haW4tPm1vZGUpKQorCQlyZXR1cm4gTlVMTDsKKworCWxldmVsICAgPSAgZG9tYWluLT5tb2RlIC0gMTsKKwlwdGUgICAgID0gJmRvbWFpbi0+cHRfcm9vdFtQTV9MRVZFTF9JTkRFWChsZXZlbCwgYWRkcmVzcyldOworCisJd2hpbGUgKGxldmVsID4gMCkgeworCisJCS8qIE5vdCBQcmVzZW50ICovCisJCWlmICghSU9NTVVfUFRFX1BSRVNFTlQoKnB0ZSkpCisJCQlyZXR1cm4gTlVMTDsKKworCQkvKiBMYXJnZSBQVEUgKi8KKwkJaWYgKFBNX1BURV9MRVZFTCgqcHRlKSA9PSAweDA3KSB7CisJCQl1bnNpZ25lZCBsb25nIHB0ZV9tYXNrLCBfX3B0ZTsKKworCQkJLyoKKwkJCSAqIElmIHdlIGhhdmUgYSBzZXJpZXMgb2YgbGFyZ2UgUFRFcywgbWFrZQorCQkJICogc3VyZSB0byByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBvbmUuCisJCQkgKi8KKwkJCXB0ZV9tYXNrID0gUFRFX1BBR0VfU0laRSgqcHRlKTsKKwkJCXB0ZV9tYXNrID0gfigoUEFHRV9TSVpFX1BURV9DT1VOVChwdGVfbWFzaykgPDwgMykgLSAxKTsKKwkJCV9fcHRlICAgID0gKCh1bnNpZ25lZCBsb25nKXB0ZSkgJiBwdGVfbWFzazsKKworCQkJcmV0dXJuICh1NjQgKilfX3B0ZTsKKwkJfQorCisJCS8qIE5vIGxldmVsIHNraXBwaW5nIHN1cHBvcnQgeWV0ICovCisJCWlmIChQTV9QVEVfTEVWRUwoKnB0ZSkgIT0gbGV2ZWwpCisJCQlyZXR1cm4gTlVMTDsKKworCQlsZXZlbCAtPSAxOworCisJCS8qIFdhbGsgdG8gdGhlIG5leHQgbGV2ZWwgKi8KKwkJcHRlID0gSU9NTVVfUFRFX1BBR0UoKnB0ZSk7CisJCXB0ZSA9ICZwdGVbUE1fTEVWRUxfSU5ERVgobGV2ZWwsIGFkZHJlc3MpXTsKKwl9CisKKwlyZXR1cm4gcHRlOworfQorCisvKgorICogR2VuZXJpYyBtYXBwaW5nIGZ1bmN0aW9ucy4gSXQgbWFwcyBhIHBoeXNpY2FsIGFkZHJlc3MgaW50byBhIERNQQorICogYWRkcmVzcyBzcGFjZS4gSXQgYWxsb2NhdGVzIHRoZSBwYWdlIHRhYmxlIHBhZ2VzIGlmIG5lY2Vzc2FyeS4KKyAqIEluIHRoZSBmdXR1cmUgaXQgY2FuIGJlIGV4dGVuZGVkIHRvIGEgZ2VuZXJpYyBtYXBwaW5nIGZ1bmN0aW9uCisgKiBzdXBwb3J0aW5nIGFsbCBmZWF0dXJlcyBvZiBBTUQgSU9NTVUgcGFnZSB0YWJsZXMgbGlrZSBsZXZlbCBza2lwcGluZworICogYW5kIGZ1bGwgNjQgYml0IGFkZHJlc3Mgc3BhY2VzLgorICovCitzdGF0aWMgaW50IGlvbW11X21hcF9wYWdlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tLAorCQkJICB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAorCQkJICB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwkJCSAgaW50IHByb3QsCisJCQkgIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplKQoreworCXU2NCBfX3B0ZSwgKnB0ZTsKKwlpbnQgaSwgY291bnQ7CisKKwlpZiAoIShwcm90ICYgSU9NTVVfUFJPVF9NQVNLKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidXNfYWRkciAgPSBQQUdFX0FMSUdOKGJ1c19hZGRyKTsKKwlwaHlzX2FkZHIgPSBQQUdFX0FMSUdOKHBoeXNfYWRkcik7CisJY291bnQgICAgID0gUEFHRV9TSVpFX1BURV9DT1VOVChwYWdlX3NpemUpOworCXB0ZSAgICAgICA9IGFsbG9jX3B0ZShkb20sIGJ1c19hZGRyLCBwYWdlX3NpemUsIE5VTEwsIEdGUF9LRVJORUwpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCWlmIChJT01NVV9QVEVfUFJFU0VOVChwdGVbaV0pKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChwYWdlX3NpemUgPiBQQUdFX1NJWkUpIHsKKwkJX19wdGUgPSBQQUdFX1NJWkVfUFRFKHBoeXNfYWRkciwgcGFnZV9zaXplKTsKKwkJX19wdGUgfD0gUE1fTEVWRUxfRU5DKDcpIHwgSU9NTVVfUFRFX1AgfCBJT01NVV9QVEVfRkM7CisJfSBlbHNlCisJCV9fcHRlID0gcGh5c19hZGRyIHwgSU9NTVVfUFRFX1AgfCBJT01NVV9QVEVfRkM7CisKKwlpZiAocHJvdCAmIElPTU1VX1BST1RfSVIpCisJCV9fcHRlIHw9IElPTU1VX1BURV9JUjsKKwlpZiAocHJvdCAmIElPTU1VX1BST1RfSVcpCisJCV9fcHRlIHw9IElPTU1VX1BURV9JVzsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQlwdGVbaV0gPSBfX3B0ZTsKKworCXVwZGF0ZV9kb21haW4oZG9tKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpb21tdV91bm1hcF9wYWdlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwYWdlX3NpemUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHVubWFwX3NpemUsIHVubWFwcGVkOworCXU2NCAqcHRlOworCisJQlVHX09OKCFpc19wb3dlcl9vZl8yKHBhZ2Vfc2l6ZSkpOworCisJdW5tYXBwZWQgPSAwOworCisJd2hpbGUgKHVubWFwcGVkIDwgcGFnZV9zaXplKSB7CisKKwkJcHRlID0gZmV0Y2hfcHRlKGRvbSwgYnVzX2FkZHIpOworCisJCWlmICghcHRlKSB7CisJCQkvKgorCQkJICogTm8gUFRFIGZvciB0aGlzIGFkZHJlc3MKKwkJCSAqIG1vdmUgZm9yd2FyZCBpbiA0a2Igc3RlcHMKKwkJCSAqLworCQkJdW5tYXBfc2l6ZSA9IFBBR0VfU0laRTsKKwkJfSBlbHNlIGlmIChQTV9QVEVfTEVWRUwoKnB0ZSkgPT0gMCkgeworCQkJLyogNGtiIFBURSBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzICovCisJCQl1bm1hcF9zaXplID0gUEFHRV9TSVpFOworCQkJKnB0ZSAgICAgICA9IDBVTEw7CisJCX0gZWxzZSB7CisJCQlpbnQgY291bnQsIGk7CisKKwkJCS8qIExhcmdlIFBURSBmb3VuZCB3aGljaCBtYXBzIHRoaXMgYWRkcmVzcyAqLworCQkJdW5tYXBfc2l6ZSA9IFBURV9QQUdFX1NJWkUoKnB0ZSk7CisJCQljb3VudCAgICAgID0gUEFHRV9TSVpFX1BURV9DT1VOVCh1bm1hcF9zaXplKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJCXB0ZVtpXSA9IDBVTEw7CisJCX0KKworCQlidXNfYWRkciAgPSAoYnVzX2FkZHIgJiB+KHVubWFwX3NpemUgLSAxKSkgKyB1bm1hcF9zaXplOworCQl1bm1hcHBlZCArPSB1bm1hcF9zaXplOworCX0KKworCUJVR19PTighaXNfcG93ZXJfb2ZfMih1bm1hcHBlZCkpOworCisJcmV0dXJuIHVubWFwcGVkOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgYSBzcGVjaWZpYyB1bml0eSBtYXBwaW5nIGVudHJ5IGlzIG5lZWRlZCBmb3IKKyAqIHRoaXMgc3BlY2lmaWMgSU9NTVUuCisgKi8KK3N0YXRpYyBpbnQgaW9tbXVfZm9yX3VuaXR5X21hcChzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwKKwkJCSAgICAgICBzdHJ1Y3QgdW5pdHlfbWFwX2VudHJ5ICplbnRyeSkKK3sKKwl1MTYgYmRmLCBpOworCisJZm9yIChpID0gZW50cnktPmRldmlkX3N0YXJ0OyBpIDw9IGVudHJ5LT5kZXZpZF9lbmQ7ICsraSkgeworCQliZGYgPSBhbWRfaW9tbXVfYWxpYXNfdGFibGVbaV07CisJCWlmIChhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtiZGZdID09IGlvbW11KQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFjdHVhbGx5IGFwcGxpZXMgdGhlIG1hcHBpbmcgdG8gdGhlIHBhZ2UgdGFibGUgb2YgdGhlCisgKiBkbWFfb3BzIGRvbWFpbi4KKyAqLworc3RhdGljIGludCBkbWFfb3BzX3VuaXR5X21hcChzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9kb20sCisJCQkgICAgIHN0cnVjdCB1bml0eV9tYXBfZW50cnkgKmUpCit7CisJdTY0IGFkZHI7CisJaW50IHJldDsKKworCWZvciAoYWRkciA9IGUtPmFkZHJlc3Nfc3RhcnQ7IGFkZHIgPCBlLT5hZGRyZXNzX2VuZDsKKwkgICAgIGFkZHIgKz0gUEFHRV9TSVpFKSB7CisJCXJldCA9IGlvbW11X21hcF9wYWdlKCZkbWFfZG9tLT5kb21haW4sIGFkZHIsIGFkZHIsIGUtPnByb3QsCisJCQkJICAgICBQQUdFX1NJWkUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJLyoKKwkJICogaWYgdW5pdHkgbWFwcGluZyBpcyBpbiBhcGVydHVyZSByYW5nZSBtYXJrIHRoZSBwYWdlCisJCSAqIGFzIGFsbG9jYXRlZCBpbiB0aGUgYXBlcnR1cmUKKwkJICovCisJCWlmIChhZGRyIDwgZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSkKKwkJCV9fc2V0X2JpdChhZGRyID4+IFBBR0VfU0hJRlQsCisJCQkJICBkbWFfZG9tLT5hcGVydHVyZVswXS0+Yml0bWFwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXQgdGhlIHVuaXR5IG1hcHBpbmdzIGZvciBhIHNwZWNpZmljIElPTU1VIGluIHRoZSBzeXN0ZW0KKyAqCisgKiBCYXNpY2FsbHkgaXRlcmF0ZXMgb3ZlciBhbGwgdW5pdHkgbWFwcGluZyBlbnRyaWVzIGFuZCBhcHBsaWVzIHRoZW0gdG8KKyAqIHRoZSBkZWZhdWx0IGRvbWFpbiBETUEgb2YgdGhhdCBJT01NVSBpZiBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBpbnQgaW9tbXVfaW5pdF91bml0eV9tYXBwaW5ncyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwlzdHJ1Y3QgdW5pdHlfbWFwX2VudHJ5ICplbnRyeTsKKwlpbnQgcmV0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmFtZF9pb21tdV91bml0eV9tYXAsIGxpc3QpIHsKKwkJaWYgKCFpb21tdV9mb3JfdW5pdHlfbWFwKGlvbW11LCBlbnRyeSkpCisJCQljb250aW51ZTsKKwkJcmV0ID0gZG1hX29wc191bml0eV9tYXAoaW9tbXUtPmRlZmF1bHRfZG9tLCBlbnRyeSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogSW5pdHMgdGhlIHVuaXR5IG1hcHBpbmdzIHJlcXVpcmVkIGZvciBhIHNwZWNpZmljIGRldmljZQorICovCitzdGF0aWMgaW50IGluaXRfdW5pdHlfbWFwcGluZ3NfZm9yX2RldmljZShzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9kb20sCisJCQkJCSAgdTE2IGRldmlkKQoreworCXN0cnVjdCB1bml0eV9tYXBfZW50cnkgKmU7CisJaW50IHJldDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZSwgJmFtZF9pb21tdV91bml0eV9tYXAsIGxpc3QpIHsKKwkJaWYgKCEoZGV2aWQgPj0gZS0+ZGV2aWRfc3RhcnQgJiYgZGV2aWQgPD0gZS0+ZGV2aWRfZW5kKSkKKwkJCWNvbnRpbnVlOworCQlyZXQgPSBkbWFfb3BzX3VuaXR5X21hcChkbWFfZG9tLCBlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG5leHQgZnVuY3Rpb25zIGJlbG9uZyB0byB0aGUgYWRkcmVzcyBhbGxvY2F0b3IgZm9yIHRoZSBkbWFfb3BzCisgKiBpbnRlcmZhY2UgZnVuY3Rpb25zLiBUaGV5IHdvcmsgbGlrZSB0aGUgYWxsb2NhdG9ycyBpbiB0aGUgb3RoZXIgSU9NTVUKKyAqIGRyaXZlcnMuIEl0cyBiYXNpY2FsbHkgYSBiaXRtYXAgd2hpY2ggbWFya3MgdGhlIGFsbG9jYXRlZCBwYWdlcyBpbgorICogdGhlIGFwZXJ0dXJlLiBNYXliZSBpdCBjb3VsZCBiZSBlbmhhbmNlZCBpbiB0aGUgZnV0dXJlIHRvIGEgbW9yZQorICogZWZmaWNpZW50IGFsbG9jYXRvci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBhZGRyZXNzIGFsbG9jYXRvciBjb3JlIGZ1bmN0aW9ucy4KKyAqCisgKiBjYWxsZWQgd2l0aCBkb21haW4tPmxvY2sgaGVsZAorICovCisKKy8qCisgKiBVc2VkIHRvIHJlc2VydmUgYWRkcmVzcyByYW5nZXMgaW4gdGhlIGFwZXJ0dXJlIChlLmcuIGZvciBleGNsdXNpb24KKyAqIHJhbmdlcy4KKyAqLworc3RhdGljIHZvaWQgZG1hX29wc19yZXNlcnZlX2FkZHJlc3NlcyhzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRvbSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X3BhZ2UsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHBhZ2VzKQoreworCXVuc2lnbmVkIGludCBpLCBsYXN0X3BhZ2UgPSBkb20tPmFwZXJ0dXJlX3NpemUgPj4gUEFHRV9TSElGVDsKKworCWlmIChzdGFydF9wYWdlICsgcGFnZXMgPiBsYXN0X3BhZ2UpCisJCXBhZ2VzID0gbGFzdF9wYWdlIC0gc3RhcnRfcGFnZTsKKworCWZvciAoaSA9IHN0YXJ0X3BhZ2U7IGkgPCBzdGFydF9wYWdlICsgcGFnZXM7ICsraSkgeworCQlpbnQgaW5kZXggPSBpIC8gQVBFUlRVUkVfUkFOR0VfUEFHRVM7CisJCWludCBwYWdlICA9IGkgJSBBUEVSVFVSRV9SQU5HRV9QQUdFUzsKKwkJX19zZXRfYml0KHBhZ2UsIGRvbS0+YXBlcnR1cmVbaW5kZXhdLT5iaXRtYXApOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgYSBuZXcgYXBlcnR1cmUgcmFuZ2UgdG8gYW4gZXhpc3RpbmcKKyAqIGFwZXJ0dXJlIGluIGNhc2Ugb2YgZG1hX29wcyBkb21haW4gYWxsb2NhdGlvbiBvciBhZGRyZXNzIGFsbG9jYXRpb24KKyAqIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgYWxsb2NfbmV3X3JhbmdlKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX2RvbSwKKwkJCSAgIGJvb2wgcG9wdWxhdGUsIGdmcF90IGdmcCkKK3sKKwlpbnQgaW5kZXggPSBkbWFfZG9tLT5hcGVydHVyZV9zaXplID4+IEFQRVJUVVJFX1JBTkdFX1NISUZUOworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OworCXVuc2lnbmVkIGxvbmcgaSwgb2xkX3NpemU7CisKKyNpZmRlZiBDT05GSUdfSU9NTVVfU1RSRVNTCisJcG9wdWxhdGUgPSBmYWxzZTsKKyNlbmRpZgorCisJaWYgKGluZGV4ID49IEFQRVJUVVJFX01BWF9SQU5HRVMpCisJCXJldHVybiAtRU5PTUVNOworCisJZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFwZXJ0dXJlX3JhbmdlKSwgZ2ZwKTsKKwlpZiAoIWRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0tPmJpdG1hcCA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKGdmcCk7CisJaWYgKCFkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0tPmJpdG1hcCkKKwkJZ290byBvdXRfZnJlZTsKKworCWRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XS0+b2Zmc2V0ID0gZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZTsKKworCWlmIChwb3B1bGF0ZSkgeworCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBkbWFfZG9tLT5hcGVydHVyZV9zaXplOworCQlpbnQgaSwgbnVtX3B0ZXMgPSBBUEVSVFVSRV9SQU5HRV9QQUdFUyAvIDUxMjsKKwkJdTY0ICpwdGUsICpwdGVfcGFnZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3B0ZXM7ICsraSkgeworCQkJcHRlID0gYWxsb2NfcHRlKCZkbWFfZG9tLT5kb21haW4sIGFkZHJlc3MsIFBBR0VfU0laRSwKKwkJCQkJJnB0ZV9wYWdlLCBnZnApOworCQkJaWYgKCFwdGUpCisJCQkJZ290byBvdXRfZnJlZTsKKworCQkJZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdLT5wdGVfcGFnZXNbaV0gPSBwdGVfcGFnZTsKKworCQkJYWRkcmVzcyArPSBBUEVSVFVSRV9SQU5HRV9TSVpFIC8gNjQ7CisJCX0KKwl9CisKKwlvbGRfc2l6ZSAgICAgICAgICAgICAgICA9IGRtYV9kb20tPmFwZXJ0dXJlX3NpemU7CisJZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSArPSBBUEVSVFVSRV9SQU5HRV9TSVpFOworCisJLyogUmVzZXJ2ZSBhZGRyZXNzIHJhbmdlIHVzZWQgZm9yIE1TSSBtZXNzYWdlcyAqLworCWlmIChvbGRfc2l6ZSA8IE1TSV9BRERSX0JBU0VfTE8gJiYKKwkgICAgZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSA+IE1TSV9BRERSX0JBU0VfTE8pIHsKKwkJdW5zaWduZWQgbG9uZyBzcGFnZTsKKwkJaW50IHBhZ2VzOworCisJCXBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKE1TSV9BRERSX0JBU0VfTE8sIDB4MTAwMDAsIFBBR0VfU0laRSk7CisJCXNwYWdlID0gTVNJX0FERFJfQkFTRV9MTyA+PiBQQUdFX1NISUZUOworCisJCWRtYV9vcHNfcmVzZXJ2ZV9hZGRyZXNzZXMoZG1hX2RvbSwgc3BhZ2UsIHBhZ2VzKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBleGNsdXNpb24gcmFuZ2UgaWYgbmVjZXNzYXJ5ICovCisJZm9yX2VhY2hfaW9tbXUoaW9tbXUpIHsKKwkJaWYgKGlvbW11LT5leGNsdXNpb25fc3RhcnQgJiYKKwkJICAgIGlvbW11LT5leGNsdXNpb25fc3RhcnQgPj0gZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdLT5vZmZzZXQKKwkJICAgICYmIGlvbW11LT5leGNsdXNpb25fc3RhcnQgPCBkbWFfZG9tLT5hcGVydHVyZV9zaXplKSB7CisJCQl1bnNpZ25lZCBsb25nIHN0YXJ0cGFnZTsKKwkJCWludCBwYWdlcyA9IGlvbW11X251bV9wYWdlcyhpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0LAorCQkJCQkJICAgIGlvbW11LT5leGNsdXNpb25fbGVuZ3RoLAorCQkJCQkJICAgIFBBR0VfU0laRSk7CisJCQlzdGFydHBhZ2UgPSBpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJCQlkbWFfb3BzX3Jlc2VydmVfYWRkcmVzc2VzKGRtYV9kb20sIHN0YXJ0cGFnZSwgcGFnZXMpOworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgYXJlYXMgYWxyZWFkeSBtYXBwZWQgYXMgcHJlc2VudCBpbiB0aGUgbmV3IGFwZXJ0dXJlCisJICogcmFuZ2UgYW5kIG1hcmsgdGhvc2UgcGFnZXMgYXMgcmVzZXJ2ZWQgaW4gdGhlIGFsbG9jYXRvci4gU3VjaAorCSAqIG1hcHBpbmdzIG1heSBhbHJlYWR5IGV4aXN0IGFzIGEgcmVzdWx0IG9mIHJlcXVlc3RlZCB1bml0eQorCSAqIG1hcHBpbmdzIGZvciBkZXZpY2VzLgorCSAqLworCWZvciAoaSA9IGRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XS0+b2Zmc2V0OworCSAgICAgaSA8IGRtYV9kb20tPmFwZXJ0dXJlX3NpemU7CisJICAgICBpICs9IFBBR0VfU0laRSkgeworCQl1NjQgKnB0ZSA9IGZldGNoX3B0ZSgmZG1hX2RvbS0+ZG9tYWluLCBpKTsKKwkJaWYgKCFwdGUgfHwgIUlPTU1VX1BURV9QUkVTRU5UKCpwdGUpKQorCQkJY29udGludWU7CisKKwkJZG1hX29wc19yZXNlcnZlX2FkZHJlc3NlcyhkbWFfZG9tLCBpIDw8IFBBR0VfU0hJRlQsIDEpOworCX0KKworCXVwZGF0ZV9kb21haW4oJmRtYV9kb20tPmRvbWFpbik7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJdXBkYXRlX2RvbWFpbigmZG1hX2RvbS0+ZG9tYWluKTsKKworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0tPmJpdG1hcCk7CisKKwlrZnJlZShkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0pOworCWRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XSA9IE5VTEw7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX29wc19hcmVhX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRtYV9vcHNfZG9tYWluICpkb20sCisJCQkJCXVuc2lnbmVkIGludCBwYWdlcywKKwkJCQkJdW5zaWduZWQgbG9uZyBhbGlnbl9tYXNrLAorCQkJCQl1NjQgZG1hX21hc2ssCisJCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnQpCit7CisJdW5zaWduZWQgbG9uZyBuZXh0X2JpdCA9IGRvbS0+bmV4dF9hZGRyZXNzICUgQVBFUlRVUkVfUkFOR0VfU0laRTsKKwlpbnQgbWF4X2luZGV4ID0gZG9tLT5hcGVydHVyZV9zaXplID4+IEFQRVJUVVJFX1JBTkdFX1NISUZUOworCWludCBpID0gc3RhcnQgPj4gQVBFUlRVUkVfUkFOR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBib3VuZGFyeV9zaXplOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IC0xOworCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisKKwluZXh0X2JpdCA+Pj0gUEFHRV9TSElGVDsKKworCWJvdW5kYXJ5X3NpemUgPSBBTElHTihkbWFfZ2V0X3NlZ19ib3VuZGFyeShkZXYpICsgMSwKKwkJCVBBR0VfU0laRSkgPj4gUEFHRV9TSElGVDsKKworCWZvciAoO2kgPCBtYXhfaW5kZXg7ICsraSkgeworCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IGRvbS0+YXBlcnR1cmVbaV0tPm9mZnNldCA+PiBQQUdFX1NISUZUOworCisJCWlmIChkb20tPmFwZXJ0dXJlW2ldLT5vZmZzZXQgPj0gZG1hX21hc2spCisJCQlicmVhazsKKworCQlsaW1pdCA9IGlvbW11X2RldmljZV9tYXhfaW5kZXgoQVBFUlRVUkVfUkFOR0VfUEFHRVMsIG9mZnNldCwKKwkJCQkJICAgICAgIGRtYV9tYXNrID4+IFBBR0VfU0hJRlQpOworCisJCWFkZHJlc3MgPSBpb21tdV9hcmVhX2FsbG9jKGRvbS0+YXBlcnR1cmVbaV0tPmJpdG1hcCwKKwkJCQkJICAgbGltaXQsIG5leHRfYml0LCBwYWdlcywgMCwKKwkJCQkJICAgIGJvdW5kYXJ5X3NpemUsIGFsaWduX21hc2spOworCQlpZiAoYWRkcmVzcyAhPSAtMSkgeworCQkJYWRkcmVzcyA9IGRvbS0+YXBlcnR1cmVbaV0tPm9mZnNldCArCisJCQkJICAoYWRkcmVzcyA8PCBQQUdFX1NISUZUKTsKKwkJCWRvbS0+bmV4dF9hZGRyZXNzID0gYWRkcmVzcyArIChwYWdlcyA8PCBQQUdFX1NISUZUKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbmV4dF9iaXQgPSAwOworCX0KKworCXJldHVybiBhZGRyZXNzOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbWFfb3BzX2FsbG9jX2FkZHJlc3NlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgc3RydWN0IGRtYV9vcHNfZG9tYWluICpkb20sCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHBhZ2VzLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWxpZ25fbWFzaywKKwkJCQkJICAgICB1NjQgZG1hX21hc2spCit7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCisjaWZkZWYgQ09ORklHX0lPTU1VX1NUUkVTUworCWRvbS0+bmV4dF9hZGRyZXNzID0gMDsKKwlkb20tPm5lZWRfZmx1c2ggPSB0cnVlOworI2VuZGlmCisKKwlhZGRyZXNzID0gZG1hX29wc19hcmVhX2FsbG9jKGRldiwgZG9tLCBwYWdlcywgYWxpZ25fbWFzaywKKwkJCQkgICAgIGRtYV9tYXNrLCBkb20tPm5leHRfYWRkcmVzcyk7CisKKwlpZiAoYWRkcmVzcyA9PSAtMSkgeworCQlkb20tPm5leHRfYWRkcmVzcyA9IDA7CisJCWFkZHJlc3MgPSBkbWFfb3BzX2FyZWFfYWxsb2MoZGV2LCBkb20sIHBhZ2VzLCBhbGlnbl9tYXNrLAorCQkJCQkgICAgIGRtYV9tYXNrLCAwKTsKKwkJZG9tLT5uZWVkX2ZsdXNoID0gdHJ1ZTsKKwl9CisKKwlpZiAodW5saWtlbHkoYWRkcmVzcyA9PSAtMSkpCisJCWFkZHJlc3MgPSBETUFfRVJST1JfQ09ERTsKKworCVdBUk5fT04oKGFkZHJlc3MgKyAoUEFHRV9TSVpFKnBhZ2VzKSkgPiBkb20tPmFwZXJ0dXJlX3NpemUpOworCisJcmV0dXJuIGFkZHJlc3M7Cit9CisKKy8qCisgKiBUaGUgYWRkcmVzcyBmcmVlIGZ1bmN0aW9uLgorICoKKyAqIGNhbGxlZCB3aXRoIGRvbWFpbi0+bG9jayBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIGRtYV9vcHNfZnJlZV9hZGRyZXNzZXMoc3RydWN0IGRtYV9vcHNfZG9tYWluICpkb20sCisJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCSAgIHVuc2lnbmVkIGludCBwYWdlcykKK3sKKwl1bnNpZ25lZCBpID0gYWRkcmVzcyA+PiBBUEVSVFVSRV9SQU5HRV9TSElGVDsKKwlzdHJ1Y3QgYXBlcnR1cmVfcmFuZ2UgKnJhbmdlID0gZG9tLT5hcGVydHVyZVtpXTsKKworCUJVR19PTihpID49IEFQRVJUVVJFX01BWF9SQU5HRVMgfHwgcmFuZ2UgPT0gTlVMTCk7CisKKyNpZmRlZiBDT05GSUdfSU9NTVVfU1RSRVNTCisJaWYgKGkgPCA0KQorCQlyZXR1cm47CisjZW5kaWYKKworCWlmIChhZGRyZXNzID49IGRvbS0+bmV4dF9hZGRyZXNzKQorCQlkb20tPm5lZWRfZmx1c2ggPSB0cnVlOworCisJYWRkcmVzcyA9IChhZGRyZXNzICUgQVBFUlRVUkVfUkFOR0VfU0laRSkgPj4gUEFHRV9TSElGVDsKKworCWJpdG1hcF9jbGVhcihyYW5nZS0+Yml0bWFwLCBhZGRyZXNzLCBwYWdlcyk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgbmV4dCBmdW5jdGlvbnMgYmVsb25nIHRvIHRoZSBkb21haW4gYWxsb2NhdGlvbi4gQSBkb21haW4gaXMKKyAqIGFsbG9jYXRlZCBmb3IgZXZlcnkgSU9NTVUgYXMgdGhlIGRlZmF1bHQgZG9tYWluLiBJZiBkZXZpY2UgaXNvbGF0aW9uCisgKiBpcyBlbmFibGVkLCBldmVyeSBkZXZpY2UgZ2V0IGl0cyBvd24gZG9tYWluLiBUaGUgbW9zdCBpbXBvcnRhbnQgdGhpbmcKKyAqIGFib3V0IGRvbWFpbnMgaXMgdGhlIHBhZ2UgdGFibGUgbWFwcGluZyB0aGUgRE1BIGFkZHJlc3Mgc3BhY2UgdGhleQorICogY29udGFpbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhIHByb3RlY3Rpb24gZG9tYWluIHRvIHRoZSBnbG9iYWwgcHJvdGVjdGlvbiBkb21haW4gbGlzdAorICovCitzdGF0aWMgdm9pZCBhZGRfZG9tYWluX3RvX2xpc3Qoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhbWRfaW9tbXVfcGRfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZkb21haW4tPmxpc3QsICZhbWRfaW9tbXVfcGRfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYW1kX2lvbW11X3BkX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhIHByb3RlY3Rpb24gZG9tYWluIHRvIHRoZSBnbG9iYWwKKyAqIHByb3RlY3Rpb24gZG9tYWluIGxpc3QKKyAqLworc3RhdGljIHZvaWQgZGVsX2RvbWFpbl9mcm9tX2xpc3Qoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhbWRfaW9tbXVfcGRfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZkb21haW4tPmxpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFtZF9pb21tdV9wZF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1MTYgZG9tYWluX2lkX2FsbG9jKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaWQ7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7CisJaWQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGFtZF9pb21tdV9wZF9hbGxvY19iaXRtYXAsIE1BWF9ET01BSU5fSUQpOworCUJVR19PTihpZCA9PSAwKTsKKwlpZiAoaWQgPiAwICYmIGlkIDwgTUFYX0RPTUFJTl9JRCkKKwkJX19zZXRfYml0KGlkLCBhbWRfaW9tbXVfcGRfYWxsb2NfYml0bWFwKTsKKwllbHNlCisJCWlkID0gMDsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYW1kX2lvbW11X2RldnRhYmxlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpZDsKK30KKworc3RhdGljIHZvaWQgZG9tYWluX2lkX2ZyZWUoaW50IGlkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7CisJaWYgKGlkID4gMCAmJiBpZCA8IE1BWF9ET01BSU5fSUQpCisJCV9fY2xlYXJfYml0KGlkLCBhbWRfaW9tbXVfcGRfYWxsb2NfYml0bWFwKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYW1kX2lvbW11X2RldnRhYmxlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9wYWdldGFibGUoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCit7CisJaW50IGksIGo7CisJdTY0ICpwMSwgKnAyLCAqcDM7CisKKwlwMSA9IGRvbWFpbi0+cHRfcm9vdDsKKworCWlmICghcDEpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCA1MTI7ICsraSkgeworCQlpZiAoIUlPTU1VX1BURV9QUkVTRU5UKHAxW2ldKSkKKwkJCWNvbnRpbnVlOworCisJCXAyID0gSU9NTVVfUFRFX1BBR0UocDFbaV0pOworCQlmb3IgKGogPSAwOyBqIDwgNTEyOyArK2opIHsKKwkJCWlmICghSU9NTVVfUFRFX1BSRVNFTlQocDJbal0pKQorCQkJCWNvbnRpbnVlOworCQkJcDMgPSBJT01NVV9QVEVfUEFHRShwMltqXSk7CisJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcDMpOworCQl9CisKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXAyKTsKKwl9CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcDEpOworCisJZG9tYWluLT5wdF9yb290ID0gTlVMTDsKK30KKworLyoKKyAqIEZyZWUgYSBkb21haW4sIG9ubHkgdXNlZCBpZiBzb21ldGhpbmcgd2VudCB3cm9uZyBpbiB0aGUKKyAqIGFsbG9jYXRpb24gcGF0aCBhbmQgd2UgbmVlZCB0byBmcmVlIGFuIGFscmVhZHkgYWxsb2NhdGVkIHBhZ2UgdGFibGUKKyAqLworc3RhdGljIHZvaWQgZG1hX29wc19kb21haW5fZnJlZShzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRvbSkKK3sKKwlpbnQgaTsKKworCWlmICghZG9tKQorCQlyZXR1cm47CisKKwlkZWxfZG9tYWluX2Zyb21fbGlzdCgmZG9tLT5kb21haW4pOworCisJZnJlZV9wYWdldGFibGUoJmRvbS0+ZG9tYWluKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUEVSVFVSRV9NQVhfUkFOR0VTOyArK2kpIHsKKwkJaWYgKCFkb20tPmFwZXJ0dXJlW2ldKQorCQkJY29udGludWU7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkb20tPmFwZXJ0dXJlW2ldLT5iaXRtYXApOworCQlrZnJlZShkb20tPmFwZXJ0dXJlW2ldKTsKKwl9CisKKwlrZnJlZShkb20pOworfQorCisvKgorICogQWxsb2NhdGVzIGEgbmV3IHByb3RlY3Rpb24gZG9tYWluIHVzYWJsZSBmb3IgdGhlIGRtYV9vcHMgZnVuY3Rpb25zLgorICogSXQgYWxzbyBpbml0aWFsaXplcyB0aGUgcGFnZSB0YWJsZSBhbmQgdGhlIGFkZHJlc3MgYWxsb2NhdG9yIGRhdGEKKyAqIHN0cnVjdHVyZXMgcmVxdWlyZWQgZm9yIHRoZSBkbWFfb3BzIGludGVyZmFjZQorICovCitzdGF0aWMgc3RydWN0IGRtYV9vcHNfZG9tYWluICpkbWFfb3BzX2RvbWFpbl9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX2RvbTsKKworCWRtYV9kb20gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZG1hX29wc19kb21haW4pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRtYV9kb20pCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJmRtYV9kb20tPmRvbWFpbi5sb2NrKTsKKworCWRtYV9kb20tPmRvbWFpbi5pZCA9IGRvbWFpbl9pZF9hbGxvYygpOworCWlmIChkbWFfZG9tLT5kb21haW4uaWQgPT0gMCkKKwkJZ290byBmcmVlX2RtYV9kb207CisJSU5JVF9MSVNUX0hFQUQoJmRtYV9kb20tPmRvbWFpbi5kZXZfbGlzdCk7CisJZG1hX2RvbS0+ZG9tYWluLm1vZGUgPSBQQUdFX01PREVfMl9MRVZFTDsKKwlkbWFfZG9tLT5kb21haW4ucHRfcm9vdCA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWRtYV9kb20tPmRvbWFpbi5mbGFncyA9IFBEX0RNQV9PUFNfTUFTSzsKKwlkbWFfZG9tLT5kb21haW4ucHJpdiA9IGRtYV9kb207CisJaWYgKCFkbWFfZG9tLT5kb21haW4ucHRfcm9vdCkKKwkJZ290byBmcmVlX2RtYV9kb207CisKKwlkbWFfZG9tLT5uZWVkX2ZsdXNoID0gZmFsc2U7CisJZG1hX2RvbS0+dGFyZ2V0X2RldiA9IDB4ZmZmZjsKKworCWFkZF9kb21haW5fdG9fbGlzdCgmZG1hX2RvbS0+ZG9tYWluKTsKKworCWlmIChhbGxvY19uZXdfcmFuZ2UoZG1hX2RvbSwgdHJ1ZSwgR0ZQX0tFUk5FTCkpCisJCWdvdG8gZnJlZV9kbWFfZG9tOworCisJLyoKKwkgKiBtYXJrIHRoZSBmaXJzdCBwYWdlIGFzIGFsbG9jYXRlZCBzbyB3ZSBuZXZlciByZXR1cm4gMCBhcworCSAqIGEgdmFsaWQgZG1hLWFkZHJlc3MuIFNvIHdlIGNhbiB1c2UgMCBhcyBlcnJvciB2YWx1ZQorCSAqLworCWRtYV9kb20tPmFwZXJ0dXJlWzBdLT5iaXRtYXBbMF0gPSAxOworCWRtYV9kb20tPm5leHRfYWRkcmVzcyA9IDA7CisKKworCXJldHVybiBkbWFfZG9tOworCitmcmVlX2RtYV9kb206CisJZG1hX29wc19kb21haW5fZnJlZShkbWFfZG9tKTsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICogbGl0dGxlIGhlbHBlciBmdW5jdGlvbiB0byBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gcHJvdGVjdGlvbiBkb21haW4gaXMgYQorICogZG1hX29wcyBkb21haW4KKyAqLworc3RhdGljIGJvb2wgZG1hX29wc19kb21haW4oc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCit7CisJcmV0dXJuIGRvbWFpbi0+ZmxhZ3MgJiBQRF9ETUFfT1BTX01BU0s7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kdGVfZW50cnkodTE2IGRldmlkLCBzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiwgYm9vbCBhdHMpCit7CisJdTY0IHB0ZV9yb290ID0gdmlydF90b19waHlzKGRvbWFpbi0+cHRfcm9vdCk7CisJdTMyIGZsYWdzID0gMDsKKworCXB0ZV9yb290IHw9IChkb21haW4tPm1vZGUgJiBERVZfRU5UUllfTU9ERV9NQVNLKQorCQkgICAgPDwgREVWX0VOVFJZX01PREVfU0hJRlQ7CisJcHRlX3Jvb3QgfD0gSU9NTVVfUFRFX0lSIHwgSU9NTVVfUFRFX0lXIHwgSU9NTVVfUFRFX1AgfCBJT01NVV9QVEVfVFY7CisKKwlpZiAoYXRzKQorCQlmbGFncyB8PSBEVEVfRkxBR19JT1RMQjsKKworCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbM10gfD0gZmxhZ3M7CisJYW1kX2lvbW11X2Rldl90YWJsZVtkZXZpZF0uZGF0YVsyXSAgPSBkb21haW4tPmlkOworCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMV0gID0gdXBwZXJfMzJfYml0cyhwdGVfcm9vdCk7CisJYW1kX2lvbW11X2Rldl90YWJsZVtkZXZpZF0uZGF0YVswXSAgPSBsb3dlcl8zMl9iaXRzKHB0ZV9yb290KTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfZHRlX2VudHJ5KHUxNiBkZXZpZCkKK3sKKwkvKiByZW1vdmUgZW50cnkgZnJvbSB0aGUgZGV2aWNlIHRhYmxlIHNlZW4gYnkgdGhlIGhhcmR3YXJlICovCisJYW1kX2lvbW11X2Rldl90YWJsZVtkZXZpZF0uZGF0YVswXSA9IElPTU1VX1BURV9QIHwgSU9NTVVfUFRFX1RWOworCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMV0gPSAwOworCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMl0gPSAwOworCisJYW1kX2lvbW11X2FwcGx5X2VycmF0dW1fNjMoZGV2aWQpOworfQorCitzdGF0aWMgdm9pZCBkb19hdHRhY2goc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YSwKKwkJICAgICAgc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCit7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CisJYm9vbCBhdHM7CisKKwlpb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2Rldl9kYXRhLT5kZXZpZF07CisJYXRzICAgPSBkZXZfZGF0YS0+YXRzLmVuYWJsZWQ7CisKKwkvKiBVcGRhdGUgZGF0YSBzdHJ1Y3R1cmVzICovCisJZGV2X2RhdGEtPmRvbWFpbiA9IGRvbWFpbjsKKwlsaXN0X2FkZCgmZGV2X2RhdGEtPmxpc3QsICZkb21haW4tPmRldl9saXN0KTsKKwlzZXRfZHRlX2VudHJ5KGRldl9kYXRhLT5kZXZpZCwgZG9tYWluLCBhdHMpOworCisJLyogRG8gcmVmZXJlbmNlIGNvdW50aW5nICovCisJZG9tYWluLT5kZXZfaW9tbXVbaW9tbXUtPmluZGV4XSArPSAxOworCWRvbWFpbi0+ZGV2X2NudCAgICAgICAgICAgICAgICAgKz0gMTsKKworCS8qIEZsdXNoIHRoZSBEVEUgZW50cnkgKi8KKwlkZXZpY2VfZmx1c2hfZHRlKGRldl9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgZG9fZGV0YWNoKHN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGEpCit7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CisKKwlpb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2Rldl9kYXRhLT5kZXZpZF07CisKKwkvKiBkZWNyZWFzZSByZWZlcmVuY2UgY291bnRlcnMgKi8KKwlkZXZfZGF0YS0+ZG9tYWluLT5kZXZfaW9tbXVbaW9tbXUtPmluZGV4XSAtPSAxOworCWRldl9kYXRhLT5kb21haW4tPmRldl9jbnQgICAgICAgICAgICAgICAgIC09IDE7CisKKwkvKiBVcGRhdGUgZGF0YSBzdHJ1Y3R1cmVzICovCisJZGV2X2RhdGEtPmRvbWFpbiA9IE5VTEw7CisJbGlzdF9kZWwoJmRldl9kYXRhLT5saXN0KTsKKwljbGVhcl9kdGVfZW50cnkoZGV2X2RhdGEtPmRldmlkKTsKKworCS8qIEZsdXNoIHRoZSBEVEUgZW50cnkgKi8KKwlkZXZpY2VfZmx1c2hfZHRlKGRldl9kYXRhKTsKK30KKworLyoKKyAqIElmIGEgZGV2aWNlIGlzIG5vdCB5ZXQgYXNzb2NpYXRlZCB3aXRoIGEgZG9tYWluLCB0aGlzIGZ1bmN0aW9uIGRvZXMKKyAqIGFzc2lnbnMgaXQgdmlzaWJsZSBmb3IgdGhlIGhhcmR3YXJlCisgKi8KK3N0YXRpYyBpbnQgX19hdHRhY2hfZGV2aWNlKHN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGEsCisJCQkgICBzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKK3sKKwlpbnQgcmV0OworCisJLyogbG9jayBkb21haW4gKi8KKwlzcGluX2xvY2soJmRvbWFpbi0+bG9jayk7CisKKwlpZiAoZGV2X2RhdGEtPmFsaWFzX2RhdGEgIT0gTlVMTCkgeworCQlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmFsaWFzX2RhdGEgPSBkZXZfZGF0YS0+YWxpYXNfZGF0YTsKKworCQkvKiBTb21lIHNhbml0eSBjaGVja3MgKi8KKwkJcmV0ID0gLUVCVVNZOworCQlpZiAoYWxpYXNfZGF0YS0+ZG9tYWluICE9IE5VTEwgJiYKKwkJCQlhbGlhc19kYXRhLT5kb21haW4gIT0gZG9tYWluKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCWlmIChkZXZfZGF0YS0+ZG9tYWluICE9IE5VTEwgJiYKKwkJCQlkZXZfZGF0YS0+ZG9tYWluICE9IGRvbWFpbikKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQkvKiBEbyByZWFsIGFzc2lnbm1lbnQgKi8KKwkJaWYgKGFsaWFzX2RhdGEtPmRvbWFpbiA9PSBOVUxMKQorCQkJZG9fYXR0YWNoKGFsaWFzX2RhdGEsIGRvbWFpbik7CisKKwkJYXRvbWljX2luYygmYWxpYXNfZGF0YS0+YmluZCk7CisJfQorCisJaWYgKGRldl9kYXRhLT5kb21haW4gPT0gTlVMTCkKKwkJZG9fYXR0YWNoKGRldl9kYXRhLCBkb21haW4pOworCisJYXRvbWljX2luYygmZGV2X2RhdGEtPmJpbmQpOworCisJcmV0ID0gMDsKKworb3V0X3VubG9jazoKKworCS8qIHJlYWR5ICovCisJc3Bpbl91bmxvY2soJmRvbWFpbi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSWYgYSBkZXZpY2UgaXMgbm90IHlldCBhc3NvY2lhdGVkIHdpdGggYSBkb21haW4sIHRoaXMgZnVuY3Rpb24gZG9lcworICogYXNzaWducyBpdCB2aXNpYmxlIGZvciB0aGUgaGFyZHdhcmUKKyAqLworc3RhdGljIGludCBhdHRhY2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWRldl9kYXRhID0gZ2V0X2Rldl9kYXRhKGRldik7CisKKwlpZiAoYW1kX2lvbW11X2lvdGxiX3N1cCAmJiBwY2lfZW5hYmxlX2F0cyhwZGV2LCBQQUdFX1NISUZUKSA9PSAwKSB7CisJCWRldl9kYXRhLT5hdHMuZW5hYmxlZCA9IHRydWU7CisJCWRldl9kYXRhLT5hdHMucWRlcCAgICA9IHBjaV9hdHNfcXVldWVfZGVwdGgocGRldik7CisJfQorCisJd3JpdGVfbG9ja19pcnFzYXZlKCZhbWRfaW9tbXVfZGV2dGFibGVfbG9jaywgZmxhZ3MpOworCXJldCA9IF9fYXR0YWNoX2RldmljZShkZXZfZGF0YSwgZG9tYWluKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYW1kX2lvbW11X2RldnRhYmxlX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogV2UgbWlnaHQgYm9vdCBpbnRvIGEgY3Jhc2gta2VybmVsIGhlcmUuIFRoZSBjcmFzaGVkIGtlcm5lbAorCSAqIGxlZnQgdGhlIGNhY2hlcyBpbiB0aGUgSU9NTVUgZGlydHkuIFNvIHdlIGhhdmUgdG8gZmx1c2gKKwkgKiBoZXJlIHRvIGV2aWN0IGFsbCBkaXJ0eSBzdHVmZi4KKwkgKi8KKwlkb21haW5fZmx1c2hfdGxiX3BkZShkb21haW4pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlbW92ZXMgYSBkZXZpY2UgZnJvbSBhIHByb3RlY3Rpb24gZG9tYWluICh1bmxvY2tlZCkKKyAqLworc3RhdGljIHZvaWQgX19kZXRhY2hfZGV2aWNlKHN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGEpCit7CisJc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUJVR19PTighZGV2X2RhdGEtPmRvbWFpbik7CisKKwlkb21haW4gPSBkZXZfZGF0YS0+ZG9tYWluOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOworCisJaWYgKGRldl9kYXRhLT5hbGlhc19kYXRhICE9IE5VTEwpIHsKKwkJc3RydWN0IGlvbW11X2Rldl9kYXRhICphbGlhc19kYXRhID0gZGV2X2RhdGEtPmFsaWFzX2RhdGE7CisKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmFsaWFzX2RhdGEtPmJpbmQpKQorCQkJZG9fZGV0YWNoKGFsaWFzX2RhdGEpOworCX0KKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXZfZGF0YS0+YmluZCkpCisJCWRvX2RldGFjaChkZXZfZGF0YSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogSWYgd2UgcnVuIGluIHBhc3N0aHJvdWdoIG1vZGUgdGhlIGRldmljZSBtdXN0IGJlIGFzc2lnbmVkIHRvIHRoZQorCSAqIHBhc3N0aHJvdWdoIGRvbWFpbiBpZiBpdCBpcyBkZXRhY2hlZCBmcm9tIGFueSBvdGhlciBkb21haW4uCisJICogTWFrZSBzdXJlIHdlIGNhbiBkZWFzc2lnbiBmcm9tIHRoZSBwdF9kb21haW4gaXRzZWxmLgorCSAqLworCWlmIChpb21tdV9wYXNzX3Rocm91Z2ggJiYKKwkgICAgKGRldl9kYXRhLT5kb21haW4gPT0gTlVMTCAmJiBkb21haW4gIT0gcHRfZG9tYWluKSkKKwkJX19hdHRhY2hfZGV2aWNlKGRldl9kYXRhLCBwdF9kb21haW4pOworfQorCisvKgorICogUmVtb3ZlcyBhIGRldmljZSBmcm9tIGEgcHJvdGVjdGlvbiBkb21haW4gKHdpdGggZGV2dGFibGVfbG9jayBoZWxkKQorICovCitzdGF0aWMgdm9pZCBkZXRhY2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGF0YSA9IGdldF9kZXZfZGF0YShkZXYpOworCisJLyogbG9jayBkZXZpY2UgdGFibGUgKi8KKwl3cml0ZV9sb2NrX2lycXNhdmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7CisJX19kZXRhY2hfZGV2aWNlKGRldl9kYXRhKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYW1kX2lvbW11X2RldnRhYmxlX2xvY2ssIGZsYWdzKTsKKworCWlmIChkZXZfZGF0YS0+YXRzLmVuYWJsZWQpIHsKKwkJcGNpX2Rpc2FibGVfYXRzKHRvX3BjaV9kZXYoZGV2KSk7CisJCWRldl9kYXRhLT5hdHMuZW5hYmxlZCA9IGZhbHNlOworCX0KK30KKworLyoKKyAqIEZpbmQgb3V0IHRoZSBwcm90ZWN0aW9uIGRvbWFpbiBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gUENJIGRldmljZS4gVGhpcworICogd2lsbCBnaXZlIHVzIHRoZSBwb2ludGVyIHRvIHRoZSBwYWdlIHRhYmxlIHJvb3QgZm9yIGV4YW1wbGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbl9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOworCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RhdGEgICA9IGdldF9kZXZfZGF0YShkZXYpOworCisJaWYgKGRldl9kYXRhLT5kb21haW4pCisJCXJldHVybiBkZXZfZGF0YS0+ZG9tYWluOworCisJaWYgKGRldl9kYXRhLT5hbGlhc19kYXRhICE9IE5VTEwpIHsKKwkJc3RydWN0IGlvbW11X2Rldl9kYXRhICphbGlhc19kYXRhID0gZGV2X2RhdGEtPmFsaWFzX2RhdGE7CisKKwkJcmVhZF9sb2NrX2lycXNhdmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7CisJCWlmIChhbGlhc19kYXRhLT5kb21haW4gIT0gTlVMTCkgeworCQkJX19hdHRhY2hfZGV2aWNlKGRldl9kYXRhLCBhbGlhc19kYXRhLT5kb21haW4pOworCQkJZG9tID0gYWxpYXNfZGF0YS0+ZG9tYWluOworCQl9CisJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmFtZF9pb21tdV9kZXZ0YWJsZV9sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIGRvbTsKK30KKworc3RhdGljIGludCBkZXZpY2VfY2hhbmdlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOworCXUxNiBkZXZpZDsKKwlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbjsKKwlzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9kb21haW47CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghY2hlY2tfZGV2aWNlKGRldikpCisJCXJldHVybiAwOworCisJZGV2aWQgID0gZ2V0X2RldmljZV9pZChkZXYpOworCWlvbW11ICA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2RldmlkXTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBCVVNfTk9USUZZX1VOQk9VTkRfRFJJVkVSOgorCisJCWRvbWFpbiA9IGRvbWFpbl9mb3JfZGV2aWNlKGRldik7CisKKwkJaWYgKCFkb21haW4pCisJCQlnb3RvIG91dDsKKwkJaWYgKGlvbW11X3Bhc3NfdGhyb3VnaCkKKwkJCWJyZWFrOworCQlkZXRhY2hfZGV2aWNlKGRldik7CisJCWJyZWFrOworCWNhc2UgQlVTX05PVElGWV9BRERfREVWSUNFOgorCisJCWlvbW11X2luaXRfZGV2aWNlKGRldik7CisKKwkJZG9tYWluID0gZG9tYWluX2Zvcl9kZXZpY2UoZGV2KTsKKworCQkvKiBhbGxvY2F0ZSBhIHByb3RlY3Rpb24gZG9tYWluIGlmIGEgZGV2aWNlIGlzIGFkZGVkICovCisJCWRtYV9kb21haW4gPSBmaW5kX3Byb3RlY3Rpb25fZG9tYWluKGRldmlkKTsKKwkJaWYgKGRtYV9kb21haW4pCisJCQlnb3RvIG91dDsKKwkJZG1hX2RvbWFpbiA9IGRtYV9vcHNfZG9tYWluX2FsbG9jKCk7CisJCWlmICghZG1hX2RvbWFpbikKKwkJCWdvdG8gb3V0OworCQlkbWFfZG9tYWluLT50YXJnZXRfZGV2ID0gZGV2aWQ7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11X3BkX2xpc3RfbG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZF90YWlsKCZkbWFfZG9tYWluLT5saXN0LCAmaW9tbXVfcGRfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11X3BkX2xpc3RfbG9jaywgZmxhZ3MpOworCisJCWJyZWFrOworCWNhc2UgQlVTX05PVElGWV9ERUxfREVWSUNFOgorCisJCWlvbW11X3VuaW5pdF9kZXZpY2UoZGV2KTsKKworCWRlZmF1bHQ6CisJCWdvdG8gb3V0OworCX0KKworCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7CisKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBkZXZpY2VfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBkZXZpY2VfY2hhbmdlX25vdGlmaWVyLAorfTsKKwordm9pZCBhbWRfaW9tbXVfaW5pdF9ub3RpZmllcih2b2lkKQoreworCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmcGNpX2J1c190eXBlLCAmZGV2aWNlX25iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG5leHQgZnVuY3Rpb25zIGJlbG9uZyB0byB0aGUgZG1hX29wcyBtYXBwaW5nL3VubWFwcGluZyBjb2RlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEluIHRoZSBkbWFfb3BzIHBhdGggd2Ugb25seSBoYXZlIHRoZSBzdHJ1Y3QgZGV2aWNlLiBUaGlzIGZ1bmN0aW9uCisgKiBmaW5kcyB0aGUgY29ycmVzcG9uZGluZyBJT01NVSwgdGhlIHByb3RlY3Rpb24gZG9tYWluIGFuZCB0aGUKKyAqIHJlcXVlc3RvciBpZCBmb3IgYSBnaXZlbiBkZXZpY2UuCisgKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCB5ZXQgYXNzb2NpYXRlZCB3aXRoIGEgZG9tYWluIHRoaXMgaXMgYWxzbyBkb25lCisgKiBpbiB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpnZXRfZG9tYWluKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbjsKKwlzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9kb207CisJdTE2IGRldmlkID0gZ2V0X2RldmljZV9pZChkZXYpOworCisJaWYgKCFjaGVja19kZXZpY2UoZGV2KSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlkb21haW4gPSBkb21haW5fZm9yX2RldmljZShkZXYpOworCWlmIChkb21haW4gIT0gTlVMTCAmJiAhZG1hX29wc19kb21haW4oZG9tYWluKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKKworCWlmIChkb21haW4gIT0gTlVMTCkKKwkJcmV0dXJuIGRvbWFpbjsKKworCS8qIERldmljZSBub3QgYm91bnQgeWV0IC0gYmluZCBpdCAqLworCWRtYV9kb20gPSBmaW5kX3Byb3RlY3Rpb25fZG9tYWluKGRldmlkKTsKKwlpZiAoIWRtYV9kb20pCisJCWRtYV9kb20gPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtkZXZpZF0tPmRlZmF1bHRfZG9tOworCWF0dGFjaF9kZXZpY2UoZGV2LCAmZG1hX2RvbS0+ZG9tYWluKTsKKwlEVU1QX3ByaW50aygiVXNpbmcgcHJvdGVjdGlvbiBkb21haW4gJWQgZm9yIGRldmljZSAlc1xuIiwKKwkJICAgIGRtYV9kb20tPmRvbWFpbi5pZCwgZGV2X25hbWUoZGV2KSk7CisKKwlyZXR1cm4gJmRtYV9kb20tPmRvbWFpbjsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2RldmljZV90YWJsZShzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfZGF0YSwgJmRvbWFpbi0+ZGV2X2xpc3QsIGxpc3QpCisJCXNldF9kdGVfZW50cnkoZGV2X2RhdGEtPmRldmlkLCBkb21haW4sIGRldl9kYXRhLT5hdHMuZW5hYmxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9kb21haW4oc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCit7CisJaWYgKCFkb21haW4tPnVwZGF0ZWQpCisJCXJldHVybjsKKworCXVwZGF0ZV9kZXZpY2VfdGFibGUoZG9tYWluKTsKKworCWRvbWFpbl9mbHVzaF9kZXZpY2VzKGRvbWFpbik7CisJZG9tYWluX2ZsdXNoX3RsYl9wZGUoZG9tYWluKTsKKworCWRvbWFpbi0+dXBkYXRlZCA9IGZhbHNlOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmZXRjaGVzIHRoZSBQVEUgZm9yIGEgZ2l2ZW4gYWRkcmVzcyBpbiB0aGUgYXBlcnR1cmUKKyAqLworc3RhdGljIHU2NCogZG1hX29wc19nZXRfcHRlKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgYXBlcnR1cmVfcmFuZ2UgKmFwZXJ0dXJlOworCXU2NCAqcHRlLCAqcHRlX3BhZ2U7CisKKwlhcGVydHVyZSA9IGRvbS0+YXBlcnR1cmVbQVBFUlRVUkVfUkFOR0VfSU5ERVgoYWRkcmVzcyldOworCWlmICghYXBlcnR1cmUpCisJCXJldHVybiBOVUxMOworCisJcHRlID0gYXBlcnR1cmUtPnB0ZV9wYWdlc1tBUEVSVFVSRV9QQUdFX0lOREVYKGFkZHJlc3MpXTsKKwlpZiAoIXB0ZSkgeworCQlwdGUgPSBhbGxvY19wdGUoJmRvbS0+ZG9tYWluLCBhZGRyZXNzLCBQQUdFX1NJWkUsICZwdGVfcGFnZSwKKwkJCQlHRlBfQVRPTUlDKTsKKwkJYXBlcnR1cmUtPnB0ZV9wYWdlc1tBUEVSVFVSRV9QQUdFX0lOREVYKGFkZHJlc3MpXSA9IHB0ZV9wYWdlOworCX0gZWxzZQorCQlwdGUgKz0gUE1fTEVWRUxfSU5ERVgoMCwgYWRkcmVzcyk7CisKKwl1cGRhdGVfZG9tYWluKCZkb20tPmRvbWFpbik7CisKKwlyZXR1cm4gcHRlOworfQorCisvKgorICogVGhpcyBpcyB0aGUgZ2VuZXJpYyBtYXAgZnVuY3Rpb24uIEl0IG1hcHMgb25lIDRrYiBwYWdlIGF0IHBhZGRyIHRvCisgKiB0aGUgZ2l2ZW4gYWRkcmVzcyBpbiB0aGUgRE1BIGFkZHJlc3Mgc3BhY2UgZm9yIHRoZSBkb21haW4uCisgKi8KK3N0YXRpYyBkbWFfYWRkcl90IGRtYV9vcHNfZG9tYWluX21hcChzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRvbSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICAgIHBoeXNfYWRkcl90IHBhZGRyLAorCQkJCSAgICAgaW50IGRpcmVjdGlvbikKK3sKKwl1NjQgKnB0ZSwgX19wdGU7CisKKwlXQVJOX09OKGFkZHJlc3MgPiBkb20tPmFwZXJ0dXJlX3NpemUpOworCisJcGFkZHIgJj0gUEFHRV9NQVNLOworCisJcHRlICA9IGRtYV9vcHNfZ2V0X3B0ZShkb20sIGFkZHJlc3MpOworCWlmICghcHRlKQorCQlyZXR1cm4gRE1BX0VSUk9SX0NPREU7CisKKwlfX3B0ZSA9IHBhZGRyIHwgSU9NTVVfUFRFX1AgfCBJT01NVV9QVEVfRkM7CisKKwlpZiAoZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisJCV9fcHRlIHw9IElPTU1VX1BURV9JUjsKKwllbHNlIGlmIChkaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQorCQlfX3B0ZSB8PSBJT01NVV9QVEVfSVc7CisJZWxzZSBpZiAoZGlyZWN0aW9uID09IERNQV9CSURJUkVDVElPTkFMKQorCQlfX3B0ZSB8PSBJT01NVV9QVEVfSVIgfCBJT01NVV9QVEVfSVc7CisKKwlXQVJOX09OKCpwdGUpOworCisJKnB0ZSA9IF9fcHRlOworCisJcmV0dXJuIChkbWFfYWRkcl90KWFkZHJlc3M7Cit9CisKKy8qCisgKiBUaGUgZ2VuZXJpYyB1bm1hcHBpbmcgZnVuY3Rpb24gZm9yIG9uIHBhZ2UgaW4gdGhlIERNQSBhZGRyZXNzIHNwYWNlLgorICovCitzdGF0aWMgdm9pZCBkbWFfb3BzX2RvbWFpbl91bm1hcChzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRvbSwKKwkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBhcGVydHVyZV9yYW5nZSAqYXBlcnR1cmU7CisJdTY0ICpwdGU7CisKKwlpZiAoYWRkcmVzcyA+PSBkb20tPmFwZXJ0dXJlX3NpemUpCisJCXJldHVybjsKKworCWFwZXJ0dXJlID0gZG9tLT5hcGVydHVyZVtBUEVSVFVSRV9SQU5HRV9JTkRFWChhZGRyZXNzKV07CisJaWYgKCFhcGVydHVyZSkKKwkJcmV0dXJuOworCisJcHRlICA9IGFwZXJ0dXJlLT5wdGVfcGFnZXNbQVBFUlRVUkVfUEFHRV9JTkRFWChhZGRyZXNzKV07CisJaWYgKCFwdGUpCisJCXJldHVybjsKKworCXB0ZSArPSBQTV9MRVZFTF9JTkRFWCgwLCBhZGRyZXNzKTsKKworCVdBUk5fT04oISpwdGUpOworCisJKnB0ZSA9IDBVTEw7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIGNvbW1vbiBjb2RlIGZvciBtYXBwaW5nIG9mIGEgcGh5c2ljYWxseQorICogY29udGlndW91cyBtZW1vcnkgcmVnaW9uIGludG8gRE1BIGFkZHJlc3Mgc3BhY2UuIEl0IGlzIHVzZWQgYnkgYWxsCisgKiBtYXBwaW5nIGZ1bmN0aW9ucyBwcm92aWRlZCB3aXRoIHRoaXMgSU9NTVUgZHJpdmVyLgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgZG9tYWluIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIGRtYV9hZGRyX3QgX19tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9kb20sCisJCQkgICAgICAgcGh5c19hZGRyX3QgcGFkZHIsCisJCQkgICAgICAgc2l6ZV90IHNpemUsCisJCQkgICAgICAgaW50IGRpciwKKwkJCSAgICAgICBib29sIGFsaWduLAorCQkJICAgICAgIHU2NCBkbWFfbWFzaykKK3sKKwlkbWFfYWRkcl90IG9mZnNldCA9IHBhZGRyICYgflBBR0VfTUFTSzsKKwlkbWFfYWRkcl90IGFkZHJlc3MsIHN0YXJ0LCByZXQ7CisJdW5zaWduZWQgaW50IHBhZ2VzOworCXVuc2lnbmVkIGxvbmcgYWxpZ25fbWFzayA9IDA7CisJaW50IGk7CisKKwlwYWdlcyA9IGlvbW11X251bV9wYWdlcyhwYWRkciwgc2l6ZSwgUEFHRV9TSVpFKTsKKwlwYWRkciAmPSBQQUdFX01BU0s7CisKKwlJTkNfU1RBVFNfQ09VTlRFUih0b3RhbF9tYXBfcmVxdWVzdHMpOworCisJaWYgKHBhZ2VzID4gMSkKKwkJSU5DX1NUQVRTX0NPVU5URVIoY3Jvc3NfcGFnZSk7CisKKwlpZiAoYWxpZ24pCisJCWFsaWduX21hc2sgPSAoMVVMIDw8IGdldF9vcmRlcihzaXplKSkgLSAxOworCityZXRyeToKKwlhZGRyZXNzID0gZG1hX29wc19hbGxvY19hZGRyZXNzZXMoZGV2LCBkbWFfZG9tLCBwYWdlcywgYWxpZ25fbWFzaywKKwkJCQkJICBkbWFfbWFzayk7CisJaWYgKHVubGlrZWx5KGFkZHJlc3MgPT0gRE1BX0VSUk9SX0NPREUpKSB7CisJCS8qCisJCSAqIHNldHRpbmcgbmV4dF9hZGRyZXNzIGhlcmUgd2lsbCBsZXQgdGhlIGFkZHJlc3MKKwkJICogYWxsb2NhdG9yIG9ubHkgc2NhbiB0aGUgbmV3IGFsbG9jYXRlZCByYW5nZSBpbiB0aGUKKwkJICogZmlyc3QgcnVuLiBUaGlzIGlzIGEgc21hbGwgb3B0aW1pemF0aW9uLgorCQkgKi8KKwkJZG1hX2RvbS0+bmV4dF9hZGRyZXNzID0gZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZTsKKworCQlpZiAoYWxsb2NfbmV3X3JhbmdlKGRtYV9kb20sIGZhbHNlLCBHRlBfQVRPTUlDKSkKKwkJCWdvdG8gb3V0OworCisJCS8qCisJCSAqIGFwZXJ0dXJlIHdhcyBzdWNjZXNzZnVsbHkgZW5sYXJnZWQgYnkgMTI4IE1CLCB0cnkKKwkJICogYWxsb2NhdGlvbiBhZ2FpbgorCQkgKi8KKwkJZ290byByZXRyeTsKKwl9CisKKwlzdGFydCA9IGFkZHJlc3M7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzOyArK2kpIHsKKwkJcmV0ID0gZG1hX29wc19kb21haW5fbWFwKGRtYV9kb20sIHN0YXJ0LCBwYWRkciwgZGlyKTsKKwkJaWYgKHJldCA9PSBETUFfRVJST1JfQ09ERSkKKwkJCWdvdG8gb3V0X3VubWFwOworCisJCXBhZGRyICs9IFBBR0VfU0laRTsKKwkJc3RhcnQgKz0gUEFHRV9TSVpFOworCX0KKwlhZGRyZXNzICs9IG9mZnNldDsKKworCUFERF9TVEFUU19DT1VOVEVSKGFsbG9jZWRfaW9fbWVtLCBzaXplKTsKKworCWlmICh1bmxpa2VseShkbWFfZG9tLT5uZWVkX2ZsdXNoICYmICFhbWRfaW9tbXVfdW5tYXBfZmx1c2gpKSB7CisJCWRvbWFpbl9mbHVzaF90bGIoJmRtYV9kb20tPmRvbWFpbik7CisJCWRtYV9kb20tPm5lZWRfZmx1c2ggPSBmYWxzZTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KGFtZF9pb21tdV9ucF9jYWNoZSkpCisJCWRvbWFpbl9mbHVzaF9wYWdlcygmZG1hX2RvbS0+ZG9tYWluLCBhZGRyZXNzLCBzaXplKTsKKworb3V0OgorCXJldHVybiBhZGRyZXNzOworCitvdXRfdW5tYXA6CisKKwlmb3IgKC0taTsgaSA+PSAwOyAtLWkpIHsKKwkJc3RhcnQgLT0gUEFHRV9TSVpFOworCQlkbWFfb3BzX2RvbWFpbl91bm1hcChkbWFfZG9tLCBzdGFydCk7CisJfQorCisJZG1hX29wc19mcmVlX2FkZHJlc3NlcyhkbWFfZG9tLCBhZGRyZXNzLCBwYWdlcyk7CisKKwlyZXR1cm4gRE1BX0VSUk9SX0NPREU7Cit9CisKKy8qCisgKiBEb2VzIHRoZSByZXZlcnNlIG9mIHRoZSBfX21hcF9zaW5nbGUgZnVuY3Rpb24uIE11c3QgYmUgY2FsbGVkIHdpdGgKKyAqIHRoZSBkb21haW4gbG9jayBoZWxkIHRvbworICovCitzdGF0aWMgdm9pZCBfX3VubWFwX3NpbmdsZShzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9kb20sCisJCQkgICBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJICAgc2l6ZV90IHNpemUsCisJCQkgICBpbnQgZGlyKQoreworCWRtYV9hZGRyX3QgZmx1c2hfYWRkcjsKKwlkbWFfYWRkcl90IGksIHN0YXJ0OworCXVuc2lnbmVkIGludCBwYWdlczsKKworCWlmICgoZG1hX2FkZHIgPT0gRE1BX0VSUk9SX0NPREUpIHx8CisJICAgIChkbWFfYWRkciArIHNpemUgPiBkbWFfZG9tLT5hcGVydHVyZV9zaXplKSkKKwkJcmV0dXJuOworCisJZmx1c2hfYWRkciA9IGRtYV9hZGRyOworCXBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGRtYV9hZGRyLCBzaXplLCBQQUdFX1NJWkUpOworCWRtYV9hZGRyICY9IFBBR0VfTUFTSzsKKwlzdGFydCA9IGRtYV9hZGRyOworCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzOyArK2kpIHsKKwkJZG1hX29wc19kb21haW5fdW5tYXAoZG1hX2RvbSwgc3RhcnQpOworCQlzdGFydCArPSBQQUdFX1NJWkU7CisJfQorCisJU1VCX1NUQVRTX0NPVU5URVIoYWxsb2NlZF9pb19tZW0sIHNpemUpOworCisJZG1hX29wc19mcmVlX2FkZHJlc3NlcyhkbWFfZG9tLCBkbWFfYWRkciwgcGFnZXMpOworCisJaWYgKGFtZF9pb21tdV91bm1hcF9mbHVzaCB8fCBkbWFfZG9tLT5uZWVkX2ZsdXNoKSB7CisJCWRvbWFpbl9mbHVzaF9wYWdlcygmZG1hX2RvbS0+ZG9tYWluLCBmbHVzaF9hZGRyLCBzaXplKTsKKwkJZG1hX2RvbS0+bmVlZF9mbHVzaCA9IGZhbHNlOworCX0KK30KKworLyoKKyAqIFRoZSBleHBvcnRlZCBtYXBfc2luZ2xlIGZ1bmN0aW9uIGZvciBkbWFfb3BzLgorICovCitzdGF0aWMgZG1hX2FkZHJfdCBtYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAorCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbjsKKwlkbWFfYWRkcl90IGFkZHI7CisJdTY0IGRtYV9tYXNrOworCXBoeXNfYWRkcl90IHBhZGRyID0gcGFnZV90b19waHlzKHBhZ2UpICsgb2Zmc2V0OworCisJSU5DX1NUQVRTX0NPVU5URVIoY250X21hcF9zaW5nbGUpOworCisJZG9tYWluID0gZ2V0X2RvbWFpbihkZXYpOworCWlmIChQVFJfRVJSKGRvbWFpbikgPT0gLUVJTlZBTCkKKwkJcmV0dXJuIChkbWFfYWRkcl90KXBhZGRyOworCWVsc2UgaWYgKElTX0VSUihkb21haW4pKQorCQlyZXR1cm4gRE1BX0VSUk9SX0NPREU7CisKKwlkbWFfbWFzayA9ICpkZXYtPmRtYV9tYXNrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOworCisJYWRkciA9IF9fbWFwX3NpbmdsZShkZXYsIGRvbWFpbi0+cHJpdiwgcGFkZHIsIHNpemUsIGRpciwgZmFsc2UsCisJCQkgICAgZG1hX21hc2spOworCWlmIChhZGRyID09IERNQV9FUlJPUl9DT0RFKQorCQlnb3RvIG91dDsKKworCWRvbWFpbl9mbHVzaF9jb21wbGV0ZShkb21haW4pOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gYWRkcjsKK30KKworLyoKKyAqIFRoZSBleHBvcnRlZCB1bm1hcF9zaW5nbGUgZnVuY3Rpb24gZm9yIGRtYV9vcHMuCisgKi8KK3N0YXRpYyB2b2lkIHVubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbjsKKworCUlOQ19TVEFUU19DT1VOVEVSKGNudF91bm1hcF9zaW5nbGUpOworCisJZG9tYWluID0gZ2V0X2RvbWFpbihkZXYpOworCWlmIChJU19FUlIoZG9tYWluKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOworCisJX191bm1hcF9zaW5nbGUoZG9tYWluLT5wcml2LCBkbWFfYWRkciwgc2l6ZSwgZGlyKTsKKworCWRvbWFpbl9mbHVzaF9jb21wbGV0ZShkb21haW4pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgc3BlY2lhbCBtYXBfc2cgZnVuY3Rpb24gd2hpY2ggaXMgdXNlZCBpZiB3ZSBzaG91bGQgbWFwIGEKKyAqIGRldmljZSB3aGljaCBpcyBub3QgaGFuZGxlZCBieSBhbiBBTUQgSU9NTVUgaW4gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIGludCBtYXBfc2dfbm9faW9tbXUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKKwkJCSAgIGludCBuZWxlbXMsIGludCBkaXIpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCWludCBpOworCisJZm9yX2VhY2hfc2coc2dsaXN0LCBzLCBuZWxlbXMsIGkpIHsKKwkJcy0+ZG1hX2FkZHJlc3MgPSAoZG1hX2FkZHJfdClzZ19waHlzKHMpOworCQlzLT5kbWFfbGVuZ3RoICA9IHMtPmxlbmd0aDsKKwl9CisKKwlyZXR1cm4gbmVsZW1zOworfQorCisvKgorICogVGhlIGV4cG9ydGVkIG1hcF9zZyBmdW5jdGlvbiBmb3IgZG1hX29wcyAoaGFuZGxlcyBzY2F0dGVyLWdhdGhlcgorICogbGlzdHMpLgorICovCitzdGF0aWMgaW50IG1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkgIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluOworCWludCBpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKKwlwaHlzX2FkZHJfdCBwYWRkcjsKKwlpbnQgbWFwcGVkX2VsZW1zID0gMDsKKwl1NjQgZG1hX21hc2s7CisKKwlJTkNfU1RBVFNfQ09VTlRFUihjbnRfbWFwX3NnKTsKKworCWRvbWFpbiA9IGdldF9kb21haW4oZGV2KTsKKwlpZiAoUFRSX0VSUihkb21haW4pID09IC1FSU5WQUwpCisJCXJldHVybiBtYXBfc2dfbm9faW9tbXUoZGV2LCBzZ2xpc3QsIG5lbGVtcywgZGlyKTsKKwllbHNlIGlmIChJU19FUlIoZG9tYWluKSkKKwkJcmV0dXJuIDA7CisKKwlkbWFfbWFzayA9ICpkZXYtPmRtYV9tYXNrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOworCisJZm9yX2VhY2hfc2coc2dsaXN0LCBzLCBuZWxlbXMsIGkpIHsKKwkJcGFkZHIgPSBzZ19waHlzKHMpOworCisJCXMtPmRtYV9hZGRyZXNzID0gX19tYXBfc2luZ2xlKGRldiwgZG9tYWluLT5wcml2LAorCQkJCQkgICAgICBwYWRkciwgcy0+bGVuZ3RoLCBkaXIsIGZhbHNlLAorCQkJCQkgICAgICBkbWFfbWFzayk7CisKKwkJaWYgKHMtPmRtYV9hZGRyZXNzKSB7CisJCQlzLT5kbWFfbGVuZ3RoID0gcy0+bGVuZ3RoOworCQkJbWFwcGVkX2VsZW1zKys7CisJCX0gZWxzZQorCQkJZ290byB1bm1hcDsKKwl9CisKKwlkb21haW5fZmx1c2hfY29tcGxldGUoZG9tYWluKTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG1hcHBlZF9lbGVtczsKK3VubWFwOgorCWZvcl9lYWNoX3NnKHNnbGlzdCwgcywgbWFwcGVkX2VsZW1zLCBpKSB7CisJCWlmIChzLT5kbWFfYWRkcmVzcykKKwkJCV9fdW5tYXBfc2luZ2xlKGRvbWFpbi0+cHJpdiwgcy0+ZG1hX2FkZHJlc3MsCisJCQkJICAgICAgIHMtPmRtYV9sZW5ndGgsIGRpcik7CisJCXMtPmRtYV9hZGRyZXNzID0gcy0+ZG1hX2xlbmd0aCA9IDA7CisJfQorCisJbWFwcGVkX2VsZW1zID0gMDsKKworCWdvdG8gb3V0OworfQorCisvKgorICogVGhlIGV4cG9ydGVkIG1hcF9zZyBmdW5jdGlvbiBmb3IgZG1hX29wcyAoaGFuZGxlcyBzY2F0dGVyLWdhdGhlcgorICogbGlzdHMpLgorICovCitzdGF0aWMgdm9pZCB1bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkgICAgIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJICAgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluOworCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKKwlpbnQgaTsKKworCUlOQ19TVEFUU19DT1VOVEVSKGNudF91bm1hcF9zZyk7CisKKwlkb21haW4gPSBnZXRfZG9tYWluKGRldik7CisJaWYgKElTX0VSUihkb21haW4pKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7CisKKwlmb3JfZWFjaF9zZyhzZ2xpc3QsIHMsIG5lbGVtcywgaSkgeworCQlfX3VubWFwX3NpbmdsZShkb21haW4tPnByaXYsIHMtPmRtYV9hZGRyZXNzLAorCQkJICAgICAgIHMtPmRtYV9sZW5ndGgsIGRpcik7CisJCXMtPmRtYV9hZGRyZXNzID0gcy0+ZG1hX2xlbmd0aCA9IDA7CisJfQorCisJZG9tYWluX2ZsdXNoX2NvbXBsZXRlKGRvbWFpbik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFRoZSBleHBvcnRlZCBhbGxvY19jb2hlcmVudCBmdW5jdGlvbiBmb3IgZG1hX29wcy4KKyAqLworc3RhdGljIHZvaWQgKmFsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgICAgZG1hX2FkZHJfdCAqZG1hX2FkZHIsIGdmcF90IGZsYWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICp2aXJ0X2FkZHI7CisJc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW47CisJcGh5c19hZGRyX3QgcGFkZHI7CisJdTY0IGRtYV9tYXNrID0gZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKKworCUlOQ19TVEFUU19DT1VOVEVSKGNudF9hbGxvY19jb2hlcmVudCk7CisKKwlkb21haW4gPSBnZXRfZG9tYWluKGRldik7CisJaWYgKFBUUl9FUlIoZG9tYWluKSA9PSAtRUlOVkFMKSB7CisJCXZpcnRfYWRkciA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFnLCBnZXRfb3JkZXIoc2l6ZSkpOworCQkqZG1hX2FkZHIgPSBfX3BhKHZpcnRfYWRkcik7CisJCXJldHVybiB2aXJ0X2FkZHI7CisJfSBlbHNlIGlmIChJU19FUlIoZG9tYWluKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkbWFfbWFzayAgPSBkZXYtPmNvaGVyZW50X2RtYV9tYXNrOworCWZsYWcgICAgICY9IH4oX19HRlBfRE1BIHwgX19HRlBfSElHSE1FTSB8IF9fR0ZQX0RNQTMyKTsKKwlmbGFnICAgICB8PSBfX0dGUF9aRVJPOworCisJdmlydF9hZGRyID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGZsYWcsIGdldF9vcmRlcihzaXplKSk7CisJaWYgKCF2aXJ0X2FkZHIpCisJCXJldHVybiBOVUxMOworCisJcGFkZHIgPSB2aXJ0X3RvX3BoeXModmlydF9hZGRyKTsKKworCWlmICghZG1hX21hc2spCisJCWRtYV9tYXNrID0gKmRldi0+ZG1hX21hc2s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7CisKKwkqZG1hX2FkZHIgPSBfX21hcF9zaW5nbGUoZGV2LCBkb21haW4tPnByaXYsIHBhZGRyLAorCQkJCSBzaXplLCBETUFfQklESVJFQ1RJT05BTCwgdHJ1ZSwgZG1hX21hc2spOworCisJaWYgKCpkbWFfYWRkciA9PSBETUFfRVJST1JfQ09ERSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlkb21haW5fZmx1c2hfY29tcGxldGUoZG9tYWluKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZpcnRfYWRkcjsKKworb3V0X2ZyZWU6CisKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZpcnRfYWRkciwgZ2V0X29yZGVyKHNpemUpKTsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICogVGhlIGV4cG9ydGVkIGZyZWVfY29oZXJlbnQgZnVuY3Rpb24gZm9yIGRtYV9vcHMuCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSAgdm9pZCAqdmlydF9hZGRyLCBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW47CisKKwlJTkNfU1RBVFNfQ09VTlRFUihjbnRfZnJlZV9jb2hlcmVudCk7CisKKwlkb21haW4gPSBnZXRfZG9tYWluKGRldik7CisJaWYgKElTX0VSUihkb21haW4pKQorCQlnb3RvIGZyZWVfbWVtOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOworCisJX191bm1hcF9zaW5nbGUoZG9tYWluLT5wcml2LCBkbWFfYWRkciwgc2l6ZSwgRE1BX0JJRElSRUNUSU9OQUwpOworCisJZG9tYWluX2ZsdXNoX2NvbXBsZXRlKGRvbWFpbik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKKworZnJlZV9tZW06CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2aXJ0X2FkZHIsIGdldF9vcmRlcihzaXplKSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRE1BIGxheWVyIHRvIGZpbmQgb3V0IGlmIHdlIGNhbiBoYW5kbGUgYQorICogcGFydGljdWxhciBkZXZpY2UuIEl0IGlzIHBhcnQgb2YgdGhlIGRtYV9vcHMuCisgKi8KK3N0YXRpYyBpbnQgYW1kX2lvbW11X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwlyZXR1cm4gY2hlY2tfZGV2aWNlKGRldik7Cit9CisKKy8qCisgKiBUaGUgZnVuY3Rpb24gZm9yIHByZS1hbGxvY2F0aW5nIHByb3RlY3Rpb24gZG9tYWlucy4KKyAqCisgKiBJZiB0aGUgZHJpdmVyIGNvcmUgaW5mb3JtcyB0aGUgRE1BIGxheWVyIGlmIGEgZHJpdmVyIGdyYWJzIGEgZGV2aWNlCisgKiB3ZSBkb24ndCBuZWVkIHRvIHByZWFsbG9jYXRlIHRoZSBwcm90ZWN0aW9uIGRvbWFpbnMgYW55bW9yZS4KKyAqIEZvciBub3cgd2UgaGF2ZSB0by4KKyAqLworc3RhdGljIHZvaWQgcHJlYWxsb2NfcHJvdGVjdGlvbl9kb21haW5zKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJc3RydWN0IGRtYV9vcHNfZG9tYWluICpkbWFfZG9tOworCXUxNiBkZXZpZDsKKworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CisKKwkJLyogRG8gd2UgaGFuZGxlIHRoaXMgZGV2aWNlPyAqLworCQlpZiAoIWNoZWNrX2RldmljZSgmZGV2LT5kZXYpKQorCQkJY29udGludWU7CisKKwkJLyogSXMgdGhlcmUgYWxyZWFkeSBhbnkgZG9tYWluIGZvciBpdD8gKi8KKwkJaWYgKGRvbWFpbl9mb3JfZGV2aWNlKCZkZXYtPmRldikpCisJCQljb250aW51ZTsKKworCQlkZXZpZCA9IGdldF9kZXZpY2VfaWQoJmRldi0+ZGV2KTsKKworCQlkbWFfZG9tID0gZG1hX29wc19kb21haW5fYWxsb2MoKTsKKwkJaWYgKCFkbWFfZG9tKQorCQkJY29udGludWU7CisJCWluaXRfdW5pdHlfbWFwcGluZ3NfZm9yX2RldmljZShkbWFfZG9tLCBkZXZpZCk7CisJCWRtYV9kb20tPnRhcmdldF9kZXYgPSBkZXZpZDsKKworCQlhdHRhY2hfZGV2aWNlKCZkZXYtPmRldiwgJmRtYV9kb20tPmRvbWFpbik7CisKKwkJbGlzdF9hZGRfdGFpbCgmZG1hX2RvbS0+bGlzdCwgJmlvbW11X3BkX2xpc3QpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBkbWFfbWFwX29wcyBhbWRfaW9tbXVfZG1hX29wcyA9IHsKKwkuYWxsb2NfY29oZXJlbnQgPSBhbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudCA9IGZyZWVfY29oZXJlbnQsCisJLm1hcF9wYWdlID0gbWFwX3BhZ2UsCisJLnVubWFwX3BhZ2UgPSB1bm1hcF9wYWdlLAorCS5tYXBfc2cgPSBtYXBfc2csCisJLnVubWFwX3NnID0gdW5tYXBfc2csCisJLmRtYV9zdXBwb3J0ZWQgPSBhbWRfaW9tbXVfZG1hX3N1cHBvcnRlZCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBkZXZpY2VfZG1hX29wc19pbml0KHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCXVuc2lnbmVkIHVuaGFuZGxlZCA9IDA7CisKKwlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKKwkJaWYgKCFjaGVja19kZXZpY2UoJnBkZXYtPmRldikpIHsKKwkJCXVuaGFuZGxlZCArPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlwZGV2LT5kZXYuYXJjaGRhdGEuZG1hX29wcyA9ICZhbWRfaW9tbXVfZG1hX29wczsKKwl9CisKKwlyZXR1cm4gdW5oYW5kbGVkOworfQorCisvKgorICogVGhlIGZ1bmN0aW9uIHdoaWNoIGNsdWVzIHRoZSBBTUQgSU9NTVUgZHJpdmVyIGludG8gZG1hX29wcy4KKyAqLworCit2b2lkIF9faW5pdCBhbWRfaW9tbXVfaW5pdF9hcGkodm9pZCkKK3sKKwlyZWdpc3Rlcl9pb21tdSgmYW1kX2lvbW11X29wcyk7Cit9CisKK2ludCBfX2luaXQgYW1kX2lvbW11X2luaXRfZG1hX29wcyh2b2lkKQoreworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OworCWludCByZXQsIHVuaGFuZGxlZDsKKworCS8qCisJICogZmlyc3QgYWxsb2NhdGUgYSBkZWZhdWx0IHByb3RlY3Rpb24gZG9tYWluIGZvciBldmVyeSBJT01NVSB3ZQorCSAqIGZvdW5kIGluIHRoZSBzeXN0ZW0uIERldmljZXMgbm90IGFzc2lnbmVkIHRvIGFueSBvdGhlcgorCSAqIHByb3RlY3Rpb24gZG9tYWluIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGRlZmF1bHQgb25lLgorCSAqLworCWZvcl9lYWNoX2lvbW11KGlvbW11KSB7CisJCWlvbW11LT5kZWZhdWx0X2RvbSA9IGRtYV9vcHNfZG9tYWluX2FsbG9jKCk7CisJCWlmIChpb21tdS0+ZGVmYXVsdF9kb20gPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpb21tdS0+ZGVmYXVsdF9kb20tPmRvbWFpbi5mbGFncyB8PSBQRF9ERUZBVUxUX01BU0s7CisJCXJldCA9IGlvbW11X2luaXRfdW5pdHlfbWFwcGluZ3MoaW9tbXUpOworCQlpZiAocmV0KQorCQkJZ290byBmcmVlX2RvbWFpbnM7CisJfQorCisJLyoKKwkgKiBQcmUtYWxsb2NhdGUgdGhlIHByb3RlY3Rpb24gZG9tYWlucyBmb3IgZWFjaCBkZXZpY2UuCisJICovCisJcHJlYWxsb2NfcHJvdGVjdGlvbl9kb21haW5zKCk7CisKKwlpb21tdV9kZXRlY3RlZCA9IDE7CisJc3dpb3RsYiA9IDA7CisKKwkvKiBNYWtlIHRoZSBkcml2ZXIgZmluYWxseSB2aXNpYmxlIHRvIHRoZSBkcml2ZXJzICovCisJdW5oYW5kbGVkID0gZGV2aWNlX2RtYV9vcHNfaW5pdCgpOworCWlmICh1bmhhbmRsZWQgJiYgbWF4X3BmbiA+IE1BWF9ETUEzMl9QRk4pIHsKKwkJLyogVGhlcmUgYXJlIHVuaGFuZGxlZCBkZXZpY2VzIC0gaW5pdGlhbGl6ZSBzd2lvdGxiIGZvciB0aGVtICovCisJCXN3aW90bGIgPSAxOworCX0KKworCWFtZF9pb21tdV9zdGF0c19pbml0KCk7CisKKwlyZXR1cm4gMDsKKworZnJlZV9kb21haW5zOgorCisJZm9yX2VhY2hfaW9tbXUoaW9tbXUpIHsKKwkJaWYgKGlvbW11LT5kZWZhdWx0X2RvbSkKKwkJCWRtYV9vcHNfZG9tYWluX2ZyZWUoaW9tbXUtPmRlZmF1bHRfZG9tKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBiZWxvbmcgdG8gdGhlIGV4cG9ydGVkIGludGVyZmFjZSBvZiBBTUQgSU9NTVUKKyAqCisgKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgYWNjZXNzIHRvIGxvd2VyIGxldmVsIGZ1bmN0aW9ucyBvZiB0aGUgSU9NTVUKKyAqIGxpa2UgcHJvdGVjdGlvbiBkb21haW4gaGFuZGxpbmcgYW5kIGFzc2lnbmVtZW50IG9mIGRldmljZXMgdG8gZG9tYWlucworICogd2hpY2ggaXMgbm90IHBvc3NpYmxlIHdpdGggdGhlIGRtYV9vcHMgaW50ZXJmYWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgY2xlYW51cF9kb21haW4oc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCit7CisJc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YSwgKm5leHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmYW1kX2lvbW11X2RldnRhYmxlX2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXZfZGF0YSwgbmV4dCwgJmRvbWFpbi0+ZGV2X2xpc3QsIGxpc3QpIHsKKwkJX19kZXRhY2hfZGV2aWNlKGRldl9kYXRhKTsKKwkJYXRvbWljX3NldCgmZGV2X2RhdGEtPmJpbmQsIDApOworCX0KKworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZhbWRfaW9tbXVfZGV2dGFibGVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwcm90ZWN0aW9uX2RvbWFpbl9mcmVlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluKQoreworCWlmICghZG9tYWluKQorCQlyZXR1cm47CisKKwlkZWxfZG9tYWluX2Zyb21fbGlzdChkb21haW4pOworCisJaWYgKGRvbWFpbi0+aWQpCisJCWRvbWFpbl9pZF9mcmVlKGRvbWFpbi0+aWQpOworCisJa2ZyZWUoZG9tYWluKTsKK30KKworc3RhdGljIHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqcHJvdGVjdGlvbl9kb21haW5fYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbjsKKworCWRvbWFpbiA9IGt6YWxsb2Moc2l6ZW9mKCpkb21haW4pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRvbWFpbikKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaW5pdCgmZG9tYWluLT5sb2NrKTsKKwltdXRleF9pbml0KCZkb21haW4tPmFwaV9sb2NrKTsKKwlkb21haW4tPmlkID0gZG9tYWluX2lkX2FsbG9jKCk7CisJaWYgKCFkb21haW4tPmlkKQorCQlnb3RvIG91dF9lcnI7CisJSU5JVF9MSVNUX0hFQUQoJmRvbWFpbi0+ZGV2X2xpc3QpOworCisJYWRkX2RvbWFpbl90b19saXN0KGRvbWFpbik7CisKKwlyZXR1cm4gZG9tYWluOworCitvdXRfZXJyOgorCWtmcmVlKGRvbWFpbik7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBhbWRfaW9tbXVfZG9tYWluX2luaXQoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tKQoreworCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluOworCisJZG9tYWluID0gcHJvdGVjdGlvbl9kb21haW5fYWxsb2MoKTsKKwlpZiAoIWRvbWFpbikKKwkJZ290byBvdXRfZnJlZTsKKworCWRvbWFpbi0+bW9kZSAgICA9IFBBR0VfTU9ERV8zX0xFVkVMOworCWRvbWFpbi0+cHRfcm9vdCA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghZG9tYWluLT5wdF9yb290KQorCQlnb3RvIG91dF9mcmVlOworCisJZG9tLT5wcml2ID0gZG9tYWluOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCXByb3RlY3Rpb25fZG9tYWluX2ZyZWUoZG9tYWluKTsKKworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBhbWRfaW9tbXVfZG9tYWluX2Rlc3Ryb3koc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tKQoreworCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluID0gZG9tLT5wcml2OworCisJaWYgKCFkb21haW4pCisJCXJldHVybjsKKworCWlmIChkb21haW4tPmRldl9jbnQgPiAwKQorCQljbGVhbnVwX2RvbWFpbihkb21haW4pOworCisJQlVHX09OKGRvbWFpbi0+ZGV2X2NudCAhPSAwKTsKKworCWZyZWVfcGFnZXRhYmxlKGRvbWFpbik7CisKKwlwcm90ZWN0aW9uX2RvbWFpbl9mcmVlKGRvbWFpbik7CisKKwlkb20tPnByaXYgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBhbWRfaW9tbXVfZGV0YWNoX2RldmljZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb20sCisJCQkJICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKKwl1MTYgZGV2aWQ7CisKKwlpZiAoIWNoZWNrX2RldmljZShkZXYpKQorCQlyZXR1cm47CisKKwlkZXZpZCA9IGdldF9kZXZpY2VfaWQoZGV2KTsKKworCWlmIChkZXZfZGF0YS0+ZG9tYWluICE9IE5VTEwpCisJCWRldGFjaF9kZXZpY2UoZGV2KTsKKworCWlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOworCWlmICghaW9tbXUpCisJCXJldHVybjsKKworCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2lvbW11X2F0dGFjaF9kZXZpY2Uoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tLAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbiA9IGRvbS0+cHJpdjsKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhOworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OworCWludCByZXQ7CisKKwlpZiAoIWNoZWNrX2RldmljZShkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9kYXRhID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKKworCWlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2X2RhdGEtPmRldmlkXTsKKwlpZiAoIWlvbW11KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkZXZfZGF0YS0+ZG9tYWluKQorCQlkZXRhY2hfZGV2aWNlKGRldik7CisKKwlyZXQgPSBhdHRhY2hfZGV2aWNlKGRldiwgZG9tYWluKTsKKworCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtZF9pb21tdV9tYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tLCB1bnNpZ25lZCBsb25nIGlvdmEsCisJCQkgcGh5c19hZGRyX3QgcGFkZHIsIGludCBnZnBfb3JkZXIsIGludCBpb21tdV9wcm90KQoreworCXVuc2lnbmVkIGxvbmcgcGFnZV9zaXplID0gMHgxMDAwVUwgPDwgZ2ZwX29yZGVyOworCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluID0gZG9tLT5wcml2OworCWludCBwcm90ID0gMDsKKwlpbnQgcmV0OworCisJaWYgKGlvbW11X3Byb3QgJiBJT01NVV9SRUFEKQorCQlwcm90IHw9IElPTU1VX1BST1RfSVI7CisJaWYgKGlvbW11X3Byb3QgJiBJT01NVV9XUklURSkKKwkJcHJvdCB8PSBJT01NVV9QUk9UX0lXOworCisJbXV0ZXhfbG9jaygmZG9tYWluLT5hcGlfbG9jayk7CisJcmV0ID0gaW9tbXVfbWFwX3BhZ2UoZG9tYWluLCBpb3ZhLCBwYWRkciwgcHJvdCwgcGFnZV9zaXplKTsKKwltdXRleF91bmxvY2soJmRvbWFpbi0+YXBpX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbWRfaW9tbXVfdW5tYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tLCB1bnNpZ25lZCBsb25nIGlvdmEsCisJCQkgICBpbnQgZ2ZwX29yZGVyKQoreworCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluID0gZG9tLT5wcml2OworCXVuc2lnbmVkIGxvbmcgcGFnZV9zaXplLCB1bm1hcF9zaXplOworCisJcGFnZV9zaXplICA9IDB4MTAwMFVMIDw8IGdmcF9vcmRlcjsKKworCW11dGV4X2xvY2soJmRvbWFpbi0+YXBpX2xvY2spOworCXVubWFwX3NpemUgPSBpb21tdV91bm1hcF9wYWdlKGRvbWFpbiwgaW92YSwgcGFnZV9zaXplKTsKKwltdXRleF91bmxvY2soJmRvbWFpbi0+YXBpX2xvY2spOworCisJZG9tYWluX2ZsdXNoX3RsYl9wZGUoZG9tYWluKTsKKworCXJldHVybiBnZXRfb3JkZXIodW5tYXBfc2l6ZSk7Cit9CisKK3N0YXRpYyBwaHlzX2FkZHJfdCBhbWRfaW9tbXVfaW92YV90b19waHlzKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbSwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGlvdmEpCit7CisJc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4gPSBkb20tPnByaXY7CisJdW5zaWduZWQgbG9uZyBvZmZzZXRfbWFzazsKKwlwaHlzX2FkZHJfdCBwYWRkcjsKKwl1NjQgKnB0ZSwgX19wdGU7CisKKwlwdGUgPSBmZXRjaF9wdGUoZG9tYWluLCBpb3ZhKTsKKworCWlmICghcHRlIHx8ICFJT01NVV9QVEVfUFJFU0VOVCgqcHRlKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoUE1fUFRFX0xFVkVMKCpwdGUpID09IDApCisJCW9mZnNldF9tYXNrID0gUEFHRV9TSVpFIC0gMTsKKwllbHNlCisJCW9mZnNldF9tYXNrID0gUFRFX1BBR0VfU0laRSgqcHRlKSAtIDE7CisKKwlfX3B0ZSA9ICpwdGUgJiBQTV9BRERSX01BU0s7CisJcGFkZHIgPSAoX19wdGUgJiB+b2Zmc2V0X21hc2spIHwgKGlvdmEgJiBvZmZzZXRfbWFzayk7CisKKwlyZXR1cm4gcGFkZHI7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2lvbW11X2RvbWFpbl9oYXNfY2FwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBjYXApCit7CisJc3dpdGNoIChjYXApIHsKKwljYXNlIElPTU1VX0NBUF9DQUNIRV9DT0hFUkVOQ1k6CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlvbW11X29wcyBhbWRfaW9tbXVfb3BzID0geworCS5kb21haW5faW5pdCA9IGFtZF9pb21tdV9kb21haW5faW5pdCwKKwkuZG9tYWluX2Rlc3Ryb3kgPSBhbWRfaW9tbXVfZG9tYWluX2Rlc3Ryb3ksCisJLmF0dGFjaF9kZXYgPSBhbWRfaW9tbXVfYXR0YWNoX2RldmljZSwKKwkuZGV0YWNoX2RldiA9IGFtZF9pb21tdV9kZXRhY2hfZGV2aWNlLAorCS5tYXAgPSBhbWRfaW9tbXVfbWFwLAorCS51bm1hcCA9IGFtZF9pb21tdV91bm1hcCwKKwkuaW92YV90b19waHlzID0gYW1kX2lvbW11X2lvdmFfdG9fcGh5cywKKwkuZG9tYWluX2hhc19jYXAgPSBhbWRfaW9tbXVfZG9tYWluX2hhc19jYXAsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgbmV4dCBmdW5jdGlvbnMgZG8gYSBiYXNpYyBpbml0aWFsaXphdGlvbiBvZiBJT01NVSBmb3IgcGFzcyB0aHJvdWdoCisgKiBtb2RlCisgKgorICogSW4gcGFzc3Rocm91Z2ggbW9kZSB0aGUgSU9NTVUgaXMgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgYnV0IG5vdCB1c2VkIGZvcgorICogRE1BLUFQSSB0cmFuc2xhdGlvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBfX2luaXQgYW1kX2lvbW11X2luaXRfcGFzc3Rocm91Z2godm9pZCkKK3sKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwl1MTYgZGV2aWQ7CisKKwkvKiBhbGxvY2F0ZSBwYXNzdGhyb3VnaCBkb21haW4gKi8KKwlwdF9kb21haW4gPSBwcm90ZWN0aW9uX2RvbWFpbl9hbGxvYygpOworCWlmICghcHRfZG9tYWluKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXB0X2RvbWFpbi0+bW9kZSB8PSBQQUdFX01PREVfTk9ORTsKKworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CisJCWlmICghY2hlY2tfZGV2aWNlKCZkZXYtPmRldikpCisJCQljb250aW51ZTsKKworCQlkZXZpZCA9IGdldF9kZXZpY2VfaWQoJmRldi0+ZGV2KTsKKworCQlpb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2RldmlkXTsKKwkJaWYgKCFpb21tdSkKKwkJCWNvbnRpbnVlOworCisJCWF0dGFjaF9kZXZpY2UoJmRldi0+ZGV2LCBwdF9kb21haW4pOworCX0KKworCXByX2luZm8oIkFNRC1WaTogSW5pdGlhbGl6ZWQgZm9yIFBhc3N0aHJvdWdoIE1vZGVcbiIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV9pbml0LmMgYi9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkMjQxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X2luaXQuYwpAQCAtMCwwICsxLDE1NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBBdXRob3I6IEpvZXJnIFJvZWRlbCA8am9lcmcucm9lZGVsQGFtZC5jb20+CisgKiAgICAgICAgIExlbyBEdXJhbiA8bGVvLmR1cmFuQGFtZC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjaW5jbHVkZSA8bGludXgvYW1kLWlvbW11Lmg+CisjaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vZ2FydC5oPgorI2luY2x1ZGUgPGFzbS94ODZfaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pb21tdV90YWJsZS5oPgorCisjaW5jbHVkZSAiYW1kX2lvbW11X3Byb3RvLmgiCisjaW5jbHVkZSAiYW1kX2lvbW11X3R5cGVzLmgiCisKKy8qCisgKiBkZWZpbml0aW9ucyBmb3IgdGhlIEFDUEkgc2Nhbm5pbmcgY29kZQorICovCisjZGVmaW5lIElWUlNfSEVBREVSX0xFTkdUSCA0OAorCisjZGVmaW5lIEFDUElfSVZIRF9UWVBFICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBBQ1BJX0lWTURfVFlQRV9BTEwgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQUNQSV9JVk1EX1RZUEUgICAgICAgICAgICAgICAgICAweDIxCisjZGVmaW5lIEFDUElfSVZNRF9UWVBFX1JBTkdFICAgICAgICAgICAgMHgyMgorCisjZGVmaW5lIElWSERfREVWX0FMTCAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBJVkhEX0RFVl9TRUxFQ1QgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSVZIRF9ERVZfU0VMRUNUX1JBTkdFX1NUQVJUICAgICAweDAzCisjZGVmaW5lIElWSERfREVWX1JBTkdFX0VORCAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBJVkhEX0RFVl9BTElBUyAgICAgICAgICAgICAgICAgIDB4NDIKKyNkZWZpbmUgSVZIRF9ERVZfQUxJQVNfUkFOR0UgICAgICAgICAgICAweDQzCisjZGVmaW5lIElWSERfREVWX0VYVF9TRUxFQ1QgICAgICAgICAgICAgMHg0NgorI2RlZmluZSBJVkhEX0RFVl9FWFRfU0VMRUNUX1JBTkdFICAgICAgIDB4NDcKKworI2RlZmluZSBJVkhEX0ZMQUdfSFRfVFVOX0VOX01BU0sgICAgICAgIDB4MDEKKyNkZWZpbmUgSVZIRF9GTEFHX1BBU1NQV19FTl9NQVNLICAgICAgICAweDAyCisjZGVmaW5lIElWSERfRkxBR19SRVNQQVNTUFdfRU5fTUFTSyAgICAgMHgwNAorI2RlZmluZSBJVkhEX0ZMQUdfSVNPQ19FTl9NQVNLICAgICAgICAgIDB4MDgKKworI2RlZmluZSBJVk1EX0ZMQUdfRVhDTF9SQU5HRSAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgSVZNRF9GTEFHX1VOSVRZX01BUCAgICAgICAgICAgICAweDAxCisKKyNkZWZpbmUgQUNQSV9ERVZGTEFHX0lOSVRQQVNTICAgICAgICAgICAweDAxCisjZGVmaW5lIEFDUElfREVWRkxBR19FWFRJTlQgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBBQ1BJX0RFVkZMQUdfTk1JICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQUNQSV9ERVZGTEFHX1NZU01HVDEgICAgICAgICAgICAweDEwCisjZGVmaW5lIEFDUElfREVWRkxBR19TWVNNR1QyICAgICAgICAgICAgMHgyMAorI2RlZmluZSBBQ1BJX0RFVkZMQUdfTElOVDAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQUNQSV9ERVZGTEFHX0xJTlQxICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEFDUElfREVWRkxBR19BVFNESVMgICAgICAgICAgICAgMHgxMDAwMDAwMAorCisvKgorICogQUNQSSB0YWJsZSBkZWZpbml0aW9ucworICoKKyAqIFRoZXNlIGRhdGEgc3RydWN0dXJlcyBhcmUgbGFpZCBvdmVyIHRoZSB0YWJsZSB0byBwYXJzZSB0aGUgaW1wb3J0YW50IHZhbHVlcworICogb3V0IG9mIGl0LgorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBvbmUgSU9NTVUgaW4gdGhlIEFDUEkgdGFibGUuIFR5cGljYWxseSBmb2xsb3dlZCBieSBvbmUKKyAqIG9yIG1vcmUgaXZoZF9lbnRyeXMuCisgKi8KK3N0cnVjdCBpdmhkX2hlYWRlciB7CisJdTggdHlwZTsKKwl1OCBmbGFnczsKKwl1MTYgbGVuZ3RoOworCXUxNiBkZXZpZDsKKwl1MTYgY2FwX3B0cjsKKwl1NjQgbW1pb19waHlzOworCXUxNiBwY2lfc2VnOworCXUxNiBpbmZvOworCXUzMiByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qCisgKiBBIGRldmljZSBlbnRyeSBkZXNjcmliaW5nIHdoaWNoIGRldmljZXMgYSBzcGVjaWZpYyBJT01NVSB0cmFuc2xhdGVzIGFuZAorICogd2hpY2ggcmVxdWVzdG9yIGlkcyB0aGV5IHVzZS4KKyAqLworc3RydWN0IGl2aGRfZW50cnkgeworCXU4IHR5cGU7CisJdTE2IGRldmlkOworCXU4IGZsYWdzOworCXUzMiBleHQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKgorICogQW4gQU1EIElPTU1VIG1lbW9yeSBkZWZpbml0aW9uIHN0cnVjdHVyZS4gSXQgZGVmaW5lcyB0aGluZ3MgbGlrZSBleGNsdXNpb24KKyAqIHJhbmdlcyBmb3IgZGV2aWNlcyBhbmQgcmVnaW9ucyB0aGF0IHNob3VsZCBiZSB1bml0eSBtYXBwZWQuCisgKi8KK3N0cnVjdCBpdm1kX2hlYWRlciB7CisJdTggdHlwZTsKKwl1OCBmbGFnczsKKwl1MTYgbGVuZ3RoOworCXUxNiBkZXZpZDsKKwl1MTYgYXV4OworCXU2NCByZXN2OworCXU2NCByYW5nZV9zdGFydDsKKwl1NjQgcmFuZ2VfbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworYm9vbCBhbWRfaW9tbXVfZHVtcDsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGFtZF9pb21tdV9kZXRlY3RlZDsKK3N0YXRpYyBib29sIF9faW5pdGRhdGEgYW1kX2lvbW11X2Rpc2FibGVkOworCit1MTYgYW1kX2lvbW11X2xhc3RfYmRmOwkJCS8qIGxhcmdlc3QgUENJIGRldmljZSBpZCB3ZSBoYXZlCisJCQkJCSAgIHRvIGhhbmRsZSAqLworTElTVF9IRUFEKGFtZF9pb21tdV91bml0eV9tYXApOwkJLyogYSBsaXN0IG9mIHJlcXVpcmVkIHVuaXR5IG1hcHBpbmdzCisJCQkJCSAgIHdlIGZpbmQgaW4gQUNQSSAqLworYm9vbCBhbWRfaW9tbXVfdW5tYXBfZmx1c2g7CQkvKiBpZiB0cnVlLCBmbHVzaCBvbiBldmVyeSB1bm1hcCAqLworCitMSVNUX0hFQUQoYW1kX2lvbW11X2xpc3QpOwkJLyogbGlzdCBvZiBhbGwgQU1EIElPTU1VcyBpbiB0aGUKKwkJCQkJICAgc3lzdGVtICovCisKKy8qIEFycmF5IHRvIGFzc2lnbiBpbmRpY2VzIHRvIElPTU1VcyovCitzdHJ1Y3QgYW1kX2lvbW11ICphbWRfaW9tbXVzW01BWF9JT01NVVNdOworaW50IGFtZF9pb21tdXNfcHJlc2VudDsKKworLyogSU9NTVVzIGhhdmUgYSBub24tcHJlc2VudCBjYWNoZT8gKi8KK2Jvb2wgYW1kX2lvbW11X25wX2NhY2hlIF9fcmVhZF9tb3N0bHk7Citib29sIGFtZF9pb21tdV9pb3RsYl9zdXAgX19yZWFkX21vc3RseSA9IHRydWU7CisKKy8qCisgKiBUaGUgQUNQSSB0YWJsZSBwYXJzaW5nIGZ1bmN0aW9ucyBzZXQgdGhpcyB2YXJpYWJsZSBvbiBhbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgYW1kX2lvbW11X2luaXRfZXJyOworCisvKgorICogTGlzdCBvZiBwcm90ZWN0aW9uIGRvbWFpbnMgLSB1c2VkIGR1cmluZyByZXN1bWUKKyAqLworTElTVF9IRUFEKGFtZF9pb21tdV9wZF9saXN0KTsKK3NwaW5sb2NrX3QgYW1kX2lvbW11X3BkX2xvY2s7CisKKy8qCisgKiBQb2ludGVyIHRvIHRoZSBkZXZpY2UgdGFibGUgd2hpY2ggaXMgc2hhcmVkIGJ5IGFsbCBBTUQgSU9NTVVzCisgKiBpdCBpcyBpbmRleGVkIGJ5IHRoZSBQQ0kgZGV2aWNlIGlkIG9yIHRoZSBIVCB1bml0IGlkIGFuZCBjb250YWlucworICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRvbWFpbiB0aGUgZGV2aWNlIGJlbG9uZ3MgdG8gYXMgd2VsbCBhcyB0aGUKKyAqIHBhZ2UgdGFibGUgcm9vdCBwb2ludGVyLgorICovCitzdHJ1Y3QgZGV2X3RhYmxlX2VudHJ5ICphbWRfaW9tbXVfZGV2X3RhYmxlOworCisvKgorICogVGhlIGFsaWFzIHRhYmxlIGlzIGEgZHJpdmVyIHNwZWNpZmljIGRhdGEgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIHRoZQorICogbWFwcGluZ3Mgb2YgdGhlIFBDSSBkZXZpY2UgaWRzIHRvIHRoZSBhY3R1YWwgcmVxdWVzdG9yIGlkcyBvbiB0aGUgSU9NTVUuCisgKiBNb3JlIHRoYW4gb25lIGRldmljZSBjYW4gc2hhcmUgdGhlIHNhbWUgcmVxdWVzdG9yIGlkLgorICovCit1MTYgKmFtZF9pb21tdV9hbGlhc190YWJsZTsKKworLyoKKyAqIFRoZSBybG9va3VwIHRhYmxlIGlzIHVzZWQgdG8gZmluZCB0aGUgSU9NTVUgd2hpY2ggaXMgcmVzcG9uc2libGUKKyAqIGZvciBhIHNwZWNpZmljIGRldmljZS4gSXQgaXMgYWxzbyBpbmRleGVkIGJ5IHRoZSBQQ0kgZGV2aWNlIGlkLgorICovCitzdHJ1Y3QgYW1kX2lvbW11ICoqYW1kX2lvbW11X3Jsb29rdXBfdGFibGU7CisKKy8qCisgKiBBTUQgSU9NTVUgYWxsb3dzIHVwIHRvIDJeMTYgZGlmZmVyZW5kIHByb3RlY3Rpb24gZG9tYWlucy4gVGhpcyBpcyBhIGJpdG1hcAorICogdG8ga25vdyB3aGljaCBvbmVzIGFyZSBhbHJlYWR5IGluIHVzZS4KKyAqLwordW5zaWduZWQgbG9uZyAqYW1kX2lvbW11X3BkX2FsbG9jX2JpdG1hcDsKKworc3RhdGljIHUzMiBkZXZfdGFibGVfc2l6ZTsJLyogc2l6ZSBvZiB0aGUgZGV2aWNlIHRhYmxlICovCitzdGF0aWMgdTMyIGFsaWFzX3RhYmxlX3NpemU7CS8qIHNpemUgb2YgdGhlIGFsaWFzIHRhYmxlICovCitzdGF0aWMgdTMyIHJsb29rdXBfdGFibGVfc2l6ZTsJLyogc2l6ZSBpZiB0aGUgcmxvb2t1cCB0YWJsZSAqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBmbHVzaGVzIGFsbCBpbnRlcm5hbCBjYWNoZXMgb2YKKyAqIHRoZSBJT01NVSB1c2VkIGJ5IHRoaXMgZHJpdmVyLgorICovCitleHRlcm4gdm9pZCBpb21tdV9mbHVzaF9hbGxfY2FjaGVzKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KTsKKworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9sYXN0X2RldmlkKHUxNiBkZXZpZCkKK3sKKwlpZiAoZGV2aWQgPiBhbWRfaW9tbXVfbGFzdF9iZGYpCisJCWFtZF9pb21tdV9sYXN0X2JkZiA9IGRldmlkOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGJsX3NpemUoaW50IGVudHJ5X3NpemUpCit7CisJdW5zaWduZWQgc2hpZnQgPSBQQUdFX1NISUZUICsKKwkJCSBnZXRfb3JkZXIoKChpbnQpYW1kX2lvbW11X2xhc3RfYmRmICsgMSkgKiBlbnRyeV9zaXplKTsKKworCXJldHVybiAxVUwgPDwgc2hpZnQ7Cit9CisKKy8qIEFjY2VzcyB0byBsMSBhbmQgbDIgaW5kZXhlZCByZWdpc3RlciBzcGFjZXMgKi8KKworc3RhdGljIHUzMiBpb21tdV9yZWFkX2wxKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCB1MTYgbDEsIHU4IGFkZHJlc3MpCit7CisJdTMyIHZhbDsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgMHhmOCwgKGFkZHJlc3MgfCBsMSA8PCAxNikpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpb21tdS0+ZGV2LCAweGZjLCAmdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBpb21tdV93cml0ZV9sMShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTE2IGwxLCB1OCBhZGRyZXNzLCB1MzIgdmFsKQoreworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgMHhmOCwgKGFkZHJlc3MgfCBsMSA8PCAxNiB8IDEgPDwgMzEpKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIDB4ZmMsIHZhbCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChpb21tdS0+ZGV2LCAweGY4LCAoYWRkcmVzcyB8IGwxIDw8IDE2KSk7Cit9CisKK3N0YXRpYyB1MzIgaW9tbXVfcmVhZF9sMihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTggYWRkcmVzcykKK3sKKwl1MzIgdmFsOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChpb21tdS0+ZGV2LCAweGYwLCBhZGRyZXNzKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgMHhmNCwgJnZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfd3JpdGVfbDIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHU4IGFkZHJlc3MsIHUzMiB2YWwpCit7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChpb21tdS0+ZGV2LCAweGYwLCAoYWRkcmVzcyB8IDEgPDwgOCkpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgMHhmNCwgdmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBTUQgSU9NTVUgTU1JTyByZWdpc3RlciBzcGFjZSBoYW5kbGluZyBmdW5jdGlvbnMKKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gcHJvZ3JhbSB0aGUgSU9NTVUgZGV2aWNlIHJlZ2lzdGVycyBpbgorICogTU1JTyBzcGFjZSByZXF1aXJlZCBmb3IgdGhhdCBkcml2ZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgZXhjbHVzaW9uIHJhbmdlIGluIHRoZSBJT01NVS4gRE1BIGFjY2Vzc2VzIHRvIHRoZQorICogZXhjbHVzaW9uIHJhbmdlIGFyZSBwYXNzZWQgdGhyb3VnaCB1bnRyYW5zbGF0ZWQKKyAqLworc3RhdGljIHZvaWQgaW9tbXVfc2V0X2V4Y2x1c2lvbl9yYW5nZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwl1NjQgc3RhcnQgPSBpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ICYgUEFHRV9NQVNLOworCXU2NCBsaW1pdCA9IChzdGFydCArIGlvbW11LT5leGNsdXNpb25fbGVuZ3RoKSAmIFBBR0VfTUFTSzsKKwl1NjQgZW50cnk7CisKKwlpZiAoIWlvbW11LT5leGNsdXNpb25fc3RhcnQpCisJCXJldHVybjsKKworCWVudHJ5ID0gc3RhcnQgfCBNTUlPX0VYQ0xfRU5BQkxFX01BU0s7CisJbWVtY3B5X3RvaW8oaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fRVhDTF9CQVNFX09GRlNFVCwKKwkJCSZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7CisKKwllbnRyeSA9IGxpbWl0OworCW1lbWNweV90b2lvKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0VYQ0xfTElNSVRfT0ZGU0VULAorCQkJJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKK30KKworLyogUHJvZ3JhbXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGRldmljZSB0YWJsZSBpbnRvIHRoZSBJT01NVSBoYXJkd2FyZSAqLworc3RhdGljIHZvaWQgX19pbml0IGlvbW11X3NldF9kZXZpY2VfdGFibGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJdTY0IGVudHJ5OworCisJQlVHX09OKGlvbW11LT5tbWlvX2Jhc2UgPT0gTlVMTCk7CisKKwllbnRyeSA9IHZpcnRfdG9fcGh5cyhhbWRfaW9tbXVfZGV2X3RhYmxlKTsKKwllbnRyeSB8PSAoZGV2X3RhYmxlX3NpemUgPj4gMTIpIC0gMTsKKwltZW1jcHlfdG9pbyhpb21tdS0+bW1pb19iYXNlICsgTU1JT19ERVZfVEFCTEVfT0ZGU0VULAorCQkJJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKK30KKworLyogR2VuZXJpYyBmdW5jdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUgY2VydGFpbiBmZWF0dXJlcyBvZiB0aGUgSU9NTVUuICovCitzdGF0aWMgdm9pZCBpb21tdV9mZWF0dXJlX2VuYWJsZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTggYml0KQoreworCXUzMiBjdHJsOworCisJY3RybCA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NPTlRST0xfT0ZGU0VUKTsKKwljdHJsIHw9ICgxIDw8IGJpdCk7CisJd3JpdGVsKGN0cmwsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NPTlRST0xfT0ZGU0VUKTsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfZmVhdHVyZV9kaXNhYmxlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCB1OCBiaXQpCit7CisJdTMyIGN0cmw7CisKKwljdHJsID0gcmVhZGwoaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fQ09OVFJPTF9PRkZTRVQpOworCWN0cmwgJj0gfigxIDw8IGJpdCk7CisJd3JpdGVsKGN0cmwsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NPTlRST0xfT0ZGU0VUKTsKK30KKworLyogRnVuY3Rpb24gdG8gZW5hYmxlIHRoZSBoYXJkd2FyZSAqLworc3RhdGljIHZvaWQgaW9tbXVfZW5hYmxlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZmVhdF9zdHJbXSA9IHsKKwkJIlByZUYiLCAiUFBSIiwgIlgyQVBJQyIsICJOWCIsICJHVCIsICJbNV0iLAorCQkiSUEiLCAiR0EiLCAiSEUiLCAiUEMiLCBOVUxMCisJfTsKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX0lORk8gIkFNRC1WaTogRW5hYmxpbmcgSU9NTVUgYXQgJXMgY2FwIDB4JWh4IiwKKwkgICAgICAgZGV2X25hbWUoJmlvbW11LT5kZXYtPmRldiksIGlvbW11LT5jYXBfcHRyKTsKKworCWlmIChpb21tdS0+Y2FwICYgKDEgPDwgSU9NTVVfQ0FQX0VGUikpIHsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiIGV4dGVuZGVkIGZlYXR1cmVzOiAiKTsKKwkJZm9yIChpID0gMDsgZmVhdF9zdHJbaV07ICsraSkKKwkJCWlmIChpb21tdV9mZWF0dXJlKGlvbW11LCAoMVVMTCA8PCBpKSkpCisJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICVzIiwgZmVhdF9zdHJbaV0pOworCX0KKwlwcmludGsoS0VSTl9DT05UICJcbiIpOworCisJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfSU9NTVVfRU4pOworfQorCitzdGF0aWMgdm9pZCBpb21tdV9kaXNhYmxlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCS8qIERpc2FibGUgY29tbWFuZCBidWZmZXIgKi8KKwlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfQ01EQlVGX0VOKTsKKworCS8qIERpc2FibGUgZXZlbnQgbG9nZ2luZyBhbmQgZXZlbnQgaW50ZXJydXB0cyAqLworCWlvbW11X2ZlYXR1cmVfZGlzYWJsZShpb21tdSwgQ09OVFJPTF9FVlRfSU5UX0VOKTsKKwlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfRVZUX0xPR19FTik7CisKKwkvKiBEaXNhYmxlIElPTU1VIGhhcmR3YXJlIGl0c2VsZiAqLworCWlvbW11X2ZlYXR1cmVfZGlzYWJsZShpb21tdSwgQ09OVFJPTF9JT01NVV9FTik7Cit9CisKKy8qCisgKiBtYXBwaW5nIGFuZCB1bm1hcHBpbmcgZnVuY3Rpb25zIGZvciB0aGUgSU9NTVUgTU1JTyBzcGFjZS4gRWFjaCBBTUQgSU9NTVUgaW4KKyAqIHRoZSBzeXN0ZW0gaGFzIG9uZS4KKyAqLworc3RhdGljIHU4ICogX19pbml0IGlvbW11X21hcF9tbWlvX3NwYWNlKHU2NCBhZGRyZXNzKQoreworCXU4ICpyZXQ7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhZGRyZXNzLCBNTUlPX1JFR0lPTl9MRU5HVEgsICJhbWRfaW9tbXUiKSkgeworCQlwcl9lcnIoIkFNRC1WaTogQ2FuIG5vdCByZXNlcnZlIG1lbW9yeSByZWdpb24gJWxseCBmb3IgbW1pb1xuIiwKKwkJCWFkZHJlc3MpOworCQlwcl9lcnIoIkFNRC1WaTogVGhpcyBpcyBhIEJJT1MgYnVnLiBQbGVhc2UgY29udGFjdCB5b3VyIGhhcmR3YXJlIHZlbmRvclxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldCA9IGlvcmVtYXBfbm9jYWNoZShhZGRyZXNzLCBNTUlPX1JFR0lPTl9MRU5HVEgpOworCWlmIChyZXQgIT0gTlVMTCkKKwkJcmV0dXJuIHJldDsKKworCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyZXNzLCBNTUlPX1JFR0lPTl9MRU5HVEgpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpb21tdV91bm1hcF9tbWlvX3NwYWNlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCWlmIChpb21tdS0+bW1pb19iYXNlKQorCQlpb3VubWFwKGlvbW11LT5tbWlvX2Jhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihpb21tdS0+bW1pb19waHlzLCBNTUlPX1JFR0lPTl9MRU5HVEgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBmdW5jdGlvbnMgYmVsb3cgYmVsb25nIHRvIHRoZSBmaXJzdCBwYXNzIG9mIEFNRCBJT01NVSBBQ1BJIHRhYmxlCisgKiBwYXJzaW5nLiBJbiB0aGlzIHBhc3Mgd2UgdHJ5IHRvIGZpbmQgb3V0IHRoZSBoaWdoZXN0IGRldmljZSBpZCB0aGlzCisgKiBjb2RlIGhhcyB0byBoYW5kbGUuIFVwb24gdGhpcyBpbmZvcm1hdGlvbiB0aGUgc2l6ZSBvZiB0aGUgc2hhcmVkIGRhdGEKKyAqIHN0cnVjdHVyZXMgaXMgZGV0ZXJtaW5lZCBsYXRlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgZ2l2ZW4gSVZIRCBlbnRyeQorICovCitzdGF0aWMgaW5saW5lIGludCBpdmhkX2VudHJ5X2xlbmd0aCh1OCAqaXZoZCkKK3sKKwlyZXR1cm4gMHgwNCA8PCAoKml2aGQgPj4gNik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBsYXN0IGRldmljZSBpZCB0aGUgSU9NTVUgaGFzIHRvIGhhbmRsZSBmcm9tIHRoZSBQQ0kKKyAqIGNhcGFiaWxpdHkgaGVhZGVyIGZvciB0aGlzIElPTU1VCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGZpbmRfbGFzdF9kZXZpZF9vbl9wY2koaW50IGJ1cywgaW50IGRldiwgaW50IGZuLCBpbnQgY2FwX3B0cikKK3sKKwl1MzIgY2FwOworCisJY2FwID0gcmVhZF9wY2lfY29uZmlnKGJ1cywgZGV2LCBmbiwgY2FwX3B0citNTUlPX1JBTkdFX09GRlNFVCk7CisJdXBkYXRlX2xhc3RfZGV2aWQoY2FsY19kZXZpZChNTUlPX0dFVF9CVVMoY2FwKSwgTU1JT19HRVRfTEQoY2FwKSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZnRlciByZWFkaW5nIHRoZSBoaWdoZXN0IGRldmljZSBpZCBmcm9tIHRoZSBJT01NVSBQQ0kgY2FwYWJpbGl0eSBoZWFkZXIKKyAqIHRoaXMgZnVuY3Rpb24gbG9va3MgaWYgdGhlcmUgaXMgYSBoaWdoZXIgZGV2aWNlIGlkIGRlZmluZWQgaW4gdGhlIEFDUEkgdGFibGUKKyAqLworc3RhdGljIGludCBfX2luaXQgZmluZF9sYXN0X2RldmlkX2Zyb21faXZoZChzdHJ1Y3QgaXZoZF9oZWFkZXIgKmgpCit7CisJdTggKnAgPSAodm9pZCAqKWgsICplbmQgPSAodm9pZCAqKWg7CisJc3RydWN0IGl2aGRfZW50cnkgKmRldjsKKworCXAgKz0gc2l6ZW9mKCpoKTsKKwllbmQgKz0gaC0+bGVuZ3RoOworCisJZmluZF9sYXN0X2RldmlkX29uX3BjaShQQ0lfQlVTKGgtPmRldmlkKSwKKwkJCVBDSV9TTE9UKGgtPmRldmlkKSwKKwkJCVBDSV9GVU5DKGgtPmRldmlkKSwKKwkJCWgtPmNhcF9wdHIpOworCisJd2hpbGUgKHAgPCBlbmQpIHsKKwkJZGV2ID0gKHN0cnVjdCBpdmhkX2VudHJ5ICopcDsKKwkJc3dpdGNoIChkZXYtPnR5cGUpIHsKKwkJY2FzZSBJVkhEX0RFVl9TRUxFQ1Q6CisJCWNhc2UgSVZIRF9ERVZfUkFOR0VfRU5EOgorCQljYXNlIElWSERfREVWX0FMSUFTOgorCQljYXNlIElWSERfREVWX0VYVF9TRUxFQ1Q6CisJCQkvKiBhbGwgdGhlIGFib3ZlIHN1YmZpZWxkIHR5cGVzIHJlZmVyIHRvIGRldmljZSBpZHMgKi8KKwkJCXVwZGF0ZV9sYXN0X2RldmlkKGRldi0+ZGV2aWQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlwICs9IGl2aGRfZW50cnlfbGVuZ3RoKHApOworCX0KKworCVdBUk5fT04ocCAhPSBlbmQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJdGVyYXRlIG92ZXIgYWxsIElWSEQgZW50cmllcyBpbiB0aGUgQUNQSSB0YWJsZSBhbmQgZmluZCB0aGUgaGlnaGVzdCBkZXZpY2UKKyAqIGlkIHdoaWNoIHdlIG5lZWQgdG8gaGFuZGxlLiBUaGlzIGlzIHRoZSBmaXJzdCBvZiB0aHJlZSBmdW5jdGlvbnMgd2hpY2ggcGFyc2UKKyAqIHRoZSBBQ1BJIHRhYmxlLiBTbyB3ZSBjaGVjayB0aGUgY2hlY2tzdW0gaGVyZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgZmluZF9sYXN0X2RldmlkX2FjcGkoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSkKK3sKKwlpbnQgaTsKKwl1OCBjaGVja3N1bSA9IDAsICpwID0gKHU4ICopdGFibGUsICplbmQgPSAodTggKil0YWJsZTsKKwlzdHJ1Y3QgaXZoZF9oZWFkZXIgKmg7CisKKwkvKgorCSAqIFZhbGlkYXRlIGNoZWNrc3VtIGhlcmUgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBpdCB3aGVuCisJICogd2UgYWN0dWFsbHkgcGFyc2UgdGhlIHRhYmxlCisJICovCisJZm9yIChpID0gMDsgaSA8IHRhYmxlLT5sZW5ndGg7ICsraSkKKwkJY2hlY2tzdW0gKz0gcFtpXTsKKwlpZiAoY2hlY2tzdW0gIT0gMCkgeworCQkvKiBBQ1BJIHRhYmxlIGNvcnJ1cHQgKi8KKwkJYW1kX2lvbW11X2luaXRfZXJyID0gLUVOT0RFVjsKKwkJcmV0dXJuIDA7CisJfQorCisJcCArPSBJVlJTX0hFQURFUl9MRU5HVEg7CisKKwllbmQgKz0gdGFibGUtPmxlbmd0aDsKKwl3aGlsZSAocCA8IGVuZCkgeworCQloID0gKHN0cnVjdCBpdmhkX2hlYWRlciAqKXA7CisJCXN3aXRjaCAoaC0+dHlwZSkgeworCQljYXNlIEFDUElfSVZIRF9UWVBFOgorCQkJZmluZF9sYXN0X2RldmlkX2Zyb21faXZoZChoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcCArPSBoLT5sZW5ndGg7CisJfQorCVdBUk5fT04ocCAhPSBlbmQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYmVsb25nIHRoZSB0aGUgY29kZSBwYXRoIHdoaWNoIHBhcnNlcyB0aGUgQUNQSSB0YWJsZQorICogdGhlIHNlY29uZCB0aW1lLiBJbiB0aGlzIEFDUEkgcGFyc2luZyBpdGVyYXRpb24gd2UgYWxsb2NhdGUgSU9NTVUgc3BlY2lmaWMKKyAqIGRhdGEgc3RydWN0dXJlcywgaW5pdGlhbGl6ZSB0aGUgZGV2aWNlL2FsaWFzL3Jsb29rdXAgdGFibGUgYW5kIGFsc28KKyAqIGJhc2ljYWxseSBpbml0aWFsaXplIHRoZSBoYXJkd2FyZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEFsbG9jYXRlcyB0aGUgY29tbWFuZCBidWZmZXIuIFRoaXMgYnVmZmVyIGlzIHBlciBBTUQgSU9NTVUuIFdlIGNhbgorICogd3JpdGUgY29tbWFuZHMgdG8gdGhhdCBidWZmZXIgbGF0ZXIgYW5kIHRoZSBJT01NVSB3aWxsIGV4ZWN1dGUgdGhlbQorICogYXN5bmNocm9ub3VzbHkKKyAqLworc3RhdGljIHU4ICogX19pbml0IGFsbG9jX2NvbW1hbmRfYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCXU4ICpjbWRfYnVmID0gKHU4ICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywKKwkJCWdldF9vcmRlcihDTURfQlVGRkVSX1NJWkUpKTsKKworCWlmIChjbWRfYnVmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaW9tbXUtPmNtZF9idWZfc2l6ZSA9IENNRF9CVUZGRVJfU0laRSB8IENNRF9CVUZGRVJfVU5JTklUSUFMSVpFRDsKKworCXJldHVybiBjbWRfYnVmOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGNvbW1hbmQgYnVmZmVyIGlmIHRoZSBJT01NVSBzdG9wcGVkIGZldGNoaW5nCisgKiBjb21tYW5kcyBmcm9tIGl0LgorICovCit2b2lkIGFtZF9pb21tdV9yZXNldF9jbWRfYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCWlvbW11X2ZlYXR1cmVfZGlzYWJsZShpb21tdSwgQ09OVFJPTF9DTURCVUZfRU4pOworCisJd3JpdGVsKDB4MDAsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9IRUFEX09GRlNFVCk7CisJd3JpdGVsKDB4MDAsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9UQUlMX09GRlNFVCk7CisKKwlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9DTURCVUZfRU4pOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGNvbW1hbmQgYnVmZmVyIGFkZHJlc3MgdG8gdGhlIGhhcmR3YXJlIGFuZAorICogZW5hYmxlcyBpdC4KKyAqLworc3RhdGljIHZvaWQgaW9tbXVfZW5hYmxlX2NvbW1hbmRfYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCXU2NCBlbnRyeTsKKworCUJVR19PTihpb21tdS0+Y21kX2J1ZiA9PSBOVUxMKTsKKworCWVudHJ5ID0gKHU2NCl2aXJ0X3RvX3BoeXMoaW9tbXUtPmNtZF9idWYpOworCWVudHJ5IHw9IE1NSU9fQ01EX1NJWkVfNTEyOworCisJbWVtY3B5X3RvaW8oaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fQ01EX0JVRl9PRkZTRVQsCisJCSAgICAmZW50cnksIHNpemVvZihlbnRyeSkpOworCisJYW1kX2lvbW11X3Jlc2V0X2NtZF9idWZmZXIoaW9tbXUpOworCWlvbW11LT5jbWRfYnVmX3NpemUgJj0gfihDTURfQlVGRkVSX1VOSU5JVElBTElaRUQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZnJlZV9jb21tYW5kX2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWlvbW11LT5jbWRfYnVmLAorCQkgICBnZXRfb3JkZXIoaW9tbXUtPmNtZF9idWZfc2l6ZSAmIH4oQ01EX0JVRkZFUl9VTklOSVRJQUxJWkVEKSkpOworfQorCisvKiBhbGxvY2F0ZXMgdGhlIG1lbW9yeSB3aGVyZSB0aGUgSU9NTVUgd2lsbCBsb2cgaXRzIGV2ZW50cyB0byAqLworc3RhdGljIHU4ICogX19pbml0IGFsbG9jX2V2ZW50X2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwlpb21tdS0+ZXZ0X2J1ZiA9ICh1OCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCisJCQkJCQlnZXRfb3JkZXIoRVZUX0JVRkZFUl9TSVpFKSk7CisKKwlpZiAoaW9tbXUtPmV2dF9idWYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpb21tdS0+ZXZ0X2J1Zl9zaXplID0gRVZUX0JVRkZFUl9TSVpFOworCisJcmV0dXJuIGlvbW11LT5ldnRfYnVmOworfQorCitzdGF0aWMgdm9pZCBpb21tdV9lbmFibGVfZXZlbnRfYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCXU2NCBlbnRyeTsKKworCUJVR19PTihpb21tdS0+ZXZ0X2J1ZiA9PSBOVUxMKTsKKworCWVudHJ5ID0gKHU2NCl2aXJ0X3RvX3BoeXMoaW9tbXUtPmV2dF9idWYpIHwgRVZUX0xFTl9NQVNLOworCisJbWVtY3B5X3RvaW8oaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fRVZUX0JVRl9PRkZTRVQsCisJCSAgICAmZW50cnksIHNpemVvZihlbnRyeSkpOworCisJLyogc2V0IGhlYWQgYW5kIHRhaWwgdG8gemVybyBtYW51YWxseSAqLworCXdyaXRlbCgweDAwLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19FVlRfSEVBRF9PRkZTRVQpOworCXdyaXRlbCgweDAwLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19FVlRfVEFJTF9PRkZTRVQpOworCisJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfRVZUX0xPR19FTik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBmcmVlX2V2ZW50X2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWlvbW11LT5ldnRfYnVmLCBnZXRfb3JkZXIoRVZUX0JVRkZFUl9TSVpFKSk7Cit9CisKKy8qIHNldHMgYSBzcGVjaWZpYyBiaXQgaW4gdGhlIGRldmljZSB0YWJsZSBlbnRyeS4gKi8KK3N0YXRpYyB2b2lkIHNldF9kZXZfZW50cnlfYml0KHUxNiBkZXZpZCwgdTggYml0KQoreworCWludCBpID0gKGJpdCA+PiA1KSAmIDB4MDc7CisJaW50IF9iaXQgPSBiaXQgJiAweDFmOworCisJYW1kX2lvbW11X2Rldl90YWJsZVtkZXZpZF0uZGF0YVtpXSB8PSAoMSA8PCBfYml0KTsKK30KKworc3RhdGljIGludCBnZXRfZGV2X2VudHJ5X2JpdCh1MTYgZGV2aWQsIHU4IGJpdCkKK3sKKwlpbnQgaSA9IChiaXQgPj4gNSkgJiAweDA3OworCWludCBfYml0ID0gYml0ICYgMHgxZjsKKworCXJldHVybiAoYW1kX2lvbW11X2Rldl90YWJsZVtkZXZpZF0uZGF0YVtpXSAmICgxIDw8IF9iaXQpKSA+PiBfYml0OworfQorCisKK3ZvaWQgYW1kX2lvbW11X2FwcGx5X2VycmF0dW1fNjModTE2IGRldmlkKQoreworCWludCBzeXNtZ3Q7CisKKwlzeXNtZ3QgPSBnZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX1NZU01HVDEpIHwKKwkJIChnZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX1NZU01HVDIpIDw8IDEpOworCisJaWYgKHN5c21ndCA9PSAweDAxKQorCQlzZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX0lXKTsKK30KKworLyogV3JpdGVzIHRoZSBzcGVjaWZpYyBJT01NVSBmb3IgYSBkZXZpY2UgaW50byB0aGUgcmxvb2t1cCB0YWJsZSAqLworc3RhdGljIHZvaWQgX19pbml0IHNldF9pb21tdV9mb3JfZGV2aWNlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCB1MTYgZGV2aWQpCit7CisJYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdID0gaW9tbXU7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBkZXZpY2Ugc3BlY2lmaWMgZmxhZ3MgcmVhZCBmcm9tIHRoZSBBQ1BJCisgKiB0YWJsZSBhbmQgc2V0cyB1cCB0aGUgZGV2aWNlIHRhYmxlIGVudHJ5IHdpdGggdGhhdCBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X2Rldl9lbnRyeV9mcm9tX2FjcGkoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsCisJCQkJCSAgIHUxNiBkZXZpZCwgdTMyIGZsYWdzLCB1MzIgZXh0X2ZsYWdzKQoreworCWlmIChmbGFncyAmIEFDUElfREVWRkxBR19JTklUUEFTUykKKwkJc2V0X2Rldl9lbnRyeV9iaXQoZGV2aWQsIERFVl9FTlRSWV9JTklUX1BBU1MpOworCWlmIChmbGFncyAmIEFDUElfREVWRkxBR19FWFRJTlQpCisJCXNldF9kZXZfZW50cnlfYml0KGRldmlkLCBERVZfRU5UUllfRUlOVF9QQVNTKTsKKwlpZiAoZmxhZ3MgJiBBQ1BJX0RFVkZMQUdfTk1JKQorCQlzZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX05NSV9QQVNTKTsKKwlpZiAoZmxhZ3MgJiBBQ1BJX0RFVkZMQUdfU1lTTUdUMSkKKwkJc2V0X2Rldl9lbnRyeV9iaXQoZGV2aWQsIERFVl9FTlRSWV9TWVNNR1QxKTsKKwlpZiAoZmxhZ3MgJiBBQ1BJX0RFVkZMQUdfU1lTTUdUMikKKwkJc2V0X2Rldl9lbnRyeV9iaXQoZGV2aWQsIERFVl9FTlRSWV9TWVNNR1QyKTsKKwlpZiAoZmxhZ3MgJiBBQ1BJX0RFVkZMQUdfTElOVDApCisJCXNldF9kZXZfZW50cnlfYml0KGRldmlkLCBERVZfRU5UUllfTElOVDBfUEFTUyk7CisJaWYgKGZsYWdzICYgQUNQSV9ERVZGTEFHX0xJTlQxKQorCQlzZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX0xJTlQxX1BBU1MpOworCisJYW1kX2lvbW11X2FwcGx5X2VycmF0dW1fNjMoZGV2aWQpOworCisJc2V0X2lvbW11X2Zvcl9kZXZpY2UoaW9tbXUsIGRldmlkKTsKK30KKworLyoKKyAqIFJlYWRzIHRoZSBkZXZpY2UgZXhjbHVzaW9uIHJhbmdlIGZyb20gQUNQSSBhbmQgaW5pdGlhbGl6ZSBJT01NVSB3aXRoCisgKiBpdAorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X2RldmljZV9leGNsdXNpb25fcmFuZ2UodTE2IGRldmlkLCBzdHJ1Y3QgaXZtZF9oZWFkZXIgKm0pCit7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXUgPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtkZXZpZF07CisKKwlpZiAoIShtLT5mbGFncyAmIElWTURfRkxBR19FWENMX1JBTkdFKSkKKwkJcmV0dXJuOworCisJaWYgKGlvbW11KSB7CisJCS8qCisJCSAqIFdlIG9ubHkgY2FuIGNvbmZpZ3VyZSBleGNsdXNpb24gcmFuZ2VzIHBlciBJT01NVSwgbm90CisJCSAqIHBlciBkZXZpY2UuIEJ1dCB3ZSBjYW4gZW5hYmxlIHRoZSBleGNsdXNpb24gcmFuZ2UgcGVyCisJCSAqIGRldmljZS4gVGhpcyBpcyBkb25lIGhlcmUKKwkJICovCisJCXNldF9kZXZfZW50cnlfYml0KG0tPmRldmlkLCBERVZfRU5UUllfRVgpOworCQlpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ID0gbS0+cmFuZ2Vfc3RhcnQ7CisJCWlvbW11LT5leGNsdXNpb25fbGVuZ3RoID0gbS0+cmFuZ2VfbGVuZ3RoOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgc29tZSBpbXBvcnRhbnQgZGF0YSBmcm9tIHRoZSBJT01NVSBQQ0kgc3BhY2UgYW5kCisgKiBpbml0aWFsaXplcyB0aGUgZHJpdmVyIGRhdGEgc3RydWN0dXJlIHdpdGggaXQuIEl0IHJlYWRzIHRoZSBoYXJkd2FyZQorICogY2FwYWJpbGl0aWVzIGFuZCB0aGUgZmlyc3QvbGFzdCBkZXZpY2UgZW50cmllcworICovCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9pb21tdV9mcm9tX3BjaShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwlpbnQgY2FwX3B0ciA9IGlvbW11LT5jYXBfcHRyOworCXUzMiByYW5nZSwgbWlzYywgbG93LCBoaWdoOworCWludCBpLCBqOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIGNhcF9wdHIgKyBNTUlPX0NBUF9IRFJfT0ZGU0VULAorCQkJICAgICAgJmlvbW11LT5jYXApOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpb21tdS0+ZGV2LCBjYXBfcHRyICsgTU1JT19SQU5HRV9PRkZTRVQsCisJCQkgICAgICAmcmFuZ2UpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpb21tdS0+ZGV2LCBjYXBfcHRyICsgTU1JT19NSVNDX09GRlNFVCwKKwkJCSAgICAgICZtaXNjKTsKKworCWlvbW11LT5maXJzdF9kZXZpY2UgPSBjYWxjX2RldmlkKE1NSU9fR0VUX0JVUyhyYW5nZSksCisJCQkJCSBNTUlPX0dFVF9GRChyYW5nZSkpOworCWlvbW11LT5sYXN0X2RldmljZSA9IGNhbGNfZGV2aWQoTU1JT19HRVRfQlVTKHJhbmdlKSwKKwkJCQkJTU1JT19HRVRfTEQocmFuZ2UpKTsKKwlpb21tdS0+ZXZ0X21zaV9udW0gPSBNTUlPX01TSV9OVU0obWlzYyk7CisKKwlpZiAoIShpb21tdS0+Y2FwICYgKDEgPDwgSU9NTVVfQ0FQX0lPVExCKSkpCisJCWFtZF9pb21tdV9pb3RsYl9zdXAgPSBmYWxzZTsKKworCS8qIHJlYWQgZXh0ZW5kZWQgZmVhdHVyZSBiaXRzICovCisJbG93ICA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0VYVF9GRUFUVVJFUyk7CisJaGlnaCA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0VYVF9GRUFUVVJFUyArIDQpOworCisJaW9tbXUtPmZlYXR1cmVzID0gKCh1NjQpaGlnaCA8PCAzMikgfCBsb3c7CisKKwlpZiAoIWlzX3JkODkwX2lvbW11KGlvbW11LT5kZXYpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFNvbWUgcmQ4OTAgc3lzdGVtcyBtYXkgbm90IGJlIGZ1bGx5IHJlY29uZmlndXJlZCBieSB0aGUgQklPUywgc28KKwkgKiBpdCdzIG5lY2Vzc2FyeSBmb3IgdXMgdG8gc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBzbyBpdCBjYW4gYmUKKwkgKiByZXByb2dyYW1tZWQgb24gcmVzdW1lCisJICovCisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgaW9tbXUtPmNhcF9wdHIgKyA0LAorCQkJICAgICAgJmlvbW11LT5zdG9yZWRfYWRkcl9sbyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIGlvbW11LT5jYXBfcHRyICsgOCwKKwkJCSAgICAgICZpb21tdS0+c3RvcmVkX2FkZHJfaGkpOworCisJLyogTG93IGJpdCBsb2NrcyB3cml0ZXMgdG8gY29uZmlndXJhdGlvbiBzcGFjZSAqLworCWlvbW11LT5zdG9yZWRfYWRkcl9sbyAmPSB+MTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWZvciAoaiA9IDA7IGogPCAweDEyOyBqKyspCisJCQlpb21tdS0+c3RvcmVkX2wxW2ldW2pdID0gaW9tbXVfcmVhZF9sMShpb21tdSwgaSwgaik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMHg4MzsgaSsrKQorCQlpb21tdS0+c3RvcmVkX2wyW2ldID0gaW9tbXVfcmVhZF9sMihpb21tdSwgaSk7Cit9CisKKy8qCisgKiBUYWtlcyBhIHBvaW50ZXIgdG8gYW4gQU1EIElPTU1VIGVudHJ5IGluIHRoZSBBQ1BJIHRhYmxlIGFuZAorICogaW5pdGlhbGl6ZXMgdGhlIGhhcmR3YXJlIGFuZCBvdXIgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggaXQuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2lvbW11X2Zyb21fYWNwaShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwKKwkJCQkJc3RydWN0IGl2aGRfaGVhZGVyICpoKQoreworCXU4ICpwID0gKHU4ICopaDsKKwl1OCAqZW5kID0gcCwgZmxhZ3MgPSAwOworCXUxNiBkZXZpZCA9IDAsIGRldmlkX3N0YXJ0ID0gMCwgZGV2aWRfdG8gPSAwOworCXUzMiBkZXZfaSwgZXh0X2ZsYWdzID0gMDsKKwlib29sIGFsaWFzID0gZmFsc2U7CisJc3RydWN0IGl2aGRfZW50cnkgKmU7CisKKwkvKgorCSAqIEZpcnN0IHNhdmUgdGhlIHJlY29tbWVuZGVkIGZlYXR1cmUgZW5hYmxlIGJpdHMgZnJvbSBBQ1BJCisJICovCisJaW9tbXUtPmFjcGlfZmxhZ3MgPSBoLT5mbGFnczsKKworCS8qCisJICogRG9uZS4gTm93IHBhcnNlIHRoZSBkZXZpY2UgZW50cmllcworCSAqLworCXAgKz0gc2l6ZW9mKHN0cnVjdCBpdmhkX2hlYWRlcik7CisJZW5kICs9IGgtPmxlbmd0aDsKKworCisJd2hpbGUgKHAgPCBlbmQpIHsKKwkJZSA9IChzdHJ1Y3QgaXZoZF9lbnRyeSAqKXA7CisJCXN3aXRjaCAoZS0+dHlwZSkgeworCQljYXNlIElWSERfREVWX0FMTDoKKworCQkJRFVNUF9wcmludGsoIiAgREVWX0FMTFx0XHRcdCBmaXJzdCBkZXZpZDogJTAyeDolMDJ4LiV4IgorCQkJCSAgICAiIGxhc3QgZGV2aWNlICUwMng6JTAyeC4leCBmbGFnczogJTAyeFxuIiwKKwkJCQkgICAgUENJX0JVUyhpb21tdS0+Zmlyc3RfZGV2aWNlKSwKKwkJCQkgICAgUENJX1NMT1QoaW9tbXUtPmZpcnN0X2RldmljZSksCisJCQkJICAgIFBDSV9GVU5DKGlvbW11LT5maXJzdF9kZXZpY2UpLAorCQkJCSAgICBQQ0lfQlVTKGlvbW11LT5sYXN0X2RldmljZSksCisJCQkJICAgIFBDSV9TTE9UKGlvbW11LT5sYXN0X2RldmljZSksCisJCQkJICAgIFBDSV9GVU5DKGlvbW11LT5sYXN0X2RldmljZSksCisJCQkJICAgIGUtPmZsYWdzKTsKKworCQkJZm9yIChkZXZfaSA9IGlvbW11LT5maXJzdF9kZXZpY2U7CisJCQkJCWRldl9pIDw9IGlvbW11LT5sYXN0X2RldmljZTsgKytkZXZfaSkKKwkJCQlzZXRfZGV2X2VudHJ5X2Zyb21fYWNwaShpb21tdSwgZGV2X2ksCisJCQkJCQkJZS0+ZmxhZ3MsIDApOworCQkJYnJlYWs7CisJCWNhc2UgSVZIRF9ERVZfU0VMRUNUOgorCisJCQlEVU1QX3ByaW50aygiICBERVZfU0VMRUNUXHRcdFx0IGRldmlkOiAlMDJ4OiUwMnguJXggIgorCQkJCSAgICAiZmxhZ3M6ICUwMnhcbiIsCisJCQkJICAgIFBDSV9CVVMoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfU0xPVChlLT5kZXZpZCksCisJCQkJICAgIFBDSV9GVU5DKGUtPmRldmlkKSwKKwkJCQkgICAgZS0+ZmxhZ3MpOworCisJCQlkZXZpZCA9IGUtPmRldmlkOworCQkJc2V0X2Rldl9lbnRyeV9mcm9tX2FjcGkoaW9tbXUsIGRldmlkLCBlLT5mbGFncywgMCk7CisJCQlicmVhazsKKwkJY2FzZSBJVkhEX0RFVl9TRUxFQ1RfUkFOR0VfU1RBUlQ6CisKKwkJCURVTVBfcHJpbnRrKCIgIERFVl9TRUxFQ1RfUkFOR0VfU1RBUlRcdCAiCisJCQkJICAgICJkZXZpZDogJTAyeDolMDJ4LiV4IGZsYWdzOiAlMDJ4XG4iLAorCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCisJCQkJICAgIGUtPmZsYWdzKTsKKworCQkJZGV2aWRfc3RhcnQgPSBlLT5kZXZpZDsKKwkJCWZsYWdzID0gZS0+ZmxhZ3M7CisJCQlleHRfZmxhZ3MgPSAwOworCQkJYWxpYXMgPSBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlIElWSERfREVWX0FMSUFTOgorCisJCQlEVU1QX3ByaW50aygiICBERVZfQUxJQVNcdFx0XHQgZGV2aWQ6ICUwMng6JTAyeC4leCAiCisJCQkJICAgICJmbGFnczogJTAyeCBkZXZpZF90bzogJTAyeDolMDJ4LiV4XG4iLAorCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCisJCQkJICAgIGUtPmZsYWdzLAorCQkJCSAgICBQQ0lfQlVTKGUtPmV4dCA+PiA4KSwKKwkJCQkgICAgUENJX1NMT1QoZS0+ZXh0ID4+IDgpLAorCQkJCSAgICBQQ0lfRlVOQyhlLT5leHQgPj4gOCkpOworCisJCQlkZXZpZCA9IGUtPmRldmlkOworCQkJZGV2aWRfdG8gPSBlLT5leHQgPj4gODsKKwkJCXNldF9kZXZfZW50cnlfZnJvbV9hY3BpKGlvbW11LCBkZXZpZCAgICwgZS0+ZmxhZ3MsIDApOworCQkJc2V0X2Rldl9lbnRyeV9mcm9tX2FjcGkoaW9tbXUsIGRldmlkX3RvLCBlLT5mbGFncywgMCk7CisJCQlhbWRfaW9tbXVfYWxpYXNfdGFibGVbZGV2aWRdID0gZGV2aWRfdG87CisJCQlicmVhazsKKwkJY2FzZSBJVkhEX0RFVl9BTElBU19SQU5HRToKKworCQkJRFVNUF9wcmludGsoIiAgREVWX0FMSUFTX1JBTkdFXHRcdCAiCisJCQkJICAgICJkZXZpZDogJTAyeDolMDJ4LiV4IGZsYWdzOiAlMDJ4ICIKKwkJCQkgICAgImRldmlkX3RvOiAlMDJ4OiUwMnguJXhcbiIsCisJCQkJICAgIFBDSV9CVVMoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfU0xPVChlLT5kZXZpZCksCisJCQkJICAgIFBDSV9GVU5DKGUtPmRldmlkKSwKKwkJCQkgICAgZS0+ZmxhZ3MsCisJCQkJICAgIFBDSV9CVVMoZS0+ZXh0ID4+IDgpLAorCQkJCSAgICBQQ0lfU0xPVChlLT5leHQgPj4gOCksCisJCQkJICAgIFBDSV9GVU5DKGUtPmV4dCA+PiA4KSk7CisKKwkJCWRldmlkX3N0YXJ0ID0gZS0+ZGV2aWQ7CisJCQlmbGFncyA9IGUtPmZsYWdzOworCQkJZGV2aWRfdG8gPSBlLT5leHQgPj4gODsKKwkJCWV4dF9mbGFncyA9IDA7CisJCQlhbGlhcyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBJVkhEX0RFVl9FWFRfU0VMRUNUOgorCisJCQlEVU1QX3ByaW50aygiICBERVZfRVhUX1NFTEVDVFx0XHQgZGV2aWQ6ICUwMng6JTAyeC4leCAiCisJCQkJICAgICJmbGFnczogJTAyeCBleHQ6ICUwOHhcbiIsCisJCQkJICAgIFBDSV9CVVMoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfU0xPVChlLT5kZXZpZCksCisJCQkJICAgIFBDSV9GVU5DKGUtPmRldmlkKSwKKwkJCQkgICAgZS0+ZmxhZ3MsIGUtPmV4dCk7CisKKwkJCWRldmlkID0gZS0+ZGV2aWQ7CisJCQlzZXRfZGV2X2VudHJ5X2Zyb21fYWNwaShpb21tdSwgZGV2aWQsIGUtPmZsYWdzLAorCQkJCQkJZS0+ZXh0KTsKKwkJCWJyZWFrOworCQljYXNlIElWSERfREVWX0VYVF9TRUxFQ1RfUkFOR0U6CisKKwkJCURVTVBfcHJpbnRrKCIgIERFVl9FWFRfU0VMRUNUX1JBTkdFXHQgZGV2aWQ6ICIKKwkJCQkgICAgIiUwMng6JTAyeC4leCBmbGFnczogJTAyeCBleHQ6ICUwOHhcbiIsCisJCQkJICAgIFBDSV9CVVMoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfU0xPVChlLT5kZXZpZCksCisJCQkJICAgIFBDSV9GVU5DKGUtPmRldmlkKSwKKwkJCQkgICAgZS0+ZmxhZ3MsIGUtPmV4dCk7CisKKwkJCWRldmlkX3N0YXJ0ID0gZS0+ZGV2aWQ7CisJCQlmbGFncyA9IGUtPmZsYWdzOworCQkJZXh0X2ZsYWdzID0gZS0+ZXh0OworCQkJYWxpYXMgPSBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlIElWSERfREVWX1JBTkdFX0VORDoKKworCQkJRFVNUF9wcmludGsoIiAgREVWX1JBTkdFX0VORFx0XHQgZGV2aWQ6ICUwMng6JTAyeC4leFxuIiwKKwkJCQkgICAgUENJX0JVUyhlLT5kZXZpZCksCisJCQkJICAgIFBDSV9TTE9UKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX0ZVTkMoZS0+ZGV2aWQpKTsKKworCQkJZGV2aWQgPSBlLT5kZXZpZDsKKwkJCWZvciAoZGV2X2kgPSBkZXZpZF9zdGFydDsgZGV2X2kgPD0gZGV2aWQ7ICsrZGV2X2kpIHsKKwkJCQlpZiAoYWxpYXMpIHsKKwkJCQkJYW1kX2lvbW11X2FsaWFzX3RhYmxlW2Rldl9pXSA9IGRldmlkX3RvOworCQkJCQlzZXRfZGV2X2VudHJ5X2Zyb21fYWNwaShpb21tdSwKKwkJCQkJCWRldmlkX3RvLCBmbGFncywgZXh0X2ZsYWdzKTsKKwkJCQl9CisJCQkJc2V0X2Rldl9lbnRyeV9mcm9tX2FjcGkoaW9tbXUsIGRldl9pLAorCQkJCQkJCWZsYWdzLCBleHRfZmxhZ3MpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCXAgKz0gaXZoZF9lbnRyeV9sZW5ndGgocCk7CisJfQorfQorCisvKiBJbml0aWFsaXplcyB0aGUgZGV2aWNlLT5pb21tdSBtYXBwaW5nIGZvciB0aGUgZHJpdmVyICovCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2lvbW11X2RldmljZXMoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJdTMyIGk7CisKKwlmb3IgKGkgPSBpb21tdS0+Zmlyc3RfZGV2aWNlOyBpIDw9IGlvbW11LT5sYXN0X2RldmljZTsgKytpKQorCQlzZXRfaW9tbXVfZm9yX2RldmljZShpb21tdSwgaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGZyZWVfaW9tbXVfb25lKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCWZyZWVfY29tbWFuZF9idWZmZXIoaW9tbXUpOworCWZyZWVfZXZlbnRfYnVmZmVyKGlvbW11KTsKKwlpb21tdV91bm1hcF9tbWlvX3NwYWNlKGlvbW11KTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGZyZWVfaW9tbXVfYWxsKHZvaWQpCit7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsICpuZXh0OworCisJZm9yX2VhY2hfaW9tbXVfc2FmZShpb21tdSwgbmV4dCkgeworCQlsaXN0X2RlbCgmaW9tbXUtPmxpc3QpOworCQlmcmVlX2lvbW11X29uZShpb21tdSk7CisJCWtmcmVlKGlvbW11KTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNsdWVzIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3Igb25lIElPTU1VCisgKiB0b2dldGhlciBhbmQgYWxzbyBhbGxvY2F0ZXMgdGhlIGNvbW1hbmQgYnVmZmVyIGFuZCBwcm9ncmFtcyB0aGUKKyAqIGhhcmR3YXJlLiBJdCBkb2VzIE5PVCBlbmFibGUgdGhlIElPTU1VLiBUaGlzIGlzIGRvbmUgYWZ0ZXJ3YXJkcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgaW5pdF9pb21tdV9vbmUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHN0cnVjdCBpdmhkX2hlYWRlciAqaCkKK3sKKwlzcGluX2xvY2tfaW5pdCgmaW9tbXUtPmxvY2spOworCisJLyogQWRkIElPTU1VIHRvIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLworCWxpc3RfYWRkX3RhaWwoJmlvbW11LT5saXN0LCAmYW1kX2lvbW11X2xpc3QpOworCWlvbW11LT5pbmRleCAgICAgICAgICAgICA9IGFtZF9pb21tdXNfcHJlc2VudCsrOworCisJaWYgKHVubGlrZWx5KGlvbW11LT5pbmRleCA+PSBNQVhfSU9NTVVTKSkgeworCQlXQVJOKDEsICJBTUQtVmk6IFN5c3RlbSBoYXMgbW9yZSBJT01NVXMgdGhhbiBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwkvKiBJbmRleCBpcyBmaW5lIC0gYWRkIElPTU1VIHRvIHRoZSBhcnJheSAqLworCWFtZF9pb21tdXNbaW9tbXUtPmluZGV4XSA9IGlvbW11OworCisJLyoKKwkgKiBDb3B5IGRhdGEgZnJvbSBBQ1BJIHRhYmxlIGVudHJ5IHRvIHRoZSBpb21tdSBzdHJ1Y3QKKwkgKi8KKwlpb21tdS0+ZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoUENJX0JVUyhoLT5kZXZpZCksIGgtPmRldmlkICYgMHhmZik7CisJaWYgKCFpb21tdS0+ZGV2KQorCQlyZXR1cm4gMTsKKworCWlvbW11LT5jYXBfcHRyID0gaC0+Y2FwX3B0cjsKKwlpb21tdS0+cGNpX3NlZyA9IGgtPnBjaV9zZWc7CisJaW9tbXUtPm1taW9fcGh5cyA9IGgtPm1taW9fcGh5czsKKwlpb21tdS0+bW1pb19iYXNlID0gaW9tbXVfbWFwX21taW9fc3BhY2UoaC0+bW1pb19waHlzKTsKKwlpZiAoIWlvbW11LT5tbWlvX2Jhc2UpCisJCXJldHVybiAtRU5PTUVNOworCisJaW9tbXUtPmNtZF9idWYgPSBhbGxvY19jb21tYW5kX2J1ZmZlcihpb21tdSk7CisJaWYgKCFpb21tdS0+Y21kX2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpb21tdS0+ZXZ0X2J1ZiA9IGFsbG9jX2V2ZW50X2J1ZmZlcihpb21tdSk7CisJaWYgKCFpb21tdS0+ZXZ0X2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpb21tdS0+aW50X2VuYWJsZWQgPSBmYWxzZTsKKworCWluaXRfaW9tbXVfZnJvbV9wY2koaW9tbXUpOworCWluaXRfaW9tbXVfZnJvbV9hY3BpKGlvbW11LCBoKTsKKwlpbml0X2lvbW11X2RldmljZXMoaW9tbXUpOworCisJaWYgKGlvbW11LT5jYXAgJiAoMVVMIDw8IElPTU1VX0NBUF9OUENBQ0hFKSkKKwkJYW1kX2lvbW11X25wX2NhY2hlID0gdHJ1ZTsKKworCXJldHVybiBwY2lfZW5hYmxlX2RldmljZShpb21tdS0+ZGV2KTsKK30KKworLyoKKyAqIEl0ZXJhdGVzIG92ZXIgYWxsIElPTU1VIGVudHJpZXMgaW4gdGhlIEFDUEkgdGFibGUsIGFsbG9jYXRlcyB0aGUKKyAqIElPTU1VIHN0cnVjdHVyZSBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCBpbml0X2lvbW11X29uZSgpCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaW9tbXVfYWxsKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCit7CisJdTggKnAgPSAodTggKil0YWJsZSwgKmVuZCA9ICh1OCAqKXRhYmxlOworCXN0cnVjdCBpdmhkX2hlYWRlciAqaDsKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKKwlpbnQgcmV0OworCisJZW5kICs9IHRhYmxlLT5sZW5ndGg7CisJcCArPSBJVlJTX0hFQURFUl9MRU5HVEg7CisKKwl3aGlsZSAocCA8IGVuZCkgeworCQloID0gKHN0cnVjdCBpdmhkX2hlYWRlciAqKXA7CisJCXN3aXRjaCAoKnApIHsKKwkJY2FzZSBBQ1BJX0lWSERfVFlQRToKKworCQkJRFVNUF9wcmludGsoImRldmljZTogJTAyeDolMDJ4LiUwMXggY2FwOiAlMDR4ICIKKwkJCQkgICAgInNlZzogJWQgZmxhZ3M6ICUwMXggaW5mbyAlMDR4XG4iLAorCQkJCSAgICBQQ0lfQlVTKGgtPmRldmlkKSwgUENJX1NMT1QoaC0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfRlVOQyhoLT5kZXZpZCksIGgtPmNhcF9wdHIsCisJCQkJICAgIGgtPnBjaV9zZWcsIGgtPmZsYWdzLCBoLT5pbmZvKTsKKwkJCURVTVBfcHJpbnRrKCIgICAgICAgbW1pby1hZGRyOiAlMDE2bGx4XG4iLAorCQkJCSAgICBoLT5tbWlvX3BoeXMpOworCisJCQlpb21tdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbWRfaW9tbXUpLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChpb21tdSA9PSBOVUxMKSB7CisJCQkJYW1kX2lvbW11X2luaXRfZXJyID0gLUVOT01FTTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJcmV0ID0gaW5pdF9pb21tdV9vbmUoaW9tbXUsIGgpOworCQkJaWYgKHJldCkgeworCQkJCWFtZF9pb21tdV9pbml0X2VyciA9IHJldDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcCArPSBoLT5sZW5ndGg7CisKKwl9CisJV0FSTl9PTihwICE9IGVuZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpbml0aWFsaXplIHRoZSBNU0kgaW50ZXJydXB0cyBmb3IgYWxsIElPTU1VcworICogaW4gdGhlIHN5c3RlbS4gSXRzIGEgYml0IGNoYWxsZW5naW5nIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUKKyAqIElPTU1VcyBwZXIgUENJIEJERiBidXQgd2UgY2FuIGNhbGwgcGNpX2VuYWJsZV9tc2koeCkgb25seSBvbmNlIHBlcgorICogcGNpX2Rldi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBpb21tdV9zZXR1cF9tc2koc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJaW50IHI7CisKKwlpZiAocGNpX2VuYWJsZV9tc2koaW9tbXUtPmRldikpCisJCXJldHVybiAxOworCisJciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGlvbW11LT5kZXYtPmlycSwKKwkJCQkgYW1kX2lvbW11X2ludF9oYW5kbGVyLAorCQkJCSBhbWRfaW9tbXVfaW50X3RocmVhZCwKKwkJCQkgMCwgIkFNRC1WaSIsCisJCQkJIGlvbW11LT5kZXYpOworCisJaWYgKHIpIHsKKwkJcGNpX2Rpc2FibGVfbXNpKGlvbW11LT5kZXYpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpb21tdS0+aW50X2VuYWJsZWQgPSB0cnVlOworCWlvbW11X2ZlYXR1cmVfZW5hYmxlKGlvbW11LCBDT05UUk9MX0VWVF9JTlRfRU4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9tbXVfaW5pdF9tc2koc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJaWYgKGlvbW11LT5pbnRfZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShpb21tdS0+ZGV2LCBQQ0lfQ0FQX0lEX01TSSkpCisJCXJldHVybiBpb21tdV9zZXR1cF9tc2koaW9tbXUpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG5leHQgZnVuY3Rpb25zIGJlbG9uZyB0byB0aGUgdGhpcmQgcGFzcyBvZiBwYXJzaW5nIHRoZSBBQ1BJCisgKiB0YWJsZS4gSW4gdGhpcyBsYXN0IHBhc3MgdGhlIG1lbW9yeSBtYXBwaW5nIHJlcXVpcmVtZW50cyBhcmUKKyAqIGdhdGhlcmVkIChsaWtlIGV4Y2x1c2lvbiBhbmQgdW5pdHkgbWFwcGluZyByZWFuZ2VzKS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgX19pbml0IGZyZWVfdW5pdHlfbWFwcyh2b2lkKQoreworCXN0cnVjdCB1bml0eV9tYXBfZW50cnkgKmVudHJ5LCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbmV4dCwgJmFtZF9pb21tdV91bml0eV9tYXAsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwkJa2ZyZWUoZW50cnkpOworCX0KK30KKworLyogY2FsbGVkIHdoZW4gd2UgZmluZCBhbiBleGNsdXNpb24gcmFuZ2UgZGVmaW5pdGlvbiBpbiBBQ1BJICovCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2V4Y2x1c2lvbl9yYW5nZShzdHJ1Y3QgaXZtZF9oZWFkZXIgKm0pCit7CisJaW50IGk7CisKKwlzd2l0Y2ggKG0tPnR5cGUpIHsKKwljYXNlIEFDUElfSVZNRF9UWVBFOgorCQlzZXRfZGV2aWNlX2V4Y2x1c2lvbl9yYW5nZShtLT5kZXZpZCwgbSk7CisJCWJyZWFrOworCWNhc2UgQUNQSV9JVk1EX1RZUEVfQUxMOgorCQlmb3IgKGkgPSAwOyBpIDw9IGFtZF9pb21tdV9sYXN0X2JkZjsgKytpKQorCQkJc2V0X2RldmljZV9leGNsdXNpb25fcmFuZ2UoaSwgbSk7CisJCWJyZWFrOworCWNhc2UgQUNQSV9JVk1EX1RZUEVfUkFOR0U6CisJCWZvciAoaSA9IG0tPmRldmlkOyBpIDw9IG0tPmF1eDsgKytpKQorCQkJc2V0X2RldmljZV9leGNsdXNpb25fcmFuZ2UoaSwgbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBjYWxsZWQgZm9yIHVuaXR5IG1hcCBBQ1BJIGRlZmluaXRpb24gKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdW5pdHlfbWFwX3JhbmdlKHN0cnVjdCBpdm1kX2hlYWRlciAqbSkKK3sKKwlzdHJ1Y3QgdW5pdHlfbWFwX2VudHJ5ICplID0gMDsKKwljaGFyICpzOworCisJZSA9IGt6YWxsb2Moc2l6ZW9mKCplKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzd2l0Y2ggKG0tPnR5cGUpIHsKKwlkZWZhdWx0OgorCQlrZnJlZShlKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBBQ1BJX0lWTURfVFlQRToKKwkJcyA9ICJJVk1EX1RZUEVpXHRcdFx0IjsKKwkJZS0+ZGV2aWRfc3RhcnQgPSBlLT5kZXZpZF9lbmQgPSBtLT5kZXZpZDsKKwkJYnJlYWs7CisJY2FzZSBBQ1BJX0lWTURfVFlQRV9BTEw6CisJCXMgPSAiSVZNRF9UWVBFX0FMTFx0XHQiOworCQllLT5kZXZpZF9zdGFydCA9IDA7CisJCWUtPmRldmlkX2VuZCA9IGFtZF9pb21tdV9sYXN0X2JkZjsKKwkJYnJlYWs7CisJY2FzZSBBQ1BJX0lWTURfVFlQRV9SQU5HRToKKwkJcyA9ICJJVk1EX1RZUEVfUkFOR0VcdFx0IjsKKwkJZS0+ZGV2aWRfc3RhcnQgPSBtLT5kZXZpZDsKKwkJZS0+ZGV2aWRfZW5kID0gbS0+YXV4OworCQlicmVhazsKKwl9CisJZS0+YWRkcmVzc19zdGFydCA9IFBBR0VfQUxJR04obS0+cmFuZ2Vfc3RhcnQpOworCWUtPmFkZHJlc3NfZW5kID0gZS0+YWRkcmVzc19zdGFydCArIFBBR0VfQUxJR04obS0+cmFuZ2VfbGVuZ3RoKTsKKwllLT5wcm90ID0gbS0+ZmxhZ3MgPj4gMTsKKworCURVTVBfcHJpbnRrKCIlcyBkZXZpZF9zdGFydDogJTAyeDolMDJ4LiV4IGRldmlkX2VuZDogJTAyeDolMDJ4LiV4IgorCQkgICAgIiByYW5nZV9zdGFydDogJTAxNmxseCByYW5nZV9lbmQ6ICUwMTZsbHggZmxhZ3M6ICV4XG4iLCBzLAorCQkgICAgUENJX0JVUyhlLT5kZXZpZF9zdGFydCksIFBDSV9TTE9UKGUtPmRldmlkX3N0YXJ0KSwKKwkJICAgIFBDSV9GVU5DKGUtPmRldmlkX3N0YXJ0KSwgUENJX0JVUyhlLT5kZXZpZF9lbmQpLAorCQkgICAgUENJX1NMT1QoZS0+ZGV2aWRfZW5kKSwgUENJX0ZVTkMoZS0+ZGV2aWRfZW5kKSwKKwkJICAgIGUtPmFkZHJlc3Nfc3RhcnQsIGUtPmFkZHJlc3NfZW5kLCBtLT5mbGFncyk7CisKKwlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmYW1kX2lvbW11X3VuaXR5X21hcCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogaXRlcmF0ZXMgb3ZlciBhbGwgbWVtb3J5IGRlZmluaXRpb25zIHdlIGZpbmQgaW4gdGhlIEFDUEkgdGFibGUgKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbWVtb3J5X2RlZmluaXRpb25zKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCit7CisJdTggKnAgPSAodTggKil0YWJsZSwgKmVuZCA9ICh1OCAqKXRhYmxlOworCXN0cnVjdCBpdm1kX2hlYWRlciAqbTsKKworCWVuZCArPSB0YWJsZS0+bGVuZ3RoOworCXAgKz0gSVZSU19IRUFERVJfTEVOR1RIOworCisJd2hpbGUgKHAgPCBlbmQpIHsKKwkJbSA9IChzdHJ1Y3QgaXZtZF9oZWFkZXIgKilwOworCQlpZiAobS0+ZmxhZ3MgJiBJVk1EX0ZMQUdfRVhDTF9SQU5HRSkKKwkJCWluaXRfZXhjbHVzaW9uX3JhbmdlKG0pOworCQllbHNlIGlmIChtLT5mbGFncyAmIElWTURfRkxBR19VTklUWV9NQVApCisJCQlpbml0X3VuaXR5X21hcF9yYW5nZShtKTsKKworCQlwICs9IG0tPmxlbmd0aDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXQgdGhlIGRldmljZSB0YWJsZSB0byBub3QgYWxsb3cgRE1BIGFjY2VzcyBmb3IgZGV2aWNlcyBhbmQKKyAqIHN1cHByZXNzIGFsbCBwYWdlIGZhdWx0cworICovCitzdGF0aWMgdm9pZCBpbml0X2RldmljZV90YWJsZSh2b2lkKQoreworCXUzMiBkZXZpZDsKKworCWZvciAoZGV2aWQgPSAwOyBkZXZpZCA8PSBhbWRfaW9tbXVfbGFzdF9iZGY7ICsrZGV2aWQpIHsKKwkJc2V0X2Rldl9lbnRyeV9iaXQoZGV2aWQsIERFVl9FTlRSWV9WQUxJRCk7CisJCXNldF9kZXZfZW50cnlfYml0KGRldmlkLCBERVZfRU5UUllfVFJBTlNMQVRJT04pOworCX0KK30KKworc3RhdGljIHZvaWQgaW9tbXVfaW5pdF9mbGFncyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwlpb21tdS0+YWNwaV9mbGFncyAmIElWSERfRkxBR19IVF9UVU5fRU5fTUFTSyA/CisJCWlvbW11X2ZlYXR1cmVfZW5hYmxlKGlvbW11LCBDT05UUk9MX0hUX1RVTl9FTikgOgorCQlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfSFRfVFVOX0VOKTsKKworCWlvbW11LT5hY3BpX2ZsYWdzICYgSVZIRF9GTEFHX1BBU1NQV19FTl9NQVNLID8KKwkJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfUEFTU1BXX0VOKSA6CisJCWlvbW11X2ZlYXR1cmVfZGlzYWJsZShpb21tdSwgQ09OVFJPTF9QQVNTUFdfRU4pOworCisJaW9tbXUtPmFjcGlfZmxhZ3MgJiBJVkhEX0ZMQUdfUkVTUEFTU1BXX0VOX01BU0sgPworCQlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9SRVNQQVNTUFdfRU4pIDoKKwkJaW9tbXVfZmVhdHVyZV9kaXNhYmxlKGlvbW11LCBDT05UUk9MX1JFU1BBU1NQV19FTik7CisKKwlpb21tdS0+YWNwaV9mbGFncyAmIElWSERfRkxBR19JU09DX0VOX01BU0sgPworCQlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9JU09DX0VOKSA6CisJCWlvbW11X2ZlYXR1cmVfZGlzYWJsZShpb21tdSwgQ09OVFJPTF9JU09DX0VOKTsKKworCS8qCisJICogbWFrZSBJT01NVSBtZW1vcnkgYWNjZXNzZXMgY2FjaGUgY29oZXJlbnQKKwkgKi8KKwlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9DT0hFUkVOVF9FTik7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X2FwcGx5X3Jlc3VtZV9xdWlya3Moc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJaW50IGksIGo7CisJdTMyIGlvY19mZWF0dXJlX2NvbnRyb2w7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCisJLyogUkQ4OTAgQklPU2VzIG1heSBub3QgaGF2ZSBjb21wbGV0ZWx5IHJlY29uZmlndXJlZCB0aGUgaW9tbXUgKi8KKwlpZiAoIWlzX3JkODkwX2lvbW11KGlvbW11LT5kZXYpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEZpcnN0LCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBpb21tdSBpcyBlbmFibGVkLiBUaGlzIGlzCisJICogY29udHJvbGxlZCBieSBhIHJlZ2lzdGVyIGluIHRoZSBub3J0aGJyaWRnZQorCSAqLworCXBkZXYgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdChpb21tdS0+ZGV2LT5idXMtPm51bWJlciwgUENJX0RFVkZOKDAsIDApKTsKKworCWlmICghcGRldikKKwkJcmV0dXJuOworCisJLyogU2VsZWN0IE5vcnRoYnJpZGdlIGluZGlyZWN0IHJlZ2lzdGVyIDB4NzUgYW5kIGVuYWJsZSB3cml0aW5nICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDYwLCAweDc1IHwgKDEgPDwgNykpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDY0LCAmaW9jX2ZlYXR1cmVfY29udHJvbCk7CisKKwkvKiBFbmFibGUgdGhlIGlvbW11ICovCisJaWYgKCEoaW9jX2ZlYXR1cmVfY29udHJvbCAmIDB4MSkpCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg2NCwgaW9jX2ZlYXR1cmVfY29udHJvbCB8IDEpOworCisJcGNpX2Rldl9wdXQocGRldik7CisKKwkvKiBSZXN0b3JlIHRoZSBpb21tdSBCQVIgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIGlvbW11LT5jYXBfcHRyICsgNCwKKwkJCSAgICAgICBpb21tdS0+c3RvcmVkX2FkZHJfbG8pOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgaW9tbXUtPmNhcF9wdHIgKyA4LAorCQkJICAgICAgIGlvbW11LT5zdG9yZWRfYWRkcl9oaSk7CisKKwkvKiBSZXN0b3JlIHRoZSBsMSBpbmRpcmVjdCByZWdzIGZvciBlYWNoIG9mIHRoZSA2IGwxcyAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWZvciAoaiA9IDA7IGogPCAweDEyOyBqKyspCisJCQlpb21tdV93cml0ZV9sMShpb21tdSwgaSwgaiwgaW9tbXUtPnN0b3JlZF9sMVtpXVtqXSk7CisKKwkvKiBSZXN0b3JlIHRoZSBsMiBpbmRpcmVjdCByZWdzICovCisJZm9yIChpID0gMDsgaSA8IDB4ODM7IGkrKykKKwkJaW9tbXVfd3JpdGVfbDIoaW9tbXUsIGksIGlvbW11LT5zdG9yZWRfbDJbaV0pOworCisJLyogTG9jayBQQ0kgc2V0dXAgcmVnaXN0ZXJzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChpb21tdS0+ZGV2LCBpb21tdS0+Y2FwX3B0ciArIDQsCisJCQkgICAgICAgaW9tbXUtPnN0b3JlZF9hZGRyX2xvIHwgMSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZpbmFsbHkgZW5hYmxlcyBhbGwgSU9NTVVzIGZvdW5kIGluIHRoZSBzeXN0ZW0gYWZ0ZXIKKyAqIHRoZXkgaGF2ZSBiZWVuIGluaXRpYWxpemVkCisgKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV9pb21tdXModm9pZCkKK3sKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKKworCWZvcl9lYWNoX2lvbW11KGlvbW11KSB7CisJCWlvbW11X2Rpc2FibGUoaW9tbXUpOworCQlpb21tdV9pbml0X2ZsYWdzKGlvbW11KTsKKwkJaW9tbXVfc2V0X2RldmljZV90YWJsZShpb21tdSk7CisJCWlvbW11X2VuYWJsZV9jb21tYW5kX2J1ZmZlcihpb21tdSk7CisJCWlvbW11X2VuYWJsZV9ldmVudF9idWZmZXIoaW9tbXUpOworCQlpb21tdV9zZXRfZXhjbHVzaW9uX3JhbmdlKGlvbW11KTsKKwkJaW9tbXVfaW5pdF9tc2koaW9tbXUpOworCQlpb21tdV9lbmFibGUoaW9tbXUpOworCQlpb21tdV9mbHVzaF9hbGxfY2FjaGVzKGlvbW11KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfaW9tbXVzKHZvaWQpCit7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CisKKwlmb3JfZWFjaF9pb21tdShpb21tdSkKKwkJaW9tbXVfZGlzYWJsZShpb21tdSk7Cit9CisKKy8qCisgKiBTdXNwZW5kL1Jlc3VtZSBzdXBwb3J0CisgKiBkaXNhYmxlIHN1c3BlbmQgdW50aWwgcmVhbCByZXN1bWUgaW1wbGVtZW50ZWQKKyAqLworCitzdGF0aWMgdm9pZCBhbWRfaW9tbXVfcmVzdW1lKHZvaWQpCit7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CisKKwlmb3JfZWFjaF9pb21tdShpb21tdSkKKwkJaW9tbXVfYXBwbHlfcmVzdW1lX3F1aXJrcyhpb21tdSk7CisKKwkvKiByZS1sb2FkIHRoZSBoYXJkd2FyZSAqLworCWVuYWJsZV9pb21tdXMoKTsKKworCS8qCisJICogd2UgaGF2ZSB0byBmbHVzaCBhZnRlciB0aGUgSU9NTVVzIGFyZSBlbmFibGVkIGJlY2F1c2UgYQorCSAqIGRpc2FibGVkIElPTU1VIHdpbGwgbmV2ZXIgZXhlY3V0ZSB0aGUgY29tbWFuZHMgd2Ugc2VuZAorCSAqLworCWZvcl9lYWNoX2lvbW11KGlvbW11KQorCQlpb21tdV9mbHVzaF9hbGxfY2FjaGVzKGlvbW11KTsKK30KKworc3RhdGljIGludCBhbWRfaW9tbXVfc3VzcGVuZCh2b2lkKQoreworCS8qIGRpc2FibGUgSU9NTVVzIHRvIGdvIG91dCBvZiB0aGUgd2F5IGZvciBCSU9TICovCisJZGlzYWJsZV9pb21tdXMoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIGFtZF9pb21tdV9zeXNjb3JlX29wcyA9IHsKKwkuc3VzcGVuZCA9IGFtZF9pb21tdV9zdXNwZW5kLAorCS5yZXN1bWUgPSBhbWRfaW9tbXVfcmVzdW1lLAorfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGNvcmUgaW5pdCBmdW5jdGlvbiBmb3IgQU1EIElPTU1VIGhhcmR3YXJlIGluIHRoZSBzeXN0ZW0uCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBnZW5lcmljIHg4NiBETUEgbGF5ZXIgaW5pdGlhbGl6YXRpb24KKyAqIGNvZGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBiYXNpY2FsbHkgcGFyc2VzIHRoZSBBQ1BJIHRhYmxlIGZvciBBTUQgSU9NTVUgKElWUlMpCisgKiB0aHJlZSB0aW1lczoKKyAqCisgKgkxIHBhc3MpIEZpbmQgdGhlIGhpZ2hlc3QgUENJIGRldmljZSBpZCB0aGUgZHJpdmVyIGhhcyB0byBoYW5kbGUuCisgKgkJVXBvbiB0aGlzIGluZm9ybWF0aW9uIHRoZSBzaXplIG9mIHRoZSBkYXRhIHN0cnVjdHVyZXMgaXMKKyAqCQlkZXRlcm1pbmVkIHRoYXQgbmVlZHMgdG8gYmUgYWxsb2NhdGVkLgorICoKKyAqCTIgcGFzcykgSW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGp1c3QgYWxsb2NhdGVkIHdpdGggdGhlCisgKgkJaW5mb3JtYXRpb24gaW4gdGhlIEFDUEkgdGFibGUgYWJvdXQgYXZhaWxhYmxlIEFNRCBJT01NVXMKKyAqCQlpbiB0aGUgc3lzdGVtLiBJdCBhbHNvIG1hcHMgdGhlIFBDSSBkZXZpY2VzIGluIHRoZQorICoJCXN5c3RlbSB0byBzcGVjaWZpYyBJT01NVXMKKyAqCisgKgkzIHBhc3MpIEFmdGVyIHRoZSBiYXNpYyBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBhbmQKKyAqCQlpbml0aWFsaXplZCB3ZSB1cGRhdGUgdGhlbSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IG1lbW9yeQorICoJCXJlbWFwcGluZyByZXF1aXJlbWVudHMgcGFyc2VkIG91dCBvZiB0aGUgQUNQSSB0YWJsZSBpbgorICoJCXRoaXMgbGFzdCBwYXNzLgorICoKKyAqIEFmdGVyIHRoYXQgdGhlIGhhcmR3YXJlIGlzIGluaXRpYWxpemVkIGFuZCByZWFkeSB0byBnby4gSW4gdGhlIGxhc3QKKyAqIHN0ZXAgd2UgZG8gc29tZSBMaW51eCBzcGVjaWZpYyB0aGluZ3MgbGlrZSByZWdpc3RlcmluZyB0aGUgZHJpdmVyIGluCisgKiB0aGUgZG1hX29wcyBpbnRlcmZhY2UgYW5kIGluaXRpYWxpemluZyB0aGUgc3VzcGVuZC9yZXN1bWUgc3VwcG9ydAorICogZnVuY3Rpb25zLiBGaW5hbGx5IGl0IHByaW50cyBzb21lIGluZm9ybWF0aW9uIGFib3V0IEFNRCBJT01NVXMgYW5kCisgKiB0aGUgZHJpdmVyIHN0YXRlIGFuZCBlbmFibGVzIHRoZSBoYXJkd2FyZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgYW1kX2lvbW11X2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCS8qCisJICogRmlyc3QgcGFyc2UgQUNQSSB0YWJsZXMgdG8gZmluZCB0aGUgbGFyZ2VzdCBCdXMvRGV2L0Z1bmMKKwkgKiB3ZSBuZWVkIHRvIGhhbmRsZS4gVXBvbiB0aGlzIGluZm9ybWF0aW9uIHRoZSBzaGFyZWQgZGF0YQorCSAqIHN0cnVjdHVyZXMgZm9yIHRoZSBJT01NVXMgaW4gdGhlIHN5c3RlbSB3aWxsIGJlIGFsbG9jYXRlZAorCSAqLworCWlmIChhY3BpX3RhYmxlX3BhcnNlKCJJVlJTIiwgZmluZF9sYXN0X2RldmlkX2FjcGkpICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gYW1kX2lvbW11X2luaXRfZXJyOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJZGV2X3RhYmxlX3NpemUgICAgID0gdGJsX3NpemUoREVWX1RBQkxFX0VOVFJZX1NJWkUpOworCWFsaWFzX3RhYmxlX3NpemUgICA9IHRibF9zaXplKEFMSUFTX1RBQkxFX0VOVFJZX1NJWkUpOworCXJsb29rdXBfdGFibGVfc2l6ZSA9IHRibF9zaXplKFJMT09LVVBfVEFCTEVfRU5UUllfU0laRSk7CisKKwlyZXQgPSAtRU5PTUVNOworCisJLyogRGV2aWNlIHRhYmxlIC0gZGlyZWN0bHkgdXNlZCBieSBhbGwgSU9NTVVzICovCisJYW1kX2lvbW11X2Rldl90YWJsZSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywKKwkJCQkgICAgICBnZXRfb3JkZXIoZGV2X3RhYmxlX3NpemUpKTsKKwlpZiAoYW1kX2lvbW11X2Rldl90YWJsZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCS8qCisJICogQWxpYXMgdGFibGUgLSBtYXAgUENJIEJ1cy9EZXYvRnVuYyB0byBCdXMvRGV2L0Z1bmMgdGhlCisJICogSU9NTVUgc2VlIGZvciB0aGF0IGRldmljZQorCSAqLworCWFtZF9pb21tdV9hbGlhc190YWJsZSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQkJZ2V0X29yZGVyKGFsaWFzX3RhYmxlX3NpemUpKTsKKwlpZiAoYW1kX2lvbW11X2FsaWFzX3RhYmxlID09IE5VTEwpCisJCWdvdG8gZnJlZTsKKworCS8qIElPTU1VIHJsb29rdXAgdGFibGUgLSBmaW5kIHRoZSBJT01NVSBmb3IgYSBzcGVjaWZpYyBkZXZpY2UgKi8KKwlhbWRfaW9tbXVfcmxvb2t1cF90YWJsZSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcygKKwkJCUdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAorCQkJZ2V0X29yZGVyKHJsb29rdXBfdGFibGVfc2l6ZSkpOworCWlmIChhbWRfaW9tbXVfcmxvb2t1cF90YWJsZSA9PSBOVUxMKQorCQlnb3RvIGZyZWU7CisKKwlhbWRfaW9tbXVfcGRfYWxsb2NfYml0bWFwID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKAorCQkJCQkgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCisJCQkJCSAgICBnZXRfb3JkZXIoTUFYX0RPTUFJTl9JRC84KSk7CisJaWYgKGFtZF9pb21tdV9wZF9hbGxvY19iaXRtYXAgPT0gTlVMTCkKKwkJZ290byBmcmVlOworCisJLyogaW5pdCB0aGUgZGV2aWNlIHRhYmxlICovCisJaW5pdF9kZXZpY2VfdGFibGUoKTsKKworCS8qCisJICogbGV0IGFsbCBhbGlhcyBlbnRyaWVzIHBvaW50IHRvIGl0c2VsZgorCSAqLworCWZvciAoaSA9IDA7IGkgPD0gYW1kX2lvbW11X2xhc3RfYmRmOyArK2kpCisJCWFtZF9pb21tdV9hbGlhc190YWJsZVtpXSA9IGk7CisKKwkvKgorCSAqIG5ldmVyIGFsbG9jYXRlIGRvbWFpbiAwIGJlY2F1c2UgaXRzIHVzZWQgYXMgdGhlIG5vbi1hbGxvY2F0ZWQgYW5kCisJICogZXJyb3IgdmFsdWUgcGxhY2Vob2xkZXIKKwkgKi8KKwlhbWRfaW9tbXVfcGRfYWxsb2NfYml0bWFwWzBdID0gMTsKKworCXNwaW5fbG9ja19pbml0KCZhbWRfaW9tbXVfcGRfbG9jayk7CisKKwkvKgorCSAqIG5vdyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgYW5kIGJhc2ljYWxseSBpbml0aWFsaXplZAorCSAqIHN0YXJ0IHRoZSByZWFsIGFjcGkgdGFibGUgc2NhbgorCSAqLworCXJldCA9IC1FTk9ERVY7CisJaWYgKGFjcGlfdGFibGVfcGFyc2UoIklWUlMiLCBpbml0X2lvbW11X2FsbCkgIT0gMCkKKwkJZ290byBmcmVlOworCisJaWYgKGFtZF9pb21tdV9pbml0X2VycikgeworCQlyZXQgPSBhbWRfaW9tbXVfaW5pdF9lcnI7CisJCWdvdG8gZnJlZTsKKwl9CisKKwlpZiAoYWNwaV90YWJsZV9wYXJzZSgiSVZSUyIsIGluaXRfbWVtb3J5X2RlZmluaXRpb25zKSAhPSAwKQorCQlnb3RvIGZyZWU7CisKKwlpZiAoYW1kX2lvbW11X2luaXRfZXJyKSB7CisJCXJldCA9IGFtZF9pb21tdV9pbml0X2VycjsKKwkJZ290byBmcmVlOworCX0KKworCXJldCA9IGFtZF9pb21tdV9pbml0X2RldmljZXMoKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWU7CisKKwllbmFibGVfaW9tbXVzKCk7CisKKwlpZiAoaW9tbXVfcGFzc190aHJvdWdoKQorCQlyZXQgPSBhbWRfaW9tbXVfaW5pdF9wYXNzdGhyb3VnaCgpOworCWVsc2UKKwkJcmV0ID0gYW1kX2lvbW11X2luaXRfZG1hX29wcygpOworCisJaWYgKHJldCkKKwkJZ290byBmcmVlX2Rpc2FibGU7CisKKwlhbWRfaW9tbXVfaW5pdF9hcGkoKTsKKworCWFtZF9pb21tdV9pbml0X25vdGlmaWVyKCk7CisKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmYW1kX2lvbW11X3N5c2NvcmVfb3BzKTsKKworCWlmIChpb21tdV9wYXNzX3Rocm91Z2gpCisJCWdvdG8gb3V0OworCisJaWYgKGFtZF9pb21tdV91bm1hcF9mbHVzaCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQU1ELVZpOiBJTy9UTEIgZmx1c2ggb24gdW5tYXAgZW5hYmxlZFxuIik7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJBTUQtVmk6IExhenkgSU8vVExCIGZsdXNoaW5nIGVuYWJsZWRcbiIpOworCisJeDg2X3BsYXRmb3JtLmlvbW11X3NodXRkb3duID0gZGlzYWJsZV9pb21tdXM7CitvdXQ6CisJcmV0dXJuIHJldDsKKworZnJlZV9kaXNhYmxlOgorCWRpc2FibGVfaW9tbXVzKCk7CisKK2ZyZWU6CisJYW1kX2lvbW11X3VuaW5pdF9kZXZpY2VzKCk7CisKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFtZF9pb21tdV9wZF9hbGxvY19iaXRtYXAsCisJCSAgIGdldF9vcmRlcihNQVhfRE9NQUlOX0lELzgpKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYW1kX2lvbW11X3Jsb29rdXBfdGFibGUsCisJCSAgIGdldF9vcmRlcihybG9va3VwX3RhYmxlX3NpemUpKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYW1kX2lvbW11X2FsaWFzX3RhYmxlLAorCQkgICBnZXRfb3JkZXIoYWxpYXNfdGFibGVfc2l6ZSkpOworCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylhbWRfaW9tbXVfZGV2X3RhYmxlLAorCQkgICBnZXRfb3JkZXIoZGV2X3RhYmxlX3NpemUpKTsKKworCWZyZWVfaW9tbXVfYWxsKCk7CisKKwlmcmVlX3VuaXR5X21hcHMoKTsKKworI2lmZGVmIENPTkZJR19HQVJUX0lPTU1VCisJLyoKKwkgKiBXZSBmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgQU1EIElPTU1VIC0gdHJ5IGZhbGxiYWNrIHRvIEdBUlQKKwkgKiBpZiBwb3NzaWJsZS4KKwkgKi8KKwlnYXJ0X2lvbW11X2luaXQoKTsKKworI2VuZGlmCisKKwlnb3RvIG91dDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFYXJseSBkZXRlY3QgY29kZS4gVGhpcyBjb2RlIHJ1bnMgYXQgSU9NTVUgZGV0ZWN0aW9uIHRpbWUgaW4gdGhlIERNQQorICogbGF5ZXIuIEl0IGp1c3QgbG9va3MgaWYgdGhlcmUgaXMgYW4gSVZSUyBBQ1BJIHRhYmxlIHRvIGRldGVjdCBBTUQKKyAqIElPTU1VcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfX2luaXQgZWFybHlfYW1kX2lvbW11X2RldGVjdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKQoreworCXJldHVybiAwOworfQorCitpbnQgX19pbml0IGFtZF9pb21tdV9kZXRlY3Qodm9pZCkKK3sKKwlpZiAobm9faW9tbXUgfHwgKGlvbW11X2RldGVjdGVkICYmICFnYXJ0X2lvbW11X2FwZXJ0dXJlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoYW1kX2lvbW11X2Rpc2FibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChhY3BpX3RhYmxlX3BhcnNlKCJJVlJTIiwgZWFybHlfYW1kX2lvbW11X2RldGVjdCkgPT0gMCkgeworCQlpb21tdV9kZXRlY3RlZCA9IDE7CisJCWFtZF9pb21tdV9kZXRlY3RlZCA9IDE7CisJCXg4Nl9pbml0LmlvbW11LmlvbW11X2luaXQgPSBhbWRfaW9tbXVfaW5pdDsKKworCQkvKiBNYWtlIHN1cmUgQUNTIHdpbGwgYmUgZW5hYmxlZCAqLworCQlwY2lfcmVxdWVzdF9hY3MoKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFBhcnNpbmcgZnVuY3Rpb25zIGZvciB0aGUgQU1EIElPTU1VIHNwZWNpZmljIGtlcm5lbCBjb21tYW5kIGxpbmUKKyAqIG9wdGlvbnMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2FtZF9pb21tdV9kdW1wKGNoYXIgKnN0cikKK3sKKwlhbWRfaW9tbXVfZHVtcCA9IHRydWU7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfYW1kX2lvbW11X29wdGlvbnMoY2hhciAqc3RyKQoreworCWZvciAoOyAqc3RyOyArK3N0cikgeworCQlpZiAoc3RybmNtcChzdHIsICJmdWxsZmx1c2giLCA5KSA9PSAwKQorCQkJYW1kX2lvbW11X3VubWFwX2ZsdXNoID0gdHJ1ZTsKKwkJaWYgKHN0cm5jbXAoc3RyLCAib2ZmIiwgMykgPT0gMCkKKwkJCWFtZF9pb21tdV9kaXNhYmxlZCA9IHRydWU7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFtZF9pb21tdV9kdW1wIiwgcGFyc2VfYW1kX2lvbW11X2R1bXApOworX19zZXR1cCgiYW1kX2lvbW11PSIsIHBhcnNlX2FtZF9pb21tdV9vcHRpb25zKTsKKworSU9NTVVfSU5JVF9GSU5JU0goYW1kX2lvbW11X2RldGVjdCwKKwkJICBnYXJ0X2lvbW11X2hvbGVfaW5pdCwKKwkJICAwLAorCQkgIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfcHJvdG8uaCBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmYWE2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X3Byb3RvLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIEF1dGhvcjogSm9lcmcgUm9lZGVsIDxqb2VyZy5yb2VkZWxAYW1kLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9BU01fWDg2X0FNRF9JT01NVV9QUk9UT19ICisjZGVmaW5lIF9BU01fWDg2X0FNRF9JT01NVV9QUk9UT19ICisKKyNpbmNsdWRlICJhbWRfaW9tbXVfdHlwZXMuaCIKKworZXh0ZXJuIGludCBhbWRfaW9tbXVfaW5pdF9kbWFfb3BzKHZvaWQpOworZXh0ZXJuIGludCBhbWRfaW9tbXVfaW5pdF9wYXNzdGhyb3VnaCh2b2lkKTsKK2V4dGVybiBpcnFyZXR1cm5fdCBhbWRfaW9tbXVfaW50X3RocmVhZChpbnQgaXJxLCB2b2lkICpkYXRhKTsKK2V4dGVybiBpcnFyZXR1cm5fdCBhbWRfaW9tbXVfaW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZCBhbWRfaW9tbXVfYXBwbHlfZXJyYXR1bV82Myh1MTYgZGV2aWQpOworZXh0ZXJuIHZvaWQgYW1kX2lvbW11X3Jlc2V0X2NtZF9idWZmZXIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpOworZXh0ZXJuIGludCBhbWRfaW9tbXVfaW5pdF9kZXZpY2VzKHZvaWQpOworZXh0ZXJuIHZvaWQgYW1kX2lvbW11X3VuaW5pdF9kZXZpY2VzKHZvaWQpOworZXh0ZXJuIHZvaWQgYW1kX2lvbW11X2luaXRfbm90aWZpZXIodm9pZCk7CitleHRlcm4gdm9pZCBhbWRfaW9tbXVfaW5pdF9hcGkodm9pZCk7CisjaWZuZGVmIENPTkZJR19BTURfSU9NTVVfU1RBVFMKKworc3RhdGljIGlubGluZSB2b2lkIGFtZF9pb21tdV9zdGF0c19pbml0KHZvaWQpIHsgfQorCisjZW5kaWYgLyogIUNPTkZJR19BTURfSU9NTVVfU1RBVFMgKi8KKworc3RhdGljIGlubGluZSBib29sIGlzX3JkODkwX2lvbW11KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVRJKSAmJgorCSAgICAgICAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUkQ4OTBfSU9NTVUpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaW9tbXVfZmVhdHVyZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTY0IGYpCit7CisJaWYgKCEoaW9tbXUtPmNhcCAmICgxIDw8IElPTU1VX0NBUF9FRlIpKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuICEhKGlvbW11LT5mZWF0dXJlcyAmIGYpOworfQorCisjZW5kaWYgLyogX0FTTV9YODZfQU1EX0lPTU1VX1BST1RPX0ggICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV90eXBlcy5oIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjljNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaApAQCAtMCwwICsxLDU4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIEF1dGhvcjogSm9lcmcgUm9lZGVsIDxqb2VyZy5yb2VkZWxAYW1kLmNvbT4KKyAqICAgICAgICAgTGVvIER1cmFuIDxsZW8uZHVyYW5AYW1kLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9BU01fWDg2X0FNRF9JT01NVV9UWVBFU19ICisjZGVmaW5lIF9BU01fWDg2X0FNRF9JT01NVV9UWVBFU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBJT01NVXMgc3VwcG9ydGVkCisgKi8KKyNkZWZpbmUgTUFYX0lPTU1VUwkzMgorCisvKgorICogc29tZSBzaXplIGNhbGN1bGF0aW9uIGNvbnN0YW50cworICovCisjZGVmaW5lIERFVl9UQUJMRV9FTlRSWV9TSVpFCQkzMgorI2RlZmluZSBBTElBU19UQUJMRV9FTlRSWV9TSVpFCQkyCisjZGVmaW5lIFJMT09LVVBfVEFCTEVfRU5UUllfU0laRQkoc2l6ZW9mKHZvaWQgKikpCisKKy8qIExlbmd0aCBvZiB0aGUgTU1JTyByZWdpb24gZm9yIHRoZSBBTUQgSU9NTVUgKi8KKyNkZWZpbmUgTU1JT19SRUdJT05fTEVOR1RIICAgICAgIDB4NDAwMAorCisvKiBDYXBhYmlsaXR5IG9mZnNldHMgdXNlZCBieSB0aGUgZHJpdmVyICovCisjZGVmaW5lIE1NSU9fQ0FQX0hEUl9PRkZTRVQJMHgwMAorI2RlZmluZSBNTUlPX1JBTkdFX09GRlNFVAkweDBjCisjZGVmaW5lIE1NSU9fTUlTQ19PRkZTRVQJMHgxMAorCisvKiBNYXNrcywgc2hpZnRzIGFuZCBtYWNyb3MgdG8gcGFyc2UgdGhlIGRldmljZSByYW5nZSBjYXBhYmlsaXR5ICovCisjZGVmaW5lIE1NSU9fUkFOR0VfTERfTUFTSwkweGZmMDAwMDAwCisjZGVmaW5lIE1NSU9fUkFOR0VfRkRfTUFTSwkweDAwZmYwMDAwCisjZGVmaW5lIE1NSU9fUkFOR0VfQlVTX01BU0sJMHgwMDAwZmYwMAorI2RlZmluZSBNTUlPX1JBTkdFX0xEX1NISUZUCTI0CisjZGVmaW5lIE1NSU9fUkFOR0VfRkRfU0hJRlQJMTYKKyNkZWZpbmUgTU1JT19SQU5HRV9CVVNfU0hJRlQJOAorI2RlZmluZSBNTUlPX0dFVF9MRCh4KSAgKCgoeCkgJiBNTUlPX1JBTkdFX0xEX01BU0spID4+IE1NSU9fUkFOR0VfTERfU0hJRlQpCisjZGVmaW5lIE1NSU9fR0VUX0ZEKHgpICAoKCh4KSAmIE1NSU9fUkFOR0VfRkRfTUFTSykgPj4gTU1JT19SQU5HRV9GRF9TSElGVCkKKyNkZWZpbmUgTU1JT19HRVRfQlVTKHgpICgoKHgpICYgTU1JT19SQU5HRV9CVVNfTUFTSykgPj4gTU1JT19SQU5HRV9CVVNfU0hJRlQpCisjZGVmaW5lIE1NSU9fTVNJX05VTSh4KQkoKHgpICYgMHgxZikKKworLyogRmxhZyBtYXNrcyBmb3IgdGhlIEFNRCBJT01NVSBleGNsdXNpb24gcmFuZ2UgKi8KKyNkZWZpbmUgTU1JT19FWENMX0VOQUJMRV9NQVNLIDB4MDFVTEwKKyNkZWZpbmUgTU1JT19FWENMX0FMTE9XX01BU0sgIDB4MDJVTEwKKworLyogVXNlZCBvZmZzZXRzIGludG8gdGhlIE1NSU8gc3BhY2UgKi8KKyNkZWZpbmUgTU1JT19ERVZfVEFCTEVfT0ZGU0VUICAgMHgwMDAwCisjZGVmaW5lIE1NSU9fQ01EX0JVRl9PRkZTRVQgICAgIDB4MDAwOAorI2RlZmluZSBNTUlPX0VWVF9CVUZfT0ZGU0VUICAgICAweDAwMTAKKyNkZWZpbmUgTU1JT19DT05UUk9MX09GRlNFVCAgICAgMHgwMDE4CisjZGVmaW5lIE1NSU9fRVhDTF9CQVNFX09GRlNFVCAgIDB4MDAyMAorI2RlZmluZSBNTUlPX0VYQ0xfTElNSVRfT0ZGU0VUICAweDAwMjgKKyNkZWZpbmUgTU1JT19FWFRfRkVBVFVSRVMJMHgwMDMwCisjZGVmaW5lIE1NSU9fQ01EX0hFQURfT0ZGU0VUCTB4MjAwMAorI2RlZmluZSBNTUlPX0NNRF9UQUlMX09GRlNFVAkweDIwMDgKKyNkZWZpbmUgTU1JT19FVlRfSEVBRF9PRkZTRVQJMHgyMDEwCisjZGVmaW5lIE1NSU9fRVZUX1RBSUxfT0ZGU0VUCTB4MjAxOAorI2RlZmluZSBNTUlPX1NUQVRVU19PRkZTRVQJMHgyMDIwCisKKworLyogRXh0ZW5kZWQgRmVhdHVyZSBCaXRzICovCisjZGVmaW5lIEZFQVRVUkVfUFJFRkVUQ0gJKDFVTEw8PDApCisjZGVmaW5lIEZFQVRVUkVfUFBSCQkoMVVMTDw8MSkKKyNkZWZpbmUgRkVBVFVSRV9YMkFQSUMJCSgxVUxMPDwyKQorI2RlZmluZSBGRUFUVVJFX05YCQkoMVVMTDw8MykKKyNkZWZpbmUgRkVBVFVSRV9HVAkJKDFVTEw8PDQpCisjZGVmaW5lIEZFQVRVUkVfSUEJCSgxVUxMPDw2KQorI2RlZmluZSBGRUFUVVJFX0dBCQkoMVVMTDw8NykKKyNkZWZpbmUgRkVBVFVSRV9IRQkJKDFVTEw8PDgpCisjZGVmaW5lIEZFQVRVUkVfUEMJCSgxVUxMPDw5KQorCisvKiBNTUlPIHN0YXR1cyBiaXRzICovCisjZGVmaW5lIE1NSU9fU1RBVFVTX0NPTV9XQUlUX0lOVF9NQVNLCTB4MDQKKworLyogZXZlbnQgbG9nZ2luZyBjb25zdGFudHMgKi8KKyNkZWZpbmUgRVZFTlRfRU5UUllfU0laRQkweDEwCisjZGVmaW5lIEVWRU5UX1RZUEVfU0hJRlQJMjgKKyNkZWZpbmUgRVZFTlRfVFlQRV9NQVNLCQkweGYKKyNkZWZpbmUgRVZFTlRfVFlQRV9JTExfREVWCTB4MQorI2RlZmluZSBFVkVOVF9UWVBFX0lPX0ZBVUxUCTB4MgorI2RlZmluZSBFVkVOVF9UWVBFX0RFVl9UQUJfRVJSCTB4MworI2RlZmluZSBFVkVOVF9UWVBFX1BBR0VfVEFCX0VSUgkweDQKKyNkZWZpbmUgRVZFTlRfVFlQRV9JTExfQ01ECTB4NQorI2RlZmluZSBFVkVOVF9UWVBFX0NNRF9IQVJEX0VSUgkweDYKKyNkZWZpbmUgRVZFTlRfVFlQRV9JT1RMQl9JTlZfVE8JMHg3CisjZGVmaW5lIEVWRU5UX1RZUEVfSU5WX0RFVl9SRVEJMHg4CisjZGVmaW5lIEVWRU5UX0RFVklEX01BU0sJMHhmZmZmCisjZGVmaW5lIEVWRU5UX0RFVklEX1NISUZUCTAKKyNkZWZpbmUgRVZFTlRfRE9NSURfTUFTSwkweGZmZmYKKyNkZWZpbmUgRVZFTlRfRE9NSURfU0hJRlQJMAorI2RlZmluZSBFVkVOVF9GTEFHU19NQVNLCTB4ZmZmCisjZGVmaW5lIEVWRU5UX0ZMQUdTX1NISUZUCTB4MTAKKworLyogZmVhdHVyZSBjb250cm9sIGJpdHMgKi8KKyNkZWZpbmUgQ09OVFJPTF9JT01NVV9FTiAgICAgICAgMHgwMFVMTAorI2RlZmluZSBDT05UUk9MX0hUX1RVTl9FTiAgICAgICAweDAxVUxMCisjZGVmaW5lIENPTlRST0xfRVZUX0xPR19FTiAgICAgIDB4MDJVTEwKKyNkZWZpbmUgQ09OVFJPTF9FVlRfSU5UX0VOICAgICAgMHgwM1VMTAorI2RlZmluZSBDT05UUk9MX0NPTVdBSVRfRU4gICAgICAweDA0VUxMCisjZGVmaW5lIENPTlRST0xfUEFTU1BXX0VOICAgICAgIDB4MDhVTEwKKyNkZWZpbmUgQ09OVFJPTF9SRVNQQVNTUFdfRU4gICAgMHgwOVVMTAorI2RlZmluZSBDT05UUk9MX0NPSEVSRU5UX0VOICAgICAweDBhVUxMCisjZGVmaW5lIENPTlRST0xfSVNPQ19FTiAgICAgICAgIDB4MGJVTEwKKyNkZWZpbmUgQ09OVFJPTF9DTURCVUZfRU4gICAgICAgMHgwY1VMTAorI2RlZmluZSBDT05UUk9MX1BQRkxPR19FTiAgICAgICAweDBkVUxMCisjZGVmaW5lIENPTlRST0xfUFBGSU5UX0VOICAgICAgIDB4MGVVTEwKKworLyogY29tbWFuZCBzcGVjaWZpYyBkZWZpbmVzICovCisjZGVmaW5lIENNRF9DT01QTF9XQUlUICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ01EX0lOVl9ERVZfRU5UUlkgICAgICAgMHgwMgorI2RlZmluZSBDTURfSU5WX0lPTU1VX1BBR0VTCTB4MDMKKyNkZWZpbmUgQ01EX0lOVl9JT1RMQl9QQUdFUwkweDA0CisjZGVmaW5lIENNRF9JTlZfQUxMCQkweDA4CisKKyNkZWZpbmUgQ01EX0NPTVBMX1dBSVRfU1RPUkVfTUFTSwkweDAxCisjZGVmaW5lIENNRF9DT01QTF9XQUlUX0lOVF9NQVNLCQkweDAyCisjZGVmaW5lIENNRF9JTlZfSU9NTVVfUEFHRVNfU0laRV9NQVNLCTB4MDEKKyNkZWZpbmUgQ01EX0lOVl9JT01NVV9QQUdFU19QREVfTUFTSwkweDAyCisKKyNkZWZpbmUgQ01EX0lOVl9JT01NVV9BTExfUEFHRVNfQUREUkVTUwkweDdmZmZmZmZmZmZmZmZmZmZVTEwKKworLyogbWFjcm9zIGFuZCBkZWZpbml0aW9ucyBmb3IgZGV2aWNlIHRhYmxlIGVudHJpZXMgKi8KKyNkZWZpbmUgREVWX0VOVFJZX1ZBTElEICAgICAgICAgMHgwMAorI2RlZmluZSBERVZfRU5UUllfVFJBTlNMQVRJT04gICAweDAxCisjZGVmaW5lIERFVl9FTlRSWV9JUiAgICAgICAgICAgIDB4M2QKKyNkZWZpbmUgREVWX0VOVFJZX0lXICAgICAgICAgICAgMHgzZQorI2RlZmluZSBERVZfRU5UUllfTk9fUEFHRV9GQVVMVAkweDYyCisjZGVmaW5lIERFVl9FTlRSWV9FWCAgICAgICAgICAgIDB4NjcKKyNkZWZpbmUgREVWX0VOVFJZX1NZU01HVDEgICAgICAgMHg2OAorI2RlZmluZSBERVZfRU5UUllfU1lTTUdUMiAgICAgICAweDY5CisjZGVmaW5lIERFVl9FTlRSWV9JTklUX1BBU1MgICAgIDB4YjgKKyNkZWZpbmUgREVWX0VOVFJZX0VJTlRfUEFTUyAgICAgMHhiOQorI2RlZmluZSBERVZfRU5UUllfTk1JX1BBU1MgICAgICAweGJhCisjZGVmaW5lIERFVl9FTlRSWV9MSU5UMF9QQVNTICAgIDB4YmUKKyNkZWZpbmUgREVWX0VOVFJZX0xJTlQxX1BBU1MgICAgMHhiZgorI2RlZmluZSBERVZfRU5UUllfTU9ERV9NQVNLCTB4MDcKKyNkZWZpbmUgREVWX0VOVFJZX01PREVfU0hJRlQJMHgwOQorCisvKiBjb25zdGFudHMgdG8gY29uZmlndXJlIHRoZSBjb21tYW5kIGJ1ZmZlciAqLworI2RlZmluZSBDTURfQlVGRkVSX1NJWkUgICAgODE5MgorI2RlZmluZSBDTURfQlVGRkVSX1VOSU5JVElBTElaRUQgMQorI2RlZmluZSBDTURfQlVGRkVSX0VOVFJJRVMgNTEyCisjZGVmaW5lIE1NSU9fQ01EX1NJWkVfU0hJRlQgNTYKKyNkZWZpbmUgTU1JT19DTURfU0laRV81MTIgKDB4OVVMTCA8PCBNTUlPX0NNRF9TSVpFX1NISUZUKQorCisvKiBjb25zdGFudHMgZm9yIGV2ZW50IGJ1ZmZlciBoYW5kbGluZyAqLworI2RlZmluZSBFVlRfQlVGRkVSX1NJWkUJCTgxOTIgLyogNTEyIGVudHJpZXMgKi8KKyNkZWZpbmUgRVZUX0xFTl9NQVNLCQkoMHg5VUxMIDw8IDU2KQorCisjZGVmaW5lIFBBR0VfTU9ERV9OT05FICAgIDB4MDAKKyNkZWZpbmUgUEFHRV9NT0RFXzFfTEVWRUwgMHgwMQorI2RlZmluZSBQQUdFX01PREVfMl9MRVZFTCAweDAyCisjZGVmaW5lIFBBR0VfTU9ERV8zX0xFVkVMIDB4MDMKKyNkZWZpbmUgUEFHRV9NT0RFXzRfTEVWRUwgMHgwNAorI2RlZmluZSBQQUdFX01PREVfNV9MRVZFTCAweDA1CisjZGVmaW5lIFBBR0VfTU9ERV82X0xFVkVMIDB4MDYKKworI2RlZmluZSBQTV9MRVZFTF9TSElGVCh4KQkoMTIgKyAoKHgpICogOSkpCisjZGVmaW5lIFBNX0xFVkVMX1NJWkUoeCkJKCgoeCkgPCA2KSA/IFwKKwkJCQkgICgoMVVMTCA8PCBQTV9MRVZFTF9TSElGVCgoeCkpKSAtIDEpOiBcCisJCQkJICAgKDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpCisjZGVmaW5lIFBNX0xFVkVMX0lOREVYKHgsIGEpCSgoKGEpID4+IFBNX0xFVkVMX1NISUZUKCh4KSkpICYgMHgxZmZVTEwpCisjZGVmaW5lIFBNX0xFVkVMX0VOQyh4KQkJKCgoeCkgPDwgOSkgJiAweGUwMFVMTCkKKyNkZWZpbmUgUE1fTEVWRUxfUERFKHgsIGEpCSgoYSkgfCBQTV9MRVZFTF9FTkMoKHgpKSB8IFwKKwkJCQkgSU9NTVVfUFRFX1AgfCBJT01NVV9QVEVfSVIgfCBJT01NVV9QVEVfSVcpCisjZGVmaW5lIFBNX1BURV9MRVZFTChwdGUpCSgoKHB0ZSkgPj4gOSkgJiAweDdVTEwpCisKKyNkZWZpbmUgUE1fTUFQXzRrCQkwCisjZGVmaW5lIFBNX0FERFJfTUFTSwkJMHgwMDBmZmZmZmZmZmZmMDAwVUxMCisjZGVmaW5lIFBNX01BUF9NQVNLKGx2bCkJKFBNX0FERFJfTUFTSyAmIFwKKwkJCQkofigoMVVMTCA8PCAoMTIgKyAoKGx2bCkgKiA5KSkpIC0gMSkpKQorI2RlZmluZSBQTV9BTElHTkVEKGx2bCwgYWRkcikJKChQTV9NQVBfTUFTSyhsdmwpICYgKGFkZHIpKSA9PSAoYWRkcikpCisKKy8qCisgKiBSZXR1cm5zIHRoZSBwYWdlIHRhYmxlIGxldmVsIHRvIHVzZSBmb3IgYSBnaXZlbiBwYWdlIHNpemUKKyAqIFBhZ2VzaXplIGlzIGV4cGVjdGVkIHRvIGJlIGEgcG93ZXItb2YtdHdvCisgKi8KKyNkZWZpbmUgUEFHRV9TSVpFX0xFVkVMKHBhZ2VzaXplKSBcCisJCSgoX19mZnMocGFnZXNpemUpIC0gMTIpIC8gOSkKKy8qCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcHRlcyB0byB1c2UgZm9yIGEgZ2l2ZW4gcGFnZSBzaXplCisgKiBQYWdlc2l6ZSBpcyBleHBlY3RlZCB0byBiZSBhIHBvd2VyLW9mLXR3bworICovCisjZGVmaW5lIFBBR0VfU0laRV9QVEVfQ09VTlQocGFnZXNpemUpIFwKKwkJKDFVTEwgPDwgKChfX2ZmcyhwYWdlc2l6ZSkgLSAxMikgJSA5KSkKKworLyoKKyAqIEFsaWducyBhIGdpdmVuIGlvLXZpcnR1YWwgYWRkcmVzcyB0byBhIGdpdmVuIHBhZ2Ugc2l6ZQorICogUGFnZXNpemUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBwb3dlci1vZi10d28KKyAqLworI2RlZmluZSBQQUdFX1NJWkVfQUxJR04oYWRkcmVzcywgcGFnZXNpemUpIFwKKwkJKChhZGRyZXNzKSAmIH4oKHBhZ2VzaXplKSAtIDEpKQorLyoKKyAqIENyZWF0ZXMgYW4gSU9NTVUgUFRFIGZvciBhbiBhZGRyZXNzIGFuIGEgZ2l2ZW4gcGFnZXNpemUKKyAqIFRoZSBQVEUgaGFzIG5vIHBlcm1pc3Npb24gYml0cyBzZXQKKyAqIFBhZ2VzaXplIGlzIGV4cGVjdGVkIHRvIGJlIGEgcG93ZXItb2YtdHdvIGxhcmdlciB0aGFuIDQwOTYKKyAqLworI2RlZmluZSBQQUdFX1NJWkVfUFRFKGFkZHJlc3MsIHBhZ2VzaXplKQkJXAorCQkoKChhZGRyZXNzKSB8ICgocGFnZXNpemUpIC0gMSkpICYJXAorCQkgKH4ocGFnZXNpemUgPj4gMSkpICYgUE1fQUREUl9NQVNLKQorCisvKgorICogVGFrZXMgYSBQVEUgdmFsdWUgd2l0aCBtb2RlPTB4MDcgYW5kIHJldHVybnMgdGhlIHBhZ2Ugc2l6ZSBpdCBtYXBzCisgKi8KKyNkZWZpbmUgUFRFX1BBR0VfU0laRShwdGUpIFwKKwkoMVVMTCA8PCAoMSArIGZmeigoKHB0ZSkgfCAweGZmZlVMTCkpKSkKKworI2RlZmluZSBJT01NVV9QVEVfUCAgKDFVTEwgPDwgMCkKKyNkZWZpbmUgSU9NTVVfUFRFX1RWICgxVUxMIDw8IDEpCisjZGVmaW5lIElPTU1VX1BURV9VICAoMVVMTCA8PCA1OSkKKyNkZWZpbmUgSU9NTVVfUFRFX0ZDICgxVUxMIDw8IDYwKQorI2RlZmluZSBJT01NVV9QVEVfSVIgKDFVTEwgPDwgNjEpCisjZGVmaW5lIElPTU1VX1BURV9JVyAoMVVMTCA8PCA2MikKKworI2RlZmluZSBEVEVfRkxBR19JT1RMQgkweDAxCisKKyNkZWZpbmUgSU9NTVVfUEFHRV9NQVNLICgoKDFVTEwgPDwgNTIpIC0gMSkgJiB+MHhmZmZVTEwpCisjZGVmaW5lIElPTU1VX1BURV9QUkVTRU5UKHB0ZSkgKChwdGUpICYgSU9NTVVfUFRFX1ApCisjZGVmaW5lIElPTU1VX1BURV9QQUdFKHB0ZSkgKHBoeXNfdG9fdmlydCgocHRlKSAmIElPTU1VX1BBR0VfTUFTSykpCisjZGVmaW5lIElPTU1VX1BURV9NT0RFKHB0ZSkgKCgocHRlKSA+PiA5KSAmIDB4MDcpCisKKyNkZWZpbmUgSU9NTVVfUFJPVF9NQVNLIDB4MDMKKyNkZWZpbmUgSU9NTVVfUFJPVF9JUiAweDAxCisjZGVmaW5lIElPTU1VX1BST1RfSVcgMHgwMgorCisvKiBJT01NVSBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgSU9NTVVfQ0FQX0lPVExCICAgMjQKKyNkZWZpbmUgSU9NTVVfQ0FQX05QQ0FDSEUgMjYKKyNkZWZpbmUgSU9NTVVfQ0FQX0VGUiAgICAgMjcKKworI2RlZmluZSBNQVhfRE9NQUlOX0lEIDY1NTM2CisKKy8qIEZJWE1FOiBtb3ZlIHRoaXMgbWFjcm8gdG8gPGxpbnV4L3BjaS5oPiAqLworI2RlZmluZSBQQ0lfQlVTKHgpICgoKHgpID4+IDgpICYgMHhmZikKKworLyogUHJvdGVjdGlvbiBkb21haW4gZmxhZ3MgKi8KKyNkZWZpbmUgUERfRE1BX09QU19NQVNLCQkoMVVMIDw8IDApIC8qIGRvbWFpbiB1c2VkIGZvciBkbWFfb3BzICovCisjZGVmaW5lIFBEX0RFRkFVTFRfTUFTSwkJKDFVTCA8PCAxKSAvKiBkb21haW4gaXMgYSBkZWZhdWx0IGRtYV9vcHMKKwkJCQkJICAgICAgZG9tYWluIGZvciBhbiBJT01NVSAqLworI2RlZmluZSBQRF9QQVNTVEhST1VHSF9NQVNLCSgxVUwgPDwgMikgLyogZG9tYWluIGhhcyBubyBwYWdlCisJCQkJCSAgICAgIHRyYW5zbGF0aW9uICovCisKK2V4dGVybiBib29sIGFtZF9pb21tdV9kdW1wOworI2RlZmluZSBEVU1QX3ByaW50ayhmb3JtYXQsIGFyZy4uLikJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChhbWRfaW9tbXVfZHVtcCkJCQkJCQlcCisJCQlwcmludGsoS0VSTl9JTkZPICJBTUQtVmk6ICIgZm9ybWF0LCAjIyBhcmcpOwlcCisJfSB3aGlsZSgwKTsKKworLyogZ2xvYmFsIGZsYWcgaWYgSU9NTVVzIGNhY2hlIG5vbi1wcmVzZW50IGVudHJpZXMgKi8KK2V4dGVybiBib29sIGFtZF9pb21tdV9ucF9jYWNoZTsKKy8qIE9ubHkgdHJ1ZSBpZiBhbGwgSU9NTVVzIHN1cHBvcnQgZGV2aWNlIElPVExCcyAqLworZXh0ZXJuIGJvb2wgYW1kX2lvbW11X2lvdGxiX3N1cDsKKworLyoKKyAqIE1ha2UgaXRlcmF0aW5nIG92ZXIgYWxsIElPTU1VcyBlYXNpZXIKKyAqLworI2RlZmluZSBmb3JfZWFjaF9pb21tdShpb21tdSkgXAorCWxpc3RfZm9yX2VhY2hfZW50cnkoKGlvbW11KSwgJmFtZF9pb21tdV9saXN0LCBsaXN0KQorI2RlZmluZSBmb3JfZWFjaF9pb21tdV9zYWZlKGlvbW11LCBuZXh0KSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKChpb21tdSksIChuZXh0KSwgJmFtZF9pb21tdV9saXN0LCBsaXN0KQorCisjZGVmaW5lIEFQRVJUVVJFX1JBTkdFX1NISUZUCTI3CS8qIDEyOCBNQiAqLworI2RlZmluZSBBUEVSVFVSRV9SQU5HRV9TSVpFCSgxVUxMIDw8IEFQRVJUVVJFX1JBTkdFX1NISUZUKQorI2RlZmluZSBBUEVSVFVSRV9SQU5HRV9QQUdFUwkoQVBFUlRVUkVfUkFOR0VfU0laRSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBBUEVSVFVSRV9NQVhfUkFOR0VTCTMyCS8qIGFsbG93cyA0R0Igb2YgRE1BIGFkZHJlc3Mgc3BhY2UgKi8KKyNkZWZpbmUgQVBFUlRVUkVfUkFOR0VfSU5ERVgoYSkJKChhKSA+PiBBUEVSVFVSRV9SQU5HRV9TSElGVCkKKyNkZWZpbmUgQVBFUlRVUkVfUEFHRV9JTkRFWChhKQkoKChhKSA+PiAyMSkgJiAweDNmVUxMKQorCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZ2VuZXJpYyBkYXRhIGZvciAgSU9NTVUgcHJvdGVjdGlvbiBkb21haW5zCisgKiBpbmRlcGVuZGVudCBvZiB0aGVpciB1c2UuCisgKi8KK3N0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAgLyogZm9yIGxpc3Qgb2YgYWxsIHByb3RlY3Rpb24gZG9tYWlucyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2X2xpc3Q7IC8qIExpc3Qgb2YgYWxsIGRldmljZXMgaW4gdGhpcyBkb21haW4gKi8KKwlzcGlubG9ja190IGxvY2s7CS8qIG1vc3RseSB1c2VkIHRvIGxvY2sgdGhlIHBhZ2UgdGFibGUqLworCXN0cnVjdCBtdXRleCBhcGlfbG9jazsJLyogcHJvdGVjdCBwYWdlIHRhYmxlcyBpbiB0aGUgaW9tbXUtYXBpIHBhdGggKi8KKwl1MTYgaWQ7CQkJLyogdGhlIGRvbWFpbiBpZCB3cml0dGVuIHRvIHRoZSBkZXZpY2UgdGFibGUgKi8KKwlpbnQgbW9kZTsJCS8qIHBhZ2luZyBtb2RlICgwLTYgbGV2ZWxzKSAqLworCXU2NCAqcHRfcm9vdDsJCS8qIHBhZ2UgdGFibGUgcm9vdCBwb2ludGVyICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsJLyogZmxhZ3MgdG8gZmluZCBvdXQgdHlwZSBvZiBkb21haW4gKi8KKwlib29sIHVwZGF0ZWQ7CQkvKiBjb21wbGV0ZSBkb21haW4gZmx1c2ggcmVxdWlyZWQgKi8KKwl1bnNpZ25lZCBkZXZfY250OwkvKiBkZXZpY2VzIGFzc2lnbmVkIHRvIHRoaXMgZG9tYWluICovCisJdW5zaWduZWQgZGV2X2lvbW11W01BWF9JT01NVVNdOyAvKiBwZXItSU9NTVUgcmVmZXJlbmNlIGNvdW50ICovCisJdm9pZCAqcHJpdjsJCS8qIHByaXZhdGUgZGF0YSAqLworCit9OworCisvKgorICogVGhpcyBzdHJ1Y3QgY29udGFpbnMgZGV2aWNlIHNwZWNpZmljIGRhdGEgZm9yIHRoZSBJT01NVQorICovCitzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCSAgLyogRm9yIGRvbWFpbi0+ZGV2X2xpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9kYXRhX2xpc3Q7CSAgLyogRm9yIGdsb2JhbCBkZXZfZGF0YV9saXN0ICovCisJc3RydWN0IGlvbW11X2Rldl9kYXRhICphbGlhc19kYXRhOy8qIFRoZSBhbGlhcyBkZXZfZGF0YSAqLworCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluOyAvKiBEb21haW4gdGhlIGRldmljZSBpcyBib3VuZCB0byAqLworCWF0b21pY190IGJpbmQ7CQkJICAvKiBEb21haW4gYXR0YWNoIHJldmVyZW50IGNvdW50ICovCisJdTE2IGRldmlkOwkJCSAgLyogUENJIERldmljZSBJRCAqLworCXN0cnVjdCB7CisJCWJvb2wgZW5hYmxlZDsKKwkJaW50IHFkZXA7CisJfSBhdHM7CQkJCSAgLyogQVRTIHN0YXRlICovCit9OworCisvKgorICogRm9yIGR5bmFtaWMgZ3Jvd3RoIHRoZSBhcGVydHVyZSBzaXplIGlzIHNwbGl0IGludG8gcmFuZ2VzIG9mIDEyOE1CIG9mCisgKiBETUEgYWRkcmVzcyBzcGFjZSBlYWNoLiBUaGlzIHN0cnVjdCByZXByZXNlbnRzIG9uZSBzdWNoIHJhbmdlLgorICovCitzdHJ1Y3QgYXBlcnR1cmVfcmFuZ2UgeworCisJLyogYWRkcmVzcyBhbGxvY2F0aW9uIGJpdG1hcCAqLworCXVuc2lnbmVkIGxvbmcgKmJpdG1hcDsKKworCS8qCisJICogQXJyYXkgb2YgUFRFIHBhZ2VzIGZvciB0aGUgYXBlcnR1cmUuIEluIHRoaXMgYXJyYXkgd2Ugc2F2ZSBhbGwgdGhlCisJICogbGVhZiBwYWdlcyBvZiB0aGUgZG9tYWluIHBhZ2UgdGFibGUgdXNlZCBmb3IgdGhlIGFwZXJ0dXJlLiBUaGlzIHdheQorCSAqIHdlIGRvbid0IG5lZWQgdG8gd2FsayB0aGUgcGFnZSB0YWJsZSB0byBmaW5kIGEgc3BlY2lmaWMgUFRFLiBXZSBjYW4KKwkgKiBqdXN0IGNhbGN1bGF0ZSBpdHMgYWRkcmVzcyBpbiBjb25zdGFudCB0aW1lLgorCSAqLworCXU2NCAqcHRlX3BhZ2VzWzY0XTsKKworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworfTsKKworLyoKKyAqIERhdGEgY29udGFpbmVyIGZvciBhIGRtYV9vcHMgc3BlY2lmaWMgcHJvdGVjdGlvbiBkb21haW4KKyAqLworc3RydWN0IGRtYV9vcHNfZG9tYWluIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBnZW5lcmljIHByb3RlY3Rpb24gZG9tYWluIGluZm9ybWF0aW9uICovCisJc3RydWN0IHByb3RlY3Rpb25fZG9tYWluIGRvbWFpbjsKKworCS8qIHNpemUgb2YgdGhlIGFwZXJ0dXJlIGZvciB0aGUgbWFwcGluZ3MgKi8KKwl1bnNpZ25lZCBsb25nIGFwZXJ0dXJlX3NpemU7CisKKwkvKiBhZGRyZXNzIHdlIHN0YXJ0IHRvIHNlYXJjaCBmb3IgZnJlZSBhZGRyZXNzZXMgKi8KKwl1bnNpZ25lZCBsb25nIG5leHRfYWRkcmVzczsKKworCS8qIGFkZHJlc3Mgc3BhY2UgcmVsZXZhbnQgZGF0YSAqLworCXN0cnVjdCBhcGVydHVyZV9yYW5nZSAqYXBlcnR1cmVbQVBFUlRVUkVfTUFYX1JBTkdFU107CisKKwkvKiBUaGlzIHdpbGwgYmUgc2V0IHRvIHRydWUgd2hlbiBUTEIgbmVlZHMgdG8gYmUgZmx1c2hlZCAqLworCWJvb2wgbmVlZF9mbHVzaDsKKworCS8qCisJICogaWYgdGhpcyBpcyBhIHByZWFsbG9jYXRlZCBkb21haW4sIGtlZXAgdGhlIGRldmljZSBmb3Igd2hpY2ggaXQgd2FzCisJICogcHJlYWxsb2NhdGVkIGluIHRoaXMgdmFyaWFibGUKKwkgKi8KKwl1MTYgdGFyZ2V0X2RldjsKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgd2hlcmUgd2Ugc2F2ZSBpbmZvcm1hdGlvbiBhYm91dCBvbmUgaGFyZHdhcmUgQU1EIElPTU1VIGluIHRoZQorICogc3lzdGVtLgorICovCitzdHJ1Y3QgYW1kX2lvbW11IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBJbmRleCB3aXRoaW4gdGhlIElPTU1VIGFycmF5ICovCisJaW50IGluZGV4OworCisJLyogbG9ja3MgdGhlIGFjY2Vzc2VzIHRvIHRoZSBoYXJkd2FyZSAqLworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qIFBvaW50ZXIgdG8gUENJIGRldmljZSBvZiB0aGlzIElPTU1VICovCisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgTU1JTyBzcGFjZSAqLworCXU2NCBtbWlvX3BoeXM7CisJLyogdmlydHVhbCBhZGRyZXNzIG9mIE1NSU8gc3BhY2UgKi8KKwl1OCAqbW1pb19iYXNlOworCisJLyogY2FwYWJpbGl0aWVzIG9mIHRoYXQgSU9NTVUgcmVhZCBmcm9tIEFDUEkgKi8KKwl1MzIgY2FwOworCisJLyogZmxhZ3MgcmVhZCBmcm9tIGFjcGkgdGFibGUgKi8KKwl1OCBhY3BpX2ZsYWdzOworCisJLyogRXh0ZW5kZWQgZmVhdHVyZXMgKi8KKwl1NjQgZmVhdHVyZXM7CisKKwkvKgorCSAqIENhcGFiaWxpdHkgcG9pbnRlci4gVGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBJT01NVSBwZXIgUENJCisJICogZGV2aWNlIGZ1bmN0aW9uIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIEFNRCBJT01NVSBjYXBhYmlsaXR5CisJICogcG9pbnRlcnMuCisJICovCisJdTE2IGNhcF9wdHI7CisKKwkvKiBwY2kgZG9tYWluIG9mIHRoaXMgSU9NTVUgKi8KKwl1MTYgcGNpX3NlZzsKKworCS8qIGZpcnN0IGRldmljZSB0aGlzIElPTU1VIGhhbmRsZXMuIHJlYWQgZnJvbSBQQ0kgKi8KKwl1MTYgZmlyc3RfZGV2aWNlOworCS8qIGxhc3QgZGV2aWNlIHRoaXMgSU9NTVUgaGFuZGxlcy4gcmVhZCBmcm9tIFBDSSAqLworCXUxNiBsYXN0X2RldmljZTsKKworCS8qIHN0YXJ0IG9mIGV4Y2x1c2lvbiByYW5nZSBvZiB0aGF0IElPTU1VICovCisJdTY0IGV4Y2x1c2lvbl9zdGFydDsKKwkvKiBsZW5ndGggb2YgZXhjbHVzaW9uIHJhbmdlIG9mIHRoYXQgSU9NTVUgKi8KKwl1NjQgZXhjbHVzaW9uX2xlbmd0aDsKKworCS8qIGNvbW1hbmQgYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyAqLworCXU4ICpjbWRfYnVmOworCS8qIHNpemUgb2YgY29tbWFuZCBidWZmZXIgKi8KKwl1MzIgY21kX2J1Zl9zaXplOworCisJLyogc2l6ZSBvZiBldmVudCBidWZmZXIgKi8KKwl1MzIgZXZ0X2J1Zl9zaXplOworCS8qIGV2ZW50IGJ1ZmZlciB2aXJ0dWFsIGFkZHJlc3MgKi8KKwl1OCAqZXZ0X2J1ZjsKKwkvKiBNU0kgbnVtYmVyIGZvciBldmVudCBpbnRlcnJ1cHQgKi8KKwl1MTYgZXZ0X21zaV9udW07CisKKwkvKiB0cnVlIGlmIGludGVycnVwdHMgZm9yIHRoaXMgSU9NTVUgYXJlIGFscmVhZHkgZW5hYmxlZCAqLworCWJvb2wgaW50X2VuYWJsZWQ7CisKKwkvKiBpZiBvbmUsIHdlIG5lZWQgdG8gc2VuZCBhIGNvbXBsZXRpb24gd2FpdCBjb21tYW5kICovCisJYm9vbCBuZWVkX3N5bmM7CisKKwkvKiBkZWZhdWx0IGRtYV9vcHMgZG9tYWluIGZvciB0aGF0IElPTU1VICovCisJc3RydWN0IGRtYV9vcHNfZG9tYWluICpkZWZhdWx0X2RvbTsKKworCS8qCisJICogV2UgY2FuJ3QgcmVseSBvbiB0aGUgQklPUyB0byByZXN0b3JlIGFsbCB2YWx1ZXMgb24gcmVpbml0LCBzbyB3ZQorCSAqIG5lZWQgdG8gc3Rhc2ggdGhlbQorCSAqLworCisJLyogVGhlIGlvbW11IEJBUiAqLworCXUzMiBzdG9yZWRfYWRkcl9sbzsKKwl1MzIgc3RvcmVkX2FkZHJfaGk7CisKKwkvKgorCSAqIEVhY2ggaW9tbXUgaGFzIDYgbDFzLCBlYWNoIG9mIHdoaWNoIGlzIGRvY3VtZW50ZWQgYXMgaGF2aW5nIDB4MTIKKwkgKiByZWdpc3RlcnMKKwkgKi8KKwl1MzIgc3RvcmVkX2wxWzZdWzB4MTJdOworCisJLyogVGhlIGwyIGluZGlyZWN0IHJlZ2lzdGVycyAqLworCXUzMiBzdG9yZWRfbDJbMHg4M107Cit9OworCisvKgorICogTGlzdCB3aXRoIGFsbCBJT01NVXMgaW4gdGhlIHN5c3RlbS4gVGhpcyBsaXN0IGlzIG5vdCBsb2NrZWQgYmVjYXVzZSBpdCBpcworICogb25seSB3cml0dGVuIGFuZCByZWFkIGF0IGRyaXZlciBpbml0aWFsaXphdGlvbiBvciBzdXNwZW5kIHRpbWUKKyAqLworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYW1kX2lvbW11X2xpc3Q7CisKKy8qCisgKiBBcnJheSB3aXRoIHBvaW50ZXJzIHRvIGVhY2ggSU9NTVUgc3RydWN0CisgKiBUaGUgaW5kaWNlcyBhcmUgcmVmZXJlbmNlZCBpbiB0aGUgcHJvdGVjdGlvbiBkb21haW5zCisgKi8KK2V4dGVybiBzdHJ1Y3QgYW1kX2lvbW11ICphbWRfaW9tbXVzW01BWF9JT01NVVNdOworCisvKiBOdW1iZXIgb2YgSU9NTVVzIHByZXNlbnQgaW4gdGhlIHN5c3RlbSAqLworZXh0ZXJuIGludCBhbWRfaW9tbXVzX3ByZXNlbnQ7CisKKy8qCisgKiBEZWNsYXJhdGlvbnMgZm9yIHRoZSBnbG9iYWwgbGlzdCBvZiBhbGwgcHJvdGVjdGlvbiBkb21haW5zCisgKi8KK2V4dGVybiBzcGlubG9ja190IGFtZF9pb21tdV9wZF9sb2NrOworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYW1kX2lvbW11X3BkX2xpc3Q7CisKKy8qCisgKiBTdHJ1Y3R1cmUgZGVmaW5pbmcgb25lIGVudHJ5IGluIHRoZSBkZXZpY2UgdGFibGUKKyAqLworc3RydWN0IGRldl90YWJsZV9lbnRyeSB7CisJdTMyIGRhdGFbOF07Cit9OworCisvKgorICogT25lIGVudHJ5IGZvciB1bml0eSBtYXBwaW5ncyBwYXJzZWQgb3V0IG9mIHRoZSBBQ1BJIHRhYmxlLgorICovCitzdHJ1Y3QgdW5pdHlfbWFwX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBzdGFydGluZyBkZXZpY2UgaWQgdGhpcyBlbnRyeSBpcyB1c2VkIGZvciAoaW5jbHVkaW5nKSAqLworCXUxNiBkZXZpZF9zdGFydDsKKwkvKiBlbmQgZGV2aWNlIGlkIHRoaXMgZW50cnkgaXMgdXNlZCBmb3IgKGluY2x1ZGluZykgKi8KKwl1MTYgZGV2aWRfZW5kOworCisJLyogc3RhcnQgYWRkcmVzcyB0byB1bml0eSBtYXAgKGluY2x1ZGluZykgKi8KKwl1NjQgYWRkcmVzc19zdGFydDsKKwkvKiBlbmQgYWRkcmVzcyB0byB1bml0eSBtYXAgKGluY2x1ZGluZykgKi8KKwl1NjQgYWRkcmVzc19lbmQ7CisKKwkvKiByZXF1aXJlZCBwcm90ZWN0aW9uICovCisJaW50IHByb3Q7Cit9OworCisvKgorICogTGlzdCBvZiBhbGwgdW5pdHkgbWFwcGluZ3MuIEl0IGlzIG5vdCBsb2NrZWQgYmVjYXVzZSBhcyBydW50aW1lIGl0IGlzIG9ubHkKKyAqIHJlYWQuIEl0IGlzIGNyZWF0ZWQgYXQgQUNQSSB0YWJsZSBwYXJzaW5nIHRpbWUuCisgKi8KK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGFtZF9pb21tdV91bml0eV9tYXA7CisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZXMgZm9yIGRldmljZSBoYW5kbGluZworICovCisKKy8qCisgKiBEZXZpY2UgdGFibGUgdXNlZCBieSBoYXJkd2FyZS4gUmVhZCBhbmQgd3JpdGUgYWNjZXNzZXMgYnkgc29mdHdhcmUgYXJlCisgKiBsb2NrZWQgd2l0aCB0aGUgYW1kX2lvbW11X3BkX3RhYmxlIGxvY2suCisgKi8KK2V4dGVybiBzdHJ1Y3QgZGV2X3RhYmxlX2VudHJ5ICphbWRfaW9tbXVfZGV2X3RhYmxlOworCisvKgorICogQWxpYXMgdGFibGUgdG8gZmluZCByZXF1ZXN0b3IgaWRzIHRvIGRldmljZSBpZHMuIE5vdCBsb2NrZWQgYmVjYXVzZSBvbmx5CisgKiByZWFkIG9uIHJ1bnRpbWUuCisgKi8KK2V4dGVybiB1MTYgKmFtZF9pb21tdV9hbGlhc190YWJsZTsKKworLyoKKyAqIFJldmVyc2UgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIElPTU1VIHdoaWNoIHRyYW5zbGF0ZXMgYSBzcGVjaWZpYyBkZXZpY2UuCisgKi8KK2V4dGVybiBzdHJ1Y3QgYW1kX2lvbW11ICoqYW1kX2lvbW11X3Jsb29rdXBfdGFibGU7CisKKy8qIHNpemUgb2YgdGhlIGRtYV9vcHMgYXBlcnR1cmUgYXMgcG93ZXIgb2YgMiAqLworZXh0ZXJuIHVuc2lnbmVkIGFtZF9pb21tdV9hcGVydHVyZV9vcmRlcjsKKworLyogbGFyZ2VzdCBQQ0kgZGV2aWNlIGlkIHdlIGV4cGVjdCB0cmFuc2xhdGlvbiByZXF1ZXN0cyBmb3IgKi8KK2V4dGVybiB1MTYgYW1kX2lvbW11X2xhc3RfYmRmOworCisvKiBhbGxvY2F0aW9uIGJpdG1hcCBmb3IgZG9tYWluIGlkcyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKmFtZF9pb21tdV9wZF9hbGxvY19iaXRtYXA7CisKKy8qCisgKiBJZiB0cnVlLCB0aGUgYWRkcmVzc2VzIHdpbGwgYmUgZmx1c2hlZCBvbiB1bm1hcCB0aW1lLCBub3Qgd2hlbgorICogdGhleSBhcmUgcmV1c2VkCisgKi8KK2V4dGVybiBib29sIGFtZF9pb21tdV91bm1hcF9mbHVzaDsKKworLyogdGFrZXMgYnVzIGFuZCBkZXZpY2UvZnVuY3Rpb24gYW5kIHJldHVybnMgdGhlIGRldmljZSBpZAorICogRklYTUU6IHNob3VsZCB0aGF0IGJlIGluIGdlbmVyaWMgUENJIGNvZGU/ICovCitzdGF0aWMgaW5saW5lIHUxNiBjYWxjX2RldmlkKHU4IGJ1cywgdTggZGV2Zm4pCit7CisJcmV0dXJuICgoKHUxNilidXMpIDw8IDgpIHwgZGV2Zm47Cit9CisKKyNpZmRlZiBDT05GSUdfQU1EX0lPTU1VX1NUQVRTCisKK3N0cnVjdCBfX2lvbW11X2NvdW50ZXIgeworCWNoYXIgKm5hbWU7CisJc3RydWN0IGRlbnRyeSAqZGVudDsKKwl1NjQgdmFsdWU7Cit9OworCisjZGVmaW5lIERFQ0xBUkVfU1RBVFNfQ09VTlRFUihubSkgXAorCXN0YXRpYyBzdHJ1Y3QgX19pb21tdV9jb3VudGVyIG5tID0gewlcCisJCS5uYW1lID0gI25tLAkJCVwKKwl9CisKKyNkZWZpbmUgSU5DX1NUQVRTX0NPVU5URVIobmFtZSkJCW5hbWUudmFsdWUgKz0gMQorI2RlZmluZSBBRERfU1RBVFNfQ09VTlRFUihuYW1lLCB4KQluYW1lLnZhbHVlICs9ICh4KQorI2RlZmluZSBTVUJfU1RBVFNfQ09VTlRFUihuYW1lLCB4KQluYW1lLnZhbHVlIC09ICh4KQorCisjZWxzZSAvKiBDT05GSUdfQU1EX0lPTU1VX1NUQVRTICovCisKKyNkZWZpbmUgREVDTEFSRV9TVEFUU19DT1VOVEVSKG5hbWUpCisjZGVmaW5lIElOQ19TVEFUU19DT1VOVEVSKG5hbWUpCisjZGVmaW5lIEFERF9TVEFUU19DT1VOVEVSKG5hbWUsIHgpCisjZGVmaW5lIFNVQl9TVEFUU19DT1VOVEVSKG5hbWUsIHgpCisKKyNlbmRpZiAvKiBDT05GSUdfQU1EX0lPTU1VX1NUQVRTICovCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9BTURfSU9NTVVfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvZG1hci5jIGIvZHJpdmVycy9pb21tdS9kbWFyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcGNpL2RtYXIuYwpyZW5hbWUgdG8gZHJpdmVycy9pb21tdS9kbWFyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvaW50ZWwtaW9tbXUuYyBiL2RyaXZlcnMvaW9tbXUvaW50ZWwtaW9tbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjIxYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pb21tdS9pbnRlbC1pb21tdS5jCkBAIC0wLDAgKzEsNDAxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEFzaG9rIFJhaiA8YXNob2sucmFqQGludGVsLmNvbT4KKyAqIEF1dGhvcjogU2hhb2h1YSBMaSA8c2hhb2h1YS5saUBpbnRlbC5jb20+CisgKiBBdXRob3I6IEFuaWwgUyBLZXNoYXZhbXVydGh5IDxhbmlsLnMua2VzaGF2YW11cnRoeUBpbnRlbC5jb20+CisgKiBBdXRob3I6IEZlbmdodWEgWXUgPGZlbmdodWEueXVAaW50ZWwuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvdmEuaD4KKyNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVsLWlvbW11Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90Ym9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1hdHMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9pb21tdS5oPgorCisjZGVmaW5lIFJPT1RfU0laRQkJVlREX1BBR0VfU0laRQorI2RlZmluZSBDT05URVhUX1NJWkUJCVZURF9QQUdFX1NJWkUKKworI2RlZmluZSBJU19CUklER0VfSE9TVF9ERVZJQ0UocGRldikgXAorCQkJICAgICgocGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUKQorI2RlZmluZSBJU19HRlhfREVWSUNFKHBkZXYpICgocGRldi0+Y2xhc3MgPj4gMTYpID09IFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkpCisjZGVmaW5lIElTX0lTQV9ERVZJQ0UocGRldikgKChwZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX0lTQSkKKyNkZWZpbmUgSVNfQVpBTElBKHBkZXYpICgocGRldiktPnZlbmRvciA9PSAweDgwODYgJiYgKHBkZXYpLT5kZXZpY2UgPT0gMHgzYTNlKQorCisjZGVmaW5lIElPQVBJQ19SQU5HRV9TVEFSVAkoMHhmZWUwMDAwMCkKKyNkZWZpbmUgSU9BUElDX1JBTkdFX0VORAkoMHhmZWVmZmZmZikKKyNkZWZpbmUgSU9WQV9TVEFSVF9BRERSCQkoMHgxMDAwKQorCisjZGVmaW5lIERFRkFVTFRfRE9NQUlOX0FERFJFU1NfV0lEVEggNDgKKworI2RlZmluZSBNQVhfQUdBV19XSURUSCA2NAorCisjZGVmaW5lIF9fRE9NQUlOX01BWF9QRk4oZ2F3KSAgKCgoKHVpbnQ2NF90KTEpIDw8IChnYXctVlREX1BBR0VfU0hJRlQpKSAtIDEpCisjZGVmaW5lIF9fRE9NQUlOX01BWF9BRERSKGdhdykgKCgoKHVpbnQ2NF90KTEpIDw8IGdhdykgLSAxKQorCisvKiBXZSBsaW1pdCBET01BSU5fTUFYX1BGTiB0byBmaXQgaW4gYW4gdW5zaWduZWQgbG9uZywgYW5kIERPTUFJTl9NQVhfQUREUgorICAgdG8gbWF0Y2guIFRoYXQgd2F5LCB3ZSBjYW4gdXNlICd1bnNpZ25lZCBsb25nJyBmb3IgUEZOcyB3aXRoIGltcHVuaXR5LiAqLworI2RlZmluZSBET01BSU5fTUFYX1BGTihnYXcpCSgodW5zaWduZWQgbG9uZykgbWluX3QodWludDY0X3QsIFwKKwkJCQlfX0RPTUFJTl9NQVhfUEZOKGdhdyksICh1bnNpZ25lZCBsb25nKS0xKSkKKyNkZWZpbmUgRE9NQUlOX01BWF9BRERSKGdhdykJKCgodWludDY0X3QpX19ET01BSU5fTUFYX1BGTihnYXcpKSA8PCBWVERfUEFHRV9TSElGVCkKKworI2RlZmluZSBJT1ZBX1BGTihhZGRyKQkJKChhZGRyKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBETUFfMzJCSVRfUEZOCQlJT1ZBX1BGTihETUFfQklUX01BU0soMzIpKQorI2RlZmluZSBETUFfNjRCSVRfUEZOCQlJT1ZBX1BGTihETUFfQklUX01BU0soNjQpKQorCisvKiBwYWdlIHRhYmxlIGhhbmRsaW5nICovCisjZGVmaW5lIExFVkVMX1NUUklERQkJKDkpCisjZGVmaW5lIExFVkVMX01BU0sJCSgoKHU2NCkxIDw8IExFVkVMX1NUUklERSkgLSAxKQorCitzdGF0aWMgaW5saW5lIGludCBhZ2F3X3RvX2xldmVsKGludCBhZ2F3KQoreworCXJldHVybiBhZ2F3ICsgMjsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWdhd190b193aWR0aChpbnQgYWdhdykKK3sKKwlyZXR1cm4gMzAgKyBhZ2F3ICogTEVWRUxfU1RSSURFOworfQorCitzdGF0aWMgaW5saW5lIGludCB3aWR0aF90b19hZ2F3KGludCB3aWR0aCkKK3sKKwlyZXR1cm4gKHdpZHRoIC0gMzApIC8gTEVWRUxfU1RSSURFOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBsZXZlbF90b19vZmZzZXRfYml0cyhpbnQgbGV2ZWwpCit7CisJcmV0dXJuIChsZXZlbCAtIDEpICogTEVWRUxfU1RSSURFOworfQorCitzdGF0aWMgaW5saW5lIGludCBwZm5fbGV2ZWxfb2Zmc2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbGV2ZWwpCit7CisJcmV0dXJuIChwZm4gPj4gbGV2ZWxfdG9fb2Zmc2V0X2JpdHMobGV2ZWwpKSAmIExFVkVMX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsZXZlbF9tYXNrKGludCBsZXZlbCkKK3sKKwlyZXR1cm4gLTFVTCA8PCBsZXZlbF90b19vZmZzZXRfYml0cyhsZXZlbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsZXZlbF9zaXplKGludCBsZXZlbCkKK3sKKwlyZXR1cm4gMVVMIDw8IGxldmVsX3RvX29mZnNldF9iaXRzKGxldmVsKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFsaWduX3RvX2xldmVsKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbGV2ZWwpCit7CisJcmV0dXJuIChwZm4gKyBsZXZlbF9zaXplKGxldmVsKSAtIDEpICYgbGV2ZWxfbWFzayhsZXZlbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsdmxfdG9fbnJfcGFnZXModW5zaWduZWQgaW50IGx2bCkKK3sKKwlyZXR1cm4gIDEgPDwgKChsdmwgLSAxKSAqIExFVkVMX1NUUklERSk7Cit9CisKKy8qIFZULWQgcGFnZXMgbXVzdCBhbHdheXMgYmUgX3NtYWxsZXJfIHRoYW4gTU0gcGFnZXMuIE90aGVyd2lzZSB0aGluZ3MKKyAgIGFyZSBuZXZlciBnb2luZyB0byB3b3JrLiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRtYV90b19tbV9wZm4odW5zaWduZWQgbG9uZyBkbWFfcGZuKQoreworCXJldHVybiBkbWFfcGZuID4+IChQQUdFX1NISUZUIC0gVlREX1BBR0VfU0hJRlQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW1fdG9fZG1hX3Bmbih1bnNpZ25lZCBsb25nIG1tX3BmbikKK3sKKwlyZXR1cm4gbW1fcGZuIDw8IChQQUdFX1NISUZUIC0gVlREX1BBR0VfU0hJRlQpOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBhZ2VfdG9fZG1hX3BmbihzdHJ1Y3QgcGFnZSAqcGcpCit7CisJcmV0dXJuIG1tX3RvX2RtYV9wZm4ocGFnZV90b19wZm4ocGcpKTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX2RtYV9wZm4odm9pZCAqcCkKK3sKKwlyZXR1cm4gcGFnZV90b19kbWFfcGZuKHZpcnRfdG9fcGFnZShwKSk7Cit9CisKKy8qIGdsb2JhbCBpb21tdSBsaXN0LCBzZXQgTlVMTCBmb3IgaWdub3JlZCBETUFSIHVuaXRzICovCitzdGF0aWMgc3RydWN0IGludGVsX2lvbW11ICoqZ19pb21tdXM7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjaGVja190eWxlcnNidXJnX2lzb2NoKHZvaWQpOworc3RhdGljIGludCByd2JmX3F1aXJrOworCisvKgorICogc2V0IHRvIDEgdG8gcGFuaWMga2VybmVsIGlmIGNhbid0IHN1Y2Nlc3NmdWxseSBlbmFibGUgVlQtZAorICogKHVzZWQgd2hlbiBrZXJuZWwgaXMgbGF1bmNoZWQgdy8gVFhUKQorICovCitzdGF0aWMgaW50IGZvcmNlX29uID0gMDsKKworLyoKKyAqIDA6IFByZXNlbnQKKyAqIDEtMTE6IFJlc2VydmVkCisgKiAxMi02MzogQ29udGV4dCBQdHIgKDEyIC0gKGhhdy0xKSkKKyAqIDY0LTEyNzogUmVzZXJ2ZWQKKyAqLworc3RydWN0IHJvb3RfZW50cnkgeworCXU2NAl2YWw7CisJdTY0CXJzdmQxOworfTsKKyNkZWZpbmUgUk9PVF9FTlRSWV9OUiAoVlREX1BBR0VfU0laRS9zaXplb2Yoc3RydWN0IHJvb3RfZW50cnkpKQorc3RhdGljIGlubGluZSBib29sIHJvb3RfcHJlc2VudChzdHJ1Y3Qgcm9vdF9lbnRyeSAqcm9vdCkKK3sKKwlyZXR1cm4gKHJvb3QtPnZhbCAmIDEpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9yb290X3ByZXNlbnQoc3RydWN0IHJvb3RfZW50cnkgKnJvb3QpCit7CisJcm9vdC0+dmFsIHw9IDE7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Jvb3RfdmFsdWUoc3RydWN0IHJvb3RfZW50cnkgKnJvb3QsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJcm9vdC0+dmFsIHw9IHZhbHVlICYgVlREX1BBR0VfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY29udGV4dF9lbnRyeSAqCitnZXRfY29udGV4dF9hZGRyX2Zyb21fcm9vdChzdHJ1Y3Qgcm9vdF9lbnRyeSAqcm9vdCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBjb250ZXh0X2VudHJ5ICopCisJCShyb290X3ByZXNlbnQocm9vdCk/cGh5c190b192aXJ0KAorCQlyb290LT52YWwgJiBWVERfUEFHRV9NQVNLKSA6CisJCU5VTEwpOworfQorCisvKgorICogbG93IDY0IGJpdHM6CisgKiAwOiBwcmVzZW50CisgKiAxOiBmYXVsdCBwcm9jZXNzaW5nIGRpc2FibGUKKyAqIDItMzogdHJhbnNsYXRpb24gdHlwZQorICogMTItNjM6IGFkZHJlc3Mgc3BhY2Ugcm9vdAorICogaGlnaCA2NCBiaXRzOgorICogMC0yOiBhZGRyZXNzIHdpZHRoCisgKiAzLTY6IGF2YWwKKyAqIDgtMjM6IGRvbWFpbiBpZAorICovCitzdHJ1Y3QgY29udGV4dF9lbnRyeSB7CisJdTY0IGxvOworCXU2NCBoaTsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjb250ZXh0X3ByZXNlbnQoc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQpCit7CisJcmV0dXJuIChjb250ZXh0LT5sbyAmIDEpOworfQorc3RhdGljIGlubGluZSB2b2lkIGNvbnRleHRfc2V0X3ByZXNlbnQoc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQpCit7CisJY29udGV4dC0+bG8gfD0gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbnRleHRfc2V0X2ZhdWx0X2VuYWJsZShzdHJ1Y3QgY29udGV4dF9lbnRyeSAqY29udGV4dCkKK3sKKwljb250ZXh0LT5sbyAmPSAoKCh1NjQpLTEpIDw8IDIpIHwgMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbnRleHRfc2V0X3RyYW5zbGF0aW9uX3R5cGUoc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQsCisJCQkJCQl1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCWNvbnRleHQtPmxvICY9ICgoKHU2NCktMSkgPDwgNCkgfCAzOworCWNvbnRleHQtPmxvIHw9ICh2YWx1ZSAmIDMpIDw8IDI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb250ZXh0X3NldF9hZGRyZXNzX3Jvb3Qoc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCWNvbnRleHQtPmxvIHw9IHZhbHVlICYgVlREX1BBR0VfTUFTSzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbnRleHRfc2V0X2FkZHJlc3Nfd2lkdGgoc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwljb250ZXh0LT5oaSB8PSB2YWx1ZSAmIDc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb250ZXh0X3NldF9kb21haW5faWQoc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQsCisJCQkJCSB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCWNvbnRleHQtPmhpIHw9ICh2YWx1ZSAmICgoMSA8PCAxNikgLSAxKSkgPDwgODsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbnRleHRfY2xlYXJfZW50cnkoc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQpCit7CisJY29udGV4dC0+bG8gPSAwOworCWNvbnRleHQtPmhpID0gMDsKK30KKworLyoKKyAqIDA6IHJlYWRhYmxlCisgKiAxOiB3cml0YWJsZQorICogMi02OiByZXNlcnZlZAorICogNzogc3VwZXIgcGFnZQorICogOC0xMDogYXZhaWxhYmxlCisgKiAxMTogc25vb3AgYmVoYXZpb3IKKyAqIDEyLTYzOiBIb3N0IHBoeXNjaWFsIGFkZHJlc3MKKyAqLworc3RydWN0IGRtYV9wdGUgeworCXU2NCB2YWw7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2NsZWFyX3B0ZShzdHJ1Y3QgZG1hX3B0ZSAqcHRlKQoreworCXB0ZS0+dmFsID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9zZXRfcHRlX3JlYWRhYmxlKHN0cnVjdCBkbWFfcHRlICpwdGUpCit7CisJcHRlLT52YWwgfD0gRE1BX1BURV9SRUFEOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3NldF9wdGVfd3JpdGFibGUoc3RydWN0IGRtYV9wdGUgKnB0ZSkKK3sKKwlwdGUtPnZhbCB8PSBETUFfUFRFX1dSSVRFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3NldF9wdGVfc25wKHN0cnVjdCBkbWFfcHRlICpwdGUpCit7CisJcHRlLT52YWwgfD0gRE1BX1BURV9TTlA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc2V0X3B0ZV9wcm90KHN0cnVjdCBkbWFfcHRlICpwdGUsIHVuc2lnbmVkIGxvbmcgcHJvdCkKK3sKKwlwdGUtPnZhbCA9IChwdGUtPnZhbCAmIH4zKSB8IChwcm90ICYgMyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IGRtYV9wdGVfYWRkcihzdHJ1Y3QgZG1hX3B0ZSAqcHRlKQoreworI2lmZGVmIENPTkZJR182NEJJVAorCXJldHVybiBwdGUtPnZhbCAmIFZURF9QQUdFX01BU0s7CisjZWxzZQorCS8qIE11c3QgaGF2ZSBhIGZ1bGwgYXRvbWljIDY0LWJpdCByZWFkICovCisJcmV0dXJuICBfX2NtcHhjaGc2NCgmcHRlLT52YWwsIDBVTEwsIDBVTEwpICYgVlREX1BBR0VfTUFTSzsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3NldF9wdGVfcGZuKHN0cnVjdCBkbWFfcHRlICpwdGUsIHVuc2lnbmVkIGxvbmcgcGZuKQoreworCXB0ZS0+dmFsIHw9ICh1aW50NjRfdClwZm4gPDwgVlREX1BBR0VfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBkbWFfcHRlX3ByZXNlbnQoc3RydWN0IGRtYV9wdGUgKnB0ZSkKK3sKKwlyZXR1cm4gKHB0ZS0+dmFsICYgMykgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmlyc3RfcHRlX2luX3BhZ2Uoc3RydWN0IGRtYV9wdGUgKnB0ZSkKK3sKKwlyZXR1cm4gISgodW5zaWduZWQgbG9uZylwdGUgJiB+VlREX1BBR0VfTUFTSyk7Cit9CisKKy8qCisgKiBUaGlzIGRvbWFpbiBpcyBhIHN0YXRpY2FsbHkgaWRlbnRpdHkgbWFwcGluZyBkb21haW4uCisgKgkxLiBUaGlzIGRvbWFpbiBjcmVhdHMgYSBzdGF0aWMgMToxIG1hcHBpbmcgdG8gYWxsIHVzYWJsZSBtZW1vcnkuCisgKiAJMi4gSXQgbWFwcyB0byBlYWNoIGlvbW11IGlmIHN1Y2Nlc3NmdWwuCisgKgkzLiBFYWNoIGlvbW11IG1hcHBzIHRvIHRoaXMgZG9tYWluIGlmIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZG1hcl9kb21haW4gKnNpX2RvbWFpbjsKK3N0YXRpYyBpbnQgaHdfcGFzc190aHJvdWdoID0gMTsKKworLyogZGV2aWNlcyB1bmRlciB0aGUgc2FtZSBwMnAgYnJpZGdlIGFyZSBvd25lZCBpbiBvbmUgZG9tYWluICovCisjZGVmaW5lIERPTUFJTl9GTEFHX1AyUF9NVUxUSVBMRV9ERVZJQ0VTICgxIDw8IDApCisKKy8qIGRvbWFpbiByZXByZXNlbnRzIGEgdmlydHVhbCBtYWNoaW5lLCBtb3JlIHRoYW4gb25lIGRldmljZXMKKyAqIGFjcm9zcyBpb21tdXMgbWF5IGJlIG93bmVkIGluIG9uZSBkb21haW4sIGUuZy4ga3ZtIGd1ZXN0LgorICovCisjZGVmaW5lIERPTUFJTl9GTEFHX1ZJUlRVQUxfTUFDSElORQkoMSA8PCAxKQorCisvKiBzaV9kb21haW4gY29udGFpbnMgbXVsaXRwbGUgZGV2aWNlcyAqLworI2RlZmluZSBET01BSU5fRkxBR19TVEFUSUNfSURFTlRJVFkJKDEgPDwgMikKKworc3RydWN0IGRtYXJfZG9tYWluIHsKKwlpbnQJaWQ7CQkJLyogZG9tYWluIGlkICovCisJaW50CW5pZDsJCQkvKiBub2RlIGlkICovCisJdW5zaWduZWQgbG9uZyBpb21tdV9ibXA7CS8qIGJpdG1hcCBvZiBpb21tdXMgdGhpcyBkb21haW4gdXNlcyovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldmljZXM7IAkvKiBhbGwgZGV2aWNlcycgbGlzdCAqLworCXN0cnVjdCBpb3ZhX2RvbWFpbiBpb3ZhZDsJLyogaW92YSdzIHRoYXQgYmVsb25nIHRvIHRoaXMgZG9tYWluICovCisKKwlzdHJ1Y3QgZG1hX3B0ZQkqcGdkOwkJLyogdmlydHVhbCBhZGRyZXNzICovCisJaW50CQlnYXc7CQkvKiBtYXggZ3Vlc3QgYWRkcmVzcyB3aWR0aCAqLworCisJLyogYWRqdXN0ZWQgZ3Vlc3QgYWRkcmVzcyB3aWR0aCwgMCBpcyBsZXZlbCAyIDMwLWJpdCAqLworCWludAkJYWdhdzsKKworCWludAkJZmxhZ3M7CQkvKiBmbGFncyB0byBmaW5kIG91dCB0eXBlIG9mIGRvbWFpbiAqLworCisJaW50CQlpb21tdV9jb2hlcmVuY3k7LyogaW5kaWNhdGUgY29oZXJlbmN5IG9mIGlvbW11IGFjY2VzcyAqLworCWludAkJaW9tbXVfc25vb3Bpbmc7IC8qIGluZGljYXRlIHNub29waW5nIGNvbnRyb2wgZmVhdHVyZSovCisJaW50CQlpb21tdV9jb3VudDsJLyogcmVmZXJlbmNlIGNvdW50IG9mIGlvbW11ICovCisJaW50CQlpb21tdV9zdXBlcnBhZ2U7LyogTGV2ZWwgb2Ygc3VwZXJwYWdlcyBzdXBwb3J0ZWQ6CisJCQkJCSAgIDAgPT0gNEtpQiAobm8gc3VwZXJwYWdlcyksIDEgPT0gMk1pQiwKKwkJCQkJICAgMiA9PSAxR2lCLCAzID09IDUxMkdpQiwgNCA9PSAxVGlCICovCisJc3BpbmxvY2tfdAlpb21tdV9sb2NrOwkvKiBwcm90ZWN0IGlvbW11IHNldCBpbiBkb21haW4gKi8KKwl1NjQJCW1heF9hZGRyOwkvKiBtYXhpbXVtIG1hcHBlZCBhZGRyZXNzICovCit9OworCisvKiBQQ0kgZG9tYWluLWRldmljZSByZWxhdGlvbnNoaXAgKi8KK3N0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsJLyogbGluayB0byBkb21haW4gc2libGluZ3MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGdsb2JhbDsgLyogbGluayB0byBnbG9iYWwgbGlzdCAqLworCWludCBzZWdtZW50OwkJLyogUENJIGRvbWFpbiAqLworCXU4IGJ1czsJCQkvKiBQQ0kgYnVzIG51bWJlciAqLworCXU4IGRldmZuOwkJLyogUENJIGRldmZuIG51bWJlciAqLworCXN0cnVjdCBwY2lfZGV2ICpkZXY7IC8qIGl0J3MgTlVMTCBmb3IgUENJZS10by1QQ0kgYnJpZGdlICovCisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsgLyogSU9NTVUgdXNlZCBieSB0aGlzIGRldmljZSAqLworCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluOyAvKiBwb2ludGVyIHRvIGRvbWFpbiAqLworfTsKKworc3RhdGljIHZvaWQgZmx1c2hfdW5tYXBzX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKKworREVGSU5FX1RJTUVSKHVubWFwX3RpbWVyLCAgZmx1c2hfdW5tYXBzX3RpbWVvdXQsIDAsIDApOworCisjZGVmaW5lIEhJR0hfV0FURVJfTUFSSyAyNTAKK3N0cnVjdCBkZWZlcnJlZF9mbHVzaF90YWJsZXMgeworCWludCBuZXh0OworCXN0cnVjdCBpb3ZhICppb3ZhW0hJR0hfV0FURVJfTUFSS107CisJc3RydWN0IGRtYXJfZG9tYWluICpkb21haW5bSElHSF9XQVRFUl9NQVJLXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVmZXJyZWRfZmx1c2hfdGFibGVzICpkZWZlcnJlZF9mbHVzaDsKKworLyogYml0bWFwIGZvciBpbmRleGluZyBpbnRlbF9pb21tdXMgKi8KK3N0YXRpYyBpbnQgZ19udW1fb2ZfaW9tbXVzOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFzeW5jX3VtYXBfZmx1c2hfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKHVubWFwc190b19kbyk7CisKK3N0YXRpYyBpbnQgdGltZXJfb247CitzdGF0aWMgbG9uZyBsaXN0X3NpemU7CisKK3N0YXRpYyB2b2lkIGRvbWFpbl9yZW1vdmVfZGV2X2luZm8oc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pOworCisjaWZkZWYgQ09ORklHX0RNQVJfREVGQVVMVF9PTgoraW50IGRtYXJfZGlzYWJsZWQgPSAwOworI2Vsc2UKK2ludCBkbWFyX2Rpc2FibGVkID0gMTsKKyNlbmRpZiAvKkNPTkZJR19ETUFSX0RFRkFVTFRfT04qLworCitzdGF0aWMgaW50IGRtYXJfbWFwX2dmeCA9IDE7CitzdGF0aWMgaW50IGRtYXJfZm9yY2VkYWM7CitzdGF0aWMgaW50IGludGVsX2lvbW11X3N0cmljdDsKK3N0YXRpYyBpbnQgaW50ZWxfaW9tbXVfc3VwZXJwYWdlID0gMTsKKworI2RlZmluZSBEVU1NWV9ERVZJQ0VfRE9NQUlOX0lORk8gKChzdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvICopKC0xKSkKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGV2aWNlX2RvbWFpbl9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoZGV2aWNlX2RvbWFpbl9saXN0KTsKKworc3RhdGljIHN0cnVjdCBpb21tdV9vcHMgaW50ZWxfaW9tbXVfb3BzOworCitzdGF0aWMgaW50IF9faW5pdCBpbnRlbF9pb21tdV9zZXR1cChjaGFyICpzdHIpCit7CisJaWYgKCFzdHIpCisJCXJldHVybiAtRUlOVkFMOworCXdoaWxlICgqc3RyKSB7CisJCWlmICghc3RybmNtcChzdHIsICJvbiIsIDIpKSB7CisJCQlkbWFyX2Rpc2FibGVkID0gMDsKKwkJCXByaW50ayhLRVJOX0lORk8gIkludGVsLUlPTU1VOiBlbmFibGVkXG4iKTsKKwkJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJvZmYiLCAzKSkgeworCQkJZG1hcl9kaXNhYmxlZCA9IDE7CisJCQlwcmludGsoS0VSTl9JTkZPICJJbnRlbC1JT01NVTogZGlzYWJsZWRcbiIpOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgImlnZnhfb2ZmIiwgOCkpIHsKKwkJCWRtYXJfbWFwX2dmeCA9IDA7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIkludGVsLUlPTU1VOiBkaXNhYmxlIEdGWCBkZXZpY2UgbWFwcGluZ1xuIik7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAiZm9yY2VkYWMiLCA4KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJJbnRlbC1JT01NVTogRm9yY2luZyBEQUMgZm9yIFBDSSBkZXZpY2VzXG4iKTsKKwkJCWRtYXJfZm9yY2VkYWMgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgInN0cmljdCIsIDYpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIkludGVsLUlPTU1VOiBkaXNhYmxlIGJhdGNoZWQgSU9UTEIgZmx1c2hcbiIpOworCQkJaW50ZWxfaW9tbXVfc3RyaWN0ID0gMTsKKwkJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJzcF9vZmYiLCA2KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJJbnRlbC1JT01NVTogZGlzYWJsZSBzdXBwb3J0ZWQgc3VwZXIgcGFnZVxuIik7CisJCQlpbnRlbF9pb21tdV9zdXBlcnBhZ2UgPSAwOworCQl9CisKKwkJc3RyICs9IHN0cmNzcG4oc3RyLCAiLCIpOworCQl3aGlsZSAoKnN0ciA9PSAnLCcpCisJCQlzdHIrKzsKKwl9CisJcmV0dXJuIDA7Cit9CitfX3NldHVwKCJpbnRlbF9pb21tdT0iLCBpbnRlbF9pb21tdV9zZXR1cCk7CisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaW9tbXVfZG9tYWluX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppb21tdV9kZXZpbmZvX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppb21tdV9pb3ZhX2NhY2hlOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmFsbG9jX3BndGFibGVfcGFnZShpbnQgbm9kZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl2b2lkICp2YWRkciA9IE5VTEw7CisKKwlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBHRlBfQVRPTUlDIHwgX19HRlBfWkVSTywgMCk7CisJaWYgKHBhZ2UpCisJCXZhZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCXJldHVybiB2YWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcGd0YWJsZV9wYWdlKHZvaWQgKnZhZGRyKQoreworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2YWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqYWxsb2NfZG9tYWluX21lbSh2b2lkKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGlvbW11X2RvbWFpbl9jYWNoZSwgR0ZQX0FUT01JQyk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZG9tYWluX21lbSh2b2lkICp2YWRkcikKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoaW9tbXVfZG9tYWluX2NhY2hlLCB2YWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqIGFsbG9jX2RldmluZm9fbWVtKHZvaWQpCit7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoaW9tbXVfZGV2aW5mb19jYWNoZSwgR0ZQX0FUT01JQyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2RldmluZm9fbWVtKHZvaWQgKnZhZGRyKQoreworCWttZW1fY2FjaGVfZnJlZShpb21tdV9kZXZpbmZvX2NhY2hlLCB2YWRkcik7Cit9CisKK3N0cnVjdCBpb3ZhICphbGxvY19pb3ZhX21lbSh2b2lkKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGlvbW11X2lvdmFfY2FjaGUsIEdGUF9BVE9NSUMpOworfQorCit2b2lkIGZyZWVfaW92YV9tZW0oc3RydWN0IGlvdmEgKmlvdmEpCit7CisJa21lbV9jYWNoZV9mcmVlKGlvbW11X2lvdmFfY2FjaGUsIGlvdmEpOworfQorCisKK3N0YXRpYyBpbnQgX19pb21tdV9jYWxjdWxhdGVfYWdhdyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCBpbnQgbWF4X2dhdykKK3sKKwl1bnNpZ25lZCBsb25nIHNhZ2F3OworCWludCBhZ2F3ID0gLTE7CisKKwlzYWdhdyA9IGNhcF9zYWdhdyhpb21tdS0+Y2FwKTsKKwlmb3IgKGFnYXcgPSB3aWR0aF90b19hZ2F3KG1heF9nYXcpOworCSAgICAgYWdhdyA+PSAwOyBhZ2F3LS0pIHsKKwkJaWYgKHRlc3RfYml0KGFnYXcsICZzYWdhdykpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYWdhdzsKK30KKworLyoKKyAqIENhbGN1bGF0ZSBtYXggU0FHQVcgZm9yIGVhY2ggaW9tbXUuCisgKi8KK2ludCBpb21tdV9jYWxjdWxhdGVfbWF4X3NhZ2F3KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCit7CisJcmV0dXJuIF9faW9tbXVfY2FsY3VsYXRlX2FnYXcoaW9tbXUsIE1BWF9BR0FXX1dJRFRIKTsKK30KKworLyoKKyAqIGNhbGN1bGF0ZSBhZ2F3IGZvciBlYWNoIGlvbW11LgorICogIlNBR0FXIiBtYXkgYmUgZGlmZmVyZW50IGFjcm9zcyBpb21tdXMsIHVzZSBhIGRlZmF1bHQgYWdhdywgYW5kCisgKiBnZXQgYSBzdXBwb3J0ZWQgbGVzcyBhZ2F3IGZvciBpb21tdXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBkZWZhdWx0IGFnYXcuCisgKi8KK2ludCBpb21tdV9jYWxjdWxhdGVfYWdhdyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQoreworCXJldHVybiBfX2lvbW11X2NhbGN1bGF0ZV9hZ2F3KGlvbW11LCBERUZBVUxUX0RPTUFJTl9BRERSRVNTX1dJRFRIKTsKK30KKworLyogVGhpcyBmdW5jdGlvbmluIG9ubHkgcmV0dXJucyBzaW5nbGUgaW9tbXUgaW4gYSBkb21haW4gKi8KK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmRvbWFpbl9nZXRfaW9tbXUoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCit7CisJaW50IGlvbW11X2lkOworCisJLyogc2lfZG9tYWluIGFuZCB2bSBkb21haW4gc2hvdWxkIG5vdCBnZXQgaGVyZS4gKi8KKwlCVUdfT04oZG9tYWluLT5mbGFncyAmIERPTUFJTl9GTEFHX1ZJUlRVQUxfTUFDSElORSk7CisJQlVHX09OKGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19TVEFUSUNfSURFTlRJVFkpOworCisJaW9tbXVfaWQgPSBmaW5kX2ZpcnN0X2JpdCgmZG9tYWluLT5pb21tdV9ibXAsIGdfbnVtX29mX2lvbW11cyk7CisJaWYgKGlvbW11X2lkIDwgMCB8fCBpb21tdV9pZCA+PSBnX251bV9vZl9pb21tdXMpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGdfaW9tbXVzW2lvbW11X2lkXTsKK30KKworc3RhdGljIHZvaWQgZG9tYWluX3VwZGF0ZV9pb21tdV9jb2hlcmVuY3koc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCit7CisJaW50IGk7CisKKwlkb21haW4tPmlvbW11X2NvaGVyZW5jeSA9IDE7CisKKwlmb3JfZWFjaF9zZXRfYml0KGksICZkb21haW4tPmlvbW11X2JtcCwgZ19udW1fb2ZfaW9tbXVzKSB7CisJCWlmICghZWNhcF9jb2hlcmVudChnX2lvbW11c1tpXS0+ZWNhcCkpIHsKKwkJCWRvbWFpbi0+aW9tbXVfY29oZXJlbmN5ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkb21haW5fdXBkYXRlX2lvbW11X3Nub29waW5nKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKQoreworCWludCBpOworCisJZG9tYWluLT5pb21tdV9zbm9vcGluZyA9IDE7CisKKwlmb3JfZWFjaF9zZXRfYml0KGksICZkb21haW4tPmlvbW11X2JtcCwgZ19udW1fb2ZfaW9tbXVzKSB7CisJCWlmICghZWNhcF9zY19zdXBwb3J0KGdfaW9tbXVzW2ldLT5lY2FwKSkgeworCQkJZG9tYWluLT5pb21tdV9zbm9vcGluZyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZG9tYWluX3VwZGF0ZV9pb21tdV9zdXBlcnBhZ2Uoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCit7CisJaW50IGksIG1hc2sgPSAweGY7CisKKwlpZiAoIWludGVsX2lvbW11X3N1cGVycGFnZSkgeworCQlkb21haW4tPmlvbW11X3N1cGVycGFnZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlkb21haW4tPmlvbW11X3N1cGVycGFnZSA9IDQ7IC8qIDFUaUIgKi8KKworCWZvcl9lYWNoX3NldF9iaXQoaSwgJmRvbWFpbi0+aW9tbXVfYm1wLCBnX251bV9vZl9pb21tdXMpIHsKKwkJbWFzayB8PSBjYXBfc3VwZXJfcGFnZV92YWwoZ19pb21tdXNbaV0tPmNhcCk7CisJCWlmICghbWFzaykgeworCQkJYnJlYWs7CisJCX0KKwl9CisJZG9tYWluLT5pb21tdV9zdXBlcnBhZ2UgPSBmbHMobWFzayk7Cit9CisKKy8qIFNvbWUgY2FwYWJpbGl0aWVzIG1heSBiZSBkaWZmZXJlbnQgYWNyb3NzIGlvbW11cyAqLworc3RhdGljIHZvaWQgZG9tYWluX3VwZGF0ZV9pb21tdV9jYXAoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCit7CisJZG9tYWluX3VwZGF0ZV9pb21tdV9jb2hlcmVuY3koZG9tYWluKTsKKwlkb21haW5fdXBkYXRlX2lvbW11X3Nub29waW5nKGRvbWFpbik7CisJZG9tYWluX3VwZGF0ZV9pb21tdV9zdXBlcnBhZ2UoZG9tYWluKTsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlbF9pb21tdSAqZGV2aWNlX3RvX2lvbW11KGludCBzZWdtZW50LCB1OCBidXMsIHU4IGRldmZuKQoreworCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZCA9IE5VTEw7CisJaW50IGk7CisKKwlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgeworCQlpZiAoZHJoZC0+aWdub3JlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc2VnbWVudCAhPSBkcmhkLT5zZWdtZW50KQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IGRyaGQtPmRldmljZXNfY250OyBpKyspIHsKKwkJCWlmIChkcmhkLT5kZXZpY2VzW2ldICYmCisJCQkgICAgZHJoZC0+ZGV2aWNlc1tpXS0+YnVzLT5udW1iZXIgPT0gYnVzICYmCisJCQkgICAgZHJoZC0+ZGV2aWNlc1tpXS0+ZGV2Zm4gPT0gZGV2Zm4pCisJCQkJcmV0dXJuIGRyaGQtPmlvbW11OworCQkJaWYgKGRyaGQtPmRldmljZXNbaV0gJiYKKwkJCSAgICBkcmhkLT5kZXZpY2VzW2ldLT5zdWJvcmRpbmF0ZSAmJgorCQkJICAgIGRyaGQtPmRldmljZXNbaV0tPnN1Ym9yZGluYXRlLT5udW1iZXIgPD0gYnVzICYmCisJCQkgICAgZHJoZC0+ZGV2aWNlc1tpXS0+c3Vib3JkaW5hdGUtPnN1Ym9yZGluYXRlID49IGJ1cykKKwkJCQlyZXR1cm4gZHJoZC0+aW9tbXU7CisJCX0KKworCQlpZiAoZHJoZC0+aW5jbHVkZV9hbGwpCisJCQlyZXR1cm4gZHJoZC0+aW9tbXU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGRvbWFpbl9mbHVzaF9jYWNoZShzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKKwkJCSAgICAgICB2b2lkICphZGRyLCBpbnQgc2l6ZSkKK3sKKwlpZiAoIWRvbWFpbi0+aW9tbXVfY29oZXJlbmN5KQorCQljbGZsdXNoX2NhY2hlX3JhbmdlKGFkZHIsIHNpemUpOworfQorCisvKiBHZXRzIGNvbnRleHQgZW50cnkgZm9yIGEgZ2l2ZW4gYnVzIGFuZCBkZXZmbiAqLworc3RhdGljIHN0cnVjdCBjb250ZXh0X2VudHJ5ICogZGV2aWNlX3RvX2NvbnRleHRfZW50cnkoc3RydWN0IGludGVsX2lvbW11ICppb21tdSwKKwkJdTggYnVzLCB1OCBkZXZmbikKK3sKKwlzdHJ1Y3Qgcm9vdF9lbnRyeSAqcm9vdDsKKwlzdHJ1Y3QgY29udGV4dF9lbnRyeSAqY29udGV4dDsKKwl1bnNpZ25lZCBsb25nIHBoeV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwlyb290ID0gJmlvbW11LT5yb290X2VudHJ5W2J1c107CisJY29udGV4dCA9IGdldF9jb250ZXh0X2FkZHJfZnJvbV9yb290KHJvb3QpOworCWlmICghY29udGV4dCkgeworCQljb250ZXh0ID0gKHN0cnVjdCBjb250ZXh0X2VudHJ5ICopCisJCQkJYWxsb2NfcGd0YWJsZV9wYWdlKGlvbW11LT5ub2RlKTsKKwkJaWYgKCFjb250ZXh0KSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJX19pb21tdV9mbHVzaF9jYWNoZShpb21tdSwgKHZvaWQgKiljb250ZXh0LCBDT05URVhUX1NJWkUpOworCQlwaHlfYWRkciA9IHZpcnRfdG9fcGh5cygodm9pZCAqKWNvbnRleHQpOworCQlzZXRfcm9vdF92YWx1ZShyb290LCBwaHlfYWRkcik7CisJCXNldF9yb290X3ByZXNlbnQocm9vdCk7CisJCV9faW9tbXVfZmx1c2hfY2FjaGUoaW9tbXUsIHJvb3QsIHNpemVvZigqcm9vdCkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCXJldHVybiAmY29udGV4dFtkZXZmbl07Cit9CisKK3N0YXRpYyBpbnQgZGV2aWNlX2NvbnRleHRfbWFwcGVkKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsIHU4IGJ1cywgdTggZGV2Zm4pCit7CisJc3RydWN0IHJvb3RfZW50cnkgKnJvb3Q7CisJc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQ7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisJcm9vdCA9ICZpb21tdS0+cm9vdF9lbnRyeVtidXNdOworCWNvbnRleHQgPSBnZXRfY29udGV4dF9hZGRyX2Zyb21fcm9vdChyb290KTsKKwlpZiAoIWNvbnRleHQpIHsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IGNvbnRleHRfcHJlc2VudCgmY29udGV4dFtkZXZmbl0pOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfY29udGV4dF90YWJsZShzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCB1OCBidXMsIHU4IGRldmZuKQoreworCXN0cnVjdCByb290X2VudHJ5ICpyb290OworCXN0cnVjdCBjb250ZXh0X2VudHJ5ICpjb250ZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwlyb290ID0gJmlvbW11LT5yb290X2VudHJ5W2J1c107CisJY29udGV4dCA9IGdldF9jb250ZXh0X2FkZHJfZnJvbV9yb290KHJvb3QpOworCWlmIChjb250ZXh0KSB7CisJCWNvbnRleHRfY2xlYXJfZW50cnkoJmNvbnRleHRbZGV2Zm5dKTsKKwkJX19pb21tdV9mbHVzaF9jYWNoZShpb21tdSwgJmNvbnRleHRbZGV2Zm5dLCBcCisJCQlzaXplb2YoKmNvbnRleHQpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9jb250ZXh0X3RhYmxlKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCit7CisJc3RydWN0IHJvb3RfZW50cnkgKnJvb3Q7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgY29udGV4dF9lbnRyeSAqY29udGV4dDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCWlmICghaW9tbXUtPnJvb3RfZW50cnkpIHsKKwkJZ290byBvdXQ7CisJfQorCWZvciAoaSA9IDA7IGkgPCBST09UX0VOVFJZX05SOyBpKyspIHsKKwkJcm9vdCA9ICZpb21tdS0+cm9vdF9lbnRyeVtpXTsKKwkJY29udGV4dCA9IGdldF9jb250ZXh0X2FkZHJfZnJvbV9yb290KHJvb3QpOworCQlpZiAoY29udGV4dCkKKwkJCWZyZWVfcGd0YWJsZV9wYWdlKGNvbnRleHQpOworCX0KKwlmcmVlX3BndGFibGVfcGFnZShpb21tdS0+cm9vdF9lbnRyeSk7CisJaW9tbXUtPnJvb3RfZW50cnkgPSBOVUxMOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX3B0ZSAqcGZuX3RvX2RtYV9wdGUoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwZm4sIGludCBsYXJnZV9sZXZlbCkKK3sKKwlpbnQgYWRkcl93aWR0aCA9IGFnYXdfdG9fd2lkdGgoZG9tYWluLT5hZ2F3KSAtIFZURF9QQUdFX1NISUZUOworCXN0cnVjdCBkbWFfcHRlICpwYXJlbnQsICpwdGUgPSBOVUxMOworCWludCBsZXZlbCA9IGFnYXdfdG9fbGV2ZWwoZG9tYWluLT5hZ2F3KTsKKwlpbnQgb2Zmc2V0LCB0YXJnZXRfbGV2ZWw7CisKKwlCVUdfT04oIWRvbWFpbi0+cGdkKTsKKwlCVUdfT04oYWRkcl93aWR0aCA8IEJJVFNfUEVSX0xPTkcgJiYgcGZuID4+IGFkZHJfd2lkdGgpOworCXBhcmVudCA9IGRvbWFpbi0+cGdkOworCisJLyogU2VhcmNoIHB0ZSAqLworCWlmICghbGFyZ2VfbGV2ZWwpCisJCXRhcmdldF9sZXZlbCA9IDE7CisJZWxzZQorCQl0YXJnZXRfbGV2ZWwgPSBsYXJnZV9sZXZlbDsKKworCXdoaWxlIChsZXZlbCA+IDApIHsKKwkJdm9pZCAqdG1wX3BhZ2U7CisKKwkJb2Zmc2V0ID0gcGZuX2xldmVsX29mZnNldChwZm4sIGxldmVsKTsKKwkJcHRlID0gJnBhcmVudFtvZmZzZXRdOworCQlpZiAoIWxhcmdlX2xldmVsICYmIChwdGUtPnZhbCAmIERNQV9QVEVfTEFSR0VfUEFHRSkpCisJCQlicmVhazsKKwkJaWYgKGxldmVsID09IHRhcmdldF9sZXZlbCkKKwkJCWJyZWFrOworCisJCWlmICghZG1hX3B0ZV9wcmVzZW50KHB0ZSkpIHsKKwkJCXVpbnQ2NF90IHB0ZXZhbDsKKworCQkJdG1wX3BhZ2UgPSBhbGxvY19wZ3RhYmxlX3BhZ2UoZG9tYWluLT5uaWQpOworCisJCQlpZiAoIXRtcF9wYWdlKQorCQkJCXJldHVybiBOVUxMOworCisJCQlkb21haW5fZmx1c2hfY2FjaGUoZG9tYWluLCB0bXBfcGFnZSwgVlREX1BBR0VfU0laRSk7CisJCQlwdGV2YWwgPSAoKHVpbnQ2NF90KXZpcnRfdG9fZG1hX3Bmbih0bXBfcGFnZSkgPDwgVlREX1BBR0VfU0hJRlQpIHwgRE1BX1BURV9SRUFEIHwgRE1BX1BURV9XUklURTsKKwkJCWlmIChjbXB4Y2hnNjQoJnB0ZS0+dmFsLCAwVUxMLCBwdGV2YWwpKSB7CisJCQkJLyogU29tZW9uZSBlbHNlIHNldCBpdCB3aGlsZSB3ZSB3ZXJlIHRoaW5raW5nOyB1c2UgdGhlaXJzLiAqLworCQkJCWZyZWVfcGd0YWJsZV9wYWdlKHRtcF9wYWdlKTsKKwkJCX0gZWxzZSB7CisJCQkJZG1hX3B0ZV9hZGRyKHB0ZSk7CisJCQkJZG9tYWluX2ZsdXNoX2NhY2hlKGRvbWFpbiwgcHRlLCBzaXplb2YoKnB0ZSkpOworCQkJfQorCQl9CisJCXBhcmVudCA9IHBoeXNfdG9fdmlydChkbWFfcHRlX2FkZHIocHRlKSk7CisJCWxldmVsLS07CisJfQorCisJcmV0dXJuIHB0ZTsKK30KKworCisvKiByZXR1cm4gYWRkcmVzcydzIHB0ZSBhdCBzcGVjaWZpYyBsZXZlbCAqLworc3RhdGljIHN0cnVjdCBkbWFfcHRlICpkbWFfcGZuX2xldmVsX3B0ZShzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgcGZuLAorCQkJCQkgaW50IGxldmVsLCBpbnQgKmxhcmdlX3BhZ2UpCit7CisJc3RydWN0IGRtYV9wdGUgKnBhcmVudCwgKnB0ZSA9IE5VTEw7CisJaW50IHRvdGFsID0gYWdhd190b19sZXZlbChkb21haW4tPmFnYXcpOworCWludCBvZmZzZXQ7CisKKwlwYXJlbnQgPSBkb21haW4tPnBnZDsKKwl3aGlsZSAobGV2ZWwgPD0gdG90YWwpIHsKKwkJb2Zmc2V0ID0gcGZuX2xldmVsX29mZnNldChwZm4sIHRvdGFsKTsKKwkJcHRlID0gJnBhcmVudFtvZmZzZXRdOworCQlpZiAobGV2ZWwgPT0gdG90YWwpCisJCQlyZXR1cm4gcHRlOworCisJCWlmICghZG1hX3B0ZV9wcmVzZW50KHB0ZSkpIHsKKwkJCSpsYXJnZV9wYWdlID0gdG90YWw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwdGUtPnZhbCAmIERNQV9QVEVfTEFSR0VfUEFHRSkgeworCQkJKmxhcmdlX3BhZ2UgPSB0b3RhbDsKKwkJCXJldHVybiBwdGU7CisJCX0KKworCQlwYXJlbnQgPSBwaHlzX3RvX3ZpcnQoZG1hX3B0ZV9hZGRyKHB0ZSkpOworCQl0b3RhbC0tOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogY2xlYXIgbGFzdCBsZXZlbCBwdGUsIGEgdGxiIGZsdXNoIHNob3VsZCBiZSBmb2xsb3dlZCAqLworc3RhdGljIHZvaWQgZG1hX3B0ZV9jbGVhcl9yYW5nZShzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKKwkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKKwkJCQl1bnNpZ25lZCBsb25nIGxhc3RfcGZuKQoreworCWludCBhZGRyX3dpZHRoID0gYWdhd190b193aWR0aChkb21haW4tPmFnYXcpIC0gVlREX1BBR0VfU0hJRlQ7CisJdW5zaWduZWQgaW50IGxhcmdlX3BhZ2UgPSAxOworCXN0cnVjdCBkbWFfcHRlICpmaXJzdF9wdGUsICpwdGU7CisKKwlCVUdfT04oYWRkcl93aWR0aCA8IEJJVFNfUEVSX0xPTkcgJiYgc3RhcnRfcGZuID4+IGFkZHJfd2lkdGgpOworCUJVR19PTihhZGRyX3dpZHRoIDwgQklUU19QRVJfTE9ORyAmJiBsYXN0X3BmbiA+PiBhZGRyX3dpZHRoKTsKKwlCVUdfT04oc3RhcnRfcGZuID4gbGFzdF9wZm4pOworCisJLyogd2UgZG9uJ3QgbmVlZCBsb2NrIGhlcmU7IG5vYm9keSBlbHNlIHRvdWNoZXMgdGhlIGlvdmEgcmFuZ2UgKi8KKwlkbyB7CisJCWxhcmdlX3BhZ2UgPSAxOworCQlmaXJzdF9wdGUgPSBwdGUgPSBkbWFfcGZuX2xldmVsX3B0ZShkb21haW4sIHN0YXJ0X3BmbiwgMSwgJmxhcmdlX3BhZ2UpOworCQlpZiAoIXB0ZSkgeworCQkJc3RhcnRfcGZuID0gYWxpZ25fdG9fbGV2ZWwoc3RhcnRfcGZuICsgMSwgbGFyZ2VfcGFnZSArIDEpOworCQkJY29udGludWU7CisJCX0KKwkJZG8geworCQkJZG1hX2NsZWFyX3B0ZShwdGUpOworCQkJc3RhcnRfcGZuICs9IGx2bF90b19ucl9wYWdlcyhsYXJnZV9wYWdlKTsKKwkJCXB0ZSsrOworCQl9IHdoaWxlIChzdGFydF9wZm4gPD0gbGFzdF9wZm4gJiYgIWZpcnN0X3B0ZV9pbl9wYWdlKHB0ZSkpOworCisJCWRvbWFpbl9mbHVzaF9jYWNoZShkb21haW4sIGZpcnN0X3B0ZSwKKwkJCQkgICAodm9pZCAqKXB0ZSAtICh2b2lkICopZmlyc3RfcHRlKTsKKworCX0gd2hpbGUgKHN0YXJ0X3BmbiAmJiBzdGFydF9wZm4gPD0gbGFzdF9wZm4pOworfQorCisvKiBmcmVlIHBhZ2UgdGFibGUgcGFnZXMuIGxhc3QgbGV2ZWwgcHRlIHNob3VsZCBhbHJlYWR5IGJlIGNsZWFyZWQgKi8KK3N0YXRpYyB2b2lkIGRtYV9wdGVfZnJlZV9wYWdldGFibGUoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCisJCQkJICAgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCisJCQkJICAgdW5zaWduZWQgbG9uZyBsYXN0X3BmbikKK3sKKwlpbnQgYWRkcl93aWR0aCA9IGFnYXdfdG9fd2lkdGgoZG9tYWluLT5hZ2F3KSAtIFZURF9QQUdFX1NISUZUOworCXN0cnVjdCBkbWFfcHRlICpmaXJzdF9wdGUsICpwdGU7CisJaW50IHRvdGFsID0gYWdhd190b19sZXZlbChkb21haW4tPmFnYXcpOworCWludCBsZXZlbDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgbGFyZ2VfcGFnZSA9IDI7CisKKwlCVUdfT04oYWRkcl93aWR0aCA8IEJJVFNfUEVSX0xPTkcgJiYgc3RhcnRfcGZuID4+IGFkZHJfd2lkdGgpOworCUJVR19PTihhZGRyX3dpZHRoIDwgQklUU19QRVJfTE9ORyAmJiBsYXN0X3BmbiA+PiBhZGRyX3dpZHRoKTsKKwlCVUdfT04oc3RhcnRfcGZuID4gbGFzdF9wZm4pOworCisJLyogV2UgZG9uJ3QgbmVlZCBsb2NrIGhlcmU7IG5vYm9keSBlbHNlIHRvdWNoZXMgdGhlIGlvdmEgcmFuZ2UgKi8KKwlsZXZlbCA9IDI7CisJd2hpbGUgKGxldmVsIDw9IHRvdGFsKSB7CisJCXRtcCA9IGFsaWduX3RvX2xldmVsKHN0YXJ0X3BmbiwgbGV2ZWwpOworCisJCS8qIElmIHdlIGNhbid0IGV2ZW4gY2xlYXIgb25lIFBURSBhdCB0aGlzIGxldmVsLCB3ZSdyZSBkb25lICovCisJCWlmICh0bXAgKyBsZXZlbF9zaXplKGxldmVsKSAtIDEgPiBsYXN0X3BmbikKKwkJCXJldHVybjsKKworCQlkbyB7CisJCQlsYXJnZV9wYWdlID0gbGV2ZWw7CisJCQlmaXJzdF9wdGUgPSBwdGUgPSBkbWFfcGZuX2xldmVsX3B0ZShkb21haW4sIHRtcCwgbGV2ZWwsICZsYXJnZV9wYWdlKTsKKwkJCWlmIChsYXJnZV9wYWdlID4gbGV2ZWwpCisJCQkJbGV2ZWwgPSBsYXJnZV9wYWdlICsgMTsKKwkJCWlmICghcHRlKSB7CisJCQkJdG1wID0gYWxpZ25fdG9fbGV2ZWwodG1wICsgMSwgbGV2ZWwgKyAxKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRvIHsKKwkJCQlpZiAoZG1hX3B0ZV9wcmVzZW50KHB0ZSkpIHsKKwkJCQkJZnJlZV9wZ3RhYmxlX3BhZ2UocGh5c190b192aXJ0KGRtYV9wdGVfYWRkcihwdGUpKSk7CisJCQkJCWRtYV9jbGVhcl9wdGUocHRlKTsKKwkJCQl9CisJCQkJcHRlKys7CisJCQkJdG1wICs9IGxldmVsX3NpemUobGV2ZWwpOworCQkJfSB3aGlsZSAoIWZpcnN0X3B0ZV9pbl9wYWdlKHB0ZSkgJiYKKwkJCQkgdG1wICsgbGV2ZWxfc2l6ZShsZXZlbCkgLSAxIDw9IGxhc3RfcGZuKTsKKworCQkJZG9tYWluX2ZsdXNoX2NhY2hlKGRvbWFpbiwgZmlyc3RfcHRlLAorCQkJCQkgICAodm9pZCAqKXB0ZSAtICh2b2lkICopZmlyc3RfcHRlKTsKKwkJCQorCQl9IHdoaWxlICh0bXAgJiYgdG1wICsgbGV2ZWxfc2l6ZShsZXZlbCkgLSAxIDw9IGxhc3RfcGZuKTsKKwkJbGV2ZWwrKzsKKwl9CisJLyogZnJlZSBwZ2QgKi8KKwlpZiAoc3RhcnRfcGZuID09IDAgJiYgbGFzdF9wZm4gPT0gRE9NQUlOX01BWF9QRk4oZG9tYWluLT5nYXcpKSB7CisJCWZyZWVfcGd0YWJsZV9wYWdlKGRvbWFpbi0+cGdkKTsKKwkJZG9tYWluLT5wZ2QgPSBOVUxMOworCX0KK30KKworLyogaW9tbXUgaGFuZGxpbmcgKi8KK3N0YXRpYyBpbnQgaW9tbXVfYWxsb2Nfcm9vdF9lbnRyeShzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQoreworCXN0cnVjdCByb290X2VudHJ5ICpyb290OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyb290ID0gKHN0cnVjdCByb290X2VudHJ5ICopYWxsb2NfcGd0YWJsZV9wYWdlKGlvbW11LT5ub2RlKTsKKwlpZiAoIXJvb3QpCisJCXJldHVybiAtRU5PTUVNOworCisJX19pb21tdV9mbHVzaF9jYWNoZShpb21tdSwgcm9vdCwgUk9PVF9TSVpFKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCWlvbW11LT5yb290X2VudHJ5ID0gcm9vdDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X3NldF9yb290X2VudHJ5KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCit7CisJdm9pZCAqYWRkcjsKKwl1MzIgc3RzOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKworCWFkZHIgPSBpb21tdS0+cm9vdF9lbnRyeTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7CisJZG1hcl93cml0ZXEoaW9tbXUtPnJlZyArIERNQVJfUlRBRERSX1JFRywgdmlydF90b19waHlzKGFkZHIpKTsKKworCXdyaXRlbChpb21tdS0+Z2NtZCB8IERNQV9HQ01EX1NSVFAsIGlvbW11LT5yZWcgKyBETUFSX0dDTURfUkVHKTsKKworCS8qIE1ha2Ugc3VyZSBoYXJkd2FyZSBjb21wbGV0ZSBpdCAqLworCUlPTU1VX1dBSVRfT1AoaW9tbXUsIERNQVJfR1NUU19SRUcsCisJCSAgICAgIHJlYWRsLCAoc3RzICYgRE1BX0dTVFNfUlRQUyksIHN0cyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X2ZsdXNoX3dyaXRlX2J1ZmZlcihzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQoreworCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCisJaWYgKCFyd2JmX3F1aXJrICYmICFjYXBfcndiZihpb21tdS0+Y2FwKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFnKTsKKwl3cml0ZWwoaW9tbXUtPmdjbWQgfCBETUFfR0NNRF9XQkYsIGlvbW11LT5yZWcgKyBETUFSX0dDTURfUkVHKTsKKworCS8qIE1ha2Ugc3VyZSBoYXJkd2FyZSBjb21wbGV0ZSBpdCAqLworCUlPTU1VX1dBSVRfT1AoaW9tbXUsIERNQVJfR1NUU19SRUcsCisJCSAgICAgIHJlYWRsLCAoISh2YWwgJiBETUFfR1NUU19XQkZTKSksIHZhbCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7Cit9CisKKy8qIHJldHVybiB2YWx1ZSBkZXRlcm1pbmUgaWYgd2UgbmVlZCBhIHdyaXRlIGJ1ZmZlciBmbHVzaCAqLworc3RhdGljIHZvaWQgX19pb21tdV9mbHVzaF9jb250ZXh0KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsCisJCQkJICB1MTYgZGlkLCB1MTYgc291cmNlX2lkLCB1OCBmdW5jdGlvbl9tYXNrLAorCQkJCSAgdTY0IHR5cGUpCit7CisJdTY0IHZhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBETUFfQ0NNRF9HTE9CQUxfSU5WTDoKKwkJdmFsID0gRE1BX0NDTURfR0xPQkFMX0lOVkw7CisJCWJyZWFrOworCWNhc2UgRE1BX0NDTURfRE9NQUlOX0lOVkw6CisJCXZhbCA9IERNQV9DQ01EX0RPTUFJTl9JTlZMfERNQV9DQ01EX0RJRChkaWQpOworCQlicmVhazsKKwljYXNlIERNQV9DQ01EX0RFVklDRV9JTlZMOgorCQl2YWwgPSBETUFfQ0NNRF9ERVZJQ0VfSU5WTHxETUFfQ0NNRF9ESUQoZGlkKQorCQkJfCBETUFfQ0NNRF9TSUQoc291cmNlX2lkKSB8IERNQV9DQ01EX0ZNKGZ1bmN0aW9uX21hc2spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJdmFsIHw9IERNQV9DQ01EX0lDQzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7CisJZG1hcl93cml0ZXEoaW9tbXUtPnJlZyArIERNQVJfQ0NNRF9SRUcsIHZhbCk7CisKKwkvKiBNYWtlIHN1cmUgaGFyZHdhcmUgY29tcGxldGUgaXQgKi8KKwlJT01NVV9XQUlUX09QKGlvbW11LCBETUFSX0NDTURfUkVHLAorCQlkbWFyX3JlYWRxLCAoISh2YWwgJiBETUFfQ0NNRF9JQ0MpKSwgdmFsKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFnKTsKK30KKworLyogcmV0dXJuIHZhbHVlIGRldGVybWluZSBpZiB3ZSBuZWVkIGEgd3JpdGUgYnVmZmVyIGZsdXNoICovCitzdGF0aWMgdm9pZCBfX2lvbW11X2ZsdXNoX2lvdGxiKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsIHUxNiBkaWQsCisJCQkJdTY0IGFkZHIsIHVuc2lnbmVkIGludCBzaXplX29yZGVyLCB1NjQgdHlwZSkKK3sKKwlpbnQgdGxiX29mZnNldCA9IGVjYXBfaW90bGJfb2Zmc2V0KGlvbW11LT5lY2FwKTsKKwl1NjQgdmFsID0gMCwgdmFsX2l2YSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBETUFfVExCX0dMT0JBTF9GTFVTSDoKKwkJLyogZ2xvYmFsIGZsdXNoIGRvZXNuJ3QgbmVlZCBzZXQgSVZBX1JFRyAqLworCQl2YWwgPSBETUFfVExCX0dMT0JBTF9GTFVTSHxETUFfVExCX0lWVDsKKwkJYnJlYWs7CisJY2FzZSBETUFfVExCX0RTSV9GTFVTSDoKKwkJdmFsID0gRE1BX1RMQl9EU0lfRkxVU0h8RE1BX1RMQl9JVlR8RE1BX1RMQl9ESUQoZGlkKTsKKwkJYnJlYWs7CisJY2FzZSBETUFfVExCX1BTSV9GTFVTSDoKKwkJdmFsID0gRE1BX1RMQl9QU0lfRkxVU0h8RE1BX1RMQl9JVlR8RE1BX1RMQl9ESUQoZGlkKTsKKwkJLyogTm90ZTogYWx3YXlzIGZsdXNoIG5vbi1sZWFmIGN1cnJlbnRseSAqLworCQl2YWxfaXZhID0gc2l6ZV9vcmRlciB8IGFkZHI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwkvKiBOb3RlOiBzZXQgZHJhaW4gcmVhZC93cml0ZSAqLworI2lmIDAKKwkvKgorCSAqIFRoaXMgaXMgcHJvYmFibHkgdG8gYmUgc3VwZXIgc2VjdXJlLi4gTG9va3MgbGlrZSB3ZSBjYW4KKwkgKiBpZ25vcmUgaXQgd2l0aG91dCBhbnkgaW1wYWN0LgorCSAqLworCWlmIChjYXBfcmVhZF9kcmFpbihpb21tdS0+Y2FwKSkKKwkJdmFsIHw9IERNQV9UTEJfUkVBRF9EUkFJTjsKKyNlbmRpZgorCWlmIChjYXBfd3JpdGVfZHJhaW4oaW9tbXUtPmNhcCkpCisJCXZhbCB8PSBETUFfVExCX1dSSVRFX0RSQUlOOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFnKTsKKwkvKiBOb3RlOiBPbmx5IHVzZXMgZmlyc3QgVExCIHJlZyBjdXJyZW50bHkgKi8KKwlpZiAodmFsX2l2YSkKKwkJZG1hcl93cml0ZXEoaW9tbXUtPnJlZyArIHRsYl9vZmZzZXQsIHZhbF9pdmEpOworCWRtYXJfd3JpdGVxKGlvbW11LT5yZWcgKyB0bGJfb2Zmc2V0ICsgOCwgdmFsKTsKKworCS8qIE1ha2Ugc3VyZSBoYXJkd2FyZSBjb21wbGV0ZSBpdCAqLworCUlPTU1VX1dBSVRfT1AoaW9tbXUsIHRsYl9vZmZzZXQgKyA4LAorCQlkbWFyX3JlYWRxLCAoISh2YWwgJiBETUFfVExCX0lWVCkpLCB2YWwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWcpOworCisJLyogY2hlY2sgSU9UTEIgaW52YWxpZGF0aW9uIGdyYW51bGFyaXR5ICovCisJaWYgKERNQV9UTEJfSUFJRyh2YWwpID09IDApCisJCXByaW50ayhLRVJOX0VSUiJJT01NVTogZmx1c2ggSU9UTEIgZmFpbGVkXG4iKTsKKwlpZiAoRE1BX1RMQl9JQUlHKHZhbCkgIT0gRE1BX1RMQl9JSVJHKHR5cGUpKQorCQlwcl9kZWJ1ZygiSU9NTVU6IHRsYiBmbHVzaCByZXF1ZXN0ICVMeCwgYWN0dWFsICVMeFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpRE1BX1RMQl9JSVJHKHR5cGUpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylETUFfVExCX0lBSUcodmFsKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvICppb21tdV9zdXBwb3J0X2Rldl9pb3RsYigKKwlzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwgaW50IHNlZ21lbnQsIHU4IGJ1cywgdTggZGV2Zm4pCit7CisJaW50IGZvdW5kID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8gKmluZm87CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IGRldmljZV90b19pb21tdShzZWdtZW50LCBidXMsIGRldmZuKTsKKworCWlmICghZWNhcF9kZXZfaW90bGJfc3VwcG9ydChpb21tdS0+ZWNhcCkpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFpb21tdS0+cWkpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5mbywgJmRvbWFpbi0+ZGV2aWNlcywgbGluaykKKwkJaWYgKGluZm8tPmJ1cyA9PSBidXMgJiYgaW5mby0+ZGV2Zm4gPT0gZGV2Zm4pIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWZvdW5kIHx8ICFpbmZvLT5kZXYpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFwY2lfZmluZF9leHRfY2FwYWJpbGl0eShpbmZvLT5kZXYsIFBDSV9FWFRfQ0FQX0lEX0FUUykpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFkbWFyX2ZpbmRfbWF0Y2hlZF9hdHNyX3VuaXQoaW5mby0+ZGV2KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpbmZvLT5pb21tdSA9IGlvbW11OworCisJcmV0dXJuIGluZm87Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X2VuYWJsZV9kZXZfaW90bGIoc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW5mbykKK3sKKwlpZiAoIWluZm8pCisJCXJldHVybjsKKworCXBjaV9lbmFibGVfYXRzKGluZm8tPmRldiwgVlREX1BBR0VfU0hJRlQpOworfQorCitzdGF0aWMgdm9pZCBpb21tdV9kaXNhYmxlX2Rldl9pb3RsYihzdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvICppbmZvKQoreworCWlmICghaW5mby0+ZGV2IHx8ICFwY2lfYXRzX2VuYWJsZWQoaW5mby0+ZGV2KSkKKwkJcmV0dXJuOworCisJcGNpX2Rpc2FibGVfYXRzKGluZm8tPmRldik7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X2ZsdXNoX2Rldl9pb3RsYihzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKKwkJCQkgIHU2NCBhZGRyLCB1bnNpZ25lZCBtYXNrKQoreworCXUxNiBzaWQsIHFkZXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvICppbmZvOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5mbywgJmRvbWFpbi0+ZGV2aWNlcywgbGluaykgeworCQlpZiAoIWluZm8tPmRldiB8fCAhcGNpX2F0c19lbmFibGVkKGluZm8tPmRldikpCisJCQljb250aW51ZTsKKworCQlzaWQgPSBpbmZvLT5idXMgPDwgOCB8IGluZm8tPmRldmZuOworCQlxZGVwID0gcGNpX2F0c19xdWV1ZV9kZXB0aChpbmZvLT5kZXYpOworCQlxaV9mbHVzaF9kZXZfaW90bGIoaW5mby0+aW9tbXUsIHNpZCwgcWRlcCwgYWRkciwgbWFzayk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBpb21tdV9mbHVzaF9pb3RsYl9wc2koc3RydWN0IGludGVsX2lvbW11ICppb21tdSwgdTE2IGRpZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBpbnQgcGFnZXMsIGludCBtYXApCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSBpbG9nMihfX3JvdW5kdXBfcG93X29mX3R3byhwYWdlcykpOworCXVpbnQ2NF90IGFkZHIgPSAodWludDY0X3QpcGZuIDw8IFZURF9QQUdFX1NISUZUOworCisJQlVHX09OKHBhZ2VzID09IDApOworCisJLyoKKwkgKiBGYWxsYmFjayB0byBkb21haW4gc2VsZWN0aXZlIGZsdXNoIGlmIG5vIFBTSSBzdXBwb3J0IG9yIHRoZSBzaXplIGlzCisJICogdG9vIGJpZy4KKwkgKiBQU0kgcmVxdWlyZXMgcGFnZSBzaXplIHRvIGJlIDIgXiB4LCBhbmQgdGhlIGJhc2UgYWRkcmVzcyBpcyBuYXR1cmFsbHkKKwkgKiBhbGlnbmVkIHRvIHRoZSBzaXplCisJICovCisJaWYgKCFjYXBfcGdzZWxfaW52KGlvbW11LT5jYXApIHx8IG1hc2sgPiBjYXBfbWF4X2FtYXNrX3ZhbChpb21tdS0+Y2FwKSkKKwkJaW9tbXUtPmZsdXNoLmZsdXNoX2lvdGxiKGlvbW11LCBkaWQsIDAsIDAsCisJCQkJCQlETUFfVExCX0RTSV9GTFVTSCk7CisJZWxzZQorCQlpb21tdS0+Zmx1c2guZmx1c2hfaW90bGIoaW9tbXUsIGRpZCwgYWRkciwgbWFzaywKKwkJCQkJCURNQV9UTEJfUFNJX0ZMVVNIKTsKKworCS8qCisJICogSW4gY2FjaGluZyBtb2RlLCBjaGFuZ2VzIG9mIHBhZ2VzIGZyb20gbm9uLXByZXNlbnQgdG8gcHJlc2VudCByZXF1aXJlCisJICogZmx1c2guIEhvd2V2ZXIsIGRldmljZSBJT1RMQiBkb2Vzbid0IG5lZWQgdG8gYmUgZmx1c2hlZCBpbiB0aGlzIGNhc2UuCisJICovCisJaWYgKCFjYXBfY2FjaGluZ19tb2RlKGlvbW11LT5jYXApIHx8ICFtYXApCisJCWlvbW11X2ZsdXNoX2Rldl9pb3RsYihpb21tdS0+ZG9tYWluc1tkaWRdLCBhZGRyLCBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfZGlzYWJsZV9wcm90ZWN0X21lbV9yZWdpb25zKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCit7CisJdTMyIHBtZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworCXBtZW4gPSByZWFkbChpb21tdS0+cmVnICsgRE1BUl9QTUVOX1JFRyk7CisJcG1lbiAmPSB+RE1BX1BNRU5fRVBNOworCXdyaXRlbChwbWVuLCBpb21tdS0+cmVnICsgRE1BUl9QTUVOX1JFRyk7CisKKwkvKiB3YWl0IGZvciB0aGUgcHJvdGVjdGVkIHJlZ2lvbiBzdGF0dXMgYml0IHRvIGNsZWFyICovCisJSU9NTVVfV0FJVF9PUChpb21tdSwgRE1BUl9QTUVOX1JFRywKKwkJcmVhZGwsICEocG1lbiAmIERNQV9QTUVOX1BSUyksIHBtZW4pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBpb21tdV9lbmFibGVfdHJhbnNsYXRpb24oc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKK3sKKwl1MzIgc3RzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwlpb21tdS0+Z2NtZCB8PSBETUFfR0NNRF9URTsKKwl3cml0ZWwoaW9tbXUtPmdjbWQsIGlvbW11LT5yZWcgKyBETUFSX0dDTURfUkVHKTsKKworCS8qIE1ha2Ugc3VyZSBoYXJkd2FyZSBjb21wbGV0ZSBpdCAqLworCUlPTU1VX1dBSVRfT1AoaW9tbXUsIERNQVJfR1NUU19SRUcsCisJCSAgICAgIHJlYWRsLCAoc3RzICYgRE1BX0dTVFNfVEVTKSwgc3RzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9tbXVfZGlzYWJsZV90cmFuc2xhdGlvbihzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQoreworCXUzMiBzdHM7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFnKTsKKwlpb21tdS0+Z2NtZCAmPSB+RE1BX0dDTURfVEU7CisJd3JpdGVsKGlvbW11LT5nY21kLCBpb21tdS0+cmVnICsgRE1BUl9HQ01EX1JFRyk7CisKKwkvKiBNYWtlIHN1cmUgaGFyZHdhcmUgY29tcGxldGUgaXQgKi8KKwlJT01NVV9XQUlUX09QKGlvbW11LCBETUFSX0dTVFNfUkVHLAorCQkgICAgICByZWFkbCwgKCEoc3RzICYgRE1BX0dTVFNfVEVTKSksIHN0cyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpb21tdV9pbml0X2RvbWFpbnMoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKK3sKKwl1bnNpZ25lZCBsb25nIG5kb21haW5zOworCXVuc2lnbmVkIGxvbmcgbmxvbmdzOworCisJbmRvbWFpbnMgPSBjYXBfbmRvbXMoaW9tbXUtPmNhcCk7CisJcHJfZGVidWcoIklPTU1VICVkOiBOdW1iZXIgb2YgRG9tYWlucyBzdXBwb3J0ZCA8JWxkPlxuIiwgaW9tbXUtPnNlcV9pZCwKKwkJCW5kb21haW5zKTsKKwlubG9uZ3MgPSBCSVRTX1RPX0xPTkdTKG5kb21haW5zKTsKKworCXNwaW5fbG9ja19pbml0KCZpb21tdS0+bG9jayk7CisKKwkvKiBUQkQ6IHRoZXJlIG1pZ2h0IGJlIDY0SyBkb21haW5zLAorCSAqIGNvbnNpZGVyIG90aGVyIGFsbG9jYXRpb24gZm9yIGZ1dHVyZSBjaGlwCisJICovCisJaW9tbXUtPmRvbWFpbl9pZHMgPSBrY2FsbG9jKG5sb25ncywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvbW11LT5kb21haW5faWRzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQWxsb2NhdGluZyBkb21haW4gaWQgYXJyYXkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlvbW11LT5kb21haW5zID0ga2NhbGxvYyhuZG9tYWlucywgc2l6ZW9mKHN0cnVjdCBkbWFyX2RvbWFpbiAqKSwKKwkJCUdGUF9LRVJORUwpOworCWlmICghaW9tbXUtPmRvbWFpbnMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBbGxvY2F0aW5nIGRvbWFpbiBhcnJheSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIGlmIENhY2hpbmcgbW9kZSBpcyBzZXQsIHRoZW4gaW52YWxpZCB0cmFuc2xhdGlvbnMgYXJlIHRhZ2dlZAorCSAqIHdpdGggZG9tYWluaWQgMC4gSGVuY2Ugd2UgbmVlZCB0byBwcmUtYWxsb2NhdGUgaXQuCisJICovCisJaWYgKGNhcF9jYWNoaW5nX21vZGUoaW9tbXUtPmNhcCkpCisJCXNldF9iaXQoMCwgaW9tbXUtPmRvbWFpbl9pZHMpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGRvbWFpbl9leGl0KHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKTsKK3N0YXRpYyB2b2lkIHZtX2RvbWFpbl9leGl0KHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKTsKKwordm9pZCBmcmVlX2RtYXJfaW9tbXUoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKK3sKKwlzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKChpb21tdS0+ZG9tYWlucykgJiYgKGlvbW11LT5kb21haW5faWRzKSkgeworCQlmb3JfZWFjaF9zZXRfYml0KGksIGlvbW11LT5kb21haW5faWRzLCBjYXBfbmRvbXMoaW9tbXUtPmNhcCkpIHsKKwkJCWRvbWFpbiA9IGlvbW11LT5kb21haW5zW2ldOworCQkJY2xlYXJfYml0KGksIGlvbW11LT5kb21haW5faWRzKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+aW9tbXVfbG9jaywgZmxhZ3MpOworCQkJaWYgKC0tZG9tYWluLT5pb21tdV9jb3VudCA9PSAwKSB7CisJCQkJaWYgKGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19WSVJUVUFMX01BQ0hJTkUpCisJCQkJCXZtX2RvbWFpbl9leGl0KGRvbWFpbik7CisJCQkJZWxzZQorCQkJCQlkb21haW5fZXhpdChkb21haW4pOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5pb21tdV9sb2NrLCBmbGFncyk7CisJCX0KKwl9CisKKwlpZiAoaW9tbXUtPmdjbWQgJiBETUFfR0NNRF9URSkKKwkJaW9tbXVfZGlzYWJsZV90cmFuc2xhdGlvbihpb21tdSk7CisKKwlpZiAoaW9tbXUtPmlycSkgeworCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShpb21tdS0+aXJxLCBOVUxMKTsKKwkJLyogVGhpcyB3aWxsIG1hc2sgdGhlIGlycSAqLworCQlmcmVlX2lycShpb21tdS0+aXJxLCBpb21tdSk7CisJCWRlc3Ryb3lfaXJxKGlvbW11LT5pcnEpOworCX0KKworCWtmcmVlKGlvbW11LT5kb21haW5zKTsKKwlrZnJlZShpb21tdS0+ZG9tYWluX2lkcyk7CisKKwlnX2lvbW11c1tpb21tdS0+c2VxX2lkXSA9IE5VTEw7CisKKwkvKiBpZiBhbGwgaW9tbXVzIGFyZSBmcmVlZCwgZnJlZSBnX2lvbW11cyAqLworCWZvciAoaSA9IDA7IGkgPCBnX251bV9vZl9pb21tdXM7IGkrKykgeworCQlpZiAoZ19pb21tdXNbaV0pCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBnX251bV9vZl9pb21tdXMpCisJCWtmcmVlKGdfaW9tbXVzKTsKKworCS8qIGZyZWUgY29udGV4dCBtYXBwaW5nICovCisJZnJlZV9jb250ZXh0X3RhYmxlKGlvbW11KTsKK30KKworc3RhdGljIHN0cnVjdCBkbWFyX2RvbWFpbiAqYWxsb2NfZG9tYWluKHZvaWQpCit7CisJc3RydWN0IGRtYXJfZG9tYWluICpkb21haW47CisKKwlkb21haW4gPSBhbGxvY19kb21haW5fbWVtKCk7CisJaWYgKCFkb21haW4pCisJCXJldHVybiBOVUxMOworCisJZG9tYWluLT5uaWQgPSAtMTsKKwltZW1zZXQoJmRvbWFpbi0+aW9tbXVfYm1wLCAwLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWRvbWFpbi0+ZmxhZ3MgPSAwOworCisJcmV0dXJuIGRvbWFpbjsKK30KKworc3RhdGljIGludCBpb21tdV9hdHRhY2hfZG9tYWluKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLAorCQkJICAgICAgIHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCit7CisJaW50IG51bTsKKwl1bnNpZ25lZCBsb25nIG5kb21haW5zOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwluZG9tYWlucyA9IGNhcF9uZG9tcyhpb21tdS0+Y2FwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCisJbnVtID0gZmluZF9maXJzdF96ZXJvX2JpdChpb21tdS0+ZG9tYWluX2lkcywgbmRvbWFpbnMpOworCWlmIChudW0gPj0gbmRvbWFpbnMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJT01NVTogbm8gZnJlZSBkb21haW4gaWRzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZG9tYWluLT5pZCA9IG51bTsKKwlzZXRfYml0KG51bSwgaW9tbXUtPmRvbWFpbl9pZHMpOworCXNldF9iaXQoaW9tbXUtPnNlcV9pZCwgJmRvbWFpbi0+aW9tbXVfYm1wKTsKKwlpb21tdS0+ZG9tYWluc1tudW1dID0gZG9tYWluOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfZGV0YWNoX2RvbWFpbihzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKKwkJCQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG51bSwgbmRvbWFpbnM7CisJaW50IGZvdW5kID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCW5kb21haW5zID0gY2FwX25kb21zKGlvbW11LT5jYXApOworCWZvcl9lYWNoX3NldF9iaXQobnVtLCBpb21tdS0+ZG9tYWluX2lkcywgbmRvbWFpbnMpIHsKKwkJaWYgKGlvbW11LT5kb21haW5zW251bV0gPT0gZG9tYWluKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChmb3VuZCkgeworCQljbGVhcl9iaXQobnVtLCBpb21tdS0+ZG9tYWluX2lkcyk7CisJCWNsZWFyX2JpdChpb21tdS0+c2VxX2lkLCAmZG9tYWluLT5pb21tdV9ibXApOworCQlpb21tdS0+ZG9tYWluc1tudW1dID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBpb3ZhX2RvbWFpbiByZXNlcnZlZF9pb3ZhX2xpc3Q7CitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHJlc2VydmVkX3JidHJlZV9rZXk7CisKK3N0YXRpYyBpbnQgZG1hcl9pbml0X3Jlc2VydmVkX3Jhbmdlcyh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaW92YSAqaW92YTsKKwlpbnQgaTsKKworCWluaXRfaW92YV9kb21haW4oJnJlc2VydmVkX2lvdmFfbGlzdCwgRE1BXzMyQklUX1BGTik7CisKKwlsb2NrZGVwX3NldF9jbGFzcygmcmVzZXJ2ZWRfaW92YV9saXN0LmlvdmFfcmJ0cmVlX2xvY2ssCisJCSZyZXNlcnZlZF9yYnRyZWVfa2V5KTsKKworCS8qIElPQVBJQyByYW5nZXMgc2hvdWxkbid0IGJlIGFjY2Vzc2VkIGJ5IERNQSAqLworCWlvdmEgPSByZXNlcnZlX2lvdmEoJnJlc2VydmVkX2lvdmFfbGlzdCwgSU9WQV9QRk4oSU9BUElDX1JBTkdFX1NUQVJUKSwKKwkJSU9WQV9QRk4oSU9BUElDX1JBTkdFX0VORCkpOworCWlmICghaW92YSkgeworCQlwcmludGsoS0VSTl9FUlIgIlJlc2VydmUgSU9BUElDIHJhbmdlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFJlc2VydmUgYWxsIFBDSSBNTUlPIHRvIGF2b2lkIHBlZXItdG8tcGVlciBhY2Nlc3MgKi8KKwlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKKwkJc3RydWN0IHJlc291cmNlICpyOworCisJCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCQlyID0gJnBkZXYtPnJlc291cmNlW2ldOworCQkJaWYgKCFyLT5mbGFncyB8fCAhKHItPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKQorCQkJCWNvbnRpbnVlOworCQkJaW92YSA9IHJlc2VydmVfaW92YSgmcmVzZXJ2ZWRfaW92YV9saXN0LAorCQkJCQkgICAgSU9WQV9QRk4oci0+c3RhcnQpLAorCQkJCQkgICAgSU9WQV9QRk4oci0+ZW5kKSk7CisJCQlpZiAoIWlvdmEpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlJlc2VydmUgaW92YSBmYWlsZWRcbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkb21haW5fcmVzZXJ2ZV9zcGVjaWFsX3JhbmdlcyhzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbikKK3sKKwljb3B5X3Jlc2VydmVkX2lvdmEoJnJlc2VydmVkX2lvdmFfbGlzdCwgJmRvbWFpbi0+aW92YWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBndWVzdHdpZHRoX3RvX2FkanVzdHdpZHRoKGludCBnYXcpCit7CisJaW50IGFnYXc7CisJaW50IHIgPSAoZ2F3IC0gMTIpICUgOTsKKworCWlmIChyID09IDApCisJCWFnYXcgPSBnYXc7CisJZWxzZQorCQlhZ2F3ID0gZ2F3ICsgOSAtIHI7CisJaWYgKGFnYXcgPiA2NCkKKwkJYWdhdyA9IDY0OworCXJldHVybiBhZ2F3OworfQorCitzdGF0aWMgaW50IGRvbWFpbl9pbml0KHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLCBpbnQgZ3Vlc3Rfd2lkdGgpCit7CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKKwlpbnQgYWRqdXN0X3dpZHRoLCBhZ2F3OworCXVuc2lnbmVkIGxvbmcgc2FnYXc7CisKKwlpbml0X2lvdmFfZG9tYWluKCZkb21haW4tPmlvdmFkLCBETUFfMzJCSVRfUEZOKTsKKwlzcGluX2xvY2tfaW5pdCgmZG9tYWluLT5pb21tdV9sb2NrKTsKKworCWRvbWFpbl9yZXNlcnZlX3NwZWNpYWxfcmFuZ2VzKGRvbWFpbik7CisKKwkvKiBjYWxjdWxhdGUgQUdBVyAqLworCWlvbW11ID0gZG9tYWluX2dldF9pb21tdShkb21haW4pOworCWlmIChndWVzdF93aWR0aCA+IGNhcF9tZ2F3KGlvbW11LT5jYXApKQorCQlndWVzdF93aWR0aCA9IGNhcF9tZ2F3KGlvbW11LT5jYXApOworCWRvbWFpbi0+Z2F3ID0gZ3Vlc3Rfd2lkdGg7CisJYWRqdXN0X3dpZHRoID0gZ3Vlc3R3aWR0aF90b19hZGp1c3R3aWR0aChndWVzdF93aWR0aCk7CisJYWdhdyA9IHdpZHRoX3RvX2FnYXcoYWRqdXN0X3dpZHRoKTsKKwlzYWdhdyA9IGNhcF9zYWdhdyhpb21tdS0+Y2FwKTsKKwlpZiAoIXRlc3RfYml0KGFnYXcsICZzYWdhdykpIHsKKwkJLyogaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IGl0LCBjaG9vc2UgYSBiaWdnZXIgb25lICovCisJCXByX2RlYnVnKCJJT01NVTogaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IGFnYXcgJWRcbiIsIGFnYXcpOworCQlhZ2F3ID0gZmluZF9uZXh0X2JpdCgmc2FnYXcsIDUsIGFnYXcpOworCQlpZiAoYWdhdyA+PSA1KQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRvbWFpbi0+YWdhdyA9IGFnYXc7CisJSU5JVF9MSVNUX0hFQUQoJmRvbWFpbi0+ZGV2aWNlcyk7CisKKwlpZiAoZWNhcF9jb2hlcmVudChpb21tdS0+ZWNhcCkpCisJCWRvbWFpbi0+aW9tbXVfY29oZXJlbmN5ID0gMTsKKwllbHNlCisJCWRvbWFpbi0+aW9tbXVfY29oZXJlbmN5ID0gMDsKKworCWlmIChlY2FwX3NjX3N1cHBvcnQoaW9tbXUtPmVjYXApKQorCQlkb21haW4tPmlvbW11X3Nub29waW5nID0gMTsKKwllbHNlCisJCWRvbWFpbi0+aW9tbXVfc25vb3BpbmcgPSAwOworCisJZG9tYWluLT5pb21tdV9zdXBlcnBhZ2UgPSBmbHMoY2FwX3N1cGVyX3BhZ2VfdmFsKGlvbW11LT5jYXApKTsKKwlkb21haW4tPmlvbW11X2NvdW50ID0gMTsKKwlkb21haW4tPm5pZCA9IGlvbW11LT5ub2RlOworCisJLyogYWx3YXlzIGFsbG9jYXRlIHRoZSB0b3AgcGdkICovCisJZG9tYWluLT5wZ2QgPSAoc3RydWN0IGRtYV9wdGUgKilhbGxvY19wZ3RhYmxlX3BhZ2UoZG9tYWluLT5uaWQpOworCWlmICghZG9tYWluLT5wZ2QpCisJCXJldHVybiAtRU5PTUVNOworCV9faW9tbXVfZmx1c2hfY2FjaGUoaW9tbXUsIGRvbWFpbi0+cGdkLCBQQUdFX1NJWkUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkb21haW5fZXhpdChzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKKworCS8qIERvbWFpbiAwIGlzIHJlc2VydmVkLCBzbyBkb250IHByb2Nlc3MgaXQgKi8KKwlpZiAoIWRvbWFpbikKKwkJcmV0dXJuOworCisJLyogRmx1c2ggYW55IGxhenkgdW5tYXBzIHRoYXQgbWF5IHJlZmVyZW5jZSB0aGlzIGRvbWFpbiAqLworCWlmICghaW50ZWxfaW9tbXVfc3RyaWN0KQorCQlmbHVzaF91bm1hcHNfdGltZW91dCgwKTsKKworCWRvbWFpbl9yZW1vdmVfZGV2X2luZm8oZG9tYWluKTsKKwkvKiBkZXN0cm95IGlvdmFzICovCisJcHV0X2lvdmFfZG9tYWluKCZkb21haW4tPmlvdmFkKTsKKworCS8qIGNsZWFyIHB0ZXMgKi8KKwlkbWFfcHRlX2NsZWFyX3JhbmdlKGRvbWFpbiwgMCwgRE9NQUlOX01BWF9QRk4oZG9tYWluLT5nYXcpKTsKKworCS8qIGZyZWUgcGFnZSB0YWJsZXMgKi8KKwlkbWFfcHRlX2ZyZWVfcGFnZXRhYmxlKGRvbWFpbiwgMCwgRE9NQUlOX01BWF9QRk4oZG9tYWluLT5nYXcpKTsKKworCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkKKwkJaWYgKHRlc3RfYml0KGlvbW11LT5zZXFfaWQsICZkb21haW4tPmlvbW11X2JtcCkpCisJCQlpb21tdV9kZXRhY2hfZG9tYWluKGRvbWFpbiwgaW9tbXUpOworCisJZnJlZV9kb21haW5fbWVtKGRvbWFpbik7Cit9CisKK3N0YXRpYyBpbnQgZG9tYWluX2NvbnRleHRfbWFwcGluZ19vbmUoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sIGludCBzZWdtZW50LAorCQkJCSB1OCBidXMsIHU4IGRldmZuLCBpbnQgdHJhbnNsYXRpb24pCit7CisJc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OworCXN0cnVjdCBkbWFfcHRlICpwZ2Q7CisJdW5zaWduZWQgbG9uZyBudW07CisJdW5zaWduZWQgbG9uZyBuZG9tYWluczsKKwlpbnQgaWQ7CisJaW50IGFnYXc7CisJc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW5mbyA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiU2V0IGNvbnRleHQgbWFwcGluZyBmb3IgJTAyeDolMDJ4LiVkXG4iLAorCQlidXMsIFBDSV9TTE9UKGRldmZuKSwgUENJX0ZVTkMoZGV2Zm4pKTsKKworCUJVR19PTighZG9tYWluLT5wZ2QpOworCUJVR19PTih0cmFuc2xhdGlvbiAhPSBDT05URVhUX1RUX1BBU1NfVEhST1VHSCAmJgorCSAgICAgICB0cmFuc2xhdGlvbiAhPSBDT05URVhUX1RUX01VTFRJX0xFVkVMKTsKKworCWlvbW11ID0gZGV2aWNlX3RvX2lvbW11KHNlZ21lbnQsIGJ1cywgZGV2Zm4pOworCWlmICghaW9tbXUpCisJCXJldHVybiAtRU5PREVWOworCisJY29udGV4dCA9IGRldmljZV90b19jb250ZXh0X2VudHJ5KGlvbW11LCBidXMsIGRldmZuKTsKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybiAtRU5PTUVNOworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCWlmIChjb250ZXh0X3ByZXNlbnQoY29udGV4dCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWQgPSBkb21haW4tPmlkOworCXBnZCA9IGRvbWFpbi0+cGdkOworCisJaWYgKGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19WSVJUVUFMX01BQ0hJTkUgfHwKKwkgICAgZG9tYWluLT5mbGFncyAmIERPTUFJTl9GTEFHX1NUQVRJQ19JREVOVElUWSkgeworCQlpbnQgZm91bmQgPSAwOworCisJCS8qIGZpbmQgYW4gYXZhaWxhYmxlIGRvbWFpbiBpZCBmb3IgdGhpcyBkZXZpY2UgaW4gaW9tbXUgKi8KKwkJbmRvbWFpbnMgPSBjYXBfbmRvbXMoaW9tbXUtPmNhcCk7CisJCWZvcl9lYWNoX3NldF9iaXQobnVtLCBpb21tdS0+ZG9tYWluX2lkcywgbmRvbWFpbnMpIHsKKwkJCWlmIChpb21tdS0+ZG9tYWluc1tudW1dID09IGRvbWFpbikgeworCQkJCWlkID0gbnVtOworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChmb3VuZCA9PSAwKSB7CisJCQludW0gPSBmaW5kX2ZpcnN0X3plcm9fYml0KGlvbW11LT5kb21haW5faWRzLCBuZG9tYWlucyk7CisJCQlpZiAobnVtID49IG5kb21haW5zKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIklPTU1VOiBubyBmcmVlIGRvbWFpbiBpZHNcbiIpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCisJCQlzZXRfYml0KG51bSwgaW9tbXUtPmRvbWFpbl9pZHMpOworCQkJaW9tbXUtPmRvbWFpbnNbbnVtXSA9IGRvbWFpbjsKKwkJCWlkID0gbnVtOworCQl9CisKKwkJLyogU2tpcCB0b3AgbGV2ZWxzIG9mIHBhZ2UgdGFibGVzIGZvcgorCQkgKiBpb21tdSB3aGljaCBoYXMgbGVzcyBhZ2F3IHRoYW4gZGVmYXVsdC4KKwkJICogVW5uZWNlc3NhcnkgZm9yIFBUIG1vZGUuCisJCSAqLworCQlpZiAodHJhbnNsYXRpb24gIT0gQ09OVEVYVF9UVF9QQVNTX1RIUk9VR0gpIHsKKwkJCWZvciAoYWdhdyA9IGRvbWFpbi0+YWdhdzsgYWdhdyAhPSBpb21tdS0+YWdhdzsgYWdhdy0tKSB7CisJCQkJcGdkID0gcGh5c190b192aXJ0KGRtYV9wdGVfYWRkcihwZ2QpKTsKKwkJCQlpZiAoIWRtYV9wdGVfcHJlc2VudChwZ2QpKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWNvbnRleHRfc2V0X2RvbWFpbl9pZChjb250ZXh0LCBpZCk7CisKKwlpZiAodHJhbnNsYXRpb24gIT0gQ09OVEVYVF9UVF9QQVNTX1RIUk9VR0gpIHsKKwkJaW5mbyA9IGlvbW11X3N1cHBvcnRfZGV2X2lvdGxiKGRvbWFpbiwgc2VnbWVudCwgYnVzLCBkZXZmbik7CisJCXRyYW5zbGF0aW9uID0gaW5mbyA/IENPTlRFWFRfVFRfREVWX0lPVExCIDoKKwkJCQkgICAgIENPTlRFWFRfVFRfTVVMVElfTEVWRUw7CisJfQorCS8qCisJICogSW4gcGFzcyB0aHJvdWdoIG1vZGUsIEFXIG11c3QgYmUgcHJvZ3JhbW1lZCB0byBpbmRpY2F0ZSB0aGUgbGFyZ2VzdAorCSAqIEFHQVcgdmFsdWUgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlLiBBbmQgQVNSIGlzIGlnbm9yZWQgYnkgaGFyZHdhcmUuCisJICovCisJaWYgKHVubGlrZWx5KHRyYW5zbGF0aW9uID09IENPTlRFWFRfVFRfUEFTU19USFJPVUdIKSkKKwkJY29udGV4dF9zZXRfYWRkcmVzc193aWR0aChjb250ZXh0LCBpb21tdS0+bXNhZ2F3KTsKKwllbHNlIHsKKwkJY29udGV4dF9zZXRfYWRkcmVzc19yb290KGNvbnRleHQsIHZpcnRfdG9fcGh5cyhwZ2QpKTsKKwkJY29udGV4dF9zZXRfYWRkcmVzc193aWR0aChjb250ZXh0LCBpb21tdS0+YWdhdyk7CisJfQorCisJY29udGV4dF9zZXRfdHJhbnNsYXRpb25fdHlwZShjb250ZXh0LCB0cmFuc2xhdGlvbik7CisJY29udGV4dF9zZXRfZmF1bHRfZW5hYmxlKGNvbnRleHQpOworCWNvbnRleHRfc2V0X3ByZXNlbnQoY29udGV4dCk7CisJZG9tYWluX2ZsdXNoX2NhY2hlKGRvbWFpbiwgY29udGV4dCwgc2l6ZW9mKCpjb250ZXh0KSk7CisKKwkvKgorCSAqIEl0J3MgYSBub24tcHJlc2VudCB0byBwcmVzZW50IG1hcHBpbmcuIElmIGhhcmR3YXJlIGRvZXNuJ3QgY2FjaGUKKwkgKiBub24tcHJlc2VudCBlbnRyeSB3ZSBvbmx5IG5lZWQgdG8gZmx1c2ggdGhlIHdyaXRlLWJ1ZmZlci4gSWYgdGhlCisJICogX2RvZXNfIGNhY2hlIG5vbi1wcmVzZW50IGVudHJpZXMsIHRoZW4gaXQgZG9lcyBzbyBpbiB0aGUgc3BlY2lhbAorCSAqIGRvbWFpbiAjMCwgd2hpY2ggd2UgaGF2ZSB0byBmbHVzaDoKKwkgKi8KKwlpZiAoY2FwX2NhY2hpbmdfbW9kZShpb21tdS0+Y2FwKSkgeworCQlpb21tdS0+Zmx1c2guZmx1c2hfY29udGV4dChpb21tdSwgMCwKKwkJCQkJICAgKCgodTE2KWJ1cykgPDwgOCkgfCBkZXZmbiwKKwkJCQkJICAgRE1BX0NDTURfTUFTS19OT0JJVCwKKwkJCQkJICAgRE1BX0NDTURfREVWSUNFX0lOVkwpOworCQlpb21tdS0+Zmx1c2guZmx1c2hfaW90bGIoaW9tbXUsIGRvbWFpbi0+aWQsIDAsIDAsIERNQV9UTEJfRFNJX0ZMVVNIKTsKKwl9IGVsc2UgeworCQlpb21tdV9mbHVzaF93cml0ZV9idWZmZXIoaW9tbXUpOworCX0KKwlpb21tdV9lbmFibGVfZGV2X2lvdGxiKGluZm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG9tYWluLT5pb21tdV9sb2NrLCBmbGFncyk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGlvbW11LT5zZXFfaWQsICZkb21haW4tPmlvbW11X2JtcCkpIHsKKwkJZG9tYWluLT5pb21tdV9jb3VudCsrOworCQlpZiAoZG9tYWluLT5pb21tdV9jb3VudCA9PSAxKQorCQkJZG9tYWluLT5uaWQgPSBpb21tdS0+bm9kZTsKKwkJZG9tYWluX3VwZGF0ZV9pb21tdV9jYXAoZG9tYWluKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5pb21tdV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvbWFpbl9jb250ZXh0X21hcHBpbmcoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJaW50IHRyYW5zbGF0aW9uKQoreworCWludCByZXQ7CisJc3RydWN0IHBjaV9kZXYgKnRtcCwgKnBhcmVudDsKKworCXJldCA9IGRvbWFpbl9jb250ZXh0X21hcHBpbmdfb25lKGRvbWFpbiwgcGNpX2RvbWFpbl9ucihwZGV2LT5idXMpLAorCQkJCQkgcGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuLAorCQkJCQkgdHJhbnNsYXRpb24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBkZXBlbmRlbnQgZGV2aWNlIG1hcHBpbmcgKi8KKwl0bXAgPSBwY2lfZmluZF91cHN0cmVhbV9wY2llX2JyaWRnZShwZGV2KTsKKwlpZiAoIXRtcCkKKwkJcmV0dXJuIDA7CisJLyogU2Vjb25kYXJ5IGludGVyZmFjZSdzIGJ1cyBudW1iZXIgYW5kIGRldmZuIDAgKi8KKwlwYXJlbnQgPSBwZGV2LT5idXMtPnNlbGY7CisJd2hpbGUgKHBhcmVudCAhPSB0bXApIHsKKwkJcmV0ID0gZG9tYWluX2NvbnRleHRfbWFwcGluZ19vbmUoZG9tYWluLAorCQkJCQkJIHBjaV9kb21haW5fbnIocGFyZW50LT5idXMpLAorCQkJCQkJIHBhcmVudC0+YnVzLT5udW1iZXIsCisJCQkJCQkgcGFyZW50LT5kZXZmbiwgdHJhbnNsYXRpb24pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcGFyZW50ID0gcGFyZW50LT5idXMtPnNlbGY7CisJfQorCWlmIChwY2lfaXNfcGNpZSh0bXApKSAvKiB0aGlzIGlzIGEgUENJZS10by1QQ0kgYnJpZGdlICovCisJCXJldHVybiBkb21haW5fY29udGV4dF9tYXBwaW5nX29uZShkb21haW4sCisJCQkJCXBjaV9kb21haW5fbnIodG1wLT5zdWJvcmRpbmF0ZSksCisJCQkJCXRtcC0+c3Vib3JkaW5hdGUtPm51bWJlciwgMCwKKwkJCQkJdHJhbnNsYXRpb24pOworCWVsc2UgLyogdGhpcyBpcyBhIGxlZ2FjeSBQQ0kgYnJpZGdlICovCisJCXJldHVybiBkb21haW5fY29udGV4dF9tYXBwaW5nX29uZShkb21haW4sCisJCQkJCQkgIHBjaV9kb21haW5fbnIodG1wLT5idXMpLAorCQkJCQkJICB0bXAtPmJ1cy0+bnVtYmVyLAorCQkJCQkJICB0bXAtPmRldmZuLAorCQkJCQkJICB0cmFuc2xhdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgZG9tYWluX2NvbnRleHRfbWFwcGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IHBjaV9kZXYgKnRtcCwgKnBhcmVudDsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OworCisJaW9tbXUgPSBkZXZpY2VfdG9faW9tbXUocGNpX2RvbWFpbl9ucihwZGV2LT5idXMpLCBwZGV2LT5idXMtPm51bWJlciwKKwkJCQlwZGV2LT5kZXZmbik7CisJaWYgKCFpb21tdSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBkZXZpY2VfY29udGV4dF9tYXBwZWQoaW9tbXUsIHBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbik7CisJaWYgKCFyZXQpCisJCXJldHVybiByZXQ7CisJLyogZGVwZW5kZW50IGRldmljZSBtYXBwaW5nICovCisJdG1wID0gcGNpX2ZpbmRfdXBzdHJlYW1fcGNpZV9icmlkZ2UocGRldik7CisJaWYgKCF0bXApCisJCXJldHVybiByZXQ7CisJLyogU2Vjb25kYXJ5IGludGVyZmFjZSdzIGJ1cyBudW1iZXIgYW5kIGRldmZuIDAgKi8KKwlwYXJlbnQgPSBwZGV2LT5idXMtPnNlbGY7CisJd2hpbGUgKHBhcmVudCAhPSB0bXApIHsKKwkJcmV0ID0gZGV2aWNlX2NvbnRleHRfbWFwcGVkKGlvbW11LCBwYXJlbnQtPmJ1cy0+bnVtYmVyLAorCQkJCQkgICAgcGFyZW50LT5kZXZmbik7CisJCWlmICghcmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcGFyZW50ID0gcGFyZW50LT5idXMtPnNlbGY7CisJfQorCWlmIChwY2lfaXNfcGNpZSh0bXApKQorCQlyZXR1cm4gZGV2aWNlX2NvbnRleHRfbWFwcGVkKGlvbW11LCB0bXAtPnN1Ym9yZGluYXRlLT5udW1iZXIsCisJCQkJCSAgICAgMCk7CisJZWxzZQorCQlyZXR1cm4gZGV2aWNlX2NvbnRleHRfbWFwcGVkKGlvbW11LCB0bXAtPmJ1cy0+bnVtYmVyLAorCQkJCQkgICAgIHRtcC0+ZGV2Zm4pOworfQorCisvKiBSZXR1cm5zIGEgbnVtYmVyIG9mIFZURCBwYWdlcywgYnV0IGFsaWduZWQgdG8gTU0gcGFnZSBzaXplICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYWxpZ25lZF9ucnBhZ2VzKHVuc2lnbmVkIGxvbmcgaG9zdF9hZGRyLAorCQkJCQkgICAgc2l6ZV90IHNpemUpCit7CisJaG9zdF9hZGRyICY9IH5QQUdFX01BU0s7CisJcmV0dXJuIFBBR0VfQUxJR04oaG9zdF9hZGRyICsgc2l6ZSkgPj4gVlREX1BBR0VfU0hJRlQ7Cit9CisKKy8qIFJldHVybiBsYXJnZXN0IHBvc3NpYmxlIHN1cGVycGFnZSBsZXZlbCBmb3IgYSBnaXZlbiBtYXBwaW5nICovCitzdGF0aWMgaW5saW5lIGludCBoYXJkd2FyZV9sYXJnZXBhZ2VfY2FwcyhzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGlvdl9wZm4sCisJCQkJCSAgdW5zaWduZWQgbG9uZyBwaHlfcGZuLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGFnZXMpCit7CisJaW50IHN1cHBvcnQsIGxldmVsID0gMTsKKwl1bnNpZ25lZCBsb25nIHBmbm1lcmdlOworCisJc3VwcG9ydCA9IGRvbWFpbi0+aW9tbXVfc3VwZXJwYWdlOworCisJLyogVG8gdXNlIGEgbGFyZ2UgcGFnZSwgdGhlIHZpcnR1YWwgKmFuZCogcGh5c2ljYWwgYWRkcmVzc2VzCisJICAgbXVzdCBiZSBhbGlnbmVkIHRvIDJNaUIvMUdpQi9ldGMuIExvd2VyIGJpdHMgc2V0IGluIGVpdGhlcgorCSAgIG9mIHRoZW0gd2lsbCBtZWFuIHdlIGhhdmUgdG8gdXNlIHNtYWxsZXIgcGFnZXMuIFNvIGp1c3QKKwkgICBtZXJnZSB0aGVtIGFuZCBjaGVjayBib3RoIGF0IG9uY2UuICovCisJcGZubWVyZ2UgPSBpb3ZfcGZuIHwgcGh5X3BmbjsKKworCXdoaWxlIChzdXBwb3J0ICYmICEocGZubWVyZ2UgJiB+VlREX1NUUklERV9NQVNLKSkgeworCQlwYWdlcyA+Pj0gVlREX1NUUklERV9TSElGVDsKKwkJaWYgKCFwYWdlcykKKwkJCWJyZWFrOworCQlwZm5tZXJnZSA+Pj0gVlREX1NUUklERV9TSElGVDsKKwkJbGV2ZWwrKzsKKwkJc3VwcG9ydC0tOworCX0KKwlyZXR1cm4gbGV2ZWw7Cit9CisKK3N0YXRpYyBpbnQgX19kb21haW5fbWFwcGluZyhzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpb3ZfcGZuLAorCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGxvbmcgcGh5c19wZm4sCisJCQkgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcywgaW50IHByb3QpCit7CisJc3RydWN0IGRtYV9wdGUgKmZpcnN0X3B0ZSA9IE5VTEwsICpwdGUgPSBOVUxMOworCXBoeXNfYWRkcl90IHVuaW5pdGlhbGl6ZWRfdmFyKHB0ZXZhbCk7CisJaW50IGFkZHJfd2lkdGggPSBhZ2F3X3RvX3dpZHRoKGRvbWFpbi0+YWdhdykgLSBWVERfUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHNnX3JlczsKKwl1bnNpZ25lZCBpbnQgbGFyZ2VwYWdlX2x2bCA9IDA7CisJdW5zaWduZWQgbG9uZyBsdmxfcGFnZXMgPSAwOworCisJQlVHX09OKGFkZHJfd2lkdGggPCBCSVRTX1BFUl9MT05HICYmIChpb3ZfcGZuICsgbnJfcGFnZXMgLSAxKSA+PiBhZGRyX3dpZHRoKTsKKworCWlmICgocHJvdCAmIChETUFfUFRFX1JFQUR8RE1BX1BURV9XUklURSkpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcHJvdCAmPSBETUFfUFRFX1JFQUQgfCBETUFfUFRFX1dSSVRFIHwgRE1BX1BURV9TTlA7CisKKwlpZiAoc2cpCisJCXNnX3JlcyA9IDA7CisJZWxzZSB7CisJCXNnX3JlcyA9IG5yX3BhZ2VzICsgMTsKKwkJcHRldmFsID0gKChwaHlzX2FkZHJfdClwaHlzX3BmbiA8PCBWVERfUEFHRV9TSElGVCkgfCBwcm90OworCX0KKworCXdoaWxlIChucl9wYWdlcyA+IDApIHsKKwkJdWludDY0X3QgdG1wOworCisJCWlmICghc2dfcmVzKSB7CisJCQlzZ19yZXMgPSBhbGlnbmVkX25ycGFnZXMoc2ctPm9mZnNldCwgc2ctPmxlbmd0aCk7CisJCQlzZy0+ZG1hX2FkZHJlc3MgPSAoKGRtYV9hZGRyX3QpaW92X3BmbiA8PCBWVERfUEFHRV9TSElGVCkgKyBzZy0+b2Zmc2V0OworCQkJc2ctPmRtYV9sZW5ndGggPSBzZy0+bGVuZ3RoOworCQkJcHRldmFsID0gcGFnZV90b19waHlzKHNnX3BhZ2Uoc2cpKSB8IHByb3Q7CisJCQlwaHlzX3BmbiA9IHB0ZXZhbCA+PiBWVERfUEFHRV9TSElGVDsKKwkJfQorCisJCWlmICghcHRlKSB7CisJCQlsYXJnZXBhZ2VfbHZsID0gaGFyZHdhcmVfbGFyZ2VwYWdlX2NhcHMoZG9tYWluLCBpb3ZfcGZuLCBwaHlzX3Bmbiwgc2dfcmVzKTsKKworCQkJZmlyc3RfcHRlID0gcHRlID0gcGZuX3RvX2RtYV9wdGUoZG9tYWluLCBpb3ZfcGZuLCBsYXJnZXBhZ2VfbHZsKTsKKwkJCWlmICghcHRlKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJLyogSXQgaXMgbGFyZ2UgcGFnZSovCisJCQlpZiAobGFyZ2VwYWdlX2x2bCA+IDEpCisJCQkJcHRldmFsIHw9IERNQV9QVEVfTEFSR0VfUEFHRTsKKwkJCWVsc2UKKwkJCQlwdGV2YWwgJj0gfih1aW50NjRfdClETUFfUFRFX0xBUkdFX1BBR0U7CisKKwkJfQorCQkvKiBXZSBkb24ndCBuZWVkIGxvY2sgaGVyZSwgbm9ib2R5IGVsc2UKKwkJICogdG91Y2hlcyB0aGUgaW92YSByYW5nZQorCQkgKi8KKwkJdG1wID0gY21weGNoZzY0X2xvY2FsKCZwdGUtPnZhbCwgMFVMTCwgcHRldmFsKTsKKwkJaWYgKHRtcCkgeworCQkJc3RhdGljIGludCBkdW1wcyA9IDU7CisJCQlwcmludGsoS0VSTl9DUklUICJFUlJPUjogRE1BIFBURSBmb3IgdlBGTiAweCVseCBhbHJlYWR5IHNldCAodG8gJWxseCBub3QgJWxseClcbiIsCisJCQkgICAgICAgaW92X3BmbiwgdG1wLCAodW5zaWduZWQgbG9uZyBsb25nKXB0ZXZhbCk7CisJCQlpZiAoZHVtcHMpIHsKKwkJCQlkdW1wcy0tOworCQkJCWRlYnVnX2RtYV9kdW1wX21hcHBpbmdzKE5VTEwpOworCQkJfQorCQkJV0FSTl9PTigxKTsKKwkJfQorCisJCWx2bF9wYWdlcyA9IGx2bF90b19ucl9wYWdlcyhsYXJnZXBhZ2VfbHZsKTsKKworCQlCVUdfT04obnJfcGFnZXMgPCBsdmxfcGFnZXMpOworCQlCVUdfT04oc2dfcmVzIDwgbHZsX3BhZ2VzKTsKKworCQlucl9wYWdlcyAtPSBsdmxfcGFnZXM7CisJCWlvdl9wZm4gKz0gbHZsX3BhZ2VzOworCQlwaHlzX3BmbiArPSBsdmxfcGFnZXM7CisJCXB0ZXZhbCArPSBsdmxfcGFnZXMgKiBWVERfUEFHRV9TSVpFOworCQlzZ19yZXMgLT0gbHZsX3BhZ2VzOworCisJCS8qIElmIHRoZSBuZXh0IFBURSB3b3VsZCBiZSB0aGUgZmlyc3QgaW4gYSBuZXcgcGFnZSwgdGhlbiB3ZQorCQkgICBuZWVkIHRvIGZsdXNoIHRoZSBjYWNoZSBvbiB0aGUgZW50cmllcyB3ZSd2ZSBqdXN0IHdyaXR0ZW4uCisJCSAgIEFuZCB0aGVuIHdlJ2xsIG5lZWQgdG8gcmVjYWxjdWxhdGUgJ3B0ZScsIHNvIGNsZWFyIGl0IGFuZAorCQkgICBsZXQgaXQgZ2V0IHNldCBhZ2FpbiBpbiB0aGUgaWYgKCFwdGUpIGJsb2NrIGFib3ZlLgorCisJCSAgIElmIHdlJ3JlIGRvbmUgKCFucl9wYWdlcykgd2UgbmVlZCB0byBmbHVzaCB0aGUgY2FjaGUgdG9vLgorCisJCSAgIEFsc28gaWYgd2UndmUgYmVlbiBzZXR0aW5nIHN1cGVycGFnZXMsIHdlIG1heSBuZWVkIHRvCisJCSAgIHJlY2FsY3VsYXRlICdwdGUnIGFuZCBzd2l0Y2ggYmFjayB0byBzbWFsbGVyIHBhZ2VzIGZvciB0aGUKKwkJICAgZW5kIG9mIHRoZSBtYXBwaW5nLCBpZiB0aGUgdHJhaWxpbmcgc2l6ZSBpcyBub3QgZW5vdWdoIHRvCisJCSAgIHVzZSBhbm90aGVyIHN1cGVycGFnZSAoaS5lLiBzZ19yZXMgPCBsdmxfcGFnZXMpLiAqLworCQlwdGUrKzsKKwkJaWYgKCFucl9wYWdlcyB8fCBmaXJzdF9wdGVfaW5fcGFnZShwdGUpIHx8CisJCSAgICAobGFyZ2VwYWdlX2x2bCA+IDEgJiYgc2dfcmVzIDwgbHZsX3BhZ2VzKSkgeworCQkJZG9tYWluX2ZsdXNoX2NhY2hlKGRvbWFpbiwgZmlyc3RfcHRlLAorCQkJCQkgICAodm9pZCAqKXB0ZSAtICh2b2lkICopZmlyc3RfcHRlKTsKKwkJCXB0ZSA9IE5VTEw7CisJCX0KKworCQlpZiAoIXNnX3JlcyAmJiBucl9wYWdlcykKKwkJCXNnID0gc2dfbmV4dChzZyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkb21haW5fc2dfbWFwcGluZyhzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpb3ZfcGZuLAorCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLAorCQkJCSAgICBpbnQgcHJvdCkKK3sKKwlyZXR1cm4gX19kb21haW5fbWFwcGluZyhkb21haW4sIGlvdl9wZm4sIHNnLCAwLCBucl9wYWdlcywgcHJvdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRvbWFpbl9wZm5fbWFwcGluZyhzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpb3ZfcGZuLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBwaHlzX3BmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKKwkJCQkgICAgIGludCBwcm90KQoreworCXJldHVybiBfX2RvbWFpbl9tYXBwaW5nKGRvbWFpbiwgaW92X3BmbiwgTlVMTCwgcGh5c19wZm4sIG5yX3BhZ2VzLCBwcm90KTsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfZGV0YWNoX2RldihzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCB1OCBidXMsIHU4IGRldmZuKQoreworCWlmICghaW9tbXUpCisJCXJldHVybjsKKworCWNsZWFyX2NvbnRleHRfdGFibGUoaW9tbXUsIGJ1cywgZGV2Zm4pOworCWlvbW11LT5mbHVzaC5mbHVzaF9jb250ZXh0KGlvbW11LCAwLCAwLCAwLAorCQkJCQkgICBETUFfQ0NNRF9HTE9CQUxfSU5WTCk7CisJaW9tbXUtPmZsdXNoLmZsdXNoX2lvdGxiKGlvbW11LCAwLCAwLCAwLCBETUFfVExCX0dMT0JBTF9GTFVTSCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvbWFpbl9yZW1vdmVfZGV2X2luZm8oc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCit7CisJc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkb21haW4tPmRldmljZXMpKSB7CisJCWluZm8gPSBsaXN0X2VudHJ5KGRvbWFpbi0+ZGV2aWNlcy5uZXh0LAorCQkJc3RydWN0IGRldmljZV9kb21haW5faW5mbywgbGluayk7CisJCWxpc3RfZGVsKCZpbmZvLT5saW5rKTsKKwkJbGlzdF9kZWwoJmluZm8tPmdsb2JhbCk7CisJCWlmIChpbmZvLT5kZXYpCisJCQlpbmZvLT5kZXYtPmRldi5hcmNoZGF0YS5pb21tdSA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOworCisJCWlvbW11X2Rpc2FibGVfZGV2X2lvdGxiKGluZm8pOworCQlpb21tdSA9IGRldmljZV90b19pb21tdShpbmZvLT5zZWdtZW50LCBpbmZvLT5idXMsIGluZm8tPmRldmZuKTsKKwkJaW9tbXVfZGV0YWNoX2Rldihpb21tdSwgaW5mby0+YnVzLCBpbmZvLT5kZXZmbik7CisJCWZyZWVfZGV2aW5mb19tZW0oaW5mbyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIGZpbmRfZG9tYWluCisgKiBOb3RlOiB3ZSB1c2Ugc3RydWN0IHBjaV9kZXYtPmRldi5hcmNoZGF0YS5pb21tdSBzdG9yZXMgdGhlIGluZm8KKyAqLworc3RhdGljIHN0cnVjdCBkbWFyX2RvbWFpbiAqCitmaW5kX2RvbWFpbihzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvICppbmZvOworCisJLyogTm8gbG9jayBoZXJlLCBhc3N1bWVzIG5vIGRvbWFpbiBleGl0IGluIG5vcm1hbCBjYXNlICovCisJaW5mbyA9IHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKKwlpZiAoaW5mbykKKwkJcmV0dXJuIGluZm8tPmRvbWFpbjsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogZG9tYWluIGlzIGluaXRpYWxpemVkICovCitzdGF0aWMgc3RydWN0IGRtYXJfZG9tYWluICpnZXRfZG9tYWluX2Zvcl9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBnYXcpCit7CisJc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sICpmb3VuZCA9IE5VTEw7CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7CisJc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW5mbywgKnRtcDsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2X3RtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBidXMgPSAwLCBkZXZmbiA9IDA7CisJaW50IHNlZ21lbnQ7CisJaW50IHJldDsKKworCWRvbWFpbiA9IGZpbmRfZG9tYWluKHBkZXYpOworCWlmIChkb21haW4pCisJCXJldHVybiBkb21haW47CisKKwlzZWdtZW50ID0gcGNpX2RvbWFpbl9ucihwZGV2LT5idXMpOworCisJZGV2X3RtcCA9IHBjaV9maW5kX3Vwc3RyZWFtX3BjaWVfYnJpZGdlKHBkZXYpOworCWlmIChkZXZfdG1wKSB7CisJCWlmIChwY2lfaXNfcGNpZShkZXZfdG1wKSkgeworCQkJYnVzID0gZGV2X3RtcC0+c3Vib3JkaW5hdGUtPm51bWJlcjsKKwkJCWRldmZuID0gMDsKKwkJfSBlbHNlIHsKKwkJCWJ1cyA9IGRldl90bXAtPmJ1cy0+bnVtYmVyOworCQkJZGV2Zm4gPSBkZXZfdG1wLT5kZXZmbjsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5mbywgJmRldmljZV9kb21haW5fbGlzdCwgZ2xvYmFsKSB7CisJCQlpZiAoaW5mby0+c2VnbWVudCA9PSBzZWdtZW50ICYmCisJCQkgICAgaW5mby0+YnVzID09IGJ1cyAmJiBpbmZvLT5kZXZmbiA9PSBkZXZmbikgeworCQkJCWZvdW5kID0gaW5mby0+ZG9tYWluOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOworCQkvKiBwY2llLXBjaSBicmlkZ2UgYWxyZWFkeSBoYXMgYSBkb21haW4sIHVzZXMgaXQgKi8KKwkJaWYgKGZvdW5kKSB7CisJCQlkb21haW4gPSBmb3VuZDsKKwkJCWdvdG8gZm91bmRfZG9tYWluOworCQl9CisJfQorCisJZG9tYWluID0gYWxsb2NfZG9tYWluKCk7CisJaWYgKCFkb21haW4pCisJCWdvdG8gZXJyb3I7CisKKwkvKiBBbGxvY2F0ZSBuZXcgZG9tYWluIGZvciB0aGUgZGV2aWNlICovCisJZHJoZCA9IGRtYXJfZmluZF9tYXRjaGVkX2RyaGRfdW5pdChwZGV2KTsKKwlpZiAoIWRyaGQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJT01NVTogY2FuJ3QgZmluZCBETUFSIGZvciBkZXZpY2UgJXNcbiIsCisJCQlwY2lfbmFtZShwZGV2KSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpb21tdSA9IGRyaGQtPmlvbW11OworCisJcmV0ID0gaW9tbXVfYXR0YWNoX2RvbWFpbihkb21haW4sIGlvbW11KTsKKwlpZiAocmV0KSB7CisJCWZyZWVfZG9tYWluX21lbShkb21haW4pOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChkb21haW5faW5pdChkb21haW4sIGdhdykpIHsKKwkJZG9tYWluX2V4aXQoZG9tYWluKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiByZWdpc3RlciBwY2llLXRvLXBjaSBkZXZpY2UgKi8KKwlpZiAoZGV2X3RtcCkgeworCQlpbmZvID0gYWxsb2NfZGV2aW5mb19tZW0oKTsKKwkJaWYgKCFpbmZvKSB7CisJCQlkb21haW5fZXhpdChkb21haW4pOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlpbmZvLT5zZWdtZW50ID0gc2VnbWVudDsKKwkJaW5mby0+YnVzID0gYnVzOworCQlpbmZvLT5kZXZmbiA9IGRldmZuOworCQlpbmZvLT5kZXYgPSBOVUxMOworCQlpbmZvLT5kb21haW4gPSBkb21haW47CisJCS8qIFRoaXMgZG9tYWluIGlzIHNoYXJlZCBieSBkZXZpY2VzIHVuZGVyIHAycCBicmlkZ2UgKi8KKwkJZG9tYWluLT5mbGFncyB8PSBET01BSU5fRkxBR19QMlBfTVVMVElQTEVfREVWSUNFUzsKKworCQkvKiBwY2llLXRvLXBjaSBicmlkZ2UgYWxyZWFkeSBoYXMgYSBkb21haW4sIHVzZXMgaXQgKi8KKwkJZm91bmQgPSBOVUxMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmZGV2aWNlX2RvbWFpbl9saXN0LCBnbG9iYWwpIHsKKwkJCWlmICh0bXAtPnNlZ21lbnQgPT0gc2VnbWVudCAmJgorCQkJICAgIHRtcC0+YnVzID09IGJ1cyAmJiB0bXAtPmRldmZuID09IGRldmZuKSB7CisJCQkJZm91bmQgPSB0bXAtPmRvbWFpbjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZm91bmQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOworCQkJZnJlZV9kZXZpbmZvX21lbShpbmZvKTsKKwkJCWRvbWFpbl9leGl0KGRvbWFpbik7CisJCQlkb21haW4gPSBmb3VuZDsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfYWRkKCZpbmZvLT5saW5rLCAmZG9tYWluLT5kZXZpY2VzKTsKKwkJCWxpc3RfYWRkKCZpbmZvLT5nbG9iYWwsICZkZXZpY2VfZG9tYWluX2xpc3QpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7CisJCX0KKwl9CisKK2ZvdW5kX2RvbWFpbjoKKwlpbmZvID0gYWxsb2NfZGV2aW5mb19tZW0oKTsKKwlpZiAoIWluZm8pCisJCWdvdG8gZXJyb3I7CisJaW5mby0+c2VnbWVudCA9IHNlZ21lbnQ7CisJaW5mby0+YnVzID0gcGRldi0+YnVzLT5udW1iZXI7CisJaW5mby0+ZGV2Zm4gPSBwZGV2LT5kZXZmbjsKKwlpbmZvLT5kZXYgPSBwZGV2OworCWluZm8tPmRvbWFpbiA9IGRvbWFpbjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7CisJLyogc29tZWJvZHkgaXMgZmFzdCAqLworCWZvdW5kID0gZmluZF9kb21haW4ocGRldik7CisJaWYgKGZvdW5kICE9IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7CisJCWlmIChmb3VuZCAhPSBkb21haW4pIHsKKwkJCWRvbWFpbl9leGl0KGRvbWFpbik7CisJCQlkb21haW4gPSBmb3VuZDsKKwkJfQorCQlmcmVlX2RldmluZm9fbWVtKGluZm8pOworCQlyZXR1cm4gZG9tYWluOworCX0KKwlsaXN0X2FkZCgmaW5mby0+bGluaywgJmRvbWFpbi0+ZGV2aWNlcyk7CisJbGlzdF9hZGQoJmluZm8tPmdsb2JhbCwgJmRldmljZV9kb21haW5fbGlzdCk7CisJcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11ID0gaW5mbzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZG9tYWluOworZXJyb3I6CisJLyogcmVjaGVjayBpdCBoZXJlLCBtYXliZSBvdGhlcnMgc2V0IGl0ICovCisJcmV0dXJuIGZpbmRfZG9tYWluKHBkZXYpOworfQorCitzdGF0aWMgaW50IGlvbW11X2lkZW50aXR5X21hcHBpbmc7CisjZGVmaW5lIElERU5UTUFQX0FMTAkJMQorI2RlZmluZSBJREVOVE1BUF9HRlgJCTIKKyNkZWZpbmUgSURFTlRNQVBfQVpBTElBCQk0CisKK3N0YXRpYyBpbnQgaW9tbXVfZG9tYWluX2lkZW50aXR5X21hcChzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBmaXJzdF92cGZuID0gc3RhcnQgPj4gVlREX1BBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBsYXN0X3ZwZm4gPSBlbmQgPj4gVlREX1BBR0VfU0hJRlQ7CisKKwlpZiAoIXJlc2VydmVfaW92YSgmZG9tYWluLT5pb3ZhZCwgZG1hX3RvX21tX3BmbihmaXJzdF92cGZuKSwKKwkJCSAgZG1hX3RvX21tX3BmbihsYXN0X3ZwZm4pKSkgeworCQlwcmludGsoS0VSTl9FUlIgIklPTU1VOiByZXNlcnZlIGlvdmEgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJfZGVidWcoIk1hcHBpbmcgcmVzZXJ2ZWQgcmVnaW9uICVsbHgtJWxseCBmb3IgZG9tYWluICVkXG4iLAorCQkgc3RhcnQsIGVuZCwgZG9tYWluLT5pZCk7CisJLyoKKwkgKiBSTVJSIHJhbmdlIG1pZ2h0IGhhdmUgb3ZlcmxhcCB3aXRoIHBoeXNpY2FsIG1lbW9yeSByYW5nZSwKKwkgKiBjbGVhciBpdCBmaXJzdAorCSAqLworCWRtYV9wdGVfY2xlYXJfcmFuZ2UoZG9tYWluLCBmaXJzdF92cGZuLCBsYXN0X3ZwZm4pOworCisJcmV0dXJuIGRvbWFpbl9wZm5fbWFwcGluZyhkb21haW4sIGZpcnN0X3ZwZm4sIGZpcnN0X3ZwZm4sCisJCQkJICBsYXN0X3ZwZm4gLSBmaXJzdF92cGZuICsgMSwKKwkJCQkgIERNQV9QVEVfUkVBRHxETUFfUFRFX1dSSVRFKTsKK30KKworc3RhdGljIGludCBpb21tdV9wcmVwYXJlX2lkZW50aXR5X21hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGVuZCkKK3sKKwlzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbjsKKwlpbnQgcmV0OworCisJZG9tYWluID0gZ2V0X2RvbWFpbl9mb3JfZGV2KHBkZXYsIERFRkFVTFRfRE9NQUlOX0FERFJFU1NfV0lEVEgpOworCWlmICghZG9tYWluKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEZvciBfaGFyZHdhcmVfIHBhc3N0aHJvdWdoLCBkb24ndCBib3RoZXIuIEJ1dCBmb3Igc29mdHdhcmUKKwkgICBwYXNzdGhyb3VnaCwgd2UgZG8gaXQgYW55d2F5IC0tIGl0IG1heSBpbmRpY2F0ZSBhIG1lbW9yeQorCSAgIHJhbmdlIHdoaWNoIGlzIHJlc2VydmVkIGluIEU4MjAsIHNvIHdoaWNoIGRpZG4ndCBnZXQgc2V0CisJICAgdXAgdG8gc3RhcnQgd2l0aCBpbiBzaV9kb21haW4gKi8KKwlpZiAoZG9tYWluID09IHNpX2RvbWFpbiAmJiBod19wYXNzX3Rocm91Z2gpIHsKKwkJcHJpbnRrKCJJZ25vcmluZyBpZGVudGl0eSBtYXAgZm9yIEhXIHBhc3N0aHJvdWdoIGRldmljZSAlcyBbMHglTHggLSAweCVMeF1cbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgc3RhcnQsIGVuZCk7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgIklPTU1VOiBTZXR0aW5nIGlkZW50aXR5IG1hcCBmb3IgZGV2aWNlICVzIFsweCVMeCAtIDB4JUx4XVxuIiwKKwkgICAgICAgcGNpX25hbWUocGRldiksIHN0YXJ0LCBlbmQpOworCQorCWlmIChlbmQgPCBzdGFydCkgeworCQlXQVJOKDEsICJZb3VyIEJJT1MgaXMgYnJva2VuOyBSTVJSIGVuZHMgYmVmb3JlIGl0IHN0YXJ0cyFcbiIKKwkJCSJCSU9TIHZlbmRvcjogJXM7IFZlcjogJXM7IFByb2R1Y3QgVmVyc2lvbjogJXNcbiIsCisJCQlkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CSU9TX1ZFTkRPUiksCisJCQlkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CSU9TX1ZFUlNJT04pLAorCQkgICAgIGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1BST0RVQ1RfVkVSU0lPTikpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChlbmQgPj4gYWdhd190b193aWR0aChkb21haW4tPmFnYXcpKSB7CisJCVdBUk4oMSwgIllvdXIgQklPUyBpcyBicm9rZW47IFJNUlIgZXhjZWVkcyBwZXJtaXR0ZWQgYWRkcmVzcyB3aWR0aCAoJWQgYml0cylcbiIKKwkJICAgICAiQklPUyB2ZW5kb3I6ICVzOyBWZXI6ICVzOyBQcm9kdWN0IFZlcnNpb246ICVzXG4iLAorCQkgICAgIGFnYXdfdG9fd2lkdGgoZG9tYWluLT5hZ2F3KSwKKwkJICAgICBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CSU9TX1ZFTkRPUiksCisJCSAgICAgZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQklPU19WRVJTSU9OKSwKKwkJICAgICBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX1ZFUlNJT04pKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSBpb21tdV9kb21haW5faWRlbnRpdHlfbWFwKGRvbWFpbiwgc3RhcnQsIGVuZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIGNvbnRleHQgZW50cnkgaW5pdCAqLworCXJldCA9IGRvbWFpbl9jb250ZXh0X21hcHBpbmcoZG9tYWluLCBwZGV2LCBDT05URVhUX1RUX01VTFRJX0xFVkVMKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlkb21haW5fZXhpdChkb21haW4pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlvbW11X3ByZXBhcmVfcm1ycl9kZXYoc3RydWN0IGRtYXJfcm1ycl91bml0ICpybXJyLAorCXN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXUgPT0gRFVNTVlfREVWSUNFX0RPTUFJTl9JTkZPKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaW9tbXVfcHJlcGFyZV9pZGVudGl0eV9tYXAocGRldiwgcm1yci0+YmFzZV9hZGRyZXNzLAorCQlybXJyLT5lbmRfYWRkcmVzcyk7Cit9CisKKyNpZmRlZiBDT05GSUdfRE1BUl9GTE9QUFlfV0EKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb21tdV9wcmVwYXJlX2lzYSh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCWludCByZXQ7CisKKwlwZGV2ID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfQlJJREdFX0lTQSA8PCA4LCBOVUxMKTsKKwlpZiAoIXBkZXYpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0lORk8gIklPTU1VOiBQcmVwYXJlIDAtMTZNaUIgdW5pdHkgbWFwcGluZyBmb3IgTFBDXG4iKTsKKwlyZXQgPSBpb21tdV9wcmVwYXJlX2lkZW50aXR5X21hcChwZGV2LCAwLCAxNioxMDI0KjEwMjQgLSAxKTsKKworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0VSUiAiSU9NTVU6IEZhaWxlZCB0byBjcmVhdGUgMC0xNk1pQiBpZGVudGl0eSBtYXA7ICIKKwkJICAgICAgICJmbG9wcHkgbWlnaHQgbm90IHdvcmtcbiIpOworCit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGlvbW11X3ByZXBhcmVfaXNhKHZvaWQpCit7CisJcmV0dXJuOworfQorI2VuZGlmIC8qICFDT05GSUdfRE1BUl9GTFBZX1dBICovCisKK3N0YXRpYyBpbnQgbWRfZG9tYWluX2luaXQoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sIGludCBndWVzdF93aWR0aCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHNpX2RvbWFpbl93b3JrX2ZuKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4sIHZvaWQgKmRhdGF4KQoreworCWludCAqcmV0ID0gZGF0YXg7CisKKwkqcmV0ID0gaW9tbXVfZG9tYWluX2lkZW50aXR5X21hcChzaV9kb21haW4sCisJCQkJCSAodWludDY0X3Qpc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQsCisJCQkJCSAodWludDY0X3QpZW5kX3BmbiA8PCBQQUdFX1NISUZUKTsKKwlyZXR1cm4gKnJldDsKKworfQorCitzdGF0aWMgaW50IF9faW5pdCBzaV9kb21haW5faW5pdChpbnQgaHcpCit7CisJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CisJaW50IG5pZCwgcmV0ID0gMDsKKworCXNpX2RvbWFpbiA9IGFsbG9jX2RvbWFpbigpOworCWlmICghc2lfZG9tYWluKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXByX2RlYnVnKCJJZGVudGl0eSBtYXBwaW5nIGRvbWFpbiBpcyBkb21haW4gJWRcbiIsIHNpX2RvbWFpbi0+aWQpOworCisJZm9yX2VhY2hfYWN0aXZlX2lvbW11KGlvbW11LCBkcmhkKSB7CisJCXJldCA9IGlvbW11X2F0dGFjaF9kb21haW4oc2lfZG9tYWluLCBpb21tdSk7CisJCWlmIChyZXQpIHsKKwkJCWRvbWFpbl9leGl0KHNpX2RvbWFpbik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCWlmIChtZF9kb21haW5faW5pdChzaV9kb21haW4sIERFRkFVTFRfRE9NQUlOX0FERFJFU1NfV0lEVEgpKSB7CisJCWRvbWFpbl9leGl0KHNpX2RvbWFpbik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNpX2RvbWFpbi0+ZmxhZ3MgPSBET01BSU5fRkxBR19TVEFUSUNfSURFTlRJVFk7CisKKwlpZiAoaHcpCisJCXJldHVybiAwOworCisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCXdvcmtfd2l0aF9hY3RpdmVfcmVnaW9ucyhuaWQsIHNpX2RvbWFpbl93b3JrX2ZuLCAmcmV0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvbWFpbl9yZW1vdmVfb25lX2Rldl9pbmZvKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLAorCQkJCQkgIHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgaWRlbnRpdHlfbWFwcGluZyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvICppbmZvOworCisJaWYgKGxpa2VseSghaW9tbXVfaWRlbnRpdHlfbWFwcGluZykpCisJCXJldHVybiAwOworCisJaW5mbyA9IHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKKwlpZiAoaW5mbyAmJiBpbmZvICE9IERVTU1ZX0RFVklDRV9ET01BSU5fSU5GTykKKwkJcmV0dXJuIChpbmZvLT5kb21haW4gPT0gc2lfZG9tYWluKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvbWFpbl9hZGRfZGV2X2luZm8oc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCisJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgICAgaW50IHRyYW5zbGF0aW9uKQoreworCXN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8gKmluZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJaW5mbyA9IGFsbG9jX2RldmluZm9fbWVtKCk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGRvbWFpbl9jb250ZXh0X21hcHBpbmcoZG9tYWluLCBwZGV2LCB0cmFuc2xhdGlvbik7CisJaWYgKHJldCkgeworCQlmcmVlX2RldmluZm9fbWVtKGluZm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCWluZm8tPnNlZ21lbnQgPSBwY2lfZG9tYWluX25yKHBkZXYtPmJ1cyk7CisJaW5mby0+YnVzID0gcGRldi0+YnVzLT5udW1iZXI7CisJaW5mby0+ZGV2Zm4gPSBwZGV2LT5kZXZmbjsKKwlpbmZvLT5kZXYgPSBwZGV2OworCWluZm8tPmRvbWFpbiA9IGRvbWFpbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmaW5mby0+bGluaywgJmRvbWFpbi0+ZGV2aWNlcyk7CisJbGlzdF9hZGQoJmluZm8tPmdsb2JhbCwgJmRldmljZV9kb21haW5fbGlzdCk7CisJcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11ID0gaW5mbzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvbW11X3Nob3VsZF9pZGVudGl0eV9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBzdGFydHVwKQoreworCWlmICgoaW9tbXVfaWRlbnRpdHlfbWFwcGluZyAmIElERU5UTUFQX0FaQUxJQSkgJiYgSVNfQVpBTElBKHBkZXYpKQorCQlyZXR1cm4gMTsKKworCWlmICgoaW9tbXVfaWRlbnRpdHlfbWFwcGluZyAmIElERU5UTUFQX0dGWCkgJiYgSVNfR0ZYX0RFVklDRShwZGV2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIShpb21tdV9pZGVudGl0eV9tYXBwaW5nICYgSURFTlRNQVBfQUxMKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFdlIHdhbnQgdG8gc3RhcnQgb2ZmIHdpdGggYWxsIGRldmljZXMgaW4gdGhlIDE6MSBkb21haW4sIGFuZAorCSAqIHRha2UgdGhlbSBvdXQgbGF0ZXIgaWYgd2UgZmluZCB0aGV5IGNhbid0IGFjY2VzcyBhbGwgb2YgbWVtb3J5LgorCSAqCisJICogSG93ZXZlciwgd2UgY2FuJ3QgZG8gdGhpcyBmb3IgUENJIGRldmljZXMgYmVoaW5kIGJyaWRnZXMsCisJICogYmVjYXVzZSBhbGwgUENJIGRldmljZXMgYmVoaW5kIHRoZSBzYW1lIGJyaWRnZSB3aWxsIGVuZCB1cAorCSAqIHdpdGggdGhlIHNhbWUgc291cmNlLWlkIG9uIHRoZWlyIHRyYW5zYWN0aW9ucy4KKwkgKgorCSAqIFByYWN0aWNhbGx5IHNwZWFraW5nLCB3ZSBjYW4ndCBjaGFuZ2UgdGhpbmdzIGFyb3VuZCBmb3IgdGhlc2UKKwkgKiBkZXZpY2VzIGF0IHJ1bi10aW1lLCBiZWNhdXNlIHdlIGNhbid0IGJlIHN1cmUgdGhlcmUnbGwgYmUgbm8KKwkgKiBETUEgdHJhbnNhY3Rpb25zIGluIGZsaWdodCBmb3IgYW55IG9mIHRoZWlyIHNpYmxpbmdzLgorCSAqIAorCSAqIFNvIFBDSSBkZXZpY2VzICh1bmxlc3MgdGhleSdyZSBvbiB0aGUgcm9vdCBidXMpIGFzIHdlbGwgYXMKKwkgKiB0aGVpciBwYXJlbnQgUENJLVBDSSBvciBQQ0llLVBDSSBicmlkZ2VzIG11c3QgYmUgbGVmdCBfb3V0XyBvZgorCSAqIHRoZSAxOjEgZG9tYWluLCBqdXN0IGluIF9jYXNlXyBvbmUgb2YgdGhlaXIgc2libGluZ3MgdHVybnMgb3V0CisJICogbm90IHRvIGJlIGFibGUgdG8gbWFwIGFsbCBvZiBtZW1vcnkuCisJICovCisJaWYgKCFwY2lfaXNfcGNpZShwZGV2KSkgeworCQlpZiAoIXBjaV9pc19yb290X2J1cyhwZGV2LT5idXMpKQorCQkJcmV0dXJuIDA7CisJCWlmIChwZGV2LT5jbGFzcyA+PiA4ID09IFBDSV9DTEFTU19CUklER0VfUENJKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChwZGV2LT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX1BDSV9CUklER0UpCisJCXJldHVybiAwOworCisJLyogCisJICogQXQgYm9vdCB0aW1lLCB3ZSBkb24ndCB5ZXQga25vdyBpZiBkZXZpY2VzIHdpbGwgYmUgNjQtYml0IGNhcGFibGUuCisJICogQXNzdW1lIHRoYXQgdGhleSB3aWxsIC0tIGlmIHRoZXkgdHVybiBvdXQgbm90IHRvIGJlLCB0aGVuIHdlIGNhbiAKKwkgKiB0YWtlIHRoZW0gb3V0IG9mIHRoZSAxOjEgZG9tYWluIGxhdGVyLgorCSAqLworCWlmICghc3RhcnR1cCkgeworCQkvKgorCQkgKiBJZiB0aGUgZGV2aWNlJ3MgZG1hX21hc2sgaXMgbGVzcyB0aGFuIHRoZSBzeXN0ZW0ncyBtZW1vcnkKKwkJICogc2l6ZSB0aGVuIHRoaXMgaXMgbm90IGEgY2FuZGlkYXRlIGZvciBpZGVudGl0eSBtYXBwaW5nLgorCQkgKi8KKwkJdTY0IGRtYV9tYXNrID0gcGRldi0+ZG1hX21hc2s7CisKKwkJaWYgKHBkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayAmJgorCQkgICAgcGRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrIDwgZG1hX21hc2spCisJCQlkbWFfbWFzayA9IHBkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzazsKKworCQlyZXR1cm4gZG1hX21hc2sgPj0gZG1hX2dldF9yZXF1aXJlZF9tYXNrKCZwZGV2LT5kZXYpOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpb21tdV9wcmVwYXJlX3N0YXRpY19pZGVudGl0eV9tYXBwaW5nKGludCBodykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJaW50IHJldDsKKworCXJldCA9IHNpX2RvbWFpbl9pbml0KGh3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWZvcl9lYWNoX3BjaV9kZXYocGRldikgeworCQkvKiBTa2lwIEhvc3QvUENJIEJyaWRnZSBkZXZpY2VzICovCisJCWlmIChJU19CUklER0VfSE9TVF9ERVZJQ0UocGRldikpCisJCQljb250aW51ZTsKKwkJaWYgKGlvbW11X3Nob3VsZF9pZGVudGl0eV9tYXAocGRldiwgMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIklPTU1VOiAlcyBpZGVudGl0eSBtYXBwaW5nIGZvciBkZXZpY2UgJXNcbiIsCisJCQkgICAgICAgaHcgPyAiaGFyZHdhcmUiIDogInNvZnR3YXJlIiwgcGNpX25hbWUocGRldikpOworCisJCQlyZXQgPSBkb21haW5fYWRkX2Rldl9pbmZvKHNpX2RvbWFpbiwgcGRldiwKKwkJCQkJCSAgICAgaHcgPyBDT05URVhUX1RUX1BBU1NfVEhST1VHSCA6CisJCQkJCQkgICAgIENPTlRFWFRfVFRfTVVMVElfTEVWRUwpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZG1hcnModm9pZCkKK3sKKwlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7CisJc3RydWN0IGRtYXJfcm1ycl91bml0ICpybXJyOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CisJaW50IGksIHJldDsKKworCS8qCisJICogZm9yIGVhY2ggZHJoZAorCSAqICAgIGFsbG9jYXRlIHJvb3QKKwkgKiAgICBpbml0aWFsaXplIGFuZCBwcm9ncmFtIHJvb3QgZW50cnkgdG8gbm90IHByZXNlbnQKKwkgKiBlbmRmb3IKKwkgKi8KKwlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgeworCQlnX251bV9vZl9pb21tdXMrKzsKKwkJLyoKKwkJICogbG9jayBub3QgbmVlZGVkIGFzIHRoaXMgaXMgb25seSBpbmNyZW1lbnRlZCBpbiB0aGUgc2luZ2xlCisJCSAqIHRocmVhZGVkIGtlcm5lbCBfX2luaXQgY29kZSBwYXRoIGFsbCBvdGhlciBhY2Nlc3MgYXJlIHJlYWQKKwkJICogb25seQorCQkgKi8KKwl9CisKKwlnX2lvbW11cyA9IGtjYWxsb2MoZ19udW1fb2ZfaW9tbXVzLCBzaXplb2Yoc3RydWN0IGludGVsX2lvbW11ICopLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFnX2lvbW11cykgeworCQlwcmludGsoS0VSTl9FUlIgIkFsbG9jYXRpbmcgZ2xvYmFsIGlvbW11IGFycmF5IGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGVmZXJyZWRfZmx1c2ggPSBremFsbG9jKGdfbnVtX29mX2lvbW11cyAqCisJCXNpemVvZihzdHJ1Y3QgZGVmZXJyZWRfZmx1c2hfdGFibGVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZWZlcnJlZF9mbHVzaCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7CisJCWlmIChkcmhkLT5pZ25vcmVkKQorCQkJY29udGludWU7CisKKwkJaW9tbXUgPSBkcmhkLT5pb21tdTsKKwkJZ19pb21tdXNbaW9tbXUtPnNlcV9pZF0gPSBpb21tdTsKKworCQlyZXQgPSBpb21tdV9pbml0X2RvbWFpbnMoaW9tbXUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQkvKgorCQkgKiBUQkQ6CisJCSAqIHdlIGNvdWxkIHNoYXJlIHRoZSBzYW1lIHJvb3QgJiBjb250ZXh0IHRhYmxlcworCQkgKiBhbW9uZyBhbGwgSU9NTVUncy4gTmVlZCB0byBTcGxpdCBpdCBsYXRlci4KKwkJICovCisJCXJldCA9IGlvbW11X2FsbG9jX3Jvb3RfZW50cnkoaW9tbXUpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIklPTU1VOiBhbGxvY2F0ZSByb290IGVudHJ5IGZhaWxlZFxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWlmICghZWNhcF9wYXNzX3Rocm91Z2goaW9tbXUtPmVjYXApKQorCQkJaHdfcGFzc190aHJvdWdoID0gMDsKKwl9CisKKwkvKgorCSAqIFN0YXJ0IGZyb20gdGhlIHNhbmUgaW9tbXUgaGFyZHdhcmUgc3RhdGUuCisJICovCisJZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKKwkJaWYgKGRyaGQtPmlnbm9yZWQpCisJCQljb250aW51ZTsKKworCQlpb21tdSA9IGRyaGQtPmlvbW11OworCisJCS8qCisJCSAqIElmIHRoZSBxdWV1ZWQgaW52YWxpZGF0aW9uIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgYnkgdXMKKwkJICogKGZvciBleGFtcGxlLCB3aGlsZSBlbmFibGluZyBpbnRlcnJ1cHQtcmVtYXBwaW5nKSB0aGVuCisJCSAqIHdlIGdvdCB0aGUgdGhpbmdzIGFscmVhZHkgcm9sbGluZyBmcm9tIGEgc2FuZSBzdGF0ZS4KKwkJICovCisJCWlmIChpb21tdS0+cWkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBDbGVhciBhbnkgcHJldmlvdXMgZmF1bHRzLgorCQkgKi8KKwkJZG1hcl9mYXVsdCgtMSwgaW9tbXUpOworCQkvKgorCQkgKiBEaXNhYmxlIHF1ZXVlZCBpbnZhbGlkYXRpb24gaWYgc3VwcG9ydGVkIGFuZCBhbHJlYWR5IGVuYWJsZWQKKwkJICogYmVmb3JlIE9TIGhhbmRvdmVyLgorCQkgKi8KKwkJZG1hcl9kaXNhYmxlX3FpKGlvbW11KTsKKwl9CisKKwlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgeworCQlpZiAoZHJoZC0+aWdub3JlZCkKKwkJCWNvbnRpbnVlOworCisJCWlvbW11ID0gZHJoZC0+aW9tbXU7CisKKwkJaWYgKGRtYXJfZW5hYmxlX3FpKGlvbW11KSkgeworCQkJLyoKKwkJCSAqIFF1ZXVlZCBJbnZhbGlkYXRlIG5vdCBlbmFibGVkLCB1c2UgUmVnaXN0ZXIgQmFzZWQKKwkJCSAqIEludmFsaWRhdGUKKwkJCSAqLworCQkJaW9tbXUtPmZsdXNoLmZsdXNoX2NvbnRleHQgPSBfX2lvbW11X2ZsdXNoX2NvbnRleHQ7CisJCQlpb21tdS0+Zmx1c2guZmx1c2hfaW90bGIgPSBfX2lvbW11X2ZsdXNoX2lvdGxiOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSU9NTVUgJWQgMHglTHg6IHVzaW5nIFJlZ2lzdGVyIGJhc2VkICIKKwkJCSAgICAgICAiaW52YWxpZGF0aW9uXG4iLAorCQkJCWlvbW11LT5zZXFfaWQsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkcmhkLT5yZWdfYmFzZV9hZGRyKTsKKwkJfSBlbHNlIHsKKwkJCWlvbW11LT5mbHVzaC5mbHVzaF9jb250ZXh0ID0gcWlfZmx1c2hfY29udGV4dDsKKwkJCWlvbW11LT5mbHVzaC5mbHVzaF9pb3RsYiA9IHFpX2ZsdXNoX2lvdGxiOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSU9NTVUgJWQgMHglTHg6IHVzaW5nIFF1ZXVlZCAiCisJCQkgICAgICAgImludmFsaWRhdGlvblxuIiwKKwkJCQlpb21tdS0+c2VxX2lkLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZHJoZC0+cmVnX2Jhc2VfYWRkcik7CisJCX0KKwl9CisKKwlpZiAoaW9tbXVfcGFzc190aHJvdWdoKQorCQlpb21tdV9pZGVudGl0eV9tYXBwaW5nIHw9IElERU5UTUFQX0FMTDsKKworI2lmZGVmIENPTkZJR19ETUFSX0JST0tFTl9HRlhfV0EKKwlpb21tdV9pZGVudGl0eV9tYXBwaW5nIHw9IElERU5UTUFQX0dGWDsKKyNlbmRpZgorCisJY2hlY2tfdHlsZXJzYnVyZ19pc29jaCgpOworCisJLyoKKwkgKiBJZiBwYXNzIHRocm91Z2ggaXMgbm90IHNldCBvciBub3QgZW5hYmxlZCwgc2V0dXAgY29udGV4dCBlbnRyaWVzIGZvcgorCSAqIGlkZW50aXR5IG1hcHBpbmdzIGZvciBybXJyLCBnZngsIGFuZCBpc2EgYW5kIG1heSBmYWxsIGJhY2sgdG8gc3RhdGljCisJICogaWRlbnRpdHkgbWFwcGluZyBpZiBpb21tdV9pZGVudGl0eV9tYXBwaW5nIGlzIHNldC4KKwkgKi8KKwlpZiAoaW9tbXVfaWRlbnRpdHlfbWFwcGluZykgeworCQlyZXQgPSBpb21tdV9wcmVwYXJlX3N0YXRpY19pZGVudGl0eV9tYXBwaW5nKGh3X3Bhc3NfdGhyb3VnaCk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIkZhaWxlZCB0byBzZXR1cCBJT01NVSBwYXNzLXRocm91Z2hcbiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwkvKgorCSAqIEZvciBlYWNoIHJtcnIKKwkgKiAgIGZvciBlYWNoIGRldiBhdHRhY2hlZCB0byBybXJyCisJICogICBkbworCSAqICAgICBsb2NhdGUgZHJoZCBmb3IgZGV2LCBhbGxvYyBkb21haW4gZm9yIGRldgorCSAqICAgICBhbGxvY2F0ZSBmcmVlIGRvbWFpbgorCSAqICAgICBhbGxvY2F0ZSBwYWdlIHRhYmxlIGVudHJpZXMgZm9yIHJtcnIKKwkgKiAgICAgaWYgY29udGV4dCBub3QgYWxsb2NhdGVkIGZvciBidXMKKwkgKiAgICAgICAgICAgYWxsb2NhdGUgYW5kIGluaXQgY29udGV4dAorCSAqICAgICAgICAgICBzZXQgcHJlc2VudCBpbiByb290IHRhYmxlIGZvciB0aGlzIGJ1cworCSAqICAgICBpbml0IGNvbnRleHQgd2l0aCBkb21haW4sIHRyYW5zbGF0aW9uIGV0YworCSAqICAgIGVuZGZvcgorCSAqIGVuZGZvcgorCSAqLworCXByaW50ayhLRVJOX0lORk8gIklPTU1VOiBTZXR0aW5nIFJNUlI6XG4iKTsKKwlmb3JfZWFjaF9ybXJyX3VuaXRzKHJtcnIpIHsKKwkJZm9yIChpID0gMDsgaSA8IHJtcnItPmRldmljZXNfY250OyBpKyspIHsKKwkJCXBkZXYgPSBybXJyLT5kZXZpY2VzW2ldOworCQkJLyoKKwkJCSAqIHNvbWUgQklPUyBsaXN0cyBub24tZXhpc3QgZGV2aWNlcyBpbiBETUFSCisJCQkgKiB0YWJsZS4KKwkJCSAqLworCQkJaWYgKCFwZGV2KQorCQkJCWNvbnRpbnVlOworCQkJcmV0ID0gaW9tbXVfcHJlcGFyZV9ybXJyX2RldihybXJyLCBwZGV2KTsKKwkJCWlmIChyZXQpCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJJT01NVTogbWFwcGluZyByZXNlcnZlZCByZWdpb24gZmFpbGVkXG4iKTsKKwkJfQorCX0KKworCWlvbW11X3ByZXBhcmVfaXNhKCk7CisKKwkvKgorCSAqIGZvciBlYWNoIGRyaGQKKwkgKiAgIGVuYWJsZSBmYXVsdCBsb2cKKwkgKiAgIGdsb2JhbCBpbnZhbGlkYXRlIGNvbnRleHQgY2FjaGUKKwkgKiAgIGdsb2JhbCBpbnZhbGlkYXRlIGlvdGxiCisJICogICBlbmFibGUgdHJhbnNsYXRpb24KKwkgKi8KKwlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgeworCQlpZiAoZHJoZC0+aWdub3JlZCkgeworCQkJLyoKKwkJCSAqIHdlIGFsd2F5cyBoYXZlIHRvIGRpc2FibGUgUE1ScyBvciBETUEgbWF5IGZhaWwgb24KKwkJCSAqIHRoaXMgZGV2aWNlCisJCQkgKi8KKwkJCWlmIChmb3JjZV9vbikKKwkJCQlpb21tdV9kaXNhYmxlX3Byb3RlY3RfbWVtX3JlZ2lvbnMoZHJoZC0+aW9tbXUpOworCQkJY29udGludWU7CisJCX0KKwkJaW9tbXUgPSBkcmhkLT5pb21tdTsKKworCQlpb21tdV9mbHVzaF93cml0ZV9idWZmZXIoaW9tbXUpOworCisJCXJldCA9IGRtYXJfc2V0X2ludGVycnVwdChpb21tdSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCWlvbW11X3NldF9yb290X2VudHJ5KGlvbW11KTsKKworCQlpb21tdS0+Zmx1c2guZmx1c2hfY29udGV4dChpb21tdSwgMCwgMCwgMCwgRE1BX0NDTURfR0xPQkFMX0lOVkwpOworCQlpb21tdS0+Zmx1c2guZmx1c2hfaW90bGIoaW9tbXUsIDAsIDAsIDAsIERNQV9UTEJfR0xPQkFMX0ZMVVNIKTsKKworCQlyZXQgPSBpb21tdV9lbmFibGVfdHJhbnNsYXRpb24oaW9tbXUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQlpb21tdV9kaXNhYmxlX3Byb3RlY3RfbWVtX3JlZ2lvbnMoaW9tbXUpOworCX0KKworCXJldHVybiAwOworZXJyb3I6CisJZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKKwkJaWYgKGRyaGQtPmlnbm9yZWQpCisJCQljb250aW51ZTsKKwkJaW9tbXUgPSBkcmhkLT5pb21tdTsKKwkJZnJlZV9pb21tdShpb21tdSk7CisJfQorCWtmcmVlKGdfaW9tbXVzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBUaGlzIHRha2VzIGEgbnVtYmVyIG9mIF9NTV8gcGFnZXMsIG5vdCBWVEQgcGFnZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgaW92YSAqaW50ZWxfYWxsb2NfaW92YShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbnJwYWdlcywgdWludDY0X3QgZG1hX21hc2spCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGlvdmEgKmlvdmEgPSBOVUxMOworCisJLyogUmVzdHJpY3QgZG1hX21hc2sgdG8gdGhlIHdpZHRoIHRoYXQgdGhlIGlvbW11IGNhbiBoYW5kbGUgKi8KKwlkbWFfbWFzayA9IG1pbl90KHVpbnQ2NF90LCBET01BSU5fTUFYX0FERFIoZG9tYWluLT5nYXcpLCBkbWFfbWFzayk7CisKKwlpZiAoIWRtYXJfZm9yY2VkYWMgJiYgZG1hX21hc2sgPiBETUFfQklUX01BU0soMzIpKSB7CisJCS8qCisJCSAqIEZpcnN0IHRyeSB0byBhbGxvY2F0ZSBhbiBpbyB2aXJ0dWFsIGFkZHJlc3MgaW4KKwkJICogRE1BX0JJVF9NQVNLKDMyKSBhbmQgaWYgdGhhdCBmYWlscyB0aGVuIHRyeSBhbGxvY2F0aW5nCisJCSAqIGZyb20gaGlnaGVyIHJhbmdlCisJCSAqLworCQlpb3ZhID0gYWxsb2NfaW92YSgmZG9tYWluLT5pb3ZhZCwgbnJwYWdlcywKKwkJCQkgIElPVkFfUEZOKERNQV9CSVRfTUFTSygzMikpLCAxKTsKKwkJaWYgKGlvdmEpCisJCQlyZXR1cm4gaW92YTsKKwl9CisJaW92YSA9IGFsbG9jX2lvdmEoJmRvbWFpbi0+aW92YWQsIG5ycGFnZXMsIElPVkFfUEZOKGRtYV9tYXNrKSwgMSk7CisJaWYgKHVubGlrZWx5KCFpb3ZhKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkFsbG9jYXRpbmcgJWxkLXBhZ2UgaW92YSBmb3IgJXMgZmFpbGVkIiwKKwkJICAgICAgIG5ycGFnZXMsIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGlvdmE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hcl9kb21haW4gKl9fZ2V0X3ZhbGlkX2RvbWFpbl9mb3JfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluOworCWludCByZXQ7CisKKwlkb21haW4gPSBnZXRfZG9tYWluX2Zvcl9kZXYocGRldiwKKwkJCURFRkFVTFRfRE9NQUlOX0FERFJFU1NfV0lEVEgpOworCWlmICghZG9tYWluKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIkFsbG9jYXRpbmcgZG9tYWluIGZvciAlcyBmYWlsZWQiLCBwY2lfbmFtZShwZGV2KSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIG1ha2Ugc3VyZSBjb250ZXh0IG1hcHBpbmcgaXMgb2sgKi8KKwlpZiAodW5saWtlbHkoIWRvbWFpbl9jb250ZXh0X21hcHBlZChwZGV2KSkpIHsKKwkJcmV0ID0gZG9tYWluX2NvbnRleHRfbWFwcGluZyhkb21haW4sIHBkZXYsCisJCQkJCSAgICAgQ09OVEVYVF9UVF9NVUxUSV9MRVZFTCk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJEb21haW4gY29udGV4dCBtYXAgZm9yICVzIGZhaWxlZCIsCisJCQkJcGNpX25hbWUocGRldikpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gZG9tYWluOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkbWFyX2RvbWFpbiAqZ2V0X3ZhbGlkX2RvbWFpbl9mb3JfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW5mbzsKKworCS8qIE5vIGxvY2sgaGVyZSwgYXNzdW1lcyBubyBkb21haW4gZXhpdCBpbiBub3JtYWwgY2FzZSAqLworCWluZm8gPSBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKKwlpZiAobGlrZWx5KGluZm8pKQorCQlyZXR1cm4gaW5mby0+ZG9tYWluOworCisJcmV0dXJuIF9fZ2V0X3ZhbGlkX2RvbWFpbl9mb3JfZGV2KGRldik7Cit9CisKK3N0YXRpYyBpbnQgaW9tbXVfZHVtbXkoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcmV0dXJuIHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdSA9PSBEVU1NWV9ERVZJQ0VfRE9NQUlOX0lORk87Cit9CisKKy8qIENoZWNrIGlmIHRoZSBwZGV2IG5lZWRzIHRvIGdvIHRocm91Z2ggbm9uLWlkZW50aXR5IG1hcCBhbmQgdW5tYXAgcHJvY2Vzcy4qLworc3RhdGljIGludCBpb21tdV9ub19tYXBwaW5nKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlpbnQgZm91bmQ7CisKKwlpZiAodW5saWtlbHkoZGV2LT5idXMgIT0gJnBjaV9idXNfdHlwZSkpCisJCXJldHVybiAxOworCisJcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlpZiAoaW9tbXVfZHVtbXkocGRldikpCisJCXJldHVybiAxOworCisJaWYgKCFpb21tdV9pZGVudGl0eV9tYXBwaW5nKQorCQlyZXR1cm4gMDsKKworCWZvdW5kID0gaWRlbnRpdHlfbWFwcGluZyhwZGV2KTsKKwlpZiAoZm91bmQpIHsKKwkJaWYgKGlvbW11X3Nob3VsZF9pZGVudGl0eV9tYXAocGRldiwgMCkpCisJCQlyZXR1cm4gMTsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogMzIgYml0IERNQSBpcyByZW1vdmVkIGZyb20gc2lfZG9tYWluIGFuZCBmYWxsIGJhY2sKKwkJCSAqIHRvIG5vbi1pZGVudGl0eSBtYXBwaW5nLgorCQkJICovCisJCQlkb21haW5fcmVtb3ZlX29uZV9kZXZfaW5mbyhzaV9kb21haW4sIHBkZXYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiMzJiaXQgJXMgdXNlcyBub24taWRlbnRpdHkgbWFwcGluZ1xuIiwKKwkJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIEluIGNhc2Ugb2YgYSBkZXRhY2hlZCA2NCBiaXQgRE1BIGRldmljZSBmcm9tIHZtLCB0aGUgZGV2aWNlCisJCSAqIGlzIHB1dCBpbnRvIHNpX2RvbWFpbiBmb3IgaWRlbnRpdHkgbWFwcGluZy4KKwkJICovCisJCWlmIChpb21tdV9zaG91bGRfaWRlbnRpdHlfbWFwKHBkZXYsIDApKSB7CisJCQlpbnQgcmV0OworCQkJcmV0ID0gZG9tYWluX2FkZF9kZXZfaW5mbyhzaV9kb21haW4sIHBkZXYsCisJCQkJCQkgIGh3X3Bhc3NfdGhyb3VnaCA/CisJCQkJCQkgIENPTlRFWFRfVFRfUEFTU19USFJPVUdIIDoKKwkJCQkJCSAgQ09OVEVYVF9UVF9NVUxUSV9MRVZFTCk7CisJCQlpZiAoIXJldCkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIjY0Yml0ICVzIHVzZXMgaWRlbnRpdHkgbWFwcGluZ1xuIiwKKwkJCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBkbWFfYWRkcl90IF9faW50ZWxfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgcGh5c19hZGRyX3QgcGFkZHIsCisJCQkJICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpciwgdTY0IGRtYV9tYXNrKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihod2Rldik7CisJc3RydWN0IGRtYXJfZG9tYWluICpkb21haW47CisJcGh5c19hZGRyX3Qgc3RhcnRfcGFkZHI7CisJc3RydWN0IGlvdmEgKmlvdmE7CisJaW50IHByb3QgPSAwOworCWludCByZXQ7CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKKwl1bnNpZ25lZCBsb25nIHBhZGRyX3BmbiA9IHBhZGRyID4+IFBBR0VfU0hJRlQ7CisKKwlCVUdfT04oZGlyID09IERNQV9OT05FKTsKKworCWlmIChpb21tdV9ub19tYXBwaW5nKGh3ZGV2KSkKKwkJcmV0dXJuIHBhZGRyOworCisJZG9tYWluID0gZ2V0X3ZhbGlkX2RvbWFpbl9mb3JfZGV2KHBkZXYpOworCWlmICghZG9tYWluKQorCQlyZXR1cm4gMDsKKworCWlvbW11ID0gZG9tYWluX2dldF9pb21tdShkb21haW4pOworCXNpemUgPSBhbGlnbmVkX25ycGFnZXMocGFkZHIsIHNpemUpOworCisJaW92YSA9IGludGVsX2FsbG9jX2lvdmEoaHdkZXYsIGRvbWFpbiwgZG1hX3RvX21tX3BmbihzaXplKSwgZG1hX21hc2spOworCWlmICghaW92YSkKKwkJZ290byBlcnJvcjsKKworCS8qCisJICogQ2hlY2sgaWYgRE1BUiBzdXBwb3J0cyB6ZXJvLWxlbmd0aCByZWFkcyBvbiB3cml0ZSBvbmx5CisJICogbWFwcGluZ3MuLgorCSAqLworCWlmIChkaXIgPT0gRE1BX1RPX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwgfHwgXAorCQkJIWNhcF96bHIoaW9tbXUtPmNhcCkpCisJCXByb3QgfD0gRE1BX1BURV9SRUFEOworCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkKKwkJcHJvdCB8PSBETUFfUFRFX1dSSVRFOworCS8qCisJICogcGFkZHIgLSAocGFkZHIgKyBzaXplKSBtaWdodCBiZSBwYXJ0aWFsIHBhZ2UsIHdlIHNob3VsZCBtYXAgdGhlIHdob2xlCisJICogcGFnZS4gIE5vdGU6IGlmIHR3byBwYXJ0IG9mIG9uZSBwYWdlIGFyZSBzZXBhcmF0ZWx5IG1hcHBlZCwgd2UKKwkgKiBtaWdodCBoYXZlIHR3byBndWVzdF9hZGRyIG1hcHBpbmcgdG8gdGhlIHNhbWUgaG9zdCBwYWRkciwgYnV0IHRoaXMKKwkgKiBpcyBub3QgYSBiaWcgcHJvYmxlbQorCSAqLworCXJldCA9IGRvbWFpbl9wZm5fbWFwcGluZyhkb21haW4sIG1tX3RvX2RtYV9wZm4oaW92YS0+cGZuX2xvKSwKKwkJCQkgbW1fdG9fZG1hX3BmbihwYWRkcl9wZm4pLCBzaXplLCBwcm90KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJLyogaXQncyBhIG5vbi1wcmVzZW50IHRvIHByZXNlbnQgbWFwcGluZy4gT25seSBmbHVzaCBpZiBjYWNoaW5nIG1vZGUgKi8KKwlpZiAoY2FwX2NhY2hpbmdfbW9kZShpb21tdS0+Y2FwKSkKKwkJaW9tbXVfZmx1c2hfaW90bGJfcHNpKGlvbW11LCBkb21haW4tPmlkLCBtbV90b19kbWFfcGZuKGlvdmEtPnBmbl9sbyksIHNpemUsIDEpOworCWVsc2UKKwkJaW9tbXVfZmx1c2hfd3JpdGVfYnVmZmVyKGlvbW11KTsKKworCXN0YXJ0X3BhZGRyID0gKHBoeXNfYWRkcl90KWlvdmEtPnBmbl9sbyA8PCBQQUdFX1NISUZUOworCXN0YXJ0X3BhZGRyICs9IHBhZGRyICYgflBBR0VfTUFTSzsKKwlyZXR1cm4gc3RhcnRfcGFkZHI7CisKK2Vycm9yOgorCWlmIChpb3ZhKQorCQlfX2ZyZWVfaW92YSgmZG9tYWluLT5pb3ZhZCwgaW92YSk7CisJcHJpbnRrKEtFUk5fRVJSIkRldmljZSAlcyByZXF1ZXN0OiAlenhAJWxseCBkaXIgJWQgLS0tIGZhaWxlZFxuIiwKKwkJcGNpX25hbWUocGRldiksIHNpemUsICh1bnNpZ25lZCBsb25nIGxvbmcpcGFkZHIsIGRpcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBkbWFfYWRkcl90IGludGVsX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJCSBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlyZXR1cm4gX19pbnRlbF9tYXBfc2luZ2xlKGRldiwgcGFnZV90b19waHlzKHBhZ2UpICsgb2Zmc2V0LCBzaXplLAorCQkJCSAgZGlyLCB0b19wY2lfZGV2KGRldiktPmRtYV9tYXNrKTsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfdW5tYXBzKHZvaWQpCit7CisJaW50IGksIGo7CisKKwl0aW1lcl9vbiA9IDA7CisKKwkvKiBqdXN0IGZsdXNoIHRoZW0gYWxsICovCisJZm9yIChpID0gMDsgaSA8IGdfbnVtX29mX2lvbW11czsgaSsrKSB7CisJCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBnX2lvbW11c1tpXTsKKwkJaWYgKCFpb21tdSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZGVmZXJyZWRfZmx1c2hbaV0ubmV4dCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEluIGNhY2hpbmcgbW9kZSwgZ2xvYmFsIGZsdXNoZXMgdHVybiBlbXVsYXRpb24gZXhwZW5zaXZlICovCisJCWlmICghY2FwX2NhY2hpbmdfbW9kZShpb21tdS0+Y2FwKSkKKwkJCWlvbW11LT5mbHVzaC5mbHVzaF9pb3RsYihpb21tdSwgMCwgMCwgMCwKKwkJCQkJIERNQV9UTEJfR0xPQkFMX0ZMVVNIKTsKKwkJZm9yIChqID0gMDsgaiA8IGRlZmVycmVkX2ZsdXNoW2ldLm5leHQ7IGorKykgeworCQkJdW5zaWduZWQgbG9uZyBtYXNrOworCQkJc3RydWN0IGlvdmEgKmlvdmEgPSBkZWZlcnJlZF9mbHVzaFtpXS5pb3ZhW2pdOworCQkJc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4gPSBkZWZlcnJlZF9mbHVzaFtpXS5kb21haW5bal07CisKKwkJCS8qIE9uIHJlYWwgaGFyZHdhcmUgbXVsdGlwbGUgaW52YWxpZGF0aW9ucyBhcmUgZXhwZW5zaXZlICovCisJCQlpZiAoY2FwX2NhY2hpbmdfbW9kZShpb21tdS0+Y2FwKSkKKwkJCQlpb21tdV9mbHVzaF9pb3RsYl9wc2koaW9tbXUsIGRvbWFpbi0+aWQsCisJCQkJaW92YS0+cGZuX2xvLCBpb3ZhLT5wZm5faGkgLSBpb3ZhLT5wZm5fbG8gKyAxLCAwKTsKKwkJCWVsc2UgeworCQkJCW1hc2sgPSBpbG9nMihtbV90b19kbWFfcGZuKGlvdmEtPnBmbl9oaSAtIGlvdmEtPnBmbl9sbyArIDEpKTsKKwkJCQlpb21tdV9mbHVzaF9kZXZfaW90bGIoZGVmZXJyZWRfZmx1c2hbaV0uZG9tYWluW2pdLAorCQkJCQkJKHVpbnQ2NF90KWlvdmEtPnBmbl9sbyA8PCBQQUdFX1NISUZULCBtYXNrKTsKKwkJCX0KKwkJCV9fZnJlZV9pb3ZhKCZkZWZlcnJlZF9mbHVzaFtpXS5kb21haW5bal0tPmlvdmFkLCBpb3ZhKTsKKwkJfQorCQlkZWZlcnJlZF9mbHVzaFtpXS5uZXh0ID0gMDsKKwl9CisKKwlsaXN0X3NpemUgPSAwOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF91bm1hcHNfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhc3luY191bWFwX2ZsdXNoX2xvY2ssIGZsYWdzKTsKKwlmbHVzaF91bm1hcHMoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc3luY191bWFwX2ZsdXNoX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWRkX3VubWFwKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tLCBzdHJ1Y3QgaW92YSAqaW92YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBuZXh0LCBpb21tdV9pZDsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFzeW5jX3VtYXBfZmx1c2hfbG9jaywgZmxhZ3MpOworCWlmIChsaXN0X3NpemUgPT0gSElHSF9XQVRFUl9NQVJLKQorCQlmbHVzaF91bm1hcHMoKTsKKworCWlvbW11ID0gZG9tYWluX2dldF9pb21tdShkb20pOworCWlvbW11X2lkID0gaW9tbXUtPnNlcV9pZDsKKworCW5leHQgPSBkZWZlcnJlZF9mbHVzaFtpb21tdV9pZF0ubmV4dDsKKwlkZWZlcnJlZF9mbHVzaFtpb21tdV9pZF0uZG9tYWluW25leHRdID0gZG9tOworCWRlZmVycmVkX2ZsdXNoW2lvbW11X2lkXS5pb3ZhW25leHRdID0gaW92YTsKKwlkZWZlcnJlZF9mbHVzaFtpb21tdV9pZF0ubmV4dCsrOworCisJaWYgKCF0aW1lcl9vbikgeworCQltb2RfdGltZXIoJnVubWFwX3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMCkpOworCQl0aW1lcl9vbiA9IDE7CisJfQorCWxpc3Rfc2l6ZSsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzeW5jX3VtYXBfZmx1c2hfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF91bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKKwkJCSAgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCSAgICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGRtYXJfZG9tYWluICpkb21haW47CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGxhc3RfcGZuOworCXN0cnVjdCBpb3ZhICppb3ZhOworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CisKKwlpZiAoaW9tbXVfbm9fbWFwcGluZyhkZXYpKQorCQlyZXR1cm47CisKKwlkb21haW4gPSBmaW5kX2RvbWFpbihwZGV2KTsKKwlCVUdfT04oIWRvbWFpbik7CisKKwlpb21tdSA9IGRvbWFpbl9nZXRfaW9tbXUoZG9tYWluKTsKKworCWlvdmEgPSBmaW5kX2lvdmEoJmRvbWFpbi0+aW92YWQsIElPVkFfUEZOKGRldl9hZGRyKSk7CisJaWYgKFdBUk5fT05DRSghaW92YSwgIkRyaXZlciB1bm1hcHMgdW5tYXRjaGVkIHBhZ2UgYXQgUEZOICVsbHhcbiIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2X2FkZHIpKQorCQlyZXR1cm47CisKKwlzdGFydF9wZm4gPSBtbV90b19kbWFfcGZuKGlvdmEtPnBmbl9sbyk7CisJbGFzdF9wZm4gPSBtbV90b19kbWFfcGZuKGlvdmEtPnBmbl9oaSArIDEpIC0gMTsKKworCXByX2RlYnVnKCJEZXZpY2UgJXMgdW5tYXBwaW5nOiBwZm4gJWx4LSVseFxuIiwKKwkJIHBjaV9uYW1lKHBkZXYpLCBzdGFydF9wZm4sIGxhc3RfcGZuKTsKKworCS8qICBjbGVhciB0aGUgd2hvbGUgcGFnZSAqLworCWRtYV9wdGVfY2xlYXJfcmFuZ2UoZG9tYWluLCBzdGFydF9wZm4sIGxhc3RfcGZuKTsKKworCS8qIGZyZWUgcGFnZSB0YWJsZXMgKi8KKwlkbWFfcHRlX2ZyZWVfcGFnZXRhYmxlKGRvbWFpbiwgc3RhcnRfcGZuLCBsYXN0X3Bmbik7CisKKwlpZiAoaW50ZWxfaW9tbXVfc3RyaWN0KSB7CisJCWlvbW11X2ZsdXNoX2lvdGxiX3BzaShpb21tdSwgZG9tYWluLT5pZCwgc3RhcnRfcGZuLAorCQkJCSAgICAgIGxhc3RfcGZuIC0gc3RhcnRfcGZuICsgMSwgMCk7CisJCS8qIGZyZWUgaW92YSAqLworCQlfX2ZyZWVfaW92YSgmZG9tYWluLT5pb3ZhZCwgaW92YSk7CisJfSBlbHNlIHsKKwkJYWRkX3VubWFwKGRvbWFpbiwgaW92YSk7CisJCS8qCisJCSAqIHF1ZXVlIHVwIHRoZSByZWxlYXNlIG9mIHRoZSB1bm1hcCB0byBzYXZlIHRoZSAxLzZ0aCBvZiB0aGUKKwkJICogY3B1IHVzZWQgdXAgYnkgdGhlIGlvdGxiIGZsdXNoIG9wZXJhdGlvbi4uLgorCQkgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkICppbnRlbF9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCisJCQkJICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFncykKK3sKKwl2b2lkICp2YWRkcjsKKwlpbnQgb3JkZXI7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKwlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKworCWlmICghaW9tbXVfbm9fbWFwcGluZyhod2RldikpCisJCWZsYWdzICY9IH4oR0ZQX0RNQSB8IEdGUF9ETUEzMik7CisJZWxzZSBpZiAoaHdkZXYtPmNvaGVyZW50X2RtYV9tYXNrIDwgZG1hX2dldF9yZXF1aXJlZF9tYXNrKGh3ZGV2KSkgeworCQlpZiAoaHdkZXYtPmNvaGVyZW50X2RtYV9tYXNrIDwgRE1BX0JJVF9NQVNLKDMyKSkKKwkJCWZsYWdzIHw9IEdGUF9ETUE7CisJCWVsc2UKKwkJCWZsYWdzIHw9IEdGUF9ETUEzMjsKKwl9CisKKwl2YWRkciA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFncywgb3JkZXIpOworCWlmICghdmFkZHIpCisJCXJldHVybiBOVUxMOworCW1lbXNldCh2YWRkciwgMCwgc2l6ZSk7CisKKwkqZG1hX2hhbmRsZSA9IF9faW50ZWxfbWFwX3NpbmdsZShod2RldiwgdmlydF90b19idXModmFkZHIpLCBzaXplLAorCQkJCQkgRE1BX0JJRElSRUNUSU9OQUwsCisJCQkJCSBod2Rldi0+Y29oZXJlbnRfZG1hX21hc2spOworCWlmICgqZG1hX2hhbmRsZSkKKwkJcmV0dXJuIHZhZGRyOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdmFkZHIsIG9yZGVyKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLAorCQkJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKK3sKKwlpbnQgb3JkZXI7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKwlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKworCWludGVsX3VubWFwX3BhZ2UoaHdkZXYsIGRtYV9oYW5kbGUsIHNpemUsIERNQV9CSURJUkVDVElPTkFMLCBOVUxMKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBvcmRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKKwkJCSAgIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCSAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihod2Rldik7CisJc3RydWN0IGRtYXJfZG9tYWluICpkb21haW47CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGxhc3RfcGZuOworCXN0cnVjdCBpb3ZhICppb3ZhOworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CisKKwlpZiAoaW9tbXVfbm9fbWFwcGluZyhod2RldikpCisJCXJldHVybjsKKworCWRvbWFpbiA9IGZpbmRfZG9tYWluKHBkZXYpOworCUJVR19PTighZG9tYWluKTsKKworCWlvbW11ID0gZG9tYWluX2dldF9pb21tdShkb21haW4pOworCisJaW92YSA9IGZpbmRfaW92YSgmZG9tYWluLT5pb3ZhZCwgSU9WQV9QRk4oc2dsaXN0WzBdLmRtYV9hZGRyZXNzKSk7CisJaWYgKFdBUk5fT05DRSghaW92YSwgIkRyaXZlciB1bm1hcHMgdW5tYXRjaGVkIHNnbGlzdCBhdCBQRk4gJWxseFxuIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzZ2xpc3RbMF0uZG1hX2FkZHJlc3MpKQorCQlyZXR1cm47CisKKwlzdGFydF9wZm4gPSBtbV90b19kbWFfcGZuKGlvdmEtPnBmbl9sbyk7CisJbGFzdF9wZm4gPSBtbV90b19kbWFfcGZuKGlvdmEtPnBmbl9oaSArIDEpIC0gMTsKKworCS8qICBjbGVhciB0aGUgd2hvbGUgcGFnZSAqLworCWRtYV9wdGVfY2xlYXJfcmFuZ2UoZG9tYWluLCBzdGFydF9wZm4sIGxhc3RfcGZuKTsKKworCS8qIGZyZWUgcGFnZSB0YWJsZXMgKi8KKwlkbWFfcHRlX2ZyZWVfcGFnZXRhYmxlKGRvbWFpbiwgc3RhcnRfcGZuLCBsYXN0X3Bmbik7CisKKwlpZiAoaW50ZWxfaW9tbXVfc3RyaWN0KSB7CisJCWlvbW11X2ZsdXNoX2lvdGxiX3BzaShpb21tdSwgZG9tYWluLT5pZCwgc3RhcnRfcGZuLAorCQkJCSAgICAgIGxhc3RfcGZuIC0gc3RhcnRfcGZuICsgMSwgMCk7CisJCS8qIGZyZWUgaW92YSAqLworCQlfX2ZyZWVfaW92YSgmZG9tYWluLT5pb3ZhZCwgaW92YSk7CisJfSBlbHNlIHsKKwkJYWRkX3VubWFwKGRvbWFpbiwgaW92YSk7CisJCS8qCisJCSAqIHF1ZXVlIHVwIHRoZSByZWxlYXNlIG9mIHRoZSB1bm1hcCB0byBzYXZlIHRoZSAxLzZ0aCBvZiB0aGUKKwkJICogY3B1IHVzZWQgdXAgYnkgdGhlIGlvdGxiIGZsdXNoIG9wZXJhdGlvbi4uLgorCQkgKi8KKwl9Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfbm9udHJhbnNsYXRlX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpoZGRldiwKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbGVtcywgaW50IGRpcikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCisJZm9yX2VhY2hfc2coc2dsaXN0LCBzZywgbmVsZW1zLCBpKSB7CisJCUJVR19PTighc2dfcGFnZShzZykpOworCQlzZy0+ZG1hX2FkZHJlc3MgPSBwYWdlX3RvX3BoeXMoc2dfcGFnZShzZykpICsgc2ctPm9mZnNldDsKKwkJc2ctPmRtYV9sZW5ndGggPSBzZy0+bGVuZ3RoOworCX0KKwlyZXR1cm4gbmVsZW1zOworfQorCitzdGF0aWMgaW50IGludGVsX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsCisJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCWludCBpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihod2Rldik7CisJc3RydWN0IGRtYXJfZG9tYWluICpkb21haW47CisJc2l6ZV90IHNpemUgPSAwOworCWludCBwcm90ID0gMDsKKwlzdHJ1Y3QgaW92YSAqaW92YSA9IE5VTEw7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdnBmbjsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OworCisJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CisJaWYgKGlvbW11X25vX21hcHBpbmcoaHdkZXYpKQorCQlyZXR1cm4gaW50ZWxfbm9udHJhbnNsYXRlX21hcF9zZyhod2Rldiwgc2dsaXN0LCBuZWxlbXMsIGRpcik7CisKKwlkb21haW4gPSBnZXRfdmFsaWRfZG9tYWluX2Zvcl9kZXYocGRldik7CisJaWYgKCFkb21haW4pCisJCXJldHVybiAwOworCisJaW9tbXUgPSBkb21haW5fZ2V0X2lvbW11KGRvbWFpbik7CisKKwlmb3JfZWFjaF9zZyhzZ2xpc3QsIHNnLCBuZWxlbXMsIGkpCisJCXNpemUgKz0gYWxpZ25lZF9ucnBhZ2VzKHNnLT5vZmZzZXQsIHNnLT5sZW5ndGgpOworCisJaW92YSA9IGludGVsX2FsbG9jX2lvdmEoaHdkZXYsIGRvbWFpbiwgZG1hX3RvX21tX3BmbihzaXplKSwKKwkJCQlwZGV2LT5kbWFfbWFzayk7CisJaWYgKCFpb3ZhKSB7CisJCXNnbGlzdC0+ZG1hX2xlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgRE1BUiBzdXBwb3J0cyB6ZXJvLWxlbmd0aCByZWFkcyBvbiB3cml0ZSBvbmx5CisJICogbWFwcGluZ3MuLgorCSAqLworCWlmIChkaXIgPT0gRE1BX1RPX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwgfHwgXAorCQkJIWNhcF96bHIoaW9tbXUtPmNhcCkpCisJCXByb3QgfD0gRE1BX1BURV9SRUFEOworCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkKKwkJcHJvdCB8PSBETUFfUFRFX1dSSVRFOworCisJc3RhcnRfdnBmbiA9IG1tX3RvX2RtYV9wZm4oaW92YS0+cGZuX2xvKTsKKworCXJldCA9IGRvbWFpbl9zZ19tYXBwaW5nKGRvbWFpbiwgc3RhcnRfdnBmbiwgc2dsaXN0LCBzaXplLCBwcm90KTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQkvKiAgY2xlYXIgdGhlIHBhZ2UgKi8KKwkJZG1hX3B0ZV9jbGVhcl9yYW5nZShkb21haW4sIHN0YXJ0X3ZwZm4sCisJCQkJICAgIHN0YXJ0X3ZwZm4gKyBzaXplIC0gMSk7CisJCS8qIGZyZWUgcGFnZSB0YWJsZXMgKi8KKwkJZG1hX3B0ZV9mcmVlX3BhZ2V0YWJsZShkb21haW4sIHN0YXJ0X3ZwZm4sCisJCQkJICAgICAgIHN0YXJ0X3ZwZm4gKyBzaXplIC0gMSk7CisJCS8qIGZyZWUgaW92YSAqLworCQlfX2ZyZWVfaW92YSgmZG9tYWluLT5pb3ZhZCwgaW92YSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGl0J3MgYSBub24tcHJlc2VudCB0byBwcmVzZW50IG1hcHBpbmcuIE9ubHkgZmx1c2ggaWYgY2FjaGluZyBtb2RlICovCisJaWYgKGNhcF9jYWNoaW5nX21vZGUoaW9tbXUtPmNhcCkpCisJCWlvbW11X2ZsdXNoX2lvdGxiX3BzaShpb21tdSwgZG9tYWluLT5pZCwgc3RhcnRfdnBmbiwgc2l6ZSwgMSk7CisJZWxzZQorCQlpb21tdV9mbHVzaF93cml0ZV9idWZmZXIoaW9tbXUpOworCisJcmV0dXJuIG5lbGVtczsKK30KKworc3RhdGljIGludCBpbnRlbF9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlyZXR1cm4gIWRtYV9hZGRyOworfQorCitzdHJ1Y3QgZG1hX21hcF9vcHMgaW50ZWxfZG1hX29wcyA9IHsKKwkuYWxsb2NfY29oZXJlbnQgPSBpbnRlbF9hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudCA9IGludGVsX2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zZyA9IGludGVsX21hcF9zZywKKwkudW5tYXBfc2cgPSBpbnRlbF91bm1hcF9zZywKKwkubWFwX3BhZ2UgPSBpbnRlbF9tYXBfcGFnZSwKKwkudW5tYXBfcGFnZSA9IGludGVsX3VubWFwX3BhZ2UsCisJLm1hcHBpbmdfZXJyb3IgPSBpbnRlbF9tYXBwaW5nX2Vycm9yLAorfTsKKworc3RhdGljIGlubGluZSBpbnQgaW9tbXVfZG9tYWluX2NhY2hlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlvbW11X2RvbWFpbl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJpb21tdV9kb21haW4iLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBkbWFyX2RvbWFpbiksCisJCQkJCSAwLAorCQkJCQkgU0xBQl9IV0NBQ0hFX0FMSUdOLAorCisJCQkJCSBOVUxMKTsKKwlpZiAoIWlvbW11X2RvbWFpbl9jYWNoZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGNyZWF0ZSBpb21tdV9kb21haW4gY2FjaGVcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlvbW11X2RldmluZm9fY2FjaGVfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJaW9tbXVfZGV2aW5mb19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJpb21tdV9kZXZpbmZvIiwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvKSwKKwkJCQkJIDAsCisJCQkJCSBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCSBOVUxMKTsKKwlpZiAoIWlvbW11X2RldmluZm9fY2FjaGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBjcmVhdGUgZGV2aW5mbyBjYWNoZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW9tbXVfaW92YV9jYWNoZV9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlpb21tdV9pb3ZhX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImlvbW11X2lvdmEiLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBpb3ZhKSwKKwkJCQkJIDAsCisJCQkJCSBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCSBOVUxMKTsKKwlpZiAoIWlvbW11X2lvdmFfY2FjaGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBjcmVhdGUgaW92YSBjYWNoZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW9tbXVfaW5pdF9tZW1wb29sKHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSBpb21tdV9pb3ZhX2NhY2hlX2luaXQoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaW9tbXVfZG9tYWluX2NhY2hlX2luaXQoKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbWFpbl9lcnJvcjsKKworCXJldCA9IGlvbW11X2RldmluZm9fY2FjaGVfaW5pdCgpOworCWlmICghcmV0KQorCQlyZXR1cm4gcmV0OworCisJa21lbV9jYWNoZV9kZXN0cm95KGlvbW11X2RvbWFpbl9jYWNoZSk7Citkb21haW5fZXJyb3I6CisJa21lbV9jYWNoZV9kZXN0cm95KGlvbW11X2lvdmFfY2FjaGUpOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpb21tdV9leGl0X21lbXBvb2wodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koaW9tbXVfZGV2aW5mb19jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGlvbW11X2RvbWFpbl9jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGlvbW11X2lvdmFfY2FjaGUpOworCit9CisKK3N0YXRpYyB2b2lkIHF1aXJrX2lvYXRfc25iX2xvY2FsX2lvbW11KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKKwl1MzIgdnRiYXI7CisJaW50IHJjOworCisJLyogV2Uga25vdyB0aGF0IHRoaXMgZGV2aWNlIG9uIHRoaXMgY2hpcHNldCBoYXMgaXRzIG93biBJT01NVS4KKwkgKiBJZiB3ZSBmaW5kIGl0IHVuZGVyIGEgZGlmZmVyZW50IElPTU1VLCB0aGVuIHRoZSBCSU9TIGlzIGx5aW5nCisJICogdG8gdXMuIEhvcGUgdGhhdCB0aGUgSU9NTVUgZm9yIHRoaXMgZGV2aWNlIGlzIGFjdHVhbGx5CisJICogZGlzYWJsZWQsIGFuZCBpdCBuZWVkcyBubyB0cmFuc2xhdGlvbi4uLgorCSAqLworCXJjID0gcGNpX2J1c19yZWFkX2NvbmZpZ19kd29yZChwZGV2LT5idXMsIFBDSV9ERVZGTigwLCAwKSwgMHhiMCwgJnZ0YmFyKTsKKwlpZiAocmMpIHsKKwkJLyogImNhbid0IiBoYXBwZW4gKi8KKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgImZhaWxlZCB0byBydW4gdnQtZCBxdWlya1xuIik7CisJCXJldHVybjsKKwl9CisJdnRiYXIgJj0gMHhmZmZmMDAwMDsKKworCS8qIHdlIGtub3cgdGhhdCB0aGUgdGhpcyBpb21tdSBzaG91bGQgYmUgYXQgb2Zmc2V0IDB4YTAwMCBmcm9tIHZ0YmFyICovCisJZHJoZCA9IGRtYXJfZmluZF9tYXRjaGVkX2RyaGRfdW5pdChwZGV2KTsKKwlpZiAoV0FSTl9UQUlOVF9PTkNFKCFkcmhkIHx8IGRyaGQtPnJlZ19iYXNlX2FkZHIgLSB2dGJhciAhPSAweGEwMDAsCisJCQkgICAgVEFJTlRfRklSTVdBUkVfV09SS0FST1VORCwKKwkJCSAgICAiQklPUyBhc3NpZ25lZCBpbmNvcnJlY3QgVlQtZCB1bml0IGZvciBJbnRlbChSKSBRdWlja0RhdGEgVGVjaG5vbG9neSBkZXZpY2VcbiIpKQorCQlwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXUgPSBEVU1NWV9ERVZJQ0VfRE9NQUlOX0lORk87Cit9CitERUNMQVJFX1BDSV9GSVhVUF9FTkFCTEUoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQiwgcXVpcmtfaW9hdF9zbmJfbG9jYWxfaW9tbXUpOworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9ub19yZW1hcHBpbmdfZGV2aWNlcyh2b2lkKQoreworCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKKworCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7CisJCWlmICghZHJoZC0+aW5jbHVkZV9hbGwpIHsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IGRyaGQtPmRldmljZXNfY250OyBpKyspCisJCQkJaWYgKGRyaGQtPmRldmljZXNbaV0gIT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkvKiBpZ25vcmUgRE1BUiB1bml0IGlmIG5vIHBjaSBkZXZpY2VzIGV4aXN0ICovCisJCQlpZiAoaSA9PSBkcmhkLT5kZXZpY2VzX2NudCkKKwkJCQlkcmhkLT5pZ25vcmVkID0gMTsKKwkJfQorCX0KKworCWlmIChkbWFyX21hcF9nZngpCisJCXJldHVybjsKKworCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7CisJCWludCBpOworCQlpZiAoZHJoZC0+aWdub3JlZCB8fCBkcmhkLT5pbmNsdWRlX2FsbCkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGkgPCBkcmhkLT5kZXZpY2VzX2NudDsgaSsrKQorCQkJaWYgKGRyaGQtPmRldmljZXNbaV0gJiYKKwkJCQkhSVNfR0ZYX0RFVklDRShkcmhkLT5kZXZpY2VzW2ldKSkKKwkJCQlicmVhazsKKworCQlpZiAoaSA8IGRyaGQtPmRldmljZXNfY250KQorCQkJY29udGludWU7CisKKwkJLyogYnlwYXNzIElPTU1VIGlmIGl0IGlzIGp1c3QgZm9yIGdmeCBkZXZpY2VzICovCisJCWRyaGQtPmlnbm9yZWQgPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgZHJoZC0+ZGV2aWNlc19jbnQ7IGkrKykgeworCQkJaWYgKCFkcmhkLT5kZXZpY2VzW2ldKQorCQkJCWNvbnRpbnVlOworCQkJZHJoZC0+ZGV2aWNlc1tpXS0+ZGV2LmFyY2hkYXRhLmlvbW11ID0gRFVNTVlfREVWSUNFX0RPTUFJTl9JTkZPOworCQl9CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NVU1BFTkQKK3N0YXRpYyBpbnQgaW5pdF9pb21tdV9odyh2b2lkKQoreworCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gTlVMTDsKKworCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkKKwkJaWYgKGlvbW11LT5xaSkKKwkJCWRtYXJfcmVlbmFibGVfcWkoaW9tbXUpOworCisJZm9yX2VhY2hfaW9tbXUoaW9tbXUsIGRyaGQpIHsKKwkJaWYgKGRyaGQtPmlnbm9yZWQpIHsKKwkJCS8qCisJCQkgKiB3ZSBhbHdheXMgaGF2ZSB0byBkaXNhYmxlIFBNUnMgb3IgRE1BIG1heSBmYWlsIG9uCisJCQkgKiB0aGlzIGRldmljZQorCQkJICovCisJCQlpZiAoZm9yY2Vfb24pCisJCQkJaW9tbXVfZGlzYWJsZV9wcm90ZWN0X21lbV9yZWdpb25zKGlvbW11KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCisJCWlvbW11X2ZsdXNoX3dyaXRlX2J1ZmZlcihpb21tdSk7CisKKwkJaW9tbXVfc2V0X3Jvb3RfZW50cnkoaW9tbXUpOworCisJCWlvbW11LT5mbHVzaC5mbHVzaF9jb250ZXh0KGlvbW11LCAwLCAwLCAwLAorCQkJCQkgICBETUFfQ0NNRF9HTE9CQUxfSU5WTCk7CisJCWlvbW11LT5mbHVzaC5mbHVzaF9pb3RsYihpb21tdSwgMCwgMCwgMCwKKwkJCQkJIERNQV9UTEJfR0xPQkFMX0ZMVVNIKTsKKwkJaWYgKGlvbW11X2VuYWJsZV90cmFuc2xhdGlvbihpb21tdSkpCisJCQlyZXR1cm4gMTsKKwkJaW9tbXVfZGlzYWJsZV9wcm90ZWN0X21lbV9yZWdpb25zKGlvbW11KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfZmx1c2hfYWxsKHZvaWQpCit7CisJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CisKKwlmb3JfZWFjaF9hY3RpdmVfaW9tbXUoaW9tbXUsIGRyaGQpIHsKKwkJaW9tbXUtPmZsdXNoLmZsdXNoX2NvbnRleHQoaW9tbXUsIDAsIDAsIDAsCisJCQkJCSAgIERNQV9DQ01EX0dMT0JBTF9JTlZMKTsKKwkJaW9tbXUtPmZsdXNoLmZsdXNoX2lvdGxiKGlvbW11LCAwLCAwLCAwLAorCQkJCQkgRE1BX1RMQl9HTE9CQUxfRkxVU0gpOworCX0KK30KKworc3RhdGljIGludCBpb21tdV9zdXNwZW5kKHZvaWQpCit7CisJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKworCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkgeworCQlpb21tdS0+aW9tbXVfc3RhdGUgPSBremFsbG9jKHNpemVvZih1MzIpICogTUFYX1NSX0RNQVJfUkVHUywKKwkJCQkJCSBHRlBfQVRPTUlDKTsKKwkJaWYgKCFpb21tdS0+aW9tbXVfc3RhdGUpCisJCQlnb3RvIG5vbWVtOworCX0KKworCWlvbW11X2ZsdXNoX2FsbCgpOworCisJZm9yX2VhY2hfYWN0aXZlX2lvbW11KGlvbW11LCBkcmhkKSB7CisJCWlvbW11X2Rpc2FibGVfdHJhbnNsYXRpb24oaW9tbXUpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7CisKKwkJaW9tbXUtPmlvbW11X3N0YXRlW1NSX0RNQVJfRkVDVExfUkVHXSA9CisJCQlyZWFkbChpb21tdS0+cmVnICsgRE1BUl9GRUNUTF9SRUcpOworCQlpb21tdS0+aW9tbXVfc3RhdGVbU1JfRE1BUl9GRURBVEFfUkVHXSA9CisJCQlyZWFkbChpb21tdS0+cmVnICsgRE1BUl9GRURBVEFfUkVHKTsKKwkJaW9tbXUtPmlvbW11X3N0YXRlW1NSX0RNQVJfRkVBRERSX1JFR10gPQorCQkJcmVhZGwoaW9tbXUtPnJlZyArIERNQVJfRkVBRERSX1JFRyk7CisJCWlvbW11LT5pb21tdV9zdGF0ZVtTUl9ETUFSX0ZFVUFERFJfUkVHXSA9CisJCQlyZWFkbChpb21tdS0+cmVnICsgRE1BUl9GRVVBRERSX1JFRyk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWcpOworCX0KKwlyZXR1cm4gMDsKKworbm9tZW06CisJZm9yX2VhY2hfYWN0aXZlX2lvbW11KGlvbW11LCBkcmhkKQorCQlrZnJlZShpb21tdS0+aW9tbXVfc3RhdGUpOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X3Jlc3VtZSh2b2lkKQoreworCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisKKwlpZiAoaW5pdF9pb21tdV9odygpKSB7CisJCWlmIChmb3JjZV9vbikKKwkJCXBhbmljKCJ0Ym9vdDogSU9NTVUgc2V0dXAgZmFpbGVkLCBETUFSIGNhbiBub3QgcmVzdW1lIVxuIik7CisJCWVsc2UKKwkJCVdBUk4oMSwgIklPTU1VIHNldHVwIGZhaWxlZCwgRE1BUiBjYW4gbm90IHJlc3VtZSFcbiIpOworCQlyZXR1cm47CisJfQorCisJZm9yX2VhY2hfYWN0aXZlX2lvbW11KGlvbW11LCBkcmhkKSB7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFnKTsKKworCQl3cml0ZWwoaW9tbXUtPmlvbW11X3N0YXRlW1NSX0RNQVJfRkVDVExfUkVHXSwKKwkJCWlvbW11LT5yZWcgKyBETUFSX0ZFQ1RMX1JFRyk7CisJCXdyaXRlbChpb21tdS0+aW9tbXVfc3RhdGVbU1JfRE1BUl9GRURBVEFfUkVHXSwKKwkJCWlvbW11LT5yZWcgKyBETUFSX0ZFREFUQV9SRUcpOworCQl3cml0ZWwoaW9tbXUtPmlvbW11X3N0YXRlW1NSX0RNQVJfRkVBRERSX1JFR10sCisJCQlpb21tdS0+cmVnICsgRE1BUl9GRUFERFJfUkVHKTsKKwkJd3JpdGVsKGlvbW11LT5pb21tdV9zdGF0ZVtTUl9ETUFSX0ZFVUFERFJfUkVHXSwKKwkJCWlvbW11LT5yZWcgKyBETUFSX0ZFVUFERFJfUkVHKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7CisJfQorCisJZm9yX2VhY2hfYWN0aXZlX2lvbW11KGlvbW11LCBkcmhkKQorCQlrZnJlZShpb21tdS0+aW9tbXVfc3RhdGUpOworfQorCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIGlvbW11X3N5c2NvcmVfb3BzID0geworCS5yZXN1bWUJCT0gaW9tbXVfcmVzdW1lLAorCS5zdXNwZW5kCT0gaW9tbXVfc3VzcGVuZCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2lvbW11X3BtX29wcyh2b2lkKQoreworCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZpb21tdV9zeXNjb3JlX29wcyk7Cit9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9pb21tdV9wbV9vcHModm9pZCkge30KKyNlbmRpZgkvKiBDT05GSUdfUE0gKi8KKworLyoKKyAqIEhlcmUgd2Ugb25seSByZXNwb25kIHRvIGFjdGlvbiBvZiB1bmJvdW5kIGRldmljZSBmcm9tIGRyaXZlci4KKyAqCisgKiBBZGRlZCBkZXZpY2UgaXMgbm90IGF0dGFjaGVkIHRvIGl0cyBETUFSIGRvbWFpbiBoZXJlIHlldC4gVGhhdCB3aWxsIGhhcHBlbgorICogd2hlbiBtYXBwaW5nIHRoZSBkZXZpY2UgdG8gaW92YS4KKyAqLworc3RhdGljIGludCBkZXZpY2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGRtYXJfZG9tYWluICpkb21haW47CisKKwlpZiAoaW9tbXVfbm9fbWFwcGluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCWRvbWFpbiA9IGZpbmRfZG9tYWluKHBkZXYpOworCWlmICghZG9tYWluKQorCQlyZXR1cm4gMDsKKworCWlmIChhY3Rpb24gPT0gQlVTX05PVElGWV9VTkJPVU5EX0RSSVZFUiAmJiAhaW9tbXVfcGFzc190aHJvdWdoKSB7CisJCWRvbWFpbl9yZW1vdmVfb25lX2Rldl9pbmZvKGRvbWFpbiwgcGRldik7CisKKwkJaWYgKCEoZG9tYWluLT5mbGFncyAmIERPTUFJTl9GTEFHX1ZJUlRVQUxfTUFDSElORSkgJiYKKwkJICAgICEoZG9tYWluLT5mbGFncyAmIERPTUFJTl9GTEFHX1NUQVRJQ19JREVOVElUWSkgJiYKKwkJICAgIGxpc3RfZW1wdHkoJmRvbWFpbi0+ZGV2aWNlcykpCisJCQlkb21haW5fZXhpdChkb21haW4pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGRldmljZV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGRldmljZV9ub3RpZmllciwKK307CisKK2ludCBfX2luaXQgaW50ZWxfaW9tbXVfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJLyogVlQtZCBpcyByZXF1aXJlZCBmb3IgYSBUWFQvdGJvb3QgbGF1bmNoLCBzbyBlbmZvcmNlIHRoYXQgKi8KKwlmb3JjZV9vbiA9IHRib290X2ZvcmNlX2lvbW11KCk7CisKKwlpZiAoZG1hcl90YWJsZV9pbml0KCkpIHsKKwkJaWYgKGZvcmNlX29uKQorCQkJcGFuaWMoInRib290OiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBETUFSIHRhYmxlXG4iKTsKKwkJcmV0dXJuIAktRU5PREVWOworCX0KKworCWlmIChkbWFyX2Rldl9zY29wZV9pbml0KCkpIHsKKwkJaWYgKGZvcmNlX29uKQorCQkJcGFuaWMoInRib290OiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBETUFSIGRldmljZSBzY29wZVxuIik7CisJCXJldHVybiAJLUVOT0RFVjsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoZSBuZWVkIGZvciBETUEtcmVtYXBwaW5nIGluaXRpYWxpemF0aW9uIG5vdy4KKwkgKiBBYm92ZSBpbml0aWFsaXphdGlvbiB3aWxsIGFsc28gYmUgdXNlZCBieSBJbnRlcnJ1cHQtcmVtYXBwaW5nLgorCSAqLworCWlmIChub19pb21tdSB8fCBkbWFyX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChpb21tdV9pbml0X21lbXBvb2woKSkgeworCQlpZiAoZm9yY2Vfb24pCisJCQlwYW5pYygidGJvb3Q6IEZhaWxlZCB0byBpbml0aWFsaXplIGlvbW11IG1lbW9yeVxuIik7CisJCXJldHVybiAJLUVOT0RFVjsKKwl9CisKKwlpZiAoZG1hcl9pbml0X3Jlc2VydmVkX3JhbmdlcygpKSB7CisJCWlmIChmb3JjZV9vbikKKwkJCXBhbmljKCJ0Ym9vdDogRmFpbGVkIHRvIHJlc2VydmUgaW9tbXUgcmFuZ2VzXG4iKTsKKwkJcmV0dXJuIAktRU5PREVWOworCX0KKworCWluaXRfbm9fcmVtYXBwaW5nX2RldmljZXMoKTsKKworCXJldCA9IGluaXRfZG1hcnMoKTsKKwlpZiAocmV0KSB7CisJCWlmIChmb3JjZV9vbikKKwkJCXBhbmljKCJ0Ym9vdDogRmFpbGVkIHRvIGluaXRpYWxpemUgRE1BUnNcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIklPTU1VOiBkbWFyIGluaXQgZmFpbGVkXG4iKTsKKwkJcHV0X2lvdmFfZG9tYWluKCZyZXNlcnZlZF9pb3ZhX2xpc3QpOworCQlpb21tdV9leGl0X21lbXBvb2woKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTworCSJQQ0ktRE1BOiBJbnRlbChSKSBWaXJ0dWFsaXphdGlvbiBUZWNobm9sb2d5IGZvciBEaXJlY3RlZCBJL09cbiIpOworCisJaW5pdF90aW1lcigmdW5tYXBfdGltZXIpOworI2lmZGVmIENPTkZJR19TV0lPVExCCisJc3dpb3RsYiA9IDA7CisjZW5kaWYKKwlkbWFfb3BzID0gJmludGVsX2RtYV9vcHM7CisKKwlpbml0X2lvbW11X3BtX29wcygpOworCisJcmVnaXN0ZXJfaW9tbXUoJmludGVsX2lvbW11X29wcyk7CisKKwlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnBjaV9idXNfdHlwZSwgJmRldmljZV9uYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfZGV0YWNoX2RlcGVuZGVudF9kZXZpY2VzKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsCisJCQkJCSAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICp0bXAsICpwYXJlbnQ7CisKKwlpZiAoIWlvbW11IHx8ICFwZGV2KQorCQlyZXR1cm47CisKKwkvKiBkZXBlbmRlbnQgZGV2aWNlIGRldGFjaCAqLworCXRtcCA9IHBjaV9maW5kX3Vwc3RyZWFtX3BjaWVfYnJpZGdlKHBkZXYpOworCS8qIFNlY29uZGFyeSBpbnRlcmZhY2UncyBidXMgbnVtYmVyIGFuZCBkZXZmbiAwICovCisJaWYgKHRtcCkgeworCQlwYXJlbnQgPSBwZGV2LT5idXMtPnNlbGY7CisJCXdoaWxlIChwYXJlbnQgIT0gdG1wKSB7CisJCQlpb21tdV9kZXRhY2hfZGV2KGlvbW11LCBwYXJlbnQtPmJ1cy0+bnVtYmVyLAorCQkJCQkgcGFyZW50LT5kZXZmbik7CisJCQlwYXJlbnQgPSBwYXJlbnQtPmJ1cy0+c2VsZjsKKwkJfQorCQlpZiAocGNpX2lzX3BjaWUodG1wKSkgLyogdGhpcyBpcyBhIFBDSWUtdG8tUENJIGJyaWRnZSAqLworCQkJaW9tbXVfZGV0YWNoX2Rldihpb21tdSwKKwkJCQl0bXAtPnN1Ym9yZGluYXRlLT5udW1iZXIsIDApOworCQllbHNlIC8qIHRoaXMgaXMgYSBsZWdhY3kgUENJIGJyaWRnZSAqLworCQkJaW9tbXVfZGV0YWNoX2Rldihpb21tdSwgdG1wLT5idXMtPm51bWJlciwKKwkJCQkJIHRtcC0+ZGV2Zm4pOworCX0KK30KKworc3RhdGljIHZvaWQgZG9tYWluX3JlbW92ZV9vbmVfZGV2X2luZm8oc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCisJCQkJCSAgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGZvdW5kID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnRtcDsKKworCWlvbW11ID0gZGV2aWNlX3RvX2lvbW11KHBjaV9kb21haW5fbnIocGRldi0+YnVzKSwgcGRldi0+YnVzLT5udW1iZXIsCisJCQkJcGRldi0+ZGV2Zm4pOworCWlmICghaW9tbXUpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmRvbWFpbi0+ZGV2aWNlcykgeworCQlpbmZvID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGRldmljZV9kb21haW5faW5mbywgbGluayk7CisJCWlmIChpbmZvLT5zZWdtZW50ID09IHBjaV9kb21haW5fbnIocGRldi0+YnVzKSAmJgorCQkgICAgaW5mby0+YnVzID09IHBkZXYtPmJ1cy0+bnVtYmVyICYmCisJCSAgICBpbmZvLT5kZXZmbiA9PSBwZGV2LT5kZXZmbikgeworCQkJbGlzdF9kZWwoJmluZm8tPmxpbmspOworCQkJbGlzdF9kZWwoJmluZm8tPmdsb2JhbCk7CisJCQlpZiAoaW5mby0+ZGV2KQorCQkJCWluZm8tPmRldi0+ZGV2LmFyY2hkYXRhLmlvbW11ID0gTlVMTDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOworCisJCQlpb21tdV9kaXNhYmxlX2Rldl9pb3RsYihpbmZvKTsKKwkJCWlvbW11X2RldGFjaF9kZXYoaW9tbXUsIGluZm8tPmJ1cywgaW5mby0+ZGV2Zm4pOworCQkJaW9tbXVfZGV0YWNoX2RlcGVuZGVudF9kZXZpY2VzKGlvbW11LCBwZGV2KTsKKwkJCWZyZWVfZGV2aW5mb19tZW0oaW5mbyk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKKworCQkJaWYgKGZvdW5kKQorCQkJCWJyZWFrOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogaWYgdGhlcmUgaXMgbm8gb3RoZXIgZGV2aWNlcyB1bmRlciB0aGUgc2FtZSBpb21tdQorCQkgKiBvd25lZCBieSB0aGlzIGRvbWFpbiwgY2xlYXIgdGhpcyBpb21tdSBpbiBpb21tdV9ibXAKKwkJICogdXBkYXRlIGlvbW11IGNvdW50IGFuZCBjb2hlcmVuY3kKKwkJICovCisJCWlmIChpb21tdSA9PSBkZXZpY2VfdG9faW9tbXUoaW5mby0+c2VnbWVudCwgaW5mby0+YnVzLAorCQkJCQkgICAgaW5mby0+ZGV2Zm4pKQorCQkJZm91bmQgPSAxOworCX0KKworCWlmIChmb3VuZCA9PSAwKSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wX2ZsYWdzOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZG9tYWluLT5pb21tdV9sb2NrLCB0bXBfZmxhZ3MpOworCQljbGVhcl9iaXQoaW9tbXUtPnNlcV9pZCwgJmRvbWFpbi0+aW9tbXVfYm1wKTsKKwkJZG9tYWluLT5pb21tdV9jb3VudC0tOworCQlkb21haW5fdXBkYXRlX2lvbW11X2NhcChkb21haW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmlvbW11X2xvY2ssIHRtcF9mbGFncyk7CisKKwkJaWYgKCEoZG9tYWluLT5mbGFncyAmIERPTUFJTl9GTEFHX1ZJUlRVQUxfTUFDSElORSkgJiYKKwkJICAgICEoZG9tYWluLT5mbGFncyAmIERPTUFJTl9GTEFHX1NUQVRJQ19JREVOVElUWSkpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgdG1wX2ZsYWdzKTsKKwkJCWNsZWFyX2JpdChkb21haW4tPmlkLCBpb21tdS0+ZG9tYWluX2lkcyk7CisJCQlpb21tdS0+ZG9tYWluc1tkb21haW4tPmlkXSA9IE5VTEw7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgdG1wX2ZsYWdzKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB2bV9kb21haW5fcmVtb3ZlX2FsbF9kZXZfaW5mbyhzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvICppbmZvOworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CisJdW5zaWduZWQgbG9uZyBmbGFnczEsIGZsYWdzMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzMSk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkb21haW4tPmRldmljZXMpKSB7CisJCWluZm8gPSBsaXN0X2VudHJ5KGRvbWFpbi0+ZGV2aWNlcy5uZXh0LAorCQkJc3RydWN0IGRldmljZV9kb21haW5faW5mbywgbGluayk7CisJCWxpc3RfZGVsKCZpbmZvLT5saW5rKTsKKwkJbGlzdF9kZWwoJmluZm8tPmdsb2JhbCk7CisJCWlmIChpbmZvLT5kZXYpCisJCQlpbmZvLT5kZXYtPmRldi5hcmNoZGF0YS5pb21tdSA9IE5VTEw7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFnczEpOworCisJCWlvbW11X2Rpc2FibGVfZGV2X2lvdGxiKGluZm8pOworCQlpb21tdSA9IGRldmljZV90b19pb21tdShpbmZvLT5zZWdtZW50LCBpbmZvLT5idXMsIGluZm8tPmRldmZuKTsKKwkJaW9tbXVfZGV0YWNoX2Rldihpb21tdSwgaW5mby0+YnVzLCBpbmZvLT5kZXZmbik7CisJCWlvbW11X2RldGFjaF9kZXBlbmRlbnRfZGV2aWNlcyhpb21tdSwgaW5mby0+ZGV2KTsKKworCQkvKiBjbGVhciB0aGlzIGlvbW11IGluIGlvbW11X2JtcCwgdXBkYXRlIGlvbW11IGNvdW50CisJCSAqIGFuZCBjYXBhYmlsaXRpZXMKKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkb21haW4tPmlvbW11X2xvY2ssIGZsYWdzMik7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoaW9tbXUtPnNlcV9pZCwKKwkJCQkgICAgICAgJmRvbWFpbi0+aW9tbXVfYm1wKSkgeworCQkJZG9tYWluLT5pb21tdV9jb3VudC0tOworCQkJZG9tYWluX3VwZGF0ZV9pb21tdV9jYXAoZG9tYWluKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmlvbW11X2xvY2ssIGZsYWdzMik7CisKKwkJZnJlZV9kZXZpbmZvX21lbShpbmZvKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MxKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFnczEpOworfQorCisvKiBkb21haW4gaWQgZm9yIHZpcnR1YWwgbWFjaGluZSwgaXQgd29uJ3QgYmUgc2V0IGluIGNvbnRleHQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZtX2RvbWlkOworCitzdGF0aWMgc3RydWN0IGRtYXJfZG9tYWluICppb21tdV9hbGxvY192bV9kb21haW4odm9pZCkKK3sKKwlzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbjsKKworCWRvbWFpbiA9IGFsbG9jX2RvbWFpbl9tZW0oKTsKKwlpZiAoIWRvbWFpbikKKwkJcmV0dXJuIE5VTEw7CisKKwlkb21haW4tPmlkID0gdm1fZG9taWQrKzsKKwlkb21haW4tPm5pZCA9IC0xOworCW1lbXNldCgmZG9tYWluLT5pb21tdV9ibXAsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJZG9tYWluLT5mbGFncyA9IERPTUFJTl9GTEFHX1ZJUlRVQUxfTUFDSElORTsKKworCXJldHVybiBkb21haW47Cit9CisKK3N0YXRpYyBpbnQgbWRfZG9tYWluX2luaXQoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sIGludCBndWVzdF93aWR0aCkKK3sKKwlpbnQgYWRqdXN0X3dpZHRoOworCisJaW5pdF9pb3ZhX2RvbWFpbigmZG9tYWluLT5pb3ZhZCwgRE1BXzMyQklUX1BGTik7CisJc3Bpbl9sb2NrX2luaXQoJmRvbWFpbi0+aW9tbXVfbG9jayk7CisKKwlkb21haW5fcmVzZXJ2ZV9zcGVjaWFsX3Jhbmdlcyhkb21haW4pOworCisJLyogY2FsY3VsYXRlIEFHQVcgKi8KKwlkb21haW4tPmdhdyA9IGd1ZXN0X3dpZHRoOworCWFkanVzdF93aWR0aCA9IGd1ZXN0d2lkdGhfdG9fYWRqdXN0d2lkdGgoZ3Vlc3Rfd2lkdGgpOworCWRvbWFpbi0+YWdhdyA9IHdpZHRoX3RvX2FnYXcoYWRqdXN0X3dpZHRoKTsKKworCUlOSVRfTElTVF9IRUFEKCZkb21haW4tPmRldmljZXMpOworCisJZG9tYWluLT5pb21tdV9jb3VudCA9IDA7CisJZG9tYWluLT5pb21tdV9jb2hlcmVuY3kgPSAwOworCWRvbWFpbi0+aW9tbXVfc25vb3BpbmcgPSAwOworCWRvbWFpbi0+aW9tbXVfc3VwZXJwYWdlID0gMDsKKwlkb21haW4tPm1heF9hZGRyID0gMDsKKwlkb21haW4tPm5pZCA9IC0xOworCisJLyogYWx3YXlzIGFsbG9jYXRlIHRoZSB0b3AgcGdkICovCisJZG9tYWluLT5wZ2QgPSAoc3RydWN0IGRtYV9wdGUgKilhbGxvY19wZ3RhYmxlX3BhZ2UoZG9tYWluLT5uaWQpOworCWlmICghZG9tYWluLT5wZ2QpCisJCXJldHVybiAtRU5PTUVNOworCWRvbWFpbl9mbHVzaF9jYWNoZShkb21haW4sIGRvbWFpbi0+cGdkLCBQQUdFX1NJWkUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpb21tdV9mcmVlX3ZtX2RvbWFpbihzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIG5kb21haW5zOworCisJZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKKwkJaWYgKGRyaGQtPmlnbm9yZWQpCisJCQljb250aW51ZTsKKwkJaW9tbXUgPSBkcmhkLT5pb21tdTsKKworCQluZG9tYWlucyA9IGNhcF9uZG9tcyhpb21tdS0+Y2FwKTsKKwkJZm9yX2VhY2hfc2V0X2JpdChpLCBpb21tdS0+ZG9tYWluX2lkcywgbmRvbWFpbnMpIHsKKwkJCWlmIChpb21tdS0+ZG9tYWluc1tpXSA9PSBkb21haW4pIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwkJCQljbGVhcl9iaXQoaSwgaW9tbXUtPmRvbWFpbl9pZHMpOworCQkJCWlvbW11LT5kb21haW5zW2ldID0gTlVMTDsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB2bV9kb21haW5fZXhpdChzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbikKK3sKKwkvKiBEb21haW4gMCBpcyByZXNlcnZlZCwgc28gZG9udCBwcm9jZXNzIGl0ICovCisJaWYgKCFkb21haW4pCisJCXJldHVybjsKKworCXZtX2RvbWFpbl9yZW1vdmVfYWxsX2Rldl9pbmZvKGRvbWFpbik7CisJLyogZGVzdHJveSBpb3ZhcyAqLworCXB1dF9pb3ZhX2RvbWFpbigmZG9tYWluLT5pb3ZhZCk7CisKKwkvKiBjbGVhciBwdGVzICovCisJZG1hX3B0ZV9jbGVhcl9yYW5nZShkb21haW4sIDAsIERPTUFJTl9NQVhfUEZOKGRvbWFpbi0+Z2F3KSk7CisKKwkvKiBmcmVlIHBhZ2UgdGFibGVzICovCisJZG1hX3B0ZV9mcmVlX3BhZ2V0YWJsZShkb21haW4sIDAsIERPTUFJTl9NQVhfUEZOKGRvbWFpbi0+Z2F3KSk7CisKKwlpb21tdV9mcmVlX3ZtX2RvbWFpbihkb21haW4pOworCWZyZWVfZG9tYWluX21lbShkb21haW4pOworfQorCitzdGF0aWMgaW50IGludGVsX2lvbW11X2RvbWFpbl9pbml0KHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3QgZG1hcl9kb21haW4gKmRtYXJfZG9tYWluOworCisJZG1hcl9kb21haW4gPSBpb21tdV9hbGxvY192bV9kb21haW4oKTsKKwlpZiAoIWRtYXJfZG9tYWluKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImludGVsX2lvbW11X2RvbWFpbl9pbml0OiBkbWFyX2RvbWFpbiA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChtZF9kb21haW5faW5pdChkbWFyX2RvbWFpbiwgREVGQVVMVF9ET01BSU5fQUREUkVTU19XSURUSCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiaW50ZWxfaW9tbXVfZG9tYWluX2luaXQoKSBmYWlsZWRcbiIpOworCQl2bV9kb21haW5fZXhpdChkbWFyX2RvbWFpbik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkb21haW4tPnByaXYgPSBkbWFyX2RvbWFpbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9pb21tdV9kb21haW5fZGVzdHJveShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCit7CisJc3RydWN0IGRtYXJfZG9tYWluICpkbWFyX2RvbWFpbiA9IGRvbWFpbi0+cHJpdjsKKworCWRvbWFpbi0+cHJpdiA9IE5VTEw7CisJdm1fZG9tYWluX2V4aXQoZG1hcl9kb21haW4pOworfQorCitzdGF0aWMgaW50IGludGVsX2lvbW11X2F0dGFjaF9kZXZpY2Uoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG1hcl9kb21haW4gPSBkb21haW4tPnByaXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKKwlpbnQgYWRkcl93aWR0aDsKKworCS8qIG5vcm1hbGx5IHBkZXYgaXMgbm90IG1hcHBlZCAqLworCWlmICh1bmxpa2VseShkb21haW5fY29udGV4dF9tYXBwZWQocGRldikpKSB7CisJCXN0cnVjdCBkbWFyX2RvbWFpbiAqb2xkX2RvbWFpbjsKKworCQlvbGRfZG9tYWluID0gZmluZF9kb21haW4ocGRldik7CisJCWlmIChvbGRfZG9tYWluKSB7CisJCQlpZiAoZG1hcl9kb21haW4tPmZsYWdzICYgRE9NQUlOX0ZMQUdfVklSVFVBTF9NQUNISU5FIHx8CisJCQkgICAgZG1hcl9kb21haW4tPmZsYWdzICYgRE9NQUlOX0ZMQUdfU1RBVElDX0lERU5USVRZKQorCQkJCWRvbWFpbl9yZW1vdmVfb25lX2Rldl9pbmZvKG9sZF9kb21haW4sIHBkZXYpOworCQkJZWxzZQorCQkJCWRvbWFpbl9yZW1vdmVfZGV2X2luZm8ob2xkX2RvbWFpbik7CisJCX0KKwl9CisKKwlpb21tdSA9IGRldmljZV90b19pb21tdShwY2lfZG9tYWluX25yKHBkZXYtPmJ1cyksIHBkZXYtPmJ1cy0+bnVtYmVyLAorCQkJCXBkZXYtPmRldmZuKTsKKwlpZiAoIWlvbW11KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGNoZWNrIGlmIHRoaXMgaW9tbXUgYWdhdyBpcyBzdWZmaWNpZW50IGZvciBtYXggbWFwcGVkIGFkZHJlc3MgKi8KKwlhZGRyX3dpZHRoID0gYWdhd190b193aWR0aChpb21tdS0+YWdhdyk7CisJaWYgKGFkZHJfd2lkdGggPiBjYXBfbWdhdyhpb21tdS0+Y2FwKSkKKwkJYWRkcl93aWR0aCA9IGNhcF9tZ2F3KGlvbW11LT5jYXApOworCisJaWYgKGRtYXJfZG9tYWluLT5tYXhfYWRkciA+ICgxTEwgPDwgYWRkcl93aWR0aCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW9tbXUgd2lkdGggKCVkKSBpcyBub3QgIgorCQkgICAgICAgInN1ZmZpY2llbnQgZm9yIHRoZSBtYXBwZWQgYWRkcmVzcyAoJWxseClcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgYWRkcl93aWR0aCwgZG1hcl9kb21haW4tPm1heF9hZGRyKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWRtYXJfZG9tYWluLT5nYXcgPSBhZGRyX3dpZHRoOworCisJLyoKKwkgKiBLbm9jayBvdXQgZXh0cmEgbGV2ZWxzIG9mIHBhZ2UgdGFibGVzIGlmIG5lY2Vzc2FyeQorCSAqLworCXdoaWxlIChpb21tdS0+YWdhdyA8IGRtYXJfZG9tYWluLT5hZ2F3KSB7CisJCXN0cnVjdCBkbWFfcHRlICpwdGU7CisKKwkJcHRlID0gZG1hcl9kb21haW4tPnBnZDsKKwkJaWYgKGRtYV9wdGVfcHJlc2VudChwdGUpKSB7CisJCQlkbWFyX2RvbWFpbi0+cGdkID0gKHN0cnVjdCBkbWFfcHRlICopCisJCQkJcGh5c190b192aXJ0KGRtYV9wdGVfYWRkcihwdGUpKTsKKwkJCWZyZWVfcGd0YWJsZV9wYWdlKHB0ZSk7CisJCX0KKwkJZG1hcl9kb21haW4tPmFnYXctLTsKKwl9CisKKwlyZXR1cm4gZG9tYWluX2FkZF9kZXZfaW5mbyhkbWFyX2RvbWFpbiwgcGRldiwgQ09OVEVYVF9UVF9NVUxUSV9MRVZFTCk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2lvbW11X2RldGFjaF9kZXZpY2Uoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZG1hcl9kb21haW4gKmRtYXJfZG9tYWluID0gZG9tYWluLT5wcml2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCisJZG9tYWluX3JlbW92ZV9vbmVfZGV2X2luZm8oZG1hcl9kb21haW4sIHBkZXYpOworfQorCitzdGF0aWMgaW50IGludGVsX2lvbW11X21hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkgICB1bnNpZ25lZCBsb25nIGlvdmEsIHBoeXNfYWRkcl90IGhwYSwKKwkJCSAgIGludCBnZnBfb3JkZXIsIGludCBpb21tdV9wcm90KQoreworCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG1hcl9kb21haW4gPSBkb21haW4tPnByaXY7CisJdTY0IG1heF9hZGRyOworCWludCBwcm90ID0gMDsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgcmV0OworCisJaWYgKGlvbW11X3Byb3QgJiBJT01NVV9SRUFEKQorCQlwcm90IHw9IERNQV9QVEVfUkVBRDsKKwlpZiAoaW9tbXVfcHJvdCAmIElPTU1VX1dSSVRFKQorCQlwcm90IHw9IERNQV9QVEVfV1JJVEU7CisJaWYgKChpb21tdV9wcm90ICYgSU9NTVVfQ0FDSEUpICYmIGRtYXJfZG9tYWluLT5pb21tdV9zbm9vcGluZykKKwkJcHJvdCB8PSBETUFfUFRFX1NOUDsKKworCXNpemUgICAgID0gUEFHRV9TSVpFIDw8IGdmcF9vcmRlcjsKKwltYXhfYWRkciA9IGlvdmEgKyBzaXplOworCWlmIChkbWFyX2RvbWFpbi0+bWF4X2FkZHIgPCBtYXhfYWRkcikgeworCQl1NjQgZW5kOworCisJCS8qIGNoZWNrIGlmIG1pbmltdW0gYWdhdyBpcyBzdWZmaWNpZW50IGZvciBtYXBwZWQgYWRkcmVzcyAqLworCQllbmQgPSBfX0RPTUFJTl9NQVhfQUREUihkbWFyX2RvbWFpbi0+Z2F3KSArIDE7CisJCWlmIChlbmQgPCBtYXhfYWRkcikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW9tbXUgd2lkdGggKCVkKSBpcyBub3QgIgorCQkJICAgICAgICJzdWZmaWNpZW50IGZvciB0aGUgbWFwcGVkIGFkZHJlc3MgKCVsbHgpXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBkbWFyX2RvbWFpbi0+Z2F3LCBtYXhfYWRkcik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlkbWFyX2RvbWFpbi0+bWF4X2FkZHIgPSBtYXhfYWRkcjsKKwl9CisJLyogUm91bmQgdXAgc2l6ZSB0byBuZXh0IG11bHRpcGxlIG9mIFBBR0VfU0laRSwgaWYgaXQgYW5kCisJICAgdGhlIGxvdyBiaXRzIG9mIGhwYSB3b3VsZCB0YWtlIHVzIG9udG8gdGhlIG5leHQgcGFnZSAqLworCXNpemUgPSBhbGlnbmVkX25ycGFnZXMoaHBhLCBzaXplKTsKKwlyZXQgPSBkb21haW5fcGZuX21hcHBpbmcoZG1hcl9kb21haW4sIGlvdmEgPj4gVlREX1BBR0VfU0hJRlQsCisJCQkJIGhwYSA+PiBWVERfUEFHRV9TSElGVCwgc2l6ZSwgcHJvdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbnRlbF9pb21tdV91bm1hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgaW92YSwgaW50IGdmcF9vcmRlcikKK3sKKwlzdHJ1Y3QgZG1hcl9kb21haW4gKmRtYXJfZG9tYWluID0gZG9tYWluLT5wcml2OworCXNpemVfdCBzaXplID0gUEFHRV9TSVpFIDw8IGdmcF9vcmRlcjsKKworCWRtYV9wdGVfY2xlYXJfcmFuZ2UoZG1hcl9kb21haW4sIGlvdmEgPj4gVlREX1BBR0VfU0hJRlQsCisJCQkgICAgKGlvdmEgKyBzaXplIC0gMSkgPj4gVlREX1BBR0VfU0hJRlQpOworCisJaWYgKGRtYXJfZG9tYWluLT5tYXhfYWRkciA9PSBpb3ZhICsgc2l6ZSkKKwkJZG1hcl9kb21haW4tPm1heF9hZGRyID0gaW92YTsKKworCXJldHVybiBnZnBfb3JkZXI7Cit9CisKK3N0YXRpYyBwaHlzX2FkZHJfdCBpbnRlbF9pb21tdV9pb3ZhX3RvX3BoeXMoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBpb3ZhKQoreworCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG1hcl9kb21haW4gPSBkb21haW4tPnByaXY7CisJc3RydWN0IGRtYV9wdGUgKnB0ZTsKKwl1NjQgcGh5cyA9IDA7CisKKwlwdGUgPSBwZm5fdG9fZG1hX3B0ZShkbWFyX2RvbWFpbiwgaW92YSA+PiBWVERfUEFHRV9TSElGVCwgMCk7CisJaWYgKHB0ZSkKKwkJcGh5cyA9IGRtYV9wdGVfYWRkcihwdGUpOworCisJcmV0dXJuIHBoeXM7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfaW9tbXVfZG9tYWluX2hhc19jYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY2FwKQoreworCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG1hcl9kb21haW4gPSBkb21haW4tPnByaXY7CisKKwlpZiAoY2FwID09IElPTU1VX0NBUF9DQUNIRV9DT0hFUkVOQ1kpCisJCXJldHVybiBkbWFyX2RvbWFpbi0+aW9tbXVfc25vb3Bpbmc7CisJaWYgKGNhcCA9PSBJT01NVV9DQVBfSU5UUl9SRU1BUCkKKwkJcmV0dXJuIGludHJfcmVtYXBwaW5nX2VuYWJsZWQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9vcHMgaW50ZWxfaW9tbXVfb3BzID0geworCS5kb21haW5faW5pdAk9IGludGVsX2lvbW11X2RvbWFpbl9pbml0LAorCS5kb21haW5fZGVzdHJveSA9IGludGVsX2lvbW11X2RvbWFpbl9kZXN0cm95LAorCS5hdHRhY2hfZGV2CT0gaW50ZWxfaW9tbXVfYXR0YWNoX2RldmljZSwKKwkuZGV0YWNoX2Rldgk9IGludGVsX2lvbW11X2RldGFjaF9kZXZpY2UsCisJLm1hcAkJPSBpbnRlbF9pb21tdV9tYXAsCisJLnVubWFwCQk9IGludGVsX2lvbW11X3VubWFwLAorCS5pb3ZhX3RvX3BoeXMJPSBpbnRlbF9pb21tdV9pb3ZhX3RvX3BoeXMsCisJLmRvbWFpbl9oYXNfY2FwID0gaW50ZWxfaW9tbXVfZG9tYWluX2hhc19jYXAsCit9OworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfaW9tbXVfcndiZihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCS8qCisJICogTW9iaWxlIDQgU2VyaWVzIENoaXBzZXQgbmVnbGVjdHMgdG8gc2V0IFJXQkYgY2FwYWJpbGl0eSwKKwkgKiBidXQgbmVlZHMgaXQ6CisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAiRE1BUjogRm9yY2luZyB3cml0ZS1idWZmZXIgZmx1c2ggY2FwYWJpbGl0eVxuIik7CisJcndiZl9xdWlyayA9IDE7CisKKwkvKiBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTUzODE2MyAqLworCWlmIChkZXYtPnJldmlzaW9uID09IDB4MDcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRE1BUjogRGlzYWJsaW5nIElPTU1VIGZvciBncmFwaGljcyBvbiB0aGlzIGNoaXBzZXRcbiIpOworCQlkbWFyX21hcF9nZnggPSAwOworCX0KK30KKworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MmE0MCwgcXVpcmtfaW9tbXVfcndiZik7CisKKyNkZWZpbmUgR0dDIDB4NTIKKyNkZWZpbmUgR0dDX01FTU9SWV9TSVpFX01BU0sJKDB4ZiA8PCA4KQorI2RlZmluZSBHR0NfTUVNT1JZX1NJWkVfTk9ORQkoMHgwIDw8IDgpCisjZGVmaW5lIEdHQ19NRU1PUllfU0laRV8xTQkoMHgxIDw8IDgpCisjZGVmaW5lIEdHQ19NRU1PUllfU0laRV8yTQkoMHgzIDw8IDgpCisjZGVmaW5lIEdHQ19NRU1PUllfVlRfRU5BQkxFRAkoMHg4IDw8IDgpCisjZGVmaW5lIEdHQ19NRU1PUllfU0laRV8yTV9WVAkoMHg5IDw8IDgpCisjZGVmaW5lIEdHQ19NRU1PUllfU0laRV8zTV9WVAkoMHhhIDw8IDgpCisjZGVmaW5lIEdHQ19NRU1PUllfU0laRV80TV9WVAkoMHhiIDw8IDgpCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19jYWxwZWxsYV9ub19zaGFkb3dfZ3R0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgZ2djOworCisJaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgR0dDLCAmZ2djKSkKKwkJcmV0dXJuOworCisJaWYgKCEoZ2djICYgR0dDX01FTU9SWV9WVF9FTkFCTEVEKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJETUFSOiBCSU9TIGhhcyBhbGxvY2F0ZWQgbm8gc2hhZG93IEdUVDsgZGlzYWJsaW5nIElPTU1VIGZvciBncmFwaGljc1xuIik7CisJCWRtYXJfbWFwX2dmeCA9IDA7CisJfQorfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDA0MCwgcXVpcmtfY2FscGVsbGFfbm9fc2hhZG93X2d0dCk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwMDQ0LCBxdWlya19jYWxwZWxsYV9ub19zaGFkb3dfZ3R0KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDAwNjIsIHF1aXJrX2NhbHBlbGxhX25vX3NoYWRvd19ndHQpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDA2YSwgcXVpcmtfY2FscGVsbGFfbm9fc2hhZG93X2d0dCk7CisKKy8qIE9uIFR5bGVyc2J1cmcgY2hpcHNldHMsIHNvbWUgQklPU2VzIGhhdmUgYmVlbiBrbm93biB0byBlbmFibGUgdGhlCisgICBJU09DSCBETUFSIHVuaXQgZm9yIHRoZSBBemFsaWEgc291bmQgZGV2aWNlLCBidXQgbm90IGdpdmUgaXQgYW55CisgICBUTEIgZW50cmllcywgd2hpY2ggY2F1c2VzIGl0IHRvIGRlYWRsb2NrLiBDaGVjayBmb3IgdGhhdC4gIFdlIGRvCisgICB0aGlzIGluIGEgZnVuY3Rpb24gY2FsbGVkIGZyb20gaW5pdF9kbWFycygpLCBpbnN0ZWFkIG9mIGluIGEgUENJCisgICBxdWlyaywgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHByaW50IHRoZSBvYm5veGlvdXMgIkJJT1MgYnJva2VuIgorICAgbWVzc2FnZSBpZiBWVC1kIGlzIGFjdHVhbGx5IGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBjaGVja190eWxlcnNidXJnX2lzb2NoKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdWludDMyX3QgdnRpc29jaGN0cmw7CisKKwkvKiBJZiB0aGVyZSdzIG5vIEF6YWxpYSBpbiB0aGUgc3lzdGVtIGFueXdheSwgZm9yZ2V0IGl0LiAqLworCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDNhM2UsIE5VTEwpOworCWlmICghcGRldikKKwkJcmV0dXJuOworCXBjaV9kZXZfcHV0KHBkZXYpOworCisJLyogU3lzdGVtIE1hbmFnZW1lbnQgUmVnaXN0ZXJzLiBNaWdodCBiZSBoaWRkZW4sIGluIHdoaWNoIGNhc2UKKwkgICB3ZSBjYW4ndCBkbyB0aGUgc2FuaXR5IGNoZWNrLiBCdXQgdGhhdCdzIE9LLCBiZWNhdXNlIHRoZQorCSAgIGtub3duLWJyb2tlbiBCSU9TZXMgX2Rvbid0XyBhY3R1YWxseSBoaWRlIGl0LCBzbyBmYXIuICovCisJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MzQyZSwgTlVMTCk7CisJaWYgKCFwZGV2KQorCQlyZXR1cm47CisKKwlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4MTg4LCAmdnRpc29jaGN0cmwpKSB7CisJCXBjaV9kZXZfcHV0KHBkZXYpOworCQlyZXR1cm47CisJfQorCisJcGNpX2Rldl9wdXQocGRldik7CisKKwkvKiBJZiBBemFsaWEgRE1BIGlzIHJvdXRlZCB0byB0aGUgbm9uLWlzb2NoIERNQVIgdW5pdCwgZmluZS4gKi8KKwlpZiAodnRpc29jaGN0cmwgJiAxKQorCQlyZXR1cm47CisKKwkvKiBEcm9wIGFsbCBiaXRzIG90aGVyIHRoYW4gdGhlIG51bWJlciBvZiBUTEIgZW50cmllcyAqLworCXZ0aXNvY2hjdHJsICY9IDB4MWM7CisKKwkvKiBJZiB3ZSBoYXZlIHRoZSByZWNvbW1lbmRlZCBudW1iZXIgb2YgVExCIGVudHJpZXMgKDE2KSwgZmluZS4gKi8KKwlpZiAodnRpc29jaGN0cmwgPT0gMHgxMCkKKwkJcmV0dXJuOworCisJLyogWmVybyBUTEIgZW50cmllcz8gWW91IGdldCB0byByaWRlIHRoZSBzaG9ydCBidXMgdG8gc2Nob29sLiAqLworCWlmICghdnRpc29jaGN0cmwpIHsKKwkJV0FSTigxLCAiWW91ciBCSU9TIGlzIGJyb2tlbjsgRE1BIHJvdXRlZCB0byBJU09DSCBETUFSIHVuaXQgYnV0IG5vIFRMQiBzcGFjZS5cbiIKKwkJICAgICAiQklPUyB2ZW5kb3I6ICVzOyBWZXI6ICVzOyBQcm9kdWN0IFZlcnNpb246ICVzXG4iLAorCQkgICAgIGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JJT1NfVkVORE9SKSwKKwkJICAgICBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CSU9TX1ZFUlNJT04pLAorCQkgICAgIGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1BST0RVQ1RfVkVSU0lPTikpOworCQlpb21tdV9pZGVudGl0eV9tYXBwaW5nIHw9IElERU5UTUFQX0FaQUxJQTsKKwkJcmV0dXJuOworCX0KKwkKKwlwcmludGsoS0VSTl9XQVJOSU5HICJETUFSOiBSZWNvbW1lbmRlZCBUTEIgZW50cmllcyBmb3IgSVNPQ0ggdW5pdCBpcyAxNjsgeW91ciBCSU9TIHNldCAlZFxuIiwKKwkgICAgICAgdnRpc29jaGN0cmwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pbnRyX3JlbWFwcGluZy5jIGIvZHJpdmVycy9pb21tdS9pbnRyX3JlbWFwcGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhODlkNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lvbW11L2ludHJfcmVtYXBwaW5nLmMKQEAgLTAsMCArMSw3OTcgQEAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hwZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZWwtaW9tbXUuaD4KKyNpbmNsdWRlICJpbnRyX3JlbWFwcGluZy5oIgorI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktZGlyZWN0Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgaW9hcGljX3Njb3BlIGlyX2lvYXBpY1tNQVhfSU9fQVBJQ1NdOworc3RhdGljIHN0cnVjdCBocGV0X3Njb3BlIGlyX2hwZXRbTUFYX0hQRVRfVEJTXTsKK3N0YXRpYyBpbnQgaXJfaW9hcGljX251bSwgaXJfaHBldF9udW07CitpbnQgaW50cl9yZW1hcHBpbmdfZW5hYmxlZDsKKworc3RhdGljIGludCBkaXNhYmxlX2ludHJlbWFwOworc3RhdGljIGludCBkaXNhYmxlX3NvdXJjZWlkX2NoZWNraW5nOworCitzdGF0aWMgX19pbml0IGludCBzZXR1cF9ub2ludHJlbWFwKGNoYXIgKnN0cikKK3sKKwlkaXNhYmxlX2ludHJlbWFwID0gMTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJub2ludHJlbWFwIiwgc2V0dXBfbm9pbnRyZW1hcCk7CisKK3N0YXRpYyBfX2luaXQgaW50IHNldHVwX2ludHJlbWFwKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXN0cm5jbXAoc3RyLCAib24iLCAyKSkKKwkJZGlzYWJsZV9pbnRyZW1hcCA9IDA7CisJZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAib2ZmIiwgMykpCisJCWRpc2FibGVfaW50cmVtYXAgPSAxOworCWVsc2UgaWYgKCFzdHJuY21wKHN0ciwgIm5vc2lkIiwgNSkpCisJCWRpc2FibGVfc291cmNlaWRfY2hlY2tpbmcgPSAxOworCisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgiaW50cmVtYXAiLCBzZXR1cF9pbnRyZW1hcCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXJxXzJfaXJfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgaXJxXzJfaW9tbXUgKmlycV8yX2lvbW11KHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycV9jZmcgKmNmZyA9IGlycV9nZXRfY2hpcF9kYXRhKGlycSk7CisJcmV0dXJuIGNmZyA/ICZjZmctPmlycV8yX2lvbW11IDogTlVMTDsKK30KKworaW50IGdldF9pcnRlKGludCBpcnEsIHN0cnVjdCBpcnRlICplbnRyeSkKK3sKKwlzdHJ1Y3QgaXJxXzJfaW9tbXUgKmlycV9pb21tdSA9IGlycV8yX2lvbW11KGlycSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW5kZXg7CisKKwlpZiAoIWVudHJ5IHx8ICFpcnFfaW9tbXUpCisJCXJldHVybiAtMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfMl9pcl9sb2NrLCBmbGFncyk7CisKKwlpbmRleCA9IGlycV9pb21tdS0+aXJ0ZV9pbmRleCArIGlycV9pb21tdS0+c3ViX2hhbmRsZTsKKwkqZW50cnkgPSAqKGlycV9pb21tdS0+aW9tbXUtPmlyX3RhYmxlLT5iYXNlICsgaW5kZXgpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxXzJfaXJfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitpbnQgYWxsb2NfaXJ0ZShzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCBpbnQgaXJxLCB1MTYgY291bnQpCit7CisJc3RydWN0IGlyX3RhYmxlICp0YWJsZSA9IGlvbW11LT5pcl90YWJsZTsKKwlzdHJ1Y3QgaXJxXzJfaW9tbXUgKmlycV9pb21tdSA9IGlycV8yX2lvbW11KGlycSk7CisJdTE2IGluZGV4LCBzdGFydF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWlmICghY291bnQgfHwgIWlycV9pb21tdSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBzdGFydCB0aGUgSVJURSBzZWFyY2ggZnJvbSBpbmRleCAwLgorCSAqLworCWluZGV4ID0gc3RhcnRfaW5kZXggPSAwOworCisJaWYgKGNvdW50ID4gMSkgeworCQljb3VudCA9IF9fcm91bmR1cF9wb3dfb2ZfdHdvKGNvdW50KTsKKwkJbWFzayA9IGlsb2cyKGNvdW50KTsKKwl9CisKKwlpZiAobWFzayA+IGVjYXBfbWF4X2hhbmRsZV9tYXNrKGlvbW11LT5lY2FwKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJSZXF1ZXN0ZWQgbWFzayAleCBleGNlZWRzIHRoZSBtYXggaW52YWxpZGF0aW9uIGhhbmRsZSIKKwkJICAgICAgICIgbWFzayB2YWx1ZSAlTHhcbiIsIG1hc2ssCisJCSAgICAgICBlY2FwX21heF9oYW5kbGVfbWFzayhpb21tdS0+ZWNhcCkpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV8yX2lyX2xvY2ssIGZsYWdzKTsKKwlkbyB7CisJCWZvciAoaSA9IGluZGV4OyBpIDwgaW5kZXggKyBjb3VudDsgaSsrKQorCQkJaWYgICh0YWJsZS0+YmFzZVtpXS5wcmVzZW50KQorCQkJCWJyZWFrOworCQkvKiBlbXB0eSBpbmRleCBmb3VuZCAqLworCQlpZiAoaSA9PSBpbmRleCArIGNvdW50KQorCQkJYnJlYWs7CisKKwkJaW5kZXggPSAoaW5kZXggKyBjb3VudCkgJSBJTlRSX1JFTUFQX1RBQkxFX0VOVFJJRVM7CisKKwkJaWYgKGluZGV4ID09IHN0YXJ0X2luZGV4KSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfMl9pcl9sb2NrLCBmbGFncyk7CisJCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFsbG9jYXRlIGFuIElSVEVcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlmb3IgKGkgPSBpbmRleDsgaSA8IGluZGV4ICsgY291bnQ7IGkrKykKKwkJdGFibGUtPmJhc2VbaV0ucHJlc2VudCA9IDE7CisKKwlpcnFfaW9tbXUtPmlvbW11ID0gaW9tbXU7CisJaXJxX2lvbW11LT5pcnRlX2luZGV4ID0gIGluZGV4OworCWlycV9pb21tdS0+c3ViX2hhbmRsZSA9IDA7CisJaXJxX2lvbW11LT5pcnRlX21hc2sgPSBtYXNrOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxXzJfaXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMgaW50IHFpX2ZsdXNoX2llYyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCBpbnQgaW5kZXgsIGludCBtYXNrKQoreworCXN0cnVjdCBxaV9kZXNjIGRlc2M7CisKKwlkZXNjLmxvdyA9IFFJX0lFQ19JSURFWChpbmRleCkgfCBRSV9JRUNfVFlQRSB8IFFJX0lFQ19JTShtYXNrKQorCQkgICB8IFFJX0lFQ19TRUxFQ1RJVkU7CisJZGVzYy5oaWdoID0gMDsKKworCXJldHVybiBxaV9zdWJtaXRfc3luYygmZGVzYywgaW9tbXUpOworfQorCitpbnQgbWFwX2lycV90b19pcnRlX2hhbmRsZShpbnQgaXJxLCB1MTYgKnN1Yl9oYW5kbGUpCit7CisJc3RydWN0IGlycV8yX2lvbW11ICppcnFfaW9tbXUgPSBpcnFfMl9pb21tdShpcnEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGluZGV4OworCisJaWYgKCFpcnFfaW9tbXUpCisJCXJldHVybiAtMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfMl9pcl9sb2NrLCBmbGFncyk7CisJKnN1Yl9oYW5kbGUgPSBpcnFfaW9tbXUtPnN1Yl9oYW5kbGU7CisJaW5kZXggPSBpcnFfaW9tbXUtPmlydGVfaW5kZXg7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxXzJfaXJfbG9jaywgZmxhZ3MpOworCXJldHVybiBpbmRleDsKK30KKworaW50IHNldF9pcnRlX2lycShpbnQgaXJxLCBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCB1MTYgaW5kZXgsIHUxNiBzdWJoYW5kbGUpCit7CisJc3RydWN0IGlycV8yX2lvbW11ICppcnFfaW9tbXUgPSBpcnFfMl9pb21tdShpcnEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWlycV9pb21tdSkKKwkJcmV0dXJuIC0xOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV8yX2lyX2xvY2ssIGZsYWdzKTsKKworCWlycV9pb21tdS0+aW9tbXUgPSBpb21tdTsKKwlpcnFfaW9tbXUtPmlydGVfaW5kZXggPSBpbmRleDsKKwlpcnFfaW9tbXUtPnN1Yl9oYW5kbGUgPSBzdWJoYW5kbGU7CisJaXJxX2lvbW11LT5pcnRlX21hc2sgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxXzJfaXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtb2RpZnlfaXJ0ZShpbnQgaXJxLCBzdHJ1Y3QgaXJ0ZSAqaXJ0ZV9tb2RpZmllZCkKK3sKKwlzdHJ1Y3QgaXJxXzJfaW9tbXUgKmlycV9pb21tdSA9IGlycV8yX2lvbW11KGlycSk7CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpcnRlICppcnRlOworCWludCByYywgaW5kZXg7CisKKwlpZiAoIWlycV9pb21tdSkKKwkJcmV0dXJuIC0xOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV8yX2lyX2xvY2ssIGZsYWdzKTsKKworCWlvbW11ID0gaXJxX2lvbW11LT5pb21tdTsKKworCWluZGV4ID0gaXJxX2lvbW11LT5pcnRlX2luZGV4ICsgaXJxX2lvbW11LT5zdWJfaGFuZGxlOworCWlydGUgPSAmaW9tbXUtPmlyX3RhYmxlLT5iYXNlW2luZGV4XTsKKworCXNldF82NGJpdCgmaXJ0ZS0+bG93LCBpcnRlX21vZGlmaWVkLT5sb3cpOworCXNldF82NGJpdCgmaXJ0ZS0+aGlnaCwgaXJ0ZV9tb2RpZmllZC0+aGlnaCk7CisJX19pb21tdV9mbHVzaF9jYWNoZShpb21tdSwgaXJ0ZSwgc2l6ZW9mKCppcnRlKSk7CisKKwlyYyA9IHFpX2ZsdXNoX2llYyhpb21tdSwgaW5kZXgsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV8yX2lyX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworc3RydWN0IGludGVsX2lvbW11ICptYXBfaHBldF90b19pcih1OCBocGV0X2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9IUEVUX1RCUzsgaSsrKQorCQlpZiAoaXJfaHBldFtpXS5pZCA9PSBocGV0X2lkKQorCQkJcmV0dXJuIGlyX2hwZXRbaV0uaW9tbXU7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBpbnRlbF9pb21tdSAqbWFwX2lvYXBpY190b19pcihpbnQgYXBpYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9fQVBJQ1M7IGkrKykKKwkJaWYgKGlyX2lvYXBpY1tpXS5pZCA9PSBhcGljKQorCQkJcmV0dXJuIGlyX2lvYXBpY1tpXS5pb21tdTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGludGVsX2lvbW11ICptYXBfZGV2X3RvX2lyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOworCisJZHJoZCA9IGRtYXJfZmluZF9tYXRjaGVkX2RyaGRfdW5pdChkZXYpOworCWlmICghZHJoZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZHJoZC0+aW9tbXU7Cit9CisKK3N0YXRpYyBpbnQgY2xlYXJfZW50cmllcyhzdHJ1Y3QgaXJxXzJfaW9tbXUgKmlycV9pb21tdSkKK3sKKwlzdHJ1Y3QgaXJ0ZSAqc3RhcnQsICplbnRyeSwgKmVuZDsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OworCWludCBpbmRleDsKKworCWlmIChpcnFfaW9tbXUtPnN1Yl9oYW5kbGUpCisJCXJldHVybiAwOworCisJaW9tbXUgPSBpcnFfaW9tbXUtPmlvbW11OworCWluZGV4ID0gaXJxX2lvbW11LT5pcnRlX2luZGV4ICsgaXJxX2lvbW11LT5zdWJfaGFuZGxlOworCisJc3RhcnQgPSBpb21tdS0+aXJfdGFibGUtPmJhc2UgKyBpbmRleDsKKwllbmQgPSBzdGFydCArICgxIDw8IGlycV9pb21tdS0+aXJ0ZV9tYXNrKTsKKworCWZvciAoZW50cnkgPSBzdGFydDsgZW50cnkgPCBlbmQ7IGVudHJ5KyspIHsKKwkJc2V0XzY0Yml0KCZlbnRyeS0+bG93LCAwKTsKKwkJc2V0XzY0Yml0KCZlbnRyeS0+aGlnaCwgMCk7CisJfQorCisJcmV0dXJuIHFpX2ZsdXNoX2llYyhpb21tdSwgaW5kZXgsIGlycV9pb21tdS0+aXJ0ZV9tYXNrKTsKK30KKworaW50IGZyZWVfaXJ0ZShpbnQgaXJxKQoreworCXN0cnVjdCBpcnFfMl9pb21tdSAqaXJxX2lvbW11ID0gaXJxXzJfaW9tbXUoaXJxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCWlmICghaXJxX2lvbW11KQorCQlyZXR1cm4gLTE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxXzJfaXJfbG9jaywgZmxhZ3MpOworCisJcmMgPSBjbGVhcl9lbnRyaWVzKGlycV9pb21tdSk7CisKKwlpcnFfaW9tbXUtPmlvbW11ID0gTlVMTDsKKwlpcnFfaW9tbXUtPmlydGVfaW5kZXggPSAwOworCWlycV9pb21tdS0+c3ViX2hhbmRsZSA9IDA7CisJaXJxX2lvbW11LT5pcnRlX21hc2sgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxXzJfaXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogc291cmNlIHZhbGlkYXRpb24gdHlwZQorICovCisjZGVmaW5lIFNWVF9OT19WRVJJRlkJCTB4MCAgLyogbm8gdmVyaWZpY2F0aW9uIGlzIHJlcXVpcmVkICovCisjZGVmaW5lIFNWVF9WRVJJRllfU0lEX1NRCTB4MSAgLyogdmVyaWZ5IHVzaW5nIFNJRCBhbmQgU1EgZmllbGRzICovCisjZGVmaW5lIFNWVF9WRVJJRllfQlVTCQkweDIgIC8qIHZlcmlmeSBidXMgb2YgcmVxdWVzdC1pZCAqLworCisvKgorICogc291cmNlLWlkIHF1YWxpZmllcgorICovCisjZGVmaW5lIFNRX0FMTF8xNgkweDAgIC8qIHZlcmlmeSBhbGwgMTYgYml0cyBvZiByZXF1ZXN0LWlkICovCisjZGVmaW5lIFNRXzEzX0lHTk9SRV8xCTB4MSAgLyogdmVyaWZ5IG1vc3Qgc2lnbmlmaWNhbnQgMTMgYml0cywgaWdub3JlCisJCQkgICAgICAqIHRoZSB0aGlyZCBsZWFzdCBzaWduaWZpY2FudCBiaXQKKwkJCSAgICAgICovCisjZGVmaW5lIFNRXzEzX0lHTk9SRV8yCTB4MiAgLyogdmVyaWZ5IG1vc3Qgc2lnbmlmaWNhbnQgMTMgYml0cywgaWdub3JlCisJCQkgICAgICAqIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKKwkJCSAgICAgICovCisjZGVmaW5lIFNRXzEzX0lHTk9SRV8zCTB4MyAgLyogdmVyaWZ5IG1vc3Qgc2lnbmlmaWNhbnQgMTMgYml0cywgaWdub3JlCisJCQkgICAgICAqIHRoZSBsZWFzdCB0aHJlZSBzaWduaWZpY2FudCBiaXRzCisJCQkgICAgICAqLworCisvKgorICogc2V0IFNWVCwgU1EgYW5kIFNJRCBmaWVsZHMgb2YgaXJ0ZSB0byB2ZXJpZnkKKyAqIHNvdXJjZSBpZHMgb2YgaW50ZXJydXB0IHJlcXVlc3RzCisgKi8KK3N0YXRpYyB2b2lkIHNldF9pcnRlX3NpZChzdHJ1Y3QgaXJ0ZSAqaXJ0ZSwgdW5zaWduZWQgaW50IHN2dCwKKwkJCSB1bnNpZ25lZCBpbnQgc3EsIHVuc2lnbmVkIGludCBzaWQpCit7CisJaWYgKGRpc2FibGVfc291cmNlaWRfY2hlY2tpbmcpCisJCXN2dCA9IFNWVF9OT19WRVJJRlk7CisJaXJ0ZS0+c3Z0ID0gc3Z0OworCWlydGUtPnNxID0gc3E7CisJaXJ0ZS0+c2lkID0gc2lkOworfQorCitpbnQgc2V0X2lvYXBpY19zaWQoc3RydWN0IGlydGUgKmlydGUsIGludCBhcGljKQoreworCWludCBpOworCXUxNiBzaWQgPSAwOworCisJaWYgKCFpcnRlKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX0FQSUNTOyBpKyspIHsKKwkJaWYgKGlyX2lvYXBpY1tpXS5pZCA9PSBhcGljKSB7CisJCQlzaWQgPSAoaXJfaW9hcGljW2ldLmJ1cyA8PCA4KSB8IGlyX2lvYXBpY1tpXS5kZXZmbjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHNpZCA9PSAwKSB7CisJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBzZXQgc291cmNlLWlkIG9mIElPQVBJQyAoJWQpXG4iLCBhcGljKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNldF9pcnRlX3NpZChpcnRlLCAxLCAwLCBzaWQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzZXRfaHBldF9zaWQoc3RydWN0IGlydGUgKmlydGUsIHU4IGlkKQoreworCWludCBpOworCXUxNiBzaWQgPSAwOworCisJaWYgKCFpcnRlKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0hQRVRfVEJTOyBpKyspIHsKKwkJaWYgKGlyX2hwZXRbaV0uaWQgPT0gaWQpIHsKKwkJCXNpZCA9IChpcl9ocGV0W2ldLmJ1cyA8PCA4KSB8IGlyX2hwZXRbaV0uZGV2Zm47CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChzaWQgPT0gMCkgeworCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gc2V0IHNvdXJjZS1pZCBvZiBIUEVUIGJsb2NrICglZClcbiIsIGlkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogU2hvdWxkIHJlYWxseSB1c2UgU1FfQUxMXzE2LiBTb21lIHBsYXRmb3JtcyBhcmUgYnJva2VuLgorCSAqIFdoaWxlIHdlIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IHF1aXJrcyBmb3IgdGhlc2UgYnJva2VuIHBsYXRmb3JtcywgdXNlCisJICogU1FfMTNfSUdOT1JFXzMgZm9yIG5vdy4KKwkgKi8KKwlzZXRfaXJ0ZV9zaWQoaXJ0ZSwgU1ZUX1ZFUklGWV9TSURfU1EsIFNRXzEzX0lHTk9SRV8zLCBzaWQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzZXRfbXNpX3NpZChzdHJ1Y3QgaXJ0ZSAqaXJ0ZSwgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlOworCisJaWYgKCFpcnRlIHx8ICFkZXYpCisJCXJldHVybiAtMTsKKworCS8qIFBDSWUgZGV2aWNlIG9yIFJvb3QgQ29tcGxleCBpbnRlZ3JhdGVkIFBDSSBkZXZpY2UgKi8KKwlpZiAocGNpX2lzX3BjaWUoZGV2KSB8fCAhZGV2LT5idXMtPnBhcmVudCkgeworCQlzZXRfaXJ0ZV9zaWQoaXJ0ZSwgU1ZUX1ZFUklGWV9TSURfU1EsIFNRX0FMTF8xNiwKKwkJCSAgICAgKGRldi0+YnVzLT5udW1iZXIgPDwgOCkgfCBkZXYtPmRldmZuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYnJpZGdlID0gcGNpX2ZpbmRfdXBzdHJlYW1fcGNpZV9icmlkZ2UoZGV2KTsKKwlpZiAoYnJpZGdlKSB7CisJCWlmIChwY2lfaXNfcGNpZShicmlkZ2UpKS8qIHRoaXMgaXMgYSBQQ0llLXRvLVBDSS9QQ0lYIGJyaWRnZSAqLworCQkJc2V0X2lydGVfc2lkKGlydGUsIFNWVF9WRVJJRllfQlVTLCBTUV9BTExfMTYsCisJCQkJKGJyaWRnZS0+YnVzLT5udW1iZXIgPDwgOCkgfCBkZXYtPmJ1cy0+bnVtYmVyKTsKKwkJZWxzZSAvKiB0aGlzIGlzIGEgbGVnYWN5IFBDSSBicmlkZ2UgKi8KKwkJCXNldF9pcnRlX3NpZChpcnRlLCBTVlRfVkVSSUZZX1NJRF9TUSwgU1FfQUxMXzE2LAorCQkJCShicmlkZ2UtPmJ1cy0+bnVtYmVyIDw8IDgpIHwgYnJpZGdlLT5kZXZmbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X3NldF9pbnRyX3JlbWFwcGluZyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCBpbnQgbW9kZSkKK3sKKwl1NjQgYWRkcjsKKwl1MzIgc3RzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlhZGRyID0gdmlydF90b19waHlzKCh2b2lkICopaW9tbXUtPmlyX3RhYmxlLT5iYXNlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworCisJZG1hcl93cml0ZXEoaW9tbXUtPnJlZyArIERNQVJfSVJUQV9SRUcsCisJCSAgICAoYWRkcikgfCBJUl9YMkFQSUNfTU9ERShtb2RlKSB8IElOVFJfUkVNQVBfVEFCTEVfUkVHX1NJWkUpOworCisJLyogU2V0IGludGVycnVwdC1yZW1hcHBpbmcgdGFibGUgcG9pbnRlciAqLworCWlvbW11LT5nY21kIHw9IERNQV9HQ01EX1NJUlRQOworCXdyaXRlbChpb21tdS0+Z2NtZCwgaW9tbXUtPnJlZyArIERNQVJfR0NNRF9SRUcpOworCisJSU9NTVVfV0FJVF9PUChpb21tdSwgRE1BUl9HU1RTX1JFRywKKwkJICAgICAgcmVhZGwsIChzdHMgJiBETUFfR1NUU19JUlRQUyksIHN0cyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogZ2xvYmFsIGludmFsaWRhdGlvbiBvZiBpbnRlcnJ1cHQgZW50cnkgY2FjaGUgYmVmb3JlIGVuYWJsaW5nCisJICogaW50ZXJydXB0LXJlbWFwcGluZy4KKwkgKi8KKwlxaV9nbG9iYWxfaWVjKGlvbW11KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworCisJLyogRW5hYmxlIGludGVycnVwdC1yZW1hcHBpbmcgKi8KKwlpb21tdS0+Z2NtZCB8PSBETUFfR0NNRF9JUkU7CisJd3JpdGVsKGlvbW11LT5nY21kLCBpb21tdS0+cmVnICsgRE1BUl9HQ01EX1JFRyk7CisKKwlJT01NVV9XQUlUX09QKGlvbW11LCBETUFSX0dTVFNfUkVHLAorCQkgICAgICByZWFkbCwgKHN0cyAmIERNQV9HU1RTX0lSRVMpLCBzdHMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgaW50IHNldHVwX2ludHJfcmVtYXBwaW5nKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsIGludCBtb2RlKQoreworCXN0cnVjdCBpcl90YWJsZSAqaXJfdGFibGU7CisJc3RydWN0IHBhZ2UgKnBhZ2VzOworCisJaXJfdGFibGUgPSBpb21tdS0+aXJfdGFibGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXJfdGFibGUpLAorCQkJCQkgICAgIEdGUF9BVE9NSUMpOworCisJaWYgKCFpb21tdS0+aXJfdGFibGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcGFnZXMgPSBhbGxvY19wYWdlc19ub2RlKGlvbW11LT5ub2RlLCBHRlBfQVRPTUlDIHwgX19HRlBfWkVSTywKKwkJCQkgSU5UUl9SRU1BUF9QQUdFX09SREVSKTsKKworCWlmICghcGFnZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gYWxsb2NhdGUgcGFnZXMgb2Ygb3JkZXIgJWRcbiIsCisJCSAgICAgICBJTlRSX1JFTUFQX1BBR0VfT1JERVIpOworCQlrZnJlZShpb21tdS0+aXJfdGFibGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpcl90YWJsZS0+YmFzZSA9IHBhZ2VfYWRkcmVzcyhwYWdlcyk7CisKKwlpb21tdV9zZXRfaW50cl9yZW1hcHBpbmcoaW9tbXUsIG1vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogRGlzYWJsZSBJbnRlcnJ1cHQgUmVtYXBwaW5nLgorICovCitzdGF0aWMgdm9pZCBpb21tdV9kaXNhYmxlX2ludHJfcmVtYXBwaW5nKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgc3RzOworCisJaWYgKCFlY2FwX2lyX3N1cHBvcnQoaW9tbXUtPmVjYXApKQorCQlyZXR1cm47CisKKwkvKgorCSAqIGdsb2JhbCBpbnZhbGlkYXRpb24gb2YgaW50ZXJydXB0IGVudHJ5IGNhY2hlIGJlZm9yZSBkaXNhYmxpbmcKKwkgKiBpbnRlcnJ1cHQtcmVtYXBwaW5nLgorCSAqLworCXFpX2dsb2JhbF9pZWMoaW9tbXUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisKKwlzdHMgPSBkbWFyX3JlYWRxKGlvbW11LT5yZWcgKyBETUFSX0dTVFNfUkVHKTsKKwlpZiAoIShzdHMgJiBETUFfR1NUU19JUkVTKSkKKwkJZ290byBlbmQ7CisKKwlpb21tdS0+Z2NtZCAmPSB+RE1BX0dDTURfSVJFOworCXdyaXRlbChpb21tdS0+Z2NtZCwgaW9tbXUtPnJlZyArIERNQVJfR0NNRF9SRUcpOworCisJSU9NTVVfV0FJVF9PUChpb21tdSwgRE1BUl9HU1RTX1JFRywKKwkJICAgICAgcmVhZGwsICEoc3RzICYgRE1BX0dTVFNfSVJFUyksIHN0cyk7CisKK2VuZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworfQorCitpbnQgX19pbml0IGludHJfcmVtYXBwaW5nX3N1cHBvcnRlZCh2b2lkKQoreworCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKKworCWlmIChkaXNhYmxlX2ludHJlbWFwKQorCQlyZXR1cm4gMDsKKworCWlmICghZG1hcl9pcl9zdXBwb3J0KCkpCisJCXJldHVybiAwOworCisJZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKKwkJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IGRyaGQtPmlvbW11OworCisJCWlmICghZWNhcF9pcl9zdXBwb3J0KGlvbW11LT5lY2FwKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgX19pbml0IGVuYWJsZV9pbnRyX3JlbWFwcGluZyhpbnQgZWltKQoreworCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKKwlpbnQgc2V0dXAgPSAwOworCisJaWYgKHBhcnNlX2lvYXBpY3NfdW5kZXJfaXIoKSAhPSAxKSB7CisJCXByaW50ayhLRVJOX0lORk8gIk5vdCBlbmFibGUgaW50ZXJydXB0IHJlbWFwcGluZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgeworCQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gZHJoZC0+aW9tbXU7CisKKwkJLyoKKwkJICogSWYgdGhlIHF1ZXVlZCBpbnZhbGlkYXRpb24gaXMgYWxyZWFkeSBpbml0aWFsaXplZCwKKwkJICogc2hvdWxkbid0IGRpc2FibGUgaXQuCisJCSAqLworCQlpZiAoaW9tbXUtPnFpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogQ2xlYXIgcHJldmlvdXMgZmF1bHRzLgorCQkgKi8KKwkJZG1hcl9mYXVsdCgtMSwgaW9tbXUpOworCisJCS8qCisJCSAqIERpc2FibGUgaW50ciByZW1hcHBpbmcgYW5kIHF1ZXVlZCBpbnZhbGlkYXRpb24sIGlmIGFscmVhZHkKKwkJICogZW5hYmxlZCBwcmlvciB0byBPUyBoYW5kb3Zlci4KKwkJICovCisJCWlvbW11X2Rpc2FibGVfaW50cl9yZW1hcHBpbmcoaW9tbXUpOworCisJCWRtYXJfZGlzYWJsZV9xaShpb21tdSk7CisJfQorCisJLyoKKwkgKiBjaGVjayBmb3IgdGhlIEludGVycnVwdC1yZW1hcHBpbmcgc3VwcG9ydAorCSAqLworCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7CisJCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBkcmhkLT5pb21tdTsKKworCQlpZiAoIWVjYXBfaXJfc3VwcG9ydChpb21tdS0+ZWNhcCkpCisJCQljb250aW51ZTsKKworCQlpZiAoZWltICYmICFlY2FwX2VpbV9zdXBwb3J0KGlvbW11LT5lY2FwKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRFJIRCAlTHg6IEVJTSBub3Qgc3VwcG9ydGVkIGJ5IERSSEQsICIKKwkJCSAgICAgICAiIGVjYXAgJUx4XG4iLCBkcmhkLT5yZWdfYmFzZV9hZGRyLCBpb21tdS0+ZWNhcCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKgorCSAqIEVuYWJsZSBxdWV1ZWQgaW52YWxpZGF0aW9uIGZvciBhbGwgdGhlIERSSEQncy4KKwkgKi8KKwlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgeworCQlpbnQgcmV0OworCQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gZHJoZC0+aW9tbXU7CisJCXJldCA9IGRtYXJfZW5hYmxlX3FpKGlvbW11KTsKKworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkRSSEQgJUx4OiBmYWlsZWQgdG8gZW5hYmxlIHF1ZXVlZCwgIgorCQkJICAgICAgICIgaW52YWxpZGF0aW9uLCBlY2FwICVMeCwgcmV0ICVkXG4iLAorCQkJICAgICAgIGRyaGQtPnJlZ19iYXNlX2FkZHIsIGlvbW11LT5lY2FwLCByZXQpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLyoKKwkgKiBTZXR1cCBJbnRlcnJ1cHQtcmVtYXBwaW5nIGZvciBhbGwgdGhlIERSSEQncyBub3cuCisJICovCisJZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKKwkJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IGRyaGQtPmlvbW11OworCisJCWlmICghZWNhcF9pcl9zdXBwb3J0KGlvbW11LT5lY2FwKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzZXR1cF9pbnRyX3JlbWFwcGluZyhpb21tdSwgZWltKSkKKwkJCWdvdG8gZXJyb3I7CisKKwkJc2V0dXAgPSAxOworCX0KKworCWlmICghc2V0dXApCisJCWdvdG8gZXJyb3I7CisKKwlpbnRyX3JlbWFwcGluZ19lbmFibGVkID0gMTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwkvKgorCSAqIGhhbmRsZSBlcnJvciBjb25kaXRpb24gZ3JhY2VmdWxseSBoZXJlIQorCSAqLworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgaXJfcGFyc2Vfb25lX2hwZXRfc2NvcGUoc3RydWN0IGFjcGlfZG1hcl9kZXZpY2Vfc2NvcGUgKnNjb3BlLAorCQkJCSAgICAgIHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCit7CisJc3RydWN0IGFjcGlfZG1hcl9wY2lfcGF0aCAqcGF0aDsKKwl1OCBidXM7CisJaW50IGNvdW50OworCisJYnVzID0gc2NvcGUtPmJ1czsKKwlwYXRoID0gKHN0cnVjdCBhY3BpX2RtYXJfcGNpX3BhdGggKikoc2NvcGUgKyAxKTsKKwljb3VudCA9IChzY29wZS0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX2RtYXJfZGV2aWNlX3Njb3BlKSkKKwkJLyBzaXplb2Yoc3RydWN0IGFjcGlfZG1hcl9wY2lfcGF0aCk7CisKKwl3aGlsZSAoLS1jb3VudCA+IDApIHsKKwkJLyoKKwkJICogQWNjZXNzIFBDSSBkaXJlY3RseSBkdWUgdG8gdGhlIFBDSQorCQkgKiBzdWJzeXN0ZW0gaXNuJ3QgaW5pdGlhbGl6ZWQgeWV0LgorCQkgKi8KKwkJYnVzID0gcmVhZF9wY2lfY29uZmlnX2J5dGUoYnVzLCBwYXRoLT5kZXYsIHBhdGgtPmZuLAorCQkJCQkgICBQQ0lfU0VDT05EQVJZX0JVUyk7CisJCXBhdGgrKzsKKwl9CisJaXJfaHBldFtpcl9ocGV0X251bV0uYnVzICAgPSBidXM7CisJaXJfaHBldFtpcl9ocGV0X251bV0uZGV2Zm4gPSBQQ0lfREVWRk4ocGF0aC0+ZGV2LCBwYXRoLT5mbik7CisJaXJfaHBldFtpcl9ocGV0X251bV0uaW9tbXUgPSBpb21tdTsKKwlpcl9ocGV0W2lyX2hwZXRfbnVtXS5pZCAgICA9IHNjb3BlLT5lbnVtZXJhdGlvbl9pZDsKKwlpcl9ocGV0X251bSsrOworfQorCitzdGF0aWMgdm9pZCBpcl9wYXJzZV9vbmVfaW9hcGljX3Njb3BlKHN0cnVjdCBhY3BpX2RtYXJfZGV2aWNlX3Njb3BlICpzY29wZSwKKwkJCQkgICAgICBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQoreworCXN0cnVjdCBhY3BpX2RtYXJfcGNpX3BhdGggKnBhdGg7CisJdTggYnVzOworCWludCBjb3VudDsKKworCWJ1cyA9IHNjb3BlLT5idXM7CisJcGF0aCA9IChzdHJ1Y3QgYWNwaV9kbWFyX3BjaV9wYXRoICopKHNjb3BlICsgMSk7CisJY291bnQgPSAoc2NvcGUtPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV9kbWFyX2RldmljZV9zY29wZSkpCisJCS8gc2l6ZW9mKHN0cnVjdCBhY3BpX2RtYXJfcGNpX3BhdGgpOworCisJd2hpbGUgKC0tY291bnQgPiAwKSB7CisJCS8qCisJCSAqIEFjY2VzcyBQQ0kgZGlyZWN0bHkgZHVlIHRvIHRoZSBQQ0kKKwkJICogc3Vic3lzdGVtIGlzbid0IGluaXRpYWxpemVkIHlldC4KKwkJICovCisJCWJ1cyA9IHJlYWRfcGNpX2NvbmZpZ19ieXRlKGJ1cywgcGF0aC0+ZGV2LCBwYXRoLT5mbiwKKwkJCQkJICAgUENJX1NFQ09OREFSWV9CVVMpOworCQlwYXRoKys7CisJfQorCisJaXJfaW9hcGljW2lyX2lvYXBpY19udW1dLmJ1cyAgID0gYnVzOworCWlyX2lvYXBpY1tpcl9pb2FwaWNfbnVtXS5kZXZmbiA9IFBDSV9ERVZGTihwYXRoLT5kZXYsIHBhdGgtPmZuKTsKKwlpcl9pb2FwaWNbaXJfaW9hcGljX251bV0uaW9tbXUgPSBpb21tdTsKKwlpcl9pb2FwaWNbaXJfaW9hcGljX251bV0uaWQgICAgPSBzY29wZS0+ZW51bWVyYXRpb25faWQ7CisJaXJfaW9hcGljX251bSsrOworfQorCitzdGF0aWMgaW50IGlyX3BhcnNlX2lvYXBpY19ocGV0X3Njb3BlKHN0cnVjdCBhY3BpX2RtYXJfaGVhZGVyICpoZWFkZXIsCisJCQkJICAgICAgc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKK3sKKwlzdHJ1Y3QgYWNwaV9kbWFyX2hhcmR3YXJlX3VuaXQgKmRyaGQ7CisJc3RydWN0IGFjcGlfZG1hcl9kZXZpY2Vfc2NvcGUgKnNjb3BlOworCXZvaWQgKnN0YXJ0LCAqZW5kOworCisJZHJoZCA9IChzdHJ1Y3QgYWNwaV9kbWFyX2hhcmR3YXJlX3VuaXQgKiloZWFkZXI7CisKKwlzdGFydCA9ICh2b2lkICopKGRyaGQgKyAxKTsKKwllbmQgPSAoKHZvaWQgKilkcmhkKSArIGhlYWRlci0+bGVuZ3RoOworCisJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisJCXNjb3BlID0gc3RhcnQ7CisJCWlmIChzY29wZS0+ZW50cnlfdHlwZSA9PSBBQ1BJX0RNQVJfU0NPUEVfVFlQRV9JT0FQSUMpIHsKKwkJCWlmIChpcl9pb2FwaWNfbnVtID09IE1BWF9JT19BUElDUykgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkV4Y2VlZGVkIE1heCBJTyBBUElDU1xuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlwcmludGsoS0VSTl9JTkZPICJJT0FQSUMgaWQgJWQgdW5kZXIgRFJIRCBiYXNlICIKKwkJCSAgICAgICAiIDB4JUx4IElPTU1VICVkXG4iLCBzY29wZS0+ZW51bWVyYXRpb25faWQsCisJCQkgICAgICAgZHJoZC0+YWRkcmVzcywgaW9tbXUtPnNlcV9pZCk7CisKKwkJCWlyX3BhcnNlX29uZV9pb2FwaWNfc2NvcGUoc2NvcGUsIGlvbW11KTsKKwkJfSBlbHNlIGlmIChzY29wZS0+ZW50cnlfdHlwZSA9PSBBQ1BJX0RNQVJfU0NPUEVfVFlQRV9IUEVUKSB7CisJCQlpZiAoaXJfaHBldF9udW0gPT0gTUFYX0hQRVRfVEJTKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXhjZWVkZWQgTWF4IEhQRVQgYmxvY2tzXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCXByaW50ayhLRVJOX0lORk8gIkhQRVQgaWQgJWQgdW5kZXIgRFJIRCBiYXNlIgorCQkJICAgICAgICIgMHglTHhcbiIsIHNjb3BlLT5lbnVtZXJhdGlvbl9pZCwKKwkJCSAgICAgICBkcmhkLT5hZGRyZXNzKTsKKworCQkJaXJfcGFyc2Vfb25lX2hwZXRfc2NvcGUoc2NvcGUsIGlvbW11KTsKKwkJfQorCQlzdGFydCArPSBzY29wZS0+bGVuZ3RoOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRmluZHMgdGhlIGFzc29jYWl0aW9uIGJldHdlZW4gSU9BUElDJ3MgYW5kIGl0cyBJbnRlcnJ1cHQtcmVtYXBwaW5nCisgKiBoYXJkd2FyZSB1bml0LgorICovCitpbnQgX19pbml0IHBhcnNlX2lvYXBpY3NfdW5kZXJfaXIodm9pZCkKK3sKKwlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7CisJaW50IGlyX3N1cHBvcnRlZCA9IDA7CisKKwlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgeworCQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gZHJoZC0+aW9tbXU7CisKKwkJaWYgKGVjYXBfaXJfc3VwcG9ydChpb21tdS0+ZWNhcCkpIHsKKwkJCWlmIChpcl9wYXJzZV9pb2FwaWNfaHBldF9zY29wZShkcmhkLT5oZHIsIGlvbW11KSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWlyX3N1cHBvcnRlZCA9IDE7CisJCX0KKwl9CisKKwlpZiAoaXJfc3VwcG9ydGVkICYmIGlyX2lvYXBpY19udW0gIT0gbnJfaW9hcGljcykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiTm90IGFsbCBJTy1BUElDJ3MgbGlzdGVkIHVuZGVyIHJlbWFwcGluZyBoYXJkd2FyZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gaXJfc3VwcG9ydGVkOworfQorCit2b2lkIGRpc2FibGVfaW50cl9yZW1hcHBpbmcodm9pZCkKK3sKKwlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IE5VTEw7CisKKwkvKgorCSAqIERpc2FibGUgSW50ZXJydXB0LXJlbWFwcGluZyBmb3IgYWxsIHRoZSBEUkhEJ3Mgbm93LgorCSAqLworCWZvcl9lYWNoX2lvbW11KGlvbW11LCBkcmhkKSB7CisJCWlmICghZWNhcF9pcl9zdXBwb3J0KGlvbW11LT5lY2FwKSkKKwkJCWNvbnRpbnVlOworCisJCWlvbW11X2Rpc2FibGVfaW50cl9yZW1hcHBpbmcoaW9tbXUpOworCX0KK30KKworaW50IHJlZW5hYmxlX2ludHJfcmVtYXBwaW5nKGludCBlaW0pCit7CisJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOworCWludCBzZXR1cCA9IDA7CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IE5VTEw7CisKKwlmb3JfZWFjaF9pb21tdShpb21tdSwgZHJoZCkKKwkJaWYgKGlvbW11LT5xaSkKKwkJCWRtYXJfcmVlbmFibGVfcWkoaW9tbXUpOworCisJLyoKKwkgKiBTZXR1cCBJbnRlcnJ1cHQtcmVtYXBwaW5nIGZvciBhbGwgdGhlIERSSEQncyBub3cuCisJICovCisJZm9yX2VhY2hfaW9tbXUoaW9tbXUsIGRyaGQpIHsKKwkJaWYgKCFlY2FwX2lyX3N1cHBvcnQoaW9tbXUtPmVjYXApKQorCQkJY29udGludWU7CisKKwkJLyogU2V0IHVwIGludGVycnVwdCByZW1hcHBpbmcgZm9yIGlvbW11LiovCisJCWlvbW11X3NldF9pbnRyX3JlbWFwcGluZyhpb21tdSwgZWltKTsKKwkJc2V0dXAgPSAxOworCX0KKworCWlmICghc2V0dXApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJLyoKKwkgKiBoYW5kbGUgZXJyb3IgY29uZGl0aW9uIGdyYWNlZnVsbHkgaGVyZSEKKwkgKi8KKwlyZXR1cm4gLTE7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmggYi9kcml2ZXJzL2lvbW11L2ludHJfcmVtYXBwaW5nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmgKcmVuYW1lIHRvIGRyaXZlcnMvaW9tbXUvaW50cl9yZW1hcHBpbmcuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2lvbW11LmMgYi9kcml2ZXJzL2lvbW11L2lvbW11LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvYmFzZS9pb21tdS5jCnJlbmFtZSB0byBkcml2ZXJzL2lvbW11L2lvbW11LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lvdmEuYyBiL2RyaXZlcnMvaW9tbXUvaW92YS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3BjaS9pb3ZhLmMKcmVuYW1lIHRvIGRyaXZlcnMvaW9tbXUvaW92YS5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pb21tdS5jIGIvZHJpdmVycy9pb21tdS9tc21faW9tbXUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1tc20vaW9tbXUuYwpyZW5hbWUgdG8gZHJpdmVycy9pb21tdS9tc21faW9tbXUuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW9tbXVfZGV2LmMgYi9kcml2ZXJzL2lvbW11L21zbV9pb21tdV9kZXYuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1tc20vaW9tbXVfZGV2LmMKcmVuYW1lIHRvIGRyaXZlcnMvaW9tbXUvbXNtX2lvbW11X2Rldi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2ludGVyZmFjZS5jCmluZGV4IDU5ZGU2MzguLmUzNTA1OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2ludGVyZmFjZS5jCkBAIC0xNTYsOCArMTU2LDEwIEBACiAJaWYgKCFjcyB8fCAhdHJ5X21vZHVsZV9nZXQoY3MtPmRyaXZlci0+b3duZXIpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNzLT5tdXRleCkpCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY3MtPm11dGV4KSkgeworCQltb2R1bGVfcHV0KGNzLT5kcml2ZXItPm93bmVyKTsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CiAJdHR5LT5kcml2ZXJfZGF0YSA9IGNzOwogCiAJKytjcy0+b3Blbl9jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9hdm1mcml0ei5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKaW5kZXggNDcyYTJhZi4uODYxYjY1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICoKICAqLworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jCmluZGV4IGY2ZjNjODcuLmE0NDBkN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jCkBAIC0xNTIsNiArMTUyLDcgQEAKIAogI2RlZmluZSBIRkNfTVVMVElfVkVSU0lPTgkiMi4wMyIKIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNwY2kuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNwY2kuYwppbmRleCBiMDFhN2JlLi4zMjYxZGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjcGNpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3BjaS5jCkBAIC00NCw2ICs0NCw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3N1c2IuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNzdXNiLmMKaW5kZXggM2NjYmZmMS4uNzFhOGViNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3N1c2IuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjc3VzYi5jCkBAIC0yODMsNiArMjgzLDcgQEAKIAlfcXVldWVfZGF0YSgmZGNoLT5kZXYuRCwgTVBIX0lORk9STUFUSU9OX0lORCwgTUlTRE5fSURfQU5ZLAogCQlzaXplb2Yoc3RydWN0IHBoX2luZm9fZGNoKSArIGRjaC0+ZGV2Lm5yYmNoYW4gKgogCQlzaXplb2Yoc3RydWN0IHBoX2luZm9fY2gpLCBwaGksIEdGUF9BVE9NSUMpOworCWtmcmVlKHBoaSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pbmZpbmVvbi5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaW5maW5lb24uYwppbmRleCBiYzA1MjlhLi42MjE4Nzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pbmZpbmVvbi5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmluZmluZW9uLmMKQEAgLTM4LDYgKzM4LDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pcGFjLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pcGFjLmMKaW5kZXggNjRlY2M2Zi4uZDJmZmIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaXBhYy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmlwYWMuYwpAQCAtMjAsNiArMjAsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21JU0ROaHcuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9uZXRqZXQuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9uZXRqZXQuYwppbmRleCBkYjI1YjZiLi41ZWY5ZjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbmV0amV0LmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL25ldGpldC5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL3NwZWVkZmF4LmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vc3BlZWRmYXguYwppbmRleCA5ZTA3MjQ2Li40ZDBkNDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vc3BlZWRmYXguYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vc3BlZWRmYXguYwpAQCAtMjIsNiArMjIsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL3c2NjkyLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vdzY2OTIuYwppbmRleCA5ZTg0ODcwLi5lMTBlMDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vdzY2OTIuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vdzY2OTIuYwpAQCAtMjEsNiArMjEsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheC5oIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4LmgKaW5kZXggZGUxYzY2OS4uMGE1YzQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4LmgKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4LmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXhfZmNwY2lwbnAuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheF9mY3BjaXBucC5jCmluZGV4IDhiMGE3ZDguLjQ3OGViYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheF9mY3BjaXBucC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheF9mY3BjaXBucC5jCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2JzZGNvbXAuYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9ic2Rjb21wLmMKaW5kZXggMDJkOTkxOC4uYWEwYjZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2JzZGNvbXAuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fYnNkY29tcC5jCkBAIC0xNTUsNyArMTU1LDcgQEAKICNkZWZpbmUgTEFTVAkyNTUKIAogI2RlZmluZSBNQVhDT0RFKGIpCSgoMSA8PCAoYikpIC0gMSkKLSNkZWZpbmUgQkFEQ09ERU0xCU1BWENPREUoTUFYX0JTRF9CSVRTKTsKKyNkZWZpbmUgQkFEQ09ERU0xCU1BWENPREUoTUFYX0JTRF9CSVRTKQogCiAjZGVmaW5lIEJTRF9IQVNIKHByZWZpeCxzdWZmaXgsaHNoaWZ0KSAoKCgodW5zaWduZWQgbG9uZykoc3VmZml4KSk8PChoc2hpZnQpKSBcCiAJCQkJCSBeICh1bnNpZ25lZCBsb25nKShwcmVmaXgpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCmluZGV4IDk3OTg4MTEuLjQ4ZTljYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKQEAgLTE5ODMsMTMgKzE5ODMsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGlzZG5faGVhZGVyX2NhY2hlKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3QgaGhfY2FjaGUgKmhoKQorc3RhdGljIGludCBpc2RuX2hlYWRlcl9jYWNoZShjb25zdCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IGhoX2NhY2hlICpoaCwKKwkJCSAgICAgX19iZTE2IHR5cGUpCiB7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CiAJaXNkbl9uZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChscC0+cF9lbmNhcCA9PSBJU0ROX05FVF9FTkNBUF9FVEhFUikKLQkJcmV0dXJuIGV0aF9oZWFkZXJfY2FjaGUobmVpZ2gsIGhoKTsKKwkJcmV0dXJuIGV0aF9oZWFkZXJfY2FjaGUobmVpZ2gsIGhoLCB0eXBlKTsKIAlyZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9LY29uZmlnIGIvZHJpdmVycy9sZWRzL0tjb25maWcKaW5kZXggMjNmMGQ1ZS4uYjU5MWU3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL0tjb25maWcKKysrIGIvZHJpdmVycy9sZWRzL0tjb25maWcKQEAgLTEsMyArMSwxMCBAQAorY29uZmlnIExFRFNfR1BJT19SRUdJU1RFUgorCWJvb2wKKwloZWxwCisJICBUaGlzIG9wdGlvbiBwcm92aWRlcyB0aGUgZnVuY3Rpb24gZ3Bpb19sZWRfcmVnaXN0ZXJfZGV2aWNlLgorCSAgQXMgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGFyY2ggY29kZSBpdCBtdXN0IG5vdCBiZSBjb21waWxlZCBhcyBhCisJICBtb2R1bGUuCisKIG1lbnVjb25maWcgTkVXX0xFRFMKIAlib29sICJMRUQgU3VwcG9ydCIKIAloZWxwCkBAIC03LDIyICsxNCwxNCBAQAogCSAgVGhpcyBpcyBub3QgcmVsYXRlZCB0byBzdGFuZGFyZCBrZXlib2FyZCBMRURzIHdoaWNoIGFyZSBjb250cm9sbGVkCiAJICB2aWEgdGhlIGlucHV0IHN5c3RlbS4KIAoraWYgTkVXX0xFRFMKKwogY29uZmlnIExFRFNfQ0xBU1MKIAlib29sICJMRUQgQ2xhc3MgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5FV19MRURTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgbGVkIHN5c2ZzIGNsYXNzIGluIC9zeXMvY2xhc3MvbGVkcy4gIFlvdSdsbAogCSAgbmVlZCB0aGlzIHRvIGRvIGFueXRoaW5nIHVzZWZ1bCB3aXRoIExFRHMuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgTEVEU19HUElPX1JFR0lTVEVSCi0JYm9vbAotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIHRoZSBmdW5jdGlvbiBncGlvX2xlZF9yZWdpc3Rlcl9kZXZpY2UuCi0JICBBcyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgYXJjaCBjb2RlIGl0IG11c3Qgbm90IGJlIGNvbXBpbGVkIGFzIGEKLQkgIG1vZHVsZS4KLQotaWYgTkVXX0xFRFMKLQogY29tbWVudCAiTEVEIGRyaXZlcnMiCiAKIGNvbmZpZyBMRURTXzg4UE04NjBYCkBAIC05Myw3ICs5Miw3IEBACiBjb25maWcgTEVEU19ORVQ1NTAxCiAJdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciBTb2VrcmlzIG5ldDU1MDEgc2VyaWVzIEVycm9yIExFRCIKIAlkZXBlbmRzIG9uIExFRFNfVFJJR0dFUlMKLQlkZXBlbmRzIG9uIFg4NiAmJiBMRURTX0dQSU9fUExBVEZPUk0gJiYgR1BJT19DUzU1MzUKKwlkZXBlbmRzIG9uIFg4NiAmJiBHUElPX0NTNTUzNQogCXNlbGVjdCBMRURTX1RSSUdHRVJfREVGQVVMVF9PTgogCWRlZmF1bHQgbgogCWhlbHAKQEAgLTE4MywyMyArMTgyLDYgQEAKIAkgIGRlZmluZWQgYXMgcGxhdGZvcm0gZGV2aWNlcyBhbmQvb3IgT3BlbkZpcm13YXJlIHBsYXRmb3JtIGRldmljZXMuCiAJICBUaGUgY29kZSB0byB1c2UgdGhlc2UgYmluZGluZ3MgY2FuIGJlIHNlbGVjdGVkIGJlbG93LgogCi1jb25maWcgTEVEU19HUElPX1BMQVRGT1JNCi0JYm9vbCAiUGxhdGZvcm0gZGV2aWNlIGJpbmRpbmdzIGZvciBHUElPIExFRHMiCi0JZGVwZW5kcyBvbiBMRURTX0dQSU8KLQlkZWZhdWx0IHkKLQloZWxwCi0JICBMZXQgdGhlIGxlZHMtZ3BpbyBkcml2ZXIgZHJpdmUgTEVEcyB3aGljaCBoYXZlIGJlZW4gZGVmaW5lZCBhcwotCSAgcGxhdGZvcm0gZGV2aWNlcy4gIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhpcyBtZWFucywgc2F5IHllcy4KLQotY29uZmlnIExFRFNfR1BJT19PRgotCWJvb2wgIk9wZW5GaXJtd2FyZSBwbGF0Zm9ybSBkZXZpY2UgYmluZGluZ3MgZm9yIEdQSU8gTEVEcyIKLQlkZXBlbmRzIG9uIExFRFNfR1BJTyAmJiBPRl9ERVZJQ0UKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBMZXQgdGhlIGxlZHMtZ3BpbyBkcml2ZXIgZHJpdmUgTEVEcyB3aGljaCBoYXZlIGJlZW4gZGVmaW5lZCBhcwotCSAgb2ZfcGxhdGZvcm0gZGV2aWNlcy4gIEZvciBpbnN0YW5jZSwgTEVEcyB3aGljaCBhcmUgbGlzdGVkIGluIGEgImR0cyIKLQkgIGZpbGUuCi0KIGNvbmZpZyBMRURTX0xQMzk0NAogCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgTi5TLiBMUDM5NDQgKEZ1biBMaWdodCkgSTJDIGNoaXAiCiAJZGVwZW5kcyBvbiBMRURTX0NMQVNTCkBAIC0zODMsNiArMzY1LDcgQEAKIGNvbmZpZyBMRURTX05FVFhCSUcKIAl0cmlzdGF0ZSAiTEVEIHN1cHBvcnQgZm9yIEJpZyBOZXR3b3JrIHNlcmllcyBMRURzIgogCWRlcGVuZHMgb24gTUFDSF9ORVQyQklHX1YyIHx8IE1BQ0hfTkVUNUJJR19WMgorCWRlcGVuZHMgb24gTEVEU19DTEFTUwogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZSBzdXBwb3J0IGZvciBMRURzIGZvdW5kIG9uIHRoZSBMYUNpZSAyQmlnCkBAIC0zOTEsNiArMzc0LDcgQEAKIAogY29uZmlnIExFRFNfQVNJQzMKIAlib29sICJMRUQgc3VwcG9ydCBmb3IgdGhlIEhUQyBBU0lDMyIKKwlkZXBlbmRzIG9uIExFRFNfQ0xBU1MKIAlkZXBlbmRzIG9uIE1GRF9BU0lDMwogCWRlZmF1bHQgeQogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYwppbmRleCBiMDQ4MGM4Li4zZDhiYzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1ncGlvLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIH0KIAogLyogQ29kZSB0byBjcmVhdGUgZnJvbSBPcGVuRmlybXdhcmUgcGxhdGZvcm0gZGV2aWNlcyAqLwotI2lmZGVmIENPTkZJR19MRURTX0dQSU9fT0YKKyNpZmRlZiBDT05GSUdfT0ZfR1BJTwogc3RhdGljIHN0cnVjdCBncGlvX2xlZHNfcHJpdiAqIF9fZGV2aW5pdCBncGlvX2xlZHNfY3JlYXRlX29mKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlLCAqY2hpbGQ7CkBAIC0yMjMsMTMgKzIyMywxMyBAQAogCXsgLmNvbXBhdGlibGUgPSAiZ3Bpby1sZWRzIiwgfSwKIAl7fSwKIH07Ci0jZWxzZQorI2Vsc2UgLyogQ09ORklHX09GX0dQSU8gKi8KIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRzX3ByaXYgKiBfX2RldmluaXQgZ3Bpb19sZWRzX2NyZWF0ZV9vZihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXJldHVybiBOVUxMOwogfQogI2RlZmluZSBvZl9ncGlvX2xlZHNfbWF0Y2ggTlVMTAotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX09GX0dQSU8gKi8KIAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvX2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbG0zNTMwLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1sbTM1MzAuYwppbmRleCA0ZDdjZTc2Li4zZGQ3MDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1sbTM1MzAuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1sbTM1MzAuYwpAQCAtNjgsMTcgKzY4LDE2IEBACiAjZGVmaW5lIExNMzUzMF9BTFMyX0lNUF9TSElGVAkJKDQpCiAKIC8qIFpvbmUgQm91bmRhcnkgUmVnaXN0ZXIgZGVmYXVsdHMgKi8KLSNkZWZpbmUgTE0zNTMwX0RFRl9aQl8wCQkJKDB4MzMpCi0jZGVmaW5lIExNMzUzMF9ERUZfWkJfMQkJCSgweDY2KQotI2RlZmluZSBMTTM1MzBfREVGX1pCXzIJCQkoMHg5OSkKLSNkZWZpbmUgTE0zNTMwX0RFRl9aQl8zCQkJKDB4Q0MpCisjZGVmaW5lIExNMzUzMF9BTFNfWkJfTUFYCQkoNCkKKyNkZWZpbmUgTE0zNTMwX0FMU19XSU5ET1dfbVYJCSgxMDAwKQorI2RlZmluZSBMTTM1MzBfQUxTX09GRlNFVF9tVgkJKDQpCiAKIC8qIFpvbmUgVGFyZ2V0IFJlZ2lzdGVyIGRlZmF1bHRzICovCi0jZGVmaW5lIExNMzUzMF9ERUZfWlRfMAkJCSgweDE5KQotI2RlZmluZSBMTTM1MzBfREVGX1pUXzEJCQkoMHgzMykKKyNkZWZpbmUgTE0zNTMwX0RFRl9aVF8wCQkJKDB4N0YpCisjZGVmaW5lIExNMzUzMF9ERUZfWlRfMQkJCSgweDY2KQogI2RlZmluZSBMTTM1MzBfREVGX1pUXzIJCQkoMHg0QykKLSNkZWZpbmUgTE0zNTMwX0RFRl9aVF8zCQkJKDB4NjYpCi0jZGVmaW5lIExNMzUzMF9ERUZfWlRfNAkJCSgweDdGKQorI2RlZmluZSBMTTM1MzBfREVGX1pUXzMJCQkoMHgzMykKKyNkZWZpbmUgTE0zNTMwX0RFRl9aVF80CQkJKDB4MTkpCiAKIHN0cnVjdCBsbTM1MzBfbW9kZV9tYXAgewogCWNvbnN0IGNoYXIgKm1vZGU7CkBAIC0xNTAsNiArMTQ5LDggQEAKIAl1OCBhbHNfaW1wX3NlbCA9IDA7CiAJdTggYnJpZ2h0bmVzczsKIAl1OCByZWdfdmFsW0xNMzUzMF9SRUdfTUFYXTsKKwl1OCB6b25lc1tMTTM1MzBfQUxTX1pCX01BWF07CisJdTMyIGFsc192bWluLCBhbHNfdm1heCwgYWxzX3ZzdGVwOwogCXN0cnVjdCBsbTM1MzBfcGxhdGZvcm1fZGF0YSAqcGx0Zm0gPSBkcnZkYXRhLT5wZGF0YTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZHJ2ZGF0YS0+Y2xpZW50OwogCkBAIC0xNjEsNiArMTYyLDI2IEBACiAJCWdlbl9jb25maWcgfD0gKExNMzUzMF9FTkFCTEVfSTJDKTsKIAogCWlmIChkcnZkYXRhLT5tb2RlID09IExNMzUzMF9CTF9NT0RFX0FMUykgeworCQlpZiAocGx0Zm0tPmFsc192bWF4ID09IDApIHsKKwkJCXBsdGZtLT5hbHNfdm1pbiA9IGFsc192bWluID0gMDsKKwkJCXBsdGZtLT5hbHNfdm1pbiA9IGFsc192bWF4ID0gTE0zNTMwX0FMU19XSU5ET1dfbVY7CisJCX0KKworCQlhbHNfdm1pbiA9IHBsdGZtLT5hbHNfdm1pbjsKKwkJYWxzX3ZtYXggPSBwbHRmbS0+YWxzX3ZtYXg7CisKKwkJaWYgKChhbHNfdm1heCAtIGFsc192bWluKSA+IExNMzUzMF9BTFNfV0lORE9XX21WKQorCQkJcGx0Zm0tPmFsc192bWF4ID0gYWxzX3ZtYXggPQorCQkJCWFsc192bWluICsgTE0zNTMwX0FMU19XSU5ET1dfbVY7CisKKwkJLyogbiB6b25lIGJvdW5kYXJ5IG1ha2VzIG4rMSB6b25lcyAqLworCQlhbHNfdnN0ZXAgPSAoYWxzX3ZtYXggLSBhbHNfdm1pbikgLyAoTE0zNTMwX0FMU19aQl9NQVggKyAxKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTE0zNTMwX0FMU19aQl9NQVg7IGkrKykKKwkJCXpvbmVzW2ldID0gKCgoYWxzX3ZtaW4gKyBMTTM1MzBfQUxTX09GRlNFVF9tVikgKworCQkJCQlhbHNfdnN0ZXAgKyAoaSAqIGFsc192c3RlcCkpICogTEVEX0ZVTEwpCisJCQkJCS8gMTAwMDsKKwogCQlhbHNfY29uZmlnID0KIAkJCShwbHRmbS0+YWxzX2F2cmdfdGltZSA8PCBMTTM1MzBfQUxTX0FWR19USU1FX1NISUZUKSB8CiAJCQkoTE0zNTMwX0VOQUJMRV9BTFMpIHwKQEAgLTE2OSw2ICsxOTAsNyBAQAogCQlhbHNfaW1wX3NlbCA9CiAJCQkocGx0Zm0tPmFsczFfcmVzaXN0b3Jfc2VsIDw8IExNMzUzMF9BTFMxX0lNUF9TSElGVCkgfAogCQkJKHBsdGZtLT5hbHMyX3Jlc2lzdG9yX3NlbCA8PCBMTTM1MzBfQUxTMl9JTVBfU0hJRlQpOworCiAJfQogCiAJaWYgKGRydmRhdGEtPm1vZGUgPT0gTE0zNTMwX0JMX01PREVfUFdNKQpAQCAtMTkwLDEwICsyMTIsMTAgQEAKIAlyZWdfdmFsWzNdID0gMHgwMDsJCS8qIExNMzUzMF9BTFNfWk9ORV9SRUcgKi8KIAlyZWdfdmFsWzRdID0gYWxzX2ltcF9zZWw7CS8qIExNMzUzMF9BTFNfSU1QX1NFTEVDVCAqLwogCXJlZ192YWxbNV0gPSBicmlnaHRuZXNzOwkvKiBMTTM1MzBfQlJUX0NUUkxfUkVHICovCi0JcmVnX3ZhbFs2XSA9IExNMzUzMF9ERUZfWkJfMDsJLyogTE0zNTMwX0FMU19aQjBfUkVHICovCi0JcmVnX3ZhbFs3XSA9IExNMzUzMF9ERUZfWkJfMTsJLyogTE0zNTMwX0FMU19aQjFfUkVHICovCi0JcmVnX3ZhbFs4XSA9IExNMzUzMF9ERUZfWkJfMjsJLyogTE0zNTMwX0FMU19aQjJfUkVHICovCi0JcmVnX3ZhbFs5XSA9IExNMzUzMF9ERUZfWkJfMzsJLyogTE0zNTMwX0FMU19aQjNfUkVHICovCisJcmVnX3ZhbFs2XSA9IHpvbmVzWzBdOwkJLyogTE0zNTMwX0FMU19aQjBfUkVHICovCisJcmVnX3ZhbFs3XSA9IHpvbmVzWzFdOwkJLyogTE0zNTMwX0FMU19aQjFfUkVHICovCisJcmVnX3ZhbFs4XSA9IHpvbmVzWzJdOwkJLyogTE0zNTMwX0FMU19aQjJfUkVHICovCisJcmVnX3ZhbFs5XSA9IHpvbmVzWzNdOwkJLyogTE0zNTMwX0FMU19aQjNfUkVHICovCiAJcmVnX3ZhbFsxMF0gPSBMTTM1MzBfREVGX1pUXzA7CS8qIExNMzUzMF9BTFNfWjBUX1JFRyAqLwogCXJlZ192YWxbMTFdID0gTE0zNTMwX0RFRl9aVF8xOwkvKiBMTTM1MzBfQUxTX1oxVF9SRUcgKi8KIAlyZWdfdmFsWzEyXSA9IExNMzUzMF9ERUZfWlRfMjsJLyogTE0zNTMwX0FMU19aMlRfUkVHICovCkBAIC0yNjUsNiArMjg3LDI0IEBACiAJfQogfQogCitzdGF0aWMgc3NpemVfdCBsbTM1MzBfbW9kZV9nZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjb250YWluZXJfb2YoCisJCQkJCWRldi0+cGFyZW50LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKKwlzdHJ1Y3QgbG0zNTMwX2RhdGEgKmRydmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaSwgbGVuID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vZGVfbWFwKTsgaSsrKQorCQlpZiAoZHJ2ZGF0YS0+bW9kZSA9PSBtb2RlX21hcFtpXS5tb2RlX3ZhbCkKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlslc10gIiwgbW9kZV9tYXBbaV0ubW9kZSk7CisJCWVsc2UKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzICIsIG1vZGVfbWFwW2ldLm1vZGUpOworCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXG4iKTsKKworCXJldHVybiBsZW47Cit9CiAKIHN0YXRpYyBzc2l6ZV90IGxtMzUzMF9tb2RlX3NldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCiAJCQkJICAgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCkBAIC0yOTgsOCArMzM4LDcgQEAKIAogCXJldHVybiBzaXplb2YoZHJ2ZGF0YS0+bW9kZSk7CiB9Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihtb2RlLCAwNjQ0LCBOVUxMLCBsbTM1MzBfbW9kZV9zZXQpOworc3RhdGljIERFVklDRV9BVFRSKG1vZGUsIDA2NDQsIGxtMzUzMF9tb2RlX2dldCwgbG0zNTMwX21vZGVfc2V0KTsKIAogc3RhdGljIGludCBfX2RldmluaXQgbG0zNTMwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWxwNTUyMS5jCmluZGV4IGMwY2ZmNjQuLjlmYzEyMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWxwNTUyMS5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWxwNTUyMS5jCkBAIC01OTMsNyArNTkzLDcgQEAKIAkJCQkmbHA1NTIxX2xlZF9hdHRyaWJ1dGVfZ3JvdXApOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBscDU1MjFfaW5pdF9sZWQoc3RydWN0IGxwNTUyMV9sZWQgKmxlZCwKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxwNTUyMV9pbml0X2xlZChzdHJ1Y3QgbHA1NTIxX2xlZCAqbGVkLAogCQkJCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJaW50IGNoYW4sIHN0cnVjdCBscDU1MjFfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCiB7CkBAIC02MzcsNyArNjM3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBscDU1MjFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxwNTUyMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBscDU1MjFfY2hpcAkJKmNoaXA7CkBAIC03NDQsNyArNzQ0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGxwNTUyMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgX19kZXZleGl0IGxwNTUyMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgbHA1NTIxX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgaTsKQEAgLTc3NSw3ICs3NzUsNyBAQAogCQkubmFtZQk9ICJscDU1MjEiLAogCX0sCiAJLnByb2JlCQk9IGxwNTUyMV9wcm9iZSwKLQkucmVtb3ZlCQk9IGxwNTUyMV9yZW1vdmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChscDU1MjFfcmVtb3ZlKSwKIAkuaWRfdGFibGUJPSBscDU1MjFfaWQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjMuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWxwNTUyMy5jCmluZGV4IGUxOWZlZDIuLjU5NzFlMzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjMuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjMuYwpAQCAtODI2LDcgKzgyNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGxwNTUyM19pbml0X2xlZChzdHJ1Y3QgbHA1NTIzX2xlZCAqbGVkLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBscDU1MjNfaW5pdF9sZWQoc3RydWN0IGxwNTUyM19sZWQgKmxlZCwgc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgaW50IGNoYW4sIHN0cnVjdCBscDU1MjNfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCiB7CiAJY2hhciBuYW1lWzMyXTsKQEAgLTg3Miw3ICs4NzIsNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbHA1NTIzX2RyaXZlcjsKIAotc3RhdGljIGludCBscDU1MjNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxwNTUyM19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBscDU1MjNfY2hpcAkJKmNoaXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1wY2E5NTMyLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1wY2E5NTMyLmMKaW5kZXggZDhkM2ExZS4uYTJjODc0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTUzMi5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLXBjYTk1MzIuYwpAQCAtODgsNyArODgsNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGNhOTUzMl9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAicGNhOTUzeCIsCisJCS5uYW1lID0gImxlZHMtcGNhOTUzeCIsCiAJfSwKIAkucHJvYmUgPSBwY2E5NTMyX3Byb2JlLAogCS5yZW1vdmUgPSBwY2E5NTMyX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXN1bmZpcmUuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXN1bmZpcmUuYwppbmRleCBhYjZkMThmLi4xNzU3Mzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1zdW5maXJlLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtc3VuZmlyZS5jCkBAIC0xMjcsMTcgKzEyNywxOSBAQAogCQkJCQkgICAgICAgc3RydWN0IGxlZF90eXBlICp0eXBlcykKIHsKIAlzdHJ1Y3Qgc3VuZmlyZV9kcnZkYXRhICpwOwotCWludCBpLCBlcnIgPSAtRUlOVkFMOworCWludCBpLCBlcnI7CiAKIAlpZiAocGRldi0+bnVtX3Jlc291cmNlcyAhPSAxKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIldyb25nIG51bWJlciBvZiByZXNvdXJjZXMgJWQsIHNob3VsZCBiZSAxXG4iLAogCQkgICAgICAgcGRldi0+bnVtX3Jlc291cmNlcyk7CisJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAogCXAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOwogCWlmICghcCkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgYWxsb2NhdGUgc3RydWN0IHN1bmZpcmVfZHJ2ZGF0YVxuIik7CisJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTYwLDE0ICsxNjIsMTQgQEAKIAogCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBwKTsKIAotCWVyciA9IDA7Ci1vdXQ6Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIAogb3V0X3VucmVnaXN0ZXJfbGVkX2NkZXZzOgogCWZvciAoaS0tOyBpID49IDA7IGktLSkKIAkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJnAtPmxlZHNbaV0ubGVkX2NkZXYpOwotCWdvdG8gb3V0OworCWtmcmVlKHApOworb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IHN1bmZpcmVfbGVkX2dlbmVyaWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9jb3JlLmMgYi9kcml2ZXJzL2xndWVzdC9jb3JlLmMKaW5kZXggZWZhMjAyNC4uMjUzNTkzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvY29yZS5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2NvcmUuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAKIAkvKgogCSAqIE5vdyB0aGUgU3dpdGNoZXIgaXMgbWFwcGVkIGF0IHRoZSByaWdodCBhZGRyZXNzLCB3ZSBjYW4ndCBmYWlsIQotCSAqIENvcHkgaW4gdGhlIGNvbXBpbGVkLWluIFN3aXRjaGVyIGNvZGUgKGZyb20gPGFyY2g+X3N3aXRjaGVyLlMpLgorCSAqIENvcHkgaW4gdGhlIGNvbXBpbGVkLWluIFN3aXRjaGVyIGNvZGUgKGZyb20geDg2L3N3aXRjaGVyXzMyLlMpLgogCSAqLwogCW1lbWNweShzd2l0Y2hlcl92bWEtPmFkZHIsIHN0YXJ0X3N3aXRjaGVyX3RleHQsCiAJICAgICAgIGVuZF9zd2l0Y2hlcl90ZXh0IC0gc3RhcnRfc3dpdGNoZXJfdGV4dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9pbnRlcnJ1cHRzX2FuZF90cmFwcy5jIGIvZHJpdmVycy9sZ3Vlc3QvaW50ZXJydXB0c19hbmRfdHJhcHMuYwppbmRleCBkYWFmODY2Li4yODQzM2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9pbnRlcnJ1cHRzX2FuZF90cmFwcy5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2ludGVycnVwdHNfYW5kX3RyYXBzLmMKQEAgLTM3NSwxMSArMzc1LDkgQEAKIAkvKgogCSAqIFRoZSBIb3N0IG5lZWRzIHRvIHNlZSBwYWdlIGZhdWx0cyAoZm9yIHNoYWRvdyBwYWdpbmcgYW5kIHRvIHNhdmUgdGhlCiAJICogZmF1bHQgYWRkcmVzcyksIGdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdHMgKGluL291dCBlbXVsYXRpb24pIGFuZAotCSAqIGRldmljZSBub3QgYXZhaWxhYmxlIChUUyBoYW5kbGluZyksIGludmFsaWQgb3Bjb2RlIGZhdWx0IChrdm0gaGNhbGwpLAotCSAqIGFuZCBvZiBjb3Vyc2UsIHRoZSBoeXBlcmNhbGwgdHJhcC4KKwkgKiBkZXZpY2Ugbm90IGF2YWlsYWJsZSAoVFMgaGFuZGxpbmcpIGFuZCBvZiBjb3Vyc2UsIHRoZSBoeXBlcmNhbGwgdHJhcC4KIAkgKi8KLQlyZXR1cm4gbnVtICE9IDE0ICYmIG51bSAhPSAxMyAmJiBudW0gIT0gNyAmJgotCQkJbnVtICE9IDYgJiYgbnVtICE9IExHVUVTVF9UUkFQX0VOVFJZOworCXJldHVybiBudW0gIT0gMTQgJiYgbnVtICE9IDEzICYmIG51bSAhPSA3ICYmIG51bSAhPSBMR1VFU1RfVFJBUF9FTlRSWTsKIH0KIC8qOiovCiAKQEAgLTQyOSw4ICs0MjcsOCBAQAogCiAvKgogICogRGlyZWN0IHRyYXBzIGFsc28gbWVhbiB0aGF0IHdlIG5lZWQgdG8ga25vdyB3aGVuZXZlciB0aGUgR3Vlc3Qgd2FudHMgdG8gdXNlCi0gKiBhIGRpZmZlcmVudCBrZXJuZWwgc3RhY2ssIHNvIHdlIGNhbiBjaGFuZ2UgdGhlIElEVCBlbnRyaWVzIHRvIHVzZSB0aGF0Ci0gKiBzdGFjay4gIFRoZSBJRFQgZW50cmllcyBleHBlY3QgYSB2aXJ0dWFsIGFkZHJlc3MsIHNvIHVubGlrZSBtb3N0IGFkZHJlc3NlcworICogYSBkaWZmZXJlbnQga2VybmVsIHN0YWNrLCBzbyB3ZSBjYW4gY2hhbmdlIHRoZSBndWVzdCBUU1MgdG8gdXNlIHRoYXQKKyAqIHN0YWNrLiAgVGhlIFRTUyBlbnRyaWVzIGV4cGVjdCBhIHZpcnR1YWwgYWRkcmVzcywgc28gdW5saWtlIG1vc3QgYWRkcmVzc2VzCiAgKiB0aGUgR3Vlc3QgZ2l2ZXMgdXMsIHRoZSAiZXNwIiAoc3RhY2sgcG9pbnRlcikgdmFsdWUgaGVyZSBpcyB2aXJ0dWFsLCBub3QKICAqIHBoeXNpY2FsLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L2xnLmggYi9kcml2ZXJzL2xndWVzdC9sZy5oCmluZGV4IDkxMzY0MTEuLjI5NWRmMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGd1ZXN0L2xnLmgKKysrIGIvZHJpdmVycy9sZ3Vlc3QvbGcuaApAQCAtNTksNiArNTksOCBAQAogCiAJc3RydWN0IGxndWVzdF9wYWdlcyAqbGFzdF9wYWdlczsKIAorCS8qIEluaXRpYWxpemF0aW9uIG1vZGU6IGxpbmVhciBtYXAgZXZlcnl0aGluZy4gKi8KKwlib29sIGxpbmVhcl9wYWdlczsKIAlpbnQgY3B1X3BnZDsgLyogV2hpY2ggcGdkIHRoaXMgY3B1IGlzIGN1cnJlbnRseSB1c2luZyAqLwogCiAJLyogSWYgYSBoeXBlcmNhbGwgd2FzIGFza2VkIGZvciwgdGhpcyBwb2ludHMgdG8gdGhlIGFyZ3VtZW50cy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYwppbmRleCA2OWM4NGExLi41Mjg5ZmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jCkBAIC0xMDksNiArMTA5LDE3IEBACiB9CiAKIC8qCisgKiBUbyBub3RpZnkgb24gcmVzZXQgb3IgZmVhdHVyZSBmaW5hbGl6YXRpb24sIHdlIChhYil1c2UgdGhlIE5PVElGWQorICogaHlwZXJjYWxsLCB3aXRoIHRoZSBkZXNjcmlwdG9yIGFkZHJlc3Mgb2YgdGhlIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgc3RhdHVzX25vdGlmeShzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICh2b2lkICopdG9fbGdkZXYodmRldiktPmRlc2MgLSBsZ3Vlc3RfZGV2aWNlczsKKworCWhjYWxsKExIQ0FMTF9OT1RJRlksIChtYXhfcGZuIDw8IFBBR0VfU0hJRlQpICsgb2Zmc2V0LCAwLCAwLCAwKTsKK30KKworLyoKICAqIFRoZSB2aXJ0aW8gY29yZSB0YWtlcyB0aGUgZmVhdHVyZXMgdGhlIEhvc3Qgb2ZmZXJzLCBhbmQgY29waWVzIHRoZSBvbmVzCiAgKiBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciBpbnRvIHRoZSB2ZGV2LT5mZWF0dXJlcyBhcnJheS4gIE9uY2UgdGhhdCdzIGFsbAogICogc29ydGVkIG91dCwgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBzbyB3ZSBjYW4gdGVsbCB0aGUgSG9zdCB3aGljaCBmZWF0dXJlcyB3ZQpAQCAtMTM1LDYgKzE0Niw5IEBACiAJCWlmICh0ZXN0X2JpdChpLCB2ZGV2LT5mZWF0dXJlcykpCiAJCQlvdXRfZmVhdHVyZXNbaSAvIDhdIHw9ICgxIDw8IChpICUgOCkpOwogCX0KKworCS8qIFRlbGwgSG9zdCB3ZSd2ZSBmaW5pc2hlZCB3aXRoIHRoaXMgZGV2aWNlJ3MgZmVhdHVyZSBuZWdvdGlhdGlvbiAqLworCXN0YXR1c19ub3RpZnkodmRldik7CiB9CiAKIC8qIE9uY2UgdGhleSd2ZSBmb3VuZCBhIGZpZWxkLCBnZXR0aW5nIGEgY29weSBvZiBpdCBpcyBlYXN5LiAqLwpAQCAtMTY4LDI4ICsxODIsMjEgQEAKIAlyZXR1cm4gdG9fbGdkZXYodmRldiktPmRlc2MtPnN0YXR1czsKIH0KIAotLyoKLSAqIFRvIG5vdGlmeSBvbiBzdGF0dXMgdXBkYXRlcywgd2UgKGFiKXVzZSB0aGUgTk9USUZZIGh5cGVyY2FsbCwgd2l0aCB0aGUKLSAqIGRlc2NyaXB0b3IgYWRkcmVzcyBvZiB0aGUgZGV2aWNlLiAgQSB6ZXJvIHN0YXR1cyBtZWFucyAicmVzZXQiLgotICovCi1zdGF0aWMgdm9pZCBzZXRfc3RhdHVzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2LCB1OCBzdGF0dXMpCi17Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAodm9pZCAqKXRvX2xnZGV2KHZkZXYpLT5kZXNjIC0gbGd1ZXN0X2RldmljZXM7Ci0KLQkvKiBXZSBzZXQgdGhlIHN0YXR1cy4gKi8KLQl0b19sZ2Rldih2ZGV2KS0+ZGVzYy0+c3RhdHVzID0gc3RhdHVzOwotCWhjYWxsKExIQ0FMTF9OT1RJRlksIChtYXhfcGZuIDw8IFBBR0VfU0hJRlQpICsgb2Zmc2V0LCAwLCAwLCAwKTsKLX0KLQogc3RhdGljIHZvaWQgbGdfc2V0X3N0YXR1cyhzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiwgdTggc3RhdHVzKQogewogCUJVR19PTighc3RhdHVzKTsKLQlzZXRfc3RhdHVzKHZkZXYsIHN0YXR1cyk7CisJdG9fbGdkZXYodmRldiktPmRlc2MtPnN0YXR1cyA9IHN0YXR1czsKKworCS8qIFRlbGwgSG9zdCBpbW1lZGlhdGVseSBpZiB3ZSBmYWlsZWQuICovCisJaWYgKHN0YXR1cyAmIFZJUlRJT19DT05GSUdfU19GQUlMRUQpCisJCXN0YXR1c19ub3RpZnkodmRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGxnX3Jlc2V0KHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQogewotCXNldF9zdGF0dXModmRldiwgMCk7CisJLyogMCBzdGF0dXMgbWVhbnMgInJlc2V0IiAqLworCXRvX2xnZGV2KHZkZXYpLT5kZXNjLT5zdGF0dXMgPSAwOworCXN0YXR1c19ub3RpZnkodmRldik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfdXNlci5jIGIvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X3VzZXIuYwppbmRleCA5NDhjNTQ3Li5mOTdlNjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfdXNlci5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF91c2VyLmMKQEAgLTEsOCArMSwxMCBAQAotLypQOjIwMCBUaGlzIGNvbnRhaW5zIGFsbCB0aGUgL2Rldi9sZ3Vlc3QgY29kZSwgd2hlcmVieSB0aGUgdXNlcnNwYWNlIGxhdW5jaGVyCi0gKiBjb250cm9scyBhbmQgY29tbXVuaWNhdGVzIHdpdGggdGhlIEd1ZXN0LiAgRm9yIGV4YW1wbGUsIHRoZSBmaXJzdCB3cml0ZSB3aWxsCi0gKiB0ZWxsIHVzIHRoZSBHdWVzdCdzIG1lbW9yeSBsYXlvdXQgYW5kIGVudHJ5IHBvaW50LiAgQSByZWFkIHdpbGwgcnVuIHRoZQotICogR3Vlc3QgdW50aWwgc29tZXRoaW5nIGhhcHBlbnMsIHN1Y2ggYXMgYSBzaWduYWwgb3IgdGhlIEd1ZXN0IGRvaW5nIGEgTk9USUZZCi0gKiBvdXQgdG8gdGhlIExhdW5jaGVyLgorLypQOjIwMCBUaGlzIGNvbnRhaW5zIGFsbCB0aGUgL2Rldi9sZ3Vlc3QgY29kZSwgd2hlcmVieSB0aGUgdXNlcnNwYWNlCisgKiBsYXVuY2hlciBjb250cm9scyBhbmQgY29tbXVuaWNhdGVzIHdpdGggdGhlIEd1ZXN0LiAgRm9yIGV4YW1wbGUsCisgKiB0aGUgZmlyc3Qgd3JpdGUgd2lsbCB0ZWxsIHVzIHRoZSBHdWVzdCdzIG1lbW9yeSBsYXlvdXQgYW5kIGVudHJ5CisgKiBwb2ludC4gIEEgcmVhZCB3aWxsIHJ1biB0aGUgR3Vlc3QgdW50aWwgc29tZXRoaW5nIGhhcHBlbnMsIHN1Y2ggYXMKKyAqIGEgc2lnbmFsIG9yIHRoZSBHdWVzdCBkb2luZyBhIE5PVElGWSBvdXQgdG8gdGhlIExhdW5jaGVyLiAgVGhlcmUgaXMKKyAqIGFsc28gYSB3YXkgZm9yIHRoZSBMYXVuY2hlciB0byBhdHRhY2ggZXZlbnRmZHMgdG8gcGFydGljdWxhciBOT1RJRlkKKyAqIHZhbHVlcyBpbnN0ZWFkIG9mIHJldHVybmluZyBmcm9tIHRoZSByZWFkKCkgY2FsbC4KIDoqLwogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CkBAIC0zNTcsOCArMzU5LDggQEAKIAkJZ290byBmcmVlX2V2ZW50ZmRzOwogCiAJLyoKLQkgKiBJbml0aWFsaXplIHRoZSBHdWVzdCdzIHNoYWRvdyBwYWdlIHRhYmxlcywgdXNpbmcgdGhlIHRvcGxldmVsCi0JICogYWRkcmVzcyB0aGUgTGF1bmNoZXIgZ2F2ZSB1cy4gIFRoaXMgYWxsb2NhdGVzIG1lbW9yeSwgc28gY2FuIGZhaWwuCisJICogSW5pdGlhbGl6ZSB0aGUgR3Vlc3QncyBzaGFkb3cgcGFnZSB0YWJsZXMuICBUaGlzIGFsbG9jYXRlcworCSAqIG1lbW9yeSwgc28gY2FuIGZhaWwuCiAJICovCiAJZXJyID0gaW5pdF9ndWVzdF9wYWdldGFibGUobGcpOwogCWlmIChlcnIpCkBAIC01MTYsNiArNTE4LDcgQEAKIAkucmVhZAkgPSByZWFkLAogCS5sbHNlZWsgID0gZGVmYXVsdF9sbHNlZWssCiB9OworLyo6Ki8KIAogLyoKICAqIFRoaXMgaXMgYSB0ZXh0Ym9vayBleGFtcGxlIG9mIGEgIm1pc2MiIGNoYXJhY3RlciBkZXZpY2UuICBQb3B1bGF0ZSBhICJzdHJ1Y3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L3BhZ2VfdGFibGVzLmMgYi9kcml2ZXJzL2xndWVzdC9wYWdlX3RhYmxlcy5jCmluZGV4IGQyMTU3OGUuLjNiNjJiZTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9wYWdlX3RhYmxlcy5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L3BhZ2VfdGFibGVzLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9ib290cGFyYW0uaD4KICNpbmNsdWRlICJsZy5oIgogCiAvKk06MDA4CkBAIC0xNTYsNyArMTU1LDcgQEAKIH0KIAogLyoKLSAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUganVzdCBsaWtlIHRoZSBhYm92ZSB0d28sIGV4Y2VwdCB0aGV5IGFjY2VzcyB0aGUgR3Vlc3QKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUganVzdCBsaWtlIHRoZSBhYm92ZSwgZXhjZXB0IHRoZXkgYWNjZXNzIHRoZSBHdWVzdAogICogcGFnZSB0YWJsZXMuICBIZW5jZSB0aGV5IHJldHVybiBhIEd1ZXN0IGFkZHJlc3MuCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGdwZ2RfYWRkcihzdHJ1Y3QgbGdfY3B1ICpjcHUsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCkBAIC0xOTYsNyArMTk1LDcgQEAKICNlbmRpZgogLyo6Ki8KIAotLypNOjAxNAorLypNOjAwNwogICogZ2V0X3BmbiBpcyBzbG93OiB3ZSBjb3VsZCBwcm9iYWJseSB0cnkgdG8gZ3JhYiBiYXRjaGVzIG9mIHBhZ2VzIGhlcmUgYXMKICAqIGFuIG9wdGltaXphdGlvbiAoaWUuIHByZS1mYXVsdGluZykuCiA6Ki8KQEAgLTMyNSwxMCArMzI0LDE1IEBACiAjZW5kaWYKIAogCS8qIEZpcnN0IHN0ZXA6IGdldCB0aGUgdG9wLWxldmVsIEd1ZXN0IHBhZ2UgdGFibGUgZW50cnkuICovCi0JZ3BnZCA9IGxncmVhZChjcHUsIGdwZ2RfYWRkcihjcHUsIHZhZGRyKSwgcGdkX3QpOwotCS8qIFRvcGxldmVsIG5vdCBwcmVzZW50PyAgV2UgY2FuJ3QgbWFwIGl0IGluLiAqLwotCWlmICghKHBnZF9mbGFncyhncGdkKSAmIF9QQUdFX1BSRVNFTlQpKQotCQlyZXR1cm4gZmFsc2U7CisJaWYgKHVubGlrZWx5KGNwdS0+bGluZWFyX3BhZ2VzKSkgeworCQkvKiBGYWtpbmcgdXAgYSBsaW5lYXIgbWFwcGluZy4gKi8KKwkJZ3BnZCA9IF9fcGdkKENIRUNLX0dQR0RfTUFTSyk7CisJfSBlbHNlIHsKKwkJZ3BnZCA9IGxncmVhZChjcHUsIGdwZ2RfYWRkcihjcHUsIHZhZGRyKSwgcGdkX3QpOworCQkvKiBUb3BsZXZlbCBub3QgcHJlc2VudD8gIFdlIGNhbid0IG1hcCBpdCBpbi4gKi8KKwkJaWYgKCEocGdkX2ZsYWdzKGdwZ2QpICYgX1BBR0VfUFJFU0VOVCkpCisJCQlyZXR1cm4gZmFsc2U7CisJfQogCiAJLyogTm93IGxvb2sgYXQgdGhlIG1hdGNoaW5nIHNoYWRvdyBlbnRyeS4gKi8KIAlzcGdkID0gc3BnZF9hZGRyKGNwdSwgY3B1LT5jcHVfcGdkLCB2YWRkcik7CkBAIC0zNTMsMTAgKzM1NywxNSBAQAogCX0KIAogI2lmZGVmIENPTkZJR19YODZfUEFFCi0JZ3BtZCA9IGxncmVhZChjcHUsIGdwbWRfYWRkcihncGdkLCB2YWRkciksIHBtZF90KTsKLQkvKiBNaWRkbGUgbGV2ZWwgbm90IHByZXNlbnQ/ICBXZSBjYW4ndCBtYXAgaXQgaW4uICovCi0JaWYgKCEocG1kX2ZsYWdzKGdwbWQpICYgX1BBR0VfUFJFU0VOVCkpCi0JCXJldHVybiBmYWxzZTsKKwlpZiAodW5saWtlbHkoY3B1LT5saW5lYXJfcGFnZXMpKSB7CisJCS8qIEZha2luZyB1cCBhIGxpbmVhciBtYXBwaW5nLiAqLworCQlncG1kID0gX19wbWQoX1BBR0VfVEFCTEUpOworCX0gZWxzZSB7CisJCWdwbWQgPSBsZ3JlYWQoY3B1LCBncG1kX2FkZHIoZ3BnZCwgdmFkZHIpLCBwbWRfdCk7CisJCS8qIE1pZGRsZSBsZXZlbCBub3QgcHJlc2VudD8gIFdlIGNhbid0IG1hcCBpdCBpbi4gKi8KKwkJaWYgKCEocG1kX2ZsYWdzKGdwbWQpICYgX1BBR0VfUFJFU0VOVCkpCisJCQlyZXR1cm4gZmFsc2U7CisJfQogCiAJLyogTm93IGxvb2sgYXQgdGhlIG1hdGNoaW5nIHNoYWRvdyBlbnRyeS4gKi8KIAlzcG1kID0gc3BtZF9hZGRyKGNwdSwgKnNwZ2QsIHZhZGRyKTsKQEAgLTM5Nyw4ICs0MDYsMTMgQEAKIAlncHRlX3B0ciA9IGdwdGVfYWRkcihjcHUsIGdwZ2QsIHZhZGRyKTsKICNlbmRpZgogCi0JLyogUmVhZCB0aGUgYWN0dWFsIFBURSB2YWx1ZS4gKi8KLQlncHRlID0gbGdyZWFkKGNwdSwgZ3B0ZV9wdHIsIHB0ZV90KTsKKwlpZiAodW5saWtlbHkoY3B1LT5saW5lYXJfcGFnZXMpKSB7CisJCS8qIExpbmVhcj8gIE1ha2UgdXAgYSBQVEUgd2hpY2ggcG9pbnRzIHRvIHNhbWUgcGFnZS4gKi8KKwkJZ3B0ZSA9IF9fcHRlKCh2YWRkciAmIFBBR0VfTUFTSykgfCBfUEFHRV9SVyB8IF9QQUdFX1BSRVNFTlQpOworCX0gZWxzZSB7CisJCS8qIFJlYWQgdGhlIGFjdHVhbCBQVEUgdmFsdWUuICovCisJCWdwdGUgPSBsZ3JlYWQoY3B1LCBncHRlX3B0ciwgcHRlX3QpOworCX0KIAogCS8qIElmIHRoaXMgcGFnZSBpc24ndCBpbiB0aGUgR3Vlc3QgcGFnZSB0YWJsZXMsIHdlIGNhbid0IHBhZ2UgaXQgaW4uICovCiAJaWYgKCEocHRlX2ZsYWdzKGdwdGUpICYgX1BBR0VfUFJFU0VOVCkpCkBAIC00NTQsNyArNDY4LDggQEAKIAkgKiBGaW5hbGx5LCB3ZSB3cml0ZSB0aGUgR3Vlc3QgUFRFIGVudHJ5IGJhY2s6IHdlJ3ZlIHNldCB0aGUKIAkgKiBfUEFHRV9BQ0NFU1NFRCBhbmQgbWF5YmUgdGhlIF9QQUdFX0RJUlRZIGZsYWdzLgogCSAqLwotCWxnd3JpdGUoY3B1LCBncHRlX3B0ciwgcHRlX3QsIGdwdGUpOworCWlmIChsaWtlbHkoIWNwdS0+bGluZWFyX3BhZ2VzKSkKKwkJbGd3cml0ZShjcHUsIGdwdGVfcHRyLCBwdGVfdCwgZ3B0ZSk7CiAKIAkvKgogCSAqIFRoZSBmYXVsdCBpcyBmaXhlZCwgdGhlIHBhZ2UgdGFibGUgaXMgcG9wdWxhdGVkLCB0aGUgbWFwcGluZwpAQCAtNjEyLDYgKzYyNywxMSBAQAogI2lmZGVmIENPTkZJR19YODZfUEFFCiAJcG1kX3QgZ3BtZDsKICNlbmRpZgorCisJLyogU3RpbGwgbm90IHNldCB1cD8gIEp1c3QgbWFwIDE6MS4gKi8KKwlpZiAodW5saWtlbHkoY3B1LT5saW5lYXJfcGFnZXMpKQorCQlyZXR1cm4gdmFkZHI7CisKIAkvKiBGaXJzdCBzdGVwOiBnZXQgdGhlIHRvcC1sZXZlbCBHdWVzdCBwYWdlIHRhYmxlIGVudHJ5LiAqLwogCWdwZ2QgPSBsZ3JlYWQoY3B1LCBncGdkX2FkZHIoY3B1LCB2YWRkciksIHBnZF90KTsKIAkvKiBUb3BsZXZlbCBub3QgcHJlc2VudD8gIFdlIGNhbid0IG1hcCBpdCBpbi4gKi8KQEAgLTcwOCwzMiArNzI4LDYgQEAKIAlyZXR1cm4gbmV4dDsKIH0KIAotLypIOjQzMAotICogKGl2KSBTd2l0Y2hpbmcgcGFnZSB0YWJsZXMKLSAqCi0gKiBOb3cgd2UndmUgc2VlbiBhbGwgdGhlIHBhZ2UgdGFibGUgc2V0dGluZyBhbmQgbWFuaXB1bGF0aW9uLCBsZXQncyBzZWUKLSAqIHdoYXQgaGFwcGVucyB3aGVuIHRoZSBHdWVzdCBjaGFuZ2VzIHBhZ2UgdGFibGVzIChpZS4gY2hhbmdlcyB0aGUgdG9wLWxldmVsCi0gKiBwZ2RpcikuICBUaGlzIG9jY3VycyBvbiBhbG1vc3QgZXZlcnkgY29udGV4dCBzd2l0Y2guCi0gKi8KLXZvaWQgZ3Vlc3RfbmV3X3BhZ2V0YWJsZShzdHJ1Y3QgbGdfY3B1ICpjcHUsIHVuc2lnbmVkIGxvbmcgcGd0YWJsZSkKLXsKLQlpbnQgbmV3cGdkaXIsIHJlcGluID0gMDsKLQotCS8qIExvb2sgdG8gc2VlIGlmIHdlIGhhdmUgdGhpcyBvbmUgYWxyZWFkeS4gKi8KLQluZXdwZ2RpciA9IGZpbmRfcGdkaXIoY3B1LT5sZywgcGd0YWJsZSk7Ci0JLyoKLQkgKiBJZiBub3QsIHdlIGFsbG9jYXRlIG9yIG11ZyBhbiBleGlzdGluZyBvbmU6IGlmIGl0J3MgYSBmcmVzaCBvbmUsCi0JICogcmVwaW4gZ2V0cyBzZXQgdG8gMS4KLQkgKi8KLQlpZiAobmV3cGdkaXIgPT0gQVJSQVlfU0laRShjcHUtPmxnLT5wZ2RpcnMpKQotCQluZXdwZ2RpciA9IG5ld19wZ2RpcihjcHUsIHBndGFibGUsICZyZXBpbik7Ci0JLyogQ2hhbmdlIHRoZSBjdXJyZW50IHBnZCBpbmRleCB0byB0aGUgbmV3IG9uZS4gKi8KLQljcHUtPmNwdV9wZ2QgPSBuZXdwZ2RpcjsKLQkvKiBJZiBpdCB3YXMgY29tcGxldGVseSBibGFuaywgd2UgbWFwIGluIHRoZSBHdWVzdCBrZXJuZWwgc3RhY2sgKi8KLQlpZiAocmVwaW4pCi0JCXBpbl9zdGFja19wYWdlcyhjcHUpOwotfQotCiAvKkg6NDcwCiAgKiBGaW5hbGx5LCBhIHJvdXRpbmUgd2hpY2ggdGhyb3dzIGF3YXkgZXZlcnl0aGluZzogYWxsIFBHRCBlbnRyaWVzIGluIGFsbAogICogdGhlIHNoYWRvdyBwYWdlIHRhYmxlcywgaW5jbHVkaW5nIHRoZSBHdWVzdCdzIGtlcm5lbCBtYXBwaW5ncy4gIFRoaXMgaXMgdXNlZApAQCAtNzgwLDYgKzc3NCw0NCBAQAogCS8qIFdlIG5lZWQgdGhlIEd1ZXN0IGtlcm5lbCBzdGFjayBtYXBwZWQgYWdhaW4uICovCiAJcGluX3N0YWNrX3BhZ2VzKGNwdSk7CiB9CisKKy8qSDo0MzAKKyAqIChpdikgU3dpdGNoaW5nIHBhZ2UgdGFibGVzCisgKgorICogTm93IHdlJ3ZlIHNlZW4gYWxsIHRoZSBwYWdlIHRhYmxlIHNldHRpbmcgYW5kIG1hbmlwdWxhdGlvbiwgbGV0J3Mgc2VlCisgKiB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgR3Vlc3QgY2hhbmdlcyBwYWdlIHRhYmxlcyAoaWUuIGNoYW5nZXMgdGhlIHRvcC1sZXZlbAorICogcGdkaXIpLiAgVGhpcyBvY2N1cnMgb24gYWxtb3N0IGV2ZXJ5IGNvbnRleHQgc3dpdGNoLgorICovCit2b2lkIGd1ZXN0X25ld19wYWdldGFibGUoc3RydWN0IGxnX2NwdSAqY3B1LCB1bnNpZ25lZCBsb25nIHBndGFibGUpCit7CisJaW50IG5ld3BnZGlyLCByZXBpbiA9IDA7CisKKwkvKgorCSAqIFRoZSB2ZXJ5IGZpcnN0IHRpbWUgdGhleSBjYWxsIHRoaXMsIHdlJ3JlIGFjdHVhbGx5IHJ1bm5pbmcgd2l0aG91dAorCSAqIGFueSBwYWdlIHRhYmxlczsgd2UndmUgYmVlbiBtYWtpbmcgaXQgdXAuICBUaHJvdyB0aGVtIGF3YXkgbm93LgorCSAqLworCWlmICh1bmxpa2VseShjcHUtPmxpbmVhcl9wYWdlcykpIHsKKwkJcmVsZWFzZV9hbGxfcGFnZXRhYmxlcyhjcHUtPmxnKTsKKwkJY3B1LT5saW5lYXJfcGFnZXMgPSBmYWxzZTsKKwkJLyogRm9yY2UgYWxsb2NhdGlvbiBvZiBhIG5ldyBwZ2Rpci4gKi8KKwkJbmV3cGdkaXIgPSBBUlJBWV9TSVpFKGNwdS0+bGctPnBnZGlycyk7CisJfSBlbHNlIHsKKwkJLyogTG9vayB0byBzZWUgaWYgd2UgaGF2ZSB0aGlzIG9uZSBhbHJlYWR5LiAqLworCQluZXdwZ2RpciA9IGZpbmRfcGdkaXIoY3B1LT5sZywgcGd0YWJsZSk7CisJfQorCisJLyoKKwkgKiBJZiBub3QsIHdlIGFsbG9jYXRlIG9yIG11ZyBhbiBleGlzdGluZyBvbmU6IGlmIGl0J3MgYSBmcmVzaCBvbmUsCisJICogcmVwaW4gZ2V0cyBzZXQgdG8gMS4KKwkgKi8KKwlpZiAobmV3cGdkaXIgPT0gQVJSQVlfU0laRShjcHUtPmxnLT5wZ2RpcnMpKQorCQluZXdwZ2RpciA9IG5ld19wZ2RpcihjcHUsIHBndGFibGUsICZyZXBpbik7CisJLyogQ2hhbmdlIHRoZSBjdXJyZW50IHBnZCBpbmRleCB0byB0aGUgbmV3IG9uZS4gKi8KKwljcHUtPmNwdV9wZ2QgPSBuZXdwZ2RpcjsKKwkvKiBJZiBpdCB3YXMgY29tcGxldGVseSBibGFuaywgd2UgbWFwIGluIHRoZSBHdWVzdCBrZXJuZWwgc3RhY2sgKi8KKwlpZiAocmVwaW4pCisJCXBpbl9zdGFja19wYWdlcyhjcHUpOworfQogLyo6Ki8KIAogLypNOjAwOQpAQCAtOTE5LDE2OCArOTUxLDI2IEBACiB9CiAjZW5kaWYKIAotLypIOjUwNQotICogVG8gZ2V0IHRocm91Z2ggYm9vdCwgd2UgY29uc3RydWN0IHNpbXBsZSBpZGVudGl0eSBwYWdlIG1hcHBpbmdzICh3aGljaAotICogc2V0IHZpcnR1YWwgPT0gcGh5c2ljYWwpIGFuZCBsaW5lYXIgbWFwcGluZ3Mgd2hpY2ggd2lsbCBnZXQgdGhlIEd1ZXN0IGZhcgotICogZW5vdWdoIGludG8gdGhlIGJvb3QgdG8gY3JlYXRlIGl0cyBvd24uICBUaGUgbGluZWFyIG1hcHBpbmcgbWVhbnMgd2UKLSAqIHNpbXBsaWZ5IHRoZSBHdWVzdCBib290LCBidXQgaXQgbWFrZXMgYXNzdW1wdGlvbnMgYWJvdXQgdGhlaXIgUEFHRV9PRkZTRVQsCi0gKiBhcyB5b3UnbGwgc2VlLgotICoKLSAqIFdlIGxheSB0aGVtIG91dCBvZiB0aGUgd2F5LCBqdXN0IGJlbG93IHRoZSBpbml0cmQgKHdoaWNoIGlzIHdoeSB3ZSBuZWVkIHRvCi0gKiBrbm93IGl0cyBzaXplIGhlcmUpLgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzZXR1cF9wYWdldGFibGVzKHN0cnVjdCBsZ3Vlc3QgKmxnLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbWVtLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5pdHJkX3NpemUpCi17Ci0JcGdkX3QgX191c2VyICpwZ2RpcjsKLQlwdGVfdCBfX3VzZXIgKmxpbmVhcjsKLQl1bnNpZ25lZCBsb25nIG1lbV9iYXNlID0gKHVuc2lnbmVkIGxvbmcpbGctPm1lbV9iYXNlOwotCXVuc2lnbmVkIGludCBtYXBwZWRfcGFnZXMsIGksIGxpbmVhcl9wYWdlczsKLSNpZmRlZiBDT05GSUdfWDg2X1BBRQotCXBtZF90IF9fdXNlciAqcG1kczsKLQl1bnNpZ25lZCBpbnQgajsKLQlwZ2RfdCBwZ2Q7Ci0JcG1kX3QgcG1kOwotI2Vsc2UKLQl1bnNpZ25lZCBpbnQgcGh5c19saW5lYXI7Ci0jZW5kaWYKLQotCS8qCi0JICogV2UgaGF2ZSBtYXBwZWRfcGFnZXMgZnJhbWVzIHRvIG1hcCwgc28gd2UgbmVlZCBsaW5lYXJfcGFnZXMgcGFnZQotCSAqIHRhYmxlcyB0byBtYXAgdGhlbS4KLQkgKi8KLQltYXBwZWRfcGFnZXMgPSBtZW0gLyBQQUdFX1NJWkU7Ci0JbGluZWFyX3BhZ2VzID0gKG1hcHBlZF9wYWdlcyArIFBUUlNfUEVSX1BURSAtIDEpIC8gUFRSU19QRVJfUFRFOwotCi0JLyogV2UgcHV0IHRoZSB0b3BsZXZlbCBwYWdlIGRpcmVjdG9yeSBwYWdlIGF0IHRoZSB0b3Agb2YgbWVtb3J5LiAqLwotCXBnZGlyID0gKHBnZF90ICopKG1lbSArIG1lbV9iYXNlIC0gaW5pdHJkX3NpemUgLSBQQUdFX1NJWkUpOwotCi0JLyogTm93IHdlIHVzZSB0aGUgbmV4dCBsaW5lYXJfcGFnZXMgcGFnZXMgYXMgcHRlIHBhZ2VzICovCi0JbGluZWFyID0gKHZvaWQgKilwZ2RpciAtIGxpbmVhcl9wYWdlcyAqIFBBR0VfU0laRTsKLQotI2lmZGVmIENPTkZJR19YODZfUEFFCi0JLyoKLQkgKiBBbmQgdGhlIHNpbmdsZSBtaWQgcGFnZSBnb2VzIGJlbG93IHRoYXQuICBXZSBvbmx5IHVzZSBvbmUsIGJ1dAotCSAqIHRoYXQncyBlbm91Z2ggdG8gbWFwIDFHLCB3aGljaCBkZWZpbml0ZWx5IGdldHMgdXMgdGhyb3VnaCBib290LgotCSAqLwotCXBtZHMgPSAodm9pZCAqKWxpbmVhciAtIFBBR0VfU0laRTsKLSNlbmRpZgotCS8qCi0JICogTGluZWFyIG1hcHBpbmcgaXMgZWFzeTogcHV0IGV2ZXJ5IHBhZ2UncyBhZGRyZXNzIGludG8gdGhlCi0JICogbWFwcGluZyBpbiBvcmRlci4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbWFwcGVkX3BhZ2VzOyBpKyspIHsKLQkJcHRlX3QgcHRlOwotCQlwdGUgPSBwZm5fcHRlKGksIF9fcGdwcm90KF9QQUdFX1BSRVNFTlR8X1BBR0VfUld8X1BBR0VfVVNFUikpOwotCQlpZiAoY29weV90b191c2VyKCZsaW5lYXJbaV0sICZwdGUsIHNpemVvZihwdGUpKSAhPSAwKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1g4Nl9QQUUKLQkvKgotCSAqIE1ha2UgdGhlIEd1ZXN0IFBNRCBlbnRyaWVzIHBvaW50IHRvIHRoZSBjb3JyZXNwb25kaW5nIHBsYWNlIGluIHRoZQotCSAqIGxpbmVhciBtYXBwaW5nICh1cCB0byBvbmUgcGFnZSB3b3J0aCBvZiBQTUQpLgotCSAqLwotCWZvciAoaSA9IGogPSAwOyBpIDwgbWFwcGVkX3BhZ2VzICYmIGogPCBQVFJTX1BFUl9QTUQ7Ci0JICAgICBpICs9IFBUUlNfUEVSX1BURSwgaisrKSB7Ci0JCXBtZCA9IHBmbl9wbWQoKCh1bnNpZ25lZCBsb25nKSZsaW5lYXJbaV0gLSBtZW1fYmFzZSkvUEFHRV9TSVpFLAotCQkJICAgICAgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwgX1BBR0VfVVNFUikpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoJnBtZHNbal0sICZwbWQsIHNpemVvZihwbWQpKSAhPSAwKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JLyogT25lIFBHRCBlbnRyeSwgcG9pbnRpbmcgdG8gdGhhdCBQTUQgcGFnZS4gKi8KLQlwZ2QgPSBfX3BnZCgoKHVuc2lnbmVkIGxvbmcpcG1kcyAtIG1lbV9iYXNlKSB8IF9QQUdFX1BSRVNFTlQpOwotCS8qIENvcHkgaXQgaW4gYXMgdGhlIGZpcnN0IFBHRCBlbnRyeSAoaWUuIGFkZHJlc3NlcyAwLTFHKS4gKi8KLQlpZiAoY29weV90b191c2VyKCZwZ2RpclswXSwgJnBnZCwgc2l6ZW9mKHBnZCkpICE9IDApCi0JCXJldHVybiAtRUZBVUxUOwotCS8qCi0JICogQW5kIHRoZSBvdGhlciBQR0QgZW50cnkgdG8gbWFrZSB0aGUgbGluZWFyIG1hcHBpbmcgYXQgUEFHRV9PRkZTRVQKLQkgKi8KLQlpZiAoY29weV90b191c2VyKCZwZ2RpcltLRVJORUxfUEdEX0JPVU5EQVJZXSwgJnBnZCwgc2l6ZW9mKHBnZCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLSNlbHNlCi0JLyoKLQkgKiBUaGUgdG9wIGxldmVsIHBvaW50cyB0byB0aGUgbGluZWFyIHBhZ2UgdGFibGUgcGFnZXMgYWJvdmUuCi0JICogV2Ugc2V0dXAgdGhlIGlkZW50aXR5IGFuZCBsaW5lYXIgbWFwcGluZ3MgaGVyZS4KLQkgKi8KLQlwaHlzX2xpbmVhciA9ICh1bnNpZ25lZCBsb25nKWxpbmVhciAtIG1lbV9iYXNlOwotCWZvciAoaSA9IDA7IGkgPCBtYXBwZWRfcGFnZXM7IGkgKz0gUFRSU19QRVJfUFRFKSB7Ci0JCXBnZF90IHBnZDsKLQkJLyoKLQkJICogQ3JlYXRlIGEgUEdEIGVudHJ5IHdoaWNoIHBvaW50cyB0byB0aGUgcmlnaHQgcGFydCBvZiB0aGUKLQkJICogbGluZWFyIFBURSBwYWdlcy4KLQkJICovCi0JCXBnZCA9IF9fcGdkKChwaHlzX2xpbmVhciArIGkgKiBzaXplb2YocHRlX3QpKSB8Ci0JCQkgICAgKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVyB8IF9QQUdFX1VTRVIpKTsKLQotCQkvKgotCQkgKiBDb3B5IGl0IGludG8gdGhlIFBHRCBwYWdlIGF0IDAgYW5kIFBBR0VfT0ZGU0VULgotCQkgKi8KLQkJaWYgKGNvcHlfdG9fdXNlcigmcGdkaXJbaSAvIFBUUlNfUEVSX1BURV0sICZwZ2QsIHNpemVvZihwZ2QpKQotCQkgICAgfHwgY29weV90b191c2VyKCZwZ2RpcltwZ2RfaW5kZXgoUEFHRV9PRkZTRVQpCi0JCQkJCSAgICsgaSAvIFBUUlNfUEVSX1BURV0sCi0JCQkJICAgICZwZ2QsIHNpemVvZihwZ2QpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLSNlbmRpZgotCi0JLyoKLQkgKiBXZSByZXR1cm4gdGhlIHRvcCBsZXZlbCAoZ3Vlc3QtcGh5c2ljYWwpIGFkZHJlc3M6IHdlIHJlbWVtYmVyIHdoZXJlCi0JICogdGhpcyBpcyB0byB3cml0ZSBpdCBpbnRvIGxndWVzdF9kYXRhIHdoZW4gdGhlIEd1ZXN0IGluaXRpYWxpemVzLgotCSAqLwotCXJldHVybiAodW5zaWduZWQgbG9uZylwZ2RpciAtIG1lbV9iYXNlOwotfQotCiAvKkg6NTAwCiAgKiAodmlpKSBTZXR0aW5nIHVwIHRoZSBwYWdlIHRhYmxlcyBpbml0aWFsbHkuCiAgKgotICogV2hlbiBhIEd1ZXN0IGlzIGZpcnN0IGNyZWF0ZWQsIHRoZSBMYXVuY2hlciB0ZWxscyB1cyB3aGVyZSB0aGUgdG9wbGV2ZWwgb2YKLSAqIGl0cyBmaXJzdCBwYWdlIHRhYmxlIGlzLiAgV2Ugc2V0IHNvbWUgdGhpbmdzIHVwIGhlcmU6CisgKiBXaGVuIGEgR3Vlc3QgaXMgZmlyc3QgY3JlYXRlZCwgc2V0IGluaXRpYWxpemUgYSBzaGFkb3cgcGFnZSB0YWJsZSB3aGljaAorICogd2Ugd2lsbCBwb3B1bGF0ZSBvbiBmdXR1cmUgZmF1bHRzLiAgVGhlIEd1ZXN0IGRvZXNuJ3QgaGF2ZSBhbnkgYWN0dWFsCisgKiBwYWdldGFibGVzIHlldCwgc28gd2Ugc2V0IGxpbmVhcl9wYWdlcyB0byB0ZWxsIGRlbWFuZF9wYWdlKCkgdG8gZmFrZSBpdAorICogZm9yIHRoZSBtb21lbnQuCiAgKi8KIGludCBpbml0X2d1ZXN0X3BhZ2V0YWJsZShzdHJ1Y3QgbGd1ZXN0ICpsZykKIHsKLQl1NjQgbWVtOwotCXUzMiBpbml0cmRfc2l6ZTsKLQlzdHJ1Y3QgYm9vdF9wYXJhbXMgX191c2VyICpib290ID0gKHN0cnVjdCBib290X3BhcmFtcyAqKWxnLT5tZW1fYmFzZTsKLSNpZmRlZiBDT05GSUdfWDg2X1BBRQotCXBnZF90ICpwZ2Q7Ci0JcG1kX3QgKnBtZF90YWJsZTsKLSNlbmRpZgotCS8qCi0JICogR2V0IHRoZSBHdWVzdCBtZW1vcnkgc2l6ZSBhbmQgdGhlIHJhbWRpc2sgc2l6ZSBmcm9tIHRoZSBib290IGhlYWRlcgotCSAqIGxvY2F0ZWQgYXQgbGctPm1lbV9iYXNlIChHdWVzdCBhZGRyZXNzIDApLgotCSAqLwotCWlmIChjb3B5X2Zyb21fdXNlcigmbWVtLCAmYm9vdC0+ZTgyMF9tYXBbMF0uc2l6ZSwgc2l6ZW9mKG1lbSkpCi0JICAgIHx8IGdldF91c2VyKGluaXRyZF9zaXplLCAmYm9vdC0+aGRyLnJhbWRpc2tfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOworCXN0cnVjdCBsZ19jcHUgKmNwdSA9ICZsZy0+Y3B1c1swXTsKKwlpbnQgYWxsb2NhdGVkID0gMDsKIAotCS8qCi0JICogV2Ugc3RhcnQgb24gdGhlIGZpcnN0IHNoYWRvdyBwYWdlIHRhYmxlLCBhbmQgZ2l2ZSBpdCBhIGJsYW5rIFBHRAotCSAqIHBhZ2UuCi0JICovCi0JbGctPnBnZGlyc1swXS5ncGdkaXIgPSBzZXR1cF9wYWdldGFibGVzKGxnLCBtZW0sIGluaXRyZF9zaXplKTsKLQlpZiAoSVNfRVJSX1ZBTFVFKGxnLT5wZ2RpcnNbMF0uZ3BnZGlyKSkKLQkJcmV0dXJuIGxnLT5wZ2RpcnNbMF0uZ3BnZGlyOwotCWxnLT5wZ2RpcnNbMF0ucGdkaXIgPSAocGdkX3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFsZy0+cGdkaXJzWzBdLnBnZGlyKQorCS8qIGxnIChhbmQgbGctPmNwdXNbXSkgc3RhcnRzIHplcm9lZDogdGhpcyBhbGxvY2F0ZXMgYSBuZXcgcGdkaXIgKi8KKwljcHUtPmNwdV9wZ2QgPSBuZXdfcGdkaXIoY3B1LCAwLCAmYWxsb2NhdGVkKTsKKwlpZiAoIWFsbG9jYXRlZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLSNpZmRlZiBDT05GSUdfWDg2X1BBRQotCS8qIEZvciBQQUUsIHdlIGFsc28gY3JlYXRlIHRoZSBpbml0aWFsIG1pZC1sZXZlbC4gKi8KLQlwZ2QgPSBsZy0+cGdkaXJzWzBdLnBnZGlyOwotCXBtZF90YWJsZSA9IChwbWRfdCAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbWRfdGFibGUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc2V0X3BnZChwZ2QgKyBTV0lUQ0hFUl9QR0RfSU5ERVgsCi0JCV9fcGdkKF9fcGEocG1kX3RhYmxlKSB8IF9QQUdFX1BSRVNFTlQpKTsKLSNlbmRpZgotCi0JLyogVGhpcyBpcyB0aGUgY3VycmVudCBwYWdlIHRhYmxlLiAqLwotCWxnLT5jcHVzWzBdLmNwdV9wZ2QgPSAwOworCS8qIFdlIHN0YXJ0IHdpdGggYSBsaW5lYXIgbWFwcGluZyB1bnRpbCB0aGUgaW5pdGlhbGl6ZS4gKi8KKwljcHUtPmxpbmVhcl9wYWdlcyA9IHRydWU7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwOTUsMTAgKzk4NSwxMCBAQAogCQkgKiBvZiB2aXJ0dWFsIGFkZHJlc3NlcyB1c2VkIGJ5IHRoZSBTd2l0Y2hlci4KIAkJICovCiAJCXx8IHB1dF91c2VyKFJFU0VSVkVfTUVNICogMTAyNCAqIDEwMjQsCi0JCQkmY3B1LT5sZy0+bGd1ZXN0X2RhdGEtPnJlc2VydmVfbWVtKQotCQl8fCBwdXRfdXNlcihjcHUtPmxnLT5wZ2RpcnNbMF0uZ3BnZGlyLAotCQkJJmNwdS0+bGctPmxndWVzdF9kYXRhLT5wZ2RpcikpCisJCQkgICAgJmNwdS0+bGctPmxndWVzdF9kYXRhLT5yZXNlcnZlX21lbSkpIHsKIAkJa2lsbF9ndWVzdChjcHUsICJiYWQgZ3Vlc3QgcGFnZSAlcCIsIGNwdS0+bGctPmxndWVzdF9kYXRhKTsKKwkJcmV0dXJuOworCX0KIAogCS8qCiAJICogSW4gZmx1c2hfdXNlcl9tYXBwaW5ncygpIHdlIGxvb3AgZnJvbSAwIHRvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC94ODYvY29yZS5jIGIvZHJpdmVycy9sZ3Vlc3QveDg2L2NvcmUuYwppbmRleCA5ZjE2NTljLi42NWFmNDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC94ODYvY29yZS5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L3g4Ni9jb3JlLmMKQEAgLTI2OSwxMCArMjY5LDEwIEBACiBzdGF0aWMgaW50IGVtdWxhdGVfaW5zbihzdHJ1Y3QgbGdfY3B1ICpjcHUpCiB7CiAJdTggaW5zbjsKLQl1bnNpZ25lZCBpbnQgaW5zbmxlbiA9IDAsIGluID0gMCwgc2hpZnQgPSAwOworCXVuc2lnbmVkIGludCBpbnNubGVuID0gMCwgaW4gPSAwLCBzbWFsbF9vcGVyYW5kID0gMDsKIAkvKgogCSAqIFRoZSBlaXAgY29udGFpbnMgdGhlICp2aXJ0dWFsKiBhZGRyZXNzIG9mIHRoZSBHdWVzdCdzIGluc3RydWN0aW9uOgotCSAqIGd1ZXN0X3BhIGp1c3Qgc3VidHJhY3RzIHRoZSBHdWVzdCdzIHBhZ2Vfb2Zmc2V0LgorCSAqIHdhbGsgdGhlIEd1ZXN0J3MgcGFnZSB0YWJsZXMgdG8gZmluZCB0aGUgInBoeXNpY2FsIiBhZGRyZXNzLgogCSAqLwogCXVuc2lnbmVkIGxvbmcgcGh5c2FkZHIgPSBndWVzdF9wYShjcHUsIGNwdS0+cmVncy0+ZWlwKTsKIApAQCAtMzAwLDExICszMDAsMTAgQEAKIAl9CiAKIAkvKgotCSAqIDB4NjYgaXMgYW4gIm9wZXJhbmQgcHJlZml4Ii4gIEl0IG1lYW5zIGl0J3MgdXNpbmcgdGhlIHVwcGVyIDE2IGJpdHMKLQkgKiBvZiB0aGUgZWF4IHJlZ2lzdGVyLgorCSAqIDB4NjYgaXMgYW4gIm9wZXJhbmQgcHJlZml4Ii4gIEl0IG1lYW5zIGEgMTYsIG5vdCAzMiBiaXQgaW4vb3V0LgogCSAqLwogCWlmIChpbnNuID09IDB4NjYpIHsKLQkJc2hpZnQgPSAxNjsKKwkJc21hbGxfb3BlcmFuZCA9IDE7CiAJCS8qIFRoZSBpbnN0cnVjdGlvbiBpcyAxIGJ5dGUgc28gZmFyLCByZWFkIHRoZSBuZXh0IGJ5dGUuICovCiAJCWluc25sZW4gPSAxOwogCQlpbnNuID0gbGdyZWFkKGNwdSwgcGh5c2FkZHIgKyBpbnNubGVuLCB1OCk7CkBAIC0zNDAsMTEgKzMzOSwxNCBAQAogCSAqIHRyYWRpdGlvbmFsbHkgbWVhbnMgInRoZXJlJ3Mgbm90aGluZyB0aGVyZSIuCiAJICovCiAJaWYgKGluKSB7Ci0JCS8qIExvd2VyIGJpdCB0ZWxscyBpcyB3aGV0aGVyIGl0J3MgYSAxNiBvciAzMiBiaXQgYWNjZXNzICovCi0JCWlmIChpbnNuICYgMHgxKQotCQkJY3B1LT5yZWdzLT5lYXggPSAweEZGRkZGRkZGOwotCQllbHNlCi0JCQljcHUtPnJlZ3MtPmVheCB8PSAoMHhGRkZGIDw8IHNoaWZ0KTsKKwkJLyogTG93ZXIgYml0IHRlbGxzIG1lYW5zIGl0J3MgYSAzMi8xNiBiaXQgYWNjZXNzICovCisJCWlmIChpbnNuICYgMHgxKSB7CisJCQlpZiAoc21hbGxfb3BlcmFuZCkKKwkJCQljcHUtPnJlZ3MtPmVheCB8PSAweEZGRkY7CisJCQllbHNlCisJCQkJY3B1LT5yZWdzLT5lYXggPSAweEZGRkZGRkZGOworCQl9IGVsc2UKKwkJCWNwdS0+cmVncy0+ZWF4IHw9IDB4RkY7CiAJfQogCS8qIEZpbmFsbHksIHdlJ3ZlICJkb25lIiB0aGUgaW5zdHJ1Y3Rpb24sIHNvIG1vdmUgcGFzdCBpdC4gKi8KIAljcHUtPnJlZ3MtPmVpcCArPSBpbnNubGVuOwpAQCAtMzUyLDY5ICszNTQsNiBAQAogCXJldHVybiAxOwogfQogCi0vKgotICogT3VyIGh5cGVyY2FsbHMgbWVjaGFuaXNtIHVzZWQgdG8gYmUgYmFzZWQgb24gZGlyZWN0IHNvZnR3YXJlIGludGVycnVwdHMuCi0gKiBBZnRlciBBbnRob255J3MgIlJlZmFjdG9yIGh5cGVyY2FsbCBpbmZyYXN0cnVjdHVyZSIga3ZtIHBhdGNoLCB3ZSBkZWNpZGVkIHRvCi0gKiBjaGFuZ2Ugb3ZlciB0byB1c2luZyBrdm0gaHlwZXJjYWxscy4KLSAqCi0gKiBLVk1fSFlQRVJDQUxMIGlzIGFjdHVhbGx5IGEgInZtY2FsbCIgaW5zdHJ1Y3Rpb24sIHdoaWNoIGdlbmVyYXRlcyBhbiBpbnZhbGlkCi0gKiBvcGNvZGUgZmF1bHQgKGZhdWx0IDYpIG9uIG5vbi1WVCBjcHVzLCBzbyB0aGUgZWFzaWVzdCBzb2x1dGlvbiBzZWVtZWQgdG8gYmUKLSAqIGFuICplbXVsYXRpb24gYXBwcm9hY2gqOiBpZiB0aGUgZmF1bHQgd2FzIHJlYWxseSBwcm9kdWNlZCBieSBhbiBoeXBlcmNhbGwKLSAqIChpc19oeXBlcmNhbGwoKSBkb2VzIGV4YWN0bHkgdGhpcyBjaGVjayksIHdlIGNhbiBqdXN0IGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIGh5cGVyY2FsbCBob3N0IGltcGxlbWVudGF0aW9uIGZ1bmN0aW9uLgotICoKLSAqIEJ1dCB0aGVzZSBpbnZhbGlkIG9wY29kZSBmYXVsdHMgYXJlIG5vdGFibHkgc2xvd2VyIHRoYW4gc29mdHdhcmUgaW50ZXJydXB0cy4KLSAqIFNvIHdlIGltcGxlbWVudGVkIHRoZSAqcGF0Y2hpbmcgKG9yIHJld3JpdGluZykgYXBwcm9hY2gqOiBldmVyeSB0aW1lIHdlIGhpdAotICogdGhlIEtWTV9IWVBFUkNBTEwgb3Bjb2RlIGluIEd1ZXN0IGNvZGUsIHdlIHBhdGNoIGl0IHRvIHRoZSBvbGQgImludCAweDFmIgotICogb3Bjb2RlLCBzbyBuZXh0IHRpbWUgdGhlIEd1ZXN0IGNhbGxzIHRoaXMgaHlwZXJjYWxsIGl0IHdpbGwgdXNlIHRoZQotICogZmFzdGVyIHRyYXAgbWVjaGFuaXNtLgotICoKLSAqIE1hdGlhcyBldmVuIGJlbmNobWFya2VkIGl0IHRvIGNvbnZpbmNlIHlvdTogdGhpcyBzaG93cyB0aGUgYXZlcmFnZSBjeWNsZQotICogY29zdCBvZiBhIGh5cGVyY2FsbC4gIEZvciBlYWNoIGFsdGVybmF0aXZlIHNvbHV0aW9uIG1lbnRpb25lZCBhYm92ZSB3ZSd2ZQotICogbWFkZSA1IHJ1bnMgb2YgdGhlIGJlbmNobWFyazoKLSAqCi0gKiAxKSBkaXJlY3Qgc29mdHdhcmUgaW50ZXJydXB0OiAyOTE1LCAyNzg5LCAyNzY0LCAyNzIxLCAyODk4Ci0gKiAyKSBlbXVsYXRpb24gdGVjaG5pcXVlOiAzNDEwLCAzNjgxLCAzNDY2LCAzMzkyLCAzNzgwCi0gKiAzKSBwYXRjaGluZyAocmV3cml0ZSkgdGVjaG5pcXVlOiAyOTc3LCAyOTc1LCAyODkxLCAyNjM3LCAyODg0Ci0gKgotICogT25lIHR3by1saW5lIGZ1bmN0aW9uIGlzIHdvcnRoIGEgMjAlIGh5cGVyY2FsbCBzcGVlZCBib29zdCEKLSAqLwotc3RhdGljIHZvaWQgcmV3cml0ZV9oeXBlcmNhbGwoc3RydWN0IGxnX2NwdSAqY3B1KQotewotCS8qCi0JICogVGhpcyBhcmUgdGhlIG9wY29kZXMgd2UgdXNlIHRvIHBhdGNoIHRoZSBHdWVzdC4gIFRoZSBvcGNvZGUgZm9yICJpbnQKLQkgKiAkMHgxZiIgaXMgIjB4Y2QgMHgxZiIgYnV0IHZtY2FsbCBpbnN0cnVjdGlvbiBpcyAzIGJ5dGVzIGxvbmcsIHNvIHdlCi0JICogY29tcGxldGUgdGhlIHNlcXVlbmNlIHdpdGggYSBOT1AgKDB4OTApLgotCSAqLwotCXU4IGluc25bM10gPSB7MHhjZCwgMHgxZiwgMHg5MH07Ci0KLQlfX2xnd3JpdGUoY3B1LCBndWVzdF9wYShjcHUsIGNwdS0+cmVncy0+ZWlwKSwgaW5zbiwgc2l6ZW9mKGluc24pKTsKLQkvKgotCSAqIFRoZSBhYm92ZSB3cml0ZSBtaWdodCBoYXZlIGNhdXNlZCBhIGNvcHkgb2YgdGhhdCBwYWdlIHRvIGJlIG1hZGUKLQkgKiAoaWYgaXQgd2FzIHJlYWQtb25seSkuICBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgR3Vlc3QgaGFzCi0JICogdXAtdG8tZGF0ZSBwYWdldGFibGVzLiAgQXMgdGhpcyBkb2Vzbid0IGhhcHBlbiBvZnRlbiwgd2UgY2FuIGp1c3QKLQkgKiBkcm9wIHRoZW0gYWxsLgotCSAqLwotCWd1ZXN0X3BhZ2V0YWJsZV9jbGVhcl9hbGwoY3B1KTsKLX0KLQotc3RhdGljIGJvb2wgaXNfaHlwZXJjYWxsKHN0cnVjdCBsZ19jcHUgKmNwdSkKLXsKLQl1OCBpbnNuWzNdOwotCi0JLyoKLQkgKiBUaGlzIG11c3QgYmUgdGhlIEd1ZXN0IGtlcm5lbCB0cnlpbmcgdG8gZG8gc29tZXRoaW5nLgotCSAqIFRoZSBib3R0b20gdHdvIGJpdHMgb2YgdGhlIENTIHNlZ21lbnQgcmVnaXN0ZXIgYXJlIHRoZSBwcml2aWxlZ2UKLQkgKiBsZXZlbC4KLQkgKi8KLQlpZiAoKGNwdS0+cmVncy0+Y3MgJiAzKSAhPSBHVUVTVF9QTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyogSXMgaXQgYSB2bWNhbGw/ICovCi0JX19sZ3JlYWQoY3B1LCBpbnNuLCBndWVzdF9wYShjcHUsIGNwdS0+cmVncy0+ZWlwKSwgc2l6ZW9mKGluc24pKTsKLQlyZXR1cm4gaW5zblswXSA9PSAweDBmICYmIGluc25bMV0gPT0gMHgwMSAmJiBpbnNuWzJdID09IDB4YzE7Ci19Ci0KIC8qSDowNTAgT25jZSB3ZSd2ZSByZS1lbmFibGVkIGludGVycnVwdHMsIHdlIGxvb2sgYXQgd2h5IHRoZSBHdWVzdCBleGl0ZWQuICovCiB2b2lkIGxndWVzdF9hcmNoX2hhbmRsZV90cmFwKHN0cnVjdCBsZ19jcHUgKmNwdSkKIHsKQEAgLTQyOSwyMCArMzY4LDYgQEAKIAkJCWlmIChlbXVsYXRlX2luc24oY3B1KSkKIAkJCQlyZXR1cm47CiAJCX0KLQkJLyoKLQkJICogSWYgS1ZNIGlzIGFjdGl2ZSwgdGhlIHZtY2FsbCBpbnN0cnVjdGlvbiB0cmlnZ2VycyBhIEdlbmVyYWwKLQkJICogUHJvdGVjdGlvbiBGYXVsdC4gIE5vcm1hbGx5IGl0IHRyaWdnZXJzIGFuIGludmFsaWQgb3Bjb2RlCi0JCSAqIGZhdWx0ICg2KToKLQkJICovCi0JY2FzZSA2OgotCQkvKgotCQkgKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHJpbmcgPT0gR1VFU1RfUEwgYW5kIGZhdWx0aW5nCi0JCSAqIGluc3RydWN0aW9uID09IHZtY2FsbC4KLQkJICovCi0JCWlmIChpc19oeXBlcmNhbGwoY3B1KSkgewotCQkJcmV3cml0ZV9oeXBlcmNhbGwoY3B1KTsKLQkJCXJldHVybjsKLQkJfQogCQlicmVhazsKIAljYXNlIDE0OiAvKiBXZSd2ZSBpbnRlcmNlcHRlZCBhIFBhZ2UgRmF1bHQuICovCiAJCS8qCkBAIC00ODYsNyArNDExLDcgQEAKIAkJICogVGhlc2UgdmFsdWVzIG1lYW4gYSByZWFsIGludGVycnVwdCBvY2N1cnJlZCwgaW4gd2hpY2ggY2FzZQogCQkgKiB0aGUgSG9zdCBoYW5kbGVyIGhhcyBhbHJlYWR5IGJlZW4gcnVuLiBXZSBqdXN0IGRvIGEKIAkJICogZnJpZW5kbHkgY2hlY2sgaWYgYW5vdGhlciBwcm9jZXNzIHNob3VsZCBub3cgYmUgcnVuLCB0aGVuCi0JCSAqIHJldHVybiB0byBydW4gdGhlIEd1ZXN0IGFnYWluCisJCSAqIHJldHVybiB0byBydW4gdGhlIEd1ZXN0IGFnYWluLgogCQkgKi8KIAkJY29uZF9yZXNjaGVkKCk7CiAJCXJldHVybjsKQEAgLTUzNiw3ICs0NjEsNyBAQAogCWludCBpOwogCiAJLyoKLQkgKiBNb3N0IG9mIHRoZSBpMzg2L3N3aXRjaGVyLlMgZG9lc24ndCBjYXJlIHRoYXQgaXQncyBiZWVuIG1vdmVkOyBvbgorCSAqIE1vc3Qgb2YgdGhlIHg4Ni9zd2l0Y2hlcl8zMi5TIGRvZXNuJ3QgY2FyZSB0aGF0IGl0J3MgYmVlbiBtb3ZlZDsgb24KIAkgKiBJbnRlbCwganVtcHMgYXJlIHJlbGF0aXZlLCBhbmQgaXQgZG9lc24ndCBhY2Nlc3MgYW55IHJlZmVyZW5jZXMgdG8KIAkgKiBleHRlcm5hbCBjb2RlIG9yIGRhdGEuCiAJICoKQEAgLTY2NCw3ICs1ODksNyBAQAogCQljbGVhcl9jcHVfY2FwKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9QR0UpOwogCX0KIAlwdXRfb25saW5lX2NwdXMoKTsKLX07Cit9CiAvKjoqLwogCiB2b2lkIF9fZXhpdCBsZ3Vlc3RfYXJjaF9ob3N0X2Zpbmkodm9pZCkKQEAgLTc0Nyw4ICs2NzIsNiBAQAogLyo6Ki8KIAogLypMOjAzMAotICogbGd1ZXN0X2FyY2hfc2V0dXBfcmVncygpCi0gKgogICogTW9zdCBvZiB0aGUgR3Vlc3QncyByZWdpc3RlcnMgYXJlIGxlZnQgYWxvbmU6IHdlIHVzZWQgZ2V0X3plcm9lZF9wYWdlKCkgdG8KICAqIGFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUsIHNvIHRoZXkgd2lsbCBiZSAwLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9udnJhbS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbnZyYW0uYwppbmRleCBhMjcxYzgyLi5mMGUwM2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9udnJhbS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL252cmFtLmMKQEAgLTIxLDEyICsyMSwxNiBAQAogc3RhdGljIGxvZmZfdCBudnJhbV9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCiB7CiAJc3dpdGNoIChvcmlnaW4pIHsKKwljYXNlIDA6CisJCWJyZWFrOwogCWNhc2UgMToKIAkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOwogCQlicmVhazsKIAljYXNlIDI6CiAJCW9mZnNldCArPSBOVlJBTV9TSVpFOwogCQlicmVhazsKKwlkZWZhdWx0OgorCQlvZmZzZXQgPSAtMTsKIAl9CiAJaWYgKG9mZnNldCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggNzBiZDczOC4uNTc0YjA5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC01MzQsNiArNTM0LDgyIEBACiAJa3VubWFwX2F0b21pYyhzYiwgS01fVVNFUjApOwogfQogCisvKgorICogYml0bWFwX25ld19kaXNrX3NiCisgKiBAYml0bWFwCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzb21ld2hhdCB0aGUgcmV2ZXJzZSBvZiBiaXRtYXBfcmVhZF9zYi4gIGJpdG1hcF9yZWFkX3NiCisgKiByZWFkcyBhbmQgdmVyaWZpZXMgdGhlIG9uLWRpc2sgYml0bWFwIHN1cGVyYmxvY2sgYW5kIHBvcHVsYXRlcyBiaXRtYXBfaW5mby4KKyAqIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgJ2JpdG1hcF9pbmZvJyBhbmQgcG9wdWxhdGVzIHRoZSBvbi1kaXNrIGJpdG1hcAorICogc3RydWN0dXJlLCB3aGljaCBpcyB0byBiZSB3cml0dGVuIHRvIGRpc2suCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRXh4eCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IGJpdG1hcF9uZXdfZGlza19zYihzdHJ1Y3QgYml0bWFwICpiaXRtYXApCit7CisJYml0bWFwX3N1cGVyX3QgKnNiOworCXVuc2lnbmVkIGxvbmcgY2h1bmtzaXplLCBkYWVtb25fc2xlZXAsIHdyaXRlX2JlaGluZDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWJpdG1hcC0+c2JfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihiaXRtYXAtPnNiX3BhZ2UpKSB7CisJCWVyciA9IFBUUl9FUlIoYml0bWFwLT5zYl9wYWdlKTsKKwkJYml0bWFwLT5zYl9wYWdlID0gTlVMTDsKKwkJcmV0dXJuIGVycjsKKwl9CisJYml0bWFwLT5zYl9wYWdlLT5pbmRleCA9IDA7CisKKwlzYiA9IGttYXBfYXRvbWljKGJpdG1hcC0+c2JfcGFnZSwgS01fVVNFUjApOworCisJc2ItPm1hZ2ljID0gY3B1X3RvX2xlMzIoQklUTUFQX01BR0lDKTsKKwlzYi0+dmVyc2lvbiA9IGNwdV90b19sZTMyKEJJVE1BUF9NQUpPUl9ISSk7CisKKwljaHVua3NpemUgPSBiaXRtYXAtPm1kZGV2LT5iaXRtYXBfaW5mby5jaHVua3NpemU7CisJQlVHX09OKCFjaHVua3NpemUpOworCWlmICghaXNfcG93ZXJfb2ZfMihjaHVua3NpemUpKSB7CisJCWt1bm1hcF9hdG9taWMoc2IsIEtNX1VTRVIwKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJiaXRtYXAgY2h1bmtzaXplIG5vdCBhIHBvd2VyIG9mIDJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2ItPmNodW5rc2l6ZSA9IGNwdV90b19sZTMyKGNodW5rc2l6ZSk7CisKKwlkYWVtb25fc2xlZXAgPSBiaXRtYXAtPm1kZGV2LT5iaXRtYXBfaW5mby5kYWVtb25fc2xlZXA7CisJaWYgKCFkYWVtb25fc2xlZXAgfHwKKwkgICAgKGRhZW1vbl9zbGVlcCA8IDEpIHx8IChkYWVtb25fc2xlZXAgPiBNQVhfU0NIRURVTEVfVElNRU9VVCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ2hvb3NpbmcgZGFlbW9uX3NsZWVwIGRlZmF1bHQgKDUgc2VjKVxuIik7CisJCWRhZW1vbl9zbGVlcCA9IDUgKiBIWjsKKwl9CisJc2ItPmRhZW1vbl9zbGVlcCA9IGNwdV90b19sZTMyKGRhZW1vbl9zbGVlcCk7CisJYml0bWFwLT5tZGRldi0+Yml0bWFwX2luZm8uZGFlbW9uX3NsZWVwID0gZGFlbW9uX3NsZWVwOworCisJLyoKKwkgKiBGSVhNRTogd3JpdGVfYmVoaW5kIGZvciBSQUlEMS4gIElmIG5vdCBzcGVjaWZpZWQsIHdoYXQKKwkgKiBpcyBhIGdvb2QgY2hvaWNlPyAgV2UgY2hvb3NlIENPVU5URVJfTUFYIC8gMiBhcmJpdHJhcmlseS4KKwkgKi8KKwl3cml0ZV9iZWhpbmQgPSBiaXRtYXAtPm1kZGV2LT5iaXRtYXBfaW5mby5tYXhfd3JpdGVfYmVoaW5kOworCWlmICh3cml0ZV9iZWhpbmQgPiBDT1VOVEVSX01BWCkKKwkJd3JpdGVfYmVoaW5kID0gQ09VTlRFUl9NQVggLyAyOworCXNiLT53cml0ZV9iZWhpbmQgPSBjcHVfdG9fbGUzMih3cml0ZV9iZWhpbmQpOworCWJpdG1hcC0+bWRkZXYtPmJpdG1hcF9pbmZvLm1heF93cml0ZV9iZWhpbmQgPSB3cml0ZV9iZWhpbmQ7CisKKwkvKiBrZWVwIHRoZSBhcnJheSBzaXplIGZpZWxkIG9mIHRoZSBiaXRtYXAgc3VwZXJibG9jayB1cCB0byBkYXRlICovCisJc2ItPnN5bmNfc2l6ZSA9IGNwdV90b19sZTY0KGJpdG1hcC0+bWRkZXYtPnJlc3luY19tYXhfc2VjdG9ycyk7CisKKwltZW1jcHkoc2ItPnV1aWQsIGJpdG1hcC0+bWRkZXYtPnV1aWQsIDE2KTsKKworCWJpdG1hcC0+ZmxhZ3MgfD0gQklUTUFQX1NUQUxFOworCXNiLT5zdGF0ZSB8PSBjcHVfdG9fbGUzMihCSVRNQVBfU1RBTEUpOworCWJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQgPSBiaXRtYXAtPm1kZGV2LT5ldmVudHM7CisJc2ItPmV2ZW50c19jbGVhcmVkID0gY3B1X3RvX2xlNjQoYml0bWFwLT5tZGRldi0+ZXZlbnRzKTsKKworCWJpdG1hcC0+ZmxhZ3MgfD0gQklUTUFQX0hPU1RFTkRJQU47CisJc2ItPnZlcnNpb24gPSBjcHVfdG9fbGUzMihCSVRNQVBfTUFKT1JfSE9TVEVORElBTik7CisKKwlrdW5tYXBfYXRvbWljKHNiLCBLTV9VU0VSMCk7CisKKwlyZXR1cm4gMDsKK30KKwogLyogcmVhZCB0aGUgc3VwZXJibG9jayBmcm9tIHRoZSBiaXRtYXAgZmlsZSBhbmQgaW5pdGlhbGl6ZSBzb21lIGJpdG1hcCBmaWVsZHMgKi8KIHN0YXRpYyBpbnQgYml0bWFwX3JlYWRfc2Ioc3RydWN0IGJpdG1hcCAqYml0bWFwKQogewpAQCAtNTc1LDcgKzY1MSw3IEBACiAJCXJlYXNvbiA9ICJ1bnJlY29nbml6ZWQgc3VwZXJibG9jayB2ZXJzaW9uIjsKIAllbHNlIGlmIChjaHVua3NpemUgPCA1MTIpCiAJCXJlYXNvbiA9ICJiaXRtYXAgY2h1bmtzaXplIHRvbyBzbWFsbCI7Ci0JZWxzZSBpZiAoKDEgPDwgZmZ6KH5jaHVua3NpemUpKSAhPSBjaHVua3NpemUpCisJZWxzZSBpZiAoIWlzX3Bvd2VyX29mXzIoY2h1bmtzaXplKSkKIAkJcmVhc29uID0gImJpdG1hcCBjaHVua3NpemUgbm90IGEgcG93ZXIgb2YgMiI7CiAJZWxzZSBpZiAoZGFlbW9uX3NsZWVwIDwgMSB8fCBkYWVtb25fc2xlZXAgPiBNQVhfU0NIRURVTEVfVElNRU9VVCkKIAkJcmVhc29uID0gImRhZW1vbiBzbGVlcCBwZXJpb2Qgb3V0IG9mIHJhbmdlIjsKQEAgLTEwNzYsOCArMTE1Miw4IEBACiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGJpdG1hcCBpbml0aWFsaXplZCBmcm9tIGRpc2s6ICIKLQkJInJlYWQgJWx1LyVsdSBwYWdlcywgc2V0ICVsdSBiaXRzXG4iLAotCQlibW5hbWUoYml0bWFwKSwgYml0bWFwLT5maWxlX3BhZ2VzLCBudW1fcGFnZXMsIGJpdF9jbnQpOworCSAgICAgICAicmVhZCAlbHUvJWx1IHBhZ2VzLCBzZXQgJWx1IG9mICVsdSBiaXRzXG4iLAorCSAgICAgICBibW5hbWUoYml0bWFwKSwgYml0bWFwLT5maWxlX3BhZ2VzLCBudW1fcGFnZXMsIGJpdF9jbnQsIGNodW5rcyk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTMzMiw3ICsxNDA4LDcgQEAKIAkJCXJldHVybiAwOwogCQl9CiAKLQkJaWYgKHVubGlrZWx5KCgqYm1jICYgQ09VTlRFUl9NQVgpID09IENPVU5URVJfTUFYKSkgeworCQlpZiAodW5saWtlbHkoQ09VTlRFUigqYm1jKSA9PSBDT1VOVEVSX01BWCkpIHsKIAkJCURFRklORV9XQUlUKF9fd2FpdCk7CiAJCQkvKiBub3RlIHRoYXQgaXQgaXMgc2FmZSB0byBkbyB0aGUgcHJlcGFyZV90b193YWl0CiAJCQkgKiBhZnRlciB0aGUgdGVzdCBhcyBsb25nIGFzIHdlIGRvIGl0IGJlZm9yZSBkcm9wcGluZwpAQCAtMTQwNCwxMCArMTQ4MCwxMCBAQAogCQkJc3lzZnNfbm90aWZ5X2RpcmVudF9zYWZlKGJpdG1hcC0+c3lzZnNfY2FuX2NsZWFyKTsKIAkJfQogCi0JCWlmICghc3VjY2VzcyAmJiAhICgqYm1jICYgTkVFREVEX01BU0spKQorCQlpZiAoIXN1Y2Nlc3MgJiYgIU5FRURFRCgqYm1jKSkKIAkJCSpibWMgfD0gTkVFREVEX01BU0s7CiAKLQkJaWYgKCgqYm1jICYgQ09VTlRFUl9NQVgpID09IENPVU5URVJfTUFYKQorCQlpZiAoQ09VTlRFUigqYm1jKSA9PSBDT1VOVEVSX01BWCkKIAkJCXdha2VfdXAoJmJpdG1hcC0+b3ZlcmZsb3dfd2FpdCk7CiAKIAkJKCpibWMpLS07CkBAIC0xNzI4LDkgKzE4MDQsMTYgQEAKIAkJdmZzX2ZzeW5jKGZpbGUsIDEpOwogCX0KIAkvKiByZWFkIHN1cGVyYmxvY2sgZnJvbSBiaXRtYXAgZmlsZSAodGhpcyBzZXRzIG1kZGV2LT5iaXRtYXBfaW5mby5jaHVua3NpemUpICovCi0JaWYgKCFtZGRldi0+Yml0bWFwX2luZm8uZXh0ZXJuYWwpCi0JCWVyciA9IGJpdG1hcF9yZWFkX3NiKGJpdG1hcCk7Ci0JZWxzZSB7CisJaWYgKCFtZGRldi0+Yml0bWFwX2luZm8uZXh0ZXJuYWwpIHsKKwkJLyoKKwkJICogSWYgJ01EX0FSUkFZX0ZJUlNUX1VTRScgaXMgc2V0LCB0aGVuIGRldmljZS1tYXBwZXIgaXMKKwkJICogaW5zdHJ1Y3RpbmcgdXMgdG8gY3JlYXRlIGEgbmV3IG9uLWRpc2sgYml0bWFwIGluc3RhbmNlLgorCQkgKi8KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChNRF9BUlJBWV9GSVJTVF9VU0UsICZtZGRldi0+ZmxhZ3MpKQorCQkJZXJyID0gYml0bWFwX25ld19kaXNrX3NiKGJpdG1hcCk7CisJCWVsc2UKKwkJCWVyciA9IGJpdG1hcF9yZWFkX3NiKGJpdG1hcCk7CisJfSBlbHNlIHsKIAkJZXJyID0gMDsKIAkJaWYgKG1kZGV2LT5iaXRtYXBfaW5mby5jaHVua3NpemUgPT0gMCB8fAogCQkgICAgbWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcCA9PSAwKQpAQCAtMTc1NCw5ICsxODM3LDYgQEAKIAliaXRtYXAtPmNodW5rcyA9IGNodW5rczsKIAliaXRtYXAtPnBhZ2VzID0gcGFnZXM7CiAJYml0bWFwLT5taXNzaW5nX3BhZ2VzID0gcGFnZXM7Ci0JYml0bWFwLT5jb3VudGVyX2JpdHMgPSBDT1VOVEVSX0JJVFM7Ci0KLQliaXRtYXAtPnN5bmNjaHVuayA9IH4wVUw7CiAKICNpZmRlZiBJTkpFQ1RfRkFUQUxfRkFVTFRfMQogCWJpdG1hcC0+YnAgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuaCBiL2RyaXZlcnMvbWQvYml0bWFwLmgKaW5kZXggZDBhZWFmNC4uYjJhMTI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuaAorKysgYi9kcml2ZXJzL21kL2JpdG1hcC5oCkBAIC04NSw3ICs4NSw2IEBACiB0eXBlZGVmIF9fdTE2IGJpdG1hcF9jb3VudGVyX3Q7CiAjZGVmaW5lIENPVU5URVJfQklUUyAxNgogI2RlZmluZSBDT1VOVEVSX0JJVF9TSElGVCA0Ci0jZGVmaW5lIENPVU5URVJfQllURV9SQVRJTyAoQ09VTlRFUl9CSVRTIC8gOCkKICNkZWZpbmUgQ09VTlRFUl9CWVRFX1NISUZUIChDT1VOVEVSX0JJVF9TSElGVCAtIDMpCiAKICNkZWZpbmUgTkVFREVEX01BU0sgKChiaXRtYXBfY291bnRlcl90KSAoMSA8PCAoQ09VTlRFUl9CSVRTIC0gMSkpKQpAQCAtMTk2LDE5ICsxOTUsMTAgQEAKIAogCW1kZGV2X3QgKm1kZGV2OyAvKiB0aGUgbWQgZGV2aWNlIHRoYXQgdGhlIGJpdG1hcCBpcyBmb3IgKi8KIAotCWludCBjb3VudGVyX2JpdHM7IC8qIGhvdyBtYW55IGJpdHMgcGVyIGJsb2NrIGNvdW50ZXIgKi8KLQogCS8qIGJpdG1hcCBjaHVua3NpemUgLS0gaG93IG11Y2ggZGF0YSBkb2VzIGVhY2ggYml0IHJlcHJlc2VudD8gKi8KIAl1bnNpZ25lZCBsb25nIGNodW5rc2hpZnQ7IC8qIGNodW5rc2l6ZSA9IDJeY2h1bmtzaGlmdCAoZm9yIGJpdG9wcykgKi8KIAl1bnNpZ25lZCBsb25nIGNodW5rczsgLyogdG90YWwgbnVtYmVyIG9mIGRhdGEgY2h1bmtzIGZvciB0aGUgYXJyYXkgKi8KIAotCS8qIFdlIGhvbGQgYSBjb3VudCBvbiB0aGUgY2h1bmsgY3VycmVudGx5IGJlaW5nIHN5bmNlZCwgYW5kIGRyb3AKLQkgKiBpdCB3aGVuIHRoZSBsYXN0IGJsb2NrIGlzIHN0YXJ0ZWQuICBJZiB0aGUgcmVzeW5jIGlzIGFib3J0ZWQKLQkgKiBtaWR3YXksIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBkcm9wIHRoYXQgY291bnQsIHNvIHdlIHJlbWVtYmVyCi0JICogdGhlIGNvdW50ZWQgY2h1bmsuLgotCSAqLwotCXVuc2lnbmVkIGxvbmcgc3luY2NodW5rOwotCiAJX191NjQJZXZlbnRzX2NsZWFyZWQ7CiAJaW50IG5lZWRfc3luYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9saW5lYXIuYyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKaW5kZXggYWJmYjU5YS4uNmNkMmMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9saW5lYXIuYworKysgYi9kcml2ZXJzL21kL2xpbmVhci5jCkBAIC0yMTMsMTIgKzIxMyw2IEBACiAJcmV0dXJuIG1kX2ludGVncml0eV9yZWdpc3RlcihtZGRldik7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfY29uZihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0JbGluZWFyX2NvbmZfdCAqY29uZiA9IGNvbnRhaW5lcl9vZihoZWFkLCBsaW5lYXJfY29uZl90LCByY3UpOwotCWtmcmVlKGNvbmYpOwotfQotCiBzdGF0aWMgaW50IGxpbmVhcl9hZGQobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpCiB7CiAJLyogQWRkaW5nIGEgZHJpdmUgdG8gYSBsaW5lYXIgYXJyYXkgYWxsb3dzIHRoZSBhcnJheSB0byBncm93LgpAQCAtMjQ3LDcgKzI0MSw3IEBACiAJbWRfc2V0X2FycmF5X3NlY3RvcnMobWRkZXYsIGxpbmVhcl9zaXplKG1kZGV2LCAwLCAwKSk7CiAJc2V0X2NhcGFjaXR5KG1kZGV2LT5nZW5kaXNrLCBtZGRldi0+YXJyYXlfc2VjdG9ycyk7CiAJcmV2YWxpZGF0ZV9kaXNrKG1kZGV2LT5nZW5kaXNrKTsKLQljYWxsX3JjdSgmb2xkY29uZi0+cmN1LCBmcmVlX2NvbmYpOworCWtmcmVlX3JjdShvbGRjb25mLCByY3UpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmMgYi9kcml2ZXJzL21kL21kLmMKaW5kZXggYWE2NDBhOC4uZGZjOTQyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC5jCisrKyBiL2RyaXZlcnMvbWQvbWQuYwpAQCAtMzUxLDYgKzM1MSw5IEBACiAJbWRkZXYtPnN1c3BlbmRlZCA9IDA7CiAJd2FrZV91cCgmbWRkZXYtPnNiX3dhaXQpOwogCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAwKTsKKworCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CisJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+c3luY190aHJlYWQpOyAvKiBwb3NzaWJseSBraWNrIG9mZiBhIHJlc2hhcGUgKi8KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1kZGV2X3Jlc3VtZSk7CiAKQEAgLTE3NTAsNiArMTc1MywxOCBAQAogCX0sCiB9OwogCitzdGF0aWMgdm9pZCBzeW5jX3N1cGVyKG1kZGV2X3QgKm1kZGV2LCBtZGtfcmRldl90ICpyZGV2KQoreworCWlmIChtZGRldi0+c3luY19zdXBlcikgeworCQltZGRldi0+c3luY19zdXBlcihtZGRldiwgcmRldik7CisJCXJldHVybjsKKwl9CisKKwlCVUdfT04obWRkZXYtPm1ham9yX3ZlcnNpb24gPj0gQVJSQVlfU0laRShzdXBlcl90eXBlcykpOworCisJc3VwZXJfdHlwZXNbbWRkZXYtPm1ham9yX3ZlcnNpb25dLnN5bmNfc3VwZXIobWRkZXYsIHJkZXYpOworfQorCiBzdGF0aWMgaW50IG1hdGNoX21kZGV2X3VuaXRzKG1kZGV2X3QgKm1kZGV2MSwgbWRkZXZfdCAqbWRkZXYyKQogewogCW1ka19yZGV2X3QgKnJkZXYsICpyZGV2MjsKQEAgLTE3ODEsOCArMTc5Niw4IEBACiAKIAlpZiAobGlzdF9lbXB0eSgmbWRkZXYtPmRpc2tzKSkKIAkJcmV0dXJuIDA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLQlpZiAoYmxrX2dldF9pbnRlZ3JpdHkobWRkZXYtPmdlbmRpc2spKQotCQlyZXR1cm4gMDsgLyogYWxyZWFkeSByZWdpc3RlcmVkICovCisJaWYgKCFtZGRldi0+Z2VuZGlzayB8fCBibGtfZ2V0X2ludGVncml0eShtZGRldi0+Z2VuZGlzaykpCisJCXJldHVybiAwOyAvKiBzaG91bGRuJ3QgcmVnaXN0ZXIsIG9yIGFscmVhZHkgaXMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCS8qIHNraXAgc3BhcmVzIGFuZCBub24tZnVuY3Rpb25hbCBkaXNrcyAqLwogCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQpAQCAtMjE2OCw4ICsyMTgzLDcgQEAKIAkJCS8qIERvbid0IHVwZGF0ZSB0aGlzIHN1cGVyYmxvY2sgKi8KIAkJCXJkZXYtPnNiX2xvYWRlZCA9IDI7CiAJCX0gZWxzZSB7Ci0JCQlzdXBlcl90eXBlc1ttZGRldi0+bWFqb3JfdmVyc2lvbl0uCi0JCQkJc3luY19zdXBlcihtZGRldiwgcmRldik7CisJCQlzeW5jX3N1cGVyKG1kZGV2LCByZGV2KTsKIAkJCXJkZXYtPnNiX2xvYWRlZCA9IDE7CiAJCX0KIAl9CkBAIC0yNDYyLDcgKzI0NzYsNyBAQAogCQlpZiAocmRldi0+cmFpZF9kaXNrID09IC0xKQogCQkJcmV0dXJuIC1FRVhJU1Q7CiAJCS8qIHBlcnNvbmFsaXR5IGRvZXMgYWxsIG5lZWRlZCBjaGVja3MgKi8KLQkJaWYgKHJkZXYtPm1kZGV2LT5wZXJzLT5ob3RfYWRkX2Rpc2sgPT0gTlVMTCkKKwkJaWYgKHJkZXYtPm1kZGV2LT5wZXJzLT5ob3RfcmVtb3ZlX2Rpc2sgPT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQllcnIgPSByZGV2LT5tZGRldi0+cGVycy0+CiAJCQlob3RfcmVtb3ZlX2Rpc2socmRldi0+bWRkZXYsIHJkZXYtPnJhaWRfZGlzayk7CkBAIC00NjE5LDkgKzQ2MzMsNiBAQAogCWlmIChtZGRldi0+ZmxhZ3MpCiAJCW1kX3VwZGF0ZV9zYihtZGRldiwgMCk7CiAKLQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwotCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnN5bmNfdGhyZWFkKTsgLyogcG9zc2libHkga2ljayBvZmYgYSByZXNoYXBlICovCi0KIAltZF9uZXdfZXZlbnQobWRkZXYpOwogCXN5c2ZzX25vdGlmeV9kaXJlbnRfc2FmZShtZGRldi0+c3lzZnNfc3RhdGUpOwogCXN5c2ZzX25vdGlmeV9kaXJlbnRfc2FmZShtZGRldi0+c3lzZnNfYWN0aW9uKTsKQEAgLTQ2NDIsNiArNDY1MywxMCBAQAogCQliaXRtYXBfZGVzdHJveShtZGRldik7CiAJCWdvdG8gb3V0OwogCX0KKworCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CisJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+c3luY190aHJlYWQpOyAvKiBwb3NzaWJseSBraWNrIG9mZiBhIHJlc2hhcGUgKi8KKwogCXNldF9jYXBhY2l0eShtZGRldi0+Z2VuZGlzaywgbWRkZXYtPmFycmF5X3NlY3RvcnMpOwogCXJldmFsaWRhdGVfZGlzayhtZGRldi0+Z2VuZGlzayk7CiAJbWRkZXYtPmNoYW5nZWQgPSAxOwpAQCAtNTI1OSw2ICs1Mjc0LDggQEAKIAkJaWYgKG1kZGV2LT5kZWdyYWRlZCkKIAkJCXNldF9iaXQoTURfUkVDT1ZFUllfUkVDT1ZFUiwgJm1kZGV2LT5yZWNvdmVyeSk7CiAJCXNldF9iaXQoTURfUkVDT1ZFUllfTkVFREVELCAmbWRkZXYtPnJlY292ZXJ5KTsKKwkJaWYgKCFlcnIpCisJCQltZF9uZXdfZXZlbnQobWRkZXYpOwogCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTYzNzcsMTYgKzYzOTQsMTEgQEAKIAkJbWRkZXZfcHV0KG1kZGV2KTsKIH0KIAotc3RydWN0IG1kc3RhdF9pbmZvIHsKLQlpbnQgZXZlbnQ7Ci19OwotCiBzdGF0aWMgaW50IG1kX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCW1kZGV2X3QgKm1kZGV2ID0gdjsKIAlzZWN0b3JfdCBzZWN0b3JzOwogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IG1kc3RhdF9pbmZvICptaSA9IHNlcS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgYml0bWFwICpiaXRtYXA7CiAKIAlpZiAodiA9PSAodm9pZCopMSkgewpAQCAtNjM5OCw3ICs2NDEwLDcgQEAKIAogCQlzcGluX3VubG9jaygmcGVyc19sb2NrKTsKIAkJc2VxX3ByaW50ZihzZXEsICJcbiIpOwotCQltaS0+ZXZlbnQgPSBhdG9taWNfcmVhZCgmbWRfZXZlbnRfY291bnQpOworCQlzZXEtPnBvbGxfZXZlbnQgPSBhdG9taWNfcmVhZCgmbWRfZXZlbnRfY291bnQpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHYgPT0gKHZvaWQqKTIpIHsKQEAgLTY1MTAsMjYgKzY1MjIsMjEgQEAKIAogc3RhdGljIGludCBtZF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKIAlpbnQgZXJyb3I7Ci0Jc3RydWN0IG1kc3RhdF9pbmZvICptaSA9IGttYWxsb2Moc2l6ZW9mKCptaSksIEdGUF9LRVJORUwpOwotCWlmIChtaSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKIAogCWVycm9yID0gc2VxX29wZW4oZmlsZSwgJm1kX3NlcV9vcHMpOwogCWlmIChlcnJvcikKLQkJa2ZyZWUobWkpOwotCWVsc2UgewotCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCXAtPnByaXZhdGUgPSBtaTsKLQkJbWktPmV2ZW50ID0gYXRvbWljX3JlYWQoJm1kX2V2ZW50X2NvdW50KTsKLQl9CisJCXJldHVybiBlcnJvcjsKKworCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnBvbGxfZXZlbnQgPSBhdG9taWNfcmVhZCgmbWRfZXZlbnRfY291bnQpOwogCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBtZHN0YXRfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqd2FpdCkKIHsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1kc3RhdF9pbmZvICptaSA9IG0tPnByaXZhdGU7CisJc3RydWN0IHNlcV9maWxlICpzZXEgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJaW50IG1hc2s7CiAKIAlwb2xsX3dhaXQoZmlscCwgJm1kX2V2ZW50X3dhaXRlcnMsIHdhaXQpOwpAQCAtNjUzNyw3ICs2NTQ0LDcgQEAKIAkvKiBhbHdheXMgYWxsb3cgcmVhZCAqLwogCW1hc2sgPSBQT0xMSU4gfCBQT0xMUkROT1JNOwogCi0JaWYgKG1pLT5ldmVudCAhPSBhdG9taWNfcmVhZCgmbWRfZXZlbnRfY291bnQpKQorCWlmIChzZXEtPnBvbGxfZXZlbnQgIT0gYXRvbWljX3JlYWQoJm1kX2V2ZW50X2NvdW50KSkKIAkJbWFzayB8PSBQT0xMRVJSIHwgUE9MTFBSSTsKIAlyZXR1cm4gbWFzazsKIH0KQEAgLTY4NjYsOCArNjg3Myw4IEBACiAJICogVHVuZSByZWNvbnN0cnVjdGlvbjoKIAkgKi8KIAl3aW5kb3cgPSAzMiooUEFHRV9TSVpFLzUxMik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibWQ6IHVzaW5nICVkayB3aW5kb3csIG92ZXIgYSB0b3RhbCBvZiAlbGx1IGJsb2Nrcy5cbiIsCi0JCXdpbmRvdy8yLCh1bnNpZ25lZCBsb25nIGxvbmcpIG1heF9zZWN0b3JzLzIpOworCXByaW50ayhLRVJOX0lORk8gIm1kOiB1c2luZyAlZGsgd2luZG93LCBvdmVyIGEgdG90YWwgb2YgJWxsdWsuXG4iLAorCQl3aW5kb3cvMiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltYXhfc2VjdG9ycy8yKTsKIAogCWF0b21pY19zZXQoJm1kZGV2LT5yZWNvdmVyeV9hY3RpdmUsIDApOwogCWxhc3RfY2hlY2sgPSAwOwpAQCAtNzA0NSw3ICs3MDUyLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1kX2RvX3N5bmMpOwogCi0KIHN0YXRpYyBpbnQgcmVtb3ZlX2FuZF9hZGRfc3BhcmVzKG1kZGV2X3QgKm1kZGV2KQogewogCW1ka19yZGV2X3QgKnJkZXY7CkBAIC03MDcyLDYgKzcwNzgsNyBAQAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYKIAkJCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSAmJgorCQkJICAgICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoQmxvY2tlZCwgJnJkZXYtPmZsYWdzKSkKIAkJCQlzcGFyZXMrKzsKIAkJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPCAwCkBAIC03MTU3LDYgKzcxNjQsOSBAQAogICovCiB2b2lkIG1kX2NoZWNrX3JlY292ZXJ5KG1kZGV2X3QgKm1kZGV2KQogeworCWlmIChtZGRldi0+c3VzcGVuZGVkKQorCQlyZXR1cm47CisKIAlpZiAobWRkZXYtPmJpdG1hcCkKIAkJYml0bWFwX2RhZW1vbl93b3JrKG1kZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5oIGIvZHJpdmVycy9tZC9tZC5oCmluZGV4IDBiMWZkM2YuLjFjMjZjN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuaAorKysgYi9kcml2ZXJzL21kL21kLmgKQEAgLTEyNCw2ICsxMjQsNyBAQAogI2RlZmluZSBNRF9DSEFOR0VfREVWUwkwCS8qIFNvbWUgZGV2aWNlIHN0YXR1cyBoYXMgY2hhbmdlZCAqLwogI2RlZmluZSBNRF9DSEFOR0VfQ0xFQU4gMQkvKiB0cmFuc2l0aW9uIHRvIG9yIGZyb20gJ2NsZWFuJyAqLwogI2RlZmluZSBNRF9DSEFOR0VfUEVORElORyAyCS8qIHN3aXRjaCBmcm9tICdjbGVhbicgdG8gJ2FjdGl2ZScgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgTURfQVJSQVlfRklSU1RfVVNFIDMgICAgLyogRmlyc3QgdXNlIG9mIGFycmF5LCBuZWVkcyBpbml0aWFsaXphdGlvbiAqLwogCiAJaW50CQkJCXN1c3BlbmRlZDsKIAlhdG9taWNfdAkJCWFjdGl2ZV9pbzsKQEAgLTMzMCw2ICszMzEsNyBAQAogCWF0b21pY190IGZsdXNoX3BlbmRpbmc7CiAJc3RydWN0IHdvcmtfc3RydWN0IGZsdXNoX3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0IGV2ZW50X3dvcms7CS8qIHVzZWQgYnkgZG0gdG8gcmVwb3J0IGZhaWx1cmUgZXZlbnQgKi8KKwl2b2lkICgqc3luY19zdXBlcikobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpOwogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggNWQwOTYwOS4uZjc0MzFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtNDk3LDIxICs0OTcsMTkgQEAKIAlyZXR1cm4gYmVzdF9kaXNrOwogfQogCi1zdGF0aWMgaW50IHJhaWQxX2Nvbmdlc3RlZCh2b2lkICpkYXRhLCBpbnQgYml0cykKK2ludCBtZF9yYWlkMV9jb25nZXN0ZWQobWRkZXZfdCAqbWRkZXYsIGludCBiaXRzKQogewotCW1kZGV2X3QgKm1kZGV2ID0gZGF0YTsKIAljb25mX3QgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCWlmIChtZGRldl9jb25nZXN0ZWQobWRkZXYsIGJpdHMpKQotCQlyZXR1cm4gMTsKLQogCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKGkgPSAwOyBpIDwgbWRkZXYtPnJhaWRfZGlza3M7IGkrKykgewogCQltZGtfcmRldl90ICpyZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGNvbmYtPm1pcnJvcnNbaV0ucmRldik7CiAJCWlmIChyZGV2ICYmICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpIHsKIAkJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUocmRldi0+YmRldik7CiAKKwkJCUJVR19PTighcSk7CisKIAkJCS8qIE5vdGUgdGhlICd8fCAxJyAtIHdoZW4gcmVhZF9iYWxhbmNlIHByZWZlcnMKIAkJCSAqIG5vbi1jb25nZXN0ZWQgdGFyZ2V0cywgaXQgY2FuIGJlIHJlbW92ZWQKIAkJCSAqLwpAQCAtNTI0LDcgKzUyMiwxNSBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChtZF9yYWlkMV9jb25nZXN0ZWQpOwogCitzdGF0aWMgaW50IHJhaWQxX2Nvbmdlc3RlZCh2b2lkICpkYXRhLCBpbnQgYml0cykKK3sKKwltZGRldl90ICptZGRldiA9IGRhdGE7CisKKwlyZXR1cm4gbWRkZXZfY29uZ2VzdGVkKG1kZGV2LCBiaXRzKSB8fAorCQltZF9yYWlkMV9jb25nZXN0ZWQobWRkZXYsIGJpdHMpOworfQogCiBzdGF0aWMgdm9pZCBmbHVzaF9wZW5kaW5nX3dyaXRlcyhjb25mX3QgKmNvbmYpCiB7CkBAIC0xOTcyLDYgKzE5NzgsOCBAQAogCQlyZXR1cm4gUFRSX0VSUihjb25mKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKKwkJaWYgKCFtZGRldi0+Z2VuZGlzaykKKwkJCWNvbnRpbnVlOwogCQlkaXNrX3N0YWNrX2xpbWl0cyhtZGRldi0+Z2VuZGlzaywgcmRldi0+YmRldiwKIAkJCQkgIHJkZXYtPmRhdGFfb2Zmc2V0IDw8IDkpOwogCQkvKiBhcyB3ZSBkb24ndCBob25vdXIgbWVyZ2VfYnZlY19mbiwgd2UgbXVzdCBuZXZlciByaXNrCkBAIC0yMDEzLDggKzIwMjEsMTAgQEAKIAogCW1kX3NldF9hcnJheV9zZWN0b3JzKG1kZGV2LCByYWlkMV9zaXplKG1kZGV2LCAwLCAwKSk7CiAKLQltZGRldi0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2ZuID0gcmFpZDFfY29uZ2VzdGVkOwotCW1kZGV2LT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mby5jb25nZXN0ZWRfZGF0YSA9IG1kZGV2OworCWlmIChtZGRldi0+cXVldWUpIHsKKwkJbWRkZXYtPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9mbiA9IHJhaWQxX2Nvbmdlc3RlZDsKKwkJbWRkZXYtPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9kYXRhID0gbWRkZXY7CisJfQogCXJldHVybiBtZF9pbnRlZ3JpdHlfcmVnaXN0ZXIobWRkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmggYi9kcml2ZXJzL21kL3JhaWQxLmgKaW5kZXggNWZjNGNhMS4uZTc0M2E2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5oCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuaApAQCAtMTI2LDQgKzEyNiw2IEBACiAgKi8KICNkZWZpbmUJUjFCSU9fUmV0dXJuZWQgNgogCitleHRlcm4gaW50IG1kX3JhaWQxX2Nvbmdlc3RlZChtZGRldl90ICptZGRldiwgaW50IGJpdHMpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDUuYyBiL2RyaXZlcnMvbWQvcmFpZDUuYwppbmRleCAzNDZlNjliLi5iNzJlZGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNS5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHJhaWQ1X3NldF9iaV9od19zZWdtZW50cyhzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBjbnQpCiB7Ci0JYmlvLT5iaV9waHlzX3NlZ21lbnRzID0gcmFpZDVfYmlfcGh5c19zZWdtZW50cyhiaW8pIHx8IChjbnQgPDwgMTYpOworCWJpby0+YmlfcGh5c19zZWdtZW50cyA9IHJhaWQ1X2JpX3BoeXNfc2VnbWVudHMoYmlvKSB8IChjbnQgPDwgMTYpOwogfQogCiAvKiBGaW5kIGZpcnN0IGRhdGEgZGlzayBpbiBhIHJhaWQ2IHN0cmlwZSAqLwpAQCAtNTE0LDcgKzUxNCw3IEBACiAJCWJpID0gJnNoLT5kZXZbaV0ucmVxOwogCiAJCWJpLT5iaV9ydyA9IHJ3OwotCQlpZiAocncgPT0gV1JJVEUpCisJCWlmIChydyAmIFdSSVRFKQogCQkJYmktPmJpX2VuZF9pbyA9IHJhaWQ1X2VuZF93cml0ZV9yZXF1ZXN0OwogCQllbHNlCiAJCQliaS0+YmlfZW5kX2lvID0gcmFpZDVfZW5kX3JlYWRfcmVxdWVzdDsKQEAgLTU0OCwxMyArNTQ4LDEzIEBACiAJCQliaS0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCA9IDA7CiAJCQliaS0+Ymlfc2l6ZSA9IFNUUklQRV9TSVpFOwogCQkJYmktPmJpX25leHQgPSBOVUxMOwotCQkJaWYgKHJ3ID09IFdSSVRFICYmCisJCQlpZiAoKHJ3ICYgV1JJVEUpICYmCiAJCQkgICAgdGVzdF9iaXQoUjVfUmVXcml0ZSwgJnNoLT5kZXZbaV0uZmxhZ3MpKQogCQkJCWF0b21pY19hZGQoU1RSSVBFX1NFQ1RPUlMsCiAJCQkJCSZyZGV2LT5jb3JyZWN0ZWRfZXJyb3JzKTsKIAkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpKTsKIAkJfSBlbHNlIHsKLQkJCWlmIChydyA9PSBXUklURSkKKwkJCWlmIChydyAmIFdSSVRFKQogCQkJCXNldF9iaXQoU1RSSVBFX0RFR1JBREVELCAmc2gtPnN0YXRlKTsKIAkJCXByX2RlYnVnKCJza2lwIG9wICVsZCBvbiBkaXNjICVkIGZvciBzZWN0b3IgJWxsdVxuIiwKIAkJCQliaS0+YmlfcncsIGksICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3Rvcik7CkBAIC01ODUsNyArNTg1LDcgQEAKIAlpbml0X2FzeW5jX3N1Ym1pdCgmc3VibWl0LCBmbGFncywgdHgsIE5VTEwsIE5VTEwsIE5VTEwpOwogCiAJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZsLCBiaW8sIGkpIHsKLQkJaW50IGxlbiA9IGJpb19pb3ZlY19pZHgoYmlvLCBpKS0+YnZfbGVuOworCQlpbnQgbGVuID0gYnZsLT5idl9sZW47CiAJCWludCBjbGVuOwogCQlpbnQgYl9vZmZzZXQgPSAwOwogCkBAIC02MDEsOCArNjAxLDggQEAKIAkJCWNsZW4gPSBsZW47CiAKIAkJaWYgKGNsZW4gPiAwKSB7Ci0JCQliX29mZnNldCArPSBiaW9faW92ZWNfaWR4KGJpbywgaSktPmJ2X29mZnNldDsKLQkJCWJpb19wYWdlID0gYmlvX2lvdmVjX2lkeChiaW8sIGkpLT5idl9wYWdlOworCQkJYl9vZmZzZXQgKz0gYnZsLT5idl9vZmZzZXQ7CisJCQliaW9fcGFnZSA9IGJ2bC0+YnZfcGFnZTsKIAkJCWlmIChmcm9tYmlvKQogCQkJCXR4ID0gYXN5bmNfbWVtY3B5KHBhZ2UsIGJpb19wYWdlLCBwYWdlX29mZnNldCwKIAkJCQkJCSAgYl9vZmZzZXQsIGNsZW4sICZzdWJtaXQpOwpAQCAtNDg1OCw3ICs0ODU4LDcgQEAKIAkJCXByaW50ayhLRVJOX0lORk8gIm1kL3JhaWQ6JXM6IGRldmljZSAlcyBvcGVyYXRpb25hbCBhcyByYWlkIgogCQkJICAgICAgICIgZGlzayAlZFxuIiwKIAkJCSAgICAgICBtZG5hbWUobWRkZXYpLCBiZGV2bmFtZShyZGV2LT5iZGV2LCBiKSwgcmFpZF9kaXNrKTsKLQkJfSBlbHNlCisJCX0gZWxzZSBpZiAocmRldi0+c2F2ZWRfcmFpZF9kaXNrICE9IHJhaWRfZGlzaykKIAkJCS8qIENhbm5vdCByZWx5IG9uIGJpdG1hcCB0byBjb21wbGV0ZSByZWNvdmVyeSAqLwogCQkJY29uZi0+ZnVsbHN5bmMgPSAxOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1jb21tb24uaAppbmRleCA5ZTIxNDhhLi40Mzc5MTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWNvbW1vbi5oCkBAIC02LDYgKzYsNyBAQAogI2lmbmRlZiBfX0ZMRVhDT1BfQ09NTU9OX0hfXwogI2RlZmluZSBfX0ZMRVhDT1BfQ09NTU9OX0hfXwogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L2RtMTEwNS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L2RtMTEwNS5jCmluZGV4IGIyYjBjNDUuLjU1ZTY1MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9kbTExMDUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvZG0xMTA1LmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwppbmRleCA5ODI3ODA0Li41YjZiNDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwpAQCAtMTk4OCw2ICsxOTg4LDE0IEBACiAJaWYgKGR2YmRldi0+dXNlcnMgPT0gLTEgJiYgZmUtPm9wcy50c19idXNfY3RybCkgewogCQlpZiAoKHJldCA9IGZlLT5vcHMudHNfYnVzX2N0cmwoZmUsIDEpKSA8IDApCiAJCQlnb3RvIGVycjA7CisKKwkJLyogSWYgd2UgdG9vayBjb250cm9sIG9mIHRoZSBidXMsIHdlIG5lZWQgdG8gZm9yY2UKKwkJICAgcmVpbml0aWFsaXphdGlvbi4gIFRoaXMgaXMgYmVjYXVzZSBtYW55IHRzX2J1c19jdHJsKCkKKwkJICAgZnVuY3Rpb25zIHN0cm9iZSB0aGUgUkVTRVQgcGluIG9uIHRoZSBkZW1vZCwgYW5kIGlmIHRoZQorCQkgICBmcm9udGVuZCB0aHJlYWQgYWxyZWFkeSBleGlzdHMgdGhlbiB0aGUgZHZiX2luaXQoKSByb3V0aW5lCisJCSAgIHdvbid0IGdldCBjYWxsZWQgKHdoaWNoIGlzIHdoYXQgdXN1YWxseSBkb2VzIGluaXRpYWwKKwkJICAgcmVnaXN0ZXIgY29uZmlndXJhdGlvbikuICovCisJCWZlcHJpdi0+cmVpbml0aWFsaXNlID0gMTsKIAl9CiAKIAlpZiAoKHJldCA9IGR2Yl9nZW5lcmljX29wZW4gKGlub2RlLCBmaWxlKSkgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKaW5kZXggNGRjMWNhMy4uN2MzMjdiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCkBAIC02MCw4ICs2MCw2IEBACiAJaW50IGFjdF9sZW4sIHJldDsKIAl1OCBidWZbNjRdOwogCi0JaWYgKHNsZW4gPiBzaXplb2YoYnVmKSkKLQkJc2xlbiA9IHNpemVvZihidWYpOwogCW1lbWNweSgmYnVmWzBdLCBzYnVmLCBzbGVuKTsKIAlidWZbNjBdID0gc3RhdGUtPnNlcSsrOwogCkBAIC0xODAsMzAgKzE3OCwzNyBAQAogewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CiAJaW50IHJldCA9IDAsIGluYywgaSA9IDA7CisJdTggYnVmWzUyXTsgLyogNCArIDQ4IChJMkMgV1IgVVNCIGNvbW1hbmQgaGVhZGVyICsgSTJDIFdSIG1heCkgKi8KIAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQogCQlyZXR1cm4gLUVBR0FJTjsKIAogCXdoaWxlIChpIDwgbnVtKSB7CiAJCWlmIChudW0gPiBpICsgMSAmJiAobXNnW2krMV0uZmxhZ3MgJiBJMkNfTV9SRCkpIHsKLQkJCXU4IGJ1Zls2XTsKKwkJCWlmIChtc2dbaV0ubGVuID4gMiB8fCBtc2dbaSsxXS5sZW4gPiA2MCkgeworCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCWJyZWFrOworCQkJfQogCQkJYnVmWzBdID0gQ01EX0kyQ19SRUFEOwogCQkJYnVmWzFdID0gKG1zZ1tpXS5hZGRyIDw8IDEpIHwgMHgwMTsKIAkJCWJ1ZlsyXSA9IG1zZ1tpXS5idWZbMF07CiAJCQlidWZbM10gPSBtc2dbaV0uYnVmWzFdOwogCQkJYnVmWzRdID0gbXNnW2ldLmxlbi0xOwogCQkJYnVmWzVdID0gbXNnW2krMV0ubGVuOwotCQkJcmV0ID0gYW55c2VlX2N0cmxfbXNnKGQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIG1zZ1tpKzFdLmJ1ZiwKKwkJCXJldCA9IGFueXNlZV9jdHJsX21zZyhkLCBidWYsIDYsIG1zZ1tpKzFdLmJ1ZiwKIAkJCQltc2dbaSsxXS5sZW4pOwogCQkJaW5jID0gMjsKIAkJfSBlbHNlIHsKLQkJCXU4IGJ1Zls0K21zZ1tpXS5sZW5dOworCQkJaWYgKG1zZ1tpXS5sZW4gPiA0OCkgeworCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCWJyZWFrOworCQkJfQogCQkJYnVmWzBdID0gQ01EX0kyQ19XUklURTsKIAkJCWJ1ZlsxXSA9IChtc2dbaV0uYWRkciA8PCAxKTsKIAkJCWJ1ZlsyXSA9IG1zZ1tpXS5sZW47CiAJCQlidWZbM10gPSAweDAxOwogCQkJbWVtY3B5KCZidWZbNF0sIG1zZ1tpXS5idWYsIG1zZ1tpXS5sZW4pOwotCQkJcmV0ID0gYW55c2VlX2N0cmxfbXNnKGQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwsIDApOworCQkJcmV0ID0gYW55c2VlX2N0cmxfbXNnKGQsIGJ1ZiwgNCArIG1zZ1tpXS5sZW4sIE5VTEwsIDApOwogCQkJaW5jID0gMTsKIAkJfQogCQlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19jYS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19jYS5jCmluZGV4IDMzMDIxNmYuLjNkNzA0NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfY2EuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2NhLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgImRteGRldi5oIgogI2luY2x1ZGUgImR2YmRldi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfY29tbW9uLmgKaW5kZXggYmQ0MDBkMi4uNDlkYmNhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19jb21tb24uaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2NvbW1vbi5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaWZuZGVmIF9fTUFOVElTX0NPTU1PTl9ICiAjZGVmaW5lIF9fTUFOVElTX0NPTU1PTl9ICiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2V2bS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19ldm0uYwppbmRleCA5ZjczYzJjLi4zNmYyMjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2V2bS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfZXZtLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSAiZG14ZGV2LmgiCiAjaW5jbHVkZSAiZHZiZGV2LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2hpZi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19oaWYuYwppbmRleCA1NzcyZWJiLi42NzJjZjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2hpZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfaGlmLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlICJkbXhkZXYuaCIKICNpbmNsdWRlICJkdmJkZXYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfaW9jLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2lvYy5jCmluZGV4IDQ3OTA4NmQuLjI0ZmNkYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfaW9jLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19pb2MuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlICJkbXhkZXYuaCIKICNpbmNsdWRlICJkdmJkZXYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfcGNtY2lhLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX3BjbWNpYS5jCmluZGV4IDVjYjU0NWIuLjJmMTg4YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfcGNtY2lhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19wY21jaWEuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlICJkbXhkZXYuaCIKICNpbmNsdWRlICJkdmJkZXYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfdWFydC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc191YXJ0LmMKaW5kZXggZjgwN2M4Yi4uMTgzNDBkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc191YXJ0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc191YXJ0LmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc192cDEwMzQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfdnAxMDM0LmMKaW5kZXggMjZiYzBjYi4uNDMwYWU4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc192cDEwMzQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX3ZwMTAzNC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgImRteGRldi5oIgogI2luY2x1ZGUgImR2YmRldi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL3BsdXRvMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL3BsdXRvMi5jCmluZGV4IDdjYjc5ZWMuLjgwZmI1MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL21lZGlhLWRldm5vZGUuYyBiL2RyaXZlcnMvbWVkaWEvbWVkaWEtZGV2bm9kZS5jCmluZGV4IGFmNTI2M2MuLjdiNDJhY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvbWVkaWEtZGV2bm9kZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvbWVkaWEtZGV2bm9kZS5jCkBAIC0yMTMsMTQgKzIxMywxNCBAQAogCiAJLyogUGFydCAxOiBGaW5kIGEgZnJlZSBtaW5vciBudW1iZXIgKi8KIAltdXRleF9sb2NrKCZtZWRpYV9kZXZub2RlX2xvY2spOwotCW1pbm9yID0gZmluZF9uZXh0X3plcm9fYml0KG1lZGlhX2Rldm5vZGVfbnVtcywgMCwgTUVESUFfTlVNX0RFVklDRVMpOworCW1pbm9yID0gZmluZF9uZXh0X3plcm9fYml0KG1lZGlhX2Rldm5vZGVfbnVtcywgTUVESUFfTlVNX0RFVklDRVMsIDApOwogCWlmIChtaW5vciA9PSBNRURJQV9OVU1fREVWSUNFUykgewogCQltdXRleF91bmxvY2soJm1lZGlhX2Rldm5vZGVfbG9jayk7CiAJCXByaW50ayhLRVJOX0VSUiAiY291bGQgbm90IGdldCBhIGZyZWUgbWlub3JcbiIpOwogCQlyZXR1cm4gLUVORklMRTsKIAl9CiAKLQlzZXRfYml0KG1kZXYtPm1pbm9yLCBtZWRpYV9kZXZub2RlX251bXMpOworCXNldF9iaXQobWlub3IsIG1lZGlhX2Rldm5vZGVfbnVtcyk7CiAJbXV0ZXhfdW5sb2NrKCZtZWRpYV9kZXZub2RlX2xvY2spOwogCiAJbWRldi0+bWlub3IgPSBtaW5vcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZwppbmRleCBlNGM5N2ZkLi41Mjc5OGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCkBAIC0xNjgsNyArMTY4LDcgQEAKIAogY29uZmlnIFJBRElPX01JUk9QQ00yMAogCXRyaXN0YXRlICJtaXJvU09VTkQgUENNMjAgcmFkaW8iCi0JZGVwZW5kcyBvbiBJU0EgJiYgVklERU9fVjRMMiAmJiBTTkQKKwlkZXBlbmRzIG9uIElTQSAmJiBJU0FfRE1BX0FQSSAmJiBWSURFT19WNEwyICYmIFNORAogCXNlbGVjdCBTTkRfSVNBCiAJc2VsZWN0IFNORF9NSVJPCiAJLS0taGVscC0tLQpAQCAtMjAxLDcgKzIwMSw3IEBACiAKIGNvbmZpZyBSQURJT19TRjE2Rk1SMgogCXRyaXN0YXRlICJTRjE2Rk1SMiBSYWRpbyIKLQlkZXBlbmRzIG9uIElTQSAmJiBWSURFT19WNEwyCisJZGVwZW5kcyBvbiBJU0EgJiYgVklERU9fVjRMMiAmJiBTTkQKIAktLS1oZWxwLS0tCiAJICBDaG9vc2UgWSBoZXJlIGlmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBGTSByYWRpbyBjYXJkcy4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuYwppbmRleCBkZWNhMmUwLi5jOWY0YThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuYwpAQCAtMTAzMyw3ICsxMDMzLDcgQEAKIAkJY2hhciBwc19uYW1lW01BWF9SRFNfUFNfTkFNRSArIDFdOwogCiAJCWxlbiA9IGNvbnRyb2wtPnNpemUgLSAxOwotCQlpZiAobGVuID4gTUFYX1JEU19QU19OQU1FKSB7CisJCWlmIChsZW4gPCAwIHx8IGxlbiA+IE1BWF9SRFNfUFNfTkFNRSkgewogCQkJcnZhbCA9IC1FUkFOR0U7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTEwNTcsNyArMTA1Nyw3IEBACiAJCWNoYXIgcmFkaW9fdGV4dFtNQVhfUkRTX1JBRElPX1RFWFQgKyAxXTsKIAogCQlsZW4gPSBjb250cm9sLT5zaXplIC0gMTsKLQkJaWYgKGxlbiA+IE1BWF9SRFNfUkFESU9fVEVYVCkgeworCQlpZiAobGVuIDwgMCB8fCBsZW4gPiBNQVhfUkRTX1JBRElPX1RFWFQpIHsKIAkJCXJ2YWwgPSAtRVJBTkdFOwogCQkJZ290byBleGl0OwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2ZpbnRlay1jaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvZmludGVrLWNpci5jCmluZGV4IDhmYTUzOWQuLjdmNzA3OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvZmludGVrLWNpci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvZmludGVrLWNpci5jCkBAIC01OTcsMTIgKzU5NywxNyBAQAogc3RhdGljIGludCBmaW50ZWtfc3VzcGVuZChzdHJ1Y3QgcG5wX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBmaW50ZWtfZGV2ICpmaW50ZWsgPSBwbnBfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWZpdF9kYmcoIiVzIGNhbGxlZCIsIF9fZnVuY19fKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZmaW50ZWstPmZpbnRla19sb2NrLCBmbGFncyk7CisKIAkvKiBkaXNhYmxlIGFsbCBDSVIgaW50ZXJydXB0cyAqLwogCWZpbnRla19jaXJfcmVnX3dyaXRlKGZpbnRlaywgQ0lSX1NUQVRVU19JUlFfTUFTSywgQ0lSX1NUQVRVUyk7CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW50ZWstPmZpbnRla19sb2NrLCBmbGFncyk7CisKIAlmaW50ZWtfY29uZmlnX21vZGVfZW5hYmxlKGZpbnRlayk7CiAKIAkvKiBkaXNhYmxlIGNpciBsb2dpY2FsIGRldiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMgYi9kcml2ZXJzL21lZGlhL3JjL2ltb24uYwppbmRleCAzZjNjNzA3Li42YmMzNWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2ltb24uYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2ltb24uYwpAQCAtMzA3LDYgKzMwNywxNCBAQAogCS8qIDB4ZmZkYyBpTU9OIE1DRSBWRkQgKi8KIAl7IDB4MDAwMTAwMDBmZmZmZmZlZWxsLCBLRVlfVk9MVU1FVVAgfSwKIAl7IDB4MDEwMDAwMDBmZmZmZmZlZWxsLCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwMDAwMDAwMWZmZmZmZmVlbGwsIEtFWV9NVVRFIH0sCisJeyAweDAwMDAwMDBmZmZmZmZmZWVsbCwgS0VZX01FRElBIH0sCisJeyAweDAwMDAwMDEyZmZmZmZmZWVsbCwgS0VZX1VQIH0sCisJeyAweDAwMDAwMDEzZmZmZmZmZWVsbCwgS0VZX0RPV04gfSwKKwl7IDB4MDAwMDAwMTRmZmZmZmZlZWxsLCBLRVlfTEVGVCB9LAorCXsgMHgwMDAwMDAxNWZmZmZmZmVlbGwsIEtFWV9SSUdIVCB9LAorCXsgMHgwMDAwMDAxNmZmZmZmZmVlbGwsIEtFWV9FTlRFUiB9LAorCXsgMHgwMDAwMDAxN2ZmZmZmZmVlbGwsIEtFWV9FU0MgfSwKIAkvKiBpTU9OIEtub2IgdmFsdWVzICovCiAJeyAweDAwMDEwMGZmZmZmZmZmZWVsbCwgS0VZX1ZPTFVNRVVQIH0sCiAJeyAweDAxMDAwMGZmZmZmZmZmZWVsbCwgS0VZX1ZPTFVNRURPV04gfSwKQEAgLTE1ODIsMTYgKzE1OTAsMTYgQEAKIAkvKiBPbmx5IHBhbmVsIHR5cGUgZXZlbnRzIGxlZnQgdG8gcHJvY2VzcyBub3cgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWN0eC0+a2NfbG9jaywgZmxhZ3MpOwogCisJZG9fZ2V0dGltZW9mZGF5KCZ0KTsKIAkvKiBLRVlfTVVURSByZXBlYXRzIGZyb20ga25vYiBuZWVkIHRvIGJlIHN1cHByZXNzZWQgKi8KIAlpZiAoaWN0eC0+a2MgPT0gS0VZX01VVEUgJiYgaWN0eC0+a2MgPT0gaWN0eC0+bGFzdF9rZXljb2RlKSB7Ci0JCWRvX2dldHRpbWVvZmRheSgmdCk7CiAJCW1zZWMgPSB0djJpbnQoJnQsICZwcmV2X3RpbWUpOwotCQlwcmV2X3RpbWUgPSB0OwogCQlpZiAobXNlYyA8IGljdHgtPmlkZXYtPnJlcFtSRVBfREVMQVldKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpY3R4LT5rY19sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CisJcHJldl90aW1lID0gdDsKIAlrYyA9IGljdHgtPmtjOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWN0eC0+a2NfbG9jaywgZmxhZ3MpOwpAQCAtMTYwMyw3ICsxNjExLDkgQEAKIAlpbnB1dF9yZXBvcnRfa2V5KGljdHgtPmlkZXYsIGtjLCAwKTsKIAlpbnB1dF9zeW5jKGljdHgtPmlkZXYpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmljdHgtPmtjX2xvY2ssIGZsYWdzKTsKIAlpY3R4LT5sYXN0X2tleWNvZGUgPSBrYzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpY3R4LT5rY19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm47CiAKQEAgLTE3NDAsNiArMTc1MCw4IEBACiAJCWRldGVjdGVkX2Rpc3BsYXlfdHlwZSA9IElNT05fRElTUExBWV9UWVBFX1ZGRDsKIAkJYnJlYWs7CiAJLyogaU1PTiBWRkQsIE1DRSBJUiAqLworCWNhc2UgMHg0NjoKKwljYXNlIDB4N2U6CiAJY2FzZSAweDllOgogCQlkZXZfaW5mbyhpY3R4LT5kZXYsICIweGZmZGMgaU1PTiBWRkQsIE1DRSBJUiIpOwogCQlkZXRlY3RlZF9kaXNwbGF5X3R5cGUgPSBJTU9OX0RJU1BMQVlfVFlQRV9WRkQ7CkBAIC0xNzU1LDYgKzE3NjcsOSBAQAogCQlkZXZfaW5mbyhpY3R4LT5kZXYsICJVbmtub3duIDB4ZmZkYyBkZXZpY2UsICIKIAkJCSAiZGVmYXVsdGluZyB0byBWRkQgYW5kIGlNT04gSVIiKTsKIAkJZGV0ZWN0ZWRfZGlzcGxheV90eXBlID0gSU1PTl9ESVNQTEFZX1RZUEVfVkZEOworCQkvKiBXZSBkb24ndCBrbm93IHdoaWNoIG9uZSBpdCBpcywgYWxsb3cgdXNlciB0byBzZXQgdGhlCisJCSAqIFJDNiBvbmUgZnJvbSB1c2Vyc3BhY2UgaWYgT1RIRVIgd2Fzbid0IGNvcnJlY3QuICovCisJCWFsbG93ZWRfcHJvdG9zIHw9IFJDX1RZUEVfUkM2OwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLXJhdy5jCmluZGV4IDExYzE5ZDguLjQyM2VkNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pci1yYXcuYwpAQCAtMTE0LDE4ICsxMTQsMjAgQEAKIAlzNjQJCQlkZWx0YTsgLyogbnMgKi8KIAlERUZJTkVfSVJfUkFXX0VWRU5UKGV2KTsKIAlpbnQJCQlyYyA9IDA7CisJaW50CQkJZGVsYXk7CiAKIAlpZiAoIWRldi0+cmF3KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW5vdyA9IGt0aW1lX2dldCgpOwogCWRlbHRhID0ga3RpbWVfdG9fbnMoa3RpbWVfc3ViKG5vdywgZGV2LT5yYXctPmxhc3RfZXZlbnQpKTsKKwlkZWxheSA9IE1TX1RPX05TKGRldi0+aW5wdXRfZGV2LT5yZXBbUkVQX0RFTEFZXSk7CiAKIAkvKiBDaGVjayBmb3IgYSBsb25nIGR1cmF0aW9uIHNpbmNlIGxhc3QgZXZlbnQgb3IgaWYgd2UncmUKIAkgKiBiZWluZyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBub3RlIHRoYXQgZGVsdGEgY2FuJ3QKIAkgKiBwb3NzaWJseSBiZSBuZWdhdGl2ZS4KIAkgKi8KLQlpZiAoZGVsdGEgPiBJUl9NQVhfRFVSQVRJT04gfHwgIWRldi0+cmF3LT5sYXN0X3R5cGUpCisJaWYgKGRlbHRhID4gZGVsYXkgfHwgIWRldi0+cmF3LT5sYXN0X3R5cGUpCiAJCXR5cGUgfD0gSVJfU1RBUlRfRVZFTlQ7CiAJZWxzZQogCQlldi5kdXJhdGlvbiA9IGRlbHRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuYwppbmRleCBlNzE2YjkzLi5kMjAxNjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuYwpAQCAtNDIsNyArNDIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPG1lZGlhL3JjLWNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgIml0ZS1jaXIuaCIKIApAQCAtMTM0Nyw2ICsxMzQ2LDcgQEAKIAl7CS8qIDA6IElURTg3MDQgKi8KIAkgICAgICAgLm1vZGVsID0gIklURTg3MDQgQ0lSIHRyYW5zY2VpdmVyIiwKIAkgICAgICAgLmlvX3JlZ2lvbl9zaXplID0gSVQ4N19JT1JFR19MRU5HVEgsCisJICAgICAgIC5pb19yc3JjX25vID0gMCwKIAkgICAgICAgLmh3X3R4X2NhcGFibGUgPSB0cnVlLAogCSAgICAgICAuc2FtcGxlX3BlcmlvZCA9ICh1MzIpICgxMDAwMDAwMDAwVUxMIC8gMTE1MjAwKSwKIAkgICAgICAgLnR4X2NhcnJpZXJfZnJlcSA9IDM4MDAwLApAQCAtMTM3MSw2ICsxMzcxLDcgQEAKIAl7CS8qIDE6IElURTg3MTMgKi8KIAkgICAgICAgLm1vZGVsID0gIklURTg3MTMgQ0lSIHRyYW5zY2VpdmVyIiwKIAkgICAgICAgLmlvX3JlZ2lvbl9zaXplID0gSVQ4N19JT1JFR19MRU5HVEgsCisJICAgICAgIC5pb19yc3JjX25vID0gMCwKIAkgICAgICAgLmh3X3R4X2NhcGFibGUgPSB0cnVlLAogCSAgICAgICAuc2FtcGxlX3BlcmlvZCA9ICh1MzIpICgxMDAwMDAwMDAwVUxMIC8gMTE1MjAwKSwKIAkgICAgICAgLnR4X2NhcnJpZXJfZnJlcSA9IDM4MDAwLApAQCAtMTM5NSw2ICsxMzk2LDcgQEAKIAl7CS8qIDI6IElURTg3MDggKi8KIAkgICAgICAgLm1vZGVsID0gIklURTg3MDggQ0lSIHRyYW5zY2VpdmVyIiwKIAkgICAgICAgLmlvX3JlZ2lvbl9zaXplID0gSVQ4NzA4X0lPUkVHX0xFTkdUSCwKKwkgICAgICAgLmlvX3JzcmNfbm8gPSAwLAogCSAgICAgICAuaHdfdHhfY2FwYWJsZSA9IHRydWUsCiAJICAgICAgIC5zYW1wbGVfcGVyaW9kID0gKHUzMikgKDEwMDAwMDAwMDBVTEwgLyAxMTUyMDApLAogCSAgICAgICAudHhfY2Fycmllcl9mcmVxID0gMzgwMDAsCkBAIC0xNDIwLDYgKzE0MjIsNyBAQAogCXsJLyogMzogSVRFODcwOSAqLwogCSAgICAgICAubW9kZWwgPSAiSVRFODcwOSBDSVIgdHJhbnNjZWl2ZXIiLAogCSAgICAgICAuaW9fcmVnaW9uX3NpemUgPSBJVDg3MDlfSU9SRUdfTEVOR1RILAorCSAgICAgICAuaW9fcnNyY19ubyA9IDIsCiAJICAgICAgIC5od190eF9jYXBhYmxlID0gdHJ1ZSwKIAkgICAgICAgLnNhbXBsZV9wZXJpb2QgPSAodTMyKSAoMTAwMDAwMDAwMFVMTCAvIDExNTIwMCksCiAJICAgICAgIC50eF9jYXJyaWVyX2ZyZXEgPSAzODAwMCwKQEAgLTE0NjEsNiArMTQ2NCw3IEBACiAJc3RydWN0IHJjX2RldiAqcmRldiA9IE5VTEw7CiAJaW50IHJldCA9IC1FTk9NRU07CiAJaW50IG1vZGVsX25vOworCWludCBpb19yc3JjX25vOwogCiAJaXRlX2RiZygiJXMgY2FsbGVkIiwgX19mdW5jX18pOwogCkBAIC0xNDkwLDEwICsxNDk0LDExIEBACiAKIAkvKiBnZXQgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZGV2aWNlICovCiAJZGV2X2Rlc2MgPSAmaXRlX2Rldl9kZXNjc1ttb2RlbF9ub107CisJaW9fcnNyY19ubyA9IGRldl9kZXNjLT5pb19yc3JjX25vOwogCiAJLyogdmFsaWRhdGUgcG5wIHJlc291cmNlcyAqLwotCWlmICghcG5wX3BvcnRfdmFsaWQocGRldiwgMCkgfHwKLQkgICAgcG5wX3BvcnRfbGVuKHBkZXYsIDApICE9IGRldl9kZXNjLT5pb19yZWdpb25fc2l6ZSkgeworCWlmICghcG5wX3BvcnRfdmFsaWQocGRldiwgaW9fcnNyY19ubykgfHwKKwkgICAgcG5wX3BvcnRfbGVuKHBkZXYsIGlvX3JzcmNfbm8pICE9IGRldl9kZXNjLT5pb19yZWdpb25fc2l6ZSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJUiBQTlAgUG9ydCBub3QgdmFsaWQhXG4iKTsKIAkJZ290byBmYWlsdXJlOwogCX0KQEAgLTE1MDQsNyArMTUwOSw3IEBACiAJfQogCiAJLyogc3RvcmUgcmVzb3VyY2UgdmFsdWVzICovCi0JaXRkZXYtPmNpcl9hZGRyID0gcG5wX3BvcnRfc3RhcnQocGRldiwgMCk7CisJaXRkZXYtPmNpcl9hZGRyID0gcG5wX3BvcnRfc3RhcnQocGRldiwgaW9fcnNyY19ubyk7CiAJaXRkZXYtPmNpcl9pcnEgPSBwbnBfaXJxKHBkZXYsIDApOwogCiAJLyogaW5pdGlhbGl6ZSBzcGlubG9ja3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5oIGIvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmgKaW5kZXggMTZhMTlmNS4uYWE4OTlhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmgKQEAgLTU3LDYgKzU3LDkgQEAKIAkvKiBzaXplIG9mIHRoZSBJL08gcmVnaW9uICovCiAJaW50IGlvX3JlZ2lvbl9zaXplOwogCisJLyogSVIgcG5wIEkvTyByZXNvdXJjZSBudW1iZXIgKi8KKwlpbnQgaW9fcnNyY19ubzsKKwogCS8qIHRydWUgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIHRyYW5zbWlzc2lvbiAqLwogCWJvb2wgaHdfdHhfY2FwYWJsZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpbm5hY2xlLXBjdHYtaGQuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waW5uYWNsZS1wY3R2LWhkLmMKaW5kZXggYmIxMGZmZS4uOGQ1NThhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpbm5hY2xlLXBjdHYtaGQuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtcGN0di1oZC5jCkBAIC0xNSw0MyArMTUsMzkgQEAKIC8qIFBpbm5hY2xlIFBDVFYgSEQgODAwaSBtaW5pIHJlbW90ZSAqLwogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBwaW5uYWNsZV9wY3R2X2hkW10gPSB7Ci0KLQl7IDB4MGYsIEtFWV8xIH0sCi0JeyAweDE1LCBLRVlfMiB9LAotCXsgMHgxMCwgS0VZXzMgfSwKLQl7IDB4MTgsIEtFWV80IH0sCi0JeyAweDFiLCBLRVlfNSB9LAotCXsgMHgxZSwgS0VZXzYgfSwKLQl7IDB4MTEsIEtFWV83IH0sCi0JeyAweDIxLCBLRVlfOCB9LAotCXsgMHgxMiwgS0VZXzkgfSwKLQl7IDB4MjcsIEtFWV8wIH0sCi0KLQl7IDB4MjQsIEtFWV9aT09NIH0sCi0JeyAweDJhLCBLRVlfU1VCVElUTEUgfSwKLQotCXsgMHgwMCwgS0VZX01VVEUgfSwKLQl7IDB4MDEsIEtFWV9FTlRFUiB9LAkvKiBQaW5uYWNsZSBMb2dvICovCi0JeyAweDM5LCBLRVlfUE9XRVIgfSwKLQotCXsgMHgwMywgS0VZX1ZPTFVNRVVQIH0sCi0JeyAweDA5LCBLRVlfVk9MVU1FRE9XTiB9LAotCXsgMHgwNiwgS0VZX0NIQU5ORUxVUCB9LAotCXsgMHgwYywgS0VZX0NIQU5ORUxET1dOIH0sCi0KLQl7IDB4MmQsIEtFWV9SRVdJTkQgfSwKLQl7IDB4MzAsIEtFWV9QTEFZUEFVU0UgfSwKLQl7IDB4MzMsIEtFWV9GQVNURk9SV0FSRCB9LAotCXsgMHgzYywgS0VZX1NUT1AgfSwKLQl7IDB4MzYsIEtFWV9SRUNPUkQgfSwKLQl7IDB4M2YsIEtFWV9FUEcgfSwJLyogTGFiZWxlZCAiPyIgKi8KKwkvKiBLZXkgY29kZXMgZm9yIHRoZSB0aW55IFBpbm5hY2xlIHJlbW90ZSovCisJeyAweDA3MDAsIEtFWV9NVVRFIH0sCisJeyAweDA3MDEsIEtFWV9NRU5VIH0sIC8qIFBpbm5hY2xlIGxvZ28gKi8KKwl7IDB4MDczOSwgS0VZX1BPV0VSIH0sCisJeyAweDA3MDMsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgwNzA5LCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwNzA2LCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDA3MGMsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHgwNzBmLCBLRVlfMSB9LAorCXsgMHgwNzE1LCBLRVlfMiB9LAorCXsgMHgwNzEwLCBLRVlfMyB9LAorCXsgMHgwNzE4LCBLRVlfNCB9LAorCXsgMHgwNzFiLCBLRVlfNSB9LAorCXsgMHgwNzFlLCBLRVlfNiB9LAorCXsgMHgwNzExLCBLRVlfNyB9LAorCXsgMHgwNzIxLCBLRVlfOCB9LAorCXsgMHgwNzEyLCBLRVlfOSB9LAorCXsgMHgwNzI3LCBLRVlfMCB9LAorCXsgMHgwNzI0LCBLRVlfWk9PTSB9LCAvKiAnU3F1YXJlJyBrZXkgKi8KKwl7IDB4MDcyYSwgS0VZX1NVQlRJVExFIH0sICAgLyogJ1QnIGtleSAqLworCXsgMHgwNzJkLCBLRVlfUkVXSU5EIH0sCisJeyAweDA3MzAsIEtFWV9QTEFZUEFVU0UgfSwKKwl7IDB4MDczMywgS0VZX0ZBU1RGT1JXQVJEIH0sCisJeyAweDA3MzYsIEtFWV9SRUNPUkQgfSwKKwl7IDB4MDczYywgS0VZX1NUT1AgfSwKKwl7IDB4MDczZiwgS0VZX0hFTFAgfSwgLyogJz8nIGtleSAqLwogfTsKIAogc3RhdGljIHN0cnVjdCByY19tYXBfbGlzdCBwaW5uYWNsZV9wY3R2X2hkX21hcCA9IHsKIAkubWFwID0gewogCQkuc2NhbiAgICA9IHBpbm5hY2xlX3BjdHZfaGQsCiAJCS5zaXplICAgID0gQVJSQVlfU0laRShwaW5uYWNsZV9wY3R2X2hkKSwKLQkJLnJjX3R5cGUgPSBSQ19UWVBFX1VOS05PV04sCS8qIExlZ2FjeSBJUiB0eXBlICovCisJCS5yY190eXBlID0gUkNfVFlQRV9SQzUsCiAJCS5uYW1lICAgID0gUkNfTUFQX1BJTk5BQ0xFX1BDVFZfSEQsCiAJfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbGlyY19kZXYuYyBiL2RyaXZlcnMvbWVkaWEvcmMvbGlyY19kZXYuYwppbmRleCBmZDIzN2FiLi4yNzk5N2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2xpcmNfZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9saXJjX2Rldi5jCkBAIC01NSw2ICs1NSw4IEBACiAJc3RydWN0IGxpcmNfYnVmZmVyICpidWY7CiAJdW5zaWduZWQgaW50IGNodW5rX3NpemU7CiAKKwlzdHJ1Y3QgY2RldiAqY2RldjsKKwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIAlsb25nIGppZmZpZXNfdG9fd2FpdDsKIH07CkBAIC02Miw3ICs2NCw2IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKGxpcmNfZGV2X2xvY2spOwogCiBzdGF0aWMgc3RydWN0IGlyY3RsICppcmN0bHNbTUFYX0lSQ1RMX0RFVklDRVNdOwotc3RhdGljIHN0cnVjdCBjZGV2IGNkZXZzW01BWF9JUkNUTF9ERVZJQ0VTXTsKIAogLyogT25seSB1c2VkIGZvciBzeXNmcyBidXQgZGVmaW5lZCB0byB2b2lkIG90aGVyd2lzZSAqLwogc3RhdGljIHN0cnVjdCBjbGFzcyAqbGlyY19jbGFzczsKQEAgLTE2Nyw5ICsxNjgsMTMgQEAKIAogc3RhdGljIGludCBsaXJjX2NkZXZfYWRkKHN0cnVjdCBpcmN0bCAqaXIpCiB7Ci0JaW50IHJldHZhbDsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKIAlzdHJ1Y3QgbGlyY19kcml2ZXIgKmQgPSAmaXItPmQ7Ci0Jc3RydWN0IGNkZXYgKmNkZXYgPSAmY2RldnNbZC0+bWlub3JdOworCXN0cnVjdCBjZGV2ICpjZGV2OworCisJY2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpjZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZGV2KQorCQlnb3RvIGVycl9vdXQ7CiAKIAlpZiAoZC0+Zm9wcykgewogCQljZGV2X2luaXQoY2RldiwgZC0+Zm9wcyk7CkBAIC0xODAsMTIgKzE4NSwyMCBAQAogCX0KIAlyZXR2YWwgPSBrb2JqZWN0X3NldF9uYW1lKCZjZGV2LT5rb2JqLCAibGlyYyVkIiwgZC0+bWlub3IpOwogCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisJCWdvdG8gZXJyX291dDsKIAogCXJldHZhbCA9IGNkZXZfYWRkKGNkZXYsIE1LREVWKE1BSk9SKGxpcmNfYmFzZV9kZXYpLCBkLT5taW5vciksIDEpOwotCWlmIChyZXR2YWwpCisJaWYgKHJldHZhbCkgewogCQlrb2JqZWN0X3B1dCgmY2Rldi0+a29iaik7CisJCWdvdG8gZXJyX291dDsKKwl9CiAKKwlpci0+Y2RldiA9IGNkZXY7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlrZnJlZShjZGV2KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yMTQsNyArMjI3LDcgQEAKIAlpZiAoTUFYX0lSQ1RMX0RFVklDRVMgPD0gZC0+bWlub3IpIHsKIAkJZGV2X2VycihkLT5kZXYsICJsaXJjX2RldjogbGlyY19yZWdpc3Rlcl9kcml2ZXI6ICIKIAkJCSJcIm1pbm9yXCIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICVkICglZCkhXG4iLAotCQkJTUFYX0lSQ1RMX0RFVklDRVMtMSwgZC0+bWlub3IpOworCQkJTUFYX0lSQ1RMX0RFVklDRVMgLSAxLCBkLT5taW5vcik7CiAJCWVyciA9IC1FQkFEUlFDOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zNjksNyArMzgyLDcgQEAKIAogCWlmIChtaW5vciA8IDAgfHwgbWlub3IgPj0gTUFYX0lSQ1RMX0RFVklDRVMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJsaXJjX2RldjogJXM6IG1pbm9yICglZCkgbXVzdCBiZSBiZXR3ZWVuICIKLQkJICAgICAgICIwIGFuZCAlZCFcbiIsIF9fZnVuY19fLCBtaW5vciwgTUFYX0lSQ1RMX0RFVklDRVMtMSk7CisJCSAgICAgICAiMCBhbmQgJWQhXG4iLCBfX2Z1bmNfXywgbWlub3IsIE1BWF9JUkNUTF9ERVZJQ0VTIC0gMSk7CiAJCXJldHVybiAtRUJBRFJRQzsKIAl9CiAKQEAgLTM4MCw3ICszOTMsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQljZGV2ID0gJmNkZXZzW21pbm9yXTsKKwljZGV2ID0gaXItPmNkZXY7CiAKIAltdXRleF9sb2NrKCZsaXJjX2Rldl9sb2NrKTsKIApAQCAtNDEwLDYgKzQyMyw3IEBACiAJfSBlbHNlIHsKIAkJbGlyY19pcmN0bF9jbGVhbnVwKGlyKTsKIAkJY2Rldl9kZWwoY2Rldik7CisJCWtmcmVlKGNkZXYpOwogCQlrZnJlZShpcik7CiAJCWlyY3Rsc1ttaW5vcl0gPSBOVUxMOwogCX0KQEAgLTQ1Myw3ICs0NjcsNyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCWNkZXYgPSAmY2RldnNbaW1pbm9yKGlub2RlKV07CisJY2RldiA9IGlyLT5jZGV2OwogCWlmICh0cnlfbW9kdWxlX2dldChjZGV2LT5vd25lcikpIHsKIAkJaXItPm9wZW4rKzsKIAkJcmV0dmFsID0gaXItPmQuc2V0X3VzZV9pbmMoaXItPmQuZGF0YSk7CkBAIC00ODQsMTMgKzQ5OCwxNSBAQAogaW50IGxpcmNfZGV2X2ZvcF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgaXJjdGwgKmlyID0gaXJjdGxzW2ltaW5vcihpbm9kZSldOwotCXN0cnVjdCBjZGV2ICpjZGV2ID0gJmNkZXZzW2ltaW5vcihpbm9kZSldOworCXN0cnVjdCBjZGV2ICpjZGV2OwogCiAJaWYgKCFpcikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYWxsZWQgd2l0aCBpbnZhbGlkIGlyY3RsXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWNkZXYgPSBpci0+Y2RldjsKKwogCWRldl9kYmcoaXItPmQuZGV2LCBMT0dIRUFEICJjbG9zZSBjYWxsZWRcbiIsIGlyLT5kLm5hbWUsIGlyLT5kLm1pbm9yKTsKIAogCVdBUk5fT04obXV0ZXhfbG9ja19raWxsYWJsZSgmbGlyY19kZXZfbG9jaykpOwpAQCAtNTAzLDYgKzUxOSw3IEBACiAJCWxpcmNfaXJjdGxfY2xlYW51cChpcik7CiAJCWNkZXZfZGVsKGNkZXYpOwogCQlpcmN0bHNbaXItPmQubWlub3JdID0gTlVMTDsKKwkJa2ZyZWUoY2Rldik7CiAJCWtmcmVlKGlyKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMgYi9kcml2ZXJzL21lZGlhL3JjL21jZXVzYi5jCmluZGV4IGFkOTI3ZmMuLmVjOTcyZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9tY2V1c2IuYwpAQCAtMTA4LDYgKzEwOCwxMiBAQAogc3RhdGljIGludCBkZWJ1ZzsKICNlbmRpZgogCisjZGVmaW5lIG1jZV9kYmcoZGV2LCBmbXQsIC4uLikJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaWYgKGRlYnVnKQkJCQkJXAorCQkJZGV2X2luZm8oZGV2LCBmbXQsICMjIF9fVkFfQVJHU19fKTsJXAorCX0gd2hpbGUgKDApCisKIC8qIGdlbmVyYWwgY29uc3RhbnRzICovCiAjZGVmaW5lIFNFTkRfRkxBR19JTl9QUk9HUkVTUwkxCiAjZGVmaW5lIFNFTkRfRkxBR19DT01QTEVURQkyCkBAIC0yNDYsNiArMjUyLDkgQEAKIAkgIC5kcml2ZXJfaW5mbyA9IE1DRV9HRU4yX1RYX0lOViB9LAogCS8qIFNNSyBlSG9tZSBJbmZyYXJlZCBUcmFuc2NlaXZlciAqLwogCXsgVVNCX0RFVklDRShWRU5ET1JfU01LLCAweDAzMzgpIH0sCisJLyogU01LL0ktTyBEYXRhIEdWLU1DNy9SQ0tJVCBSZWNlaXZlciAqLworCXsgVVNCX0RFVklDRShWRU5ET1JfU01LLCAweDAzNTMpLAorCSAgLmRyaXZlcl9pbmZvID0gTUNFX0dFTjJfTk9fVFggfSwKIAkvKiBUYXR1bmcgZUhvbWUgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgKi8KIAl7IFVTQl9ERVZJQ0UoVkVORE9SX1RBVFVORywgMHg5MTUwKSB9LAogCS8qIFNodXR0bGUgZUhvbWUgSW5mcmFyZWQgVHJhbnNjZWl2ZXIgKi8KQEAgLTU0OSw5ICs1NTgsMTAgQEAKIAkJCQkgaW5vdXQsIGRhdGExKTsKIAkJCWJyZWFrOwogCQljYXNlIE1DRV9DTURfU19USU1FT1VUOgotCQkJLyogdmFsdWUgaXMgaW4gdW5pdHMgb2YgNTB1cywgc28geCo1MC8xMDAgb3IgeC8yIG1zICovCisJCQkvKiB2YWx1ZSBpcyBpbiB1bml0cyBvZiA1MHVzLCBzbyB4KjUwLzEwMDAgbXMgKi8KIAkJCWRldl9pbmZvKGRldiwgIiVzIHJlY2VpdmUgdGltZW91dCBvZiAlZCBtc1xuIiwKLQkJCQkgaW5vdXQsICgoZGF0YTEgPDwgOCkgfCBkYXRhMikgLyAyKTsKKwkJCQkgaW5vdXQsCisJCQkJICgoZGF0YTEgPDwgOCkgfCBkYXRhMikgKiBNQ0VfVElNRV9VTklUIC8gMTAwMCk7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0VfQ01EX0dfVElNRU9VVDoKIAkJCWRldl9pbmZvKGRldiwgIkdldCByZWNlaXZlIHRpbWVvdXRcbiIpOwpAQCAtNjA2LDEyICs2MTYsMTUgQEAKIAlpZiAoaXIpIHsKIAkJbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCi0JCWRldl9kYmcoaXItPmRldiwgImNhbGxiYWNrIGNhbGxlZCAoc3RhdHVzPSVkIGxlbj0lZClcbiIsCisJCW1jZV9kYmcoaXItPmRldiwgImNhbGxiYWNrIGNhbGxlZCAoc3RhdHVzPSVkIGxlbj0lZClcbiIsCiAJCQl1cmItPnN0YXR1cywgbGVuKTsKIAogCQltY2V1c2JfZGV2X3ByaW50ZGF0YShpciwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIDAsIGxlbiwgdHJ1ZSk7CiAJfQogCisJLyogdGhlIHRyYW5zZmVyIGJ1ZmZlciBhbmQgdXJiIHdlcmUgYWxsb2NhdGVkIGluIG1jZV9yZXF1ZXN0X3BhY2tldCAqLworCWtmcmVlKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwl1c2JfZnJlZV91cmIodXJiKTsKIH0KIAogLyogcmVxdWVzdCBpbmNvbWluZyBvciBzZW5kIG91dGdvaW5nIHVzYiBwYWNrZXQgLSB1c2VkIHRvIGluaXRpYWxpemUgcmVtb3RlICovCkBAIC02NTUsMTcgKzY2OCwxNyBAQAogCQlyZXR1cm47CiAJfQogCi0JZGV2X2RiZyhkZXYsICJyZWNlaXZlIHJlcXVlc3QgY2FsbGVkIChzaXplPSUjeClcbiIsIHNpemUpOworCW1jZV9kYmcoZGV2LCAicmVjZWl2ZSByZXF1ZXN0IGNhbGxlZCAoc2l6ZT0lI3gpXG4iLCBzaXplKTsKIAogCWFzeW5jX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHNpemU7CiAJYXN5bmNfdXJiLT5kZXYgPSBpci0+dXNiZGV2OwogCiAJcmVzID0gdXNiX3N1Ym1pdF91cmIoYXN5bmNfdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmVzKSB7Ci0JCWRldl9kYmcoZGV2LCAicmVjZWl2ZSByZXF1ZXN0IEZBSUxFRCEgKHJlcz0lZClcbiIsIHJlcyk7CisJCW1jZV9kYmcoZGV2LCAicmVjZWl2ZSByZXF1ZXN0IEZBSUxFRCEgKHJlcz0lZClcbiIsIHJlcyk7CiAJCXJldHVybjsKIAl9Ci0JZGV2X2RiZyhkZXYsICJyZWNlaXZlIHJlcXVlc3QgY29tcGxldGUgKHJlcz0lZClcbiIsIHJlcyk7CisJbWNlX2RiZyhkZXYsICJyZWNlaXZlIHJlcXVlc3QgY29tcGxldGUgKHJlcz0lZClcbiIsIHJlcyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1jZV9hc3luY19vdXQoc3RydWN0IG1jZXVzYl9kZXYgKmlyLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKQEAgLTY3Myw5ICs2ODYsOSBAQAogCW1jZV9yZXF1ZXN0X3BhY2tldChpciwgZGF0YSwgc2l6ZSwgTUNFVVNCX1RYKTsKIH0KIAotc3RhdGljIHZvaWQgbWNlX3N5bmNfaW4oc3RydWN0IG1jZXVzYl9kZXYgKmlyLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKK3N0YXRpYyB2b2lkIG1jZV9mbHVzaF9yeF9idWZmZXIoc3RydWN0IG1jZXVzYl9kZXYgKmlyLCBpbnQgc2l6ZSkKIHsKLQltY2VfcmVxdWVzdF9wYWNrZXQoaXIsIGRhdGEsIHNpemUsIE1DRVVTQl9SWCk7CisJbWNlX3JlcXVlc3RfcGFja2V0KGlyLCBOVUxMLCBzaXplLCBNQ0VVU0JfUlgpOwogfQogCiAvKiBTZW5kIGRhdGEgb3V0IHRoZSBJUiBibGFzdGVyIHBvcnQocykgKi8KQEAgLTc5NCw3ICs4MDcsNyBAQAogCQkJaXItPmNhcnJpZXIgPSBjYXJyaWVyOwogCQkJY21kYnVmWzJdID0gTUNFX0NNRF9TSUdfRU5EOwogCQkJY21kYnVmWzNdID0gTUNFX0lSREFUQV9UUkFJTEVSOwotCQkJZGV2X2RiZyhpci0+ZGV2LCAiJXM6IGRpc2FibGluZyBjYXJyaWVyICIKKwkJCW1jZV9kYmcoaXItPmRldiwgIiVzOiBkaXNhYmxpbmcgY2FycmllciAiCiAJCQkJIm1vZHVsYXRpb25cbiIsIF9fZnVuY19fKTsKIAkJCW1jZV9hc3luY19vdXQoaXIsIGNtZGJ1Ziwgc2l6ZW9mKGNtZGJ1ZikpOwogCQkJcmV0dXJuIGNhcnJpZXI7CkBAIC04MDYsNyArODE5LDcgQEAKIAkJCQlpci0+Y2FycmllciA9IGNhcnJpZXI7CiAJCQkJY21kYnVmWzJdID0gcHJlc2NhbGVyOwogCQkJCWNtZGJ1ZlszXSA9IGRpdmlzb3I7Ci0JCQkJZGV2X2RiZyhpci0+ZGV2LCAiJXM6IHJlcXVlc3RpbmcgJXUgSFogIgorCQkJCW1jZV9kYmcoaXItPmRldiwgIiVzOiByZXF1ZXN0aW5nICV1IEhaICIKIAkJCQkJImNhcnJpZXJcbiIsIF9fZnVuY19fLCBjYXJyaWVyKTsKIAogCQkJCS8qIFRyYW5zbWl0IG5ldyBjYXJyaWVyIHRvIG1jZSBkZXZpY2UgKi8KQEAgLTgzNSw3ICs4NDgsNyBAQAogCXN3aXRjaCAoaXItPmJ1Zl9pbltpbmRleF0pIHsKIAkvKiAyLWJ5dGUgcmV0dXJuIHZhbHVlIGNvbW1hbmRzICovCiAJY2FzZSBNQ0VfQ01EX1NfVElNRU9VVDoKLQkJaXItPnJjLT50aW1lb3V0ID0gVVNfVE9fTlMoKGhpIDw8IDggfCBsbykgLyAyKTsKKwkJaXItPnJjLT50aW1lb3V0ID0gVVNfVE9fTlMoKGhpIDw8IDggfCBsbykgKiBNQ0VfVElNRV9VTklUKTsKIAkJYnJlYWs7CiAKIAkvKiAxLWJ5dGUgcmV0dXJuIHZhbHVlIGNvbW1hbmRzICovCkBAIC04NzksNyArODkyLDcgQEAKIAkJCXJhd2lyLmR1cmF0aW9uID0gKGlyLT5idWZfaW5baV0gJiBNQ0VfUFVMU0VfTUFTSykKIAkJCQkJICogVVNfVE9fTlMoTUNFX1RJTUVfVU5JVCk7CiAKLQkJCWRldl9kYmcoaXItPmRldiwgIlN0b3JpbmcgJXMgd2l0aCBkdXJhdGlvbiAlZFxuIiwKKwkJCW1jZV9kYmcoaXItPmRldiwgIlN0b3JpbmcgJXMgd2l0aCBkdXJhdGlvbiAlZFxuIiwKIAkJCQlyYXdpci5wdWxzZSA/ICJwdWxzZSIgOiAic3BhY2UiLAogCQkJCXJhd2lyLmR1cmF0aW9uKTsKIApAQCAtOTExLDcgKzkyNCw3IEBACiAJCWlmIChpci0+cGFyc2VyX3N0YXRlICE9IENNRF9IRUFERVIgJiYgIWlyLT5yZW0pCiAJCQlpci0+cGFyc2VyX3N0YXRlID0gQ01EX0hFQURFUjsKIAl9Ci0JZGV2X2RiZyhpci0+ZGV2LCAicHJvY2Vzc2VkIElSIGRhdGEsIGNhbGxpbmcgaXJfcmF3X2V2ZW50X2hhbmRsZVxuIik7CisJbWNlX2RiZyhpci0+ZGV2LCAicHJvY2Vzc2VkIElSIGRhdGEsIGNhbGxpbmcgaXJfcmF3X2V2ZW50X2hhbmRsZVxuIik7CiAJaXJfcmF3X2V2ZW50X2hhbmRsZShpci0+cmMpOwogfQogCkBAIC05MzMsNyArOTQ2LDcgQEAKIAogCWlmIChpci0+c2VuZF9mbGFncyA9PSBSRUNWX0ZMQUdfSU5fUFJPR1JFU1MpIHsKIAkJaXItPnNlbmRfZmxhZ3MgPSBTRU5EX0ZMQUdfQ09NUExFVEU7Ci0JCWRldl9kYmcoaXItPmRldiwgInNldHVwIGFuc3dlciByZWNlaXZlZCAlZCBieXRlc1xuIiwKKwkJbWNlX2RiZyhpci0+ZGV2LCAic2V0dXAgYW5zd2VyIHJlY2VpdmVkICVkIGJ5dGVzXG4iLAogCQkJYnVmX2xlbik7CiAJfQogCkBAIC05NTEsNyArOTY0LDcgQEAKIAogCWNhc2UgLUVQSVBFOgogCWRlZmF1bHQ6Ci0JCWRldl9kYmcoaXItPmRldiwgIkVycm9yOiB1cmIgc3RhdHVzID0gJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwkJbWNlX2RiZyhpci0+ZGV2LCAiRXJyb3I6IHVyYiBzdGF0dXMgPSAlZFxuIiwgdXJiLT5zdGF0dXMpOwogCQlicmVhazsKIAl9CiAKQEAgLTk2MSw3ICs5NzQsNiBAQAogc3RhdGljIHZvaWQgbWNldXNiX2dlbjFfaW5pdChzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCiB7CiAJaW50IHJldDsKLQlpbnQgbWF4cCA9IGlyLT5sZW5faW47CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaXItPmRldjsKIAljaGFyICpkYXRhOwogCkBAIC05NzgsOCArOTkwLDggQEAKIAlyZXQgPSB1c2JfY29udHJvbF9tc2coaXItPnVzYmRldiwgdXNiX3JjdmN0cmxwaXBlKGlyLT51c2JkZXYsIDApLAogCQkJICAgICAgVVNCX1JFUV9TRVRfQUREUkVTUywgVVNCX1RZUEVfVkVORE9SLCAwLCAwLAogCQkJICAgICAgZGF0YSwgVVNCX0NUUkxfTVNHX1NaLCBIWiAqIDMpOwotCWRldl9kYmcoZGV2LCAiJXMgLSByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JZGV2X2RiZyhkZXYsICIlcyAtIGRhdGFbMF0gPSAlZCwgZGF0YVsxXSA9ICVkXG4iLAorCW1jZV9kYmcoZGV2LCAiJXMgLSByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJbWNlX2RiZyhkZXYsICIlcyAtIGRhdGFbMF0gPSAlZCwgZGF0YVsxXSA9ICVkXG4iLAogCQlfX2Z1bmNfXywgZGF0YVswXSwgZGF0YVsxXSk7CiAKIAkvKiBzZXQgZmVhdHVyZTogYml0IHJhdGUgMzg0MDAgYnBzICovCkBAIC05ODcsNzEgKzk5OSw1NiBAQAogCQkJICAgICAgVVNCX1JFUV9TRVRfRkVBVFVSRSwgVVNCX1RZUEVfVkVORE9SLAogCQkJICAgICAgMHhjMDRlLCAweDAwMDAsIE5VTEwsIDAsIEhaICogMyk7CiAKLQlkZXZfZGJnKGRldiwgIiVzIC0gcmV0ID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOworCW1jZV9kYmcoZGV2LCAiJXMgLSByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAKIAkvKiBiUmVxdWVzdCA0OiBzZXQgY2hhciBsZW5ndGggdG8gOCBiaXRzICovCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGlyLT51c2JkZXYsIHVzYl9zbmRjdHJscGlwZShpci0+dXNiZGV2LCAwKSwKIAkJCSAgICAgIDQsIFVTQl9UWVBFX1ZFTkRPUiwKIAkJCSAgICAgIDB4MDgwOCwgMHgwMDAwLCBOVUxMLCAwLCBIWiAqIDMpOwotCWRldl9kYmcoZGV2LCAiJXMgLSByZXRCID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOworCW1jZV9kYmcoZGV2LCAiJXMgLSByZXRCID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCiAJLyogYlJlcXVlc3QgMjogc2V0IGhhbmRzaGFraW5nIHRvIHVzZSBEVFIvRFNSICovCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGlyLT51c2JkZXYsIHVzYl9zbmRjdHJscGlwZShpci0+dXNiZGV2LCAwKSwKIAkJCSAgICAgIDIsIFVTQl9UWVBFX1ZFTkRPUiwKIAkJCSAgICAgIDB4MDAwMCwgMHgwMTAwLCBOVUxMLCAwLCBIWiAqIDMpOwotCWRldl9kYmcoZGV2LCAiJXMgLSByZXRDID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOworCW1jZV9kYmcoZGV2LCAiJXMgLSByZXRDID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCiAJLyogZGV2aWNlIHJlc2V0ICovCiAJbWNlX2FzeW5jX291dChpciwgREVWSUNFX1JFU0VULCBzaXplb2YoREVWSUNFX1JFU0VUKSk7Ci0JbWNlX3N5bmNfaW4oaXIsIE5VTEwsIG1heHApOwogCiAJLyogZ2V0IGh3L3N3IHJldmlzaW9uPyAqLwogCW1jZV9hc3luY19vdXQoaXIsIEdFVF9SRVZJU0lPTiwgc2l6ZW9mKEdFVF9SRVZJU0lPTikpOwotCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKIAogCWtmcmVlKGRhdGEpOwogfTsKIAogc3RhdGljIHZvaWQgbWNldXNiX2dlbjJfaW5pdChzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCiB7Ci0JaW50IG1heHAgPSBpci0+bGVuX2luOwotCiAJLyogZGV2aWNlIHJlc2V0ICovCiAJbWNlX2FzeW5jX291dChpciwgREVWSUNFX1JFU0VULCBzaXplb2YoREVWSUNFX1JFU0VUKSk7Ci0JbWNlX3N5bmNfaW4oaXIsIE5VTEwsIG1heHApOwogCiAJLyogZ2V0IGh3L3N3IHJldmlzaW9uPyAqLwogCW1jZV9hc3luY19vdXQoaXIsIEdFVF9SRVZJU0lPTiwgc2l6ZW9mKEdFVF9SRVZJU0lPTikpOwotCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKIAogCS8qIHVua25vd24gd2hhdCB0aGUgbmV4dCB0d28gYWN0dWFsbHkgcmV0dXJuLi4uICovCiAJbWNlX2FzeW5jX291dChpciwgR0VUX1VOS05PV04sIHNpemVvZihHRVRfVU5LTk9XTikpOwotCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKIAltY2VfYXN5bmNfb3V0KGlyLCBHRVRfVU5LTk9XTjIsIHNpemVvZihHRVRfVU5LTk9XTjIpKTsKLQltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7CiB9CiAKIHN0YXRpYyB2b2lkIG1jZXVzYl9nZXRfcGFyYW1ldGVycyhzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCiB7Ci0JaW50IG1heHAgPSBpci0+bGVuX2luOwotCiAJLyogZ2V0IHRoZSBjYXJyaWVyIGFuZCBmcmVxdWVuY3kgKi8KIAltY2VfYXN5bmNfb3V0KGlyLCBHRVRfQ0FSUklFUl9GUkVRLCBzaXplb2YoR0VUX0NBUlJJRVJfRlJFUSkpOwotCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKIAotCWlmICghaXItPmZsYWdzLm5vX3R4KSB7CisJaWYgKCFpci0+ZmxhZ3Mubm9fdHgpCiAJCS8qIGdldCB0aGUgdHJhbnNtaXR0ZXIgYml0bWFzayAqLwogCQltY2VfYXN5bmNfb3V0KGlyLCBHRVRfVFhfQklUTUFTSywgc2l6ZW9mKEdFVF9UWF9CSVRNQVNLKSk7Ci0JCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKLQl9CiAKIAkvKiBnZXQgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSAqLwogCW1jZV9hc3luY19vdXQoaXIsIEdFVF9SWF9USU1FT1VULCBzaXplb2YoR0VUX1JYX1RJTUVPVVQpKTsKLQltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7CiAKIAkvKiBnZXQgcmVjZWl2ZXIgc2Vuc29yIHNldHRpbmcgKi8KIAltY2VfYXN5bmNfb3V0KGlyLCBHRVRfUlhfU0VOU09SLCBzaXplb2YoR0VUX1JYX1NFTlNPUikpOwotCW1jZV9zeW5jX2luKGlyLCBOVUxMLCBtYXhwKTsKIH0KIAogc3RhdGljIHN0cnVjdCByY19kZXYgKm1jZXVzYl9pbml0X3JjX2RldihzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCkBAIC0xMDgyLDcgKzEwNzksNyBAQAogCXJjLT5wcml2ID0gaXI7CiAJcmMtPmRyaXZlcl90eXBlID0gUkNfRFJJVkVSX0lSX1JBVzsKIAlyYy0+YWxsb3dlZF9wcm90b3MgPSBSQ19UWVBFX0FMTDsKLQlyYy0+dGltZW91dCA9IFVTX1RPX05TKDEwMDApOworCXJjLT50aW1lb3V0ID0gTVNfVE9fTlMoMTAwKTsKIAlpZiAoIWlyLT5mbGFncy5ub190eCkgewogCQlyYy0+c190eF9tYXNrID0gbWNldXNiX3NldF90eF9tYXNrOwogCQlyYy0+c190eF9jYXJyaWVyID0gbWNldXNiX3NldF90eF9jYXJyaWVyOwpAQCAtMTEyMiw3ICsxMTE5LDcgQEAKIAlib29sIHR4X21hc2tfbm9ybWFsOwogCWludCBpcl9pbnRmbnVtOwogCi0JZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisJbWNlX2RiZygmaW50Zi0+ZGV2LCAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZGVzYyAgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKIApAQCAtMTE1MCw3ICsxMTQ3LDcgQEAKIAkJCWVwX2luID0gZXA7CiAJCQllcF9pbi0+Ym1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfSU5UOwogCQkJZXBfaW4tPmJJbnRlcnZhbCA9IDE7Ci0JCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJhY2NlcHRhYmxlIGluYm91bmQgZW5kcG9pbnQgIgorCQkJbWNlX2RiZygmaW50Zi0+ZGV2LCAiYWNjZXB0YWJsZSBpbmJvdW5kIGVuZHBvaW50ICIKIAkJCQkiZm91bmRcbiIpOwogCQl9CiAKQEAgLTExNjUsMTIgKzExNjIsMTIgQEAKIAkJCWVwX291dCA9IGVwOwogCQkJZXBfb3V0LT5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ7CiAJCQllcF9vdXQtPmJJbnRlcnZhbCA9IDE7Ci0JCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJhY2NlcHRhYmxlIG91dGJvdW5kIGVuZHBvaW50ICIKKwkJCW1jZV9kYmcoJmludGYtPmRldiwgImFjY2VwdGFibGUgb3V0Ym91bmQgZW5kcG9pbnQgIgogCQkJCSJmb3VuZFxuIik7CiAJCX0KIAl9CiAJaWYgKGVwX2luID09IE5VTEwpIHsKLQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiaW5ib3VuZCBhbmQvb3IgZW5kcG9pbnQgbm90IGZvdW5kXG4iKTsKKwkJbWNlX2RiZygmaW50Zi0+ZGV2LCAiaW5ib3VuZCBhbmQvb3IgZW5kcG9pbnQgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMjE1LDE2ICsxMjEyLDE2IEBACiAJaWYgKCFpci0+cmMpCiAJCWdvdG8gcmNfZGV2X2ZhaWw7CiAKLQkvKiBmbHVzaCBidWZmZXJzIG9uIHRoZSBkZXZpY2UgKi8KLQltY2Vfc3luY19pbihpciwgTlVMTCwgbWF4cCk7Ci0JbWNlX3N5bmNfaW4oaXIsIE5VTEwsIG1heHApOwotCiAJLyogd2lyZSB1cCBpbmJvdW5kIGRhdGEgaGFuZGxlciAqLwogCXVzYl9maWxsX2ludF91cmIoaXItPnVyYl9pbiwgZGV2LCBwaXBlLCBpci0+YnVmX2luLAogCQltYXhwLCAodXNiX2NvbXBsZXRlX3QpIG1jZXVzYl9kZXZfcmVjdiwgaXIsIGVwX2luLT5iSW50ZXJ2YWwpOwogCWlyLT51cmJfaW4tPnRyYW5zZmVyX2RtYSA9IGlyLT5kbWFfaW47CiAJaXItPnVyYl9pbi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKKwkvKiBmbHVzaCBidWZmZXJzIG9uIHRoZSBkZXZpY2UgKi8KKwltY2VfZGJnKCZpbnRmLT5kZXYsICJGbHVzaGluZyByZWNlaXZlIGJ1ZmZlcnNcbiIpOworCW1jZV9mbHVzaF9yeF9idWZmZXIoaXIsIG1heHApOworCiAJLyogaW5pdGlhbGl6ZSBkZXZpY2UgKi8KIAlpZiAoaXItPmZsYWdzLm1pY3Jvc29mdF9nZW4xKQogCQltY2V1c2JfZ2VuMV9pbml0KGlyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuYwppbmRleCBiZjMwNjBlLi5jZTU5NWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL251dm90b24tY2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9udXZvdG9uLWNpci5jCkBAIC05OTEsNyArOTkxLDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm52dC0+bnZ0X2xvY2ssIGZsYWdzKTsKLQludnQtPmluX3VzZSA9IHRydWU7CiAJbnZ0X2VuYWJsZV9jaXIobnZ0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZudnQtPm52dF9sb2NrLCBmbGFncyk7CiAKQEAgLTEwMDQsNyArMTAwMyw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZudnQtPm52dF9sb2NrLCBmbGFncyk7Ci0JbnZ0LT5pbl91c2UgPSBmYWxzZTsKIAludnRfZGlzYWJsZV9jaXIobnZ0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZudnQtPm52dF9sb2NrLCBmbGFncyk7CiB9CkBAIC0xMTEyLDcgKzExMTAsNyBAQAogCXJkZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCXJkZXYtPmRyaXZlcl9uYW1lID0gTlZUX0RSSVZFUl9OQU1FOwogCXJkZXYtPm1hcF9uYW1lID0gUkNfTUFQX1JDNl9NQ0U7Ci0JcmRldi0+dGltZW91dCA9IFVTX1RPX05TKDEwMDApOworCXJkZXYtPnRpbWVvdXQgPSBNU19UT19OUygxMDApOwogCS8qIHJ4IHJlc29sdXRpb24gaXMgaGFyZHdpcmVkIHRvIDUwdXMgYXRtLCAxLCAyNSwgMTAwIGFsc28gcG9zc2libGUgKi8KIAlyZGV2LT5yeF9yZXNvbHV0aW9uID0gVVNfVE9fTlMoQ0lSX1NBTVBMRV9QRVJJT0QpOwogI2lmIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuaCBiL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuaAppbmRleCAzNzk3OTVkLi4xMjQxZmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL251dm90b24tY2lyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9udXZvdG9uLWNpci5oCkBAIC03MCw3ICs3MCw2IEBACiAJc3RydWN0IGlyX3Jhd19ldmVudCByYXdpcjsKIAogCXNwaW5sb2NrX3QgbnZ0X2xvY2s7Ci0JYm9vbCBpbl91c2U7CiAKIAkvKiBmb3IgcnggKi8KIAl1OCBidWZbUlhfQlVGX0xFTl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JjLW1haW4uYyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCmluZGV4IGY1N2NkNTYuLjMxODZhYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCkBAIC01MjIsMTggKzUyMiwyMCBAQAogLyoqCiAgKiBpcl9kb19rZXl1cCgpIC0gaW50ZXJuYWwgZnVuY3Rpb24gdG8gc2lnbmFsIHRoZSByZWxlYXNlIG9mIGEga2V5cHJlc3MKICAqIEBkZXY6CXRoZSBzdHJ1Y3QgcmNfZGV2IGRlc2NyaXB0b3Igb2YgdGhlIGRldmljZQorICogQHN5bmM6CXdoZXRoZXIgb3Igbm90IHRvIGNhbGwgaW5wdXRfc3luYwogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHJlbGVhc2UgYSBrZXlwcmVzcywgaXQgbXVzdCBiZQogICogY2FsbGVkIHdpdGgga2V5bG9jayBoZWxkLgogICovCi1zdGF0aWMgdm9pZCBpcl9kb19rZXl1cChzdHJ1Y3QgcmNfZGV2ICpkZXYpCitzdGF0aWMgdm9pZCBpcl9kb19rZXl1cChzdHJ1Y3QgcmNfZGV2ICpkZXYsIGJvb2wgc3luYykKIHsKIAlpZiAoIWRldi0+a2V5cHJlc3NlZCkKIAkJcmV0dXJuOwogCiAJSVJfZHByaW50aygxLCAia2V5dXAga2V5IDB4JTA0eFxuIiwgZGV2LT5sYXN0X2tleWNvZGUpOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LT5pbnB1dF9kZXYsIGRldi0+bGFzdF9rZXljb2RlLCAwKTsKLQlpbnB1dF9zeW5jKGRldi0+aW5wdXRfZGV2KTsKKwlpZiAoc3luYykKKwkJaW5wdXRfc3luYyhkZXYtPmlucHV0X2Rldik7CiAJZGV2LT5rZXlwcmVzc2VkID0gZmFsc2U7CiB9CiAKQEAgLTU0OSw3ICs1NTEsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5rZXlsb2NrLCBmbGFncyk7Ci0JaXJfZG9fa2V5dXAoZGV2KTsKKwlpcl9kb19rZXl1cChkZXYsIHRydWUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+a2V5bG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmNfa2V5dXApOwpAQCAtNTc4LDcgKzU4MCw3IEBACiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+a2V5bG9jaywgZmxhZ3MpOwogCWlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGRldi0+a2V5dXBfamlmZmllcykpCi0JCWlyX2RvX2tleXVwKGRldik7CisJCWlyX2RvX2tleXVwKGRldiwgdHJ1ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5rZXlsb2NrLCBmbGFncyk7CiB9CiAKQEAgLTU5Nyw2ICs1OTksNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmtleWxvY2ssIGZsYWdzKTsKIAogCWlucHV0X2V2ZW50KGRldi0+aW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19TQ0FOLCBkZXYtPmxhc3Rfc2NhbmNvZGUpOworCWlucHV0X3N5bmMoZGV2LT5pbnB1dF9kZXYpOwogCiAJaWYgKCFkZXYtPmtleXByZXNzZWQpCiAJCWdvdG8gb3V0OwpAQCAtNjIyLDI5ICs2MjUsMjggQEAKIHN0YXRpYyB2b2lkIGlyX2RvX2tleWRvd24oc3RydWN0IHJjX2RldiAqZGV2LCBpbnQgc2NhbmNvZGUsCiAJCQkgIHUzMiBrZXljb2RlLCB1OCB0b2dnbGUpCiB7CisJYm9vbCBuZXdfZXZlbnQgPSAhZGV2LT5rZXlwcmVzc2VkIHx8CisJCQkgZGV2LT5sYXN0X3NjYW5jb2RlICE9IHNjYW5jb2RlIHx8CisJCQkgZGV2LT5sYXN0X3RvZ2dsZSAhPSB0b2dnbGU7CisKKwlpZiAobmV3X2V2ZW50ICYmIGRldi0+a2V5cHJlc3NlZCkKKwkJaXJfZG9fa2V5dXAoZGV2LCBmYWxzZSk7CisKIAlpbnB1dF9ldmVudChkZXYtPmlucHV0X2RldiwgRVZfTVNDLCBNU0NfU0NBTiwgc2NhbmNvZGUpOwogCi0JLyogUmVwZWF0IGV2ZW50PyAqLwotCWlmIChkZXYtPmtleXByZXNzZWQgJiYKLQkgICAgZGV2LT5sYXN0X3NjYW5jb2RlID09IHNjYW5jb2RlICYmCi0JICAgIGRldi0+bGFzdF90b2dnbGUgPT0gdG9nZ2xlKQotCQlyZXR1cm47CisJaWYgKG5ld19ldmVudCAmJiBrZXljb2RlICE9IEtFWV9SRVNFUlZFRCkgeworCQkvKiBSZWdpc3RlciBhIGtleXByZXNzICovCisJCWRldi0+a2V5cHJlc3NlZCA9IHRydWU7CisJCWRldi0+bGFzdF9zY2FuY29kZSA9IHNjYW5jb2RlOworCQlkZXYtPmxhc3RfdG9nZ2xlID0gdG9nZ2xlOworCQlkZXYtPmxhc3Rfa2V5Y29kZSA9IGtleWNvZGU7CiAKLQkvKiBSZWxlYXNlIG9sZCBrZXlwcmVzcyAqLwotCWlyX2RvX2tleXVwKGRldik7CisJCUlSX2RwcmludGsoMSwgIiVzOiBrZXkgZG93biBldmVudCwgIgorCQkJICAgImtleSAweCUwNHgsIHNjYW5jb2RlIDB4JTA0eFxuIiwKKwkJCSAgIGRldi0+aW5wdXRfbmFtZSwga2V5Y29kZSwgc2NhbmNvZGUpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldi0+aW5wdXRfZGV2LCBrZXljb2RlLCAxKTsKKwl9CiAKLQlkZXYtPmxhc3Rfc2NhbmNvZGUgPSBzY2FuY29kZTsKLQlkZXYtPmxhc3RfdG9nZ2xlID0gdG9nZ2xlOwotCWRldi0+bGFzdF9rZXljb2RlID0ga2V5Y29kZTsKLQotCWlmIChrZXljb2RlID09IEtFWV9SRVNFUlZFRCkKLQkJcmV0dXJuOwotCi0JLyogUmVnaXN0ZXIgYSBrZXlwcmVzcyAqLwotCWRldi0+a2V5cHJlc3NlZCA9IHRydWU7Ci0JSVJfZHByaW50aygxLCAiJXM6IGtleSBkb3duIGV2ZW50LCBrZXkgMHglMDR4LCBzY2FuY29kZSAweCUwNHhcbiIsCi0JCSAgIGRldi0+aW5wdXRfbmFtZSwga2V5Y29kZSwgc2NhbmNvZGUpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LT5pbnB1dF9kZXYsIGRldi0+bGFzdF9rZXljb2RlLCAxKTsKIAlpbnB1dF9zeW5jKGRldi0+aW5wdXRfZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jCmluZGV4IGE5N2NmMjcuLjgzNGE0ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMKQEAgLTM0NzQsNyArMzQ3NCw3IEBACiAJaWYgKDAgIT0gdC0+aW5kZXgpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYnR0dl9jYWxsX2FsbChidHYsIHR1bmVyLCBnX3R1bmVyLCB0KTsKKwlidHR2X2NhbGxfYWxsKGJ0diwgdHVuZXIsIHNfdHVuZXIsIHQpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYwppbmRleCAxOTMzZDRkLi5lODAxMzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMKQEAgLTY5NSwxNCArNjk1LDEwIEBACiAKIAljeDE4X2NhbGxfYWxsKGN4LCB0dW5lciwgZ190dW5lciwgdnQpOwogCi0JaWYgKHRlc3RfYml0KENYMThfRl9JX1JBRElPX1VTRVIsICZjeC0+aV9mbGFncykpIHsKKwlpZiAodnQtPnR5cGUgPT0gVjRMMl9UVU5FUl9SQURJTykKIAkJc3RybGNweSh2dC0+bmFtZSwgImN4MTggUmFkaW8gVHVuZXIiLCBzaXplb2YodnQtPm5hbWUpKTsKLQkJdnQtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCX0gZWxzZSB7CisJZWxzZQogCQlzdHJsY3B5KHZ0LT5uYW1lLCAiY3gxOCBUViBUdW5lciIsIHNpemVvZih2dC0+bmFtZSkpOwotCQl2dC0+dHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCX0KLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYwppbmRleCAyMzU0MzM2Li45MzQxODVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPG1lZGlhL2N4MjU4NDAuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPHN0YWdpbmcvYWx0ZXJhLmg+CiAKKyNpbmNsdWRlICIuLi8uLi8uLi9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuaCIKICNpbmNsdWRlICJjeDIzODg1LmgiCiAjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCiAjaW5jbHVkZSAibmV0dXAtaW5pdC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jCmluZGV4IDY0ZDliMjEuLjQxOTc3N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMKQEAgLTIwNjAsMTIgKzIwNjAsOCBAQAogCQlnb3RvIGZhaWxfaXJxOwogCX0KIAotCWlmICghcGNpX2VuYWJsZV9tc2kocGNpX2RldikpCi0JCWVyciA9IHJlcXVlc3RfaXJxKHBjaV9kZXYtPmlycSwgY3gyMzg4NV9pcnEsCi0JCQkJICBJUlFGX0RJU0FCTEVELCBkZXYtPm5hbWUsIGRldik7Ci0JZWxzZQotCQllcnIgPSByZXF1ZXN0X2lycShwY2lfZGV2LT5pcnEsIGN4MjM4ODVfaXJxLAotCQkJCSAgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCBkZXYtPm5hbWUsIGRldik7CisJZXJyID0gcmVxdWVzdF9pcnEocGNpX2Rldi0+aXJxLCBjeDIzODg1X2lycSwKKwkJCSAgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCBkZXYtPm5hbWUsIGRldik7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZ2V0IElSUSAlZFxuIiwKIAkJICAgICAgIGRldi0+bmFtZSwgcGNpX2Rldi0+aXJxKTsKQEAgLTIxMTQsNyArMjExMCw2IEBACiAKIAkvKiB1bnJlZ2lzdGVyIHN0dWZmICovCiAJZnJlZV9pcnEocGNpX2Rldi0+aXJxLCBkZXYpOwotCXBjaV9kaXNhYmxlX21zaShwY2lfZGV2KTsKIAogCWN4MjM4ODVfZGV2X3VucmVnaXN0ZXIoZGV2KTsKIAl2NGwyX2RldmljZV91bnJlZ2lzdGVyKHY0bDJfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZi5jCmluZGV4IDlmM2JmYzEuLmFmOTY4MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWYuYwpAQCAtNDIyLDcgKzQyMiw3IEBACiAJaWYgKCFyZXMpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JcmVzX2xlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJcmVzX2xlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAogCXJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNfbGVuLCByZXMtPm5hbWUpOwogCWlmICghcmVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jb2Fyc2VfZXhwb19hdXRvZ2Fpbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jb2Fyc2VfZXhwb19hdXRvZ2Fpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2I5ZDk0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29hcnNlX2V4cG9fYXV0b2dhaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogQXV0byBnYWluIGFsZ29yaXRobSBmb3IgY2FtZXJhJ3Mgd2l0aCBhIGNvYXJzZSBleHBvc3VyZSBjb250cm9sCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLS8qIEF1dG9nYWluICsgZXhwb3N1cmUgYWxnb3JpdGhtIGZvciBjYW1lcmFzIHdpdGggYSBjb2Fyc2UgZXhwb3N1cmUgY29udHJvbAotICAgKHVzdWFsbHkgdGhpcyBtZWFucyB3ZSBjYW4gb25seSBjb250cm9sIHRoZSBjbG9ja2RpdiB0byBjaGFuZ2UgZXhwb3N1cmUpCi0gICBBcyBjaGFuZ2luZyB0aGUgY2xvY2tkaXYgc28gdGhhdCB0aGUgZnBzIGRyb3BzIGZyb20gMzAgdG8gMTUgZnBzIGZvcgotICAgZXhhbXBsZSwgd2lsbCBsZWFkIHRvIGEgaHVnZSBleHBvc3VyZSBjaGFuZ2UgKGl0IGVmZmVjdGl2ZWx5IGRvdWJsZXMpLAotICAgdGhpcyBhbGdvcml0aG0gbm9ybWFsbHkgdHJpZXMgdG8gb25seSBhZGp1c3QgdGhlIGdhaW4gKGJldHdlZW4gNDAgYW5kCi0gICA4MCAlKSBhbmQgaWYgdGhhdCBkb2VzIG5vdCBoZWxwLCBvbmx5IHRoZW4gY2hhbmdlcyBleHBvc3VyZS4gVGhpcyBsZWFkcwotICAgdG8gYSBtdWNoIG1vcmUgc3RhYmxlIGltYWdlIHRoZW4gdXNpbmcgdGhlIGtuZWUgYWxnb3JpdGhtIHdoaWNoIGF0Ci0gICBjZXJ0YWluIHBvaW50cyBvZiB0aGUga25lZSBncmFwaCB3aWxsIG9ubHkgdHJ5IHRvIGFkanVzdCBleHBvc3VyZSwKLSAgIHdoaWNoIGxlYWRzIHRvIG9zY2lsYXRpbmcgYXMgb25lIGV4cG9zdXJlIHN0ZXAgaXMgaHVnZS4KLQotICAgTm90ZSB0aGlzIGFzc3VtZXMgdGhhdCB0aGUgc2Qgc3RydWN0IGZvciB0aGUgY2FtIGluIHF1ZXN0aW9uIGhhcwotICAgZXhwX3Rvb19oaWdoX2NudCBhbmQgZXhwX3Rvb19oaWdoX2NudCBpbnQgbWVtYmVycyBmb3IgdXNlIGJ5IHRoaXMgZnVuY3Rpb24uCi0KLSAgIFJldHVybnMgMCBpZiBubyBjaGFuZ2VzIHdlcmUgbWFkZSwgMSBpZiB0aGUgZ2FpbiBhbmQgb3IgZXhwb3N1cmUgc2V0dGluZ3MKLSAgIHdoZXJlIGNoYW5nZWQuICovCi1zdGF0aWMgaW50IGdzcGNhX2NvYXJzZV9ncmFpbmVkX2V4cG9fYXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCWludCBhdmdfbHVtLCBpbnQgZGVzaXJlZF9hdmdfbHVtLCBpbnQgZGVhZHpvbmUpCi17Ci0JaW50IGksIHN0ZXBzLCBnYWluLCBvcmlnX2dhaW4sIGV4cG9zdXJlLCBvcmlnX2V4cG9zdXJlOwotCWludCBnYWluX2xvdywgZ2Fpbl9oaWdoOwotCWNvbnN0IHN0cnVjdCBjdHJsICpnYWluX2N0cmwgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBjdHJsICpleHBvc3VyZV9jdHJsID0gTlVMTDsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZ3NwY2FfZGV2LT5zZF9kZXNjLT5uY3RybHM7IGkrKykgewotCQlpZiAoZ3NwY2FfZGV2LT5jdHJsX2RpcyAmICgxIDw8IGkpKQotCQkJY29udGludWU7Ci0JCWlmIChnc3BjYV9kZXYtPnNkX2Rlc2MtPmN0cmxzW2ldLnFjdHJsLmlkID09IFY0TDJfQ0lEX0dBSU4pCi0JCQlnYWluX2N0cmwgPSAmZ3NwY2FfZGV2LT5zZF9kZXNjLT5jdHJsc1tpXTsKLQkJaWYgKGdzcGNhX2Rldi0+c2RfZGVzYy0+Y3RybHNbaV0ucWN0cmwuaWQgPT0gVjRMMl9DSURfRVhQT1NVUkUpCi0JCQlleHBvc3VyZV9jdHJsID0gJmdzcGNhX2Rldi0+c2RfZGVzYy0+Y3RybHNbaV07Ci0JfQotCWlmICghZ2Fpbl9jdHJsIHx8ICFleHBvc3VyZV9jdHJsKSB7Ci0JCVBERUJVRyhEX0VSUiwgIkVycm9yOiBnc3BjYV9jb2Fyc2VfZ3JhaW5lZF9leHBvX2F1dG9nYWluICIKLQkJCSJjYWxsZWQgb24gY2FtIHdpdGhvdXQgZ2FpbiBvciBleHBvc3VyZSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoZ2Fpbl9jdHJsLT5nZXQoZ3NwY2FfZGV2LCAmZ2FpbikgfHwKLQkgICAgZXhwb3N1cmVfY3RybC0+Z2V0KGdzcGNhX2RldiwgJmV4cG9zdXJlKSkKLQkJcmV0dXJuIDA7Ci0KLQlvcmlnX2dhaW4gPSBnYWluOwotCW9yaWdfZXhwb3N1cmUgPSBleHBvc3VyZTsKLQlnYWluX2xvdyA9Ci0JCShnYWluX2N0cmwtPnFjdHJsLm1heGltdW0gLSBnYWluX2N0cmwtPnFjdHJsLm1pbmltdW0pIC8gNSAqIDI7Ci0JZ2Fpbl9sb3cgKz0gZ2Fpbl9jdHJsLT5xY3RybC5taW5pbXVtOwotCWdhaW5faGlnaCA9Ci0JCShnYWluX2N0cmwtPnFjdHJsLm1heGltdW0gLSBnYWluX2N0cmwtPnFjdHJsLm1pbmltdW0pIC8gNSAqIDQ7Ci0JZ2Fpbl9oaWdoICs9IGdhaW5fY3RybC0+cWN0cmwubWluaW11bTsKLQotCS8qIElmIHdlIGFyZSBvZiBhIG11bHRpcGxlIG9mIGRlYWR6b25lLCBkbyBtdWx0aXBsZSBzdGVwcyB0byByZWFjaCB0aGUKLQkgICBkZXNpcmVkIGx1bWluYXRpb24gZmFzdCAod2l0aCB0aGUgcmlzYyBvZiBhIHNsaWdodCBvdmVyc2hvb3QpICovCi0Jc3RlcHMgPSAoZGVzaXJlZF9hdmdfbHVtIC0gYXZnX2x1bSkgLyBkZWFkem9uZTsKLQotCVBERUJVRyhEX0ZSQU0sICJhdXRvZ2FpbjogbHVtOiAlZCwgZGVzaXJlZDogJWQsIHN0ZXBzOiAlZCIsCi0JCWF2Z19sdW0sIGRlc2lyZWRfYXZnX2x1bSwgc3RlcHMpOwotCi0JaWYgKChnYWluICsgc3RlcHMpID4gZ2Fpbl9oaWdoICYmCi0JICAgIHNkLT5leHBvc3VyZSA8IGV4cG9zdXJlX2N0cmwtPnFjdHJsLm1heGltdW0pIHsKLQkJZ2FpbiA9IGdhaW5faGlnaDsKLQkJc2QtPmV4cF90b29fbG93X2NudCsrOwotCX0gZWxzZSBpZiAoKGdhaW4gKyBzdGVwcykgPCBnYWluX2xvdyAmJgotCQkgICBzZC0+ZXhwb3N1cmUgPiBleHBvc3VyZV9jdHJsLT5xY3RybC5taW5pbXVtKSB7Ci0JCWdhaW4gPSBnYWluX2xvdzsKLQkJc2QtPmV4cF90b29faGlnaF9jbnQrKzsKLQl9IGVsc2UgewotCQlnYWluICs9IHN0ZXBzOwotCQlpZiAoZ2FpbiA+IGdhaW5fY3RybC0+cWN0cmwubWF4aW11bSkKLQkJCWdhaW4gPSBnYWluX2N0cmwtPnFjdHJsLm1heGltdW07Ci0JCWVsc2UgaWYgKGdhaW4gPCBnYWluX2N0cmwtPnFjdHJsLm1pbmltdW0pCi0JCQlnYWluID0gZ2Fpbl9jdHJsLT5xY3RybC5taW5pbXVtOwotCQlzZC0+ZXhwX3Rvb19oaWdoX2NudCA9IDA7Ci0JCXNkLT5leHBfdG9vX2xvd19jbnQgPSAwOwotCX0KLQotCWlmIChzZC0+ZXhwX3Rvb19oaWdoX2NudCA+IDMpIHsKLQkJZXhwb3N1cmUtLTsKLQkJc2QtPmV4cF90b29faGlnaF9jbnQgPSAwOwotCX0gZWxzZSBpZiAoc2QtPmV4cF90b29fbG93X2NudCA+IDMpIHsKLQkJZXhwb3N1cmUrKzsKLQkJc2QtPmV4cF90b29fbG93X2NudCA9IDA7Ci0JfQotCi0JaWYgKGdhaW4gIT0gb3JpZ19nYWluKSB7Ci0JCWdhaW5fY3RybC0+c2V0KGdzcGNhX2RldiwgZ2Fpbik7Ci0JCXJldHZhbCA9IDE7Ci0JfQotCWlmIChleHBvc3VyZSAhPSBvcmlnX2V4cG9zdXJlKSB7Ci0JCWV4cG9zdXJlX2N0cmwtPnNldChnc3BjYV9kZXYsIGV4cG9zdXJlKTsKLQkJcmV0dmFsID0gMTsKLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jCmluZGV4IDM2YTQ2ZmMuLjA1N2UyODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMKQEAgLTYwOSw3ICs2MDksNyBAQAogICogYnVmZmVycywgdGhlcmUgYXJlIHNvbWUgcHJldHR5IHN0cmljdCByZWFsIHRpbWUgY29uc3RyYWludHMgZm9yCiAgKiBpc29jaHJvbm91cyB0cmFuc2ZlciBmb3IgbGFyZ2VyIGZyYW1lIHNpemVzKS4KICAqLwotLypqZm06IHRoaXMgdmFsdWUgd29ya3Mgd2VsbCBmb3IgMTYwMHgxMjAwLCBidXQgbm90IDgwMHg2MDAgLSBzZWUgaXNvY19pbml0ICovCisvKmpmbTogdGhpcyB2YWx1ZSBkb2VzIG5vdCB3b3JrIGZvciA4MDB4NjAwIC0gc2VlIGlzb2NfaW5pdCAqLwogI2RlZmluZSBPVkZYMl9CVUxLX1NJWkUgKDEzICogNDA5NikKIAogLyogSTJDIHJlZ2lzdGVycyAqLwpAQCAtMzMwNyw2ICszMzA3LDcgQEAKIAogCWdzcGNhX2Rldi0+Y2FtLmN0cmxzID0gc2QtPmN0cmxzOwogCXNkLT5xdWFsaXR5ID0gUVVBTElUWV9ERUY7CisJc2QtPmZyYW1lX3JhdGUgPSAxNTsKIAogCXJldHVybiAwOwogfQpAQCAtMzQ2OSw3ICszNDcwLDYgQEAKIAkJCQlBUlJBWV9TSVpFKGluaXRfNTE5X292NzY2MCkpOwogCQl3cml0ZV9pMmNfcmVndmFscyhzZCwgbm9ybV83NjYwLCBBUlJBWV9TSVpFKG5vcm1fNzY2MCkpOwogCQlzZC0+Z3NwY2FfZGV2LmN1cnJfbW9kZSA9IDE7CS8qIDY0MHg0ODAgKi8KLQkJc2QtPmZyYW1lX3JhdGUgPSAxNTsKIAkJb3Y1MTlfc2V0X21vZGUoc2QpOwogCQlvdjUxOV9zZXRfZnIoc2QpOwogCQlzZC0+Y3RybHNbQ09MT1JTXS5tYXggPSA0OwkvKiAwLi40ICovCkBAIC0zNTExLDcgKzM1MTEsNyBAQAogCiAJc3dpdGNoIChzZC0+YnJpZGdlKSB7CiAJY2FzZSBCUklER0VfT1ZGWDI6Ci0JCWlmIChnc3BjYV9kZXYtPndpZHRoID09IDE2MDApCisJCWlmIChnc3BjYV9kZXYtPndpZHRoICE9IDgwMCkKIAkJCWdzcGNhX2Rldi0+Y2FtLmJ1bGtfc2l6ZSA9IE9WRlgyX0JVTEtfU0laRTsKIAkJZWxzZQogCQkJZ3NwY2FfZGV2LT5jYW0uYnVsa19zaXplID0gNyAqIDQwOTY7CkBAIC00NDc4LDcgKzQ0NzgsNyBAQAogCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKIAogCS8qIEEgc2hvcnQgcmVhZCBzaWduYWxzIEVPRiAqLwotCWlmIChsZW4gPCBPVkZYMl9CVUxLX1NJWkUpIHsKKwlpZiAobGVuIDwgZ3NwY2FfZGV2LT5jYW0uYnVsa19zaXplKSB7CiAJCS8qIElmIHRoZSBmcmFtZSBpcyBzaG9ydCwgYW5kIGl0IGlzIG9uZSBvZiB0aGUgZmlyc3Qgb25lcwogCQkgICB0aGUgc2Vuc29yIGFuZCBicmlkZ2UgYXJlIHN0aWxsIHN5bmNpbmcsIHNvIGRyb3AgaXQuICovCiAJCWlmIChzZC0+Zmlyc3RfZnJhbWUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhqLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4ai5jCmluZGV4IDY0MTVhZmYuLjgxYjhhNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhqLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGouYwpAQCAtNjAsNyArNjAsNyBAQAogCiAJdTMyIHBrdHN6OwkJCS8qICh1c2VkIGJ5IHBrdF9zY2FuKSAqLwogCXUxNiBucGt0OwotCXU4IG5jaGc7CisJczggbmNoZzsKIAlzOCBzaG9ydF9tYXJrOwogCiAJdTggcXVhbGl0eTsJCQkvKiBpbWFnZSBxdWFsaXR5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9oZGNzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9oZGNzLmgKaW5kZXggYjUzOGRjZS4uYTE0YTg0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfaGRjcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X2hkY3MuaApAQCAtMTI1LDcgKzEyNSw3IEBACiAjZGVmaW5lIEhEQ1NfU0xFRVBfTU9ERQkJKDEgPDwgMSkKIAogI2RlZmluZSBIRENTX0RFRkFVTFRfRVhQT1NVUkUJNDgKLSNkZWZpbmUgSERDU19ERUZBVUxUX0dBSU4JMTI4CisjZGVmaW5lIEhEQ1NfREVGQVVMVF9HQUlOCTUwCiAKIHN0YXRpYyBpbnQgaGRjc19wcm9iZV8xeDAwKHN0cnVjdCBzZCAqc2QpOwogc3RhdGljIGludCBoZGNzX3Byb2JlXzEwMjAoc3RydWN0IHNkICpzZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCmluZGV4IGE0ZTRkZmQuLjBmYjc1NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCkBAIC0xMzI4LDYgKzEzMjgsOCBAQAogCWlmICghaXR2LT5oYXNfY3gyMzQxNSkKIAkJd3JpdGVfcmVnX3N5bmMoMHgwMywgSVZUVl9SRUdfRE1BQ09OVFJPTCk7CiAKKwlpdnR2X3Nfc3RkX2VuYyhpdHYsICZpdHYtPnR1bmVyX3N0ZCk7CisKIAkvKiBEZWZhdWx0IGludGVycnVwdHMgZW5hYmxlZC4gRm9yIHRoZSBQVlIzNTAgdGhpcyBpbmNsdWRlcyB0aGUKIAkgICBkZWNvZGVyIFZTWU5DIGludGVycnVwdCwgd2hpY2ggaXMgYWx3YXlzIG9uLiBJdCBpcyBub3Qgb25seSB1c2VkCiAJICAgZHVyaW5nIGRlY29kaW5nIGJ1dCBhbHNvIGJ5IHRoZSBPU0QuCkBAIC0xMzM2LDEyICsxMzM4LDEwIEBACiAJaWYgKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpIHsKIAkJaXZ0dl9jbGVhcl9pcnFfbWFzayhpdHYsIElWVFZfSVJRX01BU0tfSU5JVCB8IElWVFZfSVJRX0RFQ19WU1lOQyk7CiAJCWl2dHZfc2V0X29zZF9hbHBoYShpdHYpOwotCX0KLQllbHNlCisJCWl2dHZfc19zdGRfZGVjKGl0diwgJml0di0+dHVuZXJfc3RkKTsKKwl9IGVsc2UgewogCQlpdnR2X2NsZWFyX2lycV9tYXNrKGl0diwgSVZUVl9JUlFfTUFTS19JTklUKTsKLQotCS8qIEZvciBjYXJkcyB3aXRoIHZpZGVvIG91dCwgdGhpcyBjYWxsIG5lZWRzIGludGVycnVwdHMgZW5hYmxlZCAqLwotCWl2dHZfc19zdGQoTlVMTCwgJmZoLCAmaXR2LT50dW5lcl9zdGQpOworCX0KIAogCS8qIFNldHVwIGluaXRpYWwgY29udHJvbHMgKi8KIAljeDIzNDF4X2hhbmRsZXJfc2V0dXAoJml0di0+Y3hoZGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlybXdhcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpcm13YXJlLmMKaW5kZXggMTRhMWNlYS4uMDJjNWFkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlybXdhcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maXJtd2FyZS5jCkBAIC0yODAsOCArMjgwLDYgQEAKIHsKIAlpbnQgcmMgPSAwOwogCXY0bDJfc3RkX2lkIHN0ZDsKLQlzdHJ1Y3QgaXZ0dl9vcGVuX2lkIGZoOwotCWZoLml0diA9IGl0djsKIAogCWlmIChpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKQogCQkvKiBEaXNwbGF5IHRlc3QgaW1hZ2UgZHVyaW5nIHJlc3RhcnQgKi8KQEAgLTMwMSwxNCArMjk5LDE5IEBACiAJLyogQWxsb3cgc2V0dGluZ3MgdG8gcmVsb2FkICovCiAJaXZ0dl9tYWlsYm94X2NhY2hlX2ludmFsaWRhdGUoaXR2KTsKIAotCS8qIFJlc3RvcmUgdmlkZW8gc3RhbmRhcmQgKi8KKwkvKiBSZXN0b3JlIGVuY29kZXIgdmlkZW8gc3RhbmRhcmQgKi8KIAlzdGQgPSBpdHYtPnN0ZDsKIAlpdHYtPnN0ZCA9IDA7Ci0JaXZ0dl9zX3N0ZChOVUxMLCAmZmgsICZzdGQpOworCWl2dHZfc19zdGRfZW5jKGl0diwgJnN0ZCk7CiAKIAlpZiAoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkgewogCQlpdnR2X2luaXRfbXBlZ19kZWNvZGVyKGl0dik7CiAKKwkJLyogUmVzdG9yZSBkZWNvZGVyIHZpZGVvIHN0YW5kYXJkICovCisJCXN0ZCA9IGl0di0+c3RkX291dDsKKwkJaXR2LT5zdGRfb3V0ID0gMDsKKwkJaXZ0dl9zX3N0ZF9kZWMoaXR2LCAmc3RkKTsKKwogCQkvKiBSZXN0b3JlIGZyYW1lYnVmZmVyIGlmIGFjdGl2ZSAqLwogCQlpZiAoaXR2LT5pdnR2ZmJfcmVzdG9yZSkKIAkJCWl0di0+aXZ0dmZiX3Jlc3RvcmUoaXR2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jCmluZGV4IDE2ODk3ODMuLjEyMGM3ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYwpAQCAtMTA3MSwyOCArMTA3MSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpdnR2X3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgdjRsMl9zdGRfaWQgKnN0ZCkKK3ZvaWQgaXZ0dl9zX3N0ZF9lbmMoc3RydWN0IGl2dHYgKml0diwgdjRsMl9zdGRfaWQgKnN0ZCkKIHsKLQlERUZJTkVfV0FJVCh3YWl0KTsKLQlzdHJ1Y3QgaXZ0diAqaXR2ID0gZmgyaWQoZmgpLT5pdHY7Ci0Jc3RydWN0IHl1dl9wbGF5YmFja19pbmZvICp5aSA9ICZpdHYtPnl1dl9pbmZvOwotCWludCBmOwotCi0JaWYgKCgqc3RkICYgVjRMMl9TVERfQUxMKSA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgqc3RkID09IGl0di0+c3RkKQotCQlyZXR1cm4gMDsKLQotCWlmICh0ZXN0X2JpdChJVlRWX0ZfSV9SQURJT19VU0VSLCAmaXR2LT5pX2ZsYWdzKSB8fAotCSAgICBhdG9taWNfcmVhZCgmaXR2LT5jYXB0dXJpbmcpID4gMCB8fAotCSAgICBhdG9taWNfcmVhZCgmaXR2LT5kZWNvZGluZykgPiAwKSB7Ci0JCS8qIFN3aXRjaGluZyBzdGFuZGFyZCB3b3VsZCB0dXJuIG9mZiB0aGUgcmFkaW8gb3IgbWVzcwotCQkgICB3aXRoIGFscmVhZHkgcnVubmluZyBzdHJlYW1zLCBwcmV2ZW50IHRoYXQgYnkKLQkJICAgcmV0dXJuaW5nIEVCVVNZLiAqLwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQogCWl0di0+c3RkID0gKnN0ZDsKIAlpdHYtPmlzXzYwaHogPSAoKnN0ZCAmIFY0TDJfU1REXzUyNV82MCkgPyAxIDogMDsKIAlpdHYtPmlzXzUwaHogPSAhaXR2LT5pc182MGh6OwpAQCAtMTEwNiw0OCArMTA4Niw3OSBAQAogCWlmIChpdHYtPmh3X2ZsYWdzICYgSVZUVl9IV19DWDI1ODQwKQogCQlpdHYtPnZiaS5zbGljZWRfZGVjb2Rlcl9saW5lX3NpemUgPSBpdHYtPmlzXzYwaHogPyAyNzIgOiAyODQ7CiAKLQlJVlRWX0RFQlVHX0lORk8oIlN3aXRjaGluZyBzdGFuZGFyZCB0byAlbGx4LlxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylpdHYtPnN0ZCk7Ci0KIAkvKiBUdW5lciAqLwogCWl2dHZfY2FsbF9hbGwoaXR2LCBjb3JlLCBzX3N0ZCwgaXR2LT5zdGQpOworfQogCi0JaWYgKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpIHsKLQkJLyogc2V0IGRpc3BsYXkgc3RhbmRhcmQgKi8KLQkJaXR2LT5zdGRfb3V0ID0gKnN0ZDsKLQkJaXR2LT5pc19vdXRfNjBoeiA9IGl0di0+aXNfNjBoejsKLQkJaXR2LT5pc19vdXRfNTBoeiA9IGl0di0+aXNfNTBoejsKLQkJaXZ0dl9jYWxsX2FsbChpdHYsIHZpZGVvLCBzX3N0ZF9vdXRwdXQsIGl0di0+c3RkX291dCk7Cit2b2lkIGl2dHZfc19zdGRfZGVjKHN0cnVjdCBpdnR2ICppdHYsIHY0bDJfc3RkX2lkICpzdGQpCit7CisJc3RydWN0IHl1dl9wbGF5YmFja19pbmZvICp5aSA9ICZpdHYtPnl1dl9pbmZvOworCURFRklORV9XQUlUKHdhaXQpOworCWludCBmOwogCi0JCS8qCi0JCSAqIFRoZSBuZXh0IGZpcm13YXJlIGNhbGwgaXMgdGltZSBzZW5zaXRpdmUuIFRpbWUgaXQgdG8KLQkJICogYXZvaWQgcmlzayBvZiBhIGhhcmQgbG9jaywgYnkgdHJ5aW5nIHRvIGVuc3VyZSB0aGUgY2FsbAotCQkgKiBoYXBwZW5zIHdpdGhpbiB0aGUgZmlyc3QgMTAwIGxpbmVzIG9mIHRoZSB0b3AgZmllbGQuCi0JCSAqIE1ha2UgNCBhdHRlbXB0cyB0byBzeW5jIHRvIHRoZSBkZWNvZGVyIGJlZm9yZSBnaXZpbmcgdXAuCi0JCSAqLwotCQlmb3IgKGYgPSAwOyBmIDwgNDsgZisrKSB7Ci0JCQlwcmVwYXJlX3RvX3dhaXQoJml0di0+dnN5bmNfd2FpdHEsICZ3YWl0LAotCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCQlpZiAoKHJlYWRfcmVnKElWVFZfUkVHX0RFQ19MSU5FX0ZJRUxEKSA+PiAxNikgPCAxMDApCi0JCQkJYnJlYWs7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoMjUpKTsKLQkJfQotCQlmaW5pc2hfd2FpdCgmaXR2LT52c3luY193YWl0cSwgJndhaXQpOworCS8qIHNldCBkaXNwbGF5IHN0YW5kYXJkICovCisJaXR2LT5zdGRfb3V0ID0gKnN0ZDsKKwlpdHYtPmlzX291dF82MGh6ID0gKCpzdGQgJiBWNEwyX1NURF81MjVfNjApID8gMSA6IDA7CisJaXR2LT5pc19vdXRfNTBoeiA9ICFpdHYtPmlzX291dF82MGh6OworCWl2dHZfY2FsbF9hbGwoaXR2LCB2aWRlbywgc19zdGRfb3V0cHV0LCBpdHYtPnN0ZF9vdXQpOwogCi0JCWlmIChmID09IDQpCi0JCQlJVlRWX1dBUk4oIk1vZGUgY2hhbmdlIGZhaWxlZCB0byBzeW5jIHRvIGRlY29kZXJcbiIpOwotCi0JCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1NFVF9TVEFOREFSRCwgMSwgaXR2LT5pc19vdXRfNTBoeik7Ci0JCWl0di0+bWFpbl9yZWN0LmxlZnQgPSBpdHYtPm1haW5fcmVjdC50b3AgPSAwOwotCQlpdHYtPm1haW5fcmVjdC53aWR0aCA9IDcyMDsKLQkJaXR2LT5tYWluX3JlY3QuaGVpZ2h0ID0gaXR2LT5jeGhkbC5oZWlnaHQ7Ci0JCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfT1NEX1NFVF9GUkFNRUJVRkZFUl9XSU5ET1csIDQsCi0JCQk3MjAsIGl0di0+bWFpbl9yZWN0LmhlaWdodCwgMCwgMCk7Ci0JCXlpLT5tYWluX3JlY3QgPSBpdHYtPm1haW5fcmVjdDsKLQkJaWYgKCFpdHYtPm9zZF9pbmZvKSB7Ci0JCQl5aS0+b3NkX2Z1bGxfdyA9IDcyMDsKLQkJCXlpLT5vc2RfZnVsbF9oID0gaXR2LT5pc19vdXRfNTBoeiA/IDU3NiA6IDQ4MDsKLQkJfQorCS8qCisJICogVGhlIG5leHQgZmlybXdhcmUgY2FsbCBpcyB0aW1lIHNlbnNpdGl2ZS4gVGltZSBpdCB0bworCSAqIGF2b2lkIHJpc2sgb2YgYSBoYXJkIGxvY2ssIGJ5IHRyeWluZyB0byBlbnN1cmUgdGhlIGNhbGwKKwkgKiBoYXBwZW5zIHdpdGhpbiB0aGUgZmlyc3QgMTAwIGxpbmVzIG9mIHRoZSB0b3AgZmllbGQuCisJICogTWFrZSA0IGF0dGVtcHRzIHRvIHN5bmMgdG8gdGhlIGRlY29kZXIgYmVmb3JlIGdpdmluZyB1cC4KKwkgKi8KKwlmb3IgKGYgPSAwOyBmIDwgNDsgZisrKSB7CisJCXByZXBhcmVfdG9fd2FpdCgmaXR2LT52c3luY193YWl0cSwgJndhaXQsCisJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAoKHJlYWRfcmVnKElWVFZfUkVHX0RFQ19MSU5FX0ZJRUxEKSA+PiAxNikgPCAxMDApCisJCQlicmVhazsKKwkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKDI1KSk7CiAJfQorCWZpbmlzaF93YWl0KCZpdHYtPnZzeW5jX3dhaXRxLCAmd2FpdCk7CisKKwlpZiAoZiA9PSA0KQorCQlJVlRWX1dBUk4oIk1vZGUgY2hhbmdlIGZhaWxlZCB0byBzeW5jIHRvIGRlY29kZXJcbiIpOworCisJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9ERUNfU0VUX1NUQU5EQVJELCAxLCBpdHYtPmlzX291dF81MGh6KTsKKwlpdHYtPm1haW5fcmVjdC5sZWZ0ID0gMDsKKwlpdHYtPm1haW5fcmVjdC50b3AgPSAwOworCWl0di0+bWFpbl9yZWN0LndpZHRoID0gNzIwOworCWl0di0+bWFpbl9yZWN0LmhlaWdodCA9IGl0di0+aXNfb3V0XzUwaHogPyA1NzYgOiA0ODA7CisJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9PU0RfU0VUX0ZSQU1FQlVGRkVSX1dJTkRPVywgNCwKKwkJNzIwLCBpdHYtPm1haW5fcmVjdC5oZWlnaHQsIDAsIDApOworCXlpLT5tYWluX3JlY3QgPSBpdHYtPm1haW5fcmVjdDsKKwlpZiAoIWl0di0+b3NkX2luZm8pIHsKKwkJeWktPm9zZF9mdWxsX3cgPSA3MjA7CisJCXlpLT5vc2RfZnVsbF9oID0gaXR2LT5pc19vdXRfNTBoeiA/IDU3NiA6IDQ4MDsKKwl9Cit9CisKK2ludCBpdnR2X3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgdjRsMl9zdGRfaWQgKnN0ZCkKK3sKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gZmgyaWQoZmgpLT5pdHY7CisKKwlpZiAoKCpzdGQgJiBWNEwyX1NURF9BTEwpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCpzdGQgPT0gaXR2LT5zdGQpCisJCXJldHVybiAwOworCisJaWYgKHRlc3RfYml0KElWVFZfRl9JX1JBRElPX1VTRVIsICZpdHYtPmlfZmxhZ3MpIHx8CisJICAgIGF0b21pY19yZWFkKCZpdHYtPmNhcHR1cmluZykgPiAwIHx8CisJICAgIGF0b21pY19yZWFkKCZpdHYtPmRlY29kaW5nKSA+IDApIHsKKwkJLyogU3dpdGNoaW5nIHN0YW5kYXJkIHdvdWxkIG1lc3Mgd2l0aCBhbHJlYWR5IHJ1bm5pbmcKKwkJICAgc3RyZWFtcywgcHJldmVudCB0aGF0IGJ5IHJldHVybmluZyBFQlVTWS4gKi8KKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlJVlRWX0RFQlVHX0lORk8oIlN3aXRjaGluZyBzdGFuZGFyZCB0byAlbGx4LlxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylpdHYtPnN0ZCk7CisKKwlpdnR2X3Nfc3RkX2VuYyhpdHYsIHN0ZCk7CisJaWYgKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpCisJCWl2dHZfc19zdGRfZGVjKGl0diwgc3RkKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMTczLDE0ICsxMTg0LDEwIEBACiAKIAlpdnR2X2NhbGxfYWxsKGl0diwgdHVuZXIsIGdfdHVuZXIsIHZ0KTsKIAotCWlmICh0ZXN0X2JpdChJVlRWX0ZfSV9SQURJT19VU0VSLCAmaXR2LT5pX2ZsYWdzKSkgeworCWlmICh2dC0+dHlwZSA9PSBWNEwyX1RVTkVSX1JBRElPKQogCQlzdHJsY3B5KHZ0LT5uYW1lLCAiaXZ0diBSYWRpbyBUdW5lciIsIHNpemVvZih2dC0+bmFtZSkpOwotCQl2dC0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXN0cmxjcHkodnQtPm5hbWUsICJpdnR2IFRWIFR1bmVyIiwgc2l6ZW9mKHZ0LT5uYW1lKSk7Ci0JCXZ0LT50eXBlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5oCmluZGV4IDU4ZjAwMzQuLjg5MTg1Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuaApAQCAtMjcsNyArMjcsOCBAQAogdm9pZCBpdnR2X3NldF9vc2RfYWxwaGEoc3RydWN0IGl2dHYgKml0dik7CiBpbnQgaXZ0dl9zZXRfc3BlZWQoc3RydWN0IGl2dHYgKml0diwgaW50IHNwZWVkKTsKIHZvaWQgaXZ0dl9zZXRfZnVuY3Moc3RydWN0IHZpZGVvX2RldmljZSAqdmRldik7Ci1pbnQgaXZ0dl9zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHY0bDJfc3RkX2lkICpzdGQpOwordm9pZCBpdnR2X3Nfc3RkX2VuYyhzdHJ1Y3QgaXZ0diAqaXR2LCB2NGwyX3N0ZF9pZCAqc3RkKTsKK3ZvaWQgaXZ0dl9zX3N0ZF9kZWMoc3RydWN0IGl2dHYgKml0diwgdjRsMl9zdGRfaWQgKnN0ZCk7CiBpbnQgaXZ0dl9zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqdmYpOwogaW50IGl2dHZfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHVuc2lnbmVkIGludCBpbnApOwogbG9uZyBpdnR2X3Y0bDJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXN0cmVhbXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXN0cmVhbXMuYwppbmRleCA5NDI2ODMzLi5lNzc5NGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1zdHJlYW1zLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtc3RyZWFtcy5jCkBAIC01ODksNyArNTg5LDcgQEAKIAkJdjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX2F1ZGlvLCBhdWRpbywgc19zdHJlYW0sIDEpOwogCQkvKiBBdm9pZCB1bnByZWRpY3RhYmxlIFBDSSBidXMgaGFuZyAtIGRpc2FibGUgdmlkZW8gY2xvY2tzICovCiAJCXY0bDJfc3ViZGV2X2NhbGwoaXR2LT5zZF92aWRlbywgdmlkZW8sIHNfc3RyZWFtLCAwKTsKLQkJaXZ0dl9tc2xlZXBfdGltZW91dCgzMDAsIDEpOworCQlpdnR2X21zbGVlcF90aW1lb3V0KDMwMCwgMCk7CiAJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX0lOSVRJQUxJWkVfSU5QVVQsIDApOwogCQl2NGwyX3N1YmRldl9jYWxsKGl0di0+c2RfdmlkZW8sIHZpZGVvLCBzX3N0cmVhbSwgMSk7CiAJfQpAQCAtODM0LDcgKzgzNCw3IEBACiAJCX0KIAogCQkvKiBIYW5kbGUgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLwotCQlpdnR2X21zbGVlcF90aW1lb3V0KDEwMCwgMSk7CisJCWl2dHZfbXNsZWVwX3RpbWVvdXQoMTAwLCAwKTsKIAl9CiAKIAlhdG9taWNfZGVjKCZpdHYtPmNhcHR1cmluZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZiaS5jCmluZGV4IGI2ZWI1MWMuLjI5M2RiODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZiaS5jCkBAIC03MSw3ICs3MSw3IEBACiAJICAgVHVybmluZyB0aGlzIHNpZ25hbCBvbiBhbmQgb2ZmIGNhbiBjb25mdXNlIGNlcnRhaW4KIAkgICBUVnMuIEFzIGZhciBhcyBJIGNhbiB0ZWxsIHRoZXJlIGlzIG5vIHJlYXNvbiBub3QgdG8KIAkgICB0cmFuc21pdCB0aGlzIHNpZ25hbC4gKi8KLQlpZiAoKGl0di0+c3RkICYgVjRMMl9TVERfNjI1XzUwKSAmJiAhZW5hYmxlZCkgeworCWlmICgoaXR2LT5zdGRfb3V0ICYgVjRMMl9TVERfNjI1XzUwKSAmJiAhZW5hYmxlZCkgewogCQllbmFibGVkID0gMTsKIAkJbW9kZSA9IDB4MDg7ICAvKiA0eDMgZnVsbCBmb3JtYXQgKi8KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0dmZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0dmZiLmMKaW5kZXggMTcyNDc0NS4uNmI3YzljOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHZmYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2ZmIuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAKIHN0YXRpYyBpbnQgaXZ0dmZiX3NldF9kaXNwbGF5X3dpbmRvdyhzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgdjRsMl9yZWN0ICppdnR2X3dpbmRvdykKIHsKLQlpbnQgb3NkX2hlaWdodF9saW1pdCA9IGl0di0+aXNfNTBoeiA/IDU3NiA6IDQ4MDsKKwlpbnQgb3NkX2hlaWdodF9saW1pdCA9IGl0di0+aXNfb3V0XzUwaHogPyA1NzYgOiA0ODA7CiAKIAkvKiBPbmx5IGZhaWwgaWYgcmVzb2x1dGlvbiB0b28gaGlnaCwgb3RoZXJ3aXNlIGZ1ZGdlIHRoZSBzdGFydCBjb29yZHMuICovCiAJaWYgKChpdnR2X3dpbmRvdy0+aGVpZ2h0ID4gb3NkX2hlaWdodF9saW1pdCkgfHwgKGl2dHZfd2luZG93LT53aWR0aCA+IElWVFZfT1NEX01BWF9XSURUSCkpCkBAIC00NzEsOSArNDcxLDkgQEAKIAkJCXZibGFuay5mbGFncyA9IEZCX1ZCTEFOS19IQVZFX0NPVU5UIHxGQl9WQkxBTktfSEFWRV9WQ09VTlQgfAogCQkJCQlGQl9WQkxBTktfSEFWRV9WU1lOQzsKIAkJCXRyYWNlID0gcmVhZF9yZWcoSVZUVl9SRUdfREVDX0xJTkVfRklFTEQpID4+IDE2OwotCQkJaWYgKGl0di0+aXNfNTBoeiAmJiB0cmFjZSA+IDMxMikKKwkJCWlmIChpdHYtPmlzX291dF81MGh6ICYmIHRyYWNlID4gMzEyKQogCQkJCXRyYWNlIC09IDMxMjsKLQkJCWVsc2UgaWYgKGl0di0+aXNfNjBoeiAmJiB0cmFjZSA+IDI2MikKKwkJCWVsc2UgaWYgKGl0di0+aXNfb3V0XzYwaHogJiYgdHJhY2UgPiAyNjIpCiAJCQkJdHJhY2UgLT0gMjYyOwogCQkJaWYgKHRyYWNlID09IDEpCiAJCQkJdmJsYW5rLmZsYWdzIHw9IEZCX1ZCTEFOS19WU1lOQ0lORzsKQEAgLTY1Niw3ICs2NTYsNyBAQAogCUlWVFZGQl9ERUJVR19JTkZPKCJpdnR2ZmJfY2hlY2tfdmFyXG4iKTsKIAogCS8qIFNldCBiYXNlIHJlZmVyZW5jZXMgZm9yIG1vZGUgY2FsY3MuICovCi0JaWYgKGl0di0+aXNfNTBoeikgeworCWlmIChpdHYtPmlzX291dF81MGh6KSB7CiAJCXBpeGNsb2NrID0gODQzMTY7CiAJCWhsaW1pdCA9IDc3NjsKIAkJdmxpbWl0ID0gNTkxOwpAQCAtNzg0LDEyICs3ODQsMTIgQEAKIAkgICBJZiB0aGUgbWFyZ2lucyBhcmUgdG9vIGxhcmdlLCBqdXN0IGNlbnRlciB0aGUgc2NyZWVuCiAJICAgKGVuZm9yY2luZyBtYXJnaW5zIGNhdXNlcyB0b28gbWFueSBwcm9ibGVtcykgKi8KIAotCWlmICh2YXItPmxlZnRfbWFyZ2luICsgdmFyLT54cmVzID4gSVZUVl9PU0RfTUFYX1dJRFRIICsgMSkgeworCWlmICh2YXItPmxlZnRfbWFyZ2luICsgdmFyLT54cmVzID4gSVZUVl9PU0RfTUFYX1dJRFRIICsgMSkKIAkJdmFyLT5sZWZ0X21hcmdpbiA9IDEgKyAoKElWVFZfT1NEX01BWF9XSURUSCAtIHZhci0+eHJlcykgLyAyKTsKLQl9Ci0JaWYgKHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT55cmVzID4gKGl0di0+aXNfNTBoeiA/IDU3NyA6IDQ4MSkpIHsKLQkJdmFyLT51cHBlcl9tYXJnaW4gPSAxICsgKCgoaXR2LT5pc181MGh6ID8gNTc2IDogNDgwKSAtIHZhci0+eXJlcykgLyAyKTsKLQl9CisKKwlpZiAodmFyLT51cHBlcl9tYXJnaW4gKyB2YXItPnlyZXMgPiAoaXR2LT5pc19vdXRfNTBoeiA/IDU3NyA6IDQ4MSkpCisJCXZhci0+dXBwZXJfbWFyZ2luID0gMSArICgoKGl0di0+aXNfb3V0XzUwaHogPyA1NzYgOiA0ODApIC0KKwkJCXZhci0+eXJlcykgLyAyKTsKIAogCS8qIE1haW50YWluIG92ZXJhbGwgJ3NpemUnIGZvciBhIGNvbnN0YW50IHJlZnJlc2ggcmF0ZSAqLwogCXZhci0+cmlnaHRfbWFyZ2luID0gaGxpbWl0IC0gdmFyLT5sZWZ0X21hcmdpbiAtIHZhci0+eHJlczsKQEAgLTgzNiw3ICs4MzYsMTIgQEAKIAl1MzIgb3NkX3Bhbl9pbmRleDsKIAlzdHJ1Y3QgaXZ0diAqaXR2ID0gKHN0cnVjdCBpdnR2ICopIGluZm8tPnBhcjsKIAotCW9zZF9wYW5faW5kZXggPSAodmFyLT54b2Zmc2V0ICsgKHZhci0+eW9mZnNldCAqIHZhci0+eHJlc192aXJ0dWFsKSkqdmFyLT5iaXRzX3Blcl9waXhlbC84OworCWlmICh2YXItPnlvZmZzZXQgKyBpbmZvLT52YXIueXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwgfHwKKwkgICAgdmFyLT54b2Zmc2V0ICsgaW5mby0+dmFyLnhyZXMgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9zZF9wYW5faW5kZXggPSB2YXItPnlvZmZzZXQgKiBpbmZvLT5maXgubGluZV9sZW5ndGgKKwkJICAgICAgKyB2YXItPnhvZmZzZXQgKiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLyA4OwogCXdyaXRlX3JlZyhvc2RfcGFuX2luZGV4LCAweDAyQTBDKTsKIAogCS8qIFBhc3MgdGhpcyBpbmZvIGJhY2sgdGhlIHl1diBoYW5kbGVyICovCkBAIC0xMDAzLDE5ICsxMDA4LDIxIEBACiAJLyogSGFyZHdhcmUgY29vcmRzIHN0YXJ0IGF0IDAsIHVzZXIgY29vcmRzIHN0YXJ0IGF0IDEuICovCiAJb3NkX2xlZnQtLTsKIAotCXN0YXJ0X3dpbmRvdy5sZWZ0ID0gb3NkX2xlZnQgPj0gMCA/IG9zZF9sZWZ0IDogKChJVlRWX09TRF9NQVhfV0lEVEggLSBzdGFydF93aW5kb3cud2lkdGgpIC8gMik7CisJc3RhcnRfd2luZG93LmxlZnQgPSBvc2RfbGVmdCA+PSAwID8KKwkJIG9zZF9sZWZ0IDogKChJVlRWX09TRF9NQVhfV0lEVEggLSBzdGFydF93aW5kb3cud2lkdGgpIC8gMik7CiAKIAlvaS0+ZGlzcGxheV9ieXRlX3N0cmlkZSA9CiAJCQlzdGFydF93aW5kb3cud2lkdGggKiBvaS0+Ynl0ZXNfcGVyX3BpeGVsOwogCiAJLyogVmVydGljYWwgc2l6ZSAmIHBvc2l0aW9uICovCiAKLQltYXhfaGVpZ2h0ID0gaXR2LT5pc181MGh6ID8gNTc2IDogNDgwOworCW1heF9oZWlnaHQgPSBpdHYtPmlzX291dF81MGh6ID8gNTc2IDogNDgwOwogCiAJaWYgKG9zZF95cmVzID4gbWF4X2hlaWdodCkKIAkJb3NkX3lyZXMgPSBtYXhfaGVpZ2h0OwogCi0Jc3RhcnRfd2luZG93LmhlaWdodCA9IG9zZF95cmVzID8gb3NkX3lyZXMgOiBpdHYtPmlzXzUwaHogPyA0ODAgOiA0MDA7CisJc3RhcnRfd2luZG93LmhlaWdodCA9IG9zZF95cmVzID8KKwkJb3NkX3lyZXMgOiBpdHYtPmlzX291dF81MGh6ID8gNDgwIDogNDAwOwogCiAJLyogQ2hlY2sgdmVydGljYWwgc3RhcnQgKG9zZF91cHBlcikuICovCiAJaWYgKG9zZF91cHBlciArIHN0YXJ0X3dpbmRvdy5oZWlnaHQgPiBtYXhfaGVpZ2h0ICsgMSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHMuaAppbmRleCAxMGI1NWM4Li44OWQwOWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHMuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHMuaApAQCAtMiwxMCArMiwxMCBAQAogICogSGVhZGVyIGZvciBNLTVNT0xTIDhNIFBpeGVsIGNhbWVyYSBzZW5zb3Igd2l0aCBJU1AKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcjogSGV1bmdKdW4gS2ltLCByaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20KKyAqIEF1dGhvcjogSGV1bmdKdW4gS2ltIDxyaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKiBBdXRob3I6IERvbmdzb28gTmF0aGFuaWVsIEtpbSwgZG9uZ3NvbzQ1LmtpbUBzYW1zdW5nLmNvbQorICogQXV0aG9yOiBEb25nc29vIE5hdGhhbmllbCBLaW0gPGRvbmdzb280NS5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xMDYsMjMgKzEwNiwyMyBAQAogICogVGhlIGVhY2ggdmFsdWUgYWNjb3JkaW5nIHRvIGVhY2ggc2NlbmVtb2RlIGlzIHJlY29tbWVuZGVkIGluIHRoZSBkb2N1bWVudHMuCiAgKi8KIHN0cnVjdCBtNW1vbHNfc2NlbmVtb2RlIHsKLQl1MzIgbWV0ZXJpbmc7Ci0JdTMyIGV2X2JpYXM7Ci0JdTMyIHdiX21vZGU7Ci0JdTMyIHdiX3ByZXNldDsKLQl1MzIgY2hyb21hX2VuOwotCXUzMiBjaHJvbWFfbHZsOwotCXUzMiBlZGdlX2VuOwotCXUzMiBlZGdlX2x2bDsKLQl1MzIgYWZfcmFuZ2U7Ci0JdTMyIGZkX21vZGU7Ci0JdTMyIG1jYzsKLQl1MzIgbGlnaHQ7Ci0JdTMyIGZsYXNoOwotCXUzMiB0b25lOwotCXUzMiBpc287Ci0JdTMyIGNhcHRfbW9kZTsKLQl1MzIgd2RyOworCXU4IG1ldGVyaW5nOworCXU4IGV2X2JpYXM7CisJdTggd2JfbW9kZTsKKwl1OCB3Yl9wcmVzZXQ7CisJdTggY2hyb21hX2VuOworCXU4IGNocm9tYV9sdmw7CisJdTggZWRnZV9lbjsKKwl1OCBlZGdlX2x2bDsKKwl1OCBhZl9yYW5nZTsKKwl1OCBmZF9tb2RlOworCXU4IG1jYzsKKwl1OCBsaWdodDsKKwl1OCBmbGFzaDsKKwl1OCB0b25lOworCXU4IGlzbzsKKwl1OCBjYXB0X21vZGU7CisJdTggd2RyOwogfTsKIAogLyoqCkBAIC0xNTQsNyArMTU0LDYgQEAKIAl1OAlzdHJbVkVSU0lPTl9TVFJJTkdfU0laRV07CiAJdTgJYWY7CiB9OwotI2RlZmluZSBWRVJTSU9OX1NJWkUgc2l6ZW9mKHN0cnVjdCBtNW1vbHNfdmVyc2lvbikKIAogLyoqCiAgKiBzdHJ1Y3QgbTVtb2xzX2luZm8gLSBNLTVNT0xTIGRyaXZlciBkYXRhIHN0cnVjdHVyZQpAQCAtMjE2LDkgKzIxNSw5IEBACiAJYm9vbCBsb2NrX2FlOwogCWJvb2wgbG9ja19hd2I7CiAJdTggcmVzb2x1dGlvbjsKLQl1MzIgaW50ZXJydXB0OwotCXUzMiBtb2RlOwotCXUzMiBtb2RlX3NhdmU7CisJdTggaW50ZXJydXB0OworCXU4IG1vZGU7CisJdTggbW9kZV9zYXZlOwogCWludCAoKnNldF9wb3dlcikoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgb24pOwogfTsKIApAQCAtMjU2LDkgKzI1NSwxMSBAQAogICogICArLS0tLS0tLSstLS0rLS0tLS0tLS0tLSstLS0tLSstLS0tLS0rLS0tLS0tKy0tLS0tLSstLS0tLS0rCiAgKiAgIC0gZFswLi4zXTogYWNjb3JkaW5nIHRvIHNpemUxCiAgKi8KLWludCBtNW1vbHNfcmVhZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgcmVnX2NvbWIsIHUzMiAqdmFsKTsKK2ludCBtNW1vbHNfcmVhZF91OChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgcmVnX2NvbWIsIHU4ICp2YWwpOworaW50IG01bW9sc19yZWFkX3UxNihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgcmVnX2NvbWIsIHUxNiAqdmFsKTsKK2ludCBtNW1vbHNfcmVhZF91MzIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHJlZ19jb21iLCB1MzIgKnZhbCk7CiBpbnQgbTVtb2xzX3dyaXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiByZWdfY29tYiwgdTMyIHZhbCk7Ci1pbnQgbTVtb2xzX2J1c3koc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggY2F0ZWdvcnksIHU4IGNtZCwgdTMyIHZhbHVlKTsKK2ludCBtNW1vbHNfYnVzeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCBjYXRlZ29yeSwgdTggY21kLCB1OCB2YWx1ZSk7CiAKIC8qCiAgKiBNb2RlIG9wZXJhdGlvbiBvZiB0aGUgTS01TU9MUwpAQCAtMjgwLDEyICsyODEsMTIgQEAKICAqIFRoZSBhdmFpbGFibGUgZXhlY3V0aW5nIG9yZGVyIGJldHdlZW4gZWFjaCBtb2RlcyBhcmUgYXMgZm9sbG93czoKICAqICAgUEFSQU1FVEVSIDwtLS0+IE1PTklUT1IgPC0tLT4gQ0FQVFVSRQogICovCi1pbnQgbTVtb2xzX21vZGUoc3RydWN0IG01bW9sc19pbmZvICppbmZvLCB1MzIgbW9kZSk7CitpbnQgbTVtb2xzX21vZGUoc3RydWN0IG01bW9sc19pbmZvICppbmZvLCB1OCBtb2RlKTsKIAotaW50IG01bW9sc19lbmFibGVfaW50ZXJydXB0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiByZWcpOworaW50IG01bW9sc19lbmFibGVfaW50ZXJydXB0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZyk7CiBpbnQgbTVtb2xzX3N5bmNfY29udHJvbHMoc3RydWN0IG01bW9sc19pbmZvICppbmZvKTsKIGludCBtNW1vbHNfc3RhcnRfY2FwdHVyZShzdHJ1Y3QgbTVtb2xzX2luZm8gKmluZm8pOwotaW50IG01bW9sc19kb19zY2VuZW1vZGUoc3RydWN0IG01bW9sc19pbmZvICppbmZvLCB1MzIgbW9kZSk7CitpbnQgbTVtb2xzX2RvX3NjZW5lbW9kZShzdHJ1Y3QgbTVtb2xzX2luZm8gKmluZm8sIHU4IG1vZGUpOwogaW50IG01bW9sc19sb2NrXzNhKHN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbywgYm9vbCBsb2NrKTsKIGludCBtNW1vbHNfc2V0X2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jYXB0dXJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY2FwdHVyZS5jCmluZGV4IGQ3MWEzOTAuLmE0NWQ4ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jYXB0dXJlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NhcHR1cmUuYwpAQCAtMiwxMCArMiwxMCBAQAogICogVGhlIENhcHR1cmUgY29kZSBmb3IgRnVqaXRzdSBNLTVNT0xTIElTUAogICoKICAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICogQXV0aG9yOiBIZXVuZ0p1biBLaW0sIHJpdmVyZnVsLmtpbUBzYW1zdW5nLmNvbQorICogQXV0aG9yOiBIZXVuZ0p1biBLaW0gPHJpdmVyZnVsLmtpbUBzYW1zdW5nLmNvbT4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcjogRG9uZ3NvbyBOYXRoYW5pZWwgS2ltLCBkb25nc29vNDUua2ltQHNhbXN1bmcuY29tCisgKiBBdXRob3I6IERvbmdzb28gTmF0aGFuaWVsIEtpbSA8ZG9uZ3NvbzQ1LmtpbUBzYW1zdW5nLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CkBAIC01OCw5ICs1Nyw5IEBACiB7CiAJdTMyIG51bSwgZGVuOwogCi0JaW50IHJldCA9IG01bW9sc19yZWFkKHNkLCBhZGRyX251bSwgJm51bSk7CisJaW50IHJldCA9IG01bW9sc19yZWFkX3UzMihzZCwgYWRkcl9udW0sICZudW0pOwogCWlmICghcmV0KQotCQlyZXQgPSBtNW1vbHNfcmVhZChzZCwgYWRkcl9kZW4sICZkZW4pOworCQlyZXQgPSBtNW1vbHNfcmVhZF91MzIoc2QsIGFkZHJfZGVuLCAmZGVuKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCSp2YWwgPSBkZW4gPT0gMCA/IDAgOiBudW0gLyBkZW47CkBAIC05OSwyMCArOTgsMjAgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbTVtb2xzX3JlYWQoc2QsIEVYSUZfSU5GT19JU08sICh1MzIgKikmZXhpZi0+aXNvX3NwZWVkKTsKKwlyZXQgPSBtNW1vbHNfcmVhZF91MTYoc2QsIEVYSUZfSU5GT19JU08sICZleGlmLT5pc29fc3BlZWQpOwogCWlmICghcmV0KQotCQlyZXQgPSBtNW1vbHNfcmVhZChzZCwgRVhJRl9JTkZPX0ZMQVNILCAodTMyICopJmV4aWYtPmZsYXNoKTsKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTE2KHNkLCBFWElGX0lORk9fRkxBU0gsICZleGlmLT5mbGFzaCk7CiAJaWYgKCFyZXQpCi0JCXJldCA9IG01bW9sc19yZWFkKHNkLCBFWElGX0lORk9fU0RSLCAodTMyICopJmV4aWYtPnNkcik7CisJCXJldCA9IG01bW9sc19yZWFkX3UxNihzZCwgRVhJRl9JTkZPX1NEUiwgJmV4aWYtPnNkcik7CiAJaWYgKCFyZXQpCi0JCXJldCA9IG01bW9sc19yZWFkKHNkLCBFWElGX0lORk9fUVZBTCwgKHUzMiAqKSZleGlmLT5xdmFsKTsKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTE2KHNkLCBFWElGX0lORk9fUVZBTCwgJmV4aWYtPnF2YWwpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAoIXJldCkKLQkJcmV0ID0gbTVtb2xzX3JlYWQoc2QsIENBUENfSU1BR0VfU0laRSwgJmluZm8tPmNhcC5tYWluKTsKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTMyKHNkLCBDQVBDX0lNQUdFX1NJWkUsICZpbmZvLT5jYXAubWFpbik7CiAJaWYgKCFyZXQpCi0JCXJldCA9IG01bW9sc19yZWFkKHNkLCBDQVBDX1RIVU1CX1NJWkUsICZpbmZvLT5jYXAudGh1bWIpOworCQlyZXQgPSBtNW1vbHNfcmVhZF91MzIoc2QsIENBUENfVEhVTUJfU0laRSwgJmluZm8tPmNhcC50aHVtYik7CiAJaWYgKCFyZXQpCiAJCWluZm8tPmNhcC50b3RhbCA9IGluZm8tPmNhcC5tYWluICsgaW5mby0+Y2FwLnRodW1iOwogCkBAIC0xMjIsNyArMTIxLDcgQEAKIGludCBtNW1vbHNfc3RhcnRfY2FwdHVyZShzdHJ1Y3QgbTVtb2xzX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZpbmZvLT5zZDsKLQl1MzIgcmVzb2x1dGlvbiA9IGluZm8tPnJlc29sdXRpb247CisJdTggcmVzb2x1dGlvbiA9IGluZm8tPnJlc29sdXRpb247CiAJaW50IHRpbWVvdXQ7CiAJaW50IHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvbnRyb2xzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29udHJvbHMuYwppbmRleCA4MTdjMTZmLi5kMTM1ZDIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29udHJvbHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29udHJvbHMuYwpAQCAtMiwxMCArMiwxMCBAQAogICogQ29udHJvbHMgZm9yIE0tNU1PTFMgOE0gUGl4ZWwgY2FtZXJhIHNlbnNvciB3aXRoIElTUAogICoKICAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICogQXV0aG9yOiBIZXVuZ0p1biBLaW0sIHJpdmVyZnVsLmtpbUBzYW1zdW5nLmNvbQorICogQXV0aG9yOiBIZXVuZ0p1biBLaW0gPHJpdmVyZnVsLmtpbUBzYW1zdW5nLmNvbT4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcjogRG9uZ3NvbyBOYXRoYW5pZWwgS2ltLCBkb25nc29vNDUua2ltQHNhbXN1bmcuY29tCisgKiBBdXRob3I6IERvbmdzb28gTmF0aGFuaWVsIEtpbSA8ZG9uZ3NvbzQ1LmtpbUBzYW1zdW5nLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTEzMCw3ICsxMzAsNyBAQAogICoKICAqIFdBUk5JTkc6IFRoZSBleGVjdXRpb24gb3JkZXIgaXMgaW1wb3J0YW50LiBEbyBub3QgY2hhbmdlIHRoZSBvcmRlci4KICAqLwotaW50IG01bW9sc19kb19zY2VuZW1vZGUoc3RydWN0IG01bW9sc19pbmZvICppbmZvLCB1MzIgbW9kZSkKK2ludCBtNW1vbHNfZG9fc2NlbmVtb2RlKHN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbywgdTggbW9kZSkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmluZm8tPnNkOwogCXN0cnVjdCBtNW1vbHNfc2NlbmVtb2RlIHNjZW5lbW9kZSA9IG01bW9sc19kZWZhdWx0X3NjZW5lbW9kZVttb2RlXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jCmluZGV4IDc2ZWFjMjYuLjQzYzY4ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvcmUuYwpAQCAtMiwxMCArMiwxMCBAQAogICogRHJpdmVyIGZvciBNLTVNT0xTIDhNIFBpeGVsIGNhbWVyYSBzZW5zb3Igd2l0aCBJU1AKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcjogSGV1bmdKdW4gS2ltLCByaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20KKyAqIEF1dGhvcjogSGV1bmdKdW4gS2ltIDxyaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKiBBdXRob3I6IERvbmdzb28gTmF0aGFuaWVsIEtpbSwgZG9uZ3NvbzQ1LmtpbUBzYW1zdW5nLmNvbQorICogQXV0aG9yOiBEb25nc29vIE5hdGhhbmllbCBLaW0gPGRvbmdzb280NS5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xMzMsMTMgKzEzMywxMyBAQAogLyoqCiAgKiBtNW1vbHNfcmVhZCAtICBJMkMgcmVhZCBmdW5jdGlvbgogICogQHJlZzogY29tYmluYXRpb24gb2Ygc2l6ZSwgY2F0ZWdvcnkgYW5kIGNvbW1hbmQgZm9yIHRoZSBJMkMgcGFja2V0CisgKiBAc2l6ZTogZGVzaXJlZCBzaXplIG9mIEkyQyBwYWNrZXQKICAqIEB2YWw6IHJlYWQgdmFsdWUKICAqLwotaW50IG01bW9sc19yZWFkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiByZWcsIHUzMiAqdmFsKQorc3RhdGljIGludCBtNW1vbHNfcmVhZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgc2l6ZSwgdTMyIHJlZywgdTMyICp2YWwpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXU4IHJidWZbTTVNT0xTX0kyQ19NQVhfU0laRSArIDFdOwotCXU4IHNpemUgPSBJMkNfU0laRShyZWcpOwogCXU4IGNhdGVnb3J5ID0gSTJDX0NBVEVHT1JZKHJlZyk7CiAJdTggY21kID0gSTJDX0NPTU1BTkQocmVnKTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbMl07CkBAIC0xNDksMTEgKzE0OSw2IEBACiAJaWYgKCFjbGllbnQtPmFkYXB0ZXIpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0JCXY0bDJfZXJyKHNkLCAiV3JvbmcgZGF0YSBzaXplXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJbXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CiAJbXNnWzBdLmZsYWdzID0gMDsKIAltc2dbMF0ubGVuID0gNTsKQEAgLTE4NCw2ICsxNzksNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IG01bW9sc19yZWFkX3U4KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiByZWcsIHU4ICp2YWwpCit7CisJdTMyIHZhbF8zMjsKKwlpbnQgcmV0OworCisJaWYgKEkyQ19TSVpFKHJlZykgIT0gMSkgeworCQl2NGwyX2VycihzZCwgIldyb25nIGRhdGEgc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IG01bW9sc19yZWFkKHNkLCBJMkNfU0laRShyZWcpLCByZWcsICZ2YWxfMzIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkqdmFsID0gKHU4KXZhbF8zMjsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbTVtb2xzX3JlYWRfdTE2KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiByZWcsIHUxNiAqdmFsKQoreworCXUzMiB2YWxfMzI7CisJaW50IHJldDsKKworCWlmIChJMkNfU0laRShyZWcpICE9IDIpIHsKKwkJdjRsMl9lcnIoc2QsICJXcm9uZyBkYXRhIHNpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBtNW1vbHNfcmVhZChzZCwgSTJDX1NJWkUocmVnKSwgcmVnLCAmdmFsXzMyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJKnZhbCA9ICh1MTYpdmFsXzMyOworCXJldHVybiByZXQ7Cit9CisKK2ludCBtNW1vbHNfcmVhZF91MzIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHJlZywgdTMyICp2YWwpCit7CisJaWYgKEkyQ19TSVpFKHJlZykgIT0gNCkgeworCQl2NGwyX2VycihzZCwgIldyb25nIGRhdGEgc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBtNW1vbHNfcmVhZChzZCwgSTJDX1NJWkUocmVnKSwgcmVnLCB2YWwpOworfQorCiAvKioKICAqIG01bW9sc193cml0ZSAtIEkyQyBjb21tYW5kIHdyaXRlIGZ1bmN0aW9uCiAgKiBAcmVnOiBjb21iaW5hdGlvbiBvZiBzaXplLCBjYXRlZ29yeSBhbmQgY29tbWFuZCBmb3IgdGhlIEkyQyBwYWNrZXQKQEAgLTIzMSwxMyArMjcyLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBtNW1vbHNfYnVzeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCBjYXRlZ29yeSwgdTggY21kLCB1MzIgbWFzaykKK2ludCBtNW1vbHNfYnVzeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCBjYXRlZ29yeSwgdTggY21kLCB1OCBtYXNrKQogewotCXUzMiBidXN5LCBpOworCXU4IGJ1c3k7CisJaW50IGk7CiAJaW50IHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBNNU1PTFNfSTJDX0NIRUNLX1JFVFJZOyBpKyspIHsKLQkJcmV0ID0gbTVtb2xzX3JlYWQoc2QsIEkyQ19SRUcoY2F0ZWdvcnksIGNtZCwgMSksICZidXN5KTsKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTgoc2QsIEkyQ19SRUcoY2F0ZWdvcnksIGNtZCwgMSksICZidXN5KTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCQlpZiAoKGJ1c3kgJiBtYXNrKSA9PSBtYXNrKQpAQCAtMjUyLDE0ICsyOTQsMTQgQEAKICAqIEJlZm9yZSB3cml0aW5nIGRlc2lyZWQgaW50ZXJydXB0IHZhbHVlIHRoZSBJTlRfRkFDVE9SIHJlZ2lzdGVyIHNob3VsZAogICogYmUgcmVhZCB0byBjbGVhciBwZW5kaW5nIGludGVycnVwdHMuCiAgKi8KLWludCBtNW1vbHNfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgcmVnKQoraW50IG01bW9sc19lbmFibGVfaW50ZXJydXB0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZykKIHsKIAlzdHJ1Y3QgbTVtb2xzX2luZm8gKmluZm8gPSB0b19tNW1vbHMoc2QpOwotCXUzMiBtYXNrID0gaXNfYXZhaWxhYmxlX2FmKGluZm8pID8gUkVHX0lOVF9BRiA6IDA7Ci0JdTMyIGR1bW15OworCXU4IG1hc2sgPSBpc19hdmFpbGFibGVfYWYoaW5mbykgPyBSRUdfSU5UX0FGIDogMDsKKwl1OCBkdW1teTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gbTVtb2xzX3JlYWQoc2QsIFNZU1RFTV9JTlRfRkFDVE9SLCAmZHVtbXkpOworCXJldCA9IG01bW9sc19yZWFkX3U4KHNkLCBTWVNURU1fSU5UX0ZBQ1RPUiwgJmR1bW15KTsKIAlpZiAoIXJldCkKIAkJcmV0ID0gbTVtb2xzX3dyaXRlKHNkLCBTWVNURU1fSU5UX0VOQUJMRSwgcmVnICYgfm1hc2spOwogCXJldHVybiByZXQ7CkBAIC0yNzEsNyArMzEzLDcgQEAKICAqIEl0IGFsd2F5cyBhY2NvbXBhbmllcyBhIGxpdHRsZSBkZWxheSBjaGFuZ2luZyB0aGUgTS01TU9MUyBtb2RlLCBzbyBpdCBpcwogICogbmVlZGVkIGNoZWNraW5nIGN1cnJlbnQgYnVzeSBzdGF0dXMgdG8gZ3VhcmFudGVlIHJpZ2h0IG1vZGUuCiAgKi8KLXN0YXRpYyBpbnQgbTVtb2xzX3JlZ19tb2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBtb2RlKQorc3RhdGljIGludCBtNW1vbHNfcmVnX21vZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggbW9kZSkKIHsKIAlpbnQgcmV0ID0gbTVtb2xzX3dyaXRlKHNkLCBTWVNURU1fU1lTTU9ERSwgbW9kZSk7CiAKQEAgLTI4NiwxNiArMzI4LDE2IEBACiAgKiBjYW4gYmUgZ3VhcmFudGVlZCBvbmx5IHdoZW4gdGhlIHNlbnNvciBpcyBvcGVyYXRpbmcgaW4gbW9kZSB3aGljaCB3aGljaAogICogYSBjb21tYW5kIGJlbG9uZ3MgdG8uCiAgKi8KLWludCBtNW1vbHNfbW9kZShzdHJ1Y3QgbTVtb2xzX2luZm8gKmluZm8sIHUzMiBtb2RlKQoraW50IG01bW9sc19tb2RlKHN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbywgdTggbW9kZSkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmluZm8tPnNkOwogCWludCByZXQgPSAtRUlOVkFMOwotCXUzMiByZWc7CisJdTggcmVnOwogCiAJaWYgKG1vZGUgPCBSRUdfUEFSQU1FVEVSICYmIG1vZGUgPiBSRUdfQ0FQVFVSRSkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IG01bW9sc19yZWFkKHNkLCBTWVNURU1fU1lTTU9ERSwgJnJlZyk7CisJcmV0ID0gbTVtb2xzX3JlYWRfdTgoc2QsIFNZU1RFTV9TWVNNT0RFLCAmcmVnKTsKIAlpZiAoKCFyZXQgJiYgcmVnID09IG1vZGUpIHx8IHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzQ0LDQxICszODYsMzcgQEAKIHN0YXRpYyBpbnQgbTVtb2xzX2dldF92ZXJzaW9uKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7CiAJc3RydWN0IG01bW9sc19pbmZvICppbmZvID0gdG9fbTVtb2xzKHNkKTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBtNW1vbHNfdmVyc2lvbiB2ZXI7Ci0JCXU4IGJ5dGVzW1ZFUlNJT05fU0laRV07Ci0JfSB2ZXJzaW9uOwotCXUzMiAqdmFsdWU7Ci0JdTggY21kID0gQ0FUMF9WRVJfQ1VTVE9NRVI7CisJc3RydWN0IG01bW9sc192ZXJzaW9uICp2ZXIgPSAmaW5mby0+dmVyOworCXU4ICpzdHIgPSB2ZXItPnN0cjsKKwlpbnQgaTsKIAlpbnQgcmV0OwogCi0JZG8gewotCQl2YWx1ZSA9ICh1MzIgKikmdmVyc2lvbi5ieXRlc1tjbWRdOwotCQlyZXQgPSBtNW1vbHNfcmVhZChzZCwgU1lTVEVNX0NNRChjbWQpLCB2YWx1ZSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0gd2hpbGUgKGNtZCsrICE9IENBVDBfVkVSX0FXQik7Ci0KLQlkbyB7Ci0JCXZhbHVlID0gKHUzMiAqKSZ2ZXJzaW9uLmJ5dGVzW2NtZF07Ci0JCXJldCA9IG01bW9sc19yZWFkKHNkLCBTWVNURU1fVkVSX1NUUklORywgdmFsdWUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQkJaWYgKGNtZCA+PSBWRVJTSU9OX1NJWkUgLSAxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSB3aGlsZSAodmVyc2lvbi5ieXRlc1tjbWQrK10pOwotCi0JdmFsdWUgPSAodTMyICopJnZlcnNpb24uYnl0ZXNbY21kXTsKLQlyZXQgPSBtNW1vbHNfcmVhZChzZCwgQUZfVkVSU0lPTiwgdmFsdWUpOworCXJldCA9IG01bW9sc19yZWFkX3U4KHNkLCBTWVNURU1fVkVSX0NVU1RPTUVSLCAmdmVyLT5jdXN0b21lcik7CisJaWYgKCFyZXQpCisJCXJldCA9IG01bW9sc19yZWFkX3U4KHNkLCBTWVNURU1fVkVSX1BST0pFQ1QsICZ2ZXItPnByb2plY3QpOworCWlmICghcmV0KQorCQlyZXQgPSBtNW1vbHNfcmVhZF91MTYoc2QsIFNZU1RFTV9WRVJfRklSTVdBUkUsICZ2ZXItPmZ3KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTE2KHNkLCBTWVNURU1fVkVSX0hBUkRXQVJFLCAmdmVyLT5odyk7CisJaWYgKCFyZXQpCisJCXJldCA9IG01bW9sc19yZWFkX3UxNihzZCwgU1lTVEVNX1ZFUl9QQVJBTUVURVIsICZ2ZXItPnBhcmFtKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTE2KHNkLCBTWVNURU1fVkVSX0FXQiwgJnZlci0+YXdiKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbTVtb2xzX3JlYWRfdTgoc2QsIEFGX1ZFUlNJT04sICZ2ZXItPmFmKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JLyogc3RvcmUgdmVyc2lvbiBpbmZvcm1hdGlvbiBzd2FwcGVkIGZvciBiZWluZyByZWFkYWJsZSAqLwotCWluZm8tPnZlcgk9IHZlcnNpb24udmVyOwotCWluZm8tPnZlci5mdwk9IGJlMTZfdG9fY3B1KGluZm8tPnZlci5mdyk7Ci0JaW5mby0+dmVyLmh3CT0gYmUxNl90b19jcHUoaW5mby0+dmVyLmh3KTsKLQlpbmZvLT52ZXIucGFyYW0JPSBiZTE2X3RvX2NwdShpbmZvLT52ZXIucGFyYW0pOwotCWluZm8tPnZlci5hd2IJPSBiZTE2X3RvX2NwdShpbmZvLT52ZXIuYXdiKTsKKwlmb3IgKGkgPSAwOyBpIDwgVkVSU0lPTl9TVFJJTkdfU0laRTsgaSsrKSB7CisJCXJldCA9IG01bW9sc19yZWFkX3U4KHNkLCBTWVNURU1fVkVSX1NUUklORywgJnN0cltpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXZlci0+ZncgPSBiZTE2X3RvX2NwdSh2ZXItPmZ3KTsKKwl2ZXItPmh3ID0gYmUxNl90b19jcHUodmVyLT5odyk7CisJdmVyLT5wYXJhbSA9IGJlMTZfdG9fY3B1KHZlci0+cGFyYW0pOworCXZlci0+YXdiID0gYmUxNl90b19jcHUodmVyLT5hd2IpOwogCiAJdjRsMl9pbmZvKHNkLCAiTWFudWZhY3R1cmVyXHRbJXNdXG4iLAogCQkJaXNfbWFudWZhY3R1cmVyKGluZm8sIFJFR19TQU1TVU5HX0VMRUNUUk8pID8KQEAgLTcyMiw3ICs3NjAsNyBAQAogCWludCByZXQ7CiAKIAkvKiBEZXRlcm1pbmUgdmFsdWUncyByYW5nZSAmIHN0ZXAgb2YgY29udHJvbHMgZm9yIHZhcmlvdXMgRlcgdmVyc2lvbiAqLwotCXJldCA9IG01bW9sc19yZWFkKHNkLCBBRV9NQVhfR0FJTl9NT04sICh1MzIgKikmbWF4X2V4cG9zdXJlKTsKKwlyZXQgPSBtNW1vbHNfcmVhZF91MTYoc2QsIEFFX01BWF9HQUlOX01PTiwgJm1heF9leHBvc3VyZSk7CiAJaWYgKCFyZXQpCiAJCXN0ZXBfem9vbSA9IGlzX21hbnVmYWN0dXJlcihpbmZvLCBSRUdfU0FNU1VOR19PUFRJQ1MpID8gMzEgOiAxOwogCWlmIChyZXQpCkBAIC04NDIsMTggKzg4MCwxOCBAQAogCXN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbyA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbTVtb2xzX2luZm8sIHdvcmtfaXJxKTsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmluZm8tPnNkOwotCXUzMiByZWc7CisJdTggcmVnOwogCWludCByZXQ7CiAKIAlpZiAoIWlzX3Bvd2VyZWQoaW5mbykgfHwKLQkJCW01bW9sc19yZWFkKHNkLCBTWVNURU1fSU5UX0ZBQ1RPUiwgJmluZm8tPmludGVycnVwdCkpCisJCQltNW1vbHNfcmVhZF91OChzZCwgU1lTVEVNX0lOVF9GQUNUT1IsICZpbmZvLT5pbnRlcnJ1cHQpKQogCQlyZXR1cm47CiAKIAlzd2l0Y2ggKGluZm8tPmludGVycnVwdCAmIFJFR19JTlRfTUFTSykgewogCWNhc2UgUkVHX0lOVF9BRjoKIAkJaWYgKCFpc19hdmFpbGFibGVfYWYoaW5mbykpCiAJCQlicmVhazsKLQkJcmV0ID0gbTVtb2xzX3JlYWQoc2QsIEFGX1NUQVRVUywgJnJlZyk7CisJCXJldCA9IG01bW9sc19yZWFkX3U4KHNkLCBBRl9TVEFUVVMsICZyZWcpOwogCQl2NGwyX2RiZygyLCBtNW1vbHNfZGVidWcsIHNkLCAiQUYgJXNcbiIsCiAJCQkgcmVnID09IFJFR19BRl9GQUlMID8gIkZhaWxlZCIgOgogCQkJIHJlZyA9PSBSRUdfQUZfU1VDQ0VTUyA/ICJTdWNjZXNzIiA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfcmVnLmgKaW5kZXggYjgzZTM2Zi4uYzc1NWJkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX3JlZy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19yZWcuaApAQCAtMiwxMCArMiwxMCBAQAogICogUmVnaXN0ZXIgbWFwIGZvciBNLTVNT0xTIDhNIFBpeGVsIGNhbWVyYSBzZW5zb3Igd2l0aCBJU1AKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcjogSGV1bmdKdW4gS2ltLCByaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20KKyAqIEF1dGhvcjogSGV1bmdKdW4gS2ltIDxyaXZlcmZ1bC5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKiBBdXRob3I6IERvbmdzb28gTmF0aGFuaWVsIEtpbSwgZG9uZ3NvbzQ1LmtpbUBzYW1zdW5nLmNvbQorICogQXV0aG9yOiBEb25nc29vIE5hdGhhbmllbCBLaW0gPGRvbmdzb280NS5raW1Ac2Ftc3VuZy5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC01NiwxMyArNTYsMjQgQEAKICAqIG1vcmUgc3BlY2lmaWMgY29udGVudHMsIHNlZSBkZWZpbml0aW9uIGlmIGZpbGUgbTVtb2xzLmguCiAgKi8KICNkZWZpbmUgQ0FUMF9WRVJfQ1VTVE9NRVIJMHgwMAkvKiBjdXN0b21lciB2ZXJzaW9uICovCi0jZGVmaW5lIENBVDBfVkVSX0FXQgkJMHgwOQkvKiBBdXRvIFdCIHZlcnNpb24gKi8KKyNkZWZpbmUgQ0FUMF9WRVJfUFJPSkVDVAkweDAxCS8qIHByb2plY3QgdmVyc2lvbiAqLworI2RlZmluZSBDQVQwX1ZFUl9GSVJNV0FSRQkweDAyCS8qIEZpcm13YXJlIHZlcnNpb24gKi8KKyNkZWZpbmUgQ0FUMF9WRVJfSEFSRFdBUkUJMHgwNAkvKiBIYXJkd2FyZSB2ZXJzaW9uICovCisjZGVmaW5lIENBVDBfVkVSX1BBUkFNRVRFUgkweDA2CS8qIFBhcmFtZXRlciB2ZXJzaW9uICovCisjZGVmaW5lIENBVDBfVkVSX0FXQgkJMHgwOAkvKiBBdXRvIFdCIHZlcnNpb24gKi8KICNkZWZpbmUgQ0FUMF9WRVJfU1RSSU5HCQkweDBhCS8qIHN0cmluZyBpbmNsdWRpbmcgTS01TU9MUyAqLwogI2RlZmluZSBDQVQwX1NZU01PREUJCTB4MGIJLyogU1lTVEVNIG1vZGUgcmVnaXN0ZXIgKi8KICNkZWZpbmUgQ0FUMF9TVEFUVVMJCTB4MGMJLyogU1lTVEVNIG1vZGUgc3RhdHVzIHJlZ2lzdGVyICovCiAjZGVmaW5lIENBVDBfSU5UX0ZBQ1RPUgkJMHgxMAkvKiBpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlciAqLwogI2RlZmluZSBDQVQwX0lOVF9FTkFCTEUJCTB4MTEJLyogaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLwogCisjZGVmaW5lIFNZU1RFTV9WRVJfQ1VTVE9NRVIJSTJDX1JFRyhDQVRfU1lTVEVNLCBDQVQwX1ZFUl9DVVNUT01FUiwgMSkKKyNkZWZpbmUgU1lTVEVNX1ZFUl9QUk9KRUNUCUkyQ19SRUcoQ0FUX1NZU1RFTSwgQ0FUMF9WRVJfUFJPSkVDVCwgMSkKKyNkZWZpbmUgU1lTVEVNX1ZFUl9GSVJNV0FSRQlJMkNfUkVHKENBVF9TWVNURU0sIENBVDBfVkVSX0ZJUk1XQVJFLCAyKQorI2RlZmluZSBTWVNURU1fVkVSX0hBUkRXQVJFCUkyQ19SRUcoQ0FUX1NZU1RFTSwgQ0FUMF9WRVJfSEFSRFdBUkUsIDIpCisjZGVmaW5lIFNZU1RFTV9WRVJfUEFSQU1FVEVSCUkyQ19SRUcoQ0FUX1NZU1RFTSwgQ0FUMF9WRVJfUEFSQU1FVEVSLCAyKQorI2RlZmluZSBTWVNURU1fVkVSX0FXQgkJSTJDX1JFRyhDQVRfU1lTVEVNLCBDQVQwX1ZFUl9BV0IsIDIpCisKICNkZWZpbmUgU1lTVEVNX1NZU01PREUJCUkyQ19SRUcoQ0FUX1NZU1RFTSwgQ0FUMF9TWVNNT0RFLCAxKQogI2RlZmluZSBSRUdfU1lTSU5JVAkJMHgwMAkvKiBTWVNURU0gbW9kZSAqLwogI2RlZmluZSBSRUdfUEFSQU1FVEVSCQkweDAxCS8qIFBBUkFNRVRFUiBtb2RlICovCkBAIC0zODIsOCArMzkzLDggQEAKICNkZWZpbmUgUkVHX0NBUF9TVEFSVF9NQUlOCTB4MDEKICNkZWZpbmUgUkVHX0NBUF9TVEFSVF9USFVNQgkweDAzCiAKLSNkZWZpbmUgQ0FQQ19JTUFHRV9TSVpFCQlJMkNfUkVHKENBVF9DQVBUX0NUUkwsIENBVENfQ0FQX0lNQUdFX1NJWkUsIDEpCi0jZGVmaW5lIENBUENfVEhVTUJfU0laRQkJSTJDX1JFRyhDQVRfQ0FQVF9DVFJMLCBDQVRDX0NBUF9USFVNQl9TSVpFLCAxKQorI2RlZmluZSBDQVBDX0lNQUdFX1NJWkUJCUkyQ19SRUcoQ0FUX0NBUFRfQ1RSTCwgQ0FUQ19DQVBfSU1BR0VfU0laRSwgNCkKKyNkZWZpbmUgQ0FQQ19USFVNQl9TSVpFCQlJMkNfUkVHKENBVF9DQVBUX0NUUkwsIENBVENfQ0FQX1RIVU1CX1NJWkUsIDQpCiAKIC8qCiAgKiBDYXRlZ29yeSBGIC0gRmxhc2gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYwppbmRleCBkZTVkNDgxLi5jNDNjODFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5jCkBAIC00ODAsMTIgKzQ4MCwxNCBAQAogCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAotCWlmIChzdGF0ZS0+cmFkaW8pCisJaWYgKHZ0LT50eXBlICE9IFY0TDJfVFVORVJfQU5BTE9HX1RWKQogCQlyZXR1cm4gMDsKLQlpZiAoc3RhdGUtPm9wbW9kZSA9PSBPUE1PREVfQVVUT1NFTEVDVCkKLQkJbXNwX2RldGVjdF9zdGVyZW8oY2xpZW50KTsKLQl2dC0+YXVkbW9kZSAgICA9IHN0YXRlLT5hdWRtb2RlOwotCXZ0LT5yeHN1YmNoYW5zID0gc3RhdGUtPnJ4c3ViY2hhbnM7CisJaWYgKCFzdGF0ZS0+cmFkaW8pIHsKKwkJaWYgKHN0YXRlLT5vcG1vZGUgPT0gT1BNT0RFX0FVVE9TRUxFQ1QpCisJCQltc3BfZGV0ZWN0X3N0ZXJlbyhjbGllbnQpOworCQl2dC0+cnhzdWJjaGFucyA9IHN0YXRlLT5yeHN1YmNoYW5zOworCX0KKwl2dC0+YXVkbW9kZSA9IHN0YXRlLT5hdWRtb2RlOwogCXZ0LT5jYXBhYmlsaXR5IHw9IFY0TDJfVFVORVJfQ0FQX1NURVJFTyB8CiAJCVY0TDJfVFVORVJfQ0FQX0xBTkcxIHwgVjRMMl9UVU5FUl9DQVBfTEFORzI7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214MV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgxX2NhbWVyYS5jCmluZGV4IGJjMGMyM2EuLjYzZjhhMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgxX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgxX2NhbWVyYS5jCkBAIC00NDQsMTIgKzQ0NCw5IEBACiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IG14MV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQlpbnQgcmV0OwogCi0JaWYgKHBjZGV2LT5pY2QpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVidXN5OwotCX0KKwlpZiAocGNkZXYtPmljZCkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCWRldl9pbmZvKGljZC0+ZGV2LnBhcmVudCwgIk1YMSBDYW1lcmEgZHJpdmVyIGF0dGFjaGVkIHRvIGNhbWVyYSAlZFxuIiwKIAkJIGljZC0+ZGV2bnVtKTsKQEAgLTQ1OCw4ICs0NTUsNyBAQAogCiAJcGNkZXYtPmljZCA9IGljZDsKIAotZWJ1c3k6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbXgxX2NhbWVyYV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jCmluZGV4IDRhZGE5YmUuLmE2NDc4OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMKQEAgLTEyOSw3ICsxMjksNyBAQAogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTEpIik7CiAKIC8qIGxpc3Qgb2YgaW1hZ2UgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgT01BUDIgdmlkZW8gcGlwZWxpbmVzICovCi1jb25zdCBzdGF0aWMgc3RydWN0IHY0bDJfZm10ZGVzYyBvbWFwX2Zvcm1hdHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9mbXRkZXNjIG9tYXBfZm9ybWF0c1tdID0gewogCXsKIAkJLyogTm90ZTogIFY0TDIgZGVmaW5lcyBSR0I1NjUgYXM6CiAJCSAqCkBAIC05ODIsNiArOTgyLDE0IEBACiAJc3RhcnRpbmRleCA9ICh2b3V0LT52aWQgPT0gT01BUF9WSURFTzEpID8KIAkJdmlkZW8xX251bWJ1ZmZlcnMgOiB2aWRlbzJfbnVtYnVmZmVyczsKIAorCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KKwlpZiAoKnNpemUgPiB2b3V0LT5idWZmZXJfc2l6ZSkgeworCQl2NGwyX2Vycigmdm91dC0+dmlkX2Rldi0+djRsMl9kZXYsCisJCQkJImJ1ZmZlciBhbGxvY2F0aW9uIG1pc21hdGNoIFsldV0gWyV1XVxuIiwKKwkJCQkqc2l6ZSwgdm91dC0+YnVmZmVyX3NpemUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlmb3IgKGkgPSBzdGFydGluZGV4OyBpIDwgKmNvdW50OyBpKyspIHsKIAkJdm91dC0+YnVmZmVyX3NpemUgPSAqc2l6ZTsKIApAQCAtMTIyOCw2ICsxMjM2LDE0IEBACiAJCQkJKHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAqLworCWlmIChzaXplID4gdm91dC0+YnVmZmVyX3NpemUpIHsKKwkJdjRsMl9lcnIoJnZvdXQtPnZpZF9kZXYtPnY0bDJfZGV2LAorCQkJCSJpbnN1ZmZpY2llbnQgbWVtb3J5IFslbHVdIFsldV1cbiIsCisJCQkJc2l6ZSwgdm91dC0+YnVmZmVyX3NpemUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlxLT5idWZzW2ldLT5iYWRkciA9IHZtYS0+dm1fc3RhcnQ7CiAKIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOwpAQCAtMjM5MSw3ICsyNDA3LDcgQEAKIAkJLyogUmVnaXN0ZXIgdGhlIFZpZGVvIGRldmljZSB3aXRoIFY0TDIKIAkJICovCiAJCXZmZCA9IHZvdXQtPnZmZDsKLQkJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZmQsIFZGTF9UWVBFX0dSQUJCRVIsIGsgKyAxKSA8IDApIHsKKwkJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZmQsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKSA8IDApIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgIjogQ291bGQgbm90IHJlZ2lzdGVyICIKIAkJCQkJIlZpZGVvIGZvciBMaW51eCBkZXZpY2VcbiIpOwogCQkJdmZkLT5taW5vciA9IC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dGxpYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dGxpYi5jCmluZGV4IDJhYTZhNzYuLjhhZTc0ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRsaWIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0bGliLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQlpZiAoY3JvcC0+aGVpZ2h0ICE9IHdpbi0+dy5oZWlnaHQpIHsKKwkJaWYgKHRyeV9jcm9wLmhlaWdodCAhPSB3aW4tPncuaGVpZ2h0KSB7CiAJCQkvKiBJZiB3ZSdyZSByZXNpemluZyB2ZXJ0aWNhbGx5LCB3ZSBjYW4ndCBzdXBwb3J0IGEKIAkJCSAqIGNyb3Agd2lkdGggd2lkZXIgdGhhbiA3NjggcGl4ZWxzLgogCQkJICovCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkJfQogCX0KIAkvKiB2ZXJ0aWNhbCByZXNpemluZyAqLwotCXZyZXNpemUgPSAoMTAyNCAqIGNyb3AtPmhlaWdodCkgLyB3aW4tPncuaGVpZ2h0OworCXZyZXNpemUgPSAoMTAyNCAqIHRyeV9jcm9wLmhlaWdodCkgLyB3aW4tPncuaGVpZ2h0OwogCWlmIChjcHVfaXNfb21hcDI0eHgoKSAmJiAodnJlc2l6ZSA+IDIwNDgpKQogCQl2cmVzaXplID0gMjA0ODsKIAllbHNlIGlmIChjcHVfaXNfb21hcDM0eHgoKSAmJiAodnJlc2l6ZSA+IDQwOTYpKQpAQCAtMjIxLDcgKzIyMSw3IEBACiAJCQl0cnlfY3JvcC5oZWlnaHQgPSAyOwogCX0KIAkvKiBob3Jpem9udGFsIHJlc2l6aW5nICovCi0JaHJlc2l6ZSA9ICgxMDI0ICogY3JvcC0+d2lkdGgpIC8gd2luLT53LndpZHRoOworCWhyZXNpemUgPSAoMTAyNCAqIHRyeV9jcm9wLndpZHRoKSAvIHdpbi0+dy53aWR0aDsKIAlpZiAoY3B1X2lzX29tYXAyNHh4KCkgJiYgKGhyZXNpemUgPiAyMDQ4KSkKIAkJaHJlc2l6ZSA9IDIwNDg7CiAJZWxzZSBpZiAoY3B1X2lzX29tYXAzNHh4KCkgJiYgKGhyZXNpemUgPiA0MDk2KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0uYwppbmRleCBmNjYyNmU4Li42OWI2MGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jCkBAIC0xNzY4LDE0ICsxNzY4LDEzIEBACiAJCWRldl9lcnIoY2FtLT5kZXYsICJubyBtZW0gcmVzb3VyY2U/XG4iKTsKIAkJZ290byBlcnI7CiAJfQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIChtZW0tPmVuZCAtIG1lbS0+c3RhcnQpICsgMSwKLQkJCQlwZGV2LT5uYW1lKSkgeworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSwgcGRldi0+bmFtZSkpIHsKIAkJZGV2X2VycihjYW0tPmRldiwKIAkJCSJjYW5ub3QgcmVzZXJ2ZSBjYW1lcmEgcmVnaXN0ZXIgSS9PIHJlZ2lvblxuIik7CiAJCWdvdG8gZXJyOwogCX0KIAljYW0tPm1taW9fYmFzZV9waHlzID0gbWVtLT5zdGFydDsKLQljYW0tPm1taW9fc2l6ZSA9IChtZW0tPmVuZCAtIG1lbS0+c3RhcnQpICsgMTsKKwljYW0tPm1taW9fc2l6ZSA9IHJlc291cmNlX3NpemUobWVtKTsKIAogCS8qIG1hcCB0aGUgcmVnaW9uICovCiAJY2FtLT5tbWlvX2Jhc2UgPSAodW5zaWduZWQgbG9uZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcC5jCmluZGV4IDQ3MmE2OTMuLjk0YjZlZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuYwpAQCAtMzkxLDcgKzM5MSw3IEBACiAJfTsKIAlpbnQgaTsKIAotCWRldl9kYmcoaXNwLT5kZXYsICIiKTsKKwlkZXZfZGJnKGlzcC0+ZGV2LCAiSVNQIElSUTogIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuYW1lKTsgaSsrKSB7CiAJCWlmICgoMSA8PCBpKSAmIGlycXN0YXR1cykKQEAgLTE3NDgsNyArMTc0OCw3IEBACiAJCWdvdG8gZG9uZTsKIAogCS8qIFJlZ2lzdGVyIGV4dGVybmFsIGVudGl0aWVzICovCi0JZm9yIChzdWJkZXZzID0gcGRhdGEtPnN1YmRldnM7IHN1YmRldnMtPnN1YmRldnM7ICsrc3ViZGV2cykgeworCWZvciAoc3ViZGV2cyA9IHBkYXRhLT5zdWJkZXZzOyBzdWJkZXZzICYmIHN1YmRldnMtPnN1YmRldnM7ICsrc3ViZGV2cykgewogCQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNlbnNvcjsKIAkJc3RydWN0IG1lZGlhX2VudGl0eSAqaW5wdXQ7CiAJCXVuc2lnbmVkIGludCBmbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKaW5kZXggOWQwZGQwOC4uZTk4ZDM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKQEAgLTMwNDYsNiArMzA0Niw4IEBACiAJaWYgKGhkdy0+aW5wdXRfZGlydHkgfHwgaGR3LT5hdWRpb21vZGVfZGlydHkgfHwgaGR3LT5mb3JjZV9kaXJ0eSkgewogCQlzdHJ1Y3QgdjRsMl90dW5lciB2dDsKIAkJbWVtc2V0KCZ2dCwgMCwgc2l6ZW9mKHZ0KSk7CisJCXZ0LnR5cGUgPSAoaGR3LT5pbnB1dF92YWwgPT0gUFZSMl9DVkFMX0lOUFVUX1JBRElPKSA/CisJCQlWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJCXZ0LmF1ZG1vZGUgPSBoZHctPmF1ZGlvbW9kZV92YWw7CiAJCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZoZHctPnY0bDJfZGV2LCAwLCB0dW5lciwgc190dW5lciwgJnZ0KTsKIAl9CkBAIC01MTcxLDYgKzUxNzMsOCBAQAogewogCXN0cnVjdCB2NGwyX3R1bmVyICp2dHAgPSAmaGR3LT50dW5lcl9zaWduYWxfaW5mbzsKIAltZW1zZXQodnRwLCAwLCBzaXplb2YoKnZ0cCkpOworCXZ0cC0+dHlwZSA9IChoZHctPmlucHV0X3ZhbCA9PSBQVlIyX0NWQUxfSU5QVVRfUkFESU8pID8KKwkJVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOwogCWhkdy0+dHVuZXJfc2lnbmFsX3N0YWxlID0gMDsKIAkvKiBOb3RlOiBUaGVyZSBhcHBhcmVudGx5IGlzIG5vIHJlcGxhY2VtZW50IGZvciBWSURJT0NfQ1JPUENBUAogCSAgIHVzaW5nIHY0bDItc3ViZGV2IC0gdGhlcmVmb3JlIHdlIGNhbid0IHN1cHBvcnQgdGhhdCBBVCBBTEwgcmlnaHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtY3RybC5jCmluZGV4IDE1OTNmOGQuLjc2MGI0ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYwpAQCAtMTQxNCw3ICsxNDE0LDcgQEAKIAl7CiAJCUFSR19ERUYoc3RydWN0IHB3Y19wcm9iZSwgcHJvYmUpCiAKLQkJc3RyY3B5KEFSR1IocHJvYmUpLm5hbWUsIHBkZXYtPnZkZXYtPm5hbWUpOworCQlzdHJjcHkoQVJHUihwcm9iZSkubmFtZSwgcGRldi0+dmRldi5uYW1lKTsKIAkJQVJHUihwcm9iZSkudHlwZSA9IHBkZXYtPnR5cGU7CiAJCUFSR19PVVQocHJvYmUpCiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwppbmRleCAzNTZjZDQyLi5iMGJkZTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwpAQCAtNDAsNyArNDAsNyBAQAogICAgT2ggeWVzLCBjb252ZW50aW9uOiB0byBkaXNjdGluZ3Vpc2ggYmV0d2VlbiBhbGwgdGhlIHZhcmlvdXMgcG9pbnRlcnMgdG8KICAgIGRldmljZS1zdHJ1Y3R1cmVzLCBJIHVzZSB0aGVzZSBuYW1lcyBmb3IgdGhlIHBvaW50ZXIgdmFyaWFibGVzOgogICAgdWRldjogc3RydWN0IHVzYl9kZXZpY2UgKgotICAgdmRldjogc3RydWN0IHZpZGVvX2RldmljZSAqCisgICB2ZGV2OiBzdHJ1Y3QgdmlkZW9fZGV2aWNlIChtZW1iZXIgb2YgcHdjX2RldikKICAgIHBkZXY6IHN0cnVjdCBwd2NfZGV2aXZlICoKICovCiAKQEAgLTE1Miw2ICsxNTIsNyBAQAogCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CiBzdGF0aWMgdW5zaWduZWQgaW50IHB3Y192aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKIHN0YXRpYyBpbnQgIHB3Y192aWRlb19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CitzdGF0aWMgdm9pZCBwd2NfdmlkZW9fcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHB3Y19mb3BzID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLApAQCAtMTY0LDQyICsxNjUsMTIgQEAKIH07CiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBwd2NfdGVtcGxhdGUgPSB7CiAJLm5hbWUgPQkJIlBoaWxpcHMgV2ViY2FtIiwJLyogRmlsbGVkIGluIGxhdGVyICovCi0JLnJlbGVhc2UgPQl2aWRlb19kZXZpY2VfcmVsZWFzZSwKKwkucmVsZWFzZSA9CXB3Y192aWRlb19yZWxlYXNlLAogCS5mb3BzID0gICAgICAgICAmcHdjX2ZvcHMsCisJLmlvY3RsX29wcyA9CSZwd2NfaW9jdGxfb3BzLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogT2theSwgdGhpcyBpcyBzb21lIG1hZ2ljIHRoYXQgSSB3b3JrZWQgb3V0IGFuZCB0aGUgcmVhc29uaW5nIGJlaGluZCBpdC4uLgotCi0gICBUaGUgYmlnZ2VzdCBwcm9ibGVtIHdpdGggYW55IFVTQiBkZXZpY2UgaXMgb2YgY291cnNlOiAid2hhdCB0byBkbwotICAgd2hlbiB0aGUgdXNlciB1bnBsdWdzIHRoZSBkZXZpY2Ugd2hpbGUgaXQgaXMgaW4gdXNlIGJ5IGFuIGFwcGxpY2F0aW9uPyIKLSAgIFdlIGhhdmUgc2V2ZXJhbCBvcHRpb25zOgotICAgMSkgQ3Vyc2UgdGhlbSB3aXRoIHRoZSA3IHBsYWd1ZXMgd2hlbiB0aGV5IGRvIChyZXF1aXJlcyBkaXZpbmUgaW50ZXJ2ZW50aW9uKQotICAgMikgVGVsbCB0aGVtIG5vdCB0byAod29uJ3Qgd29yazogdGhleSdsbCBkbyBpdCBhbnl3YXkpCi0gICAzKSBPb3BzIHRoZSBrZXJuZWwgKHRoaXMgd2lsbCBoYXZlIGEgbmVnYXRpdmUgZWZmZWN0IG9uIGEgdXNlcidzIHVwdGltZSkKLSAgIDQpIERvIHNvbWV0aGluZyBzZW5zaWJsZS4KLQotICAgT2YgY291cnNlLCB3ZSBnbyBmb3Igb3B0aW9uIDQuCi0KLSAgIEl0IGhhcHBlbnMgdGhhdCB0aGlzIGRldmljZSB3aWxsIGJlIGxpbmtlZCB0byB0d28gdGltZXMsIG9uY2UgZnJvbQotICAgdXNiX2RldmljZSBhbmQgb25jZSBmcm9tIHRoZSB2aWRlb19kZXZpY2UgaW4gdGhlaXIgcmVzcGVjdGl2ZSAncHJpdmF0ZScKLSAgIHBvaW50ZXJzLiBUaGlzIGlzIGRvbmUgd2hlbiB0aGUgZGV2aWNlIGlzIHByb2JlZCgpIGFuZCBhbGwgaW5pdGlhbGl6YXRpb24KLSAgIHN1Y2NlZWRlZC4gVGhlIHB3Y19kZXZpY2Ugc3RydWN0IGxpbmtzIGJhY2sgdG8gYm90aCBzdHJ1Y3R1cmVzLgotCi0gICBXaGVuIGEgZGV2aWNlIGlzIHVucGx1Z2dlZCB3aGlsZSBpbiB1c2UgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlCi0gICBsaXN0IG9mIGtub3duIFVTQiBkZXZpY2VzOyBJIGFsc28gZGUtcmVnaXN0ZXIgaXQgYXMgYSBWNEwgZGV2aWNlLCBidXQKLSAgIHVuZm9ydHVuYXRlbHkgSSBjYW4ndCBmcmVlIHRoZSBtZW1vcnkgc2luY2UgdGhlIHN0cnVjdCBpcyBzdGlsbCBpbiB1c2UKLSAgIGJ5IHRoZSBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgZnJlZS1pbmcgaXMgdGhlbiBkZWZlcmVuZCB1bnRpbCB0aGUgZmlyc3QKLSAgIG9wcG9ydHVuaXR5LiBDcnVkZSwgYnV0IGl0IHdvcmtzLgotCi0gICBBIHNtYWxsICdhZHZhbnRhZ2UnIGlzIHRoYXQgaWYgYSB1c2VyIHVucGx1Z3MgdGhlIGNhbSBhbmQgcGx1Z3MgaXQgYmFjawotICAgaW4sIGl0IHNob3VsZCBnZXQgYXNzaWduZWQgdGhlIHNhbWUgdmlkZW8gZGV2aWNlIG1pbm9yLCBidXQgdW5mb3J0dW5hdGVseQotICAgaXQncyBub24tdHJpdmlhbCB0byByZS1saW5rIHRoZSBjYW0gYmFjayB0byB0aGUgdmlkZW8gZGV2aWNlLi4uICh0aGF0Ci0gICB3b3VsZCBzdXJlbHkgYmUgbWFnaWMhIDopKQotKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFByaXZhdGUgZnVuY3Rpb25zICovCiAKIC8qIEhlcmUgd2Ugd2FudCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWVtb3J5LgpAQCAtMTAxNiwxNiArOTg3LDE1IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoYnV0dG9uLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19zbmFwc2hvdF9idXR0b25fc3RhdHVzLAogCQkgICBOVUxMKTsKIAotc3RhdGljIGludCBwd2NfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCitzdGF0aWMgaW50IHB3Y19jcmVhdGVfc3lzZnNfZmlsZXMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKIAlpbnQgcmM7CiAKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfYnV0dG9uKTsKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+dmRldi5kZXYsICZkZXZfYXR0cl9idXR0b24pOwogCWlmIChyYykKIAkJZ290byBlcnI7CiAJaWYgKHBkZXYtPmZlYXR1cmVzICYgRkVBVFVSRV9NT1RPUl9QQU5USUxUKSB7Ci0JCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ2ZGV2LT5kZXYsICZkZXZfYXR0cl9wYW5fdGlsdCk7CisJCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT52ZGV2LmRldiwgJmRldl9hdHRyX3Bhbl90aWx0KTsKIAkJaWYgKHJjKQogCQkJZ290byBlcnJfYnV0dG9uOwogCX0KQEAgLTEwMzMsMTkgKzEwMDMsMTcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX2J1dHRvbjoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZkZXYtPmRldiwgJmRldl9hdHRyX2J1dHRvbik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT52ZGV2LmRldiwgJmRldl9hdHRyX2J1dHRvbik7CiBlcnI6CiAJUFdDX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIHN5c2ZzIGZpbGVzLlxuIik7CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCitzdGF0aWMgdm9pZCBwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0KIAlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfcGFuX3RpbHQpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmdmRldi0+ZGV2LCAmZGV2X2F0dHJfYnV0dG9uKTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT52ZGV2LmRldiwgJmRldl9hdHRyX3Bhbl90aWx0KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPnZkZXYuZGV2LCAmZGV2X2F0dHJfYnV0dG9uKTsKIH0KIAogI2lmZGVmIENPTkZJR19VU0JfUFdDX0RFQlVHCkBAIC0xMTA2LDcgKzEwNzQsNyBAQAogCQlpZiAocmV0ID49IDApCiAJCXsKIAkJCVBXQ19ERUJVR19PUEVOKCJUaGlzICVzIGNhbWVyYSBpcyBlcXVpcHBlZCB3aXRoIGEgJXMgKCVkKS5cbiIsCi0JCQkJCXBkZXYtPnZkZXYtPm5hbWUsCisJCQkJCXBkZXYtPnZkZXYubmFtZSwKIAkJCQkJcHdjX3NlbnNvcl90eXBlX3RvX3N0cmluZyhpKSwgaSk7CiAJCX0KIAl9CkBAIC0xMTgwLDE2ICsxMTQ4LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgcHdjX2NsZWFudXAoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBwd2NfdmlkZW9fcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQpCiB7Ci0JcHdjX3JlbW92ZV9zeXNmc19maWxlcyhwZGV2LT52ZGV2KTsKLQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShwZGV2LT52ZGV2KTsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IGNvbnRhaW5lcl9vZih2ZmQsIHN0cnVjdCBwd2NfZGV2aWNlLCB2ZGV2KTsKKwlpbnQgaGludDsKIAotI2lmZGVmIENPTkZJR19VU0JfUFdDX0lOUFVUX0VWREVWCi0JaWYgKHBkZXYtPmJ1dHRvbl9kZXYpCi0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHBkZXYtPmJ1dHRvbl9kZXYpOwotI2VuZGlmCisJLyogc2VhcmNoIGRldmljZV9oaW50W10gdGFibGUgaWYgd2Ugb2NjdXB5IGEgc2xvdCwgYnkgYW55IGNoYW5jZSAqLworCWZvciAoaGludCA9IDA7IGhpbnQgPCBNQVhfREVWX0hJTlRTOyBoaW50KyspCisJCWlmIChkZXZpY2VfaGludFtoaW50XS5wZGV2ID09IHBkZXYpCisJCQlkZXZpY2VfaGludFtoaW50XS5wZGV2ID0gTlVMTDsKIAogCWtmcmVlKHBkZXYpOwogfQpAQCAtMTE5OSw3ICsxMTY2LDcgQEAKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OwotCWludCBpLCBoaW50OworCWludCBpOwogCiAJUFdDX0RFQlVHX09QRU4oIj4+IHZpZGVvX2Nsb3NlIGNhbGxlZCh2ZGV2ID0gMHglcCkuXG4iLCB2ZGV2KTsKIApAQCAtMTIzNCwxMiArMTIwMSw2IEBACiAJCX0KIAkJcGRldi0+dm9wZW4tLTsKIAkJUFdDX0RFQlVHX09QRU4oIjw8IHZpZGVvX2Nsb3NlKCkgdm9wZW49JWRcbiIsIHBkZXYtPnZvcGVuKTsKLQl9IGVsc2UgewotCQlwd2NfY2xlYW51cChwZGV2KTsKLQkJLyogc2VhcmNoIGRldmljZV9oaW50W10gdGFibGUgaWYgd2Ugb2NjdXB5IGEgc2xvdCwgYnkgYW55IGNoYW5jZSAqLwotCQlmb3IgKGhpbnQgPSAwOyBoaW50IDwgTUFYX0RFVl9ISU5UUzsgaGludCsrKQotCQkJaWYgKGRldmljZV9oaW50W2hpbnRdLnBkZXYgPT0gcGRldikKLQkJCQlkZXZpY2VfaGludFtoaW50XS5wZGV2ID0gTlVMTDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE3MTUsMTkgKzE2NzYsMTIgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwZGV2LT5mcmFtZXEpOwogCXBkZXYtPnZjb21wcmVzc2lvbiA9IHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb247CiAKLQkvKiBBbGxvY2F0ZSB2aWRlb19kZXZpY2Ugc3RydWN0dXJlICovCi0JcGRldi0+dmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwotCWlmICghcGRldi0+dmRldikgewotCQlQV0NfRVJST1IoIkVyciwgY2Fubm90IGFsbG9jYXRlIHZpZGVvX2RldmljZSBzdHJ1dHVyZS4gRmFpbGluZyBwcm9iZS4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9mcmVlX21lbTsKLQl9Ci0JbWVtY3B5KHBkZXYtPnZkZXYsICZwd2NfdGVtcGxhdGUsIHNpemVvZihwd2NfdGVtcGxhdGUpKTsKLQlwZGV2LT52ZGV2LT5wYXJlbnQgPSAmaW50Zi0+ZGV2OwotCXBkZXYtPnZkZXYtPmxvY2sgPSAmcGRldi0+bW9kbG9jazsKLQlwZGV2LT52ZGV2LT5pb2N0bF9vcHMgPSAmcHdjX2lvY3RsX29wczsKLQlzdHJjcHkocGRldi0+dmRldi0+bmFtZSwgbmFtZSk7Ci0JdmlkZW9fc2V0X2RydmRhdGEocGRldi0+dmRldiwgcGRldik7CisJLyogSW5pdCB2aWRlb19kZXZpY2Ugc3RydWN0dXJlICovCisJbWVtY3B5KCZwZGV2LT52ZGV2LCAmcHdjX3RlbXBsYXRlLCBzaXplb2YocHdjX3RlbXBsYXRlKSk7CisJcGRldi0+dmRldi5wYXJlbnQgPSAmaW50Zi0+ZGV2OworCXBkZXYtPnZkZXYubG9jayA9ICZwZGV2LT5tb2Rsb2NrOworCXN0cmNweShwZGV2LT52ZGV2Lm5hbWUsIG5hbWUpOworCXZpZGVvX3NldF9kcnZkYXRhKCZwZGV2LT52ZGV2LCBwZGV2KTsKIAogCXBkZXYtPnJlbGVhc2UgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7CiAJUFdDX0RFQlVHX1BST0JFKCJSZWxlYXNlOiAlMDR4XG4iLCBwZGV2LT5yZWxlYXNlKTsKQEAgLTE3NDYsOCArMTcwMCw2IEBACiAJCX0KIAl9CiAKLQlwZGV2LT52ZGV2LT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7Ci0KIAkvKiBvY2N1cHkgc2xvdCAqLwogCWlmIChoaW50IDwgTUFYX0RFVl9ISU5UUykKIAkJZGV2aWNlX2hpbnRbaGludF0ucGRldiA9IHBkZXY7CkBAIC0xNzU5LDE2ICsxNzExLDE2IEBACiAJcHdjX3NldF9sZWRzKHBkZXYsIDAsIDApOwogCXB3Y19jYW1lcmFfcG93ZXIocGRldiwgMCk7CiAKLQlyYyA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShwZGV2LT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucik7CisJcmMgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnBkZXYtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKTsKIAlpZiAocmMgPCAwKSB7CiAJCVBXQ19FUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGFzIHZpZGVvIGRldmljZSAoJWQpLlxuIiwgcmMpOwotCQlnb3RvIGVycl92aWRlb19yZWxlYXNlOworCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9Ci0JcmMgPSBwd2NfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYtPnZkZXYpOworCXJjID0gcHdjX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2KTsKIAlpZiAocmMpCiAJCWdvdG8gZXJyX3ZpZGVvX3VucmVnOwogCi0JUFdDX0lORk8oIlJlZ2lzdGVyZWQgYXMgJXMuXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHBkZXYtPnZkZXYpKTsKKwlQV0NfSU5GTygiUmVnaXN0ZXJlZCBhcyAlcy5cbiIsIHZpZGVvX2RldmljZV9ub2RlX25hbWUoJnBkZXYtPnZkZXYpKTsKIAogI2lmZGVmIENPTkZJR19VU0JfUFdDX0lOUFVUX0VWREVWCiAJLyogcmVnaXN0ZXIgd2ViY2FtIHNuYXBzaG90IGJ1dHRvbiBpbnB1dCBkZXZpY2UgKi8KQEAgLTE3NzYsNyArMTcyOCw3IEBACiAJaWYgKCFwZGV2LT5idXR0b25fZGV2KSB7CiAJCVBXQ19FUlJPUigiRXJyLCBpbnN1ZmZpY2llbnQgbWVtb3J5IGZvciB3ZWJjYW0gc25hcHNob3QgYnV0dG9uIGRldmljZS4iKTsKIAkJcmMgPSAtRU5PTUVNOwotCQlwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYtPnZkZXYpOworCQlwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYpOwogCQlnb3RvIGVycl92aWRlb191bnJlZzsKIAl9CiAKQEAgLTE3OTQsNyArMTc0Niw3IEBACiAJaWYgKHJjKSB7CiAJCWlucHV0X2ZyZWVfZGV2aWNlKHBkZXYtPmJ1dHRvbl9kZXYpOwogCQlwZGV2LT5idXR0b25fZGV2ID0gTlVMTDsKLQkJcHdjX3JlbW92ZV9zeXNmc19maWxlcyhwZGV2LT52ZGV2KTsKKwkJcHdjX3JlbW92ZV9zeXNmc19maWxlcyhwZGV2KTsKIAkJZ290byBlcnJfdmlkZW9fdW5yZWc7CiAJfQogI2VuZGlmCkBAIC0xODA0LDEwICsxNzU2LDcgQEAKIGVycl92aWRlb191bnJlZzoKIAlpZiAoaGludCA8IE1BWF9ERVZfSElOVFMpCiAJCWRldmljZV9oaW50W2hpbnRdLnBkZXYgPSBOVUxMOwotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHBkZXYtPnZkZXYpOwotCXBkZXYtPnZkZXYgPSBOVUxMOwkvKiBTbyB3ZSBkb24ndCB0cnkgdG8gcmVsZWFzZSBpdCBiZWxvdyAqLwotZXJyX3ZpZGVvX3JlbGVhc2U6Ci0JdmlkZW9fZGV2aWNlX3JlbGVhc2UocGRldi0+dmRldik7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnBkZXYtPnZkZXYpOwogZXJyX2ZyZWVfbWVtOgogCWtmcmVlKHBkZXYpOwogCXJldHVybiByYzsKQEAgLTE4MTYsMTAgKzE3NjUsOCBAQAogLyogVGhlIHVzZXIgeWFua2VkIG91dCB0aGUgY2FibGUuLi4gKi8KIHN0YXRpYyB2b2lkIHVzYl9wd2NfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKLQlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKLQlpbnQgaGludDsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiAgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCi0JcGRldiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwogCW11dGV4X2xvY2soJnBkZXYtPm1vZGxvY2spOwogCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIE5VTEwpOwogCWlmIChwZGV2ID09IE5VTEwpIHsKQEAgLTE4MzYsMzAgKzE3ODMsMjUgQEAKIAl9CiAKIAkvKiBXZSBnb3QgdW5wbHVnZ2VkOyB0aGlzIGlzIHNpZ25hbGxlZCBieSBhbiBFUElQRSBlcnJvciBjb2RlICovCi0JaWYgKHBkZXYtPnZvcGVuKSB7Ci0JCVBXQ19JTkZPKCJEaXNjb25uZWN0ZWQgd2hpbGUgd2ViY2FtIGlzIGluIHVzZSFcbiIpOwotCQlwZGV2LT5lcnJvcl9zdGF0dXMgPSBFUElQRTsKLQl9CisJcGRldi0+ZXJyb3Jfc3RhdHVzID0gRVBJUEU7CisJcGRldi0+dW5wbHVnZ2VkID0gMTsKIAogCS8qIEFsZXJ0IHdhaXRpbmcgcHJvY2Vzc2VzICovCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwZGV2LT5mcmFtZXEpOwotCS8qIFdhaXQgdW50aWwgZGV2aWNlIGlzIGNsb3NlZCAqLwotCWlmIChwZGV2LT52b3BlbikgewotCQlwZGV2LT51bnBsdWdnZWQgPSAxOwotCQlwd2NfaXNvX3N0b3AocGRldik7Ci0JfSBlbHNlIHsKLQkJLyogRGV2aWNlIGlzIGNsb3NlZCwgc28gd2UgY2FuIHNhZmVseSB1bnJlZ2lzdGVyIGl0ICovCi0JCVBXQ19ERUJVR19QUk9CRSgiVW5yZWdpc3RlcmluZyB2aWRlbyBkZXZpY2UgaW4gZGlzY29ubmVjdCgpLlxuIik7CisKKwkvKiBObyBuZWVkIHRvIGtlZXAgdGhlIHVyYnMgYXJvdW5kIGFmdGVyIGRpc2Nvbm5lY3Rpb24gKi8KKwlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOwogCiBkaXNjb25uZWN0X291dDoKLQkJLyogc2VhcmNoIGRldmljZV9oaW50W10gdGFibGUgaWYgd2Ugb2NjdXB5IGEgc2xvdCwgYnkgYW55IGNoYW5jZSAqLwotCQlmb3IgKGhpbnQgPSAwOyBoaW50IDwgTUFYX0RFVl9ISU5UUzsgaGludCsrKQotCQkJaWYgKGRldmljZV9oaW50W2hpbnRdLnBkZXYgPT0gcGRldikKLQkJCQlkZXZpY2VfaGludFtoaW50XS5wZGV2ID0gTlVMTDsKLQl9Ci0KIAltdXRleF91bmxvY2soJnBkZXYtPm1vZGxvY2spOwotCXB3Y19jbGVhbnVwKHBkZXYpOworCisJcHdjX3JlbW92ZV9zeXNmc19maWxlcyhwZGV2KTsKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmcGRldi0+dmRldik7CisKKyNpZmRlZiBDT05GSUdfVVNCX1BXQ19JTlBVVF9FVkRFVgorCWlmIChwZGV2LT5idXR0b25fZGV2KQorCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShwZGV2LT5idXR0b25fZGV2KTsKKyNlbmRpZgogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKaW5kZXggZTk0Nzc2Ni4uMDgzZjhiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKQEAgLTE2Miw5ICsxNjIsOSBAQAogCiBzdHJ1Y3QgcHdjX2RldmljZQogewotICAgc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7CiAKLSAgIC8qIFBvaW50ZXIgdG8gb3VyIHVzYl9kZXZpY2UgKi8KKyAgIC8qIFBvaW50ZXIgdG8gb3VyIHVzYl9kZXZpY2UsIG1heSBiZSBOVUxMIGFmdGVyIHVucGx1ZyAqLwogICAgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAKICAgIGludCB0eXBlOyAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBvZiBjYW0gKDY0NSwgNjQ2LCA2NzUsIDY4MCwgNjkwLCA3MjAsIDczMCwgNzQwLCA3NTApICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY2FwdHVyZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNhcHR1cmUuYwppbmRleCBkMTQyYjQwLi44MWI0YTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY2FwdHVyZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jYXB0dXJlLmMKQEAgLTEsNyArMSw3IEBACiAvKgotICogU2Ftc3VuZyBTNVAgU29DIHNlcmllcyBjYW1lcmEgaW50ZXJmYWNlIChjYW1lcmEgY2FwdHVyZSkgZHJpdmVyCisgKiBTYW1zdW5nIFM1UC9FWFlOT1M0IFNvQyBzZXJpZXMgY2FtZXJhIGludGVyZmFjZSAoY2FtZXJhIGNhcHR1cmUpIGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCiAgKiBBdXRob3I6IFN5bHdlc3RlciBOYXdyb2NraSwgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTI2MiwxMiArMjYyLDcgQEAKIHsKIAlpZiAoIWZyIHx8IHBsYW5lID49IGZyLT5mbXQtPm1lbXBsYW5lcykKIAkJcmV0dXJuIDA7Ci0KLQlkYmcoIiVzOiB3OiAlZC4gaDogJWQuIGRlcHRoWyVkXTogJWQiLAotCSAgICBfX2Z1bmNfXywgZnItPndpZHRoLCBmci0+aGVpZ2h0LCBwbGFuZSwgZnItPmZtdC0+ZGVwdGhbcGxhbmVdKTsKLQogCXJldHVybiBmci0+Zl93aWR0aCAqIGZyLT5mX2hlaWdodCAqIGZyLT5mbXQtPmRlcHRoW3BsYW5lXSAvIDg7Ci0KIH0KIAogc3RhdGljIGludCBxdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpudW1fYnVmZmVycywKQEAgLTI4MywyNCArMjc4LDE0IEBACiAKIAkqbnVtX3BsYW5lcyA9IGZtdC0+bWVtcGxhbmVzOwogCi0JZGJnKCIlcywgYnVmZmVyIGNvdW50PSVkLCBwbGFuZSBjb3VudD0lZCIsCi0JICAgIF9fZnVuY19fLCAqbnVtX2J1ZmZlcnMsICpudW1fcGxhbmVzKTsKLQogCWZvciAoaSA9IDA7IGkgPCBmbXQtPm1lbXBsYW5lczsgaSsrKSB7CiAJCXNpemVzW2ldID0gZ2V0X3BsYW5lX3NpemUoJmN0eC0+ZF9mcmFtZSwgaSk7Ci0JCWRiZygicGxhbmU6ICV1LCBwbGFuZV9zaXplOiAlbHUiLCBpLCBzaXplc1tpXSk7CiAJCWFsbG9jYXRvcnNbaV0gPSBjdHgtPmZpbWNfZGV2LT5hbGxvY19jdHg7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYnVmZmVyX2luaXQoc3RydWN0IHZiMl9idWZmZXIgKnZiKQotewotCS8qIFRPRE86ICovCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogewogCXN0cnVjdCB2YjJfcXVldWUgKnZxID0gdmItPnZiMl9xdWV1ZTsKQEAgLTM4MCw3ICszNjUsNiBAQAogCS5xdWV1ZV9zZXR1cAkJPSBxdWV1ZV9zZXR1cCwKIAkuYnVmX3ByZXBhcmUJCT0gYnVmZmVyX3ByZXBhcmUsCiAJLmJ1Zl9xdWV1ZQkJPSBidWZmZXJfcXVldWUsCi0JLmJ1Zl9pbml0CQk9IGJ1ZmZlcl9pbml0LAogCS53YWl0X3ByZXBhcmUJCT0gZmltY191bmxvY2ssCiAJLndhaXRfZmluaXNoCQk9IGZpbWNfbG9jaywKIAkuc3RhcnRfc3RyZWFtaW5nCT0gc3RhcnRfc3RyZWFtaW5nLApAQCAtOTAzLDYgKzg4Nyw3IEBACiBlcnJfdjRsMl9yZWc6CiAJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcih2NGwyX2Rldik7CiBlcnJfaW5mbzoKKwlrZnJlZShjdHgpOwogCWRldl9lcnIoJmZpbWMtPnBkZXYtPmRldiwgImZhaWxlZCB0byBpbnN0YWxsXG4iKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmMKaW5kZXggZGM5MWE4NS4uYmRmMTlhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5jCkBAIC0xLDkgKzEsOCBAQAogLyoKLSAqIFM1UCBjYW1lcmEgaW50ZXJmYWNlICh2aWRlbyBwb3N0cHJvY2Vzc29yKSBkcml2ZXIKKyAqIFNhbXN1bmcgUzVQL0VYWU5PUzQgU29DIHNlcmllcyBjYW1lcmEgaW50ZXJmYWNlICh2aWRlbyBwb3N0cHJvY2Vzc29yKSBkcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZAotICoKLSAqIFN5bHdlc3RlciBOYXdyb2NraSwgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQ29udGFjdDogU3lsd2VzdGVyIE5hd3JvY2tpLCA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKQEAgLTQyLDcgKzQxLDYgQEAKIAkJLmNvbG9yCQk9IFM1UF9GSU1DX1JHQjU2NSwKIAkJLm1lbXBsYW5lcwk9IDEsCiAJCS5jb2xwbGFuZXMJPSAxLAotCQkubWJ1c19jb2RlCT0gVjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0JFLAogCQkuZmxhZ3MJCT0gRk1UX0ZMQUdTX00yTSwKIAl9LCB7CiAJCS5uYW1lCQk9ICJCR1I2NjYiLApAQCAtMjMyLDExICsyMzAsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0KIAkqc2hpZnQgPSAwLCAqcmF0aW8gPSAxOwotCi0JZGJnKCJzOiAlZCwgdDogJWQsIHNoaWZ0OiAlZCwgcmF0aW86ICVkIiwKLQkgICAgc3JjLCB0YXIsICpzaGlmdCwgKnJhdGlvKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjY4LDEwICsyNjIsOCBAQAogCQllcnIoImludmFsaWQgc291cmNlIHNpemU6ICVkIHggJWQiLCBzeCwgc3kpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0KIAlzYy0+cmVhbF93aWR0aCA9IHN4OwogCXNjLT5yZWFsX2hlaWdodCA9IHN5OwotCWRiZygic3g9ICVkLCBzeT0gJWQsIHR4PSAlZCwgdHk9ICVkIiwgc3gsIHN5LCB0eCwgdHkpOwogCiAJcmV0ID0gZmltY19nZXRfc2NhbGVyX2ZhY3RvcihzeCwgdHgsICZzYy0+cHJlX2hyYXRpbywgJnNjLT5oZmFjdG9yKTsKIAlpZiAocmV0KQpAQCAtNzExLDIyICs3MDMsMTggQEAKIAlmID0gY3R4X2dldF9mcmFtZShjdHgsIHZxLT50eXBlKTsKIAlpZiAoSVNfRVJSKGYpKQogCQlyZXR1cm4gUFRSX0VSUihmKTsKLQogCS8qCiAJICogUmV0dXJuIG51bWJlciBvZiBub24tY29udGlnb3VzIHBsYW5lcyAocGxhbmUgYnVmZmVycykKIAkgKiBkZXBlbmRpbmcgb24gdGhlIGNvbmZpZ3VyZWQgY29sb3IgZm9ybWF0LgogCSAqLwotCWlmIChmLT5mbXQpCi0JCSpudW1fcGxhbmVzID0gZi0+Zm10LT5tZW1wbGFuZXM7CisJaWYgKCFmLT5mbXQpCisJCXJldHVybiAtRUlOVkFMOwogCisJKm51bV9wbGFuZXMgPSBmLT5mbXQtPm1lbXBsYW5lczsKIAlmb3IgKGkgPSAwOyBpIDwgZi0+Zm10LT5tZW1wbGFuZXM7IGkrKykgewotCQlzaXplc1tpXSA9IChmLT53aWR0aCAqIGYtPmhlaWdodCAqIGYtPmZtdC0+ZGVwdGhbaV0pID4+IDM7CisJCXNpemVzW2ldID0gKGYtPmZfd2lkdGggKiBmLT5mX2hlaWdodCAqIGYtPmZtdC0+ZGVwdGhbaV0pIC8gODsKIAkJYWxsb2NhdG9yc1tpXSA9IGN0eC0+ZmltY19kZXYtPmFsbG9jX2N0eDsKIAl9Ci0KLQlpZiAoKm51bV9idWZmZXJzID09IDApCi0JCSpudW1fYnVmZmVycyA9IDE7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODUyLDcgKzg0MCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmaW1jX2Zvcm1hdHMpOyArK2kpIHsKIAkJZm10ID0gJmZpbWNfZm9ybWF0c1tpXTsKLQkJaWYgKGZtdC0+Zm91cmNjID09IGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgJiYKKwkJaWYgKGZtdC0+Zm91cmNjID09IGYtPmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgJiYKIAkJICAgKGZtdC0+ZmxhZ3MgJiBtYXNrKSkKIAkJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5oCmluZGV4IDNiZWIxZTUuLjFmNzA3NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuaApAQCAtMSw3ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcwotICoKLSAqIFN5bHdlc3RlciBOYXdyb2NraSwgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0xMzUsOSArMTMzLDEwIEBACiAgKiBAbmFtZTogZm9ybWF0IGRlc2NyaXB0aW9uCiAgKiBAZm91cmNjOiB0aGUgZm91cmNjIGNvZGUgZm9yIHRoaXMgZm9ybWF0LCAwIGlmIG5vdCBhcHBsaWNhYmxlCiAgKiBAY29sb3I6IHRoZSBjb3JyZXNwb25kaW5nIGZpbWNfY29sb3JfZm10Ci0gKiBAZGVwdGg6IHBlciBwbGFuZSBkcml2ZXIncyBwcml2YXRlICdudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwnCiAgKiBAbWVtcGxhbmVzOiBudW1iZXIgb2YgcGh5c2ljYWxseSBub24tY29udGlndW91cyBkYXRhIHBsYW5lcwogICogQGNvbHBsYW5lczogbnVtYmVyIG9mIHBoeXNpY2FsbHkgY29udGlndW91cyBkYXRhIHBsYW5lcworICogQGRlcHRoOiBwZXIgcGxhbmUgZHJpdmVyJ3MgcHJpdmF0ZSAnbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsJworICogQGZsYWdzOiBmbGFncyBpbmRpY2F0aW5nIHdoaWNoIG9wZXJhdGlvbiBtb2RlIGZvcm1hdCBhcHBsaWVzIHRvCiAgKi8KIHN0cnVjdCBmaW1jX2ZtdCB7CiAJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIG1idXNfY29kZTsKQEAgLTE3MSw3ICsxNzAsNyBAQAogfTsKIAogLyoqCi0gKiBzdHJ1Y3QgZmltY19lZmZlY3QgLSB0aGUgY29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgIkFyYml0cmFyeSIgaW1hZ2UgZWZmZWN0CisgKiBzdHJ1Y3QgZmltY19lZmZlY3QgLSBjb2xvciBlZmZlY3QgaW5mb3JtYXRpb24KICAqIEB0eXBlOgllZmZlY3QgdHlwZQogICogQHBhdF9jYjoJY3IgdmFsdWUgd2hlbiB0eXBlIGlzICJhcmJpdHJhcnkiCiAgKiBAcGF0X2NyOgljciB2YWx1ZSB3aGVuIHR5cGUgaXMgImFyYml0cmFyeSIKQEAgLTE4NCw3ICsxODMsNiBAQAogCiAvKioKICAqIHN0cnVjdCBmaW1jX3NjYWxlciAtIHRoZSBjb25maWd1cmF0aW9uIGRhdGEgZm9yIEZJTUMgaW5ldHJuYWwgc2NhbGVyCi0gKgogICogQHNjYWxldXBfaDoJCWZsYWcgaW5kaWNhdGluZyBzY2FsaW5nIHVwIGhvcml6b250YWxseQogICogQHNjYWxldXBfdjoJCWZsYWcgaW5kaWNhdGluZyBzY2FsaW5nIHVwIHZlcnRpY2FsbHkKICAqIEBjb3B5X21vZGU6CQlmbGFnIGluZGljYXRpbmcgdHJhbnNwYXJlbnQgRE1BIHRyYW5zZmVyIChubyBzY2FsaW5nCkBAIC0yMjAsNyArMjE4LDYgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgZmltY19hZGRyIC0gdGhlIEZJTUMgcGh5c2ljYWwgYWRkcmVzcyBzZXQgZm9yIERNQQotICoKICAqIEB5OgkgbHVtaW5hbmNlIHBsYW5lIHBoeXNpY2FsIGFkZHJlc3MKICAqIEBjYjoJIENiIHBsYW5lIHBoeXNpY2FsIGFkZHJlc3MKICAqIEBjcjoJIENyIHBsYW5lIHBoeXNpY2FsIGFkZHJlc3MKQEAgLTIzNCw2ICsyMzEsNyBAQAogLyoqCiAgKiBzdHJ1Y3QgZmltY192aWRfYnVmZmVyIC0gdGhlIGRyaXZlcidzIHZpZGVvIGJ1ZmZlcgogICogQHZiOiAgICB2NGwgdmlkZW9idWYgYnVmZmVyCisgKiBAbGlzdDogIGxpbmtlZCBsaXN0IHN0cnVjdHVyZSBmb3IgYnVmZmVyIHF1ZXVlCiAgKiBAcGFkZHI6IHByZWNhbGN1bGF0ZWQgcGh5c2ljYWwgYWRkcmVzcyBzZXQKICAqIEBpbmRleDogYnVmZmVyIGluZGV4IGZvciB0aGUgb3V0cHV0IERNQSBlbmdpbmUKICAqLwpAQCAtMjU0LDExICsyNTIsMTAgQEAKICAqIEBvZmZzX3Y6CWltYWdlIHZlcnRpY2FsIHBpeGVsIG9mZnNldAogICogQHdpZHRoOglpbWFnZSBwaXhlbCB3aWR0aAogICogQGhlaWdodDoJaW1hZ2UgcGl4ZWwgd2VpZ2h0Ci0gKiBAcGFkZHI6CWltYWdlIGZyYW1lIGJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzZXMKLSAqIEBidWZfY250OgludW1iZXIgb2YgYnVmZmVycyBkZXBlbmRpbmcgb24gYSBjb2xvciBmb3JtYXQKICAqIEBwYXlsb2FkOglpbWFnZSBzaXplIGluIGJ5dGVzICh3IHggaCB4IGJwcCkKLSAqIEBjb2xvcjoJY29sb3IgZm9ybWF0CisgKiBAcGFkZHI6CWltYWdlIGZyYW1lIGJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzZXMKICAqIEBkbWFfb2Zmc2V0OglETUEgb2Zmc2V0IGluIGJ5dGVzCisgKiBAZm10OglmaW1jIGNvbG9yIGZvcm1hdCBwb2ludGVyCiAgKi8KIHN0cnVjdCBmaW1jX2ZyYW1lIHsKIAl1MzIJZl93aWR0aDsKQEAgLTM5MCwyMSArMzg3LDIyIEBACiAKIC8qKgogICogc3RydWN0IGZpbWNfZGV2IC0gYWJzdHJhY3Rpb24gZm9yIEZJTUMgZW50aXR5Ci0gKgogICogQHNsb2NrOgl0aGUgc3BpbmxvY2sgcHJvdGVjdGluZyB0aGlzIGRhdGEgc3RydWN0dXJlCiAgKiBAbG9jazoJdGhlIG11dGV4IHByb3RlY3RpbmcgdGhpcyBkYXRhIHN0cnVjdHVyZQogICogQHBkZXY6CXBvaW50ZXIgdG8gdGhlIEZJTUMgcGxhdGZvcm0gZGV2aWNlCiAgKiBAcGRhdGE6CXBvaW50ZXIgdG8gdGhlIGRldmljZSBwbGF0Zm9ybSBkYXRhCisgKiBAdmFyaWFudDoJdGhlIElQIHZhcmlhbnQgaW5mb3JtYXRpb24KICAqIEBpZDoJCUZJTUMgZGV2aWNlIGluZGV4ICgwLi5GSU1DX01BWF9ERVZTKQogICogQG51bV9jbG9ja3M6IHRoZSBudW1iZXIgb2YgY2xvY2tzIG1hbmFnZWQgYnkgdGhpcyBkZXZpY2UgaW5zdGFuY2UKLSAqIEBjbG9ja1tdOgl0aGUgY2xvY2tzIHJlcXVpcmVkIGZvciBGSU1DIG9wZXJhdGlvbgorICogQGNsb2NrOgljbG9ja3MgcmVxdWlyZWQgZm9yIEZJTUMgb3BlcmF0aW9uCiAgKiBAcmVnczoJdGhlIG1hcHBlZCBoYXJkd2FyZSByZWdpc3RlcnMKICAqIEByZWdzX3JlczoJdGhlIHJlc291cmNlIGNsYWltZWQgZm9yIElPIHJlZ2lzdGVycwotICogQGlycToJaW50ZXJydXB0IG51bWJlciBvZiB0aGUgRklNQyBzdWJkZXZpY2UKLSAqIEBpcnFfcXVldWU6CisgKiBAaXJxOglGSU1DIGludGVycnVwdCBudW1iZXIKKyAqIEBpcnFfcXVldWU6CWludGVycnVwdCBoYW5kbGVyIHdhaXRxdWV1ZQogICogQG0ybToJbWVtb3J5LXRvLW1lbW9yeSBWNEwyIGRldmljZSBpbmZvcm1hdGlvbgogICogQHZpZF9jYXA6CWNhbWVyYSBjYXB0dXJlIGRldmljZSBpbmZvcm1hdGlvbgogICogQHN0YXRlOglmbGFncyB1c2VkIHRvIHN5bmNocm9uaXplIG0ybSBhbmQgY2FwdHVyZSBtb2RlIG9wZXJhdGlvbgorICogQGFsbG9jX2N0eDoJdmlkZW9idWYyIG1lbW9yeSBhbGxvY2F0b3IgY29udGV4dAogICovCiBzdHJ1Y3QgZmltY19kZXYgewogCXNwaW5sb2NrX3QJCQlzbG9jazsKQEAgLTQyNyw4ICs0MjUsNyBAQAogCiAvKioKICAqIGZpbWNfY3R4IC0gdGhlIGRldmljZSBjb250ZXh0IGRhdGEKLSAqCi0gKiBAbG9jazoJCW11dGV4IHByb3RlY3RpbmcgdGhpcyBkYXRhIHN0cnVjdHVyZQorICogQHNsb2NrOgkJc3BpbmxvY2sgcHJvdGVjdGluZyB0aGlzIGRhdGEgc3RydWN0dXJlCiAgKiBAc19mcmFtZToJCXNvdXJjZSBmcmFtZSBwcm9wZXJ0aWVzCiAgKiBAZF9mcmFtZToJCWRlc3RpbmF0aW9uIGZyYW1lIHByb3BlcnRpZXMKICAqIEBvdXRfb3JkZXJfMXA6CW91dHB1dCAxLXBsYW5lIFlDQkNSIG9yZGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYwppbmRleCBmZjZjMGU5Li5kNGVlMjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKQEAgLTk2Myw3ICs5NjMsNyBAQAogCSAqIHRvIHdvcmsgd2l0aCBvdGhlciBwcm90b2NvbHMuCiAJICovCiAJaWYgKCFpci0+YWN0aXZlKSB7Ci0JCXRpbWVvdXQgPSBqaWZmaWVzICsgamlmZmllc190b19tc2VjcygxNSk7CisJCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxNSk7CiAJCW1vZF90aW1lcigmaXItPnRpbWVyLCB0aW1lb3V0KTsKIAkJaXItPmFjdGl2ZSA9IHRydWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYwppbmRleCAzOTg4NjQzLi40ZTRkNDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYwpAQCAtMTUxMiw3ICsxNTEyLDcgQEAKICAqLwogc3RhdGljIGludCBzb2NfY2FtZXJhX3ZpZGVvX3N0YXJ0KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBkZXZpY2VfdHlwZSAqdHlwZSA9IGljZC0+dmRldi0+ZGV2LnR5cGU7CisJY29uc3Qgc3RydWN0IGRldmljZV90eXBlICp0eXBlID0gaWNkLT52ZGV2LT5kZXYudHlwZTsKIAlpbnQgcmV0OwogCiAJaWYgKCFpY2QtPmRldi5wYXJlbnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IDkzNjNlZDkuLmEwMzk0NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC03MTQsMjkgKzcxNCwzNCBAQAogICogcmV0dXJucyAwLgogICogVGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgZm9yIGJvYXJkcyB0aGF0IGhhdmUgYSBzZXBhcmF0ZSB0dW5lciBmb3IKICAqIHJhZGlvIChsaWtlIGRldmljZXMgd2l0aCB0ZWE1NzY3KS4KKyAqIE5PVEU6IG10MjB4eCB1c2VzIFY0TDJfVFVORVJfRElHSVRBTF9UViBhbmQgY2FsbHMgc2V0X3R2X2ZyZXEgdG8KKyAqICAgICAgIHNlbGVjdCBhIFRWIGZyZXF1ZW5jeS4gU28sIHRfbW9kZSA9IFRfQU5BTE9HX1RWIGNvdWxkIGFjdHVhbGx5CisgKgkgYmUgdXNlZCB0byByZXByZXNlbnQgYSBEaWdpdGFsIFRWIHRvby4KICAqLwogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfbW9kZShzdHJ1Y3QgdHVuZXIgKnQsIGVudW0gdjRsMl90dW5lcl90eXBlIG1vZGUpCiB7Ci0JaWYgKCgxIDw8IG1vZGUgJiB0LT5tb2RlX21hc2spID09IDApCisJaW50IHRfbW9kZTsKKwlpZiAobW9kZSA9PSBWNEwyX1RVTkVSX1JBRElPKQorCQl0X21vZGUgPSBUX1JBRElPOworCWVsc2UKKwkJdF9tb2RlID0gVF9BTkFMT0dfVFY7CisKKwlpZiAoKHRfbW9kZSAmIHQtPm1vZGVfbWFzaykgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBzZXRfbW9kZV9mcmVxIC0gU3dpdGNoIHR1bmVyIHRvIG90aGVyIG1vZGUuCi0gKiBAY2xpZW50OglzdHJ1Y3QgaTJjX2NsaWVudCBwb2ludGVyCisgKiBzZXRfbW9kZSAtIFN3aXRjaCB0dW5lciB0byBvdGhlciBtb2RlLgogICogQHQ6CQlhIHBvaW50ZXIgdG8gdGhlIG1vZHVsZSdzIGludGVybmFsIHN0cnVjdF90dW5lcgogICogQG1vZGU6CWVudW0gdjRsMl90eXBlIChyYWRpbyBvciBUVikKLSAqIEBmcmVxOglmcmVxdWVuY3kgdG8gc2V0ICgwIG1lYW5zIHRvIHVzZSB0aGUgcHJldmlvdXMgb25lKQogICoKICAqIElmIHR1bmVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmVlZGVkIG1vZGUgKHJhZGlvIG9yIFRWKSwgcHJpbnRzIGEKICAqIGRlYnVnIG1lc3NhZ2UgYW5kIHJldHVybnMgLUVJTlZBTCwgY2hhbmdpbmcgaXRzIHN0YXRlIHRvIHN0YW5kYnkuCi0gKiBPdGhlcndpc2UsIGNoYW5nZXMgdGhlIHN0YXRlIGFuZCBzZXRzIGZyZXF1ZW5jeSB0byB0aGUgbGFzdCB2YWx1ZSwgaWYKLSAqIHRoZSB0dW5lciBjYW4gc2xlZXAgb3IgaWYgaXQgc3VwcG9ydHMgYm90aCBSYWRpbyBhbmQgVFYuCisgKiBPdGhlcndpc2UsIGNoYW5nZXMgdGhlIG1vZGUgYW5kIHJldHVybnMgMC4KICAqLwotc3RhdGljIGludCBzZXRfbW9kZV9mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB0dW5lciAqdCwKLQkJCSBlbnVtIHY0bDJfdHVuZXJfdHlwZSBtb2RlLCB1bnNpZ25lZCBpbnQgZnJlcSkKK3N0YXRpYyBpbnQgc2V0X21vZGUoc3RydWN0IHR1bmVyICp0LCBlbnVtIHY0bDJfdHVuZXJfdHlwZSBtb2RlKQogewogCXN0cnVjdCBhbmFsb2dfZGVtb2Rfb3BzICphbmFsb2dfb3BzID0gJnQtPmZlLm9wcy5hbmFsb2dfb3BzOwogCkBAIC03NTIsMTkgKzc1NywyOSBAQAogCQl0LT5tb2RlID0gbW9kZTsKIAkJdHVuZXJfZGJnKCJDaGFuZ2luZyB0byBtb2RlICVkXG4iLCBtb2RlKTsKIAl9Ci0JaWYgKHQtPm1vZGUgPT0gVjRMMl9UVU5FUl9SQURJTykgewotCQlpZiAoZnJlcSkKLQkJCXQtPnJhZGlvX2ZyZXEgPSBmcmVxOwotCQlzZXRfcmFkaW9fZnJlcShjbGllbnQsIHQtPnJhZGlvX2ZyZXEpOwotCX0gZWxzZSB7Ci0JCWlmIChmcmVxKQotCQkJdC0+dHZfZnJlcSA9IGZyZXE7Ci0JCXNldF90dl9mcmVxKGNsaWVudCwgdC0+dHZfZnJlcSk7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogc2V0X2ZyZXEgLSBTZXQgdGhlIHR1bmVyIHRvIHRoZSBkZXNpcmVkIGZyZXF1ZW5jeS4KKyAqIEB0OgkJYSBwb2ludGVyIHRvIHRoZSBtb2R1bGUncyBpbnRlcm5hbCBzdHJ1Y3RfdHVuZXIKKyAqIEBmcmVxOglmcmVxdWVuY3kgdG8gc2V0ICgwIG1lYW5zIHRvIHVzZSB0aGUgY3VycmVudCBmcmVxdWVuY3kpCisgKi8KK3N0YXRpYyB2b2lkIHNldF9mcmVxKHN0cnVjdCB0dW5lciAqdCwgdW5zaWduZWQgaW50IGZyZXEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnQtPnNkKTsKKworCWlmICh0LT5tb2RlID09IFY0TDJfVFVORVJfUkFESU8pIHsKKwkJaWYgKCFmcmVxKQorCQkJZnJlcSA9IHQtPnJhZGlvX2ZyZXE7CisJCXNldF9yYWRpb19mcmVxKGNsaWVudCwgZnJlcSk7CisJfSBlbHNlIHsKKwkJaWYgKCFmcmVxKQorCQkJZnJlcSA9IHQtPnR2X2ZyZXE7CisJCXNldF90dl9mcmVxKGNsaWVudCwgZnJlcSk7CisJfQorfQorCiAvKgogICogRnVuY3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljIGZvciBUViBtb2RlCiAgKi8KQEAgLTgxNyw3ICs4MzIsOCBAQAogLyoqCiAgKiB0dW5lcl9maXh1cF9zdGQgLSBmb3JjZSBhIGdpdmVuIHZpZGVvIHN0YW5kYXJkIHZhcmlhbnQKICAqCi0gKiBAdDoJdHVuZXIgaW50ZXJuYWwgc3RydWN0CisgKiBAdDogdHVuZXIgaW50ZXJuYWwgc3RydWN0CisgKiBAc3RkOglUViBzdGFuZGFyZAogICoKICAqIEEgZmV3IGRldmljZXMgb3IgZHJpdmVycyBoYXZlIHByb2JsZW0gdG8gZGV0ZWN0IHNvbWUgc3RhbmRhcmQgdmFyaWF0aW9ucy4KICAqIE9uIG90aGVyIG9wZXJhdGlvbmFsIHN5c3RlbXMsIHRoZSBkcml2ZXJzIGdlbmVyYWxseSBoYXZlIGEgcGVyLWNvdW50cnkKQEAgLTgyNyw1NyArODQzLDM5IEBACiAgKiB0byBkaXN0aW5ndWlzaCBhbGwgdmlkZW8gc3RhbmRhcmQgdmFyaWF0aW9ucywgYSBtb2Rwcm9iZSBwYXJhbWV0ZXIgY2FuCiAgKiBiZSB1c2VkIHRvIGZvcmNlIGEgdmlkZW8gc3RhbmRhcmQgbWF0Y2guCiAgKi8KLXN0YXRpYyBpbnQgdHVuZXJfZml4dXBfc3RkKHN0cnVjdCB0dW5lciAqdCkKK3N0YXRpYyB2NGwyX3N0ZF9pZCB0dW5lcl9maXh1cF9zdGQoc3RydWN0IHR1bmVyICp0LCB2NGwyX3N0ZF9pZCBzdGQpCiB7Ci0JaWYgKCh0LT5zdGQgJiBWNEwyX1NURF9QQUwpID09IFY0TDJfU1REX1BBTCkgeworCWlmIChwYWxbMF0gIT0gJy0nICYmIChzdGQgJiBWNEwyX1NURF9QQUwpID09IFY0TDJfU1REX1BBTCkgewogCQlzd2l0Y2ggKHBhbFswXSkgewogCQljYXNlICc2JzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLTYwXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF82MDsKLQkJCWJyZWFrOworCQkJcmV0dXJuIFY0TDJfU1REX1BBTF82MDsKIAkJY2FzZSAnYic6CiAJCWNhc2UgJ0InOgogCQljYXNlICdnJzoKIAkJY2FzZSAnRyc6Ci0JCQl0dW5lcl9kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1CR1xuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfQkc7Ci0JCQlicmVhazsKKwkJCXJldHVybiBWNEwyX1NURF9QQUxfQkc7CiAJCWNhc2UgJ2knOgogCQljYXNlICdJJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLUlcbiIpOwotCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX0k7Ci0JCQlicmVhazsKKwkJCXJldHVybiBWNEwyX1NURF9QQUxfSTsKIAkJY2FzZSAnZCc6CiAJCWNhc2UgJ0QnOgogCQljYXNlICdrJzoKIAkJY2FzZSAnSyc6Ci0JCQl0dW5lcl9kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1ES1xuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfREs7Ci0JCQlicmVhazsKKwkJCXJldHVybiBWNEwyX1NURF9QQUxfREs7CiAJCWNhc2UgJ00nOgogCQljYXNlICdtJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLU1cbiIpOwotCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX007Ci0JCQlicmVhazsKKwkJCXJldHVybiBWNEwyX1NURF9QQUxfTTsKIAkJY2FzZSAnTic6CiAJCWNhc2UgJ24nOgotCQkJaWYgKHBhbFsxXSA9PSAnYycgfHwgcGFsWzFdID09ICdDJykgewotCQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLU5jXG4iKTsKLQkJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfTmM7Ci0JCQl9IGVsc2UgewotCQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLU5cbiIpOwotCQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9OOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJy0nOgotCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KLQkJCWJyZWFrOworCQkJaWYgKHBhbFsxXSA9PSAnYycgfHwgcGFsWzFdID09ICdDJykKKwkJCQlyZXR1cm4gVjRMMl9TVERfUEFMX05jOworCQkJcmV0dXJuIFY0TDJfU1REX1BBTF9OOwogCQlkZWZhdWx0OgogCQkJdHVuZXJfd2FybigicGFsPSBhcmd1bWVudCBub3QgcmVjb2duaXNlZFxuIik7CiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNKSA9PSBWNEwyX1NURF9TRUNBTSkgeworCWlmIChzZWNhbVswXSAhPSAnLScgJiYgKHN0ZCAmIFY0TDJfU1REX1NFQ0FNKSA9PSBWNEwyX1NURF9TRUNBTSkgewogCQlzd2l0Y2ggKHNlY2FtWzBdKSB7CiAJCWNhc2UgJ2InOgogCQljYXNlICdCJzoKQEAgLTg4NSw2MyArODgzLDQyIEBACiAJCWNhc2UgJ0cnOgogCQljYXNlICdoJzoKIAkJY2FzZSAnSCc6Ci0JCQl0dW5lcl9kYmcoImluc21vZCBmaXh1cDogU0VDQU0gPT4gU0VDQU0tQkdIXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX1NFQ0FNX0IgfAotCQkJCSBWNEwyX1NURF9TRUNBTV9HIHwKLQkJCQkgVjRMMl9TVERfU0VDQU1fSDsKLQkJCWJyZWFrOworCQkJcmV0dXJuIFY0TDJfU1REX1NFQ0FNX0IgfAorCQkJICAgICAgIFY0TDJfU1REX1NFQ0FNX0cgfAorCQkJICAgICAgIFY0TDJfU1REX1NFQ0FNX0g7CiAJCWNhc2UgJ2QnOgogCQljYXNlICdEJzoKIAkJY2FzZSAnayc6CiAJCWNhc2UgJ0snOgotCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLURLXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX1NFQ0FNX0RLOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gVjRMMl9TVERfU0VDQU1fREs7CiAJCWNhc2UgJ2wnOgogCQljYXNlICdMJzoKLQkJCWlmICgoc2VjYW1bMV0gPT0gJ0MnKSB8fCAoc2VjYW1bMV0gPT0gJ2MnKSkgewotCQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBTRUNBTSA9PiBTRUNBTS1MJ1xuIik7Ci0JCQkJdC0+c3RkID0gVjRMMl9TVERfU0VDQU1fTEM7Ci0JCQl9IGVsc2UgewotCQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBTRUNBTSA9PiBTRUNBTS1MXG4iKTsKLQkJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJy0nOgotCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KLQkJCWJyZWFrOworCQkJaWYgKChzZWNhbVsxXSA9PSAnQycpIHx8IChzZWNhbVsxXSA9PSAnYycpKQorCQkJCXJldHVybiBWNEwyX1NURF9TRUNBTV9MQzsKKwkJCXJldHVybiBWNEwyX1NURF9TRUNBTV9MOwogCQlkZWZhdWx0OgogCQkJdHVuZXJfd2Fybigic2VjYW09IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JaWYgKCh0LT5zdGQgJiBWNEwyX1NURF9OVFNDKSA9PSBWNEwyX1NURF9OVFNDKSB7CisJaWYgKG50c2NbMF0gIT0gJy0nICYmIChzdGQgJiBWNEwyX1NURF9OVFNDKSA9PSBWNEwyX1NURF9OVFNDKSB7CiAJCXN3aXRjaCAobnRzY1swXSkgewogCQljYXNlICdtJzoKIAkJY2FzZSAnTSc6Ci0JCQl0dW5lcl9kYmcoImluc21vZCBmaXh1cDogTlRTQyA9PiBOVFNDLU1cbiIpOwotCQkJdC0+c3RkID0gVjRMMl9TVERfTlRTQ19NOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gVjRMMl9TVERfTlRTQ19NOwogCQljYXNlICdqJzoKIAkJY2FzZSAnSic6Ci0JCQl0dW5lcl9kYmcoImluc21vZCBmaXh1cDogTlRTQyA9PiBOVFNDX01fSlBcbiIpOwotCQkJdC0+c3RkID0gVjRMMl9TVERfTlRTQ19NX0pQOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gVjRMMl9TVERfTlRTQ19NX0pQOwogCQljYXNlICdrJzoKIAkJY2FzZSAnSyc6Ci0JCQl0dW5lcl9kYmcoImluc21vZCBmaXh1cDogTlRTQyA9PiBOVFNDX01fS1JcbiIpOwotCQkJdC0+c3RkID0gVjRMMl9TVERfTlRTQ19NX0tSOwotCQkJYnJlYWs7Ci0JCWNhc2UgJy0nOgotCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KLQkJCWJyZWFrOworCQkJcmV0dXJuIFY0TDJfU1REX05UU0NfTV9LUjsKIAkJZGVmYXVsdDoKIAkJCXR1bmVyX2luZm8oIm50c2M9IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQotCXJldHVybiAwOworCXJldHVybiBzdGQ7CiB9CiAKIC8qCkBAIC0xMDE2LDcgKzk5Myw3IEBACiAJY2FzZSBWNEwyX1RVTkVSX1JBRElPOgogCQlwID0gInJhZGlvIjsKIAkJYnJlYWs7Ci0JY2FzZSBWNEwyX1RVTkVSX0RJR0lUQUxfVFY6CisJY2FzZSBWNEwyX1RVTkVSX0RJR0lUQUxfVFY6IC8qIFVzZWQgYnkgbXQyMHh4ICovCiAJCXAgPSAiZGlnaXRhbCBUViI7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9UVU5FUl9BTkFMT0dfVFY6CkBAIC0xMDU4LDEwICsxMDM1LDkgQEAKIHN0YXRpYyBpbnQgdHVuZXJfc19yYWRpbyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewogCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKLQlpZiAoc2V0X21vZGVfZnJlcShjbGllbnQsIHQsIFY0TDJfVFVORVJfUkFESU8sIDApID09IC1FSU5WQUwpCi0JCXJldHVybiAwOworCWlmIChzZXRfbW9kZSh0LCBWNEwyX1RVTkVSX1JBRElPKSA9PSAwKQorCQlzZXRfZnJlcSh0LCAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA3MiwxNiArMTA0OCwyMCBAQAogLyoqCiAgKiB0dW5lcl9zX3Bvd2VyIC0gY29udHJvbHMgdGhlIHBvd2VyIHN0YXRlIG9mIHRoZSB0dW5lcgogICogQHNkOiBwb2ludGVyIHRvIHN0cnVjdCB2NGwyX3N1YmRldgotICogQG9uOiBhIHplcm8gdmFsdWUgcHV0cyB0aGUgdHVuZXIgdG8gc2xlZXAKKyAqIEBvbjogYSB6ZXJvIHZhbHVlIHB1dHMgdGhlIHR1bmVyIHRvIHNsZWVwLCBub24temVybyB3YWtlcyBpdCB1cAogICovCiBzdGF0aWMgaW50IHR1bmVyX3NfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQogewogCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKIAlzdHJ1Y3QgYW5hbG9nX2RlbW9kX29wcyAqYW5hbG9nX29wcyA9ICZ0LT5mZS5vcHMuYW5hbG9nX29wczsKIAotCS8qIEZJWE1FOiBXaHkgdGhpcyBmdW5jdGlvbiBkb24ndCB3YWtlIHRoZSB0dW5lciBpZiBvbiAhPSAwID8gKi8KLQlpZiAob24pCisJaWYgKG9uKSB7CisJCWlmICh0LT5zdGFuZGJ5ICYmIHNldF9tb2RlKHQsIHQtPm1vZGUpID09IDApIHsKKwkJCXR1bmVyX2RiZygiV2FraW5nIHVwIHR1bmVyXG4iKTsKKwkJCXNldF9mcmVxKHQsIDApOworCQl9CiAJCXJldHVybiAwOworCX0KIAogCXR1bmVyX2RiZygiUHV0dGluZyB0dW5lciB0byBzbGVlcFxuIik7CiAJdC0+c3RhbmRieSA9IHRydWU7CkBAIC0xMDkzLDI4ICsxMDczLDM2IEBACiBzdGF0aWMgaW50IHR1bmVyX3Nfc3RkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkIHN0ZCkKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSB0b190dW5lcihzZCk7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JaWYgKHNldF9tb2RlX2ZyZXEoY2xpZW50LCB0LCBWNEwyX1RVTkVSX0FOQUxPR19UViwgMCkgPT0gLUVJTlZBTCkKKwlpZiAoc2V0X21vZGUodCwgVjRMMl9UVU5FUl9BTkFMT0dfVFYpKQogCQlyZXR1cm4gMDsKIAotCXQtPnN0ZCA9IHN0ZDsKLQl0dW5lcl9maXh1cF9zdGQodCk7Ci0KKwl0LT5zdGQgPSB0dW5lcl9maXh1cF9zdGQodCwgc3RkKTsKKwlpZiAodC0+c3RkICE9IHN0ZCkKKwkJdHVuZXJfZGJnKCJGaXh1cCBzdGFuZGFyZCAlbGx4IHRvICVsbHhcbiIsIHN0ZCwgdC0+c3RkKTsKKwlzZXRfZnJlcSh0LCAwKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB0dW5lcl9zX2ZyZXF1ZW5jeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoc2QpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAotCWlmIChzZXRfbW9kZV9mcmVxKGNsaWVudCwgdCwgZi0+dHlwZSwgZi0+ZnJlcXVlbmN5KSA9PSAtRUlOVkFMKQotCQlyZXR1cm4gMDsKLQorCWlmIChzZXRfbW9kZSh0LCBmLT50eXBlKSA9PSAwKQorCQlzZXRfZnJlcSh0LCBmLT5mcmVxdWVuY3kpOwogCXJldHVybiAwOwogfQogCisvKioKKyAqIHR1bmVyX2dfZnJlcXVlbmN5IC0gR2V0IHRoZSB0dW5lZCBmcmVxdWVuY3kgZm9yIHRoZSB0dW5lcgorICogQHNkOiBwb2ludGVyIHRvIHN0cnVjdCB2NGwyX3N1YmRldgorICogQGY6IHBvaW50ZXIgdG8gc3RydWN0IHY0bDJfZnJlcXVlbmN5CisgKgorICogQXQgcmV0dXJuLCB0aGUgc3RydWN0dXJlIGYgd2lsbCBiZSBmaWxsZWQgd2l0aCB0dW5lciBmcmVxdWVuY3kKKyAqIGlmIHRoZSB0dW5lciBtYXRjaGVzIHRoZSBmLT50eXBlLgorICogTm90ZTogZi0+dHlwZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgaXQuCisgKiBUaGlzIGlzIGRvbmUgYnkgZWl0aGVyIHZpZGVvX2lvY3RsMiBvciBieSB0aGUgYnJpZGdlIGRyaXZlci4KKyAqLwogc3RhdGljIGludCB0dW5lcl9nX2ZyZXF1ZW5jeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoc2QpOwpAQCAtMTEyMiw4ICsxMTEwLDcgQEAKIAogCWlmIChjaGVja19tb2RlKHQsIGYtPnR5cGUpID09IC1FSU5WQUwpCiAJCXJldHVybiAwOwotCWYtPnR5cGUgPSB0LT5tb2RlOwotCWlmIChmZV90dW5lcl9vcHMtPmdldF9mcmVxdWVuY3kgJiYgIXQtPnN0YW5kYnkpIHsKKwlpZiAoZi0+dHlwZSA9PSB0LT5tb2RlICYmIGZlX3R1bmVyX29wcy0+Z2V0X2ZyZXF1ZW5jeSAmJiAhdC0+c3RhbmRieSkgewogCQl1MzIgYWJzX2ZyZXE7CiAKIAkJZmVfdHVuZXJfb3BzLT5nZXRfZnJlcXVlbmN5KCZ0LT5mZSwgJmFic19mcmVxKTsKQEAgLTExMzEsMTIgKzExMTgsMjIgQEAKIAkJCURJVl9ST1VORF9DTE9TRVNUKGFic19mcmVxICogMiwgMTI1KSA6CiAJCQlESVZfUk9VTkRfQ0xPU0VTVChhYnNfZnJlcSwgNjI1MDApOwogCX0gZWxzZSB7Ci0JCWYtPmZyZXF1ZW5jeSA9IChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUpID8KKwkJZi0+ZnJlcXVlbmN5ID0gKFY0TDJfVFVORVJfUkFESU8gPT0gZi0+dHlwZSkgPwogCQkJdC0+cmFkaW9fZnJlcSA6IHQtPnR2X2ZyZXE7CiAJfQogCXJldHVybiAwOwogfQogCisvKioKKyAqIHR1bmVyX2dfdHVuZXIgLSBGaWxsIGluIHR1bmVyIGluZm9ybWF0aW9uCisgKiBAc2Q6IHBvaW50ZXIgdG8gc3RydWN0IHY0bDJfc3ViZGV2CisgKiBAdnQ6IHBvaW50ZXIgdG8gc3RydWN0IHY0bDJfdHVuZXIKKyAqCisgKiBBdCByZXR1cm4sIHRoZSBzdHJ1Y3R1cmUgdnQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0dW5lciBpbmZvcm1hdGlvbgorICogaWYgdGhlIHR1bmVyIG1hdGNoZXMgdnQtPnR5cGUuCisgKiBOb3RlOiB2dC0+dHlwZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgaXQuCisgKiBUaGlzIGlzIGRvbmUgYnkgZWl0aGVyIHZpZGVvX2lvY3RsMiBvciBieSB0aGUgYnJpZGdlIGRyaXZlci4KKyAqLwogc3RhdGljIGludCB0dW5lcl9nX3R1bmVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3R1bmVyICp2dCkKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSB0b190dW5lcihzZCk7CkBAIC0xMTQ1LDQ4ICsxMTQyLDU3IEBACiAKIAlpZiAoY2hlY2tfbW9kZSh0LCB2dC0+dHlwZSkgPT0gLUVJTlZBTCkKIAkJcmV0dXJuIDA7Ci0JdnQtPnR5cGUgPSB0LT5tb2RlOwotCWlmIChhbmFsb2dfb3BzLT5nZXRfYWZjKQorCWlmICh2dC0+dHlwZSA9PSB0LT5tb2RlICYmIGFuYWxvZ19vcHMtPmdldF9hZmMpCiAJCXZ0LT5hZmMgPSBhbmFsb2dfb3BzLT5nZXRfYWZjKCZ0LT5mZSk7Ci0JaWYgKHQtPm1vZGUgPT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpCi0JCXZ0LT5jYXBhYmlsaXR5IHw9IFY0TDJfVFVORVJfQ0FQX05PUk07CiAJaWYgKHQtPm1vZGUgIT0gVjRMMl9UVU5FUl9SQURJTykgeworCQl2dC0+Y2FwYWJpbGl0eSB8PSBWNEwyX1RVTkVSX0NBUF9OT1JNOwogCQl2dC0+cmFuZ2Vsb3cgPSB0dl9yYW5nZVswXSAqIDE2OwogCQl2dC0+cmFuZ2VoaWdoID0gdHZfcmFuZ2VbMV0gKiAxNjsKIAkJcmV0dXJuIDA7CiAJfQogCiAJLyogcmFkaW8gbW9kZSAqLwotCXZ0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTyB8IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKLQlpZiAoZmVfdHVuZXJfb3BzLT5nZXRfc3RhdHVzKSB7Ci0JCXUzMiB0dW5lcl9zdGF0dXM7CisJaWYgKHZ0LT50eXBlID09IHQtPm1vZGUpIHsKKwkJdnQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05PIHwgVjRMMl9UVU5FUl9TVUJfU1RFUkVPOworCQlpZiAoZmVfdHVuZXJfb3BzLT5nZXRfc3RhdHVzKSB7CisJCQl1MzIgdHVuZXJfc3RhdHVzOwogCi0JCWZlX3R1bmVyX29wcy0+Z2V0X3N0YXR1cygmdC0+ZmUsICZ0dW5lcl9zdGF0dXMpOwotCQl2dC0+cnhzdWJjaGFucyA9Ci0JCQkodHVuZXJfc3RhdHVzICYgVFVORVJfU1RBVFVTX1NURVJFTykgPwotCQkJVjRMMl9UVU5FUl9TVUJfU1RFUkVPIDoKLQkJCVY0TDJfVFVORVJfU1VCX01PTk87CisJCQlmZV90dW5lcl9vcHMtPmdldF9zdGF0dXMoJnQtPmZlLCAmdHVuZXJfc3RhdHVzKTsKKwkJCXZ0LT5yeHN1YmNoYW5zID0KKwkJCQkodHVuZXJfc3RhdHVzICYgVFVORVJfU1RBVFVTX1NURVJFTykgPworCQkJCVY0TDJfVFVORVJfU1VCX1NURVJFTyA6CisJCQkJVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJfQorCQlpZiAoYW5hbG9nX29wcy0+aGFzX3NpZ25hbCkKKwkJCXZ0LT5zaWduYWwgPSBhbmFsb2dfb3BzLT5oYXNfc2lnbmFsKCZ0LT5mZSk7CisJCXZ0LT5hdWRtb2RlID0gdC0+YXVkbW9kZTsKIAl9Ci0JaWYgKGFuYWxvZ19vcHMtPmhhc19zaWduYWwpCi0JCXZ0LT5zaWduYWwgPSBhbmFsb2dfb3BzLT5oYXNfc2lnbmFsKCZ0LT5mZSk7CiAJdnQtPmNhcGFiaWxpdHkgfD0gVjRMMl9UVU5FUl9DQVBfTE9XIHwgVjRMMl9UVU5FUl9DQVBfU1RFUkVPOwotCXZ0LT5hdWRtb2RlID0gdC0+YXVkbW9kZTsKIAl2dC0+cmFuZ2Vsb3cgPSByYWRpb19yYW5nZVswXSAqIDE2MDAwOwogCXZ0LT5yYW5nZWhpZ2ggPSByYWRpb19yYW5nZVsxXSAqIDE2MDAwOwogCiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogdHVuZXJfc190dW5lciAtIFNldCB0aGUgdHVuZXIncyBhdWRpbyBtb2RlCisgKiBAc2Q6IHBvaW50ZXIgdG8gc3RydWN0IHY0bDJfc3ViZGV2CisgKiBAdnQ6IHBvaW50ZXIgdG8gc3RydWN0IHY0bDJfdHVuZXIKKyAqCisgKiBTZXRzIHRoZSBhdWRpbyBtb2RlIGlmIHRoZSB0dW5lciBtYXRjaGVzIHZ0LT50eXBlLgorICogTm90ZTogdnQtPnR5cGUgc2hvdWxkIGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIGl0LgorICogVGhpcyBpcyBkb25lIGJ5IGVpdGhlciB2aWRlb19pb2N0bDIgb3IgYnkgdGhlIGJyaWRnZSBkcml2ZXIuCisgKi8KIHN0YXRpYyBpbnQgdHVuZXJfc190dW5lcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl90dW5lciAqdnQpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoc2QpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAotCWlmIChzZXRfbW9kZV9mcmVxKGNsaWVudCwgdCwgdnQtPnR5cGUsIDApID09IC1FSU5WQUwpCisJaWYgKHNldF9tb2RlKHQsIHZ0LT50eXBlKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAodC0+bW9kZSA9PSBWNEwyX1RVTkVSX1JBRElPKQogCQl0LT5hdWRtb2RlID0gdnQtPmF1ZG1vZGU7CisJc2V0X2ZyZXEodCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMjEsNyArMTIyNyw4IEBACiAJdHVuZXJfZGJnKCJyZXN1bWVcbiIpOwogCiAJaWYgKCF0LT5zdGFuZGJ5KQotCQlzZXRfbW9kZV9mcmVxKGMsIHQsIHQtPnR5cGUsIDApOworCQlpZiAoc2V0X21vZGUodCwgdC0+bW9kZSkgPT0gMCkKKwkJCXNldF9mcmVxKHQsIDApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZW50aXR5LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZW50aXR5LmMKaW5kZXggZWRlNzg1Mi4uNDhmZWEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2VudGl0eS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19lbnRpdHkuYwpAQCAtMjcsMTQgKzI3LDIwIEBACiAJc3RydWN0IHV2Y19lbnRpdHkgKmVudGl0eSkKIHsKIAljb25zdCB1MzIgZmxhZ3MgPSBNRURJQV9MTktfRkxfRU5BQkxFRCB8IE1FRElBX0xOS19GTF9JTU1VVEFCTEU7Ci0Jc3RydWN0IHV2Y19lbnRpdHkgKnJlbW90ZTsKKwlzdHJ1Y3QgbWVkaWFfZW50aXR5ICpzaW5rOwogCXVuc2lnbmVkIGludCBpOwotCXU4IHJlbW90ZV9wYWQ7CiAJaW50IHJldDsKIAorCXNpbmsgPSAoVVZDX0VOVElUWV9UWVBFKGVudGl0eSkgPT0gVVZDX1RUX1NUUkVBTUlORykKKwkgICAgID8gKGVudGl0eS0+dmRldiA/ICZlbnRpdHktPnZkZXYtPmVudGl0eSA6IE5VTEwpCisJICAgICA6ICZlbnRpdHktPnN1YmRldi5lbnRpdHk7CisJaWYgKHNpbmsgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKIAlmb3IgKGkgPSAwOyBpIDwgZW50aXR5LT5udW1fcGFkczsgKytpKSB7CiAJCXN0cnVjdCBtZWRpYV9lbnRpdHkgKnNvdXJjZTsKLQkJc3RydWN0IG1lZGlhX2VudGl0eSAqc2luazsKKwkJc3RydWN0IHV2Y19lbnRpdHkgKnJlbW90ZTsKKwkJdTggcmVtb3RlX3BhZDsKIAogCQlpZiAoIShlbnRpdHktPnBhZHNbaV0uZmxhZ3MgJiBNRURJQV9QQURfRkxfU0lOSykpCiAJCQljb250aW51ZTsKQEAgLTQzLDEwICs0OSwxMSBAQAogCQlpZiAocmVtb3RlID09IE5VTEwpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlzb3VyY2UgPSAoVVZDX0VOVElUWV9UWVBFKHJlbW90ZSkgPT0gVVZDX1RUX1NUUkVBTUlORykKLQkJICAgICAgID8gJnJlbW90ZS0+dmRldi0+ZW50aXR5IDogJnJlbW90ZS0+c3ViZGV2LmVudGl0eTsKLQkJc2luayA9IChVVkNfRU5USVRZX1RZUEUoZW50aXR5KSA9PSBVVkNfVFRfU1RSRUFNSU5HKQotCQkgICAgID8gJmVudGl0eS0+dmRldi0+ZW50aXR5IDogJmVudGl0eS0+c3ViZGV2LmVudGl0eTsKKwkJc291cmNlID0gKFVWQ19FTlRJVFlfVFlQRShyZW1vdGUpICE9IFVWQ19UVF9TVFJFQU1JTkcpCisJCSAgICAgICA/IChyZW1vdGUtPnZkZXYgPyAmcmVtb3RlLT52ZGV2LT5lbnRpdHkgOiBOVUxMKQorCQkgICAgICAgOiAmcmVtb3RlLT5zdWJkZXYuZW50aXR5OworCQlpZiAoc291cmNlID09IE5VTEwpCisJCQljb250aW51ZTsKIAogCQlyZW1vdGVfcGFkID0gcmVtb3RlLT5udW1fcGFkcyAtIDE7CiAJCXJldCA9IG1lZGlhX2VudGl0eV9jcmVhdGVfbGluayhzb3VyY2UsIHJlbW90ZV9wYWQsCkBAIC01NSwxMSArNjIsMTAgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKFVWQ19FTlRJVFlfVFlQRShlbnRpdHkpICE9IFVWQ19UVF9TVFJFQU1JTkcpCi0JCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldigmY2hhaW4tPmRldi0+dmRldiwKLQkJCQkJCSAgJmVudGl0eS0+c3ViZGV2KTsKKwlpZiAoVVZDX0VOVElUWV9UWVBFKGVudGl0eSkgPT0gVVZDX1RUX1NUUkVBTUlORykKKwkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYoJmNoYWluLT5kZXYtPnZkZXYsICZlbnRpdHktPnN1YmRldik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHV2Y19zdWJkZXZfb3BzID0gewpAQCAtODQsOSArOTAsMTEgQEAKIAogCQlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdCgmZW50aXR5LT5zdWJkZXYuZW50aXR5LAogCQkJCQllbnRpdHktPm51bV9wYWRzLCBlbnRpdHktPnBhZHMsIDApOwotCX0gZWxzZQorCX0gZWxzZSBpZiAoZW50aXR5LT52ZGV2ICE9IE5VTEwpIHsKIAkJcmV0ID0gbWVkaWFfZW50aXR5X2luaXQoJmVudGl0eS0+dmRldi0+ZW50aXR5LAogCQkJCQllbnRpdHktPm51bV9wYWRzLCBlbnRpdHktPnBhZHMsIDApOworCX0gZWxzZQorCQlyZXQgPSAwOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19xdWV1ZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3F1ZXVlLmMKaW5kZXggMTA5YTA2My4uZjkwY2U5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3F1ZXVlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3F1ZXVlLmMKQEAgLTEwNCw2ICsxMDQsOCBAQAogCX0KIAogCWlmIChxdWV1ZS0+Y291bnQpIHsKKwkJdXZjX3F1ZXVlX2NhbmNlbChxdWV1ZSwgMCk7CisJCUlOSVRfTElTVF9IRUFEKCZxdWV1ZS0+bWFpbnF1ZXVlKTsKIAkJdmZyZWUocXVldWUtPm1lbSk7CiAJCXF1ZXVlLT5jb3VudCA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYwppbmRleCBmYzc2NmI5Li40OTk5NDc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYwpAQCAtMTI1NSw4ICsxMjU1LDEwIEBACiAKIAkvKiBDb21taXQgdGhlIHN0cmVhbWluZyBwYXJhbWV0ZXJzLiAqLwogCXJldCA9IHV2Y19jb21taXRfdmlkZW8oc3RyZWFtLCAmc3RyZWFtLT5jdHJsKTsKLQlpZiAocmV0IDwgMCkKKwlpZiAocmV0IDwgMCkgeworCQl1dmNfcXVldWVfZW5hYmxlKCZzdHJlYW0tPnF1ZXVlLCAwKTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXR1cm4gdXZjX2luaXRfdmlkZW8oc3RyZWFtLCBHRlBfS0VSTkVMKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXYuYwppbmRleCAxOWQ1YWUyOS4uMDZmMTQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXYuYwpAQCAtMTY3LDYgKzE2NywxMiBAQAogCiAJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX01FRElBX0NPTlRST0xMRVIpCisJaWYgKHZkZXYtPnY0bDJfZGV2ICYmIHZkZXYtPnY0bDJfZGV2LT5tZGV2ICYmCisJICAgIHZkZXYtPnZmbF90eXBlICE9IFZGTF9UWVBFX1NVQkRFVikKKwkJbWVkaWFfZGV2aWNlX3VucmVnaXN0ZXJfZW50aXR5KCZ2ZGV2LT5lbnRpdHkpOworI2VuZGlmCisKIAkvKiBSZWxlYXNlIHZpZGVvX2RldmljZSBhbmQgcGVyZm9ybSBvdGhlcgogCSAgIGNsZWFudXBzIGFzIG5lZWRlZC4gKi8KIAl2ZGV2LT5yZWxlYXNlKHZkZXYpOwpAQCAtMzg5LDkgKzM5NSw2IEBACiBzdGF0aWMgaW50IHY0bDJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OwotI2lmIGRlZmluZWQoQ09ORklHX01FRElBX0NPTlRST0xMRVIpCi0Jc3RydWN0IG1lZGlhX2VudGl0eSAqZW50aXR5ID0gTlVMTDsKLSNlbmRpZgogCWludCByZXQgPSAwOwogCiAJLyogQ2hlY2sgaWYgdGhlIHZpZGVvIGRldmljZSBpcyBhdmFpbGFibGUgKi8KQEAgLTQwNSwxNyArNDA4LDYgQEAKIAkvKiBhbmQgaW5jcmVhc2UgdGhlIGRldmljZSByZWZjb3VudCAqLwogCXZpZGVvX2dldCh2ZGV2KTsKIAltdXRleF91bmxvY2soJnZpZGVvZGV2X2xvY2spOwotI2lmIGRlZmluZWQoQ09ORklHX01FRElBX0NPTlRST0xMRVIpCi0JaWYgKHZkZXYtPnY0bDJfZGV2ICYmIHZkZXYtPnY0bDJfZGV2LT5tZGV2ICYmCi0JICAgIHZkZXYtPnZmbF90eXBlICE9IFZGTF9UWVBFX1NVQkRFVikgewotCQllbnRpdHkgPSBtZWRpYV9lbnRpdHlfZ2V0KCZ2ZGV2LT5lbnRpdHkpOwotCQlpZiAoIWVudGl0eSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJdmlkZW9fcHV0KHZkZXYpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLSNlbmRpZgogCWlmICh2ZGV2LT5mb3BzLT5vcGVuKSB7CiAJCWlmICh2ZGV2LT5sb2NrICYmIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSh2ZGV2LT5sb2NrKSkgewogCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwpAQCAtNDMxLDE0ICs0MjMsOCBAQAogCiBlcnI6CiAJLyogZGVjcmVhc2UgdGhlIHJlZmNvdW50IGluIGNhc2Ugb2YgYW4gZXJyb3IgKi8KLQlpZiAocmV0KSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfTUVESUFfQ09OVFJPTExFUikKLQkJaWYgKHZkZXYtPnY0bDJfZGV2ICYmIHZkZXYtPnY0bDJfZGV2LT5tZGV2ICYmCi0JCSAgICB2ZGV2LT52ZmxfdHlwZSAhPSBWRkxfVFlQRV9TVUJERVYpCi0JCQltZWRpYV9lbnRpdHlfcHV0KGVudGl0eSk7Ci0jZW5kaWYKKwlpZiAocmV0KQogCQl2aWRlb19wdXQodmRldik7Ci0JfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ1NSwxMSArNDQxLDYgQEAKIAkJaWYgKHZkZXYtPmxvY2spCiAJCQltdXRleF91bmxvY2sodmRldi0+bG9jayk7CiAJfQotI2lmIGRlZmluZWQoQ09ORklHX01FRElBX0NPTlRST0xMRVIpCi0JaWYgKHZkZXYtPnY0bDJfZGV2ICYmIHZkZXYtPnY0bDJfZGV2LT5tZGV2ICYmCi0JICAgIHZkZXYtPnZmbF90eXBlICE9IFZGTF9UWVBFX1NVQkRFVikKLQkJbWVkaWFfZW50aXR5X3B1dCgmdmRldi0+ZW50aXR5KTsKLSNlbmRpZgogCS8qIGRlY3JlYXNlIHRoZSByZWZjb3VudCB1bmNvbmRpdGlvbmFsbHkgc2luY2UgdGhlIHJlbGVhc2UoKQogCSAgIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLiAqLwogCXZpZGVvX3B1dCh2ZGV2KTsKQEAgLTc1NCwxMiArNzM1LDYgQEAKIAlpZiAoIXZkZXYgfHwgIXZpZGVvX2lzX3JlZ2lzdGVyZWQodmRldikpCiAJCXJldHVybjsKIAotI2lmIGRlZmluZWQoQ09ORklHX01FRElBX0NPTlRST0xMRVIpCi0JaWYgKHZkZXYtPnY0bDJfZGV2ICYmIHZkZXYtPnY0bDJfZGV2LT5tZGV2ICYmCi0JICAgIHZkZXYtPnZmbF90eXBlICE9IFZGTF9UWVBFX1NVQkRFVikKLQkJbWVkaWFfZGV2aWNlX3VucmVnaXN0ZXJfZW50aXR5KCZ2ZGV2LT5lbnRpdHkpOwotI2VuZGlmCi0KIAltdXRleF9sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIAkvKiBUaGlzIG11c3QgYmUgaW4gYSBjcml0aWNhbCBzZWN0aW9uIHRvIHByZXZlbnQgYSByYWNlIHdpdGggdjRsMl9vcGVuLgogCSAqIE9uY2UgdGhpcyBiaXQgaGFzIGJlZW4gY2xlYXJlZCB2aWRlb19nZXQgbWF5IG5ldmVyIGJlIGNhbGxlZCBhZ2Fpbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pb2N0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWlvY3RsLmMKaW5kZXggNTA2ZWRjYy4uNjllOGM2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWlvY3RsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWlvY3RsLmMKQEAgLTE4MjIsNiArMTgyMiw4IEBACiAJCWlmICghb3BzLT52aWRpb2NfZ190dW5lcikKIAkJCWJyZWFrOwogCisJCXAtPnR5cGUgPSAodmZkLT52ZmxfdHlwZSA9PSBWRkxfVFlQRV9SQURJTykgPworCQkJVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOwogCQlyZXQgPSBvcHMtPnZpZGlvY19nX3R1bmVyKGZpbGUsIGZoLCBwKTsKIAkJaWYgKCFyZXQpCiAJCQlkYmdhcmcoY21kLCAiaW5kZXg9JWQsIG5hbWU9JXMsIHR5cGU9JWQsICIKQEAgLTE4NDAsNiArMTg0Miw4IEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19zX3R1bmVyKQogCQkJYnJlYWs7CisJCXAtPnR5cGUgPSAodmZkLT52ZmxfdHlwZSA9PSBWRkxfVFlQRV9SQURJTykgPworCQkJVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOwogCQlkYmdhcmcoY21kLCAiaW5kZXg9JWQsIG5hbWU9JXMsIHR5cGU9JWQsICIKIAkJCQkiY2FwYWJpbGl0eT0weCV4LCByYW5nZWxvdz0lZCwgIgogCQkJCSJyYW5nZWhpZ2g9JWQsIHNpZ25hbD0lZCwgYWZjPSVkLCAiCkBAIC0xODU4LDYgKzE4NjIsOCBAQAogCQlpZiAoIW9wcy0+dmlkaW9jX2dfZnJlcXVlbmN5KQogCQkJYnJlYWs7CiAKKwkJcC0+dHlwZSA9ICh2ZmQtPnZmbF90eXBlID09IFZGTF9UWVBFX1JBRElPKSA/CisJCQlWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJCXJldCA9IG9wcy0+dmlkaW9jX2dfZnJlcXVlbmN5KGZpbGUsIGZoLCBwKTsKIAkJaWYgKCFyZXQpCiAJCQlkYmdhcmcoY21kLCAidHVuZXI9JWQsIHR5cGU9JWQsIGZyZXF1ZW5jeT0lZFxuIiwKQEAgLTE5NDAsMTMgKzE5NDYsMTkgQEAKIAljYXNlIFZJRElPQ19TX0hXX0ZSRVFfU0VFSzoKIAl7CiAJCXN0cnVjdCB2NGwyX2h3X2ZyZXFfc2VlayAqcCA9IGFyZzsKKwkJZW51bSB2NGwyX3R1bmVyX3R5cGUgdHlwZTsKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3NfaHdfZnJlcV9zZWVrKQogCQkJYnJlYWs7CisJCXR5cGUgPSAodmZkLT52ZmxfdHlwZSA9PSBWRkxfVFlQRV9SQURJTykgPworCQkJVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOwogCQlkYmdhcmcoY21kLAotCQkJInR1bmVyPSVkLCB0eXBlPSVkLCBzZWVrX3Vwd2FyZD0lZCwgd3JhcF9hcm91bmQ9JWRcbiIsCi0JCQlwLT50dW5lciwgcC0+dHlwZSwgcC0+c2Vla191cHdhcmQsIHAtPndyYXBfYXJvdW5kKTsKLQkJcmV0ID0gb3BzLT52aWRpb2Nfc19od19mcmVxX3NlZWsoZmlsZSwgZmgsIHApOworCQkJInR1bmVyPSV1LCB0eXBlPSV1LCBzZWVrX3Vwd2FyZD0ldSwgd3JhcF9hcm91bmQ9JXUsIHNwYWNpbmc9JXVcbiIsCisJCQlwLT50dW5lciwgcC0+dHlwZSwgcC0+c2Vla191cHdhcmQsIHAtPndyYXBfYXJvdW5kLCBwLT5zcGFjaW5nKTsKKwkJaWYgKHAtPnR5cGUgIT0gdHlwZSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWVsc2UKKwkJCXJldCA9IG9wcy0+dmlkaW9jX3NfaHdfZnJlcV9zZWVrKGZpbGUsIGZoLCBwKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVklESU9DX0VOVU1fRlJBTUVTSVpFUzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWNvcmUuYwppbmRleCA2YmExNDYxLi4zMDE1ZTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItY29yZS5jCkBAIC00OTIsMTMgKzQ5Miw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qCi0JICogSWYgdGhlIHNhbWUgbnVtYmVyIG9mIGJ1ZmZlcnMgYW5kIG1lbW9yeSBhY2Nlc3MgbWV0aG9kIGlzIHJlcXVlc3RlZAotCSAqIHRoZW4gcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCWlmIChxLT5tZW1vcnkgPT0gcmVxLT5tZW1vcnkgJiYgcmVxLT5jb3VudCA9PSBxLT5udW1fYnVmZmVycykKLQkJcmV0dXJuIDA7Ci0KIAlpZiAocmVxLT5jb3VudCA9PSAwIHx8IHEtPm51bV9idWZmZXJzICE9IDAgfHwgcS0+bWVtb3J5ICE9IHJlcS0+bWVtb3J5KSB7CiAJCS8qCiAJCSAqIFdlIGFscmVhZHkgaGF2ZSBidWZmZXJzIGFsbG9jYXRlZCwgc28gZmlyc3QgY2hlY2sgaWYgdGhleQpAQCAtNTM5LDkgKzUzMiw5IEBACiAJLyogRmluYWxseSwgYWxsb2NhdGUgYnVmZmVycyBhbmQgdmlkZW8gbWVtb3J5ICovCiAJcmV0ID0gX192YjJfcXVldWVfYWxsb2MocSwgcmVxLT5tZW1vcnksIG51bV9idWZmZXJzLCBudW1fcGxhbmVzLAogCQkJCXBsYW5lX3NpemVzKTsKLQlpZiAocmV0IDwgMCkgewotCQlkcHJpbnRrKDEsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgd2l0aCBlcnJvcjogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJaWYgKHJldCA9PSAwKSB7CisJCWRwcmludGsoMSwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCS8qCkBAIC0xMTk2LDYgKzExODksNyBAQAogCSAqIGhhcyBub3QgYWxyZWFkeSBkZXF1ZXVlZCBiZWZvcmUgaW5pdGlhdGluZyBjYW5jZWwuCiAJICovCiAJSU5JVF9MSVNUX0hFQUQoJnEtPmRvbmVfbGlzdCk7CisJYXRvbWljX3NldCgmcS0+cXVldWVkX2NvdW50LCAwKTsKIAl3YWtlX3VwX2FsbCgmcS0+ZG9uZV93cSk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItZG1hLXNnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYwppbmRleCBiMmQ5NDg1Li4xMGEyMGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYwpAQCAtNjIsNyArNjIsNyBAQAogCQlnb3RvIGZhaWxfcGFnZXNfYXJyYXlfYWxsb2M7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYnVmLT5zZ19kZXNjLm51bV9wYWdlczsgKytpKSB7Ci0JCWJ1Zi0+cGFnZXNbaV0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJYnVmLT5wYWdlc1tpXSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8gfCBfX0dGUF9OT1dBUk4pOwogCQlpZiAoTlVMTCA9PSBidWYtPnBhZ2VzW2ldKQogCQkJZ290byBmYWlsX3BhZ2VzX2FsbG9jOwogCQlzZ19zZXRfcGFnZSgmYnVmLT5zZ19kZXNjLnNnbGlzdFtpXSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLW1lbW9wcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItbWVtb3BzLmMKaW5kZXggNTM3MGEzYS4uYjAzYzNhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItbWVtb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItbWVtb3BzLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLW1lbW9wcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKaW5kZXggMDkwZDJhMy4uYThjMDhmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCkBAIC02ODEsMTEgKzY4MSwxMSBAQAogCQlpZiAocm9vdCAmJiBhbGxvY2F0ZV9yZXNvdXJjZShyb290LCByZXMsIHNiLT5kZXNpcmVkX21lbV9zaXplLCBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSwgc2ItPmRlc2lyZWRfbWVtX3NpemUsIDEgPDwgMjAsCS8qIFVuc3BlY2lmaWVkLCBzbyB1c2UgMU1iIGFuZCBwbGF5IHNhZmUgKi8KIAkJCQkJICAgICAgTlVMTCwgTlVMTCkgPj0gMCkgewogCQkJYy0+bWVtX2FsbG9jID0gMTsKLQkJCXNiLT5jdXJyZW50X21lbV9zaXplID0gMSArIHJlcy0+ZW5kIC0gcmVzLT5zdGFydDsKKwkJCXNiLT5jdXJyZW50X21lbV9zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCQkJc2ItPmN1cnJlbnRfbWVtX2Jhc2UgPSByZXMtPnN0YXJ0OwogCQkJb3NtX2luZm8oIiVzOiBhbGxvY2F0ZWQgJWxsdSBieXRlcyBvZiBQQ0kgbWVtb3J5IGF0ICIKIAkJCQkiMHglMDE2bGxYLlxuIiwgYy0+bmFtZSwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSgxICsgcmVzLT5lbmQgLSByZXMtPnN0YXJ0KSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlc291cmNlX3NpemUocmVzKSwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQpOwogCQl9CiAJfQpAQCAtNzAzLDExICs3MDMsMTEgQEAKIAkJaWYgKHJvb3QgJiYgYWxsb2NhdGVfcmVzb3VyY2Uocm9vdCwgcmVzLCBzYi0+ZGVzaXJlZF9pb19zaXplLCBzYi0+ZGVzaXJlZF9pb19zaXplLCBzYi0+ZGVzaXJlZF9pb19zaXplLCAxIDw8IDIwLAkvKiBVbnNwZWNpZmllZCwgc28gdXNlIDFNYiBhbmQgcGxheSBzYWZlICovCiAJCQkJCSAgICAgIE5VTEwsIE5VTEwpID49IDApIHsKIAkJCWMtPmlvX2FsbG9jID0gMTsKLQkJCXNiLT5jdXJyZW50X2lvX3NpemUgPSAxICsgcmVzLT5lbmQgLSByZXMtPnN0YXJ0OworCQkJc2ItPmN1cnJlbnRfaW9fc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAkJCXNiLT5jdXJyZW50X21lbV9iYXNlID0gcmVzLT5zdGFydDsKIAkJCW9zbV9pbmZvKCIlczogYWxsb2NhdGVkICVsbHUgYnl0ZXMgb2YgUENJIEkvTyBhdCAiCiAJCQkJIjB4JTAxNmxsWC5cbiIsIGMtPm5hbWUsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykoMSArIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCksCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXNvdXJjZV9zaXplKHJlcyksCiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2ZXJzL21mZC9LY29uZmlnCmluZGV4IDBmMDljMDUuLjZjYTkzOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL0tjb25maWcKKysrIGIvZHJpdmVycy9tZmQvS2NvbmZpZwpAQCAtNzI4LDYgKzcyOCw5IEBACiAJICBpZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFRQUzY1OTEwIHNlcmllcyBvZgogCSAgUG93ZXIgTWFuYWdlbWVudCBjaGlwcy4KIAorY29uZmlnIFRQUzY1OTExX0NPTVBBUkFUT1IKKwl0cmlzdGF0ZQorCiBlbmRpZiAjIE1GRF9TVVBQT1JUCiAKIG1lbnUgIk11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL01ha2VmaWxlIGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKaW5kZXggZWZlM2NjMy4uZDdkNDdkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKQEAgLTk0LDMgKzk0LDQgQEAKIG9iai0kKENPTkZJR19NRkRfUE04OTIxX0NPUkUpIAkrPSBwbTg5MjEtY29yZS5vCiBvYmotJChDT05GSUdfTUZEX1BNOFhYWF9JUlEpIAkrPSBwbTh4eHgtaXJxLm8KIG9iai0kKENPTkZJR19NRkRfVFBTNjU5MTApCSs9IHRwczY1OTEwLm8gdHBzNjU5MTAtaXJxLm8KK29iai0kKENPTkZJR19UUFM2NTkxMV9DT01QQVJBVE9SKQkrPSB0cHM2NTkxMS1jb21wYXJhdG9yLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FzaWMzLmMgYi9kcml2ZXJzL21mZC9hc2ljMy5jCmluZGV4IGMyN2ZkMWYuLmM3MWFlMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FzaWMzLmMKKysrIGIvZHJpdmVycy9tZmQvYXNpYzMuYwpAQCAtNjE5LDYgKzYxOSw3IEBACiAvKiBNRkQgY2VsbHMgKFNQSSwgUFdNLCBMRUQsIERTMVdNLCBNTUMpICovCiBzdGF0aWMgc3RydWN0IGRzMXdtX2RyaXZlcl9kYXRhIGRzMXdtX3BkYXRhID0gewogCS5hY3RpdmVfaGlnaCA9IDEsCisJLnJlc2V0X3JlY292ZXJfZGVsYXkgPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkczF3bV9yZXNvdXJjZXNbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2h0Yy1wYXNpYzMuYyBiL2RyaXZlcnMvbWZkL2h0Yy1wYXNpYzMuYwppbmRleCAyODA4YmQxLi4wNGM3MDkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9odGMtcGFzaWMzLmMKKysrIGIvZHJpdmVycy9tZmQvaHRjLXBhc2ljMy5jCkBAIC05OSw2ICs5OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZHMxd21fZHJpdmVyX2RhdGEgZHMxd21fcGRhdGEgPSB7CiAJLmFjdGl2ZV9oaWdoID0gMCwKKwkucmVzZXRfcmVjb3Zlcl9kZWxheSA9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRzMXdtX3Jlc291cmNlc1tdIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9vbWFwLXVzYi1ob3N0LmMgYi9kcml2ZXJzL21mZC9vbWFwLXVzYi1ob3N0LmMKaW5kZXggODU1MjE5NS4uMTcxNzE0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvb21hcC11c2ItaG9zdC5jCisrKyBiL2RyaXZlcnMvbWZkL29tYXAtdXNiLWhvc3QuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjZGVmaW5lIFVTQkhTX0RSSVZFUl9OQU1FCSJ1c2Jocy1vbWFwIgogI2RlZmluZSBPTUFQX0VIQ0lfREVWSUNFCSJlaGNpLW9tYXAiCkBAIC0xNDcsNiArMTQ2LDkgQEAKIAogCiBzdHJ1Y3QgdXNiaHNfaGNkX29tYXAgeworCXN0cnVjdCBjbGsJCQkqdXNiaG9zdF9pY2s7CisJc3RydWN0IGNsawkJCSp1c2Job3N0X2hzX2ZjazsKKwlzdHJ1Y3QgY2xrCQkJKnVzYmhvc3RfZnNfZmNrOwogCXN0cnVjdCBjbGsJCQkqeGNsazYwbWhzcDFfY2s7CiAJc3RydWN0IGNsawkJCSp4Y2xrNjBtaHNwMl9jazsKIAlzdHJ1Y3QgY2xrCQkJKnV0bWlfcDFfZmNrOwpAQCAtMTU2LDYgKzE1OCw4IEBACiAJc3RydWN0IGNsawkJCSp1c2Job3N0X3AyX2ZjazsKIAlzdHJ1Y3QgY2xrCQkJKnVzYnRsbF9wMl9mY2s7CiAJc3RydWN0IGNsawkJCSppbml0XzYwbV9mY2xrOworCXN0cnVjdCBjbGsJCQkqdXNidGxsX2ZjazsKKwlzdHJ1Y3QgY2xrCQkJKnVzYnRsbF9pY2s7CiAKIAl2b2lkIF9faW9tZW0JCQkqdWhoX2Jhc2U7CiAJdm9pZCBfX2lvbWVtCQkJKnRsbF9iYXNlOwpAQCAtMzQ5LDEzICszNTMsNDYgQEAKIAlvbWFwLT5wbGF0ZGF0YS5laGNpX2RhdGEgPSBwZGF0YS0+ZWhjaV9kYXRhOwogCW9tYXAtPnBsYXRkYXRhLm9oY2lfZGF0YSA9IHBkYXRhLT5vaGNpX2RhdGE7CiAKLQlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKwlvbWFwLT51c2Job3N0X2ljayA9IGNsa19nZXQoZGV2LCAidXNiaG9zdF9pY2siKTsKKwlpZiAoSVNfRVJSKG9tYXAtPnVzYmhvc3RfaWNrKSkgeworCQlyZXQgPSAgUFRSX0VSUihvbWFwLT51c2Job3N0X2ljayk7CisJCWRldl9lcnIoZGV2LCAidXNiaG9zdF9pY2sgZmFpbGVkIGVycm9yOiVkXG4iLCByZXQpOworCQlnb3RvIGVycl9lbmQ7CisJfQorCisJb21hcC0+dXNiaG9zdF9oc19mY2sgPSBjbGtfZ2V0KGRldiwgImhzX2ZjayIpOworCWlmIChJU19FUlIob21hcC0+dXNiaG9zdF9oc19mY2spKSB7CisJCXJldCA9IFBUUl9FUlIob21hcC0+dXNiaG9zdF9oc19mY2spOworCQlkZXZfZXJyKGRldiwgInVzYmhvc3RfaHNfZmNrIGZhaWxlZCBlcnJvcjolZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfdXNiaG9zdF9pY2s7CisJfQorCisJb21hcC0+dXNiaG9zdF9mc19mY2sgPSBjbGtfZ2V0KGRldiwgImZzX2ZjayIpOworCWlmIChJU19FUlIob21hcC0+dXNiaG9zdF9mc19mY2spKSB7CisJCXJldCA9IFBUUl9FUlIob21hcC0+dXNiaG9zdF9mc19mY2spOworCQlkZXZfZXJyKGRldiwgInVzYmhvc3RfZnNfZmNrIGZhaWxlZCBlcnJvcjolZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfdXNiaG9zdF9oc19mY2s7CisJfQorCisJb21hcC0+dXNidGxsX2ZjayA9IGNsa19nZXQoZGV2LCAidXNidGxsX2ZjayIpOworCWlmIChJU19FUlIob21hcC0+dXNidGxsX2ZjaykpIHsKKwkJcmV0ID0gUFRSX0VSUihvbWFwLT51c2J0bGxfZmNrKTsKKwkJZGV2X2VycihkZXYsICJ1c2J0bGxfZmNrIGZhaWxlZCBlcnJvcjolZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfdXNiaG9zdF9mc19mY2s7CisJfQorCisJb21hcC0+dXNidGxsX2ljayA9IGNsa19nZXQoZGV2LCAidXNidGxsX2ljayIpOworCWlmIChJU19FUlIob21hcC0+dXNidGxsX2ljaykpIHsKKwkJcmV0ID0gUFRSX0VSUihvbWFwLT51c2J0bGxfaWNrKTsKKwkJZGV2X2VycihkZXYsICJ1c2J0bGxfaWNrIGZhaWxlZCBlcnJvcjolZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfdXNidGxsX2ZjazsKKwl9CiAKIAlvbWFwLT51dG1pX3AxX2ZjayA9IGNsa19nZXQoZGV2LCAidXRtaV9wMV9nZmNsayIpOwogCWlmIChJU19FUlIob21hcC0+dXRtaV9wMV9mY2spKSB7CiAJCXJldCA9IFBUUl9FUlIob21hcC0+dXRtaV9wMV9mY2spOwogCQlkZXZfZXJyKGRldiwgInV0bWlfcDFfZ2ZjbGsgZmFpbGVkIGVycm9yOiVkXG4iLAlyZXQpOwotCQlnb3RvIGVycl9lbmQ7CisJCWdvdG8gZXJyX3VzYnRsbF9pY2s7CiAJfQogCiAJb21hcC0+eGNsazYwbWhzcDFfY2sgPSBjbGtfZ2V0KGRldiwgInhjbGs2MG1oc3AxX2NrIik7CkBAIC00ODUsOCArNTIyLDIyIEBACiBlcnJfdXRtaV9wMV9mY2s6CiAJY2xrX3B1dChvbWFwLT51dG1pX3AxX2Zjayk7CiAKK2Vycl91c2J0bGxfaWNrOgorCWNsa19wdXQob21hcC0+dXNidGxsX2ljayk7CisKK2Vycl91c2J0bGxfZmNrOgorCWNsa19wdXQob21hcC0+dXNidGxsX2Zjayk7CisKK2Vycl91c2Job3N0X2ZzX2ZjazoKKwljbGtfcHV0KG9tYXAtPnVzYmhvc3RfZnNfZmNrKTsKKworZXJyX3VzYmhvc3RfaHNfZmNrOgorCWNsa19wdXQob21hcC0+dXNiaG9zdF9oc19mY2spOworCitlcnJfdXNiaG9zdF9pY2s6CisJY2xrX3B1dChvbWFwLT51c2Job3N0X2ljayk7CisKIGVycl9lbmQ6Ci0JcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCWtmcmVlKG9tYXApOwogCiBlbmRfcHJvYmU6CkBAIC01MjAsNyArNTcxLDExIEBACiAJY2xrX3B1dChvbWFwLT51dG1pX3AyX2Zjayk7CiAJY2xrX3B1dChvbWFwLT54Y2xrNjBtaHNwMV9jayk7CiAJY2xrX3B1dChvbWFwLT51dG1pX3AxX2Zjayk7Ci0JcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCWNsa19wdXQob21hcC0+dXNidGxsX2ljayk7CisJY2xrX3B1dChvbWFwLT51c2J0bGxfZmNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYmhvc3RfZnNfZmNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYmhvc3RfaHNfZmNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYmhvc3RfaWNrKTsKIAlrZnJlZShvbWFwKTsKIAogCXJldHVybiAwOwpAQCAtNjQwLDYgKzY5NSw3IEBACiAJc3RydWN0IHVzYmhzX29tYXBfcGxhdGZvcm1fZGF0YQkqcGRhdGEgPSAmb21hcC0+cGxhdGRhdGE7CiAJdW5zaWduZWQgbG9uZwkJCWZsYWdzID0gMDsKIAlpbnQJCQkJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCQkJdGltZW91dDsKIAl1bnNpZ25lZAkJCXJlZzsKIAogCWRldl9kYmcoZGV2LCAic3RhcnRpbmcgVEkgSFNVU0IgQ29udHJvbGxlclxuIik7CkBAIC02NTIsNyArNzA4LDExIEBACiAJaWYgKG9tYXAtPmNvdW50ID4gMCkKIAkJZ290byBlbmRfY291bnQ7CiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CisJY2xrX2VuYWJsZShvbWFwLT51c2Job3N0X2ljayk7CisJY2xrX2VuYWJsZShvbWFwLT51c2Job3N0X2hzX2Zjayk7CisJY2xrX2VuYWJsZShvbWFwLT51c2Job3N0X2ZzX2Zjayk7CisJY2xrX2VuYWJsZShvbWFwLT51c2J0bGxfZmNrKTsKKwljbGtfZW5hYmxlKG9tYXAtPnVzYnRsbF9pY2spOwogCiAJaWYgKHBkYXRhLT5laGNpX2RhdGEtPnBoeV9yZXNldCkgewogCQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+ZWhjaV9kYXRhLT5yZXNldF9ncGlvX3BvcnRbMF0pKSB7CkBAIC02NzYsNiArNzM2LDUwIEBACiAJb21hcC0+dXNiaHNfcmV2ID0gdXNiaHNfcmVhZChvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfUkVWSVNJT04pOwogCWRldl9kYmcoZGV2LCAiT01BUCBVSEhfUkVWSVNJT04gMHgleFxuIiwgb21hcC0+dXNiaHNfcmV2KTsKIAorCS8qIHBlcmZvcm0gVExMIHNvZnQgcmVzZXQsIGFuZCB3YWl0IHVudGlsIHJlc2V0IGlzIGNvbXBsZXRlICovCisJdXNiaHNfd3JpdGUob21hcC0+dGxsX2Jhc2UsIE9NQVBfVVNCVExMX1NZU0NPTkZJRywKKwkJCU9NQVBfVVNCVExMX1NZU0NPTkZJR19TT0ZUUkVTRVQpOworCisJLyogV2FpdCBmb3IgVExMIHJlc2V0IHRvIGNvbXBsZXRlICovCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCXdoaWxlICghKHVzYmhzX3JlYWQob21hcC0+dGxsX2Jhc2UsIE9NQVBfVVNCVExMX1NZU1NUQVRVUykKKwkJCSYgT01BUF9VU0JUTExfU1lTU1RBVFVTX1JFU0VURE9ORSkpIHsKKwkJY3B1X3JlbGF4KCk7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCWRldl9kYmcoZGV2LCAib3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfdGxsOworCQl9CisJfQorCisJZGV2X2RiZyhkZXYsICJUTEwgUkVTRVQgRE9ORVxuIik7CisKKwkvKiAoMTw8MykgPSBubyBpZGxlIG1vZGUgb25seSBmb3IgaW5pdGlhbCBkZWJ1Z2dpbmcgKi8KKwl1c2Joc193cml0ZShvbWFwLT50bGxfYmFzZSwgT01BUF9VU0JUTExfU1lTQ09ORklHLAorCQkJT01BUF9VU0JUTExfU1lTQ09ORklHX0VOQVdBS0VVUCB8CisJCQlPTUFQX1VTQlRMTF9TWVNDT05GSUdfU0lETEVNT0RFIHwKKwkJCU9NQVBfVVNCVExMX1NZU0NPTkZJR19BVVRPSURMRSk7CisKKwkvKiBQdXQgVUhIIGluIE5vSWRsZS9Ob1N0YW5kYnkgbW9kZSAqLworCXJlZyA9IHVzYmhzX3JlYWQob21hcC0+dWhoX2Jhc2UsIE9NQVBfVUhIX1NZU0NPTkZJRyk7CisJaWYgKGlzX29tYXBfdXNiaHNfcmV2MShvbWFwKSkgeworCQlyZWcgfD0gKE9NQVBfVUhIX1NZU0NPTkZJR19FTkFXQUtFVVAKKwkJCQl8IE9NQVBfVUhIX1NZU0NPTkZJR19TSURMRU1PREUKKwkJCQl8IE9NQVBfVUhIX1NZU0NPTkZJR19DQUNUSVZJVFkKKwkJCQl8IE9NQVBfVUhIX1NZU0NPTkZJR19NSURMRU1PREUpOworCQlyZWcgJj0gfk9NQVBfVUhIX1NZU0NPTkZJR19BVVRPSURMRTsKKworCisJfSBlbHNlIGlmIChpc19vbWFwX3VzYmhzX3JldjIob21hcCkpIHsKKwkJcmVnICY9IH5PTUFQNF9VSEhfU1lTQ09ORklHX0lETEVNT0RFX0NMRUFSOworCQlyZWcgfD0gT01BUDRfVUhIX1NZU0NPTkZJR19OT0lETEU7CisJCXJlZyAmPSB+T01BUDRfVUhIX1NZU0NPTkZJR19TVERCWU1PREVfQ0xFQVI7CisJCXJlZyB8PSBPTUFQNF9VSEhfU1lTQ09ORklHX05PU1REQlk7CisJfQorCisJdXNiaHNfd3JpdGUob21hcC0+dWhoX2Jhc2UsIE9NQVBfVUhIX1NZU0NPTkZJRywgcmVnKTsKKwogCXJlZyA9IHVzYmhzX3JlYWQob21hcC0+dWhoX2Jhc2UsIE9NQVBfVUhIX0hPU1RDT05GSUcpOwogCS8qIHNldHVwIFVMUEkgYnlwYXNzIGFuZCBidXJzdCBjb25maWd1cmF0aW9ucyAqLwogCXJlZyB8PSAoT01BUF9VSEhfSE9TVENPTkZJR19JTkNSNF9CVVJTVF9FTgpAQCAtODE1LDggKzkxOSw2IEBACiAJcmV0dXJuIDA7CiAKIGVycl90bGw6Ci0JcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9tYXAtPmxvY2ssIGZsYWdzKTsKIAlpZiAocGRhdGEtPmVoY2lfZGF0YS0+cGh5X3Jlc2V0KSB7CiAJCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5laGNpX2RhdGEtPnJlc2V0X2dwaW9fcG9ydFswXSkpCiAJCQlncGlvX2ZyZWUocGRhdGEtPmVoY2lfZGF0YS0+cmVzZXRfZ3Bpb19wb3J0WzBdKTsKQEAgLTgyNCw2ICs5MjYsMTMgQEAKIAkJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmVoY2lfZGF0YS0+cmVzZXRfZ3Bpb19wb3J0WzFdKSkKIAkJCWdwaW9fZnJlZShwZGF0YS0+ZWhjaV9kYXRhLT5yZXNldF9ncGlvX3BvcnRbMV0pOwogCX0KKworCWNsa19kaXNhYmxlKG9tYXAtPnVzYnRsbF9pY2spOworCWNsa19kaXNhYmxlKG9tYXAtPnVzYnRsbF9mY2spOworCWNsa19kaXNhYmxlKG9tYXAtPnVzYmhvc3RfZnNfZmNrKTsKKwljbGtfZGlzYWJsZShvbWFwLT51c2Job3N0X2hzX2Zjayk7CisJY2xrX2Rpc2FibGUob21hcC0+dXNiaG9zdF9pY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9tYXAtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04OTYsNyArMTAwNSwxMSBAQAogCQljbGtfZGlzYWJsZShvbWFwLT51dG1pX3AxX2Zjayk7CiAJfQogCi0JcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOworCWNsa19kaXNhYmxlKG9tYXAtPnVzYnRsbF9pY2spOworCWNsa19kaXNhYmxlKG9tYXAtPnVzYnRsbF9mY2spOworCWNsa19kaXNhYmxlKG9tYXAtPnVzYmhvc3RfZnNfZmNrKTsKKwljbGtfZGlzYWJsZShvbWFwLT51c2Job3N0X2hzX2Zjayk7CisJY2xrX2Rpc2FibGUob21hcC0+dXNiaG9zdF9pY2spOwogCiAJLyogVGhlIGdwaW9fZnJlZSBtaWdoIHNsZWVwOyBzbyB1bmxvY2sgdGhlIHNwaW5sb2NrICovCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb21hcC0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdGM2Mzg3eGIuYyBiL2RyaXZlcnMvbWZkL3RjNjM4N3hiLmMKaW5kZXggYWQ3MTViZi4uNzFiYzgzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdGM2Mzg3eGIuYworKysgYi9kcml2ZXJzL21mZC90YzYzODd4Yi5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9yZXNvdXJjZTsKIAotCXRjNjM4N3hiLT5zY3IgPSBpb3JlbWFwKHJzY3ItPnN0YXJ0LCByc2NyLT5lbmQgLSByc2NyLT5zdGFydCArIDEpOworCXRjNjM4N3hiLT5zY3IgPSBpb3JlbWFwKHJzY3ItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJzY3IpKTsKIAlpZiAoIXRjNjM4N3hiLT5zY3IpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfaW9yZW1hcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3RwczY1OTExLWNvbXBhcmF0b3IuYyBiL2RyaXZlcnMvbWZkL3RwczY1OTExLWNvbXBhcmF0b3IuYwppbmRleCAzZDJkYzU2Li4yODNhYzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90cHM2NTkxMS1jb21wYXJhdG9yLmMKKysrIGIvZHJpdmVycy9tZmQvdHBzNjU5MTEtY29tcGFyYXRvci5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIHN0YXRpYyBfX2RldmluaXQgaW50IHRwczY1OTExX2NvbXBhcmF0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgdHBzNjU5MTAgKnRwczY1OTEwID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCXN0cnVjdCB0cHM2NTkxMF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEodHBzNjU5MTAtPmRldik7CisJc3RydWN0IHRwczY1OTEwX2JvYXJkICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEodHBzNjU5MTAtPmRldik7CiAJaW50IHJldDsKIAogCXJldCA9IGNvbXBfdGhyZXNob2xkX3NldCh0cHM2NTkxMCwgQ09NUDEsICBwZGF0YS0+dm1iY2hfdGhyZXNob2xkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggNGUzNDljZC4uMGE0ZDg2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTI0NSw4ICsyNDUsNyBAQAogCiBjb25maWcgQ1M1NTM1X01GR1BUCiAJdHJpc3RhdGUgIkNTNTUzNS9DUzU1MzYgR2VvZGUgTXVsdGktRnVuY3Rpb24gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIChNRkdQVCkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSQotCWRlcGVuZHMgb24gWDg2CisJZGVwZW5kcyBvbiBQQ0kgJiYgWDg2ICYmIE1GRF9DUzU1MzUKIAlkZWZhdWx0IG4KIAloZWxwCiAJICBUaGlzIGRyaXZlciBwcm92aWRlcyBhY2Nlc3MgdG8gTUZHUFQgZnVuY3Rpb25hbGl0eSBmb3Igb3RoZXIKQEAgLTQ5MCw2ICs0ODksMTUgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIHBjaF9waHViLgogCitjb25maWcgVVNCX1NXSVRDSF9GU0E5NDgwCisJdHJpc3RhdGUgIkZTQTk0ODAgVVNCIFN3aXRjaCIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFRoZSBGU0E5NDgwIGlzIGEgVVNCIHBvcnQgYWNjZXNzb3J5IGRldGVjdG9yIGFuZCBzd2l0Y2guCisJICBUaGUgRlNBOTQ4MCBpcyBmdWxseSBjb250cm9sbGVkIHVzaW5nIEkyQyBhbmQgZW5hYmxlcyBVU0IgZGF0YSwKKwkgIHN0ZXJlbyBhbmQgbW9ubyBhdWRpbywgdmlkZW8sIG1pY3JvcGhvbmUgYW5kIFVBUlQgZGF0YSB0byB1c2UKKwkgIGEgY29tbW9uIGNvbm5lY3RvciBwb3J0LgorCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9jMnBvcnQvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9taXNjL2VlcHJvbS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21pc2MvY2I3MTAvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCBmYTQyOWY1Li44ZjNlZmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC00NiwzICs0Niw0IEBACiBvYmotJChDT05GSUdfQUI4NTAwX1BXTSkJKz0gYWI4NTAwLXB3bS5vCiBvYmoteQkJCQkrPSBsaXMzbHYwMmQvCiBvYmoteQkJCQkrPSBjYXJtYS8KK29iai0kKENPTkZJR19VU0JfU1dJVENIX0ZTQTk0ODApICs9IGZzYTk0ODAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2FwZHM5OTB4LmMgYi9kcml2ZXJzL21pc2MvYXBkczk5MHguYwppbmRleCAyMDAzMTFmLi5lMmE1MmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvYXBkczk5MHguYworKysgYi9kcml2ZXJzL21pc2MvYXBkczk5MHguYwpAQCAtNjA5LDYgKzYwOSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX1BNKSB8fCBkZWZpbmVkKENPTkZJR19QTV9SVU5USU1FKQogc3RhdGljIGludCBhcGRzOTkweF9jaGlwX29uKHN0cnVjdCBhcGRzOTkweF9jaGlwICpjaGlwKQogewogCWludCBlcnIJID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUoY2hpcC0+cmVncyksCkBAIC02MjQsNiArNjI1LDcgQEAKIAlhcGRzOTkweF9tb2RlX29uKGNoaXApOwogCXJldHVybiAwOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgYXBkczk5MHhfY2hpcF9vZmYoc3RydWN0IGFwZHM5OTB4X2NoaXAgKmNoaXApCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYXRtZWwtc3NjLmMgYi9kcml2ZXJzL21pc2MvYXRtZWwtc3NjLmMKaW5kZXggNGFmZmZlNi4uNzY5YTRlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2F0bWVsLXNzYy5jCisrKyBiL2RyaXZlcnMvbWlzYy9hdG1lbC1zc2MuYwpAQCAtOTUsNyArOTUsNyBAQAogCX0KIAogCXNzYy0+cGRldiA9IHBkZXY7Ci0Jc3NjLT5yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVncy0+ZW5kIC0gcmVncy0+c3RhcnQgKyAxKTsKKwlzc2MtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKIAlpZiAoIXNzYy0+cmVncykgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJpb3JlbWFwIGZhaWxlZFxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYXRtZWxfcHdtLmMgYi9kcml2ZXJzL21pc2MvYXRtZWxfcHdtLmMKaW5kZXggMGYzZmI0Zi4uMjhmNWFhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2F0bWVsX3B3bS5jCisrKyBiL2RyaXZlcnMvbWlzYy9hdG1lbF9wd20uYwpAQCAtMzI5LDcgKzMyOSw3IEBACiAJcC0+cGRldiA9IHBkZXY7CiAJcC0+bWFzayA9ICptcDsKIAlwLT5pcnEgPSBpcnE7Ci0JcC0+YmFzZSA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJcC0+YmFzZSA9IGlvcmVtYXAoci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOwogCWlmICghcC0+YmFzZSkKIAkJZ290byBmYWlsOwogCXAtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInB3bV9jbGsiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9jYjcxMC9zZ2J1ZjIuYyBiL2RyaXZlcnMvbWlzYy9jYjcxMC9zZ2J1ZjIuYwppbmRleCBkMDE5NzQ2Li4yYTQwZDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvY2I3MTAvc2didWYyLmMKKysrIGIvZHJpdmVycy9taXNjL2NiNzEwL3NnYnVmMi5jCkBAIC00Nyw3ICs0Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBuZWVkc191bmFsaWduZWRfY29weShjb25zdCB2b2lkICpwdHIpCiB7Ci0jaWZkZWYgSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUworI2lmZGVmIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTCiAJcmV0dXJuIGZhbHNlOwogI2Vsc2UKIAlyZXR1cm4gKChwdHIgLSBOVUxMKSAmIDMpICE9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvY3M1NTM1LW1mZ3B0LmMgYi9kcml2ZXJzL21pc2MvY3M1NTM1LW1mZ3B0LmMKaW5kZXggZTAxZTA4Yy4uYmM2ODViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2NzNTUzNS1tZmdwdC5jCisrKyBiL2RyaXZlcnMvbWlzYy9jczU1MzUtbWZncHQuYwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJCXRpbWVyX25yID0gdCA8IG1heCA/IChpbnQpIHQgOiAtMTsKIAl9IGVsc2UgewogCQkvKiBjaGVjayBpZiB0aGUgcmVxdWVzdGVkIHRpbWVyJ3MgYXZhaWxhYmxlICovCi0JCWlmICh0ZXN0X2JpdCh0aW1lcl9uciwgbWZncHQtPmF2YWlsKSkKKwkJaWYgKCF0ZXN0X2JpdCh0aW1lcl9uciwgbWZncHQtPmF2YWlsKSkKIAkJCXRpbWVyX25yID0gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZWVwcm9tL0tjb25maWcgYi9kcml2ZXJzL21pc2MvZWVwcm9tL0tjb25maWcKaW5kZXggOTExODYxMy4uMjZjZjEyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9lZXByb20vS2NvbmZpZwpAQCAtNzAsNCArNzAsMjkgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIEVFUFJPTV85M1hYNDYKKwl0cmlzdGF0ZSAiTWljcm93aXJlIEVFUFJPTSA5M1hYNDYgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNQSSAmJiBTWVNGUworCWhlbHAKKwkgIERyaXZlciBmb3IgdGhlIG1pY3Jvd2lyZSBFRVBST00gY2hpcHNldHMgOTN4eDQ2eC4gVGhlIGRyaXZlcgorCSAgc3VwcG9ydHMgYm90aCByZWFkIGFuZCB3cml0ZSBjb21tYW5kcyBhbmQgYWxzbyB0aGUgY29tbWFuZCB0bworCSAgZXJhc2UgdGhlIHdob2xlIEVFUFJPTS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZWVwcm9tXzkzeHg0Ni4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEVFUFJPTV9ESUdTWV9NVENfQ0ZHCisJYm9vbCAiRGlnc3lNVEMgZGlzcGxheSBjb25maWd1cmF0aW9uIEVFUFJPTXMgZGV2aWNlIgorCWRlcGVuZHMgb24gUFBDX01QQzUyMDBfR1BJTyAmJiBHUElPTElCICYmIFNQSV9HUElPCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBhY2Nlc3MgdG8gZGlzcGxheSBjb25maWd1cmF0aW9uIEVFUFJPTXMKKwkgIG9uIGRpZ3N5X210YyBib2FyZC4gWW91IGhhdmUgdG8gYWRkaXRpb25hbGx5IHNlbGVjdCBNaWNyb3dpcmUKKwkgIEVFUFJPTSA5M1hYNDYgZHJpdmVyLiBzeXNmcyBlbnRyaWVzIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhhdAorCSAgRUVQUk9NIGFsbG93aW5nIHRvIHJlYWQvd3JpdGUgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBvciB0bworCSAgZXJhc2UgdGhlIHdob2xlIEVFUFJPTS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VlcHJvbS9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9lZXByb20vTWFrZWZpbGUKaW5kZXggZGYzZDY4Zi4uZmMxZTgxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21pc2MvZWVwcm9tL01ha2VmaWxlCkBAIC0zLDMgKzMsNSBAQAogb2JqLSQoQ09ORklHX0VFUFJPTV9MRUdBQ1kpCSs9IGVlcHJvbS5vCiBvYmotJChDT05GSUdfRUVQUk9NX01BWDY4NzUpCSs9IG1heDY4NzUubwogb2JqLSQoQ09ORklHX0VFUFJPTV85M0NYNikJKz0gZWVwcm9tXzkzY3g2Lm8KK29iai0kKENPTkZJR19FRVBST01fOTNYWDQ2KQkrPSBlZXByb21fOTN4eDQ2Lm8KK29iai0kKENPTkZJR19FRVBST01fRElHU1lfTVRDX0NGRykgKz0gZGlnc3lfbXRjX2VlcHJvbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZWVwcm9tL2RpZ3N5X210Y19lZXByb20uYyBiL2RyaXZlcnMvbWlzYy9lZXByb20vZGlnc3lfbXRjX2VlcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDllMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvZWVwcm9tL2RpZ3N5X210Y19lZXByb20uYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogRUVQUk9NcyBhY2Nlc3MgY29udHJvbCBkcml2ZXIgZm9yIGRpc3BsYXkgY29uZmlndXJhdGlvbiBFRVBST01zCisgKiBvbiBEaWdzeU1UQyBib2FyZC4KKyAqCisgKiAoQykgMjAxMSBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBBbmF0b2xpaiBHdXN0c2NoaW4gPGFndXN0QGRlbnguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZWVwcm9tXzkzeHg0Ni5oPgorCisjZGVmaW5lIEdQSU9fRUVQUk9NX0NMSwkJMjE2CisjZGVmaW5lIEdQSU9fRUVQUk9NX0NTCQkyMTAKKyNkZWZpbmUgR1BJT19FRVBST01fREkJCTIxNworI2RlZmluZSBHUElPX0VFUFJPTV9ETwkJMjQ5CisjZGVmaW5lIEdQSU9fRUVQUk9NX09FCQkyNTUKKyNkZWZpbmUgRUVfU1BJX0JVU19OVU0JMQorCitzdGF0aWMgdm9pZCBkaWdzeV9tdGNfb3BfcHJlcGFyZSh2b2lkICpwKQoreworCS8qIGVuYWJsZSAqLworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fRUVQUk9NX09FLCAwKTsKK30KKworc3RhdGljIHZvaWQgZGlnc3lfbXRjX29wX2ZpbmlzaCh2b2lkICpwKQoreworCS8qIGRpc2FibGUgKi8KKwlncGlvX3NldF92YWx1ZShHUElPX0VFUFJPTV9PRSwgMSk7Cit9CisKK3N0cnVjdCBlZXByb21fOTN4eDQ2X3BsYXRmb3JtX2RhdGEgZGlnc3lfbXRjX2VlcHJvbV9kYXRhID0geworCS5mbGFncwkJPSBFRV9BRERSOCwKKwkucHJlcGFyZQk9IGRpZ3N5X210Y19vcF9wcmVwYXJlLAorCS5maW5pc2gJCT0gZGlnc3lfbXRjX29wX2ZpbmlzaCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSBlZXByb21fc3BpX2dwaW9fZGF0YSA9IHsKKwkuc2NrCQk9IEdQSU9fRUVQUk9NX0NMSywKKwkubW9zaQkJPSBHUElPX0VFUFJPTV9ESSwKKwkubWlzbwkJPSBHUElPX0VFUFJPTV9ETywKKwkubnVtX2NoaXBzZWxlY3QJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGlnc3lfbXRjX2VlcHJvbSA9IHsKKwkubmFtZQk9ICJzcGlfZ3BpbyIsCisJLmlkCT0gRUVfU1BJX0JVU19OVU0sCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZWVwcm9tX3NwaV9ncGlvX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gZGlnc3lfbXRjX2VlcHJvbV9pbmZvW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5tb2RhbGlhcwkJPSAiOTN4eDQ2IiwKKwkJLm1heF9zcGVlZF9oegkJPSAxMDAwMDAwLAorCQkuYnVzX251bQkJPSBFRV9TUElfQlVTX05VTSwKKwkJLmNoaXBfc2VsZWN0CQk9IDAsCisJCS5tb2RlCQkJPSBTUElfTU9ERV8wLAorCQkuY29udHJvbGxlcl9kYXRhCT0gKHZvaWQgKilHUElPX0VFUFJPTV9DUywKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJmRpZ3N5X210Y19lZXByb21fZGF0YSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGlnc3lfbXRjX2VlcHJvbV9kZXZpY2VzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShHUElPX0VFUFJPTV9PRSwgR1BJT0ZfT1VUX0lOSVRfSElHSCwKKwkJCQkiOTN4eDQ2IEVFUFJPTXMgT0UiKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiY2FuJ3QgcmVxdWVzdCBncGlvICVkXG4iLCBHUElPX0VFUFJPTV9PRSk7CisJCXJldHVybiByZXQ7CisJfQorCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGRpZ3N5X210Y19lZXByb21faW5mbywKKwkJCQlBUlJBWV9TSVpFKGRpZ3N5X210Y19lZXByb21faW5mbykpOworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRpZ3N5X210Y19lZXByb20pOworfQorZGV2aWNlX2luaXRjYWxsKGRpZ3N5X210Y19lZXByb21fZGV2aWNlc19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tXzkzeHg0Ni5jIGIvZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb21fOTN4eDQ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3ZWJiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tXzkzeHg0Ni5jCkBAIC0wLDAgKzEsNDEwIEBACisvKgorICogRHJpdmVyIGZvciA5M3h4NDYgRUVQUk9NcworICoKKyAqIChDKSAyMDExIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIEFuYXRvbGlqIEd1c3RzY2hpbiA8YWd1c3RAZGVueC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lZXByb21fOTN4eDQ2Lmg+CisKKyNkZWZpbmUgT1BfU1RBUlQJMHg0CisjZGVmaW5lIE9QX1dSSVRFCShPUF9TVEFSVCB8IDB4MSkKKyNkZWZpbmUgT1BfUkVBRAkJKE9QX1NUQVJUIHwgMHgyKQorI2RlZmluZSBBRERSX0VXRFMJMHgwMAorI2RlZmluZSBBRERSX0VSQUwJMHgyMAorI2RlZmluZSBBRERSX0VXRU4JMHgzMAorCitzdHJ1Y3QgZWVwcm9tXzkzeHg0Nl9kZXYgeworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CisJc3RydWN0IGVlcHJvbV85M3h4NDZfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgYmluOworCXN0cnVjdCBtdXRleCBsb2NrOworCWludCBhZGRybGVuOworfTsKKworc3RhdGljIHNzaXplX3QKK2VlcHJvbV85M3h4NDZfYmluX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkgICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkgICAgICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGVlcHJvbV85M3h4NDZfZGV2ICplZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRbMl07CisJaW50IGJpdHMsIHJldDsKKwl1MTYgY21kX2FkZHI7CisKKwlkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJZWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKHVubGlrZWx5KG9mZiA+PSBlZGV2LT5iaW4uc2l6ZSkpCisJCXJldHVybiAwOworCWlmICgob2ZmICsgY291bnQpID4gZWRldi0+YmluLnNpemUpCisJCWNvdW50ID0gZWRldi0+YmluLnNpemUgLSBvZmY7CisJaWYgKHVubGlrZWx5KCFjb3VudCkpCisJCXJldHVybiBjb3VudDsKKworCWNtZF9hZGRyID0gT1BfUkVBRCA8PCBlZGV2LT5hZGRybGVuOworCisJaWYgKGVkZXYtPmFkZHJsZW4gPT0gNykgeworCQljbWRfYWRkciB8PSBvZmYgJiAweDdmOworCQliaXRzID0gMTA7CisJfSBlbHNlIHsKKwkJY21kX2FkZHIgfD0gb2ZmICYgMHgzZjsKKwkJYml0cyA9IDk7CisJfQorCisJZGV2X2RiZygmZWRldi0+c3BpLT5kZXYsICJyZWFkIGNtZCAweCV4LCAlZCBIelxuIiwKKwkJY21kX2FkZHIsIGVkZXYtPnNwaS0+bWF4X3NwZWVkX2h6KTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCW1lbXNldCh0LCAwLCBzaXplb2YodCkpOworCisJdFswXS50eF9idWYgPSAoY2hhciAqKSZjbWRfYWRkcjsKKwl0WzBdLmxlbiA9IDI7CisJdFswXS5iaXRzX3Blcl93b3JkID0gYml0czsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdFswXSwgJm0pOworCisJdFsxXS5yeF9idWYgPSBidWY7CisJdFsxXS5sZW4gPSBjb3VudDsKKwl0WzFdLmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzFdLCAmbSk7CisKKwltdXRleF9sb2NrKCZlZGV2LT5sb2NrKTsKKworCWlmIChlZGV2LT5wZGF0YS0+cHJlcGFyZSkKKwkJZWRldi0+cGRhdGEtPnByZXBhcmUoZWRldik7CisKKwlyZXQgPSBzcGlfc3luYyhlZGV2LT5zcGksICZtKTsKKwkvKiBoYXZlIHRvIHdhaXQgYXQgbGVhc3QgVGNzbCBucyAqLworCW5kZWxheSgyNTApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZWRldi0+c3BpLT5kZXYsICJyZWFkICV6dSBieXRlcyBhdCAlZDogZXJyLiAlZFxuIiwKKwkJCWNvdW50LCAoaW50KW9mZiwgcmV0KTsKKwl9CisKKwlpZiAoZWRldi0+cGRhdGEtPmZpbmlzaCkKKwkJZWRldi0+cGRhdGEtPmZpbmlzaChlZGV2KTsKKworCW11dGV4X3VubG9jaygmZWRldi0+bG9jayk7CisJcmV0dXJuIHJldCA/IDogY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZWVwcm9tXzkzeHg0Nl9ldyhzdHJ1Y3QgZWVwcm9tXzkzeHg0Nl9kZXYgKmVkZXYsIGludCBpc19vbikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHQ7CisJaW50IGJpdHMsIHJldDsKKwl1MTYgY21kX2FkZHI7CisKKwljbWRfYWRkciA9IE9QX1NUQVJUIDw8IGVkZXYtPmFkZHJsZW47CisJaWYgKGVkZXYtPmFkZHJsZW4gPT0gNykgeworCQljbWRfYWRkciB8PSAoaXNfb24gPyBBRERSX0VXRU4gOiBBRERSX0VXRFMpIDw8IDE7CisJCWJpdHMgPSAxMDsKKwl9IGVsc2UgeworCQljbWRfYWRkciB8PSAoaXNfb24gPyBBRERSX0VXRU4gOiBBRERSX0VXRFMpOworCQliaXRzID0gOTsKKwl9CisKKwlkZXZfZGJnKCZlZGV2LT5zcGktPmRldiwgImV3IGNtZCAweCUwNHhcbiIsIGNtZF9hZGRyKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCW1lbXNldCgmdCwgMCwgc2l6ZW9mKHQpKTsKKworCXQudHhfYnVmID0gJmNtZF9hZGRyOworCXQubGVuID0gMjsKKwl0LmJpdHNfcGVyX3dvcmQgPSBiaXRzOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0LCAmbSk7CisKKwltdXRleF9sb2NrKCZlZGV2LT5sb2NrKTsKKworCWlmIChlZGV2LT5wZGF0YS0+cHJlcGFyZSkKKwkJZWRldi0+cGRhdGEtPnByZXBhcmUoZWRldik7CisKKwlyZXQgPSBzcGlfc3luYyhlZGV2LT5zcGksICZtKTsKKwkvKiBoYXZlIHRvIHdhaXQgYXQgbGVhc3QgVGNzbCBucyAqLworCW5kZWxheSgyNTApOworCWlmIChyZXQpCisJCWRldl9lcnIoJmVkZXYtPnNwaS0+ZGV2LCAiZXJhc2Uvd3JpdGUgJXNhYmxlIGVycm9yICVkXG4iLAorCQkJaXNfb24gPyAiZW4iIDogImRpcyIsIHJldCk7CisKKwlpZiAoZWRldi0+cGRhdGEtPmZpbmlzaCkKKwkJZWRldi0+cGRhdGEtPmZpbmlzaChlZGV2KTsKKworCW11dGV4X3VubG9jaygmZWRldi0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2VlcHJvbV85M3h4NDZfd3JpdGVfd29yZChzdHJ1Y3QgZWVwcm9tXzkzeHg0Nl9kZXYgKmVkZXYsCisJCQkgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBvZmYpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG07CisJc3RydWN0IHNwaV90cmFuc2ZlciB0WzJdOworCWludCBiaXRzLCBkYXRhX2xlbiwgcmV0OworCXUxNiBjbWRfYWRkcjsKKworCWNtZF9hZGRyID0gT1BfV1JJVEUgPDwgZWRldi0+YWRkcmxlbjsKKworCWlmIChlZGV2LT5hZGRybGVuID09IDcpIHsKKwkJY21kX2FkZHIgfD0gb2ZmICYgMHg3ZjsKKwkJYml0cyA9IDEwOworCQlkYXRhX2xlbiA9IDE7CisJfSBlbHNlIHsKKwkJY21kX2FkZHIgfD0gb2ZmICYgMHgzZjsKKwkJYml0cyA9IDk7CisJCWRhdGFfbGVuID0gMjsKKwl9CisKKwlkZXZfZGJnKCZlZGV2LT5zcGktPmRldiwgIndyaXRlIGNtZCAweCV4XG4iLCBjbWRfYWRkcik7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKwltZW1zZXQodCwgMCwgc2l6ZW9mKHQpKTsKKworCXRbMF0udHhfYnVmID0gKGNoYXIgKikmY21kX2FkZHI7CisJdFswXS5sZW4gPSAyOworCXRbMF0uYml0c19wZXJfd29yZCA9IGJpdHM7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMF0sICZtKTsKKworCXRbMV0udHhfYnVmID0gYnVmOworCXRbMV0ubGVuID0gZGF0YV9sZW47CisJdFsxXS5iaXRzX3Blcl93b3JkID0gODsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdFsxXSwgJm0pOworCisJcmV0ID0gc3BpX3N5bmMoZWRldi0+c3BpLCAmbSk7CisJLyogaGF2ZSB0byB3YWl0IHByb2dyYW0gY3ljbGUgdGltZSBUd2MgbXMgKi8KKwltZGVsYXkoNik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2VlcHJvbV85M3h4NDZfYmluX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBlZXByb21fOTN4eDQ2X2RldiAqZWRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IGksIHJldCwgc3RlcCA9IDE7CisKKwlkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJZWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKHVubGlrZWx5KG9mZiA+PSBlZGV2LT5iaW4uc2l6ZSkpCisJCXJldHVybiAwOworCWlmICgob2ZmICsgY291bnQpID4gZWRldi0+YmluLnNpemUpCisJCWNvdW50ID0gZWRldi0+YmluLnNpemUgLSBvZmY7CisJaWYgKHVubGlrZWx5KCFjb3VudCkpCisJCXJldHVybiBjb3VudDsKKworCS8qIG9ubHkgd3JpdGUgZXZlbiBudW1iZXIgb2YgYnl0ZXMgb24gMTYtYml0IGRldmljZXMgKi8KKwlpZiAoZWRldi0+YWRkcmxlbiA9PSA2KSB7CisJCXN0ZXAgPSAyOworCQljb3VudCAmPSB+MTsKKwl9CisKKwkvKiBlcmFzZS93cml0ZSBlbmFibGUgKi8KKwlyZXQgPSBlZXByb21fOTN4eDQ2X2V3KGVkZXYsIDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZlZGV2LT5sb2NrKTsKKworCWlmIChlZGV2LT5wZGF0YS0+cHJlcGFyZSkKKwkJZWRldi0+cGRhdGEtPnByZXBhcmUoZWRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gc3RlcCkgeworCQlyZXQgPSBlZXByb21fOTN4eDQ2X3dyaXRlX3dvcmQoZWRldiwgJmJ1ZltpXSwgb2ZmICsgaSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmVkZXYtPnNwaS0+ZGV2LCAid3JpdGUgZmFpbGVkIGF0ICVkOiAlZFxuIiwKKwkJCQkoaW50KW9mZiArIGksIHJldCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChlZGV2LT5wZGF0YS0+ZmluaXNoKQorCQllZGV2LT5wZGF0YS0+ZmluaXNoKGVkZXYpOworCisJbXV0ZXhfdW5sb2NrKCZlZGV2LT5sb2NrKTsKKworCS8qIGVyYXNlL3dyaXRlIGRpc2FibGUgKi8KKwllZXByb21fOTN4eDQ2X2V3KGVkZXYsIDApOworCXJldHVybiByZXQgPyA6IGNvdW50OworfQorCitzdGF0aWMgaW50IGVlcHJvbV85M3h4NDZfZXJhbChzdHJ1Y3QgZWVwcm9tXzkzeHg0Nl9kZXYgKmVkZXYpCit7CisJc3RydWN0IGVlcHJvbV85M3h4NDZfcGxhdGZvcm1fZGF0YSAqcGQgPSBlZGV2LT5wZGF0YTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHQ7CisJaW50IGJpdHMsIHJldDsKKwl1MTYgY21kX2FkZHI7CisKKwljbWRfYWRkciA9IE9QX1NUQVJUIDw8IGVkZXYtPmFkZHJsZW47CisJaWYgKGVkZXYtPmFkZHJsZW4gPT0gNykgeworCQljbWRfYWRkciB8PSBBRERSX0VSQUwgPDwgMTsKKwkJYml0cyA9IDEwOworCX0gZWxzZSB7CisJCWNtZF9hZGRyIHw9IEFERFJfRVJBTDsKKwkJYml0cyA9IDk7CisJfQorCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisJbWVtc2V0KCZ0LCAwLCBzaXplb2YodCkpOworCisJdC50eF9idWYgPSAmY21kX2FkZHI7CisJdC5sZW4gPSAyOworCXQuYml0c19wZXJfd29yZCA9IGJpdHM7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKKworCW11dGV4X2xvY2soJmVkZXYtPmxvY2spOworCisJaWYgKGVkZXYtPnBkYXRhLT5wcmVwYXJlKQorCQllZGV2LT5wZGF0YS0+cHJlcGFyZShlZGV2KTsKKworCXJldCA9IHNwaV9zeW5jKGVkZXYtPnNwaSwgJm0pOworCWlmIChyZXQpCisJCWRldl9lcnIoJmVkZXYtPnNwaS0+ZGV2LCAiZXJhc2UgZXJyb3IgJWRcbiIsIHJldCk7CisJLyogaGF2ZSB0byB3YWl0IGVyYXNlIGN5Y2xlIHRpbWUgVGVjIG1zICovCisJbWRlbGF5KDYpOworCisJaWYgKHBkLT5maW5pc2gpCisJCXBkLT5maW5pc2goZWRldik7CisKKwltdXRleF91bmxvY2soJmVkZXYtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVlcHJvbV85M3h4NDZfc3RvcmVfZXJhc2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZWVwcm9tXzkzeHg0Nl9kZXYgKmVkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJhc2UgPSAwLCByZXQ7CisKKwlzc2NhbmYoYnVmLCAiJWQiLCAmZXJhc2UpOworCWlmIChlcmFzZSkgeworCQlyZXQgPSBlZXByb21fOTN4eDQ2X2V3KGVkZXYsIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gZWVwcm9tXzkzeHg0Nl9lcmFsKGVkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gZWVwcm9tXzkzeHg0Nl9ldyhlZGV2LCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihlcmFzZSwgU19JV1VTUiwgTlVMTCwgZWVwcm9tXzkzeHg0Nl9zdG9yZV9lcmFzZSk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVlcHJvbV85M3h4NDZfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgZWVwcm9tXzkzeHg0Nl9wbGF0Zm9ybV9kYXRhICpwZDsKKwlzdHJ1Y3QgZWVwcm9tXzkzeHg0Nl9kZXYgKmVkZXY7CisJaW50IGVycjsKKworCXBkID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZWRldiA9IGt6YWxsb2Moc2l6ZW9mKCplZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChwZC0+ZmxhZ3MgJiBFRV9BRERSOCkKKwkJZWRldi0+YWRkcmxlbiA9IDc7CisJZWxzZSBpZiAocGQtPmZsYWdzICYgRUVfQUREUjE2KQorCQllZGV2LT5hZGRybGVuID0gNjsKKwllbHNlIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bnNwZWNpZmllZCBhZGRyZXNzIHR5cGVcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJbXV0ZXhfaW5pdCgmZWRldi0+bG9jayk7CisKKwllZGV2LT5zcGkgPSBzcGlfZGV2X2dldChzcGkpOworCWVkZXYtPnBkYXRhID0gcGQ7CisKKwlzeXNmc19iaW5fYXR0cl9pbml0KCZlZGV2LT5iaW4pOworCWVkZXYtPmJpbi5hdHRyLm5hbWUgPSAiZWVwcm9tIjsKKwllZGV2LT5iaW4uYXR0ci5tb2RlID0gU19JUlVTUjsKKwllZGV2LT5iaW4ucmVhZCA9IGVlcHJvbV85M3h4NDZfYmluX3JlYWQ7CisJZWRldi0+YmluLnNpemUgPSAxMjg7CisJaWYgKCEocGQtPmZsYWdzICYgRUVfUkVBRE9OTFkpKSB7CisJCWVkZXYtPmJpbi53cml0ZSA9IGVlcHJvbV85M3h4NDZfYmluX3dyaXRlOworCQllZGV2LT5iaW4uYXR0ci5tb2RlIHw9IFNfSVdVU1I7CisJfQorCisJZXJyID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZzcGktPmRldi5rb2JqLCAmZWRldi0+YmluKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw7CisKKwlkZXZfaW5mbygmc3BpLT5kZXYsICIlZC1iaXQgZWVwcm9tICVzXG4iLAorCQkocGQtPmZsYWdzICYgRUVfQUREUjgpID8gOCA6IDE2LAorCQkocGQtPmZsYWdzICYgRUVfUkVBRE9OTFkpID8gIihyZWFkb25seSkiIDogIiIpOworCisJaWYgKCEocGQtPmZsYWdzICYgRUVfUkVBRE9OTFkpKSB7CisJCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfZXJhc2UpKQorCQkJZGV2X2Vycigmc3BpLT5kZXYsICJjYW4ndCBjcmVhdGUgZXJhc2UgaW50ZXJmYWNlXG4iKTsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBlZGV2KTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJa2ZyZWUoZWRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZWVwcm9tXzkzeHg0Nl9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgZWVwcm9tXzkzeHg0Nl9kZXYgKmVkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCWlmICghKGVkZXYtPnBkYXRhLT5mbGFncyAmIEVFX1JFQURPTkxZKSkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX2VyYXNlKTsKKworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmc3BpLT5kZXYua29iaiwgJmVkZXYtPmJpbik7CisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7CisJa2ZyZWUoZWRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBlZXByb21fOTN4eDQ2X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICI5M3h4NDYiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBlZXByb21fOTN4eDQ2X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZWVwcm9tXzkzeHg0Nl9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZWVwcm9tXzkzeHg0Nl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmVlcHJvbV85M3h4NDZfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGVlcHJvbV85M3h4NDZfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlZXByb21fOTN4eDQ2X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmVlcHJvbV85M3h4NDZfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGVlcHJvbV85M3h4NDZfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciA5M3h4NDYgRUVQUk9NcyIpOworTU9EVUxFX0FVVEhPUigiQW5hdG9saWogR3VzdHNjaGluIDxhZ3VzdEBkZW54LmRlPiIpOworTU9EVUxFX0FMSUFTKCJzcGk6OTN4eDQ2Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZnNhOTQ4MC5jIGIvZHJpdmVycy9taXNjL2ZzYTk0ODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI1YTdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL2ZzYTk0ODAuYwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqIGZzYTk0ODAuYyAtIEZTQTk0ODAgbWljcm8gVVNCIHN3aXRjaCBkZXZpY2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIE1pbmt5dSBLYW5nIDxtazcua2FuZ0BzYW1zdW5nLmNvbT4KKyAqIFdvbmd1ayBKZW9uZyA8d29uZ3VrLmplb25nQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZnNhOTQ4MC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisKKy8qIEZTQTk0ODAgSTJDIHJlZ2lzdGVycyAqLworI2RlZmluZSBGU0E5NDgwX1JFR19ERVZJRAkJMHgwMQorI2RlZmluZSBGU0E5NDgwX1JFR19DVFJMCQkweDAyCisjZGVmaW5lIEZTQTk0ODBfUkVHX0lOVDEJCTB4MDMKKyNkZWZpbmUgRlNBOTQ4MF9SRUdfSU5UMgkJMHgwNAorI2RlZmluZSBGU0E5NDgwX1JFR19JTlQxX01BU0sJCTB4MDUKKyNkZWZpbmUgRlNBOTQ4MF9SRUdfSU5UMl9NQVNLCQkweDA2CisjZGVmaW5lIEZTQTk0ODBfUkVHX0FEQwkJCTB4MDcKKyNkZWZpbmUgRlNBOTQ4MF9SRUdfVElNSU5HMQkJMHgwOAorI2RlZmluZSBGU0E5NDgwX1JFR19USU1JTkcyCQkweDA5CisjZGVmaW5lIEZTQTk0ODBfUkVHX0RFVl9UMQkJMHgwYQorI2RlZmluZSBGU0E5NDgwX1JFR19ERVZfVDIJCTB4MGIKKyNkZWZpbmUgRlNBOTQ4MF9SRUdfQlROMQkJMHgwYworI2RlZmluZSBGU0E5NDgwX1JFR19CVE4yCQkweDBkCisjZGVmaW5lIEZTQTk0ODBfUkVHX0NLCQkJMHgwZQorI2RlZmluZSBGU0E5NDgwX1JFR19DS19JTlQxCQkweDBmCisjZGVmaW5lIEZTQTk0ODBfUkVHX0NLX0lOVDIJCTB4MTAKKyNkZWZpbmUgRlNBOTQ4MF9SRUdfQ0tfSU5UTUFTSzEJCTB4MTEKKyNkZWZpbmUgRlNBOTQ4MF9SRUdfQ0tfSU5UTUFTSzIJCTB4MTIKKyNkZWZpbmUgRlNBOTQ4MF9SRUdfTUFOU1cxCQkweDEzCisjZGVmaW5lIEZTQTk0ODBfUkVHX01BTlNXMgkJMHgxNAorCisvKiBDb250cm9sICovCisjZGVmaW5lIENPTl9TV0lUQ0hfT1BFTgkJKDEgPDwgNCkKKyNkZWZpbmUgQ09OX1JBV19EQVRBCQkoMSA8PCAzKQorI2RlZmluZSBDT05fTUFOVUFMX1NXCQkoMSA8PCAyKQorI2RlZmluZSBDT05fV0FJVAkJKDEgPDwgMSkKKyNkZWZpbmUgQ09OX0lOVF9NQVNLCQkoMSA8PCAwKQorI2RlZmluZSBDT05fTUFTSwkJKENPTl9TV0lUQ0hfT1BFTiB8IENPTl9SQVdfREFUQSB8IFwKKwkJCQlDT05fTUFOVUFMX1NXIHwgQ09OX1dBSVQpCisKKy8qIERldmljZSBUeXBlIDEgKi8KKyNkZWZpbmUgREVWX1VTQl9PVEcJCSgxIDw8IDcpCisjZGVmaW5lIERFVl9ERURJQ0FURURfQ0hHCSgxIDw8IDYpCisjZGVmaW5lIERFVl9VU0JfQ0hHCQkoMSA8PCA1KQorI2RlZmluZSBERVZfQ0FSX0tJVAkJKDEgPDwgNCkKKyNkZWZpbmUgREVWX1VBUlQJCSgxIDw8IDMpCisjZGVmaW5lIERFVl9VU0IJCQkoMSA8PCAyKQorI2RlZmluZSBERVZfQVVESU9fMgkJKDEgPDwgMSkKKyNkZWZpbmUgREVWX0FVRElPXzEJCSgxIDw8IDApCisKKyNkZWZpbmUgREVWX1QxX1VTQl9NQVNLCQkoREVWX1VTQl9PVEcgfCBERVZfVVNCKQorI2RlZmluZSBERVZfVDFfVUFSVF9NQVNLCShERVZfVUFSVCkKKyNkZWZpbmUgREVWX1QxX0NIQVJHRVJfTUFTSwkoREVWX0RFRElDQVRFRF9DSEcgfCBERVZfVVNCX0NIRykKKworLyogRGV2aWNlIFR5cGUgMiAqLworI2RlZmluZSBERVZfQVYJCQkoMSA8PCA2KQorI2RlZmluZSBERVZfVFRZCQkJKDEgPDwgNSkKKyNkZWZpbmUgREVWX1BQRAkJCSgxIDw8IDQpCisjZGVmaW5lIERFVl9KSUdfVUFSVF9PRkYJKDEgPDwgMykKKyNkZWZpbmUgREVWX0pJR19VQVJUX09OCQkoMSA8PCAyKQorI2RlZmluZSBERVZfSklHX1VTQl9PRkYJCSgxIDw8IDEpCisjZGVmaW5lIERFVl9KSUdfVVNCX09OCQkoMSA8PCAwKQorCisjZGVmaW5lIERFVl9UMl9VU0JfTUFTSwkJKERFVl9KSUdfVVNCX09GRiB8IERFVl9KSUdfVVNCX09OKQorI2RlZmluZSBERVZfVDJfVUFSVF9NQVNLCShERVZfSklHX1VBUlRfT0ZGIHwgREVWX0pJR19VQVJUX09OKQorI2RlZmluZSBERVZfVDJfSklHX01BU0sJCShERVZfSklHX1VTQl9PRkYgfCBERVZfSklHX1VTQl9PTiB8IFwKKwkJCQlERVZfSklHX1VBUlRfT0ZGIHwgREVWX0pJR19VQVJUX09OKQorCisvKgorICogTWFudWFsIFN3aXRjaAorICogRC0gWzc6NV0gLyBEKyBbNDoyXQorICogMDAwOiBPcGVuIGFsbCAvIDAwMTogVVNCIC8gMDEwOiBBVURJTyAvIDAxMTogVUFSVCAvIDEwMDogVl9BVURJTworICovCisjZGVmaW5lIFNXX1ZBVURJTwkJKCg0IDw8IDUpIHwgKDQgPDwgMikpCisjZGVmaW5lIFNXX1VBUlQJCQkoKDMgPDwgNSkgfCAoMyA8PCAyKSkKKyNkZWZpbmUgU1dfQVVESU8JCSgoMiA8PCA1KSB8ICgyIDw8IDIpKQorI2RlZmluZSBTV19ESE9TVAkJKCgxIDw8IDUpIHwgKDEgPDwgMikpCisjZGVmaW5lIFNXX0FVVE8JCQkoKDAgPDwgNSkgfCAoMCA8PCAyKSkKKworLyogSW50ZXJydXB0IDEgKi8KKyNkZWZpbmUgSU5UX0RFVEFDSAkJKDEgPDwgMSkKKyNkZWZpbmUgSU5UX0FUVEFDSAkJKDEgPDwgMCkKKworc3RydWN0IGZzYTk0ODBfdXNic3cgeworCXN0cnVjdCBpMmNfY2xpZW50CQkqY2xpZW50OworCXN0cnVjdCBmc2E5NDgwX3BsYXRmb3JtX2RhdGEJKnBkYXRhOworCWludAkJCQlkZXYxOworCWludAkJCQlkZXYyOworCWludAkJCQltYW5zdzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZnNhOTQ4MF91c2JzdyAqY2hpcDsKKworc3RhdGljIGludCBmc2E5NDgwX3dyaXRlX3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQlpbnQgcmVnLCBpbnQgdmFsdWUpCit7CisJaW50IHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKKworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBlcnIgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmc2E5NDgwX3JlYWRfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCByZWcpCit7CisJaW50IHJldDsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CisKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogZXJyICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnNhOTQ4MF9yZWFkX2lycShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgKnZhbHVlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjbGllbnQsCisJCQlGU0E5NDgwX1JFR19JTlQxLCAyLCAodTggKil2YWx1ZSk7CisJKnZhbHVlICY9IDB4ZmZmZjsKKworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBlcnIgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZnNhOTQ4MF9zZXRfc3dpdGNoKGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZnNhOTQ4MF91c2JzdyAqdXNic3cgPSBjaGlwOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB1c2Jzdy0+Y2xpZW50OworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgcGF0aCA9IDA7CisKKwl2YWx1ZSA9IGZzYTk0ODBfcmVhZF9yZWcoY2xpZW50LCBGU0E5NDgwX1JFR19DVFJMKTsKKworCWlmICghc3RybmNtcChidWYsICJWQVVESU8iLCA2KSkgeworCQlwYXRoID0gU1dfVkFVRElPOworCQl2YWx1ZSAmPSB+Q09OX01BTlVBTF9TVzsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGJ1ZiwgIlVBUlQiLCA0KSkgeworCQlwYXRoID0gU1dfVUFSVDsKKwkJdmFsdWUgJj0gfkNPTl9NQU5VQUxfU1c7CisJfSBlbHNlIGlmICghc3RybmNtcChidWYsICJBVURJTyIsIDUpKSB7CisJCXBhdGggPSBTV19BVURJTzsKKwkJdmFsdWUgJj0gfkNPTl9NQU5VQUxfU1c7CisJfSBlbHNlIGlmICghc3RybmNtcChidWYsICJESE9TVCIsIDUpKSB7CisJCXBhdGggPSBTV19ESE9TVDsKKwkJdmFsdWUgJj0gfkNPTl9NQU5VQUxfU1c7CisJfSBlbHNlIGlmICghc3RybmNtcChidWYsICJBVVRPIiwgNCkpIHsKKwkJcGF0aCA9IFNXX0FVVE87CisJCXZhbHVlIHw9IENPTl9NQU5VQUxfU1c7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJXcm9uZyBjb21tYW5kXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXVzYnN3LT5tYW5zdyA9IHBhdGg7CisJZnNhOTQ4MF93cml0ZV9yZWcoY2xpZW50LCBGU0E5NDgwX1JFR19NQU5TVzEsIHBhdGgpOworCWZzYTk0ODBfd3JpdGVfcmVnKGNsaWVudCwgRlNBOTQ4MF9SRUdfQ1RSTCwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBmc2E5NDgwX2dldF9zd2l0Y2goY2hhciAqYnVmKQoreworCXN0cnVjdCBmc2E5NDgwX3VzYnN3ICp1c2JzdyA9IGNoaXA7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHVzYnN3LT5jbGllbnQ7CisJdW5zaWduZWQgaW50IHZhbHVlOworCisJdmFsdWUgPSBmc2E5NDgwX3JlYWRfcmVnKGNsaWVudCwgRlNBOTQ4MF9SRUdfTUFOU1cxKTsKKworCWlmICh2YWx1ZSA9PSBTV19WQVVESU8pCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlZBVURJT1xuIik7CisJZWxzZSBpZiAodmFsdWUgPT0gU1dfVUFSVCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiVUFSVFxuIik7CisJZWxzZSBpZiAodmFsdWUgPT0gU1dfQVVESU8pCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkFVRElPXG4iKTsKKwllbHNlIGlmICh2YWx1ZSA9PSBTV19ESE9TVCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiREhPU1RcbiIpOworCWVsc2UgaWYgKHZhbHVlID09IFNXX0FVVE8pCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkFVVE9cbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXgiLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZzYTk0ODBfc2hvd19kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZnNhOTQ4MF91c2JzdyAqdXNic3cgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdXNic3ctPmNsaWVudDsKKwlpbnQgZGV2MSwgZGV2MjsKKworCWRldjEgPSBmc2E5NDgwX3JlYWRfcmVnKGNsaWVudCwgRlNBOTQ4MF9SRUdfREVWX1QxKTsKKwlkZXYyID0gZnNhOTQ4MF9yZWFkX3JlZyhjbGllbnQsIEZTQTk0ODBfUkVHX0RFVl9UMik7CisKKwlpZiAoIWRldjEgJiYgIWRldjIpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIk5PTkVcbiIpOworCisJLyogVVNCICovCisJaWYgKGRldjEgJiBERVZfVDFfVVNCX01BU0sgfHwgZGV2MiAmIERFVl9UMl9VU0JfTUFTSykKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiVVNCXG4iKTsKKworCS8qIFVBUlQgKi8KKwlpZiAoZGV2MSAmIERFVl9UMV9VQVJUX01BU0sgfHwgZGV2MiAmIERFVl9UMl9VQVJUX01BU0spCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlVBUlRcbiIpOworCisJLyogQ0hBUkdFUiAqLworCWlmIChkZXYxICYgREVWX1QxX0NIQVJHRVJfTUFTSykKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiQ0hBUkdFUlxuIik7CisKKwkvKiBKSUcgKi8KKwlpZiAoZGV2MiAmIERFVl9UMl9KSUdfTUFTSykKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiSklHXG4iKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlVOS05PV05cbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBmc2E5NDgwX3Nob3dfbWFudWFsc3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBmc2E5NDgwX2dldF9zd2l0Y2goYnVmKTsKKworfQorCitzdGF0aWMgc3NpemVfdCBmc2E5NDgwX3NldF9tYW51YWxzdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlmc2E5NDgwX3NldF9zd2l0Y2goYnVmKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGRldmljZSwgU19JUlVHTywgZnNhOTQ4MF9zaG93X2RldmljZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc3dpdGNoLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJZnNhOTQ4MF9zaG93X21hbnVhbHN3LCBmc2E5NDgwX3NldF9tYW51YWxzdyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmc2E5NDgwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmZGV2X2F0dHJfZGV2aWNlLmF0dHIsCisJJmRldl9hdHRyX3N3aXRjaC5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGZzYTk0ODBfZ3JvdXAgPSB7CisJLmF0dHJzID0gZnNhOTQ4MF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHZvaWQgZnNhOTQ4MF9kZXRlY3RfZGV2KHN0cnVjdCBmc2E5NDgwX3VzYnN3ICp1c2JzdywgaW50IGludHIpCit7CisJaW50IHZhbDEsIHZhbDIsIGN0cmw7CisJc3RydWN0IGZzYTk0ODBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSB1c2Jzdy0+cGRhdGE7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHVzYnN3LT5jbGllbnQ7CisKKwl2YWwxID0gZnNhOTQ4MF9yZWFkX3JlZyhjbGllbnQsIEZTQTk0ODBfUkVHX0RFVl9UMSk7CisJdmFsMiA9IGZzYTk0ODBfcmVhZF9yZWcoY2xpZW50LCBGU0E5NDgwX1JFR19ERVZfVDIpOworCWN0cmwgPSBmc2E5NDgwX3JlYWRfcmVnKGNsaWVudCwgRlNBOTQ4MF9SRUdfQ1RSTCk7CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJpbnRyOiAweCV4LCBkZXYxOiAweCV4LCBkZXYyOiAweCV4XG4iLAorCQkJaW50ciwgdmFsMSwgdmFsMik7CisKKwlpZiAoIWludHIpCisJCWdvdG8gb3V0OworCisJaWYgKGludHIgJiBJTlRfQVRUQUNIKSB7CS8qIEF0dGFjaGVkICovCisJCS8qIFVTQiAqLworCQlpZiAodmFsMSAmIERFVl9UMV9VU0JfTUFTSyB8fCB2YWwyICYgREVWX1QyX1VTQl9NQVNLKSB7CisJCQlpZiAocGRhdGEtPnVzYl9jYikKKwkJCQlwZGF0YS0+dXNiX2NiKEZTQTk0ODBfQVRUQUNIRUQpOworCisJCQlpZiAodXNic3ctPm1hbnN3KSB7CisJCQkJZnNhOTQ4MF93cml0ZV9yZWcoY2xpZW50LAorCQkJCQlGU0E5NDgwX1JFR19NQU5TVzEsIHVzYnN3LT5tYW5zdyk7CisJCQl9CisJCX0KKworCQkvKiBVQVJUICovCisJCWlmICh2YWwxICYgREVWX1QxX1VBUlRfTUFTSyB8fCB2YWwyICYgREVWX1QyX1VBUlRfTUFTSykgeworCQkJaWYgKHBkYXRhLT51YXJ0X2NiKQorCQkJCXBkYXRhLT51YXJ0X2NiKEZTQTk0ODBfQVRUQUNIRUQpOworCisJCQlpZiAoIShjdHJsICYgQ09OX01BTlVBTF9TVykpIHsKKwkJCQlmc2E5NDgwX3dyaXRlX3JlZyhjbGllbnQsCisJCQkJCUZTQTk0ODBfUkVHX01BTlNXMSwgU1dfVUFSVCk7CisJCQl9CisJCX0KKworCQkvKiBDSEFSR0VSICovCisJCWlmICh2YWwxICYgREVWX1QxX0NIQVJHRVJfTUFTSykgeworCQkJaWYgKHBkYXRhLT5jaGFyZ2VyX2NiKQorCQkJCXBkYXRhLT5jaGFyZ2VyX2NiKEZTQTk0ODBfQVRUQUNIRUQpOworCQl9CisKKwkJLyogSklHICovCisJCWlmICh2YWwyICYgREVWX1QyX0pJR19NQVNLKSB7CisJCQlpZiAocGRhdGEtPmppZ19jYikKKwkJCQlwZGF0YS0+amlnX2NiKEZTQTk0ODBfQVRUQUNIRUQpOworCQl9CisJfSBlbHNlIGlmIChpbnRyICYgSU5UX0RFVEFDSCkgewkvKiBEZXRhY2hlZCAqLworCQkvKiBVU0IgKi8KKwkJaWYgKHVzYnN3LT5kZXYxICYgREVWX1QxX1VTQl9NQVNLIHx8CisJCQl1c2Jzdy0+ZGV2MiAmIERFVl9UMl9VU0JfTUFTSykgeworCQkJaWYgKHBkYXRhLT51c2JfY2IpCisJCQkJcGRhdGEtPnVzYl9jYihGU0E5NDgwX0RFVEFDSEVEKTsKKwkJfQorCisJCS8qIFVBUlQgKi8KKwkJaWYgKHVzYnN3LT5kZXYxICYgREVWX1QxX1VBUlRfTUFTSyB8fAorCQkJdXNic3ctPmRldjIgJiBERVZfVDJfVUFSVF9NQVNLKSB7CisJCQlpZiAocGRhdGEtPnVhcnRfY2IpCisJCQkJcGRhdGEtPnVhcnRfY2IoRlNBOTQ4MF9ERVRBQ0hFRCk7CisJCX0KKworCQkvKiBDSEFSR0VSICovCisJCWlmICh1c2Jzdy0+ZGV2MSAmIERFVl9UMV9DSEFSR0VSX01BU0spIHsKKwkJCWlmIChwZGF0YS0+Y2hhcmdlcl9jYikKKwkJCQlwZGF0YS0+Y2hhcmdlcl9jYihGU0E5NDgwX0RFVEFDSEVEKTsKKwkJfQorCisJCS8qIEpJRyAqLworCQlpZiAodXNic3ctPmRldjIgJiBERVZfVDJfSklHX01BU0spIHsKKwkJCWlmIChwZGF0YS0+amlnX2NiKQorCQkJCXBkYXRhLT5qaWdfY2IoRlNBOTQ4MF9ERVRBQ0hFRCk7CisJCX0KKwl9CisKKwl1c2Jzdy0+ZGV2MSA9IHZhbDE7CisJdXNic3ctPmRldjIgPSB2YWwyOworCitvdXQ6CisJY3RybCAmPSB+Q09OX0lOVF9NQVNLOworCWZzYTk0ODBfd3JpdGVfcmVnKGNsaWVudCwgRlNBOTQ4MF9SRUdfQ1RSTCwgY3RybCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBmc2E5NDgwX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZzYTk0ODBfdXNic3cgKnVzYnN3ID0gZGF0YTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdXNic3ctPmNsaWVudDsKKwlpbnQgaW50cjsKKworCS8qIGNsZWFyIGludGVycnVwdCAqLworCWZzYTk0ODBfcmVhZF9pcnEoY2xpZW50LCAmaW50cik7CisKKwkvKiBkZXZpY2UgZGV0ZWN0aW9uICovCisJZnNhOTQ4MF9kZXRlY3RfZGV2KHVzYnN3LCBpbnRyKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBmc2E5NDgwX2lycV9pbml0KHN0cnVjdCBmc2E5NDgwX3VzYnN3ICp1c2JzdykKK3sKKwlzdHJ1Y3QgZnNhOTQ4MF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHVzYnN3LT5wZGF0YTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdXNic3ctPmNsaWVudDsKKwlpbnQgcmV0OworCWludCBpbnRyOworCXVuc2lnbmVkIGludCBjdHJsID0gQ09OX01BU0s7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwlmc2E5NDgwX3JlYWRfaXJxKGNsaWVudCwgJmludHIpOworCisJLyogdW5tYXNrIGludGVycnVwdCAoYXR0YWNoL2RldGFjaCBvbmx5KSAqLworCWZzYTk0ODBfd3JpdGVfcmVnKGNsaWVudCwgRlNBOTQ4MF9SRUdfSU5UMV9NQVNLLCAweGZjKTsKKwlmc2E5NDgwX3dyaXRlX3JlZyhjbGllbnQsIEZTQTk0ODBfUkVHX0lOVDJfTUFTSywgMHgxZik7CisKKwl1c2Jzdy0+bWFuc3cgPSBmc2E5NDgwX3JlYWRfcmVnKGNsaWVudCwgRlNBOTQ4MF9SRUdfTUFOU1cxKTsKKworCWlmICh1c2Jzdy0+bWFuc3cpCisJCWN0cmwgJj0gfkNPTl9NQU5VQUxfU1c7CS8qIE1hbnVhbCBTd2l0Y2hpbmcgTW9kZSAqLworCisJZnNhOTQ4MF93cml0ZV9yZWcoY2xpZW50LCBGU0E5NDgwX1JFR19DVFJMLCBjdHJsKTsKKworCWlmIChwZGF0YSAmJiBwZGF0YS0+Y2ZnX2dwaW8pCisJCXBkYXRhLT5jZmdfZ3BpbygpOworCisJaWYgKGNsaWVudC0+aXJxKSB7CisJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGNsaWVudC0+aXJxLCBOVUxMLAorCQkJCWZzYTk0ODBfaXJxX2hhbmRsZXIsCisJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX09ORVNIT1QsCisJCQkJImZzYTk0ODAgbWljcm8gVVNCIiwgdXNic3cpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZXFldXN0IElSUVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJZGV2aWNlX2luaXRfd2FrZXVwKCZjbGllbnQtPmRldiwgcGRhdGEtPndha2V1cCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZzYTk0ODBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgZnNhOTQ4MF91c2JzdyAqdXNic3c7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCXJldHVybiAtRUlPOworCisJdXNic3cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZnNhOTQ4MF91c2JzdyksIEdGUF9LRVJORUwpOworCWlmICghdXNic3cpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZHJpdmVyIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl1c2Jzdy0+Y2xpZW50ID0gY2xpZW50OworCXVzYnN3LT5wZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwljaGlwID0gdXNic3c7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB1c2Jzdyk7CisKKwlyZXQgPSBmc2E5NDgwX2lycV9pbml0KHVzYnN3KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWwxOworCisJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZnNhOTQ4MF9ncm91cCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGNyZWF0ZSBmc2E5NDgwIGF0dHJpYnV0ZSBncm91cFxuIik7CisJCWdvdG8gZmFpbDI7CisJfQorCisJLyogQURDIERldGVjdCBUaW1lOiA1MDBtcyAqLworCWZzYTk0ODBfd3JpdGVfcmVnKGNsaWVudCwgRlNBOTQ4MF9SRUdfVElNSU5HMSwgMHg2KTsKKworCWlmIChjaGlwLT5wZGF0YS0+cmVzZXRfY2IpCisJCWNoaXAtPnBkYXRhLT5yZXNldF9jYigpOworCisJLyogZGV2aWNlIGRldGVjdGlvbiAqLworCWZzYTk0ODBfZGV0ZWN0X2Rldih1c2JzdywgSU5UX0FUVEFDSCk7CisKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoJmNsaWVudC0+ZGV2KTsKKworCXJldHVybiAwOworCitmYWlsMjoKKwlpZiAoY2xpZW50LT5pcnEpCisJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBOVUxMKTsKK2ZhaWwxOgorCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCWtmcmVlKHVzYnN3KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBmc2E5NDgwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBmc2E5NDgwX3VzYnN3ICp1c2JzdyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWlmIChjbGllbnQtPmlycSkKKwkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIE5VTEwpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZnNhOTQ4MF9ncm91cCk7CisJZGV2aWNlX2luaXRfd2FrZXVwKCZjbGllbnQtPmRldiwgMCk7CisJa2ZyZWUodXNic3cpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgZnNhOTQ4MF9zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZnNhOTQ4MF91c2JzdyAqdXNic3cgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgZnNhOTQ4MF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHVzYnN3LT5wZGF0YTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmY2xpZW50LT5kZXYpICYmIGNsaWVudC0+aXJxKQorCQllbmFibGVfaXJxX3dha2UoY2xpZW50LT5pcnEpOworCisJaWYgKHBkYXRhLT51c2JfcG93ZXIpCisJCXBkYXRhLT51c2JfcG93ZXIoMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2E5NDgwX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBmc2E5NDgwX3VzYnN3ICp1c2JzdyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBkZXYxLCBkZXYyOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZjbGllbnQtPmRldikgJiYgY2xpZW50LT5pcnEpCisJCWRpc2FibGVfaXJxX3dha2UoY2xpZW50LT5pcnEpOworCisJLyoKKwkgKiBDbGVhciBQZW5kaW5nIGludGVycnVwdC4gTm90ZSB0aGF0IGRldGVjdF9kZXYgZG9lcyB3aGF0CisJICogdGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMuIFNvLCB3ZSBkb24ndCBtaXNzIHBlbmRpbmcgYW5kCisJICogd2UgcmVlbmFibGUgaW50ZXJydXB0IGlmIHRoZXJlIGlzIG9uZS4KKwkgKi8KKwlmc2E5NDgwX3JlYWRfcmVnKGNsaWVudCwgRlNBOTQ4MF9SRUdfSU5UMSk7CisJZnNhOTQ4MF9yZWFkX3JlZyhjbGllbnQsIEZTQTk0ODBfUkVHX0lOVDIpOworCisJZGV2MSA9IGZzYTk0ODBfcmVhZF9yZWcoY2xpZW50LCBGU0E5NDgwX1JFR19ERVZfVDEpOworCWRldjIgPSBmc2E5NDgwX3JlYWRfcmVnKGNsaWVudCwgRlNBOTQ4MF9SRUdfREVWX1QyKTsKKworCS8qIGRldmljZSBkZXRlY3Rpb24gKi8KKwlmc2E5NDgwX2RldGVjdF9kZXYodXNic3csIChkZXYxIHx8IGRldjIpID8gSU5UX0FUVEFDSCA6IElOVF9ERVRBQ0gpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgZnNhOTQ4MF9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgZnNhOTQ4MF9yZXN1bWUgTlVMTAorCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBmc2E5NDgwX2lkW10gPSB7CisJeyJmc2E5NDgwIiwgMH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgZnNhOTQ4MF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBmc2E5NDgwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiZnNhOTQ4MCIsCisJfSwKKwkucHJvYmUgPSBmc2E5NDgwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChmc2E5NDgwX3JlbW92ZSksCisJLnJlc3VtZSA9IGZzYTk0ODBfcmVzdW1lLAorCS5zdXNwZW5kID0gZnNhOTQ4MF9zdXNwZW5kLAorCS5pZF90YWJsZSA9IGZzYTk0ODBfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBmc2E5NDgwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmZzYTk0ODBfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChmc2E5NDgwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZnNhOTQ4MF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmZzYTk0ODBfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChmc2E5NDgwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaW5reXUgS2FuZyA8bWs3LmthbmdAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZTQTk0ODAgVVNCIFN3aXRjaCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pb2M0LmMgYi9kcml2ZXJzL21pc2MvaW9jNC5jCmluZGV4IDY2OGQ0MWUuLmRmMDNkZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pb2M0LmMKKysrIGIvZHJpdmVycy9taXNjL2lvYzQuYwpAQCAtMjcwLDcgKzI3MCw3IEBACiAJcmV0dXJuIElPQzRfVkFSSUFOVF9QQ0lfUlQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdAorc3RhdGljIHZvaWQKIGlvYzRfbG9hZF9tb2R1bGVzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlyZXF1ZXN0X21vZHVsZSgic2dpaW9jNCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xrZHRtLmMgYi9kcml2ZXJzL21pc2MvbGtkdG0uYwppbmRleCA4MWQ3ZmE0Li4xNTBjZDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGtkdG0uYworKysgYi9kcml2ZXJzL21pc2MvbGtkdG0uYwpAQCAtMTIwLDYgKzEyMCw3IEBACiBzdGF0aWMgZW51bSBjbmFtZSBjcG9pbnQgPSBDTl9JTlZBTElEOwogc3RhdGljIGVudW0gY3R5cGUgY3B0eXBlID0gQ1RfTk9ORTsKIHN0YXRpYyBpbnQgY291bnQgPSBERUZBVUxUX0NPVU5UOworc3RhdGljIERFRklORV9TUElOTE9DSyhjb3VudF9sb2NrKTsKIAogbW9kdWxlX3BhcmFtKHJlY3VyX2NvdW50LCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhyZWN1cl9jb3VudCwgIiBSZWN1cnNpb24gbGV2ZWwgZm9yIHRoZSBzdGFjayBvdmVyZmxvdyB0ZXN0LCAiXApAQCAtMjMwLDExICsyMzEsMTQgQEAKIHN0YXRpYyBpbnQgbGtkdG1fcGFyc2VfY29tbWFuZGxpbmUodm9pZCkKIHsKIAlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGNwb2ludF9jb3VudCA8IDEgfHwgcmVjdXJfY291bnQgPCAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZjb3VudF9sb2NrLCBmbGFncyk7CiAJY291bnQgPSBjcG9pbnRfY291bnQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRfbG9jaywgZmxhZ3MpOwogCiAJLyogTm8gc3BlY2lhbCBwYXJhbWV0ZXJzICovCiAJaWYgKCFjcG9pbnRfdHlwZSAmJiAhY3BvaW50X25hbWUpCkBAIC0zNDksNiArMzUzLDkgQEAKIAogc3RhdGljIHZvaWQgbGtkdG1faGFuZGxlcih2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY291bnRfbG9jaywgZmxhZ3MpOwogCWNvdW50LS07CiAJcHJpbnRrKEtFUk5fSU5GTyAibGtkdG06IENyYXNoIHBvaW50ICVzIG9mIHR5cGUgJXMgaGl0LCB0cmlnZ2VyIGluICVkIHJvdW5kc1xuIiwKIAkJCWNwX25hbWVfdG9fc3RyKGNwb2ludCksIGNwX3R5cGVfdG9fc3RyKGNwdHlwZSksIGNvdW50KTsKQEAgLTM1Nyw2ICszNjQsNyBAQAogCQlsa2R0bV9kb19hY3Rpb24oY3B0eXBlKTsKIAkJY291bnQgPSBjcG9pbnRfY291bnQ7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvdW50X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBsa2R0bV9yZWdpc3Rlcl9jcG9pbnQoZW51bSBjbmFtZSB3aGljaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9wY2hfcGh1Yi5jIGIvZHJpdmVycy9taXNjL3BjaF9waHViLmMKaW5kZXggZDA2Y2YyZi4uMGZkN2U3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3BjaF9waHViLmMKKysrIGIvZHJpdmVycy9taXNjL3BjaF9waHViLmMKQEAgLTY4Niw2ICs2ODYsOCBAQAogCX0KIAogCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gMSkgeyAvKiBFRzIwVCBQQ0ggKi8KKwkJY29uc3QgY2hhciAqYm9hcmRfbmFtZTsKKwogCQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LmtvYmosCiAJCQkJCSAgICZkZXZfYXR0cl9wY2hfbWFjLmF0dHIpOwogCQlpZiAocmV0dmFsKQpAQCAtNzAxLDcgKzcwMyw4IEBACiAJCQkJCSAgICAgICBDTEtDRkdfQ0FOQ0xLX01BU0spOwogCiAJCS8qIHF1aXJrIGZvciBDTS1pVEMgYm9hcmQgKi8KLQkJaWYgKHN0cnN0cihkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CT0FSRF9OQU1FKSwgIkNNLWlUQyIpKQorCQlib2FyZF9uYW1lID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQk9BUkRfTkFNRSk7CisJCWlmIChib2FyZF9uYW1lICYmIHN0cnN0cihib2FyZF9uYW1lLCAiQ00taVRDIikpCiAJCQlwY2hfcGh1Yl9yZWFkX21vZGlmeV93cml0ZV9yZWcoY2hpcCwKIAkJCQkJCSh1bnNpZ25lZCBpbnQpQ0xLQ0ZHX1JFR19PRkZTRVQsCiAJCQkJCQlDTEtDRkdfVUFSVF80OE1IWiB8IENMS0NGR19CQVVERElWIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9wdGkuYyBiL2RyaXZlcnMvbWlzYy9wdGkuYwppbmRleCA5NmEyNWUzLi44NjUzYmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvcHRpLmMKKysrIGIvZHJpdmVycy9taXNjL3B0aS5jCkBAIC0zMzgsNyArMzM4LDggQEAKICAqCQkJCWEgbWFzdGVyLCBjaGFubmVsIElEIGFkZHJlc3MKICAqCQkJCXVzZWQgdG8gd3JpdGUgdG8gUFRJIEhXLgogICoKLSAqIEBtYzogbWFzdGVyLCBjaGFubmVsIGFwZXR1cmUgSUQgYWRkcmVzcyB0byBiZSByZWxlYXNlZC4KKyAqIEBtYzogbWFzdGVyLCBjaGFubmVsIGFwZXR1cmUgSUQgYWRkcmVzcyB0byBiZSByZWxlYXNlZC4gIFRoaXMKKyAqICAgICAgd2lsbCBkZS1hbGxvY2F0ZSB0aGUgc3RydWN0dXJlIHZpYSBrZnJlZSgpLgogICovCiB2b2lkIHB0aV9yZWxlYXNlX21hc3RlcmNoYW5uZWwoc3RydWN0IHB0aV9tYXN0ZXJjaGFubmVsICptYykKIHsKQEAgLTQ2NSw5ICs0NjYsOSBAQAogfQogCiAvKioKLSAqIHB0aV90dHlfaW50c3RhbGwoKS0gVXNlZCB0byBzZXQgdXAgc3BlY2lmaWMgbWFzdGVyLWNoYW5uZWxzCi0gKgkJICAgICAgIHRvIHR0eSBwb3J0cyBmb3Igb3JnYW5pemF0aW9uYWwgcHVycG9zZXMgd2hlbgotICoJCSAgICAgICB0cmFjaW5nIHZpZXdlZCBmcm9tIGRlYnVnaW5nIHRvb2xzLgorICogcHRpX3R0eV9pbnN0YWxsKCktIFVzZWQgdG8gc2V0IHVwIHNwZWNpZmljIG1hc3Rlci1jaGFubmVscworICoJCSAgICAgIHRvIHR0eSBwb3J0cyBmb3Igb3JnYW5pemF0aW9uYWwgcHVycG9zZXMgd2hlbgorICoJCSAgICAgIHRyYWNpbmcgdmlld2VkIGZyb20gZGVidWdpbmcgdG9vbHMuCiAgKgogICogQGRyaXZlcjogdHR5IGRyaXZlciBpbmZvcm1hdGlvbi4KICAqIEB0dHk6IHR0eSBzdHJ1Y3QgY29udGFpbmluZyBwdGkgaW5mb3JtYXRpb24uCkBAIC00OTYsOCArNDk3LDEwIEBACiAJCWVsc2UKIAkJCXB0aV90dHlfZGF0YS0+bWMgPSBwdGlfcmVxdWVzdF9tYXN0ZXJjaGFubmVsKDIsIE5VTEwpOwogCi0JCWlmIChwdGlfdHR5X2RhdGEtPm1jID09IE5VTEwpCisJCWlmIChwdGlfdHR5X2RhdGEtPm1jID09IE5VTEwpIHsKKwkJCWtmcmVlKHB0aV90dHlfZGF0YSk7CiAJCQlyZXR1cm4gLUVOWElPOworCQl9CiAJCXR0eS0+ZHJpdmVyX2RhdGEgPSBwdGlfdHR5X2RhdGE7CiAJfQogCkBAIC01MTYsNyArNTE5LDcgQEAKIAlpZiAocHRpX3R0eV9kYXRhID09IE5VTEwpCiAJCXJldHVybjsKIAlwdGlfcmVsZWFzZV9tYXN0ZXJjaGFubmVsKHB0aV90dHlfZGF0YS0+bWMpOwotCWtmcmVlKHR0eS0+ZHJpdmVyX2RhdGEpOworCWtmcmVlKHB0aV90dHlfZGF0YSk7CiAJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CiB9CiAKQEAgLTYwMiw3ICs2MDUsNyBAQAogc3RhdGljIGludCBwdGlfY2hhcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXB0aV9yZWxlYXNlX21hc3RlcmNoYW5uZWwoZmlscC0+cHJpdmF0ZV9kYXRhKTsKLQlrZnJlZShmaWxwLT5wcml2YXRlX2RhdGEpOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYwppbmRleCBlZTUxMDlhLi40MmYwNjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMKKysrIGIvZHJpdmVycy9taXNjL3NnaS14cC94cG5ldC5jCkBAIC00OTUsMTQgKzQ5NSwxNCBAQAogCQl9CiAJfQogCisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwogCWlmIChhdG9taWNfZGVjX3JldHVybigmcXVldWVkX21zZy0+dXNlX2NvdW50KSA9PSAwKSB7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJa2ZyZWUocXVldWVkX21zZyk7CiAJfQogCi0JZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKLQogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zcGVhcjEzeHhfcGNpZV9nYWRnZXQuYyBiL2RyaXZlcnMvbWlzYy9zcGVhcjEzeHhfcGNpZV9nYWRnZXQuYwppbmRleCA3YWRlZDkwLi5jZmJkZGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc3BlYXIxM3h4X3BjaWVfZ2FkZ2V0LmMKKysrIGIvZHJpdmVycy9taXNjL3NwZWFyMTN4eF9wY2llX2dhZGdldC5jCkBAIC04NDUsNyArODQ1LDcgQEAKIGVycl9pb3VubWFwX2FwcDoKIAlpb3VubWFwKGNvbmZpZy0+dmFfYXBwX2Jhc2UpOwogZXJyX2t6YWxsb2M6Ci0Ja2ZyZWUoY29uZmlnKTsKKwlrZnJlZSh0YXJnZXQpOwogZXJyX3JlbF9yZXM6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHJlczEtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlczEpKTsKIGVycl9yZWxfcmVzMDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9jb3JlLmMgYi9kcml2ZXJzL21pc2MvdGktc3Qvc3RfY29yZS5jCmluZGV4IGY5MWY4MmUuLjU0YzkxZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9jb3JlLmMKKysrIGIvZHJpdmVycy9taXNjL3RpLXN0L3N0X2NvcmUuYwpAQCAtNjA1LDcgKzYwNSw3IEBACiAJcHJfZGVidWcoIiVzOiAlZCAiLCBfX2Z1bmNfXywgcHJvdG8tPmNobmxfaWQpOwogCiAJc3Rfa2ltX3JlZigmc3RfZ2RhdGEsIDApOwotCWlmIChwcm90by0+Y2hubF9pZCA+PSBTVF9NQVhfQ0hBTk5FTFMpIHsKKwlpZiAoIXN0X2dkYXRhIHx8IHByb3RvLT5jaG5sX2lkID49IFNUX01BWF9DSEFOTkVMUykgewogCQlwcl9lcnIoIiBjaG5sX2lkICVkIG5vdCBzdXBwb3J0ZWQiLCBwcm90by0+Y2hubF9pZCk7CiAJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9raW0uYyBiL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9raW0uYwppbmRleCA1ZGE5M2VlLi4zOGZkMmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGktc3Qvc3Rfa2ltLmMKKysrIGIvZHJpdmVycy9taXNjL3RpLXN0L3N0X2tpbS5jCkBAIC0yNDUsOSArMjQ1LDkgQEAKIAkJcHJfZXJyKCJpbnZhbGlkIGFjdGlvbiBhZnRlciBjaGFuZ2UgcmVtb3RlIGJhdWQgY29tbWFuZCIpOwogCX0gZWxzZSB7CiAJCSpwdHIgPSAqcHRyICsgc2l6ZW9mKHN0cnVjdCBidHNfYWN0aW9uKSArCi0JCQkoKHN0cnVjdCBidHNfYWN0aW9uICopbnh0X2FjdGlvbiktPnNpemU7CisJCQkoKHN0cnVjdCBidHNfYWN0aW9uICopY3VyX2FjdGlvbiktPnNpemU7CiAJCSpsZW4gPSAqbGVuIC0gKHNpemVvZihzdHJ1Y3QgYnRzX2FjdGlvbikgKwotCQkJCSgoc3RydWN0IGJ0c19hY3Rpb24gKilueHRfYWN0aW9uKS0+c2l6ZSk7CisJCQkJKChzdHJ1Y3QgYnRzX2FjdGlvbiAqKWN1cl9hY3Rpb24pLT5zaXplKTsKIAkJLyogd2FybiB1c2VyIG9uIG5vdCBjb21tZW50aW5nIHRoZXNlIGluIGZpcm13YXJlICovCiAJCXByX3dhcm4oInNraXBwaW5nIHRoZSB3YWl0IGV2ZW50IG9mIGNoYW5nZSByZW1vdGUgYmF1ZCIpOwogCX0KQEAgLTYwNCw2ICs2MDQsMTAgQEAKIAlzdHJ1Y3Qga2ltX2RhdGFfcwkqa2ltX2dkYXRhOwogCS8qIGdldCBraW1fZ2RhdGEgcmVmZXJlbmNlIGZyb20gcGxhdGZvcm0gZGV2aWNlICovCiAJcGRldiA9IHN0X2dldF9wbGF0X2RldmljZShpZCk7CisJaWYgKCFwZGV2KSB7CisJCSpjb3JlX2RhdGEgPSBOVUxMOworCQlyZXR1cm47CisJfQogCWtpbV9nZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKIAkqY29yZV9kYXRhID0ga2ltX2dkYXRhLT5jb3JlX2RhdGE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMgYi9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKaW5kZXggNzFkYTU2NC4uMWZmNTQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYwpAQCAtMTA2LDYgKzEwNiwxNiBAQAogCiBzdGF0aWMgREVGSU5FX01VVEVYKG9wZW5fbG9jayk7CiAKK2VudW0gbW1jX2Jsa19zdGF0dXMgeworCU1NQ19CTEtfU1VDQ0VTUyA9IDAsCisJTU1DX0JMS19QQVJUSUFMLAorCU1NQ19CTEtfUkVUUlksCisJTU1DX0JMS19SRVRSWV9TSU5HTEUsCisJTU1DX0JMS19EQVRBX0VSUiwKKwlNTUNfQkxLX0NNRF9FUlIsCisJTU1DX0JMS19BQk9SVCwKK307CisKIG1vZHVsZV9wYXJhbShwZXJkZXZfbWlub3JzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwZXJkZXZfbWlub3JzLCAiTWlub3JzIG51bWJlcnMgdG8gYWxsb2NhdGUgcGVyIGRldmljZSIpOwogCkBAIC00MjcsMTQgKzQzNyw2IEBACiAjZW5kaWYKIH07CiAKLXN0cnVjdCBtbWNfYmxrX3JlcXVlc3QgewotCXN0cnVjdCBtbWNfcmVxdWVzdAltcnE7Ci0Jc3RydWN0IG1tY19jb21tYW5kCXNiYzsKLQlzdHJ1Y3QgbW1jX2NvbW1hbmQJY21kOwotCXN0cnVjdCBtbWNfY29tbWFuZAlzdG9wOwotCXN0cnVjdCBtbWNfZGF0YQkJZGF0YTsKLX07Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG1tY19ibGtfcGFydF9zd2l0Y2goc3RydWN0IG1tY19jYXJkICpjYXJkLAogCQkJCSAgICAgIHN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kKQogewpAQCAtNTI1LDcgKzUyNywyMCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB1MzIgZ2V0X2NhcmRfc3RhdHVzKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgc3RydWN0IHJlcXVlc3QgKnJlcSkKK3N0YXRpYyBpbnQgc2VuZF9zdG9wKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdTMyICpzdGF0dXMpCit7CisJc3RydWN0IG1tY19jb21tYW5kIGNtZCA9IHswfTsKKwlpbnQgZXJyOworCisJY21kLm9wY29kZSA9IE1NQ19TVE9QX1RSQU5TTUlTU0lPTjsKKwljbWQuZmxhZ3MgPSBNTUNfUlNQX1NQSV9SMUIgfCBNTUNfUlNQX1IxQiB8IE1NQ19DTURfQUM7CisJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChjYXJkLT5ob3N0LCAmY21kLCA1KTsKKwlpZiAoZXJyID09IDApCisJCSpzdGF0dXMgPSBjbWQucmVzcFswXTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGdldF9jYXJkX3N0YXR1cyhzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHUzMiAqc3RhdHVzLCBpbnQgcmV0cmllcykKIHsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCWludCBlcnI7CkBAIC01MzQsMTEgKzU0OSwxNDEgQEAKIAlpZiAoIW1tY19ob3N0X2lzX3NwaShjYXJkLT5ob3N0KSkKIAkJY21kLmFyZyA9IGNhcmQtPnJjYSA8PCAxNjsKIAljbWQuZmxhZ3MgPSBNTUNfUlNQX1NQSV9SMiB8IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FDOwotCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoY2FyZC0+aG9zdCwgJmNtZCwgMCk7CisJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChjYXJkLT5ob3N0LCAmY21kLCByZXRyaWVzKTsKKwlpZiAoZXJyID09IDApCisJCSpzdGF0dXMgPSBjbWQucmVzcFswXTsKKwlyZXR1cm4gZXJyOworfQorCisjZGVmaW5lIEVSUl9SRVRSWQkyCisjZGVmaW5lIEVSUl9BQk9SVAkxCisjZGVmaW5lIEVSUl9DT05USU5VRQkwCisKK3N0YXRpYyBpbnQgbW1jX2Jsa19jbWRfZXJyb3Ioc3RydWN0IHJlcXVlc3QgKnJlcSwgY29uc3QgY2hhciAqbmFtZSwgaW50IGVycm9yLAorCWJvb2wgc3RhdHVzX3ZhbGlkLCB1MzIgc3RhdHVzKQoreworCXN3aXRjaCAoZXJyb3IpIHsKKwljYXNlIC1FSUxTRVE6CisJCS8qIHJlc3BvbnNlIGNyYyBlcnJvciwgcmV0cnkgdGhlIHIvdyBjbWQgKi8KKwkJcHJfZXJyKCIlczogJXMgc2VuZGluZyAlcyBjb21tYW5kLCBjYXJkIHN0YXR1cyAlI3hcbiIsCisJCQlyZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgInJlc3BvbnNlIENSQyBlcnJvciIsCisJCQluYW1lLCBzdGF0dXMpOworCQlyZXR1cm4gRVJSX1JFVFJZOworCisJY2FzZSAtRVRJTUVET1VUOgorCQlwcl9lcnIoIiVzOiAlcyBzZW5kaW5nICVzIGNvbW1hbmQsIGNhcmQgc3RhdHVzICUjeFxuIiwKKwkJCXJlcS0+cnFfZGlzay0+ZGlza19uYW1lLCAidGltZWQgb3V0IiwgbmFtZSwgc3RhdHVzKTsKKworCQkvKiBJZiB0aGUgc3RhdHVzIGNtZCBpbml0aWFsbHkgZmFpbGVkLCByZXRyeSB0aGUgci93IGNtZCAqLworCQlpZiAoIXN0YXR1c192YWxpZCkKKwkJCXJldHVybiBFUlJfUkVUUlk7CisKKwkJLyoKKwkJICogSWYgaXQgd2FzIGEgci93IGNtZCBjcmMgZXJyb3IsIG9yIGlsbGVnYWwgY29tbWFuZAorCQkgKiAoZWcsIGlzc3VlZCBpbiB3cm9uZyBzdGF0ZSkgdGhlbiByZXRyeSAtIHdlIHNob3VsZAorCQkgKiBoYXZlIGNvcnJlY3RlZCB0aGUgc3RhdGUgcHJvYmxlbSBhYm92ZS4KKwkJICovCisJCWlmIChzdGF0dXMgJiAoUjFfQ09NX0NSQ19FUlJPUiB8IFIxX0lMTEVHQUxfQ09NTUFORCkpCisJCQlyZXR1cm4gRVJSX1JFVFJZOworCisJCS8qIE90aGVyd2lzZSBhYm9ydCB0aGUgY29tbWFuZCAqLworCQlyZXR1cm4gRVJSX0FCT1JUOworCisJZGVmYXVsdDoKKwkJLyogV2UgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgZXJyb3IgY29kZSB0aGUgZHJpdmVyIGdhdmUgdXMgKi8KKwkJcHJfZXJyKCIlczogdW5rbm93biBlcnJvciAlZCBzZW5kaW5nIHJlYWQvd3JpdGUgY29tbWFuZCwgY2FyZCBzdGF0dXMgJSN4XG4iLAorCQkgICAgICAgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIGVycm9yLCBzdGF0dXMpOworCQlyZXR1cm4gRVJSX0FCT1JUOworCX0KK30KKworLyoKKyAqIEluaXRpYWwgci93IGFuZCBzdG9wIGNtZCBlcnJvciByZWNvdmVyeS4KKyAqIFdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgY2FyZCByZWNlaXZlZCB0aGUgci93IGNtZCBvciBub3QsIHNvIHRyeSB0bworICogcmVzdG9yZSB0aGluZ3MgYmFjayB0byBhIHNhbmUgc3RhdGUuICBFc3NlbnRpYWxseSwgd2UgZG8gdGhpcyBhcyBmb2xsb3dzOgorICogLSBPYnRhaW4gY2FyZCBzdGF0dXMuICBJZiB0aGUgZmlyc3QgYXR0ZW1wdCB0byBvYnRhaW4gY2FyZCBzdGF0dXMgZmFpbHMsCisgKiAgIHRoZSBzdGF0dXMgd29yZCB3aWxsIHJlZmxlY3QgdGhlIGZhaWxlZCBzdGF0dXMgY21kLCBub3QgdGhlIGZhaWxlZAorICogICByL3cgY21kLiAgSWYgd2UgZmFpbCB0byBvYnRhaW4gY2FyZCBzdGF0dXMsIGl0IHN1Z2dlc3RzIHdlIGNhbiBubworICogICBsb25nZXIgY29tbXVuaWNhdGUgd2l0aCB0aGUgY2FyZC4KKyAqIC0gQ2hlY2sgdGhlIGNhcmQgc3RhdGUuICBJZiB0aGUgY2FyZCByZWNlaXZlZCB0aGUgY21kIGJ1dCB0aGVyZSB3YXMgYQorICogICB0cmFuc2llbnQgcHJvYmxlbSB3aXRoIHRoZSByZXNwb25zZSwgaXQgbWlnaHQgc3RpbGwgYmUgaW4gYSBkYXRhIHRyYW5zZmVyCisgKiAgIG1vZGUuICBUcnkgdG8gc2VuZCBpdCBhIHN0b3AgY29tbWFuZC4gIElmIHRoaXMgZmFpbHMsIHdlIGNhbid0IHJlY292ZXIuCisgKiAtIElmIHRoZSByL3cgY21kIGZhaWxlZCBkdWUgdG8gYSByZXNwb25zZSBDUkMgZXJyb3IsIGl0IHdhcyBwcm9iYWJseQorICogICB0cmFuc2llbnQsIHNvIHJldHJ5IHRoZSBjbWQuCisgKiAtIElmIHRoZSByL3cgY21kIHRpbWVkIG91dCwgYnV0IHdlIGRpZG4ndCBnZXQgdGhlIHIvdyBjbWQgc3RhdHVzLCByZXRyeS4KKyAqIC0gSWYgdGhlIHIvdyBjbWQgdGltZWQgb3V0LCBhbmQgdGhlIHIvdyBjbWQgZmFpbGVkIGR1ZSB0byBDUkMgZXJyb3Igb3IKKyAqICAgaWxsZWdhbCBjbWQsIHJldHJ5LgorICogT3RoZXJ3aXNlIHdlIGRvbid0IHVuZGVyc3RhbmQgd2hhdCBoYXBwZW5lZCwgc28gYWJvcnQuCisgKi8KK3N0YXRpYyBpbnQgbW1jX2Jsa19jbWRfcmVjb3Zlcnkoc3RydWN0IG1tY19jYXJkICpjYXJkLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxLAorCXN0cnVjdCBtbWNfYmxrX3JlcXVlc3QgKmJycSkKK3sKKwlib29sIHByZXZfY21kX3N0YXR1c192YWxpZCA9IHRydWU7CisJdTMyIHN0YXR1cywgc3RvcF9zdGF0dXMgPSAwOworCWludCBlcnIsIHJldHJ5OworCisJLyoKKwkgKiBUcnkgdG8gZ2V0IGNhcmQgc3RhdHVzIHdoaWNoIGluZGljYXRlcyBib3RoIHRoZSBjYXJkIHN0YXRlCisJICogYW5kIHdoeSB0aGVyZSB3YXMgbm8gcmVzcG9uc2UuICBJZiB0aGUgZmlyc3QgYXR0ZW1wdCBmYWlscywKKwkgKiB3ZSBjYW4ndCBiZSBzdXJlIHRoZSByZXR1cm5lZCBzdGF0dXMgaXMgZm9yIHRoZSByL3cgY29tbWFuZC4KKwkgKi8KKwlmb3IgKHJldHJ5ID0gMjsgcmV0cnkgPj0gMDsgcmV0cnktLSkgeworCQllcnIgPSBnZXRfY2FyZF9zdGF0dXMoY2FyZCwgJnN0YXR1cywgMCk7CisJCWlmICghZXJyKQorCQkJYnJlYWs7CisKKwkJcHJldl9jbWRfc3RhdHVzX3ZhbGlkID0gZmFsc2U7CisJCXByX2VycigiJXM6IGVycm9yICVkIHNlbmRpbmcgc3RhdHVzIGNvbW1hbmQsICVzaW5nXG4iLAorCQkgICAgICAgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIGVyciwgcmV0cnkgPyAicmV0cnkiIDogImFib3J0Iik7CisJfQorCisJLyogV2UgY291bGRuJ3QgZ2V0IGEgcmVzcG9uc2UgZnJvbSB0aGUgY2FyZC4gIEdpdmUgdXAuICovCiAJaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgc2VuZGluZyBzdGF0dXMgY29tbWFuZCIsCi0JCSAgICAgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgZXJyKTsKLQlyZXR1cm4gY21kLnJlc3BbMF07CisJCXJldHVybiBFUlJfQUJPUlQ7CisKKwkvKgorCSAqIENoZWNrIHRoZSBjdXJyZW50IGNhcmQgc3RhdGUuICBJZiBpdCBpcyBpbiBzb21lIGRhdGEgdHJhbnNmZXIKKwkgKiBtb2RlLCB0ZWxsIGl0IHRvIHN0b3AgKGFuZCBob3BlZnVsbHkgdHJhbnNpdGlvbiBiYWNrIHRvIFRSQU4uKQorCSAqLworCWlmIChSMV9DVVJSRU5UX1NUQVRFKHN0YXR1cykgPT0gUjFfU1RBVEVfREFUQSB8fAorCSAgICBSMV9DVVJSRU5UX1NUQVRFKHN0YXR1cykgPT0gUjFfU1RBVEVfUkNWKSB7CisJCWVyciA9IHNlbmRfc3RvcChjYXJkLCAmc3RvcF9zdGF0dXMpOworCQlpZiAoZXJyKQorCQkJcHJfZXJyKCIlczogZXJyb3IgJWQgc2VuZGluZyBzdG9wIGNvbW1hbmRcbiIsCisJCQkgICAgICAgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIGVycik7CisKKwkJLyoKKwkJICogSWYgdGhlIHN0b3AgY21kIGFsc28gdGltZWQgb3V0LCB0aGUgY2FyZCBpcyBwcm9iYWJseQorCQkgKiBub3QgcHJlc2VudCwgc28gYWJvcnQuICBPdGhlciBlcnJvcnMgYXJlIGJhZCBuZXdzIHRvby4KKwkJICovCisJCWlmIChlcnIpCisJCQlyZXR1cm4gRVJSX0FCT1JUOworCX0KKworCS8qIENoZWNrIGZvciBzZXQgYmxvY2sgY291bnQgZXJyb3JzICovCisJaWYgKGJycS0+c2JjLmVycm9yKQorCQlyZXR1cm4gbW1jX2Jsa19jbWRfZXJyb3IocmVxLCAiU0VUX0JMT0NLX0NPVU5UIiwgYnJxLT5zYmMuZXJyb3IsCisJCQkJcHJldl9jbWRfc3RhdHVzX3ZhbGlkLCBzdGF0dXMpOworCisJLyogQ2hlY2sgZm9yIHIvdyBjb21tYW5kIGVycm9ycyAqLworCWlmIChicnEtPmNtZC5lcnJvcikKKwkJcmV0dXJuIG1tY19ibGtfY21kX2Vycm9yKHJlcSwgInIvdyBjbWQiLCBicnEtPmNtZC5lcnJvciwKKwkJCQlwcmV2X2NtZF9zdGF0dXNfdmFsaWQsIHN0YXR1cyk7CisKKwkvKiBOb3cgZm9yIHN0b3AgZXJyb3JzLiAgVGhlc2UgYXJlbid0IGZhdGFsIHRvIHRoZSB0cmFuc2Zlci4gKi8KKwlwcl9lcnIoIiVzOiBlcnJvciAlZCBzZW5kaW5nIHN0b3AgY29tbWFuZCwgb3JpZ2luYWwgY21kIHJlc3BvbnNlICUjeCwgY2FyZCBzdGF0dXMgJSN4XG4iLAorCSAgICAgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgYnJxLT5zdG9wLmVycm9yLAorCSAgICAgICBicnEtPmNtZC5yZXNwWzBdLCBzdGF0dXMpOworCisJLyoKKwkgKiBTdWJzaXR1dGUgaW4gb3VyIG93biBzdG9wIHN0YXR1cyBhcyB0aGlzIHdpbGwgZ2l2ZSB0aGUgZXJyb3IKKwkgKiBzdGF0ZSB3aGljaCBoYXBwZW5lZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgci93IGNvbW1hbmQuCisJICovCisJaWYgKHN0b3Bfc3RhdHVzKSB7CisJCWJycS0+c3RvcC5yZXNwWzBdID0gc3RvcF9zdGF0dXM7CisJCWJycS0+c3RvcC5lcnJvciA9IDA7CisJfQorCXJldHVybiBFUlJfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgbW1jX2Jsa19pc3N1ZV9kaXNjYXJkX3JxKHN0cnVjdCBtbWNfcXVldWUgKm1xLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxKQpAQCAtNjY5LDEyICs4MTQsMTE0IEBACiAJfQogfQogCi1zdGF0aWMgaW50IG1tY19ibGtfaXNzdWVfcndfcnEoc3RydWN0IG1tY19xdWV1ZSAqbXEsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCisjZGVmaW5lIENNRF9FUlJPUlMJCQkJCQkJXAorCShSMV9PVVRfT0ZfUkFOR0UgfAkvKiBDb21tYW5kIGFyZ3VtZW50IG91dCBvZiByYW5nZSAqLwlcCisJIFIxX0FERFJFU1NfRVJST1IgfAkvKiBNaXNhbGlnbmVkIGFkZHJlc3MgKi8JCVwKKwkgUjFfQkxPQ0tfTEVOX0VSUk9SIHwJLyogVHJhbnNmZXJyZWQgYmxvY2sgbGVuZ3RoIGluY29ycmVjdCAqL1wKKwkgUjFfV1BfVklPTEFUSU9OIHwJLyogVHJpZWQgdG8gd3JpdGUgdG8gcHJvdGVjdGVkIGJsb2NrICovCVwKKwkgUjFfQ0NfRVJST1IgfAkJLyogQ2FyZCBjb250cm9sbGVyIGVycm9yICovCQlcCisJIFIxX0VSUk9SKQkJLyogR2VuZXJhbC91bmtub3duIGVycm9yICovCisKK3N0YXRpYyBpbnQgbW1jX2Jsa19lcnJfY2hlY2soc3RydWN0IG1tY19jYXJkICpjYXJkLAorCQkJICAgICBzdHJ1Y3QgbW1jX2FzeW5jX3JlcSAqYXJlcSkKIHsKKwllbnVtIG1tY19ibGtfc3RhdHVzIHJldCA9IE1NQ19CTEtfU1VDQ0VTUzsKKwlzdHJ1Y3QgbW1jX3F1ZXVlX3JlcSAqbXFfbXJxID0gY29udGFpbmVyX29mKGFyZXEsIHN0cnVjdCBtbWNfcXVldWVfcmVxLAorCQkJCQkJICAgIG1tY19hY3RpdmUpOworCXN0cnVjdCBtbWNfYmxrX3JlcXVlc3QgKmJycSA9ICZtcV9tcnEtPmJycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gbXFfbXJxLT5yZXE7CisKKwkvKgorCSAqIHNiYy5lcnJvciBpbmRpY2F0ZXMgYSBwcm9ibGVtIHdpdGggdGhlIHNldCBibG9jayBjb3VudAorCSAqIGNvbW1hbmQuICBObyBkYXRhIHdpbGwgaGF2ZSBiZWVuIHRyYW5zZmVycmVkLgorCSAqCisJICogY21kLmVycm9yIGluZGljYXRlcyBhIHByb2JsZW0gd2l0aCB0aGUgci93IGNvbW1hbmQuICBObworCSAqIGRhdGEgd2lsbCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQuCisJICoKKwkgKiBzdG9wLmVycm9yIGluZGljYXRlcyBhIHByb2JsZW0gd2l0aCB0aGUgc3RvcCBjb21tYW5kLiAgRGF0YQorCSAqIG1heSBoYXZlIGJlZW4gdHJhbnNmZXJyZWQsIG9yIG1heSBzdGlsbCBiZSB0cmFuc2ZlcnJpbmcuCisJICovCisJaWYgKGJycS0+c2JjLmVycm9yIHx8IGJycS0+Y21kLmVycm9yIHx8IGJycS0+c3RvcC5lcnJvcikgeworCQlzd2l0Y2ggKG1tY19ibGtfY21kX3JlY292ZXJ5KGNhcmQsIHJlcSwgYnJxKSkgeworCQljYXNlIEVSUl9SRVRSWToKKwkJCXJldHVybiBNTUNfQkxLX1JFVFJZOworCQljYXNlIEVSUl9BQk9SVDoKKwkJCXJldHVybiBNTUNfQkxLX0FCT1JUOworCQljYXNlIEVSUl9DT05USU5VRToKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgZXJyb3JzIHJlbGF0aW5nIHRvIHRoZSBleGVjdXRpb24gb2YgdGhlCisJICogaW5pdGlhbCBjb21tYW5kIC0gc3VjaCBhcyBhZGRyZXNzIGVycm9ycy4gIE5vIGRhdGEKKwkgKiBoYXMgYmVlbiB0cmFuc2ZlcnJlZC4KKwkgKi8KKwlpZiAoYnJxLT5jbWQucmVzcFswXSAmIENNRF9FUlJPUlMpIHsKKwkJcHJfZXJyKCIlczogci93IGNvbW1hbmQgZmFpbGVkLCBzdGF0dXMgPSAlI3hcbiIsCisJCSAgICAgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgYnJxLT5jbWQucmVzcFswXSk7CisJCXJldHVybiBNTUNfQkxLX0FCT1JUOworCX0KKworCS8qCisJICogRXZlcnl0aGluZyBlbHNlIGlzIGVpdGhlciBzdWNjZXNzLCBvciBhIGRhdGEgZXJyb3Igb2Ygc29tZQorCSAqIGtpbmQuICBJZiBpdCB3YXMgYSB3cml0ZSwgd2UgbWF5IGhhdmUgdHJhbnNpdGlvbmVkIHRvCisJICogcHJvZ3JhbSBtb2RlLCB3aGljaCB3ZSBoYXZlIHRvIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLgorCSAqLworCWlmICghbW1jX2hvc3RfaXNfc3BpKGNhcmQtPmhvc3QpICYmIHJxX2RhdGFfZGlyKHJlcSkgIT0gUkVBRCkgeworCQl1MzIgc3RhdHVzOworCQlkbyB7CisJCQlpbnQgZXJyID0gZ2V0X2NhcmRfc3RhdHVzKGNhcmQsICZzdGF0dXMsIDUpOworCQkJaWYgKGVycikgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlcXVlc3Rpbmcgc3RhdHVzXG4iLAorCQkJCSAgICAgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgZXJyKTsKKwkJCQlyZXR1cm4gTU1DX0JMS19DTURfRVJSOworCQkJfQorCQkJLyoKKwkJCSAqIFNvbWUgY2FyZHMgbWlzaGFuZGxlIHRoZSBzdGF0dXMgYml0cywKKwkJCSAqIHNvIG1ha2Ugc3VyZSB0byBjaGVjayBib3RoIHRoZSBidXN5CisJCQkgKiBpbmRpY2F0aW9uIGFuZCB0aGUgY2FyZCBzdGF0ZS4KKwkJCSAqLworCQl9IHdoaWxlICghKHN0YXR1cyAmIFIxX1JFQURZX0ZPUl9EQVRBKSB8fAorCQkJIChSMV9DVVJSRU5UX1NUQVRFKHN0YXR1cykgPT0gUjFfU1RBVEVfUFJHKSk7CisJfQorCisJaWYgKGJycS0+ZGF0YS5lcnJvcikgeworCQlwcl9lcnIoIiVzOiBlcnJvciAlZCB0cmFuc2ZlcnJpbmcgZGF0YSwgc2VjdG9yICV1LCBuciAldSwgY21kIHJlc3BvbnNlICUjeCwgY2FyZCBzdGF0dXMgJSN4XG4iLAorCQkgICAgICAgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIGJycS0+ZGF0YS5lcnJvciwKKwkJICAgICAgICh1bnNpZ25lZClibGtfcnFfcG9zKHJlcSksCisJCSAgICAgICAodW5zaWduZWQpYmxrX3JxX3NlY3RvcnMocmVxKSwKKwkJICAgICAgIGJycS0+Y21kLnJlc3BbMF0sIGJycS0+c3RvcC5yZXNwWzBdKTsKKworCQlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEKSB7CisJCQlpZiAoYnJxLT5kYXRhLmJsb2NrcyA+IDEpIHsKKwkJCQkvKiBSZWRvIHJlYWQgb25lIHNlY3RvciBhdCBhIHRpbWUgKi8KKwkJCQlwcl93YXJuaW5nKCIlczogcmV0cnlpbmcgdXNpbmcgc2luZ2xlIGJsb2NrIHJlYWRcbiIsCisJCQkJCSAgIHJlcS0+cnFfZGlzay0+ZGlza19uYW1lKTsKKwkJCQlyZXR1cm4gTU1DX0JMS19SRVRSWV9TSU5HTEU7CisJCQl9CisJCQlyZXR1cm4gTU1DX0JMS19EQVRBX0VSUjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBNTUNfQkxLX0NNRF9FUlI7CisJCX0KKwl9CisKKwlpZiAocmV0ID09IE1NQ19CTEtfU1VDQ0VTUyAmJgorCSAgICBibGtfcnFfYnl0ZXMocmVxKSAhPSBicnEtPmRhdGEuYnl0ZXNfeGZlcmVkKQorCQlyZXQgPSBNTUNfQkxLX1BBUlRJQUw7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtbWNfYmxrX3J3X3JxX3ByZXAoc3RydWN0IG1tY19xdWV1ZV9yZXEgKm1xcnEsCisJCQkgICAgICAgc3RydWN0IG1tY19jYXJkICpjYXJkLAorCQkJICAgICAgIGludCBkaXNhYmxlX211bHRpLAorCQkJICAgICAgIHN0cnVjdCBtbWNfcXVldWUgKm1xKQoreworCXUzMiByZWFkY21kLCB3cml0ZWNtZDsKKwlzdHJ1Y3QgbW1jX2Jsa19yZXF1ZXN0ICpicnEgPSAmbXFycS0+YnJxOworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBtcXJxLT5yZXE7CiAJc3RydWN0IG1tY19ibGtfZGF0YSAqbWQgPSBtcS0+ZGF0YTsKLQlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQgPSBtZC0+cXVldWUuY2FyZDsKLQlzdHJ1Y3QgbW1jX2Jsa19yZXF1ZXN0IGJycTsKLQlpbnQgcmV0ID0gMSwgZGlzYWJsZV9tdWx0aSA9IDA7CiAKIAkvKgogCSAqIFJlbGlhYmxlIHdyaXRlcyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgRm9yY2VkIFVuaXQgQWNjZXNzIGFuZApAQCAtNjg1LDIyNCArOTMyLDIwNiBAQAogCQkocnFfZGF0YV9kaXIocmVxKSA9PSBXUklURSkgJiYKIAkJKG1kLT5mbGFncyAmIE1NQ19CTEtfUkVMX1dSKTsKIAorCW1lbXNldChicnEsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2Jsa19yZXF1ZXN0KSk7CisJYnJxLT5tcnEuY21kID0gJmJycS0+Y21kOworCWJycS0+bXJxLmRhdGEgPSAmYnJxLT5kYXRhOworCisJYnJxLT5jbWQuYXJnID0gYmxrX3JxX3BvcyhyZXEpOworCWlmICghbW1jX2NhcmRfYmxvY2thZGRyKGNhcmQpKQorCQlicnEtPmNtZC5hcmcgPDw9IDk7CisJYnJxLT5jbWQuZmxhZ3MgPSBNTUNfUlNQX1NQSV9SMSB8IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FEVEM7CisJYnJxLT5kYXRhLmJsa3N6ID0gNTEyOworCWJycS0+c3RvcC5vcGNvZGUgPSBNTUNfU1RPUF9UUkFOU01JU1NJT047CisJYnJxLT5zdG9wLmFyZyA9IDA7CisJYnJxLT5zdG9wLmZsYWdzID0gTU1DX1JTUF9TUElfUjFCIHwgTU1DX1JTUF9SMUIgfCBNTUNfQ01EX0FDOworCWJycS0+ZGF0YS5ibG9ja3MgPSBibGtfcnFfc2VjdG9ycyhyZXEpOworCisJLyoKKwkgKiBUaGUgYmxvY2sgbGF5ZXIgZG9lc24ndCBzdXBwb3J0IGFsbCBzZWN0b3IgY291bnQKKwkgKiByZXN0cmljdGlvbnMsIHNvIHdlIG5lZWQgdG8gYmUgcHJlcGFyZWQgZm9yIHRvbyBiaWcKKwkgKiByZXF1ZXN0cy4KKwkgKi8KKwlpZiAoYnJxLT5kYXRhLmJsb2NrcyA+IGNhcmQtPmhvc3QtPm1heF9ibGtfY291bnQpCisJCWJycS0+ZGF0YS5ibG9ja3MgPSBjYXJkLT5ob3N0LT5tYXhfYmxrX2NvdW50OworCisJLyoKKwkgKiBBZnRlciBhIHJlYWQgZXJyb3IsIHdlIHJlZG8gdGhlIHJlcXVlc3Qgb25lIHNlY3RvciBhdCBhIHRpbWUKKwkgKiBpbiBvcmRlciB0byBhY2N1cmF0ZWx5IGRldGVybWluZSB3aGljaCBzZWN0b3JzIGNhbiBiZSByZWFkCisJICogc3VjY2Vzc2Z1bGx5LgorCSAqLworCWlmIChkaXNhYmxlX211bHRpICYmIGJycS0+ZGF0YS5ibG9ja3MgPiAxKQorCQlicnEtPmRhdGEuYmxvY2tzID0gMTsKKworCWlmIChicnEtPmRhdGEuYmxvY2tzID4gMSB8fCBkb19yZWxfd3IpIHsKKwkJLyogU1BJIG11bHRpYmxvY2sgd3JpdGVzIHRlcm1pbmF0ZSB1c2luZyBhIHNwZWNpYWwKKwkJICogdG9rZW4sIG5vdCBhIFNUT1BfVFJBTlNNSVNTSU9OIHJlcXVlc3QuCisJCSAqLworCQlpZiAoIW1tY19ob3N0X2lzX3NwaShjYXJkLT5ob3N0KSB8fAorCQkgICAgcnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEKQorCQkJYnJxLT5tcnEuc3RvcCA9ICZicnEtPnN0b3A7CisJCXJlYWRjbWQgPSBNTUNfUkVBRF9NVUxUSVBMRV9CTE9DSzsKKwkJd3JpdGVjbWQgPSBNTUNfV1JJVEVfTVVMVElQTEVfQkxPQ0s7CisJfSBlbHNlIHsKKwkJYnJxLT5tcnEuc3RvcCA9IE5VTEw7CisJCXJlYWRjbWQgPSBNTUNfUkVBRF9TSU5HTEVfQkxPQ0s7CisJCXdyaXRlY21kID0gTU1DX1dSSVRFX0JMT0NLOworCX0KKwlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEKSB7CisJCWJycS0+Y21kLm9wY29kZSA9IHJlYWRjbWQ7CisJCWJycS0+ZGF0YS5mbGFncyB8PSBNTUNfREFUQV9SRUFEOworCX0gZWxzZSB7CisJCWJycS0+Y21kLm9wY29kZSA9IHdyaXRlY21kOworCQlicnEtPmRhdGEuZmxhZ3MgfD0gTU1DX0RBVEFfV1JJVEU7CisJfQorCisJaWYgKGRvX3JlbF93cikKKwkJbW1jX2FwcGx5X3JlbF9ydyhicnEsIGNhcmQsIHJlcSk7CisKKwkvKgorCSAqIFByZS1kZWZpbmVkIG11bHRpLWJsb2NrIHRyYW5zZmVycyBhcmUgcHJlZmVyYWJsZSB0bworCSAqIG9wZW4gZW5kZWQtb25lcyAoYW5kIG5lY2Vzc2FyeSBmb3IgcmVsaWFibGUgd3JpdGVzKS4KKwkgKiBIb3dldmVyLCBpdCBpcyBub3Qgc3VmZmljaWVudCB0byBqdXN0IHNlbmQgQ01EMjMsCisJICogYW5kIGF2b2lkIHRoZSBmaW5hbCBDTUQxMiwgYXMgb24gYW4gZXJyb3IgY29uZGl0aW9uCisJICogQ01EMTIgKHN0b3ApIG5lZWRzIHRvIGJlIHNlbnQgYW55d2F5LiBUaGlzLCBjb3VwbGVkCisJICogd2l0aCBBdXRvLUNNRDIzIGVuaGFuY2VtZW50cyBwcm92aWRlZCBieSBzb21lCisJICogaG9zdHMsIG1lYW5zIHRoYXQgdGhlIGNvbXBsZXhpdHkgb2YgZGVhbGluZworCSAqIHdpdGggdGhpcyBpcyBiZXN0IGxlZnQgdG8gdGhlIGhvc3QuIElmIENNRDIzIGlzCisJICogc3VwcG9ydGVkIGJ5IGNhcmQgYW5kIGhvc3QsIHdlJ2xsIGZpbGwgc2JjIGluIGFuZCBsZXQKKwkgKiB0aGUgaG9zdCBkZWFsIHdpdGggaGFuZGxpbmcgaXQgY29ycmVjdGx5LiBUaGlzIG1lYW5zCisJICogdGhhdCBmb3IgaG9zdHMgdGhhdCBkb24ndCBleHBvc2UgTU1DX0NBUF9DTUQyMywgbm8KKwkgKiBjaGFuZ2Ugb2YgYmVoYXZpb3Igd2lsbCBiZSBvYnNlcnZlZC4KKwkgKgorCSAqIE4uQjogU29tZSBNTUMgY2FyZHMgZXhwZXJpZW5jZSBwZXJmIGRlZ3JhZGF0aW9uLgorCSAqIFdlJ2xsIGF2b2lkIHVzaW5nIENNRDIzLWJvdW5kZWQgbXVsdGlibG9jayB3cml0ZXMgZm9yCisJICogdGhlc2UsIHdoaWxlIHJldGFpbmluZyBmZWF0dXJlcyBsaWtlIHJlbGlhYmxlIHdyaXRlcy4KKwkgKi8KKworCWlmICgobWQtPmZsYWdzICYgTU1DX0JMS19DTUQyMykgJiYKKwkgICAgbW1jX29wX211bHRpKGJycS0+Y21kLm9wY29kZSkgJiYKKwkgICAgKGRvX3JlbF93ciB8fCAhKGNhcmQtPnF1aXJrcyAmIE1NQ19RVUlSS19CTEtfTk9fQ01EMjMpKSkgeworCQlicnEtPnNiYy5vcGNvZGUgPSBNTUNfU0VUX0JMT0NLX0NPVU5UOworCQlicnEtPnNiYy5hcmcgPSBicnEtPmRhdGEuYmxvY2tzIHwKKwkJCShkb19yZWxfd3IgPyAoMSA8PCAzMSkgOiAwKTsKKwkJYnJxLT5zYmMuZmxhZ3MgPSBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BQzsKKwkJYnJxLT5tcnEuc2JjID0gJmJycS0+c2JjOworCX0KKworCW1tY19zZXRfZGF0YV90aW1lb3V0KCZicnEtPmRhdGEsIGNhcmQpOworCisJYnJxLT5kYXRhLnNnID0gbXFycS0+c2c7CisJYnJxLT5kYXRhLnNnX2xlbiA9IG1tY19xdWV1ZV9tYXBfc2cobXEsIG1xcnEpOworCisJLyoKKwkgKiBBZGp1c3QgdGhlIHNnIGxpc3Qgc28gaXQgaXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUKKwkgKiByZXF1ZXN0LgorCSAqLworCWlmIChicnEtPmRhdGEuYmxvY2tzICE9IGJsa19ycV9zZWN0b3JzKHJlcSkpIHsKKwkJaW50IGksIGRhdGFfc2l6ZSA9IGJycS0+ZGF0YS5ibG9ja3MgPDwgOTsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKworCQlmb3JfZWFjaF9zZyhicnEtPmRhdGEuc2csIHNnLCBicnEtPmRhdGEuc2dfbGVuLCBpKSB7CisJCQlkYXRhX3NpemUgLT0gc2ctPmxlbmd0aDsKKwkJCWlmIChkYXRhX3NpemUgPD0gMCkgeworCQkJCXNnLT5sZW5ndGggKz0gZGF0YV9zaXplOworCQkJCWkrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicnEtPmRhdGEuc2dfbGVuID0gaTsKKwl9CisKKwltcXJxLT5tbWNfYWN0aXZlLm1ycSA9ICZicnEtPm1ycTsKKwltcXJxLT5tbWNfYWN0aXZlLmVycl9jaGVjayA9IG1tY19ibGtfZXJyX2NoZWNrOworCisJbW1jX3F1ZXVlX2JvdW5jZV9wcmUobXFycSk7Cit9CisKK3N0YXRpYyBpbnQgbW1jX2Jsa19pc3N1ZV9yd19ycShzdHJ1Y3QgbW1jX3F1ZXVlICptcSwgc3RydWN0IHJlcXVlc3QgKnJxYykKK3sKKwlzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZCA9IG1xLT5kYXRhOworCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IG1kLT5xdWV1ZS5jYXJkOworCXN0cnVjdCBtbWNfYmxrX3JlcXVlc3QgKmJycSA9ICZtcS0+bXFycV9jdXItPmJycTsKKwlpbnQgcmV0ID0gMSwgZGlzYWJsZV9tdWx0aSA9IDAsIHJldHJ5ID0gMDsKKwllbnVtIG1tY19ibGtfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgbW1jX3F1ZXVlX3JlcSAqbXFfcnE7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgbW1jX2FzeW5jX3JlcSAqYXJlcTsKKworCWlmICghcnFjICYmICFtcS0+bXFycV9wcmV2LT5yZXEpCisJCXJldHVybiAwOworCiAJZG8gewotCQlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwotCQl1MzIgcmVhZGNtZCwgd3JpdGVjbWQsIHN0YXR1cyA9IDA7CisJCWlmIChycWMpIHsKKwkJCW1tY19ibGtfcndfcnFfcHJlcChtcS0+bXFycV9jdXIsIGNhcmQsIDAsIG1xKTsKKwkJCWFyZXEgPSAmbXEtPm1xcnFfY3VyLT5tbWNfYWN0aXZlOworCQl9IGVsc2UKKwkJCWFyZXEgPSBOVUxMOworCQlhcmVxID0gbW1jX3N0YXJ0X3JlcShjYXJkLT5ob3N0LCBhcmVxLCAoaW50ICopICZzdGF0dXMpOworCQlpZiAoIWFyZXEpCisJCQlyZXR1cm4gMDsKIAotCQltZW1zZXQoJmJycSwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfYmxrX3JlcXVlc3QpKTsKLQkJYnJxLm1ycS5jbWQgPSAmYnJxLmNtZDsKLQkJYnJxLm1ycS5kYXRhID0gJmJycS5kYXRhOworCQltcV9ycSA9IGNvbnRhaW5lcl9vZihhcmVxLCBzdHJ1Y3QgbW1jX3F1ZXVlX3JlcSwgbW1jX2FjdGl2ZSk7CisJCWJycSA9ICZtcV9ycS0+YnJxOworCQlyZXEgPSBtcV9ycS0+cmVxOworCQltbWNfcXVldWVfYm91bmNlX3Bvc3QobXFfcnEpOwogCi0JCWJycS5jbWQuYXJnID0gYmxrX3JxX3BvcyhyZXEpOwotCQlpZiAoIW1tY19jYXJkX2Jsb2NrYWRkcihjYXJkKSkKLQkJCWJycS5jbWQuYXJnIDw8PSA5OwotCQlicnEuY21kLmZsYWdzID0gTU1DX1JTUF9TUElfUjEgfCBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BRFRDOwotCQlicnEuZGF0YS5ibGtzeiA9IDUxMjsKLQkJYnJxLnN0b3Aub3Bjb2RlID0gTU1DX1NUT1BfVFJBTlNNSVNTSU9OOwotCQlicnEuc3RvcC5hcmcgPSAwOwotCQlicnEuc3RvcC5mbGFncyA9IE1NQ19SU1BfU1BJX1IxQiB8IE1NQ19SU1BfUjFCIHwgTU1DX0NNRF9BQzsKLQkJYnJxLmRhdGEuYmxvY2tzID0gYmxrX3JxX3NlY3RvcnMocmVxKTsKLQotCQkvKgotCQkgKiBUaGUgYmxvY2sgbGF5ZXIgZG9lc24ndCBzdXBwb3J0IGFsbCBzZWN0b3IgY291bnQKLQkJICogcmVzdHJpY3Rpb25zLCBzbyB3ZSBuZWVkIHRvIGJlIHByZXBhcmVkIGZvciB0b28gYmlnCi0JCSAqIHJlcXVlc3RzLgotCQkgKi8KLQkJaWYgKGJycS5kYXRhLmJsb2NrcyA+IGNhcmQtPmhvc3QtPm1heF9ibGtfY291bnQpCi0JCQlicnEuZGF0YS5ibG9ja3MgPSBjYXJkLT5ob3N0LT5tYXhfYmxrX2NvdW50OwotCi0JCS8qCi0JCSAqIEFmdGVyIGEgcmVhZCBlcnJvciwgd2UgcmVkbyB0aGUgcmVxdWVzdCBvbmUgc2VjdG9yIGF0IGEgdGltZQotCQkgKiBpbiBvcmRlciB0byBhY2N1cmF0ZWx5IGRldGVybWluZSB3aGljaCBzZWN0b3JzIGNhbiBiZSByZWFkCi0JCSAqIHN1Y2Nlc3NmdWxseS4KLQkJICovCi0JCWlmIChkaXNhYmxlX211bHRpICYmIGJycS5kYXRhLmJsb2NrcyA+IDEpCi0JCQlicnEuZGF0YS5ibG9ja3MgPSAxOwotCi0JCWlmIChicnEuZGF0YS5ibG9ja3MgPiAxIHx8IGRvX3JlbF93cikgewotCQkJLyogU1BJIG11bHRpYmxvY2sgd3JpdGVzIHRlcm1pbmF0ZSB1c2luZyBhIHNwZWNpYWwKLQkJCSAqIHRva2VuLCBub3QgYSBTVE9QX1RSQU5TTUlTU0lPTiByZXF1ZXN0LgorCQlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIE1NQ19CTEtfU1VDQ0VTUzoKKwkJY2FzZSBNTUNfQkxLX1BBUlRJQUw6CisJCQkvKgorCQkJICogQSBibG9jayB3YXMgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkLgogCQkJICovCi0JCQlpZiAoIW1tY19ob3N0X2lzX3NwaShjYXJkLT5ob3N0KSB8fAotCQkJICAgIHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkKLQkJCQlicnEubXJxLnN0b3AgPSAmYnJxLnN0b3A7Ci0JCQlyZWFkY21kID0gTU1DX1JFQURfTVVMVElQTEVfQkxPQ0s7Ci0JCQl3cml0ZWNtZCA9IE1NQ19XUklURV9NVUxUSVBMRV9CTE9DSzsKLQkJfSBlbHNlIHsKLQkJCWJycS5tcnEuc3RvcCA9IE5VTEw7Ci0JCQlyZWFkY21kID0gTU1DX1JFQURfU0lOR0xFX0JMT0NLOwotCQkJd3JpdGVjbWQgPSBNTUNfV1JJVEVfQkxPQ0s7Ci0JCX0KLQkJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkgewotCQkJYnJxLmNtZC5vcGNvZGUgPSByZWFkY21kOwotCQkJYnJxLmRhdGEuZmxhZ3MgfD0gTU1DX0RBVEFfUkVBRDsKLQkJfSBlbHNlIHsKLQkJCWJycS5jbWQub3Bjb2RlID0gd3JpdGVjbWQ7Ci0JCQlicnEuZGF0YS5mbGFncyB8PSBNTUNfREFUQV9XUklURTsKLQkJfQotCi0JCWlmIChkb19yZWxfd3IpCi0JCQltbWNfYXBwbHlfcmVsX3J3KCZicnEsIGNhcmQsIHJlcSk7Ci0KLQkJLyoKLQkJICogUHJlLWRlZmluZWQgbXVsdGktYmxvY2sgdHJhbnNmZXJzIGFyZSBwcmVmZXJhYmxlIHRvCi0JCSAqIG9wZW4gZW5kZWQtb25lcyAoYW5kIG5lY2Vzc2FyeSBmb3IgcmVsaWFibGUgd3JpdGVzKS4KLQkJICogSG93ZXZlciwgaXQgaXMgbm90IHN1ZmZpY2llbnQgdG8ganVzdCBzZW5kIENNRDIzLAotCQkgKiBhbmQgYXZvaWQgdGhlIGZpbmFsIENNRDEyLCBhcyBvbiBhbiBlcnJvciBjb25kaXRpb24KLQkJICogQ01EMTIgKHN0b3ApIG5lZWRzIHRvIGJlIHNlbnQgYW55d2F5LiBUaGlzLCBjb3VwbGVkCi0JCSAqIHdpdGggQXV0by1DTUQyMyBlbmhhbmNlbWVudHMgcHJvdmlkZWQgYnkgc29tZQotCQkgKiBob3N0cywgbWVhbnMgdGhhdCB0aGUgY29tcGxleGl0eSBvZiBkZWFsaW5nCi0JCSAqIHdpdGggdGhpcyBpcyBiZXN0IGxlZnQgdG8gdGhlIGhvc3QuIElmIENNRDIzIGlzCi0JCSAqIHN1cHBvcnRlZCBieSBjYXJkIGFuZCBob3N0LCB3ZSdsbCBmaWxsIHNiYyBpbiBhbmQgbGV0Ci0JCSAqIHRoZSBob3N0IGRlYWwgd2l0aCBoYW5kbGluZyBpdCBjb3JyZWN0bHkuIFRoaXMgbWVhbnMKLQkJICogdGhhdCBmb3IgaG9zdHMgdGhhdCBkb24ndCBleHBvc2UgTU1DX0NBUF9DTUQyMywgbm8KLQkJICogY2hhbmdlIG9mIGJlaGF2aW9yIHdpbGwgYmUgb2JzZXJ2ZWQuCi0JCSAqCi0JCSAqIE4uQjogU29tZSBNTUMgY2FyZHMgZXhwZXJpZW5jZSBwZXJmIGRlZ3JhZGF0aW9uLgotCQkgKiBXZSdsbCBhdm9pZCB1c2luZyBDTUQyMy1ib3VuZGVkIG11bHRpYmxvY2sgd3JpdGVzIGZvcgotCQkgKiB0aGVzZSwgd2hpbGUgcmV0YWluaW5nIGZlYXR1cmVzIGxpa2UgcmVsaWFibGUgd3JpdGVzLgotCQkgKi8KLQotCQlpZiAoKG1kLT5mbGFncyAmIE1NQ19CTEtfQ01EMjMpICYmCi0JCSAgICBtbWNfb3BfbXVsdGkoYnJxLmNtZC5vcGNvZGUpICYmCi0JCSAgICAoZG9fcmVsX3dyIHx8ICEoY2FyZC0+cXVpcmtzICYgTU1DX1FVSVJLX0JMS19OT19DTUQyMykpKSB7Ci0JCQlicnEuc2JjLm9wY29kZSA9IE1NQ19TRVRfQkxPQ0tfQ09VTlQ7Ci0JCQlicnEuc2JjLmFyZyA9IGJycS5kYXRhLmJsb2NrcyB8Ci0JCQkJKGRvX3JlbF93ciA/ICgxIDw8IDMxKSA6IDApOwotCQkJYnJxLnNiYy5mbGFncyA9IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FDOwotCQkJYnJxLm1ycS5zYmMgPSAmYnJxLnNiYzsKLQkJfQotCi0JCW1tY19zZXRfZGF0YV90aW1lb3V0KCZicnEuZGF0YSwgY2FyZCk7Ci0KLQkJYnJxLmRhdGEuc2cgPSBtcS0+c2c7Ci0JCWJycS5kYXRhLnNnX2xlbiA9IG1tY19xdWV1ZV9tYXBfc2cobXEpOwotCi0JCS8qCi0JCSAqIEFkanVzdCB0aGUgc2cgbGlzdCBzbyBpdCBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZQotCQkgKiByZXF1ZXN0LgotCQkgKi8KLQkJaWYgKGJycS5kYXRhLmJsb2NrcyAhPSBibGtfcnFfc2VjdG9ycyhyZXEpKSB7Ci0JCQlpbnQgaSwgZGF0YV9zaXplID0gYnJxLmRhdGEuYmxvY2tzIDw8IDk7Ci0JCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCi0JCQlmb3JfZWFjaF9zZyhicnEuZGF0YS5zZywgc2csIGJycS5kYXRhLnNnX2xlbiwgaSkgewotCQkJCWRhdGFfc2l6ZSAtPSBzZy0+bGVuZ3RoOwotCQkJCWlmIChkYXRhX3NpemUgPD0gMCkgewotCQkJCQlzZy0+bGVuZ3RoICs9IGRhdGFfc2l6ZTsKLQkJCQkJaSsrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlicnEuZGF0YS5zZ19sZW4gPSBpOwotCQl9Ci0KLQkJbW1jX3F1ZXVlX2JvdW5jZV9wcmUobXEpOwotCi0JCW1tY193YWl0X2Zvcl9yZXEoY2FyZC0+aG9zdCwgJmJycS5tcnEpOwotCi0JCW1tY19xdWV1ZV9ib3VuY2VfcG9zdChtcSk7Ci0KLQkJLyoKLQkJICogQ2hlY2sgZm9yIGVycm9ycyBoZXJlLCBidXQgZG9uJ3QganVtcCB0byBjbWRfZXJyCi0JCSAqIHVudGlsIGxhdGVyIGFzIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGNhcmQgdG8gbGVhdmUKLQkJICogcHJvZ3JhbW1pbmcgbW9kZSBldmVuIHdoZW4gdGhpbmdzIGdvIHdyb25nLgotCQkgKi8KLQkJaWYgKGJycS5zYmMuZXJyb3IgfHwgYnJxLmNtZC5lcnJvciB8fAotCQkgICAgYnJxLmRhdGEuZXJyb3IgfHwgYnJxLnN0b3AuZXJyb3IpIHsKLQkJCWlmIChicnEuZGF0YS5ibG9ja3MgPiAxICYmIHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkgewotCQkJCS8qIFJlZG8gcmVhZCBvbmUgc2VjdG9yIGF0IGEgdGltZSAqLwotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZXRyeWluZyB1c2luZyBzaW5nbGUgIgotCQkJCSAgICAgICAiYmxvY2sgcmVhZFxuIiwgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUpOwotCQkJCWRpc2FibGVfbXVsdGkgPSAxOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJc3RhdHVzID0gZ2V0X2NhcmRfc3RhdHVzKGNhcmQsIHJlcSk7Ci0JCX0KLQotCQlpZiAoYnJxLnNiYy5lcnJvcikgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgc2VuZGluZyBTRVRfQkxPQ0tfQ09VTlQgIgotCQkJICAgICAgICJjb21tYW5kLCByZXNwb25zZSAlI3gsIGNhcmQgc3RhdHVzICUjeFxuIiwKLQkJCSAgICAgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgYnJxLnNiYy5lcnJvciwKLQkJCSAgICAgICBicnEuc2JjLnJlc3BbMF0sIHN0YXR1cyk7Ci0JCX0KLQotCQlpZiAoYnJxLmNtZC5lcnJvcikgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgc2VuZGluZyByZWFkL3dyaXRlICIKLQkJCSAgICAgICAiY29tbWFuZCwgcmVzcG9uc2UgJSN4LCBjYXJkIHN0YXR1cyAlI3hcbiIsCi0JCQkgICAgICAgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIGJycS5jbWQuZXJyb3IsCi0JCQkgICAgICAgYnJxLmNtZC5yZXNwWzBdLCBzdGF0dXMpOwotCQl9Ci0KLQkJaWYgKGJycS5kYXRhLmVycm9yKSB7Ci0JCQlpZiAoYnJxLmRhdGEuZXJyb3IgPT0gLUVUSU1FRE9VVCAmJiBicnEubXJxLnN0b3ApCi0JCQkJLyogJ1N0b3AnIHJlc3BvbnNlIGNvbnRhaW5zIGNhcmQgc3RhdHVzICovCi0JCQkJc3RhdHVzID0gYnJxLm1ycS5zdG9wLT5yZXNwWzBdOwotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgdHJhbnNmZXJyaW5nIGRhdGEsIgotCQkJICAgICAgICIgc2VjdG9yICV1LCBuciAldSwgY2FyZCBzdGF0dXMgJSN4XG4iLAotCQkJICAgICAgIHJlcS0+cnFfZGlzay0+ZGlza19uYW1lLCBicnEuZGF0YS5lcnJvciwKLQkJCSAgICAgICAodW5zaWduZWQpYmxrX3JxX3BvcyhyZXEpLAotCQkJICAgICAgICh1bnNpZ25lZClibGtfcnFfc2VjdG9ycyhyZXEpLCBzdGF0dXMpOwotCQl9Ci0KLQkJaWYgKGJycS5zdG9wLmVycm9yKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCBzZW5kaW5nIHN0b3AgY29tbWFuZCwgIgotCQkJICAgICAgICJyZXNwb25zZSAlI3gsIGNhcmQgc3RhdHVzICUjeFxuIiwKLQkJCSAgICAgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgYnJxLnN0b3AuZXJyb3IsCi0JCQkgICAgICAgYnJxLnN0b3AucmVzcFswXSwgc3RhdHVzKTsKLQkJfQotCi0JCWlmICghbW1jX2hvc3RfaXNfc3BpKGNhcmQtPmhvc3QpICYmIHJxX2RhdGFfZGlyKHJlcSkgIT0gUkVBRCkgewotCQkJZG8gewotCQkJCWludCBlcnI7Ci0KLQkJCQljbWQub3Bjb2RlID0gTU1DX1NFTkRfU1RBVFVTOwotCQkJCWNtZC5hcmcgPSBjYXJkLT5yY2EgPDwgMTY7Ci0JCQkJY21kLmZsYWdzID0gTU1DX1JTUF9SMSB8IE1NQ19DTURfQUM7Ci0JCQkJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChjYXJkLT5ob3N0LCAmY21kLCA1KTsKLQkJCQlpZiAoZXJyKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlcXVlc3Rpbmcgc3RhdHVzXG4iLAotCQkJCQkgICAgICAgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIGVycik7Ci0JCQkJCWdvdG8gY21kX2VycjsKLQkJCQl9CisJCQlzcGluX2xvY2tfaXJxKCZtZC0+bG9jayk7CisJCQlyZXQgPSBfX2Jsa19lbmRfcmVxdWVzdChyZXEsIDAsCisJCQkJCQlicnEtPmRhdGEuYnl0ZXNfeGZlcmVkKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbWQtPmxvY2spOworCQkJaWYgKHN0YXR1cyA9PSBNTUNfQkxLX1NVQ0NFU1MgJiYgcmV0KSB7CiAJCQkJLyoKLQkJCQkgKiBTb21lIGNhcmRzIG1pc2hhbmRsZSB0aGUgc3RhdHVzIGJpdHMsCi0JCQkJICogc28gbWFrZSBzdXJlIHRvIGNoZWNrIGJvdGggdGhlIGJ1c3kKLQkJCQkgKiBpbmRpY2F0aW9uIGFuZCB0aGUgY2FyZCBzdGF0ZS4KKwkJCQkgKiBUaGUgYmxrX2VuZF9yZXF1ZXN0IGhhcyByZXR1cm5lZCBub24gemVybworCQkJCSAqIGV2ZW4gdGhvdWdoIGFsbCBkYXRhIGlzIHRyYW5zZmVyZWQgYW5kIG5vCisJCQkJICogZXJyb3MgcmV0dXJuZWQgYnkgaG9zdC4KKwkJCQkgKiBJZiB0aGlzIGhhcHBlbiBpdCdzIGEgYnVnLgogCQkJCSAqLwotCQkJfSB3aGlsZSAoIShjbWQucmVzcFswXSAmIFIxX1JFQURZX0ZPUl9EQVRBKSB8fAotCQkJCShSMV9DVVJSRU5UX1NUQVRFKGNtZC5yZXNwWzBdKSA9PSA3KSk7Ci0KLSNpZiAwCi0JCQlpZiAoY21kLnJlc3BbMF0gJiB+MHgwMDAwMDkwMCkKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzdGF0dXMgPSAlMDh4XG4iLAotCQkJCSAgICAgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgY21kLnJlc3BbMF0pOwotCQkJaWYgKG1tY19kZWNvZGVfc3RhdHVzKGNtZC5yZXNwKSkKLQkJCQlnb3RvIGNtZF9lcnI7Ci0jZW5kaWYKLQkJfQotCi0JCWlmIChicnEuY21kLmVycm9yIHx8IGJycS5zdG9wLmVycm9yIHx8IGJycS5kYXRhLmVycm9yKSB7Ci0JCQlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEKSB7Ci0JCQkJLyoKLQkJCQkgKiBBZnRlciBhbiBlcnJvciwgd2UgcmVkbyBJL08gb25lIHNlY3RvciBhdCBhCi0JCQkJICogdGltZSwgc28gd2Ugb25seSByZWFjaCBoZXJlIGFmdGVyIHRyeWluZyB0bwotCQkJCSAqIHJlYWQgYSBzaW5nbGUgc2VjdG9yLgotCQkJCSAqLwotCQkJCXNwaW5fbG9ja19pcnEoJm1kLT5sb2NrKTsKLQkJCQlyZXQgPSBfX2Jsa19lbmRfcmVxdWVzdChyZXEsIC1FSU8sIGJycS5kYXRhLmJsa3N6KTsKLQkJCQlzcGluX3VubG9ja19pcnEoJm1kLT5sb2NrKTsKLQkJCQljb250aW51ZTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzIEJVRyBycV90b3QgJWQgZF94ZmVyICVkXG4iLAorCQkJCSAgICAgICBfX2Z1bmNfXywgYmxrX3JxX2J5dGVzKHJlcSksCisJCQkJICAgICAgIGJycS0+ZGF0YS5ieXRlc194ZmVyZWQpOworCQkJCXJxYyA9IE5VTEw7CisJCQkJZ290byBjbWRfYWJvcnQ7CiAJCQl9CisJCQlicmVhazsKKwkJY2FzZSBNTUNfQkxLX0NNRF9FUlI6CiAJCQlnb3RvIGNtZF9lcnI7CisJCWNhc2UgTU1DX0JMS19SRVRSWV9TSU5HTEU6CisJCQlkaXNhYmxlX211bHRpID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE1NQ19CTEtfUkVUUlk6CisJCQlpZiAocmV0cnkrKyA8IDUpCisJCQkJYnJlYWs7CisJCWNhc2UgTU1DX0JMS19BQk9SVDoKKwkJCWdvdG8gY21kX2Fib3J0OworCQljYXNlIE1NQ19CTEtfREFUQV9FUlI6CisJCQkvKgorCQkJICogQWZ0ZXIgYW4gZXJyb3IsIHdlIHJlZG8gSS9PIG9uZSBzZWN0b3IgYXQgYQorCQkJICogdGltZSwgc28gd2Ugb25seSByZWFjaCBoZXJlIGFmdGVyIHRyeWluZyB0bworCQkJICogcmVhZCBhIHNpbmdsZSBzZWN0b3IuCisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnEoJm1kLT5sb2NrKTsKKwkJCXJldCA9IF9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgLUVJTywKKwkJCQkJCWJycS0+ZGF0YS5ibGtzeik7CisJCQlzcGluX3VubG9ja19pcnEoJm1kLT5sb2NrKTsKKwkJCWlmICghcmV0KQorCQkJCWdvdG8gc3RhcnRfbmV3X3JlcTsKKwkJCWJyZWFrOwogCQl9CiAKLQkJLyoKLQkJICogQSBibG9jayB3YXMgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkLgotCQkgKi8KLQkJc3Bpbl9sb2NrX2lycSgmbWQtPmxvY2spOwotCQlyZXQgPSBfX2Jsa19lbmRfcmVxdWVzdChyZXEsIDAsIGJycS5kYXRhLmJ5dGVzX3hmZXJlZCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWQtPmxvY2spOworCQlpZiAocmV0KSB7CisJCQkvKgorCQkJICogSW4gY2FzZSBvZiBhIG5vbmUgY29tcGxldGUgcmVxdWVzdAorCQkJICogcHJlcGFyZSBpdCBhZ2FpbiBhbmQgcmVzZW5kLgorCQkJICovCisJCQltbWNfYmxrX3J3X3JxX3ByZXAobXFfcnEsIGNhcmQsIGRpc2FibGVfbXVsdGksIG1xKTsKKwkJCW1tY19zdGFydF9yZXEoY2FyZC0+aG9zdCwgJm1xX3JxLT5tbWNfYWN0aXZlLCBOVUxMKTsKKwkJfQogCX0gd2hpbGUgKHJldCk7CiAKIAlyZXR1cm4gMTsKQEAgLTkyNywxNSArMTE1NiwyMiBAQAogCQl9CiAJfSBlbHNlIHsKIAkJc3Bpbl9sb2NrX2lycSgmbWQtPmxvY2spOwotCQlyZXQgPSBfX2Jsa19lbmRfcmVxdWVzdChyZXEsIDAsIGJycS5kYXRhLmJ5dGVzX3hmZXJlZCk7CisJCXJldCA9IF9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgMCwgYnJxLT5kYXRhLmJ5dGVzX3hmZXJlZCk7CiAJCXNwaW5fdW5sb2NrX2lycSgmbWQtPmxvY2spOwogCX0KIAorIGNtZF9hYm9ydDoKIAlzcGluX2xvY2tfaXJxKCZtZC0+bG9jayk7CiAJd2hpbGUgKHJldCkKIAkJcmV0ID0gX19ibGtfZW5kX3JlcXVlc3QocmVxLCAtRUlPLCBibGtfcnFfY3VyX2J5dGVzKHJlcSkpOwogCXNwaW5fdW5sb2NrX2lycSgmbWQtPmxvY2spOwogCisgc3RhcnRfbmV3X3JlcToKKwlpZiAocnFjKSB7CisJCW1tY19ibGtfcndfcnFfcHJlcChtcS0+bXFycV9jdXIsIGNhcmQsIDAsIG1xKTsKKwkJbW1jX3N0YXJ0X3JlcShjYXJkLT5ob3N0LCAmbXEtPm1xcnFfY3VyLT5tbWNfYWN0aXZlLCBOVUxMKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTQ1LDI2ICsxMTgxLDM3IEBACiAJc3RydWN0IG1tY19ibGtfZGF0YSAqbWQgPSBtcS0+ZGF0YTsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQgPSBtZC0+cXVldWUuY2FyZDsKIAotCW1tY19jbGFpbV9ob3N0KGNhcmQtPmhvc3QpOworCWlmIChyZXEgJiYgIW1xLT5tcXJxX3ByZXYtPnJlcSkKKwkJLyogY2xhaW0gaG9zdCBvbmx5IGZvciB0aGUgZmlyc3QgcmVxdWVzdCAqLworCQltbWNfY2xhaW1faG9zdChjYXJkLT5ob3N0KTsKKwogCXJldCA9IG1tY19ibGtfcGFydF9zd2l0Y2goY2FyZCwgbWQpOwogCWlmIChyZXQpIHsKIAkJcmV0ID0gMDsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHJlcS0+Y21kX2ZsYWdzICYgUkVRX0RJU0NBUkQpIHsKKwlpZiAocmVxICYmIHJlcS0+Y21kX2ZsYWdzICYgUkVRX0RJU0NBUkQpIHsKKwkJLyogY29tcGxldGUgb25nb2luZyBhc3luYyB0cmFuc2ZlciBiZWZvcmUgaXNzdWluZyBkaXNjYXJkICovCisJCWlmIChjYXJkLT5ob3N0LT5hcmVxKQorCQkJbW1jX2Jsa19pc3N1ZV9yd19ycShtcSwgTlVMTCk7CiAJCWlmIChyZXEtPmNtZF9mbGFncyAmIFJFUV9TRUNVUkUpCiAJCQlyZXQgPSBtbWNfYmxrX2lzc3VlX3NlY2Rpc2NhcmRfcnEobXEsIHJlcSk7CiAJCWVsc2UKIAkJCXJldCA9IG1tY19ibGtfaXNzdWVfZGlzY2FyZF9ycShtcSwgcmVxKTsKLQl9IGVsc2UgaWYgKHJlcS0+Y21kX2ZsYWdzICYgUkVRX0ZMVVNIKSB7CisJfSBlbHNlIGlmIChyZXEgJiYgcmVxLT5jbWRfZmxhZ3MgJiBSRVFfRkxVU0gpIHsKKwkJLyogY29tcGxldGUgb25nb2luZyBhc3luYyB0cmFuc2ZlciBiZWZvcmUgaXNzdWluZyBmbHVzaCAqLworCQlpZiAoY2FyZC0+aG9zdC0+YXJlcSkKKwkJCW1tY19ibGtfaXNzdWVfcndfcnEobXEsIE5VTEwpOwogCQlyZXQgPSBtbWNfYmxrX2lzc3VlX2ZsdXNoKG1xLCByZXEpOwogCX0gZWxzZSB7CiAJCXJldCA9IG1tY19ibGtfaXNzdWVfcndfcnEobXEsIHJlcSk7CiAJfQogCiBvdXQ6Ci0JbW1jX3JlbGVhc2VfaG9zdChjYXJkLT5ob3N0KTsKKwlpZiAoIXJlcSkKKwkJLyogcmVsZWFzZSBob3N0IG9ubHkgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSByZXF1ZXN0cyAqLworCQltbWNfcmVsZWFzZV9ob3N0KGNhcmQtPmhvc3QpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwMjQsNyArMTI3MSw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJm1kLT5wYXJ0KTsKIAltZC0+dXNhZ2UgPSAxOwogCi0JcmV0ID0gbW1jX2luaXRfcXVldWUoJm1kLT5xdWV1ZSwgY2FyZCwgJm1kLT5sb2NrKTsKKwlyZXQgPSBtbWNfaW5pdF9xdWV1ZSgmbWQtPnF1ZXVlLCBjYXJkLCAmbWQtPmxvY2ssIHN1Ym5hbWUpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3B1dGRpc2s7CiAKQEAgLTEyOTcsNiArMTU0NCw5IEBACiAJc3RydWN0IG1tY19ibGtfZGF0YSAqbWQgPSBtbWNfZ2V0X2RydmRhdGEoY2FyZCk7CiAKIAltbWNfYmxrX3JlbW92ZV9wYXJ0cyhjYXJkLCBtZCk7CisJbW1jX2NsYWltX2hvc3QoY2FyZC0+aG9zdCk7CisJbW1jX2Jsa19wYXJ0X3N3aXRjaChjYXJkLCBtZCk7CisJbW1jX3JlbGVhc2VfaG9zdChjYXJkLT5ob3N0KTsKIAltbWNfYmxrX3JlbW92ZV9yZXEobWQpOwogCW1tY19zZXRfZHJ2ZGF0YShjYXJkLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvbW1jX3Rlc3QuYyBiL2RyaXZlcnMvbW1jL2NhcmQvbW1jX3Rlc3QuYwppbmRleCAyMzNjZGZhLi4wMDZhNWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL21tY190ZXN0LmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9tbWNfdGVzdC5jCkBAIC0xNDgsNiArMTQ4LDI3IEBACiAJc3RydWN0IG1tY190ZXN0X2dlbmVyYWxfcmVzdWx0CSpncjsKIH07CiAKK2VudW0gbW1jX3Rlc3RfcHJlcF9tZWRpYSB7CisJTU1DX1RFU1RfUFJFUF9OT05FID0gMCwKKwlNTUNfVEVTVF9QUkVQX1dSSVRFX0ZVTEwgPSAxIDw8IDAsCisJTU1DX1RFU1RfUFJFUF9FUkFTRSA9IDEgPDwgMSwKK307CisKK3N0cnVjdCBtbWNfdGVzdF9tdWx0aXBsZV9ydyB7CisJdW5zaWduZWQgaW50ICpzZ19sZW47CisJdW5zaWduZWQgaW50ICpiczsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBzaXplOworCWJvb2wgZG9fd3JpdGU7CisJYm9vbCBkb19ub25ibG9ja19yZXE7CisJZW51bSBtbWNfdGVzdF9wcmVwX21lZGlhIHByZXBhcmU7Cit9OworCitzdHJ1Y3QgbW1jX3Rlc3RfYXN5bmNfcmVxIHsKKwlzdHJ1Y3QgbW1jX2FzeW5jX3JlcSBhcmVxOworCXN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0OworfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgR2VuZXJhbCBoZWxwZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzY3LDIxICszODgsMjYgQEAKICAqIE1hcCBtZW1vcnkgaW50byBhIHNjYXR0ZXJsaXN0LiAgT3B0aW9uYWxseSBhbGxvdyB0aGUgc2FtZSBtZW1vcnkgdG8gYmUKICAqIG1hcHBlZCBtb3JlIHRoYW4gb25jZS4KICAqLwotc3RhdGljIGludCBtbWNfdGVzdF9tYXBfc2coc3RydWN0IG1tY190ZXN0X21lbSAqbWVtLCB1bnNpZ25lZCBsb25nIHN6LAorc3RhdGljIGludCBtbWNfdGVzdF9tYXBfc2coc3RydWN0IG1tY190ZXN0X21lbSAqbWVtLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IHJlcGVhdCwKIAkJCSAgIHVuc2lnbmVkIGludCBtYXhfc2VncywgdW5zaWduZWQgaW50IG1heF9zZWdfc3osCi0JCQkgICB1bnNpZ25lZCBpbnQgKnNnX2xlbikKKwkJCSAgIHVuc2lnbmVkIGludCAqc2dfbGVuLCBpbnQgbWluX3NnX2xlbikKIHsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHN6ID0gc2l6ZTsKIAogCXNnX2luaXRfdGFibGUoc2dsaXN0LCBtYXhfc2Vncyk7CisJaWYgKG1pbl9zZ19sZW4gPiBtYXhfc2VncykKKwkJbWluX3NnX2xlbiA9IG1heF9zZWdzOwogCiAJKnNnX2xlbiA9IDA7CiAJZG8gewogCQlmb3IgKGkgPSAwOyBpIDwgbWVtLT5jbnQ7IGkrKykgewogCQkJdW5zaWduZWQgbG9uZyBsZW4gPSBQQUdFX1NJWkUgPDwgbWVtLT5hcnJbaV0ub3JkZXI7CiAKKwkJCWlmIChtaW5fc2dfbGVuICYmIChzaXplIC8gbWluX3NnX2xlbiA8IGxlbikpCisJCQkJbGVuID0gQUxJR04oc2l6ZSAvIG1pbl9zZ19sZW4sIDUxMik7CiAJCQlpZiAobGVuID4gc3opCiAJCQkJbGVuID0gc3o7CiAJCQlpZiAobGVuID4gbWF4X3NlZ19zeikKQEAgLTU1NCwxMSArNTgwLDEyIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogVHJhbnNmZXIgb2YgJXUgeCAldSBzZWN0b3JzICgldSB4ICV1JXMgS2lCKSB0b29rICIKIAkJCSAiJWx1LiUwOWx1IHNlY29uZHMgKCV1IGtCL3MsICV1IEtpQi9zLCAiCi0JCQkgIiV1LiUwMnUgSU9QUylcbiIsCisJCQkgIiV1LiUwMnUgSU9QUywgc2dfbGVuICVkKVxuIiwKIAkJCSBtbWNfaG9zdG5hbWUodGVzdC0+Y2FyZC0+aG9zdCksIGNvdW50LCBzZWN0b3JzLCBjb3VudCwKIAkJCSBzZWN0b3JzID4+IDEsIChzZWN0b3JzICYgMSA/ICIuNSIgOiAiIiksCiAJCQkgKHVuc2lnbmVkIGxvbmcpdHMudHZfc2VjLCAodW5zaWduZWQgbG9uZyl0cy50dl9uc2VjLAotCQkJIHJhdGUgLyAxMDAwLCByYXRlIC8gMTAyNCwgaW9wcyAvIDEwMCwgaW9wcyAlIDEwMCk7CisJCQkgcmF0ZSAvIDEwMDAsIHJhdGUgLyAxMDI0LCBpb3BzIC8gMTAwLCBpb3BzICUgMTAwLAorCQkJIHRlc3QtPmFyZWEuc2dfbGVuKTsKIAogCW1tY190ZXN0X3NhdmVfdHJhbnNmZXJfcmVzdWx0KHRlc3QsIGNvdW50LCBzZWN0b3JzLCB0cywgcmF0ZSwgaW9wcyk7CiB9CkBAIC02NjEsNyArNjg4LDcgQEAKICAqIENoZWNrcyB0aGF0IGEgbm9ybWFsIHRyYW5zZmVyIGRpZG4ndCBoYXZlIGFueSBlcnJvcnMKICAqLwogc3RhdGljIGludCBtbWNfdGVzdF9jaGVja19yZXN1bHQoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QsCi0Jc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCisJCQkJIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewogCWludCByZXQ7CiAKQEAgLTY4NSw2ICs3MTIsMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IG1tY190ZXN0X2NoZWNrX3Jlc3VsdF9hc3luYyhzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsCisJCQkJICAgICAgIHN0cnVjdCBtbWNfYXN5bmNfcmVxICphcmVxKQoreworCXN0cnVjdCBtbWNfdGVzdF9hc3luY19yZXEgKnRlc3RfYXN5bmMgPQorCQljb250YWluZXJfb2YoYXJlcSwgc3RydWN0IG1tY190ZXN0X2FzeW5jX3JlcSwgYXJlcSk7CisKKwltbWNfdGVzdF93YWl0X2J1c3kodGVzdF9hc3luYy0+dGVzdCk7CisKKwlyZXR1cm4gbW1jX3Rlc3RfY2hlY2tfcmVzdWx0KHRlc3RfYXN5bmMtPnRlc3QsIGFyZXEtPm1ycSk7Cit9CisKIC8qCiAgKiBDaGVja3MgdGhhdCBhICJzaG9ydCB0cmFuc2ZlciIgYmVoYXZlZCBhcyBleHBlY3RlZAogICovCkBAIC03MjAsNiArNzU4LDg1IEBACiB9CiAKIC8qCisgKiBUZXN0cyBub25ibG9jayB0cmFuc2ZlciB3aXRoIGNlcnRhaW4gcGFyYW1ldGVycworICovCitzdGF0aWMgdm9pZCBtbWNfdGVzdF9ub25ibG9ja19yZXNldChzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSwKKwkJCQkgICAgc3RydWN0IG1tY19jb21tYW5kICpjbWQsCisJCQkJICAgIHN0cnVjdCBtbWNfY29tbWFuZCAqc3RvcCwKKwkJCQkgICAgc3RydWN0IG1tY19kYXRhICpkYXRhKQoreworCW1lbXNldChtcnEsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX3JlcXVlc3QpKTsKKwltZW1zZXQoY21kLCAwLCBzaXplb2Yoc3RydWN0IG1tY19jb21tYW5kKSk7CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2RhdGEpKTsKKwltZW1zZXQoc3RvcCwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfY29tbWFuZCkpOworCisJbXJxLT5jbWQgPSBjbWQ7CisJbXJxLT5kYXRhID0gZGF0YTsKKwltcnEtPnN0b3AgPSBzdG9wOworfQorc3RhdGljIGludCBtbWNfdGVzdF9ub25ibG9ja190cmFuc2ZlcihzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCwKKwkJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBzZ19sZW4sCisJCQkJICAgICAgdW5zaWduZWQgZGV2X2FkZHIsIHVuc2lnbmVkIGJsb2NrcywKKwkJCQkgICAgICB1bnNpZ25lZCBibGtzeiwgaW50IHdyaXRlLCBpbnQgY291bnQpCit7CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycTE7CisJc3RydWN0IG1tY19jb21tYW5kIGNtZDE7CisJc3RydWN0IG1tY19jb21tYW5kIHN0b3AxOworCXN0cnVjdCBtbWNfZGF0YSBkYXRhMTsKKworCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEyOworCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQyOworCXN0cnVjdCBtbWNfY29tbWFuZCBzdG9wMjsKKwlzdHJ1Y3QgbW1jX2RhdGEgZGF0YTI7CisKKwlzdHJ1Y3QgbW1jX3Rlc3RfYXN5bmNfcmVxIHRlc3RfYXJlcVsyXTsKKwlzdHJ1Y3QgbW1jX2FzeW5jX3JlcSAqZG9uZV9hcmVxOworCXN0cnVjdCBtbWNfYXN5bmNfcmVxICpjdXJfYXJlcSA9ICZ0ZXN0X2FyZXFbMF0uYXJlcTsKKwlzdHJ1Y3QgbW1jX2FzeW5jX3JlcSAqb3RoZXJfYXJlcSA9ICZ0ZXN0X2FyZXFbMV0uYXJlcTsKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJdGVzdF9hcmVxWzBdLnRlc3QgPSB0ZXN0OworCXRlc3RfYXJlcVsxXS50ZXN0ID0gdGVzdDsKKworCW1tY190ZXN0X25vbmJsb2NrX3Jlc2V0KCZtcnExLCAmY21kMSwgJnN0b3AxLCAmZGF0YTEpOworCW1tY190ZXN0X25vbmJsb2NrX3Jlc2V0KCZtcnEyLCAmY21kMiwgJnN0b3AyLCAmZGF0YTIpOworCisJY3VyX2FyZXEtPm1ycSA9ICZtcnExOworCWN1cl9hcmVxLT5lcnJfY2hlY2sgPSBtbWNfdGVzdF9jaGVja19yZXN1bHRfYXN5bmM7CisJb3RoZXJfYXJlcS0+bXJxID0gJm1ycTI7CisJb3RoZXJfYXJlcS0+ZXJyX2NoZWNrID0gbW1jX3Rlc3RfY2hlY2tfcmVzdWx0X2FzeW5jOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJbW1jX3Rlc3RfcHJlcGFyZV9tcnEodGVzdCwgY3VyX2FyZXEtPm1ycSwgc2csIHNnX2xlbiwgZGV2X2FkZHIsCisJCQkJICAgICBibG9ja3MsIGJsa3N6LCB3cml0ZSk7CisJCWRvbmVfYXJlcSA9IG1tY19zdGFydF9yZXEodGVzdC0+Y2FyZC0+aG9zdCwgY3VyX2FyZXEsICZyZXQpOworCisJCWlmIChyZXQgfHwgKCFkb25lX2FyZXEgJiYgaSA+IDApKQorCQkJZ290byBlcnI7CisKKwkJaWYgKGRvbmVfYXJlcSkgeworCQkJaWYgKGRvbmVfYXJlcS0+bXJxID09ICZtcnEyKQorCQkJCW1tY190ZXN0X25vbmJsb2NrX3Jlc2V0KCZtcnEyLCAmY21kMiwKKwkJCQkJCQkmc3RvcDIsICZkYXRhMik7CisJCQllbHNlCisJCQkJbW1jX3Rlc3Rfbm9uYmxvY2tfcmVzZXQoJm1ycTEsICZjbWQxLAorCQkJCQkJCSZzdG9wMSwgJmRhdGExKTsKKwkJfQorCQlkb25lX2FyZXEgPSBjdXJfYXJlcTsKKwkJY3VyX2FyZXEgPSBvdGhlcl9hcmVxOworCQlvdGhlcl9hcmVxID0gZG9uZV9hcmVxOworCQlkZXZfYWRkciArPSBibG9ja3M7CisJfQorCisJZG9uZV9hcmVxID0gbW1jX3N0YXJ0X3JlcSh0ZXN0LT5jYXJkLT5ob3N0LCBOVUxMLCAmcmV0KTsKKworCXJldHVybiByZXQ7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIFRlc3RzIGEgYmFzaWMgdHJhbnNmZXIgd2l0aCBjZXJ0YWluIHBhcmFtZXRlcnMKICAqLwogc3RhdGljIGludCBtbWNfdGVzdF9zaW1wbGVfdHJhbnNmZXIoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QsCkBAIC0xMzAyLDcgKzE0MTksNyBAQAogICogTWFwIHN6IGJ5dGVzIHNvIHRoYXQgaXQgY2FuIGJlIHRyYW5zZmVycmVkLgogICovCiBzdGF0aWMgaW50IG1tY190ZXN0X2FyZWFfbWFwKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0LCB1bnNpZ25lZCBsb25nIHN6LAotCQkJICAgICBpbnQgbWF4X3NjYXR0ZXIpCisJCQkgICAgIGludCBtYXhfc2NhdHRlciwgaW50IG1pbl9zZ19sZW4pCiB7CiAJc3RydWN0IG1tY190ZXN0X2FyZWEgKnQgPSAmdGVzdC0+YXJlYTsKIAlpbnQgZXJyOwpAQCAtMTMxNSw3ICsxNDMyLDcgQEAKIAkJCQkgICAgICAgJnQtPnNnX2xlbik7CiAJfSBlbHNlIHsKIAkJZXJyID0gbW1jX3Rlc3RfbWFwX3NnKHQtPm1lbSwgc3osIHQtPnNnLCAxLCB0LT5tYXhfc2VncywKLQkJCQkgICAgICB0LT5tYXhfc2VnX3N6LCAmdC0+c2dfbGVuKTsKKwkJCQkgICAgICB0LT5tYXhfc2VnX3N6LCAmdC0+c2dfbGVuLCBtaW5fc2dfbGVuKTsKIAl9CiAJaWYgKGVycikKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBtYXAgc2cgbGlzdFxuIiwKQEAgLTEzMzYsMTQgKzE0NTMsMTcgQEAKIH0KIAogLyoKLSAqIE1hcCBhbmQgdHJhbnNmZXIgYnl0ZXMuCisgKiBNYXAgYW5kIHRyYW5zZmVyIGJ5dGVzIGZvciBtdWx0aXBsZSB0cmFuc2ZlcnMuCiAgKi8KLXN0YXRpYyBpbnQgbW1jX3Rlc3RfYXJlYV9pbyhzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCwgdW5zaWduZWQgbG9uZyBzeiwKLQkJCSAgICB1bnNpZ25lZCBpbnQgZGV2X2FkZHIsIGludCB3cml0ZSwgaW50IG1heF9zY2F0dGVyLAotCQkJICAgIGludCB0aW1lZCkKK3N0YXRpYyBpbnQgbW1jX3Rlc3RfYXJlYV9pb19zZXEoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QsIHVuc2lnbmVkIGxvbmcgc3osCisJCQkJdW5zaWduZWQgaW50IGRldl9hZGRyLCBpbnQgd3JpdGUsCisJCQkJaW50IG1heF9zY2F0dGVyLCBpbnQgdGltZWQsIGludCBjb3VudCwKKwkJCQlib29sIG5vbmJsb2NrLCBpbnQgbWluX3NnX2xlbikKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHMxLCB0czI7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3QgbW1jX3Rlc3RfYXJlYSAqdCA9ICZ0ZXN0LT5hcmVhOwogCiAJLyoKIAkgKiBJbiB0aGUgY2FzZSBvZiBhIG1heGltYWxseSBzY2F0dGVyZWQgdHJhbnNmZXIsIHRoZSBtYXhpbXVtIHRyYW5zZmVyCkBAIC0xMzYxLDE0ICsxNDgxLDIxIEBACiAJCQlzeiA9IG1heF90ZnI7CiAJfQogCi0JcmV0ID0gbW1jX3Rlc3RfYXJlYV9tYXAodGVzdCwgc3osIG1heF9zY2F0dGVyKTsKKwlyZXQgPSBtbWNfdGVzdF9hcmVhX21hcCh0ZXN0LCBzeiwgbWF4X3NjYXR0ZXIsIG1pbl9zZ19sZW4pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAodGltZWQpCiAJCWdldG5zdGltZW9mZGF5KCZ0czEpOworCWlmIChub25ibG9jaykKKwkJcmV0ID0gbW1jX3Rlc3Rfbm9uYmxvY2tfdHJhbnNmZXIodGVzdCwgdC0+c2csIHQtPnNnX2xlbiwKKwkJCQkgZGV2X2FkZHIsIHQtPmJsb2NrcywgNTEyLCB3cml0ZSwgY291bnQpOworCWVsc2UKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50ICYmIHJldCA9PSAwOyBpKyspIHsKKwkJCXJldCA9IG1tY190ZXN0X2FyZWFfdHJhbnNmZXIodGVzdCwgZGV2X2FkZHIsIHdyaXRlKTsKKwkJCWRldl9hZGRyICs9IHN6ID4+IDk7CisJCX0KIAotCXJldCA9IG1tY190ZXN0X2FyZWFfdHJhbnNmZXIodGVzdCwgZGV2X2FkZHIsIHdyaXRlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMzc2LDExICsxNTAzLDE5IEBACiAJCWdldG5zdGltZW9mZGF5KCZ0czIpOwogCiAJaWYgKHRpbWVkKQotCQltbWNfdGVzdF9wcmludF9yYXRlKHRlc3QsIHN6LCAmdHMxLCAmdHMyKTsKKwkJbW1jX3Rlc3RfcHJpbnRfYXZnX3JhdGUodGVzdCwgc3osIGNvdW50LCAmdHMxLCAmdHMyKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1tY190ZXN0X2FyZWFfaW8oc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QsIHVuc2lnbmVkIGxvbmcgc3osCisJCQkgICAgdW5zaWduZWQgaW50IGRldl9hZGRyLCBpbnQgd3JpdGUsIGludCBtYXhfc2NhdHRlciwKKwkJCSAgICBpbnQgdGltZWQpCit7CisJcmV0dXJuIG1tY190ZXN0X2FyZWFfaW9fc2VxKHRlc3QsIHN6LCBkZXZfYWRkciwgd3JpdGUsIG1heF9zY2F0dGVyLAorCQkJCSAgICB0aW1lZCwgMSwgZmFsc2UsIDApOworfQorCiAvKgogICogV3JpdGUgdGhlIHRlc3QgYXJlYSBlbnRpcmVseS4KICAqLwpAQCAtMTk1NCw2ICsyMDg5LDI0NSBAQAogCXJldHVybiBtbWNfdGVzdF9sYXJnZV9zZXFfcGVyZih0ZXN0LCAxKTsKIH0KIAorc3RhdGljIGludCBtbWNfdGVzdF9yd19tdWx0aXBsZShzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCwKKwkJCQlzdHJ1Y3QgbW1jX3Rlc3RfbXVsdGlwbGVfcncgKnRkYXRhLAorCQkJCXVuc2lnbmVkIGludCByZXFzaXplLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQlpbnQgbWluX3NnX2xlbikKK3sKKwl1bnNpZ25lZCBpbnQgZGV2X2FkZHI7CisJc3RydWN0IG1tY190ZXN0X2FyZWEgKnQgPSAmdGVzdC0+YXJlYTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFNldCB1cCB0ZXN0IGFyZWEgKi8KKwlpZiAoc2l6ZSA+IG1tY190ZXN0X2NhcGFjaXR5KHRlc3QtPmNhcmQpIC8gMiAqIDUxMikKKwkJc2l6ZSA9IG1tY190ZXN0X2NhcGFjaXR5KHRlc3QtPmNhcmQpIC8gMiAqIDUxMjsKKwlpZiAocmVxc2l6ZSA+IHQtPm1heF90ZnIpCisJCXJlcXNpemUgPSB0LT5tYXhfdGZyOworCWRldl9hZGRyID0gbW1jX3Rlc3RfY2FwYWNpdHkodGVzdC0+Y2FyZCkgLyA0OworCWlmICgoZGV2X2FkZHIgJiAweGZmZmYwMDAwKSkKKwkJZGV2X2FkZHIgJj0gMHhmZmZmMDAwMDsgLyogUm91bmQgdG8gNjRNaUIgYm91bmRhcnkgKi8KKwllbHNlCisJCWRldl9hZGRyICY9IDB4ZmZmZmY4MDA7IC8qIFJvdW5kIHRvIDFNaUIgYm91bmRhcnkgKi8KKwlpZiAoIWRldl9hZGRyKQorCQlnb3RvIGVycjsKKworCWlmIChyZXFzaXplID4gc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBwcmVwYXJlIHRlc3QgYXJlYSAqLworCWlmIChtbWNfY2FuX2VyYXNlKHRlc3QtPmNhcmQpICYmCisJICAgIHRkYXRhLT5wcmVwYXJlICYgTU1DX1RFU1RfUFJFUF9FUkFTRSkgeworCQlyZXQgPSBtbWNfZXJhc2UodGVzdC0+Y2FyZCwgZGV2X2FkZHIsCisJCQkJc2l6ZSAvIDUxMiwgTU1DX1NFQ1VSRV9FUkFTRV9BUkcpOworCQlpZiAocmV0KQorCQkJcmV0ID0gbW1jX2VyYXNlKHRlc3QtPmNhcmQsIGRldl9hZGRyLAorCQkJCQlzaXplIC8gNTEyLCBNTUNfRVJBU0VfQVJHKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0KKworCS8qIFJ1biB0ZXN0ICovCisJcmV0ID0gbW1jX3Rlc3RfYXJlYV9pb19zZXEodGVzdCwgcmVxc2l6ZSwgZGV2X2FkZHIsCisJCQkJICAgdGRhdGEtPmRvX3dyaXRlLCAwLCAxLCBzaXplIC8gcmVxc2l6ZSwKKwkJCQkgICB0ZGF0YS0+ZG9fbm9uYmxvY2tfcmVxLCBtaW5fc2dfbGVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldHVybiByZXQ7CisgZXJyOgorCXByaW50ayhLRVJOX0lORk8gIlslc10gZXJyb3JcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1tY190ZXN0X3J3X211bHRpcGxlX3NpemUoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QsCisJCQkJICAgICBzdHJ1Y3QgbW1jX3Rlc3RfbXVsdGlwbGVfcncgKnJ3KQoreworCWludCByZXQgPSAwOworCWludCBpOworCXZvaWQgKnByZV9yZXEgPSB0ZXN0LT5jYXJkLT5ob3N0LT5vcHMtPnByZV9yZXE7CisJdm9pZCAqcG9zdF9yZXEgPSB0ZXN0LT5jYXJkLT5ob3N0LT5vcHMtPnBvc3RfcmVxOworCisJaWYgKHJ3LT5kb19ub25ibG9ja19yZXEgJiYKKwkgICAgKCghcHJlX3JlcSAmJiBwb3N0X3JlcSkgfHwgKHByZV9yZXEgJiYgIXBvc3RfcmVxKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZXJyb3I6IG9ubHkgb25lIG9mIHByZS9wb3N0IGlzIGRlZmluZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGkgPSAwIDsgaSA8IHJ3LT5sZW4gJiYgcmV0ID09IDA7IGkrKykgeworCQlyZXQgPSBtbWNfdGVzdF9yd19tdWx0aXBsZSh0ZXN0LCBydywgcnctPmJzW2ldLCBydy0+c2l6ZSwgMCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtbWNfdGVzdF9yd19tdWx0aXBsZV9zZ19sZW4oc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QsCisJCQkJICAgICAgIHN0cnVjdCBtbWNfdGVzdF9tdWx0aXBsZV9ydyAqcncpCit7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IHJ3LT5sZW4gJiYgcmV0ID09IDA7IGkrKykgeworCQlyZXQgPSBtbWNfdGVzdF9yd19tdWx0aXBsZSh0ZXN0LCBydywgNTEyKjEwMjQsIHJ3LT5zaXplLAorCQkJCQkgICBydy0+c2dfbGVuW2ldKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTXVsdGlwbGUgYmxvY2tpbmcgd3JpdGUgNGsgdG8gNCBNQiBjaHVua3MKKyAqLworc3RhdGljIGludCBtbWNfdGVzdF9wcm9maWxlX211bHRfd3JpdGVfYmxvY2tpbmdfcGVyZihzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCkKK3sKKwl1bnNpZ25lZCBpbnQgYnNbXSA9IHsxIDw8IDEyLCAxIDw8IDEzLCAxIDw8IDE0LCAxIDw8IDE1LCAxIDw8IDE2LAorCQkJICAgICAxIDw8IDE3LCAxIDw8IDE4LCAxIDw8IDE5LCAxIDw8IDIwLCAxIDw8IDIyfTsKKwlzdHJ1Y3QgbW1jX3Rlc3RfbXVsdGlwbGVfcncgdGVzdF9kYXRhID0geworCQkuYnMgPSBicywKKwkJLnNpemUgPSBURVNUX0FSRUFfTUFYX1NJWkUsCisJCS5sZW4gPSBBUlJBWV9TSVpFKGJzKSwKKwkJLmRvX3dyaXRlID0gdHJ1ZSwKKwkJLmRvX25vbmJsb2NrX3JlcSA9IGZhbHNlLAorCQkucHJlcGFyZSA9IE1NQ19URVNUX1BSRVBfRVJBU0UsCisJfTsKKworCXJldHVybiBtbWNfdGVzdF9yd19tdWx0aXBsZV9zaXplKHRlc3QsICZ0ZXN0X2RhdGEpOworfTsKKworLyoKKyAqIE11bHRpcGxlIG5vbi1ibG9ja2luZyB3cml0ZSA0ayB0byA0IE1CIGNodW5rcworICovCitzdGF0aWMgaW50IG1tY190ZXN0X3Byb2ZpbGVfbXVsdF93cml0ZV9ub25ibG9ja19wZXJmKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXVuc2lnbmVkIGludCBic1tdID0gezEgPDwgMTIsIDEgPDwgMTMsIDEgPDwgMTQsIDEgPDwgMTUsIDEgPDwgMTYsCisJCQkgICAgIDEgPDwgMTcsIDEgPDwgMTgsIDEgPDwgMTksIDEgPDwgMjAsIDEgPDwgMjJ9OworCXN0cnVjdCBtbWNfdGVzdF9tdWx0aXBsZV9ydyB0ZXN0X2RhdGEgPSB7CisJCS5icyA9IGJzLAorCQkuc2l6ZSA9IFRFU1RfQVJFQV9NQVhfU0laRSwKKwkJLmxlbiA9IEFSUkFZX1NJWkUoYnMpLAorCQkuZG9fd3JpdGUgPSB0cnVlLAorCQkuZG9fbm9uYmxvY2tfcmVxID0gdHJ1ZSwKKwkJLnByZXBhcmUgPSBNTUNfVEVTVF9QUkVQX0VSQVNFLAorCX07CisKKwlyZXR1cm4gbW1jX3Rlc3RfcndfbXVsdGlwbGVfc2l6ZSh0ZXN0LCAmdGVzdF9kYXRhKTsKK30KKworLyoKKyAqIE11bHRpcGxlIGJsb2NraW5nIHJlYWQgNGsgdG8gNCBNQiBjaHVua3MKKyAqLworc3RhdGljIGludCBtbWNfdGVzdF9wcm9maWxlX211bHRfcmVhZF9ibG9ja2luZ19wZXJmKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXVuc2lnbmVkIGludCBic1tdID0gezEgPDwgMTIsIDEgPDwgMTMsIDEgPDwgMTQsIDEgPDwgMTUsIDEgPDwgMTYsCisJCQkgICAgIDEgPDwgMTcsIDEgPDwgMTgsIDEgPDwgMTksIDEgPDwgMjAsIDEgPDwgMjJ9OworCXN0cnVjdCBtbWNfdGVzdF9tdWx0aXBsZV9ydyB0ZXN0X2RhdGEgPSB7CisJCS5icyA9IGJzLAorCQkuc2l6ZSA9IFRFU1RfQVJFQV9NQVhfU0laRSwKKwkJLmxlbiA9IEFSUkFZX1NJWkUoYnMpLAorCQkuZG9fd3JpdGUgPSBmYWxzZSwKKwkJLmRvX25vbmJsb2NrX3JlcSA9IGZhbHNlLAorCQkucHJlcGFyZSA9IE1NQ19URVNUX1BSRVBfTk9ORSwKKwl9OworCisJcmV0dXJuIG1tY190ZXN0X3J3X211bHRpcGxlX3NpemUodGVzdCwgJnRlc3RfZGF0YSk7Cit9CisKKy8qCisgKiBNdWx0aXBsZSBub24tYmxvY2tpbmcgcmVhZCA0ayB0byA0IE1CIGNodW5rcworICovCitzdGF0aWMgaW50IG1tY190ZXN0X3Byb2ZpbGVfbXVsdF9yZWFkX25vbmJsb2NrX3BlcmYoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCit7CisJdW5zaWduZWQgaW50IGJzW10gPSB7MSA8PCAxMiwgMSA8PCAxMywgMSA8PCAxNCwgMSA8PCAxNSwgMSA8PCAxNiwKKwkJCSAgICAgMSA8PCAxNywgMSA8PCAxOCwgMSA8PCAxOSwgMSA8PCAyMCwgMSA8PCAyMn07CisJc3RydWN0IG1tY190ZXN0X211bHRpcGxlX3J3IHRlc3RfZGF0YSA9IHsKKwkJLmJzID0gYnMsCisJCS5zaXplID0gVEVTVF9BUkVBX01BWF9TSVpFLAorCQkubGVuID0gQVJSQVlfU0laRShicyksCisJCS5kb193cml0ZSA9IGZhbHNlLAorCQkuZG9fbm9uYmxvY2tfcmVxID0gdHJ1ZSwKKwkJLnByZXBhcmUgPSBNTUNfVEVTVF9QUkVQX05PTkUsCisJfTsKKworCXJldHVybiBtbWNfdGVzdF9yd19tdWx0aXBsZV9zaXplKHRlc3QsICZ0ZXN0X2RhdGEpOworfQorCisvKgorICogTXVsdGlwbGUgYmxvY2tpbmcgd3JpdGUgMSB0byA1MTIgc2cgZWxlbWVudHMKKyAqLworc3RhdGljIGludCBtbWNfdGVzdF9wcm9maWxlX3NnbGVuX3dyX2Jsb2NraW5nX3BlcmYoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCit7CisJdW5zaWduZWQgaW50IHNnX2xlbltdID0gezEsIDEgPDwgMywgMSA8PCA0LCAxIDw8IDUsIDEgPDwgNiwKKwkJCQkgMSA8PCA3LCAxIDw8IDgsIDEgPDwgOX07CisJc3RydWN0IG1tY190ZXN0X211bHRpcGxlX3J3IHRlc3RfZGF0YSA9IHsKKwkJLnNnX2xlbiA9IHNnX2xlbiwKKwkJLnNpemUgPSBURVNUX0FSRUFfTUFYX1NJWkUsCisJCS5sZW4gPSBBUlJBWV9TSVpFKHNnX2xlbiksCisJCS5kb193cml0ZSA9IHRydWUsCisJCS5kb19ub25ibG9ja19yZXEgPSBmYWxzZSwKKwkJLnByZXBhcmUgPSBNTUNfVEVTVF9QUkVQX0VSQVNFLAorCX07CisKKwlyZXR1cm4gbW1jX3Rlc3RfcndfbXVsdGlwbGVfc2dfbGVuKHRlc3QsICZ0ZXN0X2RhdGEpOworfTsKKworLyoKKyAqIE11bHRpcGxlIG5vbi1ibG9ja2luZyB3cml0ZSAxIHRvIDUxMiBzZyBlbGVtZW50cworICovCitzdGF0aWMgaW50IG1tY190ZXN0X3Byb2ZpbGVfc2dsZW5fd3Jfbm9uYmxvY2tfcGVyZihzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCkKK3sKKwl1bnNpZ25lZCBpbnQgc2dfbGVuW10gPSB7MSwgMSA8PCAzLCAxIDw8IDQsIDEgPDwgNSwgMSA8PCA2LAorCQkJCSAxIDw8IDcsIDEgPDwgOCwgMSA8PCA5fTsKKwlzdHJ1Y3QgbW1jX3Rlc3RfbXVsdGlwbGVfcncgdGVzdF9kYXRhID0geworCQkuc2dfbGVuID0gc2dfbGVuLAorCQkuc2l6ZSA9IFRFU1RfQVJFQV9NQVhfU0laRSwKKwkJLmxlbiA9IEFSUkFZX1NJWkUoc2dfbGVuKSwKKwkJLmRvX3dyaXRlID0gdHJ1ZSwKKwkJLmRvX25vbmJsb2NrX3JlcSA9IHRydWUsCisJCS5wcmVwYXJlID0gTU1DX1RFU1RfUFJFUF9FUkFTRSwKKwl9OworCisJcmV0dXJuIG1tY190ZXN0X3J3X211bHRpcGxlX3NnX2xlbih0ZXN0LCAmdGVzdF9kYXRhKTsKK30KKworLyoKKyAqIE11bHRpcGxlIGJsb2NraW5nIHJlYWQgMSB0byA1MTIgc2cgZWxlbWVudHMKKyAqLworc3RhdGljIGludCBtbWNfdGVzdF9wcm9maWxlX3NnbGVuX3JfYmxvY2tpbmdfcGVyZihzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCkKK3sKKwl1bnNpZ25lZCBpbnQgc2dfbGVuW10gPSB7MSwgMSA8PCAzLCAxIDw8IDQsIDEgPDwgNSwgMSA8PCA2LAorCQkJCSAxIDw8IDcsIDEgPDwgOCwgMSA8PCA5fTsKKwlzdHJ1Y3QgbW1jX3Rlc3RfbXVsdGlwbGVfcncgdGVzdF9kYXRhID0geworCQkuc2dfbGVuID0gc2dfbGVuLAorCQkuc2l6ZSA9IFRFU1RfQVJFQV9NQVhfU0laRSwKKwkJLmxlbiA9IEFSUkFZX1NJWkUoc2dfbGVuKSwKKwkJLmRvX3dyaXRlID0gZmFsc2UsCisJCS5kb19ub25ibG9ja19yZXEgPSBmYWxzZSwKKwkJLnByZXBhcmUgPSBNTUNfVEVTVF9QUkVQX05PTkUsCisJfTsKKworCXJldHVybiBtbWNfdGVzdF9yd19tdWx0aXBsZV9zZ19sZW4odGVzdCwgJnRlc3RfZGF0YSk7Cit9CisKKy8qCisgKiBNdWx0aXBsZSBub24tYmxvY2tpbmcgcmVhZCAxIHRvIDUxMiBzZyBlbGVtZW50cworICovCitzdGF0aWMgaW50IG1tY190ZXN0X3Byb2ZpbGVfc2dsZW5fcl9ub25ibG9ja19wZXJmKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXVuc2lnbmVkIGludCBzZ19sZW5bXSA9IHsxLCAxIDw8IDMsIDEgPDwgNCwgMSA8PCA1LCAxIDw8IDYsCisJCQkJIDEgPDwgNywgMSA8PCA4LCAxIDw8IDl9OworCXN0cnVjdCBtbWNfdGVzdF9tdWx0aXBsZV9ydyB0ZXN0X2RhdGEgPSB7CisJCS5zZ19sZW4gPSBzZ19sZW4sCisJCS5zaXplID0gVEVTVF9BUkVBX01BWF9TSVpFLAorCQkubGVuID0gQVJSQVlfU0laRShzZ19sZW4pLAorCQkuZG9fd3JpdGUgPSBmYWxzZSwKKwkJLmRvX25vbmJsb2NrX3JlcSA9IHRydWUsCisJCS5wcmVwYXJlID0gTU1DX1RFU1RfUFJFUF9OT05FLAorCX07CisKKwlyZXR1cm4gbW1jX3Rlc3RfcndfbXVsdGlwbGVfc2dfbGVuKHRlc3QsICZ0ZXN0X2RhdGEpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1tY190ZXN0X2Nhc2UgbW1jX3Rlc3RfY2FzZXNbXSA9IHsKIAl7CiAJCS5uYW1lID0gIkJhc2ljIHdyaXRlIChubyBkYXRhIHZlcmlmaWNhdGlvbikiLApAQCAtMjIyMSw2ICsyNTk1LDYxIEBACiAJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAogCX0sCiAKKwl7CisJCS5uYW1lID0gIldyaXRlIHBlcmZvcm1hbmNlIHdpdGggYmxvY2tpbmcgcmVxIDRrIHRvIDRNQiIsCisJCS5wcmVwYXJlID0gbW1jX3Rlc3RfYXJlYV9wcmVwYXJlLAorCQkucnVuID0gbW1jX3Rlc3RfcHJvZmlsZV9tdWx0X3dyaXRlX2Jsb2NraW5nX3BlcmYsCisJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAorCX0sCisKKwl7CisJCS5uYW1lID0gIldyaXRlIHBlcmZvcm1hbmNlIHdpdGggbm9uLWJsb2NraW5nIHJlcSA0ayB0byA0TUIiLAorCQkucHJlcGFyZSA9IG1tY190ZXN0X2FyZWFfcHJlcGFyZSwKKwkJLnJ1biA9IG1tY190ZXN0X3Byb2ZpbGVfbXVsdF93cml0ZV9ub25ibG9ja19wZXJmLAorCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKKwl9LAorCisJeworCQkubmFtZSA9ICJSZWFkIHBlcmZvcm1hbmNlIHdpdGggYmxvY2tpbmcgcmVxIDRrIHRvIDRNQiIsCisJCS5wcmVwYXJlID0gbW1jX3Rlc3RfYXJlYV9wcmVwYXJlLAorCQkucnVuID0gbW1jX3Rlc3RfcHJvZmlsZV9tdWx0X3JlYWRfYmxvY2tpbmdfcGVyZiwKKwkJLmNsZWFudXAgPSBtbWNfdGVzdF9hcmVhX2NsZWFudXAsCisJfSwKKworCXsKKwkJLm5hbWUgPSAiUmVhZCBwZXJmb3JtYW5jZSB3aXRoIG5vbi1ibG9ja2luZyByZXEgNGsgdG8gNE1CIiwKKwkJLnByZXBhcmUgPSBtbWNfdGVzdF9hcmVhX3ByZXBhcmUsCisJCS5ydW4gPSBtbWNfdGVzdF9wcm9maWxlX211bHRfcmVhZF9ub25ibG9ja19wZXJmLAorCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKKwl9LAorCisJeworCQkubmFtZSA9ICJXcml0ZSBwZXJmb3JtYW5jZSBibG9ja2luZyByZXEgMSB0byA1MTIgc2cgZWxlbXMiLAorCQkucHJlcGFyZSA9IG1tY190ZXN0X2FyZWFfcHJlcGFyZSwKKwkJLnJ1biA9IG1tY190ZXN0X3Byb2ZpbGVfc2dsZW5fd3JfYmxvY2tpbmdfcGVyZiwKKwkJLmNsZWFudXAgPSBtbWNfdGVzdF9hcmVhX2NsZWFudXAsCisJfSwKKworCXsKKwkJLm5hbWUgPSAiV3JpdGUgcGVyZm9ybWFuY2Ugbm9uLWJsb2NraW5nIHJlcSAxIHRvIDUxMiBzZyBlbGVtcyIsCisJCS5wcmVwYXJlID0gbW1jX3Rlc3RfYXJlYV9wcmVwYXJlLAorCQkucnVuID0gbW1jX3Rlc3RfcHJvZmlsZV9zZ2xlbl93cl9ub25ibG9ja19wZXJmLAorCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKKwl9LAorCisJeworCQkubmFtZSA9ICJSZWFkIHBlcmZvcm1hbmNlIGJsb2NraW5nIHJlcSAxIHRvIDUxMiBzZyBlbGVtcyIsCisJCS5wcmVwYXJlID0gbW1jX3Rlc3RfYXJlYV9wcmVwYXJlLAorCQkucnVuID0gbW1jX3Rlc3RfcHJvZmlsZV9zZ2xlbl9yX2Jsb2NraW5nX3BlcmYsCisJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAorCX0sCisKKwl7CisJCS5uYW1lID0gIlJlYWQgcGVyZm9ybWFuY2Ugbm9uLWJsb2NraW5nIHJlcSAxIHRvIDUxMiBzZyBlbGVtcyIsCisJCS5wcmVwYXJlID0gbW1jX3Rlc3RfYXJlYV9wcmVwYXJlLAorCQkucnVuID0gbW1jX3Rlc3RfcHJvZmlsZV9zZ2xlbl9yX25vbmJsb2NrX3BlcmYsCisJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAorCX0sCiB9OwogCiBzdGF0aWMgREVGSU5FX01VVEVYKG1tY190ZXN0X2xvY2spOwpAQCAtMjQ0NSw2ICsyODc0LDMyIEBACiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKK3N0YXRpYyBpbnQgbXRmX3Rlc3RsaXN0X3Nob3coc3RydWN0IHNlcV9maWxlICpzZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJm1tY190ZXN0X2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW1jX3Rlc3RfY2FzZXMpOyBpKyspCisJCXNlcV9wcmludGYoc2YsICIlZDpcdCVzXG4iLCBpKzEsIG1tY190ZXN0X2Nhc2VzW2ldLm5hbWUpOworCisJbXV0ZXhfdW5sb2NrKCZtbWNfdGVzdF9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10Zl90ZXN0bGlzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBtdGZfdGVzdGxpc3Rfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1tY190ZXN0X2ZvcHNfdGVzdGxpc3QgPSB7CisJLm9wZW4JCT0gbXRmX3Rlc3RsaXN0X29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKIHN0YXRpYyB2b2lkIG1tY190ZXN0X2ZyZWVfZmlsZV90ZXN0KHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKIHsKIAlzdHJ1Y3QgbW1jX3Rlc3RfZGJnZnNfZmlsZSAqZGYsICpkZnM7CkBAIC0yNDc2LDcgKzI5MzEsMTggQEAKIAogCWlmIChJU19FUlJfT1JfTlVMTChmaWxlKSkgewogCQlkZXZfZXJyKCZjYXJkLT5kZXYsCi0JCQkiQ2FuJ3QgY3JlYXRlIGZpbGUuIFBlcmhhcHMgZGVidWdmcyBpcyBkaXNhYmxlZC5cbiIpOworCQkJIkNhbid0IGNyZWF0ZSB0ZXN0LiBQZXJoYXBzIGRlYnVnZnMgaXMgZGlzYWJsZWQuXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGNhcmQtPmRlYnVnZnNfcm9vdCkKKwkJZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRlc3RsaXN0IiwgU19JUlVHTywKKwkJCWNhcmQtPmRlYnVnZnNfcm9vdCwgY2FyZCwgJm1tY190ZXN0X2ZvcHNfdGVzdGxpc3QpOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGZpbGUpKSB7CisJCWRldl9lcnIoJmNhcmQtPmRldiwKKwkJCSJDYW4ndCBjcmVhdGUgdGVzdGxpc3QuIFBlcmhhcHMgZGVidWdmcyBpcyBkaXNhYmxlZC5cbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMgYi9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKaW5kZXggYzA3MzIyYy4uNDVmYjM2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYwpAQCAtNTIsMTQgKzUyLDE4IEBACiAJZG93bigmbXEtPnRocmVhZF9zZW0pOwogCWRvIHsKIAkJc3RydWN0IHJlcXVlc3QgKnJlcSA9IE5VTEw7CisJCXN0cnVjdCBtbWNfcXVldWVfcmVxICp0bXA7CiAKIAkJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJcmVxID0gYmxrX2ZldGNoX3JlcXVlc3QocSk7Ci0JCW1xLT5yZXEgPSByZXE7CisJCW1xLT5tcXJxX2N1ci0+cmVxID0gcmVxOwogCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKLQkJaWYgKCFyZXEpIHsKKwkJaWYgKHJlcSB8fCBtcS0+bXFycV9wcmV2LT5yZXEpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQltcS0+aXNzdWVfZm4obXEsIHJlcSk7CisJCX0gZWxzZSB7CiAJCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJCQlicmVhazsKQEAgLTY3LDExICs3MSwxNCBAQAogCQkJdXAoJm1xLT50aHJlYWRfc2VtKTsKIAkJCXNjaGVkdWxlKCk7CiAJCQlkb3duKCZtcS0+dGhyZWFkX3NlbSk7Ci0JCQljb250aW51ZTsKIAkJfQotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCi0JCW1xLT5pc3N1ZV9mbihtcSwgcmVxKTsKKwkJLyogQ3VycmVudCByZXF1ZXN0IGJlY29tZXMgcHJldmlvdXMgcmVxdWVzdCBhbmQgdmljZSB2ZXJzYS4gKi8KKwkJbXEtPm1xcnFfcHJldi0+YnJxLm1ycS5kYXRhID0gTlVMTDsKKwkJbXEtPm1xcnFfcHJldi0+cmVxID0gTlVMTDsKKwkJdG1wID0gbXEtPm1xcnFfcHJldjsKKwkJbXEtPm1xcnFfcHJldiA9IG1xLT5tcXJxX2N1cjsKKwkJbXEtPm1xcnFfY3VyID0gdG1wOwogCX0gd2hpbGUgKDEpOwogCXVwKCZtcS0+dGhyZWFkX3NlbSk7CiAKQEAgLTk3LDIzICsxMDQsNjMgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICghbXEtPnJlcSkKKwlpZiAoIW1xLT5tcXJxX2N1ci0+cmVxICYmICFtcS0+bXFycV9wcmV2LT5yZXEpCiAJCXdha2VfdXBfcHJvY2VzcyhtcS0+dGhyZWFkKTsKIH0KIAorc3RydWN0IHNjYXR0ZXJsaXN0ICptbWNfYWxsb2Nfc2coaW50IHNnX2xlbiwgaW50ICplcnIpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKworCXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSpzZ19sZW4sIEdGUF9LRVJORUwpOworCWlmICghc2cpCisJCSplcnIgPSAtRU5PTUVNOworCWVsc2UgeworCQkqZXJyID0gMDsKKwkJc2dfaW5pdF90YWJsZShzZywgc2dfbGVuKTsKKwl9CisKKwlyZXR1cm4gc2c7Cit9CisKK3N0YXRpYyB2b2lkIG1tY19xdWV1ZV9zZXR1cF9kaXNjYXJkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAorCQkJCSAgICBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJdW5zaWduZWQgbWF4X2Rpc2NhcmQ7CisKKwltYXhfZGlzY2FyZCA9IG1tY19jYWxjX21heF9kaXNjYXJkKGNhcmQpOworCWlmICghbWF4X2Rpc2NhcmQpCisJCXJldHVybjsKKworCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfRElTQ0FSRCwgcSk7CisJcS0+bGltaXRzLm1heF9kaXNjYXJkX3NlY3RvcnMgPSBtYXhfZGlzY2FyZDsKKwlpZiAoY2FyZC0+ZXJhc2VkX2J5dGUgPT0gMCkKKwkJcS0+bGltaXRzLmRpc2NhcmRfemVyb2VzX2RhdGEgPSAxOworCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gY2FyZC0+cHJlZl9lcmFzZSA8PCA5OworCS8qIGdyYW51bGFyaXR5IG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBtYXguIGRpc2NhcmQgKi8KKwlpZiAoY2FyZC0+cHJlZl9lcmFzZSA+IG1heF9kaXNjYXJkKQorCQlxLT5saW1pdHMuZGlzY2FyZF9ncmFudWxhcml0eSA9IDA7CisJaWYgKG1tY19jYW5fc2VjdXJlX2VyYXNlX3RyaW0oY2FyZCkpCisJCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfU0VDRElTQ0FSRCwgcSk7Cit9CisKIC8qKgogICogbW1jX2luaXRfcXVldWUgLSBpbml0aWFsaXNlIGEgcXVldWUgc3RydWN0dXJlLgogICogQG1xOiBtbWMgcXVldWUKICAqIEBjYXJkOiBtbWMgY2FyZCB0byBhdHRhY2ggdGhpcyBxdWV1ZQogICogQGxvY2s6IHF1ZXVlIGxvY2sKKyAqIEBzdWJuYW1lOiBwYXJ0aXRpb24gc3VibmFtZQogICoKICAqIEluaXRpYWxpc2UgYSBNTUMgY2FyZCByZXF1ZXN0IHF1ZXVlLgogICovCi1pbnQgbW1jX2luaXRfcXVldWUoc3RydWN0IG1tY19xdWV1ZSAqbXEsIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgc3BpbmxvY2tfdCAqbG9jaykKK2ludCBtbWNfaW5pdF9xdWV1ZShzdHJ1Y3QgbW1jX3F1ZXVlICptcSwgc3RydWN0IG1tY19jYXJkICpjYXJkLAorCQkgICBzcGlubG9ja190ICpsb2NrLCBjb25zdCBjaGFyICpzdWJuYW1lKQogewogCXN0cnVjdCBtbWNfaG9zdCAqaG9zdCA9IGNhcmQtPmhvc3Q7CiAJdTY0IGxpbWl0ID0gQkxLX0JPVU5DRV9ISUdIOwogCWludCByZXQ7CisJc3RydWN0IG1tY19xdWV1ZV9yZXEgKm1xcnFfY3VyID0gJm1xLT5tcXJxWzBdOworCXN0cnVjdCBtbWNfcXVldWVfcmVxICptcXJxX3ByZXYgPSAmbXEtPm1xcnFbMV07CiAKIAlpZiAobW1jX2Rldihob3N0KS0+ZG1hX21hc2sgJiYgKm1tY19kZXYoaG9zdCktPmRtYV9tYXNrKQogCQlsaW1pdCA9ICptbWNfZGV2KGhvc3QpLT5kbWFfbWFzazsKQEAgLTEyMywyNiArMTcwLDE2IEBACiAJaWYgKCFtcS0+cXVldWUpCiAJCXJldHVybiAtRU5PTUVNOwogCisJbWVtc2V0KCZtcS0+bXFycV9jdXIsIDAsIHNpemVvZihtcS0+bXFycV9jdXIpKTsKKwltZW1zZXQoJm1xLT5tcXJxX3ByZXYsIDAsIHNpemVvZihtcS0+bXFycV9wcmV2KSk7CisJbXEtPm1xcnFfY3VyID0gbXFycV9jdXI7CisJbXEtPm1xcnFfcHJldiA9IG1xcnFfcHJldjsKIAltcS0+cXVldWUtPnF1ZXVlZGF0YSA9IG1xOwotCW1xLT5yZXEgPSBOVUxMOwogCiAJYmxrX3F1ZXVlX3ByZXBfcnEobXEtPnF1ZXVlLCBtbWNfcHJlcF9yZXF1ZXN0KTsKIAlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX05PTlJPVCwgbXEtPnF1ZXVlKTsKLQlpZiAobW1jX2Nhbl9lcmFzZShjYXJkKSkgewotCQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX0RJU0NBUkQsIG1xLT5xdWV1ZSk7Ci0JCW1xLT5xdWV1ZS0+bGltaXRzLm1heF9kaXNjYXJkX3NlY3RvcnMgPSBVSU5UX01BWDsKLQkJaWYgKGNhcmQtPmVyYXNlZF9ieXRlID09IDApCi0JCQltcS0+cXVldWUtPmxpbWl0cy5kaXNjYXJkX3plcm9lc19kYXRhID0gMTsKLQkJaWYgKCFtbWNfY2FuX3RyaW0oY2FyZCkgJiYgaXNfcG93ZXJfb2ZfMihjYXJkLT5lcmFzZV9zaXplKSkgewotCQkJbXEtPnF1ZXVlLT5saW1pdHMuZGlzY2FyZF9ncmFudWxhcml0eSA9Ci0JCQkJCQkJY2FyZC0+ZXJhc2Vfc2l6ZSA8PCA5OwotCQkJbXEtPnF1ZXVlLT5saW1pdHMuZGlzY2FyZF9hbGlnbm1lbnQgPQotCQkJCQkJCWNhcmQtPmVyYXNlX3NpemUgPDwgOTsKLQkJfQotCQlpZiAobW1jX2Nhbl9zZWN1cmVfZXJhc2VfdHJpbShjYXJkKSkKLQkJCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfU0VDRElTQ0FSRCwKLQkJCQkJCW1xLT5xdWV1ZSk7Ci0JfQorCWlmIChtbWNfY2FuX2VyYXNlKGNhcmQpKQorCQltbWNfcXVldWVfc2V0dXBfZGlzY2FyZChtcS0+cXVldWUsIGNhcmQpOwogCiAjaWZkZWYgQ09ORklHX01NQ19CTE9DS19CT1VOQ0UKIAlpZiAoaG9zdC0+bWF4X3NlZ3MgPT0gMSkgewpAQCAtMTU4LDU5ICsxOTUsNzAgQEAKIAkJCWJvdW5jZXN6ID0gaG9zdC0+bWF4X2Jsa19jb3VudCAqIDUxMjsKIAogCQlpZiAoYm91bmNlc3ogPiA1MTIpIHsKLQkJCW1xLT5ib3VuY2VfYnVmID0ga21hbGxvYyhib3VuY2VzeiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIW1xLT5ib3VuY2VfYnVmKSB7CisJCQltcXJxX2N1ci0+Ym91bmNlX2J1ZiA9IGttYWxsb2MoYm91bmNlc3osIEdGUF9LRVJORUwpOworCQkJaWYgKCFtcXJxX2N1ci0+Ym91bmNlX2J1ZikgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gIgotCQkJCQkiYWxsb2NhdGUgYm91bmNlIGJ1ZmZlclxuIiwKKwkJCQkJImFsbG9jYXRlIGJvdW5jZSBjdXIgYnVmZmVyXG4iLAogCQkJCQltbWNfY2FyZF9uYW1lKGNhcmQpKTsKIAkJCX0KKwkJCW1xcnFfcHJldi0+Ym91bmNlX2J1ZiA9IGttYWxsb2MoYm91bmNlc3osIEdGUF9LRVJORUwpOworCQkJaWYgKCFtcXJxX3ByZXYtPmJvdW5jZV9idWYpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvICIKKwkJCQkJImFsbG9jYXRlIGJvdW5jZSBwcmV2IGJ1ZmZlclxuIiwKKwkJCQkJbW1jX2NhcmRfbmFtZShjYXJkKSk7CisJCQkJa2ZyZWUobXFycV9jdXItPmJvdW5jZV9idWYpOworCQkJCW1xcnFfY3VyLT5ib3VuY2VfYnVmID0gTlVMTDsKKwkJCX0KIAkJfQogCi0JCWlmIChtcS0+Ym91bmNlX2J1ZikgeworCQlpZiAobXFycV9jdXItPmJvdW5jZV9idWYgJiYgbXFycV9wcmV2LT5ib3VuY2VfYnVmKSB7CiAJCQlibGtfcXVldWVfYm91bmNlX2xpbWl0KG1xLT5xdWV1ZSwgQkxLX0JPVU5DRV9BTlkpOwogCQkJYmxrX3F1ZXVlX21heF9od19zZWN0b3JzKG1xLT5xdWV1ZSwgYm91bmNlc3ogLyA1MTIpOwogCQkJYmxrX3F1ZXVlX21heF9zZWdtZW50cyhtcS0+cXVldWUsIGJvdW5jZXN6IC8gNTEyKTsKIAkJCWJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplKG1xLT5xdWV1ZSwgYm91bmNlc3opOwogCi0JCQltcS0+c2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpLAotCQkJCUdGUF9LRVJORUwpOwotCQkJaWYgKCFtcS0+c2cpIHsKLQkJCQlyZXQgPSAtRU5PTUVNOworCQkJbXFycV9jdXItPnNnID0gbW1jX2FsbG9jX3NnKDEsICZyZXQpOworCQkJaWYgKHJldCkKIAkJCQlnb3RvIGNsZWFudXBfcXVldWU7Ci0JCQl9Ci0JCQlzZ19pbml0X3RhYmxlKG1xLT5zZywgMSk7CiAKLQkJCW1xLT5ib3VuY2Vfc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpICoKLQkJCQlib3VuY2VzeiAvIDUxMiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIW1xLT5ib3VuY2Vfc2cpIHsKLQkJCQlyZXQgPSAtRU5PTUVNOworCQkJbXFycV9jdXItPmJvdW5jZV9zZyA9CisJCQkJbW1jX2FsbG9jX3NnKGJvdW5jZXN6IC8gNTEyLCAmcmV0KTsKKwkJCWlmIChyZXQpCiAJCQkJZ290byBjbGVhbnVwX3F1ZXVlOwotCQkJfQotCQkJc2dfaW5pdF90YWJsZShtcS0+Ym91bmNlX3NnLCBib3VuY2VzeiAvIDUxMik7CisKKwkJCW1xcnFfcHJldi0+c2cgPSBtbWNfYWxsb2Nfc2coMSwgJnJldCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gY2xlYW51cF9xdWV1ZTsKKworCQkJbXFycV9wcmV2LT5ib3VuY2Vfc2cgPQorCQkJCW1tY19hbGxvY19zZyhib3VuY2VzeiAvIDUxMiwgJnJldCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gY2xlYW51cF9xdWV1ZTsKIAkJfQogCX0KICNlbmRpZgogCi0JaWYgKCFtcS0+Ym91bmNlX2J1ZikgeworCWlmICghbXFycV9jdXItPmJvdW5jZV9idWYgJiYgIW1xcnFfcHJldi0+Ym91bmNlX2J1ZikgewogCQlibGtfcXVldWVfYm91bmNlX2xpbWl0KG1xLT5xdWV1ZSwgbGltaXQpOwogCQlibGtfcXVldWVfbWF4X2h3X3NlY3RvcnMobXEtPnF1ZXVlLAogCQkJbWluKGhvc3QtPm1heF9ibGtfY291bnQsIGhvc3QtPm1heF9yZXFfc2l6ZSAvIDUxMikpOwogCQlibGtfcXVldWVfbWF4X3NlZ21lbnRzKG1xLT5xdWV1ZSwgaG9zdC0+bWF4X3NlZ3MpOwogCQlibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShtcS0+cXVldWUsIGhvc3QtPm1heF9zZWdfc2l6ZSk7CiAKLQkJbXEtPnNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSAqCi0JCQlob3N0LT5tYXhfc2VncywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbXEtPnNnKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOworCQltcXJxX2N1ci0+c2cgPSBtbWNfYWxsb2Nfc2coaG9zdC0+bWF4X3NlZ3MsICZyZXQpOworCQlpZiAocmV0KQogCQkJZ290byBjbGVhbnVwX3F1ZXVlOwotCQl9Ci0JCXNnX2luaXRfdGFibGUobXEtPnNnLCBob3N0LT5tYXhfc2Vncyk7CisKKworCQltcXJxX3ByZXYtPnNnID0gbW1jX2FsbG9jX3NnKGhvc3QtPm1heF9zZWdzLCAmcmV0KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gY2xlYW51cF9xdWV1ZTsKIAl9CiAKIAlzZW1hX2luaXQoJm1xLT50aHJlYWRfc2VtLCAxKTsKIAotCW1xLT50aHJlYWQgPSBrdGhyZWFkX3J1bihtbWNfcXVldWVfdGhyZWFkLCBtcSwgIm1tY3FkLyVkIiwKLQkJaG9zdC0+aW5kZXgpOworCW1xLT50aHJlYWQgPSBrdGhyZWFkX3J1bihtbWNfcXVldWVfdGhyZWFkLCBtcSwgIm1tY3FkLyVkJXMiLAorCQlob3N0LT5pbmRleCwgc3VibmFtZSA/IHN1Ym5hbWUgOiAiIik7CiAKIAlpZiAoSVNfRVJSKG1xLT50aHJlYWQpKSB7CiAJCXJldCA9IFBUUl9FUlIobXEtPnRocmVhZCk7CkBAIC0yMTksMTYgKzI2NywyMiBAQAogCiAJcmV0dXJuIDA7CiAgZnJlZV9ib3VuY2Vfc2c6Ci0gCWlmIChtcS0+Ym91bmNlX3NnKQotIAkJa2ZyZWUobXEtPmJvdW5jZV9zZyk7Ci0gCW1xLT5ib3VuY2Vfc2cgPSBOVUxMOworCWtmcmVlKG1xcnFfY3VyLT5ib3VuY2Vfc2cpOworCW1xcnFfY3VyLT5ib3VuY2Vfc2cgPSBOVUxMOworCWtmcmVlKG1xcnFfcHJldi0+Ym91bmNlX3NnKTsKKwltcXJxX3ByZXYtPmJvdW5jZV9zZyA9IE5VTEw7CisKICBjbGVhbnVwX3F1ZXVlOgotIAlpZiAobXEtPnNnKQotCQlrZnJlZShtcS0+c2cpOwotCW1xLT5zZyA9IE5VTEw7Ci0JaWYgKG1xLT5ib3VuY2VfYnVmKQotCQlrZnJlZShtcS0+Ym91bmNlX2J1Zik7Ci0JbXEtPmJvdW5jZV9idWYgPSBOVUxMOworCWtmcmVlKG1xcnFfY3VyLT5zZyk7CisJbXFycV9jdXItPnNnID0gTlVMTDsKKwlrZnJlZShtcXJxX2N1ci0+Ym91bmNlX2J1Zik7CisJbXFycV9jdXItPmJvdW5jZV9idWYgPSBOVUxMOworCisJa2ZyZWUobXFycV9wcmV2LT5zZyk7CisJbXFycV9wcmV2LT5zZyA9IE5VTEw7CisJa2ZyZWUobXFycV9wcmV2LT5ib3VuY2VfYnVmKTsKKwltcXJxX3ByZXYtPmJvdW5jZV9idWYgPSBOVUxMOworCiAJYmxrX2NsZWFudXBfcXVldWUobXEtPnF1ZXVlKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjM3LDYgKzI5MSw4IEBACiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBtcS0+cXVldWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbW1jX3F1ZXVlX3JlcSAqbXFycV9jdXIgPSBtcS0+bXFycV9jdXI7CisJc3RydWN0IG1tY19xdWV1ZV9yZXEgKm1xcnFfcHJldiA9IG1xLT5tcXJxX3ByZXY7CiAKIAkvKiBNYWtlIHN1cmUgdGhlIHF1ZXVlIGlzbid0IHN1c3BlbmRlZCwgYXMgdGhhdCB3aWxsIGRlYWRsb2NrICovCiAJbW1jX3F1ZXVlX3Jlc3VtZShtcSk7CkBAIC0yNTAsMTYgKzMwNiwyMyBAQAogCWJsa19zdGFydF9xdWV1ZShxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAotIAlpZiAobXEtPmJvdW5jZV9zZykKLSAJCWtmcmVlKG1xLT5ib3VuY2Vfc2cpOwotIAltcS0+Ym91bmNlX3NnID0gTlVMTDsKKwlrZnJlZShtcXJxX2N1ci0+Ym91bmNlX3NnKTsKKwltcXJxX2N1ci0+Ym91bmNlX3NnID0gTlVMTDsKIAotCWtmcmVlKG1xLT5zZyk7Ci0JbXEtPnNnID0gTlVMTDsKKwlrZnJlZShtcXJxX2N1ci0+c2cpOworCW1xcnFfY3VyLT5zZyA9IE5VTEw7CiAKLQlpZiAobXEtPmJvdW5jZV9idWYpCi0JCWtmcmVlKG1xLT5ib3VuY2VfYnVmKTsKLQltcS0+Ym91bmNlX2J1ZiA9IE5VTEw7CisJa2ZyZWUobXFycV9jdXItPmJvdW5jZV9idWYpOworCW1xcnFfY3VyLT5ib3VuY2VfYnVmID0gTlVMTDsKKworCWtmcmVlKG1xcnFfcHJldi0+Ym91bmNlX3NnKTsKKwltcXJxX3ByZXYtPmJvdW5jZV9zZyA9IE5VTEw7CisKKwlrZnJlZShtcXJxX3ByZXYtPnNnKTsKKwltcXJxX3ByZXYtPnNnID0gTlVMTDsKKworCWtmcmVlKG1xcnFfcHJldi0+Ym91bmNlX2J1Zik7CisJbXFycV9wcmV2LT5ib3VuY2VfYnVmID0gTlVMTDsKIAogCW1xLT5jYXJkID0gTlVMTDsKIH0KQEAgLTMxMiwyNyArMzc1LDI3IEBACiAvKgogICogUHJlcGFyZSB0aGUgc2cgbGlzdChzKSB0byBiZSBoYW5kZWQgb2YgdG8gdGhlIGhvc3QgZHJpdmVyCiAgKi8KLXVuc2lnbmVkIGludCBtbWNfcXVldWVfbWFwX3NnKHN0cnVjdCBtbWNfcXVldWUgKm1xKQordW5zaWduZWQgaW50IG1tY19xdWV1ZV9tYXBfc2coc3RydWN0IG1tY19xdWV1ZSAqbXEsIHN0cnVjdCBtbWNfcXVldWVfcmVxICptcXJxKQogewogCXVuc2lnbmVkIGludCBzZ19sZW47CiAJc2l6ZV90IGJ1ZmxlbjsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCBpOwogCi0JaWYgKCFtcS0+Ym91bmNlX2J1ZikKLQkJcmV0dXJuIGJsa19ycV9tYXBfc2cobXEtPnF1ZXVlLCBtcS0+cmVxLCBtcS0+c2cpOworCWlmICghbXFycS0+Ym91bmNlX2J1ZikKKwkJcmV0dXJuIGJsa19ycV9tYXBfc2cobXEtPnF1ZXVlLCBtcXJxLT5yZXEsIG1xcnEtPnNnKTsKIAotCUJVR19PTighbXEtPmJvdW5jZV9zZyk7CisJQlVHX09OKCFtcXJxLT5ib3VuY2Vfc2cpOwogCi0Jc2dfbGVuID0gYmxrX3JxX21hcF9zZyhtcS0+cXVldWUsIG1xLT5yZXEsIG1xLT5ib3VuY2Vfc2cpOworCXNnX2xlbiA9IGJsa19ycV9tYXBfc2cobXEtPnF1ZXVlLCBtcXJxLT5yZXEsIG1xcnEtPmJvdW5jZV9zZyk7CiAKLQltcS0+Ym91bmNlX3NnX2xlbiA9IHNnX2xlbjsKKwltcXJxLT5ib3VuY2Vfc2dfbGVuID0gc2dfbGVuOwogCiAJYnVmbGVuID0gMDsKLQlmb3JfZWFjaF9zZyhtcS0+Ym91bmNlX3NnLCBzZywgc2dfbGVuLCBpKQorCWZvcl9lYWNoX3NnKG1xcnEtPmJvdW5jZV9zZywgc2csIHNnX2xlbiwgaSkKIAkJYnVmbGVuICs9IHNnLT5sZW5ndGg7CiAKLQlzZ19pbml0X29uZShtcS0+c2csIG1xLT5ib3VuY2VfYnVmLCBidWZsZW4pOworCXNnX2luaXRfb25lKG1xcnEtPnNnLCBtcXJxLT5ib3VuY2VfYnVmLCBidWZsZW4pOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0zNDEsMzEgKzQwNCwzMCBAQAogICogSWYgd3JpdGluZywgYm91bmNlIHRoZSBkYXRhIHRvIHRoZSBidWZmZXIgYmVmb3JlIHRoZSByZXF1ZXN0CiAgKiBpcyBzZW50IHRvIHRoZSBob3N0IGRyaXZlcgogICovCi12b2lkIG1tY19xdWV1ZV9ib3VuY2VfcHJlKHN0cnVjdCBtbWNfcXVldWUgKm1xKQordm9pZCBtbWNfcXVldWVfYm91bmNlX3ByZShzdHJ1Y3QgbW1jX3F1ZXVlX3JlcSAqbXFycSkKIHsKLQlpZiAoIW1xLT5ib3VuY2VfYnVmKQorCWlmICghbXFycS0+Ym91bmNlX2J1ZikKIAkJcmV0dXJuOwogCi0JaWYgKHJxX2RhdGFfZGlyKG1xLT5yZXEpICE9IFdSSVRFKQorCWlmIChycV9kYXRhX2RpcihtcXJxLT5yZXEpICE9IFdSSVRFKQogCQlyZXR1cm47CiAKLQlzZ19jb3B5X3RvX2J1ZmZlcihtcS0+Ym91bmNlX3NnLCBtcS0+Ym91bmNlX3NnX2xlbiwKLQkJbXEtPmJvdW5jZV9idWYsIG1xLT5zZ1swXS5sZW5ndGgpOworCXNnX2NvcHlfdG9fYnVmZmVyKG1xcnEtPmJvdW5jZV9zZywgbXFycS0+Ym91bmNlX3NnX2xlbiwKKwkJbXFycS0+Ym91bmNlX2J1ZiwgbXFycS0+c2dbMF0ubGVuZ3RoKTsKIH0KIAogLyoKICAqIElmIHJlYWRpbmcsIGJvdW5jZSB0aGUgZGF0YSBmcm9tIHRoZSBidWZmZXIgYWZ0ZXIgdGhlIHJlcXVlc3QKICAqIGhhcyBiZWVuIGhhbmRsZWQgYnkgdGhlIGhvc3QgZHJpdmVyCiAgKi8KLXZvaWQgbW1jX3F1ZXVlX2JvdW5jZV9wb3N0KHN0cnVjdCBtbWNfcXVldWUgKm1xKQordm9pZCBtbWNfcXVldWVfYm91bmNlX3Bvc3Qoc3RydWN0IG1tY19xdWV1ZV9yZXEgKm1xcnEpCiB7Ci0JaWYgKCFtcS0+Ym91bmNlX2J1ZikKKwlpZiAoIW1xcnEtPmJvdW5jZV9idWYpCiAJCXJldHVybjsKIAotCWlmIChycV9kYXRhX2RpcihtcS0+cmVxKSAhPSBSRUFEKQorCWlmIChycV9kYXRhX2RpcihtcXJxLT5yZXEpICE9IFJFQUQpCiAJCXJldHVybjsKIAotCXNnX2NvcHlfZnJvbV9idWZmZXIobXEtPmJvdW5jZV9zZywgbXEtPmJvdW5jZV9zZ19sZW4sCi0JCW1xLT5ib3VuY2VfYnVmLCBtcS0+c2dbMF0ubGVuZ3RoKTsKKwlzZ19jb3B5X2Zyb21fYnVmZmVyKG1xcnEtPmJvdW5jZV9zZywgbXFycS0+Ym91bmNlX3NnX2xlbiwKKwkJbXFycS0+Ym91bmNlX2J1ZiwgbXFycS0+c2dbMF0ubGVuZ3RoKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5oIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5oCmluZGV4IDY0ZTY2ZTAuLmQyYTFlYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuaAorKysgYi9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmgKQEAgLTQsMjggKzQsNDYgQEAKIHN0cnVjdCByZXF1ZXN0Owogc3RydWN0IHRhc2tfc3RydWN0OwogCitzdHJ1Y3QgbW1jX2Jsa19yZXF1ZXN0IHsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QJbXJxOworCXN0cnVjdCBtbWNfY29tbWFuZAlzYmM7CisJc3RydWN0IG1tY19jb21tYW5kCWNtZDsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQJc3RvcDsKKwlzdHJ1Y3QgbW1jX2RhdGEJCWRhdGE7Cit9OworCitzdHJ1Y3QgbW1jX3F1ZXVlX3JlcSB7CisJc3RydWN0IHJlcXVlc3QJCSpyZXE7CisJc3RydWN0IG1tY19ibGtfcmVxdWVzdAlicnE7CisJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZzsKKwljaGFyCQkJKmJvdW5jZV9idWY7CisJc3RydWN0IHNjYXR0ZXJsaXN0CSpib3VuY2Vfc2c7CisJdW5zaWduZWQgaW50CQlib3VuY2Vfc2dfbGVuOworCXN0cnVjdCBtbWNfYXN5bmNfcmVxCW1tY19hY3RpdmU7Cit9OworCiBzdHJ1Y3QgbW1jX3F1ZXVlIHsKIAlzdHJ1Y3QgbW1jX2NhcmQJCSpjYXJkOwogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGhyZWFkOwogCXN0cnVjdCBzZW1hcGhvcmUJdGhyZWFkX3NlbTsKIAl1bnNpZ25lZCBpbnQJCWZsYWdzOwotCXN0cnVjdCByZXF1ZXN0CQkqcmVxOwogCWludAkJCSgqaXNzdWVfZm4pKHN0cnVjdCBtbWNfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CiAJdm9pZAkJCSpkYXRhOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlCSpxdWV1ZTsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwotCWNoYXIJCQkqYm91bmNlX2J1ZjsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKmJvdW5jZV9zZzsKLQl1bnNpZ25lZCBpbnQJCWJvdW5jZV9zZ19sZW47CisJc3RydWN0IG1tY19xdWV1ZV9yZXEJbXFycVsyXTsKKwlzdHJ1Y3QgbW1jX3F1ZXVlX3JlcQkqbXFycV9jdXI7CisJc3RydWN0IG1tY19xdWV1ZV9yZXEJKm1xcnFfcHJldjsKIH07CiAKLWV4dGVybiBpbnQgbW1jX2luaXRfcXVldWUoc3RydWN0IG1tY19xdWV1ZSAqLCBzdHJ1Y3QgbW1jX2NhcmQgKiwgc3BpbmxvY2tfdCAqKTsKK2V4dGVybiBpbnQgbW1jX2luaXRfcXVldWUoc3RydWN0IG1tY19xdWV1ZSAqLCBzdHJ1Y3QgbW1jX2NhcmQgKiwgc3BpbmxvY2tfdCAqLAorCQkJICBjb25zdCBjaGFyICopOwogZXh0ZXJuIHZvaWQgbW1jX2NsZWFudXBfcXVldWUoc3RydWN0IG1tY19xdWV1ZSAqKTsKIGV4dGVybiB2b2lkIG1tY19xdWV1ZV9zdXNwZW5kKHN0cnVjdCBtbWNfcXVldWUgKik7CiBleHRlcm4gdm9pZCBtbWNfcXVldWVfcmVzdW1lKHN0cnVjdCBtbWNfcXVldWUgKik7CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgbW1jX3F1ZXVlX21hcF9zZyhzdHJ1Y3QgbW1jX3F1ZXVlICopOwotZXh0ZXJuIHZvaWQgbW1jX3F1ZXVlX2JvdW5jZV9wcmUoc3RydWN0IG1tY19xdWV1ZSAqKTsKLWV4dGVybiB2b2lkIG1tY19xdWV1ZV9ib3VuY2VfcG9zdChzdHJ1Y3QgbW1jX3F1ZXVlICopOworZXh0ZXJuIHVuc2lnbmVkIGludCBtbWNfcXVldWVfbWFwX3NnKHN0cnVjdCBtbWNfcXVldWUgKiwKKwkJCQkgICAgIHN0cnVjdCBtbWNfcXVldWVfcmVxICopOworZXh0ZXJuIHZvaWQgbW1jX3F1ZXVlX2JvdW5jZV9wcmUoc3RydWN0IG1tY19xdWV1ZV9yZXEgKik7CitleHRlcm4gdm9pZCBtbWNfcXVldWVfYm91bmNlX3Bvc3Qoc3RydWN0IG1tY19xdWV1ZV9yZXEgKik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMgYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYwppbmRleCA2ODA5MWRkLi44OWJkZWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgpAQCAtMTk4LDkgKzE5OSwxMDkgQEAKIAogc3RhdGljIHZvaWQgbW1jX3dhaXRfZG9uZShzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKIHsKLQljb21wbGV0ZShtcnEtPmRvbmVfZGF0YSk7CisJY29tcGxldGUoJm1ycS0+Y29tcGxldGlvbik7CiB9CiAKK3N0YXRpYyB2b2lkIF9fbW1jX3N0YXJ0X3JlcShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCWluaXRfY29tcGxldGlvbigmbXJxLT5jb21wbGV0aW9uKTsKKwltcnEtPmRvbmUgPSBtbWNfd2FpdF9kb25lOworCW1tY19zdGFydF9yZXF1ZXN0KGhvc3QsIG1ycSk7Cit9CisKK3N0YXRpYyB2b2lkIG1tY193YWl0X2Zvcl9yZXFfZG9uZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsCisJCQkJICBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKK3sKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtcnEtPmNvbXBsZXRpb24pOworfQorCisvKioKKyAqCW1tY19wcmVfcmVxIC0gUHJlcGFyZSBmb3IgYSBuZXcgcmVxdWVzdAorICoJQGhvc3Q6IE1NQyBob3N0IHRvIHByZXBhcmUgY29tbWFuZAorICoJQG1ycTogTU1DIHJlcXVlc3QgdG8gcHJlcGFyZSBmb3IKKyAqCUBpc19maXJzdF9yZXE6IHRydWUgaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgc3RhcnRlZCByZXF1ZXN0CisgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWF5IHJ1biBpbiBwYXJlbGxlbCB0byB0aGlzIGNhbGwsIG90aGVyd2lzZSBmYWxzZQorICoKKyAqCW1tY19wcmVfcmVxKCkgaXMgY2FsbGVkIGluIHByaW9yIHRvIG1tY19zdGFydF9yZXEoKSB0byBsZXQKKyAqCWhvc3QgcHJlcGFyZSBmb3IgdGhlIG5ldyByZXF1ZXN0LiBQcmVwYXJhdGlvbiBvZiBhIHJlcXVlc3QgbWF5IGJlCisgKglwZXJmb3JtZWQgd2hpbGUgYW5vdGhlciByZXF1ZXN0IGlzIHJ1bm5pbmcgb24gdGhlIGhvc3QuCisgKi8KK3N0YXRpYyB2b2lkIG1tY19wcmVfcmVxKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEsCisJCSBib29sIGlzX2ZpcnN0X3JlcSkKK3sKKwlpZiAoaG9zdC0+b3BzLT5wcmVfcmVxKQorCQlob3N0LT5vcHMtPnByZV9yZXEoaG9zdCwgbXJxLCBpc19maXJzdF9yZXEpOworfQorCisvKioKKyAqCW1tY19wb3N0X3JlcSAtIFBvc3QgcHJvY2VzcyBhIGNvbXBsZXRlZCByZXF1ZXN0CisgKglAaG9zdDogTU1DIGhvc3QgdG8gcG9zdCBwcm9jZXNzIGNvbW1hbmQKKyAqCUBtcnE6IE1NQyByZXF1ZXN0IHRvIHBvc3QgcHJvY2VzcyBmb3IKKyAqCUBlcnI6IEVycm9yLCBpZiBub24gemVybywgY2xlYW4gdXAgYW55IHJlc291cmNlcyBtYWRlIGluIHByZV9yZXEKKyAqCisgKglMZXQgdGhlIGhvc3QgcG9zdCBwcm9jZXNzIGEgY29tcGxldGVkIHJlcXVlc3QuIFBvc3QgcHJvY2Vzc2luZyBvZgorICoJYSByZXF1ZXN0IG1heSBiZSBwZXJmb3JtZWQgd2hpbGUgYW5vdGhlciByZXVxZXN0IGlzIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyB2b2lkIG1tY19wb3N0X3JlcShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxLAorCQkJIGludCBlcnIpCit7CisJaWYgKGhvc3QtPm9wcy0+cG9zdF9yZXEpCisJCWhvc3QtPm9wcy0+cG9zdF9yZXEoaG9zdCwgbXJxLCBlcnIpOworfQorCisvKioKKyAqCW1tY19zdGFydF9yZXEgLSBzdGFydCBhIG5vbi1ibG9ja2luZyByZXF1ZXN0CisgKglAaG9zdDogTU1DIGhvc3QgdG8gc3RhcnQgY29tbWFuZAorICoJQGFyZXE6IGFzeW5jIHJlcXVlc3QgdG8gc3RhcnQKKyAqCUBlcnJvcjogb3V0IHBhcmFtZXRlciByZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG90aGVyd2lzZSBub24gemVybworICoKKyAqCVN0YXJ0IGEgbmV3IE1NQyBjdXN0b20gY29tbWFuZCByZXF1ZXN0IGZvciBhIGhvc3QuCisgKglJZiB0aGVyZSBpcyBvbiBvbmdvaW5nIGFzeW5jIHJlcXVlc3Qgd2FpdCBmb3IgY29tcGxldGlvbgorICoJb2YgdGhhdCByZXF1ZXN0IGFuZCBzdGFydCB0aGUgbmV3IG9uZSBhbmQgcmV0dXJuLgorICoJRG9lcyBub3Qgd2FpdCBmb3IgdGhlIG5ldyByZXF1ZXN0IHRvIGNvbXBsZXRlLgorICoKKyAqICAgICAgUmV0dXJucyB0aGUgY29tcGxldGVkIHJlcXVlc3QsIE5VTEwgaW4gY2FzZSBvZiBub25lIGNvbXBsZXRlZC4KKyAqCVdhaXQgZm9yIHRoZSBhbiBvbmdvaW5nIHJlcXVlc3QgKHByZXZpb3Vsc3kgc3RhcnRlZCkgdG8gY29tcGxldGUgYW5kCisgKglyZXR1cm4gdGhlIGNvbXBsZXRlZCByZXF1ZXN0LiBJZiB0aGVyZSBpcyBubyBvbmdvaW5nIHJlcXVlc3QsIE5VTEwKKyAqCWlzIHJldHVybmVkIHdpdGhvdXQgd2FpdGluZy4gTlVMTCBpcyBub3QgYW4gZXJyb3IgY29uZGl0aW9uLgorICovCitzdHJ1Y3QgbW1jX2FzeW5jX3JlcSAqbW1jX3N0YXJ0X3JlcShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsCisJCQkJICAgIHN0cnVjdCBtbWNfYXN5bmNfcmVxICphcmVxLCBpbnQgKmVycm9yKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBtbWNfYXN5bmNfcmVxICpkYXRhID0gaG9zdC0+YXJlcTsKKworCS8qIFByZXBhcmUgYSBuZXcgcmVxdWVzdCAqLworCWlmIChhcmVxKQorCQltbWNfcHJlX3JlcShob3N0LCBhcmVxLT5tcnEsICFob3N0LT5hcmVxKTsKKworCWlmIChob3N0LT5hcmVxKSB7CisJCW1tY193YWl0X2Zvcl9yZXFfZG9uZShob3N0LCBob3N0LT5hcmVxLT5tcnEpOworCQllcnIgPSBob3N0LT5hcmVxLT5lcnJfY2hlY2soaG9zdC0+Y2FyZCwgaG9zdC0+YXJlcSk7CisJCWlmIChlcnIpIHsKKwkJCW1tY19wb3N0X3JlcShob3N0LCBob3N0LT5hcmVxLT5tcnEsIDApOworCQkJaWYgKGFyZXEpCisJCQkJbW1jX3Bvc3RfcmVxKGhvc3QsIGFyZXEtPm1ycSwgLUVJTlZBTCk7CisKKwkJCWhvc3QtPmFyZXEgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoYXJlcSkKKwkJX19tbWNfc3RhcnRfcmVxKGhvc3QsIGFyZXEtPm1ycSk7CisKKwlpZiAoaG9zdC0+YXJlcSkKKwkJbW1jX3Bvc3RfcmVxKGhvc3QsIGhvc3QtPmFyZXEtPm1ycSwgMCk7CisKKwlob3N0LT5hcmVxID0gYXJlcTsKKyBvdXQ6CisJaWYgKGVycm9yKQorCQkqZXJyb3IgPSBlcnI7CisJcmV0dXJuIGRhdGE7Cit9CitFWFBPUlRfU1lNQk9MKG1tY19zdGFydF9yZXEpOworCiAvKioKICAqCW1tY193YWl0X2Zvcl9yZXEgLSBzdGFydCBhIHJlcXVlc3QgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24KICAqCUBob3N0OiBNTUMgaG9zdCB0byBzdGFydCBjb21tYW5kCkBAIC0yMTIsMTYgKzMxMyw5IEBACiAgKi8KIHZvaWQgbW1jX3dhaXRfZm9yX3JlcShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewotCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGNvbXBsZXRlKTsKLQotCW1ycS0+ZG9uZV9kYXRhID0gJmNvbXBsZXRlOwotCW1ycS0+ZG9uZSA9IG1tY193YWl0X2RvbmU7Ci0KLQltbWNfc3RhcnRfcmVxdWVzdChob3N0LCBtcnEpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmY29tcGxldGUpOworCV9fbW1jX3N0YXJ0X3JlcShob3N0LCBtcnEpOworCW1tY193YWl0X2Zvcl9yZXFfZG9uZShob3N0LCBtcnEpOwogfQotCiBFWFBPUlRfU1lNQk9MKG1tY193YWl0X2Zvcl9yZXEpOwogCiAvKioKQEAgLTEyNDUsNyArMTMzOSw3IEBACiAJCSAqLwogCQl0aW1lb3V0X2Nsa3MgPDw9IDE7CiAJCXRpbWVvdXRfdXMgKz0gKHRpbWVvdXRfY2xrcyAqIDEwMDApIC8KLQkJCSAgICAgIChjYXJkLT5ob3N0LT5pb3MuY2xvY2sgLyAxMDAwKTsKKwkJCSAgICAgIChtbWNfaG9zdF9jbGtfcmF0ZShjYXJkLT5ob3N0KSAvIDEwMDApOwogCiAJCWVyYXNlX3RpbWVvdXQgPSB0aW1lb3V0X3VzIC8gMTAwMDsKIApAQCAtMTUxNiw2ICsxNjEwLDgyIEBACiB9CiBFWFBPUlRfU1lNQk9MKG1tY19lcmFzZV9ncm91cF9hbGlnbmVkKTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBtbWNfZG9fY2FsY19tYXhfZGlzY2FyZChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgYXJnKQoreworCXN0cnVjdCBtbWNfaG9zdCAqaG9zdCA9IGNhcmQtPmhvc3Q7CisJdW5zaWduZWQgaW50IG1heF9kaXNjYXJkLCB4LCB5LCBxdHkgPSAwLCBtYXhfcXR5LCB0aW1lb3V0OworCXVuc2lnbmVkIGludCBsYXN0X3RpbWVvdXQgPSAwOworCisJaWYgKGNhcmQtPmVyYXNlX3NoaWZ0KQorCQltYXhfcXR5ID0gVUlOVF9NQVggPj4gY2FyZC0+ZXJhc2Vfc2hpZnQ7CisJZWxzZSBpZiAobW1jX2NhcmRfc2QoY2FyZCkpCisJCW1heF9xdHkgPSBVSU5UX01BWDsKKwllbHNlCisJCW1heF9xdHkgPSBVSU5UX01BWCAvIGNhcmQtPmVyYXNlX3NpemU7CisKKwkvKiBGaW5kIHRoZSBsYXJnZXN0IHF0eSB3aXRoIGFuIE9LIHRpbWVvdXQgKi8KKwlkbyB7CisJCXkgPSAwOworCQlmb3IgKHggPSAxOyB4ICYmIHggPD0gbWF4X3F0eSAmJiBtYXhfcXR5IC0geCA+PSBxdHk7IHggPDw9IDEpIHsKKwkJCXRpbWVvdXQgPSBtbWNfZXJhc2VfdGltZW91dChjYXJkLCBhcmcsIHF0eSArIHgpOworCQkJaWYgKHRpbWVvdXQgPiBob3N0LT5tYXhfZGlzY2FyZF90bykKKwkJCQlicmVhazsKKwkJCWlmICh0aW1lb3V0IDwgbGFzdF90aW1lb3V0KQorCQkJCWJyZWFrOworCQkJbGFzdF90aW1lb3V0ID0gdGltZW91dDsKKwkJCXkgPSB4OworCQl9CisJCXF0eSArPSB5OworCX0gd2hpbGUgKHkpOworCisJaWYgKCFxdHkpCisJCXJldHVybiAwOworCisJaWYgKHF0eSA9PSAxKQorCQlyZXR1cm4gMTsKKworCS8qIENvbnZlcnQgcXR5IHRvIHNlY3RvcnMgKi8KKwlpZiAoY2FyZC0+ZXJhc2Vfc2hpZnQpCisJCW1heF9kaXNjYXJkID0gLS1xdHkgPDwgY2FyZC0+ZXJhc2Vfc2hpZnQ7CisJZWxzZSBpZiAobW1jX2NhcmRfc2QoY2FyZCkpCisJCW1heF9kaXNjYXJkID0gcXR5OworCWVsc2UKKwkJbWF4X2Rpc2NhcmQgPSAtLXF0eSAqIGNhcmQtPmVyYXNlX3NpemU7CisKKwlyZXR1cm4gbWF4X2Rpc2NhcmQ7Cit9CisKK3Vuc2lnbmVkIGludCBtbWNfY2FsY19tYXhfZGlzY2FyZChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IG1tY19ob3N0ICpob3N0ID0gY2FyZC0+aG9zdDsKKwl1bnNpZ25lZCBpbnQgbWF4X2Rpc2NhcmQsIG1heF90cmltOworCisJaWYgKCFob3N0LT5tYXhfZGlzY2FyZF90bykKKwkJcmV0dXJuIFVJTlRfTUFYOworCisJLyoKKwkgKiBXaXRob3V0IGVyYXNlX2dyb3VwX2RlZiBzZXQsIE1NQyBlcmFzZSB0aW1lb3V0IGRlcGVuZHMgb24gY2xvY2sKKwkgKiBmcmVxdWVuY2Ugd2hpY2ggY2FuIGNoYW5nZS4gIEluIHRoYXQgY2FzZSwgdGhlIGJlc3QgY2hvaWNlIGlzCisJICoganVzdCB0aGUgcHJlZmVycmVkIGVyYXNlIHNpemUuCisJICovCisJaWYgKG1tY19jYXJkX21tYyhjYXJkKSAmJiAhKGNhcmQtPmV4dF9jc2QuZXJhc2VfZ3JvdXBfZGVmICYgMSkpCisJCXJldHVybiBjYXJkLT5wcmVmX2VyYXNlOworCisJbWF4X2Rpc2NhcmQgPSBtbWNfZG9fY2FsY19tYXhfZGlzY2FyZChjYXJkLCBNTUNfRVJBU0VfQVJHKTsKKwlpZiAobW1jX2Nhbl90cmltKGNhcmQpKSB7CisJCW1heF90cmltID0gbW1jX2RvX2NhbGNfbWF4X2Rpc2NhcmQoY2FyZCwgTU1DX1RSSU1fQVJHKTsKKwkJaWYgKG1heF90cmltIDwgbWF4X2Rpc2NhcmQpCisJCQltYXhfZGlzY2FyZCA9IG1heF90cmltOworCX0gZWxzZSBpZiAobWF4X2Rpc2NhcmQgPCBjYXJkLT5lcmFzZV9zaXplKSB7CisJCW1heF9kaXNjYXJkID0gMDsKKwl9CisJcHJfZGVidWcoIiVzOiBjYWxjdWxhdGVkIG1heC4gZGlzY2FyZCBzZWN0b3JzICV1IGZvciB0aW1lb3V0ICV1IG1zXG4iLAorCQkgbW1jX2hvc3RuYW1lKGhvc3QpLCBtYXhfZGlzY2FyZCwgaG9zdC0+bWF4X2Rpc2NhcmRfdG8pOworCXJldHVybiBtYXhfZGlzY2FyZDsKK30KK0VYUE9SVF9TWU1CT0wobW1jX2NhbGNfbWF4X2Rpc2NhcmQpOworCiBpbnQgbW1jX3NldF9ibG9ja2xlbihzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBibG9ja2xlbikKIHsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwpAQCAtMTY2Myw2ICsxODMzLDEwIEBACiB7CiAJaW50IHJldCA9IDA7CiAKKyNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCisJcHJfaW5mbygiJXM6ICVzOiBwb3dlcmluZyBkb3duXG4iLCBtbWNfaG9zdG5hbWUoaG9zdCksIF9fZnVuY19fKTsKKyNlbmRpZgorCiAJbW1jX2J1c19nZXQoaG9zdCk7CiAKIAlpZiAoIWhvc3QtPmJ1c19vcHMgfHwgaG9zdC0+YnVzX2RlYWQgfHwgIWhvc3QtPmJ1c19vcHMtPnBvd2VyX3Jlc3RvcmUpIHsKQEAgLTE2ODUsNiArMTg1OSwxMCBAQAogewogCWludCByZXQ7CiAKKyNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCisJcHJfaW5mbygiJXM6ICVzOiBwb3dlcmluZyB1cFxuIiwgbW1jX2hvc3RuYW1lKGhvc3QpLCBfX2Z1bmNfXyk7CisjZW5kaWYKKwogCW1tY19idXNfZ2V0KGhvc3QpOwogCiAJaWYgKCFob3N0LT5idXNfb3BzIHx8IGhvc3QtPmJ1c19kZWFkIHx8ICFob3N0LT5idXNfb3BzLT5wb3dlcl9yZXN0b3JlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL21tYy5jIGIvZHJpdmVycy9tbWMvY29yZS9tbWMuYwppbmRleCAyYTdlNDNiLi5hYTdkMWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKQEAgLTI0NywxMiArMjQ3LDEyIEBACiAJCXJldHVybiAwOwogCiAJLyogVmVyc2lvbiBpcyBjb2RlZCBpbiB0aGUgQ1NEX1NUUlVDVFVSRSBieXRlIGluIHRoZSBFWFRfQ1NEIHJlZ2lzdGVyICovCisJY2FyZC0+ZXh0X2NzZC5yYXdfZXh0X2NzZF9zdHJ1Y3R1cmUgPSBleHRfY3NkW0VYVF9DU0RfU1RSVUNUVVJFXTsKIAlpZiAoY2FyZC0+Y3NkLnN0cnVjdHVyZSA9PSAzKSB7Ci0JCWludCBleHRfY3NkX3N0cnVjdCA9IGV4dF9jc2RbRVhUX0NTRF9TVFJVQ1RVUkVdOwotCQlpZiAoZXh0X2NzZF9zdHJ1Y3QgPiAyKSB7CisJCWlmIChjYXJkLT5leHRfY3NkLnJhd19leHRfY3NkX3N0cnVjdHVyZSA+IDIpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVucmVjb2duaXNlZCBFWFRfQ1NEIHN0cnVjdHVyZSAiCiAJCQkJInZlcnNpb24gJWRcbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwKLQkJCQkJZXh0X2NzZF9zdHJ1Y3QpOworCQkJCQljYXJkLT5leHRfY3NkLnJhd19leHRfY3NkX3N0cnVjdHVyZSk7CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTI2Niw2ICsyNjYsMTAgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJY2FyZC0+ZXh0X2NzZC5yYXdfc2VjdG9yc1swXSA9IGV4dF9jc2RbRVhUX0NTRF9TRUNfQ05UICsgMF07CisJY2FyZC0+ZXh0X2NzZC5yYXdfc2VjdG9yc1sxXSA9IGV4dF9jc2RbRVhUX0NTRF9TRUNfQ05UICsgMV07CisJY2FyZC0+ZXh0X2NzZC5yYXdfc2VjdG9yc1syXSA9IGV4dF9jc2RbRVhUX0NTRF9TRUNfQ05UICsgMl07CisJY2FyZC0+ZXh0X2NzZC5yYXdfc2VjdG9yc1szXSA9IGV4dF9jc2RbRVhUX0NTRF9TRUNfQ05UICsgM107CiAJaWYgKGNhcmQtPmV4dF9jc2QucmV2ID49IDIpIHsKIAkJY2FyZC0+ZXh0X2NzZC5zZWN0b3JzID0KIAkJCWV4dF9jc2RbRVhUX0NTRF9TRUNfQ05UICsgMF0gPDwgMCB8CkBAIC0yNzcsNyArMjgxLDcgQEAKIAkJaWYgKGNhcmQtPmV4dF9jc2Quc2VjdG9ycyA+ICgydSAqIDEwMjQgKiAxMDI0ICogMTAyNCkgLyA1MTIpCiAJCQltbWNfY2FyZF9zZXRfYmxvY2thZGRyKGNhcmQpOwogCX0KLQorCWNhcmQtPmV4dF9jc2QucmF3X2NhcmRfdHlwZSA9IGV4dF9jc2RbRVhUX0NTRF9DQVJEX1RZUEVdOwogCXN3aXRjaCAoZXh0X2NzZFtFWFRfQ1NEX0NBUkRfVFlQRV0gJiBFWFRfQ1NEX0NBUkRfVFlQRV9NQVNLKSB7CiAJY2FzZSBFWFRfQ1NEX0NBUkRfVFlQRV9ERFJfNTIgfCBFWFRfQ1NEX0NBUkRfVFlQRV81MiB8CiAJICAgICBFWFRfQ1NEX0NBUkRfVFlQRV8yNjoKQEAgLTMwNyw2ICszMTEsMTEgQEAKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJfQogCisJY2FyZC0+ZXh0X2NzZC5yYXdfc19hX3RpbWVvdXQgPSBleHRfY3NkW0VYVF9DU0RfU19BX1RJTUVPVVRdOworCWNhcmQtPmV4dF9jc2QucmF3X2VyYXNlX3RpbWVvdXRfbXVsdCA9CisJCWV4dF9jc2RbRVhUX0NTRF9FUkFTRV9USU1FT1VUX01VTFRdOworCWNhcmQtPmV4dF9jc2QucmF3X2hjX2VyYXNlX2dycF9zaXplID0KKwkJZXh0X2NzZFtFWFRfQ1NEX0hDX0VSQVNFX0dSUF9TSVpFXTsKIAlpZiAoY2FyZC0+ZXh0X2NzZC5yZXYgPj0gMykgewogCQl1OCBzYV9zaGlmdCA9IGV4dF9jc2RbRVhUX0NTRF9TX0FfVElNRU9VVF07CiAJCWNhcmQtPmV4dF9jc2QucGFydF9jb25maWcgPSBleHRfY3NkW0VYVF9DU0RfUEFSVF9DT05GSUddOwpAQCAtMzM0LDYgKzM0MywxNiBAQAogCQljYXJkLT5leHRfY3NkLmJvb3Rfc2l6ZSA9IGV4dF9jc2RbRVhUX0NTRF9CT09UX01VTFRdIDw8IDE3OwogCX0KIAorCWNhcmQtPmV4dF9jc2QucmF3X2hjX2VyYXNlX2dhcF9zaXplID0KKwkJZXh0X2NzZFtFWFRfQ1NEX1BBUlRJVElPTl9BVFRSSUJVVEVdOworCWNhcmQtPmV4dF9jc2QucmF3X3NlY190cmltX211bHQgPQorCQlleHRfY3NkW0VYVF9DU0RfU0VDX1RSSU1fTVVMVF07CisJY2FyZC0+ZXh0X2NzZC5yYXdfc2VjX2VyYXNlX211bHQgPQorCQlleHRfY3NkW0VYVF9DU0RfU0VDX0VSQVNFX01VTFRdOworCWNhcmQtPmV4dF9jc2QucmF3X3NlY19mZWF0dXJlX3N1cHBvcnQgPQorCQlleHRfY3NkW0VYVF9DU0RfU0VDX0ZFQVRVUkVfU1VQUE9SVF07CisJY2FyZC0+ZXh0X2NzZC5yYXdfdHJpbV9tdWx0ID0KKwkJZXh0X2NzZFtFWFRfQ1NEX1RSSU1fTVVMVF07CiAJaWYgKGNhcmQtPmV4dF9jc2QucmV2ID49IDQpIHsKIAkJLyoKIAkJICogRW5oYW5jZWQgYXJlYSBmZWF0dXJlIHN1cHBvcnQgLS0gY2hlY2sgd2hldGhlciB0aGUgZU1NQwpAQCAtMzQxLDcgKzM2MCw3IEBACiAJCSAqIGFyZWEgb2Zmc2V0IGFuZCBzaXplIHRvIHVzZXIgYnkgYWRkaW5nIHN5c2ZzIGludGVyZmFjZS4KIAkJICovCiAJCWlmICgoZXh0X2NzZFtFWFRfQ1NEX1BBUlRJVElPTl9TVVBQT1JUXSAmIDB4MikgJiYKLQkJCQkoZXh0X2NzZFtFWFRfQ1NEX1BBUlRJVElPTl9BVFRSSUJVVEVdICYgMHgxKSkgeworCQkgICAgKGV4dF9jc2RbRVhUX0NTRF9QQVJUSVRJT05fQVRUUklCVVRFXSAmIDB4MSkpIHsKIAkJCXU4IGhjX2VyYXNlX2dycF9zeiA9CiAJCQkJZXh0X2NzZFtFWFRfQ1NEX0hDX0VSQVNFX0dSUF9TSVpFXTsKIAkJCXU4IGhjX3dwX2dycF9zeiA9CkBAIC00MDEsMTcgKzQyMCwxNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgbW1jX2NvbXBhcmVfZXh0X2NzZHMoc3RydWN0IG1tY19jYXJkICpjYXJkLCB1OCAqZXh0X2NzZCwKLQkJCXVuc2lnbmVkIGJ1c193aWR0aCkKK3N0YXRpYyBpbnQgbW1jX2NvbXBhcmVfZXh0X2NzZHMoc3RydWN0IG1tY19jYXJkICpjYXJkLCB1bnNpZ25lZCBidXNfd2lkdGgpCiB7CiAJdTggKmJ3X2V4dF9jc2Q7CiAJaW50IGVycjsKIAotCWVyciA9IG1tY19nZXRfZXh0X2NzZChjYXJkLCAmYndfZXh0X2NzZCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwlpZiAoYnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfMSkKKwkJcmV0dXJuIDA7CiAKLQlpZiAoKGV4dF9jc2QgPT0gTlVMTCB8fCBid19leHRfY3NkID09IE5VTEwpKSB7CisJZXJyID0gbW1jX2dldF9leHRfY3NkKGNhcmQsICZid19leHRfY3NkKTsKKworCWlmIChlcnIgfHwgYndfZXh0X2NzZCA9PSBOVUxMKSB7CiAJCWlmIChidXNfd2lkdGggIT0gTU1DX0JVU19XSURUSF8xKQogCQkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CkBAIC00MjEsMzUgKzQ0MCw0MCBAQAogCQlnb3RvIG91dDsKIAogCS8qIG9ubHkgY29tcGFyZSByZWFkIG9ubHkgZmllbGRzICovCi0JZXJyID0gKCEoZXh0X2NzZFtFWFRfQ1NEX1BBUlRJVElPTl9TVVBQT1JUXSA9PQorCWVyciA9ICghKGNhcmQtPmV4dF9jc2QucmF3X3BhcnRpdGlvbl9zdXBwb3J0ID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfUEFSVElUSU9OX1NVUFBPUlRdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX0VSQVNFRF9NRU1fQ09OVF0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmF3X2VyYXNlZF9tZW1fY291bnQgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9FUkFTRURfTUVNX0NPTlRdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX1JFVl0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmV2ID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfUkVWXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9TVFJVQ1RVUkVdID09CisJCShjYXJkLT5leHRfY3NkLnJhd19leHRfY3NkX3N0cnVjdHVyZSA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1NUUlVDVFVSRV0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfQ0FSRF9UWVBFXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfY2FyZF90eXBlID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfQ0FSRF9UWVBFXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9TX0FfVElNRU9VVF0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmF3X3NfYV90aW1lb3V0ID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfU19BX1RJTUVPVVRdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX0hDX1dQX0dSUF9TSVpFXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfaGNfZXJhc2VfZ2FwX3NpemUgPT0KIAkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9IQ19XUF9HUlBfU0laRV0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfRVJBU0VfVElNRU9VVF9NVUxUXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfZXJhc2VfdGltZW91dF9tdWx0ID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfRVJBU0VfVElNRU9VVF9NVUxUXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9IQ19FUkFTRV9HUlBfU0laRV0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmF3X2hjX2VyYXNlX2dycF9zaXplID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfSENfRVJBU0VfR1JQX1NJWkVdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX1NFQ19UUklNX01VTFRdID09CisJCShjYXJkLT5leHRfY3NkLnJhd19zZWNfdHJpbV9tdWx0ID09CiAJCQlid19leHRfY3NkW0VYVF9DU0RfU0VDX1RSSU1fTVVMVF0pICYmCi0JCShleHRfY3NkW0VYVF9DU0RfU0VDX0VSQVNFX01VTFRdID09CisJCShjYXJkLT5leHRfY3NkLnJhd19zZWNfZXJhc2VfbXVsdCA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1NFQ19FUkFTRV9NVUxUXSkgJiYKLQkJKGV4dF9jc2RbRVhUX0NTRF9TRUNfRkVBVFVSRV9TVVBQT1JUXSA9PQorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfc2VjX2ZlYXR1cmVfc3VwcG9ydCA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1NFQ19GRUFUVVJFX1NVUFBPUlRdKSAmJgotCQkoZXh0X2NzZFtFWFRfQ1NEX1RSSU1fTVVMVF0gPT0KKwkJKGNhcmQtPmV4dF9jc2QucmF3X3RyaW1fbXVsdCA9PQogCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1RSSU1fTVVMVF0pICYmCi0JCW1lbWNtcCgmZXh0X2NzZFtFWFRfQ1NEX1NFQ19DTlRdLAotCQkgICAgICAgJmJ3X2V4dF9jc2RbRVhUX0NTRF9TRUNfQ05UXSwKLQkJICAgICAgIDQpICE9IDApOworCQkoY2FyZC0+ZXh0X2NzZC5yYXdfc2VjdG9yc1swXSA9PQorCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1NFQ19DTlQgKyAwXSkgJiYKKwkJKGNhcmQtPmV4dF9jc2QucmF3X3NlY3RvcnNbMV0gPT0KKwkJCWJ3X2V4dF9jc2RbRVhUX0NTRF9TRUNfQ05UICsgMV0pICYmCisJCShjYXJkLT5leHRfY3NkLnJhd19zZWN0b3JzWzJdID09CisJCQlid19leHRfY3NkW0VYVF9DU0RfU0VDX0NOVCArIDJdKSAmJgorCQkoY2FyZC0+ZXh0X2NzZC5yYXdfc2VjdG9yc1szXSA9PQorCQkJYndfZXh0X2NzZFtFWFRfQ1NEX1NFQ19DTlQgKyAzXSkpOwogCWlmIChlcnIpCiAJCWVyciA9IC1FSU5WQUw7CiAKQEAgLTc3MCw3ICs3OTQsNiBAQAogCQkJCSAqLwogCQkJCWlmICghKGhvc3QtPmNhcHMgJiBNTUNfQ0FQX0JVU19XSURUSF9URVNUKSkKIAkJCQkJZXJyID0gbW1jX2NvbXBhcmVfZXh0X2NzZHMoY2FyZCwKLQkJCQkJCWV4dF9jc2QsCiAJCQkJCQlidXNfd2lkdGgpOwogCQkJCWVsc2UKIAkJCQkJZXJyID0gbW1jX2J1c190ZXN0KGNhcmQsIGJ1c193aWR0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkLmMKaW5kZXggZmYyNzc0MS4uNjMzOTc1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZC5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2QuYwpAQCAtNDA5LDUyICs0MDksNjIgQEAKIAogc3RhdGljIGludCBzZF9zZWxlY3RfZHJpdmVyX3R5cGUoc3RydWN0IG1tY19jYXJkICpjYXJkLCB1OCAqc3RhdHVzKQogewotCWludCBob3N0X2Rydl90eXBlID0gMCwgY2FyZF9kcnZfdHlwZSA9IDA7CisJaW50IGhvc3RfZHJ2X3R5cGUgPSBTRF9EUklWRVJfVFlQRV9COworCWludCBjYXJkX2Rydl90eXBlID0gU0RfRFJJVkVSX1RZUEVfQjsKKwlpbnQgZHJpdmVfc3RyZW5ndGg7CiAJaW50IGVycjsKIAogCS8qCiAJICogSWYgdGhlIGhvc3QgZG9lc24ndCBzdXBwb3J0IGFueSBvZiB0aGUgRHJpdmVyIFR5cGVzIEEsQyBvciBELAotCSAqIGRlZmF1bHQgRHJpdmVyIFR5cGUgQiBpcyB1c2VkLgorCSAqIG9yIHRoZXJlIGlzIG5vIGJvYXJkIHNwZWNpZmljIGhhbmRsZXIgdGhlbiBkZWZhdWx0IERyaXZlcgorCSAqIFR5cGUgQiBpcyB1c2VkLgogCSAqLwogCWlmICghKGNhcmQtPmhvc3QtPmNhcHMgJiAoTU1DX0NBUF9EUklWRVJfVFlQRV9BIHwgTU1DX0NBUF9EUklWRVJfVFlQRV9DCiAJICAgIHwgTU1DX0NBUF9EUklWRVJfVFlQRV9EKSkpCiAJCXJldHVybiAwOwogCi0JaWYgKGNhcmQtPmhvc3QtPmNhcHMgJiBNTUNfQ0FQX0RSSVZFUl9UWVBFX0EpIHsKLQkJaG9zdF9kcnZfdHlwZSA9IE1NQ19TRVRfRFJJVkVSX1RZUEVfQTsKLQkJaWYgKGNhcmQtPnN3X2NhcHMuc2QzX2Rydl90eXBlICYgU0RfRFJJVkVSX1RZUEVfQSkKLQkJCWNhcmRfZHJ2X3R5cGUgPSBNTUNfU0VUX0RSSVZFUl9UWVBFX0E7Ci0JCWVsc2UgaWYgKGNhcmQtPnN3X2NhcHMuc2QzX2Rydl90eXBlICYgU0RfRFJJVkVSX1RZUEVfQikKLQkJCWNhcmRfZHJ2X3R5cGUgPSBNTUNfU0VUX0RSSVZFUl9UWVBFX0I7Ci0JCWVsc2UgaWYgKGNhcmQtPnN3X2NhcHMuc2QzX2Rydl90eXBlICYgU0RfRFJJVkVSX1RZUEVfQykKLQkJCWNhcmRfZHJ2X3R5cGUgPSBNTUNfU0VUX0RSSVZFUl9UWVBFX0M7Ci0JfSBlbHNlIGlmIChjYXJkLT5ob3N0LT5jYXBzICYgTU1DX0NBUF9EUklWRVJfVFlQRV9DKSB7Ci0JCWhvc3RfZHJ2X3R5cGUgPSBNTUNfU0VUX0RSSVZFUl9UWVBFX0M7Ci0JCWlmIChjYXJkLT5zd19jYXBzLnNkM19kcnZfdHlwZSAmIFNEX0RSSVZFUl9UWVBFX0MpCi0JCQljYXJkX2Rydl90eXBlID0gTU1DX1NFVF9EUklWRVJfVFlQRV9DOwotCX0gZWxzZSBpZiAoIShjYXJkLT5ob3N0LT5jYXBzICYgTU1DX0NBUF9EUklWRVJfVFlQRV9EKSkgewotCQkvKgotCQkgKiBJZiB3ZSBhcmUgaGVyZSwgdGhhdCBtZWFucyBvbmx5IHRoZSBkZWZhdWx0IGRyaXZlciB0eXBlCi0JCSAqIEIgaXMgc3VwcG9ydGVkIGJ5IHRoZSBob3N0LgotCQkgKi8KLQkJaG9zdF9kcnZfdHlwZSA9IE1NQ19TRVRfRFJJVkVSX1RZUEVfQjsKLQkJaWYgKGNhcmQtPnN3X2NhcHMuc2QzX2Rydl90eXBlICYgU0RfRFJJVkVSX1RZUEVfQikKLQkJCWNhcmRfZHJ2X3R5cGUgPSBNTUNfU0VUX0RSSVZFUl9UWVBFX0I7Ci0JCWVsc2UgaWYgKGNhcmQtPnN3X2NhcHMuc2QzX2Rydl90eXBlICYgU0RfRFJJVkVSX1RZUEVfQykKLQkJCWNhcmRfZHJ2X3R5cGUgPSBNTUNfU0VUX0RSSVZFUl9UWVBFX0M7Ci0JfQorCWlmICghY2FyZC0+aG9zdC0+b3BzLT5zZWxlY3RfZHJpdmVfc3RyZW5ndGgpCisJCXJldHVybiAwOwogCi0JZXJyID0gbW1jX3NkX3N3aXRjaChjYXJkLCAxLCAyLCBjYXJkX2Rydl90eXBlLCBzdGF0dXMpOworCWlmIChjYXJkLT5ob3N0LT5jYXBzICYgTU1DX0NBUF9EUklWRVJfVFlQRV9BKQorCQlob3N0X2Rydl90eXBlIHw9IFNEX0RSSVZFUl9UWVBFX0E7CisKKwlpZiAoY2FyZC0+aG9zdC0+Y2FwcyAmIE1NQ19DQVBfRFJJVkVSX1RZUEVfQykKKwkJaG9zdF9kcnZfdHlwZSB8PSBTRF9EUklWRVJfVFlQRV9DOworCisJaWYgKGNhcmQtPmhvc3QtPmNhcHMgJiBNTUNfQ0FQX0RSSVZFUl9UWVBFX0QpCisJCWhvc3RfZHJ2X3R5cGUgfD0gU0RfRFJJVkVSX1RZUEVfRDsKKworCWlmIChjYXJkLT5zd19jYXBzLnNkM19kcnZfdHlwZSAmIFNEX0RSSVZFUl9UWVBFX0EpCisJCWNhcmRfZHJ2X3R5cGUgfD0gU0RfRFJJVkVSX1RZUEVfQTsKKworCWlmIChjYXJkLT5zd19jYXBzLnNkM19kcnZfdHlwZSAmIFNEX0RSSVZFUl9UWVBFX0MpCisJCWNhcmRfZHJ2X3R5cGUgfD0gU0RfRFJJVkVSX1RZUEVfQzsKKworCWlmIChjYXJkLT5zd19jYXBzLnNkM19kcnZfdHlwZSAmIFNEX0RSSVZFUl9UWVBFX0QpCisJCWNhcmRfZHJ2X3R5cGUgfD0gU0RfRFJJVkVSX1RZUEVfRDsKKworCS8qCisJICogVGhlIGRyaXZlIHN0cmVuZ3RoIHRoYXQgdGhlIGhhcmR3YXJlIGNhbiBzdXBwb3J0CisJICogZGVwZW5kcyBvbiB0aGUgYm9hcmQgZGVzaWduLiAgUGFzcyB0aGUgYXBwcm9wcmlhdGUKKwkgKiBpbmZvcm1hdGlvbiBhbmQgbGV0IHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBjb2RlCisJICogcmV0dXJuIHdoYXQgaXMgcG9zc2libGUgZ2l2ZW4gdGhlIG9wdGlvbnMKKwkgKi8KKwlkcml2ZV9zdHJlbmd0aCA9IGNhcmQtPmhvc3QtPm9wcy0+c2VsZWN0X2RyaXZlX3N0cmVuZ3RoKAorCQljYXJkLT5zd19jYXBzLnVoc19tYXhfZHRyLAorCQlob3N0X2Rydl90eXBlLCBjYXJkX2Rydl90eXBlKTsKKworCWVyciA9IG1tY19zZF9zd2l0Y2goY2FyZCwgMSwgMiwgZHJpdmVfc3RyZW5ndGgsIHN0YXR1cyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmICgoc3RhdHVzWzE1XSAmIDB4RikgIT0gY2FyZF9kcnZfdHlwZSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUHJvYmxlbSBzZXR0aW5nIGRyaXZlciBzdHJlbmd0aCFcbiIsCisJaWYgKChzdGF0dXNbMTVdICYgMHhGKSAhPSBkcml2ZV9zdHJlbmd0aCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUHJvYmxlbSBzZXR0aW5nIGRyaXZlIHN0cmVuZ3RoIVxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCXJldHVybiAwOwogCX0KIAotCW1tY19zZXRfZHJpdmVyX3R5cGUoY2FyZC0+aG9zdCwgaG9zdF9kcnZfdHlwZSk7CisJbW1jX3NldF9kcml2ZXJfdHlwZShjYXJkLT5ob3N0LCBkcml2ZV9zdHJlbmd0aCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKaW5kZXggNGQwYzE1Yi4uMjYyZmZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKQEAgLTY5MSwxNSArNjkxLDU0IEBACiBzdGF0aWMgaW50IG1tY19zZGlvX3Bvd2VyX3Jlc3RvcmUoc3RydWN0IG1tY19ob3N0ICpob3N0KQogewogCWludCByZXQ7CisJdTMyIG9jcjsKIAogCUJVR19PTighaG9zdCk7CiAJQlVHX09OKCFob3N0LT5jYXJkKTsKIAogCW1tY19jbGFpbV9ob3N0KGhvc3QpOworCisJLyoKKwkgKiBSZXNldCB0aGUgY2FyZCBieSBwZXJmb3JtaW5nIHRoZSBzYW1lIHN0ZXBzIHRoYXQgYXJlIHRha2VuIGJ5CisJICogbW1jX3Jlc2Nhbl90cnlfZnJlcSgpIGFuZCBtbWNfYXR0YWNoX3NkaW8oKSBkdXJpbmcgYSAibm9ybWFsIiBwcm9iZS4KKwkgKgorCSAqIHNkaW9fcmVzZXQoKSBpcyB0ZWNobmljYWxseSBub3QgbmVlZGVkLiBIYXZpbmcganVzdCBwb3dlcmVkIHVwIHRoZQorCSAqIGhhcmR3YXJlLCBpdCBzaG91bGQgYWxyZWFkeSBiZSBpbiByZXNldCBzdGF0ZS4gSG93ZXZlciwgc29tZQorCSAqIHBsYXRmb3JtcyAoc3VjaCBhcyBTRDg2ODYgb24gT0xQQykgZG8gbm90IGluc3RhbnRseSBjdXQgcG93ZXIsCisJICogbWVhbmluZyB0aGF0IGEgcmVzZXQgaXMgcmVxdWlyZWQgd2hlbiByZXN0b3JpbmcgcG93ZXIgc29vbiBhZnRlcgorCSAqIHBvd2VyaW5nIG9mZi4gSXQgaXMgaGFybWxlc3MgaW4gb3RoZXIgY2FzZXMuCisJICoKKwkgKiBUaGUgQ01ENSByZXNldCAobW1jX3NlbmRfaW9fb3BfY29uZCgpKSwgYWNjb3JkaW5nIHRvIHRoZSBTRElPIHNwZWMsCisJICogaXMgbm90IG5lY2Vzc2FyeSBmb3Igbm9uLXJlbW92YWJsZSBjYXJkcy4gSG93ZXZlciwgaXQgaXMgcmVxdWlyZWQKKwkgKiBmb3IgT0xQQyBTRDg2ODYgKHdoaWNoIGV4cGVjdHMgYSBbQ01ENSw1LDMsN10gaW5pdCBzZXF1ZW5jZSksIGFuZAorCSAqIGhhcm1sZXNzIGluIG90aGVyIHNpdHVhdGlvbnMuCisJICoKKwkgKiBXaXRoIHRoZXNlIHN0ZXBzIHRha2VuLCBtbWNfc2VsZWN0X3ZvbHRhZ2UoKSBpcyBhbHNvIHJlcXVpcmVkIHRvCisJICogcmVzdG9yZSB0aGUgY29ycmVjdCB2b2x0YWdlIHNldHRpbmcgb2YgdGhlIGNhcmQuCisJICovCisJc2Rpb19yZXNldChob3N0KTsKKwltbWNfZ29faWRsZShob3N0KTsKKwltbWNfc2VuZF9pZl9jb25kKGhvc3QsIGhvc3QtPm9jcl9hdmFpbCk7CisKKwlyZXQgPSBtbWNfc2VuZF9pb19vcF9jb25kKGhvc3QsIDAsICZvY3IpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKGhvc3QtPm9jcl9hdmFpbF9zZGlvKQorCQlob3N0LT5vY3JfYXZhaWwgPSBob3N0LT5vY3JfYXZhaWxfc2RpbzsKKworCWhvc3QtPm9jciA9IG1tY19zZWxlY3Rfdm9sdGFnZShob3N0LCBvY3IgJiB+MHg3Rik7CisJaWYgKCFob3N0LT5vY3IpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCiAJcmV0ID0gbW1jX3NkaW9faW5pdF9jYXJkKGhvc3QsIGhvc3QtPm9jciwgaG9zdC0+Y2FyZCwKIAkJCQltbWNfY2FyZF9rZWVwX3Bvd2VyKGhvc3QpKTsKIAlpZiAoIXJldCAmJiBob3N0LT5zZGlvX2lycXMpCiAJCW1tY19zaWduYWxfc2Rpb19pcnEoaG9zdCk7CisKK291dDoKIAltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19idXMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19idXMuYwppbmRleCBkMjliOWMzLi5lNGU2ODIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9fYnVzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2J1cy5jCkBAIC0xNjcsMTEgKzE2Nyw4IEBACiAJaW50IHJldCA9IDA7CiAKIAkvKiBNYWtlIHN1cmUgY2FyZCBpcyBwb3dlcmVkIGJlZm9yZSBpbnZva2luZyAtPnJlbW92ZSgpICovCi0JaWYgKGZ1bmMtPmNhcmQtPmhvc3QtPmNhcHMgJiBNTUNfQ0FQX1BPV0VSX09GRl9DQVJEKSB7Ci0JCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKLQl9CisJaWYgKGZ1bmMtPmNhcmQtPmhvc3QtPmNhcHMgJiBNTUNfQ0FQX1BPV0VSX09GRl9DQVJEKQorCQlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CiAKIAlkcnYtPnJlbW92ZShmdW5jKTsKIApAQCAtMTg5LDkgKzE4Niw4IEBACiAKIAkvKiBUaGVuIHVuZG8gdGhlIHJ1bnRpbWUgUE0gc2V0dGluZ3MgaW4gc2Rpb19idXNfcHJvYmUoKSAqLwogCWlmIChmdW5jLT5jYXJkLT5ob3N0LT5jYXBzICYgTU1DX0NBUF9QT1dFUl9PRkZfQ0FSRCkKLQkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKIAotb3V0OgogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZwppbmRleCA1NmRiZjNmLi44Yzg3MDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCkBAIC04MSwyOCArODEsMzIgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAotY29uZmlnIE1NQ19TREhDSV9PRgotCXRyaXN0YXRlICJTREhDSSBzdXBwb3J0IG9uIE9wZW5GaXJtd2FyZSBwbGF0Zm9ybXMiCi0JZGVwZW5kcyBvbiBNTUNfU0RIQ0kgJiYgT0YKK2NvbmZpZyBNTUNfU0RIQ0lfUExURk0KKwl0cmlzdGF0ZSAiU0RIQ0kgcGxhdGZvcm0gYW5kIE9GIGRyaXZlciBoZWxwZXIiCisJZGVwZW5kcyBvbiBNTUNfU0RIQ0kKIAloZWxwCi0JICBUaGlzIHNlbGVjdHMgdGhlIE9GIHN1cHBvcnQgZm9yIFNlY3VyZSBEaWdpdGFsIEhvc3QgQ29udHJvbGxlcgotCSAgSW50ZXJmYWNlcy4KKwkgIFRoaXMgc2VsZWN0cyB0aGUgY29tbW9uIGhlbHBlciBmdW5jdGlvbnMgc3VwcG9ydCBmb3IgU2VjdXJlIERpZ2l0YWwKKwkgIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgYmFzZWQgcGxhdGZvcm0gYW5kIE9GIGRyaXZlcnMuCisKKwkgIElmIHlvdSBoYXZlIGEgY29udHJvbGxlciB3aXRoIHRoaXMgaW50ZXJmYWNlLCBzYXkgWSBvciBNIGhlcmUuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBNTUNfU0RIQ0lfT0ZfRVNESEMKLQlib29sICJTREhDSSBPRiBzdXBwb3J0IGZvciB0aGUgRnJlZXNjYWxlIGVTREhDIGNvbnRyb2xsZXIiCi0JZGVwZW5kcyBvbiBNTUNfU0RIQ0lfT0YKKwl0cmlzdGF0ZSAiU0RIQ0kgT0Ygc3VwcG9ydCBmb3IgdGhlIEZyZWVzY2FsZSBlU0RIQyBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gTU1DX1NESENJX1BMVEZNCiAJZGVwZW5kcyBvbiBQUENfT0YKIAlzZWxlY3QgTU1DX1NESENJX0JJR19FTkRJQU5fMzJCSVRfQllURV9TV0FQUEVSCiAJaGVscAogCSAgVGhpcyBzZWxlY3RzIHRoZSBGcmVlc2NhbGUgZVNESEMgY29udHJvbGxlciBzdXBwb3J0LgogCisJICBJZiB5b3UgaGF2ZSBhIGNvbnRyb2xsZXIgd2l0aCB0aGlzIGludGVyZmFjZSwgc2F5IFkgb3IgTSBoZXJlLgorCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgTU1DX1NESENJX09GX0hMV0QKLQlib29sICJTREhDSSBPRiBzdXBwb3J0IGZvciB0aGUgTmludGVuZG8gV2lpIFNESENJIGNvbnRyb2xsZXJzIgotCWRlcGVuZHMgb24gTU1DX1NESENJX09GCisJdHJpc3RhdGUgIlNESENJIE9GIHN1cHBvcnQgZm9yIHRoZSBOaW50ZW5kbyBXaWkgU0RIQ0kgY29udHJvbGxlcnMiCisJZGVwZW5kcyBvbiBNTUNfU0RIQ0lfUExURk0KIAlkZXBlbmRzIG9uIFBQQ19PRgogCXNlbGVjdCBNTUNfU0RIQ0lfQklHX0VORElBTl8zMkJJVF9CWVRFX1NXQVBQRVIKIAloZWxwCkBAIC0xMTAsNDAgKzExNCwzNiBAQAogCSAgZm91bmQgaW4gdGhlICJIb2xseXdvb2QiIGNoaXBzZXQgb2YgdGhlIE5pbnRlbmRvIFdpaSB2aWRlbyBnYW1lCiAJICBjb25zb2xlLgogCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgTU1DX1NESENJX1BMVEZNCi0JdHJpc3RhdGUgIlNESENJIHN1cHBvcnQgb24gdGhlIHBsYXRmb3JtIHNwZWNpZmljIGJ1cyIKLQlkZXBlbmRzIG9uIE1NQ19TREhDSQotCWhlbHAKLQkgIFRoaXMgc2VsZWN0cyB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgYnVzIHN1cHBvcnQgZm9yIFNlY3VyZSBEaWdpdGFsIEhvc3QKLQkgIENvbnRyb2xsZXIgSW50ZXJmYWNlLgotCiAJICBJZiB5b3UgaGF2ZSBhIGNvbnRyb2xsZXIgd2l0aCB0aGlzIGludGVyZmFjZSwgc2F5IFkgb3IgTSBoZXJlLgogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgTU1DX1NESENJX0NOUzNYWFgKLQlib29sICJTREhDSSBzdXBwb3J0IG9uIHRoZSBDYXZpdW0gTmV0d29ya3MgQ05TM3h4eCBTb0MiCisJdHJpc3RhdGUgIlNESENJIHN1cHBvcnQgb24gdGhlIENhdml1bSBOZXR3b3JrcyBDTlMzeHh4IFNvQyIKIAlkZXBlbmRzIG9uIEFSQ0hfQ05TM1hYWAogCWRlcGVuZHMgb24gTU1DX1NESENJX1BMVEZNCiAJaGVscAogCSAgVGhpcyBzZWxlY3RzIHRoZSBTREhDSSBzdXBwb3J0IGZvciBDTlMzeHh4IFN5c3RlbS1vbi1DaGlwIGRldmljZXMuCiAKKwkgIElmIHlvdSBoYXZlIGEgY29udHJvbGxlciB3aXRoIHRoaXMgaW50ZXJmYWNlLCBzYXkgWSBvciBNIGhlcmUuCisKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBNTUNfU0RIQ0lfRVNESENfSU1YCi0JYm9vbCAiU0RIQ0kgcGxhdGZvcm0gc3VwcG9ydCBmb3IgdGhlIEZyZWVzY2FsZSBlU0RIQyBpLk1YIGNvbnRyb2xsZXIiCi0JZGVwZW5kcyBvbiBNTUNfU0RIQ0lfUExURk0gJiYgKEFSQ0hfTVgyNSB8fCBBUkNIX01YMzUgfHwgQVJDSF9NWDUpCisJdHJpc3RhdGUgIlNESENJIHBsYXRmb3JtIHN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgZVNESEMgaS5NWCBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gQVJDSF9NWDI1IHx8IEFSQ0hfTVgzNSB8fCBBUkNIX01YNQorCWRlcGVuZHMgb24gTU1DX1NESENJX1BMVEZNCiAJc2VsZWN0IE1NQ19TREhDSV9JT19BQ0NFU1NPUlMKIAloZWxwCiAJICBUaGlzIHNlbGVjdHMgdGhlIEZyZWVzY2FsZSBlU0RIQyBjb250cm9sbGVyIHN1cHBvcnQgb24gdGhlIHBsYXRmb3JtCiAJICBidXMsIGZvdW5kIG9uIHBsYXRmb3JtcyBsaWtlIG14MzUvNTEuCiAKKwkgIElmIHlvdSBoYXZlIGEgY29udHJvbGxlciB3aXRoIHRoaXMgaW50ZXJmYWNlLCBzYXkgWSBvciBNIGhlcmUuCisKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBNTUNfU0RIQ0lfRE9WRQotCWJvb2wgIlNESENJIHN1cHBvcnQgb24gTWFydmVsbCdzIERvdmUgU29DIgorCXRyaXN0YXRlICJTREhDSSBzdXBwb3J0IG9uIE1hcnZlbGwncyBEb3ZlIFNvQyIKIAlkZXBlbmRzIG9uIEFSQ0hfRE9WRQogCWRlcGVuZHMgb24gTU1DX1NESENJX1BMVEZNCiAJc2VsZWN0IE1NQ19TREhDSV9JT19BQ0NFU1NPUlMKQEAgLTE1MSwxMSArMTUxLDE0IEBACiAJICBUaGlzIHNlbGVjdHMgdGhlIFNlY3VyZSBEaWdpdGFsIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgaW4KIAkgIE1hcnZlbGwncyBEb3ZlIFNvQy4KIAorCSAgSWYgeW91IGhhdmUgYSBjb250cm9sbGVyIHdpdGggdGhpcyBpbnRlcmZhY2UsIHNheSBZIG9yIE0gaGVyZS4KKwogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIE1NQ19TREhDSV9URUdSQQotCWJvb2wgIlNESENJIHBsYXRmb3JtIHN1cHBvcnQgZm9yIHRoZSBUZWdyYSBTRC9NTUMgQ29udHJvbGxlciIKLQlkZXBlbmRzIG9uIE1NQ19TREhDSV9QTFRGTSAmJiBBUkNIX1RFR1JBCisJdHJpc3RhdGUgIlNESENJIHBsYXRmb3JtIHN1cHBvcnQgZm9yIHRoZSBUZWdyYSBTRC9NTUMgQ29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEFSQ0hfVEVHUkEKKwlkZXBlbmRzIG9uIE1NQ19TREhDSV9QTFRGTQogCXNlbGVjdCBNTUNfU0RIQ0lfSU9fQUNDRVNTT1JTCiAJaGVscAogCSAgVGhpcyBzZWxlY3RzIHRoZSBUZWdyYSBTRC9NTUMgY29udHJvbGxlci4gSWYgeW91IGhhdmUgYSBUZWdyYQpAQCAtMTc4LDE0ICsxODEsMjggQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIE1NQ19TREhDSV9QWEEKLQl0cmlzdGF0ZSAiTWFydmVsbCBQWEExNjgvUFhBOTEwL01NUDIgU0QgSG9zdCBDb250cm9sbGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX1BYQSB8fCBBUkNIX01NUAorY29uZmlnIE1NQ19TREhDSV9QWEFWMworCXRyaXN0YXRlICJNYXJ2ZWxsIE1NUDIgU0QgSG9zdCBDb250cm9sbGVyIHN1cHBvcnQgKFBYQVYzKSIKKwlkZXBlbmRzIG9uIENMS0RFVl9MT09LVVAKIAlzZWxlY3QgTU1DX1NESENJCi0Jc2VsZWN0IE1NQ19TREhDSV9JT19BQ0NFU1NPUlMKKwlzZWxlY3QgTU1DX1NESENJX1BMVEZNCisJZGVmYXVsdCBDUFVfTU1QMgogCWhlbHAKLQkgIFRoaXMgc2VsZWN0cyB0aGUgTWFydmVsbChSKSBQWEExNjgvUFhBOTEwL01NUDIgU0QgSG9zdCBDb250cm9sbGVyLgotCSAgSWYgeW91IGhhdmUgYSBQWEExNjgvUFhBOTEwL01NUDIgcGxhdGZvcm0gd2l0aCBTRCBIb3N0IENvbnRyb2xsZXIKKwkgIFRoaXMgc2VsZWN0cyB0aGUgTWFydmVsbChSKSBQWEFWMyBTRCBIb3N0IENvbnRyb2xsZXIuCisJICBJZiB5b3UgaGF2ZSBhIE1NUDIgcGxhdGZvcm0gd2l0aCBTRCBIb3N0IENvbnRyb2xsZXIKKwkgIGFuZCBhIGNhcmQgc2xvdCwgc2F5IFkgb3IgTSBoZXJlLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTU1DX1NESENJX1BYQVYyCisJdHJpc3RhdGUgIk1hcnZlbGwgUFhBOVhYIFNEIEhvc3QgQ29udHJvbGxlciBzdXBwb3J0IChQWEFWMikiCisJZGVwZW5kcyBvbiBDTEtERVZfTE9PS1VQCisJc2VsZWN0IE1NQ19TREhDSQorCXNlbGVjdCBNTUNfU0RIQ0lfUExURk0KKwlkZWZhdWx0IENQVV9QWEE5MTAKKwloZWxwCisJICBUaGlzIHNlbGVjdHMgdGhlIE1hcnZlbGwoUikgUFhBVjIgU0QgSG9zdCBDb250cm9sbGVyLgorCSAgSWYgeW91IGhhdmUgYSBQWEE5WFggcGxhdGZvcm0gd2l0aCBTRCBIb3N0IENvbnRyb2xsZXIKIAkgIGFuZCBhIGNhcmQgc2xvdCwgc2F5IFkgb3IgTSBoZXJlLgogCiAJICBJZiB1bnN1cmUsIHNheSBOLgpAQCAtMjgxLDEzICsyOTgsMTIgQEAKIGVuZGNob2ljZQogCiBjb25maWcgTU1DX0FUTUVMTUNJX0RNQQotCWJvb2wgIkF0bWVsIE1DSSBETUEgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIE1NQ19BVE1FTE1DSSAmJiAoQVZSMzIgfHwgQVJDSF9BVDkxU0FNOUc0NSkgJiYgRE1BX0VOR0lORSAmJiBFWFBFUklNRU5UQUwKKwlib29sICJBdG1lbCBNQ0kgRE1BIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNTUNfQVRNRUxNQ0kgJiYgKEFWUjMyIHx8IEFSQ0hfQVQ5MVNBTTlHNDUpICYmIERNQV9FTkdJTkUKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGhhdmUgdGhlIEF0bWVsIE1DSSBkcml2ZXIgdXNlIGEgRE1BIGVuZ2luZSB0bwogCSAgZG8gZGF0YSB0cmFuc2ZlcnMgYW5kIHRodXMgaW5jcmVhc2UgdGhlIHRocm91Z2hwdXQgYW5kCi0JICByZWR1Y2UgdGhlIENQVSB1dGlsaXphdGlvbi4gTm90ZSB0aGF0IHRoaXMgaXMgaGlnaGx5Ci0JICBleHBlcmltZW50YWwgYW5kIG1heSBjYXVzZSB0aGUgZHJpdmVyIHRvIGxvY2sgdXAuCisJICByZWR1Y2UgdGhlIENQVSB1dGlsaXphdGlvbi4KIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9NYWtlZmlsZSBiL2RyaXZlcnMvbW1jL2hvc3QvTWFrZWZpbGUKaW5kZXggNThhNWNmNy4uYjRiODNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21tYy9ob3N0L01ha2VmaWxlCkBAIC05LDcgKzksOCBAQAogb2JqLSQoQ09ORklHX01NQ19NWFMpCQkrPSBteHMtbW1jLm8KIG9iai0kKENPTkZJR19NTUNfU0RIQ0kpCQkrPSBzZGhjaS5vCiBvYmotJChDT05GSUdfTU1DX1NESENJX1BDSSkJKz0gc2RoY2ktcGNpLm8KLW9iai0kKENPTkZJR19NTUNfU0RIQ0lfUFhBKQkrPSBzZGhjaS1weGEubworb2JqLSQoQ09ORklHX01NQ19TREhDSV9QWEFWMykJKz0gc2RoY2ktcHhhdjMubworb2JqLSQoQ09ORklHX01NQ19TREhDSV9QWEFWMikJKz0gc2RoY2ktcHhhdjIubwogb2JqLSQoQ09ORklHX01NQ19TREhDSV9TM0MpCSs9IHNkaGNpLXMzYy5vCiBvYmotJChDT05GSUdfTU1DX1NESENJX1NQRUFSKQkrPSBzZGhjaS1zcGVhci5vCiBvYmotJChDT05GSUdfTU1DX1dCU0QpCQkrPSB3YnNkLm8KQEAgLTMxLDkgKzMyLDcgQEAKIG9iai0kKENPTkZJR19NTUNfVE1JTykJCSs9IHRtaW9fbW1jLm8KIG9iai0kKENPTkZJR19NTUNfVE1JT19DT1JFKQkrPSB0bWlvX21tY19jb3JlLm8KIHRtaW9fbW1jX2NvcmUteQkJCTo9IHRtaW9fbW1jX3Bpby5vCi1pZm5lcSAoJChDT05GSUdfTU1DX1NESEkpLG4pCi10bWlvX21tY19jb3JlLXkJCQkrPSB0bWlvX21tY19kbWEubwotZW5kaWYKK3RtaW9fbW1jX2NvcmUtJChzdWJzdCBtLHksJChDT05GSUdfTU1DX1NESEkpKQkrPSB0bWlvX21tY19kbWEubwogb2JqLSQoQ09ORklHX01NQ19TREhJKQkJKz0gc2hfbW9iaWxlX3NkaGkubwogb2JqLSQoQ09ORklHX01NQ19DQjcxMCkJCSs9IGNiNzEwLW1tYy5vCiBvYmotJChDT05GSUdfTU1DX1ZJQV9TRE1NQykJKz0gdmlhLXNkbW1jLm8KQEAgLTQ0LDE3ICs0MywxMyBAQAogb2JqLSQoQ09ORklHX01NQ19WVUIzMDApCSs9IHZ1YjMwMC5vCiBvYmotJChDT05GSUdfTU1DX1VTSEMpCQkrPSB1c2hjLm8KIAotb2JqLSQoQ09ORklHX01NQ19TREhDSV9QTFRGTSkJCQkrPSBzZGhjaS1wbGF0Zm9ybS5vCi1zZGhjaS1wbGF0Zm9ybS15CQkJCTo9IHNkaGNpLXBsdGZtLm8KLXNkaGNpLXBsYXRmb3JtLSQoQ09ORklHX01NQ19TREhDSV9DTlMzWFhYKQkrPSBzZGhjaS1jbnMzeHh4Lm8KLXNkaGNpLXBsYXRmb3JtLSQoQ09ORklHX01NQ19TREhDSV9FU0RIQ19JTVgpCSs9IHNkaGNpLWVzZGhjLWlteC5vCi1zZGhjaS1wbGF0Zm9ybS0kKENPTkZJR19NTUNfU0RIQ0lfRE9WRSkJCSs9IHNkaGNpLWRvdmUubwotc2RoY2ktcGxhdGZvcm0tJChDT05GSUdfTU1DX1NESENJX1RFR1JBKQkrPSBzZGhjaS10ZWdyYS5vCi0KLW9iai0kKENPTkZJR19NTUNfU0RIQ0lfT0YpCSs9IHNkaGNpLW9mLm8KLXNkaGNpLW9mLXkJCQkJOj0gc2RoY2ktb2YtY29yZS5vCi1zZGhjaS1vZi0kKENPTkZJR19NTUNfU0RIQ0lfT0ZfRVNESEMpCSs9IHNkaGNpLW9mLWVzZGhjLm8KLXNkaGNpLW9mLSQoQ09ORklHX01NQ19TREhDSV9PRl9ITFdEKQkrPSBzZGhjaS1vZi1obHdkLm8KK29iai0kKENPTkZJR19NTUNfU0RIQ0lfUExURk0pCQkrPSBzZGhjaS1wbHRmbS5vCitvYmotJChDT05GSUdfTU1DX1NESENJX0NOUzNYWFgpCQkrPSBzZGhjaS1jbnMzeHh4Lm8KK29iai0kKENPTkZJR19NTUNfU0RIQ0lfRVNESENfSU1YKQkrPSBzZGhjaS1lc2RoYy1pbXgubworb2JqLSQoQ09ORklHX01NQ19TREhDSV9ET1ZFKQkJKz0gc2RoY2ktZG92ZS5vCitvYmotJChDT05GSUdfTU1DX1NESENJX1RFR1JBKQkJKz0gc2RoY2ktdGVncmEubworb2JqLSQoQ09ORklHX01NQ19TREhDSV9PRl9FU0RIQykJKz0gc2RoY2ktb2YtZXNkaGMubworb2JqLSQoQ09ORklHX01NQ19TREhDSV9PRl9ITFdEKQkJKz0gc2RoY2ktb2YtaGx3ZC5vCiAKIGlmZXEgKCQoQ09ORklHX0NCNzEwX0RFQlVHKSx5KQogCUNGTEFHUy1jYjcxMC1tbWMJKz0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9hdDkxX21jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9hdDkxX21jaS5jCmluZGV4IGQzZTZhOTYuLmE0YWEzYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvYXQ5MV9tY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2F0OTFfbWNpLmMKQEAgLTc3LDcgKzc3LDggQEAKIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgotI2luY2x1ZGUgPG1hY2gvYXQ5MV9tY2kuaD4KKworI2luY2x1ZGUgImF0OTFfbWNpLmgiCiAKICNkZWZpbmUgRFJJVkVSX05BTUUgImF0OTFfbWNpIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2F0OTFfbWNpLmggYi9kcml2ZXJzL21tYy9ob3N0L2F0OTFfbWNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjM2E2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvYXQ5MV9tY2kuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIGRyaXZlcnMvbW1jL2hvc3QvYXQ5MV9tY2kuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJdmFuIEtva3NoYXlza3kKKyAqIENvcHlyaWdodCAoQykgU0FOIFBlb3BsZQorICoKKyAqIE11bHRpTWVkaWEgQ2FyZCBJbnRlcmZhY2UgKE1DSSkgcmVnaXN0ZXJzLgorICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MV9NQ0lfSAorI2RlZmluZSBBVDkxX01DSV9ICisKKyNkZWZpbmUgQVQ5MV9NQ0lfQ1IJCTB4MDAJCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX01DSUVOCQkoMSA8PCAgMCkJLyogTXVsdGktTWVkaWEgSW50ZXJmYWNlIEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9NQ0lfTUNJRElTCQkoMSA8PCAgMSkJLyogTXVsdGktTWVkaWEgSW50ZXJmYWNlIERpc2FibGUgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1BXU0VOCQkoMSA8PCAgMikJLyogUG93ZXIgU2F2ZSBNb2RlIEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9NQ0lfUFdTRElTCQkoMSA8PCAgMykJLyogUG93ZXIgU2F2ZSBNb2RlIERpc2FibGUgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1NXUlNUCQkoMSA8PCAgNykJLyogU29mdHdhcmUgUmVzZXQgKi8KKworI2RlZmluZSBBVDkxX01DSV9NUgkJMHgwNAkJLyogTW9kZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfQ0xLRElWCQkoMHhmZiAgPDwgIDApCS8qIENsb2NrIERpdmlkZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1BXU0RJVgkJKDcgICAgIDw8ICA4KQkvKiBQb3dlciBTYXZpbmcgRGl2aWRlciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfUkRQUk9PRgkoMSAgICAgPDwgMTEpCS8qIFJlYWQgUHJvb2YgRW5hYmxlIFtTQU05MjZbMDNdIG9ubHldICovCisjZGVmaW5lCQlBVDkxX01DSV9XUlBST09GCSgxICAgICA8PCAxMikJLyogV3JpdGUgUHJvb2YgRW5hYmxlIFtTQU05MjZbMDNdIG9ubHldICovCisjZGVmaW5lCQlBVDkxX01DSV9QRENGQllURQkoMSAgICAgPDwgMTMpCS8qIFBEQyBGb3JjZSBCeXRlIFRyYW5zZmVyIFtTQU05MjZbMDNdIG9ubHldICovCisjZGVmaW5lCQlBVDkxX01DSV9QRENQQURWCSgxICAgICA8PCAxNCkJLyogUERDIFBhZGRpbmcgVmFsdWUgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1BEQ01PREUJKDEgICAgIDw8IDE1KQkvKiBQREMtb3JpZW50YXRlZCBNb2RlICovCisjZGVmaW5lCQlBVDkxX01DSV9CTEtMRU4JCSgweGZmZiA8PCAxOCkJLyogRGF0YSBCbG9jayBMZW5ndGggKi8KKworI2RlZmluZSBBVDkxX01DSV9EVE9SCQkweDA4CQkvKiBEYXRhIFRpbWVvdXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX0RUT0NZQwkJKDB4ZiA8PCAwKQkvKiBEYXRhIFRpbWVvdXQgQ3ljbGUgTnVtYmVyICovCisjZGVmaW5lCQlBVDkxX01DSV9EVE9NVUwJCSg3ICAgPDwgNCkJLyogRGF0YSBUaW1lb3V0IE11bHRpcGxpZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF8xCQkoMCA8PCAgNCkKKyNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF8xNgkJKDEgPDwgIDQpCisjZGVmaW5lCQlBVDkxX01DSV9EVE9NVUxfMTI4CQkoMiA8PCAgNCkKKyNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF8yNTYJCSgzIDw8ICA0KQorI2RlZmluZQkJQVQ5MV9NQ0lfRFRPTVVMXzFLCQkoNCA8PCAgNCkKKyNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF80SwkJKDUgPDwgIDQpCisjZGVmaW5lCQlBVDkxX01DSV9EVE9NVUxfNjRLCQkoNiA8PCAgNCkKKyNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF8xTQkJKDcgPDwgIDQpCisKKyNkZWZpbmUgQVQ5MV9NQ0lfU0RDUgkJMHgwYwkJLyogU0QgQ2FyZCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfU0RDU0VMCQkoMyA8PCAwKQkvKiBTRCBDYXJkIFNlbGVjdG9yICovCisjZGVmaW5lCQlBVDkxX01DSV9TRENCVVMJCSgxIDw8IDcpCS8qIDEtYml0IG9yIDQtYml0IGJ1cyAqLworCisjZGVmaW5lIEFUOTFfTUNJX0FSR1IJCTB4MTAJCS8qIEFyZ3VtZW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVQ5MV9NQ0lfQ01EUgkJMHgxNAkJLyogQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfQ01ETkIJCSgweDNmIDw8IDApCS8qIENvbW1hbmQgTnVtYmVyICovCisjZGVmaW5lCQlBVDkxX01DSV9SU1BUWVAJCSgzICAgIDw8IDYpCS8qIFJlc3BvbnNlIFR5cGUgKi8KKyNkZWZpbmUJCQlBVDkxX01DSV9SU1BUWVBfTk9ORQkoMCA8PCAgNikKKyNkZWZpbmUJCQlBVDkxX01DSV9SU1BUWVBfNDgJKDEgPDwgIDYpCisjZGVmaW5lCQkJQVQ5MV9NQ0lfUlNQVFlQXzEzNgkoMiA8PCAgNikKKyNkZWZpbmUJCUFUOTFfTUNJX1NQQ01ECQkoNyAgICA8PCA4KQkvKiBTcGVjaWFsIENvbW1hbmQgKi8KKyNkZWZpbmUJCQlBVDkxX01DSV9TUENNRF9OT05FCSgwIDw8ICA4KQorI2RlZmluZQkJCUFUOTFfTUNJX1NQQ01EX0lOSVQJKDEgPDwgIDgpCisjZGVmaW5lCQkJQVQ5MV9NQ0lfU1BDTURfU1lOQwkoMiA8PCAgOCkKKyNkZWZpbmUJCQlBVDkxX01DSV9TUENNRF9JQ01ECSg0IDw8ICA4KQorI2RlZmluZQkJCUFUOTFfTUNJX1NQQ01EX0lSRVNQCSg1IDw8ICA4KQorI2RlZmluZQkJQVQ5MV9NQ0lfT1BEQ01ECQkoMSA8PCAxMSkJLyogT3BlbiBEcmFpbiBDb21tYW5kICovCisjZGVmaW5lCQlBVDkxX01DSV9NQVhMQVQJCSgxIDw8IDEyKQkvKiBNYXggTGF0ZW5jeSBmb3IgQ29tbWFuZCB0byBSZXNwb25zZSAqLworI2RlZmluZQkJQVQ5MV9NQ0lfVFJDTUQJCSgzIDw8IDE2KQkvKiBUcmFuc2ZlciBDb21tYW5kICovCisjZGVmaW5lCQkJQVQ5MV9NQ0lfVFJDTURfTk9ORQkoMCA8PCAxNikKKyNkZWZpbmUJCQlBVDkxX01DSV9UUkNNRF9TVEFSVAkoMSA8PCAxNikKKyNkZWZpbmUJCQlBVDkxX01DSV9UUkNNRF9TVE9QCSgyIDw8IDE2KQorI2RlZmluZQkJQVQ5MV9NQ0lfVFJESVIJCSgxIDw8IDE4KQkvKiBUcmFuc2ZlciBEaXJlY3Rpb24gKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1RSVFlQCQkoMyA8PCAxOSkJLyogVHJhbnNmZXIgVHlwZSAqLworI2RlZmluZQkJCUFUOTFfTUNJX1RSVFlQX0JMT0NLCSgwIDw8IDE5KQorI2RlZmluZQkJCUFUOTFfTUNJX1RSVFlQX01VTFRJUExFCSgxIDw8IDE5KQorI2RlZmluZQkJCUFUOTFfTUNJX1RSVFlQX1NUUkVBTQkoMiA8PCAxOSkKKyNkZWZpbmUJCQlBVDkxX01DSV9UUlRZUF9TRElPX0JZVEUJKDQgPDwgMTkpCisjZGVmaW5lCQkJQVQ5MV9NQ0lfVFJUWVBfU0RJT19CTE9DSwkoNSA8PCAxOSkKKworI2RlZmluZSBBVDkxX01DSV9CTEtSCQkweDE4CQkvKiBCbG9jayBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfQkxLUl9CQ05UKG4pCSgoMHhmZmZmICYgKG4pKSA8PCAwKQkvKiBCbG9jayBjb3VudCAqLworI2RlZmluZQkJQVQ5MV9NQ0lfQkxLUl9CTEtMRU4obikJKCgweGZmZmYgJiAobikpIDw8IDE2KQkvKiBCbG9jayBsZW5ndGggKi8KKworI2RlZmluZSBBVDkxX01DSV9SU1BSKG4pCSgweDIwICsgKChuKSAqIDQpKQkvKiBSZXNwb25zZSBSZWdpc3RlcnMgMC0zICovCisjZGVmaW5lIEFUOTFfTUNSX1JEUgkJMHgzMAkJLyogUmVjZWl2ZSBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfTUNSX1REUgkJMHgzNAkJLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAqLworCisjZGVmaW5lIEFUOTFfTUNJX1NSCQkweDQwCQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX0NNRFJEWQkJKDEgPDwgIDApCS8qIENvbW1hbmQgUmVhZHkgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1JYUkRZCQkoMSA8PCAgMSkJLyogUmVjZWl2ZXIgUmVhZHkgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1RYUkRZCQkoMSA8PCAgMikJLyogVHJhbnNtaXQgUmVhZHkgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX0JMS0UJCSgxIDw8ICAzKQkvKiBEYXRhIEJsb2NrIEVuZGVkICovCisjZGVmaW5lCQlBVDkxX01DSV9EVElQCQkoMSA8PCAgNCkJLyogRGF0YSBUcmFuc2ZlciBpbiBQcm9ncmVzcyAqLworI2RlZmluZQkJQVQ5MV9NQ0lfTk9UQlVTWQkoMSA8PCAgNSkJLyogRGF0YSBOb3QgQnVzeSAqLworI2RlZmluZQkJQVQ5MV9NQ0lfRU5EUlgJCSgxIDw8ICA2KQkvKiBFbmQgb2YgUlggQnVmZmVyICovCisjZGVmaW5lCQlBVDkxX01DSV9FTkRUWAkJKDEgPDwgIDcpCS8qIEVuZCBmbyBUWCBCdWZmZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1NESU9JUlFBCSgxIDw8ICA4KQkvKiBTRElPIEludGVycnVwdCBmb3IgU2xvdCBBICovCisjZGVmaW5lCQlBVDkxX01DSV9TRElPSVJRQgkoMSA8PCAgOSkJLyogU0RJTyBJbnRlcnJ1cHQgZm9yIFNsb3QgQiAqLworI2RlZmluZQkJQVQ5MV9NQ0lfUlhCVUZGCQkoMSA8PCAxNCkJLyogUlggQnVmZmVyIEZ1bGwgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1RYQlVGRQkJKDEgPDwgMTUpCS8qIFRYIEJ1ZmZlciBFbXB0eSAqLworI2RlZmluZQkJQVQ5MV9NQ0lfUklOREUJCSgxIDw8IDE2KQkvKiBSZXNwb25zZSBJbmRleCBFcnJvciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfUkRJUkUJCSgxIDw8IDE3KQkvKiBSZXNwb25zZSBEaXJlY3Rpb24gRXJyb3IgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1JDUkNFCQkoMSA8PCAxOCkJLyogUmVzcG9uc2UgQ1JDIEVycm9yICovCisjZGVmaW5lCQlBVDkxX01DSV9SRU5ERQkJKDEgPDwgMTkpCS8qIFJlc3BvbnNlIEVuZCBCaXQgRXJyb3IgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1JUT0UJCSgxIDw8IDIwKQkvKiBSZXNwb25zZSBUaW1lLW91dCBFcnJvciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfRENSQ0UJCSgxIDw8IDIxKQkvKiBEYXRhIENSQyBFcnJvciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfRFRPRQkJKDEgPDwgMjIpCS8qIERhdGEgVGltZS1vdXQgRXJyb3IgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX09WUkUJCSgxIDw8IDMwKQkvKiBPdmVycnVuICovCisjZGVmaW5lCQlBVDkxX01DSV9VTlJFCQkoMSA8PCAzMSkJLyogVW5kZXJydW4gKi8KKworI2RlZmluZSBBVDkxX01DSV9JRVIJCTB4NDQJCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9NQ0lfSURSCQkweDQ4CQkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX01DSV9JTVIJCTB4NGMJCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMKaW5kZXggYWE4MDM5Zi4uZmE4Y2FlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jCkBAIC0yMDMsNiArMjAzLDcgQEAKICNkZWZpbmUgQVRNQ0lfQ0FSRF9QUkVTRU5UCTAKICNkZWZpbmUgQVRNQ0lfQ0FSRF9ORUVEX0lOSVQJMQogI2RlZmluZSBBVE1DSV9TSFVURE9XTgkJMgorI2RlZmluZSBBVE1DSV9TVVNQRU5ERUQJCTMKIAogCWludAkJCWRldGVjdF9waW47CiAJaW50CQkJd3BfcGluOwpAQCAtMTg3OCwxMCArMTg3OSw3MiBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGF0bWNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhdG1lbF9tY2kgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgaTsKKworCSBmb3IgKGkgPSAwOyBpIDwgQVRNRUxfTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CisJCXN0cnVjdCBhdG1lbF9tY2lfc2xvdCAqc2xvdCA9IGhvc3QtPnNsb3RbaV07CisJCWludCByZXQ7CisKKwkJaWYgKCFzbG90KQorCQkJY29udGludWU7CisJCXJldCA9IG1tY19zdXNwZW5kX2hvc3Qoc2xvdC0+bW1jKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXdoaWxlICgtLWkgPj0gMCkgeworCQkJCXNsb3QgPSBob3N0LT5zbG90W2ldOworCQkJCWlmIChzbG90CisJCQkJJiYgdGVzdF9iaXQoQVRNQ0lfU1VTUEVOREVELCAmc2xvdC0+ZmxhZ3MpKSB7CisJCQkJCW1tY19yZXN1bWVfaG9zdChob3N0LT5zbG90W2ldLT5tbWMpOworCQkJCQljbGVhcl9iaXQoQVRNQ0lfU1VTUEVOREVELCAmc2xvdC0+ZmxhZ3MpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQlzZXRfYml0KEFUTUNJX1NVU1BFTkRFRCwgJnNsb3QtPmZsYWdzKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0bWVsX21jaSAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpOworCWludCByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFUTUVMX01DSV9NQVhfTlJfU0xPVFM7IGkrKykgeworCQlzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QgKnNsb3QgPSBob3N0LT5zbG90W2ldOworCQlpbnQgZXJyOworCisJCXNsb3QgPSBob3N0LT5zbG90W2ldOworCQlpZiAoIXNsb3QpCisJCQljb250aW51ZTsKKwkJaWYgKCF0ZXN0X2JpdChBVE1DSV9TVVNQRU5ERUQsICZzbG90LT5mbGFncykpCisJCQljb250aW51ZTsKKwkJZXJyID0gbW1jX3Jlc3VtZV9ob3N0KHNsb3QtPm1tYyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0ID0gZXJyOworCQllbHNlCisJCQljbGVhcl9iaXQoQVRNQ0lfU1VTUEVOREVELCAmc2xvdC0+ZmxhZ3MpOworCX0KKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoYXRtY2lfcG0sIGF0bWNpX3N1c3BlbmQsIGF0bWNpX3Jlc3VtZSk7CisjZGVmaW5lIEFUTUNJX1BNX09QUwkoJmF0bWNpX3BtKQorI2Vsc2UKKyNkZWZpbmUgQVRNQ0lfUE1fT1BTCU5VTEwKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdG1jaV9kcml2ZXIgPSB7CiAJLnJlbW92ZQkJPSBfX2V4aXRfcChhdG1jaV9yZW1vdmUpLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQkJPSAiYXRtZWxfbWNpIiwKKwkJLnBtCQk9IEFUTUNJX1BNX09QUywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMKaW5kZXggNjZkY2RkYi4uNzdmMGI2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW1jL2R3X21tYy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSAiZHdfbW1jLmgiCiAKQEAgLTEwMCw2ICsxMDEsOCBAQAogCWludAkJCWxhc3RfZGV0ZWN0X3N0YXRlOwogfTsKIAorc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpkd19tY2lfY2FyZF93b3JrcXVldWU7CisKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKIHN0YXRpYyBpbnQgZHdfbWNpX3JlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKIHsKQEAgLTI4NCw3ICsyODcsNyBAQAogLyogRE1BIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KIHN0YXRpYyB2b2lkIGR3X21jaV9zdG9wX2RtYShzdHJ1Y3QgZHdfbWNpICpob3N0KQogewotCWlmIChob3N0LT51c2VfZG1hKSB7CisJaWYgKGhvc3QtPnVzaW5nX2RtYSkgewogCQlob3N0LT5kbWFfb3BzLT5zdG9wKGhvc3QpOwogCQlob3N0LT5kbWFfb3BzLT5jbGVhbnVwKGhvc3QpOwogCX0gZWxzZSB7CkBAIC00MzIsNiArNDM1LDggQEAKIAl1bnNpZ25lZCBpbnQgaSwgZGlyZWN0aW9uLCBzZ19sZW47CiAJdTMyIHRlbXA7CiAKKwlob3N0LT51c2luZ19kbWEgPSAwOworCiAJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoYW5uZWwsIHdlIGNhbid0IGRvIERNQSAqLwogCWlmICghaG9zdC0+dXNlX2RtYSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC00NTEsNiArNDU2LDggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWhvc3QtPnVzaW5nX2RtYSA9IDE7CisKIAlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQogCQlkaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CiAJZWxzZQpAQCAtNDg5LDE0ICs0OTYsMTggQEAKIAlob3N0LT5zZyA9IE5VTEw7CiAJaG9zdC0+ZGF0YSA9IGRhdGE7CiAKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQorCQlob3N0LT5kaXJfc3RhdHVzID0gRFdfTUNJX1JFQ1ZfU1RBVFVTOworCWVsc2UKKwkJaG9zdC0+ZGlyX3N0YXR1cyA9IERXX01DSV9TRU5EX1NUQVRVUzsKKwogCWlmIChkd19tY2lfc3VibWl0X2RhdGFfZG1hKGhvc3QsIGRhdGEpKSB7CiAJCWhvc3QtPnNnID0gZGF0YS0+c2c7CiAJCWhvc3QtPnBpb19vZmZzZXQgPSAwOwotCQlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQotCQkJaG9zdC0+ZGlyX3N0YXR1cyA9IERXX01DSV9SRUNWX1NUQVRVUzsKLQkJZWxzZQotCQkJaG9zdC0+ZGlyX3N0YXR1cyA9IERXX01DSV9TRU5EX1NUQVRVUzsKKwkJaG9zdC0+cGFydF9idWZfc3RhcnQgPSAwOworCQlob3N0LT5wYXJ0X2J1Zl9jb3VudCA9IDA7CiAKKwkJbWNpX3dyaXRlbChob3N0LCBSSU5UU1RTLCBTRE1NQ19JTlRfVFhEUiB8IFNETU1DX0lOVF9SWERSKTsKIAkJdGVtcCA9IG1jaV9yZWFkbChob3N0LCBJTlRNQVNLKTsKIAkJdGVtcCB8PSBTRE1NQ19JTlRfVFhEUiB8IFNETU1DX0lOVF9SWERSOwogCQltY2lfd3JpdGVsKGhvc3QsIElOVE1BU0ssIHRlbXApOwpAQCAtNTc0LDcgKzU4NSw3IEBACiAJfQogCiAJLyogU2V0IHRoZSBjdXJyZW50IHNsb3QgYnVzIHdpZHRoICovCi0JbWNpX3dyaXRlbChob3N0LCBDVFlQRSwgc2xvdC0+Y3R5cGUpOworCW1jaV93cml0ZWwoaG9zdCwgQ1RZUEUsIChzbG90LT5jdHlwZSA8PCBzbG90LT5pZCkpOwogfQogCiBzdGF0aWMgdm9pZCBkd19tY2lfc3RhcnRfcmVxdWVzdChzdHJ1Y3QgZHdfbWNpICpob3N0LApAQCAtNjI0LDEzICs2MzUsMTMgQEAKIAkJaG9zdC0+c3RvcF9jbWRyID0gZHdfbWNpX3ByZXBhcmVfY29tbWFuZChzbG90LT5tbWMsIG1ycS0+c3RvcCk7CiB9CiAKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggaG9zdC0+bG9jayBoZWxkICovCiBzdGF0aWMgdm9pZCBkd19tY2lfcXVldWVfcmVxdWVzdChzdHJ1Y3QgZHdfbWNpICpob3N0LCBzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QsCiAJCQkJIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewogCWRldl92ZGJnKCZzbG90LT5tbWMtPmNsYXNzX2RldiwgInF1ZXVlIHJlcXVlc3Q6IHN0YXRlPSVkXG4iLAogCQkgaG9zdC0+c3RhdGUpOwogCi0Jc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKIAlzbG90LT5tcnEgPSBtcnE7CiAKIAlpZiAoaG9zdC0+c3RhdGUgPT0gU1RBVEVfSURMRSkgewpAQCAtNjM5LDggKzY1MCw2IEBACiAJfSBlbHNlIHsKIAkJbGlzdF9hZGRfdGFpbCgmc2xvdC0+cXVldWVfbm9kZSwgJmhvc3QtPnF1ZXVlKTsKIAl9Ci0KLQlzcGluX3VubG9ja19iaCgmaG9zdC0+bG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGR3X21jaV9yZXF1ZXN0KHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKQEAgLTY1MCwxNCArNjU5LDIzIEBACiAKIAlXQVJOX09OKHNsb3QtPm1ycSk7CiAKKwkvKgorCSAqIFRoZSBjaGVjayBmb3IgY2FyZCBwcmVzZW5jZSBhbmQgcXVldWVpbmcgb2YgdGhlIHJlcXVlc3QgbXVzdCBiZQorCSAqIGF0b21pYywgb3RoZXJ3aXNlIHRoZSBjYXJkIGNvdWxkIGJlIHJlbW92ZWQgaW4gYmV0d2VlbiBhbmQgdGhlCisJICogcmVxdWVzdCB3b3VsZG4ndCBmYWlsIHVudGlsIGFub3RoZXIgY2FyZCB3YXMgaW5zZXJ0ZWQuCisJICovCisJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKKwogCWlmICghdGVzdF9iaXQoRFdfTU1DX0NBUkRfUFJFU0VOVCwgJnNsb3QtPmZsYWdzKSkgeworCQlzcGluX3VubG9ja19iaCgmaG9zdC0+bG9jayk7CiAJCW1ycS0+Y21kLT5lcnJvciA9IC1FTk9NRURJVU07CiAJCW1tY19yZXF1ZXN0X2RvbmUobW1jLCBtcnEpOwogCQlyZXR1cm47CiAJfQogCi0JLyogV2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSBibG9ja3Mgb2Ygd2VpcmQgbGVuZ3Rocy4gKi8KIAlkd19tY2lfcXVldWVfcmVxdWVzdChob3N0LCBzbG90LCBtcnEpOworCisJc3Bpbl91bmxvY2tfYmgoJmhvc3QtPmxvY2spOwogfQogCiBzdGF0aWMgdm9pZCBkd19tY2lfc2V0X2lvcyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19pb3MgKmlvcykKQEAgLTgzMSw3ICs4NDksNyBAQAogCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kOwogCWVudW0gZHdfbWNpX3N0YXRlIHN0YXRlOwogCWVudW0gZHdfbWNpX3N0YXRlIHByZXZfc3RhdGU7Ci0JdTMyIHN0YXR1czsKKwl1MzIgc3RhdHVzLCBjdHJsOwogCiAJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKIApAQCAtODkxLDEzICs5MDksMTkgQEAKIAogCQkJaWYgKHN0YXR1cyAmIERXX01DSV9EQVRBX0VSUk9SX0ZMQUdTKSB7CiAJCQkJaWYgKHN0YXR1cyAmIFNETU1DX0lOVF9EVE8pIHsKLQkJCQkJZGV2X2VycigmaG9zdC0+cGRldi0+ZGV2LAotCQkJCQkJImRhdGEgdGltZW91dCBlcnJvclxuIik7CiAJCQkJCWRhdGEtPmVycm9yID0gLUVUSU1FRE9VVDsKIAkJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFNETU1DX0lOVF9EQ1JDKSB7Ci0JCQkJCWRldl9lcnIoJmhvc3QtPnBkZXYtPmRldiwKLQkJCQkJCSJkYXRhIENSQyBlcnJvclxuIik7CiAJCQkJCWRhdGEtPmVycm9yID0gLUVJTFNFUTsKKwkJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFNETU1DX0lOVF9FQkUgJiYKKwkJCQkJICAgaG9zdC0+ZGlyX3N0YXR1cyA9PQorCQkJCQkJCURXX01DSV9TRU5EX1NUQVRVUykgeworCQkJCQkvKgorCQkJCQkgKiBObyBkYXRhIENSQyBzdGF0dXMgd2FzIHJldHVybmVkLgorCQkJCQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHdpbGwKKwkJCQkJICogYmUgZXhhZ2dlcmF0ZWQgaW4gUElPIG1vZGUuCisJCQkJCSAqLworCQkJCQlkYXRhLT5ieXRlc194ZmVyZWQgPSAwOworCQkJCQlkYXRhLT5lcnJvciA9IC1FVElNRURPVVQ7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZGV2X2VycigmaG9zdC0+cGRldi0+ZGV2LAogCQkJCQkJImRhdGEgRklGTyBlcnJvciAiCkBAIC05MDUsNiArOTI5LDE2IEBACiAJCQkJCQlzdGF0dXMpOwogCQkJCQlkYXRhLT5lcnJvciA9IC1FSU87CiAJCQkJfQorCQkJCS8qCisJCQkJICogQWZ0ZXIgYW4gZXJyb3IsIHRoZXJlIG1heSBiZSBkYXRhIGxpbmdlcmluZworCQkJCSAqIGluIHRoZSBGSUZPLCBzbyByZXNldCBpdCAtIGRvaW5nIHNvCisJCQkJICogZ2VuZXJhdGVzIGEgYmxvY2sgaW50ZXJydXB0LCBoZW5jZSBzZXR0aW5nCisJCQkJICogdGhlIHNjYXR0ZXItZ2F0aGVyIHBvaW50ZXIgdG8gTlVMTC4KKwkJCQkgKi8KKwkJCQlob3N0LT5zZyA9IE5VTEw7CisJCQkJY3RybCA9IG1jaV9yZWFkbChob3N0LCBDVFJMKTsKKwkJCQljdHJsIHw9IFNETU1DX0NUUkxfRklGT19SRVNFVDsKKwkJCQltY2lfd3JpdGVsKGhvc3QsIENUUkwsIGN0cmwpOwogCQkJfSBlbHNlIHsKIAkJCQlkYXRhLT5ieXRlc194ZmVyZWQgPSBkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzejsKIAkJCQlkYXRhLT5lcnJvciA9IDA7CkBAIC05NDYsODQgKzk4MCwyNzggQEAKIAogfQogCisvKiBwdXNoIGZpbmFsIGJ5dGVzIHRvIHBhcnRfYnVmLCBvbmx5IHVzZSBkdXJpbmcgcHVzaCAqLworc3RhdGljIHZvaWQgZHdfbWNpX3NldF9wYXJ0X2J5dGVzKHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCkKK3sKKwltZW1jcHkoKHZvaWQgKikmaG9zdC0+cGFydF9idWYsIGJ1ZiwgY250KTsKKwlob3N0LT5wYXJ0X2J1Zl9jb3VudCA9IGNudDsKK30KKworLyogYXBwZW5kIGJ5dGVzIHRvIHBhcnRfYnVmLCBvbmx5IHVzZSBkdXJpbmcgcHVzaCAqLworc3RhdGljIGludCBkd19tY2lfcHVzaF9wYXJ0X2J5dGVzKHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCkKK3sKKwljbnQgPSBtaW4oY250LCAoMSA8PCBob3N0LT5kYXRhX3NoaWZ0KSAtIGhvc3QtPnBhcnRfYnVmX2NvdW50KTsKKwltZW1jcHkoKHZvaWQgKikmaG9zdC0+cGFydF9idWYgKyBob3N0LT5wYXJ0X2J1Zl9jb3VudCwgYnVmLCBjbnQpOworCWhvc3QtPnBhcnRfYnVmX2NvdW50ICs9IGNudDsKKwlyZXR1cm4gY250OworfQorCisvKiBwdWxsIGZpcnN0IGJ5dGVzIGZyb20gcGFydF9idWYsIG9ubHkgdXNlIGR1cmluZyBwdWxsICovCitzdGF0aWMgaW50IGR3X21jaV9wdWxsX3BhcnRfYnl0ZXMoc3RydWN0IGR3X21jaSAqaG9zdCwgdm9pZCAqYnVmLCBpbnQgY250KQoreworCWNudCA9IG1pbihjbnQsIChpbnQpaG9zdC0+cGFydF9idWZfY291bnQpOworCWlmIChjbnQpIHsKKwkJbWVtY3B5KGJ1ZiwgKHZvaWQgKikmaG9zdC0+cGFydF9idWYgKyBob3N0LT5wYXJ0X2J1Zl9zdGFydCwKKwkJICAgICAgIGNudCk7CisJCWhvc3QtPnBhcnRfYnVmX2NvdW50IC09IGNudDsKKwkJaG9zdC0+cGFydF9idWZfc3RhcnQgKz0gY250OworCX0KKwlyZXR1cm4gY250OworfQorCisvKiBwdWxsIGZpbmFsIGJ5dGVzIGZyb20gdGhlIHBhcnRfYnVmLCBhc3N1bWluZyBpdCdzIGp1c3QgYmVlbiBmaWxsZWQgKi8KK3N0YXRpYyB2b2lkIGR3X21jaV9wdWxsX2ZpbmFsX2J5dGVzKHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCkKK3sKKwltZW1jcHkoYnVmLCAmaG9zdC0+cGFydF9idWYsIGNudCk7CisJaG9zdC0+cGFydF9idWZfc3RhcnQgPSBjbnQ7CisJaG9zdC0+cGFydF9idWZfY291bnQgPSAoMSA8PCBob3N0LT5kYXRhX3NoaWZ0KSAtIGNudDsKK30KKwogc3RhdGljIHZvaWQgZHdfbWNpX3B1c2hfZGF0YTE2KHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCkKIHsKLQl1MTYgKnBkYXRhID0gKHUxNiAqKWJ1ZjsKLQotCVdBUk5fT04oY250ICUgMiAhPSAwKTsKLQotCWNudCA9IGNudCA+PiAxOwotCXdoaWxlIChjbnQgPiAwKSB7Ci0JCW1jaV93cml0ZXcoaG9zdCwgREFUQSwgKnBkYXRhKyspOwotCQljbnQtLTsKKwkvKiB0cnkgYW5kIHB1c2ggYW55dGhpbmcgaW4gdGhlIHBhcnRfYnVmICovCisJaWYgKHVubGlrZWx5KGhvc3QtPnBhcnRfYnVmX2NvdW50KSkgeworCQlpbnQgbGVuID0gZHdfbWNpX3B1c2hfcGFydF9ieXRlcyhob3N0LCBidWYsIGNudCk7CisJCWJ1ZiArPSBsZW47CisJCWNudCAtPSBsZW47CisJCWlmICghc2dfbmV4dChob3N0LT5zZykgfHwgaG9zdC0+cGFydF9idWZfY291bnQgPT0gMikgeworCQkJbWNpX3dyaXRldyhob3N0LCBEQVRBLCBob3N0LT5wYXJ0X2J1ZjE2KTsKKwkJCWhvc3QtPnBhcnRfYnVmX2NvdW50ID0gMDsKKwkJfQorCX0KKyNpZm5kZWYgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MKKwlpZiAodW5saWtlbHkoKHVuc2lnbmVkIGxvbmcpYnVmICYgMHgxKSkgeworCQl3aGlsZSAoY250ID49IDIpIHsKKwkJCXUxNiBhbGlnbmVkX2J1Zls2NF07CisJCQlpbnQgbGVuID0gbWluKGNudCAmIC0yLCAoaW50KXNpemVvZihhbGlnbmVkX2J1ZikpOworCQkJaW50IGl0ZW1zID0gbGVuID4+IDE7CisJCQlpbnQgaTsKKwkJCS8qIG1lbWNweSBmcm9tIGlucHV0IGJ1ZmZlciBpbnRvIGFsaWduZWQgYnVmZmVyICovCisJCQltZW1jcHkoYWxpZ25lZF9idWYsIGJ1ZiwgbGVuKTsKKwkJCWJ1ZiArPSBsZW47CisJCQljbnQgLT0gbGVuOworCQkJLyogcHVzaCBkYXRhIGZyb20gYWxpZ25lZCBidWZmZXIgaW50byBmaWZvICovCisJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7ICsraSkKKwkJCQltY2lfd3JpdGV3KGhvc3QsIERBVEEsIGFsaWduZWRfYnVmW2ldKTsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisJeworCQl1MTYgKnBkYXRhID0gYnVmOworCQlmb3IgKDsgY250ID49IDI7IGNudCAtPSAyKQorCQkJbWNpX3dyaXRldyhob3N0LCBEQVRBLCAqcGRhdGErKyk7CisJCWJ1ZiA9IHBkYXRhOworCX0KKwkvKiBwdXQgYW55dGhpbmcgcmVtYWluaW5nIGluIHRoZSBwYXJ0X2J1ZiAqLworCWlmIChjbnQpIHsKKwkJZHdfbWNpX3NldF9wYXJ0X2J5dGVzKGhvc3QsIGJ1ZiwgY250KTsKKwkJaWYgKCFzZ19uZXh0KGhvc3QtPnNnKSkKKwkJCW1jaV93cml0ZXcoaG9zdCwgREFUQSwgaG9zdC0+cGFydF9idWYxNik7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBkd19tY2lfcHVsbF9kYXRhMTYoc3RydWN0IGR3X21jaSAqaG9zdCwgdm9pZCAqYnVmLCBpbnQgY250KQogewotCXUxNiAqcGRhdGEgPSAodTE2ICopYnVmOwotCi0JV0FSTl9PTihjbnQgJSAyICE9IDApOwotCi0JY250ID0gY250ID4+IDE7Ci0Jd2hpbGUgKGNudCA+IDApIHsKLQkJKnBkYXRhKysgPSBtY2lfcmVhZHcoaG9zdCwgREFUQSk7Ci0JCWNudC0tOworI2lmbmRlZiBDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUworCWlmICh1bmxpa2VseSgodW5zaWduZWQgbG9uZylidWYgJiAweDEpKSB7CisJCXdoaWxlIChjbnQgPj0gMikgeworCQkJLyogcHVsbCBkYXRhIGZyb20gZmlmbyBpbnRvIGFsaWduZWQgYnVmZmVyICovCisJCQl1MTYgYWxpZ25lZF9idWZbNjRdOworCQkJaW50IGxlbiA9IG1pbihjbnQgJiAtMiwgKGludClzaXplb2YoYWxpZ25lZF9idWYpKTsKKwkJCWludCBpdGVtcyA9IGxlbiA+PiAxOworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7ICsraSkKKwkJCQlhbGlnbmVkX2J1ZltpXSA9IG1jaV9yZWFkdyhob3N0LCBEQVRBKTsKKwkJCS8qIG1lbWNweSBmcm9tIGFsaWduZWQgYnVmZmVyIGludG8gb3V0cHV0IGJ1ZmZlciAqLworCQkJbWVtY3B5KGJ1ZiwgYWxpZ25lZF9idWYsIGxlbik7CisJCQlidWYgKz0gbGVuOworCQkJY250IC09IGxlbjsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisJeworCQl1MTYgKnBkYXRhID0gYnVmOworCQlmb3IgKDsgY250ID49IDI7IGNudCAtPSAyKQorCQkJKnBkYXRhKysgPSBtY2lfcmVhZHcoaG9zdCwgREFUQSk7CisJCWJ1ZiA9IHBkYXRhOworCX0KKwlpZiAoY250KSB7CisJCWhvc3QtPnBhcnRfYnVmMTYgPSBtY2lfcmVhZHcoaG9zdCwgREFUQSk7CisJCWR3X21jaV9wdWxsX2ZpbmFsX2J5dGVzKGhvc3QsIGJ1ZiwgY250KTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGR3X21jaV9wdXNoX2RhdGEzMihzdHJ1Y3QgZHdfbWNpICpob3N0LCB2b2lkICpidWYsIGludCBjbnQpCiB7Ci0JdTMyICpwZGF0YSA9ICh1MzIgKilidWY7Ci0KLQlXQVJOX09OKGNudCAlIDQgIT0gMCk7Ci0JV0FSTl9PTigodW5zaWduZWQgbG9uZylwZGF0YSAmIDB4Myk7Ci0KLQljbnQgPSBjbnQgPj4gMjsKLQl3aGlsZSAoY250ID4gMCkgewotCQltY2lfd3JpdGVsKGhvc3QsIERBVEEsICpwZGF0YSsrKTsKLQkJY250LS07CisJLyogdHJ5IGFuZCBwdXNoIGFueXRoaW5nIGluIHRoZSBwYXJ0X2J1ZiAqLworCWlmICh1bmxpa2VseShob3N0LT5wYXJ0X2J1Zl9jb3VudCkpIHsKKwkJaW50IGxlbiA9IGR3X21jaV9wdXNoX3BhcnRfYnl0ZXMoaG9zdCwgYnVmLCBjbnQpOworCQlidWYgKz0gbGVuOworCQljbnQgLT0gbGVuOworCQlpZiAoIXNnX25leHQoaG9zdC0+c2cpIHx8IGhvc3QtPnBhcnRfYnVmX2NvdW50ID09IDQpIHsKKwkJCW1jaV93cml0ZWwoaG9zdCwgREFUQSwgaG9zdC0+cGFydF9idWYzMik7CisJCQlob3N0LT5wYXJ0X2J1Zl9jb3VudCA9IDA7CisJCX0KKwl9CisjaWZuZGVmIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTCisJaWYgKHVubGlrZWx5KCh1bnNpZ25lZCBsb25nKWJ1ZiAmIDB4MykpIHsKKwkJd2hpbGUgKGNudCA+PSA0KSB7CisJCQl1MzIgYWxpZ25lZF9idWZbMzJdOworCQkJaW50IGxlbiA9IG1pbihjbnQgJiAtNCwgKGludClzaXplb2YoYWxpZ25lZF9idWYpKTsKKwkJCWludCBpdGVtcyA9IGxlbiA+PiAyOworCQkJaW50IGk7CisJCQkvKiBtZW1jcHkgZnJvbSBpbnB1dCBidWZmZXIgaW50byBhbGlnbmVkIGJ1ZmZlciAqLworCQkJbWVtY3B5KGFsaWduZWRfYnVmLCBidWYsIGxlbik7CisJCQlidWYgKz0gbGVuOworCQkJY250IC09IGxlbjsKKwkJCS8qIHB1c2ggZGF0YSBmcm9tIGFsaWduZWQgYnVmZmVyIGludG8gZmlmbyAqLworCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1zOyArK2kpCisJCQkJbWNpX3dyaXRlbChob3N0LCBEQVRBLCBhbGlnbmVkX2J1ZltpXSk7CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJdTMyICpwZGF0YSA9IGJ1ZjsKKwkJZm9yICg7IGNudCA+PSA0OyBjbnQgLT0gNCkKKwkJCW1jaV93cml0ZWwoaG9zdCwgREFUQSwgKnBkYXRhKyspOworCQlidWYgPSBwZGF0YTsKKwl9CisJLyogcHV0IGFueXRoaW5nIHJlbWFpbmluZyBpbiB0aGUgcGFydF9idWYgKi8KKwlpZiAoY250KSB7CisJCWR3X21jaV9zZXRfcGFydF9ieXRlcyhob3N0LCBidWYsIGNudCk7CisJCWlmICghc2dfbmV4dChob3N0LT5zZykpCisJCQltY2lfd3JpdGVsKGhvc3QsIERBVEEsIGhvc3QtPnBhcnRfYnVmMzIpOwogCX0KIH0KIAogc3RhdGljIHZvaWQgZHdfbWNpX3B1bGxfZGF0YTMyKHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCkKIHsKLQl1MzIgKnBkYXRhID0gKHUzMiAqKWJ1ZjsKLQotCVdBUk5fT04oY250ICUgNCAhPSAwKTsKLQlXQVJOX09OKCh1bnNpZ25lZCBsb25nKXBkYXRhICYgMHgzKTsKLQotCWNudCA9IGNudCA+PiAyOwotCXdoaWxlIChjbnQgPiAwKSB7Ci0JCSpwZGF0YSsrID0gbWNpX3JlYWRsKGhvc3QsIERBVEEpOwotCQljbnQtLTsKKyNpZm5kZWYgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MKKwlpZiAodW5saWtlbHkoKHVuc2lnbmVkIGxvbmcpYnVmICYgMHgzKSkgeworCQl3aGlsZSAoY250ID49IDQpIHsKKwkJCS8qIHB1bGwgZGF0YSBmcm9tIGZpZm8gaW50byBhbGlnbmVkIGJ1ZmZlciAqLworCQkJdTMyIGFsaWduZWRfYnVmWzMyXTsKKwkJCWludCBsZW4gPSBtaW4oY250ICYgLTQsIChpbnQpc2l6ZW9mKGFsaWduZWRfYnVmKSk7CisJCQlpbnQgaXRlbXMgPSBsZW4gPj4gMjsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1zOyArK2kpCisJCQkJYWxpZ25lZF9idWZbaV0gPSBtY2lfcmVhZGwoaG9zdCwgREFUQSk7CisJCQkvKiBtZW1jcHkgZnJvbSBhbGlnbmVkIGJ1ZmZlciBpbnRvIG91dHB1dCBidWZmZXIgKi8KKwkJCW1lbWNweShidWYsIGFsaWduZWRfYnVmLCBsZW4pOworCQkJYnVmICs9IGxlbjsKKwkJCWNudCAtPSBsZW47CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJdTMyICpwZGF0YSA9IGJ1ZjsKKwkJZm9yICg7IGNudCA+PSA0OyBjbnQgLT0gNCkKKwkJCSpwZGF0YSsrID0gbWNpX3JlYWRsKGhvc3QsIERBVEEpOworCQlidWYgPSBwZGF0YTsKKwl9CisJaWYgKGNudCkgeworCQlob3N0LT5wYXJ0X2J1ZjMyID0gbWNpX3JlYWRsKGhvc3QsIERBVEEpOworCQlkd19tY2lfcHVsbF9maW5hbF9ieXRlcyhob3N0LCBidWYsIGNudCk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBkd19tY2lfcHVzaF9kYXRhNjQoc3RydWN0IGR3X21jaSAqaG9zdCwgdm9pZCAqYnVmLCBpbnQgY250KQogewotCXU2NCAqcGRhdGEgPSAodTY0ICopYnVmOwotCi0JV0FSTl9PTihjbnQgJSA4ICE9IDApOwotCi0JY250ID0gY250ID4+IDM7Ci0Jd2hpbGUgKGNudCA+IDApIHsKLQkJbWNpX3dyaXRlcShob3N0LCBEQVRBLCAqcGRhdGErKyk7Ci0JCWNudC0tOworCS8qIHRyeSBhbmQgcHVzaCBhbnl0aGluZyBpbiB0aGUgcGFydF9idWYgKi8KKwlpZiAodW5saWtlbHkoaG9zdC0+cGFydF9idWZfY291bnQpKSB7CisJCWludCBsZW4gPSBkd19tY2lfcHVzaF9wYXJ0X2J5dGVzKGhvc3QsIGJ1ZiwgY250KTsKKwkJYnVmICs9IGxlbjsKKwkJY250IC09IGxlbjsKKwkJaWYgKCFzZ19uZXh0KGhvc3QtPnNnKSB8fCBob3N0LT5wYXJ0X2J1Zl9jb3VudCA9PSA4KSB7CisJCQltY2lfd3JpdGV3KGhvc3QsIERBVEEsIGhvc3QtPnBhcnRfYnVmKTsKKwkJCWhvc3QtPnBhcnRfYnVmX2NvdW50ID0gMDsKKwkJfQorCX0KKyNpZm5kZWYgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MKKwlpZiAodW5saWtlbHkoKHVuc2lnbmVkIGxvbmcpYnVmICYgMHg3KSkgeworCQl3aGlsZSAoY250ID49IDgpIHsKKwkJCXU2NCBhbGlnbmVkX2J1ZlsxNl07CisJCQlpbnQgbGVuID0gbWluKGNudCAmIC04LCAoaW50KXNpemVvZihhbGlnbmVkX2J1ZikpOworCQkJaW50IGl0ZW1zID0gbGVuID4+IDM7CisJCQlpbnQgaTsKKwkJCS8qIG1lbWNweSBmcm9tIGlucHV0IGJ1ZmZlciBpbnRvIGFsaWduZWQgYnVmZmVyICovCisJCQltZW1jcHkoYWxpZ25lZF9idWYsIGJ1ZiwgbGVuKTsKKwkJCWJ1ZiArPSBsZW47CisJCQljbnQgLT0gbGVuOworCQkJLyogcHVzaCBkYXRhIGZyb20gYWxpZ25lZCBidWZmZXIgaW50byBmaWZvICovCisJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7ICsraSkKKwkJCQltY2lfd3JpdGVxKGhvc3QsIERBVEEsIGFsaWduZWRfYnVmW2ldKTsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisJeworCQl1NjQgKnBkYXRhID0gYnVmOworCQlmb3IgKDsgY250ID49IDg7IGNudCAtPSA4KQorCQkJbWNpX3dyaXRlcShob3N0LCBEQVRBLCAqcGRhdGErKyk7CisJCWJ1ZiA9IHBkYXRhOworCX0KKwkvKiBwdXQgYW55dGhpbmcgcmVtYWluaW5nIGluIHRoZSBwYXJ0X2J1ZiAqLworCWlmIChjbnQpIHsKKwkJZHdfbWNpX3NldF9wYXJ0X2J5dGVzKGhvc3QsIGJ1ZiwgY250KTsKKwkJaWYgKCFzZ19uZXh0KGhvc3QtPnNnKSkKKwkJCW1jaV93cml0ZXEoaG9zdCwgREFUQSwgaG9zdC0+cGFydF9idWYpOwogCX0KIH0KIAogc3RhdGljIHZvaWQgZHdfbWNpX3B1bGxfZGF0YTY0KHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCkKIHsKLQl1NjQgKnBkYXRhID0gKHU2NCAqKWJ1ZjsKLQotCVdBUk5fT04oY250ICUgOCAhPSAwKTsKLQotCWNudCA9IGNudCA+PiAzOwotCXdoaWxlIChjbnQgPiAwKSB7Ci0JCSpwZGF0YSsrID0gbWNpX3JlYWRxKGhvc3QsIERBVEEpOwotCQljbnQtLTsKKyNpZm5kZWYgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MKKwlpZiAodW5saWtlbHkoKHVuc2lnbmVkIGxvbmcpYnVmICYgMHg3KSkgeworCQl3aGlsZSAoY250ID49IDgpIHsKKwkJCS8qIHB1bGwgZGF0YSBmcm9tIGZpZm8gaW50byBhbGlnbmVkIGJ1ZmZlciAqLworCQkJdTY0IGFsaWduZWRfYnVmWzE2XTsKKwkJCWludCBsZW4gPSBtaW4oY250ICYgLTgsIChpbnQpc2l6ZW9mKGFsaWduZWRfYnVmKSk7CisJCQlpbnQgaXRlbXMgPSBsZW4gPj4gMzsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1zOyArK2kpCisJCQkJYWxpZ25lZF9idWZbaV0gPSBtY2lfcmVhZHEoaG9zdCwgREFUQSk7CisJCQkvKiBtZW1jcHkgZnJvbSBhbGlnbmVkIGJ1ZmZlciBpbnRvIG91dHB1dCBidWZmZXIgKi8KKwkJCW1lbWNweShidWYsIGFsaWduZWRfYnVmLCBsZW4pOworCQkJYnVmICs9IGxlbjsKKwkJCWNudCAtPSBsZW47CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJdTY0ICpwZGF0YSA9IGJ1ZjsKKwkJZm9yICg7IGNudCA+PSA4OyBjbnQgLT0gOCkKKwkJCSpwZGF0YSsrID0gbWNpX3JlYWRxKGhvc3QsIERBVEEpOworCQlidWYgPSBwZGF0YTsKIAl9CisJaWYgKGNudCkgeworCQlob3N0LT5wYXJ0X2J1ZiA9IG1jaV9yZWFkcShob3N0LCBEQVRBKTsKKwkJZHdfbWNpX3B1bGxfZmluYWxfYnl0ZXMoaG9zdCwgYnVmLCBjbnQpOworCX0KK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3B1bGxfZGF0YShzdHJ1Y3QgZHdfbWNpICpob3N0LCB2b2lkICpidWYsIGludCBjbnQpCit7CisJaW50IGxlbjsKKworCS8qIGdldCByZW1haW5pbmcgcGFydGlhbCBieXRlcyAqLworCWxlbiA9IGR3X21jaV9wdWxsX3BhcnRfYnl0ZXMoaG9zdCwgYnVmLCBjbnQpOworCWlmICh1bmxpa2VseShsZW4gPT0gY250KSkKKwkJcmV0dXJuOworCWJ1ZiArPSBsZW47CisJY250IC09IGxlbjsKKworCS8qIGdldCB0aGUgcmVzdCBvZiB0aGUgZGF0YSAqLworCWhvc3QtPnB1bGxfZGF0YShob3N0LCBidWYsIGNudCk7CiB9CiAKIHN0YXRpYyB2b2lkIGR3X21jaV9yZWFkX2RhdGFfcGlvKHN0cnVjdCBkd19tY2kgKmhvc3QpCkBAIC0xMDM3LDkgKzEyNjUsMTAgQEAKIAl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gMCwgbGVuOwogCiAJZG8gewotCQlsZW4gPSBTRE1NQ19HRVRfRkNOVChtY2lfcmVhZGwoaG9zdCwgU1RBVFVTKSkgPDwgc2hpZnQ7CisJCWxlbiA9IGhvc3QtPnBhcnRfYnVmX2NvdW50ICsKKwkJCShTRE1NQ19HRVRfRkNOVChtY2lfcmVhZGwoaG9zdCwgU1RBVFVTKSkgPDwgc2hpZnQpOwogCQlpZiAob2Zmc2V0ICsgbGVuIDw9IHNnLT5sZW5ndGgpIHsKLQkJCWhvc3QtPnB1bGxfZGF0YShob3N0LCAodm9pZCAqKShidWYgKyBvZmZzZXQpLCBsZW4pOworCQkJZHdfbWNpX3B1bGxfZGF0YShob3N0LCAodm9pZCAqKShidWYgKyBvZmZzZXQpLCBsZW4pOwogCiAJCQlvZmZzZXQgKz0gbGVuOwogCQkJbmJ5dGVzICs9IGxlbjsKQEAgLTEwNTUsOCArMTI4NCw4IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQl1bnNpZ25lZCBpbnQgcmVtYWluaW5nID0gc2ctPmxlbmd0aCAtIG9mZnNldDsKLQkJCWhvc3QtPnB1bGxfZGF0YShob3N0LCAodm9pZCAqKShidWYgKyBvZmZzZXQpLAotCQkJCQlyZW1haW5pbmcpOworCQkJZHdfbWNpX3B1bGxfZGF0YShob3N0LCAodm9pZCAqKShidWYgKyBvZmZzZXQpLAorCQkJCQkgcmVtYWluaW5nKTsKIAkJCW5ieXRlcyArPSByZW1haW5pbmc7CiAKIAkJCWZsdXNoX2RjYWNoZV9wYWdlKHNnX3BhZ2Uoc2cpKTsKQEAgLTEwNjYsNyArMTI5NSw3IEBACiAKIAkJCW9mZnNldCA9IGxlbiAtIHJlbWFpbmluZzsKIAkJCWJ1ZiA9IHNnX3ZpcnQoc2cpOwotCQkJaG9zdC0+cHVsbF9kYXRhKGhvc3QsIGJ1Ziwgb2Zmc2V0KTsKKwkJCWR3X21jaV9wdWxsX2RhdGEoaG9zdCwgYnVmLCBvZmZzZXQpOwogCQkJbmJ5dGVzICs9IG9mZnNldDsKIAkJfQogCkBAIC0xMDgzLDcgKzEzMTIsNiBAQAogCQkJcmV0dXJuOwogCQl9CiAJfSB3aGlsZSAoc3RhdHVzICYgU0RNTUNfSU5UX1JYRFIpOyAvKmlmIHRoZSBSWERSIGlzIHJlYWR5IHJlYWQgYWdhaW4qLwotCWxlbiA9IFNETU1DX0dFVF9GQ05UKG1jaV9yZWFkbChob3N0LCBTVEFUVVMpKTsKIAlob3N0LT5waW9fb2Zmc2V0ID0gb2Zmc2V0OwogCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBuYnl0ZXM7CiAJcmV0dXJuOwpAQCAtMTEwNSw4ICsxMzMzLDkgQEAKIAl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gMCwgbGVuOwogCiAJZG8gewotCQlsZW4gPSBTRE1NQ19GSUZPX1NaIC0KLQkJCShTRE1NQ19HRVRfRkNOVChtY2lfcmVhZGwoaG9zdCwgU1RBVFVTKSkgPDwgc2hpZnQpOworCQlsZW4gPSAoKGhvc3QtPmZpZm9fZGVwdGggLQorCQkJU0RNTUNfR0VUX0ZDTlQobWNpX3JlYWRsKGhvc3QsIFNUQVRVUykpKSA8PCBzaGlmdCkKKwkJCS0gaG9zdC0+cGFydF9idWZfY291bnQ7CiAJCWlmIChvZmZzZXQgKyBsZW4gPD0gc2ctPmxlbmd0aCkgewogCQkJaG9zdC0+cHVzaF9kYXRhKGhvc3QsICh2b2lkICopKGJ1ZiArIG9mZnNldCksIGxlbik7CiAKQEAgLTExNTEsMTAgKzEzODAsOCBAQAogCQkJcmV0dXJuOwogCQl9CiAJfSB3aGlsZSAoc3RhdHVzICYgU0RNTUNfSU5UX1RYRFIpOyAvKiBpZiBUWERSIHdyaXRlIGFnYWluICovCi0KIAlob3N0LT5waW9fb2Zmc2V0ID0gb2Zmc2V0OwogCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBuYnl0ZXM7Ci0KIAlyZXR1cm47CiAKIGRvbmU6CkBAIC0xMjAyLDcgKzE0MjksNiBAQAogCQkJaG9zdC0+Y21kX3N0YXR1cyA9IHN0YXR1czsKIAkJCXNtcF93bWIoKTsKIAkJCXNldF9iaXQoRVZFTlRfQ01EX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOwotCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CiAJCX0KIAogCQlpZiAocGVuZGluZyAmIERXX01DSV9EQVRBX0VSUk9SX0ZMQUdTKSB7CkBAIC0xMjExLDcgKzE0MzcsOSBAQAogCQkJaG9zdC0+ZGF0YV9zdGF0dXMgPSBzdGF0dXM7CiAJCQlzbXBfd21iKCk7CiAJCQlzZXRfYml0KEVWRU5UX0RBVEFfRVJST1IsICZob3N0LT5wZW5kaW5nX2V2ZW50cyk7Ci0JCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKKwkJCWlmICghKHBlbmRpbmcgJiAoU0RNTUNfSU5UX0RUTyB8IFNETU1DX0lOVF9EQ1JDIHwKKwkJCQkJIFNETU1DX0lOVF9TQkUgfCBTRE1NQ19JTlRfRUJFKSkpCisJCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CiAJCX0KIAogCQlpZiAocGVuZGluZyAmIFNETU1DX0lOVF9EQVRBX09WRVIpIHsKQEAgLTEyMjksMTMgKzE0NTcsMTMgQEAKIAogCQlpZiAocGVuZGluZyAmIFNETU1DX0lOVF9SWERSKSB7CiAJCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIFNETU1DX0lOVF9SWERSKTsKLQkJCWlmIChob3N0LT5zZykKKwkJCWlmIChob3N0LT5kaXJfc3RhdHVzID09IERXX01DSV9SRUNWX1NUQVRVUyAmJiBob3N0LT5zZykKIAkJCQlkd19tY2lfcmVhZF9kYXRhX3Bpbyhob3N0KTsKIAkJfQogCiAJCWlmIChwZW5kaW5nICYgU0RNTUNfSU5UX1RYRFIpIHsKIAkJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgU0RNTUNfSU5UX1RYRFIpOwotCQkJaWYgKGhvc3QtPnNnKQorCQkJaWYgKGhvc3QtPmRpcl9zdGF0dXMgPT0gRFdfTUNJX1NFTkRfU1RBVFVTICYmIGhvc3QtPnNnKQogCQkJCWR3X21jaV93cml0ZV9kYXRhX3Bpbyhob3N0KTsKIAkJfQogCkBAIC0xMjQ2LDcgKzE0NzQsNyBAQAogCiAJCWlmIChwZW5kaW5nICYgU0RNTUNfSU5UX0NEKSB7CiAJCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIFNETU1DX0lOVF9DRCk7Ci0JCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT5jYXJkX3Rhc2tsZXQpOworCQkJcXVldWVfd29yayhkd19tY2lfY2FyZF93b3JrcXVldWUsICZob3N0LT5jYXJkX3dvcmspOwogCQl9CiAKIAl9IHdoaWxlIChwYXNzX2NvdW50KysgPCA1KTsKQEAgLTEyNjUsOSArMTQ5Myw5IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCBkd19tY2lfdGFza2xldF9jYXJkKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIGR3X21jaV93b3JrX3JvdXRpbmVfY2FyZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGR3X21jaSAqaG9zdCA9IChzdHJ1Y3QgZHdfbWNpICopZGF0YTsKKwlzdHJ1Y3QgZHdfbWNpICpob3N0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkd19tY2ksIGNhcmRfd29yayk7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bnVtX3Nsb3RzOyBpKyspIHsKQEAgLTEyNzksMjIgKzE1MDcsMjEgQEAKIAogCQlwcmVzZW50ID0gZHdfbWNpX2dldF9jZChtbWMpOwogCQl3aGlsZSAocHJlc2VudCAhPSBzbG90LT5sYXN0X2RldGVjdF9zdGF0ZSkgewotCQkJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKLQogCQkJZGV2X2RiZygmc2xvdC0+bW1jLT5jbGFzc19kZXYsICJjYXJkICVzXG4iLAogCQkJCXByZXNlbnQgPyAiaW5zZXJ0ZWQiIDogInJlbW92ZWQiKTsKIAorCQkJLyogUG93ZXIgdXAgc2xvdCAoYmVmb3JlIHNwaW5fbG9jaywgbWF5IHNsZWVwKSAqLworCQkJaWYgKHByZXNlbnQgIT0gMCAmJiBob3N0LT5wZGF0YS0+c2V0cG93ZXIpCisJCQkJaG9zdC0+cGRhdGEtPnNldHBvd2VyKHNsb3QtPmlkLCBtbWMtPm9jcl9hdmFpbCk7CisKKwkJCXNwaW5fbG9ja19iaCgmaG9zdC0+bG9jayk7CisKIAkJCS8qIENhcmQgY2hhbmdlIGRldGVjdGVkICovCiAJCQlzbG90LT5sYXN0X2RldGVjdF9zdGF0ZSA9IHByZXNlbnQ7CiAKLQkJCS8qIFBvd2VyIHVwIHNsb3QgKi8KLQkJCWlmIChwcmVzZW50ICE9IDApIHsKLQkJCQlpZiAoaG9zdC0+cGRhdGEtPnNldHBvd2VyKQotCQkJCQlob3N0LT5wZGF0YS0+c2V0cG93ZXIoc2xvdC0+aWQsCi0JCQkJCQkJICAgICAgbW1jLT5vY3JfYXZhaWwpOwotCisJCQkvKiBNYXJrIGNhcmQgYXMgcHJlc2VudCBpZiBhcHBsaWNhYmxlICovCisJCQlpZiAocHJlc2VudCAhPSAwKQogCQkJCXNldF9iaXQoRFdfTU1DX0NBUkRfUFJFU0VOVCwgJnNsb3QtPmZsYWdzKTsKLQkJCX0KIAogCQkJLyogQ2xlYW4gdXAgcXVldWUgaWYgcHJlc2VudCAqLwogCQkJbXJxID0gc2xvdC0+bXJxOwpAQCAtMTM0NCw4ICsxNTcxLDYgQEAKIAogCQkJLyogUG93ZXIgZG93biBzbG90ICovCiAJCQlpZiAocHJlc2VudCA9PSAwKSB7Ci0JCQkJaWYgKGhvc3QtPnBkYXRhLT5zZXRwb3dlcikKLQkJCQkJaG9zdC0+cGRhdGEtPnNldHBvd2VyKHNsb3QtPmlkLCAwKTsKIAkJCQljbGVhcl9iaXQoRFdfTU1DX0NBUkRfUFJFU0VOVCwgJnNsb3QtPmZsYWdzKTsKIAogCQkJCS8qCkBAIC0xMzY3LDcgKzE1OTIsMTIgQEAKIAogCQkJfQogCi0JCQlzcGluX3VubG9jaygmaG9zdC0+bG9jayk7CisJCQlzcGluX3VubG9ja19iaCgmaG9zdC0+bG9jayk7CisKKwkJCS8qIFBvd2VyIGRvd24gc2xvdCAoYWZ0ZXIgc3Bpbl91bmxvY2ssIG1heSBzbGVlcCkgKi8KKwkJCWlmIChwcmVzZW50ID09IDAgJiYgaG9zdC0+cGRhdGEtPnNldHBvd2VyKQorCQkJCWhvc3QtPnBkYXRhLT5zZXRwb3dlcihzbG90LT5pZCwgMCk7CisKIAkJCXByZXNlbnQgPSBkd19tY2lfZ2V0X2NkKG1tYyk7CiAJCX0KIApAQCAtMTQ2Nyw3ICsxNjk3LDcgQEAKIAkgKiBDYXJkIG1heSBoYXZlIGJlZW4gcGx1Z2dlZCBpbiBwcmlvciB0byBib290IHNvIHdlCiAJICogbmVlZCB0byBydW4gdGhlIGRldGVjdCB0YXNrbGV0CiAJICovCi0JdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+Y2FyZF90YXNrbGV0KTsKKwlxdWV1ZV93b3JrKGR3X21jaV9jYXJkX3dvcmtxdWV1ZSwgJmhvc3QtPmNhcmRfd29yayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1OTUsNyArMTgyNSw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmhvc3QtPnF1ZXVlKTsKIAogCXJldCA9IC1FTk9NRU07Ci0JaG9zdC0+cmVncyA9IGlvcmVtYXAocmVncy0+c3RhcnQsIHJlZ3MtPmVuZCAtIHJlZ3MtPnN0YXJ0ICsgMSk7CisJaG9zdC0+cmVncyA9IGlvcmVtYXAocmVncy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVncykpOwogCWlmICghaG9zdC0+cmVncykKIAkJZ290byBlcnJfZnJlZWhvc3Q7CiAKQEAgLTE2NDUsOCArMTg3NSwxOSBAQAogCSAqIEZJRk8gdGhyZXNob2xkIHNldHRpbmdzICBSeE1hcmsgID0gZmlmb19zaXplIC8gMiAtIDEsCiAJICogICAgICAgICAgICAgICAgICAgICAgICAgIFR4IE1hcmsgPSBmaWZvX3NpemUgLyAyIERNQSBTaXplID0gOAogCSAqLwotCWZpZm9fc2l6ZSA9IG1jaV9yZWFkbChob3N0LCBGSUZPVEgpOwotCWZpZm9fc2l6ZSA9IChmaWZvX3NpemUgPj4gMTYpICYgMHg3ZmY7CisJaWYgKCFob3N0LT5wZGF0YS0+Zmlmb19kZXB0aCkgeworCQkvKgorCQkgKiBQb3dlci1vbiB2YWx1ZSBvZiBSWF9XTWFyayBpcyBGSUZPX0RFUFRILTEsIGJ1dCB0aGlzIG1heQorCQkgKiBoYXZlIGJlZW4gb3ZlcndyaXR0ZW4gYnkgdGhlIGJvb3Rsb2FkZXIsIGp1c3QgbGlrZSB3ZSdyZQorCQkgKiBhYm91dCB0byBkbywgc28gaWYgeW91IGtub3cgdGhlIHZhbHVlIGZvciB5b3VyIGhhcmR3YXJlLCB5b3UKKwkJICogc2hvdWxkIHB1dCBpdCBpbiB0aGUgcGxhdGZvcm0gZGF0YS4KKwkJICovCisJCWZpZm9fc2l6ZSA9IG1jaV9yZWFkbChob3N0LCBGSUZPVEgpOworCQlmaWZvX3NpemUgPSAxICsgKChmaWZvX3NpemUgPj4gMTYpICYgMHg3ZmYpOworCX0gZWxzZSB7CisJCWZpZm9fc2l6ZSA9IGhvc3QtPnBkYXRhLT5maWZvX2RlcHRoOworCX0KKwlob3N0LT5maWZvX2RlcHRoID0gZmlmb19zaXplOwogCWhvc3QtPmZpZm90aF92YWwgPSAoKDB4MiA8PCAyOCkgfCAoKGZpZm9fc2l6ZS8yIC0gMSkgPDwgMTYpIHwKIAkJCSgoZmlmb19zaXplLzIpIDw8IDApKTsKIAltY2lfd3JpdGVsKGhvc3QsIEZJRk9USCwgaG9zdC0+Zmlmb3RoX3ZhbCk7CkBAIC0xNjU2LDEyICsxODk3LDE1IEBACiAJbWNpX3dyaXRlbChob3N0LCBDTEtTUkMsIDApOwogCiAJdGFza2xldF9pbml0KCZob3N0LT50YXNrbGV0LCBkd19tY2lfdGFza2xldF9mdW5jLCAodW5zaWduZWQgbG9uZylob3N0KTsKLQl0YXNrbGV0X2luaXQoJmhvc3QtPmNhcmRfdGFza2xldCwKLQkJICAgICBkd19tY2lfdGFza2xldF9jYXJkLCAodW5zaWduZWQgbG9uZylob3N0KTsKKwlkd19tY2lfY2FyZF93b3JrcXVldWUgPSBhbGxvY193b3JrcXVldWUoImR3LW1jaS1jYXJkIiwKKwkJCVdRX01FTV9SRUNMQUlNIHwgV1FfTk9OX1JFRU5UUkFOVCwgMSk7CisJaWYgKCFkd19tY2lfY2FyZF93b3JrcXVldWUpCisJCWdvdG8gZXJyX2RtYXVubWFwOworCUlOSVRfV09SSygmaG9zdC0+Y2FyZF93b3JrLCBkd19tY2lfd29ya19yb3V0aW5lX2NhcmQpOwogCiAJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBkd19tY2lfaW50ZXJydXB0LCAwLCAiZHctbWNpIiwgaG9zdCk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJfZG1hdW5tYXA7CisJCWdvdG8gZXJyX3dvcmtxdWV1ZTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwogCkBAIC0xNjkwLDcgKzE5MzQsOSBAQAogCW1jaV93cml0ZWwoaG9zdCwgQ1RSTCwgU0RNTUNfQ1RSTF9JTlRfRU5BQkxFKTsgLyogRW5hYmxlIG1jaSBpbnRlcnJ1cHQgKi8KIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJEVyBNTUMgY29udHJvbGxlciBhdCBpcnEgJWQsICIKLQkJICIlZCBiaXQgaG9zdCBkYXRhIHdpZHRoXG4iLCBpcnEsIHdpZHRoKTsKKwkJICIlZCBiaXQgaG9zdCBkYXRhIHdpZHRoLCAiCisJCSAiJXUgZGVlcCBmaWZvXG4iLAorCQkgaXJxLCB3aWR0aCwgZmlmb19zaXplKTsKIAlpZiAoaG9zdC0+cXVpcmtzICYgRFdfTUNJX1FVSVJLX0lETUFDX0RUTykKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgIkludGVybmFsIERNQUMgaW50ZXJydXB0IGZpeCBlbmFibGVkLlxuIik7CiAKQEAgLTE3MDUsNiArMTk1MSw5IEBACiAJfQogCWZyZWVfaXJxKGlycSwgaG9zdCk7CiAKK2Vycl93b3JrcXVldWU6CisJZGVzdHJveV93b3JrcXVldWUoZHdfbWNpX2NhcmRfd29ya3F1ZXVlKTsKKwogZXJyX2RtYXVubWFwOgogCWlmIChob3N0LT51c2VfZG1hICYmIGhvc3QtPmRtYV9vcHMtPmV4aXQpCiAJCWhvc3QtPmRtYV9vcHMtPmV4aXQoaG9zdCk7CkBAIC0xNzQ0LDYgKzE5OTMsNyBAQAogCW1jaV93cml0ZWwoaG9zdCwgQ0xLU1JDLCAwKTsKIAogCWZyZWVfaXJxKHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCksIGhvc3QpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGR3X21jaV9jYXJkX3dvcmtxdWV1ZSk7CiAJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgUEFHRV9TSVpFLCBob3N0LT5zZ19jcHUsIGhvc3QtPnNnX2RtYSk7CiAKIAlpZiAoaG9zdC0+dXNlX2RtYSAmJiBob3N0LT5kbWFfb3BzLT5leGl0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuaCBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmgKaW5kZXggMjNjNjYyYS4uMDI3ZDM3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oCkBAIC0xMTgsNyArMTE4LDYgQEAKICNkZWZpbmUgU0RNTUNfQ01EX0lORFgobikJCSgobikgJiAweDFGKQogLyogU3RhdHVzIHJlZ2lzdGVyIGRlZmluZXMgKi8KICNkZWZpbmUgU0RNTUNfR0VUX0ZDTlQoeCkJCSgoKHgpPj4xNykgJiAweDFGRikKLSNkZWZpbmUgU0RNTUNfRklGT19TWgkJCTMyCiAvKiBJbnRlcm5hbCBETUFDIGludGVycnVwdCBkZWZpbmVzICovCiAjZGVmaW5lIFNETU1DX0lETUFDX0lOVF9BSQkJQklUKDkpCiAjZGVmaW5lIFNETU1DX0lETUFDX0lOVF9OSQkJQklUKDgpCkBAIC0xMzQsMjIgKzEzMywyMiBAQAogCiAvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCiAjZGVmaW5lIG1jaV9yZWFkbChkZXYsIHJlZykJCQlcCi0JX19yYXdfcmVhZGwoZGV2LT5yZWdzICsgU0RNTUNfIyNyZWcpCisJX19yYXdfcmVhZGwoKGRldiktPnJlZ3MgKyBTRE1NQ18jI3JlZykKICNkZWZpbmUgbWNpX3dyaXRlbChkZXYsIHJlZywgdmFsdWUpCQkJXAotCV9fcmF3X3dyaXRlbCgodmFsdWUpLCBkZXYtPnJlZ3MgKyBTRE1NQ18jI3JlZykKKwlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKGRldiktPnJlZ3MgKyBTRE1NQ18jI3JlZykKIAogLyogMTYtYml0IEZJRk8gYWNjZXNzIG1hY3JvcyAqLwogI2RlZmluZSBtY2lfcmVhZHcoZGV2LCByZWcpCQkJXAotCV9fcmF3X3JlYWR3KGRldi0+cmVncyArIFNETU1DXyMjcmVnKQorCV9fcmF3X3JlYWR3KChkZXYpLT5yZWdzICsgU0RNTUNfIyNyZWcpCiAjZGVmaW5lIG1jaV93cml0ZXcoZGV2LCByZWcsIHZhbHVlKQkJCVwKLQlfX3Jhd193cml0ZXcoKHZhbHVlKSwgZGV2LT5yZWdzICsgU0RNTUNfIyNyZWcpCisJX19yYXdfd3JpdGV3KCh2YWx1ZSksIChkZXYpLT5yZWdzICsgU0RNTUNfIyNyZWcpCiAKIC8qIDY0LWJpdCBGSUZPIGFjY2VzcyBtYWNyb3MgKi8KICNpZmRlZiByZWFkcQogI2RlZmluZSBtY2lfcmVhZHEoZGV2LCByZWcpCQkJXAotCV9fcmF3X3JlYWRxKGRldi0+cmVncyArIFNETU1DXyMjcmVnKQorCV9fcmF3X3JlYWRxKChkZXYpLT5yZWdzICsgU0RNTUNfIyNyZWcpCiAjZGVmaW5lIG1jaV93cml0ZXEoZGV2LCByZWcsIHZhbHVlKQkJCVwKLQlfX3Jhd193cml0ZXEoKHZhbHVlKSwgZGV2LT5yZWdzICsgU0RNTUNfIyNyZWcpCisJX19yYXdfd3JpdGVxKCh2YWx1ZSksIChkZXYpLT5yZWdzICsgU0RNTUNfIyNyZWcpCiAjZWxzZQogLyoKICAqIER1bW15IHJlYWRxIGltcGxlbWVudGF0aW9uIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgZGVmaW5lIGl0LgpAQCAtMTYwLDkgKzE1OSw5IEBACiAgKiByZXN0IG9mIHRoZSBjb2RlIGZyZWUgZnJvbSBpZmRlZnMuCiAgKi8KICNkZWZpbmUgbWNpX3JlYWRxKGRldiwgcmVnKQkJCVwKLQkoKih2b2xhdGlsZSB1NjQgX19mb3JjZSAqKShkZXYtPnJlZ3MgKyBTRE1NQ18jI3JlZykpCisJKCoodm9sYXRpbGUgdTY0IF9fZm9yY2UgKikoKGRldiktPnJlZ3MgKyBTRE1NQ18jI3JlZykpCiAjZGVmaW5lIG1jaV93cml0ZXEoZGV2LCByZWcsIHZhbHVlKQkJCVwKLQkoKih2b2xhdGlsZSB1NjQgX19mb3JjZSAqKShkZXYtPnJlZ3MgKyBTRE1NQ18jI3JlZykgPSB2YWx1ZSkKKwkoKih2b2xhdGlsZSB1NjQgX19mb3JjZSAqKSgoZGV2KS0+cmVncyArIFNETU1DXyMjcmVnKSA9ICh2YWx1ZSkpCiAjZW5kaWYKIAogI2VuZGlmIC8qIF9EV19NTUNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKaW5kZXggNWRhNWJlYS4uNTZlOWE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKQEAgLTIyNiw2ICsyMjYsOSBAQAogCQlyZXR1cm47CiAJfQogCisJLyogaW5pdGlhbGl6ZSBwcmUgcmVxdWVzdCBjb29raWUgKi8KKwlob3N0LT5uZXh0X2RhdGEuY29va2llID0gMTsKKwogCS8qIFRyeSB0byBhY3F1aXJlIGEgZ2VuZXJpYyBETUEgZW5naW5lIHNsYXZlIGNoYW5uZWwgKi8KIAlkbWFfY2FwX3plcm8obWFzayk7CiAJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKQEAgLTMzNSw3ICszMzgsOCBAQAogCQlkaXIgPSBETUFfRlJPTV9ERVZJQ0U7CiAJfQogCi0JZG1hX3VubWFwX3NnKGNoYW4tPmRldmljZS0+ZGV2LCBkYXRhLT5zZywgZGF0YS0+c2dfbGVuLCBkaXIpOworCWlmICghZGF0YS0+aG9zdF9jb29raWUpCisJCWRtYV91bm1hcF9zZyhjaGFuLT5kZXZpY2UtPmRldiwgZGF0YS0+c2csIGRhdGEtPnNnX2xlbiwgZGlyKTsKIAogCS8qCiAJICogVXNlIG9mIERNQSB3aXRoIHNjYXR0ZXItZ2F0aGVyIGlzIGltcG9zc2libGUuCkBAIC0zNTMsNyArMzU3LDggQEAKIAlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChob3N0LT5kbWFfY3VycmVudCk7CiB9CiAKLXN0YXRpYyBpbnQgbW1jaV9kbWFfc3RhcnRfZGF0YShzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgZGF0YWN0cmwpCitzdGF0aWMgaW50IG1tY2lfZG1hX3ByZXBfZGF0YShzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEsCisJCQkgICAgICBzdHJ1Y3QgbW1jaV9ob3N0X25leHQgKm5leHQpCiB7CiAJc3RydWN0IHZhcmlhbnRfZGF0YSAqdmFyaWFudCA9IGhvc3QtPnZhcmlhbnQ7CiAJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY29uZiA9IHsKQEAgLTM2NCwxMyArMzY5LDIwIEBACiAJCS5zcmNfbWF4YnVyc3QgPSB2YXJpYW50LT5maWZvaGFsZnNpemUgPj4gMiwgLyogIyBvZiB3b3JkcyAqLwogCQkuZHN0X21heGJ1cnN0ID0gdmFyaWFudC0+Zmlmb2hhbGZzaXplID4+IDIsIC8qICMgb2Ygd29yZHMgKi8KIAl9OwotCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSA9IGhvc3QtPmRhdGE7CiAJc3RydWN0IGRtYV9jaGFuICpjaGFuOwogCXN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOwogCWludCBucl9zZzsKIAotCWhvc3QtPmRtYV9jdXJyZW50ID0gTlVMTDsKKwkvKiBDaGVjayBpZiBuZXh0IGpvYiBpcyBhbHJlYWR5IHByZXBhcmVkICovCisJaWYgKGRhdGEtPmhvc3RfY29va2llICYmICFuZXh0ICYmCisJICAgIGhvc3QtPmRtYV9jdXJyZW50ICYmIGhvc3QtPmRtYV9kZXNjX2N1cnJlbnQpCisJCXJldHVybiAwOworCisJaWYgKCFuZXh0KSB7CisJCWhvc3QtPmRtYV9jdXJyZW50ID0gTlVMTDsKKwkJaG9zdC0+ZG1hX2Rlc2NfY3VycmVudCA9IE5VTEw7CisJfQogCiAJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkgewogCQljb25mLmRpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKQEAgLTM4NSw3ICszOTcsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIElmIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZmlmbyBzaXplLCBkb24ndCBib3RoZXIgd2l0aCBETUEgKi8KLQlpZiAoaG9zdC0+c2l6ZSA8PSB2YXJpYW50LT5maWZvc2l6ZSkKKwlpZiAoZGF0YS0+Ymxrc3ogKiBkYXRhLT5ibG9ja3MgPD0gdmFyaWFudC0+Zmlmb3NpemUpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZGV2aWNlID0gY2hhbi0+ZGV2aWNlOwpAQCAtMzk5LDE0ICs0MTEsMzggQEAKIAlpZiAoIWRlc2MpCiAJCWdvdG8gdW5tYXBfZXhpdDsKIAotCS8qIE9rYXksIGdvIGZvciBpdC4gKi8KLQlob3N0LT5kbWFfY3VycmVudCA9IGNoYW47CisJaWYgKG5leHQpIHsKKwkJbmV4dC0+ZG1hX2NoYW4gPSBjaGFuOworCQluZXh0LT5kbWFfZGVzYyA9IGRlc2M7CisJfSBlbHNlIHsKKwkJaG9zdC0+ZG1hX2N1cnJlbnQgPSBjaGFuOworCQlob3N0LT5kbWFfZGVzY19jdXJyZW50ID0gZGVzYzsKKwl9CiAKKwlyZXR1cm4gMDsKKworIHVubWFwX2V4aXQ6CisJaWYgKCFuZXh0KQorCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChjaGFuKTsKKwlkbWFfdW5tYXBfc2coZGV2aWNlLT5kZXYsIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sIGNvbmYuZGlyZWN0aW9uKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBtbWNpX2RtYV9zdGFydF9kYXRhKHN0cnVjdCBtbWNpX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCBkYXRhY3RybCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSA9IGhvc3QtPmRhdGE7CisKKwlyZXQgPSBtbWNpX2RtYV9wcmVwX2RhdGEoaG9zdCwgaG9zdC0+ZGF0YSwgTlVMTCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE9rYXksIGdvIGZvciBpdC4gKi8KIAlkZXZfdmRiZyhtbWNfZGV2KGhvc3QtPm1tYyksCiAJCSAiU3VibWl0IE1NQ0kgRE1BIGpvYiwgc2dsZW4gJWQgYmxrc3ogJTA0eCBibGtzICUwNHggZmxhZ3MgJTA4eFxuIiwKIAkJIGRhdGEtPnNnX2xlbiwgZGF0YS0+Ymxrc3osIGRhdGEtPmJsb2NrcywgZGF0YS0+ZmxhZ3MpOwotCWRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7Ci0JZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoY2hhbik7CisJZG1hZW5naW5lX3N1Ym1pdChob3N0LT5kbWFfZGVzY19jdXJyZW50KTsKKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhob3N0LT5kbWFfY3VycmVudCk7CiAKIAlkYXRhY3RybCB8PSBNQ0lfRFBTTV9ETUFFTkFCTEU7CiAKQEAgLTQyMSwxNCArNDU3LDkwIEBACiAJd3JpdGVsKHJlYWRsKGhvc3QtPmJhc2UgKyBNTUNJTUFTSzApIHwgTUNJX0RBVEFFTkRNQVNLLAogCSAgICAgICBob3N0LT5iYXNlICsgTU1DSU1BU0swKTsKIAlyZXR1cm4gMDsKLQotdW5tYXBfZXhpdDoKLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChjaGFuKTsKLQlkbWFfdW5tYXBfc2coZGV2aWNlLT5kZXYsIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sIGNvbmYuZGlyZWN0aW9uKTsKLQlyZXR1cm4gLUVOT01FTTsKIH0KKworc3RhdGljIHZvaWQgbW1jaV9nZXRfbmV4dF9kYXRhKHN0cnVjdCBtbWNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgbW1jaV9ob3N0X25leHQgKm5leHQgPSAmaG9zdC0+bmV4dF9kYXRhOworCisJaWYgKGRhdGEtPmhvc3RfY29va2llICYmIGRhdGEtPmhvc3RfY29va2llICE9IG5leHQtPmNvb2tpZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJbJXNdIGludmFsaWQgY29va2llOiBkYXRhLT5ob3N0X2Nvb2tpZSAlZCIKKwkJICAgICAgICIgaG9zdC0+bmV4dF9kYXRhLmNvb2tpZSAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBkYXRhLT5ob3N0X2Nvb2tpZSwgaG9zdC0+bmV4dF9kYXRhLmNvb2tpZSk7CisJCWRhdGEtPmhvc3RfY29va2llID0gMDsKKwl9CisKKwlpZiAoIWRhdGEtPmhvc3RfY29va2llKQorCQlyZXR1cm47CisKKwlob3N0LT5kbWFfZGVzY19jdXJyZW50ID0gbmV4dC0+ZG1hX2Rlc2M7CisJaG9zdC0+ZG1hX2N1cnJlbnQgPSBuZXh0LT5kbWFfY2hhbjsKKworCW5leHQtPmRtYV9kZXNjID0gTlVMTDsKKwluZXh0LT5kbWFfY2hhbiA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG1tY2lfcHJlX3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxLAorCQkJICAgICBib29sIGlzX2ZpcnN0X3JlcSkKK3sKKwlzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSBtcnEtPmRhdGE7CisJc3RydWN0IG1tY2lfaG9zdF9uZXh0ICpuZCA9ICZob3N0LT5uZXh0X2RhdGE7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybjsKKworCWlmIChkYXRhLT5ob3N0X2Nvb2tpZSkgeworCQlkYXRhLT5ob3N0X2Nvb2tpZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiBjb25maWcgZm9yIGRtYSAqLworCWlmICgoKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfV1JJVEUpICYmIGhvc3QtPmRtYV90eF9jaGFubmVsKSB8fAorCSAgICAoKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkgJiYgaG9zdC0+ZG1hX3J4X2NoYW5uZWwpKSB7CisJCWlmIChtbWNpX2RtYV9wcmVwX2RhdGEoaG9zdCwgZGF0YSwgbmQpKQorCQkJZGF0YS0+aG9zdF9jb29raWUgPSAwOworCQllbHNlCisJCQlkYXRhLT5ob3N0X2Nvb2tpZSA9ICsrbmQtPmNvb2tpZSA8IDAgPyAxIDogbmQtPmNvb2tpZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1tY2lfcG9zdF9yZXF1ZXN0KHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSwKKwkJCSAgICAgIGludCBlcnIpCit7CisJc3RydWN0IG1tY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisJc3RydWN0IG1tY19kYXRhICpkYXRhID0gbXJxLT5kYXRhOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybjsKKworCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpIHsKKwkJZGlyID0gRE1BX0ZST01fREVWSUNFOworCQljaGFuID0gaG9zdC0+ZG1hX3J4X2NoYW5uZWw7CisJfSBlbHNlIHsKKwkJZGlyID0gRE1BX1RPX0RFVklDRTsKKwkJY2hhbiA9IGhvc3QtPmRtYV90eF9jaGFubmVsOworCX0KKworCisJLyogaWYgY29uZmlnIGZvciBkbWEgKi8KKwlpZiAoY2hhbikgeworCQlpZiAoZXJyKQorCQkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoY2hhbik7CisJCWlmIChlcnIgfHwgZGF0YS0+aG9zdF9jb29raWUpCisJCQlkbWFfdW5tYXBfc2cobW1jX2Rldihob3N0LT5tbWMpLCBkYXRhLT5zZywKKwkJCQkgICAgIGRhdGEtPnNnX2xlbiwgZGlyKTsKKwkJbXJxLT5kYXRhLT5ob3N0X2Nvb2tpZSA9IDA7CisJfQorfQorCiAjZWxzZQogLyogQmxhbmsgZnVuY3Rpb25zIGlmIHRoZSBETUEgZW5naW5lIGlzIG5vdCBhdmFpbGFibGUgKi8KK3N0YXRpYyB2b2lkIG1tY2lfZ2V0X25leHRfZGF0YShzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCit7Cit9CiBzdGF0aWMgaW5saW5lIHZvaWQgbW1jaV9kbWFfc2V0dXAoc3RydWN0IG1tY2lfaG9zdCAqaG9zdCkKIHsKIH0KQEAgLTQ0OSw2ICs1NjEsMTAgQEAKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KKworI2RlZmluZSBtbWNpX3ByZV9yZXF1ZXN0IE5VTEwKKyNkZWZpbmUgbW1jaV9wb3N0X3JlcXVlc3QgTlVMTAorCiAjZW5kaWYKIAogc3RhdGljIHZvaWQgbW1jaV9zdGFydF9kYXRhKHN0cnVjdCBtbWNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKQEAgLTU4Miw2ICs2OTgsOCBAQAogCQkJZGF0YS0+ZXJyb3IgPSAtRUlMU0VROwogCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE1DSV9EQVRBVElNRU9VVCkgewogCQkJZGF0YS0+ZXJyb3IgPSAtRVRJTUVET1VUOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE1DSV9TVEFSVEJJVEVSUikgeworCQkJZGF0YS0+ZXJyb3IgPSAtRUNPTU07CiAJCX0gZWxzZSBpZiAoc3RhdHVzICYgTUNJX1RYVU5ERVJSVU4pIHsKIAkJCWRhdGEtPmVycm9yID0gLUVJTzsKIAkJfSBlbHNlIGlmIChzdGF0dXMgJiBNQ0lfUlhPVkVSUlVOKSB7CkBAIC04NzAsNiArOTg4LDkgQEAKIAogCWhvc3QtPm1ycSA9IG1ycTsKIAorCWlmIChtcnEtPmRhdGEpCisJCW1tY2lfZ2V0X25leHRfZGF0YShob3N0LCBtcnEtPmRhdGEpOworCiAJaWYgKG1ycS0+ZGF0YSAmJiBtcnEtPmRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkKIAkJbW1jaV9zdGFydF9kYXRhKGhvc3QsIG1ycS0+ZGF0YSk7CiAKQEAgLTk4NCw2ICsxMTA1LDggQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgbW1jaV9vcHMgPSB7CiAJLnJlcXVlc3QJPSBtbWNpX3JlcXVlc3QsCisJLnByZV9yZXEJPSBtbWNpX3ByZV9yZXF1ZXN0LAorCS5wb3N0X3JlcQk9IG1tY2lfcG9zdF9yZXF1ZXN0LAogCS5zZXRfaW9zCT0gbW1jaV9zZXRfaW9zLAogCS5nZXRfcm8JCT0gbW1jaV9nZXRfcm8sCiAJLmdldF9jZAkJPSBtbWNpX2dldF9jZCwKQEAgLTEwNjEsNyArMTE4NCwxNSBAQAogCX0KIAogCW1tYy0+b3BzID0gJm1tY2lfb3BzOwotCW1tYy0+Zl9taW4gPSAoaG9zdC0+bWNsayArIDUxMSkgLyA1MTI7CisJLyoKKwkgKiBUaGUgQVJNIGFuZCBTVCB2ZXJzaW9ucyBvZiB0aGUgYmxvY2sgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQKKwkgKiBjbG9jayBkaXZpZGVyIGVxdWF0aW9ucyB3aGljaCBtZWFucyB0aGF0IHRoZSBtaW5pbXVtIGRpdmlkZXIKKwkgKiBkaWZmZXJzIHRvby4KKwkgKi8KKwlpZiAodmFyaWFudC0+c3RfY2xrZGl2KQorCQltbWMtPmZfbWluID0gRElWX1JPVU5EX1VQKGhvc3QtPm1jbGssIDI1Nyk7CisJZWxzZQorCQltbWMtPmZfbWluID0gRElWX1JPVU5EX1VQKGhvc3QtPm1jbGssIDUxMik7CiAJLyoKIAkgKiBJZiB0aGUgcGxhdGZvcm0gZGF0YSBzdXBwbGllcyBhIG1heGltdW0gb3BlcmF0aW5nCiAJICogZnJlcXVlbmN5LCB0aGlzIHRha2VzIHByZWNlZGVuY2UuIEVsc2UsIHdlIGZhbGwgYmFjawpAQCAtMTE0NCw5ICsxMjc1LDE3IEBACiAJCWVsc2UgaWYgKHJldCAhPSAtRU5PU1lTKQogCQkJZ290byBlcnJfZ3Bpb19jZDsKIAorCQkvKgorCQkgKiBBIGdwaW8gcGluIHRoYXQgd2lsbCBkZXRlY3QgY2FyZHMgd2hlbiBpbnNlcnRlZCBhbmQgcmVtb3ZlZAorCQkgKiB3aWxsIG1vc3QgbGlrZWx5IHdhbnQgdG8gdHJpZ2dlciBvbiB0aGUgZWRnZXMgaWYgaXQgaXMKKwkJICogMCB3aGVuIGVqZWN0ZWQgYW5kIDEgd2hlbiBpbnNlcnRlZCAob3IgbXV0YXRpcyBtdXRhbmRpcworCQkgKiBmb3IgdGhlIGludmVydGVkIGNhc2UpIHNvIHdlIHJlcXVlc3QgdHJpZ2dlcnMgb24gYm90aAorCQkgKiBlZGdlcy4KKwkJICovCiAJCXJldCA9IHJlcXVlc3RfYW55X2NvbnRleHRfaXJxKGdwaW9fdG9faXJxKHBsYXQtPmdwaW9fY2QpLAotCQkJCQkgICAgICBtbWNpX2NkX2lycSwgMCwKLQkJCQkJICAgICAgRFJJVkVSX05BTUUgIiAoY2QpIiwgaG9zdCk7CisJCQkJbW1jaV9jZF9pcnEsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCURSSVZFUl9OQU1FICIgKGNkKSIsIGhvc3QpOwogCQlpZiAocmV0ID49IDApCiAJCQlob3N0LT5ncGlvX2NkX2lycSA9IGdwaW9fdG9faXJxKHBsYXQtPmdwaW9fY2QpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5oIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKaW5kZXggYmIzMmUyMS4uNzllNDE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKQEAgLTg2LDYgKzg2LDcgQEAKICNkZWZpbmUgTUNJX0NNRFJFU1BFTkQJCSgxIDw8IDYpCiAjZGVmaW5lIE1DSV9DTURTRU5UCQkoMSA8PCA3KQogI2RlZmluZSBNQ0lfREFUQUVORAkJKDEgPDwgOCkKKyNkZWZpbmUgTUNJX1NUQVJUQklURVJSCQkoMSA8PCA5KQogI2RlZmluZSBNQ0lfREFUQUJMT0NLRU5ECSgxIDw8IDEwKQogI2RlZmluZSBNQ0lfQ01EQUNUSVZFCQkoMSA8PCAxMSkKICNkZWZpbmUgTUNJX1RYQUNUSVZFCQkoMSA8PCAxMikKQEAgLTExMiw2ICsxMTMsNyBAQAogI2RlZmluZSBNQ0lfQ01EUkVTUEVORENMUgkoMSA8PCA2KQogI2RlZmluZSBNQ0lfQ01EU0VOVENMUgkJKDEgPDwgNykKICNkZWZpbmUgTUNJX0RBVEFFTkRDTFIJCSgxIDw8IDgpCisjZGVmaW5lIE1DSV9TVEFSVEJJVEVSUkNMUgkoMSA8PCA5KQogI2RlZmluZSBNQ0lfREFUQUJMT0NLRU5EQ0xSCSgxIDw8IDEwKQogLyogRXh0ZW5kZWQgc3RhdHVzIGJpdHMgZm9yIHRoZSBTVCBNaWNybyB2YXJpYW50cyAqLwogI2RlZmluZSBNQ0lfU1RfU0RJT0lUQwkJKDEgPDwgMjIpCkBAIC0xMjcsNiArMTI5LDcgQEAKICNkZWZpbmUgTUNJX0NNRFJFU1BFTkRNQVNLCSgxIDw8IDYpCiAjZGVmaW5lIE1DSV9DTURTRU5UTUFTSwkJKDEgPDwgNykKICNkZWZpbmUgTUNJX0RBVEFFTkRNQVNLCQkoMSA8PCA4KQorI2RlZmluZSBNQ0lfU1RBUlRCSVRFUlJNQVNLCSgxIDw8IDkpCiAjZGVmaW5lIE1DSV9EQVRBQkxPQ0tFTkRNQVNLCSgxIDw8IDEwKQogI2RlZmluZSBNQ0lfQ01EQUNUSVZFTUFTSwkoMSA8PCAxMSkKICNkZWZpbmUgTUNJX1RYQUNUSVZFTUFTSwkoMSA8PCAxMikKQEAgLTE1MCw3ICsxNTMsNyBAQAogI2RlZmluZSBNQ0lfSVJRRU5BQkxFCVwKIAkoTUNJX0NNRENSQ0ZBSUxNQVNLfE1DSV9EQVRBQ1JDRkFJTE1BU0t8TUNJX0NNRFRJTUVPVVRNQVNLfAlcCiAJTUNJX0RBVEFUSU1FT1VUTUFTS3xNQ0lfVFhVTkRFUlJVTk1BU0t8TUNJX1JYT1ZFUlJVTk1BU0t8CVwKLQlNQ0lfQ01EUkVTUEVORE1BU0t8TUNJX0NNRFNFTlRNQVNLKQorCU1DSV9DTURSRVNQRU5ETUFTS3xNQ0lfQ01EU0VOVE1BU0t8TUNJX1NUQVJUQklURVJSTUFTSykKIAogLyogVGhlc2UgaW50ZXJydXB0cyBhcmUgZGlyZWN0ZWQgdG8gSVJRMSB3aGVuIHR3byBJUlEgbGluZXMgYXJlIGF2YWlsYWJsZSAqLwogI2RlZmluZSBNQ0lfSVJRMU1BU0sgXApAQCAtMTYzLDYgKzE2NiwxMiBAQAogc3RydWN0IHZhcmlhbnRfZGF0YTsKIHN0cnVjdCBkbWFfY2hhbjsKIAorc3RydWN0IG1tY2lfaG9zdF9uZXh0IHsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJKmRtYV9kZXNjOworCXN0cnVjdCBkbWFfY2hhbgkJCSpkbWFfY2hhbjsKKwlzMzIJCQkJY29va2llOworfTsKKwogc3RydWN0IG1tY2lfaG9zdCB7CiAJcGh5c19hZGRyX3QJCXBoeWJhc2U7CiAJdm9pZCBfX2lvbWVtCQkqYmFzZTsKQEAgLTIwMCw2ICsyMDksOCBAQAogCXN0cnVjdCBkbWFfY2hhbgkJKmRtYV9jdXJyZW50OwogCXN0cnVjdCBkbWFfY2hhbgkJKmRtYV9yeF9jaGFubmVsOwogCXN0cnVjdCBkbWFfY2hhbgkJKmRtYV90eF9jaGFubmVsOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcgkqZG1hX2Rlc2NfY3VycmVudDsKKwlzdHJ1Y3QgbW1jaV9ob3N0X25leHQJbmV4dF9kYXRhOwogCiAjZGVmaW5lIGRtYV9pbnByb2dyZXNzKGhvc3QpCSgoaG9zdCktPmRtYV9jdXJyZW50KQogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L214Y21tYy5jCmluZGV4IGNjMjBlMDIuLjE0YWEyMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9teGNtbWMuYwpAQCAtNzE1LDEzICs3MTUsMTMgQEAKIAlpbnQgYnVyc3RsZW4sIHJldDsKIAogCS8qCi0JICogdXNlIGJ1cnN0bGVuIG9mIDY0IGluIDQgYml0IG1vZGUgKC0tPiByZWcgdmFsdWUgIDApCi0JICogdXNlIGJ1cnN0bGVuIG9mIDE2IGluIDEgYml0IG1vZGUgKC0tPiByZWcgdmFsdWUgMTYpCisJICogdXNlIGJ1cnN0bGVuIG9mIDY0ICgxNiB3b3JkcykgaW4gNCBiaXQgbW9kZSAoLS0+IHJlZyB2YWx1ZSAgMCkKKwkgKiB1c2UgYnVyc3RsZW4gb2YgMTYgKDQgd29yZHMpIGluIDEgYml0IG1vZGUgKC0tPiByZWcgdmFsdWUgMTYpCiAJICovCiAJaWYgKGlvcy0+YnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfNCkKLQkJYnVyc3RsZW4gPSA2NDsKLQllbHNlCiAJCWJ1cnN0bGVuID0gMTY7CisJZWxzZQorCQlidXJzdGxlbiA9IDQ7CiAKIAlpZiAobXhjbWNpX3VzZV9kbWEoaG9zdCkgJiYgYnVyc3RsZW4gIT0gaG9zdC0+YnVyc3RsZW4pIHsKIAkJaG9zdC0+YnVyc3RsZW4gPSBidXJzdGxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbXhzLW1tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9teHMtbW1jLmMKaW5kZXggOTlkMzlhNi4uZDUxM2Q0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9teHMtbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9teHMtbW1jLmMKQEAgLTU2NCw0MCArNTY0LDM4IEBACiAKIHN0YXRpYyB2b2lkIG14c19tbWNfc2V0X2Nsa19yYXRlKHN0cnVjdCBteHNfbW1jX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCByYXRlKQogewotCXVuc2lnbmVkIGludCBzc3BfcmF0ZSwgYml0X3JhdGU7Ci0JdTMyIGRpdjEsIGRpdjI7CisJdW5zaWduZWQgaW50IHNzcF9jbGssIHNzcF9zY2s7CisJdTMyIGNsb2NrX2RpdmlkZSwgY2xvY2tfcmF0ZTsKIAl1MzIgdmFsOwogCi0Jc3NwX3JhdGUgPSBjbGtfZ2V0X3JhdGUoaG9zdC0+Y2xrKTsKKwlzc3BfY2xrID0gY2xrX2dldF9yYXRlKGhvc3QtPmNsayk7CiAKLQlmb3IgKGRpdjEgPSAyOyBkaXYxIDwgMjU0OyBkaXYxICs9IDIpIHsKLQkJZGl2MiA9IHNzcF9yYXRlIC8gcmF0ZSAvIGRpdjE7Ci0JCWlmIChkaXYyIDwgMHgxMDApCisJZm9yIChjbG9ja19kaXZpZGUgPSAyOyBjbG9ja19kaXZpZGUgPD0gMjU0OyBjbG9ja19kaXZpZGUgKz0gMikgeworCQljbG9ja19yYXRlID0gRElWX1JPVU5EX1VQKHNzcF9jbGssIHJhdGUgKiBjbG9ja19kaXZpZGUpOworCQljbG9ja19yYXRlID0gKGNsb2NrX3JhdGUgPiAwKSA/IGNsb2NrX3JhdGUgLSAxIDogMDsKKwkJaWYgKGNsb2NrX3JhdGUgPD0gMjU1KQogCQkJYnJlYWs7CiAJfQogCi0JaWYgKGRpdjEgPj0gMjU0KSB7CisJaWYgKGNsb2NrX2RpdmlkZSA+IDI1NCkgewogCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwKIAkJCSIlczogY2Fubm90IHNldCBjbG9jayB0byAlZFxuIiwgX19mdW5jX18sIHJhdGUpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGRpdjIgPT0gMCkKLQkJYml0X3JhdGUgPSBzc3BfcmF0ZSAvIGRpdjE7Ci0JZWxzZQotCQliaXRfcmF0ZSA9IHNzcF9yYXRlIC8gZGl2MSAvIGRpdjI7CisJc3NwX3NjayA9IHNzcF9jbGsgLyBjbG9ja19kaXZpZGUgLyAoMSArIGNsb2NrX3JhdGUpOwogCiAJdmFsID0gcmVhZGwoaG9zdC0+YmFzZSArIEhXX1NTUF9USU1JTkcpOwogCXZhbCAmPSB+KEJNX1NTUF9USU1JTkdfQ0xPQ0tfRElWSURFIHwgQk1fU1NQX1RJTUlOR19DTE9DS19SQVRFKTsKLQl2YWwgfD0gQkZfU1NQKGRpdjEsIFRJTUlOR19DTE9DS19ESVZJREUpOwotCXZhbCB8PSBCRl9TU1AoZGl2MiAtIDEsIFRJTUlOR19DTE9DS19SQVRFKTsKKwl2YWwgfD0gQkZfU1NQKGNsb2NrX2RpdmlkZSwgVElNSU5HX0NMT0NLX0RJVklERSk7CisJdmFsIHw9IEJGX1NTUChjbG9ja19yYXRlLCBUSU1JTkdfQ0xPQ0tfUkFURSk7CiAJd3JpdGVsKHZhbCwgaG9zdC0+YmFzZSArIEhXX1NTUF9USU1JTkcpOwogCi0JaG9zdC0+Y2xrX3JhdGUgPSBiaXRfcmF0ZTsKKwlob3N0LT5jbGtfcmF0ZSA9IHNzcF9zY2s7CiAKIAlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwKLQkJIiVzOiBkaXYxICVkLCBkaXYyICVkLCBzc3AgJWQsIGJpdCAlZCwgcmF0ZSAlZFxuIiwKLQkJX19mdW5jX18sIGRpdjEsIGRpdjIsIHNzcF9yYXRlLCBiaXRfcmF0ZSwgcmF0ZSk7CisJCSIlczogY2xvY2tfZGl2aWRlICVkLCBjbG9ja19yYXRlICVkLCBzc3BfY2xrICVkLCByYXRlX2FjdHVhbCAlZCwgcmF0ZV9yZXF1ZXN0ZWQgJWRcbiIsCisJCV9fZnVuY19fLCBjbG9ja19kaXZpZGUsIGNsb2NrX3JhdGUsIHNzcF9jbGssIHNzcF9zY2ssIHJhdGUpOwogfQogCiBzdGF0aWMgdm9pZCBteHNfbW1jX3NldF9pb3Moc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfaW9zICppb3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L29mX21tY19zcGkuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvb2ZfbW1jX3NwaS5jCmluZGV4IGUyYWVjYjcuLmFiNjZmMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvb2ZfbW1jX3NwaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvb2ZfbW1jX3NwaS5jCkBAIC0yNSw2ICsyNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KIAorLyogRm9yIGFyY2hzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBOT19JUlEgKHN1Y2ggYXMgbWlwcyksIHByb3ZpZGUgYSBkdW1teSB2YWx1ZSAqLworI2lmbmRlZiBOT19JUlEKKyNkZWZpbmUgTk9fSVJRIDAKKyNlbmRpZgorCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIGVudW0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYwppbmRleCAyNTllY2UwLi4yMWU0YTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYwpAQCAtMTcsNiArMTcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMzMsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgpAQCAtMTE2LDE1ICsxMTgsMTMgQEAKICNkZWZpbmUgT01BUF9NTUM0X0RFVklECQkzCiAjZGVmaW5lIE9NQVBfTU1DNV9ERVZJRAkJNAogCisjZGVmaW5lIE1NQ19BVVRPU1VTUEVORF9ERUxBWQkxMDAKICNkZWZpbmUgTU1DX1RJTUVPVVRfTVMJCTIwCiAjZGVmaW5lIE9NQVBfTU1DX01BU1RFUl9DTE9DSwk5NjAwMDAwMAorI2RlZmluZSBPTUFQX01NQ19NSU5fQ0xPQ0sJNDAwMDAwCisjZGVmaW5lIE9NQVBfTU1DX01BWF9DTE9DSwk1MjAwMDAwMAogI2RlZmluZSBEUklWRVJfTkFNRQkJIm9tYXBfaHNtbWMiCiAKLS8qIFRpbWVvdXRzIGZvciBlbnRlcmluZyBwb3dlciBzYXZpbmcgc3RhdGVzIG9uIGluYWN0aXZpdHksIG1zZWMgKi8KLSNkZWZpbmUgT01BUF9NTUNfRElTQUJMRURfVElNRU9VVAkxMDAKLSNkZWZpbmUgT01BUF9NTUNfU0xFRVBfVElNRU9VVAkJMTAwMAotI2RlZmluZSBPTUFQX01NQ19PRkZfVElNRU9VVAkJODAwMAotCiAvKgogICogT25lIGNvbnRyb2xsZXIgY2FuIGhhdmUgbXVsdGlwbGUgc2xvdHMsIGxpa2Ugb24gc29tZSBvbWFwIGJvYXJkcyB1c2luZwogICogb21hcC5jIGNvbnRyb2xsZXIgZHJpdmVyLiBMdWNraWx5IHRoaXMgaXMgbm90IGN1cnJlbnRseSBkb25lIG9uIGFueSBrbm93bgpAQCAtMTQxLDYgKzE0MSwxMSBAQAogI2RlZmluZSBPTUFQX0hTTU1DX1dSSVRFKGJhc2UsIHJlZywgdmFsKSBcCiAJX19yYXdfd3JpdGVsKCh2YWwpLCAoYmFzZSkgKyBPTUFQX0hTTU1DXyMjcmVnKQogCitzdHJ1Y3Qgb21hcF9oc21tY19uZXh0IHsKKwl1bnNpZ25lZCBpbnQJZG1hX2xlbjsKKwlzMzIJCWNvb2tpZTsKK307CisKIHN0cnVjdCBvbWFwX2hzbW1jX2hvc3QgewogCXN0cnVjdAlkZXZpY2UJCSpkZXY7CiAJc3RydWN0CW1tY19ob3N0CSptbWM7CkBAIC0xNDgsNyArMTUzLDYgQEAKIAlzdHJ1Y3QJbW1jX2NvbW1hbmQJKmNtZDsKIAlzdHJ1Y3QJbW1jX2RhdGEJKmRhdGE7CiAJc3RydWN0CWNsawkJKmZjbGs7Ci0Jc3RydWN0CWNsawkJKmljbGs7CiAJc3RydWN0CWNsawkJKmRiY2xrOwogCS8qCiAJICogdmNjID09IGNvbmZpZ3VyZWQgc3VwcGx5CkBAIC0xODQsNiArMTg4LDcgQEAKIAlpbnQJCQlyZXFzX2Jsb2NrZWQ7CiAJaW50CQkJdXNlX3JlZzsKIAlpbnQJCQlyZXFfaW5fcHJvZ3Jlc3M7CisJc3RydWN0IG9tYXBfaHNtbWNfbmV4dAluZXh0X2RhdGE7CiAKIAlzdHJ1Y3QJb21hcF9tbWNfcGxhdGZvcm1fZGF0YQkqcGRhdGE7CiB9OwpAQCAtNDI5LDEyICs0MzQsMTQgQEAKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfQotCQltbWNfc2xvdChob3N0KS5vY3JfbWFzayA9IG1tY19yZWd1bGF0b3JfZ2V0X29jcm1hc2socmVnKTsKIAogCQkvKiBBbGxvdyBhbiBhdXggcmVndWxhdG9yICovCiAJCXJlZyA9IHJlZ3VsYXRvcl9nZXQoaG9zdC0+ZGV2LCAidm1tY19hdXgiKTsKIAkJaG9zdC0+dmNjX2F1eCA9IElTX0VSUihyZWcpID8gTlVMTCA6IHJlZzsKIAorCQkvKiBGb3IgZU1NQyBkbyBub3QgcG93ZXIgb2ZmIHdoZW4gbm90IGluIHNsZWVwIHN0YXRlICovCisJCWlmIChtbWNfc2xvdChob3N0KS5ub19yZWd1bGF0b3Jfb2ZmX2luaXQpCisJCQlyZXR1cm4gMDsKIAkJLyoKIAkJKiBVR0xZIEhBQ0s6ICB3b3JrYXJvdW5kIHJlZ3VsYXRvciBmcmFtZXdvcmsgYnVncy4KIAkJKiBXaGVuIHRoZSBib290bG9hZGVyIGxlYXZlcyBhIHN1cHBseSBhY3RpdmUsIGl0J3MKQEAgLTU0Niw2ICs1NTMsMTUgQEAKIH0KIAogLyoKKyAqIFN0YXJ0IGNsb2NrIHRvIHRoZSBjYXJkCisgKi8KK3N0YXRpYyB2b2lkIG9tYXBfaHNtbWNfc3RhcnRfY2xvY2soc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCkKK3sKKwlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIFNZU0NUTCwKKwkJT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIFNZU0NUTCkgfCBDRU4pOworfQorCisvKgogICogU3RvcCBjbG9jayB0byB0aGUgY2FyZAogICovCiBzdGF0aWMgdm9pZCBvbWFwX2hzbW1jX3N0b3BfY2xvY2soc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCkKQEAgLTU4Miw2ICs1OTgsODEgQEAKIAlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIFNUQVQsIFNUQVRfQ0xFQVIpOwogfQogCisvKiBDYWxjdWxhdGUgZGl2aXNvciBmb3IgdGhlIGdpdmVuIGNsb2NrIGZyZXF1ZW5jeSAqLworc3RhdGljIHUxNiBjYWxjX2Rpdmlzb3Ioc3RydWN0IG1tY19pb3MgKmlvcykKK3sKKwl1MTYgZHNvciA9IDA7CisKKwlpZiAoaW9zLT5jbG9jaykgeworCQlkc29yID0gRElWX1JPVU5EX1VQKE9NQVBfTU1DX01BU1RFUl9DTE9DSywgaW9zLT5jbG9jayk7CisJCWlmIChkc29yID4gMjUwKQorCQkJZHNvciA9IDI1MDsKKwl9CisKKwlyZXR1cm4gZHNvcjsKK30KKworc3RhdGljIHZvaWQgb21hcF9oc21tY19zZXRfY2xvY2soc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgbW1jX2lvcyAqaW9zID0gJmhvc3QtPm1tYy0+aW9zOworCXVuc2lnbmVkIGxvbmcgcmVndmFsOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiU2V0IGNsb2NrIHRvICV1SHpcbiIsIGlvcy0+Y2xvY2spOworCisJb21hcF9oc21tY19zdG9wX2Nsb2NrKGhvc3QpOworCisJcmVndmFsID0gT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIFNZU0NUTCk7CisJcmVndmFsID0gcmVndmFsICYgfihDTEtEX01BU0sgfCBEVE9fTUFTSyk7CisJcmVndmFsID0gcmVndmFsIHwgKGNhbGNfZGl2aXNvcihpb3MpIDw8IDYpIHwgKERUTyA8PCAxNik7CisJT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBTWVNDVEwsIHJlZ3ZhbCk7CisJT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBTWVNDVEwsCisJCU9NQVBfSFNNTUNfUkVBRChob3N0LT5iYXNlLCBTWVNDVEwpIHwgSUNFKTsKKworCS8qIFdhaXQgdGlsbCB0aGUgSUNTIGJpdCBpcyBzZXQgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoTU1DX1RJTUVPVVRfTVMpOworCXdoaWxlICgoT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIFNZU0NUTCkgJiBJQ1MpICE9IElDUworCQkmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJY3B1X3JlbGF4KCk7CisKKwlvbWFwX2hzbW1jX3N0YXJ0X2Nsb2NrKGhvc3QpOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2hzbW1jX3NldF9idXNfd2lkdGgoc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgbW1jX2lvcyAqaW9zID0gJmhvc3QtPm1tYy0+aW9zOworCXUzMiBjb247CisKKwljb24gPSBPTUFQX0hTTU1DX1JFQUQoaG9zdC0+YmFzZSwgQ09OKTsKKwlzd2l0Y2ggKGlvcy0+YnVzX3dpZHRoKSB7CisJY2FzZSBNTUNfQlVTX1dJRFRIXzg6CisJCU9NQVBfSFNNTUNfV1JJVEUoaG9zdC0+YmFzZSwgQ09OLCBjb24gfCBEVzgpOworCQlicmVhazsKKwljYXNlIE1NQ19CVVNfV0lEVEhfNDoKKwkJT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBDT04sIGNvbiAmIH5EVzgpOworCQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIEhDVEwsCisJCQlPTUFQX0hTTU1DX1JFQUQoaG9zdC0+YmFzZSwgSENUTCkgfCBGT1VSX0JJVCk7CisJCWJyZWFrOworCWNhc2UgTU1DX0JVU19XSURUSF8xOgorCQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENPTiwgY29uICYgfkRXOCk7CisJCU9NQVBfSFNNTUNfV1JJVEUoaG9zdC0+YmFzZSwgSENUTCwKKwkJCU9NQVBfSFNNTUNfUkVBRChob3N0LT5iYXNlLCBIQ1RMKSAmIH5GT1VSX0JJVCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgb21hcF9oc21tY19zZXRfYnVzX21vZGUoc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgbW1jX2lvcyAqaW9zID0gJmhvc3QtPm1tYy0+aW9zOworCXUzMiBjb247CisKKwljb24gPSBPTUFQX0hTTU1DX1JFQUQoaG9zdC0+YmFzZSwgQ09OKTsKKwlpZiAoaW9zLT5idXNfbW9kZSA9PSBNTUNfQlVTTU9ERV9PUEVORFJBSU4pCisJCU9NQVBfSFNNTUNfV1JJVEUoaG9zdC0+YmFzZSwgQ09OLCBjb24gfCBPRCk7CisJZWxzZQorCQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENPTiwgY29uICYgfk9EKTsKK30KKwogI2lmZGVmIENPTkZJR19QTQogCiAvKgpAQCAtNTkzLDggKzY4NCw3IEBACiAJc3RydWN0IG1tY19pb3MgKmlvcyA9ICZob3N0LT5tbWMtPmlvczsKIAlzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBob3N0LT5wZGF0YTsKIAlpbnQgY29udGV4dF9sb3NzID0gMDsKLQl1MzIgaGN0bCwgY2FwYSwgY29uOwotCXUxNiBkc29yID0gMDsKKwl1MzIgaGN0bCwgY2FwYTsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKIAlpZiAocGRhdGEtPmdldF9jb250ZXh0X2xvc3NfY291bnQpIHsKQEAgLTY1Niw1NCArNzQ2LDEyIEBACiAJaWYgKGhvc3QtPnBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX09GRikKIAkJZ290byBvdXQ7CiAKLQljb24gPSBPTUFQX0hTTU1DX1JFQUQoaG9zdC0+YmFzZSwgQ09OKTsKLQlzd2l0Y2ggKGlvcy0+YnVzX3dpZHRoKSB7Ci0JY2FzZSBNTUNfQlVTX1dJRFRIXzg6Ci0JCU9NQVBfSFNNTUNfV1JJVEUoaG9zdC0+YmFzZSwgQ09OLCBjb24gfCBEVzgpOwotCQlicmVhazsKLQljYXNlIE1NQ19CVVNfV0lEVEhfNDoKLQkJT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBDT04sIGNvbiAmIH5EVzgpOwotCQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIEhDVEwsCi0JCQlPTUFQX0hTTU1DX1JFQUQoaG9zdC0+YmFzZSwgSENUTCkgfCBGT1VSX0JJVCk7Ci0JCWJyZWFrOwotCWNhc2UgTU1DX0JVU19XSURUSF8xOgotCQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENPTiwgY29uICYgfkRXOCk7Ci0JCU9NQVBfSFNNTUNfV1JJVEUoaG9zdC0+YmFzZSwgSENUTCwKLQkJCU9NQVBfSFNNTUNfUkVBRChob3N0LT5iYXNlLCBIQ1RMKSAmIH5GT1VSX0JJVCk7Ci0JCWJyZWFrOwotCX0KKwlvbWFwX2hzbW1jX3NldF9idXNfd2lkdGgoaG9zdCk7CiAKLQlpZiAoaW9zLT5jbG9jaykgewotCQlkc29yID0gT01BUF9NTUNfTUFTVEVSX0NMT0NLIC8gaW9zLT5jbG9jazsKLQkJaWYgKGRzb3IgPCAxKQotCQkJZHNvciA9IDE7CisJb21hcF9oc21tY19zZXRfY2xvY2soaG9zdCk7CiAKLQkJaWYgKE9NQVBfTU1DX01BU1RFUl9DTE9DSyAvIGRzb3IgPiBpb3MtPmNsb2NrKQotCQkJZHNvcisrOworCW9tYXBfaHNtbWNfc2V0X2J1c19tb2RlKGhvc3QpOwogCi0JCWlmIChkc29yID4gMjUwKQotCQkJZHNvciA9IDI1MDsKLQl9Ci0KLQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIFNZU0NUTCwKLQkJT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIFNZU0NUTCkgJiB+Q0VOKTsKLQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIFNZU0NUTCwgKGRzb3IgPDwgNikgfCAoRFRPIDw8IDE2KSk7Ci0JT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBTWVNDVEwsCi0JCU9NQVBfSFNNTUNfUkVBRChob3N0LT5iYXNlLCBTWVNDVEwpIHwgSUNFKTsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhNTUNfVElNRU9VVF9NUyk7Ci0Jd2hpbGUgKChPTUFQX0hTTU1DX1JFQUQoaG9zdC0+YmFzZSwgU1lTQ1RMKSAmIElDUykgIT0gSUNTCi0JCSYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQotCQk7Ci0KLQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIFNZU0NUTCwKLQkJT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIFNZU0NUTCkgfCBDRU4pOwotCi0JY29uID0gT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIENPTik7Ci0JaWYgKGlvcy0+YnVzX21vZGUgPT0gTU1DX0JVU01PREVfT1BFTkRSQUlOKQotCQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENPTiwgY29uIHwgT0QpOwotCWVsc2UKLQkJT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBDT04sIGNvbiAmIH5PRCk7CiBvdXQ6CiAJaG9zdC0+Y29udGV4dF9sb3NzID0gY29udGV4dF9sb3NzOwogCkBAIC05NTksNyArMTAwNyw4IEBACiAJc3Bpbl91bmxvY2soJmhvc3QtPmlycV9sb2NrKTsKIAogCWlmIChob3N0LT51c2VfZG1hICYmIGRtYV9jaCAhPSAtMSkgewotCQlkbWFfdW5tYXBfc2cobW1jX2Rldihob3N0LT5tbWMpLCBob3N0LT5kYXRhLT5zZywgaG9zdC0+ZG1hX2xlbiwKKwkJZG1hX3VubWFwX3NnKG1tY19kZXYoaG9zdC0+bW1jKSwgaG9zdC0+ZGF0YS0+c2csCisJCQlob3N0LT5kYXRhLT5zZ19sZW4sCiAJCQlvbWFwX2hzbW1jX2dldF9kbWFfZGlyKGhvc3QsIGhvc3QtPmRhdGEpKTsKIAkJb21hcF9mcmVlX2RtYShkbWFfY2gpOwogCX0KQEAgLTk3MCwxNCArMTAxOSwxNCBAQAogICogUmVhZGFibGUgZXJyb3Igb3V0cHV0CiAgKi8KICNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCi1zdGF0aWMgdm9pZCBvbWFwX2hzbW1jX3JlcG9ydF9pcnEoc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCwgdTMyIHN0YXR1cykKK3N0YXRpYyB2b2lkIG9tYXBfaHNtbWNfZGJnX3JlcG9ydF9pcnEoc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCwgdTMyIHN0YXR1cykKIHsKIAkvKiAtLS0gbWVhbnMgcmVzZXJ2ZWQgYml0IHdpdGhvdXQgZGVmaW5pdGlvbiBhdCBkb2N1bWVudGF0aW9uICovCiAJc3RhdGljIGNvbnN0IGNoYXIgKm9tYXBfaHNtbWNfc3RhdHVzX2JpdHNbXSA9IHsKLQkJIkNDIiwgIlRDIiwgIkJHRSIsICItLS0iLCAiQldSIiwgIkJSUiIsICItLS0iLCAiLS0tIiwgIkNJUlEiLAotCQkiT0JJIiwgIi0tLSIsICItLS0iLCAiLS0tIiwgIi0tLSIsICItLS0iLCAiRVJSSSIsICJDVE8iLCAiQ0NSQyIsCi0JCSJDRUIiLCAiQ0lFIiwgIkRUTyIsICJEQ1JDIiwgIkRFQiIsICItLS0iLCAiQUNFIiwgIi0tLSIsCi0JCSItLS0iLCAiLS0tIiwgIi0tLSIsICJDRVJSIiwgIkNFUlIiLCAiQkFEQSIsICItLS0iLCAiLS0tIiwgIi0tLSIKKwkJIkNDIiAgLCAiVEMiICAsICJCR0UiLCAiLS0tIiwgIkJXUiIgLCAiQlJSIiAsICItLS0iICwgIi0tLSIgLAorCQkiQ0lSUSIsCSJPQkkiICwgIi0tLSIsICItLS0iLCAiLS0tIiAsICItLS0iICwgIi0tLSIgLCAiRVJSSSIsCisJCSJDVE8iICwgIkNDUkMiLCAiQ0VCIiwgIkNJRSIsICJEVE8iICwgIkRDUkMiLCAiREVCIiAsICItLS0iICwKKwkJIkFDRSIgLCAiLS0tIiAsICItLS0iLCAiLS0tIiwgIkNFUlIiLCAiQkFEQSIsICItLS0iICwgIi0tLSIKIAl9OwogCWNoYXIgcmVzWzI1Nl07CiAJY2hhciAqYnVmID0gcmVzOwpAQCAtOTk0LDYgKzEwNDMsMTEgQEAKIAogCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiJXNcbiIsIHJlcyk7CiB9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaHNtbWNfZGJnX3JlcG9ydF9pcnEoc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCwKKwkJCQkJICAgICB1MzIgc3RhdHVzKQoreworfQogI2VuZGlmICAvKiBDT05GSUdfTU1DX0RFQlVHICovCiAKIC8qCkBAIC0xMDUyLDkgKzExMDYsNyBAQAogCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiSVJRIFN0YXR1cyBpcyAleFxuIiwgc3RhdHVzKTsKIAogCWlmIChzdGF0dXMgJiBFUlIpIHsKLSNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCi0JCW9tYXBfaHNtbWNfcmVwb3J0X2lycShob3N0LCBzdGF0dXMpOwotI2VuZGlmCisJCW9tYXBfaHNtbWNfZGJnX3JlcG9ydF9pcnEoaG9zdCwgc3RhdHVzKTsKIAkJaWYgKChzdGF0dXMgJiBDTURfVElNRU9VVCkgfHwKIAkJCShzdGF0dXMgJiBDTURfQ1JDKSkgewogCQkJaWYgKGhvc3QtPmNtZCkgewpAQCAtMTE1Miw4ICsxMjA0LDcgQEAKIAlpbnQgcmV0OwogCiAJLyogRGlzYWJsZSB0aGUgY2xvY2tzICovCi0JY2xrX2Rpc2FibGUoaG9zdC0+ZmNsayk7Ci0JY2xrX2Rpc2FibGUoaG9zdC0+aWNsayk7CisJcG1fcnVudGltZV9wdXRfc3luYyhob3N0LT5kZXYpOwogCWlmIChob3N0LT5nb3RfZGJjbGspCiAJCWNsa19kaXNhYmxlKGhvc3QtPmRiY2xrKTsKIApAQCAtMTE2NCw4ICsxMjE1LDcgQEAKIAlpZiAoIXJldCkKIAkJcmV0ID0gbW1jX3Nsb3QoaG9zdCkuc2V0X3Bvd2VyKGhvc3QtPmRldiwgaG9zdC0+c2xvdF9pZCwgMSwKIAkJCQkJICAgICAgIHZkZCk7Ci0JY2xrX2VuYWJsZShob3N0LT5pY2xrKTsKLQljbGtfZW5hYmxlKGhvc3QtPmZjbGspOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoaG9zdC0+ZGV2KTsKIAlpZiAoaG9zdC0+Z290X2RiY2xrKQogCQljbGtfZW5hYmxlKGhvc3QtPmRiY2xrKTsKIApAQCAtMTMxOSw3ICsxMzY5LDcgQEAKIHN0YXRpYyB2b2lkIG9tYXBfaHNtbWNfZG1hX2NiKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmNiX2RhdGEpCiB7CiAJc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCA9IGNiX2RhdGE7Ci0Jc3RydWN0IG1tY19kYXRhICpkYXRhID0gaG9zdC0+bXJxLT5kYXRhOworCXN0cnVjdCBtbWNfZGF0YSAqZGF0YTsKIAlpbnQgZG1hX2NoLCByZXFfaW5fcHJvZ3Jlc3M7CiAKIAlpZiAoIShjaF9zdGF0dXMgJiBPTUFQX0RNQV9CTE9DS19JUlEpKSB7CkBAIC0xMzM0LDYgKzEzODQsNyBAQAogCQlyZXR1cm47CiAJfQogCisJZGF0YSA9IGhvc3QtPm1ycS0+ZGF0YTsKIAlob3N0LT5kbWFfc2dfaWR4Kys7CiAJaWYgKGhvc3QtPmRtYV9zZ19pZHggPCBob3N0LT5kbWFfbGVuKSB7CiAJCS8qIEZpcmUgdXAgdGhlIG5leHQgdHJhbnNmZXIuICovCkBAIC0xMzQzLDggKzEzOTQsOSBAQAogCQlyZXR1cm47CiAJfQogCi0JZG1hX3VubWFwX3NnKG1tY19kZXYoaG9zdC0+bW1jKSwgZGF0YS0+c2csIGhvc3QtPmRtYV9sZW4sCi0JCW9tYXBfaHNtbWNfZ2V0X2RtYV9kaXIoaG9zdCwgZGF0YSkpOworCWlmICghZGF0YS0+aG9zdF9jb29raWUpCisJCWRtYV91bm1hcF9zZyhtbWNfZGV2KGhvc3QtPm1tYyksIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sCisJCQkgICAgIG9tYXBfaHNtbWNfZ2V0X2RtYV9kaXIoaG9zdCwgZGF0YSkpOwogCiAJcmVxX2luX3Byb2dyZXNzID0gaG9zdC0+cmVxX2luX3Byb2dyZXNzOwogCWRtYV9jaCA9IGhvc3QtPmRtYV9jaDsKQEAgLTEzNjIsNiArMTQxNCw0NSBAQAogCX0KIH0KIAorc3RhdGljIGludCBvbWFwX2hzbW1jX3ByZV9kbWFfdHJhbnNmZXIoc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCwKKwkJCQkgICAgICAgc3RydWN0IG1tY19kYXRhICpkYXRhLAorCQkJCSAgICAgICBzdHJ1Y3Qgb21hcF9oc21tY19uZXh0ICpuZXh0KQoreworCWludCBkbWFfbGVuOworCisJaWYgKCFuZXh0ICYmIGRhdGEtPmhvc3RfY29va2llICYmCisJICAgIGRhdGEtPmhvc3RfY29va2llICE9IGhvc3QtPm5leHRfZGF0YS5jb29raWUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiWyVzXSBpbnZhbGlkIGNvb2tpZTogZGF0YS0+aG9zdF9jb29raWUgJWQiCisJCSAgICAgICAiIGhvc3QtPm5leHRfZGF0YS5jb29raWUgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgZGF0YS0+aG9zdF9jb29raWUsIGhvc3QtPm5leHRfZGF0YS5jb29raWUpOworCQlkYXRhLT5ob3N0X2Nvb2tpZSA9IDA7CisJfQorCisJLyogQ2hlY2sgaWYgbmV4dCBqb2IgaXMgYWxyZWFkeSBwcmVwYXJlZCAqLworCWlmIChuZXh0IHx8CisJICAgICghbmV4dCAmJiBkYXRhLT5ob3N0X2Nvb2tpZSAhPSBob3N0LT5uZXh0X2RhdGEuY29va2llKSkgeworCQlkbWFfbGVuID0gZG1hX21hcF9zZyhtbWNfZGV2KGhvc3QtPm1tYyksIGRhdGEtPnNnLAorCQkJCSAgICAgZGF0YS0+c2dfbGVuLAorCQkJCSAgICAgb21hcF9oc21tY19nZXRfZG1hX2Rpcihob3N0LCBkYXRhKSk7CisKKwl9IGVsc2UgeworCQlkbWFfbGVuID0gaG9zdC0+bmV4dF9kYXRhLmRtYV9sZW47CisJCWhvc3QtPm5leHRfZGF0YS5kbWFfbGVuID0gMDsKKwl9CisKKworCWlmIChkbWFfbGVuID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG5leHQpIHsKKwkJbmV4dC0+ZG1hX2xlbiA9IGRtYV9sZW47CisJCWRhdGEtPmhvc3RfY29va2llID0gKytuZXh0LT5jb29raWUgPCAwID8gMSA6IG5leHQtPmNvb2tpZTsKKwl9IGVsc2UKKwkJaG9zdC0+ZG1hX2xlbiA9IGRtYV9sZW47CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFJvdXRpbmUgdG8gY29uZmlndXJlIGFuZCBzdGFydCBETUEgZm9yIHRoZSBNTUMgY2FyZAogICovCkBAIC0xMzk1LDkgKzE0ODYsMTAgQEAKIAkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KKwlyZXQgPSBvbWFwX2hzbW1jX3ByZV9kbWFfdHJhbnNmZXIoaG9zdCwgZGF0YSwgTlVMTCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCWhvc3QtPmRtYV9sZW4gPSBkbWFfbWFwX3NnKG1tY19kZXYoaG9zdC0+bW1jKSwgZGF0YS0+c2csCi0JCQlkYXRhLT5zZ19sZW4sIG9tYXBfaHNtbWNfZ2V0X2RtYV9kaXIoaG9zdCwgZGF0YSkpOwogCWhvc3QtPmRtYV9jaCA9IGRtYV9jaDsKIAlob3N0LT5kbWFfc2dfaWR4ID0gMDsKIApAQCAtMTQ3Nyw2ICsxNTY5LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG9tYXBfaHNtbWNfcG9zdF9yZXEoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxLAorCQkJCWludCBlcnIpCit7CisJc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisJc3RydWN0IG1tY19kYXRhICpkYXRhID0gbXJxLT5kYXRhOworCisJaWYgKGhvc3QtPnVzZV9kbWEpIHsKKwkJZG1hX3VubWFwX3NnKG1tY19kZXYoaG9zdC0+bW1jKSwgZGF0YS0+c2csIGRhdGEtPnNnX2xlbiwKKwkJCSAgICAgb21hcF9oc21tY19nZXRfZG1hX2Rpcihob3N0LCBkYXRhKSk7CisJCWRhdGEtPmhvc3RfY29va2llID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfaHNtbWNfcHJlX3JlcShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEsCisJCQkgICAgICAgYm9vbCBpc19maXJzdF9yZXEpCit7CisJc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisKKwlpZiAobXJxLT5kYXRhLT5ob3N0X2Nvb2tpZSkgeworCQltcnEtPmRhdGEtPmhvc3RfY29va2llID0gMDsKKwkJcmV0dXJuIDsKKwl9CisKKwlpZiAoaG9zdC0+dXNlX2RtYSkKKwkJaWYgKG9tYXBfaHNtbWNfcHJlX2RtYV90cmFuc2Zlcihob3N0LCBtcnEtPmRhdGEsCisJCQkJCQkmaG9zdC0+bmV4dF9kYXRhKSkKKwkJCW1ycS0+ZGF0YS0+aG9zdF9jb29raWUgPSAwOworfQorCiAvKgogICogUmVxdWVzdCBmdW5jdGlvbi4gZm9yIHJlYWQvd3JpdGUgb3BlcmF0aW9uCiAgKi8KQEAgLTE1MjUsMTMgKzE2NDYsOSBAQAogc3RhdGljIHZvaWQgb21hcF9oc21tY19zZXRfaW9zKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQogewogCXN0cnVjdCBvbWFwX2hzbW1jX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwotCXUxNiBkc29yID0gMDsKLQl1bnNpZ25lZCBsb25nIHJlZ3ZhbDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JdTMyIGNvbjsKIAlpbnQgZG9fc2VuZF9pbml0X3N0cmVhbSA9IDA7CiAKLQltbWNfaG9zdF9lbmFibGUoaG9zdC0+bW1jKTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKGhvc3QtPmRldik7CiAKIAlpZiAoaW9zLT5wb3dlcl9tb2RlICE9IGhvc3QtPnBvd2VyX21vZGUpIHsKIAkJc3dpdGNoIChpb3MtPnBvd2VyX21vZGUpIHsKQEAgLTE1NTQsMjIgKzE2NzEsNyBAQAogCiAJLyogRklYTUU6IHNldCByZWdpc3RlcnMgYmFzZWQgb25seSBvbiBjaGFuZ2VzIHRvIGlvcyAqLwogCi0JY29uID0gT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIENPTik7Ci0Jc3dpdGNoIChtbWMtPmlvcy5idXNfd2lkdGgpIHsKLQljYXNlIE1NQ19CVVNfV0lEVEhfODoKLQkJT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBDT04sIGNvbiB8IERXOCk7Ci0JCWJyZWFrOwotCWNhc2UgTU1DX0JVU19XSURUSF80OgotCQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENPTiwgY29uICYgfkRXOCk7Ci0JCU9NQVBfSFNNTUNfV1JJVEUoaG9zdC0+YmFzZSwgSENUTCwKLQkJCU9NQVBfSFNNTUNfUkVBRChob3N0LT5iYXNlLCBIQ1RMKSB8IEZPVVJfQklUKTsKLQkJYnJlYWs7Ci0JY2FzZSBNTUNfQlVTX1dJRFRIXzE6Ci0JCU9NQVBfSFNNTUNfV1JJVEUoaG9zdC0+YmFzZSwgQ09OLCBjb24gJiB+RFc4KTsKLQkJT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBIQ1RMLAotCQkJT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIEhDVEwpICYgfkZPVVJfQklUKTsKLQkJYnJlYWs7Ci0JfQorCW9tYXBfaHNtbWNfc2V0X2J1c193aWR0aChob3N0KTsKIAogCWlmIChob3N0LT5wZGF0YS0+Y29udHJvbGxlcl9mbGFncyAmIE9NQVBfSFNNTUNfU1VQUE9SVFNfRFVBTF9WT0xUKSB7CiAJCS8qIE9ubHkgTU1DMSBjYW4gaW50ZXJmYWNlIGF0IDNWIHdpdGhvdXQgc29tZSBmbGF2b3IKQEAgLTE1ODksNDcgKzE2OTEsMTQgQEAKIAkJfQogCX0KIAotCWlmIChpb3MtPmNsb2NrKSB7Ci0JCWRzb3IgPSBPTUFQX01NQ19NQVNURVJfQ0xPQ0sgLyBpb3MtPmNsb2NrOwotCQlpZiAoZHNvciA8IDEpCi0JCQlkc29yID0gMTsKLQotCQlpZiAoT01BUF9NTUNfTUFTVEVSX0NMT0NLIC8gZHNvciA+IGlvcy0+Y2xvY2spCi0JCQlkc29yKys7Ci0KLQkJaWYgKGRzb3IgPiAyNTApCi0JCQlkc29yID0gMjUwOwotCX0KLQlvbWFwX2hzbW1jX3N0b3BfY2xvY2soaG9zdCk7Ci0JcmVndmFsID0gT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIFNZU0NUTCk7Ci0JcmVndmFsID0gcmVndmFsICYgfihDTEtEX01BU0spOwotCXJlZ3ZhbCA9IHJlZ3ZhbCB8IChkc29yIDw8IDYpIHwgKERUTyA8PCAxNik7Ci0JT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBTWVNDVEwsIHJlZ3ZhbCk7Ci0JT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBTWVNDVEwsCi0JCU9NQVBfSFNNTUNfUkVBRChob3N0LT5iYXNlLCBTWVNDVEwpIHwgSUNFKTsKLQotCS8qIFdhaXQgdGlsbCB0aGUgSUNTIGJpdCBpcyBzZXQgKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoTU1DX1RJTUVPVVRfTVMpOwotCXdoaWxlICgoT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIFNZU0NUTCkgJiBJQ1MpICE9IElDUwotCQkmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKLQkJbXNsZWVwKDEpOwotCi0JT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBTWVNDVEwsCi0JCU9NQVBfSFNNTUNfUkVBRChob3N0LT5iYXNlLCBTWVNDVEwpIHwgQ0VOKTsKKwlvbWFwX2hzbW1jX3NldF9jbG9jayhob3N0KTsKIAogCWlmIChkb19zZW5kX2luaXRfc3RyZWFtKQogCQlzZW5kX2luaXRfc3RyZWFtKGhvc3QpOwogCi0JY29uID0gT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIENPTik7Ci0JaWYgKGlvcy0+YnVzX21vZGUgPT0gTU1DX0JVU01PREVfT1BFTkRSQUlOKQotCQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENPTiwgY29uIHwgT0QpOwotCWVsc2UKLQkJT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBDT04sIGNvbiAmIH5PRCk7CisJb21hcF9oc21tY19zZXRfYnVzX21vZGUoaG9zdCk7CiAKLQlpZiAoaG9zdC0+cG93ZXJfbW9kZSA9PSBNTUNfUE9XRVJfT0ZGKQotCQltbWNfaG9zdF9kaXNhYmxlKGhvc3QtPm1tYyk7Ci0JZWxzZQotCQltbWNfaG9zdF9sYXp5X2Rpc2FibGUoaG9zdC0+bW1jKTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChob3N0LT5kZXYpOwogfQogCiBzdGF0aWMgaW50IG9tYXBfaHNtbWNfZ2V0X2NkKHN0cnVjdCBtbWNfaG9zdCAqbW1jKQpAQCAtMTY4NSwyMzAgKzE3NTQsMTIgQEAKIAlzZXRfc2RfYnVzX3Bvd2VyKGhvc3QpOwogfQogCi0vKgotICogRHluYW1pYyBwb3dlciBzYXZpbmcgaGFuZGxpbmcsIEZTTToKLSAqICAgRU5BQkxFRCAtPiBESVNBQkxFRCAtPiBDQVJEU0xFRVAgLyBSRUdTTEVFUCAtPiBPRkYKLSAqICAgICBeX19fX19fX19fX198ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfAotICogICAgIHxfX19fX19fX19fX19fX19fX19fX19ffF9fX19fX19fX19fX19fX19fX19fX198Ci0gKgotICogRU5BQkxFRDogICBtbWMgaG9zdCBpcyBmdWxseSBmdW5jdGlvbmFsCi0gKiBESVNBQkxFRDogIGZjbGsgaXMgb2ZmCi0gKiBDQVJEU0xFRVA6IGZjbGsgaXMgb2ZmLCBjYXJkIGlzIGFzbGVlcCwgdm9sdGFnZSByZWd1bGF0b3IgaXMgYXNsZWVwCi0gKiBSRUdTTEVFUDogIGZjbGsgaXMgb2ZmLCB2b2x0YWdlIHJlZ3VsYXRvciBpcyBhc2xlZXAKLSAqIE9GRjogICAgICAgZmNsayBpcyBvZmYsIHZvbHRhZ2UgcmVndWxhdG9yIGlzIG9mZgotICoKLSAqIFRyYW5zaXRpb24gaGFuZGxlcnMgcmV0dXJuIHRoZSB0aW1lb3V0IGZvciB0aGUgbmV4dCBzdGF0ZSB0cmFuc2l0aW9uCi0gKiBvciBuZWdhdGl2ZSBlcnJvci4KLSAqLwotCi1lbnVtIHtFTkFCTEVEID0gMCwgRElTQUJMRUQsIENBUkRTTEVFUCwgUkVHU0xFRVAsIE9GRn07Ci0KLS8qIEhhbmRsZXIgZm9yIFtFTkFCTEVEIC0+IERJU0FCTEVEXSB0cmFuc2l0aW9uICovCi1zdGF0aWMgaW50IG9tYXBfaHNtbWNfZW5hYmxlZF90b19kaXNhYmxlZChzdHJ1Y3Qgb21hcF9oc21tY19ob3N0ICpob3N0KQotewotCW9tYXBfaHNtbWNfY29udGV4dF9zYXZlKGhvc3QpOwotCWNsa19kaXNhYmxlKGhvc3QtPmZjbGspOwotCWhvc3QtPmRwbV9zdGF0ZSA9IERJU0FCTEVEOwotCi0JZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJFTkFCTEVEIC0+IERJU0FCTEVEXG4iKTsKLQotCWlmIChob3N0LT5wb3dlcl9tb2RlID09IE1NQ19QT1dFUl9PRkYpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIE9NQVBfTU1DX1NMRUVQX1RJTUVPVVQ7Ci19Ci0KLS8qIEhhbmRsZXIgZm9yIFtESVNBQkxFRCAtPiBSRUdTTEVFUCAvIENBUkRTTEVFUF0gdHJhbnNpdGlvbiAqLwotc3RhdGljIGludCBvbWFwX2hzbW1jX2Rpc2FibGVkX3RvX3NsZWVwKHN0cnVjdCBvbWFwX2hzbW1jX2hvc3QgKmhvc3QpCi17Ci0JaW50IGVyciwgbmV3X3N0YXRlOwotCi0JaWYgKCFtbWNfdHJ5X2NsYWltX2hvc3QoaG9zdC0+bW1jKSkKLQkJcmV0dXJuIDA7Ci0KLQljbGtfZW5hYmxlKGhvc3QtPmZjbGspOwotCW9tYXBfaHNtbWNfY29udGV4dF9yZXN0b3JlKGhvc3QpOwotCWlmIChtbWNfY2FyZF9jYW5fc2xlZXAoaG9zdC0+bW1jKSkgewotCQllcnIgPSBtbWNfY2FyZF9zbGVlcChob3N0LT5tbWMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJY2xrX2Rpc2FibGUoaG9zdC0+ZmNsayk7Ci0JCQltbWNfcmVsZWFzZV9ob3N0KGhvc3QtPm1tYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JCW5ld19zdGF0ZSA9IENBUkRTTEVFUDsKLQl9IGVsc2UgewotCQluZXdfc3RhdGUgPSBSRUdTTEVFUDsKLQl9Ci0JaWYgKG1tY19zbG90KGhvc3QpLnNldF9zbGVlcCkKLQkJbW1jX3Nsb3QoaG9zdCkuc2V0X3NsZWVwKGhvc3QtPmRldiwgaG9zdC0+c2xvdF9pZCwgMSwgMCwKLQkJCQkJIG5ld19zdGF0ZSA9PSBDQVJEU0xFRVApOwotCS8qIEZJWE1FOiB0dXJuIG9mZiBidXMgcG93ZXIgYW5kIHBlcmhhcHMgaW50ZXJydXB0cyB0b28gKi8KLQljbGtfZGlzYWJsZShob3N0LT5mY2xrKTsKLQlob3N0LT5kcG1fc3RhdGUgPSBuZXdfc3RhdGU7Ci0KLQltbWNfcmVsZWFzZV9ob3N0KGhvc3QtPm1tYyk7Ci0KLQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgIkRJU0FCTEVEIC0+ICVzXG4iLAotCQlob3N0LT5kcG1fc3RhdGUgPT0gQ0FSRFNMRUVQID8gIkNBUkRTTEVFUCIgOiAiUkVHU0xFRVAiKTsKLQotCWlmIChtbWNfc2xvdChob3N0KS5ub19vZmYpCi0JCXJldHVybiAwOwotCi0JaWYgKChob3N0LT5tbWMtPmNhcHMgJiBNTUNfQ0FQX05PTlJFTU9WQUJMRSkgfHwKLQkgICAgbW1jX3Nsb3QoaG9zdCkuY2FyZF9kZXRlY3QgfHwKLQkgICAgKG1tY19zbG90KGhvc3QpLmdldF9jb3Zlcl9zdGF0ZSAmJgotCSAgICAgbW1jX3Nsb3QoaG9zdCkuZ2V0X2NvdmVyX3N0YXRlKGhvc3QtPmRldiwgaG9zdC0+c2xvdF9pZCkpKQotCQlyZXR1cm4gT01BUF9NTUNfT0ZGX1RJTUVPVVQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogSGFuZGxlciBmb3IgW1JFR1NMRUVQIC8gQ0FSRFNMRUVQIC0+IE9GRl0gdHJhbnNpdGlvbiAqLwotc3RhdGljIGludCBvbWFwX2hzbW1jX3NsZWVwX3RvX29mZihzdHJ1Y3Qgb21hcF9oc21tY19ob3N0ICpob3N0KQotewotCWlmICghbW1jX3RyeV9jbGFpbV9ob3N0KGhvc3QtPm1tYykpCi0JCXJldHVybiAwOwotCi0JaWYgKG1tY19zbG90KGhvc3QpLm5vX29mZikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoISgoaG9zdC0+bW1jLT5jYXBzICYgTU1DX0NBUF9OT05SRU1PVkFCTEUpIHx8Ci0JICAgICAgbW1jX3Nsb3QoaG9zdCkuY2FyZF9kZXRlY3QgfHwKLQkgICAgICAobW1jX3Nsb3QoaG9zdCkuZ2V0X2NvdmVyX3N0YXRlICYmCi0JICAgICAgIG1tY19zbG90KGhvc3QpLmdldF9jb3Zlcl9zdGF0ZShob3N0LT5kZXYsIGhvc3QtPnNsb3RfaWQpKSkpIHsKLQkJbW1jX3JlbGVhc2VfaG9zdChob3N0LT5tbWMpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltbWNfc2xvdChob3N0KS5zZXRfcG93ZXIoaG9zdC0+ZGV2LCBob3N0LT5zbG90X2lkLCAwLCAwKTsKLQlob3N0LT52ZGQgPSAwOwotCWhvc3QtPnBvd2VyX21vZGUgPSBNTUNfUE9XRVJfT0ZGOwotCi0JZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICIlcyAtPiBPRkZcbiIsCi0JCWhvc3QtPmRwbV9zdGF0ZSA9PSBDQVJEU0xFRVAgPyAiQ0FSRFNMRUVQIiA6ICJSRUdTTEVFUCIpOwotCi0JaG9zdC0+ZHBtX3N0YXRlID0gT0ZGOwotCi0JbW1jX3JlbGVhc2VfaG9zdChob3N0LT5tbWMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEhhbmRsZXIgZm9yIFtESVNBQkxFRCAtPiBFTkFCTEVEXSB0cmFuc2l0aW9uICovCi1zdGF0aWMgaW50IG9tYXBfaHNtbWNfZGlzYWJsZWRfdG9fZW5hYmxlZChzdHJ1Y3Qgb21hcF9oc21tY19ob3N0ICpob3N0KQotewotCWludCBlcnI7Ci0KLQllcnIgPSBjbGtfZW5hYmxlKGhvc3QtPmZjbGspOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0Jb21hcF9oc21tY19jb250ZXh0X3Jlc3RvcmUoaG9zdCk7Ci0JaG9zdC0+ZHBtX3N0YXRlID0gRU5BQkxFRDsKLQotCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiRElTQUJMRUQgLT4gRU5BQkxFRFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogSGFuZGxlciBmb3IgW1NMRUVQIC0+IEVOQUJMRURdIHRyYW5zaXRpb24gKi8KLXN0YXRpYyBpbnQgb21hcF9oc21tY19zbGVlcF90b19lbmFibGVkKHN0cnVjdCBvbWFwX2hzbW1jX2hvc3QgKmhvc3QpCi17Ci0JaWYgKCFtbWNfdHJ5X2NsYWltX2hvc3QoaG9zdC0+bW1jKSkKLQkJcmV0dXJuIDA7Ci0KLQljbGtfZW5hYmxlKGhvc3QtPmZjbGspOwotCW9tYXBfaHNtbWNfY29udGV4dF9yZXN0b3JlKGhvc3QpOwotCWlmIChtbWNfc2xvdChob3N0KS5zZXRfc2xlZXApCi0JCW1tY19zbG90KGhvc3QpLnNldF9zbGVlcChob3N0LT5kZXYsIGhvc3QtPnNsb3RfaWQsIDAsCi0JCQkgaG9zdC0+dmRkLCBob3N0LT5kcG1fc3RhdGUgPT0gQ0FSRFNMRUVQKTsKLQlpZiAobW1jX2NhcmRfY2FuX3NsZWVwKGhvc3QtPm1tYykpCi0JCW1tY19jYXJkX2F3YWtlKGhvc3QtPm1tYyk7Ci0KLQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgIiVzIC0+IEVOQUJMRURcbiIsCi0JCWhvc3QtPmRwbV9zdGF0ZSA9PSBDQVJEU0xFRVAgPyAiQ0FSRFNMRUVQIiA6ICJSRUdTTEVFUCIpOwotCi0JaG9zdC0+ZHBtX3N0YXRlID0gRU5BQkxFRDsKLQotCW1tY19yZWxlYXNlX2hvc3QoaG9zdC0+bW1jKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBIYW5kbGVyIGZvciBbT0ZGIC0+IEVOQUJMRURdIHRyYW5zaXRpb24gKi8KLXN0YXRpYyBpbnQgb21hcF9oc21tY19vZmZfdG9fZW5hYmxlZChzdHJ1Y3Qgb21hcF9oc21tY19ob3N0ICpob3N0KQotewotCWNsa19lbmFibGUoaG9zdC0+ZmNsayk7Ci0KLQlvbWFwX2hzbW1jX2NvbnRleHRfcmVzdG9yZShob3N0KTsKLQlvbWFwX2hzbW1jX2NvbmZfYnVzX3Bvd2VyKGhvc3QpOwotCW1tY19wb3dlcl9yZXN0b3JlX2hvc3QoaG9zdC0+bW1jKTsKLQotCWhvc3QtPmRwbV9zdGF0ZSA9IEVOQUJMRUQ7Ci0KLQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgIk9GRiAtPiBFTkFCTEVEXG4iKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQnJpbmcgTU1DIGhvc3QgdG8gRU5BQkxFRCBmcm9tIGFueSBvdGhlciBQTSBzdGF0ZS4KLSAqLwotc3RhdGljIGludCBvbWFwX2hzbW1jX2VuYWJsZShzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKLXsKLQlzdHJ1Y3Qgb21hcF9oc21tY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKLQotCXN3aXRjaCAoaG9zdC0+ZHBtX3N0YXRlKSB7Ci0JY2FzZSBESVNBQkxFRDoKLQkJcmV0dXJuIG9tYXBfaHNtbWNfZGlzYWJsZWRfdG9fZW5hYmxlZChob3N0KTsKLQljYXNlIENBUkRTTEVFUDoKLQljYXNlIFJFR1NMRUVQOgotCQlyZXR1cm4gb21hcF9oc21tY19zbGVlcF90b19lbmFibGVkKGhvc3QpOwotCWNhc2UgT0ZGOgotCQlyZXR1cm4gb21hcF9oc21tY19vZmZfdG9fZW5hYmxlZChob3N0KTsKLQlkZWZhdWx0OgotCQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgIlVOS05PV04gc3RhdGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci19Ci0KLS8qCi0gKiBCcmluZyBNTUMgaG9zdCBpbiBQTSBzdGF0ZSAob25lIGxldmVsIGRlZXBlcikuCi0gKi8KLXN0YXRpYyBpbnQgb21hcF9oc21tY19kaXNhYmxlKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBpbnQgbGF6eSkKLXsKLQlzdHJ1Y3Qgb21hcF9oc21tY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKLQotCXN3aXRjaCAoaG9zdC0+ZHBtX3N0YXRlKSB7Ci0JY2FzZSBFTkFCTEVEOiB7Ci0JCWludCBkZWxheTsKLQotCQlkZWxheSA9IG9tYXBfaHNtbWNfZW5hYmxlZF90b19kaXNhYmxlZChob3N0KTsKLQkJaWYgKGxhenkgfHwgZGVsYXkgPCAwKQotCQkJcmV0dXJuIGRlbGF5OwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBESVNBQkxFRDoKLQkJcmV0dXJuIG9tYXBfaHNtbWNfZGlzYWJsZWRfdG9fc2xlZXAoaG9zdCk7Ci0JY2FzZSBDQVJEU0xFRVA6Ci0JY2FzZSBSRUdTTEVFUDoKLQkJcmV0dXJuIG9tYXBfaHNtbWNfc2xlZXBfdG9fb2ZmKGhvc3QpOwotCWRlZmF1bHQ6Ci0JCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiVU5LTk9XTiBzdGF0ZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLX0KLQogc3RhdGljIGludCBvbWFwX2hzbW1jX2VuYWJsZV9mY2xrKHN0cnVjdCBtbWNfaG9zdCAqbW1jKQogewogCXN0cnVjdCBvbWFwX2hzbW1jX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwotCWludCBlcnI7CiAKLQllcnIgPSBjbGtfZW5hYmxlKGhvc3QtPmZjbGspOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJtbWNfZmNsazogZW5hYmxlZFxuIik7Ci0Jb21hcF9oc21tY19jb250ZXh0X3Jlc3RvcmUoaG9zdCk7CisJcG1fcnVudGltZV9nZXRfc3luYyhob3N0LT5kZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5MTYsMjYgKzE3NjcsMTcgQEAKIHsKIAlzdHJ1Y3Qgb21hcF9oc21tY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKIAotCW9tYXBfaHNtbWNfY29udGV4dF9zYXZlKGhvc3QpOwotCWNsa19kaXNhYmxlKGhvc3QtPmZjbGspOwotCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAibW1jX2ZjbGs6IGRpc2FibGVkXG4iKTsKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGhvc3QtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoaG9zdC0+ZGV2KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBvbWFwX2hzbW1jX29wcyA9IHsKIAkuZW5hYmxlID0gb21hcF9oc21tY19lbmFibGVfZmNsaywKIAkuZGlzYWJsZSA9IG9tYXBfaHNtbWNfZGlzYWJsZV9mY2xrLAotCS5yZXF1ZXN0ID0gb21hcF9oc21tY19yZXF1ZXN0LAotCS5zZXRfaW9zID0gb21hcF9oc21tY19zZXRfaW9zLAotCS5nZXRfY2QgPSBvbWFwX2hzbW1jX2dldF9jZCwKLQkuZ2V0X3JvID0gb21hcF9oc21tY19nZXRfcm8sCi0JLmluaXRfY2FyZCA9IG9tYXBfaHNtbWNfaW5pdF9jYXJkLAotCS8qIE5ZRVQgLS0gZW5hYmxlX3NkaW9faXJxICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBvbWFwX2hzbW1jX3BzX29wcyA9IHsKLQkuZW5hYmxlID0gb21hcF9oc21tY19lbmFibGUsCi0JLmRpc2FibGUgPSBvbWFwX2hzbW1jX2Rpc2FibGUsCisJLnBvc3RfcmVxID0gb21hcF9oc21tY19wb3N0X3JlcSwKKwkucHJlX3JlcSA9IG9tYXBfaHNtbWNfcHJlX3JlcSwKIAkucmVxdWVzdCA9IG9tYXBfaHNtbWNfcmVxdWVzdCwKIAkuc2V0X2lvcyA9IG9tYXBfaHNtbWNfc2V0X2lvcywKIAkuZ2V0X2NkID0gb21hcF9oc21tY19nZXRfY2QsCkBAIC0xOTY1LDE1ICsxODA3LDEyIEBACiAJCQlob3N0LT5kcG1fc3RhdGUsIG1tYy0+bmVzdGluZ19jbnQsCiAJCQlob3N0LT5jb250ZXh0X2xvc3MsIGNvbnRleHRfbG9zcyk7CiAKLQlpZiAoaG9zdC0+c3VzcGVuZGVkIHx8IGhvc3QtPmRwbV9zdGF0ZSA9PSBPRkYpIHsKKwlpZiAoaG9zdC0+c3VzcGVuZGVkKSB7CiAJCXNlcV9wcmludGYocywgImhvc3Qgc3VzcGVuZGVkLCBjYW4ndCByZWFkIHJlZ2lzdGVyc1xuIik7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChjbGtfZW5hYmxlKGhvc3QtPmZjbGspICE9IDApIHsKLQkJc2VxX3ByaW50ZihzLCAiY2FuJ3QgcmVhZCB0aGUgcmVnc1xuIik7Ci0JCXJldHVybiAwOwotCX0KKwlwbV9ydW50aW1lX2dldF9zeW5jKGhvc3QtPmRldik7CiAKIAlzZXFfcHJpbnRmKHMsICJTWVNDT05GSUc6XHQweCUwOHhcbiIsCiAJCQlPTUFQX0hTTU1DX1JFQUQoaG9zdC0+YmFzZSwgU1lTQ09ORklHKSk7CkBAIC0xOTkwLDcgKzE4MjksOCBAQAogCXNlcV9wcmludGYocywgIkNBUEE6XHRcdDB4JTA4eFxuIiwKIAkJCU9NQVBfSFNNTUNfUkVBRChob3N0LT5iYXNlLCBDQVBBKSk7CiAKLQljbGtfZGlzYWJsZShob3N0LT5mY2xrKTsKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGhvc3QtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoaG9zdC0+ZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA3NCwxNCArMTkxNCwxMiBAQAogCWhvc3QtPm1hcGJhc2UJPSByZXMtPnN0YXJ0OwogCWhvc3QtPmJhc2UJPSBpb3JlbWFwKGhvc3QtPm1hcGJhc2UsIFNaXzRLKTsKIAlob3N0LT5wb3dlcl9tb2RlID0gTU1DX1BPV0VSX09GRjsKKwlob3N0LT5uZXh0X2RhdGEuY29va2llID0gMTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwogCUlOSVRfV09SSygmaG9zdC0+bW1jX2NhcmRkZXRlY3Rfd29yaywgb21hcF9oc21tY19kZXRlY3QpOwogCi0JaWYgKG1tY19zbG90KGhvc3QpLnBvd2VyX3NhdmluZykKLQkJbW1jLT5vcHMJPSAmb21hcF9oc21tY19wc19vcHM7Ci0JZWxzZQotCQltbWMtPm9wcwk9ICZvbWFwX2hzbW1jX29wczsKKwltbWMtPm9wcwk9ICZvbWFwX2hzbW1jX29wczsKIAogCS8qCiAJICogSWYgcmVndWxhdG9yX2Rpc2FibGUgY2FuIG9ubHkgcHV0IHZjY19hdXggdG8gc2xlZXAgdGhlbiB0aGVyZSBpcwpAQCAtMjA5MCw0NCArMTkyOCwyNiBAQAogCWlmIChtbWNfc2xvdChob3N0KS52Y2NfYXV4X2Rpc2FibGVfaXNfc2xlZXApCiAJCW1tY19zbG90KGhvc3QpLm5vX29mZiA9IDE7CiAKLQltbWMtPmZfbWluCT0gNDAwMDAwOwotCW1tYy0+Zl9tYXgJPSA1MjAwMDAwMDsKKwltbWMtPmZfbWluCT0gT01BUF9NTUNfTUlOX0NMT0NLOworCW1tYy0+Zl9tYXgJPSBPTUFQX01NQ19NQVhfQ0xPQ0s7CiAKIAlzcGluX2xvY2tfaW5pdCgmaG9zdC0+aXJxX2xvY2spOwogCi0JaG9zdC0+aWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImljayIpOwotCWlmIChJU19FUlIoaG9zdC0+aWNsaykpIHsKLQkJcmV0ID0gUFRSX0VSUihob3N0LT5pY2xrKTsKLQkJaG9zdC0+aWNsayA9IE5VTEw7Ci0JCWdvdG8gZXJyMTsKLQl9CiAJaG9zdC0+ZmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImZjayIpOwogCWlmIChJU19FUlIoaG9zdC0+ZmNsaykpIHsKIAkJcmV0ID0gUFRSX0VSUihob3N0LT5mY2xrKTsKIAkJaG9zdC0+ZmNsayA9IE5VTEw7Ci0JCWNsa19wdXQoaG9zdC0+aWNsayk7CiAJCWdvdG8gZXJyMTsKIAl9CiAKIAlvbWFwX2hzbW1jX2NvbnRleHRfc2F2ZShob3N0KTsKIAogCW1tYy0+Y2FwcyB8PSBNTUNfQ0FQX0RJU0FCTEU7Ci0JbW1jX3NldF9kaXNhYmxlX2RlbGF5KG1tYywgT01BUF9NTUNfRElTQUJMRURfVElNRU9VVCk7Ci0JLyogd2Ugc3RhcnQgb2ZmIGluIERJU0FCTEVEIHN0YXRlICovCi0JaG9zdC0+ZHBtX3N0YXRlID0gRElTQUJMRUQ7CiAKLQlpZiAoY2xrX2VuYWJsZShob3N0LT5pY2xrKSAhPSAwKSB7Ci0JCWNsa19wdXQoaG9zdC0+aWNsayk7Ci0JCWNsa19wdXQoaG9zdC0+ZmNsayk7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlpZiAobW1jX2hvc3RfZW5hYmxlKGhvc3QtPm1tYykgIT0gMCkgewotCQljbGtfZGlzYWJsZShob3N0LT5pY2xrKTsKLQkJY2xrX3B1dChob3N0LT5pY2xrKTsKLQkJY2xrX3B1dChob3N0LT5mY2xrKTsKLQkJZ290byBlcnIxOwotCX0KKwlwbV9ydW50aW1lX2VuYWJsZShob3N0LT5kZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoaG9zdC0+ZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShob3N0LT5kZXYsIE1NQ19BVVRPU1VTUEVORF9ERUxBWSk7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoaG9zdC0+ZGV2KTsKIAogCWlmIChjcHVfaXNfb21hcDI0MzAoKSkgewogCQlob3N0LT5kYmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm1tY2hzZGJfZmNrIik7CkBAIC0yMjM3LDggKzIwNTcsNiBAQAogCiAJb21hcF9oc21tY19kaXNhYmxlX2lycShob3N0KTsKIAotCW1tY19ob3N0X2xhenlfZGlzYWJsZShob3N0LT5tbWMpOwotCiAJb21hcF9oc21tY19wcm90ZWN0X2NhcmQoaG9zdCk7CiAKIAltbWNfYWRkX2hvc3QobW1jKTsKQEAgLTIyNTYsNiArMjA3NCw4IEBACiAJfQogCiAJb21hcF9oc21tY19kZWJ1Z2ZzKG1tYyk7CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShob3N0LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGhvc3QtPmRldik7CiAKIAlyZXR1cm4gMDsKIApAQCAtMjI3MSwxMCArMjA5MSw5IEBACiBlcnJfaXJxX2NkX2luaXQ6CiAJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKIGVycl9pcnE6Ci0JbW1jX2hvc3RfZGlzYWJsZShob3N0LT5tbWMpOwotCWNsa19kaXNhYmxlKGhvc3QtPmljbGspOworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koaG9zdC0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChob3N0LT5kZXYpOwogCWNsa19wdXQoaG9zdC0+ZmNsayk7Ci0JY2xrX3B1dChob3N0LT5pY2xrKTsKIAlpZiAoaG9zdC0+Z290X2RiY2xrKSB7CiAJCWNsa19kaXNhYmxlKGhvc3QtPmRiY2xrKTsKIAkJY2xrX3B1dChob3N0LT5kYmNsayk7CkBAIC0yMjk2LDcgKzIxMTUsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCiAJaWYgKGhvc3QpIHsKLQkJbW1jX2hvc3RfZW5hYmxlKGhvc3QtPm1tYyk7CisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoaG9zdC0+ZGV2KTsKIAkJbW1jX3JlbW92ZV9ob3N0KGhvc3QtPm1tYyk7CiAJCWlmIChob3N0LT51c2VfcmVnKQogCQkJb21hcF9oc21tY19yZWdfcHV0KGhvc3QpOwpAQCAtMjMwNywxMCArMjEyNiw5IEBACiAJCQlmcmVlX2lycShtbWNfc2xvdChob3N0KS5jYXJkX2RldGVjdF9pcnEsIGhvc3QpOwogCQlmbHVzaF93b3JrX3N5bmMoJmhvc3QtPm1tY19jYXJkZGV0ZWN0X3dvcmspOwogCi0JCW1tY19ob3N0X2Rpc2FibGUoaG9zdC0+bW1jKTsKLQkJY2xrX2Rpc2FibGUoaG9zdC0+aWNsayk7CisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoaG9zdC0+ZGV2KTsKKwkJcG1fcnVudGltZV9kaXNhYmxlKGhvc3QtPmRldik7CiAJCWNsa19wdXQoaG9zdC0+ZmNsayk7Ci0JCWNsa19wdXQoaG9zdC0+aWNsayk7CiAJCWlmIChob3N0LT5nb3RfZGJjbGspIHsKIAkJCWNsa19kaXNhYmxlKGhvc3QtPmRiY2xrKTsKIAkJCWNsa19wdXQoaG9zdC0+ZGJjbGspOwpAQCAtMjM0MCw2ICsyMTU4LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoaG9zdCkgeworCQlwbV9ydW50aW1lX2dldF9zeW5jKGhvc3QtPmRldik7CiAJCWhvc3QtPnN1c3BlbmRlZCA9IDE7CiAJCWlmIChob3N0LT5wZGF0YS0+c3VzcGVuZCkgewogCQkJcmV0ID0gaG9zdC0+cGRhdGEtPnN1c3BlbmQoJnBkZXYtPmRldiwKQEAgLTIzNTQsMTMgKzIxNzMsMTEgQEAKIAkJfQogCQljYW5jZWxfd29ya19zeW5jKCZob3N0LT5tbWNfY2FyZGRldGVjdF93b3JrKTsKIAkJcmV0ID0gbW1jX3N1c3BlbmRfaG9zdChob3N0LT5tbWMpOwotCQltbWNfaG9zdF9lbmFibGUoaG9zdC0+bW1jKTsKKwogCQlpZiAocmV0ID09IDApIHsKIAkJCW9tYXBfaHNtbWNfZGlzYWJsZV9pcnEoaG9zdCk7CiAJCQlPTUFQX0hTTU1DX1dSSVRFKGhvc3QtPmJhc2UsIEhDVEwsCiAJCQkJT01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIEhDVEwpICYgflNEQlApOwotCQkJbW1jX2hvc3RfZGlzYWJsZShob3N0LT5tbWMpOwotCQkJY2xrX2Rpc2FibGUoaG9zdC0+aWNsayk7CiAJCQlpZiAoaG9zdC0+Z290X2RiY2xrKQogCQkJCWNsa19kaXNhYmxlKGhvc3QtPmRiY2xrKTsKIAkJfSBlbHNlIHsKQEAgLTIzNzIsOSArMjE4OSw4IEBACiAJCQkJCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLAogCQkJCQkJIlVubWFzayBpbnRlcnJ1cHQgZmFpbGVkXG4iKTsKIAkJCX0KLQkJCW1tY19ob3N0X2Rpc2FibGUoaG9zdC0+bW1jKTsKIAkJfQotCisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoaG9zdC0+ZGV2KTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTIzOTAsMTQgKzIyMDYsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChob3N0KSB7Ci0JCXJldCA9IGNsa19lbmFibGUoaG9zdC0+aWNsayk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGNsa19lbl9lcnI7Ci0KLQkJaWYgKG1tY19ob3N0X2VuYWJsZShob3N0LT5tbWMpICE9IDApIHsKLQkJCWNsa19kaXNhYmxlKGhvc3QtPmljbGspOwotCQkJZ290byBjbGtfZW5fZXJyOwotCQl9CisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoaG9zdC0+ZGV2KTsKIAogCQlpZiAoaG9zdC0+Z290X2RiY2xrKQogCQkJY2xrX2VuYWJsZShob3N0LT5kYmNsayk7CkBAIC0yNDE4LDE1ICsyMjI3LDEyIEBACiAJCWlmIChyZXQgPT0gMCkKIAkJCWhvc3QtPnN1c3BlbmRlZCA9IDA7CiAKLQkJbW1jX2hvc3RfbGF6eV9kaXNhYmxlKGhvc3QtPm1tYyk7CisJCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koaG9zdC0+ZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoaG9zdC0+ZGV2KTsKIAl9CiAKIAlyZXR1cm4gcmV0OwogCi1jbGtfZW5fZXJyOgotCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLAotCQkiRmFpbGVkIHRvIGVuYWJsZSBNTUMgY2xvY2tzIGR1cmluZyByZXN1bWVcbiIpOwotCXJldHVybiByZXQ7CiB9CiAKICNlbHNlCkBAIC0yNDM0LDkgKzIyNDAsMzMgQEAKICNkZWZpbmUgb21hcF9oc21tY19yZXN1bWUJCU5VTEwKICNlbmRpZgogCitzdGF0aWMgaW50IG9tYXBfaHNtbWNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb21hcF9oc21tY19ob3N0ICpob3N0OworCisJaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKTsKKwlvbWFwX2hzbW1jX2NvbnRleHRfc2F2ZShob3N0KTsKKwlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgImRpc2FibGVkXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfaHNtbWNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBvbWFwX2hzbW1jX2hvc3QgKmhvc3Q7CisKKwlob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworCW9tYXBfaHNtbWNfY29udGV4dF9yZXN0b3JlKGhvc3QpOworCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiZW5hYmxlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIG9tYXBfaHNtbWNfZGV2X3BtX29wcyA9IHsKIAkuc3VzcGVuZAk9IG9tYXBfaHNtbWNfc3VzcGVuZCwKIAkucmVzdW1lCQk9IG9tYXBfaHNtbWNfcmVzdW1lLAorCS5ydW50aW1lX3N1c3BlbmQgPSBvbWFwX2hzbW1jX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSBvbWFwX2hzbW1jX3J1bnRpbWVfcmVzdW1lLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9oc21tY19kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWNuczN4eHguYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktY25zM3h4eC5jCmluZGV4IDllYmQxZDcuLjRiOTIwYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktY25zM3h4eC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktY25zM3h4eC5jCkBAIC0xNSw5ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9zZGhjaS1wbHRmbS5oPgogI2luY2x1ZGUgPG1hY2gvY25zM3h4eC5oPgotI2luY2x1ZGUgInNkaGNpLmgiCiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKIAogc3RhdGljIHVuc2lnbmVkIGludCBzZGhjaV9jbnMzeHh4X2dldF9tYXhfY2xrKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQpAQCAtODYsNyArODQsNyBAQAogCS5zZXRfY2xvY2sJPSBzZGhjaV9jbnMzeHh4X3NldF9jbG9jaywKIH07CiAKLXN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX2NuczN4eHhfcGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgc2RoY2lfY25zM3h4eF9wZGF0YSA9IHsKIAkub3BzID0gJnNkaGNpX2NuczN4eHhfb3BzLAogCS5xdWlya3MgPSBTREhDSV9RVUlSS19CUk9LRU5fRE1BIHwKIAkJICBTREhDSV9RVUlSS19EQVRBX1RJTUVPVVRfVVNFU19TRENMSyB8CkBAIC05NSwzICs5Myw0MyBAQAogCQkgIFNESENJX1FVSVJLX0JST0tFTl9USU1FT1VUX1ZBTCB8CiAJCSAgU0RIQ0lfUVVJUktfTk9OU1RBTkRBUkRfQ0xPQ0ssCiB9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzZGhjaV9jbnMzeHh4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHNkaGNpX3BsdGZtX3JlZ2lzdGVyKHBkZXYsICZzZGhjaV9jbnMzeHh4X3BkYXRhKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc2RoY2lfY25zM3h4eF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gc2RoY2lfcGx0Zm1fdW5yZWdpc3RlcihwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RoY2lfY25zM3h4eF9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInNkaGNpLWNuczN4eHgiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzZGhjaV9jbnMzeHh4X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2RoY2lfY25zM3h4eF9yZW1vdmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gc2RoY2lfcGx0Zm1fc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNkaGNpX3BsdGZtX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQgc2RoY2lfY25zM3h4eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2RoY2lfY25zM3h4eF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoc2RoY2lfY25zM3h4eF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHNkaGNpX2NuczN4eHhfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzZGhjaV9jbnMzeHh4X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChzZGhjaV9jbnMzeHh4X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNESENJIGRyaXZlciBmb3IgQ05TM3h4eCIpOworTU9EVUxFX0FVVEhPUigiU2NvdHQgU2h1LCAiCisJICAgICAgIkFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBtdmlzdGEuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1kb3ZlLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWRvdmUuYwppbmRleCAyYWVlZjRmLi5mMmQyOWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWRvdmUuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWRvdmUuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KIAotI2luY2x1ZGUgInNkaGNpLmgiCiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKIAogc3RhdGljIHUxNiBzZGhjaV9kb3ZlX3JlYWR3KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQpAQCAtNjEsMTAgKzYwLDUwIEBACiAJLnJlYWRfbAk9IHNkaGNpX2RvdmVfcmVhZGwsCiB9OwogCi1zdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV9kb3ZlX3BkYXRhID0geworc3RhdGljIHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX2RvdmVfcGRhdGEgPSB7CiAJLm9wcwk9ICZzZGhjaV9kb3ZlX29wcywKIAkucXVpcmtzCT0gU0RIQ0lfUVVJUktfTk9fU0lNVUxUX1ZERF9BTkRfUE9XRVIgfAogCQkgIFNESENJX1FVSVJLX05PX0JVU1lfSVJRIHwKIAkJICBTREhDSV9RVUlSS19CUk9LRU5fVElNRU9VVF9WQUwgfAogCQkgIFNESENJX1FVSVJLX0ZPUkNFX0RNQSwKIH07CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNkaGNpX2RvdmVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gc2RoY2lfcGx0Zm1fcmVnaXN0ZXIocGRldiwgJnNkaGNpX2RvdmVfcGRhdGEpOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzZGhjaV9kb3ZlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBzZGhjaV9wbHRmbV91bnJlZ2lzdGVyKHBkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZGhjaV9kb3ZlX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAic2RoY2ktZG92ZSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHNkaGNpX2RvdmVfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzZGhjaV9kb3ZlX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBzZGhjaV9wbHRmbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2RoY2lfcGx0Zm1fcmVzdW1lLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZGhjaV9kb3ZlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzZGhjaV9kb3ZlX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChzZGhjaV9kb3ZlX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc2RoY2lfZG92ZV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNkaGNpX2RvdmVfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNkaGNpX2RvdmVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU0RIQ0kgZHJpdmVyIGZvciBEb3ZlIik7CitNT0RVTEVfQVVUSE9SKCJTYWVlZCBCaXNoYXJhIDxzYWVlZEBtYXJ2ZWxsLmNvbT4sICIKKwkgICAgICAiTWlrZSBSYXBvcG9ydCA8bWlrZUBjb21wdWxhYi5jby5pbD4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCmluZGV4IGExOTk2N2QuLjcxMGI3MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYwpAQCAtMTgsMTIgKzE4LDEwIEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9zZGhjaS1wbHRmbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9tbWMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2VzZGhjLmg+Ci0jaW5jbHVkZSAic2RoY2kuaCIKICNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgogI2luY2x1ZGUgInNkaGNpLWVzZGhjLmgiCiAKQEAgLTMxLDcgKzI5LDcgQEAKICNkZWZpbmUgU0RIQ0lfVkVORE9SX1NQRUMJCTB4QzAKICNkZWZpbmUgIFNESENJX1ZFTkRPUl9TUEVDX1NESU9fUVVJUksJMHgwMDAwMDAwMgogCi0jZGVmaW5lIEVTREhDX0ZMQUdfR1BJT19GT1JfQ0RfV1AJKDEgPDwgMCkKKyNkZWZpbmUgRVNESENfRkxBR19HUElPX0ZPUl9DRAkJKDEgPDwgMCkKIC8qCiAgKiBUaGUgQ01EVFlQRSBvZiB0aGUgQ01EIHJlZ2lzdGVyIChvZmZzZXQgMHhFKSBzaG91bGQgYmUgc2V0IHRvCiAgKiAiMTEiIHdoZW4gdGhlIFNUT1AgQ01EMTIgaXMgaXNzdWVkIG9uIGlteDUzIHRvIGFib3J0IG9uZQpAQCAtNjcsMTQgKzY1LDE0IEBACiAJdTMyIHZhbCA9IHJlYWRsKGhvc3QtPmlvYWRkciArIHJlZyk7CiAKIAlpZiAodW5saWtlbHkoKHJlZyA9PSBTREhDSV9QUkVTRU5UX1NUQVRFKQotCQkJJiYgKGlteF9kYXRhLT5mbGFncyAmIEVTREhDX0ZMQUdfR1BJT19GT1JfQ0RfV1ApKSkgeworCQkJJiYgKGlteF9kYXRhLT5mbGFncyAmIEVTREhDX0ZMQUdfR1BJT19GT1JfQ0QpKSkgewogCQlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhID0KIAkJCQlob3N0LT5tbWMtPnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKIAogCQlpZiAoYm9hcmRkYXRhICYmIGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT5jZF9ncGlvKQogCQkJCSYmIGdwaW9fZ2V0X3ZhbHVlKGJvYXJkZGF0YS0+Y2RfZ3BpbykpCiAJCQkvKiBubyBjYXJkLCBpZiBhIHZhbGlkIGdwaW8gc2F5cyBzby4uLiAqLwotCQkJdmFsICY9IFNESENJX0NBUkRfUFJFU0VOVDsKKwkJCXZhbCAmPSB+U0RIQ0lfQ0FSRF9QUkVTRU5UOwogCQllbHNlCiAJCQkvKiAuLi4gaW4gYWxsIG90aGVyIGNhc2VzIGFzc3VtZSBjYXJkIGlzIHByZXNlbnQgKi8KIAkJCXZhbCB8PSBTREhDSV9DQVJEX1BSRVNFTlQ7CkBAIC04OSw3ICs4Nyw3IEBACiAJc3RydWN0IHBsdGZtX2lteF9kYXRhICppbXhfZGF0YSA9IHBsdGZtX2hvc3QtPnByaXY7CiAKIAlpZiAodW5saWtlbHkoKHJlZyA9PSBTREhDSV9JTlRfRU5BQkxFIHx8IHJlZyA9PSBTREhDSV9TSUdOQUxfRU5BQkxFKQotCQkJJiYgKGlteF9kYXRhLT5mbGFncyAmIEVTREhDX0ZMQUdfR1BJT19GT1JfQ0RfV1ApKSkKKwkJCSYmIChpbXhfZGF0YS0+ZmxhZ3MgJiBFU0RIQ19GTEFHX0dQSU9fRk9SX0NEKSkpCiAJCS8qCiAJCSAqIHRoZXNlIGludGVycnVwdHMgd29uJ3Qgd29yayB3aXRoIGEgY3VzdG9tIGNhcmRfZGV0ZWN0IGdwaW8KIAkJICogKG9ubHkgYXBwbGllZCB0byBteDI1LzM1KQpAQCAtMTkxLDE2ICsxODksNiBAQAogCXJldHVybiBjbGtfZ2V0X3JhdGUocGx0Zm1faG9zdC0+Y2xrKSAvIDI1NiAvIDE2OwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGVzZGhjX3BsdGZtX2dldF9ybyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKLXsKLQlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhID0gaG9zdC0+bW1jLT5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7Ci0KLQlpZiAoYm9hcmRkYXRhICYmIGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT53cF9ncGlvKSkKLQkJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKGJvYXJkZGF0YS0+d3BfZ3Bpbyk7Ci0JZWxzZQotCQlyZXR1cm4gLUVOT1NZUzsKLX0KLQogc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfZXNkaGNfb3BzID0gewogCS5yZWFkX2wgPSBlc2RoY19yZWFkbF9sZSwKIAkucmVhZF93ID0gZXNkaGNfcmVhZHdfbGUsCkBAIC0yMTIsNiArMjAwLDI0IEBACiAJLmdldF9taW5fY2xvY2sgPSBlc2RoY19wbHRmbV9nZXRfbWluX2Nsb2NrLAogfTsKIAorc3RhdGljIHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX2VzZGhjX2lteF9wZGF0YSA9IHsKKwkucXVpcmtzID0gRVNESENfREVGQVVMVF9RVUlSS1MgfCBTREhDSV9RVUlSS19CUk9LRU5fQURNQQorCQkJfCBTREhDSV9RVUlSS19CUk9LRU5fQ0FSRF9ERVRFQ1RJT04sCisJLyogQURNQSBoYXMgaXNzdWVzLiBNaWdodCBiZSBmaXhhYmxlICovCisJLm9wcyA9ICZzZGhjaV9lc2RoY19vcHMsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGVzZGhjX3BsdGZtX2dldF9ybyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhID0KKwkJCWhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOworCisJaWYgKGJvYXJkZGF0YSAmJiBncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+d3BfZ3BpbykpCisJCXJldHVybiBncGlvX2dldF92YWx1ZShib2FyZGRhdGEtPndwX2dwaW8pOworCWVsc2UKKwkJcmV0dXJuIC1FTk9TWVM7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBjZF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqc2Rob3N0ID0gKHN0cnVjdCBzZGhjaV9ob3N0ICopZGF0YTsKQEAgLTIyMCwzMCArMjI2LDM1IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfTsKIAotc3RhdGljIGludCBlc2RoY19wbHRmbV9pbml0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSAqcGRhdGEpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzZGhjaV9lc2RoY19pbXhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7Ci0Jc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKmJvYXJkZGF0YSA9IGhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0OworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OworCXN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGE7CiAJc3RydWN0IGNsayAqY2xrOwogCWludCBlcnI7CiAJc3RydWN0IHBsdGZtX2lteF9kYXRhICppbXhfZGF0YTsKIAorCWhvc3QgPSBzZGhjaV9wbHRmbV9pbml0KHBkZXYsICZzZGhjaV9lc2RoY19pbXhfcGRhdGEpOworCWlmIChJU19FUlIoaG9zdCkpCisJCXJldHVybiBQVFJfRVJSKGhvc3QpOworCisJcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisKKwlpbXhfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbHRmbV9pbXhfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghaW14X2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCXBsdGZtX2hvc3QtPnByaXYgPSBpbXhfZGF0YTsKKwogCWNsayA9IGNsa19nZXQobW1jX2Rldihob3N0LT5tbWMpLCBOVUxMKTsKIAlpZiAoSVNfRVJSKGNsaykpIHsKIAkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJjbGsgZXJyXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwkJZXJyID0gUFRSX0VSUihjbGspOworCQlnb3RvIGVycl9jbGtfZ2V0OwogCX0KIAljbGtfZW5hYmxlKGNsayk7CiAJcGx0Zm1faG9zdC0+Y2xrID0gY2xrOwogCi0JaW14X2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGx0Zm1faW14X2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlteF9kYXRhKSB7Ci0JCWNsa19kaXNhYmxlKHBsdGZtX2hvc3QtPmNsayk7Ci0JCWNsa19wdXQocGx0Zm1faG9zdC0+Y2xrKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXBsdGZtX2hvc3QtPnByaXYgPSBpbXhfZGF0YTsKLQogCWlmICghY3B1X2lzX214MjUoKSkKIAkJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX0JST0tFTl9USU1FT1VUX1ZBTDsKIApAQCAtMjU3LDYgKzI2OCw3IEBACiAJaWYgKCEoY3B1X2lzX214MjUoKSB8fCBjcHVfaXNfbXgzNSgpIHx8IGNwdV9pc19teDUxKCkpKQogCQlpbXhfZGF0YS0+ZmxhZ3MgfD0gRVNESENfRkxBR19NVUxUSUJMS19OT19JTlQ7CiAKKwlib2FyZGRhdGEgPSBob3N0LT5tbWMtPnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKIAlpZiAoYm9hcmRkYXRhKSB7CiAJCWVyciA9IGdwaW9fcmVxdWVzdF9vbmUoYm9hcmRkYXRhLT53cF9ncGlvLCBHUElPRl9JTiwgIkVTREhDX1dQIik7CiAJCWlmIChlcnIpIHsKQEAgLTI4NCwxMSArMjk2LDE1IEBACiAJCQlnb3RvIG5vX2NhcmRfZGV0ZWN0X2lycTsKIAkJfQogCi0JCWlteF9kYXRhLT5mbGFncyB8PSBFU0RIQ19GTEFHX0dQSU9fRk9SX0NEX1dQOworCQlpbXhfZGF0YS0+ZmxhZ3MgfD0gRVNESENfRkxBR19HUElPX0ZPUl9DRDsKIAkJLyogTm93IHdlIGhhdmUgYSB3b3JraW5nIGNhcmRfZGV0ZWN0IGFnYWluICovCiAJCWhvc3QtPnF1aXJrcyAmPSB+U0RIQ0lfUVVJUktfQlJPS0VOX0NBUkRfREVURUNUSU9OOwogCX0KIAorCWVyciA9IHNkaGNpX2FkZF9ob3N0KGhvc3QpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2FkZF9ob3N0OworCiAJcmV0dXJuIDA7CiAKICBub19jYXJkX2RldGVjdF9pcnE6CkBAIC0yOTcsMTQgKzMxMywyMyBAQAogCWJvYXJkZGF0YS0+Y2RfZ3BpbyA9IGVycjsKICBub3Rfc3VwcG9ydGVkOgogCWtmcmVlKGlteF9kYXRhKTsKLQlyZXR1cm4gMDsKKyBlcnJfYWRkX2hvc3Q6CisJY2xrX2Rpc2FibGUocGx0Zm1faG9zdC0+Y2xrKTsKKwljbGtfcHV0KHBsdGZtX2hvc3QtPmNsayk7CisgZXJyX2Nsa19nZXQ6CisJc2RoY2lfcGx0Zm1fZnJlZShwZGV2KTsKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBlc2RoY19wbHRmbV9leGl0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQorc3RhdGljIGludCBfX2RldmV4aXQgc2RoY2lfZXNkaGNfaW14X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwogCXN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGEgPSBob3N0LT5tbWMtPnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgKmlteF9kYXRhID0gcGx0Zm1faG9zdC0+cHJpdjsKKwlpbnQgZGVhZCA9IChyZWFkbChob3N0LT5pb2FkZHIgKyBTREhDSV9JTlRfU1RBVFVTKSA9PSAweGZmZmZmZmZmKTsKKworCXNkaGNpX3JlbW92ZV9ob3N0KGhvc3QsIGRlYWQpOwogCiAJaWYgKGJvYXJkZGF0YSAmJiBncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+d3BfZ3BpbykpCiAJCWdwaW9fZnJlZShib2FyZGRhdGEtPndwX2dwaW8pOwpAQCAtMzE5LDEzICszNDQsMzcgQEAKIAljbGtfZGlzYWJsZShwbHRmbV9ob3N0LT5jbGspOwogCWNsa19wdXQocGx0Zm1faG9zdC0+Y2xrKTsKIAlrZnJlZShpbXhfZGF0YSk7CisKKwlzZGhjaV9wbHRmbV9mcmVlKHBkZXYpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX2VzZGhjX2lteF9wZGF0YSA9IHsKLQkucXVpcmtzID0gRVNESENfREVGQVVMVF9RVUlSS1MgfCBTREhDSV9RVUlSS19CUk9LRU5fQURNQQotCQkJfCBTREhDSV9RVUlSS19CUk9LRU5fQ0FSRF9ERVRFQ1RJT04sCi0JLyogQURNQSBoYXMgaXNzdWVzLiBNaWdodCBiZSBmaXhhYmxlICovCi0JLm9wcyA9ICZzZGhjaV9lc2RoY19vcHMsCi0JLmluaXQgPSBlc2RoY19wbHRmbV9pbml0LAotCS5leGl0ID0gZXNkaGNfcGx0Zm1fZXhpdCwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNkaGNpX2VzZGhjX2lteF9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInNkaGNpLWVzZGhjLWlteCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHNkaGNpX2VzZGhjX2lteF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNkaGNpX2VzZGhjX2lteF9yZW1vdmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gc2RoY2lfcGx0Zm1fc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNkaGNpX3BsdGZtX3Jlc3VtZSwKKyNlbmRpZgogfTsKKworc3RhdGljIGludCBfX2luaXQgc2RoY2lfZXNkaGNfaW14X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzZGhjaV9lc2RoY19pbXhfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHNkaGNpX2VzZGhjX2lteF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHNkaGNpX2VzZGhjX2lteF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNkaGNpX2VzZGhjX2lteF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoc2RoY2lfZXNkaGNfaW14X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNESENJIGRyaXZlciBmb3IgRnJlZXNjYWxlIGkuTVggZVNESEMiKTsKK01PRFVMRV9BVVRIT1IoIldvbGZyYW0gU2FuZyA8dy5zYW5nQHBlbmd1dHJvbml4LmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1jb3JlLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlNDE4Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKgotICogT3BlbkZpcm13YXJlIGJpbmRpbmdzIGZvciBTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgotICogQ29weXJpZ2h0IChjKSAyMDA5IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBBdXRob3JzOiBYaWFvYm8gWGllIDxYLlhpZUBmcmVlc2NhbGUuY29tPgotICoJICAgIEFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2lmZGVmIENPTkZJR19QUEMKLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2VuZGlmCi0jaW5jbHVkZSAic2RoY2ktb2YuaCIKLSNpbmNsdWRlICJzZGhjaS5oIgotCi0jaWZkZWYgQ09ORklHX01NQ19TREhDSV9CSUdfRU5ESUFOXzMyQklUX0JZVEVfU1dBUFBFUgotCi0vKgotICogVGhlc2UgYWNjZXNzb3JzIGFyZSBkZXNpZ25lZCBmb3IgYmlnIGVuZGlhbiBob3N0cyBkb2luZyBJL08gdG8KLSAqIGxpdHRsZSBlbmRpYW4gY29udHJvbGxlcnMgaW5jb3Jwb3JhdGluZyBhIDMyLWJpdCBoYXJkd2FyZSBieXRlIHN3YXBwZXIuCi0gKi8KLQotdTMyIHNkaGNpX2JlMzJic19yZWFkbChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgaW50IHJlZykKLXsKLQlyZXR1cm4gaW5fYmUzMihob3N0LT5pb2FkZHIgKyByZWcpOwotfQotCi11MTYgc2RoY2lfYmUzMmJzX3JlYWR3KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQotewotCXJldHVybiBpbl9iZTE2KGhvc3QtPmlvYWRkciArIChyZWcgXiAweDIpKTsKLX0KLQotdTggc2RoY2lfYmUzMmJzX3JlYWRiKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQotewotCXJldHVybiBpbl84KGhvc3QtPmlvYWRkciArIChyZWcgXiAweDMpKTsKLX0KLQotdm9pZCBzZGhjaV9iZTMyYnNfd3JpdGVsKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1MzIgdmFsLCBpbnQgcmVnKQotewotCW91dF9iZTMyKGhvc3QtPmlvYWRkciArIHJlZywgdmFsKTsKLX0KLQotdm9pZCBzZGhjaV9iZTMyYnNfd3JpdGV3KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1MTYgdmFsLCBpbnQgcmVnKQotewotCXN0cnVjdCBzZGhjaV9vZl9ob3N0ICpvZl9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKLQlpbnQgYmFzZSA9IHJlZyAmIH4weDM7Ci0JaW50IHNoaWZ0ID0gKHJlZyAmIDB4MikgKiA4OwotCi0Jc3dpdGNoIChyZWcpIHsKLQljYXNlIFNESENJX1RSQU5TRkVSX01PREU6Ci0JCS8qCi0JCSAqIFBvc3Rwb25lIHRoaXMgd3JpdGUsIHdlIG11c3QgZG8gaXQgdG9nZXRoZXIgd2l0aCBhCi0JCSAqIGNvbW1hbmQgd3JpdGUgdGhhdCBpcyBkb3duIGJlbG93LgotCQkgKi8KLQkJb2ZfaG9zdC0+eGZlcl9tb2RlX3NoYWRvdyA9IHZhbDsKLQkJcmV0dXJuOwotCWNhc2UgU0RIQ0lfQ09NTUFORDoKLQkJc2RoY2lfYmUzMmJzX3dyaXRlbChob3N0LCB2YWwgPDwgMTYgfCBvZl9ob3N0LT54ZmVyX21vZGVfc2hhZG93LAotCQkJCSAgICBTREhDSV9UUkFOU0ZFUl9NT0RFKTsKLQkJcmV0dXJuOwotCX0KLQljbHJzZXRiaXRzX2JlMzIoaG9zdC0+aW9hZGRyICsgYmFzZSwgMHhmZmZmIDw8IHNoaWZ0LCB2YWwgPDwgc2hpZnQpOwotfQotCi12b2lkIHNkaGNpX2JlMzJic193cml0ZWIoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHU4IHZhbCwgaW50IHJlZykKLXsKLQlpbnQgYmFzZSA9IHJlZyAmIH4weDM7Ci0JaW50IHNoaWZ0ID0gKHJlZyAmIDB4MykgKiA4OwotCi0JY2xyc2V0Yml0c19iZTMyKGhvc3QtPmlvYWRkciArIGJhc2UgLCAweGZmIDw8IHNoaWZ0LCB2YWwgPDwgc2hpZnQpOwotfQotI2VuZGlmIC8qIENPTkZJR19NTUNfU0RIQ0lfQklHX0VORElBTl8zMkJJVF9CWVRFX1NXQVBQRVIgKi8KLQotI2lmZGVmIENPTkZJR19QTQotCi1zdGF0aWMgaW50IHNkaGNpX29mX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldik7Ci0KLQlyZXR1cm4gbW1jX3N1c3BlbmRfaG9zdChob3N0LT5tbWMpOwotfQotCi1zdGF0aWMgaW50IHNkaGNpX29mX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKLXsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldik7Ci0KLQlyZXR1cm4gbW1jX3Jlc3VtZV9ob3N0KGhvc3QtPm1tYyk7Ci19Ci0KLSNlbHNlCi0KLSNkZWZpbmUgc2RoY2lfb2Zfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIHNkaGNpX29mX3Jlc3VtZSBOVUxMCi0KLSNlbmRpZgotCi1zdGF0aWMgYm9vbCBfX2RldmluaXQgc2RoY2lfb2Zfd3BfaW52ZXJ0ZWQoc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAic2RoY2ksd3AtaW52ZXJ0ZWQiLCBOVUxMKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQkvKiBPbGQgZGV2aWNlIHRyZWVzIGRvbid0IGhhdmUgdGhlIHdwLWludmVydGVkIHByb3BlcnR5LiAqLwotI2lmZGVmIENPTkZJR19QUEMKLQlyZXR1cm4gbWFjaGluZV9pcyhtcGM4Mzd4X3JkYikgfHwgbWFjaGluZV9pcyhtcGM4Mzd4X21kcyk7Ci0jZWxzZQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzZGhjaV9vZl9tYXRjaFtdOwotc3RhdGljIGludCBfX2RldmluaXQgc2RoY2lfb2ZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCi17Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5kZXYub2Zfbm9kZTsKLQlzdHJ1Y3Qgc2RoY2lfb2ZfZGF0YSAqc2RoY2lfb2ZfZGF0YTsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKLQlzdHJ1Y3Qgc2RoY2lfb2ZfaG9zdCAqb2ZfaG9zdDsKLQljb25zdCBfX2JlMzIgKmNsazsKLQlpbnQgc2l6ZTsKLQlpbnQgcmV0OwotCi0JbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uoc2RoY2lfb2ZfbWF0Y2gsICZvZmRldi0+ZGV2KTsKLQlpZiAoIW1hdGNoKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlzZGhjaV9vZl9kYXRhID0gbWF0Y2gtPmRhdGE7Ci0KLQlpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUobnApKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWhvc3QgPSBzZGhjaV9hbGxvY19ob3N0KCZvZmRldi0+ZGV2LCBzaXplb2YoKm9mX2hvc3QpKTsKLQlpZiAoSVNfRVJSKGhvc3QpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW9mX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwotCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgaG9zdCk7Ci0KLQlob3N0LT5pb2FkZHIgPSBvZl9pb21hcChucCwgMCk7Ci0JaWYgKCFob3N0LT5pb2FkZHIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYWRkcl9tYXA7Ci0JfQotCi0JaG9zdC0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCWlmICghaG9zdC0+aXJxKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX25vX2lycTsKLQl9Ci0KLQlob3N0LT5od19uYW1lID0gZGV2X25hbWUoJm9mZGV2LT5kZXYpOwotCWlmIChzZGhjaV9vZl9kYXRhKSB7Ci0JCWhvc3QtPnF1aXJrcyA9IHNkaGNpX29mX2RhdGEtPnF1aXJrczsKLQkJaG9zdC0+b3BzID0gJnNkaGNpX29mX2RhdGEtPm9wczsKLQl9Ci0KLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAic2RoY2ksYXV0by1jbWQxMiIsIE5VTEwpKQotCQlob3N0LT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfTVVMVElCTE9DS19SRUFEX0FDTUQxMjsKLQotCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInNkaGNpLDEtYml0LW9ubHkiLCBOVUxMKSkKLQkJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX0ZPUkNFXzFfQklUX0RBVEE7Ci0KLQlpZiAoc2RoY2lfb2Zfd3BfaW52ZXJ0ZWQobnApKQotCQlob3N0LT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfSU5WRVJURURfV1JJVEVfUFJPVEVDVDsKLQotCWNsayA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsICZzaXplKTsKLQlpZiAoY2xrICYmIHNpemUgPT0gc2l6ZW9mKCpjbGspICYmICpjbGspCi0JCW9mX2hvc3QtPmNsb2NrID0gYmUzMl90b19jcHVwKGNsayk7Ci0KLQlyZXQgPSBzZGhjaV9hZGRfaG9zdChob3N0KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9hZGRfaG9zdDsKLQotCXJldHVybiAwOwotCi1lcnJfYWRkX2hvc3Q6Ci0JaXJxX2Rpc3Bvc2VfbWFwcGluZyhob3N0LT5pcnEpOwotZXJyX25vX2lycToKLQlpb3VubWFwKGhvc3QtPmlvYWRkcik7Ci1lcnJfYWRkcl9tYXA6Ci0Jc2RoY2lfZnJlZV9ob3N0KGhvc3QpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IHNkaGNpX29mX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKLXsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldik7Ci0KLQlzZGhjaV9yZW1vdmVfaG9zdChob3N0LCAwKTsKLQlzZGhjaV9mcmVlX2hvc3QoaG9zdCk7Ci0JaXJxX2Rpc3Bvc2VfbWFwcGluZyhob3N0LT5pcnEpOwotCWlvdW5tYXAoaG9zdC0+aW9hZGRyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2RoY2lfb2ZfbWF0Y2hbXSA9IHsKLSNpZmRlZiBDT05GSUdfTU1DX1NESENJX09GX0VTREhDCi0JeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODM3OS1lc2RoYyIsIC5kYXRhID0gJnNkaGNpX2VzZGhjLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtZXNkaGMiLCAuZGF0YSA9ICZzZGhjaV9lc2RoYywgfSwKLQl7IC5jb21wYXRpYmxlID0gImZzbCxlc2RoYyIsIC5kYXRhID0gJnNkaGNpX2VzZGhjLCB9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01NQ19TREhDSV9PRl9ITFdECi0JeyAuY29tcGF0aWJsZSA9ICJuaW50ZW5kbyxob2xseXdvb2Qtc2RoY2kiLCAuZGF0YSA9ICZzZGhjaV9obHdkLCB9LAotI2VuZGlmCi0JeyAuY29tcGF0aWJsZSA9ICJnZW5lcmljLXNkaGNpIiwgfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzZGhjaV9vZl9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNkaGNpX29mX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJzZGhjaS1vZiIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBzZGhjaV9vZl9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IHNkaGNpX29mX3Byb2JlLAotCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzZGhjaV9vZl9yZW1vdmUpLAotCS5zdXNwZW5kID0gc2RoY2lfb2Zfc3VzcGVuZCwKLQkucmVzdW1lCT0gc2RoY2lfb2ZfcmVzdW1lLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgc2RoY2lfb2ZfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNkaGNpX29mX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChzZGhjaV9vZl9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHNkaGNpX29mX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2RoY2lfb2ZfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHNkaGNpX29mX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNlY3VyZSBEaWdpdGFsIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgT0YgZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJYaWFvYm8gWGllIDxYLlhpZUBmcmVlc2NhbGUuY29tPiwgIgotCSAgICAgICJBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAcnUubXZpc3RhLmNvbT4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYwppbmRleCBiYTQwZDZkLi5mZTYwNGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWVzZGhjLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1lc2RoYy5jCkBAIC0xNiw4ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0jaW5jbHVkZSAic2RoY2ktb2YuaCIKLSNpbmNsdWRlICJzZGhjaS5oIgorI2luY2x1ZGUgInNkaGNpLXBsdGZtLmgiCiAjaW5jbHVkZSAic2RoY2ktZXNkaGMuaCIKIAogc3RhdGljIHUxNiBlc2RoY19yZWFkdyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgaW50IHJlZykKQEAgLTYwLDMyICs1OSw4MyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGVzZGhjX29mX2dldF9tYXhfY2xvY2soc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCiB7Ci0Jc3RydWN0IHNkaGNpX29mX2hvc3QgKm9mX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKIAotCXJldHVybiBvZl9ob3N0LT5jbG9jazsKKwlyZXR1cm4gcGx0Zm1faG9zdC0+Y2xvY2s7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZXNkaGNfb2ZfZ2V0X21pbl9jbG9jayhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKIHsKLQlzdHJ1Y3Qgc2RoY2lfb2ZfaG9zdCAqb2ZfaG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwogCi0JcmV0dXJuIG9mX2hvc3QtPmNsb2NrIC8gMjU2IC8gMTY7CisJcmV0dXJuIHBsdGZtX2hvc3QtPmNsb2NrIC8gMjU2IC8gMTY7CiB9CiAKLXN0cnVjdCBzZGhjaV9vZl9kYXRhIHNkaGNpX2VzZGhjID0geworc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfZXNkaGNfb3BzID0geworCS5yZWFkX2wgPSBzZGhjaV9iZTMyYnNfcmVhZGwsCisJLnJlYWRfdyA9IGVzZGhjX3JlYWR3LAorCS5yZWFkX2IgPSBzZGhjaV9iZTMyYnNfcmVhZGIsCisJLndyaXRlX2wgPSBzZGhjaV9iZTMyYnNfd3JpdGVsLAorCS53cml0ZV93ID0gZXNkaGNfd3JpdGV3LAorCS53cml0ZV9iID0gZXNkaGNfd3JpdGViLAorCS5zZXRfY2xvY2sgPSBlc2RoY19zZXRfY2xvY2ssCisJLmVuYWJsZV9kbWEgPSBlc2RoY19vZl9lbmFibGVfZG1hLAorCS5nZXRfbWF4X2Nsb2NrID0gZXNkaGNfb2ZfZ2V0X21heF9jbG9jaywKKwkuZ2V0X21pbl9jbG9jayA9IGVzZGhjX29mX2dldF9taW5fY2xvY2ssCit9OworCitzdGF0aWMgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgc2RoY2lfZXNkaGNfcGRhdGEgPSB7CiAJLyogY2FyZCBkZXRlY3Rpb24gY291bGQgYmUgaGFuZGxlZCB2aWEgR1BJTyAqLwogCS5xdWlya3MgPSBFU0RIQ19ERUZBVUxUX1FVSVJLUyB8IFNESENJX1FVSVJLX0JST0tFTl9DQVJEX0RFVEVDVElPTgogCQl8IFNESENJX1FVSVJLX05PX0NBUkRfTk9fUkVTRVQsCi0JLm9wcyA9IHsKLQkJLnJlYWRfbCA9IHNkaGNpX2JlMzJic19yZWFkbCwKLQkJLnJlYWRfdyA9IGVzZGhjX3JlYWR3LAotCQkucmVhZF9iID0gc2RoY2lfYmUzMmJzX3JlYWRiLAotCQkud3JpdGVfbCA9IHNkaGNpX2JlMzJic193cml0ZWwsCi0JCS53cml0ZV93ID0gZXNkaGNfd3JpdGV3LAotCQkud3JpdGVfYiA9IGVzZGhjX3dyaXRlYiwKLQkJLnNldF9jbG9jayA9IGVzZGhjX3NldF9jbG9jaywKLQkJLmVuYWJsZV9kbWEgPSBlc2RoY19vZl9lbmFibGVfZG1hLAotCQkuZ2V0X21heF9jbG9jayA9IGVzZGhjX29mX2dldF9tYXhfY2xvY2ssCi0JCS5nZXRfbWluX2Nsb2NrID0gZXNkaGNfb2ZfZ2V0X21pbl9jbG9jaywKLQl9LAorCS5vcHMgPSAmc2RoY2lfZXNkaGNfb3BzLAogfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc2RoY2lfZXNkaGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gc2RoY2lfcGx0Zm1fcmVnaXN0ZXIocGRldiwgJnNkaGNpX2VzZGhjX3BkYXRhKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc2RoY2lfZXNkaGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHNkaGNpX3BsdGZtX3VucmVnaXN0ZXIocGRldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNkaGNpX2VzZGhjX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODM3OS1lc2RoYyIgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWVzZGhjIiB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGVzZGhjIiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNkaGNpX2VzZGhjX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RoY2lfZXNkaGNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInNkaGNpLWVzZGhjIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHNkaGNpX2VzZGhjX29mX21hdGNoLAorCX0sCisJLnByb2JlID0gc2RoY2lfZXNkaGNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNkaGNpX2VzZGhjX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBzZGhjaV9wbHRmbV9zdXNwZW5kLAorCS5yZXN1bWUgPSBzZGhjaV9wbHRmbV9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNkaGNpX2VzZGhjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzZGhjaV9lc2RoY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoc2RoY2lfZXNkaGNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZGhjaV9lc2RoY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNkaGNpX2VzZGhjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChzZGhjaV9lc2RoY19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTREhDSSBPRiBkcml2ZXIgZm9yIEZyZWVzY2FsZSBNUEMgZVNESEMiKTsKK01PRFVMRV9BVVRIT1IoIlhpYW9ibyBYaWUgPFguWGllQGZyZWVzY2FsZS5jb20+LCAiCisJICAgICAgIkFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1obHdkLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWhsd2QuYwppbmRleCA2OGRkYjc1Li43MzViZTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWhsd2QuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWhsd2QuYwpAQCAtMjEsOCArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgInNkaGNpLW9mLmgiCi0jaW5jbHVkZSAic2RoY2kuaCIKKyNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgogCiAvKgogICogT3BzIGFuZCBxdWlya3MgZm9yIHRoZSBOaW50ZW5kbyBXaWkgU0RIQ0kgY29udHJvbGxlcnMuCkBAIC01MSwxNSArNTAsNjMgQEAKIAl1ZGVsYXkoU0RIQ0lfSExXRF9XUklURV9ERUxBWSk7CiB9CiAKLXN0cnVjdCBzZGhjaV9vZl9kYXRhIHNkaGNpX2hsd2QgPSB7CitzdGF0aWMgc3RydWN0IHNkaGNpX29wcyBzZGhjaV9obHdkX29wcyA9IHsKKwkucmVhZF9sID0gc2RoY2lfYmUzMmJzX3JlYWRsLAorCS5yZWFkX3cgPSBzZGhjaV9iZTMyYnNfcmVhZHcsCisJLnJlYWRfYiA9IHNkaGNpX2JlMzJic19yZWFkYiwKKwkud3JpdGVfbCA9IHNkaGNpX2hsd2Rfd3JpdGVsLAorCS53cml0ZV93ID0gc2RoY2lfaGx3ZF93cml0ZXcsCisJLndyaXRlX2IgPSBzZGhjaV9obHdkX3dyaXRlYiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV9obHdkX3BkYXRhID0gewogCS5xdWlya3MgPSBTREhDSV9RVUlSS18zMkJJVF9ETUFfQUREUiB8CiAJCSAgU0RIQ0lfUVVJUktfMzJCSVRfRE1BX1NJWkUsCi0JLm9wcyA9IHsKLQkJLnJlYWRfbCA9IHNkaGNpX2JlMzJic19yZWFkbCwKLQkJLnJlYWRfdyA9IHNkaGNpX2JlMzJic19yZWFkdywKLQkJLnJlYWRfYiA9IHNkaGNpX2JlMzJic19yZWFkYiwKLQkJLndyaXRlX2wgPSBzZGhjaV9obHdkX3dyaXRlbCwKLQkJLndyaXRlX3cgPSBzZGhjaV9obHdkX3dyaXRldywKLQkJLndyaXRlX2IgPSBzZGhjaV9obHdkX3dyaXRlYiwKLQl9LAorCS5vcHMgPSAmc2RoY2lfaGx3ZF9vcHMsCiB9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzZGhjaV9obHdkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHNkaGNpX3BsdGZtX3JlZ2lzdGVyKHBkZXYsICZzZGhjaV9obHdkX3BkYXRhKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc2RoY2lfaGx3ZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gc2RoY2lfcGx0Zm1fdW5yZWdpc3RlcihwZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2RoY2lfaGx3ZF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibmludGVuZG8saG9sbHl3b29kLXNkaGNpIiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNkaGNpX2hsd2Rfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZGhjaV9obHdkX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzZGhjaS1obHdkIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHNkaGNpX2hsd2Rfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBzZGhjaV9obHdkX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzZGhjaV9obHdkX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBzZGhjaV9wbHRmbV9zdXNwZW5kLAorCS5yZXN1bWUgPSBzZGhjaV9wbHRmbV9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNkaGNpX2hsd2RfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNkaGNpX2hsd2RfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHNkaGNpX2hsd2RfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZGhjaV9obHdkX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2RoY2lfaGx3ZF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoc2RoY2lfaGx3ZF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJOaW50ZW5kbyBXaWkgU0RIQ0kgT0YgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJUaGUgR2FtZUN1YmUgTGludXggVGVhbSwgQWxiZXJ0IEhlcnJhbnoiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YuaCBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwOWFkOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogT3BlbkZpcm13YXJlIGJpbmRpbmdzIGZvciBTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgotICogQ29weXJpZ2h0IChjKSAyMDA5IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBBdXRob3JzOiBYaWFvYm8gWGllIDxYLlhpZUBmcmVlc2NhbGUuY29tPgotICoJICAgIEFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfX1NESENJX09GX0gKLSNkZWZpbmUgX19TREhDSV9PRl9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgInNkaGNpLmgiCi0KLXN0cnVjdCBzZGhjaV9vZl9kYXRhIHsKLQl1bnNpZ25lZCBpbnQgcXVpcmtzOwotCXN0cnVjdCBzZGhjaV9vcHMgb3BzOwotfTsKLQotc3RydWN0IHNkaGNpX29mX2hvc3QgewotCXVuc2lnbmVkIGludCBjbG9jazsKLQl1MTYgeGZlcl9tb2RlX3NoYWRvdzsKLX07Ci0KLWV4dGVybiB1MzIgc2RoY2lfYmUzMmJzX3JlYWRsKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKTsKLWV4dGVybiB1MTYgc2RoY2lfYmUzMmJzX3JlYWR3KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKTsKLWV4dGVybiB1OCBzZGhjaV9iZTMyYnNfcmVhZGIoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCByZWcpOwotZXh0ZXJuIHZvaWQgc2RoY2lfYmUzMmJzX3dyaXRlbChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdTMyIHZhbCwgaW50IHJlZyk7Ci1leHRlcm4gdm9pZCBzZGhjaV9iZTMyYnNfd3JpdGV3KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1MTYgdmFsLCBpbnQgcmVnKTsKLWV4dGVybiB2b2lkIHNkaGNpX2JlMzJic193cml0ZWIoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHU4IHZhbCwgaW50IHJlZyk7Ci0KLWV4dGVybiBzdHJ1Y3Qgc2RoY2lfb2ZfZGF0YSBzZGhjaV9lc2RoYzsKLWV4dGVybiBzdHJ1Y3Qgc2RoY2lfb2ZfZGF0YSBzZGhjaV9obHdkOwotCi0jZW5kaWYgLyogX19TREhDSV9PRl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuYwppbmRleCA5MzZiYmNhLi4yNmM1Mjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmMKQEAgLTE0Myw2ICsxNDMsMTIgQEAKIAkJCSAgU0RIQ0lfUVVJUktfQlJPS0VOX1RJTUVPVVRfVkFMLAogfTsKIAorc3RhdGljIGludCBtcnN0X2hjX3Byb2JlX3Nsb3Qoc3RydWN0IHNkaGNpX3BjaV9zbG90ICpzbG90KQoreworCXNsb3QtPmhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQXzhfQklUX0RBVEE7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBBRE1BIG9wZXJhdGlvbiBpcyBkaXNhYmxlZCBmb3IgTW9vcmVzdG93biBwbGF0Zm9ybSBkdWUgdG8KICAqIGhhcmR3YXJlIGJ1Z3MuCkBAIC0xNTcsOCArMTYzLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbWZkX2VtbWNfcHJvYmVfc2xvdChzdHJ1Y3Qgc2RoY2lfcGNpX3Nsb3QgKnNsb3QpCit7CisJc2xvdC0+aG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfOF9CSVRfREFUQTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV9wY2lfZml4ZXMgc2RoY2lfaW50ZWxfbXJzdF9oYzAgPSB7CiAJLnF1aXJrcwkJPSBTREhDSV9RVUlSS19CUk9LRU5fQURNQSB8IFNESENJX1FVSVJLX05PX0hJU1BEX0JJVCwKKwkucHJvYmVfc2xvdAk9IG1yc3RfaGNfcHJvYmVfc2xvdCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RoY2lfcGNpX2ZpeGVzIHNkaGNpX2ludGVsX21yc3RfaGMxX2hjMiA9IHsKQEAgLTE3MCwxMCArMTgzLDE1IEBACiAJLnF1aXJrcwkJPSBTREhDSV9RVUlSS19OT19FTkRBVFRSX0lOX05PUERFU0MsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BjaV9maXhlcyBzZGhjaV9pbnRlbF9tZmRfZW1tY19zZGlvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV9wY2lfZml4ZXMgc2RoY2lfaW50ZWxfbWZkX3NkaW8gPSB7CiAJLnF1aXJrcwkJPSBTREhDSV9RVUlSS19OT19FTkRBVFRSX0lOX05PUERFU0MsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BjaV9maXhlcyBzZGhjaV9pbnRlbF9tZmRfZW1tYyA9IHsKKwkucXVpcmtzCQk9IFNESENJX1FVSVJLX05PX0VOREFUVFJfSU5fTk9QREVTQywKKwkucHJvYmVfc2xvdAk9IG1mZF9lbW1jX3Byb2JlX3Nsb3QsCit9OworCiAvKiBPMk1pY3JvIGV4dHJhIHJlZ2lzdGVycyAqLwogI2RlZmluZSBPMl9TRF9MT0NLX1dQCQkweEQzCiAjZGVmaW5lIE8yX1NEX01VTFRJX1ZDQzNWCTB4RUUKQEAgLTY4Miw3ICs3MDAsNyBAQAogCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfSU5URUxfTUZEX1NESU8xLAogCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKIAkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCi0JCS5kcml2ZXJfZGF0YQk9IChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfaW50ZWxfbWZkX2VtbWNfc2RpbywKKwkJLmRyaXZlcl9kYXRhCT0gKGtlcm5lbF91bG9uZ190KSZzZGhjaV9pbnRlbF9tZmRfc2RpbywKIAl9LAogCiAJewpAQCAtNjkwLDcgKzcwOCw3IEBACiAJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9JTlRFTF9NRkRfU0RJTzIsCiAJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAogCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKLQkJLmRyaXZlcl9kYXRhCT0gKGtlcm5lbF91bG9uZ190KSZzZGhjaV9pbnRlbF9tZmRfZW1tY19zZGlvLAorCQkuZHJpdmVyX2RhdGEJPSAoa2VybmVsX3Vsb25nX3QpJnNkaGNpX2ludGVsX21mZF9zZGlvLAogCX0sCiAKIAl7CkBAIC02OTgsNyArNzE2LDcgQEAKIAkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0lOVEVMX01GRF9FTU1DMCwKIAkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCiAJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAotCQkuZHJpdmVyX2RhdGEJPSAoa2VybmVsX3Vsb25nX3QpJnNkaGNpX2ludGVsX21mZF9lbW1jX3NkaW8sCisJCS5kcml2ZXJfZGF0YQk9IChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfaW50ZWxfbWZkX2VtbWMsCiAJfSwKIAogCXsKQEAgLTcwNiw3ICs3MjQsNyBAQAogCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfSU5URUxfTUZEX0VNTUMxLAogCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKIAkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCi0JCS5kcml2ZXJfZGF0YQk9IChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfaW50ZWxfbWZkX2VtbWNfc2RpbywKKwkJLmRyaXZlcl9kYXRhCT0gKGtlcm5lbF91bG9uZ190KSZzZGhjaV9pbnRlbF9tZmRfZW1tYywKIAl9LAogCiAJewpAQCAtNzg5LDggKzgwNywzNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNkaGNpX3BjaV84Yml0X3dpZHRoKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgd2lkdGgpCit7CisJdTggY3RybDsKKworCWN0cmwgPSBzZGhjaV9yZWFkYihob3N0LCBTREhDSV9IT1NUX0NPTlRST0wpOworCisJc3dpdGNoICh3aWR0aCkgeworCWNhc2UgTU1DX0JVU19XSURUSF84OgorCQljdHJsIHw9IFNESENJX0NUUkxfOEJJVEJVUzsKKwkJY3RybCAmPSB+U0RIQ0lfQ1RSTF80QklUQlVTOworCQlicmVhazsKKwljYXNlIE1NQ19CVVNfV0lEVEhfNDoKKwkJY3RybCB8PSBTREhDSV9DVFJMXzRCSVRCVVM7CisJCWN0cmwgJj0gflNESENJX0NUUkxfOEJJVEJVUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY3RybCAmPSB+KFNESENJX0NUUkxfOEJJVEJVUyB8IFNESENJX0NUUkxfNEJJVEJVUyk7CisJCWJyZWFrOworCX0KKworCXNkaGNpX3dyaXRlYihob3N0LCBjdHJsLCBTREhDSV9IT1NUX0NPTlRST0wpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2RoY2lfb3BzIHNkaGNpX3BjaV9vcHMgPSB7CiAJLmVuYWJsZV9kbWEJPSBzZGhjaV9wY2lfZW5hYmxlX2RtYSwKKwkucGxhdGZvcm1fOGJpdF93aWR0aAk9IHNkaGNpX3BjaV84Yml0X3dpZHRoLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCmluZGV4IGRiYWIwNDAuLjcxYzBjZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKQEAgLTIsNiArMiwxMiBAQAogICogc2RoY2ktcGx0Zm0uYyBTdXBwb3J0IGZvciBTREhDSSBwbGF0Zm9ybSBkZXZpY2VzCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KICAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwOSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogQXV0aG9yczogWGlhb2JvIFhpZSA8WC5YaWVAZnJlZXNjYWxlLmNvbT4KKyAqCSAgICBBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAcnUubXZpc3RhLmNvbT4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgpAQCAtMjIsNDggKzI4LDY2IEBACiAgKiBJbnNwaXJlZCBieSBzZGhjaS1wY2kuYywgYnkgUGllcnJlIE9zc21hbgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9zZGhjaS1wbHRmbS5oPgotCi0jaW5jbHVkZSAic2RoY2kuaCIKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2lmZGVmIENPTkZJR19QUEMKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2VuZGlmCiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBTREhDSSBjb3JlIGNhbGxiYWNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBzdGF0aWMgc3RydWN0IHNkaGNpX29wcyBzZGhjaV9wbHRmbV9vcHMgPSB7CiB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIERldmljZSBwcm9iaW5nL3JlbW92YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHNkaGNpX3BsdGZtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgYm9vbCBzZGhjaV9vZl93cF9pbnZlcnRlZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCWNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgKnBsYXRpZCA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldik7Ci0Jc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgKnBkYXRhOworCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJzZGhjaSx3cC1pbnZlcnRlZCIsIE5VTEwpKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIE9sZCBkZXZpY2UgdHJlZXMgZG9uJ3QgaGF2ZSB0aGUgd3AtaW52ZXJ0ZWQgcHJvcGVydHkuICovCisjaWZkZWYgQ09ORklHX1BQQworCXJldHVybiBtYWNoaW5lX2lzKG1wYzgzN3hfcmRiKSB8fCBtYWNoaW5lX2lzKG1wYzgzN3hfbWRzKTsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOworI2VuZGlmIC8qIENPTkZJR19QUEMgKi8KK30KKwordm9pZCBzZGhjaV9nZXRfb2ZfcHJvcGVydHkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJY29uc3QgX19iZTMyICpjbGs7CisJaW50IHNpemU7CisKKwlpZiAob2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShucCkpIHsKKwkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInNkaGNpLGF1dG8tY21kMTIiLCBOVUxMKSkKKwkJCWhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19NVUxUSUJMT0NLX1JFQURfQUNNRDEyOworCisJCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJzZGhjaSwxLWJpdC1vbmx5IiwgTlVMTCkpCisJCQlob3N0LT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfRk9SQ0VfMV9CSVRfREFUQTsKKworCQlpZiAoc2RoY2lfb2Zfd3BfaW52ZXJ0ZWQobnApKQorCQkJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX0lOVkVSVEVEX1dSSVRFX1BST1RFQ1Q7CisKKwkJY2xrID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgJnNpemUpOworCQlpZiAoY2xrICYmIHNpemUgPT0gc2l6ZW9mKCpjbGspICYmICpjbGspCisJCQlwbHRmbV9ob3N0LT5jbG9jayA9IGJlMzJfdG9fY3B1cChjbGspOworCX0KK30KKyNlbHNlCit2b2lkIHNkaGNpX2dldF9vZl9wcm9wZXJ0eShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KSB7fQorI2VuZGlmIC8qIENPTkZJR19PRiAqLworRVhQT1JUX1NZTUJPTF9HUEwoc2RoY2lfZ2V0X29mX3Byb3BlcnR5KTsKKworc3RydWN0IHNkaGNpX2hvc3QgKnNkaGNpX3BsdGZtX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgKnBkYXRhKQorewogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0OwogCXN0cnVjdCByZXNvdXJjZSAqaW9tZW07CiAJaW50IHJldDsKIAotCWlmIChwbGF0aWQgJiYgcGxhdGlkLT5kcml2ZXJfZGF0YSkKLQkJcGRhdGEgPSAodm9pZCAqKXBsYXRpZC0+ZHJpdmVyX2RhdGE7Ci0JZWxzZQotCQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCiAJaW9tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghaW9tZW0pIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTcxLDggKzk1LDcgQEAKIAl9CiAKIAlpZiAocmVzb3VyY2Vfc2l6ZShpb21lbSkgPCAweDEwMCkKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiSW52YWxpZCBpb21lbSBzaXplLiBZb3UgbWF5ICIKLQkJCSJleHBlcmllbmNlIHByb2JsZW1zLlxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgaW9tZW0gc2l6ZSFcbiIpOwogCiAJLyogU29tZSBQQ0ktYmFzZWQgTUZEIG5lZWQgdGhlIHBhcmVudCBoZXJlICovCiAJaWYgKHBkZXYtPmRldi5wYXJlbnQgIT0gJnBsYXRmb3JtX2J1cykKQEAgLTg3LDcgKzExMCw3IEBACiAKIAlwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKIAotCWhvc3QtPmh3X25hbWUgPSAicGxhdGZvcm0iOworCWhvc3QtPmh3X25hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAlpZiAocGRhdGEgJiYgcGRhdGEtPm9wcykKIAkJaG9zdC0+b3BzID0gcGRhdGEtPm9wczsKIAllbHNlCkBAIC0xMTAsMTI2ICsxMzMsOTUgQEAKIAkJZ290byBlcnJfcmVtYXA7CiAJfQogCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5pbml0KSB7Ci0JCXJldCA9IHBkYXRhLT5pbml0KGhvc3QsIHBkYXRhKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyX3BsYXRfaW5pdDsKLQl9Ci0KLQlyZXQgPSBzZGhjaV9hZGRfaG9zdChob3N0KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9hZGRfaG9zdDsKLQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGhvc3Q7CiAKLWVycl9hZGRfaG9zdDoKLQlpZiAocGRhdGEgJiYgcGRhdGEtPmV4aXQpCi0JCXBkYXRhLT5leGl0KGhvc3QpOwotZXJyX3BsYXRfaW5pdDoKLQlpb3VubWFwKGhvc3QtPmlvYWRkcik7CiBlcnJfcmVtYXA6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGlvbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb21lbSkpOwogZXJyX3JlcXVlc3Q6CiAJc2RoY2lfZnJlZV9ob3N0KGhvc3QpOwogZXJyOgotCXByaW50ayhLRVJOX0VSUiJQcm9iaW5nIG9mIHNkaGNpLXBsdGZtIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JcmV0dXJuIHJldDsKKwlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzZGhjaV9wbHRmbV9pbml0KTsKIAotc3RhdGljIGludCBfX2RldmV4aXQgc2RoY2lfcGx0Zm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit2b2lkIHNkaGNpX3BsdGZtX2ZyZWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCByZXNvdXJjZSAqaW9tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWludCBkZWFkOwotCXUzMiBzY3JhdGNoOwogCi0JZGVhZCA9IDA7Ci0Jc2NyYXRjaCA9IHJlYWRsKGhvc3QtPmlvYWRkciArIFNESENJX0lOVF9TVEFUVVMpOwotCWlmIChzY3JhdGNoID09ICh1MzIpLTEpCi0JCWRlYWQgPSAxOwotCi0Jc2RoY2lfcmVtb3ZlX2hvc3QoaG9zdCwgZGVhZCk7Ci0JaWYgKHBkYXRhICYmIHBkYXRhLT5leGl0KQotCQlwZGF0YS0+ZXhpdChob3N0KTsKIAlpb3VubWFwKGhvc3QtPmlvYWRkcik7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGlvbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb21lbSkpOwogCXNkaGNpX2ZyZWVfaG9zdChob3N0KTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNkaGNpX3BsdGZtX2ZyZWUpOworCitpbnQgc2RoY2lfcGx0Zm1fcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSBzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3Q7CisJaW50IHJldCA9IDA7CisKKwlob3N0ID0gc2RoY2lfcGx0Zm1faW5pdChwZGV2LCBwZGF0YSk7CisJaWYgKElTX0VSUihob3N0KSkKKwkJcmV0dXJuIFBUUl9FUlIoaG9zdCk7CisKKwlzZGhjaV9nZXRfb2ZfcHJvcGVydHkocGRldik7CisKKwlyZXQgPSBzZGhjaV9hZGRfaG9zdChob3N0KTsKKwlpZiAocmV0KQorCQlzZGhjaV9wbHRmbV9mcmVlKHBkZXYpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNkaGNpX3BsdGZtX3JlZ2lzdGVyKTsKKworaW50IHNkaGNpX3BsdGZtX3VucmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBkZWFkID0gKHJlYWRsKGhvc3QtPmlvYWRkciArIFNESENJX0lOVF9TVEFUVVMpID09IDB4ZmZmZmZmZmYpOworCisJc2RoY2lfcmVtb3ZlX2hvc3QoaG9zdCwgZGVhZCk7CisJc2RoY2lfcGx0Zm1fZnJlZShwZGV2KTsKIAogCXJldHVybiAwOwogfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBzZGhjaV9wbHRmbV9pZHNbXSA9IHsKLQl7ICJzZGhjaSIsIH0sCi0jaWZkZWYgQ09ORklHX01NQ19TREhDSV9DTlMzWFhYCi0JeyAic2RoY2ktY25zM3h4eCIsIChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfY25zM3h4eF9wZGF0YSB9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01NQ19TREhDSV9FU0RIQ19JTVgKLQl7ICJzZGhjaS1lc2RoYy1pbXgiLCAoa2VybmVsX3Vsb25nX3QpJnNkaGNpX2VzZGhjX2lteF9wZGF0YSB9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01NQ19TREhDSV9ET1ZFCi0JeyAic2RoY2ktZG92ZSIsIChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfZG92ZV9wZGF0YSB9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01NQ19TREhDSV9URUdSQQotCXsgInNkaGNpLXRlZ3JhIiwgKGtlcm5lbF91bG9uZ190KSZzZGhjaV90ZWdyYV9wZGF0YSB9LAotI2VuZGlmCi0JeyB9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIHNkaGNpX3BsdGZtX2lkcyk7CitFWFBPUlRfU1lNQk9MX0dQTChzZGhjaV9wbHRmbV91bnJlZ2lzdGVyKTsKIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBzZGhjaV9wbHRmbV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoraW50IHNkaGNpX3BsdGZtX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNkaGNpX3N1c3BlbmRfaG9zdChob3N0LCBzdGF0ZSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzZGhjaV9wbHRmbV9zdXNwZW5kKTsKIAotc3RhdGljIGludCBzZGhjaV9wbHRmbV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoraW50IHNkaGNpX3BsdGZtX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNkaGNpX3Jlc3VtZV9ob3N0KGhvc3QpOwogfQotI2Vsc2UKLSNkZWZpbmUgc2RoY2lfcGx0Zm1fc3VzcGVuZAlOVUxMCi0jZGVmaW5lIHNkaGNpX3BsdGZtX3Jlc3VtZQlOVUxMCitFWFBPUlRfU1lNQk9MX0dQTChzZGhjaV9wbHRmbV9yZXN1bWUpOwogI2VuZGlmCS8qIENPTkZJR19QTSAqLwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZGhjaV9wbHRmbV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAic2RoY2kiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZQkJPSBzZGhjaV9wbHRmbV9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNkaGNpX3BsdGZtX3JlbW92ZSksCi0JLmlkX3RhYmxlCT0gc2RoY2lfcGx0Zm1faWRzLAotCS5zdXNwZW5kCT0gc2RoY2lfcGx0Zm1fc3VzcGVuZCwKLQkucmVzdW1lCQk9IHNkaGNpX3BsdGZtX3Jlc3VtZSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRHJpdmVyIGluaXQvZXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBfX2luaXQgc2RoY2lfZHJ2X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHNkaGNpX3BsdGZtX2Rydl9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2RoY2lfcGx0Zm1fZHJpdmVyKTsKLX0KKwlwcl9pbmZvKCJzZGhjaS1wbHRmbTogU0RIQ0kgcGxhdGZvcm0gYW5kIE9GIGRyaXZlciBoZWxwZXJcbiIpOwogCi1zdGF0aWMgdm9pZCBfX2V4aXQgc2RoY2lfZHJ2X2V4aXQodm9pZCkKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHNkaGNpX3BsdGZtX2Rydl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHNkaGNpX3BsdGZtX2Rydl9leGl0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNkaGNpX3BsdGZtX2RyaXZlcik7CiB9Cittb2R1bGVfZXhpdChzZGhjaV9wbHRmbV9kcnZfZXhpdCk7CiAKLW1vZHVsZV9pbml0KHNkaGNpX2Rydl9pbml0KTsKLW1vZHVsZV9leGl0KHNkaGNpX2Rydl9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIHBsYXRmb3JtIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiTW9jZWFuIExhYm9yYXRvcmllcyA8aW5mb0Btb2NlYW4tbGFicy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNESENJIHBsYXRmb3JtIGFuZCBPRiBkcml2ZXIgaGVscGVyIik7CitNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5oIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5oCmluZGV4IDJiMzcwMTYuLjNhOWZjM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmgKQEAgLTEyLDE3ICsxMiw5NSBAQAogI2RlZmluZSBfRFJJVkVSU19NTUNfU0RIQ0lfUExURk1fSAogCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvc2RoY2ktcGx0Zm0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlICJzZGhjaS5oIgorCitzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSB7CisJc3RydWN0IHNkaGNpX29wcyAqb3BzOworCXVuc2lnbmVkIGludCBxdWlya3M7Cit9OwogCiBzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCB7CiAJc3RydWN0IGNsayAqY2xrOwogCXZvaWQgKnByaXY7IC8qIHRvIGhhbmRsZSBxdWlya3MgYWNyb3NzIGlvLWFjY2Vzc29yIGNhbGxzICovCisKKwkvKiBtaWdyYXRlIGZyb20gc2RoY2lfb2ZfaG9zdCAqLworCXVuc2lnbmVkIGludCBjbG9jazsKKwl1MTYgeGZlcl9tb2RlX3NoYWRvdzsKIH07CiAKLWV4dGVybiBzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV9jbnMzeHh4X3BkYXRhOwotZXh0ZXJuIHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX2VzZGhjX2lteF9wZGF0YTsKLWV4dGVybiBzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV9kb3ZlX3BkYXRhOwotZXh0ZXJuIHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX3RlZ3JhX3BkYXRhOworI2lmZGVmIENPTkZJR19NTUNfU0RIQ0lfQklHX0VORElBTl8zMkJJVF9CWVRFX1NXQVBQRVIKKy8qCisgKiBUaGVzZSBhY2Nlc3NvcnMgYXJlIGRlc2lnbmVkIGZvciBiaWcgZW5kaWFuIGhvc3RzIGRvaW5nIEkvTyB0bworICogbGl0dGxlIGVuZGlhbiBjb250cm9sbGVycyBpbmNvcnBvcmF0aW5nIGEgMzItYml0IGhhcmR3YXJlIGJ5dGUgc3dhcHBlci4KKyAqLworc3RhdGljIGlubGluZSB1MzIgc2RoY2lfYmUzMmJzX3JlYWRsKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQoreworCXJldHVybiBpbl9iZTMyKGhvc3QtPmlvYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHNkaGNpX2JlMzJic19yZWFkdyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgaW50IHJlZykKK3sKKwlyZXR1cm4gaW5fYmUxNihob3N0LT5pb2FkZHIgKyAocmVnIF4gMHgyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggc2RoY2lfYmUzMmJzX3JlYWRiKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQoreworCXJldHVybiBpbl84KGhvc3QtPmlvYWRkciArIChyZWcgXiAweDMpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNkaGNpX2JlMzJic193cml0ZWwoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsCisJCQkJICAgICAgIHUzMiB2YWwsIGludCByZWcpCit7CisJb3V0X2JlMzIoaG9zdC0+aW9hZGRyICsgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2RoY2lfYmUzMmJzX3dyaXRldyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKKwkJCQkgICAgICAgdTE2IHZhbCwgaW50IHJlZykKK3sKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJaW50IGJhc2UgPSByZWcgJiB+MHgzOworCWludCBzaGlmdCA9IChyZWcgJiAweDIpICogODsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBTREhDSV9UUkFOU0ZFUl9NT0RFOgorCQkvKgorCQkgKiBQb3N0cG9uZSB0aGlzIHdyaXRlLCB3ZSBtdXN0IGRvIGl0IHRvZ2V0aGVyIHdpdGggYQorCQkgKiBjb21tYW5kIHdyaXRlIHRoYXQgaXMgZG93biBiZWxvdy4KKwkJICovCisJCXBsdGZtX2hvc3QtPnhmZXJfbW9kZV9zaGFkb3cgPSB2YWw7CisJCXJldHVybjsKKwljYXNlIFNESENJX0NPTU1BTkQ6CisJCXNkaGNpX2JlMzJic193cml0ZWwoaG9zdCwKKwkJCQkgICAgdmFsIDw8IDE2IHwgcGx0Zm1faG9zdC0+eGZlcl9tb2RlX3NoYWRvdywKKwkJCQkgICAgU0RIQ0lfVFJBTlNGRVJfTU9ERSk7CisJCXJldHVybjsKKwl9CisJY2xyc2V0Yml0c19iZTMyKGhvc3QtPmlvYWRkciArIGJhc2UsIDB4ZmZmZiA8PCBzaGlmdCwgdmFsIDw8IHNoaWZ0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNkaGNpX2JlMzJic193cml0ZWIoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHU4IHZhbCwgaW50IHJlZykKK3sKKwlpbnQgYmFzZSA9IHJlZyAmIH4weDM7CisJaW50IHNoaWZ0ID0gKHJlZyAmIDB4MykgKiA4OworCisJY2xyc2V0Yml0c19iZTMyKGhvc3QtPmlvYWRkciArIGJhc2UgLCAweGZmIDw8IHNoaWZ0LCB2YWwgPDwgc2hpZnQpOworfQorI2VuZGlmIC8qIENPTkZJR19NTUNfU0RIQ0lfQklHX0VORElBTl8zMkJJVF9CWVRFX1NXQVBQRVIgKi8KKworZXh0ZXJuIHZvaWQgc2RoY2lfZ2V0X29mX3Byb3BlcnR5KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCitleHRlcm4gc3RydWN0IHNkaGNpX2hvc3QgKnNkaGNpX3BsdGZtX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkJICAgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgKnBkYXRhKTsKK2V4dGVybiB2b2lkIHNkaGNpX3BsdGZtX2ZyZWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisKK2V4dGVybiBpbnQgc2RoY2lfcGx0Zm1fcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQlzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSAqcGRhdGEpOworZXh0ZXJuIGludCBzZGhjaV9wbHRmbV91bnJlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCisjaWZkZWYgQ09ORklHX1BNCitleHRlcm4gaW50IHNkaGNpX3BsdGZtX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworZXh0ZXJuIGludCBzZGhjaV9wbHRmbV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KTsKKyNlbmRpZgogCiAjZW5kaWYgLyogX0RSSVZFUlNfTU1DX1NESENJX1BMVEZNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODljOWE2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyogbGludXgvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1weGEuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgotICoJCVpoYW5nZmVpIEdhbyA8emhhbmdmZWkuZ2FvQG1hcnZlbGwuY29tPgotICoJCUtldmluIFdhbmcgPGR3YW5nNEBtYXJ2ZWxsLmNvbT4KLSAqCQlNaW5nd2VpIFdhbmcgPG13d2FuZ0BtYXJ2ZWxsLmNvbT4KLSAqCQlQaGlsaXAgUmFraXR5IDxwcmFraXR5QG1hcnZlbGwuY29tPgotICoJCU1hcmsgQnJvd24gPG1hcmtiQG1hcnZlbGwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotLyogU3VwcG9ydHM6Ci0gKiBTREhDSSBzdXBwb3J0IGZvciBNTVAyL1BYQTkxMC9QWEExNjgKLSAqCi0gKiBSZWZlciB0byBzZGhjaS1zM2MuYy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgotI2luY2x1ZGUgInNkaGNpLmgiCi0KLSNkZWZpbmUgRFJJVkVSX05BTUUJInNkaGNpLXB4YSIKLQotI2RlZmluZSBTRF9GSUZPX1BBUkFNCQkweDEwNAotI2RlZmluZSBESVNfUEFEX1NEX0NMS19HQVRFCTB4NDAwCi0KLXN0cnVjdCBzZGhjaV9weGEgewotCXN0cnVjdCBzZGhjaV9ob3N0CQkqaG9zdDsKLQlzdHJ1Y3Qgc2RoY2lfcHhhX3BsYXRkYXRhCSpwZGF0YTsKLQlzdHJ1Y3QgY2xrCQkJKmNsazsKLQlzdHJ1Y3QgcmVzb3VyY2UJCQkqcmVzOwotCi0JdTggY2xrX2VuYWJsZTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogU0RIQ0kgY29yZSBjYWxsYmFja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNldF9jbG9jayhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IGNsb2NrKQotewotCXN0cnVjdCBzZGhjaV9weGEgKnB4YSA9IHNkaGNpX3ByaXYoaG9zdCk7Ci0JdTMyIHRtcCA9IDA7Ci0KLQlpZiAoY2xvY2sgPT0gMCkgewotCQlpZiAocHhhLT5jbGtfZW5hYmxlKSB7Ci0JCQljbGtfZGlzYWJsZShweGEtPmNsayk7Ci0JCQlweGEtPmNsa19lbmFibGUgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKDAgPT0gcHhhLT5jbGtfZW5hYmxlKSB7Ci0JCQlpZiAocHhhLT5wZGF0YS0+ZmxhZ3MgJiBQWEFfRkxBR19ESVNBQkxFX0NMT0NLX0dBVElORykgewotCQkJCXRtcCA9IHJlYWRsKGhvc3QtPmlvYWRkciArIFNEX0ZJRk9fUEFSQU0pOwotCQkJCXRtcCB8PSBESVNfUEFEX1NEX0NMS19HQVRFOwotCQkJCXdyaXRlbCh0bXAsIGhvc3QtPmlvYWRkciArIFNEX0ZJRk9fUEFSQU0pOwotCQkJfQotCQkJY2xrX2VuYWJsZShweGEtPmNsayk7Ci0JCQlweGEtPmNsa19lbmFibGUgPSAxOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IHNldF91aHNfc2lnbmFsaW5nKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgdWhzKQotewotCXUxNiBjdHJsXzI7Ci0KLQkvKgotCSAqIFNldCBWMThfRU4gLS0gVUhTIG1vZGVzIGRvIG5vdCB3b3JrIHdpdGhvdXQgdGhpcy4KLQkgKiBkb2VzIG5vdCBjaGFuZ2Ugc2lnbmFsaW5nIHZvbHRhZ2UKLQkgKi8KLQljdHJsXzIgPSBzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9IT1NUX0NPTlRST0wyKTsKLQotCS8qIFNlbGVjdCBCdXMgU3BlZWQgTW9kZSBmb3IgaG9zdCAqLwotCWN0cmxfMiAmPSB+U0RIQ0lfQ1RSTF9VSFNfTUFTSzsKLQlzd2l0Y2ggKHVocykgewotCWNhc2UgTU1DX1RJTUlOR19VSFNfU0RSMTI6Ci0JCWN0cmxfMiB8PSBTREhDSV9DVFJMX1VIU19TRFIxMjsKLQkJYnJlYWs7Ci0JY2FzZSBNTUNfVElNSU5HX1VIU19TRFIyNToKLQkJY3RybF8yIHw9IFNESENJX0NUUkxfVUhTX1NEUjI1OwotCQlicmVhazsKLQljYXNlIE1NQ19USU1JTkdfVUhTX1NEUjUwOgotCQljdHJsXzIgfD0gU0RIQ0lfQ1RSTF9VSFNfU0RSNTAgfCBTREhDSV9DVFJMX1ZERF8xODA7Ci0JCWJyZWFrOwotCWNhc2UgTU1DX1RJTUlOR19VSFNfU0RSMTA0OgotCQljdHJsXzIgfD0gU0RIQ0lfQ1RSTF9VSFNfU0RSMTA0IHwgU0RIQ0lfQ1RSTF9WRERfMTgwOwotCQlicmVhazsKLQljYXNlIE1NQ19USU1JTkdfVUhTX0REUjUwOgotCQljdHJsXzIgfD0gU0RIQ0lfQ1RSTF9VSFNfRERSNTAgfCBTREhDSV9DVFJMX1ZERF8xODA7Ci0JCWJyZWFrOwotCX0KLQotCXNkaGNpX3dyaXRldyhob3N0LCBjdHJsXzIsIFNESENJX0hPU1RfQ09OVFJPTDIpOwotCXByX2RlYnVnKCIlczolcyB1aHMgPSAlZCwgY3RybF8yID0gJTA0WFxuIiwKLQkJX19mdW5jX18sIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCB1aHMsIGN0cmxfMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfcHhhX29wcyA9IHsKLQkuc2V0X3Voc19zaWduYWxpbmcgPSBzZXRfdWhzX3NpZ25hbGluZywKLQkuc2V0X2Nsb2NrID0gc2V0X2Nsb2NrLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBEZXZpY2UgcHJvYmluZy9yZW1vdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzZGhjaV9weGFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc2RoY2lfcHhhX3BsYXRkYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBOVUxMOwotCXN0cnVjdCByZXNvdXJjZSAqaW9tZW0gPSBOVUxMOwotCXN0cnVjdCBzZGhjaV9weGEgKnB4YSA9IE5VTEw7Ci0JaW50IHJldCwgaXJxOwotCi0JaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoaXJxIDwgMCkgewotCQlkZXZfZXJyKGRldiwgIm5vIGlycSBzcGVjaWZpZWRcbiIpOwotCQlyZXR1cm4gaXJxOwotCX0KLQotCWlvbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIWlvbWVtKSB7Ci0JCWRldl9lcnIoZGV2LCAibm8gbWVtb3J5IHNwZWNpZmllZFxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCWhvc3QgPSBzZGhjaV9hbGxvY19ob3N0KCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc2RoY2lfcHhhKSk7Ci0JaWYgKElTX0VSUihob3N0KSkgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvYyBob3N0XG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoaG9zdCk7Ci0JfQotCi0JcHhhID0gc2RoY2lfcHJpdihob3N0KTsKLQlweGEtPmhvc3QgPSBob3N0OwotCXB4YS0+cGRhdGEgPSBwZGF0YTsKLQlweGEtPmNsa19lbmFibGUgPSAwOwotCi0JcHhhLT5jbGsgPSBjbGtfZ2V0KGRldiwgIlBYQS1TREhDTEsiKTsKLQlpZiAoSVNfRVJSKHB4YS0+Y2xrKSkgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgaW8gY2xvY2tcbiIpOwotCQlyZXQgPSBQVFJfRVJSKHB4YS0+Y2xrKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcHhhLT5yZXMgPSByZXF1ZXN0X21lbV9yZWdpb24oaW9tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvbWVtKSwKLQkJCQkgICAgICBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7Ci0JaWYgKCFweGEtPnJlcykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVxdWVzdCByZWdpb25cbiIpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWhvc3QtPmlvYWRkciA9IGlvcmVtYXAoaW9tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvbWVtKSk7Ci0JaWYgKCFob3N0LT5pb2FkZHIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlbWFwIHJlZ2lzdGVyc1xuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCWhvc3QtPmh3X25hbWUgPSAiTU1DIjsKLQlob3N0LT5vcHMgPSAmc2RoY2lfcHhhX29wczsKLQlob3N0LT5pcnEgPSBpcnE7Ci0JaG9zdC0+cXVpcmtzID0gU0RIQ0lfUVVJUktfQlJPS0VOX0FETUEKLQkJfCBTREhDSV9RVUlSS19CUk9LRU5fVElNRU9VVF9WQUwKLQkJfCBTREhDSV9RVUlSS18zMkJJVF9ETUFfQUREUgotCQl8IFNESENJX1FVSVJLXzMyQklUX0RNQV9TSVpFCi0JCXwgU0RIQ0lfUVVJUktfMzJCSVRfQURNQV9TSVpFCi0JCXwgU0RIQ0lfUVVJUktfTk9fRU5EQVRUUl9JTl9OT1BERVNDOwotCi0JaWYgKHBkYXRhLT5xdWlya3MpCi0JCWhvc3QtPnF1aXJrcyB8PSBwZGF0YS0+cXVpcmtzOwotCi0JLyogZW5hYmxlIDEvOFYgRERSIGNhcGFibGUgKi8KLQlob3N0LT5tbWMtPmNhcHMgfD0gTU1DX0NBUF8xXzhWX0REUjsKLQotCS8qIElmIHNsb3QgZGVzaWduIHN1cHBvcnRzIDggYml0IGRhdGEsIGluZGljYXRlIHRoaXMgdG8gTU1DLiAqLwotCWlmIChwZGF0YS0+ZmxhZ3MgJiBQWEFfRkxBR19TRF84X0JJVF9DQVBBQkxFX1NMT1QpCi0JCWhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQXzhfQklUX0RBVEE7Ci0KLQlyZXQgPSBzZGhjaV9hZGRfaG9zdChob3N0KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhZGQgaG9zdFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChweGEtPnBkYXRhLT5tYXhfc3BlZWQpCi0JCWhvc3QtPm1tYy0+Zl9tYXggPSBweGEtPnBkYXRhLT5tYXhfc3BlZWQ7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBob3N0KTsKLQotCXJldHVybiAwOwotb3V0OgotCWlmIChob3N0KSB7Ci0JCWNsa19wdXQocHhhLT5jbGspOwotCQlpZiAoaG9zdC0+aW9hZGRyKQotCQkJaW91bm1hcChob3N0LT5pb2FkZHIpOwotCQlpZiAocHhhLT5yZXMpCi0JCQlyZWxlYXNlX21lbV9yZWdpb24ocHhhLT5yZXMtPnN0YXJ0LAotCQkJCQkgICByZXNvdXJjZV9zaXplKHB4YS0+cmVzKSk7Ci0JCXNkaGNpX2ZyZWVfaG9zdChob3N0KTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBzZGhjaV9weGFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3Qgc2RoY2lfcHhhICpweGEgPSBzZGhjaV9wcml2KGhvc3QpOwotCWludCBkZWFkID0gMDsKLQl1MzIgc2NyYXRjaDsKLQotCWlmIChob3N0KSB7Ci0JCXNjcmF0Y2ggPSByZWFkbChob3N0LT5pb2FkZHIgKyBTREhDSV9JTlRfU1RBVFVTKTsKLQkJaWYgKHNjcmF0Y2ggPT0gKHUzMiktMSkKLQkJCWRlYWQgPSAxOwotCi0JCXNkaGNpX3JlbW92ZV9ob3N0KGhvc3QsIGRlYWQpOwotCi0JCWlmIChob3N0LT5pb2FkZHIpCi0JCQlpb3VubWFwKGhvc3QtPmlvYWRkcik7Ci0JCWlmIChweGEtPnJlcykKLQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihweGEtPnJlcy0+c3RhcnQsCi0JCQkJCSAgIHJlc291cmNlX3NpemUocHhhLT5yZXMpKTsKLQkJaWYgKHB4YS0+Y2xrX2VuYWJsZSkgewotCQkJY2xrX2Rpc2FibGUocHhhLT5jbGspOwotCQkJcHhhLT5jbGtfZW5hYmxlID0gMDsKLQkJfQotCQljbGtfcHV0KHB4YS0+Y2xrKTsKLQotCQlzZGhjaV9mcmVlX2hvc3QoaG9zdCk7Ci0JCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHNkaGNpX3B4YV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKLQotCXJldHVybiBzZGhjaV9zdXNwZW5kX2hvc3QoaG9zdCwgc3RhdGUpOwotfQotCi1zdGF0aWMgaW50IHNkaGNpX3B4YV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKLQotCXJldHVybiBzZGhjaV9yZXN1bWVfaG9zdChob3N0KTsKLX0KLSNlbHNlCi0jZGVmaW5lIHNkaGNpX3B4YV9zdXNwZW5kCU5VTEwKLSNkZWZpbmUgc2RoY2lfcHhhX3Jlc3VtZQlOVUxMCi0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RoY2lfcHhhX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gc2RoY2lfcHhhX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2RoY2lfcHhhX3JlbW92ZSksCi0JLnN1c3BlbmQJPSBzZGhjaV9weGFfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHNkaGNpX3B4YV9yZXN1bWUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gRFJJVkVSX05BTUUsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIERyaXZlciBpbml0L2V4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgX19pbml0IHNkaGNpX3B4YV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2RoY2lfcHhhX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzZGhjaV9weGFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzZGhjaV9weGFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc2RoY2lfcHhhX2luaXQpOwotbW9kdWxlX2V4aXQoc2RoY2lfcHhhX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNESCBjb250cm9sbGVyIGRyaXZlciBmb3IgUFhBMTY4L1BYQTkxMC9NTVAyIik7Ci1NT0RVTEVfQVVUSE9SKCJaaGFuZ2ZlaSBHYW8gPHpoYW5nZmVpLmdhb0BtYXJ2ZWxsLmNvbT4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhdjIuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY1ODk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1weGF2Mi5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCisgKgkJWmhhbmdmZWkgR2FvIDx6aGFuZ2ZlaS5nYW9AbWFydmVsbC5jb20+CisgKgkJS2V2aW4gV2FuZyA8ZHdhbmc0QG1hcnZlbGwuY29tPgorICoJCUp1biBOaWUgPG5qdW5AbWFydmVsbC5jb20+CisgKgkJUWltaW5nIFd1IDx3dXFtQG1hcnZlbGwuY29tPgorICoJCVBoaWxpcCBSYWtpdHkgPHByYWtpdHlAbWFydmVsbC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9weGFfc2RoY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAic2RoY2kuaCIKKyNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgorCisjZGVmaW5lIFNEX0ZJRk9fUEFSQU0JCTB4ZTAKKyNkZWZpbmUgRElTX1BBRF9TRF9DTEtfR0FURQkweDA0MDAgLyogVHVybiBvbi9vZmYgRHluYW1pYyBTRCBDbG9jayBHYXRpbmcgKi8KKyNkZWZpbmUgQ0xLX0dBVEVfT04JCTB4MDIwMCAvKiBEaXNhYmxlL2VuYWJsZSBDbG9jayBHYXRlICovCisjZGVmaW5lIENMS19HQVRFX0NUTAkJMHgwMTAwIC8qIENsb2NrIEdhdGUgQ29udHJvbCAqLworI2RlZmluZSBDTEtfR0FURV9TRVRUSU5HX0JJVFMJKERJU19QQURfU0RfQ0xLX0dBVEUgfCBcCisJCUNMS19HQVRFX09OIHwgQ0xLX0dBVEVfQ1RMKQorCisjZGVmaW5lIFNEX0NMT0NLX0JVUlNUX1NJWkVfU0VUVVAJMHhlNgorI2RlZmluZSBTRENMS19TRUxfU0hJRlQJCTgKKyNkZWZpbmUgU0RDTEtfU0VMX01BU0sJCTB4MworI2RlZmluZSBTRENMS19ERUxBWV9TSElGVAkxMAorI2RlZmluZSBTRENMS19ERUxBWV9NQVNLCTB4M2MKKworI2RlZmluZSBTRF9DRV9BVEFfMgkJMHhlYQorI2RlZmluZSBNTUNfQ0FSRAkJMHgxMDAwCisjZGVmaW5lIE1NQ19XSURUSAkJMHgwMTAwCisKK3N0YXRpYyB2b2lkIHB4YXYyX3NldF9wcml2YXRlX3JlZ2lzdGVycyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdTggbWFzaykKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKG1tY19kZXYoaG9zdC0+bW1jKSk7CisJc3RydWN0IHNkaGNpX3B4YV9wbGF0ZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChtYXNrID09IFNESENJX1JFU0VUX0FMTCkgeworCQl1MTYgdG1wID0gMDsKKworCQkvKgorCQkgKiB0dW5lIHRpbWluZyBvZiByZWFkIGRhdGEvY29tbWFuZCB3aGVuIGNyYyBlcnJvciBoYXBwZW4KKwkJICogbm8gcGVyZm9ybWFuY2UgaW1wYWN0CisJCSAqLworCQlpZiAocGRhdGEtPmNsa19kZWxheV9zZWwgPT0gMSkgeworCQkJdG1wID0gcmVhZHcoaG9zdC0+aW9hZGRyICsgU0RfQ0xPQ0tfQlVSU1RfU0laRV9TRVRVUCk7CisKKwkJCXRtcCAmPSB+KFNEQ0xLX0RFTEFZX01BU0sgPDwgU0RDTEtfREVMQVlfU0hJRlQpOworCQkJdG1wIHw9IChwZGF0YS0+Y2xrX2RlbGF5X2N5Y2xlcyAmIFNEQ0xLX0RFTEFZX01BU0spCisJCQkJPDwgU0RDTEtfREVMQVlfU0hJRlQ7CisJCQl0bXAgJj0gfihTRENMS19TRUxfTUFTSyA8PCBTRENMS19TRUxfU0hJRlQpOworCQkJdG1wIHw9ICgxICYgU0RDTEtfU0VMX01BU0spIDw8IFNEQ0xLX1NFTF9TSElGVDsKKworCQkJd3JpdGV3KHRtcCwgaG9zdC0+aW9hZGRyICsgU0RfQ0xPQ0tfQlVSU1RfU0laRV9TRVRVUCk7CisJCX0KKworCQlpZiAocGRhdGEtPmZsYWdzICYgUFhBX0ZMQUdfRU5BQkxFX0NMT0NLX0dBVElORykgeworCQkJdG1wID0gcmVhZHcoaG9zdC0+aW9hZGRyICsgU0RfRklGT19QQVJBTSk7CisJCQl0bXAgJj0gfkNMS19HQVRFX1NFVFRJTkdfQklUUzsKKwkJCXdyaXRldyh0bXAsIGhvc3QtPmlvYWRkciArIFNEX0ZJRk9fUEFSQU0pOworCQl9IGVsc2UgeworCQkJdG1wID0gcmVhZHcoaG9zdC0+aW9hZGRyICsgU0RfRklGT19QQVJBTSk7CisJCQl0bXAgJj0gfkNMS19HQVRFX1NFVFRJTkdfQklUUzsKKwkJCXRtcCB8PSBDTEtfR0FURV9TRVRUSU5HX0JJVFM7CisJCQl3cml0ZXcodG1wLCBob3N0LT5pb2FkZHIgKyBTRF9GSUZPX1BBUkFNKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBweGF2Ml9tbWNfc2V0X3dpZHRoKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgd2lkdGgpCit7CisJdTggY3RybDsKKwl1MTYgdG1wOworCisJY3RybCA9IHJlYWRiKGhvc3QtPmlvYWRkciArIFNESENJX0hPU1RfQ09OVFJPTCk7CisJdG1wID0gcmVhZHcoaG9zdC0+aW9hZGRyICsgU0RfQ0VfQVRBXzIpOworCWlmICh3aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzgpIHsKKwkJY3RybCAmPSB+U0RIQ0lfQ1RSTF80QklUQlVTOworCQl0bXAgfD0gTU1DX0NBUkQgfCBNTUNfV0lEVEg7CisJfSBlbHNlIHsKKwkJdG1wICY9IH4oTU1DX0NBUkQgfCBNTUNfV0lEVEgpOworCQlpZiAod2lkdGggPT0gTU1DX0JVU19XSURUSF80KQorCQkJY3RybCB8PSBTREhDSV9DVFJMXzRCSVRCVVM7CisJCWVsc2UKKwkJCWN0cmwgJj0gflNESENJX0NUUkxfNEJJVEJVUzsKKwl9CisJd3JpdGV3KHRtcCwgaG9zdC0+aW9hZGRyICsgU0RfQ0VfQVRBXzIpOworCXdyaXRlYihjdHJsLCBob3N0LT5pb2FkZHIgKyBTREhDSV9IT1NUX0NPTlRST0wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgcHhhdjJfZ2V0X21heF9jbG9jayhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisKKwlyZXR1cm4gY2xrX2dldF9yYXRlKHBsdGZtX2hvc3QtPmNsayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2RoY2lfb3BzIHB4YXYyX3NkaGNpX29wcyA9IHsKKwkuZ2V0X21heF9jbG9jayA9IHB4YXYyX2dldF9tYXhfY2xvY2ssCisJLnBsYXRmb3JtX3Jlc2V0X2V4aXQgPSBweGF2Ml9zZXRfcHJpdmF0ZV9yZWdpc3RlcnMsCisJLnBsYXRmb3JtXzhiaXRfd2lkdGggPSBweGF2Ml9tbWNfc2V0X3dpZHRoLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc2RoY2lfcHhhdjJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdDsKKwlzdHJ1Y3Qgc2RoY2lfcHhhX3BsYXRkYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBOVUxMOworCXN0cnVjdCBzZGhjaV9weGEgKnB4YSA9IE5VTEw7CisJaW50IHJldDsKKwlzdHJ1Y3QgY2xrICpjbGs7CisKKwlweGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2RoY2lfcHhhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFweGEpCisJCXJldHVybiAtRU5PTUVNOworCisJaG9zdCA9IHNkaGNpX3BsdGZtX2luaXQocGRldiwgTlVMTCk7CisJaWYgKElTX0VSUihob3N0KSkgeworCQlrZnJlZShweGEpOworCQlyZXR1cm4gUFRSX0VSUihob3N0KTsKKwl9CisJcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJcGx0Zm1faG9zdC0+cHJpdiA9IHB4YTsKKworCWNsayA9IGNsa19nZXQoZGV2LCAiUFhBLVNESENMSyIpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgaW8gY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKGNsayk7CisJCWdvdG8gZXJyX2Nsa19nZXQ7CisJfQorCXBsdGZtX2hvc3QtPmNsayA9IGNsazsKKwljbGtfZW5hYmxlKGNsayk7CisKKwlob3N0LT5xdWlya3MgPSBTREhDSV9RVUlSS19CUk9LRU5fQURNQQorCQl8IFNESENJX1FVSVJLX0JST0tFTl9USU1FT1VUX1ZBTAorCQl8IFNESENJX1FVSVJLX0NBUF9DTE9DS19CQVNFX0JST0tFTjsKKworCWlmIChwZGF0YSkgeworCQlpZiAocGRhdGEtPmZsYWdzICYgUFhBX0ZMQUdfQ0FSRF9QRVJNQU5FTlQpIHsKKwkJCS8qIG9uLWNoaXAgZGV2aWNlICovCisJCQlob3N0LT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfQlJPS0VOX0NBUkRfREVURUNUSU9OOworCQkJaG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfTk9OUkVNT1ZBQkxFOworCQl9CisKKwkJLyogSWYgc2xvdCBkZXNpZ24gc3VwcG9ydHMgOCBiaXQgZGF0YSwgaW5kaWNhdGUgdGhpcyB0byBNTUMuICovCisJCWlmIChwZGF0YS0+ZmxhZ3MgJiBQWEFfRkxBR19TRF84X0JJVF9DQVBBQkxFX1NMT1QpCisJCQlob3N0LT5tbWMtPmNhcHMgfD0gTU1DX0NBUF84X0JJVF9EQVRBOworCisJCWlmIChwZGF0YS0+cXVpcmtzKQorCQkJaG9zdC0+cXVpcmtzIHw9IHBkYXRhLT5xdWlya3M7CisJCWlmIChwZGF0YS0+aG9zdF9jYXBzKQorCQkJaG9zdC0+bW1jLT5jYXBzIHw9IHBkYXRhLT5ob3N0X2NhcHM7CisJCWlmIChwZGF0YS0+cG1fY2FwcykKKwkJCWhvc3QtPm1tYy0+cG1fY2FwcyB8PSBwZGF0YS0+cG1fY2FwczsKKwl9CisKKwlob3N0LT5vcHMgPSAmcHhhdjJfc2RoY2lfb3BzOworCisJcmV0ID0gc2RoY2lfYWRkX2hvc3QoaG9zdCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWRkIGhvc3RcbiIpOworCQlnb3RvIGVycl9hZGRfaG9zdDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBob3N0KTsKKworCXJldHVybiAwOworCitlcnJfYWRkX2hvc3Q6CisJY2xrX2Rpc2FibGUoY2xrKTsKKwljbGtfcHV0KGNsayk7CitlcnJfY2xrX2dldDoKKwlzZGhjaV9wbHRmbV9mcmVlKHBkZXYpOworCWtmcmVlKHB4YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc2RoY2lfcHhhdjJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJc3RydWN0IHNkaGNpX3B4YSAqcHhhID0gcGx0Zm1faG9zdC0+cHJpdjsKKworCXNkaGNpX3JlbW92ZV9ob3N0KGhvc3QsIDEpOworCisJY2xrX2Rpc2FibGUocGx0Zm1faG9zdC0+Y2xrKTsKKwljbGtfcHV0KHBsdGZtX2hvc3QtPmNsayk7CisJc2RoY2lfcGx0Zm1fZnJlZShwZGV2KTsKKwlrZnJlZShweGEpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RoY2lfcHhhdjJfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJzZGhjaS1weGF2MiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHNkaGNpX3B4YXYyX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2RoY2lfcHhhdjJfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHNkaGNpX3BsdGZtX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzZGhjaV9wbHRmbV9yZXN1bWUsCisjZW5kaWYKK307CitzdGF0aWMgaW50IF9faW5pdCBzZGhjaV9weGF2Ml9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2RoY2lfcHhhdjJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNkaGNpX3B4YXYyX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2RoY2lfcHhhdjJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2RoY2lfcHhhdjJfaW5pdCk7Cittb2R1bGVfZXhpdChzZGhjaV9weGF2Ml9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTREhDSSBkcml2ZXIgZm9yIHB4YXYyIik7CitNT0RVTEVfQVVUSE9SKCJNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYzLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5OGRiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhdjMuYwpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICoJCVpoYW5nZmVpIEdhbyA8emhhbmdmZWkuZ2FvQG1hcnZlbGwuY29tPgorICoJCUtldmluIFdhbmcgPGR3YW5nNEBtYXJ2ZWxsLmNvbT4KKyAqCQlNaW5nd2VpIFdhbmcgPG13d2FuZ0BtYXJ2ZWxsLmNvbT4KKyAqCQlQaGlsaXAgUmFraXR5IDxwcmFraXR5QG1hcnZlbGwuY29tPgorICoJCU1hcmsgQnJvd24gPG1hcmtiQG1hcnZlbGwuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3B4YV9zZGhjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInNkaGNpLmgiCisjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKKworI2RlZmluZSBTRF9DTE9DS19CVVJTVF9TSVpFX1NFVFVQCQkweDEwQQorI2RlZmluZSBTRENMS19TRUwJMHgxMDAKKyNkZWZpbmUgU0RDTEtfREVMQVlfU0hJRlQJOQorI2RlZmluZSBTRENMS19ERUxBWV9NQVNLCTB4MWYKKworI2RlZmluZSBTRF9DRkdfRklGT19QQVJBTSAgICAgICAweDEwMAorI2RlZmluZSBTRENGR19HRU5fUEFEX0NMS19PTgkoMTw8NikKKyNkZWZpbmUgU0RDRkdfR0VOX1BBRF9DTEtfQ05UX01BU0sJMHhGRgorI2RlZmluZSBTRENGR19HRU5fUEFEX0NMS19DTlRfU0hJRlQJMjQKKworI2RlZmluZSBTRF9TUElfTU9ERSAgICAgICAgICAweDEwOAorI2RlZmluZSBTRF9DRV9BVEFfMSAgICAgICAgICAweDEwQworCisjZGVmaW5lIFNEX0NFX0FUQV8yICAgICAgICAgIDB4MTBFCisjZGVmaW5lIFNEQ0VfTUlTQ19JTlQJCSgxPDwyKQorI2RlZmluZSBTRENFX01JU0NfSU5UX0VOCSgxPDwxKQorCitzdGF0aWMgdm9pZCBweGF2M19zZXRfcHJpdmF0ZV9yZWdpc3RlcnMoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHU4IG1hc2spCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShtbWNfZGV2KGhvc3QtPm1tYykpOworCXN0cnVjdCBzZGhjaV9weGFfcGxhdGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAobWFzayA9PSBTREhDSV9SRVNFVF9BTEwpIHsKKwkJLyoKKwkJICogdHVuZSB0aW1pbmcgb2YgcmVhZCBkYXRhL2NvbW1hbmQgd2hlbiBjcmMgZXJyb3IgaGFwcGVuCisJCSAqIG5vIHBlcmZvcm1hbmNlIGltcGFjdAorCQkgKi8KKwkJaWYgKHBkYXRhICYmIDAgIT0gcGRhdGEtPmNsa19kZWxheV9jeWNsZXMpIHsKKwkJCXUxNiB0bXA7CisKKwkJCXRtcCA9IHJlYWR3KGhvc3QtPmlvYWRkciArIFNEX0NMT0NLX0JVUlNUX1NJWkVfU0VUVVApOworCQkJdG1wIHw9IChwZGF0YS0+Y2xrX2RlbGF5X2N5Y2xlcyAmIFNEQ0xLX0RFTEFZX01BU0spCisJCQkJPDwgU0RDTEtfREVMQVlfU0hJRlQ7CisJCQl0bXAgfD0gU0RDTEtfU0VMOworCQkJd3JpdGV3KHRtcCwgaG9zdC0+aW9hZGRyICsgU0RfQ0xPQ0tfQlVSU1RfU0laRV9TRVRVUCk7CisJCX0KKwl9Cit9CisKKyNkZWZpbmUgTUFYX1dBSVRfQ09VTlQgNQorc3RhdGljIHZvaWQgcHhhdjNfZ2VuX2luaXRfNzRfY2xvY2tzKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1OCBwb3dlcl9tb2RlKQoreworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3Qgc2RoY2lfcHhhICpweGEgPSBwbHRmbV9ob3N0LT5wcml2OworCXUxNiB0bXA7CisJaW50IGNvdW50OworCisJaWYgKHB4YS0+cG93ZXJfbW9kZSA9PSBNTUNfUE9XRVJfVVAKKwkJCSYmIHBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX09OKSB7CisKKwkJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksCisJCQkJIiVzOiBzbG90LT5wb3dlcl9tb2RlID0gJWQsIgorCQkJCSJpb3MtPnBvd2VyX21vZGUgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlweGEtPnBvd2VyX21vZGUsCisJCQkJcG93ZXJfbW9kZSk7CisKKwkJLyogc2V0IHdlIHdhbnQgbm90aWNlIG9mIHdoZW4gNzQgY2xvY2tzIGFyZSBzZW50ICovCisJCXRtcCA9IHJlYWR3KGhvc3QtPmlvYWRkciArIFNEX0NFX0FUQV8yKTsKKwkJdG1wIHw9IFNEQ0VfTUlTQ19JTlRfRU47CisJCXdyaXRldyh0bXAsIGhvc3QtPmlvYWRkciArIFNEX0NFX0FUQV8yKTsKKworCQkvKiBzdGFydCBzZW5kaW5nIHRoZSA3NCBjbG9ja3MgKi8KKwkJdG1wID0gcmVhZHcoaG9zdC0+aW9hZGRyICsgU0RfQ0ZHX0ZJRk9fUEFSQU0pOworCQl0bXAgfD0gU0RDRkdfR0VOX1BBRF9DTEtfT047CisJCXdyaXRldyh0bXAsIGhvc3QtPmlvYWRkciArIFNEX0NGR19GSUZPX1BBUkFNKTsKKworCQkvKiBzbG93ZXN0IHNwZWVkIGlzIGFib3V0IDEwMEtIeiBvciAxMHVzZWMgcGVyIGNsb2NrICovCisJCXVkZWxheSg3NDApOworCQljb3VudCA9IDA7CisKKwkJd2hpbGUgKGNvdW50KysgPCBNQVhfV0FJVF9DT1VOVCkgeworCQkJaWYgKChyZWFkdyhob3N0LT5pb2FkZHIgKyBTRF9DRV9BVEFfMikKKwkJCQkJCSYgU0RDRV9NSVNDX0lOVCkgPT0gMCkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxMCk7CisJCX0KKworCQlpZiAoY291bnQgPT0gTUFYX1dBSVRfQ09VTlQpCisJCQlkZXZfd2FybihtbWNfZGV2KGhvc3QtPm1tYyksICI3NCBjbG9jayBpbnRlcnJ1cHQgbm90IGNsZWFyZWRcbiIpOworCisJCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgYml0IGlmIHBvc3RlZCAqLworCQl0bXAgPSByZWFkdyhob3N0LT5pb2FkZHIgKyBTRF9DRV9BVEFfMik7CisJCXRtcCB8PSBTRENFX01JU0NfSU5UOworCQl3cml0ZXcodG1wLCBob3N0LT5pb2FkZHIgKyBTRF9DRV9BVEFfMik7CisJfQorCXB4YS0+cG93ZXJfbW9kZSA9IHBvd2VyX21vZGU7Cit9CisKK3N0YXRpYyBpbnQgcHhhdjNfc2V0X3Voc19zaWduYWxpbmcoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCB1aHMpCit7CisJdTE2IGN0cmxfMjsKKworCS8qCisJICogU2V0IFYxOF9FTiAtLSBVSFMgbW9kZXMgZG8gbm90IHdvcmsgd2l0aG91dCB0aGlzLgorCSAqIGRvZXMgbm90IGNoYW5nZSBzaWduYWxpbmcgdm9sdGFnZQorCSAqLworCWN0cmxfMiA9IHNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0hPU1RfQ09OVFJPTDIpOworCisJLyogU2VsZWN0IEJ1cyBTcGVlZCBNb2RlIGZvciBob3N0ICovCisJY3RybF8yICY9IH5TREhDSV9DVFJMX1VIU19NQVNLOworCXN3aXRjaCAodWhzKSB7CisJY2FzZSBNTUNfVElNSU5HX1VIU19TRFIxMjoKKwkJY3RybF8yIHw9IFNESENJX0NUUkxfVUhTX1NEUjEyOworCQlicmVhazsKKwljYXNlIE1NQ19USU1JTkdfVUhTX1NEUjI1OgorCQljdHJsXzIgfD0gU0RIQ0lfQ1RSTF9VSFNfU0RSMjU7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19VSFNfU0RSNTA6CisJCWN0cmxfMiB8PSBTREhDSV9DVFJMX1VIU19TRFI1MCB8IFNESENJX0NUUkxfVkREXzE4MDsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX1VIU19TRFIxMDQ6CisJCWN0cmxfMiB8PSBTREhDSV9DVFJMX1VIU19TRFIxMDQgfCBTREhDSV9DVFJMX1ZERF8xODA7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19VSFNfRERSNTA6CisJCWN0cmxfMiB8PSBTREhDSV9DVFJMX1VIU19ERFI1MCB8IFNESENJX0NUUkxfVkREXzE4MDsKKwkJYnJlYWs7CisJfQorCisJc2RoY2lfd3JpdGV3KGhvc3QsIGN0cmxfMiwgU0RIQ0lfSE9TVF9DT05UUk9MMik7CisJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksCisJCSIlcyB1aHMgPSAlZCwgY3RybF8yID0gJTA0WFxuIiwKKwkJX19mdW5jX18sIHVocywgY3RybF8yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNkaGNpX29wcyBweGF2M19zZGhjaV9vcHMgPSB7CisJLnBsYXRmb3JtX3Jlc2V0X2V4aXQgPSBweGF2M19zZXRfcHJpdmF0ZV9yZWdpc3RlcnMsCisJLnNldF91aHNfc2lnbmFsaW5nID0gcHhhdjNfc2V0X3Voc19zaWduYWxpbmcsCisJLnBsYXRmb3JtX3NlbmRfaW5pdF83NF9jbG9ja3MgPSBweGF2M19nZW5faW5pdF83NF9jbG9ja3MsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzZGhjaV9weGF2M19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0OworCXN0cnVjdCBzZGhjaV9weGFfcGxhdGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IE5VTEw7CisJc3RydWN0IHNkaGNpX3B4YSAqcHhhID0gTlVMTDsKKwlpbnQgcmV0OworCXN0cnVjdCBjbGsgKmNsazsKKworCXB4YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZGhjaV9weGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB4YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlob3N0ID0gc2RoY2lfcGx0Zm1faW5pdChwZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKGhvc3QpKSB7CisJCWtmcmVlKHB4YSk7CisJCXJldHVybiBQVFJfRVJSKGhvc3QpOworCX0KKwlwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlwbHRmbV9ob3N0LT5wcml2ID0gcHhhOworCisJY2xrID0gY2xrX2dldChkZXYsICJQWEEtU0RIQ0xLIik7CisJaWYgKElTX0VSUihjbGspKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBpbyBjbG9ja1xuIik7CisJCXJldCA9IFBUUl9FUlIoY2xrKTsKKwkJZ290byBlcnJfY2xrX2dldDsKKwl9CisJcGx0Zm1faG9zdC0+Y2xrID0gY2xrOworCWNsa19lbmFibGUoY2xrKTsKKworCWhvc3QtPnF1aXJrcyA9IFNESENJX1FVSVJLX0JST0tFTl9USU1FT1VUX1ZBTAorCQl8IFNESENJX1FVSVJLX05PX0VOREFUVFJfSU5fTk9QREVTQzsKKworCS8qIGVuYWJsZSAxLzhWIEREUiBjYXBhYmxlICovCisJaG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfMV84Vl9ERFI7CisKKwlpZiAocGRhdGEpIHsKKwkJaWYgKHBkYXRhLT5mbGFncyAmIFBYQV9GTEFHX0NBUkRfUEVSTUFORU5UKSB7CisJCQkvKiBvbi1jaGlwIGRldmljZSAqLworCQkJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX0JST0tFTl9DQVJEX0RFVEVDVElPTjsKKwkJCWhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQX05PTlJFTU9WQUJMRTsKKwkJfQorCisJCS8qIElmIHNsb3QgZGVzaWduIHN1cHBvcnRzIDggYml0IGRhdGEsIGluZGljYXRlIHRoaXMgdG8gTU1DLiAqLworCQlpZiAocGRhdGEtPmZsYWdzICYgUFhBX0ZMQUdfU0RfOF9CSVRfQ0FQQUJMRV9TTE9UKQorCQkJaG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfOF9CSVRfREFUQTsKKworCQlpZiAocGRhdGEtPnF1aXJrcykKKwkJCWhvc3QtPnF1aXJrcyB8PSBwZGF0YS0+cXVpcmtzOworCQlpZiAocGRhdGEtPmhvc3RfY2FwcykKKwkJCWhvc3QtPm1tYy0+Y2FwcyB8PSBwZGF0YS0+aG9zdF9jYXBzOworCQlpZiAocGRhdGEtPnBtX2NhcHMpCisJCQlob3N0LT5tbWMtPnBtX2NhcHMgfD0gcGRhdGEtPnBtX2NhcHM7CisJfQorCisJaG9zdC0+b3BzID0gJnB4YXYzX3NkaGNpX29wczsKKworCXJldCA9IHNkaGNpX2FkZF9ob3N0KGhvc3QpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBob3N0XG4iKTsKKwkJZ290byBlcnJfYWRkX2hvc3Q7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX2FkZF9ob3N0OgorCWNsa19kaXNhYmxlKGNsayk7CisJY2xrX3B1dChjbGspOworZXJyX2Nsa19nZXQ6CisJc2RoY2lfcGx0Zm1fZnJlZShwZGV2KTsKKwlrZnJlZShweGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNkaGNpX3B4YXYzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOworCXN0cnVjdCBzZGhjaV9weGEgKnB4YSA9IHBsdGZtX2hvc3QtPnByaXY7CisKKwlzZGhjaV9yZW1vdmVfaG9zdChob3N0LCAxKTsKKworCWNsa19kaXNhYmxlKHBsdGZtX2hvc3QtPmNsayk7CisJY2xrX3B1dChwbHRmbV9ob3N0LT5jbGspOworCXNkaGNpX3BsdGZtX2ZyZWUocGRldik7CisJa2ZyZWUocHhhKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNkaGNpX3B4YXYzX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAic2RoY2ktcHhhdjMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzZGhjaV9weGF2M19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNkaGNpX3B4YXYzX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBzZGhjaV9wbHRmbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2RoY2lfcGx0Zm1fcmVzdW1lLAorI2VuZGlmCit9Oworc3RhdGljIGludCBfX2luaXQgc2RoY2lfcHhhdjNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNkaGNpX3B4YXYzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZGhjaV9weGF2M19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNkaGNpX3B4YXYzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNkaGNpX3B4YXYzX2luaXQpOworbW9kdWxlX2V4aXQoc2RoY2lfcHhhdjNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU0RIQ0kgZHJpdmVyIGZvciBweGF2MyIpOworTU9EVUxFX0FVVEhPUigiTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktczNjLmMKaW5kZXggNjllM2VlMy4uNDYwZmZhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXMzYy5jCkBAIC02MTIsMTYgKzYxMiwxNCBAQAogewogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAotCXNkaGNpX3N1c3BlbmRfaG9zdChob3N0LCBwbSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNkaGNpX3N1c3BlbmRfaG9zdChob3N0LCBwbSk7CiB9CiAKIHN0YXRpYyBpbnQgc2RoY2lfczNjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCi0Jc2RoY2lfcmVzdW1lX2hvc3QoaG9zdCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNkaGNpX3Jlc3VtZV9ob3N0KGhvc3QpOwogfQogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jCmluZGV4IDM0M2M5N2UuLjE4YjBiZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3NkaGNpLmg+CiAKLSNpbmNsdWRlICJzZGhjaS5oIgogI2luY2x1ZGUgInNkaGNpLXBsdGZtLmgiCiAKIHN0YXRpYyB1MzIgdGVncmFfc2RoY2lfcmVhZGwoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCByZWcpCkBAIC0xMTYsMjAgKzExNSw0MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHNkaGNpX29wcyB0ZWdyYV9zZGhjaV9vcHMgPSB7CisJLmdldF9ybyAgICAgPSB0ZWdyYV9zZGhjaV9nZXRfcm8sCisJLnJlYWRfbCAgICAgPSB0ZWdyYV9zZGhjaV9yZWFkbCwKKwkucmVhZF93ICAgICA9IHRlZ3JhX3NkaGNpX3JlYWR3LAorCS53cml0ZV9sICAgID0gdGVncmFfc2RoY2lfd3JpdGVsLAorCS5wbGF0Zm9ybV84Yml0X3dpZHRoID0gdGVncmFfc2RoY2lfOGJpdCwKK307CiAKLXN0YXRpYyBpbnQgdGVncmFfc2RoY2lfcGx0Zm1faW5pdChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKLQkJCQkgIHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhICpwZGF0YSkKK3N0YXRpYyBzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV90ZWdyYV9wZGF0YSA9IHsKKwkucXVpcmtzID0gU0RIQ0lfUVVJUktfQlJPS0VOX1RJTUVPVVRfVkFMIHwKKwkJICBTREhDSV9RVUlSS19TSU5HTEVfUE9XRVJfV1JJVEUgfAorCQkgIFNESENJX1FVSVJLX05PX0hJU1BEX0JJVCB8CisJCSAgU0RIQ0lfUVVJUktfQlJPS0VOX0FETUFfWkVST0xFTl9ERVNDLAorCS5vcHMgID0gJnRlZ3JhX3NkaGNpX29wcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNkaGNpX3RlZ3JhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UobW1jX2Rldihob3N0LT5tbWMpKTsKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdDsKIAlzdHJ1Y3QgdGVncmFfc2RoY2lfcGxhdGZvcm1fZGF0YSAqcGxhdDsKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJaW50IHJjOwogCisJaG9zdCA9IHNkaGNpX3BsdGZtX2luaXQocGRldiwgJnNkaGNpX3RlZ3JhX3BkYXRhKTsKKwlpZiAoSVNfRVJSKGhvc3QpKQorCQlyZXR1cm4gUFRSX0VSUihob3N0KTsKKworCXBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOworCiAJcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCiAJaWYgKHBsYXQgPT0gTlVMTCkgewogCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgIm1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7Ci0JCXJldHVybiAtRU5YSU87CisJCXJjID0gLUVOWElPOworCQlnb3RvIGVycl9ub19wbGF0OwogCX0KIAogCWlmIChncGlvX2lzX3ZhbGlkKHBsYXQtPnBvd2VyX2dwaW8pKSB7CkBAIC0xMzcsNyArMTU4LDcgQEAKIAkJaWYgKHJjKSB7CiAJCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwKIAkJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIHBvd2VyIGdwaW9cbiIpOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIGVycl9wb3dlcl9yZXE7CiAJCX0KIAkJdGVncmFfZ3Bpb19lbmFibGUocGxhdC0+cG93ZXJfZ3Bpbyk7CiAJCWdwaW9fZGlyZWN0aW9uX291dHB1dChwbGF0LT5wb3dlcl9ncGlvLCAxKTsKQEAgLTE0OCw3ICsxNjksNyBAQAogCQlpZiAocmMpIHsKIAkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLAogCQkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgY2QgZ3Bpb1xuIik7Ci0JCQlnb3RvIG91dF9wb3dlcjsKKwkJCWdvdG8gZXJyX2NkX3JlcTsKIAkJfQogCQl0ZWdyYV9ncGlvX2VuYWJsZShwbGF0LT5jZF9ncGlvKTsKIAkJZ3Bpb19kaXJlY3Rpb25faW5wdXQocGxhdC0+Y2RfZ3Bpbyk7CkBAIC0xNTksNyArMTgwLDcgQEAKIAogCQlpZiAocmMpCXsKIAkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAicmVxdWVzdCBpcnEgZXJyb3JcbiIpOwotCQkJZ290byBvdXRfY2Q7CisJCQlnb3RvIGVycl9jZF9pcnFfcmVxOwogCQl9CiAKIAl9CkBAIC0xNjksNyArMTkwLDcgQEAKIAkJaWYgKHJjKSB7CiAJCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwKIAkJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIHdwIGdwaW9cbiIpOwotCQkJZ290byBvdXRfaXJxOworCQkJZ290byBlcnJfd3BfcmVxOwogCQl9CiAJCXRlZ3JhX2dwaW9fZW5hYmxlKHBsYXQtPndwX2dwaW8pOwogCQlncGlvX2RpcmVjdGlvbl9pbnB1dChwbGF0LT53cF9ncGlvKTsKQEAgLTE3OSw3ICsyMDAsNyBAQAogCWlmIChJU19FUlIoY2xrKSkgewogCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgImNsayBlcnJcbiIpOwogCQlyYyA9IFBUUl9FUlIoY2xrKTsKLQkJZ290byBvdXRfd3A7CisJCWdvdG8gZXJyX2Nsa19nZXQ7CiAJfQogCWNsa19lbmFibGUoY2xrKTsKIAlwbHRmbV9ob3N0LT5jbGsgPSBjbGs7CkBAIC0xODksMzggKzIxMCw0NyBAQAogCWlmIChwbGF0LT5pc184Yml0KQogCQlob3N0LT5tbWMtPmNhcHMgfD0gTU1DX0NBUF84X0JJVF9EQVRBOwogCisJcmMgPSBzZGhjaV9hZGRfaG9zdChob3N0KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX2FkZF9ob3N0OworCiAJcmV0dXJuIDA7CiAKLW91dF93cDoKK2Vycl9hZGRfaG9zdDoKKwljbGtfZGlzYWJsZShwbHRmbV9ob3N0LT5jbGspOworCWNsa19wdXQocGx0Zm1faG9zdC0+Y2xrKTsKK2Vycl9jbGtfZ2V0OgogCWlmIChncGlvX2lzX3ZhbGlkKHBsYXQtPndwX2dwaW8pKSB7CiAJCXRlZ3JhX2dwaW9fZGlzYWJsZShwbGF0LT53cF9ncGlvKTsKIAkJZ3Bpb19mcmVlKHBsYXQtPndwX2dwaW8pOwogCX0KLQotb3V0X2lycToKK2Vycl93cF9yZXE6CiAJaWYgKGdwaW9faXNfdmFsaWQocGxhdC0+Y2RfZ3BpbykpCiAJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBsYXQtPmNkX2dwaW8pLCBob3N0KTsKLW91dF9jZDoKK2Vycl9jZF9pcnFfcmVxOgogCWlmIChncGlvX2lzX3ZhbGlkKHBsYXQtPmNkX2dwaW8pKSB7CiAJCXRlZ3JhX2dwaW9fZGlzYWJsZShwbGF0LT5jZF9ncGlvKTsKIAkJZ3Bpb19mcmVlKHBsYXQtPmNkX2dwaW8pOwogCX0KLQotb3V0X3Bvd2VyOgorZXJyX2NkX3JlcToKIAlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT5wb3dlcl9ncGlvKSkgewogCQl0ZWdyYV9ncGlvX2Rpc2FibGUocGxhdC0+cG93ZXJfZ3Bpbyk7CiAJCWdwaW9fZnJlZShwbGF0LT5wb3dlcl9ncGlvKTsKIAl9Ci0KLW91dDoKK2Vycl9wb3dlcl9yZXE6CitlcnJfbm9fcGxhdDoKKwlzZGhjaV9wbHRmbV9mcmVlKHBkZXYpOwogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgdGVncmFfc2RoY2lfcGx0Zm1fZXhpdChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNkaGNpX3RlZ3JhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UobW1jX2Rldihob3N0LT5tbWMpKTsKIAlzdHJ1Y3QgdGVncmFfc2RoY2lfcGxhdGZvcm1fZGF0YSAqcGxhdDsKKwlpbnQgZGVhZCA9IChyZWFkbChob3N0LT5pb2FkZHIgKyBTREhDSV9JTlRfU1RBVFVTKSA9PSAweGZmZmZmZmZmKTsKKworCXNkaGNpX3JlbW92ZV9ob3N0KGhvc3QsIGRlYWQpOwogCiAJcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCkBAIC0yNDIsMjIgKzI3MiwzNyBAQAogCiAJY2xrX2Rpc2FibGUocGx0Zm1faG9zdC0+Y2xrKTsKIAljbGtfcHV0KHBsdGZtX2hvc3QtPmNsayk7CisKKwlzZGhjaV9wbHRmbV9mcmVlKHBkZXYpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2RoY2lfb3BzIHRlZ3JhX3NkaGNpX29wcyA9IHsKLQkuZ2V0X3JvICAgICA9IHRlZ3JhX3NkaGNpX2dldF9ybywKLQkucmVhZF9sICAgICA9IHRlZ3JhX3NkaGNpX3JlYWRsLAotCS5yZWFkX3cgICAgID0gdGVncmFfc2RoY2lfcmVhZHcsCi0JLndyaXRlX2wgICAgPSB0ZWdyYV9zZGhjaV93cml0ZWwsCi0JLnBsYXRmb3JtXzhiaXRfd2lkdGggPSB0ZWdyYV9zZGhjaV84Yml0LAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RoY2lfdGVncmFfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJzZGhjaS10ZWdyYSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHNkaGNpX3RlZ3JhX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2RoY2lfdGVncmFfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHNkaGNpX3BsdGZtX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzZGhjaV9wbHRmbV9yZXN1bWUsCisjZW5kaWYKIH07CiAKLXN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX3RlZ3JhX3BkYXRhID0gewotCS5xdWlya3MgPSBTREhDSV9RVUlSS19CUk9LRU5fVElNRU9VVF9WQUwgfAotCQkgIFNESENJX1FVSVJLX1NJTkdMRV9QT1dFUl9XUklURSB8Ci0JCSAgU0RIQ0lfUVVJUktfTk9fSElTUERfQklUIHwKLQkJICBTREhDSV9RVUlSS19CUk9LRU5fQURNQV9aRVJPTEVOX0RFU0MsCi0JLm9wcyAgPSAmdGVncmFfc2RoY2lfb3BzLAotCS5pbml0ID0gdGVncmFfc2RoY2lfcGx0Zm1faW5pdCwKLQkuZXhpdCA9IHRlZ3JhX3NkaGNpX3BsdGZtX2V4aXQsCi19Oworc3RhdGljIGludCBfX2luaXQgc2RoY2lfdGVncmFfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNkaGNpX3RlZ3JhX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChzZGhjaV90ZWdyYV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHNkaGNpX3RlZ3JhX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2RoY2lfdGVncmFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNkaGNpX3RlZ3JhX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNESENJIGRyaXZlciBmb3IgVGVncmEiKTsKK01PRFVMRV9BVVRIT1IoIiBHb29nbGUsIEluYy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYwppbmRleCA1OGQ1NDM2Li5jMzFhMzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCkBAIC0xMjcsMTEgKzEyNywxNSBAQAogCiBzdGF0aWMgdm9pZCBzZGhjaV9zZXRfY2FyZF9kZXRlY3Rpb24oc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGJvb2wgZW5hYmxlKQogewotCXUzMiBpcnFzID0gU0RIQ0lfSU5UX0NBUkRfUkVNT1ZFIHwgU0RIQ0lfSU5UX0NBUkRfSU5TRVJUOworCXUzMiBwcmVzZW50LCBpcnFzOwogCiAJaWYgKGhvc3QtPnF1aXJrcyAmIFNESENJX1FVSVJLX0JST0tFTl9DQVJEX0RFVEVDVElPTikKIAkJcmV0dXJuOwogCisJcHJlc2VudCA9IHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX1BSRVNFTlRfU1RBVEUpICYKKwkJCSAgICAgIFNESENJX0NBUkRfUFJFU0VOVDsKKwlpcnFzID0gcHJlc2VudCA/IFNESENJX0lOVF9DQVJEX1JFTU9WRSA6IFNESENJX0lOVF9DQVJEX0lOU0VSVDsKKwogCWlmIChlbmFibGUpCiAJCXNkaGNpX3VubWFza19pcnFzKGhvc3QsIGlycXMpOwogCWVsc2UKQEAgLTIxNTQsMTMgKzIxNTgsMzAgQEAKIAkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksIGludG1hc2spOwogCiAJaWYgKGludG1hc2sgJiAoU0RIQ0lfSU5UX0NBUkRfSU5TRVJUIHwgU0RIQ0lfSU5UX0NBUkRfUkVNT1ZFKSkgeworCQl1MzIgcHJlc2VudCA9IHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX1BSRVNFTlRfU1RBVEUpICYKKwkJCSAgICAgIFNESENJX0NBUkRfUFJFU0VOVDsKKworCQkvKgorCQkgKiBUaGVyZSBpcyBhIG9ic2VydmF0aW9uIG9uIGkubXggZXNkaGMuICBJTlNFUlQgYml0IHdpbGwgYmUKKwkJICogaW1tZWRpYXRlbHkgc2V0IGFnYWluIHdoZW4gaXQgZ2V0cyBjbGVhcmVkLCBpZiBhIGNhcmQgaXMKKwkJICogaW5zZXJ0ZWQuICBXZSBoYXZlIHRvIG1hc2sgdGhlIGlycSB0byBwcmV2ZW50IGludGVycnVwdAorCQkgKiBzdG9ybSB3aGljaCB3aWxsIGZyZWV6ZSB0aGUgc3lzdGVtLiAgQW5kIHRoZSBSRU1PVkUgZ2V0cworCQkgKiB0aGUgc2FtZSBzaXR1YXRpb24uCisJCSAqCisJCSAqIE1vcmUgdGVzdGluZyBhcmUgbmVlZGVkIGhlcmUgdG8gZW5zdXJlIGl0IHdvcmtzIGZvciBvdGhlcgorCQkgKiBwbGF0Zm9ybXMgdGhvdWdoLgorCQkgKi8KKwkJc2RoY2lfbWFza19pcnFzKGhvc3QsIHByZXNlbnQgPyBTREhDSV9JTlRfQ0FSRF9JTlNFUlQgOgorCQkJCQkJU0RIQ0lfSU5UX0NBUkRfUkVNT1ZFKTsKKwkJc2RoY2lfdW5tYXNrX2lycXMoaG9zdCwgcHJlc2VudCA/IFNESENJX0lOVF9DQVJEX1JFTU9WRSA6CisJCQkJCQkgIFNESENJX0lOVF9DQVJEX0lOU0VSVCk7CisKIAkJc2RoY2lfd3JpdGVsKGhvc3QsIGludG1hc2sgJiAoU0RIQ0lfSU5UX0NBUkRfSU5TRVJUIHwKLQkJCVNESENJX0lOVF9DQVJEX1JFTU9WRSksIFNESENJX0lOVF9TVEFUVVMpOworCQkJICAgICBTREhDSV9JTlRfQ0FSRF9SRU1PVkUpLCBTREhDSV9JTlRfU1RBVFVTKTsKKwkJaW50bWFzayAmPSB+KFNESENJX0lOVF9DQVJEX0lOU0VSVCB8IFNESENJX0lOVF9DQVJEX1JFTU9WRSk7CiAJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPmNhcmRfdGFza2xldCk7CiAJfQogCi0JaW50bWFzayAmPSB+KFNESENJX0lOVF9DQVJEX0lOU0VSVCB8IFNESENJX0lOVF9DQVJEX1JFTU9WRSk7Ci0KIAlpZiAoaW50bWFzayAmIFNESENJX0lOVF9DTURfTUFTSykgewogCQlzZGhjaV93cml0ZWwoaG9zdCwgaW50bWFzayAmIFNESENJX0lOVF9DTURfTUFTSywKIAkJCVNESENJX0lOVF9TVEFUVVMpOwpAQCAtMjQ4OCw2ICsyNTA5LDExIEBACiAJfSBlbHNlCiAJCW1tYy0+Zl9taW4gPSBob3N0LT5tYXhfY2xrIC8gU0RIQ0lfTUFYX0RJVl9TUEVDXzIwMDsKIAorCWlmIChob3N0LT5xdWlya3MgJiBTREhDSV9RVUlSS19EQVRBX1RJTUVPVVRfVVNFU19TRENMSykKKwkJbW1jLT5tYXhfZGlzY2FyZF90byA9ICgxIDw8IDI3KSAvIChtbWMtPmZfbWF4IC8gMTAwMCk7CisJZWxzZQorCQltbWMtPm1heF9kaXNjYXJkX3RvID0gKDEgPDwgMjcpIC8gaG9zdC0+dGltZW91dF9jbGs7CisKIAltbWMtPmNhcHMgfD0gTU1DX0NBUF9TRElPX0lSUSB8IE1NQ19DQVBfRVJBU0UgfCBNTUNfQ0FQX0NNRDIzOwogCiAJaWYgKGhvc3QtPnF1aXJrcyAmIFNESENJX1FVSVJLX01VTFRJQkxPQ0tfUkVBRF9BQ01EMTIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NoX21tY2lmLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NoX21tY2lmLmMKaW5kZXggMTRmOGVkYi4uNTU3ODg2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zaF9tbWNpZi5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW1jaWYuYwpAQCAtMTc1LDYgKzE3NSw3IEBACiAJZW51bSBtbWNpZl9zdGF0ZSBzdGF0ZTsKIAlzcGlubG9ja190IGxvY2s7CiAJYm9vbCBwb3dlcjsKKwlib29sIGNhcmRfcHJlc2VudDsKIAogCS8qIERNQSBzdXBwb3J0ICovCiAJc3RydWN0IGRtYV9jaGFuCQkqY2hhbl9yeDsKQEAgLTg3NywyMyArODc4LDIzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGlvcy0+cG93ZXJfbW9kZSA9PSBNTUNfUE9XRVJfVVApIHsKLQkJaWYgKHAtPnNldF9wd3IpCi0JCQlwLT5zZXRfcHdyKGhvc3QtPnBkLCBpb3MtPnBvd2VyX21vZGUpOwotCQlpZiAoIWhvc3QtPnBvd2VyKSB7CisJCWlmICghaG9zdC0+Y2FyZF9wcmVzZW50KSB7CiAJCQkvKiBTZWUgaWYgd2UgYWxzbyBnZXQgRE1BICovCiAJCQlzaF9tbWNpZl9yZXF1ZXN0X2RtYShob3N0LCBob3N0LT5wZC0+ZGV2LnBsYXRmb3JtX2RhdGEpOwotCQkJcG1fcnVudGltZV9nZXRfc3luYygmaG9zdC0+cGQtPmRldik7Ci0JCQlob3N0LT5wb3dlciA9IHRydWU7CisJCQlob3N0LT5jYXJkX3ByZXNlbnQgPSB0cnVlOwogCQl9CiAJfSBlbHNlIGlmIChpb3MtPnBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX09GRiB8fCAhaW9zLT5jbG9jaykgewogCQkvKiBjbG9jayBzdG9wICovCiAJCXNoX21tY2lmX2Nsb2NrX2NvbnRyb2woaG9zdCwgMCk7CiAJCWlmIChpb3MtPnBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX09GRikgewotCQkJaWYgKGhvc3QtPnBvd2VyKSB7Ci0JCQkJcG1fcnVudGltZV9wdXQoJmhvc3QtPnBkLT5kZXYpOworCQkJaWYgKGhvc3QtPmNhcmRfcHJlc2VudCkgewogCQkJCXNoX21tY2lmX3JlbGVhc2VfZG1hKGhvc3QpOwotCQkJCWhvc3QtPnBvd2VyID0gZmFsc2U7CisJCQkJaG9zdC0+Y2FyZF9wcmVzZW50ID0gZmFsc2U7CiAJCQl9CisJCX0KKwkJaWYgKGhvc3QtPnBvd2VyKSB7CisJCQlwbV9ydW50aW1lX3B1dCgmaG9zdC0+cGQtPmRldik7CisJCQlob3N0LT5wb3dlciA9IGZhbHNlOwogCQkJaWYgKHAtPmRvd25fcHdyKQogCQkJCXAtPmRvd25fcHdyKGhvc3QtPnBkKTsKIAkJfQpAQCAtOTAxLDggKzkwMiwxNiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGlvcy0+Y2xvY2spCisJaWYgKGlvcy0+Y2xvY2spIHsKKwkJaWYgKCFob3N0LT5wb3dlcikgeworCQkJaWYgKHAtPnNldF9wd3IpCisJCQkJcC0+c2V0X3B3cihob3N0LT5wZCwgaW9zLT5wb3dlcl9tb2RlKTsKKwkJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJmhvc3QtPnBkLT5kZXYpOworCQkJaG9zdC0+cG93ZXIgPSB0cnVlOworCQkJc2hfbW1jaWZfc3luY19yZXNldChob3N0KTsKKwkJfQogCQlzaF9tbWNpZl9jbG9ja19jb250cm9sKGhvc3QsIGlvcy0+Y2xvY2spOworCX0KIAogCWhvc3QtPmJ1c193aWR0aCA9IGlvcy0+YnVzX3dpZHRoOwogCWhvc3QtPnN0YXRlID0gU1RBVEVfSURMRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYwppbmRleCBiMzY1NDI5Li43NzRmNjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NoX21vYmlsZV9zZGhpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zaF9tb2JpbGVfc2RoaS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW1jL3NoX21vYmlsZV9zZGhpLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3RtaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zaF9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSAidG1pb19tbWMuaCIKIApAQCAtNTUsNiArNTYsMzkgQEAKIAkJcmV0dXJuIC1FTk9TWVM7CiB9CiAKK3N0YXRpYyBpbnQgc2hfbW9iaWxlX3NkaGlfd2FpdF9pZGxlKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0KQoreworCWludCB0aW1lb3V0ID0gMTAwMDsKKworCXdoaWxlICgtLXRpbWVvdXQgJiYgIShzZF9jdHJsX3JlYWQxNihob3N0LCBDVExfU1RBVFVTMikgJiAoMSA8PCAxMykpKQorCQl1ZGVsYXkoMSk7CisKKwlpZiAoIXRpbWVvdXQpIHsKKwkJZGV2X3dhcm4oaG9zdC0+cGRhdGEtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgU0QgYnVzIGlkbGVcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoX21vYmlsZV9zZGhpX3dyaXRlMTZfaG9vayhzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIpCit7CisJc3dpdGNoIChhZGRyKQorCXsKKwljYXNlIENUTF9TRF9DTUQ6CisJY2FzZSBDVExfU1RPUF9JTlRFUk5BTF9BQ1RJT046CisJY2FzZSBDVExfWEZFUl9CTEtfQ09VTlQ6CisJY2FzZSBDVExfU0RfQ0FSRF9DTEtfQ1RMOgorCWNhc2UgQ1RMX1NEX1hGRVJfTEVOOgorCWNhc2UgQ1RMX1NEX01FTV9DQVJEX09QVDoKKwljYXNlIENUTF9UUkFOU0FDVElPTl9DVEw6CisJY2FzZSBDVExfRE1BX0VOQUJMRToKKwkJcmV0dXJuIHNoX21vYmlsZV9zZGhpX3dhaXRfaWRsZShob3N0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgc2hfbW9iaWxlX3NkaGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGkgKnByaXY7CkBAIC04NiwxMyArMTIwLDE1IEBACiAJbW1jX2RhdGEtPmhjbGsgPSBjbGtfZ2V0X3JhdGUocHJpdi0+Y2xrKTsKIAltbWNfZGF0YS0+c2V0X3B3ciA9IHNoX21vYmlsZV9zZGhpX3NldF9wd3I7CiAJbW1jX2RhdGEtPmdldF9jZCA9IHNoX21vYmlsZV9zZGhpX2dldF9jZDsKKwlpZiAobW1jX2RhdGEtPmZsYWdzICYgVE1JT19NTUNfSEFTX0lETEVfV0FJVCkKKwkJbW1jX2RhdGEtPndyaXRlMTZfaG9vayA9IHNoX21vYmlsZV9zZGhpX3dyaXRlMTZfaG9vazsKIAltbWNfZGF0YS0+Y2FwYWJpbGl0aWVzID0gTU1DX0NBUF9NTUNfSElHSFNQRUVEOwogCWlmIChwKSB7CiAJCW1tY19kYXRhLT5mbGFncyA9IHAtPnRtaW9fZmxhZ3M7CiAJCW1tY19kYXRhLT5vY3JfbWFzayA9IHAtPnRtaW9fb2NyX21hc2s7CiAJCW1tY19kYXRhLT5jYXBhYmlsaXRpZXMgfD0gcC0+dG1pb19jYXBzOwogCi0JCWlmIChwLT5kbWFfc2xhdmVfdHggPj0gMCAmJiBwLT5kbWFfc2xhdmVfcnggPj0gMCkgeworCQlpZiAocC0+ZG1hX3NsYXZlX3R4ID4gMCAmJiBwLT5kbWFfc2xhdmVfcnggPiAwKSB7CiAJCQlwcml2LT5wYXJhbV90eC5zbGF2ZV9pZCA9IHAtPmRtYV9zbGF2ZV90eDsKIAkJCXByaXYtPnBhcmFtX3J4LnNsYXZlX2lkID0gcC0+ZG1hX3NsYXZlX3J4OwogCQkJcHJpdi0+ZG1hX3ByaXYuY2hhbl9wcml2X3R4ID0gJnByaXYtPnBhcmFtX3R4OwpAQCAtMTY1LDEzICsyMDEsMTQgQEAKIAogCXAtPnBkYXRhID0gTlVMTDsKIAorCXRtaW9fbW1jX2hvc3RfcmVtb3ZlKGhvc3QpOworCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOwogCQlpZiAoaXJxID49IDApCiAJCQlmcmVlX2lycShpcnEsIGhvc3QpOwogCX0KIAotCXRtaW9fbW1jX2hvc3RfcmVtb3ZlKGhvc3QpOwogCWNsa19kaXNhYmxlKHByaXYtPmNsayk7CiAJY2xrX3B1dChwcml2LT5jbGspOwogCWtmcmVlKHByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oCmluZGV4IDgyNjBiYzIuLjA4N2Q4ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvdG1pby5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKQEAgLTUyLDYgKzUzLDggQEAKIAl2b2lkICgqc2V0X2Nsa19kaXYpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmhvc3QsIGludCBzdGF0ZSk7CiAKIAlpbnQJCQlwbV9lcnJvcjsKKwkvKiByZWNvZ25pc2Ugc3lzdGVtLXdpZGUgc3VzcGVuZCBpbiBydW50aW1lIFBNIG1ldGhvZHMgKi8KKwlib29sCQkJcG1fZ2xvYmFsOwogCiAJLyogcGlvIHJlbGF0ZWQgc3R1ZmYgKi8KIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgICAgICAqc2dfcHRyOwpAQCAtNzMsOCArNzYsMTEgQEAKIAogCS8qIFRyYWNrIGxvc3QgaW50ZXJydXB0cyAqLwogCXN0cnVjdCBkZWxheWVkX3dvcmsJZGVsYXllZF9yZXNldF93b3JrOwotCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IHdvcmtfc3RydWN0CWRvbmU7CisKKwlzcGlubG9ja190CQlsb2NrOwkJLyogcHJvdGVjdCBob3N0IHByaXZhdGUgZGF0YSAqLwogCXVuc2lnbmVkIGxvbmcJCWxhc3RfcmVxX3RzOworCXN0cnVjdCBtdXRleAkJaW9zX2xvY2s7CS8qIHByb3RlY3Qgc2V0X2lvcygpIGNvbnRleHQgKi8KIH07CiAKIGludCB0bWlvX21tY19ob3N0X3Byb2JlKHN0cnVjdCB0bWlvX21tY19ob3N0ICoqaG9zdCwKQEAgLTEwMyw2ICsxMDksNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NESEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TREhJX01PRFVMRSkKIHZvaWQgdG1pb19tbWNfc3RhcnRfZG1hKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpOwordm9pZCB0bWlvX21tY19lbmFibGVfZG1hKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBib29sIGVuYWJsZSk7CiB2b2lkIHRtaW9fbW1jX3JlcXVlc3RfZG1hKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBzdHJ1Y3QgdG1pb19tbWNfZGF0YSAqcGRhdGEpOwogdm9pZCB0bWlvX21tY19yZWxlYXNlX2RtYShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCk7CiAjZWxzZQpAQCAtMTExLDYgKzExOCwxMCBAQAogewogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgdG1pb19tbWNfZW5hYmxlX2RtYShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgYm9vbCBlbmFibGUpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCB0bWlvX21tY19yZXF1ZXN0X2RtYShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwKIAkJCQkgc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhKQogewpAQCAtMTM0LDQgKzE0NSw0NCBAQAogaW50IHRtaW9fbW1jX2hvc3RfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CiBpbnQgdG1pb19tbWNfaG9zdF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCitzdGF0aWMgaW5saW5lIHUxNiBzZF9jdHJsX3JlYWQxNihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIpCit7CisJcmV0dXJuIHJlYWR3KGhvc3QtPmN0bCArIChhZGRyIDw8IGhvc3QtPmJ1c19zaGlmdCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2RfY3RybF9yZWFkMTZfcmVwKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkciwKKwkJdTE2ICpidWYsIGludCBjb3VudCkKK3sKKwlyZWFkc3coaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHNkX2N0cmxfcmVhZDMyKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkcikKK3sKKwlyZXR1cm4gcmVhZHcoaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSkgfAorCSAgICAgICByZWFkdyhob3N0LT5jdGwgKyAoKGFkZHIgKyAyKSA8PCBob3N0LT5idXNfc2hpZnQpKSA8PCAxNjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNkX2N0cmxfd3JpdGUxNihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIsIHUxNiB2YWwpCit7CisJLyogSWYgdGhlcmUgaXMgYSBob29rIGFuZCBpdCByZXR1cm5zIG5vbi16ZXJvIHRoZW4gdGhlcmUKKwkgKiBpcyBhbiBlcnJvciBhbmQgdGhlIHdyaXRlIHNob3VsZCBiZSBza2lwcGVkCisJICovCisJaWYgKGhvc3QtPnBkYXRhLT53cml0ZTE2X2hvb2sgJiYgaG9zdC0+cGRhdGEtPndyaXRlMTZfaG9vayhob3N0LCBhZGRyKSkKKwkJcmV0dXJuOworCXdyaXRldyh2YWwsIGhvc3QtPmN0bCArIChhZGRyIDw8IGhvc3QtPmJ1c19zaGlmdCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2RfY3RybF93cml0ZTE2X3JlcChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIsCisJCXUxNiAqYnVmLCBpbnQgY291bnQpCit7CisJd3JpdGVzdyhob3N0LT5jdGwgKyAoYWRkciA8PCBob3N0LT5idXNfc2hpZnQpLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNkX2N0cmxfd3JpdGUzMihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIsIHUzMiB2YWwpCit7CisJd3JpdGV3KHZhbCwgaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSk7CisJd3JpdGV3KHZhbCA+PiAxNiwgaG9zdC0+Y3RsICsgKChhZGRyICsgMikgPDwgaG9zdC0+YnVzX3NoaWZ0KSk7Cit9CisKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX2RtYS5jIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19kbWEuYwppbmRleCAyNWYxYWQ2Li44NmYyNTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX2RtYS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfZG1hLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvdG1pby5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CkBAIC0yMiwxMSArMjMsMTQgQEAKIAogI2RlZmluZSBUTUlPX01NQ19NSU5fRE1BX0xFTiA4CiAKLXN0YXRpYyB2b2lkIHRtaW9fbW1jX2VuYWJsZV9kbWEoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGJvb2wgZW5hYmxlKQordm9pZCB0bWlvX21tY19lbmFibGVfZG1hKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBib29sIGVuYWJsZSkKIHsKKwlpZiAoIWhvc3QtPmNoYW5fdHggfHwgIWhvc3QtPmNoYW5fcngpCisJCXJldHVybjsKKwogI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSSCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9TSE1PQklMRSkKIAkvKiBTd2l0Y2ggRE1BIG1vZGUgb24gb3Igb2ZmIC0gU3VwZXJIIHNwZWNpZmljPyAqLwotCXdyaXRldyhlbmFibGUgPyAyIDogMCwgaG9zdC0+Y3RsICsgKDB4ZDggPDwgaG9zdC0+YnVzX3NoaWZ0KSk7CisJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9ETUFfRU5BQkxFLCBlbmFibGUgPyAyIDogMCk7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMKaW5kZXggYWQ2MzQ3Yi4uMWYxNjM1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jCkBAIC00Niw0MCArNDYsNiBAQAogCiAjaW5jbHVkZSAidG1pb19tbWMuaCIKIAotc3RhdGljIHUxNiBzZF9jdHJsX3JlYWQxNihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIpCi17Ci0JcmV0dXJuIHJlYWR3KGhvc3QtPmN0bCArIChhZGRyIDw8IGhvc3QtPmJ1c19zaGlmdCkpOwotfQotCi1zdGF0aWMgdm9pZCBzZF9jdHJsX3JlYWQxNl9yZXAoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBhZGRyLAotCQl1MTYgKmJ1ZiwgaW50IGNvdW50KQotewotCXJlYWRzdyhob3N0LT5jdGwgKyAoYWRkciA8PCBob3N0LT5idXNfc2hpZnQpLCBidWYsIGNvdW50KTsKLX0KLQotc3RhdGljIHUzMiBzZF9jdHJsX3JlYWQzMihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIpCi17Ci0JcmV0dXJuIHJlYWR3KGhvc3QtPmN0bCArIChhZGRyIDw8IGhvc3QtPmJ1c19zaGlmdCkpIHwKLQkgICAgICAgcmVhZHcoaG9zdC0+Y3RsICsgKChhZGRyICsgMikgPDwgaG9zdC0+YnVzX3NoaWZ0KSkgPDwgMTY7Ci19Ci0KLXN0YXRpYyB2b2lkIHNkX2N0cmxfd3JpdGUxNihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIsIHUxNiB2YWwpCi17Ci0Jd3JpdGV3KHZhbCwgaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNkX2N0cmxfd3JpdGUxNl9yZXAoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBhZGRyLAotCQl1MTYgKmJ1ZiwgaW50IGNvdW50KQotewotCXdyaXRlc3coaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSwgYnVmLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNkX2N0cmxfd3JpdGUzMihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIsIHUzMiB2YWwpCi17Ci0Jd3JpdGV3KHZhbCwgaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSk7Ci0Jd3JpdGV3KHZhbCA+PiAxNiwgaG9zdC0+Y3RsICsgKChhZGRyICsgMikgPDwgaG9zdC0+YnVzX3NoaWZ0KSk7Ci19Ci0KIHZvaWQgdG1pb19tbWNfZW5hYmxlX21tY19pcnFzKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCB1MzIgaSkKIHsKIAl1MzIgbWFzayA9IHNkX2N0cmxfcmVhZDMyKGhvc3QsIENUTF9JUlFfTUFTSykgJiB+KGkgJiBUTUlPX01BU0tfSVJRKTsKQEAgLTI4NCwxMCArMjUwLDE2IEBACiAvKiBjYWxsZWQgd2l0aCBob3N0LT5sb2NrIGhlbGQsIGludGVycnVwdHMgZGlzYWJsZWQgKi8KIHN0YXRpYyB2b2lkIHRtaW9fbW1jX2ZpbmlzaF9yZXF1ZXN0KHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0KQogewotCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxID0gaG9zdC0+bXJxOworCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIW1ycSkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCisJbXJxID0gaG9zdC0+bXJxOworCWlmIChJU19FUlJfT1JfTlVMTChtcnEpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOworCX0KIAogCWhvc3QtPmNtZCA9IE5VTEw7CiAJaG9zdC0+ZGF0YSA9IE5VTEw7CkBAIC0yOTYsMTEgKzI2OCwxOCBAQAogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmhvc3QtPmRlbGF5ZWRfcmVzZXRfd29yayk7CiAKIAlob3N0LT5tcnEgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAotCS8qIEZJWE1FOiBtbWNfcmVxdWVzdF9kb25lKCkgY2FuIHNjaGVkdWxlISAqLwogCW1tY19yZXF1ZXN0X2RvbmUoaG9zdC0+bW1jLCBtcnEpOwogfQogCitzdGF0aWMgdm9pZCB0bWlvX21tY19kb25lX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0bWlvX21tY19ob3N0LAorCQkJCQkJICBkb25lKTsKKwl0bWlvX21tY19maW5pc2hfcmVxdWVzdChob3N0KTsKK30KKwogLyogVGhlc2UgYXJlIHRoZSBiaXRtYXNrcyB0aGUgdG1pbyBjaGlwIHJlcXVpcmVzIHRvIGltcGxlbWVudCB0aGUgTU1DIHJlc3BvbnNlCiAgKiB0eXBlcy4gTm90ZSB0aGF0IFIxIGFuZCBSNiBhcmUgdGhlIHNhbWUgaW4gdGhpcyBzY2hlbWUuICovCiAjZGVmaW5lIEFQUF9DTUQgICAgICAgIDB4MDA0MApAQCAtNDY3LDcgKzQ0Niw3IEBACiAJCQlCVUcoKTsKIAl9CiAKLQl0bWlvX21tY19maW5pc2hfcmVxdWVzdChob3N0KTsKKwlzY2hlZHVsZV93b3JrKCZob3N0LT5kb25lKTsKIH0KIAogc3RhdGljIHZvaWQgdG1pb19tbWNfZGF0YV9pcnEoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpCkBAIC01NTcsNyArNTM2LDcgQEAKIAkJCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT5kbWFfaXNzdWUpOwogCQl9CiAJfSBlbHNlIHsKLQkJdG1pb19tbWNfZmluaXNoX3JlcXVlc3QoaG9zdCk7CisJCXNjaGVkdWxlX3dvcmsoJmhvc3QtPmRvbmUpOwogCX0KIAogb3V0OgpAQCAtNTY3LDYgKzU0Niw3IEBACiBpcnFyZXR1cm5fdCB0bWlvX21tY19pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCiB7CiAJc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QgPSBkZXZpZDsKKwlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IGhvc3QtPm1tYzsKIAlzdHJ1Y3QgdG1pb19tbWNfZGF0YSAqcGRhdGEgPSBob3N0LT5wZGF0YTsKIAl1bnNpZ25lZCBpbnQgaXJlZywgaXJxX21hc2ssIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgc2Rpb19pcmVnLCBzZGlvX2lycV9tYXNrLCBzZGlvX3N0YXR1czsKQEAgLTU4OCwxMyArNTY4LDEzIEBACiAJCWlmIChzZGlvX2lyZWcgJiYgIWhvc3QtPnNkaW9faXJxX2VuYWJsZWQpIHsKIAkJCXByX3dhcm5pbmcoInRtaW9fbW1jOiBTcHVyaW91cyBTRElPIElSUSwgZGlzYWJsaW5nISAweCUwNHggMHglMDR4IDB4JTA0eFxuIiwKIAkJCQkgICBzZGlvX3N0YXR1cywgc2Rpb19pcnFfbWFzaywgc2Rpb19pcmVnKTsKLQkJCXRtaW9fbW1jX2VuYWJsZV9zZGlvX2lycShob3N0LT5tbWMsIDApOworCQkJdG1pb19tbWNfZW5hYmxlX3NkaW9faXJxKG1tYywgMCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWlmIChob3N0LT5tbWMtPmNhcHMgJiBNTUNfQ0FQX1NESU9fSVJRICYmCisJCWlmIChtbWMtPmNhcHMgJiBNTUNfQ0FQX1NESU9fSVJRICYmCiAJCQlzZGlvX2lyZWcgJiBUTUlPX1NESU9fU1RBVF9JT0lSUSkKLQkJCW1tY19zaWduYWxfc2Rpb19pcnEoaG9zdC0+bW1jKTsKKwkJCW1tY19zaWduYWxfc2Rpb19pcnEobW1jKTsKIAogCQlpZiAoc2Rpb19pcmVnKQogCQkJZ290byBvdXQ7CkBAIC02MDMsNTggKzU4Myw0OSBAQAogCXByX2RlYnVnX3N0YXR1cyhzdGF0dXMpOwogCXByX2RlYnVnX3N0YXR1cyhpcmVnKTsKIAotCWlmICghaXJlZykgewotCQl0bWlvX21tY19kaXNhYmxlX21tY19pcnFzKGhvc3QsIHN0YXR1cyAmIH5pcnFfbWFzayk7Ci0KLQkJcHJfd2FybmluZygidG1pb19tbWM6IFNwdXJpb3VzIGlycSwgZGlzYWJsaW5nISAiCi0JCQkiMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsIHN0YXR1cywgaXJxX21hc2ssIGlyZWcpOwotCQlwcl9kZWJ1Z19zdGF0dXMoc3RhdHVzKTsKLQorCS8qIENhcmQgaW5zZXJ0IC8gcmVtb3ZlIGF0dGVtcHRzICovCisJaWYgKGlyZWcgJiAoVE1JT19TVEFUX0NBUkRfSU5TRVJUIHwgVE1JT19TVEFUX0NBUkRfUkVNT1ZFKSkgeworCQl0bWlvX21tY19hY2tfbW1jX2lycXMoaG9zdCwgVE1JT19TVEFUX0NBUkRfSU5TRVJUIHwKKwkJCVRNSU9fU1RBVF9DQVJEX1JFTU9WRSk7CisJCWlmICgoKChpcmVnICYgVE1JT19TVEFUX0NBUkRfUkVNT1ZFKSAmJiBtbWMtPmNhcmQpIHx8CisJCSAgICAgKChpcmVnICYgVE1JT19TVEFUX0NBUkRfSU5TRVJUKSAmJiAhbW1jLT5jYXJkKSkgJiYKKwkJICAgICF3b3JrX3BlbmRpbmcoJm1tYy0+ZGV0ZWN0LndvcmspKQorCQkJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jLCBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwogCQlnb3RvIG91dDsKIAl9CiAKLQl3aGlsZSAoaXJlZykgewotCQkvKiBDYXJkIGluc2VydCAvIHJlbW92ZSBhdHRlbXB0cyAqLwotCQlpZiAoaXJlZyAmIChUTUlPX1NUQVRfQ0FSRF9JTlNFUlQgfCBUTUlPX1NUQVRfQ0FSRF9SRU1PVkUpKSB7Ci0JCQl0bWlvX21tY19hY2tfbW1jX2lycXMoaG9zdCwgVE1JT19TVEFUX0NBUkRfSU5TRVJUIHwKLQkJCQlUTUlPX1NUQVRfQ0FSRF9SRU1PVkUpOwotCQkJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jLCBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwotCQl9Ci0KLQkJLyogQ1JDIGFuZCBvdGhlciBlcnJvcnMgKi8KLS8qCQlpZiAoaXJlZyAmIFRNSU9fU1RBVF9FUlJfSVJRKQotICoJCQloYW5kbGVkIHw9IHRtaW9fZXJyb3JfaXJxKGhvc3QsIGlycSwgc3RhdCk7CisJLyogQ1JDIGFuZCBvdGhlciBlcnJvcnMgKi8KKy8qCWlmIChpcmVnICYgVE1JT19TVEFUX0VSUl9JUlEpCisgKgkJaGFuZGxlZCB8PSB0bWlvX2Vycm9yX2lycShob3N0LCBpcnEsIHN0YXQpOwogICovCiAKLQkJLyogQ29tbWFuZCBjb21wbGV0aW9uICovCi0JCWlmIChpcmVnICYgKFRNSU9fU1RBVF9DTURSRVNQRU5EIHwgVE1JT19TVEFUX0NNRFRJTUVPVVQpKSB7Ci0JCQl0bWlvX21tY19hY2tfbW1jX2lycXMoaG9zdCwKLQkJCQkgICAgIFRNSU9fU1RBVF9DTURSRVNQRU5EIHwKLQkJCQkgICAgIFRNSU9fU1RBVF9DTURUSU1FT1VUKTsKLQkJCXRtaW9fbW1jX2NtZF9pcnEoaG9zdCwgc3RhdHVzKTsKLQkJfQotCi0JCS8qIERhdGEgdHJhbnNmZXIgKi8KLQkJaWYgKGlyZWcgJiAoVE1JT19TVEFUX1JYUkRZIHwgVE1JT19TVEFUX1RYUlEpKSB7Ci0JCQl0bWlvX21tY19hY2tfbW1jX2lycXMoaG9zdCwgVE1JT19TVEFUX1JYUkRZIHwgVE1JT19TVEFUX1RYUlEpOwotCQkJdG1pb19tbWNfcGlvX2lycShob3N0KTsKLQkJfQotCi0JCS8qIERhdGEgdHJhbnNmZXIgY29tcGxldGlvbiAqLwotCQlpZiAoaXJlZyAmIFRNSU9fU1RBVF9EQVRBRU5EKSB7Ci0JCQl0bWlvX21tY19hY2tfbW1jX2lycXMoaG9zdCwgVE1JT19TVEFUX0RBVEFFTkQpOwotCQkJdG1pb19tbWNfZGF0YV9pcnEoaG9zdCk7Ci0JCX0KLQotCQkvKiBDaGVjayBzdGF0dXMgLSBrZWVwIGdvaW5nIHVudGlsIHdlJ3ZlIGhhbmRsZWQgaXQgYWxsICovCi0JCXN0YXR1cyA9IHNkX2N0cmxfcmVhZDMyKGhvc3QsIENUTF9TVEFUVVMpOwotCQlpcnFfbWFzayA9IHNkX2N0cmxfcmVhZDMyKGhvc3QsIENUTF9JUlFfTUFTSyk7Ci0JCWlyZWcgPSBzdGF0dXMgJiBUTUlPX01BU0tfSVJRICYgfmlycV9tYXNrOwotCi0JCXByX2RlYnVnKCJTdGF0dXMgYXQgZW5kIG9mIGxvb3A6ICUwOHhcbiIsIHN0YXR1cyk7Ci0JCXByX2RlYnVnX3N0YXR1cyhzdGF0dXMpOworCS8qIENvbW1hbmQgY29tcGxldGlvbiAqLworCWlmIChpcmVnICYgKFRNSU9fU1RBVF9DTURSRVNQRU5EIHwgVE1JT19TVEFUX0NNRFRJTUVPVVQpKSB7CisJCXRtaW9fbW1jX2Fja19tbWNfaXJxcyhob3N0LAorCQkJICAgICBUTUlPX1NUQVRfQ01EUkVTUEVORCB8CisJCQkgICAgIFRNSU9fU1RBVF9DTURUSU1FT1VUKTsKKwkJdG1pb19tbWNfY21kX2lycShob3N0LCBzdGF0dXMpOworCQlnb3RvIG91dDsKIAl9Ci0JcHJfZGVidWcoIk1NQyBJUlEgZW5kXG4iKTsKKworCS8qIERhdGEgdHJhbnNmZXIgKi8KKwlpZiAoaXJlZyAmIChUTUlPX1NUQVRfUlhSRFkgfCBUTUlPX1NUQVRfVFhSUSkpIHsKKwkJdG1pb19tbWNfYWNrX21tY19pcnFzKGhvc3QsIFRNSU9fU1RBVF9SWFJEWSB8IFRNSU9fU1RBVF9UWFJRKTsKKwkJdG1pb19tbWNfcGlvX2lycShob3N0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRGF0YSB0cmFuc2ZlciBjb21wbGV0aW9uICovCisJaWYgKGlyZWcgJiBUTUlPX1NUQVRfREFUQUVORCkgeworCQl0bWlvX21tY19hY2tfbW1jX2lycXMoaG9zdCwgVE1JT19TVEFUX0RBVEFFTkQpOworCQl0bWlvX21tY19kYXRhX2lycShob3N0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJfd2FybmluZygidG1pb19tbWM6IFNwdXJpb3VzIGlycSwgZGlzYWJsaW5nISAiCisJCSIweCUwOHggMHglMDh4IDB4JTA4eFxuIiwgc3RhdHVzLCBpcnFfbWFzaywgaXJlZyk7CisJcHJfZGVidWdfc3RhdHVzKHN0YXR1cyk7CisJdG1pb19tbWNfZGlzYWJsZV9tbWNfaXJxcyhob3N0LCBzdGF0dXMgJiB+aXJxX21hc2spOwogCiBvdXQ6CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtNzQ5LDYgKzcyMCw4IEBACiAJc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gaG9zdC0+cGRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCW11dGV4X2xvY2soJmhvc3QtPmlvc19sb2NrKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAJaWYgKGhvc3QtPm1ycSkgewogCQlpZiAoSVNfRVJSKGhvc3QtPm1ycSkpIHsKQEAgLTc2NCw2ICs3MzcsOCBAQAogCQkJCWhvc3QtPm1ycS0+Y21kLT5vcGNvZGUsIGhvc3QtPmxhc3RfcmVxX3RzLCBqaWZmaWVzKTsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CisKKwkJbXV0ZXhfdW5sb2NrKCZob3N0LT5pb3NfbG9jayk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTc3MSwzMyArNzQ2LDMwIEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoaW9zLT5jbG9jaykKLQkJdG1pb19tbWNfc2V0X2Nsb2NrKGhvc3QsIGlvcy0+Y2xvY2spOwotCi0JLyogUG93ZXIgc2VxdWVuY2UgLSBPRkYgLT4gVVAgLT4gT04gKi8KLQlpZiAoaW9zLT5wb3dlcl9tb2RlID09IE1NQ19QT1dFUl9VUCkgewotCQlpZiAoKHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX0hBU19DT0xEX0NEKSAmJiAhcGRhdGEtPnBvd2VyKSB7CisJLyoKKwkgKiBwZGF0YS0+cG93ZXIgPT0gZmFsc2Ugb25seSBpZiBDT0xEX0NEIGlzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG9ubHkKKwkgKiBpbiBzaG9ydCB0aW1lIGludGVydmFscyBkdXJpbmcgcHJvYmluZyBvciByZXN1bWluZworCSAqLworCWlmIChpb3MtPnBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX09OICYmIGlvcy0+Y2xvY2spIHsKKwkJaWYgKCFwZGF0YS0+cG93ZXIpIHsKIAkJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJmhvc3QtPnBkZXYtPmRldik7CiAJCQlwZGF0YS0+cG93ZXIgPSB0cnVlOwogCQl9CisJCXRtaW9fbW1jX3NldF9jbG9jayhob3N0LCBpb3MtPmNsb2NrKTsKIAkJLyogcG93ZXIgdXAgU0QgYnVzICovCiAJCWlmIChob3N0LT5zZXRfcHdyKQogCQkJaG9zdC0+c2V0X3B3cihob3N0LT5wZGV2LCAxKTsKLQl9IGVsc2UgaWYgKGlvcy0+cG93ZXJfbW9kZSA9PSBNTUNfUE9XRVJfT0ZGIHx8ICFpb3MtPmNsb2NrKSB7Ci0JCS8qIHBvd2VyIGRvd24gU0QgYnVzICovCi0JCWlmIChpb3MtPnBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX09GRikgewotCQkJaWYgKGhvc3QtPnNldF9wd3IpCi0JCQkJaG9zdC0+c2V0X3B3cihob3N0LT5wZGV2LCAwKTsKLQkJCWlmICgocGRhdGEtPmZsYWdzICYgVE1JT19NTUNfSEFTX0NPTERfQ0QpICYmCi0JCQkgICAgcGRhdGEtPnBvd2VyKSB7Ci0JCQkJcGRhdGEtPnBvd2VyID0gZmFsc2U7Ci0JCQkJcG1fcnVudGltZV9wdXQoJmhvc3QtPnBkZXYtPmRldik7Ci0JCQl9Ci0JCX0KLQkJdG1pb19tbWNfY2xrX3N0b3AoaG9zdCk7Ci0JfSBlbHNlIHsKIAkJLyogc3RhcnQgYnVzIGNsb2NrICovCiAJCXRtaW9fbW1jX2Nsa19zdGFydChob3N0KTsKKwl9IGVsc2UgaWYgKGlvcy0+cG93ZXJfbW9kZSAhPSBNTUNfUE9XRVJfVVApIHsKKwkJaWYgKGhvc3QtPnNldF9wd3IpCisJCQlob3N0LT5zZXRfcHdyKGhvc3QtPnBkZXYsIDApOworCQlpZiAoKHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX0hBU19DT0xEX0NEKSAmJgorCQkgICAgcGRhdGEtPnBvd2VyKSB7CisJCQlwZGF0YS0+cG93ZXIgPSBmYWxzZTsKKwkJCXBtX3J1bnRpbWVfcHV0KCZob3N0LT5wZGV2LT5kZXYpOworCQl9CisJCXRtaW9fbW1jX2Nsa19zdG9wKGhvc3QpOwogCX0KIAogCXN3aXRjaCAoaW9zLT5idXNfd2lkdGgpIHsKQEAgLTgxNyw2ICs3ODksOCBAQAogCQkJY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCksCiAJCQlpb3MtPmNsb2NrLCBpb3MtPnBvd2VyX21vZGUpOwogCWhvc3QtPm1ycSA9IE5VTEw7CisKKwltdXRleF91bmxvY2soJmhvc3QtPmlvc19sb2NrKTsKIH0KIAogc3RhdGljIGludCB0bWlvX21tY19nZXRfcm8oc3RydWN0IG1tY19ob3N0ICptbWMpCkBAIC04MjQsOCArNzk4LDggQEAKIAlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CiAJc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gaG9zdC0+cGRhdGE7CiAKLQlyZXR1cm4gKChwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19XUlBST1RFQ1RfRElTQUJMRSkgfHwKLQkJIShzZF9jdHJsX3JlYWQzMihob3N0LCBDVExfU1RBVFVTKSAmIFRNSU9fU1RBVF9XUlBST1RFQ1QpKTsKKwlyZXR1cm4gISgocGRhdGEtPmZsYWdzICYgVE1JT19NTUNfV1JQUk9URUNUX0RJU0FCTEUpIHx8CisJCSAoc2RfY3RybF9yZWFkMzIoaG9zdCwgQ1RMX1NUQVRVUykgJiBUTUlPX1NUQVRfV1JQUk9URUNUKSk7CiB9CiAKIHN0YXRpYyBpbnQgdG1pb19tbWNfZ2V0X2NkKHN0cnVjdCBtbWNfaG9zdCAqbW1jKQpAQCAtOTEzLDE2ICs4ODcsMjAgQEAKIAkJdG1pb19tbWNfZW5hYmxlX3NkaW9faXJxKG1tYywgMCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmX2hvc3QtPmxvY2spOworCW11dGV4X2luaXQoJl9ob3N0LT5pb3NfbG9jayk7CiAKIAkvKiBJbml0IGRlbGF5ZWQgd29yayBmb3IgcmVxdWVzdCB0aW1lb3V0cyAqLwogCUlOSVRfREVMQVlFRF9XT1JLKCZfaG9zdC0+ZGVsYXllZF9yZXNldF93b3JrLCB0bWlvX21tY19yZXNldF93b3JrKTsKKwlJTklUX1dPUksoJl9ob3N0LT5kb25lLCB0bWlvX21tY19kb25lX3dvcmspOwogCiAJLyogU2VlIGlmIHdlIGFsc28gZ2V0IERNQSAqLwogCXRtaW9fbW1jX3JlcXVlc3RfZG1hKF9ob3N0LCBwZGF0YSk7CiAKIAkvKiBXZSBoYXZlIHRvIGtlZXAgdGhlIGRldmljZSBwb3dlcmVkIGZvciBpdHMgY2FyZCBkZXRlY3Rpb24gdG8gd29yayAqLwotCWlmICghKHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX0hBU19DT0xEX0NEKSkKKwlpZiAoIShwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19IQVNfQ09MRF9DRCkpIHsKKwkJcGRhdGEtPnBvd2VyID0gdHJ1ZTsKIAkJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoJnBkZXYtPmRldik7CisJfQogCiAJbW1jX2FkZF9ob3N0KG1tYyk7CiAKQEAgLTk2Myw2ICs5NDEsNyBAQAogCQlwbV9ydW50aW1lX2dldF9zeW5jKCZwZGV2LT5kZXYpOwogCiAJbW1jX3JlbW92ZV9ob3N0KGhvc3QtPm1tYyk7CisJY2FuY2VsX3dvcmtfc3luYygmaG9zdC0+ZG9uZSk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZob3N0LT5kZWxheWVkX3Jlc2V0X3dvcmspOwogCXRtaW9fbW1jX3JlbGVhc2VfZG1hKGhvc3QpOwogCkBAIC05OTgsMTEgKzk3NywxNiBAQAogCS8qIFRoZSBNTUMgY29yZSB3aWxsIHBlcmZvcm0gdGhlIGNvbXBsZXRlIHNldCB1cCAqLwogCWhvc3QtPnBkYXRhLT5wb3dlciA9IGZhbHNlOwogCisJaG9zdC0+cG1fZ2xvYmFsID0gdHJ1ZTsKIAlpZiAoIWhvc3QtPnBtX2Vycm9yKQogCQlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CiAKLQl0bWlvX21tY19yZXNldChtbWNfcHJpdihtbWMpKTsKLQl0bWlvX21tY19yZXF1ZXN0X2RtYShob3N0LCBob3N0LT5wZGF0YSk7CisJaWYgKGhvc3QtPnBtX2dsb2JhbCkgeworCQkvKiBSdW50aW1lIFBNIHJlc3VtZSBjYWxsYmFjayBkaWRuJ3QgcnVuICovCisJCXRtaW9fbW1jX3Jlc2V0KGhvc3QpOworCQl0bWlvX21tY19lbmFibGVfZG1hKGhvc3QsIHRydWUpOworCQlob3N0LT5wbV9nbG9iYWwgPSBmYWxzZTsKKwl9CiAKIAlyZXR1cm4gbW1jX3Jlc3VtZV9ob3N0KG1tYyk7CiB9CkBAIC0xMDIzLDEyICsxMDA3LDE1IEBACiAJc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gaG9zdC0+cGRhdGE7CiAKIAl0bWlvX21tY19yZXNldChob3N0KTsKKwl0bWlvX21tY19lbmFibGVfZG1hKGhvc3QsIHRydWUpOwogCiAJaWYgKHBkYXRhLT5wb3dlcikgewogCQkvKiBPbmx5IGVudGVyZWQgYWZ0ZXIgYSBjYXJkLWluc2VydCBpbnRlcnJ1cHQgKi8KLQkJdG1pb19tbWNfc2V0X2lvcyhtbWMsICZtbWMtPmlvcyk7CisJCWlmICghbW1jLT5jYXJkKQorCQkJdG1pb19tbWNfc2V0X2lvcyhtbWMsICZtbWMtPmlvcyk7CiAJCW1tY19kZXRlY3RfY2hhbmdlKG1tYywgbXNlY3NfdG9famlmZmllcygxMDApKTsKIAl9CisJaG9zdC0+cG1fZ2xvYmFsID0gZmFsc2U7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvdnViMzAwLmMgYi9kcml2ZXJzL21tYy9ob3N0L3Z1YjMwMC5jCmluZGV4IGNiYjAzMzAuLmU4ZjZlNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdnViMzAwLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC92dWIzMDAuYwpAQCAtMTYyNSw4ICsxNjI1LDggQEAKIAkJY21kLT5lcnJvciA9IHJlc3ByZXR2YWw7CiAJfSBlbHNlIGlmIChjbWQtPmVycm9yKSB7CiAJCS8qCi0JCSAqIHRoZSBlcnJvciBvY2N1cmVkIHNlbmRpbmcgdGhlIGNvbW1hbmQKLQkJICogb3IgcmVjaWV2aW5nIHRoZSByZXNwb25zZQorCQkgKiB0aGUgZXJyb3Igb2NjdXJyZWQgc2VuZGluZyB0aGUgY29tbWFuZAorCQkgKiBvciByZWNlaXZpbmcgdGhlIHJlc3BvbnNlCiAJCSAqLwogCX0gZWxzZSBpZiAodnViMzAwLT5jb21tYW5kX291dF91cmItPnN0YXR1cykgewogCQl2dWIzMDAtPnVzYl90cmFuc3BvcnRfZmFpbCA9IHZ1YjMwMC0+Y29tbWFuZF9vdXRfdXJiLT5zdGF0dXM7CkBAIC0yMDk2LDcgKzIwOTYsNyBAQAogc3RhdGljIGludCB2dWIzMDBfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKIAkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsJCQkJLyogTk9UIGlycSAqLwotCXN0cnVjdCB2dWIzMDBfbW1jX2hvc3QgKnZ1YjMwMCA9IE5VTEw7CisJc3RydWN0IHZ1YjMwMF9tbWNfaG9zdCAqdnViMzAwOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOwogCWludCBpOwpAQCAtMjExOCwyMyArMjExOCwyMCBAQAogCWNvbW1hbmRfb3V0X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb21tYW5kX291dF91cmIpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZGV2X2VycigmdnViMzAwLT51ZGV2LT5kZXYsCi0JCQkibm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBjb21tYW5kX291dF91cmJcbiIpOworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgY29tbWFuZF9vdXRfdXJiXG4iKTsKIAkJZ290byBlcnJvcjA7CiAJfQogCWNvbW1hbmRfcmVzX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb21tYW5kX3Jlc191cmIpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZGV2X2VycigmdnViMzAwLT51ZGV2LT5kZXYsCi0JCQkibm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBjb21tYW5kX3Jlc191cmJcbiIpOworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgY29tbWFuZF9yZXNfdXJiXG4iKTsKIAkJZ290byBlcnJvcjE7CiAJfQogCS8qIHRoaXMgYWxzbyBhbGxvY2F0ZXMgbWVtb3J5IGZvciBvdXIgVlVCMzAwIG1tYyBob3N0IGRldmljZSAqLwogCW1tYyA9IG1tY19hbGxvY19ob3N0KHNpemVvZihzdHJ1Y3QgdnViMzAwX21tY19ob3N0KSwgJnVkZXYtPmRldik7CiAJaWYgKCFtbWMpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZGV2X2VycigmdnViMzAwLT51ZGV2LT5kZXYsCi0JCQkibm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBtbWNfaG9zdFxuIik7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgbW1jX2hvc3RcbiIpOwogCQlnb3RvIGVycm9yNDsKIAl9CiAJLyogTU1DIGNvcmUgdHJhbnNmZXIgc2l6ZXMgdHVuYWJsZSBwYXJhbWV0ZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL3NzdDI1bC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9zc3QyNWwuYwppbmRleCAxZTJjNDMwLi44M2U4MGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL3NzdDI1bC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvc3N0MjVsLmMKQEAgLTUsNyArNSw3IEBACiAgKgogICogQ29weXJpZ2h0IMKpIDIwMDkgQmx1ZXdhdGVyIFN5c3RlbXMgTHRkCiAgKiBBdXRob3I6IEFuZHJlIFJlbmF1ZCA8YW5kcmVAYmx1ZXdhdGVyc3lzLmNvbT4KLSAqIEF1dGhvcjogUnlhbiBNYWxsb24gPHJ5YW5AYmx1ZXdhdGVyc3lzLmNvbT4KKyAqIEF1dGhvcjogUnlhbiBNYWxsb24KICAqCiAgKiBCYXNlZCBvbiBtMjVwODAuYwogICoKQEAgLTQ5OCw1ICs0OTgsNSBAQAogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBTUEkgZHJpdmVyIGZvciBTU1QyNUwgRmxhc2ggY2hpcHMiKTsKIE1PRFVMRV9BVVRIT1IoIkFuZHJlIFJlbmF1ZCA8YW5kcmVAYmx1ZXdhdGVyc3lzLmNvbT4sICIKLQkgICAgICAiUnlhbiBNYWxsb24gPHJ5YW5AYmx1ZXdhdGVyc3lzLmNvbT4iKTsKKwkgICAgICAiUnlhbiBNYWxsb24iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvYmZpbi1hc3luYy1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9iZmluLWFzeW5jLWZsYXNoLmMKaW5kZXggZDQyOTdhOS4uNjc4MTVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9iZmluLWFzeW5jLWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9iZmluLWFzeW5jLWZsYXNoLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCXN0YXRlLT5tYXAud3JpdGUgICAgICA9IGJmaW5fZmxhc2hfd3JpdGU7CiAJc3RhdGUtPm1hcC5jb3B5X3RvICAgID0gYmZpbl9mbGFzaF9jb3B5X3RvOwogCXN0YXRlLT5tYXAuYmFua3dpZHRoICA9IHBkYXRhLT53aWR0aDsKLQlzdGF0ZS0+bWFwLnNpemUgICAgICAgPSBtZW1vcnktPmVuZCAtIG1lbW9yeS0+c3RhcnQgKyAxOworCXN0YXRlLT5tYXAuc2l6ZSAgICAgICA9IHJlc291cmNlX3NpemUobWVtb3J5KTsKIAlzdGF0ZS0+bWFwLnZpcnQgICAgICAgPSAodm9pZCBfX2lvbWVtICopbWVtb3J5LT5zdGFydDsKIAlzdGF0ZS0+bWFwLnBoeXMgICAgICAgPSBtZW1vcnktPnN0YXJ0OwogCXN0YXRlLT5tYXAubWFwX3ByaXZfMSA9ICh1bnNpZ25lZCBsb25nKXN0YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwppbmRleCBjMDBiOTE3Li4xNTk0YTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJaWYgKCFwbGF0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXdpbmRvd19zaXplID0gZGV2LT5yZXNvdXJjZS0+ZW5kIC0gZGV2LT5yZXNvdXJjZS0+c3RhcnQgKyAxOworCXdpbmRvd19zaXplID0gcmVzb3VyY2Vfc2l6ZShkZXYtPnJlc291cmNlKTsKIAlkZXZfaW5mbygmZGV2LT5kZXYsICJQcm9iZSBvZiBJWFAyMDAwIGZsYXNoKCVkIGJhbmtzIHggJWRNaUIpXG4iLAogCQkgaXhwX2RhdGEtPm5yX2JhbmtzLCAoKHUzMil3aW5kb3dfc2l6ZSA+PiAyMCkpOwogCkBAIC0xOTQsMTYgKzE5NCwxNyBAQAogCWluZm8tPm1hcC5jb3B5X3RvID0gaXhwMjAwMF9mbGFzaF9jb3B5X3RvOwogCiAJaW5mby0+cmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKGRldi0+cmVzb3VyY2UtPnN0YXJ0LAotCQkJZGV2LT5yZXNvdXJjZS0+ZW5kIC0gZGV2LT5yZXNvdXJjZS0+c3RhcnQgKyAxLAotCQkJZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJCQkJICAgICAgIHJlc291cmNlX3NpemUoZGV2LT5yZXNvdXJjZSksCisJCQkJICAgICAgIGRldl9uYW1lKCZkZXYtPmRldikpOwogCWlmICghaW5mby0+cmVzKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiQ291bGQgbm90IHJlc2VydmUgbWVtb3J5IHJlZ2lvblxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gRXJyb3I7CiAJfQogCi0JaW5mby0+bWFwLm1hcF9wcml2XzEgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChkZXYtPnJlc291cmNlLT5zdGFydCwKLQkJCSAgICAJZGV2LT5yZXNvdXJjZS0+ZW5kIC0gZGV2LT5yZXNvdXJjZS0+c3RhcnQgKyAxKTsKKwlpbmZvLT5tYXAubWFwX3ByaXZfMSA9CisJCSh1bnNpZ25lZCBsb25nKWlvcmVtYXAoZGV2LT5yZXNvdXJjZS0+c3RhcnQsCisJCQkJICAgICAgIHJlc291cmNlX3NpemUoZGV2LT5yZXNvdXJjZSkpOwogCWlmICghaW5mby0+bWFwLm1hcF9wcml2XzEpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgdG8gaW9yZW1hcCBmbGFzaCByZWdpb25cbiIpOwogCQllcnIgPSAtRUlPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9weGEyeHgtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvcHhhMnh4LWZsYXNoLmMKaW5kZXggZjU5ZDYyZi4uN2FlMTM3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9weGEyeHgtZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3B4YTJ4eC1mbGFzaC5jCkBAIC03MCw3ICs3MCw3IEBACiAJaW5mby0+bWFwLm5hbWUgPSAoY2hhciAqKSBmbGFzaC0+bmFtZTsKIAlpbmZvLT5tYXAuYmFua3dpZHRoID0gZmxhc2gtPndpZHRoOwogCWluZm8tPm1hcC5waHlzID0gcmVzLT5zdGFydDsKLQlpbmZvLT5tYXAuc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJaW5mby0+bWFwLnNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAJaW5mby0+cGFydHMgPSBmbGFzaC0+cGFydHM7CiAJaW5mby0+bnJfcGFydHMgPSBmbGFzaC0+bnJfcGFydHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGNoYXIuYyBiL2RyaXZlcnMvbXRkL210ZGNoYXIuYwppbmRleCAzZjkyNzMxLi5mMWFmMjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRjaGFyLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkY2hhci5jCkBAIC0xMTkyLDcgKzExOTIsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfbXRkY2hhcih2b2lkKQogewogCXVucmVnaXN0ZXJfbXRkX3VzZXIoJm10ZGNoYXJfbm90aWZpZXIpOwotCW1udHB1dChtdGRfaW5vZGVfbW50KTsKKwlrZXJuX3VubW91bnQobXRkX2lub2RlX21udCk7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZtdGRfaW5vZGVmc190eXBlKTsKIAlfX3VucmVnaXN0ZXJfY2hyZGV2KE1URF9DSEFSX01BSk9SLCAwLCAxIDw8IE1JTk9SQklUUywgIm10ZCIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9hdG1lbF9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2F0bWVsX25hbmQuYwppbmRleCBiMzAwNzA1Li41NWRhMjBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2F0bWVsX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2F0bWVsX25hbmQuYwpAQCAtMjIsNiArMjIsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KQEAgLTUxMyw3ICs1MTQsNyBAQAogCiAJaG9zdC0+aW9fcGh5cyA9IChkbWFfYWRkcl90KW1lbS0+c3RhcnQ7CiAKLQlob3N0LT5pb19iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCBtZW0tPmVuZCAtIG1lbS0+c3RhcnQgKyAxKTsKKwlob3N0LT5pb19iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOwogCWlmIChob3N0LT5pb19iYXNlID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhdG1lbF9uYW5kOiBpb3JlbWFwIGZhaWxlZFxuIik7CiAJCXJlcyA9IC1FSU87CkBAIC01NDcsNyArNTQ4LDcgQEAKIAlpZiAobm9fZWNjKQogCQluYW5kX2NoaXAtPmVjYy5tb2RlID0gTkFORF9FQ0NfTk9ORTsKIAlpZiAoaGFyZF9lY2MgJiYgcmVncykgewotCQlob3N0LT5lY2MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCQlob3N0LT5lY2MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKIAkJaWYgKGhvc3QtPmVjYyA9PSBOVUxMKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImF0bWVsX25hbmQ6IGlvcmVtYXAgZmFpbGVkXG4iKTsKIAkJCXJlcyA9IC1FSU87CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2JjbV91bWlfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9iY21fdW1pX25hbmQuYwppbmRleCA5ZWMyODA3Li44YzU2OWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2JjbV91bWlfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvYmNtX3VtaV9uYW5kLmMKQEAgLTM4MCw3ICszODAsNyBAQAogCQlyZXR1cm4gLUVOWElPOwogCiAJLyogbWFwIHBoeXNpY2FsIGFkZHJlc3MgKi8KLQliY21fdW1pX2lvX2Jhc2UgPSBpb3JlbWFwKHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCArIDEpOworCWJjbV91bWlfaW9fYmFzZSA9IGlvcmVtYXAoci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOwogCiAJaWYgKCFiY21fdW1pX2lvX2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpb3JlbWFwIHRvIGFjY2VzcyBCQ00gVU1JIE5BTkQgY2hpcCBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9mc2xfZWxiY19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbF9lbGJjX25hbmQuYwppbmRleCAwYmIyNTRjLi4zM2Q4YWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF9lbGJjX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbF9lbGJjX25hbmQuYwpAQCAtMzM5LDkgKzMzOSw5IEBACiAJCSAgICAgICAgICAgICAgICAgICAgKEZJUl9PUF9VQSAgPDwgRklSX09QMV9TSElGVCkgfAogCQkgICAgICAgICAgICAgICAgICAgIChGSVJfT1BfUkJXIDw8IEZJUl9PUDJfU0hJRlQpKTsKIAkJb3V0X2JlMzIoJmxiYy0+ZmNyLCBOQU5EX0NNRF9SRUFESUQgPDwgRkNSX0NNRDBfU0hJRlQpOwotCQkvKiA1IGJ5dGVzIGZvciBtYW51ZiwgZGV2aWNlIGFuZCBleHRzICovCi0JCW91dF9iZTMyKCZsYmMtPmZiY3IsIDUpOwotCQllbGJjX2ZjbV9jdHJsLT5yZWFkX2J5dGVzID0gNTsKKwkJLyogbmFuZF9nZXRfZmxhc2hfdHlwZSgpIHJlYWRzIDggYnl0ZXMgb2YgZW50aXJlIElEIHN0cmluZyAqLworCQlvdXRfYmUzMigmbGJjLT5mYmNyLCA4KTsKKwkJZWxiY19mY21fY3RybC0+cmVhZF9ieXRlcyA9IDg7CiAJCWVsYmNfZmNtX2N0cmwtPnVzZV9tZHIgPSAxOwogCQllbGJjX2ZjbV9jdHJsLT5tZHIgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL21wYzUxMjFfbmZjLmMgYi9kcml2ZXJzL210ZC9uYW5kL21wYzUxMjFfbmZjLmMKaW5kZXggMmY3YzkzMC4uZWIxZmJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9tcGM1MTIxX25mYy5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbXBjNTEyMV9uZmMuYwpAQCAtNzEzLDcgKzcxMyw3IEBACiAJfQogCiAJcmVnc19wYWRkciA9IHJlcy5zdGFydDsKLQlyZWdzX3NpemUgPSByZXMuZW5kIC0gcmVzLnN0YXJ0ICsgMTsKKwlyZWdzX3NpemUgPSByZXNvdXJjZV9zaXplKCZyZXMpOwogCiAJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbihkZXYsIHJlZ3NfcGFkZHIsIHJlZ3Nfc2l6ZSwgRFJWX05BTUUpKSB7CiAJCWRldl9lcnIoZGV2LCAiRXJyb3IgcmVxdWVzdGluZyBtZW1vcnkgcmVnaW9uIVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvYnVpbGQuYyBiL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCmluZGV4IDY1NjI2YzEuLjZjM2ZiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCkBAIC05NTMsMTAgKzk1MywxNCBAQAogCWlmICghdWJpLT5wZWJfYnVmMikKIAkJZ290byBvdXRfZnJlZTsKIAorCWVyciA9IHViaV9kZWJ1Z2dpbmdfaW5pdF9kZXYodWJpKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCiAJZXJyID0gYXR0YWNoX2J5X3NjYW5uaW5nKHViaSk7CiAJaWYgKGVycikgewogCQlkYmdfZXJyKCJmYWlsZWQgdG8gYXR0YWNoIGJ5IHNjYW5uaW5nLCBlcnJvciAlZCIsIGVycik7Ci0JCWdvdG8gb3V0X2ZyZWU7CisJCWdvdG8gb3V0X2RlYnVnZ2luZzsKIAl9CiAKIAlpZiAodWJpLT5hdXRvcmVzaXplX3ZvbF9pZCAhPSAtMSkgewpAQCAtOTY5LDEyICs5NzMsMTYgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9kZXRhY2g7CiAKKwllcnIgPSB1YmlfZGVidWdmc19pbml0X2Rldih1YmkpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VpZjsKKwogCXViaS0+Ymd0X3RocmVhZCA9IGt0aHJlYWRfY3JlYXRlKHViaV90aHJlYWQsIHViaSwgdWJpLT5iZ3RfbmFtZSk7CiAJaWYgKElTX0VSUih1YmktPmJndF90aHJlYWQpKSB7CiAJCWVyciA9IFBUUl9FUlIodWJpLT5iZ3RfdGhyZWFkKTsKIAkJdWJpX2VycigiY2Fubm90IHNwYXduIFwiJXNcIiwgZXJyb3IgJWQiLCB1YmktPmJndF9uYW1lLAogCQkJZXJyKTsKLQkJZ290byBvdXRfdWlmOworCQlnb3RvIG91dF9kZWJ1Z2ZzOwogCX0KIAogCXViaV9tc2coImF0dGFjaGVkIG10ZCVkIHRvIHViaSVkIiwgbXRkLT5pbmRleCwgdWJpX251bSk7CkBAIC0xMDA4LDEyICsxMDE2LDE4IEBACiAJdWJpX25vdGlmeV9hbGwodWJpLCBVQklfVk9MVU1FX0FEREVELCBOVUxMKTsKIAlyZXR1cm4gdWJpX251bTsKIAorb3V0X2RlYnVnZnM6CisJdWJpX2RlYnVnZnNfZXhpdF9kZXYodWJpKTsKIG91dF91aWY6CisJZ2V0X2RldmljZSgmdWJpLT5kZXYpOworCXViaV9hc3NlcnQocmVmKTsKIAl1aWZfY2xvc2UodWJpKTsKIG91dF9kZXRhY2g6CiAJdWJpX3dsX2Nsb3NlKHViaSk7CiAJZnJlZV9pbnRlcm5hbF92b2x1bWVzKHViaSk7CiAJdmZyZWUodWJpLT52dGJsKTsKK291dF9kZWJ1Z2dpbmc6CisJdWJpX2RlYnVnZ2luZ19leGl0X2Rldih1YmkpOwogb3V0X2ZyZWU6CiAJdmZyZWUodWJpLT5wZWJfYnVmMSk7CiAJdmZyZWUodWJpLT5wZWJfYnVmMik7CkBAIC0xMDgwLDExICsxMDk0LDEzIEBACiAJICovCiAJZ2V0X2RldmljZSgmdWJpLT5kZXYpOwogCisJdWJpX2RlYnVnZnNfZXhpdF9kZXYodWJpKTsKIAl1aWZfY2xvc2UodWJpKTsKIAl1Ymlfd2xfY2xvc2UodWJpKTsKIAlmcmVlX2ludGVybmFsX3ZvbHVtZXModWJpKTsKIAl2ZnJlZSh1YmktPnZ0YmwpOwogCXB1dF9tdGRfZGV2aWNlKHViaS0+bXRkKTsKKwl1YmlfZGVidWdnaW5nX2V4aXRfZGV2KHViaSk7CiAJdmZyZWUodWJpLT5wZWJfYnVmMSk7CiAJdmZyZWUodWJpLT5wZWJfYnVmMik7CiAJdWJpX21zZygibXRkJWQgaXMgZGV0YWNoZWQgZnJvbSB1YmklZCIsIHViaS0+bXRkLT5pbmRleCwgdWJpLT51YmlfbnVtKTsKQEAgLTExOTksNiArMTIxNSwxMSBAQAogCWlmICghdWJpX3dsX2VudHJ5X3NsYWIpCiAJCWdvdG8gb3V0X2Rldl91bnJlZzsKIAorCWVyciA9IHViaV9kZWJ1Z2ZzX2luaXQoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9zbGFiOworCisKIAkvKiBBdHRhY2ggTVREIGRldmljZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbXRkX2RldnM7IGkrKykgewogCQlzdHJ1Y3QgbXRkX2Rldl9wYXJhbSAqcCA9ICZtdGRfZGV2X3BhcmFtW2ldOwpAQCAtMTI0Nyw2ICsxMjY4LDggQEAKIAkJCXViaV9kZXRhY2hfbXRkX2Rldih1YmlfZGV2aWNlc1trXS0+dWJpX251bSwgMSk7CiAJCQltdXRleF91bmxvY2soJnViaV9kZXZpY2VzX211dGV4KTsKIAkJfQorCXViaV9kZWJ1Z2ZzX2V4aXQoKTsKK291dF9zbGFiOgogCWttZW1fY2FjaGVfZGVzdHJveSh1Ymlfd2xfZW50cnlfc2xhYik7CiBvdXRfZGV2X3VucmVnOgogCW1pc2NfZGVyZWdpc3RlcigmdWJpX2N0cmxfY2Rldik7CkBAIC0xMjcwLDYgKzEyOTMsNyBAQAogCQkJdWJpX2RldGFjaF9tdGRfZGV2KHViaV9kZXZpY2VzW2ldLT51YmlfbnVtLCAxKTsKIAkJCW11dGV4X3VubG9jaygmdWJpX2RldmljZXNfbXV0ZXgpOwogCQl9CisJdWJpX2RlYnVnZnNfZXhpdCgpOwogCWttZW1fY2FjaGVfZGVzdHJveSh1Ymlfd2xfZW50cnlfc2xhYik7CiAJbWlzY19kZXJlZ2lzdGVyKCZ1YmlfY3RybF9jZGV2KTsKIAljbGFzc19yZW1vdmVfZmlsZSh1YmlfY2xhc3MsICZ1YmlfdmVyc2lvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvY2Rldi5jIGIvZHJpdmVycy9tdGQvdWJpL2NkZXYuYwppbmRleCAxOTFmM2JiLi4zMzIwYTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvY2Rldi5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9jZGV2LmMKQEAgLTE4OSwxMiArMTg5LDE2IEBACiAJcmV0dXJuIG5ld19vZmZzZXQ7CiB9CiAKLXN0YXRpYyBpbnQgdm9sX2NkZXZfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK3N0YXRpYyBpbnQgdm9sX2NkZXZfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHViaV9kZXZpY2UgKnViaSA9IGRlc2MtPnZvbC0+dWJpOwotCi0JcmV0dXJuIHViaV9zeW5jKHViaS0+dWJpX251bSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJaW50IGVycjsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJZXJyID0gdWJpX3N5bmModWJpLT51YmlfbnVtKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwlyZXR1cm4gZXJyOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5jIGIvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmMKaW5kZXggMjIyNGNiZS4uYWI4MGMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmMKQEAgLTI3LDE3ICsyNyw5IEBACiAjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUcKIAogI2luY2x1ZGUgInViaS5oIgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLQotdW5zaWduZWQgaW50IHViaV9jaGtfZmxhZ3M7Ci11bnNpZ25lZCBpbnQgdWJpX3RzdF9mbGFnczsKLQotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnX2Noa3MsIHViaV9jaGtfZmxhZ3MsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z190c3RzLCB1YmlfY2hrX2ZsYWdzLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Ci0KLU1PRFVMRV9QQVJNX0RFU0MoZGVidWdfY2hrcywgIkRlYnVnIGNoZWNrIGZsYWdzIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnX3RzdHMsICJEZWJ1ZyBzcGVjaWFsIHRlc3QgZmxhZ3MiKTsKIAogLyoqCiAgKiB1YmlfZGJnX2R1bXBfZWNfaGRyIC0gZHVtcCBhbiBlcmFzZSBjb3VudGVyIGhlYWRlci4KQEAgLTIzOSw0ICsyMzEsMjYxIEBACiAJcmV0dXJuOwogfQogCisvKioKKyAqIHViaV9kZWJ1Z2dpbmdfaW5pdF9kZXYgLSBpbml0aWFsaXplIGRlYnVnZ2luZyBmb3IgYW4gVUJJIGRldmljZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBkZWJ1Z2dpbmctcmVsYXRlZCBkYXRhIGZvciBVQkkgZGV2aWNlIEB1YmkuCisgKiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZgorICogZmFpbHVyZS4KKyAqLworaW50IHViaV9kZWJ1Z2dpbmdfaW5pdF9kZXYoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwl1YmktPmRiZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1YmlfZGVidWdfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghdWJpLT5kYmcpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdWJpX2RlYnVnZ2luZ19leGl0X2RldiAtIGZyZWUgZGVidWdnaW5nIGRhdGEgZm9yIGFuIFVCSSBkZXZpY2UuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICovCit2b2lkIHViaV9kZWJ1Z2dpbmdfZXhpdF9kZXYoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlrZnJlZSh1YmktPmRiZyk7Cit9CisKKy8qCisgKiBSb290IGRpcmVjdG9yeSBmb3IgVUJJIHN0dWZmIGluIGRlYnVnZnMuIENvbnRhaW5zIHN1Yi1kaXJlY3RvcmllcyB3aGljaAorICogY29udGFpbiB0aGUgc3R1ZmYgc3BlY2lmaWMgdG8gcGFydGljdWxhciBVQkkgZGV2aWNlcy4KKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRmc19yb290ZGlyOworCisvKioKKyAqIHViaV9kZWJ1Z2ZzX2luaXQgLSBjcmVhdGUgVUJJIGRlYnVnZnMgZGlyZWN0b3J5LgorICoKKyAqIENyZWF0ZSBVQkkgZGVidWdmcyBkaXJlY3RvcnkuIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUKKyAqIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgdWJpX2RlYnVnZnNfaW5pdCh2b2lkKQoreworCWRmc19yb290ZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ1YmkiLCBOVUxMKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGZzX3Jvb3RkaXIpKSB7CisJCWludCBlcnIgPSBkZnNfcm9vdGRpciA/IC1FTk9ERVYgOiBQVFJfRVJSKGRmc19yb290ZGlyKTsKKworCQl1YmlfZXJyKCJjYW5ub3QgY3JlYXRlIFwidWJpXCIgZGVidWdmcyBkaXJlY3RvcnksIGVycm9yICVkXG4iLAorCQkJZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB1YmlfZGVidWdmc19leGl0IC0gcmVtb3ZlIFVCSSBkZWJ1Z2ZzIGRpcmVjdG9yeS4KKyAqLwordm9pZCB1YmlfZGVidWdmc19leGl0KHZvaWQpCit7CisJZGVidWdmc19yZW1vdmUoZGZzX3Jvb3RkaXIpOworfQorCisvKiBSZWFkIGFuIFVCSSBkZWJ1Z2ZzIGZpbGUgKi8KK3N0YXRpYyBzc2l6ZV90IGRmc19maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbG9uZyB1YmlfbnVtID0gKHVuc2lnbmVkIGxvbmcpZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZW50cnkgKmRlbnQgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCXN0cnVjdCB1YmlfZGV2aWNlICp1Ymk7CisJc3RydWN0IHViaV9kZWJ1Z19pbmZvICpkOworCWNoYXIgYnVmWzNdOworCWludCB2YWw7CisKKwl1YmkgPSB1YmlfZ2V0X2RldmljZSh1YmlfbnVtKTsKKwlpZiAoIXViaSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZCA9IHViaS0+ZGJnOworCisJaWYgKGRlbnQgPT0gZC0+ZGZzX2Noa19nZW4pCisJCXZhbCA9IGQtPmNoa19nZW47CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2lvKQorCQl2YWwgPSBkLT5jaGtfaW87CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfZGlzYWJsZV9iZ3QpCisJCXZhbCA9IGQtPmRpc2FibGVfYmd0OworCWVsc2UgaWYgKGRlbnQgPT0gZC0+ZGZzX2VtdWxhdGVfYml0ZmxpcHMpCisJCXZhbCA9IGQtPmVtdWxhdGVfYml0ZmxpcHM7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfZW11bGF0ZV9pb19mYWlsdXJlcykKKwkJdmFsID0gZC0+ZW11bGF0ZV9pb19mYWlsdXJlczsKKwllbHNlIHsKKwkJY291bnQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodmFsKQorCQlidWZbMF0gPSAnMSc7CisJZWxzZQorCQlidWZbMF0gPSAnMCc7CisJYnVmWzFdID0gJ1xuJzsKKwlidWZbMl0gPSAweDAwOworCisJY291bnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgMik7CisKK291dDoKKwl1YmlfcHV0X2RldmljZSh1YmkpOworCXJldHVybiBjb3VudDsKK30KKworLyogV3JpdGUgYW4gVUJJIGRlYnVnZnMgZmlsZSAqLworc3RhdGljIHNzaXplX3QgZGZzX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgdWJpX251bSA9ICh1bnNpZ25lZCBsb25nKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKKwlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpOworCXN0cnVjdCB1YmlfZGVidWdfaW5mbyAqZDsKKwlzaXplX3QgYnVmX3NpemU7CisJY2hhciBidWZbOF07CisJaW50IHZhbDsKKworCXViaSA9IHViaV9nZXRfZGV2aWNlKHViaV9udW0pOworCWlmICghdWJpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkID0gdWJpLT5kYmc7CisKKwlidWZfc2l6ZSA9IG1pbl90KHNpemVfdCwgY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKSB7CisJCWNvdW50ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGJ1ZlswXSA9PSAnMScpCisJCXZhbCA9IDE7CisJZWxzZSBpZiAoYnVmWzBdID09ICcwJykKKwkJdmFsID0gMDsKKwllbHNlIHsKKwkJY291bnQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2dlbikKKwkJZC0+Y2hrX2dlbiA9IHZhbDsKKwllbHNlIGlmIChkZW50ID09IGQtPmRmc19jaGtfaW8pCisJCWQtPmNoa19pbyA9IHZhbDsKKwllbHNlIGlmIChkZW50ID09IGQtPmRmc19kaXNhYmxlX2JndCkKKwkJZC0+ZGlzYWJsZV9iZ3QgPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfZW11bGF0ZV9iaXRmbGlwcykKKwkJZC0+ZW11bGF0ZV9iaXRmbGlwcyA9IHZhbDsKKwllbHNlIGlmIChkZW50ID09IGQtPmRmc19lbXVsYXRlX2lvX2ZhaWx1cmVzKQorCQlkLT5lbXVsYXRlX2lvX2ZhaWx1cmVzID0gdmFsOworCWVsc2UKKwkJY291bnQgPSAtRUlOVkFMOworCitvdXQ6CisJdWJpX3B1dF9kZXZpY2UodWJpKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChpbm9kZS0+aV9wcml2YXRlKQorCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbGUgb3BlcmF0aW9ucyBmb3IgYWxsIFVCSSBkZWJ1Z2ZzIGZpbGVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZnNfZm9wcyA9IHsKKwkucmVhZCAgID0gZGZzX2ZpbGVfcmVhZCwKKwkud3JpdGUgID0gZGZzX2ZpbGVfd3JpdGUsCisJLm9wZW4gICA9IGRlZmF1bHRfb3BlbiwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5vd25lciAgPSBUSElTX01PRFVMRSwKK307CisKKy8qKgorICogdWJpX2RlYnVnZnNfaW5pdF9kZXYgLSBpbml0aWFsaXplIGRlYnVnZnMgZm9yIGFuIFVCSSBkZXZpY2UuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbGwgZGVidWdmcyBmaWxlcyBmb3IgVUJJIGRldmljZSBAdWJpLiBSZXR1cm5zIHplcm8gaW4KKyAqIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9kZWJ1Z2ZzX2luaXRfZGV2KHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJaW50IGVyciwgbjsKKwl1bnNpZ25lZCBsb25nIHViaV9udW0gPSB1YmktPnViaV9udW07CisJY29uc3QgY2hhciAqZm5hbWU7CisJc3RydWN0IGRlbnRyeSAqZGVudDsKKwlzdHJ1Y3QgdWJpX2RlYnVnX2luZm8gKmQgPSB1YmktPmRiZzsKKworCW4gPSBzbnByaW50ZihkLT5kZnNfZGlyX25hbWUsIFVCSV9ERlNfRElSX0xFTiArIDEsIFVCSV9ERlNfRElSX05BTUUsCisJCSAgICAgdWJpLT51YmlfbnVtKTsKKwlpZiAobiA9PSBVQklfREZTX0RJUl9MRU4pIHsKKwkJLyogVGhlIGFycmF5IHNpemUgaXMgdG9vIHNtYWxsICovCisJCWZuYW1lID0gVUJJX0RGU19ESVJfTkFNRTsKKwkJZGVudCA9IEVSUl9QVFIoLUVJTlZBTCk7CisJCWdvdG8gb3V0OworCX0KKworCWZuYW1lID0gZC0+ZGZzX2Rpcl9uYW1lOworCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZm5hbWUsIGRmc19yb290ZGlyKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0OworCWQtPmRmc19kaXIgPSBkZW50OworCisJZm5hbWUgPSAiY2hrX2dlbiI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVdVU1IsIGQtPmRmc19kaXIsICh2b2lkICopdWJpX251bSwKKwkJCQkgICAmZGZzX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBvdXRfcmVtb3ZlOworCWQtPmRmc19jaGtfZ2VuID0gZGVudDsKKworCWZuYW1lID0gImNoa19pbyI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVdVU1IsIGQtPmRmc19kaXIsICh2b2lkICopdWJpX251bSwKKwkJCQkgICAmZGZzX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBvdXRfcmVtb3ZlOworCWQtPmRmc19jaGtfaW8gPSBkZW50OworCisJZm5hbWUgPSAidHN0X2Rpc2FibGVfYmd0IjsKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShmbmFtZSwgU19JV1VTUiwgZC0+ZGZzX2RpciwgKHZvaWQgKil1YmlfbnVtLAorCQkJCSAgICZkZnNfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZC0+ZGZzX2Rpc2FibGVfYmd0ID0gZGVudDsKKworCWZuYW1lID0gInRzdF9lbXVsYXRlX2JpdGZsaXBzIjsKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShmbmFtZSwgU19JV1VTUiwgZC0+ZGZzX2RpciwgKHZvaWQgKil1YmlfbnVtLAorCQkJCSAgICZkZnNfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZC0+ZGZzX2VtdWxhdGVfYml0ZmxpcHMgPSBkZW50OworCisJZm5hbWUgPSAidHN0X2VtdWxhdGVfaW9fZmFpbHVyZXMiOworCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGZuYW1lLCBTX0lXVVNSLCBkLT5kZnNfZGlyLCAodm9pZCAqKXViaV9udW0sCisJCQkJICAgJmRmc19mb3BzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0X3JlbW92ZTsKKwlkLT5kZnNfZW11bGF0ZV9pb19mYWlsdXJlcyA9IGRlbnQ7CisKKwlyZXR1cm4gMDsKKworb3V0X3JlbW92ZToKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZC0+ZGZzX2Rpcik7CitvdXQ6CisJZXJyID0gZGVudCA/IFBUUl9FUlIoZGVudCkgOiAtRU5PREVWOworCXViaV9lcnIoImNhbm5vdCBjcmVhdGUgXCIlc1wiIGRlYnVnZnMgZmlsZSBvciBkaXJlY3RvcnksIGVycm9yICVkXG4iLAorCQlmbmFtZSwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGRiZ19kZWJ1Z19leGl0X2RldiAtIGZyZWUgYWxsIGRlYnVnZnMgZmlsZXMgY29ycmVzcG9uZGluZyB0byBkZXZpY2UgQHViaQorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqLwordm9pZCB1YmlfZGVidWdmc19leGl0X2RldihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh1YmktPmRiZy0+ZGZzX2Rpcik7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfTVREX1VCSV9ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmggYi9kcml2ZXJzL210ZC91YmkvZGVidWcuaAppbmRleCAzZjFhMDljLi42NWI1Yjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvZGVidWcuaAorKysgYi9kcml2ZXJzL210ZC91YmkvZGVidWcuaApAQCAtMjEsMTQgKzIxLDYgQEAKICNpZm5kZWYgX19VQklfREVCVUdfSF9fCiAjZGVmaW5lIF9fVUJJX0RFQlVHX0hfXwogCi1zdHJ1Y3QgdWJpX2VjX2hkcjsKLXN0cnVjdCB1YmlfdmlkX2hkcjsKLXN0cnVjdCB1Ymlfdm9sdW1lOwotc3RydWN0IHViaV92dGJsX3JlY29yZDsKLXN0cnVjdCB1Ymlfc2Nhbl92b2x1bWU7Ci1zdHJ1Y3QgdWJpX3NjYW5fbGViOwotc3RydWN0IHViaV9ta3ZvbF9yZXE7Ci0KICNpZmRlZiBDT05GSUdfTVREX1VCSV9ERUJVRwogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogCkBAIC03MSw4NiArNjMsMTAzIEBACiB2b2lkIHViaV9kYmdfZHVtcF9zZWIoY29uc3Qgc3RydWN0IHViaV9zY2FuX2xlYiAqc2ViLCBpbnQgdHlwZSk7CiB2b2lkIHViaV9kYmdfZHVtcF9ta3ZvbF9yZXEoY29uc3Qgc3RydWN0IHViaV9ta3ZvbF9yZXEgKnJlcSk7CiB2b2lkIHViaV9kYmdfZHVtcF9mbGFzaChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSwgaW50IG9mZnNldCwgaW50IGxlbik7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgdWJpX2Noa19mbGFnczsKLQotLyoKLSAqIERlYnVnZ2luZyBjaGVjayBmbGFncy4KLSAqCi0gKiBVQklfQ0hLX0dFTjogZ2VuZXJhbCBjaGVja3MKLSAqIFVCSV9DSEtfSU86IGNoZWNrIHdyaXRlcyBhbmQgZXJhc2VzCi0gKi8KLWVudW0gewotCVVCSV9DSEtfR0VOID0gMHgxLAotCVVCSV9DSEtfSU8gID0gMHgyLAotfTsKLQogaW50IHViaV9kYmdfY2hlY2tfYWxsX2ZmKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKTsKIGludCB1YmlfZGJnX2NoZWNrX3dyaXRlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IHBudW0sCiAJCQlpbnQgb2Zmc2V0LCBpbnQgbGVuKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCB1YmlfdHN0X2ZsYWdzOworaW50IHViaV9kZWJ1Z2dpbmdfaW5pdF9kZXYoc3RydWN0IHViaV9kZXZpY2UgKnViaSk7Cit2b2lkIHViaV9kZWJ1Z2dpbmdfZXhpdF9kZXYoc3RydWN0IHViaV9kZXZpY2UgKnViaSk7CitpbnQgdWJpX2RlYnVnZnNfaW5pdCh2b2lkKTsKK3ZvaWQgdWJpX2RlYnVnZnNfZXhpdCh2b2lkKTsKK2ludCB1YmlfZGVidWdmc19pbml0X2RldihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKTsKK3ZvaWQgdWJpX2RlYnVnZnNfZXhpdF9kZXYoc3RydWN0IHViaV9kZXZpY2UgKnViaSk7CiAKIC8qCi0gKiBTcGVjaWFsIHRlc3RpbmcgZmxhZ3MuCi0gKgotICogVUJJRlNfVFNUX0RJU0FCTEVfQkdUOiBkaXNhYmxlIHRoZSBiYWNrZ3JvdW5kIHRocmVhZAotICogVUJJX1RTVF9FTVVMQVRFX0JJVEZMSVBTOiBlbXVsYXRlIGJpdC1mbGlwcwotICogVUJJX1RTVF9FTVVMQVRFX1dSSVRFX0ZBSUxVUkVTOiBlbXVsYXRlIHdyaXRlIGZhaWx1cmVzCi0gKiBVQklfVFNUX0VNVUxBVEVfRVJBU0VfRkFJTFVSRVM6IGVtdWxhdGUgZXJhc2UgZmFpbHVyZXMKKyAqIFRoZSBVQkkgZGVidWdmcyBkaXJlY3RvcnkgbmFtZSBwYXR0ZXJuIGFuZCBtYXhpbXVtIG5hbWUgbGVuZ3RoICgzIGZvciAidWJpIgorICogKyAyIGZvciB0aGUgbnVtYmVyIHBsdXMgMSBmb3IgdGhlIHRyYWlsaW5nIHplcm8gYnl0ZS4KICAqLwotZW51bSB7Ci0JVUJJX1RTVF9ESVNBQkxFX0JHVCAgICAgICAgICAgID0gMHgxLAotCVVCSV9UU1RfRU1VTEFURV9CSVRGTElQUyAgICAgICA9IDB4MiwKLQlVQklfVFNUX0VNVUxBVEVfV1JJVEVfRkFJTFVSRVMgPSAweDQsCi0JVUJJX1RTVF9FTVVMQVRFX0VSQVNFX0ZBSUxVUkVTID0gMHg4LAorI2RlZmluZSBVQklfREZTX0RJUl9OQU1FICJ1YmklZCIKKyNkZWZpbmUgVUJJX0RGU19ESVJfTEVOICAoMyArIDIgKyAxKQorCisvKioKKyAqIHN0cnVjdCB1YmlfZGVidWdfaW5mbyAtIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYW4gVUJJIGRldmljZS4KKyAqCisgKiBAY2hrX2dlbjogaWYgVUJJIGdlbmVyYWwgZXh0cmEgY2hlY2tzIGFyZSBlbmFibGVkCisgKiBAY2hrX2lvOiBpZiBVQkkgSS9PIGV4dHJhIGNoZWNrcyBhcmUgZW5hYmxlZAorICogQGRpc2FibGVfYmd0OiBkaXNhYmxlIHRoZSBiYWNrZ3JvdW5kIHRhc2sgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAqIEBlbXVsYXRlX2JpdGZsaXBzOiBlbXVsYXRlIGJpdC1mbGlwcyBmb3IgdGVzdGluZyBwdXJwb3NlcworICogQGVtdWxhdGVfaW9fZmFpbHVyZXM6IGVtdWxhdGUgd3JpdGUvZXJhc2UgZmFpbHVyZXMgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAqIEBkZnNfZGlyX25hbWU6IG5hbWUgb2YgZGVidWdmcyBkaXJlY3RvcnkgY29udGFpbmluZyBmaWxlcyBvZiB0aGlzIFVCSSBkZXZpY2UKKyAqIEBkZnNfZGlyOiBkaXJlbnRyeSBvYmplY3Qgb2YgdGhlIFVCSSBkZXZpY2UgZGVidWdmcyBkaXJlY3RvcnkKKyAqIEBkZnNfY2hrX2dlbjogZGVidWdmcyBrbm9iIHRvIGVuYWJsZSBVQkkgZ2VuZXJhbCBleHRyYSBjaGVja3MKKyAqIEBkZnNfY2hrX2lvOiBkZWJ1Z2ZzIGtub2IgdG8gZW5hYmxlIFVCSSBJL08gZXh0cmEgY2hlY2tzCisgKiBAZGZzX2Rpc2FibGVfYmd0OiBkZWJ1Z2ZzIGtub2IgdG8gZGlzYWJsZSB0aGUgYmFja2dyb3VuZCB0YXNrCisgKiBAZGZzX2VtdWxhdGVfYml0ZmxpcHM6IGRlYnVnZnMga25vYiB0byBlbXVsYXRlIGJpdC1mbGlwcworICogQGRmc19lbXVsYXRlX2lvX2ZhaWx1cmVzOiBkZWJ1Z2ZzIGtub2IgdG8gZW11bGF0ZSB3cml0ZS9lcmFzZSBmYWlsdXJlcworICovCitzdHJ1Y3QgdWJpX2RlYnVnX2luZm8geworCXVuc2lnbmVkIGludCBjaGtfZ2VuOjE7CisJdW5zaWduZWQgaW50IGNoa19pbzoxOworCXVuc2lnbmVkIGludCBkaXNhYmxlX2JndDoxOworCXVuc2lnbmVkIGludCBlbXVsYXRlX2JpdGZsaXBzOjE7CisJdW5zaWduZWQgaW50IGVtdWxhdGVfaW9fZmFpbHVyZXM6MTsKKwljaGFyIGRmc19kaXJfbmFtZVtVQklfREZTX0RJUl9MRU4gKyAxXTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZnNfZGlyOworCXN0cnVjdCBkZW50cnkgKmRmc19jaGtfZ2VuOworCXN0cnVjdCBkZW50cnkgKmRmc19jaGtfaW87CisJc3RydWN0IGRlbnRyeSAqZGZzX2Rpc2FibGVfYmd0OworCXN0cnVjdCBkZW50cnkgKmRmc19lbXVsYXRlX2JpdGZsaXBzOworCXN0cnVjdCBkZW50cnkgKmRmc19lbXVsYXRlX2lvX2ZhaWx1cmVzOwogfTsKIAogLyoqCiAgKiB1YmlfZGJnX2lzX2JndF9kaXNhYmxlZCAtIGlmIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBpcyBkaXNhYmxlZC4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CiAgKgogICogUmV0dXJucyBub24temVybyBpZiB0aGUgVUJJIGJhY2tncm91bmQgdGhyZWFkIGlzIGRpc2FibGVkIGZvciB0ZXN0aW5nCiAgKiBwdXJwb3Nlcy4KICAqLwotc3RhdGljIGlubGluZSBpbnQgdWJpX2RiZ19pc19iZ3RfZGlzYWJsZWQodm9pZCkKK3N0YXRpYyBpbmxpbmUgaW50IHViaV9kYmdfaXNfYmd0X2Rpc2FibGVkKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCiB7Ci0JcmV0dXJuIHViaV90c3RfZmxhZ3MgJiBVQklfVFNUX0RJU0FCTEVfQkdUOworCXJldHVybiB1YmktPmRiZy0+ZGlzYWJsZV9iZ3Q7CiB9CiAKIC8qKgogICogdWJpX2RiZ19pc19iaXRmbGlwIC0gaWYgaXQgaXMgdGltZSB0byBlbXVsYXRlIGEgYml0LWZsaXAuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAogICoKICAqIFJldHVybnMgbm9uLXplcm8gaWYgYSBiaXQtZmxpcCBzaG91bGQgYmUgZW11bGF0ZWQsIG90aGVyd2lzZSByZXR1cm5zIHplcm8uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHViaV9kYmdfaXNfYml0ZmxpcCh2b2lkKQorc3RhdGljIGlubGluZSBpbnQgdWJpX2RiZ19pc19iaXRmbGlwKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCiB7Ci0JaWYgKHViaV90c3RfZmxhZ3MgJiBVQklfVFNUX0VNVUxBVEVfQklURkxJUFMpCisJaWYgKHViaS0+ZGJnLT5lbXVsYXRlX2JpdGZsaXBzKQogCQlyZXR1cm4gIShyYW5kb20zMigpICUgMjAwKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCiAgKiB1YmlfZGJnX2lzX3dyaXRlX2ZhaWx1cmUgLSBpZiBpdCBpcyB0aW1lIHRvIGVtdWxhdGUgYSB3cml0ZSBmYWlsdXJlLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqCiAgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGEgd3JpdGUgZmFpbHVyZSBzaG91bGQgYmUgZW11bGF0ZWQsIG90aGVyd2lzZSByZXR1cm5zCiAgKiB6ZXJvLgogICovCi1zdGF0aWMgaW5saW5lIGludCB1YmlfZGJnX2lzX3dyaXRlX2ZhaWx1cmUodm9pZCkKK3N0YXRpYyBpbmxpbmUgaW50IHViaV9kYmdfaXNfd3JpdGVfZmFpbHVyZShjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQogewotCWlmICh1YmlfdHN0X2ZsYWdzICYgVUJJX1RTVF9FTVVMQVRFX1dSSVRFX0ZBSUxVUkVTKQorCWlmICh1YmktPmRiZy0+ZW11bGF0ZV9pb19mYWlsdXJlcykKIAkJcmV0dXJuICEocmFuZG9tMzIoKSAlIDUwMCk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgogICogdWJpX2RiZ19pc19lcmFzZV9mYWlsdXJlIC0gaWYgaXRzIHRpbWUgdG8gZW11bGF0ZSBhbiBlcmFzZSBmYWlsdXJlLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqCiAgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGFuIGVyYXNlIGZhaWx1cmUgc2hvdWxkIGJlIGVtdWxhdGVkLCBvdGhlcndpc2UgcmV0dXJucwogICogemVyby4KICAqLwotc3RhdGljIGlubGluZSBpbnQgdWJpX2RiZ19pc19lcmFzZV9mYWlsdXJlKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCB1YmlfZGJnX2lzX2VyYXNlX2ZhaWx1cmUoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSkKIHsKLQlpZiAodWJpX3RzdF9mbGFncyAmIFVCSV9UU1RfRU1VTEFURV9FUkFTRV9GQUlMVVJFUykKKwlpZiAodWJpLT5kYmctPmVtdWxhdGVfaW9fZmFpbHVyZXMpCiAJCXJldHVybiAhKHJhbmRvbTMyKCkgJSA0MDApOwogCXJldHVybiAwOwogfQpAQCAtMjAxLDExICsyMTAsNiBAQAogc3RhdGljIGlubGluZSB2b2lkCiB1YmlfZGJnX3ByaW50X2hleF9kdW1wKGNvbnN0IGNoYXIgKmwsIGNvbnN0IGNoYXIgKnBzLCBpbnQgcHQsIGludCByLAogCQkgICAgICAgaW50IGcsIGNvbnN0IHZvaWQgKmIsIHNpemVfdCBsZW4sIGJvb2wgYSkgICAgIHsgcmV0dXJuOyB9Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHViaV9kYmdfaXNfYmd0X2Rpc2FibGVkKHZvaWQpICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCB1YmlfZGJnX2lzX2JpdGZsaXAodm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgdWJpX2RiZ19pc193cml0ZV9mYWlsdXJlKHZvaWQpICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHViaV9kYmdfaXNfZXJhc2VfZmFpbHVyZSh2b2lkKSAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCB1YmlfZGJnX2NoZWNrX2FsbF9mZihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLAogCQkJCSAgICAgICBpbnQgcG51bSwgaW50IG9mZnNldCwKIAkJCQkgICAgICAgaW50IGxlbikgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDA7IH0KQEAgLTIxMyw1ICsyMTcsMjAgQEAKIAkJCQkgICAgICBjb25zdCB2b2lkICpidWYsIGludCBwbnVtLAogCQkJCSAgICAgIGludCBvZmZzZXQsIGludCBsZW4pICAgICAgICAgeyByZXR1cm4gMDsgfQogCitzdGF0aWMgaW5saW5lIGludCB1YmlfZGVidWdnaW5nX2luaXRfZGV2KHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHViaV9kZWJ1Z2dpbmdfZXhpdF9kZXYoc3RydWN0IHViaV9kZXZpY2UgKnViaSkgIHsgcmV0dXJuOyB9CitzdGF0aWMgaW5saW5lIGludCB1YmlfZGVidWdmc19pbml0KHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHViaV9kZWJ1Z2ZzX2V4aXQodm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuOyB9CitzdGF0aWMgaW5saW5lIGludCB1YmlfZGVidWdmc19pbml0X2RldihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKSAgICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHViaV9kZWJ1Z2ZzX2V4aXRfZGV2KHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpICAgIHsgcmV0dXJuOyB9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit1YmlfZGJnX2lzX2JndF9kaXNhYmxlZChjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKSAgICAgICAgICAgICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgdWJpX2RiZ19pc19iaXRmbGlwKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50Cit1YmlfZGJnX2lzX3dyaXRlX2ZhaWx1cmUoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSkgICAgICAgICAgICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQKK3ViaV9kYmdfaXNfZXJhc2VfZmFpbHVyZShjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKSAgICAgICAgICAgICB7IHJldHVybiAwOyB9CisKICNlbmRpZiAvKiAhQ09ORklHX01URF9VQklfREVCVUcgKi8KICNlbmRpZiAvKiAhX19VQklfREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvaW8uYyBiL2RyaXZlcnMvbXRkL3ViaS9pby5jCmluZGV4IDhjMWIxYzcuLjZiYTU1YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9pby5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9pby5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIAl9IGVsc2UgewogCQl1YmlfYXNzZXJ0KGxlbiA9PSByZWFkKTsKIAotCQlpZiAodWJpX2RiZ19pc19iaXRmbGlwKCkpIHsKKwkJaWYgKHViaV9kYmdfaXNfYml0ZmxpcCh1YmkpKSB7CiAJCQlkYmdfZ2VuKCJiaXQtZmxpcCAoZW11bGF0ZWQpIik7CiAJCQllcnIgPSBVQklfSU9fQklURkxJUFM7CiAJCX0KQEAgLTI4MSw3ICsyODEsNyBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAodWJpX2RiZ19pc193cml0ZV9mYWlsdXJlKCkpIHsKKwlpZiAodWJpX2RiZ19pc193cml0ZV9mYWlsdXJlKHViaSkpIHsKIAkJZGJnX2VycigiY2Fubm90IHdyaXRlICVkIGJ5dGVzIHRvIFBFQiAlZDolZCAiCiAJCQkiKGVtdWxhdGVkKSIsIGxlbiwgcG51bSwgb2Zmc2V0KTsKIAkJdWJpX2RiZ19kdW1wX3N0YWNrKCk7CkBAIC0zOTYsNyArMzk2LDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKHViaV9kYmdfaXNfZXJhc2VfZmFpbHVyZSgpKSB7CisJaWYgKHViaV9kYmdfaXNfZXJhc2VfZmFpbHVyZSh1YmkpKSB7CiAJCWRiZ19lcnIoImNhbm5vdCBlcmFzZSBQRUIgJWQgKGVtdWxhdGVkKSIsIHBudW0pOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMTQ2LDcgKzExNDYsNyBAQAogewogCWludCBlcnI7CiAKLQlpZiAoISh1YmlfY2hrX2ZsYWdzICYgVUJJX0NIS19JTykpCisJaWYgKCF1YmktPmRiZy0+Y2hrX2lvKQogCQlyZXR1cm4gMDsKIAogCWVyciA9IHViaV9pb19pc19iYWQodWJpLCBwbnVtKTsKQEAgLTExNzMsNyArMTE3Myw3IEBACiAJaW50IGVycjsKIAl1aW50MzJfdCBtYWdpYzsKIAotCWlmICghKHViaV9jaGtfZmxhZ3MgJiBVQklfQ0hLX0lPKSkKKwlpZiAoIXViaS0+ZGJnLT5jaGtfaW8pCiAJCXJldHVybiAwOwogCiAJbWFnaWMgPSBiZTMyX3RvX2NwdShlY19oZHItPm1hZ2ljKTsKQEAgLTEyMTEsNyArMTIxMSw3IEBACiAJdWludDMyX3QgY3JjLCBoZHJfY3JjOwogCXN0cnVjdCB1YmlfZWNfaGRyICplY19oZHI7CiAKLQlpZiAoISh1YmlfY2hrX2ZsYWdzICYgVUJJX0NIS19JTykpCisJaWYgKCF1YmktPmRiZy0+Y2hrX2lvKQogCQlyZXR1cm4gMDsKIAogCWVjX2hkciA9IGt6YWxsb2ModWJpLT5lY19oZHJfYWxzaXplLCBHRlBfTk9GUyk7CkBAIC0xMjU1LDcgKzEyNTUsNyBAQAogCWludCBlcnI7CiAJdWludDMyX3QgbWFnaWM7CiAKLQlpZiAoISh1YmlfY2hrX2ZsYWdzICYgVUJJX0NIS19JTykpCisJaWYgKCF1YmktPmRiZy0+Y2hrX2lvKQogCQlyZXR1cm4gMDsKIAogCW1hZ2ljID0gYmUzMl90b19jcHUodmlkX2hkci0+bWFnaWMpOwpAQCAtMTI5Niw3ICsxMjk2LDcgQEAKIAlzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHI7CiAJdm9pZCAqcDsKIAotCWlmICghKHViaV9jaGtfZmxhZ3MgJiBVQklfQ0hLX0lPKSkKKwlpZiAoIXViaS0+ZGJnLT5jaGtfaW8pCiAJCXJldHVybiAwOwogCiAJdmlkX2hkciA9IHViaV96YWxsb2NfdmlkX2hkcih1YmksIEdGUF9OT0ZTKTsKQEAgLTEzNDgsNyArMTM0OCw3IEBACiAJdm9pZCAqYnVmMTsKIAlsb2ZmX3QgYWRkciA9IChsb2ZmX3QpcG51bSAqIHViaS0+cGViX3NpemUgKyBvZmZzZXQ7CiAKLQlpZiAoISh1YmlfY2hrX2ZsYWdzICYgVUJJX0NIS19JTykpCisJaWYgKCF1YmktPmRiZy0+Y2hrX2lvKQogCQlyZXR1cm4gMDsKIAogCWJ1ZjEgPSBfX3ZtYWxsb2MobGVuLCBHRlBfTk9GUywgUEFHRV9LRVJORUwpOwpAQCAtMTQxMiw3ICsxNDEyLDcgQEAKIAl2b2lkICpidWY7CiAJbG9mZl90IGFkZHIgPSAobG9mZl90KXBudW0gKiB1YmktPnBlYl9zaXplICsgb2Zmc2V0OwogCi0JaWYgKCEodWJpX2Noa19mbGFncyAmIFVCSV9DSEtfSU8pKQorCWlmICghdWJpLT5kYmctPmNoa19pbykKIAkJcmV0dXJuIDA7CiAKIAlidWYgPSBfX3ZtYWxsb2MobGVuLCBHRlBfTk9GUywgUEFHRV9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3NjYW4uYyBiL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKaW5kZXggMjEzNWE1My4uYTNhMTk4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3NjYW4uYworKysgYi9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jCkBAIC0xMzQ3LDcgKzEzNDcsNyBAQAogCXN0cnVjdCB1Ymlfc2Nhbl9sZWIgKnNlYiwgKmxhc3Rfc2ViOwogCXVpbnQ4X3QgKmJ1ZjsKIAotCWlmICghKHViaV9jaGtfZmxhZ3MgJiBVQklfQ0hLX0dFTikpCisJaWYgKCF1YmktPmRiZy0+Y2hrX2dlbikKIAkJcmV0dXJuIDA7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3ViaS5oIGIvZHJpdmVycy9tdGQvdWJpL3ViaS5oCmluZGV4IGM2YzIyMjkuLmRjNjRjNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS91YmkuaAorKysgYi9kcml2ZXJzL210ZC91YmkvdWJpLmgKQEAgLTQ0LDcgKzQ0LDYgQEAKIAogI2luY2x1ZGUgInViaS1tZWRpYS5oIgogI2luY2x1ZGUgInNjYW4uaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgogCiAvKiBNYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgVUJJIGRldmljZXMgKi8KICNkZWZpbmUgVUJJX01BWF9ERVZJQ0VTIDMyCkBAIC0zOTAsNiArMzg5LDggQEAKICAqIEBwZWJfYnVmMjogYW5vdGhlciBidWZmZXIgb2YgUEVCIHNpemUgdXNlZCBmb3IgZGlmZmVyZW50IHB1cnBvc2VzCiAgKiBAYnVmX211dGV4OiBwcm90ZWN0cyBAcGViX2J1ZjEgYW5kIEBwZWJfYnVmMgogICogQGNrdm9sX211dGV4OiBzZXJpYWxpemVzIHN0YXRpYyB2b2x1bWUgY2hlY2tpbmcgd2hlbiBvcGVuaW5nCisgKgorICogQGRiZzogZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGlzIFVCSSBkZXZpY2UKICAqLwogc3RydWN0IHViaV9kZXZpY2UgewogCXN0cnVjdCBjZGV2IGNkZXY7CkBAIC00NzIsOCArNDczLDEyIEBACiAJdm9pZCAqcGViX2J1ZjI7CiAJc3RydWN0IG11dGV4IGJ1Zl9tdXRleDsKIAlzdHJ1Y3QgbXV0ZXggY2t2b2xfbXV0ZXg7CisKKwlzdHJ1Y3QgdWJpX2RlYnVnX2luZm8gKmRiZzsKIH07CiAKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnViaV93bF9lbnRyeV9zbGFiOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWJpX2N0cmxfY2Rldl9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWJpX2NkZXZfb3BlcmF0aW9uczsKQEAgLTY2Miw2ICs2NjcsNyBAQAogCWlmICghdWJpLT5yb19tb2RlKSB7CiAJCXViaS0+cm9fbW9kZSA9IDE7CiAJCXViaV93YXJuKCJzd2l0Y2ggdG8gcmVhZC1vbmx5IG1vZGUiKTsKKwkJdWJpX2RiZ19kdW1wX3N0YWNrKCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvdm10LmMgYi9kcml2ZXJzL210ZC91Ymkvdm10LmMKaW5kZXggMzY2ZWI3MC4uOTdlMDkzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3ZtdC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS92bXQuYwpAQCAtODcxLDcgKzg3MSw3IEBACiB7CiAJaW50IGksIGVyciA9IDA7CiAKLQlpZiAoISh1YmlfY2hrX2ZsYWdzICYgVUJJX0NIS19HRU4pKQorCWlmICghdWJpLT5kYmctPmNoa19nZW4pCiAJCXJldHVybiAwOwogCiAJZm9yIChpID0gMDsgaSA8IHViaS0+dnRibF9zbG90czsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvdnRibC5jIGIvZHJpdmVycy9tdGQvdWJpL3Z0YmwuYwppbmRleCBmZDNiZjc3Li40YjUwYTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvdnRibC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS92dGJsLmMKQEAgLTMwNyw4ICszMDcsNyBAQAogewogCWludCBlcnIsIHRyaWVzID0gMDsKIAlzdGF0aWMgc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyOwotCXN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUgKnN2OwotCXN0cnVjdCB1Ymlfc2Nhbl9sZWIgKm5ld19zZWIsICpvbGRfc2ViID0gTlVMTDsKKwlzdHJ1Y3QgdWJpX3NjYW5fbGViICpuZXdfc2ViOwogCiAJdWJpX21zZygiY3JlYXRlIHZvbHVtZSB0YWJsZSAoY29weSAjJWQpIiwgY29weSArIDEpOwogCkBAIC0zMTYsMTUgKzMxNSw2IEBACiAJaWYgKCF2aWRfaGRyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCS8qCi0JICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBsb2dpY2FsIGVyYXNlYmxvY2sgd2hpY2ggd291bGQgaGF2ZSB0byBjb250YWluCi0JICogdGhpcyB2b2x1bWUgdGFibGUgY29weSB3YXMgZm91bmQgZHVyaW5nIHNjYW5uaW5nLiBJdCBoYXMgdG8gYmUgd2lwZWQKLQkgKiBvdXQuCi0JICovCi0Jc3YgPSB1Ymlfc2Nhbl9maW5kX3N2KHNpLCBVQklfTEFZT1VUX1ZPTFVNRV9JRCk7Ci0JaWYgKHN2KQotCQlvbGRfc2ViID0gdWJpX3NjYW5fZmluZF9zZWIoc3YsIGNvcHkpOwotCiByZXRyeToKIAluZXdfc2ViID0gdWJpX3NjYW5fZ2V0X2ZyZWVfcGViKHViaSwgc2kpOwogCWlmIChJU19FUlIobmV3X3NlYikpIHsKQEAgLTM1MSw4ICszNDEsOCBAQAogCQlnb3RvIHdyaXRlX2Vycm9yOwogCiAJLyoKLQkgKiBBbmQgYWRkIGl0IHRvIHRoZSBzY2FubmluZyBpbmZvcm1hdGlvbi4gRG9uJ3QgZGVsZXRlIHRoZSBvbGQKLQkgKiBAb2xkX3NlYiBhcyBpdCB3aWxsIGJlIGRlbGV0ZWQgYW5kIGZyZWVkIGluICd1Ymlfc2Nhbl9hZGRfdXNlZCgpJy4KKwkgKiBBbmQgYWRkIGl0IHRvIHRoZSBzY2FubmluZyBpbmZvcm1hdGlvbi4gRG9uJ3QgZGVsZXRlIHRoZSBvbGQgdmVyc2lvbgorCSAqIG9mIHRoaXMgTEVCIGFzIGl0IHdpbGwgYmUgZGVsZXRlZCBhbmQgZnJlZWQgaW4gJ3ViaV9zY2FuX2FkZF91c2VkKCknLgogCSAqLwogCWVyciA9IHViaV9zY2FuX2FkZF91c2VkKHViaSwgc2ksIG5ld19zZWItPnBudW0sIG5ld19zZWItPmVjLAogCQkJCXZpZF9oZHIsIDApOwpAQCAtODc2LDcgKzg2Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHBhcmFub2lkX3Z0YmxfY2hlY2soY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSkKIHsKLQlpZiAoISh1YmlfY2hrX2ZsYWdzICYgVUJJX0NIS19HRU4pKQorCWlmICghdWJpLT5kYmctPmNoa19nZW4pCiAJCXJldHVybjsKIAogCWlmICh2dGJsX2NoZWNrKHViaSwgdWJpLT52dGJsKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3dsLmMgYi9kcml2ZXJzL210ZC91Ymkvd2wuYwppbmRleCBmZjJjNDk1Li40MmM2ODRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91Ymkvd2wuYworKysgYi9kcml2ZXJzL210ZC91Ymkvd2wuYwpAQCAtMSw0ICsxLDUgQEAKIC8qCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAogICogQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDA2CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTE2MywxMiArMTY0LDE0IEBACiAKICNpZmRlZiBDT05GSUdfTVREX1VCSV9ERUJVRwogc3RhdGljIGludCBwYXJhbm9pZF9jaGVja19lYyhzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSwgaW50IGVjKTsKLXN0YXRpYyBpbnQgcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZShzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplLAorc3RhdGljIGludCBwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksCisJCQkJICAgICBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplLAogCQkJCSAgICAgc3RydWN0IHJiX3Jvb3QgKnJvb3QpOwotc3RhdGljIGludCBwYXJhbm9pZF9jaGVja19pbl9wcShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplKTsKK3N0YXRpYyBpbnQgcGFyYW5vaWRfY2hlY2tfaW5fcHEoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCQlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplKTsKICNlbHNlCiAjZGVmaW5lIHBhcmFub2lkX2NoZWNrX2VjKHViaSwgcG51bSwgZWMpIDAKLSNkZWZpbmUgcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZShlLCByb290KQorI2RlZmluZSBwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKHViaSwgZSwgcm9vdCkKICNkZWZpbmUgcGFyYW5vaWRfY2hlY2tfaW5fcHEodWJpLCBlKSAwCiAjZW5kaWYKIApAQCAtNDQ5LDcgKzQ1Miw3IEBACiAJCUJVRygpOwogCX0KIAotCXBhcmFub2lkX2NoZWNrX2luX3dsX3RyZWUoZSwgJnViaS0+ZnJlZSk7CisJcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZSh1YmksIGUsICZ1YmktPmZyZWUpOwogCiAJLyoKIAkgKiBNb3ZlIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIHRoZSBwcm90ZWN0aW9uIHF1ZXVlIHdoZXJlIGl0IHdpbGwKQEAgLTYxMyw3ICs2MTYsNyBAQAogCWxpc3RfYWRkX3RhaWwoJndyay0+bGlzdCwgJnViaS0+d29ya3MpOwogCXViaV9hc3NlcnQodWJpLT53b3Jrc19jb3VudCA+PSAwKTsKIAl1YmktPndvcmtzX2NvdW50ICs9IDE7Ci0JaWYgKHViaS0+dGhyZWFkX2VuYWJsZWQgJiYgIXViaV9kYmdfaXNfYmd0X2Rpc2FibGVkKCkpCisJaWYgKHViaS0+dGhyZWFkX2VuYWJsZWQgJiYgIXViaV9kYmdfaXNfYmd0X2Rpc2FibGVkKHViaSkpCiAJCXdha2VfdXBfcHJvY2Vzcyh1YmktPmJndF90aHJlYWQpOwogCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOwogfQpAQCAtNzEyLDcgKzcxNSw3IEBACiAJCQkgICAgICAgZTEtPmVjLCBlMi0+ZWMpOwogCQkJZ290byBvdXRfY2FuY2VsOwogCQl9Ci0JCXBhcmFub2lkX2NoZWNrX2luX3dsX3RyZWUoZTEsICZ1YmktPnVzZWQpOworCQlwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKHViaSwgZTEsICZ1YmktPnVzZWQpOwogCQlyYl9lcmFzZSgmZTEtPnUucmIsICZ1YmktPnVzZWQpOwogCQlkYmdfd2woIm1vdmUgUEVCICVkIEVDICVkIHRvIFBFQiAlZCBFQyAlZCIsCiAJCSAgICAgICBlMS0+cG51bSwgZTEtPmVjLCBlMi0+cG51bSwgZTItPmVjKTsKQEAgLTcyMSwxMiArNzI0LDEyIEBACiAJCXNjcnViYmluZyA9IDE7CiAJCWUxID0gcmJfZW50cnkocmJfZmlyc3QoJnViaS0+c2NydWIpLCBzdHJ1Y3QgdWJpX3dsX2VudHJ5LCB1LnJiKTsKIAkJZTIgPSBmaW5kX3dsX2VudHJ5KCZ1YmktPmZyZWUsIFdMX0ZSRUVfTUFYX0RJRkYpOwotCQlwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKGUxLCAmdWJpLT5zY3J1Yik7CisJCXBhcmFub2lkX2NoZWNrX2luX3dsX3RyZWUodWJpLCBlMSwgJnViaS0+c2NydWIpOwogCQlyYl9lcmFzZSgmZTEtPnUucmIsICZ1YmktPnNjcnViKTsKIAkJZGJnX3dsKCJzY3J1YiBQRUIgJWQgdG8gUEVCICVkIiwgZTEtPnBudW0sIGUyLT5wbnVtKTsKIAl9CiAKLQlwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKGUyLCAmdWJpLT5mcmVlKTsKKwlwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKHViaSwgZTIsICZ1YmktPmZyZWUpOwogCXJiX2VyYXNlKCZlMi0+dS5yYiwgJnViaS0+ZnJlZSk7CiAJdWJpLT5tb3ZlX2Zyb20gPSBlMTsKIAl1YmktPm1vdmVfdG8gPSBlMjsKQEAgLTExNjksMTMgKzExNzIsMTMgQEAKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJaWYgKGluX3dsX3RyZWUoZSwgJnViaS0+dXNlZCkpIHsKLQkJCXBhcmFub2lkX2NoZWNrX2luX3dsX3RyZWUoZSwgJnViaS0+dXNlZCk7CisJCQlwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKHViaSwgZSwgJnViaS0+dXNlZCk7CiAJCQlyYl9lcmFzZSgmZS0+dS5yYiwgJnViaS0+dXNlZCk7CiAJCX0gZWxzZSBpZiAoaW5fd2xfdHJlZShlLCAmdWJpLT5zY3J1YikpIHsKLQkJCXBhcmFub2lkX2NoZWNrX2luX3dsX3RyZWUoZSwgJnViaS0+c2NydWIpOworCQkJcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZSh1YmksIGUsICZ1YmktPnNjcnViKTsKIAkJCXJiX2VyYXNlKCZlLT51LnJiLCAmdWJpLT5zY3J1Yik7CiAJCX0gZWxzZSBpZiAoaW5fd2xfdHJlZShlLCAmdWJpLT5lcnJvbmVvdXMpKSB7Ci0JCQlwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKGUsICZ1YmktPmVycm9uZW91cyk7CisJCQlwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKHViaSwgZSwgJnViaS0+ZXJyb25lb3VzKTsKIAkJCXJiX2VyYXNlKCZlLT51LnJiLCAmdWJpLT5lcnJvbmVvdXMpOwogCQkJdWJpLT5lcnJvbmVvdXNfcGViX2NvdW50IC09IDE7CiAJCQl1YmlfYXNzZXJ0KHViaS0+ZXJyb25lb3VzX3BlYl9jb3VudCA+PSAwKTsKQEAgLTEyNDIsNyArMTI0NSw3IEBACiAJfQogCiAJaWYgKGluX3dsX3RyZWUoZSwgJnViaS0+dXNlZCkpIHsKLQkJcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZShlLCAmdWJpLT51c2VkKTsKKwkJcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZSh1YmksIGUsICZ1YmktPnVzZWQpOwogCQlyYl9lcmFzZSgmZS0+dS5yYiwgJnViaS0+dXNlZCk7CiAJfSBlbHNlIHsKIAkJaW50IGVycjsKQEAgLTEzNjQsNyArMTM2Nyw3IEBACiAKIAkJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOwogCQlpZiAobGlzdF9lbXB0eSgmdWJpLT53b3JrcykgfHwgdWJpLT5yb19tb2RlIHx8Ci0JCSAgICAhdWJpLT50aHJlYWRfZW5hYmxlZCB8fCB1YmlfZGJnX2lzX2JndF9kaXNhYmxlZCgpKSB7CisJCSAgICAhdWJpLT50aHJlYWRfZW5hYmxlZCB8fCB1YmlfZGJnX2lzX2JndF9kaXNhYmxlZCh1YmkpKSB7CiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CiAJCQlzY2hlZHVsZSgpOwpAQCAtMTU3OSw3ICsxNTgyLDcgQEAKIAlsb25nIGxvbmcgcmVhZF9lYzsKIAlzdHJ1Y3QgdWJpX2VjX2hkciAqZWNfaGRyOwogCi0JaWYgKCEodWJpX2Noa19mbGFncyAmIFVCSV9DSEtfR0VOKSkKKwlpZiAoIXViaS0+ZGJnLT5jaGtfZ2VuKQogCQlyZXR1cm4gMDsKIAogCWVjX2hkciA9IGt6YWxsb2ModWJpLT5lY19oZHJfYWxzaXplLCBHRlBfTk9GUyk7CkBAIC0xNjA5LDE2ICsxNjEyLDE4IEBACiAKIC8qKgogICogcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZSAtIGNoZWNrIHRoYXQgd2Vhci1sZXZlbGluZyBlbnRyeSBpcyBpbiBXTCBSQi10cmVlLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqIEBlOiB0aGUgd2Vhci1sZXZlbGluZyBlbnRyeSB0byBjaGVjawogICogQHJvb3Q6IHRoZSByb290IG9mIHRoZSB0cmVlCiAgKgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaWYgQGUgaXMgaW4gdGhlIEByb290IFJCLXRyZWUgYW5kICUtRUlOVkFMIGlmIGl0CiAgKiBpcyBub3QuCiAgKi8KLXN0YXRpYyBpbnQgcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZShzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplLAorc3RhdGljIGludCBwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksCisJCQkJICAgICBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplLAogCQkJCSAgICAgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCiB7Ci0JaWYgKCEodWJpX2Noa19mbGFncyAmIFVCSV9DSEtfR0VOKSkKKwlpZiAoIXViaS0+ZGJnLT5jaGtfZ2VuKQogCQlyZXR1cm4gMDsKIAogCWlmIChpbl93bF90cmVlKGUsIHJvb3QpKQpAQCAtMTYzOCwxMiArMTY0MywxMyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGlmIEBlIGlzIGluIEB1YmktPnBxIGFuZCAlLUVJTlZBTCBpZiBpdCBpcyBub3QuCiAgKi8KLXN0YXRpYyBpbnQgcGFyYW5vaWRfY2hlY2tfaW5fcHEoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV93bF9lbnRyeSAqZSkKK3N0YXRpYyBpbnQgcGFyYW5vaWRfY2hlY2tfaW5fcHEoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCQlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplKQogewogCXN0cnVjdCB1Ymlfd2xfZW50cnkgKnA7CiAJaW50IGk7CiAKLQlpZiAoISh1YmlfY2hrX2ZsYWdzICYgVUJJX0NIS19HRU4pKQorCWlmICghdWJpLT5kYmctPmNoa19nZW4pCiAJCXJldHVybiAwOwogCiAJZm9yIChpID0gMDsgaSA8IFVCSV9QUk9UX1FVRVVFX0xFTjsgKytpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDMuYyBiL2RyaXZlcnMvbmV0LzNjNTAzLmMKaW5kZXggZDg0ZjZlOC4uODRlNjhmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDMuYworKysgYi9kcml2ZXJzL25ldC8zYzUwMy5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQxMiw3ICs0MTMsNyBAQAogCQlvdXRiX3AoMHgwNCA8PCAoKCppcnFwID09IDkpID8gMiA6ICppcnFwKSwgRTMzR19JRENGUik7CiAJCW91dGJfcCgweDAwLCBFMzNHX0lEQ0ZSKTsKIAkJbXNsZWVwKDEpOwotCQlmcmVlX2lycSgqaXJxcCwgZWwyX3Byb2JlX2ludGVycnVwdCk7CisJCWZyZWVfaXJxKCppcnFwLCAmc2Vlbik7CiAJCWlmICghc2VlbikKIAkJCWNvbnRpbnVlOwogCkBAIC00MjIsNiArNDIzLDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAocmV0dmFsIDwgMCkKIAkJCWdvdG8gZXJyX2Rpc2FibGU7CisJCWJyZWFrOwogCX0gd2hpbGUgKCorK2lycXApOwogCiAJaWYgKCppcnFwID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0Lzc5OTAuYyBiL2RyaXZlcnMvbmV0Lzc5OTAuYwppbmRleCA5MDNiY2IzLi42MGIzNWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC83OTkwLmMKKysrIGIvZHJpdmVycy9uZXQvNzk5MC5jCkBAIC01OTQsNyArNTk0LDYgQEAKICAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CiAgICAgICAgIHZvbGF0aWxlIHUxNiAqbWNhc3RfdGFibGUgPSAodTE2ICopJmliLT5maWx0ZXI7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLSAgICAgICAgY2hhciAqYWRkcnM7CiAgICAgICAgIHUzMiBjcmM7CiAKICAgICAgICAgLyogc2V0IGFsbCBtdWx0aWNhc3QgYml0cyAqLwpAQCAtNjA5LDEzICs2MDgsNyBAQAogCiAgICAgICAgIC8qIEFkZCBhZGRyZXNzZXMgKi8KIAluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7Ci0JCWFkZHJzID0gaGEtPmFkZHI7Ci0KLSAgICAgICAgICAgICAgICAvKiBtdWx0aWNhc3QgYWRkcmVzcz8gKi8KLSAgICAgICAgICAgICAgICBpZiAoISgqYWRkcnMgJiAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0JCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBhZGRycyk7CisJCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBoYS0+YWRkcik7CiAgICAgICAgICAgICAgICAgY3JjID0gY3JjID4+IDI2OwogICAgICAgICAgICAgICAgIG1jYXN0X3RhYmxlIFtjcmMgPj4gNF0gfD0gMSA8PCAoY3JjICYgMHhmKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODEzOWNwLmMgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwppbmRleCAxMGM0NTA1Li5jYzRjMjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MTM5Y3AuYworKysgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwpAQCAtNjAsNiArNjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTc3LDE3ICs3OCw2IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLS8qIFZMQU4gdGFnZ2luZyBmZWF0dXJlIGVuYWJsZS9kaXNhYmxlICovCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCi0jZGVmaW5lIENQX1ZMQU5fVEFHX1VTRUQgMQotI2RlZmluZSBDUF9WTEFOX1RYX1RBRyh0eF9kZXNjLHZsYW5fdGFnX3ZhbHVlKSBcCi0JZG8geyAodHhfZGVzYyktPm9wdHMyID0gY3B1X3RvX2xlMzIodmxhbl90YWdfdmFsdWUpOyB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgQ1BfVkxBTl9UQUdfVVNFRCAwCi0jZGVmaW5lIENQX1ZMQU5fVFhfVEFHKHR4X2Rlc2Msdmxhbl90YWdfdmFsdWUpIFwKLQlkbyB7ICh0eF9kZXNjKS0+b3B0czIgPSAwOyB9IHdoaWxlICgwKQotI2VuZGlmCi0KIC8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQogRFJWX05BTUUgIjogMTAvMTAwIFBDSSBFdGhlcm5ldCBkcml2ZXIgdiIgRFJWX1ZFUlNJT04gIiAoIiBEUlZfUkVMREFURSAiKVxuIjsKQEAgLTM1NSw5ICszNDUsNiBAQAogCXVuc2lnbmVkCQlyeF9idWZfc3o7CiAJdW5zaWduZWQJCXdvbF9lbmFibGVkIDogMTsgLyogSXMgV2FrZS1vbi1MQU4gZW5hYmxlZD8gKi8KIAotI2lmIENQX1ZMQU5fVEFHX1VTRUQKLQlzdHJ1Y3Qgdmxhbl9ncm91cAkqdmxncnA7Ci0jZW5kaWYKIAlkbWFfYWRkcl90CQlyaW5nX2RtYTsKIAogCXN0cnVjdCBtaWlfaWZfaW5mbwltaWlfaWY7CkBAIC00MjIsMjQgKzQwOSw2IEBACiB9OwogCiAKLSNpZiBDUF9WTEFOX1RBR19VU0VECi1zdGF0aWMgdm9pZCBjcF92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7Ci0JY3AtPnZsZ3JwID0gZ3JwOwotCWlmIChncnApCi0JCWNwLT5jcGNtZCB8PSBSeFZsYW5PbjsKLQllbHNlCi0JCWNwLT5jcGNtZCAmPSB+UnhWbGFuT247Ci0KLQljcHcxNihDcENtZCwgY3AtPmNwY21kKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcC0+bG9jaywgZmxhZ3MpOwotfQotI2VuZGlmIC8qIENQX1ZMQU5fVEFHX1VTRUQgKi8KLQogc3RhdGljIGlubGluZSB2b2lkIGNwX3NldF9yeGJ1ZnNpemUgKHN0cnVjdCBjcF9wcml2YXRlICpjcCkKIHsKIAl1bnNpZ25lZCBpbnQgbXR1ID0gY3AtPmRldi0+bXR1OwpAQCAtNDU0LDE4ICs0MjMsMTcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcF9yeF9za2IgKHN0cnVjdCBjcF9wcml2YXRlICpjcCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHN0cnVjdCBjcF9kZXNjICpkZXNjKQogeworCXUzMiBvcHRzMiA9IGxlMzJfdG9fY3B1KGRlc2MtPm9wdHMyKTsKKwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyAoc2tiLCBjcC0+ZGV2KTsKIAogCWNwLT5kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAljcC0+ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAotI2lmIENQX1ZMQU5fVEFHX1VTRUQKLQlpZiAoY3AtPnZsZ3JwICYmIChkZXNjLT5vcHRzMiAmIGNwdV90b19sZTMyKFJ4VmxhblRhZ2dlZCkpKSB7Ci0JCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGNwLT52bGdycCwKLQkJCQkJIHN3YWIxNihsZTMyX3RvX2NwdShkZXNjLT5vcHRzMikgJiAweGZmZmYpKTsKLQl9IGVsc2UKLSNlbmRpZgotCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCWlmIChvcHRzMiAmIFJ4VmxhblRhZ2dlZCkKKwkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIHN3YWIxNihvcHRzMiAmIDB4ZmZmZikpOworCisJbmFwaV9ncm9fcmVjZWl2ZSgmY3AtPm5hcGksIHNrYik7CiB9CiAKIHN0YXRpYyB2b2lkIGNwX3J4X2Vycl9hY2N0IChzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AsIHVuc2lnbmVkIHJ4X3RhaWwsCkBAIC03MjksNiArNjk3LDEyIEBACiAJCW5ldGlmX3dha2VfcXVldWUoY3AtPmRldik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTMyIGNwX3R4X3ZsYW5fdGFnKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSA/CisJCVR4VmxhblRhZyB8IHN3YWIxNih2bGFuX3R4X3RhZ19nZXQoc2tiKSkgOiAweDAwOworfQorCiBzdGF0aWMgbmV0ZGV2X3R4X3QgY3Bfc3RhcnRfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTczNiw5ICs3MTAsNyBAQAogCXVuc2lnbmVkIGVudHJ5OwogCXUzMiBlb3IsIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgaW50cl9mbGFnczsKLSNpZiBDUF9WTEFOX1RBR19VU0VECi0JdTMyIHZsYW5fdGFnID0gMDsKLSNlbmRpZgorCV9fbGUzMiBvcHRzMjsKIAlpbnQgbXNzID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+bG9jaywgaW50cl9mbGFncyk7CkBAIC03NTEsMTUgKzcyMywxMiBAQAogCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAJfQogCi0jaWYgQ1BfVkxBTl9UQUdfVVNFRAotCWlmICh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpCi0JCXZsYW5fdGFnID0gVHhWbGFuVGFnIHwgc3dhYjE2KHZsYW5fdHhfdGFnX2dldChza2IpKTsKLSNlbmRpZgotCiAJZW50cnkgPSBjcC0+dHhfaGVhZDsKIAllb3IgPSAoZW50cnkgPT0gKENQX1RYX1JJTkdfU0laRSAtIDEpKSA/IFJpbmdFbmQgOiAwOwogCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CiAKKwlvcHRzMiA9IGNwdV90b19sZTMyKGNwX3R4X3ZsYW5fdGFnKHNrYikpOworCiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPT0gMCkgewogCQlzdHJ1Y3QgY3BfZGVzYyAqdHhkID0gJmNwLT50eF9yaW5nW2VudHJ5XTsKIAkJdTMyIGxlbjsKQEAgLTc2Nyw3ICs3MzYsNyBAQAogCiAJCWxlbiA9IHNrYi0+bGVuOwogCQltYXBwaW5nID0gZG1hX21hcF9zaW5nbGUoJmNwLT5wZGV2LT5kZXYsIHNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJQ1BfVkxBTl9UWF9UQUcodHhkLCB2bGFuX3RhZyk7CisJCXR4ZC0+b3B0czIgPSBvcHRzMjsKIAkJdHhkLT5hZGRyID0gY3B1X3RvX2xlNjQobWFwcGluZyk7CiAJCXdtYigpOwogCkBAIC04MzgsNyArODA3LDcgQEAKIAkJCQljdHJsIHw9IExhc3RGcmFnOwogCiAJCQl0eGQgPSAmY3AtPnR4X3JpbmdbZW50cnldOwotCQkJQ1BfVkxBTl9UWF9UQUcodHhkLCB2bGFuX3RhZyk7CisJCQl0eGQtPm9wdHMyID0gb3B0czI7CiAJCQl0eGQtPmFkZHIgPSBjcHVfdG9fbGU2NChtYXBwaW5nKTsKIAkJCXdtYigpOwogCkBAIC04NTAsNyArODE5LDcgQEAKIAkJfQogCiAJCXR4ZCA9ICZjcC0+dHhfcmluZ1tmaXJzdF9lbnRyeV07Ci0JCUNQX1ZMQU5fVFhfVEFHKHR4ZCwgdmxhbl90YWcpOworCQl0eGQtPm9wdHMyID0gb3B0czI7CiAJCXR4ZC0+YWRkciA9IGNwdV90b19sZTY0KGZpcnN0X21hcHBpbmcpOwogCQl3bWIoKTsKIApAQCAtMTQzMCw2ICsxMzk5LDExIEBACiAJZWxzZQogCQljcC0+Y3BjbWQgJj0gflJ4Q2hrU3VtOwogCisJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQljcC0+Y3BjbWQgfD0gUnhWbGFuT247CisJZWxzZQorCQljcC0+Y3BjbWQgJj0gflJ4Vmxhbk9uOworCiAJY3B3MTZfZihDcENtZCwgY3AtPmNwY21kKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcC0+bG9jaywgZmxhZ3MpOwogCkBAIC0xODE3LDkgKzE3OTEsNiBAQAogCS5uZG9fc3RhcnRfeG1pdAkJPSBjcF9zdGFydF94bWl0LAogCS5uZG9fdHhfdGltZW91dAkJPSBjcF90eF90aW1lb3V0LAogCS5uZG9fc2V0X2ZlYXR1cmVzCT0gY3Bfc2V0X2ZlYXR1cmVzLAotI2lmIENQX1ZMQU5fVEFHX1VTRUQKLQkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSBjcF92bGFuX3J4X3JlZ2lzdGVyLAotI2VuZGlmCiAjaWZkZWYgQlJPS0VOCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGNwX2NoYW5nZV9tdHUsCiAjZW5kaWYKQEAgLTE5NDgsMTUgKzE5MTksMTYgQEAKIAlkZXYtPmV0aHRvb2xfb3BzID0gJmNwX2V0aHRvb2xfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCi0jaWYgQ1BfVkxBTl9UQUdfVVNFRAogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOwotI2VuZGlmCiAKIAlpZiAocGNpX3VzaW5nX2RhYykKIAkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAKIAkvKiBkaXNhYmxlZCBieSBkZWZhdWx0IHVudGlsIHZlcmlmaWVkICovCi0JZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9UU087CisJZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9UU08gfAorCQlORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7CisJZGV2LT52bGFuX2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfVFNPIHwKKwkJTkVUSUZfRl9ISUdIRE1BOwogCiAJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgxMzl0b28uYyBiL2RyaXZlcnMvbmV0LzgxMzl0b28uYwppbmRleCA5ODUxN2EzLi5jMjY3MmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MTM5dG9vLmMKKysrIGIvZHJpdmVycy9uZXQvODEzOXRvby5jCkBAIC0xMDAsNiArMTAwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgpAQCAtOTkyLDYgKzk5Myw3IEBACiAJICogZmVhdHVyZXMKIAkgKi8KIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0hXX0NTVU0gfCBORVRJRl9GX0hJR0hETUE7CisJZGV2LT52bGFuX2ZlYXR1cmVzID0gZGV2LT5mZWF0dXJlczsKIAogCWRldi0+aXJxID0gcGRldi0+aXJxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MzkwLmggYi9kcml2ZXJzL25ldC84MzkwLmgKaW5kZXggM2Q5ZThmYi4uNThhMTJlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODM5MC5oCisrKyBiL2RyaXZlcnMvbmV0LzgzOTAuaApAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKICNkZWZpbmUgVFhfUEFHRVMgMTIJLyogVHdvIFR4IHNsb3RzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCAxOWYwNGEzLi44ZDAzMTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTE5MzQsMTMgKzE5MzQsNiBAQAogCSAgREVDIChub3cgQ29tcGFxKSBiYXNlZCBvbiB0aGUgQU1EIExhbmNlIGNoaXBzZXQsIGluY2x1ZGluZyB0aGUKIAkgIERFUENBIHNlcmllcy4gIChUaGlzIGNoaXBzZXQgaXMgYmV0dGVyIGtub3duIHZpYSB0aGUgTkUyMTAwIGNhcmRzLikKIAotY29uZmlnIDY4MzYwX0VORVQKLQlib29sICJNb3Rvcm9sYSA2ODM2MCBldGhlcm5ldCBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gTTY4MzYwCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGJ1aWx0LWluIGV0aGVybmV0IGNvbnRyb2xsZXIgb2YKLQkgIHRoZSBNb3Rvcm9sYSA2ODM2MCBwcm9jZXNzb3IuCi0KIGNvbmZpZyBGRUMKIAlib29sICJGRUMgZXRoZXJuZXQgY29udHJvbGxlciAob2YgQ29sZEZpcmUgYW5kIHNvbWUgaS5NWCBDUFVzKSIKIAlkZXBlbmRzIG9uIE01MjN4IHx8IE01Mjd4IHx8IE01MjcyIHx8IE01Mjh4IHx8IE01MjB4IHx8IE01MzJ4IHx8IFwKQEAgLTIxMTUsNyArMjEwOCw2IEBACiAKIGNvbmZpZyBFMTAwMEUKIAl0cmlzdGF0ZSAiSW50ZWwoUikgUFJPLzEwMDAgUENJLUV4cHJlc3MgR2lnYWJpdCBFdGhlcm5ldCBzdXBwb3J0IgotCXNlbGVjdCBDUkMzMgogCWRlcGVuZHMgb24gUENJICYmICghU1BBUkMzMiB8fCBCUk9LRU4pCiAJc2VsZWN0IENSQzMyCiAJLS0taGVscC0tLQpAQCAtMjE5NywxNSArMjE4OSw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9uZXQvaXhwMjAwMC9LY29uZmlnIgogCi1jb25maWcgTVlSSV9TQlVTCi0JdHJpc3RhdGUgIk15cmlDT00gR2lnYWJpdCBFdGhlcm5ldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gU0JVUwotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE15cmlDT00gU2J1cyBnaWdhYml0IEV0aGVybmV0IGNhcmRzLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBteXJpX3NidXMuICBUaGlzIGlzIHJlY29tbWVuZGVkLgotCiBjb25maWcgTlM4MzgyMAogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIERQODM4MjAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQpAQCAtMjI4Miw3ICsyMjY1LDcgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIHNpczE5MC4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCiAKIGNvbmZpZyBTS0dFCi0JdHJpc3RhdGUgIk5ldyBTeXNLb25uZWN0IEdpZ2FFdGhlcm5ldCBzdXBwb3J0IgorCXRyaXN0YXRlICJNYXJ2ZWxsIFl1a29uIEdpZ2FiaXQgRXRoZXJuZXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQogCXNlbGVjdCBDUkMzMgogCS0tLWhlbHAtLS0KQEAgLTIyOTgsNyArMjI4MSw3IEBACiAJICBMaW5rc3lzIEVHMTAzMi9FRzEwNjQsIDNDb20gM0M5NDAvM0M5NDBCLCBTeXNLb25uZWN0IFNLLTk4NzEvOTg3Mi4KIAogCSAgSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgbmV3ZXIgWXVrb24yIGNoaXBzZXQ6IGEgc2VwYXJhdGUgZHJpdmVyLAotCSAgc2t5MiwgaXMgcHJvdmlkZWQgZm9yIFl1a29uMi1iYXNlZCBhZGFwdGVycy4KKwkgIHNreTIsIGlzIHByb3ZpZGVkIGZvciB0aGVzZSBhZGFwdGVycy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc2tnZS4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCkBAIC0yMzEzLDggKzIyOTYsMTcgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFNLR0VfR0VORVNJUworICAgICAgIGJvb2wgIlN1cHBvcnQgZm9yIG9sZGVyIFN5c0tvbm5lY3QgR2VuZXNpcyBib2FyZHMiCisgICAgICAgZGVwZW5kcyBvbiBTS0dFCisgICAgICAgaGVscAorICAgICAgICAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBvbGRlciBhbmQgdW5jb21tb24gU3lzS29ubmVjdCBHZW5lc2lzCisJIGNoaXBzLCB3aGljaCBzdXBwb3J0IE1JSSB2aWEgYW4gZXh0ZXJuYWwgdHJhbnNjZWl2ZXIsIGluc3RlYWQgb2YKKwkgYW4gaW50ZXJuYWwgb25lLiBEaXNhYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzYXZlIHNvbWUgbWVtb3J5CisJIGJ5IG1ha2luZyBjb2RlIHNtYWxsZXIuIElmIHVuc3VyZSBzYXkgWS4KKwogY29uZmlnIFNLWTIKLQl0cmlzdGF0ZSAiU3lzS29ubmVjdCBZdWtvbjIgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiTWFydmVsbCBZdWtvbiAyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKIAlzZWxlY3QgQ1JDMzIKIAktLS1oZWxwLS0tCkBAIC0yMzI0LDcgKzIzMTYsNyBAQAogCSAgODhFODA1My84OEU4MDU1Lzg4RTgwNjEvODhFODA2MiwgU3lzS29ubmVjdCBTSy05RTIxRC9TSy05UzIxCiAKIAkgIFRoZXJlIGlzIGNvbXBhbmlvbiBkcml2ZXIgZm9yIHRoZSBvbGRlciBNYXJ2ZWxsIFl1a29uIGFuZAotCSAgR2VuZXNpcyBiYXNlZCBhZGFwdGVyczogc2tnZS4KKwkgIFN5c0tvbm5lY3QgR2VuZXNpcyBiYXNlZCBhZGFwdGVyczogc2tnZS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc2t5Mi4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCkBAIC0yNTYxLDYgKzI1NTMsMTUgQEAKIAkgIE1MNzIyMyBpcyBjb21wYW5pb24gY2hpcCBmb3IgSW50ZWwgQXRvbSBFNnh4IHNlcmllcy4KIAkgIE1MNzIyMyBpcyBjb21wbGV0ZWx5IGNvbXBhdGlibGUgZm9yIEludGVsIEVHMjBUIFBDSC4KIAorY29uZmlnIEZUR01BQzEwMAorCXRyaXN0YXRlICJGYXJhZGF5IEZUR01BQzEwMCBHaWdhYml0IEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUk0KKwlzZWxlY3QgUEhZTElCCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEZUR01BQzEwMCBHaWdhYml0IEV0aGVybmV0IGNvbnRyb2xsZXIKKwkgIGZyb20gRmFyYWRheS4gSXQgaXMgdXNlZCBvbiBGYXJhZGF5IEEzNjksIEFuZGVzIEFHMTAyIGFuZCBzb21lCisJICBvdGhlciBBUk0vTkRTMzIgU29DJ3MuCisKIGVuZGlmICMgTkVUREVWXzEwMDAKIAogIwpAQCAtMzQxNiw3ICszNDE3LDggQEAKIAogY29uZmlnIE5FVENPTlNPTEVfRFlOQU1JQwogCWJvb2wgIkR5bmFtaWMgcmVjb25maWd1cmF0aW9uIG9mIGxvZ2dpbmcgdGFyZ2V0cyIKLQlkZXBlbmRzIG9uIE5FVENPTlNPTEUgJiYgU1lTRlMgJiYgQ09ORklHRlNfRlMKKwlkZXBlbmRzIG9uIE5FVENPTlNPTEUgJiYgU1lTRlMgJiYgQ09ORklHRlNfRlMgJiYgXAorCQkJIShORVRDT05TT0xFPXkgJiYgQ09ORklHRlNfRlM9bSkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBhYmlsaXR5IHRvIGR5bmFtaWNhbGx5IHJlY29uZmlndXJlIHRhcmdldAogCSAgcGFyYW1ldGVycyAoaW50ZXJmYWNlLCBJUCBhZGRyZXNzZXMsIHBvcnQgbnVtYmVycywgTUFDIGFkZHJlc3NlcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKaW5kZXggNzc2YTQ3OC4uYjc2MjJjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKQEAgLTU5LDcgKzU5LDYgQEAKIG9iai0kKENPTkZJR19TVU5MQU5DRSkgKz0gc3VubGFuY2Uubwogb2JqLSQoQ09ORklHX1NVTlFFKSArPSBzdW5xZS5vCiBvYmotJChDT05GSUdfU1VOQk1BQykgKz0gc3VuYm1hYy5vCi1vYmotJChDT05GSUdfTVlSSV9TQlVTKSArPSBteXJpX3NidXMubwogb2JqLSQoQ09ORklHX1NVTkdFTSkgKz0gc3VuZ2VtLm8gc3VuZ2VtX3BoeS5vCiBvYmotJChDT05GSUdfQ0FTU0lOSSkgKz0gY2Fzc2luaS5vCiBvYmotJChDT05GSUdfU1VOVk5FVCkgKz0gc3Vudm5ldC5vCkBAIC0xMjgsNyArMTI3LDYgQEAKIGlmZXEgKCQoQ09ORklHX0ZFQ19NUEM1Mnh4X01ESU8pLHkpCiAJb2JqLSQoQ09ORklHX0ZFQ19NUEM1Mnh4KSArPSBmZWNfbXBjNTJ4eF9waHkubwogZW5kaWYKLW9iai0kKENPTkZJR182ODM2MF9FTkVUKSArPSA2ODM2MGVuZXQubwogb2JqLSQoQ09ORklHX1dEODB4MykgKz0gd2QubyA4MzkwLm8KIG9iai0kKENPTkZJR19FTDIpICs9IDNjNTAzLm8gODM5MHAubwogb2JqLSQoQ09ORklHX05FMjAwMCkgKz0gbmUubyA4MzkwcC5vCkBAIC0xNDgsNiArMTQ2LDcgQEAKIG9iai0kKENPTkZJR19ORV9IODMwMCkgKz0gbmUtaDgzMDAubwogb2JqLSQoQ09ORklHX0FYODg3OTYpICs9IGF4ODg3OTYubwogb2JqLSQoQ09ORklHX0JDTTYzWFhfRU5FVCkgKz0gYmNtNjN4eF9lbmV0Lm8KK29iai0kKENPTkZJR19GVEdNQUMxMDApICs9IGZ0Z21hYzEwMC5vCiBvYmotJChDT05GSUdfRlRNQUMxMDApICs9IGZ0bWFjMTAwLm8KIAogb2JqLSQoQ09ORklHX1RTSTEwOF9FVEgpICs9IHRzaTEwOF9ldGgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYTIwNjUuYyBiL2RyaXZlcnMvbmV0L2EyMDY1LmMKaW5kZXggZGVhYThiYy4uZTFlMWIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYTIwNjUuYworKysgYi9kcml2ZXJzL25ldC9hMjA2NS5jCkBAIC0zNyw2ICszNywxMSBAQAogICoJICBib3RoIDEwQkFTRS0yICh0aGluIGNvYXgpIGFuZCBBVUkgKERCLTE1KSBjb25uZWN0b3JzCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisvKiNkZWZpbmUgREVCVUcqLworLyojZGVmaW5lIFRFU1RfSElUUyovCisKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CkBAIC01OCwyOSArNjMsMjIgQEAKIAogI2luY2x1ZGUgImEyMDY1LmgiCiAKLQotCS8qCi0JICoJCVRyYW5zbWl0L1JlY2VpdmUgUmluZyBEZWZpbml0aW9ucwotCSAqLworLyogVHJhbnNtaXQvUmVjZWl2ZSBSaW5nIERlZmluaXRpb25zICovCiAKICNkZWZpbmUgTEFOQ0VfTE9HX1RYX0JVRkZFUlMJKDIpCiAjZGVmaW5lIExBTkNFX0xPR19SWF9CVUZGRVJTCSg0KQogCi0jZGVmaW5lIFRYX1JJTkdfU0laRQkJKDE8PExBTkNFX0xPR19UWF9CVUZGRVJTKQotI2RlZmluZSBSWF9SSU5HX1NJWkUJCSgxPDxMQU5DRV9MT0dfUlhfQlVGRkVSUykKKyNkZWZpbmUgVFhfUklOR19TSVpFCQkoMSA8PCBMQU5DRV9MT0dfVFhfQlVGRkVSUykKKyNkZWZpbmUgUlhfUklOR19TSVpFCQkoMSA8PCBMQU5DRV9MT0dfUlhfQlVGRkVSUykKIAotI2RlZmluZSBUWF9SSU5HX01PRF9NQVNLCShUWF9SSU5HX1NJWkUtMSkKLSNkZWZpbmUgUlhfUklOR19NT0RfTUFTSwkoUlhfUklOR19TSVpFLTEpCisjZGVmaW5lIFRYX1JJTkdfTU9EX01BU0sJKFRYX1JJTkdfU0laRSAtIDEpCisjZGVmaW5lIFJYX1JJTkdfTU9EX01BU0sJKFJYX1JJTkdfU0laRSAtIDEpCiAKICNkZWZpbmUgUEtUX0JVRl9TSVpFCQkoMTU0NCkKICNkZWZpbmUgUlhfQlVGRl9TSVpFICAgICAgICAgICAgUEtUX0JVRl9TSVpFCiAjZGVmaW5lIFRYX0JVRkZfU0laRSAgICAgICAgICAgIFBLVF9CVUZfU0laRQogCi0KLQkvKgotCSAqCQlMYXlvdXQgb2YgdGhlIExhbmNlJ3MgUkFNIEJ1ZmZlcgotCSAqLwotCisvKiBMYXlvdXQgb2YgdGhlIExhbmNlJ3MgUkFNIEJ1ZmZlciAqLwogCiBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayB7CiAJdW5zaWduZWQgc2hvcnQgbW9kZTsJCS8qIFByZS1zZXQgbW9kZSAocmVnLiAxNSkgKi8KQEAgLTk3LDE0ICs5NSwxMSBAQAogCXN0cnVjdCBsYW5jZV9yeF9kZXNjIGJyeF9yaW5nW1JYX1JJTkdfU0laRV07CiAJc3RydWN0IGxhbmNlX3R4X2Rlc2MgYnR4X3JpbmdbVFhfUklOR19TSVpFXTsKIAotCWNoYXIgICByeF9idWYgW1JYX1JJTkdfU0laRV1bUlhfQlVGRl9TSVpFXTsKLQljaGFyICAgdHhfYnVmIFtUWF9SSU5HX1NJWkVdW1RYX0JVRkZfU0laRV07CisJY2hhciByeF9idWZbUlhfUklOR19TSVpFXVtSWF9CVUZGX1NJWkVdOworCWNoYXIgdHhfYnVmW1RYX1JJTkdfU0laRV1bVFhfQlVGRl9TSVpFXTsKIH07CiAKLQotCS8qCi0JICoJCVByaXZhdGUgRGV2aWNlIERhdGEKLQkgKi8KKy8qIFByaXZhdGUgRGV2aWNlIERhdGEgKi8KIAogc3RydWN0IGxhbmNlX3ByaXZhdGUgewogCWNoYXIgKm5hbWU7CkBAIC0xMjksMjEgKzEyNCwxNCBAQAogCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgICAgbXVsdGljYXN0X3RpbWVyOwogfTsKIAotI2RlZmluZSBUWF9CVUZGU19BVkFJTCAoKGxwLT50eF9vbGQ8PWxwLT50eF9uZXcpP1wKLQkJCWxwLT50eF9vbGQrbHAtPnR4X3JpbmdfbW9kX21hc2stbHAtPnR4X25ldzpcCi0JCQlscC0+dHhfb2xkIC0gbHAtPnR4X25ldy0xKQotCi0KICNkZWZpbmUgTEFOQ0VfQUREUih4KSAoKGludCkoeCkgJiB+MHhmZjAwMDAwMCkKIAogLyogTG9hZCB0aGUgQ1NSIHJlZ2lzdGVycyAqLwotc3RhdGljIHZvaWQgbG9hZF9jc3JzIChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCitzdGF0aWMgdm9pZCBsb2FkX2NzcnMoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQogewogCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKIAl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqYWliID0gbHAtPmxhbmNlX2luaXRfYmxvY2s7Ci0JaW50IGxlcHRyOwotCi0JbGVwdHIgPSBMQU5DRV9BRERSIChhaWIpOworCWludCBsZXB0ciA9IExBTkNFX0FERFIoYWliKTsKIAogCWxsLT5yYXAgPSBMRV9DU1IxOwogCWxsLT5yZHAgPSAobGVwdHIgJiAweEZGRkYpOwpAQCAtMTU2LDE5ICsxNDQsMTYgQEAKIAlsbC0+cmFwID0gTEVfQ1NSMDsKIH0KIAotI2RlZmluZSBaRVJPIDAKLQogLyogU2V0dXAgdGhlIExhbmNlIFJ4IGFuZCBUeCByaW5ncyAqLwotc3RhdGljIHZvaWQgbGFuY2VfaW5pdF9yaW5nIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbGFuY2VfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9jazsKLQl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqYWliOyAvKiBmb3IgTEFOQ0VfQUREUiBjb21wdXRhdGlvbnMgKi8KKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqYWliID0gbHAtPmxhbmNlX2luaXRfYmxvY2s7CisJCQkJCS8qIGZvciBMQU5DRV9BRERSIGNvbXB1dGF0aW9ucyAqLwogCWludCBsZXB0cjsKIAlpbnQgaTsKIAotCWFpYiA9IGxwLT5sYW5jZV9pbml0X2Jsb2NrOwotCiAJLyogTG9jayBvdXQgb3RoZXIgcHJvY2Vzc2VzIHdoaWxlIHNldHRpbmcgdXAgaGFyZHdhcmUgKi8KIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJbHAtPnJ4X25ldyA9IGxwLT50eF9uZXcgPSAwOwpAQCAtMTc5LDQxICsxNjQsMzggQEAKIAkvKiBDb3B5IHRoZSBldGhlcm5ldCBhZGRyZXNzIHRvIHRoZSBsYW5jZSBpbml0IGJsb2NrCiAJICogTm90ZSB0aGF0IG9uIHRoZSBzcGFyYyB5b3UgbmVlZCB0byBzd2FwIHRoZSBldGhlcm5ldCBhZGRyZXNzLgogCSAqLwotCWliLT5waHlzX2FkZHIgWzBdID0gZGV2LT5kZXZfYWRkciBbMV07Ci0JaWItPnBoeXNfYWRkciBbMV0gPSBkZXYtPmRldl9hZGRyIFswXTsKLQlpYi0+cGh5c19hZGRyIFsyXSA9IGRldi0+ZGV2X2FkZHIgWzNdOwotCWliLT5waHlzX2FkZHIgWzNdID0gZGV2LT5kZXZfYWRkciBbMl07Ci0JaWItPnBoeXNfYWRkciBbNF0gPSBkZXYtPmRldl9hZGRyIFs1XTsKLQlpYi0+cGh5c19hZGRyIFs1XSA9IGRldi0+ZGV2X2FkZHIgWzRdOwotCi0JaWYgKFpFUk8pCi0JCXByaW50ayhLRVJOX0RFQlVHICJUWCByaW5nczpcbiIpOworCWliLT5waHlzX2FkZHJbMF0gPSBkZXYtPmRldl9hZGRyWzFdOworCWliLT5waHlzX2FkZHJbMV0gPSBkZXYtPmRldl9hZGRyWzBdOworCWliLT5waHlzX2FkZHJbMl0gPSBkZXYtPmRldl9hZGRyWzNdOworCWliLT5waHlzX2FkZHJbM10gPSBkZXYtPmRldl9hZGRyWzJdOworCWliLT5waHlzX2FkZHJbNF0gPSBkZXYtPmRldl9hZGRyWzVdOworCWliLT5waHlzX2FkZHJbNV0gPSBkZXYtPmRldl9hZGRyWzRdOwogCiAJLyogU2V0dXAgdGhlIFR4IHJpbmcgZW50cmllcyAqLwotCWZvciAoaSA9IDA7IGkgPD0gKDE8PGxwLT5sYW5jZV9sb2dfdHhfYnVmcyk7IGkrKykgeworCW5ldGRldl9kYmcoZGV2LCAiVFggcmluZ3M6XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDw9IDEgPDwgbHAtPmxhbmNlX2xvZ190eF9idWZzOyBpKyspIHsKIAkJbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPnR4X2J1ZltpXVswXSk7Ci0JCWliLT5idHhfcmluZyBbaV0udG1kMCAgICAgID0gbGVwdHI7Ci0JCWliLT5idHhfcmluZyBbaV0udG1kMV9oYWRyID0gbGVwdHIgPj4gMTY7Ci0JCWliLT5idHhfcmluZyBbaV0udG1kMV9iaXRzID0gMDsKLQkJaWItPmJ0eF9yaW5nIFtpXS5sZW5ndGggICAgPSAweGYwMDA7IC8qIFRoZSBvbmVzIHJlcXVpcmVkIGJ5IHRtZDIgKi8KLQkJaWItPmJ0eF9yaW5nIFtpXS5taXNjICAgICAgPSAwOwotCQlpZiAoaSA8IDMgJiYgWkVSTykKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlZDogMHglOC44eFxuIiwgaSwgbGVwdHIpOworCQlpYi0+YnR4X3JpbmdbaV0udG1kMCAgICAgID0gbGVwdHI7CisJCWliLT5idHhfcmluZ1tpXS50bWQxX2hhZHIgPSBsZXB0ciA+PiAxNjsKKwkJaWItPmJ0eF9yaW5nW2ldLnRtZDFfYml0cyA9IDA7CisJCWliLT5idHhfcmluZ1tpXS5sZW5ndGggICAgPSAweGYwMDA7IC8qIFRoZSBvbmVzIHJlcXVpcmVkIGJ5IHRtZDIgKi8KKwkJaWItPmJ0eF9yaW5nW2ldLm1pc2MgICAgICA9IDA7CisJCWlmIChpIDwgMykKKwkJCW5ldGRldl9kYmcoZGV2LCAiJWQ6IDB4JTA4eFxuIiwgaSwgbGVwdHIpOwogCX0KIAogCS8qIFNldHVwIHRoZSBSeCByaW5nIGVudHJpZXMgKi8KLQlpZiAoWkVSTykKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlJYIHJpbmdzOlxuIik7Ci0JZm9yIChpID0gMDsgaSA8ICgxPDxscC0+bGFuY2VfbG9nX3J4X2J1ZnMpOyBpKyspIHsKKwluZXRkZXZfZGJnKGRldiwgIlJYIHJpbmdzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IDEgPDwgbHAtPmxhbmNlX2xvZ19yeF9idWZzOyBpKyspIHsKIAkJbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPnJ4X2J1ZltpXVswXSk7CiAKLQkJaWItPmJyeF9yaW5nIFtpXS5ybWQwICAgICAgPSBsZXB0cjsKLQkJaWItPmJyeF9yaW5nIFtpXS5ybWQxX2hhZHIgPSBsZXB0ciA+PiAxNjsKLQkJaWItPmJyeF9yaW5nIFtpXS5ybWQxX2JpdHMgPSBMRV9SMV9PV047Ci0JCWliLT5icnhfcmluZyBbaV0ubGVuZ3RoICAgID0gLVJYX0JVRkZfU0laRSB8IDB4ZjAwMDsKLQkJaWItPmJyeF9yaW5nIFtpXS5tYmxlbmd0aCAgPSAwOwotCQlpZiAoaSA8IDMgJiYgWkVSTykKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlZDogMHglOC44eFxuIiwgaSwgbGVwdHIpOworCQlpYi0+YnJ4X3JpbmdbaV0ucm1kMCAgICAgID0gbGVwdHI7CisJCWliLT5icnhfcmluZ1tpXS5ybWQxX2hhZHIgPSBsZXB0ciA+PiAxNjsKKwkJaWItPmJyeF9yaW5nW2ldLnJtZDFfYml0cyA9IExFX1IxX09XTjsKKwkJaWItPmJyeF9yaW5nW2ldLmxlbmd0aCAgICA9IC1SWF9CVUZGX1NJWkUgfCAweGYwMDA7CisJCWliLT5icnhfcmluZ1tpXS5tYmxlbmd0aCAgPSAwOworCQlpZiAoaSA8IDMpCisJCQluZXRkZXZfZGJnKGRldiwgIiVkOiAweCUwOHhcbiIsIGksIGxlcHRyKTsKIAl9CiAKIAkvKiBTZXR1cCB0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2sgKi8KQEAgLTIyMiwyMiArMjA0LDIwIEBACiAJbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPmJyeF9yaW5nKTsKIAlpYi0+cnhfbGVuID0gKGxwLT5sYW5jZV9sb2dfcnhfYnVmcyA8PCAxMykgfCAobGVwdHIgPj4gMTYpOwogCWliLT5yeF9wdHIgPSBsZXB0cjsKLQlpZiAoWkVSTykKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlJYIHB0cjogJTguOHhcbiIsIGxlcHRyKTsKKwluZXRkZXZfZGJnKGRldiwgIlJYIHB0cjogJTA4eFxuIiwgbGVwdHIpOwogCiAJLyogU2V0dXAgdHggZGVzY3JpcHRvciBwb2ludGVyICovCiAJbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPmJ0eF9yaW5nKTsKIAlpYi0+dHhfbGVuID0gKGxwLT5sYW5jZV9sb2dfdHhfYnVmcyA8PCAxMykgfCAobGVwdHIgPj4gMTYpOwogCWliLT50eF9wdHIgPSBsZXB0cjsKLQlpZiAoWkVSTykKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlRYIHB0cjogJTguOHhcbiIsIGxlcHRyKTsKKwluZXRkZXZfZGJnKGRldiwgIlRYIHB0cjogJTA4eFxuIiwgbGVwdHIpOwogCiAJLyogQ2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgKi8KLQlpYi0+ZmlsdGVyIFswXSA9IDA7Ci0JaWItPmZpbHRlciBbMV0gPSAwOworCWliLT5maWx0ZXJbMF0gPSAwOworCWliLT5maWx0ZXJbMV0gPSAwOwogfQogCi1zdGF0aWMgaW50IGluaXRfcmVzdGFydF9sYW5jZSAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQorc3RhdGljIGludCBpbml0X3Jlc3RhcnRfbGFuY2Uoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQogewogCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKIAlpbnQgaTsKQEAgLTI0OSw4ICsyMjksNyBAQAogCWZvciAoaSA9IDA7IChpIDwgMTAwKSAmJiAhKGxsLT5yZHAgJiAoTEVfQzBfRVJSIHwgTEVfQzBfSURPTikpOyBpKyspCiAJCWJhcnJpZXIoKTsKIAlpZiAoKGkgPT0gMTAwKSB8fCAobGwtPnJkcCAmIExFX0MwX0VSUikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJMQU5DRSB1bm9wZW5lZCBhZnRlciAlZCB0aWNrcywgY3NyMD0lNC40eC5cbiIsCi0JCSAgICAgICBpLCBsbC0+cmRwKTsKKwkJcHJfZXJyKCJ1bm9wZW5lZCBhZnRlciAlZCB0aWNrcywgY3NyMD0lMDR4XG4iLCBpLCBsbC0+cmRwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0yNjEsNyArMjQwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsYW5jZV9yeCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgbGFuY2Vfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrOwpAQCAtMjcxLDIyICsyNTAsMjQgQEAKIAogI2lmZGVmIFRFU1RfSElUUwogCWludCBpOwotCXByaW50ayhLRVJOX0RFQlVHICJbIik7CisJY2hhciBidWZbUlhfUklOR19TSVpFICsgMV07CisKIAlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJY2hhciByMV9vd24gPSBpYi0+YnJ4X3JpbmdbaV0ucm1kMV9iaXRzICYgTEVfUjFfT1dOOwogCQlpZiAoaSA9PSBscC0+cnhfbmV3KQotCQkJcHJpbnRrICgiJXMiLAotCQkJCWliLT5icnhfcmluZyBbaV0ucm1kMV9iaXRzICYgTEVfUjFfT1dOID8gIl8iIDogIlgiKTsKKwkJCWJ1ZltpXSA9IHIxX293biA/ICdfJyA6ICdYJzsKIAkJZWxzZQotCQkJcHJpbnRrICgiJXMiLAotCQkJCWliLT5icnhfcmluZyBbaV0ucm1kMV9iaXRzICYgTEVfUjFfT1dOID8gIi4iIDogIjEiKTsKKwkJCWJ1ZltpXSA9IHIxX293biA/ICcuJyA6ICcxJzsKIAl9Ci0JcHJpbnRrICgiXVxuIik7CisJYnVmW1JYX1JJTkdfU0laRV0gPSAwOworCisJcHJfZGVidWcoIlJ4UmluZyBUZXN0SGl0czogWyVzXVxuIiwgYnVmKTsKICNlbmRpZgogCi0JbGwtPnJkcCA9IExFX0MwX1JJTlR8TEVfQzBfSU5FQTsKLQlmb3IgKHJkID0gJmliLT5icnhfcmluZyBbbHAtPnJ4X25ld107CisJbGwtPnJkcCA9IExFX0MwX1JJTlQgfCBMRV9DMF9JTkVBOworCWZvciAocmQgPSAmaWItPmJyeF9yaW5nW2xwLT5yeF9uZXddOwogCSAgICAgISgoYml0cyA9IHJkLT5ybWQxX2JpdHMpICYgTEVfUjFfT1dOKTsKLQkgICAgIHJkID0gJmliLT5icnhfcmluZyBbbHAtPnJ4X25ld10pIHsKKwkgICAgIHJkID0gJmliLT5icnhfcmluZ1tscC0+cnhfbmV3XSkgewogCiAJCS8qIFdlIGdvdCBhbiBpbmNvbXBsZXRlIGZyYW1lPyAqLwogCQlpZiAoKGJpdHMgJiBMRV9SMV9QT0spICE9IExFX1IxX1BPSykgewpAQCAtMjk3LDE4ICsyNzgsMjIgQEAKIAkJCS8qIENvdW50IG9ubHkgdGhlIGVuZCBmcmFtZSBhcyBhIHJ4IGVycm9yLAogCQkJICogbm90IHRoZSBiZWdpbm5pbmcKIAkJCSAqLwotCQkJaWYgKGJpdHMgJiBMRV9SMV9CVUYpIGRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKLQkJCWlmIChiaXRzICYgTEVfUjFfQ1JDKSBkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQkJCWlmIChiaXRzICYgTEVfUjFfT0ZMKSBkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7Ci0JCQlpZiAoYml0cyAmIExFX1IxX0ZSQSkgZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKLQkJCWlmIChiaXRzICYgTEVfUjFfRU9QKSBkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9CVUYpCisJCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9DUkMpCisJCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoYml0cyAmIExFX1IxX09GTCkKKwkJCQlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAoYml0cyAmIExFX1IxX0ZSQSkKKwkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9FT1ApCisJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJfSBlbHNlIHsKIAkJCWludCBsZW4gPSAocmQtPm1ibGVuZ3RoICYgMHhmZmYpIC0gNDsKLQkJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiIChsZW4rMik7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKIAogCQkJaWYgKCFza2IpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUsICIKLQkJCQkgICAgICAgImRlZmVycmluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCW5ldGRldl93YXJuKGRldiwgIk1lbW9yeSBzcXVlZXplLCBkZWZlcnJpbmcgcGFja2V0XG4iKTsKIAkJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQlyZC0+bWJsZW5ndGggPSAwOwogCQkJCXJkLT5ybWQxX2JpdHMgPSBMRV9SMV9PV047CkBAIC0zMTYsMTMgKzMwMSwxMyBAQAogCQkJCXJldHVybiAwOwogCQkJfQogCi0JCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsJCS8qIDE2IGJ5dGUgYWxpZ24gKi8KLQkJCXNrYl9wdXQgKHNrYiwgbGVuKTsJCS8qIG1ha2Ugcm9vbSAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJCS8qIDE2IGJ5dGUgYWxpZ24gKi8KKwkJCXNrYl9wdXQoc2tiLCBsZW4pOwkJLyogbWFrZSByb29tICovCiAJCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsCi0JCQkJCSAodW5zaWduZWQgY2hhciAqKSYoaWItPnJ4X2J1ZiBbbHAtPnJ4X25ld11bMF0pLAotCQkJCQkgbGVuKTsKLQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyAoc2tiLCBkZXYpOwotCQkJbmV0aWZfcnggKHNrYik7CisJCQkJICh1bnNpZ25lZCBjaGFyICopJmliLT5yeF9idWZbbHAtPnJ4X25ld11bMF0sCisJCQkJIGxlbik7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKIAkJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAJCX0KQEAgLTMzNSw3ICszMjAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxhbmNlX3R4IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBsYW5jZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CkBAIC0zNTAsNyArMzM1LDcgQEAKIAogCWogPSBscC0+dHhfb2xkOwogCWZvciAoaSA9IGo7IGkgIT0gbHAtPnR4X25ldzsgaSA9IGopIHsKLQkJdGQgPSAmaWItPmJ0eF9yaW5nIFtpXTsKKwkJdGQgPSAmaWItPmJ0eF9yaW5nW2ldOwogCiAJCS8qIElmIHdlIGhpdCBhIHBhY2tldCBub3Qgb3duZWQgYnkgdXMsIHN0b3AgKi8KIAkJaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9PV04pCkBAIC0zNjAsNDUgKzM0NSw0NCBAQAogCQkJc3RhdHVzID0gdGQtPm1pc2M7CiAKIAkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCQlpZiAoc3RhdHVzICYgTEVfVDNfUlRZKSAgZGV2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOwotCQkJaWYgKHN0YXR1cyAmIExFX1QzX0xDT0wpIGRldi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIExFX1QzX1JUWSkKKwkJCQlkZXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgTEVfVDNfTENPTCkKKwkJCQlkZXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKIAogCQkJaWYgKHN0YXR1cyAmIExFX1QzX0NMT1MpIHsKIAkJCQlkZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CiAJCQkJaWYgKGxwLT5hdXRvX3NlbGVjdCkgewogCQkJCQlscC0+dHBlID0gMSAtIGxwLT50cGU7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhcnJpZXIgTG9zdCwgIgotCQkJCQkgICAgICAgInRyeWluZyAlc1xuIiwgZGV2LT5uYW1lLAotCQkJCQkgICAgICAgbHAtPnRwZT8iVFBFIjoiQVVJIik7CisJCQkJCW5ldGRldl9lcnIoZGV2LCAiQ2FycmllciBMb3N0LCB0cnlpbmcgJXNcbiIsCisJCQkJCQkgICBscC0+dHBlID8gIlRQRSIgOiAiQVVJIik7CiAJCQkJCS8qIFN0b3AgdGhlIGxhbmNlICovCiAJCQkJCWxsLT5yYXAgPSBMRV9DU1IwOwogCQkJCQlsbC0+cmRwID0gTEVfQzBfU1RPUDsKLQkJCQkJbGFuY2VfaW5pdF9yaW5nIChkZXYpOwotCQkJCQlsb2FkX2NzcnMgKGxwKTsKLQkJCQkJaW5pdF9yZXN0YXJ0X2xhbmNlIChscCk7CisJCQkJCWxhbmNlX2luaXRfcmluZyhkZXYpOworCQkJCQlsb2FkX2NzcnMobHApOworCQkJCQlpbml0X3Jlc3RhcnRfbGFuY2UobHApOwogCQkJCQlyZXR1cm4gMDsKIAkJCQl9CiAJCQl9CiAKLQkJCS8qIGJ1ZmZlciBlcnJvcnMgYW5kIHVuZGVyZmxvd3MgdHVybiBvZmYgdGhlIHRyYW5zbWl0dGVyICovCi0JCQkvKiBSZXN0YXJ0IHRoZSBhZGFwdGVyICovCi0JCQlpZiAoc3RhdHVzICYgKExFX1QzX0JVRnxMRV9UM19VRkwpKSB7CisJCQkvKiBidWZmZXIgZXJyb3JzIGFuZCB1bmRlcmZsb3dzIHR1cm4gb2ZmCisJCQkgKiB0aGUgdHJhbnNtaXR0ZXIsIHNvIHJlc3RhcnQgdGhlIGFkYXB0ZXIKKwkJCSAqLworCQkJaWYgKHN0YXR1cyAmIChMRV9UM19CVUYgfCBMRV9UM19VRkwpKSB7CiAJCQkJZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCi0JCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVHg6IEVSUl9CVUZ8RVJSX1VGTCwgIgotCQkJCSAgICAgICAicmVzdGFydGluZ1xuIiwgZGV2LT5uYW1lKTsKKwkJCQluZXRkZXZfZXJyKGRldiwgIlR4OiBFUlJfQlVGfEVSUl9VRkwsIHJlc3RhcnRpbmdcbiIpOwogCQkJCS8qIFN0b3AgdGhlIGxhbmNlICovCiAJCQkJbGwtPnJhcCA9IExFX0NTUjA7CiAJCQkJbGwtPnJkcCA9IExFX0MwX1NUT1A7Ci0JCQkJbGFuY2VfaW5pdF9yaW5nIChkZXYpOwotCQkJCWxvYWRfY3NycyAobHApOwotCQkJCWluaXRfcmVzdGFydF9sYW5jZSAobHApOworCQkJCWxhbmNlX2luaXRfcmluZyhkZXYpOworCQkJCWxvYWRfY3NycyhscCk7CisJCQkJaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfSBlbHNlIGlmICgodGQtPnRtZDFfYml0cyAmIExFX1QxX1BPSykgPT0gTEVfVDFfUE9LKSB7Ci0JCQkvKgotCQkJICogU28gd2UgZG9uJ3QgY291bnQgdGhlIHBhY2tldCBtb3JlIHRoYW4gb25jZS4KLQkJCSAqLworCQkJLyogU28gd2UgZG9uJ3QgY291bnQgdGhlIHBhY2tldCBtb3JlIHRoYW4gb25jZS4gKi8KIAkJCXRkLT50bWQxX2JpdHMgJj0gfihMRV9UMV9QT0spOwogCiAJCQkvKiBPbmUgY29sbGlzaW9uIGJlZm9yZSBwYWNrZXQgd2FzIHNlbnQuICovCkBAIC00MTksMTggKzQwMywyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgbGFuY2VfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCitzdGF0aWMgaW50IGxhbmNlX3R4X2J1ZmZzX2F2YWlsKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscDsKLQl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGw7CisJaWYgKGxwLT50eF9vbGQgPD0gbHAtPnR4X25ldykKKwkJcmV0dXJuIGxwLT50eF9vbGQgKyBscC0+dHhfcmluZ19tb2RfbWFzayAtIGxwLT50eF9uZXc7CisJcmV0dXJuIGxwLT50eF9vbGQgLSBscC0+dHhfbmV3IC0gMTsKK30KKworc3RhdGljIGlycXJldHVybl90IGxhbmNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKIAlpbnQgY3NyMDsKIAotCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7Ci0KLQlscCA9IG5ldGRldl9wcml2KGRldik7Ci0JbGwgPSBscC0+bGw7Ci0KIAlsbC0+cmFwID0gTEVfQ1NSMDsJCS8qIExBTkNFIENvbnRyb2xsZXIgU3RhdHVzICovCiAJY3NyMCA9IGxsLT5yZHA7CiAKQEAgLTQzOCwxOSArNDI0LDE5IEBACiAJCXJldHVybiBJUlFfTk9ORTsJLyogYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIExhbmNlLiAqLwogCiAJLyogQWNrbm93bGVkZ2UgYWxsIHRoZSBpbnRlcnJ1cHQgc291cmNlcyBBU0FQICovCi0JbGwtPnJkcCA9IGNzcjAgJiB+KExFX0MwX0lORUF8TEVfQzBfVERNRHxMRV9DMF9TVE9QfExFX0MwX1NUUlR8CisJbGwtPnJkcCA9IGNzcjAgJiB+KExFX0MwX0lORUEgfCBMRV9DMF9URE1EIHwgTEVfQzBfU1RPUCB8IExFX0MwX1NUUlQgfAogCQkJICAgTEVfQzBfSU5JVCk7CiAKLQlpZiAoKGNzcjAgJiBMRV9DMF9FUlIpKSB7CisJaWYgKGNzcjAgJiBMRV9DMF9FUlIpIHsKIAkJLyogQ2xlYXIgdGhlIGVycm9yIGNvbmRpdGlvbiAqLwotCQlsbC0+cmRwID0gTEVfQzBfQkFCTHxMRV9DMF9FUlJ8TEVfQzBfTUlTU3xMRV9DMF9JTkVBOworCQlsbC0+cmRwID0gTEVfQzBfQkFCTCB8IExFX0MwX0VSUiB8IExFX0MwX01JU1MgfCBMRV9DMF9JTkVBOwogCX0KIAogCWlmIChjc3IwICYgTEVfQzBfUklOVCkKLQkJbGFuY2VfcnggKGRldik7CisJCWxhbmNlX3J4KGRldik7CiAKIAlpZiAoY3NyMCAmIExFX0MwX1RJTlQpCi0JCWxhbmNlX3R4IChkZXYpOworCQlsYW5jZV90eChkZXYpOwogCiAJLyogTG9nIG1pc2MgZXJyb3JzLiAqLwogCWlmIChjc3IwICYgTEVfQzBfQkFCTCkKQEAgLTQ1OCwyMiArNDQ0LDIyIEBACiAJaWYgKGNzcjAgJiBMRV9DMF9NSVNTKQogCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOyAgICAgICAvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KIAlpZiAoY3NyMCAmIExFX0MwX01FUlIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQnVzIG1hc3RlciBhcmJpdHJhdGlvbiBmYWlsdXJlLCBzdGF0dXMgIgotCQkgICAgICAgIiU0LjR4LlxuIiwgZGV2LT5uYW1lLCBjc3IwKTsKKwkJbmV0ZGV2X2VycihkZXYsICJCdXMgbWFzdGVyIGFyYml0cmF0aW9uIGZhaWx1cmUsIHN0YXR1cyAlMDR4XG4iLAorCQkJICAgY3NyMCk7CiAJCS8qIFJlc3RhcnQgdGhlIGNoaXAuICovCiAJCWxsLT5yZHAgPSBMRV9DMF9TVFJUOwogCX0KIAotCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYgVFhfQlVGRlNfQVZBSUwgPiAwKQorCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYgbGFuY2VfdHhfYnVmZnNfYXZhaWwobHApID4gMCkKIAkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogCiAJbGwtPnJhcCA9IExFX0NTUjA7Ci0JbGwtPnJkcCA9IExFX0MwX0JBQkx8TEVfQzBfQ0VSUnxMRV9DMF9NSVNTfExFX0MwX01FUlJ8Ci0JCQkJCUxFX0MwX0lET058TEVfQzBfSU5FQTsKKwlsbC0+cmRwID0gKExFX0MwX0JBQkwgfCBMRV9DMF9DRVJSIHwgTEVfQzBfTUlTUyB8IExFX0MwX01FUlIgfAorCQkgICBMRV9DMF9JRE9OIHwgTEVfQzBfSU5FQSk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IGxhbmNlX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGxhbmNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKQEAgLTQ4NiwxNyArNDcyLDE4IEBACiAJLyogSW5zdGFsbCB0aGUgSW50ZXJydXB0IGhhbmRsZXIgKi8KIAlyZXQgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGxhbmNlX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQkgIGRldi0+bmFtZSwgZGV2KTsKLQlpZiAocmV0KSByZXR1cm4gcmV0OworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlsb2FkX2NzcnMgKGxwKTsKLQlsYW5jZV9pbml0X3JpbmcgKGRldik7CisJbG9hZF9jc3JzKGxwKTsKKwlsYW5jZV9pbml0X3JpbmcoZGV2KTsKIAogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKLQlyZXR1cm4gaW5pdF9yZXN0YXJ0X2xhbmNlIChscCk7CisJcmV0dXJuIGluaXRfcmVzdGFydF9sYW5jZShscCk7CiB9CiAKLXN0YXRpYyBpbnQgbGFuY2VfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGxhbmNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGwgPSBscC0+bGw7CkBAIC01MTIsNyArNDk5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbGFuY2VfcmVzZXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIGludCBsYW5jZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOwpAQCAtNTIyLDE2ICs1MDksMTUgQEAKIAlsbC0+cmFwID0gTEVfQ1NSMDsKIAlsbC0+cmRwID0gTEVfQzBfU1RPUDsKIAotCWxvYWRfY3NycyAobHApOworCWxvYWRfY3NycyhscCk7CiAKLQlsYW5jZV9pbml0X3JpbmcgKGRldik7CisJbGFuY2VfaW5pdF9yaW5nKGRldik7CiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7IC8qIHByZXZlbnQgdHggdGltZW91dCAqLwogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKLQlzdGF0dXMgPSBpbml0X3Jlc3RhcnRfbGFuY2UgKGxwKTsKLSNpZmRlZiBERUJVR19EUklWRVIKLQlwcmludGsoS0VSTl9ERUJVRyAiTGFuY2UgcmVzdGFydD0lZFxuIiwgc3RhdHVzKTsKLSNlbmRpZgorCXN0YXR1cyA9IGluaXRfcmVzdGFydF9sYW5jZShscCk7CisJbmV0ZGV2X2RiZyhkZXYsICJMYW5jZSByZXN0YXJ0PSVkXG4iLCBzdGF0dXMpOworCiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNTQwLDE0ICs1MjYsMTMgQEAKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKIAotCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0XG4iLAotCSAgICAgICBkZXYtPm5hbWUsIGxsLT5yZHApOworCW5ldGRldl9lcnIoZGV2LCAidHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTA0eCwgcmVzZXRcbiIsIGxsLT5yZHApOwogCWxhbmNlX3Jlc2V0KGRldik7CiAJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogfQogCi1zdGF0aWMgbmV0ZGV2X3R4X3QgbGFuY2Vfc3RhcnRfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgbmV0ZGV2X3R4X3QgbGFuY2Vfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOwpAQCAtNTYyLDMzICs1NDcsMzMgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCWlmICghVFhfQlVGRlNfQVZBSUwpeworCWlmICghbGFuY2VfdHhfYnVmZnNfYXZhaWwobHApKSB7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7CiAJfQogCi0jaWZkZWYgREVCVUdfRFJJVkVSCisjaWZkZWYgREVCVUcKIAkvKiBkdW1wIHRoZSBwYWNrZXQgKi8KIAlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAic2tiLT5kYXRhOiAiLCBEVU1QX1BSRUZJWF9OT05FLAogCQkgICAgICAgMTYsIDEsIHNrYi0+ZGF0YSwgNjQsIHRydWUpOwogI2VuZGlmCiAJZW50cnkgPSBscC0+dHhfbmV3ICYgbHAtPnR4X3JpbmdfbW9kX21hc2s7Ci0JaWItPmJ0eF9yaW5nIFtlbnRyeV0ubGVuZ3RoID0gKC1za2JsZW4pIHwgMHhmMDAwOwotCWliLT5idHhfcmluZyBbZW50cnldLm1pc2MgPSAwOworCWliLT5idHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gKC1za2JsZW4pIHwgMHhmMDAwOworCWliLT5idHhfcmluZ1tlbnRyeV0ubWlzYyA9IDA7CiAKLQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgKHZvaWQgKikmaWItPnR4X2J1ZiBbZW50cnldWzBdLCBza2JsZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCAodm9pZCAqKSZpYi0+dHhfYnVmW2VudHJ5XVswXSwgc2tibGVuKTsKIAogCS8qIE5vdywgZ2l2ZSB0aGUgcGFja2V0IHRvIHRoZSBsYW5jZSAqLwotCWliLT5idHhfcmluZyBbZW50cnldLnRtZDFfYml0cyA9IChMRV9UMV9QT0t8TEVfVDFfT1dOKTsKKwlpYi0+YnR4X3JpbmdbZW50cnldLnRtZDFfYml0cyA9IChMRV9UMV9QT0sgfCBMRV9UMV9PV04pOwogCWxwLT50eF9uZXcgPSAobHAtPnR4X25ldysxKSAmIGxwLT50eF9yaW5nX21vZF9tYXNrOwogCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tibGVuOwogCi0JaWYgKFRYX0JVRkZTX0FWQUlMIDw9IDApCisJaWYgKGxhbmNlX3R4X2J1ZmZzX2F2YWlsKGxwKSA8PSAwKQogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKIAkvKiBLaWNrIHRoZSBsYW5jZTogdHJhbnNtaXQgbm93ICovCiAJbGwtPnJkcCA9IExFX0MwX0lORUEgfCBMRV9DMF9URE1EOwotCWRldl9rZnJlZV9za2IgKHNrYik7CisJZGV2X2tmcmVlX3NrYihza2IpOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCkBAIC01OTYsNDAgKzU4MSwzMyBAQAogfQogCiAvKiB0YWtlbiBmcm9tIHRoZSBkZXBjYSBkcml2ZXIgKi8KLXN0YXRpYyB2b2lkIGxhbmNlX2xvYWRfbXVsdGljYXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbGFuY2VfbG9hZF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrOwogCXZvbGF0aWxlIHUxNiAqbWNhc3RfdGFibGUgPSAodTE2ICopJmliLT5maWx0ZXI7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQljaGFyICphZGRyczsKIAl1MzIgY3JjOwogCiAJLyogc2V0IGFsbCBtdWx0aWNhc3QgYml0cyAqLwotCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKXsKLQkJaWItPmZpbHRlciBbMF0gPSAweGZmZmZmZmZmOwotCQlpYi0+ZmlsdGVyIFsxXSA9IDB4ZmZmZmZmZmY7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJaWItPmZpbHRlclswXSA9IDB4ZmZmZmZmZmY7CisJCWliLT5maWx0ZXJbMV0gPSAweGZmZmZmZmZmOwogCQlyZXR1cm47CiAJfQogCS8qIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyICovCi0JaWItPmZpbHRlciBbMF0gPSAwOwotCWliLT5maWx0ZXIgWzFdID0gMDsKKwlpYi0+ZmlsdGVyWzBdID0gMDsKKwlpYi0+ZmlsdGVyWzFdID0gMDsKIAogCS8qIEFkZCBhZGRyZXNzZXMgKi8KIAluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7Ci0JCWFkZHJzID0gaGEtPmFkZHI7Ci0KLQkJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCi0JCWlmICghKCphZGRycyAmIDEpKQotCQkJY29udGludWU7Ci0KLQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGhhLT5hZGRyKTsKIAkJY3JjID0gY3JjID4+IDI2OwotCQltY2FzdF90YWJsZSBbY3JjID4+IDRdIHw9IDEgPDwgKGNyYyAmIDB4Zik7CisJCW1jYXN0X3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgbGFuY2Vfc2V0X211bHRpY2FzdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGxhbmNlX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrOwpAQCAtNjQ4LDE2ICs2MjYsMTYgQEAKIAogCWxsLT5yYXAgPSBMRV9DU1IwOwogCWxsLT5yZHAgPSBMRV9DMF9TVE9QOwotCWxhbmNlX2luaXRfcmluZyAoZGV2KTsKKwlsYW5jZV9pbml0X3JpbmcoZGV2KTsKIAogCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKIAkJaWItPm1vZGUgfD0gTEVfTU9fUFJPTTsKIAl9IGVsc2UgewogCQlpYi0+bW9kZSAmPSB+TEVfTU9fUFJPTTsKLQkJbGFuY2VfbG9hZF9tdWx0aWNhc3QgKGRldik7CisJCWxhbmNlX2xvYWRfbXVsdGljYXN0KGRldik7CiAJfQotCWxvYWRfY3NycyAobHApOwotCWluaXRfcmVzdGFydF9sYW5jZSAobHApOworCWxvYWRfY3NycyhscCk7CisJaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CiAKQEAgLTY5NywxNCArNjc1LDEyIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqcHJpdjsKLQl1bnNpZ25lZCBsb25nIGJvYXJkLCBiYXNlX2FkZHIsIG1lbV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHIgPSBib2FyZCArIEEyMDY1X0xBTkNFOworCXVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0ID0gYm9hcmQgKyBBMjA2NV9SQU07CiAJc3RydWN0IHJlc291cmNlICpyMSwgKnIyOwogCWludCBlcnI7CiAKLQlib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OwotCWJhc2VfYWRkciA9IGJvYXJkK0EyMDY1X0xBTkNFOwotCW1lbV9zdGFydCA9IGJvYXJkK0EyMDY1X1JBTTsKLQogCXIxID0gcmVxdWVzdF9tZW1fcmVnaW9uKGJhc2VfYWRkciwgc2l6ZW9mKHN0cnVjdCBsYW5jZV9yZWdzKSwKIAkJCQkiQW03OTkwIik7CiAJaWYgKCFyMSkKQEAgLTczNSwxMiArNzExLDEyIEBACiAJCWRldi0+ZGV2X2FkZHJbMV0gPSAweDAwOwogCQlkZXYtPmRldl9hZGRyWzJdID0gMHg5ZjsKIAl9Ci0JZGV2LT5kZXZfYWRkclszXSA9ICh6LT5yb20uZXJfU2VyaWFsTnVtYmVyPj4xNikgJiAweGZmOwotCWRldi0+ZGV2X2FkZHJbNF0gPSAoei0+cm9tLmVyX1NlcmlhbE51bWJlcj4+OCkgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbM10gPSAoei0+cm9tLmVyX1NlcmlhbE51bWJlciA+PiAxNikgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbNF0gPSAoei0+cm9tLmVyX1NlcmlhbE51bWJlciA+PiA4KSAmIDB4ZmY7CiAJZGV2LT5kZXZfYWRkcls1XSA9IHotPnJvbS5lcl9TZXJpYWxOdW1iZXIgJiAweGZmOwogCWRldi0+YmFzZV9hZGRyID0gWlRXT19WQUREUihiYXNlX2FkZHIpOwogCWRldi0+bWVtX3N0YXJ0ID0gWlRXT19WQUREUihtZW1fc3RhcnQpOwotCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0K0EyMDY1X1JBTV9TSVpFOworCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgQTIwNjVfUkFNX1NJWkU7CiAKIAlwcml2LT5sbCA9ICh2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqKWRldi0+YmFzZV9hZGRyOwogCXByaXYtPmluaXRfYmxvY2sgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKilkZXYtPm1lbV9zdGFydDsKQEAgLTc2MCw3ICs3MzYsNyBAQAogCWluaXRfdGltZXIoJnByaXYtPm11bHRpY2FzdF90aW1lcik7CiAJcHJpdi0+bXVsdGljYXN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OwogCXByaXYtPm11bHRpY2FzdF90aW1lci5mdW5jdGlvbiA9Ci0JCSh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSkgJmxhbmNlX3NldF9tdWx0aWNhc3Q7CisJCSh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlsYW5jZV9zZXRfbXVsdGljYXN0OwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewpAQCAtNzcxLDggKzc0Nyw4IEBACiAJfQogCXpvcnJvX3NldF9kcnZkYXRhKHosIGRldik7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogQTIwNjUgYXQgMHglMDhseCwgRXRoZXJuZXQgQWRkcmVzcyAiCi0JICAgICAgICIlcE1cbiIsIGRldi0+bmFtZSwgYm9hcmQsIGRldi0+ZGV2X2FkZHIpOworCW5ldGRldl9pbmZvKGRldiwgIkEyMDY1IGF0IDB4JTA4bHgsIEV0aGVybmV0IEFkZHJlc3MgJXBNXG4iLAorCQkgICAgYm9hcmQsIGRldi0+ZGV2X2FkZHIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hYzMyMDAuYyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCmluZGV4IDUxODFlOTMuLmYwN2IyZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FjMzIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hY2VuaWMuYyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5jCmluZGV4IGQ3YzFiZmU0Li41MzYwMzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hY2VuaWMuYworKysgYi9kcml2ZXJzL25ldC9hY2VuaWMuYwpAQCAtNjksMTAgKzY5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgotCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgotI2VuZGlmCiAKICNpZmRlZiBTSU9DRVRIVE9PTAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KQEAgLTE3MSwxNSArMTY4LDYgQEAKICNkZWZpbmUgQk9BUkRfSURYX1NUQVRJQwkwCiAjZGVmaW5lIEJPQVJEX0lEWF9PVkVSRkxPVwktMQogCi0jaWYgKGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKSkgJiYgXAotCWRlZmluZWQoTkVUSUZfRl9IV19WTEFOX1JYKQotI2RlZmluZSBBQ0VOSUNfRE9fVkxBTgkJMQotI2RlZmluZSBBQ0VfUkNCX1ZMQU5fRkxBRwlSQ0JfRkxHX1ZMQU5fQVNTSVNUCi0jZWxzZQotI2RlZmluZSBBQ0VOSUNfRE9fVkxBTgkJMAotI2RlZmluZSBBQ0VfUkNCX1ZMQU5fRkxBRwkwCi0jZW5kaWYKLQogI2luY2x1ZGUgImFjZW5pYy5oIgogCiAvKgpAQCAtNDY1LDkgKzQ1Myw2IEBACiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBhY2Vfc2V0X21hY19hZGRyLAogCS5uZG9fY2hhbmdlX210dQkJPSBhY2VfY2hhbmdlX210dSwKLSNpZiBBQ0VOSUNfRE9fVkxBTgotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IGFjZV92bGFuX3J4X3JlZ2lzdGVyLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhY2VuaWNfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApAQCAtNDkxLDkgKzQ3Niw3IEBACiAJYXAtPm5hbWUgPSBwY2lfbmFtZShwZGV2KTsKIAogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTTsKLSNpZiBBQ0VOSUNfRE9fVkxBTgogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOwotI2VuZGlmCiAKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKIApAQCAtMTI0OCw3ICsxMjMxLDcgQEAKIAlzZXRfYWNlYWRkcigmaW5mby0+cnhfc3RkX2N0cmwucm5ncHRyLCBhcC0+cnhfcmluZ19iYXNlX2RtYSk7CiAJaW5mby0+cnhfc3RkX2N0cmwubWF4X2xlbiA9IEFDRV9TVERfQlVGU0laRTsKIAlpbmZvLT5yeF9zdGRfY3RybC5mbGFncyA9Ci0JICBSQ0JfRkxHX1RDUF9VRFBfU1VNIHwgUkNCX0ZMR19OT19QU0VVRE9fSERSIHwgQUNFX1JDQl9WTEFOX0ZMQUc7CisJICBSQ0JfRkxHX1RDUF9VRFBfU1VNIHwgUkNCX0ZMR19OT19QU0VVRE9fSERSIHwgUkNCX0ZMR19WTEFOX0FTU0lTVDsKIAogCW1lbXNldChhcC0+cnhfc3RkX3JpbmcsIDAsCiAJICAgICAgIFJYX1NURF9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpKTsKQEAgLTEyNjQsNyArMTI0Nyw3IEBACiAJCSAgICAgKHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKiBSWF9TVERfUklOR19FTlRSSUVTKSkpOwogCWluZm8tPnJ4X2p1bWJvX2N0cmwubWF4X2xlbiA9IDA7CiAJaW5mby0+cnhfanVtYm9fY3RybC5mbGFncyA9Ci0JICBSQ0JfRkxHX1RDUF9VRFBfU1VNIHwgUkNCX0ZMR19OT19QU0VVRE9fSERSIHwgQUNFX1JDQl9WTEFOX0ZMQUc7CisJICBSQ0JfRkxHX1RDUF9VRFBfU1VNIHwgUkNCX0ZMR19OT19QU0VVRE9fSERSIHwgUkNCX0ZMR19WTEFOX0FTU0lTVDsKIAogCW1lbXNldChhcC0+cnhfanVtYm9fcmluZywgMCwKIAkgICAgICAgUlhfSlVNQk9fUklOR19FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSk7CkBAIC0xMjg2LDcgKzEyNjksNyBAQAogCQkJICAgICAgIFJYX0pVTUJPX1JJTkdfRU5UUklFUykpKSk7CiAJCWluZm8tPnJ4X21pbmlfY3RybC5tYXhfbGVuID0gQUNFX01JTklfU0laRTsKIAkJaW5mby0+cnhfbWluaV9jdHJsLmZsYWdzID0KLQkJICBSQ0JfRkxHX1RDUF9VRFBfU1VNfFJDQl9GTEdfTk9fUFNFVURPX0hEUnxBQ0VfUkNCX1ZMQU5fRkxBRzsKKwkJICBSQ0JfRkxHX1RDUF9VRFBfU1VNfFJDQl9GTEdfTk9fUFNFVURPX0hEUnxSQ0JfRkxHX1ZMQU5fQVNTSVNUOwogCiAJCWZvciAoaSA9IDA7IGkgPCBSWF9NSU5JX1JJTkdfRU5UUklFUzsgaSsrKQogCQkJYXAtPnJ4X21pbmlfcmluZ1tpXS5mbGFncyA9CkBAIC0xMzMyLDcgKzEzMTUsNyBAQAogCX0KIAogCWluZm8tPnR4X2N0cmwubWF4X2xlbiA9IEFDRV9UWF9SSU5HX0VOVFJJRVMoYXApOwotCXRtcCA9IFJDQl9GTEdfVENQX1VEUF9TVU0gfCBSQ0JfRkxHX05PX1BTRVVET19IRFIgfCBBQ0VfUkNCX1ZMQU5fRkxBRzsKKwl0bXAgPSBSQ0JfRkxHX1RDUF9VRFBfU1VNIHwgUkNCX0ZMR19OT19QU0VVRE9fSERSIHwgUkNCX0ZMR19WTEFOX0FTU0lTVDsKIAogCS8qCiAJICogVGhlIFRpZ29uIEkgZG9lcyBub3QgbGlrZSBoYXZpbmcgdGhlIFRYIHJpbmcgaW4gaG9zdCBtZW1vcnkgOy0oCkBAIC0xNjc0LDcgKzE2NTcsNyBAQAogCQlzdHJ1Y3QgcnhfZGVzYyAqcmQ7CiAJCWRtYV9hZGRyX3QgbWFwcGluZzsKIAotCQlza2IgPSBhbGxvY19za2IoQUNFX1NURF9CVUZTSVpFICsgTkVUX0lQX0FMSUdOLCBHRlBfQVRPTUlDKTsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihBQ0VfU1REX0JVRlNJWkUgKyBORVRfSVBfQUxJR04pOwogCQlpZiAoIXNrYikKIAkJCWJyZWFrOwogCkBAIC0xNzM1LDcgKzE3MTgsNyBAQAogCQlzdHJ1Y3QgcnhfZGVzYyAqcmQ7CiAJCWRtYV9hZGRyX3QgbWFwcGluZzsKIAotCQlza2IgPSBhbGxvY19za2IoQUNFX01JTklfQlVGU0laRSArIE5FVF9JUF9BTElHTiwgR0ZQX0FUT01JQyk7CisJCXNrYiA9IGRldl9hbGxvY19za2IoQUNFX01JTklfQlVGU0laRSArIE5FVF9JUF9BTElHTik7CiAJCWlmICghc2tiKQogCQkJYnJlYWs7CiAKQEAgLTE3OTEsNyArMTc3NCw3IEBACiAJCXN0cnVjdCByeF9kZXNjICpyZDsKIAkJZG1hX2FkZHJfdCBtYXBwaW5nOwogCi0JCXNrYiA9IGFsbG9jX3NrYihBQ0VfSlVNQk9fQlVGU0laRSArIE5FVF9JUF9BTElHTiwgR0ZQX0FUT01JQyk7CisJCXNrYiA9IGRldl9hbGxvY19za2IoQUNFX0pVTUJPX0JVRlNJWkUgKyBORVRfSVBfQUxJR04pOwogCQlpZiAoIXNrYikKIAkJCWJyZWFrOwogCkBAIC0yMDM4LDEyICsyMDIxLDkgQEAKIAkJfQogCiAJCS8qIHNlbmQgaXQgdXAgKi8KLSNpZiBBQ0VOSUNfRE9fVkxBTgotCQlpZiAoYXAtPnZsZ3JwICYmIChiZF9mbGFncyAmIEJEX0ZMR19WTEFOX1RBRykpIHsKLQkJCXZsYW5faHdhY2NlbF9yeChza2IsIGFwLT52bGdycCwgcmV0ZGVzYy0+dmxhbik7Ci0JCX0gZWxzZQotI2VuZGlmCi0JCQluZXRpZl9yeChza2IpOworCQlpZiAoKGJkX2ZsYWdzICYgQkRfRkxHX1ZMQU5fVEFHKSkKKwkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCByZXRkZXNjLT52bGFuKTsKKwkJbmV0aWZfcngoc2tiKTsKIAogCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByZXRkZXNjLT5zaXplOwpAQCAtMjI2MiwyNCArMjI0Miw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0KLSNpZiBBQ0VOSUNfRE9fVkxBTgotc3RhdGljIHZvaWQgYWNlX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKLXsKLQlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWFjZV9tYXNrX2lycShkZXYpOwotCi0JYXAtPnZsZ3JwID0gZ3JwOwotCi0JYWNlX3VubWFza19pcnEoZGV2KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0jZW5kaWYgLyogQUNFTklDX0RPX1ZMQU4gKi8KLQotCiBzdGF0aWMgaW50IGFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGFjZV9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0yNDQ5LDE2ICsyNDExLDEyIEBACiAJCXdyaXRlbChhZGRyID4+IDMyLCAmaW8tPmFkZHIuYWRkcmhpKTsKIAkJd3JpdGVsKGFkZHIgJiAweGZmZmZmZmZmLCAmaW8tPmFkZHIuYWRkcmxvKTsKIAkJd3JpdGVsKGZsYWdzaXplLCAmaW8tPmZsYWdzaXplKTsKLSNpZiBBQ0VOSUNfRE9fVkxBTgogCQl3cml0ZWwodmxhbl90YWcsICZpby0+dmxhbnJlcyk7Ci0jZW5kaWYKIAl9IGVsc2UgewogCQlkZXNjLT5hZGRyLmFkZHJoaSA9IGFkZHIgPj4gMzI7CiAJCWRlc2MtPmFkZHIuYWRkcmxvID0gYWRkcjsKIAkJZGVzYy0+ZmxhZ3NpemUgPSBmbGFnc2l6ZTsKLSNpZiBBQ0VOSUNfRE9fVkxBTgogCQlkZXNjLT52bGFucmVzID0gdmxhbl90YWc7Ci0jZW5kaWYKIAl9CiB9CiAKQEAgLTI0ODYsMTIgKzI0NDQsMTAgQEAKIAkJZmxhZ3NpemUgPSAoc2tiLT5sZW4gPDwgMTYpIHwgKEJEX0ZMR19FTkQpOwogCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKIAkJCWZsYWdzaXplIHw9IEJEX0ZMR19UQ1BfVURQX1NVTTsKLSNpZiBBQ0VOSUNfRE9fVkxBTgogCQlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CiAJCQlmbGFnc2l6ZSB8PSBCRF9GTEdfVkxBTl9UQUc7CiAJCQl2bGFuX3RhZyA9IHZsYW5fdHhfdGFnX2dldChza2IpOwogCQl9Ci0jZW5kaWYKIAkJZGVzYyA9IGFwLT50eF9yaW5nICsgaWR4OwogCQlpZHggPSAoaWR4ICsgMSkgJSBBQ0VfVFhfUklOR19FTlRSSUVTKGFwKTsKIApAQCAtMjUwOSwxMiArMjQ2NSwxMCBAQAogCQlmbGFnc2l6ZSA9IChza2JfaGVhZGxlbihza2IpIDw8IDE2KTsKIAkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCiAJCQlmbGFnc2l6ZSB8PSBCRF9GTEdfVENQX1VEUF9TVU07Ci0jaWYgQUNFTklDX0RPX1ZMQU4KIAkJaWYgKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgewogCQkJZmxhZ3NpemUgfD0gQkRfRkxHX1ZMQU5fVEFHOwogCQkJdmxhbl90YWcgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKIAkJfQotI2VuZGlmCiAKIAkJYWNlX2xvYWRfdHhfYmQoYXAsIGFwLT50eF9yaW5nICsgaWR4LCBtYXBwaW5nLCBmbGFnc2l6ZSwgdmxhbl90YWcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hY2VuaWMuaCBiL2RyaXZlcnMvbmV0L2FjZW5pYy5oCmluZGV4IDA2ODFkYTcuLmY2N2RjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FjZW5pYy5oCisrKyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBfQUNFTklDX0hfCiAjZGVmaW5lIF9BQ0VOSUNfSF8KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogCiAvKgpAQCAtNjY0LDEwICs2NjUsNiBAQAogCXN0cnVjdCByeF9kZXNjCQkqcnhfbWluaV9yaW5nOwogCXN0cnVjdCByeF9kZXNjCQkqcnhfcmV0dXJuX3Jpbmc7CiAKLSNpZiBBQ0VOSUNfRE9fVkxBTgotCXN0cnVjdCB2bGFuX2dyb3VwCSp2bGdycDsKLSNlbmRpZgotCiAJaW50CQkJdGFza2xldF9wZW5kaW5nLCBqdW1ibzsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJYWNlX3Rhc2tsZXQ7CiAKQEAgLTc4OSw4ICs3ODYsNSBAQAogc3RhdGljIHZvaWQgYWNlX2luaXRfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYWNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgcmVhZF9lZXByb21fYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIG9mZnNldCk7Ci0jaWYgQUNFTklDX0RPX1ZMQU4KLXN0YXRpYyB2b2lkIGFjZV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApOwotI2VuZGlmCiAKICNlbmRpZiAvKiBfQUNFTklDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwppbmRleCAyNDFiMTg1Li43ODAwMmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCisrKyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKQEAgLTc1LDYgKzc1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpAQCAtNjYwLDE1ICs2NjEsNiBAQAogCX0KIAogfQotI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQKLS8qCi1UaGlzIGlzIHRoZSByZWNlaXZlIGluZGljYXRpb24gZnVuY3Rpb24gZm9yIHBhY2tldHMgd2l0aCB2bGFuIHRhZy4KLSovCi1zdGF0aWMgaW50IGFtZDgxMTFlX3ZsYW5fcngoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgdmxhbl90YWcpCi17Ci0JcmV0dXJuIHZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGxwLT52bGdycCx2bGFuX3RhZyk7Ci19Ci0jZW5kaWYKIAogLyoKIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIGFsbCB0aGUgdHJhbnNtaXQgc2ticyB0aGF0IGFyZSBhY3R1YWxseSB0cmFuc21pdHRlZCBieSB0aGUgZGV2aWNlLiBJdCB3aWxsIGNoZWNrIHRoZSBvd25lcnNoaXAgb2YgdGhlIHNrYiBiZWZvcmUgZnJlZWluZyB0aGUgc2tiLgpAQCAtNzYzLDcgKzc1NSw3IEBACiAjaWYgQU1EODExMUVfVkxBTl9UQUdfVVNFRAogCQkJdnRhZyA9IHN0YXR1cyAmIFRUX01BU0s7CiAJCQkvKk1BQyB3aWxsIHN0cmlwIHZsYW4gdGFnKi8KLQkJCWlmKGxwLT52bGdycCAhPSBOVUxMICYmIHZ0YWcgIT0wKQorCQkJaWYgKHZ0YWcgIT0gMCkKIAkJCQltaW5fcGt0X2xlbiA9TUlOX1BLVF9MRU4gLSA0OwogCQkJZWxzZQogI2VuZGlmCkBAIC03OTgsMTIgKzc5MCwxMiBAQAogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAogI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQKLQkJCWlmKGxwLT52bGdycCAhPSBOVUxMICYmICh2dGFnID09IFRUX1ZMQU5fVEFHR0VEKSl7Ci0JCQkJYW1kODExMWVfdmxhbl9yeChscCwgc2tiLAotCQkJCQkgbGUxNl90b19jcHUobHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnRhZ19jdHJsX2luZm8pKTsKLQkJCX0gZWxzZQorCQkJaWYgKHZ0YWcgPT0gVFRfVkxBTl9UQUdHRUQpeworCQkJCXUxNiB2bGFuX3RhZyA9IGxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW3J4X2luZGV4XS50YWdfY3RybF9pbmZvKTsKKwkJCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdmxhbl90YWcpOworCQkJfQogI2VuZGlmCi0JCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAJCQkvKkNPQUwgdXBkYXRlIHJ4IGNvYWxlc2NpbmcgcGFyYW1ldGVycyovCiAJCQlscC0+Y29hbF9jb25mLnJ4X3BhY2tldHMrKzsKIAkJCWxwLT5jb2FsX2NvbmYucnhfYnl0ZXMgKz0gcGt0X2xlbjsKQEAgLTE1OTcsMTYgKzE1ODksNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECi1zdGF0aWMgdm9pZCBhbWQ4MTExZV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0Jc3RydWN0ICBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOwotCWxwLT52bGdycCA9IGdycDsKLQlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IGFtZDgxMTFlX2VuYWJsZV9tYWdpY3BrdChzdHJ1Y3QgYW1kODExMWVfcHJpdiogbHApCiB7CiAJd3JpdGVsKCBWQUwxfE1QUExCQSwgbHAtPm1taW8gKyBDTUQzKTsKQEAgLTE4MjEsOSArMTgwMyw2IEBACiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBhbWQ4MTExZV9zZXRfbWFjX2FkZHJlc3MsCiAJLm5kb19kb19pb2N0bAkJPSBhbWQ4MTExZV9pb2N0bCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gYW1kODExMWVfY2hhbmdlX210dSwKLSNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gYW1kODExMWVfdmxhbl9yeF9yZWdpc3RlciwKLSNlbmRpZgogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIJID0gYW1kODExMWVfcG9sbCwKICNlbmRpZgpAQCAtMTk1OCw3ICsxOTM3LDcgQEAKIAkJCQkJCSBJUEdfQ09OVkVSR0VfSklGRklFUzsKIAkJbHAtPmlwZ19kYXRhLmlwZyA9IERFRkFVTFRfSVBHOwogCQlscC0+aXBnX2RhdGEuaXBnX3N0YXRlID0gQ1NUQVRFOwotCX07CisJfQogCiAJLyogIGRpc3BsYXkgZHJpdmVyIGFuZCBkZXZpY2UgaW5mb3JtYXRpb24gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYW1kODExMWUuaCBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmgKaW5kZXggYjU5MjZhZi4uMmZmMmU3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYW1kODExMWUuaAorKysgYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5oCkBAIC03ODMsOSArNzgzLDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dDsKIAlpbnQgbWlpOwogCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWlfaWY7Ci0jaWYgQU1EODExMUVfVkxBTl9UQUdfVVNFRAotCXN0cnVjdCB2bGFuX2dyb3VwCQkqdmxncnA7Ci0jZW5kaWYKIAljaGFyIG9wZW5lZDsKIAl1bnNpZ25lZCBpbnQgZHJ2X3J4X2Vycm9yczsKIAlzdHJ1Y3QgYW1kODExMWVfY29hbGVzY2VfY29uZiBjb2FsX2NvbmY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcG5lLmMgYi9kcml2ZXJzL25ldC9hcG5lLmMKaW5kZXggMmZlNjBmMS4uNTQ3NzM3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXBuZS5jCisrKyBiL2RyaXZlcnMvbmV0L2FwbmUuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvbHRwYy5jIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2x0cGMuYwppbmRleCBlNjllZWFkLi4zNGZmYjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvbHRwYy5jCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9sdHBjLmMKQEAgLTY1Miw5ICs2NTIsOSBAQAogCWludCByZXQ7CiAKIAlpZihpKSB7Ci0JCXFlbHNbaV0uY2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGNidWY7CisJCXFlbHNbaV0uY2J1ZiA9IGNidWY7CiAJCXFlbHNbaV0uY2J1ZmxlbiA9IGNidWZsZW47Ci0JCXFlbHNbaV0uZGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGRidWY7CisJCXFlbHNbaV0uZGJ1ZiA9IGRidWY7CiAJCXFlbHNbaV0uZGJ1ZmxlbiA9IGRidWZsZW47CiAJCXFlbHNbaV0uUVdyaXRlID0gMTsKIAkJcWVsc1tpXS5tYWlsYm94ID0gaTsgIC8qIHRoaXMgc2hvdWxkIGJlIGluaXR0ZWQgcmF0aGVyICovCkBAIC02NzYsOSArNjc2LDkgQEAKIAlpbnQgcmV0OwogCiAJaWYoaSkgewotCQlxZWxzW2ldLmNidWYgPSAodW5zaWduZWQgY2hhciAqKSBjYnVmOworCQlxZWxzW2ldLmNidWYgPSBjYnVmOwogCQlxZWxzW2ldLmNidWZsZW4gPSBjYnVmbGVuOwotCQlxZWxzW2ldLmRidWYgPSAodW5zaWduZWQgY2hhciAqKSBkYnVmOworCQlxZWxzW2ldLmRidWYgPSBkYnVmOwogCQlxZWxzW2ldLmRidWZsZW4gPSBkYnVmbGVuOwogCQlxZWxzW2ldLlFXcml0ZSA9IDA7CiAJCXFlbHNbaV0ubWFpbGJveCA9IGk7ICAvKiB0aGlzIHNob3VsZCBiZSBpbml0dGVkIHJhdGhlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2FyYy1yaW1pLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJpbWkuYwppbmRleCA5ZWZiYmJhLi4yNTE5N2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJpbWkuYworKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJpbWkuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC1pc2EuYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC1pc2EuYwppbmRleCAzNzI3MjgyLi40NWM2MWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtaXNhLmMKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLWlzYS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2FyY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbTIwMDIwLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtcGNpLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtcGNpLmMKaW5kZXggNDhhMWRiZi4uZDQyNzQ5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLXBjaS5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC1wY2kuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2FyY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbTIwMDIwLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAuYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC5jCmluZGV4IGM5ZTQ1OTQuLjdiZmI5MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tMjAwMjAuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTkwaW8uYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb205MGlvLmMKaW5kZXggZWIyNzk3Ni4uNDg3ZDc4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTkwaW8uYworKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tOTBpby5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9hcmNkZXZpY2UuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTkweHguYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb205MHh4LmMKaW5kZXggZjNiNDZmNy4uYjgwZmJlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTkweHguYworKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tOTB4eC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyaWFkbmUuYyBiL2RyaXZlcnMvbmV0L2FyaWFkbmUuYwppbmRleCBiN2Y0NWNkLi43ZWQ3OGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmlhZG5lLmMKKysrIGIvZHJpdmVycy9uZXQvYXJpYWRuZS5jCkBAIC0zNCw2ICszNCw5IEBACiAgKgktIGFuIE1DNjgyMzAgUGFyYWxsZWwgSW50ZXJmYWNlL1RpbWVyIGNvbmZpZ3VyZWQgYXMgMiBwYXJhbGxlbCBwb3J0cwogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKy8qI2RlZmluZSBERUJVRyovCisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTU0LDEwNiArNTcsNjQ3IEBACiAKICNpbmNsdWRlICJhcmlhZG5lLmgiCiAKLQogI2lmZGVmIEFSSUFETkVfREVCVUcKIGludCBhcmlhZG5lX2RlYnVnID0gQVJJQURORV9ERUJVRzsKICNlbHNlCiBpbnQgYXJpYWRuZV9kZWJ1ZyA9IDE7CiAjZW5kaWYKIAorLyogTWFjcm9zIHRvIEZpeCBFbmRpYW5uZXNzIHByb2JsZW1zICovCiAKLSAgICAvKgotICAgICAqCU1hY3JvcyB0byBGaXggRW5kaWFubmVzcyBwcm9ibGVtcwotICAgICAqLworLyogU3dhcCB0aGUgQnl0ZXMgaW4gYSBXT1JEICovCisjZGVmaW5lIHN3YXB3KHgpCSgoKHggPj4gOCkgJiAweDAwZmYpIHwgKCh4IDw8IDgpICYgMHhmZjAwKSkKKy8qIEdldCB0aGUgTG93IEJZVEUgaW4gYSBXT1JEICovCisjZGVmaW5lIGxvd2IoeCkJCSh4ICYgMHhmZikKKy8qIEdldCB0aGUgU3dhcHBlZCBIaWdoIFdPUkQgaW4gYSBMT05HICovCisjZGVmaW5lIHN3aGlnaHcoeCkJKCgoKHgpID4+IDgpICYgMHhmZjAwKSB8ICgoKHgpID4+IDI0KSAmIDB4MDBmZikpCisvKiBHZXQgdGhlIFN3YXBwZWQgTG93IFdPUkQgaW4gYSBMT05HICovCisjZGVmaW5lIHN3bG93dyh4KQkoKCgoeCkgPDwgOCkgJiAweGZmMDApIHwgKCgoeCkgPj4gOCkgJiAweDAwZmYpKQogCi0JCQkJLyogU3dhcCB0aGUgQnl0ZXMgaW4gYSBXT1JEICovCi0jZGVmaW5lIHN3YXB3KHgpCSgoKHg+PjgpJjB4MDBmZil8KCh4PDw4KSYweGZmMDApKQotCQkJCS8qIEdldCB0aGUgTG93IEJZVEUgaW4gYSBXT1JEICovCi0jZGVmaW5lIGxvd2IoeCkJCSh4JjB4ZmYpCi0JCQkJLyogR2V0IHRoZSBTd2FwcGVkIEhpZ2ggV09SRCBpbiBhIExPTkcgKi8KLSNkZWZpbmUgc3doaWdodyh4KQkoKCgoeCk+PjgpJjB4ZmYwMCl8KCgoeCk+PjI0KSYweDAwZmYpKQotCQkJCS8qIEdldCB0aGUgU3dhcHBlZCBMb3cgV09SRCBpbiBhIExPTkcgKi8KLSNkZWZpbmUgc3dsb3d3KHgpCSgoKCh4KTw8OCkmMHhmZjAwKXwoKCh4KT4+OCkmMHgwMGZmKSkKLQotCi0gICAgLyoKLSAgICAgKglUcmFuc21pdC9SZWNlaXZlIFJpbmcgRGVmaW5pdGlvbnMKLSAgICAgKi8KKy8qIFRyYW5zbWl0L1JlY2VpdmUgUmluZyBEZWZpbml0aW9ucyAqLwogCiAjZGVmaW5lIFRYX1JJTkdfU0laRQk1CiAjZGVmaW5lIFJYX1JJTkdfU0laRQkxNgogCiAjZGVmaW5lIFBLVF9CVUZfU0laRQkxNTIwCiAKLQotICAgIC8qCi0gICAgICoJUHJpdmF0ZSBEZXZpY2UgRGF0YQotICAgICAqLworLyogUHJpdmF0ZSBEZXZpY2UgRGF0YSAqLwogCiBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlIHsKLSAgICB2b2xhdGlsZSBzdHJ1Y3QgVERSRSAqdHhfcmluZ1tUWF9SSU5HX1NJWkVdOwotICAgIHZvbGF0aWxlIHN0cnVjdCBSRFJFICpyeF9yaW5nW1JYX1JJTkdfU0laRV07Ci0gICAgdm9sYXRpbGUgdV9zaG9ydCAqdHhfYnVmZltUWF9SSU5HX1NJWkVdOwotICAgIHZvbGF0aWxlIHVfc2hvcnQgKnJ4X2J1ZmZbUlhfUklOR19TSVpFXTsKLSAgICBpbnQgY3VyX3R4LCBjdXJfcng7CQkJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCi0gICAgaW50IGRpcnR5X3R4OwkJCS8qIFRoZSByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICovCi0gICAgY2hhciB0eF9mdWxsOworCXZvbGF0aWxlIHN0cnVjdCBURFJFICp0eF9yaW5nW1RYX1JJTkdfU0laRV07CisJdm9sYXRpbGUgc3RydWN0IFJEUkUgKnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKwl2b2xhdGlsZSB1X3Nob3J0ICp0eF9idWZmW1RYX1JJTkdfU0laRV07CisJdm9sYXRpbGUgdV9zaG9ydCAqcnhfYnVmZltSWF9SSU5HX1NJWkVdOworCWludCBjdXJfdHgsIGN1cl9yeDsJCS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAqLworCWludCBkaXJ0eV90eDsJCQkvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkICovCisJY2hhciB0eF9mdWxsOwogfTsKIAotCi0gICAgLyoKLSAgICAgKglTdHJ1Y3R1cmUgQ3JlYXRlZCBpbiB0aGUgQXJpYWRuZSdzIFJBTSBCdWZmZXIKLSAgICAgKi8KKy8qIFN0cnVjdHVyZSBDcmVhdGVkIGluIHRoZSBBcmlhZG5lJ3MgUkFNIEJ1ZmZlciAqLwogCiBzdHJ1Y3QgbGFuY2VkYXRhIHsKLSAgICBzdHJ1Y3QgVERSRSB0eF9yaW5nW1RYX1JJTkdfU0laRV07Ci0gICAgc3RydWN0IFJEUkUgcnhfcmluZ1tSWF9SSU5HX1NJWkVdOwotICAgIHVfc2hvcnQgdHhfYnVmZltUWF9SSU5HX1NJWkVdW1BLVF9CVUZfU0laRS9zaXplb2YodV9zaG9ydCldOwotICAgIHVfc2hvcnQgcnhfYnVmZltSWF9SSU5HX1NJWkVdW1BLVF9CVUZfU0laRS9zaXplb2YodV9zaG9ydCldOworCXN0cnVjdCBURFJFIHR4X3JpbmdbVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgUkRSRSByeF9yaW5nW1JYX1JJTkdfU0laRV07CisJdV9zaG9ydCB0eF9idWZmW1RYX1JJTkdfU0laRV1bUEtUX0JVRl9TSVpFIC8gc2l6ZW9mKHVfc2hvcnQpXTsKKwl1X3Nob3J0IHJ4X2J1ZmZbUlhfUklOR19TSVpFXVtQS1RfQlVGX1NJWkUgLyBzaXplb2YodV9zaG9ydCldOwogfTsKIAotc3RhdGljIGludCBhcmlhZG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBhcmlhZG5lX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBuZXRkZXZfdHhfdCBhcmlhZG5lX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGFyaWFkbmVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgYXJpYWRuZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGFyaWFkbmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgYXJpYWRuZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSk7Ci1zdGF0aWMgaW50IGFyaWFkbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFyaWFkbmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi0KIHN0YXRpYyB2b2lkIG1lbWNweXcodm9sYXRpbGUgdV9zaG9ydCAqZGVzdCwgdV9zaG9ydCAqc3JjLCBpbnQgbGVuKQogewotICAgIHdoaWxlIChsZW4gPj0gMikgewotCSooZGVzdCsrKSA9ICooc3JjKyspOwotCWxlbiAtPSAyOwotICAgIH0KLSAgICBpZiAobGVuID09IDEpCi0JKmRlc3QgPSAoKih1X2NoYXIgKilzcmMpPDw4OworCXdoaWxlIChsZW4gPj0gMikgeworCQkqKGRlc3QrKykgPSAqKHNyYysrKTsKKwkJbGVuIC09IDI7CisJfQorCWlmIChsZW4gPT0gMSkKKwkJKmRlc3QgPSAoKih1X2NoYXIgKilzcmMpIDw8IDg7Cit9CisKK3N0YXRpYyB2b2lkIGFyaWFkbmVfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlZGF0YSAqbGFuY2VkYXRhID0gKHN0cnVjdCBsYW5jZWRhdGEgKilkZXYtPm1lbV9zdGFydDsKKwlpbnQgaTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXByaXYtPnR4X2Z1bGwgPSAwOworCXByaXYtPmN1cl9yeCA9IHByaXYtPmN1cl90eCA9IDA7CisJcHJpdi0+ZGlydHlfdHggPSAwOworCisJLyogU2V0IHVwIFRYIFJpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdm9sYXRpbGUgc3RydWN0IFREUkUgKnQgPSAmbGFuY2VkYXRhLT50eF9yaW5nW2ldOworCQl0LT5UTUQwID0gc3dsb3d3KEFSSUFETkVfUkFNICsKKwkJCQkgb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgdHhfYnVmZltpXSkpOworCQl0LT5UTUQxID0gc3doaWdodyhBUklBRE5FX1JBTSArCisJCQkJICBvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCB0eF9idWZmW2ldKSkgfAorCQkJVEZfU1RQIHwgVEZfRU5QOworCQl0LT5UTUQyID0gc3dhcHcoKHVfc2hvcnQpLVBLVF9CVUZfU0laRSk7CisJCXQtPlRNRDMgPSAwOworCQlwcml2LT50eF9yaW5nW2ldID0gJmxhbmNlZGF0YS0+dHhfcmluZ1tpXTsKKwkJcHJpdi0+dHhfYnVmZltpXSA9IGxhbmNlZGF0YS0+dHhfYnVmZltpXTsKKwkJbmV0ZGV2X2RiZyhkZXYsICJUWCBFbnRyeSAlMmQgYXQgJXAsIEJ1ZiBhdCAlcFxuIiwKKwkJCSAgIGksICZsYW5jZWRhdGEtPnR4X3JpbmdbaV0sIGxhbmNlZGF0YS0+dHhfYnVmZltpXSk7CisJfQorCisJLyogU2V0IHVwIFJYIFJpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJdm9sYXRpbGUgc3RydWN0IFJEUkUgKnIgPSAmbGFuY2VkYXRhLT5yeF9yaW5nW2ldOworCQlyLT5STUQwID0gc3dsb3d3KEFSSUFETkVfUkFNICsKKwkJCQkgb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgcnhfYnVmZltpXSkpOworCQlyLT5STUQxID0gc3doaWdodyhBUklBRE5FX1JBTSArCisJCQkJICBvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCByeF9idWZmW2ldKSkgfAorCQkJUkZfT1dOOworCQlyLT5STUQyID0gc3dhcHcoKHVfc2hvcnQpLVBLVF9CVUZfU0laRSk7CisJCXItPlJNRDMgPSAweDAwMDA7CisJCXByaXYtPnJ4X3JpbmdbaV0gPSAmbGFuY2VkYXRhLT5yeF9yaW5nW2ldOworCQlwcml2LT5yeF9idWZmW2ldID0gbGFuY2VkYXRhLT5yeF9idWZmW2ldOworCQluZXRkZXZfZGJnKGRldiwgIlJYIEVudHJ5ICUyZCBhdCAlcCwgQnVmIGF0ICVwXG4iLAorCQkJICAgaSwgJmxhbmNlZGF0YS0+cnhfcmluZ1tpXSwgbGFuY2VkYXRhLT5yeF9idWZmW2ldKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXJpYWRuZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSA9IHByaXYtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgaTsKKworCS8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAgKi8KKwl3aGlsZSAoIShsb3diKHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxKSAmIFJGX09XTikpIHsKKwkJaW50IHN0YXR1cyA9IGxvd2IocHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEpOworCisJCWlmIChzdGF0dXMgIT0gKFJGX1NUUCB8IFJGX0VOUCkpIHsJLyogVGhlcmUgd2FzIGFuIGVycm9yICovCisJCQkvKiBUaGVyZSBpcyBhIHRyaWNreSBlcnJvciBub3RlZCBieQorCQkJICogSm9obiBNdXJwaHkgPG11cmZAcGVyZnRlY2guY29tPiB0byBSdXNzIE5lbHNvbjoKKwkJCSAqIEV2ZW4gd2l0aCBmdWxsLXNpemVkIGJ1ZmZlcnMgaXQncyBwb3NzaWJsZSBmb3IgYQorCQkJICogamFiYmVyIHBhY2tldCB0byB1c2UgdHdvIGJ1ZmZlcnMsIHdpdGggb25seSB0aGUKKwkJCSAqIGxhc3QgY29ycmVjdGx5IG5vdGluZyB0aGUgZXJyb3IKKwkJCSAqLworCQkJLyogT25seSBjb3VudCBhIGdlbmVyYWwgZXJyb3IgYXQgdGhlIGVuZCBvZiBhIHBhY2tldCAqLworCQkJaWYgKHN0YXR1cyAmIFJGX0VOUCkKKwkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFJGX0ZSQU0pCisJCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSRl9PRkxPKQorCQkJCWRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSRl9DUkMpCisJCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUkZfQlVGRikKKwkJCQlkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQlwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSAmPSAweGZmMDAgfCBSRl9TVFAgfCBSRl9FTlA7CisJCX0gZWxzZSB7CisJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlciwgY29tcGF0aWJsZSB3aXRoIG5ldC0zICovCisJCQlzaG9ydCBwa3RfbGVuID0gc3dhcHcocHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDMpOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQluZXRkZXZfd2FybihkZXYsICJNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldFxuIik7CisJCQkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkJCQlpZiAobG93Yihwcml2LT5yeF9yaW5nWyhlbnRyeSArIGkpICUgUlhfUklOR19TSVpFXS0+Uk1EMSkgJiBSRl9PV04pCisJCQkJCQlicmVhazsKKworCQkJCWlmIChpID4gUlhfUklOR19TSVpFIC0gMikgeworCQkJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQkJcHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEgfD0gUkZfT1dOOworCQkJCQlwcml2LT5jdXJfcngrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiAqLworCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJCShjb25zdCB2b2lkICopcHJpdi0+cnhfYnVmZltlbnRyeV0sCisJCQkJCQlwa3RfbGVuKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRkZXZfZGJnKGRldiwgIlJYIHBrdCB0eXBlIDB4JTA0eCBmcm9tICVwTSB0byAlcE0gZGF0YSAweCUwOHggbGVuICVkXG4iLAorCQkJCSAgICgodV9zaG9ydCAqKXNrYi0+ZGF0YSlbNl0sCisJCQkJICAgc2tiLT5kYXRhICsgNiwgc2tiLT5kYXRhLAorCQkJCSAgIChpbnQpc2tiLT5kYXRhLCAoaW50KXNrYi0+bGVuKTsKKworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisKKwkJcHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEgfD0gUkZfT1dOOworCQllbnRyeSA9ICgrK3ByaXYtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisJfQorCisJcHJpdi0+Y3VyX3J4ID0gcHJpdi0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCisJLyogV2Ugc2hvdWxkIGNoZWNrIHRoYXQgYXQgbGVhc3QgdHdvIHJpbmcgZW50cmllcyBhcmUgZnJlZS4KKwkgKiBJZiBub3QsIHdlIHNob3VsZCBmcmVlIG9uZSBhbmQgbWFyayBzdGF0cy0+cnhfZHJvcHBlZCsrCisJICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGFyaWFkbmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAgKilkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2OworCWludCBjc3IwLCBib2d1c2NudDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworCisJaWYgKCEobGFuY2UtPlJEUCAmIElOVFIpKQkvKiBDaGVjayBpZiBhbnkgaW50ZXJydXB0IGhhcyBiZWVuICovCisJCXJldHVybiBJUlFfTk9ORTsJLyogZ2VuZXJhdGVkIGJ5IHRoZSBib2FyZCAqLworCisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlib2d1c2NudCA9IDEwOworCXdoaWxlICgoY3NyMCA9IGxhbmNlLT5SRFApICYgKEVSUiB8IFJJTlQgfCBUSU5UKSAmJiAtLWJvZ3VzY250ID49IDApIHsKKwkJLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAgKi8KKwkJbGFuY2UtPlJEUCA9IGNzcjAgJiB+KElORUEgfCBURE1EIHwgU1RPUCB8IFNUUlQgfCBJTklUKTsKKworI2lmZGVmIERFQlVHCisJCWlmIChhcmlhZG5lX2RlYnVnID4gNSkgeworCQkJbmV0ZGV2X2RiZyhkZXYsICJpbnRlcnJ1cHQgIGNzcjA9JSMwMnggbmV3IGNzcj0lIzAyeCBbIiwKKwkJCQkgICBjc3IwLCBsYW5jZS0+UkRQKTsKKwkJCWlmIChjc3IwICYgSU5UUikKKwkJCQlwcl9jb250KCIgSU5UUiIpOworCQkJaWYgKGNzcjAgJiBJTkVBKQorCQkJCXByX2NvbnQoIiBJTkVBIik7CisJCQlpZiAoY3NyMCAmIFJYT04pCisJCQkJcHJfY29udCgiIFJYT04iKTsKKwkJCWlmIChjc3IwICYgVFhPTikKKwkJCQlwcl9jb250KCIgVFhPTiIpOworCQkJaWYgKGNzcjAgJiBURE1EKQorCQkJCXByX2NvbnQoIiBURE1EIik7CisJCQlpZiAoY3NyMCAmIFNUT1ApCisJCQkJcHJfY29udCgiIFNUT1AiKTsKKwkJCWlmIChjc3IwICYgU1RSVCkKKwkJCQlwcl9jb250KCIgU1RSVCIpOworCQkJaWYgKGNzcjAgJiBJTklUKQorCQkJCXByX2NvbnQoIiBJTklUIik7CisJCQlpZiAoY3NyMCAmIEVSUikKKwkJCQlwcl9jb250KCIgRVJSIik7CisJCQlpZiAoY3NyMCAmIEJBQkwpCisJCQkJcHJfY29udCgiIEJBQkwiKTsKKwkJCWlmIChjc3IwICYgQ0VSUikKKwkJCQlwcl9jb250KCIgQ0VSUiIpOworCQkJaWYgKGNzcjAgJiBNSVNTKQorCQkJCXByX2NvbnQoIiBNSVNTIik7CisJCQlpZiAoY3NyMCAmIE1FUlIpCisJCQkJcHJfY29udCgiIE1FUlIiKTsKKwkJCWlmIChjc3IwICYgUklOVCkKKwkJCQlwcl9jb250KCIgUklOVCIpOworCQkJaWYgKGNzcjAgJiBUSU5UKQorCQkJCXByX2NvbnQoIiBUSU5UIik7CisJCQlpZiAoY3NyMCAmIElET04pCisJCQkJcHJfY29udCgiIElET04iKTsKKwkJCXByX2NvbnQoIiBdXG4iKTsKKwkJfQorI2VuZGlmCisKKwkJaWYgKGNzcjAgJiBSSU5UKSB7CS8qIFJ4IGludGVycnVwdCAqLworCQkJaGFuZGxlZCA9IDE7CisJCQlhcmlhZG5lX3J4KGRldik7CisJCX0KKworCQlpZiAoY3NyMCAmIFRJTlQpIHsJLyogVHgtZG9uZSBpbnRlcnJ1cHQgKi8KKwkJCWludCBkaXJ0eV90eCA9IHByaXYtPmRpcnR5X3R4OworCisJCQloYW5kbGVkID0gMTsKKwkJCXdoaWxlIChkaXJ0eV90eCA8IHByaXYtPmN1cl90eCkgeworCQkJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQkJCWludCBzdGF0dXMgPSBsb3diKHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxKTsKKworCQkJCWlmIChzdGF0dXMgJiBURl9PV04pCisJCQkJCWJyZWFrOwkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkICovCisKKwkJCQlwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMSAmPSAweGZmMDA7CisKKwkJCQlpZiAoc3RhdHVzICYgVEZfRVJSKSB7CisJCQkJCS8qIFRoZXJlIHdhcyBhbiBtYWpvciBlcnJvciwgbG9nIGl0ICovCisJCQkJCWludCBlcnJfc3RhdHVzID0gcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDM7CisJCQkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJCWlmIChlcnJfc3RhdHVzICYgRUZfUlRSWSkKKwkJCQkJCWRldi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJaWYgKGVycl9zdGF0dXMgJiBFRl9MQ0FSKQorCQkJCQkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCQlpZiAoZXJyX3N0YXR1cyAmIEVGX0xDT0wpCisJCQkJCQlkZXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQkJaWYgKGVycl9zdGF0dXMgJiBFRl9VRkxPKSB7CisJCQkJCQkvKiBBY2trISAgT24gRklGTyBlcnJvcnMgdGhlIFR4IHVuaXQgaXMgdHVybmVkIG9mZiEgKi8KKwkJCQkJCWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQkJCS8qIFJlbW92ZSB0aGlzIHZlcmJvc2l0eSBsYXRlciEgKi8KKwkJCQkJCW5ldGRldl9lcnIoZGV2LCAiVHggRklGTyBlcnJvciEgU3RhdHVzICUwNHhcbiIsCisJCQkJCQkJICAgY3NyMCk7CisJCQkJCQkvKiBSZXN0YXJ0IHRoZSBjaGlwICovCisJCQkJCQlsYW5jZS0+UkRQID0gU1RSVDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChzdGF0dXMgJiAoVEZfTU9SRSB8IFRGX09ORSkpCisJCQkJCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJfQorCQkJCWRpcnR5X3R4Kys7CisJCQl9CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKHByaXYtPmN1cl90eCAtIGRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSkgeworCQkJCW5ldGRldl9lcnIoZGV2LCAib3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwgJWQgdnMuICVkLCBmdWxsPSVkXG4iLAorCQkJCQkgICBkaXJ0eV90eCwgcHJpdi0+Y3VyX3R4LAorCQkJCQkgICBwcml2LT50eF9mdWxsKTsKKwkJCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKHByaXYtPnR4X2Z1bGwgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCQkgICAgZGlydHlfdHggPiBwcml2LT5jdXJfdHggLSBUWF9SSU5HX1NJWkUgKyAyKSB7CisJCQkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwgKi8KKwkJCQlwcml2LT50eF9mdWxsID0gMDsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQl9CisKKwkJCXByaXYtPmRpcnR5X3R4ID0gZGlydHlfdHg7CisJCX0KKworCQkvKiBMb2cgbWlzYyBlcnJvcnMgKi8KKwkJaWYgKGNzcjAgJiBCQUJMKSB7CisJCQloYW5kbGVkID0gMTsKKwkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CS8qIFR4IGJhYmJsZSAqLworCQl9CisJCWlmIChjc3IwICYgTUlTUykgeworCQkJaGFuZGxlZCA9IDE7CisJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwkvKiBNaXNzZWQgYSBSeCBmcmFtZSAqLworCQl9CisJCWlmIChjc3IwICYgTUVSUikgeworCQkJaGFuZGxlZCA9IDE7CisJCQluZXRkZXZfZXJyKGRldiwgIkJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gZmFpbHVyZSwgc3RhdHVzICUwNHhcbiIsCisJCQkJICAgY3NyMCk7CisJCQkvKiBSZXN0YXJ0IHRoZSBjaGlwICovCisJCQlsYW5jZS0+UkRQID0gU1RSVDsKKwkJfQorCX0KKworCS8qIENsZWFyIGFueSBvdGhlciBpbnRlcnJ1cHQsIGFuZCBzZXQgaW50ZXJydXB0IGVuYWJsZSAqLworCWxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisJbGFuY2UtPlJEUCA9IElORUEgfCBCQUJMIHwgQ0VSUiB8IE1JU1MgfCBNRVJSIHwgSURPTjsKKworCWlmIChhcmlhZG5lX2RlYnVnID4gNCkKKwkJbmV0ZGV2X2RiZyhkZXYsICJleGl0aW5nIGludGVycnVwdCwgY3NyJWQ9JSMwNHhcbiIsCisJCQkgICBsYW5jZS0+UkFQLCBsYW5jZS0+UkRQKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW50IGFyaWFkbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwICopZGV2LT5iYXNlX2FkZHI7CisJdV9zaG9ydCBpbjsKKwl1X2xvbmcgdmVyc2lvbjsKKwlpbnQgaTsKKworCS8qIFJlc2V0IHRoZSBMQU5DRSAqLworCWluID0gbGFuY2UtPlJlc2V0OworCisJLyogU3RvcCB0aGUgTEFOQ0UgKi8KKwlsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworCWxhbmNlLT5SRFAgPSBTVE9QOworCisJLyogQ2hlY2sgdGhlIExBTkNFIHZlcnNpb24gKi8KKwlsYW5jZS0+UkFQID0gQ1NSODg7CQkvKiBDaGlwIElEICovCisJdmVyc2lvbiA9IHN3YXB3KGxhbmNlLT5SRFApOworCWxhbmNlLT5SQVAgPSBDU1I4OTsJCS8qIENoaXAgSUQgKi8KKwl2ZXJzaW9uIHw9IHN3YXB3KGxhbmNlLT5SRFApIDw8IDE2OworCWlmICgodmVyc2lvbiAmIDB4MDAwMDBmZmYpICE9IDB4MDAwMDAwMDMpIHsKKwkJcHJfd2FybigiQ291bGRuJ3QgZmluZCBBTUQgRXRoZXJuZXQgQ2hpcFxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlpZiAoKHZlcnNpb24gJiAweDBmZmZmMDAwKSAhPSAweDAwMDAzMDAwKSB7CisJCXByX3dhcm4oIkNvdWxkbid0IGZpbmQgQW03OUM5NjAgKFdyb25nIHBhcnQgbnVtYmVyID0gJWxkKVxuIiwKKwkJICAgICAgICh2ZXJzaW9uICYgMHgwZmZmZjAwMCkgPj4gMTIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwluZXRkZXZfZGJnKGRldiwgIkFtNzlDOTYwIChQQ25ldC1JU0EpIFJldmlzaW9uICVsZFxuIiwKKwkJICAgKHZlcnNpb24gJiAweGYwMDAwMDAwKSA+PiAyOCk7CisKKwlhcmlhZG5lX2luaXRfcmluZyhkZXYpOworCisJLyogTWlzY2VsbGFuZW91cyBTdHVmZiAqLworCWxhbmNlLT5SQVAgPSBDU1IzOwkJLyogSW50ZXJydXB0IE1hc2tzIGFuZCBEZWZlcnJhbCBDb250cm9sICovCisJbGFuY2UtPlJEUCA9IDB4MDAwMDsKKwlsYW5jZS0+UkFQID0gQ1NSNDsJCS8qIFRlc3QgYW5kIEZlYXR1cmVzIENvbnRyb2wgKi8KKwlsYW5jZS0+UkRQID0gRFBPTEwgfCBBUEFEX1hNVCB8IE1GQ09NIHwgUkNWQ0NPTSB8IFRYU1RSVE0gfCBKQUJNOworCisJLyogU2V0IHRoZSBNdWx0aWNhc3QgVGFibGUgKi8KKwlsYW5jZS0+UkFQID0gQ1NSODsJCS8qIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIsIExBRFJGWzE1OjBdICovCisJbGFuY2UtPlJEUCA9IDB4MDAwMDsKKwlsYW5jZS0+UkFQID0gQ1NSOTsJCS8qIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIsIExBRFJGWzMxOjE2XSAqLworCWxhbmNlLT5SRFAgPSAweDAwMDA7CisJbGFuY2UtPlJBUCA9IENTUjEwOwkJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbNDc6MzJdICovCisJbGFuY2UtPlJEUCA9IDB4MDAwMDsKKwlsYW5jZS0+UkFQID0gQ1NSMTE7CQkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRls2Mzo0OF0gKi8KKwlsYW5jZS0+UkRQID0gMHgwMDAwOworCisJLyogU2V0IHRoZSBFdGhlcm5ldCBIYXJkd2FyZSBBZGRyZXNzICovCisJbGFuY2UtPlJBUCA9IENTUjEyOwkJLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUlsxNTowXSAqLworCWxhbmNlLT5SRFAgPSAoKHVfc2hvcnQgKikmZGV2LT5kZXZfYWRkclswXSlbMF07CisJbGFuY2UtPlJBUCA9IENTUjEzOwkJLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUlszMToxNl0gKi8KKwlsYW5jZS0+UkRQID0gKCh1X3Nob3J0ICopJmRldi0+ZGV2X2FkZHJbMF0pWzFdOworCWxhbmNlLT5SQVAgPSBDU1IxNDsJCS8qIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIsIFBBRFJbNDc6MzJdICovCisJbGFuY2UtPlJEUCA9ICgodV9zaG9ydCAqKSZkZXYtPmRldl9hZGRyWzBdKVsyXTsKKworCS8qIFNldCB0aGUgSW5pdCBCbG9jayBNb2RlICovCisJbGFuY2UtPlJBUCA9IENTUjE1OwkJLyogTW9kZSBSZWdpc3RlciAqLworCWxhbmNlLT5SRFAgPSAweDAwMDA7CisKKwkvKiBTZXQgdGhlIFRyYW5zbWl0IERlc2NyaXB0b3IgUmluZyBQb2ludGVyICovCisJbGFuY2UtPlJBUCA9IENTUjMwOwkJLyogQmFzZSBBZGRyZXNzIG9mIFRyYW5zbWl0IFJpbmcgKi8KKwlsYW5jZS0+UkRQID0gc3dsb3d3KEFSSUFETkVfUkFNICsgb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgdHhfcmluZykpOworCWxhbmNlLT5SQVAgPSBDU1IzMTsJCS8qIEJhc2UgQWRkcmVzcyBvZiB0cmFuc21pdCBSaW5nICovCisJbGFuY2UtPlJEUCA9IHN3aGlnaHcoQVJJQURORV9SQU0gKyBvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCB0eF9yaW5nKSk7CisKKwkvKiBTZXQgdGhlIFJlY2VpdmUgRGVzY3JpcHRvciBSaW5nIFBvaW50ZXIgKi8KKwlsYW5jZS0+UkFQID0gQ1NSMjQ7CQkvKiBCYXNlIEFkZHJlc3Mgb2YgUmVjZWl2ZSBSaW5nICovCisJbGFuY2UtPlJEUCA9IHN3bG93dyhBUklBRE5FX1JBTSArIG9mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHJ4X3JpbmcpKTsKKwlsYW5jZS0+UkFQID0gQ1NSMjU7CQkvKiBCYXNlIEFkZHJlc3Mgb2YgUmVjZWl2ZSBSaW5nICovCisJbGFuY2UtPlJEUCA9IHN3aGlnaHcoQVJJQURORV9SQU0gKyBvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCByeF9yaW5nKSk7CisKKwkvKiBTZXQgdGhlIE51bWJlciBvZiBSWCBhbmQgVFggUmluZyBFbnRyaWVzICovCisJbGFuY2UtPlJBUCA9IENTUjc2OwkJLyogUmVjZWl2ZSBSaW5nIExlbmd0aCAqLworCWxhbmNlLT5SRFAgPSBzd2FwdygoKHVfc2hvcnQpLVJYX1JJTkdfU0laRSkpOworCWxhbmNlLT5SQVAgPSBDU1I3ODsJCS8qIFRyYW5zbWl0IFJpbmcgTGVuZ3RoICovCisJbGFuY2UtPlJEUCA9IHN3YXB3KCgodV9zaG9ydCktVFhfUklOR19TSVpFKSk7CisKKwkvKiBFbmFibGUgTWVkaWEgSW50ZXJmYWNlIFBvcnQgQXV0byBTZWxlY3QgKDEwQkFTRS0yLzEwQkFTRS1UKSAqLworCWxhbmNlLT5SQVAgPSBJU0FDU1IyOwkJLyogTWlzY2VsbGFuZW91cyBDb25maWd1cmF0aW9uICovCisJbGFuY2UtPklEUCA9IEFTRUw7CisKKwkvKiBMRUQgQ29udHJvbCAqLworCWxhbmNlLT5SQVAgPSBJU0FDU1I1OwkJLyogTEVEMSBTdGF0dXMgKi8KKwlsYW5jZS0+SURQID0gUFNFfFhNVEU7CisJbGFuY2UtPlJBUCA9IElTQUNTUjY7CS8qIExFRDIgU3RhdHVzICovCisJbGFuY2UtPklEUCA9IFBTRXxDT0xFOworCWxhbmNlLT5SQVAgPSBJU0FDU1I3OwkvKiBMRUQzIFN0YXR1cyAqLworCWxhbmNlLT5JRFAgPSBQU0V8UkNWRTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlpID0gcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhcmlhZG5lX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQlkZXYtPm5hbWUsIGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJbGFuY2UtPlJBUCA9IENTUjA7CQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKwlsYW5jZS0+UkRQID0gSU5FQSB8IFNUUlQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcmlhZG5lX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAgKilkZXYtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWxhbmNlLT5SQVAgPSBDU1IxMTI7CQkvKiBNaXNzZWQgRnJhbWUgQ291bnQgKi8KKwlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBzd2FwdyhsYW5jZS0+UkRQKTsKKwlsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworCisJaWYgKGFyaWFkbmVfZGVidWcgPiAxKSB7CisJCW5ldGRldl9kYmcoZGV2LCAiU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTAyeFxuIiwKKwkJCSAgIGxhbmNlLT5SRFApOworCQluZXRkZXZfZGJnKGRldiwgIiVsdSBwYWNrZXRzIG1pc3NlZFxuIiwKKwkJCSAgIGRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyk7CisJfQorCisJLyogV2Ugc3RvcCB0aGUgTEFOQ0UgaGVyZSAtLSBpdCBvY2Nhc2lvbmFsbHkgcG9sbHMgbWVtb3J5IGlmIHdlIGRvbid0ICovCisJbGFuY2UtPlJEUCA9IFNUT1A7CisKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyaWFkbmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCAqKWRldi0+YmFzZV9hZGRyOworCisJbGFuY2UtPlJBUCA9IENTUjA7CS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworCWxhbmNlLT5SRFAgPSBTVE9QOworCWFyaWFkbmVfaW5pdF9yaW5nKGRldik7CisJbGFuY2UtPlJEUCA9IElORUEgfCBTVFJUOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGFyaWFkbmVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwICopZGV2LT5iYXNlX2FkZHI7CisKKwluZXRkZXZfZXJyKGRldiwgInRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0dGluZ1xuIiwKKwkJICAgbGFuY2UtPlJEUCk7CisJYXJpYWRuZV9yZXNldChkZXYpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIG5ldGRldl90eF90IGFyaWFkbmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAgKilkZXYtPmJhc2VfYWRkcjsKKwlpbnQgZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisKKyNpZiAwCisJaWYgKGFyaWFkbmVfZGVidWcgPiAzKSB7CisJCWxhbmNlLT5SQVAgPSBDU1IwOwkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKwkJbmV0ZGV2X2RiZyhkZXYsICIlczogY3NyMCAlMDR4XG4iLCBfX2Z1bmNfXywgbGFuY2UtPlJEUCk7CisJCWxhbmNlLT5SRFAgPSAweDAwMDA7CisJfQorI2VuZGlmCisKKwkvKiBGSVhNRTogaXMgdGhlIDc5Qzk2MCBuZXcgZW5vdWdoIHRvIGRvIGl0cyBvd24gcGFkZGluZyByaWdodCA/ICovCisJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKKwkJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkKKwkJCXJldHVybiBORVRERVZfVFhfT0s7CisJCWxlbiA9IEVUSF9aTEVOOworCX0KKworCS8qIEZpbGwgaW4gYSBUeCByaW5nIGVudHJ5ICovCisKKwluZXRkZXZfZGJnKGRldiwgIlRYIHBrdCB0eXBlIDB4JTA0eCBmcm9tICVwTSB0byAlcE0gZGF0YSAweCUwOHggbGVuICVkXG4iLAorCQkgICAoKHVfc2hvcnQgKilza2ItPmRhdGEpWzZdLAorCQkgICBza2ItPmRhdGEgKyA2LCBza2ItPmRhdGEsCisJCSAgIChpbnQpc2tiLT5kYXRhLCAoaW50KXNrYi0+bGVuKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWVudHJ5ID0gcHJpdi0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOworCisJLyogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIGJhc2UgYWRkcmVzcyB3aXRoCisJICAgdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdCAqLworCisJcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDIgPSBzd2FwdygodV9zaG9ydCktc2tiLT5sZW4pOworCXByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQzID0gMHgwMDAwOworCW1lbWNweXcocHJpdi0+dHhfYnVmZltlbnRyeV0sICh1X3Nob3J0ICopc2tiLT5kYXRhLCBsZW4pOworCisjaWZkZWYgREVCVUcKKwlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAidHhfYnVmZjogIiwgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwKKwkJICAgICAgICh2b2lkICopcHJpdi0+dHhfYnVmZltlbnRyeV0sCisJCSAgICAgICBza2ItPmxlbiA+IDY0ID8gNjQgOiBza2ItPmxlbiwgdHJ1ZSk7CisjZW5kaWYKKworCXByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxID0gKHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxICYgMHhmZjAwKQorCQl8IFRGX09XTiB8IFRGX1NUUCB8IFRGX0VOUDsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXByaXYtPmN1cl90eCsrOworCWlmICgocHJpdi0+Y3VyX3R4ID49IFRYX1JJTkdfU0laRSkgJiYKKwkgICAgKHByaXYtPmRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSkpIHsKKworCQluZXRkZXZfZGJnKGRldiwgIioqKiBTdWJ0cmFjdGluZyBUWF9SSU5HX1NJWkUgZnJvbSBjdXJfdHggKCVkKSBhbmQgZGlydHlfdHggKCVkKVxuIiwKKwkJCSAgIHByaXYtPmN1cl90eCwgcHJpdi0+ZGlydHlfdHgpOworCisJCXByaXYtPmN1cl90eCAtPSBUWF9SSU5HX1NJWkU7CisJCXByaXYtPmRpcnR5X3R4IC09IFRYX1JJTkdfU0laRTsKKwl9CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwgKi8KKwlsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworCWxhbmNlLT5SRFAgPSBJTkVBIHwgVERNRDsKKworCWlmIChsb3diKHByaXYtPnR4X3JpbmdbKGVudHJ5ICsgMSkgJSBUWF9SSU5HX1NJWkVdLT5UTUQxKSAhPSAwKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcHJpdi0+dHhfZnVsbCA9IDE7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXJpYWRuZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCAqKWRldi0+YmFzZV9hZGRyOworCXNob3J0IHNhdmVkX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzYXZlZF9hZGRyID0gbGFuY2UtPlJBUDsKKwlsYW5jZS0+UkFQID0gQ1NSMTEyOwkJLyogTWlzc2VkIEZyYW1lIENvdW50ICovCisJZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gc3dhcHcobGFuY2UtPlJEUCk7CisJbGFuY2UtPlJBUCA9IHNhdmVkX2FkZHI7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuICZkZXYtPnN0YXRzOworfQorCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAqIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLAorICogCQkJYW5kIGRvIGJlc3QtZWZmb3J0IGZpbHRlcmluZy4KKyAqLworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAgKilkZXYtPmJhc2VfYWRkcjsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm47CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBXZSB0YWtlIHRoZSBzaW1wbGUgd2F5IG91dCBhbmQgYWx3YXlzIGVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJbGFuY2UtPlJBUCA9IENTUjA7CQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKwlsYW5jZS0+UkRQID0gU1RPUDsJCS8qIFRlbXBvcmFyaWx5IHN0b3AgdGhlIGxhbmNlICovCisJYXJpYWRuZV9pbml0X3JpbmcoZGV2KTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJbGFuY2UtPlJBUCA9IENTUjE1OwkvKiBNb2RlIFJlZ2lzdGVyICovCisJCWxhbmNlLT5SRFAgPSBQUk9NOwkvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworCX0gZWxzZSB7CisJCXNob3J0IG11bHRpY2FzdF90YWJsZVs0XTsKKwkJaW50IG51bV9hZGRycyA9IG5ldGRldl9tY19jb3VudChkZXYpOworCQlpbnQgaTsKKwkJLyogV2UgZG9uJ3QgdXNlIHRoZSBtdWx0aWNhc3QgdGFibGUsCisJCSAqIGJ1dCByZWx5IG9uIHVwcGVyLWxheWVyIGZpbHRlcmluZworCQkgKi8KKwkJbWVtc2V0KG11bHRpY2FzdF90YWJsZSwgKG51bV9hZGRycyA9PSAwKSA/IDAgOiAtMSwKKwkJICAgICAgIHNpemVvZihtdWx0aWNhc3RfdGFibGUpKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJbGFuY2UtPlJBUCA9IENTUjggKyAoaSA8PCA4KTsKKwkJCQkJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciAqLworCQkJbGFuY2UtPlJEUCA9IHN3YXB3KG11bHRpY2FzdF90YWJsZVtpXSk7CisJCX0KKwkJbGFuY2UtPlJBUCA9IENTUjE1OwkvKiBNb2RlIFJlZ2lzdGVyICovCisJCWxhbmNlLT5SRFAgPSAweDAwMDA7CS8qIFVuc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKwl9CisKKwlsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworCWxhbmNlLT5SRFAgPSBJTkVBIHwgU1RSVCB8IElET047LyogUmVzdW1lIG5vcm1hbCBvcGVyYXRpb24gKi8KKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIH0KIAogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBhcmlhZG5lX2luaXRfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnosCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IHpvcnJvX2RldmljZV9pZCAqZW50KTsKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhcmlhZG5lX3JlbW92ZV9vbmUoc3RydWN0IHpvcnJvX2RldiAqeik7CitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXJpYWRuZV9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHpvcnJvX2dldF9kcnZkYXRhKHopOwogCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX21lbV9yZWdpb24oWlRXT19QQUREUihkZXYtPmJhc2VfYWRkciksIHNpemVvZihzdHJ1Y3QgQW03OUM5NjApKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oWlRXT19QQUREUihkZXYtPm1lbV9zdGFydCksIEFSSUFETkVfUkFNX1NJWkUpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CiAKIHN0YXRpYyBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkIGFyaWFkbmVfem9ycm9fdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKLSAgICB7IFpPUlJPX1BST0RfVklMTEFHRV9UUk9OSUNfQVJJQURORSB9LAotICAgIHsgMCB9CisJeyBaT1JST19QUk9EX1ZJTExBR0VfVFJPTklDX0FSSUFETkUgfSwKKwl7IDAgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoem9ycm8sIGFyaWFkbmVfem9ycm9fdGJsKTsKIAotc3RhdGljIHN0cnVjdCB6b3Jyb19kcml2ZXIgYXJpYWRuZV9kcml2ZXIgPSB7Ci0gICAgLm5hbWUJPSAiYXJpYWRuZSIsCi0gICAgLmlkX3RhYmxlCT0gYXJpYWRuZV96b3Jyb190YmwsCi0gICAgLnByb2JlCT0gYXJpYWRuZV9pbml0X29uZSwKLSAgICAucmVtb3ZlCT0gX19kZXZleGl0X3AoYXJpYWRuZV9yZW1vdmVfb25lKSwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYXJpYWRuZV9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbgkJPSBhcmlhZG5lX29wZW4sCiAJLm5kb19zdG9wCQk9IGFyaWFkbmVfY2xvc2UsCkBAIC0xNjksNjg3ICs3MTMsNzggQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFyaWFkbmVfaW5pdF9vbmUoc3RydWN0IHpvcnJvX2RldiAqeiwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpCiB7Ci0gICAgdW5zaWduZWQgbG9uZyBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OwotICAgIHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyID0gYm9hcmQrQVJJQURORV9MQU5DRTsKLSAgICB1bnNpZ25lZCBsb25nIG1lbV9zdGFydCA9IGJvYXJkK0FSSUFETkVfUkFNOwotICAgIHN0cnVjdCByZXNvdXJjZSAqcjEsICpyMjsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXY7Ci0gICAgaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHIgPSBib2FyZCArIEFSSUFETkVfTEFOQ0U7CisJdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQgPSBib2FyZCArIEFSSUFETkVfUkFNOworCXN0cnVjdCByZXNvdXJjZSAqcjEsICpyMjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXY7CisJaW50IGVycjsKIAotICAgIHIxID0gcmVxdWVzdF9tZW1fcmVnaW9uKGJhc2VfYWRkciwgc2l6ZW9mKHN0cnVjdCBBbTc5Qzk2MCksICJBbTc5Qzk2MCIpOwotICAgIGlmICghcjEpCi0JcmV0dXJuIC1FQlVTWTsKLSAgICByMiA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIEFSSUFETkVfUkFNX1NJWkUsICJSQU0iKTsKLSAgICBpZiAoIXIyKSB7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGJhc2VfYWRkciwgc2l6ZW9mKHN0cnVjdCBBbTc5Qzk2MCkpOwotCXJldHVybiAtRUJVU1k7Ci0gICAgfQotCi0gICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUpKTsKLSAgICBpZiAoZGV2ID09IE5VTEwpIHsKLQlyZWxlYXNlX21lbV9yZWdpb24oYmFzZV9hZGRyLCBzaXplb2Yoc3RydWN0IEFtNzlDOTYwKSk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1lbV9zdGFydCwgQVJJQURORV9SQU1fU0laRSk7Ci0JcmV0dXJuIC1FTk9NRU07Ci0gICAgfQotCi0gICAgcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KLSAgICByMS0+bmFtZSA9IGRldi0+bmFtZTsKLSAgICByMi0+bmFtZSA9IGRldi0+bmFtZTsKLQotICAgIGRldi0+ZGV2X2FkZHJbMF0gPSAweDAwOwotICAgIGRldi0+ZGV2X2FkZHJbMV0gPSAweDYwOwotICAgIGRldi0+ZGV2X2FkZHJbMl0gPSAweDMwOwotICAgIGRldi0+ZGV2X2FkZHJbM10gPSAoei0+cm9tLmVyX1NlcmlhbE51bWJlcj4+MTYpICYgMHhmZjsKLSAgICBkZXYtPmRldl9hZGRyWzRdID0gKHotPnJvbS5lcl9TZXJpYWxOdW1iZXI+PjgpICYgMHhmZjsKLSAgICBkZXYtPmRldl9hZGRyWzVdID0gei0+cm9tLmVyX1NlcmlhbE51bWJlciAmIDB4ZmY7Ci0gICAgZGV2LT5iYXNlX2FkZHIgPSBaVFdPX1ZBRERSKGJhc2VfYWRkcik7Ci0gICAgZGV2LT5tZW1fc3RhcnQgPSBaVFdPX1ZBRERSKG1lbV9zdGFydCk7Ci0gICAgZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQrQVJJQURORV9SQU1fU0laRTsKLQotICAgIGRldi0+bmV0ZGV2X29wcyA9ICZhcmlhZG5lX25ldGRldl9vcHM7Ci0gICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7Ci0KLSAgICBlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLSAgICBpZiAoZXJyKSB7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGJhc2VfYWRkciwgc2l6ZW9mKHN0cnVjdCBBbTc5Qzk2MCkpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIEFSSUFETkVfUkFNX1NJWkUpOwotCWZyZWVfbmV0ZGV2KGRldik7Ci0JcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgem9ycm9fc2V0X2RydmRhdGEoeiwgZGV2KTsKLQotICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBBcmlhZG5lIGF0IDB4JTA4bHgsIEV0aGVybmV0IEFkZHJlc3MgJXBNXG4iLAotICAgICAgICAgICBkZXYtPm5hbWUsIGJvYXJkLCBkZXYtPmRldl9hZGRyKTsKLQotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgYXJpYWRuZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0gICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOwotICAgIHVfc2hvcnQgaW47Ci0gICAgdV9sb25nIHZlcnNpb247Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBSZXNldCB0aGUgTEFOQ0UgKi8KLSAgICBpbiA9IGxhbmNlLT5SZXNldDsKLQotICAgIC8qIFN0b3AgdGhlIExBTkNFICovCi0gICAgbGFuY2UtPlJBUCA9IENTUjA7CQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KLSAgICBsYW5jZS0+UkRQID0gU1RPUDsKLQotICAgIC8qIENoZWNrIHRoZSBMQU5DRSB2ZXJzaW9uICovCi0gICAgbGFuY2UtPlJBUCA9IENTUjg4OwkJLyogQ2hpcCBJRCAqLwotICAgIHZlcnNpb24gPSBzd2FwdyhsYW5jZS0+UkRQKTsKLSAgICBsYW5jZS0+UkFQID0gQ1NSODk7CQkvKiBDaGlwIElEICovCi0gICAgdmVyc2lvbiB8PSBzd2FwdyhsYW5jZS0+UkRQKTw8MTY7Ci0gICAgaWYgKCh2ZXJzaW9uICYgMHgwMDAwMGZmZikgIT0gMHgwMDAwMDAwMykgewotCXByaW50ayhLRVJOX1dBUk5JTkcgImFyaWFkbmVfb3BlbjogQ291bGRuJ3QgZmluZCBBTUQgRXRoZXJuZXQgQ2hpcFxuIik7Ci0JcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotICAgIGlmICgodmVyc2lvbiAmIDB4MGZmZmYwMDApICE9IDB4MDAwMDMwMDApIHsKLQlwcmludGsoS0VSTl9XQVJOSU5HICJhcmlhZG5lX29wZW46IENvdWxkbid0IGZpbmQgQW03OUM5NjAgKFdyb25nIHBhcnQgIgotCSAgICAgICAibnVtYmVyID0gJWxkKVxuIiwgKHZlcnNpb24gJiAweDBmZmZmMDAwKT4+MTIpOwotCXJldHVybiAtRUFHQUlOOwotICAgIH0KLSNpZiAwCi0gICAgcHJpbnRrKEtFUk5fREVCVUcgImFyaWFkbmVfb3BlbjogQW03OUM5NjAgKFBDbmV0LUlTQSkgUmV2aXNpb24gJWxkXG4iLAotCSAgICh2ZXJzaW9uICYgMHhmMDAwMDAwMCk+PjI4KTsKLSNlbmRpZgotCi0gICAgYXJpYWRuZV9pbml0X3JpbmcoZGV2KTsKLQotICAgIC8qIE1pc2NlbGxhbmVvdXMgU3R1ZmYgKi8KLSAgICBsYW5jZS0+UkFQID0gQ1NSMzsJCS8qIEludGVycnVwdCBNYXNrcyBhbmQgRGVmZXJyYWwgQ29udHJvbCAqLwotICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7Ci0gICAgbGFuY2UtPlJBUCA9IENTUjQ7CQkvKiBUZXN0IGFuZCBGZWF0dXJlcyBDb250cm9sICovCi0gICAgbGFuY2UtPlJEUCA9IERQT0xMfEFQQURfWE1UfE1GQ09NfFJDVkNDT018VFhTVFJUTXxKQUJNOwotCi0gICAgLyogU2V0IHRoZSBNdWx0aWNhc3QgVGFibGUgKi8KLSAgICBsYW5jZS0+UkFQID0gQ1NSODsJCS8qIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIsIExBRFJGWzE1OjBdICovCi0gICAgbGFuY2UtPlJEUCA9IDB4MDAwMDsKLSAgICBsYW5jZS0+UkFQID0gQ1NSOTsJCS8qIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIsIExBRFJGWzMxOjE2XSAqLwotICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7Ci0gICAgbGFuY2UtPlJBUCA9IENTUjEwOwkJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbNDc6MzJdICovCi0gICAgbGFuY2UtPlJEUCA9IDB4MDAwMDsKLSAgICBsYW5jZS0+UkFQID0gQ1NSMTE7CQkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRls2Mzo0OF0gKi8KLSAgICBsYW5jZS0+UkRQID0gMHgwMDAwOwotCi0gICAgLyogU2V0IHRoZSBFdGhlcm5ldCBIYXJkd2FyZSBBZGRyZXNzICovCi0gICAgbGFuY2UtPlJBUCA9IENTUjEyOwkJLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUlsxNTowXSAqLwotICAgIGxhbmNlLT5SRFAgPSAoKHVfc2hvcnQgKikmZGV2LT5kZXZfYWRkclswXSlbMF07Ci0gICAgbGFuY2UtPlJBUCA9IENTUjEzOwkJLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUlszMToxNl0gKi8KLSAgICBsYW5jZS0+UkRQID0gKCh1X3Nob3J0ICopJmRldi0+ZGV2X2FkZHJbMF0pWzFdOwotICAgIGxhbmNlLT5SQVAgPSBDU1IxNDsJCS8qIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIsIFBBRFJbNDc6MzJdICovCi0gICAgbGFuY2UtPlJEUCA9ICgodV9zaG9ydCAqKSZkZXYtPmRldl9hZGRyWzBdKVsyXTsKLQotICAgIC8qIFNldCB0aGUgSW5pdCBCbG9jayBNb2RlICovCi0gICAgbGFuY2UtPlJBUCA9IENTUjE1OwkJLyogTW9kZSBSZWdpc3RlciAqLwotICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7Ci0KLSAgICAvKiBTZXQgdGhlIFRyYW5zbWl0IERlc2NyaXB0b3IgUmluZyBQb2ludGVyICovCi0gICAgbGFuY2UtPlJBUCA9IENTUjMwOwkJLyogQmFzZSBBZGRyZXNzIG9mIFRyYW5zbWl0IFJpbmcgKi8KLSAgICBsYW5jZS0+UkRQID0gc3dsb3d3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHR4X3JpbmcpKTsKLSAgICBsYW5jZS0+UkFQID0gQ1NSMzE7CQkvKiBCYXNlIEFkZHJlc3Mgb2YgdHJhbnNtaXQgUmluZyAqLwotICAgIGxhbmNlLT5SRFAgPSBzd2hpZ2h3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHR4X3JpbmcpKTsKLQotICAgIC8qIFNldCB0aGUgUmVjZWl2ZSBEZXNjcmlwdG9yIFJpbmcgUG9pbnRlciAqLwotICAgIGxhbmNlLT5SQVAgPSBDU1IyNDsJCS8qIEJhc2UgQWRkcmVzcyBvZiBSZWNlaXZlIFJpbmcgKi8KLSAgICBsYW5jZS0+UkRQID0gc3dsb3d3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHJ4X3JpbmcpKTsKLSAgICBsYW5jZS0+UkFQID0gQ1NSMjU7CQkvKiBCYXNlIEFkZHJlc3Mgb2YgUmVjZWl2ZSBSaW5nICovCi0gICAgbGFuY2UtPlJEUCA9IHN3aGlnaHcoQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgcnhfcmluZykpOwotCi0gICAgLyogU2V0IHRoZSBOdW1iZXIgb2YgUlggYW5kIFRYIFJpbmcgRW50cmllcyAqLwotICAgIGxhbmNlLT5SQVAgPSBDU1I3NjsJCS8qIFJlY2VpdmUgUmluZyBMZW5ndGggKi8KLSAgICBsYW5jZS0+UkRQID0gc3dhcHcoKCh1X3Nob3J0KS1SWF9SSU5HX1NJWkUpKTsKLSAgICBsYW5jZS0+UkFQID0gQ1NSNzg7CQkvKiBUcmFuc21pdCBSaW5nIExlbmd0aCAqLwotICAgIGxhbmNlLT5SRFAgPSBzd2FwdygoKHVfc2hvcnQpLVRYX1JJTkdfU0laRSkpOwotCi0gICAgLyogRW5hYmxlIE1lZGlhIEludGVyZmFjZSBQb3J0IEF1dG8gU2VsZWN0ICgxMEJBU0UtMi8xMEJBU0UtVCkgKi8KLSAgICBsYW5jZS0+UkFQID0gSVNBQ1NSMjsJLyogTWlzY2VsbGFuZW91cyBDb25maWd1cmF0aW9uICovCi0gICAgbGFuY2UtPklEUCA9IEFTRUw7Ci0KLSAgICAvKiBMRUQgQ29udHJvbCAqLwotICAgIGxhbmNlLT5SQVAgPSBJU0FDU1I1OwkvKiBMRUQxIFN0YXR1cyAqLwotICAgIGxhbmNlLT5JRFAgPSBQU0V8WE1URTsKLSAgICBsYW5jZS0+UkFQID0gSVNBQ1NSNjsJLyogTEVEMiBTdGF0dXMgKi8KLSAgICBsYW5jZS0+SURQID0gUFNFfENPTEU7Ci0gICAgbGFuY2UtPlJBUCA9IElTQUNTUjc7CS8qIExFRDMgU3RhdHVzICovCi0gICAgbGFuY2UtPklEUCA9IFBTRXxSQ1ZFOwotCi0gICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKLQotICAgIGkgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGFyaWFkbmVfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLSAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBkZXYpOwotICAgIGlmIChpKSByZXR1cm4gaTsKLQotICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCi0gICAgbGFuY2UtPlJEUCA9IElORUF8U1RSVDsKLQotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIGFyaWFkbmVfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0gICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlZGF0YSAqbGFuY2VkYXRhID0gKHN0cnVjdCBsYW5jZWRhdGEgKilkZXYtPm1lbV9zdGFydDsKLSAgICBpbnQgaTsKLQotICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQotICAgIHByaXYtPnR4X2Z1bGwgPSAwOwotICAgIHByaXYtPmN1cl9yeCA9IHByaXYtPmN1cl90eCA9IDA7Ci0gICAgcHJpdi0+ZGlydHlfdHggPSAwOwotCi0gICAgLyogU2V0IHVwIFRYIFJpbmcgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgVERSRSAqdCA9ICZsYW5jZWRhdGEtPnR4X3JpbmdbaV07Ci0JdC0+VE1EMCA9IHN3bG93dyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCB0eF9idWZmW2ldKSk7Ci0JdC0+VE1EMSA9IHN3aGlnaHcoQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgdHhfYnVmZltpXSkpIHwKLQkJICBURl9TVFAgfCBURl9FTlA7Ci0JdC0+VE1EMiA9IHN3YXB3KCh1X3Nob3J0KS1QS1RfQlVGX1NJWkUpOwotCXQtPlRNRDMgPSAwOwotCXByaXYtPnR4X3JpbmdbaV0gPSAmbGFuY2VkYXRhLT50eF9yaW5nW2ldOwotCXByaXYtPnR4X2J1ZmZbaV0gPSBsYW5jZWRhdGEtPnR4X2J1ZmZbaV07Ci0jaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJUWCBFbnRyeSAlMmQgYXQgJXAsIEJ1ZiBhdCAlcFxuIiwgaSwKLQkgICAgICAgJmxhbmNlZGF0YS0+dHhfcmluZ1tpXSwgbGFuY2VkYXRhLT50eF9idWZmW2ldKTsKLSNlbmRpZgotICAgIH0KLQotICAgIC8qIFNldCB1cCBSWCBSaW5nICovCi0gICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7Ci0Jdm9sYXRpbGUgc3RydWN0IFJEUkUgKnIgPSAmbGFuY2VkYXRhLT5yeF9yaW5nW2ldOwotCXItPlJNRDAgPSBzd2xvd3coQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgcnhfYnVmZltpXSkpOwotCXItPlJNRDEgPSBzd2hpZ2h3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHJ4X2J1ZmZbaV0pKSB8Ci0JCSAgUkZfT1dOOwotCXItPlJNRDIgPSBzd2FwdygodV9zaG9ydCktUEtUX0JVRl9TSVpFKTsKLQlyLT5STUQzID0gMHgwMDAwOwotCXByaXYtPnJ4X3JpbmdbaV0gPSAmbGFuY2VkYXRhLT5yeF9yaW5nW2ldOwotCXByaXYtPnJ4X2J1ZmZbaV0gPSBsYW5jZWRhdGEtPnJ4X2J1ZmZbaV07Ci0jaWYgMAotCXByaW50ayhLRVJOX0RFQlVHICJSWCBFbnRyeSAlMmQgYXQgJXAsIEJ1ZiBhdCAlcFxuIiwgaSwKLQkgICAgICAgJmxhbmNlZGF0YS0+cnhfcmluZ1tpXSwgbGFuY2VkYXRhLT5yeF9idWZmW2ldKTsKLSNlbmRpZgotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50IGFyaWFkbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7Ci0KLSAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0KLSAgICBsYW5jZS0+UkFQID0gQ1NSMTEyOwkvKiBNaXNzZWQgRnJhbWUgQ291bnQgKi8KLSAgICBkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBzd2FwdyhsYW5jZS0+UkRQKTsKLSAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwotCi0gICAgaWYgKGFyaWFkbmVfZGVidWcgPiAxKSB7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlMi4yeC5cbiIsCi0JICAgICAgIGRldi0+bmFtZSwgbGFuY2UtPlJEUCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlbHUgcGFja2V0cyBtaXNzZWRcbiIsIGRldi0+bmFtZSwKLQkgICAgICAgZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKTsKLSAgICB9Ci0KLSAgICAvKiBXZSBzdG9wIHRoZSBMQU5DRSBoZXJlIC0tIGl0IG9jY2FzaW9uYWxseSBwb2xscyBtZW1vcnkgaWYgd2UgZG9uJ3QuICovCi0gICAgbGFuY2UtPlJEUCA9IFNUT1A7Ci0KLSAgICBmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJpYWRuZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKLQotICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KLSAgICBsYW5jZS0+UkRQID0gU1RPUDsKLSAgICBhcmlhZG5lX2luaXRfcmluZyhkZXYpOwotICAgIGxhbmNlLT5SRFAgPSBJTkVBfFNUUlQ7Ci0gICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKLX0KLQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYXJpYWRuZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKLSAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7Ci0gICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdjsKLSAgICBpbnQgY3NyMCwgYm9ndXNjbnQ7Ci0gICAgaW50IGhhbmRsZWQgPSAwOwotCi0gICAgbGFuY2UtPlJBUCA9IENTUjA7CQkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCi0KLSAgICBpZiAoIShsYW5jZS0+UkRQICYgSU5UUikpCQkvKiBDaGVjayBpZiBhbnkgaW50ZXJydXB0IGhhcyBiZWVuICovCi0JcmV0dXJuIElSUV9OT05FOwkJLyogZ2VuZXJhdGVkIGJ5IHRoZSBib2FyZC4gKi8KLQotICAgIHByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0gICAgYm9ndXNjbnQgPSAxMDsKLSAgICB3aGlsZSAoKGNzcjAgPSBsYW5jZS0+UkRQKSAmIChFUlJ8UklOVHxUSU5UKSAmJiAtLWJvZ3VzY250ID49IDApIHsKLQkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KLQlsYW5jZS0+UkRQID0gY3NyMCAmIH4oSU5FQXxURE1EfFNUT1B8U1RSVHxJTklUKTsKLQotI2lmIDAKLQlpZiAoYXJpYWRuZV9kZWJ1ZyA+IDUpIHsKLQkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgIGNzcjA9JSMyLjJ4IG5ldyBjc3I9JSMyLjJ4LiIsCi0JCSAgIGRldi0+bmFtZSwgY3NyMCwgbGFuY2UtPlJEUCk7Ci0JICAgIHByaW50aygiWyIpOwotCSAgICBpZiAoY3NyMCAmIElOVFIpCi0JCXByaW50aygiIElOVFIiKTsKLQkgICAgaWYgKGNzcjAgJiBJTkVBKQotCQlwcmludGsoIiBJTkVBIik7Ci0JICAgIGlmIChjc3IwICYgUlhPTikKLQkJcHJpbnRrKCIgUlhPTiIpOwotCSAgICBpZiAoY3NyMCAmIFRYT04pCi0JCXByaW50aygiIFRYT04iKTsKLQkgICAgaWYgKGNzcjAgJiBURE1EKQotCQlwcmludGsoIiBURE1EIik7Ci0JICAgIGlmIChjc3IwICYgU1RPUCkKLQkJcHJpbnRrKCIgU1RPUCIpOwotCSAgICBpZiAoY3NyMCAmIFNUUlQpCi0JCXByaW50aygiIFNUUlQiKTsKLQkgICAgaWYgKGNzcjAgJiBJTklUKQotCQlwcmludGsoIiBJTklUIik7Ci0JICAgIGlmIChjc3IwICYgRVJSKQotCQlwcmludGsoIiBFUlIiKTsKLQkgICAgaWYgKGNzcjAgJiBCQUJMKQotCQlwcmludGsoIiBCQUJMIik7Ci0JICAgIGlmIChjc3IwICYgQ0VSUikKLQkJcHJpbnRrKCIgQ0VSUiIpOwotCSAgICBpZiAoY3NyMCAmIE1JU1MpCi0JCXByaW50aygiIE1JU1MiKTsKLQkgICAgaWYgKGNzcjAgJiBNRVJSKQotCQlwcmludGsoIiBNRVJSIik7Ci0JICAgIGlmIChjc3IwICYgUklOVCkKLQkJcHJpbnRrKCIgUklOVCIpOwotCSAgICBpZiAoY3NyMCAmIFRJTlQpCi0JCXByaW50aygiIFRJTlQiKTsKLQkgICAgaWYgKGNzcjAgJiBJRE9OKQotCQlwcmludGsoIiBJRE9OIik7Ci0JICAgIHByaW50aygiIF1cbiIpOwotCX0KLSNlbmRpZgotCi0JaWYgKGNzcjAgJiBSSU5UKSB7CS8qIFJ4IGludGVycnVwdCAqLwotCSAgICBoYW5kbGVkID0gMTsKLQkgICAgYXJpYWRuZV9yeChkZXYpOworCXIxID0gcmVxdWVzdF9tZW1fcmVnaW9uKGJhc2VfYWRkciwgc2l6ZW9mKHN0cnVjdCBBbTc5Qzk2MCksICJBbTc5Qzk2MCIpOworCWlmICghcjEpCisJCXJldHVybiAtRUJVU1k7CisJcjIgPSByZXF1ZXN0X21lbV9yZWdpb24obWVtX3N0YXJ0LCBBUklBRE5FX1JBTV9TSVpFLCAiUkFNIik7CisJaWYgKCFyMikgeworCQlyZWxlYXNlX21lbV9yZWdpb24oYmFzZV9hZGRyLCBzaXplb2Yoc3RydWN0IEFtNzlDOTYwKSk7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JaWYgKGNzcjAgJiBUSU5UKSB7CS8qIFR4LWRvbmUgaW50ZXJydXB0ICovCi0JICAgIGludCBkaXJ0eV90eCA9IHByaXYtPmRpcnR5X3R4OwotCi0JICAgIGhhbmRsZWQgPSAxOwotCSAgICB3aGlsZSAoZGlydHlfdHggPCBwcml2LT5jdXJfdHgpIHsKLQkJaW50IGVudHJ5ID0gZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7Ci0JCWludCBzdGF0dXMgPSBsb3diKHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxKTsKLQotCQlpZiAoc3RhdHVzICYgVEZfT1dOKQotCQkgICAgYnJlYWs7CS8qIEl0IHN0aWxsIGhhc24ndCBiZWVuIFR4ZWQgKi8KLQotCQlwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMSAmPSAweGZmMDA7Ci0KLQkJaWYgKHN0YXR1cyAmIFRGX0VSUikgewotCQkgICAgLyogVGhlcmUgd2FzIGFuIG1ham9yIGVycm9yLCBsb2cgaXQuICovCi0JCSAgICBpbnQgZXJyX3N0YXR1cyA9IHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQzOwotCQkgICAgZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKLQkJICAgIGlmIChlcnJfc3RhdHVzICYgRUZfUlRSWSkKLQkJCWRldi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKLQkJICAgIGlmIChlcnJfc3RhdHVzICYgRUZfTENBUikKLQkJCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKLQkJICAgIGlmIChlcnJfc3RhdHVzICYgRUZfTENPTCkKLQkJCWRldi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOwotCQkgICAgaWYgKGVycl9zdGF0dXMgJiBFRl9VRkxPKSB7Ci0JCQkvKiBBY2trISAgT24gRklGTyBlcnJvcnMgdGhlIFR4IHVuaXQgaXMgdHVybmVkIG9mZiEgKi8KLQkJCWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKLQkJCS8qIFJlbW92ZSB0aGlzIHZlcmJvc2l0eSBsYXRlciEgKi8KLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFR4IEZJRk8gZXJyb3IhIFN0YXR1cyAlNC40eC5cbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBjc3IwKTsKLQkJCS8qIFJlc3RhcnQgdGhlIGNoaXAuICovCi0JCQlsYW5jZS0+UkRQID0gU1RSVDsKLQkJICAgIH0KLQkJfSBlbHNlIHsKLQkJICAgIGlmIChzdGF0dXMgJiAoVEZfTU9SRXxURl9PTkUpKQotCQkJZGV2LT5zdGF0cy5jb2xsaXNpb25zKys7Ci0JCSAgICBkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJfQotCQlkaXJ0eV90eCsrOwotCSAgICB9Ci0KLSNpZm5kZWYgZmluYWxfdmVyc2lvbgotCSAgICBpZiAocHJpdi0+Y3VyX3R4IC0gZGlydHlfdHggPj0gVFhfUklOR19TSVpFKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAib3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwgJWQgdnMuICVkLCAiCi0JCSAgICAgICAiZnVsbD0lZC5cbiIsIGRpcnR5X3R4LCBwcml2LT5jdXJfdHgsIHByaXYtPnR4X2Z1bGwpOwotCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7Ci0JICAgIH0KLSNlbmRpZgotCi0JICAgIGlmIChwcml2LT50eF9mdWxsICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgotCQlkaXJ0eV90eCA+IHByaXYtPmN1cl90eCAtIFRYX1JJTkdfU0laRSArIDIpIHsKLQkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwuICovCi0JCXByaXYtPnR4X2Z1bGwgPSAwOwotCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci0JICAgIH0KLQotCSAgICBwcml2LT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlKSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihiYXNlX2FkZHIsIHNpemVvZihzdHJ1Y3QgQW03OUM5NjApKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbV9zdGFydCwgQVJJQURORV9SQU1fU0laRSk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCS8qIExvZyBtaXNjIGVycm9ycy4gKi8KLQlpZiAoY3NyMCAmIEJBQkwpIHsKLQkgICAgaGFuZGxlZCA9IDE7Ci0JICAgIGRldi0+c3RhdHMudHhfZXJyb3JzKys7CS8qIFR4IGJhYmJsZS4gKi8KKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXIxLT5uYW1lID0gZGV2LT5uYW1lOworCXIyLT5uYW1lID0gZGV2LT5uYW1lOworCisJZGV2LT5kZXZfYWRkclswXSA9IDB4MDA7CisJZGV2LT5kZXZfYWRkclsxXSA9IDB4NjA7CisJZGV2LT5kZXZfYWRkclsyXSA9IDB4MzA7CisJZGV2LT5kZXZfYWRkclszXSA9ICh6LT5yb20uZXJfU2VyaWFsTnVtYmVyID4+IDE2KSAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkcls0XSA9ICh6LT5yb20uZXJfU2VyaWFsTnVtYmVyID4+IDgpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzVdID0gei0+cm9tLmVyX1NlcmlhbE51bWJlciAmIDB4ZmY7CisJZGV2LT5iYXNlX2FkZHIgPSBaVFdPX1ZBRERSKGJhc2VfYWRkcik7CisJZGV2LT5tZW1fc3RhcnQgPSBaVFdPX1ZBRERSKG1lbV9zdGFydCk7CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyBBUklBRE5FX1JBTV9TSVpFOworCisJZGV2LT5uZXRkZXZfb3BzID0gJmFyaWFkbmVfbmV0ZGV2X29wczsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSAqIEhaOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlyZWxlYXNlX21lbV9yZWdpb24oYmFzZV9hZGRyLCBzaXplb2Yoc3RydWN0IEFtNzlDOTYwKSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIEFSSUFETkVfUkFNX1NJWkUpOworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gZXJyOwogCX0KLQlpZiAoY3NyMCAmIE1JU1MpIHsKLQkgICAgaGFuZGxlZCA9IDE7Ci0JICAgIGRldi0+c3RhdHMucnhfZXJyb3JzKys7CS8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLwotCX0KLQlpZiAoY3NyMCAmIE1FUlIpIHsKLQkgICAgaGFuZGxlZCA9IDE7Ci0JICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IEJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gZmFpbHVyZSwgc3RhdHVzICIKLQkJICAgIiU0LjR4LlxuIiwgZGV2LT5uYW1lLCBjc3IwKTsKLQkgICAgLyogUmVzdGFydCB0aGUgY2hpcC4gKi8KLQkgICAgbGFuY2UtPlJEUCA9IFNUUlQ7Ci0JfQotICAgIH0KKwl6b3Jyb19zZXRfZHJ2ZGF0YSh6LCBkZXYpOwogCi0gICAgLyogQ2xlYXIgYW55IG90aGVyIGludGVycnVwdCwgYW5kIHNldCBpbnRlcnJ1cHQgZW5hYmxlLiAqLwotICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCi0gICAgbGFuY2UtPlJEUCA9IElORUF8QkFCTHxDRVJSfE1JU1N8TUVSUnxJRE9OOworCW5ldGRldl9pbmZvKGRldiwgIkFyaWFkbmUgYXQgMHglMDhseCwgRXRoZXJuZXQgQWRkcmVzcyAlcE1cbiIsCisJCSAgICBib2FyZCwgZGV2LT5kZXZfYWRkcik7CiAKLSNpZiAwCi0gICAgaWYgKGFyaWFkbmVfZGVidWcgPiA0KQotCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIGNzciVkPSUjNC40eC5cbiIsIGRldi0+bmFtZSwKLQkgICAgICAgbGFuY2UtPlJBUCwgbGFuY2UtPlJEUCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKKwlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBhcmlhZG5lX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7Ci0KLSAgICBwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlNC40eCwgcmVzZXR0aW5nLlxuIiwKLQkgICBkZXYtPm5hbWUsIGxhbmNlLT5SRFApOwotICAgIGFyaWFkbmVfcmVzZXQoZGV2KTsKLSAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Ci19Ci0KLQotc3RhdGljIG5ldGRldl90eF90IGFyaWFkbmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0gICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOwotICAgIGludCBlbnRyeTsKLSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgIGludCBsZW4gPSBza2ItPmxlbjsKLQotI2lmIDAKLSAgICBpZiAoYXJpYWRuZV9kZWJ1ZyA+IDMpIHsKLQlsYW5jZS0+UkFQID0gQ1NSMDsJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBhcmlhZG5lX3N0YXJ0X3htaXQoKSBjYWxsZWQsIGNzcjAgJTQuNHguXG4iLAotCSAgICAgICBkZXYtPm5hbWUsIGxhbmNlLT5SRFApOwotCWxhbmNlLT5SRFAgPSAweDAwMDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBGSVhNRTogaXMgdGhlIDc5Qzk2MCBuZXcgZW5vdWdoIHRvIGRvIGl0cyBvd24gcGFkZGluZyByaWdodCA/ICovCi0gICAgaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pCi0gICAgewotICAgIAlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQotICAgIAkgICAgcmV0dXJuIE5FVERFVl9UWF9PSzsKLSAgICAJbGVuID0gRVRIX1pMRU47Ci0gICAgfQotCi0gICAgLyogRmlsbCBpbiBhIFR4IHJpbmcgZW50cnkgKi8KLQotI2lmIDAKLXsKLSAgICBwcmludGsoS0VSTl9ERUJVRyAiVFggcGt0IHR5cGUgMHglMDR4IGZyb20gJXBNIHRvICVwTSAiCi0JICAgIiBkYXRhIDB4JTA4eCBsZW4gJWRcbiIsCi0JICAgKCh1X3Nob3J0ICopc2tiLT5kYXRhKVs2XSwKLQkgICBza2ItPmRhdGEgKyA2LCBza2ItPmRhdGEsCi0JICAgKGludClza2ItPmRhdGEsIChpbnQpc2tiLT5sZW4pOwotfQotI2VuZGlmCi0KLSAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLSAgICBlbnRyeSA9IHByaXYtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKLQotICAgIC8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSBiYXNlIGFkZHJlc3Mgd2l0aAotCQl0aGUgIm93bmVyc2hpcCIgYml0cyBsYXN0LiAqLwotCi0gICAgcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDIgPSBzd2FwdygodV9zaG9ydCktc2tiLT5sZW4pOwotICAgIHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQzID0gMHgwMDAwOwotICAgIG1lbWNweXcocHJpdi0+dHhfYnVmZltlbnRyeV0sICh1X3Nob3J0ICopc2tiLT5kYXRhLCBsZW4pOwotCi0jaWYgMAotICAgIHsKLQlpbnQgaSwgbGVuOwotCi0JbGVuID0gc2tiLT5sZW4gPiA2NCA/IDY0IDogc2tiLT5sZW47Ci0JbGVuID4+PSAxOwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkgewotCSAgICBpbnQgajsKLQkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiUwNHg6IiwgaSk7Ci0JICAgIGZvciAoaiA9IDA7IChqIDwgOCkgJiYgKChpK2opIDwgbGVuKTsgaisrKSB7Ci0JCWlmICghKGogJiAxKSkKLQkJICAgIHByaW50aygiICIpOwotCQlwcmludGsoIiUwNHgiLCBwcml2LT50eF9idWZmW2VudHJ5XVtpK2pdKTsKLQkgICAgfQotCSAgICBwcmludGsoIlxuIik7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gICAgcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDEgPSAocHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDEmMHhmZjAwKXxURl9PV058VEZfU1RQfFRGX0VOUDsKLQotICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKLQotICAgIHByaXYtPmN1cl90eCsrOwotICAgIGlmICgocHJpdi0+Y3VyX3R4ID49IFRYX1JJTkdfU0laRSkgJiYgKHByaXYtPmRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSkpIHsKLQotI2lmIDAKLQlwcmludGsoS0VSTl9ERUJVRyAiKioqIFN1YnRyYWN0aW5nIFRYX1JJTkdfU0laRSBmcm9tIGN1cl90eCAoJWQpIGFuZCAiCi0JICAgICAgICJkaXJ0eV90eCAoJWQpXG4iLCBwcml2LT5jdXJfdHgsIHByaXYtPmRpcnR5X3R4KTsKLSNlbmRpZgotCi0JcHJpdi0+Y3VyX3R4IC09IFRYX1JJTkdfU0laRTsKLQlwcml2LT5kaXJ0eV90eCAtPSBUWF9SSU5HX1NJWkU7Ci0gICAgfQotICAgIGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOwotCi0gICAgLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgc2VuZCBwb2xsLiAqLwotICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCi0gICAgbGFuY2UtPlJEUCA9IElORUF8VERNRDsKLQotICAgIGlmIChsb3diKHByaXYtPnR4X3JpbmdbKGVudHJ5KzEpICUgVFhfUklOR19TSVpFXS0+VE1EMSkgIT0gMCkgewotCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQlwcml2LT50eF9mdWxsID0gMTsKLSAgICB9Ci0gICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0gICAgcmV0dXJuIE5FVERFVl9UWF9PSzsKLX0KLQotCi1zdGF0aWMgaW50IGFyaWFkbmVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLSAgICBpbnQgZW50cnkgPSBwcml2LT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBJZiB3ZSBvd24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLwotICAgIHdoaWxlICghKGxvd2IocHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEpICYgUkZfT1dOKSkgewotCWludCBzdGF0dXMgPSBsb3diKHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxKTsKLQotCWlmIChzdGF0dXMgIT0gKFJGX1NUUHxSRl9FTlApKSB7CS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KLQkgICAgLyogVGhlcmUgaXMgYSB0cmlja3kgZXJyb3Igbm90ZWQgYnkgSm9obiBNdXJwaHksCi0JCTxtdXJmQHBlcmZ0ZWNoLmNvbT4gdG8gUnVzcyBOZWxzb246IEV2ZW4gd2l0aCBmdWxsLXNpemVkCi0JCWJ1ZmZlcnMgaXQncyBwb3NzaWJsZSBmb3IgYSBqYWJiZXIgcGFja2V0IHRvIHVzZSB0d28KLQkJYnVmZmVycywgd2l0aCBvbmx5IHRoZSBsYXN0IGNvcnJlY3RseSBub3RpbmcgdGhlIGVycm9yLiAqLwotCSAgICBpZiAoc3RhdHVzICYgUkZfRU5QKQotCQkvKiBPbmx5IGNvdW50IGEgZ2VuZXJhbCBlcnJvciBhdCB0aGUgZW5kIG9mIGEgcGFja2V0LiovCi0JCWRldi0+c3RhdHMucnhfZXJyb3JzKys7Ci0JICAgIGlmIChzdGF0dXMgJiBSRl9GUkFNKQotCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwotCSAgICBpZiAoc3RhdHVzICYgUkZfT0ZMTykKLQkJZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOwotCSAgICBpZiAoc3RhdHVzICYgUkZfQ1JDKQotCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQkgICAgaWYgKHN0YXR1cyAmIFJGX0JVRkYpCi0JCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKLQkgICAgcHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEgJj0gMHhmZjAwfFJGX1NUUHxSRl9FTlA7Ci0JfSBlbHNlIHsKLQkgICAgLyogTWFsbG9jIHVwIG5ldyBidWZmZXIsIGNvbXBhdGlibGUgd2l0aCBuZXQtMy4gKi8KLQkgICAgc2hvcnQgcGt0X2xlbiA9IHN3YXB3KHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQzKTsKLQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCSAgICBza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7Ci0JICAgIGlmIChza2IgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQotCQkgICAgaWYgKGxvd2IocHJpdi0+cnhfcmluZ1soZW50cnkraSkgJSBSWF9SSU5HX1NJWkVdLT5STUQxKSAmIFJGX09XTikKLQkJCWJyZWFrOwotCi0JCWlmIChpID4gUlhfUklOR19TSVpFLTIpIHsKLQkJICAgIGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwotCQkgICAgcHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEgfD0gUkZfT1dOOwotCQkgICAgcHJpdi0+Y3VyX3J4Kys7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIH0KLQotCi0JICAgIHNrYl9yZXNlcnZlKHNrYiwyKTsJCS8qIDE2IGJ5dGUgYWxpZ24gKi8KLQkgICAgc2tiX3B1dChza2IscGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLwotCSAgICBza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIChjaGFyICopcHJpdi0+cnhfYnVmZltlbnRyeV0sIHBrdF9sZW4pOwotCSAgICBza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwotI2lmIDAKLXsKLQkgICAgcHJpbnRrKEtFUk5fREVCVUcgIlJYIHBrdCB0eXBlIDB4JTA0eCBmcm9tICIsCi0JCSAgICgodV9zaG9ydCAqKXNrYi0+ZGF0YSlbNl0pOwotCSAgICB7Ci0JCXVfY2hhciAqcHRyID0gJigodV9jaGFyICopc2tiLT5kYXRhKVs2XTsKLQkJcHJpbnRrKCIlcE0iLCBwdHIpOwotCSAgICB9Ci0JICAgIHByaW50aygiIHRvICIpOwotCSAgICB7Ci0JCXVfY2hhciAqcHRyID0gKHVfY2hhciAqKXNrYi0+ZGF0YTsKLQkJcHJpbnRrKCIlcE0iLCBwdHIpOwotCSAgICB9Ci0JICAgIHByaW50aygiIGRhdGEgMHglMDh4IGxlbiAlZFxuIiwgKGludClza2ItPmRhdGEsIChpbnQpc2tiLT5sZW4pOwotfQotI2VuZGlmCi0KLQkgICAgbmV0aWZfcngoc2tiKTsKLQkgICAgZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JICAgIGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKLQl9Ci0KLQlwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSB8PSBSRl9PV047Ci0JZW50cnkgPSAoKytwcml2LT5jdXJfcngpICUgUlhfUklOR19TSVpFOwotICAgIH0KLQotICAgIHByaXYtPmN1cl9yeCA9IHByaXYtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKLQotICAgIC8qIFdlIHNob3VsZCBjaGVjayB0aGF0IGF0IGxlYXN0IHR3byByaW5nIGVudHJpZXMgYXJlIGZyZWUuCSBJZiBub3QsCi0gICAgICAgd2Ugc2hvdWxkIGZyZWUgb25lIGFuZCBtYXJrIHN0YXRzLT5yeF9kcm9wcGVkKysuICovCi0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFyaWFkbmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0gICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOwotICAgIHNob3J0IHNhdmVkX2FkZHI7Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLSAgICBzYXZlZF9hZGRyID0gbGFuY2UtPlJBUDsKLSAgICBsYW5jZS0+UkFQID0gQ1NSMTEyOwkJLyogTWlzc2VkIEZyYW1lIENvdW50ICovCi0gICAgZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gc3dhcHcobGFuY2UtPlJEUCk7Ci0gICAgbGFuY2UtPlJBUCA9IHNhdmVkX2FkZHI7Ci0gICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0gICAgcmV0dXJuICZkZXYtPnN0YXRzOwotfQotCi0KLS8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgotICAgIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCi0gICAgbnVtX2FkZHJzID09IDAJTm9ybWFsIG1vZGUsIGNsZWFyIG11bHRpY2FzdCBsaXN0Ci0gICAgbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbwotCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgotICovCi1zdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7Ci0KLSAgICBpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKLQlyZXR1cm47Ci0KLSAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0KLSAgICAvKiBXZSB0YWtlIHRoZSBzaW1wbGUgd2F5IG91dCBhbmQgYWx3YXlzIGVuYWJsZSBwcm9taXNjdW91cyBtb2RlLiAqLwotICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwotICAgIGxhbmNlLT5SRFAgPSBTVE9QOwkJCS8qIFRlbXBvcmFyaWx5IHN0b3AgdGhlIGxhbmNlLiAqLwotICAgIGFyaWFkbmVfaW5pdF9yaW5nKGRldik7Ci0KLSAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7Ci0JbGFuY2UtPlJBUCA9IENTUjE1OwkJLyogTW9kZSBSZWdpc3RlciAqLwotCWxhbmNlLT5SRFAgPSBQUk9NOwkJLyogU2V0IHByb21pc2N1b3VzIG1vZGUgKi8KLSAgICB9IGVsc2UgewotCXNob3J0IG11bHRpY2FzdF90YWJsZVs0XTsKLQlpbnQgbnVtX2FkZHJzID0gbmV0ZGV2X21jX2NvdW50KGRldik7Ci0JaW50IGk7Ci0JLyogV2UgZG9uJ3QgdXNlIHRoZSBtdWx0aWNhc3QgdGFibGUsIGJ1dCByZWx5IG9uIHVwcGVyLWxheWVyIGZpbHRlcmluZy4gKi8KLQltZW1zZXQobXVsdGljYXN0X3RhYmxlLCAobnVtX2FkZHJzID09IDApID8gMCA6IC0xLAotCSAgICAgICBzaXplb2YobXVsdGljYXN0X3RhYmxlKSk7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCSAgICBsYW5jZS0+UkFQID0gQ1NSOCsoaTw8OCk7CS8qIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIgKi8KLQkgICAgbGFuY2UtPlJEUCA9IHN3YXB3KG11bHRpY2FzdF90YWJsZVtpXSk7Ci0JfQotCWxhbmNlLT5SQVAgPSBDU1IxNTsJCS8qIE1vZGUgUmVnaXN0ZXIgKi8KLQlsYW5jZS0+UkRQID0gMHgwMDAwOwkJLyogVW5zZXQgcHJvbWlzY3VvdXMgbW9kZSAqLwotICAgIH0KLQotICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLwotICAgIGxhbmNlLT5SRFAgPSBJTkVBfFNUUlR8SURPTjsJLyogUmVzdW1lIG5vcm1hbCBvcGVyYXRpb24uICovCi0KLSAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Ci19Ci0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGFyaWFkbmVfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KQotewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB6b3Jyb19nZXRfZHJ2ZGF0YSh6KTsKLQotICAgIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0gICAgcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoZGV2LT5iYXNlX2FkZHIpLCBzaXplb2Yoc3RydWN0IEFtNzlDOTYwKSk7Ci0gICAgcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoZGV2LT5tZW1fc3RhcnQpLCBBUklBRE5FX1JBTV9TSVpFKTsKLSAgICBmcmVlX25ldGRldihkZXYpOwotfQorc3RhdGljIHN0cnVjdCB6b3Jyb19kcml2ZXIgYXJpYWRuZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFyaWFkbmUiLAorCS5pZF90YWJsZQk9IGFyaWFkbmVfem9ycm9fdGJsLAorCS5wcm9iZQkJPSBhcmlhZG5lX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXJpYWRuZV9yZW1vdmVfb25lKSwKK307CiAKIHN0YXRpYyBpbnQgX19pbml0IGFyaWFkbmVfaW5pdF9tb2R1bGUodm9pZCkKIHsKLSAgICByZXR1cm4gem9ycm9fcmVnaXN0ZXJfZHJpdmVyKCZhcmlhZG5lX2RyaXZlcik7CisJcmV0dXJuIHpvcnJvX3JlZ2lzdGVyX2RyaXZlcigmYXJpYWRuZV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYXJpYWRuZV9jbGVhbnVwX21vZHVsZSh2b2lkKQogewotICAgIHpvcnJvX3VucmVnaXN0ZXJfZHJpdmVyKCZhcmlhZG5lX2RyaXZlcik7CisJem9ycm9fdW5yZWdpc3Rlcl9kcml2ZXIoJmFyaWFkbmVfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoYXJpYWRuZV9pbml0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmMgYi9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmMKaW5kZXggMGM5MjE3Zi4uNTJmZTIxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9hbTc5Yzk2MWEuYwpAQCAtNTAsNyArNTAsNyBAQAogI2lmZGVmIF9fYXJtX18KIHN0YXRpYyB2b2lkIHdyaXRlX3JyZWcodV9sb25nIGJhc2UsIHVfaW50IHJlZywgdV9pbnQgdmFsKQogewotCV9fYXNtX18oCisJYXNtIHZvbGF0aWxlKAogCSJzdHIlP2gJJTEsIFslMl0JQCBORVRfUkFQXG5cdCIKIAkic3RyJT9oCSUwLCBbJTIsICMtNF0JQCBORVRfUkRQIgogCToKQEAgLTYwLDcgKzYwLDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcmVhZF9ycmVnKHVfbG9uZyBiYXNlX2FkZHIsIHVfaW50IHJlZykKIHsKIAl1bnNpZ25lZCBzaG9ydCB2OwotCV9fYXNtX18oCisJYXNtIHZvbGF0aWxlKAogCSJzdHIlP2gJJTEsIFslMl0JQCBORVRfUkFQXG5cdCIKIAkibGRyJT9oCSUwLCBbJTIsICMtNF0JQCBORVRfUkRQIgogCTogIj1yIiAodikKQEAgLTcwLDcgKzcwLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2lyZWcodV9sb25nIGJhc2UsIHVfaW50IHJlZywgdV9pbnQgdmFsKQogewotCV9fYXNtX18oCisJYXNtIHZvbGF0aWxlKAogCSJzdHIlP2gJJTEsIFslMl0JQCBORVRfUkFQXG5cdCIKIAkic3RyJT9oCSUwLCBbJTIsICM4XQlAIE5FVF9JRFAiCiAJOgpAQCAtODAsNyArODAsNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCByZWFkX2lyZWcodV9sb25nIGJhc2VfYWRkciwgdV9pbnQgcmVnKQogewogCXVfc2hvcnQgdjsKLQlfX2FzbV9fKAorCWFzbSB2b2xhdGlsZSgKIAkic3RyJT9oCSUxLCBbJTJdCUAgTkFUX1JBUFxuXHQiCiAJImxkciU/aAklMCwgWyUyLCAjOF0JQCBORVRfSURQXG5cdCIKIAk6ICI9ciIgKHYpCkBAIC05MSw0NyArOTEsNDggQEAKICNkZWZpbmUgYW1fd3JpdGV3b3JkKGRldixvZmYsdmFsKSBfX3Jhd193cml0ZXcodmFsLCBJU0FNRU1fQkFTRSArICgob2ZmKSA8PCAxKSkKICNkZWZpbmUgYW1fcmVhZHdvcmQoZGV2LG9mZikgICAgICBfX3Jhd19yZWFkdyhJU0FNRU1fQkFTRSArICgob2ZmKSA8PCAxKSkKIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogYW1fd3JpdGVidWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9pbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAJb2Zmc2V0ID0gSVNBTUVNX0JBU0UgKyAob2Zmc2V0IDw8IDEpOwogCWxlbmd0aCA9IChsZW5ndGggKyAxKSAmIH4xOwogCWlmICgoaW50KWJ1ZiAmIDIpIHsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN0ciU/aAklMiwgWyUwXSwgIzQiCisJCWFzbSB2b2xhdGlsZSgic3RyJT9oCSUyLCBbJTBdLCAjNCIKIAkJIDogIj0mciIgKG9mZnNldCkgOiAiMCIgKG9mZnNldCksICJyIiAoYnVmWzBdIHwgKGJ1ZlsxXSA8PCA4KSkpOwogCQlidWYgKz0gMjsKIAkJbGVuZ3RoIC09IDI7CiAJfQogCXdoaWxlIChsZW5ndGggPiA4KSB7Ci0JCXVuc2lnbmVkIGludCB0bXAsIHRtcDI7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJImxkbSU/aWEJJTEhLCB7JTIsICUzfVxuXHQiCisJCXJlZ2lzdGVyIHVuc2lnbmVkIGludCB0bXAgYXNtKCJyMiIpLCB0bXAyIGFzbSgicjMiKTsKKwkJYXNtIHZvbGF0aWxlKAorCQkJImxkbSU/aWEJJTAhLCB7JTEsICUyfSIKKwkJCTogIityIiAoYnVmKSwgIj0mciIgKHRtcCksICI9JnIiICh0bXAyKSk7CisJCWxlbmd0aCAtPSA4OworCQlhc20gdm9sYXRpbGUoCisJCQkic3RyJT9oCSUxLCBbJTBdLCAjNFxuXHQiCisJCQkibW92JT8JJTEsICUxLCBsc3IgIzE2XG5cdCIKKwkJCSJzdHIlP2gJJTEsIFslMF0sICM0XG5cdCIKIAkJCSJzdHIlP2gJJTIsIFslMF0sICM0XG5cdCIKIAkJCSJtb3YlPwklMiwgJTIsIGxzciAjMTZcblx0IgotCQkJInN0ciU/aAklMiwgWyUwXSwgIzRcblx0IgotCQkJInN0ciU/aAklMywgWyUwXSwgIzRcblx0IgotCQkJIm1vdiU/CSUzLCAlMywgbHNyICMxNlxuXHQiCi0JCQkic3RyJT9oCSUzLCBbJTBdLCAjNCIKLQkJOiAiPSZyIiAob2Zmc2V0KSwgIj0mciIgKGJ1ZiksICI9ciIgKHRtcCksICI9ciIgKHRtcDIpCi0JCTogIjAiIChvZmZzZXQpLCAiMSIgKGJ1ZikpOwotCQlsZW5ndGggLT0gODsKKwkJCSJzdHIlP2gJJTIsIFslMF0sICM0IgorCQk6ICIrciIgKG9mZnNldCksICI9JnIiICh0bXApLCAiPSZyIiAodG1wMikpOwogCX0KIAl3aGlsZSAobGVuZ3RoID4gMCkgewotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RyJT9oCSUyLCBbJTBdLCAjNCIKKwkJYXNtIHZvbGF0aWxlKCJzdHIlP2gJJTIsIFslMF0sICM0IgogCQkgOiAiPSZyIiAob2Zmc2V0KSA6ICIwIiAob2Zmc2V0KSwgInIiIChidWZbMF0gfCAoYnVmWzFdIDw8IDgpKSk7CiAJCWJ1ZiArPSAyOwogCQlsZW5ndGggLT0gMjsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIGFtX3JlYWRidWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9pbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAJb2Zmc2V0ID0gSVNBTUVNX0JBU0UgKyAob2Zmc2V0IDw8IDEpOwogCWxlbmd0aCA9IChsZW5ndGggKyAxKSAmIH4xOwogCWlmICgoaW50KWJ1ZiAmIDIpIHsKIAkJdW5zaWduZWQgaW50IHRtcDsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCWFzbSB2b2xhdGlsZSgKIAkJCSJsZHIlP2gJJTIsIFslMF0sICM0XG5cdCIKIAkJCSJzdHIlP2IJJTIsIFslMV0sICMxXG5cdCIKIAkJCSJtb3YlPwklMiwgJTIsIGxzciAjOFxuXHQiCkBAIC0xNDAsMTIgKzE0MSwxMiBAQAogCQlsZW5ndGggLT0gMjsKIAl9CiAJd2hpbGUgKGxlbmd0aCA+IDgpIHsKLQkJdW5zaWduZWQgaW50IHRtcCwgdG1wMiwgdG1wMzsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCXJlZ2lzdGVyIHVuc2lnbmVkIGludCB0bXAgYXNtKCJyMiIpLCB0bXAyIGFzbSgicjMiKSwgdG1wMzsKKwkJYXNtIHZvbGF0aWxlKAogCQkJImxkciU/aAklMiwgWyUwXSwgIzRcblx0IgorCQkJImxkciU/aAklNCwgWyUwXSwgIzRcblx0IgogCQkJImxkciU/aAklMywgWyUwXSwgIzRcblx0IgotCQkJIm9yciU/CSUyLCAlMiwgJTMsIGxzbCAjMTZcblx0IgotCQkJImxkciU/aAklMywgWyUwXSwgIzRcblx0IgorCQkJIm9yciU/CSUyLCAlMiwgJTQsIGxzbCAjMTZcblx0IgogCQkJImxkciU/aAklNCwgWyUwXSwgIzRcblx0IgogCQkJIm9yciU/CSUzLCAlMywgJTQsIGxzbCAjMTZcblx0IgogCQkJInN0bSU/aWEJJTEhLCB7JTIsICUzfSIKQEAgLTE1NSw3ICsxNTYsNyBAQAogCX0KIAl3aGlsZSAobGVuZ3RoID4gMCkgewogCQl1bnNpZ25lZCBpbnQgdG1wOwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJYXNtIHZvbGF0aWxlKAogCQkJImxkciU/aAklMiwgWyUwXSwgIzRcblx0IgogCQkJInN0ciU/YgklMiwgWyUxXSwgIzFcblx0IgogCQkJIm1vdiU/CSUyLCAlMiwgbHNyICM4XG5cdCIKQEAgLTE5Niw2ICsxOTcsNDAgQEAKIAlyZXR1cm4gZXJyb3Jjb3VudDsKIH0KIAorc3RhdGljIHZvaWQgYW03OWM5NjFfbWNfaGFzaChjaGFyICphZGRyLCB1MTYgKmhhc2gpCit7CisJaW50IGlkeCwgYml0OworCXUzMiBjcmM7CisKKwljcmMgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIGFkZHIpOworCisJaWR4ID0gY3JjID4+IDMwOworCWJpdCA9IChjcmMgPj4gMjYpICYgMTU7CisKKwloYXNoW2lkeF0gfD0gMSA8PCBiaXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYW03OWM5NjFfZ2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICpoYXNoKQoreworCXVuc2lnbmVkIGludCBtb2RlID0gTU9ERV9QT1JUXzEwQlQ7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCW1vZGUgfD0gTU9ERV9QUk9NSVNDOworCQltZW1zZXQoaGFzaCwgMHhmZiwgNCAqIHNpemVvZigqaGFzaCkpOworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQltZW1zZXQoaGFzaCwgMHhmZiwgNCAqIHNpemVvZigqaGFzaCkpOworCX0gZWxzZSB7CisJCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisKKwkJbWVtc2V0KGhhc2gsIDAsIDQgKiBzaXplb2YoKmhhc2gpKTsKKworCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KQorCQkJYW03OWM5NjFfbWNfaGFzaChoYS0+YWRkciwgaGFzaCk7CisJfQorCisJcmV0dXJuIG1vZGU7Cit9CisKIHN0YXRpYyB2b2lkCiBhbTc5Yzk2MV9pbml0X2Zvcl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0yMDMsNiArMjM4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGNoYXIgKnA7CiAJdV9pbnQgaGRyX2FkZHIsIGZpcnN0X2ZyZWVfYWRkcjsKKwl1MTYgbXVsdGlfaGFzaFs0XSwgbW9kZSA9IGFtNzljOTYxX2dldF9yeF9tb2RlKGRldiwgbXVsdGlfaGFzaCk7CiAJaW50IGk7CiAKIAkvKgpAQCAtMjE4LDE2ICsyNTQsMTIgQEAKIAl3cml0ZV9pcmVnIChkZXYtPmJhc2VfYWRkciwgMiwgMHgwMDAwKTsgLyogTU9ERSByZWdpc3RlciBzZWxlY3RzIG1lZGlhICovCiAKIAlmb3IgKGkgPSBMQURSTDsgaSA8PSBMQURSSDsgaSsrKQotCQl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgaSwgMCk7CisJCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBpLCBtdWx0aV9oYXNoW2kgLSBMQURSTF0pOwogCiAJZm9yIChpID0gUEFEUkwsIHAgPSBkZXYtPmRldl9hZGRyOyBpIDw9IFBBRFJIOyBpKyssIHAgKz0gMikKIAkJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIGksIHBbMF0gfCAocFsxXSA8PCA4KSk7CiAKLQlpID0gTU9ERV9QT1JUXzEwQlQ7Ci0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKLQkJaSB8PSBNT0RFX1BST01JU0M7Ci0KLQl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgTU9ERSwgaSk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIE1PREUsIG1vZGUpOwogCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBQT0xMSU5ULCAwKTsKIAl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgU0laRVJYUiwgLVJYX0JVRkZFUlMpOwogCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBTSVpFVFhSLCAtVFhfQlVGRkVSUyk7CkBAIC0zNDAsMjEgKzM3Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGFtNzljOTYxX21jX2hhc2goY2hhciAqYWRkciwgdW5zaWduZWQgc2hvcnQgKmhhc2gpCi17Ci0JaWYgKGFkZHJbMF0gJiAweDAxKSB7Ci0JCWludCBpZHgsIGJpdDsKLQkJdTMyIGNyYzsKLQotCQljcmMgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIGFkZHIpOwotCi0JCWlkeCA9IGNyYyA+PiAzMDsKLQkJYml0ID0gKGNyYyA+PiAyNikgJiAxNTsKLQotCQloYXNoW2lkeF0gfD0gMSA8PCBiaXQ7Ci0JfQotfQotCiAvKgogICogU2V0IG9yIGNsZWFyIHByb21pc2N1b3VzL211bHRpY2FzdCBtb2RlIGZpbHRlciBmb3IgdGhpcyBhZGFwdGVyLgogICovCkBAIC0zNjIsMjQgKzM3OSw5IEBACiB7CiAJc3RydWN0IGRldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIHNob3J0IG11bHRpX2hhc2hbNF0sIG1vZGU7CisJdTE2IG11bHRpX2hhc2hbNF0sIG1vZGUgPSBhbTc5Yzk2MV9nZXRfcnhfbW9kZShkZXYsIG11bHRpX2hhc2gpOwogCWludCBpLCBzdG9wcGVkOwogCi0JbW9kZSA9IE1PREVfUE9SVF8xMEJUOwotCi0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewotCQltb2RlIHw9IE1PREVfUFJPTUlTQzsKLQl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKLQkJbWVtc2V0KG11bHRpX2hhc2gsIDB4ZmYsIHNpemVvZihtdWx0aV9oYXNoKSk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQotCQltZW1zZXQobXVsdGlfaGFzaCwgMHgwMCwgc2l6ZW9mKG11bHRpX2hhc2gpKTsKLQotCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KQotCQkJYW03OWM5NjFfbWNfaGFzaChoYS0+YWRkciwgbXVsdGlfaGFzaCk7Ci0JfQotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmNoaXBfbG9jaywgZmxhZ3MpOwogCiAJc3RvcHBlZCA9IHJlYWRfcnJlZyhkZXYtPmJhc2VfYWRkciwgQ1NSMCkgJiBDU1IwX1NUT1A7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5jIGIvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuYwppbmRleCBlMDdiMzE0Li4yOWRjNDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9hdDkxX2V0aGVyLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYyBiL2RyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMKaW5kZXggNWE3NzAwMS4uNDMxN2FmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYworKysgYi9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTI4MywxMCArMjg0LDE0IEBACiAKIAkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGggKyAyKTsKIAkJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsKKwkJCXN0cnVjdCBlcDkzeHhfcmRlc2MgKnJ4ZCA9ICZlcC0+ZGVzY3MtPnJkZXNjW2VudHJ5XTsKIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7Ci0JCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShOVUxMLCBlcC0+ZGVzY3MtPnJkZXNjW2VudHJ5XS5idWZfYWRkciwKKwkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldi0+ZGV2LnBhcmVudCwgcnhkLT5idWZfYWRkciwKIAkJCQkJCWxlbmd0aCwgRE1BX0ZST01fREVWSUNFKTsKIAkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgZXAtPnJ4X2J1ZltlbnRyeV0sIGxlbmd0aCk7CisJCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYtPmRldi5wYXJlbnQsCisJCQkJCQkgICByeGQtPmJ1Zl9hZGRyLCBsZW5ndGgsCisJCQkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwogCQkJc2tiX3B1dChza2IsIGxlbmd0aCk7CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCkBAIC0zNDgsNiArMzUzLDcgQEAKIHN0YXRpYyBpbnQgZXA5M3h4X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXA5M3h4X3ByaXYgKmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZXA5M3h4X3RkZXNjICp0eGQ7CiAJaW50IGVudHJ5OwogCiAJaWYgKHVubGlrZWx5KHNrYi0+bGVuID4gTUFYX1BLVF9TSVpFKSkgewpAQCAtMzU5LDExICszNjUsMTQgQEAKIAllbnRyeSA9IGVwLT50eF9wb2ludGVyOwogCWVwLT50eF9wb2ludGVyID0gKGVwLT50eF9wb2ludGVyICsgMSkgJiAoVFhfUVVFVUVfRU5UUklFUyAtIDEpOwogCi0JZXAtPmRlc2NzLT50ZGVzY1tlbnRyeV0udGRlc2MxID0KLQkJVERFU0MxX0VPRiB8IChlbnRyeSA8PCAxNikgfCAoc2tiLT5sZW4gJiAweGZmZik7CisJdHhkID0gJmVwLT5kZXNjcy0+dGRlc2NbZW50cnldOworCisJdHhkLT50ZGVzYzEgPSBUREVTQzFfRU9GIHwgKGVudHJ5IDw8IDE2KSB8IChza2ItPmxlbiAmIDB4ZmZmKTsKKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYtPmRldi5wYXJlbnQsIHR4ZC0+YnVmX2FkZHIsIHNrYi0+bGVuLAorCQkJCURNQV9UT19ERVZJQ0UpOwogCXNrYl9jb3B5X2FuZF9jc3VtX2Rldihza2IsIGVwLT50eF9idWZbZW50cnldKTsKLQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShOVUxMLCBlcC0+ZGVzY3MtPnRkZXNjW2VudHJ5XS5idWZfYWRkciwKLQkJCQlza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LT5kZXYucGFyZW50LCB0eGQtPmJ1Zl9hZGRyLCBza2ItPmxlbiwKKwkJCQkgICBETUFfVE9fREVWSUNFKTsKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKIAlzcGluX2xvY2tfaXJxKCZlcC0+dHhfcGVuZGluZ19sb2NrKTsKQEAgLTQ1Nyw4OSArNDY2LDgwIEBACiAKIHN0YXRpYyB2b2lkIGVwOTN4eF9mcmVlX2J1ZmZlcnMoc3RydWN0IGVwOTN4eF9wcml2ICplcCkKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBlcC0+ZGV2LT5kZXYucGFyZW50OwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX0VOVFJJRVM7IGkgKz0gMikgeworCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9FTlRSSUVTOyBpKyspIHsKIAkJZG1hX2FkZHJfdCBkOwogCiAJCWQgPSBlcC0+ZGVzY3MtPnJkZXNjW2ldLmJ1Zl9hZGRyOwogCQlpZiAoZCkKLQkJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgZCwgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIGQsIFBLVF9CVUZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKIAogCQlpZiAoZXAtPnJ4X2J1ZltpXSAhPSBOVUxMKQotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWVwLT5yeF9idWZbaV0pOworCQkJa2ZyZWUoZXAtPnJ4X2J1ZltpXSk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFRYX1FVRVVFX0VOVFJJRVM7IGkgKz0gMikgeworCWZvciAoaSA9IDA7IGkgPCBUWF9RVUVVRV9FTlRSSUVTOyBpKyspIHsKIAkJZG1hX2FkZHJfdCBkOwogCiAJCWQgPSBlcC0+ZGVzY3MtPnRkZXNjW2ldLmJ1Zl9hZGRyOwogCQlpZiAoZCkKLQkJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgZCwgUEFHRV9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBkLCBQS1RfQlVGX1NJWkUsIERNQV9UT19ERVZJQ0UpOwogCiAJCWlmIChlcC0+dHhfYnVmW2ldICE9IE5VTEwpCi0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZXAtPnR4X2J1ZltpXSk7CisJCQlrZnJlZShlcC0+dHhfYnVmW2ldKTsKIAl9CiAKLQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzaXplb2Yoc3RydWN0IGVwOTN4eF9kZXNjcyksIGVwLT5kZXNjcywKKwlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemVvZihzdHJ1Y3QgZXA5M3h4X2Rlc2NzKSwgZXAtPmRlc2NzLAogCQkJCQkJCWVwLT5kZXNjc19kbWFfYWRkcik7CiB9CiAKLS8qCi0gKiBUaGUgaGFyZHdhcmUgZW5mb3JjZXMgYSBzdWItMksgbWF4aW11bSBwYWNrZXQgc2l6ZSwgc28gd2UgcHV0Ci0gKiB0d28gYnVmZmVycyBvbiBldmVyeSBoYXJkd2FyZSBwYWdlLgotICovCiBzdGF0aWMgaW50IGVwOTN4eF9hbGxvY19idWZmZXJzKHN0cnVjdCBlcDkzeHhfcHJpdiAqZXApCiB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZXAtPmRldi0+ZGV2LnBhcmVudDsKIAlpbnQgaTsKIAotCWVwLT5kZXNjcyA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzaXplb2Yoc3RydWN0IGVwOTN4eF9kZXNjcyksCi0JCQkJJmVwLT5kZXNjc19kbWFfYWRkciwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWVwLT5kZXNjcyA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemVvZihzdHJ1Y3QgZXA5M3h4X2Rlc2NzKSwKKwkJCQkmZXAtPmRlc2NzX2RtYV9hZGRyLCBHRlBfS0VSTkVMKTsKIAlpZiAoZXAtPmRlc2NzID09IE5VTEwpCiAJCXJldHVybiAxOwogCi0JZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX0VOVFJJRVM7IGkgKz0gMikgewotCQl2b2lkICpwYWdlOworCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9FTlRSSUVTOyBpKyspIHsKKwkJdm9pZCAqYnVmOwogCQlkbWFfYWRkcl90IGQ7CiAKLQkJcGFnZSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQkJaWYgKHBhZ2UgPT0gTlVMTCkKKwkJYnVmID0ga21hbGxvYyhQS1RfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpCiAJCQlnb3RvIGVycjsKIAotCQlkID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgcGFnZSwgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwotCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoTlVMTCwgZCkpIHsKLQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwkJZCA9IGRtYV9tYXBfc2luZ2xlKGRldiwgYnVmLCBQS1RfQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGQpKSB7CisJCQlrZnJlZShidWYpOwogCQkJZ290byBlcnI7CiAJCX0KIAotCQllcC0+cnhfYnVmW2ldID0gcGFnZTsKKwkJZXAtPnJ4X2J1ZltpXSA9IGJ1ZjsKIAkJZXAtPmRlc2NzLT5yZGVzY1tpXS5idWZfYWRkciA9IGQ7CiAJCWVwLT5kZXNjcy0+cmRlc2NbaV0ucmRlc2MxID0gKGkgPDwgMTYpIHwgUEtUX0JVRl9TSVpFOwotCi0JCWVwLT5yeF9idWZbaSArIDFdID0gcGFnZSArIFBLVF9CVUZfU0laRTsKLQkJZXAtPmRlc2NzLT5yZGVzY1tpICsgMV0uYnVmX2FkZHIgPSBkICsgUEtUX0JVRl9TSVpFOwotCQllcC0+ZGVzY3MtPnJkZXNjW2kgKyAxXS5yZGVzYzEgPSAoKGkgKyAxKSA8PCAxNikgfCBQS1RfQlVGX1NJWkU7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFRYX1FVRVVFX0VOVFJJRVM7IGkgKz0gMikgewotCQl2b2lkICpwYWdlOworCWZvciAoaSA9IDA7IGkgPCBUWF9RVUVVRV9FTlRSSUVTOyBpKyspIHsKKwkJdm9pZCAqYnVmOwogCQlkbWFfYWRkcl90IGQ7CiAKLQkJcGFnZSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQkJaWYgKHBhZ2UgPT0gTlVMTCkKKwkJYnVmID0ga21hbGxvYyhQS1RfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpCiAJCQlnb3RvIGVycjsKIAotCQlkID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgcGFnZSwgUEFHRV9TSVpFLCBETUFfVE9fREVWSUNFKTsKLQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKE5VTEwsIGQpKSB7Ci0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CisJCWQgPSBkbWFfbWFwX3NpbmdsZShkZXYsIGJ1ZiwgUEtUX0JVRl9TSVpFLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgZCkpIHsKKwkJCWtmcmVlKGJ1Zik7CiAJCQlnb3RvIGVycjsKIAkJfQogCi0JCWVwLT50eF9idWZbaV0gPSBwYWdlOworCQllcC0+dHhfYnVmW2ldID0gYnVmOwogCQllcC0+ZGVzY3MtPnRkZXNjW2ldLmJ1Zl9hZGRyID0gZDsKLQotCQllcC0+dHhfYnVmW2kgKyAxXSA9IHBhZ2UgKyBQS1RfQlVGX1NJWkU7Ci0JCWVwLT5kZXNjcy0+dGRlc2NbaSArIDFdLmJ1Zl9hZGRyID0gZCArIFBLVF9CVUZfU0laRTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTgyOSw2ICs4MjksNyBAQAogCX0KIAllcCA9IG5ldGRldl9wcml2KGRldik7CiAJZXAtPmRldiA9IGRldjsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOwogCW5ldGlmX25hcGlfYWRkKGRldiwgJmVwLT5uYXBpLCBlcDkzeHhfcG9sbCwgNjQpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9rczg2OTVuZXQuYyBiL2RyaXZlcnMvbmV0L2FybS9rczg2OTVuZXQuYwppbmRleCBhN2IwY2FhLi5jODI3YTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0va3M4Njk1bmV0LmMKKysrIGIvZHJpdmVycy9uZXQvYXJtL2tzODY5NW5ldC5jCkBAIC0xNiwxMSArMTYsMTMgQEAKICAqCQkgIFZpbmNlbnQgU2FuZGVycyA8dmluY2VAc2ltdGVjLmNvLnVrPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjLmggYi9kcml2ZXJzL25ldC9hdGwxYy9hdGwxYy5oCmluZGV4IDkyNTkyOWQuLmNhNzBlMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjLmgKKysrIGIvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWMuaApAQCAtMjIsOCArMjIsOCBAQAogI2lmbmRlZiBfQVRMMUNfSF8KICNkZWZpbmUgX0FUTDFDX0hfCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTU1NSw3ICs1NTUsNiBAQAogc3RydWN0IGF0bDFjX2FkYXB0ZXIgewogCXN0cnVjdCBuZXRfZGV2aWNlICAgKm5ldGRldjsKIAlzdHJ1Y3QgcGNpX2RldiAgICAgICpwZGV2OwotCXN0cnVjdCB2bGFuX2dyb3VwICAgKnZsZ3JwOwogCXN0cnVjdCBuYXBpX3N0cnVjdCAgbmFwaTsKIAlzdHJ1Y3QgYXRsMWNfaHcgICAgICAgIGh3OwogCXN0cnVjdCBhdGwxY19od19zdGF0cyAgaHdfc3RhdHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxYy9hdGwxY19tYWluLmMgYi9kcml2ZXJzL25ldC9hdGwxYy9hdGwxY19tYWluLmMKaW5kZXggMTI2OWJhNS4uOTcyMjQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjX21haW4uYwpAQCAtNDExLDI5ICs0MTEsMjkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGF0bDFjX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQorc3RhdGljIHZvaWQgX19hdGwxY192bGFuX21vZGUodTMyIGZlYXR1cmVzLCB1MzIgKm1hY19jdHJsX2RhdGEpCit7CisJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKSB7CisJCS8qIGVuYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KKwkJKm1hY19jdHJsX2RhdGEgfD0gTUFDX0NUUkxfUk1WX1ZMQU47CisJfSBlbHNlIHsKKwkJLyogZGlzYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KKwkJKm1hY19jdHJsX2RhdGEgJj0gfk1BQ19DVFJMX1JNVl9WTEFOOworCX0KK30KKworc3RhdGljIHZvaWQgYXRsMWNfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgYXRsMWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwogCXUzMiBtYWNfY3RybF9kYXRhID0gMDsKIAogCWlmIChuZXRpZl9tc2dfcGt0ZGF0YShhZGFwdGVyKSkKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiYXRsMWNfdmxhbl9yeF9yZWdpc3RlclxuIik7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImF0bDFjX3ZsYW5fbW9kZVxuIik7CiAKIAlhdGwxY19pcnFfZGlzYWJsZShhZGFwdGVyKTsKLQotCWFkYXB0ZXItPnZsZ3JwID0gZ3JwOwogCUFUX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkVHX01BQ19DVFJMLCAmbWFjX2N0cmxfZGF0YSk7Ci0KLQlpZiAoZ3JwKSB7Ci0JCS8qIGVuYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KLQkJbWFjX2N0cmxfZGF0YSB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKLQl9IGVsc2UgewotCQkvKiBkaXNhYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLwotCQltYWNfY3RybF9kYXRhICY9IH5NQUNfQ1RSTF9STVZfVkxBTjsKLQl9Ci0KKwlfX2F0bDFjX3ZsYW5fbW9kZShmZWF0dXJlcywgJm1hY19jdHJsX2RhdGEpOwogCUFUX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19NQUNfQ1RSTCwgbWFjX2N0cmxfZGF0YSk7CiAJYXRsMWNfaXJxX2VuYWJsZShhZGFwdGVyKTsKIH0KQEAgLTQ0Myw5ICs0NDMsMTAgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CiAKIAlpZiAobmV0aWZfbXNnX3BrdGRhdGEoYWRhcHRlcikpCi0JCWRldl9kYmcoJnBkZXYtPmRldiwgImF0bDFjX3Jlc3RvcmVfdmxhbiAhIik7Ci0JYXRsMWNfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiYXRsMWNfcmVzdG9yZV92bGFuXG4iKTsKKwlhdGwxY192bGFuX21vZGUoYWRhcHRlci0+bmV0ZGV2LCBhZGFwdGVyLT5uZXRkZXYtPmZlYXR1cmVzKTsKIH0KKwogLyoKICAqIGF0bDFjX3NldF9tYWMgLSBDaGFuZ2UgdGhlIEV0aGVybmV0IEFkZHJlc3Mgb2YgdGhlIE5JQwogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQpAQCAtNDgzLDEyICs0ODQsMzEgQEAKIAogc3RhdGljIHUzMiBhdGwxY19maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQogeworCS8qCisJICogU2luY2UgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2VwYXJhdGUgcngvdHggdmxhbiBhY2NlbAorCSAqIGVuYWJsZS9kaXNhYmxlIG1ha2Ugc3VyZSB0eCBmbGFnIGlzIGFsd2F5cyBpbiBzYW1lIHN0YXRlIGFzIHJ4LgorCSAqLworCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYOworCWVsc2UKKwkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfSFdfVkxBTl9UWDsKKwogCWlmIChuZXRkZXYtPm10dSA+IE1BWF9UU09fRlJBTUVfU0laRSkKIAkJZmVhdHVyZXMgJj0gfihORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNik7CiAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKK3N0YXRpYyBpbnQgYXRsMWNfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3sKKwl1MzIgY2hhbmdlZCA9IG5ldGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKKworCWlmIChjaGFuZ2VkICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQlhdGwxY192bGFuX21vZGUobmV0ZGV2LCBmZWF0dXJlcyk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIGF0bDFjX2NoYW5nZV9tdHUgLSBDaGFuZ2UgdGhlIE1heGltdW0gVHJhbnNmZXIgVW5pdAogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMTQzMyw4ICsxNDUzLDcgQEAKIAltYWNfY3RybF9kYXRhIHw9ICgoaHctPnByZWFtYmxlX2xlbiAmIE1BQ19DVFJMX1BSTUxFTl9NQVNLKSA8PAogCQkJTUFDX0NUUkxfUFJNTEVOX1NISUZUKTsKIAotCWlmIChhZGFwdGVyLT52bGdycCkKLQkJbWFjX2N0cmxfZGF0YSB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKKwlfX2F0bDFjX3ZsYW5fbW9kZShuZXRkZXYtPmZlYXR1cmVzLCAmbWFjX2N0cmxfZGF0YSk7CiAKIAltYWNfY3RybF9kYXRhIHw9IE1BQ19DVFJMX0JDX0VOOwogCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCkBAIC0xODc4LDE0ICsxODk3LDE0IEBACiAJCXNrYl9wdXQoc2tiLCBsZW5ndGggLSBFVEhfRkNTX0xFTik7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CiAJCWF0bDFjX3J4X2NoZWNrc3VtKGFkYXB0ZXIsIHNrYiwgcnJzKTsKLQkJaWYgKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwKSAmJiBycnMtPndvcmQzICYgUlJTX1ZMQU5fSU5TKSB7CisJCWlmIChycnMtPndvcmQzICYgUlJTX1ZMQU5fSU5TKSB7CiAJCQl1MTYgdmxhbjsKIAogCQkJQVRfVEFHX1RPX1ZMQU4ocnJzLT52bGFuX3RhZywgdmxhbik7CiAJCQl2bGFuID0gbGUxNl90b19jcHUodmxhbik7Ci0JCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBhZGFwdGVyLT52bGdycCwgdmxhbik7Ci0JCX0gZWxzZQotCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGFuKTsKKwkJfQorCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCiAJCSgqd29ya19kb25lKSsrOwogCQljb3VudCsrOwpAQCAtMjUwNyw4ICsyNTI2LDcgQEAKIAkJLyogY2xlYXIgcGh5IGludGVycnVwdCAqLwogCQlhdGwxY19yZWFkX3BoeV9yZWcoaHcsIE1JSV9JU1IsICZtaWlfaW50cl9zdGF0dXNfZGF0YSk7CiAJCS8qIENvbmZpZyBNQUMgQ3RybCByZWdpc3RlciAqLwotCQlpZiAoYWRhcHRlci0+dmxncnApCi0JCQltYWNfY3RybF9kYXRhIHw9IE1BQ19DVFJMX1JNVl9WTEFOOworCQlfX2F0bDFjX3ZsYW5fbW9kZShuZXRkZXYtPmZlYXR1cmVzLCAmbWFjX2N0cmxfZGF0YSk7CiAKIAkJLyogbWFnaWMgcGFja2V0IG1heWJlIEJyb2FkY2FzdCZtdWx0aWNhc3QmVW5pY2FzdCBmcmFtZSAqLwogCQlpZiAod3VmYyAmIEFUX1dVRkNfTUFHKQpAQCAtMjU4MSwxNCArMjU5OSwxNCBAQAogCS5uZG9fc3RvcAkJPSBhdGwxY19jbG9zZSwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKIAkubmRvX3N0YXJ0X3htaXQJCT0gYXRsMWNfeG1pdF9mcmFtZSwKLQkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBhdGwxY19zZXRfbWFjX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBhdGwxY19zZXRfbWFjX2FkZHIsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBhdGwxY19zZXRfbXVsdGksCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGF0bDFjX2NoYW5nZV9tdHUsCiAJLm5kb19maXhfZmVhdHVyZXMJPSBhdGwxY19maXhfZmVhdHVyZXMsCisJLm5kb19zZXRfZmVhdHVyZXMJPSBhdGwxY19zZXRfZmVhdHVyZXMsCiAJLm5kb19kb19pb2N0bAkJPSBhdGwxY19pb2N0bCwKIAkubmRvX3R4X3RpbWVvdXQJCT0gYXRsMWNfdHhfdGltZW91dCwKIAkubmRvX2dldF9zdGF0cwkJPSBhdGwxY19nZXRfc3RhdHMsCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gYXRsMWNfdmxhbl9yeF9yZWdpc3RlciwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gYXRsMWNfbmV0cG9sbCwKICNlbmRpZgpAQCAtMjYwNywxMSArMjYyNSwxMSBAQAogCS8qIFRPRE86IGFkZCB3aGVuIHJlYWR5ICovCiAJbmV0ZGV2LT5od19mZWF0dXJlcyA9CU5FVElGX0ZfU0cJICAgfAogCQkJCU5FVElGX0ZfSFdfQ1NVTQkgICB8Ci0JCQkJTkVUSUZfRl9IV19WTEFOX1RYIHwKKwkJCQlORVRJRl9GX0hXX1ZMQU5fUlggfAogCQkJCU5FVElGX0ZfVFNPCSAgIHwKIAkJCQlORVRJRl9GX1RTTzY7CiAJbmV0ZGV2LT5mZWF0dXJlcyA9CW5ldGRldi0+aHdfZmVhdHVyZXMgfAotCQkJCU5FVElGX0ZfSFdfVkxBTl9SWDsKKwkJCQlORVRJRl9GX0hXX1ZMQU5fVFg7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDFlL2F0bDFlLmggYi9kcml2ZXJzL25ldC9hdGwxZS9hdGwxZS5oCmluZGV4IDQ5MGQzYjMuLjgyOWI1YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bDFlL2F0bDFlLmgKKysrIGIvZHJpdmVycy9uZXQvYXRsMWUvYXRsMWUuaApAQCAtMjMsOCArMjMsOCBAQAogI2lmbmRlZiBfQVRMMUVfSF8KICNkZWZpbmUgX0FUTDFFX0hfCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQzMyw3ICs0MzMsNiBAQAogc3RydWN0IGF0bDFlX2FkYXB0ZXIgewogCXN0cnVjdCBuZXRfZGV2aWNlICAgKm5ldGRldjsKIAlzdHJ1Y3QgcGNpX2RldiAgICAgICpwZGV2OwotCXN0cnVjdCB2bGFuX2dyb3VwICAgKnZsZ3JwOwogCXN0cnVjdCBuYXBpX3N0cnVjdCAgbmFwaTsKIAlzdHJ1Y3QgbWlpX2lmX2luZm8gIG1paTsgICAgLyogTUlJIGludGVyZmFjZSBpbmZvICovCiAJc3RydWN0IGF0bDFlX2h3ICAgICAgICBodzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDFlL2F0bDFlX21haW4uYyBiL2RyaXZlcnMvbmV0L2F0bDFlL2F0bDFlX21haW4uYwppbmRleCA4NmE5MTIyLi5kOGQ0MTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGwxZS9hdGwxZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYXRsMWUvYXRsMWVfbWFpbi5jCkBAIC0zMTMsOCArMzEzLDE4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdGwxZV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3N0YXRpYyB2b2lkIF9fYXRsMWVfdmxhbl9tb2RlKHUzMiBmZWF0dXJlcywgdTMyICptYWNfY3RybF9kYXRhKQoreworCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkgeworCQkvKiBlbmFibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCSptYWNfY3RybF9kYXRhIHw9IE1BQ19DVFJMX1JNVl9WTEFOOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCSptYWNfY3RybF9kYXRhICY9IH5NQUNfQ1RSTF9STVZfVkxBTjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFlX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCiB7CiAJc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXUzMiBtYWNfY3RybF9kYXRhID0gMDsKQEAgLTMyMiwxOCArMzMyLDggQEAKIAluZXRkZXZfZGJnKGFkYXB0ZXItPm5ldGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlhdGwxZV9pcnFfZGlzYWJsZShhZGFwdGVyKTsKLQotCWFkYXB0ZXItPnZsZ3JwID0gZ3JwOwogCW1hY19jdHJsX2RhdGEgPSBBVF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJFR19NQUNfQ1RSTCk7Ci0KLQlpZiAoZ3JwKSB7Ci0JCS8qIGVuYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KLQkJbWFjX2N0cmxfZGF0YSB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKLQl9IGVsc2UgewotCQkvKiBkaXNhYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLwotCQltYWNfY3RybF9kYXRhICY9IH5NQUNfQ1RSTF9STVZfVkxBTjsKLQl9Ci0KKwlfX2F0bDFlX3ZsYW5fbW9kZShmZWF0dXJlcywgJm1hY19jdHJsX2RhdGEpOwogCUFUX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19NQUNfQ1RSTCwgbWFjX2N0cmxfZGF0YSk7CiAJYXRsMWVfaXJxX2VuYWJsZShhZGFwdGVyKTsKIH0KQEAgLTM0MSw4ICszNDEsOSBAQAogc3RhdGljIHZvaWQgYXRsMWVfcmVzdG9yZV92bGFuKHN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyKQogewogCW5ldGRldl9kYmcoYWRhcHRlci0+bmV0ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQlhdGwxZV92bGFuX3J4X3JlZ2lzdGVyKGFkYXB0ZXItPm5ldGRldiwgYWRhcHRlci0+dmxncnApOworCWF0bDFlX3ZsYW5fbW9kZShhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPm5ldGRldi0+ZmVhdHVyZXMpOwogfQorCiAvKgogICogYXRsMWVfc2V0X21hYyAtIENoYW5nZSB0aGUgRXRoZXJuZXQgQWRkcmVzcyBvZiB0aGUgTklDCiAgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCkBAIC0zNjksNiArMzcwLDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1MzIgYXRsMWVfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3sKKwkvKgorCSAqIFNpbmNlIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHJ4L3R4IHZsYW4gYWNjZWwKKwkgKiBlbmFibGUvZGlzYWJsZSBtYWtlIHN1cmUgdHggZmxhZyBpcyBhbHdheXMgaW4gc2FtZSBzdGF0ZSBhcyByeC4KKwkgKi8KKwlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpCisJCWZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWDsKKwllbHNlCisJCWZlYXR1cmVzICY9IH5ORVRJRl9GX0hXX1ZMQU5fVFg7CisKKwlyZXR1cm4gZmVhdHVyZXM7Cit9CisKK3N0YXRpYyBpbnQgYXRsMWVfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3sKKwl1MzIgY2hhbmdlZCA9IG5ldGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKKworCWlmIChjaGFuZ2VkICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQlhdGwxZV92bGFuX21vZGUobmV0ZGV2LCBmZWF0dXJlcyk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIGF0bDFlX2NoYW5nZV9tdHUgLSBDaGFuZ2UgdGhlIE1heGltdW0gVHJhbnNmZXIgVW5pdAogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQpAQCAtODAwLDggKzgyNSw3IEBACiAJLyogSW5pdCBUUEQgUmluZyAqLwogCXR4X3JpbmctPmRtYSA9IHJvdW5kdXAoYWRhcHRlci0+cmluZ19kbWEsIDgpOwogCW9mZnNldCA9IHR4X3JpbmctPmRtYSAtIGFkYXB0ZXItPnJpbmdfZG1hOwotCXR4X3JpbmctPmRlc2MgPSAoc3RydWN0IGF0bDFlX3RwZF9kZXNjICopCi0JCQkoYWRhcHRlci0+cmluZ192aXJfYWRkciArIG9mZnNldCk7CisJdHhfcmluZy0+ZGVzYyA9IGFkYXB0ZXItPnJpbmdfdmlyX2FkZHIgKyBvZmZzZXQ7CiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXRsMWVfdHhfYnVmZmVyKSAqICh0eF9yaW5nLT5jb3VudCk7CiAJdHhfcmluZy0+dHhfYnVmZmVyID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAodHhfcmluZy0+dHhfYnVmZmVyID09IE5VTEwpIHsKQEAgLTgyNyw3ICs4NTEsNyBAQAogCiAJLyogSW5pdCBDTUIgZG1hIGFkZHJlc3MgKi8KIAl0eF9yaW5nLT5jbWJfZG1hID0gYWRhcHRlci0+cmluZ19kbWEgKyBvZmZzZXQ7Ci0JdHhfcmluZy0+Y21iICAgICA9ICh1MzIgKikoYWRhcHRlci0+cmluZ192aXJfYWRkciArIG9mZnNldCk7CisJdHhfcmluZy0+Y21iID0gYWRhcHRlci0+cmluZ192aXJfYWRkciArIG9mZnNldDsKIAlvZmZzZXQgKz0gc2l6ZW9mKHUzMik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgaSsrKSB7CkBAIC0xMDQwLDggKzEwNjQsNyBAQAogCXZhbHVlIHw9ICgoKHUzMilhZGFwdGVyLT5ody5wcmVhbWJsZV9sZW4gJgogCQkgIE1BQ19DVFJMX1BSTUxFTl9NQVNLKSA8PCBNQUNfQ1RSTF9QUk1MRU5fU0hJRlQpOwogCi0JaWYgKGFkYXB0ZXItPnZsZ3JwKQotCQl2YWx1ZSB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKKwlfX2F0bDFlX3ZsYW5fbW9kZShuZXRkZXYtPmZlYXR1cmVzLCAmdmFsdWUpOwogCiAJdmFsdWUgfD0gTUFDX0NUUkxfQkNfRU47CiAJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKQEAgLTE0MjQsMTkgKzE0NDcsMTYgQEAKIAkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CiAJCQlhdGwxZV9yeF9jaGVja3N1bShhZGFwdGVyLCBza2IsIHBycnMpOwogCi0JCQlpZiAodW5saWtlbHkoYWRhcHRlci0+dmxncnAgJiYKLQkJCQkocHJycy0+cGt0X2ZsYWcgJiBSUlNfSVNfVkxBTl9UQUcpKSkgeworCQkJaWYgKHBycnMtPnBrdF9mbGFnICYgUlJTX0lTX1ZMQU5fVEFHKSB7CiAJCQkJdTE2IHZsYW5fdGFnID0gKHBycnMtPnZ0YWcgPj4gNCkgfAogCQkJCQkgICAgICAgKChwcnJzLT52dGFnICYgNykgPDwgMTMpIHwKIAkJCQkJICAgICAgICgocHJycy0+dnRhZyAmIDgpIDw8IDkpOwogCQkJCW5ldGRldl9kYmcobmV0ZGV2LAogCQkJCQkgICAiUlhEIFZMQU4gVEFHPFJSRD49MHglMDR4XG4iLAogCQkJCQkgICBwcnJzLT52dGFnKTsKLQkJCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBhZGFwdGVyLT52bGdycCwKLQkJCQkJCQkgdmxhbl90YWcpOwotCQkJfSBlbHNlIHsKLQkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGFuX3RhZyk7CiAJCQl9CisJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCiBza2lwX3BrdDoKIAkvKiBza2lwIGN1cnJlbnQgcGFja2V0IHdoZXRoZXIgaXQncyBvayBvciBub3QuICovCkBAIC0xODEyLDcgKzE4MzIsNyBAQAogCiAJdHBkID0gYXRsMWVfZ2V0X3RwZChhZGFwdGVyKTsKIAotCWlmICh1bmxpa2VseSh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpKSB7CisJaWYgKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgewogCQl1MTYgdmxhbl90YWcgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKIAkJdTE2IGF0bDFlX3ZsYW5fdGFnOwogCkBAIC0yMDk0LDggKzIxMTQsNyBAQAogCQkJCSBNQUNfQ1RSTF9QUk1MRU5fTUFTSykgPDwKIAkJCQkgTUFDX0NUUkxfUFJNTEVOX1NISUZUKTsKIAotCQlpZiAoYWRhcHRlci0+dmxncnApCi0JCQltYWNfY3RybF9kYXRhIHw9IE1BQ19DVFJMX1JNVl9WTEFOOworCQlfX2F0bDFlX3ZsYW5fbW9kZShuZXRkZXYtPmZlYXR1cmVzLCAmbWFjX2N0cmxfZGF0YSk7CiAKIAkJLyogbWFnaWMgcGFja2V0IG1heWJlIEJyb2FkY2FzdCZtdWx0aWNhc3QmVW5pY2FzdCBmcmFtZSAqLwogCQlpZiAod3VmYyAmIEFUX1dVRkNfTUFHKQpAQCAtMjE5NiwxMCArMjIxNSwxMSBAQAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gYXRsMWVfc2V0X211bHRpLAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gYXRsMWVfc2V0X21hY19hZGRyLAorCS5uZG9fZml4X2ZlYXR1cmVzCT0gYXRsMWVfZml4X2ZlYXR1cmVzLAorCS5uZG9fc2V0X2ZlYXR1cmVzCT0gYXRsMWVfc2V0X2ZlYXR1cmVzLAogCS5uZG9fY2hhbmdlX210dQkJPSBhdGwxZV9jaGFuZ2VfbXR1LAogCS5uZG9fZG9faW9jdGwJCT0gYXRsMWVfaW9jdGwsCiAJLm5kb190eF90aW1lb3V0CQk9IGF0bDFlX3R4X3RpbWVvdXQsCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gYXRsMWVfdmxhbl9yeF9yZWdpc3RlciwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gYXRsMWVfbmV0cG9sbCwKICNlbmRpZgpAQCAtMjIxOCw5ICsyMjM4LDkgQEAKIAlhdGwxZV9zZXRfZXRodG9vbF9vcHMobmV0ZGV2KTsKIAogCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9UU08gfAotCQlORVRJRl9GX0hXX1ZMQU5fVFg7Ci0JbmV0ZGV2LT5mZWF0dXJlcyA9IG5ldGRldi0+aHdfZmVhdHVyZXMgfAotCQlORVRJRl9GX0hXX1ZMQU5fUlggfCBORVRJRl9GX0xMVFg7CisJCQkgICAgICBORVRJRl9GX0hXX1ZMQU5fUlg7CisJbmV0ZGV2LT5mZWF0dXJlcyA9IG5ldGRldi0+aHdfZmVhdHVyZXMgfCBORVRJRl9GX0xMVFggfAorCQkJICAgTkVUSUZfRl9IV19WTEFOX1RYOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGx4L2F0bDEuYyBiL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5jCmluZGV4IGNkNTc4OWYuLjZmMGU5NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5jCisrKyBiL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5jCkBAIC0xMjg1LDggKzEyODUsNyBAQAogCXZhbHVlIHw9ICgoKHUzMikgYWRhcHRlci0+aHcucHJlYW1ibGVfbGVuCiAJCSAgICYgTUFDX0NUUkxfUFJNTEVOX01BU0spIDw8IE1BQ19DVFJMX1BSTUxFTl9TSElGVCk7CiAJLyogdmxhbiAqLwotCWlmIChhZGFwdGVyLT52bGdycCkKLQkJdmFsdWUgfD0gTUFDX0NUUkxfUk1WX1ZMQU47CisJX19hdGx4X3ZsYW5fbW9kZShuZXRkZXYtPmZlYXR1cmVzLCAmdmFsdWUpOwogCS8qIHJ4IGNoZWNrc3VtCiAJICAgaWYgKGFkYXB0ZXItPnJ4X2NzdW0pCiAJICAgdmFsdWUgfD0gTUFDX0NUUkxfUlhfQ0hLU1VNX0VOOwpAQCAtMjAyMywxMyArMjAyMiwxNCBAQAogCQlhdGwxX3J4X2NoZWNrc3VtKGFkYXB0ZXIsIHJyZCwgc2tiKTsKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYWRhcHRlci0+bmV0ZGV2KTsKIAotCQlpZiAoYWRhcHRlci0+dmxncnAgJiYgKHJyZC0+cGt0X2ZsZyAmIFBBQ0tFVF9GTEFHX1ZMQU5fSU5TKSkgeworCQlpZiAocnJkLT5wa3RfZmxnICYgUEFDS0VUX0ZMQUdfVkxBTl9JTlMpIHsKIAkJCXUxNiB2bGFuX3RhZyA9IChycmQtPnZsYW5fdGFnID4+IDQpIHwKIAkJCQkJKChycmQtPnZsYW5fdGFnICYgNykgPDwgMTMpIHwKIAkJCQkJKChycmQtPnZsYW5fdGFnICYgOCkgPDwgOSk7Ci0JCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBhZGFwdGVyLT52bGdycCwgdmxhbl90YWcpOwotCQl9IGVsc2UKLQkJCW5ldGlmX3J4KHNrYik7CisKKwkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGFuX3RhZyk7CisJCX0KKwkJbmV0aWZfcngoc2tiKTsKIAogCQkvKiBsZXQgcHJvdG9jb2wgbGF5ZXIgZnJlZSBza2IgKi8KIAkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CkBAIC0yNzgzLDggKzI3ODMsNyBAQAogCQkJY3RybCB8PSBNQUNfQ1RSTF9EVVBMWDsKIAkJY3RybCB8PSAoKCh1MzIpYWRhcHRlci0+aHcucHJlYW1ibGVfbGVuICYKIAkJCU1BQ19DVFJMX1BSTUxFTl9NQVNLKSA8PCBNQUNfQ1RSTF9QUk1MRU5fU0hJRlQpOwotCQlpZiAoYWRhcHRlci0+dmxncnApCi0JCQljdHJsIHw9IE1BQ19DVFJMX1JNVl9WTEFOOworCQlfX2F0bHhfdmxhbl9tb2RlKG5ldGRldi0+ZmVhdHVyZXMsICZjdHJsKTsKIAkJaWYgKHd1ZmMgJiBBVExYX1dVRkNfTUFHKQogCQkJY3RybCB8PSBNQUNfQ1RSTF9CQ19FTjsKIAkJaW93cml0ZTMyKGN0cmwsIGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKQEAgLTI4NzQsOSArMjg3MywxMCBAQAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gYXRsMV9zZXRfbWFjLAogCS5uZG9fY2hhbmdlX210dQkJPSBhdGwxX2NoYW5nZV9tdHUsCisJLm5kb19maXhfZmVhdHVyZXMJPSBhdGx4X2ZpeF9mZWF0dXJlcywKKwkubmRvX3NldF9mZWF0dXJlcwk9IGF0bHhfc2V0X2ZlYXR1cmVzLAogCS5uZG9fZG9faW9jdGwJCT0gYXRseF9pb2N0bCwKIAkubmRvX3R4X3RpbWVvdXQJCT0gYXRseF90eF90aW1lb3V0LAotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IGF0bHhfdmxhbl9yeF9yZWdpc3RlciwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gYXRsMV9wb2xsX2NvbnRyb2xsZXIsCiAjZW5kaWYKQEAgLTI5ODQsNyArMjk4NCw4IEBACiAJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHOwogCW5ldGRldi0+ZmVhdHVyZXMgfD0gKE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWCk7CiAKLQluZXRkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9TRyB8IE5FVElGX0ZfVFNPOworCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX0hXX0NTVU0gfCBORVRJRl9GX1NHIHwgTkVUSUZfRl9UU08gfAorCQkJICAgICAgTkVUSUZfRl9IV19WTEFOX1JYOwogCiAJLyogaXMgdGhpcyB2YWxpZD8gc2VlIGF0bDFfc2V0dXBfbWFjX2N0cmwoKSAqLwogCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9SWENTVU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGx4L2F0bDEuaCBiL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5oCmluZGV4IDY4ZGU4Y2IuLjEwOWQ2ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5oCisrKyBiL2RyaXZlcnMvbmV0L2F0bHgvYXRsMS5oCkBAIC03NTMsNyArNzUzLDYgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAogCXN0cnVjdCBhdGwxX3NmdF9zdGF0cyBzb2Z0X3N0YXRzOwotCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKIAl1MzIgcnhfYnVmZmVyX2xlbjsKIAl1MzIgd29sOwogCXUxNiBsaW5rX3NwZWVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRseC9hdGwyLmMgYi9kcml2ZXJzL25ldC9hdGx4L2F0bDIuYwppbmRleCAxNjI0OWU5Li5lMGY4N2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGx4L2F0bDIuYworKysgYi9kcml2ZXJzL25ldC9hdGx4L2F0bDIuYwpAQCAtMzExLDggKzMxMSw3IEBACiAJYWRhcHRlci0+dHhkX2RtYSA9IGFkYXB0ZXItPnJpbmdfZG1hIDsKIAlvZmZzZXQgPSAoYWRhcHRlci0+dHhkX2RtYSAmIDB4NykgPyAoOCAtIChhZGFwdGVyLT50eGRfZG1hICYgMHg3KSkgOiAwOwogCWFkYXB0ZXItPnR4ZF9kbWEgKz0gb2Zmc2V0OwotCWFkYXB0ZXItPnR4ZF9yaW5nID0gKHN0cnVjdCB0eF9wa3RfaGVhZGVyICopIChhZGFwdGVyLT5yaW5nX3Zpcl9hZGRyICsKLQkJb2Zmc2V0KTsKKwlhZGFwdGVyLT50eGRfcmluZyA9IGFkYXB0ZXItPnJpbmdfdmlyX2FkZHIgKyBvZmZzZXQ7CiAKIAkvKiBJbml0IFRYUyBSaW5nICovCiAJYWRhcHRlci0+dHhzX2RtYSA9IGFkYXB0ZXItPnR4ZF9kbWEgKyBhZGFwdGVyLT50eGRfcmluZ19zaXplOwpAQCAtMzYyLDM2ICszNjEsNTkgQEAKICAgICBzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKIH0KIAotI2lmZGVmIE5FVElGX0ZfSFdfVkxBTl9UWAotc3RhdGljIHZvaWQgYXRsMl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0Jc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3N0YXRpYyB2b2lkIF9fYXRsMl92bGFuX21vZGUodTMyIGZlYXR1cmVzLCB1MzIgKmN0cmwpCit7CisJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKSB7CisJCS8qIGVuYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KKwkJKmN0cmwgfD0gTUFDX0NUUkxfUk1WX1ZMQU47CisJfSBlbHNlIHsKKwkJLyogZGlzYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KKwkJKmN0cmwgJj0gfk1BQ19DVFJMX1JNVl9WTEFOOworCX0KK30KKworc3RhdGljIHZvaWQgYXRsMl92bGFuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQogewogCXN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXUzMiBjdHJsOwogCiAJYXRsMl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKLQlhZGFwdGVyLT52bGdycCA9IGdycDsKIAotCWlmIChncnApIHsKLQkJLyogZW5hYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLwotCQljdHJsID0gQVRMMl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJFR19NQUNfQ1RSTCk7Ci0JCWN0cmwgfD0gTUFDX0NUUkxfUk1WX1ZMQU47Ci0JCUFUTDJfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkVHX01BQ19DVFJMLCBjdHJsKTsKLQl9IGVsc2UgewotCQkvKiBkaXNhYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLwotCQljdHJsID0gQVRMMl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJFR19NQUNfQ1RSTCk7Ci0JCWN0cmwgJj0gfk1BQ19DVFJMX1JNVl9WTEFOOwotCQlBVEwyX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19NQUNfQ1RSTCwgY3RybCk7Ci0JfQorCWN0cmwgPSBBVEwyX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkVHX01BQ19DVFJMKTsKKwlfX2F0bDJfdmxhbl9tb2RlKGZlYXR1cmVzLCAmY3RybCk7CisJQVRMMl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfTUFDX0NUUkwsIGN0cmwpOwogCiAJYXRsMl9pcnFfZW5hYmxlKGFkYXB0ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBhdGwyX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyKQogewotCWF0bDJfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKKwlhdGwyX3ZsYW5fbW9kZShhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPm5ldGRldi0+ZmVhdHVyZXMpOwogfQotI2VuZGlmCisKK3N0YXRpYyB1MzIgYXRsMl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQoreworCS8qCisJICogU2luY2UgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2VwYXJhdGUgcngvdHggdmxhbiBhY2NlbAorCSAqIGVuYWJsZS9kaXNhYmxlIG1ha2Ugc3VyZSB0eCBmbGFnIGlzIGFsd2F5cyBpbiBzYW1lIHN0YXRlIGFzIHJ4LgorCSAqLworCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYOworCWVsc2UKKwkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfSFdfVkxBTl9UWDsKKworCXJldHVybiBmZWF0dXJlczsKK30KKworc3RhdGljIGludCBhdGwyX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCit7CisJdTMyIGNoYW5nZWQgPSBuZXRkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisKKwlpZiAoY2hhbmdlZCAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJYXRsMl92bGFuX21vZGUobmV0ZGV2LCBmZWF0dXJlcyk7CisKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIHZvaWQgYXRsMl9pbnRyX3J4KHN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CkBAIC00MjUsMTQgKzQ0NywxMyBAQAogCQkJbWVtY3B5KHNrYi0+ZGF0YSwgcnhkLT5wYWNrZXQsIHJ4X3NpemUpOwogCQkJc2tiX3B1dChza2IsIHJ4X3NpemUpOwogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsKLSNpZmRlZiBORVRJRl9GX0hXX1ZMQU5fVFgKLQkJCWlmIChhZGFwdGVyLT52bGdycCAmJiAocnhkLT5zdGF0dXMudmxhbikpIHsKKwkJCWlmIChyeGQtPnN0YXR1cy52bGFuKSB7CiAJCQkJdTE2IHZsYW5fdGFnID0gKHJ4ZC0+c3RhdHVzLnZ0YWc+PjQpIHwKIAkJCQkJKChyeGQtPnN0YXR1cy52dGFnJjcpIDw8IDEzKSB8CiAJCQkJCSgocnhkLT5zdGF0dXMudnRhZyY4KSA8PCA5KTsKLQkJCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBhZGFwdGVyLT52bGdycCwgdmxhbl90YWcpOwotCQkJfSBlbHNlCi0jZW5kaWYKKworCQkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGFuX3RhZyk7CisJCQl9CiAJCQluZXRpZl9yeChza2IpOwogCQkJbmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByeF9zaXplOwogCQkJbmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CkBAIC03MDUsOSArNzI2LDcgQEAKIAlhdGwyX3NldF9tdWx0aShuZXRkZXYpOwogCWluaXRfcmluZ19wdHJzKGFkYXB0ZXIpOwogCi0jaWZkZWYgTkVUSUZfRl9IV19WTEFOX1RYCiAJYXRsMl9yZXN0b3JlX3ZsYW4oYWRhcHRlcik7Ci0jZW5kaWYKIAogCWlmIChhdGwyX2NvbmZpZ3VyZShhZGFwdGVyKSkgewogCQllcnIgPSAtRUlPOwpAQCAtMTA4Myw5ICsxMTAyLDcgQEAKIAlhdGwyX3NldF9tdWx0aShuZXRkZXYpOwogCWluaXRfcmluZ19wdHJzKGFkYXB0ZXIpOwogCi0jaWZkZWYgTkVUSUZfRl9IV19WTEFOX1RYCiAJYXRsMl9yZXN0b3JlX3ZsYW4oYWRhcHRlcik7Ci0jZW5kaWYKIAogCWlmIChhdGwyX2NvbmZpZ3VyZShhZGFwdGVyKSkgewogCQllcnIgPSAtRUlPOwpAQCAtMTE0Niw4ICsxMTYzLDcgQEAKIAkJTUFDX0NUUkxfUFJNTEVOX1NISUZUKTsKIAogCS8qIHZsYW4gKi8KLQlpZiAoYWRhcHRlci0+dmxncnApCi0JCXZhbHVlIHw9IE1BQ19DVFJMX1JNVl9WTEFOOworCV9fYXRsMl92bGFuX21vZGUobmV0ZGV2LT5mZWF0dXJlcywgJnZhbHVlKTsKIAogCS8qIGZpbHRlciBtb2RlICovCiAJdmFsdWUgfD0gTUFDX0NUUkxfQkNfRU47CkBAIC0xMzEzLDkgKzEzMjksMTAgQEAKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGF0bDJfc2V0X21hYywKIAkubmRvX2NoYW5nZV9tdHUJCT0gYXRsMl9jaGFuZ2VfbXR1LAorCS5uZG9fZml4X2ZlYXR1cmVzCT0gYXRsMl9maXhfZmVhdHVyZXMsCisJLm5kb19zZXRfZmVhdHVyZXMJPSBhdGwyX3NldF9mZWF0dXJlcywKIAkubmRvX2RvX2lvY3RsCQk9IGF0bDJfaW9jdGwsCiAJLm5kb190eF90aW1lb3V0CQk9IGF0bDJfdHhfdGltZW91dCwKLQkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSBhdGwyX3ZsYW5fcnhfcmVnaXN0ZXIsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlcgk9IGF0bDJfcG9sbF9jb250cm9sbGVyLAogI2VuZGlmCkBAIC0xNDExLDcgKzE0MjgsNyBAQAogCiAJZXJyID0gLUVJTzsKIAotCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHOworCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19WTEFOX1JYOwogCW5ldGRldi0+ZmVhdHVyZXMgfD0gKE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWCk7CiAKIAkvKiBJbml0IFBIWSBhcyBlYXJseSBhcyBwb3NzaWJsZSBkdWUgdG8gcG93ZXIgc2F2aW5nIGlzc3VlICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRseC9hdGwyLmggYi9kcml2ZXJzL25ldC9hdGx4L2F0bDIuaAppbmRleCA5MjdlNGRlLi43ODM0NGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGx4L2F0bDIuaAorKysgYi9kcml2ZXJzL25ldC9hdGx4L2F0bDIuaApAQCAtNDUzLDkgKzQ1Myw2IEBACiAJLyogT1MgZGVmaW5lZCBzdHJ1Y3RzICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLSNpZmRlZiBORVRJRl9GX0hXX1ZMQU5fVFgKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7Ci0jZW5kaWYKIAl1MzIgd29sOwogCXUxNiBsaW5rX3NwZWVkOwogCXUxNiBsaW5rX2R1cGxleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bHgvYXRseC5jIGIvZHJpdmVycy9uZXQvYXRseC9hdGx4LmMKaW5kZXggYWZiN2Y3ZC4uYWFiY2Y0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRseC9hdGx4LmMKKysrIGIvZHJpdmVycy9uZXQvYXRseC9hdGx4LmMKQEAgLTIxMSw4ICsyMTEsMTggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGF0bHhfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCXN0cnVjdCB2bGFuX2dyb3VwICpncnApCitzdGF0aWMgdm9pZCBfX2F0bHhfdmxhbl9tb2RlKHUzMiBmZWF0dXJlcywgdTMyICpjdHJsKQoreworCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkgeworCQkvKiBlbmFibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCSpjdHJsIHw9IE1BQ19DVFJMX1JNVl9WTEFOOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCSpjdHJsICY9IH5NQUNfQ1RSTF9STVZfVkxBTjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0bHhfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgYXRseF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjIwLDI3ICsyMzAsNDAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CiAJLyogYXRseF9pcnFfZGlzYWJsZShhZGFwdGVyKTsgRklYTUU6IGNvbmZpcm0vcmVtb3ZlICovCi0JYWRhcHRlci0+dmxncnAgPSBncnA7Ci0KLQlpZiAoZ3JwKSB7Ci0JCS8qIGVuYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KLQkJY3RybCA9IGlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotCQljdHJsIHw9IE1BQ19DVFJMX1JNVl9WTEFOOwotCQlpb3dyaXRlMzIoY3RybCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUNfQ1RSTCk7Ci0JfSBlbHNlIHsKLQkJLyogZGlzYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KLQkJY3RybCA9IGlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotCQljdHJsICY9IH5NQUNfQ1RSTF9STVZfVkxBTjsKLQkJaW93cml0ZTMyKGN0cmwsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotCX0KLQorCWN0cmwgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwlfX2F0bHhfdmxhbl9tb2RlKGZlYXR1cmVzLCAmY3RybCk7CisJaW93cml0ZTMyKGN0cmwsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwogCS8qIGF0bHhfaXJxX2VuYWJsZShhZGFwdGVyKTsgRklYTUUgKi8KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0bHhfcmVzdG9yZV92bGFuKHN0cnVjdCBhdGx4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JYXRseF92bGFuX3J4X3JlZ2lzdGVyKGFkYXB0ZXItPm5ldGRldiwgYWRhcHRlci0+dmxncnApOworCWF0bHhfdmxhbl9tb2RlKGFkYXB0ZXItPm5ldGRldiwgYWRhcHRlci0+bmV0ZGV2LT5mZWF0dXJlcyk7Cit9CisKK3N0YXRpYyB1MzIgYXRseF9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQoreworCS8qCisJICogU2luY2UgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2VwYXJhdGUgcngvdHggdmxhbiBhY2NlbAorCSAqIGVuYWJsZS9kaXNhYmxlIG1ha2Ugc3VyZSB0eCBmbGFnIGlzIGFsd2F5cyBpbiBzYW1lIHN0YXRlIGFzIHJ4LgorCSAqLworCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYOworCWVsc2UKKwkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfSFdfVkxBTl9UWDsKKworCXJldHVybiBmZWF0dXJlczsKK30KKworc3RhdGljIGludCBhdGx4X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCit7CisJdTMyIGNoYW5nZWQgPSBuZXRkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisKKwlpZiAoY2hhbmdlZCAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJYXRseF92bGFuX21vZGUobmV0ZGV2LCBmZWF0dXJlcyk7CisKKwlyZXR1cm4gMDsKIH0KIAogI2VuZGlmIC8qIEFUTFhfQyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYjQ0LmMgYi9kcml2ZXJzL25ldC9iNDQuYwppbmRleCBhNjkzMzFlLi40MWVhODRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iNDQuYworKysgYi9kcml2ZXJzL25ldC9iNDQuYwpAQCAtNSw3ICs1LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNCBGbG9yaWFuIFNjaGlybWVyIChqb2x0QHR1eGJveC5vcmcpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRmVsaXggRmlldGthdSAobmJkQG9wZW53cnQub3JnKQogICogQ29weXJpZ2h0IChDKSAyMDA2IEJyb2FkY29tIENvcnBvcmF0aW9uLgotICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAqCiAgKiBEaXN0cmlidXRlIHVuZGVyIEdQTC4KICAqLwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTM4LDYgKzM5LDcgQEAKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJiNDQiCiAjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMi4wIgorI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JCSJCcm9hZGNvbSA0NHh4LzQ3eHggMTAvMTAwIFBDSSBldGhlcm5ldCBkcml2ZXIiCiAKICNkZWZpbmUgQjQ0X0RFRl9NU0dfRU5BQkxFCSAgXAogCShORVRJRl9NU0dfRFJWCQl8IFwKQEAgLTkwLDExICs5Miw4IEBACiAjZGVmaW5lIEI0NF9FVEhJUFY2VURQX0hMRU4JNjIKICNkZWZpbmUgQjQ0X0VUSElQVjRVRFBfSExFTgk0MgogCi1zdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9Ci0JRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIlxuIjsKLQogTU9EVUxFX0FVVEhPUigiRmVsaXggRmlldGthdSwgRmxvcmlhbiBTY2hpcm1lciwgUGVra2EgUGlldGlrYWluZW4sIERhdmlkIFMuIE1pbGxlciIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSA0NHh4LzQ3eHggMTAvMTAwIFBDSSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04pOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKIApAQCAtNjA5LDcgKzYwOCw3IEBACiAJCQkJIHNrYi0+bGVuLAogCQkJCSBETUFfVE9fREVWSUNFKTsKIAkJcnAtPnNrYiA9IE5VTEw7Ci0JCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAl9CiAKIAlicC0+dHhfY29ucyA9IGNvbnM7CkBAIC0yMTI5LDE2ICsyMTI4LDEzIEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBiNDRfaW5pdF9vbmUoc3RydWN0IHNzYl9kZXZpY2UgKnNkZXYsCiAJCQkJICBjb25zdCBzdHJ1Y3Qgc3NiX2RldmljZV9pZCAqZW50KQogewotCXN0YXRpYyBpbnQgYjQ0X3ZlcnNpb25fcHJpbnRlZCA9IDA7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgYjQ0ICpicDsKIAlpbnQgZXJyOwogCiAJaW5zdGFuY2UrKzsKIAotCWlmIChiNDRfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKLQkJcHJfaW5mbygiJXMiLCB2ZXJzaW9uKTsKLQorCXByX2luZm9fb25jZSgiJXMgdmVyc2lvbiAlc1xuIiwgRFJWX0RFU0NSSVBUSU9OLCBEUlZfTU9EVUxFX1ZFUlNJT04pOwogCiAJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpicCkpOwogCWlmICghZGV2KSB7CkBAIC0yMjI0LDggKzIyMjAsNyBAQAogCWlmIChiNDRfcGh5X3Jlc2V0KGJwKSA8IDApCiAJCWJwLT5waHlfYWRkciA9IEI0NF9QSFlfQUREUl9OT19QSFk7CiAKLQluZXRkZXZfaW5mbyhkZXYsICJCcm9hZGNvbSA0NHh4LzQ3eHggMTAvMTAwQmFzZVQgRXRoZXJuZXQgJXBNXG4iLAotCQkgICAgZGV2LT5kZXZfYWRkcik7CisJbmV0ZGV2X2luZm8oZGV2LCAiJXMgJXBNXG4iLCBEUlZfREVTQ1JJUFRJT04sIGRldi0+ZGV2X2FkZHIpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTIzMzUsNyArMjMzMCw3IEBACiAJLnJlc3VtZQkJPSBiNDRfcmVzdW1lLAogfTsKIAotc3RhdGljIGlubGluZSBpbnQgYjQ0X3BjaV9pbml0KHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQgYjQ0X3BjaV9pbml0KHZvaWQpCiB7CiAJaW50IGVyciA9IDA7CiAjaWZkZWYgQ09ORklHX0I0NF9QQ0kKQEAgLTIzNDQsNyArMjMzOSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGI0NF9wY2lfZXhpdCh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdCBiNDRfcGNpX2V4aXQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfQjQ0X1BDSQogCXNzYl9wY2lob3N0X3VucmVnaXN0ZXIoJmI0NF9wY2lfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JjbTYzeHhfZW5ldC5jIGIvZHJpdmVycy9uZXQvYmNtNjN4eF9lbmV0LmMKaW5kZXggZjE1NzNkNC4uMWQ5Yjk4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYmNtNjN4eF9lbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvYmNtNjN4eF9lbmV0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CkBAIC0xNjQ2LDcgKzE2NDcsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JaW9tZW1fc2l6ZSA9IHJlc19tZW0tPmVuZCAtIHJlc19tZW0tPnN0YXJ0ICsgMTsKKwlpb21lbV9zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXNfbWVtKTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXNfbWVtLT5zdGFydCwgaW9tZW1fc2l6ZSwgImJjbTYzeHhfZW5ldCIpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CkBAIC0xODYxLDcgKzE4NjIsNyBAQAogCS8qIHJlbGVhc2UgZGV2aWNlIHJlc291cmNlcyAqLwogCWlvdW5tYXAocHJpdi0+YmFzZSk7CiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAKIAkvKiBkaXNhYmxlIGh3IGJsb2NrIGNsb2NrcyAqLwogCWlmIChwcml2LT5waHlfY2xrKSB7CkBAIC0xODk3LDcgKzE4OTgsNyBAQAogCWlmICghcmVzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlvbWVtX3NpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCWlvbWVtX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgaW9tZW1fc2l6ZSwgImJjbTYzeHhfZW5ldF9kbWEiKSkKIAkJcmV0dXJuIC1FQlVTWTsKIApAQCAtMTkxNSw3ICsxOTE2LDcgQEAKIAogCWlvdW5tYXAoYmNtX2VuZXRfc2hhcmVkX2Jhc2UpOwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZW5ldC9iZS5oIGIvZHJpdmVycy9uZXQvYmVuZXQvYmUuaAppbmRleCBhN2RiODcwLi5jODU3NjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZW5ldC9iZS5oCisrKyBiL2RyaXZlcnMvbmV0L2JlbmV0L2JlLmgKQEAgLTIwLDcgKzIwLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgpAQCAtODcsNiArODYsNyBAQAogCiAjZGVmaW5lIE1BWF9SU1NfUVMJCTQJLyogQkUgbGltaXQgaXMgNCBxdWV1ZXMvcG9ydCAqLwogI2RlZmluZSBNQVhfUlhfUVMJCShNQVhfUlNTX1FTICsgMSkgLyogUlNTIHFzICsgMSBkZWYgUnggKi8KKyNkZWZpbmUgTUFYX1RYX1FTCQk4CiAjZGVmaW5lIEJFX01BWF9NU0lYX1ZFQ1RPUlMJKE1BWF9SWF9RUyArIDEpLyogUlggKyBUWCAqLwogI2RlZmluZSBCRV9OQVBJX1dFSUdIVAkJNjQKICNkZWZpbmUgTUFYX1JYX1BPU1QgCQlCRV9OQVBJX1dFSUdIVCAvKiBGcmFncyBwb3N0ZWQgYXQgYSB0aW1lICovCkBAIC0xNzAsNyArMTcwLDYgQEAKIAl1MzIgYmVfdHhfcmVxczsJCS8qIG51bWJlciBvZiBUWCByZXF1ZXN0cyBpbml0aWF0ZWQgKi8KIAl1MzIgYmVfdHhfc3RvcHM7CS8qIG51bWJlciBvZiB0aW1lcyBUWCBRIHdhcyBzdG9wcGVkICovCiAJdTMyIGJlX3R4X3dyYnM7CQkvKiBudW1iZXIgb2YgdHggV1JCcyB1c2VkICovCi0JdTMyIGJlX3R4X2V2ZW50czsJLyogbnVtYmVyIG9mIHR4IGNvbXBsZXRpb24gZXZlbnRzICAqLwogCXUzMiBiZV90eF9jb21wbDsJLyogbnVtYmVyIG9mIHR4IGNvbXBsZXRpb24gZW50cmllcyBwcm9jZXNzZWQgKi8KIAl1bG9uZyBiZV90eF9qaWZmaWVzOwogCXU2NCBiZV90eF9ieXRlczsKQEAgLTE4NCw2ICsxODMsNyBAQAogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGNxOwogCS8qIFJlbWVtYmVyIHRoZSBza2JzIHRoYXQgd2VyZSB0cmFuc21pdHRlZCAqLwogCXN0cnVjdCBza19idWZmICpzZW50X3NrYl9saXN0W1RYX1FfTEVOXTsKKwlzdHJ1Y3QgYmVfdHhfc3RhdHMgc3RhdHM7CiB9OwogCiAvKiBTdHJ1Y3QgdG8gcmVtZW1iZXIgdGhlIHBhZ2VzIHBvc3RlZCBmb3IgcnggZnJhZ3MgKi8KQEAgLTE5OSw2ICsxOTksNyBAQAogCXUzMiByeF9wb2xsczsJLyogbnVtYmVyIG9mIHRpbWVzIE5BUEkgY2FsbGVkIHBvbGwgZnVuY3Rpb24gKi8KIAl1MzIgcnhfZXZlbnRzOwkvKiBudW1iZXIgb2YgdWNhc3QgcnggY29tcGxldGlvbiBldmVudHMgICovCiAJdTMyIHJ4X2NvbXBsOwkvKiBudW1iZXIgb2YgcnggY29tcGxldGlvbiBlbnRyaWVzIHByb2Nlc3NlZCAqLworCXVsb25nIHJ4X2Ryb3BwZWQ7IC8qIG51bWJlciBvZiBza2IgYWxsb2NhdGlvbiBlcnJvcnMgKi8KIAl1bG9uZyByeF9qaWZmaWVzOwogCXU2NCByeF9ieXRlczsKIAl1NjQgcnhfYnl0ZXNfcHJldjsKQEAgLTMxOSw4ICszMjAsOCBAQAogCiAJLyogVFggUmluZ3MgKi8KIAlzdHJ1Y3QgYmVfZXFfb2JqIHR4X2VxOwotCXN0cnVjdCBiZV90eF9vYmogdHhfb2JqOwotCXN0cnVjdCBiZV90eF9zdGF0cyB0eF9zdGF0czsKKwlzdHJ1Y3QgYmVfdHhfb2JqIHR4X29ialtNQVhfVFhfUVNdOworCXU4IG51bV90eF9xczsKIAogCXUzMiBjYWNoZV9saW5lX2JyZWFrWzhdOwogCkBAIC0zMzIsNyArMzMzLDYgQEAKIAl1OCBlcV9uZXh0X2lkeDsKIAlzdHJ1Y3QgYmVfZHJ2X3N0YXRzIGRydl9zdGF0czsKIAotCXN0cnVjdCB2bGFuX2dyb3VwICp2bGFuX2dycDsKIAl1MTYgdmxhbnNfYWRkZWQ7CiAJdTE2IG1heF92bGFuczsJLyogTnVtYmVyIG9mIHZsYW5zIHN1cHBvcnRlZCAqLwogCXU4IHZsYW5fdGFnW1ZMQU5fTl9WSURdOwpAQCAtMzkxLDcgKzM5MSw3IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJlX2V0aHRvb2xfb3BzOwogCiAjZGVmaW5lIG1zaXhfZW5hYmxlZChhZGFwdGVyKQkJKGFkYXB0ZXItPm51bV9tc2l4X3ZlYyA+IDApCi0jZGVmaW5lIHR4X3N0YXRzKGFkYXB0ZXIpCQkoJmFkYXB0ZXItPnR4X3N0YXRzKQorI2RlZmluZSB0eF9zdGF0cyh0eG8pCQkJKCZ0eG8tPnN0YXRzKQogI2RlZmluZSByeF9zdGF0cyhyeG8pCQkJKCZyeG8tPnN0YXRzKQogCiAjZGVmaW5lIEJFX1NFVF9ORVRERVZfT1BTKG5ldGRldiwgb3BzKQkobmV0ZGV2LT5uZXRkZXZfb3BzID0gb3BzKQpAQCAtNDA1LDYgKzQwNSwxMCBAQAogCWZvciAoaSA9IDAsIHJ4byA9ICZhZGFwdGVyLT5yeF9vYmpbaSsxXTsgaSA8IChhZGFwdGVyLT5udW1fcnhfcXMgLSAxKTtcCiAJCWkrKywgcnhvKyspCiAKKyNkZWZpbmUgZm9yX2FsbF90eF9xdWV1ZXMoYWRhcHRlciwgdHhvLCBpKQkJCQlcCisJZm9yIChpID0gMCwgdHhvID0gJmFkYXB0ZXItPnR4X29ialtpXTsgaSA8IGFkYXB0ZXItPm51bV90eF9xczsJXAorCQlpKyssIHR4bysrKQorCiAjZGVmaW5lIFBBR0VfU0hJRlRfNEsJCTEyCiAjZGVmaW5lIFBBR0VfU0laRV80SwkJKDEgPDwgUEFHRV9TSElGVF80SykKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYmVuZXQvYmVfY21kcy5jIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfY21kcy5jCmluZGV4IDgxNjU0YWUuLjA1NGZhNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2NtZHMuYworKysgYi9kcml2ZXJzL25ldC9iZW5ldC9iZV9jbWRzLmMKQEAgLTEwNiwxNCArMTA2LDI0IEBACiAJCQluZXRkZXZfc3RhdHNfdXBkYXRlKGFkYXB0ZXIpOwogCQkJYWRhcHRlci0+c3RhdHNfY21kX3NlbnQgPSBmYWxzZTsKIAkJfQotCX0gZWxzZSBpZiAoKGNvbXBsX3N0YXR1cyAhPSBNQ0NfU1RBVFVTX05PVF9TVVBQT1JURUQpICYmCi0JCSAgIChjb21wbC0+dGFnMCAhPSBPUENPREVfQ09NTU9OX05UV0tfTUFDX1FVRVJZKSkgewotCQlleHRkX3N0YXR1cyA9IChjb21wbC0+c3RhdHVzID4+IENRRV9TVEFUVVNfRVhURF9TSElGVCkgJgotCQkJCUNRRV9TVEFUVVNfRVhURF9NQVNLOwotCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkiRXJyb3IgaW4gY21kIGNvbXBsZXRpb24gLSBvcGNvZGUgJWQsIGNvbXBsICVkLCBleHRkICVkXG4iLAotCQkJY29tcGwtPnRhZzAsIGNvbXBsX3N0YXR1cywgZXh0ZF9zdGF0dXMpOworCX0gZWxzZSB7CisJCWlmIChjb21wbF9zdGF0dXMgPT0gTUNDX1NUQVRVU19OT1RfU1VQUE9SVEVEIHx8CisJCQljb21wbF9zdGF0dXMgPT0gTUNDX1NUQVRVU19JTExFR0FMX1JFUVVFU1QpCisJCQlnb3RvIGRvbmU7CisKKwkJaWYgKGNvbXBsX3N0YXR1cyA9PSBNQ0NfU1RBVFVTX1VOQVVUSE9SSVpFRF9SRVFVRVNUKSB7CisJCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiVGhpcyBkb21haW4oVk0pIGlzIG5vdCAiCisJCQkJInBlcm1pdHRlZCB0byBleGVjdXRlIHRoaXMgY21kIChvcGNvZGUgJWQpXG4iLAorCQkJCWNvbXBsLT50YWcwKTsKKwkJfSBlbHNlIHsKKwkJCWV4dGRfc3RhdHVzID0gKGNvbXBsLT5zdGF0dXMgPj4gQ1FFX1NUQVRVU19FWFREX1NISUZUKSAmCisJCQkJCUNRRV9TVEFUVVNfRVhURF9NQVNLOworCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiQ21kIChvcGNvZGUgJWQpIGZhaWxlZDoiCisJCQkJInN0YXR1cyAlZCwgZXh0ZC1zdGF0dXMgJWRcbiIsCisJCQkJY29tcGwtPnRhZzAsIGNvbXBsX3N0YXR1cywgZXh0ZF9zdGF0dXMpOworCQl9CiAJfQorZG9uZToKIAlyZXR1cm4gY29tcGxfc3RhdHVzOwogfQogCkBAIC03OTksMTIgKzgwOSwxMiBAQAogCXJldHVybiBsZW5fZW5jb2RlZDsKIH0KIAotaW50IGJlX2NtZF9tY2NxX2NyZWF0ZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKK2ludCBiZV9jbWRfbWNjcV9leHRfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAogCQkJc3RydWN0IGJlX3F1ZXVlX2luZm8gKm1jY3EsCiAJCQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3EpCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKLQlzdHJ1Y3QgYmVfY21kX3JlcV9tY2NfY3JlYXRlICpyZXE7CisJc3RydWN0IGJlX2NtZF9yZXFfbWNjX2V4dF9jcmVhdGUgKnJlcTsKIAlzdHJ1Y3QgYmVfZG1hX21lbSAqcV9tZW0gPSAmbWNjcS0+ZG1hX21lbTsKIAl2b2lkICpjdHh0OwogCWludCBzdGF0dXM7CkBAIC04NTksNiArODY5LDY3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAoraW50IGJlX2NtZF9tY2NxX29yZ19jcmVhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqbWNjcSwKKwkJCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSkKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOworCXN0cnVjdCBiZV9jbWRfcmVxX21jY19jcmVhdGUgKnJlcTsKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqcV9tZW0gPSAmbWNjcS0+ZG1hX21lbTsKKwl2b2lkICpjdHh0OworCWludCBzdGF0dXM7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwdGVyLT5tYm94X2xvY2spKQorCQlyZXR1cm4gLTE7CisKKwl3cmIgPSB3cmJfZnJvbV9tYm94KGFkYXB0ZXIpOworCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwljdHh0ID0gJnJlcS0+Y29udGV4dDsKKworCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCwKKwkJCU9QQ09ERV9DT01NT05fTUNDX0NSRUFURSk7CisKKwliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKKwkJCU9QQ09ERV9DT01NT05fTUNDX0NSRUFURSwgc2l6ZW9mKCpyZXEpKTsKKworCXJlcS0+bnVtX3BhZ2VzID0gY3B1X3RvX2xlMTYoUEFHRVNfNEtfU1BBTk5FRChxX21lbS0+dmEsIHFfbWVtLT5zaXplKSk7CisKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX21jY19jb250ZXh0X2JlLCB2YWxpZCwgY3R4dCwgMSk7CisJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9tY2NfY29udGV4dF9iZSwgcmluZ19zaXplLCBjdHh0LAorCQkJYmVfZW5jb2RlZF9xX2xlbihtY2NxLT5sZW4pKTsKKwlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX21jY19jb250ZXh0X2JlLCBjcV9pZCwgY3R4dCwgY3EtPmlkKTsKKworCWJlX2R3c19jcHVfdG9fbGUoY3R4dCwgc2l6ZW9mKHJlcS0+Y29udGV4dCkpOworCisJYmVfY21kX3BhZ2VfYWRkcnNfcHJlcGFyZShyZXEtPnBhZ2VzLCBBUlJBWV9TSVpFKHJlcS0+cGFnZXMpLCBxX21lbSk7CisKKwlzdGF0dXMgPSBiZV9tYm94X25vdGlmeV93YWl0KGFkYXB0ZXIpOworCWlmICghc3RhdHVzKSB7CisJCXN0cnVjdCBiZV9jbWRfcmVzcF9tY2NfY3JlYXRlICpyZXNwID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCQltY2NxLT5pZCA9IGxlMTZfdG9fY3B1KHJlc3AtPmlkKTsKKwkJbWNjcS0+Y3JlYXRlZCA9IHRydWU7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tYm94X2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBiZV9jbWRfbWNjcV9jcmVhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqbWNjcSwKKwkJCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSkKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gYmVfY21kX21jY3FfZXh0X2NyZWF0ZShhZGFwdGVyLCBtY2NxLCBjcSk7CisJaWYgKHN0YXR1cyAmJiAhbGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgIlVwZ3JhZGUgdG8gRi9XIHZlciAyLjEwMi4yMzUuMCAiCisJCQkib3IgbmV3ZXIgdG8gYXZvaWQgY29uZmxpY3RpbmcgcHJpb3JpdGllcyBiZXR3ZWVuIE5JQyAiCisJCQkiYW5kIEZDb0UgdHJhZmZpYyIpOworCQlzdGF0dXMgPSBiZV9jbWRfbWNjcV9vcmdfY3JlYXRlKGFkYXB0ZXIsIG1jY3EsIGNxKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKwogaW50IGJlX2NtZF90eHFfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAogCQkJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4cSwKIAkJCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSkKQEAgLTkxMyw3ICs5ODQsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qIFVzZXMgbWJveCAqLworLyogVXNlcyBNQ0MgKi8KIGludCBiZV9jbWRfcnhxX2NyZWF0ZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKIAkJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnJ4cSwgdTE2IGNxX2lkLCB1MTYgZnJhZ19zaXplLAogCQl1MTYgbWF4X2ZyYW1lX3NpemUsIHUzMiBpZl9pZCwgdTMyIHJzcywgdTggKnJzc19pZCkKQEAgLTkyMywxMCArOTk0LDEzIEBACiAJc3RydWN0IGJlX2RtYV9tZW0gKnFfbWVtID0gJnJ4cS0+ZG1hX21lbTsKIAlpbnQgc3RhdHVzOwogCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWRhcHRlci0+bWJveF9sb2NrKSkKLQkJcmV0dXJuIC0xOworCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOwogCi0Jd3JiID0gd3JiX2Zyb21fbWJveChhZGFwdGVyKTsKKwl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOworCWlmICghd3JiKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAogCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCwKQEAgLTk0Myw3ICsxMDE3LDcgQEAKIAlyZXEtPm1heF9mcmFtZV9zaXplID0gY3B1X3RvX2xlMTYobWF4X2ZyYW1lX3NpemUpOwogCXJlcS0+cnNzX3F1ZXVlID0gY3B1X3RvX2xlMzIocnNzKTsKIAotCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5X3dhaXQoYWRhcHRlcik7CisJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogCWlmICghc3RhdHVzKSB7CiAJCXN0cnVjdCBiZV9jbWRfcmVzcF9ldGhfcnhfY3JlYXRlICpyZXNwID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCQlyeHEtPmlkID0gbGUxNl90b19jcHUocmVzcC0+aWQpOwpAQCAtOTUxLDggKzEwMjUsOCBAQAogCQkqcnNzX2lkID0gcmVzcC0+cnNzX2lkOwogCX0KIAotCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWJveF9sb2NrKTsKLQorZXJyOgorCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTAwNyw5ICsxMDgxLDQwIEBACiAJcmVxLT5pZCA9IGNwdV90b19sZTE2KHEtPmlkKTsKIAogCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5X3dhaXQoYWRhcHRlcik7CisJaWYgKCFzdGF0dXMpCisJCXEtPmNyZWF0ZWQgPSBmYWxzZTsKIAogCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWJveF9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQogCisvKiBVc2VzIE1DQyAqLworaW50IGJlX2NtZF9yeHFfZGVzdHJveShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGJlX3F1ZXVlX2luZm8gKnEpCit7CisJc3RydWN0IGJlX21jY193cmIgKndyYjsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9xX2Rlc3Ryb3kgKnJlcTsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisKKwl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOworCWlmICghd3JiKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKworCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCwgT1BDT0RFX0VUSF9SWF9ERVNUUk9ZKTsKKwliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0VUSCwgT1BDT0RFX0VUSF9SWF9ERVNUUk9ZLAorCQlzaXplb2YoKnJlcSkpOworCXJlcS0+aWQgPSBjcHVfdG9fbGUxNihxLT5pZCk7CisKKwlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CisJaWYgKCFzdGF0dXMpCisJCXEtPmNyZWF0ZWQgPSBmYWxzZTsKKworZXJyOgorCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjI3Myw4ICsyMzc4LDcgQEAKIAogCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAJaWYgKCFzdGF0dXMpIHsKLQkJYXR0cmlicyA9IChzdHJ1Y3QgbWdtdF9jb250cm9sbGVyX2F0dHJpYiAqKSggYXR0cmlic19jbWQudmEgKwotCQkJCQlzaXplb2Yoc3RydWN0IGJlX2NtZF9yZXNwX2hkcikpOworCQlhdHRyaWJzID0gYXR0cmlic19jbWQudmEgKyBzaXplb2Yoc3RydWN0IGJlX2NtZF9yZXNwX2hkcik7CiAJCWFkYXB0ZXItPmhiYV9wb3J0X251bSA9IGF0dHJpYnMtPmhiYV9hdHRyaWJzLnBoeV9wb3J0OwogCX0KIApAQCAtMjI4Niw3ICsyMzkwLDcgQEAKIH0KIAogLyogVXNlcyBtYm94ICovCi1pbnQgYmVfY21kX2NoZWNrX25hdGl2ZV9tb2RlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoraW50IGJlX2NtZF9yZXFfbmF0aXZlX21vZGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9zZXRfZnVuY19jYXAgKnJlcTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2NtZHMuaCBiL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2NtZHMuaAppbmRleCA4MTQ4Y2M2Li44ZTRkNDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZW5ldC9iZV9jbWRzLmgKKysrIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfY21kcy5oCkBAIC01MSwxNyArNTEsMTIgQEAKIAogLyogQ29tcGxldGlvbiBTdGF0dXMgKi8KIGVudW0gewotCU1DQ19TVEFUVVNfU1VDQ0VTUyA9IDB4MCwKLS8qIFRoZSBjbGllbnQgZG9lcyBub3QgaGF2ZSBzdWZmaWNpZW50IHByaXZpbGVnZXMgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCAqLwotCU1DQ19TVEFUVVNfSU5TVUZGSUNJRU5UX1BSSVZJTEVHRVMgPSAweDEsCi0vKiBBIHBhcmFtZXRlciBpbiB0aGUgY29tbWFuZCB3YXMgaW52YWxpZC4gKi8KLQlNQ0NfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSID0gMHgyLAotLyogVGhlcmUgYXJlIGluc3VmZmljaWVudCBjaGlwIHJlc291cmNlcyB0byBleGVjdXRlIHRoZSBjb21tYW5kICovCi0JTUNDX1NUQVRVU19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTID0gMHgzLAotLyogVGhlIGNvbW1hbmQgaXMgY29tcGxldGluZyBiZWNhdXNlIHRoZSBxdWV1ZSB3YXMgZ2V0dGluZyBmbHVzaGVkICovCi0JTUNDX1NUQVRVU19RVUVVRV9GTFVTSElORyA9IDB4NCwKLS8qIFRoZSBjb21tYW5kIGlzIGNvbXBsZXRpbmcgd2l0aCBhIERNQSBlcnJvciAqLwotCU1DQ19TVEFUVVNfRE1BX0ZBSUxFRCA9IDB4NSwKKwlNQ0NfU1RBVFVTX1NVQ0NFU1MgPSAwLAorCU1DQ19TVEFUVVNfRkFJTEVEID0gMSwKKwlNQ0NfU1RBVFVTX0lMTEVHQUxfUkVRVUVTVCA9IDIsCisJTUNDX1NUQVRVU19JTExFR0FMX0ZJRUxEID0gMywKKwlNQ0NfU1RBVFVTX0lOU1VGRklDSUVOVF9CVUZGRVIgPSA0LAorCU1DQ19TVEFUVVNfVU5BVVRIT1JJWkVEX1JFUVVFU1QgPSA1LAogCU1DQ19TVEFUVVNfTk9UX1NVUFBPUlRFRCA9IDY2CiB9OwogCkBAIC00MzQsNiArNDI5LDE0IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKIAl1MTYgbnVtX3BhZ2VzOwogCXUxNiBjcV9pZDsKKwl1OCBjb250ZXh0W3NpemVvZihzdHJ1Y3QgYW1hcF9tY2NfY29udGV4dF9iZSkgLyA4XTsKKwlzdHJ1Y3QgcGh5c19hZGRyIHBhZ2VzWzhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGJlX2NtZF9yZXFfbWNjX2V4dF9jcmVhdGUgeworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTE2IG51bV9wYWdlczsKKwl1MTYgY3FfaWQ7CiAJdTMyIGFzeW5jX2V2ZW50X2JpdG1hcFsxXTsKIAl1OCBjb250ZXh0W3NpemVvZihzdHJ1Y3QgYW1hcF9tY2NfY29udGV4dF9iZSkgLyA4XTsKIAlzdHJ1Y3QgcGh5c19hZGRyIHBhZ2VzWzhdOwpAQCAtMTQ3OSw2ICsxNDgyLDggQEAKIAkJCXUzMiByc3MsIHU4ICpyc3NfaWQpOwogZXh0ZXJuIGludCBiZV9jbWRfcV9kZXN0cm95KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqcSwKIAkJCWludCB0eXBlKTsKK2V4dGVybiBpbnQgYmVfY21kX3J4cV9kZXN0cm95KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAorCQkJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnEpOwogZXh0ZXJuIGludCBiZV9jbWRfbGlua19zdGF0dXNfcXVlcnkoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQlib29sICpsaW5rX3VwLCB1OCAqbWFjX3NwZWVkLCB1MTYgKmxpbmtfc3BlZWQsIHUzMiBkb20pOwogZXh0ZXJuIGludCBiZV9jbWRfcmVzZXQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtMTU0MCw3ICsxNTQ1LDcgQEAKIGV4dGVybiB2b2lkIGJlX2RldGVjdF9kdW1wX3VlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKIGV4dGVybiBpbnQgYmVfY21kX2dldF9kaWVfdGVtcGVyYXR1cmUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogZXh0ZXJuIGludCBiZV9jbWRfZ2V0X2NudGxfYXR0cmlidXRlcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcik7Ci1leHRlcm4gaW50IGJlX2NtZF9jaGVja19uYXRpdmVfbW9kZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gaW50IGJlX2NtZF9yZXFfbmF0aXZlX21vZGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogZXh0ZXJuIGludCBiZV9jbWRfZ2V0X3JlZ19sZW4oc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiAqbG9nX3NpemUpOwogZXh0ZXJuIHZvaWQgYmVfY21kX2dldF9yZWdzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgYnVmX2xlbiwgdm9pZCAqYnVmKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYmVuZXQvYmVfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfZXRodG9vbC5jCmluZGV4IGZhY2ZlM2MuLjdmZDgxMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9iZW5ldC9iZV9ldGh0b29sLmMKQEAgLTUyLDEyICs1Miw3IEBACiAJe05FVFNUQVRfSU5GTyh0eF9lcnJvcnMpfSwKIAl7TkVUU1RBVF9JTkZPKHJ4X2Ryb3BwZWQpfSwKIAl7TkVUU1RBVF9JTkZPKHR4X2Ryb3BwZWQpfSwKLQl7RFJWU1RBVF9UWF9JTkZPKGJlX3R4X3JhdGUpfSwKLQl7RFJWU1RBVF9UWF9JTkZPKGJlX3R4X3JlcXMpfSwKLQl7RFJWU1RBVF9UWF9JTkZPKGJlX3R4X3dyYnMpfSwKLQl7RFJWU1RBVF9UWF9JTkZPKGJlX3R4X3N0b3BzKX0sCi0Je0RSVlNUQVRfVFhfSU5GTyhiZV90eF9ldmVudHMpfSwKLQl7RFJWU1RBVF9UWF9JTkZPKGJlX3R4X2NvbXBsKX0sCisJe0RSVlNUQVRfSU5GTyhiZV90eF9ldmVudHMpfSwKIAl7RFJWU1RBVF9JTkZPKHJ4X2NyY19lcnJvcnMpfSwKIAl7RFJWU1RBVF9JTkZPKHJ4X2FsaWdubWVudF9zeW1ib2xfZXJyb3JzKX0sCiAJe0RSVlNUQVRfSU5GTyhyeF9wYXVzZV9mcmFtZXMpfSwKQEAgLTEwNywxMCArMTAyLDIxIEBACiAJe0RSVlNUQVRfUlhfSU5GTyhyeF9jb21wbCl9LAogCXtEUlZTVEFUX1JYX0lORk8ocnhfbWNhc3RfcGt0cyl9LAogCXtEUlZTVEFUX1JYX0lORk8ocnhfcG9zdF9mYWlsKX0sCisJe0RSVlNUQVRfUlhfSU5GTyhyeF9kcm9wcGVkKX0sCiAJe0VSWFNUQVRfSU5GTyhyeF9kcm9wc19ub19mcmFnbWVudHMpfQogfTsKICNkZWZpbmUgRVRIVE9PTF9SWFNUQVRTX05VTSAoQVJSQVlfU0laRShldF9yeF9zdGF0cykpCiAKKy8qIFN0YXRzIHJlbGF0ZWQgdG8gbXVsdGkgVFggcXVldWVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGJlX2V0aHRvb2xfc3RhdCBldF90eF9zdGF0c1tdID0geworCXtEUlZTVEFUX1RYX0lORk8oYmVfdHhfcmF0ZSl9LAorCXtEUlZTVEFUX1RYX0lORk8oYmVfdHhfcmVxcyl9LAorCXtEUlZTVEFUX1RYX0lORk8oYmVfdHhfd3Jicyl9LAorCXtEUlZTVEFUX1RYX0lORk8oYmVfdHhfc3RvcHMpfSwKKwl7RFJWU1RBVF9UWF9JTkZPKGJlX3R4X2NvbXBsKX0KK307CisjZGVmaW5lIEVUSFRPT0xfVFhTVEFUU19OVU0gKEFSUkFZX1NJWkUoZXRfdHhfc3RhdHMpKQorCiBzdGF0aWMgY29uc3QgY2hhciBldF9zZWxmX3Rlc3RzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKIAkiTUFDIExvb3BiYWNrIHRlc3QiLAogCSJQSFkgTG9vcGJhY2sgdGVzdCIsCkBAIC0yNTMsMTcgKzI1OSwxNSBAQAogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgYmVfcnhfb2JqICpyeG87CisJc3RydWN0IGJlX3R4X29iaiAqdHhvOwogCXZvaWQgKnAgPSBOVUxMOwotCWludCBpLCBqOworCWludCBpLCBqLCBiYXNlOwogCiAJZm9yIChpID0gMDsgaSA8IEVUSFRPT0xfU1RBVFNfTlVNOyBpKyspIHsKIAkJc3dpdGNoIChldF9zdGF0c1tpXS50eXBlKSB7CiAJCWNhc2UgTkVUU1RBVDoKIAkJCXAgPSAmbmV0ZGV2LT5zdGF0czsKIAkJCWJyZWFrOwotCQljYXNlIERSVlNUQVRfVFg6Ci0JCQlwID0gJmFkYXB0ZXItPnR4X3N0YXRzOwotCQkJYnJlYWs7CiAJCWNhc2UgRFJWU1RBVDoKIAkJCXAgPSAmYWRhcHRlci0+ZHJ2X3N0YXRzOwogCQkJYnJlYWs7CkBAIC0yNzQsNiArMjc4LDcgQEAKIAkJCQkqKHU2NCAqKXA6ICoodTMyICopcDsKIAl9CiAKKwliYXNlID0gRVRIVE9PTF9TVEFUU19OVU07CiAJZm9yX2FsbF9yeF9xdWV1ZXMoYWRhcHRlciwgcnhvLCBqKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBFVEhUT09MX1JYU1RBVFNfTlVNOyBpKyspIHsKIAkJCXN3aXRjaCAoZXRfcnhfc3RhdHNbaV0udHlwZSkgewpAQCAtMjg1LDExICsyOTAsMjEgQEAKIAkJCQkJCQkJcnhvLT5xLmlkOwogCQkJCWJyZWFrOwogCQkJfQotCQkJZGF0YVtFVEhUT09MX1NUQVRTX05VTSArIGogKiBFVEhUT09MX1JYU1RBVFNfTlVNICsgaV0gPQorCQkJZGF0YVtiYXNlICsgaiAqIEVUSFRPT0xfUlhTVEFUU19OVU0gKyBpXSA9CiAJCQkJKGV0X3J4X3N0YXRzW2ldLnNpemUgPT0gc2l6ZW9mKHU2NCkpID8KIAkJCQkJKih1NjQgKilwOiAqKHUzMiAqKXA7CiAJCX0KIAl9CisKKwliYXNlID0gRVRIVE9PTF9TVEFUU19OVU0gKyBhZGFwdGVyLT5udW1fcnhfcXMgKiBFVEhUT09MX1JYU1RBVFNfTlVNOworCWZvcl9hbGxfdHhfcXVldWVzKGFkYXB0ZXIsIHR4bywgaikgeworCQlmb3IgKGkgPSAwOyBpIDwgRVRIVE9PTF9UWFNUQVRTX05VTTsgaSsrKSB7CisJCQlwID0gKHU4ICopJnR4by0+c3RhdHMgKyBldF90eF9zdGF0c1tpXS5vZmZzZXQ7CisJCQlkYXRhW2Jhc2UgKyBqICogRVRIVE9PTF9UWFNUQVRTX05VTSArIGldID0KKwkJCQkoZXRfdHhfc3RhdHNbaV0uc2l6ZSA9PSBzaXplb2YodTY0KSkgPworCQkJCQkqKHU2NCAqKXA6ICoodTMyICopcDsKKwkJfQorCX0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTMxMiw2ICszMjcsMTMgQEAKIAkJCQlkYXRhICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJCX0KIAkJfQorCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3R4X3FzOyBpKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCBFVEhUT09MX1RYU1RBVFNfTlVNOyBqKyspIHsKKwkJCQlzcHJpbnRmKGRhdGEsICJ0eHElZDogJXMiLCBpLAorCQkJCQlldF90eF9zdGF0c1tqXS5kZXNjKTsKKwkJCQlkYXRhICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJCX0KKwkJfQogCQlicmVhazsKIAljYXNlIEVUSF9TU19URVNUOgogCQlmb3IgKGkgPSAwOyBpIDwgRVRIVE9PTF9URVNUU19OVU07IGkrKykgewpAQCAtMzMxLDcgKzM1Myw4IEBACiAJCXJldHVybiBFVEhUT09MX1RFU1RTX05VTTsKIAljYXNlIEVUSF9TU19TVEFUUzoKIAkJcmV0dXJuIEVUSFRPT0xfU1RBVFNfTlVNICsKLQkJCWFkYXB0ZXItPm51bV9yeF9xcyAqIEVUSFRPT0xfUlhTVEFUU19OVU07CisJCQlhZGFwdGVyLT5udW1fcnhfcXMgKiBFVEhUT09MX1JYU1RBVFNfTlVNICsKKwkJCWFkYXB0ZXItPm51bV90eF9xcyAqIEVUSFRPT0xfVFhTVEFUU19OVU07CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzg2LDcgKzQwOSw3IEBACiAJCX0KIAkJc3RhdHVzID0gYmVfY21kX2dldF9waHlfaW5mbyhhZGFwdGVyLCAmcGh5X2NtZCk7CiAJCWlmICghc3RhdHVzKSB7Ci0JCQlyZXNwID0gKHN0cnVjdCBiZV9jbWRfcmVzcF9nZXRfcGh5X2luZm8gKikgcGh5X2NtZC52YTsKKwkJCXJlc3AgPSBwaHlfY21kLnZhOwogCQkJaW50Zl90eXBlID0gbGUxNl90b19jcHUocmVzcC0+aW50ZXJmYWNlX3R5cGUpOwogCiAJCQlzd2l0Y2ggKGludGZfdHlwZSkgewpAQCAtNDU3LDEwICs0ODAsMTAgQEAKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlyaW5nLT5yeF9tYXhfcGVuZGluZyA9IGFkYXB0ZXItPnJ4X29ialswXS5xLmxlbjsKLQlyaW5nLT50eF9tYXhfcGVuZGluZyA9IGFkYXB0ZXItPnR4X29iai5xLmxlbjsKKwlyaW5nLT50eF9tYXhfcGVuZGluZyA9IGFkYXB0ZXItPnR4X29ialswXS5xLmxlbjsKIAogCXJpbmctPnJ4X3BlbmRpbmcgPSBhdG9taWNfcmVhZCgmYWRhcHRlci0+cnhfb2JqWzBdLnEudXNlZCk7Ci0JcmluZy0+dHhfcGVuZGluZyA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT50eF9vYmoucS51c2VkKTsKKwlyaW5nLT50eF9wZW5kaW5nID0gYXRvbWljX3JlYWQoJmFkYXB0ZXItPnR4X29ialswXS5xLnVzZWQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNjkwLDcgKzcxMyw3IEBACiAJc3RhdHVzID0gYmVfY21kX2dldF9zZWVwcm9tX2RhdGEoYWRhcHRlciwgJmVlcHJvbV9jbWQpOwogCiAJaWYgKCFzdGF0dXMpIHsKLQkJcmVzcCA9IChzdHJ1Y3QgYmVfY21kX3Jlc3Bfc2VlcHJvbV9yZWFkICopIGVlcHJvbV9jbWQudmE7CisJCXJlc3AgPSBlZXByb21fY21kLnZhOwogCQltZW1jcHkoZGF0YSwgcmVzcC0+c2VlcHJvbV9kYXRhICsgZWVwcm9tLT5vZmZzZXQsIGVlcHJvbS0+bGVuKTsKIAl9CiAJZG1hX2ZyZWVfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwgZWVwcm9tX2NtZC5zaXplLCBlZXByb21fY21kLnZhLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYmVuZXQvYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfbWFpbi5jCmluZGV4IGE0ODVmN2YuLmM0MTFiYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9iZW5ldC9iZV9tYWluLmMKQEAgLTMzLDEwICszMyw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKHJ4X2ZyYWdfc2l6ZSwgIlNpemUgb2YgYSBmcmFnbWVudCB0aGF0IGhvbGRzIHJjdmQgZGF0YS4iKTsKIE1PRFVMRV9QQVJNX0RFU0MobnVtX3ZmcywgIk51bWJlciBvZiBQQ0kgVkZzIHRvIGluaXRpYWxpemUiKTsKIAotc3RhdGljIGJvb2wgbXVsdGlfcnhxID0gdHJ1ZTsKLW1vZHVsZV9wYXJhbShtdWx0aV9yeHEsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0MobXVsdGlfcnhxLCAiTXVsdGkgUnggUXVldWUgc3VwcG9ydC4gRW5hYmxlZCBieSBkZWZhdWx0Iik7Ci0KIHN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShiZV9kZXZfaWRzKSA9IHsKIAl7IFBDSV9ERVZJQ0UoQkVfVkVORE9SX0lELCBCRV9ERVZJQ0VfSUQxKSB9LAogCXsgUENJX0RFVklDRShCRV9WRU5ET1JfSUQsIEJFX0RFVklDRV9JRDIpIH0sCkBAIC00OCw3ICs0NCw3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJlX2Rldl9pZHMpOwogLyogVUUgU3RhdHVzIExvdyBDU1IgKi8KLXN0YXRpYyBjaGFyICp1ZV9zdGF0dXNfbG93X2Rlc2NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWVfc3RhdHVzX2xvd19kZXNjW10gPSB7CiAJIkNFViIsCiAJIkNUWCIsCiAJIkRCVUYiLApAQCAtODMsNyArNzksNyBAQAogCSJNUFVfSU5UUEVORCIKIH07CiAvKiBVRSBTdGF0dXMgSGlnaCBDU1IgKi8KLXN0YXRpYyBjaGFyICp1ZV9zdGF0dXNfaGlfZGVzY1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1ZV9zdGF0dXNfaGlfZGVzY1tdID0gewogCSJMUENNRU1IT1NUIiwKIAkiTUdNVF9NQUMiLAogCSJQQ1MwT05MSU5FIiwKQEAgLTEwNyw3ICsxMDMsNyBAQAogCSJIT1NUNyIsCiAJIkhPU1Q4IiwKIAkiSE9TVDkiLAotCSJORVRDIgorCSJORVRDIiwKIAkiVW5rbm93biIsCiAJIlVua25vd24iLAogCSJVbmtub3duIiwKQEAgLTM2Miw4ICszNTgsOCBAQAogCWRydnMtPnJ4X3ByaW9yaXR5X3BhdXNlX2ZyYW1lcyA9IDA7CiAJZHJ2cy0+cG1lbV9maWZvX292ZXJmbG93X2Ryb3AgPSAwOwogCWRydnMtPnJ4X3BhdXNlX2ZyYW1lcyA9Ci0JCW1ha2VfNjRiaXRfdmFsKHBwb3J0X3N0YXRzLT5yeF9wYXVzZV9mcmFtZXNfbG8sCi0JCQkJIHBwb3J0X3N0YXRzLT5yeF9wYXVzZV9mcmFtZXNfaGkpOworCQltYWtlXzY0Yml0X3ZhbChwcG9ydF9zdGF0cy0+cnhfcGF1c2VfZnJhbWVzX2hpLAorCQkJCSBwcG9ydF9zdGF0cy0+cnhfcGF1c2VfZnJhbWVzX2xvKTsKIAlkcnZzLT5yeF9jcmNfZXJyb3JzID0gbWFrZV82NGJpdF92YWwocHBvcnRfc3RhdHMtPnJ4X2NyY19lcnJvcnNfaGksCiAJCQkJCQlwcG9ydF9zdGF0cy0+cnhfY3JjX2Vycm9yc19sbyk7CiAJZHJ2cy0+cnhfY29udHJvbF9mcmFtZXMgPQpAQCAtNDI3LDMxICs0MjMsNDAgQEAKIAlzdHJ1Y3QgYmVfZHJ2X3N0YXRzICpkcnZzID0gJmFkYXB0ZXItPmRydl9zdGF0czsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZGV2X3N0YXRzID0gJmFkYXB0ZXItPm5ldGRldi0+c3RhdHM7CiAJc3RydWN0IGJlX3J4X29iaiAqcnhvOworCXN0cnVjdCBiZV90eF9vYmogKnR4bzsKKwl1bnNpZ25lZCBsb25nIHBrdHMgPSAwLCBieXRlcyA9IDAsIG1jYXN0ID0gMCwgZHJvcHMgPSAwOwogCWludCBpOwogCi0JbWVtc2V0KGRldl9zdGF0cywgMCwgc2l6ZW9mKCpkZXZfc3RhdHMpKTsKIAlmb3JfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpIHsKLQkJZGV2X3N0YXRzLT5yeF9wYWNrZXRzICs9IHJ4X3N0YXRzKHJ4byktPnJ4X3BrdHM7Ci0JCWRldl9zdGF0cy0+cnhfYnl0ZXMgKz0gcnhfc3RhdHMocnhvKS0+cnhfYnl0ZXM7Ci0JCWRldl9zdGF0cy0+bXVsdGljYXN0ICs9IHJ4X3N0YXRzKHJ4byktPnJ4X21jYXN0X3BrdHM7CisJCXBrdHMgKz0gcnhfc3RhdHMocnhvKS0+cnhfcGt0czsKKwkJYnl0ZXMgKz0gcnhfc3RhdHMocnhvKS0+cnhfYnl0ZXM7CisJCW1jYXN0ICs9IHJ4X3N0YXRzKHJ4byktPnJ4X21jYXN0X3BrdHM7CisJCWRyb3BzICs9IHJ4X3N0YXRzKHJ4byktPnJ4X2Ryb3BwZWQ7CiAJCS8qICBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzOiBiZXN0IHBvc3NpYmxlIGFwcHJveGltYXRpb24gKi8KIAkJaWYgKGFkYXB0ZXItPmdlbmVyYXRpb24gPT0gQkVfR0VOMykgewogCQkJaWYgKCEobGFuY2VyX2NoaXAoYWRhcHRlcikpKSB7Ci0JCQkJc3RydWN0IGJlX2VyeF9zdGF0c192MSAqZXJ4X3N0YXRzID0KKwkJCQlzdHJ1Y3QgYmVfZXJ4X3N0YXRzX3YxICplcnggPQogCQkJCQliZV9lcnhfc3RhdHNfZnJvbV9jbWQoYWRhcHRlcik7Ci0JCQkJZGV2X3N0YXRzLT5yeF9kcm9wcGVkICs9Ci0JCQkJZXJ4X3N0YXRzLT5yeF9kcm9wc19ub19mcmFnbWVudHNbcnhvLT5xLmlkXTsKKwkJCQlkcm9wcyArPSBlcngtPnJ4X2Ryb3BzX25vX2ZyYWdtZW50c1tyeG8tPnEuaWRdOwogCQkJfQogCQl9IGVsc2UgewotCQkJc3RydWN0IGJlX2VyeF9zdGF0c192MCAqZXJ4X3N0YXRzID0KKwkJCXN0cnVjdCBiZV9lcnhfc3RhdHNfdjAgKmVyeCA9CiAJCQkJCWJlX2VyeF9zdGF0c19mcm9tX2NtZChhZGFwdGVyKTsKLQkJCWRldl9zdGF0cy0+cnhfZHJvcHBlZCArPQotCQkJCWVyeF9zdGF0cy0+cnhfZHJvcHNfbm9fZnJhZ21lbnRzW3J4by0+cS5pZF07CisJCQlkcm9wcyArPSBlcngtPnJ4X2Ryb3BzX25vX2ZyYWdtZW50c1tyeG8tPnEuaWRdOwogCQl9CiAJfQorCWRldl9zdGF0cy0+cnhfcGFja2V0cyA9IHBrdHM7CisJZGV2X3N0YXRzLT5yeF9ieXRlcyA9IGJ5dGVzOworCWRldl9zdGF0cy0+bXVsdGljYXN0ID0gbWNhc3Q7CisJZGV2X3N0YXRzLT5yeF9kcm9wcGVkID0gZHJvcHM7CiAKLQlkZXZfc3RhdHMtPnR4X3BhY2tldHMgPSB0eF9zdGF0cyhhZGFwdGVyKS0+YmVfdHhfcGt0czsKLQlkZXZfc3RhdHMtPnR4X2J5dGVzID0gdHhfc3RhdHMoYWRhcHRlciktPmJlX3R4X2J5dGVzOworCXBrdHMgPSBieXRlcyA9IDA7CisJZm9yX2FsbF90eF9xdWV1ZXMoYWRhcHRlciwgdHhvLCBpKSB7CisJCXBrdHMgKz0gdHhfc3RhdHModHhvKS0+YmVfdHhfcGt0czsKKwkJYnl0ZXMgKz0gdHhfc3RhdHModHhvKS0+YmVfdHhfYnl0ZXM7CisJfQorCWRldl9zdGF0cy0+dHhfcGFja2V0cyA9IHBrdHM7CisJZGV2X3N0YXRzLT50eF9ieXRlcyA9IGJ5dGVzOwogCiAJLyogYmFkIHBrdHMgcmVjZWl2ZWQgKi8KIAlkZXZfc3RhdHMtPnJ4X2Vycm9ycyA9IGRydnMtPnJ4X2NyY19lcnJvcnMgKwpAQCAtNTU0LDkgKzU1OSw5IEBACiAJcmV0dXJuIHJhdGU7CiB9CiAKLXN0YXRpYyB2b2lkIGJlX3R4X3JhdGVfdXBkYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgYmVfdHhfcmF0ZV91cGRhdGUoc3RydWN0IGJlX3R4X29iaiAqdHhvKQogewotCXN0cnVjdCBiZV90eF9zdGF0cyAqc3RhdHMgPSB0eF9zdGF0cyhhZGFwdGVyKTsKKwlzdHJ1Y3QgYmVfdHhfc3RhdHMgKnN0YXRzID0gdHhfc3RhdHModHhvKTsKIAl1bG9uZyBub3cgPSBqaWZmaWVzOwogCiAJLyogV3JhcHBlZCBhcm91bmQ/ICovCkBAIC01NzUsMTAgKzU4MCwxMSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYmVfdHhfc3RhdHNfdXBkYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAorc3RhdGljIHZvaWQgYmVfdHhfc3RhdHNfdXBkYXRlKHN0cnVjdCBiZV90eF9vYmogKnR4bywKIAkJCXUzMiB3cmJfY250LCB1MzIgY29waWVkLCB1MzIgZ3NvX3NlZ3MsIGJvb2wgc3RvcHBlZCkKIHsKLQlzdHJ1Y3QgYmVfdHhfc3RhdHMgKnN0YXRzID0gdHhfc3RhdHMoYWRhcHRlcik7CisJc3RydWN0IGJlX3R4X3N0YXRzICpzdGF0cyA9IHR4X3N0YXRzKHR4byk7CisKIAlzdGF0cy0+YmVfdHhfcmVxcysrOwogCXN0YXRzLT5iZV90eF93cmJzICs9IHdyYl9jbnQ7CiAJc3RhdHMtPmJlX3R4X2J5dGVzICs9IGNvcGllZDsKQEAgLTY0OCw3ICs2NTQsNyBAQAogCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9ldGhfaGRyX3dyYiwgdWRwY3MsIGhkciwgMSk7CiAJfQogCi0JaWYgKGFkYXB0ZXItPnZsYW5fZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCWlmICh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9ldGhfaGRyX3dyYiwgdmxhbiwgaGRyLCAxKTsKIAkJdmxhbl90YWcgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKIAkJdmxhbl9wcmlvID0gKHZsYW5fdGFnICYgVkxBTl9QUklPX01BU0spID4+IFZMQU5fUFJJT19TSElGVDsKQEAgLTY4MiwxNCArNjg4LDEzIEBACiAJfQogfQogCi1zdGF0aWMgaW50IG1ha2VfdHhfd3JicyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKK3N0YXRpYyBpbnQgbWFrZV90eF93cmJzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqdHhxLAogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgd3JiX2NudCwgYm9vbCBkdW1teV93cmIpCiB7CiAJZG1hX2FkZHJfdCBidXNhZGRyOwogCWludCBpLCBjb3BpZWQgPSAwOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7CiAJc3RydWN0IHNrX2J1ZmYgKmZpcnN0X3NrYiA9IHNrYjsKLQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqdHhxID0gJmFkYXB0ZXItPnR4X29iai5xOwogCXN0cnVjdCBiZV9ldGhfd3JiICp3cmI7CiAJc3RydWN0IGJlX2V0aF9oZHJfd3JiICpoZHI7CiAJYm9vbCBtYXBfc2luZ2xlID0gZmFsc2U7CkBAIC03NTMsMTkgKzc1OCwxOSBAQAogCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IGJlX3R4X29iaiAqdHhfb2JqID0gJmFkYXB0ZXItPnR4X29iajsKLQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqdHhxID0gJnR4X29iai0+cTsKKwlzdHJ1Y3QgYmVfdHhfb2JqICp0eG8gPSAmYWRhcHRlci0+dHhfb2JqW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXTsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqdHhxID0gJnR4by0+cTsKIAl1MzIgd3JiX2NudCA9IDAsIGNvcGllZCA9IDA7CiAJdTMyIHN0YXJ0ID0gdHhxLT5oZWFkOwogCWJvb2wgZHVtbXlfd3JiLCBzdG9wcGVkID0gZmFsc2U7CiAKIAl3cmJfY250ID0gd3JiX2NudF9mb3Jfc2tiKGFkYXB0ZXIsIHNrYiwgJmR1bW15X3dyYik7CiAKLQljb3BpZWQgPSBtYWtlX3R4X3dyYnMoYWRhcHRlciwgc2tiLCB3cmJfY250LCBkdW1teV93cmIpOworCWNvcGllZCA9IG1ha2VfdHhfd3JicyhhZGFwdGVyLCB0eHEsIHNrYiwgd3JiX2NudCwgZHVtbXlfd3JiKTsKIAlpZiAoY29waWVkKSB7CiAJCS8qIHJlY29yZCB0aGUgc2VudCBza2IgaW4gdGhlIHNlbnRfc2tiIHRhYmxlICovCi0JCUJVR19PTih0eF9vYmotPnNlbnRfc2tiX2xpc3Rbc3RhcnRdKTsKLQkJdHhfb2JqLT5zZW50X3NrYl9saXN0W3N0YXJ0XSA9IHNrYjsKKwkJQlVHX09OKHR4by0+c2VudF9za2JfbGlzdFtzdGFydF0pOworCQl0eG8tPnNlbnRfc2tiX2xpc3Rbc3RhcnRdID0gc2tiOwogCiAJCS8qIEVuc3VyZSB0eHEgaGFzIHNwYWNlIGZvciB0aGUgbmV4dCBza2I7IEVsc2Ugc3RvcCB0aGUgcXVldWUKIAkJICogKkJFRk9SRSogcmluZ2luZyB0aGUgdHggZG9vcmJlbGwsIHNvIHRoYXQgd2Ugc2VyaWFsemUgdGhlCkBAIC03NzQsMTMgKzc3OSwxMyBAQAogCQlhdG9taWNfYWRkKHdyYl9jbnQsICZ0eHEtPnVzZWQpOwogCQlpZiAoKEJFX01BWF9UWF9GUkFHX0NPVU5UICsgYXRvbWljX3JlYWQoJnR4cS0+dXNlZCkpID49CiAJCQkJCQkJCXR4cS0+bGVuKSB7Ci0JCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCQluZXRpZl9zdG9wX3N1YnF1ZXVlKG5ldGRldiwgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOwogCQkJc3RvcHBlZCA9IHRydWU7CiAJCX0KIAogCQliZV90eHFfbm90aWZ5KGFkYXB0ZXIsIHR4cS0+aWQsIHdyYl9jbnQpOwogCi0JCWJlX3R4X3N0YXRzX3VwZGF0ZShhZGFwdGVyLCB3cmJfY250LCBjb3BpZWQsCisJCWJlX3R4X3N0YXRzX3VwZGF0ZSh0eG8sIHdyYl9jbnQsIGNvcGllZCwKIAkJCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzLCBzdG9wcGVkKTsKIAl9IGVsc2UgewogCQl0eHEtPmhlYWQgPSBzdGFydDsKQEAgLTg0MiwxMyArODQ3LDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgdm9pZCBiZV92bGFuX3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYWRhcHRlci0+dmxhbl9ncnAgPSBncnA7Ci19Ci0KIHN0YXRpYyB2b2lkIGJlX3ZsYW5fYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTg2Nyw3ICs4NjUsNiBAQAogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCWFkYXB0ZXItPnZsYW5zX2FkZGVkLS07Ci0Jdmxhbl9ncm91cF9zZXRfZGV2aWNlKGFkYXB0ZXItPnZsYW5fZ3JwLCB2aWQsIE5VTEwpOwogCiAJaWYgKCFiZV9waHlzZm4oYWRhcHRlcikpCiAJCXJldHVybjsKQEAgLTExNzcsOCArMTE3NCw3IEBACiAKIAlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5ldGRldiwgQkVfSERSX0xFTik7CiAJaWYgKHVubGlrZWx5KCFza2IpKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAic2tiIGFsbG9jIGZhaWxlZFxuIik7CisJCXJ4by0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQliZV9yeF9jb21wbF9kaXNjYXJkKGFkYXB0ZXIsIHJ4bywgcnhjcCk7CiAJCXJldHVybjsKIAl9CkBAIC0xMTk2LDE2ICsxMTkyLDEwIEBACiAJCXNrYi0+cnhoYXNoID0gcnhjcC0+cnNzX2hhc2g7CiAKIAotCWlmICh1bmxpa2VseShyeGNwLT52bGFuZikpIHsKLQkJaWYgKCFhZGFwdGVyLT52bGFuX2dycCB8fCBhZGFwdGVyLT52bGFuc19hZGRlZCA9PSAwKSB7Ci0JCQlrZnJlZV9za2Ioc2tiKTsKLQkJCXJldHVybjsKLQkJfQotCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBhZGFwdGVyLT52bGFuX2dycCwKLQkJCQkJcnhjcC0+dmxhbl90YWcpOwotCX0gZWxzZSB7Ci0JCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Ci0JfQorCWlmICh1bmxpa2VseShyeGNwLT52bGFuZikpCisJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCByeGNwLT52bGFuX3RhZyk7CisKKwluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogfQogCiAvKiBQcm9jZXNzIHRoZSBSWCBjb21wbGV0aW9uIGluZGljYXRlZCBieSByeGNwIHdoZW4gR1JPIGlzIGVuYWJsZWQgKi8KQEAgLTEyNTksMTEgKzEyNDksMTAgQEAKIAlpZiAoYWRhcHRlci0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhIQVNIKQogCQlza2ItPnJ4aGFzaCA9IHJ4Y3AtPnJzc19oYXNoOwogCi0JaWYgKGxpa2VseSghcnhjcC0+dmxhbmYpKQotCQluYXBpX2dyb19mcmFncygmZXFfb2JqLT5uYXBpKTsKLQllbHNlCi0JCXZsYW5fZ3JvX2ZyYWdzKCZlcV9vYmotPm5hcGksIGFkYXB0ZXItPnZsYW5fZ3JwLAotCQkJCXJ4Y3AtPnZsYW5fdGFnKTsKKwlpZiAodW5saWtlbHkocnhjcC0+dmxhbmYpKQorCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgcnhjcC0+dmxhbl90YWcpOworCisJbmFwaV9ncm9fZnJhZ3MoJmVxX29iai0+bmFwaSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJlX3BhcnNlX3J4X2NvbXBsX3YxKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLApAQCAtMTQ1OSwxMSArMTQ0OCwxMiBAQAogCXJldHVybiB0eGNwOwogfQogCi1zdGF0aWMgdTE2IGJlX3R4X2NvbXBsX3Byb2Nlc3Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBsYXN0X2luZGV4KQorc3RhdGljIHUxNiBiZV90eF9jb21wbF9wcm9jZXNzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAorCQlzdHJ1Y3QgYmVfdHhfb2JqICp0eG8sIHUxNiBsYXN0X2luZGV4KQogewotCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICp0eHEgPSAmYWRhcHRlci0+dHhfb2JqLnE7CisJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4cSA9ICZ0eG8tPnE7CiAJc3RydWN0IGJlX2V0aF93cmIgKndyYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqKnNlbnRfc2ticyA9IGFkYXB0ZXItPnR4X29iai5zZW50X3NrYl9saXN0OworCXN0cnVjdCBza19idWZmICoqc2VudF9za2JzID0gdHhvLT5zZW50X3NrYl9saXN0OwogCXN0cnVjdCBza19idWZmICpzZW50X3NrYjsKIAl1MTYgY3VyX2luZGV4LCBudW1fd3JicyA9IDE7IC8qIGFjY291bnQgZm9yIGhkciB3cmIgKi8KIAlib29sIHVubWFwX3NrYl9oZHIgPSB0cnVlOwpAQCAtMTUwNCw3ICsxNDk0LDggQEAKIH0KIAogc3RhdGljIGludCBldmVudF9oYW5kbGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQlzdHJ1Y3QgYmVfZXFfb2JqICplcV9vYmopCisJCQlzdHJ1Y3QgYmVfZXFfb2JqICplcV9vYmosCisJCQlib29sIHJlYXJtKQogewogCXN0cnVjdCBiZV9lcV9lbnRyeSAqZXFlOwogCXUxNiBudW0gPSAwOwpAQCAtMTUxNyw3ICsxNTA4LDEwIEBACiAJLyogRGVhbCB3aXRoIGFueSBzcHVyaW91cyBpbnRlcnJ1cHRzIHRoYXQgY29tZQogCSAqIHdpdGhvdXQgZXZlbnRzCiAJICovCi0JYmVfZXFfbm90aWZ5KGFkYXB0ZXIsIGVxX29iai0+cS5pZCwgdHJ1ZSwgdHJ1ZSwgbnVtKTsKKwlpZiAoIW51bSkKKwkJcmVhcm0gPSB0cnVlOworCisJYmVfZXFfbm90aWZ5KGFkYXB0ZXIsIGVxX29iai0+cS5pZCwgcmVhcm0sIHRydWUsIG51bSk7CiAJaWYgKG51bSkKIAkJbmFwaV9zY2hlZHVsZSgmZXFfb2JqLT5uYXBpKTsKIApAQCAtMTU2MywxNSArMTU1NywxNyBAQAogCQltZW1zZXQocGFnZV9pbmZvLCAwLCBzaXplb2YoKnBhZ2VfaW5mbykpOwogCX0KIAlCVUdfT04oYXRvbWljX3JlYWQoJnJ4cS0+dXNlZCkpOworCXJ4cS0+dGFpbCA9IHJ4cS0+aGVhZCA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGJlX3R4X2NvbXBsX2NsZWFuKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgYmVfdHhfY29tcGxfY2xlYW4oc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJc3RydWN0IGJlX3R4X29iaiAqdHhvKQogewotCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICp0eF9jcSA9ICZhZGFwdGVyLT50eF9vYmouY3E7Ci0Jc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4cSA9ICZhZGFwdGVyLT50eF9vYmoucTsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqdHhfY3EgPSAmdHhvLT5jcTsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqdHhxID0gJnR4by0+cTsKIAlzdHJ1Y3QgYmVfZXRoX3R4X2NvbXBsICp0eGNwOwogCXUxNiBlbmRfaWR4LCBjbXBsID0gMCwgdGltZW8gPSAwLCBudW1fd3JicyA9IDA7Ci0Jc3RydWN0IHNrX2J1ZmYgKipzZW50X3NrYnMgPSBhZGFwdGVyLT50eF9vYmouc2VudF9za2JfbGlzdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKnNlbnRfc2ticyA9IHR4by0+c2VudF9za2JfbGlzdDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2VudF9za2I7CiAJYm9vbCBkdW1teV93cmI7CiAKQEAgLTE1ODAsNyArMTU3Niw3IEBACiAJCXdoaWxlICgodHhjcCA9IGJlX3R4X2NvbXBsX2dldCh0eF9jcSkpKSB7CiAJCQllbmRfaWR4ID0gQU1BUF9HRVRfQklUUyhzdHJ1Y3QgYW1hcF9ldGhfdHhfY29tcGwsCiAJCQkJCXdyYl9pbmRleCwgdHhjcCk7Ci0JCQludW1fd3JicyArPSBiZV90eF9jb21wbF9wcm9jZXNzKGFkYXB0ZXIsIGVuZF9pZHgpOworCQkJbnVtX3dyYnMgKz0gYmVfdHhfY29tcGxfcHJvY2VzcyhhZGFwdGVyLCB0eG8sIGVuZF9pZHgpOwogCQkJY21wbCsrOwogCQl9CiAJCWlmIChjbXBsKSB7CkBAIC0xNjA3LDcgKzE2MDMsNyBAQAogCQlpbmRleF9hZHYoJmVuZF9pZHgsCiAJCQl3cmJfY250X2Zvcl9za2IoYWRhcHRlciwgc2VudF9za2IsICZkdW1teV93cmIpIC0gMSwKIAkJCXR4cS0+bGVuKTsKLQkJbnVtX3dyYnMgPSBiZV90eF9jb21wbF9wcm9jZXNzKGFkYXB0ZXIsIGVuZF9pZHgpOworCQludW1fd3JicyA9IGJlX3R4X2NvbXBsX3Byb2Nlc3MoYWRhcHRlciwgdHhvLCBlbmRfaWR4KTsKIAkJYXRvbWljX3N1YihudW1fd3JicywgJnR4cS0+dXNlZCk7CiAJfQogfQpAQCAtMTY2NiwxNiArMTY2MiwyMCBAQAogc3RhdGljIHZvaWQgYmVfdHhfcXVldWVzX2Rlc3Ryb3koc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnE7CisJc3RydWN0IGJlX3R4X29iaiAqdHhvOworCXU4IGk7CiAKLQlxID0gJmFkYXB0ZXItPnR4X29iai5xOwotCWlmIChxLT5jcmVhdGVkKQotCQliZV9jbWRfcV9kZXN0cm95KGFkYXB0ZXIsIHEsIFFUWVBFX1RYUSk7Ci0JYmVfcXVldWVfZnJlZShhZGFwdGVyLCBxKTsKKwlmb3JfYWxsX3R4X3F1ZXVlcyhhZGFwdGVyLCB0eG8sIGkpIHsKKwkJcSA9ICZ0eG8tPnE7CisJCWlmIChxLT5jcmVhdGVkKQorCQkJYmVfY21kX3FfZGVzdHJveShhZGFwdGVyLCBxLCBRVFlQRV9UWFEpOworCQliZV9xdWV1ZV9mcmVlKGFkYXB0ZXIsIHEpOwogCi0JcSA9ICZhZGFwdGVyLT50eF9vYmouY3E7Ci0JaWYgKHEtPmNyZWF0ZWQpCi0JCWJlX2NtZF9xX2Rlc3Ryb3koYWRhcHRlciwgcSwgUVRZUEVfQ1EpOwotCWJlX3F1ZXVlX2ZyZWUoYWRhcHRlciwgcSk7CisJCXEgPSAmdHhvLT5jcTsKKwkJaWYgKHEtPmNyZWF0ZWQpCisJCQliZV9jbWRfcV9kZXN0cm95KGFkYXB0ZXIsIHEsIFFUWVBFX0NRKTsKKwkJYmVfcXVldWVfZnJlZShhZGFwdGVyLCBxKTsKKwl9CiAKIAkvKiBDbGVhciBhbnkgcmVzaWR1YWwgZXZlbnRzICovCiAJYmVfZXFfY2xlYW4oYWRhcHRlciwgJmFkYXB0ZXItPnR4X2VxKTsKQEAgLTE2ODYsNTYgKzE2ODYsNDggQEAKIAliZV9xdWV1ZV9mcmVlKGFkYXB0ZXIsIHEpOwogfQogCisvKiBPbmUgVFggZXZlbnQgcXVldWUgaXMgc2hhcmVkIGJ5IGFsbCBUWCBjb21wbCBxcyAqLwogc3RhdGljIGludCBiZV90eF9xdWV1ZXNfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICplcSwgKnEsICpjcTsKKwlzdHJ1Y3QgYmVfdHhfb2JqICp0eG87CisJdTggaTsKIAogCWFkYXB0ZXItPnR4X2VxLm1heF9lcWQgPSAwOwogCWFkYXB0ZXItPnR4X2VxLm1pbl9lcWQgPSAwOwogCWFkYXB0ZXItPnR4X2VxLmN1cl9lcWQgPSA5NjsKIAlhZGFwdGVyLT50eF9lcS5lbmFibGVfYWljID0gZmFsc2U7Ci0JLyogQWxsb2MgVHggRXZlbnQgcXVldWUgKi8KKwogCWVxID0gJmFkYXB0ZXItPnR4X2VxLnE7Ci0JaWYgKGJlX3F1ZXVlX2FsbG9jKGFkYXB0ZXIsIGVxLCBFVk5UX1FfTEVOLCBzaXplb2Yoc3RydWN0IGJlX2VxX2VudHJ5KSkpCisJaWYgKGJlX3F1ZXVlX2FsbG9jKGFkYXB0ZXIsIGVxLCBFVk5UX1FfTEVOLAorCQlzaXplb2Yoc3RydWN0IGJlX2VxX2VudHJ5KSkpCiAJCXJldHVybiAtMTsKIAotCS8qIEFzayBCRSB0byBjcmVhdGUgVHggRXZlbnQgcXVldWUgKi8KIAlpZiAoYmVfY21kX2VxX2NyZWF0ZShhZGFwdGVyLCBlcSwgYWRhcHRlci0+dHhfZXEuY3VyX2VxZCkpCi0JCWdvdG8gdHhfZXFfZnJlZTsKLQorCQlnb3RvIGVycjsKIAlhZGFwdGVyLT50eF9lcS5lcV9pZHggPSBhZGFwdGVyLT5lcV9uZXh0X2lkeCsrOwogCi0KLQkvKiBBbGxvYyBUWCBldGggY29tcGwgcXVldWUgKi8KLQljcSA9ICZhZGFwdGVyLT50eF9vYmouY3E7Ci0JaWYgKGJlX3F1ZXVlX2FsbG9jKGFkYXB0ZXIsIGNxLCBUWF9DUV9MRU4sCisJZm9yX2FsbF90eF9xdWV1ZXMoYWRhcHRlciwgdHhvLCBpKSB7CisJCWNxID0gJnR4by0+Y3E7CisJCWlmIChiZV9xdWV1ZV9hbGxvYyhhZGFwdGVyLCBjcSwgVFhfQ1FfTEVOLAogCQkJc2l6ZW9mKHN0cnVjdCBiZV9ldGhfdHhfY29tcGwpKSkKLQkJZ290byB0eF9lcV9kZXN0cm95OworCQkJZ290byBlcnI7CiAKLQkvKiBBc2sgQkUgdG8gY3JlYXRlIFR4IGV0aCBjb21wbCBxdWV1ZSAqLwotCWlmIChiZV9jbWRfY3FfY3JlYXRlKGFkYXB0ZXIsIGNxLCBlcSwgZmFsc2UsIGZhbHNlLCAzKSkKLQkJZ290byB0eF9jcV9mcmVlOworCQlpZiAoYmVfY21kX2NxX2NyZWF0ZShhZGFwdGVyLCBjcSwgZXEsIGZhbHNlLCBmYWxzZSwgMykpCisJCQlnb3RvIGVycjsKIAotCS8qIEFsbG9jIFRYIGV0aCBxdWV1ZSAqLwotCXEgPSAmYWRhcHRlci0+dHhfb2JqLnE7Ci0JaWYgKGJlX3F1ZXVlX2FsbG9jKGFkYXB0ZXIsIHEsIFRYX1FfTEVOLCBzaXplb2Yoc3RydWN0IGJlX2V0aF93cmIpKSkKLQkJZ290byB0eF9jcV9kZXN0cm95OworCQlxID0gJnR4by0+cTsKKwkJaWYgKGJlX3F1ZXVlX2FsbG9jKGFkYXB0ZXIsIHEsIFRYX1FfTEVOLAorCQkJc2l6ZW9mKHN0cnVjdCBiZV9ldGhfd3JiKSkpCisJCQlnb3RvIGVycjsKIAotCS8qIEFzayBCRSB0byBjcmVhdGUgVHggZXRoIHF1ZXVlICovCi0JaWYgKGJlX2NtZF90eHFfY3JlYXRlKGFkYXB0ZXIsIHEsIGNxKSkKLQkJZ290byB0eF9xX2ZyZWU7CisJCWlmIChiZV9jbWRfdHhxX2NyZWF0ZShhZGFwdGVyLCBxLCBjcSkpCisJCQlnb3RvIGVycjsKKwl9CiAJcmV0dXJuIDA7CiAKLXR4X3FfZnJlZToKLQliZV9xdWV1ZV9mcmVlKGFkYXB0ZXIsIHEpOwotdHhfY3FfZGVzdHJveToKLQliZV9jbWRfcV9kZXN0cm95KGFkYXB0ZXIsIGNxLCBRVFlQRV9DUSk7Ci10eF9jcV9mcmVlOgotCWJlX3F1ZXVlX2ZyZWUoYWRhcHRlciwgY3EpOwotdHhfZXFfZGVzdHJveToKLQliZV9jbWRfcV9kZXN0cm95KGFkYXB0ZXIsIGVxLCBRVFlQRV9FUSk7Ci10eF9lcV9mcmVlOgotCWJlX3F1ZXVlX2ZyZWUoYWRhcHRlciwgZXEpOworZXJyOgorCWJlX3R4X3F1ZXVlc19kZXN0cm95KGFkYXB0ZXIpOwogCXJldHVybiAtMTsKIH0KIApAQCAtMTc0NiwzNiArMTczOCwyMyBAQAogCWludCBpOwogCiAJZm9yX2FsbF9yeF9xdWV1ZXMoYWRhcHRlciwgcnhvLCBpKSB7Ci0JCXEgPSAmcnhvLT5xOwotCQlpZiAocS0+Y3JlYXRlZCkgewotCQkJYmVfY21kX3FfZGVzdHJveShhZGFwdGVyLCBxLCBRVFlQRV9SWFEpOwotCQkJLyogQWZ0ZXIgdGhlIHJ4cSBpcyBpbnZhbGlkYXRlZCwgd2FpdCBmb3IgYSBncmFjZSB0aW1lCi0JCQkgKiBvZiAxbXMgZm9yIGFsbCBkbWEgdG8gZW5kIGFuZCB0aGUgZmx1c2ggY29tcGwgdG8KLQkJCSAqIGFycml2ZQotCQkJICovCi0JCQltZGVsYXkoMSk7Ci0JCQliZV9yeF9xX2NsZWFuKGFkYXB0ZXIsIHJ4byk7Ci0JCX0KLQkJYmVfcXVldWVfZnJlZShhZGFwdGVyLCBxKTsKKwkJYmVfcXVldWVfZnJlZShhZGFwdGVyLCAmcnhvLT5xKTsKIAogCQlxID0gJnJ4by0+Y3E7CiAJCWlmIChxLT5jcmVhdGVkKQogCQkJYmVfY21kX3FfZGVzdHJveShhZGFwdGVyLCBxLCBRVFlQRV9DUSk7CiAJCWJlX3F1ZXVlX2ZyZWUoYWRhcHRlciwgcSk7CiAKLQkJLyogQ2xlYXIgYW55IHJlc2lkdWFsIGV2ZW50cyAqLwogCQlxID0gJnJ4by0+cnhfZXEucTsKLQkJaWYgKHEtPmNyZWF0ZWQpIHsKLQkJCWJlX2VxX2NsZWFuKGFkYXB0ZXIsICZyeG8tPnJ4X2VxKTsKKwkJaWYgKHEtPmNyZWF0ZWQpCiAJCQliZV9jbWRfcV9kZXN0cm95KGFkYXB0ZXIsIHEsIFFUWVBFX0VRKTsKLQkJfQogCQliZV9xdWV1ZV9mcmVlKGFkYXB0ZXIsIHEpOwogCX0KIH0KIAogc3RhdGljIHUzMiBiZV9udW1fcnhxc193YW50KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewotCWlmIChtdWx0aV9yeHEgJiYgKGFkYXB0ZXItPmZ1bmN0aW9uX2NhcHMgJiBCRV9GVU5DVElPTl9DQVBTX1JTUykgJiYKKwlpZiAoKGFkYXB0ZXItPmZ1bmN0aW9uX2NhcHMgJiBCRV9GVU5DVElPTl9DQVBTX1JTUykgJiYKIAkJIWFkYXB0ZXItPnNyaW92X2VuYWJsZWQgJiYgIShhZGFwdGVyLT5mdW5jdGlvbl9tb2RlICYgMHg0MDApKSB7CiAJCXJldHVybiAxICsgTUFYX1JTU19RUzsgLyogb25lIGRlZmF1bHQgbm9uLVJTUyBxdWV1ZSAqLwogCX0gZWxzZSB7CkBAIC0xODI3LDMwICsxODA2LDE0IEBACiAJCXJjID0gYmVfY21kX2NxX2NyZWF0ZShhZGFwdGVyLCBjcSwgZXEsIGZhbHNlLCBmYWxzZSwgMyk7CiAJCWlmIChyYykKIAkJCWdvdG8gZXJyOwotCQkvKiBSeCBRICovCisKKwkJLyogUnggUSAtIHdpbGwgYmUgY3JlYXRlZCBpbiBiZV9vcGVuKCkgKi8KIAkJcSA9ICZyeG8tPnE7CiAJCXJjID0gYmVfcXVldWVfYWxsb2MoYWRhcHRlciwgcSwgUlhfUV9MRU4sCiAJCQkJc2l6ZW9mKHN0cnVjdCBiZV9ldGhfcnhfZCkpOwogCQlpZiAocmMpCiAJCQlnb3RvIGVycjsKIAotCQlyYyA9IGJlX2NtZF9yeHFfY3JlYXRlKGFkYXB0ZXIsIHEsIGNxLT5pZCwgcnhfZnJhZ19zaXplLAotCQkJQkVfTUFYX0pVTUJPX0ZSQU1FX1NJWkUsIGFkYXB0ZXItPmlmX2hhbmRsZSwKLQkJCShpID4gMCkgPyAxIDogMC8qIHJzcyBlbmFibGUgKi8sICZyeG8tPnJzc19pZCk7Ci0JCWlmIChyYykKLQkJCWdvdG8gZXJyOwotCX0KLQotCWlmIChiZV9tdWx0aV9yeHEoYWRhcHRlcikpIHsKLQkJdTggcnNzdGFibGVbTUFYX1JTU19RU107Ci0KLQkJZm9yX2FsbF9yc3NfcXVldWVzKGFkYXB0ZXIsIHJ4bywgaSkKLQkJCXJzc3RhYmxlW2ldID0gcnhvLT5yc3NfaWQ7Ci0KLQkJcmMgPSBiZV9jbWRfcnNzX2NvbmZpZyhhZGFwdGVyLCByc3N0YWJsZSwKLQkJCWFkYXB0ZXItPm51bV9yeF9xcyAtIDEpOwotCQlpZiAocmMpCi0JCQlnb3RvIGVycjsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE4NzYsMTAgKzE4MzksMTAgQEAKIAogCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkgewogCQlpZiAoZXZlbnRfcGVlaygmYWRhcHRlci0+dHhfZXEpKQotCQkJdHggPSBldmVudF9oYW5kbGUoYWRhcHRlciwgJmFkYXB0ZXItPnR4X2VxKTsKKwkJCXR4ID0gZXZlbnRfaGFuZGxlKGFkYXB0ZXIsICZhZGFwdGVyLT50eF9lcSwgZmFsc2UpOwogCQlmb3JfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpIHsKIAkJCWlmIChldmVudF9wZWVrKCZyeG8tPnJ4X2VxKSkKLQkJCQlyeCB8PSBldmVudF9oYW5kbGUoYWRhcHRlciwgJnJ4by0+cnhfZXEpOworCQkJCXJ4IHw9IGV2ZW50X2hhbmRsZShhZGFwdGVyLCAmcnhvLT5yeF9lcSwgdHJ1ZSk7CiAJCX0KIAogCQlpZiAoISh0eCB8fCByeCkpCkBAIC0xODkyLDExICsxODU1LDExIEBACiAJCQlyZXR1cm4gSVJRX05PTkU7CiAKIAkJaWYgKCgxIDw8IGFkYXB0ZXItPnR4X2VxLmVxX2lkeCAmIGlzcikpCi0JCQlldmVudF9oYW5kbGUoYWRhcHRlciwgJmFkYXB0ZXItPnR4X2VxKTsKKwkJCWV2ZW50X2hhbmRsZShhZGFwdGVyLCAmYWRhcHRlci0+dHhfZXEsIGZhbHNlKTsKIAogCQlmb3JfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpIHsKIAkJCWlmICgoMSA8PCByeG8tPnJ4X2VxLmVxX2lkeCAmIGlzcikpCi0JCQkJZXZlbnRfaGFuZGxlKGFkYXB0ZXIsICZyeG8tPnJ4X2VxKTsKKwkJCQlldmVudF9oYW5kbGUoYWRhcHRlciwgJnJ4by0+cnhfZXEsIHRydWUpOwogCQl9CiAJfQogCkBAIC0xOTA4LDcgKzE4NzEsNyBAQAogCXN0cnVjdCBiZV9yeF9vYmogKnJ4byA9IGRldjsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHJ4by0+YWRhcHRlcjsKIAotCWV2ZW50X2hhbmRsZShhZGFwdGVyLCAmcnhvLT5yeF9lcSk7CisJZXZlbnRfaGFuZGxlKGFkYXB0ZXIsICZyeG8tPnJ4X2VxLCB0cnVlKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTE5MTcsNyArMTg4MCw3IEBACiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkZXY7CiAKLQlldmVudF9oYW5kbGUoYWRhcHRlciwgJmFkYXB0ZXItPnR4X2VxKTsKKwlldmVudF9oYW5kbGUoYWRhcHRlciwgJmFkYXB0ZXItPnR4X2VxLCBmYWxzZSk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0xOTc4LDQ1ICsxOTQxLDQ4IEBACiAJc3RydWN0IGJlX2VxX29iaiAqdHhfZXEgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IGJlX2VxX29iaiwgbmFwaSk7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPQogCQljb250YWluZXJfb2YodHhfZXEsIHN0cnVjdCBiZV9hZGFwdGVyLCB0eF9lcSk7Ci0Jc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4cSA9ICZhZGFwdGVyLT50eF9vYmoucTsKLQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqdHhfY3EgPSAmYWRhcHRlci0+dHhfb2JqLmNxOworCXN0cnVjdCBiZV90eF9vYmogKnR4bzsKIAlzdHJ1Y3QgYmVfZXRoX3R4X2NvbXBsICp0eGNwOwotCWludCB0eF9jb21wbCA9IDAsIG1jY19jb21wbCwgc3RhdHVzID0gMDsKLQl1MTYgZW5kX2lkeCwgbnVtX3dyYnMgPSAwOworCWludCB0eF9jb21wbCwgbWNjX2NvbXBsLCBzdGF0dXMgPSAwOworCXU4IGk7CisJdTE2IG51bV93cmJzOwogCi0Jd2hpbGUgKCh0eGNwID0gYmVfdHhfY29tcGxfZ2V0KHR4X2NxKSkpIHsKLQkJZW5kX2lkeCA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfZXRoX3R4X2NvbXBsLAotCQkJCXdyYl9pbmRleCwgdHhjcCk7Ci0JCW51bV93cmJzICs9IGJlX3R4X2NvbXBsX3Byb2Nlc3MoYWRhcHRlciwgZW5kX2lkeCk7Ci0JCXR4X2NvbXBsKys7CisJZm9yX2FsbF90eF9xdWV1ZXMoYWRhcHRlciwgdHhvLCBpKSB7CisJCXR4X2NvbXBsID0gMDsKKwkJbnVtX3dyYnMgPSAwOworCQl3aGlsZSAoKHR4Y3AgPSBiZV90eF9jb21wbF9nZXQoJnR4by0+Y3EpKSkgeworCQkJbnVtX3dyYnMgKz0gYmVfdHhfY29tcGxfcHJvY2VzcyhhZGFwdGVyLCB0eG8sCisJCQkJQU1BUF9HRVRfQklUUyhzdHJ1Y3QgYW1hcF9ldGhfdHhfY29tcGwsCisJCQkJCXdyYl9pbmRleCwgdHhjcCkpOworCQkJdHhfY29tcGwrKzsKKwkJfQorCQlpZiAodHhfY29tcGwpIHsKKwkJCWJlX2NxX25vdGlmeShhZGFwdGVyLCB0eG8tPmNxLmlkLCB0cnVlLCB0eF9jb21wbCk7CisKKwkJCWF0b21pY19zdWIobnVtX3dyYnMsICZ0eG8tPnEudXNlZCk7CisKKwkJCS8qIEFzIFR4IHdyYnMgaGF2ZSBiZWVuIGZyZWVkIHVwLCB3YWtlIHVwIG5ldGRldiBxdWV1ZQorCQkJICogaWYgaXQgd2FzIHN0b3BwZWQgZHVlIHRvIGxhY2sgb2YgdHggd3Jicy4gICovCisJCQlpZiAoX19uZXRpZl9zdWJxdWV1ZV9zdG9wcGVkKGFkYXB0ZXItPm5ldGRldiwgaSkgJiYKKwkJCQlhdG9taWNfcmVhZCgmdHhvLT5xLnVzZWQpIDwgdHhvLT5xLmxlbiAvIDIpIHsKKwkJCQluZXRpZl93YWtlX3N1YnF1ZXVlKGFkYXB0ZXItPm5ldGRldiwgaSk7CisJCQl9CisKKwkJCWFkYXB0ZXItPmRydl9zdGF0cy5iZV90eF9ldmVudHMrKzsKKwkJCXR4by0+c3RhdHMuYmVfdHhfY29tcGwgKz0gdHhfY29tcGw7CisJCX0KIAl9CiAKIAltY2NfY29tcGwgPSBiZV9wcm9jZXNzX21jYyhhZGFwdGVyLCAmc3RhdHVzKTsKIAotCW5hcGlfY29tcGxldGUobmFwaSk7Ci0KIAlpZiAobWNjX2NvbXBsKSB7CiAJCXN0cnVjdCBiZV9tY2Nfb2JqICptY2Nfb2JqID0gJmFkYXB0ZXItPm1jY19vYmo7CiAJCWJlX2NxX25vdGlmeShhZGFwdGVyLCBtY2Nfb2JqLT5jcS5pZCwgdHJ1ZSwgbWNjX2NvbXBsKTsKIAl9CiAKLQlpZiAodHhfY29tcGwpIHsKLQkJYmVfY3Ffbm90aWZ5KGFkYXB0ZXIsIGFkYXB0ZXItPnR4X29iai5jcS5pZCwgdHJ1ZSwgdHhfY29tcGwpOworCW5hcGlfY29tcGxldGUobmFwaSk7CiAKLQkJYXRvbWljX3N1YihudW1fd3JicywgJnR4cS0+dXNlZCk7Ci0KLQkJLyogQXMgVHggd3JicyBoYXZlIGJlZW4gZnJlZWQgdXAsIHdha2UgdXAgbmV0ZGV2IHF1ZXVlIGlmCi0JCSAqIGl0IHdhcyBzdG9wcGVkIGR1ZSB0byBsYWNrIG9mIHR4IHdyYnMuCi0JCSAqLwotCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChhZGFwdGVyLT5uZXRkZXYpICYmCi0JCQlhdG9taWNfcmVhZCgmdHhxLT51c2VkKSA8IHR4cS0+bGVuIC8gMikgewotCQkJbmV0aWZfd2FrZV9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOwotCQl9Ci0KLQkJdHhfc3RhdHMoYWRhcHRlciktPmJlX3R4X2V2ZW50cysrOwotCQl0eF9zdGF0cyhhZGFwdGVyKS0+YmVfdHhfY29tcGwgKz0gdHhfY29tcGw7Ci0JfQotCisJYmVfZXFfbm90aWZ5KGFkYXB0ZXIsIHR4X2VxLT5xLmlkLCB0cnVlLCBmYWxzZSwgMCk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTIwNjUsNiArMjAzMSw3IEBACiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGJlX2FkYXB0ZXIsIHdvcmsud29yayk7CiAJc3RydWN0IGJlX3J4X29iaiAqcnhvOworCXN0cnVjdCBiZV90eF9vYmogKnR4bzsKIAlpbnQgaTsKIAogCWlmICghYWRhcHRlci0+dWVfZGV0ZWN0ZWQgJiYgIWxhbmNlcl9jaGlwKGFkYXB0ZXIpKQpAQCAtMjA5Miw3ICsyMDU5LDkgQEAKIAkJZWxzZQogCQkJYmVfY21kX2dldF9zdGF0cyhhZGFwdGVyLCAmYWRhcHRlci0+c3RhdHNfY21kKTsKIAl9Ci0JYmVfdHhfcmF0ZV91cGRhdGUoYWRhcHRlcik7CisKKwlmb3JfYWxsX3R4X3F1ZXVlcyhhZGFwdGVyLCB0eG8sIGkpCisJCWJlX3R4X3JhdGVfdXBkYXRlKHR4byk7CiAKIAlmb3JfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpIHsKIAkJYmVfcnhfcmF0ZV91cGRhdGUocnhvKTsKQEAgLTIyOTAsMTAgKzIyNTksMzYgQEAKIAlhZGFwdGVyLT5pc3JfcmVnaXN0ZXJlZCA9IGZhbHNlOwogfQogCitzdGF0aWMgdm9pZCBiZV9yeF9xdWV1ZXNfY2xlYXIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnE7CisJc3RydWN0IGJlX3J4X29iaiAqcnhvOworCWludCBpOworCisJZm9yX2FsbF9yeF9xdWV1ZXMoYWRhcHRlciwgcnhvLCBpKSB7CisJCXEgPSAmcnhvLT5xOworCQlpZiAocS0+Y3JlYXRlZCkgeworCQkJYmVfY21kX3J4cV9kZXN0cm95KGFkYXB0ZXIsIHEpOworCQkJLyogQWZ0ZXIgdGhlIHJ4cSBpcyBpbnZhbGlkYXRlZCwgd2FpdCBmb3IgYSBncmFjZSB0aW1lCisJCQkgKiBvZiAxbXMgZm9yIGFsbCBkbWEgdG8gZW5kIGFuZCB0aGUgZmx1c2ggY29tcGwgdG8KKwkJCSAqIGFycml2ZQorCQkJICovCisJCQltZGVsYXkoMSk7CisJCQliZV9yeF9xX2NsZWFuKGFkYXB0ZXIsIHJ4byk7CisJCX0KKworCQkvKiBDbGVhciBhbnkgcmVzaWR1YWwgZXZlbnRzICovCisJCXEgPSAmcnhvLT5yeF9lcS5xOworCQlpZiAocS0+Y3JlYXRlZCkKKwkJCWJlX2VxX2NsZWFuKGFkYXB0ZXIsICZyeG8tPnJ4X2VxKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgYmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGJlX3J4X29iaiAqcnhvOworCXN0cnVjdCBiZV90eF9vYmogKnR4bzsKIAlzdHJ1Y3QgYmVfZXFfb2JqICp0eF9lcSA9ICZhZGFwdGVyLT50eF9lcTsKIAlpbnQgdmVjLCBpOwogCkBAIC0yMzExLDEwICsyMzA2LDExIEBACiAJbmFwaV9kaXNhYmxlKCZ0eF9lcS0+bmFwaSk7CiAKIAlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKLQkJYmVfY3Ffbm90aWZ5KGFkYXB0ZXIsIGFkYXB0ZXItPnR4X29iai5jcS5pZCwgZmFsc2UsIDApOwogCQliZV9jcV9ub3RpZnkoYWRhcHRlciwgYWRhcHRlci0+bWNjX29iai5jcS5pZCwgZmFsc2UsIDApOwogCQlmb3JfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpCiAJCQkgYmVfY3Ffbm90aWZ5KGFkYXB0ZXIsIHJ4by0+Y3EuaWQsIGZhbHNlLCAwKTsKKwkJZm9yX2FsbF90eF9xdWV1ZXMoYWRhcHRlciwgdHhvLCBpKQorCQkJIGJlX2NxX25vdGlmeShhZGFwdGVyLCB0eG8tPmNxLmlkLCBmYWxzZSwgMCk7CiAJfQogCiAJaWYgKG1zaXhfZW5hYmxlZChhZGFwdGVyKSkgewpAQCAtMjMzMyw4ICsyMzI5LDQzIEBACiAJLyogV2FpdCBmb3IgYWxsIHBlbmRpbmcgdHggY29tcGxldGlvbnMgdG8gYXJyaXZlIHNvIHRoYXQKIAkgKiBhbGwgdHggc2ticyBhcmUgZnJlZWQuCiAJICovCi0JYmVfdHhfY29tcGxfY2xlYW4oYWRhcHRlcik7CisJZm9yX2FsbF90eF9xdWV1ZXMoYWRhcHRlciwgdHhvLCBpKQorCQliZV90eF9jb21wbF9jbGVhbihhZGFwdGVyLCB0eG8pOwogCisJYmVfcnhfcXVldWVzX2NsZWFyKGFkYXB0ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJlX3J4X3F1ZXVlc19zZXR1cChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmVfcnhfb2JqICpyeG87CisJaW50IHJjLCBpOworCXU4IHJzc3RhYmxlW01BWF9SU1NfUVNdOworCisJZm9yX2FsbF9yeF9xdWV1ZXMoYWRhcHRlciwgcnhvLCBpKSB7CisJCXJjID0gYmVfY21kX3J4cV9jcmVhdGUoYWRhcHRlciwgJnJ4by0+cSwgcnhvLT5jcS5pZCwKKwkJCXJ4X2ZyYWdfc2l6ZSwgQkVfTUFYX0pVTUJPX0ZSQU1FX1NJWkUsCisJCQlhZGFwdGVyLT5pZl9oYW5kbGUsCisJCQkoaSA+IDApID8gMSA6IDAvKiByc3MgZW5hYmxlICovLCAmcnhvLT5yc3NfaWQpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKGJlX211bHRpX3J4cShhZGFwdGVyKSkgeworCQlmb3JfYWxsX3Jzc19xdWV1ZXMoYWRhcHRlciwgcnhvLCBpKQorCQkJcnNzdGFibGVbaV0gPSByeG8tPnJzc19pZDsKKworCQlyYyA9IGJlX2NtZF9yc3NfY29uZmlnKGFkYXB0ZXIsIHJzc3RhYmxlLAorCQkJYWRhcHRlci0+bnVtX3J4X3FzIC0gMSk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKKwkvKiBGaXJzdCB0aW1lIHBvc3RpbmcgKi8KKwlmb3JfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpIHsKKwkJYmVfcG9zdF9yeF9mcmFncyhyeG8sIEdGUF9LRVJORUwpOworCQluYXBpX2VuYWJsZSgmcnhvLT5yeF9lcS5uYXBpKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzNDgsMTAgKzIzNzksMTAgQEAKIAl1OCBtYWNfc3BlZWQ7CiAJdTE2IGxpbmtfc3BlZWQ7CiAKLQlmb3JfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpIHsKLQkJYmVfcG9zdF9yeF9mcmFncyhyeG8sIEdGUF9LRVJORUwpOwotCQluYXBpX2VuYWJsZSgmcnhvLT5yeF9lcS5uYXBpKTsKLQl9CisJc3RhdHVzID0gYmVfcnhfcXVldWVzX3NldHVwKGFkYXB0ZXIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXJyOworCiAJbmFwaV9lbmFibGUoJnR4X2VxLT5uYXBpKTsKIAogCWJlX2lycV9yZWdpc3RlcihhZGFwdGVyKTsKQEAgLTI0ODAsNiArMjUxMSw4IEBACiAJaW50IHN0YXR1czsKIAl1OCBtYWNbRVRIX0FMRU5dOwogCisJYmVfY21kX3JlcV9uYXRpdmVfbW9kZShhZGFwdGVyKTsKKwogCWNhcF9mbGFncyA9IGVuX2ZsYWdzID0gQkVfSUZfRkxBR1NfVU5UQUdHRUQgfAogCQkJCUJFX0lGX0ZMQUdTX0JST0FEQ0FTVCB8CiAJCQkJQkVfSUZfRkxBR1NfTVVMVElDQVNUOwpAQCAtMjUzOSw2ICsyNTcyLDkgQEAKIAlpZiAoc3RhdHVzICE9IDApCiAJCWdvdG8gdHhfcXNfZGVzdHJveTsKIAorCS8qIEFsbG93IGFsbCBwcmlvcml0aWVzIGJ5IGRlZmF1bHQuIEEgR1JQNSBldnQgbWF5IG1vZGlmeSB0aGlzICovCisJYWRhcHRlci0+dmxhbl9wcmlvX2JtYXAgPSAweGZmOworCiAJc3RhdHVzID0gYmVfbWNjX3F1ZXVlc19jcmVhdGUoYWRhcHRlcik7CiAJaWYgKHN0YXR1cyAhPSAwKQogCQlnb3RvIHJ4X3FzX2Rlc3Ryb3k7CkBAIC0yNTg0LDYgKzI2MjAsOCBAQAogCiAJYmVfY21kX2lmX2Rlc3Ryb3koYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLCAgMCk7CiAKKwlhZGFwdGVyLT5iZTNfbmF0aXZlID0gMDsKKwogCS8qIHRlbGwgZncgd2UncmUgZG9uZSB3aXRoIGZpcmluZyBjbWRzICovCiAJYmVfY21kX2Z3X2NsZWFuKGFkYXB0ZXIpOwogCXJldHVybiAwOwpAQCAtMjkwMSw3ICsyOTM5LDYgQEAKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGJlX21hY19hZGRyX3NldCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gYmVfY2hhbmdlX210dSwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLQkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSBiZV92bGFuX3JlZ2lzdGVyLAogCS5uZG9fdmxhbl9yeF9hZGRfdmlkCT0gYmVfdmxhbl9hZGRfdmlkLAogCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IGJlX3ZsYW5fcmVtX3ZpZCwKIAkubmRvX3NldF92Zl9tYWMJCT0gYmVfc2V0X3ZmX21hYywKQEAgLTI5MjUsMTIgKzI5NjIsOSBAQAogCW5ldGRldi0+ZmVhdHVyZXMgfD0gbmV0ZGV2LT5od19mZWF0dXJlcyB8CiAJCU5FVElGX0ZfSFdfVkxBTl9SWCB8IE5FVElGX0ZfSFdfVkxBTl9GSUxURVI7CiAKLQluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfVFNPIHwKKwluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082IHwKIAkJTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU07CiAKLQlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikpCi0JCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzY7Ci0KIAluZXRkZXYtPmZsYWdzIHw9IElGRl9NVUxUSUNBU1Q7CiAKIAkvKiBEZWZhdWx0IHNldHRpbmdzIGZvciBSeCBhbmQgVHggZmxvdyBjb250cm9sICovCkBAIC0zMTg1LDcgKzMyMTksMTYgQEAKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCi0JYmVfY21kX2NoZWNrX25hdGl2ZV9tb2RlKGFkYXB0ZXIpOworCWlmICgobnVtX3ZmcyAmJiBhZGFwdGVyLT5zcmlvdl9lbmFibGVkKSB8fAorCQkoYWRhcHRlci0+ZnVuY3Rpb25fbW9kZSAmIDB4NDAwKSB8fAorCQlsYW5jZXJfY2hpcChhZGFwdGVyKSB8fCAhYmVfcGh5c2ZuKGFkYXB0ZXIpKSB7CisJCWFkYXB0ZXItPm51bV90eF9xcyA9IDE7CisJCW5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMoYWRhcHRlci0+bmV0ZGV2LAorCQkJYWRhcHRlci0+bnVtX3R4X3FzKTsKKwl9IGVsc2UgeworCQlhZGFwdGVyLT5udW1fdHhfcXMgPSBNQVhfVFhfUVM7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMyODgsNyArMzMzMSw3IEBACiAJCWdvdG8gZGlzYWJsZV9kZXY7CiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKLQluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGJlX2FkYXB0ZXIpKTsKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2Yoc3RydWN0IGJlX2FkYXB0ZXIpLCBNQVhfVFhfUVMpOwogCWlmIChuZXRkZXYgPT0gTlVMTCkgewogCQlzdGF0dXMgPSAtRU5PTUVNOwogCQlnb3RvIHJlbF9yZWc7CkBAIC0zMzYwLDYgKzM0MDMsMTIgQEAKIAlpZiAoc3RhdHVzKQogCQlnb3RvIHN0YXRzX2NsZWFuOwogCisJLyogVGhlIElOVFIgYml0IG1heSBiZSBzZXQgaW4gdGhlIGNhcmQgd2hlbiBwcm9iZWQgYnkgYSBrZHVtcCBrZXJuZWwKKwkgKiBhZnRlciBhIGNyYXNoLgorCSAqLworCWlmICghbGFuY2VyX2NoaXAoYWRhcHRlcikpCisJCWJlX2ludHJfc2V0KGFkYXB0ZXIsIGZhbHNlKTsKKwogCWJlX21zaXhfZW5hYmxlKGFkYXB0ZXIpOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmFkYXB0ZXItPndvcmssIGJlX3dvcmtlcik7CkBAIC0zMzk2LDYgKzM0NDUsNyBAQAogCX0KIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcyBwb3J0ICVkXG4iLCBuaWNfbmFtZShwZGV2KSwgYWRhcHRlci0+cG9ydF9udW0pOworCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZGFwdGVyLT53b3JrLCBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZmluX21hYy5jIGIvZHJpdmVycy9uZXQvYmZpbl9tYWMuYwppbmRleCA2OGQ0NWJhLi42YzAxOWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZmluX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2JmaW5fbWFjLmMKQEAgLTUyLDEzICs1MiwxMyBAQAogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpiZmluX21hYyIpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfVVNFX0wxKQotIyBkZWZpbmUgYmZpbl9tYWNfYWxsb2MoZG1hX2hhbmRsZSwgc2l6ZSkgIGwxX2RhdGFfc3JhbV96YWxsb2Moc2l6ZSkKLSMgZGVmaW5lIGJmaW5fbWFjX2ZyZWUoZG1hX2hhbmRsZSwgcHRyKSAgICBsMV9kYXRhX3NyYW1fZnJlZShwdHIpCisjIGRlZmluZSBiZmluX21hY19hbGxvYyhkbWFfaGFuZGxlLCBzaXplLCBudW0pICBsMV9kYXRhX3NyYW1femFsbG9jKHNpemUqbnVtKQorIyBkZWZpbmUgYmZpbl9tYWNfZnJlZShkbWFfaGFuZGxlLCBwdHIsIG51bSkgICAgbDFfZGF0YV9zcmFtX2ZyZWUocHRyKQogI2Vsc2UKLSMgZGVmaW5lIGJmaW5fbWFjX2FsbG9jKGRtYV9oYW5kbGUsIHNpemUpIFwKLQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2l6ZSwgZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCkKLSMgZGVmaW5lIGJmaW5fbWFjX2ZyZWUoZG1hX2hhbmRsZSwgcHRyKSBcCi0JZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2l6ZW9mKCpwdHIpLCBwdHIsIGRtYV9oYW5kbGUpCisjIGRlZmluZSBiZmluX21hY19hbGxvYyhkbWFfaGFuZGxlLCBzaXplLCBudW0pIFwKKwlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2l6ZSpudW0sIGRtYV9oYW5kbGUsIEdGUF9LRVJORUwpCisjIGRlZmluZSBiZmluX21hY19mcmVlKGRtYV9oYW5kbGUsIHB0ciwgbnVtKSBcCisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2l6ZW9mKCpwdHIpKm51bSwgcHRyLCBkbWFfaGFuZGxlKQogI2VuZGlmCiAKICNkZWZpbmUgUEtUX0JVRl9TWiAxNTgwCkBAIC05NSw3ICs5NSw3IEBACiAJCQkJdCA9IHQtPm5leHQ7CiAJCQl9CiAJCX0KLQkJYmZpbl9tYWNfZnJlZShkbWFfaGFuZGxlLCB0eF9kZXNjKTsKKwkJYmZpbl9tYWNfZnJlZShkbWFfaGFuZGxlLCB0eF9kZXNjLCBDT05GSUdfQkZJTl9UWF9ERVNDX05VTSk7CiAJfQogCiAJaWYgKHJ4X2Rlc2MpIHsKQEAgLTEwOSw3ICsxMDksNyBAQAogCQkJCXIgPSByLT5uZXh0OwogCQkJfQogCQl9Ci0JCWJmaW5fbWFjX2ZyZWUoZG1hX2hhbmRsZSwgcnhfZGVzYyk7CisJCWJmaW5fbWFjX2ZyZWUoZG1hX2hhbmRsZSwgcnhfZGVzYywgQ09ORklHX0JGSU5fUlhfREVTQ19OVU0pOwogCX0KIH0KIApAQCAtMTI2LDEzICsxMjYsMTMgQEAKICNlbmRpZgogCiAJdHhfZGVzYyA9IGJmaW5fbWFjX2FsbG9jKCZkbWFfaGFuZGxlLAotCQkJCXNpemVvZihzdHJ1Y3QgbmV0X2RtYV9kZXNjX3R4KSAqCisJCQkJc2l6ZW9mKHN0cnVjdCBuZXRfZG1hX2Rlc2NfdHgpLAogCQkJCUNPTkZJR19CRklOX1RYX0RFU0NfTlVNKTsKIAlpZiAodHhfZGVzYyA9PSBOVUxMKQogCQlnb3RvIGluaXRfZXJyb3I7CiAKIAlyeF9kZXNjID0gYmZpbl9tYWNfYWxsb2MoJmRtYV9oYW5kbGUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBuZXRfZG1hX2Rlc2NfcngpICoKKwkJCQlzaXplb2Yoc3RydWN0IG5ldF9kbWFfZGVzY19yeCksCiAJCQkJQ09ORklHX0JGSU5fUlhfREVTQ19OVU0pOwogCWlmIChyeF9kZXNjID09IE5VTEwpCiAJCWdvdG8gaW5pdF9lcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JtYWMuYyBiL2RyaXZlcnMvbmV0L2JtYWMuYwppbmRleCBhMWI4YzhiLi40NWU0NWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibWFjLmMKKysrIGIvZHJpdmVycy9uZXQvYm1hYy5jCkBAIC03LDYgKzcsNyBAQAogICogTWF5IDE5OTksIEFsIFZpcm86IHByb3BlciByZWxlYXNlIG9mIC9wcm9jL25ldC9ibWFjIGVudHJ5LCBzd2l0Y2hlZCB0bwogICogZHluYW1pYyBwcm9jZnMgaW5vZGUuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KQEAgLTEwMTQsNyArMTAxNSw2IEBACiBzdGF0aWMgdm9pZCBibWFjX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCWNoYXIgKmFkZHJzOwogCWludCBpOwogCXVuc2lnbmVkIHNob3J0IHJ4X2NmZzsKIAl1MzIgY3JjOwpAQCAtMTAzOCwxMiArMTAzOCw3IEBACiAJCWZvcihpID0gMDsgaSA8IDQ7IGkrKykgaGFzaF90YWJsZVtpXSA9IDA7CiAKIAkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewotCQkJYWRkcnMgPSBoYS0+YWRkcjsKLQotCQkJaWYoISgqYWRkcnMgJiAxKSkKLQkJCQljb250aW51ZTsKLQotCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBoYS0+YWRkcik7CiAJCQljcmMgPj49IDI2OwogCQkJaGFzaF90YWJsZVtjcmMgPj4gNF0gfD0gMSA8PCAoY3JjICYgMHhmKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm5hL2JmYV9jZWUuYyBiL2RyaXZlcnMvbmV0L2JuYS9iZmFfY2VlLmMKaW5kZXggZjdiNzg5YS4uMzllNWFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm5hL2JmYV9jZWUuYworKysgYi9kcml2ZXJzL25ldC9ibmEvYmZhX2NlZS5jCkBAIC0yMjMsNDQgKzIyMyw1NiBAQAogfQogCiAvKioKLSAqIGJmYV9jZWVfaGJmYWlsKCkKKyAqIGJmYV9jZWVfbm90aWZ5KCkKICAqCiAgKiBAYnJpZWYgQ0VFIG1vZHVsZSBoZWFydC1iZWF0IGZhaWx1cmUgaGFuZGxlci4KKyAqIEBicmllZiBDRUUgbW9kdWxlIElPQyBldmVudCBoYW5kbGVyLgogICoKLSAqIEBwYXJhbVtpbl0gUG9pbnRlciB0byB0aGUgQ0VFIG1vZHVsZSBkYXRhIHN0cnVjdHVyZS4KKyAqIEBwYXJhbVtpbl0gSU9DIGV2ZW50IHR5cGUKICAqCiAgKiBAcmV0dXJuIHZvaWQKICAqLwogCiBzdGF0aWMgdm9pZAotYmZhX2NlZV9oYmZhaWwodm9pZCAqYXJnKQorYmZhX2NlZV9ub3RpZnkodm9pZCAqYXJnLCBlbnVtIGJmYV9pb2NfZXZlbnQgZXZlbnQpCiB7CiAJc3RydWN0IGJmYV9jZWUgKmNlZTsKIAljZWUgPSAoc3RydWN0IGJmYV9jZWUgKikgYXJnOwogCi0JaWYgKGNlZS0+Z2V0X2F0dHJfcGVuZGluZyA9PSB0cnVlKSB7Ci0JCWNlZS0+Z2V0X2F0dHJfc3RhdHVzID0gQkZBX1NUQVRVU19GQUlMRUQ7Ci0JCWNlZS0+Z2V0X2F0dHJfcGVuZGluZyAgPSBmYWxzZTsKLQkJaWYgKGNlZS0+Y2Jmbi5nZXRfYXR0cl9jYmZuKSB7Ci0JCQljZWUtPmNiZm4uZ2V0X2F0dHJfY2JmbihjZWUtPmNiZm4uZ2V0X2F0dHJfY2JhcmcsCi0JCQkgICAgQkZBX1NUQVRVU19GQUlMRUQpOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JT0NfRV9ESVNBQkxFRDoKKwljYXNlIEJGQV9JT0NfRV9GQUlMRUQ6CisJCWlmIChjZWUtPmdldF9hdHRyX3BlbmRpbmcgPT0gdHJ1ZSkgeworCQkJY2VlLT5nZXRfYXR0cl9zdGF0dXMgPSBCRkFfU1RBVFVTX0ZBSUxFRDsKKwkJCWNlZS0+Z2V0X2F0dHJfcGVuZGluZyAgPSBmYWxzZTsKKwkJCWlmIChjZWUtPmNiZm4uZ2V0X2F0dHJfY2JmbikgeworCQkJCWNlZS0+Y2Jmbi5nZXRfYXR0cl9jYmZuKAorCQkJCQljZWUtPmNiZm4uZ2V0X2F0dHJfY2JhcmcsCisJCQkJCUJGQV9TVEFUVVNfRkFJTEVEKTsKKwkJCX0KIAkJfQotCX0KLQlpZiAoY2VlLT5nZXRfc3RhdHNfcGVuZGluZyA9PSB0cnVlKSB7Ci0JCWNlZS0+Z2V0X3N0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfRkFJTEVEOwotCQljZWUtPmdldF9zdGF0c19wZW5kaW5nICA9IGZhbHNlOwotCQlpZiAoY2VlLT5jYmZuLmdldF9zdGF0c19jYmZuKSB7Ci0JCQljZWUtPmNiZm4uZ2V0X3N0YXRzX2NiZm4oY2VlLT5jYmZuLmdldF9zdGF0c19jYmFyZywKLQkJCSAgICBCRkFfU1RBVFVTX0ZBSUxFRCk7CisJCWlmIChjZWUtPmdldF9zdGF0c19wZW5kaW5nID09IHRydWUpIHsKKwkJCWNlZS0+Z2V0X3N0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfRkFJTEVEOworCQkJY2VlLT5nZXRfc3RhdHNfcGVuZGluZyAgPSBmYWxzZTsKKwkJCWlmIChjZWUtPmNiZm4uZ2V0X3N0YXRzX2NiZm4pIHsKKwkJCQljZWUtPmNiZm4uZ2V0X3N0YXRzX2NiZm4oCisJCQkJCWNlZS0+Y2Jmbi5nZXRfc3RhdHNfY2JhcmcsCisJCQkJCUJGQV9TVEFUVVNfRkFJTEVEKTsKKwkJCX0KIAkJfQotCX0KLQlpZiAoY2VlLT5yZXNldF9zdGF0c19wZW5kaW5nID09IHRydWUpIHsKLQkJY2VlLT5yZXNldF9zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX0ZBSUxFRDsKLQkJY2VlLT5yZXNldF9zdGF0c19wZW5kaW5nICA9IGZhbHNlOwotCQlpZiAoY2VlLT5jYmZuLnJlc2V0X3N0YXRzX2NiZm4pIHsKLQkJCWNlZS0+Y2Jmbi5yZXNldF9zdGF0c19jYmZuKGNlZS0+Y2Jmbi5yZXNldF9zdGF0c19jYmFyZywKLQkJCSAgICBCRkFfU1RBVFVTX0ZBSUxFRCk7CisJCWlmIChjZWUtPnJlc2V0X3N0YXRzX3BlbmRpbmcgPT0gdHJ1ZSkgeworCQkJY2VlLT5yZXNldF9zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX0ZBSUxFRDsKKwkJCWNlZS0+cmVzZXRfc3RhdHNfcGVuZGluZyAgPSBmYWxzZTsKKwkJCWlmIChjZWUtPmNiZm4ucmVzZXRfc3RhdHNfY2JmbikgeworCQkJCWNlZS0+Y2Jmbi5yZXNldF9zdGF0c19jYmZuKAorCQkJCQljZWUtPmNiZm4ucmVzZXRfc3RhdHNfY2JhcmcsCisJCQkJCUJGQV9TVEFUVVNfRkFJTEVEKTsKKwkJCX0KIAkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIH0KIApAQCAtMjg2LDYgKzI5OCw3IEBACiAJY2VlLT5pb2MgPSBpb2M7CiAKIAliZmFfbndfaW9jX21ib3hfcmVnaXNyKGNlZS0+aW9jLCBCRklfTUNfQ0VFLCBiZmFfY2VlX2lzciwgY2VlKTsKLQliZmFfaW9jX2hiZmFpbF9pbml0KCZjZWUtPmhiZmFpbCwgYmZhX2NlZV9oYmZhaWwsIGNlZSk7Ci0JYmZhX253X2lvY19oYmZhaWxfcmVnaXN0ZXIoY2VlLT5pb2MsICZjZWUtPmhiZmFpbCk7CisJYmZhX3FfcWVfaW5pdCgmY2VlLT5pb2Nfbm90aWZ5KTsKKwliZmFfaW9jX25vdGlmeV9pbml0KCZjZWUtPmlvY19ub3RpZnksIGJmYV9jZWVfbm90aWZ5LCBjZWUpOworCWJmYV9ud19pb2Nfbm90aWZ5X3JlZ2lzdGVyKGNlZS0+aW9jLCAmY2VlLT5pb2Nfbm90aWZ5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JuYS9iZmFfY2VlLmggYi9kcml2ZXJzL25ldC9ibmEvYmZhX2NlZS5oCmluZGV4IDIwNTQzZDEuLjU4ZDU0ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JuYS9iZmFfY2VlLmgKKysrIGIvZHJpdmVycy9uZXQvYm5hL2JmYV9jZWUuaApAQCAtMjUsNyArMjUsNiBAQAogdHlwZWRlZiB2b2lkICgqYmZhX2NlZV9nZXRfYXR0cl9jYmZuX3QpICh2b2lkICpkZXYsIGVudW0gYmZhX3N0YXR1cyBzdGF0dXMpOwogdHlwZWRlZiB2b2lkICgqYmZhX2NlZV9nZXRfc3RhdHNfY2Jmbl90KSAodm9pZCAqZGV2LCBlbnVtIGJmYV9zdGF0dXMgc3RhdHVzKTsKIHR5cGVkZWYgdm9pZCAoKmJmYV9jZWVfcmVzZXRfc3RhdHNfY2Jmbl90KSAodm9pZCAqZGV2LCBlbnVtIGJmYV9zdGF0dXMgc3RhdHVzKTsKLXR5cGVkZWYgdm9pZCAoKmJmYV9jZWVfaGJmYWlsX2NiZm5fdCkgKHZvaWQgKmRldiwgZW51bSBiZmFfc3RhdHVzIHN0YXR1cyk7CiAKIHN0cnVjdCBiZmFfY2VlX2NiZm4gewogCWJmYV9jZWVfZ2V0X2F0dHJfY2Jmbl90ICAgIGdldF9hdHRyX2NiZm47CkBAIC00NSw3ICs0NCw3IEBACiAJZW51bSBiZmFfc3RhdHVzIGdldF9zdGF0c19zdGF0dXM7CiAJZW51bSBiZmFfc3RhdHVzIHJlc2V0X3N0YXRzX3N0YXR1czsKIAlzdHJ1Y3QgYmZhX2NlZV9jYmZuIGNiZm47Ci0Jc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeSBoYmZhaWw7CisJc3RydWN0IGJmYV9pb2Nfbm90aWZ5IGlvY19ub3RpZnk7CiAJc3RydWN0IGJmYV9jZWVfYXR0ciAqYXR0cjsKIAlzdHJ1Y3QgYmZhX2NlZV9zdGF0cyAqc3RhdHM7CiAJc3RydWN0IGJmYV9kbWEgYXR0cl9kbWE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibmEvYmZhX2NzLmggYi9kcml2ZXJzL25ldC9ibmEvYmZhX2NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhMWE5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JuYS9iZmFfY3MuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBCcm9jYWRlIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICovCisKKy8qKgorICogQGZpbGUgYmZhX2NzLmggQkZBIGNvbW1vbiBzZXJ2aWNlcworICovCisKKyNpZm5kZWYgX19CRkFfQ1NfSF9fCisjZGVmaW5lIF9fQkZBX0NTX0hfXworCisjaW5jbHVkZSAiY25hLmgiCisKKy8qKgorICogQCBCRkEgc3RhdGUgbWFjaGluZSBpbnRlcmZhY2VzCisgKi8KKwordHlwZWRlZiB2b2lkICgqYmZhX3NtX3QpKHZvaWQgKnNtLCBpbnQgZXZlbnQpOworCisvKioKKyAqIG9jIC0gb2JqZWN0IGNsYXNzIGVnLiBiZmFfaW9jCisgKiBzdCAtIHN0YXRlLCBlZy4gcmVzZXQKKyAqIG90eXBlIC0gb2JqZWN0IHR5cGUsIGVnLiBzdHJ1Y3QgYmZhX2lvYworICogZXR5cGUgLSBvYmplY3QgdHlwZSwgZWcuIGVudW0gaW9jX2V2ZW50CisgKi8KKyNkZWZpbmUgYmZhX3NtX3N0YXRlX2RlY2wob2MsIHN0LCBvdHlwZSwgZXR5cGUpCQkJXAorCXN0YXRpYyB2b2lkIG9jICMjIF9zbV8gIyMgc3Qob3R5cGUgKiBmc20sIGV0eXBlIGV2ZW50KQorCisjZGVmaW5lIGJmYV9zbV9zZXRfc3RhdGUoX3NtLCBfc3RhdGUpCSgoX3NtKS0+c20gPSAoYmZhX3NtX3QpKF9zdGF0ZSkpCisjZGVmaW5lIGJmYV9zbV9zZW5kX2V2ZW50KF9zbSwgX2V2ZW50KQkoKF9zbSktPnNtKChfc20pLCAoX2V2ZW50KSkpCisjZGVmaW5lIGJmYV9zbV9nZXRfc3RhdGUoX3NtKQkJKChfc20pLT5zbSkKKyNkZWZpbmUgYmZhX3NtX2NtcF9zdGF0ZShfc20sIF9zdGF0ZSkJKChfc20pLT5zbSA9PSAoYmZhX3NtX3QpKF9zdGF0ZSkpCisKKy8qKgorICogRm9yIGNvbnZlcnRpbmcgZnJvbSBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uIHRvIHN0YXRlIGVuY29kaW5nLgorICovCitzdHJ1Y3QgYmZhX3NtX3RhYmxlIHsKKwliZmFfc21fdAlzbTsJLyohPCBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uCSovCisJaW50CQlzdGF0ZTsJLyohPCBzdGF0ZSBtYWNoaW5lIGVuY29kaW5nCSovCisJY2hhcgkJKm5hbWU7CS8qITwgc3RhdGUgbmFtZSBmb3IgZGlzcGxheQkqLworfTsKKyNkZWZpbmUgQkZBX1NNKF9zbSkJCSgoYmZhX3NtX3QpKF9zbSkpCisKKy8qKgorICogU3RhdGUgbWFjaGluZSB3aXRoIGVudHJ5IGFjdGlvbnMuCisgKi8KK3R5cGVkZWYgdm9pZCAoKmJmYV9mc21fdCkodm9pZCAqZnNtLCBpbnQgZXZlbnQpOworCisvKioKKyAqIG9jIC0gb2JqZWN0IGNsYXNzIGVnLiBiZmFfaW9jCisgKiBzdCAtIHN0YXRlLCBlZy4gcmVzZXQKKyAqIG90eXBlIC0gb2JqZWN0IHR5cGUsIGVnLiBzdHJ1Y3QgYmZhX2lvYworICogZXR5cGUgLSBvYmplY3QgdHlwZSwgZWcuIGVudW0gaW9jX2V2ZW50CisgKi8KKyNkZWZpbmUgYmZhX2ZzbV9zdGF0ZV9kZWNsKG9jLCBzdCwgb3R5cGUsIGV0eXBlKQkJCVwKKwlzdGF0aWMgdm9pZCBvYyAjIyBfc21fICMjIHN0KG90eXBlICogZnNtLCBldHlwZSBldmVudCk7CQlcCisJc3RhdGljIHZvaWQgb2MgIyMgX3NtXyAjIyBzdCAjIyBfZW50cnkob3R5cGUgKiBmc20pCisKKyNkZWZpbmUgYmZhX2ZzbV9zZXRfc3RhdGUoX2ZzbSwgX3N0YXRlKSBkbyB7CQkJCVwKKwkoX2ZzbSktPmZzbSA9IChiZmFfZnNtX3QpKF9zdGF0ZSk7CQkJCVwKKwlfc3RhdGUgIyMgX2VudHJ5KF9mc20pOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYmZhX2ZzbV9zZW5kX2V2ZW50KF9mc20sIF9ldmVudCkJKChfZnNtKS0+ZnNtKChfZnNtKSwgKF9ldmVudCkpKQorI2RlZmluZSBiZmFfZnNtX2dldF9zdGF0ZShfZnNtKQkJCSgoX2ZzbSktPmZzbSkKKyNkZWZpbmUgYmZhX2ZzbV9jbXBfc3RhdGUoX2ZzbSwgX3N0YXRlKQkJCQkJXAorCSgoX2ZzbSktPmZzbSA9PSAoYmZhX2ZzbV90KShfc3RhdGUpKQorCitzdGF0aWMgaW5saW5lIGludAorYmZhX3NtX3RvX3N0YXRlKGNvbnN0IHN0cnVjdCBiZmFfc21fdGFibGUgKnNtdCwgYmZhX3NtX3Qgc20pCit7CisJaW50CWkgPSAwOworCisJd2hpbGUgKHNtdFtpXS5zbSAmJiBzbXRbaV0uc20gIT0gc20pCisJCWkrKzsKKwlyZXR1cm4gc210W2ldLnN0YXRlOworfQorCisvKioKKyAqIEAgR2VuZXJpYyB3YWl0IGNvdW50ZXIuCisgKi8KKwordHlwZWRlZiB2b2lkICgqYmZhX3djX3Jlc3VtZV90KSAodm9pZCAqY2JhcmcpOworCitzdHJ1Y3QgYmZhX3djIHsKKwliZmFfd2NfcmVzdW1lX3Qgd2NfcmVzdW1lOworCXZvaWQJCSp3Y19jYmFyZzsKKwlpbnQJCXdjX2NvdW50OworfTsKKworc3RhdGljIGlubGluZSB2b2lkCitiZmFfd2NfdXAoc3RydWN0IGJmYV93YyAqd2MpCit7CisJd2MtPndjX2NvdW50Kys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYmZhX3djX2Rvd24oc3RydWN0IGJmYV93YyAqd2MpCit7CisJd2MtPndjX2NvdW50LS07CisJaWYgKHdjLT53Y19jb3VudCA9PSAwKQorCQl3Yy0+d2NfcmVzdW1lKHdjLT53Y19jYmFyZyk7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBhIHdhaXRpbmcgY291bnRlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitiZmFfd2NfaW5pdChzdHJ1Y3QgYmZhX3djICp3YywgYmZhX3djX3Jlc3VtZV90IHdjX3Jlc3VtZSwgdm9pZCAqd2NfY2JhcmcpCit7CisJd2MtPndjX3Jlc3VtZSA9IHdjX3Jlc3VtZTsKKwl3Yy0+d2NfY2JhcmcgPSB3Y19jYmFyZzsKKwl3Yy0+d2NfY291bnQgPSAwOworCWJmYV93Y191cCh3Yyk7Cit9CisKKy8qKgorICogV2FpdCBmb3IgY291bnRlciB0byByZWFjaCB6ZXJvCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYmZhX3djX3dhaXQoc3RydWN0IGJmYV93YyAqd2MpCit7CisJYmZhX3djX2Rvd24od2MpOworfQorCisjZW5kaWYgLyogX19CRkFfQ1NfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibmEvYmZhX2RlZnMuaCBiL2RyaXZlcnMvbmV0L2JuYS9iZmFfZGVmcy5oCmluZGV4IDJlYTBkZmUuLmIwODBiMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JuYS9iZmFfZGVmcy5oCisrKyBiL2RyaXZlcnMvbmV0L2JuYS9iZmFfZGVmcy5oCkBAIC04MCw3ICs4MCw3IEBACiAKIGVudW0gewogCUJGQV9JT0NfRFJJVkVSX0xFTgk9IDE2LAotCUJGQV9JT0NfQ0hJUF9SRVZfTEVOIAk9IDgsCisJQkZBX0lPQ19DSElQX1JFVl9MRU4JPSA4LAogfTsKIAogLyoqCkBAIC0xNTMsNiArMTUzLDcgQEAKIAl1MzIJZW5hYmxlX3JlcXM7CiAJdTMyCWRpc2FibGVfcmVwbGllczsKIAl1MzIJZW5hYmxlX3JlcGxpZXM7CisJdTMyCXJzdmQ7CiB9OwogCiAvKioKQEAgLTE3NCw3ICsxNzUsNyBAQAogICovCiBzdHJ1Y3QgYmZhX2lvY19hdHRyIHsKIAllbnVtIGJmYV9pb2NfdHlwZSBpb2NfdHlwZTsKLQllbnVtIGJmYV9pb2Nfc3RhdGUgCQlzdGF0ZTsJCS8qITwgSU9DIHN0YXRlICAgICAgKi8KKwllbnVtIGJmYV9pb2Nfc3RhdGUJCXN0YXRlOwkJLyohPCBJT0Mgc3RhdGUgICAgICAqLwogCXN0cnVjdCBiZmFfYWRhcHRlcl9hdHRyIGFkYXB0ZXJfYXR0cjsJLyohPCBIQkEgYXR0cmlidXRlcyAqLwogCXN0cnVjdCBiZmFfaW9jX2RyaXZlcl9hdHRyIGRyaXZlcl9hdHRyOwkvKiE8IGRyaXZlciBhdHRyICAgICovCiAJc3RydWN0IGJmYV9pb2NfcGNpX2F0dHIgcGNpX2F0dHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibmEvYmZhX2RlZnNfbWZnX2NvbW0uaCBiL2RyaXZlcnMvbmV0L2JuYS9iZmFfZGVmc19tZmdfY29tbS5oCmluZGV4IGZkZDY3NzYuLjg4NWVmM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JuYS9iZmFfZGVmc19tZmdfY29tbS5oCisrKyBiL2RyaXZlcnMvbmV0L2JuYS9iZmFfZGVmc19tZmdfY29tbS5oCkBAIC0xOTIsMTQgKzE5MiwxNCBAQAogICogVlBEIHZlbmRvciB0YWcKICAqLwogZW51bSB7Ci0JQkZBX01GR19WUERfVU5LTk9XTgk9IDAsICAgICAvKiE8IHZlbmRvciB1bmtub3duIAkJKi8KLQlCRkFfTUZHX1ZQRF9JQk0gCT0gMSwgICAgIC8qITwgdmVuZG9yIElCTSAJCSovCi0JQkZBX01GR19WUERfSFAgIAk9IDIsICAgICAvKiE8IHZlbmRvciBIUCAgCQkqLwotCUJGQV9NRkdfVlBEX0RFTEwgIAk9IDMsICAgICAvKiE8IHZlbmRvciBERUxMICAJCSovCi0JQkZBX01GR19WUERfUENJX0lCTSAJPSAweDA4LCAgLyohPCBQQ0kgVlBEIElCTSAgICAgCQkqLwotCUJGQV9NRkdfVlBEX1BDSV9IUCAgCT0gMHgxMCwgIC8qITwgUENJIFZQRCBIUAkJKi8KLQlCRkFfTUZHX1ZQRF9QQ0lfREVMTCAgCT0gMHgyMCwgIC8qITwgUENJIFZQRCBERUxMCQkqLwotCUJGQV9NRkdfVlBEX1BDSV9CUkNEIAk9IDB4ZjgsICAvKiE8IFBDSSBWUEQgQnJvY2FkZSAJCSovCisJQkZBX01GR19WUERfVU5LTk9XTgk9IDAsICAgICAvKiE8IHZlbmRvciB1bmtub3duCQkqLworCUJGQV9NRkdfVlBEX0lCTQkJPSAxLCAgICAgLyohPCB2ZW5kb3IgSUJNCQkqLworCUJGQV9NRkdfVlBEX0hQCQk9IDIsICAgICAvKiE8IHZlbmRvciBIUAkJCSovCisJQkZBX01GR19WUERfREVMTAk9IDMsICAgICAvKiE8IHZlbmRvciBERUxMCQkqLworCUJGQV9NRkdfVlBEX1BDSV9JQk0JPSAweDA4LCAgLyohPCBQQ0kgVlBEIElCTQkJKi8KKwlCRkFfTUZHX1ZQRF9QQ0lfSFAJPSAweDEwLCAgLyohPCBQQ0kgVlBEIEhQCQkqLworCUJGQV9NRkdfVlBEX1BDSV9ERUxMCT0gMHgyMCwgIC8qITwgUENJIFZQRCBERUxMCQkqLworCUJGQV9NRkdfVlBEX1BDSV9CUkNECT0gMHhmOCwgIC8qITwgUENJIFZQRCBCcm9jYWRlCQkqLwogfTsKIAogLyoqCkBAIC0yMTIsOCArMjEyLDggQEAKIAl1OAkJdnBkX3NpZ1szXTsJLyohPCBjaGFyYWN0ZXJzICdWJywgJ1AnLCAnRCcgKi8KIAl1OAkJY2hrc3VtOwkJLyohPCB1OCBjaGVja3N1bSAqLwogCXU4CQl2ZW5kb3I7CQkvKiE8IHZlbmRvciAqLwotCXU4IAlsZW47CQkvKiE8IHZwZCBkYXRhIGxlbmd0aCBleGNsdWRpbmcgaGVhZGVyICovCi0JdTggCXJzdjsKKwl1OAlsZW47CQkvKiE8IHZwZCBkYXRhIGxlbmd0aCBleGNsdWRpbmcgaGVhZGVyICovCisJdTgJcnN2OwogCXU4CQlkYXRhW0JGQV9NRkdfVlBEX0xFTl07CS8qITwgdnBkIGRhdGEgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JuYS9iZmFfZGVmc19zdGF0dXMuaCBiL2RyaXZlcnMvbmV0L2JuYS9iZmFfZGVmc19zdGF0dXMuaAppbmRleCBhZjk1MTEyLi43YzVmZTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibmEvYmZhX2RlZnNfc3RhdHVzLmgKKysrIGIvZHJpdmVycy9uZXQvYm5hL2JmYV9kZWZzX3N0YXR1cy5oCkBAIC0yNSw5NSArMjUsOTUgQEAKICAqIGNvbW1lbnRzIGFyZSBzdXBwb3J0ZWQKICAqLwogZW51bSBiZmFfc3RhdHVzIHsKLQlCRkFfU1RBVFVTX09LIAkJPSAwLAotCUJGQV9TVEFUVVNfRkFJTEVEIAk9IDEsCi0JQkZBX1NUQVRVU19FSU5WQUwgCT0gMiwKLQlCRkFfU1RBVFVTX0VOT01FTSAJPSAzLAotCUJGQV9TVEFUVVNfRU5PU1lTIAk9IDQsCi0JQkZBX1NUQVRVU19FVElNRVIgCT0gNSwKLQlCRkFfU1RBVFVTX0VQUk9UT0NPTCAJPSA2LAotCUJGQV9TVEFUVVNfRU5PRkNQT1JUUyAJPSA3LAotCUJGQV9TVEFUVVNfTk9GTEFTSCAJPSA4LAotCUJGQV9TVEFUVVNfQkFERkxBU0ggCT0gOSwKLQlCRkFfU1RBVFVTX1NGUF9VTlNVUFAgCT0gMTAsCisJQkZBX1NUQVRVU19PSyA9IDAsCisJQkZBX1NUQVRVU19GQUlMRUQgPSAxLAorCUJGQV9TVEFUVVNfRUlOVkFMID0gMiwKKwlCRkFfU1RBVFVTX0VOT01FTSA9IDMsCisJQkZBX1NUQVRVU19FTk9TWVMgPSA0LAorCUJGQV9TVEFUVVNfRVRJTUVSID0gNSwKKwlCRkFfU1RBVFVTX0VQUk9UT0NPTCA9IDYsCisJQkZBX1NUQVRVU19FTk9GQ1BPUlRTID0gNywKKwlCRkFfU1RBVFVTX05PRkxBU0ggPSA4LAorCUJGQV9TVEFUVVNfQkFERkxBU0ggPSA5LAorCUJGQV9TVEFUVVNfU0ZQX1VOU1VQUCA9IDEwLAogCUJGQV9TVEFUVVNfVU5LTk9XTl9WRklEID0gMTEsCiAJQkZBX1NUQVRVU19EQVRBQ09SUlVQVEVEID0gMTIsCi0JQkZBX1NUQVRVU19ERVZCVVNZIAk9IDEzLAotCUJGQV9TVEFUVVNfQUJPUlRFRCAJPSAxNCwKLQlCRkFfU1RBVFVTX05PREVWIAk9IDE1LAotCUJGQV9TVEFUVVNfSERNQV9GQUlMRUQgCT0gMTYsCisJQkZBX1NUQVRVU19ERVZCVVNZID0gMTMsCisJQkZBX1NUQVRVU19BQk9SVEVEID0gMTQsCisJQkZBX1NUQVRVU19OT0RFViA9IDE1LAorCUJGQV9TVEFUVVNfSERNQV9GQUlMRUQgPSAxNiwKIAlCRkFfU1RBVFVTX0ZMQVNIX0JBRF9MRU4gPSAxNywKIAlCRkFfU1RBVFVTX1VOS05PV05fTFdXTiA9IDE4LAogCUJGQV9TVEFUVVNfVU5LTk9XTl9SV1dOID0gMTksCi0JQkZBX1NUQVRVU19GQ1BUX0xTX1JKVCAJPSAyMCwKKwlCRkFfU1RBVFVTX0ZDUFRfTFNfUkpUID0gMjAsCiAJQkZBX1NUQVRVU19WUE9SVF9FWElTVFMgPSAyMSwKLQlCRkFfU1RBVFVTX1ZQT1JUX01BWCAJPSAyMiwKKwlCRkFfU1RBVFVTX1ZQT1JUX01BWCA9IDIyLAogCUJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEID0gMjMsCi0JQkZBX1NUQVRVU19JTlZMRF9ERlNaIAk9IDI0LAotCUJGQV9TVEFUVVNfQ05GR19GQUlMRUQgCT0gMjUsCi0JQkZBX1NUQVRVU19DTURfTk9UU1VQUCAJPSAyNiwKLQlCRkFfU1RBVFVTX05PX0FEQVBURVIgCT0gMjcsCi0JQkZBX1NUQVRVU19MSU5LRE9XTiAJPSAyOCwKLQlCRkFfU1RBVFVTX0ZBQlJJQ19SSlQgCT0gMjksCisJQkZBX1NUQVRVU19JTlZMRF9ERlNaID0gMjQsCisJQkZBX1NUQVRVU19DTkZHX0ZBSUxFRCA9IDI1LAorCUJGQV9TVEFUVVNfQ01EX05PVFNVUFAgPSAyNiwKKwlCRkFfU1RBVFVTX05PX0FEQVBURVIgPSAyNywKKwlCRkFfU1RBVFVTX0xJTktET1dOID0gMjgsCisJQkZBX1NUQVRVU19GQUJSSUNfUkpUID0gMjksCiAJQkZBX1NUQVRVU19VTktOT1dOX1ZXV04gPSAzMCwKIAlCRkFfU1RBVFVTX05TTE9HSU5fRkFJTEVEID0gMzEsCi0JQkZBX1NUQVRVU19OT19SUE9SVFMgCT0gMzIsCisJQkZBX1NUQVRVU19OT19SUE9SVFMgPSAzMiwKIAlCRkFfU1RBVFVTX05TUVVFUllfRkFJTEVEID0gMzMsCiAJQkZBX1NUQVRVU19QT1JUX09GRkxJTkUgPSAzNCwKIAlCRkFfU1RBVFVTX1JQT1JUX09GRkxJTkUgPSAzNSwKIAlCRkFfU1RBVFVTX1RHVE9QRU5fRkFJTEVEID0gMzYsCi0JQkZBX1NUQVRVU19CQURfTFVOUyAJPSAzNywKLQlCRkFfU1RBVFVTX0lPX0ZBSUxVUkUgCT0gMzgsCi0JQkZBX1NUQVRVU19OT19GQUJSSUMgCT0gMzksCi0JQkZBX1NUQVRVU19FQkFERiAJPSA0MCwKLQlCRkFfU1RBVFVTX0VJTlRSIAk9IDQxLAotCUJGQV9TVEFUVVNfRUlPIAkJPSA0MiwKLQlCRkFfU1RBVFVTX0VOT1RUWSAJPSA0MywKLQlCRkFfU1RBVFVTX0VOWElPIAk9IDQ0LAotCUJGQV9TVEFUVVNfRUZPUEVOIAk9IDQ1LAorCUJGQV9TVEFUVVNfQkFEX0xVTlMgPSAzNywKKwlCRkFfU1RBVFVTX0lPX0ZBSUxVUkUgPSAzOCwKKwlCRkFfU1RBVFVTX05PX0ZBQlJJQyA9IDM5LAorCUJGQV9TVEFUVVNfRUJBREYgPSA0MCwKKwlCRkFfU1RBVFVTX0VJTlRSID0gNDEsCisJQkZBX1NUQVRVU19FSU8gPSA0MiwKKwlCRkFfU1RBVFVTX0VOT1RUWSA9IDQzLAorCUJGQV9TVEFUVVNfRU5YSU8gPSA0NCwKKwlCRkFfU1RBVFVTX0VGT1BFTiA9IDQ1LAogCUJGQV9TVEFUVVNfVlBPUlRfV1dOX0JQID0gNDYsCiAJQkZBX1NUQVRVU19QT1JUX05PVF9ESVNBQkxFRCA9IDQ3LAotCUJGQV9TVEFUVVNfQkFERlJNSERSIAk9IDQ4LAotCUJGQV9TVEFUVVNfQkFERlJNU1ogCT0gNDksCi0JQkZBX1NUQVRVU19NSVNTSU5HRlJNIAk9IDUwLAotCUJGQV9TVEFUVVNfTElOS1RJTUVPVVQgCT0gNTEsCisJQkZBX1NUQVRVU19CQURGUk1IRFIgPSA0OCwKKwlCRkFfU1RBVFVTX0JBREZSTVNaID0gNDksCisJQkZBX1NUQVRVU19NSVNTSU5HRlJNID0gNTAsCisJQkZBX1NUQVRVU19MSU5LVElNRU9VVCA9IDUxLAogCUJGQV9TVEFUVVNfTk9fRkNQSU1fTkVYVVMgPSA1MiwKIAlCRkFfU1RBVFVTX0NIRUNLU1VNX0ZBSUwgPSA1MywKLQlCRkFfU1RBVFVTX0daTUVfRkFJTEVEIAk9IDU0LAorCUJGQV9TVEFUVVNfR1pNRV9GQUlMRUQgPSA1NCwKIAlCRkFfU1RBVFVTX1NDU0lTVEFSVF9SRVFEID0gNTUsCi0JQkZBX1NUQVRVU19JT0NfRkFJTFVSRSAJPSA1NiwKLQlCRkFfU1RBVFVTX0lOVkFMSURfV1dOIAk9IDU3LAotCUJGQV9TVEFUVVNfTUlTTUFUQ0ggCT0gNTgsCi0JQkZBX1NUQVRVU19JT0NfRU5BQkxFRCAJPSA1OSwKKwlCRkFfU1RBVFVTX0lPQ19GQUlMVVJFID0gNTYsCisJQkZBX1NUQVRVU19JTlZBTElEX1dXTiA9IDU3LAorCUJGQV9TVEFUVVNfTUlTTUFUQ0ggPSA1OCwKKwlCRkFfU1RBVFVTX0lPQ19FTkFCTEVEID0gNTksCiAJQkZBX1NUQVRVU19BREFQVEVSX0VOQUJMRUQgPSA2MCwKLQlCRkFfU1RBVFVTX0lPQ19OT05fT1AgCT0gNjEsCisJQkZBX1NUQVRVU19JT0NfTk9OX09QID0gNjEsCiAJQkZBX1NUQVRVU19BRERSX01BUF9GQUlMVVJFID0gNjIsCi0JQkZBX1NUQVRVU19TQU1FX05BTUUgCT0gNjMsCi0JQkZBX1NUQVRVU19QRU5ESU5HICAgICAgPSA2NCwKLQlCRkFfU1RBVFVTXzhHX1NQRAk9IDY1LAotCUJGQV9TVEFUVVNfNEdfU1BECT0gNjYsCisJQkZBX1NUQVRVU19TQU1FX05BTUUgPSA2MywKKwlCRkFfU1RBVFVTX1BFTkRJTkcgPSA2NCwKKwlCRkFfU1RBVFVTXzhHX1NQRCA9IDY1LAorCUJGQV9TVEFUVVNfNEdfU1BEID0gNjYsCiAJQkZBX1NUQVRVU19BRF9JU19FTkFCTEUgPSA2NywKLQlCRkFfU1RBVFVTX0VJTlZBTF9UT1YgCT0gNjgsCisJQkZBX1NUQVRVU19FSU5WQUxfVE9WID0gNjgsCiAJQkZBX1NUQVRVU19FSU5WQUxfUURFUFRIID0gNjksCiAJQkZBX1NUQVRVU19WRVJTSU9OX0ZBSUwgPSA3MCwKLQlCRkFfU1RBVFVTX0RJQUdfQlVTWSAgICA9IDcxLAotCUJGQV9TVEFUVVNfQkVBQ09OX09OCT0gNzIsCi0JQkZBX1NUQVRVU19CRUFDT05fT0ZGCT0gNzMsCi0JQkZBX1NUQVRVU19MQkVBQ09OX09OICAgPSA3NCwKLQlCRkFfU1RBVFVTX0xCRUFDT05fT0ZGCT0gNzUsCisJQkZBX1NUQVRVU19ESUFHX0JVU1kgPSA3MSwKKwlCRkFfU1RBVFVTX0JFQUNPTl9PTiA9IDcyLAorCUJGQV9TVEFUVVNfQkVBQ09OX09GRiA9IDczLAorCUJGQV9TVEFUVVNfTEJFQUNPTl9PTiA9IDc0LAorCUJGQV9TVEFUVVNfTEJFQUNPTl9PRkYgPSA3NSwKIAlCRkFfU1RBVFVTX1BPUlRfTk9UX0lOSVRFRCA9IDc2LAogCUJGQV9TVEFUVVNfUlBTQ19FTkFCTEVEID0gNzcsCi0JQkZBX1NUQVRVU19FTk9GU0FWRSAJPSA3OCwKLQlCRkFfU1RBVFVTX0JBRF9GSUxFCQk9IDc5LAotCUJGQV9TVEFUVVNfUkxJTV9FTgkJPSA4MCwKLQlCRkFfU1RBVFVTX1JMSU1fRElTCQk9IDgxLAotCUJGQV9TVEFUVVNfSU9DX0RJU0FCTEVEICA9IDgyLAotCUJGQV9TVEFUVVNfQURBUFRFUl9ESVNBQkxFRCAgPSA4MywKLQlCRkFfU1RBVFVTX0JJT1NfRElTQUJMRUQgID0gODQsCi0JQkZBX1NUQVRVU19BVVRIX0VOQUJMRUQgID0gODUsCi0JQkZBX1NUQVRVU19BVVRIX0RJU0FCTEVEICA9IDg2LAotCUJGQV9TVEFUVVNfRVJST1JfVFJMX0VOQUJMRUQgID0gODcsCi0JQkZBX1NUQVRVU19FUlJPUl9RT1NfRU5BQkxFRCAgPSA4OCwKKwlCRkFfU1RBVFVTX0VOT0ZTQVZFID0gNzgsCisJQkZBX1NUQVRVU19CQURfRklMRSA9IDc5LAorCUJGQV9TVEFUVVNfUkxJTV9FTiA9IDgwLAorCUJGQV9TVEFUVVNfUkxJTV9ESVMgPSA4MSwKKwlCRkFfU1RBVFVTX0lPQ19ESVNBQkxFRCA9IDgyLAorCUJGQV9TVEFUVVNfQURBUFRFUl9ESVNBQkxFRCA9IDgzLAorCUJGQV9TVEFUVVNfQklPU19ESVNBQkxFRCA9IDg0LAorCUJGQV9TVEFUVVNfQVVUSF9FTkFCTEVEID0gODUsCisJQkZBX1NUQVRVU19BVVRIX0RJU0FCTEVEID0gODYsCisJQkZBX1NUQVRVU19FUlJPUl9UUkxfRU5BQkxFRCA9IDg3LAorCUJGQV9TVEFUVVNfRVJST1JfUU9TX0VOQUJMRUQgPSA4OCwKIAlCRkFfU1RBVFVTX05PX1NGUF9ERVYgPSA4OSwKIAlCRkFfU1RBVFVTX01FTVRFU1RfRkFJTEVEID0gOTAsCiAJQkZBX1NUQVRVU19JTlZBTElEX0RFVklEID0gOTEsCkBAIC0xOTAsNyArMTkwLDcgQEAKIAlCRkFfU1RBVFVTX0ZMQVNIX0NLRkFJTCA9IDE2MiwKIAlCRkFfU1RBVFVTX1RSVU5LX1VOU1VQUCA9IDE2MywKIAlCRkFfU1RBVFVTX1RSVU5LX0VOQUJMRUQgPSAxNjQsCi0JQkZBX1NUQVRVU19UUlVOS19ESVNBQkxFRCAgPSAxNjUsCisJQkZBX1NUQVRVU19UUlVOS19ESVNBQkxFRCA9IDE2NSwKIAlCRkFfU1RBVFVTX1RSVU5LX0VSUk9SX1RSTF9FTkFCTEVEID0gMTY2LAogCUJGQV9TVEFUVVNfQk9PVF9DT0RFX1VQREFURUQgPSAxNjcsCiAJQkZBX1NUQVRVU19CT09UX1ZFUlNJT04gPSAxNjgsCkBAIC0xOTgsOCArMTk4LDggQEAKIAlCRkFfU1RBVFVTX0lOVkFMSURfQ0FSRFRZUEUgPSAxNzAsCiAJQkZBX1NUQVRVU19OT19UT1BPTE9HWV9GT1JfQ05BID0gMTcxLAogCUJGQV9TVEFUVVNfSU1fVkxBTl9PVkVSX1RFQU1fREVMRVRFX0ZBSUxFRCA9IDE3MiwKLQlCRkFfU1RBVFVTX0VUSEJPT1RfRU5BQkxFRCAgPSAxNzMsCi0JQkZBX1NUQVRVU19FVEhCT09UX0RJU0FCTEVEICA9IDE3NCwKKwlCRkFfU1RBVFVTX0VUSEJPT1RfRU5BQkxFRCA9IDE3MywKKwlCRkFfU1RBVFVTX0VUSEJPT1RfRElTQUJMRUQgPSAxNzQsCiAJQkZBX1NUQVRVU19JT1BST0ZJTEVfT0ZGID0gMTc1LAogCUJGQV9TVEFUVVNfTk9fUE9SVF9JTlNUQU5DRSA9IDE3NiwKIAlCRkFfU1RBVFVTX0JPT1RfQ09ERV9USU1FRE9VVCA9IDE3NywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JuYS9iZmFfaW9jLmMgYi9kcml2ZXJzL25ldC9ibmEvYmZhX2lvYy5jCmluZGV4IGZjYjliYjMuLjEyNmIwYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JuYS9iZmFfaW9jLmMKKysrIGIvZHJpdmVycy9uZXQvYm5hL2JmYV9pb2MuYwpAQCAtNTgsNiArNTgsNyBAQAogLyoKICAqIGZvcndhcmQgZGVjbGFyYXRpb25zCiAgKi8KK3N0YXRpYyB2b2lkIGJmYV9pb2NfaHdfc2VtX2luaXQoc3RydWN0IGJmYV9pb2MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2h3X3NlbV9nZXQoc3RydWN0IGJmYV9pb2MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2h3X3NlbV9nZXRfY2FuY2VsKHN0cnVjdCBiZmFfaW9jICppb2MpOwogc3RhdGljIHZvaWQgYmZhX2lvY19od2luaXQoc3RydWN0IGJmYV9pb2MgKmlvYywgYm9vbCBmb3JjZSk7CkBAIC02OCw5ICs2OSwxMCBAQAogc3RhdGljIHZvaWQgYmZhX2lvY19oYl9zdG9wKHN0cnVjdCBiZmFfaW9jICppb2MpOwogc3RhdGljIHZvaWQgYmZhX2lvY19yZXNldChzdHJ1Y3QgYmZhX2lvYyAqaW9jLCBib29sIGZvcmNlKTsKIHN0YXRpYyB2b2lkIGJmYV9pb2NfbWJveF9wb2xsKHN0cnVjdCBiZmFfaW9jICppb2MpOwotc3RhdGljIHZvaWQgYmZhX2lvY19tYm94X2hiZmFpbChzdHJ1Y3QgYmZhX2lvYyAqaW9jKTsKK3N0YXRpYyB2b2lkIGJmYV9pb2NfbWJveF9mbHVzaChzdHJ1Y3QgYmZhX2lvYyAqaW9jKTsKIHN0YXRpYyB2b2lkIGJmYV9pb2NfcmVjb3ZlcihzdHJ1Y3QgYmZhX2lvYyAqaW9jKTsKIHN0YXRpYyB2b2lkIGJmYV9pb2NfY2hlY2tfYXR0cl93d25zKHN0cnVjdCBiZmFfaW9jICppb2MpOworc3RhdGljIHZvaWQgYmZhX2lvY19ldmVudF9ub3RpZnkoc3RydWN0IGJmYV9pb2MgKiwgZW51bSBiZmFfaW9jX2V2ZW50KTsKIHN0YXRpYyB2b2lkIGJmYV9pb2NfZGlzYWJsZV9jb21wKHN0cnVjdCBiZmFfaW9jICppb2MpOwogc3RhdGljIHZvaWQgYmZhX2lvY19scHVfc3RvcChzdHJ1Y3QgYmZhX2lvYyAqaW9jKTsKIHN0YXRpYyB2b2lkIGJmYV9pb2NfZmFpbF9ub3RpZnkoc3RydWN0IGJmYV9pb2MgKmlvYyk7CkBAIC0xMDcsNyArMTA5LDcgQEAKIAlJT0NfRV9GV1JTUF9HRVRBVFRSCT0gNiwJLyohPCBJT0MgZ2V0IGF0dHJpYnV0ZSByZXNwb25zZQkqLwogCUlPQ19FX0RJU0FCTEVECQk9IDcsCS8qITwgZi93IGRpc2FibGVkCQkqLwogCUlPQ19FX0lOSVRGQUlMRUQJPSA4LAkvKiE8IGZhaWx1cmUgbm90aWNlIGJ5IGlvY3BmIHNtCSovCi0JSU9DX0VfUEZBSUxFRAkJPSA5LAkvKiE8IGZhaWx1cmUgbm90aWNlIGJ5IGlvY3BmIHNtCSovCisJSU9DX0VfUEZGQUlMRUQJCT0gOSwJLyohPCBmYWlsdXJlIG5vdGljZSBieSBpb2NwZiBzbQkqLwogCUlPQ19FX0hCRkFJTAkJPSAxMCwJLyohPCBoZWFydGJlYXQgZmFpbHVyZQkJKi8KIAlJT0NfRV9IV0VSUk9SCQk9IDExLAkvKiE8IGhhcmR3YXJlIGVycm9yIGludGVycnVwdAkqLwogCUlPQ19FX1RJTUVPVVQJCT0gMTIsCS8qITwgdGltZW91dAkJCSovCkBAIC0xNTYsNyArMTU4LDcgQEAKIAlJT0NQRl9FX0VOQUJMRQkJPSAxLAkvKiE8IElPQ1BGIGVuYWJsZSByZXF1ZXN0CSovCiAJSU9DUEZfRV9ESVNBQkxFCQk9IDIsCS8qITwgSU9DUEYgZGlzYWJsZSByZXF1ZXN0CSovCiAJSU9DUEZfRV9TVE9QCQk9IDMsCS8qITwgc3RvcCBvbiBkcml2ZXIgZGV0YWNoCSovCi0JSU9DUEZfRV9GV1JFQURZCSAJPSA0LAkvKiE8IGYvdyBpbml0aWFsaXphdGlvbiBkb25lCSovCisJSU9DUEZfRV9GV1JFQURZCQk9IDQsCS8qITwgZi93IGluaXRpYWxpemF0aW9uIGRvbmUJKi8KIAlJT0NQRl9FX0ZXUlNQX0VOQUJMRQk9IDUsCS8qITwgZW5hYmxlIGYvdyByZXNwb25zZQkqLwogCUlPQ1BGX0VfRldSU1BfRElTQUJMRQk9IDYsCS8qITwgZGlzYWJsZSBmL3cgcmVzcG9uc2UJKi8KIAlJT0NQRl9FX0ZBSUwJCT0gNywJLyohPCBmYWlsdXJlIG5vdGljZSBieSBpb2Mgc20JKi8KQEAgLTIzOSw3ICsyNDEsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTI3Miw3ICsyNzQsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTI5NCwxMiArMjk2LDEyIEBACiAJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9nZXRhdHRyKTsKIAkJYnJlYWs7CiAKLQljYXNlIElPQ19FX1BGQUlMRUQ6CisJY2FzZSBJT0NfRV9QRkZBSUxFRDoKIAkJLyogISEhIGZhbGwgdGhyb3VnaCAhISEgKi8KIAljYXNlIElPQ19FX0hXRVJST1I6CiAJCWlvYy0+Y2Jmbi0+ZW5hYmxlX2NiZm4oaW9jLT5iZmEsIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkUpOwogCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZmFpbF9yZXRyeSk7Ci0JCWlmIChldmVudCAhPSBJT0NfRV9QRkFJTEVEKQorCQlpZiAoZXZlbnQgIT0gSU9DX0VfUEZGQUlMRUQpCiAJCQliZmFfaW9jcGZfaW5pdGZhaWwoaW9jKTsKIAkJYnJlYWs7CiAKQEAgLTMxNiw3ICszMTgsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTM0NCwxNCArMzQ2LDE0IEBACiAJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9vcCk7CiAJCWJyZWFrOwogCi0JY2FzZSBJT0NfRV9QRkFJTEVEOgorCWNhc2UgSU9DX0VfUEZGQUlMRUQ6CiAJY2FzZSBJT0NfRV9IV0VSUk9SOgogCQlkZWxfdGltZXIoJmlvYy0+aW9jX3RpbWVyKTsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBJT0NfRV9USU1FT1VUOgogCQlpb2MtPmNiZm4tPmVuYWJsZV9jYmZuKGlvYy0+YmZhLCBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFKTsKIAkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2ZhaWxfcmV0cnkpOwotCQlpZiAoZXZlbnQgIT0gSU9DX0VfUEZBSUxFRCkKKwkJaWYgKGV2ZW50ICE9IElPQ19FX1BGRkFJTEVEKQogCQkJYmZhX2lvY3BmX2dldGF0dHJmYWlsKGlvYyk7CiAJCWJyZWFrOwogCkBAIC0zNjQsNyArMzY2LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQoaW9jLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC0zODcsNyArMzg5LDcgQEAKIAkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2Rpc2FibGluZyk7CiAJCWJyZWFrOwogCi0JY2FzZSBJT0NfRV9QRkFJTEVEOgorCWNhc2UgSU9DX0VfUEZGQUlMRUQ6CiAJY2FzZSBJT0NfRV9IV0VSUk9SOgogCQliZmFfaW9jX2hiX3N0b3AoaW9jKTsKIAkJLyogISEhIGZhbGwgdGhyb3VnaCAhISEgKi8KQEAgLTM5OCwxMiArNDAwLDEyIEBACiAJCWVsc2UKIAkJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9mYWlsKTsKIAotCQlpZiAoZXZlbnQgIT0gSU9DX0VfUEZBSUxFRCkKKwkJaWYgKGV2ZW50ICE9IElPQ19FX1BGRkFJTEVEKQogCQkJYmZhX2lvY3BmX2ZhaWwoaW9jKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQoaW9jLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC00MzQsNyArNDM2LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQoaW9jLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC00NjUsNyArNDY3LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQoaW9jLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC00ODUsMTMgKzQ4NywxMyBAQAogCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZ2V0YXR0cik7CiAJCWJyZWFrOwogCi0JY2FzZSBJT0NfRV9QRkFJTEVEOgorCWNhc2UgSU9DX0VfUEZGQUlMRUQ6CiAJY2FzZSBJT0NfRV9IV0VSUk9SOgogCQkvKioKIAkJICogSW5pdGlhbGl6YXRpb24gcmV0cnkgZmFpbGVkLgogCQkgKi8KIAkJaW9jLT5jYmZuLT5lbmFibGVfY2Jmbihpb2MtPmJmYSwgQkZBX1NUQVRVU19JT0NfRkFJTFVSRSk7Ci0JCWlmIChldmVudCAhPSBJT0NfRV9QRkFJTEVEKQorCQlpZiAoZXZlbnQgIT0gSU9DX0VfUEZGQUlMRUQpCiAJCQliZmFfaW9jcGZfaW5pdGZhaWwoaW9jKTsKIAkJYnJlYWs7CiAKQEAgLTUxMiw3ICs1MTQsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTU0Niw3ICs1NDgsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTU3OSw3ICs1ODEsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChpb2NwZi0+aW9jLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC01ODksNiArNTkxLDcgQEAKIHN0YXRpYyB2b2lkCiBiZmFfaW9jcGZfc21fZndjaGVja19lbnRyeShzdHJ1Y3QgYmZhX2lvY3BmICppb2NwZikKIHsKKwliZmFfaW9jX2h3X3NlbV9pbml0KGlvY3BmLT5pb2MpOwogCWJmYV9pb2NfaHdfc2VtX2dldChpb2NwZi0+aW9jKTsKIH0KIApAQCAtNjMxLDcgKzYzNCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtNjc1LDcgKzY3OCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtNzE0LDcgKzcxNyw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtNzYyLDcgKzc2NSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtODEzLDcgKzgxNiw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtODU2LDcgKzg1OSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtODk4LDcgKzkwMSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtOTI3LDcgKzkzMCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtOTM3LDYgKzk0MCw3IEBACiBzdGF0aWMgdm9pZAogYmZhX2lvY3BmX3NtX2Rpc2FibGVkX2VudHJ5KHN0cnVjdCBiZmFfaW9jcGYgKmlvY3BmKQogeworCWJmYV9pb2NfbWJveF9mbHVzaChpb2NwZi0+aW9jKTsKIAliZmFfaW9jX3BmX2Rpc2FibGVkKGlvY3BmLT5pb2MpOwogfQogCkBAIC05NTcsNyArOTYxLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQoaW9jLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC0xMDA5LDcgKzEwMTMsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTEwMzgsNyArMTA0Miw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtMTA1Myw3ICsxMDU3LDcgQEAKIAkvKioKIAkgKiBGbHVzaCBhbnkgcXVldWVkIHVwIG1haWxib3ggcmVxdWVzdHMuCiAJICovCi0JYmZhX2lvY19tYm94X2hiZmFpbChpb2NwZi0+aW9jKTsKKwliZmFfaW9jX21ib3hfZmx1c2goaW9jcGYtPmlvYyk7CiAJYmZhX2lvY19od19zZW1fZ2V0KGlvY3BmLT5pb2MpOwogfQogCkBAIC0xMDkzLDcgKzEwOTcsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTExMTUsNyArMTExOSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGlvY3BmLT5pb2MsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTExMjMsMjEgKzExMjcsMjYgQEAKICAqIEJGQSBJT0MgcHJpdmF0ZSBmdW5jdGlvbnMKICAqLwogCisvKioKKyAqIE5vdGlmeSBjb21tb24gbW9kdWxlcyByZWdpc3RlcmVkIGZvciBub3RpZmljYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jX2V2ZW50X25vdGlmeShzdHJ1Y3QgYmZhX2lvYyAqaW9jLCBlbnVtIGJmYV9pb2NfZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmYV9pb2Nfbm90aWZ5ICpub3RpZnk7CisJc3RydWN0IGxpc3RfaGVhZAkJCSpxZTsKKworCWxpc3RfZm9yX2VhY2gocWUsICZpb2MtPm5vdGlmeV9xKSB7CisJCW5vdGlmeSA9IChzdHJ1Y3QgYmZhX2lvY19ub3RpZnkgKilxZTsKKwkJbm90aWZ5LT5jYmZuKG5vdGlmeS0+Y2JhcmcsIGV2ZW50KTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkCiBiZmFfaW9jX2Rpc2FibGVfY29tcChzdHJ1Y3QgYmZhX2lvYyAqaW9jKQogewotCXN0cnVjdCBsaXN0X2hlYWQJCQkqcWU7Ci0Jc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeSAqbm90aWZ5OwotCiAJaW9jLT5jYmZuLT5kaXNhYmxlX2NiZm4oaW9jLT5iZmEpOwotCi0JLyoqCi0JICogTm90aWZ5IGNvbW1vbiBtb2R1bGVzIHJlZ2lzdGVyZWQgZm9yIG5vdGlmaWNhdGlvbi4KLQkgKi8KLQlsaXN0X2Zvcl9lYWNoKHFlLCAmaW9jLT5oYl9ub3RpZnlfcSkgewotCQlub3RpZnkgPSAoc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeSAqKSBxZTsKLQkJbm90aWZ5LT5jYmZuKG5vdGlmeS0+Y2JhcmcpOwotCX0KKwliZmFfaW9jX2V2ZW50X25vdGlmeShpb2MsIEJGQV9JT0NfRV9ESVNBQkxFRCk7CiB9CiAKIGJvb2wKQEAgLTExNjksNiArMTE3OCwyOSBAQAogfQogCiBzdGF0aWMgdm9pZAorYmZhX2lvY19od19zZW1faW5pdChzdHJ1Y3QgYmZhX2lvYyAqaW9jKQoreworCXN0cnVjdCBiZmlfaW9jX2ltYWdlX2hkciBmd2hkcjsKKwl1MzIgZndzdGF0ZSA9IHJlYWRsKGlvYy0+aW9jX3JlZ3MuaW9jX2Z3c3RhdGUpOworCisJaWYgKGZ3c3RhdGUgPT0gQkZJX0lPQ19VTklOSVQpCisJCXJldHVybjsKKworCWJmYV9ud19pb2NfZnd2ZXJfZ2V0KGlvYywgJmZ3aGRyKTsKKworCWlmIChzd2FiMzIoZndoZHIuZXhlYykgPT0gQkZJX0ZXQk9PVF9UWVBFX05PUk1BTCkKKwkJcmV0dXJuOworCisJd3JpdGVsKEJGSV9JT0NfVU5JTklULCBpb2MtPmlvY19yZWdzLmlvY19md3N0YXRlKTsKKworCS8qCisJICogVHJ5IHRvIGxvY2sgYW5kIHRoZW4gdW5sb2NrIHRoZSBzZW1hcGhvcmUuCisJICovCisJcmVhZGwoaW9jLT5pb2NfcmVncy5pb2Nfc2VtX3JlZyk7CisJd3JpdGVsKDEsIGlvYy0+aW9jX3JlZ3MuaW9jX3NlbV9yZWcpOworfQorCitzdGF0aWMgdm9pZAogYmZhX2lvY19od19zZW1fZ2V0KHN0cnVjdCBiZmFfaW9jICppb2MpCiB7CiAJdTMyCXIzMjsKQEAgLTE2MzgsNyArMTY3MCw3IEBACiAgKiBDbGVhbnVwIGFueSBwZW5kaW5nIHJlcXVlc3RzLgogICovCiBzdGF0aWMgdm9pZAotYmZhX2lvY19tYm94X2hiZmFpbChzdHJ1Y3QgYmZhX2lvYyAqaW9jKQorYmZhX2lvY19tYm94X2ZsdXNoKHN0cnVjdCBiZmFfaW9jICppb2MpCiB7CiAJc3RydWN0IGJmYV9pb2NfbWJveF9tb2QgKm1vZCA9ICZpb2MtPm1ib3hfbW9kOwogCXN0cnVjdCBiZmFfbWJveF9jbWQgKmNtZDsKQEAgLTE2NTAsMTcgKzE2ODIsMTEgQEAKIHN0YXRpYyB2b2lkCiBiZmFfaW9jX2ZhaWxfbm90aWZ5KHN0cnVjdCBiZmFfaW9jICppb2MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJKnFlOwotCXN0cnVjdCBiZmFfaW9jX2hiZmFpbF9ub3RpZnkJKm5vdGlmeTsKLQogCS8qKgogCSAqIE5vdGlmeSBkcml2ZXIgYW5kIGNvbW1vbiBtb2R1bGVzIHJlZ2lzdGVyZWQgZm9yIG5vdGlmaWNhdGlvbi4KIAkgKi8KIAlpb2MtPmNiZm4tPmhiZmFpbF9jYmZuKGlvYy0+YmZhKTsKLQlsaXN0X2Zvcl9lYWNoKHFlLCAmaW9jLT5oYl9ub3RpZnlfcSkgewotCQlub3RpZnkgPSAoc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeSAqKSBxZTsKLQkJbm90aWZ5LT5jYmZuKG5vdGlmeS0+Y2JhcmcpOwotCX0KKwliZmFfaW9jX2V2ZW50X25vdGlmeShpb2MsIEJGQV9JT0NfRV9GQUlMRUQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTY4NCw3ICsxNzEwLDcgQEAKIHN0YXRpYyB2b2lkCiBiZmFfaW9jX3BmX2ZhaWxlZChzdHJ1Y3QgYmZhX2lvYyAqaW9jKQogewotCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX1BGQUlMRUQpOworCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX1BGRkFJTEVEKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE4MzksNyArMTg2NSw3IEBACiAJaW9jLT5pb2NwZi5pb2MgID0gaW9jOwogCiAJYmZhX2lvY19tYm94X2F0dGFjaChpb2MpOwotCUlOSVRfTElTVF9IRUFEKCZpb2MtPmhiX25vdGlmeV9xKTsKKwlJTklUX0xJU1RfSEVBRCgmaW9jLT5ub3RpZnlfcSk7CiAKIAliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fdW5pbml0KTsKIAliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9SRVNFVCk7CkBAIC0xOTY5LDYgKzE5OTUsOCBAQAogCSAqIG1haWxib3ggaXMgZnJlZSAtLSBxdWV1ZSBjb21tYW5kIHRvIGZpcm13YXJlCiAJICovCiAJYmZhX2lvY19tYm94X3NlbmQoaW9jLCBjbWQtPm1zZywgc2l6ZW9mKGNtZC0+bXNnKSk7CisKKwlyZXR1cm47CiB9CiAKIC8qKgpAQCAtMjAwMSwxOCArMjAyOSwzMCBAQAogdm9pZAogYmZhX253X2lvY19lcnJvcl9pc3Ioc3RydWN0IGJmYV9pb2MgKmlvYykKIHsKKwliZmFfaW9jX3N0YXRzKGlvYywgaW9jX2hiZmFpbHMpOworCWJmYV9pb2Nfc3RhdHNfaGJfY291bnQoaW9jLCBpb2MtPmhiX2NvdW50KTsKIAliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9IV0VSUk9SKTsKIH0KIAogLyoqCisgKiByZXR1cm4gdHJ1ZSBpZiBJT0MgaXMgZGlzYWJsZWQKKyAqLworYm9vbAorYmZhX253X2lvY19pc19kaXNhYmxlZChzdHJ1Y3QgYmZhX2lvYyAqaW9jKQoreworCXJldHVybiBiZmFfZnNtX2NtcF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZGlzYWJsaW5nKSB8fAorCQliZmFfZnNtX2NtcF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZGlzYWJsZWQpOworfQorCisvKioKICAqIEFkZCB0byBJT0MgaGVhcnRiZWF0IGZhaWx1cmUgbm90aWZpY2F0aW9uIHF1ZXVlLiBUbyBiZSB1c2VkIGJ5IGNvbW1vbgogICogbW9kdWxlcyBzdWNoIGFzIGNlZSwgcG9ydCwgZGlhZy4KICAqLwogdm9pZAotYmZhX253X2lvY19oYmZhaWxfcmVnaXN0ZXIoc3RydWN0IGJmYV9pb2MgKmlvYywKLQkJCXN0cnVjdCBiZmFfaW9jX2hiZmFpbF9ub3RpZnkgKm5vdGlmeSkKK2JmYV9ud19pb2Nfbm90aWZ5X3JlZ2lzdGVyKHN0cnVjdCBiZmFfaW9jICppb2MsCisJCQlzdHJ1Y3QgYmZhX2lvY19ub3RpZnkgKm5vdGlmeSkKIHsKLQlsaXN0X2FkZF90YWlsKCZub3RpZnktPnFlLCAmaW9jLT5oYl9ub3RpZnlfcSk7CisJbGlzdF9hZGRfdGFpbCgmbm90aWZ5LT5xZSwgJmlvYy0+bm90aWZ5X3EpOwogfQogCiAjZGVmaW5lIEJGQV9NRkdfTkFNRSAiQnJvY2FkZSIKQEAgLTIyMTcsNiArMjI1Nyw3IEBACiB7CiAJcHJfY3JpdCgiSGVhcnQgQmVhdCBvZiBJT0MgaGFzIGZhaWxlZFxuIik7CiAJYmZhX2lvY19zdGF0cyhpb2MsIGlvY19oYmZhaWxzKTsKKwliZmFfaW9jX3N0YXRzX2hiX2NvdW50KGlvYywgaW9jLT5oYl9jb3VudCk7CiAJYmZhX2ZzbV9zZW5kX2V2ZW50KGlvYywgSU9DX0VfSEJGQUlMKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm5hL2JmYV9pb2MuaCBiL2RyaXZlcnMvbmV0L2JuYS9iZmFfaW9jLmgKaW5kZXggYmQ0OGFiZS4uYmRhODY2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm5hL2JmYV9pb2MuaAorKysgYi9kcml2ZXJzL25ldC9ibmEvYmZhX2lvYy5oCkBAIC0xOSw3ICsxOSw3IEBACiAjaWZuZGVmIF9fQkZBX0lPQ19IX18KICNkZWZpbmUgX19CRkFfSU9DX0hfXwogCi0jaW5jbHVkZSAiYmZhX3NtLmgiCisjaW5jbHVkZSAiYmZhX2NzLmgiCiAjaW5jbHVkZSAiYmZpLmgiCiAjaW5jbHVkZSAiY25hLmgiCiAKQEAgLTk3LDkgKzk3LDEyIEBACiAvKioKICAqIElPQyBNYWlsYm94IHN0cnVjdHVyZXMKICAqLwordHlwZWRlZiB2b2lkICgqYmZhX21ib3hfY21kX2NiZm5fdCkodm9pZCAqY2JhcmcpOwogc3RydWN0IGJmYV9tYm94X2NtZCB7CiAJc3RydWN0IGxpc3RfaGVhZAlxZTsKLQl1MzIJCQltc2dbQkZJX0lPQ19NU0dTWl07CisJYmZhX21ib3hfY21kX2NiZm5fdCAgICAgY2JmbjsKKwl2b2lkCQkgICAgKmNiYXJnOworCXUzMiAgICAgbXNnW0JGSV9JT0NfTVNHU1pdOwogfTsKIAogLyoqCkBAIC0xMzAsNiArMTMzLDIzIEBACiB9OwogCiAvKioKKyAqIElPQyBldmVudCBub3RpZmljYXRpb24gbWVjaGFuaXNtLgorICovCitlbnVtIGJmYV9pb2NfZXZlbnQgeworCUJGQV9JT0NfRV9FTkFCTEVECT0gMSwKKwlCRkFfSU9DX0VfRElTQUJMRUQJPSAyLAorCUJGQV9JT0NfRV9GQUlMRUQJPSAzLAorfTsKKwordHlwZWRlZiB2b2lkICgqYmZhX2lvY19ub3RpZnlfY2Jmbl90KSh2b2lkICosIGVudW0gYmZhX2lvY19ldmVudCk7CisKK3N0cnVjdCBiZmFfaW9jX25vdGlmeSB7CisJc3RydWN0IGxpc3RfaGVhZAlxZTsKKwliZmFfaW9jX25vdGlmeV9jYmZuX3QJY2JmbjsKKwl2b2lkCQkJKmNiYXJnOworfTsKKworLyoqCiAgKiBIZWFydGJlYXQgZmFpbHVyZSBub3RpZmljYXRpb24gcXVldWUgZWxlbWVudC4KICAqLwogc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeSB7CkBAIC0xNDEsNyArMTYxLDcgQEAKIC8qKgogICogSW5pdGlhbGl6ZSBhIGhlYXJ0YmVhdCBmYWlsdXJlIG5vdGlmaWNhdGlvbiBzdHJ1Y3R1cmUKICAqLwotI2RlZmluZSBiZmFfaW9jX2hiZmFpbF9pbml0KF9fbm90aWZ5LCBfX2NiZm4sIF9fY2JhcmcpIGRvIHsJXAorI2RlZmluZSBiZmFfaW9jX25vdGlmeV9pbml0KF9fbm90aWZ5LCBfX2NiZm4sIF9fY2JhcmcpIGRvIHsJXAogCShfX25vdGlmeSktPmNiZm4gPSAoX19jYmZuKTsJCQkJXAogCShfX25vdGlmeSktPmNiYXJnID0gKF9fY2JhcmcpOwkJCQlcCiB9IHdoaWxlICgwKQpAQCAtMTU1LDI1ICsxNzUsMjUgQEAKIAogc3RydWN0IGJmYV9pb2MgewogCWJmYV9mc21fdAkJZnNtOwotCXN0cnVjdCBiZmEgCQkqYmZhOwotCXN0cnVjdCBiZmFfcGNpZGV2IAlwY2lkZXY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgCWlvY190aW1lcjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAJaW9jcGZfdGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgCXNlbV90aW1lcjsKKwlzdHJ1Y3QgYmZhCQkqYmZhOworCXN0cnVjdCBiZmFfcGNpZGV2CXBjaWRldjsKKwlzdHJ1Y3QgdGltZXJfbGlzdAlpb2NfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QJaW9jcGZfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QJc2VtX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0CWhiX3RpbWVyOwogCXUzMgkJCWhiX2NvdW50OwotCXN0cnVjdCBsaXN0X2hlYWQJaGJfbm90aWZ5X3E7CisJc3RydWN0IGxpc3RfaGVhZAlub3RpZnlfcTsKIAl2b2lkCQkJKmRiZ19md3NhdmU7CiAJaW50CQkJZGJnX2Z3c2F2ZV9sZW47CiAJYm9vbAkJCWRiZ19md3NhdmVfb25jZTsKIAllbnVtIGJmaV9tY2xhc3MJCWlvY19tYzsKLQlzdHJ1Y3QgYmZhX2lvY19yZWdzIAlpb2NfcmVnczsKKwlzdHJ1Y3QgYmZhX2lvY19yZWdzCWlvY19yZWdzOwogCXN0cnVjdCBiZmFfaW9jX2Rydl9zdGF0cyBzdGF0czsKIAlib29sCQkJZmNtb2RlOwogCWJvb2wJCQljdGRldjsKIAlib29sCQkJY25hOwogCWJvb2wJCQlwbGxpbml0OwotCWJvb2wgICAJCQlzdGF0c19idXN5OwkvKiE8IG91dHN0YW5kaW5nIHN0YXRzICovCisJYm9vbAkJCXN0YXRzX2J1c3k7CS8qITwgb3V0c3RhbmRpbmcgc3RhdHMgKi8KIAl1OAkJCXBvcnRfaWQ7CiAKIAlzdHJ1Y3QgYmZhX2RtYQkJYXR0cl9kbWE7CkBAIC0yMTcsOSArMjM3LDExIEBACiAJQkZJX0FEQVBURVJfR0VUUChOUE9SVFMsIChfX2lvYyktPmF0dHItPmFkYXB0ZXJfcHJvcCkKIAogI2RlZmluZSBiZmFfaW9jX3N0YXRzKF9pb2MsIF9zdGF0cykJKChfaW9jKS0+c3RhdHMuX3N0YXRzKyspCisjZGVmaW5lIGJmYV9pb2Nfc3RhdHNfaGJfY291bnQoX2lvYywgX2hiX2NvdW50KQlcCisJKChfaW9jKS0+c3RhdHMuaGJfY291bnQgPSAoX2hiX2NvdW50KSkKICNkZWZpbmUgQkZBX0lPQ19GV0lNR19NSU5TWgkoMTYgKiAxMDI0KQogI2RlZmluZSBCRkFfSU9DX0ZXSU1HX1RZUEUoX19pb2MpCQkJCQlcCi0JKCgoX19pb2MpLT5jdGRldikgPyAJCQkJCQlcCisJKCgoX19pb2MpLT5jdGRldikgPwkJCQkJCVwKIAkgKCgoX19pb2MpLT5mY21vZGUpID8gQkZJX0lNQUdFX0NUX0ZDIDogQkZJX0lNQUdFX0NUX0NOQSkgOglcCiAJIEJGSV9JTUFHRV9DQl9GQykKICNkZWZpbmUgQkZBX0lPQ19GV19TTUVNX1NJWkUoX19pb2MpCQkJCQlcCkBAIC0yNjMsOSArMjg1LDEwIEBACiB2b2lkIGJmYV9ud19pb2NfZGlzYWJsZShzdHJ1Y3QgYmZhX2lvYyAqaW9jKTsKIAogdm9pZCBiZmFfbndfaW9jX2Vycm9yX2lzcihzdHJ1Y3QgYmZhX2lvYyAqaW9jKTsKK2Jvb2wgYmZhX253X2lvY19pc19kaXNhYmxlZChzdHJ1Y3QgYmZhX2lvYyAqaW9jKTsKIHZvaWQgYmZhX253X2lvY19nZXRfYXR0cihzdHJ1Y3QgYmZhX2lvYyAqaW9jLCBzdHJ1Y3QgYmZhX2lvY19hdHRyICppb2NfYXR0cik7Ci12b2lkIGJmYV9ud19pb2NfaGJmYWlsX3JlZ2lzdGVyKHN0cnVjdCBiZmFfaW9jICppb2MsCi0Jc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeSAqbm90aWZ5KTsKK3ZvaWQgYmZhX253X2lvY19ub3RpZnlfcmVnaXN0ZXIoc3RydWN0IGJmYV9pb2MgKmlvYywKKwlzdHJ1Y3QgYmZhX2lvY19ub3RpZnkgKm5vdGlmeSk7CiBib29sIGJmYV9ud19pb2Nfc2VtX2dldCh2b2lkIF9faW9tZW0gKnNlbV9yZWcpOwogdm9pZCBiZmFfbndfaW9jX3NlbV9yZWxlYXNlKHZvaWQgX19pb21lbSAqc2VtX3JlZyk7CiB2b2lkIGJmYV9ud19pb2NfaHdfc2VtX3JlbGVhc2Uoc3RydWN0IGJmYV9pb2MgKmlvYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibmEvYmZhX3NtLmggYi9kcml2ZXJzL25ldC9ibmEvYmZhX3NtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDYyYzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvYm5hL2JmYV9zbS5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBCcm9jYWRlIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIHd3dy5icm9jYWRlLmNvbQotICovCi0KLS8qKgotICogQGZpbGUgYmZhc20uaCBTdGF0ZSBtYWNoaW5lIGRlZmluZXMKLSAqLwotCi0jaWZuZGVmIF9fQkZBX1NNX0hfXwotI2RlZmluZSBfX0JGQV9TTV9IX18KLQotI2luY2x1ZGUgImNuYS5oIgotCi10eXBlZGVmIHZvaWQgKCpiZmFfc21fdCkodm9pZCAqc20sIGludCBldmVudCk7Ci0KLS8qKgotICogb2MgLSBvYmplY3QgY2xhc3MgZWcuIGJmYV9pb2MKLSAqIHN0IC0gc3RhdGUsIGVnLiByZXNldAotICogb3R5cGUgLSBvYmplY3QgdHlwZSwgZWcuIHN0cnVjdCBiZmFfaW9jCi0gKiBldHlwZSAtIG9iamVjdCB0eXBlLCBlZy4gZW51bSBpb2NfZXZlbnQKLSAqLwotI2RlZmluZSBiZmFfc21fc3RhdGVfZGVjbChvYywgc3QsIG90eXBlLCBldHlwZSkJCVwKLQlzdGF0aWMgdm9pZCBvYyAjIyBfc21fICMjIHN0KG90eXBlICogZnNtLCBldHlwZSBldmVudCkKLQotI2RlZmluZSBiZmFfc21fc2V0X3N0YXRlKF9zbSwgX3N0YXRlKQkoKF9zbSktPnNtID0gKGJmYV9zbV90KShfc3RhdGUpKQotI2RlZmluZSBiZmFfc21fc2VuZF9ldmVudChfc20sIF9ldmVudCkJKChfc20pLT5zbSgoX3NtKSwgKF9ldmVudCkpKQotI2RlZmluZSBiZmFfc21fZ2V0X3N0YXRlKF9zbSkJCSgoX3NtKS0+c20pCi0jZGVmaW5lIGJmYV9zbV9jbXBfc3RhdGUoX3NtLCBfc3RhdGUpCSgoX3NtKS0+c20gPT0gKGJmYV9zbV90KShfc3RhdGUpKQotCi0vKioKLSAqIEZvciBjb252ZXJ0aW5nIGZyb20gc3RhdGUgbWFjaGluZSBmdW5jdGlvbiB0byBzdGF0ZSBlbmNvZGluZy4KLSAqLwotc3RydWN0IGJmYV9zbV90YWJsZSB7Ci0JYmZhX3NtX3QJc207CS8qITwgc3RhdGUgbWFjaGluZSBmdW5jdGlvbgkqLwotCWludAkJc3RhdGU7CS8qITwgc3RhdGUgbWFjaGluZSBlbmNvZGluZwkqLwotCWNoYXIJCSpuYW1lOwkvKiE8IHN0YXRlIG5hbWUgZm9yIGRpc3BsYXkJKi8KLX07Ci0jZGVmaW5lIEJGQV9TTShfc20pCSgoYmZhX3NtX3QpKF9zbSkpCi0KLS8qKgotICogU3RhdGUgbWFjaGluZSB3aXRoIGVudHJ5IGFjdGlvbnMuCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmJmYV9mc21fdCkodm9pZCAqZnNtLCBpbnQgZXZlbnQpOwotCi0vKioKLSAqIG9jIC0gb2JqZWN0IGNsYXNzIGVnLiBiZmFfaW9jCi0gKiBzdCAtIHN0YXRlLCBlZy4gcmVzZXQKLSAqIG90eXBlIC0gb2JqZWN0IHR5cGUsIGVnLiBzdHJ1Y3QgYmZhX2lvYwotICogZXR5cGUgLSBvYmplY3QgdHlwZSwgZWcuIGVudW0gaW9jX2V2ZW50Ci0gKi8KLSNkZWZpbmUgYmZhX2ZzbV9zdGF0ZV9kZWNsKG9jLCBzdCwgb3R5cGUsIGV0eXBlKQkJXAotCXN0YXRpYyB2b2lkIG9jICMjIF9zbV8gIyMgc3Qob3R5cGUgKiBmc20sIGV0eXBlIGV2ZW50KTsJXAotCXN0YXRpYyB2b2lkIG9jICMjIF9zbV8gIyMgc3QgIyMgX2VudHJ5KG90eXBlICogZnNtKQotCi0jZGVmaW5lIGJmYV9mc21fc2V0X3N0YXRlKF9mc20sIF9zdGF0ZSkgZG8gewlcCi0JKF9mc20pLT5mc20gPSAoYmZhX2ZzbV90KShfc3RhdGUpOwlcCi0JX3N0YXRlICMjIF9lbnRyeShfZnNtKTsJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIGJmYV9mc21fc2VuZF9ldmVudChfZnNtLCBfZXZlbnQpCSgoX2ZzbSktPmZzbSgoX2ZzbSksIChfZXZlbnQpKSkKLSNkZWZpbmUgYmZhX2ZzbV9nZXRfc3RhdGUoX2ZzbSkJCQkoKF9mc20pLT5mc20pCi0jZGVmaW5lIGJmYV9mc21fY21wX3N0YXRlKF9mc20sIF9zdGF0ZSkJCVwKLQkoKF9mc20pLT5mc20gPT0gKGJmYV9mc21fdCkoX3N0YXRlKSkKLQotc3RhdGljIGlubGluZSBpbnQKLWJmYV9zbV90b19zdGF0ZShjb25zdCBzdHJ1Y3QgYmZhX3NtX3RhYmxlICpzbXQsIGJmYV9zbV90IHNtKQotewotCWludAlpID0gMDsKLQotCXdoaWxlIChzbXRbaV0uc20gJiYgc210W2ldLnNtICE9IHNtKQotCQlpKys7Ci0JcmV0dXJuIHNtdFtpXS5zdGF0ZTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm5hL2JmYV93Yy5oIGIvZHJpdmVycy9uZXQvYm5hL2JmYV93Yy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGU0Y2FlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L2JuYS9iZmFfd2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiB3d3cuYnJvY2FkZS5jb20KLSAqLwotCi0vKioKLSAqIEBmaWxlIGJmYV93Yy5oIEdlbmVyaWMgd2FpdCBjb3VudGVyLgotICovCi0KLSNpZm5kZWYgX19CRkFfV0NfSF9fCi0jZGVmaW5lIF9fQkZBX1dDX0hfXwotCi10eXBlZGVmIHZvaWQgKCpiZmFfd2NfcmVzdW1lX3QpICh2b2lkICpjYmFyZyk7Ci0KLXN0cnVjdCBiZmFfd2MgewotCWJmYV93Y19yZXN1bWVfdCB3Y19yZXN1bWU7Ci0Jdm9pZAkJKndjX2NiYXJnOwotCWludAkJd2NfY291bnQ7Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWJmYV93Y191cChzdHJ1Y3QgYmZhX3djICp3YykKLXsKLQl3Yy0+d2NfY291bnQrKzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1iZmFfd2NfZG93bihzdHJ1Y3QgYmZhX3djICp3YykKLXsKLQl3Yy0+d2NfY291bnQtLTsKLQlpZiAod2MtPndjX2NvdW50ID09IDApCi0JCXdjLT53Y19yZXN1bWUod2MtPndjX2NiYXJnKTsKLX0KLQotLyoqCi0gKiBJbml0aWFsaXplIGEgd2FpdGluZyBjb3VudGVyLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWJmYV93Y19pbml0KHN0cnVjdCBiZmFfd2MgKndjLCBiZmFfd2NfcmVzdW1lX3Qgd2NfcmVzdW1lLCB2b2lkICp3Y19jYmFyZykKLXsKLQl3Yy0+d2NfcmVzdW1lID0gd2NfcmVzdW1lOwotCXdjLT53Y19jYmFyZyA9IHdjX2NiYXJnOwotCXdjLT53Y19jb3VudCA9IDA7Ci0JYmZhX3djX3VwKHdjKTsKLX0KLQotLyoqCi0gKiBXYWl0IGZvciBjb3VudGVyIHRvIHJlYWNoIHplcm8KLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1iZmFfd2Nfd2FpdChzdHJ1Y3QgYmZhX3djICp3YykKLXsKLQliZmFfd2NfZG93bih3Yyk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm5hL2JmaS5oIGIvZHJpdmVycy9uZXQvYm5hL2JmaS5oCmluZGV4IDYwNTAzNzkuLjA4ODIxMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JuYS9iZmkuaAorKysgYi9kcml2ZXJzL25ldC9ibmEvYmZpLmgKQEAgLTUxLDEzICs1MSwxMyBAQAogfTsKIAogI2RlZmluZSBiZmlfaDJpX3NldChfbWgsIF9tYywgX29wLCBfbHB1aWQpIGRvIHsJCVwKLQkoX21oKS5tc2dfY2xhc3MgCQk9IChfbWMpOwkJXAorCShfbWgpLm1zZ19jbGFzcwkJCT0gKF9tYyk7CQlcCiAJKF9taCkubXNnX2lkCQkJPSAoX29wKTsJCVwKIAkoX21oKS5tdGFnLmgyaS5scHVfaWQJPSAoX2xwdWlkKTsJCQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIGJmaV9pMmhfc2V0KF9taCwgX21jLCBfb3AsIF9pMmh0b2spIGRvIHsJCVwKLQkoX21oKS5tc2dfY2xhc3MgCQk9IChfbWMpOwkJXAorCShfbWgpLm1zZ19jbGFzcwkJCT0gKF9tYyk7CQlcCiAJKF9taCkubXNnX2lkCQkJPSAoX29wKTsJCVwKIAkoX21oKS5tdGFnLmkyaHRvawkJPSAoX2kyaHRvayk7CQlcCiB9IHdoaWxlICgwKQpAQCAtNjYsNyArNjYsNyBAQAogICogTWVzc2FnZSBvcGNvZGVzOiAwLTEyNyB0byBmaXJtd2FyZSwgMTI4LTI1NSB0byBob3N0CiAgKi8KICNkZWZpbmUgQkZJX0kySF9PUENPREVfQkFTRQkxMjgKLSNkZWZpbmUgQkZBX0kySE0oX3gpIAkJCSgoX3gpICsgQkZJX0kySF9PUENPREVfQkFTRSkKKyNkZWZpbmUgQkZBX0kySE0oX3gpCQkJKChfeCkgKyBCRklfSTJIX09QQ09ERV9CQVNFKQogCiAvKioKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xODYsNyArMTg2LDcgQEAKICNkZWZpbmUgQkZJX0JPT1RfVFlQRV9PRkYJCTgKICNkZWZpbmUgQkZJX0JPT1RfTE9BREVSX09GRgkJMTIKIAotI2RlZmluZSBCRklfQk9PVF9UWVBFX05PUk1BTCAJCTAKKyNkZWZpbmUgQkZJX0JPT1RfVFlQRV9OT1JNQUwJCTAKICNkZWZpbmUJQkZJX0JPT1RfVFlQRV9GTEFTSAkJMQogI2RlZmluZQlCRklfQk9PVF9UWVBFX01FTVRFU1QJCTIKIApAQCAtMjExLDkgKzIxMSw5IEBACiAKIGVudW0gYmZpX2lvY19pMmhfbXNncyB7CiAJQkZJX0lPQ19JMkhfRU5BQkxFX1JFUExZCT0gQkZBX0kySE0oMSksCi0JQkZJX0lPQ19JMkhfRElTQUJMRV9SRVBMWSAJPSBCRkFfSTJITSgyKSwKLQlCRklfSU9DX0kySF9HRVRBVFRSX1JFUExZIAk9IEJGQV9JMkhNKDMpLAotCUJGSV9JT0NfSTJIX1JFQURZX0VWRU5UIAk9IEJGQV9JMkhNKDQpLAorCUJGSV9JT0NfSTJIX0RJU0FCTEVfUkVQTFkJPSBCRkFfSTJITSgyKSwKKwlCRklfSU9DX0kySF9HRVRBVFRSX1JFUExZCT0gQkZBX0kySE0oMyksCisJQkZJX0lPQ19JMkhfUkVBRFlfRVZFTlQJCT0gQkZBX0kySE0oNCksCiAJQkZJX0lPQ19JMkhfSEJFQVQJCT0gQkZBX0kySE0oNSksCiB9OwogCkBAIC0yODksNiArMjg5LDEyIEBACiAJdTMyCW1kNXN1bVtCRklfSU9DX01ENVNVTV9TWl07CiB9OwogCitlbnVtIGJmaV9md2Jvb3RfdHlwZSB7CisJQkZJX0ZXQk9PVF9UWVBFX05PUk1BTAk9IDAsCisJQkZJX0ZXQk9PVF9UWVBFX0ZMQVNICT0gMSwKKwlCRklfRldCT09UX1RZUEVfTUVNVEVTVAk9IDIsCit9OworCiAvKioKICAqICBCRklfSU9DX0kySF9SRUFEWV9FVkVOVCBtZXNzYWdlCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JuYS9ibmEuaCBiL2RyaXZlcnMvbmV0L2JuYS9ibmEuaAppbmRleCBhMjg3Zjg5Li4yMWU5MTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibmEvYm5hLmgKKysrIGIvZHJpdmVycy9uZXQvYm5hL2JuYS5oCkBAIC0xMyw3ICsxMyw3IEBACiAjaWZuZGVmIF9fQk5BX0hfXwogI2RlZmluZSBfX0JOQV9IX18KIAotI2luY2x1ZGUgImJmYV93Yy5oIgorI2luY2x1ZGUgImJmYV9jcy5oIgogI2luY2x1ZGUgImJmYV9pb2MuaCIKICNpbmNsdWRlICJjbmEuaCIKICNpbmNsdWRlICJiZmlfbGwuaCIKQEAgLTg4LDcgKzg4LDcgQEAKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUJY29udGFpbmluZ19yZWMoYWRkciwgdHlwZSwgZmllbGQpCQkJCVwKLQkoKHR5cGUgKikoKHVuc2lnbmVkIGNoYXIgKikoYWRkcikgLSAJCQkJXAorCSgodHlwZSAqKSgodW5zaWduZWQgY2hhciAqKShhZGRyKSAtCQkJCVwKIAkodW5zaWduZWQgY2hhciAqKSgmKCh0eXBlICopMCktPmZpZWxkKSkpCiAKICNkZWZpbmUgQk5BX1RYUV9XSV9ORUVERUQoX3ZlY3RvcnMpCSgoKF92ZWN0b3JzKSArIDMpID4+IDIpCkBAIC0xMDEsOCArMTAxLDggQEAKIHsJCQkJCQkJCQlcCiAJdW5zaWduZWQgaW50IHBhZ2VfaW5kZXg7CS8qIGluZGV4IHdpdGhpbiBhIHBhZ2UgKi8JXAogCXZvaWQgKnBhZ2VfYWRkcjsJCQkJCQlcCi0JcGFnZV9pbmRleCA9IChfcWVfaWR4KSAmIChCTkFfVFhRX1BBR0VfSU5ERVhfTUFYIC0gMSk7IAkJXAotCShfcWVfcHRyX3JhbmdlKSA9IChCTkFfVFhRX1BBR0VfSU5ERVhfTUFYIC0gcGFnZV9pbmRleCk7IAlcCisJcGFnZV9pbmRleCA9IChfcWVfaWR4KSAmIChCTkFfVFhRX1BBR0VfSU5ERVhfTUFYIC0gMSk7CQlcCisJKF9xZV9wdHJfcmFuZ2UpID0gKEJOQV9UWFFfUEFHRV9JTkRFWF9NQVggLSBwYWdlX2luZGV4KTsJXAogCXBhZ2VfYWRkciA9IChfcXB0X3B0cilbKChfcWVfaWR4KSA+PiAgQk5BX1RYUV9QQUdFX0lOREVYX01BWF9TSElGVCldO1wKIAkoX3FlX3B0cikgPSAmKChzdHJ1Y3QgYm5hX3R4cV9lbnRyeSAqKShwYWdlX2FkZHIpKVtwYWdlX2luZGV4XTsgXAogfQpAQCAtMTY2LDI1ICsxNjYsMjUgQEAKIAkJKCgoX3FfcHRyKS0+cS5wcm9kdWNlcl9pbmRleCArIChfbnVtKSkgJgkJXAogCQkoKF9xX3B0ciktPnEucV9kZXB0aCAtIDEpKQogCi0jZGVmaW5lIEJOQV9RX0NJX0FERChfcV9wdHIsIF9udW0pIAkJCQkJXAorI2RlZmluZSBCTkFfUV9DSV9BREQoX3FfcHRyLCBfbnVtKQkJCQkJXAogCShfcV9wdHIpLT5xLmNvbnN1bWVyX2luZGV4ID0JCQkJCVwKLQkJKCgoX3FfcHRyKS0+cS5jb25zdW1lcl9pbmRleCArIChfbnVtKSkgIAkJXAorCQkoKChfcV9wdHIpLT5xLmNvbnN1bWVyX2luZGV4ICsgKF9udW0pKQkJCVwKIAkJJiAoKF9xX3B0ciktPnEucV9kZXB0aCAtIDEpKQogCiAjZGVmaW5lIEJOQV9RX0ZSRUVfQ09VTlQoX3FfcHRyKQkJCQkJXAogCShCTkFfUUVfRlJFRV9DTlQoJigoX3FfcHRyKS0+cSksIChfcV9wdHIpLT5xLnFfZGVwdGgpKQogCi0jZGVmaW5lIEJOQV9RX0lOX1VTRV9DT1VOVChfcV9wdHIpICAJCQkJCVwKKyNkZWZpbmUgQk5BX1FfSU5fVVNFX0NPVU5UKF9xX3B0cikJCQkJCVwKIAkoQk5BX1FFX0lOX1VTRV9DTlQoJihfcV9wdHIpLT5xLCAoX3FfcHRyKS0+cS5xX2RlcHRoKSkKIAogLyogVGhlc2UgbWFjcm9zIGJ1aWxkIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIFR4US9SeFEgZG9vcmJlbGwgKi8KLSNkZWZpbmUgQk5BX0RPT1JCRUxMX1FfUFJEX0lEWChfcGkpIAkoMHg4MDAwMDAwMCB8IChfcGkpKQorI2RlZmluZSBCTkFfRE9PUkJFTExfUV9QUkRfSURYKF9waSkJKDB4ODAwMDAwMDAgfCAoX3BpKSkKICNkZWZpbmUgQk5BX0RPT1JCRUxMX1FfU1RPUAkJKDB4NDAwMDAwMDApCiAKIC8qIFRoZXNlIG1hY3JvcyBidWlsZCB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBJQiBkb29yYmVsbCAqLwogI2RlZmluZSBCTkFfRE9PUkJFTExfSUJfSU5UX0FDSyhfdGltZW91dCwgX2V2ZW50cykgXAogCSgweDgwMDAwMDAwIHwgKChfdGltZW91dCkgPDwgMTYpIHwgKF9ldmVudHMpKQotI2RlZmluZSBCTkFfRE9PUkJFTExfSUJfSU5UX0RJU0FCTEUgCSgweDQwMDAwMDAwKQorI2RlZmluZSBCTkFfRE9PUkJFTExfSUJfSU5UX0RJU0FCTEUJKDB4NDAwMDAwMDApCiAKIC8qIFNldCB0aGUgY29hbGVzY2luZyB0aW1lciBmb3IgdGhlIGdpdmVuIGliICovCiAjZGVmaW5lIGJuYV9pYl9jb2FsZXNjaW5nX3RpbWVyX3NldChfaV9kYmVsbCwgX2Nsc190aW1lcikJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JuYS9ibmFfY3RybC5jIGIvZHJpdmVycy9uZXQvYm5hL2JuYV9jdHJsLmMKaW5kZXggNTNiMTQxNi4uY2IyNTk0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm5hL2JuYV9jdHJsLmMKKysrIGIvZHJpdmVycy9uZXQvYm5hL2JuYV9jdHJsLmMKQEAgLTE2LDggKzE2LDcgQEAKICAqIHd3dy5icm9jYWRlLmNvbQogICovCiAjaW5jbHVkZSAiYm5hLmgiCi0jaW5jbHVkZSAiYmZhX3NtLmgiCi0jaW5jbHVkZSAiYmZhX3djLmgiCisjaW5jbHVkZSAiYmZhX2NzLmgiCiAKIHN0YXRpYyB2b2lkIGJuYV9kZXZpY2VfY2JfcG9ydF9zdG9wcGVkKHZvaWQgKmFyZywgZW51bSBibmFfY2Jfc3RhdHVzIHN0YXR1cyk7CiAKQEAgLTM4MCw3ICszNzksNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChsbHBvcnQtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtNDA5LDcgKzQwOCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGxscG9ydC0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC00NTUsNyArNDU0LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQobGxwb3J0LT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTQ5Nyw3ICs0OTYsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChsbHBvcnQtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtNTI2LDcgKzUyNSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGxscG9ydC0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC01NjMsNyArNTYyLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQobGxwb3J0LT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTkxNiw3ICs5MTUsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChwb3J0LT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTk1Niw3ICs5NTUsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChwb3J0LT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTEwMDEsNyArMTAwMCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHBvcnQtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtMTAyMiw3ICsxMDIxLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQocG9ydC0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC0xMDYxLDcgKzEwNjAsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChwb3J0LT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTEwODYsNyArMTA4NSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHBvcnQtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtMTExMSw3ICsxMTEwLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQocG9ydC0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC0xMTM2LDcgKzExMzUsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChwb3J0LT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTExNjEsNyArMTE2MCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHBvcnQtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtMTQ3Miw3ICsxNDcxLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQoZGV2aWNlLT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTE1MTIsNyArMTUxMSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGRldmljZS0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC0xNTQyLDcgKzE1NDEsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChkZXZpY2UtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtMTU2OCw3ICsxNTY3LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQoZGV2aWNlLT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTE1ODksNyArMTU4OCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KGRldmljZS0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC0xNjIyLDcgKzE2MjEsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChkZXZpY2UtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm5hL2JuYV9ody5oIGIvZHJpdmVycy9uZXQvYm5hL2JuYV9ody5oCmluZGV4IDZjYjg5NjkuLmNhZDIzM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JuYS9ibmFfaHcuaAorKysgYi9kcml2ZXJzL25ldC9ibmEvYm5hX2h3LmgKQEAgLTY3LDcgKzY3LDcgQEAKIAogLyoqCiAgKiBUaGVyZSBhcmUgMiBmcmVlIFJJVCBzZWdtZW50IHBvb2xzOgotICogCVBvb2wxOiAxOTIgc2VnbWVudHMgb2YgMSBSSVQgZW50cnkgZWFjaAorICoJUG9vbDE6IDE5MiBzZWdtZW50cyBvZiAxIFJJVCBlbnRyeSBlYWNoCiAgKglQb29sMjogMSBzZWdtZW50IG9mIDY0IFJJVCBlbnRyeQogICovCiAjZGVmaW5lIEJGSV9SSVRfU0VHX1BPT0wxX1NJWkUJCTE5MgpAQCAtMzU3LDE0ICszNTcsMTQgQEAKICAqIFRvIGNsZWFyIHNldCB0aGUgdmFsdWUgdG8gMC4KICAqIFJhbmdlIDogMHgyMCB0byAweDVjCiAgKi8KLSNkZWZpbmUgUFNTX1NFTV9MT0NLX1JFRyhfbnVtKSAJCVwKKyNkZWZpbmUgUFNTX1NFTV9MT0NLX1JFRyhfbnVtKQkJXAogCShQU1NfQkxLX1JFR19BRERSICsgMHgwMjAgKyAoKF9udW0pIDw8IDIpKQogCiAvKioKICAqIFBTUyBTZW1hcGhvcmUgU3RhdHVzIFJlZ2lzdGVycywKICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2sgcmVnaXN0ZXJzIGFib3ZlCiAgKi8KLSNkZWZpbmUgUFNTX1NFTV9TVEFUVVNfUkVHKF9udW0pIAkJXAorI2RlZmluZSBQU1NfU0VNX1NUQVRVU19SRUcoX251bSkJCVwKIAkoUFNTX0JMS19SRUdfQUREUiArIDB4MDYwICsgKChfbnVtKSA8PCAyKSkKIAogLyoqCkBAIC0xMDQ0LDcgKzEwNDQsNyBAQAogCQlfX0xQVTEySE9TVF9NQk9YMV9TVEFUVVNfQklUUykpCiAKICNkZWZpbmUgQk5BX0lTX01CT1hfSU5UUihfaW50cl9zdGF0dXMpCQlcCi0JKChfaW50cl9zdGF0dXMpICYgIAkJCVwKKwkoKF9pbnRyX3N0YXR1cykgJgkJCVwKIAkoX19MUFUwMkhPU1RfTUJPWDBfU1RBVFVTX0JJVFMgfAlcCiAJIF9fTFBVMDJIT1NUX01CT1gxX1NUQVRVU19CSVRTIHwJXAogCSBfX0xQVTEySE9TVF9NQk9YMF9TVEFUVVNfQklUUyB8CVwKQEAgLTEwNzAsMTEgKzEwNzAsMTEgQEAKIAkgIF9fSEFMVF9NQVNLX0JJVFMpCiAKICNkZWZpbmUgQk5BX0lTX0VSUl9JTlRSKF9pbnRyX3N0YXR1cykJXAotCSgoX2ludHJfc3RhdHVzKSAmICAJCVwKLQkoX19FTUNfRVJST1JfU1RBVFVTX0JJVFMgfCAgCVwKLQkgX19MUFUwX0VSUk9SX1NUQVRVU19CSVRTIHwgCVwKLQkgX19MUFUxX0VSUk9SX1NUQVRVU19CSVRTIHwgCVwKLQkgX19QU1NfRVJST1JfU1RBVFVTX0JJVFMgIHwgCVwKKwkoKF9pbnRyX3N0YXR1cykgJgkJXAorCShfX0VNQ19FUlJPUl9TVEFUVVNfQklUUyB8CVwKKwkgX19MUFUwX0VSUk9SX1NUQVRVU19CSVRTIHwJXAorCSBfX0xQVTFfRVJST1JfU1RBVFVTX0JJVFMgfAlcCisJIF9fUFNTX0VSUk9SX1NUQVRVU19CSVRTICB8CVwKIAkgX19IQUxUX1NUQVRVU19CSVRTKSkKIAogI2RlZmluZSBCTkFfSVNfTUJPWF9FUlJfSU5UUihfaW50cl9zdGF0dXMpCVwKQEAgLTEwODcsOSArMTA4Nyw5IEBACiAjZGVmaW5lIEJOQV9JTlRSX1NUQVRVU19NQk9YX0NMUihfaW50cl9zdGF0dXMpCQkJXAogZG8gewkJCQkJCQkJXAogCShfaW50cl9zdGF0dXMpICY9IH4oX19MUFUwMkhPU1RfTUJPWDBfU1RBVFVTX0JJVFMgfAlcCi0JCQlfX0xQVTAySE9TVF9NQk9YMV9TVEFUVVNfQklUUyB8IAlcCi0JCQlfX0xQVTEySE9TVF9NQk9YMF9TVEFUVVNfQklUUyB8IAlcCi0JCQlfX0xQVTEySE9TVF9NQk9YMV9TVEFUVVNfQklUUyk7IAlcCisJCQlfX0xQVTAySE9TVF9NQk9YMV9TVEFUVVNfQklUUyB8CQlcCisJCQlfX0xQVTEySE9TVF9NQk9YMF9TVEFUVVNfQklUUyB8CQlcCisJCQlfX0xQVTEySE9TVF9NQk9YMV9TVEFUVVNfQklUUyk7CQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIEJOQV9JTlRSX1NUQVRVU19FUlJfQ0xSKF9pbnRyX3N0YXR1cykJCVwKQEAgLTExMDcsNyArMTEwNyw3IEBACiAJd3JpdGVsKDB4ZmZmZmZmZmYsIChfYm5hKS0+cmVncy5mbl9pbnRfbWFzayk7XAogfQogCi0jZGVmaW5lIGJuYV9pbnR4X2VuYWJsZShibmEsIG5ld19tYXNrKSAJCQlcCisjZGVmaW5lIGJuYV9pbnR4X2VuYWJsZShibmEsIG5ld19tYXNrKQkJCVwKIAl3cml0ZWwoKG5ld19tYXNrKSwgKGJuYSktPnJlZ3MuZm5faW50X21hc2spCiAKICNkZWZpbmUgYm5hX21ib3hfaW50cl9kaXNhYmxlKGJuYSkJCVwKQEAgLTExNzksMTggKzExNzksMTggQEAKICNkZWZpbmUgQk5BX0RPT1JCRUxMX0lCX0lOVF9ESVNBQkxFCQkoMHg0MDAwMDAwMCkKIAogLyogVHhRIEVudHJ5IE9wY29kZXMgKi8KLSNkZWZpbmUgQk5BX1RYUV9XSV9TRU5EIAkJKDB4NDAyKQkvKiBTaW5nbGUgRnJhbWUgVHJhbnNtaXNzaW9uICovCi0jZGVmaW5lIEJOQV9UWFFfV0lfU0VORF9MU08gCQkoMHg0MDMpCS8qIE11bHRpLUZyYW1lIFRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBCTkFfVFhRX1dJX1NFTkQJCQkoMHg0MDIpCS8qIFNpbmdsZSBGcmFtZSBUcmFuc21pc3Npb24gKi8KKyNkZWZpbmUgQk5BX1RYUV9XSV9TRU5EX0xTTwkJKDB4NDAzKQkvKiBNdWx0aS1GcmFtZSBUcmFuc21pc3Npb24gKi8KICNkZWZpbmUgQk5BX1RYUV9XSV9FWFRFTlNJT04JCSgweDEwNCkJLyogRXh0ZW5zaW9uIFdJICovCiAKIC8qIFR4USBFbnRyeSBDb250cm9sIEZsYWdzICovCi0jZGVmaW5lIEJOQV9UWFFfV0lfQ0ZfRkNPRV9DUkMgIAkoMSA8PCA4KQotI2RlZmluZSBCTkFfVFhRX1dJX0NGX0lQSURfTU9ERSAJKDEgPDwgNSkKLSNkZWZpbmUgQk5BX1RYUV9XSV9DRl9JTlNfUFJJTyAgCSgxIDw8IDQpCi0jZGVmaW5lIEJOQV9UWFFfV0lfQ0ZfSU5TX1ZMQU4gIAkoMSA8PCAzKQotI2RlZmluZSBCTkFfVFhRX1dJX0NGX1VEUF9DS1NVTSAJKDEgPDwgMikKLSNkZWZpbmUgQk5BX1RYUV9XSV9DRl9UQ1BfQ0tTVU0gCSgxIDw8IDEpCi0jZGVmaW5lIEJOQV9UWFFfV0lfQ0ZfSVBfQ0tTVU0gIAkoMSA8PCAwKQorI2RlZmluZSBCTkFfVFhRX1dJX0NGX0ZDT0VfQ1JDCQkoMSA8PCA4KQorI2RlZmluZSBCTkFfVFhRX1dJX0NGX0lQSURfTU9ERQkJKDEgPDwgNSkKKyNkZWZpbmUgQk5BX1RYUV9XSV9DRl9JTlNfUFJJTwkJKDEgPDwgNCkKKyNkZWZpbmUgQk5BX1RYUV9XSV9DRl9JTlNfVkxBTgkJKDEgPDwgMykKKyNkZWZpbmUgQk5BX1RYUV9XSV9DRl9VRFBfQ0tTVU0JCSgxIDw8IDIpCisjZGVmaW5lIEJOQV9UWFFfV0lfQ0ZfVENQX0NLU1VNCQkoMSA8PCAxKQorI2RlZmluZSBCTkFfVFhRX1dJX0NGX0lQX0NLU1VNCQkoMSA8PCAwKQogCiAjZGVmaW5lIEJOQV9UWFFfV0lfTDRfSERSX05fT0ZGU0VUKF9oZHJfc2l6ZSwgX29mZnNldCkgXAogCQkoKChfaGRyX3NpemUpIDw8IDEwKSB8ICgoX29mZnNldCkgJiAweDNGRikpCkBAIC0xMTk5LDMwICsxMTk5LDMwIEBACiAgKiBDb21wbGV0aW9uIFEgZGVmaW5lcwogICovCiAvKiBDUSBFbnRyeSBGbGFncyAqLwotI2RlZmluZQlCTkFfQ1FfRUZfTUFDX0VSUk9SIAkoMSA8PCAgMCkKLSNkZWZpbmUJQk5BX0NRX0VGX0ZDU19FUlJPUiAJKDEgPDwgIDEpCi0jZGVmaW5lCUJOQV9DUV9FRl9UT09fTE9ORyAgCSgxIDw8ICAyKQotI2RlZmluZQlCTkFfQ1FfRUZfRkNfQ1JDX09LIAkoMSA8PCAgMykKKyNkZWZpbmUJQk5BX0NRX0VGX01BQ19FUlJPUgkoMSA8PCAgMCkKKyNkZWZpbmUJQk5BX0NRX0VGX0ZDU19FUlJPUgkoMSA8PCAgMSkKKyNkZWZpbmUJQk5BX0NRX0VGX1RPT19MT05HCSgxIDw8ICAyKQorI2RlZmluZQlCTkFfQ1FfRUZfRkNfQ1JDX09LCSgxIDw8ICAzKQogCi0jZGVmaW5lCUJOQV9DUV9FRl9SU1ZEMSAJKDEgPDwgIDQpCisjZGVmaW5lCUJOQV9DUV9FRl9SU1ZEMQkJKDEgPDwgIDQpCiAjZGVmaW5lCUJOQV9DUV9FRl9MNF9DS1NVTV9PSwkoMSA8PCAgNSkKICNkZWZpbmUJQk5BX0NRX0VGX0wzX0NLU1VNX09LCSgxIDw8ICA2KQogI2RlZmluZQlCTkFfQ1FfRUZfSERTX0hFQURFUgkoMSA8PCAgNykKIAotI2RlZmluZQlCTkFfQ1FfRUZfVURQICAgCSgxIDw8ICA4KQotI2RlZmluZQlCTkFfQ1FfRUZfVENQICAgCSgxIDw8ICA5KQorI2RlZmluZQlCTkFfQ1FfRUZfVURQCQkoMSA8PCAgOCkKKyNkZWZpbmUJQk5BX0NRX0VGX1RDUAkJKDEgPDwgIDkpCiAjZGVmaW5lCUJOQV9DUV9FRl9JUF9PUFRJT05TCSgxIDw8IDEwKQotI2RlZmluZQlCTkFfQ1FfRUZfSVBWNiAgCSgxIDw8IDExKQorI2RlZmluZQlCTkFfQ1FfRUZfSVBWNgkJKDEgPDwgMTEpCiAKLSNkZWZpbmUJQk5BX0NRX0VGX0lQVjQgIAkoMSA8PCAxMikKLSNkZWZpbmUJQk5BX0NRX0VGX1ZMQU4gIAkoMSA8PCAxMykKLSNkZWZpbmUJQk5BX0NRX0VGX1JTUyAgIAkoMSA8PCAxNCkKLSNkZWZpbmUJQk5BX0NRX0VGX1JTVkQyIAkoMSA8PCAxNSkKKyNkZWZpbmUJQk5BX0NRX0VGX0lQVjQJCSgxIDw8IDEyKQorI2RlZmluZQlCTkFfQ1FfRUZfVkxBTgkJKDEgPDwgMTMpCisjZGVmaW5lCUJOQV9DUV9FRl9SU1MJCSgxIDw8IDE0KQorI2RlZmluZQlCTkFfQ1FfRUZfUlNWRDIJCSgxIDw8IDE1KQogCiAjZGVmaW5lCUJOQV9DUV9FRl9NQ0FTVF9NQVRDSCAgICgxIDw8IDE2KQotI2RlZmluZQlCTkFfQ1FfRUZfTUNBU1QgCSgxIDw8IDE3KQotI2RlZmluZSBCTkFfQ1FfRUZfQkNBU1QgCSgxIDw8IDE4KQotI2RlZmluZQlCTkFfQ1FfRUZfUkVNT1RFIAkoMSA8PCAxOSkKKyNkZWZpbmUJQk5BX0NRX0VGX01DQVNUCQkoMSA8PCAxNykKKyNkZWZpbmUgQk5BX0NRX0VGX0JDQVNUCQkoMSA8PCAxOCkKKyNkZWZpbmUJQk5BX0NRX0VGX1JFTU9URQkoMSA8PCAxOSkKIAogI2RlZmluZQlCTkFfQ1FfRUZfTE9DQUwJCSgxIDw8IDIwKQogCkBAIC0xMjU3LDEwICsxMjU3LDEwIEBACiB9OwogCiBlbnVtIHJzc19oYXNoX3R5cGUgewotCUJGSV9SU1NfVF9WNF9UQ1AgICAgCQk9ICgxIDw8IDExKSwKLQlCRklfUlNTX1RfVjRfSVAgICAgIAkJPSAoMSA8PCAxMCksCi0JQkZJX1JTU19UX1Y2X1RDUCAgICAJCT0gKDEgPDwgIDkpLAotCUJGSV9SU1NfVF9WNl9JUCAgICAgCQk9ICgxIDw8ICA4KQorCUJGSV9SU1NfVF9WNF9UQ1AJCT0gKDEgPDwgMTEpLAorCUJGSV9SU1NfVF9WNF9JUAkJCT0gKDEgPDwgMTApLAorCUJGSV9SU1NfVF9WNl9UQ1AJCT0gKDEgPDwgIDkpLAorCUJGSV9SU1NfVF9WNl9JUAkJCT0gKDEgPDwgIDgpCiB9OwogZW51bSBoZHNfaGVhZGVyX3R5cGUgewogCUJOQV9IRFNfVF9WNF9UQ1AJPSAoMSA8PCAxMSksCkBAIC0xMjk4LDcgKzEyOTgsNyBAQAogCXUzMiByZXNlcnZlZDI7CiAJdTMyIHBnX2NudF9uX3ByZF9wdHI7CS8qIDMxOjE2LT50b3RhbCBwYWdlIGNvdW50ICovCiAJCQkJCS8qIDE1OjAgLT5wcm9kdWNlciBwb2ludGVyIChpbmRleD8pICovCi0JdTMyIGVudHJ5X25fcGdfc2l6ZTsgCS8qIDMxOjE2LT5lbnRyeSBzaXplICovCisJdTMyIGVudHJ5X25fcGdfc2l6ZTsJLyogMzE6MTYtPmVudHJ5IHNpemUgKi8KIAkJCQkJLyogMTU6MCAtPnBhZ2Ugc2l6ZSAqLwogCXUzMiBpbnRfYmxrX25fY25zX3B0cjsJLyogMzE6MjQtPkludCBCbGsgSWQ7ICAqLwogCQkJCQkvKiAyMzoxNi0+SW50IEJsayBPZmZzZXQgKi8KQEAgLTEzMjYsNyArMTMyNiw3IEBACiAJdTMyIHNnX25fY3Ffbl9jbnNfcHRyOwkvKiAzMToyOC0+cmVzZXJ2ZWQ7IDI3OjI0LT5zZyBjb3VudCAqLwogCQkJCQkvKiAyMzoxNi0+Q1E7ICovCiAJCQkJCS8qIDE1OjAtPmNvbnN1bWVyIHBvaW50ZXIoaW5kZXg/KSAqLwotCXUzMiBidWZfc3pfbl9xX3N0YXRlOyAJLyogMzE6MTYtPmJ1ZmZlciBzaXplOyAxNTowLT4gUSBzdGF0ZSAqLworCXUzMiBidWZfc3pfbl9xX3N0YXRlOwkvKiAzMToxNi0+YnVmZmVyIHNpemU7IDE1OjAtPiBRIHN0YXRlICovCiAJdTMyIG5leHRfcWlkOwkJLyogMTc6MTAtPm5leHQgUUlkICovCiAJdTMyIHJlc2VydmVkMzsKIAl1MzIgcmVzZXJ2ZWQ0WzRdOwpAQCAtMTQyNiw4ICsxNDI2LDggQEAKIH07CiAKIHN0cnVjdCBibmFfdHhxX3dpX3ZlY3RvciB7Ci0JdTE2IAkJcmVzZXJ2ZWQ7Ci0JdTE2IAkJbGVuZ3RoOwkJLyogT25seSAxNCBMU0IgYXJlIHZhbGlkICovCisJdTE2CQlyZXNlcnZlZDsKKwl1MTYJCWxlbmd0aDsJCS8qIE9ubHkgMTQgTFNCIGFyZSB2YWxpZCAqLwogCXN0cnVjdCBibmFfZG1hX2FkZHIgaG9zdF9hZGRyOyAvKiBUeC1CdWYgRE1BIGFkZHIgKi8KIH07CiAKQEAgLTE0NjUsNyArMTQ2NSw3IEBACiAJfSBoZHI7CiAJc3RydWN0IGJuYV90eHFfd2lfdmVjdG9yIHZlY3Rvcls0XTsKIH07Ci0jZGVmaW5lIHdpX2hkciAgCWhkci53aQorI2RlZmluZSB3aV9oZHIJCWhkci53aQogI2RlZmluZSB3aV9leHRfaGRyICBoZHIud2lfZXh0CiAKIC8qIFJ4USBFbnRyeSBTdHJ1Y3R1cmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JuYS9ibmFfdHhyeC5jIGIvZHJpdmVycy9uZXQvYm5hL2JuYV90eHJ4LmMKaW5kZXggMzgwMDg1Yy4uZjA5ODNjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm5hL2JuYV90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvYm5hL2JuYV90eHJ4LmMKQEAgLTE2LDcgKzE2LDcgQEAKICAqIHd3dy5icm9jYWRlLmNvbQogICovCiAjaW5jbHVkZSAiYm5hLmgiCi0jaW5jbHVkZSAiYmZhX3NtLmgiCisjaW5jbHVkZSAiYmZhX2NzLmgiCiAjaW5jbHVkZSAiYmZpLmgiCiAKIC8qKgpAQCAtNTY5LDcgKzU2OSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHJ4Zi0+cngtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtNjI3LDcgKzYyNyw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHJ4Zi0+cngtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtNjc4LDcgKzY3OCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHJ4Zi0+cngtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtNzI0LDcgKzcyNCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHJ4Zi0+cngtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtNzM0LDcgKzczNCw3IEBACiAJLyoqCiAJICogIE5vdGU6IERvIG5vdCBhZGQgcnhmX2NsZWFyX3BhY2tldF9maWx0ZXIgaGVyZS4KIAkgKiBJdCB3aWxsIG92ZXJzdGVwIG1ib3ggd2hlbiB0aGlzIHRyYW5zaXRpb24gaGFwcGVuczoKLQkgKiAJY2FtX2ZsdHJfbW9kX3dhaXQgLT4gY2FtX2ZsdHJfY2xyX3dhaXQgb24gUlhGX0VfU1RPUCBldmVudAorCSAqCWNhbV9mbHRyX21vZF93YWl0IC0+IGNhbV9mbHRyX2Nscl93YWl0IG9uIFJYRl9FX1NUT1AgZXZlbnQKIAkgKi8KIH0KIApAQCAtNzYxLDcgKzc2MSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHJ4Zi0+cngtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtNzcxLDcgKzc3MSw3IEBACiAJLyoqCiAJICogTk9URTogRG8gbm90IGFkZCAgcnhmX2Rpc2FibGUgaGVyZS4KIAkgKiBJdCB3aWxsIG92ZXJzdGVwIG1ib3ggd2hlbiB0aGlzIHRyYW5zaXRpb24gaGFwcGVuczoKLQkgKiAJc3RhcnRfd2FpdCAtPiBzdG9wX3dhaXQgb24gUlhGX0VfU1RPUCBldmVudAorCSAqCXN0YXJ0X3dhaXQgLT4gc3RvcF93YWl0IG9uIFJYRl9FX1NUT1AgZXZlbnQKIAkgKi8KIH0KIApAQCAtODE1LDcgKzgxNSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHJ4Zi0+cngtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCX0KIH0KIApAQCAtODUxLDcgKzg1MSw3IEBACiAJICogYW55IG90aGVyIGV2ZW50IGR1cmluZyB0aGVzZSBzdGF0ZXMKIAkgKi8KIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQocnhmLT5yeC0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC04ODcsNyArODg3LDcgQEAKIAkgKiBhbnkgb3RoZXIgZXZlbnQgZHVyaW5nIHRoZXNlIHN0YXRlcwogCSAqLwogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChyeGYtPnJ4LT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTkwNyw3ICs5MDcsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChyeGYtPnJ4LT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAl9CiB9CiAKQEAgLTE4OTgsNyArMTg5OCw3IEBACiAJCS8qIG5vLW9wICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdChyeC0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTk0Niw3ICsxOTQ2LDcgQEAKIAkJYmZhX2ZzbV9zZXRfc3RhdGUocngsIGJuYV9yeF9zbV9zdGFydGVkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHJ4LT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTk4MSw3ICsxOTgxLDcgQEAKIAkJYmZhX2ZzbV9zZXRfc3RhdGUocngsIGJuYV9yeF9zbV9yeGZfc3RvcF93YWl0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHJ4LT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMjAxMSw3ICsyMDExLDcgQEAKIAkJYm5hX3J4Zl9mYWlsKCZyeC0+cnhmKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYmZhX3NtX2ZhdWx0KHJ4LT5ibmEsIGV2ZW50KTsKKwkJYmZhX3NtX2ZhdWx0KGV2ZW50KTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yMDY0LDcgKzIwNjQsNyBAQAogCQliZmFfZnNtX3NldF9zdGF0ZShyeCwgYm5hX3J4X3NtX3N0b3BwZWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQliZmFfc21fZmF1bHQocngtPmJuYSwgZXZlbnQpOworCQliZmFfc21fZmF1bHQoZXZlbnQpOwogCQlicmVhazsKIAl9CiB9CkBAIC0zMjE2LDcgKzMyMTYsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdCh0eC0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC0zMjYxLDcgKzMyNjEsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdCh0eC0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC0zMjk0LDcgKzMyOTQsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdCh0eC0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC0zMzM1LDcgKzMzMzUsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdCh0eC0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCkBAIC0zMzU1LDcgKzMzNTUsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJmYV9zbV9mYXVsdCh0eC0+Ym5hLCBldmVudCk7CisJCWJmYV9zbV9mYXVsdChldmVudCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibmEvYm5hX3R5cGVzLmggYi9kcml2ZXJzL25ldC9ibmEvYm5hX3R5cGVzLmgKaW5kZXggYjljMTM0Zi4uMmY4OWNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm5hL2JuYV90eXBlcy5oCisrKyBiL2RyaXZlcnMvbmV0L2JuYS9ibmFfdHlwZXMuaApAQCAtNTAsMTIgKzUwLDEyIEBACiB9OwogCiBlbnVtIGJuYV9jbGVhbnVwX3R5cGUgewotCUJOQV9IQVJEX0NMRUFOVVAgCT0gMCwKLQlCTkFfU09GVF9DTEVBTlVQIAk9IDEKKwlCTkFfSEFSRF9DTEVBTlVQCT0gMCwKKwlCTkFfU09GVF9DTEVBTlVQCT0gMQogfTsKIAogZW51bSBibmFfY2Jfc3RhdHVzIHsKLQlCTkFfQ0JfU1VDQ0VTUyAJCT0gMCwKKwlCTkFfQ0JfU1VDQ0VTUwkJPSAwLAogCUJOQV9DQl9GQUlMCQk9IDEsCiAJQk5BX0NCX0lOVEVSUlVQVAk9IDIsCiAJQk5BX0NCX0JVU1kJCT0gMywKQEAgLTcyLDggKzcyLDggQEAKIH07CiAKIGVudW0gYm5hX21lbV90eXBlIHsKLQlCTkFfTUVNX1RfS1ZBIAkJPSAxLAotCUJOQV9NRU1fVF9ETUEgCQk9IDIKKwlCTkFfTUVNX1RfS1ZBCQk9IDEsCisJQk5BX01FTV9UX0RNQQkJPSAyCiB9OwogCiBlbnVtIGJuYV9pbnRyX3R5cGUgewpAQCAtODIsMTAgKzgyLDEwIEBACiB9OwogCiBlbnVtIGJuYV9yZXNfcmVxX3R5cGUgewotCUJOQV9SRVNfTUVNX1RfQ09NIAkJPSAwLAotCUJOQV9SRVNfTUVNX1RfQVRUUiAJCT0gMSwKLQlCTkFfUkVTX01FTV9UX0ZXVFJDIAkJPSAyLAotCUJOQV9SRVNfTUVNX1RfU1RBVFMgCQk9IDMsCisJQk5BX1JFU19NRU1fVF9DT00JCT0gMCwKKwlCTkFfUkVTX01FTV9UX0FUVFIJCT0gMSwKKwlCTkFfUkVTX01FTV9UX0ZXVFJDCQk9IDIsCisJQk5BX1JFU19NRU1fVF9TVEFUUwkJPSAzLAogCUJOQV9SRVNfTUVNX1RfU1dTVEFUUwkJPSA0LAogCUJOQV9SRVNfTUVNX1RfSUJJRFgJCT0gNSwKIAlCTkFfUkVTX01FTV9UX0lCX0FSUkFZCQk9IDYsCkBAIC0xMDcsOSArMTA3LDkgQEAKIGVudW0gYm5hX3R4X3Jlc19yZXFfdHlwZSB7CiAJQk5BX1RYX1JFU19NRU1fVF9UQ0IJPSAwLAogCUJOQV9UWF9SRVNfTUVNX1RfVU5NQVBRCT0gMSwKLQlCTkFfVFhfUkVTX01FTV9UX1FQVCAJPSAyLAorCUJOQV9UWF9SRVNfTUVNX1RfUVBUCT0gMiwKIAlCTkFfVFhfUkVTX01FTV9UX1NXUVBUCT0gMywKLQlCTkFfVFhfUkVTX01FTV9UX1BBR0UgCT0gNCwKKwlCTkFfVFhfUkVTX01FTV9UX1BBR0UJPSA0LAogCUJOQV9UWF9SRVNfSU5UUl9UX1RYQ01QTCA9IDUsCiAJQk5BX1RYX1JFU19UX01BWCwKIH07CkBAIC0xNTgsMTQgKzE1OCwxNCBAQAogfTsKIAogZW51bSBibmFfcnhwX3R5cGUgewotCUJOQV9SWFBfU0lOR0xFIAkJPSAxLAotCUJOQV9SWFBfU0xSIAkJPSAyLAotCUJOQV9SWFBfSERTIAkJPSAzCisJQk5BX1JYUF9TSU5HTEUJCT0gMSwKKwlCTkFfUlhQX1NMUgkJPSAyLAorCUJOQV9SWFBfSERTCQk9IDMKIH07CiAKIGVudW0gYm5hX3J4bW9kZSB7Ci0JQk5BX1JYTU9ERV9QUk9NSVNDIAk9IDEsCi0JQk5BX1JYTU9ERV9BTExNVUxUSSAJPSAyCisJQk5BX1JYTU9ERV9QUk9NSVNDCT0gMSwKKwlCTkFfUlhNT0RFX0FMTE1VTFRJCT0gMgogfTsKIAogZW51bSBibmFfcnhfZXZlbnQgewpAQCAtMjAyLDcgKzIwMiw3IEBACiB9OwogCiBlbnVtIGJuYV9yeGZfZmxhZ3MgewotCUJOQV9SWEZfRkxfU1RPUF9QRU5ESU5HIAk9IDB4MDEsCisJQk5BX1JYRl9GTF9TVE9QX1BFTkRJTkcJCT0gMHgwMSwKIAlCTkFfUlhGX0ZMX0ZBSUxFRAkJPSAweDAyLAogCUJOQV9SWEZfRkxfUlNTX0NPTkZJR19QRU5ESU5HCT0gMHgwNCwKIAlCTkFfUlhGX0ZMX09QRVJTVEFURV9DSEFOR0VECT0gMHgwOCwKQEAgLTI0NCwxMSArMjQ0LDExIEBACiBlbnVtIGJuYV9saW5rX3N0YXR1cyB7CiAJQk5BX0xJTktfRE9XTgkJPSAwLAogCUJOQV9MSU5LX1VQCQk9IDEsCi0JQk5BX0NFRV9VUCAJCT0gMgorCUJOQV9DRUVfVVAJCT0gMgogfTsKIAogZW51bSBibmFfbGxwb3J0X2ZsYWdzIHsKLQlCTkFfTExQT1JUX0ZfQURNSU5fVVAJIAk9IDEsCisJQk5BX0xMUE9SVF9GX0FETUlOX1VQCQk9IDEsCiAJQk5BX0xMUE9SVF9GX1BPUlRfRU5BQkxFRAk9IDIsCiAJQk5BX0xMUE9SVF9GX1JYX1NUQVJURUQJCT0gNAogfTsKQEAgLTMwNCw3ICszMDQsNyBAQAogc3RydWN0IGJuYV9tZW1faW5mbyB7CiAJZW51bSBibmFfbWVtX3R5cGUgbWVtX3R5cGU7CiAJdTMyCQlsZW47Ci0JdTMyIAkJbnVtOworCXUzMgkJbnVtOwogCXUzMgkJYWxpZ25fc3o7IC8qIDAvMSA9IG5vIGFsaWdubWVudCAqLwogCXN0cnVjdCBibmFfbWVtX2Rlc2NyICptZGw7CiAJdm9pZAkJCSpjb29raWU7IC8qIEZvciBibmFkIHRvIHVubWFwIGRtYSBsYXRlciAqLwpAQCAtMzcxLDEwICszNzEsMTAgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkJcWU7CiAKIAlzdHJ1Y3QgYmZhX21ib3hfY21kIGNtZDsKLQl1MzIgCQljbWRfbGVuOworCXUzMgkJY21kX2xlbjsKIAkvKiBDYWxsYmFjayBmb3IgcG9ydCwgdHgsIHJ4LCByeGYgKi8KIAl2b2lkICgqY2Jmbikodm9pZCAqYXJnLCBpbnQgc3RhdHVzKTsKLQl2b2lkIAkJCSpjYmFyZzsKKwl2b2lkCQkJKmNiYXJnOwogfTsKIAogc3RydWN0IGJuYV9tYm94X21vZCB7CkBAIC00ODAsNyArNDgwLDcgQEAKIAogLyogSW50ZXJydXB0IHRpbWVyIGNvbmZpZ3VyYXRpb24gKi8KIHN0cnVjdCBibmFfaWJfY29uZmlnIHsKLQl1OCAJCWNvYWxlc2NpbmdfdGltZW87ICAgIC8qIFVuaXQgaXMgNXVzZWMuICovCisJdTgJCWNvYWxlc2NpbmdfdGltZW87ICAgIC8qIFVuaXQgaXMgNXVzZWMuICovCiAKIAlpbnQJCQlpbnRlcnBrdF9jb3VudDsKIAlpbnQJCQlpbnRlcnBrdF90aW1lbzsKQEAgLTU3Niw4ICs1NzYsOCBAQAogCiAJc3RydWN0IGJuYV90eCAqdHg7CiAKLQl1NjQgCQl0eF9wYWNrZXRzOwotCXU2NCAJCXR4X2J5dGVzOworCXU2NAkJdHhfcGFja2V0czsKKwl1NjQJCXR4X2J5dGVzOwogfTsKIAogLyogVHhGIHN0cnVjdHVyZSAoaGFyZHdhcmUgVHggRnVuY3Rpb24pICovCkBAIC03MzksMTAgKzczOSwxMCBAQAogCXN0cnVjdCBibmFfcnhwICpyeHA7CiAJc3RydWN0IGJuYV9yeCAqcng7CiAKLQl1NjQgCQlyeF9wYWNrZXRzOworCXU2NAkJcnhfcGFja2V0czsKIAl1NjQJCXJ4X2J5dGVzOwotCXU2NCAJCXJ4X3BhY2tldHNfd2l0aF9lcnJvcjsKLQl1NjQgCQlyeGJ1Zl9hbGxvY19mYWlsZWQ7CisJdTY0CQlyeF9wYWNrZXRzX3dpdGhfZXJyb3I7CisJdTY0CQlyeGJ1Zl9hbGxvY19mYWlsZWQ7CiB9OwogCiAvKiBSeFEgcGFpciAqLwpAQCAtOTAyLDcgKzkwMiw3IEBACiAJICogY2FsbGJhY2sgZm9yOgogCSAqCWJuYV9yeGZfdWNhc3Rfc2V0KCkKIAkgKglibmFfcnhmX3t1Y2FzdC9tY2FzdH1fYWRkKCksCi0JICogCWJuYV9yeGZfe3VjYXN0L21jYXN0fV9kZWwoKSwKKwkgKglibmFfcnhmX3t1Y2FzdC9tY2FzdH1fZGVsKCksCiAJICoJYm5hX3J4Zl9tb2RlX3NldCgpCiAJICovCiAJdm9pZCAoKmNhbV9mbHRyX2NiZm4pKHN0cnVjdCBibmFkICpibmFkLCBzdHJ1Y3QgYm5hX3J4ICpyeCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JuYS9ibmFkLmMgYi9kcml2ZXJzL25ldC9ibmEvYm5hZC5jCmluZGV4IDdkMjVhOTcuLjhlMzViMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JuYS9ibmFkLmMKKysrIGIvZHJpdmVycy9uZXQvYm5hL2JuYWQuYwpAQCAtMTUsNiArMTUsNyBAQAogICogQWxsIHJpZ2h0cyByZXNlcnZlZAogICogd3d3LmJyb2NhZGUuY29tCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtNTgsNyArNTksNyBAQAogCiAjZGVmaW5lIEJOQURfR0VUX01CT1hfSVJRKF9ibmFkKQkJCQlcCiAJKCgoX2JuYWQpLT5jZmdfZmxhZ3MgJiBCTkFEX0NGX01TSVgpID8JCQlcCi0JICgoX2JuYWQpLT5tc2l4X3RhYmxlWyhfYm5hZCktPm1zaXhfbnVtIC0gMV0udmVjdG9yKSA6IAlcCisJICgoX2JuYWQpLT5tc2l4X3RhYmxlW0JOQURfTUFJTEJPWF9NU0lYX0lOREVYXS52ZWN0b3IpIDogXAogCSAoKF9ibmFkKS0+cGNpZGV2LT5pcnEpKQogCiAjZGVmaW5lIEJOQURfRklMTF9VTk1BUFFfTUVNX1JFUShfcmVzX2luZm8sIF9udW0sIF9kZXB0aCkJXApAQCAtMTEwLDEwICsxMTEsMTAgQEAKIGJuYWRfZnJlZV9hbGxfdHhidWZzKHN0cnVjdCBibmFkICpibmFkLAogCQkgc3RydWN0IGJuYV90Y2IgKnRjYikKIHsKLQl1MzIgCQl1bm1hcF9jb25zOworCXUzMgkJdW5tYXBfY29uczsKIAlzdHJ1Y3QgYm5hZF91bm1hcF9xICp1bm1hcF9xID0gdGNiLT51bm1hcF9xOwogCXN0cnVjdCBibmFkX3NrYl91bm1hcCAqdW5tYXBfYXJyYXk7Ci0Jc3RydWN0IHNrX2J1ZmYgCQkqc2tiID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYiA9IE5VTEw7CiAJaW50CQkJaTsKIAogCXVubWFwX2FycmF5ID0gdW5tYXBfcS0+dW5tYXBfYXJyYXk7CkBAIC0xNjMsMTEgKzE2NCwxMSBAQAogYm5hZF9mcmVlX3R4YnVmcyhzdHJ1Y3QgYm5hZCAqYm5hZCwKIAkJIHN0cnVjdCBibmFfdGNiICp0Y2IpCiB7Ci0JdTMyIAkJc2VudF9wYWNrZXRzID0gMCwgc2VudF9ieXRlcyA9IDA7Ci0JdTE2IAkJd2lzLCB1bm1hcF9jb25zLCB1cGRhdGVkX2h3X2NvbnM7CisJdTMyCQlzZW50X3BhY2tldHMgPSAwLCBzZW50X2J5dGVzID0gMDsKKwl1MTYJCXdpcywgdW5tYXBfY29ucywgdXBkYXRlZF9od19jb25zOwogCXN0cnVjdCBibmFkX3VubWFwX3EgKnVubWFwX3EgPSB0Y2ItPnVubWFwX3E7CiAJc3RydWN0IGJuYWRfc2tiX3VubWFwICp1bm1hcF9hcnJheTsKLQlzdHJ1Y3Qgc2tfYnVmZiAJCSpza2I7CisJc3RydWN0IHNrX2J1ZmYJCSpza2I7CiAJaW50IGk7CiAKIAkvKgpAQCAtMjQ1LDcgKzI0Niw3IEBACiB7CiAJc3RydWN0IGJuYWQgKmJuYWQgPSAoc3RydWN0IGJuYWQgKilibmFkX3B0cjsKIAlzdHJ1Y3QgYm5hX3RjYiAqdGNiOwotCXUzMiAJCWFja2VkID0gMDsKKwl1MzIJCWFja2VkID0gMDsKIAlpbnQJCQlpLCBqOwogCiAJZm9yIChpID0gMDsgaSA8IGJuYWQtPm51bV90eDsgaSsrKSB7CkBAIC0zODYsMTQgKzM4NywxMiBAQAogCQkJQk5BX1JYUV9RUEdFX1BUUl9HRVQodW5tYXBfcHJvZCwgcmNiLT5zd19xcHQsIHJ4ZW50LAogCQkJCQkgICAgIHdpX3JhbmdlKTsKIAkJfQotCQlza2IgPSBhbGxvY19za2IocmNiLT5yeHEtPmJ1ZmZlcl9zaXplICsgTkVUX0lQX0FMSUdOLAotCQkJCSAgICAgR0ZQX0FUT01JQyk7CisJCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24oYm5hZC0+bmV0ZGV2LAorCQkJCQkJcmNiLT5yeHEtPmJ1ZmZlcl9zaXplKTsKIAkJaWYgKHVubGlrZWx5KCFza2IpKSB7CiAJCQlCTkFEX1VQREFURV9DVFIoYm5hZCwgcnhidWZfYWxsb2NfZmFpbGVkKTsKIAkJCWdvdG8gZmluaXNoaW5nOwogCQl9Ci0JCXNrYi0+ZGV2ID0gYm5hZC0+bmV0ZGV2OwotCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CiAJCXVubWFwX2FycmF5W3VubWFwX3Byb2RdLnNrYiA9IHNrYjsKIAkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSgmYm5hZC0+cGNpZGV2LT5kZXYsIHNrYi0+ZGF0YSwKIAkJCQkJICByY2ItPnJ4cS0+YnVmZmVyX3NpemUsCkBAIC01MTYsMjQgKzUxNSwxNiBAQAogCQlyY2ItPnJ4cS0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGJuYWQtPm5ldGRldik7CiAKLQkJaWYgKGJuYWQtPnZsYW5fZ3JwICYmIChmbGFncyAmIEJOQV9DUV9FRl9WTEFOKSkgewotCQkJc3RydWN0IGJuYWRfcnhfY3RybCAqcnhfY3RybCA9Ci0JCQkJKHN0cnVjdCBibmFkX3J4X2N0cmwgKiljY2ItPmN0cmw7Ci0JCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCi0JCQkJdmxhbl9ncm9fcmVjZWl2ZSgmcnhfY3RybC0+bmFwaSwgYm5hZC0+dmxhbl9ncnAsCi0JCQkJCQludG9ocyhjbXBsLT52bGFuX3RhZyksIHNrYik7Ci0JCQllbHNlCi0JCQkJdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwKLQkJCQkJCQkgYm5hZC0+dmxhbl9ncnAsCi0JCQkJCQkJIG50b2hzKGNtcGwtPnZsYW5fdGFnKSk7CisJCWlmIChmbGFncyAmIEJOQV9DUV9FRl9WTEFOKQorCQkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIG50b2hzKGNtcGwtPnZsYW5fdGFnKSk7CiAKLQkJfSBlbHNlIHsgLyogTm90IFZMQU4gdGFnZ2VkL3N0cmlwcGVkICovCi0JCQlzdHJ1Y3QgYm5hZF9yeF9jdHJsICpyeF9jdHJsID0KLQkJCQkoc3RydWN0IGJuYWRfcnhfY3RybCAqKWNjYi0+Y3RybDsKLQkJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkKLQkJCQluYXBpX2dyb19yZWNlaXZlKCZyeF9jdHJsLT5uYXBpLCBza2IpOwotCQkJZWxzZQotCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgeworCQkJc3RydWN0IGJuYWRfcnhfY3RybCAqcnhfY3RybDsKKworCQkJcnhfY3RybCA9IChzdHJ1Y3QgYm5hZF9yeF9jdHJsICopIGNjYi0+Y3RybDsKKwkJCW5hcGlfZ3JvX3JlY2VpdmUoJnJ4X2N0cmwtPm5hcGksIHNrYik7CisJCX0gZWxzZSB7CisJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCQl9CiAKIG5leHQ6CkBAIC0xMTEwLDEwICsxMTAxLDEwIEBACiBibmFkX21ib3hfaXJxX2FsbG9jKHN0cnVjdCBibmFkICpibmFkLAogCQkgICAgc3RydWN0IGJuYV9pbnRyX2luZm8gKmludHJfaW5mbykKIHsKLQlpbnQgCQllcnIgPSAwOwotCXVuc2lnbmVkIGxvbmcgCWZsYWdzOworCWludAkJZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nCWlycV9mbGFncywgZmxhZ3M7CiAJdTMyCWlycTsKLQlpcnFfaGFuZGxlcl90IAlpcnFfaGFuZGxlcjsKKwlpcnFfaGFuZGxlcl90CWlycV9oYW5kbGVyOwogCiAJLyogTWJveCBzaG91bGQgdXNlIG9ubHkgMSB2ZWN0b3IgKi8KIApAQCAtMTEyNCwxOSArMTExNSwxOCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOwogCWlmIChibmFkLT5jZmdfZmxhZ3MgJiBCTkFEX0NGX01TSVgpIHsKIAkJaXJxX2hhbmRsZXIgPSAoaXJxX2hhbmRsZXJfdClibmFkX21zaXhfbWJveF9oYW5kbGVyOwotCQlpcnEgPSBibmFkLT5tc2l4X3RhYmxlW2JuYWQtPm1zaXhfbnVtIC0gMV0udmVjdG9yOwotCQlmbGFncyA9IDA7CisJCWlycSA9IGJuYWQtPm1zaXhfdGFibGVbQk5BRF9NQUlMQk9YX01TSVhfSU5ERVhdLnZlY3RvcjsKKwkJaXJxX2ZsYWdzID0gMDsKIAkJaW50cl9pbmZvLT5pbnRyX3R5cGUgPSBCTkFfSU5UUl9UX01TSVg7Ci0JCWludHJfaW5mby0+aWRsWzBdLnZlY3RvciA9IGJuYWQtPm1zaXhfbnVtIC0gMTsKKwkJaW50cl9pbmZvLT5pZGxbMF0udmVjdG9yID0gQk5BRF9NQUlMQk9YX01TSVhfSU5ERVg7CiAJfSBlbHNlIHsKIAkJaXJxX2hhbmRsZXIgPSAoaXJxX2hhbmRsZXJfdClibmFkX2lzcjsKIAkJaXJxID0gYm5hZC0+cGNpZGV2LT5pcnE7Ci0JCWZsYWdzID0gSVJRRl9TSEFSRUQ7CisJCWlycV9mbGFncyA9IElSUUZfU0hBUkVEOwogCQlpbnRyX2luZm8tPmludHJfdHlwZSA9IEJOQV9JTlRSX1RfSU5UWDsKLQkJLyogaW50cl9pbmZvLT5pZGwudmVjdG9yID0gMCA/ICovCiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOwogCXNwcmludGYoYm5hZC0+bWJveF9pcnFfbmFtZSwgIiVzIiwgQk5BRF9OQU1FKTsKIAogCS8qCkBAIC0xMTQ3LDcgKzExMzcsNyBAQAogCiAJQk5BRF9VUERBVEVfQ1RSKGJuYWQsIG1ib3hfaW50cl9kaXNhYmxlZCk7CiAKLQllcnIgPSByZXF1ZXN0X2lycShpcnEsIGlycV9oYW5kbGVyLCBmbGFncywKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIGlycV9oYW5kbGVyLCBpcnFfZmxhZ3MsCiAJCQkgIGJuYWQtPm1ib3hfaXJxX25hbWUsIGJuYWQpOwogCiAJaWYgKGVycikgewpAQCAtMTE4OCwxMSArMTE3OCwxMiBAQAogCiAJCXN3aXRjaCAoc3JjKSB7CiAJCWNhc2UgQk5BRF9JTlRSX1RYOgotCQkJdmVjdG9yX3N0YXJ0ID0gdHhyeF9pZDsKKwkJCXZlY3Rvcl9zdGFydCA9IEJOQURfTUFJTEJPWF9NU0lYX1ZFQ1RPUlMgKyB0eHJ4X2lkOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBCTkFEX0lOVFJfUlg6Ci0JCQl2ZWN0b3Jfc3RhcnQgPSBibmFkLT5udW1fdHggKiBibmFkLT5udW1fdHhxX3Blcl90eCArCisJCQl2ZWN0b3Jfc3RhcnQgPSBCTkFEX01BSUxCT1hfTVNJWF9WRUNUT1JTICsKKwkJCQkJKGJuYWQtPm51bV90eCAqIGJuYWQtPm51bV90eHFfcGVyX3R4KSArCiAJCQkJCXR4cnhfaWQ7CiAJCQlicmVhazsKIApAQCAtMTIxMywxMSArMTIwNCwxMSBAQAogCiAJCXN3aXRjaCAoc3JjKSB7CiAJCWNhc2UgQk5BRF9JTlRSX1RYOgotCQkJaW50cl9pbmZvLT5pZGxbMF0udmVjdG9yID0gMHgxOyAvKiBCaXQgbWFzayA6IFR4IElCICovCisJCQlpbnRyX2luZm8tPmlkbFswXS52ZWN0b3IgPSBCTkFEX0lOVFhfVFhfSUJfQklUTUFTSzsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQk5BRF9JTlRSX1JYOgotCQkJaW50cl9pbmZvLT5pZGxbMF0udmVjdG9yID0gMHgyOyAvKiBCaXQgbWFzayA6IFJ4IElCICovCisJCQlpbnRyX2luZm8tPmlkbFswXS52ZWN0b3IgPSBCTkFEX0lOVFhfUlhfSUJfQklUTUFTSzsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTQ1Niw3ICsxNDQ3LDcgQEAKIC8qCiAgKiBBbGwgdGltZXIgcm91dGluZXMgdXNlIGJuYWQtPmJuYV9sb2NrIHRvIHByb3RlY3QgYWdhaW5zdAogICogdGhlIGZvbGxvd2luZyByYWNlLCB3aGljaCBtYXkgb2NjdXIgaW4gY2FzZSBvZiBubyBsb2NraW5nOgotICogCVRpbWUJQ1BVIG0gIAkJQ1BVIG4KKyAqCVRpbWUJQ1BVIG0JQ1BVIG4KICAqCTAgICAgICAgMSA9IHRlc3RfYml0CiAgKgkxCQkJY2xlYXJfYml0CiAgKgkyCQkJZGVsX3RpbWVyX3N5bmMKQEAgLTE5MjEsNyArMTkxMiw3IEBACiBibmFkX3J4X2NvYWxlc2NpbmdfdGltZW9fc2V0KHN0cnVjdCBibmFkICpibmFkKQogewogCXN0cnVjdCBibmFkX3J4X2luZm8gKnJ4X2luZm87Ci0JaW50IAlpOworCWludAlpOwogCiAJZm9yIChpID0gMDsgaSA8IGJuYWQtPm51bV9yeDsgaSsrKSB7CiAJCXJ4X2luZm8gPSAmYm5hZC0+cnhfaW5mb1tpXTsKQEAgLTE5ODQsMTkgKzE5NzUsMTQgQEAKIHN0YXRpYyB2b2lkCiBibmFkX3Jlc3RvcmVfdmxhbnMoc3RydWN0IGJuYWQgKmJuYWQsIHUzMiByeF9pZCkKIHsKLQl1MTYgdmxhbl9pZDsKKwl1MTYgdmlkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIWJuYWQtPnZsYW5fZ3JwKQotCQlyZXR1cm47Ci0KIAlCVUdfT04oIShWTEFOX05fVklEID09IChCRklfTUFYX1ZMQU4gKyAxKSkpOwogCi0JZm9yICh2bGFuX2lkID0gMDsgdmxhbl9pZCA8IFZMQU5fTl9WSUQ7IHZsYW5faWQrKykgewotCQlpZiAoIXZsYW5fZ3JvdXBfZ2V0X2RldmljZShibmFkLT52bGFuX2dycCwgdmxhbl9pZCkpCi0JCQljb250aW51ZTsKKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgYm5hZC0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOwotCQlibmFfcnhfdmxhbl9hZGQoYm5hZC0+cnhfaW5mb1tyeF9pZF0ucngsIHZsYW5faWQpOworCQlibmFfcnhfdmxhbl9hZGQoYm5hZC0+cnhfaW5mb1tyeF9pZF0ucngsIHZpZCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CiAJfQogfQpAQCAtMjA4OSw3ICsyMDc1LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOwogCWlmIChibmFkLT5jZmdfZmxhZ3MgJiBCTkFEX0NGX01TSVgpCi0JCWlycSA9IGJuYWQtPm1zaXhfdGFibGVbYm5hZC0+bXNpeF9udW0gLSAxXS52ZWN0b3I7CisJCWlycSA9IGJuYWQtPm1zaXhfdGFibGVbQk5BRF9NQUlMQk9YX01TSVhfSU5ERVhdLnZlY3RvcjsKIAllbHNlCiAJCWlycSA9IGJuYWQtPnBjaWRldi0+aXJxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CkBAIC0yNDQwLDE4ICsyNDI2LDE4IEBACiB7CiAJc3RydWN0IGJuYWQgKmJuYWQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0JdTE2IAkJdHhxX3Byb2QsIHZsYW5fdGFnID0gMDsKLQl1MzIgCQl1bm1hcF9wcm9kLCB3aXMsIHdpc191c2VkLCB3aV9yYW5nZTsKLQl1MzIgCQl2ZWN0b3JzLCB2ZWN0X2lkLCBpLCBhY2tlZDsKKwl1MTYJCXR4cV9wcm9kLCB2bGFuX3RhZyA9IDA7CisJdTMyCQl1bm1hcF9wcm9kLCB3aXMsIHdpc191c2VkLCB3aV9yYW5nZTsKKwl1MzIJCXZlY3RvcnMsIHZlY3RfaWQsIGksIGFja2VkOwogCXUzMgkJdHhfaWQ7Ci0JaW50IAkJCWVycjsKKwlpbnQJCQllcnI7CiAKIAlzdHJ1Y3QgYm5hZF90eF9pbmZvICp0eF9pbmZvOwogCXN0cnVjdCBibmFfdGNiICp0Y2I7CiAJc3RydWN0IGJuYWRfdW5tYXBfcSAqdW5tYXBfcTsKLQlkbWFfYWRkcl90IAkJZG1hX2FkZHI7CisJZG1hX2FkZHJfdAkJZG1hX2FkZHI7CiAJc3RydWN0IGJuYV90eHFfZW50cnkgKnR4cWVudDsKLQlibmFfdHhxX3dpX2N0cmxfZmxhZ190IAlmbGFnczsKKwlibmFfdHhxX3dpX2N0cmxfZmxhZ190CWZsYWdzOwogCiAJaWYgKHVubGlrZWx5CiAJICAgIChza2ItPmxlbiA8PSBFVEhfSExFTiB8fCBza2ItPmxlbiA+IEJGSV9UWF9NQVhfREFUQV9QRVJfUEtUKSkgewpAQCAtMjc5OSwxNyArMjc4NSw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1ibmFkX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCB2bGFuX2dyb3VwICp2bGFuX2dycCkKLXsKLQlzdHJ1Y3QgYm5hZCAqYm5hZCA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQltdXRleF9sb2NrKCZibmFkLT5jb25mX211dGV4KTsKLQlibmFkLT52bGFuX2dycCA9IHZsYW5fZ3JwOwotCW11dGV4X3VubG9jaygmYm5hZC0+Y29uZl9tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkCiBibmFkX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJCSB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CkBAIC0yODIzLDYgKzI3OTgsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CiAJYm5hX3J4X3ZsYW5fYWRkKGJuYWQtPnJ4X2luZm9bMF0ucngsIHZpZCk7CisJc2V0X2JpdCh2aWQsIGJuYWQtPmFjdGl2ZV92bGFucyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm5hZC0+Ym5hX2xvY2ssIGZsYWdzKTsKIAogCW11dGV4X3VubG9jaygmYm5hZC0+Y29uZl9tdXRleCk7CkBAIC0yODQxLDYgKzI4MTcsNyBAQAogCW11dGV4X2xvY2soJmJuYWQtPmNvbmZfbXV0ZXgpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CisJY2xlYXJfYml0KHZpZCwgYm5hZC0+YWN0aXZlX3ZsYW5zKTsKIAlibmFfcnhfdmxhbl9kZWwoYm5hZC0+cnhfaW5mb1swXS5yeCwgdmlkKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOwogCkBAIC0yODkwLDcgKzI4NjcsNiBAQAogCS5uZG9fdmFsaWRhdGVfYWRkciAgICAgID0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MgICAgPSBibmFkX3NldF9tYWNfYWRkcmVzcywKIAkubmRvX2NoYW5nZV9tdHUJCT0gYm5hZF9jaGFuZ2VfbXR1LAotCS5uZG9fdmxhbl9yeF9yZWdpc3RlciAgID0gYm5hZF92bGFuX3J4X3JlZ2lzdGVyLAogCS5uZG9fdmxhbl9yeF9hZGRfdmlkICAgID0gYm5hZF92bGFuX3J4X2FkZF92aWQsCiAJLm5kb192bGFuX3J4X2tpbGxfdmlkICAgPSBibmFkX3ZsYW5fcnhfa2lsbF92aWQsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKQEAgLTMwNTcsOCArMzAzMyw4IEBACiBibmFkX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWRldl9pZCkKIHsKLQlib29sIAl1c2luZ19kYWMgPSBmYWxzZTsKLQlpbnQgCWVycjsKKwlib29sCXVzaW5nX2RhYyA9IGZhbHNlOworCWludAllcnI7CiAJc3RydWN0IGJuYWQgKmJuYWQ7CiAJc3RydWN0IGJuYSAqYm5hOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CkBAIC0zMDkwLDcgKzMwNjYsNyBAQAogCiAJLyoKIAkgKiBQQ0kgaW5pdGlhbGl6YXRpb24KLQkgKiAJT3V0cHV0IDogdXNpbmdfZGFjID0gMSBmb3IgNjQgYml0IERNQQorCSAqCU91dHB1dCA6IHVzaW5nX2RhYyA9IDEgZm9yIDY0IGJpdCBETUEKIAkgKgkJCSAgID0gMCBmb3IgMzIgYml0IERNQQogCSAqLwogCWVyciA9IGJuYWRfcGNpX2luaXQoYm5hZCwgcGRldiwgJnVzaW5nX2RhYyk7CkBAIC0zMjMzLDcgKzMyMDksNyBAQAogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBibmFkX3BjaV9pZF90YWJsZVtdID0geworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGJuYWRfcGNpX2lkX3RhYmxlKSA9IHsKIAl7CiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9DQURFLAogCQkJUENJX0RFVklDRV9JRF9CUk9DQURFX0NUKSwKQEAgLTMyNTYsNyArMzIzMiw4IEBACiB7CiAJaW50IGVycjsKIAotCXByX2luZm8oIkJyb2NhZGUgMTBHIEV0aGVybmV0IGRyaXZlclxuIik7CisJcHJfaW5mbygiQnJvY2FkZSAxMEcgRXRoZXJuZXQgZHJpdmVyIC0gdmVyc2lvbjogJXNcbiIsCisJCQlCTkFEX1ZFUlNJT04pOwogCiAJYmZhX253X2lvY19hdXRvX3JlY292ZXIoYm5hZF9pb2NfYXV0b19yZWNvdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm5hL2JuYWQuaCBiL2RyaXZlcnMvbmV0L2JuYS9ibmFkLmgKaW5kZXggY2NkYWJhZC4uNDU4ZWIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm5hL2JuYWQuaAorKysgYi9kcml2ZXJzL25ldC9ibmEvYm5hZC5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogCiAvKiBGaXggZm9yIElBNjQgKi8KICNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KQEAgLTY3LDEwICs2OCwxMyBAQAogCiAjZGVmaW5lIEJOQURfVkVSU0lPTgkJCSIyLjMuMi4zIgogCisjZGVmaW5lIEJOQURfTUFJTEJPWF9NU0lYX0lOREVYCQkwCiAjZGVmaW5lIEJOQURfTUFJTEJPWF9NU0lYX1ZFQ1RPUlMJMQorI2RlZmluZSBCTkFEX0lOVFhfVFhfSUJfQklUTUFTSwkJMHgxCisjZGVmaW5lIEJOQURfSU5UWF9SWF9JQl9CSVRNQVNLCQkweDIKIAotI2RlZmluZSBCTkFEX1NUQVRTX1RJTUVSX0ZSRVEJCTEwMDAgCS8qIGluIG1zZWNzICovCi0jZGVmaW5lIEJOQURfRElNX1RJTUVSX0ZSRVEJCTEwMDAgCS8qIGluIG1zZWNzICovCisjZGVmaW5lIEJOQURfU1RBVFNfVElNRVJfRlJFUQkJMTAwMAkvKiBpbiBtc2VjcyAqLworI2RlZmluZSBCTkFEX0RJTV9USU1FUl9GUkVRCQkxMDAwCS8qIGluIG1zZWNzICovCiAKICNkZWZpbmUgQk5BRF9NQVhfUV9ERVBUSAkJMHgxMDAwMAogI2RlZmluZSBCTkFEX01JTl9RX0RFUFRICQkweDIwMApAQCAtMTAxLDEyICsxMDUsMTIgQEAKIAogZW51bSBibmFkX2xpbmtfc3RhdGUgewogCUJOQURfTFNfRE9XTgkJPSAwLAotCUJOQURfTFNfVVAgCQk9IDEKKwlCTkFEX0xTX1VQCQk9IDEKIH07CiAKIHN0cnVjdCBibmFkX2NvbXBsZXRpb24gewotCXN0cnVjdCBjb21wbGV0aW9uIAlpb2NfY29tcDsKLQlzdHJ1Y3QgY29tcGxldGlvbiAJdWNhc3RfY29tcDsKKwlzdHJ1Y3QgY29tcGxldGlvbglpb2NfY29tcDsKKwlzdHJ1Y3QgY29tcGxldGlvbgl1Y2FzdF9jb21wOwogCXN0cnVjdCBjb21wbGV0aW9uCW1jYXN0X2NvbXA7CiAJc3RydWN0IGNvbXBsZXRpb24JdHhfY29tcDsKIAlzdHJ1Y3QgY29tcGxldGlvbglyeF9jb21wOwpAQCAtMTI0LDcgKzEyOCw3IEBACiAKIC8qIFR4IFJ4IENvbnRyb2wgU3RhdHMgKi8KIHN0cnVjdCBibmFkX2Rydl9zdGF0cyB7Ci0JdTY0IAkJbmV0aWZfcXVldWVfc3RvcDsKKwl1NjQJCW5ldGlmX3F1ZXVlX3N0b3A7CiAJdTY0CQluZXRpZl9xdWV1ZV93YWtldXA7CiAJdTY0CQluZXRpZl9xdWV1ZV9zdG9wcGVkOwogCXU2NAkJdHNvNDsKQEAgLTE4Nyw3ICsxOTEsNyBAQAogc3RydWN0IGJuYWRfdW5tYXBfcSB7CiAJdTMyCQlwcm9kdWNlcl9pbmRleDsKIAl1MzIJCWNvbnN1bWVyX2luZGV4OwotCXUzMiAJCXFfZGVwdGg7CisJdTMyCQlxX2RlcHRoOwogCS8qIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0IG9uZSAqLwogCXN0cnVjdCBibmFkX3NrYl91bm1hcCB1bm1hcF9hcnJheVsxXTsKIH07CkBAIC0yMTAsMTMgKzIxNCwxMyBAQAogI2RlZmluZSBCTkFEX1JGX1JYX1NIVVRET1dOX0RFTEFZRUQJNwogCiBzdHJ1Y3QgYm5hZCB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgCSpuZXRkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UJKm5ldGRldjsKIAogCS8qIERhdGEgcGF0aCAqLwogCXN0cnVjdCBibmFkX3R4X2luZm8gdHhfaW5mb1tCTkFEX01BWF9UWFNdOwogCXN0cnVjdCBibmFkX3J4X2luZm8gcnhfaW5mb1tCTkFEX01BWF9SWFNdOwogCi0Jc3RydWN0IHZsYW5fZ3JvdXAJKnZsYW5fZ3JwOworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3ZsYW5zW0JJVFNfVE9fTE9OR1MoVkxBTl9OX1ZJRCldOwogCS8qCiAJICogVGhlc2UgcSBudW1iZXJzIGFyZSBnbG9iYWwgb25seSBiZWNhdXNlCiAJICogdGhleSBhcmUgdXNlZCB0byBjYWxjdWxhdGUgTVNJeCB2ZWN0b3JzLgpAQCAtMjQ0LDcgKzI0OCw3IEBACiAJdTMyCQljZmdfZmxhZ3M7CiAJdW5zaWduZWQgbG9uZwkJcnVuX2ZsYWdzOwogCi0Jc3RydWN0IHBjaV9kZXYgCQkqcGNpZGV2OworCXN0cnVjdCBwY2lfZGV2CQkqcGNpZGV2OwogCXU2NAkJbW1pb19zdGFydDsKIAl1NjQJCW1taW9fbGVuOwogCkBAIC0yNzcsNyArMjgxLDcgQEAKIAlzdHJ1Y3QgYm5hZF9kaWFnICpkaWFnOwogCiAJY2hhcgkJCWFkYXB0ZXJfbmFtZVtCTkFEX05BTUVfTEVOXTsKLQljaGFyIAkJCXBvcnRfbmFtZVtCTkFEX05BTUVfTEVOXTsKKwljaGFyCQkJcG9ydF9uYW1lW0JOQURfTkFNRV9MRU5dOwogCWNoYXIJCQltYm94X2lycV9uYW1lW0JOQURfTkFNRV9MRU5dOwogfTsKIApAQCAtMjg1LDcgKzI4OSw3IEBACiAgKiBFWFRFUk4gVkFSSUFCTEVTCiAgKi8KIGV4dGVybiBzdHJ1Y3QgZmlybXdhcmUgKmJmaV9mdzsKLWV4dGVybiB1MzIgCQlibmFkX3J4cXNfcGVyX2NxOworZXh0ZXJuIHUzMgkJYm5hZF9yeHFzX3Blcl9jcTsKIAogLyoKICAqIEVYVEVSTiBQUk9UT1RZUEVTCkBAIC0zMzEsNyArMzM1LDcgQEAKIH0KIAogI2RlZmluZSBibmFkX2RpbV90aW1lcl9ydW5uaW5nKF9ibmFkKQkJCQlcCi0JKCgoX2JuYWQpLT5jZmdfZmxhZ3MgJiBCTkFEX0NGX0RJTV9FTkFCTEVEKSAmJiAJCVwKKwkoKChfYm5hZCktPmNmZ19mbGFncyAmIEJOQURfQ0ZfRElNX0VOQUJMRUQpICYmCQlcCiAJKHRlc3RfYml0KEJOQURfUkZfRElNX1RJTUVSX1JVTk5JTkcsICYoKF9ibmFkKS0+cnVuX2ZsYWdzKSkpKQogCiAjZW5kaWYgLyogX19CTkFEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm5hL2JuYWRfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvYm5hL2JuYWRfZXRodG9vbC5jCmluZGV4IDMzMzBjZDcuLmZlYTA3ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JuYS9ibmFkX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ibmEvYm5hZF9ldGh0b29sLmMKQEAgLTI5NSw3ICsyOTUsNyBAQAogCXUzMiByZWdfYWRkcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0jZGVmaW5lIEJOQURfR0VUX1JFRyhhZGRyKSAJCQkJCVwKKyNkZWZpbmUgQk5BRF9HRVRfUkVHKGFkZHIpCQkJCQlcCiBkbyB7CQkJCQkJCQlcCiAJaWYgKHJlZ3MpCQkJCQkJXAogCQlyZWdzW251bSsrXSA9IHJlYWRsKGJuYWQtPmJhcjAgKyAoYWRkcikpOwlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibmEvY25hLmggYi9kcml2ZXJzL25ldC9ibmEvY25hLmgKaW5kZXggYmJkMzlkYy4uYTY3OWUwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm5hL2NuYS5oCisrKyBiL2RyaXZlcnMvbmV0L2JuYS9jbmEuaApAQCAtMTksNyArMTksNiBAQAogI2lmbmRlZiBfX0NOQV9IX18KICNkZWZpbmUgX19DTkFfSF9fCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTM0LDcgKzMzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAotI2RlZmluZSBiZmFfc21fZmF1bHQoX19tb2QsIF9fZXZlbnQpICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBiZmFfc21fZmF1bHQoX19ldmVudCkgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJcHJfZXJyKCJTTSBBc3NlcnRpb24gZmFpbHVyZTogJXM6ICVkOiBldmVudCA9ICVkIiwgX19GSUxFX18sIF9fTElORV9fLCBcCiAJCV9fZXZlbnQpOyBcCiB9IHdoaWxlICgwKQpAQCAtNzQsNyArNzMsNyBAQAogCQliZmFfcV9uZXh0KF9xKSA9IGJmYV9xX25leHQoKigoc3RydWN0IGxpc3RfaGVhZCAqKikgX3FlKSk7IFwKIAkJYmZhX3FfcWVfaW5pdCgqKChzdHJ1Y3QgbGlzdF9oZWFkICoqKSBfcWUpKTsJCVwKIAl9IGVsc2UgewkJCQkJCQlcCi0JCSooKHN0cnVjdCBsaXN0X2hlYWQgKiopIChfcWUpKSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopIE5VTEw7IFwKKwkJKigoc3RydWN0IGxpc3RfaGVhZCAqKikoX3FlKSkgPSBOVUxMOwkJCVwKIAl9CQkJCQkJCQlcCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDIuYyBiL2RyaXZlcnMvbmV0L2JueDIuYwppbmRleCA1N2QzMjkzLi40YjJiNTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyLmMKKysrIGIvZHJpdmVycy9uZXQvYm54Mi5jCkBAIC01Niw4ICs1Niw4IEBACiAjaW5jbHVkZSAiYm54Ml9mdy5oIgogCiAjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJImJueDIiCi0jZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMi4xLjYiCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiTWFyIDcsIDIwMTEiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMi4xLjExIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1bHkgMjAsIDIwMTEiCiAjZGVmaW5lIEZXX01JUFNfRklMRV8wNgkJImJueDIvYm54Mi1taXBzLTA2LTYuMi4xLmZ3IgogI2RlZmluZSBGV19SVjJQX0ZJTEVfMDYJCSJibngyL2JueDItcnYycC0wNi02LjAuMTUuZnciCiAjZGVmaW5lIEZXX01JUFNfRklMRV8wOQkJImJueDIvYm54Mi1taXBzLTA5LTYuMi4xYS5mdyIKQEAgLTM4NSw2ICszODUsOSBAQAogCWlmIChjcC0+ZHJ2X3N0YXRlICYgQ05JQ19EUlZfU1RBVEVfUkVHRCkKIAkJcmV0dXJuIC1FQlVTWTsKIAorCWlmICghYm54Ml9yZWdfcmRfaW5kKGJwLCBCTlgyX0ZXX01BWF9JU0NTSV9DT05OKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlicC0+Y25pY19kYXRhID0gZGF0YTsKIAlyY3VfYXNzaWduX3BvaW50ZXIoYnAtPmNuaWNfb3BzLCBvcHMpOwogCkBAIC00MTYsNiArNDE5LDkgQEAKIAlzdHJ1Y3QgYm54MiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBjbmljX2V0aF9kZXYgKmNwID0gJmJwLT5jbmljX2V0aF9kZXY7CiAKKwlpZiAoIWNwLT5tYXhfaXNjc2lfY29ubikKKwkJcmV0dXJuIE5VTEw7CisKIAljcC0+ZHJ2X293bmVyID0gVEhJU19NT0RVTEU7CiAJY3AtPmNoaXBfaWQgPSBicC0+Y2hpcF9pZDsKIAljcC0+cGRldiA9IGJwLT5wZGV2OwpAQCAtMjQ0MCw2ICsyNDQ2LDQ4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkCitibngyX2R1bXBfbWNwX3N0YXRlKHN0cnVjdCBibngyICpicCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnAtPmRldjsKKwl1MzIgbWNwX3AwLCBtY3BfcDE7CisKKwluZXRkZXZfZXJyKGRldiwgIjwtLS0gc3RhcnQgTUNQIHN0YXRlcyBkdW1wIC0tLT5cbiIpOworCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkgeworCQltY3BfcDAgPSBCTlgyX01DUF9TVEFURV9QMDsKKwkJbWNwX3AxID0gQk5YMl9NQ1BfU1RBVEVfUDE7CisJfSBlbHNlIHsKKwkJbWNwX3AwID0gQk5YMl9NQ1BfU1RBVEVfUDBfNTcwODsKKwkJbWNwX3AxID0gQk5YMl9NQ1BfU1RBVEVfUDFfNTcwODsKKwl9CisJbmV0ZGV2X2VycihkZXYsICJERUJVRzogTUNQX1NUQVRFX1AwWyUwOHhdIE1DUF9TVEFURV9QMVslMDh4XVxuIiwKKwkJICAgYm54Ml9yZWdfcmRfaW5kKGJwLCBtY3BfcDApLCBibngyX3JlZ19yZF9pbmQoYnAsIG1jcF9wMSkpOworCW5ldGRldl9lcnIoZGV2LCAiREVCVUc6IE1DUCBtb2RlWyUwOHhdIHN0YXRlWyUwOHhdIGV2dF9tYXNrWyUwOHhdXG4iLAorCQkgICBibngyX3JlZ19yZF9pbmQoYnAsIEJOWDJfTUNQX0NQVV9NT0RFKSwKKwkJICAgYm54Ml9yZWdfcmRfaW5kKGJwLCBCTlgyX01DUF9DUFVfU1RBVEUpLAorCQkgICBibngyX3JlZ19yZF9pbmQoYnAsIEJOWDJfTUNQX0NQVV9FVkVOVF9NQVNLKSk7CisJbmV0ZGV2X2VycihkZXYsICJERUJVRzogcGNbJTA4eF0gcGNbJTA4eF0gaW5zdHJbJTA4eF1cbiIsCisJCSAgIGJueDJfcmVnX3JkX2luZChicCwgQk5YMl9NQ1BfQ1BVX1BST0dSQU1fQ09VTlRFUiksCisJCSAgIGJueDJfcmVnX3JkX2luZChicCwgQk5YMl9NQ1BfQ1BVX1BST0dSQU1fQ09VTlRFUiksCisJCSAgIGJueDJfcmVnX3JkX2luZChicCwgQk5YMl9NQ1BfQ1BVX0lOU1RSVUNUSU9OKSk7CisJbmV0ZGV2X2VycihkZXYsICJERUJVRzogc2htZW0gc3RhdGVzOlxuIik7CisJbmV0ZGV2X2VycihkZXYsICJERUJVRzogZHJ2X21iWyUwOHhdIGZ3X21iWyUwOHhdIGxpbmtfc3RhdHVzWyUwOHhdIiwKKwkJICAgYm54Ml9zaG1lbV9yZChicCwgQk5YMl9EUlZfTUIpLAorCQkgICBibngyX3NobWVtX3JkKGJwLCBCTlgyX0ZXX01CKSwKKwkJICAgYm54Ml9zaG1lbV9yZChicCwgQk5YMl9MSU5LX1NUQVRVUykpOworCXByX2NvbnQoIiBkcnZfcHVsc2VfbWJbJTA4eF1cbiIsIGJueDJfc2htZW1fcmQoYnAsIEJOWDJfRFJWX1BVTFNFX01CKSk7CisJbmV0ZGV2X2VycihkZXYsICJERUJVRzogZGV2X2luZm9fc2lnbmF0dXJlWyUwOHhdIHJlc2V0X3R5cGVbJTA4eF0iLAorCQkgICBibngyX3NobWVtX3JkKGJwLCBCTlgyX0RFVl9JTkZPX1NJR05BVFVSRSksCisJCSAgIGJueDJfc2htZW1fcmQoYnAsIEJOWDJfQkNfU1RBVEVfUkVTRVRfVFlQRSkpOworCXByX2NvbnQoIiBjb25kaXRpb25bJTA4eF1cbiIsCisJCWJueDJfc2htZW1fcmQoYnAsIEJOWDJfQkNfU1RBVEVfQ09ORElUSU9OKSk7CisJRFBfU0hNRU1fTElORShicCwgMHgzY2MpOworCURQX1NITUVNX0xJTkUoYnAsIDB4M2RjKTsKKwlEUF9TSE1FTV9MSU5FKGJwLCAweDNlYyk7CisJbmV0ZGV2X2VycihkZXYsICJERUJVRzogMHgzZmNbJTA4eF1cbiIsIGJueDJfc2htZW1fcmQoYnAsIDB4M2ZjKSk7CisJbmV0ZGV2X2VycihkZXYsICI8LS0tIGVuZCBNQ1Agc3RhdGVzIGR1bXAgLS0tPlxuIik7Cit9CisKIHN0YXRpYyBpbnQKIGJueDJfZndfc3luYyhzdHJ1Y3QgYm54MiAqYnAsIHUzMiBtc2dfZGF0YSwgaW50IGFjaywgaW50IHNpbGVudCkKIHsKQEAgLTI0NjgsMTMgKzI1MTYsMTQgQEAKIAogCS8qIElmIHdlIHRpbWVkIG91dCwgaW5mb3JtIHRoZSBmaXJtd2FyZSB0aGF0IHRoaXMgaXMgdGhlIGNhc2UuICovCiAJaWYgKCh2YWwgJiBCTlgyX0ZXX01TR19BQ0spICE9IChtc2dfZGF0YSAmIEJOWDJfRFJWX01TR19TRVEpKSB7Ci0JCWlmICghc2lsZW50KQotCQkJcHJfZXJyKCJmdyBzeW5jIHRpbWVvdXQsIHJlc2V0IGNvZGUgPSAleFxuIiwgbXNnX2RhdGEpOwotCiAJCW1zZ19kYXRhICY9IH5CTlgyX0RSVl9NU0dfQ09ERTsKIAkJbXNnX2RhdGEgfD0gQk5YMl9EUlZfTVNHX0NPREVfRldfVElNRU9VVDsKIAogCQlibngyX3NobWVtX3dyKGJwLCBCTlgyX0RSVl9NQiwgbXNnX2RhdGEpOworCQlpZiAoIXNpbGVudCkgeworCQkJcHJfZXJyKCJmdyBzeW5jIHRpbWVvdXQsIHJlc2V0IGNvZGUgPSAleFxuIiwgbXNnX2RhdGEpOworCQkJYm54Ml9kdW1wX21jcF9zdGF0ZShicCk7CisJCX0KIAogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTYyOTMsNiArNjM0Miw3IEBACiBibngyX3Jlc2V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBibngyICpicCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYm54MiwgcmVzZXRfdGFzayk7CisJaW50IHJjOwogCiAJcnRubF9sb2NrKCk7CiAJaWYgKCFuZXRpZl9ydW5uaW5nKGJwLT5kZXYpKSB7CkBAIC02MzAyLDcgKzYzNTIsMTQgQEAKIAogCWJueDJfbmV0aWZfc3RvcChicCwgdHJ1ZSk7CiAKLQlibngyX2luaXRfbmljKGJwLCAxKTsKKwlyYyA9IGJueDJfaW5pdF9uaWMoYnAsIDEpOworCWlmIChyYykgeworCQluZXRkZXZfZXJyKGJwLT5kZXYsICJmYWlsZWQgdG8gcmVzZXQgTklDLCBjbG9zaW5nXG4iKTsKKwkJYm54Ml9uYXBpX2VuYWJsZShicCk7CisJCWRldl9jbG9zZShicC0+ZGV2KTsKKwkJcnRubF91bmxvY2soKTsKKwkJcmV0dXJuOworCX0KIAogCWF0b21pY19zZXQoJmJwLT5pbnRyX3NlbSwgMSk7CiAJYm54Ml9uZXRpZl9zdGFydChicCwgdHJ1ZSk7CkBAIC02MzEzLDcgKzYzNzAsNyBAQAogYm54Ml9kdW1wX3N0YXRlKHN0cnVjdCBibngyICpicCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnAtPmRldjsKLQl1MzIgbWNwX3AwLCBtY3BfcDEsIHZhbDEsIHZhbDI7CisJdTMyIHZhbDEsIHZhbDI7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnAtPnBkZXYsIFBDSV9DT01NQU5ELCAmdmFsMSk7CiAJbmV0ZGV2X2VycihkZXYsICJERUJVRzogaW50cl9zZW1bJXhdIFBDSV9DTURbJTA4eF1cbiIsCkBAIC02MzI2LDE1ICs2MzgzLDYgQEAKIAkJICAgUkVHX1JEKGJwLCBCTlgyX0VNQUNfUlhfU1RBVFVTKSk7CiAJbmV0ZGV2X2VycihkZXYsICJERUJVRzogUlBNX01HTVRfUEtUX0NUUkxbJTA4eF1cbiIsCiAJCSAgIFJFR19SRChicCwgQk5YMl9SUE1fTUdNVF9QS1RfQ1RSTCkpOwotCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkgewotCQltY3BfcDAgPSBCTlgyX01DUF9TVEFURV9QMDsKLQkJbWNwX3AxID0gQk5YMl9NQ1BfU1RBVEVfUDE7Ci0JfSBlbHNlIHsKLQkJbWNwX3AwID0gQk5YMl9NQ1BfU1RBVEVfUDBfNTcwODsKLQkJbWNwX3AxID0gQk5YMl9NQ1BfU1RBVEVfUDFfNTcwODsKLQl9Ci0JbmV0ZGV2X2VycihkZXYsICJERUJVRzogTUNQX1NUQVRFX1AwWyUwOHhdIE1DUF9TVEFURV9QMVslMDh4XVxuIiwKLQkJICAgYm54Ml9yZWdfcmRfaW5kKGJwLCBtY3BfcDApLCBibngyX3JlZ19yZF9pbmQoYnAsIG1jcF9wMSkpOwogCW5ldGRldl9lcnIoZGV2LCAiREVCVUc6IEhDX1NUQVRTX0lOVEVSUlVQVF9TVEFUVVNbJTA4eF1cbiIsCiAJCSAgIFJFR19SRChicCwgQk5YMl9IQ19TVEFUU19JTlRFUlJVUFRfU1RBVFVTKSk7CiAJaWYgKGJwLT5mbGFncyAmIEJOWDJfRkxBR19VU0lOR19NU0lYKQpAQCAtNjM0OCw2ICs2Mzk2LDcgQEAKIAlzdHJ1Y3QgYm54MiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJYm54Ml9kdW1wX3N0YXRlKGJwKTsKKwlibngyX2R1bXBfbWNwX3N0YXRlKGJwKTsKIAogCS8qIFRoaXMgYWxsb3dzIHRoZSBuZXRpZiB0byBiZSBzaHV0ZG93biBncmFjZWZ1bGx5IGJlZm9yZSByZXNldHRpbmcgKi8KIAlzY2hlZHVsZV93b3JrKCZicC0+cmVzZXRfdGFzayk7CkBAIC02NTMyLDggKzY1ODEsNiBAQAogewogCXN0cnVjdCBibngyICpicCA9IG5ldGRldl9wcml2KGRldik7CiAKLQljYW5jZWxfd29ya19zeW5jKCZicC0+cmVzZXRfdGFzayk7Ci0KIAlibngyX2Rpc2FibGVfaW50X3N5bmMoYnApOwogCWJueDJfbmFwaV9kaXNhYmxlKGJwKTsKIAlkZWxfdGltZXJfc3luYygmYnAtPnRpbWVyKTsKQEAgLTc5MDgsOSArNzk1NSw4IEBACiAJYnAtPmNoaXBfaWQgPSBSRUdfUkQoYnAsIEJOWDJfTUlTQ19JRCk7CiAKIAlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDkpIHsKLQkJaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9FWFApID09IDApIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkiQ2Fubm90IGZpbmQgUENJRSBjYXBhYmlsaXR5LCBhYm9ydGluZ1xuIik7CisJCWlmICghcGNpX2lzX3BjaWUocGRldikpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vdCBQQ0lFLCBhYm9ydGluZ1xuIik7CiAJCQlyYyA9IC1FSU87CiAJCQlnb3RvIGVycl9vdXRfdW5tYXA7CiAJCX0KQEAgLTgwNTEsNyArODA5Nyw3IEBACiAJCQlicC0+ZndfdmVyc2lvbltqKytdID0gJyAnOwogCQlmb3IgKGkgPSAwOyBpIDwgMyAmJiBqIDwgMjg7IGkrKykgewogCQkJcmVnID0gYm54Ml9yZWdfcmRfaW5kKGJwLCBhZGRyICsgaSAqIDQpOwotCQkJcmVnID0gc3dhYjMyKHJlZyk7CisJCQlyZWcgPSBiZTMyX3RvX2NwdShyZWcpOwogCQkJbWVtY3B5KCZicC0+ZndfdmVyc2lvbltqXSwgJnJlZywgNCk7CiAJCQlqICs9IDQ7CiAJCX0KQEAgLTgxNzcsNiArODIyMywxMiBAQAogCWJwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGJwOwogCWJwLT50aW1lci5mdW5jdGlvbiA9IGJueDJfdGltZXI7CiAKKyNpZmRlZiBCQ01fQ05JQworCWlmIChibngyX3NobWVtX3JkKGJwLCBCTlgyX0lTQ1NJX0lOSVRJQVRPUikgJiBCTlgyX0lTQ1NJX0lOSVRJQVRPUl9FTikKKwkJYnAtPmNuaWNfZXRoX2Rldi5tYXhfaXNjc2lfY29ubiA9CisJCQkoYm54Ml9zaG1lbV9yZChicCwgQk5YMl9JU0NTSV9NQVhfQ09OTikgJgorCQkJIEJOWDJfSVNDU0lfTUFYX0NPTk5fTUFTSykgPj4gQk5YMl9JU0NTSV9NQVhfQ09OTl9TSElGVDsKKyNlbmRpZgogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC04MzU4LDYgKzg0MTAsNyBAQAogCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAKIAlkZWxfdGltZXJfc3luYygmYnAtPnRpbWVyKTsKKwljYW5jZWxfd29ya19zeW5jKCZicC0+cmVzZXRfdGFzayk7CiAKIAlpZiAoYnAtPm1pcHNfZmlybXdhcmUpCiAJCXJlbGVhc2VfZmlybXdhcmUoYnAtPm1pcHNfZmlybXdhcmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54Mi5oIGIvZHJpdmVycy9uZXQvYm54Mi5oCmluZGV4IGJmMzcxZjYuLmZjNTBkNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDIuaAorKysgYi9kcml2ZXJzL25ldC9ibngyLmgKQEAgLTczNjgsNiArNzM2OCwyMSBAQAogI2RlZmluZSBCTlgyX1JQSFlfU0VSREVTX0xJTksJCQkweDM3NAogI2RlZmluZSBCTlgyX1JQSFlfQ09QUEVSX0xJTksJCQkweDM3OAogCisjZGVmaW5lIEJOWDJfSVNDU0lfSU5JVElBVE9SCQkJMHgzZGMKKyNkZWZpbmUgQk5YMl9JU0NTSV9JTklUSUFUT1JfRU4JCQkgMHgwMDA4MDAwMAorCisjZGVmaW5lIEJOWDJfSVNDU0lfTUFYX0NPTk4JCQkweDNlNAorI2RlZmluZSBCTlgyX0lTQ1NJX01BWF9DT05OX01BU0sJCSAweGZmZmYwMDAwCisjZGVmaW5lIEJOWDJfSVNDU0lfTUFYX0NPTk5fU0hJRlQJCSAxNgorCiAjZGVmaW5lIEhPU1RfVklFV19TSE1FTV9CQVNFCQkJMHgxNjdjMDAKIAorI2RlZmluZSBEUF9TSE1FTV9MSU5FKGJwLCBvZmZzZXQpCQkJCQlcCisJbmV0ZGV2X2VycihicC0+ZGV2LCAiREVCVUc6ICUwOHg6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCVwKKwkJICAgb2Zmc2V0LAkJCQkJCVwKKwkJICAgYm54Ml9zaG1lbV9yZChicCwgb2Zmc2V0KSwJCQkJXAorCQkgICBibngyX3NobWVtX3JkKGJwLCBvZmZzZXQgKyA0KSwJCQlcCisJCSAgIGJueDJfc2htZW1fcmQoYnAsIG9mZnNldCArIDgpLAkJCVwKKwkJICAgYm54Ml9zaG1lbV9yZChicCwgb2Zmc2V0ICsgMTIpKQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvYm54MngvTWFrZWZpbGUKaW5kZXggYmI4M2EyOS4uNDhmYmRkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MngvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvYm54MngvTWFrZWZpbGUKQEAgLTQsNCArNCw0IEBACiAKIG9iai0kKENPTkZJR19CTlgyWCkgKz0gYm54MngubwogCi1ibngyeC1vYmpzIDo9IGJueDJ4X21haW4ubyBibngyeF9saW5rLm8gYm54MnhfY21uLm8gYm54MnhfZXRodG9vbC5vIGJueDJ4X3N0YXRzLm8gYm54MnhfZGNiLm8KK2JueDJ4LW9ianMgOj0gYm54MnhfbWFpbi5vIGJueDJ4X2xpbmsubyBibngyeF9jbW4ubyBibngyeF9ldGh0b29sLm8gYm54Mnhfc3RhdHMubyBibngyeF9kY2IubyBibngyeF9zcC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeC5oIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnguaAppbmRleCA2NjhhNTc4Li5jNDIzNTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeC5oCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4LmgKQEAgLTE0LDYgKzE0LDcgQEAKICNpZm5kZWYgQk5YMlhfSAogI2RlZmluZSBCTlgyWF9ICiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKiBjb21waWxhdGlvbiB0aW1lIGZsYWdzICovCkBAIC0yMiwxNCArMjMsMTAgQEAKICAqICh5b3Ugd2lsbCBuZWVkIHRvIHJlYm9vdCBhZnRlcndhcmRzKSAqLwogLyogI2RlZmluZSBCTlgyWF9TVE9QX09OX0VSUk9SICovCiAKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OICAgICAgIjEuNjIuMTItMCIKLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFICAgICAgIjIwMTEvMDMvMjAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTiAgICAgICIxLjcwLjAwLTAiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURSAgICAgICIyMDExLzA2LzEzIgogI2RlZmluZSBCTlgyWF9CQ19WRVIgICAgICAgICAgICAweDA0MDIwMAogCi0jZGVmaW5lIEJOWDJYX01VTFRJX1FVRVVFCi0KLSNkZWZpbmUgQk5YMlhfTkVXX05BUEkKLQogI2lmIGRlZmluZWQoQ09ORklHX0RDQikKICNkZWZpbmUgQkNNX0RDQk5MCiAjZW5kaWYKQEAgLTQ3LDExICs0NCwxMiBAQAogI2VuZGlmCiAKICNpbmNsdWRlIDxsaW51eC9tZGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CisKICNpbmNsdWRlICJibngyeF9yZWcuaCIKICNpbmNsdWRlICJibngyeF9md19kZWZzLmgiCiAjaW5jbHVkZSAiYm54MnhfaHNpLmgiCiAjaW5jbHVkZSAiYm54MnhfbGluay5oIgorI2luY2x1ZGUgImJueDJ4X3NwLmgiCiAjaW5jbHVkZSAiYm54MnhfZGNiLmgiCiAjaW5jbHVkZSAiYm54Mnhfc3RhdHMuaCIKIApAQCAtODAsNiArNzgsMTIgQEAKIAkJICAgICAgICMjX19hcmdzKTsJCQkJXAogfSB3aGlsZSAoMCkKIAorI2RlZmluZSBEUF9DT05UKF9fbWFzaywgX19mbXQsIF9fYXJncy4uLikJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKGJwLT5tc2dfZW5hYmxlICYgKF9fbWFzaykpCQkJCVwKKwkJcHJfY29udChfX2ZtdCwgIyNfX2FyZ3MpOwkJCVwKK30gd2hpbGUgKDApCisKIC8qIGVycm9ycyBkZWJ1ZyBwcmludCAqLwogI2RlZmluZSBCTlgyWF9EQkdfRVJSKF9fZm10LCBfX2FyZ3MuLi4pCQkJCVwKIGRvIHsJCQkJCQkJCVwKQEAgLTExMSw5ICsxMTUsMTIgQEAKIAkJZGV2X2luZm8oJmJwLT5wZGV2LT5kZXYsIF9fZm10LCAjI19fYXJncyk7CSBcCiB9IHdoaWxlICgwKQogCi12b2lkIGJueDJ4X3BhbmljX2R1bXAoc3RydWN0IGJueDJ4ICpicCk7CisjZGVmaW5lIEJOWDJYX01BQ19GTVQJCSIlcE0iCisjZGVmaW5lIEJOWDJYX01BQ19QUk5fTElTVChtYWMpCShtYWMpCisKIAogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKK3ZvaWQgYm54MnhfaW50X2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCk7CiAjZGVmaW5lIGJueDJ4X3BhbmljKCkgZG8geyBcCiAJCWJwLT5wYW5pYyA9IDE7IFwKIAkJQk5YMlhfRVJSKCJkcml2ZXIgYXNzZXJ0XG4iKTsgXApAQCAtMjMzLDIyICsyNDAsMjIgQEAKICAqCiAgKi8KIC8qIGlTQ1NJIEwyICovCi0jZGVmaW5lIEJOWDJYX0lTQ1NJX0VUSF9DTF9JRAkJMTcKLSNkZWZpbmUgQk5YMlhfSVNDU0lfRVRIX0NJRAkJMTcKKyNkZWZpbmUgQk5YMlhfSVNDU0lfRVRIX0NMX0lEX0lEWAkxCisjZGVmaW5lIEJOWDJYX0lTQ1NJX0VUSF9DSUQJCTQ5CiAKIC8qIEZDb0UgTDIgKi8KLSNkZWZpbmUgQk5YMlhfRkNPRV9FVEhfQ0xfSUQJCTE4Ci0jZGVmaW5lIEJOWDJYX0ZDT0VfRVRIX0NJRAkJMTgKKyNkZWZpbmUgQk5YMlhfRkNPRV9FVEhfQ0xfSURfSURYCTIKKyNkZWZpbmUgQk5YMlhfRkNPRV9FVEhfQ0lECQk1MAogCiAvKiogQWRkaXRpb25hbCByaW5ncyBidWRnZXRpbmcgKi8KICNpZmRlZiBCQ01fQ05JQwotI2RlZmluZSBDTklDX0NPTlRFWFRfVVNFCQkxCi0jZGVmaW5lIEZDT0VfQ09OVEVYVF9VU0UJCTEKKyNkZWZpbmUgQ05JQ19QUkVTRU5UCQkJMQorI2RlZmluZSBGQ09FX1BSRVNFTlQJCQkxCiAjZWxzZQotI2RlZmluZSBDTklDX0NPTlRFWFRfVVNFCQkwCi0jZGVmaW5lIEZDT0VfQ09OVEVYVF9VU0UJCTAKKyNkZWZpbmUgQ05JQ19QUkVTRU5UCQkJMAorI2RlZmluZSBGQ09FX1BSRVNFTlQJCQkwCiAjZW5kaWYgLyogQkNNX0NOSUMgKi8KLSNkZWZpbmUgTk9ORV9FVEhfQ09OVEVYVF9VU0UJKEZDT0VfQ09OVEVYVF9VU0UpCisjZGVmaW5lIE5PTl9FVEhfQ09OVEVYVF9VU0UJKEZDT0VfUFJFU0VOVCkKIAogI2RlZmluZSBBRVVfSU5fQVRUTl9CSVRTX1BYUFBDSUNMT0NLQ0xJRU5UX1BBUklUWV9FUlJPUiBcCiAJQUVVX0lOUFVUU19BVFROX0JJVFNfUFhQUENJQ0xPQ0tDTElFTlRfUEFSSVRZX0VSUk9SCkBAIC0yNTYsOCArMjYzLDM1IEBACiAjZGVmaW5lIFNNX1JYX0lECQkJMAogI2RlZmluZSBTTV9UWF9JRAkJCTEKIAotLyogZmFzdCBwYXRoICovCisvKiBkZWZpbmVzIGZvciBtdWx0aXBsZSB0eCBwcmlvcml0eSBpbmRpY2VzICovCisjZGVmaW5lIEZJUlNUX1RYX09OTFlfQ09TX0lOREVYCQkxCisjZGVmaW5lIEZJUlNUX1RYX0NPU19JTkRFWAkJMAogCisvKiBkZWZpbmVzIGZvciBkZWNvZGVpbmcgdGhlIGZhc3RwYXRoIGluZGV4IGFuZCB0aGUgY29zIGluZGV4IG91dCBvZiB0aGUKKyAqIHRyYW5zbWlzc2lvbiBxdWV1ZSBpbmRleAorICovCisjZGVmaW5lIE1BWF9UWFFTX1BFUl9DT1MJRlBfU0JfTUFYX0UxeAorCisjZGVmaW5lIFRYUV9UT19GUCh0eHFfaW5kZXgpCSgodHhxX2luZGV4KSAlIE1BWF9UWFFTX1BFUl9DT1MpCisjZGVmaW5lIFRYUV9UT19DT1ModHhxX2luZGV4KQkoKHR4cV9pbmRleCkgLyBNQVhfVFhRU19QRVJfQ09TKQorCisvKiBydWxlcyBmb3IgY2FsY3VsYXRpbmcgdGhlIGNpZHMgb2YgdHgtb25seSBjb25uZWN0aW9ucyAqLworI2RlZmluZSBDSURfVE9fRlAoY2lkKQkJKChjaWQpICUgTUFYX1RYUVNfUEVSX0NPUykKKyNkZWZpbmUgQ0lEX0NPU19UT19UWF9PTkxZX0NJRChjaWQsIGNvcykJKGNpZCArIGNvcyAqIE1BWF9UWFFTX1BFUl9DT1MpCisKKy8qIGZwIGluZGV4IGluc2lkZSBjbGFzcyBvZiBzZXJ2aWNlIHJhbmdlICovCisjZGVmaW5lIEZQX0NPU19UT19UWFEoZnAsIGNvcykgICAgKChmcCktPmluZGV4ICsgY29zICogTUFYX1RYUVNfUEVSX0NPUykKKworLyoKKyAqIDAuLjE1IGV0aCBjb3MwCisgKiAxNi4uMzEgZXRoIGNvczEgaWYgYXBwbGljYWJsZQorICogMzIuLjQ3IGV0aCBjb3MyIElmIGFwcGxpY2FibGUKKyAqIGZjb2UgcXVldWUgZm9sbG93cyBldGggcXVldWVzICgxNiwgMzIsIDQ4IGRlcGVuZGluZyBvbiBjb3MpCisgKi8KKyNkZWZpbmUgTUFYX0VUSF9UWFFfSURYKGJwKQkoTUFYX1RYUVNfUEVSX0NPUyAqIChicCktPm1heF9jb3MpCisjZGVmaW5lIEZDT0VfVFhRX0lEWChicCkJKE1BWF9FVEhfVFhRX0lEWChicCkpCisKKy8qIGZhc3QgcGF0aCAqLwogc3RydWN0IHN3X3J4X2JkIHsKIAlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwogCURFRklORV9ETUFfVU5NQVBfQUREUihtYXBwaW5nKTsKQEAgLTI4Myw0NCArMzE3LDczIEBACiAKIAogLyogTUMgaHNpICovCi0jZGVmaW5lIEJDTV9QQUdFX1NISUZUCQkJMTIKLSNkZWZpbmUgQkNNX1BBR0VfU0laRQkJCSgxIDw8IEJDTV9QQUdFX1NISUZUKQotI2RlZmluZSBCQ01fUEFHRV9NQVNLCQkJKH4oQkNNX1BBR0VfU0laRSAtIDEpKQorI2RlZmluZSBCQ01fUEFHRV9TSElGVAkJMTIKKyNkZWZpbmUgQkNNX1BBR0VfU0laRQkJKDEgPDwgQkNNX1BBR0VfU0hJRlQpCisjZGVmaW5lIEJDTV9QQUdFX01BU0sJCSh+KEJDTV9QQUdFX1NJWkUgLSAxKSkKICNkZWZpbmUgQkNNX1BBR0VfQUxJR04oYWRkcikJKCgoYWRkcikgKyBCQ01fUEFHRV9TSVpFIC0gMSkgJiBCQ01fUEFHRV9NQVNLKQogCi0jZGVmaW5lIFBBR0VTX1BFUl9TR0VfU0hJRlQJCTAKLSNkZWZpbmUgUEFHRVNfUEVSX1NHRQkJCSgxIDw8IFBBR0VTX1BFUl9TR0VfU0hJRlQpCi0jZGVmaW5lIFNHRV9QQUdFX1NJWkUJCQlQQUdFX1NJWkUKLSNkZWZpbmUgU0dFX1BBR0VfU0hJRlQJCQlQQUdFX1NISUZUCi0jZGVmaW5lIFNHRV9QQUdFX0FMSUdOKGFkZHIpCQlQQUdFX0FMSUdOKCh0eXBlb2YoUEFHRV9TSVpFKSkoYWRkcikpCisjZGVmaW5lIFBBR0VTX1BFUl9TR0VfU0hJRlQJMAorI2RlZmluZSBQQUdFU19QRVJfU0dFCQkoMSA8PCBQQUdFU19QRVJfU0dFX1NISUZUKQorI2RlZmluZSBTR0VfUEFHRV9TSVpFCQlQQUdFX1NJWkUKKyNkZWZpbmUgU0dFX1BBR0VfU0hJRlQJCVBBR0VfU0hJRlQKKyNkZWZpbmUgU0dFX1BBR0VfQUxJR04oYWRkcikJUEFHRV9BTElHTigodHlwZW9mKFBBR0VfU0laRSkpKGFkZHIpKQogCiAvKiBTR0UgcmluZyByZWxhdGVkIG1hY3JvcyAqLwotI2RlZmluZSBOVU1fUlhfU0dFX1BBR0VTCQkyCisjZGVmaW5lIE5VTV9SWF9TR0VfUEFHRVMJMgogI2RlZmluZSBSWF9TR0VfQ05UCQkoQkNNX1BBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgZXRoX3J4X3NnZSkpCi0jZGVmaW5lIE1BWF9SWF9TR0VfQ05UCQkJKFJYX1NHRV9DTlQgLSAyKQorI2RlZmluZSBNQVhfUlhfU0dFX0NOVAkJKFJYX1NHRV9DTlQgLSAyKQogLyogUlhfU0dFX0NOVCBpcyBwcm9taXNlZCB0byBiZSBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgUlhfU0dFX01BU0sJCQkoUlhfU0dFX0NOVCAtIDEpCi0jZGVmaW5lIE5VTV9SWF9TR0UJCQkoUlhfU0dFX0NOVCAqIE5VTV9SWF9TR0VfUEFHRVMpCi0jZGVmaW5lIE1BWF9SWF9TR0UJCQkoTlVNX1JYX1NHRSAtIDEpCisjZGVmaW5lIFJYX1NHRV9NQVNLCQkoUlhfU0dFX0NOVCAtIDEpCisjZGVmaW5lIE5VTV9SWF9TR0UJCShSWF9TR0VfQ05UICogTlVNX1JYX1NHRV9QQUdFUykKKyNkZWZpbmUgTUFYX1JYX1NHRQkJKE5VTV9SWF9TR0UgLSAxKQogI2RlZmluZSBORVhUX1NHRV9JRFgoeCkJCSgoKCh4KSAmIFJYX1NHRV9NQVNLKSA9PSBcCiAJCQkJICAoTUFYX1JYX1NHRV9DTlQgLSAxKSkgPyAoeCkgKyAzIDogKHgpICsgMSkKLSNkZWZpbmUgUlhfU0dFKHgpCQkJKCh4KSAmIE1BWF9SWF9TR0UpCisjZGVmaW5lIFJYX1NHRSh4KQkJKCh4KSAmIE1BWF9SWF9TR0UpCiAKLS8qIFNHRSBwcm9kdWNlciBtYXNrIHJlbGF0ZWQgbWFjcm9zICovCisvKiBNYW5pcHVsYXRlIGEgYml0IHZlY3RvciBkZWZpbmVkIGFzIGFuIGFycmF5IG9mIHU2NCAqLworCiAvKiBOdW1iZXIgb2YgYml0cyBpbiBvbmUgc2dlX21hc2sgYXJyYXkgZWxlbWVudCAqLwotI2RlZmluZSBSWF9TR0VfTUFTS19FTEVNX1NaCQk2NAotI2RlZmluZSBSWF9TR0VfTUFTS19FTEVNX1NISUZUCQk2Ci0jZGVmaW5lIFJYX1NHRV9NQVNLX0VMRU1fTUFTSwkJKCh1NjQpUlhfU0dFX01BU0tfRUxFTV9TWiAtIDEpCisjZGVmaW5lIEJJVF9WRUM2NF9FTEVNX1NaCQk2NAorI2RlZmluZSBCSVRfVkVDNjRfRUxFTV9TSElGVAkJNgorI2RlZmluZSBCSVRfVkVDNjRfRUxFTV9NQVNLCQkoKHU2NClCSVRfVkVDNjRfRUxFTV9TWiAtIDEpCisKKworI2RlZmluZSBfX0JJVF9WRUM2NF9TRVRfQklUKGVsLCBiaXQpIFwKKwlkbyB7IFwKKwkJZWwgPSAoKGVsKSB8ICgodTY0KTB4MSA8PCAoYml0KSkpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0JJVF9WRUM2NF9DTEVBUl9CSVQoZWwsIGJpdCkgXAorCWRvIHsgXAorCQllbCA9ICgoZWwpICYgKH4oKHU2NCkweDEgPDwgKGJpdCkpKSk7IFwKKwl9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgQklUX1ZFQzY0X1NFVF9CSVQodmVjNjQsIGlkeCkgXAorCV9fQklUX1ZFQzY0X1NFVF9CSVQoKHZlYzY0KVsoaWR4KSA+PiBCSVRfVkVDNjRfRUxFTV9TSElGVF0sIFwKKwkJCSAgIChpZHgpICYgQklUX1ZFQzY0X0VMRU1fTUFTSykKKworI2RlZmluZSBCSVRfVkVDNjRfQ0xFQVJfQklUKHZlYzY0LCBpZHgpIFwKKwlfX0JJVF9WRUM2NF9DTEVBUl9CSVQoKHZlYzY0KVsoaWR4KSA+PiBCSVRfVkVDNjRfRUxFTV9TSElGVF0sIFwKKwkJCSAgICAgKGlkeCkgJiBCSVRfVkVDNjRfRUxFTV9NQVNLKQorCisjZGVmaW5lIEJJVF9WRUM2NF9URVNUX0JJVCh2ZWM2NCwgaWR4KSBcCisJKCgodmVjNjQpWyhpZHgpID4+IEJJVF9WRUM2NF9FTEVNX1NISUZUXSA+PiBcCisJKChpZHgpICYgQklUX1ZFQzY0X0VMRU1fTUFTSykpICYgMHgxKQogCiAvKiBDcmVhdGVzIGEgYml0bWFzayBvZiBhbGwgb25lcyBpbiBsZXNzIHNpZ25pZmljYW50IGJpdHMuCiAgICBpZHggLSBpbmRleCBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlIGNyZWF0ZWQgbWFzayAqLwotI2RlZmluZSBSWF9TR0VfT05FU19NQVNLKGlkeCkgXAotCQkoKCh1NjQpMHgxIDw8ICgoKGlkeCkgJiBSWF9TR0VfTUFTS19FTEVNX01BU0spICsgMSkpIC0gMSkKLSNkZWZpbmUgUlhfU0dFX01BU0tfRUxFTV9PTkVfTUFTSwkoKHU2NCkofjApKQorI2RlZmluZSBCSVRfVkVDNjRfT05FU19NQVNLKGlkeCkgXAorCQkoKCh1NjQpMHgxIDw8ICgoKGlkeCkgJiBCSVRfVkVDNjRfRUxFTV9NQVNLKSArIDEpKSAtIDEpCisjZGVmaW5lIEJJVF9WRUM2NF9FTEVNX09ORV9NQVNLCSgodTY0KSh+MCkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKIAogLyogTnVtYmVyIG9mIHU2NCBlbGVtZW50cyBpbiBTR0UgbWFzayBhcnJheSAqLwogI2RlZmluZSBSWF9TR0VfTUFTS19MRU4JCQkoKE5VTV9SWF9TR0VfUEFHRVMgKiBSWF9TR0VfQ05UKSAvIFwKLQkJCQkJIFJYX1NHRV9NQVNLX0VMRU1fU1opCisJCQkJCSBCSVRfVkVDNjRfRUxFTV9TWikKICNkZWZpbmUgUlhfU0dFX01BU0tfTEVOX01BU0sJCShSWF9TR0VfTUFTS19MRU4gLSAxKQogI2RlZmluZSBORVhUX1NHRV9NQVNLX0VMRU0oZWwpCQkoKChlbCkgKyAxKSAmIFJYX1NHRV9NQVNLX0xFTl9NQVNLKQogCkBAIC0zMzEsNyArMzk0LDUzIEBACiAJc3RydWN0IGhvc3RfaGNfc3RhdHVzX2Jsb2NrX2UyICAqZTJfc2I7CiB9OwogCitzdHJ1Y3QgYm54MnhfYWdnX2luZm8geworCS8qCisJICogRmlyc3QgYWdncmVnYXRpb24gYnVmZmVyIGlzIGFuIHNrYiwgdGhlIGZvbGxvd2luZyAtIGFyZSBwYWdlcy4KKwkgKiBXZSB3aWxsIHByZWFsbG9jYXRlIHRoZSBza2JzIGZvciBlYWNoIGFnZ3JlZ2F0aW9uIHdoZW4KKwkgKiB3ZSBvcGVuIHRoZSBpbnRlcmZhY2UgYW5kIHdpbGwgcmVwbGFjZSB0aGUgQkQgYXQgdGhlIGNvbnN1bWVyCisJICogd2l0aCB0aGlzIG9uZSB3aGVuIHdlIHJlY2VpdmUgdGhlIFRQQV9TVEFSVCBDUUUgaW4gb3JkZXIgdG8KKwkgKiBrZWVwIHRoZSBSeCBCRCByaW5nIGNvbnNpc3RlbnQuCisJICovCisJc3RydWN0IHN3X3J4X2JkCQlmaXJzdF9idWY7CisJdTgJCQl0cGFfc3RhdGU7CisjZGVmaW5lIEJOWDJYX1RQQV9TVEFSVAkJCTEKKyNkZWZpbmUgQk5YMlhfVFBBX1NUT1AJCQkyCisjZGVmaW5lIEJOWDJYX1RQQV9FUlJPUgkJCTMKKwl1OAkJCXBsYWNlbWVudF9vZmZzZXQ7CisJdTE2CQkJcGFyc2luZ19mbGFnczsKKwl1MTYJCQl2bGFuX3RhZzsKKwl1MTYJCQlsZW5fb25fYmQ7Cit9OworCisjZGVmaW5lIFFfU1RBVFNfT0ZGU0VUMzIoc3RhdF9uYW1lKSBcCisJCQkob2Zmc2V0b2Yoc3RydWN0IGJueDJ4X2V0aF9xX3N0YXRzLCBzdGF0X25hbWUpIC8gNCkKKworc3RydWN0IGJueDJ4X2ZwX3R4ZGF0YSB7CisKKwlzdHJ1Y3Qgc3dfdHhfYmQJCSp0eF9idWZfcmluZzsKKworCXVuaW9uIGV0aF90eF9iZF90eXBlcwkqdHhfZGVzY19yaW5nOworCWRtYV9hZGRyX3QJCXR4X2Rlc2NfbWFwcGluZzsKKworCXUzMgkJCWNpZDsKKworCXVuaW9uIGRiX3Byb2QJCXR4X2RiOworCisJdTE2CQkJdHhfcGt0X3Byb2Q7CisJdTE2CQkJdHhfcGt0X2NvbnM7CisJdTE2CQkJdHhfYmRfcHJvZDsKKwl1MTYJCQl0eF9iZF9jb25zOworCisJdW5zaWduZWQgbG9uZwkJdHhfcGt0OworCisJX19sZTE2CQkJKnR4X2NvbnNfc2I7CisKKwlpbnQJCQl0eHFfaW5kZXg7Cit9OworCiBzdHJ1Y3QgYm54MnhfZmFzdHBhdGggeworCXN0cnVjdCBibngyeAkJKmJwOyAvKiBwYXJlbnQgKi8KIAogI2RlZmluZSBCTlgyWF9OQVBJX1dFSUdIVCAgICAgICAxMjgKIAlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJbmFwaTsKQEAgLTM0NiwxMCArNDU1LDggQEAKIAogCWRtYV9hZGRyX3QJCXN0YXR1c19ibGtfbWFwcGluZzsKIAotCXN0cnVjdCBzd190eF9iZAkJKnR4X2J1Zl9yaW5nOwotCi0JdW5pb24gZXRoX3R4X2JkX3R5cGVzCSp0eF9kZXNjX3Jpbmc7Ci0JZG1hX2FkZHJfdAkJdHhfZGVzY19tYXBwaW5nOworCXU4CQkJbWF4X2NvczsgLyogYWN0dWFsIG51bWJlciBvZiBhY3RpdmUgdHggY29zZXMgKi8KKwlzdHJ1Y3QgYm54MnhfZnBfdHhkYXRhCXR4ZGF0YVtCTlgyWF9NVUxUSV9UWF9DT1NdOwogCiAJc3RydWN0IHN3X3J4X2JkCQkqcnhfYnVmX3Jpbmc7CS8qIEJEcyBtYXBwaW5ncyByaW5nICovCiAJc3RydWN0IHN3X3J4X3BhZ2UJKnJ4X3BhZ2VfcmluZzsJLyogU0dFIHBhZ2VzIG1hcHBpbmdzIHJpbmcgKi8KQEAgLTM2NiwzMiArNDczLDE1IEBACiAKIAl1NjQJCQlzZ2VfbWFza1tSWF9TR0VfTUFTS19MRU5dOwogCi0JaW50CQkJc3RhdGU7Ci0jZGVmaW5lIEJOWDJYX0ZQX1NUQVRFX0NMT1NFRAkJMAotI2RlZmluZSBCTlgyWF9GUF9TVEFURV9JUlEJCTB4ODAwMDAKLSNkZWZpbmUgQk5YMlhfRlBfU1RBVEVfT1BFTklORwkJMHg5MDAwMAotI2RlZmluZSBCTlgyWF9GUF9TVEFURV9PUEVOCQkweGEwMDAwCi0jZGVmaW5lIEJOWDJYX0ZQX1NUQVRFX0hBTFRJTkcJCTB4YjAwMDAKLSNkZWZpbmUgQk5YMlhfRlBfU1RBVEVfSEFMVEVECQkweGMwMDAwCi0jZGVmaW5lIEJOWDJYX0ZQX1NUQVRFX1RFUk1JTkFUSU5HCTB4ZDAwMDAKLSNkZWZpbmUgQk5YMlhfRlBfU1RBVEVfVEVSTUlOQVRFRAkweGUwMDAwCisJdTMyCQkJY2lkOworCisJX19sZTE2CQkJZnBfaGNfaWR4OwogCiAJdTgJCQlpbmRleDsJCS8qIG51bWJlciBpbiBmcCBhcnJheSAqLwogCXU4CQkJY2xfaWQ7CQkvKiBldGggY2xpZW50IGlkICovCiAJdTgJCQljbF9xem9uZV9pZDsKIAl1OAkJCWZ3X3NiX2lkOwkvKiBzdGF0dXMgYmxvY2sgbnVtYmVyIGluIEZXICovCiAJdTgJCQlpZ3Vfc2JfaWQ7CS8qIHN0YXR1cyBibG9jayBudW1iZXIgaW4gSFcgKi8KLQl1MzIJCQljaWQ7Ci0KLQl1bmlvbiBkYl9wcm9kCQl0eF9kYjsKLQotCXUxNgkJCXR4X3BrdF9wcm9kOwotCXUxNgkJCXR4X3BrdF9jb25zOwotCXUxNgkJCXR4X2JkX3Byb2Q7Ci0JdTE2CQkJdHhfYmRfY29uczsKLQlfX2xlMTYJCQkqdHhfY29uc19zYjsKLQotCV9fbGUxNgkJCWZwX2hjX2lkeDsKIAogCXUxNgkJCXJ4X2JkX3Byb2Q7CiAJdTE2CQkJcnhfYmRfY29uczsKQEAgLTQwMSwyNCArNDkxLDE5IEBACiAJLyogVGhlIGxhc3QgbWF4aW1hbCBjb21wbGV0ZWQgU0dFICovCiAJdTE2CQkJbGFzdF9tYXhfc2dlOwogCV9fbGUxNgkJCSpyeF9jb25zX3NiOwotCi0JdW5zaWduZWQgbG9uZwkJdHhfcGt0LAotCQkJCXJ4X3BrdCwKKwl1bnNpZ25lZCBsb25nCQlyeF9wa3QsCiAJCQkJcnhfY2FsbHM7CiAKIAkvKiBUUEEgcmVsYXRlZCAqLwotCXN0cnVjdCBzd19yeF9iZAkJdHBhX3Bvb2xbRVRIX01BWF9BR0dSRUdBVElPTl9RVUVVRVNfRTFIXTsKLQl1OAkJCXRwYV9zdGF0ZVtFVEhfTUFYX0FHR1JFR0FUSU9OX1FVRVVFU19FMUhdOwotI2RlZmluZSBCTlgyWF9UUEFfU1RBUlQJCQkxCi0jZGVmaW5lIEJOWDJYX1RQQV9TVE9QCQkJMgorCXN0cnVjdCBibngyeF9hZ2dfaW5mbwl0cGFfaW5mb1tFVEhfTUFYX0FHR1JFR0FUSU9OX1FVRVVFU19FMUhfRTJdOwogCXU4CQkJZGlzYWJsZV90cGE7CiAjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgogCXU2NAkJCXRwYV9xdWV1ZV91c2VkOwogI2VuZGlmCiAKLQlzdHJ1Y3QgdHN0b3JtX3Blcl9jbGllbnRfc3RhdHMgb2xkX3RjbGllbnQ7Ci0Jc3RydWN0IHVzdG9ybV9wZXJfY2xpZW50X3N0YXRzIG9sZF91Y2xpZW50OwotCXN0cnVjdCB4c3Rvcm1fcGVyX2NsaWVudF9zdGF0cyBvbGRfeGNsaWVudDsKKwlzdHJ1Y3QgdHN0b3JtX3Blcl9xdWV1ZV9zdGF0cyBvbGRfdGNsaWVudDsKKwlzdHJ1Y3QgdXN0b3JtX3Blcl9xdWV1ZV9zdGF0cyBvbGRfdWNsaWVudDsKKwlzdHJ1Y3QgeHN0b3JtX3Blcl9xdWV1ZV9zdGF0cyBvbGRfeGNsaWVudDsKIAlzdHJ1Y3QgYm54MnhfZXRoX3Ffc3RhdHMgZXRoX3Ffc3RhdHM7CiAKIAkvKiBUaGUgc2l6ZSBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmc6CkBAIC00MjcsNyArNTEyLDEzIEBACiAJICAgICA0IChmb3IgdGhlIGRpZ2l0cyBhbmQgdG8gbWFrZSBpdCBEV09SRCBhbGlnbmVkKSAqLwogI2RlZmluZSBGUF9OQU1FX1NJWkUJCShzaXplb2YoKChzdHJ1Y3QgbmV0X2RldmljZSAqKTApLT5uYW1lKSArIDgpCiAJY2hhcgkJCW5hbWVbRlBfTkFNRV9TSVpFXTsKLQlzdHJ1Y3QgYm54MngJCSpicDsgLyogcGFyZW50ICovCisKKwkvKiBNQUNzIG9iamVjdCAqLworCXN0cnVjdCBibngyeF92bGFuX21hY19vYmogbWFjX29iajsKKworCS8qIFF1ZXVlIFN0YXRlIG9iamVjdCAqLworCXN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogcV9vYmo7CisKIH07CiAKICNkZWZpbmUgYm54MnhfZnAoYnAsIG5yLCB2YXIpCQkoYnAtPmZwW25yXS52YXIpCkBAIC00MzUsMTEgKzUyNiwxNyBAQAogLyogVXNlIDI1MDAgYXMgYSBtaW5pLWp1bWJvIE1UVSBmb3IgRkNvRSAqLwogI2RlZmluZSBCTlgyWF9GQ09FX01JTklfSlVNQk9fTVRVCTI1MDAKIAotI2lmZGVmIEJDTV9DTklDCi0vKiBGQ29FIEwyIGBmYXN0cGF0aCcgaXMgcmlnaHQgYWZ0ZXIgdGhlIGV0aCBlbnRyaWVzICovCisvKiBGQ29FIEwyIGBmYXN0cGF0aCcgZW50cnkgaXMgcmlnaHQgYWZ0ZXIgdGhlIGV0aCBlbnRyaWVzICovCiAjZGVmaW5lIEZDT0VfSURYCQkJQk5YMlhfTlVNX0VUSF9RVUVVRVMoYnApCiAjZGVmaW5lIGJueDJ4X2Zjb2VfZnAoYnApCQkoJmJwLT5mcFtGQ09FX0lEWF0pCiAjZGVmaW5lIGJueDJ4X2Zjb2UoYnAsIHZhcikJCShibngyeF9mY29lX2ZwKGJwKS0+dmFyKQorI2RlZmluZSBibngyeF9mY29lX3R4KGJwLCB2YXIpCQkoYm54MnhfZmNvZV9mcChicCktPiBcCisJCQkJCQl0eGRhdGFbRklSU1RfVFhfQ09TX0lOREVYXS52YXIpCisKKworI2RlZmluZSBJU19FVEhfRlAoZnApCQkJKGZwLT5pbmRleCA8IFwKKwkJCQkJIEJOWDJYX05VTV9FVEhfUVVFVUVTKGZwLT5icCkpCisjaWZkZWYgQkNNX0NOSUMKICNkZWZpbmUgSVNfRkNPRV9GUChmcCkJCQkoZnAtPmluZGV4ID09IEZDT0VfSURYKQogI2RlZmluZSBJU19GQ09FX0lEWChpZHgpCQkoKGlkeCkgPT0gRkNPRV9JRFgpCiAjZWxzZQpAQCAtNDQ5LDc3ICs1NDYsNjggQEAKIAogCiAvKiBNQyBoc2kgKi8KLSNkZWZpbmUgTUFYX0ZFVENIX0JECQkJMTMJLyogSFcgbWF4IEJEcyBwZXIgcGFja2V0ICovCi0jZGVmaW5lIFJYX0NPUFlfVEhSRVNICQkJOTIKKyNkZWZpbmUgTUFYX0ZFVENIX0JECQkxMwkvKiBIVyBtYXggQkRzIHBlciBwYWNrZXQgKi8KKyNkZWZpbmUgUlhfQ09QWV9USFJFU0gJCTkyCiAKLSNkZWZpbmUgTlVNX1RYX1JJTkdTCQkJMTYKKyNkZWZpbmUgTlVNX1RYX1JJTkdTCQkxNgogI2RlZmluZSBUWF9ERVNDX0NOVAkJKEJDTV9QQUdFX1NJWkUgLyBzaXplb2YodW5pb24gZXRoX3R4X2JkX3R5cGVzKSkKLSNkZWZpbmUgTUFYX1RYX0RFU0NfQ05UCQkJKFRYX0RFU0NfQ05UIC0gMSkKLSNkZWZpbmUgTlVNX1RYX0JECQkJKFRYX0RFU0NfQ05UICogTlVNX1RYX1JJTkdTKQotI2RlZmluZSBNQVhfVFhfQkQJCQkoTlVNX1RYX0JEIC0gMSkKLSNkZWZpbmUgTUFYX1RYX0FWQUlMCQkJKE1BWF9UWF9ERVNDX0NOVCAqIE5VTV9UWF9SSU5HUyAtIDIpCi0jZGVmaW5lIElOSVRfSlVNQk9fVFhfUklOR19TSVpFCQlNQVhfVFhfQVZBSUwKLSNkZWZpbmUgSU5JVF9UWF9SSU5HX1NJWkUJCU1BWF9UWF9BVkFJTAorI2RlZmluZSBNQVhfVFhfREVTQ19DTlQJCShUWF9ERVNDX0NOVCAtIDEpCisjZGVmaW5lIE5VTV9UWF9CRAkJKFRYX0RFU0NfQ05UICogTlVNX1RYX1JJTkdTKQorI2RlZmluZSBNQVhfVFhfQkQJCShOVU1fVFhfQkQgLSAxKQorI2RlZmluZSBNQVhfVFhfQVZBSUwJCShNQVhfVFhfREVTQ19DTlQgKiBOVU1fVFhfUklOR1MgLSAyKQogI2RlZmluZSBORVhUX1RYX0lEWCh4KQkJKCgoKHgpICYgTUFYX1RYX0RFU0NfQ05UKSA9PSBcCiAJCQkJICAoTUFYX1RYX0RFU0NfQ05UIC0gMSkpID8gKHgpICsgMiA6ICh4KSArIDEpCi0jZGVmaW5lIFRYX0JEKHgpCQkJKCh4KSAmIE1BWF9UWF9CRCkKLSNkZWZpbmUgVFhfQkRfUE9GRih4KQkJCSgoeCkgJiBNQVhfVFhfREVTQ19DTlQpCisjZGVmaW5lIFRYX0JEKHgpCQkoKHgpICYgTUFYX1RYX0JEKQorI2RlZmluZSBUWF9CRF9QT0ZGKHgpCQkoKHgpICYgTUFYX1RYX0RFU0NfQ05UKQogCiAvKiBUaGUgUlggQkQgcmluZyBpcyBzcGVjaWFsLCBlYWNoIGJkIGlzIDggYnl0ZXMgYnV0IHRoZSBsYXN0IG9uZSBpcyAxNiAqLwotI2RlZmluZSBOVU1fUlhfUklOR1MJCQk4CisjZGVmaW5lIE5VTV9SWF9SSU5HUwkJOAogI2RlZmluZSBSWF9ERVNDX0NOVAkJKEJDTV9QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGV0aF9yeF9iZCkpCi0jZGVmaW5lIE1BWF9SWF9ERVNDX0NOVAkJCShSWF9ERVNDX0NOVCAtIDIpCi0jZGVmaW5lIFJYX0RFU0NfTUFTSwkJCShSWF9ERVNDX0NOVCAtIDEpCi0jZGVmaW5lIE5VTV9SWF9CRAkJCShSWF9ERVNDX0NOVCAqIE5VTV9SWF9SSU5HUykKLSNkZWZpbmUgTUFYX1JYX0JECQkJKE5VTV9SWF9CRCAtIDEpCi0jZGVmaW5lIE1BWF9SWF9BVkFJTAkJCShNQVhfUlhfREVTQ19DTlQgKiBOVU1fUlhfUklOR1MgLSAyKQotI2RlZmluZSBNSU5fUlhfU0laRV9UUEEJCQk3MgotI2RlZmluZSBNSU5fUlhfU0laRV9OT05UUEEJCTEwCi0jZGVmaW5lIElOSVRfSlVNQk9fUlhfUklOR19TSVpFCQlNQVhfUlhfQVZBSUwKLSNkZWZpbmUgSU5JVF9SWF9SSU5HX1NJWkUJCU1BWF9SWF9BVkFJTAorI2RlZmluZSBNQVhfUlhfREVTQ19DTlQJCShSWF9ERVNDX0NOVCAtIDIpCisjZGVmaW5lIFJYX0RFU0NfTUFTSwkJKFJYX0RFU0NfQ05UIC0gMSkKKyNkZWZpbmUgTlVNX1JYX0JECQkoUlhfREVTQ19DTlQgKiBOVU1fUlhfUklOR1MpCisjZGVmaW5lIE1BWF9SWF9CRAkJKE5VTV9SWF9CRCAtIDEpCisjZGVmaW5lIE1BWF9SWF9BVkFJTAkJKE1BWF9SWF9ERVNDX0NOVCAqIE5VTV9SWF9SSU5HUyAtIDIpCisjZGVmaW5lIE1JTl9SWF9BVkFJTAkJMTI4CisKKyNkZWZpbmUgTUlOX1JYX1NJWkVfVFBBX0hXCShDSElQX0lTX0UxKGJwKSA/IFwKKwkJCQkJRVRIX01JTl9SWF9DUUVTX1dJVEhfVFBBX0UxIDogXAorCQkJCQlFVEhfTUlOX1JYX0NRRVNfV0lUSF9UUEFfRTFIX0UyKQorI2RlZmluZSBNSU5fUlhfU0laRV9OT05UUEFfSFcgICBFVEhfTUlOX1JYX0NRRVNfV0lUSE9VVF9UUEEKKyNkZWZpbmUgTUlOX1JYX1NJWkVfVFBBCQkobWF4X3QodTMyLCBNSU5fUlhfU0laRV9UUEFfSFcsIE1JTl9SWF9BVkFJTCkpCisjZGVmaW5lIE1JTl9SWF9TSVpFX05PTlRQQQkobWF4X3QodTMyLCBNSU5fUlhfU0laRV9OT05UUEFfSFcsXAorCQkJCQkJCQlNSU5fUlhfQVZBSUwpKQorCiAjZGVmaW5lIE5FWFRfUlhfSURYKHgpCQkoKCgoeCkgJiBSWF9ERVNDX01BU0spID09IFwKIAkJCQkgIChNQVhfUlhfREVTQ19DTlQgLSAxKSkgPyAoeCkgKyAzIDogKHgpICsgMSkKLSNkZWZpbmUgUlhfQkQoeCkJCQkoKHgpICYgTUFYX1JYX0JEKQorI2RlZmluZSBSWF9CRCh4KQkJKCh4KSAmIE1BWF9SWF9CRCkKIAotLyogQXMgbG9uZyBhcyBDUUUgaXMgNCB0aW1lcyBiaWdnZXIgdGhhbiBCRCBlbnRyeSB3ZSBoYXZlIHRvIGFsbG9jYXRlCi0gICA0IHRpbWVzIG1vcmUgcGFnZXMgZm9yIENRIHJpbmcgaW4gb3JkZXIgdG8ga2VlcCBpdCBiYWxhbmNlZCB3aXRoCi0gICBCRCByaW5nICovCi0jZGVmaW5lIE5VTV9SQ1FfUklOR1MJCQkoTlVNX1JYX1JJTkdTICogNCkKKy8qCisgKiBBcyBsb25nIGFzIENRRSBpcyBYIHRpbWVzIGJpZ2dlciB0aGFuIEJEIGVudHJ5IHdlIGhhdmUgdG8gYWxsb2NhdGUgWCB0aW1lcworICogbW9yZSBwYWdlcyBmb3IgQ1EgcmluZyBpbiBvcmRlciB0byBrZWVwIGl0IGJhbGFuY2VkIHdpdGggQkQgcmluZworICovCisjZGVmaW5lIENRRV9CRF9SRUwJKHNpemVvZih1bmlvbiBldGhfcnhfY3FlKSAvIHNpemVvZihzdHJ1Y3QgZXRoX3J4X2JkKSkKKyNkZWZpbmUgTlVNX1JDUV9SSU5HUwkJKE5VTV9SWF9SSU5HUyAqIENRRV9CRF9SRUwpCiAjZGVmaW5lIFJDUV9ERVNDX0NOVAkJKEJDTV9QQUdFX1NJWkUgLyBzaXplb2YodW5pb24gZXRoX3J4X2NxZSkpCi0jZGVmaW5lIE1BWF9SQ1FfREVTQ19DTlQJCShSQ1FfREVTQ19DTlQgLSAxKQotI2RlZmluZSBOVU1fUkNRX0JECQkJKFJDUV9ERVNDX0NOVCAqIE5VTV9SQ1FfUklOR1MpCi0jZGVmaW5lIE1BWF9SQ1FfQkQJCQkoTlVNX1JDUV9CRCAtIDEpCi0jZGVmaW5lIE1BWF9SQ1FfQVZBSUwJCQkoTUFYX1JDUV9ERVNDX0NOVCAqIE5VTV9SQ1FfUklOR1MgLSAyKQorI2RlZmluZSBNQVhfUkNRX0RFU0NfQ05UCShSQ1FfREVTQ19DTlQgLSAxKQorI2RlZmluZSBOVU1fUkNRX0JECQkoUkNRX0RFU0NfQ05UICogTlVNX1JDUV9SSU5HUykKKyNkZWZpbmUgTUFYX1JDUV9CRAkJKE5VTV9SQ1FfQkQgLSAxKQorI2RlZmluZSBNQVhfUkNRX0FWQUlMCQkoTUFYX1JDUV9ERVNDX0NOVCAqIE5VTV9SQ1FfUklOR1MgLSAyKQogI2RlZmluZSBORVhUX1JDUV9JRFgoeCkJCSgoKCh4KSAmIE1BWF9SQ1FfREVTQ19DTlQpID09IFwKIAkJCQkgIChNQVhfUkNRX0RFU0NfQ05UIC0gMSkpID8gKHgpICsgMiA6ICh4KSArIDEpCi0jZGVmaW5lIFJDUV9CRCh4KQkJCSgoeCkgJiBNQVhfUkNRX0JEKQorI2RlZmluZSBSQ1FfQkQoeCkJCSgoeCkgJiBNQVhfUkNRX0JEKQogCiAKIC8qIFRoaXMgaXMgbmVlZGVkIGZvciBkZXRlcm1pbmluZyBvZiBsYXN0X21heCAqLwotI2RlZmluZSBTVUJfUzE2KGEsIGIpCQkJKHMxNikoKHMxNikoYSkgLSAoczE2KShiKSkKKyNkZWZpbmUgU1VCX1MxNihhLCBiKQkJKHMxNikoKHMxNikoYSkgLSAoczE2KShiKSkKKyNkZWZpbmUgU1VCX1MzMihhLCBiKQkJKHMzMikoKHMzMikoYSkgLSAoczMyKShiKSkKIAotI2RlZmluZSBfX1NHRV9NQVNLX1NFVF9CSVQoZWwsIGJpdCkgXAotCWRvIHsgXAotCQllbCA9ICgoZWwpIHwgKCh1NjQpMHgxIDw8IChiaXQpKSk7IFwKLQl9IHdoaWxlICgwKQogCi0jZGVmaW5lIF9fU0dFX01BU0tfQ0xFQVJfQklUKGVsLCBiaXQpIFwKLQlkbyB7IFwKLQkJZWwgPSAoKGVsKSAmICh+KCh1NjQpMHgxIDw8IChiaXQpKSkpOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTR0VfTUFTS19TRVRfQklUKGZwLCBpZHgpIFwKLQlfX1NHRV9NQVNLX1NFVF9CSVQoZnAtPnNnZV9tYXNrWyhpZHgpID4+IFJYX1NHRV9NQVNLX0VMRU1fU0hJRlRdLCBcCi0JCQkgICAoKGlkeCkgJiBSWF9TR0VfTUFTS19FTEVNX01BU0spKQotCi0jZGVmaW5lIFNHRV9NQVNLX0NMRUFSX0JJVChmcCwgaWR4KSBcCi0JX19TR0VfTUFTS19DTEVBUl9CSVQoZnAtPnNnZV9tYXNrWyhpZHgpID4+IFJYX1NHRV9NQVNLX0VMRU1fU0hJRlRdLCBcCi0JCQkgICAgICgoaWR4KSAmIFJYX1NHRV9NQVNLX0VMRU1fTUFTSykpCi0KKyNkZWZpbmUgQk5YMlhfU1dDSURfU0hJRlQJMTcKKyNkZWZpbmUgQk5YMlhfU1dDSURfTUFTSwkoKDB4MSA8PCBCTlgyWF9TV0NJRF9TSElGVCkgLSAxKQogCiAvKiB1c2VkIG9uIGEgQ0lEIHJlY2VpdmVkIGZyb20gdGhlIEhXICovCi0jZGVmaW5lIFNXX0NJRCh4KQkJCShsZTMyX3RvX2NwdSh4KSAmIFwKLQkJCQkJIChDT01NT05fUkFNUk9EX0VUSF9SWF9DUUVfQ0lEID4+IDcpKQorI2RlZmluZSBTV19DSUQoeCkJCQkobGUzMl90b19jcHUoeCkgJiBCTlgyWF9TV0NJRF9NQVNLKQogI2RlZmluZSBDUUVfQ01EKHgpCQkJKGxlMzJfdG9fY3B1KHgpID4+IFwKIAkJCQkJQ09NTU9OX1JBTVJPRF9FVEhfUlhfQ1FFX0NNRF9JRF9TSElGVCkKIApAQCAtNTI5LDYgKzYxNyw5IEBACiAKICNkZWZpbmUgQk5YMlhfREJfTUlOX1NISUZUCQkzCS8qIDggYnl0ZXMgKi8KICNkZWZpbmUgQk5YMlhfREJfU0hJRlQJCQk3CS8qIDEyOCBieXRlcyovCisjaWYgKEJOWDJYX0RCX1NISUZUIDwgQk5YMlhfREJfTUlOX1NISUZUKQorI2Vycm9yICJNaW4gREIgZG9vcmJlbGwgc3RyaWRlIGlzIDgiCisjZW5kaWYKICNkZWZpbmUgRFBNX1RSSUdFUl9UWVBFCQkJMHg0MAogI2RlZmluZSBET09SQkVMTChicCwgY2lkLCB2YWwpIFwKIAlkbyB7IFwKQEAgLTU1NywxMyArNjQ4LDExIEBACiAKIAogLyogc3R1ZmYgYWRkZWQgdG8gbWFrZSB0aGUgY29kZSBmaXQgODBDb2wgKi8KLQotI2RlZmluZSBDUUVfVFlQRShjcWVfZnBfZmxhZ3MpCSgoY3FlX2ZwX2ZsYWdzKSAmIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1RZUEUpCi0KLSNkZWZpbmUgVFBBX1RZUEVfU1RBUlQJCQlFVEhfRkFTVF9QQVRIX1JYX0NRRV9TVEFSVF9GTEcKLSNkZWZpbmUgVFBBX1RZUEVfRU5ECQkJRVRIX0ZBU1RfUEFUSF9SWF9DUUVfRU5EX0ZMRwotI2RlZmluZSBUUEFfVFlQRShjcWVfZnBfZmxhZ3MpCQkoKGNxZV9mcF9mbGFncykgJiBcCi0JCQkJCSAoVFBBX1RZUEVfU1RBUlQgfCBUUEFfVFlQRV9FTkQpKQorI2RlZmluZSBDUUVfVFlQRShjcWVfZnBfZmxhZ3MpCSAoKGNxZV9mcF9mbGFncykgJiBFVEhfRkFTVF9QQVRIX1JYX0NRRV9UWVBFKQorI2RlZmluZSBDUUVfVFlQRV9TVEFSVChjcWVfdHlwZSkgKChjcWVfdHlwZSkgPT0gUlhfRVRIX0NRRV9UWVBFX0VUSF9TVEFSVF9BR0cpCisjZGVmaW5lIENRRV9UWVBFX1NUT1AoY3FlX3R5cGUpICAoKGNxZV90eXBlKSA9PSBSWF9FVEhfQ1FFX1RZUEVfRVRIX1NUT1BfQUdHKQorI2RlZmluZSBDUUVfVFlQRV9TTE9XKGNxZV90eXBlKSAgKChjcWVfdHlwZSkgPT0gUlhfRVRIX0NRRV9UWVBFX0VUSF9SQU1ST0QpCisjZGVmaW5lIENRRV9UWVBFX0ZBU1QoY3FlX3R5cGUpICAoKGNxZV90eXBlKSA9PSBSWF9FVEhfQ1FFX1RZUEVfRVRIX0ZBU1RQQVRIKQogCiAjZGVmaW5lIEVUSF9SWF9FUlJPUl9GQUxHUwkJRVRIX0ZBU1RfUEFUSF9SWF9DUUVfUEhZX0RFQ09ERV9FUlJfRkxHCiAKQEAgLTU5MCwxNSArNjc5LDM4IEBACiAjZGVmaW5lIEJOWDJYX1JYX1NVTV9GSVgoY3FlKSBcCiAJQk5YMlhfUFJTX0ZMQUdfT1ZFUkVUSF9JUFY0KGNxZS0+ZmFzdF9wYXRoX2NxZS5wYXJzX2ZsYWdzLmZsYWdzKQogCi0jZGVmaW5lIFVfU0JfRVRIX1JYX0NRX0lOREVYCQkxCi0jZGVmaW5lIFVfU0JfRVRIX1JYX0JEX0lOREVYCQkyCi0jZGVmaW5lIENfU0JfRVRIX1RYX0NRX0lOREVYCQk1CisKKyNkZWZpbmUgRlBfVVNCX0ZVTkNfT0ZGCVwKKwkJCW9mZnNldG9mKHN0cnVjdCBjc3Rvcm1fc3RhdHVzX2Jsb2NrX3UsIGZ1bmMpCisjZGVmaW5lIEZQX0NTQl9GVU5DX09GRglcCisJCQlvZmZzZXRvZihzdHJ1Y3QgY3N0b3JtX3N0YXR1c19ibG9ja19jLCBmdW5jKQorCisjZGVmaW5lIEhDX0lOREVYX1RPRV9SWF9DUV9DT05TCQkwIC8qIEZvcm1lcmx5IFVzdG9ybSBUT0UgQ1EgaW5kZXggKi8KKwkJCQkJICAvKiAoSENfSU5ERVhfVV9UT0VfUlhfQ1FfQ09OUykgICovCisjZGVmaW5lIEhDX0lOREVYX0VUSF9SWF9DUV9DT05TCQkxIC8qIEZvcm1lcmx5IFVzdG9ybSBFVEggQ1EgaW5kZXggKi8KKwkJCQkJICAvKiAoSENfSU5ERVhfVV9FVEhfUlhfQ1FfQ09OUykgICovCisjZGVmaW5lIEhDX0lOREVYX0VUSF9SWF9CRF9DT05TCQkyIC8qIEZvcm1lcmx5IFVzdG9ybSBFVEggQkQgaW5kZXggKi8KKwkJCQkJICAvKiAoSENfSU5ERVhfVV9FVEhfUlhfQkRfQ09OUykgICovCisKKyNkZWZpbmUgSENfSU5ERVhfVE9FX1RYX0NRX0NPTlMJCTQgLyogRm9ybWVybHkgQ3N0b3JtIFRPRSBDUSBpbmRleCAgICovCisJCQkJCSAgLyogKEhDX0lOREVYX0NfVE9FX1RYX0NRX0NPTlMpICAgICovCisjZGVmaW5lIEhDX0lOREVYX0VUSF9UWF9DUV9DT05TX0NPUzAJNSAvKiBGb3JtZXJseSBDc3Rvcm0gRVRIIENRIGluZGV4ICAgKi8KKwkJCQkJICAvKiAoSENfSU5ERVhfQ19FVEhfVFhfQ1FfQ09OUykgICAgKi8KKyNkZWZpbmUgSENfSU5ERVhfRVRIX1RYX0NRX0NPTlNfQ09TMQk2IC8qIEZvcm1lcmx5IENzdG9ybSBFVEggQ1EgaW5kZXggICAqLworCQkJCQkgIC8qIChIQ19JTkRFWF9DX0VUSF9UWF9DUV9DT05TKSAgICAqLworI2RlZmluZSBIQ19JTkRFWF9FVEhfVFhfQ1FfQ09OU19DT1MyCTcgLyogRm9ybWVybHkgQ3N0b3JtIEVUSCBDUSBpbmRleCAgICovCisJCQkJCSAgLyogKEhDX0lOREVYX0NfRVRIX1RYX0NRX0NPTlMpICAgICovCisKKyNkZWZpbmUgSENfSU5ERVhfRVRIX0ZJUlNUX1RYX0NRX0NPTlMJSENfSU5ERVhfRVRIX1RYX0NRX0NPTlNfQ09TMAorCiAKICNkZWZpbmUgQk5YMlhfUlhfU0JfSU5ERVggXAotCSgmZnAtPnNiX2luZGV4X3ZhbHVlc1tVX1NCX0VUSF9SWF9DUV9JTkRFWF0pCisJKCZmcC0+c2JfaW5kZXhfdmFsdWVzW0hDX0lOREVYX0VUSF9SWF9DUV9DT05TXSkKIAotI2RlZmluZSBCTlgyWF9UWF9TQl9JTkRFWCBcCi0JKCZmcC0+c2JfaW5kZXhfdmFsdWVzW0NfU0JfRVRIX1RYX0NRX0lOREVYXSkKKyNkZWZpbmUgQk5YMlhfVFhfU0JfSU5ERVhfQkFTRSBCTlgyWF9UWF9TQl9JTkRFWF9DT1MwCisKKyNkZWZpbmUgQk5YMlhfVFhfU0JfSU5ERVhfQ09TMCBcCisJKCZmcC0+c2JfaW5kZXhfdmFsdWVzW0hDX0lOREVYX0VUSF9UWF9DUV9DT05TX0NPUzBdKQogCiAvKiBlbmQgb2YgZmFzdCBwYXRoICovCiAKQEAgLTYxNSw0MSArNzI3LDc0IEBACiAjZGVmaW5lIENISVBfTlVNXzU3NzExCQkJMHgxNjRmCiAjZGVmaW5lIENISVBfTlVNXzU3NzExRQkJCTB4MTY1MAogI2RlZmluZSBDSElQX05VTV81NzcxMgkJCTB4MTY2MgotI2RlZmluZSBDSElQX05VTV81NzcxMkUJCQkweDE2NjMKKyNkZWZpbmUgQ0hJUF9OVU1fNTc3MTJfTUYJCTB4MTY2MworI2RlZmluZSBDSElQX05VTV81NzcxMwkJCTB4MTY1MQorI2RlZmluZSBDSElQX05VTV81NzcxM0UJCQkweDE2NTIKKyNkZWZpbmUgQ0hJUF9OVU1fNTc4MDAJCQkweDE2OGEKKyNkZWZpbmUgQ0hJUF9OVU1fNTc4MDBfTUYJCTB4MTZhNQorI2RlZmluZSBDSElQX05VTV81NzgxMAkJCTB4MTY4ZQorI2RlZmluZSBDSElQX05VTV81NzgxMF9NRgkJMHgxNmFlCisjZGVmaW5lIENISVBfTlVNXzU3ODQwCQkJMHgxNjhkCisjZGVmaW5lIENISVBfTlVNXzU3ODQwX01GCQkweDE2YWIKICNkZWZpbmUgQ0hJUF9JU19FMShicCkJCQkoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3NzEwKQogI2RlZmluZSBDSElQX0lTXzU3NzExKGJwKQkJKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzcxMSkKICNkZWZpbmUgQ0hJUF9JU181NzcxMUUoYnApCQkoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3NzExRSkKICNkZWZpbmUgQ0hJUF9JU181NzcxMihicCkJCShDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTc3MTIpCi0jZGVmaW5lIENISVBfSVNfNTc3MTJFKGJwKQkJKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzcxMkUpCisjZGVmaW5lIENISVBfSVNfNTc3MTJfTUYoYnApCQkoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3NzEyX01GKQorI2RlZmluZSBDSElQX0lTXzU3ODAwKGJwKQkJKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzgwMCkKKyNkZWZpbmUgQ0hJUF9JU181NzgwMF9NRihicCkJCShDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTc4MDBfTUYpCisjZGVmaW5lIENISVBfSVNfNTc4MTAoYnApCQkoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3ODEwKQorI2RlZmluZSBDSElQX0lTXzU3ODEwX01GKGJwKQkJKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzgxMF9NRikKKyNkZWZpbmUgQ0hJUF9JU181Nzg0MChicCkJCShDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTc4NDApCisjZGVmaW5lIENISVBfSVNfNTc4NDBfTUYoYnApCQkoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3ODQwX01GKQogI2RlZmluZSBDSElQX0lTX0UxSChicCkJCQkoQ0hJUF9JU181NzcxMShicCkgfHwgXAogCQkJCQkgQ0hJUF9JU181NzcxMUUoYnApKQogI2RlZmluZSBDSElQX0lTX0UyKGJwKQkJCShDSElQX0lTXzU3NzEyKGJwKSB8fCBcCi0JCQkJCSBDSElQX0lTXzU3NzEyRShicCkpCisJCQkJCSBDSElQX0lTXzU3NzEyX01GKGJwKSkKKyNkZWZpbmUgQ0hJUF9JU19FMyhicCkJCQkoQ0hJUF9JU181NzgwMChicCkgfHwgXAorCQkJCQkgQ0hJUF9JU181NzgwMF9NRihicCkgfHwgXAorCQkJCQkgQ0hJUF9JU181NzgxMChicCkgfHwgXAorCQkJCQkgQ0hJUF9JU181NzgxMF9NRihicCkgfHwgXAorCQkJCQkgQ0hJUF9JU181Nzg0MChicCkgfHwgXAorCQkJCQkgQ0hJUF9JU181Nzg0MF9NRihicCkpCiAjZGVmaW5lIENISVBfSVNfRTF4KGJwKQkJCShDSElQX0lTX0UxKChicCkpIHx8IENISVBfSVNfRTFIKChicCkpKQotI2RlZmluZSBJU19FMUhfT0ZGU0VUCQkJKENISVBfSVNfRTFIKGJwKSB8fCBDSElQX0lTX0UyKGJwKSkKKyNkZWZpbmUgVVNFU19XQVJQQ09SRShicCkJCShDSElQX0lTX0UzKGJwKSkKKyNkZWZpbmUgSVNfRTFIX09GRlNFVAkJCSghQ0hJUF9JU19FMShicCkpCiAKLSNkZWZpbmUgQ0hJUF9SRVYoYnApCQkJKGJwLT5jb21tb24uY2hpcF9pZCAmIDB4MDAwMGYwMDApCi0jZGVmaW5lIENISVBfUkVWX0F4CQkJMHgwMDAwMDAwMAorI2RlZmluZSBDSElQX1JFVl9TSElGVAkJCTEyCisjZGVmaW5lIENISVBfUkVWX01BU0sJCQkoMHhGIDw8IENISVBfUkVWX1NISUZUKQorI2RlZmluZSBDSElQX1JFVl9WQUwoYnApCQkoYnAtPmNvbW1vbi5jaGlwX2lkICYgQ0hJUF9SRVZfTUFTSykKKyNkZWZpbmUgQ0hJUF9SRVZfQXgJCQkoMHgwIDw8IENISVBfUkVWX1NISUZUKQorI2RlZmluZSBDSElQX1JFVl9CeAkJCSgweDEgPDwgQ0hJUF9SRVZfU0hJRlQpCiAvKiBhc3N1bWUgbWF4aW11bSA1IHJldmlzaW9ucyAqLwotI2RlZmluZSBDSElQX1JFVl9JU19TTE9XKGJwKQkJKENISVBfUkVWKGJwKSA+IDB4MDAwMDUwMDApCisjZGVmaW5lIENISVBfUkVWX0lTX1NMT1coYnApCQkoQ0hJUF9SRVZfVkFMKGJwKSA+IDB4MDAwMDUwMDApCiAvKiBFbXVsIHZlcnNpb25zIGFyZSBBPT4weGUsIEI9PjB4YywgQz0+MHhhLCBEPT44LCBFPT42ICovCiAjZGVmaW5lIENISVBfUkVWX0lTX0VNVUwoYnApCQkoKENISVBfUkVWX0lTX1NMT1coYnApKSAmJiBcCi0JCQkJCSAhKENISVBfUkVWKGJwKSAmIDB4MDAwMDEwMDApKQorCQkJCQkgIShDSElQX1JFVl9WQUwoYnApICYgMHgwMDAwMTAwMCkpCiAvKiBGUEdBIHZlcnNpb25zIGFyZSBBPT4weGYsIEI9PjB4ZCwgQz0+MHhiLCBEPT45LCBFPT43ICovCiAjZGVmaW5lIENISVBfUkVWX0lTX0ZQR0EoYnApCQkoKENISVBfUkVWX0lTX1NMT1coYnApKSAmJiBcCi0JCQkJCSAoQ0hJUF9SRVYoYnApICYgMHgwMDAwMTAwMCkpCisJCQkJCSAoQ0hJUF9SRVZfVkFMKGJwKSAmIDB4MDAwMDEwMDApKQogCiAjZGVmaW5lIENISVBfVElNRShicCkJCQkoKENISVBfUkVWX0lTX0VNVUwoYnApKSA/IDIwMDAgOiBcCiAJCQkJCSgoQ0hJUF9SRVZfSVNfRlBHQShicCkpID8gMjAwIDogMSkpCiAKICNkZWZpbmUgQ0hJUF9NRVRBTChicCkJCQkoYnAtPmNvbW1vbi5jaGlwX2lkICYgMHgwMDAwMGZmMCkKICNkZWZpbmUgQ0hJUF9CT05EX0lEKGJwKQkJKGJwLT5jb21tb24uY2hpcF9pZCAmIDB4MDAwMDAwMGYpCi0jZGVmaW5lIENISVBfUEFSSVRZX0VOQUJMRUQoYnApCShDSElQX0lTX0UxKGJwKSB8fCBDSElQX0lTX0UxSChicCkpCisjZGVmaW5lIENISVBfUkVWX1NJTShicCkJCSgoKENISVBfUkVWX01BU0sgLSBDSElQX1JFVl9WQUwoYnApKSA+PlwKKwkJCQkJICAgKENISVBfUkVWX1NISUZUICsgMSkpIFwKKwkJCQkJCTw8IENISVBfUkVWX1NISUZUKQorI2RlZmluZSBDSElQX1JFVihicCkJCQkoQ0hJUF9SRVZfSVNfU0xPVyhicCkgPyBcCisJCQkJCQlDSElQX1JFVl9TSU0oYnApIDpcCisJCQkJCQlDSElQX1JFVl9WQUwoYnApKQorI2RlZmluZSBDSElQX0lTX0UzQjAoYnApCQkoQ0hJUF9JU19FMyhicCkgJiYgXAorCQkJCQkgKENISVBfUkVWKGJwKSA9PSBDSElQX1JFVl9CeCkpCisjZGVmaW5lIENISVBfSVNfRTNBMChicCkJCShDSElQX0lTX0UzKGJwKSAmJiBcCisJCQkJCSAoQ0hJUF9SRVYoYnApID09IENISVBfUkVWX0F4KSkKIAogCWludAkJCWZsYXNoX3NpemU7Ci0jZGVmaW5lIE5WUkFNXzFNQl9TSVpFCQkJMHgyMDAwMAkvKiAxTSBiaXQgaW4gYnl0ZXMgKi8KLSNkZWZpbmUgTlZSQU1fVElNRU9VVF9DT1VOVAkJMzAwMDAKLSNkZWZpbmUgTlZSQU1fUEFHRV9TSVpFCQkJMjU2CisjZGVmaW5lIEJOWDJYX05WUkFNXzFNQl9TSVpFCQkJMHgyMDAwMAkvKiAxTSBiaXQgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgQk5YMlhfTlZSQU1fVElNRU9VVF9DT1VOVAkJMzAwMDAKKyNkZWZpbmUgQk5YMlhfTlZSQU1fUEFHRV9TSVpFCQkJMjU2CiAKIAl1MzIJCQlzaG1lbV9iYXNlOwogCXUzMgkJCXNobWVtMl9iYXNlOwpAQCAtNjY2LDcgKzgxMSw3IEBACiAjZGVmaW5lIElOVF9CTE9DS19NT0RFX05PUk1BTAkJMAogI2RlZmluZSBJTlRfQkxPQ0tfTU9ERV9CV19DT01QCQkyCiAjZGVmaW5lIENISVBfSU5UX01PREVfSVNfTkJDKGJwKQkJXAotCQkJKENISVBfSVNfRTIoYnApICYmCVwKKwkJCSghQ0hJUF9JU19FMXgoYnApICYmCVwKIAkJCSEoKGJwKS0+Y29tbW9uLmludF9ibG9jayAmIElOVF9CTE9DS19NT0RFX0JXX0NPTVApKQogI2RlZmluZSBDSElQX0lOVF9NT0RFX0lTX0JDKGJwKSAoIUNISVBfSU5UX01PREVfSVNfTkJDKGJwKSkKIApAQCAtNzEyLDE5ICs4NTcsMTUgQEAKIAogLyogZW5kIG9mIHBvcnQgKi8KIAotLyogZTFoIENsYXNzaWZpY2F0aW9uIENBTSBsaW5lIGFsbG9jYXRpb25zICovCi1lbnVtIHsKLQlDQU1fRVRIX0xJTkUgPSAwLAotCUNBTV9JU0NTSV9FVEhfTElORSwKLQlDQU1fRklQX0VUSF9MSU5FLAotCUNBTV9GSVBfTUNBU1RfTElORSwKLQlDQU1fTUFYX1BGX0xJTkUgPSBDQU1fRklQX01DQVNUX0xJTkUKLX07Ci0vKiBudW1iZXIgb2YgTUFDcyBwZXIgZnVuY3Rpb24gaW4gTklHIG1lbW9yeSAtIHVzZWQgZm9yIFNJIG1vZGUgKi8KLSNkZWZpbmUgTklHX0xMSF9GVU5DX01FTV9TSVpFCQkxNgotLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gTklHX1JFR19MTEhYX0ZVTkNfTUVNICovCi0jZGVmaW5lIE5JR19MTEhfRlVOQ19NRU1fTUFYX09GRlNFVAk4CisjZGVmaW5lIFNUQVRTX09GRlNFVDMyKHN0YXRfbmFtZSkgXAorCQkJKG9mZnNldG9mKHN0cnVjdCBibngyeF9ldGhfc3RhdHMsIHN0YXRfbmFtZSkgLyA0KQogCisvKiBzbG93IHBhdGggKi8KKworLyogc2xvdyBwYXRoIHdvcmstcXVldWUgKi8KK2V4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYm54Mnhfd3E7CisKKyNkZWZpbmUgQk5YMlhfTUFYX05VTV9PRl9WRlMJNjQKICNkZWZpbmUgQk5YMlhfVkZfSURfSU5WQUxJRAkweEZGCiAKIC8qCkBAIC03NDksMjcgKzg5MCwxMCBAQAogICogICAgTDIgcXVldWUgaXMgc3VwcG9ydGVkLiB0aGUgY2lkIGZvciB0aGUgRkNvRSBMMiBxdWV1ZSBpcyBhbHdheXMgWC4KICAqLwogCi0jZGVmaW5lIEZQX1NCX01BWF9FMXgJCTE2CS8qIGZhc3QtcGF0aCBpbnRlcnJ1cHQgY29udGV4dHMgRTF4ICovCi0jZGVmaW5lIEZQX1NCX01BWF9FMgkJMTYJLyogZmFzdC1wYXRoIGludGVycnVwdCBjb250ZXh0cyBFMiAqLwotCi0vKgotICogY2lkX2NudCBwYXJhbXRlciBiZWxvdyByZWZlcnMgdG8gdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gKiAnYm54MnhfZ2V0X2wyX2NpZF9jb3VudCgpJyByb3V0aW5lCi0gKi8KLQotLyoKLSAqIFRoZSBudW1iZXIgb2YgRlAgY29udGV4dCBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlciA9PSBtYXggbnVtYmVyIG9mIHJlZ3VsYXIKLSAqIEwyIHF1ZXVlcyArIDEgZm9yIHRoZSBGQ29FIEwyIHF1ZXVlCi0gKi8KLSNkZWZpbmUgTDJfRlBfQ09VTlQoY2lkX2NudCkJKChjaWRfY250KSAtIENOSUNfQ09OVEVYVF9VU0UpCi0KLS8qCi0gKiBUaGUgbnVtYmVyIG9mIEZQLVNCIGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyID09IG1heCBudW1iZXIgb2YgcmVndWxhciBMMgotICogcXVldWVzICsgMSBmb3IgdGhlIENOSUMgd2hpY2ggYWxzbyBjb25zdW1lcyBhbiBGUC1TQgotICovCi0jZGVmaW5lIEZQX1NCX0NPVU5UKGNpZF9jbnQpCSgoY2lkX2NudCkgLSBGQ09FX0NPTlRFWFRfVVNFKQotI2RlZmluZSBOVU1fSUdVX1NCX1JFUVVJUkVEKGNpZF9jbnQpIFwKLQkJCQkoRlBfU0JfQ09VTlQoY2lkX2NudCkgLSBOT05FX0VUSF9DT05URVhUX1VTRSkKKy8qIGZhc3QtcGF0aCBpbnRlcnJ1cHQgY29udGV4dHMgRTF4ICovCisjZGVmaW5lIEZQX1NCX01BWF9FMXgJCTE2CisvKiBmYXN0LXBhdGggaW50ZXJydXB0IGNvbnRleHRzIEUyICovCisjZGVmaW5lIEZQX1NCX01BWF9FMgkJSENfU0JfTUFYX1NCX0UyCiAKIHVuaW9uIGNkdV9jb250ZXh0IHsKIAlzdHJ1Y3QgZXRoX2NvbnRleHQgZXRoOwpAQCAtNzc4LDcgKzkwMiw3IEBACiAKIC8qIENEVSBob3N0IERCIGNvbnN0YW50cyAqLwogI2RlZmluZSBDRFVfSUxUX1BBR0VfU1pfSFcJMwotI2RlZmluZSBDRFVfSUxUX1BBR0VfU1oJCSg0MDk2IDw8IENEVV9JTFRfUEFHRV9TWl9IVykgLyogMzJLICovCisjZGVmaW5lIENEVV9JTFRfUEFHRV9TWgkJKDgxOTIgPDwgQ0RVX0lMVF9QQUdFX1NaX0hXKSAvKiA2NEsgKi8KICNkZWZpbmUgSUxUX1BBR0VfQ0lEUwkJKENEVV9JTFRfUEFHRV9TWiAvIHNpemVvZih1bmlvbiBjZHVfY29udGV4dCkpCiAKICNpZmRlZiBCQ01fQ05JQwpAQCAtNzg4LDM4ICs5MTIsNjMgQEAKICNkZWZpbmUgQ05JQ19JTFRfTElORVMJCURJVl9ST1VORF9VUChDTklDX0NJRF9NQVgsIElMVF9QQUdFX0NJRFMpCiAjZW5kaWYKIAotI2RlZmluZSBRTV9JTFRfUEFHRV9TWl9IVwkzCi0jZGVmaW5lIFFNX0lMVF9QQUdFX1NaCQkoNDA5NiA8PCBRTV9JTFRfUEFHRV9TWl9IVykgLyogMzJLICovCisjZGVmaW5lIFFNX0lMVF9QQUdFX1NaX0hXCTAKKyNkZWZpbmUgUU1fSUxUX1BBR0VfU1oJCSg0MDk2IDw8IFFNX0lMVF9QQUdFX1NaX0hXKSAvKiA0SyAqLwogI2RlZmluZSBRTV9DSURfUk9VTkQJCTEwMjQKIAogI2lmZGVmIEJDTV9DTklDCiAvKiBUTSAodGltZXJzKSBob3N0IERCIGNvbnN0YW50cyAqLwotI2RlZmluZSBUTV9JTFRfUEFHRV9TWl9IVwkyCi0jZGVmaW5lIFRNX0lMVF9QQUdFX1NaCQkoNDA5NiA8PCBUTV9JTFRfUEFHRV9TWl9IVykgLyogMTZLICovCisjZGVmaW5lIFRNX0lMVF9QQUdFX1NaX0hXCTAKKyNkZWZpbmUgVE1fSUxUX1BBR0VfU1oJCSg0MDk2IDw8IFRNX0lMVF9QQUdFX1NaX0hXKSAvKiA0SyAqLwogLyogI2RlZmluZSBUTV9DT05OX05VTQkJKENOSUNfU1RBUlRJTkdfQ0lEK0NOSUNfSVNDU0lfQ1hUX01BWCkgKi8KICNkZWZpbmUgVE1fQ09OTl9OVU0JCTEwMjQKICNkZWZpbmUgVE1fSUxUX1NaCQkoOCAqIFRNX0NPTk5fTlVNKQogI2RlZmluZSBUTV9JTFRfTElORVMJCURJVl9ST1VORF9VUChUTV9JTFRfU1osIFRNX0lMVF9QQUdFX1NaKQogCiAvKiBTUkMgKFNlYXJjaGVyKSBob3N0IERCIGNvbnN0YW50cyAqLwotI2RlZmluZSBTUkNfSUxUX1BBR0VfU1pfSFcJMwotI2RlZmluZSBTUkNfSUxUX1BBR0VfU1oJCSg0MDk2IDw8IFNSQ19JTFRfUEFHRV9TWl9IVykgLyogMzJLICovCisjZGVmaW5lIFNSQ19JTFRfUEFHRV9TWl9IVwkwCisjZGVmaW5lIFNSQ19JTFRfUEFHRV9TWgkJKDQwOTYgPDwgU1JDX0lMVF9QQUdFX1NaX0hXKSAvKiA0SyAqLwogI2RlZmluZSBTUkNfSEFTSF9CSVRTCQkxMAogI2RlZmluZSBTUkNfQ09OTl9OVU0JCSgxIDw8IFNSQ19IQVNIX0JJVFMpIC8qIDEwMjQgKi8KICNkZWZpbmUgU1JDX0lMVF9TWgkJKHNpemVvZihzdHJ1Y3Qgc3JjX2VudCkgKiBTUkNfQ09OTl9OVU0pCiAjZGVmaW5lIFNSQ19UMl9TWgkJU1JDX0lMVF9TWgogI2RlZmluZSBTUkNfSUxUX0xJTkVTCQlESVZfUk9VTkRfVVAoU1JDX0lMVF9TWiwgU1JDX0lMVF9QQUdFX1NaKQorCiAjZW5kaWYKIAotI2RlZmluZSBNQVhfRE1BRV9DCQkJOAorI2RlZmluZSBNQVhfRE1BRV9DCQk4CiAKIC8qIERNQSBtZW1vcnkgbm90IHVzZWQgaW4gZmFzdHBhdGggKi8KIHN0cnVjdCBibngyeF9zbG93cGF0aCB7Ci0Jc3RydWN0IGV0aF9zdGF0c19xdWVyeQkJZndfc3RhdHM7Ci0Jc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2NtZAltYWNfY29uZmlnOwotCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQJbWNhc3RfY29uZmlnOwotCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQJdWNfbWFjX2NvbmZpZzsKLQlzdHJ1Y3QgY2xpZW50X2luaXRfcmFtcm9kX2RhdGEJY2xpZW50X2luaXRfZGF0YTsKKwl1bmlvbiB7CisJCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQJCWUxeDsKKwkJc3RydWN0IGV0aF9jbGFzc2lmeV9ydWxlc19yYW1yb2RfZGF0YQllMjsKKwl9IG1hY19yZGF0YTsKKworCisJdW5pb24geworCQlzdHJ1Y3QgdHN0b3JtX2V0aF9tYWNfZmlsdGVyX2NvbmZpZwllMXg7CisJCXN0cnVjdCBldGhfZmlsdGVyX3J1bGVzX3JhbXJvZF9kYXRhCWUyOworCX0gcnhfbW9kZV9yZGF0YTsKKworCXVuaW9uIHsKKwkJc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2NtZAkJZTE7CisJCXN0cnVjdCBldGhfbXVsdGljYXN0X3J1bGVzX3JhbXJvZF9kYXRhICBlMjsKKwl9IG1jYXN0X3JkYXRhOworCisJc3RydWN0IGV0aF9yc3NfdXBkYXRlX3JhbXJvZF9kYXRhCXJzc19yZGF0YTsKKworCS8qIFF1ZXVlIFN0YXRlIHJlbGF0ZWQgcmFtcm9kcyBhcmUgYWx3YXlzIHNlbnQgdW5kZXIgcnRubF9sb2NrICovCisJdW5pb24geworCQlzdHJ1Y3QgY2xpZW50X2luaXRfcmFtcm9kX2RhdGEgIGluaXRfZGF0YTsKKwkJc3RydWN0IGNsaWVudF91cGRhdGVfcmFtcm9kX2RhdGEgdXBkYXRlX2RhdGE7CisJfSBxX3JkYXRhOworCisJdW5pb24geworCQlzdHJ1Y3QgZnVuY3Rpb25fc3RhcnRfZGF0YQlmdW5jX3N0YXJ0OworCQkvKiBwZmMgY29uZmlndXJhdGlvbiBmb3IgRENCWCByYW1yb2QgKi8KKwkJc3RydWN0IGZsb3dfY29udHJvbF9jb25maWd1cmF0aW9uIHBmY19jb25maWc7CisJfSBmdW5jX3JkYXRhOwogCiAJLyogdXNlZCBieSBkbWFlIGNvbW1hbmQgZXhlY3V0ZXIgKi8KIAlzdHJ1Y3QgZG1hZV9jb21tYW5kCQlkbWFlW01BWF9ETUFFX0NdOwpAQCAtODMzLDggKzk4Miw2IEBACiAKIAl1MzIJCQkJd2JfY29tcDsKIAl1MzIJCQkJd2JfZGF0YVs0XTsKLQkvKiBwZmMgY29uZmlndXJhdGlvbiBmb3IgRENCWCByYW1yb2QgKi8KLQlzdHJ1Y3QgZmxvd19jb250cm9sX2NvbmZpZ3VyYXRpb24gcGZjX2NvbmZpZzsKIH07CiAKICNkZWZpbmUgYm54Mnhfc3AoYnAsIHZhcikJCSgmYnAtPnNsb3dwYXRoLT52YXIpCkBAIC04NDYsNyArOTkzLDcgQEAKICNkZWZpbmUgTUFYX0RZTkFNSUNfQVRUTl9HUlBTCQk4CiAKIHN0cnVjdCBhdHRuX3JvdXRlIHsKLQl1MzIJc2lnWzVdOworCXUzMiBzaWdbNV07CiB9OwogCiBzdHJ1Y3QgaXJvIHsKQEAgLTg2NiwxMyArMTAxMywxNSBAQAogLyogZm9yd2FyZCAqLwogc3RydWN0IGJueDJ4X2lsdDsKIAotdHlwZWRlZiBlbnVtIHsKKworZW51bSBibngyeF9yZWNvdmVyeV9zdGF0ZSB7CiAJQk5YMlhfUkVDT1ZFUllfRE9ORSwKIAlCTlgyWF9SRUNPVkVSWV9JTklULAogCUJOWDJYX1JFQ09WRVJZX1dBSVQsCi19IGJueDJ4X3JlY292ZXJ5X3N0YXRlX3Q7CisJQk5YMlhfUkVDT1ZFUllfRkFJTEVECit9OwogCi0vKioKKy8qCiAgKiBFdmVudCBxdWV1ZSAoRVEgb3IgZXZlbnQgcmluZykgTUMgaHNpCiAgKiBOVU1fRVFfUEFHRVMgYW5kIEVRX0RFU0NfQ05UX1BBR0UgbXVzdCBiZSBwb3dlciBvZiAyCiAgKi8KQEAgLTkxMCw2ICsxMDU5LDMxIEBACiAJQk5YMlhfTElOS19SRVBPUlRfVFhfRkNfT04sCiB9OwogCitlbnVtIHsKKwlCTlgyWF9QT1JUX1FVRVJZX0lEWCwKKwlCTlgyWF9QRl9RVUVSWV9JRFgsCisJQk5YMlhfRklSU1RfUVVFVUVfUVVFUllfSURYLAorfTsKKworc3RydWN0IGJueDJ4X2Z3X3N0YXRzX3JlcSB7CisJc3RydWN0IHN0YXRzX3F1ZXJ5X2hlYWRlciBoZHI7CisJc3RydWN0IHN0YXRzX3F1ZXJ5X2VudHJ5IHF1ZXJ5W1NUQVRTX1FVRVJZX0NNRF9DT1VOVF07Cit9OworCitzdHJ1Y3QgYm54MnhfZndfc3RhdHNfZGF0YSB7CisJc3RydWN0IHN0YXRzX2NvdW50ZXIJc3Rvcm1fY291bnRlcnM7CisJc3RydWN0IHBlcl9wb3J0X3N0YXRzCXBvcnQ7CisJc3RydWN0IHBlcl9wZl9zdGF0cwlwZjsKKwlzdHJ1Y3QgcGVyX3F1ZXVlX3N0YXRzICBxdWV1ZV9zdGF0c1sxXTsKK307CisKKy8qIFB1YmxpYyBzbG93IHBhdGggc3RhdGVzICovCitlbnVtIHsKKwlCTlgyWF9TUF9SVE5MX1NFVFVQX1RDLAorCUJOWDJYX1NQX1JUTkxfVFhfVElNRU9VVCwKK307CisKKwogc3RydWN0IGJueDJ4IHsKIAkvKiBGaWVsZHMgdXNlZCBpbiB0aGUgdHggYW5kIGludHIvbmFwaSBwZXJmb3JtYW5jZSBwYXRocwogCSAqIGFyZSBncm91cGVkIHRvZ2V0aGVyIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cnVjdHVyZQpAQCAtOTE5LDE5ICsxMDkzLDI4IEBACiAJdm9pZCBfX2lvbWVtCQkqZG9vcmJlbGxzOwogCXUxNgkJCWRiX3NpemU7CiAKKwl1OAkJCXBmX251bTsJLyogYWJzb2x1dGUgUEYgbnVtYmVyICovCisJdTgJCQlwZmlkOwkvKiBwZXItcGF0aCBQRiBudW1iZXIgKi8KKwlpbnQJCQliYXNlX2Z3X25kc2I7IC8qKi8KKyNkZWZpbmUgQlBfUEFUSChicCkJCQkoQ0hJUF9JU19FMXgoYnApID8gMCA6IChicC0+cGZfbnVtICYgMSkpCisjZGVmaW5lIEJQX1BPUlQoYnApCQkJKGJwLT5wZmlkICYgMSkKKyNkZWZpbmUgQlBfRlVOQyhicCkJCQkoYnAtPnBmaWQpCisjZGVmaW5lIEJQX0FCU19GVU5DKGJwKQkJCShicC0+cGZfbnVtKQorI2RlZmluZSBCUF9FMUhWTihicCkJCQkoYnAtPnBmaWQgPj4gMSkKKyNkZWZpbmUgQlBfVk4oYnApCQkJKEJQX0UxSFZOKGJwKSkgLypyZW1vdmUgd2hlbiBhcHByb3ZlZCovCisjZGVmaW5lIEJQX0xfSUQoYnApCQkJKEJQX0UxSFZOKGJwKSA8PCAyKQorI2RlZmluZSBCUF9GV19NQl9JRFgoYnApCQkoQlBfUE9SVChicCkgK1wKKwkgIEJQX1ZOKGJwKSAqICgoQ0hJUF9JU19FMXgoYnApIHx8IChDSElQX01PREVfSVNfNF9QT1JUKGJwKSkpID8gMiAgOiAxKSkKKwogCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CiAJc3RydWN0IHBjaV9kZXYJCSpwZGV2OwogCi0Jc3RydWN0IGlybwkJKmlyb19hcnI7CisJY29uc3Qgc3RydWN0IGlybwkqaXJvX2FycjsKICNkZWZpbmUgSVJPIChicC0+aXJvX2FycikKIAotCWF0b21pY190CQlpbnRyX3NlbTsKLQotCWJueDJ4X3JlY292ZXJ5X3N0YXRlX3QJcmVjb3Zlcnlfc3RhdGU7CisJZW51bSBibngyeF9yZWNvdmVyeV9zdGF0ZSByZWNvdmVyeV9zdGF0ZTsKIAlpbnQJCQlpc19sZWFkZXI7CiAJc3RydWN0IG1zaXhfZW50cnkJKm1zaXhfdGFibGU7Ci0jZGVmaW5lIElOVF9NT0RFX0lOVHgJCQkxCi0jZGVmaW5lIElOVF9NT0RFX01TSQkJCTIKIAogCWludAkJCXR4X3Jpbmdfc2l6ZTsKIApAQCAtOTQ0LDcgKzExMjcsOCBAQAogCS8qIE1heCBzdXBwb3J0ZWQgYWxpZ25tZW50IGlzIDI1NiAoOCBzaGlmdCkgKi8KICNkZWZpbmUgQk5YMlhfUlhfQUxJR05fU0hJRlQJCSgoTDFfQ0FDSEVfU0hJRlQgPCA4KSA/IFwKIAkJCQkJIEwxX0NBQ0hFX1NISUZUIDogOCkKLSNkZWZpbmUgQk5YMlhfUlhfQUxJR04JCQkoMSA8PCBCTlgyWF9SWF9BTElHTl9TSElGVCkKKwkvKiBGVyB1c2UgMiBDYWNoZSBsaW5lcyBBbGlnbm1lbnQgZm9yIHN0YXJ0IHBhY2tldCBhbmQgc2l6ZSAgKi8KKyNkZWZpbmUgQk5YMlhfRldfUlhfQUxJR04JCSgyIDw8IEJOWDJYX1JYX0FMSUdOX1NISUZUKQogI2RlZmluZSBCTlgyWF9QWFBfRFJBTV9BTElHTgkJKEJOWDJYX1JYX0FMSUdOX1NISUZUIC0gNSkKIAogCXN0cnVjdCBob3N0X3NwX3N0YXR1c19ibG9jayAqZGVmX3N0YXR1c19ibGs7CkBAIC05NzQsMTAgKzExNTgsMTIgQEAKIAlfX2xlMTYJCQkqZXFfY29uc19zYjsKIAlhdG9taWNfdAkJZXFfc3BxX2xlZnQ7IC8qIENPTU1PTl9YWFggcmFtcm9kcyBjcmVkaXQgKi8KIAotCS8qIEZsYWdzIGZvciBtYXJraW5nIHRoYXQgdGhlcmUgaXMgYSBTVEFUX1FVRVJZIG9yCi0JICAgU0VUX01BQyByYW1yb2QgcGVuZGluZyAqLwotCWludAkJCXN0YXRzX3BlbmRpbmc7Ci0JaW50CQkJc2V0X21hY19wZW5kaW5nOworCisKKwkvKiBDb3VudGVyIGZvciBtYXJraW5nIHRoYXQgdGhlcmUgaXMgYSBTVEFUX1FVRVJZIHJhbXJvZCBwZW5kaW5nICovCisJdTE2CQkJc3RhdHNfcGVuZGluZzsKKwkvKiAgQ291bnRlciBmb3IgY29tcGxldGVkIHN0YXRpc3RpY3MgcmFtcm9kcyAqLworCXUxNgkJCXN0YXRzX2NvbXA7CiAKIAkvKiBFbmQgb2YgZmllbGRzIHVzZWQgaW4gdGhlIHBlcmZvcm1hbmNlIGNvZGUgcGF0aHMgKi8KIApAQCAtOTg1LDU0ICsxMTcxLDM1IEBACiAJaW50CQkJbXNnX2VuYWJsZTsKIAogCXUzMgkJCWZsYWdzOwotI2RlZmluZSBQQ0lYX0ZMQUcJCQkxCi0jZGVmaW5lIFBDSV8zMkJJVF9GTEFHCQkJMgotI2RlZmluZSBPTkVfUE9SVF9GTEFHCQkJNAotI2RlZmluZSBOT19XT0xfRkxBRwkJCTgKLSNkZWZpbmUgVVNJTkdfREFDX0ZMQUcJCQkweDEwCi0jZGVmaW5lIFVTSU5HX01TSVhfRkxBRwkJCTB4MjAKLSNkZWZpbmUgVVNJTkdfTVNJX0ZMQUcJCQkweDQwCisjZGVmaW5lIFBDSVhfRkxBRwkJCSgxIDw8IDApCisjZGVmaW5lIFBDSV8zMkJJVF9GTEFHCQkJKDEgPDwgMSkKKyNkZWZpbmUgT05FX1BPUlRfRkxBRwkJCSgxIDw8IDIpCisjZGVmaW5lIE5PX1dPTF9GTEFHCQkJKDEgPDwgMykKKyNkZWZpbmUgVVNJTkdfREFDX0ZMQUcJCQkoMSA8PCA0KQorI2RlZmluZSBVU0lOR19NU0lYX0ZMQUcJCQkoMSA8PCA1KQorI2RlZmluZSBVU0lOR19NU0lfRkxBRwkJCSgxIDw8IDYpCisjZGVmaW5lIERJU0FCTEVfTVNJX0ZMQUcJCSgxIDw8IDcpCisjZGVmaW5lIFRQQV9FTkFCTEVfRkxBRwkJCSgxIDw8IDgpCisjZGVmaW5lIE5PX01DUF9GTEFHCQkJKDEgPDwgOSkKIAotI2RlZmluZSBUUEFfRU5BQkxFX0ZMQUcJCQkweDgwCi0jZGVmaW5lIE5PX01DUF9GTEFHCQkJMHgxMDAKLSNkZWZpbmUgRElTQUJMRV9NU0lfRkxBRwkJMHgyMDAKICNkZWZpbmUgQlBfTk9NQ1AoYnApCQkJKGJwLT5mbGFncyAmIE5PX01DUF9GTEFHKQotI2RlZmluZSBNRl9GVU5DX0RJUwkJCTB4MTAwMAotI2RlZmluZSBGQ09FX01BQ1NfU0VUCQkJMHgyMDAwCi0jZGVmaW5lIE5PX0ZDT0VfRkxBRwkJCTB4NDAwMAotI2RlZmluZSBOT19JU0NTSV9PT09fRkxBRwkJMHg4MDAwCi0jZGVmaW5lIE5PX0lTQ1NJX0ZMQUcJCQkweDEwMDAwCisjZGVmaW5lIE1GX0ZVTkNfRElTCQkJKDEgPDwgMTEpCisjZGVmaW5lIE9XTl9DTklDX0lSUQkJCSgxIDw8IDEyKQorI2RlZmluZSBOT19JU0NTSV9PT09fRkxBRwkJKDEgPDwgMTMpCisjZGVmaW5lIE5PX0lTQ1NJX0ZMQUcJCQkoMSA8PCAxNCkKKyNkZWZpbmUgTk9fRkNPRV9GTEFHCQkJKDEgPDwgMTUpCiAKLSNkZWZpbmUgTk9fRkNPRShicCkJCSgoYnApLT5mbGFncyAmIE5PX0ZDT0VfRkxBRykKICNkZWZpbmUgTk9fSVNDU0koYnApCQkoKGJwKS0+ZmxhZ3MgJiBOT19JU0NTSV9GTEFHKQogI2RlZmluZSBOT19JU0NTSV9PT08oYnApCSgoYnApLT5mbGFncyAmIE5PX0lTQ1NJX09PT19GTEFHKQotCi0JaW50CQkJcGZfbnVtOwkvKiBhYnNvbHV0ZSBQRiBudW1iZXIgKi8KLQlpbnQJCQlwZmlkOwkvKiBwZXItcGF0aCBQRiBudW1iZXIgKi8KLQlpbnQJCQliYXNlX2Z3X25kc2I7Ci0jZGVmaW5lIEJQX1BBVEgoYnApCQkJKCFDSElQX0lTX0UyKGJwKSA/IFwKLQkJCQkJCTAgOiAoYnAtPnBmX251bSAmIDEpKQotI2RlZmluZSBCUF9QT1JUKGJwKQkJCShicC0+cGZpZCAmIDEpCi0jZGVmaW5lIEJQX0ZVTkMoYnApCQkJKGJwLT5wZmlkKQotI2RlZmluZSBCUF9BQlNfRlVOQyhicCkJCQkoYnAtPnBmX251bSkKLSNkZWZpbmUgQlBfRTFIVk4oYnApCQkJKGJwLT5wZmlkID4+IDEpCi0jZGVmaW5lIEJQX1ZOKGJwKQkJCShDSElQX01PREVfSVNfNF9QT1JUKGJwKSA/IFwKLQkJCQkJCTAgOiBCUF9FMUhWTihicCkpCi0jZGVmaW5lIEJQX0xfSUQoYnApCQkJKEJQX0UxSFZOKGJwKSA8PCAyKQotI2RlZmluZSBCUF9GV19NQl9JRFgoYnApCQkoQlBfUE9SVChicCkgK1wKLQkJCQkJIEJQX1ZOKGJwKSAqIChDSElQX0lTX0UxeChicCkgPyAyICA6IDEpKQotCi0jaWZkZWYgQkNNX0NOSUMKLSNkZWZpbmUgQkNNX0NOSUNfQ0lEX1NUQVJUCQkxNgotI2RlZmluZSBCQ01fSVNDU0lfRVRIX0NMX0lECQkxNwotI2VuZGlmCisjZGVmaW5lIE5PX0ZDT0UoYnApCQkoKGJwKS0+ZmxhZ3MgJiBOT19GQ09FX0ZMQUcpCiAKIAlpbnQJCQlwbV9jYXA7Ci0JaW50CQkJcGNpZV9jYXA7CiAJaW50CQkJbXJyczsKIAogCXN0cnVjdCBkZWxheWVkX3dvcmsJc3BfdGFzazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrCXJlc2V0X3Rhc2s7CisJc3RydWN0IGRlbGF5ZWRfd29yawlzcF9ydG5sX3Rhc2s7CisKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCXBlcmlvZF90YXNrOwogCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwogCWludAkJCWN1cnJlbnRfaW50ZXJ2YWw7CiAKQEAgLTEwNTIsOSArMTIxOSw5IEBACiAKIAlzdHJ1Y3QgY21uZ19zdHJ1Y3RfcGVyX3BvcnQgY21uZzsKIAl1MzIJCQl2bl93ZWlnaHRfc3VtOwotCiAJdTMyCQkJbWZfY29uZmlnW0UxSFZOX01BWF07CiAJdTMyCQkJbWYyX2NvbmZpZ1tFMl9GVU5DX01BWF07CisJdTMyCQkJcGF0aF9oYXNfb3ZsYW47IC8qIEUzICovCiAJdTE2CQkJbWZfb3Y7CiAJdTgJCQltZl9tb2RlOwogI2RlZmluZSBJU19NRihicCkJCShicC0+bWZfbW9kZSAhPSAwKQpAQCAtMTA3OSwzMyArMTI0NiwyNCBAQAogCiAJdTMyCQkJbGluX2NudDsKIAotCWludAkJCXN0YXRlOworCXUxNgkJCXN0YXRlOwogI2RlZmluZSBCTlgyWF9TVEFURV9DTE9TRUQJCTAKICNkZWZpbmUgQk5YMlhfU1RBVEVfT1BFTklOR19XQUlUNF9MT0FECTB4MTAwMAogI2RlZmluZSBCTlgyWF9TVEFURV9PUEVOSU5HX1dBSVQ0X1BPUlQJMHgyMDAwCiAjZGVmaW5lIEJOWDJYX1NUQVRFX09QRU4JCTB4MzAwMAogI2RlZmluZSBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0X0hBTFQJMHg0MDAwCiAjZGVmaW5lIEJOWDJYX1NUQVRFX0NMT1NJTkdfV0FJVDRfREVMRVRFIDB4NTAwMAotI2RlZmluZSBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0X1VOTE9BRCAweDYwMDAKLSNkZWZpbmUgQk5YMlhfU1RBVEVfRlVOQ19TVEFSVEVECTB4NzAwMAorCiAjZGVmaW5lIEJOWDJYX1NUQVRFX0RJQUcJCTB4ZTAwMAogI2RlZmluZSBCTlgyWF9TVEFURV9FUlJPUgkJMHhmMDAwCiAKIAlpbnQJCQltdWx0aV9tb2RlOworI2RlZmluZSBCTlgyWF9NQVhfUFJJT1JJVFkJCTgKKyNkZWZpbmUgQk5YMlhfTUFYX0VOVFJJRVNfUEVSX1BSSQkxNgorI2RlZmluZSBCTlgyWF9NQVhfQ09TCQkJMworI2RlZmluZSBCTlgyWF9NQVhfVFhfQ09TCQkyCiAJaW50CQkJbnVtX3F1ZXVlczsKIAlpbnQJCQlkaXNhYmxlX3RwYTsKLQlpbnQJCQlpbnRfbW9kZTsKLQl1MzIJCQkqcnhfaW5kaXJfdGFibGU7Ci0KLQlzdHJ1Y3QgdHN0b3JtX2V0aF9tYWNfZmlsdGVyX2NvbmZpZwltYWNfZmlsdGVyczsKLSNkZWZpbmUgQk5YMlhfQUNDRVBUX05PTkUJCTB4MDAwMAotI2RlZmluZSBCTlgyWF9BQ0NFUFRfVU5JQ0FTVAkJMHgwMDAxCi0jZGVmaW5lIEJOWDJYX0FDQ0VQVF9NVUxUSUNBU1QJCTB4MDAwMgotI2RlZmluZSBCTlgyWF9BQ0NFUFRfQUxMX1VOSUNBU1QJMHgwMDA0Ci0jZGVmaW5lIEJOWDJYX0FDQ0VQVF9BTExfTVVMVElDQVNUCTB4MDAwOAotI2RlZmluZSBCTlgyWF9BQ0NFUFRfQlJPQURDQVNUCQkweDAwMTAKLSNkZWZpbmUgQk5YMlhfQUNDRVBUX1VOTUFUQ0hFRF9VQ0FTVAkweDAwMjAKLSNkZWZpbmUgQk5YMlhfUFJPTUlTQ1VPVVNfTU9ERQkJMHgxMDAwMAogCiAJdTMyCQkJcnhfbW9kZTsKICNkZWZpbmUgQk5YMlhfUlhfTU9ERV9OT05FCQkwCkBAIC0xMTEzLDcgKzEyNzEsNiBAQAogI2RlZmluZSBCTlgyWF9SWF9NT0RFX0FMTE1VTFRJCQkyCiAjZGVmaW5lIEJOWDJYX1JYX01PREVfUFJPTUlTQwkJMwogI2RlZmluZSBCTlgyWF9NQVhfTVVMVElDQVNUCQk2NAotI2RlZmluZSBCTlgyWF9NQVhfRU1VTF9NVUxUSQkJMTYKIAogCXU4CQkJaWd1X2RzYl9pZDsKIAl1OAkJCWlndV9iYXNlX3NiOwpAQCAtMTEyMiwxNiArMTI3OSw1MyBAQAogCiAJc3RydWN0IGJueDJ4X3Nsb3dwYXRoCSpzbG93cGF0aDsKIAlkbWFfYWRkcl90CQlzbG93cGF0aF9tYXBwaW5nOworCisJLyogVG90YWwgbnVtYmVyIG9mIEZXIHN0YXRpc3RpY3MgcmVxdWVzdHMgKi8KKwl1OAkJCWZ3X3N0YXRzX251bTsKKworCS8qCisJICogVGhpcyBpcyBhIG1lbW9yeSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gYm90aCBzdGF0aXN0aWNzCisJICogcmFtcm9kIHJlcXVlc3QgYW5kIGRhdGEuCisJICovCisJdm9pZAkJCSpmd19zdGF0czsKKwlkbWFfYWRkcl90CQlmd19zdGF0c19tYXBwaW5nOworCisJLyoKKwkgKiBGVyBzdGF0aXN0aWNzIHJlcXVlc3Qgc2hvcnRjdXQgKHBvaW50cyBhdCB0aGUKKwkgKiBiZWdpbm5pbmcgb2YgZndfc3RhdHMgYnVmZmVyKS4KKwkgKi8KKwlzdHJ1Y3QgYm54MnhfZndfc3RhdHNfcmVxCSpmd19zdGF0c19yZXE7CisJZG1hX2FkZHJfdAkJCWZ3X3N0YXRzX3JlcV9tYXBwaW5nOworCWludAkJCQlmd19zdGF0c19yZXFfc3o7CisKKwkvKgorCSAqIEZXIHN0YXRpc3RpY3MgZGF0YSBzaG9ydGN1dCAocG9pbnRzIGF0IHRoZSBiZWdpbmluZyBvZgorCSAqIGZ3X3N0YXRzIGJ1ZmZlciArIGZ3X3N0YXRzX3JlcV9zeikuCisJICovCisJc3RydWN0IGJueDJ4X2Z3X3N0YXRzX2RhdGEJKmZ3X3N0YXRzX2RhdGE7CisJZG1hX2FkZHJfdAkJCWZ3X3N0YXRzX2RhdGFfbWFwcGluZzsKKwlpbnQJCQkJZndfc3RhdHNfZGF0YV9zejsKKwogCXN0cnVjdCBod19jb250ZXh0CWNvbnRleHQ7CiAKIAlzdHJ1Y3QgYm54MnhfaWx0CSppbHQ7CiAjZGVmaW5lIEJQX0lMVChicCkJCSgoYnApLT5pbHQpCi0jZGVmaW5lIElMVF9NQVhfTElORVMJCTEyOAorI2RlZmluZSBJTFRfTUFYX0xJTkVTCQkyNTYKKy8qCisgKiBNYXhpbXVtIHN1cHBvcnRlZCBudW1iZXIgb2YgUlNTIHF1ZXVlczogbnVtYmVyIG9mIElHVSBTQnMgbWludXMgb25lIHRoYXQgZ29lcworICogdG8gQ05JQy4KKyAqLworI2RlZmluZSBCTlgyWF9NQVhfUlNTX0NPVU5UKGJwKQkoKGJwKS0+aWd1X3NiX2NudCAtIENOSUNfUFJFU0VOVCkKIAotCWludAkJCWwyX2NpZF9jb3VudDsKLSNkZWZpbmUgTDJfSUxUX0xJTkVTKGJwKQkoRElWX1JPVU5EX1VQKChicCktPmwyX2NpZF9jb3VudCwgXAotCQkJCSBJTFRfUEFHRV9DSURTKSkKLSNkZWZpbmUgQk5YMlhfREJfU0laRShicCkJKChicCktPmwyX2NpZF9jb3VudCAqICgxIDw8IEJOWDJYX0RCX1NISUZUKSkKKy8qCisgKiBNYXhpbXVtIENJRCBjb3VudCB0aGF0IG1pZ2h0IGJlIHJlcXVpcmVkIGJ5IHRoZSBibngyeDoKKyAqIE1heCBUc3MgKiBNYXhfVHhfTXVsdGlfQ29zICsgQ05JQyBMMiBDbGllbnRzIChGQ29FIGFuZCBpU0NTSSByZWxhdGVkKQorICovCisjZGVmaW5lIEJOWDJYX0wyX0NJRF9DT1VOVChicCkJKE1BWF9UWFFTX1BFUl9DT1MgKiBCTlgyWF9NVUxUSV9UWF9DT1MgK1wKKwkJCQkJTk9OX0VUSF9DT05URVhUX1VTRSArIENOSUNfUFJFU0VOVCkKKyNkZWZpbmUgTDJfSUxUX0xJTkVTKGJwKQkoRElWX1JPVU5EX1VQKEJOWDJYX0wyX0NJRF9DT1VOVChicCksXAorCQkJCQlJTFRfUEFHRV9DSURTKSkKKyNkZWZpbmUgQk5YMlhfREJfU0laRShicCkJKEJOWDJYX0wyX0NJRF9DT1VOVChicCkgKiAoMSA8PCBCTlgyWF9EQl9TSElGVCkpCiAKIAlpbnQJCQlxbV9jaWRfY291bnQ7CiAKQEAgLTExNDgsMTYgKzEzNDIsMTggQEAKIAlzdHJ1Y3QgY25pY19ldGhfZGV2CWNuaWNfZXRoX2RldjsKIAl1bmlvbiBob3N0X2hjX3N0YXR1c19ibG9jayBjbmljX3NiOwogCWRtYV9hZGRyX3QJCWNuaWNfc2JfbWFwcGluZzsKLSNkZWZpbmUgQ05JQ19TQl9JRChicCkJCSgoYnApLT5iYXNlX2Z3X25kc2IgKyBCUF9MX0lEKGJwKSkKLSNkZWZpbmUgQ05JQ19JR1VfU0JfSUQoYnApCSgoYnApLT5pZ3VfYmFzZV9zYikKIAlzdHJ1Y3QgZXRoX3NwZQkJKmNuaWNfa3dxOwogCXN0cnVjdCBldGhfc3BlCQkqY25pY19rd3FfcHJvZDsKIAlzdHJ1Y3QgZXRoX3NwZQkJKmNuaWNfa3dxX2NvbnM7CiAJc3RydWN0IGV0aF9zcGUJCSpjbmljX2t3cV9sYXN0OwogCXUxNgkJCWNuaWNfa3dxX3BlbmRpbmc7CiAJdTE2CQkJY25pY19zcHFfcGVuZGluZzsKLQlzdHJ1Y3QgbXV0ZXgJCWNuaWNfbXV0ZXg7CiAJdTgJCQlmaXBfbWFjW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgbXV0ZXgJCWNuaWNfbXV0ZXg7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiBpc2NzaV9sMl9tYWNfb2JqOworCisJLyogU3RhcnQgaW5kZXggb2YgdGhlICJzcGVjaWFsIiAoQ05JQyByZWxhdGVkKSBMMiBjbGVpbnRzICovCisJdTgJCQkJY25pY19iYXNlX2NsX2lkOwogI2VuZGlmCiAKIAlpbnQJCQlkbWFlX3JlYWR5OwpAQCAtMTE5NCw2ICsxMzkwLDggQEAKIAl1MTYJCQkqaW5pdF9vcHNfb2Zmc2V0czsKIAkvKiBEYXRhIGJsb2IgLSBoYXMgMzIgYml0IGdyYW51bGFyaXR5ICovCiAJdTMyCQkJKmluaXRfZGF0YTsKKwl1MzIJCQlpbml0X21vZGVfZmxhZ3M7CisjZGVmaW5lIElOSVRfTU9ERV9GTEFHUyhicCkJKGJwLT5pbml0X21vZGVfZmxhZ3MpCiAJLyogWmlwcGVkIFBSQU0gYmxvYnMgLSByYXcgZGF0YSAqLwogCWNvbnN0IHU4CQkqdHNlbV9pbnRfdGFibGVfZGF0YTsKIAljb25zdCB1OAkJKnRzZW1fcHJhbV9kYXRhOwpAQCAtMTIxNSwxMCArMTQxMyw5IEBACiAjZGVmaW5lIElOSVRfQ1NFTV9JTlRfVEFCTEVfREFUQShicCkJKGJwLT5jc2VtX2ludF90YWJsZV9kYXRhKQogI2RlZmluZSBJTklUX0NTRU1fUFJBTV9EQVRBKGJwKQkJKGJwLT5jc2VtX3ByYW1fZGF0YSkKIAorI2RlZmluZSBQSFlfRldfVkVSX0xFTgkJCTIwCiAJY2hhcgkJCWZ3X3ZlclszMl07CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlCSpmaXJtd2FyZTsKLQkvKiBMTERQIHBhcmFtcyAqLwotCXN0cnVjdCBibngyeF9jb25maWdfbGxkcF9wYXJhbXMJCWxsZHBfY29uZmlnX3BhcmFtczsKIAogCS8qIERDQiBzdXBwb3J0IG9uL29mZiAqLwogCXUxNiBkY2Jfc3RhdGU7CkBAIC0xMjM1LDU5ICsxNDMyLDU2IEBACiAJYm9vbCBkY2J4X21vZGVfdXNldDsKIAogCXN0cnVjdCBibngyeF9jb25maWdfZGNieF9wYXJhbXMJCWRjYnhfY29uZmlnX3BhcmFtczsKLQogCXN0cnVjdCBibngyeF9kY2J4X3BvcnRfcGFyYW1zCQlkY2J4X3BvcnRfcGFyYW1zOwogCWludAkJCQkJZGNiX3ZlcnNpb247CiAKLQkvKiBEQ0JYIE5lZ290aWF0aW9uIHJlc3VsdHMgKi8KKwkvKiBDQU0gY3JlZGl0IHBvb2xzICovCisJc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iagkJbWFjc19wb29sOworCisJLyogUlhfTU9ERSBvYmplY3QgKi8KKwlzdHJ1Y3QgYm54MnhfcnhfbW9kZV9vYmoJCXJ4X21vZGVfb2JqOworCisJLyogTUNBU1Qgb2JqZWN0ICovCisJc3RydWN0IGJueDJ4X21jYXN0X29iagkJCW1jYXN0X29iajsKKworCS8qIFJTUyBjb25maWd1cmF0aW9uIG9iamVjdCAqLworCXN0cnVjdCBibngyeF9yc3NfY29uZmlnX29iagkJcnNzX2NvbmZfb2JqOworCisJLyogRnVuY3Rpb24gU3RhdGUgY29udHJvbGxpbmcgb2JqZWN0ICovCisJc3RydWN0IGJueDJ4X2Z1bmNfc3Bfb2JqCQlmdW5jX29iajsKKworCXVuc2lnbmVkIGxvbmcJCQkJc3Bfc3RhdGU7CisKKwkvKiBvcGVyYXRpb24gaW5kaWNhdGlvbiBmb3IgdGhlIHNwX3J0bmwgdGFzayAqLworCXVuc2lnbmVkIGxvbmcJCQkJc3BfcnRubF9zdGF0ZTsKKworCS8qIERDQlggTmVnb3RhdGlvbiByZXN1bHRzICovCiAJc3RydWN0IGRjYnhfZmVhdHVyZXMJCQlkY2J4X2xvY2FsX2ZlYXQ7CiAJdTMyCQkJCQlkY2J4X2Vycm9yOworCiAjaWZkZWYgQkNNX0RDQk5MCiAJc3RydWN0IGRjYnhfZmVhdHVyZXMJCQlkY2J4X3JlbW90ZV9mZWF0OwogCXUzMgkJCQkJZGNieF9yZW1vdGVfZmxhZ3M7CiAjZW5kaWYKIAl1MzIJCQkJCXBlbmRpbmdfbWF4OworCisJLyogbXVsdGlwbGUgdHggY2xhc3NlcyBvZiBzZXJ2aWNlICovCisJdTgJCQkJCW1heF9jb3M7CisKKwkvKiBwcmlvcml0eSB0byBjb3MgbWFwcGluZyAqLworCXU4CQkJCQlwcmlvX3RvX2Nvc1s4XTsKIH07CiAKLS8qKgotICoJSW5pdCBxdWV1ZS9mdW5jIGludGVyZmFjZQotICovCi0vKiBxdWV1ZSBpbml0IGZsYWdzICovCi0jZGVmaW5lIFFVRVVFX0ZMR19UUEEJCTB4MDAwMQotI2RlZmluZSBRVUVVRV9GTEdfQ0FDSEVfQUxJR04JMHgwMDAyCi0jZGVmaW5lIFFVRVVFX0ZMR19TVEFUUwkJMHgwMDA0Ci0jZGVmaW5lIFFVRVVFX0ZMR19PVgkJMHgwMDA4Ci0jZGVmaW5lIFFVRVVFX0ZMR19WTEFOCQkweDAwMTAKLSNkZWZpbmUgUVVFVUVfRkxHX0NPUwkJMHgwMDIwCi0jZGVmaW5lIFFVRVVFX0ZMR19IQwkJMHgwMDQwCi0jZGVmaW5lIFFVRVVFX0ZMR19ESEMJCTB4MDA4MAotI2RlZmluZSBRVUVVRV9GTEdfT09PCQkweDAxMDAKLQotI2RlZmluZSBRVUVVRV9EUk9QX0lQX0NTX0VSUglUU1RPUk1fRVRIX0NMSUVOVF9DT05GSUdfRFJPUF9JUF9DU19FUlIKLSNkZWZpbmUgUVVFVUVfRFJPUF9UQ1BfQ1NfRVJSCVRTVE9STV9FVEhfQ0xJRU5UX0NPTkZJR19EUk9QX1RDUF9DU19FUlIKLSNkZWZpbmUgUVVFVUVfRFJPUF9UVEwwCQlUU1RPUk1fRVRIX0NMSUVOVF9DT05GSUdfRFJPUF9UVEwwCi0jZGVmaW5lIFFVRVVFX0RST1BfVURQX0NTX0VSUglUU1RPUk1fRVRIX0NMSUVOVF9DT05GSUdfRFJPUF9VRFBfQ1NfRVJSCi0KLQotCi0vKiByc3MgY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIFJTU19JUFY0X0NBUAkJMHgwMDAxCi0jZGVmaW5lIFJTU19JUFY0X1RDUF9DQVAJMHgwMDAyCi0jZGVmaW5lIFJTU19JUFY2X0NBUAkJMHgwMDA0Ci0jZGVmaW5lIFJTU19JUFY2X1RDUF9DQVAJMHgwMDA4Ci0KKy8qIFR4IHF1ZXVlcyBtYXkgYmUgbGVzcyBvciBlcXVhbCB0byBSeCBxdWV1ZXMgKi8KK2V4dGVybiBpbnQgbnVtX3F1ZXVlczsKICNkZWZpbmUgQk5YMlhfTlVNX1FVRVVFUyhicCkJKGJwLT5udW1fcXVldWVzKQotI2RlZmluZSBCTlgyWF9OVU1fRVRIX1FVRVVFUyhicCkgKEJOWDJYX05VTV9RVUVVRVMoYnApIC0gTk9ORV9FVEhfQ09OVEVYVF9VU0UpCi0KLS8qIGV0aHRvb2wgc3RhdGlzdGljcyBhcmUgZGlzcGxheWVkIGZvciBhbGwgcmVndWxhciBldGhlcm5ldCBxdWV1ZXMgYW5kIHRoZQotICogZmNvZSBMMiBxdWV1ZSBpZiBub3QgZGlzYWJsZWQKLSAqLwotI2RlZmluZSBCTlgyWF9OVU1fU1RBVF9RVUVVRVMoYnApIChOT19GQ09FKGJwKSA/IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKSA6IFwKLQkJCSAgIChCTlgyWF9OVU1fRVRIX1FVRVVFUyhicCkgKyBGQ09FX0NPTlRFWFRfVVNFKSkKKyNkZWZpbmUgQk5YMlhfTlVNX0VUSF9RVUVVRVMoYnApIChCTlgyWF9OVU1fUVVFVUVTKGJwKSAtIE5PTl9FVEhfQ09OVEVYVF9VU0UpCisjZGVmaW5lIEJOWDJYX05VTV9SWF9RVUVVRVMoYnApCUJOWDJYX05VTV9RVUVVRVMoYnApCiAKICNkZWZpbmUgaXNfbXVsdGkoYnApCQkoQk5YMlhfTlVNX1FVRVVFUyhicCkgPiAxKQogCi0jZGVmaW5lIEJOWDJYX01BWF9RVUVVRVMoYnApCShicC0+aWd1X3NiX2NudCAtIENOSUNfQ09OVEVYVF9VU0UpCisjZGVmaW5lIEJOWDJYX01BWF9RVUVVRVMoYnApCUJOWDJYX01BWF9SU1NfQ09VTlQoYnApCisvKiAjZGVmaW5lIGlzX2V0aF9tdWx0aShicCkJKEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKSA+IDEpICovCiAKICNkZWZpbmUgUlNTX0lQVjRfQ0FQX01BU0sJCQkJCQlcCiAJVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY0X0NBUEFCSUxJVFkKQEAgLTEzMDIsMTA3ICsxNDk2LDE1IEBACiAJVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY2X1RDUF9DQVBBQklMSVRZCiAKIC8qIGZ1bmMgaW5pdCBmbGFncyAqLwotI2RlZmluZSBGVU5DX0ZMR19TVEFUUwkJMHgwMDAxCi0jZGVmaW5lIEZVTkNfRkxHX1RQQQkJMHgwMDAyCi0jZGVmaW5lIEZVTkNfRkxHX1NQUQkJMHgwMDA0Ci0jZGVmaW5lIEZVTkNfRkxHX0xFQURJTkcJMHgwMDA4CS8qIFBGIG9ubHkgKi8KKyNkZWZpbmUgRlVOQ19GTEdfUlNTCQkweDAwMDEKKyNkZWZpbmUgRlVOQ19GTEdfU1RBVFMJCTB4MDAwMgorLyogcmVtb3ZlZCAgRlVOQ19GTEdfVU5NQVRDSEVECTB4MDAwNCAqLworI2RlZmluZSBGVU5DX0ZMR19UUEEJCTB4MDAwOAorI2RlZmluZSBGVU5DX0ZMR19TUFEJCTB4MDAxMAorI2RlZmluZSBGVU5DX0ZMR19MRUFESU5HCTB4MDAyMAkvKiBQRiBvbmx5ICovCiAKLXN0cnVjdCByeHFfcGF1c2VfcGFyYW1zIHsKLQl1MTYJCWJkX3RoX2xvOwotCXUxNgkJYmRfdGhfaGk7Ci0JdTE2CQlyY3FfdGhfbG87Ci0JdTE2CQlyY3FfdGhfaGk7Ci0JdTE2CQlzZ2VfdGhfbG87IC8qIHZhbGlkIGlmZiBRVUVVRV9GTEdfVFBBICovCi0JdTE2CQlzZ2VfdGhfaGk7IC8qIHZhbGlkIGlmZiBRVUVVRV9GTEdfVFBBICovCi0JdTE2CQlwcmlfbWFwOwotfTsKLQotc3RydWN0IGJueDJ4X3J4cV9pbml0X3BhcmFtcyB7Ci0JLyogY3h0Ki8KLQlzdHJ1Y3QgZXRoX2NvbnRleHQgKmN4dDsKLQotCS8qIGRtYSAqLwotCWRtYV9hZGRyX3QJZHNjcl9tYXA7Ci0JZG1hX2FkZHJfdAlzZ2VfbWFwOwotCWRtYV9hZGRyX3QJcmNxX21hcDsKLQlkbWFfYWRkcl90CXJjcV9ucF9tYXA7Ci0KLQl1MTYJCWZsYWdzOwotCXUxNgkJZHJvcF9mbGFnczsKLQl1MTYJCW10dTsKLQl1MTYJCWJ1Zl9zejsKLQl1MTYJCWZ3X3NiX2lkOwotCXUxNgkJY2xfaWQ7Ci0JdTE2CQlzcGNsX2lkOwotCXUxNgkJY2xfcXpvbmVfaWQ7Ci0KLQkvKiB2YWxpZCBpZmYgUVVFVUVfRkxHX1NUQVRTICovCi0JdTE2CQlzdGF0X2lkOwotCi0JLyogdmFsaWQgaWZmIFFVRVVFX0ZMR19UUEEgKi8KLQl1MTYJCXRwYV9hZ2dfc3o7Ci0JdTE2CQlzZ2VfYnVmX3N6OwotCXUxNgkJbWF4X3NnZXNfcGt0OwotCi0JLyogdmFsaWQgaWZmIFFVRVVFX0ZMR19DQUNIRV9BTElHTiAqLwotCXU4CQljYWNoZV9saW5lX2xvZzsKLQotCXU4CQlzYl9jcV9pbmRleDsKLQl1MzIJCWNpZDsKLQotCS8qIGRlc2lyZWQgaW50ZXJydXB0cyBwZXIgc2VjLiB2YWxpZCBpZmYgUVVFVUVfRkxHX0hDICovCi0JdTMyCQloY19yYXRlOwotfTsKLQotc3RydWN0IGJueDJ4X3R4cV9pbml0X3BhcmFtcyB7Ci0JLyogY3h0Ki8KLQlzdHJ1Y3QgZXRoX2NvbnRleHQgKmN4dDsKLQotCS8qIGRtYSAqLwotCWRtYV9hZGRyX3QJZHNjcl9tYXA7Ci0KLQl1MTYJCWZsYWdzOwotCXUxNgkJZndfc2JfaWQ7Ci0JdTgJCXNiX2NxX2luZGV4OwotCXU4CQljb3M7CQkvKiB2YWxpZCBpZmYgUVVFVUVfRkxHX0NPUyAqLwotCXUxNgkJc3RhdF9pZDsJLyogdmFsaWQgaWZmIFFVRVVFX0ZMR19TVEFUUyAqLwotCXUxNgkJdHJhZmZpY190eXBlOwotCXUzMgkJY2lkOwotCXUxNgkJaGNfcmF0ZTsJLyogZGVzaXJlZCBpbnRlcnJ1cHRzIHBlciBzZWMuKi8KLQkJCQkJLyogdmFsaWQgaWZmIFFVRVVFX0ZMR19IQyAqLwotCi19OwotCi1zdHJ1Y3QgYm54MnhfY2xpZW50X3JhbXJvZF9wYXJhbXMgewotCWludCAqcHN0YXRlOwotCWludCBzdGF0ZTsKLQl1MTYgaW5kZXg7Ci0JdTE2IGNsX2lkOwotCXUzMiBjaWQ7Ci0JdTggcG9sbDsKLSNkZWZpbmUgQ0xJRU5UX0lTX0ZDT0UJCQkweDAxCi0jZGVmaW5lIENMSUVOVF9JU19MRUFESU5HX1JTUwkJMHgwMgotCXU4IGZsYWdzOwotfTsKLQotc3RydWN0IGJueDJ4X2NsaWVudF9pbml0X3BhcmFtcyB7Ci0Jc3RydWN0IHJ4cV9wYXVzZV9wYXJhbXMgcGF1c2U7Ci0Jc3RydWN0IGJueDJ4X3J4cV9pbml0X3BhcmFtcyByeHFfcGFyYW1zOwotCXN0cnVjdCBibngyeF90eHFfaW5pdF9wYXJhbXMgdHhxX3BhcmFtczsKLQlzdHJ1Y3QgYm54MnhfY2xpZW50X3JhbXJvZF9wYXJhbXMgcmFtcm9kX3BhcmFtczsKLX07Ci0KLXN0cnVjdCBibngyeF9yc3NfcGFyYW1zIHsKLQlpbnQJbW9kZTsKLQl1MTYJY2FwOwotCXUxNglyZXN1bHRfbWFzazsKLX07CiAKIHN0cnVjdCBibngyeF9mdW5jX2luaXRfcGFyYW1zIHsKLQotCS8qIHJzcyAqLwotCXN0cnVjdCBibngyeF9yc3NfcGFyYW1zICpyc3M7CS8qIHZhbGlkIGlmZiBGVU5DX0ZMR19SU1MgKi8KLQogCS8qIGRtYSAqLwogCWRtYV9hZGRyX3QJZndfc3RhdF9tYXA7CS8qIHZhbGlkIGlmZiBGVU5DX0ZMR19TVEFUUyAqLwogCWRtYV9hZGRyX3QJc3BxX21hcDsJLyogdmFsaWQgaWZmIEZVTkNfRkxHX1NQUSAqLwpAQCAtMTQxNCw0MiArMTUxNiw0MCBAQAogfTsKIAogI2RlZmluZSBmb3JfZWFjaF9ldGhfcXVldWUoYnAsIHZhcikgXAotCQkJZm9yICh2YXIgPSAwOyB2YXIgPCBCTlgyWF9OVU1fRVRIX1FVRVVFUyhicCk7IHZhcisrKQorCWZvciAoKHZhcikgPSAwOyAodmFyKSA8IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKTsgKHZhcikrKykKIAogI2RlZmluZSBmb3JfZWFjaF9ub25kZWZhdWx0X2V0aF9xdWV1ZShicCwgdmFyKSBcCi0JCQlmb3IgKHZhciA9IDE7IHZhciA8IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKTsgdmFyKyspCi0KLSNkZWZpbmUgZm9yX2VhY2hfbmFwaV9xdWV1ZShicCwgdmFyKSBcCi0JZm9yICh2YXIgPSAwOyBcCi0JCXZhciA8IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKSArIEZDT0VfQ09OVEVYVF9VU0U7IHZhcisrKSBcCi0JCWlmIChza2lwX3F1ZXVlKGJwLCB2YXIpKQlcCi0JCQljb250aW51ZTsJCVwKLQkJZWxzZQorCWZvciAoKHZhcikgPSAxOyAodmFyKSA8IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKTsgKHZhcikrKykKIAogI2RlZmluZSBmb3JfZWFjaF9xdWV1ZShicCwgdmFyKSBcCi0JZm9yICh2YXIgPSAwOyB2YXIgPCBCTlgyWF9OVU1fUVVFVUVTKGJwKTsgdmFyKyspIFwKKwlmb3IgKCh2YXIpID0gMDsgKHZhcikgPCBCTlgyWF9OVU1fUVVFVUVTKGJwKTsgKHZhcikrKykgXAogCQlpZiAoc2tpcF9xdWV1ZShicCwgdmFyKSkJXAogCQkJY29udGludWU7CQlcCiAJCWVsc2UKIAorLyogU2tpcCBmb3J3YXJkaW5nIEZQICovCiAjZGVmaW5lIGZvcl9lYWNoX3J4X3F1ZXVlKGJwLCB2YXIpIFwKLQlmb3IgKHZhciA9IDA7IHZhciA8IEJOWDJYX05VTV9RVUVVRVMoYnApOyB2YXIrKykgXAorCWZvciAoKHZhcikgPSAwOyAodmFyKSA8IEJOWDJYX05VTV9RVUVVRVMoYnApOyAodmFyKSsrKSBcCiAJCWlmIChza2lwX3J4X3F1ZXVlKGJwLCB2YXIpKQlcCiAJCQljb250aW51ZTsJCVwKIAkJZWxzZQogCisvKiBTa2lwIE9PTyBGUCAqLwogI2RlZmluZSBmb3JfZWFjaF90eF9xdWV1ZShicCwgdmFyKSBcCi0JZm9yICh2YXIgPSAwOyB2YXIgPCBCTlgyWF9OVU1fUVVFVUVTKGJwKTsgdmFyKyspIFwKKwlmb3IgKCh2YXIpID0gMDsgKHZhcikgPCBCTlgyWF9OVU1fUVVFVUVTKGJwKTsgKHZhcikrKykgXAogCQlpZiAoc2tpcF90eF9xdWV1ZShicCwgdmFyKSkJXAogCQkJY29udGludWU7CQlcCiAJCWVsc2UKIAogI2RlZmluZSBmb3JfZWFjaF9ub25kZWZhdWx0X3F1ZXVlKGJwLCB2YXIpIFwKLQlmb3IgKHZhciA9IDE7IHZhciA8IEJOWDJYX05VTV9RVUVVRVMoYnApOyB2YXIrKykgXAorCWZvciAoKHZhcikgPSAxOyAodmFyKSA8IEJOWDJYX05VTV9RVUVVRVMoYnApOyAodmFyKSsrKSBcCiAJCWlmIChza2lwX3F1ZXVlKGJwLCB2YXIpKQlcCiAJCQljb250aW51ZTsJCVwKIAkJZWxzZQogCisjZGVmaW5lIGZvcl9lYWNoX2Nvc19pbl90eF9xdWV1ZShmcCwgdmFyKSBcCisJZm9yICgodmFyKSA9IDA7ICh2YXIpIDwgKGZwKS0+bWF4X2NvczsgKHZhcikrKykKKwogLyogc2tpcCByeCBxdWV1ZQogICogaWYgRkNPRSBsMiBzdXBwb3J0IGlzIGRpc2FibGVkIGFuZCB0aGlzIGlzIHRoZSBmY29lIEwyIHF1ZXVlCiAgKi8KQEAgLTE0NjIsMTEgKzE1NjIsNjYgQEAKIAogI2RlZmluZSBza2lwX3F1ZXVlKGJwLCBpZHgpCShOT19GQ09FKGJwKSAmJiBJU19GQ09FX0lEWChpZHgpKQogCi0jZGVmaW5lIFdBSVRfUkFNUk9EX1BPTEwJMHgwMQotI2RlZmluZSBXQUlUX1JBTVJPRF9DT01NT04JMHgwMgogCisKKworLyoqCisgKiBibngyeF9zZXRfbWFjX29uZSAtIGNvbmZpZ3VyZSBhIHNpbmdsZSBNQUMgYWRkcmVzcworICoKKyAqIEBicDoJCQlkcml2ZXIgaGFuZGxlCisgKiBAbWFjOgkJTUFDIHRvIGNvbmZpZ3VyZQorICogQG9iajoJCU1BQyBvYmplY3QgaGFuZGxlCisgKiBAc2V0OgkJaWYgJ3RydWUnIGFkZCBhIG5ldyBNQUMsIG90aGVyd2lzZSAtIGRlbGV0ZQorICogQG1hY190eXBlOgkJdGhlIHR5cGUgb2YgdGhlIE1BQyB0byBjb25maWd1cmUgKGUuZy4gRVRILCBVQyBsaXN0KQorICogQHJhbXJvZF9mbGFnczoJUkFNUk9EX1hYWCBmbGFncyAoZS5nLiBSQU1ST0RfQ09OVCwgUkFNUk9EX0NPTVBfV0FJVCkKKyAqCisgKiBDb25maWd1cmVzIG9uZSBNQUMgYWNjb3JkaW5nIHRvIHByb3ZpZGVkIHBhcmFtZXRlcnMgb3IgY29udGludWVzIHRoZQorICogZXhlY3V0aW9uIG9mIHByZXZpb3VzbHkgc2NoZWR1bGVkIGNvbW1hbmRzIGlmIFJBTVJPRF9DT05UIGlzIHNldCBpbgorICogcmFtcm9kX2ZsYWdzLgorICoKKyAqIFJldHVybnMgemVybyBpZiBvcGVyYXRpb24gaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQsIGEgcG9zaXRpdmUgdmFsdWUgaWYgdGhlCisgKiBvcGVyYXRpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNjaGVkdWxlZCBhbmQgYSBuZWdhdGl2ZSAtIGlmIGEgcmVxdWVzdGVkCisgKiBvcGVyYXRpb25zIGhhcyBmYWlsZWQuCisgKi8KK2ludCBibngyeF9zZXRfbWFjX29uZShzdHJ1Y3QgYm54MnggKmJwLCB1OCAqbWFjLAorCQkgICAgICBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvYmosIGJvb2wgc2V0LAorCQkgICAgICBpbnQgbWFjX3R5cGUsIHVuc2lnbmVkIGxvbmcgKnJhbXJvZF9mbGFncyk7CisvKioKKyAqIERlbGV0ZXMgYWxsIE1BQ3MgY29uZmlndXJlZCBmb3IgdGhlIHNwZWNpZmljIE1BQyBvYmplY3QuCisgKgorICogQHBhcmFtIGJwIEZ1bmN0aW9uIGRyaXZlciBpbnN0YW5jZQorICogQHBhcmFtIG1hY19vYmogTUFDIG9iamVjdCB0byBjbGVhbnVwCisgKgorICogQHJldHVybiB6ZXJvIGlmIGFsbCBNQUNzIHdlcmUgY2xlYW5lZAorICovCisKKy8qKgorICogYm54MnhfZGVsX2FsbF9tYWNzIC0gZGVsZXRlIGFsbCBNQUNzIGNvbmZpZ3VyZWQgZm9yIHRoZSBzcGVjaWZpYyBNQUMgb2JqZWN0CisgKgorICogQGJwOgkJCWRyaXZlciBoYW5kbGUKKyAqIEBtYWNfb2JqOgkJTUFDIG9iamVjdCBoYW5kbGUKKyAqIEBtYWNfdHlwZToJCXR5cGUgb2YgdGhlIE1BQ3MgdG8gY2xlYXIgKEJOWDJYX1hYWF9NQUMpCisgKiBAd2FpdF9mb3JfY29tcDoJaWYgJ3RydWUnIGJsb2NrIHVudGlsIGNvbXBsZXRpb24KKyAqCisgKiBEZWxldGVzIGFsbCBNQUNzIG9mIHRoZSBzcGVjaWZpYyB0eXBlIChlLmcuIEVUSCwgVUMgbGlzdCkuCisgKgorICogUmV0dXJucyB6ZXJvIGlmIG9wZXJhdGlvbiBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCwgYSBwb3NpdGl2ZSB2YWx1ZSBpZiB0aGUKKyAqIG9wZXJhdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2NoZWR1bGVkIGFuZCBhIG5lZ2F0aXZlIC0gaWYgYSByZXF1ZXN0ZWQKKyAqIG9wZXJhdGlvbnMgaGFzIGZhaWxlZC4KKyAqLworaW50IGJueDJ4X2RlbF9hbGxfbWFjcyhzdHJ1Y3QgYm54MnggKmJwLAorCQkgICAgICAgc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbWFjX29iaiwKKwkJICAgICAgIGludCBtYWNfdHlwZSwgYm9vbCB3YWl0X2Zvcl9jb21wKTsKKworLyogSW5pdCBGdW5jdGlvbiBBUEkgICovCit2b2lkIGJueDJ4X2Z1bmNfaW5pdChzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54MnhfZnVuY19pbml0X3BhcmFtcyAqcCk7CitpbnQgYm54MnhfZ2V0X2dwaW8oc3RydWN0IGJueDJ4ICpicCwgaW50IGdwaW9fbnVtLCB1OCBwb3J0KTsKK2ludCBibngyeF9zZXRfZ3BpbyhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZ3Bpb19udW0sIHUzMiBtb2RlLCB1OCBwb3J0KTsKK2ludCBibngyeF9zZXRfbXVsdF9ncGlvKHN0cnVjdCBibngyeCAqYnAsIHU4IHBpbnMsIHUzMiBtb2RlKTsKK2ludCBibngyeF9zZXRfZ3Bpb19pbnQoc3RydWN0IGJueDJ4ICpicCwgaW50IGdwaW9fbnVtLCB1MzIgbW9kZSwgdTggcG9ydCk7CiB2b2lkIGJueDJ4X3JlYWRfbWZfY2ZnKHN0cnVjdCBibngyeCAqYnApOwogCisKIC8qIGRtYWUgKi8KIHZvaWQgYm54MnhfcmVhZF9kbWFlKHN0cnVjdCBibngyeCAqYnAsIHUzMiBzcmNfYWRkciwgdTMyIGxlbjMyKTsKIHZvaWQgYm54Mnhfd3JpdGVfZG1hZShzdHJ1Y3QgYm54MnggKmJwLCBkbWFfYWRkcl90IGRtYV9hZGRyLCB1MzIgZHN0X2FkZHIsCkBAIC0xNDc3LDIyICsxNjMyLDEyIEBACiB1MzIgYm54MnhfZG1hZV9vcGNvZGUoc3RydWN0IGJueDJ4ICpicCwgdTggc3JjX3R5cGUsIHU4IGRzdF90eXBlLAogCQkgICAgICBib29sIHdpdGhfY29tcCwgdTggY29tcF90eXBlKTsKIAotaW50IGJueDJ4X2dldF9ncGlvKHN0cnVjdCBibngyeCAqYnAsIGludCBncGlvX251bSwgdTggcG9ydCk7Ci1pbnQgYm54Mnhfc2V0X2dwaW8oc3RydWN0IGJueDJ4ICpicCwgaW50IGdwaW9fbnVtLCB1MzIgbW9kZSwgdTggcG9ydCk7Ci1pbnQgYm54Mnhfc2V0X2dwaW9faW50KHN0cnVjdCBibngyeCAqYnAsIGludCBncGlvX251bSwgdTMyIG1vZGUsIHU4IHBvcnQpOwotdTMyIGJueDJ4X2Z3X2NvbW1hbmQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGNvbW1hbmQsIHUzMiBwYXJhbSk7CiAKIHZvaWQgYm54MnhfY2FsY19mY19hZHYoc3RydWN0IGJueDJ4ICpicCk7CiBpbnQgYm54Mnhfc3BfcG9zdChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY29tbWFuZCwgaW50IGNpZCwKLQkJICB1MzIgZGF0YV9oaSwgdTMyIGRhdGFfbG8sIGludCBjb21tb24pOwotCi0vKiBDbGVhcnMgbXVsdGljYXN0IGFuZCB1bmljYXN0IGxpc3QgY29uZmlndXJhdGlvbiBpbiB0aGUgY2hpcC4gKi8KLXZvaWQgYm54MnhfaW52YWxpZGF0ZV9lMV9tY19saXN0KHN0cnVjdCBibngyeCAqYnApOwotdm9pZCBibngyeF9pbnZhbGlkYXRlX2UxaF9tY19saXN0KHN0cnVjdCBibngyeCAqYnApOwotdm9pZCBibngyeF9pbnZhbGlkYXRlX3VjX2xpc3Qoc3RydWN0IGJueDJ4ICpicCk7Ci0KKwkJICB1MzIgZGF0YV9oaSwgdTMyIGRhdGFfbG8sIGludCBjbWRfdHlwZSk7CiB2b2lkIGJueDJ4X3VwZGF0ZV9jb2FsZXNjZShzdHJ1Y3QgYm54MnggKmJwKTsKLWludCBibngyeF9nZXRfbGlua19jZmdfaWR4KHN0cnVjdCBibngyeCAqYnApOworaW50IGJueDJ4X2dldF9jdXJfcGh5X2lkeChzdHJ1Y3QgYm54MnggKmJwKTsKIAogc3RhdGljIGlubGluZSB1MzIgcmVnX3BvbGwoc3RydWN0IGJueDJ4ICpicCwgdTMyIHJlZywgdTMyIGV4cGVjdGVkLCBpbnQgbXMsCiAJCQkgICBpbnQgd2FpdCkKQEAgLTE2NDgsNyArMTc5Myw4IEBACiAKIC8qIG11c3QgYmUgdXNlZCBvbiBhIENJRCBiZWZvcmUgcGxhY2luZyBpdCBvbiBhIEhXIHJpbmcgKi8KICNkZWZpbmUgSFdfQ0lEKGJwLCB4KQkJCSgoQlBfUE9SVChicCkgPDwgMjMpIHwgXAotCQkJCQkgKEJQX0UxSFZOKGJwKSA8PCAxNykgfCAoeCkpCisJCQkJCSAoQlBfRTFIVk4oYnApIDw8IEJOWDJYX1NXQ0lEX1NISUZUKSB8IFwKKwkJCQkJICh4KSkKIAogI2RlZmluZSBTUF9ERVNDX0NOVAkJKEJDTV9QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGV0aF9zcGUpKQogI2RlZmluZSBNQVhfU1BfREVTQ19DTlQJCQkoU1BfREVTQ19DTlQgLSAxKQpAQCAtMTcxOCwxMiArMTg2NCwxNCBAQAogCQkJCShBRVVfSU5QVVRTX0FUVE5fQklUU19UU0RNX0hXX0lOVEVSUlVQVCB8IFwKIAkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVENNX0hXX0lOVEVSUlVQVCB8IFwKIAkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNFTUlfSFdfSU5URVJSVVBUIHwgXAotCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19QQkZfSFdfSU5URVJSVVBUKQorCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19QQkNMSUVOVF9IV19JTlRFUlJVUFQpCiAjZGVmaW5lIEhXX1BSVFlfQVNTRVJUX1NFVF8wCShBRVVfSU5QVVRTX0FUVE5fQklUU19CUkJfUEFSSVRZX0VSUk9SIHwgXAogCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19QQVJTRVJfUEFSSVRZX0VSUk9SIHwgXAogCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19UU0RNX1BBUklUWV9FUlJPUiB8IFwKIAkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfU0VBUkNIRVJfUEFSSVRZX0VSUk9SIHxcCi0JCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RTRU1JX1BBUklUWV9FUlJPUikKKwkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNFTUlfUEFSSVRZX0VSUk9SIHxcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RDTV9QQVJJVFlfRVJST1IgfFwKKwkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfUEJDTElFTlRfUEFSSVRZX0VSUk9SKQogI2RlZmluZSBIV19JTlRFUlJVVF9BU1NFUlRfU0VUXzEgXAogCQkJCShBRVVfSU5QVVRTX0FUVE5fQklUU19RTV9IV19JTlRFUlJVUFQgfCBcCiAJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RJTUVSU19IV19JTlRFUlJVUFQgfCBcCkBAIC0xNzM2LDE3ICsxODg0LDIyIEBACiAJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VQQl9IV19JTlRFUlJVUFQgfCBcCiAJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRE1fSFdfSU5URVJSVVBUIHwgXAogCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19DQ01fSFdfSU5URVJSVVBUKQotI2RlZmluZSBIV19QUlRZX0FTU0VSVF9TRVRfMQkoQUVVX0lOUFVUU19BVFROX0JJVFNfUEJDTElFTlRfUEFSSVRZX0VSUk9SIHxcCisjZGVmaW5lIEhXX1BSVFlfQVNTRVJUX1NFVF8xCShBRVVfSU5QVVRTX0FUVE5fQklUU19QQkZfUEFSSVRZX0VSUk9SIHxcCiAJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1FNX1BBUklUWV9FUlJPUiB8IFwKKwkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVElNRVJTX1BBUklUWV9FUlJPUiB8XAogCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19YU0RNX1BBUklUWV9FUlJPUiB8IFwKKwkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfWENNX1BBUklUWV9FUlJPUiB8XAogCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19YU0VNSV9QQVJJVFlfRVJST1IgfCBcCiAJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0RPT1JCRUxMUV9QQVJJVFlfRVJST1IgfFwKKwkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfTklHX1BBUklUWV9FUlJPUiB8XAogCQkJICAgICBBRVVfSU5QVVRTX0FUVE5fQklUU19WQVVYX1BDSV9DT1JFX1BBUklUWV9FUlJPUiB8XAogCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19ERUJVR19QQVJJVFlfRVJST1IgfCBcCiAJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VTRE1fUEFSSVRZX0VSUk9SIHwgXAorCQkJCSBBRVVfSU5QVVRTX0FUVE5fQklUU19VQ01fUEFSSVRZX0VSUk9SIHxcCiAJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VTRU1JX1BBUklUWV9FUlJPUiB8IFwKIAkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfVVBCX1BBUklUWV9FUlJPUiB8IFwKLQkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfQ1NETV9QQVJJVFlfRVJST1IpCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRE1fUEFSSVRZX0VSUk9SIHxcCisJCQkJIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NDTV9QQVJJVFlfRVJST1IpCiAjZGVmaW5lIEhXX0lOVEVSUlVUX0FTU0VSVF9TRVRfMiBcCiAJCQkJKEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRU1JX0hXX0lOVEVSUlVQVCB8IFwKIAkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0RVX0hXX0lOVEVSUlVQVCB8IFwKQEAgLTE3NTgsNiArMTkxMSw3IEBACiAJCQlBRVVfSU5QVVRTX0FUVE5fQklUU19QWFBQQ0lDTE9DS0NMSUVOVF9QQVJJVFlfRVJST1IgfFwKIAkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0ZDX1BBUklUWV9FUlJPUiB8IFwKIAkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0RVX1BBUklUWV9FUlJPUiB8IFwKKwkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfRE1BRV9QQVJJVFlfRVJST1IgfFwKIAkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfSUdVX1BBUklUWV9FUlJPUiB8IFwKIAkJCQkgQUVVX0lOUFVUU19BVFROX0JJVFNfTUlTQ19QQVJJVFlfRVJST1IpCiAKQEAgLTE3NjYsNiArMTkyMCw5IEBACiAJCUFFVV9JTlBVVFNfQVRUTl9CSVRTX01DUF9MQVRDSEVEX1VNUF9UWF9QQVJJVFkgfCBcCiAJCUFFVV9JTlBVVFNfQVRUTl9CSVRTX01DUF9MQVRDSEVEX1NDUEFEX1BBUklUWSkKIAorI2RlZmluZSBIV19QUlRZX0FTU0VSVF9TRVRfNCAoQUVVX0lOUFVUU19BVFROX0JJVFNfUEdMVUVfUEFSSVRZX0VSUk9SIHwgXAorCQkJICAgICAgQUVVX0lOUFVUU19BVFROX0JJVFNfQVRDX1BBUklUWV9FUlJPUikKKwogI2RlZmluZSBSU1NfRkxBR1MoYnApIFwKIAkJKFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfSVBWNF9DQVBBQklMSVRZIHwgXAogCQkgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY0X1RDUF9DQVBBQklMSVRZIHwgXApAQCAtMTc3NSw2ICsxOTMyLDMwIEBACiAJCSAgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19NT0RFX1NISUZUKSkKICNkZWZpbmUgTVVMVElfTUFTSwkJCTB4N2YKIAorCisjZGVmaW5lIERFRl9VU0JfRlVOQ19PRkYJb2Zmc2V0b2Yoc3RydWN0IGNzdG9ybV9kZWZfc3RhdHVzX2Jsb2NrX3UsIGZ1bmMpCisjZGVmaW5lIERFRl9DU0JfRlVOQ19PRkYJb2Zmc2V0b2Yoc3RydWN0IGNzdG9ybV9kZWZfc3RhdHVzX2Jsb2NrX2MsIGZ1bmMpCisjZGVmaW5lIERFRl9YU0JfRlVOQ19PRkYJb2Zmc2V0b2Yoc3RydWN0IHhzdG9ybV9kZWZfc3RhdHVzX2Jsb2NrLCBmdW5jKQorI2RlZmluZSBERUZfVFNCX0ZVTkNfT0ZGCW9mZnNldG9mKHN0cnVjdCB0c3Rvcm1fZGVmX3N0YXR1c19ibG9jaywgZnVuYykKKworI2RlZmluZSBERUZfVVNCX0lHVV9JTkRFWF9PRkYgXAorCQkJb2Zmc2V0b2Yoc3RydWN0IGNzdG9ybV9kZWZfc3RhdHVzX2Jsb2NrX3UsIGlndV9pbmRleCkKKyNkZWZpbmUgREVGX0NTQl9JR1VfSU5ERVhfT0ZGIFwKKwkJCW9mZnNldG9mKHN0cnVjdCBjc3Rvcm1fZGVmX3N0YXR1c19ibG9ja19jLCBpZ3VfaW5kZXgpCisjZGVmaW5lIERFRl9YU0JfSUdVX0lOREVYX09GRiBcCisJCQlvZmZzZXRvZihzdHJ1Y3QgeHN0b3JtX2RlZl9zdGF0dXNfYmxvY2ssIGlndV9pbmRleCkKKyNkZWZpbmUgREVGX1RTQl9JR1VfSU5ERVhfT0ZGIFwKKwkJCW9mZnNldG9mKHN0cnVjdCB0c3Rvcm1fZGVmX3N0YXR1c19ibG9jaywgaWd1X2luZGV4KQorCisjZGVmaW5lIERFRl9VU0JfU0VHTUVOVF9PRkYgXAorCQkJb2Zmc2V0b2Yoc3RydWN0IGNzdG9ybV9kZWZfc3RhdHVzX2Jsb2NrX3UsIHNlZ21lbnQpCisjZGVmaW5lIERFRl9DU0JfU0VHTUVOVF9PRkYgXAorCQkJb2Zmc2V0b2Yoc3RydWN0IGNzdG9ybV9kZWZfc3RhdHVzX2Jsb2NrX2MsIHNlZ21lbnQpCisjZGVmaW5lIERFRl9YU0JfU0VHTUVOVF9PRkYgXAorCQkJb2Zmc2V0b2Yoc3RydWN0IHhzdG9ybV9kZWZfc3RhdHVzX2Jsb2NrLCBzZWdtZW50KQorI2RlZmluZSBERUZfVFNCX1NFR01FTlRfT0ZGIFwKKwkJCW9mZnNldG9mKHN0cnVjdCB0c3Rvcm1fZGVmX3N0YXR1c19ibG9jaywgc2VnbWVudCkKKwogI2RlZmluZSBCTlgyWF9TUF9EU0JfSU5ERVggXAogCQkoJmJwLT5kZWZfc3RhdHVzX2Jsay0+c3Bfc2IuXAogCQkJCQlpbmRleF92YWx1ZXNbSENfU1BfSU5ERVhfRVRIX0RFRl9DT05TXSkKQEAgLTE3ODYsNyArMTk2Nyw3IEBACiAJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBHRVRfRkxBRyh2YWx1ZSwgbWFzaykgXAotCSgoKHZhbHVlKSAmPSAobWFzaykpID4+IChtYXNrIyNfU0hJRlQpKQorCSgoKHZhbHVlKSAmIChtYXNrKSkgPj4gKG1hc2sjI19TSElGVCkpCiAKICNkZWZpbmUgR0VUX0ZJRUxEKHZhbHVlLCBmbmFtZSkgXAogCSgoKHZhbHVlKSAmIChmbmFtZSMjX01BU0spKSA+PiAoZm5hbWUjI19TSElGVCkpCkBAIC0xODIxLDE1ICsyMDAyLDEzIEBACiAjZGVmaW5lIEhDX1NFR19BQ0NFU1NfQVRUTgkJNAogI2RlZmluZSBIQ19TRUdfQUNDRVNTX05PUk0JCTAgICAvKkRyaXZlciBkZWNpc2lvbiAwLTEqLwogCi0jaWZkZWYgQk5YMlhfTUFJTgotI2RlZmluZSBCTlgyWF9FWFRFUk4KLSNlbHNlCi0jZGVmaW5lIEJOWDJYX0VYVEVSTiBleHRlcm4KLSNlbmRpZgorc3RhdGljIGNvbnN0IHUzMiBkbWFlX3JlZ19nb19jW10gPSB7CisJRE1BRV9SRUdfR09fQzAsIERNQUVfUkVHX0dPX0MxLCBETUFFX1JFR19HT19DMiwgRE1BRV9SRUdfR09fQzMsCisJRE1BRV9SRUdfR09fQzQsIERNQUVfUkVHX0dPX0M1LCBETUFFX1JFR19HT19DNiwgRE1BRV9SRUdfR09fQzcsCisJRE1BRV9SRUdfR09fQzgsIERNQUVfUkVHX0dPX0M5LCBETUFFX1JFR19HT19DMTAsIERNQUVfUkVHX0dPX0MxMSwKKwlETUFFX1JFR19HT19DMTIsIERNQUVfUkVHX0dPX0MxMywgRE1BRV9SRUdfR09fQzE0LCBETUFFX1JFR19HT19DMTUKK307CiAKLUJOWDJYX0VYVEVSTiBpbnQgbG9hZF9jb3VudFsyXVszXTsgLyogcGVyIHBhdGg6IDAtY29tbW9uLCAxLXBvcnQwLCAyLXBvcnQxICovCi0KLWV4dGVybiB2b2lkIGJueDJ4X3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKLXZvaWQgYm54MnhfcHVzaF9pbmRpcl90YWJsZShzdHJ1Y3QgYm54MnggKmJwKTsKLQordm9pZCBibngyeF9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Cit2b2lkIGJueDJ4X25vdGlmeV9saW5rX2NoYW5nZWQoc3RydWN0IGJueDJ4ICpicCk7CiAjZW5kaWYgLyogYm54MnguaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfY21uLmMgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9jbW4uYwppbmRleCAyODkwNDQzLi41YjBkYmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9jbW4uYworKysgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9jbW4uYwpAQCAtMTcsMTYgKzE3LDE3IEBACiAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KICNpbmNsdWRlICJibngyeF9jbW4uaCIKLQogI2luY2x1ZGUgImJueDJ4X2luaXQuaCIKKyNpbmNsdWRlICJibngyeF9zcC5oIgogCi1zdGF0aWMgaW50IGJueDJ4X3NldHVwX2lycXMoc3RydWN0IGJueDJ4ICpicCk7CisKIAogLyoqCiAgKiBibngyeF9iel9mcCAtIHplcm8gY29udGVudCBvZiB0aGUgZmFzdHBhdGggc3RydWN0dXJlLgpAQCAtNDYsNiArNDcsMjUgQEAKIAogCS8qIFJlc3RvcmUgdGhlIE5BUEkgb2JqZWN0IGFzIGl0IGhhcyBiZWVuIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KIAlmcC0+bmFwaSA9IG9yaWdfbmFwaTsKKworCWZwLT5icCA9IGJwOworCWZwLT5pbmRleCA9IGluZGV4OworCWlmIChJU19FVEhfRlAoZnApKQorCQlmcC0+bWF4X2NvcyA9IGJwLT5tYXhfY29zOworCWVsc2UKKwkJLyogU3BlY2lhbCBxdWV1ZXMgc3VwcG9ydCBvbmx5IG9uZSBDb1MgKi8KKwkJZnAtPm1heF9jb3MgPSAxOworCisJLyoKKwkgKiBzZXQgdGhlIHRwYSBmbGFnIGZvciBlYWNoIHF1ZXVlLiBUaGUgdHBhIGZsYWcgZGV0ZXJtaW5lcyB0aGUgcXVldWUKKwkgKiBtaW5pbWFsIHNpemUgc28gaXQgbXVzdCBiZSBzZXQgcHJpb3IgdG8gcXVldWUgbWVtb3J5IGFsbG9jYXRpb24KKwkgKi8KKwlmcC0+ZGlzYWJsZV90cGEgPSAoKGJwLT5mbGFncyAmIFRQQV9FTkFCTEVfRkxBRykgPT0gMCk7CisKKyNpZmRlZiBCQ01fQ05JQworCS8qIFdlIGRvbid0IHdhbnQgVFBBIG9uIEZDb0UsIEZXRCBhbmQgT09PIEwyIHJpbmdzICovCisJYm54MnhfZmNvZShicCwgZGlzYWJsZV90cGEpID0gMTsKKyNlbmRpZgogfQogCiAvKioKQEAgLTcxLDEzICs5MSwxNSBAQAogCXRvX2ZwLT5uYXBpID0gb3JpZ19uYXBpOwogfQogCitpbnQgbG9hZF9jb3VudFsyXVszXSA9IHsgezB9IH07IC8qIHBlci1wYXRoOiAwLWNvbW1vbiwgMS1wb3J0MCwgMi1wb3J0MSAqLworCiAvKiBmcmVlIHNrYiBpbiB0aGUgcGFja2V0IHJpbmcgYXQgcG9zIGlkeAogICogcmV0dXJuIGlkeCBvZiBsYXN0IGJkIGZyZWVkCiAgKi8KLXN0YXRpYyB1MTYgYm54MnhfZnJlZV90eF9wa3Qoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKK3N0YXRpYyB1MTYgYm54MnhfZnJlZV90eF9wa3Qoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2ZwX3R4ZGF0YSAqdHhkYXRhLAogCQkJICAgICB1MTYgaWR4KQogewotCXN0cnVjdCBzd190eF9iZCAqdHhfYnVmID0gJmZwLT50eF9idWZfcmluZ1tpZHhdOworCXN0cnVjdCBzd190eF9iZCAqdHhfYnVmID0gJnR4ZGF0YS0+dHhfYnVmX3JpbmdbaWR4XTsKIAlzdHJ1Y3QgZXRoX3R4X3N0YXJ0X2JkICp0eF9zdGFydF9iZDsKIAlzdHJ1Y3QgZXRoX3R4X2JkICp0eF9kYXRhX2JkOwogCXN0cnVjdCBza19idWZmICpza2IgPSB0eF9idWYtPnNrYjsKQEAgLTg3LDE1ICsxMDksMTYgQEAKIAkvKiBwcmVmZXRjaCBza2IgZW5kIHBvaW50ZXIgdG8gc3BlZWR1cCBkZXZfa2ZyZWVfc2tiKCkgKi8KIAlwcmVmZXRjaCgmc2tiLT5lbmQpOwogCi0JRFAoQk5YMlhfTVNHX09GRiwgInBrdF9pZHggJWQgIGJ1ZmYgQCglcCktPnNrYiAlcFxuIiwKLQkgICBpZHgsIHR4X2J1Ziwgc2tiKTsKKwlEUChCTlgyWF9NU0dfRlAsICJmcFslZF06IHBrdF9pZHggJWQgIGJ1ZmYgQCglcCktPnNrYiAlcFxuIiwKKwkgICB0eGRhdGEtPnR4cV9pbmRleCwgaWR4LCB0eF9idWYsIHNrYik7CiAKIAkvKiB1bm1hcCBmaXJzdCBiZCAqLwogCURQKEJOWDJYX01TR19PRkYsICJmcmVlIGJkX2lkeCAlZFxuIiwgYmRfaWR4KTsKLQl0eF9zdGFydF9iZCA9ICZmcC0+dHhfZGVzY19yaW5nW2JkX2lkeF0uc3RhcnRfYmQ7CisJdHhfc3RhcnRfYmQgPSAmdHhkYXRhLT50eF9kZXNjX3JpbmdbYmRfaWR4XS5zdGFydF9iZDsKIAlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBCRF9VTk1BUF9BRERSKHR4X3N0YXJ0X2JkKSwKIAkJCSBCRF9VTk1BUF9MRU4odHhfc3RhcnRfYmQpLCBETUFfVE9fREVWSUNFKTsKIAorCiAJbmJkID0gbGUxNl90b19jcHUodHhfc3RhcnRfYmQtPm5iZCkgLSAxOwogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKIAlpZiAoKG5iZCAtIDEpID4gKE1BWF9TS0JfRlJBR1MgKyAyKSkgewpAQCAtMTIyLDcgKzE0NSw3IEBACiAJd2hpbGUgKG5iZCA+IDApIHsKIAogCQlEUChCTlgyWF9NU0dfT0ZGLCAiZnJlZSBmcmFnIGJkX2lkeCAlZFxuIiwgYmRfaWR4KTsKLQkJdHhfZGF0YV9iZCA9ICZmcC0+dHhfZGVzY19yaW5nW2JkX2lkeF0ucmVnX2JkOworCQl0eF9kYXRhX2JkID0gJnR4ZGF0YS0+dHhfZGVzY19yaW5nW2JkX2lkeF0ucmVnX2JkOwogCQlkbWFfdW5tYXBfcGFnZSgmYnAtPnBkZXYtPmRldiwgQkRfVU5NQVBfQUREUih0eF9kYXRhX2JkKSwKIAkJCSAgICAgICBCRF9VTk1BUF9MRU4odHhfZGF0YV9iZCksIERNQV9UT19ERVZJQ0UpOwogCQlpZiAoLS1uYmQpCkBAIC0xMzgsMjAgKzE2MSwxOSBAQAogCXJldHVybiBuZXdfY29uczsKIH0KIAotaW50IGJueDJ4X3R4X2ludChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwKQoraW50IGJueDJ4X3R4X2ludChzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54MnhfZnBfdHhkYXRhICp0eGRhdGEpCiB7Ci0Jc3RydWN0IGJueDJ4ICpicCA9IGZwLT5icDsKIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7Ci0JdTE2IGh3X2NvbnMsIHN3X2NvbnMsIGJkX2NvbnMgPSBmcC0+dHhfYmRfY29uczsKKwl1MTYgaHdfY29ucywgc3dfY29ucywgYmRfY29ucyA9IHR4ZGF0YS0+dHhfYmRfY29uczsKIAogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKIAlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkKIAkJcmV0dXJuIC0xOwogI2VuZGlmCiAKLQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGJwLT5kZXYsIGZwLT5pbmRleCk7Ci0JaHdfY29ucyA9IGxlMTZfdG9fY3B1KCpmcC0+dHhfY29uc19zYik7Ci0Jc3dfY29ucyA9IGZwLT50eF9wa3RfY29uczsKKwl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGJwLT5kZXYsIHR4ZGF0YS0+dHhxX2luZGV4KTsKKwlod19jb25zID0gbGUxNl90b19jcHUoKnR4ZGF0YS0+dHhfY29uc19zYik7CisJc3dfY29ucyA9IHR4ZGF0YS0+dHhfcGt0X2NvbnM7CiAKIAl3aGlsZSAoc3dfY29ucyAhPSBod19jb25zKSB7CiAJCXUxNiBwa3RfY29uczsKQEAgLTE2MCwyMCArMTgyLDIzIEBACiAKIAkJRFAoTkVUSUZfTVNHX1RYX0RPTkUsICJxdWV1ZVslZF06IGh3X2NvbnMgJXUgIHN3X2NvbnMgJXUgIgogCQkJCSAgICAgICIgcGt0X2NvbnMgJXVcbiIsCi0JCSAgIGZwLT5pbmRleCwgaHdfY29ucywgc3dfY29ucywgcGt0X2NvbnMpOworCQkgICB0eGRhdGEtPnR4cV9pbmRleCwgaHdfY29ucywgc3dfY29ucywgcGt0X2NvbnMpOwogCi0JCWJkX2NvbnMgPSBibngyeF9mcmVlX3R4X3BrdChicCwgZnAsIHBrdF9jb25zKTsKKwkJYmRfY29ucyA9IGJueDJ4X2ZyZWVfdHhfcGt0KGJwLCB0eGRhdGEsIHBrdF9jb25zKTsKIAkJc3dfY29ucysrOwogCX0KIAotCWZwLT50eF9wa3RfY29ucyA9IHN3X2NvbnM7Ci0JZnAtPnR4X2JkX2NvbnMgPSBiZF9jb25zOworCXR4ZGF0YS0+dHhfcGt0X2NvbnMgPSBzd19jb25zOworCXR4ZGF0YS0+dHhfYmRfY29ucyA9IGJkX2NvbnM7CiAKIAkvKiBOZWVkIHRvIG1ha2UgdGhlIHR4X2JkX2NvbnMgdXBkYXRlIHZpc2libGUgdG8gc3RhcnRfeG1pdCgpCiAJICogYmVmb3JlIGNoZWNraW5nIGZvciBuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKCkuICBXaXRob3V0IHRoZQogCSAqIG1lbW9yeSBiYXJyaWVyLCB0aGVyZSBpcyBhIHNtYWxsIHBvc3NpYmlsaXR5IHRoYXQKIAkgKiBzdGFydF94bWl0KCkgd2lsbCBtaXNzIGl0IGFuZCBjYXVzZSB0aGUgcXVldWUgdG8gYmUgc3RvcHBlZAogCSAqIGZvcmV2ZXIuCisJICogT24gdGhlIG90aGVyIGhhbmQgd2UgbmVlZCBhbiBybWIoKSBoZXJlIHRvIGVuc3VyZSB0aGUgcHJvcGVyCisJICogb3JkZXJpbmcgb2YgYml0IHRlc3RpbmcgaW4gdGhlIGZvbGxvd2luZworCSAqIG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQodHhxKSBjYWxsLgogCSAqLwogCXNtcF9tYigpOwogCkBAIC0xOTIsNyArMjE3LDcgQEAKIAogCQlpZiAoKG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQodHhxKSkgJiYKIAkJICAgIChicC0+c3RhdGUgPT0gQk5YMlhfU1RBVEVfT1BFTikgJiYKLQkJICAgIChibngyeF90eF9hdmFpbChmcCkgPj0gTUFYX1NLQl9GUkFHUyArIDMpKQorCQkgICAgKGJueDJ4X3R4X2F2YWlsKGJwLCB0eGRhdGEpID49IE1BWF9TS0JfRlJBR1MgKyAzKSkKIAkJCW5ldGlmX3R4X3dha2VfcXVldWUodHhxKTsKIAogCQlfX25ldGlmX3R4X3VubG9jayh0eHEpOwpAQCAtMjI1LDcgKzI1MCw3IEBACiAKIAkvKiBGaXJzdCBtYXJrIGFsbCB1c2VkIHBhZ2VzICovCiAJZm9yIChpID0gMDsgaSA8IHNnZV9sZW47IGkrKykKLQkJU0dFX01BU0tfQ0xFQVJfQklUKGZwLAorCQlCSVRfVkVDNjRfQ0xFQVJfQklUKGZwLT5zZ2VfbWFzaywKIAkJCVJYX1NHRShsZTE2X3RvX2NwdShmcF9jcWUtPnNnbF9vcl9yYXdfZGF0YS5zZ2xbaV0pKSk7CiAKIAlEUChORVRJRl9NU0dfUlhfU1RBVFVTLCAiZnBfY3FlLT5zZ2xbJWRdID0gJWRcbiIsCkBAIC0yMzcsOCArMjYyLDggQEAKIAkJbGUxNl90b19jcHUoZnBfY3FlLT5zZ2xfb3JfcmF3X2RhdGEuc2dsW3NnZV9sZW4gLSAxXSkpOwogCiAJbGFzdF9tYXggPSBSWF9TR0UoZnAtPmxhc3RfbWF4X3NnZSk7Ci0JbGFzdF9lbGVtID0gbGFzdF9tYXggPj4gUlhfU0dFX01BU0tfRUxFTV9TSElGVDsKLQlmaXJzdF9lbGVtID0gUlhfU0dFKGZwLT5yeF9zZ2VfcHJvZCkgPj4gUlhfU0dFX01BU0tfRUxFTV9TSElGVDsKKwlsYXN0X2VsZW0gPSBsYXN0X21heCA+PiBCSVRfVkVDNjRfRUxFTV9TSElGVDsKKwlmaXJzdF9lbGVtID0gUlhfU0dFKGZwLT5yeF9zZ2VfcHJvZCkgPj4gQklUX1ZFQzY0X0VMRU1fU0hJRlQ7CiAKIAkvKiBJZiByaW5nIGlzIG5vdCBmdWxsICovCiAJaWYgKGxhc3RfZWxlbSArIDEgIT0gZmlyc3RfZWxlbSkKQEAgLTI0OSw4ICsyNzQsOCBAQAogCQlpZiAobGlrZWx5KGZwLT5zZ2VfbWFza1tpXSkpCiAJCQlicmVhazsKIAotCQlmcC0+c2dlX21hc2tbaV0gPSBSWF9TR0VfTUFTS19FTEVNX09ORV9NQVNLOwotCQlkZWx0YSArPSBSWF9TR0VfTUFTS19FTEVNX1NaOworCQlmcC0+c2dlX21hc2tbaV0gPSBCSVRfVkVDNjRfRUxFTV9PTkVfTUFTSzsKKwkJZGVsdGEgKz0gQklUX1ZFQzY0X0VMRU1fU1o7CiAJfQogCiAJaWYgKGRlbHRhID4gMCkgewpAQCAtMjY1LDMzICsyOTAsNTYgQEAKIH0KIAogc3RhdGljIHZvaWQgYm54MnhfdHBhX3N0YXJ0KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsIHUxNiBxdWV1ZSwKLQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgY29ucywgdTE2IHByb2QpCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGNvbnMsIHUxNiBwcm9kLAorCQkJICAgIHN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X2NxZSAqY3FlKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBmcC0+YnA7CiAJc3RydWN0IHN3X3J4X2JkICpjb25zX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbY29uc107CiAJc3RydWN0IHN3X3J4X2JkICpwcm9kX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbcHJvZF07CiAJc3RydWN0IGV0aF9yeF9iZCAqcHJvZF9iZCA9ICZmcC0+cnhfZGVzY19yaW5nW3Byb2RdOwogCWRtYV9hZGRyX3QgbWFwcGluZzsKKwlzdHJ1Y3QgYm54MnhfYWdnX2luZm8gKnRwYV9pbmZvID0gJmZwLT50cGFfaW5mb1txdWV1ZV07CisJc3RydWN0IHN3X3J4X2JkICpmaXJzdF9idWYgPSAmdHBhX2luZm8tPmZpcnN0X2J1ZjsKIAotCS8qIG1vdmUgZW1wdHkgc2tiIGZyb20gcG9vbCB0byBwcm9kIGFuZCBtYXAgaXQgKi8KLQlwcm9kX3J4X2J1Zi0+c2tiID0gZnAtPnRwYV9wb29sW3F1ZXVlXS5za2I7Ci0JbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBmcC0+dHBhX3Bvb2xbcXVldWVdLnNrYi0+ZGF0YSwKLQkJCQkgZnAtPnJ4X2J1Zl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOwotCWRtYV91bm1hcF9hZGRyX3NldChwcm9kX3J4X2J1ZiwgbWFwcGluZywgbWFwcGluZyk7Ci0KLQkvKiBtb3ZlIHBhcnRpYWwgc2tiIGZyb20gY29ucyB0byBwb29sIChkb24ndCB1bm1hcCB5ZXQpICovCi0JZnAtPnRwYV9wb29sW3F1ZXVlXSA9ICpjb25zX3J4X2J1ZjsKLQotCS8qIG1hcmsgYmluIHN0YXRlIGFzIHN0YXJ0IC0gcHJpbnQgZXJyb3IgaWYgY3VycmVudCBzdGF0ZSAhPSBzdG9wICovCi0JaWYgKGZwLT50cGFfc3RhdGVbcXVldWVdICE9IEJOWDJYX1RQQV9TVE9QKQorCS8qIHByaW50IGVycm9yIGlmIGN1cnJlbnQgc3RhdGUgIT0gc3RvcCAqLworCWlmICh0cGFfaW5mby0+dHBhX3N0YXRlICE9IEJOWDJYX1RQQV9TVE9QKQogCQlCTlgyWF9FUlIoInN0YXJ0IG9mIGJpbiBub3QgaW4gc3RvcCBbJWRdXG4iLCBxdWV1ZSk7CiAKLQlmcC0+dHBhX3N0YXRlW3F1ZXVlXSA9IEJOWDJYX1RQQV9TVEFSVDsKKwkvKiBUcnkgdG8gbWFwIGFuIGVtcHR5IHNrYiBmcm9tIHRoZSBhZ2dyZWdhdGlvbiBpbmZvICAqLworCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwKKwkJCQkgZmlyc3RfYnVmLT5za2ItPmRhdGEsCisJCQkJIGZwLT5yeF9idWZfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwkvKgorCSAqICAuLi5pZiBpdCBmYWlscyAtIG1vdmUgdGhlIHNrYiBmcm9tIHRoZSBjb25zdW1lciB0byB0aGUgcHJvZHVjZXIKKwkgKiAgYW5kIHNldCB0aGUgY3VycmVudCBhZ2dyZWdhdGlvbiBzdGF0ZSBhcyBFUlJPUiB0byBkcm9wIGl0CisJICogIHdoZW4gVFBBX1NUT1AgYXJyaXZlcy4KKwkgKi8KIAorCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcigmYnAtPnBkZXYtPmRldiwgbWFwcGluZykpKSB7CisJCS8qIE1vdmUgdGhlIEJEIGZyb20gdGhlIGNvbnN1bWVyIHRvIHRoZSBwcm9kdWNlciAqLworCQlibngyeF9yZXVzZV9yeF9za2IoZnAsIGNvbnMsIHByb2QpOworCQl0cGFfaW5mby0+dHBhX3N0YXRlID0gQk5YMlhfVFBBX0VSUk9SOworCQlyZXR1cm47CisJfQorCisJLyogbW92ZSBlbXB0eSBza2IgZnJvbSBwb29sIHRvIHByb2QgKi8KKwlwcm9kX3J4X2J1Zi0+c2tiID0gZmlyc3RfYnVmLT5za2I7CisJZG1hX3VubWFwX2FkZHJfc2V0KHByb2RfcnhfYnVmLCBtYXBwaW5nLCBtYXBwaW5nKTsKIAkvKiBwb2ludCBwcm9kX2JkIHRvIG5ldyBza2IgKi8KIAlwcm9kX2JkLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIoVTY0X0hJKG1hcHBpbmcpKTsKIAlwcm9kX2JkLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIoVTY0X0xPKG1hcHBpbmcpKTsKIAorCS8qIG1vdmUgcGFydGlhbCBza2IgZnJvbSBjb25zIHRvIHBvb2wgKGRvbid0IHVubWFwIHlldCkgKi8KKwkqZmlyc3RfYnVmID0gKmNvbnNfcnhfYnVmOworCisJLyogbWFyayBiaW4gc3RhdGUgYXMgU1RBUlQgKi8KKwl0cGFfaW5mby0+cGFyc2luZ19mbGFncyA9CisJCWxlMTZfdG9fY3B1KGNxZS0+cGFyc19mbGFncy5mbGFncyk7CisJdHBhX2luZm8tPnZsYW5fdGFnID0gbGUxNl90b19jcHUoY3FlLT52bGFuX3RhZyk7CisJdHBhX2luZm8tPnRwYV9zdGF0ZSA9IEJOWDJYX1RQQV9TVEFSVDsKKwl0cGFfaW5mby0+bGVuX29uX2JkID0gbGUxNl90b19jcHUoY3FlLT5sZW5fb25fYmQpOworCXRwYV9pbmZvLT5wbGFjZW1lbnRfb2Zmc2V0ID0gY3FlLT5wbGFjZW1lbnRfb2Zmc2V0OworCiAjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgogCWZwLT50cGFfcXVldWVfdXNlZCB8PSAoMSA8PCBxdWV1ZSk7CiAjaWZkZWYgX0FTTV9HRU5FUklDX0lOVF9MNjRfSApAQCAtMzIyLDEwICszNzAsMTcgQEAKIHN0YXRpYyBpbmxpbmUgdTE2IGJueDJ4X3NldF9scm9fbXNzKHN0cnVjdCBibngyeCAqYnAsIHUxNiBwYXJzaW5nX2ZsYWdzLAogCQkJCSAgICB1MTYgbGVuX29uX2JkKQogewotCS8qIFRQQSBhcnJncmVnYXRpb24gd29uJ3QgaGF2ZSBhbiBJUCBvcHRpb25zIGFuZCBUQ1Agb3B0aW9ucwotCSAqIG90aGVyIHRoYW4gdGltZXN0YW1wLgorCS8qCisJICogVFBBIGFycmdyZWdhdGlvbiB3b24ndCBoYXZlIGVpdGhlciBJUCBvcHRpb25zIG9yIFRDUCBvcHRpb25zCisJICogb3RoZXIgdGhhbiB0aW1lc3RhbXAgb3IgSVB2NiBleHRlbnNpb24gaGVhZGVycy4KIAkgKi8KLQl1MTYgaGRyc19sZW4gPSBFVEhfSExFTiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCXUxNiBoZHJzX2xlbiA9IEVUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCisJaWYgKEdFVF9GTEFHKHBhcnNpbmdfZmxhZ3MsIFBBUlNJTkdfRkxBR1NfT1ZFUl9FVEhFUk5FVF9QUk9UT0NPTCkgPT0KKwkgICAgUFJTX0ZMQUdfT1ZFUkVUSF9JUFY2KQorCQloZHJzX2xlbiArPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCWVsc2UgLyogSVB2NCAqLworCQloZHJzX2xlbiArPSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKIAogCiAJLyogQ2hlY2sgaWYgdGhlcmUgd2FzIGEgVENQIHRpbWVzdGFtcCwgaWYgdGhlcmUgaXMgaXQncyB3aWxsCkBAIC0zNDAsMzAgKzM5NSwzMCBAQAogfQogCiBzdGF0aWMgaW50IGJueDJ4X2ZpbGxfZnJhZ19za2Ioc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKLQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIHN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X2NxZSAqZnBfY3FlLAotCQkJICAgICAgIHUxNiBjcWVfaWR4LCB1MTYgcGFyc2luZ19mbGFncykKKwkJCSAgICAgICB1MTYgcXVldWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IGV0aF9lbmRfYWdnX3J4X2NxZSAqY3FlLAorCQkJICAgICAgIHUxNiBjcWVfaWR4KQogewogCXN0cnVjdCBzd19yeF9wYWdlICpyeF9wZywgb2xkX3J4X3BnOwotCXUxNiBsZW5fb25fYmQgPSBsZTE2X3RvX2NwdShmcF9jcWUtPmxlbl9vbl9iZCk7CiAJdTMyIGksIGZyYWdfbGVuLCBmcmFnX3NpemUsIHBhZ2VzOwogCWludCBlcnI7CiAJaW50IGo7CisJc3RydWN0IGJueDJ4X2FnZ19pbmZvICp0cGFfaW5mbyA9ICZmcC0+dHBhX2luZm9bcXVldWVdOworCXUxNiBsZW5fb25fYmQgPSB0cGFfaW5mby0+bGVuX29uX2JkOwogCi0JZnJhZ19zaXplID0gbGUxNl90b19jcHUoZnBfY3FlLT5wa3RfbGVuKSAtIGxlbl9vbl9iZDsKKwlmcmFnX3NpemUgPSBsZTE2X3RvX2NwdShjcWUtPnBrdF9sZW4pIC0gbGVuX29uX2JkOwogCXBhZ2VzID0gU0dFX1BBR0VfQUxJR04oZnJhZ19zaXplKSA+PiBTR0VfUEFHRV9TSElGVDsKIAogCS8qIFRoaXMgaXMgbmVlZGVkIGluIG9yZGVyIHRvIGVuYWJsZSBmb3J3YXJkaW5nIHN1cHBvcnQgKi8KIAlpZiAoZnJhZ19zaXplKQotCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gYm54Mnhfc2V0X2xyb19tc3MoYnAsIHBhcnNpbmdfZmxhZ3MsCi0JCQkJCQkJICAgICAgbGVuX29uX2JkKTsKKwkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IGJueDJ4X3NldF9scm9fbXNzKGJwLAorCQkJCQl0cGFfaW5mby0+cGFyc2luZ19mbGFncywgbGVuX29uX2JkKTsKIAogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKIAlpZiAocGFnZXMgPiBtaW5fdCh1MzIsIDgsIE1BWF9TS0JfRlJBR1MpKlNHRV9QQUdFX1NJWkUqUEFHRVNfUEVSX1NHRSkgewogCQlCTlgyWF9FUlIoIlNHTCBsZW5ndGggaXMgdG9vIGxvbmc6ICVkLiBDUUUgaW5kZXggaXMgJWRcbiIsCiAJCQkgIHBhZ2VzLCBjcWVfaWR4KTsKLQkJQk5YMlhfRVJSKCJmcF9jcWUtPnBrdF9sZW4gPSAlZCAgZnBfY3FlLT5sZW5fb25fYmQgPSAlZFxuIiwKLQkJCSAgZnBfY3FlLT5wa3RfbGVuLCBsZW5fb25fYmQpOworCQlCTlgyWF9FUlIoImNxZS0+cGt0X2xlbiA9ICVkXG4iLCBjcWUtPnBrdF9sZW4pOwogCQlibngyeF9wYW5pYygpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0zNzEsOCArNDI2LDcgQEAKIAogCS8qIFJ1biB0aHJvdWdoIHRoZSBTR0wgYW5kIGNvbXBvc2UgdGhlIGZyYWdtZW50ZWQgc2tiICovCiAJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBwYWdlczsgaSArPSBQQUdFU19QRVJfU0dFLCBqKyspIHsKLQkJdTE2IHNnZV9pZHggPQotCQkJUlhfU0dFKGxlMTZfdG9fY3B1KGZwX2NxZS0+c2dsX29yX3Jhd19kYXRhLnNnbFtqXSkpOworCQl1MTYgc2dlX2lkeCA9IFJYX1NHRShsZTE2X3RvX2NwdShjcWUtPnNnbF9vcl9yYXdfZGF0YS5zZ2xbal0pKTsKIAogCQkvKiBGVyBnaXZlcyB0aGUgaW5kaWNlcyBvZiB0aGUgU0dFIGFzIGlmIHRoZSByaW5nIGlzIGFuIGFycmF5CiAJCSAgIChtZWFuaW5nIHRoYXQgIm5leHQiIGVsZW1lbnQgd2lsbCBjb25zdW1lIDIgaW5kaWNlcykgKi8KQEAgLTQwNywxMyArNDYxLDI4IEBACiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X3RwYV9zdG9wKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCi0JCQkgICB1MTYgcXVldWUsIGludCBwYWQsIGludCBsZW4sIHVuaW9uIGV0aF9yeF9jcWUgKmNxZSwKKwkJCSAgIHUxNiBxdWV1ZSwgc3RydWN0IGV0aF9lbmRfYWdnX3J4X2NxZSAqY3FlLAogCQkJICAgdTE2IGNxZV9pZHgpCiB7Ci0Jc3RydWN0IHN3X3J4X2JkICpyeF9idWYgPSAmZnAtPnRwYV9wb29sW3F1ZXVlXTsKKwlzdHJ1Y3QgYm54MnhfYWdnX2luZm8gKnRwYV9pbmZvID0gJmZwLT50cGFfaW5mb1txdWV1ZV07CisJc3RydWN0IHN3X3J4X2JkICpyeF9idWYgPSAmdHBhX2luZm8tPmZpcnN0X2J1ZjsKKwl1OCBwYWQgPSB0cGFfaW5mby0+cGxhY2VtZW50X29mZnNldDsKKwl1MTYgbGVuID0gdHBhX2luZm8tPmxlbl9vbl9iZDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnhfYnVmLT5za2I7CiAJLyogYWxsb2MgbmV3IHNrYiAqLwotCXN0cnVjdCBza19idWZmICpuZXdfc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LCBmcC0+cnhfYnVmX3NpemUpOworCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCXU4IG9sZF90cGFfc3RhdGUgPSB0cGFfaW5mby0+dHBhX3N0YXRlOworCisJdHBhX2luZm8tPnRwYV9zdGF0ZSA9IEJOWDJYX1RQQV9TVE9QOworCisJLyogSWYgd2UgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyB0aGUgaGFuZGxpbmcgb2YgdGhlIFRQQV9TVEFSVCAtCisJICogZHJvcCB0aGlzIGFnZ3JlZ2F0aW9uLgorCSAqLworCWlmIChvbGRfdHBhX3N0YXRlID09IEJOWDJYX1RQQV9FUlJPUikKKwkJZ290byBkcm9wOworCisJLyogVHJ5IHRvIGFsbG9jYXRlIHRoZSBuZXcgc2tiICovCisJbmV3X3NrYiA9IG5ldGRldl9hbGxvY19za2IoYnAtPmRldiwgZnAtPnJ4X2J1Zl9zaXplKTsKIAogCS8qIFVubWFwIHNrYiBpbiB0aGUgcG9vbCBhbnl3YXksIGFzIHdlIGFyZSBnb2luZyB0byBjaGFuZ2UKIAkgICBwb29sIGVudHJ5IHN0YXR1cyB0byBCTlgyWF9UUEFfU1RPUCBldmVuIGlmIG5ldyBza2IgYWxsb2NhdGlvbgpAQCAtNDIyLDExICs0OTEsNiBAQAogCQkJIGZwLT5yeF9idWZfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIAogCWlmIChsaWtlbHkobmV3X3NrYikpIHsKLQkJLyogZml4IGlwIHhzdW0gYW5kIGdpdmUgaXQgdG8gdGhlIHN0YWNrICovCi0JCS8qIChubyBuZWVkIHRvIG1hcCB0aGUgbmV3IHNrYikgKi8KLQkJdTE2IHBhcnNpbmdfZmxhZ3MgPQotCQkJbGUxNl90b19jcHUoY3FlLT5mYXN0X3BhdGhfY3FlLnBhcnNfZmxhZ3MuZmxhZ3MpOwotCiAJCXByZWZldGNoKHNrYik7CiAJCXByZWZldGNoKCgoY2hhciAqKShza2IpKSArIEwxX0NBQ0hFX0JZVEVTKTsKIApAQCAtNDQ2LDIxICs1MTAsOSBAQAogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBicC0+ZGV2KTsKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAotCQl7Ci0JCQlzdHJ1Y3QgaXBoZHIgKmlwaDsKLQotCQkJaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKLQkJCWlwaC0+Y2hlY2sgPSAwOwotCQkJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodTggKilpcGgsIGlwaC0+aWhsKTsKLQkJfQotCi0JCWlmICghYm54MnhfZmlsbF9mcmFnX3NrYihicCwgZnAsIHNrYiwKLQkJCQkJICZjcWUtPmZhc3RfcGF0aF9jcWUsIGNxZV9pZHgsCi0JCQkJCSBwYXJzaW5nX2ZsYWdzKSkgewotCQkJaWYgKHBhcnNpbmdfZmxhZ3MgJiBQQVJTSU5HX0ZMQUdTX1ZMQU4pCi0JCQkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsCi0JCQkJCQkgbGUxNl90b19jcHUoY3FlLT5mYXN0X3BhdGhfY3FlLgotCQkJCQkJCSAgICAgdmxhbl90YWcpKTsKKwkJaWYgKCFibngyeF9maWxsX2ZyYWdfc2tiKGJwLCBmcCwgcXVldWUsIHNrYiwgY3FlLCBjcWVfaWR4KSkgeworCQkJaWYgKHRwYV9pbmZvLT5wYXJzaW5nX2ZsYWdzICYgUEFSU0lOR19GTEFHU19WTEFOKQorCQkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB0cGFfaW5mby0+dmxhbl90YWcpOwogCQkJbmFwaV9ncm9fcmVjZWl2ZSgmZnAtPm5hcGksIHNrYik7CiAJCX0gZWxzZSB7CiAJCQlEUChORVRJRl9NU0dfUlhfU1RBVFVTLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBwYWdlcyIKQEAgLTQ3MCwxNiArNTIyLDE2IEBACiAKIAogCQkvKiBwdXQgbmV3IHNrYiBpbiBiaW4gKi8KLQkJZnAtPnRwYV9wb29sW3F1ZXVlXS5za2IgPSBuZXdfc2tiOworCQlyeF9idWYtPnNrYiA9IG5ld19za2I7CiAKLQl9IGVsc2UgewotCQkvKiBlbHNlIGRyb3AgdGhlIHBhY2tldCBhbmQga2VlcCB0aGUgYnVmZmVyIGluIHRoZSBiaW4gKi8KLQkJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywKLQkJICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgc2tiIC0gZHJvcHBpbmcgcGFja2V0IVxuIik7Ci0JCWZwLT5ldGhfcV9zdGF0cy5yeF9za2JfYWxsb2NfZmFpbGVkKys7CisJCXJldHVybjsKIAl9CiAKLQlmcC0+dHBhX3N0YXRlW3F1ZXVlXSA9IEJOWDJYX1RQQV9TVE9QOworZHJvcDoKKwkvKiBkcm9wIHRoZSBwYWNrZXQgYW5kIGtlZXAgdGhlIGJ1ZmZlciBpbiB0aGUgYmluICovCisJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywKKwkgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG9yIG1hcCBhIG5ldyBza2IgLSBkcm9wcGluZyBwYWNrZXQhXG4iKTsKKwlmcC0+ZXRoX3Ffc3RhdHMucnhfc2tiX2FsbG9jX2ZhaWxlZCsrOwogfQogCiAvKiBTZXQgVG9lcGxpdHogaGFzaCB2YWx1ZSBpbiB0aGUgc2tiIHVzaW5nIHRoZSB2YWx1ZSBmcm9tIHRoZQpAQCAtNTMzLDkgKzU4NSwxNiBAQAogCQlzdHJ1Y3Qgc3dfcnhfYmQgKnJ4X2J1ZiA9IE5VTEw7CiAJCXN0cnVjdCBza19idWZmICpza2I7CiAJCXVuaW9uIGV0aF9yeF9jcWUgKmNxZTsKKwkJc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfY3FlICpjcWVfZnA7CiAJCXU4IGNxZV9mcF9mbGFnczsKKwkJZW51bSBldGhfcnhfY3FlX3R5cGUgY3FlX2ZwX3R5cGU7CiAJCXUxNiBsZW4sIHBhZDsKIAorI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwkJaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpCisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCiAJCWNvbXBfcmluZ19jb25zID0gUkNRX0JEKHN3X2NvbXBfY29ucyk7CiAJCWJkX3Byb2QgPSBSWF9CRChiZF9wcm9kKTsKIAkJYmRfY29ucyA9IFJYX0JEKGJkX2NvbnMpOwpAQCAtNTQ4LDE3ICs2MDcsMTggQEAKIAkJCQkgIFBBR0VfU0laRSArIDEpKTsKIAogCQljcWUgPSAmZnAtPnJ4X2NvbXBfcmluZ1tjb21wX3JpbmdfY29uc107Ci0JCWNxZV9mcF9mbGFncyA9IGNxZS0+ZmFzdF9wYXRoX2NxZS50eXBlX2Vycm9yX2ZsYWdzOworCQljcWVfZnAgPSAmY3FlLT5mYXN0X3BhdGhfY3FlOworCQljcWVfZnBfZmxhZ3MgPSBjcWVfZnAtPnR5cGVfZXJyb3JfZmxhZ3M7CisJCWNxZV9mcF90eXBlID0gY3FlX2ZwX2ZsYWdzICYgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfVFlQRTsKIAogCQlEUChORVRJRl9NU0dfUlhfU1RBVFVTLCAiQ1FFIHR5cGUgJXggIGVyciAleCAgc3RhdHVzICV4IgogCQkgICAiICBxdWV1ZSAleCAgdmxhbiAleCAgbGVuICV1XG4iLCBDUUVfVFlQRShjcWVfZnBfZmxhZ3MpLAotCQkgICBjcWVfZnBfZmxhZ3MsIGNxZS0+ZmFzdF9wYXRoX2NxZS5zdGF0dXNfZmxhZ3MsCi0JCSAgIGxlMzJfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS5yc3NfaGFzaF9yZXN1bHQpLAotCQkgICBsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUudmxhbl90YWcpLAotCQkgICBsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUucGt0X2xlbikpOworCQkgICBjcWVfZnBfZmxhZ3MsIGNxZV9mcC0+c3RhdHVzX2ZsYWdzLAorCQkgICBsZTMyX3RvX2NwdShjcWVfZnAtPnJzc19oYXNoX3Jlc3VsdCksCisJCSAgIGxlMTZfdG9fY3B1KGNxZV9mcC0+dmxhbl90YWcpLCBsZTE2X3RvX2NwdShjcWVfZnAtPnBrdF9sZW4pKTsKIAogCQkvKiBpcyB0aGlzIGEgc2xvd3BhdGggbXNnPyAqLwotCQlpZiAodW5saWtlbHkoQ1FFX1RZUEUoY3FlX2ZwX2ZsYWdzKSkpIHsKKwkJaWYgKHVubGlrZWx5KENRRV9UWVBFX1NMT1coY3FlX2ZwX3R5cGUpKSkgewogCQkJYm54Mnhfc3BfZXZlbnQoZnAsIGNxZSk7CiAJCQlnb3RvIG5leHRfY3FlOwogCkBAIC01NjcsNjEgKzYyNyw1OSBAQAogCQkJcnhfYnVmID0gJmZwLT5yeF9idWZfcmluZ1tiZF9jb25zXTsKIAkJCXNrYiA9IHJ4X2J1Zi0+c2tiOwogCQkJcHJlZmV0Y2goc2tiKTsKLQkJCWxlbiA9IGxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS5wa3RfbGVuKTsKLQkJCXBhZCA9IGNxZS0+ZmFzdF9wYXRoX2NxZS5wbGFjZW1lbnRfb2Zmc2V0OwogCi0JCQkvKiAtIElmIENRRSBpcyBtYXJrZWQgYm90aCBUUEFfU1RBUlQgYW5kIFRQQV9FTkQgaXQgaXMKLQkJCSAqICAgYSBub24tVFBBIENRRS4KLQkJCSAqIC0gRlAgQ1FFIHdpbGwgYWx3YXlzIGhhdmUgZWl0aGVyIFRQQV9TVEFSVCBvci9hbmQKLQkJCSAqICAgVFBBX1NUT1AgZmxhZ3Mgc2V0LgotCQkJICovCi0JCQlpZiAoKCFmcC0+ZGlzYWJsZV90cGEpICYmCi0JCQkgICAgKFRQQV9UWVBFKGNxZV9mcF9mbGFncykgIT0KLQkJCQkJKFRQQV9UWVBFX1NUQVJUIHwgVFBBX1RZUEVfRU5EKSkpIHsKLQkJCQl1MTYgcXVldWUgPSBjcWUtPmZhc3RfcGF0aF9jcWUucXVldWVfaW5kZXg7CisJCQlpZiAoIUNRRV9UWVBFX0ZBU1QoY3FlX2ZwX3R5cGUpKSB7CisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCQkJCS8qIHNhbml0eSBjaGVjayAqLworCQkJCWlmIChmcC0+ZGlzYWJsZV90cGEgJiYKKwkJCQkgICAgKENRRV9UWVBFX1NUQVJUKGNxZV9mcF90eXBlKSB8fAorCQkJCSAgICAgQ1FFX1RZUEVfU1RPUChjcWVfZnBfdHlwZSkpKQorCQkJCQlCTlgyWF9FUlIoIlNUQVJUL1NUT1AgcGFja2V0IHdoaWxlICIKKwkJCQkJCSAgImRpc2FibGVfdHBhIHR5cGUgJXhcbiIsCisJCQkJCQkgIENRRV9UWVBFKGNxZV9mcF90eXBlKSk7CisjZW5kaWYKIAotCQkJCWlmIChUUEFfVFlQRShjcWVfZnBfZmxhZ3MpID09IFRQQV9UWVBFX1NUQVJUKSB7CisJCQkJaWYgKENRRV9UWVBFX1NUQVJUKGNxZV9mcF90eXBlKSkgeworCQkJCQl1MTYgcXVldWUgPSBjcWVfZnAtPnF1ZXVlX2luZGV4OwogCQkJCQlEUChORVRJRl9NU0dfUlhfU1RBVFVTLAogCQkJCQkgICAiY2FsbGluZyB0cGFfc3RhcnQgb24gcXVldWUgJWRcbiIsCiAJCQkJCSAgIHF1ZXVlKTsKIAogCQkJCQlibngyeF90cGFfc3RhcnQoZnAsIHF1ZXVlLCBza2IsCi0JCQkJCQkJYmRfY29ucywgYmRfcHJvZCk7CisJCQkJCQkJYmRfY29ucywgYmRfcHJvZCwKKwkJCQkJCQljcWVfZnApOwogCi0JCQkJCS8qIFNldCBUb2VwbGl0eiBoYXNoIGZvciBhbiBMUk8gc2tiICovCisJCQkJCS8qIFNldCBUb2VwbGl0eiBoYXNoIGZvciBMUk8gc2tiICovCiAJCQkJCWJueDJ4X3NldF9za2JfcnhoYXNoKGJwLCBjcWUsIHNrYik7CiAKIAkJCQkJZ290byBuZXh0X3J4OwotCQkJCX0gZWxzZSB7IC8qIFRQQV9TVE9QICovCisKKwkJCQl9IGVsc2UgeworCQkJCQl1MTYgcXVldWUgPQorCQkJCQkJY3FlLT5lbmRfYWdnX2NxZS5xdWV1ZV9pbmRleDsKIAkJCQkJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywKIAkJCQkJICAgImNhbGxpbmcgdHBhX3N0b3Agb24gcXVldWUgJWRcbiIsCiAJCQkJCSAgIHF1ZXVlKTsKIAotCQkJCQlpZiAoIUJOWDJYX1JYX1NVTV9GSVgoY3FlKSkKLQkJCQkJCUJOWDJYX0VSUigiU1RPUCBvbiBub25lIFRDUCAiCi0JCQkJCQkJICAiZGF0YVxuIik7Ci0KLQkJCQkJLyogVGhpcyBpcyBhIHNpemUgb2YgdGhlIGxpbmVhciBkYXRhCi0JCQkJCSAgIG9uIHRoaXMgc2tiICovCi0JCQkJCWxlbiA9IGxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS4KLQkJCQkJCQkJbGVuX29uX2JkKTsKLQkJCQkJYm54MnhfdHBhX3N0b3AoYnAsIGZwLCBxdWV1ZSwgcGFkLAotCQkJCQkJICAgIGxlbiwgY3FlLCBjb21wX3JpbmdfY29ucyk7CisJCQkJCWJueDJ4X3RwYV9zdG9wKGJwLCBmcCwgcXVldWUsCisJCQkJCQkgICAgICAgJmNxZS0+ZW5kX2FnZ19jcWUsCisJCQkJCQkgICAgICAgY29tcF9yaW5nX2NvbnMpOwogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKIAkJCQkJaWYgKGJwLT5wYW5pYykKIAkJCQkJCXJldHVybiAwOwogI2VuZGlmCiAKLQkJCQkJYm54MnhfdXBkYXRlX3NnZV9wcm9kKGZwLAotCQkJCQkJCSZjcWUtPmZhc3RfcGF0aF9jcWUpOworCQkJCQlibngyeF91cGRhdGVfc2dlX3Byb2QoZnAsIGNxZV9mcCk7CiAJCQkJCWdvdG8gbmV4dF9jcWU7CiAJCQkJfQogCQkJfQotCi0JCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgmYnAtPnBkZXYtPmRldiwKKwkJCS8qIG5vbiBUUEEgKi8KKwkJCWxlbiA9IGxlMTZfdG9fY3B1KGNxZV9mcC0+cGt0X2xlbik7CisJCQlwYWQgPSBjcWVfZnAtPnBsYWNlbWVudF9vZmZzZXQ7CisJCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdSgmYnAtPnBkZXYtPmRldiwKIAkJCQkJZG1hX3VubWFwX2FkZHIocnhfYnVmLCBtYXBwaW5nKSwKLQkJCQkJCSAgIHBhZCArIFJYX0NPUFlfVEhSRVNILAotCQkJCQkJICAgRE1BX0ZST01fREVWSUNFKTsKKwkJCQkJCSAgICAgICBwYWQgKyBSWF9DT1BZX1RIUkVTSCwKKwkJCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOwogCQkJcHJlZmV0Y2goKChjaGFyICopKHNrYikpICsgTDFfQ0FDSEVfQllURVMpOwogCiAJCQkvKiBpcyB0aGlzIGFuIGVycm9yIHBhY2tldD8gKi8KQEAgLTY0MCw4ICs2OTgsNyBAQAogCQkJICAgIChsZW4gPD0gUlhfQ09QWV9USFJFU0gpKSB7CiAJCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CiAKLQkJCQluZXdfc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LAotCQkJCQkJCSAgIGxlbiArIHBhZCk7CisJCQkJbmV3X3NrYiA9IG5ldGRldl9hbGxvY19za2IoYnAtPmRldiwgbGVuICsgcGFkKTsKIAkJCQlpZiAobmV3X3NrYiA9PSBOVUxMKSB7CiAJCQkJCURQKE5FVElGX01TR19SWF9FUlIsCiAJCQkJCSAgICJFUlJPUiAgcGFja2V0IGRyb3BwZWQgIgpAQCAtNjg3LDYgKzc0NCw3IEBACiAJCQlza2JfY2hlY2tzdW1fbm9uZV9hc3NlcnQoc2tiKTsKIAogCQkJaWYgKGJwLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pIHsKKwogCQkJCWlmIChsaWtlbHkoQk5YMlhfUlhfQ1NVTV9PSyhjcWUpKSkKIAkJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAkJCQllbHNlCkBAIC02OTYsMTAgKzc1NCwxMCBAQAogCiAJCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCBmcC0+aW5kZXgpOwogCi0JCWlmIChsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUucGFyc19mbGFncy5mbGFncykgJgotCQkgICAgIFBBUlNJTkdfRkxBR1NfVkxBTikKKwkJaWYgKGxlMTZfdG9fY3B1KGNxZV9mcC0+cGFyc19mbGFncy5mbGFncykgJgorCQkgICAgUEFSU0lOR19GTEFHU19WTEFOKQogCQkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsCi0JCQkJbGUxNl90b19jcHUoY3FlLT5mYXN0X3BhdGhfY3FlLnZsYW5fdGFnKSk7CisJCQkJCSAgICAgICBsZTE2X3RvX2NwdShjcWVfZnAtPnZsYW5fdGFnKSk7CiAJCW5hcGlfZ3JvX3JlY2VpdmUoJmZwLT5uYXBpLCBza2IpOwogCiAKQEAgLTczNywxMiArNzk1LDcgQEAKIHsKIAlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gZnBfY29va2llOwogCXN0cnVjdCBibngyeCAqYnAgPSBmcC0+YnA7Ci0KLQkvKiBSZXR1cm4gaGVyZSBpZiBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQgKi8KLQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmJwLT5pbnRyX3NlbSkgIT0gMCkpIHsKLQkJRFAoTkVUSUZfTVNHX0lOVFIsICJjYWxsZWQgYnV0IGludHJfc2VtIG5vdCAwLCByZXR1cm5pbmdcbiIpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQorCXU4IGNvczsKIAogCURQKEJOWDJYX01TR19GUCwgImdvdCBhbiBNU0ktWCBpbnRlcnJ1cHQgb24gSURYOlNCICIKIAkJCSAiW2ZwICVkIGZ3X3NkICVkIGlndXNiICVkXVxuIiwKQEAgLTc1Niw3ICs4MDksMTAgQEAKIAogCS8qIEhhbmRsZSBSeCBhbmQgVHggYWNjb3JkaW5nIHRvIE1TSS1YIHZlY3RvciAqLwogCXByZWZldGNoKGZwLT5yeF9jb25zX3NiKTsKLQlwcmVmZXRjaChmcC0+dHhfY29uc19zYik7CisKKwlmb3JfZWFjaF9jb3NfaW5fdHhfcXVldWUoZnAsIGNvcykKKwkJcHJlZmV0Y2goZnAtPnR4ZGF0YVtjb3NdLnR4X2NvbnNfc2IpOworCiAJcHJlZmV0Y2goJmZwLT5zYl9ydW5uaW5nX2luZGV4W1NNX1JYX0lEXSk7CiAJbmFwaV9zY2hlZHVsZSgmYm54MnhfZnAoYnAsIGZwLT5pbmRleCwgbmFwaSkpOwogCkBAIC05MzEsNyArOTg3LDcgQEAKIHsKIAlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOwogCWludCBtYXhfYWdnX3F1ZXVlcyA9IENISVBfSVNfRTEoYnApID8gRVRIX01BWF9BR0dSRUdBVElPTl9RVUVVRVNfRTEgOgotCQkJCQkgICAgICBFVEhfTUFYX0FHR1JFR0FUSU9OX1FVRVVFU19FMUg7CisJCQkJCSAgICAgIEVUSF9NQVhfQUdHUkVHQVRJT05fUVVFVUVTX0UxSF9FMjsKIAl1MTYgcmluZ19wcm9kOwogCWludCBpLCBqOwogCkBAIC05NDMsMTEgKzk5OSwxNiBAQAogCQkgICAibXR1ICVkICByeF9idWZfc2l6ZSAlZFxuIiwgYnAtPmRldi0+bXR1LCBmcC0+cnhfYnVmX3NpemUpOwogCiAJCWlmICghZnAtPmRpc2FibGVfdHBhKSB7Ci0JCQkvKiBGaWxsIHRoZSBwZXItYWdncmVnYXRpb24gcG9vbCAqLworCQkJLyogRmlsbCB0aGUgcGVyLWFnZ3JlZ3Rpb24gcG9vbCAqLwogCQkJZm9yIChpID0gMDsgaSA8IG1heF9hZ2dfcXVldWVzOyBpKyspIHsKLQkJCQlmcC0+dHBhX3Bvb2xbaV0uc2tiID0KLQkJCQkgICBuZXRkZXZfYWxsb2Nfc2tiKGJwLT5kZXYsIGZwLT5yeF9idWZfc2l6ZSk7Ci0JCQkJaWYgKCFmcC0+dHBhX3Bvb2xbaV0uc2tiKSB7CisJCQkJc3RydWN0IGJueDJ4X2FnZ19pbmZvICp0cGFfaW5mbyA9CisJCQkJCSZmcC0+dHBhX2luZm9baV07CisJCQkJc3RydWN0IHN3X3J4X2JkICpmaXJzdF9idWYgPQorCQkJCQkmdHBhX2luZm8tPmZpcnN0X2J1ZjsKKworCQkJCWZpcnN0X2J1Zi0+c2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LAorCQkJCQkJICAgICAgIGZwLT5yeF9idWZfc2l6ZSk7CisJCQkJaWYgKCFmaXJzdF9idWYtPnNrYikgewogCQkJCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBUUEEgIgogCQkJCQkJICAic2tiIHBvb2wgZm9yIHF1ZXVlWyVkXSAtICIKIAkJCQkJCSAgImRpc2FibGluZyBUUEEgb24gdGhpcyAiCkBAIC05NTYsMTAgKzEwMTcsOCBAQAogCQkJCQlmcC0+ZGlzYWJsZV90cGEgPSAxOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJZG1hX3VubWFwX2FkZHJfc2V0KChzdHJ1Y3Qgc3dfcnhfYmQgKikKLQkJCQkJCQkmYnAtPmZwLT50cGFfcG9vbFtpXSwKLQkJCQkJCSAgIG1hcHBpbmcsIDApOwotCQkJCWZwLT50cGFfc3RhdGVbaV0gPSBCTlgyWF9UUEFfU1RPUDsKKwkJCQlkbWFfdW5tYXBfYWRkcl9zZXQoZmlyc3RfYnVmLCBtYXBwaW5nLCAwKTsKKwkJCQl0cGFfaW5mby0+dHBhX3N0YXRlID0gQk5YMlhfVFBBX1NUT1A7CiAJCQl9CiAKIAkJCS8qICJuZXh0IHBhZ2UiIGVsZW1lbnRzIGluaXRpYWxpemF0aW9uICovCkBAIC05NzUsMTMgKzEwMzQsMTMgQEAKIAkJCQlpZiAoYm54MnhfYWxsb2Nfcnhfc2dlKGJwLCBmcCwgcmluZ19wcm9kKSA8IDApIHsKIAkJCQkJQk5YMlhfRVJSKCJ3YXMgb25seSBhYmxlIHRvIGFsbG9jYXRlICIKIAkJCQkJCSAgIiVkIHJ4IHNnZXNcbiIsIGkpOwotCQkJCQlCTlgyWF9FUlIoImRpc2FibGluZyBUUEEgZm9yIgotCQkJCQkJICAiIHF1ZXVlWyVkXVxuIiwgaik7CisJCQkJCUJOWDJYX0VSUigiZGlzYWJsaW5nIFRQQSBmb3IgIgorCQkJCQkJICAicXVldWVbJWRdXG4iLCBqKTsKIAkJCQkJLyogQ2xlYW51cCBhbHJlYWR5IGFsbG9jYXRlZCBlbGVtZW50cyAqLwotCQkJCQlibngyeF9mcmVlX3J4X3NnZV9yYW5nZShicCwKLQkJCQkJCQkJZnAsIHJpbmdfcHJvZCk7Ci0JCQkJCWJueDJ4X2ZyZWVfdHBhX3Bvb2woYnAsCi0JCQkJCQkJICAgIGZwLCBtYXhfYWdnX3F1ZXVlcyk7CisJCQkJCWJueDJ4X2ZyZWVfcnhfc2dlX3JhbmdlKGJwLCBmcCwKKwkJCQkJCQkJcmluZ19wcm9kKTsKKwkJCQkJYm54MnhfZnJlZV90cGFfcG9vbChicCwgZnAsCisJCQkJCQkJICAgIG1heF9hZ2dfcXVldWVzKTsKIAkJCQkJZnAtPmRpc2FibGVfdHBhID0gMTsKIAkJCQkJcmluZ19wcm9kID0gMDsKIAkJCQkJYnJlYWs7CkBAIC0xMDA5LDcgKzEwNjgsNyBAQAogCQlpZiAoaiAhPSAwKQogCQkJY29udGludWU7CiAKLQkJaWYgKCFDSElQX0lTX0UyKGJwKSkgeworCQlpZiAoQ0hJUF9JU19FMShicCkpIHsKIAkJCVJFR19XUihicCwgQkFSX1VTVFJPUk1fSU5UTUVNICsKIAkJCSAgICAgICBVU1RPUk1fTUVNX1dPUktBUk9VTkRfQUREUkVTU19PRkZTRVQoZnVuYyksCiAJCQkgICAgICAgVTY0X0xPKGZwLT5yeF9jb21wX21hcHBpbmcpKTsKQEAgLTEwMjMsMTcgKzEwODIsMjIgQEAKIHN0YXRpYyB2b2lkIGJueDJ4X2ZyZWVfdHhfc2ticyhzdHJ1Y3QgYm54MnggKmJwKQogewogCWludCBpOworCXU4IGNvczsKIAogCWZvcl9lYWNoX3R4X3F1ZXVlKGJwLCBpKSB7CiAJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOworCQlmb3JfZWFjaF9jb3NfaW5fdHhfcXVldWUoZnAsIGNvcykgeworCQkJc3RydWN0IGJueDJ4X2ZwX3R4ZGF0YSAqdHhkYXRhID0gJmZwLT50eGRhdGFbY29zXTsKIAotCQl1MTYgYmRfY29ucyA9IGZwLT50eF9iZF9jb25zOwotCQl1MTYgc3dfcHJvZCA9IGZwLT50eF9wa3RfcHJvZDsKLQkJdTE2IHN3X2NvbnMgPSBmcC0+dHhfcGt0X2NvbnM7CisJCQl1MTYgYmRfY29ucyA9IHR4ZGF0YS0+dHhfYmRfY29uczsKKwkJCXUxNiBzd19wcm9kID0gdHhkYXRhLT50eF9wa3RfcHJvZDsKKwkJCXUxNiBzd19jb25zID0gdHhkYXRhLT50eF9wa3RfY29uczsKIAotCQl3aGlsZSAoc3dfY29ucyAhPSBzd19wcm9kKSB7Ci0JCQliZF9jb25zID0gYm54MnhfZnJlZV90eF9wa3QoYnAsIGZwLCBUWF9CRChzd19jb25zKSk7Ci0JCQlzd19jb25zKys7CisJCQl3aGlsZSAoc3dfY29ucyAhPSBzd19wcm9kKSB7CisJCQkJYmRfY29ucyA9IGJueDJ4X2ZyZWVfdHhfcGt0KGJwLCB0eGRhdGEsCisJCQkJCQkJICAgIFRYX0JEKHN3X2NvbnMpKTsKKwkJCQlzd19jb25zKys7CisJCQl9CiAJCX0KIAl9CiB9CkBAIC0xMDUzLDcgKzExMTcsNiBAQAogCiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwotCiAJCWRtYV91bm1hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsCiAJCQkJIGRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCiAJCQkJIGZwLT5yeF9idWZfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKQEAgLTEwNzUsNyArMTEzOCw3IEBACiAJCWlmICghZnAtPmRpc2FibGVfdHBhKQogCQkJYm54MnhfZnJlZV90cGFfcG9vbChicCwgZnAsIENISVBfSVNfRTEoYnApID8KIAkJCQkJICAgIEVUSF9NQVhfQUdHUkVHQVRJT05fUVVFVUVTX0UxIDoKLQkJCQkJICAgIEVUSF9NQVhfQUdHUkVHQVRJT05fUVVFVUVTX0UxSCk7CisJCQkJCSAgICBFVEhfTUFYX0FHR1JFR0FUSU9OX1FVRVVFU19FMUhfRTIpOwogCX0KIH0KIApAQCAtMTEwMiwzMCArMTE2NSw0MyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYm54MnhfZnJlZV9tc2l4X2lycXMoc3RydWN0IGJueDJ4ICpicCkKKy8qKgorICogYm54MnhfZnJlZV9tc2l4X2lycXMgLSBmcmVlIHByZXZpb3VzbHkgcmVxdWVzdGVkIE1TSS1YIElSUSB2ZWN0b3JzCisgKgorICogQGJwOgkJZHJpdmVyIGhhbmRsZQorICogQG52ZWNzOgludW1iZXIgb2YgdmVjdG9ycyB0byBiZSByZWxlYXNlZAorICovCitzdGF0aWMgdm9pZCBibngyeF9mcmVlX21zaXhfaXJxcyhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgbnZlY3MpCiB7Ci0JaW50IGksIG9mZnNldCA9IDE7CisJaW50IGksIG9mZnNldCA9IDA7CiAKLQlmcmVlX2lycShicC0+bXNpeF90YWJsZVswXS52ZWN0b3IsIGJwLT5kZXYpOworCWlmIChudmVjcyA9PSBvZmZzZXQpCisJCXJldHVybjsKKwlmcmVlX2lycShicC0+bXNpeF90YWJsZVtvZmZzZXRdLnZlY3RvciwgYnAtPmRldik7CiAJRFAoTkVUSUZfTVNHX0lGRE9XTiwgInJlbGVhc2VkIHNwIGlycSAoJWQpXG4iLAotCSAgIGJwLT5tc2l4X3RhYmxlWzBdLnZlY3Rvcik7Ci0KKwkgICBicC0+bXNpeF90YWJsZVtvZmZzZXRdLnZlY3Rvcik7CisJb2Zmc2V0Kys7CiAjaWZkZWYgQkNNX0NOSUMKKwlpZiAobnZlY3MgPT0gb2Zmc2V0KQorCQlyZXR1cm47CiAJb2Zmc2V0Kys7CiAjZW5kaWYKLQlmb3JfZWFjaF9ldGhfcXVldWUoYnAsIGkpIHsKLQkJRFAoTkVUSUZfTVNHX0lGRE9XTiwgImFib3V0IHRvIHJlbGVhc2UgZnAgIyVkLT4lZCBpcnEgICIKLQkJICAgInN0YXRlICV4XG4iLCBpLCBicC0+bXNpeF90YWJsZVtpICsgb2Zmc2V0XS52ZWN0b3IsCi0JCSAgIGJueDJ4X2ZwKGJwLCBpLCBzdGF0ZSkpOwogCi0JCWZyZWVfaXJxKGJwLT5tc2l4X3RhYmxlW2kgKyBvZmZzZXRdLnZlY3RvciwgJmJwLT5mcFtpXSk7CisJZm9yX2VhY2hfZXRoX3F1ZXVlKGJwLCBpKSB7CisJCWlmIChudmVjcyA9PSBvZmZzZXQpCisJCQlyZXR1cm47CisJCURQKE5FVElGX01TR19JRkRPV04sICJhYm91dCB0byByZWxlYXNlIGZwICMlZC0+JWQgIgorCQkgICAiaXJxXG4iLCBpLCBicC0+bXNpeF90YWJsZVtvZmZzZXRdLnZlY3Rvcik7CisKKwkJZnJlZV9pcnEoYnAtPm1zaXhfdGFibGVbb2Zmc2V0KytdLnZlY3RvciwgJmJwLT5mcFtpXSk7CiAJfQogfQogCiB2b2lkIGJueDJ4X2ZyZWVfaXJxKHN0cnVjdCBibngyeCAqYnApCiB7CiAJaWYgKGJwLT5mbGFncyAmIFVTSU5HX01TSVhfRkxBRykKLQkJYm54MnhfZnJlZV9tc2l4X2lycXMoYnApOworCQlibngyeF9mcmVlX21zaXhfaXJxcyhicCwgQk5YMlhfTlVNX0VUSF9RVUVVRVMoYnApICsKKwkJCQkgICAgIENOSUNfUFJFU0VOVCArIDEpOwogCWVsc2UgaWYgKGJwLT5mbGFncyAmIFVTSU5HX01TSV9GTEFHKQogCQlmcmVlX2lycShicC0+cGRldi0+aXJxLCBicC0+ZGV2KTsKIAllbHNlCkBAIC0xMTQ3LDYgKzEyMjMsNyBAQAogCSAgIGJwLT5tc2l4X3RhYmxlW21zaXhfdmVjXS5lbnRyeSwgYnAtPm1zaXhfdGFibGVbbXNpeF92ZWNdLmVudHJ5KTsKIAltc2l4X3ZlYysrOwogI2VuZGlmCisJLyogV2UgbmVlZCBzZXBhcmF0ZSB2ZWN0b3JzIGZvciBFVEggcXVldWVzIG9ubHkgKG5vdCBGQ29FKSAqLwogCWZvcl9lYWNoX2V0aF9xdWV1ZShicCwgaSkgewogCQlicC0+bXNpeF90YWJsZVttc2l4X3ZlY10uZW50cnkgPSBtc2l4X3ZlYzsKIAkJRFAoTkVUSUZfTVNHX0lGVVAsICJtc2l4X3RhYmxlWyVkXS5lbnRyeSA9ICVkICIKQEAgLTExNTQsNyArMTIzMSw3IEBACiAJCW1zaXhfdmVjKys7CiAJfQogCi0JcmVxX2NudCA9IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKSArIENOSUNfQ09OVEVYVF9VU0UgKyAxOworCXJlcV9jbnQgPSBCTlgyWF9OVU1fRVRIX1FVRVVFUyhicCkgKyBDTklDX1BSRVNFTlQgKyAxOwogCiAJcmMgPSBwY2lfZW5hYmxlX21zaXgoYnAtPnBkZXYsICZicC0+bXNpeF90YWJsZVswXSwgcmVxX2NudCk7CiAKQEAgLTExOTgsOSArMTI3NSwxMCBAQAogCiBzdGF0aWMgaW50IGJueDJ4X3JlcV9tc2l4X2lycXMoc3RydWN0IGJueDJ4ICpicCkKIHsKLQlpbnQgaSwgcmMsIG9mZnNldCA9IDE7CisJaW50IGksIHJjLCBvZmZzZXQgPSAwOwogCi0JcmMgPSByZXF1ZXN0X2lycShicC0+bXNpeF90YWJsZVswXS52ZWN0b3IsIGJueDJ4X21zaXhfc3BfaW50LCAwLAorCXJjID0gcmVxdWVzdF9pcnEoYnAtPm1zaXhfdGFibGVbb2Zmc2V0KytdLnZlY3RvciwKKwkJCSBibngyeF9tc2l4X3NwX2ludCwgMCwKIAkJCSBicC0+ZGV2LT5uYW1lLCBicC0+ZGV2KTsKIAlpZiAocmMpIHsKIAkJQk5YMlhfRVJSKCJyZXF1ZXN0IHNwIGlycSBmYWlsZWRcbiIpOwpAQCAtMTIxOCwxNyArMTI5NiwxNyBAQAogCQlyYyA9IHJlcXVlc3RfaXJxKGJwLT5tc2l4X3RhYmxlW29mZnNldF0udmVjdG9yLAogCQkJCSBibngyeF9tc2l4X2ZwX2ludCwgMCwgZnAtPm5hbWUsIGZwKTsKIAkJaWYgKHJjKSB7Ci0JCQlCTlgyWF9FUlIoInJlcXVlc3QgZnAgIyVkIGlycSBmYWlsZWQgIHJjICVkXG4iLCBpLCByYyk7Ci0JCQlibngyeF9mcmVlX21zaXhfaXJxcyhicCk7CisJCQlCTlgyWF9FUlIoInJlcXVlc3QgZnAgIyVkIGlycSAoJWQpIGZhaWxlZCAgcmMgJWRcbiIsIGksCisJCQkgICAgICBicC0+bXNpeF90YWJsZVtvZmZzZXRdLnZlY3RvciwgcmMpOworCQkJYm54MnhfZnJlZV9tc2l4X2lycXMoYnAsIG9mZnNldCk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAKIAkJb2Zmc2V0Kys7Ci0JCWZwLT5zdGF0ZSA9IEJOWDJYX0ZQX1NUQVRFX0lSUTsKIAl9CiAKIAlpID0gQk5YMlhfTlVNX0VUSF9RVUVVRVMoYnApOwotCW9mZnNldCA9IDEgKyBDTklDX0NPTlRFWFRfVVNFOworCW9mZnNldCA9IDEgKyBDTklDX1BSRVNFTlQ7CiAJbmV0ZGV2X2luZm8oYnAtPmRldiwgInVzaW5nIE1TSS1YICBJUlFzOiBzcCAlZCAgZnBbJWRdICVkIgogCSAgICAgICAiIC4uLiBmcFslZF0gJWRcbiIsCiAJICAgICAgIGJwLT5tc2l4X3RhYmxlWzBdLnZlY3RvciwKQEAgLTEyNjQsNDIgKzEzNDIsNTYgQEAKIAogCXJjID0gcmVxdWVzdF9pcnEoYnAtPnBkZXYtPmlycSwgYm54MnhfaW50ZXJydXB0LCBmbGFncywKIAkJCSBicC0+ZGV2LT5uYW1lLCBicC0+ZGV2KTsKLQlpZiAoIXJjKQotCQlibngyeF9mcChicCwgMCwgc3RhdGUpID0gQk5YMlhfRlBfU1RBVEVfSVJROwotCiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBibngyeF9uYXBpX2VuYWJsZShzdHJ1Y3QgYm54MnggKmJwKQorc3RhdGljIGlubGluZSBpbnQgYm54Mnhfc2V0dXBfaXJxcyhzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCByYyA9IDA7CisJaWYgKGJwLT5mbGFncyAmIFVTSU5HX01TSVhfRkxBRykgeworCQlyYyA9IGJueDJ4X3JlcV9tc2l4X2lycXMoYnApOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfSBlbHNlIHsKKwkJYm54MnhfYWNrX2ludChicCk7CisJCXJjID0gYm54MnhfcmVxX2lycShicCk7CisJCWlmIChyYykgeworCQkJQk5YMlhfRVJSKCJJUlEgcmVxdWVzdCBmYWlsZWQgIHJjICVkLCBhYm9ydGluZ1xuIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJCWlmIChicC0+ZmxhZ3MgJiBVU0lOR19NU0lfRkxBRykgeworCQkJYnAtPmRldi0+aXJxID0gYnAtPnBkZXYtPmlycTsKKwkJCW5ldGRldl9pbmZvKGJwLT5kZXYsICJ1c2luZyBNU0kgIElSUSAlZFxuIiwKKwkJCSAgICAgICBicC0+cGRldi0+aXJxKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfbmFwaV9lbmFibGUoc3RydWN0IGJueDJ4ICpicCkKIHsKIAlpbnQgaTsKIAotCWZvcl9lYWNoX25hcGlfcXVldWUoYnAsIGkpCisJZm9yX2VhY2hfcnhfcXVldWUoYnAsIGkpCiAJCW5hcGlfZW5hYmxlKCZibngyeF9mcChicCwgaSwgbmFwaSkpOwogfQogCi1zdGF0aWMgdm9pZCBibngyeF9uYXBpX2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9uYXBpX2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCkKIHsKIAlpbnQgaTsKIAotCWZvcl9lYWNoX25hcGlfcXVldWUoYnAsIGkpCisJZm9yX2VhY2hfcnhfcXVldWUoYnAsIGkpCiAJCW5hcGlfZGlzYWJsZSgmYm54MnhfZnAoYnAsIGksIG5hcGkpKTsKIH0KIAogdm9pZCBibngyeF9uZXRpZl9zdGFydChzdHJ1Y3QgYm54MnggKmJwKQogewotCWludCBpbnRyX3NlbTsKLQotCWludHJfc2VtID0gYXRvbWljX2RlY19hbmRfdGVzdCgmYnAtPmludHJfc2VtKTsKLQlzbXBfd21iKCk7IC8qIEVuc3VyZSB0aGF0IGJwLT5pbnRyX3NlbSB1cGRhdGUgaXMgU01QLXNhZmUgKi8KLQotCWlmIChpbnRyX3NlbSkgewotCQlpZiAobmV0aWZfcnVubmluZyhicC0+ZGV2KSkgewotCQkJYm54MnhfbmFwaV9lbmFibGUoYnApOwotCQkJYm54MnhfaW50X2VuYWJsZShicCk7Ci0JCQlpZiAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX09QRU4pCi0JCQkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKGJwLT5kZXYpOwotCQl9CisJaWYgKG5ldGlmX3J1bm5pbmcoYnAtPmRldikpIHsKKwkJYm54MnhfbmFwaV9lbmFibGUoYnApOworCQlibngyeF9pbnRfZW5hYmxlKGJwKTsKKwkJaWYgKGJwLT5zdGF0ZSA9PSBCTlgyWF9TVEFURV9PUEVOKQorCQkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKGJwLT5kZXYpOwogCX0KIH0KIApAQCAtMTMwNywxMyArMTM5OSwxMiBAQAogewogCWJueDJ4X2ludF9kaXNhYmxlX3N5bmMoYnAsIGRpc2FibGVfaHcpOwogCWJueDJ4X25hcGlfZGlzYWJsZShicCk7Ci0JbmV0aWZfdHhfZGlzYWJsZShicC0+ZGV2KTsKIH0KIAogdTE2IGJueDJ4X3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotI2lmZGVmIEJDTV9DTklDCiAJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisjaWZkZWYgQkNNX0NOSUMKIAlpZiAoTk9fRkNPRShicCkpCiAJCXJldHVybiBza2JfdHhfaGFzaChkZXYsIHNrYik7CiAJZWxzZSB7CkBAIC0xMzMwLDEzICsxNDIxLDEyIEBACiAKIAkJLyogSWYgZXRoZXJ0eXBlIGlzIEZDb0Ugb3IgRklQIC0gdXNlIEZDb0UgcmluZyAqLwogCQlpZiAoKGV0aGVyX3R5cGUgPT0gRVRIX1BfRkNPRSkgfHwgKGV0aGVyX3R5cGUgPT0gRVRIX1BfRklQKSkKLQkJCXJldHVybiBibngyeF9mY29lKGJwLCBpbmRleCk7CisJCQlyZXR1cm4gYm54MnhfZmNvZV90eChicCwgdHhxX2luZGV4KTsKIAl9CiAjZW5kaWYKIAkvKiBTZWxlY3QgYSBub25lLUZDb0UgcXVldWU6ICBpZiBGQ29FIGlzIGVuYWJsZWQsIGV4Y2x1ZGUgRkNvRSBMMiByaW5nCiAJICovCi0JcmV0dXJuIF9fc2tiX3R4X2hhc2goZGV2LCBza2IsCi0JCQlkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyAtIEZDT0VfQ09OVEVYVF9VU0UpOworCXJldHVybiBfX3NrYl90eF9oYXNoKGRldiwgc2tiLCBCTlgyWF9OVU1fRVRIX1FVRVVFUyhicCkpOwogfQogCiB2b2lkIGJueDJ4X3NldF9udW1fcXVldWVzKHN0cnVjdCBibngyeCAqYnApCkBAIC0xMzU1LDQwICsxNDQ1LDM4IEBACiAJfQogCiAJLyogQWRkIHNwZWNpYWwgcXVldWVzICovCi0JYnAtPm51bV9xdWV1ZXMgKz0gTk9ORV9FVEhfQ09OVEVYVF9VU0U7Ci19Ci0KLSNpZmRlZiBCQ01fQ05JQwotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3NldF9mY29lX2V0aF9tYWNzKHN0cnVjdCBibngyeCAqYnApCi17Ci0JaWYgKCFOT19GQ09FKGJwKSkgewotCQlpZiAoIUlTX01GX1NEKGJwKSkKLQkJCWJueDJ4X3NldF9maXBfZXRoX21hY19hZGRyKGJwLCAxKTsKLQkJYm54Mnhfc2V0X2FsbF9lbm9kZV9tYWNzKGJwLCAxKTsKLQkJYnAtPmZsYWdzIHw9IEZDT0VfTUFDU19TRVQ7Ci0JfQotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGJueDJ4X3JlbGVhc2VfZmlybXdhcmUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlrZnJlZShicC0+aW5pdF9vcHNfb2Zmc2V0cyk7Ci0Ja2ZyZWUoYnAtPmluaXRfb3BzKTsKLQlrZnJlZShicC0+aW5pdF9kYXRhKTsKLQlyZWxlYXNlX2Zpcm13YXJlKGJwLT5maXJtd2FyZSk7CisJYnAtPm51bV9xdWV1ZXMgKz0gTk9OX0VUSF9DT05URVhUX1VTRTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYm54Mnhfc2V0X3JlYWxfbnVtX3F1ZXVlcyhzdHJ1Y3QgYm54MnggKmJwKQogewotCWludCByYywgbnVtID0gYnAtPm51bV9xdWV1ZXM7CisJaW50IHJjLCB0eCwgcng7CiAKKwl0eCA9IE1BWF9UWFFTX1BFUl9DT1MgKiBicC0+bWF4X2NvczsKKwlyeCA9IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKTsKKworLyogYWNjb3VudCBmb3IgZmNvZSBxdWV1ZSAqLwogI2lmZGVmIEJDTV9DTklDCi0JaWYgKE5PX0ZDT0UoYnApKQotCQludW0gLT0gRkNPRV9DT05URVhUX1VTRTsKLQorCWlmICghTk9fRkNPRShicCkpIHsKKwkJcnggKz0gRkNPRV9QUkVTRU5UOworCQl0eCArPSBGQ09FX1BSRVNFTlQ7CisJfQogI2VuZGlmCi0JbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhicC0+ZGV2LCBudW0pOwotCXJjID0gbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhicC0+ZGV2LCBudW0pOworCisJcmMgPSBuZXRpZl9zZXRfcmVhbF9udW1fdHhfcXVldWVzKGJwLT5kZXYsIHR4KTsKKwlpZiAocmMpIHsKKwkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gc2V0IHJlYWwgbnVtYmVyIG9mIFR4IHF1ZXVlczogJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyYyA9IG5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMoYnAtPmRldiwgcngpOworCWlmIChyYykgeworCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBzZXQgcmVhbCBudW1iZXIgb2YgUnggcXVldWVzOiAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJRFAoTkVUSUZfTVNHX0RSViwgIlNldHRpbmcgcmVhbCBudW0gcXVldWVzIHRvICh0eCwgcngpICglZCwgJWQpXG4iLAorCQkJICB0eCwgcngpOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNDA5LDI3ICsxNDk3LDE5OCBAQAogCQkJICovCiAJCQlmcC0+cnhfYnVmX3NpemUgPQogCQkJCUJOWDJYX0ZDT0VfTUlOSV9KVU1CT19NVFUgKyBFVEhfT1ZSRUhFQUQgKwotCQkJCUJOWDJYX1JYX0FMSUdOICsgSVBfSEVBREVSX0FMSUdOTUVOVF9QQURESU5HOworCQkJCUJOWDJYX0ZXX1JYX0FMSUdOICsgSVBfSEVBREVSX0FMSUdOTUVOVF9QQURESU5HOwogCQllbHNlCiAJCQlmcC0+cnhfYnVmX3NpemUgPQotCQkJCWJwLT5kZXYtPm10dSArIEVUSF9PVlJFSEVBRCArIEJOWDJYX1JYX0FMSUdOICsKLQkJCQlJUF9IRUFERVJfQUxJR05NRU5UX1BBRERJTkc7CisJCQkJYnAtPmRldi0+bXR1ICsgRVRIX09WUkVIRUFEICsKKwkJCQlCTlgyWF9GV19SWF9BTElHTiArIElQX0hFQURFUl9BTElHTk1FTlRfUEFERElORzsKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2luaXRfcnNzX3BmKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGk7CisJdTggaW5kX3RhYmxlW1RfRVRIX0lORElSRUNUSU9OX1RBQkxFX1NJWkVdID0gezB9OworCXU4IG51bV9ldGhfcXVldWVzID0gQk5YMlhfTlVNX0VUSF9RVUVVRVMoYnApOworCisJLyoKKwkgKiBQcmVwYXJlIHRoZSBpbml0YWwgY29udGVudHMgZm8gdGhlIGluZGlyZWN0aW9uIHRhYmxlIGlmIFJTUyBpcworCSAqIGVuYWJsZWQKKwkgKi8KKwlpZiAoYnAtPm11bHRpX21vZGUgIT0gRVRIX1JTU19NT0RFX0RJU0FCTEVEKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaW5kX3RhYmxlKTsgaSsrKQorCQkJaW5kX3RhYmxlW2ldID0KKwkJCQlicC0+ZnAtPmNsX2lkICsJKGkgJSBudW1fZXRoX3F1ZXVlcyk7CisJfQorCisJLyoKKwkgKiBGb3IgNTc3MTAgYW5kIDU3NzExIFNFQVJDSEVSIGNvbmZpZ3VyYXRpb24gKHJzc19rZXlzKSBpcworCSAqIHBlci1wb3J0LCBzbyBpZiBleHBsaWNpdCBjb25maWd1cmF0aW9uIGlzIG5lZWRlZCAsIGRvIGl0IG9ubHkKKwkgKiBmb3IgYSBQTUYuCisJICoKKwkgKiBGb3IgNTc3MTIgYW5kIG5ld2VyIG9uIHRoZSBvdGhlciBoYW5kIGl0J3MgYSBwZXItZnVuY3Rpb24KKwkgKiBjb25maWd1cmF0aW9uLgorCSAqLworCXJldHVybiBibngyeF9jb25maWdfcnNzX3BmKGJwLCBpbmRfdGFibGUsCisJCQkJICAgYnAtPnBvcnQucG1mIHx8ICFDSElQX0lTX0UxeChicCkpOworfQorCitpbnQgYm54MnhfY29uZmlnX3Jzc19wZihzdHJ1Y3QgYm54MnggKmJwLCB1OCAqaW5kX3RhYmxlLCBib29sIGNvbmZpZ19oYXNoKQoreworCXN0cnVjdCBibngyeF9jb25maWdfcnNzX3BhcmFtcyBwYXJhbXMgPSB7MH07CisJaW50IGk7CisKKwkvKiBBbHRob3VnaCBSU1MgaXMgbWVhbmluZ2xlc3Mgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSBIVyBxdWV1ZSB3ZQorCSAqIHN0aWxsIG5lZWQgaXQgZW5hYmxlZCBpbiBvcmRlciB0byBoYXZlIEhXIFJ4IGhhc2ggZ2VuZXJhdGVkLgorCSAqCisJICogaWYgKCFpc19ldGhfbXVsdGkoYnApKQorCSAqICAgICAgYnAtPm11bHRpX21vZGUgPSBFVEhfUlNTX01PREVfRElTQUJMRUQ7CisJICovCisKKwlwYXJhbXMucnNzX29iaiA9ICZicC0+cnNzX2NvbmZfb2JqOworCisJX19zZXRfYml0KFJBTVJPRF9DT01QX1dBSVQsICZwYXJhbXMucmFtcm9kX2ZsYWdzKTsKKworCS8qIFJTUyBtb2RlICovCisJc3dpdGNoIChicC0+bXVsdGlfbW9kZSkgeworCWNhc2UgRVRIX1JTU19NT0RFX0RJU0FCTEVEOgorCQlfX3NldF9iaXQoQk5YMlhfUlNTX01PREVfRElTQUJMRUQsICZwYXJhbXMucnNzX2ZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhfUlNTX01PREVfUkVHVUxBUjoKKwkJX19zZXRfYml0KEJOWDJYX1JTU19NT0RFX1JFR1VMQVIsICZwYXJhbXMucnNzX2ZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhfUlNTX01PREVfVkxBTl9QUkk6CisJCV9fc2V0X2JpdChCTlgyWF9SU1NfTU9ERV9WTEFOX1BSSSwgJnBhcmFtcy5yc3NfZmxhZ3MpOworCQlicmVhazsKKwljYXNlIEVUSF9SU1NfTU9ERV9FMUhPVl9QUkk6CisJCV9fc2V0X2JpdChCTlgyWF9SU1NfTU9ERV9FMUhPVl9QUkksICZwYXJhbXMucnNzX2ZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhfUlNTX01PREVfSVBfRFNDUDoKKwkJX19zZXRfYml0KEJOWDJYX1JTU19NT0RFX0lQX0RTQ1AsICZwYXJhbXMucnNzX2ZsYWdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQk5YMlhfRVJSKCJVbmtub3duIG11bHRpX21vZGU6ICVkXG4iLCBicC0+bXVsdGlfbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElmIFJTUyBpcyBlbmFibGVkICovCisJaWYgKGJwLT5tdWx0aV9tb2RlICE9IEVUSF9SU1NfTU9ERV9ESVNBQkxFRCkgeworCQkvKiBSU1MgY29uZmlndXJhdGlvbiAqLworCQlfX3NldF9iaXQoQk5YMlhfUlNTX0lQVjQsICZwYXJhbXMucnNzX2ZsYWdzKTsKKwkJX19zZXRfYml0KEJOWDJYX1JTU19JUFY0X1RDUCwgJnBhcmFtcy5yc3NfZmxhZ3MpOworCQlfX3NldF9iaXQoQk5YMlhfUlNTX0lQVjYsICZwYXJhbXMucnNzX2ZsYWdzKTsKKwkJX19zZXRfYml0KEJOWDJYX1JTU19JUFY2X1RDUCwgJnBhcmFtcy5yc3NfZmxhZ3MpOworCisJCS8qIEhhc2ggYml0cyAqLworCQlwYXJhbXMucnNzX3Jlc3VsdF9tYXNrID0gTVVMVElfTUFTSzsKKworCQltZW1jcHkocGFyYW1zLmluZF90YWJsZSwgaW5kX3RhYmxlLCBzaXplb2YocGFyYW1zLmluZF90YWJsZSkpOworCisJCWlmIChjb25maWdfaGFzaCkgeworCQkJLyogUlNTIGtleXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocGFyYW1zLnJzc19rZXkpIC8gNDsgaSsrKQorCQkJCXBhcmFtcy5yc3Nfa2V5W2ldID0gcmFuZG9tMzIoKTsKKworCQkJX19zZXRfYml0KEJOWDJYX1JTU19TRVRfU1JDSCwgJnBhcmFtcy5yc3NfZmxhZ3MpOworCQl9CisJfQorCisJcmV0dXJuIGJueDJ4X2NvbmZpZ19yc3MoYnAsICZwYXJhbXMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBibngyeF9pbml0X2h3KHN0cnVjdCBibngyeCAqYnAsIHUzMiBsb2FkX2NvZGUpCit7CisJc3RydWN0IGJueDJ4X2Z1bmNfc3RhdGVfcGFyYW1zIGZ1bmNfcGFyYW1zID0gezB9OworCisJLyogUHJlcGFyZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbiBzdGF0ZSB0cmFuc2l0aW9ucyAqLworCV9fc2V0X2JpdChSQU1ST0RfQ09NUF9XQUlULCAmZnVuY19wYXJhbXMucmFtcm9kX2ZsYWdzKTsKKworCWZ1bmNfcGFyYW1zLmZfb2JqID0gJmJwLT5mdW5jX29iajsKKwlmdW5jX3BhcmFtcy5jbWQgPSBCTlgyWF9GX0NNRF9IV19JTklUOworCisJZnVuY19wYXJhbXMucGFyYW1zLmh3X2luaXQubG9hZF9waGFzZSA9IGxvYWRfY29kZTsKKworCXJldHVybiBibngyeF9mdW5jX3N0YXRlX2NoYW5nZShicCwgJmZ1bmNfcGFyYW1zKTsKK30KKworLyoKKyAqIENsZWFucyB0aGUgb2JqZWN0IHRoYXQgaGF2ZSBpbnRlcm5hbCBsaXN0cyB3aXRob3V0IHNlbmRpbmcKKyAqIHJhbXJvZHMuIFNob3VsZCBiZSBydW4gd2hlbiBpbnRlcnJ1dHBzIGFyZSBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgYm54Mnhfc3F1ZWV6ZV9vYmplY3RzKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgcmFtcm9kX2ZsYWdzID0gMCwgdmxhbl9tYWNfZmxhZ3MgPSAwOworCXN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zIHJwYXJhbSA9IHswfTsKKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICptYWNfb2JqID0gJmJwLT5mcC0+bWFjX29iajsKKworCS8qKioqKioqKioqKioqKioqKiBDbGVhbnVwIE1BQ3MnIG9iamVjdCBmaXJzdCAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyogV2FpdCBmb3IgY29tcGxldGlvbiBvZiByZXF1ZXN0ZWQgKi8KKwlfX3NldF9iaXQoUkFNUk9EX0NPTVBfV0FJVCwgJnJhbXJvZF9mbGFncyk7CisJLyogUGVyZm9ybSBhIGRyeSBjbGVhbnVwICovCisJX19zZXRfYml0KFJBTVJPRF9EUlZfQ0xSX09OTFksICZyYW1yb2RfZmxhZ3MpOworCisJLyogQ2xlYW4gRVRIIHByaW1hcnkgTUFDICovCisJX19zZXRfYml0KEJOWDJYX0VUSF9NQUMsICZ2bGFuX21hY19mbGFncyk7CisJcmMgPSBtYWNfb2JqLT5kZWxldGVfYWxsKGJwLCAmYnAtPmZwLT5tYWNfb2JqLCAmdmxhbl9tYWNfZmxhZ3MsCisJCQkJICZyYW1yb2RfZmxhZ3MpOworCWlmIChyYyAhPSAwKQorCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBjbGVhbiBFVEggTUFDczogJWRcbiIsIHJjKTsKKworCS8qIENsZWFudXAgVUMgbGlzdCAqLworCXZsYW5fbWFjX2ZsYWdzID0gMDsKKwlfX3NldF9iaXQoQk5YMlhfVUNfTElTVF9NQUMsICZ2bGFuX21hY19mbGFncyk7CisJcmMgPSBtYWNfb2JqLT5kZWxldGVfYWxsKGJwLCBtYWNfb2JqLCAmdmxhbl9tYWNfZmxhZ3MsCisJCQkJICZyYW1yb2RfZmxhZ3MpOworCWlmIChyYyAhPSAwKQorCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBjbGVhbiBVQyBsaXN0IE1BQ3M6ICVkXG4iLCByYyk7CisKKwkvKioqKioqKioqKioqKioqKiogTm93IGNsZWFuIG1jYXN0IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlycGFyYW0ubWNhc3Rfb2JqID0gJmJwLT5tY2FzdF9vYmo7CisJX19zZXRfYml0KFJBTVJPRF9EUlZfQ0xSX09OTFksICZycGFyYW0ucmFtcm9kX2ZsYWdzKTsKKworCS8qIEFkZCBhIERFTCBjb21tYW5kLi4uICovCisJcmMgPSBibngyeF9jb25maWdfbWNhc3QoYnAsICZycGFyYW0sIEJOWDJYX01DQVNUX0NNRF9ERUwpOworCWlmIChyYyA8IDApCisJCUJOWDJYX0VSUigiRmFpbGVkIHRvIGFkZCBhIG5ldyBERUwgY29tbWFuZCB0byBhIG11bHRpLWNhc3QgIgorCQkJICAib2JqZWN0OiAlZFxuIiwgcmMpOworCisJLyogLi4uYW5kIHdhaXQgdW50aWwgYWxsIHBlbmRpbmcgY29tbWFuZHMgYXJlIGNsZWFyZWQgKi8KKwlyYyA9IGJueDJ4X2NvbmZpZ19tY2FzdChicCwgJnJwYXJhbSwgQk5YMlhfTUNBU1RfQ01EX0NPTlQpOworCXdoaWxlIChyYyAhPSAwKSB7CisJCWlmIChyYyA8IDApIHsKKwkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIGNsZWFuIG11bHRpLWNhc3Qgb2JqZWN0OiAlZFxuIiwKKwkJCQkgIHJjKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXJjID0gYm54MnhfY29uZmlnX21jYXN0KGJwLCAmcnBhcmFtLCBCTlgyWF9NQ0FTVF9DTURfQ09OVCk7CisJfQorfQorCisjaWZuZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKyNkZWZpbmUgTE9BRF9FUlJPUl9FWElUKGJwLCBsYWJlbCkgXAorCWRvIHsgXAorCQkoYnApLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX0VSUk9SOyBcCisJCWdvdG8gbGFiZWw7IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgTE9BRF9FUlJPUl9FWElUKGJwLCBsYWJlbCkgXAorCWRvIHsgXAorCQkoYnApLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX0VSUk9SOyBcCisJCShicCktPnBhbmljID0gMTsgXAorCQlyZXR1cm4gLUVCVVNZOyBcCisJfSB3aGlsZSAoMCkKKyNlbmRpZgorCiAvKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHJ0bmxfbG9jayAqLwogaW50IGJueDJ4X25pY19sb2FkKHN0cnVjdCBibngyeCAqYnAsIGludCBsb2FkX21vZGUpCiB7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKIAl1MzIgbG9hZF9jb2RlOwogCWludCBpLCByYzsKIAotCS8qIFNldCBpbml0IGFycmF5cyAqLwotCXJjID0gYm54MnhfaW5pdF9maXJtd2FyZShicCk7Ci0JaWYgKHJjKSB7Ci0JCUJOWDJYX0VSUigiRXJyb3IgbG9hZGluZyBmaXJtd2FyZVxuIik7Ci0JCXJldHVybiByYzsKLQl9Ci0KICNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCiAJaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpCiAJCXJldHVybiAtRVBFUk07CkBAIC0xNDQ3LDI0ICsxNzA2LDE4IEBACiAJLyogbXVzdCBiZSBjYWxsZWQgYmVmb3JlIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBIVyBpbml0ICovCiAJYm54MnhfaWx0X3NldF9pbmZvKGJwKTsKIAotCS8qIHplcm8gZmFzdHBhdGggc3RydWN0dXJlcyBwcmVzZXJ2aW5nIGludmFyaWFudHMgbGlrZSBuYXBpIHdoaWNoIGFyZQotCSAqIGFsbG9jYXRlZCBvbmx5IG9uY2UKKwkvKgorCSAqIFplcm8gZmFzdHBhdGggc3RydWN0dXJlcyBwcmVzZXJ2aW5nIGludmFyaWFudHMgbGlrZSBuYXBpLCB3aGljaCBhcmUKKwkgKiBhbGxvY2F0ZWQgb25seSBvbmNlLCBmcCBpbmRleCwgbWF4X2NvcywgYnAgcG9pbnRlci4KKwkgKiBBbHNvIHNldCBmcC0+ZGlzYWJsZV90cGEuCiAJICovCiAJZm9yX2VhY2hfcXVldWUoYnAsIGkpCiAJCWJueDJ4X2J6X2ZwKGJwLCBpKTsKIAorCiAJLyogU2V0IHRoZSByZWNlaXZlIHF1ZXVlcyBidWZmZXIgc2l6ZSAqLwogCWJueDJ4X3NldF9yeF9idWZfc2l6ZShicCk7CiAKLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkKLQkJYm54MnhfZnAoYnAsIGksIGRpc2FibGVfdHBhKSA9Ci0JCQkJCSgoYnAtPmZsYWdzICYgVFBBX0VOQUJMRV9GTEFHKSA9PSAwKTsKLQotI2lmZGVmIEJDTV9DTklDCi0JLyogV2UgZG9uJ3Qgd2FudCBUUEEgb24gRkNvRSBMMiByaW5nICovCi0JYm54MnhfZmNvZShicCwgZGlzYWJsZV90cGEpID0gMTsKLSNlbmRpZgotCiAJaWYgKGJueDJ4X2FsbG9jX21lbShicCkpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNDc1LDMxICsxNzI4LDM2IEBACiAJcmMgPSBibngyeF9zZXRfcmVhbF9udW1fcXVldWVzKGJwKTsKIAlpZiAocmMpIHsKIAkJQk5YMlhfRVJSKCJVbmFibGUgdG8gc2V0IHJlYWxfbnVtX3F1ZXVlc1xuIik7Ci0JCWdvdG8gbG9hZF9lcnJvcjA7CisJCUxPQURfRVJST1JfRVhJVChicCwgbG9hZF9lcnJvcjApOwogCX0KIAorCS8qIGNvbmZpZ3VyZSBtdWx0aSBjb3MgbWFwcGluZ3MgaW4ga2VybmVsLgorCSAqIHRoaXMgY29uZmlndXJhdGlvbiBtYXkgYmUgb3ZlcnJpZGVuIGJ5IGEgbXVsdGkgY2xhc3MgcXVldWUgZGlzY2lwbGluZQorCSAqIG9yIGJ5IGEgZGNieCBuZWdvdGlhdGlvbiByZXN1bHQuCisJICovCisJYm54Mnhfc2V0dXBfdGMoYnAtPmRldiwgYnAtPm1heF9jb3MpOworCiAJYm54MnhfbmFwaV9lbmFibGUoYnApOwogCiAJLyogU2VuZCBMT0FEX1JFUVVFU1QgY29tbWFuZCB0byBNQ1AKLQkgICBSZXR1cm5zIHRoZSB0eXBlIG9mIExPQUQgY29tbWFuZDoKLQkgICBpZiBpdCBpcyB0aGUgZmlyc3QgcG9ydCB0byBiZSBpbml0aWFsaXplZAotCSAgIGNvbW1vbiBibG9ja3Mgc2hvdWxkIGJlIGluaXRpYWxpemVkLCBvdGhlcndpc2UgLSBub3QKLQkqLworCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgTE9BRCBjb21tYW5kOgorCSAqIGlmIGl0IGlzIHRoZSBmaXJzdCBwb3J0IHRvIGJlIGluaXRpYWxpemVkCisJICogY29tbW9uIGJsb2NrcyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQsIG90aGVyd2lzZSAtIG5vdAorCSAqLwogCWlmICghQlBfTk9NQ1AoYnApKSB7CiAJCWxvYWRfY29kZSA9IGJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9MT0FEX1JFUSwgMCk7CiAJCWlmICghbG9hZF9jb2RlKSB7CiAJCQlCTlgyWF9FUlIoIk1DUCByZXNwb25zZSBmYWlsdXJlLCBhYm9ydGluZ1xuIik7CiAJCQlyYyA9IC1FQlVTWTsKLQkJCWdvdG8gbG9hZF9lcnJvcjE7CisJCQlMT0FEX0VSUk9SX0VYSVQoYnAsIGxvYWRfZXJyb3IxKTsKIAkJfQogCQlpZiAobG9hZF9jb2RlID09IEZXX01TR19DT0RFX0RSVl9MT0FEX1JFRlVTRUQpIHsKIAkJCXJjID0gLUVCVVNZOyAvKiBvdGhlciBwb3J0IGluIGRpYWdub3N0aWMgbW9kZSAqLwotCQkJZ290byBsb2FkX2Vycm9yMTsKKwkJCUxPQURfRVJST1JfRVhJVChicCwgbG9hZF9lcnJvcjEpOwogCQl9CiAKIAl9IGVsc2UgewogCQlpbnQgcGF0aCA9IEJQX1BBVEgoYnApOwotCQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwogCiAJCURQKE5FVElGX01TR19JRlVQLCAiTk8gTUNQIC0gbG9hZCBjb3VudHNbJWRdICAgICAgJWQsICVkLCAlZFxuIiwKIAkJICAgcGF0aCwgbG9hZF9jb3VudFtwYXRoXVswXSwgbG9hZF9jb3VudFtwYXRoXVsxXSwKQEAgLTE1MTksMzYgKzE3NzcsNjAgQEAKIAogCWlmICgobG9hZF9jb2RlID09IEZXX01TR19DT0RFX0RSVl9MT0FEX0NPTU1PTikgfHwKIAkgICAgKGxvYWRfY29kZSA9PSBGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT05fQ0hJUCkgfHwKLQkgICAgKGxvYWRfY29kZSA9PSBGV19NU0dfQ09ERV9EUlZfTE9BRF9QT1JUKSkKKwkgICAgKGxvYWRfY29kZSA9PSBGV19NU0dfQ09ERV9EUlZfTE9BRF9QT1JUKSkgewogCQlicC0+cG9ydC5wbWYgPSAxOwotCWVsc2UKKwkJLyoKKwkJICogV2UgbmVlZCB0aGUgYmFycmllciB0byBlbnN1cmUgdGhlIG9yZGVyaW5nIGJldHdlZW4gdGhlCisJCSAqIHdyaXRpbmcgdG8gYnAtPnBvcnQucG1mIGhlcmUgYW5kIHJlYWRpbmcgaXQgZnJvbSB0aGUKKwkJICogYm54MnhfcGVyaW9kaWNfdGFzaygpLgorCQkgKi8KKwkJc21wX21iKCk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhibngyeF93cSwgJmJwLT5wZXJpb2RfdGFzaywgMCk7CisJfSBlbHNlCiAJCWJwLT5wb3J0LnBtZiA9IDA7CisKIAlEUChORVRJRl9NU0dfTElOSywgInBtZiAlZFxuIiwgYnAtPnBvcnQucG1mKTsKIAorCS8qIEluaXQgRnVuY3Rpb24gc3RhdGUgY29udHJvbGxpbmcgb2JqZWN0ICovCisJYm54MnhfX2luaXRfZnVuY19vYmooYnApOworCiAJLyogSW5pdGlhbGl6ZSBIVyAqLwogCXJjID0gYm54MnhfaW5pdF9odyhicCwgbG9hZF9jb2RlKTsKIAlpZiAocmMpIHsKIAkJQk5YMlhfRVJSKCJIVyBpbml0IGZhaWxlZCwgYWJvcnRpbmdcbiIpOwogCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfTE9BRF9ET05FLCAwKTsKLQkJZ290byBsb2FkX2Vycm9yMjsKKwkJTE9BRF9FUlJPUl9FWElUKGJwLCBsb2FkX2Vycm9yMik7CiAJfQogCiAJLyogQ29ubmVjdCB0byBJUlFzICovCiAJcmMgPSBibngyeF9zZXR1cF9pcnFzKGJwKTsKIAlpZiAocmMpIHsKIAkJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX0xPQURfRE9ORSwgMCk7Ci0JCWdvdG8gbG9hZF9lcnJvcjI7CisJCUxPQURfRVJST1JfRVhJVChicCwgbG9hZF9lcnJvcjIpOwogCX0KIAogCS8qIFNldHVwIE5JQyBpbnRlcm5hbHMgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCiAJYm54MnhfbmljX2luaXQoYnAsIGxvYWRfY29kZSk7CiAKKwkvKiBJbml0IHBlci1mdW5jdGlvbiBvYmplY3RzICovCisJYm54MnhfaW5pdF9icF9vYmpzKGJwKTsKKwogCWlmICgoKGxvYWRfY29kZSA9PSBGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT04pIHx8CiAJICAgIChsb2FkX2NvZGUgPT0gRldfTVNHX0NPREVfRFJWX0xPQURfQ09NTU9OX0NISVApKSAmJgotCSAgICAoYnAtPmNvbW1vbi5zaG1lbTJfYmFzZSkpCi0JCVNITUVNMl9XUihicCwgZGNjX3N1cHBvcnQsCi0JCQkgIChTSE1FTV9EQ0NfU1VQUE9SVF9ESVNBQkxFX0VOQUJMRV9QRl9UTFYgfAotCQkJICAgU0hNRU1fRENDX1NVUFBPUlRfQkFORFdJRFRIX0FMTE9DQVRJT05fVExWKSk7CisJICAgIChicC0+Y29tbW9uLnNobWVtMl9iYXNlKSkgeworCQlpZiAoU0hNRU0yX0hBUyhicCwgZGNjX3N1cHBvcnQpKQorCQkJU0hNRU0yX1dSKGJwLCBkY2Nfc3VwcG9ydCwKKwkJCQkgIChTSE1FTV9EQ0NfU1VQUE9SVF9ESVNBQkxFX0VOQUJMRV9QRl9UTFYgfAorCQkJCSAgIFNITUVNX0RDQ19TVVBQT1JUX0JBTkRXSURUSF9BTExPQ0FUSU9OX1RMVikpOworCX0KKworCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX09QRU5JTkdfV0FJVDRfUE9SVDsKKwlyYyA9IGJueDJ4X2Z1bmNfc3RhcnQoYnApOworCWlmIChyYykgeworCQlCTlgyWF9FUlIoIkZ1bmN0aW9uIHN0YXJ0IGZhaWxlZCFcbiIpOworCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfTE9BRF9ET05FLCAwKTsKKwkJTE9BRF9FUlJPUl9FWElUKGJwLCBsb2FkX2Vycm9yMyk7CisJfQogCiAJLyogU2VuZCBMT0FEX0RPTkUgY29tbWFuZCB0byBNQ1AgKi8KIAlpZiAoIUJQX05PTUNQKGJwKSkgewpAQCAtMTU1Niw3NCArMTgzOCwzOCBAQAogCQlpZiAoIWxvYWRfY29kZSkgewogCQkJQk5YMlhfRVJSKCJNQ1AgcmVzcG9uc2UgZmFpbHVyZSwgYWJvcnRpbmdcbiIpOwogCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGxvYWRfZXJyb3IzOworCQkJTE9BRF9FUlJPUl9FWElUKGJwLCBsb2FkX2Vycm9yMyk7CiAJCX0KIAl9CiAKLQlibngyeF9kY2J4X2luaXQoYnApOwotCi0JYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfT1BFTklOR19XQUlUNF9QT1JUOwotCi0JcmMgPSBibngyeF9mdW5jX3N0YXJ0KGJwKTsKLQlpZiAocmMpIHsKLQkJQk5YMlhfRVJSKCJGdW5jdGlvbiBzdGFydCBmYWlsZWQhXG4iKTsKLSNpZm5kZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCQlnb3RvIGxvYWRfZXJyb3IzOwotI2Vsc2UKLQkJYnAtPnBhbmljID0gMTsKLQkJcmV0dXJuIC1FQlVTWTsKLSNlbmRpZgotCX0KLQotCXJjID0gYm54Mnhfc2V0dXBfY2xpZW50KGJwLCAmYnAtPmZwWzBdLCAxIC8qIExlYWRpbmcgKi8pOworCXJjID0gYm54Mnhfc2V0dXBfbGVhZGluZyhicCk7CiAJaWYgKHJjKSB7CiAJCUJOWDJYX0VSUigiU2V0dXAgbGVhZGluZyBmYWlsZWQhXG4iKTsKLSNpZm5kZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCQlnb3RvIGxvYWRfZXJyb3IzOwotI2Vsc2UKLQkJYnAtPnBhbmljID0gMTsKLQkJcmV0dXJuIC1FQlVTWTsKLSNlbmRpZgotCX0KLQotCWlmICghQ0hJUF9JU19FMShicCkgJiYKLQkgICAgKGJwLT5tZl9jb25maWdbQlBfVk4oYnApXSAmIEZVTkNfTUZfQ0ZHX0ZVTkNfRElTQUJMRUQpKSB7Ci0JCURQKE5FVElGX01TR19JRlVQLCAibWZfY2ZnIGZ1bmN0aW9uIGRpc2FibGVkXG4iKTsKLQkJYnAtPmZsYWdzIHw9IE1GX0ZVTkNfRElTOworCQlMT0FEX0VSUk9SX0VYSVQoYnAsIGxvYWRfZXJyb3IzKTsKIAl9CiAKICNpZmRlZiBCQ01fQ05JQwogCS8qIEVuYWJsZSBUaW1lciBzY2FuICovCi0JUkVHX1dSKGJwLCBUTV9SRUdfRU5fTElORUFSMF9USU1FUiArIEJQX1BPUlQoYnApKjQsIDEpOworCVJFR19XUihicCwgVE1fUkVHX0VOX0xJTkVBUjBfVElNRVIgKyBwb3J0KjQsIDEpOwogI2VuZGlmCiAKIAlmb3JfZWFjaF9ub25kZWZhdWx0X3F1ZXVlKGJwLCBpKSB7Ci0JCXJjID0gYm54Mnhfc2V0dXBfY2xpZW50KGJwLCAmYnAtPmZwW2ldLCAwKTsKKwkJcmMgPSBibngyeF9zZXR1cF9xdWV1ZShicCwgJmJwLT5mcFtpXSwgMCk7CiAJCWlmIChyYykKLSNpZmRlZiBCQ01fQ05JQwotCQkJZ290byBsb2FkX2Vycm9yNDsKLSNlbHNlCi0JCQlnb3RvIGxvYWRfZXJyb3IzOwotI2VuZGlmCisJCQlMT0FEX0VSUk9SX0VYSVQoYnAsIGxvYWRfZXJyb3I0KTsKIAl9CiAKKwlyYyA9IGJueDJ4X2luaXRfcnNzX3BmKGJwKTsKKwlpZiAocmMpCisJCUxPQURfRVJST1JfRVhJVChicCwgbG9hZF9lcnJvcjQpOworCiAJLyogTm93IHdoZW4gQ2xpZW50cyBhcmUgY29uZmlndXJlZCB3ZSBhcmUgcmVhZHkgdG8gd29yayAqLwogCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX09QRU47CiAKLSNpZmRlZiBCQ01fQ05JQwotCWJueDJ4X3NldF9mY29lX2V0aF9tYWNzKGJwKTsKLSNlbmRpZgotCi0JYm54Mnhfc2V0X2V0aF9tYWMoYnAsIDEpOwotCi0JLyogQ2xlYXIgTUMgY29uZmlndXJhdGlvbiAqLwotCWlmIChDSElQX0lTX0UxKGJwKSkKLQkJYm54MnhfaW52YWxpZGF0ZV9lMV9tY19saXN0KGJwKTsKLQllbHNlCi0JCWJueDJ4X2ludmFsaWRhdGVfZTFoX21jX2xpc3QoYnApOwotCi0JLyogQ2xlYXIgVUMgbGlzdHMgY29uZmlndXJhdGlvbiAqLwotCWJueDJ4X2ludmFsaWRhdGVfdWNfbGlzdChicCk7CisJLyogQ29uZmlndXJlIGEgdWNhc3QgTUFDICovCisJcmMgPSBibngyeF9zZXRfZXRoX21hYyhicCwgdHJ1ZSk7CisJaWYgKHJjKQorCQlMT0FEX0VSUk9SX0VYSVQoYnAsIGxvYWRfZXJyb3I0KTsKIAogCWlmIChicC0+cGVuZGluZ19tYXgpIHsKIAkJYm54MnhfdXBkYXRlX21heF9tZl9jb25maWcoYnAsIGJwLT5wZW5kaW5nX21heCk7CkBAIC0xNjMzLDE1ICsxODc5LDE4IEBACiAJaWYgKGJwLT5wb3J0LnBtZikKIAkJYm54MnhfaW5pdGlhbF9waHlfaW5pdChicCwgbG9hZF9tb2RlKTsKIAotCS8qIEluaXRpYWxpemUgUnggZmlsdGVyaW5nICovCi0JYm54Mnhfc2V0X3J4X21vZGUoYnAtPmRldik7Ci0KIAkvKiBTdGFydCBmYXN0IHBhdGggKi8KKworCS8qIEluaXRpYWxpemUgUnggZmlsdGVyLiAqLworCW5ldGlmX2FkZHJfbG9ja19iaChicC0+ZGV2KTsKKwlibngyeF9zZXRfcnhfbW9kZShicC0+ZGV2KTsKKwluZXRpZl9hZGRyX3VubG9ja19iaChicC0+ZGV2KTsKKworCS8qIFN0YXJ0IHRoZSBUeCAqLwogCXN3aXRjaCAobG9hZF9tb2RlKSB7CiAJY2FzZSBMT0FEX05PUk1BTDoKIAkJLyogVHggcXVldWUgc2hvdWxkIGJlIG9ubHkgcmVlbmFibGVkICovCiAJCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhicC0+ZGV2KTsKLQkJLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBmaWx0ZXIuICovCiAJCWJyZWFrOwogCiAJY2FzZSBMT0FEX09QRU46CkBAIC0xNjcwLDE4ICsxOTE5LDI4IEBACiAjZW5kaWYKIAlibngyeF9pbmNfbG9hZF9jbnQoYnApOwogCi0JYm54MnhfcmVsZWFzZV9maXJtd2FyZShicCk7CisJLyogV2FpdCBmb3IgYWxsIHBlbmRpbmcgU1AgY29tbWFuZHMgdG8gY29tcGxldGUgKi8KKwlpZiAoIWJueDJ4X3dhaXRfc3BfY29tcChicCwgfjB4MFVMKSkgeworCQlCTlgyWF9FUlIoIlRpbWVvdXQgd2FpdGluZyBmb3IgU1AgZWxlbWVudHMgdG8gY29tcGxldGVcbiIpOworCQlibngyeF9uaWNfdW5sb2FkKGJwLCBVTkxPQURfQ0xPU0UpOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAorCWJueDJ4X2RjYnhfaW5pdChicCk7CiAJcmV0dXJuIDA7CiAKLSNpZmRlZiBCQ01fQ05JQworI2lmbmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCiBsb2FkX2Vycm9yNDoKKyNpZmRlZiBCQ01fQ05JQwogCS8qIERpc2FibGUgVGltZXIgc2NhbiAqLwotCVJFR19XUihicCwgVE1fUkVHX0VOX0xJTkVBUjBfVElNRVIgKyBCUF9QT1JUKGJwKSo0LCAwKTsKKwlSRUdfV1IoYnAsIFRNX1JFR19FTl9MSU5FQVIwX1RJTUVSICsgcG9ydCo0LCAwKTsKICNlbmRpZgogbG9hZF9lcnJvcjM6CiAJYm54MnhfaW50X2Rpc2FibGVfc3luYyhicCwgMSk7CiAKKwkvKiBDbGVhbiBxdWV1ZWFibGUgb2JqZWN0cyAqLworCWJueDJ4X3NxdWVlemVfb2JqZWN0cyhicCk7CisKIAkvKiBGcmVlIFNLQnMsIFNHRXMsIFRQQSBwb29sIGFuZCBkcml2ZXIgaW50ZXJuYWxzICovCiAJYm54MnhfZnJlZV9za2JzKGJwKTsKIAlmb3JfZWFjaF9yeF9xdWV1ZShicCwgaSkKQEAgLTE3MDEsNDIgKzE5NjAsNTIgQEAKIGxvYWRfZXJyb3IwOgogCWJueDJ4X2ZyZWVfbWVtKGJwKTsKIAotCWJueDJ4X3JlbGVhc2VfZmlybXdhcmUoYnApOwotCiAJcmV0dXJuIHJjOworI2VuZGlmIC8qICEgQk5YMlhfU1RPUF9PTl9FUlJPUiAqLwogfQogCiAvKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHJ0bmxfbG9jayAqLwogaW50IGJueDJ4X25pY191bmxvYWQoc3RydWN0IGJueDJ4ICpicCwgaW50IHVubG9hZF9tb2RlKQogewogCWludCBpOworCWJvb2wgZ2xvYmFsID0gZmFsc2U7CiAKLQlpZiAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX0NMT1NFRCkgewotCQkvKiBJbnRlcmZhY2UgaGFzIGJlZW4gcmVtb3ZlZCAtIG5vdGhpbmcgdG8gcmVjb3ZlciAqLworCWlmICgoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX0NMT1NFRCkgfHwKKwkgICAgKGJwLT5zdGF0ZSA9PSBCTlgyWF9TVEFURV9FUlJPUikpIHsKKwkJLyogV2UgY2FuIGdldCBoZXJlIGlmIHRoZSBkcml2ZXIgaGFzIGJlZW4gdW5sb2FkZWQKKwkJICogZHVyaW5nIHBhcml0eSBlcnJvciByZWNvdmVyeSBhbmQgaXMgZWl0aGVyIHdhaXRpbmcgZm9yIGEKKwkJICogbGVhZGVyIHRvIGNvbXBsZXRlIG9yIGZvciBvdGhlciBmdW5jdGlvbnMgdG8gdW5sb2FkIGFuZAorCQkgKiB0aGVuIGlmZG93biBoYXMgYmVlbiBpc3N1ZWQuIEluIHRoaXMgY2FzZSB3ZSB3YW50IHRvCisJCSAqIHVubG9hZCBhbmQgbGV0IG90aGVyIGZ1bmN0aW9ucyB0byBjb21wbGV0ZSBhIHJlY292ZXJ5CisJCSAqIHByb2Nlc3MuCisJCSAqLwogCQlicC0+cmVjb3Zlcnlfc3RhdGUgPSBCTlgyWF9SRUNPVkVSWV9ET05FOwogCQlicC0+aXNfbGVhZGVyID0gMDsKLQkJYm54MnhfcmVsZWFzZV9od19sb2NrKGJwLCBIV19MT0NLX1JFU09VUkNFX1JFU0VSVkVEXzA4KTsKLQkJc21wX3dtYigpOworCQlibngyeF9yZWxlYXNlX2xlYWRlcl9sb2NrKGJwKTsKKwkJc21wX21iKCk7CisKKwkJRFAoTkVUSUZfTVNHX0hXLCAiUmVsZWFzaW5nIGEgbGVhZGVyc2hpcC4uLlxuIik7CiAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogU3RvcCBUeCAqLworCWJueDJ4X3R4X2Rpc2FibGUoYnApOworCiAjaWZkZWYgQkNNX0NOSUMKIAlibngyeF9jbmljX25vdGlmeShicCwgQ05JQ19DVExfU1RPUF9DTUQpOwogI2VuZGlmCiAJYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfQ0xPU0lOR19XQUlUNF9IQUxUOworCXNtcF9tYigpOwogCi0JLyogU2V0ICJkcm9wIGFsbCIgKi8KIAlicC0+cnhfbW9kZSA9IEJOWDJYX1JYX01PREVfTk9ORTsKLQlibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShicCk7Ci0KLQkvKiBTdG9wIFR4ICovCi0JYm54MnhfdHhfZGlzYWJsZShicCk7CiAKIAlkZWxfdGltZXJfc3luYygmYnAtPnRpbWVyKTsKIAotCVNITUVNX1dSKGJwLCBmdW5jX21iW0JQX0ZXX01CX0lEWChicCldLmRydl9wdWxzZV9tYiwKLQkJIChEUlZfUFVMU0VfQUxXQVlTX0FMSVZFIHwgYnAtPmZ3X2Rydl9wdWxzZV93cl9zZXEpKTsKKwkvKiBTZXQgQUxXQVlTX0FMSVZFIGJpdCBpbiBzaG1lbSAqLworCWJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxIHw9IERSVl9QVUxTRV9BTFdBWVNfQUxJVkU7CisKKwlibngyeF9kcnZfcHVsc2UoYnApOwogCiAJYm54Mnhfc3RhdHNfaGFuZGxlKGJwLCBTVEFUU19FVkVOVF9TVE9QKTsKIApAQCAtMTc0NCwxMyArMjAxMywzOCBAQAogCWlmICh1bmxvYWRfbW9kZSAhPSBVTkxPQURfUkVDT1ZFUlkpCiAJCWJueDJ4X2NoaXBfY2xlYW51cChicCwgdW5sb2FkX21vZGUpOwogCWVsc2UgewotCQkvKiBEaXNhYmxlIEhXIGludGVycnVwdHMsIE5BUEkgYW5kIFR4ICovCisJCS8qIFNlbmQgdGhlIFVOTE9BRF9SRVFVRVNUIHRvIHRoZSBNQ1AgKi8KKwkJYm54Mnhfc2VuZF91bmxvYWRfcmVxKGJwLCB1bmxvYWRfbW9kZSk7CisKKwkJLyoKKwkJICogUHJldmVudCB0cmFuc2FjdGlvbnMgdG8gaG9zdCBmcm9tIHRoZSBmdW5jdGlvbnMgb24gdGhlCisJCSAqIGVuZ2luZSB0aGF0IGRvZXNuJ3QgcmVzZXQgZ2xvYmFsIGJsb2NrcyBpbiBjYXNlIG9mIGdsb2JhbAorCQkgKiBhdHRlbnRpb24gb25jZSBnbG9hYmwgYmxvY2tzIGFyZSByZXNldCBhbmQgZ2F0ZXMgYXJlIG9wZW5lZAorCQkgKiAodGhlIGVuZ2luZSB3aGljaCBsZWFkZXIgd2lsbCBwZXJmb3JtIHRoZSByZWNvdmVyeQorCQkgKiBsYXN0KS4KKwkJICovCisJCWlmICghQ0hJUF9JU19FMXgoYnApKQorCQkJYm54MnhfcGZfZGlzYWJsZShicCk7CisKKwkJLyogRGlzYWJsZSBIVyBpbnRlcnJ1cHRzLCBOQVBJICovCiAJCWJueDJ4X25ldGlmX3N0b3AoYnAsIDEpOwogCiAJCS8qIFJlbGVhc2UgSVJRcyAqLwogCQlibngyeF9mcmVlX2lycShicCk7CisKKwkJLyogUmVwb3J0IFVOTE9BRF9ET05FIHRvIE1DUCAqLworCQlibngyeF9zZW5kX3VubG9hZF9kb25lKGJwKTsKIAl9CiAKKwkvKgorCSAqIEF0IHRoaXMgc3RhZ2Ugbm8gbW9yZSBpbnRlcnJ1cHRzIHdpbGwgYXJyaXZlIHNvIHdlIG1heSBzYWZseSBjbGVhbgorCSAqIHRoZSBxdWV1ZWFibGUgb2JqZWN0cyBoZXJlIGluIGNhc2UgdGhleSBmYWlsZWQgdG8gZ2V0IGNsZWFuZWQgc28gZmFyLgorCSAqLworCWJueDJ4X3NxdWVlemVfb2JqZWN0cyhicCk7CisKKwkvKiBUaGVyZSBzaG91bGQgYmUgbm8gbW9yZSBwZW5kaW5nIFNQIGNvbW1hbmRzIGF0IHRoaXMgc3RhZ2UgKi8KKwlicC0+c3Bfc3RhdGUgPSAwOworCiAJYnAtPnBvcnQucG1mID0gMDsKIAogCS8qIEZyZWUgU0tCcywgU0dFcywgVFBBIHBvb2wgYW5kIGRyaXZlciBpbnRlcm5hbHMgKi8KQEAgLTE3NjIsMTcgKzIwNTYsMjQgQEAKIAogCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX0NMT1NFRDsKIAorCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIHBhcml0eSBhdHRlbnRpb25zLiBJZiB0aGVyZSBhcmUgLSBzZXQKKwkgKiBSRUNPVkVSWV9JTl9QUk9HUkVTUy4KKwkgKi8KKwlpZiAoYm54MnhfY2hrX3Bhcml0eV9hdHRuKGJwLCAmZ2xvYmFsLCBmYWxzZSkpIHsKKwkJYm54Mnhfc2V0X3Jlc2V0X2luX3Byb2dyZXNzKGJwKTsKKworCQkvKiBTZXQgUkVTRVRfSVNfR0xPQkFMIGlmIG5lZWRlZCAqLworCQlpZiAoZ2xvYmFsKQorCQkJYm54Mnhfc2V0X3Jlc2V0X2dsb2JhbChicCk7CisJfQorCisKIAkvKiBUaGUgbGFzdCBkcml2ZXIgbXVzdCBkaXNhYmxlIGEgImNsb3NlIHRoZSBnYXRlIiBpZiB0aGVyZSBpcyBubwogCSAqIHBhcml0eSBhdHRlbnRpb24gb3IgInByb2Nlc3Mga2lsbCIgcGVuZGluZy4KIAkgKi8KLQlpZiAoKCFibngyeF9kZWNfbG9hZF9jbnQoYnApKSAmJiAoIWJueDJ4X2Noa19wYXJpdHlfYXR0bihicCkpICYmCi0JICAgIGJueDJ4X3Jlc2V0X2lzX2RvbmUoYnApKQorCWlmICghYm54MnhfZGVjX2xvYWRfY250KGJwKSAmJiBibngyeF9yZXNldF9pc19kb25lKGJwLCBCUF9QQVRIKGJwKSkpCiAJCWJueDJ4X2Rpc2FibGVfY2xvc2VfdGhlX2dhdGUoYnApOwogCi0JLyogUmVzZXQgTUNQIG1haWwgYm94IHNlcXVlbmNlIGlmIHRoZXJlIGlzIG9uIGdvaW5nIHJlY292ZXJ5ICovCi0JaWYgKHVubG9hZF9tb2RlID09IFVOTE9BRF9SRUNPVkVSWSkKLQkJYnAtPmZ3X3NlcSA9IDA7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTgzNCw2ICsyMTM1LDcgQEAKIGludCBibngyeF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIHsKIAlpbnQgd29ya19kb25lID0gMDsKKwl1OCBjb3M7CiAJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgYm54MnhfZmFzdHBhdGgsCiAJCQkJCQkgbmFwaSk7CiAJc3RydWN0IGJueDJ4ICpicCA9IGZwLT5icDsKQEAgLTE4NDYsOCArMjE0OCwxMCBAQAogCQl9CiAjZW5kaWYKIAotCQlpZiAoYm54MnhfaGFzX3R4X3dvcmsoZnApKQotCQkJYm54MnhfdHhfaW50KGZwKTsKKwkJZm9yX2VhY2hfY29zX2luX3R4X3F1ZXVlKGZwLCBjb3MpCisJCQlpZiAoYm54MnhfdHhfcXVldWVfaGFzX3dvcmsoJmZwLT50eGRhdGFbY29zXSkpCisJCQkJYm54MnhfdHhfaW50KGJwLCAmZnAtPnR4ZGF0YVtjb3NdKTsKKwogCiAJCWlmIChibngyeF9oYXNfcnhfd29yayhmcCkpIHsKIAkJCXdvcmtfZG9uZSArPSBibngyeF9yeF9pbnQoZnAsIGJ1ZGdldCAtIHdvcmtfZG9uZSk7CkBAIC0xOTA5LDcgKzIyMTMsNyBAQAogICogaW4gT3RoZXIgT3BlcmF0aW5nIFN5c3RlbXMoVE0pCiAgKi8KIHN0YXRpYyBub2lubGluZSB1MTYgYm54MnhfdHhfc3BsaXQoc3RydWN0IGJueDJ4ICpicCwKLQkJCQkgICBzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLAorCQkJCSAgIHN0cnVjdCBibngyeF9mcF90eGRhdGEgKnR4ZGF0YSwKIAkJCQkgICBzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZiwKIAkJCQkgICBzdHJ1Y3QgZXRoX3R4X3N0YXJ0X2JkICoqdHhfYmQsIHUxNiBobGVuLAogCQkJCSAgIHUxNiBiZF9wcm9kLCBpbnQgbmJkKQpAQCAtMTkzMCw3ICsyMjM0LDcgQEAKIAkvKiBub3cgZ2V0IGEgbmV3IGRhdGEgQkQKIAkgKiAoYWZ0ZXIgdGhlIHBiZCkgYW5kIGZpbGwgaXQgKi8KIAliZF9wcm9kID0gVFhfQkQoTkVYVF9UWF9JRFgoYmRfcHJvZCkpOwotCWRfdHhfYmQgPSAmZnAtPnR4X2Rlc2NfcmluZ1tiZF9wcm9kXS5yZWdfYmQ7CisJZF90eF9iZCA9ICZ0eGRhdGEtPnR4X2Rlc2NfcmluZ1tiZF9wcm9kXS5yZWdfYmQ7CiAKIAltYXBwaW5nID0gSElMT19VNjQobGUzMl90b19jcHUoaF90eF9iZC0+YWRkcl9oaSksCiAJCQkgICBsZTMyX3RvX2NwdShoX3R4X2JkLT5hZGRyX2xvKSkgKyBobGVuOwpAQCAtMjE0OCw2ICsyNDUyLDIyIEBACiAJCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpIC0gc2tiLT5kYXRhOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgYm54Mnhfc2V0X3NiZF9jc3VtKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBza19idWZmICpza2IsCisJc3RydWN0IGV0aF90eF9zdGFydF9iZCAqdHhfc3RhcnRfYmQsIHUzMiB4bWl0X3R5cGUpCit7CisJdHhfc3RhcnRfYmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkIHw9IEVUSF9UWF9CRF9GTEFHU19MNF9DU1VNOworCisJaWYgKHhtaXRfdHlwZSAmIFhNSVRfQ1NVTV9WNCkKKwkJdHhfc3RhcnRfYmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkIHw9CisJCQkJCUVUSF9UWF9CRF9GTEFHU19JUF9DU1VNOworCWVsc2UKKwkJdHhfc3RhcnRfYmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkIHw9CisJCQkJCUVUSF9UWF9CRF9GTEFHU19JUFY2OworCisJaWYgKCEoeG1pdF90eXBlICYgWE1JVF9DU1VNX1RDUCkpCisJCXR4X3N0YXJ0X2JkLT5iZF9mbGFncy5hc19iaXRmaWVsZCB8PSBFVEhfVFhfQkRfRkxBR1NfSVNfVURQOworfQorCiAvKioKICAqIGJueDJ4X3NldF9wYmRfY3N1bSAtIHVwZGF0ZSBQQkQgd2l0aCBjaGVja3N1bSBhbmQgcmV0dXJuIGhlYWRlciBsZW5ndGgKICAqCkBAIC0yMjEwLDE2ICsyNTMwLDE4IEBACiBuZXRkZXZfdHhfdCBibngyeF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKIAlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwOwogCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKwlzdHJ1Y3QgYm54MnhfZnBfdHhkYXRhICp0eGRhdGE7CiAJc3RydWN0IHN3X3R4X2JkICp0eF9idWY7Ci0Jc3RydWN0IGV0aF90eF9zdGFydF9iZCAqdHhfc3RhcnRfYmQ7CisJc3RydWN0IGV0aF90eF9zdGFydF9iZCAqdHhfc3RhcnRfYmQsICpmaXJzdF9iZDsKIAlzdHJ1Y3QgZXRoX3R4X2JkICp0eF9kYXRhX2JkLCAqdG90YWxfcGt0X2JkID0gTlVMTDsKIAlzdHJ1Y3QgZXRoX3R4X3BhcnNlX2JkX2UxeCAqcGJkX2UxeCA9IE5VTEw7CiAJc3RydWN0IGV0aF90eF9wYXJzZV9iZF9lMiAqcGJkX2UyID0gTlVMTDsKIAl1MzIgcGJkX2UyX3BhcnNpbmdfZGF0YSA9IDA7CiAJdTE2IHBrdF9wcm9kLCBiZF9wcm9kOwotCWludCBuYmQsIGZwX2luZGV4OworCWludCBuYmQsIHR4cV9pbmRleCwgZnBfaW5kZXgsIHR4ZGF0YV9pbmRleDsKIAlkbWFfYWRkcl90IG1hcHBpbmc7CiAJdTMyIHhtaXRfdHlwZSA9IGJueDJ4X3htaXRfdHlwZShicCwgc2tiKTsKIAlpbnQgaTsKQEAgLTIyMzMsMTIgKzI1NTUsNDMgQEAKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogI2VuZGlmCiAKLQlmcF9pbmRleCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOwotCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBmcF9pbmRleCk7CisJdHhxX2luZGV4ID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CisJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIHR4cV9pbmRleCk7CiAKKwlCVUdfT04odHhxX2luZGV4ID49IE1BWF9FVEhfVFhRX0lEWChicCkgKyBGQ09FX1BSRVNFTlQpOworCisJLyogZGVjb2RlIHRoZSBmYXN0cGF0aCBpbmRleCBhbmQgdGhlIGNvcyBpbmRleCBmcm9tIHRoZSB0eHEgKi8KKwlmcF9pbmRleCA9IFRYUV9UT19GUCh0eHFfaW5kZXgpOworCXR4ZGF0YV9pbmRleCA9IFRYUV9UT19DT1ModHhxX2luZGV4KTsKKworI2lmZGVmIEJDTV9DTklDCisJLyoKKwkgKiBPdmVycmlkZSB0aGUgYWJvdmUgZm9yIHRoZSBGQ29FIHF1ZXVlOgorCSAqICAgLSBGQ29FIGZwIGVudHJ5IGlzIHJpZ2h0IGFmdGVyIHRoZSBFVEggZW50cmllcy4KKwkgKiAgIC0gRkNvRSBMMiBxdWV1ZSB1c2VzIGJwLT50eGRhdGFbMF0gb25seS4KKwkgKi8KKwlpZiAodW5saWtlbHkoIU5PX0ZDT0UoYnApICYmICh0eHFfaW5kZXggPT0KKwkJCQkgICAgICBibngyeF9mY29lX3R4KGJwLCB0eHFfaW5kZXgpKSkpIHsKKwkJZnBfaW5kZXggPSBGQ09FX0lEWDsKKwkJdHhkYXRhX2luZGV4ID0gMDsKKwl9CisjZW5kaWYKKworCS8qIGVuYWJsZSB0aGlzIGRlYnVnIHByaW50IHRvIHZpZXcgdGhlIHRyYW5zbWlzc2lvbiBxdWV1ZSBiZWluZyB1c2VkCisJRFAoQk5YMlhfTVNHX0ZQLCAiaW5kaWNlczogdHhxICVkLCBmcCAlZCwgdHhkYXRhICVkIiwKKwkgICB0eHFfaW5kZXgsIGZwX2luZGV4LCB0eGRhdGFfaW5kZXgpOyAqLworCisJLyogbG9jYXRlIHRoZSBmYXN0cGF0aCBhbmQgdGhlIHR4ZGF0YSAqLwogCWZwID0gJmJwLT5mcFtmcF9pbmRleF07CisJdHhkYXRhID0gJmZwLT50eGRhdGFbdHhkYXRhX2luZGV4XTsKIAotCWlmICh1bmxpa2VseShibngyeF90eF9hdmFpbChmcCkgPCAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDMpKSkgeworCS8qIGVuYWJsZSB0aGlzIGRlYnVnIHByaW50IHRvIHZpZXcgdGhlIHRyYW5taXNzaW9uIGRldGFpbHMKKwlEUChCTlgyWF9NU0dfRlAsInRyYW5zbWl0dGluZyBwYWNrZXQgY2lkICVkIGZwIGluZGV4ICVkIHR4ZGF0YV9pbmRleCAlZCIKKwkJCSIgdHhfZGF0YSBwdHIgJXAgZnAgcG9pbnRlciAlcCIsCisJICAgdHhkYXRhLT5jaWQsIGZwX2luZGV4LCB0eGRhdGFfaW5kZXgsIHR4ZGF0YSwgZnApOyAqLworCisJaWYgKHVubGlrZWx5KGJueDJ4X3R4X2F2YWlsKGJwLCB0eGRhdGEpIDwKKwkJICAgICAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDMpKSkgewogCQlmcC0+ZXRoX3Ffc3RhdHMuZHJpdmVyX3hvZmYrKzsKIAkJbmV0aWZfdHhfc3RvcF9xdWV1ZSh0eHEpOwogCQlCTlgyWF9FUlIoIkJVRyEgVHggcmluZyBmdWxsIHdoZW4gcXVldWUgYXdha2UhXG4iKTsKQEAgLTIyNDcsNyArMjYwMCw3IEBACiAKIAlEUChORVRJRl9NU0dfVFhfUVVFVUVELCAicXVldWVbJWRdOiBTS0I6IHN1bW1lZCAleCAgcHJvdG9jb2wgJXggICIKIAkJCQkicHJvdG9jb2woJXgsJXgpIGdzbyB0eXBlICV4ICB4bWl0X3R5cGUgJXhcbiIsCi0JICAgZnBfaW5kZXgsIHNrYi0+aXBfc3VtbWVkLCBza2ItPnByb3RvY29sLCBpcHY2X2hkcihza2IpLT5uZXh0aGRyLAorCSAgIHR4cV9pbmRleCwgc2tiLT5pcF9zdW1tZWQsIHNrYi0+cHJvdG9jb2wsIGlwdjZfaGRyKHNrYiktPm5leHRoZHIsCiAJICAgaXBfaGRyKHNrYiktPnByb3RvY29sLCBza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlLCB4bWl0X3R5cGUpOwogCiAJZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CkBAIC0yMjc1LDcgKzI2MjgsMTUgQEAKIAkJfQogCX0KICNlbmRpZgotCisJLyogTWFwIHNrYiBsaW5lYXIgZGF0YSBmb3IgRE1BICovCisJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBza2ItPmRhdGEsCisJCQkJIHNrYl9oZWFkbGVuKHNrYiksIERNQV9UT19ERVZJQ0UpOworCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcigmYnAtPnBkZXYtPmRldiwgbWFwcGluZykpKSB7CisJCURQKE5FVElGX01TR19UWF9RVUVVRUQsICJTS0IgbWFwcGluZyBmYWlsZWQgLSAiCisJCSAgICJzaWxlbnRseSBkcm9wcGluZyB0aGlzIFNLQlxuIik7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQogCS8qCiAJUGxlYXNlIHJlYWQgY2FyZWZ1bGx5LiBGaXJzdCB3ZSB1c2Ugb25lIEJEIHdoaWNoIHdlIG1hcmsgYXMgc3RhcnQsCiAJdGhlbiB3ZSBoYXZlIGEgcGFyc2luZyBpbmZvIEJEICh1c2VkIGZvciBUU08gb3IgeHN1bSksCkBAIC0yMjg1LDEyICsyNjQ2LDE5IEBACiAJQW5kIGFib3ZlIGFsbCwgYWxsIHBkYiBzaXplcyBhcmUgaW4gd29yZHMgLSBOT1QgRFdPUkRTIQogCSovCiAKLQlwa3RfcHJvZCA9IGZwLT50eF9wa3RfcHJvZCsrOwotCWJkX3Byb2QgPSBUWF9CRChmcC0+dHhfYmRfcHJvZCk7CisJLyogZ2V0IGN1cnJlbnQgcGt0IHByb2R1Y2VkIG5vdyAtIGFkdmFuY2UgaXQganVzdCBiZWZvcmUgc2VuZGluZyBwYWNrZXQKKwkgKiBzaW5jZSBtYXBwaW5nIG9mIHBhZ2VzIG1heSBmYWlsIGFuZCBjYXVzZSBwYWNrZXQgdG8gYmUgZHJvcHBlZAorCSAqLworCXBrdF9wcm9kID0gdHhkYXRhLT50eF9wa3RfcHJvZDsKKwliZF9wcm9kID0gVFhfQkQodHhkYXRhLT50eF9iZF9wcm9kKTsKIAotCS8qIGdldCBhIHR4X2J1ZiBhbmQgZmlyc3QgQkQgKi8KLQl0eF9idWYgPSAmZnAtPnR4X2J1Zl9yaW5nW1RYX0JEKHBrdF9wcm9kKV07Ci0JdHhfc3RhcnRfYmQgPSAmZnAtPnR4X2Rlc2NfcmluZ1tiZF9wcm9kXS5zdGFydF9iZDsKKwkvKiBnZXQgYSB0eF9idWYgYW5kIGZpcnN0IEJECisJICogdHhfc3RhcnRfYmQgbWF5IGJlIGNoYW5nZWQgZHVyaW5nIFNQTElULAorCSAqIGJ1dCBmaXJzdF9iZCB3aWxsIGFsd2F5cyBzdGF5IGZpcnN0CisJICovCisJdHhfYnVmID0gJnR4ZGF0YS0+dHhfYnVmX3JpbmdbVFhfQkQocGt0X3Byb2QpXTsKKwl0eF9zdGFydF9iZCA9ICZ0eGRhdGEtPnR4X2Rlc2NfcmluZ1tiZF9wcm9kXS5zdGFydF9iZDsKKwlmaXJzdF9iZCA9IHR4X3N0YXJ0X2JkOwogCiAJdHhfc3RhcnRfYmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkID0gRVRIX1RYX0JEX0ZMQUdTX1NUQVJUX0JEOwogCVNFVF9GTEFHKHR4X3N0YXJ0X2JkLT5nZW5lcmFsX2RhdGEsIEVUSF9UWF9TVEFSVF9CRF9FVEhfQUREUl9UWVBFLApAQCAtMjMwMCwxMyArMjY2OCwxMyBAQAogCVNFVF9GTEFHKHR4X3N0YXJ0X2JkLT5nZW5lcmFsX2RhdGEsIEVUSF9UWF9TVEFSVF9CRF9IRFJfTkJEUywgMSk7CiAKIAkvKiByZW1lbWJlciB0aGUgZmlyc3QgQkQgb2YgdGhlIHBhY2tldCAqLwotCXR4X2J1Zi0+Zmlyc3RfYmQgPSBmcC0+dHhfYmRfcHJvZDsKKwl0eF9idWYtPmZpcnN0X2JkID0gdHhkYXRhLT50eF9iZF9wcm9kOwogCXR4X2J1Zi0+c2tiID0gc2tiOwogCXR4X2J1Zi0+ZmxhZ3MgPSAwOwogCiAJRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwKIAkgICAic2VuZGluZyBwa3QgJXUgQCVwICBuZXh0X2lkeCAldSAgYmQgJXUgQCVwXG4iLAotCSAgIHBrdF9wcm9kLCB0eF9idWYsIGZwLT50eF9wa3RfcHJvZCwgYmRfcHJvZCwgdHhfc3RhcnRfYmQpOworCSAgIHBrdF9wcm9kLCB0eF9idWYsIHR4ZGF0YS0+dHhfcGt0X3Byb2QsIGJkX3Byb2QsIHR4X3N0YXJ0X2JkKTsKIAogCWlmICh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKIAkJdHhfc3RhcnRfYmQtPnZsYW5fb3JfZXRoZXJ0eXBlID0KQEAgLTIzMTksMzEgKzI2ODcsMzMgQEAKIAkvKiB0dXJuIG9uIHBhcnNpbmcgYW5kIGdldCBhIEJEICovCiAJYmRfcHJvZCA9IFRYX0JEKE5FWFRfVFhfSURYKGJkX3Byb2QpKTsKIAotCWlmICh4bWl0X3R5cGUgJiBYTUlUX0NTVU0pIHsKLQkJdHhfc3RhcnRfYmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkIHw9IEVUSF9UWF9CRF9GTEFHU19MNF9DU1VNOworCWlmICh4bWl0X3R5cGUgJiBYTUlUX0NTVU0pCisJCWJueDJ4X3NldF9zYmRfY3N1bShicCwgc2tiLCB0eF9zdGFydF9iZCwgeG1pdF90eXBlKTsKIAotCQlpZiAoeG1pdF90eXBlICYgWE1JVF9DU1VNX1Y0KQotCQkJdHhfc3RhcnRfYmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkIHw9Ci0JCQkJCQlFVEhfVFhfQkRfRkxBR1NfSVBfQ1NVTTsKLQkJZWxzZQotCQkJdHhfc3RhcnRfYmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkIHw9Ci0JCQkJCQlFVEhfVFhfQkRfRkxBR1NfSVBWNjsKLQotCQlpZiAoISh4bWl0X3R5cGUgJiBYTUlUX0NTVU1fVENQKSkKLQkJCXR4X3N0YXJ0X2JkLT5iZF9mbGFncy5hc19iaXRmaWVsZCB8PQotCQkJCQkJRVRIX1RYX0JEX0ZMQUdTX0lTX1VEUDsKLQl9Ci0KLQlpZiAoQ0hJUF9JU19FMihicCkpIHsKLQkJcGJkX2UyID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucGFyc2VfYmRfZTI7CisJaWYgKCFDSElQX0lTX0UxeChicCkpIHsKKwkJcGJkX2UyID0gJnR4ZGF0YS0+dHhfZGVzY19yaW5nW2JkX3Byb2RdLnBhcnNlX2JkX2UyOwogCQltZW1zZXQocGJkX2UyLCAwLCBzaXplb2Yoc3RydWN0IGV0aF90eF9wYXJzZV9iZF9lMikpOwogCQkvKiBTZXQgUEJEIGluIGNoZWNrc3VtIG9mZmxvYWQgY2FzZSAqLwogCQlpZiAoeG1pdF90eXBlICYgWE1JVF9DU1VNKQogCQkJaGxlbiA9IGJueDJ4X3NldF9wYmRfY3N1bV9lMihicCwgc2tiLAogCQkJCQkJICAgICAmcGJkX2UyX3BhcnNpbmdfZGF0YSwKIAkJCQkJCSAgICAgeG1pdF90eXBlKTsKKwkJaWYgKElTX01GX1NJKGJwKSkgeworCQkJLyoKKwkJCSAqIGZpbGwgaW4gdGhlIE1BQyBhZGRyZXNzZXMgaW4gdGhlIFBCRCAtIGZvciBsb2NhbAorCQkJICogc3dpdGNoaW5nCisJCQkgKi8KKwkJCWJueDJ4X3NldF9md19tYWNfYWRkcigmcGJkX2UyLT5zcmNfbWFjX2FkZHJfaGksCisJCQkJCSAgICAgICZwYmRfZTItPnNyY19tYWNfYWRkcl9taWQsCisJCQkJCSAgICAgICZwYmRfZTItPnNyY19tYWNfYWRkcl9sbywKKwkJCQkJICAgICAgZXRoLT5oX3NvdXJjZSk7CisJCQlibngyeF9zZXRfZndfbWFjX2FkZHIoJnBiZF9lMi0+ZHN0X21hY19hZGRyX2hpLAorCQkJCQkgICAgICAmcGJkX2UyLT5kc3RfbWFjX2FkZHJfbWlkLAorCQkJCQkgICAgICAmcGJkX2UyLT5kc3RfbWFjX2FkZHJfbG8sCisJCQkJCSAgICAgIGV0aC0+aF9kZXN0KTsKKwkJfQogCX0gZWxzZSB7Ci0JCXBiZF9lMXggPSAmZnAtPnR4X2Rlc2NfcmluZ1tiZF9wcm9kXS5wYXJzZV9iZF9lMXg7CisJCXBiZF9lMXggPSAmdHhkYXRhLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucGFyc2VfYmRfZTF4OwogCQltZW1zZXQocGJkX2UxeCwgMCwgc2l6ZW9mKHN0cnVjdCBldGhfdHhfcGFyc2VfYmRfZTF4KSk7CiAJCS8qIFNldCBQQkQgaW4gY2hlY2tzdW0gb2ZmbG9hZCBjYXNlICovCiAJCWlmICh4bWl0X3R5cGUgJiBYTUlUX0NTVU0pCkBAIC0yMzUxLDE1ICsyNzIxLDEwIEBACiAKIAl9CiAKLQkvKiBNYXAgc2tiIGxpbmVhciBkYXRhIGZvciBETUEgKi8KLQltYXBwaW5nID0gZG1hX21hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsIHNrYi0+ZGF0YSwKLQkJCQkgc2tiX2hlYWRsZW4oc2tiKSwgRE1BX1RPX0RFVklDRSk7Ci0KIAkvKiBTZXR1cCB0aGUgZGF0YSBwb2ludGVyIG9mIHRoZSBmaXJzdCBCRCBvZiB0aGUgcGFja2V0ICovCiAJdHhfc3RhcnRfYmQtPmFkZHJfaGkgPSBjcHVfdG9fbGUzMihVNjRfSEkobWFwcGluZykpOwogCXR4X3N0YXJ0X2JkLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIoVTY0X0xPKG1hcHBpbmcpKTsKLQluYmQgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMjsgLyogc3RhcnRfYmQgKyBwYmQgKyBmcmFncyAqLwotCXR4X3N0YXJ0X2JkLT5uYmQgPSBjcHVfdG9fbGUxNihuYmQpOworCW5iZCA9IDI7IC8qIHN0YXJ0X2JkICsgcGJkICsgZnJhZ3MgKHVwZGF0ZWQgd2hlbiBwYWdlcyBhcmUgbWFwcGVkKSAqLwogCXR4X3N0YXJ0X2JkLT5uYnl0ZXMgPSBjcHVfdG9fbGUxNihza2JfaGVhZGxlbihza2IpKTsKIAlwa3Rfc2l6ZSA9IHR4X3N0YXJ0X2JkLT5uYnl0ZXM7CiAKQEAgLTIzODAsOSArMjc0NSwxMCBAQAogCQl0eF9zdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgfD0gRVRIX1RYX0JEX0ZMQUdTX1NXX0xTTzsKIAogCQlpZiAodW5saWtlbHkoc2tiX2hlYWRsZW4oc2tiKSA+IGhsZW4pKQotCQkJYmRfcHJvZCA9IGJueDJ4X3R4X3NwbGl0KGJwLCBmcCwgdHhfYnVmLCAmdHhfc3RhcnRfYmQsCi0JCQkJCQkgaGxlbiwgYmRfcHJvZCwgKytuYmQpOwotCQlpZiAoQ0hJUF9JU19FMihicCkpCisJCQliZF9wcm9kID0gYm54MnhfdHhfc3BsaXQoYnAsIHR4ZGF0YSwgdHhfYnVmLAorCQkJCQkJICZ0eF9zdGFydF9iZCwgaGxlbiwKKwkJCQkJCSBiZF9wcm9kLCArK25iZCk7CisJCWlmICghQ0hJUF9JU19FMXgoYnApKQogCQkJYm54Mnhfc2V0X3BiZF9nc29fZTIoc2tiLCAmcGJkX2UyX3BhcnNpbmdfZGF0YSwKIAkJCQkJICAgICB4bWl0X3R5cGUpOwogCQllbHNlCkBAIC0yNDAxLDE5ICsyNzY3LDM1IEBACiAJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgewogCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CiAKLQkJYmRfcHJvZCA9IFRYX0JEKE5FWFRfVFhfSURYKGJkX3Byb2QpKTsKLQkJdHhfZGF0YV9iZCA9ICZmcC0+dHhfZGVzY19yaW5nW2JkX3Byb2RdLnJlZ19iZDsKLQkJaWYgKHRvdGFsX3BrdF9iZCA9PSBOVUxMKQotCQkJdG90YWxfcGt0X2JkID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucmVnX2JkOwotCiAJCW1hcHBpbmcgPSBkbWFfbWFwX3BhZ2UoJmJwLT5wZGV2LT5kZXYsIGZyYWctPnBhZ2UsCi0JCQkJICAgICAgIGZyYWctPnBhZ2Vfb2Zmc2V0LAotCQkJCSAgICAgICBmcmFnLT5zaXplLCBETUFfVE9fREVWSUNFKTsKKwkJCQkgICAgICAgZnJhZy0+cGFnZV9vZmZzZXQsIGZyYWctPnNpemUsCisJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOworCQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoJmJwLT5wZGV2LT5kZXYsIG1hcHBpbmcpKSkgeworCisJCQlEUChORVRJRl9NU0dfVFhfUVVFVUVELCAiVW5hYmxlIHRvIG1hcCBwYWdlIC0gIgorCQkJCQkJImRyb3BwaW5nIHBhY2tldC4uLlxuIik7CisKKwkJCS8qIHdlIG5lZWQgdW5tYXAgYWxsIGJ1ZmZlcnMgYWxyZWFkeSBtYXBwZWQKKwkJCSAqIGZvciB0aGlzIFNLQjsKKwkJCSAqIGZpcnN0X2JkLT5uYmQgbmVlZCB0byBiZSBwcm9wZXJseSB1cGRhdGVkCisJCQkgKiBiZWZvcmUgY2FsbCB0byBibngyeF9mcmVlX3R4X3BrdAorCQkJICovCisJCQlmaXJzdF9iZC0+bmJkID0gY3B1X3RvX2xlMTYobmJkKTsKKwkJCWJueDJ4X2ZyZWVfdHhfcGt0KGJwLCB0eGRhdGEsCisJCQkJCSAgVFhfQkQodHhkYXRhLT50eF9wa3RfcHJvZCkpOworCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwkJfQorCisJCWJkX3Byb2QgPSBUWF9CRChORVhUX1RYX0lEWChiZF9wcm9kKSk7CisJCXR4X2RhdGFfYmQgPSAmdHhkYXRhLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucmVnX2JkOworCQlpZiAodG90YWxfcGt0X2JkID09IE5VTEwpCisJCQl0b3RhbF9wa3RfYmQgPSAmdHhkYXRhLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucmVnX2JkOwogCiAJCXR4X2RhdGFfYmQtPmFkZHJfaGkgPSBjcHVfdG9fbGUzMihVNjRfSEkobWFwcGluZykpOwogCQl0eF9kYXRhX2JkLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIoVTY0X0xPKG1hcHBpbmcpKTsKIAkJdHhfZGF0YV9iZC0+bmJ5dGVzID0gY3B1X3RvX2xlMTYoZnJhZy0+c2l6ZSk7CiAJCWxlMTZfYWRkX2NwdSgmcGt0X3NpemUsIGZyYWctPnNpemUpOworCQluYmQrKzsKIAogCQlEUChORVRJRl9NU0dfVFhfUVVFVUVELAogCQkgICAiZnJhZyAlZCAgYmQgQCVwICBhZGRyICgleDoleCkgIG5ieXRlcyAlZFxuIiwKQEAgLTI0MjMsNiArMjgwNSw5IEBACiAKIAlEUChORVRJRl9NU0dfVFhfUVVFVUVELCAibGFzdCBiZCBAJXBcbiIsIHR4X2RhdGFfYmQpOwogCisJLyogdXBkYXRlIHdpdGggYWN0dWFsIG51bSBCRHMgKi8KKwlmaXJzdF9iZC0+bmJkID0gY3B1X3RvX2xlMTYobmJkKTsKKwogCWJkX3Byb2QgPSBUWF9CRChORVhUX1RYX0lEWChiZF9wcm9kKSk7CiAKIAkvKiBub3cgc2VuZCBhIHR4IGRvb3JiZWxsLCBjb3VudGluZyB0aGUgbmV4dCBCRApAQCAtMjQzMSw2ICsyODE2LDEzIEBACiAJaWYgKFRYX0JEX1BPRkYoYmRfcHJvZCkgPCBuYmQpCiAJCW5iZCsrOwogCisJLyogdG90YWxfcGt0X2J5dGVzIHNob3VsZCBiZSBzZXQgb24gdGhlIGZpcnN0IGRhdGEgQkQgaWYKKwkgKiBpdCdzIG5vdCBhbiBMU08gcGFja2V0IGFuZCB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCisJICogZGF0YSBCRC4gSW4gdGhpcyBjYXNlIHBrdF9zaXplIGlzIGxpbWl0ZWQgYnkgYW4gTVRVIHZhbHVlLgorCSAqIEhvd2V2ZXIgd2UgcHJlZmVyIHRvIHNldCBpdCBmb3IgYW4gTFNPIHBhY2tldCAod2hpbGUgd2UgZG9uJ3QKKwkgKiBoYXZlIHRvKSBpbiBvcmRlciB0byBzYXZlIHNvbWUgQ1BVIGN5Y2xlcyBpbiBhIG5vbmUtTFNPCisJICogY2FzZSwgd2hlbiB3ZSBtdWNoIG1vcmUgY2FyZSBhYm91dCB0aGVtLgorCSAqLwogCWlmICh0b3RhbF9wa3RfYmQgIT0gTlVMTCkKIAkJdG90YWxfcGt0X2JkLT50b3RhbF9wa3RfYnl0ZXMgPSBwa3Rfc2l6ZTsKIApAQCAtMjQ1MSw2ICsyODQzLDcgQEAKIAkJICAgcGJkX2UyLT5wYXJzaW5nX2RhdGEpOwogCURQKE5FVElGX01TR19UWF9RVUVVRUQsICJkb29yYmVsbDogbmJkICVkICBiZCAldVxuIiwgbmJkLCBiZF9wcm9kKTsKIAorCXR4ZGF0YS0+dHhfcGt0X3Byb2QrKzsKIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBCRCBkYXRhIGlzIHVwZGF0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBwcm9kdWNlcgogCSAqIHNpbmNlIEZXIG1pZ2h0IHJlYWQgdGhlIEJEIHJpZ2h0IGFmdGVyIHRoZSBwcm9kdWNlciBpcyB1cGRhdGVkLgpAQCAtMjQ2MCwxNiArMjg1MywxNiBAQAogCSAqLwogCXdtYigpOwogCi0JZnAtPnR4X2RiLmRhdGEucHJvZCArPSBuYmQ7CisJdHhkYXRhLT50eF9kYi5kYXRhLnByb2QgKz0gbmJkOwogCWJhcnJpZXIoKTsKIAotCURPT1JCRUxMKGJwLCBmcC0+Y2lkLCBmcC0+dHhfZGIucmF3KTsKKwlET09SQkVMTChicCwgdHhkYXRhLT5jaWQsIHR4ZGF0YS0+dHhfZGIucmF3KTsKIAogCW1taW93YigpOwogCi0JZnAtPnR4X2JkX3Byb2QgKz0gbmJkOworCXR4ZGF0YS0+dHhfYmRfcHJvZCArPSBuYmQ7CiAKLQlpZiAodW5saWtlbHkoYm54MnhfdHhfYXZhaWwoZnApIDwgTUFYX1NLQl9GUkFHUyArIDMpKSB7CisJaWYgKHVubGlrZWx5KGJueDJ4X3R4X2F2YWlsKGJwLCB0eGRhdGEpIDwgTUFYX1NLQl9GUkFHUyArIDMpKSB7CiAJCW5ldGlmX3R4X3N0b3BfcXVldWUodHhxKTsKIAogCQkvKiBwYWlyZWQgbWVtb3J5IGJhcnJpZXIgaXMgaW4gYm54MnhfdHhfaW50KCksIHdlIGhhdmUgdG8ga2VlcApAQCAtMjQ3OCwzNCArMjg3MSwxMTAgQEAKIAkJc21wX21iKCk7CiAKIAkJZnAtPmV0aF9xX3N0YXRzLmRyaXZlcl94b2ZmKys7Ci0JCWlmIChibngyeF90eF9hdmFpbChmcCkgPj0gTUFYX1NLQl9GUkFHUyArIDMpCisJCWlmIChibngyeF90eF9hdmFpbChicCwgdHhkYXRhKSA+PSBNQVhfU0tCX0ZSQUdTICsgMykKIAkJCW5ldGlmX3R4X3dha2VfcXVldWUodHhxKTsKIAl9Ci0JZnAtPnR4X3BrdCsrOworCXR4ZGF0YS0+dHhfcGt0Kys7CiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCisvKioKKyAqIGJueDJ4X3NldHVwX3RjIC0gcm91dGluZSB0byBjb25maWd1cmUgbmV0X2RldmljZSBmb3IgbXVsdGkgdGMKKyAqCisgKiBAbmV0ZGV2OiBuZXQgZGV2aWNlIHRvIGNvbmZpZ3VyZQorICogQHRjOiBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzIHRvIGVuYWJsZQorICoKKyAqIGNhbGxiYWNrIGNvbm5lY3RlZCB0byB0aGUgbmRvX3NldHVwX3RjIGZ1bmN0aW9uIHBvaW50ZXIKKyAqLworaW50IGJueDJ4X3NldHVwX3RjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IG51bV90YykKK3sKKwlpbnQgY29zLCBwcmlvLCBjb3VudCwgb2Zmc2V0OworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogc2V0dXAgdGMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgcnRubCBsb2NrICovCisJQVNTRVJUX1JUTkwoKTsKKworCS8qIG5vIHRyYWZmaWMgY2xhc3NlcyByZXF1ZXN0ZWQuIGFib3J0aW5nICovCisJaWYgKCFudW1fdGMpIHsKKwkJbmV0ZGV2X3Jlc2V0X3RjKGRldik7CisJCXJldHVybiAwOworCX0KKworCS8qIHJlcXVlc3RlZCB0byBzdXBwb3J0IHRvbyBtYW55IHRyYWZmaWMgY2xhc3NlcyAqLworCWlmIChudW1fdGMgPiBicC0+bWF4X2NvcykgeworCQlEUChORVRJRl9NU0dfVFhfRVJSLCAic3VwcG9ydCBmb3IgdG9vIG1hbnkgdHJhZmZpYyBjbGFzc2VzIgorCQkJCSAgICAgIiByZXF1ZXN0ZWQ6ICVkLiBtYXggc3VwcG9ydGVkIGlzICVkIiwKKwkJCQkgICAgIG51bV90YywgYnAtPm1heF9jb3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBkZWNsYXJlIGFtb3VudCBvZiBzdXBwb3J0ZWQgdHJhZmZpYyBjbGFzc2VzICovCisJaWYgKG5ldGRldl9zZXRfbnVtX3RjKGRldiwgbnVtX3RjKSkgeworCQlEUChORVRJRl9NU0dfVFhfRVJSLCAiZmFpbGVkIHRvIGRlY2xhcmUgJWQgdHJhZmZpYyBjbGFzc2VzIiwKKwkJCQkgICAgIG51bV90Yyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNvbmZpZ3VyZSBwcmlvcml0eSB0byB0cmFmZmljIGNsYXNzIG1hcHBpbmcgKi8KKwlmb3IgKHByaW8gPSAwOyBwcmlvIDwgQk5YMlhfTUFYX1BSSU9SSVRZOyBwcmlvKyspIHsKKwkJbmV0ZGV2X3NldF9wcmlvX3RjX21hcChkZXYsIHByaW8sIGJwLT5wcmlvX3RvX2Nvc1twcmlvXSk7CisJCURQKEJOWDJYX01TR19TUCwgIm1hcHBpbmcgcHJpb3JpdHkgJWQgdG8gdGMgJWQiLAorCQkgICBwcmlvLCBicC0+cHJpb190b19jb3NbcHJpb10pOworCX0KKworCisJLyogVXNlIHRoaXMgY29uZmlndXJhdGlvbiB0byBkaWZmcmVudGlhdGUgdGMwIGZyb20gb3RoZXIgQ09TZXMKKwkgICBUaGlzIGNhbiBiZSB1c2VkIGZvciBldHMgb3IgcGZjLCBhbmQgc2F2ZSB0aGUgZWZmb3J0IG9mIHNldHRpbmcKKwkgICB1cCBhIG11bHRpbyBjbGFzcyBxdWV1ZSBkaXNjIG9yIG5lZ290aWF0aW5nIERDQlggd2l0aCBhIHN3aXRjaAorCW5ldGRldl9zZXRfcHJpb190Y19tYXAoZGV2LCAwLCAwKTsKKwlEUChCTlgyWF9NU0dfU1AsICJtYXBwaW5nIHByaW9yaXR5ICVkIHRvIHRjICVkIiwgMCwgMCk7CisJZm9yIChwcmlvID0gMTsgcHJpbyA8IDE2OyBwcmlvKyspIHsKKwkJbmV0ZGV2X3NldF9wcmlvX3RjX21hcChkZXYsIHByaW8sIDEpOworCQlEUChCTlgyWF9NU0dfU1AsICJtYXBwaW5nIHByaW9yaXR5ICVkIHRvIHRjICVkIiwgcHJpbywgMSk7CisJfSAqLworCisJLyogY29uZmlndXJlIHRyYWZmaWMgY2xhc3MgdG8gdHJhbnNtaXNzaW9uIHF1ZXVlIG1hcHBpbmcgKi8KKwlmb3IgKGNvcyA9IDA7IGNvcyA8IGJwLT5tYXhfY29zOyBjb3MrKykgeworCQljb3VudCA9IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKTsKKwkJb2Zmc2V0ID0gY29zICogTUFYX1RYUVNfUEVSX0NPUzsKKwkJbmV0ZGV2X3NldF90Y19xdWV1ZShkZXYsIGNvcywgY291bnQsIG9mZnNldCk7CisJCURQKEJOWDJYX01TR19TUCwgIm1hcHBpbmcgdGMgJWQgdG8gb2Zmc2V0ICVkIGNvdW50ICVkIiwKKwkJICAgY29zLCBvZmZzZXQsIGNvdW50KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyogY2FsbGVkIHdpdGggcnRubF9sb2NrICovCiBpbnQgYm54MnhfY2hhbmdlX21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCiB7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmMgPSAwOwogCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKCh1OCAqKShhZGRyLT5zYV9kYXRhKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOwotCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCi0JCWJueDJ4X3NldF9ldGhfbWFjKGJwLCAxKTsKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSAgeworCQlyYyA9IGJueDJ4X3NldF9ldGhfbWFjKGJwLCBmYWxzZSk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CiAKLQlyZXR1cm4gMDsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyYyA9IGJueDJ4X3NldF9ldGhfbWFjKGJwLCB0cnVlKTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgYm54MnhfZnJlZV9mcF9tZW1fYXQoc3RydWN0IGJueDJ4ICpicCwgaW50IGZwX2luZGV4KQogewogCXVuaW9uIGhvc3RfaGNfc3RhdHVzX2Jsb2NrICpzYiA9ICZibngyeF9mcChicCwgZnBfaW5kZXgsIHN0YXR1c19ibGspOwogCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ZwX2luZGV4XTsKKwl1OCBjb3M7CiAKIAkvKiBDb21tb24gKi8KICNpZmRlZiBCQ01fQ05JQwpAQCAtMjUxNiw3ICsyOTg1LDcgQEAKIAl9IGVsc2UgewogI2VuZGlmCiAJCS8qIHN0YXR1cyBibG9ja3MgKi8KLQkJaWYgKENISVBfSVNfRTIoYnApKQorCQlpZiAoIUNISVBfSVNfRTF4KGJwKSkKIAkJCUJOWDJYX1BDSV9GUkVFKHNiLT5lMl9zYiwKIAkJCQkgICAgICAgYm54MnhfZnAoYnAsIGZwX2luZGV4LAogCQkJCQkJc3RhdHVzX2Jsa19tYXBwaW5nKSwKQEAgLTI1NTQsMTAgKzMwMjMsMTggQEAKIAkvKiBUeCAqLwogCWlmICghc2tpcF90eF9xdWV1ZShicCwgZnBfaW5kZXgpKSB7CiAJCS8qIGZhc3RwYXRoIHR4IHJpbmdzOiB0eF9idWYgdHhfZGVzYyAqLwotCQlCTlgyWF9GUkVFKGJueDJ4X2ZwKGJwLCBmcF9pbmRleCwgdHhfYnVmX3JpbmcpKTsKLQkJQk5YMlhfUENJX0ZSRUUoYm54MnhfZnAoYnAsIGZwX2luZGV4LCB0eF9kZXNjX3JpbmcpLAotCQkJICAgICAgIGJueDJ4X2ZwKGJwLCBmcF9pbmRleCwgdHhfZGVzY19tYXBwaW5nKSwKLQkJCSAgICAgICBzaXplb2YodW5pb24gZXRoX3R4X2JkX3R5cGVzKSAqIE5VTV9UWF9CRCk7CisJCWZvcl9lYWNoX2Nvc19pbl90eF9xdWV1ZShmcCwgY29zKSB7CisJCQlzdHJ1Y3QgYm54MnhfZnBfdHhkYXRhICp0eGRhdGEgPSAmZnAtPnR4ZGF0YVtjb3NdOworCisJCQlEUChCTlgyWF9NU0dfU1AsCisJCQkgICAiZnJlZWluZyB0eCBtZW1vcnkgb2YgZnAgJWQgY29zICVkIGNpZCAlZCIsCisJCQkgICBmcF9pbmRleCwgY29zLCB0eGRhdGEtPmNpZCk7CisKKwkJCUJOWDJYX0ZSRUUodHhkYXRhLT50eF9idWZfcmluZyk7CisJCQlCTlgyWF9QQ0lfRlJFRSh0eGRhdGEtPnR4X2Rlc2NfcmluZywKKwkJCQl0eGRhdGEtPnR4X2Rlc2NfbWFwcGluZywKKwkJCQlzaXplb2YodW5pb24gZXRoX3R4X2JkX3R5cGVzKSAqIE5VTV9UWF9CRCk7CisJCX0KIAl9CiAJLyogZW5kIG9mIGZhc3RwYXRoICovCiB9CkBAIC0yNTcyLDcgKzMwNDksNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHNldF9zYl9zaG9ydGN1dHMoc3RydWN0IGJueDJ4ICpicCwgaW50IGluZGV4KQogewogCXVuaW9uIGhvc3RfaGNfc3RhdHVzX2Jsb2NrIHN0YXR1c19ibGsgPSBibngyeF9mcChicCwgaW5kZXgsIHN0YXR1c19ibGspOwotCWlmIChDSElQX0lTX0UyKGJwKSkgeworCWlmICghQ0hJUF9JU19FMXgoYnApKSB7CiAJCWJueDJ4X2ZwKGJwLCBpbmRleCwgc2JfaW5kZXhfdmFsdWVzKSA9CiAJCQkoX19sZTE2ICopc3RhdHVzX2Jsay5lMl9zYi0+c2IuaW5kZXhfdmFsdWVzOwogCQlibngyeF9mcChicCwgaW5kZXgsIHNiX3J1bm5pbmdfaW5kZXgpID0KQEAgLTI1OTAsMjYgKzMwNjcsMjQgQEAKIAl1bmlvbiBob3N0X2hjX3N0YXR1c19ibG9jayAqc2I7CiAJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaW5kZXhdOwogCWludCByaW5nX3NpemUgPSAwOworCXU4IGNvczsKIAogCS8qIGlmIHJ4X3Jpbmdfc2l6ZSBzcGVjaWZpZWQgLSB1c2UgaXQgKi8KIAlpbnQgcnhfcmluZ19zaXplID0gYnAtPnJ4X3Jpbmdfc2l6ZSA/IGJwLT5yeF9yaW5nX3NpemUgOgotCQkJICAgTUFYX1JYX0FWQUlML2JwLT5udW1fcXVldWVzOworCQkJICAgTUFYX1JYX0FWQUlML0JOWDJYX05VTV9SWF9RVUVVRVMoYnApOwogCiAJLyogYWxsb2NhdGUgYXQgbGVhc3QgbnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgYnkgRlcgKi8KLQlyeF9yaW5nX3NpemUgPSBtYXhfdChpbnQsIGZwLT5kaXNhYmxlX3RwYSA/IE1JTl9SWF9TSVpFX05PTlRQQSA6CisJcnhfcmluZ19zaXplID0gbWF4X3QoaW50LCBicC0+ZGlzYWJsZV90cGEgPyBNSU5fUlhfU0laRV9OT05UUEEgOgogCQkJCQkJICAgIE1JTl9SWF9TSVpFX1RQQSwKIAkJCQkgIHJ4X3Jpbmdfc2l6ZSk7CiAKLQlibngyeF9mcChicCwgaW5kZXgsIGJwKSA9IGJwOwotCWJueDJ4X2ZwKGJwLCBpbmRleCwgaW5kZXgpID0gaW5kZXg7Ci0KIAkvKiBDb21tb24gKi8KIAlzYiA9ICZibngyeF9mcChicCwgaW5kZXgsIHN0YXR1c19ibGspOwogI2lmZGVmIEJDTV9DTklDCiAJaWYgKCFJU19GQ09FX0lEWChpbmRleCkpIHsKICNlbmRpZgogCQkvKiBzdGF0dXMgYmxvY2tzICovCi0JCWlmIChDSElQX0lTX0UyKGJwKSkKKwkJaWYgKCFDSElQX0lTX0UxeChicCkpCiAJCQlCTlgyWF9QQ0lfQUxMT0Moc2ItPmUyX3NiLAogCQkJCSZibngyeF9mcChicCwgaW5kZXgsIHN0YXR1c19ibGtfbWFwcGluZyksCiAJCQkJc2l6ZW9mKHN0cnVjdCBob3N0X2hjX3N0YXR1c19ibG9ja19lMikpOwpAQCAtMjYyMCwxNiArMzA5NSwyOSBAQAogI2lmZGVmIEJDTV9DTklDCiAJfQogI2VuZGlmCi0Jc2V0X3NiX3Nob3J0Y3V0cyhicCwgaW5kZXgpOworCisJLyogRkNvRSBRdWV1ZSB1c2VzIERlZmF1bHQgU0IgYW5kIGRvZXNuJ3QgQUNLIHRoZSBTQiwgdGh1cyBubyBuZWVkIHRvCisJICogc2V0IHNob3J0Y3V0cyBmb3IgaXQuCisJICovCisJaWYgKCFJU19GQ09FX0lEWChpbmRleCkpCisJCXNldF9zYl9zaG9ydGN1dHMoYnAsIGluZGV4KTsKIAogCS8qIFR4ICovCiAJaWYgKCFza2lwX3R4X3F1ZXVlKGJwLCBpbmRleCkpIHsKIAkJLyogZmFzdHBhdGggdHggcmluZ3M6IHR4X2J1ZiB0eF9kZXNjICovCi0JCUJOWDJYX0FMTE9DKGJueDJ4X2ZwKGJwLCBpbmRleCwgdHhfYnVmX3JpbmcpLAorCQlmb3JfZWFjaF9jb3NfaW5fdHhfcXVldWUoZnAsIGNvcykgeworCQkJc3RydWN0IGJueDJ4X2ZwX3R4ZGF0YSAqdHhkYXRhID0gJmZwLT50eGRhdGFbY29zXTsKKworCQkJRFAoQk5YMlhfTVNHX1NQLCAiYWxsb2NhdGluZyB0eCBtZW1vcnkgb2YgIgorCQkJCQkgImZwICVkIGNvcyAlZCIsCisJCQkgICBpbmRleCwgY29zKTsKKworCQkJQk5YMlhfQUxMT0ModHhkYXRhLT50eF9idWZfcmluZywKIAkJCQlzaXplb2Yoc3RydWN0IHN3X3R4X2JkKSAqIE5VTV9UWF9CRCk7Ci0JCUJOWDJYX1BDSV9BTExPQyhibngyeF9mcChicCwgaW5kZXgsIHR4X2Rlc2NfcmluZyksCi0JCQkJJmJueDJ4X2ZwKGJwLCBpbmRleCwgdHhfZGVzY19tYXBwaW5nKSwKKwkJCUJOWDJYX1BDSV9BTExPQyh0eGRhdGEtPnR4X2Rlc2NfcmluZywKKwkJCQkmdHhkYXRhLT50eF9kZXNjX21hcHBpbmcsCiAJCQkJc2l6ZW9mKHVuaW9uIGV0aF90eF9iZF90eXBlcykgKiBOVU1fVFhfQkQpOworCQl9CiAJfQogCiAJLyogUnggKi8KQEAgLTI2NzIsNyArMzE2MCw3IEBACiAJCQkJCQlpbmRleCwgcmluZ19zaXplKTsKIAkvKiBGVyB3aWxsIGRyb3AgYWxsIHBhY2tldHMgaWYgcXVldWUgaXMgbm90IGJpZyBlbm91Z2gsCiAJICogSW4gdGhlc2UgY2FzZXMgd2UgZGlzYWJsZSB0aGUgcXVldWUKLQkgKiBNaW4gc2l6ZSBkaWZlcmVudCBmb3IgVFBBIGFuZCBub24tVFBBIHF1ZXVlcworCSAqIE1pbiBzaXplIGlzIGRpZmZlcmVudCBmb3IgT09PLCBUUEEgYW5kIG5vbi1UUEEgcXVldWVzCiAJICovCiAJaWYgKHJpbmdfc2l6ZSA8IChmcC0+ZGlzYWJsZV90cGEgPwogCQkJCU1JTl9SWF9TSVpFX05PTlRQQSA6IE1JTl9SWF9TSVpFX1RQQSkpIHsKQEAgLTI2OTAsMTcgKzMxNzgsMjQgQEAKIAkvKioKIAkgKiAxLiBBbGxvY2F0ZSBGUCBmb3IgbGVhZGluZyAtIGZhdGFsIGlmIGVycm9yCiAJICogMi4ge0NOSUN9IEFsbG9jYXRlIEZDb0UgRlAgLSBmYXRhbCBpZiBlcnJvcgotCSAqIDMuIEFsbG9jYXRlIFJTUyAtIGZpeCBudW1iZXIgb2YgcXVldWVzIGlmIGVycm9yCisJICogMy4ge0NOSUN9IEFsbG9jYXRlIE9PTyArIEZXRCAtIGRpc2FibGUgT09PIGlmIGVycm9yCisJICogNC4gQWxsb2NhdGUgUlNTIC0gZml4IG51bWJlciBvZiBxdWV1ZXMgaWYgZXJyb3IKIAkgKi8KIAogCS8qIGxlYWRpbmcgKi8KIAlpZiAoYm54MnhfYWxsb2NfZnBfbWVtX2F0KGJwLCAwKSkKIAkJcmV0dXJuIC1FTk9NRU07CisKICNpZmRlZiBCQ01fQ05JQwotCS8qIEZDb0UgKi8KLQlpZiAoYm54MnhfYWxsb2NfZnBfbWVtX2F0KGJwLCBGQ09FX0lEWCkpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICghTk9fRkNPRShicCkpCisJCS8qIEZDb0UgKi8KKwkJaWYgKGJueDJ4X2FsbG9jX2ZwX21lbV9hdChicCwgRkNPRV9JRFgpKQorCQkJLyogd2Ugd2lsbCBmYWlsIGxvYWQgcHJvY2VzcyBpbnN0ZWFkIG9mIG1hcmsKKwkJCSAqIE5PX0ZDT0VfRkxBRworCQkJICovCisJCQlyZXR1cm4gLUVOT01FTTsKICNlbmRpZgorCiAJLyogUlNTICovCiAJZm9yX2VhY2hfbm9uZGVmYXVsdF9ldGhfcXVldWUoYnAsIGkpCiAJCWlmIChibngyeF9hbGxvY19mcF9tZW1fYXQoYnAsIGkpKQpAQCAtMjcxOCw3ICszMjEzLDcgQEAKIAkJICogRkNPRV9JRFggPCBGV0RfSURYIDwgT09PX0lEWAogCQkgKi8KIAotCQkvKiBtb3ZlIEZDb0UgZnAgKi8KKwkJLyogbW92ZSBGQ29FIGZwIGV2ZW4gTk9fRkNPRV9GTEFHIGlzIG9uICovCiAJCWJueDJ4X21vdmVfZnAoYnAsIEZDT0VfSURYLCBGQ09FX0lEWCAtIGRlbHRhKTsKICNlbmRpZgogCQlicC0+bnVtX3F1ZXVlcyAtPSBkZWx0YTsKQEAgLTI3MjksMzAgKzMyMjQsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJueDJ4X3NldHVwX2lycXMoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgcmMgPSAwOwotCWlmIChicC0+ZmxhZ3MgJiBVU0lOR19NU0lYX0ZMQUcpIHsKLQkJcmMgPSBibngyeF9yZXFfbXNpeF9pcnFzKGJwKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCX0gZWxzZSB7Ci0JCWJueDJ4X2Fja19pbnQoYnApOwotCQlyYyA9IGJueDJ4X3JlcV9pcnEoYnApOwotCQlpZiAocmMpIHsKLQkJCUJOWDJYX0VSUigiSVJRIHJlcXVlc3QgZmFpbGVkICByYyAlZCwgYWJvcnRpbmdcbiIsIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQlpZiAoYnAtPmZsYWdzICYgVVNJTkdfTVNJX0ZMQUcpIHsKLQkJCWJwLT5kZXYtPmlycSA9IGJwLT5wZGV2LT5pcnE7Ci0JCQluZXRkZXZfaW5mbyhicC0+ZGV2LCAidXNpbmcgTVNJICBJUlEgJWRcbiIsCi0JCQkgICAgICAgYnAtPnBkZXYtPmlycSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogdm9pZCBibngyeF9mcmVlX21lbV9icChzdHJ1Y3QgYm54MnggKmJwKQogewogCWtmcmVlKGJwLT5mcCk7CkBAIC0yNzY1LDE2ICszMjM2LDIzIEBACiAJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcDsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSAqdGJsOwogCXN0cnVjdCBibngyeF9pbHQgKmlsdDsKKwlpbnQgbXNpeF90YWJsZV9zaXplID0gMDsKIAotCS8qIGZwIGFycmF5ICovCi0JZnAgPSBremFsbG9jKEwyX0ZQX0NPVU5UKGJwLT5sMl9jaWRfY291bnQpKnNpemVvZigqZnApLCBHRlBfS0VSTkVMKTsKKwkvKgorCSAqIFRoZSBiaWdnZXN0IE1TSS1YIHRhYmxlIHdlIG1pZ2h0IG5lZWQgaXMgYXMgYSBtYXhpbXVtIG51bWJlciBvZiBmYXN0CisJICogcGF0aCBJR1UgU0JzIHBsdXMgZGVmYXVsdCBTQiAoZm9yIFBGKS4KKwkgKi8KKwltc2l4X3RhYmxlX3NpemUgPSBicC0+aWd1X3NiX2NudCArIDE7CisKKwkvKiBmcCBhcnJheTogUlNTIHBsdXMgQ05JQyByZWxhdGVkIEwyIHF1ZXVlcyAqLworCWZwID0ga3phbGxvYygoQk5YMlhfTUFYX1JTU19DT1VOVChicCkgKyBOT05fRVRIX0NPTlRFWFRfVVNFKSAqCisJCSAgICAgc2l6ZW9mKCpmcCksIEdGUF9LRVJORUwpOwogCWlmICghZnApCiAJCWdvdG8gYWxsb2NfZXJyOwogCWJwLT5mcCA9IGZwOwogCiAJLyogbXNpeCB0YWJsZSAqLwotCXRibCA9IGt6YWxsb2MoKEZQX1NCX0NPVU5UKGJwLT5sMl9jaWRfY291bnQpICsgMSkgKiBzaXplb2YoKnRibCksCi0JCQkJICBHRlBfS0VSTkVMKTsKKwl0YmwgPSBremFsbG9jKG1zaXhfdGFibGVfc2l6ZSAqIHNpemVvZigqdGJsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0YmwpCiAJCWdvdG8gYWxsb2NfZXJyOwogCWJwLT5tc2l4X3RhYmxlID0gdGJsOwpAQCAtMjc5Miw3ICszMjcwLDcgQEAKIAogfQogCi1zdGF0aWMgaW50IGJueDJ4X3JlbG9hZF9pZl9ydW5uaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitpbnQgYm54MnhfcmVsb2FkX2lmX3J1bm5pbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtMjgwMyw2ICszMjgxLDc4IEBACiAJcmV0dXJuIGJueDJ4X25pY19sb2FkKGJwLCBMT0FEX05PUk1BTCk7CiB9CiAKK2ludCBibngyeF9nZXRfY3VyX3BoeV9pZHgoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgc2VsX3BoeV9pZHggPSAwOworCWlmIChicC0+bGlua19wYXJhbXMubnVtX3BoeXMgPD0gMSkKKwkJcmV0dXJuIElOVF9QSFk7CisKKwlpZiAoYnAtPmxpbmtfdmFycy5saW5rX3VwKSB7CisJCXNlbF9waHlfaWR4ID0gRVhUX1BIWTE7CisJCS8qIEluIGNhc2UgbGluayBpcyBTRVJERVMsIGNoZWNrIGlmIHRoZSBFWFRfUEhZMiBpcyB0aGUgb25lICovCisJCWlmICgoYnAtPmxpbmtfdmFycy5saW5rX3N0YXR1cyAmIExJTktfU1RBVFVTX1NFUkRFU19MSU5LKSAmJgorCQkgICAgKGJwLT5saW5rX3BhcmFtcy5waHlbRVhUX1BIWTJdLnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9GSUJSRSkpCisJCQlzZWxfcGh5X2lkeCA9IEVYVF9QSFkyOworCX0gZWxzZSB7CisKKwkJc3dpdGNoIChibngyeF9waHlfc2VsZWN0aW9uKCZicC0+bGlua19wYXJhbXMpKSB7CisJCWNhc2UgUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9IQVJEV0FSRV9ERUZBVUxUOgorCQljYXNlIFBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fRklSU1RfUEhZOgorCQljYXNlIFBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fRklSU1RfUEhZX1BSSU9SSVRZOgorCQkgICAgICAgc2VsX3BoeV9pZHggPSBFWFRfUEhZMTsKKwkJICAgICAgIGJyZWFrOworCQljYXNlIFBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fU0VDT05EX1BIWToKKwkJY2FzZSBQT1JUX0hXX0NGR19QSFlfU0VMRUNUSU9OX1NFQ09ORF9QSFlfUFJJT1JJVFk6CisJCSAgICAgICBzZWxfcGh5X2lkeCA9IEVYVF9QSFkyOworCQkgICAgICAgYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gc2VsX3BoeV9pZHg7CisKK30KK2ludCBibngyeF9nZXRfbGlua19jZmdfaWR4KHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHNlbF9waHlfaWR4ID0gYm54MnhfZ2V0X2N1cl9waHlfaWR4KGJwKTsKKwkvKgorCSAqIFRoZSBzZWxlY3RlZCBhY3RpdmVkIFBIWSBpcyBhbHdheXMgYWZ0ZXIgc3dhcHBpbmcgKGluIGNhc2UgUEhZCisJICogc3dhcHBpbmcgaXMgZW5hYmxlZCkuIFNvIHdoZW4gc3dhcHBpbmcgaXMgZW5hYmxlZCwgd2UgbmVlZCB0byByZXZlcnNlCisJICogdGhlIGNvbmZpZ3VyYXRpb24KKwkgKi8KKworCWlmIChicC0+bGlua19wYXJhbXMubXVsdGlfcGh5X2NvbmZpZyAmCisJICAgIFBPUlRfSFdfQ0ZHX1BIWV9TV0FQUEVEX0VOQUJMRUQpIHsKKwkJaWYgKHNlbF9waHlfaWR4ID09IEVYVF9QSFkxKQorCQkJc2VsX3BoeV9pZHggPSBFWFRfUEhZMjsKKwkJZWxzZSBpZiAoc2VsX3BoeV9pZHggPT0gRVhUX1BIWTIpCisJCQlzZWxfcGh5X2lkeCA9IEVYVF9QSFkxOworCX0KKwlyZXR1cm4gTElOS19DT05GSUdfSURYKHNlbF9waHlfaWR4KTsKK30KKworI2lmIGRlZmluZWQoTkVUREVWX0ZDT0VfV1dOTikgJiYgZGVmaW5lZChCQ01fQ05JQykKK2ludCBibngyeF9mY29lX2dldF93d24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTY0ICp3d24sIGludCB0eXBlKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBjbmljX2V0aF9kZXYgKmNwID0gJmJwLT5jbmljX2V0aF9kZXY7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE5FVERFVl9GQ09FX1dXTk46CisJCSp3d24gPSBISUxPX1U2NChjcC0+ZmNvZV93d25fbm9kZV9uYW1lX2hpLAorCQkJCWNwLT5mY29lX3d3bl9ub2RlX25hbWVfbG8pOworCQlicmVhazsKKwljYXNlIE5FVERFVl9GQ09FX1dXUE46CisJCSp3d24gPSBISUxPX1U2NChjcC0+ZmNvZV93d25fcG9ydF9uYW1lX2hpLAorCQkJCWNwLT5mY29lX3d3bl9wb3J0X25hbWVfbG8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiAvKiBjYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KIGludCBibngyeF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogewpAQCAtMjg4Miw4ICszNDMyLDEzIEBACiAJaWYgKCFicC0+cGFuaWMpCiAJCWJueDJ4X3BhbmljKCk7CiAjZW5kaWYKKworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCXNldF9iaXQoQk5YMlhfU1BfUlROTF9UWF9USU1FT1VULCAmYnAtPnNwX3J0bmxfc3RhdGUpOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisKIAkvKiBUaGlzIGFsbG93cyB0aGUgbmV0aWYgdG8gYmUgc2h1dGRvd24gZ3JhY2VmdWxseSBiZWZvcmUgcmVzZXR0aW5nICovCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+cmVzZXRfdGFzaywgMCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+c3BfcnRubF90YXNrLCAwKTsKIH0KIAogaW50IGJueDJ4X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKQEAgLTI5NTQsMyArMzUwOSw1NyBAQAogCiAJcmV0dXJuIHJjOwogfQorCisKK3ZvaWQgYm54Mnhfc2V0X2N0eF92YWxpZGF0aW9uKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBldGhfY29udGV4dCAqY3h0LAorCQkJICAgICAgdTMyIGNpZCkKK3sKKwkvKiB1c3Rvcm0gY3h0IHZhbGlkYXRpb24gKi8KKwljeHQtPnVzdG9ybV9hZ19jb250ZXh0LmNkdV91c2FnZSA9CisJCUNEVV9SU1JWRF9WQUxVRV9UWVBFX0EoSFdfQ0lEKGJwLCBjaWQpLAorCQkJQ0RVX1JFR0lPTl9OVU1CRVJfVUNNX0FHLCBFVEhfQ09OTkVDVElPTl9UWVBFKTsKKwkvKiB4Y29udGV4dCB2YWxpZGF0aW9uICovCisJY3h0LT54c3Rvcm1fYWdfY29udGV4dC5jZHVfcmVzZXJ2ZWQgPQorCQlDRFVfUlNSVkRfVkFMVUVfVFlQRV9BKEhXX0NJRChicCwgY2lkKSwKKwkJCUNEVV9SRUdJT05fTlVNQkVSX1hDTV9BRywgRVRIX0NPTk5FQ1RJT05fVFlQRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9ybV9tZW1zZXRfaGNfdGltZW91dChzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LAorCQkJCQkgICAgIHU4IGZ3X3NiX2lkLCB1OCBzYl9pbmRleCwKKwkJCQkJICAgICB1OCB0aWNrcykKK3sKKworCXUzMiBhZGRyID0gQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkJICAgQ1NUT1JNX1NUQVRVU19CTE9DS19EQVRBX1RJTUVPVVRfT0ZGU0VUKGZ3X3NiX2lkLCBzYl9pbmRleCk7CisJUkVHX1dSOChicCwgYWRkciwgdGlja3MpOworCURQKE5FVElGX01TR19IVywgInBvcnQgJXggZndfc2JfaWQgJWQgc2JfaW5kZXggJWQgdGlja3MgJWRcbiIsCisJCQkgIHBvcnQsIGZ3X3NiX2lkLCBzYl9pbmRleCwgdGlja3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3Rvcm1fbWVtc2V0X2hjX2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCwgdTggcG9ydCwKKwkJCQkJICAgICB1MTYgZndfc2JfaWQsIHU4IHNiX2luZGV4LAorCQkJCQkgICAgIHU4IGRpc2FibGUpCit7CisJdTMyIGVuYWJsZV9mbGFnID0gZGlzYWJsZSA/IDAgOiAoMSA8PCBIQ19JTkRFWF9EQVRBX0hDX0VOQUJMRURfU0hJRlQpOworCXUzMiBhZGRyID0gQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkJICAgQ1NUT1JNX1NUQVRVU19CTE9DS19EQVRBX0ZMQUdTX09GRlNFVChmd19zYl9pZCwgc2JfaW5kZXgpOworCXUxNiBmbGFncyA9IFJFR19SRDE2KGJwLCBhZGRyKTsKKwkvKiBjbGVhciBhbmQgc2V0ICovCisJZmxhZ3MgJj0gfkhDX0lOREVYX0RBVEFfSENfRU5BQkxFRDsKKwlmbGFncyB8PSBlbmFibGVfZmxhZzsKKwlSRUdfV1IxNihicCwgYWRkciwgZmxhZ3MpOworCURQKE5FVElGX01TR19IVywgInBvcnQgJXggZndfc2JfaWQgJWQgc2JfaW5kZXggJWQgZGlzYWJsZSAlZFxuIiwKKwkJCSAgcG9ydCwgZndfc2JfaWQsIHNiX2luZGV4LCBkaXNhYmxlKTsKK30KKwordm9pZCBibngyeF91cGRhdGVfY29hbGVzY2Vfc2JfaW5kZXgoc3RydWN0IGJueDJ4ICpicCwgdTggZndfc2JfaWQsCisJCQkJICAgIHU4IHNiX2luZGV4LCB1OCBkaXNhYmxlLCB1MTYgdXNlYykKK3sKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCXU4IHRpY2tzID0gdXNlYyAvIEJOWDJYX0JUUjsKKworCXN0b3JtX21lbXNldF9oY190aW1lb3V0KGJwLCBwb3J0LCBmd19zYl9pZCwgc2JfaW5kZXgsIHRpY2tzKTsKKworCWRpc2FibGUgPSBkaXNhYmxlID8gMSA6ICh1c2VjID8gMCA6IDEpOworCXN0b3JtX21lbXNldF9oY19kaXNhYmxlKGJwLCBwb3J0LCBmd19zYl9pZCwgc2JfaW5kZXgsIGRpc2FibGUpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfY21uLmggYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9jbW4uaAppbmRleCAxYTM1NDViLi4yMjNiZmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9jbW4uaAorKysgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9jbW4uaApAQCAtMTgsMTEgKzE4LDE1IEBACiAjZGVmaW5lIEJOWDJYX0NNTl9ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogCiAKICNpbmNsdWRlICJibngyeC5oIgogCisvKiBUaGlzIGlzIHVzZWQgYXMgYSByZXBsYWNlbWVudCBmb3IgYW4gTUNQIGlmIGl0J3Mgbm90IHByZXNlbnQgKi8KK2V4dGVybiBpbnQgbG9hZF9jb3VudFsyXVszXTsgLyogcGVyLXBhdGg6IDAtY29tbW9uLCAxLXBvcnQwLCAyLXBvcnQxICovCisKIGV4dGVybiBpbnQgbnVtX3F1ZXVlczsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiBNYWNyb3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02MSw2ICs2NSw3MyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqIEludGVyZmFjZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIEZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgZWFjaCBkcml2ZXIgdmVyc2lvbgogICovCisvKiBJbml0ICovCisKKy8qKgorICogYm54Mnhfc2VuZF91bmxvYWRfcmVxIC0gcmVxdWVzdCB1bmxvYWQgbW9kZSBmcm9tIHRoZSBNQ1AuCisgKgorICogQGJwOgkJCWRyaXZlciBoYW5kbGUKKyAqIEB1bmxvYWRfbW9kZToJcmVxdWVzdGVkIGZ1bmN0aW9uJ3MgdW5sb2FkIG1vZGUKKyAqCisgKiBSZXR1cm4gdW5sb2FkIG1vZGUgcmV0dXJuZWQgYnkgdGhlIE1DUDogQ09NTU9OLCBQT1JUIG9yIEZVTkMuCisgKi8KK3UzMiBibngyeF9zZW5kX3VubG9hZF9yZXEoc3RydWN0IGJueDJ4ICpicCwgaW50IHVubG9hZF9tb2RlKTsKKworLyoqCisgKiBibngyeF9zZW5kX3VubG9hZF9kb25lIC0gc2VuZCBVTkxPQURfRE9ORSBjb21tYW5kIHRvIHRoZSBNQ1AuCisgKgorICogQGJwOgkJZHJpdmVyIGhhbmRsZQorICovCit2b2lkIGJueDJ4X3NlbmRfdW5sb2FkX2RvbmUoc3RydWN0IGJueDJ4ICpicCk7CisKKy8qKgorICogYm54MnhfY29uZmlnX3Jzc19wZiAtIGNvbmZpZ3VyZSBSU1MgcGFyYW1ldGVycy4KKyAqCisgKiBAYnA6CQkJZHJpdmVyIGhhbmRsZQorICogQGluZF90YWJsZToJCWluZGlyZWN0aW9uIHRhYmxlIHRvIGNvbmZpZ3VyZQorICogQGNvbmZpZ19oYXNoOglyZS1jb25maWd1cmUgUlNTIGhhc2gga2V5cyBjb25maWd1cmF0aW9uCisgKi8KK2ludCBibngyeF9jb25maWdfcnNzX3BmKHN0cnVjdCBibngyeCAqYnAsIHU4ICppbmRfdGFibGUsIGJvb2wgY29uZmlnX2hhc2gpOworCisvKioKKyAqIGJueDJ4X19pbml0X2Z1bmNfb2JqIC0gaW5pdCBmdW5jdGlvbiBvYmplY3QKKyAqCisgKiBAYnA6CQkJZHJpdmVyIGhhbmRsZQorICoKKyAqIEluaXRpYWxpemVzIHRoZSBGdW5jdGlvbiBPYmplY3Qgd2l0aCB0aGUgYXBwcm9wcmlhdGUKKyAqIHBhcmFtZXRlcnMgd2hpY2ggaW5jbHVkZSBhIGZ1bmN0aW9uIHNsb3cgcGF0aCBkcml2ZXIKKyAqIGludGVyZmFjZS4KKyAqLwordm9pZCBibngyeF9faW5pdF9mdW5jX29iaihzdHJ1Y3QgYm54MnggKmJwKTsKKworLyoqCisgKiBibngyeF9zZXR1cF9xdWV1ZSAtIHNldHVwIGV0aCBxdWV1ZS4KKyAqCisgKiBAYnA6CQlkcml2ZXIgaGFuZGxlCisgKiBAZnA6CQlwb2ludGVyIHRvIHRoZSBmYXN0cGF0aCBzdHJ1Y3R1cmUKKyAqIEBsZWFkaW5nOglib29sZWFuCisgKgorICovCitpbnQgYm54Mnhfc2V0dXBfcXVldWUoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKKwkJICAgICAgIGJvb2wgbGVhZGluZyk7CisKKy8qKgorICogYm54Mnhfc2V0dXBfbGVhZGluZyAtIGJyaW5nIHVwIGEgbGVhZGluZyBldGggcXVldWUuCisgKgorICogQGJwOgkJZHJpdmVyIGhhbmRsZQorICovCitpbnQgYm54Mnhfc2V0dXBfbGVhZGluZyhzdHJ1Y3QgYm54MnggKmJwKTsKKworLyoqCisgKiBibngyeF9md19jb21tYW5kIC0gc2VuZCB0aGUgTUNQIGEgcmVxdWVzdAorICoKKyAqIEBicDoJCWRyaXZlciBoYW5kbGUKKyAqIEBjb21tYW5kOglyZXF1ZXN0CisgKiBAcGFyYW06CXJlcXVlc3QncyBwYXJhbWV0ZXIKKyAqCisgKiBibG9jayB1bnRpbCB0aGVyZSBpcyBhIHJlcGx5CisgKi8KK3UzMiBibngyeF9md19jb21tYW5kKHN0cnVjdCBibngyeCAqYnAsIHUzMiBjb21tYW5kLCB1MzIgcGFyYW0pOwogCiAvKioKICAqIGJueDJ4X2luaXRpYWxfcGh5X2luaXQgLSBpbml0aWFsaXplIGxpbmsgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgdmFyaWFibGVzLgpAQCAtODgsNiArMTU5LDMyIEBACiB1OCBibngyeF9saW5rX3Rlc3Qoc3RydWN0IGJueDJ4ICpicCwgdTggaXNfc2VyZGVzKTsKIAogLyoqCisgKiBibngyeF9kcnZfcHVsc2UgLSB3cml0ZSBkcml2ZXIgcHVsc2UgdG8gc2htZW0KKyAqCisgKiBAYnA6CQlkcml2ZXIgaGFuZGxlCisgKgorICogd3JpdGVzIHRoZSB2YWx1ZSBpbiBicC0+ZndfZHJ2X3B1bHNlX3dyX3NlcSB0byBkcnZfcHVsc2UgbWJveAorICogaW4gdGhlIHNobWVtLgorICovCit2b2lkIGJueDJ4X2Rydl9wdWxzZShzdHJ1Y3QgYm54MnggKmJwKTsKKworLyoqCisgKiBibngyeF9pZ3VfYWNrX3NiIC0gdXBkYXRlIElHVSB3aXRoIGN1cnJlbnQgU0IgdmFsdWUKKyAqCisgKiBAYnA6CQlkcml2ZXIgaGFuZGxlCisgKiBAaWd1X3NiX2lkOglTQiBpZAorICogQHNlZ21lbnQ6CVNCIHNlZ21lbnQKKyAqIEBpbmRleDoJU0IgaW5kZXgKKyAqIEBvcDoJCVNCIG9wZXJhdGlvbgorICogQHVwZGF0ZToJaXMgSFcgdXBkYXRlIHJlcXVpcmVkCisgKi8KK3ZvaWQgYm54MnhfaWd1X2Fja19zYihzdHJ1Y3QgYm54MnggKmJwLCB1OCBpZ3Vfc2JfaWQsIHU4IHNlZ21lbnQsCisJCSAgICAgIHUxNiBpbmRleCwgdTggb3AsIHU4IHVwZGF0ZSk7CisKKy8qIERpc2FibGUgdHJhbnNhY3Rpb25zIGZyb20gY2hpcCB0byBob3N0ICovCit2b2lkIGJueDJ4X3BmX2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCk7CisKKy8qKgogICogYm54MnhfX2xpbmtfc3RhdHVzX3VwZGF0ZSAtIGhhbmRsZXMgbGluayBzdGF0dXMgY2hhbmdlLgogICoKICAqIEBicDoJCWRyaXZlciBoYW5kbGUKQEAgLTE2NSwyMSArMjYyLDYgQEAKIHZvaWQgYm54MnhfaW50X2Rpc2FibGVfc3luYyhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZGlzYWJsZV9odyk7CiAKIC8qKgotICogYm54MnhfaW5pdF9maXJtd2FyZSAtIGxvYWRzIGRldmljZSBmaXJtd2FyZQotICoKLSAqIEBicDoJCWRyaXZlciBoYW5kbGUKLSAqLwotaW50IGJueDJ4X2luaXRfZmlybXdhcmUoc3RydWN0IGJueDJ4ICpicCk7Ci0KLS8qKgotICogYm54MnhfaW5pdF9odyAtIGluaXQgSFcgYmxvY2tzIGFjY29yZGluZyB0byBjdXJyZW50IGluaXRpYWxpemF0aW9uIHN0YWdlLgotICoKLSAqIEBicDoJCWRyaXZlciBoYW5kbGUKLSAqIEBsb2FkX2NvZGU6CUNPTU1PTiwgUE9SVCBvciBGVU5DVElPTgotICovCi1pbnQgYm54MnhfaW5pdF9odyhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgbG9hZF9jb2RlKTsKLQotLyoqCiAgKiBibngyeF9uaWNfaW5pdCAtIGluaXQgZHJpdmVyIGludGVybmFscy4KICAqCiAgKiBAYnA6CQlkcml2ZXIgaGFuZGxlCkBAIC0yMDcsMTYgKzI4OSw2IEBACiB2b2lkIGJueDJ4X2ZyZWVfbWVtKHN0cnVjdCBibngyeCAqYnApOwogCiAvKioKLSAqIGJueDJ4X3NldHVwX2NsaWVudCAtIHNldHVwIGV0aCBjbGllbnQuCi0gKgotICogQGJwOgkJZHJpdmVyIGhhbmRsZQotICogQGZwOgkJcG9pbnRlciB0byBmYXN0cGF0aCBzdHJ1Y3R1cmUKLSAqIEBpc19sZWFkaW5nOglib29sZWFuCi0gKi8KLWludCBibngyeF9zZXR1cF9jbGllbnQoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKLQkJICAgICAgIGludCBpc19sZWFkaW5nKTsKLQotLyoqCiAgKiBibngyeF9zZXRfbnVtX3F1ZXVlcyAtIHNldCBudW1iZXIgb2YgcXVldWVzIGFjY29yZGluZyB0byBtb2RlLgogICoKICAqIEBicDoJCWRyaXZlciBoYW5kbGUKQEAgLTI1Miw2ICszMjQsMTMgQEAKIGludCBibngyeF9yZWxlYXNlX2h3X2xvY2soc3RydWN0IGJueDJ4ICpicCwgdTMyIHJlc291cmNlKTsKIAogLyoqCisgKiBibngyeF9yZWxlYXNlX2xlYWRlcl9sb2NrIC0gcmVsZWFzZSByZWNvdmVyeSBsZWFkZXIgbG9jaworICoKKyAqIEBicDoJCWRyaXZlciBoYW5kbGUKKyAqLworaW50IGJueDJ4X3JlbGVhc2VfbGVhZGVyX2xvY2soc3RydWN0IGJueDJ4ICpicCk7CisKKy8qKgogICogYm54Mnhfc2V0X2V0aF9tYWMgLSBjb25maWd1cmUgZXRoIE1BQyBhZGRyZXNzIGluIHRoZSBIVwogICoKICAqIEBicDoJCWRyaXZlciBoYW5kbGUKQEAgLTI1OSwyOSArMzM4LDcgQEAKICAqCiAgKiBDb25maWd1cmVzIGFjY29yZGluZyB0byB0aGUgdmFsdWUgaW4gbmV0ZGV2LT5kZXZfYWRkci4KICAqLwotdm9pZCBibngyeF9zZXRfZXRoX21hYyhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc2V0KTsKLQotI2lmZGVmIEJDTV9DTklDCi0vKioKLSAqIGJueDJ4X3NldF9maXBfZXRoX21hY19hZGRyIC0gU2V0L0NsZWFyIEZJUCBNQUMocykKLSAqCi0gKiBAYnA6CQlkcml2ZXIgaGFuZGxlCi0gKiBAc2V0OglzZXQgb3IgY2xlYXIgdGhlIENBTSBlbnRyeQotICoKLSAqIFVzZWQgbmV4dCBlbnRpZXMgaW4gdGhlIENBTSBhZnRlciB0aGUgRVRIIE1BQyhzKS4KLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCB3YWl0IHVudGlsIHRoZSByYW1kb3JkIGNvbXBsZXRpb24gcmV0dXJucy4KLSAqIFJldHVybiAwIGlmIGN1c3Nlc3MsIC1FTk9ERVYgaWYgcmFtcm9kIGRvZXNuJ3QgcmV0dXJuLgotICovCi1pbnQgYm54Mnhfc2V0X2ZpcF9ldGhfbWFjX2FkZHIoc3RydWN0IGJueDJ4ICpicCwgaW50IHNldCk7Ci0KLS8qKgotICogYm54Mnhfc2V0X2FsbF9lbm9kZV9tYWNzIC0gU2V0L0NsZWFyIEFMTF9FTk9ERSBtY2FzdCBNQUMuCi0gKgotICogQGJwOgkJZHJpdmVyIGhhbmRsZQotICogQHNldDoJc2V0IG9yIGNsZWFyCi0gKi8KLWludCBibngyeF9zZXRfYWxsX2Vub2RlX21hY3Moc3RydWN0IGJueDJ4ICpicCwgaW50IHNldCk7Ci0jZW5kaWYKK2ludCBibngyeF9zZXRfZXRoX21hYyhzdHJ1Y3QgYm54MnggKmJwLCBib29sIHNldCk7CiAKIC8qKgogICogYm54Mnhfc2V0X3J4X21vZGUgLSBzZXQgTUFDIGZpbHRlcmluZyBjb25maWd1cmF0aW9ucy4KQEAgLTI4OSw2ICszNDYsOCBAQAogICogQGRldjoJbmV0ZGV2aWNlCiAgKgogICogY2FsbGVkIHdpdGggbmV0aWZfdHhfbG9jayBmcm9tIGRldl9tY2FzdC5jCisgKiBJZiBicC0+c3RhdGUgaXMgT1BFTiwgc2hvdWxkIGJlIGNhbGxlZCB3aXRoCisgKiBuZXRpZl9hZGRyX2xvY2tfYmgoKQogICovCiB2b2lkIGJueDJ4X3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCkBAIC0yOTYsMjUgKzM1NSwzOCBAQAogICogYm54Mnhfc2V0X3N0b3JtX3J4X21vZGUgLSBjb25maWd1cmUgTUFDIGZpbHRlcmluZyBydWxlcyBpbiBhIEZXLgogICoKICAqIEBicDoJCWRyaXZlciBoYW5kbGUKKyAqCisgKiBJZiBicC0+c3RhdGUgaXMgT1BFTiwgc2hvdWxkIGJlIGNhbGxlZCB3aXRoCisgKiBuZXRpZl9hZGRyX2xvY2tfYmgoKS4KICAqLwogdm9pZCBibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShzdHJ1Y3QgYm54MnggKmJwKTsKIAorLyoqCisgKiBibngyeF9zZXRfcV9yeF9tb2RlIC0gY29uZmlndXJlcyByeF9tb2RlIGZvciBhIHNpbmdsZSBxdWV1ZS4KKyAqCisgKiBAYnA6CQkJZHJpdmVyIGhhbmRsZQorICogQGNsX2lkOgkJY2xpZW50IGlkCisgKiBAcnhfbW9kZV9mbGFnczoJcnggbW9kZSBjb25maWd1cmF0aW9uCisgKiBAcnhfYWNjZXB0X2ZsYWdzOglyeCBhY2NlcHQgY29uZmlndXJhdGlvbgorICogQHR4X2FjY2VwdF9mbGFnczoJdHggYWNjZXB0IGNvbmZpZ3VyYXRpb24gKHR4IHN3aXRjaCkKKyAqIEByYW1yb2RfZmxhZ3M6CXJhbXJvZCBjb25maWd1cmF0aW9uCisgKi8KK3ZvaWQgYm54Mnhfc2V0X3FfcnhfbW9kZShzdHJ1Y3QgYm54MnggKmJwLCB1OCBjbF9pZCwKKwkJCSB1bnNpZ25lZCBsb25nIHJ4X21vZGVfZmxhZ3MsCisJCQkgdW5zaWduZWQgbG9uZyByeF9hY2NlcHRfZmxhZ3MsCisJCQkgdW5zaWduZWQgbG9uZyB0eF9hY2NlcHRfZmxhZ3MsCisJCQkgdW5zaWduZWQgbG9uZyByYW1yb2RfZmxhZ3MpOworCiAvKiBQYXJpdHkgZXJyb3JzIHJlbGF0ZWQgKi8KIHZvaWQgYm54MnhfaW5jX2xvYWRfY250KHN0cnVjdCBibngyeCAqYnApOwogdTMyIGJueDJ4X2RlY19sb2FkX2NudChzdHJ1Y3QgYm54MnggKmJwKTsKLWJvb2wgYm54MnhfY2hrX3Bhcml0eV9hdHRuKHN0cnVjdCBibngyeCAqYnApOwotYm9vbCBibngyeF9yZXNldF9pc19kb25lKHN0cnVjdCBibngyeCAqYnApOworYm9vbCBibngyeF9jaGtfcGFyaXR5X2F0dG4oc3RydWN0IGJueDJ4ICpicCwgYm9vbCAqZ2xvYmFsLCBib29sIHByaW50KTsKK2Jvb2wgYm54MnhfcmVzZXRfaXNfZG9uZShzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZW5naW5lKTsKK3ZvaWQgYm54Mnhfc2V0X3Jlc2V0X2luX3Byb2dyZXNzKHN0cnVjdCBibngyeCAqYnApOwordm9pZCBibngyeF9zZXRfcmVzZXRfZ2xvYmFsKHN0cnVjdCBibngyeCAqYnApOwogdm9pZCBibngyeF9kaXNhYmxlX2Nsb3NlX3RoZV9nYXRlKHN0cnVjdCBibngyeCAqYnApOwogCiAvKioKLSAqIGJueDJ4X3N0YXRzX2hhbmRsZSAtIHBlcmZvcm0gc3RhdGlzdGljcyBoYW5kbGluZyBhY2NvcmRpbmcgdG8gZXZlbnQuCi0gKgotICogQGJwOgkJZHJpdmVyIGhhbmRsZQotICogQGV2ZW50OglibngyeF9zdGF0c19ldmVudAotICovCi12b2lkIGJueDJ4X3N0YXRzX2hhbmRsZShzdHJ1Y3QgYm54MnggKmJwLCBlbnVtIGJueDJ4X3N0YXRzX2V2ZW50IGV2ZW50KTsKLQotLyoqCiAgKiBibngyeF9zcF9ldmVudCAtIGhhbmRsZSByYW1yb2RzIGNvbXBsZXRpb24uCiAgKgogICogQGZwOgkJZmFzdHBhdGggaGFuZGxlIGZvciB0aGUgZXZlbnQKQEAgLTMyMywxNSArMzk1LDYgQEAKIHZvaWQgYm54Mnhfc3BfZXZlbnQoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgdW5pb24gZXRoX3J4X2NxZSAqcnJfY3FlKTsKIAogLyoqCi0gKiBibngyeF9mdW5jX3N0YXJ0IC0gaW5pdCBmdW5jdGlvbgotICoKLSAqIEBicDoJCWRyaXZlciBoYW5kbGUKLSAqCi0gKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgc2VuZGluZyBDTElFTlRfU0VUVVAgZm9yIHRoZSBmaXJzdCBjbGllbnQuCi0gKi8KLWludCBibngyeF9mdW5jX3N0YXJ0KHN0cnVjdCBibngyeCAqYnApOwotCi0vKioKICAqIGJueDJ4X2lsdF9zZXRfaW5mbyAtIHByZXBhcmUgSUxUIGNvbmZpZ3VyYXRpb25zLgogICoKICAqIEBicDoJCWRyaXZlciBoYW5kbGUKQEAgLTM2Miw2ICs0MjUsMTAgQEAKICAqIEB2YWx1ZToJbmV3IHZhbHVlCiAgKi8KIHZvaWQgYm54MnhfdXBkYXRlX21heF9tZl9jb25maWcoc3RydWN0IGJueDJ4ICpicCwgdTMyIHZhbHVlKTsKKy8qIEVycm9yIGhhbmRsaW5nICovCit2b2lkIGJueDJ4X3BhbmljX2R1bXAoc3RydWN0IGJueDJ4ICpicCk7CisKK3ZvaWQgYm54MnhfZndfZHVtcF9sdmwoc3RydWN0IGJueDJ4ICpicCwgY29uc3QgY2hhciAqbHZsKTsKIAogLyogZGV2X2Nsb3NlIG1haW4gYmxvY2sgKi8KIGludCBibngyeF9uaWNfdW5sb2FkKHN0cnVjdCBibngyeCAqYnAsIGludCB1bmxvYWRfbW9kZSk7CkBAIC0zNzIsMTYgKzQzOSwyNSBAQAogLyogaGFyZF94bWl0IGNhbGxiYWNrICovCiBuZXRkZXZfdHhfdCBibngyeF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCisvKiBzZXR1cF90YyBjYWxsYmFjayAqLworaW50IGJueDJ4X3NldHVwX3RjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IG51bV90Yyk7CisKIC8qIHNlbGVjdF9xdWV1ZSBjYWxsYmFjayAqLwogdTE2IGJueDJ4X3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAorLyogcmVsb2FkIGhlbHBlciAqLworaW50IGJueDJ4X3JlbG9hZF9pZl9ydW5uaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCiBpbnQgYm54MnhfY2hhbmdlX21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApOwogCiAvKiBOQVBJIHBvbGwgUnggcGFydCAqLwogaW50IGJueDJ4X3J4X2ludChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLCBpbnQgYnVkZ2V0KTsKIAordm9pZCBibngyeF91cGRhdGVfcnhfcHJvZChzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLAorCQkJdTE2IGJkX3Byb2QsIHUxNiByeF9jb21wX3Byb2QsIHUxNiByeF9zZ2VfcHJvZCk7CisKIC8qIE5BUEkgcG9sbCBUeCBwYXJ0ICovCi1pbnQgYm54MnhfdHhfaW50KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApOworaW50IGJueDJ4X3R4X2ludChzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54MnhfZnBfdHhkYXRhICp0eGRhdGEpOwogCiAvKiBzdXNwZW5kL3Jlc3VtZSBjYWxsYmFja3MgKi8KIGludCBibngyeF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwpAQCAtMzkyLDcgKzQ2OCw2IEBACiAKIHZvaWQgYm54MnhfZnJlZV9mcF9tZW0oc3RydWN0IGJueDJ4ICpicCk7CiBpbnQgYm54MnhfYWxsb2NfZnBfbWVtKHN0cnVjdCBibngyeCAqYnApOwotCiB2b2lkIGJueDJ4X2luaXRfcnhfcmluZ3Moc3RydWN0IGJueDJ4ICpicCk7CiB2b2lkIGJueDJ4X2ZyZWVfc2ticyhzdHJ1Y3QgYm54MnggKmJwKTsKIHZvaWQgYm54MnhfbmV0aWZfc3RvcChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgZGlzYWJsZV9odyk7CkBAIC00NDcsNiArNTIyLDE3IEBACiAgKi8KIGludCBibngyeF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KTsKIAorI2lmIGRlZmluZWQoQkNNX0NOSUMpICYmIChkZWZpbmVkKENPTkZJR19GQ09FKSB8fCBkZWZpbmVkKENPTkZJR19GQ09FX01PRFVMRSkpCisvKioKKyAqIGJueDJ4X2Zjb2VfZ2V0X3d3biAtIHJldHVybiB0aGUgcmVxdWVzdGVkIFdXTiB2YWx1ZSBmb3IgdGhpcyBwb3J0CisgKgorICogQGRldjoJbmV0X2RldmljZQorICogQHd3bjoJb3V0cHV0IGJ1ZmZlcgorICogQHR5cGU6CVdXTiB0eXBlOiBORVRERVZfRkNPRV9XV05OIChub2RlKSBvciBORVRERVZfRkNPRV9XV1BOIChwb3J0KQorICoKKyAqLworaW50IGJueDJ4X2Zjb2VfZ2V0X3d3bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1NjQgKnd3biwgaW50IHR5cGUpOworI2VuZGlmCiB1MzIgYm54MnhfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcyk7CiBpbnQgYm54Mnhfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcyk7CiAKQEAgLTQ1NywxOSArNTQzLDIwIEBACiAgKi8KIHZvaWQgYm54MnhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqIElubGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKiBGYXN0IHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfdXBkYXRlX2Zwc2JfaWR4KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCiB7CiAJYmFycmllcigpOyAvKiBzdGF0dXMgYmxvY2sgaXMgd3JpdHRlbiB0byBieSB0aGUgY2hpcCAqLwogCWZwLT5mcF9oY19pZHggPSBmcC0+c2JfcnVubmluZ19pbmRleFtTTV9SWF9JRF07CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF91cGRhdGVfcnhfcHJvZChzdHJ1Y3QgYm54MnggKmJwLAotCQkJCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLAotCQkJCQl1MTYgYmRfcHJvZCwgdTE2IHJ4X2NvbXBfcHJvZCwKLQkJCQkJdTE2IHJ4X3NnZV9wcm9kKQorc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3VwZGF0ZV9yeF9wcm9kX2dlbihzdHJ1Y3QgYm54MnggKmJwLAorCQkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgdTE2IGJkX3Byb2QsCisJCQl1MTYgcnhfY29tcF9wcm9kLCB1MTYgcnhfc2dlX3Byb2QsIHUzMiBzdGFydCkKIHsKIAlzdHJ1Y3QgdXN0b3JtX2V0aF9yeF9wcm9kdWNlcnMgcnhfcHJvZHMgPSB7MH07Ci0JaW50IGk7CisJdTMyIGk7CiAKIAkvKiBVcGRhdGUgcHJvZHVjZXJzICovCiAJcnhfcHJvZHMuYmRfcHJvZCA9IGJkX3Byb2Q7CkBAIC00ODYsMTAgKzU3Myw4IEBACiAJICovCiAJd21iKCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCB1c3Rvcm1fZXRoX3J4X3Byb2R1Y2VycykvNDsgaSsrKQotCQlSRUdfV1IoYnAsCi0JCSAgICAgICBCQVJfVVNUUk9STV9JTlRNRU0gKyBmcC0+dXN0b3JtX3J4X3Byb2RzX29mZnNldCArIGkqNCwKLQkJICAgICAgICgodTMyICopJnJ4X3Byb2RzKVtpXSk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihyeF9wcm9kcykvNDsgaSsrKQorCQlSRUdfV1IoYnAsIHN0YXJ0ICsgaSo0LCAoKHUzMiAqKSZyeF9wcm9kcylbaV0pOwogCiAJbW1pb3diKCk7IC8qIGtlZXAgcHJvZCB1cGRhdGVzIG9yZGVyZWQgKi8KIApAQCAtNTE5LDcgKzYwNCw3IEBACiAJYmFycmllcigpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfaWd1X2NsZWFyX3NiX2dlbihzdHJ1Y3QgYm54MnggKmJwLAorc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2lndV9jbGVhcl9zYl9nZW4oc3RydWN0IGJueDJ4ICpicCwgdTggZnVuYywKIAkJCQkJICB1OCBpZHVfc2JfaWQsIGJvb2wgaXNfUGYpCiB7CiAJdTMyIGRhdGEsIGN0bCwgY250ID0gMTAwOwpAQCAtNTI3LDcgKzYxMiw3IEBACiAJdTMyIGlndV9hZGRyX2N0bCA9IElHVV9SRUdfQ09NTUFORF9SRUdfQ1RSTDsKIAl1MzIgaWd1X2FkZHJfYWNrID0gSUdVX1JFR19DU1RPUk1fVFlQRV8wX1NCX0NMRUFOVVAgKyAoaWR1X3NiX2lkLzMyKSo0OwogCXUzMiBzYl9iaXQgPSAgMSA8PCAoaWR1X3NiX2lkJTMyKTsKLQl1MzIgZnVuY19lbmNvZGUgPSBCUF9GVU5DKGJwKSB8CisJdTMyIGZ1bmNfZW5jb2RlID0gZnVuYyB8CiAJCQkoKGlzX1BmID09IHRydWUgPyAxIDogMCkgPDwgSUdVX0ZJRF9FTkNPREVfSVNfUEZfU0hJRlQpOwogCXUzMiBhZGRyX2VuY29kZSA9IElHVV9DTURfRTJfUFJPRF9VUERfQkFTRSArIGlkdV9zYl9pZDsKIApAQCAtNTkwLDE1ICs2NzUsNiBAQAogCWJhcnJpZXIoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2lndV9hY2tfc2Ioc3RydWN0IGJueDJ4ICpicCwgdTggaWd1X3NiX2lkLCB1OCBzZWdtZW50LAotCQkgICAgICB1MTYgaW5kZXgsIHU4IG9wLCB1OCB1cGRhdGUpCi17Ci0JdTMyIGlndV9hZGRyID0gQkFSX0lHVV9JTlRNRU0gKyAoSUdVX0NNRF9JTlRfQUNLX0JBU0UgKyBpZ3Vfc2JfaWQpKjg7Ci0KLQlibngyeF9pZ3VfYWNrX3NiX2dlbihicCwgaWd1X3NiX2lkLCBzZWdtZW50LCBpbmRleCwgb3AsIHVwZGF0ZSwKLQkJCSAgICAgaWd1X2FkZHIpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfYWNrX3NiKHN0cnVjdCBibngyeCAqYnAsIHU4IGlndV9zYl9pZCwgdTggc3Rvcm0sCiAJCQkJdTE2IGluZGV4LCB1OCBvcCwgdTggdXBkYXRlKQogewpAQCAtNjUzLDIxICs3MjksMjIgQEAKIAkJcmV0dXJuIGJueDJ4X2lndV9hY2tfaW50KGJwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYm54MnhfaGFzX3R4X3dvcmtfdW5sb2FkKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCitzdGF0aWMgaW5saW5lIGludCBibngyeF9oYXNfdHhfd29ya191bmxvYWQoc3RydWN0IGJueDJ4X2ZwX3R4ZGF0YSAqdHhkYXRhKQogewogCS8qIFRlbGwgY29tcGlsZXIgdGhhdCBjb25zdW1lciBhbmQgcHJvZHVjZXIgY2FuIGNoYW5nZSAqLwogCWJhcnJpZXIoKTsKLQlyZXR1cm4gZnAtPnR4X3BrdF9wcm9kICE9IGZwLT50eF9wa3RfY29uczsKKwlyZXR1cm4gdHhkYXRhLT50eF9wa3RfcHJvZCAhPSB0eGRhdGEtPnR4X3BrdF9jb25zOwogfQogCi1zdGF0aWMgaW5saW5lIHUxNiBibngyeF90eF9hdmFpbChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwKQorc3RhdGljIGlubGluZSB1MTYgYm54MnhfdHhfYXZhaWwoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgc3RydWN0IGJueDJ4X2ZwX3R4ZGF0YSAqdHhkYXRhKQogewogCXMxNiB1c2VkOwogCXUxNiBwcm9kOwogCXUxNiBjb25zOwogCi0JcHJvZCA9IGZwLT50eF9iZF9wcm9kOwotCWNvbnMgPSBmcC0+dHhfYmRfY29uczsKKwlwcm9kID0gdHhkYXRhLT50eF9iZF9wcm9kOworCWNvbnMgPSB0eGRhdGEtPnR4X2JkX2NvbnM7CiAKIAkvKiBOVU1fVFhfUklOR1MgPSBudW1iZXIgb2YgIm5leHQtcGFnZSIgZW50cmllcwogCSAgIEl0IHdpbGwgYmUgdXNlZCBhcyBhIHRocmVzaG9sZCAqLwpAQCAtNjc1LDIxICs3NTIsMzAgQEAKIAogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKIAlXQVJOX09OKHVzZWQgPCAwKTsKLQlXQVJOX09OKHVzZWQgPiBmcC0+YnAtPnR4X3Jpbmdfc2l6ZSk7Ci0JV0FSTl9PTigoZnAtPmJwLT50eF9yaW5nX3NpemUgLSB1c2VkKSA+IE1BWF9UWF9BVkFJTCk7CisJV0FSTl9PTih1c2VkID4gYnAtPnR4X3Jpbmdfc2l6ZSk7CisJV0FSTl9PTigoYnAtPnR4X3Jpbmdfc2l6ZSAtIHVzZWQpID4gTUFYX1RYX0FWQUlMKTsKICNlbmRpZgogCi0JcmV0dXJuIChzMTYpKGZwLT5icC0+dHhfcmluZ19zaXplKSAtIHVzZWQ7CisJcmV0dXJuIChzMTYpKGJwLT50eF9yaW5nX3NpemUpIC0gdXNlZDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYm54MnhfaGFzX3R4X3dvcmsoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3R4X3F1ZXVlX2hhc193b3JrKHN0cnVjdCBibngyeF9mcF90eGRhdGEgKnR4ZGF0YSkKIHsKIAl1MTYgaHdfY29uczsKIAogCS8qIFRlbGwgY29tcGlsZXIgdGhhdCBzdGF0dXMgYmxvY2sgZmllbGRzIGNhbiBjaGFuZ2UgKi8KIAliYXJyaWVyKCk7Ci0JaHdfY29ucyA9IGxlMTZfdG9fY3B1KCpmcC0+dHhfY29uc19zYik7Ci0JcmV0dXJuIGh3X2NvbnMgIT0gZnAtPnR4X3BrdF9jb25zOworCWh3X2NvbnMgPSBsZTE2X3RvX2NwdSgqdHhkYXRhLT50eF9jb25zX3NiKTsKKwlyZXR1cm4gaHdfY29ucyAhPSB0eGRhdGEtPnR4X3BrdF9jb25zOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYm54MnhfaGFzX3R4X3dvcmsoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwl1OCBjb3M7CisJZm9yX2VhY2hfY29zX2luX3R4X3F1ZXVlKGZwLCBjb3MpCisJCWlmIChibngyeF90eF9xdWV1ZV9oYXNfd29yaygmZnAtPnR4ZGF0YVtjb3NdKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYm54MnhfaGFzX3J4X3dvcmsoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKQEAgLTcwNSw3ICs3OTEsNyBAQAogfQogCiAvKioKLSAqIGRpc2FibGVzIHR4IGZyb20gc3RhY2sgcG9pbnQgb2YgdmlldworICogYm54MnhfdHhfZGlzYWJsZSAtIGRpc2FibGVzIHR4IGZyb20gc3RhY2sgcG9pbnQgb2YgdmlldwogICoKICAqIEBicDoJCWRyaXZlciBoYW5kbGUKICAqLwpAQCAtNzQwLDcgKzgyNiw3IEBACiAJaW50IGk7CiAKIAkvKiBBZGQgTkFQSSBvYmplY3RzICovCi0JZm9yX2VhY2hfbmFwaV9xdWV1ZShicCwgaSkKKwlmb3JfZWFjaF9yeF9xdWV1ZShicCwgaSkKIAkJbmV0aWZfbmFwaV9hZGQoYnAtPmRldiwgJmJueDJ4X2ZwKGJwLCBpLCBuYXBpKSwKIAkJCSAgICAgICBibngyeF9wb2xsLCBCTlgyWF9OQVBJX1dFSUdIVCk7CiB9CkBAIC03NDksNyArODM1LDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvcl9lYWNoX25hcGlfcXVldWUoYnAsIGkpCisJZm9yX2VhY2hfcnhfcXVldWUoYnAsIGkpCiAJCW5ldGlmX25hcGlfZGVsKCZibngyeF9mcChicCwgaSwgbmFwaSkpOwogfQogCkBAIC03NzksNyArODY1LDcgQEAKIAkJaW50IGlkeCA9IFJYX1NHRV9DTlQgKiBpIC0gMTsKIAogCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7Ci0JCQlTR0VfTUFTS19DTEVBUl9CSVQoZnAsIGlkeCk7CisJCQlCSVRfVkVDNjRfQ0xFQVJfQklUKGZwLT5zZ2VfbWFzaywgaWR4KTsKIAkJCWlkeC0tOwogCQl9CiAJfQpAQCAtNzg5LDcgKzg3NSw3IEBACiB7CiAJLyogU2V0IHRoZSBtYXNrIHRvIGFsbCAxLXM6IGl0J3MgZmFzdGVyIHRvIGNvbXBhcmUgdG8gMCB0aGFuIHRvIDB4Zi1zICovCiAJbWVtc2V0KGZwLT5zZ2VfbWFzaywgMHhmZiwKLQkgICAgICAgKE5VTV9SWF9TR0UgPj4gUlhfU0dFX01BU0tfRUxFTV9TSElGVCkqc2l6ZW9mKHU2NCkpOworCSAgICAgICAoTlVNX1JYX1NHRSA+PiBCSVRfVkVDNjRfRUxFTV9TSElGVCkqc2l6ZW9mKHU2NCkpOwogCiAJLyogQ2xlYXIgdGhlIHR3byBsYXN0IGluZGljZXMgaW4gdGhlIHBhZ2UgdG8gMToKIAkgICB0aGVzZSBhcmUgdGhlIGluZGljZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSAibmV4dCIgZWxlbWVudCwKQEAgLTg2MSwyMiArOTQ3LDY5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfcmV1c2Vfcnhfc2tiKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCiAJCQkJICAgICAgdTE2IGNvbnMsIHUxNiBwcm9kKQogewotCXN0cnVjdCBibngyeCAqYnAgPSBmcC0+YnA7CiAJc3RydWN0IHN3X3J4X2JkICpjb25zX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbY29uc107CiAJc3RydWN0IHN3X3J4X2JkICpwcm9kX3J4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbcHJvZF07CiAJc3RydWN0IGV0aF9yeF9iZCAqY29uc19iZCA9ICZmcC0+cnhfZGVzY19yaW5nW2NvbnNdOwogCXN0cnVjdCBldGhfcnhfYmQgKnByb2RfYmQgPSAmZnAtPnJ4X2Rlc2NfcmluZ1twcm9kXTsKIAotCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKCZicC0+cGRldi0+ZGV2LAotCQkJCSAgIGRtYV91bm1hcF9hZGRyKGNvbnNfcnhfYnVmLCBtYXBwaW5nKSwKLQkJCQkgICBSWF9DT1BZX1RIUkVTSCwgRE1BX0ZST01fREVWSUNFKTsKLQotCXByb2RfcnhfYnVmLT5za2IgPSBjb25zX3J4X2J1Zi0+c2tiOwogCWRtYV91bm1hcF9hZGRyX3NldChwcm9kX3J4X2J1ZiwgbWFwcGluZywKIAkJCSAgIGRtYV91bm1hcF9hZGRyKGNvbnNfcnhfYnVmLCBtYXBwaW5nKSk7CisJcHJvZF9yeF9idWYtPnNrYiA9IGNvbnNfcnhfYnVmLT5za2I7CiAJKnByb2RfYmQgPSAqY29uc19iZDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogYm54MnhfZnVuY19zdGFydCAtIGluaXQgZnVuY3Rpb24KKyAqCisgKiBAYnA6CQlkcml2ZXIgaGFuZGxlCisgKgorICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHNlbmRpbmcgQ0xJRU5UX1NFVFVQIGZvciB0aGUgZmlyc3QgY2xpZW50LgorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9mdW5jX3N0YXJ0KHN0cnVjdCBibngyeCAqYnApCit7CisJc3RydWN0IGJueDJ4X2Z1bmNfc3RhdGVfcGFyYW1zIGZ1bmNfcGFyYW1zID0gezB9OworCXN0cnVjdCBibngyeF9mdW5jX3N0YXJ0X3BhcmFtcyAqc3RhcnRfcGFyYW1zID0KKwkJJmZ1bmNfcGFyYW1zLnBhcmFtcy5zdGFydDsKKworCS8qIFByZXBhcmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24gc3RhdGUgdHJhbnNpdGlvbnMgKi8KKwlfX3NldF9iaXQoUkFNUk9EX0NPTVBfV0FJVCwgJmZ1bmNfcGFyYW1zLnJhbXJvZF9mbGFncyk7CisKKwlmdW5jX3BhcmFtcy5mX29iaiA9ICZicC0+ZnVuY19vYmo7CisJZnVuY19wYXJhbXMuY21kID0gQk5YMlhfRl9DTURfU1RBUlQ7CisKKwkvKiBGdW5jdGlvbiBwYXJhbWV0ZXJzICovCisJc3RhcnRfcGFyYW1zLT5tZl9tb2RlID0gYnAtPm1mX21vZGU7CisJc3RhcnRfcGFyYW1zLT5zZF92bGFuX3RhZyA9IGJwLT5tZl9vdjsKKwlpZiAoQ0hJUF9JU19FMXgoYnApKQorCQlzdGFydF9wYXJhbXMtPm5ldHdvcmtfY29zX21vZGUgPSBPVkVSUklERV9DT1M7CisJZWxzZQorCQlzdGFydF9wYXJhbXMtPm5ldHdvcmtfY29zX21vZGUgPSBTVEFUSUNfQ09TOworCisJcmV0dXJuIGJueDJ4X2Z1bmNfc3RhdGVfY2hhbmdlKGJwLCAmZnVuY19wYXJhbXMpOworfQorCisKKy8qKgorICogYm54Mnhfc2V0X2Z3X21hY19hZGRyIC0gZmlsbCBpbiBhIE1BQyBhZGRyZXNzIGluIEZXIGZvcm1hdAorICoKKyAqIEBmd19oaToJcG9pbnRlciB0byB1cHBlciBwYXJ0CisgKiBAZndfbWlkOglwb2ludGVyIHRvIG1pZGRsZSBwYXJ0CisgKiBAZndfbG86CXBvaW50ZXIgdG8gbG93ZXIgcGFydAorICogQG1hYzoJcG9pbnRlciB0byBNQUMgYWRkcmVzcworICovCitzdGF0aWMgaW5saW5lIHZvaWQgYm54Mnhfc2V0X2Z3X21hY19hZGRyKHUxNiAqZndfaGksIHUxNiAqZndfbWlkLCB1MTYgKmZ3X2xvLAorCQkJCQkgdTggKm1hYykKK3sKKwkoKHU4ICopZndfaGkpWzBdICA9IG1hY1sxXTsKKwkoKHU4ICopZndfaGkpWzFdICA9IG1hY1swXTsKKwkoKHU4ICopZndfbWlkKVswXSA9IG1hY1szXTsKKwkoKHU4ICopZndfbWlkKVsxXSA9IG1hY1syXTsKKwkoKHU4ICopZndfbG8pWzBdICA9IG1hY1s1XTsKKwkoKHU4ICopZndfbG8pWzFdICA9IG1hY1s0XTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2ZyZWVfcnhfc2dlX3JhbmdlKHN0cnVjdCBibngyeCAqYnAsCiAJCQkJCSAgIHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsIGludCBsYXN0KQogewpAQCAtODk1LDU3ICsxMDI4LDU4IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGFzdDsgaSsrKSB7Ci0JCXN0cnVjdCBzd19yeF9iZCAqcnhfYnVmID0gJihmcC0+dHBhX3Bvb2xbaV0pOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnhfYnVmLT5za2I7CisJCXN0cnVjdCBibngyeF9hZ2dfaW5mbyAqdHBhX2luZm8gPSAmZnAtPnRwYV9pbmZvW2ldOworCQlzdHJ1Y3Qgc3dfcnhfYmQgKmZpcnN0X2J1ZiA9ICZ0cGFfaW5mby0+Zmlyc3RfYnVmOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZmlyc3RfYnVmLT5za2I7CiAKIAkJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCQlEUChORVRJRl9NU0dfSUZET1dOLCAidHBhIGJpbiAlZCBlbXB0eSBvbiBmcmVlXG4iLCBpKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0KLQkJaWYgKGZwLT50cGFfc3RhdGVbaV0gPT0gQk5YMlhfVFBBX1NUQVJUKQorCQlpZiAodHBhX2luZm8tPnRwYV9zdGF0ZSA9PSBCTlgyWF9UUEFfU1RBUlQpCiAJCQlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LAotCQkJCQkgZG1hX3VubWFwX2FkZHIocnhfYnVmLCBtYXBwaW5nKSwKKwkJCQkJIGRtYV91bm1hcF9hZGRyKGZpcnN0X2J1ZiwgbWFwcGluZyksCiAJCQkJCSBmcC0+cnhfYnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7Ci0KIAkJZGV2X2tmcmVlX3NrYihza2IpOwotCQlyeF9idWYtPnNrYiA9IE5VTEw7CisJCWZpcnN0X2J1Zi0+c2tiID0gTlVMTDsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9pbml0X3R4X3Jpbmdfb25lKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfaW5pdF90eF9yaW5nX29uZShzdHJ1Y3QgYm54MnhfZnBfdHhkYXRhICp0eGRhdGEpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAxOyBpIDw9IE5VTV9UWF9SSU5HUzsgaSsrKSB7CiAJCXN0cnVjdCBldGhfdHhfbmV4dF9iZCAqdHhfbmV4dF9iZCA9Ci0JCQkmZnAtPnR4X2Rlc2NfcmluZ1tUWF9ERVNDX0NOVCAqIGkgLSAxXS5uZXh0X2JkOworCQkJJnR4ZGF0YS0+dHhfZGVzY19yaW5nW1RYX0RFU0NfQ05UICogaSAtIDFdLm5leHRfYmQ7CiAKIAkJdHhfbmV4dF9iZC0+YWRkcl9oaSA9Ci0JCQljcHVfdG9fbGUzMihVNjRfSEkoZnAtPnR4X2Rlc2NfbWFwcGluZyArCisJCQljcHVfdG9fbGUzMihVNjRfSEkodHhkYXRhLT50eF9kZXNjX21hcHBpbmcgKwogCQkJCSAgICBCQ01fUEFHRV9TSVpFKihpICUgTlVNX1RYX1JJTkdTKSkpOwogCQl0eF9uZXh0X2JkLT5hZGRyX2xvID0KLQkJCWNwdV90b19sZTMyKFU2NF9MTyhmcC0+dHhfZGVzY19tYXBwaW5nICsKKwkJCWNwdV90b19sZTMyKFU2NF9MTyh0eGRhdGEtPnR4X2Rlc2NfbWFwcGluZyArCiAJCQkJICAgIEJDTV9QQUdFX1NJWkUqKGkgJSBOVU1fVFhfUklOR1MpKSk7CiAJfQogCi0JU0VUX0ZMQUcoZnAtPnR4X2RiLmRhdGEuaGVhZGVyLmhlYWRlciwgRE9PUkJFTExfSERSX0RCX1RZUEUsIDEpOwotCWZwLT50eF9kYi5kYXRhLnplcm9fZmlsbDEgPSAwOwotCWZwLT50eF9kYi5kYXRhLnByb2QgPSAwOworCVNFVF9GTEFHKHR4ZGF0YS0+dHhfZGIuZGF0YS5oZWFkZXIuaGVhZGVyLCBET09SQkVMTF9IRFJfREJfVFlQRSwgMSk7CisJdHhkYXRhLT50eF9kYi5kYXRhLnplcm9fZmlsbDEgPSAwOworCXR4ZGF0YS0+dHhfZGIuZGF0YS5wcm9kID0gMDsKIAotCWZwLT50eF9wa3RfcHJvZCA9IDA7Ci0JZnAtPnR4X3BrdF9jb25zID0gMDsKLQlmcC0+dHhfYmRfcHJvZCA9IDA7Ci0JZnAtPnR4X2JkX2NvbnMgPSAwOwotCWZwLT50eF9wa3QgPSAwOworCXR4ZGF0YS0+dHhfcGt0X3Byb2QgPSAwOworCXR4ZGF0YS0+dHhfcGt0X2NvbnMgPSAwOworCXR4ZGF0YS0+dHhfYmRfcHJvZCA9IDA7CisJdHhkYXRhLT50eF9iZF9jb25zID0gMDsKKwl0eGRhdGEtPnR4X3BrdCA9IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9pbml0X3R4X3JpbmdzKHN0cnVjdCBibngyeCAqYnApCiB7CiAJaW50IGk7CisJdTggY29zOwogCiAJZm9yX2VhY2hfdHhfcXVldWUoYnAsIGkpCi0JCWJueDJ4X2luaXRfdHhfcmluZ19vbmUoJmJwLT5mcFtpXSk7CisJCWZvcl9lYWNoX2Nvc19pbl90eF9xdWV1ZSgmYnAtPmZwW2ldLCBjb3MpCisJCQlibngyeF9pbml0X3R4X3Jpbmdfb25lKCZicC0+ZnBbaV0udHhkYXRhW2Nvc10pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYm54Mnhfc2V0X25leHRfcGFnZV9yeF9iZChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwKQpAQCAtMTAzOCwzMSArMTE3MiwyMjAgQEAKIAlyZXR1cm4gaSAtIGZwLT5ldGhfcV9zdGF0cy5yeF9za2JfYWxsb2NfZmFpbGVkOwogfQogCisvKiBTdGF0aXN0aWNzIElEIGFyZSBnbG9iYWwgcGVyIGNoaXAvcGF0aCwgd2hpbGUgQ2xpZW50IElEcyBmb3IgRTF4IGFyZSBwZXIKKyAqIHBvcnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTggYm54Mnhfc3RhdHNfaWQoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwlpZiAoIUNISVBfSVNfRTF4KGZwLT5icCkpCisJCXJldHVybiBmcC0+Y2xfaWQ7CisJZWxzZQorCQlyZXR1cm4gZnAtPmNsX2lkICsgQlBfUE9SVChmcC0+YnApICogRlBfU0JfTUFYX0UxeDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2luaXRfdmxhbl9tYWNfZnBfb2JqcyhzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLAorCQkJCQkgICAgICAgYm54Mnhfb2JqX3R5cGUgb2JqX3R5cGUpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IGZwLT5icDsKKworCS8qIENvbmZpZ3VyZSBjbGFzc2lmaWNhdGlvbiBEQnMgKi8KKwlibngyeF9pbml0X21hY19vYmooYnAsICZmcC0+bWFjX29iaiwgZnAtPmNsX2lkLCBmcC0+Y2lkLAorCQkJICAgQlBfRlVOQyhicCksIGJueDJ4X3NwKGJwLCBtYWNfcmRhdGEpLAorCQkJICAgYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX3JkYXRhKSwKKwkJCSAgIEJOWDJYX0ZJTFRFUl9NQUNfUEVORElORywKKwkJCSAgICZicC0+c3Bfc3RhdGUsIG9ial90eXBlLAorCQkJICAgJmJwLT5tYWNzX3Bvb2wpOworfQorCisvKioKKyAqIGJueDJ4X2dldF9wYXRoX2Z1bmNfbnVtIC0gZ2V0IG51bWJlciBvZiBhY3RpdmUgZnVuY3Rpb25zCisgKgorICogQGJwOgkJZHJpdmVyIGhhbmRsZQorICoKKyAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBhY3RpdmUgKG5vdCBoaWRkZW4pIGZ1bmN0aW9ucyBvbiB0aGUKKyAqIGN1cnJlbnQgcGF0aC4KKyAqLworc3RhdGljIGlubGluZSB1OCBibngyeF9nZXRfcGF0aF9mdW5jX251bShzdHJ1Y3QgYm54MnggKmJwKQoreworCXU4IGZ1bmNfbnVtID0gMCwgaTsKKworCS8qIDU3NzEwIGhhcyBvbmx5IG9uZSBmdW5jdGlvbiBwZXItcG9ydCAqLworCWlmIChDSElQX0lTX0UxKGJwKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBDYWxjdWxhdGUgYSBudW1iZXIgb2YgZnVuY3Rpb25zIGVuYWJsZWQgb24gdGhlIGN1cnJlbnQKKwkgKiBQQVRIL1BPUlQuCisJICovCisJaWYgKENISVBfUkVWX0lTX1NMT1coYnApKSB7CisJCWlmIChJU19NRihicCkpCisJCQlmdW5jX251bSA9IDQ7CisJCWVsc2UKKwkJCWZ1bmNfbnVtID0gMjsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgRTFIX0ZVTkNfTUFYIC8gMjsgaSsrKSB7CisJCQl1MzIgZnVuY19jb25maWcgPQorCQkJCU1GX0NGR19SRChicCwKKwkJCQkJICBmdW5jX21mX2NvbmZpZ1tCUF9QT1JUKGJwKSArIDIgKiBpXS4KKwkJCQkJICBjb25maWcpOworCQkJZnVuY19udW0gKz0KKwkJCQkoKGZ1bmNfY29uZmlnICYgRlVOQ19NRl9DRkdfRlVOQ19ISURFKSA/IDAgOiAxKTsKKwkJfQorCX0KKworCVdBUk5fT04oIWZ1bmNfbnVtKTsKKworCXJldHVybiBmdW5jX251bTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2luaXRfYnBfb2JqcyhzdHJ1Y3QgYm54MnggKmJwKQoreworCS8qIFJYX01PREUgY29udHJvbGxpbmcgb2JqZWN0ICovCisJYm54MnhfaW5pdF9yeF9tb2RlX29iaihicCwgJmJwLT5yeF9tb2RlX29iaik7CisKKwkvKiBtdWx0aWNhc3QgY29uZmlndXJhdGlvbiBjb250cm9sbGluZyBvYmplY3QgKi8KKwlibngyeF9pbml0X21jYXN0X29iaihicCwgJmJwLT5tY2FzdF9vYmosIGJwLT5mcC0+Y2xfaWQsIGJwLT5mcC0+Y2lkLAorCQkJICAgICBCUF9GVU5DKGJwKSwgQlBfRlVOQyhicCksCisJCQkgICAgIGJueDJ4X3NwKGJwLCBtY2FzdF9yZGF0YSksCisJCQkgICAgIGJueDJ4X3NwX21hcHBpbmcoYnAsIG1jYXN0X3JkYXRhKSwKKwkJCSAgICAgQk5YMlhfRklMVEVSX01DQVNUX1BFTkRJTkcsICZicC0+c3Bfc3RhdGUsCisJCQkgICAgIEJOWDJYX09CSl9UWVBFX1JYKTsKKworCS8qIFNldHVwIENBTSBjcmVkaXQgcG9vbHMgKi8KKwlibngyeF9pbml0X21hY19jcmVkaXRfcG9vbChicCwgJmJwLT5tYWNzX3Bvb2wsIEJQX0ZVTkMoYnApLAorCQkJCSAgIGJueDJ4X2dldF9wYXRoX2Z1bmNfbnVtKGJwKSk7CisKKwkvKiBSU1MgY29uZmlndXJhdGlvbiBvYmplY3QgKi8KKwlibngyeF9pbml0X3Jzc19jb25maWdfb2JqKGJwLCAmYnAtPnJzc19jb25mX29iaiwgYnAtPmZwLT5jbF9pZCwKKwkJCQkgIGJwLT5mcC0+Y2lkLCBCUF9GVU5DKGJwKSwgQlBfRlVOQyhicCksCisJCQkJICBibngyeF9zcChicCwgcnNzX3JkYXRhKSwKKwkJCQkgIGJueDJ4X3NwX21hcHBpbmcoYnAsIHJzc19yZGF0YSksCisJCQkJICBCTlgyWF9GSUxURVJfUlNTX0NPTkZfUEVORElORywgJmJwLT5zcF9zdGF0ZSwKKwkJCQkgIEJOWDJYX09CSl9UWVBFX1JYKTsKK30KKworc3RhdGljIGlubGluZSB1OCBibngyeF9mcF9xem9uZV9pZChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwKQoreworCWlmIChDSElQX0lTX0UxeChmcC0+YnApKQorCQlyZXR1cm4gZnAtPmNsX2lkICsgQlBfUE9SVChmcC0+YnApICogRVRIX01BWF9SWF9DTElFTlRTX0UxSDsKKwllbHNlCisJCXJldHVybiBmcC0+Y2xfaWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGJueDJ4X3J4X3VzdG9ybV9wcm9kc19vZmZzZXQoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gZnAtPmJwOworCisJaWYgKCFDSElQX0lTX0UxeChicCkpCisJCXJldHVybiBVU1RPUk1fUlhfUFJPRFNfRTJfT0ZGU0VUKGZwLT5jbF9xem9uZV9pZCk7CisJZWxzZQorCQlyZXR1cm4gVVNUT1JNX1JYX1BST0RTX0UxWF9PRkZTRVQoQlBfUE9SVChicCksIGZwLT5jbF9pZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9pbml0X3R4ZGF0YShzdHJ1Y3QgYm54MnggKmJwLAorCXN0cnVjdCBibngyeF9mcF90eGRhdGEgKnR4ZGF0YSwgdTMyIGNpZCwgaW50IHR4cV9pbmRleCwKKwlfX2xlMTYgKnR4X2NvbnNfc2IpCit7CisJdHhkYXRhLT5jaWQgPSBjaWQ7CisJdHhkYXRhLT50eHFfaW5kZXggPSB0eHFfaW5kZXg7CisJdHhkYXRhLT50eF9jb25zX3NiID0gdHhfY29uc19zYjsKKworCURQKEJOWDJYX01TR19TUCwgImNyZWF0ZWQgdHggZGF0YSBjaWQgJWQsIHR4cSAlZCIsCisJICAgdHhkYXRhLT5jaWQsIHR4ZGF0YS0+dHhxX2luZGV4KTsKK30KKwogI2lmZGVmIEJDTV9DTklDCitzdGF0aWMgaW5saW5lIHU4IGJueDJ4X2NuaWNfZXRoX2NsX2lkKHN0cnVjdCBibngyeCAqYnAsIHU4IGNsX2lkeCkKK3sKKwlyZXR1cm4gYnAtPmNuaWNfYmFzZV9jbF9pZCArIGNsX2lkeCArCisJCShicC0+cGZfbnVtID4+IDEpICogTk9OX0VUSF9DT05URVhUX1VTRTsKK30KKworc3RhdGljIGlubGluZSB1OCBibngyeF9jbmljX2Z3X3NiX2lkKHN0cnVjdCBibngyeCAqYnApCit7CisKKwkvKiB0aGUgJ2ZpcnN0JyBpZCBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBjbmljICovCisJcmV0dXJuIGJwLT5iYXNlX2Z3X25kc2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggYm54MnhfY25pY19pZ3Vfc2JfaWQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlyZXR1cm4gYnAtPmlndV9iYXNlX3NiOworfQorCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9pbml0X2Zjb2VfZnAoc3RydWN0IGJueDJ4ICpicCkKIHsKLQlibngyeF9mY29lKGJwLCBjbF9pZCkgPSBCTlgyWF9GQ09FX0VUSF9DTF9JRCArCi0JCUJQX0UxSFZOKGJwKSAqIE5PTkVfRVRIX0NPTlRFWFRfVVNFOworCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSBibngyeF9mY29lX2ZwKGJwKTsKKwl1bnNpZ25lZCBsb25nIHFfdHlwZSA9IDA7CisKKwlibngyeF9mY29lKGJwLCBjbF9pZCkgPSBibngyeF9jbmljX2V0aF9jbF9pZChicCwKKwkJCQkJCSAgICAgQk5YMlhfRkNPRV9FVEhfQ0xfSURfSURYKTsKKwkvKiogQ3VycmVudCBCTlgyWF9GQ09FX0VUSF9DSUQgZGVmZmluaXRpb24gaW1wbGllcyBub3QgbW9yZSB0aGFuCisJICogIDE2IEVUSCBjbGllbnRzIHBlciBmdW5jdGlvbiB3aGVuIENOSUMgaXMgZW5hYmxlZCEKKwkgKgorCSAqICBGaXggaXQgQVNBUCEhIQorCSAqLwogCWJueDJ4X2Zjb2UoYnAsIGNpZCkgPSBCTlgyWF9GQ09FX0VUSF9DSUQ7CiAJYm54MnhfZmNvZShicCwgZndfc2JfaWQpID0gREVGX1NCX0lEOwogCWJueDJ4X2Zjb2UoYnAsIGlndV9zYl9pZCkgPSBicC0+aWd1X2RzYl9pZDsKLQlibngyeF9mY29lKGJwLCBicCkgPSBicDsKLQlibngyeF9mY29lKGJwLCBzdGF0ZSkgPSBCTlgyWF9GUF9TVEFURV9DTE9TRUQ7Ci0JYm54MnhfZmNvZShicCwgaW5kZXgpID0gRkNPRV9JRFg7CiAJYm54MnhfZmNvZShicCwgcnhfY29uc19zYikgPSBCTlgyWF9GQ09FX0wyX1JYX0lOREVYOwotCWJueDJ4X2Zjb2UoYnAsIHR4X2NvbnNfc2IpID0gQk5YMlhfRkNPRV9MMl9UWF9JTkRFWDsKLQkvKiBxWm9uZSBpZCBlcXVhbHMgdG8gRlcgKHBlciBwYXRoKSBjbGllbnQgaWQgKi8KLQlibngyeF9mY29lKGJwLCBjbF9xem9uZV9pZCkgPSBibngyeF9mY29lKGJwLCBjbF9pZCkgKwotCQlCUF9QT1JUKGJwKSooQ0hJUF9JU19FMihicCkgPyBFVEhfTUFYX1JYX0NMSUVOVFNfRTIgOgotCQkJCUVUSF9NQVhfUlhfQ0xJRU5UU19FMUgpOwotCS8qIGluaXQgc2hvcnRjdXQgKi8KLQlibngyeF9mY29lKGJwLCB1c3Rvcm1fcnhfcHJvZHNfb2Zmc2V0KSA9IENISVBfSVNfRTIoYnApID8KLQkgICAgVVNUT1JNX1JYX1BST0RTX0UyX09GRlNFVChibngyeF9mY29lKGJwLCBjbF9xem9uZV9pZCkpIDoKLQkgICAgVVNUT1JNX1JYX1BST0RTX0UxWF9PRkZTRVQoQlBfUE9SVChicCksIGJueDJ4X2Zjb2VfZnAoYnApLT5jbF9pZCk7CiAKKwlibngyeF9pbml0X3R4ZGF0YShicCwgJmJueDJ4X2Zjb2UoYnAsIHR4ZGF0YVswXSksCisJCQkgIGZwLT5jaWQsIEZDT0VfVFhRX0lEWChicCksIEJOWDJYX0ZDT0VfTDJfVFhfSU5ERVgpOworCisJRFAoQk5YMlhfTVNHX1NQLCAiY3JlYXRlZCBmY29lIHR4IGRhdGEgKGZwIGluZGV4ICVkKSIsIGZwLT5pbmRleCk7CisKKwkvKiBxWm9uZSBpZCBlcXVhbHMgdG8gRlcgKHBlciBwYXRoKSBjbGllbnQgaWQgKi8KKwlibngyeF9mY29lKGJwLCBjbF9xem9uZV9pZCkgPSBibngyeF9mcF9xem9uZV9pZChmcCk7CisJLyogaW5pdCBzaG9ydGN1dCAqLworCWJueDJ4X2Zjb2UoYnAsIHVzdG9ybV9yeF9wcm9kc19vZmZzZXQpID0KKwkJYm54MnhfcnhfdXN0b3JtX3Byb2RzX29mZnNldChmcCk7CisKKwkvKiBDb25maWd1cmUgUXVldWUgU3RhdGUgb2JqZWN0ICovCisJX19zZXRfYml0KEJOWDJYX1FfVFlQRV9IQVNfUlgsICZxX3R5cGUpOworCV9fc2V0X2JpdChCTlgyWF9RX1RZUEVfSEFTX1RYLCAmcV90eXBlKTsKKworCS8qIE5vIG11bHRpLUNvUyBmb3IgRkNvRSBMMiBjbGllbnQgKi8KKwlCVUdfT04oZnAtPm1heF9jb3MgIT0gMSk7CisKKwlibngyeF9pbml0X3F1ZXVlX29iaihicCwgJmZwLT5xX29iaiwgZnAtPmNsX2lkLCAmZnAtPmNpZCwgMSwKKwkJCSAgICAgQlBfRlVOQyhicCksIGJueDJ4X3NwKGJwLCBxX3JkYXRhKSwKKwkJCSAgICAgYm54Mnhfc3BfbWFwcGluZyhicCwgcV9yZGF0YSksIHFfdHlwZSk7CisKKwlEUChORVRJRl9NU0dfSUZVUCwgInF1ZXVlWyVkXTogYm54MnhfaW5pdF9zYiglcCwlcCkgY2xfaWQgJWQgZndfc2IgJWQgIgorCQkJICAgImlndV9zYiAlZFxuIiwKKwkgICBmcC0+aW5kZXgsIGJwLCBmcC0+c3RhdHVzX2Jsay5lMl9zYiwgZnAtPmNsX2lkLCBmcC0+Zndfc2JfaWQsCisJICAgZnAtPmlndV9zYl9pZCk7CiB9CiAjZW5kaWYKIAorc3RhdGljIGlubGluZSBpbnQgYm54MnhfY2xlYW5fdHhfcXVldWUoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICAgc3RydWN0IGJueDJ4X2ZwX3R4ZGF0YSAqdHhkYXRhKQoreworCWludCBjbnQgPSAxMDAwOworCisJd2hpbGUgKGJueDJ4X2hhc190eF93b3JrX3VubG9hZCh0eGRhdGEpKSB7CisJCWlmICghY250KSB7CisJCQlCTlgyWF9FUlIoInRpbWVvdXQgd2FpdGluZyBmb3IgcXVldWVbJWRdOiAiCisJCQkJICJ0eGRhdGEtPnR4X3BrdF9wcm9kKCVkKSAhPSB0eGRhdGEtPnR4X3BrdF9jb25zKCVkKVxuIiwKKwkJCQkgIHR4ZGF0YS0+dHhxX2luZGV4LCB0eGRhdGEtPnR4X3BrdF9wcm9kLAorCQkJCSAgdHhkYXRhLT50eF9wa3RfY29ucyk7CisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCQkJYm54MnhfcGFuaWMoKTsKKwkJCXJldHVybiAtRUJVU1k7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCQljbnQtLTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDEwMDApOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgYm54MnhfZ2V0X2xpbmtfY2ZnX2lkeChzdHJ1Y3QgYm54MnggKmJwKTsKKwogc3RhdGljIGlubGluZSB2b2lkIF9fc3Rvcm1fbWVtc2V0X3N0cnVjdChzdHJ1Y3QgYm54MnggKmJwLAogCQkJCQkgdTMyIGFkZHIsIHNpemVfdCBzaXplLCB1MzIgKmRhdGEpCiB7CkBAIC0xMDcxLDQyICsxMzk0LDc4IEBACiAJCVJFR19XUihicCwgYWRkciArIChpICogNCksIGRhdGFbaV0pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc3Rvcm1fbWVtc2V0X21hY19maWx0ZXJzKHN0cnVjdCBibngyeCAqYnAsCi0JCQlzdHJ1Y3QgdHN0b3JtX2V0aF9tYWNfZmlsdGVyX2NvbmZpZyAqbWFjX2ZpbHRlcnMsCi0JCQl1MTYgYWJzX2ZpZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9ybV9tZW1zZXRfZnVuY19jZmcoc3RydWN0IGJueDJ4ICpicCwKKwkJCQlzdHJ1Y3QgdHN0b3JtX2V0aF9mdW5jdGlvbl9jb21tb25fY29uZmlnICp0Y2ZnLAorCQkJCXUxNiBhYnNfZmlkKQogewotCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCB0c3Rvcm1fZXRoX21hY19maWx0ZXJfY29uZmlnKTsKKwlzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHN0b3JtX2V0aF9mdW5jdGlvbl9jb21tb25fY29uZmlnKTsKIAogCXUzMiBhZGRyID0gQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkJCVRTVE9STV9NQUNfRklMVEVSX0NPTkZJR19PRkZTRVQoYWJzX2ZpZCk7CisJCQlUU1RPUk1fRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19PRkZTRVQoYWJzX2ZpZCk7CiAKLQlfX3N0b3JtX21lbXNldF9zdHJ1Y3QoYnAsIGFkZHIsIHNpemUsICh1MzIgKiltYWNfZmlsdGVycyk7CisJX19zdG9ybV9tZW1zZXRfc3RydWN0KGJwLCBhZGRyLCBzaXplLCAodTMyICopdGNmZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzdG9ybV9tZW1zZXRfY21uZyhzdHJ1Y3QgYm54MnggKmJwLAogCQkJCXN0cnVjdCBjbW5nX3N0cnVjdF9wZXJfcG9ydCAqY21uZywKIAkJCQl1OCBwb3J0KQogewotCXNpemVfdCBzaXplID0KLQkJc2l6ZW9mKHN0cnVjdCByYXRlX3NoYXBpbmdfdmFyc19wZXJfcG9ydCkgKwotCQlzaXplb2Yoc3RydWN0IGZhaXJuZXNzX3ZhcnNfcGVyX3BvcnQpICsKLQkJc2l6ZW9mKHN0cnVjdCBzYWZjX3N0cnVjdF9wZXJfcG9ydCkgKwotCQlzaXplb2Yoc3RydWN0IHBmY19zdHJ1Y3RfcGVyX3BvcnQpOworCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBjbW5nX3N0cnVjdF9wZXJfcG9ydCk7CiAKIAl1MzIgYWRkciA9IEJBUl9YU1RST1JNX0lOVE1FTSArCiAJCQlYU1RPUk1fQ01OR19QRVJfUE9SVF9WQVJTX09GRlNFVChwb3J0KTsKIAogCV9fc3Rvcm1fbWVtc2V0X3N0cnVjdChicCwgYWRkciwgc2l6ZSwgKHUzMiAqKWNtbmcpOwotCi0JYWRkciArPSBzaXplICsgNCAvKiBTS0lQIERDQitMTEZDICovOwotCXNpemUgPSBzaXplb2Yoc3RydWN0IGNtbmdfc3RydWN0X3Blcl9wb3J0KSAtCi0JCXNpemUgLyogd3JpdHRlbiAqLyAtIDQgLypza2lwcGVkKi87Ci0KLQlfX3N0b3JtX21lbXNldF9zdHJ1Y3QoYnAsIGFkZHIsIHNpemUsCi0JCQkgICAgICAodTMyICopKGNtbmctPnRyYWZmaWNfdHlwZV90b19wcmlvcml0eV9jb3MpKTsKIH0KIAotLyogSFcgTG9jayBmb3Igc2hhcmVkIGR1YWwgcG9ydCBQSFlzICovCisvKioKKyAqIGJueDJ4X3dhaXRfc3BfY29tcCAtIHdhaXQgZm9yIHRoZSBvdXRzdGFuZGluZyBTUCBjb21tYW5kcy4KKyAqCisgKiBAYnA6CQlkcml2ZXIgaGFuZGxlCisgKiBAbWFzazoJYml0cyB0aGF0IG5lZWQgdG8gYmUgY2xlYXJlZAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgYm54Mnhfd2FpdF9zcF9jb21wKHN0cnVjdCBibngyeCAqYnAsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlpbnQgdG91dCA9IDUwMDA7IC8qIFdhaXQgZm9yIDUgc2VjcyB0b3BzICovCisKKwl3aGlsZSAodG91dC0tKSB7CisJCXNtcF9tYigpOworCQluZXRpZl9hZGRyX2xvY2tfYmgoYnAtPmRldik7CisJCWlmICghKGJwLT5zcF9zdGF0ZSAmIG1hc2spKSB7CisJCQluZXRpZl9hZGRyX3VubG9ja19iaChicC0+ZGV2KTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCW5ldGlmX2FkZHJfdW5sb2NrX2JoKGJwLT5kZXYpOworCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDAwKTsKKwl9CisKKwlzbXBfbWIoKTsKKworCW5ldGlmX2FkZHJfbG9ja19iaChicC0+ZGV2KTsKKwlpZiAoYnAtPnNwX3N0YXRlICYgbWFzaykgeworCQlCTlgyWF9FUlIoIkZpbHRlcmluZyBjb21wbGV0aW9uIHRpbWVkIG91dC4gc3Bfc3RhdGUgMHglbHgsICIKKwkJCSAgIm1hc2sgMHglbHhcbiIsIGJwLT5zcF9zdGF0ZSwgbWFzayk7CisJCW5ldGlmX2FkZHJfdW5sb2NrX2JoKGJwLT5kZXYpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCW5ldGlmX2FkZHJfdW5sb2NrX2JoKGJwLT5kZXYpOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogYm54Mnhfc2V0X2N0eF92YWxpZGF0aW9uIC0gc2V0IENEVSBjb250ZXh0IHZhbGlkYXRpb24gdmFsdWVzCisgKgorICogQGJwOgkJZHJpdmVyIGhhbmRsZQorICogQGN4dDoJY29udGV4dCBvZiB0aGUgY29ubmVjdGlvbiBvbiB0aGUgaG9zdCBtZW1vcnkKKyAqIEBjaWQ6CVNXIENJRCBvZiB0aGUgY29ubmVjdGlvbiB0byBiZSBjb25maWd1cmVkCisgKi8KK3ZvaWQgYm54Mnhfc2V0X2N0eF92YWxpZGF0aW9uKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBldGhfY29udGV4dCAqY3h0LAorCQkJICAgICAgdTMyIGNpZCk7CisKK3ZvaWQgYm54MnhfdXBkYXRlX2NvYWxlc2NlX3NiX2luZGV4KHN0cnVjdCBibngyeCAqYnAsIHU4IGZ3X3NiX2lkLAorCQkJCSAgICB1OCBzYl9pbmRleCwgdTggZGlzYWJsZSwgdTE2IHVzZWMpOwogdm9pZCBibngyeF9hY3F1aXJlX3BoeV9sb2NrKHN0cnVjdCBibngyeCAqYnApOwogdm9pZCBibngyeF9yZWxlYXNlX3BoeV9sb2NrKHN0cnVjdCBibngyeCAqYnApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9kY2IuYyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2RjYi5jCmluZGV4IDQxMGE0OWUuLmE0ZWEzNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2RjYi5jCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2RjYi5jCkBAIC0xOSwyMCArMTksMTggQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaWZkZWYgQkNNX0RDQk5MCi0jaW5jbHVkZSA8bGludXgvZGNibmwuaD4KLSNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9kY2JubC5oPgogCiAjaW5jbHVkZSAiYm54MnguaCIKICNpbmNsdWRlICJibngyeF9jbW4uaCIKICNpbmNsdWRlICJibngyeF9kY2IuaCIKIAotCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBkY2J4IHJlbGF0ZWQgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBibngyeF9kY2J4X3N0b3BfaHdfdHgoc3RydWN0IGJueDJ4ICpicCk7CitzdGF0aWMgaW50IGJueDJ4X2RjYnhfc3RvcF9od190eChzdHJ1Y3QgYm54MnggKmJwKTsKIHN0YXRpYyB2b2lkIGJueDJ4X3BmY19zZXRfcGZjKHN0cnVjdCBibngyeCAqYnApOwogc3RhdGljIHZvaWQgYm54MnhfZGNieF91cGRhdGVfZXRzX3BhcmFtcyhzdHJ1Y3QgYm54MnggKmJwKTsKLXN0YXRpYyB2b2lkIGJueDJ4X2RjYnhfcmVzdW1lX2h3X3R4KHN0cnVjdCBibngyeCAqYnApOworc3RhdGljIGludCBibngyeF9kY2J4X3Jlc3VtZV9od190eChzdHJ1Y3QgYm54MnggKmJwKTsKIHN0YXRpYyB2b2lkIGJueDJ4X2RjYnhfZ2V0X2V0c19wcmlfcGdfdGJsKHN0cnVjdCBibngyeCAqYnAsCiAJCQkJCSAgdTMyICpzZXRfY29uZmlndXJhdGlvbl9ldHNfcGcsCiAJCQkJCSAgdTMyICpwcmlfcGdfdGJsKTsKQEAgLTQ3LDM0ICs0NSw1NiBAQAogCQkJCXN0cnVjdCBjb3NfaGVscF9kYXRhICpjb3NfZGF0YSwKIAkJCQl1MzIgKnBnX3ByaV9vcmdpbmFsX3NwcmVhZCwKIAkJCQlzdHJ1Y3QgZGNieF9ldHNfZmVhdHVyZSAqZXRzKTsKLXN0YXRpYyB2b2lkIGJueDJ4X3BmY19md19zdHJ1Y3RfZTIoc3RydWN0IGJueDJ4ICpicCk7CitzdGF0aWMgdm9pZCBibngyeF9kY2J4X2Z3X3N0cnVjdChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSBzdHJ1Y3QgYm54MnhfZnVuY190eF9zdGFydF9wYXJhbXMqKTsKIAorLyogaGVscGVyczogcmVhZC93cml0ZSBsZW4gYnl0ZXMgZnJvbSBhZGRyIGludG8gYnVmZiBieSBSRUdfUkQvUkVHX1dSICovCitzdGF0aWMgdm9pZCBibngyeF9yZWFkX2RhdGEoc3RydWN0IGJueDJ4ICpicCwgdTMyICpidWZmLAorCQkJCSAgIHUzMiBhZGRyLCB1MzIgbGVuKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCwgYnVmZisrKQorCQkqYnVmZiA9IFJFR19SRChicCwgYWRkciArIGkpOworfQorCitzdGF0aWMgdm9pZCBibngyeF93cml0ZV9kYXRhKHN0cnVjdCBibngyeCAqYnAsIHUzMiAqYnVmZiwKKwkJCQkgICAgdTMyIGFkZHIsIHUzMiBsZW4pCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0LCBidWZmKyspCisJCVJFR19XUihicCwgYWRkciArIGksICpidWZmKTsKK30KIAogc3RhdGljIHZvaWQgYm54MnhfcGZjX3NldChzdHJ1Y3QgYm54MnggKmJwKQogewogCXN0cnVjdCBibngyeF9uaWdfYnJiX3BmY19wb3J0X3BhcmFtcyBwZmNfcGFyYW1zID0gezB9OwogCXUzMiBwcmlfYml0LCB2YWwgPSAwOwotCXU4IHByaTsKKwlpbnQgaTsKKworCXBmY19wYXJhbXMubnVtX29mX3J4X2Nvc19wcmlvcml0eV9tYXNrID0KKwkJCQkJYnAtPmRjYnhfcG9ydF9wYXJhbXMuZXRzLm51bV9vZl9jb3M7CiAKIAkvKiBUeCBDT1MgY29uZmlndXJhdGlvbiAqLwotCWlmIChicC0+ZGNieF9wb3J0X3BhcmFtcy5ldHMuY29zX3BhcmFtc1swXS5wYXVzZWFibGUpCi0JCXBmY19wYXJhbXMucnhfY29zMF9wcmlvcml0eV9tYXNrID0KLQkJCWJwLT5kY2J4X3BvcnRfcGFyYW1zLmV0cy5jb3NfcGFyYW1zWzBdLnByaV9iaXRtYXNrOwotCWlmIChicC0+ZGNieF9wb3J0X3BhcmFtcy5ldHMuY29zX3BhcmFtc1sxXS5wYXVzZWFibGUpCi0JCXBmY19wYXJhbXMucnhfY29zMV9wcmlvcml0eV9tYXNrID0KLQkJCWJwLT5kY2J4X3BvcnRfcGFyYW1zLmV0cy5jb3NfcGFyYW1zWzFdLnByaV9iaXRtYXNrOworCWZvciAoaSA9IDA7IGkgPCBicC0+ZGNieF9wb3J0X3BhcmFtcy5ldHMubnVtX29mX2NvczsgaSsrKQorCQkvKgorCQkgKiBXZSBjb25maWd1cmUgb25seSB0aGUgcGF1c2VhYmxlIGJpdHMgKG5vbiBwYXVzZWFibGUgYXJlbid0CisJCSAqIGNvbmZpZ3VyZWQgYXQgYWxsKSBpdCdzIGRvbmUgdG8gYXZvaWQgZmFsc2UgcGF1c2VzIGZyb20KKwkJICogbmV0d29yaworCQkgKi8KKwkJcGZjX3BhcmFtcy5yeF9jb3NfcHJpb3JpdHlfbWFza1tpXSA9CisJCQlicC0+ZGNieF9wb3J0X3BhcmFtcy5ldHMuY29zX3BhcmFtc1tpXS5wcmlfYml0bWFzaworCQkJCSYgRENCWF9QRkNfUFJJX1BBVVNFX01BU0soYnApOwogCi0KLQkvKioKKwkvKgogCSAqIFJ4IENPUyBjb25maWd1cmF0aW9uCiAJICogQ2hhbmdpbmcgUEZDIFJYIGNvbmZpZ3VyYXRpb24gLgogCSAqIEluIFJYIENPUzAgd2lsbCBhbHdheXMgYmUgY29uZmlndXJlZCB0byBsb3NzeSBhbmQgQ09TMSB0byBsb3NzbGVzcwogCSAqLwotCWZvciAocHJpID0gMCA7IHByaSA8IE1BWF9QRkNfUFJJT1JJVElFUyA7IHByaSsrKSB7Ci0JCXByaV9iaXQgPSAxIDw8IHByaTsKKwlmb3IgKGkgPSAwIDsgaSA8IE1BWF9QRkNfUFJJT1JJVElFUyA7IGkrKykgeworCQlwcmlfYml0ID0gMSA8PCBpOwogCiAJCWlmIChwcmlfYml0ICYgRENCWF9QRkNfUFJJX1BBVVNFX01BU0soYnApKQotCQkJdmFsIHw9IDEgPDwgKHByaSAqIDQpOworCQkJdmFsIHw9IDEgPDwgKGkgKiA0KTsKIAl9CiAKIAlwZmNfcGFyYW1zLnBrdF9wcmlvcml0eV90b19jb3MgPSB2YWw7CkBAIC0yMDAsNyArMjIwLDExIEBACiAJaWYgKEdFVF9GTEFHUyhlcnJvciwgRENCWF9MT0NBTF9BUFBfRVJST1IpKQogCQlEUChORVRJRl9NU0dfTElOSywgIkRDQlhfTE9DQUxfQVBQX0VSUk9SXG4iKTsKIAotCWlmIChhcHAtPmVuYWJsZWQgJiYgIUdFVF9GTEFHUyhlcnJvciwgRENCWF9MT0NBTF9BUFBfRVJST1IpKSB7CisJaWYgKEdFVF9GTEFHUyhlcnJvciwgRENCWF9MT0NBTF9BUFBfTUlTTUFUQ0gpKQorCQlEUChORVRJRl9NU0dfTElOSywgIkRDQlhfTE9DQUxfQVBQX01JU01BVENIXG4iKTsKKworCWlmIChhcHAtPmVuYWJsZWQgJiYKKwkgICAgIUdFVF9GTEFHUyhlcnJvciwgRENCWF9MT0NBTF9BUFBfRVJST1IgfCBEQ0JYX0xPQ0FMX0FQUF9NSVNNQVRDSCkpIHsKIAogCQlicC0+ZGNieF9wb3J0X3BhcmFtcy5hcHAuZW5hYmxlZCA9IHRydWU7CiAKQEAgLTI1MywxMiArMjc3LDExIEBACiAKIAogCS8qIENsZWFuIHVwIG9sZCBzZXR0aW5ncyBvZiBldHMgb24gQ09TICovCi0JZm9yIChpID0gMDsgaSA8IEUyX05VTV9PRl9DT1MgOyBpKyspIHsKLQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJwLT5kY2J4X3BvcnRfcGFyYW1zLmV0cy5jb3NfcGFyYW1zKSA7IGkrKykgewogCQljb3NfcGFyYW1zW2ldLnBhdXNlYWJsZSA9IGZhbHNlOwotCQljb3NfcGFyYW1zW2ldLnN0cmljdCA9IEJOWDJYX0RDQlhfQ09TX05PVF9TVFJJQ1Q7CisJCWNvc19wYXJhbXNbaV0uc3RyaWN0ID0gQk5YMlhfRENCWF9TVFJJQ1RfSU5WQUxJRDsKIAkJY29zX3BhcmFtc1tpXS5id190YmwgPSBEQ0JYX0lOVkFMSURfQ09TX0JXOwotCQljb3NfcGFyYW1zW2ldLnByaV9iaXRtYXNrID0gRENCWF9QRkNfUFJJX0dFVF9OT05fUEFVU0UoYnAsIDApOworCQljb3NfcGFyYW1zW2ldLnByaV9iaXRtYXNrID0gMDsKIAl9CiAKIAlpZiAoYnAtPmRjYnhfcG9ydF9wYXJhbXMuYXBwLmVuYWJsZWQgJiYKQEAgLTI5Niw3ICszMTksNyBAQAogCQlEUChORVRJRl9NU0dfTElOSywgIkRDQlhfTE9DQUxfUEZDX0VSUk9SXG4iKTsKIAogCWlmIChicC0+ZGNieF9wb3J0X3BhcmFtcy5hcHAuZW5hYmxlZCAmJgotCSAgICFHRVRfRkxBR1MoZXJyb3IsIERDQlhfTE9DQUxfUEZDX0VSUk9SKSAmJgorCSAgICFHRVRfRkxBR1MoZXJyb3IsIERDQlhfTE9DQUxfUEZDX0VSUk9SIHwgRENCWF9MT0NBTF9QRkNfTUlTTUFUQ0gpICYmCiAJICAgcGZjLT5lbmFibGVkKSB7CiAJCWJwLT5kY2J4X3BvcnRfcGFyYW1zLnBmYy5lbmFibGVkID0gdHJ1ZTsKIAkJYnAtPmRjYnhfcG9ydF9wYXJhbXMucGZjLnByaW9yaXR5X25vbl9wYXVzZWFibGVfbWFzayA9CkBAIC0zMDgsNiArMzMxLDMyIEBACiAJfQogfQogCisvKiBtYXBzIHVubWFwcGVkIHByaW9yaXRpZXMgdG8gdG8gdGhlIHNhbWUgQ09TIGFzIEwyICovCitzdGF0aWMgdm9pZCBibngyeF9kY2J4X21hcF9udyhzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBpOworCXUzMiB1bm1hcHBlZCA9ICgxIDw8IE1BWF9QRkNfUFJJT1JJVElFUykgLSAxOyAvKiBhbGwgb25lcyAqLworCXUzMiAqdHRwID0gYnAtPmRjYnhfcG9ydF9wYXJhbXMuYXBwLnRyYWZmaWNfdHlwZV9wcmlvcml0eTsKKwl1MzIgbndfcHJpbyA9IDEgPDwgdHRwW0xMRkNfVFJBRkZJQ19UWVBFX05XXTsKKwlzdHJ1Y3QgYm54MnhfZGNieF9jb3NfcGFyYW1zICpjb3NfcGFyYW1zID0KKwkJCWJwLT5kY2J4X3BvcnRfcGFyYW1zLmV0cy5jb3NfcGFyYW1zOworCisJLyogZ2V0IHVubWFwcGVkIHByaW9yaXRpZXMgYnkgY2xlYXJpbmcgbWFwcGVkIGJpdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTExGQ19EUklWRVJfVFJBRkZJQ19UWVBFX01BWDsgaSsrKQorCQl1bm1hcHBlZCAmPSB+KDEgPDwgdHRwW2ldKTsKKworCS8qIGZpbmQgY29zIGZvciBudyBwcmlvIGFuZCBleHRlbmQgaXQgd2l0aCB1bm1hcHBlZCAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJwLT5kY2J4X3BvcnRfcGFyYW1zLmV0cy5jb3NfcGFyYW1zKTsgaSsrKSB7CisJCWlmIChjb3NfcGFyYW1zW2ldLnByaV9iaXRtYXNrICYgbndfcHJpbykgeworCQkJLyogZXh0ZW5kIHRoZSBiaXRtYXNrIHdpdGggdW5tYXBwZWQgKi8KKwkJCURQKE5FVElGX01TR19MSU5LLAorCQkJICAgImNvcyAlZCBleHRlbmRlZCB3aXRoIDB4JTA4eCIsIGksIHVubWFwcGVkKTsKKwkJCWNvc19wYXJhbXNbaV0ucHJpX2JpdG1hc2sgfD0gdW5tYXBwZWQ7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwogc3RhdGljIHZvaWQgYm54MnhfZ2V0X2RjYnhfZHJ2X3BhcmFtKHN0cnVjdCBibngyeCAqYnAsCiAJCQkJICAgICBzdHJ1Y3QgZGNieF9mZWF0dXJlcyAqZmVhdHVyZXMsCiAJCQkJICAgICB1MzIgZXJyb3IpCkBAIC0zMTcsNiArMzY2LDggQEAKIAlibngyeF9kY2J4X2dldF9wZmNfZmVhdHVyZShicCwgJmZlYXR1cmVzLT5wZmMsIGVycm9yKTsKIAogCWJueDJ4X2RjYnhfZ2V0X2V0c19mZWF0dXJlKGJwLCAmZmVhdHVyZXMtPmV0cywgZXJyb3IpOworCisJYm54MnhfZGNieF9tYXBfbncoYnApOwogfQogCiAjZGVmaW5lIERDQlhfTE9DQUxfTUlCX01BWF9UUllfUkVBRAkJKDEwMCkKQEAgLTMyNSw4ICszNzYsOCBAQAogCQkJICAgICAgIHUzMiBvZmZzZXQsCiAJCQkgICAgICAgaW50IHJlYWRfbWliX3R5cGUpCiB7Ci0JaW50IG1heF90cnlfcmVhZCA9IDAsIGk7Ci0JdTMyICpidWZmLCBtaWJfc2l6ZSwgcHJlZml4X3NlcV9udW0sIHN1ZmZpeF9zZXFfbnVtOworCWludCBtYXhfdHJ5X3JlYWQgPSAwOworCXUzMiBtaWJfc2l6ZSwgcHJlZml4X3NlcV9udW0sIHN1ZmZpeF9zZXFfbnVtOwogCXN0cnVjdCBsbGRwX3JlbW90ZV9taWIgKnJlbW90ZV9taWIgOwogCXN0cnVjdCBsbGRwX2xvY2FsX21pYiAgKmxvY2FsX21pYjsKIApAQCAtMzQ1LDkgKzM5Niw3IEBACiAJb2Zmc2V0ICs9IEJQX1BPUlQoYnApICogbWliX3NpemU7CiAKIAlkbyB7Ci0JCWJ1ZmYgPSBiYXNlX21pYl9hZGRyOwotCQlmb3IgKGkgPSAwOyBpIDwgbWliX3NpemU7IGkgKz0gNCwgYnVmZisrKQotCQkJKmJ1ZmYgPSBSRUdfUkQoYnAsIG9mZnNldCArIGkpOworCQlibngyeF9yZWFkX2RhdGEoYnAsIGJhc2VfbWliX2FkZHIsIG9mZnNldCwgbWliX3NpemUpOwogCiAJCW1heF90cnlfcmVhZCsrOwogCkBAIC0zNzgsNjAgKzQyNyw1MCBAQAogCiBzdGF0aWMgdm9pZCBibngyeF9wZmNfc2V0X3BmYyhzdHJ1Y3QgYm54MnggKmJwKQogewotCWlmIChDSElQX0lTX0UyKGJwKSkgewotCQlpZiAoQlBfUE9SVChicCkpIHsKLQkJCUJOWDJYX0VSUigiNCBwb3J0IG1vZGUgaXMgbm90IHN1cHBvcnRlZCIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGJwLT5kY2J4X3BvcnRfcGFyYW1zLnBmYy5lbmFibGVkKQotCi0JCQkvKiAxLiBGaWxscyB1cCBjb21tb24gUEZDIHN0cnVjdHVyZXMgaWYgcmVxdWlyZWQuKi8KLQkJCS8qIDIuIENvbmZpZ3VyZSBOSUcsIE1BQyBhbmQgQlJCIHZpYSB0aGUgZWxpbms6Ci0JCQkgKiAgICBlbGluayBtdXN0IGZpcnN0IGNoZWNrIGlmIEJNQUMgaXMgbm90IGluIHJlc2V0Ci0JCQkgKiAgICBhbmQgb25seSB0aGVuIGNvbmZpZ3VyZXMgdGhlIEJNQUMKLQkJCSAqICAgIE9yLCBjb25maWd1cmUgRU1BQy4KLQkJCSAqLwotCQkJYm54MnhfcGZjX3NldChicCk7Ci0KLQkJZWxzZQotCQkJYm54MnhfcGZjX2NsZWFyKGJwKTsKLQl9CisJaWYgKGJwLT5kY2J4X3BvcnRfcGFyYW1zLnBmYy5lbmFibGVkICYmCisJICAgICEoYnAtPmRjYnhfZXJyb3IgJiBEQ0JYX1JFTU9URV9NSUJfRVJST1IpKQorCQkvKgorCQkgKiAxLiBGaWxscyB1cCBjb21tb24gUEZDIHN0cnVjdHVyZXMgaWYgcmVxdWlyZWQKKwkJICogMi4gQ29uZmlndXJlIE5JRywgTUFDIGFuZCBCUkIgdmlhIHRoZSBlbGluaworCQkgKi8KKwkJYm54MnhfcGZjX3NldChicCk7CisJZWxzZQorCQlibngyeF9wZmNfY2xlYXIoYnApOwogfQogCi1zdGF0aWMgdm9pZCBibngyeF9kY2J4X3N0b3BfaHdfdHgoc3RydWN0IGJueDJ4ICpicCkKK3N0YXRpYyBpbnQgYm54MnhfZGNieF9zdG9wX2h3X3R4KHN0cnVjdCBibngyeCAqYnApCiB7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJzZW5kaW5nIFNUT1AgVFJBRkZJQ1xuIik7Ci0JYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9DT01NT05fU1RPUF9UUkFGRklDLAotCQkgICAgICAwIC8qIGNvbm5lY3Rpb25sZXNzICovLAotCQkgICAgICAwIC8qIGRhdGFIaSBpcyB6ZXJvICovLAotCQkgICAgICAwIC8qIGRhdGFMbyBpcyB6ZXJvICovLAotCQkgICAgICAxIC8qIGNvbW1vbiAqLyk7CisJc3RydWN0IGJueDJ4X2Z1bmNfc3RhdGVfcGFyYW1zIGZ1bmNfcGFyYW1zID0gezB9OworCisJZnVuY19wYXJhbXMuZl9vYmogPSAmYnAtPmZ1bmNfb2JqOworCWZ1bmNfcGFyYW1zLmNtZCA9IEJOWDJYX0ZfQ01EX1RYX1NUT1A7CisKKwlEUChORVRJRl9NU0dfTElOSywgIlNUT1AgVFJBRkZJQ1xuIik7CisJcmV0dXJuIGJueDJ4X2Z1bmNfc3RhdGVfY2hhbmdlKGJwLCAmZnVuY19wYXJhbXMpOwogfQogCi1zdGF0aWMgdm9pZCBibngyeF9kY2J4X3Jlc3VtZV9od190eChzdHJ1Y3QgYm54MnggKmJwKQorc3RhdGljIGludCBibngyeF9kY2J4X3Jlc3VtZV9od190eChzdHJ1Y3QgYm54MnggKmJwKQogewotCWJueDJ4X3BmY19md19zdHJ1Y3RfZTIoYnApOwotCURQKE5FVElGX01TR19MSU5LLCAic2VuZGluZyBTVEFSVCBUUkFGRklDXG4iKTsKLQlibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0NPTU1PTl9TVEFSVF9UUkFGRklDLAotCQkgICAgICAwLCAvKiBjb25uZWN0aW9ubGVzcyAqLwotCQkgICAgICBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgcGZjX2NvbmZpZykpLAotCQkgICAgICBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgcGZjX2NvbmZpZykpLAotCQkgICAgICAxICAvKiBjb21tbW9uICovKTsKKwlzdHJ1Y3QgYm54MnhfZnVuY19zdGF0ZV9wYXJhbXMgZnVuY19wYXJhbXMgPSB7MH07CisJc3RydWN0IGJueDJ4X2Z1bmNfdHhfc3RhcnRfcGFyYW1zICp0eF9wYXJhbXMgPQorCQkmZnVuY19wYXJhbXMucGFyYW1zLnR4X3N0YXJ0OworCisJZnVuY19wYXJhbXMuZl9vYmogPSAmYnAtPmZ1bmNfb2JqOworCWZ1bmNfcGFyYW1zLmNtZCA9IEJOWDJYX0ZfQ01EX1RYX1NUQVJUOworCisJYm54MnhfZGNieF9md19zdHJ1Y3QoYnAsIHR4X3BhcmFtcyk7CisKKwlEUChORVRJRl9NU0dfTElOSywgIlNUQVJUIFRSQUZGSUNcbiIpOworCXJldHVybiBibngyeF9mdW5jX3N0YXRlX2NoYW5nZShicCwgJmZ1bmNfcGFyYW1zKTsKIH0KIAotc3RhdGljIHZvaWQgYm54MnhfZGNieF91cGRhdGVfZXRzX3BhcmFtcyhzdHJ1Y3QgYm54MnggKmJwKQorc3RhdGljIHZvaWQgYm54MnhfZGNieF8yY29zX2xpbWl0X3VwZGF0ZV9ldHNfY29uZmlnKHN0cnVjdCBibngyeCAqYnApCiB7CiAJc3RydWN0IGJueDJ4X2RjYnhfcGdfcGFyYW1zICpldHMgPSAmKGJwLT5kY2J4X3BvcnRfcGFyYW1zLmV0cyk7Ci0JdTgJc3RhdHVzID0gMDsKKwlpbnQgcmMgPSAwOwogCi0JYm54MnhfZXRzX2Rpc2FibGVkKCZicC0+bGlua19wYXJhbXMpOwotCi0JaWYgKCFldHMtPmVuYWJsZWQpCi0JCXJldHVybjsKLQotCWlmICgoZXRzLT5udW1fb2ZfY29zID09IDApIHx8IChldHMtPm51bV9vZl9jb3MgPiBFMl9OVU1fT0ZfQ09TKSkgewotCQlCTlgyWF9FUlIoImlsbGVnYWwgbnVtIG9mIGNvcz0gJXgiLCBldHMtPm51bV9vZl9jb3MpOworCWlmIChldHMtPm51bV9vZl9jb3MgPT0gMCB8fCBldHMtPm51bV9vZl9jb3MgPiBEQ0JYX0NPU19NQVhfTlVNX0UyKSB7CisJCUJOWDJYX0VSUigiSWxsZWdhbCBudW1iZXIgb2YgQ09TZXMgJWRcbiIsIGV0cy0+bnVtX29mX2Nvcyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ0MCw5ICs0NzksOSBAQAogCQlyZXR1cm47CiAKIAkvKiBzYW5pdHkgKi8KLQlpZiAoKChCTlgyWF9EQ0JYX0NPU19OT1RfU1RSSUNUID09IGV0cy0+Y29zX3BhcmFtc1swXS5zdHJpY3QpICYmCisJaWYgKCgoQk5YMlhfRENCWF9TVFJJQ1RfSU5WQUxJRCA9PSBldHMtPmNvc19wYXJhbXNbMF0uc3RyaWN0KSAmJgogCSAgICAgKERDQlhfSU5WQUxJRF9DT1NfQlcgPT0gZXRzLT5jb3NfcGFyYW1zWzBdLmJ3X3RibCkpIHx8Ci0JICAgICgoQk5YMlhfRENCWF9DT1NfTk9UX1NUUklDVCA9PSBldHMtPmNvc19wYXJhbXNbMV0uc3RyaWN0KSAmJgorCSAgICAoKEJOWDJYX0RDQlhfU1RSSUNUX0lOVkFMSUQgPT0gZXRzLT5jb3NfcGFyYW1zWzFdLnN0cmljdCkgJiYKIAkgICAgIChEQ0JYX0lOVkFMSURfQ09TX0JXID09IGV0cy0+Y29zX3BhcmFtc1sxXS5id190YmwpKSkgewogCQlCTlgyWF9FUlIoImFsbCBDT1Mgc2hvdWxkIGhhdmUgYXQgbGVhc3QgYndfbGltaXQgb3Igc3RyaWN0IgogCQkJICAgICJldHMtPmNvc19wYXJhbXNbMF0uc3RyaWN0PSAleCIKQEAgLTQ3NCwxNyArNTEzLDcxIEBACiAKIAkJYm54MnhfZXRzX2J3X2xpbWl0KCZicC0+bGlua19wYXJhbXMsIGJ3X3RibF8wLCBid190YmxfMSk7CiAJfSBlbHNlIHsKLQkJaWYgKGV0cy0+Y29zX3BhcmFtc1swXS5zdHJpY3QgPT0gQk5YMlhfRENCWF9DT1NfSElHSF9TVFJJQ1QpCi0JCQlzdGF0dXMgPSBibngyeF9ldHNfc3RyaWN0KCZicC0+bGlua19wYXJhbXMsIDApOworCQlpZiAoZXRzLT5jb3NfcGFyYW1zWzBdLnN0cmljdCA9PSBCTlgyWF9EQ0JYX1NUUklDVF9DT1NfSElHSEVTVCkKKwkJCXJjID0gYm54MnhfZXRzX3N0cmljdCgmYnAtPmxpbmtfcGFyYW1zLCAwKTsKIAkJZWxzZSBpZiAoZXRzLT5jb3NfcGFyYW1zWzFdLnN0cmljdAotCQkJCQkJPT0gQk5YMlhfRENCWF9DT1NfSElHSF9TVFJJQ1QpCi0JCQlzdGF0dXMgPSBibngyeF9ldHNfc3RyaWN0KCZicC0+bGlua19wYXJhbXMsIDEpOwotCi0JCWlmIChzdGF0dXMpCisJCQkJCT09IEJOWDJYX0RDQlhfU1RSSUNUX0NPU19ISUdIRVNUKQorCQkJcmMgPSBibngyeF9ldHNfc3RyaWN0KCZicC0+bGlua19wYXJhbXMsIDEpOworCQlpZiAocmMpCiAJCQlCTlgyWF9FUlIoInVwZGF0ZV9ldHNfcGFyYW1zIGZhaWxlZFxuIik7CiAJfQogfQogCisvKgorICogSW4gRTNCMCB0aGUgY29uZmlndXJhdGlvbiBtYXkgaGF2ZSBtb3JlIHRoYW4gMiBDT1MuCisgKi8KK3ZvaWQgYm54MnhfZGNieF91cGRhdGVfZXRzX2NvbmZpZyhzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBibngyeF9kY2J4X3BnX3BhcmFtcyAqZXRzID0gJihicC0+ZGNieF9wb3J0X3BhcmFtcy5ldHMpOworCXN0cnVjdCBibngyeF9ldHNfcGFyYW1zIGV0c19wYXJhbXMgPSB7IDAgfTsKKwl1OCBpOworCisJZXRzX3BhcmFtcy5udW1fb2ZfY29zID0gZXRzLT5udW1fb2ZfY29zOworCisJZm9yIChpID0gMDsgaSA8IGV0cy0+bnVtX29mX2NvczsgaSsrKSB7CisJCS8qIENPUyBpcyBTUCAqLworCQlpZiAoZXRzLT5jb3NfcGFyYW1zW2ldLnN0cmljdCAhPSBCTlgyWF9EQ0JYX1NUUklDVF9JTlZBTElEKSB7CisJCQlpZiAoZXRzLT5jb3NfcGFyYW1zW2ldLmJ3X3RibCAhPSBEQ0JYX0lOVkFMSURfQ09TX0JXKSB7CisJCQkJQk5YMlhfRVJSKCJDT1MgY2FuJ3QgYmUgbm90IEJXIGFuZCBub3QgU1BcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJZXRzX3BhcmFtcy5jb3NbaV0uc3RhdGUgPSBibngyeF9jb3Nfc3RhdGVfc3RyaWN0OworCQkJZXRzX3BhcmFtcy5jb3NbaV0ucGFyYW1zLnNwX3BhcmFtcy5wcmkgPQorCQkJCQkJZXRzLT5jb3NfcGFyYW1zW2ldLnN0cmljdDsKKwkJfSBlbHNlIHsgLyogQ09TIGlzIEJXICovCisJCQlpZiAoZXRzLT5jb3NfcGFyYW1zW2ldLmJ3X3RibCA9PSBEQ0JYX0lOVkFMSURfQ09TX0JXKSB7CisJCQkJQk5YMlhfRVJSKCJDT1MgY2FuJ3QgYmUgbm90IEJXIGFuZCBub3QgU1BcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWV0c19wYXJhbXMuY29zW2ldLnN0YXRlID0gYm54MnhfY29zX3N0YXRlX2J3OworCQkJZXRzX3BhcmFtcy5jb3NbaV0ucGFyYW1zLmJ3X3BhcmFtcy5idyA9CisJCQkJCQkodTgpZXRzLT5jb3NfcGFyYW1zW2ldLmJ3X3RibDsKKwkJfQorCX0KKworCS8qIENvbmZpZ3VyZSB0aGUgRVRTIGluIEhXICovCisJaWYgKGJueDJ4X2V0c19lM2IwX2NvbmZpZygmYnAtPmxpbmtfcGFyYW1zLCAmYnAtPmxpbmtfdmFycywKKwkJCQkgICZldHNfcGFyYW1zKSkgeworCQlCTlgyWF9FUlIoImJueDJ4X2V0c19lM2IwX2NvbmZpZyBmYWlsZWRcbiIpOworCQlibngyeF9ldHNfZGlzYWJsZWQoJmJwLT5saW5rX3BhcmFtcywgJmJwLT5saW5rX3ZhcnMpOworCX0KK30KKworc3RhdGljIHZvaWQgYm54MnhfZGNieF91cGRhdGVfZXRzX3BhcmFtcyhzdHJ1Y3QgYm54MnggKmJwKQoreworCWJueDJ4X2V0c19kaXNhYmxlZCgmYnAtPmxpbmtfcGFyYW1zLCAmYnAtPmxpbmtfdmFycyk7CisKKwlpZiAoIWJwLT5kY2J4X3BvcnRfcGFyYW1zLmV0cy5lbmFibGVkIHx8CisJICAgIChicC0+ZGNieF9lcnJvciAmIERDQlhfUkVNT1RFX01JQl9FUlJPUikpCisJCXJldHVybjsKKworCWlmIChDSElQX0lTX0UzQjAoYnApKQorCQlibngyeF9kY2J4X3VwZGF0ZV9ldHNfY29uZmlnKGJwKTsKKwllbHNlCisJCWJueDJ4X2RjYnhfMmNvc19saW1pdF91cGRhdGVfZXRzX2NvbmZpZyhicCk7Cit9CisKICNpZmRlZiBCQ01fRENCTkwKIHN0YXRpYyBpbnQgYm54MnhfZGNieF9yZWFkX3NobWVtX3JlbW90ZV9taWIoc3RydWN0IGJueDJ4ICpicCkKIHsKQEAgLTUyNyw2ICs2MjAsNyBAQAogCQlCTlgyWF9FUlIoIkZXIGRvZXNuJ3Qgc3VwcG9ydCBkY2J4X25lZ19yZXNfb2Zmc2V0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCiAJcmMgPSBibngyeF9kY2J4X3JlYWRfbWliKGJwLCAodTMyICopJmxvY2FsX21pYiwgZGNieF9uZWdfcmVzX29mZnNldCwKIAkJCQkgRENCWF9SRUFEX0xPQ0FMX01JQik7CiAKQEAgLTU2MywxNSArNjU3LDYgQEAKIAkJRENCX0FQUF9JRFRZUEVfRVRIVFlQRTsKIH0KIAotc3RhdGljIGlubGluZQotdm9pZCBibngyeF9kY2J4X2ludmFsaWRhdGVfbG9jYWxfYXBwcyhzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBEQ0JYX01BWF9BUFBfUFJPVE9DT0w7IGkrKykKLQkJYnAtPmRjYnhfbG9jYWxfZmVhdC5hcHAuYXBwX3ByaV90YmxbaV0uYXBwQml0ZmllbGQgJj0KLQkJCQkJCQl+RENCWF9BUFBfRU5UUllfVkFMSUQ7Ci19Ci0KIGludCBibngyeF9kY2JubF91cGRhdGVfYXBwbGlzdChzdHJ1Y3QgYm54MnggKmJwLCBib29sIGRlbGFsbCkKIHsKIAlpbnQgaSwgZXJyID0gMDsKQEAgLTU5NywzMiArNjgyLDUwIEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3VwZGF0ZV9kcnZfZmxhZ3Moc3RydWN0IGJueDJ4ICpicCwgdTMyIGZsYWdzLCB1MzIgc2V0KQoreworCWlmIChTSE1FTTJfSEFTKGJwLCBkcnZfZmxhZ3MpKSB7CisJCXUzMiBkcnZfZmxhZ3M7CisJCWJueDJ4X2FjcXVpcmVfaHdfbG9jayhicCwgSFdfTE9DS19EUlZfRkxBR1MpOworCQlkcnZfZmxhZ3MgPSBTSE1FTTJfUkQoYnAsIGRydl9mbGFncyk7CisKKwkJaWYgKHNldCkKKwkJCVNFVF9GTEFHUyhkcnZfZmxhZ3MsIGZsYWdzKTsKKwkJZWxzZQorCQkJUkVTRVRfRkxBR1MoZHJ2X2ZsYWdzLCBmbGFncyk7CisKKwkJU0hNRU0yX1dSKGJwLCBkcnZfZmxhZ3MsIGRydl9mbGFncyk7CisJCURQKE5FVElGX01TR19IVywgImRydl9mbGFncyAweCUwOHhcbiIsIGRydl9mbGFncyk7CisJCWJueDJ4X3JlbGVhc2VfaHdfbG9jayhicCwgSFdfTE9DS19EUlZfRkxBR1MpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2RjYnhfdXBkYXRlX3RjX21hcHBpbmcoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1OCBwcmlvLCBjb3M7CisJZm9yIChjb3MgPSAwOyBjb3MgPCBicC0+ZGNieF9wb3J0X3BhcmFtcy5ldHMubnVtX29mX2NvczsgY29zKyspIHsKKwkJZm9yIChwcmlvID0gMDsgcHJpbyA8IEJOWDJYX01BWF9QUklPUklUWTsgcHJpbysrKSB7CisJCQlpZiAoYnAtPmRjYnhfcG9ydF9wYXJhbXMuZXRzLmNvc19wYXJhbXNbY29zXS5wcmlfYml0bWFzaworCQkJICAgICYgKDEgPDwgcHJpbykpIHsKKwkJCQlicC0+cHJpb190b19jb3NbcHJpb10gPSBjb3M7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJICAgInR4X21hcHBpbmcgJWQgLS0+ICVkXG4iLCBwcmlvLCBjb3MpOworCQkJfQorCQl9CisJfQorCisJLyogc2V0dXAgdGMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgcnRubCBsb2NrLCBidXQgd2UgY2FuJ3QgdGFrZSBpdCBoZXJlCisJICogYXMgd2UgYXJlIGhhbmRsaW5nIGFuIGF0dGV0bnRpb24gb24gYSB3b3JrIHF1ZXVlIHdoaWNoIG11c3QgYmUKKwkgKiBmbHVzaGVkIGF0IHNvbWUgcnRubC1sb2NrZWQgY29udGV4dHMgKGUuZy4gaWYgZG93bikKKwkgKi8KKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQk5YMlhfU1BfUlROTF9TRVRVUF9UQywgJmJwLT5zcF9ydG5sX3N0YXRlKSkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+c3BfcnRubF90YXNrLCAwKTsKK30KKwogdm9pZCBibngyeF9kY2J4X3NldF9wYXJhbXMoc3RydWN0IGJueDJ4ICpicCwgdTMyIHN0YXRlKQogewogCXN3aXRjaCAoc3RhdGUpIHsKIAljYXNlIEJOWDJYX0RDQlhfU1RBVEVfTkVHX1JFQ0VJVkVEOgotI2lmZGVmIEJDTV9DTklDCi0JCWlmIChicC0+c3RhdGUgIT0gQk5YMlhfU1RBVEVfT1BFTklOR19XQUlUNF9MT0FEKSB7Ci0JCQlzdHJ1Y3QgY25pY19vcHMgKmNfb3BzOwotCQkJc3RydWN0IGNuaWNfZXRoX2RldiAqY3AgPSAmYnAtPmNuaWNfZXRoX2RldjsKLQkJCWJwLT5mbGFncyB8PSBOT19JU0NTSV9PT09fRkxBRyB8IE5PX0lTQ1NJX0ZMQUc7Ci0JCQljcC0+ZHJ2X3N0YXRlIHw9IENOSUNfRFJWX1NUQVRFX05PX0lTQ1NJX09PTzsKLQkJCWNwLT5kcnZfc3RhdGUgfD0gQ05JQ19EUlZfU1RBVEVfTk9fSVNDU0k7Ci0KLQkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCWNfb3BzID0gcmN1X2RlcmVmZXJlbmNlKGJwLT5jbmljX29wcyk7Ci0JCQlpZiAoY19vcHMpIHsKLQkJCQlibngyeF9jbmljX25vdGlmeShicCwgQ05JQ19DVExfU1RPUF9JU0NTSV9DTUQpOwotCQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQl9Ci0KLQkJLyogZmFsbCB0aHJvdWdoIGlmIG5vIENOSUMgaW5pdGlhbGl6ZWQgICovCi0JY2FzZSBCTlgyWF9EQ0JYX1NUQVRFX0lTQ1NJX1NUT1BQRUQ6Ci0jZW5kaWYKLQogCQl7CiAJCQlEUChORVRJRl9NU0dfTElOSywgIkJOWDJYX0RDQlhfU1RBVEVfTkVHX1JFQ0VJVkVEXG4iKTsKICNpZmRlZiBCQ01fRENCTkwKQEAgLTY0NiwxMDIgKzc0OSw1MyBAQAogCQkJYm54MnhfZ2V0X2RjYnhfZHJ2X3BhcmFtKGJwLCAmYnAtPmRjYnhfbG9jYWxfZmVhdCwKIAkJCQkJCSBicC0+ZGNieF9lcnJvcik7CiAKLQkJCWlmIChicC0+c3RhdGUgIT0gQk5YMlhfU1RBVEVfT1BFTklOR19XQUlUNF9MT0FEKSB7Ci0jaWZkZWYgQkNNX0RDQk5MCi0JCQkJLyoqCi0JCQkJICogQWRkIG5ldyBhcHAgdGx2cyB0byBkY2JubAotCQkJCSAqLwotCQkJCWJueDJ4X2RjYm5sX3VwZGF0ZV9hcHBsaXN0KGJwLCBmYWxzZSk7Ci0jZW5kaWYKLQkJCQlibngyeF9kY2J4X3N0b3BfaHdfdHgoYnApOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJLyogbWFyayBEQ0JYIHJlc3VsdCBmb3IgUE1GIG1pZ3JhdGlvbiAqLworCQkJYm54MnhfdXBkYXRlX2Rydl9mbGFncyhicCwgRFJWX0ZMQUdTX0RDQl9DT05GSUdVUkVELCAxKTsKICNpZmRlZiBCQ01fRENCTkwKIAkJCS8qKgotCQkJICogSW52YWxpZGF0ZSB0aGUgbG9jYWwgYXBwIHRsdnMgaWYgdGhleSBhcmUgbm90IGFkZGVkCi0JCQkgKiB0byB0aGUgZGNibmwgYXBwIGxpc3QgdG8gYXZvaWQgZGVsZXRpbmcgdGhlbSBmcm9tCi0JCQkgKiB0aGUgbGlzdCBsYXRlciBvbgorCQkJICogQWRkIG5ldyBhcHAgdGx2cyB0byBkY2JubAogCQkJICovCi0JCQlibngyeF9kY2J4X2ludmFsaWRhdGVfbG9jYWxfYXBwcyhicCk7CisJCQlibngyeF9kY2JubF91cGRhdGVfYXBwbGlzdChicCwgZmFsc2UpOwogI2VuZGlmCisJCQlibngyeF9kY2J4X3N0b3BfaHdfdHgoYnApOworCisJCQkvKiByZWNvbmZpZ3VyZSB0aGUgbmV0ZGV2aWNlIHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIG5ldworCQkJICogZGNieCBuZWdvdGlhdGlvbi4KKwkJCSAqLworCQkJYm54MnhfZGNieF91cGRhdGVfdGNfbWFwcGluZyhicCk7CisKKwkJCXJldHVybjsKIAkJfQogCWNhc2UgQk5YMlhfRENCWF9TVEFURV9UWF9QQVVTRUQ6CiAJCURQKE5FVElGX01TR19MSU5LLCAiQk5YMlhfRENCWF9TVEFURV9UWF9QQVVTRURcbiIpOwogCQlibngyeF9wZmNfc2V0X3BmYyhicCk7CiAKIAkJYm54MnhfZGNieF91cGRhdGVfZXRzX3BhcmFtcyhicCk7Ci0JCWlmIChicC0+c3RhdGUgIT0gQk5YMlhfU1RBVEVfT1BFTklOR19XQUlUNF9MT0FEKSB7Ci0JCQlibngyeF9kY2J4X3Jlc3VtZV9od190eChicCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogZmFsbCB0aHJvdWdoICovCisJCWJueDJ4X2RjYnhfcmVzdW1lX2h3X3R4KGJwKTsKKwkJcmV0dXJuOwogCWNhc2UgQk5YMlhfRENCWF9TVEFURV9UWF9SRUxFQVNFRDoKIAkJRFAoTkVUSUZfTVNHX0xJTkssICJCTlgyWF9EQ0JYX1NUQVRFX1RYX1JFTEVBU0VEXG4iKTsKLQkJaWYgKGJwLT5zdGF0ZSAhPSBCTlgyWF9TVEFURV9PUEVOSU5HX1dBSVQ0X0xPQUQpCi0JCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfRENCWF9QTUZfRFJWX09LLCAwKTsKLQorCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfRENCWF9QTUZfRFJWX09LLCAwKTsKKyNpZmRlZiBCQ01fRENCTkwKKwkJLyoKKwkJICogU2VuZCBhIG5vdGlmaWNhdGlvbiBmb3IgdGhlIG5ldyBuZWdvdGlhdGVkIHBhcmFtZXRlcnMKKwkJICovCisJCWRjYm5sX2NlZV9ub3RpZnkoYnAtPmRldiwgUlRNX0dFVERDQiwgRENCX0NNRF9DRUVfR0VULCAwLCAwKTsKKyNlbmRpZgogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJQk5YMlhfRVJSKCJVbmtub3duIERDQlhfU1RBVEVcbiIpOwogCX0KIH0KIAotCi0jZGVmaW5lIExMRFBfU1RBVFNfT0ZGU0VUKGJwKQkJKEJQX1BPUlQoYnApKlwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBsbGRwX2RjYnhfc3RhdCkpCi0KLS8qIGNhbGN1bGF0ZSBzdHJ1Y3Qgb2Zmc2V0IGluIGFycmF5IGFjY29yZGluZyB0byBjaGlwIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIExMRFBfUEFSQU1TX09GRlNFVChicCkJCShCUF9QT1JUKGJwKSpzaXplb2Yoc3RydWN0IGxsZHBfcGFyYW1zKSkKLQogI2RlZmluZSBMTERQX0FETUlOX01JQl9PRkZTRVQoYnApCShQT1JUX01BWCpzaXplb2Yoc3RydWN0IGxsZHBfcGFyYW1zKSArIFwKIAkJCQkgICAgICBCUF9QT1JUKGJwKSpzaXplb2Yoc3RydWN0IGxsZHBfYWRtaW5fbWliKSkKIAotc3RhdGljIHZvaWQgYm54MnhfZGNieF9sbGRwX3VwZGF0ZWRfcGFyYW1zKHN0cnVjdCBibngyeCAqYnAsCi0JCQkJCSAgIHUzMiBkY2J4X2xsZHBfcGFyYW1zX29mZnNldCkKLXsKLQlzdHJ1Y3QgbGxkcF9wYXJhbXMgbGxkcF9wYXJhbXMgPSB7MH07Ci0JdTMyIGkgPSAwLCAqYnVmZiA9IE5VTEw7Ci0JdTMyIG9mZnNldCA9IGRjYnhfbGxkcF9wYXJhbXNfb2Zmc2V0ICsgTExEUF9QQVJBTVNfT0ZGU0VUKGJwKTsKLQotCURQKE5FVElGX01TR19MSU5LLCAibGxkcF9vZmZzZXQgMHgleFxuIiwgb2Zmc2V0KTsKLQotCWlmICgoYnAtPmxsZHBfY29uZmlnX3BhcmFtcy5vdmVyd3JpdGVfc2V0dGluZ3MgPT0KLQkJCQlCTlgyWF9EQ0JYX09WRVJXUklURV9TRVRUSU5HU19FTkFCTEUpKSB7Ci0JCS8qIFJlYWQgdGhlIGRhdGEgZmlyc3QgKi8KLQkJYnVmZiA9ICh1MzIgKikmbGxkcF9wYXJhbXM7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IGxsZHBfcGFyYW1zKTsgaSArPSA0LCAgYnVmZisrKQotCQkJKmJ1ZmYgPSBSRUdfUkQoYnAsIChvZmZzZXQgKyBpKSk7Ci0KLQkJbGxkcF9wYXJhbXMubXNnX3R4X2hvbGQgPQotCQkJKHU4KWJwLT5sbGRwX2NvbmZpZ19wYXJhbXMubXNnX3R4X2hvbGQ7Ci0JCWxsZHBfcGFyYW1zLm1zZ19mYXN0X3R4X2ludGVydmFsID0KLQkJCSh1OClicC0+bGxkcF9jb25maWdfcGFyYW1zLm1zZ19mYXN0X3R4OwotCQlsbGRwX3BhcmFtcy50eF9jcmRfbWF4ID0KLQkJCSh1OClicC0+bGxkcF9jb25maWdfcGFyYW1zLnR4X2NyZWRpdF9tYXg7Ci0JCWxsZHBfcGFyYW1zLm1zZ190eF9pbnRlcnZhbCA9Ci0JCQkodTgpYnAtPmxsZHBfY29uZmlnX3BhcmFtcy5tc2dfdHhfaW50ZXJ2YWw7Ci0JCWxsZHBfcGFyYW1zLnR4X2Zhc3QgPQotCQkJKHU4KWJwLT5sbGRwX2NvbmZpZ19wYXJhbXMudHhfZmFzdDsKLQotCQkvKiBXcml0ZSB0aGUgZGF0YS4qLwotCQlidWZmID0gKHUzMiAqKSZsbGRwX3BhcmFtczsKLQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgbGxkcF9wYXJhbXMpOyBpICs9IDQsIGJ1ZmYrKykKLQkJCVJFR19XUihicCwgKG9mZnNldCArIGkpICwgKmJ1ZmYpOwotCi0KLQl9IGVsc2UgaWYgKEJOWDJYX0RDQlhfT1ZFUldSSVRFX1NFVFRJTkdTX0VOQUJMRSA9PQotCQkJCWJwLT5sbGRwX2NvbmZpZ19wYXJhbXMub3ZlcndyaXRlX3NldHRpbmdzKQotCQlicC0+bGxkcF9jb25maWdfcGFyYW1zLm92ZXJ3cml0ZV9zZXR0aW5ncyA9Ci0JCQkJQk5YMlhfRENCWF9PVkVSV1JJVEVfU0VUVElOR1NfSU5WQUxJRDsKLX0KLQogc3RhdGljIHZvaWQgYm54MnhfZGNieF9hZG1pbl9taWJfdXBkYXRlZF9wYXJhbXMoc3RydWN0IGJueDJ4ICpicCwKIAkJCQl1MzIgZGNieF9sbGRwX3BhcmFtc19vZmZzZXQpCiB7CiAJc3RydWN0IGxsZHBfYWRtaW5fbWliIGFkbWluX21pYjsKIAl1MzIgaSwgb3RoZXJfdHJhZl90eXBlID0gUFJFREVGSU5FRF9BUFBfSURYX01BWCwgdHJhZl90eXBlID0gMDsKLQl1MzIgKmJ1ZmY7CiAJdTMyIG9mZnNldCA9IGRjYnhfbGxkcF9wYXJhbXNfb2Zmc2V0ICsgTExEUF9BRE1JTl9NSUJfT0ZGU0VUKGJwKTsKIAogCS8qc2hvcnRjdXRzKi8KQEAgLTc0OSwxOCArODAzLDE4IEBACiAJc3RydWN0IGJueDJ4X2NvbmZpZ19kY2J4X3BhcmFtcyAqZHAgPSAmYnAtPmRjYnhfY29uZmlnX3BhcmFtczsKIAogCW1lbXNldCgmYWRtaW5fbWliLCAwLCBzaXplb2Yoc3RydWN0IGxsZHBfYWRtaW5fbWliKSk7Ci0JYnVmZiA9ICh1MzIgKikmYWRtaW5fbWliOworCiAJLyogUmVhZCB0aGUgZGF0YSBmaXJzdCAqLwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IGxsZHBfYWRtaW5fbWliKTsgaSArPSA0LCBidWZmKyspCi0JCSpidWZmID0gUkVHX1JEKGJwLCAob2Zmc2V0ICsgaSkpOworCWJueDJ4X3JlYWRfZGF0YShicCwgKHUzMiAqKSZhZG1pbl9taWIsIG9mZnNldCwKKwkJCXNpemVvZihzdHJ1Y3QgbGxkcF9hZG1pbl9taWIpKTsKIAogCWlmIChicC0+ZGNieF9lbmFibGVkID09IEJOWDJYX0RDQlhfRU5BQkxFRF9PTl9ORUdfT04pCiAJCVNFVF9GTEFHUyhhZG1pbl9taWIudmVyX2NmZ19mbGFncywgRENCWF9EQ0JYX0VOQUJMRUQpOwogCWVsc2UKIAkJUkVTRVRfRkxBR1MoYWRtaW5fbWliLnZlcl9jZmdfZmxhZ3MsIERDQlhfRENCWF9FTkFCTEVEKTsKIAotCWlmICgoQk5YMlhfRENCWF9PVkVSV1JJVEVfU0VUVElOR1NfRU5BQkxFID09Ci0JCQkJZHAtPm92ZXJ3cml0ZV9zZXR0aW5ncykpIHsKKwlpZiAoZHAtPm92ZXJ3cml0ZV9zZXR0aW5ncyA9PSBCTlgyWF9EQ0JYX09WRVJXUklURV9TRVRUSU5HU19FTkFCTEUpIHsKKwogCQlSRVNFVF9GTEFHUyhhZG1pbl9taWIudmVyX2NmZ19mbGFncywgRENCWF9DRUVfVkVSU0lPTl9NQVNLKTsKIAkJYWRtaW5fbWliLnZlcl9jZmdfZmxhZ3MgfD0KIAkJCShkcC0+YWRtaW5fZGNieF92ZXJzaW9uIDw8IERDQlhfQ0VFX1ZFUlNJT05fU0hJRlQpICYKQEAgLTg1NiwxOSArOTEwLDE3IEBACiAKIAkJYWYtPmFwcC5kZWZhdWx0X3ByaSA9ICh1OClkcC0+YWRtaW5fZGVmYXVsdF9wcmlvcml0eTsKIAotCX0gZWxzZSBpZiAoQk5YMlhfRENCWF9PVkVSV1JJVEVfU0VUVElOR1NfRU5BQkxFID09Ci0JCQkJCQlkcC0+b3ZlcndyaXRlX3NldHRpbmdzKQotCQlkcC0+b3ZlcndyaXRlX3NldHRpbmdzID0gQk5YMlhfRENCWF9PVkVSV1JJVEVfU0VUVElOR1NfSU5WQUxJRDsKKwl9CiAKIAkvKiBXcml0ZSB0aGUgZGF0YS4gKi8KLQlidWZmID0gKHUzMiAqKSZhZG1pbl9taWI7Ci0JZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgbGxkcF9hZG1pbl9taWIpOyBpICs9IDQsIGJ1ZmYrKykKLQkJUkVHX1dSKGJwLCAob2Zmc2V0ICsgaSksICpidWZmKTsKKwlibngyeF93cml0ZV9kYXRhKGJwLCAodTMyICopJmFkbWluX21pYiwgb2Zmc2V0LAorCQkJIHNpemVvZihzdHJ1Y3QgbGxkcF9hZG1pbl9taWIpKTsKKwogfQogCiB2b2lkIGJueDJ4X2RjYnhfc2V0X3N0YXRlKHN0cnVjdCBibngyeCAqYnAsIGJvb2wgZGNiX29uLCB1MzIgZGNieF9lbmFibGVkKQogewotCWlmIChDSElQX0lTX0UyKGJwKSAmJiAhQ0hJUF9NT0RFX0lTXzRfUE9SVChicCkpIHsKKwlpZiAoIUNISVBfSVNfRTF4KGJwKSkgewogCQlicC0+ZGNiX3N0YXRlID0gZGNiX29uOwogCQlicC0+ZGNieF9lbmFibGVkID0gZGNieF9lbmFibGVkOwogCX0gZWxzZSB7CkBAIC05NjYsNyArMTAxOCw3IEBACiAJRFAoTkVUSUZfTVNHX0xJTkssICJkY2Jfc3RhdGUgJWQgYnAtPnBvcnQucG1mICVkXG4iLAogCSAgIGJwLT5kY2Jfc3RhdGUsIGJwLT5wb3J0LnBtZik7CiAKLQlpZiAoYnAtPmRjYl9zdGF0ZSA9PSAgQk5YMlhfRENCX1NUQVRFX09OICYmIGJwLT5wb3J0LnBtZiAmJgorCWlmIChicC0+ZGNiX3N0YXRlID09IEJOWDJYX0RDQl9TVEFURV9PTiAmJiBicC0+cG9ydC5wbWYgJiYKIAkgICAgU0hNRU0yX0hBUyhicCwgZGNieF9sbGRwX3BhcmFtc19vZmZzZXQpKSB7CiAJCWRjYnhfbGxkcF9wYXJhbXNfb2Zmc2V0ID0KIAkJCVNITUVNMl9SRChicCwgZGNieF9sbGRwX3BhcmFtc19vZmZzZXQpOwpAQCAtOTc0LDU2ICsxMDI2LDIxIEBACiAJCURQKE5FVElGX01TR19MSU5LLCAiZGNieF9sbGRwX3BhcmFtc19vZmZzZXQgMHgleFxuIiwKIAkJICAgZGNieF9sbGRwX3BhcmFtc19vZmZzZXQpOwogCi0JCWlmIChTSE1FTV9MTERQX0RDQlhfUEFSQU1TX05PTkUgIT0gZGNieF9sbGRwX3BhcmFtc19vZmZzZXQpIHsKLQkJCWJueDJ4X2RjYnhfbGxkcF91cGRhdGVkX3BhcmFtcyhicCwKLQkJCQkJCSAgICAgICBkY2J4X2xsZHBfcGFyYW1zX29mZnNldCk7CisJCWJueDJ4X3VwZGF0ZV9kcnZfZmxhZ3MoYnAsIERSVl9GTEFHU19EQ0JfQ09ORklHVVJFRCwgMCk7CiAKKwkJaWYgKFNITUVNX0xMRFBfRENCWF9QQVJBTVNfTk9ORSAhPSBkY2J4X2xsZHBfcGFyYW1zX29mZnNldCkgewogCQkJYm54MnhfZGNieF9hZG1pbl9taWJfdXBkYXRlZF9wYXJhbXMoYnAsCiAJCQkJZGNieF9sbGRwX3BhcmFtc19vZmZzZXQpOwogCi0JCQkvKiBzZXQgZGVmYXVsdCBjb25maWd1cmF0aW9uIEJDIGhhcyAqLwotCQkJYm54MnhfZGNieF9zZXRfcGFyYW1zKGJwLAotCQkJCQkgICAgICBCTlgyWF9EQ0JYX1NUQVRFX05FR19SRUNFSVZFRCk7Ci0KKwkJCS8qIExldCBIVyBzdGFydCBuZWdvdGlhdGlvbiAqLwogCQkJYm54MnhfZndfY29tbWFuZChicCwKIAkJCQkJIERSVl9NU0dfQ09ERV9EQ0JYX0FETUlOX1BNRl9NU0csIDApOwogCQl9CiAJfQogfQotCi12b2lkIGJueDJ4X2RjYl9pbml0X2ludG1lbV9wZmMoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgcHJpb3JpdHlfY29zIHByaWNvc1tNQVhfUEZDX1RSQUZGSUNfVFlQRVNdOwotCXUzMiBpID0gMCwgYWRkcjsKLQltZW1zZXQocHJpY29zLCAwLCBzaXplb2YocHJpY29zKSk7Ci0JLyogRGVmYXVsdCBpbml0aWFsaXphdGlvbiAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfUEZDX1RSQUZGSUNfVFlQRVM7IGkrKykKLQkJcHJpY29zW2ldLnByaW9yaXR5ID0gTExGQ19UUkFGRklDX1RZUEVfVE9fUFJJT1JJVFlfVU5NQVBQRUQ7Ci0KLQkvKiBTdG9yZSBwZXIgcG9ydCBzdHJ1Y3QgdG8gaW50ZXJuYWwgbWVtb3J5ICovCi0JYWRkciA9IEJBUl9YU1RST1JNX0lOVE1FTSArCi0JCQlYU1RPUk1fQ01OR19QRVJfUE9SVF9WQVJTX09GRlNFVChCUF9QT1JUKGJwKSkgKwotCQkJb2Zmc2V0b2Yoc3RydWN0IGNtbmdfc3RydWN0X3Blcl9wb3J0LAotCQkJCSB0cmFmZmljX3R5cGVfdG9fcHJpb3JpdHlfY29zKTsKLQlfX3N0b3JtX21lbXNldF9zdHJ1Y3QoYnAsIGFkZHIsIHNpemVvZihwcmljb3MpLCAodTMyICopcHJpY29zKTsKLQotCi0JLyogTExGQyBkaXNhYmxlZC4qLwotCVJFR19XUjgoYnAgLCBCQVJfWFNUUk9STV9JTlRNRU0gKwotCQkgICAgWFNUT1JNX0NNTkdfUEVSX1BPUlRfVkFSU19PRkZTRVQoQlBfUE9SVChicCkpICsKLQkJICAgIG9mZnNldG9mKHN0cnVjdCBjbW5nX3N0cnVjdF9wZXJfcG9ydCwgbGxmY19tb2RlKSwKLQkJCUxMRkNfTU9ERV9OT05FKTsKLQotCS8qIERDQlggZGlzYWJsZWQuKi8KLQlSRUdfV1I4KGJwICwgQkFSX1hTVFJPUk1fSU5UTUVNICsKLQkJICAgIFhTVE9STV9DTU5HX1BFUl9QT1JUX1ZBUlNfT0ZGU0VUKEJQX1BPUlQoYnApKSArCi0JCSAgICBvZmZzZXRvZihzdHJ1Y3QgY21uZ19zdHJ1Y3RfcGVyX3BvcnQsIGRjYl9lbmFibGVkKSwKLQkJCURDQl9ESVNBQkxFRCk7Ci19Ci0KIHN0YXRpYyB2b2lkCiBibngyeF9kY2J4X3ByaW50X2Nvc19wYXJhbXMoc3RydWN0IGJueDJ4ICpicCwKLQkJCSAgICBzdHJ1Y3QgZmxvd19jb250cm9sX2NvbmZpZ3VyYXRpb24gKnBmY19md19jZmcpCisJCQkgICAgc3RydWN0IGJueDJ4X2Z1bmNfdHhfc3RhcnRfcGFyYW1zICpwZmNfZndfY2ZnKQogewogCXU4IHByaSA9IDA7CiAJdTggY29zID0gMDsKQEAgLTExNzEsNyArMTE4OCw3IEBACiAJCQkvKiBJZiB3ZSBqb2luIGEgZ3JvdXAgYW5kIG9uZSBpcyBzdHJpY3QKIAkJCSAqIHRoYW4gdGhlIGJ3IHJ1bGxzICovCiAJCQljb3NfZGF0YS0+ZGF0YVtlbnRyeV0uc3RyaWN0ID0KLQkJCQkJCUJOWDJYX0RDQlhfQ09TX0hJR0hfU1RSSUNUOworCQkJCQkJQk5YMlhfRENCWF9TVFJJQ1RfQ09TX0hJR0hFU1Q7CiAJfQogCWlmICgoMCA9PSBjb3NfZGF0YS0+ZGF0YVswXS5wcmlfam9pbl9tYXNrKSAmJgogCSAgICAoMCA9PSBjb3NfZGF0YS0+ZGF0YVsxXS5wcmlfam9pbl9tYXNrKSkKQEAgLTExODMsNyArMTIwMCw3IEBACiAjZGVmaW5lIFBPV0VSX09GXzIoeCkJKCgwICE9IHgpICYmICgwID09ICh4ICYgKHgtMSkpKSkKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBieG4yeF9kY2J4X3NpbmdsZV9wZ190b19jb3NfcGFyYW1zKHN0cnVjdCBibngyeCAqYnAsCitzdGF0aWMgdm9pZCBibngyeF9kY2J4XzJjb3NfbGltaXRfY2VlX3NpbmdsZV9wZ190b19jb3NfcGFyYW1zKHN0cnVjdCBibngyeCAqYnAsCiAJCQkJCSAgICAgIHN0cnVjdCBwZ19oZWxwX2RhdGEgKnBnX2hlbHBfZGF0YSwKIAkJCQkJICAgICAgc3RydWN0IGNvc19oZWxwX2RhdGEgKmNvc19kYXRhLAogCQkJCQkgICAgICB1MzIgcHJpX2pvaW5fbWFzaywKQEAgLTEyNjMsMTQgKzEyODAsMTYgQEAKIAkJCWlmIChEQ0JYX1BGQ19QUklfR0VUX1BBVVNFKGJwLCBwcmlfam9pbl9tYXNrKSA+CiAJCQkgICAgRENCWF9QRkNfUFJJX0dFVF9OT05fUEFVU0UoYnAsIHByaV9qb2luX21hc2spKSB7CiAJCQkJY29zX2RhdGEtPmRhdGFbMF0uc3RyaWN0ID0KLQkJCQkJQk5YMlhfRENCWF9DT1NfSElHSF9TVFJJQ1Q7CisJCQkJCUJOWDJYX0RDQlhfU1RSSUNUX0NPU19ISUdIRVNUOwogCQkJCWNvc19kYXRhLT5kYXRhWzFdLnN0cmljdCA9Ci0JCQkJCUJOWDJYX0RDQlhfQ09TX0xPV19TVFJJQ1Q7CisJCQkJCUJOWDJYX0RDQlhfU1RSSUNUX0NPU19ORVhUX0xPV0VSX1BSSSgKKwkJCQkJCUJOWDJYX0RDQlhfU1RSSUNUX0NPU19ISUdIRVNUKTsKIAkJCX0gZWxzZSB7CiAJCQkJY29zX2RhdGEtPmRhdGFbMF0uc3RyaWN0ID0KLQkJCQkJQk5YMlhfRENCWF9DT1NfTE9XX1NUUklDVDsKKwkJCQkJQk5YMlhfRENCWF9TVFJJQ1RfQ09TX05FWFRfTE9XRVJfUFJJKAorCQkJCQkJQk5YMlhfRENCWF9TVFJJQ1RfQ09TX0hJR0hFU1QpOwogCQkJCWNvc19kYXRhLT5kYXRhWzFdLnN0cmljdCA9Ci0JCQkJCUJOWDJYX0RDQlhfQ09TX0hJR0hfU1RSSUNUOworCQkJCQlCTlgyWF9EQ0JYX1NUUklDVF9DT1NfSElHSEVTVDsKIAkJCX0KIAkJCS8qIFBhdXNlYWJsZSAqLwogCQkJY29zX2RhdGEtPmRhdGFbMF0ucGF1c2FibGUgPSB0cnVlOwpAQCAtMTMwNiwxMyArMTMyNSwxNiBAQAogCQkJICogYW5kIHRoYXQgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eQogCQkJICogZ2V0cyB0aGUgaGlnaGVzdCBzdHJpY3QgcHJpb3JpdHkgaW4gdGhlIGFyYml0ZXIuCiAJCQkgKi8KLQkJCWNvc19kYXRhLT5kYXRhWzBdLnN0cmljdCA9IEJOWDJYX0RDQlhfQ09TX0xPV19TVFJJQ1Q7Ci0JCQljb3NfZGF0YS0+ZGF0YVsxXS5zdHJpY3QgPSBCTlgyWF9EQ0JYX0NPU19ISUdIX1NUUklDVDsKKwkJCWNvc19kYXRhLT5kYXRhWzBdLnN0cmljdCA9CisJCQkJCUJOWDJYX0RDQlhfU1RSSUNUX0NPU19ORVhUX0xPV0VSX1BSSSgKKwkJCQkJCUJOWDJYX0RDQlhfU1RSSUNUX0NPU19ISUdIRVNUKTsKKwkJCWNvc19kYXRhLT5kYXRhWzFdLnN0cmljdCA9CisJCQkJCUJOWDJYX0RDQlhfU1RSSUNUX0NPU19ISUdIRVNUOwogCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCBibngyeF9kY2J4X3R3b19wZ190b19jb3NfcGFyYW1zKAorc3RhdGljIHZvaWQgYm54MnhfZGNieF8yY29zX2xpbWl0X2NlZV90d29fcGdfdG9fY29zX3BhcmFtcygKIAkJCSAgICBzdHJ1Y3QgYm54MngJCSpicCwKIAkJCSAgICBzdHJ1Y3QgIHBnX2hlbHBfZGF0YQkqcGdfaGVscF9kYXRhLAogCQkJICAgIHN0cnVjdCBkY2J4X2V0c19mZWF0dXJlCSpldHMsCkBAIC0xMzIyLDcgKzEzNDQsNyBAQAogCQkJICAgIHU4CQkJCW51bV9vZl9kaWZfcHJpKQogewogCXU4IGkgPSAwOwotCXU4IHBnW0UyX05VTV9PRl9DT1NdID0gezB9OworCXU4IHBnW0RDQlhfQ09TX01BWF9OVU1fRTJdID0geyAwIH07CiAKIAkvKiBJZiB0aGVyZSBhcmUgYm90aCBwYXVzZWFibGUgYW5kIG5vbi1wYXVzZWFibGUgcHJpb3JpdGllcywKIAkgKiB0aGUgcGF1c2VhYmxlIHByaW9yaXRpZXMgZ28gdG8gdGhlIGZpcnN0IHF1ZXVlIGFuZApAQCAtMTM3OCwxNiArMTQwMCw2OCBAQAogCX0KIAogCS8qIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBzdHJpY3QgcGcgKi8KLQlmb3IgKGkgPSAwIDsgaSA8IEUyX05VTV9PRl9DT1M7IGkrKykgeworCWZvciAoaSA9IDAgOyBpIDwgQVJSQVlfU0laRShwZyk7IGkrKykgewogCQlpZiAocGdbaV0gPCBEQ0JYX01BWF9OVU1fUEdfQldfRU5UUklFUykKIAkJCWNvc19kYXRhLT5kYXRhW2ldLmNvc19idyA9CiAJCQkJRENCWF9QR19CV19HRVQoZXRzLT5wZ19id190YmwsIHBnW2ldKTsKIAkJZWxzZQotCQkJY29zX2RhdGEtPmRhdGFbaV0uc3RyaWN0ID0gQk5YMlhfRENCWF9DT1NfSElHSF9TVFJJQ1Q7CisJCQljb3NfZGF0YS0+ZGF0YVtpXS5zdHJpY3QgPQorCQkJCQkJQk5YMlhfRENCWF9TVFJJQ1RfQ09TX0hJR0hFU1Q7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBibngyeF9kY2J4X3RocmVlX3BnX3RvX2Nvc19wYXJhbXMoCitzdGF0aWMgaW50IGJueDJ4X2RjYnhfam9pbl9wZ3MoCisJCQkgICAgICBzdHJ1Y3QgYm54MnggICAgICAgICAgICAqYnAsCisJCQkgICAgICBzdHJ1Y3QgZGNieF9ldHNfZmVhdHVyZSAqZXRzLAorCQkJICAgICAgc3RydWN0IHBnX2hlbHBfZGF0YSAgICAgKnBnX2hlbHBfZGF0YSwKKwkJCSAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkX251bV9vZl9wZykKK3sKKwl1OCBlbnRyeV9qb2luZWQgICAgPSBwZ19oZWxwX2RhdGEtPm51bV9vZl9wZyAtIDE7CisJdTggZW50cnlfcmVtb3ZlZCAgID0gZW50cnlfam9pbmVkICsgMTsKKwl1OCBwZ19qb2luZWQgICAgICAgPSAwOworCisJaWYgKHJlcXVpcmVkX251bV9vZl9wZyA9PSAwIHx8IEFSUkFZX1NJWkUocGdfaGVscF9kYXRhLT5kYXRhKQorCQkJCQkJPD0gcGdfaGVscF9kYXRhLT5udW1fb2ZfcGcpIHsKKworCQlCTlgyWF9FUlIoInJlcXVpcmVkX251bV9vZl9wZyBjYW4ndCBiZSB6ZXJvXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd2hpbGUgKHJlcXVpcmVkX251bV9vZl9wZyA8IHBnX2hlbHBfZGF0YS0+bnVtX29mX3BnKSB7CisJCWVudHJ5X2pvaW5lZCA9IHBnX2hlbHBfZGF0YS0+bnVtX29mX3BnIC0gMjsKKwkJZW50cnlfcmVtb3ZlZCA9IGVudHJ5X2pvaW5lZCArIDE7CisJCS8qIHByb3RlY3QgaW5kZXggKi8KKwkJZW50cnlfcmVtb3ZlZCAlPSBBUlJBWV9TSVpFKHBnX2hlbHBfZGF0YS0+ZGF0YSk7CisKKwkJcGdfaGVscF9kYXRhLT5kYXRhW2VudHJ5X2pvaW5lZF0ucGdfcHJpb3JpdHkgfD0KKwkJCXBnX2hlbHBfZGF0YS0+ZGF0YVtlbnRyeV9yZW1vdmVkXS5wZ19wcmlvcml0eTsKKworCQlwZ19oZWxwX2RhdGEtPmRhdGFbZW50cnlfam9pbmVkXS5udW1fb2ZfZGlmX3ByaSArPQorCQkJcGdfaGVscF9kYXRhLT5kYXRhW2VudHJ5X3JlbW92ZWRdLm51bV9vZl9kaWZfcHJpOworCisJCWlmIChwZ19oZWxwX2RhdGEtPmRhdGFbZW50cnlfam9pbmVkXS5wZyA9PSBEQ0JYX1NUUklDVF9QUklfUEcgfHwKKwkJICAgIHBnX2hlbHBfZGF0YS0+ZGF0YVtlbnRyeV9yZW1vdmVkXS5wZyA9PSBEQ0JYX1NUUklDVF9QUklfUEcpCisJCQkvKiBFbnRyaWVzIGpvaW5lZCBzdHJpY3QgcHJpb3JpdHkgcnVsZXMgKi8KKwkJCXBnX2hlbHBfZGF0YS0+ZGF0YVtlbnRyeV9qb2luZWRdLnBnID0KKwkJCQkJCQlEQ0JYX1NUUklDVF9QUklfUEc7CisJCWVsc2UgeworCQkJLyogRW50cmllcyBjYW4gYmUgam9pbmVkIGpvaW4gQlcgKi8KKwkJCXBnX2pvaW5lZCA9IERDQlhfUEdfQldfR0VUKGV0cy0+cGdfYndfdGJsLAorCQkJCQlwZ19oZWxwX2RhdGEtPmRhdGFbZW50cnlfam9pbmVkXS5wZykgKworCQkJCSAgICBEQ0JYX1BHX0JXX0dFVChldHMtPnBnX2J3X3RibCwKKwkJCQkJcGdfaGVscF9kYXRhLT5kYXRhW2VudHJ5X3JlbW92ZWRdLnBnKTsKKworCQkJRENCWF9QR19CV19TRVQoZXRzLT5wZ19id190YmwsCisJCQkJcGdfaGVscF9kYXRhLT5kYXRhW2VudHJ5X2pvaW5lZF0ucGcsIHBnX2pvaW5lZCk7CisJCX0KKwkJLyogSm9pbmVkIHRoZSBlbnRyaWVzICovCisJCXBnX2hlbHBfZGF0YS0+bnVtX29mX3BnLS07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2RjYnhfMmNvc19saW1pdF9jZWVfdGhyZWVfcGdfdG9fY29zX3BhcmFtcygKIAkJCSAgICAgIHN0cnVjdCBibngyeAkJKmJwLAogCQkJICAgICAgc3RydWN0IHBnX2hlbHBfZGF0YQkqcGdfaGVscF9kYXRhLAogCQkJICAgICAgc3RydWN0IGRjYnhfZXRzX2ZlYXR1cmUJKmV0cywKQEAgLTE0NTksMjQgKzE1MzMsMjAzIEBACiAJCQkJLyogSWYgd2Ugam9pbiBhIGdyb3VwIGFuZCBvbmUgaXMgc3RyaWN0CiAJCQkJICogdGhhbiB0aGUgYncgcnVsbHMgKi8KIAkJCQljb3NfZGF0YS0+ZGF0YVsxXS5zdHJpY3QgPQotCQkJCQlCTlgyWF9EQ0JYX0NPU19ISUdIX1NUUklDVDsKKwkJCQkJQk5YMlhfRENCWF9TVFJJQ1RfQ09TX0hJR0hFU1Q7CiAJCQl9CiAJCX0KIAl9CiB9CiAKIAorc3RhdGljIHZvaWQgYm54MnhfZGNieF8yY29zX2xpbWl0X2NlZV9maWxsX2Nvc19wYXJhbXMoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICAgc3RydWN0IHBnX2hlbHBfZGF0YSAqaGVscF9kYXRhLAorCQkJCSAgICAgICBzdHJ1Y3QgZGNieF9ldHNfZmVhdHVyZSAqZXRzLAorCQkJCSAgICAgICBzdHJ1Y3QgY29zX2hlbHBfZGF0YSAqY29zX2RhdGEsCisJCQkJICAgICAgIHUzMiAqcGdfcHJpX29yZ2luYWxfc3ByZWFkLAorCQkJCSAgICAgICB1MzIgcHJpX2pvaW5fbWFzaywKKwkJCQkgICAgICAgdTggbnVtX29mX2RpZl9wcmkpCit7CisKKwkvKiBkZWZhdWx0IEUyIHNldHRpbmdzICovCisJY29zX2RhdGEtPm51bV9vZl9jb3MgPSBEQ0JYX0NPU19NQVhfTlVNX0UyOworCisJc3dpdGNoIChoZWxwX2RhdGEtPm51bV9vZl9wZykgeworCWNhc2UgMToKKwkJYm54MnhfZGNieF8yY29zX2xpbWl0X2NlZV9zaW5nbGVfcGdfdG9fY29zX3BhcmFtcygKKwkJCQkJICAgICAgIGJwLAorCQkJCQkgICAgICAgaGVscF9kYXRhLAorCQkJCQkgICAgICAgY29zX2RhdGEsCisJCQkJCSAgICAgICBwcmlfam9pbl9tYXNrLAorCQkJCQkgICAgICAgbnVtX29mX2RpZl9wcmkpOworCQlicmVhazsKKwljYXNlIDI6CisJCWJueDJ4X2RjYnhfMmNvc19saW1pdF9jZWVfdHdvX3BnX3RvX2Nvc19wYXJhbXMoCisJCQkJCSAgICBicCwKKwkJCQkJICAgIGhlbHBfZGF0YSwKKwkJCQkJICAgIGV0cywKKwkJCQkJICAgIGNvc19kYXRhLAorCQkJCQkgICAgcGdfcHJpX29yZ2luYWxfc3ByZWFkLAorCQkJCQkgICAgcHJpX2pvaW5fbWFzaywKKwkJCQkJICAgIG51bV9vZl9kaWZfcHJpKTsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCWJueDJ4X2RjYnhfMmNvc19saW1pdF9jZWVfdGhyZWVfcGdfdG9fY29zX3BhcmFtcygKKwkJCQkJICAgICAgYnAsCisJCQkJCSAgICAgIGhlbHBfZGF0YSwKKwkJCQkJICAgICAgZXRzLAorCQkJCQkgICAgICBjb3NfZGF0YSwKKwkJCQkJICAgICAgcGdfcHJpX29yZ2luYWxfc3ByZWFkLAorCQkJCQkgICAgICBwcmlfam9pbl9tYXNrLAorCQkJCQkgICAgICBudW1fb2ZfZGlmX3ByaSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiV3JvbmcgcGdfaGVscF9kYXRhLm51bV9vZl9wZ1xuIik7CisJCWJueDJ4X2RjYnhfZXRzX2Rpc2FibGVkX2VudHJ5X2RhdGEoYnAsCisJCQkJCQkgICBjb3NfZGF0YSwgcHJpX2pvaW5fbWFzayk7CisJfQorfQorCitzdGF0aWMgaW50IGJueDJ4X2RjYnhfc3ByZWFkX3N0cmljdF9wcmkoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJc3RydWN0IGNvc19oZWxwX2RhdGEgKmNvc19kYXRhLAorCQkJCQl1OCBlbnRyeSwKKwkJCQkJdTggbnVtX3NwcmVhZF9vZl9lbnRyaWVzLAorCQkJCQl1OCBzdHJpY3RfYXBwX3ByaXMpCit7CisJdTggc3RyaWN0X3ByaSA9IEJOWDJYX0RDQlhfU1RSSUNUX0NPU19ISUdIRVNUOworCXU4IG51bV9vZl9hcHBfcHJpID0gTUFYX1BGQ19QUklPUklUSUVTOworCXU4IGFwcF9wcmlfYml0ID0gMDsKKworCXdoaWxlIChudW1fc3ByZWFkX29mX2VudHJpZXMgJiYgbnVtX29mX2FwcF9wcmkgPiAwKSB7CisJCWFwcF9wcmlfYml0ID0gMSA8PCAobnVtX29mX2FwcF9wcmkgLSAxKTsKKwkJaWYgKGFwcF9wcmlfYml0ICYgc3RyaWN0X2FwcF9wcmlzKSB7CisJCQlzdHJ1Y3QgY29zX2VudHJ5X2hlbHBfZGF0YSAqZGF0YSA9ICZjb3NfZGF0YS0+CisJCQkJCQkJCWRhdGFbZW50cnldOworCQkJbnVtX3NwcmVhZF9vZl9lbnRyaWVzLS07CisJCQlpZiAobnVtX3NwcmVhZF9vZl9lbnRyaWVzID09IDApIHsKKwkJCQkvKiBsYXN0IGVudHJ5IG5lZWRlZCBwdXQgYWxsIHRoZSBlbnRyaWVzIGxlZnQgKi8KKwkJCQlkYXRhLT5jb3NfYncgPSBEQ0JYX0lOVkFMSURfQ09TX0JXOworCQkJCWRhdGEtPnN0cmljdCA9IHN0cmljdF9wcmk7CisJCQkJZGF0YS0+cHJpX2pvaW5fbWFzayA9IHN0cmljdF9hcHBfcHJpczsKKwkJCQlkYXRhLT5wYXVzYWJsZSA9IERDQlhfSVNfUEZDX1BSSV9TT01FX1BBVVNFKGJwLAorCQkJCQkJCWRhdGEtPnByaV9qb2luX21hc2spOworCQkJfSBlbHNlIHsKKwkJCQlzdHJpY3RfYXBwX3ByaXMgJj0gfmFwcF9wcmlfYml0OworCisJCQkJZGF0YS0+Y29zX2J3ID0gRENCWF9JTlZBTElEX0NPU19CVzsKKwkJCQlkYXRhLT5zdHJpY3QgPSBzdHJpY3RfcHJpOworCQkJCWRhdGEtPnByaV9qb2luX21hc2sgPSBhcHBfcHJpX2JpdDsKKwkJCQlkYXRhLT5wYXVzYWJsZSA9IERDQlhfSVNfUEZDX1BSSV9TT01FX1BBVVNFKGJwLAorCQkJCQkJCWRhdGEtPnByaV9qb2luX21hc2spOworCQkJfQorCisJCQlzdHJpY3RfcHJpID0KKwkJCSAgICBCTlgyWF9EQ0JYX1NUUklDVF9DT1NfTkVYVF9MT1dFUl9QUkkoc3RyaWN0X3ByaSk7CisJCQllbnRyeSsrOworCQl9CisKKwkJbnVtX29mX2FwcF9wcmktLTsKKwl9CisKKwlpZiAobnVtX3NwcmVhZF9vZl9lbnRyaWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggYm54MnhfZGNieF9jZWVfZmlsbF9zdHJpY3RfcHJpKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCSBzdHJ1Y3QgY29zX2hlbHBfZGF0YSAqY29zX2RhdGEsCisJCQkJCSB1OCBlbnRyeSwKKwkJCQkJIHU4IG51bV9zcHJlYWRfb2ZfZW50cmllcywKKwkJCQkJIHU4IHN0cmljdF9hcHBfcHJpcykKK3sKKworCWlmIChibngyeF9kY2J4X3NwcmVhZF9zdHJpY3RfcHJpKGJwLCBjb3NfZGF0YSwgZW50cnksCisJCQkJCSBudW1fc3ByZWFkX29mX2VudHJpZXMsCisJCQkJCSBzdHJpY3RfYXBwX3ByaXMpKSB7CisJCXN0cnVjdCBjb3NfZW50cnlfaGVscF9kYXRhICpkYXRhID0gJmNvc19kYXRhLT4KKwkJCQkJCSAgICBkYXRhW2VudHJ5XTsKKwkJLyogRmlsbCBCVyBlbnRyeSAqLworCQlkYXRhLT5jb3NfYncgPSBEQ0JYX0lOVkFMSURfQ09TX0JXOworCQlkYXRhLT5zdHJpY3QgPSBCTlgyWF9EQ0JYX1NUUklDVF9DT1NfSElHSEVTVDsKKwkJZGF0YS0+cHJpX2pvaW5fbWFzayA9IHN0cmljdF9hcHBfcHJpczsKKwkJZGF0YS0+cGF1c2FibGUgPSBEQ0JYX0lTX1BGQ19QUklfU09NRV9QQVVTRShicCwKKwkJCQkgZGF0YS0+cHJpX2pvaW5fbWFzayk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiBudW1fc3ByZWFkX29mX2VudHJpZXM7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2RjYnhfY2VlX2ZpbGxfY29zX3BhcmFtcyhzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQkgICBzdHJ1Y3QgcGdfaGVscF9kYXRhICpoZWxwX2RhdGEsCisJCQkJCSAgIHN0cnVjdCBkY2J4X2V0c19mZWF0dXJlICpldHMsCisJCQkJCSAgIHN0cnVjdCBjb3NfaGVscF9kYXRhICpjb3NfZGF0YSwKKwkJCQkJICAgdTMyIHByaV9qb2luX21hc2spCisKK3sKKwl1OCBuZWVkX251bV9vZl9lbnRyaWVzID0gMDsKKwl1OCBpID0gMDsKKwl1OCBlbnRyeSA9IDA7CisKKwkvKgorCSAqIGlmIHRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIFBHLXMgaW4gQ0VFIGlzIGdyZWF0ZXIgdGhhbiAzCisJICogdGhlbiB0aGUgcmVzdWx0cyBhcmUgbm90IGRldGVybWluZWQgc2luY2UgdGhpcyBpcyBhIHZpb2xhdGlvbgorCSAqIG9mIHRoZSBzdGFuZGFyZC4KKwkgKi8KKwlpZiAoaGVscF9kYXRhLT5udW1fb2ZfcGcgPiBEQ0JYX0NPU19NQVhfTlVNX0UzQjApIHsKKwkJaWYgKGJueDJ4X2RjYnhfam9pbl9wZ3MoYnAsIGV0cywgaGVscF9kYXRhLAorCQkJCQlEQ0JYX0NPU19NQVhfTlVNX0UzQjApKSB7CisJCQlCTlgyWF9FUlIoIlVuYWJsZSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBQR3MgLSIKKwkJCQkgICJ3ZSB3aWxsIGRpc2FibGVzIEVUU1xuIik7CisJCQlibngyeF9kY2J4X2V0c19kaXNhYmxlZF9lbnRyeV9kYXRhKGJwLCBjb3NfZGF0YSwKKwkJCQkJCQkgICBwcmlfam9pbl9tYXNrKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWZvciAoaSA9IDAgOyBpIDwgaGVscF9kYXRhLT5udW1fb2ZfcGc7IGkrKykgeworCQlzdHJ1Y3QgcGdfZW50cnlfaGVscF9kYXRhICpwZyA9ICAmaGVscF9kYXRhLT5kYXRhW2ldOworCQlpZiAocGctPnBnIDwgRENCWF9NQVhfTlVNX1BHX0JXX0VOVFJJRVMpIHsKKwkJCXN0cnVjdCBjb3NfZW50cnlfaGVscF9kYXRhICpkYXRhID0gJmNvc19kYXRhLT4KKwkJCQkJCQkgICAgZGF0YVtlbnRyeV07CisJCQkvKiBGaWxsIEJXIGVudHJ5ICovCisJCQlkYXRhLT5jb3NfYncgPSBEQ0JYX1BHX0JXX0dFVChldHMtPnBnX2J3X3RibCwgcGctPnBnKTsKKwkJCWRhdGEtPnN0cmljdCA9IEJOWDJYX0RDQlhfU1RSSUNUX0lOVkFMSUQ7CisJCQlkYXRhLT5wcmlfam9pbl9tYXNrID0gcGctPnBnX3ByaW9yaXR5OworCQkJZGF0YS0+cGF1c2FibGUgPSBEQ0JYX0lTX1BGQ19QUklfU09NRV9QQVVTRShicCwKKwkJCQkJCWRhdGEtPnByaV9qb2luX21hc2spOworCisJCQllbnRyeSsrOworCQl9IGVsc2UgeworCQkJbmVlZF9udW1fb2ZfZW50cmllcyA9ICBtaW5fdCh1OCwKKwkJCQkodTgpcGctPm51bV9vZl9kaWZfcHJpLAorCQkJCSh1OClEQ0JYX0NPU19NQVhfTlVNX0UzQjAgLQorCQkJCQkJIGhlbHBfZGF0YS0+bnVtX29mX3BnICsgMSk7CisJCQkvKgorCQkJICogSWYgdGhlcmUgYXJlIHN0aWxsIFZPUS1zIHdoaWNoIGhhdmUgbm8gYXNzb2NpYXRlZCBQRywKKwkJCSAqIHRoZW4gYXNzb2NpYXRlIHRoZXNlIFZPUS1zIHRvIFBHMTUuIFRoZXNlIFBHLXMgd2lsbAorCQkJICogYmUgdXNlZCBmb3IgU1AgYmV0d2VlbiBwcmlvcml0aWVzIG9uIFBHMTUuCisJCQkgKi8KKwkJCWVudHJ5ICs9IGJueDJ4X2RjYnhfY2VlX2ZpbGxfc3RyaWN0X3ByaShicCwgY29zX2RhdGEsCisJCQkJZW50cnksIG5lZWRfbnVtX29mX2VudHJpZXMsIHBnLT5wZ19wcmlvcml0eSk7CisJCX0KKwl9CisKKwkvKiB0aGUgZW50cnkgd2lsbCByZXByZXNlbnQgdGhlIG51bWJlciBvZiBDT1NlcyB1c2VkICovCisJY29zX2RhdGEtPm51bV9vZl9jb3MgPSBlbnRyeTsKK30KIHN0YXRpYyB2b2lkIGJueDJ4X2RjYnhfZmlsbF9jb3NfcGFyYW1zKHN0cnVjdCBibngyeCAqYnAsCiAJCQkJICAgICAgIHN0cnVjdCBwZ19oZWxwX2RhdGEgKmhlbHBfZGF0YSwKIAkJCQkgICAgICAgc3RydWN0IGRjYnhfZXRzX2ZlYXR1cmUgKmV0cywKIAkJCQkgICAgICAgdTMyICpwZ19wcmlfb3JnaW5hbF9zcHJlYWQpCiB7Ci0Jc3RydWN0IGNvc19oZWxwX2RhdGEgICAgICAgICBjb3NfZGF0YSA7CisJc3RydWN0IGNvc19oZWxwX2RhdGEgICAgICAgICBjb3NfZGF0YTsKIAl1OCAgICAgICAgICAgICAgICAgICAgaSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKIAl1MzIgICAgICAgICAgICAgICAgICAgcHJpX2pvaW5fbWFzayAgICAgICAgICAgICAgID0gMDsKIAl1OCAgICAgICAgICAgICAgICAgICAgbnVtX29mX2RpZl9wcmkgICAgICAgICAgICAgID0gMDsKIAogCW1lbXNldCgmY29zX2RhdGEsIDAsIHNpemVvZihjb3NfZGF0YSkpOworCiAJLyogVmFsaWRhdGUgdGhlIHBnIHZhbHVlICovCiAJZm9yIChpID0gMDsgaSA8IGhlbHBfZGF0YS0+bnVtX29mX3BnIDsgaSsrKSB7CiAJCWlmIChEQ0JYX1NUUklDVF9QUklPUklUWSAhPSBoZWxwX2RhdGEtPmRhdGFbaV0ucGcgJiYKQEAgLTE0ODcsNzQgKzE3NDAsNjQgQEAKIAkJbnVtX29mX2RpZl9wcmkgICs9IGhlbHBfZGF0YS0+ZGF0YVtpXS5udW1fb2ZfZGlmX3ByaTsKIAl9CiAKLQkvKiBkZWZhdWx0IHNldHRpbmdzICovCi0JY29zX2RhdGEubnVtX29mX2NvcyA9IDI7Ci0JZm9yIChpID0gMDsgaSA8IEUyX05VTV9PRl9DT1MgOyBpKyspIHsKLQkJY29zX2RhdGEuZGF0YVtpXS5wcmlfam9pbl9tYXNrICAgID0gcHJpX2pvaW5fbWFzazsKLQkJY29zX2RhdGEuZGF0YVtpXS5wYXVzYWJsZSAgICAgICAgID0gZmFsc2U7Ci0JCWNvc19kYXRhLmRhdGFbaV0uc3RyaWN0ICAgICAgICAgICA9IEJOWDJYX0RDQlhfQ09TX05PVF9TVFJJQ1Q7Ci0JCWNvc19kYXRhLmRhdGFbaV0uY29zX2J3ICAgICAgICAgICA9IERDQlhfSU5WQUxJRF9DT1NfQlc7CisJLyogZGVmYXVsdHMgKi8KKwljb3NfZGF0YS5udW1fb2ZfY29zID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb3NfZGF0YS5kYXRhKTsgaSsrKSB7CisJCWNvc19kYXRhLmRhdGFbaV0ucHJpX2pvaW5fbWFzayA9IDA7CisJCWNvc19kYXRhLmRhdGFbaV0ucGF1c2FibGUgPSBmYWxzZTsKKwkJY29zX2RhdGEuZGF0YVtpXS5zdHJpY3QgPSBCTlgyWF9EQ0JYX1NUUklDVF9JTlZBTElEOworCQljb3NfZGF0YS5kYXRhW2ldLmNvc19idyA9IERDQlhfSU5WQUxJRF9DT1NfQlc7CiAJfQogCi0Jc3dpdGNoIChoZWxwX2RhdGEtPm51bV9vZl9wZykgewotCWNhc2UgMToKLQotCQlieG4yeF9kY2J4X3NpbmdsZV9wZ190b19jb3NfcGFyYW1zKAotCQkJCQkgICAgICAgYnAsCi0JCQkJCSAgICAgICBoZWxwX2RhdGEsCi0JCQkJCSAgICAgICAmY29zX2RhdGEsCi0JCQkJCSAgICAgICBwcmlfam9pbl9tYXNrLAotCQkJCQkgICAgICAgbnVtX29mX2RpZl9wcmkpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWJueDJ4X2RjYnhfdHdvX3BnX3RvX2Nvc19wYXJhbXMoCi0JCQkJCSAgICBicCwKLQkJCQkJICAgIGhlbHBfZGF0YSwKLQkJCQkJICAgIGV0cywKLQkJCQkJICAgICZjb3NfZGF0YSwKLQkJCQkJICAgIHBnX3ByaV9vcmdpbmFsX3NwcmVhZCwKLQkJCQkJICAgIHByaV9qb2luX21hc2ssCi0JCQkJCSAgICBudW1fb2ZfZGlmX3ByaSk7Ci0JCWJyZWFrOwotCi0JY2FzZSAzOgotCQlibngyeF9kY2J4X3RocmVlX3BnX3RvX2Nvc19wYXJhbXMoCi0JCQkJCSAgICAgIGJwLAotCQkJCQkgICAgICBoZWxwX2RhdGEsCi0JCQkJCSAgICAgIGV0cywKLQkJCQkJICAgICAgJmNvc19kYXRhLAotCQkJCQkgICAgICBwZ19wcmlfb3JnaW5hbF9zcHJlYWQsCi0JCQkJCSAgICAgIHByaV9qb2luX21hc2ssCi0JCQkJCSAgICAgIG51bV9vZl9kaWZfcHJpKTsKLQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCTlgyWF9FUlIoIldyb25nIHBnX2hlbHBfZGF0YS5udW1fb2ZfcGdcbiIpOwotCQlibngyeF9kY2J4X2V0c19kaXNhYmxlZF9lbnRyeV9kYXRhKGJwLAotCQkJCQkJICAgJmNvc19kYXRhLCBwcmlfam9pbl9tYXNrKTsKLQl9CisJaWYgKENISVBfSVNfRTNCMChicCkpCisJCWJueDJ4X2RjYnhfY2VlX2ZpbGxfY29zX3BhcmFtcyhicCwgaGVscF9kYXRhLCBldHMsCisJCQkJCSAgICAgICAmY29zX2RhdGEsIHByaV9qb2luX21hc2spOworCWVsc2UgLyogRTIgKyBFM0EwICovCisJCWJueDJ4X2RjYnhfMmNvc19saW1pdF9jZWVfZmlsbF9jb3NfcGFyYW1zKGJwLAorCQkJCQkJCSAgaGVscF9kYXRhLCBldHMsCisJCQkJCQkJICAmY29zX2RhdGEsCisJCQkJCQkJICBwZ19wcmlfb3JnaW5hbF9zcHJlYWQsCisJCQkJCQkJICBwcmlfam9pbl9tYXNrLAorCQkJCQkJCSAgbnVtX29mX2RpZl9wcmkpOwogCiAJZm9yIChpID0gMDsgaSA8IGNvc19kYXRhLm51bV9vZl9jb3MgOyBpKyspIHsKLQkJc3RydWN0IGJueDJ4X2RjYnhfY29zX3BhcmFtcyAqcGFyYW1zID0KKwkJc3RydWN0IGJueDJ4X2RjYnhfY29zX3BhcmFtcyAqcCA9CiAJCQkmYnAtPmRjYnhfcG9ydF9wYXJhbXMuZXRzLmNvc19wYXJhbXNbaV07CiAKLQkJcGFyYW1zLT5wYXVzZWFibGUgPSBjb3NfZGF0YS5kYXRhW2ldLnBhdXNhYmxlOwotCQlwYXJhbXMtPnN0cmljdCA9IGNvc19kYXRhLmRhdGFbaV0uc3RyaWN0OwotCQlwYXJhbXMtPmJ3X3RibCA9IGNvc19kYXRhLmRhdGFbaV0uY29zX2J3OwotCQlpZiAocGFyYW1zLT5wYXVzZWFibGUpIHsKLQkJCXBhcmFtcy0+cHJpX2JpdG1hc2sgPQotCQkJRENCWF9QRkNfUFJJX0dFVF9QQVVTRShicCwKLQkJCQkJY29zX2RhdGEuZGF0YVtpXS5wcmlfam9pbl9tYXNrKTsKKwkJcC0+c3RyaWN0ID0gY29zX2RhdGEuZGF0YVtpXS5zdHJpY3Q7CisJCXAtPmJ3X3RibCA9IGNvc19kYXRhLmRhdGFbaV0uY29zX2J3OworCQlwLT5wcmlfYml0bWFzayA9IGNvc19kYXRhLmRhdGFbaV0ucHJpX2pvaW5fbWFzazsKKwkJcC0+cGF1c2VhYmxlID0gY29zX2RhdGEuZGF0YVtpXS5wYXVzYWJsZTsKKworCQkvKiBzYW5pdHkgKi8KKwkJaWYgKHAtPmJ3X3RibCAhPSBEQ0JYX0lOVkFMSURfQ09TX0JXIHx8CisJCSAgICBwLT5zdHJpY3QgIT0gQk5YMlhfRENCWF9TVFJJQ1RfSU5WQUxJRCkgeworCQkJaWYgKHAtPnByaV9iaXRtYXNrID09IDApCisJCQkJQk5YMlhfRVJSKCJJbnZhbGlkIHByaV9iaXRtYXNrIGZvciAlZFxuIiwgaSk7CisKKwkJCWlmIChDSElQX0lTX0UyKGJwKSB8fCBDSElQX0lTX0UzQTAoYnApKSB7CisKKwkJCQlpZiAocC0+cGF1c2VhYmxlICYmCisJCQkJICAgIERDQlhfUEZDX1BSSV9HRVRfTk9OX1BBVVNFKGJwLAorCQkJCQkJcC0+cHJpX2JpdG1hc2spICE9IDApCisJCQkJCUJOWDJYX0VSUigiSW5jb25zaXN0ZW50IGNvbmZpZyBmb3IgIgorCQkJCQkJICAicGF1c2FibGUgQ09TICVkXG4iLCBpKTsKKworCQkJCWlmICghcC0+cGF1c2VhYmxlICYmCisJCQkJICAgIERDQlhfUEZDX1BSSV9HRVRfUEFVU0UoYnAsCisJCQkJCQlwLT5wcmlfYml0bWFzaykgIT0gMCkKKwkJCQkJQk5YMlhfRVJSKCJJbmNvbnNpc3RlbnQgY29uZmlnIGZvciAiCisJCQkJCQkgICJub25wYXVzYWJsZSBDT1MgJWRcbiIsIGkpOworCQkJfQorCQl9CisKKwkJaWYgKHAtPnBhdXNlYWJsZSkKIAkJCURQKE5FVElGX01TR19MSU5LLCAiQ09TICVkIFBBVVNBQkxFIHByaWpvaW5tYXNrIDB4JXhcbiIsCiAJCQkJICBpLCBjb3NfZGF0YS5kYXRhW2ldLnByaV9qb2luX21hc2spOwotCQl9IGVsc2UgewotCQkJcGFyYW1zLT5wcmlfYml0bWFzayA9Ci0JCQlEQ0JYX1BGQ19QUklfR0VUX05PTl9QQVVTRShicCwKLQkJCQkJY29zX2RhdGEuZGF0YVtpXS5wcmlfam9pbl9tYXNrKTsKKwkJZWxzZQogCQkJRFAoTkVUSUZfTVNHX0xJTkssICJDT1MgJWQgTk9OUEFVU0FCTEUgcHJpam9pbm1hc2sgIgogCQkJCQkgICIweCV4XG4iLAogCQkJCSAgaSwgY29zX2RhdGEuZGF0YVtpXS5wcmlfam9pbl9tYXNrKTsKLQkJfQogCX0KIAogCWJwLT5kY2J4X3BvcnRfcGFyYW1zLmV0cy5udW1fb2ZfY29zID0gY29zX2RhdGEubnVtX29mX2NvcyA7CkBAIC0xNTc0LDMwICsxODE3LDI2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBibngyeF9wZmNfZndfc3RydWN0X2UyKHN0cnVjdCBibngyeCAqYnApCitzdGF0aWMgdm9pZCBibngyeF9kY2J4X2Z3X3N0cnVjdChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSBzdHJ1Y3QgYm54MnhfZnVuY190eF9zdGFydF9wYXJhbXMgKnBmY19md19jZmcpCiB7Ci0Jc3RydWN0IGZsb3dfY29udHJvbF9jb25maWd1cmF0aW9uICAgKnBmY19md19jZmcgPSBOVUxMOwogCXUxNiBwcmlfYml0ID0gMDsKIAl1OCBjb3MgPSAwLCBwcmkgPSAwOwogCXN0cnVjdCBwcmlvcml0eV9jb3MgKnR0MmNvczsKIAl1MzIgKnR0cCA9IGJwLT5kY2J4X3BvcnRfcGFyYW1zLmFwcC50cmFmZmljX3R5cGVfcHJpb3JpdHk7CiAKLQlwZmNfZndfY2ZnID0gKHN0cnVjdCBmbG93X2NvbnRyb2xfY29uZmlndXJhdGlvbiAqKQotCQkJCQlibngyeF9zcChicCwgcGZjX2NvbmZpZyk7Ci0JbWVtc2V0KHBmY19md19jZmcsIDAsIHNpemVvZihzdHJ1Y3QgZmxvd19jb250cm9sX2NvbmZpZ3VyYXRpb24pKTsKKwltZW1zZXQocGZjX2Z3X2NmZywgMCwgc2l6ZW9mKCpwZmNfZndfY2ZnKSk7CisKKwkvKiB0byBkaXNhYmxlIERDQiAtIHRoZSBzdHJ1Y3R1cmUgbXVzdCBiZSB6ZXJvZWQgKi8KKwlpZiAoYnAtPmRjYnhfZXJyb3IgJiBEQ0JYX1JFTU9URV9NSUJfRVJST1IpCisJCXJldHVybjsKIAogCS8qc2hvcnRjdXQqLwogCXR0MmNvcyA9IHBmY19md19jZmctPnRyYWZmaWNfdHlwZV90b19wcmlvcml0eV9jb3M7CiAKIAkvKiBGdyB2ZXJzaW9uIHNob3VsZCBiZSBpbmNyZW1lbnRlZCBlYWNoIHVwZGF0ZSAqLwogCXBmY19md19jZmctPmRjYl92ZXJzaW9uID0gKyticC0+ZGNiX3ZlcnNpb247Ci0JcGZjX2Z3X2NmZy0+ZGNiX2VuYWJsZWQgPSBEQ0JfRU5BQkxFRDsKLQotCS8qIERlZmF1bHQgaW5pdGlhbGl6YXRpb24gKi8KLQlmb3IgKHByaSA9IDA7IHByaSA8IE1BWF9QRkNfVFJBRkZJQ19UWVBFUyA7IHByaSsrKSB7Ci0JCXR0MmNvc1twcmldLnByaW9yaXR5ID0gTExGQ19UUkFGRklDX1RZUEVfVE9fUFJJT1JJVFlfVU5NQVBQRUQ7Ci0JCXR0MmNvc1twcmldLmNvcyA9IDA7Ci0JfQorCXBmY19md19jZmctPmRjYl9lbmFibGVkID0gMTsKIAogCS8qIEZpbGwgcHJpb3JpdHkgcGFyYW1ldGVycyAqLwogCWZvciAocHJpID0gMDsgcHJpIDwgTExGQ19EUklWRVJfVFJBRkZJQ19UWVBFX01BWDsgcHJpKyspIHsKQEAgLTE2MDUsMTQgKzE4NDQsMzcgQEAKIAkJcHJpX2JpdCA9IDEgPDwgdHQyY29zW3ByaV0ucHJpb3JpdHk7CiAKIAkJLyogRmlsbCBDT1MgcGFyYW1ldGVycyBiYXNlZCBvbiBDT1MgY2FsY3VsYXRlZCB0bwotCQkgKiBtYWtlIGl0IG1vcmUgZ2VuZXJhbGx5IGZvciBmdXR1cmUgdXNlICovCisJCSAqIG1ha2UgaXQgbW9yZSBnZW5lcmFsIGZvciBmdXR1cmUgdXNlICovCiAJCWZvciAoY29zID0gMDsgY29zIDwgYnAtPmRjYnhfcG9ydF9wYXJhbXMuZXRzLm51bV9vZl9jb3M7IGNvcysrKQogCQkJaWYgKGJwLT5kY2J4X3BvcnRfcGFyYW1zLmV0cy5jb3NfcGFyYW1zW2Nvc10uCiAJCQkJCQlwcmlfYml0bWFzayAmIHByaV9iaXQpCiAJCQkJCXR0MmNvc1twcmldLmNvcyA9IGNvczsKIAl9CisKKwkvKiB3ZSBuZXZlciB3YW50IHRoZSBGVyB0byBhZGQgYSAwIHZsYW4gdGFnICovCisJcGZjX2Z3X2NmZy0+ZG9udF9hZGRfcHJpXzBfZW4gPSAxOworCiAJYm54MnhfZGNieF9wcmludF9jb3NfcGFyYW1zKGJwLAlwZmNfZndfY2ZnKTsKIH0KKwordm9pZCBibngyeF9kY2J4X3BtZl91cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwkvKiBpZiB3ZSBuZWVkIHRvIHN5bmNyb25pemUgRENCWCByZXN1bHQgZnJvbSBwcmV2IFBNRgorCSAqIHJlYWQgaXQgZnJvbSBzaG1lbSBhbmQgdXBkYXRlIGJwIGFjY29yZGluZ2x5CisJICovCisJaWYgKFNITUVNMl9IQVMoYnAsIGRydl9mbGFncykgJiYKKwkgICBHRVRfRkxBR1MoU0hNRU0yX1JEKGJwLCBkcnZfZmxhZ3MpLCBEUlZfRkxBR1NfRENCX0NPTkZJR1VSRUQpKSB7CisJCS8qIFJlYWQgbmVnIHJlc3VsdHMgaWYgZGNieCBpcyBpbiB0aGUgRlcgKi8KKwkJaWYgKGJueDJ4X2RjYnhfcmVhZF9zaG1lbV9uZWdfcmVzdWx0cyhicCkpCisJCQlyZXR1cm47CisKKwkJYm54MnhfZHVtcF9kY2J4X2Rydl9wYXJhbShicCwgJmJwLT5kY2J4X2xvY2FsX2ZlYXQsCisJCQkJCSAgYnAtPmRjYnhfZXJyb3IpOworCQlibngyeF9nZXRfZGNieF9kcnZfcGFyYW0oYnAsICZicC0+ZGNieF9sb2NhbF9mZWF0LAorCQkJCQkgYnAtPmRjYnhfZXJyb3IpOworCX0KK30KKwogLyogRENCIG5ldGxpbmsgKi8KICNpZmRlZiBCQ01fRENCTkwKIApAQCAtMTg3OSwxMCArMjE0MSwxMiBAQAogCWlmIChicC0+ZGNiX3N0YXRlKSB7CiAJCXN3aXRjaCAodGNpZCkgewogCQljYXNlIERDQl9OVU1UQ1NfQVRUUl9QRzoKLQkJCSpudW0gPSBFMl9OVU1fT0ZfQ09TOworCQkJKm51bSA9IENISVBfSVNfRTNCMChicCkgPyBEQ0JYX0NPU19NQVhfTlVNX0UzQjAgOgorCQkJCQkJICBEQ0JYX0NPU19NQVhfTlVNX0UyOwogCQkJYnJlYWs7CiAJCWNhc2UgRENCX05VTVRDU19BVFRSX1BGQzoKLQkJCSpudW0gPSBFMl9OVU1fT0ZfQ09TOworCQkJKm51bSA9IENISVBfSVNfRTNCMChicCkgPyBEQ0JYX0NPU19NQVhfTlVNX0UzQjAgOgorCQkJCQkJICBEQ0JYX0NPU19NQVhfTlVNX0UyOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlydmFsID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2RjYi5oIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfZGNiLmgKaW5kZXggYmVkMzY5ZC4uMmM2YTNiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfZGNiLmgKKysrIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfZGNiLmgKQEAgLTI3LDIyICsyNywzMCBAQAogCXUzMiB0cmFmZmljX3R5cGVfcHJpb3JpdHlbTExGQ19EUklWRVJfVFJBRkZJQ19UWVBFX01BWF07CiB9OwogCi0jZGVmaW5lIEUyX05VTV9PRl9DT1MJCQkyCi0jZGVmaW5lIEJOWDJYX0RDQlhfQ09TX05PVF9TVFJJQ1QJMAotI2RlZmluZSBCTlgyWF9EQ0JYX0NPU19MT1dfU1RSSUNUCTEKLSNkZWZpbmUgQk5YMlhfRENCWF9DT1NfSElHSF9TVFJJQ1QJMgorI2RlZmluZSBEQ0JYX0NPU19NQVhfTlVNX0UyCURDQlhfRTJFM19NQVhfTlVNX0NPUworLyogYm54MnggY3VycmVudGx5IGxpbWl0cyBudW1iZXJzIG9mIHN1cHBvcnRlZCBDT1NlcyB0byAzIHRvIGJlIGV4dGVuZGVkIHRvIDYgKi8KKyNkZWZpbmUgQk5YMlhfTUFYX0NPU19TVVBQT1JUCTMKKyNkZWZpbmUgRENCWF9DT1NfTUFYX05VTV9FM0IwCUJOWDJYX01BWF9DT1NfU1VQUE9SVAorI2RlZmluZSBEQ0JYX0NPU19NQVhfTlVNCUJOWDJYX01BWF9DT1NfU1VQUE9SVAogCiBzdHJ1Y3QgYm54MnhfZGNieF9jb3NfcGFyYW1zIHsKIAl1MzIJYndfdGJsOwogCXUzMglwcmlfYml0bWFzazsKKwkvKgorCSAqIHN0cmljdCBwcmlvcml0eTogdmFsaWQgdmFsdWVzIGFyZSAwLi41OyAwIGlzIGhpZ2hlc3QgcHJpb3JpdHkuCisJICogVGhlcmUgY2FuJ3QgYmUgdHdvIENPU2VzIHdpdGggdGhlIHNhbWUgcHJpb3JpdHkuCisJICovCiAJdTgJc3RyaWN0OworI2RlZmluZSBCTlgyWF9EQ0JYX1NUUklDVF9JTlZBTElECQkJRENCWF9DT1NfTUFYX05VTQorI2RlZmluZSBCTlgyWF9EQ0JYX1NUUklDVF9DT1NfSElHSEVTVAkJCTAKKyNkZWZpbmUgQk5YMlhfRENCWF9TVFJJQ1RfQ09TX05FWFRfTE9XRVJfUFJJKHNwKQkoKHNwKSArIDEpCiAJdTgJcGF1c2VhYmxlOwogfTsKIAogc3RydWN0IGJueDJ4X2RjYnhfcGdfcGFyYW1zIHsKIAl1MzIgZW5hYmxlZDsKIAl1OCBudW1fb2ZfY29zOyAvKiB2YWxpZCBDT1MgZW50cmllcyAqLwotCXN0cnVjdCBibngyeF9kY2J4X2Nvc19wYXJhbXMJY29zX3BhcmFtc1tFMl9OVU1fT0ZfQ09TXTsKKwlzdHJ1Y3QgYm54MnhfZGNieF9jb3NfcGFyYW1zCWNvc19wYXJhbXNbRENCWF9DT1NfTUFYX05VTV07CiB9OwogCiBzdHJ1Y3QgYm54MnhfZGNieF9wZmNfcGFyYW1zIHsKQEAgLTYwLDYgKzY4LDggQEAKICNkZWZpbmUgQk5YMlhfRENCWF9PVkVSV1JJVEVfU0VUVElOR1NfRElTQUJMRQkJMAogI2RlZmluZSBCTlgyWF9EQ0JYX09WRVJXUklURV9TRVRUSU5HU19FTkFCTEUJCTEKICNkZWZpbmUgQk5YMlhfRENCWF9PVkVSV1JJVEVfU0VUVElOR1NfSU5WQUxJRAkoQk5YMlhfRENCWF9DT05GSUdfSU5WX1ZBTFVFKQorI2RlZmluZSBCTlgyWF9JU19FVFNfRU5BQkxFRChicCkgKChicCktPmRjYl9zdGF0ZSA9PSBCTlgyWF9EQ0JfU1RBVEVfT04gJiZcCisJCQkJICAoYnApLT5kY2J4X3BvcnRfcGFyYW1zLmV0cy5lbmFibGVkKQogCiBzdHJ1Y3QgYm54MnhfY29uZmlnX2xsZHBfcGFyYW1zIHsKIAl1MzIgb3ZlcndyaXRlX3NldHRpbmdzOwpAQCAtMTMyLDcgKzE0Miw3IEBACiB9OwogCiBzdHJ1Y3QgY29zX2hlbHBfZGF0YSB7Ci0Jc3RydWN0IGNvc19lbnRyeV9oZWxwX2RhdGEJZGF0YVtFMl9OVU1fT0ZfQ09TXTsKKwlzdHJ1Y3QgY29zX2VudHJ5X2hlbHBfZGF0YQlkYXRhW0RDQlhfQ09TX01BWF9OVU1dOwogCXU4CQkJCW51bV9vZl9jb3M7CiB9OwogCkBAIC0xNDgsNiArMTU4LDggQEAKIAkJCQkoKHBnX3ByaSkgJiAoRENCWF9QRkNfUFJJX1BBVVNFX01BU0soYnApKSkKICNkZWZpbmUgRENCWF9QRkNfUFJJX0dFVF9OT05fUEFVU0UoYnAsIHBnX3ByaSkJXAogCQkJKERDQlhfUEZDX1BSSV9OT05fUEFVU0VfTUFTSyhicCkgJiAocGdfcHJpKSkKKyNkZWZpbmUgRENCWF9JU19QRkNfUFJJX1NPTUVfUEFVU0UoYnAsIHBnX3ByaSkJXAorCQkJKDAgIT0gRENCWF9QRkNfUFJJX0dFVF9QQVVTRShicCwgcGdfcHJpKSkKICNkZWZpbmUgSVNfRENCWF9QRkNfUFJJX09OTFlfUEFVU0UoYnAsIHBnX3ByaSkJXAogCQkJKHBnX3ByaSA9PSBEQ0JYX1BGQ19QUklfR0VUX1BBVVNFKChicCksIChwZ19wcmkpKSkKICNkZWZpbmUgSVNfRENCWF9QRkNfUFJJX09OTFlfTk9OX1BBVVNFKGJwLCBwZ19wcmkpXApAQCAtMTcwLDIyICsxODIsMTggQEAKIAogLyogZm9yd2FyZCBEQ0IvUEZDIHJlbGF0ZWQgZGVjbGFyYXRpb25zICovCiBzdHJ1Y3QgYm54Mng7Ci12b2lkIGJueDJ4X2RjYl9pbml0X2ludG1lbV9wZmMoc3RydWN0IGJueDJ4ICpicCk7CiB2b2lkIGJueDJ4X2RjYnhfdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIGJueDJ4X2RjYnhfaW5pdF9wYXJhbXMoc3RydWN0IGJueDJ4ICpicCk7CiB2b2lkIGJueDJ4X2RjYnhfc2V0X3N0YXRlKHN0cnVjdCBibngyeCAqYnAsIGJvb2wgZGNiX29uLCB1MzIgZGNieF9lbmFibGVkKTsKIAogZW51bSB7CiAJQk5YMlhfRENCWF9TVEFURV9ORUdfUkVDRUlWRUQgPSAweDEsCi0jaWZkZWYgQkNNX0NOSUMKLQlCTlgyWF9EQ0JYX1NUQVRFX0lTQ1NJX1NUT1BQRUQsCi0jZW5kaWYKIAlCTlgyWF9EQ0JYX1NUQVRFX1RYX1BBVVNFRCwKIAlCTlgyWF9EQ0JYX1NUQVRFX1RYX1JFTEVBU0VECiB9OwogCiB2b2lkIGJueDJ4X2RjYnhfc2V0X3BhcmFtcyhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgc3RhdGUpOwotCit2b2lkIGJueDJ4X2RjYnhfcG1mX3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKTsKIC8qIERDQiBuZXRsaW5rICovCiAjaWZkZWYgQkNNX0RDQk5MCiBleHRlcm4gY29uc3Qgc3RydWN0IGRjYm5sX3J0bmxfb3BzIGJueDJ4X2RjYm5sX29wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2R1bXAuaCBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2R1bXAuaAppbmRleCBmYjNmZjdjLi5iOTgzODI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9kdW1wLmgKKysrIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfZHVtcC5oCkBAIC0yNSwzNCArMjUsOTQgQEAKIAogCiAvKmRlZmluaXRpb25zICovCi0jZGVmaW5lIFhTVE9STV9XQUlUUF9BRERSICAgIDB4MmI4YTgwCi0jZGVmaW5lIFRTVE9STV9XQUlUUF9BRERSICAgIDB4MWI4YTgwCi0jZGVmaW5lIFVTVE9STV9XQUlUUF9BRERSICAgIDB4MzM4YTgwCi0jZGVmaW5lIENTVE9STV9XQUlUUF9BRERSICAgIDB4MjM4YTgwCi0jZGVmaW5lIFRTVE9STV9DQU1fTU9ERSAgICAgICAgIDB4MUIxNDQwCisjZGVmaW5lIFhTVE9STV9XQUlUUF9BRERSCTB4MmI4YTgwCisjZGVmaW5lIFRTVE9STV9XQUlUUF9BRERSCTB4MWI4YTgwCisjZGVmaW5lIFVTVE9STV9XQUlUUF9BRERSCTB4MzM4YTgwCisjZGVmaW5lIENTVE9STV9XQUlUUF9BRERSCTB4MjM4YTgwCisjZGVmaW5lIFRTVE9STV9DQU1fTU9ERQkweDFCMTQ0MAogCi0jZGVmaW5lIE1BWF9USU1FUl9QRU5ESU5HICAgICAgMjAwCi0jZGVmaW5lIFRJTUVSX1NDQU5fRE9OVF9DQVJFICAgMHhGRgotI2RlZmluZSBSSV9FMQkJCTB4MQotI2RlZmluZSBSSV9FMUgJCQkweDIKLSNkZWZpbmUgUklfRTIJCQkweDQKLSNkZWZpbmUgUklfT05MSU5FCQkweDEwMAotI2RlZmluZSBSSV9QQVRIMF9EVU1QCQkweDIwMAotI2RlZmluZSBSSV9QQVRIMV9EVU1QCQkweDQwMAotI2RlZmluZSBSSV9FMV9PRkZMSU5FCQkoUklfRTEpCisjZGVmaW5lIE1BWF9USU1FUl9QRU5ESU5HCTIwMAorI2RlZmluZSBUSU1FUl9TQ0FOX0RPTlRfQ0FSRQkweEZGCisjZGVmaW5lIFJJX0UxCQkJCTB4MQorI2RlZmluZSBSSV9FMUgJCQkJMHgyCisjZGVmaW5lIFJJX0UyCQkJCTB4NAorI2RlZmluZSBSSV9FMwkJCQkweDgKKyNkZWZpbmUgUklfRTNCMAkJCQkweDEwCisjZGVmaW5lIFJJX09OTElORQkJCTB4MTAwCisjZGVmaW5lIFJJX09GRkxJTkUJCQkweDAKKyNkZWZpbmUgUklfUEFUSDBfRFVNUAkJCTB4MjAwCisjZGVmaW5lIFJJX1BBVEgxX0RVTVAJCQkweDQwMAorCiAjZGVmaW5lIFJJX0UxX09OTElORQkJKFJJX0UxIHwgUklfT05MSU5FKQotI2RlZmluZSBSSV9FMUhfT0ZGTElORQkJKFJJX0UxSCkKICNkZWZpbmUgUklfRTFIX09OTElORQkJKFJJX0UxSCB8IFJJX09OTElORSkKLSNkZWZpbmUgUklfRTJfT0ZGTElORQkJKFJJX0UyKQotI2RlZmluZSBSSV9FMl9PTkxJTkUJCShSSV9FMiB8IFJJX09OTElORSkKLSNkZWZpbmUgUklfRTFFMUhfT0ZGTElORQkoUklfRTEgfCBSSV9FMUgpCiAjZGVmaW5lIFJJX0UxRTFIX09OTElORQkJKFJJX0UxIHwgUklfRTFIIHwgUklfT05MSU5FKQotI2RlZmluZSBSSV9FMUhFMl9PRkZMSU5FCShSSV9FMiB8IFJJX0UxSCkKLSNkZWZpbmUgUklfRTFIRTJfT05MSU5FCQkoUklfRTIgfCBSSV9FMUggfCBSSV9PTkxJTkUpCi0jZGVmaW5lIFJJX0UxRTJfT0ZGTElORQkJKFJJX0UyIHwgUklfRTEpCi0jZGVmaW5lIFJJX0UxRTJfT05MSU5FCQkoUklfRTIgfCBSSV9FMSB8IFJJX09OTElORSkKLSNkZWZpbmUgUklfQUxMX09GRkxJTkUgICAgICAgICAoUklfRTEgfCBSSV9FMUggfCBSSV9FMikKLSNkZWZpbmUgUklfQUxMX09OTElORSAgICAgICAgICAoUklfRTEgfCBSSV9FMUggfCBSSV9FMiB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTJfT05MSU5FCQkoUklfRTIgfCBSSV9PTkxJTkUpCisjZGVmaW5lIFJJX0UxRTJfT05MSU5FCQkoUklfRTEgfCBSSV9FMiB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTFIRTJfT05MSU5FCQkoUklfRTFIIHwgUklfRTIgfCBSSV9PTkxJTkUpCisjZGVmaW5lIFJJX0UxRTFIRTJfT05MSU5FCShSSV9FMSB8IFJJX0UxSCB8IFJJX0UyIHwgUklfT05MSU5FKQorI2RlZmluZSBSSV9FM19PTkxJTkUJCShSSV9FMyB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTFFM19PTkxJTkUJCShSSV9FMSB8IFJJX0UzIHwgUklfT05MSU5FKQorI2RlZmluZSBSSV9FMUhFM19PTkxJTkUJCShSSV9FMUggfCBSSV9FMyB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTFFMUhFM19PTkxJTkUJKFJJX0UxIHwgUklfRTFIIHwgUklfRTMgfCBSSV9PTkxJTkUpCisjZGVmaW5lIFJJX0UyRTNfT05MSU5FCQkoUklfRTIgfCBSSV9FMyB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTFFMkUzX09OTElORQkoUklfRTEgfCBSSV9FMiB8IFJJX0UzIHwgUklfT05MSU5FKQorI2RlZmluZSBSSV9FMUhFMkUzX09OTElORQkoUklfRTFIIHwgUklfRTIgfCBSSV9FMyB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTFFMUhFMkUzX09OTElORQkoUklfRTEgfCBSSV9FMUggfCBSSV9FMiB8IFJJX0UzIHwgUklfT05MSU5FKQorI2RlZmluZSBSSV9FM0IwX09OTElORQkJKFJJX0UzQjAgfCBSSV9PTkxJTkUpCisjZGVmaW5lIFJJX0UxRTNCMF9PTkxJTkUJKFJJX0UxIHwgUklfRTNCMCB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTFIRTNCMF9PTkxJTkUJKFJJX0UxSCB8IFJJX0UzQjAgfCBSSV9PTkxJTkUpCisjZGVmaW5lIFJJX0UxRTFIRTNCMF9PTkxJTkUJKFJJX0UxIHwgUklfRTFIIHwgUklfRTNCMCB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTJFM0IwX09OTElORQkoUklfRTIgfCBSSV9FM0IwIHwgUklfT05MSU5FKQorI2RlZmluZSBSSV9FMUUyRTNCMF9PTkxJTkUJKFJJX0UxIHwgUklfRTIgfCBSSV9FM0IwIHwgUklfT05MSU5FKQorI2RlZmluZSBSSV9FMUhFMkUzQjBfT05MSU5FCShSSV9FMUggfCBSSV9FMiB8IFJJX0UzQjAgfCBSSV9PTkxJTkUpCisjZGVmaW5lIFJJX0UxRTFIRTJFM0IwX09OTElORQkoUklfRTEgfCBSSV9FMUggfCBSSV9FMiB8IFJJX0UzQjAgfCBSSV9PTkxJTkUpCisjZGVmaW5lIFJJX0UzRTNCMF9PTkxJTkUJKFJJX0UzIHwgUklfRTNCMCB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTFFM0UzQjBfT05MSU5FCShSSV9FMSB8IFJJX0UzIHwgUklfRTNCMCB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTFIRTNFM0IwX09OTElORQkoUklfRTFIIHwgUklfRTMgfCBSSV9FM0IwIHwgUklfT05MSU5FKQorI2RlZmluZSBSSV9FMUUxSEUzRTNCMF9PTkxJTkUJKFJJX0UxIHwgUklfRTFIIHwgUklfRTMgfCBSSV9FM0IwIHwgUklfT05MSU5FKQorI2RlZmluZSBSSV9FMkUzRTNCMF9PTkxJTkUJKFJJX0UyIHwgUklfRTMgfCBSSV9FM0IwIHwgUklfT05MSU5FKQorI2RlZmluZSBSSV9FMUUyRTNFM0IwX09OTElORQkoUklfRTEgfCBSSV9FMiB8IFJJX0UzIHwgUklfRTNCMCB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTFIRTJFM0UzQjBfT05MSU5FCShSSV9FMUggfCBSSV9FMiB8IFJJX0UzIHwgUklfRTNCMCB8IFJJX09OTElORSkKKyNkZWZpbmUgUklfRTFFMUhFMkUzRTNCMF9PTkxJTkUJXAorCShSSV9FMSB8IFJJX0UxSCB8IFJJX0UyIHwgUklfRTMgfCBSSV9FM0IwIHwgUklfT05MSU5FKQorI2RlZmluZSBSSV9FMV9PRkZMSU5FCQkoUklfRTEgfCBSSV9PRkZMSU5FKQorI2RlZmluZSBSSV9FMUhfT0ZGTElORQkJKFJJX0UxSCB8IFJJX09GRkxJTkUpCisjZGVmaW5lIFJJX0UxRTFIX09GRkxJTkUJKFJJX0UxIHwgUklfRTFIIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTJfT0ZGTElORQkJKFJJX0UyIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTFFMl9PRkZMSU5FCQkoUklfRTEgfCBSSV9FMiB8IFJJX09GRkxJTkUpCisjZGVmaW5lIFJJX0UxSEUyX09GRkxJTkUJKFJJX0UxSCB8IFJJX0UyIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTFFMUhFMl9PRkZMSU5FCShSSV9FMSB8IFJJX0UxSCB8IFJJX0UyIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTNfT0ZGTElORQkJKFJJX0UzIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTFFM19PRkZMSU5FCQkoUklfRTEgfCBSSV9FMyB8IFJJX09GRkxJTkUpCisjZGVmaW5lIFJJX0UxSEUzX09GRkxJTkUJKFJJX0UxSCB8IFJJX0UzIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTFFMUhFM19PRkZMSU5FCShSSV9FMSB8IFJJX0UxSCB8IFJJX0UzIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTJFM19PRkZMSU5FCQkoUklfRTIgfCBSSV9FMyB8IFJJX09GRkxJTkUpCisjZGVmaW5lIFJJX0UxRTJFM19PRkZMSU5FCShSSV9FMSB8IFJJX0UyIHwgUklfRTMgfCBSSV9PRkZMSU5FKQorI2RlZmluZSBSSV9FMUhFMkUzX09GRkxJTkUJKFJJX0UxSCB8IFJJX0UyIHwgUklfRTMgfCBSSV9PRkZMSU5FKQorI2RlZmluZSBSSV9FMUUxSEUyRTNfT0ZGTElORQkoUklfRTEgfCBSSV9FMUggfCBSSV9FMiB8IFJJX0UzIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTNCMF9PRkZMSU5FCQkoUklfRTNCMCB8IFJJX09GRkxJTkUpCisjZGVmaW5lIFJJX0UxRTNCMF9PRkZMSU5FCShSSV9FMSB8IFJJX0UzQjAgfCBSSV9PRkZMSU5FKQorI2RlZmluZSBSSV9FMUhFM0IwX09GRkxJTkUJKFJJX0UxSCB8IFJJX0UzQjAgfCBSSV9PRkZMSU5FKQorI2RlZmluZSBSSV9FMUUxSEUzQjBfT0ZGTElORQkoUklfRTEgfCBSSV9FMUggfCBSSV9FM0IwIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTJFM0IwX09GRkxJTkUJKFJJX0UyIHwgUklfRTNCMCB8IFJJX09GRkxJTkUpCisjZGVmaW5lIFJJX0UxRTJFM0IwX09GRkxJTkUJKFJJX0UxIHwgUklfRTIgfCBSSV9FM0IwIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTFIRTJFM0IwX09GRkxJTkUJKFJJX0UxSCB8IFJJX0UyIHwgUklfRTNCMCB8IFJJX09GRkxJTkUpCisjZGVmaW5lIFJJX0UxRTFIRTJFM0IwX09GRkxJTkUJKFJJX0UxIHwgUklfRTFIIHwgUklfRTIgfCBSSV9FM0IwIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTNFM0IwX09GRkxJTkUJKFJJX0UzIHwgUklfRTNCMCB8IFJJX09GRkxJTkUpCisjZGVmaW5lIFJJX0UxRTNFM0IwX09GRkxJTkUJKFJJX0UxIHwgUklfRTMgfCBSSV9FM0IwIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTFIRTNFM0IwX09GRkxJTkUJKFJJX0UxSCB8IFJJX0UzIHwgUklfRTNCMCB8IFJJX09GRkxJTkUpCisjZGVmaW5lIFJJX0UxRTFIRTNFM0IwX09GRkxJTkUJKFJJX0UxIHwgUklfRTFIIHwgUklfRTMgfCBSSV9FM0IwIHwgUklfT0ZGTElORSkKKyNkZWZpbmUgUklfRTJFM0UzQjBfT0ZGTElORQkoUklfRTIgfCBSSV9FMyB8IFJJX0UzQjAgfCBSSV9PRkZMSU5FKQorI2RlZmluZSBSSV9FMUUyRTNFM0IwX09GRkxJTkUJKFJJX0UxIHwgUklfRTIgfCBSSV9FMyB8IFJJX0UzQjAgfCBSSV9PRkZMSU5FKQorI2RlZmluZSBSSV9FMUhFMkUzRTNCMF9PRkZMSU5FCShSSV9FMUggfCBSSV9FMiB8IFJJX0UzIHwgUklfRTNCMCB8IFJJX09GRkxJTkUpCisjZGVmaW5lIFJJX0UxRTFIRTJFM0UzQjBfT0ZGTElORQlcCisJKFJJX0UxIHwgUklfRTFIIHwgUklfRTIgfCBSSV9FMyB8IFJJX0UzQjAgfCBSSV9PRkZMSU5FKQorI2RlZmluZSBSSV9BTExfT05MSU5FCQlSSV9FMUUxSEUyRTNFM0IwX09OTElORQorI2RlZmluZSBSSV9BTExfT0ZGTElORQkJUklfRTFFMUhFMkUzRTNCMF9PRkZMSU5FCisKKyNkZWZpbmUgREJHX0RNUF9UUkFDRV9CVUZGRVJfU0laRQkweDgwMAorI2RlZmluZSBEQkdfRE1QX1RSQUNFX0JVRkZFUl9PRkZTRVQoc2htZW0wX29mZnNldCkgXAorCSgoc2htZW0wX29mZnNldCkgLSBEQkdfRE1QX1RSQUNFX0JVRkZFUl9TSVpFKQogCiBzdHJ1Y3QgZHVtcF9zaWduIHsKIAl1MzIgdGltZV9zdGFtcDsKQEAgLTg2LDYyOCArMTQ2LDEwMTEgQEAKIAl1MTYgaW5mbzsKIH07CiAKLSNkZWZpbmUgUkVHU19DT1VOVAkJCTgzNAotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfYWRkciByZWdfYWRkcnNbUkVHU19DT1VOVF0gPSB7Ci0JeyAweDIwMDAsIDM0MSwgUklfQUxMX09OTElORSB9LCB7IDB4MjgwMCwgMTAzLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDMwMDAsIDI4NywgUklfQUxMX09OTElORSB9LCB7IDB4MzgwMCwgMzMxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDg4MDAsIDYsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDg4MTgsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHg5MDAwLCAxNjQsIFJJX0UyX09OTElORSB9LCB7IDB4OTQwMCwgMzMsIFJJX0UyX09OTElORSB9LAotCXsgMHhhMDAwLCAyNywgUklfQUxMX09OTElORSB9LCB7IDB4YTA2YywgMSwgUklfRTFFMUhfT05MSU5FIH0sCi0JeyAweGEwNzAsIDcxLCBSSV9BTExfT05MSU5FIH0sIHsgMHhhMThjLCA0LCBSSV9FMUUxSF9PTkxJTkUgfSwKLQl7IDB4YTE5YywgNjIsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGEyOTQsIDIsIFJJX0UxRTFIX09OTElORSB9LAotCXsgMHhhMjljLCA1NiwgUklfQUxMX09OTElORSB9LCB7IDB4YTM5YywgNywgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweGEzYzAsIDMsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4YTNkMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweGEzZDgsIDEsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4YTNlMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweGEzZTgsIDEsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4YTNmMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweGEzZjgsIDEsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4YTQwMCwgNDMsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4YTRhYywgMiwgUklfRTFFMUhfT05MSU5FIH0sIHsgMHhhNGI0LCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGE0YjgsIDIsIFJJX0UxRTFIX09OTElORSB9LCB7IDB4YTRjMCwgMywgUklfQUxMX09OTElORSB9LAotCXsgMHhhNGNjLCA1LCBSSV9FMUUxSF9PTkxJTkUgfSwgeyAweGE0ZTAsIDksIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4YTUwNCwgMSwgUklfRTFFMUhfT05MSU5FIH0sIHsgMHhhNTA4LCAzLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGE1MTgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGE1MjAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4YTUyOCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4YTUzMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHhhNTM4LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHhhNTQwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGE1NDgsIDEsIFJJX0UxRTFIX09OTElORSB9LCB7IDB4YTU1MCwgMSwgUklfRTFFMUhfT05MSU5FIH0sCi0JeyAweGE1NTgsIDEsIFJJX0UxRTFIX09OTElORSB9LCB7IDB4YTU2MCwgMSwgUklfRTFFMUhfT05MSU5FIH0sCi0JeyAweGE1NjgsIDEsIFJJX0UxRTFIX09OTElORSB9LCB7IDB4YTU3MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHhhNTgwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHhhNTkwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGE1YTAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGE1YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4YTVlMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHhhNWU4LCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4YTVmMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHhhNWY4LCAxMCwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweGE2MjAsIDExMSwgUklfRTJfT05MSU5FIH0sIHsgMHhhODAwLCA1MSwgUklfRTJfT05MSU5FIH0sCi0JeyAweGE4ZDQsIDQsIFJJX0UyX09OTElORSB9LCB7IDB4YThlOCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweGE4ZjAsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4MTAwMDAsIDIzNiwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMDQwMCwgNTcsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEwNGU4LCAyLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEwNGY0LCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMDUwMCwgMTQ2LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEwNzUwLCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMDc2MCwgMiwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMDc3MCwgMiwgUklfQUxMX09OTElORSB9LCB7IDB4MTA3ODAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTA3OTAsIDIsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEwN2EwLCAyLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEwN2IwLCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMDdjMCwgMiwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMDdkMCwgMiwgUklfQUxMX09OTElORSB9LCB7IDB4MTA3ZTAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTA4ODAsIDIsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEwOTAwLCAyLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDE2MDAwLCAyNiwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgxNjA3MCwgMTgsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgxNjBjMCwgMjcsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MTYxNDAsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgxNjE2MCwgMSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgxNjE4MCwgMiwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDE2MWMwLCAyLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDE2MjA0LCA1LCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MTgwMDAsIDEsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MTgwMDgsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgxODAxMCwgMzUsIFJJX0UyX09OTElORSB9LCB7IDB4MTgwYTQsIDIsIFJJX0UyX09OTElORSB9LAotCXsgMHgxODBjMCwgMTkxLCBSSV9FMl9PTkxJTkUgfSwgeyAweDE4NDQwLCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MTg0NjAsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4MTg0ODAsIDIsIFJJX0UyX09OTElORSB9LAotCXsgMHgxODRjMCwgMiwgUklfRTJfT05MSU5FIH0sIHsgMHgxODUwMCwgMTUsIFJJX0UyX09OTElORSB9LAotCXsgMHgyMDAwMCwgMjQsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIwMDYwLCA4LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIwMDgwLCA5NCwgUklfQUxMX09OTElORSB9LCB7IDB4MjAxZjgsIDEsIFJJX0UxRTFIX09OTElORSB9LAotCXsgMHgyMDFmYywgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MjAyMDAsIDEsIFJJX0UxRTFIX09OTElORSB9LAotCXsgMHgyMDIwNCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MjAyMDgsIDEsIFJJX0UxRTFIX09OTElORSB9LAotCXsgMHgyMDIwYywgMzksIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIwMmM4LCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MjAyZDgsIDQsIFJJX0UyX09OTElORSB9LCB7IDB4MjA0MDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MjA0MGMsIDgsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIwNDJjLCAxOCwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDIwNDgwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgyMDUwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMDYwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MjgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MjgwMDQsIDgxOTEsIFJJX0FMTF9PRkZMSU5FIH0sIHsgMHgzMDAwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMDAwNCwgMTYzODMsIFJJX0FMTF9PRkZMSU5FIH0sIHsgMHg0MDAwMCwgOTgsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4NDAxYTgsIDgsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4NDAxYzgsIDEsIFJJX0UxSF9PTkxJTkUgfSwKLQl7IDB4NDAxY2MsIDIsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4NDAxZDQsIDIsIFJJX0UyX09OTElORSB9LAotCXsgMHg0MDIwMCwgNCwgUklfQUxMX09OTElORSB9LCB7IDB4NDAyMjAsIDE4LCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4NDA0MDAsIDQzLCBSSV9BTExfT05MSU5FIH0sIHsgMHg0MDRjYywgMywgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDQwNGUwLCAxLCBSSV9FMl9PTkxJTkUgfSwgeyAweDQwNTAwLCAyLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDQwNTEwLCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHg0MDUyMCwgMiwgUklfQUxMX09OTElORSB9LAotCXsgMHg0MDUzMCwgMiwgUklfQUxMX09OTElORSB9LCB7IDB4NDA1NDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4NDA1NTAsIDEwLCBSSV9FMl9PTkxJTkUgfSwgeyAweDQwNjEwLCAyLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4NDIwMDAsIDE2NCwgUklfQUxMX09OTElORSB9LCB7IDB4NDIyYzAsIDQsIFJJX0UyX09OTElORSB9LAotCXsgMHg0MjJkNCwgNSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHg0MjJlOCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDQyNDAwLCA0OSwgUklfQUxMX09OTElORSB9LCB7IDB4NDI0YzgsIDM4LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDQyNTY4LCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHg0MjY0MCwgNSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDQyODAwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHg1MDAwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHg1MDAwNCwgMTksIFJJX0FMTF9PTkxJTkUgfSwgeyAweDUwMDUwLCA4LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDUwMDcwLCA4OCwgUklfQUxMX09OTElORSB9LCB7IDB4NTAxZjAsIDQsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHg1MDIwMCwgMiwgUklfQUxMX09OTElORSB9LCB7IDB4NTAyMGMsIDcsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4NTAyMjgsIDYsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4NTAyNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4NTAyODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDUwMzAwLCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4NTAzMGMsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4NTAzMTgsIDEsIFJJX0UyX09OTElORSB9LAotCXsgMHg1MDMxYywgMSwgUklfRTJfT05MSU5FIH0sIHsgMHg1MDMyMCwgMiwgUklfRTJfT05MSU5FIH0sCi0JeyAweDUyMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHg1NDAwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHg1NDAwNCwgMzMyNywgUklfQUxMX09GRkxJTkUgfSwgeyAweDU4MDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDU4MDA0LCA4MTkxLCBSSV9FMUUxSF9PRkZMSU5FIH0sIHsgMHg2MDAwMCwgMjYsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4NjAwNjgsIDgsIFJJX0UxRTFIX09OTElORSB9LCB7IDB4NjAwODgsIDEyLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDYwMGI4LCA5LCBSSV9FMUUxSF9PTkxJTkUgfSwgeyAweDYwMGRjLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDYwMGUwLCA1LCBSSV9FMUUxSF9PTkxJTkUgfSwgeyAweDYwMGY0LCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDYwMGY4LCAxLCBSSV9FMUUxSF9PTkxJTkUgfSwgeyAweDYwMGZjLCA4LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDYwMTNjLCAyNCwgUklfRTFIX09OTElORSB9LCB7IDB4NjAxOWMsIDIsIFJJX0UyX09OTElORSB9LAotCXsgMHg2MDFhYywgMTgsIFJJX0UyX09OTElORSB9LCB7IDB4NjAyMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4NjAyMDQsIDIsIFJJX0FMTF9PRkZMSU5FIH0sIHsgMHg2MDIxMCwgMTMsIFJJX0UyX09OTElORSB9LAotCXsgMHg2MTAwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4NjEwMDQsIDUxMSwgUklfQUxMX09GRkxJTkUgfSwKLQl7IDB4NzAwMDAsIDgsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDcwMDIwLCA4MTg0LCBSSV9BTExfT0ZGTElORSB9LAotCXsgMHg4NTAwMCwgMywgUklfQUxMX09OTElORSB9LCB7IDB4ODUwMWMsIDcsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4ODUwNDgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDg1MjAwLCAzMiwgUklfQUxMX09OTElORSB9LAotCXsgMHhjMTAwMCwgNywgUklfQUxMX09OTElORSB9LCB7IDB4YzEwM2MsIDIsIFJJX0UyX09OTElORSB9LAotCXsgMHhjMTgwMCwgMiwgUklfQUxMX09OTElORSB9LCB7IDB4YzIwMDAsIDE2NCwgUklfQUxMX09OTElORSB9LAotCXsgMHhjMjJjMCwgNSwgUklfRTJfT05MSU5FIH0sIHsgMHhjMjJkOCwgNCwgUklfRTJfT05MSU5FIH0sCi0JeyAweGMyNDAwLCA0OSwgUklfQUxMX09OTElORSB9LCB7IDB4YzI0YzgsIDM4LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGMyNTY4LCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHhjMjYwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHhjNDAwMCwgMTY1LCBSSV9BTExfT05MSU5FIH0sIHsgMHhjNDJkOCwgMiwgUklfRTJfT05MSU5FIH0sCi0JeyAweGM0MmUwLCA3LCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweGM0MmZjLCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4YzQ0MDAsIDUxLCBSSV9BTExfT05MSU5FIH0sIHsgMHhjNDRkMCwgMzgsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4YzQ1NzAsIDIsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGM0NTc4LCA1LCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4YzQ2MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGQwMDAwLCAxOSwgUklfQUxMX09OTElORSB9LAotCXsgMHhkMDA0YywgOCwgUklfQUxMX09OTElORSB9LCB7IDB4ZDAwNmMsIDkxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGQwMWZjLCAxLCBSSV9FMl9PTkxJTkUgfSwgeyAweGQwMjAwLCAyLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGQwMjBjLCA3LCBSSV9BTExfT05MSU5FIH0sIHsgMHhkMDIyOCwgMTgsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHhkMDI4MCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4ZDAzMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4ZDA0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGQ0MDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGQ0MDA0LCAyNTU5LCBSSV9BTExfT0ZGTElORSB9LCB7IDB4ZDgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4ZDgwMDQsIDgxOTEsIFJJX0FMTF9PRkZMSU5FIH0sIHsgMHhlMDAwMCwgMjEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4ZTAwNTQsIDgsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGUwMDc0LCA0OSwgUklfQUxMX09OTElORSB9LAotCXsgMHhlMDEzOCwgMSwgUklfRTFFMUhfT05MSU5FIH0sIHsgMHhlMDEzYywgMzUsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4ZTAxZjQsIDIsIFJJX0UyX09OTElORSB9LCB7IDB4ZTAyMDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4ZTAyMGMsIDgsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGUwMjJjLCAxOCwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweGUwMjgwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHhlMDMwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHhlMTAwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4ZTIwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4ZTIwMDQsIDIwNDcsIFJJX0FMTF9PRkZMSU5FIH0sIHsgMHhmMDAwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHhmMDAwNCwgMTYzODMsIFJJX0FMTF9PRkZMSU5FIH0sIHsgMHgxMDEwMDAsIDEyLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEwMTA1MCwgMSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgxMDEwNTQsIDMsIFJJX0UyX09OTElORSB9LAotCXsgMHgxMDExMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEwMTgwMCwgOCwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMDIwMDAsIDE4LCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMDIwNjgsIDYsIFJJX0UyX09OTElORSB9LAotCXsgMHgxMDIwODAsIDE3LCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMDIwYzgsIDgsIFJJX0UxSF9PTkxJTkUgfSwKLQl7IDB4MTAyMGU4LCA5LCBSSV9FMl9PTkxJTkUgfSwgeyAweDEwMjQwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMDMwMDAsIDI2LCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMDMwOTgsIDUsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgxMDMwYWMsIDEwLCBSSV9FMl9PTkxJTkUgfSwgeyAweDEwMzBkOCwgOCwgUklfRTJfT05MSU5FIH0sCi0JeyAweDEwMzQwMCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHgxMDM0MDQsIDEzNSwgUklfRTJfT0ZGTElORSB9LAotCXsgMHgxMDM4MDAsIDgsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEwNDAwMCwgNjMsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTA0MTFjLCAxNiwgUklfRTJfT05MSU5FIH0sIHsgMHgxMDQyMDAsIDE3LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEwNDQwMCwgNjQsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEwNDUwMCwgMTkyLCBSSV9BTExfT0ZGTElORSB9LAotCXsgMHgxMDQ4MDAsIDY0LCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMDQ5MDAsIDE5MiwgUklfQUxMX09GRkxJTkUgfSwKLQl7IDB4MTA1MDAwLCAyNTYsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEwNTQwMCwgNzY4LCBSSV9BTExfT0ZGTElORSB9LAotCXsgMHgxMDcwMDAsIDcsIFJJX0UyX09OTElORSB9LCB7IDB4MTA4MDAwLCAzMywgUklfRTFFMUhfT05MSU5FIH0sCi0JeyAweDEwODBhYywgNSwgUklfRTFIX09OTElORSB9LCB7IDB4MTA4MTAwLCA1LCBSSV9FMUUxSF9PTkxJTkUgfSwKLQl7IDB4MTA4MTIwLCA1LCBSSV9FMUUxSF9PTkxJTkUgfSwgeyAweDEwODIwMCwgNzQsIFJJX0UxRTFIX09OTElORSB9LAotCXsgMHgxMDg0MDAsIDc0LCBSSV9FMUUxSF9PTkxJTkUgfSwgeyAweDEwODgwMCwgMTUyLCBSSV9FMUUxSF9PTkxJTkUgfSwKLQl7IDB4MTEwMDAwLCAxMTEsIFJJX0UyX09OTElORSB9LCB7IDB4MTEwMjAwLCA0LCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MTIwMDAwLCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjAwMDgsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTIwMDE4LCAzLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjAwMjQsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTIwMDM0LCAzLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjAwNDAsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTIwMDUwLCAzLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjAwNWMsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTIwMDZjLCAzLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjAwNzgsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTIwMDg4LCAzLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjAwOTQsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTIwMGE0LCAzLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjAwYjAsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTIwMGMwLCAzLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjAwY2MsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTIwMGRjLCAzLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjAwZTgsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTIwMGY4LCAzLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjAxMDQsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTIwMTE0LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjAxMTgsIDIyLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEyMDE3MCwgMiwgUklfRTFFMUhfT05MSU5FIH0sIHsgMHgxMjAxNzgsIDI0MywgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA1NDQsIDQsIFJJX0UxRTFIX09OTElORSB9LCB7IDB4MTIwNTU0LCA3LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEyMDU5YywgNiwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgxMjA1YjQsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgxMjA1YjgsIDE2LCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDEyMDVmOCwgNCwgUklfRTJfT05MSU5FIH0sCi0JeyAweDEyMDYxOCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHgxMjA2MWMsIDIwLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MTIwNjZjLCAxMSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgxMjA2OTgsIDUsIFJJX0UyX09OTElORSB9LAotCXsgMHgxMjA2YjAsIDc2LCBSSV9FMl9PTkxJTkUgfSwgeyAweDEyMDdmYywgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDEyMDgwOCwgNjYsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDkxMCwgNywgUklfRTJfT05MSU5FIH0sCi0JeyAweDEyMDkzMCwgOSwgUklfRTJfT05MSU5FIH0sIHsgMHgxMjBhMDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTIyMDAwLCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxMjIwMDgsIDIwNDYsIFJJX0UxX09GRkxJTkUgfSwKLQl7IDB4MTI4MDAwLCAyLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDEyODAwOCwgNjE0MiwgUklfRTFIRTJfT0ZGTElORSB9LAotCXsgMHgxMzAwMDAsIDM1LCBSSV9FMl9PTkxJTkUgfSwgeyAweDEzMDEwMCwgMjksIFJJX0UyX09OTElORSB9LAotCXsgMHgxMzAxODAsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4MTMwMjAwLCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MTMwMjgwLCAxLCBSSV9FMl9PTkxJTkUgfSwgeyAweDEzMDMwMCwgNSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDEzMDM4MCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHgxMzA0MDAsIDEsIFJJX0UyX09OTElORSB9LAotCXsgMHgxMzA0ODAsIDUsIFJJX0UyX09OTElORSB9LCB7IDB4MTMwODAwLCA3MiwgUklfRTJfT05MSU5FIH0sCi0JeyAweDEzMTAwMCwgMTM2LCBSSV9FMl9PTkxJTkUgfSwgeyAweDEzMjAwMCwgMTQ4LCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MTM0MDAwLCA1NDQsIFJJX0UyX09OTElORSB9LCB7IDB4MTQwMDAwLCA2NCwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNDAxMDAsIDUsIFJJX0UxRTFIX09OTElORSB9LCB7IDB4MTQwMTE0LCA0NSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNDAyMDAsIDYsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE0MDIyMCwgNCwgUklfRTJfT05MSU5FIH0sCi0JeyAweDE0MDI0MCwgNCwgUklfRTJfT05MSU5FIH0sIHsgMHgxNDAyNjAsIDQsIFJJX0UyX09OTElORSB9LAotCXsgMHgxNDAyODAsIDQsIFJJX0UyX09OTElORSB9LCB7IDB4MTQwMmEwLCA0LCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MTQwMmMwLCA0LCBSSV9FMl9PTkxJTkUgfSwgeyAweDE0MDJlMCwgMTMsIFJJX0UyX09OTElORSB9LAotCXsgMHgxNDQwMDAsIDQsIFJJX0UxRTFIX09OTElORSB9LCB7IDB4MTQ4MDAwLCA0LCBSSV9FMUUxSF9PTkxJTkUgfSwKLQl7IDB4MTRjMDAwLCA0LCBSSV9FMUUxSF9PTkxJTkUgfSwgeyAweDE1MDAwMCwgNCwgUklfRTFFMUhfT05MSU5FIH0sCi0JeyAweDE1NDAwMCwgNCwgUklfRTFFMUhfT05MSU5FIH0sIHsgMHgxNTgwMDAsIDQsIFJJX0UxRTFIX09OTElORSB9LAotCXsgMHgxNWMwMDAsIDIsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MTVjMDA4LCA1LCBSSV9FMUhfT05MSU5FIH0sCi0JeyAweDE1YzAyMCwgMjcsIFJJX0UyX09OTElORSB9LCB7IDB4MTVjMDkwLCAxMywgUklfRTJfT05MSU5FIH0sCi0JeyAweDE1YzBjOCwgMzQsIFJJX0UyX09OTElORSB9LCB7IDB4MTYxMDAwLCA3LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDE2MTAzYywgMiwgUklfRTJfT05MSU5FIH0sIHsgMHgxNjE4MDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTY0MDAwLCA2MCwgUklfQUxMX09OTElORSB9LCB7IDB4MTY0MTEwLCAyLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MTY0MTE4LCAxNSwgUklfRTJfT05MSU5FIH0sIHsgMHgxNjQyMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTY0MjA4LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxNjQyMTAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTY0MjE4LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxNjQyMjAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTY0MjI4LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxNjQyMzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTY0MjM4LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxNjQyNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTY0MjQ4LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxNjQyNTAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTY0MjU4LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxNjQyNjAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTY0MjcwLCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxNjQyODAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTY0ODAwLCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxNjUwMDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTY2MDAwLCAxNjQsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2NjJjYywgNywgUklfRTJfT05MSU5FIH0sCi0JeyAweDE2NjQwMCwgNDksIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2NjRjOCwgMzgsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTY2NTY4LCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxNjY1NzAsIDUsIFJJX0UyX09OTElORSB9LAotCXsgMHgxNjY4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2ODAwMCwgMTM3LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDE2ODIyNCwgMiwgUklfRTFFMUhfT05MSU5FIH0sIHsgMHgxNjgyMmMsIDI5LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDE2ODJhMCwgMTIsIFJJX0UxRTFIX09OTElORSB9LCB7IDB4MTY4MmQwLCAxMiwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjgzMDAsIDIsIFJJX0UxRTFIX09OTElORSB9LCB7IDB4MTY4MzA4LCA2OCwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjg0MTgsIDIsIFJJX0UxRTFIX09OTElORSB9LCB7IDB4MTY4NDIwLCA2LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDE2ODgwMCwgMTksIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2ODkwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjhhMDAsIDEyOCwgUklfQUxMX09OTElORSB9LCB7IDB4MTZhMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDE2YTAwNCwgMTUzNSwgUklfQUxMX09GRkxJTkUgfSwgeyAweDE2YzAwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNmMwMDQsIDE1MzUsIFJJX0FMTF9PRkZMSU5FIH0sIHsgMHgxNmUwMDAsIDE2LCBSSV9FMUhfT05MSU5FIH0sCi0JeyAweDE2ZTA0MCwgOCwgUklfRTJfT05MSU5FIH0sIHsgMHgxNmUxMDAsIDEsIFJJX0UxSF9PTkxJTkUgfSwKLQl7IDB4MTZlMjAwLCAyLCBSSV9FMUhfT05MSU5FIH0sIHsgMHgxNmU0MDAsIDE2MSwgUklfRTFIX09OTElORSB9LAotCXsgMHgxNmU2ODQsIDIsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MTZlNjhjLCAxMiwgUklfRTFIX09OTElORSB9LAotCXsgMHgxNmU2YmMsIDQsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MTZlNmNjLCA0LCBSSV9FMUhfT05MSU5FIH0sCi0JeyAweDE2ZTZlMCwgMTIsIFJJX0UyX09OTElORSB9LCB7IDB4MTZlNzY4LCAxNywgUklfRTJfT05MSU5FIH0sCi0JeyAweDE3MDAwMCwgMjQsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE3MDA2MCwgNCwgUklfRTFFMUhfT05MSU5FIH0sCi0JeyAweDE3MDA3MCwgNjUsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE3MDE5NCwgMTEsIFJJX0UyX09OTElORSB9LAotCXsgMHgxNzAxYzQsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4MTcwMWNjLCA3LCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MTcwMWVjLCAxLCBSSV9FMl9PTkxJTkUgfSwgeyAweDE3MDFmNCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDE3MDIwMCwgNCwgUklfQUxMX09OTElORSB9LCB7IDB4MTcwMjE0LCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDE3MDIxOCwgNzcsIFJJX0UyX09OTElORSB9LCB7IDB4MTcwNDAwLCA2NCwgUklfRTJfT05MSU5FIH0sCi0JeyAweDE3ODAwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MTgwMDAwLCA2MSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxODAxM2MsIDIsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MTgwMjAwLCA1OCwgUklfQUxMX09OTElORSB9LAotCXsgMHgxODAzNDAsIDQsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE4MDM4MCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDE4MDM4OCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHgxODAzOTAsIDEsIFJJX0UyX09OTElORSB9LAotCXsgMHgxODAzOTgsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4MTgwM2EwLCA1LCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MTgwNDAwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxODA0MDQsIDI1NSwgUklfRTFFMUhfT0ZGTElORSB9LAotCXsgMHgxODEwMDAsIDQsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE4MTAxMCwgMTAyMCwgUklfQUxMX09GRkxJTkUgfSwKLQl7IDB4MWEwMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxYTAwMDQsIDU2MzEsIFJJX0FMTF9PRkZMSU5FIH0sCi0JeyAweDFhNTgwMCwgMjU2MCwgUklfRTFIRTJfT0ZGTElORSB9LCB7IDB4MWE4MDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDFhODAwNCwgODE5MSwgUklfRTFIRTJfT0ZGTElORSB9LCB7IDB4MWIwMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDFiMDAwNCwgMTUsIFJJX0UxSF9PRkZMSU5FIH0sIHsgMHgxYjAwNDAsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgxYjAwNDQsIDIzOSwgUklfRTFIX09GRkxJTkUgfSwgeyAweDFiMDQwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjA0MDQsIDI1NSwgUklfRTFIX09GRkxJTkUgfSwgeyAweDFiMDgwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjA4NDAsIDEsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MWIwYzAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDFiMTAwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MWIxMDQwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MWIxNDAwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxYjE0NDAsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgxYjE0ODAsIDEsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MWIxNGMwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MWIxODAwLCAxMjgsIFJJX0FMTF9PRkZMSU5FIH0sIHsgMHgxYjFjMDAsIDEyOCwgUklfQUxMX09GRkxJTkUgfSwKLQl7IDB4MWIyMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgxYjI0MDAsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgxYjI0MDQsIDU2MzEsIFJJX0UyX09GRkxJTkUgfSwgeyAweDFiODAwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjgwNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODA4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjgwYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODEwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjgxNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODE4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjgxYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODIwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjgyNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODI4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjgyYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODMwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjgzNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODM4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjgzYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODQwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjg0NDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODQ4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjg0YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODUwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjg1NDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODU4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjg1YzAsIDE5LCBSSV9FMl9PTkxJTkUgfSwgeyAweDFiODgwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjg4NDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODg4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjg4YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODkwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjg5NDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODk4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjg5YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiOGEwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjhhNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiOGE4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjhhYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiOGIwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjhiNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiOGI4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjhiYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiOGMwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjhjNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiOGM4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjhjYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiOGNjNCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDFiOGQwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MWI4ZDQwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDFiOGQ4MCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MWI4ZGMwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDFiOGUwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MWI4ZTQwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDFiOGU4MCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MWI4ZTg0LCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MWI4ZWMwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDFiOGYwMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDFiOGY0MCwgMSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgxYjhmODAsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgxYjhmYzAsIDEsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MWI4ZmM0LCAyLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MWI4ZmQwLCA2LCBSSV9FMl9PTkxJTkUgfSwgeyAweDFiOTAwMCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDFiOTA0MCwgMywgUklfRTJfT05MSU5FIH0sIHsgMHgxYjk0MDAsIDE0LCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MWI5NDNjLCAxOSwgUklfRTJfT05MSU5FIH0sIHsgMHgxYjk0OTAsIDEwLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MWMwMDAwLCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHgyMDAwMDAsIDY1LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIwMDE0YywgMiwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgyMDAyMDAsIDU4LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIwMDM0MCwgNCwgUklfQUxMX09OTElORSB9LCB7IDB4MjAwMzgwLCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MjAwMzg4LCAxLCBSSV9FMl9PTkxJTkUgfSwgeyAweDIwMDM5MCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDIwMDM5OCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHgyMDAzYTAsIDEsIFJJX0UyX09OTElORSB9LAotCXsgMHgyMDAzYTgsIDIsIFJJX0UyX09OTElORSB9LCB7IDB4MjAwNDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIwMDQwNCwgMjU1LCBSSV9FMUUxSF9PRkZMSU5FIH0sIHsgMHgyMDIwMDAsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MjAyMDEwLCAyMDQ0LCBSSV9BTExfT0ZGTElORSB9LCB7IDB4MjIwMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIyMDAwNCwgNTYzMSwgUklfQUxMX09GRkxJTkUgfSwgeyAweDIyNTgwMCwgMjU2MCwgUklfRTFIRTJfT0ZGTElORX0sCi0JeyAweDIyODAwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MjI4MDA0LCA4MTkxLCBSSV9FMUhFMl9PRkZMSU5FIH0sCi0JeyAweDIzMDAwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MjMwMDA0LCAxNSwgUklfRTFIX09GRkxJTkUgfSwKLQl7IDB4MjMwMDQwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDIzMDA0NCwgMjM5LCBSSV9FMUhfT0ZGTElORSB9LAotCXsgMHgyMzA0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzMDQwNCwgMjU1LCBSSV9FMUhfT0ZGTElORSB9LAotCXsgMHgyMzA4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzMDg0MCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDIzMGMwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MjMxMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIzMTA0MCwgMSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgyMzE0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MjMxNDQwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDIzMTQ4MCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDIzMTRjMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgyMzE4MDAsIDEyOCwgUklfQUxMX09GRkxJTkUgfSwKLQl7IDB4MjMxYzAwLCAxMjgsIFJJX0FMTF9PRkZMSU5FIH0sIHsgMHgyMzIwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MjMyNDAwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDIzMjQwNCwgNTYzMSwgUklfRTJfT0ZGTElORSB9LAotCXsgMHgyMzgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODA0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzgwODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODBjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzgxMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODE0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzgxODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODFjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzgyMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODI0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzgyODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODJjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzgzMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODM0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzgzODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODNjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzg0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODQ0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzg0ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODRjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzg1MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODU0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzg1ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODVjMCwgMTksIFJJX0UyX09OTElORSB9LAotCXsgMHgyMzg4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODg0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzg4ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODhjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzg5MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODk0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzg5ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODljMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzhhMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzOGE0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzhhODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzOGFjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzhiMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzOGI0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzhiODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzOGJjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzhjMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzOGM0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzhjODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzOGNjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzhjYzQsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4MjM4ZDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIzOGQ0MCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MjM4ZDgwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIzOGRjMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MjM4ZTAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIzOGU0MCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MjM4ZTgwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIzOGU4NCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHgyMzhlYzAsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgyMzhmMDAsIDEsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MjM4ZjQwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MjM4ZjgwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDIzOGZjMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDIzOGZjNCwgMiwgUklfRTJfT05MSU5FIH0sIHsgMHgyMzhmZDAsIDYsIFJJX0UyX09OTElORSB9LAotCXsgMHgyMzkwMDAsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4MjM5MDQwLCAzLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MjQwMDAwLCAyLCBSSV9BTExfT05MSU5FIH0sIHsgMHgyODAwMDAsIDY1LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDI4MDE0YywgMiwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgyODAyMDAsIDU4LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDI4MDM0MCwgNCwgUklfQUxMX09OTElORSB9LCB7IDB4MjgwMzgwLCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MjgwMzg4LCAxLCBSSV9FMl9PTkxJTkUgfSwgeyAweDI4MDM5MCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDI4MDM5OCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHgyODAzYTAsIDEsIFJJX0UyX09OTElORSB9LAotCXsgMHgyODAzYTgsIDIsIFJJX0UyX09OTElORSB9LCB7IDB4MjgwNDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDI4MDQwNCwgMjU1LCBSSV9FMUUxSF9PRkZMSU5FIH0sIHsgMHgyODIwMDAsIDQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MjgyMDEwLCAyMDQ0LCBSSV9BTExfT0ZGTElORSB9LCB7IDB4MmEwMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDJhMDAwNCwgNTYzMSwgUklfQUxMX09GRkxJTkUgfSwgeyAweDJhNTgwMCwgMjU2MCwgUklfRTFIRTJfT0ZGTElORX0sCi0JeyAweDJhODAwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MmE4MDA0LCA4MTkxLCBSSV9FMUhFMl9PRkZMSU5FIH0sCi0JeyAweDJiMDAwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MmIwMDA0LCAxNSwgUklfRTFIX09GRkxJTkUgfSwKLQl7IDB4MmIwMDQwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDJiMDA0NCwgMjM5LCBSSV9FMUhfT0ZGTElORSB9LAotCXsgMHgyYjA0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiMDQwNCwgMjU1LCBSSV9FMUhfT0ZGTElORSB9LAotCXsgMHgyYjA4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiMDg0MCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDJiMGMwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MmIxMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDJiMTA0MCwgMSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgyYjE0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MmIxNDQwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDJiMTQ4MCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDJiMTRjMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgyYjE4MDAsIDEyOCwgUklfQUxMX09GRkxJTkUgfSwKLQl7IDB4MmIxYzAwLCAxMjgsIFJJX0FMTF9PRkZMSU5FIH0sIHsgMHgyYjIwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MmIyNDAwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDJiMjQwNCwgNTYzMSwgUklfRTJfT0ZGTElORSB9LAotCXsgMHgyYjgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODA0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjgwODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODBjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjgxMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODE0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjgxODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODFjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjgyMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODI0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjgyODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODJjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjgzMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODM0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjgzODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODNjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjg0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODQ0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjg0ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODRjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjg1MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODU0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjg1ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODVjMCwgMTksIFJJX0UyX09OTElORSB9LAotCXsgMHgyYjg4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODg0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjg4ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODhjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjg5MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODk0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjg5ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODljMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjhhMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiOGE0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjhhODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiOGFjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjhiMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiOGI0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjhiODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiOGJjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjhjMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiOGM0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjhjODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiOGNjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjhjYzQsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4MmI4ZDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDJiOGQ0MCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MmI4ZDgwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDJiOGRjMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MmI4ZTAwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDJiOGU0MCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MmI4ZTgwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDJiOGU4NCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHgyYjhlYzAsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgyYjhmMDAsIDEsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MmI4ZjQwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MmI4ZjgwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDJiOGZjMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDJiOGZjNCwgMiwgUklfRTJfT05MSU5FIH0sIHsgMHgyYjhmZDAsIDYsIFJJX0UyX09OTElORSB9LAotCXsgMHgyYjkwMDAsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4MmI5MDQwLCAzLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MmI5NDAwLCAxNCwgUklfRTJfT05MSU5FIH0sIHsgMHgyYjk0M2MsIDE5LCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MmI5NDkwLCAxMCwgUklfRTJfT05MSU5FIH0sIHsgMHgyYzAwMDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzAwMDAwLCA2NSwgUklfQUxMX09OTElORSB9LCB7IDB4MzAwMTRjLCAyLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MzAwMjAwLCA1OCwgUklfQUxMX09OTElORSB9LCB7IDB4MzAwMzQwLCA0LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDMwMDM4MCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHgzMDAzODgsIDEsIFJJX0UyX09OTElORSB9LAotCXsgMHgzMDAzOTAsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4MzAwMzk4LCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MzAwM2EwLCAxLCBSSV9FMl9PTkxJTkUgfSwgeyAweDMwMDNhOCwgMiwgUklfRTJfT05MSU5FIH0sCi0JeyAweDMwMDQwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MzAwNDA0LCAyNTUsIFJJX0UxRTFIX09GRkxJTkUgfSwKLQl7IDB4MzAyMDAwLCA0LCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMDIwMTAsIDIwNDQsIFJJX0FMTF9PRkZMSU5FIH0sCi0JeyAweDMyMDAwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MzIwMDA0LCA1NjMxLCBSSV9BTExfT0ZGTElORSB9LAotCXsgMHgzMjU4MDAsIDI1NjAsIFJJX0UxSEUyX09GRkxJTkUgfSwgeyAweDMyODAwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMjgwMDQsIDgxOTEsIFJJX0UxSEUyX09GRkxJTkUgfSwgeyAweDMzMDAwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMzAwMDQsIDE1LCBSSV9FMUhfT0ZGTElORSB9LCB7IDB4MzMwMDQwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MzMwMDQ0LCAyMzksIFJJX0UxSF9PRkZMSU5FIH0sIHsgMHgzMzA0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzMwNDA0LCAyNTUsIFJJX0UxSF9PRkZMSU5FIH0sIHsgMHgzMzA4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzMwODQwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDMzMGMwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMzEwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDMzMTA0MCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDMzMTQwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MzMxNDQwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MzMxNDgwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDMzMTRjMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sCi0JeyAweDMzMTgwMCwgMTI4LCBSSV9BTExfT0ZGTElORSB9LCB7IDB4MzMxYzAwLCAxMjgsIFJJX0FMTF9PRkZMSU5FIH0sCi0JeyAweDMzMjAwMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MzMyNDAwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MzMyNDA0LCA1NjMxLCBSSV9FMl9PRkZMSU5FIH0sIHsgMHgzMzgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4MDQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzgwODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4MGMwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzgxMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4MTQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzgxODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4MWMwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzgyMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4MjQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzgyODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4MmMwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzgzMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4MzQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzgzODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4M2MwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzg0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4NDQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzg0ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4NGMwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzg1MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4NTQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzg1ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4NWMwLCAxOSwgUklfRTJfT05MSU5FIH0sIHsgMHgzMzg4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4ODQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzg4ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4OGMwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzg5MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4OTQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzg5ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4OWMwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzhhMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4YTQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzhhODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4YWMwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzhiMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4YjQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzhiODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4YmMwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzhjMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4YzQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzhjODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MzM4Y2MwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgzMzhjYzQsIDEsIFJJX0UyX09OTElORSB9LAotCXsgMHgzMzhkMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDMzOGQ0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMzhkODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDMzOGRjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMzhlMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDMzOGU0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMzhlODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDMzOGU4NCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDMzOGVjMCwgMSwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgzMzhmMDAsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHgzMzhmNDAsIDEsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MzM4ZjgwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwKLQl7IDB4MzM4ZmMwLCAxLCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweDMzOGZjNCwgMiwgUklfRTJfT05MSU5FIH0sCi0JeyAweDMzOGZkMCwgNiwgUklfRTJfT05MSU5FIH0sIHsgMHgzMzkwMDAsIDEsIFJJX0UyX09OTElORSB9LAotCXsgMHgzMzkwNDAsIDMsIFJJX0UyX09OTElORSB9LCB7IDB4MzQwMDAwLCAyLCBSSV9BTExfT05MSU5FIH0sCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19hZGRyIHJlZ19hZGRyc1tdID0geworCXsgMHgyMDAwLCAzNDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjgwMCwgMTAzLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMwMDAsIDI4NywgUklfQUxMX09OTElORSB9LAorCXsgMHgzODAwLCAzMzEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4ODgwMCwgNiwgUklfQUxMX09OTElORSB9LAorCXsgMHg4ODE4LCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4OTAwMCwgMTQ3LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4OTI0YywgMSwgUklfRTJfT05MSU5FIH0sCisJeyAweDkyNTAsIDE2LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4OTQwMCwgMzMsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHg5NDg0LCA1LCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweGEwMDAsIDI3LCBSSV9BTExfT05MSU5FIH0sCisJeyAweGEwNmMsIDEsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHhhMDcwLCA3MSwgUklfQUxMX09OTElORSB9LAorCXsgMHhhMThjLCA0LCBSSV9FMUUxSF9PTkxJTkUgfSwKKwl7IDB4YTE5YywgNjIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YTI5NCwgMiwgUklfRTFFMUhfT05MSU5FIH0sCisJeyAweGEyOWMsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YTJhNCwgMiwgUklfRTFFMUhFMl9PTkxJTkUgfSwKKwl7IDB4YTJhYywgNTIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YTM5YywgNywgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGEzYjgsIDIsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YTNjMCwgMywgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGEzZDAsIDEsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHhhM2Q4LCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YTNlMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGEzZTgsIDEsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHhhM2YwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YTNmOCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGE0MDAsIDQwLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGE0YTAsIDEsIFJJX0UxRTFIRTJfT05MSU5FIH0sCisJeyAweGE0YTQsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YTRhYywgMiwgUklfRTFFMUhfT05MSU5FIH0sCisJeyAweGE0YjQsIDEsIFJJX0UxRTFIRTJfT05MSU5FIH0sCisJeyAweGE0YjgsIDIsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHhhNGMwLCAzLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGE0Y2MsIDUsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHhhNGUwLCAzLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGE0ZmMsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YTUwNCwgMSwgUklfRTFFMUhfT05MSU5FIH0sCisJeyAweGE1MDgsIDMsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YTUxOCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHhhNTIwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGE1MjgsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YTUzMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHhhNTM4LCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGE1NDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YTU0OCwgMSwgUklfRTFFMUhfT05MSU5FIH0sCisJeyAweGE1NTAsIDEsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHhhNTU4LCAxLCBSSV9FMUUxSF9PTkxJTkUgfSwKKwl7IDB4YTU2MCwgMSwgUklfRTFFMUhfT05MSU5FIH0sCisJeyAweGE1NjgsIDEsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHhhNTcwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGE1ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YTU5MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHhhNWEwLCAxLCBSSV9FMUUxSEUyX09OTElORSB9LAorCXsgMHhhNWMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGE1ZTAsIDEsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHhhNWU4LCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YTVmMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGE1ZjgsIDEsIFJJX0UxSEUyX09OTElORSB9LAorCXsgMHhhNWZjLCA5LCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YTYyMCwgNiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGE2MzgsIDIwLCBSSV9FMl9PTkxJTkUgfSwKKwl7IDB4YTY4OCwgNDIsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHhhNzMwLCAxLCBSSV9FMl9PTkxJTkUgfSwKKwl7IDB4YTczNCwgMiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGE3M2MsIDQsIFJJX0UyX09OTElORSB9LAorCXsgMHhhNzRjLCA1LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YTc2MCwgNSwgUklfRTJfT05MSU5FIH0sCisJeyAweGE3NzQsIDcsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHhhNzkwLCAxNSwgUklfRTJfT05MSU5FIH0sCisJeyAweGE3Y2MsIDQsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHhhN2UwLCA2LCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweGE4MDAsIDE4LCBSSV9FMl9PTkxJTkUgfSwKKwl7IDB4YTg0OCwgMzMsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHhhOGNjLCAyLCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweGE4ZDQsIDQsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHhhOGU0LCAxLCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweGE4ZTgsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHhhOGYwLCAxLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YThmOCwgMzAsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YTk3NCwgNzMsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YWMzMCwgMSwgUklfRTNFM0IwX09OTElORSB9LAorCXsgMHhhYzQwLCAxLCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweGFjNTAsIDEsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YWM2MCwgMSwgUklfRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTAwMDAsIDksIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTAwMjQsIDEsIFJJX0UxRTFIRTJfT05MSU5FIH0sCisJeyAweDEwMDI4LCA1LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEwMDNjLCA2LCBSSV9FMUUxSEUyX09OTElORSB9LAorCXsgMHgxMDA1NCwgMjAsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTAwYTQsIDQsIFJJX0UxRTFIRTJfT05MSU5FIH0sCisJeyAweDEwMGI0LCAxMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDBlMCwgNCwgUklfRTFFMUhFMl9PTkxJTkUgfSwKKwl7IDB4MTAwZjAsIDgsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTAxMTAsIDYsIFJJX0UxRTFIRTJfT05MSU5FIH0sCisJeyAweDEwMTI4LCAxMTAsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTAyZTAsIDQsIFJJX0UxRTFIRTJfT05MSU5FIH0sCisJeyAweDEwMmYwLCAxOCwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDMzOCwgMjAsIFJJX0UxRTFIRTJfT05MSU5FIH0sCisJeyAweDEwMzg4LCAxMCwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDQwMCwgNiwgUklfRTFFMUhFMl9PTkxJTkUgfSwKKwl7IDB4MTA0MTgsIDYsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTA0MzAsIDEwLCBSSV9FMUUxSEUyX09OTElORSB9LAorCXsgMHgxMDQ1OCwgMjIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTA0YjAsIDEyLCBSSV9FMUUxSEUyX09OTElORSB9LAorCXsgMHgxMDRlMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDRlOCwgMiwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDRmNCwgMiwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDUwMCwgMTQ2LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEwNzUwLCAyLCBSSV9FMUUxSEUyX09OTElORSB9LAorCXsgMHgxMDc2MCwgMiwgUklfRTFFMUhFMl9PTkxJTkUgfSwKKwl7IDB4MTA3NzAsIDIsIFJJX0UxRTFIRTJfT05MSU5FIH0sCisJeyAweDEwNzgwLCAyLCBSSV9FMUUxSEUyX09OTElORSB9LAorCXsgMHgxMDc5MCwgMiwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDdhMCwgMiwgUklfRTFFMUhFMl9PTkxJTkUgfSwKKwl7IDB4MTA3YjAsIDIsIFJJX0UxRTFIRTJfT05MSU5FIH0sCisJeyAweDEwN2MwLCAyLCBSSV9FMUUxSEUyX09OTElORSB9LAorCXsgMHgxMDdkMCwgMiwgUklfRTFFMUhFMl9PTkxJTkUgfSwKKwl7IDB4MTA3ZTAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTA4ODAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTA5MDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTYwMDAsIDEsIFJJX0UxSEUyX09OTElORSB9LAorCXsgMHgxNjAwNCwgMjUsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNjA3MCwgOCwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE2MDkwLCA0LCBSSV9FMUhFMkUzX09OTElORSB9LAorCXsgMHgxNjBhMCwgNiwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE2MGMwLCA3LCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTYwZGMsIDIsIFJJX0UxSEUyX09OTElORSB9LAorCXsgMHgxNjBlNCwgMTAsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNjEwYywgMiwgUklfRTFIRTJfT05MSU5FIH0sCisJeyAweDE2MTE0LCA2LCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTYxNDAsIDQ4LCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTYyMDQsIDUsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgxODAwMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE4MDA4LCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTgwMTAsIDM1LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTgwYTQsIDIsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxODBjMCwgOSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE4MGU0LCAxLCBSSV9FMkUzX09OTElORSB9LAorCXsgMHgxODBlOCwgMiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE4MGYwLCAxLCBSSV9FMkUzX09OTElORSB9LAorCXsgMHgxODBmNCwgNzksIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxODIzMCwgMSwgUklfRTJFM19PTkxJTkUgfSwKKwl7IDB4MTgyMzQsIDIsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxODIzYywgMSwgUklfRTJFM19PTkxJTkUgfSwKKwl7IDB4MTgyNDAsIDEzLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTgyNzQsIDEsIFJJX0UyX09OTElORSB9LAorCXsgMHgxODI3OCwgODEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxODQ0MCwgNjMsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxODU3MCwgNDIsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTg2MTgsIDI1LCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgxODY4MCwgNDQsIFJJX0UzQjBfT05MSU5FIH0sCisJeyAweDE4NzQ4LCAxMiwgUklfRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTg3ODgsIDEsIFJJX0UzQjBfT05MSU5FIH0sCisJeyAweDE4NzljLCA2LCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgxODdjNCwgNTEsIFJJX0UzQjBfT05MSU5FIH0sCisJeyAweDE4YTAwLCA0OCwgUklfRTNCMF9PTkxJTkUgfSwKKwl7IDB4MjAwMDAsIDI0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIwMDYwLCA4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIwMDgwLCA5NCwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMDFmOCwgMSwgUklfRTFFMUhfT05MSU5FIH0sCisJeyAweDIwMWZjLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIwMjAwLCAxLCBSSV9FMUUxSF9PTkxJTkUgfSwKKwl7IDB4MjAyMDQsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjAyMDgsIDEsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgyMDIwYywgMzksIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjAyYzgsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMDJkOCwgNCwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDIwMmYwLCAxLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgyMDQwMCwgMiwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMDQwYywgOCwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMDQyYywgMTgsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMDQ4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMDUwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMDYwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyODAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyODAwNCwgODE5MSwgUklfQUxMX09GRkxJTkUgfSwKKwl7IDB4MzAwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzAwMDQsIDE2MzgzLCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHg0MDAwMCwgOTgsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NDAxYTgsIDgsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHg0MDFjOCwgMSwgUklfRTFIX09OTElORSB9LAorCXsgMHg0MDFjYywgMiwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDQwMWQ0LCAyLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4NDAyMDAsIDQsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NDAyMjAsIDYsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHg0MDIzOCwgOCwgUklfRTJFM19PTkxJTkUgfSwKKwl7IDB4NDAyNTgsIDQsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHg0MDI2OCwgMiwgUklfRTNFM0IwX09OTElORSB9LAorCXsgMHg0MDI3MCwgMTcsIFJJX0UzQjBfT05MSU5FIH0sCisJeyAweDQwNDAwLCA0MywgUklfQUxMX09OTElORSB9LAorCXsgMHg0MDRjYywgMywgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDQwNGUwLCAxLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4NDA1MDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NDA1MTAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NDA1MjAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NDA1MzAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NDA1NDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NDA1NTAsIDEwLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4NDA2MTAsIDIsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHg0MjAwMCwgMTY0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDQyMmMwLCA0LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4NDIyZDQsIDUsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHg0MjJlOCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDQyNDAwLCA0OSwgUklfQUxMX09OTElORSB9LAorCXsgMHg0MjRjOCwgMzgsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NDI1NjgsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NDI2NDAsIDUsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHg0MjgwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHg1MDAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHg1MDAwNCwgMTksIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NTAwNTAsIDgsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NTAwNzAsIDg4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDUwMWYwLCA0LCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4NTAyMDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NTAyMGMsIDcsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NTAyMjgsIDYsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHg1MDI0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHg1MDI4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHg1MDMwMCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDUwMzBjLCAxLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4NTAzMTgsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHg1MDMxYywgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDUwMzIwLCAyLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4NTAzMzAsIDEsIFJJX0UzQjBfT05MSU5FIH0sCisJeyAweDUyMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDU0MDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDU0MDA0LCAzMzI3LCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHg1ODAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHg1ODAwNCwgODE5MSwgUklfRTFFMUhfT0ZGTElORSB9LAorCXsgMHg2MDAwMCwgMjYsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NjAwNjgsIDgsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHg2MDA4OCwgMTIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4NjAwYjgsIDksIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHg2MDBkYywgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHg2MDBlMCwgNSwgUklfRTFFMUhfT05MSU5FIH0sCisJeyAweDYwMGY0LCAxLCBSSV9FMUUxSEUyX09OTElORSB9LAorCXsgMHg2MDBmOCwgMSwgUklfRTFFMUhfT05MSU5FIH0sCisJeyAweDYwMGZjLCA4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDYwMTNjLCAyNCwgUklfRTFIX09OTElORSB9LAorCXsgMHg2MDE5YywgMiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDYwMWFjLCAxOCwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDYwMjAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDYwMjA0LCAyLCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHg2MDIxMCwgMTMsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHg2MDI0NCwgMTYsIFJJX0UzQjBfT05MSU5FIH0sCisJeyAweDYxMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDYxMDA0LCA1MTEsIFJJX0FMTF9PRkZMSU5FIH0sCisJeyAweDYxODAwLCA1MTIsIFJJX0UzRTNCMF9PRkZMSU5FIH0sCisJeyAweDcwMDAwLCA4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDcwMDIwLCA4MTg0LCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHg3ODAwMCwgODE5MiwgUklfRTNFM0IwX09GRkxJTkUgfSwKKwl7IDB4ODUwMDAsIDMsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4ODUwMWMsIDcsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4ODUwNDgsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4ODUyMDAsIDMyLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGIwMDAwLCAxNjM4NCwgUklfRTFIX09OTElORSB9LAorCXsgMHhjMTAwMCwgNywgUklfQUxMX09OTElORSB9LAorCXsgMHhjMTAzYywgMiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGMxODAwLCAyLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGMyMDAwLCAxNjQsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YzIyYzAsIDUsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHhjMjJkOCwgNCwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGMyNDAwLCA0OSwgUklfQUxMX09OTElORSB9LAorCXsgMHhjMjRjOCwgMzgsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YzI1NjgsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YzI2MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YzQwMDAsIDE2NSwgUklfQUxMX09OTElORSB9LAorCXsgMHhjNDJkOCwgMiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGM0MmUwLCA3LCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YzQyZmMsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHhjNDQwMCwgNTEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4YzQ0ZDAsIDM4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweGM0NTcwLCAyLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGM0NTc4LCA1LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4YzQ2MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4ZDAwMDAsIDE5LCBSSV9BTExfT05MSU5FIH0sCisJeyAweGQwMDRjLCA4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweGQwMDZjLCA5MSwgUklfQUxMX09OTElORSB9LAorCXsgMHhkMDFmYywgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGQwMjAwLCAyLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGQwMjBjLCA3LCBSSV9BTExfT05MSU5FIH0sCisJeyAweGQwMjI4LCAxOCwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGQwMjgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGQwMzAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGQwNDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGQwODE4LCAxLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHhkNDAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHhkNDAwNCwgMjU1OSwgUklfQUxMX09GRkxJTkUgfSwKKwl7IDB4ZDgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4ZDgwMDQsIDgxOTEsIFJJX0FMTF9PRkZMSU5FIH0sCisJeyAweGUwMDAwLCAyMSwgUklfQUxMX09OTElORSB9LAorCXsgMHhlMDA1NCwgOCwgUklfQUxMX09OTElORSB9LAorCXsgMHhlMDA3NCwgNDksIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4ZTAxMzgsIDEsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHhlMDEzYywgMzUsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4ZTAxZjQsIDEsIFJJX0UyX09OTElORSB9LAorCXsgMHhlMDFmOCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGUwMjAwLCAyLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGUwMjBjLCA4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweGUwMjJjLCAxOCwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweGUwMjgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGUwMzAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweGUwNDAwLCAxLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHhlMTAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHhlMjAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHhlMjAwNCwgMjA0NywgUklfQUxMX09GRkxJTkUgfSwKKwl7IDB4ZjAwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4ZjAwMDQsIDE2MzgzLCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHgxMDEwMDAsIDEyLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEwMTA1MCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEwMTA1NCwgMywgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEwMTEwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDE4MDAsIDgsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTAyMDAwLCAxOCwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDIwNjgsIDYsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMDIwODAsIDE3LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEwMjBjOCwgOCwgUklfRTFIX09OTElORSB9LAorCXsgMHgxMDIwZTgsIDksIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMDI0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTAzMDAwLCAyNiwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDMwOTgsIDUsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMDMwYWMsIDIsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMDMwYjQsIDEsIFJJX0UyX09OTElORSB9LAorCXsgMHgxMDMwYjgsIDcsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMDMwZDgsIDgsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMDM0MDAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMDM0MDQsIDEzNSwgUklfRTJFM0UzQjBfT0ZGTElORSB9LAorCXsgMHgxMDM4MDAsIDgsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTA0MDAwLCA2MywgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDQxMWMsIDE2LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTA0MjAwLCAxNywgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDQ0MDAsIDY0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEwNDUwMCwgMTkyLCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHgxMDQ4MDAsIDY0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEwNDkwMCwgMTkyLCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHgxMDUwMDAsIDI1NiwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMDU0MDAsIDc2OCwgUklfQUxMX09GRkxJTkUgfSwKKwl7IDB4MTA3MDAwLCA3LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTA3MDFjLCAxLCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweDEwODAwMCwgMzMsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgxMDgwYWMsIDUsIFJJX0UxSF9PTkxJTkUgfSwKKwl7IDB4MTA4MTAwLCA1LCBSSV9FMUUxSF9PTkxJTkUgfSwKKwl7IDB4MTA4MTIwLCA1LCBSSV9FMUUxSF9PTkxJTkUgfSwKKwl7IDB4MTA4MjAwLCA3NCwgUklfRTFFMUhfT05MSU5FIH0sCisJeyAweDEwODQwMCwgNzQsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgxMDg4MDAsIDE1MiwgUklfRTFFMUhfT05MSU5FIH0sCisJeyAweDExMDAwMCwgMTExLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTEwMWRjLCAxLCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweDExMDIwMCwgNCwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEyMDAwMCwgMiwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMjAwMDgsIDQsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTIwMDE4LCAzLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEyMDAyNCwgNCwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMjAwMzQsIDMsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTIwMDQwLCA0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEyMDA1MCwgMywgUklfQUxMX09OTElORSB9LAorCXsgMHgxMjAwNWMsIDQsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTIwMDZjLCAzLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEyMDA3OCwgNCwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMjAwODgsIDMsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTIwMDk0LCA0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEyMDBhNCwgMywgUklfQUxMX09OTElORSB9LAorCXsgMHgxMjAwYjAsIDQsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTIwMGMwLCAzLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEyMDBjYywgNCwgUklfQUxMX09OTElORSB9LAorCXsgMHgxMjAwZGMsIDMsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTIwMGU4LCA0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEyMDBmOCwgMywgUklfQUxMX09OTElORSB9LAorCXsgMHgxMjAxMDQsIDQsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTIwMTE0LCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEyMDExOCwgMjIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTIwMTcwLCAyLCBSSV9FMUUxSF9PTkxJTkUgfSwKKwl7IDB4MTIwMTc4LCAyNDMsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTIwNTQ0LCA0LCBSSV9FMUUxSF9PTkxJTkUgfSwKKwl7IDB4MTIwNTU0LCA2LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEyMDU5YywgNiwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEyMDViNCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEyMDViOCwgMTUsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMjA1ZjQsIDEsIFJJX0UxSEUyX09OTElORSB9LAorCXsgMHgxMjA1ZjgsIDQsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMjA2MTgsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMjA2MWMsIDIwLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTIwNjZjLCAxMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEyMDY5OCwgMywgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEyMDZhNCwgMSwgUklfRTJfT05MSU5FIH0sCisJeyAweDEyMDZhOCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEyMDZiMCwgNzUsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMjA3ZGMsIDEsIFJJX0UyX09OTElORSB9LAorCXsgMHgxMjA3ZmMsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMjA4MGMsIDY1LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEyMDkxMCwgNywgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEyMDkzMCwgOSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEyMDk1YywgMzcsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTIwYTAwLCAyLCBSSV9FMUUxSEUyX09OTElORSB9LAorCXsgMHgxMjBiMDAsIDEsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTIyMDAwLCAyLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDEyMjAwOCwgMjA0NiwgUklfRTFfT0ZGTElORSB9LAorCXsgMHgxMjgwMDAsIDIsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMjgwMDgsIDYxNDIsIFJJX0UxSEUyRTNFM0IwX09GRkxJTkUgfSwKKwl7IDB4MTMwMDAwLCAzNSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEzMDEwMCwgMjksIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMzAxODAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMzAyMDAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMzAyODAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMzAzMDAsIDUsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMzAzODAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMzA0MDAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMzA0ODAsIDUsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMzA4MDAsIDcyLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTMxMDAwLCAxMzYsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxMzIwMDAsIDE0OCwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDEzNDAwMCwgNTQ0LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTQwMDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE0MDAwNCwgOSwgUklfRTFFMUhFMkUzX09OTElORSB9LAorCXsgMHgxNDAwMjgsIDgsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTQwMDQ4LCAxMCwgUklfRTFFMUhFMkUzX09OTElORSB9LAorCXsgMHgxNDAwNzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTQwMDc0LCAxMCwgUklfRTFFMUhFMkUzX09OTElORSB9LAorCXsgMHgxNDAwOWMsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTQwMGEwLCA1LCBSSV9FMUUxSEUyRTNfT05MSU5FIH0sCisJeyAweDE0MDBiNCwgNywgUklfQUxMX09OTElORSB9LAorCXsgMHgxNDAwZDAsIDEwLCBSSV9FMUUxSEUyRTNfT05MSU5FIH0sCisJeyAweDE0MDBmOCwgMiwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNDAxMDAsIDUsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgxNDAxMTQsIDUsIFJJX0UxRTFIRTJFM19PTkxJTkUgfSwKKwl7IDB4MTQwMTI4LCA3LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE0MDE0NCwgOSwgUklfRTFFMUhFMkUzX09OTElORSB9LAorCXsgMHgxNDAxNjgsIDgsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTQwMTg4LCAzLCBSSV9FMUUxSEUyRTNfT05MSU5FIH0sCisJeyAweDE0MDE5NCwgMTMsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTQwMjAwLCA2LCBSSV9FMUUxSEUyRTNfT05MSU5FIH0sCisJeyAweDE0MDIyMCwgNCwgUklfRTJFM19PTkxJTkUgfSwKKwl7IDB4MTQwMjQwLCA0LCBSSV9FMkUzX09OTElORSB9LAorCXsgMHgxNDAyNjAsIDQsIFJJX0UyRTNfT05MSU5FIH0sCisJeyAweDE0MDI4MCwgNCwgUklfRTJFM19PTkxJTkUgfSwKKwl7IDB4MTQwMmEwLCA0LCBSSV9FMkUzX09OTElORSB9LAorCXsgMHgxNDAyYzAsIDQsIFJJX0UyRTNfT05MSU5FIH0sCisJeyAweDE0MDJlMCwgMiwgUklfRTJFM19PTkxJTkUgfSwKKwl7IDB4MTQwMmU4LCAyLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTQwMmYwLCA5LCBSSV9FMkUzX09OTElORSB9LAorCXsgMHgxNDAzMTQsIDQ0LCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgxNDAzZDAsIDcwLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgxNDQwMDAsIDQsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgxNDgwMDAsIDQsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgxNGMwMDAsIDQsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgxNTAwMDAsIDQsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgxNTQwMDAsIDQsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgxNTgwMDAsIDQsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgxNWMwMDAsIDIsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNWMwMDgsIDUsIFJJX0UxSF9PTkxJTkUgfSwKKwl7IDB4MTVjMDIwLCA4LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTVjMDQwLCAxLCBSSV9FMkUzX09OTElORSB9LAorCXsgMHgxNWMwNDQsIDIsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNWMwNGMsIDgsIFJJX0UyRTNfT05MSU5FIH0sCisJeyAweDE1YzA2YywgOCwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE1YzA5MCwgMTMsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNWMwYzgsIDI0LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTVjMTI4LCAyLCBSSV9FMkUzX09OTElORSB9LAorCXsgMHgxNWMxMzAsIDgsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNWMxNTAsIDIsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTVjMTU4LCAyLCBSSV9FM19PTkxJTkUgfSwKKwl7IDB4MTVjMTYwLCAxNDksIFJJX0UzQjBfT05MSU5FIH0sCisJeyAweDE2MTAwMCwgNywgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjEwM2MsIDIsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNjE4MDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTYyMDAwLCA1NCwgUklfRTNFM0IwX09OTElORSB9LAorCXsgMHgxNjIyMDAsIDYwLCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweDE2MjQwMCwgNTQsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTYyNjAwLCA2MCwgUklfRTNFM0IwX09OTElORSB9LAorCXsgMHgxNjI4MDAsIDU0LCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweDE2MmEwMCwgNjAsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTYyYzAwLCA1NCwgUklfRTNFM0IwX09OTElORSB9LAorCXsgMHgxNjJlMDAsIDYwLCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweDE2NDAwMCwgNjAsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTY0MTEwLCAyLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTY0MTE4LCAxNSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE2NDIwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjQyMDgsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTY0MjEwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE2NDIxOCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjQyMjAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTY0MjI4LCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE2NDIzMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjQyMzgsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTY0MjQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE2NDI0OCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjQyNTAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTY0MjU4LCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE2NDI2MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjQyNzAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTY0MjgwLCAyLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE2NDgwMCwgMiwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjUwMDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTY2MDAwLCAxNjQsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTY2MmNjLCA3LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTY2NDAwLCA0OSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjY0YzgsIDM4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE2NjU2OCwgMiwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjY1NzAsIDUsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNjY4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTY4MDAwLCAxMzcsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTY4MjI0LCAyLCBSSV9FMUUxSF9PTkxJTkUgfSwKKwl7IDB4MTY4MjJjLCAyOSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjgyYTAsIDEyLCBSSV9FMUUxSF9PTkxJTkUgfSwKKwl7IDB4MTY4MmQwLCAxMiwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjgzMDAsIDIsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgxNjgzMDgsIDY4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE2ODQxOCwgMiwgUklfRTFFMUhfT05MSU5FIH0sCisJeyAweDE2ODQyMCwgNiwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjg4MDAsIDE5LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE2ODkwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNjhhMDAsIDEyOCwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNmEwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTZhMDA0LCAxNTM1LCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHgxNmMwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTZjMDA0LCAxNTM1LCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHgxNmUwMDAsIDE2LCBSSV9FMUhfT05MSU5FIH0sCisJeyAweDE2ZTA0MCwgOCwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE2ZTEwMCwgMSwgUklfRTFIX09OTElORSB9LAorCXsgMHgxNmUyMDAsIDIsIFJJX0UxSF9PTkxJTkUgfSwKKwl7IDB4MTZlNDAwLCAxNjEsIFJJX0UxSF9PTkxJTkUgfSwKKwl7IDB4MTZlNjg0LCAyLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTZlNjhjLCAxMiwgUklfRTFIX09OTElORSB9LAorCXsgMHgxNmU2YmMsIDQsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNmU2Y2MsIDQsIFJJX0UxSF9PTkxJTkUgfSwKKwl7IDB4MTZlNmUwLCAyLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTZlNmU4LCA1LCBSSV9FMkUzX09OTElORSB9LAorCXsgMHgxNmU2ZmMsIDUsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNmU3NjgsIDE3LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTZlN2FjLCAxMiwgUklfRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTcwMDAwLCAyNCwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNzAwNjAsIDQsIFJJX0UxRTFIX09OTElORSB9LAorCXsgMHgxNzAwNzAsIDY1LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE3MDE5NCwgMTEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNzAxYzQsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNzAxY2MsIDcsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxNzAxZTgsIDEsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTcwMWVjLCAxLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTcwMWY0LCAxLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTcwMjAwLCA0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE3MDIxNCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxNzAyMTgsIDc3LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MTcwNDAwLCA2NCwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE3ODAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxODAwMDAsIDYxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE4MDEzYywgMiwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE4MDIwMCwgNTgsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTgwMzQwLCA0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE4MDM4MCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE4MDM4OCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE4MDM5MCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE4MDM5OCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE4MDNhMCwgNSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDE4MDNiNCwgMiwgUklfRTNFM0IwX09OTElORSB9LAorCXsgMHgxODA0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MTgwNDA0LCAyNTUsIFJJX0UxRTFIX09GRkxJTkUgfSwKKwl7IDB4MTgxMDAwLCA0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDE4MTAxMCwgMTAyMCwgUklfQUxMX09GRkxJTkUgfSwKKwl7IDB4MTgyMDAwLCA0LCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweDFhMDAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYTAwMDQsIDU2MzEsIFJJX0FMTF9PRkZMSU5FIH0sCisJeyAweDFhNTgwMCwgMjU2MCwgUklfRTFIRTJFM0UzQjBfT0ZGTElORSB9LAorCXsgMHgxYTgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWE4MDA0LCA4MTkxLCBSSV9FMUhFMkUzRTNCMF9PRkZMSU5FIH0sCisJeyAweDFiMDAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjAwMDQsIDE1LCBSSV9FMUhfT0ZGTElORSB9LAorCXsgMHgxYjAwNDAsIDEsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgxYjAwNDQsIDIzOSwgUklfRTFIX09GRkxJTkUgfSwKKwl7IDB4MWIwNDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiMDQwNCwgMjU1LCBSSV9FMUhfT0ZGTElORSB9LAorCXsgMHgxYjA4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWIwODQwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MWIwYzAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiMTAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjEwNDAsIDEsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgxYjE0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWIxNDQwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MWIxNDgwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MWIxNGMwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MWIxODAwLCAxMjgsIFJJX0FMTF9PRkZMSU5FIH0sCisJeyAweDFiMWMwMCwgMTI4LCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHgxYjIwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWIyNDAwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MWIyNDA0LCA1NjMxLCBSSV9FMkUzRTNCMF9PRkZMSU5FIH0sCisJeyAweDFiODAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjgwNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4MDgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiODBjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjgxMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4MTQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiODE4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjgxYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4MjAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiODI0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjgyODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4MmMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiODMwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjgzNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4MzgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiODNjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjg0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4NDQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiODQ4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjg0YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4NTAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiODU0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjg1ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4NWMwLCAxOSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDFiODgwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjg4NDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4ODgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiODhjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjg5MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4OTQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiODk4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjg5YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4YTAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiOGE0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjhhODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4YWMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiOGIwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjhiNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4YjgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiOGJjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjhjMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4YzQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiOGM4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjhjYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4Y2M0LCAxLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MWI4ZDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiOGQ0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjhkODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4ZGMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiOGUwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgxYjhlNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MWI4ZTgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDFiOGU4NCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDFiOGVjMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDFiOGYwMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDFiOGY0MCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDFiOGY4MCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDFiOGZjMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDFiOGZjNCwgMiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDFiOGZkMCwgNiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDFiOGZlOCwgMiwgUklfRTNFM0IwX09OTElORSB9LAorCXsgMHgxYjkwMDAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxYjkwNDAsIDMsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxYjkwNWMsIDEsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MWI5MDY0LCAxLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgxYjkwODAsIDEwLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgxYjk0MDAsIDE0LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MWI5NDNjLCAxOSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDFiOTQ5MCwgMTAsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgxYzAwMDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjAwMDAwLCA2NSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMDAxNGMsIDIsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMDAyMDAsIDU4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIwMDM0MCwgNCwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMDAzODAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMDAzODgsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMDAzOTAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMDAzOTgsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMDAzYTAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMDAzYTgsIDIsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMDA0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjAwNDA0LCAyNTUsIFJJX0UxRTFIX09GRkxJTkUgfSwKKwl7IDB4MjAyMDAwLCA0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIwMjAxMCwgMjA0NCwgUklfQUxMX09GRkxJTkUgfSwKKwl7IDB4MjA0MDAwLCA0LCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweDIyMDAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMjAwMDQsIDU2MzEsIFJJX0FMTF9PRkZMSU5FIH0sCisJeyAweDIyNTgwMCwgMjU2MCwgUklfRTFIRTJFM0UzQjBfT0ZGTElORSB9LAorCXsgMHgyMjgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjI4MDA0LCA4MTkxLCBSSV9FMUhFMkUzRTNCMF9PRkZMSU5FIH0sCisJeyAweDIzMDAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzAwMDQsIDE1LCBSSV9FMUhfT0ZGTElORSB9LAorCXsgMHgyMzAwNDAsIDEsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMzAwNDQsIDIzOSwgUklfRTFIX09GRkxJTkUgfSwKKwl7IDB4MjMwNDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzMDQwNCwgMjU1LCBSSV9FMUhfT0ZGTElORSB9LAorCXsgMHgyMzA4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjMwODQwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MjMwYzAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzMTAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzEwNDAsIDEsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMzE0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjMxNDQwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MjMxNDgwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MjMxNGMwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MjMxODAwLCAxMjgsIFJJX0FMTF9PRkZMSU5FIH0sCisJeyAweDIzMWMwMCwgMTI4LCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHgyMzIwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjMyNDAwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MjMyNDA0LCA1NjMxLCBSSV9FMkUzRTNCMF9PRkZMSU5FIH0sCisJeyAweDIzODAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzgwNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4MDgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzODBjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzgxMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4MTQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzODE4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzgxYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4MjAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzODI0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzgyODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4MmMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzODMwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzgzNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4MzgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzODNjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzg0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4NDQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzODQ4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzg0YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4NTAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzODU0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzg1ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4NWMwLCAxOSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDIzODgwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzg4NDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4ODgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzODhjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzg5MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4OTQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzODk4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzg5YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4YTAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzOGE0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzhhODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4YWMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzOGIwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzhiNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4YjgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzOGJjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzhjMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4YzQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzOGM4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzhjYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4Y2M0LCAxLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MjM4ZDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzOGQ0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzhkODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4ZGMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzOGUwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyMzhlNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjM4ZTgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDIzOGU4NCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDIzOGVjMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDIzOGYwMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDIzOGY0MCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDIzOGY4MCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDIzOGZjMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDIzOGZjNCwgMiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDIzOGZkMCwgNiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDIzOGZlOCwgMiwgUklfRTNFM0IwX09OTElORSB9LAorCXsgMHgyMzkwMDAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMzkwNDAsIDMsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyMzkwNWMsIDEsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MjM5MDY0LCAxLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgyMzkwODAsIDEwLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgyNDAwMDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjgwMDAwLCA2NSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyODAxNGMsIDIsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgyODAyMDAsIDU4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDI4MDM0MCwgNCwgUklfQUxMX09OTElORSB9LAorCXsgMHgyODAzODAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyODAzODgsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyODAzOTAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyODAzOTgsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyODAzYTAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyODAzYTgsIDIsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyODA0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MjgwNDA0LCAyNTUsIFJJX0UxRTFIX09GRkxJTkUgfSwKKwl7IDB4MjgyMDAwLCA0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDI4MjAxMCwgMjA0NCwgUklfQUxMX09GRkxJTkUgfSwKKwl7IDB4Mjg0MDAwLCA0LCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweDJhMDAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYTAwMDQsIDU2MzEsIFJJX0FMTF9PRkZMSU5FIH0sCisJeyAweDJhNTgwMCwgMjU2MCwgUklfRTFIRTJFM0UzQjBfT0ZGTElORSB9LAorCXsgMHgyYTgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmE4MDA0LCA4MTkxLCBSSV9FMUhFMkUzRTNCMF9PRkZMSU5FIH0sCisJeyAweDJiMDAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjAwMDQsIDE1LCBSSV9FMUhfT0ZGTElORSB9LAorCXsgMHgyYjAwNDAsIDEsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgyYjAwNDQsIDIzOSwgUklfRTFIX09GRkxJTkUgfSwKKwl7IDB4MmIwNDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiMDQwNCwgMjU1LCBSSV9FMUhfT0ZGTElORSB9LAorCXsgMHgyYjA4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmIwODQwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MmIwYzAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiMTAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjEwNDAsIDEsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgyYjE0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmIxNDQwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MmIxNDgwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MmIxNGMwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MmIxODAwLCAxMjgsIFJJX0FMTF9PRkZMSU5FIH0sCisJeyAweDJiMWMwMCwgMTI4LCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHgyYjIwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmIyNDAwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MmIyNDA0LCA1NjMxLCBSSV9FMkUzRTNCMF9PRkZMSU5FIH0sCisJeyAweDJiODAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjgwNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4MDgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiODBjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjgxMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4MTQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiODE4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjgxYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4MjAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiODI0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjgyODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4MmMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiODMwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjgzNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4MzgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiODNjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjg0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4NDQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiODQ4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjg0YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4NTAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiODU0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjg1ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4NWMwLCAxOSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDJiODgwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjg4NDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4ODgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiODhjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjg5MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4OTQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiODk4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjg5YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4YTAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiOGE0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjhhODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4YWMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiOGIwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjhiNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4YjgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiOGJjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjhjMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4YzQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiOGM4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjhjYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4Y2M0LCAxLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MmI4ZDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiOGQ0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjhkODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4ZGMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiOGUwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgyYjhlNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MmI4ZTgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDJiOGU4NCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDJiOGVjMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDJiOGYwMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDJiOGY0MCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDJiOGY4MCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDJiOGZjMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDJiOGZjNCwgMiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDJiOGZkMCwgNiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDJiOGZlOCwgMiwgUklfRTNFM0IwX09OTElORSB9LAorCXsgMHgyYjkwMDAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyYjkwNDAsIDMsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyYjkwNWMsIDEsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MmI5MDY0LCAxLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgyYjkwODAsIDEwLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgyYjk0MDAsIDE0LCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MmI5NDNjLCAxOSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDJiOTQ5MCwgMTAsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgyYzAwMDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzAwMDAwLCA2NSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMDAxNGMsIDIsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgzMDAyMDAsIDU4LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMwMDM0MCwgNCwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMDAzODAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgzMDAzODgsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgzMDAzOTAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgzMDAzOTgsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgzMDAzYTAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgzMDAzYTgsIDIsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgzMDA0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzAwNDA0LCAyNTUsIFJJX0UxRTFIX09GRkxJTkUgfSwKKwl7IDB4MzAyMDAwLCA0LCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMwMjAxMCwgMjA0NCwgUklfQUxMX09GRkxJTkUgfSwKKwl7IDB4MzA0MDAwLCA0LCBSSV9FM0UzQjBfT05MSU5FIH0sCisJeyAweDMyMDAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMjAwMDQsIDU2MzEsIFJJX0FMTF9PRkZMSU5FIH0sCisJeyAweDMyNTgwMCwgMjU2MCwgUklfRTFIRTJFM0UzQjBfT0ZGTElORSB9LAorCXsgMHgzMjgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzI4MDA0LCA4MTkxLCBSSV9FMUhFMkUzRTNCMF9PRkZMSU5FIH0sCisJeyAweDMzMDAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzAwMDQsIDE1LCBSSV9FMUhfT0ZGTElORSB9LAorCXsgMHgzMzAwNDAsIDEsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgzMzAwNDQsIDIzOSwgUklfRTFIX09GRkxJTkUgfSwKKwl7IDB4MzMwNDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzMDQwNCwgMjU1LCBSSV9FMUhfT0ZGTElORSB9LAorCXsgMHgzMzA4MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzMwODQwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MzMwYzAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzMTAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzEwNDAsIDEsIFJJX0UxSEUyRTNFM0IwX09OTElORSB9LAorCXsgMHgzMzE0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzMxNDQwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MzMxNDgwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MzMxNGMwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MzMxODAwLCAxMjgsIFJJX0FMTF9PRkZMSU5FIH0sCisJeyAweDMzMWMwMCwgMTI4LCBSSV9BTExfT0ZGTElORSB9LAorCXsgMHgzMzIwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzMyNDAwLCAxLCBSSV9FMUhFMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MzMyNDA0LCA1NjMxLCBSSV9FMkUzRTNCMF9PRkZMSU5FIH0sCisJeyAweDMzODAwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzgwNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4MDgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzODBjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzgxMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4MTQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzODE4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzgxYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4MjAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzODI0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzgyODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4MmMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzODMwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzgzNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4MzgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzODNjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzg0MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4NDQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzODQ4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzg0YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4NTAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzODU0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzg1ODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4NWMwLCAxOSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDMzODgwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzg4NDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4ODgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzODhjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzg5MDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4OTQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzODk4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzg5YzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4YTAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzOGE0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzhhODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4YWMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzOGIwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzhiNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4YjgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzOGJjMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzhjMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4YzQwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzOGM4MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzhjYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4Y2M0LCAxLCBSSV9FMkUzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MzM4ZDAwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzOGQ0MCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzhkODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4ZGMwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzOGUwMCwgMSwgUklfQUxMX09OTElORSB9LAorCXsgMHgzMzhlNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKKwl7IDB4MzM4ZTgwLCAxLCBSSV9BTExfT05MSU5FIH0sCisJeyAweDMzOGU4NCwgMSwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDMzOGVjMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDMzOGYwMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDMzOGY0MCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDMzOGY4MCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDMzOGZjMCwgMSwgUklfRTFIRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDMzOGZjNCwgMiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDMzOGZkMCwgNiwgUklfRTJFM0UzQjBfT05MSU5FIH0sCisJeyAweDMzOGZlOCwgMiwgUklfRTNFM0IwX09OTElORSB9LAorCXsgMHgzMzkwMDAsIDEsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgzMzkwNDAsIDMsIFJJX0UyRTNFM0IwX09OTElORSB9LAorCXsgMHgzMzkwNWMsIDEsIFJJX0UzRTNCMF9PTkxJTkUgfSwKKwl7IDB4MzM5MDY0LCAxLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgzMzkwODAsIDEwLCBSSV9FM0IwX09OTElORSB9LAorCXsgMHgzNDAwMDAsIDIsIFJJX0FMTF9PTkxJTkUgfSwKIH07CisjZGVmaW5lIFJFR1NfQ09VTlQJCQlBUlJBWV9TSVpFKHJlZ19hZGRycykKIAotI2RlZmluZSBJRExFX1JFR1NfQ09VTlQJCQkyMzcKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2FkZHIgaWRsZV9hZGRyc1tJRExFX1JFR1NfQ09VTlRdID0gewotCXsgMHgyMTA0LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgyMTEwLCAyLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIxMWMsIDgsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDI4MTQsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MjgxYywgMiwgUklfQUxMX09OTElORSB9LCB7IDB4Mjg1NCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyODVjLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHg5MDEwLCA3LCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4OTAzMCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHg5MDY4LCAxNiwgUklfRTJfT05MSU5FIH0sCi0JeyAweDkyMzAsIDIsIFJJX0UyX09OTElORSB9LCB7IDB4OTI0NCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDkyOTgsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4OTJhOCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweGEzOGMsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGEzYzQsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHhhNDA4LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHhhNDJjLCAxMiwgUklfQUxMX09OTElORSB9LAotCXsgMHhhNjAwLCA1LCBSSV9FMUhFMl9PTkxJTkUgfSwgeyAweGE2MTgsIDEsIFJJX0UxSEUyX09OTElORSB9LAotCXsgMHhhNzE0LCAxLCBSSV9FMl9PTkxJTkUgfSwgeyAweGE3MjAsIDEsIFJJX0UyX09OTElORSB9LAotCXsgMHhhNzUwLCAxLCBSSV9FMl9PTkxJTkUgfSwgeyAweGMwOWMsIDEsIFJJX0UxRTFIX09OTElORSB9LAotCXsgMHgxMDNiMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MTAzYzAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTAzZDAsIDEsIFJJX0UxSF9PTkxJTkUgfSwgeyAweDE4M2JjLCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MTgzY2MsIDEsIFJJX0UyX09OTElORSB9LCB7IDB4MjAyMWMsIDExLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDIwMmE4LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHgyMDJiOCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMDQwNCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MjA0MGMsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MjA0MWMsIDIsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDQwMTU0LCAxNCwgUklfQUxMX09OTElORSB9LAotCXsgMHg0MDE5OCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4NDA0YWMsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4NDA0YmMsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDQyMjkwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDQyMmEwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHg0MjJiMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHg0MjU0OCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4NDI1NTAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4NDI1NTgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDUwMTYwLCA4LCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDUwMWQwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHg1MDFlMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHg1MDIwNCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4NTAyMGMsIDIsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4NTAyMWMsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDYwMDkwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDYwMTFjLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHg2MDEyYywgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHhjMTAxYywgMSwgUklfQUxMX09OTElORSB9LCB7IDB4YzEwMmMsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4YzIyOTAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGMyMmEwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGMyMmIwLCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHhjMjU0OCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHhjMjU1MCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4YzI1NTgsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4YzQyOTQsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGM0MmE0LCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGM0MmI0LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHhjNDU1MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHhjNDU1OCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4YzQ1NjAsIDEsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4ZDAxNmMsIDgsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGQwMWQ4LCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGQwMWU4LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHhkMDIwNCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHhkMDIwYywgMywgUklfQUxMX09OTElORSB9LCB7IDB4ZTAxNTQsIDgsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4ZTAxYzgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweGUwMWQ4LCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweGUwMjA0LCAxLCBSSV9BTExfT05MSU5FIH0sIHsgMHhlMDIwYywgMiwgUklfQUxMX09OTElORSB9LAotCXsgMHhlMDIxYywgMiwgUklfQUxMX09OTElORSB9LCB7IDB4MTAxMDE0LCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEwMTAzMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MTAxMDQwLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEwMjA1OCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MTAyMDgwLCAxNiwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMDMwMDQsIDIsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEwMzA2OCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMDMwNzgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEwMzA4OCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMDMwOWMsIDIsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MTAzMGI4LCAyLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MTAzMGNjLCAxLCBSSV9FMl9PTkxJTkUgfSwgeyAweDEwMzBlMCwgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDEwNDAwNCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MTA0MDE4LCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEwNDAyMCwgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MTA0MDNjLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEwNDBmYywgMSwgUklfQUxMX09OTElORSB9LCB7IDB4MTA0MTBjLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEwNDQwMCwgNjQsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEwNDgwMCwgNjQsIFJJX0FMTF9PTkxJTkUgfSwKLQl7IDB4MTA1MDAwLCAyNTYsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEwODA5NCwgMSwgUklfRTFFMUhfT05MSU5FIH0sCi0JeyAweDEyMDFiMCwgMiwgUklfQUxMX09OTElORSB9LCB7IDB4MTIwMzJjLCAxLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEyMDM2YywgMywgUklfQUxMX09OTElORSB9LCB7IDB4MTIwNDA4LCAyLCBSSV9BTExfT05MSU5FIH0sCi0JeyAweDEyMDQxNCwgMTUsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDQ3OCwgMiwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA1MmMsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDU2NCwgMywgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA1N2MsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDU4YywgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA2MDgsIDEsIFJJX0UxSEUyX09OTElORSB9LCB7IDB4MTIwNzM4LCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MTIwNzc4LCAyLCBSSV9FMl9PTkxJTkUgfSwgeyAweDEyMDgwOCwgMywgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4MTgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDgyMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4MjgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDgzMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4MzgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDg0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4NDgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDg1MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4NTgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDg2MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4NjgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDg3MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4NzgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDg4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4ODgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDg5MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4OTgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDhhMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4YTgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDhiMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4YjgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDhjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4YzgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDhkMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4ZDgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDhlMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4ZTgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDhmMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA4ZjgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDkwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxMjA5MDgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDEyMDk0MCwgNSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDEzMDAzMCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHgxMzAwNGMsIDMsIFJJX0UyX09OTElORSB9LAotCXsgMHgxMzAwNjQsIDIsIFJJX0UyX09OTElORSB9LCB7IDB4MTMwMDljLCAxLCBSSV9FMl9PTkxJTkUgfSwKLQl7IDB4MTMwMTMwLCAxLCBSSV9FMl9PTkxJTkUgfSwgeyAweDEzMDE2YywgMSwgUklfRTJfT05MSU5FIH0sCi0JeyAweDEzMDMwMCwgMSwgUklfRTJfT05MSU5FIH0sIHsgMHgxMzA0ODAsIDEsIFJJX0UyX09OTElORSB9LAotCXsgMHgxNDAwNWMsIDIsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE0MDBkMCwgMiwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNDAwZTAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE0MDFjOCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNDAyMDAsIDYsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2MTAxYywgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjEwMmMsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2NDAxNCwgMiwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjQwZjAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2NjI5MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjYyYTAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2NjJiMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjY1NDgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2NjU1MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjY1NTgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2ODAwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjgwMDgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2ODAxMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjgwMTgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2ODAyOCwgMiwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjgwNTgsIDQsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2ODA3MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjgyMzgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2ODJkMCwgMiwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjgyZTAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2ODMwMCwgMiwgUklfRTFFMUhfT05MSU5FIH0sCi0JeyAweDE2ODMwOCwgNjUsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2ODQxMCwgMiwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjg0MzgsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE2ODQ0OCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNjhhMDAsIDEyOCwgUklfQUxMX09OTElORSB9LCB7IDB4MTZlMjAwLCAxMjgsIFJJX0UxSF9PTkxJTkUgfSwKLQl7IDB4MTZlNDA0LCAyLCBSSV9FMUhfT05MSU5FIH0sIHsgMHgxNmU1ODQsIDY0LCBSSV9FMUhfT05MSU5FIH0sCi0JeyAweDE2ZTY4NCwgMiwgUklfRTFIRTJfT05MSU5FIH0sIHsgMHgxNmU2OGMsIDQsIFJJX0UxSF9PTkxJTkUgfSwKLQl7IDB4MTZlNmZjLCA0LCBSSV9FMl9PTkxJTkUgfSwgeyAweDE3MDBhNCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNzAwYWMsIDIsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE3MDBjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxNzAxNzQsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE3MDE4NCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxODAwZjQsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE4MDEwNCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxODAxMTQsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE4MDEyNCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxODAyNmMsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDE4MDJhMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODA0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgxYjgwODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDFiODBjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMDAxMDQsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIwMDExNCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMDAxMjQsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIwMDEzNCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMDAyNmMsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIwMDJhMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODA0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyMzgwODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDIzODBjMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyODAxMDQsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDI4MDExNCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyODAxMjQsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDI4MDEzNCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyODAyNmMsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDI4MDJhMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjgwMDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDJiODA0MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgyYjgwODAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDMwMDEwNCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMDAxMTQsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDMwMDEyNCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMDAxMzQsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDMwMDI2YywgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMDAyYTAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDMzODAwMCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMzgwNDAsIDEsIFJJX0FMTF9PTkxJTkUgfSwgeyAweDMzODA4MCwgMSwgUklfQUxMX09OTElORSB9LAotCXsgMHgzMzgwYzAsIDEsIFJJX0FMTF9PTkxJTkUgfQotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHVtcF9zaWduIGR1bXBfc2lnbl9hbGwgPSB7IDB4NGUyM2ZkZTEsIDB4NzAwMTcsIDB4M2EgfTsKIAotI2RlZmluZSBXUkVHU19DT1VOVF9FMQkJCTEKLXN0YXRpYyBjb25zdCB1MzIgcmVhZF9yZWdfZTFfMFtdID0geyAweDFiMTAwMCB9Oworc3RhdGljIGNvbnN0IHUzMiBwYWdlX3ZhbHNfZTJbXSA9IHsgMCwgMTI4IH07CisjZGVmaW5lIFBBR0VfTU9ERV9WQUxVRVNfRTIJCUFSUkFZX1NJWkUocGFnZV92YWxzX2UyKQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdyZWdfYWRkciB3cmVnX2FkZHJzX2UxW1dSRUdTX0NPVU5UX0UxXSA9IHsKLQl7IDB4MWIwYzAwLCAxOTIsIDEsIHJlYWRfcmVnX2UxXzAsIFJJX0UxX09GRkxJTkUgfQotfTsKK3N0YXRpYyBjb25zdCB1MzIgcGFnZV93cml0ZV9yZWdzX2UyW10gPSB7IDMyODQ3NiB9OworI2RlZmluZSBQQUdFX1dSSVRFX1JFR1NfRTIJCUFSUkFZX1NJWkUocGFnZV93cml0ZV9yZWdzX2UyKQogCi0jZGVmaW5lIFdSRUdTX0NPVU5UX0UxSAkJCTEKLXN0YXRpYyBjb25zdCB1MzIgcmVhZF9yZWdfZTFoXzBbXSA9IHsgMHgxYjEwNDAsIDB4MWIxMDAwIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd3JlZ19hZGRyIHdyZWdfYWRkcnNfZTFoW1dSRUdTX0NPVU5UX0UxSF0gPSB7Ci0JeyAweDFiMGMwMCwgMjU2LCAyLCByZWFkX3JlZ19lMWhfMCwgUklfRTFIX09GRkxJTkUgfQotfTsKLQotI2RlZmluZSBXUkVHU19DT1VOVF9FMgkJCTEKLXN0YXRpYyBjb25zdCB1MzIgcmVhZF9yZWdfZTJfMFtdID0geyAweDFiMTA0MCwgMHgxYjEwMDAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB3cmVnX2FkZHIgd3JlZ19hZGRyc19lMltXUkVHU19DT1VOVF9FMl0gPSB7Ci0JeyAweDFiMGMwMCwgMTI4LCAyLCByZWFkX3JlZ19lMl8wLCBSSV9FMl9PRkZMSU5FIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHVtcF9zaWduIGR1bXBfc2lnbl9hbGwgPSB7IDB4NGQxOGIwYTQsIDB4NjAwMTAsIDB4M2EgfTsKLQotI2RlZmluZSBUSU1FUl9SRUdTX0NPVU5UX0UxCQkyCi0KLXN0YXRpYyBjb25zdCB1MzIgdGltZXJfc3RhdHVzX3JlZ3NfZTFbVElNRVJfUkVHU19DT1VOVF9FMV0gPSB7Ci0JMHgxNjQwMTQsIDB4MTY0MDE4IH07Ci1zdGF0aWMgY29uc3QgdTMyIHRpbWVyX3NjYW5fcmVnc19lMVtUSU1FUl9SRUdTX0NPVU5UX0UxXSA9IHsKLQkweDE2NDBkMCwgMHgxNjQwZDQgfTsKLQotI2RlZmluZSBUSU1FUl9SRUdTX0NPVU5UX0UxSAkJMgotCi1zdGF0aWMgY29uc3QgdTMyIHRpbWVyX3N0YXR1c19yZWdzX2UxaFtUSU1FUl9SRUdTX0NPVU5UX0UxSF0gPSB7Ci0JMHgxNjQwMTQsIDB4MTY0MDE4IH07Ci1zdGF0aWMgY29uc3QgdTMyIHRpbWVyX3NjYW5fcmVnc19lMWhbVElNRVJfUkVHU19DT1VOVF9FMUhdID0gewotCTB4MTY0MGQwLCAweDE2NDBkNCB9OwotCi0jZGVmaW5lIFRJTUVSX1JFR1NfQ09VTlRfRTIJCTIKLQotc3RhdGljIGNvbnN0IHUzMiB0aW1lcl9zdGF0dXNfcmVnc19lMltUSU1FUl9SRUdTX0NPVU5UX0UyXSA9IHsKLQkweDE2NDAxNCwgMHgxNjQwMTggfTsKLXN0YXRpYyBjb25zdCB1MzIgdGltZXJfc2Nhbl9yZWdzX2UyW1RJTUVSX1JFR1NfQ09VTlRfRTJdID0gewotCTB4MTY0MGQwLCAweDE2NDBkNCB9OwotCi0jZGVmaW5lIFBBR0VfTU9ERV9WQUxVRVNfRTEgMAotCi0jZGVmaW5lIFBBR0VfUkVBRF9SRUdTX0UxIDAKLQotI2RlZmluZSBQQUdFX1dSSVRFX1JFR1NfRTEgMAotCi1zdGF0aWMgY29uc3QgdTMyIHBhZ2VfdmFsc19lMVtdID0geyAwIH07Ci0KLXN0YXRpYyBjb25zdCB1MzIgcGFnZV93cml0ZV9yZWdzX2UxW10gPSB7IDAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfYWRkciBwYWdlX3JlYWRfcmVnc19lMVtdID0geyB7IDB4MCwgMCwgUklfRTFfT05MSU5FIH0gfTsKLQotI2RlZmluZSBQQUdFX01PREVfVkFMVUVTX0UxSCAwCi0KLSNkZWZpbmUgUEFHRV9SRUFEX1JFR1NfRTFIIDAKLQotI2RlZmluZSBQQUdFX1dSSVRFX1JFR1NfRTFIIDAKLQotc3RhdGljIGNvbnN0IHUzMiBwYWdlX3ZhbHNfZTFoW10gPSB7IDAgfTsKLQotc3RhdGljIGNvbnN0IHUzMiBwYWdlX3dyaXRlX3JlZ3NfZTFoW10gPSB7IDAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfYWRkciBwYWdlX3JlYWRfcmVnc19lMWhbXSA9IHsKLQl7IDB4MCwgMCwgUklfRTFIX09OTElORSB9IH07Ci0KLSNkZWZpbmUgUEFHRV9NT0RFX1ZBTFVFU19FMiAyCi0KLSNkZWZpbmUgUEFHRV9SRUFEX1JFR1NfRTIgMQotCi0jZGVmaW5lIFBBR0VfV1JJVEVfUkVHU19FMiAxCi0KLXN0YXRpYyBjb25zdCB1MzIgcGFnZV92YWxzX2UyW1BBR0VfTU9ERV9WQUxVRVNfRTJdID0geyAwLCAxMjggfTsKLQotc3RhdGljIGNvbnN0IHUzMiBwYWdlX3dyaXRlX3JlZ3NfZTJbUEFHRV9XUklURV9SRUdTX0UyXSA9IHsgMzI4NDc2IH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2FkZHIgcGFnZV9yZWFkX3JlZ3NfZTJbUEFHRV9SRUFEX1JFR1NfRTJdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfYWRkciBwYWdlX3JlYWRfcmVnc19lMltdID0gewogCXsgMHg1ODAwMCwgNDYwOCwgUklfRTJfT05MSU5FIH0gfTsKKyNkZWZpbmUgUEFHRV9SRUFEX1JFR1NfRTIJCUFSUkFZX1NJWkUocGFnZV9yZWFkX3JlZ3NfZTIpCisKK3N0YXRpYyBjb25zdCB1MzIgcGFnZV92YWxzX2UzW10gPSB7IDAsIDEyOCB9OworI2RlZmluZSBQQUdFX01PREVfVkFMVUVTX0UzCQlBUlJBWV9TSVpFKHBhZ2VfdmFsc19lMykKKworc3RhdGljIGNvbnN0IHUzMiBwYWdlX3dyaXRlX3JlZ3NfZTNbXSA9IHsgMzI4NDc2IH07CisjZGVmaW5lIFBBR0VfV1JJVEVfUkVHU19FMwkJQVJSQVlfU0laRShwYWdlX3dyaXRlX3JlZ3NfZTMpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2FkZHIgcGFnZV9yZWFkX3JlZ3NfZTNbXSA9IHsKKwl7IDB4NTgwMDAsIDQ2MDgsIFJJX0UzRTNCMF9PTkxJTkUgfSB9OworI2RlZmluZSBQQUdFX1JFQURfUkVHU19FMwkJQVJSQVlfU0laRShwYWdlX3JlYWRfcmVnc19lMykKIAogI2VuZGlmIC8qIEJOWDJYX0RVTVBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfZXRodG9vbC5jCmluZGV4IDcyN2ZlODkuLjIyMTg2MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9ldGh0b29sLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJibngyeF9jbW4uaCIKICNpbmNsdWRlICJibngyeF9kdW1wLmgiCiAjaW5jbHVkZSAiYm54MnhfaW5pdC5oIgorI2luY2x1ZGUgImJueDJ4X3NwLmgiCiAKIC8qIE5vdGU6IGluIHRoZSBmb3JtYXQgc3RyaW5ncyBiZWxvdyAlcyBpcyByZXBsYWNlZCBieSB0aGUgcXVldWUtbmFtZSB3aGljaCBpcwogICogZWl0aGVyIGl0cyBpbmRleCBvciAnZmNvZScgZm9yIHRoZSBmY29lIHF1ZXVlLiBNYWtlIHN1cmUgdGhlIGZvcm1hdCBzdHJpbmcKQEAgLTM3LDggKzM4LDYgQEAKIAljaGFyIHN0cmluZ1tFVEhfR1NUUklOR19MRU5dOwogfSBibngyeF9xX3N0YXRzX2FycltdID0gewogLyogMSAqLwl7IFFfU1RBVFNfT0ZGU0VUMzIodG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGkpLCA4LCAiWyVzXTogcnhfYnl0ZXMiIH0sCi0JeyBRX1NUQVRTX09GRlNFVDMyKGVycm9yX2J5dGVzX3JlY2VpdmVkX2hpKSwKLQkJCQkJCTgsICJbJXNdOiByeF9lcnJvcl9ieXRlcyIgfSwKIAl7IFFfU1RBVFNfT0ZGU0VUMzIodG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKSwKIAkJCQkJCTgsICJbJXNdOiByeF91Y2FzdF9wYWNrZXRzIiB9LAogCXsgUV9TVEFUU19PRkZTRVQzMih0b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSksCkBAIC01MiwxMyArNTEsMTggQEAKIAkJCQkJIDQsICJbJXNdOiByeF9za2JfYWxsb2NfZGlzY2FyZCIgfSwKIAl7IFFfU1RBVFNfT0ZGU0VUMzIoaHdfY3N1bV9lcnIpLCA0LCAiWyVzXTogcnhfY3N1bV9vZmZsb2FkX2Vycm9ycyIgfSwKIAotLyogMTAgKi97IFFfU1RBVFNfT0ZGU0VUMzIodG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfaGkpLAk4LCAiWyVzXTogdHhfYnl0ZXMiIH0sCi0JeyBRX1NUQVRTX09GRlNFVDMyKHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaSksCisJeyBRX1NUQVRTX09GRlNFVDMyKHRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hpKSwJOCwgIlslc106IHR4X2J5dGVzIiB9LAorLyogMTAgKi97IFFfU1RBVFNfT0ZGU0VUMzIodG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpKSwKIAkJCQkJCTgsICJbJXNdOiB0eF91Y2FzdF9wYWNrZXRzIiB9LAogCXsgUV9TVEFUU19PRkZTRVQzMih0b3RhbF9tdWx0aWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaSksCiAJCQkJCQk4LCAiWyVzXTogdHhfbWNhc3RfcGFja2V0cyIgfSwKIAl7IFFfU1RBVFNfT0ZGU0VUMzIodG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGkpLAotCQkJCQkJOCwgIlslc106IHR4X2JjYXN0X3BhY2tldHMiIH0KKwkJCQkJCTgsICJbJXNdOiB0eF9iY2FzdF9wYWNrZXRzIiB9LAorCXsgUV9TVEFUU19PRkZTRVQzMih0b3RhbF90cGFfYWdncmVnYXRpb25zX2hpKSwKKwkJCQkJCTgsICJbJXNdOiB0cGFfYWdncmVnYXRpb25zIiB9LAorCXsgUV9TVEFUU19PRkZTRVQzMih0b3RhbF90cGFfYWdncmVnYXRlZF9mcmFtZXNfaGkpLAorCQkJCQk4LCAiWyVzXTogdHBhX2FnZ3JlZ2F0ZWRfZnJhbWVzIn0sCisJeyBRX1NUQVRTX09GRlNFVDMyKHRvdGFsX3RwYV9ieXRlc19oaSksCTgsICJbJXNdOiB0cGFfYnl0ZXMifQogfTsKIAogI2RlZmluZSBCTlgyWF9OVU1fUV9TVEFUUyBBUlJBWV9TSVpFKGJueDJ4X3Ffc3RhdHNfYXJyKQpAQCAtOTgsOCArMTAyLDggQEAKIAkJCQk4LCBTVEFUU19GTEFHU19CT1RILCAicnhfZGlzY2FyZHMiIH0sCiAJeyBTVEFUU19PRkZTRVQzMihtYWNfZmlsdGVyX2Rpc2NhcmQpLAogCQkJCTQsIFNUQVRTX0ZMQUdTX1BPUlQsICJyeF9maWx0ZXJlZF9wYWNrZXRzIiB9LAotCXsgU1RBVFNfT0ZGU0VUMzIoeHhvdmVyZmxvd19kaXNjYXJkKSwKLQkJCQk0LCBTVEFUU19GTEFHU19QT1JULCAicnhfZndfZGlzY2FyZHMiIH0sCisJeyBTVEFUU19PRkZTRVQzMihtZl90YWdfZGlzY2FyZCksCisJCQkJNCwgU1RBVFNfRkxBR1NfUE9SVCwgInJ4X21mX3RhZ19kaXNjYXJkIiB9LAogCXsgU1RBVFNfT0ZGU0VUMzIoYnJiX2Ryb3BfaGkpLAogCQkJCTgsIFNUQVRTX0ZMQUdTX1BPUlQsICJyeF9icmJfZGlzY2FyZCIgfSwKIAl7IFNUQVRTX09GRlNFVDMyKGJyYl90cnVuY2F0ZV9oaSksCkBAIC0xNTgsMTAgKzE2Miw0MyBAQAogCXsgU1RBVFNfT0ZGU0VUMzIoZXRoZXJzdGF0c3BrdHNvdmVyMTUyMm9jdGV0c19oaSksCiAJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfMTUyM190b185MDIyX2J5dGVfcGFja2V0cyIgfSwKIAl7IFNUQVRTX09GRlNFVDMyKHBhdXNlX2ZyYW1lc19zZW50X2hpKSwKLQkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAidHhfcGF1c2VfZnJhbWVzIiB9CisJCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInR4X3BhdXNlX2ZyYW1lcyIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHRvdGFsX3RwYV9hZ2dyZWdhdGlvbnNfaGkpLAorCQkJOCwgU1RBVFNfRkxBR1NfRlVOQywgInRwYV9hZ2dyZWdhdGlvbnMiIH0sCisJeyBTVEFUU19PRkZTRVQzMih0b3RhbF90cGFfYWdncmVnYXRlZF9mcmFtZXNfaGkpLAorCQkJOCwgU1RBVFNfRkxBR1NfRlVOQywgInRwYV9hZ2dyZWdhdGVkX2ZyYW1lcyJ9LAorCXsgU1RBVFNfT0ZGU0VUMzIodG90YWxfdHBhX2J5dGVzX2hpKSwKKwkJCTgsIFNUQVRTX0ZMQUdTX0ZVTkMsICJ0cGFfYnl0ZXMifQogfTsKIAogI2RlZmluZSBCTlgyWF9OVU1fU1RBVFMJCUFSUkFZX1NJWkUoYm54Mnhfc3RhdHNfYXJyKQorc3RhdGljIGludCBibngyeF9nZXRfcG9ydF90eXBlKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHBvcnRfdHlwZTsKKwl1MzIgcGh5X2lkeCA9IGJueDJ4X2dldF9jdXJfcGh5X2lkeChicCk7CisJc3dpdGNoIChicC0+bGlua19wYXJhbXMucGh5W3BoeV9pZHhdLm1lZGlhX3R5cGUpIHsKKwljYXNlIEVUSF9QSFlfU0ZQX0ZJQkVSOgorCWNhc2UgRVRIX1BIWV9YRlBfRklCRVI6CisJY2FzZSBFVEhfUEhZX0tSOgorCWNhc2UgRVRIX1BIWV9DWDQ6CisJCXBvcnRfdHlwZSA9IFBPUlRfRklCUkU7CisJCWJyZWFrOworCWNhc2UgRVRIX1BIWV9EQV9UV0lOQVg6CisJCXBvcnRfdHlwZSA9IFBPUlRfREE7CisJCWJyZWFrOworCWNhc2UgRVRIX1BIWV9CQVNFX1Q6CisJCXBvcnRfdHlwZSA9IFBPUlRfVFA7CisJCWJyZWFrOworCWNhc2UgRVRIX1BIWV9OT1RfUFJFU0VOVDoKKwkJcG9ydF90eXBlID0gUE9SVF9OT05FOworCQlicmVhazsKKwljYXNlIEVUSF9QSFlfVU5TUEVDSUZJRUQ6CisJZGVmYXVsdDoKKwkJcG9ydF90eXBlID0gUE9SVF9PVEhFUjsKKwkJYnJlYWs7CisJfQorCXJldHVybiBwb3J0X3R5cGU7Cit9CiAKIHN0YXRpYyBpbnQgYm54MnhfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewpAQCAtMTg4LDEyICsyMjUsNyBAQAogCWlmIChJU19NRihicCkpCiAJCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIGJueDJ4X2dldF9tZl9zcGVlZChicCkpOwogCi0JaWYgKGJwLT5wb3J0LnN1cHBvcnRlZFtjZmdfaWR4XSAmIFNVUFBPUlRFRF9UUCkKLQkJY21kLT5wb3J0ID0gUE9SVF9UUDsKLQllbHNlIGlmIChicC0+cG9ydC5zdXBwb3J0ZWRbY2ZnX2lkeF0gJiBTVVBQT1JURURfRklCUkUpCi0JCWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7Ci0JZWxzZQotCQlCTlgyWF9FUlIoIlhHWFMgUEhZIEZhaWx1cmUgZGV0ZWN0ZWRcbiIpOworCWNtZC0+cG9ydCA9IGJueDJ4X2dldF9wb3J0X3R5cGUoYnApOwogCiAJY21kLT5waHlfYWRkcmVzcyA9IGJwLT5tZGlvLnBydGFkOwogCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOwpAQCAtNDY4LDc4ICs1MDAsMTc5IEBACiAjZGVmaW5lIElTX0UxX09OTElORShpbmZvKQkoKChpbmZvKSAmIFJJX0UxX09OTElORSkgPT0gUklfRTFfT05MSU5FKQogI2RlZmluZSBJU19FMUhfT05MSU5FKGluZm8pCSgoKGluZm8pICYgUklfRTFIX09OTElORSkgPT0gUklfRTFIX09OTElORSkKICNkZWZpbmUgSVNfRTJfT05MSU5FKGluZm8pCSgoKGluZm8pICYgUklfRTJfT05MSU5FKSA9PSBSSV9FMl9PTkxJTkUpCisjZGVmaW5lIElTX0UzX09OTElORShpbmZvKQkoKChpbmZvKSAmIFJJX0UzX09OTElORSkgPT0gUklfRTNfT05MSU5FKQorI2RlZmluZSBJU19FM0IwX09OTElORShpbmZvKQkoKChpbmZvKSAmIFJJX0UzQjBfT05MSU5FKSA9PSBSSV9FM0IwX09OTElORSkKKworc3RhdGljIGlubGluZSBib29sIGJueDJ4X2lzX3JlZ19vbmxpbmUoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHJlZ19hZGRyICpyZWdfaW5mbykKK3sKKwlpZiAoQ0hJUF9JU19FMShicCkpCisJCXJldHVybiBJU19FMV9PTkxJTkUocmVnX2luZm8tPmluZm8pOworCWVsc2UgaWYgKENISVBfSVNfRTFIKGJwKSkKKwkJcmV0dXJuIElTX0UxSF9PTkxJTkUocmVnX2luZm8tPmluZm8pOworCWVsc2UgaWYgKENISVBfSVNfRTIoYnApKQorCQlyZXR1cm4gSVNfRTJfT05MSU5FKHJlZ19pbmZvLT5pbmZvKTsKKwllbHNlIGlmIChDSElQX0lTX0UzQTAoYnApKQorCQlyZXR1cm4gSVNfRTNfT05MSU5FKHJlZ19pbmZvLT5pbmZvKTsKKwllbHNlIGlmIChDSElQX0lTX0UzQjAoYnApKQorCQlyZXR1cm4gSVNfRTNCMF9PTkxJTkUocmVnX2luZm8tPmluZm8pOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCisvKioqKioqKiBQYWdlZCByZWdpc3RlcnMgaW5mbyBzZWxlY3RvcnMgKioqKioqKiovCitzdGF0aWMgaW5saW5lIGNvbnN0IHUzMiAqX19ibngyeF9nZXRfcGFnZV9hZGRyX2FyKHN0cnVjdCBibngyeCAqYnApCit7CisJaWYgKENISVBfSVNfRTIoYnApKQorCQlyZXR1cm4gcGFnZV92YWxzX2UyOworCWVsc2UgaWYgKENISVBfSVNfRTMoYnApKQorCQlyZXR1cm4gcGFnZV92YWxzX2UzOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIF9fYm54MnhfZ2V0X3BhZ2VfcmVnX251bShzdHJ1Y3QgYm54MnggKmJwKQoreworCWlmIChDSElQX0lTX0UyKGJwKSkKKwkJcmV0dXJuIFBBR0VfTU9ERV9WQUxVRVNfRTI7CisJZWxzZSBpZiAoQ0hJUF9JU19FMyhicCkpCisJCXJldHVybiBQQUdFX01PREVfVkFMVUVTX0UzOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgdTMyICpfX2JueDJ4X2dldF9wYWdlX3dyaXRlX2FyKHN0cnVjdCBibngyeCAqYnApCit7CisJaWYgKENISVBfSVNfRTIoYnApKQorCQlyZXR1cm4gcGFnZV93cml0ZV9yZWdzX2UyOworCWVsc2UgaWYgKENISVBfSVNfRTMoYnApKQorCQlyZXR1cm4gcGFnZV93cml0ZV9yZWdzX2UzOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIF9fYm54MnhfZ2V0X3BhZ2Vfd3JpdGVfbnVtKHN0cnVjdCBibngyeCAqYnApCit7CisJaWYgKENISVBfSVNfRTIoYnApKQorCQlyZXR1cm4gUEFHRV9XUklURV9SRUdTX0UyOworCWVsc2UgaWYgKENISVBfSVNfRTMoYnApKQorCQlyZXR1cm4gUEFHRV9XUklURV9SRUdTX0UzOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHJlZ19hZGRyICpfX2JueDJ4X2dldF9wYWdlX3JlYWRfYXIoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpZiAoQ0hJUF9JU19FMihicCkpCisJCXJldHVybiBwYWdlX3JlYWRfcmVnc19lMjsKKwllbHNlIGlmIChDSElQX0lTX0UzKGJwKSkKKwkJcmV0dXJuIHBhZ2VfcmVhZF9yZWdzX2UzOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIF9fYm54MnhfZ2V0X3BhZ2VfcmVhZF9udW0oc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpZiAoQ0hJUF9JU19FMihicCkpCisJCXJldHVybiBQQUdFX1JFQURfUkVHU19FMjsKKwllbHNlIGlmIChDSElQX0lTX0UzKGJwKSkKKwkJcmV0dXJuIFBBR0VfUkVBRF9SRUdTX0UzOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fYm54MnhfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IG51bV9wYWdlcyA9IF9fYm54MnhfZ2V0X3BhZ2VfcmVnX251bShicCk7CisJaW50IHBhZ2Vfd3JpdGVfbnVtID0gX19ibngyeF9nZXRfcGFnZV93cml0ZV9udW0oYnApOworCWNvbnN0IHN0cnVjdCByZWdfYWRkciAqcGFnZV9yZWFkX2FkZHIgPSBfX2JueDJ4X2dldF9wYWdlX3JlYWRfYXIoYnApOworCWludCBwYWdlX3JlYWRfbnVtID0gX19ibngyeF9nZXRfcGFnZV9yZWFkX251bShicCk7CisJaW50IHJlZ2R1bXBfbGVuID0gMDsKKwlpbnQgaSwgaiwgazsKKworCWZvciAoaSA9IDA7IGkgPCBSRUdTX0NPVU5UOyBpKyspCisJCWlmIChibngyeF9pc19yZWdfb25saW5lKGJwLCAmcmVnX2FkZHJzW2ldKSkKKwkJCXJlZ2R1bXBfbGVuICs9IHJlZ19hZGRyc1tpXS5zaXplOworCisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgcGFnZV93cml0ZV9udW07IGorKykKKwkJCWZvciAoayA9IDA7IGsgPCBwYWdlX3JlYWRfbnVtOyBrKyspCisJCQkJaWYgKGJueDJ4X2lzX3JlZ19vbmxpbmUoYnAsICZwYWdlX3JlYWRfYWRkcltrXSkpCisJCQkJCXJlZ2R1bXBfbGVuICs9IHBhZ2VfcmVhZF9hZGRyW2tdLnNpemU7CisKKwlyZXR1cm4gcmVnZHVtcF9sZW47Cit9CiAKIHN0YXRpYyBpbnQgYm54MnhfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJlZ2R1bXBfbGVuID0gMDsKLQlpbnQgaSwgaiwgazsKIAotCWlmIChDSElQX0lTX0UxKGJwKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgUkVHU19DT1VOVDsgaSsrKQotCQkJaWYgKElTX0UxX09OTElORShyZWdfYWRkcnNbaV0uaW5mbykpCi0JCQkJcmVnZHVtcF9sZW4gKz0gcmVnX2FkZHJzW2ldLnNpemU7Ci0KLQkJZm9yIChpID0gMDsgaSA8IFdSRUdTX0NPVU5UX0UxOyBpKyspCi0JCQlpZiAoSVNfRTFfT05MSU5FKHdyZWdfYWRkcnNfZTFbaV0uaW5mbykpCi0JCQkJcmVnZHVtcF9sZW4gKz0gd3JlZ19hZGRyc19lMVtpXS5zaXplICoKLQkJCQkJKDEgKyB3cmVnX2FkZHJzX2UxW2ldLnJlYWRfcmVnc19jb3VudCk7Ci0KLQl9IGVsc2UgaWYgKENISVBfSVNfRTFIKGJwKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgUkVHU19DT1VOVDsgaSsrKQotCQkJaWYgKElTX0UxSF9PTkxJTkUocmVnX2FkZHJzW2ldLmluZm8pKQotCQkJCXJlZ2R1bXBfbGVuICs9IHJlZ19hZGRyc1tpXS5zaXplOwotCi0JCWZvciAoaSA9IDA7IGkgPCBXUkVHU19DT1VOVF9FMUg7IGkrKykKLQkJCWlmIChJU19FMUhfT05MSU5FKHdyZWdfYWRkcnNfZTFoW2ldLmluZm8pKQotCQkJCXJlZ2R1bXBfbGVuICs9IHdyZWdfYWRkcnNfZTFoW2ldLnNpemUgKgotCQkJCQkoMSArIHdyZWdfYWRkcnNfZTFoW2ldLnJlYWRfcmVnc19jb3VudCk7Ci0JfSBlbHNlIGlmIChDSElQX0lTX0UyKGJwKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgUkVHU19DT1VOVDsgaSsrKQotCQkJaWYgKElTX0UyX09OTElORShyZWdfYWRkcnNbaV0uaW5mbykpCi0JCQkJcmVnZHVtcF9sZW4gKz0gcmVnX2FkZHJzW2ldLnNpemU7Ci0KLQkJZm9yIChpID0gMDsgaSA8IFdSRUdTX0NPVU5UX0UyOyBpKyspCi0JCQlpZiAoSVNfRTJfT05MSU5FKHdyZWdfYWRkcnNfZTJbaV0uaW5mbykpCi0JCQkJcmVnZHVtcF9sZW4gKz0gd3JlZ19hZGRyc19lMltpXS5zaXplICoKLQkJCQkJKDEgKyB3cmVnX2FkZHJzX2UyW2ldLnJlYWRfcmVnc19jb3VudCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IFBBR0VfTU9ERV9WQUxVRVNfRTI7IGkrKykKLQkJCWZvciAoaiA9IDA7IGogPCBQQUdFX1dSSVRFX1JFR1NfRTI7IGorKykgewotCQkJCWZvciAoayA9IDA7IGsgPCBQQUdFX1JFQURfUkVHU19FMjsgaysrKQotCQkJCQlpZiAoSVNfRTJfT05MSU5FKHBhZ2VfcmVhZF9yZWdzX2UyW2tdLgotCQkJCQkJCSBpbmZvKSkKLQkJCQkJCXJlZ2R1bXBfbGVuICs9Ci0JCQkJCQlwYWdlX3JlYWRfcmVnc19lMltrXS5zaXplOwotCQkJfQotCX0KKwlyZWdkdW1wX2xlbiA9IF9fYm54MnhfZ2V0X3JlZ3NfbGVuKGJwKTsKIAlyZWdkdW1wX2xlbiAqPSA0OwogCXJlZ2R1bXBfbGVuICs9IHNpemVvZihzdHJ1Y3QgZHVtcF9oZHIpOwogCiAJcmV0dXJuIHJlZ2R1bXBfbGVuOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfcmVhZF9wYWdlc19yZWdzX2UyKHN0cnVjdCBibngyeCAqYnAsIHUzMiAqcCkKKy8qKgorICogYm54MnhfcmVhZF9wYWdlc19yZWdzIC0gcmVhZCAicGFnZWQiIHJlZ2lzdGVycworICoKKyAqIEBicAkJZGV2aWNlIGhhbmRsZQorICogQHAJCW91dHB1dCBidWZmZXIKKyAqCisgKiBSZWFkcyAicGFnZWQiIG1lbW9yaWVzOiBtZW1vcmllcyB0aGF0IG1heSBvbmx5IGJlIHJlYWQgYnkgZmlyc3Qgd3JpdGluZyB0byBhCisgKiBzcGVjaWZpYyBhZGRyZXNzICgid3JpdGUgYWRkcmVzcyIpIGFuZCB0aGVuIHJlYWRpbmcgZnJvbSBhIHNwZWNpZmljIGFkZHJlc3MKKyAqICgicmVhZCBhZGRyZXNzIikuIFRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIHdyaXRlIGFkZHJlc3MgcGVyICJwYWdlIiBhbmQKKyAqIG1vcmUgdGhhbiBvbmUgcmVhZCBhZGRyZXNzIHBlciB3cml0ZSBhZGRyZXNzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfcmVhZF9wYWdlc19yZWdzKHN0cnVjdCBibngyeCAqYnAsIHUzMiAqcCkKIHsKIAl1MzIgaSwgaiwgaywgbjsKKwkvKiBhZGRyZXNzZXMgb2YgdGhlIHBhZ2VkIHJlZ2lzdGVycyAqLworCWNvbnN0IHUzMiAqcGFnZV9hZGRyID0gX19ibngyeF9nZXRfcGFnZV9hZGRyX2FyKGJwKTsKKwkvKiBudW1iZXIgb2YgcGFnZWQgcmVnaXN0ZXJzICovCisJaW50IG51bV9wYWdlcyA9IF9fYm54MnhfZ2V0X3BhZ2VfcmVnX251bShicCk7CisJLyogd3JpdGUgYWRkcmVzc2VzICovCisJY29uc3QgdTMyICp3cml0ZV9hZGRyID0gX19ibngyeF9nZXRfcGFnZV93cml0ZV9hcihicCk7CisJLyogbnVtYmVyIG9mIHdyaXRlIGFkZHJlc3NlcyAqLworCWludCB3cml0ZV9udW0gPSBfX2JueDJ4X2dldF9wYWdlX3dyaXRlX251bShicCk7CisJLyogcmVhZCBhZGRyZXNzZXMgaW5mbyAqLworCWNvbnN0IHN0cnVjdCByZWdfYWRkciAqcmVhZF9hZGRyID0gX19ibngyeF9nZXRfcGFnZV9yZWFkX2FyKGJwKTsKKwkvKiBudW1iZXIgb2YgcmVhZCBhZGRyZXNzZXMgKi8KKwlpbnQgcmVhZF9udW0gPSBfX2JueDJ4X2dldF9wYWdlX3JlYWRfbnVtKGJwKTsKIAotCWZvciAoaSA9IDA7IGkgPCBQQUdFX01PREVfVkFMVUVTX0UyOyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IFBBR0VfV1JJVEVfUkVHU19FMjsgaisrKSB7Ci0JCQlSRUdfV1IoYnAsIHBhZ2Vfd3JpdGVfcmVnc19lMltqXSwgcGFnZV92YWxzX2UyW2ldKTsKLQkJCWZvciAoayA9IDA7IGsgPCBQQUdFX1JFQURfUkVHU19FMjsgaysrKQotCQkJCWlmIChJU19FMl9PTkxJTkUocGFnZV9yZWFkX3JlZ3NfZTJba10uaW5mbykpCisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCB3cml0ZV9udW07IGorKykgeworCQkJUkVHX1dSKGJwLCB3cml0ZV9hZGRyW2pdLCBwYWdlX2FkZHJbaV0pOworCQkJZm9yIChrID0gMDsgayA8IHJlYWRfbnVtOyBrKyspCisJCQkJaWYgKGJueDJ4X2lzX3JlZ19vbmxpbmUoYnAsICZyZWFkX2FkZHJba10pKQogCQkJCQlmb3IgKG4gPSAwOyBuIDwKLQkJCQkJICAgICAgcGFnZV9yZWFkX3JlZ3NfZTJba10uc2l6ZTsgbisrKQorCQkJCQkgICAgICByZWFkX2FkZHJba10uc2l6ZTsgbisrKQogCQkJCQkJKnArKyA9IFJFR19SRChicCwKLQkJCQkJcGFnZV9yZWFkX3JlZ3NfZTJba10uYWRkciArIG4qNCk7CisJCQkJCQkgICAgICAgcmVhZF9hZGRyW2tdLmFkZHIgKyBuKjQpOwogCQl9CiAJfQogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19ibngyeF9nZXRfcmVncyhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgKnApCit7CisJdTMyIGksIGo7CisKKwkvKiBSZWFkIHRoZSByZWd1bGFyIHJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBSRUdTX0NPVU5UOyBpKyspCisJCWlmIChibngyeF9pc19yZWdfb25saW5lKGJwLCAmcmVnX2FkZHJzW2ldKSkKKwkJCWZvciAoaiA9IDA7IGogPCByZWdfYWRkcnNbaV0uc2l6ZTsgaisrKQorCQkJCSpwKysgPSBSRUdfUkQoYnAsIHJlZ19hZGRyc1tpXS5hZGRyICsgaio0KTsKKworCS8qIFJlYWQgInBhZ2VkIiByZWdpc3RlcyAqLworCWJueDJ4X3JlYWRfcGFnZXNfcmVncyhicCwgcCk7Cit9CisKIHN0YXRpYyB2b2lkIGJueDJ4X2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpfcCkKIHsKLQl1MzIgKnAgPSBfcCwgaSwgajsKKwl1MzIgKnAgPSBfcDsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZHVtcF9oZHIgZHVtcF9oZHIgPSB7MH07CiAKQEAgLTU2Niw0NCArNjk5LDIxIEBACiAJCWR1bXBfaGRyLmluZm8gPSBSSV9FMV9PTkxJTkU7CiAJZWxzZSBpZiAoQ0hJUF9JU19FMUgoYnApKQogCQlkdW1wX2hkci5pbmZvID0gUklfRTFIX09OTElORTsKLQllbHNlIGlmIChDSElQX0lTX0UyKGJwKSkKKwllbHNlIGlmICghQ0hJUF9JU19FMXgoYnApKQogCQlkdW1wX2hkci5pbmZvID0gUklfRTJfT05MSU5FIHwKIAkJKEJQX1BBVEgoYnApID8gUklfUEFUSDFfRFVNUCA6IFJJX1BBVEgwX0RVTVApOwogCiAJbWVtY3B5KHAsICZkdW1wX2hkciwgc2l6ZW9mKHN0cnVjdCBkdW1wX2hkcikpOwogCXAgKz0gZHVtcF9oZHIuaGRyX3NpemUgKyAxOwogCi0JaWYgKENISVBfSVNfRTEoYnApKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBSRUdTX0NPVU5UOyBpKyspCi0JCQlpZiAoSVNfRTFfT05MSU5FKHJlZ19hZGRyc1tpXS5pbmZvKSkKLQkJCQlmb3IgKGogPSAwOyBqIDwgcmVnX2FkZHJzW2ldLnNpemU7IGorKykKLQkJCQkJKnArKyA9IFJFR19SRChicCwKLQkJCQkJCSAgICAgIHJlZ19hZGRyc1tpXS5hZGRyICsgaio0KTsKKwkvKiBBY3R1YWxseSByZWFkIHRoZSByZWdpc3RlcnMgKi8KKwlfX2JueDJ4X2dldF9yZWdzKGJwLCBwKTsKIAotCX0gZWxzZSBpZiAoQ0hJUF9JU19FMUgoYnApKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBSRUdTX0NPVU5UOyBpKyspCi0JCQlpZiAoSVNfRTFIX09OTElORShyZWdfYWRkcnNbaV0uaW5mbykpCi0JCQkJZm9yIChqID0gMDsgaiA8IHJlZ19hZGRyc1tpXS5zaXplOyBqKyspCi0JCQkJCSpwKysgPSBSRUdfUkQoYnAsCi0JCQkJCQkgICAgICByZWdfYWRkcnNbaV0uYWRkciArIGoqNCk7Ci0KLQl9IGVsc2UgaWYgKENISVBfSVNfRTIoYnApKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBSRUdTX0NPVU5UOyBpKyspCi0JCQlpZiAoSVNfRTJfT05MSU5FKHJlZ19hZGRyc1tpXS5pbmZvKSkKLQkJCQlmb3IgKGogPSAwOyBqIDwgcmVnX2FkZHJzW2ldLnNpemU7IGorKykKLQkJCQkJKnArKyA9IFJFR19SRChicCwKLQkJCQkJICAgICAgcmVnX2FkZHJzW2ldLmFkZHIgKyBqKjQpOwotCi0JCWJueDJ4X3JlYWRfcGFnZXNfcmVnc19lMihicCwgcCk7Ci0JfQogCS8qIFJlLWVuYWJsZSBwYXJpdHkgYXR0ZW50aW9ucyAqLwogCWJueDJ4X2NsZWFyX2Jsb2Nrc19wYXJpdHkoYnApOwotCWlmIChDSElQX1BBUklUWV9FTkFCTEVEKGJwKSkKLQkJYm54MnhfZW5hYmxlX2Jsb2Nrc19wYXJpdHkoYnApOworCWJueDJ4X2VuYWJsZV9ibG9ja3NfcGFyaXR5KGJwKTsKIH0KIAotI2RlZmluZSBQSFlfRldfVkVSX0xFTgkJCTIwCi0KIHN0YXRpYyB2b2lkIGJueDJ4X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewpAQCAtNjgyLDggKzc5MiwxMiBAQAogewogCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJLyogZHVtcCBNQ1AgdHJhY2UgKi8KKwkJaWYgKGxldmVsICYgQk5YMlhfTVNHX01DUCkKKwkJCWJueDJ4X2Z3X2R1bXBfbHZsKGJwLCBLRVJOX0lORk8pOwogCQlicC0+bXNnX2VuYWJsZSA9IGxldmVsOworCX0KIH0KIAogc3RhdGljIGludCBibngyeF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC03MjUsNyArODM5LDcgQEAKIAl1MzIgdmFsID0gMDsKIAogCS8qIGFkanVzdCB0aW1lb3V0IGZvciBlbXVsYXRpb24vRlBHQSAqLwotCWNvdW50ID0gTlZSQU1fVElNRU9VVF9DT1VOVDsKKwljb3VudCA9IEJOWDJYX05WUkFNX1RJTUVPVVRfQ09VTlQ7CiAJaWYgKENISVBfUkVWX0lTX1NMT1coYnApKQogCQljb3VudCAqPSAxMDA7CiAKQEAgLTc1Niw3ICs4NzAsNyBAQAogCXUzMiB2YWwgPSAwOwogCiAJLyogYWRqdXN0IHRpbWVvdXQgZm9yIGVtdWxhdGlvbi9GUEdBICovCi0JY291bnQgPSBOVlJBTV9USU1FT1VUX0NPVU5UOworCWNvdW50ID0gQk5YMlhfTlZSQU1fVElNRU9VVF9DT1VOVDsKIAlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkpCiAJCWNvdW50ICo9IDEwMDsKIApAQCAtODI0LDcgKzkzOCw3IEBACiAJUkVHX1dSKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0NPTU1BTkQsIGNtZF9mbGFncyk7CiAKIAkvKiBhZGp1c3QgdGltZW91dCBmb3IgZW11bGF0aW9uL0ZQR0EgKi8KLQljb3VudCA9IE5WUkFNX1RJTUVPVVRfQ09VTlQ7CisJY291bnQgPSBCTlgyWF9OVlJBTV9USU1FT1VUX0NPVU5UOwogCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKIAkJY291bnQgKj0gMTAwOwogCkBAIC05NDcsNyArMTA2MSw3IEBACiAJUkVHX1dSKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0NPTU1BTkQsIGNtZF9mbGFncyk7CiAKIAkvKiBhZGp1c3QgdGltZW91dCBmb3IgZW11bGF0aW9uL0ZQR0EgKi8KLQljb3VudCA9IE5WUkFNX1RJTUVPVVRfQ09VTlQ7CisJY291bnQgPSBCTlgyWF9OVlJBTV9USU1FT1VUX0NPVU5UOwogCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkKIAkJY291bnQgKj0gMTAwOwogCkBAIC0xMDUxLDkgKzExNjUsOSBAQAogCXdoaWxlICgod3JpdHRlbl9zb19mYXIgPCBidWZfc2l6ZSkgJiYgKHJjID09IDApKSB7CiAJCWlmICh3cml0dGVuX3NvX2ZhciA9PSAoYnVmX3NpemUgLSBzaXplb2YodTMyKSkpCiAJCQljbWRfZmxhZ3MgfD0gTUNQUl9OVk1fQ09NTUFORF9MQVNUOwotCQllbHNlIGlmICgoKG9mZnNldCArIDQpICUgTlZSQU1fUEFHRV9TSVpFKSA9PSAwKQorCQllbHNlIGlmICgoKG9mZnNldCArIDQpICUgQk5YMlhfTlZSQU1fUEFHRV9TSVpFKSA9PSAwKQogCQkJY21kX2ZsYWdzIHw9IE1DUFJfTlZNX0NPTU1BTkRfTEFTVDsKLQkJZWxzZSBpZiAoKG9mZnNldCAlIE5WUkFNX1BBR0VfU0laRSkgPT0gMCkKKwkJZWxzZSBpZiAoKG9mZnNldCAlIEJOWDJYX05WUkFNX1BBR0VfU0laRSkgPT0gMCkKIAkJCWNtZF9mbGFncyB8PSBNQ1BSX05WTV9DT01NQU5EX0ZJUlNUOwogCiAJCW1lbWNweSgmdmFsLCBkYXRhX2J1ZiwgNCk7CkBAIC0xMjEyLDcgKzEzMjYsNiBAQAogCQkJICAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqZXJpbmcpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHJjID0gMDsKIAogCWlmIChicC0+cmVjb3Zlcnlfc3RhdGUgIT0gQk5YMlhfUkVDT1ZFUllfRE9ORSkgewogCQlwcmludGsoS0VSTl9FUlIgIkhhbmRsaW5nIHBhcml0eSBlcnJvciByZWNvdmVyeS4gVHJ5IGFnYWluIGxhdGVyXG4iKTsKQEAgLTEyMjksMTIgKzEzNDIsNyBAQAogCWJwLT5yeF9yaW5nX3NpemUgPSBlcmluZy0+cnhfcGVuZGluZzsKIAlicC0+dHhfcmluZ19zaXplID0gZXJpbmctPnR4X3BlbmRpbmc7CiAKLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCWJueDJ4X25pY191bmxvYWQoYnAsIFVOTE9BRF9OT1JNQUwpOwotCQlyYyA9IGJueDJ4X25pY19sb2FkKGJwLCBMT0FEX05PUk1BTCk7Ci0JfQotCi0JcmV0dXJuIHJjOworCXJldHVybiBibngyeF9yZWxvYWRfaWZfcnVubmluZyhkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBibngyeF9nZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTMxMyw2MCArMTQyMSwxMjkgQEAKIAl7ICJpZGxlIGNoZWNrIChvbmxpbmUpIiB9CiB9OwogCitlbnVtIHsKKwlCTlgyWF9DSElQX0UxX09GU1QgPSAwLAorCUJOWDJYX0NISVBfRTFIX09GU1QsCisJQk5YMlhfQ0hJUF9FMl9PRlNULAorCUJOWDJYX0NISVBfRTNfT0ZTVCwKKwlCTlgyWF9DSElQX0UzQjBfT0ZTVCwKKwlCTlgyWF9DSElQX01BWF9PRlNUCit9OworCisjZGVmaW5lIEJOWDJYX0NISVBfTUFTS19FMQkoMSA8PCBCTlgyWF9DSElQX0UxX09GU1QpCisjZGVmaW5lIEJOWDJYX0NISVBfTUFTS19FMUgJKDEgPDwgQk5YMlhfQ0hJUF9FMUhfT0ZTVCkKKyNkZWZpbmUgQk5YMlhfQ0hJUF9NQVNLX0UyCSgxIDw8IEJOWDJYX0NISVBfRTJfT0ZTVCkKKyNkZWZpbmUgQk5YMlhfQ0hJUF9NQVNLX0UzCSgxIDw8IEJOWDJYX0NISVBfRTNfT0ZTVCkKKyNkZWZpbmUgQk5YMlhfQ0hJUF9NQVNLX0UzQjAJKDEgPDwgQk5YMlhfQ0hJUF9FM0IwX09GU1QpCisKKyNkZWZpbmUgQk5YMlhfQ0hJUF9NQVNLX0FMTAkoKDEgPDwgQk5YMlhfQ0hJUF9NQVhfT0ZTVCkgLSAxKQorI2RlZmluZSBCTlgyWF9DSElQX01BU0tfRTFYCShCTlgyWF9DSElQX01BU0tfRTEgfCBCTlgyWF9DSElQX01BU0tfRTFIKQorCiBzdGF0aWMgaW50IGJueDJ4X3Rlc3RfcmVnaXN0ZXJzKHN0cnVjdCBibngyeCAqYnApCiB7CiAJaW50IGlkeCwgaSwgcmMgPSAtRU5PREVWOwotCXUzMiB3cl92YWwgPSAwOworCXUzMiB3cl92YWwgPSAwLCBodzsKIAlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQl1MzIgaHc7CiAJCXUzMiBvZmZzZXQwOwogCQl1MzIgb2Zmc2V0MTsKIAkJdTMyIG1hc2s7CiAJfSByZWdfdGJsW10gPSB7Ci0vKiAwICovCQl7IEJSQjFfUkVHX1BBVVNFX0xPV19USFJFU0hPTERfMCwgICAgICA0LCAweDAwMDAwM2ZmIH0sCi0JCXsgRE9SUV9SRUdfREJfQUREUjAsICAgICAgICAgICAgICAgICAgIDQsIDB4ZmZmZmZmZmYgfSwKLQkJeyBIQ19SRUdfQUdHX0lOVF8wLCAgICAgICAgICAgICAgICAgICAgNCwgMHgwMDAwMDNmZiB9LAotCQl7IFBCRl9SRUdfTUFDX0lGMF9FTkFCTEUsICAgICAgICAgICAgICA0LCAweDAwMDAwMDAxIH0sCi0JCXsgUEJGX1JFR19QMF9JTklUX0NSRCwgICAgICAgICAgICAgICAgIDQsIDB4MDAwMDA3ZmYgfSwKLQkJeyBQUlNfUkVHX0NJRF9QT1JUXzAsICAgICAgICAgICAgICAgICAgNCwgMHgwMGZmZmZmZiB9LAotCQl7IFBYUDJfUkVHX1BTV1JRX0NEVTBfTDJQLCAgICAgICAgICAgICA0LCAweDAwMGZmZmZmIH0sCi0JCXsgUFhQMl9SRUdfUlFfQ0RVMF9FRklSU1RfTUVNX0FERFIsICAgIDgsIDB4MDAwM2ZmZmYgfSwKLQkJeyBQWFAyX1JFR19QU1dSUV9UTTBfTDJQLCAgICAgICAgICAgICAgNCwgMHgwMDBmZmZmZiB9LAotCQl7IFBYUDJfUkVHX1JRX1VTRE0wX0VGSVJTVF9NRU1fQUREUiwgICA4LCAweDAwMDNmZmZmIH0sCi0vKiAxMCAqLwl7IFBYUDJfUkVHX1BTV1JRX1RTRE0wX0wyUCwgICAgICAgICAgICA0LCAweDAwMGZmZmZmIH0sCi0JCXsgUU1fUkVHX0NPTk5OVU1fMCwgICAgICAgICAgICAgICAgICAgIDQsIDB4MDAwZmZmZmYgfSwKLQkJeyBUTV9SRUdfTElOMF9NQVhfQUNUSVZFX0NJRCwgICAgICAgICAgNCwgMHgwMDAzZmZmZiB9LAotCQl7IFNSQ19SRUdfS0VZUlNTMF8wLCAgICAgICAgICAgICAgICAgIDQwLCAweGZmZmZmZmZmIH0sCi0JCXsgU1JDX1JFR19LRVlSU1MwXzcsICAgICAgICAgICAgICAgICAgNDAsIDB4ZmZmZmZmZmYgfSwKLQkJeyBYQ01fUkVHX1dVX0RBX1NFVF9UTVJfQ05UX0ZMR19DTUQwMCwgNCwgMHgwMDAwMDAwMSB9LAotCQl7IFhDTV9SRUdfV1VfREFfQ05UX0NNRDAwLCAgICAgICAgICAgICA0LCAweDAwMDAwMDAzIH0sCi0JCXsgWENNX1JFR19HTEJfREVMX0FDS19NQVhfQ05UXzAsICAgICAgIDQsIDB4MDAwMDAwZmYgfSwKLQkJeyBOSUdfUkVHX0xMSDBfVF9CSVQsICAgICAgICAgICAgICAgICAgNCwgMHgwMDAwMDAwMSB9LAotCQl7IE5JR19SRUdfRU1BQzBfSU5fRU4sICAgICAgICAgICAgICAgICA0LCAweDAwMDAwMDAxIH0sCi0vKiAyMCAqLwl7IE5JR19SRUdfQk1BQzBfSU5fRU4sICAgICAgICAgICAgICAgICA0LCAweDAwMDAwMDAxIH0sCi0JCXsgTklHX1JFR19YQ00wX09VVF9FTiwgICAgICAgICAgICAgICAgIDQsIDB4MDAwMDAwMDEgfSwKLQkJeyBOSUdfUkVHX0JSQjBfT1VUX0VOLCAgICAgICAgICAgICAgICAgNCwgMHgwMDAwMDAwMSB9LAotCQl7IE5JR19SRUdfTExIMF9YQ01fTUFTSywgICAgICAgICAgICAgICA0LCAweDAwMDAwMDA3IH0sCi0JCXsgTklHX1JFR19MTEgwX0FDUElfUEFUXzZfTEVOLCAgICAgICAgNjgsIDB4MDAwMDAwZmYgfSwKLQkJeyBOSUdfUkVHX0xMSDBfQUNQSV9QQVRfMF9DUkMsICAgICAgICA2OCwgMHhmZmZmZmZmZiB9LAotCQl7IE5JR19SRUdfTExIMF9ERVNUX01BQ18wXzAsICAgICAgICAgMTYwLCAweGZmZmZmZmZmIH0sCi0JCXsgTklHX1JFR19MTEgwX0RFU1RfSVBfMF8xLCAgICAgICAgICAxNjAsIDB4ZmZmZmZmZmYgfSwKLQkJeyBOSUdfUkVHX0xMSDBfSVBWNF9JUFY2XzAsICAgICAgICAgIDE2MCwgMHgwMDAwMDAwMSB9LAotCQl7IE5JR19SRUdfTExIMF9ERVNUX1VEUF8wLCAgICAgICAgICAgMTYwLCAweDAwMDBmZmZmIH0sCi0vKiAzMCAqLwl7IE5JR19SRUdfTExIMF9ERVNUX1RDUF8wLCAgICAgICAgICAgMTYwLCAweDAwMDBmZmZmIH0sCi0JCXsgTklHX1JFR19MTEgwX1ZMQU5fSURfMCwgICAgICAgICAgICAxNjAsIDB4MDAwMDBmZmYgfSwKLQkJeyBOSUdfUkVHX1hHWFNfU0VSREVTMF9NT0RFX1NFTCwgICAgICAgNCwgMHgwMDAwMDAwMSB9LAotCQl7IE5JR19SRUdfTEVEX0NPTlRST0xfT1ZFUlJJREVfVFJBRkZJQ19QMCwgNCwgMHgwMDAwMDAwMSB9LAotCQl7IE5JR19SRUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMCwgICAgICA0LCAweDA3ZmZmZmZmIH0sCi0JCXsgTklHX1JFR19YR1hTMF9DVFJMX0VYVFJFTU9URU1ESU9TVCwgMjQsIDB4MDAwMDAwMDEgfSwKLQkJeyBOSUdfUkVHX1NFUkRFUzBfQ1RSTF9QSFlfQUREUiwgICAgICAxNiwgMHgwMDAwMDAxZiB9LAorLyogMCAqLwkJeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJQlJCMV9SRUdfUEFVU0VfTE9XX1RIUkVTSE9MRF8wLAk0LCAweDAwMDAwM2ZmIH0sCisJCXsgQk5YMlhfQ0hJUF9NQVNLX0FMTCwKKwkJCURPUlFfUkVHX0RCX0FERFIwLAkJNCwgMHhmZmZmZmZmZiB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19FMVgsCisJCQlIQ19SRUdfQUdHX0lOVF8wLAkJNCwgMHgwMDAwMDNmZiB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19BTEwsCisJCQlQQkZfUkVHX01BQ19JRjBfRU5BQkxFLAkJNCwgMHgwMDAwMDAwMSB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19FMVggfCBCTlgyWF9DSElQX01BU0tfRTIgfCBCTlgyWF9DSElQX01BU0tfRTMsCisJCQlQQkZfUkVHX1AwX0lOSVRfQ1JELAkJNCwgMHgwMDAwMDdmZiB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19FM0IwLAorCQkJUEJGX1JFR19JTklUX0NSRF9RMCwJCTQsIDB4MDAwMDA3ZmYgfSwKKwkJeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJUFJTX1JFR19DSURfUE9SVF8wLAkJNCwgMHgwMGZmZmZmZiB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19BTEwsCisJCQlQWFAyX1JFR19QU1dSUV9DRFUwX0wyUCwJNCwgMHgwMDBmZmZmZiB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19BTEwsCisJCQlQWFAyX1JFR19SUV9DRFUwX0VGSVJTVF9NRU1fQUREUiwgOCwgMHgwMDAzZmZmZiB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19BTEwsCisJCQlQWFAyX1JFR19QU1dSUV9UTTBfTDJQLAkJNCwgMHgwMDBmZmZmZiB9LAorLyogMTAgKi8JeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJUFhQMl9SRUdfUlFfVVNETTBfRUZJUlNUX01FTV9BRERSLCA4LCAweDAwMDNmZmZmIH0sCisJCXsgQk5YMlhfQ0hJUF9NQVNLX0FMTCwKKwkJCVBYUDJfUkVHX1BTV1JRX1RTRE0wX0wyUCwJNCwgMHgwMDBmZmZmZiB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19BTEwsCisJCQlRTV9SRUdfQ09OTk5VTV8wLAkJNCwgMHgwMDBmZmZmZiB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19BTEwsCisJCQlUTV9SRUdfTElOMF9NQVhfQUNUSVZFX0NJRCwJNCwgMHgwMDAzZmZmZiB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19BTEwsCisJCQlTUkNfUkVHX0tFWVJTUzBfMCwJCTQwLCAweGZmZmZmZmZmIH0sCisJCXsgQk5YMlhfQ0hJUF9NQVNLX0FMTCwKKwkJCVNSQ19SRUdfS0VZUlNTMF83LAkJNDAsIDB4ZmZmZmZmZmYgfSwKKwkJeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJWENNX1JFR19XVV9EQV9TRVRfVE1SX0NOVF9GTEdfQ01EMDAsIDQsIDB4MDAwMDAwMDEgfSwKKwkJeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJWENNX1JFR19XVV9EQV9DTlRfQ01EMDAsCTQsIDB4MDAwMDAwMDMgfSwKKwkJeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJWENNX1JFR19HTEJfREVMX0FDS19NQVhfQ05UXzAsCTQsIDB4MDAwMDAwZmYgfSwKKwkJeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJTklHX1JFR19MTEgwX1RfQklULAkJNCwgMHgwMDAwMDAwMSB9LAorLyogMjAgKi8JeyBCTlgyWF9DSElQX01BU0tfRTFYIHwgQk5YMlhfQ0hJUF9NQVNLX0UyLAorCQkJTklHX1JFR19FTUFDMF9JTl9FTiwJCTQsIDB4MDAwMDAwMDEgfSwKKwkJeyBCTlgyWF9DSElQX01BU0tfRTFYIHwgQk5YMlhfQ0hJUF9NQVNLX0UyLAorCQkJTklHX1JFR19CTUFDMF9JTl9FTiwJCTQsIDB4MDAwMDAwMDEgfSwKKwkJeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJTklHX1JFR19YQ00wX09VVF9FTiwJCTQsIDB4MDAwMDAwMDEgfSwKKwkJeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJTklHX1JFR19CUkIwX09VVF9FTiwJCTQsIDB4MDAwMDAwMDEgfSwKKwkJeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJTklHX1JFR19MTEgwX1hDTV9NQVNLLAkJNCwgMHgwMDAwMDAwNyB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19BTEwsCisJCQlOSUdfUkVHX0xMSDBfQUNQSV9QQVRfNl9MRU4sCTY4LCAweDAwMDAwMGZmIH0sCisJCXsgQk5YMlhfQ0hJUF9NQVNLX0FMTCwKKwkJCU5JR19SRUdfTExIMF9BQ1BJX1BBVF8wX0NSQywJNjgsIDB4ZmZmZmZmZmYgfSwKKwkJeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJTklHX1JFR19MTEgwX0RFU1RfTUFDXzBfMCwJMTYwLCAweGZmZmZmZmZmIH0sCisJCXsgQk5YMlhfQ0hJUF9NQVNLX0FMTCwKKwkJCU5JR19SRUdfTExIMF9ERVNUX0lQXzBfMSwJMTYwLCAweGZmZmZmZmZmIH0sCisJCXsgQk5YMlhfQ0hJUF9NQVNLX0FMTCwKKwkJCU5JR19SRUdfTExIMF9JUFY0X0lQVjZfMCwJMTYwLCAweDAwMDAwMDAxIH0sCisvKiAzMCAqLwl7IEJOWDJYX0NISVBfTUFTS19BTEwsCisJCQlOSUdfUkVHX0xMSDBfREVTVF9VRFBfMCwJMTYwLCAweDAwMDBmZmZmIH0sCisJCXsgQk5YMlhfQ0hJUF9NQVNLX0FMTCwKKwkJCU5JR19SRUdfTExIMF9ERVNUX1RDUF8wLAkxNjAsIDB4MDAwMGZmZmYgfSwKKwkJeyBCTlgyWF9DSElQX01BU0tfQUxMLAorCQkJTklHX1JFR19MTEgwX1ZMQU5fSURfMCwJMTYwLCAweDAwMDAwZmZmIH0sCisJCXsgQk5YMlhfQ0hJUF9NQVNLX0UxWCB8IEJOWDJYX0NISVBfTUFTS19FMiwKKwkJCU5JR19SRUdfWEdYU19TRVJERVMwX01PREVfU0VMLAk0LCAweDAwMDAwMDAxIH0sCisJCXsgQk5YMlhfQ0hJUF9NQVNLX0FMTCwKKwkJCU5JR19SRUdfTEVEX0NPTlRST0xfT1ZFUlJJREVfVFJBRkZJQ19QMCwgNCwgMHgwMDAwMDAwMX0sCisJCXsgQk5YMlhfQ0hJUF9NQVNLX0FMTCwKKwkJCU5JR19SRUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMCwJNCwgMHgwN2ZmZmZmZiB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19FMVggfCBCTlgyWF9DSElQX01BU0tfRTIsCisJCQlOSUdfUkVHX1hHWFMwX0NUUkxfRVhUUkVNT1RFTURJT1NULCAyNCwgMHgwMDAwMDAwMSB9LAorCQl7IEJOWDJYX0NISVBfTUFTS19FMVggfCBCTlgyWF9DSElQX01BU0tfRTIsCisJCQlOSUdfUkVHX1NFUkRFUzBfQ1RSTF9QSFlfQUREUiwJMTYsIDB4MDAwMDAwMWYgfSwKIAotCQl7IDB4ZmZmZmZmZmYsIDAsIDB4MDAwMDAwMDAgfQorCQl7IEJOWDJYX0NISVBfTUFTS19BTEwsIDB4ZmZmZmZmZmYsIDAsIDB4MDAwMDAwMDAgfQogCX07CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCiAJCXJldHVybiByYzsKIAorCWlmIChDSElQX0lTX0UxKGJwKSkKKwkJaHcgPSBCTlgyWF9DSElQX01BU0tfRTE7CisJZWxzZSBpZiAoQ0hJUF9JU19FMUgoYnApKQorCQlodyA9IEJOWDJYX0NISVBfTUFTS19FMUg7CisJZWxzZSBpZiAoQ0hJUF9JU19FMihicCkpCisJCWh3ID0gQk5YMlhfQ0hJUF9NQVNLX0UyOworCWVsc2UgaWYgKENISVBfSVNfRTNCMChicCkpCisJCWh3ID0gQk5YMlhfQ0hJUF9NQVNLX0UzQjA7CisJZWxzZSAvKiBlMyBBMCAqLworCQlodyA9IEJOWDJYX0NISVBfTUFTS19FMzsKKwogCS8qIFJlcGVhdCB0aGUgdGVzdCB0d2ljZToKIAkgICBGaXJzdCBieSB3cml0aW5nIDB4MDAwMDAwMDAsIHNlY29uZCBieSB3cml0aW5nIDB4ZmZmZmZmZmYgKi8KIAlmb3IgKGlkeCA9IDA7IGlkeCA8IDI7IGlkeCsrKSB7CkBAIC0xMzgyLDggKzE1NTksNyBAQAogCiAJCWZvciAoaSA9IDA7IHJlZ190YmxbaV0ub2Zmc2V0MCAhPSAweGZmZmZmZmZmOyBpKyspIHsKIAkJCXUzMiBvZmZzZXQsIG1hc2ssIHNhdmVfdmFsLCB2YWw7Ci0JCQlpZiAoQ0hJUF9JU19FMihicCkgJiYKLQkJCSAgICByZWdfdGJsW2ldLm9mZnNldDAgPT0gSENfUkVHX0FHR19JTlRfMCkKKwkJCWlmICghKGh3ICYgcmVnX3RibFtpXS5odykpCiAJCQkJY29udGludWU7CiAKIAkJCW9mZnNldCA9IHJlZ190YmxbaV0ub2Zmc2V0MCArIHBvcnQqcmVnX3RibFtpXS5vZmZzZXQxOwpAQCAtMTQwMCw3ICsxNTc2LDcgQEAKIAogCQkJLyogdmVyaWZ5IHZhbHVlIGlzIGFzIGV4cGVjdGVkICovCiAJCQlpZiAoKHZhbCAmIG1hc2spICE9ICh3cl92YWwgJiBtYXNrKSkgewotCQkJCURQKE5FVElGX01TR19QUk9CRSwKKwkJCQlEUChORVRJRl9NU0dfSFcsCiAJCQkJICAgIm9mZnNldCAweCV4OiB2YWwgMHgleCAhPSAweCV4IG1hc2sgMHgleFxuIiwKIAkJCQkgICBvZmZzZXQsIHZhbCwgd3JfdmFsLCBtYXNrKTsKIAkJCQlnb3RvIHRlc3RfcmVnX2V4aXQ7CkBAIC0xNDE3LDcgKzE1OTMsNyBAQAogc3RhdGljIGludCBibngyeF90ZXN0X21lbW9yeShzdHJ1Y3QgYm54MnggKmJwKQogewogCWludCBpLCBqLCByYyA9IC1FTk9ERVY7Ci0JdTMyIHZhbDsKKwl1MzIgdmFsLCBpbmRleDsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAkJdTMyIG9mZnNldDsKIAkJaW50IHNpemU7CkBAIC0xNDMyLDMyICsxNjA4LDQ0IEBACiAKIAkJeyAweGZmZmZmZmZmLCAwIH0KIAl9OworCiAJc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJCWNoYXIgKm5hbWU7CiAJCXUzMiBvZmZzZXQ7Ci0JCXUzMiBlMV9tYXNrOwotCQl1MzIgZTFoX21hc2s7Ci0JCXUzMiBlMl9tYXNrOworCQl1MzIgaHdfbWFza1tCTlgyWF9DSElQX01BWF9PRlNUXTsKIAl9IHBydHlfdGJsW10gPSB7Ci0JCXsgIkNDTV9QUlRZX1NUUyIsICBDQ01fUkVHX0NDTV9QUlRZX1NUUywgICAweDNmZmMwLCAwLCAgIDAgfSwKLQkJeyAiQ0ZDX1BSVFlfU1RTIiwgIENGQ19SRUdfQ0ZDX1BSVFlfU1RTLCAgIDB4MiwgICAgIDB4MiwgMCB9LAotCQl7ICJETUFFX1BSVFlfU1RTIiwgRE1BRV9SRUdfRE1BRV9QUlRZX1NUUywgMCwgICAgICAgMCwgICAwIH0sCi0JCXsgIlRDTV9QUlRZX1NUUyIsICBUQ01fUkVHX1RDTV9QUlRZX1NUUywgICAweDNmZmMwLCAwLCAgIDAgfSwKLQkJeyAiVUNNX1BSVFlfU1RTIiwgIFVDTV9SRUdfVUNNX1BSVFlfU1RTLCAgIDB4M2ZmYzAsIDAsICAgMCB9LAotCQl7ICJYQ01fUFJUWV9TVFMiLCAgWENNX1JFR19YQ01fUFJUWV9TVFMsICAgMHgzZmZjMSwgMCwgICAwIH0sCisJCXsgIkNDTV9QUlRZX1NUUyIsICBDQ01fUkVHX0NDTV9QUlRZX1NUUywKKwkJCXsweDNmZmMwLCAwLCAgIDAsIDB9IH0sCisJCXsgIkNGQ19QUlRZX1NUUyIsICBDRkNfUkVHX0NGQ19QUlRZX1NUUywKKwkJCXsweDIsICAgICAweDIsIDAsIDB9IH0sCisJCXsgIkRNQUVfUFJUWV9TVFMiLCBETUFFX1JFR19ETUFFX1BSVFlfU1RTLAorCQkJezAsICAgICAgIDAsICAgMCwgMH0gfSwKKwkJeyAiVENNX1BSVFlfU1RTIiwgIFRDTV9SRUdfVENNX1BSVFlfU1RTLAorCQkJezB4M2ZmYzAsIDAsICAgMCwgMH0gfSwKKwkJeyAiVUNNX1BSVFlfU1RTIiwgIFVDTV9SRUdfVUNNX1BSVFlfU1RTLAorCQkJezB4M2ZmYzAsIDAsICAgMCwgMH0gfSwKKwkJeyAiWENNX1BSVFlfU1RTIiwgIFhDTV9SRUdfWENNX1BSVFlfU1RTLAorCQkJezB4M2ZmYzEsIDAsICAgMCwgMH0gfSwKIAotCQl7IE5VTEwsIDB4ZmZmZmZmZmYsIDAsIDAsIDAgfQorCQl7IE5VTEwsIDB4ZmZmZmZmZmYsIHswLCAwLCAwLCAwfSB9CiAJfTsKIAogCWlmICghbmV0aWZfcnVubmluZyhicC0+ZGV2KSkKIAkJcmV0dXJuIHJjOwogCisJaWYgKENISVBfSVNfRTEoYnApKQorCQlpbmRleCA9IEJOWDJYX0NISVBfRTFfT0ZTVDsKKwllbHNlIGlmIChDSElQX0lTX0UxSChicCkpCisJCWluZGV4ID0gQk5YMlhfQ0hJUF9FMUhfT0ZTVDsKKwllbHNlIGlmIChDSElQX0lTX0UyKGJwKSkKKwkJaW5kZXggPSBCTlgyWF9DSElQX0UyX09GU1Q7CisJZWxzZSAvKiBlMyAqLworCQlpbmRleCA9IEJOWDJYX0NISVBfRTNfT0ZTVDsKKwogCS8qIHByZS1DaGVjayB0aGUgcGFyaXR5IHN0YXR1cyAqLwogCWZvciAoaSA9IDA7IHBydHlfdGJsW2ldLm9mZnNldCAhPSAweGZmZmZmZmZmOyBpKyspIHsKIAkJdmFsID0gUkVHX1JEKGJwLCBwcnR5X3RibFtpXS5vZmZzZXQpOwotCQlpZiAoKENISVBfSVNfRTEoYnApICYmICh2YWwgJiB+KHBydHlfdGJsW2ldLmUxX21hc2spKSkgfHwKLQkJICAgIChDSElQX0lTX0UxSChicCkgJiYgKHZhbCAmIH4ocHJ0eV90YmxbaV0uZTFoX21hc2spKSkgfHwKLQkJICAgIChDSElQX0lTX0UyKGJwKSAmJiAodmFsICYgfihwcnR5X3RibFtpXS5lMl9tYXNrKSkpKSB7CisJCWlmICh2YWwgJiB+KHBydHlfdGJsW2ldLmh3X21hc2tbaW5kZXhdKSkgewogCQkJRFAoTkVUSUZfTVNHX0hXLAogCQkJICAgIiVzIGlzIDB4JXhcbiIsIHBydHlfdGJsW2ldLm5hbWUsIHZhbCk7CiAJCQlnb3RvIHRlc3RfbWVtX2V4aXQ7CkBAIC0xNDcyLDkgKzE2NjAsNyBAQAogCS8qIENoZWNrIHRoZSBwYXJpdHkgc3RhdHVzICovCiAJZm9yIChpID0gMDsgcHJ0eV90YmxbaV0ub2Zmc2V0ICE9IDB4ZmZmZmZmZmY7IGkrKykgewogCQl2YWwgPSBSRUdfUkQoYnAsIHBydHlfdGJsW2ldLm9mZnNldCk7Ci0JCWlmICgoQ0hJUF9JU19FMShicCkgJiYgKHZhbCAmIH4ocHJ0eV90YmxbaV0uZTFfbWFzaykpKSB8fAotCQkgICAgKENISVBfSVNfRTFIKGJwKSAmJiAodmFsICYgfihwcnR5X3RibFtpXS5lMWhfbWFzaykpKSB8fAotCQkgICAgKENISVBfSVNfRTIoYnApICYmICh2YWwgJiB+KHBydHlfdGJsW2ldLmUyX21hc2spKSkpIHsKKwkJaWYgKHZhbCAmIH4ocHJ0eV90YmxbaV0uaHdfbWFza1tpbmRleF0pKSB7CiAJCQlEUChORVRJRl9NU0dfSFcsCiAJCQkgICAiJXMgaXMgMHgleFxuIiwgcHJ0eV90YmxbaV0ubmFtZSwgdmFsKTsKIAkJCWdvdG8gdGVzdF9tZW1fZXhpdDsKQEAgLTE0OTEsMjggKzE2NzcsMzMgQEAKIHsKIAlpbnQgY250ID0gMTQwMDsKIAotCWlmIChsaW5rX3VwKQorCWlmIChsaW5rX3VwKSB7CiAJCXdoaWxlIChibngyeF9saW5rX3Rlc3QoYnAsIGlzX3NlcmRlcykgJiYgY250LS0pCi0JCQltc2xlZXAoMTApOworCQkJbXNsZWVwKDIwKTsKKworCQlpZiAoY250IDw9IDAgJiYgYm54MnhfbGlua190ZXN0KGJwLCBpc19zZXJkZXMpKQorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJUaW1lb3V0IHdhaXRpbmcgZm9yIGxpbmsgdXBcbiIpOworCX0KIH0KIAotc3RhdGljIGludCBibngyeF9ydW5fbG9vcGJhY2soc3RydWN0IGJueDJ4ICpicCwgaW50IGxvb3BiYWNrX21vZGUsIHU4IGxpbmtfdXApCitzdGF0aWMgaW50IGJueDJ4X3J1bl9sb29wYmFjayhzdHJ1Y3QgYm54MnggKmJwLCBpbnQgbG9vcGJhY2tfbW9kZSkKIHsKIAl1bnNpZ25lZCBpbnQgcGt0X3NpemUsIG51bV9wa3RzLCBpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgY2hhciAqcGFja2V0OwogCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnBfcnggPSAmYnAtPmZwWzBdOwogCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnBfdHggPSAmYnAtPmZwWzBdOworCXN0cnVjdCBibngyeF9mcF90eGRhdGEgKnR4ZGF0YSA9ICZmcF90eC0+dHhkYXRhWzBdOwogCXUxNiB0eF9zdGFydF9pZHgsIHR4X2lkeDsKIAl1MTYgcnhfc3RhcnRfaWR4LCByeF9pZHg7Ci0JdTE2IHBrdF9wcm9kLCBiZF9wcm9kOworCXUxNiBwa3RfcHJvZCwgYmRfcHJvZCwgcnhfY29tcF9jb25zOwogCXN0cnVjdCBzd190eF9iZCAqdHhfYnVmOwogCXN0cnVjdCBldGhfdHhfc3RhcnRfYmQgKnR4X3N0YXJ0X2JkOwogCXN0cnVjdCBldGhfdHhfcGFyc2VfYmRfZTF4ICAqcGJkX2UxeCA9IE5VTEw7CiAJc3RydWN0IGV0aF90eF9wYXJzZV9iZF9lMiAgKnBiZF9lMiA9IE5VTEw7CiAJZG1hX2FkZHJfdCBtYXBwaW5nOwogCXVuaW9uIGV0aF9yeF9jcWUgKmNxZTsKLQl1OCBjcWVfZnBfZmxhZ3M7CisJdTggY3FlX2ZwX2ZsYWdzLCBjcWVfZnBfdHlwZTsKIAlzdHJ1Y3Qgc3dfcnhfYmQgKnJ4X2J1ZjsKIAl1MTYgbGVuOwogCWludCByYyA9IC1FTk9ERVY7CkBAIC0xNTI0LDcgKzE3MTUsOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCWNhc2UgQk5YMlhfTUFDX0xPT1BCQUNLOgotCQlicC0+bGlua19wYXJhbXMubG9vcGJhY2tfbW9kZSA9IExPT1BCQUNLX0JNQUM7CisJCWJwLT5saW5rX3BhcmFtcy5sb29wYmFja19tb2RlID0gQ0hJUF9JU19FMyhicCkgPworCQkJCQkJTE9PUEJBQ0tfWE1BQyA6IExPT1BCQUNLX0JNQUM7CiAJCWJueDJ4X3BoeV9pbml0KCZicC0+bGlua19wYXJhbXMsICZicC0+bGlua192YXJzKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE1NDUsMjIgKzE3MzcsMjggQEAKIAltZW1zZXQocGFja2V0ICsgMipFVEhfQUxFTiwgMHg3NywgKEVUSF9ITEVOIC0gMipFVEhfQUxFTikpOwogCWZvciAoaSA9IEVUSF9ITEVOOyBpIDwgcGt0X3NpemU7IGkrKykKIAkJcGFja2V0W2ldID0gKHVuc2lnbmVkIGNoYXIpIChpICYgMHhmZik7CisJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBza2ItPmRhdGEsCisJCQkJIHNrYl9oZWFkbGVuKHNrYiksIERNQV9UT19ERVZJQ0UpOworCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcigmYnAtPnBkZXYtPmRldiwgbWFwcGluZykpKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlCTlgyWF9FUlIoIlVuYWJsZSB0byBtYXAgU0tCXG4iKTsKKwkJZ290byB0ZXN0X2xvb3BiYWNrX2V4aXQ7CisJfQogCiAJLyogc2VuZCB0aGUgbG9vcGJhY2sgcGFja2V0ICovCiAJbnVtX3BrdHMgPSAwOwotCXR4X3N0YXJ0X2lkeCA9IGxlMTZfdG9fY3B1KCpmcF90eC0+dHhfY29uc19zYik7CisJdHhfc3RhcnRfaWR4ID0gbGUxNl90b19jcHUoKnR4ZGF0YS0+dHhfY29uc19zYik7CiAJcnhfc3RhcnRfaWR4ID0gbGUxNl90b19jcHUoKmZwX3J4LT5yeF9jb25zX3NiKTsKIAotCXBrdF9wcm9kID0gZnBfdHgtPnR4X3BrdF9wcm9kKys7Ci0JdHhfYnVmID0gJmZwX3R4LT50eF9idWZfcmluZ1tUWF9CRChwa3RfcHJvZCldOwotCXR4X2J1Zi0+Zmlyc3RfYmQgPSBmcF90eC0+dHhfYmRfcHJvZDsKKwlwa3RfcHJvZCA9IHR4ZGF0YS0+dHhfcGt0X3Byb2QrKzsKKwl0eF9idWYgPSAmdHhkYXRhLT50eF9idWZfcmluZ1tUWF9CRChwa3RfcHJvZCldOworCXR4X2J1Zi0+Zmlyc3RfYmQgPSB0eGRhdGEtPnR4X2JkX3Byb2Q7CiAJdHhfYnVmLT5za2IgPSBza2I7CiAJdHhfYnVmLT5mbGFncyA9IDA7CiAKLQliZF9wcm9kID0gVFhfQkQoZnBfdHgtPnR4X2JkX3Byb2QpOwotCXR4X3N0YXJ0X2JkID0gJmZwX3R4LT50eF9kZXNjX3JpbmdbYmRfcHJvZF0uc3RhcnRfYmQ7Ci0JbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBza2ItPmRhdGEsCi0JCQkJIHNrYl9oZWFkbGVuKHNrYiksIERNQV9UT19ERVZJQ0UpOworCWJkX3Byb2QgPSBUWF9CRCh0eGRhdGEtPnR4X2JkX3Byb2QpOworCXR4X3N0YXJ0X2JkID0gJnR4ZGF0YS0+dHhfZGVzY19yaW5nW2JkX3Byb2RdLnN0YXJ0X2JkOwogCXR4X3N0YXJ0X2JkLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIoVTY0X0hJKG1hcHBpbmcpKTsKIAl0eF9zdGFydF9iZC0+YWRkcl9sbyA9IGNwdV90b19sZTMyKFU2NF9MTyhtYXBwaW5nKSk7CiAJdHhfc3RhcnRfYmQtPm5iZCA9IGNwdV90b19sZTE2KDIpOyAvKiBzdGFydCArIHBiZCAqLwpAQCAtMTU3NywyNiArMTc3NSwyNyBAQAogCS8qIHR1cm4gb24gcGFyc2luZyBhbmQgZ2V0IGEgQkQgKi8KIAliZF9wcm9kID0gVFhfQkQoTkVYVF9UWF9JRFgoYmRfcHJvZCkpOwogCi0JcGJkX2UxeCA9ICZmcF90eC0+dHhfZGVzY19yaW5nW2JkX3Byb2RdLnBhcnNlX2JkX2UxeDsKLQlwYmRfZTIgPSAmZnBfdHgtPnR4X2Rlc2NfcmluZ1tiZF9wcm9kXS5wYXJzZV9iZF9lMjsKKwlwYmRfZTF4ID0gJnR4ZGF0YS0+dHhfZGVzY19yaW5nW2JkX3Byb2RdLnBhcnNlX2JkX2UxeDsKKwlwYmRfZTIgPSAmdHhkYXRhLT50eF9kZXNjX3JpbmdbYmRfcHJvZF0ucGFyc2VfYmRfZTI7CiAKIAltZW1zZXQocGJkX2UyLCAwLCBzaXplb2Yoc3RydWN0IGV0aF90eF9wYXJzZV9iZF9lMikpOwogCW1lbXNldChwYmRfZTF4LCAwLCBzaXplb2Yoc3RydWN0IGV0aF90eF9wYXJzZV9iZF9lMXgpKTsKIAogCXdtYigpOwogCi0JZnBfdHgtPnR4X2RiLmRhdGEucHJvZCArPSAyOworCXR4ZGF0YS0+dHhfZGIuZGF0YS5wcm9kICs9IDI7CiAJYmFycmllcigpOwotCURPT1JCRUxMKGJwLCBmcF90eC0+aW5kZXgsIGZwX3R4LT50eF9kYi5yYXcpOworCURPT1JCRUxMKGJwLCB0eGRhdGEtPmNpZCwgdHhkYXRhLT50eF9kYi5yYXcpOwogCiAJbW1pb3diKCk7CisJYmFycmllcigpOwogCiAJbnVtX3BrdHMrKzsKLQlmcF90eC0+dHhfYmRfcHJvZCArPSAyOyAvKiBzdGFydCArIHBiZCAqLworCXR4ZGF0YS0+dHhfYmRfcHJvZCArPSAyOyAvKiBzdGFydCArIHBiZCAqLwogCiAJdWRlbGF5KDEwMCk7CiAKLQl0eF9pZHggPSBsZTE2X3RvX2NwdSgqZnBfdHgtPnR4X2NvbnNfc2IpOworCXR4X2lkeCA9IGxlMTZfdG9fY3B1KCp0eGRhdGEtPnR4X2NvbnNfc2IpOwogCWlmICh0eF9pZHggIT0gdHhfc3RhcnRfaWR4ICsgbnVtX3BrdHMpCiAJCWdvdG8gdGVzdF9sb29wYmFja19leGl0OwogCkBAIC0xNjEwLDcgKzE4MDksNyBAQAogCQkgKiBibngyeF90eF9pbnQoKSksIGFzIGJvdGggYXJlIHRha2luZyBuZXRpZl90eF9sb2NrKCkuCiAJCSAqLwogCQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JCWJueDJ4X3R4X2ludChmcF90eCk7CisJCWJueDJ4X3R4X2ludChicCwgdHhkYXRhKTsKIAkJbG9jYWxfYmhfZW5hYmxlKCk7CiAJfQogCkBAIC0xNjE4LDkgKzE4MTcsMTEgQEAKIAlpZiAocnhfaWR4ICE9IHJ4X3N0YXJ0X2lkeCArIG51bV9wa3RzKQogCQlnb3RvIHRlc3RfbG9vcGJhY2tfZXhpdDsKIAotCWNxZSA9ICZmcF9yeC0+cnhfY29tcF9yaW5nW1JDUV9CRChmcF9yeC0+cnhfY29tcF9jb25zKV07CisJcnhfY29tcF9jb25zID0gbGUxNl90b19jcHUoZnBfcngtPnJ4X2NvbXBfY29ucyk7CisJY3FlID0gJmZwX3J4LT5yeF9jb21wX3JpbmdbUkNRX0JEKHJ4X2NvbXBfY29ucyldOwogCWNxZV9mcF9mbGFncyA9IGNxZS0+ZmFzdF9wYXRoX2NxZS50eXBlX2Vycm9yX2ZsYWdzOwotCWlmIChDUUVfVFlQRShjcWVfZnBfZmxhZ3MpIHx8IChjcWVfZnBfZmxhZ3MgJiBFVEhfUlhfRVJST1JfRkFMR1MpKQorCWNxZV9mcF90eXBlID0gY3FlX2ZwX2ZsYWdzICYgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfVFlQRTsKKwlpZiAoIUNRRV9UWVBFX0ZBU1QoY3FlX2ZwX3R5cGUpIHx8IChjcWVfZnBfZmxhZ3MgJiBFVEhfUlhfRVJST1JfRkFMR1MpKQogCQlnb3RvIHRlc3RfbG9vcGJhY2tfcnhfZXhpdDsKIAogCWxlbiA9IGxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS5wa3RfbGVuKTsKQEAgLTE2MjgsNiArMTgyOSw5IEBACiAJCWdvdG8gdGVzdF9sb29wYmFja19yeF9leGl0OwogCiAJcnhfYnVmID0gJmZwX3J4LT5yeF9idWZfcmluZ1tSWF9CRChmcF9yeC0+cnhfYmRfY29ucyldOworCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCZicC0+cGRldi0+ZGV2LAorCQkJCSAgIGRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCisJCQkJICAgZnBfcngtPnJ4X2J1Zl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCXNrYiA9IHJ4X2J1Zi0+c2tiOwogCXNrYl9yZXNlcnZlKHNrYiwgY3FlLT5mYXN0X3BhdGhfY3FlLnBsYWNlbWVudF9vZmZzZXQpOwogCWZvciAoaSA9IEVUSF9ITEVOOyBpIDwgcGt0X3NpemU7IGkrKykKQEAgLTE2NTMsNyArMTg1Nyw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGJueDJ4X3Rlc3RfbG9vcGJhY2soc3RydWN0IGJueDJ4ICpicCwgdTggbGlua191cCkKK3N0YXRpYyBpbnQgYm54MnhfdGVzdF9sb29wYmFjayhzdHJ1Y3QgYm54MnggKmJwKQogewogCWludCByYyA9IDAsIHJlczsKIApAQCAtMTY2NiwxMyArMTg3MCwxMyBAQAogCWJueDJ4X25ldGlmX3N0b3AoYnAsIDEpOwogCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOwogCi0JcmVzID0gYm54MnhfcnVuX2xvb3BiYWNrKGJwLCBCTlgyWF9QSFlfTE9PUEJBQ0ssIGxpbmtfdXApOworCXJlcyA9IGJueDJ4X3J1bl9sb29wYmFjayhicCwgQk5YMlhfUEhZX0xPT1BCQUNLKTsKIAlpZiAocmVzKSB7CiAJCURQKE5FVElGX01TR19QUk9CRSwgIiAgUEhZIGxvb3BiYWNrIGZhaWxlZCAgKHJlcyAlZClcbiIsIHJlcyk7CiAJCXJjIHw9IEJOWDJYX1BIWV9MT09QQkFDS19GQUlMRUQ7CiAJfQogCi0JcmVzID0gYm54MnhfcnVuX2xvb3BiYWNrKGJwLCBCTlgyWF9NQUNfTE9PUEJBQ0ssIGxpbmtfdXApOworCXJlcyA9IGJueDJ4X3J1bl9sb29wYmFjayhicCwgQk5YMlhfTUFDX0xPT1BCQUNLKTsKIAlpZiAocmVzKSB7CiAJCURQKE5FVElGX01TR19QUk9CRSwgIiAgTUFDIGxvb3BiYWNrIGZhaWxlZCAgKHJlcyAlZClcbiIsIHJlcyk7CiAJCXJjIHw9IEJOWDJYX01BQ19MT09QQkFDS19GQUlMRUQ7CkBAIC0xNzQ0LDM5ICsxOTQ4LDIwIEBACiAJcmV0dXJuIHJjOwogfQogCisvKiBTZW5kIGFuIEVNUFRZIHJhbXJvZCBvbiB0aGUgZmlyc3QgcXVldWUgKi8KIHN0YXRpYyBpbnQgYm54MnhfdGVzdF9pbnRyKHN0cnVjdCBibngyeCAqYnApCiB7Ci0Jc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2NtZCAqY29uZmlnID0gYm54Mnhfc3AoYnAsIG1hY19jb25maWcpOwotCWludCBpLCByYzsKKwlzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zIHBhcmFtcyA9IHswfTsKIAogCWlmICghbmV0aWZfcnVubmluZyhicC0+ZGV2KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQljb25maWctPmhkci5sZW5ndGggPSAwOwotCWlmIChDSElQX0lTX0UxKGJwKSkKLQkJY29uZmlnLT5oZHIub2Zmc2V0ID0gKEJQX1BPUlQoYnApID8gMzIgOiAwKTsKLQllbHNlCi0JCWNvbmZpZy0+aGRyLm9mZnNldCA9IEJQX0ZVTkMoYnApOwotCWNvbmZpZy0+aGRyLmNsaWVudF9pZCA9IGJwLT5mcC0+Y2xfaWQ7Ci0JY29uZmlnLT5oZHIucmVzZXJ2ZWQxID0gMDsKKwlwYXJhbXMucV9vYmogPSAmYnAtPmZwLT5xX29iajsKKwlwYXJhbXMuY21kID0gQk5YMlhfUV9DTURfRU1QVFk7CiAKLQlicC0+c2V0X21hY19wZW5kaW5nID0gMTsKLQlzbXBfd21iKCk7Ci0JcmMgPSBibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0NPTU1PTl9TRVRfTUFDLCAwLAotCQkJICAgVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19jb25maWcpKSwKLQkJCSAgIFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfY29uZmlnKSksIDEpOwotCWlmIChyYyA9PSAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlpZiAoIWJwLT5zZXRfbWFjX3BlbmRpbmcpCi0JCQkJYnJlYWs7Ci0JCQlzbXBfcm1iKCk7Ci0JCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMCk7Ci0JCX0KLQkJaWYgKGkgPT0gMTApCi0JCQlyYyA9IC1FTk9ERVY7Ci0JfQorCV9fc2V0X2JpdChSQU1ST0RfQ09NUF9XQUlULCAmcGFyYW1zLnJhbXJvZF9mbGFncyk7CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIGJueDJ4X3F1ZXVlX3N0YXRlX2NoYW5nZShicCwgJnBhcmFtcyk7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X3NlbGZfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTgxNSw3ICsyMDAwLDcgQEAKIAkJYm54MnhfbmljX3VubG9hZChicCwgVU5MT0FEX05PUk1BTCk7CiAJCWJueDJ4X25pY19sb2FkKGJwLCBMT0FEX0RJQUcpOwogCQkvKiB3YWl0IHVudGlsIGxpbmsgc3RhdGUgaXMgcmVzdG9yZWQgKi8KLQkJYm54Mnhfd2FpdF9mb3JfbGluayhicCwgbGlua191cCwgaXNfc2VyZGVzKTsKKwkJYm54Mnhfd2FpdF9mb3JfbGluayhicCwgMSwgaXNfc2VyZGVzKTsKIAogCQlpZiAoYm54MnhfdGVzdF9yZWdpc3RlcnMoYnApICE9IDApIHsKIAkJCWJ1ZlswXSA9IDE7CkBAIC0xODI2LDcgKzIwMTEsNyBAQAogCQkJZXRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKIAkJfQogCi0JCWJ1ZlsyXSA9IGJueDJ4X3Rlc3RfbG9vcGJhY2soYnAsIGxpbmtfdXApOworCQlidWZbMl0gPSBibngyeF90ZXN0X2xvb3BiYWNrKGJwKTsKIAkJaWYgKGJ1ZlsyXSAhPSAwKQogCQkJZXRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKIApAQCAtMTg2NCw2ICsyMDQ5LDE0IEBACiAjZGVmaW5lIElTX01GX01PREVfU1RBVChicCkgXAogCQkJKElTX01GKGJwKSAmJiAhKGJwLT5tc2dfZW5hYmxlICYgQk5YMlhfTVNHX1NUQVRTKSkKIAorLyogZXRodG9vbCBzdGF0aXN0aWNzIGFyZSBkaXNwbGF5ZWQgZm9yIGFsbCByZWd1bGFyIGV0aGVybmV0IHF1ZXVlcyBhbmQgdGhlCisgKiBmY29lIEwyIHF1ZXVlIGlmIG5vdCBkaXNhYmxlZAorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9udW1fc3RhdF9xdWV1ZXMoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlyZXR1cm4gQk5YMlhfTlVNX0VUSF9RVUVVRVMoYnApOworfQorCiBzdGF0aWMgaW50IGJueDJ4X2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdHJpbmdzZXQpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0xODcyLDcgKzIwNjUsNyBAQAogCXN3aXRjaCAoc3RyaW5nc2V0KSB7CiAJY2FzZSBFVEhfU1NfU1RBVFM6CiAJCWlmIChpc19tdWx0aShicCkpIHsKLQkJCW51bV9zdGF0cyA9IEJOWDJYX05VTV9TVEFUX1FVRVVFUyhicCkgKgorCQkJbnVtX3N0YXRzID0gYm54MnhfbnVtX3N0YXRfcXVldWVzKGJwKSAqCiAJCQkJQk5YMlhfTlVNX1FfU1RBVFM7CiAJCQlpZiAoIUlTX01GX01PREVfU1RBVChicCkpCiAJCQkJbnVtX3N0YXRzICs9IEJOWDJYX05VTV9TVEFUUzsKQEAgLTE5MDUsMTQgKzIwOTgsOSBAQAogCWNhc2UgRVRIX1NTX1NUQVRTOgogCQlpZiAoaXNfbXVsdGkoYnApKSB7CiAJCQlrID0gMDsKLQkJCWZvcl9lYWNoX25hcGlfcXVldWUoYnAsIGkpIHsKKwkJCWZvcl9lYWNoX2V0aF9xdWV1ZShicCwgaSkgewogCQkJCW1lbXNldChxdWV1ZV9uYW1lLCAwLCBzaXplb2YocXVldWVfbmFtZSkpOwotCi0JCQkJaWYgKElTX0ZDT0VfSURYKGkpKQotCQkJCQlzcHJpbnRmKHF1ZXVlX25hbWUsICJmY29lIik7Ci0JCQkJZWxzZQotCQkJCQlzcHJpbnRmKHF1ZXVlX25hbWUsICIlZCIsIGkpOwotCisJCQkJc3ByaW50ZihxdWV1ZV9uYW1lLCAiJWQiLCBpKTsKIAkJCQlmb3IgKGogPSAwOyBqIDwgQk5YMlhfTlVNX1FfU1RBVFM7IGorKykKIAkJCQkJc25wcmludGYoYnVmICsgKGsgKyBqKSpFVEhfR1NUUklOR19MRU4sCiAJCQkJCQlFVEhfR1NUUklOR19MRU4sCkBAIC0xOTUxLDcgKzIxMzksNyBAQAogCiAJaWYgKGlzX211bHRpKGJwKSkgewogCQlrID0gMDsKLQkJZm9yX2VhY2hfbmFwaV9xdWV1ZShicCwgaSkgeworCQlmb3JfZWFjaF9ldGhfcXVldWUoYnAsIGkpIHsKIAkJCWh3X3N0YXRzID0gKHUzMiAqKSZicC0+ZnBbaV0uZXRoX3Ffc3RhdHM7CiAJCQlmb3IgKGogPSAwOyBqIDwgQk5YMlhfTlVNX1FfU1RBVFM7IGorKykgewogCQkJCWlmIChibngyeF9xX3N0YXRzX2FycltqXS5zaXplID09IDApIHsKQEAgLTIwNjksMTQgKzIyNTcsMzAgQEAKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzaXplX3QgY29weV9zaXplID0KLQkJbWluX3Qoc2l6ZV90LCBpbmRpci0+c2l6ZSwgVFNUT1JNX0lORElSRUNUSU9OX1RBQkxFX1NJWkUpOworCQltaW5fdChzaXplX3QsIGluZGlyLT5zaXplLCBUX0VUSF9JTkRJUkVDVElPTl9UQUJMRV9TSVpFKTsKKwl1OCBpbmRfdGFibGVbVF9FVEhfSU5ESVJFQ1RJT05fVEFCTEVfU0laRV0gPSB7MH07CisJc2l6ZV90IGk7CiAKIAlpZiAoYnAtPm11bHRpX21vZGUgPT0gRVRIX1JTU19NT0RFX0RJU0FCTEVEKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpbmRpci0+c2l6ZSA9IFRTVE9STV9JTkRJUkVDVElPTl9UQUJMRV9TSVpFOwotCW1lbWNweShpbmRpci0+cmluZ19pbmRleCwgYnAtPnJ4X2luZGlyX3RhYmxlLAotCSAgICAgICBjb3B5X3NpemUgKiBzaXplb2YoYnAtPnJ4X2luZGlyX3RhYmxlWzBdKSk7CisJLyogR2V0IHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgdGhlIFJTUyBpbmRpcmVjdGlvbiB0YWJsZSAqLworCWJueDJ4X2dldF9yc3NfaW5kX3RhYmxlKCZicC0+cnNzX2NvbmZfb2JqLCBpbmRfdGFibGUpOworCisJLyoKKwkgKiBXZSBjYW4ndCB1c2UgYSBtZW1jcHkoKSBhcyBhbiBpbnRlcm5hbCBzdG9yYWdlIG9mIGFuCisJICogaW5kaXJlY3Rpb24gdGFibGUgaXMgYSB1OCBhcnJheSB3aGlsZSBpbmRpci0+cmluZ19pbmRleAorCSAqIHBvaW50cyB0byBhbiBhcnJheSBvZiB1MzIuCisJICoKKwkgKiBJbmRpcmVjdGlvbiB0YWJsZSBjb250YWlucyB0aGUgRlcgQ2xpZW50IElEcywgc28gd2UgbmVlZCB0bworCSAqIGFsaWduIHRoZSByZXR1cm5lZCB0YWJsZSB0byB0aGUgQ2xpZW50IElEIG9mIHRoZSBsZWFkaW5nIFJTUworCSAqIHF1ZXVlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3B5X3NpemU7IGkrKykKKwkJaW5kaXItPnJpbmdfaW5kZXhbaV0gPSBpbmRfdGFibGVbaV0gLSBicC0+ZnAtPmNsX2lkOworCisJaW5kaXItPnNpemUgPSBUX0VUSF9JTkRJUkVDVElPTl9UQUJMRV9TSVpFOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwODUsMjEgKzIyODksMzMgQEAKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzaXplX3QgaTsKKwl1OCBpbmRfdGFibGVbVF9FVEhfSU5ESVJFQ1RJT05fVEFCTEVfU0laRV0gPSB7MH07CisJdTMyIG51bV9ldGhfcXVldWVzID0gQk5YMlhfTlVNX0VUSF9RVUVVRVMoYnApOwogCiAJaWYgKGJwLT5tdWx0aV9tb2RlID09IEVUSF9SU1NfTU9ERV9ESVNBQkxFRCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JLyogVmFsaWRhdGUgc2l6ZSBhbmQgaW5kaWNlcyAqLwotCWlmIChpbmRpci0+c2l6ZSAhPSBUU1RPUk1fSU5ESVJFQ1RJT05fVEFCTEVfU0laRSkKKwkvKiB2YWxpZGF0ZSB0aGUgc2l6ZSAqLworCWlmIChpbmRpci0+c2l6ZSAhPSBUX0VUSF9JTkRJUkVDVElPTl9UQUJMRV9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlmb3IgKGkgPSAwOyBpIDwgVFNUT1JNX0lORElSRUNUSU9OX1RBQkxFX1NJWkU7IGkrKykKLQkJaWYgKGluZGlyLT5yaW5nX2luZGV4W2ldID49IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKSkKLQkJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtY3B5KGJwLT5yeF9pbmRpcl90YWJsZSwgaW5kaXItPnJpbmdfaW5kZXgsCi0JICAgICAgIGluZGlyLT5zaXplICogc2l6ZW9mKGJwLT5yeF9pbmRpcl90YWJsZVswXSkpOwotCWJueDJ4X3B1c2hfaW5kaXJfdGFibGUoYnApOwotCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBUX0VUSF9JTkRJUkVDVElPTl9UQUJMRV9TSVpFOyBpKyspIHsKKwkJLyogdmFsaWRhdGUgdGhlIGluZGljZXMgKi8KKwkJaWYgKGluZGlyLT5yaW5nX2luZGV4W2ldID49IG51bV9ldGhfcXVldWVzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qCisJCSAqIFRoZSBzYW1lIGFzIGluIGJueDJ4X2dldF9yeGZoX2luZGlyOiB3ZSBjYW4ndCB1c2UgYSBtZW1jcHkoKQorCQkgKiBhcyBhbiBpbnRlcm5hbCBzdG9yYWdlIG9mIGFuIGluZGlyZWN0aW9uIHRhYmxlIGlzIGEgdTggYXJyYXkKKwkJICogd2hpbGUgaW5kaXItPnJpbmdfaW5kZXggcG9pbnRzIHRvIGFuIGFycmF5IG9mIHUzMi4KKwkJICoKKwkJICogSW5kaXJlY3Rpb24gdGFibGUgY29udGFpbnMgdGhlIEZXIENsaWVudCBJRHMsIHNvIHdlIG5lZWQgdG8KKwkJICogYWxpZ24gdGhlIHJlY2VpdmVkIHRhYmxlIHRvIHRoZSBDbGllbnQgSUQgb2YgdGhlIGxlYWRpbmcgUlNTCisJCSAqIHF1ZXVlCisJCSAqLworCQlpbmRfdGFibGVbaV0gPSBpbmRpci0+cmluZ19pbmRleFtpXSArIGJwLT5mcC0+Y2xfaWQ7CisJfQorCisJcmV0dXJuIGJueDJ4X2NvbmZpZ19yc3NfcGYoYnAsIGluZF90YWJsZSwgZmFsc2UpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJueDJ4X2V0aHRvb2xfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfZndfZGVmcy5oIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfZndfZGVmcy5oCmluZGV4IDlmZTM2NzguLjk5ODY1MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2Z3X2RlZnMuaAorKysgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9md19kZWZzLmgKQEAgLTEwLDI0OSArMTAsMjIxIEBACiAjaWZuZGVmIEJOWDJYX0ZXX0RFRlNfSAogI2RlZmluZSBCTlgyWF9GV19ERUZTX0gKIAotI2RlZmluZSBDU1RPUk1fQVNTRVJUX0xJU1RfSU5ERVhfT0ZGU0VUIChJUk9bMTQyXS5iYXNlKQorI2RlZmluZSBDU1RPUk1fQVNTRVJUX0xJU1RfSU5ERVhfT0ZGU0VUCShJUk9bMTQ4XS5iYXNlKQogI2RlZmluZSBDU1RPUk1fQVNTRVJUX0xJU1RfT0ZGU0VUKGFzc2VydExpc3RFbnRyeSkgXAotCShJUk9bMTQxXS5iYXNlICsgKChhc3NlcnRMaXN0RW50cnkpICogSVJPWzE0MV0ubTEpKQotI2RlZmluZSBDU1RPUk1fRVRIX1NUQVRTX1FVRVJZX0FERFJfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzE0NF0uYmFzZSArICgocGZJZCkgKiBJUk9bMTQ0XS5tMSkpCisJKElST1sxNDddLmJhc2UgKyAoKGFzc2VydExpc3RFbnRyeSkgKiBJUk9bMTQ3XS5tMSkpCiAjZGVmaW5lIENTVE9STV9FVkVOVF9SSU5HX0RBVEFfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzE0OV0uYmFzZSArICgoKHBmSWQpPj4xKSAqIElST1sxNDldLm0xKSArICgoKHBmSWQpJjEpICogXAotCUlST1sxNDldLm0yKSkKKwkoSVJPWzE1M10uYmFzZSArICgoKHBmSWQpPj4xKSAqIElST1sxNTNdLm0xKSArICgoKHBmSWQpJjEpICogXAorCUlST1sxNTNdLm0yKSkKICNkZWZpbmUgQ1NUT1JNX0VWRU5UX1JJTkdfUFJPRF9PRkZTRVQocGZJZCkgXAotCShJUk9bMTUwXS5iYXNlICsgKCgocGZJZCk+PjEpICogSVJPWzE1MF0ubTEpICsgKCgocGZJZCkmMSkgKiBcCi0JSVJPWzE1MF0ubTIpKQorCShJUk9bMTU0XS5iYXNlICsgKCgocGZJZCk+PjEpICogSVJPWzE1NF0ubTEpICsgKCgocGZJZCkmMSkgKiBcCisJSVJPWzE1NF0ubTIpKQogI2RlZmluZSBDU1RPUk1fRklOQUxfQ0xFQU5VUF9DT01QTEVURV9PRkZTRVQoZnVuY0lkKSBcCi0JKElST1sxNTZdLmJhc2UgKyAoKGZ1bmNJZCkgKiBJUk9bMTU2XS5tMSkpCisJKElST1sxNTldLmJhc2UgKyAoKGZ1bmNJZCkgKiBJUk9bMTU5XS5tMSkpCiAjZGVmaW5lIENTVE9STV9GVU5DX0VOX09GRlNFVChmdW5jSWQpIFwKLQkoSVJPWzE0Nl0uYmFzZSArICgoZnVuY0lkKSAqIElST1sxNDZdLm0xKSkKLSNkZWZpbmUgQ1NUT1JNX0ZVTkNUSU9OX01PREVfT0ZGU0VUIChJUk9bMTUzXS5iYXNlKQotI2RlZmluZSBDU1RPUk1fSUdVX01PREVfT0ZGU0VUIChJUk9bMTU0XS5iYXNlKQorCShJUk9bMTQ5XS5iYXNlICsgKChmdW5jSWQpICogSVJPWzE0OV0ubTEpKQorI2RlZmluZSBDU1RPUk1fSUdVX01PREVfT0ZGU0VUIChJUk9bMTU3XS5iYXNlKQogI2RlZmluZSBDU1RPUk1fSVNDU0lfQ1FfU0laRV9PRkZTRVQocGZJZCkgXAotCShJUk9bMzExXS5iYXNlICsgKChwZklkKSAqIElST1szMTFdLm0xKSkKKwkoSVJPWzMxNV0uYmFzZSArICgocGZJZCkgKiBJUk9bMzE1XS5tMSkpCiAjZGVmaW5lIENTVE9STV9JU0NTSV9DUV9TUU5fU0laRV9PRkZTRVQocGZJZCkgXAotCShJUk9bMzEyXS5iYXNlICsgKChwZklkKSAqIElST1szMTJdLm0xKSkKLQkjZGVmaW5lIENTVE9STV9JU0NTSV9FUV9DT05TX09GRlNFVChwZklkLCBpc2NzaUVxSWQpIFwKLQkoSVJPWzMwNF0uYmFzZSArICgocGZJZCkgKiBJUk9bMzA0XS5tMSkgKyAoKGlzY3NpRXFJZCkgKiBcCi0JSVJPWzMwNF0ubTIpKQotCSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX0VRX05FWFRfRVFFX0FERFJfT0ZGU0VUKHBmSWQsIGlzY3NpRXFJZCkgXAotCShJUk9bMzA2XS5iYXNlICsgKChwZklkKSAqIElST1szMDZdLm0xKSArICgoaXNjc2lFcUlkKSAqIFwKLQlJUk9bMzA2XS5tMikpCi0JI2RlZmluZSBDU1RPUk1fSVNDU0lfRVFfTkVYVF9QQUdFX0FERFJfT0ZGU0VUKHBmSWQsIGlzY3NpRXFJZCkgXAotCShJUk9bMzA1XS5iYXNlICsgKChwZklkKSAqIElST1szMDVdLm0xKSArICgoaXNjc2lFcUlkKSAqIFwKLQlJUk9bMzA1XS5tMikpCi0JI2RlZmluZSBcCi0JQ1NUT1JNX0lTQ1NJX0VRX05FWFRfUEFHRV9BRERSX1ZBTElEX09GRlNFVChwZklkLCBpc2NzaUVxSWQpIFwKLQkoSVJPWzMwN10uYmFzZSArICgocGZJZCkgKiBJUk9bMzA3XS5tMSkgKyAoKGlzY3NpRXFJZCkgKiBcCi0JSVJPWzMwN10ubTIpKQotCSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX0VRX1BST0RfT0ZGU0VUKHBmSWQsIGlzY3NpRXFJZCkgXAotCShJUk9bMzAzXS5iYXNlICsgKChwZklkKSAqIElST1szMDNdLm0xKSArICgoaXNjc2lFcUlkKSAqIFwKLQlJUk9bMzAzXS5tMikpCi0JI2RlZmluZSBDU1RPUk1fSVNDU0lfRVFfU0JfSU5ERVhfT0ZGU0VUKHBmSWQsIGlzY3NpRXFJZCkgXAotCShJUk9bMzA5XS5iYXNlICsgKChwZklkKSAqIElST1szMDldLm0xKSArICgoaXNjc2lFcUlkKSAqIFwKLQlJUk9bMzA5XS5tMikpCi0JI2RlZmluZSBDU1RPUk1fSVNDU0lfRVFfU0JfTlVNX09GRlNFVChwZklkLCBpc2NzaUVxSWQpIFwKLQkoSVJPWzMwOF0uYmFzZSArICgocGZJZCkgKiBJUk9bMzA4XS5tMSkgKyAoKGlzY3NpRXFJZCkgKiBcCi0JSVJPWzMwOF0ubTIpKQorCShJUk9bMzE2XS5iYXNlICsgKChwZklkKSAqIElST1szMTZdLm0xKSkKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX0VRX0NPTlNfT0ZGU0VUKHBmSWQsIGlzY3NpRXFJZCkgXAorCShJUk9bMzA4XS5iYXNlICsgKChwZklkKSAqIElST1szMDhdLm0xKSArICgoaXNjc2lFcUlkKSAqIElST1szMDhdLm0yKSkKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX0VRX05FWFRfRVFFX0FERFJfT0ZGU0VUKHBmSWQsIGlzY3NpRXFJZCkgXAorCShJUk9bMzEwXS5iYXNlICsgKChwZklkKSAqIElST1szMTBdLm0xKSArICgoaXNjc2lFcUlkKSAqIElST1szMTBdLm0yKSkKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX0VRX05FWFRfUEFHRV9BRERSX09GRlNFVChwZklkLCBpc2NzaUVxSWQpIFwKKwkoSVJPWzMwOV0uYmFzZSArICgocGZJZCkgKiBJUk9bMzA5XS5tMSkgKyAoKGlzY3NpRXFJZCkgKiBJUk9bMzA5XS5tMikpCisjZGVmaW5lIENTVE9STV9JU0NTSV9FUV9ORVhUX1BBR0VfQUREUl9WQUxJRF9PRkZTRVQocGZJZCwgaXNjc2lFcUlkKSBcCisJKElST1szMTFdLmJhc2UgKyAoKHBmSWQpICogSVJPWzMxMV0ubTEpICsgKChpc2NzaUVxSWQpICogSVJPWzMxMV0ubTIpKQorI2RlZmluZSBDU1RPUk1fSVNDU0lfRVFfUFJPRF9PRkZTRVQocGZJZCwgaXNjc2lFcUlkKSBcCisJKElST1szMDddLmJhc2UgKyAoKHBmSWQpICogSVJPWzMwN10ubTEpICsgKChpc2NzaUVxSWQpICogSVJPWzMwN10ubTIpKQorI2RlZmluZSBDU1RPUk1fSVNDU0lfRVFfU0JfSU5ERVhfT0ZGU0VUKHBmSWQsIGlzY3NpRXFJZCkgXAorCShJUk9bMzEzXS5iYXNlICsgKChwZklkKSAqIElST1szMTNdLm0xKSArICgoaXNjc2lFcUlkKSAqIElST1szMTNdLm0yKSkKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX0VRX1NCX05VTV9PRkZTRVQocGZJZCwgaXNjc2lFcUlkKSBcCisJKElST1szMTJdLmJhc2UgKyAoKHBmSWQpICogSVJPWzMxMl0ubTEpICsgKChpc2NzaUVxSWQpICogSVJPWzMxMl0ubTIpKQogI2RlZmluZSBDU1RPUk1fSVNDU0lfSFFfU0laRV9PRkZTRVQocGZJZCkgXAotCShJUk9bMzEwXS5iYXNlICsgKChwZklkKSAqIElST1szMTBdLm0xKSkKKwkoSVJPWzMxNF0uYmFzZSArICgocGZJZCkgKiBJUk9bMzE0XS5tMSkpCiAjZGVmaW5lIENTVE9STV9JU0NTSV9OVU1fT0ZfVEFTS1NfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzMwMl0uYmFzZSArICgocGZJZCkgKiBJUk9bMzAyXS5tMSkpCisJKElST1szMDZdLmJhc2UgKyAoKHBmSWQpICogSVJPWzMwNl0ubTEpKQogI2RlZmluZSBDU1RPUk1fSVNDU0lfUEFHRV9TSVpFX0xPR19PRkZTRVQocGZJZCkgXAotCShJUk9bMzAxXS5iYXNlICsgKChwZklkKSAqIElST1szMDFdLm0xKSkKKwkoSVJPWzMwNV0uYmFzZSArICgocGZJZCkgKiBJUk9bMzA1XS5tMSkpCiAjZGVmaW5lIENTVE9STV9JU0NTSV9QQUdFX1NJWkVfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzMwMF0uYmFzZSArICgocGZJZCkgKiBJUk9bMzAwXS5tMSkpCi0jZGVmaW5lIENTVE9STV9QQVRIX0lEX09GRlNFVCAoSVJPWzE1OV0uYmFzZSkKKwkoSVJPWzMwNF0uYmFzZSArICgocGZJZCkgKiBJUk9bMzA0XS5tMSkpCisjZGVmaW5lIENTVE9STV9SRUNPUkRfU0xPV19QQVRIX09GRlNFVChmdW5jSWQpIFwKKwkoSVJPWzE1MV0uYmFzZSArICgoZnVuY0lkKSAqIElST1sxNTFdLm0xKSkKICNkZWZpbmUgQ1NUT1JNX1NQX1NUQVRVU19CTE9DS19EQVRBX09GRlNFVChwZklkKSBcCi0JKElST1sxMzddLmJhc2UgKyAoKHBmSWQpICogSVJPWzEzN10ubTEpKQotI2RlZmluZSBDU1RPUk1fU1BfU1RBVFVTX0JMT0NLX09GRlNFVChwZklkKSBcCi0JKElST1sxMzZdLmJhc2UgKyAoKHBmSWQpICogSVJPWzEzNl0ubTEpKQotI2RlZmluZSBDU1RPUk1fU1BfU1RBVFVTX0JMT0NLX1NJWkUgKElST1sxMzZdLnNpemUpCi0jZGVmaW5lIENTVE9STV9TUF9TWU5DX0JMT0NLX09GRlNFVChwZklkKSBcCi0JKElST1sxMzhdLmJhc2UgKyAoKHBmSWQpICogSVJPWzEzOF0ubTEpKQotI2RlZmluZSBDU1RPUk1fU1BfU1lOQ19CTE9DS19TSVpFIChJUk9bMTM4XS5zaXplKQotI2RlZmluZSBDU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzE0Ml0uYmFzZSArICgocGZJZCkgKiBJUk9bMTQyXS5tMSkpCisjZGVmaW5lIENTVE9STV9TUF9TVEFUVVNfQkxPQ0tfREFUQV9TVEFURV9PRkZTRVQocGZJZCkgXAogCShJUk9bMTQzXS5iYXNlICsgKChwZklkKSAqIElST1sxNDNdLm0xKSkKKyNkZWZpbmUgQ1NUT1JNX1NQX1NUQVRVU19CTE9DS19PRkZTRVQocGZJZCkgXAorCShJUk9bMTQxXS5iYXNlICsgKChwZklkKSAqIElST1sxNDFdLm0xKSkKKyNkZWZpbmUgQ1NUT1JNX1NQX1NUQVRVU19CTE9DS19TSVpFIChJUk9bMTQxXS5zaXplKQorI2RlZmluZSBDU1RPUk1fU1BfU1lOQ19CTE9DS19PRkZTRVQocGZJZCkgXAorCShJUk9bMTQ0XS5iYXNlICsgKChwZklkKSAqIElST1sxNDRdLm0xKSkKKyNkZWZpbmUgQ1NUT1JNX1NQX1NZTkNfQkxPQ0tfU0laRSAoSVJPWzE0NF0uc2l6ZSkKKyNkZWZpbmUgQ1NUT1JNX1NUQVRVU19CTE9DS19EQVRBX0ZMQUdTX09GRlNFVChzYklkLCBoY0luZGV4KSBcCisJKElST1sxMzZdLmJhc2UgKyAoKHNiSWQpICogSVJPWzEzNl0ubTEpICsgKChoY0luZGV4KSAqIElST1sxMzZdLm0yKSkKICNkZWZpbmUgQ1NUT1JNX1NUQVRVU19CTE9DS19EQVRBX09GRlNFVChzYklkKSBcCi0JKElST1sxMjldLmJhc2UgKyAoKHNiSWQpICogSVJPWzEyOV0ubTEpKQorCShJUk9bMTMzXS5iYXNlICsgKChzYklkKSAqIElST1sxMzNdLm0xKSkKKyNkZWZpbmUgQ1NUT1JNX1NUQVRVU19CTE9DS19EQVRBX1NUQVRFX09GRlNFVChzYklkKSBcCisJKElST1sxMzRdLmJhc2UgKyAoKHNiSWQpICogSVJPWzEzNF0ubTEpKQorI2RlZmluZSBDU1RPUk1fU1RBVFVTX0JMT0NLX0RBVEFfVElNRU9VVF9PRkZTRVQoc2JJZCwgaGNJbmRleCkgXAorCShJUk9bMTM1XS5iYXNlICsgKChzYklkKSAqIElST1sxMzVdLm0xKSArICgoaGNJbmRleCkgKiBJUk9bMTM1XS5tMikpCiAjZGVmaW5lIENTVE9STV9TVEFUVVNfQkxPQ0tfT0ZGU0VUKHNiSWQpIFwKLQkoSVJPWzEyOF0uYmFzZSArICgoc2JJZCkgKiBJUk9bMTI4XS5tMSkpCi0jZGVmaW5lIENTVE9STV9TVEFUVVNfQkxPQ0tfU0laRSAoSVJPWzEyOF0uc2l6ZSkKLSNkZWZpbmUgQ1NUT1JNX1NZTkNfQkxPQ0tfT0ZGU0VUKHNiSWQpIFwKIAkoSVJPWzEzMl0uYmFzZSArICgoc2JJZCkgKiBJUk9bMTMyXS5tMSkpCi0jZGVmaW5lIENTVE9STV9TWU5DX0JMT0NLX1NJWkUgKElST1sxMzJdLnNpemUpCisjZGVmaW5lIENTVE9STV9TVEFUVVNfQkxPQ0tfU0laRSAoSVJPWzEzMl0uc2l6ZSkKKyNkZWZpbmUgQ1NUT1JNX1NZTkNfQkxPQ0tfT0ZGU0VUKHNiSWQpIFwKKwkoSVJPWzEzN10uYmFzZSArICgoc2JJZCkgKiBJUk9bMTM3XS5tMSkpCisjZGVmaW5lIENTVE9STV9TWU5DX0JMT0NLX1NJWkUgKElST1sxMzddLnNpemUpCiAjZGVmaW5lIENTVE9STV9WRl9QRl9DSEFOTkVMX1NUQVRFX09GRlNFVCh2ZklkKSBcCi0JKElST1sxNTFdLmJhc2UgKyAoKHZmSWQpICogSVJPWzE1MV0ubTEpKQorCShJUk9bMTU1XS5iYXNlICsgKCh2ZklkKSAqIElST1sxNTVdLm0xKSkKICNkZWZpbmUgQ1NUT1JNX1ZGX1BGX0NIQU5ORUxfVkFMSURfT0ZGU0VUKHZmSWQpIFwKLQkoSVJPWzE1Ml0uYmFzZSArICgodmZJZCkgKiBJUk9bMTUyXS5tMSkpCisJKElST1sxNTZdLmJhc2UgKyAoKHZmSWQpICogSVJPWzE1Nl0ubTEpKQogI2RlZmluZSBDU1RPUk1fVkZfVE9fUEZfT0ZGU0VUKGZ1bmNJZCkgXAotCShJUk9bMTQ3XS5iYXNlICsgKChmdW5jSWQpICogSVJPWzE0N10ubTEpKQotI2RlZmluZSBUU1RPUk1fQUNDRVBUX0NMQVNTSUZZX0ZBSUxFRF9PRkZTRVQgKElST1sxOTldLmJhc2UpCisJKElST1sxNTBdLmJhc2UgKyAoKGZ1bmNJZCkgKiBJUk9bMTUwXS5tMSkpCisjZGVmaW5lIFRTVE9STV9BQ0NFUFRfQ0xBU1NJRllfRkFJTEVEX09GRlNFVCAoSVJPWzIwNF0uYmFzZSkKICNkZWZpbmUgVFNUT1JNX0FQUFJPWElNQVRFX01BVENIX01VTFRJQ0FTVF9GSUxURVJJTkdfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzE5OF0uYmFzZSArICgocGZJZCkgKiBJUk9bMTk4XS5tMSkpCi0jZGVmaW5lIFRTVE9STV9BU1NFUlRfTElTVF9JTkRFWF9PRkZTRVQgKElST1s5OV0uYmFzZSkKKwkoSVJPWzIwM10uYmFzZSArICgocGZJZCkgKiBJUk9bMjAzXS5tMSkpCisjZGVmaW5lIFRTVE9STV9BU1NFUlRfTElTVF9JTkRFWF9PRkZTRVQJKElST1sxMDJdLmJhc2UpCiAjZGVmaW5lIFRTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoYXNzZXJ0TGlzdEVudHJ5KSBcCi0JKElST1s5OF0uYmFzZSArICgoYXNzZXJ0TGlzdEVudHJ5KSAqIElST1s5OF0ubTEpKQotCSNkZWZpbmUgVFNUT1JNX0NMSUVOVF9DT05GSUdfT0ZGU0VUKHBvcnRJZCwgY2xpZW50SWQpIFwKLQkoSVJPWzE5N10uYmFzZSArICgocG9ydElkKSAqIElST1sxOTddLm0xKSArICgoY2xpZW50SWQpICogXAotCUlST1sxOTddLm0yKSkKLSNkZWZpbmUgVFNUT1JNX0NPTU1PTl9TQUZDX1dPUktBUk9VTkRfRU5BQkxFX09GRlNFVCAoSVJPWzEwNF0uYmFzZSkKKwkoSVJPWzEwMV0uYmFzZSArICgoYXNzZXJ0TGlzdEVudHJ5KSAqIElST1sxMDFdLm0xKSkKKyNkZWZpbmUgVFNUT1JNX0NPTU1PTl9TQUZDX1dPUktBUk9VTkRfRU5BQkxFX09GRlNFVCAoSVJPWzEwN10uYmFzZSkKICNkZWZpbmUgVFNUT1JNX0NPTU1PTl9TQUZDX1dPUktBUk9VTkRfVElNRU9VVF8xMFVTRUNfT0ZGU0VUIFwKLQkoSVJPWzEwNV0uYmFzZSkKLSNkZWZpbmUgVFNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChwZklkKSBcCi0JKElST1s5Nl0uYmFzZSArICgocGZJZCkgKiBJUk9bOTZdLm0xKSkKLSNkZWZpbmUgVFNUT1JNX0ZVTkNfRU5fT0ZGU0VUKGZ1bmNJZCkgXAotCShJUk9bMTAxXS5iYXNlICsgKChmdW5jSWQpICogSVJPWzEwMV0ubTEpKQorCShJUk9bMTA4XS5iYXNlKQogI2RlZmluZSBUU1RPUk1fRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19PRkZTRVQocGZJZCkgXAotCShJUk9bMTk1XS5iYXNlICsgKChwZklkKSAqIElST1sxOTVdLm0xKSkKLSNkZWZpbmUgVFNUT1JNX0ZVTkNUSU9OX01PREVfT0ZGU0VUIChJUk9bMTAzXS5iYXNlKQotI2RlZmluZSBUU1RPUk1fSU5ESVJFQ1RJT05fVEFCTEVfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzkxXS5iYXNlICsgKChwZklkKSAqIElST1s5MV0ubTEpKQotI2RlZmluZSBUU1RPUk1fSU5ESVJFQ1RJT05fVEFCTEVfU0laRSAoSVJPWzkxXS5zaXplKQotCSNkZWZpbmUgXAotCVRTVE9STV9JU0NTSV9DT05OX0JVRl9QQkxfT0ZGU0VUKHBmSWQsIGlzY3NpQ29uQnVmUGJsRW50cnkpIFwKLQkoSVJPWzI2MF0uYmFzZSArICgocGZJZCkgKiBJUk9bMjYwXS5tMSkgKyAoKGlzY3NpQ29uQnVmUGJsRW50cnkpIFwKLQkqIElST1syNjBdLm0yKSkKKwkoSVJPWzIwMV0uYmFzZSArICgocGZJZCkgKiBJUk9bMjAxXS5tMSkpCisjZGVmaW5lIFRTVE9STV9GVU5DX0VOX09GRlNFVChmdW5jSWQpIFwKKwkoSVJPWzEwM10uYmFzZSArICgoZnVuY0lkKSAqIElST1sxMDNdLm0xKSkKICNkZWZpbmUgVFNUT1JNX0lTQ1NJX0VSUk9SX0JJVE1BUF9PRkZTRVQocGZJZCkgXAotCShJUk9bMjY0XS5iYXNlICsgKChwZklkKSAqIElST1syNjRdLm0xKSkKKwkoSVJPWzI3MV0uYmFzZSArICgocGZJZCkgKiBJUk9bMjcxXS5tMSkpCiAjZGVmaW5lIFRTVE9STV9JU0NTSV9MMl9JU0NTSV9PT09fQ0lEX1RBQkxFX09GRlNFVChwZklkKSBcCi0JKElST1syNjVdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI2NV0ubTEpKQorCShJUk9bMjcyXS5iYXNlICsgKChwZklkKSAqIElST1syNzJdLm0xKSkKICNkZWZpbmUgVFNUT1JNX0lTQ1NJX0wyX0lTQ1NJX09PT19DTElFTlRfSURfVEFCTEVfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzI2Nl0uYmFzZSArICgocGZJZCkgKiBJUk9bMjY2XS5tMSkpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9MMl9JU0NTSV9PT09fUFJPRF9PRkZTRVQocGZJZCkgXAotCShJUk9bMjY3XS5iYXNlICsgKChwZklkKSAqIElST1syNjddLm0xKSkKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX05VTV9PRl9UQVNLU19PRkZTRVQocGZJZCkgXAotCShJUk9bMjYzXS5iYXNlICsgKChwZklkKSAqIElST1syNjNdLm0xKSkKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX1BBR0VfU0laRV9MT0dfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzI2Ml0uYmFzZSArICgocGZJZCkgKiBJUk9bMjYyXS5tMSkpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9QQUdFX1NJWkVfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzI2MV0uYmFzZSArICgocGZJZCkgKiBJUk9bMjYxXS5tMSkpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9SUV9TSVpFX09GRlNFVChwZklkKSBcCi0JKElST1syNTldLmJhc2UgKyAoKHBmSWQpICogSVJPWzI1OV0ubTEpKQotI2RlZmluZSBUU1RPUk1fSVNDU0lfVENQX0xPQ0FMX0FEVl9XTkRfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzI2OV0uYmFzZSArICgocGZJZCkgKiBJUk9bMjY5XS5tMSkpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9UQ1BfVkFSU19GTEFHU19PRkZTRVQocGZJZCkgXAotCShJUk9bMjU2XS5iYXNlICsgKChwZklkKSAqIElST1syNTZdLm0xKSkKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX1RDUF9WQVJTX0xTQl9MT0NBTF9NQUNfQUREUl9PRkZTRVQocGZJZCkgXAotCShJUk9bMjU3XS5iYXNlICsgKChwZklkKSAqIElST1syNTddLm0xKSkKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX1RDUF9WQVJTX01TQl9MT0NBTF9NQUNfQUREUl9PRkZTRVQocGZJZCkgXAotCShJUk9bMjU4XS5iYXNlICsgKChwZklkKSAqIElST1syNThdLm0xKSkKLSNkZWZpbmUgVFNUT1JNX01BQ19GSUxURVJfQ09ORklHX09GRlNFVChwZklkKSBcCi0JKElST1sxOTZdLmJhc2UgKyAoKHBmSWQpICogSVJPWzE5Nl0ubTEpKQotCSNkZWZpbmUgVFNUT1JNX1BFUl9DT1VOVEVSX0lEX1NUQVRTX09GRlNFVChwb3J0SWQsIHRTdGF0Q250SWQpIFwKLQkoSVJPWzEwMF0uYmFzZSArICgocG9ydElkKSAqIElST1sxMDBdLm0xKSArICgodFN0YXRDbnRJZCkgKiBcCi0JSVJPWzEwMF0ubTIpKQotI2RlZmluZSBUU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzk1XS5iYXNlICsgKChwZklkKSAqIElST1s5NV0ubTEpKQotI2RlZmluZSBUU1RPUk1fVENQX01BWF9DV05EX09GRlNFVChwZklkKSBcCi0JKElST1syMTFdLmJhc2UgKyAoKHBmSWQpICogSVJPWzIxMV0ubTEpKQotI2RlZmluZSBUU1RPUk1fVkZfVE9fUEZfT0ZGU0VUKGZ1bmNJZCkgXAotCShJUk9bMTAyXS5iYXNlICsgKChmdW5jSWQpICogSVJPWzEwMl0ubTEpKQotI2RlZmluZSBVU1RPUk1fQUdHX0RBVEFfT0ZGU0VUIChJUk9bMjAxXS5iYXNlKQotI2RlZmluZSBVU1RPUk1fQUdHX0RBVEFfU0laRSAoSVJPWzIwMV0uc2l6ZSkKLSNkZWZpbmUgVVNUT1JNX0FTU0VSVF9MSVNUX0lOREVYX09GRlNFVCAoSVJPWzE3MF0uYmFzZSkKLSNkZWZpbmUgVVNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChhc3NlcnRMaXN0RW50cnkpIFwKLQkoSVJPWzE2OV0uYmFzZSArICgoYXNzZXJ0TGlzdEVudHJ5KSAqIElST1sxNjldLm0xKSkKLSNkZWZpbmUgVVNUT1JNX0VUSF9QQVVTRV9FTkFCTEVEX09GRlNFVChwb3J0SWQpIFwKLQkoSVJPWzE3OF0uYmFzZSArICgocG9ydElkKSAqIElST1sxNzhdLm0xKSkKLSNkZWZpbmUgVVNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChwZklkKSBcCi0JKElST1sxNzJdLmJhc2UgKyAoKHBmSWQpICogSVJPWzE3Ml0ubTEpKQotI2RlZmluZSBVU1RPUk1fRkNPRV9FUV9QUk9EX09GRlNFVChwZklkKSBcCi0JKElST1szMTNdLmJhc2UgKyAoKHBmSWQpICogSVJPWzMxM10ubTEpKQotI2RlZmluZSBVU1RPUk1fRlVOQ19FTl9PRkZTRVQoZnVuY0lkKSBcCi0JKElST1sxNzRdLmJhc2UgKyAoKGZ1bmNJZCkgKiBJUk9bMTc0XS5tMSkpCi0jZGVmaW5lIFVTVE9STV9GVU5DVElPTl9NT0RFX09GRlNFVCAoSVJPWzE3N10uYmFzZSkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0NRX1NJWkVfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzI3N10uYmFzZSArICgocGZJZCkgKiBJUk9bMjc3XS5tMSkpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9DUV9TUU5fU0laRV9PRkZTRVQocGZJZCkgXAotCShJUk9bMjc4XS5iYXNlICsgKChwZklkKSAqIElST1syNzhdLm0xKSkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0VSUk9SX0JJVE1BUF9PRkZTRVQocGZJZCkgXAotCShJUk9bMjgyXS5iYXNlICsgKChwZklkKSAqIElST1syODJdLm0xKSkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0dMT0JBTF9CVUZfUEhZU19BRERSX09GRlNFVChwZklkKSBcCi0JKElST1syNzldLmJhc2UgKyAoKHBmSWQpICogSVJPWzI3OV0ubTEpKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfTlVNX09GX1RBU0tTX09GRlNFVChwZklkKSBcCi0JKElST1syNzVdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI3NV0ubTEpKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfUEFHRV9TSVpFX0xPR19PRkZTRVQocGZJZCkgXAotCShJUk9bMjc0XS5iYXNlICsgKChwZklkKSAqIElST1syNzRdLm0xKSkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1BBR0VfU0laRV9PRkZTRVQocGZJZCkgXAogCShJUk9bMjczXS5iYXNlICsgKChwZklkKSAqIElST1syNzNdLm0xKSkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1IyVFFfU0laRV9PRkZTRVQocGZJZCkgXAorI2RlZmluZSBUU1RPUk1fSVNDU0lfTDJfSVNDU0lfT09PX1BST0RfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzI3NF0uYmFzZSArICgocGZJZCkgKiBJUk9bMjc0XS5tMSkpCisjZGVmaW5lIFRTVE9STV9JU0NTSV9OVU1fT0ZfVEFTS1NfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzI3MF0uYmFzZSArICgocGZJZCkgKiBJUk9bMjcwXS5tMSkpCisjZGVmaW5lIFRTVE9STV9JU0NTSV9QQUdFX1NJWkVfTE9HX09GRlNFVChwZklkKSBcCisJKElST1syNjldLmJhc2UgKyAoKHBmSWQpICogSVJPWzI2OV0ubTEpKQorI2RlZmluZSBUU1RPUk1fSVNDU0lfUEFHRV9TSVpFX09GRlNFVChwZklkKSBcCisJKElST1syNjhdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI2OF0ubTEpKQorI2RlZmluZSBUU1RPUk1fSVNDU0lfUlFfU0laRV9PRkZTRVQocGZJZCkgXAorCShJUk9bMjY3XS5iYXNlICsgKChwZklkKSAqIElST1syNjddLm0xKSkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1RDUF9MT0NBTF9BRFZfV05EX09GRlNFVChwZklkKSBcCiAJKElST1syNzZdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI3Nl0ubTEpKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfUlFfQlVGRkVSX1NJWkVfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzI4MF0uYmFzZSArICgocGZJZCkgKiBJUk9bMjgwXS5tMSkpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9SUV9TSVpFX09GRlNFVChwZklkKSBcCisjZGVmaW5lIFRTVE9STV9JU0NTSV9UQ1BfVkFSU19GTEFHU19PRkZTRVQocGZJZCkgXAorCShJUk9bMjYzXS5iYXNlICsgKChwZklkKSAqIElST1syNjNdLm0xKSkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1RDUF9WQVJTX0xTQl9MT0NBTF9NQUNfQUREUl9PRkZTRVQocGZJZCkgXAorCShJUk9bMjY0XS5iYXNlICsgKChwZklkKSAqIElST1syNjRdLm0xKSkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1RDUF9WQVJTX01JRF9MT0NBTF9NQUNfQUREUl9PRkZTRVQocGZJZCkgXAorCShJUk9bMjY1XS5iYXNlICsgKChwZklkKSAqIElST1syNjVdLm0xKSkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1RDUF9WQVJTX01TQl9MT0NBTF9NQUNfQUREUl9PRkZTRVQocGZJZCkgXAorCShJUk9bMjY2XS5iYXNlICsgKChwZklkKSAqIElST1syNjZdLm0xKSkKKyNkZWZpbmUgVFNUT1JNX01BQ19GSUxURVJfQ09ORklHX09GRlNFVChwZklkKSBcCisJKElST1syMDJdLmJhc2UgKyAoKHBmSWQpICogSVJPWzIwMl0ubTEpKQorI2RlZmluZSBUU1RPUk1fUkVDT1JEX1NMT1dfUEFUSF9PRkZTRVQoZnVuY0lkKSBcCisJKElST1sxMDVdLmJhc2UgKyAoKGZ1bmNJZCkgKiBJUk9bMTA1XS5tMSkpCisjZGVmaW5lIFRTVE9STV9UQ1BfTUFYX0NXTkRfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzIxNl0uYmFzZSArICgocGZJZCkgKiBJUk9bMjE2XS5tMSkpCisjZGVmaW5lIFRTVE9STV9WRl9UT19QRl9PRkZTRVQoZnVuY0lkKSBcCisJKElST1sxMDRdLmJhc2UgKyAoKGZ1bmNJZCkgKiBJUk9bMTA0XS5tMSkpCisjZGVmaW5lIFVTVE9STV9BR0dfREFUQV9PRkZTRVQgKElST1syMDZdLmJhc2UpCisjZGVmaW5lIFVTVE9STV9BR0dfREFUQV9TSVpFIChJUk9bMjA2XS5zaXplKQorI2RlZmluZSBVU1RPUk1fQVNTRVJUX0xJU1RfSU5ERVhfT0ZGU0VUCShJUk9bMTc3XS5iYXNlKQorI2RlZmluZSBVU1RPUk1fQVNTRVJUX0xJU1RfT0ZGU0VUKGFzc2VydExpc3RFbnRyeSkgXAorCShJUk9bMTc2XS5iYXNlICsgKChhc3NlcnRMaXN0RW50cnkpICogSVJPWzE3Nl0ubTEpKQorI2RlZmluZSBVU1RPUk1fQ1FFX1BBR0VfTkVYVF9PRkZTRVQocG9ydElkLCBjbGllbnRJZCkgXAorCShJUk9bMjA1XS5iYXNlICsgKChwb3J0SWQpICogSVJPWzIwNV0ubTEpICsgKChjbGllbnRJZCkgKiBcCisJSVJPWzIwNV0ubTIpKQorI2RlZmluZSBVU1RPUk1fRVRIX1BBVVNFX0VOQUJMRURfT0ZGU0VUKHBvcnRJZCkgXAorCShJUk9bMTgzXS5iYXNlICsgKChwb3J0SWQpICogSVJPWzE4M10ubTEpKQorI2RlZmluZSBVU1RPUk1fRkNPRV9FUV9QUk9EX09GRlNFVChwZklkKSBcCisJKElST1szMTddLmJhc2UgKyAoKHBmSWQpICogSVJPWzMxN10ubTEpKQorI2RlZmluZSBVU1RPUk1fRlVOQ19FTl9PRkZTRVQoZnVuY0lkKSBcCisJKElST1sxNzhdLmJhc2UgKyAoKGZ1bmNJZCkgKiBJUk9bMTc4XS5tMSkpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9DUV9TSVpFX09GRlNFVChwZklkKSBcCiAJKElST1syODFdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI4MV0ubTEpKQotI2RlZmluZSBVU1RPUk1fTUVNX1dPUktBUk9VTkRfQUREUkVTU19PRkZTRVQocGZJZCkgXAotCShJUk9bMTc2XS5iYXNlICsgKChwZklkKSAqIElST1sxNzZdLm0xKSkKLQkjZGVmaW5lIFVTVE9STV9QRVJfQ09VTlRFUl9JRF9TVEFUU19PRkZTRVQocG9ydElkLCB1U3RhdENudElkKSBcCi0JKElST1sxNzNdLmJhc2UgKyAoKHBvcnRJZCkgKiBJUk9bMTczXS5tMSkgKyAoKHVTdGF0Q250SWQpICogXAotCUlST1sxNzNdLm0yKSkKLQkjZGVmaW5lIFVTVE9STV9SWF9QUk9EU19FMVhfT0ZGU0VUKHBvcnRJZCwgY2xpZW50SWQpIFwKLQkoSVJPWzIwNF0uYmFzZSArICgocG9ydElkKSAqIElST1syMDRdLm0xKSArICgoY2xpZW50SWQpICogXAotCUlST1syMDRdLm0yKSkKLSNkZWZpbmUgVVNUT1JNX1JYX1BST0RTX0UyX09GRlNFVChxem9uZUlkKSBcCi0JKElST1syMDVdLmJhc2UgKyAoKHF6b25lSWQpICogSVJPWzIwNV0ubTEpKQotI2RlZmluZSBVU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzE3MV0uYmFzZSArICgocGZJZCkgKiBJUk9bMTcxXS5tMSkpCi0jZGVmaW5lIFVTVE9STV9UUEFfQlRSX09GRlNFVCAoSVJPWzIwMl0uYmFzZSkKLSNkZWZpbmUgVVNUT1JNX1RQQV9CVFJfU0laRSAoSVJPWzIwMl0uc2l6ZSkKLSNkZWZpbmUgVVNUT1JNX1ZGX1RPX1BGX09GRlNFVChmdW5jSWQpIFwKLQkoSVJPWzE3NV0uYmFzZSArICgoZnVuY0lkKSAqIElST1sxNzVdLm0xKSkKLSNkZWZpbmUgWFNUT1JNX0FHR19JTlRfRklOQUxfQ0xFQU5VUF9DT01QX1RZUEUgKElST1s1OV0uYmFzZSkKLSNkZWZpbmUgWFNUT1JNX0FHR19JTlRfRklOQUxfQ0xFQU5VUF9JTkRFWCAoSVJPWzU4XS5iYXNlKQotI2RlZmluZSBYU1RPUk1fQVNTRVJUX0xJU1RfSU5ERVhfT0ZGU0VUIChJUk9bNTRdLmJhc2UpCi0jZGVmaW5lIFhTVE9STV9BU1NFUlRfTElTVF9PRkZTRVQoYXNzZXJ0TGlzdEVudHJ5KSBcCi0JKElST1s1M10uYmFzZSArICgoYXNzZXJ0TGlzdEVudHJ5KSAqIElST1s1M10ubTEpKQotI2RlZmluZSBYU1RPUk1fQ01OR19QRVJfUE9SVF9WQVJTX09GRlNFVChwb3J0SWQpIFwKLQkoSVJPWzQ3XS5iYXNlICsgKChwb3J0SWQpICogSVJPWzQ3XS5tMSkpCi0jZGVmaW5lIFhTVE9STV9FMUhPVl9PRkZTRVQocGZJZCkgXAotCShJUk9bNTVdLmJhc2UgKyAoKHBmSWQpICogSVJPWzU1XS5tMSkpCi0jZGVmaW5lIFhTVE9STV9FVEhfU1RBVFNfUVVFUllfQUREUl9PRkZTRVQocGZJZCkgXAotCShJUk9bNDVdLmJhc2UgKyAoKHBmSWQpICogSVJPWzQ1XS5tMSkpCi0jZGVmaW5lIFhTVE9STV9GQUlSTkVTU19QRVJfVk5fVkFSU19PRkZTRVQocGZJZCkgXAotCShJUk9bNDldLmJhc2UgKyAoKHBmSWQpICogSVJPWzQ5XS5tMSkpCi0jZGVmaW5lIFhTVE9STV9GVU5DX0VOX09GRlNFVChmdW5jSWQpIFwKLQkoSVJPWzUxXS5iYXNlICsgKChmdW5jSWQpICogSVJPWzUxXS5tMSkpCi0jZGVmaW5lIFhTVE9STV9GVU5DVElPTl9NT0RFX09GRlNFVCAoSVJPWzU2XS5iYXNlKQotI2RlZmluZSBYU1RPUk1fSVNDU0lfSFFfU0laRV9PRkZTRVQocGZJZCkgXAotCShJUk9bMjkwXS5iYXNlICsgKChwZklkKSAqIElST1syOTBdLm0xKSkKLSNkZWZpbmUgWFNUT1JNX0lTQ1NJX0xPQ0FMX01BQ19BRERSMF9PRkZTRVQocGZJZCkgXAotCShJUk9bMjkzXS5iYXNlICsgKChwZklkKSAqIElST1syOTNdLm0xKSkKLSNkZWZpbmUgWFNUT1JNX0lTQ1NJX0xPQ0FMX01BQ19BRERSMV9PRkZTRVQocGZJZCkgXAotCShJUk9bMjk0XS5iYXNlICsgKChwZklkKSAqIElST1syOTRdLm0xKSkKLSNkZWZpbmUgWFNUT1JNX0lTQ1NJX0xPQ0FMX01BQ19BRERSMl9PRkZTRVQocGZJZCkgXAotCShJUk9bMjk1XS5iYXNlICsgKChwZklkKSAqIElST1syOTVdLm0xKSkKLSNkZWZpbmUgWFNUT1JNX0lTQ1NJX0xPQ0FMX01BQ19BRERSM19PRkZTRVQocGZJZCkgXAotCShJUk9bMjk2XS5iYXNlICsgKChwZklkKSAqIElST1syOTZdLm0xKSkKLSNkZWZpbmUgWFNUT1JNX0lTQ1NJX0xPQ0FMX01BQ19BRERSNF9PRkZTRVQocGZJZCkgXAotCShJUk9bMjk3XS5iYXNlICsgKChwZklkKSAqIElST1syOTddLm0xKSkKLSNkZWZpbmUgWFNUT1JNX0lTQ1NJX0xPQ0FMX01BQ19BRERSNV9PRkZTRVQocGZJZCkgXAotCShJUk9bMjk4XS5iYXNlICsgKChwZklkKSAqIElST1syOThdLm0xKSkKLSNkZWZpbmUgWFNUT1JNX0lTQ1NJX0xPQ0FMX1ZMQU5fT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzI5OV0uYmFzZSArICgocGZJZCkgKiBJUk9bMjk5XS5tMSkpCi0jZGVmaW5lIFhTVE9STV9JU0NTSV9OVU1fT0ZfVEFTS1NfT0ZGU0VUKHBmSWQpIFwKLQkoSVJPWzI4OV0uYmFzZSArICgocGZJZCkgKiBJUk9bMjg5XS5tMSkpCi0jZGVmaW5lIFhTVE9STV9JU0NTSV9QQUdFX1NJWkVfTE9HX09GRlNFVChwZklkKSBcCi0JKElST1syODhdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI4OF0ubTEpKQotI2RlZmluZSBYU1RPUk1fSVNDU0lfUEFHRV9TSVpFX09GRlNFVChwZklkKSBcCi0JKElST1syODddLmJhc2UgKyAoKHBmSWQpICogSVJPWzI4N10ubTEpKQotI2RlZmluZSBYU1RPUk1fSVNDU0lfUjJUUV9TSVpFX09GRlNFVChwZklkKSBcCi0JKElST1syOTJdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI5Ml0ubTEpKQotI2RlZmluZSBYU1RPUk1fSVNDU0lfU1FfU0laRV9PRkZTRVQocGZJZCkgXAotCShJUk9bMjkxXS5iYXNlICsgKChwZklkKSAqIElST1syOTFdLm0xKSkKLSNkZWZpbmUgWFNUT1JNX0lTQ1NJX1RDUF9WQVJTX0FEVl9XTkRfU0NMX09GRlNFVChwZklkKSBcCisjZGVmaW5lIFVTVE9STV9JU0NTSV9DUV9TUU5fU0laRV9PRkZTRVQocGZJZCkgXAorCShJUk9bMjgyXS5iYXNlICsgKChwZklkKSAqIElST1syODJdLm0xKSkKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0VSUk9SX0JJVE1BUF9PRkZTRVQocGZJZCkgXAogCShJUk9bMjg2XS5iYXNlICsgKChwZklkKSAqIElST1syODZdLm0xKSkKLSNkZWZpbmUgWFNUT1JNX0lTQ1NJX1RDUF9WQVJTX0ZMQUdTX09GRlNFVChwZklkKSBcCi0JKElST1syODVdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI4NV0ubTEpKQotI2RlZmluZSBYU1RPUk1fSVNDU0lfVENQX1ZBUlNfVE9TX09GRlNFVChwZklkKSBcCi0JKElST1syODRdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI4NF0ubTEpKQotI2RlZmluZSBYU1RPUk1fSVNDU0lfVENQX1ZBUlNfVFRMX09GRlNFVChwZklkKSBcCisjZGVmaW5lIFVTVE9STV9JU0NTSV9HTE9CQUxfQlVGX1BIWVNfQUREUl9PRkZTRVQocGZJZCkgXAogCShJUk9bMjgzXS5iYXNlICsgKChwZklkKSAqIElST1syODNdLm0xKSkKLSNkZWZpbmUgWFNUT1JNX1BBVEhfSURfT0ZGU0VUIChJUk9bNjVdLmJhc2UpCi0JI2RlZmluZSBYU1RPUk1fUEVSX0NPVU5URVJfSURfU1RBVFNfT0ZGU0VUKHBvcnRJZCwgeFN0YXRDbnRJZCkgXAotCShJUk9bNTBdLmJhc2UgKyAoKHBvcnRJZCkgKiBJUk9bNTBdLm0xKSArICgoeFN0YXRDbnRJZCkgKiBcCi0JSVJPWzUwXS5tMikpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9OVU1fT0ZfVEFTS1NfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzI3OV0uYmFzZSArICgocGZJZCkgKiBJUk9bMjc5XS5tMSkpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9QQUdFX1NJWkVfTE9HX09GRlNFVChwZklkKSBcCisJKElST1syNzhdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI3OF0ubTEpKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfUEFHRV9TSVpFX09GRlNFVChwZklkKSBcCisJKElST1syNzddLmJhc2UgKyAoKHBmSWQpICogSVJPWzI3N10ubTEpKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfUjJUUV9TSVpFX09GRlNFVChwZklkKSBcCisJKElST1syODBdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI4MF0ubTEpKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfUlFfQlVGRkVSX1NJWkVfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzI4NF0uYmFzZSArICgocGZJZCkgKiBJUk9bMjg0XS5tMSkpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9SUV9TSVpFX09GRlNFVChwZklkKSBcCisJKElST1syODVdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI4NV0ubTEpKQorI2RlZmluZSBVU1RPUk1fTUVNX1dPUktBUk9VTkRfQUREUkVTU19PRkZTRVQocGZJZCkgXAorCShJUk9bMTgyXS5iYXNlICsgKChwZklkKSAqIElST1sxODJdLm0xKSkKKyNkZWZpbmUgVVNUT1JNX1JFQ09SRF9TTE9XX1BBVEhfT0ZGU0VUKGZ1bmNJZCkgXAorCShJUk9bMTgwXS5iYXNlICsgKChmdW5jSWQpICogSVJPWzE4MF0ubTEpKQorI2RlZmluZSBVU1RPUk1fUlhfUFJPRFNfRTFYX09GRlNFVChwb3J0SWQsIGNsaWVudElkKSBcCisJKElST1syMDldLmJhc2UgKyAoKHBvcnRJZCkgKiBJUk9bMjA5XS5tMSkgKyAoKGNsaWVudElkKSAqIFwKKwlJUk9bMjA5XS5tMikpCisjZGVmaW5lIFVTVE9STV9SWF9QUk9EU19FMl9PRkZTRVQocXpvbmVJZCkgXAorCShJUk9bMjEwXS5iYXNlICsgKChxem9uZUlkKSAqIElST1syMTBdLm0xKSkKKyNkZWZpbmUgVVNUT1JNX1RQQV9CVFJfT0ZGU0VUIChJUk9bMjA3XS5iYXNlKQorI2RlZmluZSBVU1RPUk1fVFBBX0JUUl9TSVpFIChJUk9bMjA3XS5zaXplKQorI2RlZmluZSBVU1RPUk1fVkZfVE9fUEZfT0ZGU0VUKGZ1bmNJZCkgXAorCShJUk9bMTc5XS5iYXNlICsgKChmdW5jSWQpICogSVJPWzE3OV0ubTEpKQorI2RlZmluZSBYU1RPUk1fQUdHX0lOVF9GSU5BTF9DTEVBTlVQX0NPTVBfVFlQRSAoSVJPWzY3XS5iYXNlKQorI2RlZmluZSBYU1RPUk1fQUdHX0lOVF9GSU5BTF9DTEVBTlVQX0lOREVYIChJUk9bNjZdLmJhc2UpCisjZGVmaW5lIFhTVE9STV9BU1NFUlRfTElTVF9JTkRFWF9PRkZTRVQJKElST1s1MV0uYmFzZSkKKyNkZWZpbmUgWFNUT1JNX0FTU0VSVF9MSVNUX09GRlNFVChhc3NlcnRMaXN0RW50cnkpIFwKKwkoSVJPWzUwXS5iYXNlICsgKChhc3NlcnRMaXN0RW50cnkpICogSVJPWzUwXS5tMSkpCisjZGVmaW5lIFhTVE9STV9DTU5HX1BFUl9QT1JUX1ZBUlNfT0ZGU0VUKHBvcnRJZCkgXAorCShJUk9bNDNdLmJhc2UgKyAoKHBvcnRJZCkgKiBJUk9bNDNdLm0xKSkKKyNkZWZpbmUgWFNUT1JNX0ZBSVJORVNTX1BFUl9WTl9WQVJTX09GRlNFVChwZklkKSBcCisJKElST1s0NV0uYmFzZSArICgocGZJZCkgKiBJUk9bNDVdLm0xKSkKKyNkZWZpbmUgWFNUT1JNX0ZVTkNfRU5fT0ZGU0VUKGZ1bmNJZCkgXAorCShJUk9bNDddLmJhc2UgKyAoKGZ1bmNJZCkgKiBJUk9bNDddLm0xKSkKKyNkZWZpbmUgWFNUT1JNX0lTQ1NJX0hRX1NJWkVfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzI5NF0uYmFzZSArICgocGZJZCkgKiBJUk9bMjk0XS5tMSkpCisjZGVmaW5lIFhTVE9STV9JU0NTSV9MT0NBTF9NQUNfQUREUjBfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzI5N10uYmFzZSArICgocGZJZCkgKiBJUk9bMjk3XS5tMSkpCisjZGVmaW5lIFhTVE9STV9JU0NTSV9MT0NBTF9NQUNfQUREUjFfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzI5OF0uYmFzZSArICgocGZJZCkgKiBJUk9bMjk4XS5tMSkpCisjZGVmaW5lIFhTVE9STV9JU0NTSV9MT0NBTF9NQUNfQUREUjJfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzI5OV0uYmFzZSArICgocGZJZCkgKiBJUk9bMjk5XS5tMSkpCisjZGVmaW5lIFhTVE9STV9JU0NTSV9MT0NBTF9NQUNfQUREUjNfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzMwMF0uYmFzZSArICgocGZJZCkgKiBJUk9bMzAwXS5tMSkpCisjZGVmaW5lIFhTVE9STV9JU0NTSV9MT0NBTF9NQUNfQUREUjRfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzMwMV0uYmFzZSArICgocGZJZCkgKiBJUk9bMzAxXS5tMSkpCisjZGVmaW5lIFhTVE9STV9JU0NTSV9MT0NBTF9NQUNfQUREUjVfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzMwMl0uYmFzZSArICgocGZJZCkgKiBJUk9bMzAyXS5tMSkpCisjZGVmaW5lIFhTVE9STV9JU0NTSV9MT0NBTF9WTEFOX09GRlNFVChwZklkKSBcCisJKElST1szMDNdLmJhc2UgKyAoKHBmSWQpICogSVJPWzMwM10ubTEpKQorI2RlZmluZSBYU1RPUk1fSVNDU0lfTlVNX09GX1RBU0tTX09GRlNFVChwZklkKSBcCisJKElST1syOTNdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI5M10ubTEpKQorI2RlZmluZSBYU1RPUk1fSVNDU0lfUEFHRV9TSVpFX0xPR19PRkZTRVQocGZJZCkgXAorCShJUk9bMjkyXS5iYXNlICsgKChwZklkKSAqIElST1syOTJdLm0xKSkKKyNkZWZpbmUgWFNUT1JNX0lTQ1NJX1BBR0VfU0laRV9PRkZTRVQocGZJZCkgXAorCShJUk9bMjkxXS5iYXNlICsgKChwZklkKSAqIElST1syOTFdLm0xKSkKKyNkZWZpbmUgWFNUT1JNX0lTQ1NJX1IyVFFfU0laRV9PRkZTRVQocGZJZCkgXAorCShJUk9bMjk2XS5iYXNlICsgKChwZklkKSAqIElST1syOTZdLm0xKSkKKyNkZWZpbmUgWFNUT1JNX0lTQ1NJX1NRX1NJWkVfT0ZGU0VUKHBmSWQpIFwKKwkoSVJPWzI5NV0uYmFzZSArICgocGZJZCkgKiBJUk9bMjk1XS5tMSkpCisjZGVmaW5lIFhTVE9STV9JU0NTSV9UQ1BfVkFSU19BRFZfV05EX1NDTF9PRkZTRVQocGZJZCkgXAorCShJUk9bMjkwXS5iYXNlICsgKChwZklkKSAqIElST1syOTBdLm0xKSkKKyNkZWZpbmUgWFNUT1JNX0lTQ1NJX1RDUF9WQVJTX0ZMQUdTX09GRlNFVChwZklkKSBcCisJKElST1syODldLmJhc2UgKyAoKHBmSWQpICogSVJPWzI4OV0ubTEpKQorI2RlZmluZSBYU1RPUk1fSVNDU0lfVENQX1ZBUlNfVE9TX09GRlNFVChwZklkKSBcCisJKElST1syODhdLmJhc2UgKyAoKHBmSWQpICogSVJPWzI4OF0ubTEpKQorI2RlZmluZSBYU1RPUk1fSVNDU0lfVENQX1ZBUlNfVFRMX09GRlNFVChwZklkKSBcCisJKElST1syODddLmJhc2UgKyAoKHBmSWQpICogSVJPWzI4N10ubTEpKQogI2RlZmluZSBYU1RPUk1fUkFURV9TSEFQSU5HX1BFUl9WTl9WQVJTX09GRlNFVChwZklkKSBcCi0JKElST1s0OF0uYmFzZSArICgocGZJZCkgKiBJUk9bNDhdLm0xKSkKKwkoSVJPWzQ0XS5iYXNlICsgKChwZklkKSAqIElST1s0NF0ubTEpKQorI2RlZmluZSBYU1RPUk1fUkVDT1JEX1NMT1dfUEFUSF9PRkZTRVQoZnVuY0lkKSBcCisJKElST1s0OV0uYmFzZSArICgoZnVuY0lkKSAqIElST1s0OV0ubTEpKQogI2RlZmluZSBYU1RPUk1fU1BRX0RBVEFfT0ZGU0VUKGZ1bmNJZCkgXAogCShJUk9bMzJdLmJhc2UgKyAoKGZ1bmNJZCkgKiBJUk9bMzJdLm0xKSkKICNkZWZpbmUgWFNUT1JNX1NQUV9EQVRBX1NJWkUgKElST1szMl0uc2l6ZSkKQEAgLTI2MCw0MiArMjMyLDM3IEBACiAJKElST1szMF0uYmFzZSArICgoZnVuY0lkKSAqIElST1szMF0ubTEpKQogI2RlZmluZSBYU1RPUk1fU1BRX1BST0RfT0ZGU0VUKGZ1bmNJZCkgXAogCShJUk9bMzFdLmJhc2UgKyAoKGZ1bmNJZCkgKiBJUk9bMzFdLm0xKSkKLSNkZWZpbmUgWFNUT1JNX1NUQVRTX0ZMQUdTX09GRlNFVChwZklkKSBcCi0JKElST1s0M10uYmFzZSArICgocGZJZCkgKiBJUk9bNDNdLm0xKSkKICNkZWZpbmUgWFNUT1JNX1RDUF9HTE9CQUxfREVMX0FDS19DT1VOVEVSX0VOQUJMRURfT0ZGU0VUKHBvcnRJZCkgXAotCShJUk9bMjA2XS5iYXNlICsgKChwb3J0SWQpICogSVJPWzIwNl0ubTEpKQorCShJUk9bMjExXS5iYXNlICsgKChwb3J0SWQpICogSVJPWzIxMV0ubTEpKQogI2RlZmluZSBYU1RPUk1fVENQX0dMT0JBTF9ERUxfQUNLX0NPVU5URVJfTUFYX0NPVU5UX09GRlNFVChwb3J0SWQpIFwKLQkoSVJPWzIwN10uYmFzZSArICgocG9ydElkKSAqIElST1syMDddLm0xKSkKKwkoSVJPWzIxMl0uYmFzZSArICgocG9ydElkKSAqIElST1syMTJdLm0xKSkKICNkZWZpbmUgWFNUT1JNX1RDUF9UWF9TV1NfVElNRVJfVkFMX09GRlNFVChwZklkKSBcCi0JKElST1syMDldLmJhc2UgKyAoKChwZklkKT4+MSkgKiBJUk9bMjA5XS5tMSkgKyAoKChwZklkKSYxKSAqIFwKLQlJUk9bMjA5XS5tMikpCisJKElST1syMTRdLmJhc2UgKyAoKChwZklkKT4+MSkgKiBJUk9bMjE0XS5tMSkgKyAoKChwZklkKSYxKSAqIFwKKwlJUk9bMjE0XS5tMikpCiAjZGVmaW5lIFhTVE9STV9WRl9UT19QRl9PRkZTRVQoZnVuY0lkKSBcCi0JKElST1s1Ml0uYmFzZSArICgoZnVuY0lkKSAqIElST1s1Ml0ubTEpKQorCShJUk9bNDhdLmJhc2UgKyAoKGZ1bmNJZCkgKiBJUk9bNDhdLm0xKSkKICNkZWZpbmUgQ09NTU9OX0FTTV9JTlZBTElEX0FTU0VSVF9PUENPREUgMHgwCiAKLS8qIFJTUyBoYXNoIHR5cGVzICovCi0jZGVmaW5lIERFRkFVTFRfSEFTSF9UWVBFIDAKLSNkZWZpbmUgSVBWNF9IQVNIX1RZUEUgMQotI2RlZmluZSBUQ1BfSVBWNF9IQVNIX1RZUEUgMgotI2RlZmluZSBJUFY2X0hBU0hfVFlQRSAzCi0jZGVmaW5lIFRDUF9JUFY2X0hBU0hfVFlQRSA0Ci0jZGVmaW5lIFZMQU5fUFJJX0hBU0hfVFlQRSA1Ci0jZGVmaW5lIEUxSE9WX1BSSV9IQVNIX1RZUEUgNgotI2RlZmluZSBEU0NQX0hBU0hfVFlQRSA3CisvKioKKyogVGhpcyBmaWxlIGRlZmluZXMgSFNJIGNvbnN0YW50cyBmb3IgdGhlIEVUSCBmbG93CisqLworI2lmZGVmIF9FVkVSRVNUX01JQ1JPQ09ERQorI2luY2x1ZGUgIk1pY3JvY29kZVxHZW5lcmF0ZWRcRGF0YVR5cGVzXGV0aF9yeF9iZC5oIgorI2luY2x1ZGUgIk1pY3JvY29kZVxHZW5lcmF0ZWRcRGF0YVR5cGVzXGV0aF90eF9iZC5oIgorI2luY2x1ZGUgIk1pY3JvY29kZVxHZW5lcmF0ZWRcRGF0YVR5cGVzXGV0aF9yeF9jcWUuaCIKKyNpbmNsdWRlICJNaWNyb2NvZGVcR2VuZXJhdGVkXERhdGFUeXBlc1xldGhfcnhfc2dlLmgiCisjaW5jbHVkZSAiTWljcm9jb2RlXEdlbmVyYXRlZFxEYXRhVHlwZXNcZXRoX3J4X2NxZV9uZXh0X3BhZ2UuaCIKKyNlbmRpZgogCiAKIC8qIEV0aGVybmV0IFJpbmcgcGFyYW1ldGVycyAqLwogI2RlZmluZSBYX0VUSF9MT0NBTF9SSU5HX1NJWkUgMTMKLSNkZWZpbmUgRklSU1RfQkRfSU5fUEtUIDAKKyNkZWZpbmUgRklSU1RfQkRfSU5fUEtUCTAKICNkZWZpbmUgUEFSU0VfQkRfSU5ERVggMQogI2RlZmluZSBOVU1fT0ZfRVRIX0JEU19JTl9QQUdFICgoUEFHRV9TSVpFKS8oU1RSVUNUX1NJWkUoZXRoX3R4X2JkKS84KSkKICNkZWZpbmUgVV9FVEhfTlVNX09GX1NHRVNfVE9fRkVUQ0ggOAogI2RlZmluZSBVX0VUSF9NQVhfU0dFU19GT1JfUEFDS0VUIDMKIAotLypUeCBwYXJhbXMqLwotI2RlZmluZSBYX0VUSF9OT19WTEFOIDAKLSNkZWZpbmUgWF9FVEhfT1VUQkFORF9WTEFOIDEKLSNkZWZpbmUgWF9FVEhfSU5CQU5EX1ZMQU4gMgogLyogUnggcmluZyBwYXJhbXMgKi8KICNkZWZpbmUgVV9FVEhfTE9DQUxfQkRfUklOR19TSVpFIDgKICNkZWZpbmUgVV9FVEhfTE9DQUxfU0dFX1JJTkdfU0laRSAxMApAQCAtMzExLDc5ICsyNzgsNjQgQEAKICNkZWZpbmUgVV9FVEhfQkRTX1BFUl9QQUdFIChQQUdFX1NJWkUvKFNUUlVDVF9TSVpFKGV0aF9yeF9iZCkvOCkpCiAjZGVmaW5lIFVfRVRIX1NHRVNfUEVSX1BBR0UgKFBBR0VfU0laRS8oU1RSVUNUX1NJWkUoZXRoX3J4X3NnZSkvOCkpCiAKLSNkZWZpbmUgVV9FVEhfQkRTX1BFUl9QQUdFX01BU0sgKFVfRVRIX0JEU19QRVJfUEFHRS0xKQotI2RlZmluZSBVX0VUSF9DUUVfUEVSX1BBR0VfTUFTSyAoVFVfRVRIX0NRRVNfUEVSX1BBR0UtMSkKKyNkZWZpbmUgVV9FVEhfQkRTX1BFUl9QQUdFX01BU0sJKFVfRVRIX0JEU19QRVJfUEFHRS0xKQorI2RlZmluZSBVX0VUSF9DUUVfUEVSX1BBR0VfTUFTSwkoVFVfRVRIX0NRRVNfUEVSX1BBR0UtMSkKICNkZWZpbmUgVV9FVEhfU0dFU19QRVJfUEFHRV9NQVNLIChVX0VUSF9TR0VTX1BFUl9QQUdFLTEpCiAKICNkZWZpbmUgVV9FVEhfVU5ERUZJTkVEX1EgMHhGRgogCi0vKiB2YWx1ZXMgb2YgY29tbWFuZCBJRHMgaW4gdGhlIHJhbXJvZCBtZXNzYWdlICovCi0jZGVmaW5lIFJBTVJPRF9DTURfSURfRVRIX1VOVVNFRCAwCi0jZGVmaW5lIFJBTVJPRF9DTURfSURfRVRIX0NMSUVOVF9TRVRVUCAxCi0jZGVmaW5lIFJBTVJPRF9DTURfSURfRVRIX1VQREFURSAyCi0jZGVmaW5lIFJBTVJPRF9DTURfSURfRVRIX0hBTFQgMwotI2RlZmluZSBSQU1ST0RfQ01EX0lEX0VUSF9GT1JXQVJEX1NFVFVQIDQKLSNkZWZpbmUgUkFNUk9EX0NNRF9JRF9FVEhfQUNUSVZBVEUgNQotI2RlZmluZSBSQU1ST0RfQ01EX0lEX0VUSF9ERUFDVElWQVRFIDYKLSNkZWZpbmUgUkFNUk9EX0NNRF9JRF9FVEhfRU1QVFkgNwotI2RlZmluZSBSQU1ST0RfQ01EX0lEX0VUSF9URVJNSU5BVEUgOAotCi0vKiBjb21tYW5kIHZhbHVlcyBmb3Igc2V0IG1hYyBjb21tYW5kICovCi0jZGVmaW5lIFRfRVRIX01BQ19DT01NQU5EX1NFVCAwCi0jZGVmaW5lIFRfRVRIX01BQ19DT01NQU5EX0lOVkFMSURBVEUgMQotCiAjZGVmaW5lIFRfRVRIX0lORElSRUNUSU9OX1RBQkxFX1NJWkUgMTI4CisjZGVmaW5lIFRfRVRIX1JTU19LRVkgMTAKKyNkZWZpbmUgRVRIX05VTV9PRl9SU1NfRU5HSU5FU19FMiA3MgorCisjZGVmaW5lIEZJTFRFUl9SVUxFU19DT1VOVCAxNgorI2RlZmluZSBNVUxUSUNBU1RfUlVMRVNfQ09VTlQgMTYKKyNkZWZpbmUgQ0xBU1NJRllfUlVMRVNfQ09VTlQgMTYKIAogLypUaGUgQ1JDMzIgc2VlZCwgdGhhdCBpcyB1c2VkIGZvciB0aGUgaGFzaChyZWR1Y3Rpb24pIG11bHRpY2FzdCBhZGRyZXNzICovCi0jZGVmaW5lIFRfRVRIX0NSQzMyX0hBU0hfU0VFRCAweDAwMDAwMDAwCisjZGVmaW5lIEVUSF9DUkMzMl9IQVNIX1NFRUQgMHgwMDAwMDAwMAorCisjZGVmaW5lIEVUSF9DUkMzMl9IQVNIX0JJVF9TSVpFCSg4KQorI2RlZmluZSBFVEhfQ1JDMzJfSEFTSF9NQVNLIEVWQUwoKDE8PEVUSF9DUkMzMl9IQVNIX0JJVF9TSVpFKS0xKQogCiAvKiBNYXhpbWFsIEwyIGNsaWVudHMgc3VwcG9ydGVkICovCiAjZGVmaW5lIEVUSF9NQVhfUlhfQ0xJRU5UU19FMSAxOAogI2RlZmluZSBFVEhfTUFYX1JYX0NMSUVOVFNfRTFIIDI4CisjZGVmaW5lIEVUSF9NQVhfUlhfQ0xJRU5UU19FMiAxNTIKIAotI2RlZmluZSBNQVhfU1RBVF9DT1VOVEVSX0lEIEVUSF9NQVhfUlhfQ0xJRU5UU19FMUgKKy8qIE1heGltYWwgc3RhdGlzdGljcyBjbGllbnQgSWRzICovCisjZGVmaW5lIE1BWF9TVEFUX0NPVU5URVJfSURfRTEgMzYKKyNkZWZpbmUgTUFYX1NUQVRfQ09VTlRFUl9JRF9FMUgJNTYKKyNkZWZpbmUgTUFYX1NUQVRfQ09VTlRFUl9JRF9FMiAxNDAKKworI2RlZmluZSBNQVhfTUFDX0NSRURJVF9FMSAxOTIgLyogUGVyIENoaXAgKi8KKyNkZWZpbmUgTUFYX01BQ19DUkVESVRfRTFIIDI1NiAvKiBQZXIgQ2hpcCAqLworI2RlZmluZSBNQVhfTUFDX0NSRURJVF9FMiAyNzIgLyogUGVyIFBhdGggKi8KKyNkZWZpbmUgTUFYX1ZMQU5fQ1JFRElUX0UxIDAgLyogUGVyIENoaXAgKi8KKyNkZWZpbmUgTUFYX1ZMQU5fQ1JFRElUX0UxSCAwIC8qIFBlciBDaGlwICovCisjZGVmaW5lIE1BWF9WTEFOX0NSRURJVF9FMiAyNzIgLyogUGVyIFBhdGggKi8KKwogCiAvKiBNYXhpbWFsIGFnZ3JlZ2F0aW9uIHF1ZXVlcyBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgRVRIX01BWF9BR0dSRUdBVElPTl9RVUVVRVNfRTEgMzIKLSNkZWZpbmUgRVRIX01BWF9BR0dSRUdBVElPTl9RVUVVRVNfRTFIIDY0Ci0KLS8qIEVUSCBSU1MgbW9kZXMgKi8KLSNkZWZpbmUgRVRIX1JTU19NT0RFX0RJU0FCTEVEIDAKLSNkZWZpbmUgRVRIX1JTU19NT0RFX1JFR1VMQVIgMQotI2RlZmluZSBFVEhfUlNTX01PREVfVkxBTl9QUkkgMgotI2RlZmluZSBFVEhfUlNTX01PREVfRTFIT1ZfUFJJIDMKLSNkZWZpbmUgRVRIX1JTU19NT0RFX0lQX0RTQ1AgNAotI2RlZmluZSBFVEhfUlNTX01PREVfRTJfSU5URUcgNQorI2RlZmluZSBFVEhfTUFYX0FHR1JFR0FUSU9OX1FVRVVFU19FMUhfRTIgNjQKIAogCi0vKiBFVEggdmxhbiBmaWx0ZXJpbmcgbW9kZXMgKi8KLSNkZWZpbmUgRVRIX1ZMQU5fRklMVEVSX0FOWV9WTEFOIDAgLyogRG9uJ3QgZmlsdGVyIGJ5IHZsYW4gKi8KLSNkZWZpbmUgRVRIX1ZMQU5fRklMVEVSX1NQRUNJRklDX1ZMQU4gXAotCTEgLyogT25seSB0aGUgdmxhbl9pZCBpcyBhbGxvd2VkICovCi0jZGVmaW5lIEVUSF9WTEFOX0ZJTFRFUl9DTEFTU0lGWSBcCi0JMiAvKiB2bGFuIHdpbGwgYmUgYWRkZWQgdG8gQ0FNIGZvciBjbGFzc2lmaWNhdGlvbiAqLworI2RlZmluZSBFVEhfTlVNX09GX01DQVNUX0JJTlMgMjU2CisjZGVmaW5lIEVUSF9OVU1fT0ZfTUNBU1RfRU5HSU5FU19FMiA3MgogCi0vKiBGYXN0IHBhdGggQ1FFIHNlbGVjdGlvbiAqLwotI2RlZmluZSBFVEhfRlBfQ1FFX1JFR1VMQVIgMAotI2RlZmluZSBFVEhfRlBfQ1FFX1NHTCAxCi0jZGVmaW5lIEVUSF9GUF9DUUVfUkFXIDIKKyNkZWZpbmUgRVRIX01JTl9SWF9DUUVTX1dJVEhPVVRfVFBBIChNQVhfUkFNUk9EU19QRVJfUE9SVCArIDMpCisjZGVmaW5lIEVUSF9NSU5fUlhfQ1FFU19XSVRIX1RQQV9FMSBcCisJKEVUSF9NQVhfQUdHUkVHQVRJT05fUVVFVUVTX0UxICsgRVRIX01JTl9SWF9DUUVTX1dJVEhPVVRfVFBBKQorI2RlZmluZSBFVEhfTUlOX1JYX0NRRVNfV0lUSF9UUEFfRTFIX0UyIFwKKwkoRVRIX01BWF9BR0dSRUdBVElPTl9RVUVVRVNfRTFIX0UyICsgRVRIX01JTl9SWF9DUUVTX1dJVEhPVVRfVFBBKQorCisjZGVmaW5lIERJU0FCTEVfU1RBVElTVElDX0NPVU5URVJfSURfVkFMVUUgMAogCiAKIC8qKgotKiBUaGlzIGZpbGUgZGVmaW5lcyBIU0kgY29uc3RhbnRzIGNvbW1vbiB0byBhbGwgbWljcm9jb2RlIGZsb3dzCi0qLwotCi0vKiBDb25uZWN0aW9uIHR5cGVzICovCi0jZGVmaW5lIEVUSF9DT05ORUNUSU9OX1RZUEUgMAotI2RlZmluZSBUT0VfQ09OTkVDVElPTl9UWVBFIDEKLSNkZWZpbmUgUkRNQV9DT05ORUNUSU9OX1RZUEUgMgotI2RlZmluZSBJU0NTSV9DT05ORUNUSU9OX1RZUEUgMwotI2RlZmluZSBGQ09FX0NPTk5FQ1RJT05fVFlQRSA0Ci0jZGVmaW5lIFJFU0VSVkVEX0NPTk5FQ1RJT05fVFlQRV8wIDUKLSNkZWZpbmUgUkVTRVJWRURfQ09OTkVDVElPTl9UWVBFXzEgNgotI2RlZmluZSBSRVNFUlZFRF9DT05ORUNUSU9OX1RZUEVfMiA3Ci0jZGVmaW5lIE5PTkVfQ09OTkVDVElPTl9UWVBFIDgKLQorICogVGhpcyBmaWxlIGRlZmluZXMgSFNJIGNvbnN0YW50cyBjb21tb24gdG8gYWxsIG1pY3JvY29kZSBmbG93cworICovCiAKICNkZWZpbmUgUFJPVE9DT0xfU1RBVEVfQklUX09GRlNFVCA2CiAKQEAgLTM5MSwyNSArMzQzLDkgQEAKICNkZWZpbmUgVE9FX1NUQVRFIChUT0VfQ09OTkVDVElPTl9UWVBFIDw8IFBST1RPQ09MX1NUQVRFX0JJVF9PRkZTRVQpCiAjZGVmaW5lIFJETUFfU1RBVEUgKFJETUFfQ09OTkVDVElPTl9UWVBFIDw8IFBST1RPQ09MX1NUQVRFX0JJVF9PRkZTRVQpCiAKLS8qIHZhbHVlcyBvZiBjb21tYW5kIElEcyBpbiB0aGUgcmFtcm9kIG1lc3NhZ2UgKi8KLSNkZWZpbmUgUkFNUk9EX0NNRF9JRF9DT01NT05fRlVOQ1RJT05fU1RBUlQgMQotI2RlZmluZSBSQU1ST0RfQ01EX0lEX0NPTU1PTl9GVU5DVElPTl9TVE9QIDIKLSNkZWZpbmUgUkFNUk9EX0NNRF9JRF9DT01NT05fQ0ZDX0RFTCAzCi0jZGVmaW5lIFJBTVJPRF9DTURfSURfQ09NTU9OX0NGQ19ERUxfV0IgNAotI2RlZmluZSBSQU1ST0RfQ01EX0lEX0NPTU1PTl9TRVRfTUFDIDUKLSNkZWZpbmUgUkFNUk9EX0NNRF9JRF9DT01NT05fU1RBVF9RVUVSWSA2Ci0jZGVmaW5lIFJBTVJPRF9DTURfSURfQ09NTU9OX1NUT1BfVFJBRkZJQyA3Ci0jZGVmaW5lIFJBTVJPRF9DTURfSURfQ09NTU9OX1NUQVJUX1RSQUZGSUMgOAotCiAvKiBtaWNyb2NvZGUgZml4ZWQgcGFnZSBwYWdlIHNpemUgNEsgKGNoYWlucyBhbmQgcmluZyBzZWdtZW50cykgKi8KICNkZWZpbmUgTUNfUEFHRV9TSVpFIDQwOTYKIAotCi0vKiBIb3N0IGNvYWxlc2NpbmcgY29uc3RhbnRzICovCi0jZGVmaW5lIEhDX0lHVV9CQ19NT0RFIDAKLSNkZWZpbmUgSENfSUdVX05CQ19NT0RFIDEKLS8qIEhvc3QgY29hbGVzY2luZyBjb25zdGFudHMuIEUxIGluY2x1ZGVzIEUxSCBhcyB3ZWxsICovCi0KIC8qIE51bWJlciBvZiBpbmRpY2VzIHBlciBzbG93LXBhdGggU0IgKi8KICNkZWZpbmUgSENfU1BfU0JfTUFYX0lORElDRVMgMTYKIApAQCAtNDE4LDMwICszNTQsMTcgQEAKICNkZWZpbmUgSENfU0JfTUFYX0lORElDRVNfRTIgOAogCiAjZGVmaW5lIEhDX1NCX01BWF9TQl9FMVggMzIKLSNkZWZpbmUgSENfU0JfTUFYX1NCX0UyIDEzNgorI2RlZmluZSBIQ19TQl9NQVhfU0JfRTIJMTM2CiAKICNkZWZpbmUgSENfU1BfU0JfSUQgMHhkZQogCi0jZGVmaW5lIEhDX1JFR1VMQVJfU0VHTUVOVCAwCi0jZGVmaW5lIEhDX0RFRkFVTFRfU0VHTUVOVCAxCiAjZGVmaW5lIEhDX1NCX01BWF9TTSAyCiAKICNkZWZpbmUgSENfU0JfTUFYX0RZTkFNSUNfSU5ESUNFUyA0Ci0jZGVmaW5lIEhDX0ZVTkNUSU9OX0RJU0FCTEVEIDB4ZmYKLS8qIHVzZWQgYnkgdGhlIGRyaXZlciB0byBnZXQgdGhlIFNCIG9mZnNldCAqLwotI2RlZmluZSBVU1RPUk1fSUQgMAotI2RlZmluZSBDU1RPUk1fSUQgMQotI2RlZmluZSBYU1RPUk1fSUQgMgotI2RlZmluZSBUU1RPUk1fSUQgMwotI2RlZmluZSBBVFRFTlRJT05fSUQgNAogCiAvKiBtYXggbnVtYmVyIG9mIHNsb3cgcGF0aCBjb21tYW5kcyBwZXIgcG9ydCAqLwogI2RlZmluZSBNQVhfUkFNUk9EU19QRVJfUE9SVCA4CiAKLS8qIHZhbHVlcyBmb3IgUlggRVRIIENRRSB0eXBlIGZpZWxkICovCi0jZGVmaW5lIFJYX0VUSF9DUUVfVFlQRV9FVEhfRkFTVFBBVEggMAotI2RlZmluZSBSWF9FVEhfQ1FFX1RZUEVfRVRIX1JBTVJPRCAxCi0KIAogLyoqKiogREVGSU5FUyBGT1IgVElNRVJTL0NMT0NLUyBSRVNPTFVUSU9OUyAqKioqLwogCkBAIC00NTEsNyArMzc0LDcgQEAKIAogI2RlZmluZSBYU0VNSV9DTEsxX1JFU1VMX0NISVAgKDFlLTMpCiAKLSNkZWZpbmUgU0RNX1RJTUVSX1RJQ0tfUkVTVUxfQ0hJUCAoNCooMWUtNikpCisjZGVmaW5lIFNETV9USU1FUl9USUNLX1JFU1VMX0NISVAgKDQgKiAoMWUtNikpCiAKIC8qKioqIEVORCBERUZJTkVTIEZPUiBUSU1FUlMvQ0xPQ0tTIFJFU09MVVRJT05TICoqKiovCiAKQEAgLTQ2MCw3MiArMzgzLDI4IEBACiAKICNkZWZpbmUgRldfTE9HX0xJU1RfU0laRSA1MAogCi0jZGVmaW5lIE5VTV9PRl9QUk9UT0NPTFMgNAogI2RlZmluZSBOVU1fT0ZfU0FGQ19CSVRTIDE2CiAjZGVmaW5lIE1BWF9DT1NfTlVNQkVSIDQKLQotI2RlZmluZSBGQUlSTkVTU19DT1NfV1JSX01PREUgMAotI2RlZmluZSBGQUlSTkVTU19DT1NfRVRTX01PREUgMQotCi0KLS8qIFByaW9yaXR5IEZsb3cgQ29udHJvbCAoUEZDKSAqLworI2RlZmluZSBNQVhfVFJBRkZJQ19UWVBFUyA4CiAjZGVmaW5lIE1BWF9QRkNfUFJJT1JJVElFUyA4Ci0jZGVmaW5lIE1BWF9QRkNfVFJBRkZJQ19UWVBFUyA4Ci0KLS8qIEF2YWlsYWJsZSBUcmFmZmljIFR5cGVzIGZvciBMaW5rIExheWVyIEZsb3cgQ29udHJvbCAqLwotI2RlZmluZSBMTEZDX1RSQUZGSUNfVFlQRV9OVyAwCi0jZGVmaW5lIExMRkNfVFJBRkZJQ19UWVBFX0ZDT0UgMQotI2RlZmluZSBMTEZDX1RSQUZGSUNfVFlQRV9JU0NTSSAyCi0JLyoqKioqKioqKioqKioqKioqIFNUQVJUIE9GIEUyIElOVEVHUkFUSU9OIFwKLQlDT0RFKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBMTEZDX1RSQUZGSUNfVFlQRV9OV19DT1MxX0UySU5URUcgMwotCS8qKioqKioqKioqKioqKioqKiBFTkQgT0YgRTIgSU5URUdSQVRJT04gXAotCUNPREUqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIExMRkNfVFJBRkZJQ19UWVBFX01BWCA0CiAKIAkvKiB1c2VkIGJ5IGFycmF5IHRyYWZmaWNfdHlwZV90b19wcmlvcml0eVtdIHRvIG1hcmsgdHJhZmZpYyB0eXBlIFwKIAl0aGF0IGlzIG5vdCBtYXBwZWQgdG8gcHJpb3JpdHkqLwogI2RlZmluZSBMTEZDX1RSQUZGSUNfVFlQRV9UT19QUklPUklUWV9VTk1BUFBFRCAweEZGCiAKLSNkZWZpbmUgTExGQ19NT0RFX05PTkUgMAotI2RlZmluZSBMTEZDX01PREVfUEZDIDEKLSNkZWZpbmUgTExGQ19NT0RFX1NBRkMgMgotCi0jZGVmaW5lIERDQl9ESVNBQkxFRCAwCi0jZGVmaW5lIERDQl9FTkFCTEVEIDEKLQotI2RlZmluZSBVTktOT1dOX0FERFJFU1MgMAotI2RlZmluZSBVTklDQVNUX0FERFJFU1MgMQotI2RlZmluZSBNVUxUSUNBU1RfQUREUkVTUyAyCi0jZGVmaW5lIEJST0FEQ0FTVF9BRERSRVNTIDMKLQotI2RlZmluZSBTSU5HTEVfRlVOQ1RJT04gMAotI2RlZmluZSBNVUxUSV9GVU5DVElPTl9TRCAxCi0jZGVmaW5lIE1VTFRJX0ZVTkNUSU9OX1NJIDIKLQotI2RlZmluZSBJUF9WNCAwCi0jZGVmaW5lIElQX1Y2IDEKLQogCiAjZGVmaW5lIENfRVJFU19QRVJfUEFHRSBcCiAJKFBBR0VfU0laRSAvIEJJVFNfVE9fQllURVMoU1RSVUNUX1NJWkUoZXZlbnRfcmluZ19lbGVtKSkpCiAjZGVmaW5lIENfRVJFX1BFUl9QQUdFX01BU0sgKENfRVJFU19QRVJfUEFHRSAtIDEpCiAKLSNkZWZpbmUgRVZFTlRfUklOR19PUENPREVfVkZfUEZfQ0hBTk5FTCAwCi0jZGVmaW5lIEVWRU5UX1JJTkdfT1BDT0RFX0ZVTkNUSU9OX1NUQVJUIDEKLSNkZWZpbmUgRVZFTlRfUklOR19PUENPREVfRlVOQ1RJT05fU1RPUCAyCi0jZGVmaW5lIEVWRU5UX1JJTkdfT1BDT0RFX0NGQ19ERUwgMwotI2RlZmluZSBFVkVOVF9SSU5HX09QQ09ERV9DRkNfREVMX1dCIDQKLSNkZWZpbmUgRVZFTlRfUklOR19PUENPREVfU0VUX01BQyA1Ci0jZGVmaW5lIEVWRU5UX1JJTkdfT1BDT0RFX1NUQVRfUVVFUlkgNgotI2RlZmluZSBFVkVOVF9SSU5HX09QQ09ERV9TVE9QX1RSQUZGSUMgNwotI2RlZmluZSBFVkVOVF9SSU5HX09QQ09ERV9TVEFSVF9UUkFGRklDIDgKLSNkZWZpbmUgRVZFTlRfUklOR19PUENPREVfRk9SV0FSRF9TRVRVUCA5CisjZGVmaW5lIFNUQVRTX1FVRVJZX0NNRF9DT1VOVCAxNgogCi0jZGVmaW5lIFZGX1BGX0NIQU5ORUxfU1RBVEVfUkVBRFkgMAotI2RlZmluZSBWRl9QRl9DSEFOTkVMX1NUQVRFX1dBSVRJTkdfRk9SX0FDSyAxCisjZGVmaW5lIE5JVl9MSVNUX1RBQkxFX1NJWkUgNDA5NgogCi0jZGVmaW5lIFZGX1BGX0NIQU5ORUxfU1RBVEVfTUFYX05VTUJFUiAyCisjZGVmaW5lIElOVkFMSURfVk5JQ19JRAkweEZGCisKKworI2RlZmluZSBVTkRFRl9JUk8gMHg4MDAwMDAwMAogCiAKICNlbmRpZiAvKiBCTlgyWF9GV19ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2hzaS5oIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfaHNpLmgKaW5kZXggY2RmMTlmZS4uMDY3MjdmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfaHNpLmgKKysrIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfaHNpLmgKQEAgLTExLDcgKzExLDcgQEAKIAogI2luY2x1ZGUgImJueDJ4X2Z3X2RlZnMuaCIKIAotI2RlZmluZSBGV19FTkNPREVfMzJCSVRfUEFUVEVSTgkJMHgxZTFlMWUxZQorI2RlZmluZSBGV19FTkNPREVfMzJCSVRfUEFUVEVSTiAgICAgICAgIDB4MWUxZTFlMWUKIAogc3RydWN0IGxpY2Vuc2Vfa2V5IHsKIAl1MzIgcmVzZXJ2ZWRbNl07CkBAIC0zMywyMDEgKzMzLDM2NiBAQAogCXUzMiByZXNlcnZlZF9iWzRdOwogfTsKIAotI2RlZmluZSBQT1JUXzAJCQkJMAotI2RlZmluZSBQT1JUXzEJCQkJMQotI2RlZmluZSBQT1JUX01BWAkJCTIKKworI2RlZmluZSBQT1JUXzAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUE9SVF8xICAgICAgICAgICAgICAxCisjZGVmaW5lIFBPUlRfTUFYICAgICAgICAgICAgMgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2hhcmVkIEhXIGNvbmZpZ3VyYXRpb24JCQkJCQkgICAgKgorICogU2hhcmVkIEhXIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IHNoYXJlZF9od19jZmcgewkJCQkJIC8qIE5WUkFNIE9mZnNldCAqLworI2RlZmluZSBQSU5fQ0ZHX05BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFBJTl9DRkdfR1BJTzBfUDAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUElOX0NGR19HUElPMV9QMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBQSU5fQ0ZHX0dQSU8yX1AwICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIFBJTl9DRkdfR1BJTzNfUDAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUElOX0NGR19HUElPMF9QMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSBQSU5fQ0ZHX0dQSU8xX1AxICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIFBJTl9DRkdfR1BJTzJfUDEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgUElOX0NGR19HUElPM19QMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBQSU5fQ0ZHX0VQSU8wICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA5CisjZGVmaW5lIFBJTl9DRkdfRVBJTzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGEKKyNkZWZpbmUgUElOX0NGR19FUElPMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYgorI2RlZmluZSBQSU5fQ0ZHX0VQSU8zICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBjCisjZGVmaW5lIFBJTl9DRkdfRVBJTzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGQKKyNkZWZpbmUgUElOX0NGR19FUElPNSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZQorI2RlZmluZSBQSU5fQ0ZHX0VQSU82ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIFBJTl9DRkdfRVBJTzcgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgUElOX0NGR19FUElPOCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMQorI2RlZmluZSBQSU5fQ0ZHX0VQSU85ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEyCisjZGVmaW5lIFBJTl9DRkdfRVBJTzEwICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTMKKyNkZWZpbmUgUElOX0NGR19FUElPMTEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNAorI2RlZmluZSBQSU5fQ0ZHX0VQSU8xMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE1CisjZGVmaW5lIFBJTl9DRkdfRVBJTzEzICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTYKKyNkZWZpbmUgUElOX0NGR19FUElPMTQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNworI2RlZmluZSBQSU5fQ0ZHX0VQSU8xNSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE4CisjZGVmaW5lIFBJTl9DRkdfRVBJTzE2ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTkKKyNkZWZpbmUgUElOX0NGR19FUElPMTcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxYQorI2RlZmluZSBQSU5fQ0ZHX0VQSU8xOCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFiCisjZGVmaW5lIFBJTl9DRkdfRVBJTzE5ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWMKKyNkZWZpbmUgUElOX0NGR19FUElPMjAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxZAorI2RlZmluZSBQSU5fQ0ZHX0VQSU8yMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFlCisjZGVmaW5lIFBJTl9DRkdfRVBJTzIyICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWYKKyNkZWZpbmUgUElOX0NGR19FUElPMjMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBQSU5fQ0ZHX0VQSU8yNCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIxCisjZGVmaW5lIFBJTl9DRkdfRVBJTzI1ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjIKKyNkZWZpbmUgUElOX0NGR19FUElPMjYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMworI2RlZmluZSBQSU5fQ0ZHX0VQSU8yNyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDI0CisjZGVmaW5lIFBJTl9DRkdfRVBJTzI4ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjUKKyNkZWZpbmUgUElOX0NGR19FUElPMjkgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyNgorI2RlZmluZSBQSU5fQ0ZHX0VQSU8zMCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDI3CisjZGVmaW5lIFBJTl9DRkdfRVBJTzMxICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjgKKworLyogRVBJTyBkZWZpbml0aW9uICovCisjZGVmaW5lIEVQSU9fQ0ZHX05BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRVBJT19DRkdfRVBJTzAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFUElPX0NGR19FUElPMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVQSU9fQ0ZHX0VQSU8yICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgRVBJT19DRkdfRVBJTzMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFUElPX0NGR19FUElPNCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIEVQSU9fQ0ZHX0VQSU81ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgRVBJT19DRkdfRVBJTzYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBFUElPX0NGR19FUElPNyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEVQSU9fQ0ZHX0VQSU84ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDkKKyNkZWZpbmUgRVBJT19DRkdfRVBJTzkgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYQorI2RlZmluZSBFUElPX0NGR19FUElPMTAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBiCisjZGVmaW5lIEVQSU9fQ0ZHX0VQSU8xMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgRVBJT19DRkdfRVBJTzEyICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZAorI2RlZmluZSBFUElPX0NGR19FUElPMTMgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBlCisjZGVmaW5lIEVQSU9fQ0ZHX0VQSU8xNCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgRVBJT19DRkdfRVBJTzE1ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFUElPX0NGR19FUElPMTYgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDExCisjZGVmaW5lIEVQSU9fQ0ZHX0VQSU8xNyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTIKKyNkZWZpbmUgRVBJT19DRkdfRVBJTzE4ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMworI2RlZmluZSBFUElPX0NGR19FUElPMTkgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE0CisjZGVmaW5lIEVQSU9fQ0ZHX0VQSU8yMCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTUKKyNkZWZpbmUgRVBJT19DRkdfRVBJTzIxICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNgorI2RlZmluZSBFUElPX0NGR19FUElPMjIgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE3CisjZGVmaW5lIEVQSU9fQ0ZHX0VQSU8yMyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgRVBJT19DRkdfRVBJTzI0ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOQorI2RlZmluZSBFUElPX0NGR19FUElPMjUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFhCisjZGVmaW5lIEVQSU9fQ0ZHX0VQSU8yNiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWIKKyNkZWZpbmUgRVBJT19DRkdfRVBJTzI3ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxYworI2RlZmluZSBFUElPX0NGR19FUElPMjggICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFkCisjZGVmaW5lIEVQSU9fQ0ZHX0VQSU8yOSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWUKKyNkZWZpbmUgRVBJT19DRkdfRVBJTzMwICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxZgorI2RlZmluZSBFUElPX0NGR19FUElPMzEgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisKKworc3RydWN0IHNoYXJlZF9od19jZmcgewkJCSAvKiBOVlJBTSBPZmZzZXQgKi8KIAkvKiBVcCB0byAxNiBieXRlcyBvZiBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nICovCi0JdTggIHBhcnRfbnVtWzE2XTsJCQkJCS8qIDB4MTA0ICovCisJdTggIHBhcnRfbnVtWzE2XTsJCSAgICAvKiAweDEwNCAqLwogCi0JdTMyIGNvbmZpZzsJCQkJCQkvKiAweDExNCAqLwotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01ESU9fVk9MVEFHRV9NQVNLIAkgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01ESU9fVk9MVEFHRV9TSElGVAkgICAgMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01ESU9fVk9MVEFHRV8xXzJWIAkgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01ESU9fVk9MVEFHRV8yXzVWIAkgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01DUF9SU1RfT05fQ09SRV9SU1RfRU4JICAgIDB4MDAwMDAwMDIKKwl1MzIgY29uZmlnOwkJCS8qIDB4MTE0ICovCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01ESU9fVk9MVEFHRV9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwMDEKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01ESU9fVk9MVEFHRV9TSElGVCAgICAgICAgICAgICAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRElPX1ZPTFRBR0VfMV8yViAgICAgICAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTURJT19WT0xUQUdFXzJfNVYgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTUNQX1JTVF9PTl9DT1JFX1JTVF9FTiAgICAgICAgMHgwMDAwMDAwMgogCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfUE9SVF9TV0FQIAkJICAgIDB4MDAwMDAwMDQKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUE9SVF9TV0FQICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAogCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfQkVBQ09OX1dPTF9FTgkJICAgIDB4MDAwMDAwMDgKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfQkVBQ09OX1dPTF9FTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAogCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTUZXX1NFTEVDVF9NQVNLCQkgICAgMHgwMDAwMDcwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01GV19TRUxFQ1RfU0hJRlQJCSAgICA4CisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1BDSUVfR0VOM19ESVNBQkxFRCAgICAgICAgICAgIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUENJRV9HRU4zX0VOQUJMRUQgICAgICAgICAgICAgMHgwMDAwMDAxMAorCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01GV19TRUxFQ1RfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDA3MDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01GV19TRUxFQ1RfU0hJRlQgICAgICAgICAgICAgICA4CiAJLyogV2hhdGV2ZXIgTUZXIGZvdW5kIGluIE5WTQogCSAgIChpZiBtdWx0aXBsZSBmb3VuZCwgcHJpb3JpdHkgb3JkZXIgaXM6IE5DLVNJLCBVTVAsIElQTUkpICovCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTUZXX1NFTEVDVF9ERUZBVUxUCSAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTUZXX1NFTEVDVF9OQ19TSQkJICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRldfU0VMRUNUX1VNUAkJICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRldfU0VMRUNUX0lQTUkJCSAgICAweDAwMDAwMzAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRldfU0VMRUNUX0RFRkFVTFQgICAgICAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTUZXX1NFTEVDVF9OQ19TSSAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01GV19TRUxFQ1RfVU1QICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRldfU0VMRUNUX0lQTUkgICAgICAgICAgICAgICAgMHgwMDAwMDMwMAogCS8qIFVzZSBTUElPNCBhcyBhbiBhcmJpdGVyIGJldHdlZW46IDAtTkNfU0ksIDEtSVBNSQogCSAgKGNhbiBvbmx5IGJlIHVzZWQgd2hlbiBhbiBhZGQtaW4gYm9hcmQsIG5vdCBCTUMsIHB1bGxzLWRvd24gU1BJTzQpICovCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTUZXX1NFTEVDVF9TUElPNF9OQ19TSV9JUE1JICAgMHgwMDAwMDQwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTUZXX1NFTEVDVF9TUElPNF9OQ19TSV9JUE1JICAgIDB4MDAwMDA0MDAKIAkvKiBVc2UgU1BJTzQgYXMgYW4gYXJiaXRlciBiZXR3ZWVuOiAwLVVNUCwgMS1JUE1JCiAJICAoY2FuIG9ubHkgYmUgdXNlZCB3aGVuIGFuIGFkZC1pbiBib2FyZCwgbm90IEJNQywgcHVsbHMtZG93biBTUElPNCkgKi8KLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRldfU0VMRUNUX1NQSU80X1VNUF9JUE1JICAgICAweDAwMDAwNTAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRldfU0VMRUNUX1NQSU80X1VNUF9JUE1JICAgICAgMHgwMDAwMDUwMAogCS8qIFVzZSBTUElPNCBhcyBhbiBhcmJpdGVyIGJldHdlZW46IDAtTkMtU0ksIDEtVU1QCiAJICAoY2FuIG9ubHkgYmUgdXNlZCB3aGVuIGFuIGFkZC1pbiBib2FyZCwgbm90IEJNQywgcHVsbHMtZG93biBTUElPNCkgKi8KLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRldfU0VMRUNUX1NQSU80X05DX1NJX1VNUCAgICAweDAwMDAwNjAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRldfU0VMRUNUX1NQSU80X05DX1NJX1VNUCAgICAgMHgwMDAwMDYwMAogCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTEVEX01PREVfTUFTSwkJICAgIDB4MDAwZjAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MRURfTU9ERV9TSElGVAkJICAgIDE2Ci0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTEVEX01BQzEJCQkgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9QSFkxCQkJICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MRURfUEhZMgkJCSAgICAweDAwMDIwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTEVEX1BIWTMJCQkgICAgMHgwMDAzMDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9NQUMyCQkJICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MRURfUEhZNAkJCSAgICAweDAwMDUwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTEVEX1BIWTUJCQkgICAgMHgwMDA2MDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9QSFk2CQkJICAgIDB4MDAwNzAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MRURfTUFDMwkJCSAgICAweDAwMDgwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTEVEX1BIWTcJCQkgICAgMHgwMDA5MDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9QSFk5CQkJICAgIDB4MDAwYTAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MRURfUEhZMTEgCQkgICAgMHgwMDBiMDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9NQUM0CQkJICAgIDB4MDAwYzAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MRURfUEhZOAkJCSAgICAweDAwMGQwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTEVEX0VYVFBIWTEJCSAgICAweDAwMGUwMDAwCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9NT0RFX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwZjAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAxNgorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTEVEX01BQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9QSFkxICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MRURfUEhZMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTEVEX1BIWTMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9NQUMyICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MRURfUEhZNCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA1MDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTEVEX1BIWTUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNjAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9QSFk2ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDcwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MRURfTUFDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTEVEX1BIWTcgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOTAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9QSFk5ICAgICAgICAgICAgICAgICAgICAgICAweDAwMGEwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MRURfUEhZMTEgICAgICAgICAgICAgICAgICAgICAgMHgwMDBiMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTEVEX01BQzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwYzAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xFRF9QSFk4ICAgICAgICAgICAgICAgICAgICAgICAweDAwMGQwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MRURfRVhUUEhZMSAgICAgICAgICAgICAgICAgICAgMHgwMDBlMDAwMAogCiAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19BTl9FTkFCTEVfTUFTSwkJICAgIDB4M2YwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19BTl9FTkFCTEVfU0hJRlQJCSAgICAyNAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0FOX0VOQUJMRV9DTDM3CQkgICAgMHgwMTAwMDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0FOX0VOQUJMRV9DTDczCQkgICAgMHgwMjAwMDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0FOX0VOQUJMRV9CQU0JCSAgICAweDA0MDAwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfQU5fRU5BQkxFX1BBUkFMTEVMX0RFVEVDVElPTiAgMHgwODAwMDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0FOX0VOX1NHTUlJX0ZJQkVSX0FVVE9fREVURUNUIDB4MTAwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19BTl9FTkFCTEVfUkVNT1RFX1BIWQkgICAgMHgyMDAwMDAwMAorCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19BTl9FTkFCTEVfTUFTSyAgICAgICAgICAgICAgICAweDNmMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19BTl9FTkFCTEVfU0hJRlQgICAgICAgICAgICAgICAgMjQKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0FOX0VOQUJMRV9DTDM3ICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19BTl9FTkFCTEVfQ0w3MyAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfQU5fRU5BQkxFX0JBTSAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0FOX0VOQUJMRV9QQVJBTExFTF9ERVRFQ1RJT04gICAweDA4MDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19BTl9FTl9TR01JSV9GSUJFUl9BVVRPX0RFVEVDVCAgMHgxMDAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfQU5fRU5BQkxFX1JFTU9URV9QSFkgICAgICAgICAgIDB4MjAwMDAwMDAKIAotCXUzMiBjb25maWcyOwkJCQkJCS8qIDB4MTE4ICovCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1NSSU9WX01BU0sgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1NSSU9WX0RJU0FCTEVEICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19TUklPVl9FTkFCTEVEICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0FUQ19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0FUQ19ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19BVENfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCisJdTMyIGNvbmZpZzI7CQkJICAgIC8qIDB4MTE4ICovCiAJLyogb25lIHRpbWUgYXV0byBkZXRlY3QgZ3JhY2UgcGVyaW9kIChpbiBzZWMpICovCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfR1JBQ0VfUEVSSU9EX01BU0sgCSAgICAweDAwMDAwMGZmCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfR1JBQ0VfUEVSSU9EX1NISUZUCSAgICAwCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0dSQUNFX1BFUklPRF9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwZmYKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfR1JBQ0VfUEVSSU9EX1NISUZUICAgICAgICAgICAgICAgICAgICAgMAogCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfUENJRV9HRU4yX0VOQUJMRUQgCSAgICAweDAwMDAwMTAwCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1BDSUVfR0VOMl9FTkFCTEVEICAgICAgICAgICAgIDB4MDAwMDAxMDAKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUENJRV9HRU4yX0RJU0FCTEVEICAgICAgICAgICAgMHgwMDAwMDAwMAogCiAJLyogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb3JlIGNsb2NrIGlzIDI1ME1IeiBhbmQgaXQgaXMKIAkgICBhY2hpZXZlZCBieSBzZXR0aW5nIHRoZSBjbG9jayBjaGFuZ2UgdG8gNCAqLwotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0NMT0NLX0NIQU5HRV9NQVNLIAkgICAgMHgwMDAwMGUwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0NMT0NLX0NIQU5HRV9TSElGVAkgICAgOQorCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19DTE9DS19DSEFOR0VfTUFTSyAgICAgICAgICAgICAweDAwMDAwZTAwCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0NMT0NLX0NIQU5HRV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDkKIAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1NNQlVTX1RJTUlOR18xMDBLSFoJICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19TTUJVU19USU1JTkdfNDAwS0haCSAgICAweDAwMDAxMDAwCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1NNQlVTX1RJTUlOR19NQVNLICAgICAgICAgICAgIDB4MDAwMDEwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1NNQlVTX1RJTUlOR18xMDBLSFogICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19TTUJVU19USU1JTkdfNDAwS0haICAgICAgICAgICAgMHgwMDAwMTAwMAogCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfSElERV9QT1JUMQkJICAgIDB4MDAwMDIwMDAKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfSElERV9QT1JUMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1dPTF9DQVBBQkxFX01BU0sgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1dPTF9DQVBBQkxFX0RJU0FCTEVEICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19XT0xfQ0FQQUJMRV9FTkFCTEVEICAgICAgICAgICAgMHgwMDAwNDAwMAorCisJCS8qIE91dHB1dCBsb3cgd2hlbiBQRVJTVCBpcyBhc3NlcnRlZCAqLworCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19TUElPNF9GT0xMT1dfUEVSU1RfTUFTSyAgICAgICAweDAwMDA4MDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19TUElPNF9GT0xMT1dfUEVSU1RfRElTQUJMRUQgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfU1BJTzRfRk9MTE9XX1BFUlNUX0VOQUJMRUQgICAgIDB4MDAwMDgwMDAKKworCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QQ0lFX0dFTjJfUFJFRU1QSEFTSVNfTUFTSyAgICAweDAwMDcwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QQ0lFX0dFTjJfUFJFRU1QSEFTSVNfU0hJRlQgICAgMTYKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1BDSUVfR0VOMl9QUkVFTVBIQVNJU19IVyAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QQ0lFX0dFTjJfUFJFRU1QSEFTSVNfMERCICAgICAgMHgwMDAxMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUENJRV9HRU4yX1BSRUVNUEhBU0lTXzNfNURCICAgIDB4MDAwMjAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1BDSUVfR0VOMl9QUkVFTVBIQVNJU182XzBEQiAgICAweDAwMDMwMDAwCiAKIAkvKiAgVGhlIGZhbiBmYWlsdXJlIG1lY2hhbmlzbSBpcyB1c3VhbGx5IHJlbGF0ZWQgdG8gdGhlIFBIWSB0eXBlCi0JICBzaW5jZSB0aGUgcG93ZXIgY29uc3VtcHRpb24gb2YgdGhlIGJvYXJkIGlzIGRldGVybWluZWQgYnkgdGhlIFBIWS4KLQkgIEN1cnJlbnRseSwgZmFuIGlzIHJlcXVpcmVkIGZvciBtb3N0IGRlc2lnbnMgd2l0aCBTRlg3MTAxLCBCQ004NzI3Ci0JICBhbmQgQkNNODQ4MS4gSWYgYSBmYW4gaXMgbm90IHJlcXVpcmVkIGZvciBhIGJvYXJkIHdoaWNoIHVzZXMgb25lCi0JICBvZiB0aG9zZSBQSFlzLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBzZXQgdG8gIkRpc2FibGVkIi4gSWYgYSBmYW4gaXMKLQkgIHJlcXVpcmVkIGZvciBhIGRpZmZlcmVudCBQSFkgdHlwZSwgdGhpcyBvcHRpb24gc2hvdWxkIGJlIHNldCB0bwotCSAgIkVuYWJsZWQiLgotCSAgVGhlIGZhbiBmYWlsdXJlIGluZGljYXRpb24gaXMgZXhwZWN0ZWQgb24KLQkgIFNQSU81ICovCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfRkFOX0ZBSUxVUkVfTUFTSwkJCSAgICAgIDB4MDAxODAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19GQU5fRkFJTFVSRV9TSElGVCAJCSAgICAgIDE5Ci0jZGVmaW5lIFNIQVJFRF9IV19DRkdfRkFOX0ZBSUxVUkVfUEhZX1RZUEUJCSAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19GQU5fRkFJTFVSRV9ESVNBQkxFRAkJICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0ZBTl9GQUlMVVJFX0VOQUJMRUQJCSAgICAgIDB4MDAxMDAwMDAKKwkgICAgICBzaW5jZSB0aGUgcG93ZXIgY29uc3VtcHRpb24gb2YgdGhlIGJvYXJkIGlzIGRldGVybWluZWQgYnkgdGhlIFBIWS4KKwkgICAgICBDdXJyZW50bHksIGZhbiBpcyByZXF1aXJlZCBmb3IgbW9zdCBkZXNpZ25zIHdpdGggU0ZYNzEwMSwgQkNNODcyNworCSAgICAgIGFuZCBCQ004NDgxLiBJZiBhIGZhbiBpcyBub3QgcmVxdWlyZWQgZm9yIGEgYm9hcmQgd2hpY2ggdXNlcyBvbmUKKwkgICAgICBvZiB0aG9zZSBQSFlzLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBzZXQgdG8gIkRpc2FibGVkIi4gSWYgYSBmYW4gaXMKKwkgICAgICByZXF1aXJlZCBmb3IgYSBkaWZmZXJlbnQgUEhZIHR5cGUsIHRoaXMgb3B0aW9uIHNob3VsZCBiZSBzZXQgdG8KKwkgICAgICAiRW5hYmxlZCIuIFRoZSBmYW4gZmFpbHVyZSBpbmRpY2F0aW9uIGlzIGV4cGVjdGVkIG9uIFNQSU81ICovCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0ZBTl9GQUlMVVJFX01BU0sgICAgICAgICAgICAgIDB4MDAxODAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0ZBTl9GQUlMVVJFX1NISUZUICAgICAgICAgICAgICAxOQorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfRkFOX0ZBSUxVUkVfUEhZX1RZUEUgICAgICAgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0ZBTl9GQUlMVVJFX0RJU0FCTEVEICAgICAgICAgICAweDAwMDgwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19GQU5fRkFJTFVSRV9FTkFCTEVEICAgICAgICAgICAgMHgwMDEwMDAwMAogCi0JLyogU2V0IHRoZSBNREMvTURJTyBhY2Nlc3MgZm9yIHRoZSBmaXJzdCBleHRlcm5hbCBwaHkgKi8KLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRENfTURJT19BQ0NFU1MxX01BU0sJICAgIDB4MUMwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRENfTURJT19BQ0NFU1MxX1NISUZUCSAgICAyNgotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzFfUEhZX1RZUEUgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRENfTURJT19BQ0NFU1MxX0VNQUMwCSAgICAweDA0MDAwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTURDX01ESU9fQUNDRVNTMV9FTUFDMQkgICAgMHgwODAwMDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzFfQk9USAkgICAgMHgwYzAwMDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzFfU1dBUFBFRAkgICAgMHgxMDAwMDAwMAorCQkvKiBBU1BNIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCAqLworCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19BU1BNX1NVUFBPUlRfTUFTSyAgICAgICAgICAgICAweDAwNjAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19BU1BNX1NVUFBPUlRfU0hJRlQgICAgICAgICAgICAgMjEKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0FTUE1fU1VQUE9SVF9MMFNfTDFfRU5BQkxFRCAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19BU1BNX1NVUFBPUlRfTDBTX0RJU0FCTEVEICAgICAgMHgwMDIwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfQVNQTV9TVVBQT1JUX0wxX0RJU0FCTEVEICAgICAgIDB4MDA0MDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0FTUE1fU1VQUE9SVF9MMFNfTDFfRElTQUJMRUQgICAweDAwNjAwMDAwCiAKLQkvKiBTZXQgdGhlIE1EQy9NRElPIGFjY2VzcyBmb3IgdGhlIHNlY29uZCBleHRlcm5hbCBwaHkgKi8KLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRENfTURJT19BQ0NFU1MyX01BU0sJICAgIDB4RTAwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRENfTURJT19BQ0NFU1MyX1NISUZUCSAgICAyOQotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzJfUEhZX1RZUEUgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRENfTURJT19BQ0NFU1MyX0VNQUMwCSAgICAweDIwMDAwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfTURDX01ESU9fQUNDRVNTMl9FTUFDMQkgICAgMHg0MDAwMDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzJfQk9USAkgICAgMHg2MDAwMDAwMAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzJfU1dBUFBFRAkgICAgMHg4MDAwMDAwMAotCXUzMiBwb3dlcl9kaXNzaXBhdGVkOwkJCQkJLyogMHgxMWMgKi8KLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QT1dFUl9ESVNfQ01OX01BU0sJICAgIDB4ZmYwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QT1dFUl9ESVNfQ01OX1NISUZUCSAgICAyNAorCS8qIFRoZSB2YWx1ZSBvZiBQTV9UTF9JR05PUkVfUkVRUyAoYml0MCkgaW4gUENJIHJlZ2lzdGVyCisJICAgdGxfY29udHJvbF8wIChyZWdpc3RlciAweDI4MDApICovCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1BSRVZFTlRfTDFfRU5UUllfTUFTSyAgICAgICAgIDB4MDA4MDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1BSRVZFTlRfTDFfRU5UUllfRElTQUJMRUQgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QUkVWRU5UX0wxX0VOVFJZX0VOQUJMRUQgICAgICAgMHgwMDgwMDAwMAogCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfUE9XRVJfTUdOVF9TQ0FMRV9NQVNLCSAgICAweDAwZmYwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfUE9XRVJfTUdOVF9TQ0FMRV9TSElGVAkgICAgMTYKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QT1dFUl9NR05UX1VOS05PV05fU0NBTEUJICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QT1dFUl9NR05UX0RPVF8xX1dBVFQJICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QT1dFUl9NR05UX0RPVF8wMV9XQVRUCSAgICAweDAwMDIwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfUE9XRVJfTUdOVF9ET1RfMDAxX1dBVFQJICAgIDB4MDAwMzAwMDAKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUE9SVF9NT0RFX01BU0sgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUE9SVF9NT0RFXzIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1BPUlRfTU9ERV80ICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCiAKLQl1MzIgdW1wX25jX3NpX2NvbmZpZzsJCQkJCS8qIDB4MTIwICovCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfVU1QX05DX1NJX01JSV9NT0RFX01BU0sJICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19VTVBfTkNfU0lfTUlJX01PREVfU0hJRlQJICAgIDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19VTVBfTkNfU0lfTUlJX01PREVfTUFDCSAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfVU1QX05DX1NJX01JSV9NT0RFX1BIWQkgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1VNUF9OQ19TSV9NSUlfTU9ERV9NSUkJICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19VTVBfTkNfU0lfTUlJX01PREVfUk1JSQkgICAgMHgwMDAwMDAwMgorCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QQVRIX1NXQVBfTUFTSyAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QQVRIX1NXQVBfRElTQUJMRUQgICAgICAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUEFUSF9TV0FQX0VOQUJMRUQgICAgICAgICAgICAgIDB4MDIwMDAwMDAKIAotI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1VNUF9OQ19TSV9OVU1fREVWU19NQVNLCSAgICAweDAwMDAwZjAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfVU1QX05DX1NJX05VTV9ERVZTX1NISUZUCSAgICA4CisJLyogIFNldCB0aGUgTURDL01ESU8gYWNjZXNzIGZvciB0aGUgZmlyc3QgZXh0ZXJuYWwgcGh5ICovCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzFfTUFTSyAgICAgICAgIDB4MUMwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzFfU0hJRlQgICAgICAgICAyNgorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTURDX01ESU9fQUNDRVNTMV9QSFlfVFlQRSAgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzFfRU1BQzAgICAgICAgICAweDA0MDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRENfTURJT19BQ0NFU1MxX0VNQUMxICAgICAgICAgMHgwODAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTURDX01ESU9fQUNDRVNTMV9CT1RIICAgICAgICAgIDB4MGMwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzFfU1dBUFBFRCAgICAgICAweDEwMDAwMDAwCiAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19VTVBfTkNfU0lfRVhUX1BIWV9UWVBFX01BU0sgICAweDAwZmYwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfVU1QX05DX1NJX0VYVF9QSFlfVFlQRV9TSElGVCAgMTYKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19VTVBfTkNfU0lfRVhUX1BIWV9UWVBFX05PTkUgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfVU1QX05DX1NJX0VYVF9QSFlfVFlQRV9CQ001MjIxIDB4MDAwMTAwMDAKKwkvKiAgU2V0IHRoZSBNREMvTURJTyBhY2Nlc3MgZm9yIHRoZSBzZWNvbmQgZXh0ZXJuYWwgcGh5ICovCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzJfTUFTSyAgICAgICAgIDB4RTAwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzJfU0hJRlQgICAgICAgICAyOQorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTURDX01ESU9fQUNDRVNTMl9QSFlfVFlQRSAgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzJfRU1BQzAgICAgICAgICAweDIwMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19NRENfTURJT19BQ0NFU1MyX0VNQUMxICAgICAgICAgMHg0MDAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTURDX01ESU9fQUNDRVNTMl9CT1RIICAgICAgICAgIDB4NjAwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX01EQ19NRElPX0FDQ0VTUzJfU1dBUFBFRCAgICAgICAweDgwMDAwMDAwCiAKLQl1MzIgYm9hcmQ7CQkJCQkJLyogMHgxMjQgKi8KLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19CT0FSRF9SRVZfTUFTSwkJICAgIDB4MDBGRjAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19CT0FSRF9SRVZfU0hJRlQJCSAgICAxNgogCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfQk9BUkRfTUFKT1JfVkVSX01BU0sJICAgIDB4MEYwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19CT0FSRF9NQUpPUl9WRVJfU0hJRlQJICAgIDI0CisJdTMyIHBvd2VyX2Rpc3NpcGF0ZWQ7CQkJLyogMHgxMWMgKi8KKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUE9XRVJfTUdOVF9TQ0FMRV9NQVNLICAgICAgICAgMHgwMGZmMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUE9XRVJfTUdOVF9TQ0FMRV9TSElGVCAgICAgICAgIDE2CisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QT1dFUl9NR05UX1VOS05PV05fU0NBTEUgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUE9XRVJfTUdOVF9ET1RfMV9XQVRUICAgICAgICAgIDB4MDAwMTAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1BPV0VSX01HTlRfRE9UXzAxX1dBVFQgICAgICAgICAweDAwMDIwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19QT1dFUl9NR05UX0RPVF8wMDFfV0FUVCAgICAgICAgMHgwMDAzMDAwMAogCi0jZGVmaW5lIFNIQVJFRF9IV19DRkdfQk9BUkRfTUlOT1JfVkVSX01BU0sJICAgIDB4RjAwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0hXX0NGR19CT0FSRF9NSU5PUl9WRVJfU0hJRlQJICAgIDI4CisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1BPV0VSX0RJU19DTU5fTUFTSyAgICAgICAgICAgIDB4ZmYwMDAwMDAKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUE9XRVJfRElTX0NNTl9TSElGVCAgICAgICAgICAgICAgICAgICAgMjQKIAotCXUzMiByZXNlcnZlZDsJCQkJCQkvKiAweDEyOCAqLworCXUzMiB1bXBfbmNfc2lfY29uZmlnOwkJCS8qIDB4MTIwICovCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1VNUF9OQ19TSV9NSUlfTU9ERV9NQVNLICAgICAgIDB4MDAwMDAwMDMKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1VNUF9OQ19TSV9NSUlfTU9ERV9TSElGVCAgICAgICAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19VTVBfTkNfU0lfTUlJX01PREVfTUFDICAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfVU1QX05DX1NJX01JSV9NT0RFX1BIWSAgICAgICAgIDB4MDAwMDAwMDEKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1VNUF9OQ19TSV9NSUlfTU9ERV9NSUkgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19VTVBfTkNfU0lfTUlJX01PREVfUk1JSSAgICAgICAgMHgwMDAwMDAwMgogCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1VNUF9OQ19TSV9OVU1fREVWU19NQVNLICAgICAgIDB4MDAwMDBmMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1VNUF9OQ19TSV9OVU1fREVWU19TSElGVCAgICAgICA4CisKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfVU1QX05DX1NJX0VYVF9QSFlfVFlQRV9NQVNLICAgMHgwMGZmMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfVU1QX05DX1NJX0VYVF9QSFlfVFlQRV9TSElGVCAgIDE2CisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19VTVBfTkNfU0lfRVhUX1BIWV9UWVBFX05PTkUgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfVU1QX05DX1NJX0VYVF9QSFlfVFlQRV9CQ001MjIxIDB4MDAwMTAwMDAKKworCXUzMiBib2FyZDsJCQkvKiAweDEyNCAqLworCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19FM19JMkNfTVVYMF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDNGCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0UzX0kyQ19NVVgwX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfRTNfSTJDX01VWDFfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMEZDMAorCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19FM19JMkNfTVVYMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA2CisJLyogVXNlIHRoZSBQSU5fQ0ZHX1hYWCBkZWZpbmVzIG9uIHRvcCAqLworCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19CT0FSRF9SRVZfTUFTSyAgICAgICAgICAgICAgICAweDAwZmYwMDAwCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0JPQVJEX1JFVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDE2CisKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfQk9BUkRfTUFKT1JfVkVSX01BU0sgICAgICAgICAgMHgwZjAwMDAwMAorCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19CT0FSRF9NQUpPUl9WRVJfU0hJRlQgICAgICAgICAgICAgICAgICAyNAorCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0JPQVJEX01JTk9SX1ZFUl9NQVNLICAgICAgICAgIDB4ZjAwMDAwMDAKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfQk9BUkRfTUlOT1JfVkVSX1NISUZUICAgICAgICAgICAgICAgICAgMjgKKworCXUzMiB3Y19sYW5lX2NvbmZpZzsJCQkJICAgIC8qIDB4MTI4ICovCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTSyAgICAgICAgICAgIDB4MDAwMEZGRkYKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfU0hJRlQgICAgICAgICAgICAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MQU5FX1NXQVBfQ0ZHXzMyMTAzMjEwICAgICAgICAgMHgwMDAwMWIxYgorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTEFORV9TV0FQX0NGR18zMjEwMDEyMyAgICAgICAgIDB4MDAwMDFiZTQKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfMDEyMzMyMTAgICAgICAgICAweDAwMDBlNDFiCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MQU5FX1NXQVBfQ0ZHXzAxMjMwMTIzICAgICAgICAgMHgwMDAwZTRlNAorCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX1RYX01BU0sgICAgICAgICAweDAwMDAwMEZGCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfVFhfU0hJRlQgICAgICAgICAgICAgICAgIDAKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfTEFORV9TV0FQX0NGR19SWF9NQVNLICAgICAgICAgMHgwMDAwRkYwMAorCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX1JYX1NISUZUICAgICAgICAgICAgICAgICA4CisKKwkvKiBUWCBsYW5lIFBvbGFyaXR5IHN3YXAgKi8KKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfVFhfTEFORTBfUE9MX0ZMSVBfRU5BQkxFRCAgICAgMHgwMDAxMDAwMAorCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19UWF9MQU5FMV9QT0xfRkxJUF9FTkFCTEVEICAgICAweDAwMDIwMDAwCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1RYX0xBTkUyX1BPTF9GTElQX0VOQUJMRUQgICAgIDB4MDAwNDAwMDAKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfVFhfTEFORTNfUE9MX0ZMSVBfRU5BQkxFRCAgICAgMHgwMDA4MDAwMAorCS8qIFRYIGxhbmUgUG9sYXJpdHkgc3dhcCAqLworCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19SWF9MQU5FMF9QT0xfRkxJUF9FTkFCTEVEICAgICAweDAwMTAwMDAwCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX1JYX0xBTkUxX1BPTF9GTElQX0VOQUJMRUQgICAgIDB4MDAyMDAwMDAKKwkjZGVmaW5lIFNIQVJFRF9IV19DRkdfUlhfTEFORTJfUE9MX0ZMSVBfRU5BQkxFRCAgICAgMHgwMDQwMDAwMAorCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19SWF9MQU5FM19QT0xfRkxJUF9FTkFCTEVEICAgICAweDAwODAwMDAwCisKKwkvKiAgU2VsZWN0cyB0aGUgcG9ydCBsYXlvdXQgb2YgdGhlIGJvYXJkICovCisJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0UzX1BPUlRfTEFZT1VUX01BU0sgICAgICAgICAgIDB4MEYwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0UzX1BPUlRfTEFZT1VUX1NISUZUICAgICAgICAgICAyNAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfRTNfUE9SVF9MQVlPVVRfMlBfMDEgICAgICAgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0UzX1BPUlRfTEFZT1VUXzJQXzEwICAgICAgICAgICAweDAxMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19FM19QT1JUX0xBWU9VVF80UF8wMTIzICAgICAgICAgMHgwMjAwMDAwMAorCQkjZGVmaW5lIFNIQVJFRF9IV19DRkdfRTNfUE9SVF9MQVlPVVRfNFBfMTAzMiAgICAgICAgIDB4MDMwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfSFdfQ0ZHX0UzX1BPUlRfTEFZT1VUXzRQXzIzMDEgICAgICAgICAweDA0MDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0hXX0NGR19FM19QT1JUX0xBWU9VVF80UF8zMjEwICAgICAgICAgMHgwNTAwMDAwMAogfTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUG9ydCBIVyBjb25maWd1cmF0aW9uCQkJCQkJICAgICoKKyAqIFBvcnQgSFcgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBwb3J0X2h3X2NmZyB7CQkJICAgIC8qIHBvcnQgMDogMHgxMmMgIHBvcnQgMTogMHgyYmMgKi8KK3N0cnVjdCBwb3J0X2h3X2NmZyB7CQkgICAgLyogcG9ydCAwOiAweDEyYyAgcG9ydCAxOiAweDJiYyAqLwogCiAJdTMyIHBjaV9pZDsKLSNkZWZpbmUgUE9SVF9IV19DRkdfUENJX1ZFTkRPUl9JRF9NQVNLCQkgICAgMHhmZmZmMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19QQ0lfREVWSUNFX0lEX01BU0sJCSAgICAweDAwMDBmZmZmCisJI2RlZmluZSBQT1JUX0hXX0NGR19QQ0lfVkVORE9SX0lEX01BU0sgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1BDSV9ERVZJQ0VfSURfTUFTSyAgICAgICAgICAgICAgMHgwMDAwZmZmZgogCiAJdTMyIHBjaV9zdWJfaWQ7Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BDSV9TVUJTWVNfREVWSUNFX0lEX01BU0sJICAgIDB4ZmZmZjAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfUENJX1NVQlNZU19WRU5ET1JfSURfTUFTSwkgICAgMHgwMDAwZmZmZgorCSNkZWZpbmUgUE9SVF9IV19DRkdfUENJX1NVQlNZU19ERVZJQ0VfSURfTUFTSyAgICAgICAweGZmZmYwMDAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19QQ0lfU1VCU1lTX1ZFTkRPUl9JRF9NQVNLICAgICAgIDB4MDAwMGZmZmYKIAogCXUzMiBwb3dlcl9kaXNzaXBhdGVkOwotI2RlZmluZSBQT1JUX0hXX0NGR19QT1dFUl9ESVNfRDNfTUFTSwkJICAgIDB4ZmYwMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfRElTX0QzX1NISUZUCQkgICAgMjQKLSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfRElTX0QyX01BU0sJCSAgICAweDAwZmYwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BPV0VSX0RJU19EMl9TSElGVAkJICAgIDE2Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BPV0VSX0RJU19EMV9NQVNLCQkgICAgMHgwMDAwZmYwMAotI2RlZmluZSBQT1JUX0hXX0NGR19QT1dFUl9ESVNfRDFfU0hJRlQJCSAgICA4Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BPV0VSX0RJU19EMF9NQVNLCQkgICAgMHgwMDAwMDBmZgotI2RlZmluZSBQT1JUX0hXX0NGR19QT1dFUl9ESVNfRDBfU0hJRlQJCSAgICAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19QT1dFUl9ESVNfRDBfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAwZmYKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1BPV0VSX0RJU19EMF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfRElTX0QxX01BU0sgICAgICAgICAgICAgICAweDAwMDBmZjAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19QT1dFUl9ESVNfRDFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDgKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1BPV0VSX0RJU19EMl9NQVNLICAgICAgICAgICAgICAgMHgwMGZmMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfRElTX0QyX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNgorCSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfRElTX0QzX01BU0sgICAgICAgICAgICAgICAweGZmMDAwMDAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19QT1dFUl9ESVNfRDNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDI0CiAKIAl1MzIgcG93ZXJfY29uc3VtZWQ7Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BPV0VSX0NPTlNfRDNfTUFTSwkJICAgIDB4ZmYwMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfQ09OU19EM19TSElGVCAJICAgIDI0Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BPV0VSX0NPTlNfRDJfTUFTSwkJICAgIDB4MDBmZjAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfQ09OU19EMl9TSElGVCAJICAgIDE2Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BPV0VSX0NPTlNfRDFfTUFTSwkJICAgIDB4MDAwMGZmMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfQ09OU19EMV9TSElGVCAJICAgIDgKLSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfQ09OU19EMF9NQVNLCQkgICAgMHgwMDAwMDBmZgotI2RlZmluZSBQT1JUX0hXX0NGR19QT1dFUl9DT05TX0QwX1NISUZUIAkgICAgMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfQ09OU19EMF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMGZmCisJI2RlZmluZSBQT1JUX0hXX0NGR19QT1dFUl9DT05TX0QwX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1BPV0VSX0NPTlNfRDFfTUFTSyAgICAgICAgICAgICAgMHgwMDAwZmYwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfQ09OU19EMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4CisJI2RlZmluZSBQT1JUX0hXX0NGR19QT1dFUl9DT05TX0QyX01BU0sgICAgICAgICAgICAgIDB4MDBmZjAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1BPV0VSX0NPTlNfRDJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTYKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1BPV0VSX0NPTlNfRDNfTUFTSyAgICAgICAgICAgICAgMHhmZjAwMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfUE9XRVJfQ09OU19EM19TSElGVCAgICAgICAgICAgICAgICAgICAgICAyNAogCiAJdTMyIG1hY191cHBlcjsKLSNkZWZpbmUgUE9SVF9IV19DRkdfVVBQRVJNQUNfTUFTSwkJICAgIDB4MDAwMGZmZmYKLSNkZWZpbmUgUE9SVF9IV19DRkdfVVBQRVJNQUNfU0hJRlQJCSAgICAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19VUFBFUk1BQ19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1VQUEVSTUFDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogCXUzMiBtYWNfbG93ZXI7CiAKIAl1MzIgaXNjc2lfbWFjX3VwcGVyOyAgLyogVXBwZXIgMTYgYml0cyBhcmUgYWx3YXlzIHplcm9lcyAqLwpAQCAtMjM3LDY0MiArNDAyLDgwNyBAQAogCXUzMiByZG1hX21hY19sb3dlcjsKIAogCXUzMiBzZXJkZXNfY29uZmlnOwotI2RlZmluZSBQT1JUX0hXX0NGR19TRVJERVNfVFhfRFJWX1BSRV9FTVBIQVNJU19NQVNLCSAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgUE9SVF9IV19DRkdfU0VSREVTX1RYX0RSVl9QUkVfRU1QSEFTSVNfU0hJRlQJICAgICAgMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfU0VSREVTX1RYX0RSVl9QUkVfRU1QSEFTSVNfTUFTSyAweDAwMDBmZmZmCisJI2RlZmluZSBQT1JUX0hXX0NGR19TRVJERVNfVFhfRFJWX1BSRV9FTVBIQVNJU19TSElGVCAgICAgICAgIDAKIAotI2RlZmluZSBQT1JUX0hXX0NGR19TRVJERVNfUlhfRFJWX0VRVUFMSVpFUl9NQVNLCSAgICAgIDB4RkZGRjAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU0VSREVTX1JYX0RSVl9FUVVBTElaRVJfU0hJRlQJICAgICAgMTYKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NFUkRFU19SWF9EUlZfRVFVQUxJWkVSX01BU0sgICAgMHhmZmZmMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfU0VSREVTX1JYX0RSVl9FUVVBTElaRVJfU0hJRlQgICAgICAgICAgICAxNgogCiAKLQl1MzIgUmVzZXJ2ZWQwWzNdOwkJCQkgICAgLyogMHgxNTggKi8KLQkvKglDb250cm9scyB0aGUgVFggbGFzZXIgb2YgdGhlIFNGUCsgbW9kdWxlICovCi0JdTMyIHNmcF9jdHJsOwkJCQkJLyogMHgxNjQgKi8KLSNkZWZpbmUgUE9SVF9IV19DRkdfVFhfTEFTRVJfTUFTSwkJCSAgICAgIDB4MDAwMDAwRkYKLSNkZWZpbmUgUE9SVF9IV19DRkdfVFhfTEFTRVJfU0hJRlQJCQkgICAgICAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1RYX0xBU0VSX01ESU8JCQkgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1RYX0xBU0VSX0dQSU8wCQkJICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBQT1JUX0hXX0NGR19UWF9MQVNFUl9HUElPMQkJCSAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUE9SVF9IV19DRkdfVFhfTEFTRVJfR1BJTzIJCQkgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1RYX0xBU0VSX0dQSU8zCQkJICAgICAgMHgwMDAwMDAwNAorCS8qICBEZWZhdWx0IHZhbHVlczogMlAtNjQsIDRQLTMyICovCisJdTMyIHBmX2NvbmZpZzsJCQkJCSAgICAvKiAweDE1OCAqLworCSNkZWZpbmUgUE9SVF9IV19DRkdfUEZfTlVNX1ZGX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGCisJI2RlZmluZSBQT1JUX0hXX0NGR19QRl9OVU1fVkZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKIAotICAgIC8qCUNvbnRyb2xzIHRoZSBmYXVsdCBtb2R1bGUgTEVEIG9mIHRoZSBTRlArICovCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZBVUxUX01PRFVMRV9MRURfTUFTSwkJICAgICAgMHgwMDAwRkYwMAotI2RlZmluZSBQT1JUX0hXX0NGR19GQVVMVF9NT0RVTEVfTEVEX1NISUZUCQkgICAgICA4Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZBVUxUX01PRFVMRV9MRURfR1BJTzAJCSAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfRkFVTFRfTU9EVUxFX0xFRF9HUElPMQkJICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBQT1JUX0hXX0NGR19GQVVMVF9NT0RVTEVfTEVEX0dQSU8yCQkgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZBVUxUX01PRFVMRV9MRURfR1BJTzMJCSAgICAgIDB4MDAwMDAzMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfRkFVTFRfTU9EVUxFX0xFRF9ESVNBQkxFRAkJICAgICAgMHgwMDAwMDQwMAotCXUzMiBSZXNlcnZlZDAxWzEyXTsJCQkJICAgIC8qIDB4MTU4ICovCi0JLyogIGZvciBleHRlcm5hbCBQSFksIG9yIGZvcmNlZCBtb2RlIG9yIGR1cmluZyBBTiAqLwotCXUxNiB4Z3hzX2NvbmZpZ19yeFs0XTsJCQkJICAgIC8qIDB4MTk4ICovCisJLyogIERlZmF1bHQgdmFsdWVzOiAxNyAqLworCSNkZWZpbmUgUE9SVF9IV19DRkdfUEZfTlVNX01TSVhfVkVDVE9SU19NQVNLICAgICAgICAweDAwMDA3RjAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19QRl9OVU1fTVNJWF9WRUNUT1JTX1NISUZUICAgICAgICAgICAgICAgIDgKIAotCXUxNiB4Z3hzX2NvbmZpZ190eFs0XTsJCQkJICAgIC8qIDB4MUEwICovCisJI2RlZmluZSBQT1JUX0hXX0NGR19FTkFCTEVfRkxSX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZMUl9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAogCi0JdTMyIFJlc2VydmVkMVs1Nl07CQkJCSAgICAvKiAweDFBOCAqLwotCXUzMiBkZWZhdWx0X2NmZzsJCQkJICAgIC8qIDB4Mjg4ICovCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8wX0NPTkZJR19NQVNLCQkJICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBQT1JUX0hXX0NGR19HUElPMF9DT05GSUdfU0hJRlQJCQkgICAgICAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8wX0NPTkZJR19OQQkJCSAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzBfQ09ORklHX0xPVwkJCSAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzBfQ09ORklHX0hJR0gJCQkgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8wX0NPTkZJR19JTlBVVAkJCSAgICAgIDB4MDAwMDAwMDMKKwl1MzIgdmZfY29uZmlnOwkJCQkJICAgIC8qIDB4MTVDICovCisJI2RlZmluZSBQT1JUX0hXX0NGR19WRl9OVU1fTVNJWF9WRUNUT1JTX01BU0sgICAgICAgIDB4MDAwMDAwN0YKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1ZGX05VTV9NU0lYX1ZFQ1RPUlNfU0hJRlQgICAgICAgICAgICAgICAgMAogCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8xX0NPTkZJR19NQVNLCQkJICAgICAgMHgwMDAwMDAwQwotI2RlZmluZSBQT1JUX0hXX0NGR19HUElPMV9DT05GSUdfU0hJRlQJCQkgICAgICAyCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8xX0NPTkZJR19OQQkJCSAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzFfQ09ORklHX0xPVwkJCSAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzFfQ09ORklHX0hJR0gJCQkgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8xX0NPTkZJR19JTlBVVAkJCSAgICAgIDB4MDAwMDAwMGMKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1ZGX1BDSV9ERVZJQ0VfSURfTUFTSyAgICAgICAgICAgMHhGRkZGMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfVkZfUENJX0RFVklDRV9JRF9TSElGVCAgICAgICAgICAgICAgICAgICAxNgogCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8yX0NPTkZJR19NQVNLCQkJICAgICAgMHgwMDAwMDAzMAotI2RlZmluZSBQT1JUX0hXX0NGR19HUElPMl9DT05GSUdfU0hJRlQJCQkgICAgICA0Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8yX0NPTkZJR19OQQkJCSAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzJfQ09ORklHX0xPVwkJCSAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzJfQ09ORklHX0hJR0gJCQkgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8yX0NPTkZJR19JTlBVVAkJCSAgICAgIDB4MDAwMDAwMzAKKwl1MzIgbWZfcGNpX2lkOwkJCQkJICAgIC8qIDB4MTYwICovCisJI2RlZmluZSBQT1JUX0hXX0NGR19NRl9QQ0lfREVWSUNFX0lEX01BU0sgICAgICAgICAgIDB4MDAwMEZGRkYKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX01GX1BDSV9ERVZJQ0VfSURfU0hJRlQgICAgICAgICAgICAgICAgICAgMAogCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8zX0NPTkZJR19NQVNLCQkJICAgICAgMHgwMDAwMDBDMAotI2RlZmluZSBQT1JUX0hXX0NGR19HUElPM19DT05GSUdfU0hJRlQJCQkgICAgICA2Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8zX0NPTkZJR19OQQkJCSAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzNfQ09ORklHX0xPVwkJCSAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzNfQ09ORklHX0hJR0gJCQkgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8zX0NPTkZJR19JTlBVVAkJCSAgICAgIDB4MDAwMDAwYzAKKwkvKiAgQ29udHJvbHMgdGhlIFRYIGxhc2VyIG9mIHRoZSBTRlArIG1vZHVsZSAqLworCXUzMiBzZnBfY3RybDsJCQkJCSAgICAvKiAweDE2NCAqLworCSNkZWZpbmUgUE9SVF9IV19DRkdfVFhfTEFTRVJfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfVFhfTEFTRVJfU0hJRlQgICAgICAgICAgICAgICAgICAgMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1RYX0xBU0VSX01ESU8gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19UWF9MQVNFUl9HUElPMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfVFhfTEFTRVJfR1BJTzEgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1RYX0xBU0VSX0dQSU8yICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19UWF9MQVNFUl9HUElPMyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisKKwkvKiAgQ29udHJvbHMgdGhlIGZhdWx0IG1vZHVsZSBMRUQgb2YgdGhlIFNGUCsgKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZBVUxUX01PRFVMRV9MRURfTUFTSyAgICAgICAgICAgMHgwMDAwRkYwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZBVUxUX01PRFVMRV9MRURfU0hJRlQgICAgICAgICAgIDgKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19GQVVMVF9NT0RVTEVfTEVEX0dQSU8wICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfRkFVTFRfTU9EVUxFX0xFRF9HUElPMSAgICAgICAgICAgMHgwMDAwMDEwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZBVUxUX01PRFVMRV9MRURfR1BJTzIgICAgICAgICAgIDB4MDAwMDAyMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19GQVVMVF9NT0RVTEVfTEVEX0dQSU8zICAgICAgICAgICAweDAwMDAwMzAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfRkFVTFRfTU9EVUxFX0xFRF9ESVNBQkxFRCAgICAgICAgMHgwMDAwMDQwMAorCisJLyogIFRoZSBvdXRwdXQgcGluIFRYX0RJUyB0aGF0IGNvbnRyb2xzIHRoZSBUWCBsYXNlciBvZiB0aGUgU0ZQKworCSAgbW9kdWxlLiBVc2UgdGhlIFBJTl9DRkdfWFhYIGRlZmluZXMgb24gdG9wICovCisJdTMyIGUzX3NmcF9jdHJsOwkJCQkgICAgLyogMHgxNjggKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0UzX1RYX0xBU0VSX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgorCSNkZWZpbmUgUE9SVF9IV19DRkdfRTNfVFhfTEFTRVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKwkvKiAgVGhlIG91dHB1dCBwaW4gZm9yIFNGUFBfVFlQRSB3aGljaCB0dXJucyBvbiB0aGUgRmF1bHQgbW9kdWxlIExFRCAqLworCSNkZWZpbmUgUE9SVF9IV19DRkdfRTNfRkFVTFRfTURMX0xFRF9NQVNLICAgICAgICAgICAweDAwMDBGRjAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19FM19GQVVMVF9NRExfTEVEX1NISUZUICAgICAgICAgICAgICAgICAgIDgKKworCS8qICBUaGUgaW5wdXQgcGluIE1PRF9BQlMgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBTRlArIG1vZHVsZSBpcworCSAgcHJlc2VudCBvciBub3QuIFVzZSB0aGUgUElOX0NGR19YWFggZGVmaW5lcyBvbiB0b3AgKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0UzX01PRF9BQlNfTUFTSyAgICAgICAgICAgICAgICAgMHgwMEZGMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfRTNfTU9EX0FCU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNgorCisJLyogIFRoZSBvdXRwdXQgcGluIFBXUkRJU19TRlBfWCB3aGljaCBkaXNhYmxlIHRoZSBwb3dlciBvZiB0aGUgU0ZQKworCSAgbW9kdWxlLiBVc2UgdGhlIFBJTl9DRkdfWFhYIGRlZmluZXMgb24gdG9wICovCisJI2RlZmluZSBQT1JUX0hXX0NGR19FM19QV1JfRElTX01BU0sgICAgICAgICAgICAgICAgIDB4RkYwMDAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0UzX1BXUl9ESVNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMjQKIAogCS8qCi0JICogV2hlbiBLUiBsaW5rIGlzIHJlcXVpcmVkIHRvIGJlIHNldCB0byBmb3JjZSB3aGljaCBpcyBub3QKLQkgKiBLUi1jb21wbGlhbnQsIHRoaXMgcGFyYW1ldGVyIGRldGVybWluZSB3aGF0IGlzIHRoZSB0cmlnZ2VyIGZvciBpdC4KLQkgKiBXaGVuIEdQSU8gaXMgc2VsZWN0ZWQsIGxvdyBpbnB1dCB3aWxsIGZvcmNlIHRoZSBzcGVlZC4gQ3VycmVudGx5Ci0JICogZGVmYXVsdCBzcGVlZCBpcyAxRy4gSW4gdGhlIGZ1dHVyZSwgaXQgbWF5IGJlIHdpZGVuIHRvIHNlbGVjdCB0aGUKLQkgKiBmb3JjZWQgc3BlZWQgaW4gd2l0aCBhbm90aGVyIHBhcmFtZXRlci4gTm90ZSB3aGVuIGZvcmNlLTFHIGlzCi0JICogZW5hYmxlZCwgaXQgb3ZlcnJpZGUgb3B0aW9uIDU2OiBMaW5rIFNwZWVkIG9wdGlvbi4KKwkgKiBUaGUgaW5wdXQgcGluIHdoaWNoIHNpZ25hbHMgbW9kdWxlIHRyYW5zbWl0IGZhdWx0LiBVc2UgdGhlCisJICogUElOX0NGR19YWFggZGVmaW5lcyBvbiB0b3AKIAkgKi8KLSNkZWZpbmUgUE9SVF9IV19DRkdfRk9SQ0VfS1JfRU5BQkxFUl9NQVNLCQkgICAgICAweDAwMDAwRjAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZPUkNFX0tSX0VOQUJMRVJfU0hJRlQJCSAgICAgIDgKLSNkZWZpbmUgUE9SVF9IV19DRkdfRk9SQ0VfS1JfRU5BQkxFUl9OT1RfRk9SQ0VECQkgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZPUkNFX0tSX0VOQUJMRVJfR1BJTzBfUDAJCSAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfRk9SQ0VfS1JfRU5BQkxFUl9HUElPMV9QMAkJICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBQT1JUX0hXX0NGR19GT1JDRV9LUl9FTkFCTEVSX0dQSU8yX1AwCQkgICAgICAweDAwMDAwMzAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZPUkNFX0tSX0VOQUJMRVJfR1BJTzNfUDAJCSAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfRk9SQ0VfS1JfRU5BQkxFUl9HUElPMF9QMQkJICAgICAgMHgwMDAwMDUwMAotI2RlZmluZSBQT1JUX0hXX0NGR19GT1JDRV9LUl9FTkFCTEVSX0dQSU8xX1AxCQkgICAgICAweDAwMDAwNjAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZPUkNFX0tSX0VOQUJMRVJfR1BJTzJfUDEJCSAgICAgIDB4MDAwMDA3MDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfRk9SQ0VfS1JfRU5BQkxFUl9HUElPM19QMQkJICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBQT1JUX0hXX0NGR19GT1JDRV9LUl9FTkFCTEVSX0ZPUkNFRAkJICAgICAgMHgwMDAwMDkwMAotICAgIC8qCUVuYWJsZSB0byBkZXRlcm1pbmUgd2l0aCB3aGljaCBHUElPIHRvIHJlc2V0IHRoZSBleHRlcm5hbCBwaHkgKi8KLSNkZWZpbmUgUE9SVF9IV19DRkdfRVhUX1BIWV9HUElPX1JTVF9NQVNLCQkgICAgICAweDAwMEYwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0VYVF9QSFlfR1BJT19SU1RfU0hJRlQJCSAgICAgIDE2Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0VYVF9QSFlfR1BJT19SU1RfUEhZX1RZUEUJCSAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfRVhUX1BIWV9HUElPX1JTVF9HUElPMF9QMAkJICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19FWFRfUEhZX0dQSU9fUlNUX0dQSU8xX1AwCQkgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0VYVF9QSFlfR1BJT19SU1RfR1BJTzJfUDAJCSAgICAgIDB4MDAwMzAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfRVhUX1BIWV9HUElPX1JTVF9HUElPM19QMAkJICAgICAgMHgwMDA0MDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19FWFRfUEhZX0dQSU9fUlNUX0dQSU8wX1AxCQkgICAgICAweDAwMDUwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0VYVF9QSFlfR1BJT19SU1RfR1BJTzFfUDEJCSAgICAgIDB4MDAwNjAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfRVhUX1BIWV9HUElPX1JTVF9HUElPMl9QMQkJICAgICAgMHgwMDA3MDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19FWFRfUEhZX0dQSU9fUlNUX0dQSU8zX1AxCQkgICAgICAweDAwMDgwMDAwCisJdTMyIGUzX2Ntbl9waW5fY2ZnOwkJCQkgICAgLyogMHgxNkMgKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0UzX1RYX0ZBVUxUX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgorCSNkZWZpbmUgUE9SVF9IV19DRkdfRTNfVFhfRkFVTFRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKwkvKiAgVGhlIG91dHB1dCBwaW4gd2hpY2ggcmVzZXQgdGhlIFBIWS4gVXNlIHRoZSBQSU5fQ0ZHX1hYWCBkZWZpbmVzIG9uCisJIHRvcCAqLworCSNkZWZpbmUgUE9SVF9IV19DRkdfRTNfUEhZX1JFU0VUX01BU0sgICAgICAgICAgICAgICAweDAwMDBGRjAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19FM19QSFlfUkVTRVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDgKKworCS8qCisJICogVGhlIG91dHB1dCBwaW4gd2hpY2ggcG93ZXJzIGRvd24gdGhlIFBIWS4gVXNlIHRoZSBQSU5fQ0ZHX1hYWAorCSAqIGRlZmluZXMgb24gdG9wCisJICovCisJI2RlZmluZSBQT1JUX0hXX0NGR19FM19QV1JfRE9XTl9NQVNLICAgICAgICAgICAgICAgIDB4MDBGRjAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0UzX1BXUl9ET1dOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTYKKworCS8qICBUaGUgb3V0cHV0IHBpbiB2YWx1ZXMgQlNDX1NFTCB3aGljaCBzZWxlY3RzIHRoZSBJMkMgZm9yIHRoaXMgcG9ydAorCSAgaW4gdGhlIEkyQyBNdXggKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0UzX0kyQ19NVVgwX01BU0sgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfRTNfSTJDX01VWDFfTUFTSyAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisKKworCS8qCisJICogVGhlIGlucHV0IHBpbiBJX0ZBVUxUIHdoaWNoIGluZGljYXRlIG92ZXItY3VycmVudCBoYXMgb2NjdXJyZWQuCisJICogVXNlIHRoZSBQSU5fQ0ZHX1hYWCBkZWZpbmVzIG9uIHRvcAorCSAqLworCXUzMiBlM19jbW5fcGluX2NmZzE7CQkJCSAgICAvKiAweDE3MCAqLworCSNkZWZpbmUgUE9SVF9IV19DRkdfRTNfT1ZFUl9DVVJSRU5UX01BU0sgICAgICAgICAgICAweDAwMDAwMEZGCisJI2RlZmluZSBQT1JUX0hXX0NGR19FM19PVkVSX0NVUlJFTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAKKwl1MzIgcmVzZXJ2ZWQwWzddOwkJCQkgICAgLyogMHgxNzQgKi8KKworCXUzMiBhZXVfaW50X21hc2s7CQkJCSAgICAvKiAweDE5MCAqLworCisJdTMyIG1lZGlhX3R5cGU7CQkJCQkgICAgLyogMHgxOTQgKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX01FRElBX1RZUEVfUEhZMF9NQVNLICAgICAgICAgICAgMHgwMDAwMDBGRgorCSNkZWZpbmUgUE9SVF9IV19DRkdfTUVESUFfVFlQRV9QSFkwX1NISUZUICAgICAgICAgICAgICAgICAgICAwCisKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX01FRElBX1RZUEVfUEhZMV9NQVNLICAgICAgICAgICAgMHgwMDAwRkYwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfTUVESUFfVFlQRV9QSFkxX1NISUZUICAgICAgICAgICAgICAgICAgICA4CisKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX01FRElBX1RZUEVfUEhZMl9NQVNLICAgICAgICAgICAgMHgwMEZGMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfTUVESUFfVFlQRV9QSFkyX1NISUZUICAgICAgICAgICAgICAgICAgICAxNgorCisJLyogIDQgdGltZXMgMTYgYml0cyBmb3IgYWxsIDQgbGFuZXMuIEluIGNhc2UgZXh0ZXJuYWwgUEhZIGlzIHByZXNlbnQKKwkgICAgICAobm90IGRpcmVjdCBtb2RlKSwgdGhvc2UgdmFsdWVzIHdpbGwgbm90IHRha2UgZWZmZWN0IG9uIHRoZSA0IFhHWFMKKwkgICAgICBsYW5lcy4gRm9yIHNvbWUgZXh0ZXJuYWwgUEhZcyAoc3VjaCBhcyA4NzA2IGFuZCA4NzI2KSB0aGUgdmFsdWVzCisJICAgICAgd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZXh0ZXJuYWwgUEhZICBpbiB0aG9zZSBjYXNlcywgbm90CisJICAgICAgYWxsIDQgdmFsdWVzIGFyZSBuZWVkZWQuICovCisJdTE2IHhneHNfY29uZmlnX3J4WzRdOwkJCS8qIDB4MTk4ICovCisJdTE2IHhneHNfY29uZmlnX3R4WzRdOwkJCS8qIDB4MUEwICovCisKKwkvKiBGb3Igc3RvcmluZyBGQ09FIG1hYyBvbiBzaGFyZWQgbWVtb3J5ICovCisJdTMyIGZjb2VfZmlwX21hY191cHBlcjsKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZDT0VfVVBQRVJNQUNfTUFTSyAgICAgICAgICAgICAgMHgwMDAwZmZmZgorCSNkZWZpbmUgUE9SVF9IV19DRkdfRkNPRV9VUFBFUk1BQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAwCisJdTMyIGZjb2VfZmlwX21hY19sb3dlcjsKKworCXUzMiBmY29lX3d3bl9wb3J0X25hbWVfdXBwZXI7CisJdTMyIGZjb2Vfd3duX3BvcnRfbmFtZV9sb3dlcjsKKworCXUzMiBmY29lX3d3bl9ub2RlX25hbWVfdXBwZXI7CisJdTMyIGZjb2Vfd3duX25vZGVfbmFtZV9sb3dlcjsKKworCXUzMiBSZXNlcnZlZDFbNDldOwkJCQkgICAgLyogMHgxQzAgKi8KKworCS8qICBFbmFibGUgUko0NSBtYWdqYWNrIHBhaXIgc3dhcHBpbmcgb24gMTBHQmFzZS1UIFBIWSAoMD1kZWZhdWx0KSwKKwkgICAgICA4NDgzMyBvbmx5ICovCisJdTMyIHhnYnRfcGh5X2NmZzsJCQkJICAgIC8qIDB4Mjg0ICovCisJI2RlZmluZSBQT1JUX0hXX0NGR19SSjQ1X1BBSVJfU1dBUF9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwRkYKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1JKNDVfUEFJUl9TV0FQX1NISUZUICAgICAgICAgICAgICAgICAgICAgMAorCisJCXUzMiBkZWZhdWx0X2NmZzsJCQkgICAgLyogMHgyODggKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8wX0NPTkZJR19NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAwMworCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8wX0NPTkZJR19TSElGVCAgICAgICAgICAgICAgIDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19HUElPMF9DT05GSUdfTkEgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzBfQ09ORklHX0xPVyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8wX0NPTkZJR19ISUdIICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19HUElPMF9DT05GSUdfSU5QVVQgICAgICAgICAgICAgICAweDAwMDAwMDAzCisKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8xX0NPTkZJR19NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAwQworCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8xX0NPTkZJR19TSElGVCAgICAgICAgICAgICAgIDIKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19HUElPMV9DT05GSUdfTkEgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzFfQ09ORklHX0xPVyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8xX0NPTkZJR19ISUdIICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19HUElPMV9DT05GSUdfSU5QVVQgICAgICAgICAgICAgICAweDAwMDAwMDBjCisKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8yX0NPTkZJR19NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAzMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8yX0NPTkZJR19TSElGVCAgICAgICAgICAgICAgIDQKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19HUElPMl9DT05GSUdfTkEgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzJfQ09ORklHX0xPVyAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8yX0NPTkZJR19ISUdIICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19HUElPMl9DT05GSUdfSU5QVVQgICAgICAgICAgICAgICAweDAwMDAwMDMwCisKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8zX0NPTkZJR19NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDBDMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8zX0NPTkZJR19TSElGVCAgICAgICAgICAgICAgIDYKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19HUElPM19DT05GSUdfTkEgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfR1BJTzNfQ09ORklHX0xPVyAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0dQSU8zX0NPTkZJR19ISUdIICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19HUElPM19DT05GSUdfSU5QVVQgICAgICAgICAgICAgICAweDAwMDAwMGMwCisKKwkvKiAgV2hlbiBLUiBsaW5rIGlzIHJlcXVpcmVkIHRvIGJlIHNldCB0byBmb3JjZSB3aGljaCBpcyBub3QKKwkgICAgICBLUi1jb21wbGlhbnQsIHRoaXMgcGFyYW1ldGVyIGRldGVybWluZSB3aGF0IGlzIHRoZSB0cmlnZ2VyIGZvciBpdC4KKwkgICAgICBXaGVuIEdQSU8gaXMgc2VsZWN0ZWQsIGxvdyBpbnB1dCB3aWxsIGZvcmNlIHRoZSBzcGVlZC4gQ3VycmVudGx5CisJICAgICAgZGVmYXVsdCBzcGVlZCBpcyAxRy4gSW4gdGhlIGZ1dHVyZSwgaXQgbWF5IGJlIHdpZGVuIHRvIHNlbGVjdCB0aGUKKwkgICAgICBmb3JjZWQgc3BlZWQgaW4gd2l0aCBhbm90aGVyIHBhcmFtZXRlci4gTm90ZSB3aGVuIGZvcmNlLTFHIGlzCisJICAgICAgZW5hYmxlZCwgaXQgb3ZlcnJpZGUgb3B0aW9uIDU2OiBMaW5rIFNwZWVkIG9wdGlvbi4gKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZPUkNFX0tSX0VOQUJMRVJfTUFTSyAgICAgICAgICAgMHgwMDAwMEYwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZPUkNFX0tSX0VOQUJMRVJfU0hJRlQgICAgICAgICAgIDgKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19GT1JDRV9LUl9FTkFCTEVSX05PVF9GT1JDRUQgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfRk9SQ0VfS1JfRU5BQkxFUl9HUElPMF9QMCAgICAgICAgMHgwMDAwMDEwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZPUkNFX0tSX0VOQUJMRVJfR1BJTzFfUDAgICAgICAgIDB4MDAwMDAyMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19GT1JDRV9LUl9FTkFCTEVSX0dQSU8yX1AwICAgICAgICAweDAwMDAwMzAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfRk9SQ0VfS1JfRU5BQkxFUl9HUElPM19QMCAgICAgICAgMHgwMDAwMDQwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZPUkNFX0tSX0VOQUJMRVJfR1BJTzBfUDEgICAgICAgIDB4MDAwMDA1MDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19GT1JDRV9LUl9FTkFCTEVSX0dQSU8xX1AxICAgICAgICAweDAwMDAwNjAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfRk9SQ0VfS1JfRU5BQkxFUl9HUElPMl9QMSAgICAgICAgMHgwMDAwMDcwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0ZPUkNFX0tSX0VOQUJMRVJfR1BJTzNfUDEgICAgICAgIDB4MDAwMDA4MDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19GT1JDRV9LUl9FTkFCTEVSX0ZPUkNFRCAgICAgICAgICAweDAwMDAwOTAwCisJLyogIEVuYWJsZSB0byBkZXRlcm1pbmUgd2l0aCB3aGljaCBHUElPIHRvIHJlc2V0IHRoZSBleHRlcm5hbCBwaHkgKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0VYVF9QSFlfR1BJT19SU1RfTUFTSyAgICAgICAgICAgMHgwMDBGMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0VYVF9QSFlfR1BJT19SU1RfU0hJRlQgICAgICAgICAgIDE2CisJCSNkZWZpbmUgUE9SVF9IV19DRkdfRVhUX1BIWV9HUElPX1JTVF9QSFlfVFlQRSAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0VYVF9QSFlfR1BJT19SU1RfR1BJTzBfUDAgICAgICAgIDB4MDAwMTAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19FWFRfUEhZX0dQSU9fUlNUX0dQSU8xX1AwICAgICAgICAweDAwMDIwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfRVhUX1BIWV9HUElPX1JTVF9HUElPMl9QMCAgICAgICAgMHgwMDAzMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0VYVF9QSFlfR1BJT19SU1RfR1BJTzNfUDAgICAgICAgIDB4MDAwNDAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19FWFRfUEhZX0dQSU9fUlNUX0dQSU8wX1AxICAgICAgICAweDAwMDUwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfRVhUX1BIWV9HUElPX1JTVF9HUElPMV9QMSAgICAgICAgMHgwMDA2MDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0VYVF9QSFlfR1BJT19SU1RfR1BJTzJfUDEgICAgICAgIDB4MDAwNzAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19FWFRfUEhZX0dQSU9fUlNUX0dQSU8zX1AxICAgICAgICAweDAwMDgwMDAwCisKIAkvKiAgRW5hYmxlIEJBTSBvbiBLUiAqLwotI2RlZmluZSBQT1JUX0hXX0NGR19FTkFCTEVfQkFNX09OX0tSX01BU0sJCSAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfRU5BQkxFX0JBTV9PTl9LUl9TSElGVAkJICAgICAgMjAKLSNkZWZpbmUgUE9SVF9IV19DRkdfRU5BQkxFX0JBTV9PTl9LUl9ESVNBQkxFRAkJICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19FTkFCTEVfQkFNX09OX0tSX0VOQUJMRUQJCSAgICAgIDB4MDAxMDAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0VOQUJMRV9CQU1fT05fS1JfTUFTSyAgICAgICAgICAgMHgwMDEwMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfRU5BQkxFX0JBTV9PTl9LUl9TSElGVCAgICAgICAgICAgICAgICAgICAyMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfRU5BQkxFX0JBTV9PTl9LUl9ESVNBQkxFRCAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19FTkFCTEVfQkFNX09OX0tSX0VOQUJMRUQgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKIAogCS8qICBFbmFibGUgQ29tbW9uIE1vZGUgU2Vuc2UgKi8KLSNkZWZpbmUgUE9SVF9IV19DRkdfRU5BQkxFX0NNU19NQVNLCQkJICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19FTkFCTEVfQ01TX1NISUZUCQkJICAgICAgMjEKLSNkZWZpbmUgUE9SVF9IV19DRkdfRU5BQkxFX0NNU19ESVNBQkxFRAkJCSAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfRU5BQkxFX0NNU19FTkFCTEVECQkJICAgICAgMHgwMDIwMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfRU5BQkxFX0NNU19NQVNLICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19FTkFCTEVfQ01TX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDIxCisJI2RlZmluZSBQT1JUX0hXX0NGR19FTkFCTEVfQ01TX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0VOQUJMRV9DTVNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorCisJLyogIEVuYWJsZSBSSjQ1IG1hZ2phY2sgcGFpciBzd2FwcGluZyBvbiAxMEdCYXNlLVQgUEhZLCA4NDgzMyBvbmx5ICovCisJI2RlZmluZSBQT1JUX0hXX0NGR19SSjQ1X1BSX1NXUF9NQVNLICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1JKNDVfUFJfU1dQX1NISUZUCQkJICAgICAyMgorCSNkZWZpbmUgUE9SVF9IV19DRkdfUko0NV9QUl9TV1BfRElTQUJMRUQJCSAgICAgMHgwMDAwMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfUko0NV9QUl9TV1BfRU5BQkxFRAkJCSAgICAgMHgwMDQwMDAwMAorCisJLyogIERldGVybWluZSB0aGUgU2VyZGVzIGVsZWN0cmljYWwgaW50ZXJmYWNlICAgKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX05FVF9TRVJERVNfSUZfTUFTSyAgICAgICAgICAgICAgMHgwRjAwMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfTkVUX1NFUkRFU19JRl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAyNAorCSNkZWZpbmUgUE9SVF9IV19DRkdfTkVUX1NFUkRFU19JRl9TR01JSSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19ORVRfU0VSREVTX0lGX1hGSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX05FVF9TRVJERVNfSUZfU0ZJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfTkVUX1NFUkRFU19JRl9LUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMDAwMDAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19ORVRfU0VSREVTX0lGX0RYR1hTICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX05FVF9TRVJERVNfSUZfS1IyICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTAwMDAwMAorCiAKIAl1MzIgc3BlZWRfY2FwYWJpbGl0eV9tYXNrMjsJCQkgICAgLyogMHgyOEMgKi8KLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDNfTUFTSwkJICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EM19TSElGVAkJICAgICAgMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EM18xME1fRlVMTAkgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QzX18JCSAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDNfX18JCSAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDNfMTAwTV9GVUxMCSAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDNfMUcJCSAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDNfMl9ET1RfNUcJICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EM18xMEcJCSAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDNfMTJHCQkgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QzXzEyX0RPVF81RwkgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QzXzEzRwkJICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EM18xNUcJCSAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDNfMTZHCQkgICAgICAweDAwMDAwODAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EM19NQVNLICAgICAgIDB4MDAwMEZGRkYKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EM19TSElGVCAgICAgICAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDNfMTBNX0ZVTEwgICAgMHgwMDAwMDAwMQorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QzX18gICAgICAgICAgIDB4MDAwMDAwMDIKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EM19fXyAgICAgICAgICAweDAwMDAwMDA0CisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDNfMTAwTV9GVUxMICAgMHgwMDAwMDAwOAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QzXzFHICAgICAgICAgIDB4MDAwMDAwMTAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EM18yX0RPVF81RyAgICAweDAwMDAwMDIwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDNfMTBHICAgICAgICAgMHgwMDAwMDA0MAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QzXzIwRyAgICAgICAgIDB4MDAwMDAwODAKIAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EMF9NQVNLCQkgICAgICAweEZGRkYwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QwX1NISUZUCQkgICAgICAxNgotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EMF8xME1fRlVMTAkgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QwX18JCSAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDBfX18JCSAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDBfMTAwTV9GVUxMCSAgICAgIDB4MDAwODAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDBfMUcJCSAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDBfMl9ET1RfNUcJICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EMF8xMEcJCSAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDBfMTJHCQkgICAgICAweDAwODAwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QwXzEyX0RPVF81RwkgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QwXzEzRwkJICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EMF8xNUcJCSAgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDBfMTZHCQkgICAgICAweDA4MDAwMDAwCi0KLQkvKiBJbiB0aGUgY2FzZSB3aGVyZSB0d28gbWVkaWEgdHlwZXMgKGUuZy4gY29wcGVyIGFuZCBmaWJlcikgYXJlCi0JICBwcmVzZW50IGFuZCBlbGVjdHJpY2FsbHkgYWN0aXZlIGF0IHRoZSBzYW1lIHRpbWUsIFBIWSBTZWxlY3Rpb24KLQkgIHdpbGwgZGV0ZXJtaW5lIHdoaWNoIG9mIHRoZSB0d28gUEhZcyB3aWxsIGJlIGRlc2lnbmF0ZWQgYXMgdGhlCi0JICBBY3RpdmUgUEhZIGFuZCB1c2VkIGZvciBhIGNvbm5lY3Rpb24gdG8gdGhlIG5ldHdvcmsuCSovCi0JdTMyIG11bHRpX3BoeV9jb25maWc7CQkJCS8qIDB4MjkwICovCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fTUFTSwkJICAgICAweDAwMDAwMDA3Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fU0hJRlQJCSAgICAgMAotI2RlZmluZSBQT1JUX0hXX0NGR19QSFlfU0VMRUNUSU9OX0hBUkRXQVJFX0RFRkFVTFQgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fRklSU1RfUEhZCSAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBQT1JUX0hXX0NGR19QSFlfU0VMRUNUSU9OX1NFQ09ORF9QSFkJICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fRklSU1RfUEhZX1BSSU9SSVRZIDB4MDAwMDAwMDMKLSNkZWZpbmUgUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9TRUNPTkRfUEhZX1BSSU9SSVRZIDB4MDAwMDAwMDQKLQotCS8qIFdoZW4gZW5hYmxlZCwgYWxsIHNlY29uZCBwaHkgbnZyYW0gcGFyYW1ldGVycyB3aWxsIGJlIHN3YXBwZWQKLQkgIHdpdGggdGhlIGZpcnN0IHBoeSBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BIWV9TV0FQUEVEX01BU0sJCSAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBQT1JUX0hXX0NGR19QSFlfU1dBUFBFRF9TSElGVAkJICAgICAzCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1BIWV9TV0FQUEVEX0RJU0FCTEVECSAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19QSFlfU1dBUFBFRF9FTkFCTEVECQkgICAgIDB4MDAwMDAwMDgKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QwX01BU0sgICAgICAgMHhGRkZGMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QwX1NISUZUICAgICAgIDE2CisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDBfMTBNX0ZVTEwgICAgMHgwMDAxMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QwX18gICAgICAgICAgIDB4MDAwMjAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EMF9fXyAgICAgICAgICAweDAwMDQwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDBfMTAwTV9GVUxMICAgMHgwMDA4MDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QwXzFHICAgICAgICAgIDB4MDAxMDAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZMl9EMF8yX0RPVF81RyAgICAweDAwMjAwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWTJfRDBfMTBHICAgICAgICAgMHgwMDQwMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFkyX0QwXzIwRyAgICAgICAgIDB4MDA4MDAwMDAKIAogCi0JLyogQWRkcmVzcyBvZiB0aGUgc2Vjb25kIGV4dGVybmFsIHBoeSAqLwotCXUzMiBleHRlcm5hbF9waHlfY29uZmlnMjsJCQkJLyogMHgyOTQgKi8KLSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZMl9BRERSX01BU0sJICAgIDB4MDAwMDAwRkYKLSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZMl9BRERSX1NISUZUCSAgICAwCisJLyogIEluIHRoZSBjYXNlIHdoZXJlIHR3byBtZWRpYSB0eXBlcyAoZS5nLiBjb3BwZXIgYW5kIGZpYmVyKSBhcmUKKwkgICAgICBwcmVzZW50IGFuZCBlbGVjdHJpY2FsbHkgYWN0aXZlIGF0IHRoZSBzYW1lIHRpbWUsIFBIWSBTZWxlY3Rpb24KKwkgICAgICB3aWxsIGRldGVybWluZSB3aGljaCBvZiB0aGUgdHdvIFBIWXMgd2lsbCBiZSBkZXNpZ25hdGVkIGFzIHRoZQorCSAgICAgIEFjdGl2ZSBQSFkgYW5kIHVzZWQgZm9yIGEgY29ubmVjdGlvbiB0byB0aGUgbmV0d29yay4gICovCisJdTMyIG11bHRpX3BoeV9jb25maWc7CQkJCSAgICAvKiAweDI5MCAqLworCSNkZWZpbmUgUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDA3CisJCSNkZWZpbmUgUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9TSElGVCAgICAgICAgICAgICAgMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fSEFSRFdBUkVfREVGQVVMVCAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19QSFlfU0VMRUNUSU9OX0ZJUlNUX1BIWSAgICAgICAgICAweDAwMDAwMDAxCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9TRUNPTkRfUEhZICAgICAgICAgMHgwMDAwMDAwMgorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fRklSU1RfUEhZX1BSSU9SSVRZIDB4MDAwMDAwMDMKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19QSFlfU0VMRUNUSU9OX1NFQ09ORF9QSFlfUFJJT1JJVFkgMHgwMDAwMDAwNAogCi0JLyogVGhlIHNlY29uZCBYR1hTIGV4dGVybmFsIFBIWSB0eXBlICovCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9NQVNLCSAgICAweDAwMDBGRjAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9TSElGVAkgICAgOAotI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfRElSRUNUCSAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004MDcxCSAgICAweDAwMDAwMTAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004MDcyCSAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004MDczCSAgICAweDAwMDAwMzAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004NzA1CSAgICAweDAwMDAwNDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004NzA2CSAgICAweDAwMDAwNTAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004NzI2CSAgICAweDAwMDAwNjAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004NDgxCSAgICAweDAwMDAwNzAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9TRlg3MTAxCSAgICAweDAwMDAwODAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004NzI3CSAgICAweDAwMDAwOTAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004NzI3X05PQyAgMHgwMDAwMGEwMAotI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfQkNNODQ4MjMgICAgIDB4MDAwMDBiMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZMl9UWVBFX0JDTTU0NjQwICAgICAweDAwMDAwYzAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004NDgzMyAgICAgMHgwMDAwMGQwMAotI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfRkFJTFVSRQkgICAgMHgwMDAwZmQwMAotI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfTk9UX0NPTk4gICAgIDB4MDAwMGZmMDAKKwkvKiAgV2hlbiBlbmFibGVkLCBhbGwgc2Vjb25kIHBoeSBudnJhbSBwYXJhbWV0ZXJzIHdpbGwgYmUgc3dhcHBlZAorCSAgICAgIHdpdGggdGhlIGZpcnN0IHBoeSBwYXJhbWV0ZXJzICovCisJI2RlZmluZSBQT1JUX0hXX0NGR19QSFlfU1dBUFBFRF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19QSFlfU1dBUFBFRF9TSElGVCAgICAgICAgICAgICAgICAzCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfUEhZX1NXQVBQRURfRElTQUJMRUQgICAgICAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1BIWV9TV0FQUEVEX0VOQUJMRUQgICAgICAgICAgICAgIDB4MDAwMDAwMDgKIAotCS8qIDQgdGltZXMgMTYgYml0cyBmb3IgYWxsIDQgbGFuZXMuIEZvciBzb21lIGV4dGVybmFsIFBIWXMgKHN1Y2ggYXMKLQkgIDg3MDYsIDg3MjYgYW5kIDg3MjcpIG5vdCBhbGwgNCB2YWx1ZXMgYXJlIG5lZWRlZC4gKi8KLQl1MTYgeGd4c19jb25maWcyX3J4WzRdOwkJCQkvKiAweDI5NiAqLwotCXUxNiB4Z3hzX2NvbmZpZzJfdHhbNF07CQkJCS8qIDB4MkEwICovCisKKwkvKiAgQWRkcmVzcyBvZiB0aGUgc2Vjb25kIGV4dGVybmFsIHBoeSAqLworCXUzMiBleHRlcm5hbF9waHlfY29uZmlnMjsJCQkgICAgLyogMHgyOTQgKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfQUREUl9NQVNLICAgICAgICAgMHgwMDAwMDBGRgorCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZMl9BRERSX1NISUZUICAgICAgICAgICAgICAgICAwCisKKwkvKiAgVGhlIHNlY29uZCBYR1hTIGV4dGVybmFsIFBIWSB0eXBlICovCisJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfTUFTSyAgICAgICAgIDB4MDAwMEZGMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfU0hJRlQgICAgICAgICA4CisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZMl9UWVBFX0RJUkVDVCAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004MDcxICAgICAgIDB4MDAwMDAxMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfQkNNODA3MiAgICAgICAweDAwMDAwMjAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZMl9UWVBFX0JDTTgwNzMgICAgICAgMHgwMDAwMDMwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004NzA1ICAgICAgIDB4MDAwMDA0MDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfQkNNODcwNiAgICAgICAweDAwMDAwNTAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZMl9UWVBFX0JDTTg3MjYgICAgICAgMHgwMDAwMDYwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004NDgxICAgICAgIDB4MDAwMDA3MDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfU0ZYNzEwMSAgICAgICAweDAwMDAwODAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZMl9UWVBFX0JDTTg3MjcgICAgICAgMHgwMDAwMDkwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004NzI3X05PQyAgIDB4MDAwMDBhMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfQkNNODQ4MjMgICAgICAweDAwMDAwYjAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZMl9UWVBFX0JDTTU0NjQwICAgICAgMHgwMDAwMGMwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9CQ004NDgzMyAgICAgIDB4MDAwMDBkMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfQkNNNTQ2MThTRSAgICAweDAwMDAwZTAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZMl9UWVBFX0JDTTg3MjIgICAgICAgMHgwMDAwMGYwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWTJfVFlQRV9GQUlMVVJFICAgICAgIDB4MDAwMGZkMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFkyX1RZUEVfTk9UX0NPTk4gICAgICAweDAwMDBmZjAwCisKKworCS8qICA0IHRpbWVzIDE2IGJpdHMgZm9yIGFsbCA0IGxhbmVzLiBGb3Igc29tZSBleHRlcm5hbCBQSFlzIChzdWNoIGFzCisJICAgICAgODcwNiwgODcyNiBhbmQgODcyNykgbm90IGFsbCA0IHZhbHVlcyBhcmUgbmVlZGVkLiAqLworCXUxNiB4Z3hzX2NvbmZpZzJfcnhbNF07CQkJCSAgICAvKiAweDI5NiAqLworCXUxNiB4Z3hzX2NvbmZpZzJfdHhbNF07CQkJCSAgICAvKiAweDJBMCAqLwogCiAJdTMyIGxhbmVfY29uZmlnOwotI2RlZmluZSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX01BU0sJCSAgICAweDAwMDBmZmZmCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfU0hJRlQgCSAgICAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX01BU0sgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX1NISUZUICAgICAgICAgICAgICAwCisJCS8qIEFOIGFuZCBmb3JjZWQgKi8KKwkJI2RlZmluZSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHXzAxMjMwMTIzICAgICAgICAgICAweDAwMDAxYjFiCisJCS8qIGZvcmNlZCBvbmx5ICovCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR18wMTIzMzIxMCAgICAgICAgICAgMHgwMDAwMWJlNAorCQkvKiBmb3JjZWQgb25seSAqLworCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfMzEyMDMxMjAgICAgICAgICAgIDB4MDAwMGQ4ZDgKKwkJLyogZm9yY2VkIG9ubHkgKi8KKwkJI2RlZmluZSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHXzMyMTAzMjEwICAgICAgICAgICAweDAwMDBlNGU0CisJI2RlZmluZSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX1RYX01BU0sgICAgICAgICAgIDB4MDAwMDAwZmYKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfVFhfU0hJRlQgICAgICAgICAgICAgICAgICAgMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19SWF9NQVNLICAgICAgICAgICAweDAwMDBmZjAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX1JYX1NISUZUICAgICAgICAgICAgICAgICAgIDgKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX01BU0sgICAgICAgMHgwMDAwYzAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19NQVNURVJfU0hJRlQgICAgICAgICAgICAgICAxNAogCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfVFhfTUFTSwkgICAgMHgwMDAwMDBmZgotI2RlZmluZSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX1RYX1NISUZUCSAgICAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfUlhfTUFTSwkgICAgMHgwMDAwZmYwMAotI2RlZmluZSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX1JYX1NISUZUCSAgICA4Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX01BU0sJICAgIDB4MDAwMGMwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19NQVNURVJfU0hJRlQJICAgIDE0Ci0JLyogQU4gYW5kIGZvcmNlZCAqLwotI2RlZmluZSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHXzAxMjMwMTIzCSAgICAweDAwMDAxYjFiCi0JLyogZm9yY2VkIG9ubHkgKi8KLSNkZWZpbmUgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR18wMTIzMzIxMAkgICAgMHgwMDAwMWJlNAotCS8qIGZvcmNlZCBvbmx5ICovCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfMzEyMDMxMjAJICAgIDB4MDAwMGQ4ZDgKLQkvKiBmb3JjZWQgb25seSAqLwotI2RlZmluZSBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHXzMyMTAzMjEwCSAgICAweDAwMDBlNGU0Ci0gICAgLyoJSW5kaWNhdGUgd2hldGhlciB0byBzd2FwIHRoZSBleHRlcm5hbCBwaHkgcG9sYXJpdHkgKi8KLSNkZWZpbmUgUE9SVF9IV19DRkdfU1dBUF9QSFlfUE9MQVJJVFlfTUFTSwkgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TV0FQX1BIWV9QT0xBUklUWV9ESVNBQkxFRAkgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TV0FQX1BIWV9QT0xBUklUWV9FTkFCTEVECSAgICAweDAwMDEwMDAwCisJLyogIEluZGljYXRlIHdoZXRoZXIgdG8gc3dhcCB0aGUgZXh0ZXJuYWwgcGh5IHBvbGFyaXR5ICovCisJI2RlZmluZSBQT1JUX0hXX0NGR19TV0FQX1BIWV9QT0xBUklUWV9NQVNLICAgICAgICAgIDB4MDAwMTAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TV0FQX1BIWV9QT0xBUklUWV9ESVNBQkxFRCAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1dBUF9QSFlfUE9MQVJJVFlfRU5BQkxFRCAgICAgICAgMHgwMDAxMDAwMAorCiAKIAl1MzIgZXh0ZXJuYWxfcGh5X2NvbmZpZzsKLSNkZWZpbmUgUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9NQVNLCSAgICAweGZmMDAwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfU0hJRlQJICAgIDI0Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfRElSRUNUCSAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfQkNNNTQ4MiAgICAgMHgwMTAwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX05PVF9DT05OICAgIDB4ZmYwMDAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9BRERSX01BU0sgICAgICAgICAgMHgwMDAwMDBmZgorCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX0FERFJfU0hJRlQgICAgICAgICAgICAgICAgICAwCiAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfQUREUl9NQVNLCSAgICAweDAwZmYwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX0FERFJfU0hJRlQJICAgIDE2CisJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9NQVNLICAgICAgICAgIDB4MDAwMGZmMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TSElGVCAgICAgICAgICA4CisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUICAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzEgICAgICAgIDB4MDAwMDAxMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDcyICAgICAgICAweDAwMDAwMjAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MyAgICAgICAgMHgwMDAwMDMwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDUgICAgICAgIDB4MDAwMDA0MDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA2ICAgICAgICAweDAwMDAwNTAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNiAgICAgICAgMHgwMDAwMDYwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEgICAgICAgIDB4MDAwMDA3MDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxICAgICAgICAweDAwMDAwODAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNyAgICAgICAgMHgwMDAwMDkwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjdfTk9DICAgIDB4MDAwMDBhMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgyMyAgICAgICAweDAwMDAwYjAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNNTQ2NDAgICAgICAgMHgwMDAwMGMwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODMzICAgICAgIDB4MDAwMDBkMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ001NDYxOFNFICAgICAweDAwMDAwZTAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyMiAgICAgICAgMHgwMDAwMGYwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVF9XQyAgICAgIDB4MDAwMGZjMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9GQUlMVVJFICAgICAgICAweDAwMDBmZDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfTk9UX0NPTk4gICAgICAgMHgwMDAwZmYwMAogCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX01BU0sJICAgIDB4MDAwMGZmMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfU0hJRlQJICAgIDgKLSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUCSAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTgwNzEJICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MgkgICAgMHgwMDAwMDIwMAotI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczCSAgICAweDAwMDAwMzAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDUJICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNgkgICAgMHgwMDAwMDUwMAotI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2CSAgICAweDAwMDAwNjAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEJICAgIDB4MDAwMDA3MDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfU0ZYNzEwMQkgICAgMHgwMDAwMDgwMAotI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3CSAgICAweDAwMDAwOTAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjdfTk9DICAgMHgwMDAwMGEwMAotI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgyMwkgICAgMHgwMDAwMGIwMAotI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgzMwkgICAgMHgwMDAwMGQwMAotI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9GQUlMVVJFCSAgICAweDAwMDBmZDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX05PVF9DT05OCSAgICAweDAwMDBmZjAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9BRERSX01BU0sgICAgICAgIDB4MDBmZjAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX0FERFJfU0hJRlQgICAgICAgICAgICAgICAgMTYKIAotI2RlZmluZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfQUREUl9NQVNLCSAgICAweDAwMDAwMGZmCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9BRERSX1NISUZUCSAgICAwCisJI2RlZmluZSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX01BU0sgICAgICAgIDB4ZmYwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX1NISUZUICAgICAgICAyNAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfRElSRUNUICAgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX0JDTTU0ODIgICAgICAweDAxMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9ESVJFQ1RfU0QgICAgMHgwMjAwMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfTk9UX0NPTk4gICAgIDB4ZmYwMDAwMDAKIAogCXUzMiBzcGVlZF9jYXBhYmlsaXR5X21hc2s7Ci0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfTUFTSwkgICAgMHhmZmZmMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwX1NISUZUCSAgICAxNgotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwTV9GVUxMICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xME1fSEFMRiAgICAweDAwMDIwMDAwCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTAwTV9IQUxGICAgMHgwMDA0MDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwME1fRlVMTCAgIDB4MDAwODAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xRwkgICAgMHgwMDEwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzJfNUcJICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMEcJICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMkcJICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMl81RwkgICAgMHgwMTAwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEzRwkgICAgMHgwMjAwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzE1RwkgICAgMHgwNDAwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzE2RwkgICAgMHgwODAwMDAwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwX1JFU0VSVkVEICAgIDB4ZjAwMDAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDNfTUFTSyAgICAgICAgMHgwMDAwZmZmZgorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDNfU0hJRlQgICAgICAgIDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QzXzEwTV9GVUxMICAgICAweDAwMDAwMDAxCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EM18xME1fSEFMRiAgICAgMHgwMDAwMDAwMgorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDNfMTAwTV9IQUxGICAgIDB4MDAwMDAwMDQKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QzXzEwME1fRlVMTCAgICAweDAwMDAwMDA4CisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EM18xRyAgICAgICAgICAgMHgwMDAwMDAxMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDNfMl81RyAgICAgICAgIDB4MDAwMDAwMjAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QzXzEwRyAgICAgICAgICAweDAwMDAwMDQwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EM18yMEcgICAgICAgICAgMHgwMDAwMDA4MAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDNfUkVTRVJWRUQgICAgIDB4MDAwMGYwMDAKIAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QzX01BU0sJICAgIDB4MDAwMGZmZmYKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EM19TSElGVAkgICAgMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QzXzEwTV9GVUxMICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EM18xME1fSEFMRiAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDNfMTAwTV9IQUxGICAgMHgwMDAwMDAwNAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QzXzEwME1fRlVMTCAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EM18xRwkgICAgMHgwMDAwMDAxMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QzXzJfNUcJICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EM18xMEcJICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EM18xMkcJICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EM18xMl81RwkgICAgMHgwMDAwMDEwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QzXzEzRwkgICAgMHgwMDAwMDIwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QzXzE1RwkgICAgMHgwMDAwMDQwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QzXzE2RwkgICAgMHgwMDAwMDgwMAotI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QzX1JFU0VSVkVEICAgIDB4MDAwMGYwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfTUFTSyAgICAgICAgMHhmZmZmMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfU0hJRlQgICAgICAgIDE2CisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xME1fRlVMTCAgICAgMHgwMDAxMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTBNX0hBTEYgICAgIDB4MDAwMjAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwME1fSEFMRiAgICAweDAwMDQwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMDBNX0ZVTEwgICAgMHgwMDA4MDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMUcgICAgICAgICAgIDB4MDAxMDAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzJfNUcgICAgICAgICAweDAwMjAwMDAwCisJCSNkZWZpbmUgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMEcgICAgICAgICAgMHgwMDQwMDAwMAorCQkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMjBHICAgICAgICAgIDB4MDA4MDAwMDAKKwkJI2RlZmluZSBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwX1JFU0VSVkVEICAgICAweGYwMDAwMDAwCiAKLQl1MzIgcmVzZXJ2ZWRbMl07CisJLyogIEEgcGxhY2UgdG8gaG9sZCB0aGUgb3JpZ2luYWwgTUFDIGFkZHJlc3MgYXMgYSBiYWNrdXAgKi8KKwl1MzIgYmFja3VwX21hY191cHBlcjsJCQkvKiAweDJCNCAqLworCXUzMiBiYWNrdXBfbWFjX2xvd2VyOwkJCS8qIDB4MkI4ICovCiAKIH07CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNoYXJlZCBGZWF0dXJlIGNvbmZpZ3VyYXRpb24gCQkJCQkgICAgKgorICogU2hhcmVkIEZlYXR1cmUgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IHNoYXJlZF9mZWF0X2NmZyB7CQkJCSAvKiBOVlJBTSBPZmZzZXQgKi8KK3N0cnVjdCBzaGFyZWRfZmVhdF9jZmcgewkJIC8qIE5WUkFNIE9mZnNldCAqLwogCi0JdTMyIGNvbmZpZzsJCQkJCQkvKiAweDQ1MCAqLwotI2RlZmluZSBTSEFSRURfRkVBVFVSRV9CTUNfRUNIT19NT0RFX0VOIAkgICAgMHgwMDAwMDAwMQorCXUzMiBjb25maWc7CQkJLyogMHg0NTAgKi8KKwkjZGVmaW5lIFNIQVJFRF9GRUFUVVJFX0JNQ19FQ0hPX01PREVfRU4gICAgICAgICAgICAgMHgwMDAwMDAwMQogCi0JLyogIFVzZSB0aGUgdmFsdWVzIGZyb20gb3B0aW9ucyA0NyBhbmQgNDggaW5zdGVhZCBvZiB0aGUgSFcgZGVmYXVsdAotCSAgdmFsdWVzICovCi0jZGVmaW5lIFNIQVJFRF9GRUFUX0NGR19PVkVSUklERV9QUkVFTVBIQVNJU19DRkdfRElTQUJMRUQgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0hBUkVEX0ZFQVRfQ0ZHX09WRVJSSURFX1BSRUVNUEhBU0lTX0NGR19FTkFCTEVEICAgICAgMHgwMDAwMDAwMgorCS8qIFVzZSBOVlJBTSB2YWx1ZXMgaW5zdGVhZCBvZiBIVyBkZWZhdWx0IHZhbHVlcyAqLworCSNkZWZpbmUgU0hBUkVEX0ZFQVRfQ0ZHX09WRVJSSURFX1BSRUVNUEhBU0lTX0NGR19NQVNLIFwKKwkJCQkJCQkgICAgMHgwMDAwMDAwMgorCQkjZGVmaW5lIFNIQVJFRF9GRUFUX0NGR19PVkVSUklERV9QUkVFTVBIQVNJU19DRkdfRElTQUJMRUQgXAorCQkJCQkJCQkgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBTSEFSRURfRkVBVF9DRkdfT1ZFUlJJREVfUFJFRU1QSEFTSVNfQ0ZHX0VOQUJMRUQgXAorCQkJCQkJCQkgICAgIDB4MDAwMDAwMDIKIAotI2RlZmluZSBTSEFSRURfRkVBVF9DRkdfRk9SQ0VfU0ZfTU9ERV9NQVNLCQkgICAgICAweDAwMDAwNzAwCi0jZGVmaW5lIFNIQVJFRF9GRUFUX0NGR19GT1JDRV9TRl9NT0RFX1NISUZUCQkgICAgICA4Ci0jZGVmaW5lIFNIQVJFRF9GRUFUX0NGR19GT1JDRV9TRl9NT0RFX01GX0FMTE9XRUQJICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTSEFSRURfRkVBVF9DRkdfRk9SQ0VfU0ZfTU9ERV9GT1JDRURfU0YJCSAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgU0hBUkVEX0ZFQVRfQ0ZHX0ZPUkNFX1NGX01PREVfU1BJTzQJCSAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgU0hBUkVEX0ZFQVRfQ0ZHX0ZPUkNFX1NGX01PREVfU1dJVENIX0lOREVQVAkgICAgICAweDAwMDAwMzAwCisJI2RlZmluZSBTSEFSRURfRkVBVF9DRkdfTkNTSV9JRF9NRVRIT0RfTUFTSyAgICAgICAgIDB4MDAwMDAwMDgKKwkJI2RlZmluZSBTSEFSRURfRkVBVF9DRkdfTkNTSV9JRF9NRVRIT0RfU1BJTyAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0ZFQVRfQ0ZHX05DU0lfSURfTUVUSE9EX05WUkFNICAgICAgICAgMHgwMDAwMDAwOAorCisJI2RlZmluZSBTSEFSRURfRkVBVF9DRkdfTkNTSV9JRF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMzAKKwkjZGVmaW5lIFNIQVJFRF9GRUFUX0NGR19OQ1NJX0lEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNAorCisJLyogIE92ZXJyaWRlIHRoZSBPVFAgYmFjayB0byBzaW5nbGUgZnVuY3Rpb24gbW9kZS4gV2hlbiB1c2luZyBHUElPLAorCSAgICAgIGhpZ2ggbWVhbnMgb25seSBTRiwgMCBpcyBhY2NvcmRpbmcgdG8gQ0xQIGNvbmZpZ3VyYXRpb24gKi8KKwkjZGVmaW5lIFNIQVJFRF9GRUFUX0NGR19GT1JDRV9TRl9NT0RFX01BU0sgICAgICAgICAgMHgwMDAwMDcwMAorCQkjZGVmaW5lIFNIQVJFRF9GRUFUX0NGR19GT1JDRV9TRl9NT0RFX1NISUZUICAgICAgICAgIDgKKwkJI2RlZmluZSBTSEFSRURfRkVBVF9DRkdfRk9SQ0VfU0ZfTU9ERV9NRl9BTExPV0VEICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgU0hBUkVEX0ZFQVRfQ0ZHX0ZPUkNFX1NGX01PREVfRk9SQ0VEX1NGICAgICAgMHgwMDAwMDEwMAorCQkjZGVmaW5lIFNIQVJFRF9GRUFUX0NGR19GT1JDRV9TRl9NT0RFX1NQSU80ICAgICAgICAgIDB4MDAwMDAyMDAKKwkJI2RlZmluZSBTSEFSRURfRkVBVF9DRkdfRk9SQ0VfU0ZfTU9ERV9TV0lUQ0hfSU5ERVBUICAweDAwMDAwMzAwCisKKwkvKiBUaGUgaW50ZXJ2YWwgaW4gc2Vjb25kcyBiZXR3ZWVuIHNlbmRpbmcgTExEUCBwYWNrZXRzLiBTZXQgdG8gemVybworCSAgIHRvIGRpc2FibGUgdGhlIGZlYXR1cmUgKi8KKwkjZGVmaW5lIFNIQVJFRF9GRUFUX0NGR19MTERQX1hNSVRfSU5URVJWQUxfTUFTSyAgICAgMHgwMGZmMDAwMAorCSNkZWZpbmUgU0hBUkVEX0ZFQVRfQ0ZHX0xMRFBfWE1JVF9JTlRFUlZBTF9TSElGVCAgICAgICAgICAgICAxNgorCisJLyogVGhlIGFzc2lnbmVkIGRldmljZSB0eXBlIElEIGZvciBMTERQIHVzYWdlICovCisJI2RlZmluZSBTSEFSRURfRkVBVF9DRkdfTExEUF9ERVZJQ0VfVFlQRV9JRF9NQVNLICAgIDB4ZmYwMDAwMDAKKwkjZGVmaW5lIFNIQVJFRF9GRUFUX0NGR19MTERQX0RFVklDRV9UWVBFX0lEX1NISUZUICAgICAgICAgICAgMjQKIAogfTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUG9ydCBGZWF0dXJlIGNvbmZpZ3VyYXRpb24JCQkJCQkgICAgKgorICogUG9ydCBGZWF0dXJlIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IHBvcnRfZmVhdF9jZmcgewkJCSAgICAvKiBwb3J0IDA6IDB4NDU0ICBwb3J0IDE6IDB4NGM4ICovCitzdHJ1Y3QgcG9ydF9mZWF0X2NmZyB7CQkgICAgLyogcG9ydCAwOiAweDQ1NCAgcG9ydCAxOiAweDRjOCAqLwogCiAJdTMyIGNvbmZpZzsKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV9NQVNLCQkgICAgMHgwMDAwMDAwZgotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMV9TSVpFX1NISUZUCQkgICAgMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMV9TSVpFX0RJU0FCTEVEIAkgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzY0SwkJICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8xMjhLCQkgICAgMHgwMDAwMDAwMgotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzI1NksJCSAgICAweDAwMDAwMDAzCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIxX1NJWkVfNTEySwkJICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8xTQkJICAgIDB4MDAwMDAwMDUKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8yTQkJICAgIDB4MDAwMDAwMDYKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV80TQkJICAgIDB4MDAwMDAwMDcKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV84TQkJICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8xNk0JCSAgICAweDAwMDAwMDA5Ci0jZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIxX1NJWkVfMzJNCQkgICAgMHgwMDAwMDAwYQotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzY0TQkJICAgIDB4MDAwMDAwMGIKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8xMjhNCQkgICAgMHgwMDAwMDAwYwotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzI1Nk0JCSAgICAweDAwMDAwMDBkCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIxX1NJWkVfNTEyTQkJICAgIDB4MDAwMDAwMGUKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8xRwkJICAgIDB4MDAwMDAwMGYKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV9NQVNLCQkgICAgMHgwMDAwMDBmMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFX1NISUZUCQkgICAgNAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFX0RJU0FCTEVEIAkgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFXzY0SwkJICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV8xMjhLCQkgICAgMHgwMDAwMDAyMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFXzI1NksJCSAgICAweDAwMDAwMDMwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIyX1NJWkVfNTEySwkJICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV8xTQkJICAgIDB4MDAwMDAwNTAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV8yTQkJICAgIDB4MDAwMDAwNjAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV80TQkJICAgIDB4MDAwMDAwNzAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV84TQkJICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV8xNk0JCSAgICAweDAwMDAwMDkwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIyX1NJWkVfMzJNCQkgICAgMHgwMDAwMDBhMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFXzY0TQkJICAgIDB4MDAwMDAwYjAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV8xMjhNCQkgICAgMHgwMDAwMDBjMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFXzI1Nk0JCSAgICAweDAwMDAwMGQwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIyX1NJWkVfNTEyTQkJICAgIDB4MDAwMDAwZTAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV8xRwkJICAgIDB4MDAwMDAwZjAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0VOX1NJWkVfTUFTSwkJICAgIDB4MDcwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0VOX1NJWkVfU0hJRlQJCSAgICAyNAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfV09MX0VOQUJMRUQJCSAgICAweDAxMDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfRU5BQkxFRAkJICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01GV19FTkFCTEVECQkgICAgMHgwNDAwMDAwMAorCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMDBmCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV9TSElGVCAgICAgICAgICAgICAgICAgMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIxX1NJWkVfRElTQUJMRUQgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzY0SyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8xMjhLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIxX1NJWkVfMjU2SyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzUxMksgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV8xTSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIxX1NJWkVfMk0gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzRNICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV84TSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIxX1NJWkVfMTZNICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDkKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzMyTSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBhCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV82NE0gICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYgorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIxX1NJWkVfMTI4TSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMV9TSVpFXzI1Nk0gICAgICAgICAgICAgICAgICAweDAwMDAwMDBkCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjFfU0laRV81MTJNICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZQorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIxX1NJWkVfMUcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIyX1NJWkVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDBmMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIyX1NJWkVfU0hJRlQgICAgICAgICAgICAgICAgIDQKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFX0RJU0FCTEVEICAgICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV82NEsgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIyX1NJWkVfMTI4SyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFXzI1NksgICAgICAgICAgICAgICAgICAweDAwMDAwMDMwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV81MTJLICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIyX1NJWkVfMU0gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFXzJNICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDYwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV80TSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3MAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIyX1NJWkVfOE0gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFXzE2TSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDkwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV8zMk0gICAgICAgICAgICAgICAgICAgMHgwMDAwMDBhMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIyX1NJWkVfNjRNICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwYjAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFXzEyOE0gICAgICAgICAgICAgICAgICAweDAwMDAwMGMwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JBUjJfU0laRV8yNTZNICAgICAgICAgICAgICAgICAgMHgwMDAwMDBkMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CQVIyX1NJWkVfNTEyTSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZTAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQkFSMl9TSVpFXzFHICAgICAgICAgICAgICAgICAgICAweDAwMDAwMGYwCiAKLQkvKiBSZXNlcnZlZCBiaXRzOiAyOC0yOSAqLwotCS8qICBDaGVjayB0aGUgb3B0aWMgdmVuZG9yIHZpYSBpMmMgYWdhaW5zdCBhIGxpc3Qgb2YgYXBwcm92ZWQgbW9kdWxlcwotCSAgaW4gYSBzZXBhcmF0ZSBudnJhbSBpbWFnZSAqLwotI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfTUFTSwkJICAgICAgMHhFMDAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfU0hJRlQJCSAgICAgIDI5Ci0jZGVmaW5lIFBPUlRfRkVBVF9DRkdfT1BUX01ETF9FTkZSQ01OVF9OT19FTkZPUkNFTUVOVAkgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVF9DRkdfT1BUX01ETF9FTkZSQ01OVF9ESVNBQkxFX1RYX0xBU0VSICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX1dBUk5JTkdfTVNHCSAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX1BPV0VSX0RPV04JICAgICAgMHg2MDAwMDAwMAorCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19EQ0JYX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisJCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19EQ0JYX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVF9DRkdfRENCWF9FTkFCTEVEICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKIAorCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19BVVRPR1JFRU5fTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisJI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX0FVVE9HUkVFTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDkKKwkjZGVmaW5lIFBPUlRfRkVBVF9DRkdfQVVUT0dSRUVOX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19BVVRPR1JFRU5fRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9FTl9TSVpFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwZjAwMDAwMAorCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0VOX1NJWkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAyNAorCSNkZWZpbmUgUE9SVF9GRUFUVVJFX1dPTF9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NRldfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorCisJLyogQWR2ZXJ0aXNlIGV4cGFuc2lvbiBST00gZXZlbiBpZiBNQkEgaXMgZGlzYWJsZWQgKi8KKwkjZGVmaW5lIFBPUlRfRkVBVF9DRkdfRk9SQ0VfRVhQX1JPTV9BRFZfTUFTSyAgICAgICAgMHgwODAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVF9DRkdfRk9SQ0VfRVhQX1JPTV9BRFZfRElTQUJMRUQgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX0ZPUkNFX0VYUF9ST01fQURWX0VOQUJMRUQgICAgICAweDA4MDAwMDAwCisKKwkvKiBDaGVjayB0aGUgb3B0aWMgdmVuZG9yIHZpYSBpMmMgYWdhaW5zdCBhIGxpc3Qgb2YgYXBwcm92ZWQgbW9kdWxlcworCSAgIGluIGEgc2VwYXJhdGUgbnZyYW0gaW1hZ2UgKi8KKwkjZGVmaW5lIFBPUlRfRkVBVF9DRkdfT1BUX01ETF9FTkZSQ01OVF9NQVNLICAgICAgICAgMHhlMDAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVF9DRkdfT1BUX01ETF9FTkZSQ01OVF9TSElGVCAgICAgICAgIDI5CisJCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX05PX0VORk9SQ0VNRU5UIFwKKwkJCQkJCQkJICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX0RJU0FCTEVfVFhfTEFTRVIgXAorCQkJCQkJCQkgICAgIDB4MjAwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfV0FSTklOR19NU0cgICAweDQwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX1BPV0VSX0RPV04gICAgMHg2MDAwMDAwMAogCiAJdTMyIHdvbF9jb25maWc7CiAJLyogRGVmYXVsdCBpcyB1c2VkIHdoZW4gZHJpdmVyIHNldHMgdG8gImF1dG8iIG1vZGUgKi8KLSNkZWZpbmUgUE9SVF9GRUFUVVJFX1dPTF9ERUZBVUxUX01BU0sJCSAgICAweDAwMDAwMDAzCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9XT0xfREVGQVVMVF9TSElGVAkJICAgIDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX1dPTF9ERUZBVUxUX0RJU0FCTEUJICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX1dPTF9ERUZBVUxUX01BR0lDCQkgICAgMHgwMDAwMDAwMQotI2RlZmluZSBQT1JUX0ZFQVRVUkVfV09MX0RFRkFVTFRfQUNQSQkJICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX1dPTF9ERUZBVUxUX01BR0lDX0FORF9BQ1BJICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9XT0xfUkVTX1BBVVNFX0NBUAkJICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX1dPTF9SRVNfQVNZTV9QQVVTRV9DQVAJICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX1dPTF9BQ1BJX1VQT05fTUdNVCAJICAgIDB4MDAwMDAwMTAKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9XT0xfREVGQVVMVF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAwMworCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9XT0xfREVGQVVMVF9TSElGVCAgICAgICAgICAgICAgIDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfV09MX0RFRkFVTFRfRElTQUJMRSAgICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX1dPTF9ERUZBVUxUX01BR0lDICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9XT0xfREVGQVVMVF9BQ1BJICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfV09MX0RFRkFVTFRfTUFHSUNfQU5EX0FDUEkgICAgICAweDAwMDAwMDAzCisJI2RlZmluZSBQT1JUX0ZFQVRVUkVfV09MX1JFU19QQVVTRV9DQVAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9XT0xfUkVTX0FTWU1fUEFVU0VfQ0FQICAgICAgICAgMHgwMDAwMDAwOAorCSNkZWZpbmUgUE9SVF9GRUFUVVJFX1dPTF9BQ1BJX1VQT05fTUdNVCAgICAgICAgICAgICAweDAwMDAwMDEwCiAKIAl1MzIgbWJhX2NvbmZpZzsKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9CT09UX0FHRU5UX1RZUEVfTUFTSwkgICAgMHgwMDAwMDAwMwotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9TSElGVAkgICAgMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9QWEUJICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9CT09UX0FHRU5UX1RZUEVfUlBMCSAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfQk9PVF9BR0VOVF9UWVBFX0JPT1RQCSAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfQk9PVF9BR0VOVF9UWVBFX0lTQ1NJQiAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX1JFU19QQVVTRV9DQVAJCSAgICAweDAwMDAwMTAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfUkVTX0FTWU1fUEFVU0VfQ0FQCSAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfU0VUVVBfUFJPTVBUX0VOQUJMRQkgICAgMHgwMDAwMDQwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0hPVEtFWV9DVFJMX1MJCSAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfSE9US0VZX0NUUkxfQgkJICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfTUFTSwkgICAgMHgwMDBmZjAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV9TSElGVAkgICAgMTIKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfRElTQUJMRUQJICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfMksJICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfNEsJICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfOEsJICAgIDB4MDAwMDMwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfMTZLCSAgICAweDAwMDA0MDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzMySwkgICAgMHgwMDAwNTAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV82NEsJICAgIDB4MDAwMDYwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfMTI4SwkgICAgMHgwMDAwNzAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV8yNTZLCSAgICAweDAwMDA4MDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzUxMksJICAgIDB4MDAwMDkwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfMU0JICAgIDB4MDAwMGEwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfMk0JICAgIDB4MDAwMGIwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfNE0JICAgIDB4MDAwMGMwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfOE0JICAgIDB4MDAwMGQwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfMTZNCSAgICAweDAwMDBlMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzMyTQkgICAgMHgwMDAwZjAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX01TR19USU1FT1VUX01BU0sJICAgIDB4MDBmMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9NU0dfVElNRU9VVF9TSElGVAkgICAgMjAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9CSU9TX0JPT1RTVFJBUF9NQVNLCSAgICAweDAzMDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfQklPU19CT09UU1RSQVBfU0hJRlQJICAgIDI0Ci0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfQklPU19CT09UU1RSQVBfQVVUTwkgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0JJT1NfQk9PVFNUUkFQX0JCUwkgICAgMHgwMTAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0JJT1NfQk9PVFNUUkFQX0lOVDE4SAkgICAgMHgwMjAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0JJT1NfQk9PVFNUUkFQX0lOVDE5SAkgICAgMHgwMzAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0xJTktfU1BFRURfTUFTSwkgICAgMHgzYzAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0xJTktfU1BFRURfU0hJRlQJICAgIDI2Ci0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF9BVVRPCSAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMEhECSAgICAweDA0MDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMEZECSAgICAweDA4MDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMDBIRAkgICAgMHgwYzAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0xJTktfU1BFRURfMTAwRkQJICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9MSU5LX1NQRUVEXzFHQlBTCSAgICAweDE0MDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8yXzVHQlBTCSAgICAweDE4MDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMEdCUFNfQ1g0CSAgICAweDFjMDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMEdCUFNfS1g0CSAgICAweDIwMDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMEdCUFNfS1IJICAgIDB4MjQwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9MSU5LX1NQRUVEXzEyR0JQUwkgICAgMHgyODAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0xJTktfU1BFRURfMTJfNUdCUFMJICAgIDB4MmMwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9MSU5LX1NQRUVEXzEzR0JQUwkgICAgMHgzMDAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0xJTktfU1BFRURfMTVHQlBTCSAgICAweDM0MDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xNkdCUFMJICAgIDB4MzgwMDAwMDAKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfQk9PVF9BR0VOVF9UWVBFX01BU0sgICAgICAgMHgwMDAwMDAwNworCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfQk9PVF9BR0VOVF9UWVBFX1NISUZUICAgICAgIDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9QWEUgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9CT09UX0FHRU5UX1RZUEVfUlBMICAgICAgICAgMHgwMDAwMDAwMQorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfQk9PVF9BR0VOVF9UWVBFX0JPT1RQICAgICAgIDB4MDAwMDAwMDIKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9JU0NTSUIgICAgICAweDAwMDAwMDAzCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9CT09UX0FHRU5UX1RZUEVfRkNPRV9CT09UICAgMHgwMDAwMDAwNAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfQk9PVF9BR0VOVF9UWVBFX05PTkUgICAgICAgIDB4MDAwMDAwMDcKIAorCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9CT09UX1JFVFJZX01BU0sgICAgICAgICAgICAweDAwMDAwMDM4CisJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0JPT1RfUkVUUllfU0hJRlQgICAgICAgICAgICAgICAgICAgIDMKKworCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9SRVNfUEFVU0VfQ0FQICAgICAgICAgICAgICAweDAwMDAwMTAwCisJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX1JFU19BU1lNX1BBVVNFX0NBUCAgICAgICAgIDB4MDAwMDAyMDAKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfU0VUVVBfUFJPTVBUX0VOQUJMRSAgICAgICAgMHgwMDAwMDQwMAorCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9IT1RLRVlfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwODAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9IT1RLRVlfQ1RSTF9TICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfSE9US0VZX0NUUkxfQiAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFX01BU0sgICAgICAgICAgMHgwMDBmZjAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFX1NISUZUICAgICAgICAgIDEyCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfRElTQUJMRUQgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzJLICAgICAgICAgICAgIDB4MDAwMDEwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV80SyAgICAgICAgICAgICAweDAwMDAyMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfOEsgICAgICAgICAgICAgMHgwMDAwMzAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzE2SyAgICAgICAgICAgIDB4MDAwMDQwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV8zMksgICAgICAgICAgICAweDAwMDA1MDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfNjRLICAgICAgICAgICAgMHgwMDAwNjAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzEyOEsgICAgICAgICAgIDB4MDAwMDcwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV8yNTZLICAgICAgICAgICAweDAwMDA4MDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfNTEySyAgICAgICAgICAgMHgwMDAwOTAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzFNICAgICAgICAgICAgIDB4MDAwMGEwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV8yTSAgICAgICAgICAgICAweDAwMDBiMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfNE0gICAgICAgICAgICAgMHgwMDAwYzAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfRVhQX1JPTV9TSVpFXzhNICAgICAgICAgICAgIDB4MDAwMGQwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0VYUF9ST01fU0laRV8xNk0gICAgICAgICAgICAweDAwMDBlMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9FWFBfUk9NX1NJWkVfMzJNICAgICAgICAgICAgMHgwMDAwZjAwMAorCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9NU0dfVElNRU9VVF9NQVNLICAgICAgICAgICAweDAwZjAwMDAwCisJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX01TR19USU1FT1VUX1NISUZUICAgICAgICAgICAgICAgICAgIDIwCisJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0JJT1NfQk9PVFNUUkFQX01BU0sgICAgICAgIDB4MDMwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0JJT1NfQk9PVFNUUkFQX1NISUZUICAgICAgICAyNAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfQklPU19CT09UU1RSQVBfQVVUTyAgICAgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0JJT1NfQk9PVFNUUkFQX0JCUyAgICAgICAgICAweDAxMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9CSU9TX0JPT1RTVFJBUF9JTlQxOEggICAgICAgMHgwMjAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfQklPU19CT09UU1RSQVBfSU5UMTlIICAgICAgIDB4MDMwMDAwMDAKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF9NQVNLICAgICAgICAgICAgMHgzYzAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF9TSElGVCAgICAgICAgICAgIDI2CisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9MSU5LX1NQRUVEX0FVVE8gICAgICAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMEhEICAgICAgICAgICAgIDB4MDQwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0xJTktfU1BFRURfMTBGRCAgICAgICAgICAgICAweDA4MDAwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9MSU5LX1NQRUVEXzEwMEhEICAgICAgICAgICAgMHgwYzAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMDBGRCAgICAgICAgICAgIDB4MTAwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0xJTktfU1BFRURfMUdCUFMgICAgICAgICAgICAweDE0MDAwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9MSU5LX1NQRUVEXzJfNUdCUFMgICAgICAgICAgMHgxODAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfTElOS19TUEVFRF8xMEdCUFNfQ1g0ICAgICAgIDB4MWMwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX0xJTktfU1BFRURfMjBHQlBTICAgICAgICAgICAweDIwMDAwMDAwCiAJdTMyIGJtY19jb25maWc7Ci0jZGVmaW5lIFBPUlRfRkVBVFVSRV9CTUNfTElOS19PVkVSUklERV9ERUZBVUxUCSAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9CTUNfTElOS19PVkVSUklERV9FTgkgICAgMHgwMDAwMDAwMQorCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JNQ19MSU5LX09WRVJSSURFX01BU0sgICAgICAgICAweDAwMDAwMDAxCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0JNQ19MSU5LX09WRVJSSURFX0RFRkFVTFQgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9CTUNfTElOS19PVkVSUklERV9FTiAgICAgICAgICAgIDB4MDAwMDAwMDEKIAogCXUzMiBtYmFfdmxhbl9jZmc7Ci0jZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfVkxBTl9UQUdfTUFTSwkJICAgIDB4MDAwMGZmZmYKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9WTEFOX1RBR19TSElGVCAJICAgIDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9WTEFOX0VOCQkgICAgMHgwMDAxMDAwMAorCSNkZWZpbmUgUE9SVF9GRUFUVVJFX01CQV9WTEFOX1RBR19NQVNLICAgICAgICAgICAgICAweDAwMDBmZmZmCisJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTUJBX1ZMQU5fVEFHX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9NQkFfVkxBTl9FTiAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAogCiAJdTMyIHJlc291cmNlX2NmZzsKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX1JFU09VUkNFX0NGR19WQUxJRCAJICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX1JFU09VUkNFX0NGR19ESUFHCQkgICAgMHgwMDAwMDAwMgotI2RlZmluZSBQT1JUX0ZFQVRVUkVfUkVTT1VSQ0VfQ0ZHX0wyCQkgICAgMHgwMDAwMDAwNAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfUkVTT1VSQ0VfQ0ZHX0lTQ1NJIAkgICAgMHgwMDAwMDAwOAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfUkVTT1VSQ0VfQ0ZHX1JETUEJCSAgICAweDAwMDAwMDEwCisJI2RlZmluZSBQT1JUX0ZFQVRVUkVfUkVTT1VSQ0VfQ0ZHX1ZBTElEICAgICAgICAgICAgIDB4MDAwMDAwMDEKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9SRVNPVVJDRV9DRkdfRElBRyAgICAgICAgICAgICAgMHgwMDAwMDAwMgorCSNkZWZpbmUgUE9SVF9GRUFUVVJFX1JFU09VUkNFX0NGR19MMiAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisJI2RlZmluZSBQT1JUX0ZFQVRVUkVfUkVTT1VSQ0VfQ0ZHX0lTQ1NJICAgICAgICAgICAgIDB4MDAwMDAwMDgKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9SRVNPVVJDRV9DRkdfUkRNQSAgICAgICAgICAgICAgMHgwMDAwMDAxMAogCiAJdTMyIHNtYnVzX2NvbmZpZzsKLQkvKiBPYnNvbGV0ZSAqLwotI2RlZmluZSBQT1JUX0ZFQVRVUkVfU01CVVNfRU4JCQkgICAgMHgwMDAwMDAwMQotI2RlZmluZSBQT1JUX0ZFQVRVUkVfU01CVVNfQUREUl9NQVNLCQkgICAgMHgwMDAwMDBmZQotI2RlZmluZSBQT1JUX0ZFQVRVUkVfU01CVVNfQUREUl9TSElGVAkJICAgIDEKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9TTUJVU19BRERSX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDBmZQorCSNkZWZpbmUgUE9SVF9GRUFUVVJFX1NNQlVTX0FERFJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxCiAKLQl1MzIgcmVzZXJ2ZWQxOworCXUzMiB2Zl9jb25maWc7CisJI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX1ZGX0JBUjJfU0laRV9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwMGYKKwkJI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX1ZGX0JBUjJfU0laRV9TSElGVCAgICAgICAgICAgICAwCisJCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19WRl9CQVIyX1NJWkVfRElTQUJMRUQgICAgICAgICAgMHgwMDAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVF9DRkdfVkZfQkFSMl9TSVpFXzRLICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKwkJI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX1ZGX0JBUjJfU0laRV84SyAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisJCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19WRl9CQVIyX1NJWkVfMTZLICAgICAgICAgICAgICAgMHgwMDAwMDAwMworCQkjZGVmaW5lIFBPUlRfRkVBVF9DRkdfVkZfQkFSMl9TSVpFXzMySyAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKwkJI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX1ZGX0JBUjJfU0laRV82NEsgICAgICAgICAgICAgICAweDAwMDAwMDA1CisJCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19WRl9CQVIyX1NJWkVfMTI4SyAgICAgICAgICAgICAgMHgwMDAwMDAwNgorCQkjZGVmaW5lIFBPUlRfRkVBVF9DRkdfVkZfQkFSMl9TSVpFXzI1NksgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKwkJI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX1ZGX0JBUjJfU0laRV81MTJLICAgICAgICAgICAgICAweDAwMDAwMDA4CisJCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19WRl9CQVIyX1NJWkVfMU0gICAgICAgICAgICAgICAgMHgwMDAwMDAwOQorCQkjZGVmaW5lIFBPUlRfRkVBVF9DRkdfVkZfQkFSMl9TSVpFXzJNICAgICAgICAgICAgICAgIDB4MDAwMDAwMGEKKwkJI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX1ZGX0JBUjJfU0laRV80TSAgICAgICAgICAgICAgICAweDAwMDAwMDBiCisJCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19WRl9CQVIyX1NJWkVfOE0gICAgICAgICAgICAgICAgMHgwMDAwMDAwYworCQkjZGVmaW5lIFBPUlRfRkVBVF9DRkdfVkZfQkFSMl9TSVpFXzE2TSAgICAgICAgICAgICAgIDB4MDAwMDAwMGQKKwkJI2RlZmluZSBQT1JUX0ZFQVRfQ0ZHX1ZGX0JBUjJfU0laRV8zMk0gICAgICAgICAgICAgICAweDAwMDAwMDBlCisJCSNkZWZpbmUgUE9SVF9GRUFUX0NGR19WRl9CQVIyX1NJWkVfNjRNICAgICAgICAgICAgICAgMHgwMDAwMDAwZgogCiAJdTMyIGxpbmtfY29uZmlnOyAgICAvKiBVc2VkIGFzIEhXIGRlZmF1bHRzIGZvciB0aGUgZHJpdmVyICovCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9DT05ORUNURURfU1dJVENIX01BU0sJICAgIDB4MDMwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0NPTk5FQ1RFRF9TV0lUQ0hfU0hJRlQJICAgIDI0Ci0JLyogKGZvcmNlZCkgbG93IHNwZWVkIHN3aXRjaCAoPCAxMEcpICovCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9DT05fU1dJVENIXzFHX1NXSVRDSAkgICAgMHgwMDAwMDAwMAotCS8qIChmb3JjZWQpIGhpZ2ggc3BlZWQgc3dpdGNoICg+PSAxMEcpICovCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9DT05fU1dJVENIXzEwR19TV0lUQ0gJICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0NPTl9TV0lUQ0hfQVVUT19ERVRFQ1QJICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0NPTl9TV0lUQ0hfT05FX1RJTUVfREVURUNUICAgICAweDAzMDAwMDAwCisJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQ09OTkVDVEVEX1NXSVRDSF9NQVNLICAgICAgICAgIDB4MDMwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQ09OTkVDVEVEX1NXSVRDSF9TSElGVCAgICAgICAgICAyNAorCQkvKiAoZm9yY2VkKSBsb3cgc3BlZWQgc3dpdGNoICg8IDEwRykgKi8KKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQ09OX1NXSVRDSF8xR19TV0lUQ0ggICAgICAgICAgICAweDAwMDAwMDAwCisJCS8qIChmb3JjZWQpIGhpZ2ggc3BlZWQgc3dpdGNoICg+PSAxMEcpICovCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0NPTl9TV0lUQ0hfMTBHX1NXSVRDSCAgICAgICAgICAgMHgwMTAwMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9DT05fU1dJVENIX0FVVE9fREVURUNUICAgICAgICAgIDB4MDIwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfQ09OX1NXSVRDSF9PTkVfVElNRV9ERVRFQ1QgICAgICAweDAzMDAwMDAwCiAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfTUFTSwkJICAgIDB4MDAwZjAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfU0hJRlQJCSAgICAxNgotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF9BVVRPCQkgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xME1fRlVMTAkgICAgMHgwMDAxMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xME1fSEFMRgkgICAgMHgwMDAyMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xMDBNX0hBTEYJICAgIDB4MDAwMzAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMTAwTV9GVUxMCSAgICAweDAwMDQwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzFHCQkgICAgMHgwMDA1MDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8yXzVHCQkgICAgMHgwMDA2MDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xMEdfQ1g0IAkgICAgMHgwMDA3MDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xMEdfS1g0IAkgICAgMHgwMDA4MDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xMEdfS1IJCSAgICAweDAwMDkwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzEyRwkJICAgIDB4MDAwYTAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMTJfNUcJCSAgICAweDAwMGIwMDAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzEzRwkJICAgIDB4MDAwYzAwMDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMTVHCQkgICAgMHgwMDBkMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xNkcJCSAgICAweDAwMGUwMDAwCisJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwZjAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF9TSElGVCAgICAgICAgICAgICAgICAxNgorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEX0FVVE8gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xME1fRlVMTCAgICAgICAgICAgICAweDAwMDEwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMTBNX0hBTEYgICAgICAgICAgICAgMHgwMDAyMDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzEwME1fSEFMRiAgICAgICAgICAgIDB4MDAwMzAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xMDBNX0ZVTEwgICAgICAgICAgICAweDAwMDQwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMUcgICAgICAgICAgICAgICAgICAgMHgwMDA1MDAwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzJfNUcgICAgICAgICAgICAgICAgIDB4MDAwNjAwMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xMEdfQ1g0ICAgICAgICAgICAgICAweDAwMDcwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMjBHICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAogCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9GTE9XX0NPTlRST0xfTUFTSwkJICAgIDB4MDAwMDA3MDAKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0ZMT1dfQ09OVFJPTF9TSElGVCAJICAgIDgKLSNkZWZpbmUgUE9SVF9GRUFUVVJFX0ZMT1dfQ09OVFJPTF9BVVRPCQkgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfRkxPV19DT05UUk9MX1RYCQkgICAgMHgwMDAwMDEwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfRkxPV19DT05UUk9MX1JYCQkgICAgMHgwMDAwMDIwMAotI2RlZmluZSBQT1JUX0ZFQVRVUkVfRkxPV19DT05UUk9MX0JPVEgJCSAgICAweDAwMDAwMzAwCi0jZGVmaW5lIFBPUlRfRkVBVFVSRV9GTE9XX0NPTlRST0xfTk9ORQkJICAgIDB4MDAwMDA0MDAKKwkjZGVmaW5lIFBPUlRfRkVBVFVSRV9GTE9XX0NPTlRST0xfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDcwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9GTE9XX0NPTlRST0xfU0hJRlQgICAgICAgICAgICAgIDgKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfRkxPV19DT05UUk9MX0FVVE8gICAgICAgICAgICAgICAweDAwMDAwMDAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0ZMT1dfQ09OVFJPTF9UWCAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorCQkjZGVmaW5lIFBPUlRfRkVBVFVSRV9GTE9XX0NPTlRST0xfUlggICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKwkJI2RlZmluZSBQT1JUX0ZFQVRVUkVfRkxPV19DT05UUk9MX0JPVEggICAgICAgICAgICAgICAweDAwMDAwMzAwCisJCSNkZWZpbmUgUE9SVF9GRUFUVVJFX0ZMT1dfQ09OVFJPTF9OT05FICAgICAgICAgICAgICAgMHgwMDAwMDQwMAogCiAJLyogVGhlIGRlZmF1bHQgZm9yIE1DUCBsaW5rIGNvbmZpZ3VyYXRpb24sCi0JdXNlcyB0aGUgc2FtZSBkZWZpbmVzIGFzIGxpbmtfY29uZmlnICovCisJICAgdXNlcyB0aGUgc2FtZSBkZWZpbmVzIGFzIGxpbmtfY29uZmlnICovCiAJdTMyIG1md193b2xfbGlua19jZmc7CisKIAkvKiBUaGUgZGVmYXVsdCBmb3IgdGhlIGRyaXZlciBvZiB0aGUgc2Vjb25kIGV4dGVybmFsIHBoeSwKLQl1c2VzIHRoZSBzYW1lIGRlZmluZXMgYXMgbGlua19jb25maWcgKi8KLQl1MzIgbGlua19jb25maWcyOwkJCQkJLyogMHg0N0MgKi8KKwkgICB1c2VzIHRoZSBzYW1lIGRlZmluZXMgYXMgbGlua19jb25maWcgKi8KKwl1MzIgbGlua19jb25maWcyOwkJCQkgICAgLyogMHg0N0MgKi8KIAogCS8qIFRoZSBkZWZhdWx0IGZvciBNQ1Agb2YgdGhlIHNlY29uZCBleHRlcm5hbCBwaHksCi0JdXNlcyB0aGUgc2FtZSBkZWZpbmVzIGFzIGxpbmtfY29uZmlnICovCi0JdTMyIG1md193b2xfbGlua19jZmcyOwkJCQkvKiAweDQ4MCAqLworCSAgIHVzZXMgdGhlIHNhbWUgZGVmaW5lcyBhcyBsaW5rX2NvbmZpZyAqLworCXUzMiBtZndfd29sX2xpbmtfY2ZnMjsJCQkJICAgIC8qIDB4NDgwICovCiAKLQl1MzIgUmVzZXJ2ZWQyWzE3XTsJCQkJCS8qIDB4NDg0ICovCisJdTMyIFJlc2VydmVkMlsxN107CQkJCSAgICAvKiAweDQ4NCAqLwogCiB9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEZXZpY2UgSW5mb3JtYXRpb24JCQkJCQkJICAgICoKKyAqIERldmljZSBJbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBzaG1fZGV2X2luZm8gewkJCQkJCSAgICAvKiBzaXplICovCitzdHJ1Y3Qgc2htX2Rldl9pbmZvIHsJCQkJLyogc2l6ZSAqLwogCiAJdTMyICAgIGJjX3JldjsgLyogOCBiaXRzIGVhY2g6IG1ham9yLCBtaW5vciwgYnVpbGQgKi8JICAgICAgIC8qIDQgKi8KIAotCXN0cnVjdCBzaGFyZWRfaHdfY2ZnCSBzaGFyZWRfaHdfY29uZmlnOwkJICAgICAgLyogNDAgKi8KKwlzdHJ1Y3Qgc2hhcmVkX2h3X2NmZyAgICAgc2hhcmVkX2h3X2NvbmZpZzsJICAgICAgLyogNDAgKi8KIAotCXN0cnVjdCBwb3J0X2h3X2NmZwkgcG9ydF9od19jb25maWdbUE9SVF9NQVhdOyAgICAgLyogNDAwKjI9ODAwICovCisJc3RydWN0IHBvcnRfaHdfY2ZnICAgICAgIHBvcnRfaHdfY29uZmlnW1BPUlRfTUFYXTsgICAgIC8qIDQwMCoyPTgwMCAqLwogCi0Jc3RydWN0IHNoYXJlZF9mZWF0X2NmZwkgc2hhcmVkX2ZlYXR1cmVfY29uZmlnOyAJICAgICAgIC8qIDQgKi8KKwlzdHJ1Y3Qgc2hhcmVkX2ZlYXRfY2ZnICAgc2hhcmVkX2ZlYXR1cmVfY29uZmlnOwkJICAgLyogNCAqLwogCi0Jc3RydWN0IHBvcnRfZmVhdF9jZmcJIHBvcnRfZmVhdHVyZV9jb25maWdbUE9SVF9NQVhdOy8qIDExNioyPTIzMiAqLworCXN0cnVjdCBwb3J0X2ZlYXRfY2ZnICAgICBwb3J0X2ZlYXR1cmVfY29uZmlnW1BPUlRfTUFYXTsvKiAxMTYqMj0yMzIgKi8KIAogfTsKIAogCi0jZGVmaW5lIEZVTkNfMAkJCQkwCi0jZGVmaW5lIEZVTkNfMQkJCQkxCi0jZGVmaW5lIEZVTkNfMgkJCQkyCi0jZGVmaW5lIEZVTkNfMwkJCQkzCi0jZGVmaW5lIEZVTkNfNAkJCQk0Ci0jZGVmaW5lIEZVTkNfNQkJCQk1Ci0jZGVmaW5lIEZVTkNfNgkJCQk2Ci0jZGVmaW5lIEZVTkNfNwkJCQk3Ci0jZGVmaW5lIEUxX0ZVTkNfTUFYCQkJMgotI2RlZmluZSBFMUhfRlVOQ19NQVgJCQk4Ci0jZGVmaW5lIEUyX0ZVTkNfTUFYCSAgICA0CS8qIHBlciBwYXRoICovCisjaWYgIWRlZmluZWQoX19MSVRUTEVfRU5ESUFOKSAmJiAhZGVmaW5lZChfX0JJR19FTkRJQU4pCisJI2Vycm9yICJNaXNzaW5nIGVpdGhlciBMSVRUTEVfRU5ESUFOIG9yIEJJR19FTkRJQU4gZGVmaW5pdGlvbi4iCisjZW5kaWYKIAotI2RlZmluZSBWTl8wCQkJCTAKLSNkZWZpbmUgVk5fMQkJCQkxCi0jZGVmaW5lIFZOXzIJCQkJMgotI2RlZmluZSBWTl8zCQkJCTMKLSNkZWZpbmUgRTFWTl9NQVgJCQkxCi0jZGVmaW5lIEUxSFZOX01BWAkJCTQKKyNkZWZpbmUgRlVOQ18wICAgICAgICAgICAgICAwCisjZGVmaW5lIEZVTkNfMSAgICAgICAgICAgICAgMQorI2RlZmluZSBGVU5DXzIgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRlVOQ18zICAgICAgICAgICAgICAzCisjZGVmaW5lIEZVTkNfNCAgICAgICAgICAgICAgNAorI2RlZmluZSBGVU5DXzUgICAgICAgICAgICAgIDUKKyNkZWZpbmUgRlVOQ182ICAgICAgICAgICAgICA2CisjZGVmaW5lIEZVTkNfNyAgICAgICAgICAgICAgNworI2RlZmluZSBFMV9GVU5DX01BWCAgICAgICAgIDIKKyNkZWZpbmUgRTFIX0ZVTkNfTUFYICAgICAgICAgICAgOAorI2RlZmluZSBFMl9GVU5DX01BWCAgICAgICAgIDQgICAvKiBwZXIgcGF0aCAqLwogCi0jZGVmaW5lIEUyX1ZGX01BWAkJCTY0CisjZGVmaW5lIFZOXzAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWTl8xICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVk5fMiAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFZOXzMgICAgICAgICAgICAgICAgMworI2RlZmluZSBFMVZOX01BWCAgICAgICAgICAgIDEKKyNkZWZpbmUgRTFIVk5fTUFYICAgICAgICAgICA0CisKKyNkZWZpbmUgRTJfVkZfTUFYICAgICAgICAgICA2NCAgLyogSENfUkVHX1ZGX0NPTkZJR1VSQVRJT05fU0laRSAqLwogLyogVGhpcyB2YWx1ZSAoaW4gbWlsbGlzZWNvbmRzKSBkZXRlcm1pbmVzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGRyaXZlcgogICogaXNzdWluZyB0aGUgUFVMU0UgbWVzc2FnZSBjb2RlLiAgVGhlIGZpcm13YXJlIG1vbml0b3JzIHRoaXMgcGVyaW9kaWMKICAqIHB1bHNlIHRvIGRldGVybWluZSB3aGVuIHRvIHN3aXRjaCB0byBhbiBPUy1hYnNlbnQgbW9kZS4gKi8KLSNkZWZpbmUgRFJWX1BVTFNFX1BFUklPRF9NUwkJMjUwCisjZGVmaW5lIERSVl9QVUxTRV9QRVJJT0RfTVMgICAgIDI1MAogCiAvKiBUaGlzIHZhbHVlIChpbiBtaWxsaXNlY29uZHMpIGRldGVybWluZXMgaG93IGxvbmcgdGhlIGRyaXZlciBzaG91bGQKICAqIHdhaXQgZm9yIGFuIGFja25vd2xlZGdlbWVudCBmcm9tIHRoZSBmaXJtd2FyZSBiZWZvcmUgdGltaW5nIG91dC4gIE9uY2UKICAqIHRoZSBmaXJtd2FyZSBoYXMgdGltZWQgb3V0LCB0aGUgZHJpdmVyIHdpbGwgYXNzdW1lIHRoZXJlIGlzIG5vIGZpcm13YXJlCiAgKiBydW5uaW5nIGFuZCB0aGVyZSB3b24ndCBiZSBhbnkgZmlybXdhcmUtZHJpdmVyIHN5bmNocm9uaXphdGlvbiBkdXJpbmcgYQogICogZHJpdmVyIHJlc2V0LiAqLwotI2RlZmluZSBGV19BQ0tfVElNRV9PVVRfTVMJCTUwMDAKKyNkZWZpbmUgRldfQUNLX1RJTUVfT1VUX01TICAgICAgNTAwMAogCi0jZGVmaW5lIEZXX0FDS19QT0xMX1RJTUVfTVMJCTEKKyNkZWZpbmUgRldfQUNLX1BPTExfVElNRV9NUyAgICAgMQogCi0jZGVmaW5lIEZXX0FDS19OVU1fT0ZfUE9MTAkoRldfQUNLX1RJTUVfT1VUX01TL0ZXX0FDS19QT0xMX1RJTUVfTVMpCisjZGVmaW5lIEZXX0FDS19OVU1fT0ZfUE9MTCAgKEZXX0FDS19USU1FX09VVF9NUy9GV19BQ0tfUE9MTF9USU1FX01TKQogCiAvKiBMRUQgQmxpbmsgcmF0ZSB0aGF0IHdpbGwgYWNoaWV2ZSB+MTUuOUh6ICovCi0jZGVmaW5lIExFRF9CTElOS19SQVRFX1ZBTAkJNDgwCisjZGVmaW5lIExFRF9CTElOS19SQVRFX1ZBTCAgICAgIDQ4MAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRHJpdmVyIDwtPiBGVyBNYWlsYm94CQkJCQkJICAgICoKKyAqIERyaXZlciA8LT4gRlcgTWFpbGJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0cnVjdCBkcnZfcG9ydF9tYiB7CiAKIAl1MzIgbGlua19zdGF0dXM7CiAJLyogRHJpdmVyIHNob3VsZCB1cGRhdGUgdGhpcyBmaWVsZCBvbiBhbnkgbGluayBjaGFuZ2UgZXZlbnQgKi8KIAotI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX0ZMQUdfTUFTSwkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19VUAkJCQkweDAwMDAwMDAxCi0jZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfTUFTSwkJMHgwMDAwMDAxRQotI2RlZmluZSBMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYX0FOX05PVF9DT01QTEVURQkoMDw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMFRIRAkJKDE8PDEpCi0jZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTBURkQJCSgyPDwxKQotI2RlZmluZSBMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwMFRYSEQJCSgzPDwxKQotI2RlZmluZSBMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwMFQ0CQkoNDw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDBUWEZECQkoNTw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDAwVEhECQkoNjw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDAwVEZECQkoNzw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDAwWEZECQkoNzw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8yNTAwVEhECQkoODw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8yNTAwVEZECQkoOTw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8yNTAwWEZECQkoOTw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMEdURkQJCSgxMDw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMEdYRkQJCSgxMDw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMkdURkQJCSgxMTw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMkdYRkQJCSgxMTw8MSkKLSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMl81R1RGRAkJKDEyPDwxKQotI2RlZmluZSBMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEyXzVHWEZECQkoMTI8PDEpCi0jZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTNHVEZECQkoMTM8PDEpCi0jZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTNHWEZECQkoMTM8PDEpCi0jZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTVHVEZECQkoMTQ8PDEpCi0jZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTVHWEZECQkoMTQ8PDEpCi0jZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTZHVEZECQkoMTU8PDEpCi0jZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTZHWEZECQkoMTU8PDEpCisJI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX0ZMQUdfTUFTSwkJCTB4MDAwMDAwMDEKKwkjZGVmaW5lIExJTktfU1RBVFVTX0xJTktfVVAJCQkJMHgwMDAwMDAwMQorCSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF9NQVNLCQkweDAwMDAwMDFFCisJI2RlZmluZSBMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYX0FOX05PVF9DT01QTEVURQkoMDw8MSkKKwkjZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTBUSEQJCSgxPDwxKQorCSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMFRGRAkJKDI8PDEpCisJI2RlZmluZSBMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwMFRYSEQJCSgzPDwxKQorCSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDBUNAkJKDQ8PDEpCisJI2RlZmluZSBMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwMFRYRkQJCSg1PDwxKQorCSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDAwVEhECQkoNjw8MSkKKwkjZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTAwMFRGRAkJKDc8PDEpCisJI2RlZmluZSBMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwMDBYRkQJCSg3PDwxKQorCSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8yNTAwVEhECQkoODw8MSkKKwkjZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMjUwMFRGRAkJKDk8PDEpCisJI2RlZmluZSBMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzI1MDBYRkQJCSg5PDwxKQorCSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMEdURkQJCSgxMDw8MSkKKwkjZGVmaW5lIExJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTBHWEZECQkoMTA8PDEpCisJI2RlZmluZSBMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzIwR1RGRAkJKDExPDwxKQorCSNkZWZpbmUgTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8yMEdYRkQJCSgxMTw8MSkKIAotI2RlZmluZSBMSU5LX1NUQVRVU19BVVRPX05FR09USUFURV9GTEFHX01BU0sJCTB4MDAwMDAwMjAKLSNkZWZpbmUgTElOS19TVEFUVVNfQVVUT19ORUdPVElBVEVfRU5BQkxFRAkJMHgwMDAwMDAyMAorCSNkZWZpbmUgTElOS19TVEFUVVNfQVVUT19ORUdPVElBVEVfRkxBR19NQVNLCQkweDAwMDAwMDIwCisJI2RlZmluZSBMSU5LX1NUQVRVU19BVVRPX05FR09USUFURV9FTkFCTEVECQkweDAwMDAwMDIwCiAKLSNkZWZpbmUgTElOS19TVEFUVVNfQVVUT19ORUdPVElBVEVfQ09NUExFVEUJCTB4MDAwMDAwNDAKLSNkZWZpbmUgTElOS19TVEFUVVNfUEFSQUxMRUxfREVURUNUSU9OX0ZMQUdfTUFTSwkweDAwMDAwMDgwCi0jZGVmaW5lIExJTktfU1RBVFVTX1BBUkFMTEVMX0RFVEVDVElPTl9VU0VECQkweDAwMDAwMDgwCisJI2RlZmluZSBMSU5LX1NUQVRVU19BVVRPX05FR09USUFURV9DT01QTEVURQkJMHgwMDAwMDA0MAorCSNkZWZpbmUgTElOS19TVEFUVVNfUEFSQUxMRUxfREVURUNUSU9OX0ZMQUdfTUFTSwkweDAwMDAwMDgwCisJI2RlZmluZSBMSU5LX1NUQVRVU19QQVJBTExFTF9ERVRFQ1RJT05fVVNFRAkJMHgwMDAwMDA4MAogCi0jZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl8xMDAwVEZEX0NBUEFCTEUJMHgwMDAwMDIwMAotI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfMTAwMFRIRF9DQVBBQkxFCTB4MDAwMDA0MDAKLSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19QQVJUTkVSXzEwMFQ0X0NBUEFCTEUJCTB4MDAwMDA4MDAKLSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19QQVJUTkVSXzEwMFRYRkRfQ0FQQUJMRQkweDAwMDAxMDAwCi0jZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl8xMDBUWEhEX0NBUEFCTEUJMHgwMDAwMjAwMAotI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfMTBURkRfQ0FQQUJMRQkJMHgwMDAwNDAwMAotI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfMTBUSERfQ0FQQUJMRQkJMHgwMDAwODAwMAorCSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19QQVJUTkVSXzEwMDBURkRfQ0FQQUJMRQkweDAwMDAwMjAwCisJI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfMTAwMFRIRF9DQVBBQkxFCTB4MDAwMDA0MDAKKwkjZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl8xMDBUNF9DQVBBQkxFCQkweDAwMDAwODAwCisJI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfMTAwVFhGRF9DQVBBQkxFCTB4MDAwMDEwMDAKKwkjZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl8xMDBUWEhEX0NBUEFCTEUJMHgwMDAwMjAwMAorCSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19QQVJUTkVSXzEwVEZEX0NBUEFCTEUJCTB4MDAwMDQwMDAKKwkjZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl8xMFRIRF9DQVBBQkxFCQkweDAwMDA4MDAwCiAKLSNkZWZpbmUgTElOS19TVEFUVVNfVFhfRkxPV19DT05UUk9MX0ZMQUdfTUFTSwkJMHgwMDAxMDAwMAotI2RlZmluZSBMSU5LX1NUQVRVU19UWF9GTE9XX0NPTlRST0xfRU5BQkxFRAkJMHgwMDAxMDAwMAorCSNkZWZpbmUgTElOS19TVEFUVVNfVFhfRkxPV19DT05UUk9MX0ZMQUdfTUFTSwkJMHgwMDAxMDAwMAorCSNkZWZpbmUgTElOS19TVEFUVVNfVFhfRkxPV19DT05UUk9MX0VOQUJMRUQJCTB4MDAwMTAwMDAKIAotI2RlZmluZSBMSU5LX1NUQVRVU19SWF9GTE9XX0NPTlRST0xfRkxBR19NQVNLCQkweDAwMDIwMDAwCi0jZGVmaW5lIExJTktfU1RBVFVTX1JYX0ZMT1dfQ09OVFJPTF9FTkFCTEVECQkweDAwMDIwMDAwCisJI2RlZmluZSBMSU5LX1NUQVRVU19SWF9GTE9XX0NPTlRST0xfRkxBR19NQVNLCQkweDAwMDIwMDAwCisJI2RlZmluZSBMSU5LX1NUQVRVU19SWF9GTE9XX0NPTlRST0xfRU5BQkxFRAkJMHgwMDAyMDAwMAogCi0jZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl9GTE9XX0NPTlRST0xfTUFTSwkweDAwMEMwMDAwCi0jZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl9OT1RfUEFVU0VfQ0FQQUJMRQkoMDw8MTgpCi0jZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl9TWU1NRVRSSUNfUEFVU0UJKDE8PDE4KQotI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfQVNZTU1FVFJJQ19QQVVTRQkoMjw8MTgpCi0jZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl9CT1RIX1BBVVNFCQkoMzw8MTgpCisJI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfRkxPV19DT05UUk9MX01BU0sJMHgwMDBDMDAwMAorCSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19QQVJUTkVSX05PVF9QQVVTRV9DQVBBQkxFCSgwPDwxOCkKKwkjZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl9TWU1NRVRSSUNfUEFVU0UJKDE8PDE4KQorCSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19QQVJUTkVSX0FTWU1NRVRSSUNfUEFVU0UJKDI8PDE4KQorCSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19QQVJUTkVSX0JPVEhfUEFVU0UJCSgzPDwxOCkKIAotI2RlZmluZSBMSU5LX1NUQVRVU19TRVJERVNfTElOSyAJCQkweDAwMTAwMDAwCisJI2RlZmluZSBMSU5LX1NUQVRVU19TRVJERVNfTElOSwkJCQkweDAwMTAwMDAwCiAKLSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19QQVJUTkVSXzI1MDBYRkRfQ0FQQUJMRQkweDAwMjAwMDAwCi0jZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl8yNTAwWEhEX0NBUEFCTEUJMHgwMDQwMDAwMAotI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfMTBHWEZEX0NBUEFCTEUgCTB4MDA4MDAwMDAKLSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19QQVJUTkVSXzEyR1hGRF9DQVBBQkxFIAkweDAxMDAwMDAwCi0jZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl8xMl81R1hGRF9DQVBBQkxFCTB4MDIwMDAwMDAKLSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19QQVJUTkVSXzEzR1hGRF9DQVBBQkxFIAkweDA0MDAwMDAwCi0jZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl8xNUdYRkRfQ0FQQUJMRSAJMHgwODAwMDAwMAotI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfMTZHWEZEX0NBUEFCTEUgCTB4MTAwMDAwMDAKKwkjZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl8yNTAwWEZEX0NBUEFCTEUJMHgwMDIwMDAwMAorCSNkZWZpbmUgTElOS19TVEFUVVNfTElOS19QQVJUTkVSXzI1MDBYSERfQ0FQQUJMRQkweDAwNDAwMDAwCisJI2RlZmluZSBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfMTBHWEZEX0NBUEFCTEUJCTB4MDA4MDAwMDAKKwkjZGVmaW5lIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl8yMEdYRkRfQ0FQQUJMRQkJMHgxMDAwMDAwMAorCisJI2RlZmluZSBMSU5LX1NUQVRVU19QRkNfRU5BQkxFRAkJCQkweDIwMDAwMDAwCiAKIAl1MzIgcG9ydF9zdHg7CiAKQEAgLTg4NywxMzggKzEyMTcsMTU5IEBACiBzdHJ1Y3QgZHJ2X2Z1bmNfbWIgewogCiAJdTMyIGRydl9tYl9oZWFkZXI7Ci0jZGVmaW5lIERSVl9NU0dfQ09ERV9NQVNLCQkJCTB4ZmZmZjAwMDAKLSNkZWZpbmUgRFJWX01TR19DT0RFX0xPQURfUkVRCQkJCTB4MTAwMDAwMDAKLSNkZWZpbmUgRFJWX01TR19DT0RFX0xPQURfRE9ORQkJCQkweDExMDAwMDAwCi0jZGVmaW5lIERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dPTF9FTgkJCTB4MjAwMDAwMDAKLSNkZWZpbmUgRFJWX01TR19DT0RFX1VOTE9BRF9SRVFfV09MX0RJUyAJCTB4MjAwMTAwMDAKLSNkZWZpbmUgRFJWX01TR19DT0RFX1VOTE9BRF9SRVFfV09MX01DUCAJCTB4MjAwMjAwMDAKLSNkZWZpbmUgRFJWX01TR19DT0RFX1VOTE9BRF9ET05FCQkJMHgyMTAwMDAwMAotI2RlZmluZSBEUlZfTVNHX0NPREVfRENDX09LCQkJCTB4MzAwMDAwMDAKLSNkZWZpbmUgRFJWX01TR19DT0RFX0RDQ19GQUlMVVJFCQkJMHgzMTAwMDAwMAotI2RlZmluZSBEUlZfTVNHX0NPREVfRElBR19FTlRFUl9SRVEJCQkweDUwMDAwMDAwCi0jZGVmaW5lIERSVl9NU0dfQ09ERV9ESUFHX0VYSVRfUkVRCQkJMHg2MDAwMDAwMAotI2RlZmluZSBEUlZfTVNHX0NPREVfVkFMSURBVEVfS0VZCQkJMHg3MDAwMDAwMAotI2RlZmluZSBEUlZfTVNHX0NPREVfR0VUX0NVUlJfS0VZCQkJMHg4MDAwMDAwMAotI2RlZmluZSBEUlZfTVNHX0NPREVfR0VUX1VQR1JBREVfS0VZCQkJMHg4MTAwMDAwMAotI2RlZmluZSBEUlZfTVNHX0NPREVfR0VUX01BTlVGX0tFWQkJCTB4ODIwMDAwMDAKLSNkZWZpbmUgRFJWX01TR19DT0RFX0xPQURfTDJCX1BSQU0JCQkweDkwMDAwMDAwCisJI2RlZmluZSBEUlZfTVNHX0NPREVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorCSNkZWZpbmUgRFJWX01TR19DT0RFX0xPQURfUkVRICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKwkjZGVmaW5lIERSVl9NU0dfQ09ERV9MT0FEX0RPTkUgICAgICAgICAgICAgICAgICAweDExMDAwMDAwCisJI2RlZmluZSBEUlZfTVNHX0NPREVfVU5MT0FEX1JFUV9XT0xfRU4gICAgICAgICAgMHgyMDAwMDAwMAorCSNkZWZpbmUgRFJWX01TR19DT0RFX1VOTE9BRF9SRVFfV09MX0RJUyAgICAgICAgIDB4MjAwMTAwMDAKKwkjZGVmaW5lIERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dPTF9NQ1AgICAgICAgICAweDIwMDIwMDAwCisJI2RlZmluZSBEUlZfTVNHX0NPREVfVU5MT0FEX0RPTkUgICAgICAgICAgICAgICAgMHgyMTAwMDAwMAorCSNkZWZpbmUgRFJWX01TR19DT0RFX0RDQ19PSyAgICAgICAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKKwkjZGVmaW5lIERSVl9NU0dfQ09ERV9EQ0NfRkFJTFVSRSAgICAgICAgICAgICAgICAweDMxMDAwMDAwCisJI2RlZmluZSBEUlZfTVNHX0NPREVfRElBR19FTlRFUl9SRVEgICAgICAgICAgICAgMHg1MDAwMDAwMAorCSNkZWZpbmUgRFJWX01TR19DT0RFX0RJQUdfRVhJVF9SRVEgICAgICAgICAgICAgIDB4NjAwMDAwMDAKKwkjZGVmaW5lIERSVl9NU0dfQ09ERV9WQUxJREFURV9LRVkgICAgICAgICAgICAgICAweDcwMDAwMDAwCisJI2RlZmluZSBEUlZfTVNHX0NPREVfR0VUX0NVUlJfS0VZICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCSNkZWZpbmUgRFJWX01TR19DT0RFX0dFVF9VUEdSQURFX0tFWSAgICAgICAgICAgIDB4ODEwMDAwMDAKKwkjZGVmaW5lIERSVl9NU0dfQ09ERV9HRVRfTUFOVUZfS0VZICAgICAgICAgICAgICAweDgyMDAwMDAwCisJI2RlZmluZSBEUlZfTVNHX0NPREVfTE9BRF9MMkJfUFJBTSAgICAgICAgICAgICAgMHg5MDAwMDAwMAogCS8qCi0JICogVGhlIG9wdGljIG1vZHVsZSB2ZXJpZmljYXRpb24gY29tbWFuZHMgcmVxdWlyZSBib290Y29kZQotCSAqIHY1LjAuNiBvciBsYXRlcgorCSAqIFRoZSBvcHRpYyBtb2R1bGUgdmVyaWZpY2F0aW9uIGNvbW1hbmQgcmVxdWlyZXMgYm9vdGNvZGUKKwkgKiB2NS4wLjYgb3IgbGF0ZXIsIHRlIHNwZWNpZmljIG9wdGljIG1vZHVsZSB2ZXJpZmljYXRpb24gY29tbWFuZAorCSAqIHJlcXVpcmVzIGJvb3Rjb2RlIHY1LjIuMTIgb3IgbGF0ZXIKIAkgKi8KLSNkZWZpbmUgRFJWX01TR19DT0RFX1ZSRllfRklSU1RfUEhZX09QVF9NREwJMHhhMDAwMDAwMAotI2RlZmluZSBSRVFfQkNfVkVSXzRfVlJGWV9GSVJTVF9QSFlfT1BUX01ETAkweDAwMDUwMDA2Ci0JLyoKLQkgKiBUaGUgc3BlY2lmaWMgb3B0aWMgbW9kdWxlIHZlcmlmaWNhdGlvbiBjb21tYW5kIHJlcXVpcmVzIGJvb3Rjb2RlCi0JICogdjUuMi4xMiBvciBsYXRlcgotCSAqLwotI2RlZmluZSBEUlZfTVNHX0NPREVfVlJGWV9TUEVDSUZJQ19QSFlfT1BUX01ETAkgICAgMHhhMTAwMDAwMAotI2RlZmluZSBSRVFfQkNfVkVSXzRfVlJGWV9TUEVDSUZJQ19QSFlfT1BUX01ETAkgICAgMHgwMDA1MDIzNAorCSNkZWZpbmUgRFJWX01TR19DT0RFX1ZSRllfRklSU1RfUEhZX09QVF9NREwgICAgIDB4YTAwMDAwMDAKKwkjZGVmaW5lIFJFUV9CQ19WRVJfNF9WUkZZX0ZJUlNUX1BIWV9PUFRfTURMICAgICAweDAwMDUwMDA2CisJI2RlZmluZSBEUlZfTVNHX0NPREVfVlJGWV9TUEVDSUZJQ19QSFlfT1BUX01ETCAgMHhhMTAwMDAwMAorCSNkZWZpbmUgUkVRX0JDX1ZFUl80X1ZSRllfU1BFQ0lGSUNfUEhZX09QVF9NREwgIDB4MDAwNTAyMzQKKwkjZGVmaW5lIFJFUV9CQ19WRVJfNF9TRlBfVFhfRElTQUJMRV9TVVBQT1JURUQgICAweDAwMDcwMDE0CiAKLSNkZWZpbmUgRFJWX01TR19DT0RFX0RDQlhfQURNSU5fUE1GX01TRwkJCTB4YjAwMDAwMDAKLSNkZWZpbmUgRFJWX01TR19DT0RFX0RDQlhfUE1GX0RSVl9PSwkJCTB4YjIwMDAwMDAKLSNkZWZpbmUgRFJWX01TR19DT0RFX1NFVF9NRl9CVwkJCQkweGUwMDAwMDAwCi0jZGVmaW5lIFJFUV9CQ19WRVJfNF9TRVRfTUZfQlcJCQkJMHgwMDA2MDIwMgotI2RlZmluZSBEUlZfTVNHX0NPREVfU0VUX01GX0JXX0FDSwkJCTB4ZTEwMDAwMDAKLSNkZWZpbmUgQklPU19NU0dfQ09ERV9MSUNfQ0hBTExFTkdFCQkJMHhmZjAxMDAwMAotI2RlZmluZSBCSU9TX01TR19DT0RFX0xJQ19SRVNQT05TRQkJCTB4ZmYwMjAwMDAKLSNkZWZpbmUgQklPU19NU0dfQ09ERV9WSVJUX01BQ19QUklNCQkJMHhmZjAzMDAwMAotI2RlZmluZSBCSU9TX01TR19DT0RFX1ZJUlRfTUFDX0lTQ1NJCQkJMHhmZjA0MDAwMAorCSNkZWZpbmUgRFJWX01TR19DT0RFX0RDQlhfQURNSU5fUE1GX01TRyAgICAgICAgIDB4YjAwMDAwMDAKKwkjZGVmaW5lIERSVl9NU0dfQ09ERV9EQ0JYX1BNRl9EUlZfT0sgICAgICAgICAgICAweGIyMDAwMDAwCiAKLSNkZWZpbmUgRFJWX01TR19TRVFfTlVNQkVSX01BU0sgCQkJMHgwMDAwZmZmZgorCSNkZWZpbmUgRFJWX01TR19DT0RFX1ZGX0RJU0FCTEVEX0RPTkUgICAgICAgICAgIDB4YzAwMDAwMDAKKworCSNkZWZpbmUgRFJWX01TR19DT0RFX1NFVF9NRl9CVyAgICAgICAgICAgICAgICAgIDB4ZTAwMDAwMDAKKwkjZGVmaW5lIFJFUV9CQ19WRVJfNF9TRVRfTUZfQlcgICAgICAgICAgICAgICAgICAweDAwMDYwMjAyCisJI2RlZmluZSBEUlZfTVNHX0NPREVfU0VUX01GX0JXX0FDSyAgICAgICAgICAgICAgMHhlMTAwMDAwMAorCisJI2RlZmluZSBEUlZfTVNHX0NPREVfTElOS19TVEFUVVNfQ0hBTkdFRCAgICAgICAgMHgwMTAwMDAwMAorCisJI2RlZmluZSBCSU9TX01TR19DT0RFX0xJQ19DSEFMTEVOR0UgICAgICAgICAgICAgMHhmZjAxMDAwMAorCSNkZWZpbmUgQklPU19NU0dfQ09ERV9MSUNfUkVTUE9OU0UgICAgICAgICAgICAgIDB4ZmYwMjAwMDAKKwkjZGVmaW5lIEJJT1NfTVNHX0NPREVfVklSVF9NQUNfUFJJTSAgICAgICAgICAgICAweGZmMDMwMDAwCisJI2RlZmluZSBCSU9TX01TR19DT0RFX1ZJUlRfTUFDX0lTQ1NJICAgICAgICAgICAgMHhmZjA0MDAwMAorCisJI2RlZmluZSBEUlZfTVNHX1NFUV9OVU1CRVJfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgogCiAJdTMyIGRydl9tYl9wYXJhbTsKKwkjZGVmaW5lIERSVl9NU0dfQ09ERV9TRVRfTUZfQldfTUlOX01BU0sgICAgICAgICAweDAwZmYwMDAwCisJI2RlZmluZSBEUlZfTVNHX0NPREVfU0VUX01GX0JXX01BWF9NQVNLICAgICAgICAgMHhmZjAwMDAwMAogCiAJdTMyIGZ3X21iX2hlYWRlcjsKLSNkZWZpbmUgRldfTVNHX0NPREVfTUFTSwkJCQkweGZmZmYwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0RSVl9MT0FEX0NPTU1PTgkJCTB4MTAxMDAwMDAKLSNkZWZpbmUgRldfTVNHX0NPREVfRFJWX0xPQURfUE9SVAkJCTB4MTAxMTAwMDAKLSNkZWZpbmUgRldfTVNHX0NPREVfRFJWX0xPQURfRlVOQ1RJT04JCQkweDEwMTIwMDAwCi0JLyogTG9hZCBjb21tb24gY2hpcCBpcyBzdXBwb3J0ZWQgZnJvbSBiYyA2LjAuMAkqLwotI2RlZmluZSBSRVFfQkNfVkVSXzRfRFJWX0xPQURfQ09NTU9OX0NISVAJMHgwMDA2MDAwMAotI2RlZmluZSBGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT05fQ0hJUAkweDEwMTMwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0RSVl9MT0FEX1JFRlVTRUQJCQkweDEwMjAwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0RSVl9MT0FEX0RPTkUJCQkweDExMTAwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0RSVl9VTkxPQURfQ09NTU9OCQkJMHgyMDEwMDAwMAotI2RlZmluZSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX1BPUlQJCQkweDIwMTEwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0RSVl9VTkxPQURfRlVOQ1RJT04gCQkweDIwMTIwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0RSVl9VTkxPQURfRE9ORQkJCTB4MjExMDAwMDAKLSNkZWZpbmUgRldfTVNHX0NPREVfRENDX0RPTkUJCQkJMHgzMDEwMDAwMAotI2RlZmluZSBGV19NU0dfQ09ERV9ESUFHX0VOVEVSX0RPTkUJCQkweDUwMTAwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0RJQUdfUkVGVVNFIAkJCTB4NTAyMDAwMDAKLSNkZWZpbmUgRldfTVNHX0NPREVfRElBR19FWElUX0RPTkUJCQkweDYwMTAwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX1ZBTElEQVRFX0tFWV9TVUNDRVNTCQkweDcwMTAwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX1ZBTElEQVRFX0tFWV9GQUlMVVJFCQkweDcwMjAwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0dFVF9LRVlfRE9ORQkJCTB4ODAxMDAwMDAKLSNkZWZpbmUgRldfTVNHX0NPREVfTk9fS0VZCQkJCTB4ODBmMDAwMDAKLSNkZWZpbmUgRldfTVNHX0NPREVfTElDX0lORk9fTk9UX1JFQURZCQkJMHg4MGY4MDAwMAotI2RlZmluZSBGV19NU0dfQ09ERV9MMkJfUFJBTV9MT0FERUQJCQkweDkwMTAwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0wyQl9QUkFNX1RfTE9BRF9GQUlMVVJFCQkweDkwMjEwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0wyQl9QUkFNX0NfTE9BRF9GQUlMVVJFCQkweDkwMjIwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0wyQl9QUkFNX1hfTE9BRF9GQUlMVVJFCQkweDkwMjMwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0wyQl9QUkFNX1VfTE9BRF9GQUlMVVJFCQkweDkwMjQwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX1ZSRllfT1BUX01ETF9TVUNDRVNTCQkweGEwMTAwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX1ZSRllfT1BUX01ETF9JTlZMRF9JTUcJCTB4YTAyMDAwMDAKLSNkZWZpbmUgRldfTVNHX0NPREVfVlJGWV9PUFRfTURMX1VOQVBQUk9WRUQJCTB4YTAzMDAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT04gICAgICAgICAgICAgMHgxMDEwMDAwMAorCSNkZWZpbmUgRldfTVNHX0NPREVfRFJWX0xPQURfUE9SVCAgICAgICAgICAgICAgIDB4MTAxMTAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX0RSVl9MT0FEX0ZVTkNUSU9OICAgICAgICAgICAweDEwMTIwMDAwCisJLyogTG9hZCBjb21tb24gY2hpcCBpcyBzdXBwb3J0ZWQgZnJvbSBiYyA2LjAuMCAgKi8KKwkjZGVmaW5lIFJFUV9CQ19WRVJfNF9EUlZfTE9BRF9DT01NT05fQ0hJUCAgICAgICAweDAwMDYwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT05fQ0hJUCAgICAgICAgMHgxMDEzMDAwMAogCi0jZGVmaW5lIEZXX01TR19DT0RFX0xJQ19DSEFMTEVOR0UJCQkweGZmMDEwMDAwCi0jZGVmaW5lIEZXX01TR19DT0RFX0xJQ19SRVNQT05TRQkJCTB4ZmYwMjAwMDAKLSNkZWZpbmUgRldfTVNHX0NPREVfVklSVF9NQUNfUFJJTQkJCTB4ZmYwMzAwMDAKLSNkZWZpbmUgRldfTVNHX0NPREVfVklSVF9NQUNfSVNDU0kJCQkweGZmMDQwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9EUlZfTE9BRF9SRUZVU0VEICAgICAgICAgICAgMHgxMDIwMDAwMAorCSNkZWZpbmUgRldfTVNHX0NPREVfRFJWX0xPQURfRE9ORSAgICAgICAgICAgICAgIDB4MTExMDAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX0RSVl9VTkxPQURfQ09NTU9OICAgICAgICAgICAweDIwMTAwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX1BPUlQgICAgICAgICAgICAgMHgyMDExMDAwMAorCSNkZWZpbmUgRldfTVNHX0NPREVfRFJWX1VOTE9BRF9GVU5DVElPTiAgICAgICAgIDB4MjAxMjAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX0RSVl9VTkxPQURfRE9ORSAgICAgICAgICAgICAweDIxMTAwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9EQ0NfRE9ORSAgICAgICAgICAgICAgICAgICAgMHgzMDEwMDAwMAorCSNkZWZpbmUgRldfTVNHX0NPREVfTExEUF9ET05FICAgICAgICAgICAgICAgICAgIDB4NDAxMDAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX0RJQUdfRU5URVJfRE9ORSAgICAgICAgICAgICAweDUwMTAwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9ESUFHX1JFRlVTRSAgICAgICAgICAgICAgICAgMHg1MDIwMDAwMAorCSNkZWZpbmUgRldfTVNHX0NPREVfRElBR19FWElUX0RPTkUgICAgICAgICAgICAgIDB4NjAxMDAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX1ZBTElEQVRFX0tFWV9TVUNDRVNTICAgICAgICAweDcwMTAwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9WQUxJREFURV9LRVlfRkFJTFVSRSAgICAgICAgMHg3MDIwMDAwMAorCSNkZWZpbmUgRldfTVNHX0NPREVfR0VUX0tFWV9ET05FICAgICAgICAgICAgICAgIDB4ODAxMDAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX05PX0tFWSAgICAgICAgICAgICAgICAgICAgICAweDgwZjAwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9MSUNfSU5GT19OT1RfUkVBRFkgICAgICAgICAgMHg4MGY4MDAwMAorCSNkZWZpbmUgRldfTVNHX0NPREVfTDJCX1BSQU1fTE9BREVEICAgICAgICAgICAgIDB4OTAxMDAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX0wyQl9QUkFNX1RfTE9BRF9GQUlMVVJFICAgICAweDkwMjEwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9MMkJfUFJBTV9DX0xPQURfRkFJTFVSRSAgICAgMHg5MDIyMDAwMAorCSNkZWZpbmUgRldfTVNHX0NPREVfTDJCX1BSQU1fWF9MT0FEX0ZBSUxVUkUgICAgIDB4OTAyMzAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX0wyQl9QUkFNX1VfTE9BRF9GQUlMVVJFICAgICAweDkwMjQwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9WUkZZX09QVF9NRExfU1VDQ0VTUyAgICAgICAgMHhhMDEwMDAwMAorCSNkZWZpbmUgRldfTVNHX0NPREVfVlJGWV9PUFRfTURMX0lOVkxEX0lNRyAgICAgIDB4YTAyMDAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX1ZSRllfT1BUX01ETF9VTkFQUFJPVkVEICAgICAweGEwMzAwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9WRl9ESVNBQkxFRF9ET05FICAgICAgICAgICAgMHhiMDAwMDAwMAogCi0jZGVmaW5lIEZXX01TR19TRVFfTlVNQkVSX01BU0sJCQkJMHgwMDAwZmZmZgorCSNkZWZpbmUgRldfTVNHX0NPREVfU0VUX01GX0JXX1NFTlQgICAgICAgICAgICAgIDB4ZTAwMDAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX1NFVF9NRl9CV19ET05FICAgICAgICAgICAgICAweGUxMDAwMDAwCisKKwkjZGVmaW5lIEZXX01TR19DT0RFX0xJTktfQ0hBTkdFRF9BQ0sgICAgICAgICAgICAweDAxMTAwMDAwCisKKwkjZGVmaW5lIEZXX01TR19DT0RFX0xJQ19DSEFMTEVOR0UgICAgICAgICAgICAgICAweGZmMDEwMDAwCisJI2RlZmluZSBGV19NU0dfQ09ERV9MSUNfUkVTUE9OU0UgICAgICAgICAgICAgICAgMHhmZjAyMDAwMAorCSNkZWZpbmUgRldfTVNHX0NPREVfVklSVF9NQUNfUFJJTSAgICAgICAgICAgICAgIDB4ZmYwMzAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX1ZJUlRfTUFDX0lTQ1NJICAgICAgICAgICAgICAweGZmMDQwMDAwCisKKwkjZGVmaW5lIEZXX01TR19TRVFfTlVNQkVSX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCiAKIAl1MzIgZndfbWJfcGFyYW07CiAKIAl1MzIgZHJ2X3B1bHNlX21iOwotI2RlZmluZSBEUlZfUFVMU0VfU0VRX01BU0sJCQkJMHgwMDAwN2ZmZgotI2RlZmluZSBEUlZfUFVMU0VfU1lTVEVNX1RJTUVfTUFTSwkJCTB4ZmZmZjAwMDAKLQkvKiBUaGUgc3lzdGVtIHRpbWUgaXMgaW4gdGhlIGZvcm1hdCBvZgotCSAqICh5ZWFyLTIwMDEpKjEyKjMyICsgbW9udGgqMzIgKyBkYXkuICovCi0jZGVmaW5lIERSVl9QVUxTRV9BTFdBWVNfQUxJVkUJCQkJMHgwMDAwODAwMAotCS8qIEluZGljYXRlIHRvIHRoZSBmaXJtd2FyZSBub3QgdG8gZ28gaW50byB0aGUKKwkjZGVmaW5lIERSVl9QVUxTRV9TRVFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDA3ZmZmCisJI2RlZmluZSBEUlZfUFVMU0VfU1lTVEVNX1RJTUVfTUFTSyAgICAgICAgICAgICAgMHhmZmZmMDAwMAorCS8qCisJICogVGhlIHN5c3RlbSB0aW1lIGlzIGluIHRoZSBmb3JtYXQgb2YKKwkgKiAoeWVhci0yMDAxKSoxMiozMiArIG1vbnRoKjMyICsgZGF5LgorCSAqLworCSNkZWZpbmUgRFJWX1BVTFNFX0FMV0FZU19BTElWRSAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKwkvKgorCSAqIEluZGljYXRlIHRvIHRoZSBmaXJtd2FyZSBub3QgdG8gZ28gaW50byB0aGUKIAkgKiBPUy1hYnNlbnQgd2hlbiBpdCBpcyBub3QgZ2V0dGluZyBkcml2ZXIgcHVsc2UuCi0JICogVGhpcyBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcgYXMgd2VsbCBmb3IgUFhFKE1CQSkuICovCisJICogVGhpcyBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcgYXMgd2VsbCBmb3IgUFhFKE1CQSkuCisJICovCiAKIAl1MzIgbWNwX3B1bHNlX21iOwotI2RlZmluZSBNQ1BfUFVMU0VfU0VRX01BU0sJCQkJMHgwMDAwN2ZmZgotI2RlZmluZSBNQ1BfUFVMU0VfQUxXQVlTX0FMSVZFCQkJCTB4MDAwMDgwMDAKKwkjZGVmaW5lIE1DUF9QVUxTRV9TRVFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDA3ZmZmCisJI2RlZmluZSBNQ1BfUFVMU0VfQUxXQVlTX0FMSVZFICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAogCS8qIEluZGljYXRlcyB0byB0aGUgZHJpdmVyIG5vdCB0byBhc3NlcnQgZHVlIHRvIGxhY2sKIAkgKiBvZiBNQ1AgcmVzcG9uc2UgKi8KLSNkZWZpbmUgTUNQX0VWRU5UX01BU0sJCQkJCTB4ZmZmZjAwMDAKLSNkZWZpbmUgTUNQX0VWRU5UX09USEVSX0RSSVZFUl9SRVNFVF9SRVEJCTB4MDAwMTAwMDAKKwkjZGVmaW5lIE1DUF9FVkVOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisJI2RlZmluZSBNQ1BfRVZFTlRfT1RIRVJfRFJJVkVSX1JFU0VUX1JFUSAgICAgICAgMHgwMDAxMDAwMAogCiAJdTMyIGlzY3NpX2Jvb3Rfc2lnbmF0dXJlOwogCXUzMiBpc2NzaV9ib290X2Jsb2NrX29mZnNldDsKIAogCXUzMiBkcnZfc3RhdHVzOwotI2RlZmluZSBEUlZfU1RBVFVTX1BNRgkJCQkJMHgwMDAwMDAwMQotI2RlZmluZSBEUlZfU1RBVFVTX1NFVF9NRl9CVwkJCQkweDAwMDAwMDA0CisJI2RlZmluZSBEUlZfU1RBVFVTX1BNRiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCSNkZWZpbmUgRFJWX1NUQVRVU19WRl9ESVNBQkxFRCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKwkjZGVmaW5lIERSVl9TVEFUVVNfU0VUX01GX0JXICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisJI2RlZmluZSBEUlZfU1RBVFVTX0xJTktfRVZFTlQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAogCi0jZGVmaW5lIERSVl9TVEFUVVNfRENDX0VWRU5UX01BU0sJCQkweDAwMDBmZjAwCi0jZGVmaW5lIERSVl9TVEFUVVNfRENDX0RJU0FCTEVfRU5BQkxFX1BGCQkweDAwMDAwMTAwCi0jZGVmaW5lIERSVl9TVEFUVVNfRENDX0JBTkRXSURUSF9BTExPQ0FUSU9OCQkweDAwMDAwMjAwCi0jZGVmaW5lIERSVl9TVEFUVVNfRENDX0NIQU5HRV9NQUNfQUREUkVTUwkJMHgwMDAwMDQwMAotI2RlZmluZSBEUlZfU1RBVFVTX0RDQ19SRVNFUlZFRDEJCQkweDAwMDAwODAwCi0jZGVmaW5lIERSVl9TVEFUVVNfRENDX1NFVF9QUk9UT0NPTAkJCTB4MDAwMDEwMDAKLSNkZWZpbmUgRFJWX1NUQVRVU19EQ0NfU0VUX1BSSU9SSVRZCQkJMHgwMDAwMjAwMAotI2RlZmluZSBEUlZfU1RBVFVTX0RDQlhfRVZFTlRfTUFTSwkJCTB4MDAwZjAwMDAKLSNkZWZpbmUgRFJWX1NUQVRVU19EQ0JYX05FR09USUFUSU9OX1JFU1VMVFMJCTB4MDAwMTAwMDAKKwkjZGVmaW5lIERSVl9TVEFUVVNfRENDX0VWRU5UX01BU0sgICAgICAgICAgICAgICAweDAwMDBmZjAwCisJI2RlZmluZSBEUlZfU1RBVFVTX0RDQ19ESVNBQkxFX0VOQUJMRV9QRiAgICAgICAgMHgwMDAwMDEwMAorCSNkZWZpbmUgRFJWX1NUQVRVU19EQ0NfQkFORFdJRFRIX0FMTE9DQVRJT04gICAgIDB4MDAwMDAyMDAKKwkjZGVmaW5lIERSVl9TVEFUVVNfRENDX0NIQU5HRV9NQUNfQUREUkVTUyAgICAgICAweDAwMDAwNDAwCisJI2RlZmluZSBEUlZfU1RBVFVTX0RDQ19SRVNFUlZFRDEgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorCSNkZWZpbmUgRFJWX1NUQVRVU19EQ0NfU0VUX1BST1RPQ09MICAgICAgICAgICAgIDB4MDAwMDEwMDAKKwkjZGVmaW5lIERSVl9TVEFUVVNfRENDX1NFVF9QUklPUklUWSAgICAgICAgICAgICAweDAwMDAyMDAwCisKKwkjZGVmaW5lIERSVl9TVEFUVVNfRENCWF9FVkVOVF9NQVNLICAgICAgICAgICAgICAweDAwMGYwMDAwCisJI2RlZmluZSBEUlZfU1RBVFVTX0RDQlhfTkVHT1RJQVRJT05fUkVTVUxUUyAgICAgMHgwMDAxMDAwMAogCiAJdTMyIHZpcnRfbWFjX3VwcGVyOwotI2RlZmluZSBWSVJUX01BQ19TSUdOX01BU0sJCQkJMHhmZmZmMDAwMAotI2RlZmluZSBWSVJUX01BQ19TSUdOQVRVUkUJCQkJMHg1NjRkMDAwMAorCSNkZWZpbmUgVklSVF9NQUNfU0lHTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKwkjZGVmaW5lIFZJUlRfTUFDX1NJR05BVFVSRSAgICAgICAgICAgICAgICAgICAgICAweDU2NGQwMDAwCiAJdTMyIHZpcnRfbWFjX2xvd2VyOwogCiB9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNYW5hZ2VtZW50IGZpcm13YXJlIHN0YXRlCQkJCQkJICAgICoKKyAqIE1hbmFnZW1lbnQgZmlybXdhcmUgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEFsbG9jYXRlIDQ0MCBieXRlcyBmb3IgbWFuYWdlbWVudCBmaXJtd2FyZSAqLwotI2RlZmluZSBNR01URldfU1RBVEVfV09SRF9TSVpFCQkJCSAgICAxMTAKKyNkZWZpbmUgTUdNVEZXX1NUQVRFX1dPUkRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwCiAKIHN0cnVjdCBtZ210Zndfc3RhdGUgewogCXUzMiBvcGFxdWVbTUdNVEZXX1NUQVRFX1dPUkRfU0laRV07CkBAIC0xMDI2LDI1ICsxMzc3LDI1IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE11bHRpLUZ1bmN0aW9uIGNvbmZpZ3VyYXRpb24gCQkJCQkgICAgKgorICogTXVsdGktRnVuY3Rpb24gY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IHNoYXJlZF9tZl9jZmcgewogCiAJdTMyIGNscF9tYjsKLSNkZWZpbmUgU0hBUkVEX01GX0NMUF9TRVRfREVGQVVMVAkJICAgIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFNIQVJFRF9NRl9DTFBfU0VUX0RFRkFVTFQgICAgICAgICAgICAgICAweDAwMDAwMDAwCiAJLyogc2V0IGJ5IENMUCAqLwotI2RlZmluZSBTSEFSRURfTUZfQ0xQX0VYSVQJCQkgICAgMHgwMDAwMDAwMQorCSNkZWZpbmUgU0hBUkVEX01GX0NMUF9FWElUICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKIAkvKiBzZXQgYnkgTUNQICovCi0jZGVmaW5lIFNIQVJFRF9NRl9DTFBfRVhJVF9ET05FIAkJICAgIDB4MDAwMTAwMDAKKwkjZGVmaW5lIFNIQVJFRF9NRl9DTFBfRVhJVF9ET05FICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCiAKIH07CiAKIHN0cnVjdCBwb3J0X21mX2NmZyB7CiAKLQl1MzIgZHluYW1pY19jZmc7CS8qIGRldmljZSBjb250cm9sIGNoYW5uZWwgKi8KLSNkZWZpbmUgUE9SVF9NRl9DRkdfRTFIT1ZfVEFHX01BU0sJCSAgICAweDAwMDBmZmZmCi0jZGVmaW5lIFBPUlRfTUZfQ0ZHX0UxSE9WX1RBR19TSElGVAkJICAgIDAKLSNkZWZpbmUgUE9SVF9NRl9DRkdfRTFIT1ZfVEFHX0RFRkFVTFQJCSAgICBQT1JUX01GX0NGR19FMUhPVl9UQUdfTUFTSworCXUzMiBkeW5hbWljX2NmZzsgICAgLyogZGV2aWNlIGNvbnRyb2wgY2hhbm5lbCAqLworCSNkZWZpbmUgUE9SVF9NRl9DRkdfRTFIT1ZfVEFHX01BU0sgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKwkjZGVmaW5lIFBPUlRfTUZfQ0ZHX0UxSE9WX1RBR19TSElGVCAgICAgICAgICAgICAwCisJI2RlZmluZSBQT1JUX01GX0NGR19FMUhPVl9UQUdfREVGQVVMVCAgICAgICAgIFBPUlRfTUZfQ0ZHX0UxSE9WX1RBR19NQVNLCiAKIAl1MzIgcmVzZXJ2ZWRbM107CiAKQEAgLTEwNTUsNTcgKzE0MDYsNTggQEAKIAl1MzIgY29uZmlnOwogCS8qIEUvUi9JL0QgKi8KIAkvKiBmdW5jdGlvbiAwIG9mIGVhY2ggcG9ydCBjYW5ub3QgYmUgaGlkZGVuICovCi0jZGVmaW5lIEZVTkNfTUZfQ0ZHX0ZVTkNfSElERQkJCSAgICAweDAwMDAwMDAxCisJI2RlZmluZSBGVU5DX01GX0NGR19GVU5DX0hJREUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQogCi0jZGVmaW5lIEZVTkNfTUZfQ0ZHX1BST1RPQ09MX01BU0sJCSAgICAweDAwMDAwMDA3Ci0jZGVmaW5lIEZVTkNfTUZfQ0ZHX1BST1RPQ09MX0VUSEVSTkVUCQkgICAgMHgwMDAwMDAwMgotI2RlZmluZSBGVU5DX01GX0NGR19QUk9UT0NPTF9FVEhFUk5FVF9XSVRIX1JETUEgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRlVOQ19NRl9DRkdfUFJPVE9DT0xfSVNDU0kJCSAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIEZVTkNfTUZfQ0ZHX1BST1RPQ09MX0RFRkFVTFRcCi0JRlVOQ19NRl9DRkdfUFJPVE9DT0xfRVRIRVJORVRfV0lUSF9SRE1BCisJI2RlZmluZSBGVU5DX01GX0NGR19QUk9UT0NPTF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorCSNkZWZpbmUgRlVOQ19NRl9DRkdfUFJPVE9DT0xfRkNPRSAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKwkjZGVmaW5lIEZVTkNfTUZfQ0ZHX1BST1RPQ09MX0VUSEVSTkVUICAgICAgICAgICAweDAwMDAwMDAyCisJI2RlZmluZSBGVU5DX01GX0NGR19QUk9UT0NPTF9FVEhFUk5FVF9XSVRIX1JETUEgMHgwMDAwMDAwNAorCSNkZWZpbmUgRlVOQ19NRl9DRkdfUFJPVE9DT0xfSVNDU0kgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKwkjZGVmaW5lIEZVTkNfTUZfQ0ZHX1BST1RPQ09MX0RFRkFVTFQgXAorCQkJCUZVTkNfTUZfQ0ZHX1BST1RPQ09MX0VUSEVSTkVUX1dJVEhfUkRNQQogCi0jZGVmaW5lIEZVTkNfTUZfQ0ZHX0ZVTkNfRElTQUJMRUQJCSAgICAweDAwMDAwMDA4CisJI2RlZmluZSBGVU5DX01GX0NGR19GVU5DX0RJU0FCTEVEICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorCSNkZWZpbmUgRlVOQ19NRl9DRkdfRlVOQ19ERUxFVEVEICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKIAogCS8qIFBSSSAqLwogCS8qIDAgLSBsb3cgcHJpb3JpdHksIDMgLSBoaWdoIHByaW9yaXR5ICovCi0jZGVmaW5lIEZVTkNfTUZfQ0ZHX1RSQU5TTUlUX1BSSU9SSVRZX01BU0sJICAgIDB4MDAwMDAzMDAKLSNkZWZpbmUgRlVOQ19NRl9DRkdfVFJBTlNNSVRfUFJJT1JJVFlfU0hJRlQJICAgIDgKLSNkZWZpbmUgRlVOQ19NRl9DRkdfVFJBTlNNSVRfUFJJT1JJVFlfREVGQVVMVAkgICAgMHgwMDAwMDAwMAorCSNkZWZpbmUgRlVOQ19NRl9DRkdfVFJBTlNNSVRfUFJJT1JJVFlfTUFTSyAgICAgIDB4MDAwMDAzMDAKKwkjZGVmaW5lIEZVTkNfTUZfQ0ZHX1RSQU5TTUlUX1BSSU9SSVRZX1NISUZUICAgICA4CisJI2RlZmluZSBGVU5DX01GX0NGR19UUkFOU01JVF9QUklPUklUWV9ERUZBVUxUICAgMHgwMDAwMDAwMAogCiAJLyogTUlOQlcsIE1BWEJXICovCiAJLyogdmFsdWUgcmFuZ2UgLSAwLi4xMDAsIGluY3JlbWVudHMgaW4gMTAwTWJwcyAqLwotI2RlZmluZSBGVU5DX01GX0NGR19NSU5fQldfTUFTSyAJCSAgICAweDAwZmYwMDAwCi0jZGVmaW5lIEZVTkNfTUZfQ0ZHX01JTl9CV19TSElGVAkJICAgIDE2Ci0jZGVmaW5lIEZVTkNfTUZfQ0ZHX01JTl9CV19ERUZBVUxUCQkgICAgMHgwMDAwMDAwMAotI2RlZmluZSBGVU5DX01GX0NGR19NQVhfQldfTUFTSyAJCSAgICAweGZmMDAwMDAwCi0jZGVmaW5lIEZVTkNfTUZfQ0ZHX01BWF9CV19TSElGVAkJICAgIDI0Ci0jZGVmaW5lIEZVTkNfTUZfQ0ZHX01BWF9CV19ERUZBVUxUCQkgICAgMHg2NDAwMDAwMAorCSNkZWZpbmUgRlVOQ19NRl9DRkdfTUlOX0JXX01BU0sgICAgICAgICAgICAgICAgIDB4MDBmZjAwMDAKKwkjZGVmaW5lIEZVTkNfTUZfQ0ZHX01JTl9CV19TSElGVCAgICAgICAgICAgICAgICAxNgorCSNkZWZpbmUgRlVOQ19NRl9DRkdfTUlOX0JXX0RFRkFVTFQgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKwkjZGVmaW5lIEZVTkNfTUZfQ0ZHX01BWF9CV19NQVNLICAgICAgICAgICAgICAgICAweGZmMDAwMDAwCisJI2RlZmluZSBGVU5DX01GX0NGR19NQVhfQldfU0hJRlQgICAgICAgICAgICAgICAgMjQKKwkjZGVmaW5lIEZVTkNfTUZfQ0ZHX01BWF9CV19ERUZBVUxUICAgICAgICAgICAgICAweDY0MDAwMDAwCiAKLQl1MzIgbWFjX3VwcGVyOwkJLyogTUFDICovCi0jZGVmaW5lIEZVTkNfTUZfQ0ZHX1VQUEVSTUFDX01BU0sJCSAgICAweDAwMDBmZmZmCi0jZGVmaW5lIEZVTkNfTUZfQ0ZHX1VQUEVSTUFDX1NISUZUCQkgICAgMAotI2RlZmluZSBGVU5DX01GX0NGR19VUFBFUk1BQ19ERUZBVUxUCQkgICAgRlVOQ19NRl9DRkdfVVBQRVJNQUNfTUFTSworCXUzMiBtYWNfdXBwZXI7CSAgICAvKiBNQUMgKi8KKwkjZGVmaW5lIEZVTkNfTUZfQ0ZHX1VQUEVSTUFDX01BU0sgICAgICAgICAgICAgICAweDAwMDBmZmZmCisJI2RlZmluZSBGVU5DX01GX0NGR19VUFBFUk1BQ19TSElGVCAgICAgICAgICAgICAgMAorCSNkZWZpbmUgRlVOQ19NRl9DRkdfVVBQRVJNQUNfREVGQVVMVCAgICAgICAgICAgRlVOQ19NRl9DRkdfVVBQRVJNQUNfTUFTSwogCXUzMiBtYWNfbG93ZXI7Ci0jZGVmaW5lIEZVTkNfTUZfQ0ZHX0xPV0VSTUFDX0RFRkFVTFQJCSAgICAweGZmZmZmZmZmCisJI2RlZmluZSBGVU5DX01GX0NGR19MT1dFUk1BQ19ERUZBVUxUICAgICAgICAgICAgMHhmZmZmZmZmZgogCiAJdTMyIGUxaG92X3RhZzsJLyogVk5JICovCi0jZGVmaW5lIEZVTkNfTUZfQ0ZHX0UxSE9WX1RBR19NQVNLCQkgICAgMHgwMDAwZmZmZgotI2RlZmluZSBGVU5DX01GX0NGR19FMUhPVl9UQUdfU0hJRlQJCSAgICAwCi0jZGVmaW5lIEZVTkNfTUZfQ0ZHX0UxSE9WX1RBR19ERUZBVUxUCQkgICAgRlVOQ19NRl9DRkdfRTFIT1ZfVEFHX01BU0sKKwkjZGVmaW5lIEZVTkNfTUZfQ0ZHX0UxSE9WX1RBR19NQVNLICAgICAgICAgICAgICAweDAwMDBmZmZmCisJI2RlZmluZSBGVU5DX01GX0NGR19FMUhPVl9UQUdfU0hJRlQgICAgICAgICAgICAgMAorCSNkZWZpbmUgRlVOQ19NRl9DRkdfRTFIT1ZfVEFHX0RFRkFVTFQgICAgICAgICBGVU5DX01GX0NGR19FMUhPVl9UQUdfTUFTSwogCiAJdTMyIHJlc2VydmVkWzJdOwotCiB9OwogCiAvKiBUaGlzIHN0cnVjdHVyZSBpcyBub3QgYXBwbGljYWJsZSBhbmQgc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZCBvbiA1NzcxMSAqLwogc3RydWN0IGZ1bmNfZXh0X2NmZyB7CiAJdTMyIGZ1bmNfY2ZnOwotI2RlZmluZSBNQUNQX0ZVTkNfQ0ZHX0ZMQUdTX01BU0sJCQkgICAgICAweDAwMDAwMEZGCi0jZGVmaW5lIE1BQ1BfRlVOQ19DRkdfRkxBR1NfU0hJRlQJCQkgICAgICAwCi0jZGVmaW5lIE1BQ1BfRlVOQ19DRkdfRkxBR1NfRU5BQkxFRAkJCSAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgTUFDUF9GVU5DX0NGR19GTEFHU19FVEhFUk5FVAkJCSAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgTUFDUF9GVU5DX0NGR19GTEFHU19JU0NTSV9PRkZMT0FECQkgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIE1BQ1BfRlVOQ19DRkdfRkxBR1NfRkNPRV9PRkZMT0FECQkgICAgICAweDAwMDAwMDA4CisJI2RlZmluZSBNQUNQX0ZVTkNfQ0ZHX0ZMQUdTX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgorCSNkZWZpbmUgTUFDUF9GVU5DX0NGR19GTEFHU19TSElGVCAgICAgICAgICAgICAgIDAKKwkjZGVmaW5lIE1BQ1BfRlVOQ19DRkdfRkxBR1NfRU5BQkxFRCAgICAgICAgICAgICAweDAwMDAwMDAxCisJI2RlZmluZSBNQUNQX0ZVTkNfQ0ZHX0ZMQUdTX0VUSEVSTkVUICAgICAgICAgICAgMHgwMDAwMDAwMgorCSNkZWZpbmUgTUFDUF9GVU5DX0NGR19GTEFHU19JU0NTSV9PRkZMT0FEICAgICAgIDB4MDAwMDAwMDQKKwkjZGVmaW5lIE1BQ1BfRlVOQ19DRkdfRkxBR1NfRkNPRV9PRkZMT0FEICAgICAgICAweDAwMDAwMDA4CiAKIAl1MzIgaXNjc2lfbWFjX2FkZHJfdXBwZXI7CiAJdTMyIGlzY3NpX21hY19hZGRyX2xvd2VyOwpAQCAtMTEyMCw3MyArMTQ3Miw5OSBAQAogCXUzMiBmY29lX3d3bl9ub2RlX25hbWVfbG93ZXI7CiAKIAl1MzIgcHJlc2VydmVfZGF0YTsKLSNkZWZpbmUgTUZfRlVOQ19DRkdfUFJFU0VSVkVfTDJfTUFDCQkJICAgICAoMTw8MCkKLSNkZWZpbmUgTUZfRlVOQ19DRkdfUFJFU0VSVkVfSVNDU0lfTUFDCQkJICAgICAoMTw8MSkKLSNkZWZpbmUgTUZfRlVOQ19DRkdfUFJFU0VSVkVfRkNPRV9NQUMJCQkgICAgICgxPDwyKQotI2RlZmluZSBNRl9GVU5DX0NGR19QUkVTRVJWRV9GQ09FX1dXTl9QCQkJICAgICAoMTw8MykKLSNkZWZpbmUgTUZfRlVOQ19DRkdfUFJFU0VSVkVfRkNPRV9XV05fTgkJCSAgICAgKDE8PDQpCisJI2RlZmluZSBNRl9GVU5DX0NGR19QUkVTRVJWRV9MMl9NQUMgICAgICAgICAgICAgKDE8PDApCisJI2RlZmluZSBNRl9GVU5DX0NGR19QUkVTRVJWRV9JU0NTSV9NQUMgICAgICAgICAgKDE8PDEpCisJI2RlZmluZSBNRl9GVU5DX0NGR19QUkVTRVJWRV9GQ09FX01BQyAgICAgICAgICAgKDE8PDIpCisJI2RlZmluZSBNRl9GVU5DX0NGR19QUkVTRVJWRV9GQ09FX1dXTl9QICAgICAgICAgKDE8PDMpCisJI2RlZmluZSBNRl9GVU5DX0NGR19QUkVTRVJWRV9GQ09FX1dXTl9OICAgICAgICAgKDE8PDQpCisJI2RlZmluZSBNRl9GVU5DX0NGR19QUkVTRVJWRV9UWF9CVyAgICAgICAgICAgICAgKDE8PDUpCiB9OwogCiBzdHJ1Y3QgbWZfY2ZnIHsKIAotCXN0cnVjdCBzaGFyZWRfbWZfY2ZnCXNoYXJlZF9tZl9jb25maWc7Ci0Jc3RydWN0IHBvcnRfbWZfY2ZnCXBvcnRfbWZfY29uZmlnW1BPUlRfTUFYXTsKLQlzdHJ1Y3QgZnVuY19tZl9jZmcJZnVuY19tZl9jb25maWdbRTFIX0ZVTkNfTUFYXTsKLQotCXN0cnVjdCBmdW5jX2V4dF9jZmcgZnVuY19leHRfY29uZmlnW0UxSF9GVU5DX01BWF07Ci19OwotCisJc3RydWN0IHNoYXJlZF9tZl9jZmcgICAgc2hhcmVkX21mX2NvbmZpZzsgICAgICAgLyogMHg0ICovCisJc3RydWN0IHBvcnRfbWZfY2ZnICBwb3J0X21mX2NvbmZpZ1tQT1JUX01BWF07ICAgLyogMHgxMCAqIDIgPSAweDIwICovCisJLyogZm9yIGFsbCBjaGlwcywgdGhlcmUgYXJlIDggbWYgZnVuY3Rpb25zICovCisJc3RydWN0IGZ1bmNfbWZfY2ZnICBmdW5jX21mX2NvbmZpZ1tFMUhfRlVOQ19NQVhdOyAvKiAweDE4ICogOCA9IDB4YzAgKi8KKwkvKgorCSAqIEV4dGVuZGVkIGNvbmZpZ3VyYXRpb24gcGVyIGZ1bmN0aW9uICAtIHRoaXMgYXJyYXkgZG9lcyBub3QgZXhpc3QgYW5kCisJICogc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZCBvbiA1NzcxMQorCSAqLworCXN0cnVjdCBmdW5jX2V4dF9jZmcgZnVuY19leHRfY29uZmlnW0UxSF9GVU5DX01BWF07IC8qIDB4MjggKiA4ID0gMHgxNDAqLworfTsgLyogMHgyMjQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNoYXJlZCBNZW1vcnkgUmVnaW9uIAkJCQkJCSAgICAqCisgKiBTaGFyZWQgTWVtb3J5IFJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3Qgc2htZW1fcmVnaW9uIHsJCQkgICAgICAgLyogICBTaGFyZWRNZW0gT2Zmc2V0IChzaXplKSAqLworc3RydWN0IHNobWVtX3JlZ2lvbiB7CQkgICAgICAgLyogICBTaGFyZWRNZW0gT2Zmc2V0IChzaXplKSAqLwogCi0JdTMyCQkJdmFsaWRpdHlfbWFwW1BPUlRfTUFYXTsgIC8qIDB4MCAoNCoyID0gMHg4KSAqLwotI2RlZmluZSBTSFJfTUVNX0ZPUk1BVF9SRVZfSUQJCQkgICAgKCdBJzw8MjQpCi0jZGVmaW5lIFNIUl9NRU1fRk9STUFUX1JFVl9NQVNLIAkJICAgIDB4ZmYwMDAwMDAKKwl1MzIgICAgICAgICB2YWxpZGl0eV9tYXBbUE9SVF9NQVhdOyAgLyogMHgwICg0KjIgPSAweDgpICovCisJI2RlZmluZSBTSFJfTUVNX0ZPUk1BVF9SRVZfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ZmYwMDAwMDAKKwkjZGVmaW5lIFNIUl9NRU1fRk9STUFUX1JFVl9JRCAgICAgICAgICAgICAgICAgICAgICAgKCdBJzw8MjQpCiAJLyogdmFsaWRpdHkgYml0cyAqLwotI2RlZmluZSBTSFJfTUVNX1ZBTElESVRZX1BDSV9DRkcJCSAgICAweDAwMTAwMDAwCi0jZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfTUIJCQkgICAgMHgwMDIwMDAwMAotI2RlZmluZSBTSFJfTUVNX1ZBTElESVRZX0RFVl9JTkZPCQkgICAgMHgwMDQwMDAwMAotI2RlZmluZSBTSFJfTUVNX1ZBTElESVRZX1JFU0VSVkVECQkgICAgMHgwMDAwMDAwNworCSNkZWZpbmUgU0hSX01FTV9WQUxJRElUWV9QQ0lfQ0ZHICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisJI2RlZmluZSBTSFJfTUVNX1ZBTElESVRZX01CICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKwkjZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfREVWX0lORk8gICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorCSNkZWZpbmUgU0hSX01FTV9WQUxJRElUWV9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CiAJLyogT25lIGxpY2Vuc2luZyBiaXQgc2hvdWxkIGJlIHNldCAqLwotI2RlZmluZSBTSFJfTUVNX1ZBTElESVRZX0xJQ19LRVlfSU5fRUZGRUNUX01BU0sgICAgIDB4MDAwMDAwMzgKLSNkZWZpbmUgU0hSX01FTV9WQUxJRElUWV9MSUNfTUFOVUZfS0VZX0lOX0VGRkVDVCAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfTElDX1VQR1JBREVfS0VZX0lOX0VGRkVDVCAgMHgwMDAwMDAxMAotI2RlZmluZSBTSFJfTUVNX1ZBTElESVRZX0xJQ19OT19LRVlfSU5fRUZGRUNUCSAgICAweDAwMDAwMDIwCisJI2RlZmluZSBTSFJfTUVNX1ZBTElESVRZX0xJQ19LRVlfSU5fRUZGRUNUX01BU0sgICAgIDB4MDAwMDAwMzgKKwkjZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfTElDX01BTlVGX0tFWV9JTl9FRkZFQ1QgICAgMHgwMDAwMDAwOAorCSNkZWZpbmUgU0hSX01FTV9WQUxJRElUWV9MSUNfVVBHUkFERV9LRVlfSU5fRUZGRUNUICAweDAwMDAwMDEwCisJI2RlZmluZSBTSFJfTUVNX1ZBTElESVRZX0xJQ19OT19LRVlfSU5fRUZGRUNUICAgICAgIDB4MDAwMDAwMjAKIAkvKiBBY3RpdmUgTUZXICovCi0jZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfQUNUSVZFX01GV19VTktOT1dOCSAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfQUNUSVZFX01GV19JUE1JCSAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfQUNUSVZFX01GV19VTVAgCSAgICAweDAwMDAwMDgwCi0jZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfQUNUSVZFX01GV19OQ1NJCSAgICAweDAwMDAwMGMwCi0jZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfQUNUSVZFX01GV19OT05FCSAgICAweDAwMDAwMWMwCi0jZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfQUNUSVZFX01GV19NQVNLCSAgICAweDAwMDAwMWMwCisJI2RlZmluZSBTSFJfTUVNX1ZBTElESVRZX0FDVElWRV9NRldfVU5LTk9XTiAgICAgICAgIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfQUNUSVZFX01GV19NQVNLICAgICAgICAgICAgMHgwMDAwMDFjMAorCSNkZWZpbmUgU0hSX01FTV9WQUxJRElUWV9BQ1RJVkVfTUZXX0lQTUkgICAgICAgICAgICAweDAwMDAwMDQwCisJI2RlZmluZSBTSFJfTUVNX1ZBTElESVRZX0FDVElWRV9NRldfVU1QICAgICAgICAgICAgIDB4MDAwMDAwODAKKwkjZGVmaW5lIFNIUl9NRU1fVkFMSURJVFlfQUNUSVZFX01GV19OQ1NJICAgICAgICAgICAgMHgwMDAwMDBjMAorCSNkZWZpbmUgU0hSX01FTV9WQUxJRElUWV9BQ1RJVkVfTUZXX05PTkUgICAgICAgICAgICAweDAwMDAwMWMwCiAKLQlzdHJ1Y3Qgc2htX2Rldl9pbmZvCWRldl9pbmZvOwkJIC8qIDB4OCAgICAgKDB4NDM4KSAqLworCXN0cnVjdCBzaG1fZGV2X2luZm8gZGV2X2luZm87CSAgICAgLyogMHg4ICAgICAoMHg0MzgpICovCiAKLQlzdHJ1Y3QgbGljZW5zZV9rZXkJZHJ2X2xpY19rZXlbUE9SVF9NQVhdOwkvKiAweDQ0MCAoNTIqMj0weDY4KSAqLworCXN0cnVjdCBsaWNlbnNlX2tleSAgICAgICBkcnZfbGljX2tleVtQT1JUX01BWF07IC8qIDB4NDQwICg1MioyPTB4NjgpICovCiAKIAkvKiBGVyBpbmZvcm1hdGlvbiAoZm9yIGludGVybmFsIEZXIHVzZSkgKi8KLQl1MzIJCQlmd19pbmZvX2Zpb19vZmZzZXQ7ICAgIC8qIDB4NGE4ICAgICAgICgweDQpICovCi0Jc3RydWN0IG1nbXRmd19zdGF0ZQltZ210Zndfc3RhdGU7CSAgICAgICAvKiAweDRhYyAgICAgKDB4MWI4KSAqLworCXUzMiAgICAgICAgIGZ3X2luZm9fZmlvX29mZnNldDsJCS8qIDB4NGE4ICAgICAgICgweDQpICovCisJc3RydWN0IG1nbXRmd19zdGF0ZSBtZ210Zndfc3RhdGU7CS8qIDB4NGFjICAgICAoMHgxYjgpICovCiAKLQlzdHJ1Y3QgZHJ2X3BvcnRfbWIJcG9ydF9tYltQT1JUX01BWF07ICAgICAvKiAweDY2NCAoMTYqMj0weDIwKSAqLwotCXN0cnVjdCBkcnZfZnVuY19tYglmdW5jX21iW107CSAgICAgICAvKiAweDY4NAotCQkJCQkgICAgICg0NCoyLzQvOD0weDU4LzB4YjAvMHgxNjApICovCisJc3RydWN0IGRydl9wb3J0X21iICBwb3J0X21iW1BPUlRfTUFYXTsJLyogMHg2NjQgKDE2KjI9MHgyMCkgKi8KKworI2lmZGVmIEJNQVBJCisJLyogVGhpcyBpcyBhIHZhcmlhYmxlIGxlbmd0aCBhcnJheSAqLworCS8qIHRoZSBudW1iZXIgb2YgZnVuY3Rpb24gZGVwZW5kcyBvbiB0aGUgY2hpcCB0eXBlICovCisJc3RydWN0IGRydl9mdW5jX21iIGZ1bmNfbWJbMV07CS8qIDB4Njg0ICg0NCoyLzQvOD0weDU4LzB4YjAvMHgxNjApICovCisjZWxzZQorCS8qIHRoZSBudW1iZXIgb2YgZnVuY3Rpb24gZGVwZW5kcyBvbiB0aGUgY2hpcCB0eXBlICovCisJc3RydWN0IGRydl9mdW5jX21iICBmdW5jX21iW107CS8qIDB4Njg0ICg0NCoyLzQvOD0weDU4LzB4YjAvMHgxNjApICovCisjZW5kaWYgLyogQk1BUEkgKi8KIAogfTsgLyogNTc3MTAgPSAweDZkYyB8IDU3NzExID0gMHg3RTQgfCA1NzcxMiA9IDB4NzM0ICovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaGFyZWQgTWVtb3J5IDIgUmVnaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGUgZndfZmxyX2FjayBpcyBhY3R1YWxseSBidWlsdCBpbiB0aGUgZm9sbG93aW5nIHdheTogICAgICAgICAgICAgICAgICAgKi8KKy8qIDggYml0OiAgUEYgYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogNjQgYml0OiBWRiBhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA4IGJpdDogIGlvc19kaXNfYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEluIG9yZGVyIHRvIG1haW50YWluIGVuZGlhbml0eSBpbiB0aGUgbWFpbGJveCBoc2ksIHdlIHdhbnQgdG8ga2VlcCB1c2luZyAqLworLyogdTMyLiBUaGUgZncgbXVzdCBoYXZlIHRoZSBWRiByaWdodCBhZnRlciB0aGUgUEYgc2luY2UgdGhpcyBpcyBob3cgaXQgICAgICovCisvKiBhY2Nlc3MgYXJyYXlzKGl0IGV4cGVjdHMgYWx3YXlzIHRoZSBWRiB0byByZXNpZGUgYWZ0ZXIgdGhlIFBGLCBhbmQgdGhhdCAgKi8KKy8qIG1ha2VzIHRoZSBjYWxjdWxhdGlvbiBtdWNoIGVhc2llciBmb3IgaXQuICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW4gb3JkZXIgdG8gYW5zd2VyIGJvdGggbGltaXRhdGlvbnMsIGFuZCBrZWVwIHRoZSBzdHJ1Y3Qgc21hbGwsIHRoZSBjb2RlICovCisvKiB3aWxsIGFidXNlIHRoZSBzdHJ1Y3R1cmUgZGVmaW5lZCBoZXJlIHRvIGFjaGlldmUgdGhlIGFjdHVhbCBwYXJ0aXRpb24gICAgKi8KKy8qIGFib3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdHJ1Y3QgZndfZmxyX2FjayB7Ci0JdTMyCXBmX2FjazsKLQl1MzIJdmZfYWNrWzFdOwotCXUzMglpb3ZfZGlzX2FjazsKKwl1MzIgICAgICAgICBwZl9hY2s7CisJdTMyICAgICAgICAgdmZfYWNrWzFdOworCXUzMiAgICAgICAgIGlvdl9kaXNfYWNrOwogfTsKIAogc3RydWN0IGZ3X2Zscl9tYiB7Ci0JdTMyCWFnZ2ludDsKLQl1MzIJb3BnZW5fYWRkcjsKLQlzdHJ1Y3QJZndfZmxyX2FjayBhY2s7CisJdTMyICAgICAgICAgYWdnaW50OworCXUzMiAgICAgICAgIG9wZ2VuX2FkZHI7CisJc3RydWN0IGZ3X2Zscl9hY2sgYWNrOwogfTsKIAogLyoqKiogU1VQUE9SVCBGT1IgU0hNRU0gQVJSUkFZUyAqKioKQEAgLTEyMTAsMzYgKzE1ODgsMzYgQEAKICAqCiAgKiBTSE1FTV9BUlJBWV9CSVRQT1MoaSwgNCwgNCkgZGVmaW5lcyB0aGUgc3RhZGFyZCBvcmRlcmluZzoKICAqCi0gKgkJfAkJfAkJfAkJfAotICogICAwCXwgICAxCXwgICAyCXwgICAzCXwgICA0CXwgICA1CXwgICA2CXwgICA3CXwKLSAqCQl8CQl8CQl8CQl8CisgKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAqICAgMCAgICB8ICAgMSAgIHwgICAyICAgIHwgICAzICAgfCAgIDQgICAgfCAgIDUgICB8ICAgNiAgIHwgICA3ICAgfAorICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CiAgKgogICogU0hNRU1fQVJSQVlfQklUUE9TKGksIDQsIDgpIGRlZmluZXMgYSBmbGlwIG9yZGVyaW5nIHBlciBieXRlOgogICoKLSAqCQl8CQl8CQl8CQl8Ci0gKiAgIDEJfCAgIDAJfCAgIDMJfCAgIDIJfCAgIDUJfCAgIDQJfCAgIDcJfCAgIDYJfAotICoJCXwJCXwJCXwJCXwKKyAqICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAorICogICAxICAgfCAgIDAgICAgfCAgIDMgICAgfCAgIDIgICB8ICAgNSAgICB8ICAgNCAgIHwgICA3ICAgfCAgIDYgICB8CisgKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKICAqCiAgKiBTSE1FTV9BUlJBWV9CSVRQT1MoaSwgNCwgMTYpIGRlZmluZXMgYSBmbGlwIG9yZGVyaW5nIHBlciB3b3JkOgogICoKLSAqCQl8CQl8CQl8CQl8Ci0gKiAgIDMJfCAgIDIJfCAgIDEJfCAgIDAJfCAgIDcJfCAgIDYJfCAgIDUJfCAgIDQJfAotICoJCXwJCXwJCXwJCXwKKyAqICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAorICogICAzICAgfCAgIDIgICAgfCAgIDEgICB8ICAgMCAgICB8ICAgNyAgIHwgICA2ICAgIHwgICA1ICAgfCAgIDQgICB8CisgKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKICAqLwogI2RlZmluZSBTSE1FTV9BUlJBWV9CSVRQT1MoaSwgZWIsIGZiKQlcCiAJKCgoKDMyLyhmYikpIC0gMSAtICgoaSkvKChmYikvKGViKSkpICUgKDMyLyhmYikpKSAqIChmYikpICsgXAogCSgoKGkpJSgoZmIpLyhlYikpKSAqIChlYikpKQogCi0jZGVmaW5lIFNITUVNX0FSUkFZX0dFVChhLCBpLCBlYiwgZmIpCQkJCQkgICBcCisjZGVmaW5lIFNITUVNX0FSUkFZX0dFVChhLCBpLCBlYiwgZmIpCQkJCQlcCiAJKChhW1NITUVNX0FSUkFZX0VOVFJZKGksIGViKV0gPj4gU0hNRU1fQVJSQVlfQklUUE9TKGksIGViLCBmYikpICYgIFwKIAlTSE1FTV9BUlJBWV9NQVNLKGViKSkKIAotI2RlZmluZSBTSE1FTV9BUlJBWV9TRVQoYSwgaSwgZWIsIGZiLCB2YWwpCQkJCSAgIFwKKyNkZWZpbmUgU0hNRU1fQVJSQVlfU0VUKGEsIGksIGViLCBmYiwgdmFsKQkJCQlcCiBkbyB7CQkJCQkJCQkJICAgXAogCWFbU0hNRU1fQVJSQVlfRU5UUlkoaSwgZWIpXSAmPSB+KFNITUVNX0FSUkFZX01BU0soZWIpIDw8CSAgIFwKLQlTSE1FTV9BUlJBWV9CSVRQT1MoaSwgZWIsIGZiKSk7CQkJCSAgIFwKKwlTSE1FTV9BUlJBWV9CSVRQT1MoaSwgZWIsIGZiKSk7CQkJCQkgICBcCiAJYVtTSE1FTV9BUlJBWV9FTlRSWShpLCBlYildIHw9ICgoKHZhbCkgJiBTSE1FTV9BUlJBWV9NQVNLKGViKSkgPDwgIFwKLQlTSE1FTV9BUlJBWV9CSVRQT1MoaSwgZWIsIGZiKSk7CQkJCSAgIFwKKwlTSE1FTV9BUlJBWV9CSVRQT1MoaSwgZWIsIGZiKSk7CQkJCQkgICBcCiB9IHdoaWxlICgwKQogCiAKQEAgLTEyNjMsMjMgKzE2NDEsMzAgQEAKICNkZWZpbmUgSVNDU0lfQVBQX0lEWAkJCTEKICNkZWZpbmUgUFJFREVGSU5FRF9BUFBfSURYX01BWAkJMgogCisKKy8qIEJpZy9MaXR0bGUgZW5kaWFuIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uICovCiBzdHJ1Y3QgZGNieF9ldHNfZmVhdHVyZSB7CisJLyoKKwkgKiBGb3IgQWRtaW4gTUlCIC0gaXMgdGhpcyBmZWF0dXJlIHN1cHBvcnRlZCBieSB0aGUKKwkgKiBkcml2ZXIgfCBGb3IgTG9jYWwgTUlCIC0gc2hvdWxkIHRoaXMgZmVhdHVyZSBiZSBlbmFibGVkLgorCSAqLwogCXUzMiBlbmFibGVkOwogCXUzMiAgcGdfYndfdGJsWzJdOwogCXUzMiAgcHJpX3BnX3RibFsxXTsKIH07CiAKKy8qIERyaXZlciBzdHJ1Y3R1cmUgaW4gTEUgKi8KIHN0cnVjdCBkY2J4X3BmY19mZWF0dXJlIHsKICNpZmRlZiBfX0JJR19FTkRJQU4KIAl1OCBwcmlfZW5fYml0bWFwOwotI2RlZmluZSBEQ0JYX1BGQ19QUklfMCAweDAxCi0jZGVmaW5lIERDQlhfUEZDX1BSSV8xIDB4MDIKLSNkZWZpbmUgRENCWF9QRkNfUFJJXzIgMHgwNAotI2RlZmluZSBEQ0JYX1BGQ19QUklfMyAweDA4Ci0jZGVmaW5lIERDQlhfUEZDX1BSSV80IDB4MTAKLSNkZWZpbmUgRENCWF9QRkNfUFJJXzUgMHgyMAotI2RlZmluZSBEQ0JYX1BGQ19QUklfNiAweDQwCi0jZGVmaW5lIERDQlhfUEZDX1BSSV83IDB4ODAKKwkjZGVmaW5lIERDQlhfUEZDX1BSSV8wIDB4MDEKKwkjZGVmaW5lIERDQlhfUEZDX1BSSV8xIDB4MDIKKwkjZGVmaW5lIERDQlhfUEZDX1BSSV8yIDB4MDQKKwkjZGVmaW5lIERDQlhfUEZDX1BSSV8zIDB4MDgKKwkjZGVmaW5lIERDQlhfUEZDX1BSSV80IDB4MTAKKwkjZGVmaW5lIERDQlhfUEZDX1BSSV81IDB4MjAKKwkjZGVmaW5lIERDQlhfUEZDX1BSSV82IDB4NDAKKwkjZGVmaW5lIERDQlhfUEZDX1BSSV83IDB4ODAKIAl1OCBwZmNfY2FwczsKIAl1OCByZXNlcnZlZDsKIAl1OCBlbmFibGVkOwpAQCAtMTI4OCwzOSArMTY3Myw0MSBAQAogCXU4IHJlc2VydmVkOwogCXU4IHBmY19jYXBzOwogCXU4IHByaV9lbl9iaXRtYXA7Ci0jZGVmaW5lIERDQlhfUEZDX1BSSV8wIDB4MDEKLSNkZWZpbmUgRENCWF9QRkNfUFJJXzEgMHgwMgotI2RlZmluZSBEQ0JYX1BGQ19QUklfMiAweDA0Ci0jZGVmaW5lIERDQlhfUEZDX1BSSV8zIDB4MDgKLSNkZWZpbmUgRENCWF9QRkNfUFJJXzQgMHgxMAotI2RlZmluZSBEQ0JYX1BGQ19QUklfNSAweDIwCi0jZGVmaW5lIERDQlhfUEZDX1BSSV82IDB4NDAKLSNkZWZpbmUgRENCWF9QRkNfUFJJXzcgMHg4MAorCSNkZWZpbmUgRENCWF9QRkNfUFJJXzAgMHgwMQorCSNkZWZpbmUgRENCWF9QRkNfUFJJXzEgMHgwMgorCSNkZWZpbmUgRENCWF9QRkNfUFJJXzIgMHgwNAorCSNkZWZpbmUgRENCWF9QRkNfUFJJXzMgMHgwOAorCSNkZWZpbmUgRENCWF9QRkNfUFJJXzQgMHgxMAorCSNkZWZpbmUgRENCWF9QRkNfUFJJXzUgMHgyMAorCSNkZWZpbmUgRENCWF9QRkNfUFJJXzYgMHg0MAorCSNkZWZpbmUgRENCWF9QRkNfUFJJXzcgMHg4MAogI2VuZGlmCiB9OwogCiBzdHJ1Y3QgZGNieF9hcHBfcHJpb3JpdHlfZW50cnkgewogI2lmZGVmIF9fQklHX0VORElBTgotCXUxNglhcHBfaWQ7Ci0JdTgJcHJpX2JpdG1hcDsKLQl1OAlhcHBCaXRmaWVsZDsKLSNkZWZpbmUgRENCWF9BUFBfRU5UUllfVkFMSUQJICAgICAweDAxCi0jZGVmaW5lIERDQlhfQVBQX0VOVFJZX1NGX01BU0sJICAgICAweDMwCi0jZGVmaW5lIERDQlhfQVBQX0VOVFJZX1NGX1NISUZUCSAgICAgNAotI2RlZmluZSBEQ0JYX0FQUF9TRl9FVEhfVFlQRQkgICAgIDB4MTAKLSNkZWZpbmUgRENCWF9BUFBfU0ZfUE9SVAkgICAgIDB4MjAKKwl1MTYgIGFwcF9pZDsKKwl1OCAgcHJpX2JpdG1hcDsKKwl1OCAgYXBwQml0ZmllbGQ7CisJI2RlZmluZSBEQ0JYX0FQUF9FTlRSWV9WQUxJRCAgICAgICAgIDB4MDEKKwkjZGVmaW5lIERDQlhfQVBQX0VOVFJZX1NGX01BU0sgICAgICAgMHgzMAorCSNkZWZpbmUgRENCWF9BUFBfRU5UUllfU0ZfU0hJRlQgICAgICA0CisJI2RlZmluZSBEQ0JYX0FQUF9TRl9FVEhfVFlQRSAgICAgICAgIDB4MTAKKwkjZGVmaW5lIERDQlhfQVBQX1NGX1BPUlQgICAgICAgICAgICAgMHgyMAogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCiAJdTggYXBwQml0ZmllbGQ7Ci0jZGVmaW5lIERDQlhfQVBQX0VOVFJZX1ZBTElECSAgICAgMHgwMQotI2RlZmluZSBEQ0JYX0FQUF9FTlRSWV9TRl9NQVNLCSAgICAgMHgzMAotI2RlZmluZSBEQ0JYX0FQUF9FTlRSWV9TRl9TSElGVAkgICAgIDQKLSNkZWZpbmUgRENCWF9BUFBfU0ZfRVRIX1RZUEUJICAgICAweDEwCi0jZGVmaW5lIERDQlhfQVBQX1NGX1BPUlQJICAgICAweDIwCi0JdTgJcHJpX2JpdG1hcDsKLQl1MTYJYXBwX2lkOworCSNkZWZpbmUgRENCWF9BUFBfRU5UUllfVkFMSUQgICAgICAgICAweDAxCisJI2RlZmluZSBEQ0JYX0FQUF9FTlRSWV9TRl9NQVNLICAgICAgIDB4MzAKKwkjZGVmaW5lIERDQlhfQVBQX0VOVFJZX1NGX1NISUZUICAgICAgNAorCSNkZWZpbmUgRENCWF9BUFBfU0ZfRVRIX1RZUEUgICAgICAgICAweDEwCisJI2RlZmluZSBEQ0JYX0FQUF9TRl9QT1JUICAgICAgICAgICAgIDB4MjAKKwl1OCAgcHJpX2JpdG1hcDsKKwl1MTYgIGFwcF9pZDsKICNlbmRpZgogfTsKIAorCisvKiBGVyBzdHJ1Y3R1cmUgaW4gQkUgKi8KIHN0cnVjdCBkY2J4X2FwcF9wcmlvcml0eV9mZWF0dXJlIHsKICNpZmRlZiBfX0JJR19FTkRJQU4KIAl1OCByZXNlcnZlZDsKQEAgLTEzMzYsMzAyICsxNzIzLDQwMyBAQAogCXN0cnVjdCBkY2J4X2FwcF9wcmlvcml0eV9lbnRyeSAgYXBwX3ByaV90YmxbRENCWF9NQVhfQVBQX1BST1RPQ09MXTsKIH07CiAKKy8qIEZXIHN0cnVjdHVyZSBpbiBCRSAqLwogc3RydWN0IGRjYnhfZmVhdHVyZXMgeworCS8qIFBHIGZlYXR1cmUgKi8KIAlzdHJ1Y3QgZGNieF9ldHNfZmVhdHVyZSBldHM7CisJLyogUEZDIGZlYXR1cmUgKi8KIAlzdHJ1Y3QgZGNieF9wZmNfZmVhdHVyZSBwZmM7CisJLyogQVBQIGZlYXR1cmUgKi8KIAlzdHJ1Y3QgZGNieF9hcHBfcHJpb3JpdHlfZmVhdHVyZSBhcHA7CiB9OwogCisvKiBMTERQIHByb3RvY29sIHBhcmFtZXRlcnMgKi8KKy8qIEZXIHN0cnVjdHVyZSBpbiBCRSAqLwogc3RydWN0IGxsZHBfcGFyYW1zIHsKICNpZmRlZiBfX0JJR19FTkRJQU4KLQl1OAltc2dfZmFzdF90eF9pbnRlcnZhbDsKLQl1OAltc2dfdHhfaG9sZDsKLQl1OAltc2dfdHhfaW50ZXJ2YWw7Ci0JdTgJYWRtaW5fc3RhdHVzOwotI2RlZmluZSBMTERQX1RYX09OTFkgIDB4MDEKLSNkZWZpbmUgTExEUF9SWF9PTkxZICAweDAyCi0jZGVmaW5lIExMRFBfVFhfUlggICAgMHgwMwotI2RlZmluZSBMTERQX0RJU0FCTEVEIDB4MDQKLQl1OAlyZXNlcnZlZDE7Ci0JdTgJdHhfZmFzdDsKLQl1OAl0eF9jcmRfbWF4OwotCXU4CXR4X2NyZDsKKwl1OCAgbXNnX2Zhc3RfdHhfaW50ZXJ2YWw7CisJdTggIG1zZ190eF9ob2xkOworCXU4ICBtc2dfdHhfaW50ZXJ2YWw7CisJdTggIGFkbWluX3N0YXR1czsKKwkjZGVmaW5lIExMRFBfVFhfT05MWSAgMHgwMQorCSNkZWZpbmUgTExEUF9SWF9PTkxZICAweDAyCisJI2RlZmluZSBMTERQX1RYX1JYICAgIDB4MDMKKwkjZGVmaW5lIExMRFBfRElTQUJMRUQgMHgwNAorCXU4ICByZXNlcnZlZDE7CisJdTggIHR4X2Zhc3Q7CisJdTggIHR4X2NyZF9tYXg7CisJdTggIHR4X2NyZDsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4CWFkbWluX3N0YXR1czsKLSNkZWZpbmUgTExEUF9UWF9PTkxZICAweDAxCi0jZGVmaW5lIExMRFBfUlhfT05MWSAgMHgwMgotI2RlZmluZSBMTERQX1RYX1JYICAgIDB4MDMKLSNkZWZpbmUgTExEUF9ESVNBQkxFRCAweDA0Ci0JdTgJbXNnX3R4X2ludGVydmFsOwotCXU4CW1zZ190eF9ob2xkOwotCXU4CW1zZ19mYXN0X3R4X2ludGVydmFsOwotCXU4CXR4X2NyZDsKLQl1OAl0eF9jcmRfbWF4OwotCXU4CXR4X2Zhc3Q7Ci0JdTgJcmVzZXJ2ZWQxOworCXU4ICBhZG1pbl9zdGF0dXM7CisJI2RlZmluZSBMTERQX1RYX09OTFkgIDB4MDEKKwkjZGVmaW5lIExMRFBfUlhfT05MWSAgMHgwMgorCSNkZWZpbmUgTExEUF9UWF9SWCAgICAweDAzCisJI2RlZmluZSBMTERQX0RJU0FCTEVEIDB4MDQKKwl1OCAgbXNnX3R4X2ludGVydmFsOworCXU4ICBtc2dfdHhfaG9sZDsKKwl1OCAgbXNnX2Zhc3RfdHhfaW50ZXJ2YWw7CisJdTggIHR4X2NyZDsKKwl1OCAgdHhfY3JkX21heDsKKwl1OCAgdHhfZmFzdDsKKwl1OCAgcmVzZXJ2ZWQxOwogI2VuZGlmCi0jZGVmaW5lIFJFTV9DSEFTU0lTX0lEX1NUQVRfTEVOCTQKLSNkZWZpbmUgUkVNX1BPUlRfSURfU1RBVF9MRU4gNAorCSNkZWZpbmUgUkVNX0NIQVNTSVNfSURfU1RBVF9MRU4gNAorCSNkZWZpbmUgUkVNX1BPUlRfSURfU1RBVF9MRU4gNAorCS8qIEhvbGRzIHJlbW90ZSBDaGFzc2lzIElEIFRMViBoZWFkZXIsIHN1YnR5cGUgYW5kIDlCIG9mIHBheWxvYWQuICovCiAJdTMyIHBlZXJfY2hhc3Npc19pZFtSRU1fQ0hBU1NJU19JRF9TVEFUX0xFTl07CisJLyogSG9sZHMgcmVtb3RlIFBvcnQgSUQgVExWIGhlYWRlciwgc3VidHlwZSBhbmQgOUIgb2YgcGF5bG9hZC4gKi8KIAl1MzIgcGVlcl9wb3J0X2lkW1JFTV9QT1JUX0lEX1NUQVRfTEVOXTsKIH07CiAKIHN0cnVjdCBsbGRwX2RjYnhfc3RhdCB7Ci0jZGVmaW5lIExPQ0FMX0NIQVNTSVNfSURfU1RBVF9MRU4gMgotI2RlZmluZSBMT0NBTF9QT1JUX0lEX1NUQVRfTEVOIDIKKwkjZGVmaW5lIExPQ0FMX0NIQVNTSVNfSURfU1RBVF9MRU4gMgorCSNkZWZpbmUgTE9DQUxfUE9SVF9JRF9TVEFUX0xFTiAyCisJLyogSG9sZHMgbG9jYWwgQ2hhc3NpcyBJRCA4QiBwYXlsb2FkIG9mIGNvbnN0YW50IHN1YnR5cGUgNC4gKi8KIAl1MzIgbG9jYWxfY2hhc3Npc19pZFtMT0NBTF9DSEFTU0lTX0lEX1NUQVRfTEVOXTsKKwkvKiBIb2xkcyBsb2NhbCBQb3J0IElEIDhCIHBheWxvYWQgb2YgY29uc3RhbnQgc3VidHlwZSAzLiAqLwogCXUzMiBsb2NhbF9wb3J0X2lkW0xPQ0FMX1BPUlRfSURfU1RBVF9MRU5dOworCS8qIE51bWJlciBvZiBEQ0JYIGZyYW1lcyB0cmFuc21pdHRlZC4gKi8KIAl1MzIgbnVtX3R4X2RjYnhfcGt0czsKKwkvKiBOdW1iZXIgb2YgRENCWCBmcmFtZXMgcmVjZWl2ZWQuICovCiAJdTMyIG51bV9yeF9kY2J4X3BrdHM7CiB9OwogCisvKiBBRE1JTiBNSUIgLSBEQ0JYIGxvY2FsIG1hY2hpbmUgZGVmYXVsdCBjb25maWd1cmF0aW9uLiAqLwogc3RydWN0IGxsZHBfYWRtaW5fbWliIHsKLQl1MzIJdmVyX2NmZ19mbGFnczsKLSNkZWZpbmUgRENCWF9FVFNfQ09ORklHX1RYX0VOQUJMRUQJMHgwMDAwMDAwMQotI2RlZmluZSBEQ0JYX1BGQ19DT05GSUdfVFhfRU5BQkxFRAkweDAwMDAwMDAyCi0jZGVmaW5lIERDQlhfQVBQX0NPTkZJR19UWF9FTkFCTEVECTB4MDAwMDAwMDQKLSNkZWZpbmUgRENCWF9FVFNfUkVDT19UWF9FTkFCTEVECTB4MDAwMDAwMDgKLSNkZWZpbmUgRENCWF9FVFNfUkVDT19WQUxJRAkJMHgwMDAwMDAxMAotI2RlZmluZSBEQ0JYX0VUU19XSUxMSU5HCQkweDAwMDAwMDIwCi0jZGVmaW5lIERDQlhfUEZDX1dJTExJTkcJCTB4MDAwMDAwNDAKLSNkZWZpbmUgRENCWF9BUFBfV0lMTElORwkJMHgwMDAwMDA4MAotI2RlZmluZSBEQ0JYX1ZFUlNJT05fQ0VFCQkweDAwMDAwMTAwCi0jZGVmaW5lIERDQlhfVkVSU0lPTl9JRUVFCQkweDAwMDAwMjAwCi0jZGVmaW5lIERDQlhfRENCWF9FTkFCTEVECQkweDAwMDAwNDAwCi0jZGVmaW5lIERDQlhfQ0VFX1ZFUlNJT05fTUFTSwkJMHgwMDAwZjAwMAotI2RlZmluZSBEQ0JYX0NFRV9WRVJTSU9OX1NISUZUCQkxMgotI2RlZmluZSBEQ0JYX0NFRV9NQVhfVkVSU0lPTl9NQVNLCTB4MDAwZjAwMDAKLSNkZWZpbmUgRENCWF9DRUVfTUFYX1ZFUlNJT05fU0hJRlQJMTYKLQlzdHJ1Y3QgZGNieF9mZWF0dXJlcwlmZWF0dXJlczsKKwl1MzIgICAgIHZlcl9jZmdfZmxhZ3M7CisJI2RlZmluZSBEQ0JYX0VUU19DT05GSUdfVFhfRU5BQkxFRCAgICAgICAweDAwMDAwMDAxCisJI2RlZmluZSBEQ0JYX1BGQ19DT05GSUdfVFhfRU5BQkxFRCAgICAgICAweDAwMDAwMDAyCisJI2RlZmluZSBEQ0JYX0FQUF9DT05GSUdfVFhfRU5BQkxFRCAgICAgICAweDAwMDAwMDA0CisJI2RlZmluZSBEQ0JYX0VUU19SRUNPX1RYX0VOQUJMRUQgICAgICAgICAweDAwMDAwMDA4CisJI2RlZmluZSBEQ0JYX0VUU19SRUNPX1ZBTElEICAgICAgICAgICAgICAweDAwMDAwMDEwCisJI2RlZmluZSBEQ0JYX0VUU19XSUxMSU5HICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisJI2RlZmluZSBEQ0JYX1BGQ19XSUxMSU5HICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisJI2RlZmluZSBEQ0JYX0FQUF9XSUxMSU5HICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisJI2RlZmluZSBEQ0JYX1ZFUlNJT05fQ0VFICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisJI2RlZmluZSBEQ0JYX1ZFUlNJT05fSUVFRSAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisJI2RlZmluZSBEQ0JYX0RDQlhfRU5BQkxFRCAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisJI2RlZmluZSBEQ0JYX0NFRV9WRVJTSU9OX01BU0sgICAgICAgICAgICAweDAwMDBmMDAwCisJI2RlZmluZSBEQ0JYX0NFRV9WRVJTSU9OX1NISUZUICAgICAgICAgICAxMgorCSNkZWZpbmUgRENCWF9DRUVfTUFYX1ZFUlNJT05fTUFTSyAgICAgICAgMHgwMDBmMDAwMAorCSNkZWZpbmUgRENCWF9DRUVfTUFYX1ZFUlNJT05fU0hJRlQgICAgICAgMTYKKwlzdHJ1Y3QgZGNieF9mZWF0dXJlcyAgICAgZmVhdHVyZXM7CiB9OwogCisvKiBSRU1PVEUgTUlCIC0gcmVtb3RlIG1hY2hpbmUgRENCWCBjb25maWd1cmF0aW9uLiAqLwogc3RydWN0IGxsZHBfcmVtb3RlX21pYiB7CiAJdTMyIHByZWZpeF9zZXFfbnVtOwogCXUzMiBmbGFnczsKLSNkZWZpbmUgRENCWF9FVFNfVExWX1JYCSAgICAweDAwMDAwMDAxCi0jZGVmaW5lIERDQlhfUEZDX1RMVl9SWAkgICAgMHgwMDAwMDAwMgotI2RlZmluZSBEQ0JYX0FQUF9UTFZfUlgJICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRENCWF9FVFNfUlhfRVJST1IgICAweDAwMDAwMDEwCi0jZGVmaW5lIERDQlhfUEZDX1JYX0VSUk9SICAgMHgwMDAwMDAyMAotI2RlZmluZSBEQ0JYX0FQUF9SWF9FUlJPUiAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgRENCWF9FVFNfUkVNX1dJTExJTkcJMHgwMDAwMDEwMAotI2RlZmluZSBEQ0JYX1BGQ19SRU1fV0lMTElORwkweDAwMDAwMjAwCi0jZGVmaW5lIERDQlhfQVBQX1JFTV9XSUxMSU5HCTB4MDAwMDA0MDAKLSNkZWZpbmUgRENCWF9SRU1PVEVfRVRTX1JFQ09fVkFMSUQgIDB4MDAwMDEwMDAKKwkjZGVmaW5lIERDQlhfRVRTX1RMVl9SWCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKwkjZGVmaW5lIERDQlhfUEZDX1RMVl9SWCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKwkjZGVmaW5lIERDQlhfQVBQX1RMVl9SWCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKwkjZGVmaW5lIERDQlhfRVRTX1JYX0VSUk9SICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKwkjZGVmaW5lIERDQlhfUEZDX1JYX0VSUk9SICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKwkjZGVmaW5lIERDQlhfQVBQX1JYX0VSUk9SICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKwkjZGVmaW5lIERDQlhfRVRTX1JFTV9XSUxMSU5HICAgICAgICAgICAgIDB4MDAwMDAxMDAKKwkjZGVmaW5lIERDQlhfUEZDX1JFTV9XSUxMSU5HICAgICAgICAgICAgIDB4MDAwMDAyMDAKKwkjZGVmaW5lIERDQlhfQVBQX1JFTV9XSUxMSU5HICAgICAgICAgICAgIDB4MDAwMDA0MDAKKwkjZGVmaW5lIERDQlhfUkVNT1RFX0VUU19SRUNPX1ZBTElEICAgICAgIDB4MDAwMDEwMDAKKwkjZGVmaW5lIERDQlhfUkVNT1RFX01JQl9WQUxJRCAgICAgICAgICAgIDB4MDAwMDIwMDAKIAlzdHJ1Y3QgZGNieF9mZWF0dXJlcyBmZWF0dXJlczsKIAl1MzIgc3VmZml4X3NlcV9udW07CiB9OwogCisvKiBMT0NBTCBNSUIgLSBvcGVyYXRpb25hbCBEQ0JYIGNvbmZpZ3VyYXRpb24gLSB0cmFuc21pdHRlZCBvbiBUeCBMTERQRFUuICovCiBzdHJ1Y3QgbGxkcF9sb2NhbF9taWIgewogCXUzMiBwcmVmaXhfc2VxX251bTsKKwkvKiBJbmRpY2F0ZXMgaWYgdGhlcmUgaXMgbWlzbWF0Y2ggd2l0aCBuZWdvdGlhdGlvbiByZXN1bHRzLiAqLwogCXUzMiBlcnJvcjsKLSNkZWZpbmUgRENCWF9MT0NBTF9FVFNfRVJST1IJIDB4MDAwMDAwMDEKLSNkZWZpbmUgRENCWF9MT0NBTF9QRkNfRVJST1IJIDB4MDAwMDAwMDIKLSNkZWZpbmUgRENCWF9MT0NBTF9BUFBfRVJST1IJIDB4MDAwMDAwMDQKLSNkZWZpbmUgRENCWF9MT0NBTF9QRkNfTUlTTUFUQ0gJIDB4MDAwMDAwMTAKLSNkZWZpbmUgRENCWF9MT0NBTF9BUFBfTUlTTUFUQ0gJIDB4MDAwMDAwMjAKKwkjZGVmaW5lIERDQlhfTE9DQUxfRVRTX0VSUk9SICAgICAgICAgICAgIDB4MDAwMDAwMDEKKwkjZGVmaW5lIERDQlhfTE9DQUxfUEZDX0VSUk9SICAgICAgICAgICAgIDB4MDAwMDAwMDIKKwkjZGVmaW5lIERDQlhfTE9DQUxfQVBQX0VSUk9SICAgICAgICAgICAgIDB4MDAwMDAwMDQKKwkjZGVmaW5lIERDQlhfTE9DQUxfUEZDX01JU01BVENIICAgICAgICAgIDB4MDAwMDAwMTAKKwkjZGVmaW5lIERDQlhfTE9DQUxfQVBQX01JU01BVENIICAgICAgICAgIDB4MDAwMDAwMjAKKwkjZGVmaW5lIERDQlhfUkVNT1RFX01JQl9FUlJPUgkJIDB4MDAwMDAwNDAKIAlzdHJ1Y3QgZGNieF9mZWF0dXJlcyAgIGZlYXR1cmVzOwogCXUzMiBzdWZmaXhfc2VxX251bTsKIH07CiAvKioqRU5EIE9GIERDQlggU1RSVUNUVVJFUyBERUNMQVJBVElPTlMqKiovCiAKK3N0cnVjdCBuY3NpX29lbV9mY29lX2ZlYXR1cmVzIHsKKwl1MzIgZmNvZV9mZWF0dXJlczE7CisJI2RlZmluZSBGQ09FX0ZFQVRVUkVTMV9JT1NfUEVSX0NPTk5FQ1RJT05fTUFTSyAgICAgICAgICAweDAwMDBGRkZGCisJI2RlZmluZSBGQ09FX0ZFQVRVUkVTMV9JT1NfUEVSX0NPTk5FQ1RJT05fT0ZGU0VUICAgICAgICAwCisKKwkjZGVmaW5lIEZDT0VfRkVBVFVSRVMxX0xPR0lOU19QRVJfUE9SVF9NQVNLICAgICAgICAgICAgIDB4RkZGRjAwMDAKKwkjZGVmaW5lIEZDT0VfRkVBVFVSRVMxX0xPR0lOU19QRVJfUE9SVF9PRkZTRVQgICAgICAgICAgIDE2CisKKwl1MzIgZmNvZV9mZWF0dXJlczI7CisJI2RlZmluZSBGQ09FX0ZFQVRVUkVTMl9FWENIQU5HRVNfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisJI2RlZmluZSBGQ09FX0ZFQVRVUkVTMl9FWENIQU5HRVNfT0ZGU0VUICAgICAgICAgICAgICAgICAwCisKKwkjZGVmaW5lIEZDT0VfRkVBVFVSRVMyX05QSVZfV1dOX1BFUl9QT1JUX01BU0sgICAgICAgICAgIDB4RkZGRjAwMDAKKwkjZGVmaW5lIEZDT0VfRkVBVFVSRVMyX05QSVZfV1dOX1BFUl9QT1JUX09GRlNFVCAgICAgICAgIDE2CisKKwl1MzIgZmNvZV9mZWF0dXJlczM7CisJI2RlZmluZSBGQ09FX0ZFQVRVUkVTM19UQVJHRVRTX1NVUFBPUlRFRF9NQVNLICAgICAgICAgICAweDAwMDBGRkZGCisJI2RlZmluZSBGQ09FX0ZFQVRVUkVTM19UQVJHRVRTX1NVUFBPUlRFRF9PRkZTRVQgICAgICAgICAwCisKKwkjZGVmaW5lIEZDT0VfRkVBVFVSRVMzX09VVFNUQU5ESU5HX0NPTU1BTkRTX01BU0sgICAgICAgIDB4RkZGRjAwMDAKKwkjZGVmaW5lIEZDT0VfRkVBVFVSRVMzX09VVFNUQU5ESU5HX0NPTU1BTkRTX09GRlNFVCAgICAgIDE2CisKKwl1MzIgZmNvZV9mZWF0dXJlczQ7CisJI2RlZmluZSBGQ09FX0ZFQVRVUkVTNF9GRUFUVVJFX1NFVFRJTkdTX01BU0sgICAgICAgICAgICAweDAwMDAwMDBGCisJI2RlZmluZSBGQ09FX0ZFQVRVUkVTNF9GRUFUVVJFX1NFVFRJTkdTX09GRlNFVCAgICAgICAgICAwCit9OworCitzdHJ1Y3QgbmNzaV9vZW1fZGF0YSB7CisJdTMyIGRyaXZlcl92ZXJzaW9uWzRdOworCXN0cnVjdCBuY3NpX29lbV9mY29lX2ZlYXR1cmVzIG5jc2lfb2VtX2Zjb2VfZmVhdHVyZXM7Cit9OworCiBzdHJ1Y3Qgc2htZW0yX3JlZ2lvbiB7CiAKLQl1MzIJCQlzaXplOworCXUzMiBzaXplOwkJCQkJLyogMHgwMDAwICovCiAKLQl1MzIJCQlkY2Nfc3VwcG9ydDsKLSNkZWZpbmUgU0hNRU1fRENDX1NVUFBPUlRfTk9ORQkJCSAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNITUVNX0RDQ19TVVBQT1JUX0RJU0FCTEVfRU5BQkxFX1BGX1RMViAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTSE1FTV9EQ0NfU1VQUE9SVF9CQU5EV0lEVEhfQUxMT0NBVElPTl9UTFYgIDB4MDAwMDAwMDQKLSNkZWZpbmUgU0hNRU1fRENDX1NVUFBPUlRfQ0hBTkdFX01BQ19BRERSRVNTX1RMViAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFNITUVNX0RDQ19TVVBQT1JUX1NFVF9QUk9UT0NPTF9UTFYJICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgU0hNRU1fRENDX1NVUFBPUlRfU0VUX1BSSU9SSVRZX1RMVgkgICAgMHgwMDAwMDA4MAotI2RlZmluZSBTSE1FTV9EQ0NfU1VQUE9SVF9ERUZBVUxUCQkgICAgU0hNRU1fRENDX1NVUFBPUlRfTk9ORQotCXUzMiBleHRfcGh5X2Z3X3ZlcnNpb24yW1BPUlRfTUFYXTsKKwl1MzIgZGNjX3N1cHBvcnQ7CQkJCS8qIDB4MDAwNCAqLworCSNkZWZpbmUgU0hNRU1fRENDX1NVUFBPUlRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisJI2RlZmluZSBTSE1FTV9EQ0NfU1VQUE9SVF9ESVNBQkxFX0VOQUJMRV9QRl9UTFYgICAgIDB4MDAwMDAwMDEKKwkjZGVmaW5lIFNITUVNX0RDQ19TVVBQT1JUX0JBTkRXSURUSF9BTExPQ0FUSU9OX1RMViAgMHgwMDAwMDAwNAorCSNkZWZpbmUgU0hNRU1fRENDX1NVUFBPUlRfQ0hBTkdFX01BQ19BRERSRVNTX1RMViAgICAweDAwMDAwMDA4CisJI2RlZmluZSBTSE1FTV9EQ0NfU1VQUE9SVF9TRVRfUFJPVE9DT0xfVExWICAgICAgICAgIDB4MDAwMDAwNDAKKwkjZGVmaW5lIFNITUVNX0RDQ19TVVBQT1JUX1NFVF9QUklPUklUWV9UTFYgICAgICAgICAgMHgwMDAwMDA4MAorCisJdTMyIGV4dF9waHlfZndfdmVyc2lvbjJbUE9SVF9NQVhdOwkJLyogMHgwMDA4ICovCiAJLyoKIAkgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGlmIHRoZSBtZl9jZmdfYWRkciBkb2VzIG5vdCBleGlzdAogCSAqICh0aGUgc2l6ZSBmaWxlZCBpcyBzbWFsbGVyIHRoYW4gMHhjKSB0aGUgbWZfY2ZnIHJlc2lkZXMgYXQgdGhlCiAJICogZW5kIG9mIHN0cnVjdCBzaG1lbV9yZWdpb24KLSAgICAgKi8KLQl1MzIJbWZfY2ZnX2FkZHI7Ci0jZGVmaW5lIFNITUVNX01GX0NGR19BRERSX05PTkUJCQkgICAgMHgwMDAwMDAwMAorCSAqLworCXUzMiBtZl9jZmdfYWRkcjsJCQkJLyogMHgwMDEwICovCisJI2RlZmluZSBTSE1FTV9NRl9DRkdfQUREUl9OT05FICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAogCi0Jc3RydWN0IGZ3X2Zscl9tYiBmbHJfbWI7Ci0JdTMyCWRjYnhfbGxkcF9wYXJhbXNfb2Zmc2V0OwotI2RlZmluZSBTSE1FTV9MTERQX0RDQlhfUEFSQU1TX05PTkUJCSAgICAweDAwMDAwMDAwCi0JdTMyCWRjYnhfbmVnX3Jlc19vZmZzZXQ7Ci0jZGVmaW5lIFNITUVNX0RDQlhfTkVHX1JFU19OT05FCQkJICAgIDB4MDAwMDAwMDAKLQl1MzIJZGNieF9yZW1vdGVfbWliX29mZnNldDsKLSNkZWZpbmUgU0hNRU1fRENCWF9SRU1PVEVfTUlCX05PTkUJCSAgICAweDAwMDAwMDAwCisJc3RydWN0IGZ3X2Zscl9tYiBmbHJfbWI7CQkJLyogMHgwMDE0ICovCisJdTMyIGRjYnhfbGxkcF9wYXJhbXNfb2Zmc2V0OwkJCS8qIDB4MDAyOCAqLworCSNkZWZpbmUgU0hNRU1fTExEUF9EQ0JYX1BBUkFNU19OT05FICAgICAgICAgICAgIDB4MDAwMDAwMDAKKwl1MzIgZGNieF9uZWdfcmVzX29mZnNldDsJCQkvKiAweDAwMmMgKi8KKwkjZGVmaW5lIFNITUVNX0RDQlhfTkVHX1JFU19OT05FCQkJMHgwMDAwMDAwMAorCXUzMiBkY2J4X3JlbW90ZV9taWJfb2Zmc2V0OwkJCS8qIDB4MDAzMCAqLworCSNkZWZpbmUgU0hNRU1fRENCWF9SRU1PVEVfTUlCX05PTkUgICAgICAgICAgICAgIDB4MDAwMDAwMDAKIAkvKgogCSAqIFRoZSBvdGhlciBzaG1lbVhfYmFzZV9hZGRyIGhvbGRzIHRoZSBvdGhlciBwYXRoJ3Mgc2htZW0gYWRkcmVzcwogCSAqIHJlcXVpcmVkIGZvciBleGFtcGxlIGluIGNhc2Ugb2YgY29tbW9uIHBoeSBpbml0LCBvciBmb3IgcGF0aDEgdG8ga25vdwogCSAqIHRoZSBhZGRyZXNzIG9mIG1jcCBkZWJ1ZyB0cmFjZSB3aGljaCBpcyBsb2NhdGVkIGluIG9mZnNldCBmcm9tIHNobWVtCiAJICogb2YgcGF0aDAKIAkgKi8KLQl1MzIgb3RoZXJfc2htZW1fYmFzZV9hZGRyOwotCXUzMiBvdGhlcl9zaG1lbTJfYmFzZV9hZGRyOwotCXUzMglyZXNlcnZlZDFbRTJfVkZfTUFYIC8gMzJdOwotCXUzMglyZXNlcnZlZDJbRTJfRlVOQ19NQVhdW0UyX1ZGX01BWCAvIDMyXTsKLQl1MzIJZGNieF9sbGRwX2RjYnhfc3RhdF9vZmZzZXQ7Ci0jZGVmaW5lIFNITUVNX0xMRFBfRENCWF9TVEFUX05PTkUJCSAgIDB4MDAwMDAwMDAKKwl1MzIgb3RoZXJfc2htZW1fYmFzZV9hZGRyOwkJCS8qIDB4MDAzNCAqLworCXUzMiBvdGhlcl9zaG1lbTJfYmFzZV9hZGRyOwkJCS8qIDB4MDAzOCAqLworCS8qCisJICogbWNwX3ZmX2Rpc2FibGVkIGlzIHNldCBieSB0aGUgTUNQIHRvIGluZGljYXRlIHRoZSBkcml2ZXIgYWJvdXQgVkZzCisJICogd2hpY2ggd2VyZSBkaXNhYmxlZC9mbHJlZAorCSAqLworCXUzMiBtY3BfdmZfZGlzYWJsZWRbRTJfVkZfTUFYIC8gMzJdOwkJLyogMHgwMDNjICovCisKKwkvKgorCSAqIGRydl9hY2tfdmZfZGlzYWJsZWQgaXMgc2V0IGJ5IHRoZSBQRiBkcml2ZXIgdG8gYWNrIGhhbmRsZWQgZGlzYWJsZWQKKwkgKiBWRnMKKwkgKi8KKwl1MzIgZHJ2X2Fja192Zl9kaXNhYmxlZFtFMl9GVU5DX01BWF1bRTJfVkZfTUFYIC8gMzJdOyAvKiAweDAwNDQgKi8KKworCXUzMiBkY2J4X2xsZHBfZGNieF9zdGF0X29mZnNldDsJCQkvKiAweDAwNjQgKi8KKwkjZGVmaW5lIFNITUVNX0xMRFBfRENCWF9TVEFUX05PTkUgICAgICAgICAgICAgICAweDAwMDAwMDAwCisKKwkvKgorCSAqIGVkZWJ1Z19kcml2ZXJfaWYgZmllbGQgaXMgdXNlZCB0byB0cmFuc2ZlciBtZXNzYWdlcyBiZXR3ZWVuIGVkZWJ1ZworCSAqIGFwcCB0byB0aGUgZHJpdmVyIHRocm91Z2ggc2htZW0yLgorCSAqCisJICogbWVzc2FnZSBmb3JtYXQ6CisJICogYml0cyAwLTIgLSAgZnVuY3Rpb24gbnVtYmVyIC8gaW5zdGFuY2Ugb2YgZHJpdmVyIHRvIHBlcmZvcm0gcmVxdWVzdAorCSAqIGJpdHMgMy01IC0gIG9wIGNvZGUgLyBpc19hY2s/CisJICogYml0cyA2LTYzIC0gZGF0YQorCSAqLworCXUzMiBlZGVidWdfZHJpdmVyX2lmWzJdOwkJCS8qIDB4MDA2OCAqLworCSNkZWZpbmUgRURFQlVHX0RSSVZFUl9JRl9PUF9DT0RFX0dFVF9QSFlTX0FERFIgIDEKKwkjZGVmaW5lIEVERUJVR19EUklWRVJfSUZfT1BfQ09ERV9HRVRfQlVTX0FERFIgICAyCisJI2RlZmluZSBFREVCVUdfRFJJVkVSX0lGX09QX0NPREVfRElTQUJMRV9TVEFUICAgMworCisJdTMyIG52bV9yZXRhaW5fYml0bWFwX2FkZHI7CQkJLyogMHgwMDcwICovCisKKwl1MzIJcmVzZXJ2ZWQxOwkvKiAweDAwNzQgKi8KKworCXUzMglyZXNlcnZlZDJbRTJfRlVOQ19NQVhdOworCisJdTMyCXJlc2VydmVkM1tFMl9GVU5DX01BWF07LyogMHgwMDg4ICovCisJdTMyCXJlc2VydmVkNFtFMl9GVU5DX01BWF07LyogMHgwMDk4ICovCisKKwl1MzIgc3dpbV9iYXNlX2FkZHI7CQkJCS8qIDB4MDEwOCAqLworCXUzMiBzd2ltX2Z1bmNzOworCXUzMiBzd2ltX21haW5fY2I7CisKKwl1MzIJcmVzZXJ2ZWQ1WzJdOworCisJLyogZ2VuZXJpYyBmbGFncyBjb250cm9sbGVkIGJ5IHRoZSBkcml2ZXIgKi8KKwl1MzIgZHJ2X2ZsYWdzOworCSNkZWZpbmUgRFJWX0ZMQUdTX0RDQl9DT05GSUdVUkVEICAgICAgICAgICAgICAgIDB4MQorCisJLyogcG9pbnRlciB0byBleHRlbmRlZCBkZXZfaW5mbyBzaGFyZWQgZGF0YSBjb3BpZWQgZnJvbSBudm0gaW1hZ2UgKi8KKwl1MzIgZXh0ZW5kZWRfZGV2X2luZm9fc2hhcmVkX2FkZHI7CisJdTMyIG5jc2lfb2VtX2RhdGFfYWRkcjsKKworCXUzMiBvY3NkX2hvc3RfYWRkcjsKKwl1MzIgb2NiYl9ob3N0X2FkZHI7CisJdTMyIG9jc2RfcmVxX3VwZGF0ZV9pbnRlcnZhbDsKIH07CiAKIAogc3RydWN0IGVtYWNfc3RhdHMgewotICAgIHUzMiAgICAgcnhfc3RhdF9pZmhjaW5vY3RldHM7Ci0gICAgdTMyICAgICByeF9zdGF0X2lmaGNpbmJhZG9jdGV0czsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZXRoZXJzdGF0c2ZyYWdtZW50czsKLSAgICB1MzIgICAgIHJ4X3N0YXRfaWZoY2ludWNhc3Rwa3RzOwotICAgIHUzMiAgICAgcnhfc3RhdF9pZmhjaW5tdWx0aWNhc3Rwa3RzOwotICAgIHUzMiAgICAgcnhfc3RhdF9pZmhjaW5icm9hZGNhc3Rwa3RzOwotICAgIHUzMiAgICAgcnhfc3RhdF9kb3Qzc3RhdHNmY3NlcnJvcnM7Ci0gICAgdTMyICAgICByeF9zdGF0X2RvdDNzdGF0c2FsaWdubWVudGVycm9yczsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZG90M3N0YXRzY2FycmllcnNlbnNlZXJyb3JzOwotICAgIHUzMiAgICAgcnhfc3RhdF94b25wYXVzZWZyYW1lc3JlY2VpdmVkOwotICAgIHUzMiAgICAgcnhfc3RhdF94b2ZmcGF1c2VmcmFtZXNyZWNlaXZlZDsKLSAgICB1MzIgICAgIHJ4X3N0YXRfbWFjY29udHJvbGZyYW1lc3JlY2VpdmVkOwotICAgIHUzMiAgICAgcnhfc3RhdF94b2Zmc3RhdGVlbnRlcmVkOwotICAgIHUzMiAgICAgcnhfc3RhdF9kb3Qzc3RhdHNmcmFtZXN0b29sb25nOwotICAgIHUzMiAgICAgcnhfc3RhdF9ldGhlcnN0YXRzamFiYmVyczsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZXRoZXJzdGF0c3VuZGVyc2l6ZXBrdHM7Ci0gICAgdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNwa3RzNjRvY3RldHM7Ci0gICAgdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNwa3RzNjVvY3RldHN0bzEyN29jdGV0czsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMjhvY3RldHN0bzI1NW9jdGV0czsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZXRoZXJzdGF0c3BrdHMyNTZvY3RldHN0bzUxMW9jdGV0czsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZXRoZXJzdGF0c3BrdHM1MTJvY3RldHN0bzEwMjNvY3RldHM7Ci0gICAgdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNwa3RzMTAyNG9jdGV0c3RvMTUyMm9jdGV0czsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZXRoZXJzdGF0c3BrdHNvdmVyMTUyMm9jdGV0czsKKwl1MzIgICAgIHJ4X3N0YXRfaWZoY2lub2N0ZXRzOworCXUzMiAgICAgcnhfc3RhdF9pZmhjaW5iYWRvY3RldHM7CisJdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNmcmFnbWVudHM7CisJdTMyICAgICByeF9zdGF0X2lmaGNpbnVjYXN0cGt0czsKKwl1MzIgICAgIHJ4X3N0YXRfaWZoY2lubXVsdGljYXN0cGt0czsKKwl1MzIgICAgIHJ4X3N0YXRfaWZoY2luYnJvYWRjYXN0cGt0czsKKwl1MzIgICAgIHJ4X3N0YXRfZG90M3N0YXRzZmNzZXJyb3JzOworCXUzMiAgICAgcnhfc3RhdF9kb3Qzc3RhdHNhbGlnbm1lbnRlcnJvcnM7CisJdTMyICAgICByeF9zdGF0X2RvdDNzdGF0c2NhcnJpZXJzZW5zZWVycm9yczsKKwl1MzIgICAgIHJ4X3N0YXRfeG9ucGF1c2VmcmFtZXNyZWNlaXZlZDsKKwl1MzIgICAgIHJ4X3N0YXRfeG9mZnBhdXNlZnJhbWVzcmVjZWl2ZWQ7CisJdTMyICAgICByeF9zdGF0X21hY2NvbnRyb2xmcmFtZXNyZWNlaXZlZDsKKwl1MzIgICAgIHJ4X3N0YXRfeG9mZnN0YXRlZW50ZXJlZDsKKwl1MzIgICAgIHJ4X3N0YXRfZG90M3N0YXRzZnJhbWVzdG9vbG9uZzsKKwl1MzIgICAgIHJ4X3N0YXRfZXRoZXJzdGF0c2phYmJlcnM7CisJdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHN1bmRlcnNpemVwa3RzOworCXUzMiAgICAgcnhfc3RhdF9ldGhlcnN0YXRzcGt0czY0b2N0ZXRzOworCXUzMiAgICAgcnhfc3RhdF9ldGhlcnN0YXRzcGt0czY1b2N0ZXRzdG8xMjdvY3RldHM7CisJdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNwa3RzMTI4b2N0ZXRzdG8yNTVvY3RldHM7CisJdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNwa3RzMjU2b2N0ZXRzdG81MTFvY3RldHM7CisJdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNwa3RzNTEyb2N0ZXRzdG8xMDIzb2N0ZXRzOworCXUzMiAgICAgcnhfc3RhdF9ldGhlcnN0YXRzcGt0czEwMjRvY3RldHN0bzE1MjJvY3RldHM7CisJdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNwa3Rzb3ZlcjE1MjJvY3RldHM7CiAKLSAgICB1MzIgICAgIHJ4X3N0YXRfZmFsc2VjYXJyaWVyZXJyb3JzOworCXUzMiAgICAgcnhfc3RhdF9mYWxzZWNhcnJpZXJlcnJvcnM7CiAKLSAgICB1MzIgICAgIHR4X3N0YXRfaWZoY291dG9jdGV0czsKLSAgICB1MzIgICAgIHR4X3N0YXRfaWZoY291dGJhZG9jdGV0czsKLSAgICB1MzIgICAgIHR4X3N0YXRfZXRoZXJzdGF0c2NvbGxpc2lvbnM7Ci0gICAgdTMyICAgICB0eF9zdGF0X291dHhvbnNlbnQ7Ci0gICAgdTMyICAgICB0eF9zdGF0X291dHhvZmZzZW50OwotICAgIHUzMiAgICAgdHhfc3RhdF9mbG93Y29udHJvbGRvbmU7Ci0gICAgdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c3NpbmdsZWNvbGxpc2lvbmZyYW1lczsKLSAgICB1MzIgICAgIHR4X3N0YXRfZG90M3N0YXRzbXVsdGlwbGVjb2xsaXNpb25mcmFtZXM7Ci0gICAgdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2RlZmVycmVkdHJhbnNtaXNzaW9uczsKLSAgICB1MzIgICAgIHR4X3N0YXRfZG90M3N0YXRzZXhjZXNzaXZlY29sbGlzaW9uczsKLSAgICB1MzIgICAgIHR4X3N0YXRfZG90M3N0YXRzbGF0ZWNvbGxpc2lvbnM7Ci0gICAgdTMyICAgICB0eF9zdGF0X2lmaGNvdXR1Y2FzdHBrdHM7Ci0gICAgdTMyICAgICB0eF9zdGF0X2lmaGNvdXRtdWx0aWNhc3Rwa3RzOwotICAgIHUzMiAgICAgdHhfc3RhdF9pZmhjb3V0YnJvYWRjYXN0cGt0czsKLSAgICB1MzIgICAgIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NG9jdGV0czsKLSAgICB1MzIgICAgIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NW9jdGV0c3RvMTI3b2N0ZXRzOwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czEyOG9jdGV0c3RvMjU1b2N0ZXRzOwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czI1Nm9jdGV0c3RvNTExb2N0ZXRzOwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czUxMm9jdGV0c3RvMTAyM29jdGV0czsKLSAgICB1MzIgICAgIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMDI0b2N0ZXRzdG8xNTIyb2N0ZXRzOwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzOwotICAgIHUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzOworCXUzMiAgICAgdHhfc3RhdF9pZmhjb3V0b2N0ZXRzOworCXUzMiAgICAgdHhfc3RhdF9pZmhjb3V0YmFkb2N0ZXRzOworCXUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzY29sbGlzaW9uczsKKwl1MzIgICAgIHR4X3N0YXRfb3V0eG9uc2VudDsKKwl1MzIgICAgIHR4X3N0YXRfb3V0eG9mZnNlbnQ7CisJdTMyICAgICB0eF9zdGF0X2Zsb3djb250cm9sZG9uZTsKKwl1MzIgICAgIHR4X3N0YXRfZG90M3N0YXRzc2luZ2xlY29sbGlzaW9uZnJhbWVzOworCXUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNtdWx0aXBsZWNvbGxpc2lvbmZyYW1lczsKKwl1MzIgICAgIHR4X3N0YXRfZG90M3N0YXRzZGVmZXJyZWR0cmFuc21pc3Npb25zOworCXUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNleGNlc3NpdmVjb2xsaXNpb25zOworCXUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNsYXRlY29sbGlzaW9uczsKKwl1MzIgICAgIHR4X3N0YXRfaWZoY291dHVjYXN0cGt0czsKKwl1MzIgICAgIHR4X3N0YXRfaWZoY291dG11bHRpY2FzdHBrdHM7CisJdTMyICAgICB0eF9zdGF0X2lmaGNvdXRicm9hZGNhc3Rwa3RzOworCXUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY0b2N0ZXRzOworCXUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY1b2N0ZXRzdG8xMjdvY3RldHM7CisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMTI4b2N0ZXRzdG8yNTVvY3RldHM7CisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMjU2b2N0ZXRzdG81MTFvY3RldHM7CisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNTEyb2N0ZXRzdG8xMDIzb2N0ZXRzOworCXUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czEwMjRvY3RldHN0bzE1MjJvY3RldHM7CisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3Rzb3ZlcjE1MjJvY3RldHM7CisJdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2ludGVybmFsbWFjdHJhbnNtaXRlcnJvcnM7CiB9OwogCiAKIHN0cnVjdCBibWFjMV9zdGF0cyB7Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0cGt0X2xvOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndHBrdF9oaTsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3R4cGZfbG87Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0eHBmX2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndGZjc19sbzsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3RmY3NfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0bWNhX2xvOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndG1jYV9oaTsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3RiY2FfbG87Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0YmNhX2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndGZyZ19sbzsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3RmcmdfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0b3ZyX2xvOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndG92cl9oaTsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3Q2NF9sbzsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3Q2NF9oaTsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3QxMjdfbG87Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0MTI3X2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndDI1NV9sbzsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3QyNTVfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0NTExX2xvOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndDUxMV9oaTsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3QxMDIzX2xvOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndDEwMjNfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0MTUxOF9sbzsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3QxNTE4X2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndDIwNDdfbG87Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0MjA0N19oaTsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3Q0MDk1X2xvOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndDQwOTVfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0OTIxNl9sbzsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3Q5MjE2X2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndDE2MzgzX2xvOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndDE2MzgzX2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndG1heF9sbzsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3RtYXhfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0dWZsX2xvOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndHVmbF9oaTsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3RlcnJfbG87Ci0gICAgdTMyICAgICB0eF9zdGF0X2d0ZXJyX2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ndGJ5dF9sbzsKLSAgICB1MzIgICAgIHR4X3N0YXRfZ3RieXRfaGk7CisJdTMyCXR4X3N0YXRfZ3Rwa3RfbG87CisJdTMyCXR4X3N0YXRfZ3Rwa3RfaGk7CisJdTMyCXR4X3N0YXRfZ3R4cGZfbG87CisJdTMyCXR4X3N0YXRfZ3R4cGZfaGk7CisJdTMyCXR4X3N0YXRfZ3RmY3NfbG87CisJdTMyCXR4X3N0YXRfZ3RmY3NfaGk7CisJdTMyCXR4X3N0YXRfZ3RtY2FfbG87CisJdTMyCXR4X3N0YXRfZ3RtY2FfaGk7CisJdTMyCXR4X3N0YXRfZ3RiY2FfbG87CisJdTMyCXR4X3N0YXRfZ3RiY2FfaGk7CisJdTMyCXR4X3N0YXRfZ3RmcmdfbG87CisJdTMyCXR4X3N0YXRfZ3RmcmdfaGk7CisJdTMyCXR4X3N0YXRfZ3RvdnJfbG87CisJdTMyCXR4X3N0YXRfZ3RvdnJfaGk7CisJdTMyCXR4X3N0YXRfZ3Q2NF9sbzsKKwl1MzIJdHhfc3RhdF9ndDY0X2hpOworCXUzMgl0eF9zdGF0X2d0MTI3X2xvOworCXUzMgl0eF9zdGF0X2d0MTI3X2hpOworCXUzMgl0eF9zdGF0X2d0MjU1X2xvOworCXUzMgl0eF9zdGF0X2d0MjU1X2hpOworCXUzMgl0eF9zdGF0X2d0NTExX2xvOworCXUzMgl0eF9zdGF0X2d0NTExX2hpOworCXUzMgl0eF9zdGF0X2d0MTAyM19sbzsKKwl1MzIJdHhfc3RhdF9ndDEwMjNfaGk7CisJdTMyCXR4X3N0YXRfZ3QxNTE4X2xvOworCXUzMgl0eF9zdGF0X2d0MTUxOF9oaTsKKwl1MzIJdHhfc3RhdF9ndDIwNDdfbG87CisJdTMyCXR4X3N0YXRfZ3QyMDQ3X2hpOworCXUzMgl0eF9zdGF0X2d0NDA5NV9sbzsKKwl1MzIJdHhfc3RhdF9ndDQwOTVfaGk7CisJdTMyCXR4X3N0YXRfZ3Q5MjE2X2xvOworCXUzMgl0eF9zdGF0X2d0OTIxNl9oaTsKKwl1MzIJdHhfc3RhdF9ndDE2MzgzX2xvOworCXUzMgl0eF9zdGF0X2d0MTYzODNfaGk7CisJdTMyCXR4X3N0YXRfZ3RtYXhfbG87CisJdTMyCXR4X3N0YXRfZ3RtYXhfaGk7CisJdTMyCXR4X3N0YXRfZ3R1ZmxfbG87CisJdTMyCXR4X3N0YXRfZ3R1ZmxfaGk7CisJdTMyCXR4X3N0YXRfZ3RlcnJfbG87CisJdTMyCXR4X3N0YXRfZ3RlcnJfaGk7CisJdTMyCXR4X3N0YXRfZ3RieXRfbG87CisJdTMyCXR4X3N0YXRfZ3RieXRfaGk7CiAKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3I2NF9sbzsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3I2NF9oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3IxMjdfbG87Ci0gICAgdTMyICAgICByeF9zdGF0X2dyMTI3X2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncjI1NV9sbzsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3IyNTVfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2dyNTExX2xvOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncjUxMV9oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3IxMDIzX2xvOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncjEwMjNfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2dyMTUxOF9sbzsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3IxNTE4X2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncjIwNDdfbG87Ci0gICAgdTMyICAgICByeF9zdGF0X2dyMjA0N19oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3I0MDk1X2xvOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncjQwOTVfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2dyOTIxNl9sbzsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3I5MjE2X2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncjE2MzgzX2xvOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncjE2MzgzX2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncm1heF9sbzsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3JtYXhfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2dycGt0X2xvOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncnBrdF9oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3JmY3NfbG87Ci0gICAgdTMyICAgICByeF9zdGF0X2dyZmNzX2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncm1jYV9sbzsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3JtY2FfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2dyYmNhX2xvOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncmJjYV9oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3J4Y2ZfbG87Ci0gICAgdTMyICAgICByeF9zdGF0X2dyeGNmX2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncnhwZl9sbzsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3J4cGZfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2dyeHVvX2xvOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncnh1b19oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3JqYnJfbG87Ci0gICAgdTMyICAgICByeF9zdGF0X2dyamJyX2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncm92cl9sbzsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3JvdnJfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2dyZmxyX2xvOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncmZscl9oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3JtZWdfbG87Ci0gICAgdTMyICAgICByeF9zdGF0X2dybWVnX2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncm1lYl9sbzsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3JtZWJfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2dyYnl0X2xvOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncmJ5dF9oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3J1bmRfbG87Ci0gICAgdTMyICAgICByeF9zdGF0X2dydW5kX2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncmZyZ19sbzsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3JmcmdfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2dyZXJiX2xvOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncmVyYl9oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3JmcmVfbG87Ci0gICAgdTMyICAgICByeF9zdGF0X2dyZnJlX2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9ncmlwal9sbzsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZ3JpcGpfaGk7CisJdTMyCXJ4X3N0YXRfZ3I2NF9sbzsKKwl1MzIJcnhfc3RhdF9ncjY0X2hpOworCXUzMglyeF9zdGF0X2dyMTI3X2xvOworCXUzMglyeF9zdGF0X2dyMTI3X2hpOworCXUzMglyeF9zdGF0X2dyMjU1X2xvOworCXUzMglyeF9zdGF0X2dyMjU1X2hpOworCXUzMglyeF9zdGF0X2dyNTExX2xvOworCXUzMglyeF9zdGF0X2dyNTExX2hpOworCXUzMglyeF9zdGF0X2dyMTAyM19sbzsKKwl1MzIJcnhfc3RhdF9ncjEwMjNfaGk7CisJdTMyCXJ4X3N0YXRfZ3IxNTE4X2xvOworCXUzMglyeF9zdGF0X2dyMTUxOF9oaTsKKwl1MzIJcnhfc3RhdF9ncjIwNDdfbG87CisJdTMyCXJ4X3N0YXRfZ3IyMDQ3X2hpOworCXUzMglyeF9zdGF0X2dyNDA5NV9sbzsKKwl1MzIJcnhfc3RhdF9ncjQwOTVfaGk7CisJdTMyCXJ4X3N0YXRfZ3I5MjE2X2xvOworCXUzMglyeF9zdGF0X2dyOTIxNl9oaTsKKwl1MzIJcnhfc3RhdF9ncjE2MzgzX2xvOworCXUzMglyeF9zdGF0X2dyMTYzODNfaGk7CisJdTMyCXJ4X3N0YXRfZ3JtYXhfbG87CisJdTMyCXJ4X3N0YXRfZ3JtYXhfaGk7CisJdTMyCXJ4X3N0YXRfZ3Jwa3RfbG87CisJdTMyCXJ4X3N0YXRfZ3Jwa3RfaGk7CisJdTMyCXJ4X3N0YXRfZ3JmY3NfbG87CisJdTMyCXJ4X3N0YXRfZ3JmY3NfaGk7CisJdTMyCXJ4X3N0YXRfZ3JtY2FfbG87CisJdTMyCXJ4X3N0YXRfZ3JtY2FfaGk7CisJdTMyCXJ4X3N0YXRfZ3JiY2FfbG87CisJdTMyCXJ4X3N0YXRfZ3JiY2FfaGk7CisJdTMyCXJ4X3N0YXRfZ3J4Y2ZfbG87CisJdTMyCXJ4X3N0YXRfZ3J4Y2ZfaGk7CisJdTMyCXJ4X3N0YXRfZ3J4cGZfbG87CisJdTMyCXJ4X3N0YXRfZ3J4cGZfaGk7CisJdTMyCXJ4X3N0YXRfZ3J4dW9fbG87CisJdTMyCXJ4X3N0YXRfZ3J4dW9faGk7CisJdTMyCXJ4X3N0YXRfZ3JqYnJfbG87CisJdTMyCXJ4X3N0YXRfZ3JqYnJfaGk7CisJdTMyCXJ4X3N0YXRfZ3JvdnJfbG87CisJdTMyCXJ4X3N0YXRfZ3JvdnJfaGk7CisJdTMyCXJ4X3N0YXRfZ3JmbHJfbG87CisJdTMyCXJ4X3N0YXRfZ3JmbHJfaGk7CisJdTMyCXJ4X3N0YXRfZ3JtZWdfbG87CisJdTMyCXJ4X3N0YXRfZ3JtZWdfaGk7CisJdTMyCXJ4X3N0YXRfZ3JtZWJfbG87CisJdTMyCXJ4X3N0YXRfZ3JtZWJfaGk7CisJdTMyCXJ4X3N0YXRfZ3JieXRfbG87CisJdTMyCXJ4X3N0YXRfZ3JieXRfaGk7CisJdTMyCXJ4X3N0YXRfZ3J1bmRfbG87CisJdTMyCXJ4X3N0YXRfZ3J1bmRfaGk7CisJdTMyCXJ4X3N0YXRfZ3JmcmdfbG87CisJdTMyCXJ4X3N0YXRfZ3JmcmdfaGk7CisJdTMyCXJ4X3N0YXRfZ3JlcmJfbG87CisJdTMyCXJ4X3N0YXRfZ3JlcmJfaGk7CisJdTMyCXJ4X3N0YXRfZ3JmcmVfbG87CisJdTMyCXJ4X3N0YXRfZ3JmcmVfaGk7CisJdTMyCXJ4X3N0YXRfZ3JpcGpfbG87CisJdTMyCXJ4X3N0YXRfZ3JpcGpfaGk7CiB9OwogCiBzdHJ1Y3QgYm1hYzJfc3RhdHMgewpAQCAtMTc1MCwxODcgKzIyMzgsMzE2IEBACiAJdTMyCXJ4X3N0YXRfZ3JpcGpfaGk7CiB9OwogCitzdHJ1Y3QgbXN0YXRfc3RhdHMgeworCXN0cnVjdCB7CisJCS8qIE9URSBNU1RBVCBvbiBFMyBoYXMgYSBidWcgd2hlcmUgdGhpcyByZWdpc3RlcidzIGNvbnRlbnRzIGFyZQorCQkgKiBhY3R1YWxseSB0eF9ndHhwb2sgKyB0eF9ndHhwZiArIChwb3NzaWJseSl0eF9ndHhwcAorCQkgKi8KKwkJdTMyIHR4X2d0eHBva19sbzsKKwkJdTMyIHR4X2d0eHBva19oaTsKKwkJdTMyIHR4X2d0eHBmX2xvOworCQl1MzIgdHhfZ3R4cGZfaGk7CisJCXUzMiB0eF9ndHhwcF9sbzsKKwkJdTMyIHR4X2d0eHBwX2hpOworCQl1MzIgdHhfZ3RmY3NfbG87CisJCXUzMiB0eF9ndGZjc19oaTsKKwkJdTMyIHR4X2d0dWNhX2xvOworCQl1MzIgdHhfZ3R1Y2FfaGk7CisJCXUzMiB0eF9ndG1jYV9sbzsKKwkJdTMyIHR4X2d0bWNhX2hpOworCQl1MzIgdHhfZ3RnY2FfbG87CisJCXUzMiB0eF9ndGdjYV9oaTsKKwkJdTMyIHR4X2d0cGt0X2xvOworCQl1MzIgdHhfZ3Rwa3RfaGk7CisJCXUzMiB0eF9ndDY0X2xvOworCQl1MzIgdHhfZ3Q2NF9oaTsKKwkJdTMyIHR4X2d0MTI3X2xvOworCQl1MzIgdHhfZ3QxMjdfaGk7CisJCXUzMiB0eF9ndDI1NV9sbzsKKwkJdTMyIHR4X2d0MjU1X2hpOworCQl1MzIgdHhfZ3Q1MTFfbG87CisJCXUzMiB0eF9ndDUxMV9oaTsKKwkJdTMyIHR4X2d0MTAyM19sbzsKKwkJdTMyIHR4X2d0MTAyM19oaTsKKwkJdTMyIHR4X2d0MTUxOF9sbzsKKwkJdTMyIHR4X2d0MTUxOF9oaTsKKwkJdTMyIHR4X2d0MjA0N19sbzsKKwkJdTMyIHR4X2d0MjA0N19oaTsKKwkJdTMyIHR4X2d0NDA5NV9sbzsKKwkJdTMyIHR4X2d0NDA5NV9oaTsKKwkJdTMyIHR4X2d0OTIxNl9sbzsKKwkJdTMyIHR4X2d0OTIxNl9oaTsKKwkJdTMyIHR4X2d0MTYzODNfbG87CisJCXUzMiB0eF9ndDE2MzgzX2hpOworCQl1MzIgdHhfZ3R1ZmxfbG87CisJCXUzMiB0eF9ndHVmbF9oaTsKKwkJdTMyIHR4X2d0ZXJyX2xvOworCQl1MzIgdHhfZ3RlcnJfaGk7CisJCXUzMiB0eF9ndGJ5dF9sbzsKKwkJdTMyIHR4X2d0Ynl0X2hpOworCQl1MzIgdHhfY29sbGlzaW9uc19sbzsKKwkJdTMyIHR4X2NvbGxpc2lvbnNfaGk7CisJCXUzMiB0eF9zaW5nbGVjb2xsaXNpb25fbG87CisJCXUzMiB0eF9zaW5nbGVjb2xsaXNpb25faGk7CisJCXUzMiB0eF9tdWx0aXBsZWNvbGxpc2lvbnNfbG87CisJCXUzMiB0eF9tdWx0aXBsZWNvbGxpc2lvbnNfaGk7CisJCXUzMiB0eF9kZWZlcnJlZF9sbzsKKwkJdTMyIHR4X2RlZmVycmVkX2hpOworCQl1MzIgdHhfZXhjZXNzaXZlY29sbGlzaW9uc19sbzsKKwkJdTMyIHR4X2V4Y2Vzc2l2ZWNvbGxpc2lvbnNfaGk7CisJCXUzMiB0eF9sYXRlY29sbGlzaW9uc19sbzsKKwkJdTMyIHR4X2xhdGVjb2xsaXNpb25zX2hpOworCX0gc3RhdHNfdHg7CisKKwlzdHJ1Y3QgeworCQl1MzIgcnhfZ3I2NF9sbzsKKwkJdTMyIHJ4X2dyNjRfaGk7CisJCXUzMiByeF9ncjEyN19sbzsKKwkJdTMyIHJ4X2dyMTI3X2hpOworCQl1MzIgcnhfZ3IyNTVfbG87CisJCXUzMiByeF9ncjI1NV9oaTsKKwkJdTMyIHJ4X2dyNTExX2xvOworCQl1MzIgcnhfZ3I1MTFfaGk7CisJCXUzMiByeF9ncjEwMjNfbG87CisJCXUzMiByeF9ncjEwMjNfaGk7CisJCXUzMiByeF9ncjE1MThfbG87CisJCXUzMiByeF9ncjE1MThfaGk7CisJCXUzMiByeF9ncjIwNDdfbG87CisJCXUzMiByeF9ncjIwNDdfaGk7CisJCXUzMiByeF9ncjQwOTVfbG87CisJCXUzMiByeF9ncjQwOTVfaGk7CisJCXUzMiByeF9ncjkyMTZfbG87CisJCXUzMiByeF9ncjkyMTZfaGk7CisJCXUzMiByeF9ncjE2MzgzX2xvOworCQl1MzIgcnhfZ3IxNjM4M19oaTsKKwkJdTMyIHJ4X2dycGt0X2xvOworCQl1MzIgcnhfZ3Jwa3RfaGk7CisJCXUzMiByeF9ncmZjc19sbzsKKwkJdTMyIHJ4X2dyZmNzX2hpOworCQl1MzIgcnhfZ3J1Y2FfbG87CisJCXUzMiByeF9ncnVjYV9oaTsKKwkJdTMyIHJ4X2dybWNhX2xvOworCQl1MzIgcnhfZ3JtY2FfaGk7CisJCXUzMiByeF9ncmJjYV9sbzsKKwkJdTMyIHJ4X2dyYmNhX2hpOworCQl1MzIgcnhfZ3J4cGZfbG87CisJCXUzMiByeF9ncnhwZl9oaTsKKwkJdTMyIHJ4X2dyeHBwX2xvOworCQl1MzIgcnhfZ3J4cHBfaGk7CisJCXUzMiByeF9ncnh1b19sbzsKKwkJdTMyIHJ4X2dyeHVvX2hpOworCQl1MzIgcnhfZ3JvdnJfbG87CisJCXUzMiByeF9ncm92cl9oaTsKKwkJdTMyIHJ4X2dyeGNmX2xvOworCQl1MzIgcnhfZ3J4Y2ZfaGk7CisJCXUzMiByeF9ncmZscl9sbzsKKwkJdTMyIHJ4X2dyZmxyX2hpOworCQl1MzIgcnhfZ3Jwb2tfbG87CisJCXUzMiByeF9ncnBva19oaTsKKwkJdTMyIHJ4X2dyYnl0X2xvOworCQl1MzIgcnhfZ3JieXRfaGk7CisJCXUzMiByeF9ncnVuZF9sbzsKKwkJdTMyIHJ4X2dydW5kX2hpOworCQl1MzIgcnhfZ3JmcmdfbG87CisJCXUzMiByeF9ncmZyZ19oaTsKKwkJdTMyIHJ4X2dyZXJiX2xvOworCQl1MzIgcnhfZ3JlcmJfaGk7CisJCXUzMiByeF9ncmZyZV9sbzsKKwkJdTMyIHJ4X2dyZnJlX2hpOworCisJCXUzMiByeF9hbGlnbm1lbnRlcnJvcnNfbG87CisJCXUzMiByeF9hbGlnbm1lbnRlcnJvcnNfaGk7CisJCXUzMiByeF9mYWxzZWNhcnJpZXJfbG87CisJCXUzMiByeF9mYWxzZWNhcnJpZXJfaGk7CisJCXUzMiByeF9sbGZjbXNnY250X2xvOworCQl1MzIgcnhfbGxmY21zZ2NudF9oaTsKKwl9IHN0YXRzX3J4OworfTsKKwogdW5pb24gbWFjX3N0YXRzIHsKLQlzdHJ1Y3QgZW1hY19zdGF0cwkgZW1hY19zdGF0czsKLQlzdHJ1Y3QgYm1hYzFfc3RhdHMJIGJtYWMxX3N0YXRzOwotCXN0cnVjdCBibWFjMl9zdGF0cwkgYm1hYzJfc3RhdHM7CisJc3RydWN0IGVtYWNfc3RhdHMJZW1hY19zdGF0czsKKwlzdHJ1Y3QgYm1hYzFfc3RhdHMJYm1hYzFfc3RhdHM7CisJc3RydWN0IGJtYWMyX3N0YXRzCWJtYWMyX3N0YXRzOworCXN0cnVjdCBtc3RhdF9zdGF0cwltc3RhdF9zdGF0czsKIH07CiAKIAogc3RydWN0IG1hY19zdHggewotICAgIC8qIGluX2JhZF9vY3RldHMgKi8KLSAgICB1MzIgICAgIHJ4X3N0YXRfaWZoY2luYmFkb2N0ZXRzX2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9pZmhjaW5iYWRvY3RldHNfbG87CisJLyogaW5fYmFkX29jdGV0cyAqLworCXUzMiAgICAgcnhfc3RhdF9pZmhjaW5iYWRvY3RldHNfaGk7CisJdTMyICAgICByeF9zdGF0X2lmaGNpbmJhZG9jdGV0c19sbzsKIAotICAgIC8qIG91dF9iYWRfb2N0ZXRzICovCi0gICAgdTMyICAgICB0eF9zdGF0X2lmaGNvdXRiYWRvY3RldHNfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2lmaGNvdXRiYWRvY3RldHNfbG87CisJLyogb3V0X2JhZF9vY3RldHMgKi8KKwl1MzIgICAgIHR4X3N0YXRfaWZoY291dGJhZG9jdGV0c19oaTsKKwl1MzIgICAgIHR4X3N0YXRfaWZoY291dGJhZG9jdGV0c19sbzsKIAotICAgIC8qIGNyY19yZWNlaXZlX2Vycm9ycyAqLwotICAgIHUzMiAgICAgcnhfc3RhdF9kb3Qzc3RhdHNmY3NlcnJvcnNfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2RvdDNzdGF0c2Zjc2Vycm9yc19sbzsKLSAgICAvKiBhbGlnbm1lbnRfZXJyb3JzICovCi0gICAgdTMyICAgICByeF9zdGF0X2RvdDNzdGF0c2FsaWdubWVudGVycm9yc19oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZG90M3N0YXRzYWxpZ25tZW50ZXJyb3JzX2xvOwotICAgIC8qIGNhcnJpZXJfc2Vuc2VfZXJyb3JzICovCi0gICAgdTMyICAgICByeF9zdGF0X2RvdDNzdGF0c2NhcnJpZXJzZW5zZWVycm9yc19oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfZG90M3N0YXRzY2FycmllcnNlbnNlZXJyb3JzX2xvOwotICAgIC8qIGZhbHNlX2NhcnJpZXJfZGV0ZWN0aW9ucyAqLwotICAgIHUzMiAgICAgcnhfc3RhdF9mYWxzZWNhcnJpZXJlcnJvcnNfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2ZhbHNlY2FycmllcmVycm9yc19sbzsKKwkvKiBjcmNfcmVjZWl2ZV9lcnJvcnMgKi8KKwl1MzIgICAgIHJ4X3N0YXRfZG90M3N0YXRzZmNzZXJyb3JzX2hpOworCXUzMiAgICAgcnhfc3RhdF9kb3Qzc3RhdHNmY3NlcnJvcnNfbG87CisJLyogYWxpZ25tZW50X2Vycm9ycyAqLworCXUzMiAgICAgcnhfc3RhdF9kb3Qzc3RhdHNhbGlnbm1lbnRlcnJvcnNfaGk7CisJdTMyICAgICByeF9zdGF0X2RvdDNzdGF0c2FsaWdubWVudGVycm9yc19sbzsKKwkvKiBjYXJyaWVyX3NlbnNlX2Vycm9ycyAqLworCXUzMiAgICAgcnhfc3RhdF9kb3Qzc3RhdHNjYXJyaWVyc2Vuc2VlcnJvcnNfaGk7CisJdTMyICAgICByeF9zdGF0X2RvdDNzdGF0c2NhcnJpZXJzZW5zZWVycm9yc19sbzsKKwkvKiBmYWxzZV9jYXJyaWVyX2RldGVjdGlvbnMgKi8KKwl1MzIgICAgIHJ4X3N0YXRfZmFsc2VjYXJyaWVyZXJyb3JzX2hpOworCXUzMiAgICAgcnhfc3RhdF9mYWxzZWNhcnJpZXJlcnJvcnNfbG87CiAKLSAgICAvKiBydW50X3BhY2tldHNfcmVjZWl2ZWQgKi8KLSAgICB1MzIgICAgIHJ4X3N0YXRfZXRoZXJzdGF0c3VuZGVyc2l6ZXBrdHNfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHN1bmRlcnNpemVwa3RzX2xvOwotICAgIC8qIGphYmJlcl9wYWNrZXRzX3JlY2VpdmVkICovCi0gICAgdTMyICAgICByeF9zdGF0X2RvdDNzdGF0c2ZyYW1lc3Rvb2xvbmdfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2RvdDNzdGF0c2ZyYW1lc3Rvb2xvbmdfbG87CisJLyogcnVudF9wYWNrZXRzX3JlY2VpdmVkICovCisJdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHN1bmRlcnNpemVwa3RzX2hpOworCXUzMiAgICAgcnhfc3RhdF9ldGhlcnN0YXRzdW5kZXJzaXplcGt0c19sbzsKKwkvKiBqYWJiZXJfcGFja2V0c19yZWNlaXZlZCAqLworCXUzMiAgICAgcnhfc3RhdF9kb3Qzc3RhdHNmcmFtZXN0b29sb25nX2hpOworCXUzMiAgICAgcnhfc3RhdF9kb3Qzc3RhdHNmcmFtZXN0b29sb25nX2xvOwogCi0gICAgLyogZXJyb3JfcnVudF9wYWNrZXRzX3JlY2VpdmVkICovCi0gICAgdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNmcmFnbWVudHNfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNmcmFnbWVudHNfbG87Ci0gICAgLyogZXJyb3JfamFiYmVyX3BhY2tldHNfcmVjZWl2ZWQgKi8KLSAgICB1MzIgICAgIHJ4X3N0YXRfZXRoZXJzdGF0c2phYmJlcnNfaGk7Ci0gICAgdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNqYWJiZXJzX2xvOworCS8qIGVycm9yX3J1bnRfcGFja2V0c19yZWNlaXZlZCAqLworCXUzMiAgICAgcnhfc3RhdF9ldGhlcnN0YXRzZnJhZ21lbnRzX2hpOworCXUzMiAgICAgcnhfc3RhdF9ldGhlcnN0YXRzZnJhZ21lbnRzX2xvOworCS8qIGVycm9yX2phYmJlcl9wYWNrZXRzX3JlY2VpdmVkICovCisJdTMyICAgICByeF9zdGF0X2V0aGVyc3RhdHNqYWJiZXJzX2hpOworCXUzMiAgICAgcnhfc3RhdF9ldGhlcnN0YXRzamFiYmVyc19sbzsKIAotICAgIC8qIGNvbnRyb2xfZnJhbWVzX3JlY2VpdmVkICovCi0gICAgdTMyICAgICByeF9zdGF0X21hY2NvbnRyb2xmcmFtZXNyZWNlaXZlZF9oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfbWFjY29udHJvbGZyYW1lc3JlY2VpdmVkX2xvOwotICAgIHUzMiAgICAgcnhfc3RhdF9ibWFjX3hwZl9oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfYm1hY194cGZfbG87Ci0gICAgdTMyICAgICByeF9zdGF0X2JtYWNfeGNmX2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF9ibWFjX3hjZl9sbzsKKwkvKiBjb250cm9sX2ZyYW1lc19yZWNlaXZlZCAqLworCXUzMiAgICAgcnhfc3RhdF9tYWNjb250cm9sZnJhbWVzcmVjZWl2ZWRfaGk7CisJdTMyICAgICByeF9zdGF0X21hY2NvbnRyb2xmcmFtZXNyZWNlaXZlZF9sbzsKKwl1MzIgICAgIHJ4X3N0YXRfbWFjX3hwZl9oaTsKKwl1MzIgICAgIHJ4X3N0YXRfbWFjX3hwZl9sbzsKKwl1MzIgICAgIHJ4X3N0YXRfbWFjX3hjZl9oaTsKKwl1MzIgICAgIHJ4X3N0YXRfbWFjX3hjZl9sbzsKIAotICAgIC8qIHhvZmZfc3RhdGVfZW50ZXJlZCAqLwotICAgIHUzMiAgICAgcnhfc3RhdF94b2Zmc3RhdGVlbnRlcmVkX2hpOwotICAgIHUzMiAgICAgcnhfc3RhdF94b2Zmc3RhdGVlbnRlcmVkX2xvOwotICAgIC8qIHBhdXNlX3hvbl9mcmFtZXNfcmVjZWl2ZWQgKi8KLSAgICB1MzIgICAgIHJ4X3N0YXRfeG9ucGF1c2VmcmFtZXNyZWNlaXZlZF9oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfeG9ucGF1c2VmcmFtZXNyZWNlaXZlZF9sbzsKLSAgICAvKiBwYXVzZV94b2ZmX2ZyYW1lc19yZWNlaXZlZCAqLwotICAgIHUzMiAgICAgcnhfc3RhdF94b2ZmcGF1c2VmcmFtZXNyZWNlaXZlZF9oaTsKLSAgICB1MzIgICAgIHJ4X3N0YXRfeG9mZnBhdXNlZnJhbWVzcmVjZWl2ZWRfbG87Ci0gICAgLyogcGF1c2VfeG9uX2ZyYW1lc190cmFuc21pdHRlZCAqLwotICAgIHUzMiAgICAgdHhfc3RhdF9vdXR4b25zZW50X2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9vdXR4b25zZW50X2xvOwotICAgIC8qIHBhdXNlX3hvZmZfZnJhbWVzX3RyYW5zbWl0dGVkICovCi0gICAgdTMyICAgICB0eF9zdGF0X291dHhvZmZzZW50X2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9vdXR4b2Zmc2VudF9sbzsKLSAgICAvKiBmbG93X2NvbnRyb2xfZG9uZSAqLwotICAgIHUzMiAgICAgdHhfc3RhdF9mbG93Y29udHJvbGRvbmVfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2Zsb3djb250cm9sZG9uZV9sbzsKKwkvKiB4b2ZmX3N0YXRlX2VudGVyZWQgKi8KKwl1MzIgICAgIHJ4X3N0YXRfeG9mZnN0YXRlZW50ZXJlZF9oaTsKKwl1MzIgICAgIHJ4X3N0YXRfeG9mZnN0YXRlZW50ZXJlZF9sbzsKKwkvKiBwYXVzZV94b25fZnJhbWVzX3JlY2VpdmVkICovCisJdTMyICAgICByeF9zdGF0X3hvbnBhdXNlZnJhbWVzcmVjZWl2ZWRfaGk7CisJdTMyICAgICByeF9zdGF0X3hvbnBhdXNlZnJhbWVzcmVjZWl2ZWRfbG87CisJLyogcGF1c2VfeG9mZl9mcmFtZXNfcmVjZWl2ZWQgKi8KKwl1MzIgICAgIHJ4X3N0YXRfeG9mZnBhdXNlZnJhbWVzcmVjZWl2ZWRfaGk7CisJdTMyICAgICByeF9zdGF0X3hvZmZwYXVzZWZyYW1lc3JlY2VpdmVkX2xvOworCS8qIHBhdXNlX3hvbl9mcmFtZXNfdHJhbnNtaXR0ZWQgKi8KKwl1MzIgICAgIHR4X3N0YXRfb3V0eG9uc2VudF9oaTsKKwl1MzIgICAgIHR4X3N0YXRfb3V0eG9uc2VudF9sbzsKKwkvKiBwYXVzZV94b2ZmX2ZyYW1lc190cmFuc21pdHRlZCAqLworCXUzMiAgICAgdHhfc3RhdF9vdXR4b2Zmc2VudF9oaTsKKwl1MzIgICAgIHR4X3N0YXRfb3V0eG9mZnNlbnRfbG87CisJLyogZmxvd19jb250cm9sX2RvbmUgKi8KKwl1MzIgICAgIHR4X3N0YXRfZmxvd2NvbnRyb2xkb25lX2hpOworCXUzMiAgICAgdHhfc3RhdF9mbG93Y29udHJvbGRvbmVfbG87CiAKLSAgICAvKiBldGhlcl9zdGF0c19jb2xsaXNpb25zICovCi0gICAgdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNjb2xsaXNpb25zX2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzY29sbGlzaW9uc19sbzsKLSAgICAvKiBzaW5nbGVfY29sbGlzaW9uX3RyYW5zbWl0X2ZyYW1lcyAqLwotICAgIHUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNzaW5nbGVjb2xsaXNpb25mcmFtZXNfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c3NpbmdsZWNvbGxpc2lvbmZyYW1lc19sbzsKLSAgICAvKiBtdWx0aXBsZV9jb2xsaXNpb25fdHJhbnNtaXRfZnJhbWVzICovCi0gICAgdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c211bHRpcGxlY29sbGlzaW9uZnJhbWVzX2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNtdWx0aXBsZWNvbGxpc2lvbmZyYW1lc19sbzsKLSAgICAvKiBkZWZlcnJlZF90cmFuc21pc3Npb25zICovCi0gICAgdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2RlZmVycmVkdHJhbnNtaXNzaW9uc19oaTsKLSAgICB1MzIgICAgIHR4X3N0YXRfZG90M3N0YXRzZGVmZXJyZWR0cmFuc21pc3Npb25zX2xvOwotICAgIC8qIGV4Y2Vzc2l2ZV9jb2xsaXNpb25fZnJhbWVzICovCi0gICAgdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2V4Y2Vzc2l2ZWNvbGxpc2lvbnNfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2V4Y2Vzc2l2ZWNvbGxpc2lvbnNfbG87Ci0gICAgLyogbGF0ZV9jb2xsaXNpb25fZnJhbWVzICovCi0gICAgdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2xhdGVjb2xsaXNpb25zX2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNsYXRlY29sbGlzaW9uc19sbzsKKwkvKiBldGhlcl9zdGF0c19jb2xsaXNpb25zICovCisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNjb2xsaXNpb25zX2hpOworCXUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzY29sbGlzaW9uc19sbzsKKwkvKiBzaW5nbGVfY29sbGlzaW9uX3RyYW5zbWl0X2ZyYW1lcyAqLworCXUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNzaW5nbGVjb2xsaXNpb25mcmFtZXNfaGk7CisJdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c3NpbmdsZWNvbGxpc2lvbmZyYW1lc19sbzsKKwkvKiBtdWx0aXBsZV9jb2xsaXNpb25fdHJhbnNtaXRfZnJhbWVzICovCisJdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c211bHRpcGxlY29sbGlzaW9uZnJhbWVzX2hpOworCXUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNtdWx0aXBsZWNvbGxpc2lvbmZyYW1lc19sbzsKKwkvKiBkZWZlcnJlZF90cmFuc21pc3Npb25zICovCisJdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2RlZmVycmVkdHJhbnNtaXNzaW9uc19oaTsKKwl1MzIgICAgIHR4X3N0YXRfZG90M3N0YXRzZGVmZXJyZWR0cmFuc21pc3Npb25zX2xvOworCS8qIGV4Y2Vzc2l2ZV9jb2xsaXNpb25fZnJhbWVzICovCisJdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2V4Y2Vzc2l2ZWNvbGxpc2lvbnNfaGk7CisJdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2V4Y2Vzc2l2ZWNvbGxpc2lvbnNfbG87CisJLyogbGF0ZV9jb2xsaXNpb25fZnJhbWVzICovCisJdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2xhdGVjb2xsaXNpb25zX2hpOworCXUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNsYXRlY29sbGlzaW9uc19sbzsKIAotICAgIC8qIGZyYW1lc190cmFuc21pdHRlZF82NF9ieXRlcyAqLwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY0b2N0ZXRzX2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY0b2N0ZXRzX2xvOwotICAgIC8qIGZyYW1lc190cmFuc21pdHRlZF82NV8xMjdfYnl0ZXMgKi8KLSAgICB1MzIgICAgIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NW9jdGV0c3RvMTI3b2N0ZXRzX2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY1b2N0ZXRzdG8xMjdvY3RldHNfbG87Ci0gICAgLyogZnJhbWVzX3RyYW5zbWl0dGVkXzEyOF8yNTVfYnl0ZXMgKi8KLSAgICB1MzIgICAgIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMjhvY3RldHN0bzI1NW9jdGV0c19oaTsKLSAgICB1MzIgICAgIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMjhvY3RldHN0bzI1NW9jdGV0c19sbzsKLSAgICAvKiBmcmFtZXNfdHJhbnNtaXR0ZWRfMjU2XzUxMV9ieXRlcyAqLwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czI1Nm9jdGV0c3RvNTExb2N0ZXRzX2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czI1Nm9jdGV0c3RvNTExb2N0ZXRzX2xvOwotICAgIC8qIGZyYW1lc190cmFuc21pdHRlZF81MTJfMTAyM19ieXRlcyAqLwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czUxMm9jdGV0c3RvMTAyM29jdGV0c19oaTsKLSAgICB1MzIgICAgIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM1MTJvY3RldHN0bzEwMjNvY3RldHNfbG87Ci0gICAgLyogZnJhbWVzX3RyYW5zbWl0dGVkXzEwMjRfMTUyMl9ieXRlcyAqLwotICAgIHUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czEwMjRvY3RldHN0bzE1MjJvY3RldHNfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMTAyNG9jdGV0c3RvMTUyMm9jdGV0c19sbzsKLSAgICAvKiBmcmFtZXNfdHJhbnNtaXR0ZWRfMTUyM185MDIyX2J5dGVzICovCi0gICAgdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3Rzb3ZlcjE1MjJvY3RldHNfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3Rzb3ZlcjE1MjJvY3RldHNfbG87Ci0gICAgdTMyICAgICB0eF9zdGF0X2JtYWNfMjA0N19oaTsKLSAgICB1MzIgICAgIHR4X3N0YXRfYm1hY18yMDQ3X2xvOwotICAgIHUzMiAgICAgdHhfc3RhdF9ibWFjXzQwOTVfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2JtYWNfNDA5NV9sbzsKLSAgICB1MzIgICAgIHR4X3N0YXRfYm1hY185MjE2X2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ibWFjXzkyMTZfbG87Ci0gICAgdTMyICAgICB0eF9zdGF0X2JtYWNfMTYzODNfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2JtYWNfMTYzODNfbG87CisJLyogZnJhbWVzX3RyYW5zbWl0dGVkXzY0X2J5dGVzICovCisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNjRvY3RldHNfaGk7CisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNjRvY3RldHNfbG87CisJLyogZnJhbWVzX3RyYW5zbWl0dGVkXzY1XzEyN19ieXRlcyAqLworCXUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY1b2N0ZXRzdG8xMjdvY3RldHNfaGk7CisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNjVvY3RldHN0bzEyN29jdGV0c19sbzsKKwkvKiBmcmFtZXNfdHJhbnNtaXR0ZWRfMTI4XzI1NV9ieXRlcyAqLworCXUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czEyOG9jdGV0c3RvMjU1b2N0ZXRzX2hpOworCXUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czEyOG9jdGV0c3RvMjU1b2N0ZXRzX2xvOworCS8qIGZyYW1lc190cmFuc21pdHRlZF8yNTZfNTExX2J5dGVzICovCisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMjU2b2N0ZXRzdG81MTFvY3RldHNfaGk7CisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMjU2b2N0ZXRzdG81MTFvY3RldHNfbG87CisJLyogZnJhbWVzX3RyYW5zbWl0dGVkXzUxMl8xMDIzX2J5dGVzICovCisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNTEyb2N0ZXRzdG8xMDIzb2N0ZXRzX2hpOworCXUzMiAgICAgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czUxMm9jdGV0c3RvMTAyM29jdGV0c19sbzsKKwkvKiBmcmFtZXNfdHJhbnNtaXR0ZWRfMTAyNF8xNTIyX2J5dGVzICovCisJdTMyICAgICB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMTAyNG9jdGV0c3RvMTUyMm9jdGV0c19oaTsKKwl1MzIgICAgIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMDI0b2N0ZXRzdG8xNTIyb2N0ZXRzX2xvOworCS8qIGZyYW1lc190cmFuc21pdHRlZF8xNTIzXzkwMjJfYnl0ZXMgKi8KKwl1MzIgICAgIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHNvdmVyMTUyMm9jdGV0c19oaTsKKwl1MzIgICAgIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHNvdmVyMTUyMm9jdGV0c19sbzsKKwl1MzIgICAgIHR4X3N0YXRfbWFjXzIwNDdfaGk7CisJdTMyICAgICB0eF9zdGF0X21hY18yMDQ3X2xvOworCXUzMiAgICAgdHhfc3RhdF9tYWNfNDA5NV9oaTsKKwl1MzIgICAgIHR4X3N0YXRfbWFjXzQwOTVfbG87CisJdTMyICAgICB0eF9zdGF0X21hY185MjE2X2hpOworCXUzMiAgICAgdHhfc3RhdF9tYWNfOTIxNl9sbzsKKwl1MzIgICAgIHR4X3N0YXRfbWFjXzE2MzgzX2hpOworCXUzMiAgICAgdHhfc3RhdF9tYWNfMTYzODNfbG87CiAKLSAgICAvKiBpbnRlcm5hbF9tYWNfdHJhbnNtaXRfZXJyb3JzICovCi0gICAgdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2ludGVybmFsbWFjdHJhbnNtaXRlcnJvcnNfaGk7Ci0gICAgdTMyICAgICB0eF9zdGF0X2RvdDNzdGF0c2ludGVybmFsbWFjdHJhbnNtaXRlcnJvcnNfbG87CisJLyogaW50ZXJuYWxfbWFjX3RyYW5zbWl0X2Vycm9ycyAqLworCXUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzX2hpOworCXUzMiAgICAgdHhfc3RhdF9kb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzX2xvOwogCi0gICAgLyogaWZfb3V0X2Rpc2NhcmRzICovCi0gICAgdTMyICAgICB0eF9zdGF0X2JtYWNfdWZsX2hpOwotICAgIHUzMiAgICAgdHhfc3RhdF9ibWFjX3VmbF9sbzsKKwkvKiBpZl9vdXRfZGlzY2FyZHMgKi8KKwl1MzIgICAgIHR4X3N0YXRfbWFjX3VmbF9oaTsKKwl1MzIgICAgIHR4X3N0YXRfbWFjX3VmbF9sbzsKIH07CiAKIAotI2RlZmluZSBNQUNfU1RYX0lEWF9NQVggCQkgICAgMgorI2RlZmluZSBNQUNfU1RYX0lEWF9NQVggICAgICAgICAgICAgICAgICAgICAyCiAKIHN0cnVjdCBob3N0X3BvcnRfc3RhdHMgewotICAgIHUzMiAJICAgaG9zdF9wb3J0X3N0YXRzX3N0YXJ0OworCXUzMiAgICAgICAgICAgIGhvc3RfcG9ydF9zdGF0c19zdGFydDsKIAotICAgIHN0cnVjdCBtYWNfc3R4IG1hY19zdHhbTUFDX1NUWF9JRFhfTUFYXTsKKwlzdHJ1Y3QgbWFjX3N0eCBtYWNfc3R4W01BQ19TVFhfSURYX01BWF07CiAKLSAgICB1MzIgCSAgIGJyYl9kcm9wX2hpOwotICAgIHUzMiAJICAgYnJiX2Ryb3BfbG87CisJdTMyICAgICAgICAgICAgYnJiX2Ryb3BfaGk7CisJdTMyICAgICAgICAgICAgYnJiX2Ryb3BfbG87CiAKLSAgICB1MzIgCSAgIGhvc3RfcG9ydF9zdGF0c19lbmQ7CisJdTMyICAgICAgICAgICAgaG9zdF9wb3J0X3N0YXRzX2VuZDsKIH07CiAKIAogc3RydWN0IGhvc3RfZnVuY19zdGF0cyB7Ci0gICAgdTMyICAgICBob3N0X2Z1bmNfc3RhdHNfc3RhcnQ7CisJdTMyICAgICBob3N0X2Z1bmNfc3RhdHNfc3RhcnQ7CiAKLSAgICB1MzIgICAgIHRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpOwotICAgIHUzMiAgICAgdG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG87CisJdTMyICAgICB0b3RhbF9ieXRlc19yZWNlaXZlZF9oaTsKKwl1MzIgICAgIHRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvOwogCi0gICAgdTMyICAgICB0b3RhbF9ieXRlc190cmFuc21pdHRlZF9oaTsKLSAgICB1MzIgICAgIHRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2xvOworCXUzMiAgICAgdG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfaGk7CisJdTMyICAgICB0b3RhbF9ieXRlc190cmFuc21pdHRlZF9sbzsKIAotICAgIHUzMiAgICAgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpOwotICAgIHUzMiAgICAgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvOworCXUzMiAgICAgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpOworCXUzMiAgICAgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvOwogCi0gICAgdTMyICAgICB0b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaTsKLSAgICB1MzIgICAgIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvOworCXUzMiAgICAgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGk7CisJdTMyICAgICB0b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9sbzsKIAotICAgIHUzMiAgICAgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGk7Ci0gICAgdTMyICAgICB0b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZF9sbzsKKwl1MzIgICAgIHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpOworCXUzMiAgICAgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfcmVjZWl2ZWRfbG87CiAKLSAgICB1MzIgICAgIHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaTsKLSAgICB1MzIgICAgIHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbzsKKwl1MzIgICAgIHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaTsKKwl1MzIgICAgIHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbzsKIAotICAgIHUzMiAgICAgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGk7Ci0gICAgdTMyICAgICB0b3RhbF9tdWx0aWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbzsKKwl1MzIgICAgIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpOworCXUzMiAgICAgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG87CiAKLSAgICB1MzIgICAgIHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpOwotICAgIHUzMiAgICAgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG87CisJdTMyICAgICB0b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaTsKKwl1MzIgICAgIHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvOwogCi0gICAgdTMyICAgICB2YWxpZF9ieXRlc19yZWNlaXZlZF9oaTsKLSAgICB1MzIgICAgIHZhbGlkX2J5dGVzX3JlY2VpdmVkX2xvOworCXUzMiAgICAgdmFsaWRfYnl0ZXNfcmVjZWl2ZWRfaGk7CisJdTMyICAgICB2YWxpZF9ieXRlc19yZWNlaXZlZF9sbzsKIAotICAgIHUzMiAgICAgaG9zdF9mdW5jX3N0YXRzX2VuZDsKKwl1MzIgICAgIGhvc3RfZnVuY19zdGF0c19lbmQ7CiB9OwogCisvKiBWSUMgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVklDU1RBVFNUX1VJRl9JTkRFWCAyCiAKLSNkZWZpbmUgQkNNXzU3MTBfRldfTUFKT1JfVkVSU0lPTgkJCTYKLSNkZWZpbmUgQkNNXzU3MTBfRldfTUlOT1JfVkVSU0lPTgkJCTIKLSNkZWZpbmUgQkNNXzU3MTBfRldfUkVWSVNJT05fVkVSU0lPTgkJCTkKLSNkZWZpbmUgQkNNXzU3MTBfRldfRU5HSU5FRVJJTkdfVkVSU0lPTgkJCTAKKyNkZWZpbmUgQkNNXzU3MTBfRldfTUFKT1JfVkVSU0lPTgkJCTcKKyNkZWZpbmUgQkNNXzU3MTBfRldfTUlOT1JfVkVSU0lPTgkJCTAKKyNkZWZpbmUgQkNNXzU3MTBfRldfUkVWSVNJT05fVkVSU0lPTgkJMjMKKyNkZWZpbmUgQkNNXzU3MTBfRldfRU5HSU5FRVJJTkdfVkVSU0lPTgkJMAogI2RlZmluZSBCQ01fNTcxMF9GV19DT01QSUxFX0ZMQUdTCQkJMQogCiAKQEAgLTE5NDgsNiArMjU2NSwxMTUgQEAKIAogCiAvKgorICogVGhlIGV0aCBhZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIENzdG9ybQorICovCitzdHJ1Y3QgY3N0b3JtX2V0aF9hZ19jb250ZXh0IHsKKwl1MzIgX19yZXNlcnZlZDBbMTBdOworfTsKKworCisvKgorICogZG1hZSBjb21tYW5kIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgZG1hZV9jb21tYW5kIHsKKwl1MzIgb3Bjb2RlOworI2RlZmluZSBETUFFX0NPTU1BTkRfU1JDICgweDE8PDApCisjZGVmaW5lIERNQUVfQ09NTUFORF9TUkNfU0hJRlQgMAorI2RlZmluZSBETUFFX0NPTU1BTkRfRFNUICgweDM8PDEpCisjZGVmaW5lIERNQUVfQ09NTUFORF9EU1RfU0hJRlQgMQorI2RlZmluZSBETUFFX0NPTU1BTkRfQ19EU1QgKDB4MTw8MykKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0NfRFNUX1NISUZUIDMKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0NfVFlQRV9FTkFCTEUgKDB4MTw8NCkKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0NfVFlQRV9FTkFCTEVfU0hJRlQgNAorI2RlZmluZSBETUFFX0NPTU1BTkRfQ19UWVBFX0NSQ19FTkFCTEUgKDB4MTw8NSkKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0NfVFlQRV9DUkNfRU5BQkxFX1NISUZUIDUKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0NfVFlQRV9DUkNfT0ZGU0VUICgweDc8PDYpCisjZGVmaW5lIERNQUVfQ09NTUFORF9DX1RZUEVfQ1JDX09GRlNFVF9TSElGVCA2CisjZGVmaW5lIERNQUVfQ09NTUFORF9FTkRJQU5JVFkgKDB4Mzw8OSkKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0VORElBTklUWV9TSElGVCA5CisjZGVmaW5lIERNQUVfQ09NTUFORF9QT1JUICgweDE8PDExKQorI2RlZmluZSBETUFFX0NPTU1BTkRfUE9SVF9TSElGVCAxMQorI2RlZmluZSBETUFFX0NPTU1BTkRfQ1JDX1JFU0VUICgweDE8PDEyKQorI2RlZmluZSBETUFFX0NPTU1BTkRfQ1JDX1JFU0VUX1NISUZUIDEyCisjZGVmaW5lIERNQUVfQ09NTUFORF9TUkNfUkVTRVQgKDB4MTw8MTMpCisjZGVmaW5lIERNQUVfQ09NTUFORF9TUkNfUkVTRVRfU0hJRlQgMTMKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0RTVF9SRVNFVCAoMHgxPDwxNCkKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0RTVF9SRVNFVF9TSElGVCAxNAorI2RlZmluZSBETUFFX0NPTU1BTkRfRTFIVk4gKDB4Mzw8MTUpCisjZGVmaW5lIERNQUVfQ09NTUFORF9FMUhWTl9TSElGVCAxNQorI2RlZmluZSBETUFFX0NPTU1BTkRfRFNUX1ZOICgweDM8PDE3KQorI2RlZmluZSBETUFFX0NPTU1BTkRfRFNUX1ZOX1NISUZUIDE3CisjZGVmaW5lIERNQUVfQ09NTUFORF9DX0ZVTkMgKDB4MTw8MTkpCisjZGVmaW5lIERNQUVfQ09NTUFORF9DX0ZVTkNfU0hJRlQgMTkKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0VSUl9QT0xJQ1kgKDB4Mzw8MjApCisjZGVmaW5lIERNQUVfQ09NTUFORF9FUlJfUE9MSUNZX1NISUZUIDIwCisjZGVmaW5lIERNQUVfQ09NTUFORF9SRVNFUlZFRDAgKDB4M0ZGPDwyMikKKyNkZWZpbmUgRE1BRV9DT01NQU5EX1JFU0VSVkVEMF9TSElGVCAyMgorCXUzMiBzcmNfYWRkcl9sbzsKKwl1MzIgc3JjX2FkZHJfaGk7CisJdTMyIGRzdF9hZGRyX2xvOworCXUzMiBkc3RfYWRkcl9oaTsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgb3Bjb2RlX2lvdjsKKyNkZWZpbmUgRE1BRV9DT01NQU5EX1NSQ19WRklEICgweDNGPDwwKQorI2RlZmluZSBETUFFX0NPTU1BTkRfU1JDX1ZGSURfU0hJRlQgMAorI2RlZmluZSBETUFFX0NPTU1BTkRfU1JDX1ZGUEYgKDB4MTw8NikKKyNkZWZpbmUgRE1BRV9DT01NQU5EX1NSQ19WRlBGX1NISUZUIDYKKyNkZWZpbmUgRE1BRV9DT01NQU5EX1JFU0VSVkVEMSAoMHgxPDw3KQorI2RlZmluZSBETUFFX0NPTU1BTkRfUkVTRVJWRUQxX1NISUZUIDcKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0RTVF9WRklEICgweDNGPDw4KQorI2RlZmluZSBETUFFX0NPTU1BTkRfRFNUX1ZGSURfU0hJRlQgOAorI2RlZmluZSBETUFFX0NPTU1BTkRfRFNUX1ZGUEYgKDB4MTw8MTQpCisjZGVmaW5lIERNQUVfQ09NTUFORF9EU1RfVkZQRl9TSElGVCAxNAorI2RlZmluZSBETUFFX0NPTU1BTkRfUkVTRVJWRUQyICgweDE8PDE1KQorI2RlZmluZSBETUFFX0NPTU1BTkRfUkVTRVJWRUQyX1NISUZUIDE1CisJdTE2IGxlbjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBsZW47CisJdTE2IG9wY29kZV9pb3Y7CisjZGVmaW5lIERNQUVfQ09NTUFORF9TUkNfVkZJRCAoMHgzRjw8MCkKKyNkZWZpbmUgRE1BRV9DT01NQU5EX1NSQ19WRklEX1NISUZUIDAKKyNkZWZpbmUgRE1BRV9DT01NQU5EX1NSQ19WRlBGICgweDE8PDYpCisjZGVmaW5lIERNQUVfQ09NTUFORF9TUkNfVkZQRl9TSElGVCA2CisjZGVmaW5lIERNQUVfQ09NTUFORF9SRVNFUlZFRDEgKDB4MTw8NykKKyNkZWZpbmUgRE1BRV9DT01NQU5EX1JFU0VSVkVEMV9TSElGVCA3CisjZGVmaW5lIERNQUVfQ09NTUFORF9EU1RfVkZJRCAoMHgzRjw8OCkKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0RTVF9WRklEX1NISUZUIDgKKyNkZWZpbmUgRE1BRV9DT01NQU5EX0RTVF9WRlBGICgweDE8PDE0KQorI2RlZmluZSBETUFFX0NPTU1BTkRfRFNUX1ZGUEZfU0hJRlQgMTQKKyNkZWZpbmUgRE1BRV9DT01NQU5EX1JFU0VSVkVEMiAoMHgxPDwxNSkKKyNkZWZpbmUgRE1BRV9DT01NQU5EX1JFU0VSVkVEMl9TSElGVCAxNQorI2VuZGlmCisJdTMyIGNvbXBfYWRkcl9sbzsKKwl1MzIgY29tcF9hZGRyX2hpOworCXUzMiBjb21wX3ZhbDsKKwl1MzIgY3JjMzI7CisJdTMyIGNyYzMyX2M7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IGNyYzE2X2M7CisJdTE2IGNyYzE2OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IGNyYzE2OworCXUxNiBjcmMxNl9jOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IHJlc2VydmVkMzsKKwl1MTYgY3JjX3QxMDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBjcmNfdDEwOworCXUxNiByZXNlcnZlZDM7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgeHN1bTg7CisJdTE2IHhzdW0xNjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiB4c3VtMTY7CisJdTE2IHhzdW04OworI2VuZGlmCit9OworCisKKy8qCiAgKiBjb21tb24gZGF0YSBmb3IgYWxsIHByb3RvY29scwogICovCiBzdHJ1Y3QgZG9vcmJlbGxfaGRyIHsKQEAgLTE5NjMsMzMgKzI2ODksMjkgQEAKIH07CiAKIC8qCi0gKiBkb29yYmVsbCBtZXNzYWdlIHNlbnQgdG8gdGhlIGNoaXAKKyAqIEV0aGVybmV0IGRvb3JiZWxsCiAgKi8KLXN0cnVjdCBkb29yYmVsbCB7CitzdHJ1Y3QgZXRoX3R4X2Rvb3JiZWxsIHsKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgemVyb19maWxsMjsKLQl1OCB6ZXJvX2ZpbGwxOwotCXN0cnVjdCBkb29yYmVsbF9oZHIgaGVhZGVyOworCXUxNiBucGFja2V0czsKKwl1OCBwYXJhbXM7CisjZGVmaW5lIEVUSF9UWF9ET09SQkVMTF9OVU1fQkRTICgweDNGPDwwKQorI2RlZmluZSBFVEhfVFhfRE9PUkJFTExfTlVNX0JEU19TSElGVCAwCisjZGVmaW5lIEVUSF9UWF9ET09SQkVMTF9SRVNFUlZFRF9UWF9GSU5fRkxBRyAoMHgxPDw2KQorI2RlZmluZSBFVEhfVFhfRE9PUkJFTExfUkVTRVJWRURfVFhfRklOX0ZMQUdfU0hJRlQgNgorI2RlZmluZSBFVEhfVFhfRE9PUkJFTExfU1BBUkUgKDB4MTw8NykKKyNkZWZpbmUgRVRIX1RYX0RPT1JCRUxMX1NQQVJFX1NISUZUIDcKKwlzdHJ1Y3QgZG9vcmJlbGxfaGRyIGhkcjsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXN0cnVjdCBkb29yYmVsbF9oZHIgaGVhZGVyOwotCXU4IHplcm9fZmlsbDE7Ci0JdTE2IHplcm9fZmlsbDI7Ci0jZW5kaWYKLX07Ci0KLQotLyoKLSAqIGRvb3JiZWxsIG1lc3NhZ2Ugc2VudCB0byB0aGUgY2hpcAotICovCi1zdHJ1Y3QgZG9vcmJlbGxfc2V0X3Byb2QgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBwcm9kOwotCXU4IHplcm9fZmlsbDE7Ci0Jc3RydWN0IGRvb3JiZWxsX2hkciBoZWFkZXI7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQlzdHJ1Y3QgZG9vcmJlbGxfaGRyIGhlYWRlcjsKLQl1OCB6ZXJvX2ZpbGwxOwotCXUxNiBwcm9kOworCXN0cnVjdCBkb29yYmVsbF9oZHIgaGRyOworCXU4IHBhcmFtczsKKyNkZWZpbmUgRVRIX1RYX0RPT1JCRUxMX05VTV9CRFMgKDB4M0Y8PDApCisjZGVmaW5lIEVUSF9UWF9ET09SQkVMTF9OVU1fQkRTX1NISUZUIDAKKyNkZWZpbmUgRVRIX1RYX0RPT1JCRUxMX1JFU0VSVkVEX1RYX0ZJTl9GTEFHICgweDE8PDYpCisjZGVmaW5lIEVUSF9UWF9ET09SQkVMTF9SRVNFUlZFRF9UWF9GSU5fRkxBR19TSElGVCA2CisjZGVmaW5lIEVUSF9UWF9ET09SQkVMTF9TUEFSRSAoMHgxPDw3KQorI2RlZmluZSBFVEhfVFhfRE9PUkJFTExfU1BBUkVfU0hJRlQgNworCXUxNiBucGFja2V0czsKICNlbmRpZgogfTsKIApAQCAtMjAwMCw3ICsyNzIyLDcgQEAKIHN0cnVjdCBoY19zdGF0dXNfYmxvY2tfZTF4IHsKIAlfX2xlMTYgaW5kZXhfdmFsdWVzW0hDX1NCX01BWF9JTkRJQ0VTX0UxWF07CiAJX19sZTE2IHJ1bm5pbmdfaW5kZXhbSENfU0JfTUFYX1NNXTsKLQl1MzIgcnNydjsKKwlfX2xlMzIgcnNydlsxMV07CiB9OwogCiAvKgpAQCAtMjAxNyw3ICsyNzM5LDcgQEAKIHN0cnVjdCBoY19zdGF0dXNfYmxvY2tfZTIgewogCV9fbGUxNiBpbmRleF92YWx1ZXNbSENfU0JfTUFYX0lORElDRVNfRTJdOwogCV9fbGUxNiBydW5uaW5nX2luZGV4W0hDX1NCX01BWF9TTV07Ci0JdTMyIHJlc2VydmVkOworCV9fbGUzMiByZXNlcnZlZFsxMV07CiB9OwogCiAvKgpAQCAtMjEzOCw2ICsyODYwLDE2IEBACiAKIAogLyoKKyAqIElndSBjb250cm9sIGNvbW1hbmRzCisgKi8KK2VudW0gaWd1X2N0cmxfY21kIHsKKwlJR1VfQ1RSTF9DTURfVFlQRV9SRCwKKwlJR1VfQ1RSTF9DTURfVFlQRV9XUiwKKwlNQVhfSUdVX0NUUkxfQ01ECit9OworCisKKy8qCiAgKiBDb250cm9sIHJlZ2lzdGVyIGZvciB0aGUgSUdVIGNvbW1hbmQgcmVnaXN0ZXIKICAqLwogc3RydWN0IGlndV9jdHJsX3JlZyB7CkBAIC0yMTU2LDYgKzI4ODgsMjkgQEAKIAogCiAvKgorICogSWd1IGludGVycnVwdCBjb21tYW5kCisgKi8KK2VudW0gaWd1X2ludF9jbWQgeworCUlHVV9JTlRfRU5BQkxFLAorCUlHVV9JTlRfRElTQUJMRSwKKwlJR1VfSU5UX05PUCwKKwlJR1VfSU5UX05PUDIsCisJTUFYX0lHVV9JTlRfQ01ECit9OworCisKKy8qCisgKiBJZ3Ugc2VnbWVudHMKKyAqLworZW51bSBpZ3Vfc2VnX2FjY2VzcyB7CisJSUdVX1NFR19BQ0NFU1NfTk9STSwKKwlJR1VfU0VHX0FDQ0VTU19ERUYsCisJSUdVX1NFR19BQ0NFU1NfQVRUTiwKKwlNQVhfSUdVX1NFR19BQ0NFU1MKK307CisKKworLyoKICAqIFBhcnNlciBwYXJzaW5nIGZsYWdzIGZpZWxkCiAgKi8KIHN0cnVjdCBwYXJzaW5nX2ZsYWdzIHsKQEAgLTIxODksOTQgKzI5NDQsNDYgQEAKIH07CiAKIAotc3RydWN0IHJlZ3BhaXIgewotCV9fbGUzMiBsbzsKLQlfX2xlMzIgaGk7CisvKgorICogUGFyc2luZyBmbGFncyBmb3IgVENQIEFDSyB0eXBlCisgKi8KK2VudW0gcHJzX2ZsYWdzX2Fja190eXBlIHsKKwlQUlNfRkxBR19QVVJFQUNLX1BJR0dZLAorCVBSU19GTEFHX1BVUkVBQ0tfUFVSRSwKKwlNQVhfUFJTX0ZMQUdTX0FDS19UWVBFCiB9OwogCiAKIC8qCi0gKiBkbWFlIGNvbW1hbmQgc3RydWN0dXJlCisgKiBQYXJzaW5nIGZsYWdzIGZvciBFdGhlcm5ldCBhZGRyZXNzIHR5cGUKICAqLwotc3RydWN0IGRtYWVfY29tbWFuZCB7Ci0JdTMyIG9wY29kZTsKLSNkZWZpbmUgRE1BRV9DT01NQU5EX1NSQyAoMHgxPDwwKQotI2RlZmluZSBETUFFX0NPTU1BTkRfU1JDX1NISUZUIDAKLSNkZWZpbmUgRE1BRV9DT01NQU5EX0RTVCAoMHgzPDwxKQotI2RlZmluZSBETUFFX0NPTU1BTkRfRFNUX1NISUZUIDEKLSNkZWZpbmUgRE1BRV9DT01NQU5EX0NfRFNUICgweDE8PDMpCi0jZGVmaW5lIERNQUVfQ09NTUFORF9DX0RTVF9TSElGVCAzCi0jZGVmaW5lIERNQUVfQ09NTUFORF9DX1RZUEVfRU5BQkxFICgweDE8PDQpCi0jZGVmaW5lIERNQUVfQ09NTUFORF9DX1RZUEVfRU5BQkxFX1NISUZUIDQKLSNkZWZpbmUgRE1BRV9DT01NQU5EX0NfVFlQRV9DUkNfRU5BQkxFICgweDE8PDUpCi0jZGVmaW5lIERNQUVfQ09NTUFORF9DX1RZUEVfQ1JDX0VOQUJMRV9TSElGVCA1Ci0jZGVmaW5lIERNQUVfQ09NTUFORF9DX1RZUEVfQ1JDX09GRlNFVCAoMHg3PDw2KQotI2RlZmluZSBETUFFX0NPTU1BTkRfQ19UWVBFX0NSQ19PRkZTRVRfU0hJRlQgNgotI2RlZmluZSBETUFFX0NPTU1BTkRfRU5ESUFOSVRZICgweDM8PDkpCi0jZGVmaW5lIERNQUVfQ09NTUFORF9FTkRJQU5JVFlfU0hJRlQgOQotI2RlZmluZSBETUFFX0NPTU1BTkRfUE9SVCAoMHgxPDwxMSkKLSNkZWZpbmUgRE1BRV9DT01NQU5EX1BPUlRfU0hJRlQgMTEKLSNkZWZpbmUgRE1BRV9DT01NQU5EX0NSQ19SRVNFVCAoMHgxPDwxMikKLSNkZWZpbmUgRE1BRV9DT01NQU5EX0NSQ19SRVNFVF9TSElGVCAxMgotI2RlZmluZSBETUFFX0NPTU1BTkRfU1JDX1JFU0VUICgweDE8PDEzKQotI2RlZmluZSBETUFFX0NPTU1BTkRfU1JDX1JFU0VUX1NISUZUIDEzCi0jZGVmaW5lIERNQUVfQ09NTUFORF9EU1RfUkVTRVQgKDB4MTw8MTQpCi0jZGVmaW5lIERNQUVfQ09NTUFORF9EU1RfUkVTRVRfU0hJRlQgMTQKLSNkZWZpbmUgRE1BRV9DT01NQU5EX0UxSFZOICgweDM8PDE1KQotI2RlZmluZSBETUFFX0NPTU1BTkRfRTFIVk5fU0hJRlQgMTUKLSNkZWZpbmUgRE1BRV9DT01NQU5EX0RTVF9WTiAoMHgzPDwxNykKLSNkZWZpbmUgRE1BRV9DT01NQU5EX0RTVF9WTl9TSElGVCAxNwotI2RlZmluZSBETUFFX0NPTU1BTkRfQ19GVU5DICgweDE8PDE5KQotI2RlZmluZSBETUFFX0NPTU1BTkRfQ19GVU5DX1NISUZUIDE5Ci0jZGVmaW5lIERNQUVfQ09NTUFORF9FUlJfUE9MSUNZICgweDM8PDIwKQotI2RlZmluZSBETUFFX0NPTU1BTkRfRVJSX1BPTElDWV9TSElGVCAyMAotI2RlZmluZSBETUFFX0NPTU1BTkRfUkVTRVJWRUQwICgweDNGRjw8MjIpCi0jZGVmaW5lIERNQUVfQ09NTUFORF9SRVNFUlZFRDBfU0hJRlQgMjIKLQl1MzIgc3JjX2FkZHJfbG87Ci0JdTMyIHNyY19hZGRyX2hpOwotCXUzMiBkc3RfYWRkcl9sbzsKLQl1MzIgZHN0X2FkZHJfaGk7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJlc2VydmVkMTsKLQl1MTYgbGVuOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGxlbjsKLQl1MTYgcmVzZXJ2ZWQxOwotI2VuZGlmCi0JdTMyIGNvbXBfYWRkcl9sbzsKLQl1MzIgY29tcF9hZGRyX2hpOwotCXUzMiBjb21wX3ZhbDsKLQl1MzIgY3JjMzI7Ci0JdTMyIGNyYzMyX2M7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IGNyYzE2X2M7Ci0JdTE2IGNyYzE2OwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGNyYzE2OwotCXUxNiBjcmMxNl9jOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJlc2VydmVkMzsKLQl1MTYgY3JjX3QxMDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBjcmNfdDEwOwotCXUxNiByZXNlcnZlZDM7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgeHN1bTg7Ci0JdTE2IHhzdW0xNjsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiB4c3VtMTY7Ci0JdTE2IHhzdW04OwotI2VuZGlmCitlbnVtIHByc19mbGFnc19ldGhfYWRkcl90eXBlIHsKKwlQUlNfRkxBR19FVEhUWVBFX05PTl9VTklDQVNULAorCVBSU19GTEFHX0VUSFRZUEVfVU5JQ0FTVCwKKwlNQVhfUFJTX0ZMQUdTX0VUSF9BRERSX1RZUEUKIH07CiAKIAotc3RydWN0IGRvdWJsZV9yZWdwYWlyIHsKLQl1MzIgcmVncGFpcjBfbG87Ci0JdTMyIHJlZ3BhaXIwX2hpOwotCXUzMiByZWdwYWlyMV9sbzsKLQl1MzIgcmVncGFpcjFfaGk7CisvKgorICogUGFyc2luZyBmbGFncyBmb3Igb3Zlci1ldGhlcm5ldCBwcm90b2NvbAorICovCitlbnVtIHByc19mbGFnc19vdmVyX2V0aCB7CisJUFJTX0ZMQUdfT1ZFUkVUSF9VTktOT1dOLAorCVBSU19GTEFHX09WRVJFVEhfSVBWNCwKKwlQUlNfRkxBR19PVkVSRVRIX0lQVjYsCisJUFJTX0ZMQUdfT1ZFUkVUSF9MTENTTkFQX1VOS05PV04sCisJTUFYX1BSU19GTEFHU19PVkVSX0VUSAorfTsKKworCisvKgorICogUGFyc2luZyBmbGFncyBmb3Igb3Zlci1JUCBwcm90b2NvbAorICovCitlbnVtIHByc19mbGFnc19vdmVyX2lwIHsKKwlQUlNfRkxBR19PVkVSSVBfVU5LTk9XTiwKKwlQUlNfRkxBR19PVkVSSVBfVENQLAorCVBSU19GTEFHX09WRVJJUF9VRFAsCisJTUFYX1BSU19GTEFHU19PVkVSX0lQCiB9OwogCiAKQEAgLTIyOTcsNTUgKzMwMDQsMjQgQEAKICNkZWZpbmUgU0RNX09QX0dFTl9SRVNFUlZFRF9TSElGVCAxNwogfTsKIAotLyoKLSAqIFRoZSBldGggUnggQnVmZmVyIERlc2NyaXB0b3IKLSAqLwotc3RydWN0IGV0aF9yeF9iZCB7Ci0JX19sZTMyIGFkZHJfbG87Ci0JX19sZTMyIGFkZHJfaGk7Ci19OwogCiAvKgotICogVGhlIGV0aCBSeCBTR0UgRGVzY3JpcHRvcgorICogVGltZXJzIGNvbm5lY3Rpb24gY29udGV4dAogICovCi1zdHJ1Y3QgZXRoX3J4X3NnZSB7Ci0JX19sZTMyIGFkZHJfbG87Ci0JX19sZTMyIGFkZHJfaGk7CitzdHJ1Y3QgdGltZXJzX2Jsb2NrX2NvbnRleHQgeworCXUzMiBfX3Jlc2VydmVkXzA7CisJdTMyIF9fcmVzZXJ2ZWRfMTsKKwl1MzIgX19yZXNlcnZlZF8yOworCXUzMiBmbGFnczsKKyNkZWZpbmUgX19USU1FUlNfQkxPQ0tfQ09OVEVYVF9OVU1fT0ZfQUNUSVZFX1RJTUVSUyAoMHgzPDwwKQorI2RlZmluZSBfX1RJTUVSU19CTE9DS19DT05URVhUX05VTV9PRl9BQ1RJVkVfVElNRVJTX1NISUZUIDAKKyNkZWZpbmUgVElNRVJTX0JMT0NLX0NPTlRFWFRfQ09OTl9WQUxJRF9GTEcgKDB4MTw8MikKKyNkZWZpbmUgVElNRVJTX0JMT0NLX0NPTlRFWFRfQ09OTl9WQUxJRF9GTEdfU0hJRlQgMgorI2RlZmluZSBfX1RJTUVSU19CTE9DS19DT05URVhUX1JFU0VSVkVEMCAoMHgxRkZGRkZGRjw8MykKKyNkZWZpbmUgX19USU1FUlNfQkxPQ0tfQ09OVEVYVF9SRVNFUlZFRDBfU0hJRlQgMwogfTsKIAogCi0KLS8qCi0gKiBUaGUgZXRoIHN0b3JtIGNvbnRleHQgb2YgVXN0b3JtCi0gKi8KLXN0cnVjdCB1c3Rvcm1fZXRoX3N0X2NvbnRleHQgewotCXUzMiByZXNlcnZlZDBbNDhdOwotfTsKLQotLyoKLSAqIFRoZSBldGggc3Rvcm0gY29udGV4dCBvZiBUc3Rvcm0KLSAqLwotc3RydWN0IHRzdG9ybV9ldGhfc3RfY29udGV4dCB7Ci0JdTMyIF9fcmVzZXJ2ZWQwWzI4XTsKLX07Ci0KLS8qCi0gKiBUaGUgZXRoIGFnZ3JlZ2F0aXZlIGNvbnRleHQgb2YgWHN0b3JtCi0gKi8KLXN0cnVjdCB4c3Rvcm1fZXRoX2FnX2NvbnRleHQgewotCXUzMiByZXNlcnZlZDA7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggY2R1X3Jlc2VydmVkOwotCXU4IHJlc2VydmVkMjsKLQl1MTYgcmVzZXJ2ZWQxOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHJlc2VydmVkMTsKLQl1OCByZXNlcnZlZDI7Ci0JdTggY2R1X3Jlc2VydmVkOwotI2VuZGlmCi0JdTMyIHJlc2VydmVkM1szMF07Ci19OwotCiAvKgogICogVGhlIGV0aCBhZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIFRzdG9ybQogICovCkBAIC0yMzU1LDE0ICszMDMxLDYgQEAKIAogCiAvKgotICogVGhlIGV0aCBhZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIENzdG9ybQotICovCi1zdHJ1Y3QgY3N0b3JtX2V0aF9hZ19jb250ZXh0IHsKLQl1MzIgX19yZXNlcnZlZDBbMTBdOwotfTsKLQotCi0vKgogICogVGhlIGV0aCBhZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIFVzdG9ybQogICovCiBzdHJ1Y3QgdXN0b3JtX2V0aF9hZ19jb250ZXh0IHsKQEAgLTIzNzksMjIgKzMwNDcsODA4IEBACiAJdTMyIF9fcmVzZXJ2ZWQzWzZdOwogfTsKIAorCiAvKgotICogVGltZXJzIGNvbm5lY3Rpb24gY29udGV4dAorICogVGhlIGV0aCBhZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIFhzdG9ybQogICovCi1zdHJ1Y3QgdGltZXJzX2Jsb2NrX2NvbnRleHQgewotCXUzMiBfX3Jlc2VydmVkXzA7Ci0JdTMyIF9fcmVzZXJ2ZWRfMTsKLQl1MzIgX19yZXNlcnZlZF8yOwotCXUzMiBmbGFnczsKLSNkZWZpbmUgX19USU1FUlNfQkxPQ0tfQ09OVEVYVF9OVU1fT0ZfQUNUSVZFX1RJTUVSUyAoMHgzPDwwKQotI2RlZmluZSBfX1RJTUVSU19CTE9DS19DT05URVhUX05VTV9PRl9BQ1RJVkVfVElNRVJTX1NISUZUIDAKLSNkZWZpbmUgVElNRVJTX0JMT0NLX0NPTlRFWFRfQ09OTl9WQUxJRF9GTEcgKDB4MTw8MikKLSNkZWZpbmUgVElNRVJTX0JMT0NLX0NPTlRFWFRfQ09OTl9WQUxJRF9GTEdfU0hJRlQgMgotI2RlZmluZSBfX1RJTUVSU19CTE9DS19DT05URVhUX1JFU0VSVkVEMCAoMHgxRkZGRkZGRjw8MykKLSNkZWZpbmUgX19USU1FUlNfQkxPQ0tfQ09OVEVYVF9SRVNFUlZFRDBfU0hJRlQgMworc3RydWN0IHhzdG9ybV9ldGhfYWdfY29udGV4dCB7CisJdTMyIHJlc2VydmVkMDsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCBjZHVfcmVzZXJ2ZWQ7CisJdTggcmVzZXJ2ZWQyOworCXUxNiByZXNlcnZlZDE7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgcmVzZXJ2ZWQxOworCXU4IHJlc2VydmVkMjsKKwl1OCBjZHVfcmVzZXJ2ZWQ7CisjZW5kaWYKKwl1MzIgcmVzZXJ2ZWQzWzMwXTsKIH07CiAKKworLyoKKyAqIGRvb3JiZWxsIG1lc3NhZ2Ugc2VudCB0byB0aGUgY2hpcAorICovCitzdHJ1Y3QgZG9vcmJlbGwgeworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiB6ZXJvX2ZpbGwyOworCXU4IHplcm9fZmlsbDE7CisJc3RydWN0IGRvb3JiZWxsX2hkciBoZWFkZXI7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwlzdHJ1Y3QgZG9vcmJlbGxfaGRyIGhlYWRlcjsKKwl1OCB6ZXJvX2ZpbGwxOworCXUxNiB6ZXJvX2ZpbGwyOworI2VuZGlmCit9OworCisKKy8qCisgKiBkb29yYmVsbCBtZXNzYWdlIHNlbnQgdG8gdGhlIGNoaXAKKyAqLworc3RydWN0IGRvb3JiZWxsX3NldF9wcm9kIHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgcHJvZDsKKwl1OCB6ZXJvX2ZpbGwxOworCXN0cnVjdCBkb29yYmVsbF9oZHIgaGVhZGVyOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJc3RydWN0IGRvb3JiZWxsX2hkciBoZWFkZXI7CisJdTggemVyb19maWxsMTsKKwl1MTYgcHJvZDsKKyNlbmRpZgorfTsKKworCitzdHJ1Y3QgcmVncGFpciB7CisJX19sZTMyIGxvOworCV9fbGUzMiBoaTsKK307CisKKworLyoKKyAqIENsYXNzaWZ5IHJ1bGUgb3Bjb2RlcyBpbiBFMi9FMworICovCitlbnVtIGNsYXNzaWZ5X3J1bGUgeworCUNMQVNTSUZZX1JVTEVfT1BDT0RFX01BQywKKwlDTEFTU0lGWV9SVUxFX09QQ09ERV9WTEFOLAorCUNMQVNTSUZZX1JVTEVfT1BDT0RFX1BBSVIsCisJTUFYX0NMQVNTSUZZX1JVTEUKK307CisKKworLyoKKyAqIENsYXNzaWZ5IHJ1bGUgdHlwZXMgaW4gRTIvRTMKKyAqLworZW51bSBjbGFzc2lmeV9ydWxlX2FjdGlvbl90eXBlIHsKKwlDTEFTU0lGWV9SVUxFX1JFTU9WRSwKKwlDTEFTU0lGWV9SVUxFX0FERCwKKwlNQVhfQ0xBU1NJRllfUlVMRV9BQ1RJT05fVFlQRQorfTsKKworCisvKgorICogY2xpZW50IGluaXQgcmFtcm9kIGRhdGEKKyAqLworc3RydWN0IGNsaWVudF9pbml0X2dlbmVyYWxfZGF0YSB7CisJdTggY2xpZW50X2lkOworCXU4IHN0YXRpc3RpY3NfY291bnRlcl9pZDsKKwl1OCBzdGF0aXN0aWNzX2VuX2ZsZzsKKwl1OCBpc19mY29lX2ZsZzsKKwl1OCBhY3RpdmF0ZV9mbGc7CisJdTggc3BfY2xpZW50X2lkOworCV9fbGUxNiBtdHU7CisJdTggc3RhdGlzdGljc196ZXJvX2ZsZzsKKwl1OCBmdW5jX2lkOworCXU4IGNvczsKKwl1OCB0cmFmZmljX3R5cGU7CisJdTMyIHJlc2VydmVkMDsKK307CisKKworLyoKKyAqIGNsaWVudCBpbml0IHJ4IGRhdGEKKyAqLworc3RydWN0IGNsaWVudF9pbml0X3J4X2RhdGEgeworCXU4IHRwYV9lbjsKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfUlhfREFUQV9UUEFfRU5fSVBWNCAoMHgxPDwwKQorI2RlZmluZSBDTElFTlRfSU5JVF9SWF9EQVRBX1RQQV9FTl9JUFY0X1NISUZUIDAKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfUlhfREFUQV9UUEFfRU5fSVBWNiAoMHgxPDwxKQorI2RlZmluZSBDTElFTlRfSU5JVF9SWF9EQVRBX1RQQV9FTl9JUFY2X1NISUZUIDEKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfUlhfREFUQV9SRVNFUlZFRDUgKDB4M0Y8PDIpCisjZGVmaW5lIENMSUVOVF9JTklUX1JYX0RBVEFfUkVTRVJWRUQ1X1NISUZUIDIKKwl1OCB2bXF1ZXVlX21vZGVfZW5fZmxnOworCXU4IGV4dHJhX2RhdGFfb3Zlcl9zZ2xfZW5fZmxnOworCXU4IGNhY2hlX2xpbmVfYWxpZ25tZW50X2xvZ19zaXplOworCXU4IGVuYWJsZV9keW5hbWljX2hjOworCXU4IG1heF9zZ2VzX2Zvcl9wYWNrZXQ7CisJdTggY2xpZW50X3F6b25lX2lkOworCXU4IGRyb3BfaXBfY3NfZXJyX2ZsZzsKKwl1OCBkcm9wX3RjcF9jc19lcnJfZmxnOworCXU4IGRyb3BfdHRsMF9mbGc7CisJdTggZHJvcF91ZHBfY3NfZXJyX2ZsZzsKKwl1OCBpbm5lcl92bGFuX3JlbW92YWxfZW5hYmxlX2ZsZzsKKwl1OCBvdXRlcl92bGFuX3JlbW92YWxfZW5hYmxlX2ZsZzsKKwl1OCBzdGF0dXNfYmxvY2tfaWQ7CisJdTggcnhfc2JfaW5kZXhfbnVtYmVyOworCXU4IHJlc2VydmVkMDsKKwl1OCBtYXhfdHBhX3F1ZXVlczsKKwl1OCBzaWxlbnRfdmxhbl9yZW1vdmFsX2ZsZzsKKwlfX2xlMTYgbWF4X2J5dGVzX29uX2JkOworCV9fbGUxNiBzZ2VfYnVmZl9zaXplOworCXU4IGFwcHJveF9tY2FzdF9lbmdpbmVfaWQ7CisJdTggcnNzX2VuZ2luZV9pZDsKKwlzdHJ1Y3QgcmVncGFpciBiZF9wYWdlX2Jhc2U7CisJc3RydWN0IHJlZ3BhaXIgc2dlX3BhZ2VfYmFzZTsKKwlzdHJ1Y3QgcmVncGFpciBjcWVfcGFnZV9iYXNlOworCXU4IGlzX2xlYWRpbmdfcnNzOworCXU4IGlzX2FwcHJveF9tY2FzdDsKKwlfX2xlMTYgbWF4X2FnZ19zaXplOworCV9fbGUxNiBzdGF0ZTsKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfUlhfREFUQV9VQ0FTVF9EUk9QX0FMTCAoMHgxPDwwKQorI2RlZmluZSBDTElFTlRfSU5JVF9SWF9EQVRBX1VDQVNUX0RST1BfQUxMX1NISUZUIDAKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfUlhfREFUQV9VQ0FTVF9BQ0NFUFRfQUxMICgweDE8PDEpCisjZGVmaW5lIENMSUVOVF9JTklUX1JYX0RBVEFfVUNBU1RfQUNDRVBUX0FMTF9TSElGVCAxCisjZGVmaW5lIENMSUVOVF9JTklUX1JYX0RBVEFfVUNBU1RfQUNDRVBUX1VOTUFUQ0hFRCAoMHgxPDwyKQorI2RlZmluZSBDTElFTlRfSU5JVF9SWF9EQVRBX1VDQVNUX0FDQ0VQVF9VTk1BVENIRURfU0hJRlQgMgorI2RlZmluZSBDTElFTlRfSU5JVF9SWF9EQVRBX01DQVNUX0RST1BfQUxMICgweDE8PDMpCisjZGVmaW5lIENMSUVOVF9JTklUX1JYX0RBVEFfTUNBU1RfRFJPUF9BTExfU0hJRlQgMworI2RlZmluZSBDTElFTlRfSU5JVF9SWF9EQVRBX01DQVNUX0FDQ0VQVF9BTEwgKDB4MTw8NCkKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfUlhfREFUQV9NQ0FTVF9BQ0NFUFRfQUxMX1NISUZUIDQKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfUlhfREFUQV9CQ0FTVF9BQ0NFUFRfQUxMICgweDE8PDUpCisjZGVmaW5lIENMSUVOVF9JTklUX1JYX0RBVEFfQkNBU1RfQUNDRVBUX0FMTF9TSElGVCA1CisjZGVmaW5lIENMSUVOVF9JTklUX1JYX0RBVEFfQUNDRVBUX0FOWV9WTEFOICgweDE8PDYpCisjZGVmaW5lIENMSUVOVF9JTklUX1JYX0RBVEFfQUNDRVBUX0FOWV9WTEFOX1NISUZUIDYKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfUlhfREFUQV9SRVNFUlZFRDIgKDB4MUZGPDw3KQorI2RlZmluZSBDTElFTlRfSU5JVF9SWF9EQVRBX1JFU0VSVkVEMl9TSElGVCA3CisJX19sZTE2IGNxZV9wYXVzZV90aHJfbG93OworCV9fbGUxNiBjcWVfcGF1c2VfdGhyX2hpZ2g7CisJX19sZTE2IGJkX3BhdXNlX3Rocl9sb3c7CisJX19sZTE2IGJkX3BhdXNlX3Rocl9oaWdoOworCV9fbGUxNiBzZ2VfcGF1c2VfdGhyX2xvdzsKKwlfX2xlMTYgc2dlX3BhdXNlX3Rocl9oaWdoOworCV9fbGUxNiByeF9jb3NfbWFzazsKKwlfX2xlMTYgc2lsZW50X3ZsYW5fdmFsdWU7CisJX19sZTE2IHNpbGVudF92bGFuX21hc2s7CisJX19sZTMyIHJlc2VydmVkNlsyXTsKK307CisKKy8qCisgKiBjbGllbnQgaW5pdCB0eCBkYXRhCisgKi8KK3N0cnVjdCBjbGllbnRfaW5pdF90eF9kYXRhIHsKKwl1OCBlbmZvcmNlX3NlY3VyaXR5X2ZsZzsKKwl1OCB0eF9zdGF0dXNfYmxvY2tfaWQ7CisJdTggdHhfc2JfaW5kZXhfbnVtYmVyOworCXU4IHRzc19sZWFkaW5nX2NsaWVudF9pZDsKKwl1OCB0eF9zd2l0Y2hpbmdfZmxnOworCXU4IGFudGlfc3Bvb2ZpbmdfZmxnOworCV9fbGUxNiBkZWZhdWx0X3ZsYW47CisJc3RydWN0IHJlZ3BhaXIgdHhfYmRfcGFnZV9iYXNlOworCV9fbGUxNiBzdGF0ZTsKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfVFhfREFUQV9VQ0FTVF9BQ0NFUFRfQUxMICgweDE8PDApCisjZGVmaW5lIENMSUVOVF9JTklUX1RYX0RBVEFfVUNBU1RfQUNDRVBUX0FMTF9TSElGVCAwCisjZGVmaW5lIENMSUVOVF9JTklUX1RYX0RBVEFfTUNBU1RfQUNDRVBUX0FMTCAoMHgxPDwxKQorI2RlZmluZSBDTElFTlRfSU5JVF9UWF9EQVRBX01DQVNUX0FDQ0VQVF9BTExfU0hJRlQgMQorI2RlZmluZSBDTElFTlRfSU5JVF9UWF9EQVRBX0JDQVNUX0FDQ0VQVF9BTEwgKDB4MTw8MikKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfVFhfREFUQV9CQ0FTVF9BQ0NFUFRfQUxMX1NISUZUIDIKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfVFhfREFUQV9BQ0NFUFRfQU5ZX1ZMQU4gKDB4MTw8MykKKyNkZWZpbmUgQ0xJRU5UX0lOSVRfVFhfREFUQV9BQ0NFUFRfQU5ZX1ZMQU5fU0hJRlQgMworI2RlZmluZSBDTElFTlRfSU5JVF9UWF9EQVRBX1JFU0VSVkVEMSAoMHhGRkY8PDQpCisjZGVmaW5lIENMSUVOVF9JTklUX1RYX0RBVEFfUkVTRVJWRUQxX1NISUZUIDQKKwl1OCBkZWZhdWx0X3ZsYW5fZmxnOworCXU4IHJlc2VydmVkMjsKKwlfX2xlMzIgcmVzZXJ2ZWQzOworfTsKKworLyoKKyAqIGNsaWVudCBpbml0IHJhbXJvZCBkYXRhCisgKi8KK3N0cnVjdCBjbGllbnRfaW5pdF9yYW1yb2RfZGF0YSB7CisJc3RydWN0IGNsaWVudF9pbml0X2dlbmVyYWxfZGF0YSBnZW5lcmFsOworCXN0cnVjdCBjbGllbnRfaW5pdF9yeF9kYXRhIHJ4OworCXN0cnVjdCBjbGllbnRfaW5pdF90eF9kYXRhIHR4OworfTsKKworCisvKgorICogY2xpZW50IHVwZGF0ZSByYW1yb2QgZGF0YQorICovCitzdHJ1Y3QgY2xpZW50X3VwZGF0ZV9yYW1yb2RfZGF0YSB7CisJdTggY2xpZW50X2lkOworCXU4IGZ1bmNfaWQ7CisJdTggaW5uZXJfdmxhbl9yZW1vdmFsX2VuYWJsZV9mbGc7CisJdTggaW5uZXJfdmxhbl9yZW1vdmFsX2NoYW5nZV9mbGc7CisJdTggb3V0ZXJfdmxhbl9yZW1vdmFsX2VuYWJsZV9mbGc7CisJdTggb3V0ZXJfdmxhbl9yZW1vdmFsX2NoYW5nZV9mbGc7CisJdTggYW50aV9zcG9vZmluZ19lbmFibGVfZmxnOworCXU4IGFudGlfc3Bvb2ZpbmdfY2hhbmdlX2ZsZzsKKwl1OCBhY3RpdmF0ZV9mbGc7CisJdTggYWN0aXZhdGVfY2hhbmdlX2ZsZzsKKwlfX2xlMTYgZGVmYXVsdF92bGFuOworCXU4IGRlZmF1bHRfdmxhbl9lbmFibGVfZmxnOworCXU4IGRlZmF1bHRfdmxhbl9jaGFuZ2VfZmxnOworCV9fbGUxNiBzaWxlbnRfdmxhbl92YWx1ZTsKKwlfX2xlMTYgc2lsZW50X3ZsYW5fbWFzazsKKwl1OCBzaWxlbnRfdmxhbl9yZW1vdmFsX2ZsZzsKKwl1OCBzaWxlbnRfdmxhbl9jaGFuZ2VfZmxnOworCV9fbGUzMiBlY2hvOworfTsKKworCisvKgorICogVGhlIGV0aCBzdG9ybSBjb250ZXh0IG9mIENzdG9ybQorICovCitzdHJ1Y3QgY3N0b3JtX2V0aF9zdF9jb250ZXh0IHsKKwl1MzIgX19yZXNlcnZlZDBbNF07Cit9OworCisKK3N0cnVjdCBkb3VibGVfcmVncGFpciB7CisJdTMyIHJlZ3BhaXIwX2xvOworCXUzMiByZWdwYWlyMF9oaTsKKwl1MzIgcmVncGFpcjFfbG87CisJdTMyIHJlZ3BhaXIxX2hpOworfTsKKworCisvKgorICogRXRoZXJuZXQgYWRkcmVzcyB0eXBlc20gdXNlZCBpbiBldGhlcm5ldCB0eCBCRHMKKyAqLworZW51bSBldGhfYWRkcl90eXBlIHsKKwlVTktOT1dOX0FERFJFU1MsCisJVU5JQ0FTVF9BRERSRVNTLAorCU1VTFRJQ0FTVF9BRERSRVNTLAorCUJST0FEQ0FTVF9BRERSRVNTLAorCU1BWF9FVEhfQUREUl9UWVBFCit9OworCisKKy8qCisgKgorICovCitzdHJ1Y3QgZXRoX2NsYXNzaWZ5X2NtZF9oZWFkZXIgeworCXU4IGNtZF9nZW5lcmFsX2RhdGE7CisjZGVmaW5lIEVUSF9DTEFTU0lGWV9DTURfSEVBREVSX1JYX0NNRCAoMHgxPDwwKQorI2RlZmluZSBFVEhfQ0xBU1NJRllfQ01EX0hFQURFUl9SWF9DTURfU0hJRlQgMAorI2RlZmluZSBFVEhfQ0xBU1NJRllfQ01EX0hFQURFUl9UWF9DTUQgKDB4MTw8MSkKKyNkZWZpbmUgRVRIX0NMQVNTSUZZX0NNRF9IRUFERVJfVFhfQ01EX1NISUZUIDEKKyNkZWZpbmUgRVRIX0NMQVNTSUZZX0NNRF9IRUFERVJfT1BDT0RFICgweDM8PDIpCisjZGVmaW5lIEVUSF9DTEFTU0lGWV9DTURfSEVBREVSX09QQ09ERV9TSElGVCAyCisjZGVmaW5lIEVUSF9DTEFTU0lGWV9DTURfSEVBREVSX0lTX0FERCAoMHgxPDw0KQorI2RlZmluZSBFVEhfQ0xBU1NJRllfQ01EX0hFQURFUl9JU19BRERfU0hJRlQgNAorI2RlZmluZSBFVEhfQ0xBU1NJRllfQ01EX0hFQURFUl9SRVNFUlZFRDAgKDB4Nzw8NSkKKyNkZWZpbmUgRVRIX0NMQVNTSUZZX0NNRF9IRUFERVJfUkVTRVJWRUQwX1NISUZUIDUKKwl1OCBmdW5jX2lkOworCXU4IGNsaWVudF9pZDsKKwl1OCByZXNlcnZlZDE7Cit9OworCisKKy8qCisgKiBoZWFkZXIgZm9yIGV0aCBjbGFzc2lmaWNhdGlvbiBjb25maWcgcmFtcm9kCisgKi8KK3N0cnVjdCBldGhfY2xhc3NpZnlfaGVhZGVyIHsKKwl1OCBydWxlX2NudDsKKwl1OCByZXNlcnZlZDA7CisJX19sZTE2IHJlc2VydmVkMTsKKwlfX2xlMzIgZWNobzsKK307CisKKworLyoKKyAqIENvbW1hbmQgZm9yIGFkZGluZy9yZW1vdmluZyBhIE1BQyBjbGFzc2lmaWNhdGlvbiBydWxlCisgKi8KK3N0cnVjdCBldGhfY2xhc3NpZnlfbWFjX2NtZCB7CisJc3RydWN0IGV0aF9jbGFzc2lmeV9jbWRfaGVhZGVyIGhlYWRlcjsKKwlfX2xlMzIgcmVzZXJ2ZWQwOworCV9fbGUxNiBtYWNfbHNiOworCV9fbGUxNiBtYWNfbWlkOworCV9fbGUxNiBtYWNfbXNiOworCV9fbGUxNiByZXNlcnZlZDE7Cit9OworCisKKy8qCisgKiBDb21tYW5kIGZvciBhZGRpbmcvcmVtb3ZpbmcgYSBNQUMtVkxBTiBwYWlyIGNsYXNzaWZpY2F0aW9uIHJ1bGUKKyAqLworc3RydWN0IGV0aF9jbGFzc2lmeV9wYWlyX2NtZCB7CisJc3RydWN0IGV0aF9jbGFzc2lmeV9jbWRfaGVhZGVyIGhlYWRlcjsKKwlfX2xlMzIgcmVzZXJ2ZWQwOworCV9fbGUxNiBtYWNfbHNiOworCV9fbGUxNiBtYWNfbWlkOworCV9fbGUxNiBtYWNfbXNiOworCV9fbGUxNiB2bGFuOworfTsKKworCisvKgorICogQ29tbWFuZCBmb3IgYWRkaW5nL3JlbW92aW5nIGEgVkxBTiBjbGFzc2lmaWNhdGlvbiBydWxlCisgKi8KK3N0cnVjdCBldGhfY2xhc3NpZnlfdmxhbl9jbWQgeworCXN0cnVjdCBldGhfY2xhc3NpZnlfY21kX2hlYWRlciBoZWFkZXI7CisJX19sZTMyIHJlc2VydmVkMDsKKwlfX2xlMzIgcmVzZXJ2ZWQxOworCV9fbGUxNiByZXNlcnZlZDI7CisJX19sZTE2IHZsYW47Cit9OworCisvKgorICogdW5pb24gZm9yIGV0aCBjbGFzc2lmaWNhdGlvbiBydWxlCisgKi8KK3VuaW9uIGV0aF9jbGFzc2lmeV9ydWxlX2NtZCB7CisJc3RydWN0IGV0aF9jbGFzc2lmeV9tYWNfY21kIG1hYzsKKwlzdHJ1Y3QgZXRoX2NsYXNzaWZ5X3ZsYW5fY21kIHZsYW47CisJc3RydWN0IGV0aF9jbGFzc2lmeV9wYWlyX2NtZCBwYWlyOworfTsKKworLyoKKyAqIHBhcmFtZXRlcnMgZm9yIGV0aCBjbGFzc2lmaWNhdGlvbiBjb25maWd1cmF0aW9uIHJhbXJvZAorICovCitzdHJ1Y3QgZXRoX2NsYXNzaWZ5X3J1bGVzX3JhbXJvZF9kYXRhIHsKKwlzdHJ1Y3QgZXRoX2NsYXNzaWZ5X2hlYWRlciBoZWFkZXI7CisJdW5pb24gZXRoX2NsYXNzaWZ5X3J1bGVfY21kIHJ1bGVzW0NMQVNTSUZZX1JVTEVTX0NPVU5UXTsKK307CisKKworLyoKKyAqIFRoZSBkYXRhIGNvbnRhaW4gY2xpZW50IElEIG5lZWQgdG8gdGhlIHJhbXJvZAorICovCitzdHJ1Y3QgZXRoX2NvbW1vbl9yYW1yb2RfZGF0YSB7CisJX19sZTMyIGNsaWVudF9pZDsKKwlfX2xlMzIgcmVzZXJ2ZWQxOworfTsKKworCisvKgorICogVGhlIGV0aCBzdG9ybSBjb250ZXh0IG9mIFVzdG9ybQorICovCitzdHJ1Y3QgdXN0b3JtX2V0aF9zdF9jb250ZXh0IHsKKwl1MzIgcmVzZXJ2ZWQwWzUyXTsKK307CisKKy8qCisgKiBUaGUgZXRoIHN0b3JtIGNvbnRleHQgb2YgVHN0b3JtCisgKi8KK3N0cnVjdCB0c3Rvcm1fZXRoX3N0X2NvbnRleHQgeworCXUzMiBfX3Jlc2VydmVkMFsyOF07Cit9OworCisvKgorICogVGhlIGV0aCBzdG9ybSBjb250ZXh0IG9mIFhzdG9ybQorICovCitzdHJ1Y3QgeHN0b3JtX2V0aF9zdF9jb250ZXh0IHsKKwl1MzIgcmVzZXJ2ZWQwWzYwXTsKK307CisKKy8qCisgKiBFdGhlcm5ldCBjb25uZWN0aW9uIGNvbnRleHQKKyAqLworc3RydWN0IGV0aF9jb250ZXh0IHsKKwlzdHJ1Y3QgdXN0b3JtX2V0aF9zdF9jb250ZXh0IHVzdG9ybV9zdF9jb250ZXh0OworCXN0cnVjdCB0c3Rvcm1fZXRoX3N0X2NvbnRleHQgdHN0b3JtX3N0X2NvbnRleHQ7CisJc3RydWN0IHhzdG9ybV9ldGhfYWdfY29udGV4dCB4c3Rvcm1fYWdfY29udGV4dDsKKwlzdHJ1Y3QgdHN0b3JtX2V0aF9hZ19jb250ZXh0IHRzdG9ybV9hZ19jb250ZXh0OworCXN0cnVjdCBjc3Rvcm1fZXRoX2FnX2NvbnRleHQgY3N0b3JtX2FnX2NvbnRleHQ7CisJc3RydWN0IHVzdG9ybV9ldGhfYWdfY29udGV4dCB1c3Rvcm1fYWdfY29udGV4dDsKKwlzdHJ1Y3QgdGltZXJzX2Jsb2NrX2NvbnRleHQgdGltZXJzX2NvbnRleHQ7CisJc3RydWN0IHhzdG9ybV9ldGhfc3RfY29udGV4dCB4c3Rvcm1fc3RfY29udGV4dDsKKwlzdHJ1Y3QgY3N0b3JtX2V0aF9zdF9jb250ZXh0IGNzdG9ybV9zdF9jb250ZXh0OworfTsKKworCisvKgorICogdW5pb24gZm9yIHNnbCBhbmQgcmF3IGRhdGEuCisgKi8KK3VuaW9uIGV0aF9zZ2xfb3JfcmF3X2RhdGEgeworCV9fbGUxNiBzZ2xbOF07CisJdTMyIHJhd19kYXRhWzRdOworfTsKKworLyoKKyAqIGV0aCBGUCBlbmQgYWdncmVnYXRpb24gQ1FFIHBhcmFtZXRlcnMgc3RydWN0CisgKi8KK3N0cnVjdCBldGhfZW5kX2FnZ19yeF9jcWUgeworCXU4IHR5cGVfZXJyb3JfZmxhZ3M7CisjZGVmaW5lIEVUSF9FTkRfQUdHX1JYX0NRRV9UWVBFICgweDM8PDApCisjZGVmaW5lIEVUSF9FTkRfQUdHX1JYX0NRRV9UWVBFX1NISUZUIDAKKyNkZWZpbmUgRVRIX0VORF9BR0dfUlhfQ1FFX1NHTF9SQVdfU0VMICgweDE8PDIpCisjZGVmaW5lIEVUSF9FTkRfQUdHX1JYX0NRRV9TR0xfUkFXX1NFTF9TSElGVCAyCisjZGVmaW5lIEVUSF9FTkRfQUdHX1JYX0NRRV9SRVNFUlZFRDAgKDB4MUY8PDMpCisjZGVmaW5lIEVUSF9FTkRfQUdHX1JYX0NRRV9SRVNFUlZFRDBfU0hJRlQgMworCXU4IHJlc2VydmVkMTsKKwl1OCBxdWV1ZV9pbmRleDsKKwl1OCByZXNlcnZlZDI7CisJX19sZTMyIHRpbWVzdGFtcF9kZWx0YTsKKwlfX2xlMTYgbnVtX29mX2NvYWxlc2NlZF9zZWdzOworCV9fbGUxNiBwa3RfbGVuOworCXU4IHB1cmVfYWNrX2NvdW50OworCXU4IHJlc2VydmVkMzsKKwlfX2xlMTYgcmVzZXJ2ZWQ0OworCXVuaW9uIGV0aF9zZ2xfb3JfcmF3X2RhdGEgc2dsX29yX3Jhd19kYXRhOworCV9fbGUzMiByZXNlcnZlZDVbOF07Cit9OworCisKKy8qCisgKiByZWd1bGFyIGV0aCBGUCBDUUUgcGFyYW1ldGVycyBzdHJ1Y3QKKyAqLworc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfY3FlIHsKKwl1OCB0eXBlX2Vycm9yX2ZsYWdzOworI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9UWVBFICgweDM8PDApCisjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1RZUEVfU0hJRlQgMAorI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9TR0xfUkFXX1NFTCAoMHgxPDwyKQorI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9TR0xfUkFXX1NFTF9TSElGVCAyCisjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1BIWV9ERUNPREVfRVJSX0ZMRyAoMHgxPDwzKQorI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9QSFlfREVDT0RFX0VSUl9GTEdfU0hJRlQgMworI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9JUF9CQURfWFNVTV9GTEcgKDB4MTw8NCkKKyNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfSVBfQkFEX1hTVU1fRkxHX1NISUZUIDQKKyNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfTDRfQkFEX1hTVU1fRkxHICgweDE8PDUpCisjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0w0X0JBRF9YU1VNX0ZMR19TSElGVCA1CisjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1JFU0VSVkVEMCAoMHgzPDw2KQorI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9SRVNFUlZFRDBfU0hJRlQgNgorCXU4IHN0YXR1c19mbGFnczsKKyNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfUlNTX0hBU0hfVFlQRSAoMHg3PDwwKQorI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9SU1NfSEFTSF9UWVBFX1NISUZUIDAKKyNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfUlNTX0hBU0hfRkxHICgweDE8PDMpCisjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1JTU19IQVNIX0ZMR19TSElGVCAzCisjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0JST0FEQ0FTVF9GTEcgKDB4MTw8NCkKKyNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfQlJPQURDQVNUX0ZMR19TSElGVCA0CisjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX01BQ19NQVRDSF9GTEcgKDB4MTw8NSkKKyNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfTUFDX01BVENIX0ZMR19TSElGVCA1CisjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0lQX1hTVU1fTk9fVkFMSURBVElPTl9GTEcgKDB4MTw8NikKKyNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfSVBfWFNVTV9OT19WQUxJREFUSU9OX0ZMR19TSElGVCA2CisjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0w0X1hTVU1fTk9fVkFMSURBVElPTl9GTEcgKDB4MTw8NykKKyNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfTDRfWFNVTV9OT19WQUxJREFUSU9OX0ZMR19TSElGVCA3CisJdTggcXVldWVfaW5kZXg7CisJdTggcGxhY2VtZW50X29mZnNldDsKKwlfX2xlMzIgcnNzX2hhc2hfcmVzdWx0OworCV9fbGUxNiB2bGFuX3RhZzsKKwlfX2xlMTYgcGt0X2xlbjsKKwlfX2xlMTYgbGVuX29uX2JkOworCXN0cnVjdCBwYXJzaW5nX2ZsYWdzIHBhcnNfZmxhZ3M7CisJdW5pb24gZXRoX3NnbF9vcl9yYXdfZGF0YSBzZ2xfb3JfcmF3X2RhdGE7CisJX19sZTMyIHJlc2VydmVkMVs4XTsKK307CisKKworLyoKKyAqIENvbW1hbmQgZm9yIHNldHRpbmcgY2xhc3NpZmljYXRpb24gZmxhZ3MgZm9yIGEgY2xpZW50CisgKi8KK3N0cnVjdCBldGhfZmlsdGVyX3J1bGVzX2NtZCB7CisJdTggY21kX2dlbmVyYWxfZGF0YTsKKyNkZWZpbmUgRVRIX0ZJTFRFUl9SVUxFU19DTURfUlhfQ01EICgweDE8PDApCisjZGVmaW5lIEVUSF9GSUxURVJfUlVMRVNfQ01EX1JYX0NNRF9TSElGVCAwCisjZGVmaW5lIEVUSF9GSUxURVJfUlVMRVNfQ01EX1RYX0NNRCAoMHgxPDwxKQorI2RlZmluZSBFVEhfRklMVEVSX1JVTEVTX0NNRF9UWF9DTURfU0hJRlQgMQorI2RlZmluZSBFVEhfRklMVEVSX1JVTEVTX0NNRF9SRVNFUlZFRDAgKDB4M0Y8PDIpCisjZGVmaW5lIEVUSF9GSUxURVJfUlVMRVNfQ01EX1JFU0VSVkVEMF9TSElGVCAyCisJdTggZnVuY19pZDsKKwl1OCBjbGllbnRfaWQ7CisJdTggcmVzZXJ2ZWQxOworCV9fbGUxNiBzdGF0ZTsKKyNkZWZpbmUgRVRIX0ZJTFRFUl9SVUxFU19DTURfVUNBU1RfRFJPUF9BTEwgKDB4MTw8MCkKKyNkZWZpbmUgRVRIX0ZJTFRFUl9SVUxFU19DTURfVUNBU1RfRFJPUF9BTExfU0hJRlQgMAorI2RlZmluZSBFVEhfRklMVEVSX1JVTEVTX0NNRF9VQ0FTVF9BQ0NFUFRfQUxMICgweDE8PDEpCisjZGVmaW5lIEVUSF9GSUxURVJfUlVMRVNfQ01EX1VDQVNUX0FDQ0VQVF9BTExfU0hJRlQgMQorI2RlZmluZSBFVEhfRklMVEVSX1JVTEVTX0NNRF9VQ0FTVF9BQ0NFUFRfVU5NQVRDSEVEICgweDE8PDIpCisjZGVmaW5lIEVUSF9GSUxURVJfUlVMRVNfQ01EX1VDQVNUX0FDQ0VQVF9VTk1BVENIRURfU0hJRlQgMgorI2RlZmluZSBFVEhfRklMVEVSX1JVTEVTX0NNRF9NQ0FTVF9EUk9QX0FMTCAoMHgxPDwzKQorI2RlZmluZSBFVEhfRklMVEVSX1JVTEVTX0NNRF9NQ0FTVF9EUk9QX0FMTF9TSElGVCAzCisjZGVmaW5lIEVUSF9GSUxURVJfUlVMRVNfQ01EX01DQVNUX0FDQ0VQVF9BTEwgKDB4MTw8NCkKKyNkZWZpbmUgRVRIX0ZJTFRFUl9SVUxFU19DTURfTUNBU1RfQUNDRVBUX0FMTF9TSElGVCA0CisjZGVmaW5lIEVUSF9GSUxURVJfUlVMRVNfQ01EX0JDQVNUX0FDQ0VQVF9BTEwgKDB4MTw8NSkKKyNkZWZpbmUgRVRIX0ZJTFRFUl9SVUxFU19DTURfQkNBU1RfQUNDRVBUX0FMTF9TSElGVCA1CisjZGVmaW5lIEVUSF9GSUxURVJfUlVMRVNfQ01EX0FDQ0VQVF9BTllfVkxBTiAoMHgxPDw2KQorI2RlZmluZSBFVEhfRklMVEVSX1JVTEVTX0NNRF9BQ0NFUFRfQU5ZX1ZMQU5fU0hJRlQgNgorI2RlZmluZSBFVEhfRklMVEVSX1JVTEVTX0NNRF9SRVNFUlZFRDIgKDB4MUZGPDw3KQorI2RlZmluZSBFVEhfRklMVEVSX1JVTEVTX0NNRF9SRVNFUlZFRDJfU0hJRlQgNworCV9fbGUxNiByZXNlcnZlZDM7CisJc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWQ0OworfTsKKworCisvKgorICogcGFyYW1ldGVycyBmb3IgZXRoIGNsYXNzaWZpY2F0aW9uIGZpbHRlcnMgcmFtcm9kCisgKi8KK3N0cnVjdCBldGhfZmlsdGVyX3J1bGVzX3JhbXJvZF9kYXRhIHsKKwlzdHJ1Y3QgZXRoX2NsYXNzaWZ5X2hlYWRlciBoZWFkZXI7CisJc3RydWN0IGV0aF9maWx0ZXJfcnVsZXNfY21kIHJ1bGVzW0ZJTFRFUl9SVUxFU19DT1VOVF07Cit9OworCisKKy8qCisgKiBwYXJhbWV0ZXJzIGZvciBldGggY2xhc3NpZmljYXRpb24gY29uZmlndXJhdGlvbiByYW1yb2QKKyAqLworc3RydWN0IGV0aF9nZW5lcmFsX3J1bGVzX3JhbXJvZF9kYXRhIHsKKwlzdHJ1Y3QgZXRoX2NsYXNzaWZ5X2hlYWRlciBoZWFkZXI7CisJdW5pb24gZXRoX2NsYXNzaWZ5X3J1bGVfY21kIHJ1bGVzW0NMQVNTSUZZX1JVTEVTX0NPVU5UXTsKK307CisKKworLyoKKyAqIFRoZSBkYXRhIGZvciBIYWx0IHJhbXJvZAorICovCitzdHJ1Y3QgZXRoX2hhbHRfcmFtcm9kX2RhdGEgeworCV9fbGUzMiBjbGllbnRfaWQ7CisJX19sZTMyIHJlc2VydmVkMDsKK307CisKKworLyoKKyAqIENvbW1hbmQgZm9yIHNldHRpbmcgbXVsdGljYXN0IGNsYXNzaWZpY2F0aW9uIGZvciBhIGNsaWVudAorICovCitzdHJ1Y3QgZXRoX211bHRpY2FzdF9ydWxlc19jbWQgeworCXU4IGNtZF9nZW5lcmFsX2RhdGE7CisjZGVmaW5lIEVUSF9NVUxUSUNBU1RfUlVMRVNfQ01EX1JYX0NNRCAoMHgxPDwwKQorI2RlZmluZSBFVEhfTVVMVElDQVNUX1JVTEVTX0NNRF9SWF9DTURfU0hJRlQgMAorI2RlZmluZSBFVEhfTVVMVElDQVNUX1JVTEVTX0NNRF9UWF9DTUQgKDB4MTw8MSkKKyNkZWZpbmUgRVRIX01VTFRJQ0FTVF9SVUxFU19DTURfVFhfQ01EX1NISUZUIDEKKyNkZWZpbmUgRVRIX01VTFRJQ0FTVF9SVUxFU19DTURfSVNfQUREICgweDE8PDIpCisjZGVmaW5lIEVUSF9NVUxUSUNBU1RfUlVMRVNfQ01EX0lTX0FERF9TSElGVCAyCisjZGVmaW5lIEVUSF9NVUxUSUNBU1RfUlVMRVNfQ01EX1JFU0VSVkVEMCAoMHgxRjw8MykKKyNkZWZpbmUgRVRIX01VTFRJQ0FTVF9SVUxFU19DTURfUkVTRVJWRUQwX1NISUZUIDMKKwl1OCBmdW5jX2lkOworCXU4IGJpbl9pZDsKKwl1OCBlbmdpbmVfaWQ7CisJX19sZTMyIHJlc2VydmVkMjsKKwlzdHJ1Y3QgcmVncGFpciByZXNlcnZlZDM7Cit9OworCisKKy8qCisgKiBwYXJhbWV0ZXJzIGZvciBtdWx0aWNhc3QgY2xhc3NpZmljYXRpb24gcmFtcm9kCisgKi8KK3N0cnVjdCBldGhfbXVsdGljYXN0X3J1bGVzX3JhbXJvZF9kYXRhIHsKKwlzdHJ1Y3QgZXRoX2NsYXNzaWZ5X2hlYWRlciBoZWFkZXI7CisJc3RydWN0IGV0aF9tdWx0aWNhc3RfcnVsZXNfY21kIHJ1bGVzW01VTFRJQ0FTVF9SVUxFU19DT1VOVF07Cit9OworCisKKy8qCisgKiBQbGFjZSBob2xkZXIgZm9yIHJhbXJvZHMgcHJvdG9jb2wgc3BlY2lmaWMgZGF0YQorICovCitzdHJ1Y3QgcmFtcm9kX2RhdGEgeworCV9fbGUzMiBkYXRhX2xvOworCV9fbGUzMiBkYXRhX2hpOworfTsKKworLyoKKyAqIHVuaW9uIGZvciByYW1yb2QgZGF0YSBmb3IgRXRoZXJuZXQgcHJvdG9jb2wgKENRRSkgKGZvcmNlIHNpemUgb2YgMTYgYml0cykKKyAqLwordW5pb24gZXRoX3JhbXJvZF9kYXRhIHsKKwlzdHJ1Y3QgcmFtcm9kX2RhdGEgZ2VuZXJhbDsKK307CisKKworLyoKKyAqIFJTUyB0b2VwbGl0eiBoYXNoIHR5cGUsIGFzIHJlcG9ydGVkIGluIENRRQorICovCitlbnVtIGV0aF9yc3NfaGFzaF90eXBlIHsKKwlERUZBVUxUX0hBU0hfVFlQRSwKKwlJUFY0X0hBU0hfVFlQRSwKKwlUQ1BfSVBWNF9IQVNIX1RZUEUsCisJSVBWNl9IQVNIX1RZUEUsCisJVENQX0lQVjZfSEFTSF9UWVBFLAorCVZMQU5fUFJJX0hBU0hfVFlQRSwKKwlFMUhPVl9QUklfSEFTSF9UWVBFLAorCURTQ1BfSEFTSF9UWVBFLAorCU1BWF9FVEhfUlNTX0hBU0hfVFlQRQorfTsKKworCisvKgorICogRXRoZXJuZXQgUlNTIG1vZGUKKyAqLworZW51bSBldGhfcnNzX21vZGUgeworCUVUSF9SU1NfTU9ERV9ESVNBQkxFRCwKKwlFVEhfUlNTX01PREVfUkVHVUxBUiwKKwlFVEhfUlNTX01PREVfVkxBTl9QUkksCisJRVRIX1JTU19NT0RFX0UxSE9WX1BSSSwKKwlFVEhfUlNTX01PREVfSVBfRFNDUCwKKwlNQVhfRVRIX1JTU19NT0RFCit9OworCisKKy8qCisgKiBwYXJhbWV0ZXJzIGZvciBSU1MgdXBkYXRlIHJhbXJvZCAoRTIpCisgKi8KK3N0cnVjdCBldGhfcnNzX3VwZGF0ZV9yYW1yb2RfZGF0YSB7CisJdTggcnNzX2VuZ2luZV9pZDsKKwl1OCBjYXBhYmlsaXRpZXM7CisjZGVmaW5lIEVUSF9SU1NfVVBEQVRFX1JBTVJPRF9EQVRBX0lQVjRfQ0FQQUJJTElUWSAoMHgxPDwwKQorI2RlZmluZSBFVEhfUlNTX1VQREFURV9SQU1ST0RfREFUQV9JUFY0X0NBUEFCSUxJVFlfU0hJRlQgMAorI2RlZmluZSBFVEhfUlNTX1VQREFURV9SQU1ST0RfREFUQV9JUFY0X1RDUF9DQVBBQklMSVRZICgweDE8PDEpCisjZGVmaW5lIEVUSF9SU1NfVVBEQVRFX1JBTVJPRF9EQVRBX0lQVjRfVENQX0NBUEFCSUxJVFlfU0hJRlQgMQorI2RlZmluZSBFVEhfUlNTX1VQREFURV9SQU1ST0RfREFUQV9JUFY0X1VEUF9DQVBBQklMSVRZICgweDE8PDIpCisjZGVmaW5lIEVUSF9SU1NfVVBEQVRFX1JBTVJPRF9EQVRBX0lQVjRfVURQX0NBUEFCSUxJVFlfU0hJRlQgMgorI2RlZmluZSBFVEhfUlNTX1VQREFURV9SQU1ST0RfREFUQV9JUFY2X0NBUEFCSUxJVFkgKDB4MTw8MykKKyNkZWZpbmUgRVRIX1JTU19VUERBVEVfUkFNUk9EX0RBVEFfSVBWNl9DQVBBQklMSVRZX1NISUZUIDMKKyNkZWZpbmUgRVRIX1JTU19VUERBVEVfUkFNUk9EX0RBVEFfSVBWNl9UQ1BfQ0FQQUJJTElUWSAoMHgxPDw0KQorI2RlZmluZSBFVEhfUlNTX1VQREFURV9SQU1ST0RfREFUQV9JUFY2X1RDUF9DQVBBQklMSVRZX1NISUZUIDQKKyNkZWZpbmUgRVRIX1JTU19VUERBVEVfUkFNUk9EX0RBVEFfSVBWNl9VRFBfQ0FQQUJJTElUWSAoMHgxPDw1KQorI2RlZmluZSBFVEhfUlNTX1VQREFURV9SQU1ST0RfREFUQV9JUFY2X1VEUF9DQVBBQklMSVRZX1NISUZUIDUKKyNkZWZpbmUgRVRIX1JTU19VUERBVEVfUkFNUk9EX0RBVEFfVVBEQVRFX1JTU19LRVkgKDB4MTw8NikKKyNkZWZpbmUgRVRIX1JTU19VUERBVEVfUkFNUk9EX0RBVEFfVVBEQVRFX1JTU19LRVlfU0hJRlQgNgorI2RlZmluZSBfX0VUSF9SU1NfVVBEQVRFX1JBTVJPRF9EQVRBX1JFU0VSVkVEMCAoMHgxPDw3KQorI2RlZmluZSBfX0VUSF9SU1NfVVBEQVRFX1JBTVJPRF9EQVRBX1JFU0VSVkVEMF9TSElGVCA3CisJdTggcnNzX3Jlc3VsdF9tYXNrOworCXU4IHJzc19tb2RlOworCV9fbGUzMiBfX3Jlc2VydmVkMjsKKwl1OCBpbmRpcmVjdGlvbl90YWJsZVtUX0VUSF9JTkRJUkVDVElPTl9UQUJMRV9TSVpFXTsKKwlfX2xlMzIgcnNzX2tleVtUX0VUSF9SU1NfS0VZXTsKKwlfX2xlMzIgZWNobzsKKwlfX2xlMzIgcmVzZXJ2ZWQzOworfTsKKworCisvKgorICogVGhlIGV0aCBSeCBCdWZmZXIgRGVzY3JpcHRvcgorICovCitzdHJ1Y3QgZXRoX3J4X2JkIHsKKwlfX2xlMzIgYWRkcl9sbzsKKwlfX2xlMzIgYWRkcl9oaTsKK307CisKKworLyoKKyAqIEV0aCBSeCBDcWUgc3RydWN0dXJlLSBnZW5lcmFsIHN0cnVjdHVyZSBmb3IgcmFtcm9kcworICovCitzdHJ1Y3QgY29tbW9uX3JhbXJvZF9ldGhfcnhfY3FlIHsKKwl1OCByYW1yb2RfdHlwZTsKKyNkZWZpbmUgQ09NTU9OX1JBTVJPRF9FVEhfUlhfQ1FFX1RZUEUgKDB4Mzw8MCkKKyNkZWZpbmUgQ09NTU9OX1JBTVJPRF9FVEhfUlhfQ1FFX1RZUEVfU0hJRlQgMAorI2RlZmluZSBDT01NT05fUkFNUk9EX0VUSF9SWF9DUUVfRVJST1IgKDB4MTw8MikKKyNkZWZpbmUgQ09NTU9OX1JBTVJPRF9FVEhfUlhfQ1FFX0VSUk9SX1NISUZUIDIKKyNkZWZpbmUgQ09NTU9OX1JBTVJPRF9FVEhfUlhfQ1FFX1JFU0VSVkVEMCAoMHgxRjw8MykKKyNkZWZpbmUgQ09NTU9OX1JBTVJPRF9FVEhfUlhfQ1FFX1JFU0VSVkVEMF9TSElGVCAzCisJdTggY29ubl90eXBlOworCV9fbGUxNiByZXNlcnZlZDE7CisJX19sZTMyIGNvbm5fYW5kX2NtZF9kYXRhOworI2RlZmluZSBDT01NT05fUkFNUk9EX0VUSF9SWF9DUUVfQ0lEICgweEZGRkZGRjw8MCkKKyNkZWZpbmUgQ09NTU9OX1JBTVJPRF9FVEhfUlhfQ1FFX0NJRF9TSElGVCAwCisjZGVmaW5lIENPTU1PTl9SQU1ST0RfRVRIX1JYX0NRRV9DTURfSUQgKDB4RkY8PDI0KQorI2RlZmluZSBDT01NT05fUkFNUk9EX0VUSF9SWF9DUUVfQ01EX0lEX1NISUZUIDI0CisJc3RydWN0IHJhbXJvZF9kYXRhIHByb3RvY29sX2RhdGE7CisJX19sZTMyIGVjaG87CisJX19sZTMyIHJlc2VydmVkMlsxMV07Cit9OworCisvKgorICogUnggTGFzdCBDUUUgaW4gcGFnZSAoaW4gRVRIKQorICovCitzdHJ1Y3QgZXRoX3J4X2NxZV9uZXh0X3BhZ2UgeworCV9fbGUzMiBhZGRyX2xvOworCV9fbGUzMiBhZGRyX2hpOworCV9fbGUzMiByZXNlcnZlZFsxNF07Cit9OworCisvKgorICogdW5pb24gZm9yIGFsbCBldGggcnggY3FlIHR5cGVzIChmaXggdGhlaXIgc2l6ZXMpCisgKi8KK3VuaW9uIGV0aF9yeF9jcWUgeworCXN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X2NxZSBmYXN0X3BhdGhfY3FlOworCXN0cnVjdCBjb21tb25fcmFtcm9kX2V0aF9yeF9jcWUgcmFtcm9kX2NxZTsKKwlzdHJ1Y3QgZXRoX3J4X2NxZV9uZXh0X3BhZ2UgbmV4dF9wYWdlX2NxZTsKKwlzdHJ1Y3QgZXRoX2VuZF9hZ2dfcnhfY3FlIGVuZF9hZ2dfY3FlOworfTsKKworCisvKgorICogVmFsdWVzIGZvciBSWCBFVEggQ1FFIHR5cGUgZmllbGQKKyAqLworZW51bSBldGhfcnhfY3FlX3R5cGUgeworCVJYX0VUSF9DUUVfVFlQRV9FVEhfRkFTVFBBVEgsCisJUlhfRVRIX0NRRV9UWVBFX0VUSF9SQU1ST0QsCisJUlhfRVRIX0NRRV9UWVBFX0VUSF9TVEFSVF9BR0csCisJUlhfRVRIX0NRRV9UWVBFX0VUSF9TVE9QX0FHRywKKwlNQVhfRVRIX1JYX0NRRV9UWVBFCit9OworCisKKy8qCisgKiBUeXBlIG9mIFNHTC9SYXcgZmllbGQgaW4gRVRIIFJYIGZhc3QgcGF0aCBDUUUKKyAqLworZW51bSBldGhfcnhfZnBfc2VsIHsKKwlFVEhfRlBfQ1FFX1JFR1VMQVIsCisJRVRIX0ZQX0NRRV9SQVcsCisJTUFYX0VUSF9SWF9GUF9TRUwKK307CisKKworLyoKKyAqIFRoZSBldGggUnggU0dFIERlc2NyaXB0b3IKKyAqLworc3RydWN0IGV0aF9yeF9zZ2UgeworCV9fbGUzMiBhZGRyX2xvOworCV9fbGUzMiBhZGRyX2hpOworfTsKKworCisvKgorICogY29tbW9uIGRhdGEgZm9yIGFsbCBwcm90b2NvbHMKKyAqLworc3RydWN0IHNwZV9oZHIgeworCV9fbGUzMiBjb25uX2FuZF9jbWRfZGF0YTsKKyNkZWZpbmUgU1BFX0hEUl9DSUQgKDB4RkZGRkZGPDwwKQorI2RlZmluZSBTUEVfSERSX0NJRF9TSElGVCAwCisjZGVmaW5lIFNQRV9IRFJfQ01EX0lEICgweEZGPDwyNCkKKyNkZWZpbmUgU1BFX0hEUl9DTURfSURfU0hJRlQgMjQKKwlfX2xlMTYgdHlwZTsKKyNkZWZpbmUgU1BFX0hEUl9DT05OX1RZUEUgKDB4RkY8PDApCisjZGVmaW5lIFNQRV9IRFJfQ09OTl9UWVBFX1NISUZUIDAKKyNkZWZpbmUgU1BFX0hEUl9GVU5DVElPTl9JRCAoMHhGRjw8OCkKKyNkZWZpbmUgU1BFX0hEUl9GVU5DVElPTl9JRF9TSElGVCA4CisJX19sZTE2IHJlc2VydmVkMTsKK307CisKKy8qCisgKiBzcGVjaWZpYyBkYXRhIGZvciBldGhlcm5ldCBzbG93IHBhdGggZWxlbWVudAorICovCit1bmlvbiBldGhfc3BlY2lmaWNfZGF0YSB7CisJdTggcHJvdG9jb2xfZGF0YVs4XTsKKwlzdHJ1Y3QgcmVncGFpciBjbGllbnRfdXBkYXRlX3JhbXJvZF9kYXRhOworCXN0cnVjdCByZWdwYWlyIGNsaWVudF9pbml0X3JhbXJvZF9pbml0X2RhdGE7CisJc3RydWN0IGV0aF9oYWx0X3JhbXJvZF9kYXRhIGhhbHRfcmFtcm9kX2RhdGE7CisJc3RydWN0IHJlZ3BhaXIgdXBkYXRlX2RhdGFfYWRkcjsKKwlzdHJ1Y3QgZXRoX2NvbW1vbl9yYW1yb2RfZGF0YSBjb21tb25fcmFtcm9kX2RhdGE7CisJc3RydWN0IHJlZ3BhaXIgY2xhc3NpZnlfY2ZnX2FkZHI7CisJc3RydWN0IHJlZ3BhaXIgZmlsdGVyX2NmZ19hZGRyOworCXN0cnVjdCByZWdwYWlyIG1jYXN0X2NmZ19hZGRyOworfTsKKworLyoKKyAqIEV0aGVybmV0IHNsb3cgcGF0aCBlbGVtZW50CisgKi8KK3N0cnVjdCBldGhfc3BlIHsKKwlzdHJ1Y3Qgc3BlX2hkciBoZHI7CisJdW5pb24gZXRoX3NwZWNpZmljX2RhdGEgZGF0YTsKK307CisKKworLyoKKyAqIEV0aGVybmV0IGNvbW1hbmQgSUQgZm9yIHNsb3cgcGF0aCBlbGVtZW50cworICovCitlbnVtIGV0aF9zcHFlX2NtZF9pZCB7CisJUkFNUk9EX0NNRF9JRF9FVEhfVU5VU0VELAorCVJBTVJPRF9DTURfSURfRVRIX0NMSUVOVF9TRVRVUCwKKwlSQU1ST0RfQ01EX0lEX0VUSF9IQUxULAorCVJBTVJPRF9DTURfSURfRVRIX0ZPUldBUkRfU0VUVVAsCisJUkFNUk9EX0NNRF9JRF9FVEhfVFhfUVVFVUVfU0VUVVAsCisJUkFNUk9EX0NNRF9JRF9FVEhfQ0xJRU5UX1VQREFURSwKKwlSQU1ST0RfQ01EX0lEX0VUSF9FTVBUWSwKKwlSQU1ST0RfQ01EX0lEX0VUSF9URVJNSU5BVEUsCisJUkFNUk9EX0NNRF9JRF9FVEhfVFBBX1VQREFURSwKKwlSQU1ST0RfQ01EX0lEX0VUSF9DTEFTU0lGSUNBVElPTl9SVUxFUywKKwlSQU1ST0RfQ01EX0lEX0VUSF9GSUxURVJfUlVMRVMsCisJUkFNUk9EX0NNRF9JRF9FVEhfTVVMVElDQVNUX1JVTEVTLAorCVJBTVJPRF9DTURfSURfRVRIX1JTU19VUERBVEUsCisJUkFNUk9EX0NNRF9JRF9FVEhfU0VUX01BQywKKwlNQVhfRVRIX1NQUUVfQ01EX0lECit9OworCisKKy8qCisgKiBldGggdHBhIHVwZGF0ZSBjb21tYW5kCisgKi8KK2VudW0gZXRoX3RwYV91cGRhdGVfY29tbWFuZCB7CisJVFBBX1VQREFURV9OT05FX0NPTU1BTkQsCisJVFBBX1VQREFURV9FTkFCTEVfQ09NTUFORCwKKwlUUEFfVVBEQVRFX0RJU0FCTEVfQ09NTUFORCwKKwlNQVhfRVRIX1RQQV9VUERBVEVfQ09NTUFORAorfTsKKworCisvKgorICogVHggcmVndWxhciBCRCBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGV0aF90eF9iZCB7CisJX19sZTMyIGFkZHJfbG87CisJX19sZTMyIGFkZHJfaGk7CisJX19sZTE2IHRvdGFsX3BrdF9ieXRlczsKKwlfX2xlMTYgbmJ5dGVzOworCXU4IHJlc2VydmVkWzRdOworfTsKKworCiAvKgogICogc3RydWN0dXJlIGZvciBlYXN5IGFjY2Vzc2liaWxpdHkgdG8gYXNzZW1ibGVyCiAgKi8KQEAgLTI0MjcsMjQgKzM4ODEsMTcgQEAKIAlfX2xlMTYgdmxhbl9vcl9ldGhlcnR5cGU7CiAJc3RydWN0IGV0aF90eF9iZF9mbGFncyBiZF9mbGFnczsKIAl1OCBnZW5lcmFsX2RhdGE7Ci0jZGVmaW5lIEVUSF9UWF9TVEFSVF9CRF9IRFJfTkJEUyAoMHgzRjw8MCkKKyNkZWZpbmUgRVRIX1RYX1NUQVJUX0JEX0hEUl9OQkRTICgweEY8PDApCiAjZGVmaW5lIEVUSF9UWF9TVEFSVF9CRF9IRFJfTkJEU19TSElGVCAwCisjZGVmaW5lIEVUSF9UWF9TVEFSVF9CRF9GT1JDRV9WTEFOX01PREUgKDB4MTw8NCkKKyNkZWZpbmUgRVRIX1RYX1NUQVJUX0JEX0ZPUkNFX1ZMQU5fTU9ERV9TSElGVCA0CisjZGVmaW5lIEVUSF9UWF9TVEFSVF9CRF9SRVNSRVZFRCAoMHgxPDw1KQorI2RlZmluZSBFVEhfVFhfU1RBUlRfQkRfUkVTUkVWRURfU0hJRlQgNQogI2RlZmluZSBFVEhfVFhfU1RBUlRfQkRfRVRIX0FERFJfVFlQRSAoMHgzPDw2KQogI2RlZmluZSBFVEhfVFhfU1RBUlRfQkRfRVRIX0FERFJfVFlQRV9TSElGVCA2CiB9OwogCiAvKgotICogVHggcmVndWxhciBCRCBzdHJ1Y3R1cmUKLSAqLwotc3RydWN0IGV0aF90eF9iZCB7Ci0JX19sZTMyIGFkZHJfbG87Ci0JX19sZTMyIGFkZHJfaGk7Ci0JX19sZTE2IHRvdGFsX3BrdF9ieXRlczsKLQlfX2xlMTYgbmJ5dGVzOwotCXU4IHJlc2VydmVkWzRdOwotfTsKLQotLyoKICAqIFR4IHBhcnNpbmcgQkQgc3RydWN0dXJlIGZvciBFVEggRTEvRTFoCiAgKi8KIHN0cnVjdCBldGhfdHhfcGFyc2VfYmRfZTF4IHsKQEAgLTI1MjYsMzM2ICszOTczLDYgQEAKIAlzdHJ1Y3QgZXRoX3R4X25leHRfYmQgbmV4dF9iZDsKIH07CiAKLQotLyoKLSAqIFRoZSBldGggc3Rvcm0gY29udGV4dCBvZiBYc3Rvcm0KLSAqLwotc3RydWN0IHhzdG9ybV9ldGhfc3RfY29udGV4dCB7Ci0JdTMyIHJlc2VydmVkMFs2MF07Ci19OwotCi0vKgotICogVGhlIGV0aCBzdG9ybSBjb250ZXh0IG9mIENzdG9ybQotICovCi1zdHJ1Y3QgY3N0b3JtX2V0aF9zdF9jb250ZXh0IHsKLQl1MzIgX19yZXNlcnZlZDBbNF07Ci19OwotCi0vKgotICogRXRoZXJuZXQgY29ubmVjdGlvbiBjb250ZXh0Ci0gKi8KLXN0cnVjdCBldGhfY29udGV4dCB7Ci0Jc3RydWN0IHVzdG9ybV9ldGhfc3RfY29udGV4dCB1c3Rvcm1fc3RfY29udGV4dDsKLQlzdHJ1Y3QgdHN0b3JtX2V0aF9zdF9jb250ZXh0IHRzdG9ybV9zdF9jb250ZXh0OwotCXN0cnVjdCB4c3Rvcm1fZXRoX2FnX2NvbnRleHQgeHN0b3JtX2FnX2NvbnRleHQ7Ci0Jc3RydWN0IHRzdG9ybV9ldGhfYWdfY29udGV4dCB0c3Rvcm1fYWdfY29udGV4dDsKLQlzdHJ1Y3QgY3N0b3JtX2V0aF9hZ19jb250ZXh0IGNzdG9ybV9hZ19jb250ZXh0OwotCXN0cnVjdCB1c3Rvcm1fZXRoX2FnX2NvbnRleHQgdXN0b3JtX2FnX2NvbnRleHQ7Ci0Jc3RydWN0IHRpbWVyc19ibG9ja19jb250ZXh0IHRpbWVyc19jb250ZXh0OwotCXN0cnVjdCB4c3Rvcm1fZXRoX3N0X2NvbnRleHQgeHN0b3JtX3N0X2NvbnRleHQ7Ci0Jc3RydWN0IGNzdG9ybV9ldGhfc3RfY29udGV4dCBjc3Rvcm1fc3RfY29udGV4dDsKLX07Ci0KLQotLyoKLSAqIEV0aGVybmV0IGRvb3JiZWxsCi0gKi8KLXN0cnVjdCBldGhfdHhfZG9vcmJlbGwgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBucGFja2V0czsKLQl1OCBwYXJhbXM7Ci0jZGVmaW5lIEVUSF9UWF9ET09SQkVMTF9OVU1fQkRTICgweDNGPDwwKQotI2RlZmluZSBFVEhfVFhfRE9PUkJFTExfTlVNX0JEU19TSElGVCAwCi0jZGVmaW5lIEVUSF9UWF9ET09SQkVMTF9SRVNFUlZFRF9UWF9GSU5fRkxBRyAoMHgxPDw2KQotI2RlZmluZSBFVEhfVFhfRE9PUkJFTExfUkVTRVJWRURfVFhfRklOX0ZMQUdfU0hJRlQgNgotI2RlZmluZSBFVEhfVFhfRE9PUkJFTExfU1BBUkUgKDB4MTw8NykKLSNkZWZpbmUgRVRIX1RYX0RPT1JCRUxMX1NQQVJFX1NISUZUIDcKLQlzdHJ1Y3QgZG9vcmJlbGxfaGRyIGhkcjsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXN0cnVjdCBkb29yYmVsbF9oZHIgaGRyOwotCXU4IHBhcmFtczsKLSNkZWZpbmUgRVRIX1RYX0RPT1JCRUxMX05VTV9CRFMgKDB4M0Y8PDApCi0jZGVmaW5lIEVUSF9UWF9ET09SQkVMTF9OVU1fQkRTX1NISUZUIDAKLSNkZWZpbmUgRVRIX1RYX0RPT1JCRUxMX1JFU0VSVkVEX1RYX0ZJTl9GTEFHICgweDE8PDYpCi0jZGVmaW5lIEVUSF9UWF9ET09SQkVMTF9SRVNFUlZFRF9UWF9GSU5fRkxBR19TSElGVCA2Ci0jZGVmaW5lIEVUSF9UWF9ET09SQkVMTF9TUEFSRSAoMHgxPDw3KQotI2RlZmluZSBFVEhfVFhfRE9PUkJFTExfU1BBUkVfU0hJRlQgNwotCXUxNiBucGFja2V0czsKLSNlbmRpZgotfTsKLQotCi0vKgotICogY2xpZW50IGluaXQgZmMgZGF0YQotICovCi1zdHJ1Y3QgY2xpZW50X2luaXRfZmNfZGF0YSB7Ci0JX19sZTE2IGNxZV9wYXVzZV90aHJfbG93OwotCV9fbGUxNiBjcWVfcGF1c2VfdGhyX2hpZ2g7Ci0JX19sZTE2IGJkX3BhdXNlX3Rocl9sb3c7Ci0JX19sZTE2IGJkX3BhdXNlX3Rocl9oaWdoOwotCV9fbGUxNiBzZ2VfcGF1c2VfdGhyX2xvdzsKLQlfX2xlMTYgc2dlX3BhdXNlX3Rocl9oaWdoOwotCV9fbGUxNiByeF9jb3NfbWFzazsKLQl1OCBzYWZjX2dyb3VwX251bTsKLQl1OCBzYWZjX2dyb3VwX2VuX2ZsZzsKLQl1OCB0cmFmZmljX3R5cGU7Ci0JdTggcmVzZXJ2ZWQwOwotCV9fbGUxNiByZXNlcnZlZDE7Ci0JX19sZTMyIHJlc2VydmVkMjsKLX07Ci0KLQotLyoKLSAqIGNsaWVudCBpbml0IHJhbXJvZCBkYXRhCi0gKi8KLXN0cnVjdCBjbGllbnRfaW5pdF9nZW5lcmFsX2RhdGEgewotCXU4IGNsaWVudF9pZDsKLQl1OCBzdGF0aXN0aWNzX2NvdW50ZXJfaWQ7Ci0JdTggc3RhdGlzdGljc19lbl9mbGc7Ci0JdTggaXNfZmNvZV9mbGc7Ci0JdTggYWN0aXZhdGVfZmxnOwotCXU4IHNwX2NsaWVudF9pZDsKLQlfX2xlMTYgcmVzZXJ2ZWQwOwotCV9fbGUzMiByZXNlcnZlZDFbMl07Ci19OwotCi0KLS8qCi0gKiBjbGllbnQgaW5pdCByeCBkYXRhCi0gKi8KLXN0cnVjdCBjbGllbnRfaW5pdF9yeF9kYXRhIHsKLQl1OCB0cGFfZW5fZmxnOwotCXU4IHZtcXVldWVfbW9kZV9lbl9mbGc7Ci0JdTggZXh0cmFfZGF0YV9vdmVyX3NnbF9lbl9mbGc7Ci0JdTggY2FjaGVfbGluZV9hbGlnbm1lbnRfbG9nX3NpemU7Ci0JdTggZW5hYmxlX2R5bmFtaWNfaGM7Ci0JdTggbWF4X3NnZXNfZm9yX3BhY2tldDsKLQl1OCBjbGllbnRfcXpvbmVfaWQ7Ci0JdTggZHJvcF9pcF9jc19lcnJfZmxnOwotCXU4IGRyb3BfdGNwX2NzX2Vycl9mbGc7Ci0JdTggZHJvcF90dGwwX2ZsZzsKLQl1OCBkcm9wX3VkcF9jc19lcnJfZmxnOwotCXU4IGlubmVyX3ZsYW5fcmVtb3ZhbF9lbmFibGVfZmxnOwotCXU4IG91dGVyX3ZsYW5fcmVtb3ZhbF9lbmFibGVfZmxnOwotCXU4IHN0YXR1c19ibG9ja19pZDsKLQl1OCByeF9zYl9pbmRleF9udW1iZXI7Ci0JdTggcmVzZXJ2ZWQwWzNdOwotCV9fbGUxNiBiZF9idWZmX3NpemU7Ci0JX19sZTE2IHNnZV9idWZmX3NpemU7Ci0JX19sZTE2IG10dTsKLQlzdHJ1Y3QgcmVncGFpciBiZF9wYWdlX2Jhc2U7Ci0Jc3RydWN0IHJlZ3BhaXIgc2dlX3BhZ2VfYmFzZTsKLQlzdHJ1Y3QgcmVncGFpciBjcWVfcGFnZV9iYXNlOwotCXU4IGlzX2xlYWRpbmdfcnNzOwotCXU4IGlzX2FwcHJveF9tY2FzdDsKLQlfX2xlMTYgbWF4X2FnZ19zaXplOwotCV9fbGUzMiByZXNlcnZlZDJbM107Ci19OwotCi0vKgotICogY2xpZW50IGluaXQgdHggZGF0YQotICovCi1zdHJ1Y3QgY2xpZW50X2luaXRfdHhfZGF0YSB7Ci0JdTggZW5mb3JjZV9zZWN1cml0eV9mbGc7Ci0JdTggdHhfc3RhdHVzX2Jsb2NrX2lkOwotCXU4IHR4X3NiX2luZGV4X251bWJlcjsKLQl1OCByZXNlcnZlZDA7Ci0JX19sZTE2IG10dTsKLQlfX2xlMTYgcmVzZXJ2ZWQxOwotCXN0cnVjdCByZWdwYWlyIHR4X2JkX3BhZ2VfYmFzZTsKLQlfX2xlMzIgcmVzZXJ2ZWQyWzJdOwotfTsKLQotLyoKLSAqIGNsaWVudCBpbml0IHJhbXJvZCBkYXRhCi0gKi8KLXN0cnVjdCBjbGllbnRfaW5pdF9yYW1yb2RfZGF0YSB7Ci0Jc3RydWN0IGNsaWVudF9pbml0X2dlbmVyYWxfZGF0YSBnZW5lcmFsOwotCXN0cnVjdCBjbGllbnRfaW5pdF9yeF9kYXRhIHJ4OwotCXN0cnVjdCBjbGllbnRfaW5pdF90eF9kYXRhIHR4OwotCXN0cnVjdCBjbGllbnRfaW5pdF9mY19kYXRhIGZjOwotfTsKLQotCi0vKgotICogVGhlIGRhdGEgY29udGFpbiBjbGllbnQgSUQgbmVlZCB0byB0aGUgcmFtcm9kCi0gKi8KLXN0cnVjdCBldGhfY29tbW9uX3JhbXJvZF9kYXRhIHsKLQl1MzIgY2xpZW50X2lkOwotCXUzMiByZXNlcnZlZDE7Ci19OwotCi0KLS8qCi0gKiB1bmlvbiBmb3Igc2dsIGFuZCByYXcgZGF0YS4KLSAqLwotdW5pb24gZXRoX3NnbF9vcl9yYXdfZGF0YSB7Ci0JX19sZTE2IHNnbFs4XTsKLQl1MzIgcmF3X2RhdGFbNF07Ci19OwotCi0vKgotICogcmVndWxhciBldGggRlAgQ1FFIHBhcmFtZXRlcnMgc3RydWN0Ci0gKi8KLXN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X2NxZSB7Ci0JdTggdHlwZV9lcnJvcl9mbGFnczsKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfVFlQRSAoMHgxPDwwKQotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9UWVBFX1NISUZUIDAKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfUEhZX0RFQ09ERV9FUlJfRkxHICgweDE8PDEpCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1BIWV9ERUNPREVfRVJSX0ZMR19TSElGVCAxCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0lQX0JBRF9YU1VNX0ZMRyAoMHgxPDwyKQotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9JUF9CQURfWFNVTV9GTEdfU0hJRlQgMgotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9MNF9CQURfWFNVTV9GTEcgKDB4MTw8MykKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfTDRfQkFEX1hTVU1fRkxHX1NISUZUIDMKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfU1RBUlRfRkxHICgweDE8PDQpCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1NUQVJUX0ZMR19TSElGVCA0Ci0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0VORF9GTEcgKDB4MTw8NSkKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfRU5EX0ZMR19TSElGVCA1Ci0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1NHTF9SQVdfU0VMICgweDM8PDYpCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1NHTF9SQVdfU0VMX1NISUZUIDYKLQl1OCBzdGF0dXNfZmxhZ3M7Ci0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1JTU19IQVNIX1RZUEUgKDB4Nzw8MCkKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9DUUVfUlNTX0hBU0hfVFlQRV9TSElGVCAwCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1JTU19IQVNIX0ZMRyAoMHgxPDwzKQotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9SU1NfSEFTSF9GTEdfU0hJRlQgMwotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9CUk9BRENBU1RfRkxHICgweDE8PDQpCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0JST0FEQ0FTVF9GTEdfU0hJRlQgNAotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9NQUNfTUFUQ0hfRkxHICgweDE8PDUpCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX01BQ19NQVRDSF9GTEdfU0hJRlQgNQotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9JUF9YU1VNX05PX1ZBTElEQVRJT05fRkxHICgweDE8PDYpCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0lQX1hTVU1fTk9fVkFMSURBVElPTl9GTEdfU0hJRlQgNgotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX0NRRV9MNF9YU1VNX05PX1ZBTElEQVRJT05fRkxHICgweDE8PDcpCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX0w0X1hTVU1fTk9fVkFMSURBVElPTl9GTEdfU0hJRlQgNwotCXU4IHBsYWNlbWVudF9vZmZzZXQ7Ci0JdTggcXVldWVfaW5kZXg7Ci0JX19sZTMyIHJzc19oYXNoX3Jlc3VsdDsKLQlfX2xlMTYgdmxhbl90YWc7Ci0JX19sZTE2IHBrdF9sZW47Ci0JX19sZTE2IGxlbl9vbl9iZDsKLQlzdHJ1Y3QgcGFyc2luZ19mbGFncyBwYXJzX2ZsYWdzOwotCXVuaW9uIGV0aF9zZ2xfb3JfcmF3X2RhdGEgc2dsX29yX3Jhd19kYXRhOwotfTsKLQotCi0vKgotICogVGhlIGRhdGEgZm9yIFJTUyBzZXR1cCByYW1yb2QKLSAqLwotc3RydWN0IGV0aF9oYWx0X3JhbXJvZF9kYXRhIHsKLQl1MzIgY2xpZW50X2lkOwotCXUzMiByZXNlcnZlZDA7Ci19OwotCi0vKgotICogVGhlIGRhdGEgZm9yIHN0YXRpc3RpY3MgcXVlcnkgcmFtcm9kCi0gKi8KLXN0cnVjdCBjb21tb25fcXVlcnlfcmFtcm9kX2RhdGEgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IHJlc2VydmVkMDsKLQl1OCBjb2xsZWN0X3BvcnQ7Ci0JdTE2IGRydl9jb3VudGVyOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGRydl9jb3VudGVyOwotCXU4IGNvbGxlY3RfcG9ydDsKLQl1OCByZXNlcnZlZDA7Ci0jZW5kaWYKLQl1MzIgY3RyX2lkX3ZlY3RvcjsKLX07Ci0KLQotLyoKLSAqIFBsYWNlIGhvbGRlciBmb3IgcmFtcm9kcyBwcm90b2NvbCBzcGVjaWZpYyBkYXRhCi0gKi8KLXN0cnVjdCByYW1yb2RfZGF0YSB7Ci0JX19sZTMyIGRhdGFfbG87Ci0JX19sZTMyIGRhdGFfaGk7Ci19OwotCi0vKgotICogdW5pb24gZm9yIHJhbXJvZCBkYXRhIGZvciBFdGhlcm5ldCBwcm90b2NvbCAoQ1FFKSAoZm9yY2Ugc2l6ZSBvZiAxNiBiaXRzKQotICovCi11bmlvbiBldGhfcmFtcm9kX2RhdGEgewotCXN0cnVjdCByYW1yb2RfZGF0YSBnZW5lcmFsOwotfTsKLQotCi0vKgotICogRXRoIFJ4IENxZSBzdHJ1Y3R1cmUtIGdlbmVyYWwgc3RydWN0dXJlIGZvciByYW1yb2RzCi0gKi8KLXN0cnVjdCBjb21tb25fcmFtcm9kX2V0aF9yeF9jcWUgewotCXU4IHJhbXJvZF90eXBlOwotI2RlZmluZSBDT01NT05fUkFNUk9EX0VUSF9SWF9DUUVfVFlQRSAoMHgxPDwwKQotI2RlZmluZSBDT01NT05fUkFNUk9EX0VUSF9SWF9DUUVfVFlQRV9TSElGVCAwCi0jZGVmaW5lIENPTU1PTl9SQU1ST0RfRVRIX1JYX0NRRV9FUlJPUiAoMHgxPDwxKQotI2RlZmluZSBDT01NT05fUkFNUk9EX0VUSF9SWF9DUUVfRVJST1JfU0hJRlQgMQotI2RlZmluZSBDT01NT05fUkFNUk9EX0VUSF9SWF9DUUVfUkVTRVJWRUQwICgweDNGPDwyKQotI2RlZmluZSBDT01NT05fUkFNUk9EX0VUSF9SWF9DUUVfUkVTRVJWRUQwX1NISUZUIDIKLQl1OCBjb25uX3R5cGU7Ci0JX19sZTE2IHJlc2VydmVkMTsKLQlfX2xlMzIgY29ubl9hbmRfY21kX2RhdGE7Ci0jZGVmaW5lIENPTU1PTl9SQU1ST0RfRVRIX1JYX0NRRV9DSUQgKDB4RkZGRkZGPDwwKQotI2RlZmluZSBDT01NT05fUkFNUk9EX0VUSF9SWF9DUUVfQ0lEX1NISUZUIDAKLSNkZWZpbmUgQ09NTU9OX1JBTVJPRF9FVEhfUlhfQ1FFX0NNRF9JRCAoMHhGRjw8MjQpCi0jZGVmaW5lIENPTU1PTl9SQU1ST0RfRVRIX1JYX0NRRV9DTURfSURfU0hJRlQgMjQKLQlzdHJ1Y3QgcmFtcm9kX2RhdGEgcHJvdG9jb2xfZGF0YTsKLQlfX2xlMzIgcmVzZXJ2ZWQyWzRdOwotfTsKLQotLyoKLSAqIFJ4IExhc3QgQ1FFIGluIHBhZ2UgKGluIEVUSCkKLSAqLwotc3RydWN0IGV0aF9yeF9jcWVfbmV4dF9wYWdlIHsKLQlfX2xlMzIgYWRkcl9sbzsKLQlfX2xlMzIgYWRkcl9oaTsKLQlfX2xlMzIgcmVzZXJ2ZWRbNl07Ci19OwotCi0vKgotICogdW5pb24gZm9yIGFsbCBldGggcnggY3FlIHR5cGVzIChmaXggdGhlaXIgc2l6ZXMpCi0gKi8KLXVuaW9uIGV0aF9yeF9jcWUgewotCXN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X2NxZSBmYXN0X3BhdGhfY3FlOwotCXN0cnVjdCBjb21tb25fcmFtcm9kX2V0aF9yeF9jcWUgcmFtcm9kX2NxZTsKLQlzdHJ1Y3QgZXRoX3J4X2NxZV9uZXh0X3BhZ2UgbmV4dF9wYWdlX2NxZTsKLX07Ci0KLQotLyoKLSAqIGNvbW1vbiBkYXRhIGZvciBhbGwgcHJvdG9jb2xzCi0gKi8KLXN0cnVjdCBzcGVfaGRyIHsKLQlfX2xlMzIgY29ubl9hbmRfY21kX2RhdGE7Ci0jZGVmaW5lIFNQRV9IRFJfQ0lEICgweEZGRkZGRjw8MCkKLSNkZWZpbmUgU1BFX0hEUl9DSURfU0hJRlQgMAotI2RlZmluZSBTUEVfSERSX0NNRF9JRCAoMHhGRjw8MjQpCi0jZGVmaW5lIFNQRV9IRFJfQ01EX0lEX1NISUZUIDI0Ci0JX19sZTE2IHR5cGU7Ci0jZGVmaW5lIFNQRV9IRFJfQ09OTl9UWVBFICgweEZGPDwwKQotI2RlZmluZSBTUEVfSERSX0NPTk5fVFlQRV9TSElGVCAwCi0jZGVmaW5lIFNQRV9IRFJfRlVOQ1RJT05fSUQgKDB4RkY8PDgpCi0jZGVmaW5lIFNQRV9IRFJfRlVOQ1RJT05fSURfU0hJRlQgOAotCV9fbGUxNiByZXNlcnZlZDE7Ci19OwotCi0vKgotICogRXRoZXJuZXQgc2xvdyBwYXRoIGVsZW1lbnQKLSAqLwotdW5pb24gZXRoX3NwZWNpZmljX2RhdGEgewotCXU4IHByb3RvY29sX2RhdGFbOF07Ci0Jc3RydWN0IHJlZ3BhaXIgY2xpZW50X2luaXRfcmFtcm9kX2luaXRfZGF0YTsKLQlzdHJ1Y3QgZXRoX2hhbHRfcmFtcm9kX2RhdGEgaGFsdF9yYW1yb2RfZGF0YTsKLQlzdHJ1Y3QgcmVncGFpciB1cGRhdGVfZGF0YV9hZGRyOwotCXN0cnVjdCBldGhfY29tbW9uX3JhbXJvZF9kYXRhIGNvbW1vbl9yYW1yb2RfZGF0YTsKLX07Ci0KLS8qCi0gKiBFdGhlcm5ldCBzbG93IHBhdGggZWxlbWVudAotICovCi1zdHJ1Y3QgZXRoX3NwZSB7Ci0Jc3RydWN0IHNwZV9oZHIgaGRyOwotCXVuaW9uIGV0aF9zcGVjaWZpY19kYXRhIGRhdGE7Ci19OwotCi0KIC8qCiAgKiBhcnJheSBvZiAxMyBiZHMgYXMgYXBwZWFycyBpbiB0aGUgZXRoIHhzdG9ybSBjb250ZXh0CiAgKi8KQEAgLTI4NjUsODYgKzM5ODIsMjUgQEAKIAogCiAvKgotICogQ29tbW9uIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBwZXIgZnVuY3Rpb24gaW4gVHN0b3JtCisgKiBWTEFOIG1vZGUgb24gVFggQkRzCiAgKi8KLXN0cnVjdCB0c3Rvcm1fZXRoX2Z1bmN0aW9uX2NvbW1vbl9jb25maWcgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IHJlc2VydmVkMTsKLQl1OCByc3NfcmVzdWx0X21hc2s7Ci0JdTE2IGNvbmZpZ19mbGFnczsKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY0X0NBUEFCSUxJVFkgKDB4MTw8MCkKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY0X0NBUEFCSUxJVFlfU0hJRlQgMAotI2RlZmluZSBUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfUlNTX0lQVjRfVENQX0NBUEFCSUxJVFkgKDB4MTw8MSkKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY0X1RDUF9DQVBBQklMSVRZX1NISUZUIDEKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY2X0NBUEFCSUxJVFkgKDB4MTw8MikKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY2X0NBUEFCSUxJVFlfU0hJRlQgMgotI2RlZmluZSBUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfUlNTX0lQVjZfVENQX0NBUEFCSUxJVFkgKDB4MTw8MykKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY2X1RDUF9DQVBBQklMSVRZX1NISUZUIDMKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19NT0RFICgweDc8PDQpCi0jZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfTU9ERV9TSElGVCA0Ci0jZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19FTkFCTEVfVFBBICgweDE8PDcpCi0jZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19FTkFCTEVfVFBBX1NISUZUIDcKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1ZMQU5fRklMVEVSSU5HX0VOQUJMRSAoMHgxPDw4KQotI2RlZmluZSBUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfVkxBTl9GSUxURVJJTkdfRU5BQkxFX1NISUZUIDgKLSNkZWZpbmUgX19UU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfUkVTRVJWRUQwICgweDdGPDw5KQotI2RlZmluZSBfX1RTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SRVNFUlZFRDBfU0hJRlQgOQotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGNvbmZpZ19mbGFnczsKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY0X0NBUEFCSUxJVFkgKDB4MTw8MCkKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY0X0NBUEFCSUxJVFlfU0hJRlQgMAotI2RlZmluZSBUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfUlNTX0lQVjRfVENQX0NBUEFCSUxJVFkgKDB4MTw8MSkKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY0X1RDUF9DQVBBQklMSVRZX1NISUZUIDEKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY2X0NBUEFCSUxJVFkgKDB4MTw8MikKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY2X0NBUEFCSUxJVFlfU0hJRlQgMgotI2RlZmluZSBUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfUlNTX0lQVjZfVENQX0NBUEFCSUxJVFkgKDB4MTw8MykKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY2X1RDUF9DQVBBQklMSVRZX1NISUZUIDMKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19NT0RFICgweDc8PDQpCi0jZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfTU9ERV9TSElGVCA0Ci0jZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19FTkFCTEVfVFBBICgweDE8PDcpCi0jZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19FTkFCTEVfVFBBX1NISUZUIDcKLSNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1ZMQU5fRklMVEVSSU5HX0VOQUJMRSAoMHgxPDw4KQotI2RlZmluZSBUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfVkxBTl9GSUxURVJJTkdfRU5BQkxFX1NISUZUIDgKLSNkZWZpbmUgX19UU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfUkVTRVJWRUQwICgweDdGPDw5KQotI2RlZmluZSBfX1RTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SRVNFUlZFRDBfU0hJRlQgOQotCXU4IHJzc19yZXN1bHRfbWFzazsKLQl1OCByZXNlcnZlZDE7Ci0jZW5kaWYKLQl1MTYgdmxhbl9pZFsyXTsKK2VudW0gZXRoX3R4X3ZsYW5fdHlwZSB7CisJWF9FVEhfTk9fVkxBTiwKKwlYX0VUSF9PVVRCQU5EX1ZMQU4sCisJWF9FVEhfSU5CQU5EX1ZMQU4sCisJWF9FVEhfRldfQURERURfVkxBTiwKKwlNQVhfRVRIX1RYX1ZMQU5fVFlQRQogfTsKIAotLyoKLSAqIFJTUyBpZGlyZWN0aW9uIHRhYmxlIHVwZGF0ZSBjb25maWd1cmF0aW9uCi0gKi8KLXN0cnVjdCByc3NfdXBkYXRlX2NvbmZpZyB7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHRvZV9yc3NfYml0bWFwOwotCXUxNiBmbGFnczsKLSNkZWZpbmUgUlNTX1VQREFURV9DT05GSUdfRVRIX1VQREFURV9FTkFCTEUgKDB4MTw8MCkKLSNkZWZpbmUgUlNTX1VQREFURV9DT05GSUdfRVRIX1VQREFURV9FTkFCTEVfU0hJRlQgMAotI2RlZmluZSBSU1NfVVBEQVRFX0NPTkZJR19UT0VfVVBEQVRFX0VOQUJMRSAoMHgxPDwxKQotI2RlZmluZSBSU1NfVVBEQVRFX0NPTkZJR19UT0VfVVBEQVRFX0VOQUJMRV9TSElGVCAxCi0jZGVmaW5lIF9fUlNTX1VQREFURV9DT05GSUdfUkVTRVJWRUQwICgweDNGRkY8PDIpCi0jZGVmaW5lIF9fUlNTX1VQREFURV9DT05GSUdfUkVTRVJWRUQwX1NISUZUIDIKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBmbGFnczsKLSNkZWZpbmUgUlNTX1VQREFURV9DT05GSUdfRVRIX1VQREFURV9FTkFCTEUgKDB4MTw8MCkKLSNkZWZpbmUgUlNTX1VQREFURV9DT05GSUdfRVRIX1VQREFURV9FTkFCTEVfU0hJRlQgMAotI2RlZmluZSBSU1NfVVBEQVRFX0NPTkZJR19UT0VfVVBEQVRFX0VOQUJMRSAoMHgxPDwxKQotI2RlZmluZSBSU1NfVVBEQVRFX0NPTkZJR19UT0VfVVBEQVRFX0VOQUJMRV9TSElGVCAxCi0jZGVmaW5lIF9fUlNTX1VQREFURV9DT05GSUdfUkVTRVJWRUQwICgweDNGRkY8PDIpCi0jZGVmaW5lIF9fUlNTX1VQREFURV9DT05GSUdfUkVTRVJWRUQwX1NISUZUIDIKLQl1MTYgdG9lX3Jzc19iaXRtYXA7Ci0jZW5kaWYKLQl1MzIgcmVzZXJ2ZWQxOwotfTsKIAogLyoKLSAqIHBhcmFtZXRlcnMgZm9yIGV0aCB1cGRhdGUgcmFtcm9kCisgKiBFdGhlcm5ldCBWTEFOIGZpbHRlcmluZyBtb2RlIGluIEUxeAogICovCi1zdHJ1Y3QgZXRoX3VwZGF0ZV9yYW1yb2RfZGF0YSB7Ci0Jc3RydWN0IHRzdG9ybV9ldGhfZnVuY3Rpb25fY29tbW9uX2NvbmZpZyBmdW5jX2NvbmZpZzsKLQl1OCBpbmRpcmVjdGlvblRhYmxlWzEyOF07Ci0Jc3RydWN0IHJzc191cGRhdGVfY29uZmlnIHJzc19jb25maWc7CitlbnVtIGV0aF92bGFuX2ZpbHRlcl9tb2RlIHsKKwlFVEhfVkxBTl9GSUxURVJfQU5ZX1ZMQU4sCisJRVRIX1ZMQU5fRklMVEVSX1NQRUNJRklDX1ZMQU4sCisJRVRIX1ZMQU5fRklMVEVSX0NMQVNTSUZZLAorCU1BWF9FVEhfVkxBTl9GSUxURVJfTU9ERQogfTsKIAogCkBAIC0yOTU0LDkgKzQwMTAsOCBAQAogc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2hkciB7CiAJdTggbGVuZ3RoOwogCXU4IG9mZnNldDsKLQl1MTYgY2xpZW50X2lkOwotCXUxNiBlY2hvOwotCXUxNiByZXNlcnZlZDE7CisJX19sZTE2IGNsaWVudF9pZDsKKwlfX2xlMzIgZWNobzsKIH07CiAKIC8qCkBAIC0yOTgxLDggKzQwMzYsOCBAQAogI2RlZmluZSBNQUNfQ09ORklHVVJBVElPTl9FTlRSWV9CUk9BRENBU1RfU0hJRlQgNQogI2RlZmluZSBNQUNfQ09ORklHVVJBVElPTl9FTlRSWV9SRVNFUlZFRDEgKDB4Mzw8NikKICNkZWZpbmUgTUFDX0NPTkZJR1VSQVRJT05fRU5UUllfUkVTRVJWRUQxX1NISUZUIDYKLQl1MTYgcmVzZXJ2ZWQwOwotCXUzMiBjbGllbnRzX2JpdF92ZWN0b3I7CisJX19sZTE2IHJlc2VydmVkMDsKKwlfX2xlMzIgY2xpZW50c19iaXRfdmVjdG9yOwogfTsKIAogLyoKQEAgLTI5OTUsNiArNDA1MCwzNiBAQAogCiAKIC8qCisgKiBTZXQtTUFDIGNvbW1hbmQgdHlwZSAoaW4gRTF4KQorICovCitlbnVtIHNldF9tYWNfYWN0aW9uX3R5cGUgeworCVRfRVRIX01BQ19DT01NQU5EX0lOVkFMSURBVEUsCisJVF9FVEhfTUFDX0NPTU1BTkRfU0VULAorCU1BWF9TRVRfTUFDX0FDVElPTl9UWVBFCit9OworCisKKy8qCisgKiB0cGEgdXBkYXRlIHJhbXJvZCBkYXRhCisgKi8KK3N0cnVjdCB0cGFfdXBkYXRlX3JhbXJvZF9kYXRhIHsKKwl1OCB1cGRhdGVfaXB2NDsKKwl1OCB1cGRhdGVfaXB2NjsKKwl1OCBjbGllbnRfaWQ7CisJdTggbWF4X3RwYV9xdWV1ZXM7CisJdTggbWF4X3NnZXNfZm9yX3BhY2tldDsKKwl1OCBjb21wbGV0ZV9vbl9ib3RoX2NsaWVudHM7CisJX19sZTE2IHJlc2VydmVkMTsKKwlfX2xlMTYgc2dlX2J1ZmZfc2l6ZTsKKwlfX2xlMTYgbWF4X2FnZ19zaXplOworCV9fbGUzMiBzZ2VfcGFnZV9iYXNlX2xvOworCV9fbGUzMiBzZ2VfcGFnZV9iYXNlX2hpOworCV9fbGUxNiBzZ2VfcGF1c2VfdGhyX2xvdzsKKwlfX2xlMTYgc2dlX3BhdXNlX3Rocl9oaWdoOworfTsKKworCisvKgogICogYXBwcm94aW1hdGUtbWF0Y2ggbXVsdGljYXN0IGZpbHRlcmluZyBmb3IgRTFIIHBlciBmdW5jdGlvbiBpbiBUc3Rvcm0KICAqLwogc3RydWN0IHRzdG9ybV9ldGhfYXBwcm94aW1hdGVfbWF0Y2hfbXVsdGljYXN0X2ZpbHRlcmluZyB7CkBAIC0zMDAzLDM1ICs0MDg4LDUwIEBACiAKIAogLyoKLSAqIE1BQyBmaWx0ZXJpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHBlciBwb3J0IGluIFRzdG9ybQorICogQ29tbW9uIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBwZXIgZnVuY3Rpb24gaW4gVHN0b3JtCiAgKi8KLXN0cnVjdCB0c3Rvcm1fZXRoX21hY19maWx0ZXJfY29uZmlnIHsKLQl1MzIgdWNhc3RfZHJvcF9hbGw7Ci0JdTMyIHVjYXN0X2FjY2VwdF9hbGw7Ci0JdTMyIG1jYXN0X2Ryb3BfYWxsOwotCXUzMiBtY2FzdF9hY2NlcHRfYWxsOwotCXUzMiBiY2FzdF9kcm9wX2FsbDsKLQl1MzIgYmNhc3RfYWNjZXB0X2FsbDsKLQl1MzIgdmxhbl9maWx0ZXJbMl07Ci0JdTMyIHVubWF0Y2hlZF91bmljYXN0OwotCXUzMiByZXNlcnZlZDsKK3N0cnVjdCB0c3Rvcm1fZXRoX2Z1bmN0aW9uX2NvbW1vbl9jb25maWcgeworCV9fbGUxNiBjb25maWdfZmxhZ3M7CisjZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfSVBWNF9DQVBBQklMSVRZICgweDE8PDApCisjZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfSVBWNF9DQVBBQklMSVRZX1NISUZUIDAKKyNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY0X1RDUF9DQVBBQklMSVRZICgweDE8PDEpCisjZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfSVBWNF9UQ1BfQ0FQQUJJTElUWV9TSElGVCAxCisjZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfSVBWNl9DQVBBQklMSVRZICgweDE8PDIpCisjZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfSVBWNl9DQVBBQklMSVRZX1NISUZUIDIKKyNkZWZpbmUgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY2X1RDUF9DQVBBQklMSVRZICgweDE8PDMpCisjZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfSVBWNl9UQ1BfQ0FQQUJJTElUWV9TSElGVCAzCisjZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfTU9ERSAoMHg3PDw0KQorI2RlZmluZSBUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfUlNTX01PREVfU0hJRlQgNAorI2RlZmluZSBUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfVkxBTl9GSUxURVJJTkdfRU5BQkxFICgweDE8PDcpCisjZGVmaW5lIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19WTEFOX0ZJTFRFUklOR19FTkFCTEVfU0hJRlQgNworI2RlZmluZSBfX1RTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SRVNFUlZFRDAgKDB4RkY8PDgpCisjZGVmaW5lIF9fVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JFU0VSVkVEMF9TSElGVCA4CisJdTggcnNzX3Jlc3VsdF9tYXNrOworCXU4IHJlc2VydmVkMTsKKwlfX2xlMTYgdmxhbl9pZFsyXTsKIH07CiAKIAogLyoKLSAqIGNvbW1vbiBmbGFnIHRvIGluZGljYXRlIGV4aXN0ZW5jZSBvZiBUUEEuCisgKiBNQUMgZmlsdGVyaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBwZXIgcG9ydCBpbiBUc3Rvcm0KICAqLwotc3RydWN0IHRzdG9ybV9ldGhfdHBhX2V4aXN0IHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgcmVzZXJ2ZWQxOwotCXU4IHJlc2VydmVkMDsKLQl1OCB0cGFfZXhpc3Q7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCB0cGFfZXhpc3Q7Ci0JdTggcmVzZXJ2ZWQwOwotCXUxNiByZXNlcnZlZDE7Ci0jZW5kaWYKLQl1MzIgcmVzZXJ2ZWQyOworc3RydWN0IHRzdG9ybV9ldGhfbWFjX2ZpbHRlcl9jb25maWcgeworCV9fbGUzMiB1Y2FzdF9kcm9wX2FsbDsKKwlfX2xlMzIgdWNhc3RfYWNjZXB0X2FsbDsKKwlfX2xlMzIgbWNhc3RfZHJvcF9hbGw7CisJX19sZTMyIG1jYXN0X2FjY2VwdF9hbGw7CisJX19sZTMyIGJjYXN0X2FjY2VwdF9hbGw7CisJX19sZTMyIHZsYW5fZmlsdGVyWzJdOworCV9fbGUzMiB1bm1hdGNoZWRfdW5pY2FzdDsKK307CisKKworLyoKKyAqIHR4IG9ubHkgcXVldWUgaW5pdCByYW1yb2QgZGF0YQorICovCitzdHJ1Y3QgdHhfcXVldWVfaW5pdF9yYW1yb2RfZGF0YSB7CisJc3RydWN0IGNsaWVudF9pbml0X2dlbmVyYWxfZGF0YSBnZW5lcmFsOworCXN0cnVjdCBjbGllbnRfaW5pdF90eF9kYXRhIHR4OwogfTsKIAogCkBAIC0zMDYxLDEwICs0MTYxLDggQEAKICAqLwogc3RydWN0IGNmY19kZWxfZXZlbnRfZGF0YSB7CiAJdTMyIGNpZDsKLQl1OCBlcnJvcjsKLQl1OCByZXNlcnZlZDA7Ci0JdTE2IHJlc2VydmVkMTsKLQl1MzIgcmVzZXJ2ZWQyOworCXUzMiByZXNlcnZlZDA7CisJdTMyIHJlc2VydmVkMTsKIH07CiAKIApAQCAtMzA3MiwyMiArNDE3MCwxOCBAQAogICogcGVyLXBvcnQgU0FGQyBkZW1vIHZhcmlhYmxlcwogICovCiBzdHJ1Y3QgY21uZ19mbGFnc19wZXJfcG9ydCB7Ci0JdTggY29uX251bWJlcltOVU1fT0ZfUFJPVE9DT0xTXTsKIAl1MzIgY21uZ19lbmFibGVzOwogI2RlZmluZSBDTU5HX0ZMQUdTX1BFUl9QT1JUX0ZBSVJORVNTX1ZOICgweDE8PDApCiAjZGVmaW5lIENNTkdfRkxBR1NfUEVSX1BPUlRfRkFJUk5FU1NfVk5fU0hJRlQgMAogI2RlZmluZSBDTU5HX0ZMQUdTX1BFUl9QT1JUX1JBVEVfU0hBUElOR19WTiAoMHgxPDwxKQogI2RlZmluZSBDTU5HX0ZMQUdTX1BFUl9QT1JUX1JBVEVfU0hBUElOR19WTl9TSElGVCAxCi0jZGVmaW5lIENNTkdfRkxBR1NfUEVSX1BPUlRfRkFJUk5FU1NfUFJPVE9DT0wgKDB4MTw8MikKLSNkZWZpbmUgQ01OR19GTEFHU19QRVJfUE9SVF9GQUlSTkVTU19QUk9UT0NPTF9TSElGVCAyCi0jZGVmaW5lIENNTkdfRkxBR1NfUEVSX1BPUlRfUkFURV9TSEFQSU5HX1BST1RPQ09MICgweDE8PDMpCi0jZGVmaW5lIENNTkdfRkxBR1NfUEVSX1BPUlRfUkFURV9TSEFQSU5HX1BST1RPQ09MX1NISUZUIDMKLSNkZWZpbmUgQ01OR19GTEFHU19QRVJfUE9SVF9GQUlSTkVTU19DT1MgKDB4MTw8NCkKLSNkZWZpbmUgQ01OR19GTEFHU19QRVJfUE9SVF9GQUlSTkVTU19DT1NfU0hJRlQgNAotI2RlZmluZSBDTU5HX0ZMQUdTX1BFUl9QT1JUX0ZBSVJORVNTX0NPU19NT0RFICgweDE8PDUpCi0jZGVmaW5lIENNTkdfRkxBR1NfUEVSX1BPUlRfRkFJUk5FU1NfQ09TX01PREVfU0hJRlQgNQotI2RlZmluZSBfX0NNTkdfRkxBR1NfUEVSX1BPUlRfUkVTRVJWRUQwICgweDNGRkZGRkY8PDYpCi0jZGVmaW5lIF9fQ01OR19GTEFHU19QRVJfUE9SVF9SRVNFUlZFRDBfU0hJRlQgNgorI2RlZmluZSBDTU5HX0ZMQUdTX1BFUl9QT1JUX0ZBSVJORVNTX0NPUyAoMHgxPDwyKQorI2RlZmluZSBDTU5HX0ZMQUdTX1BFUl9QT1JUX0ZBSVJORVNTX0NPU19TSElGVCAyCisjZGVmaW5lIENNTkdfRkxBR1NfUEVSX1BPUlRfRkFJUk5FU1NfQ09TX01PREUgKDB4MTw8MykKKyNkZWZpbmUgQ01OR19GTEFHU19QRVJfUE9SVF9GQUlSTkVTU19DT1NfTU9ERV9TSElGVCAzCisjZGVmaW5lIF9fQ01OR19GTEFHU19QRVJfUE9SVF9SRVNFUlZFRDAgKDB4RkZGRkZGRjw8NCkKKyNkZWZpbmUgX19DTU5HX0ZMQUdTX1BFUl9QT1JUX1JFU0VSVkVEMF9TSElGVCA0CisJdTMyIF9fcmVzZXJ2ZWQxOwogfTsKIAogCkBAIC0zMTA2LDYgKzQyMDAsNyBAQAogCXUzMiB1cHBlcl9ib3VuZDsKIAl1MzIgZmFpcl90aHJlc2hvbGQ7CiAJdTMyIGZhaXJuZXNzX3RpbWVvdXQ7CisJdTMyIHJlc2VydmVkMDsKIH07CiAKIC8qCkBAIC0zMTIyLDY1ICs0MjE3LDY1IEBACiAJdTE2IF9fcmVzZXJ2ZWQxOwogI2VuZGlmCiAJdTggY29zX3RvX3RyYWZmaWNfdHlwZXNbTUFYX0NPU19OVU1CRVJdOwotCXUzMiBfX3Jlc2VydmVkMjsKIAl1MTYgY29zX3RvX3BhdXNlX21hc2tbTlVNX09GX1NBRkNfQklUU107CiB9OwogCiAvKgotICogcGVyLXBvcnQgUEZDIHZhcmlhYmxlcwotICovCi1zdHJ1Y3QgcGZjX3N0cnVjdF9wZXJfcG9ydCB7Ci0JdTggcHJpb3JpdHlfdG9fdHJhZmZpY190eXBlc1tNQVhfUEZDX1BSSU9SSVRJRVNdOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBwZmNfcGF1c2VfcXVhbnRhX2luX25hbm9zZWM7Ci0JdTggX19yZXNlcnZlZDA7Ci0JdTggcHJpb3JpdHlfbm9uX3BhdXNhYmxlX21hc2s7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBwcmlvcml0eV9ub25fcGF1c2FibGVfbWFzazsKLQl1OCBfX3Jlc2VydmVkMDsKLQl1MTYgcGZjX3BhdXNlX3F1YW50YV9pbl9uYW5vc2VjOwotI2VuZGlmCi19OwotCi0vKgotICogUHJpb3JpdHkgYW5kIGNvcwotICovCi1zdHJ1Y3QgcHJpb3JpdHlfY29zIHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgcmVzZXJ2ZWQxOwotCXU4IGNvczsKLQl1OCBwcmlvcml0eTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IHByaW9yaXR5OwotCXU4IGNvczsKLQl1MTYgcmVzZXJ2ZWQxOwotI2VuZGlmCi0JdTMyIHJlc2VydmVkMjsKLX07Ci0KLS8qCiAgKiBQZXItcG9ydCBjb25nZXN0aW9uIG1hbmFnZW1lbnQgdmFyaWFibGVzCiAgKi8KIHN0cnVjdCBjbW5nX3N0cnVjdF9wZXJfcG9ydCB7CiAJc3RydWN0IHJhdGVfc2hhcGluZ192YXJzX3Blcl9wb3J0IHJzX3ZhcnM7CiAJc3RydWN0IGZhaXJuZXNzX3ZhcnNfcGVyX3BvcnQgZmFpcl92YXJzOwogCXN0cnVjdCBzYWZjX3N0cnVjdF9wZXJfcG9ydCBzYWZjX3ZhcnM7Ci0Jc3RydWN0IHBmY19zdHJ1Y3RfcGVyX3BvcnQgcGZjX3ZhcnM7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IF9fcmVzZXJ2ZWQxOwotCXU4IGRjYl9lbmFibGVkOwotCXU4IGxsZmNfbW9kZTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IGxsZmNfbW9kZTsKLQl1OCBkY2JfZW5hYmxlZDsKLQl1MTYgX19yZXNlcnZlZDE7Ci0jZW5kaWYKLQlzdHJ1Y3QgcHJpb3JpdHlfY29zCi0JCXRyYWZmaWNfdHlwZV90b19wcmlvcml0eV9jb3NbTUFYX1BGQ19UUkFGRklDX1RZUEVTXTsKIAlzdHJ1Y3QgY21uZ19mbGFnc19wZXJfcG9ydCBmbGFnczsKIH07CiAKIAorLyoKKyAqIFByb3RvY29sLWNvbW1vbiBjb21tYW5kIElEIGZvciBzbG93IHBhdGggZWxlbWVudHMKKyAqLworZW51bSBjb21tb25fc3BxZV9jbWRfaWQgeworCVJBTVJPRF9DTURfSURfQ09NTU9OX1VOVVNFRCwKKwlSQU1ST0RfQ01EX0lEX0NPTU1PTl9GVU5DVElPTl9TVEFSVCwKKwlSQU1ST0RfQ01EX0lEX0NPTU1PTl9GVU5DVElPTl9TVE9QLAorCVJBTVJPRF9DTURfSURfQ09NTU9OX0NGQ19ERUwsCisJUkFNUk9EX0NNRF9JRF9DT01NT05fQ0ZDX0RFTF9XQiwKKwlSQU1ST0RfQ01EX0lEX0NPTU1PTl9TVEFUX1FVRVJZLAorCVJBTVJPRF9DTURfSURfQ09NTU9OX1NUT1BfVFJBRkZJQywKKwlSQU1ST0RfQ01EX0lEX0NPTU1PTl9TVEFSVF9UUkFGRklDLAorCVJBTVJPRF9DTURfSURfQ09NTU9OX1JFU0VSVkVEMSwKKwlSQU1ST0RfQ01EX0lEX0NPTU1PTl9SRVNFUlZFRDIsCisJTUFYX0NPTU1PTl9TUFFFX0NNRF9JRAorfTsKKworCisvKgorICogUGVyLXByb3RvY29sIGNvbm5lY3Rpb24gdHlwZXMKKyAqLworZW51bSBjb25uZWN0aW9uX3R5cGUgeworCUVUSF9DT05ORUNUSU9OX1RZUEUsCisJVE9FX0NPTk5FQ1RJT05fVFlQRSwKKwlSRE1BX0NPTk5FQ1RJT05fVFlQRSwKKwlJU0NTSV9DT05ORUNUSU9OX1RZUEUsCisJRkNPRV9DT05ORUNUSU9OX1RZUEUsCisJUkVTRVJWRURfQ09OTkVDVElPTl9UWVBFXzAsCisJUkVTRVJWRURfQ09OTkVDVElPTl9UWVBFXzEsCisJUkVTRVJWRURfQ09OTkVDVElPTl9UWVBFXzIsCisJTk9ORV9DT05ORUNUSU9OX1RZUEUsCisJTUFYX0NPTk5FQ1RJT05fVFlQRQorfTsKKworCisvKgorICogQ29zIG1vZGVzCisgKi8KK2VudW0gY29zX21vZGUgeworCU9WRVJSSURFX0NPUywKKwlTVEFUSUNfQ09TLAorCUZXX1dSUiwKKwlNQVhfQ09TX01PREUKK307CisKIAogLyoKICAqIER5bmFtaWMgSEMgY291bnRlcnMgc2V0IGJ5IHRoZSBkcml2ZXIKQEAgLTMxOTcsMTAgKzQyOTIsNTggQEAKIAlzdHJ1Y3QgcmVncGFpciByZXNlcnZlZFsyXTsKIH07CiAKKwogLyoKLSAqIER5bmFtaWMgaG9zdCBjb2FsZXNjaW5nIGluaXQgcGFyYW1ldGVycworICogVmYtUEYgY2hhbm5lbCBkYXRhIGluIGNzdG9ybSByYW0gKG5vbi10cmlnZ2VyZWQgem9uZSkKICAqLwotc3RydWN0IGR5bmFtaWNfaGNfY29uZmlnIHsKK3N0cnVjdCB2Zl9wZl9jaGFubmVsX3pvbmVfZGF0YSB7CisJdTMyIG1zZ19hZGRyX2xvOworCXUzMiBtc2dfYWRkcl9oaTsKK307CisKKy8qCisgKiB6b25lIGZvciBWRiBub24tdHJpZ2dlcmVkIGRhdGEKKyAqLworc3RydWN0IG5vbl90cmlnZ2VyX3ZmX3pvbmUgeworCXN0cnVjdCB2Zl9wZl9jaGFubmVsX3pvbmVfZGF0YSB2Zl9wZl9jaGFubmVsOworfTsKKworLyoKKyAqIFZmLVBGIGNoYW5uZWwgdHJpZ2dlciB6b25lIGluIGNzdG9ybSByYW0KKyAqLworc3RydWN0IHZmX3BmX2NoYW5uZWxfem9uZV90cmlnZ2VyIHsKKwl1OCBhZGRyX3ZhbGlkOworfTsKKworLyoKKyAqIHpvbmUgdGhhdCB0cmlnZ2VycyB0aGUgaW4tYm91bmQgaW50ZXJydXB0CisgKi8KK3N0cnVjdCB0cmlnZ2VyX3ZmX3pvbmUgeworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiByZXNlcnZlZDE7CisJdTggcmVzZXJ2ZWQwOworCXN0cnVjdCB2Zl9wZl9jaGFubmVsX3pvbmVfdHJpZ2dlciB2Zl9wZl9jaGFubmVsOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJc3RydWN0IHZmX3BmX2NoYW5uZWxfem9uZV90cmlnZ2VyIHZmX3BmX2NoYW5uZWw7CisJdTggcmVzZXJ2ZWQwOworCXUxNiByZXNlcnZlZDE7CisjZW5kaWYKKwl1MzIgcmVzZXJ2ZWQyOworfTsKKworLyoKKyAqIHpvbmUgQiBwZXItVkYgZGF0YQorICovCitzdHJ1Y3QgY3N0b3JtX3ZmX3pvbmVfZGF0YSB7CisJc3RydWN0IG5vbl90cmlnZ2VyX3ZmX3pvbmUgbm9uX3RyaWdnZXI7CisJc3RydWN0IHRyaWdnZXJfdmZfem9uZSB0cmlnZ2VyOworfTsKKworCisvKgorICogRHluYW1pYyBob3N0IGNvYWxlc2NpbmcgaW5pdCBwYXJhbWV0ZXJzLCBwZXIgc3RhdGUgbWFjaGluZQorICovCitzdHJ1Y3QgZHluYW1pY19oY19zbV9jb25maWcgewogCXUzMiB0aHJlc2hvbGRbM107CiAJdTggc2hpZnRfcGVyX3Byb3RvY29sW0hDX1NCX01BWF9EWU5BTUlDX0lORElDRVNdOwogCXU4IGhjX3RpbWVvdXQwW0hDX1NCX01BWF9EWU5BTUlDX0lORElDRVNdOwpAQCAtMzIwOSwxMTQgKzQzNTIsMTE0IEBACiAJdTggaGNfdGltZW91dDNbSENfU0JfTUFYX0RZTkFNSUNfSU5ESUNFU107CiB9OwogCi0KIC8qCi0gKiBQcm90b2NvbC1jb21tb24gc3RhdGlzdGljcyBjb2xsZWN0ZWQgYnkgdGhlIFhzdG9ybSAocGVyIGNsaWVudCkKKyAqIER5bmFtaWMgaG9zdCBjb2FsZXNjaW5nIGluaXQgcGFyYW1ldGVycwogICovCi1zdHJ1Y3QgeHN0b3JtX3Blcl9jbGllbnRfc3RhdHMgewotCV9fbGUzMiByZXNlcnZlZDA7Ci0JX19sZTMyIHVuaWNhc3RfcGt0c19zZW50OwotCXN0cnVjdCByZWdwYWlyIHVuaWNhc3RfYnl0ZXNfc2VudDsKLQlzdHJ1Y3QgcmVncGFpciBtdWx0aWNhc3RfYnl0ZXNfc2VudDsKLQlfX2xlMzIgbXVsdGljYXN0X3BrdHNfc2VudDsKLQlfX2xlMzIgYnJvYWRjYXN0X3BrdHNfc2VudDsKLQlzdHJ1Y3QgcmVncGFpciBicm9hZGNhc3RfYnl0ZXNfc2VudDsKLQlfX2xlMTYgc3RhdHNfY291bnRlcjsKLQlfX2xlMTYgcmVzZXJ2ZWQxOwotCV9fbGUzMiByZXNlcnZlZDI7CitzdHJ1Y3QgZHluYW1pY19oY19jb25maWcgeworCXN0cnVjdCBkeW5hbWljX2hjX3NtX2NvbmZpZyBzbV9jb25maWdbSENfU0JfTUFYX1NNXTsKIH07CiAKLS8qCi0gKiBDb21tb24gc3RhdGlzdGljcyBjb2xsZWN0ZWQgYnkgdGhlIFhzdG9ybSAocGVyIHBvcnQpCi0gKi8KLXN0cnVjdCB4c3Rvcm1fY29tbW9uX3N0YXRzIHsKLQlzdHJ1Y3QgeHN0b3JtX3Blcl9jbGllbnRfc3RhdHMgY2xpZW50X3N0YXRpc3RpY3NbTUFYX1NUQVRfQ09VTlRFUl9JRF07Ci19OwogCi0vKgotICogUHJvdG9jb2wtY29tbW9uIHN0YXRpc3RpY3MgY29sbGVjdGVkIGJ5IHRoZSBUc3Rvcm0gKHBlciBwb3J0KQotICovCi1zdHJ1Y3QgdHN0b3JtX3Blcl9wb3J0X3N0YXRzIHsKLQlfX2xlMzIgbWFjX2ZpbHRlcl9kaXNjYXJkOwotCV9fbGUzMiB4eG92ZXJmbG93X2Rpc2NhcmQ7Ci0JX19sZTMyIGJyYl90cnVuY2F0ZV9kaXNjYXJkOwotCV9fbGUzMiBtYWNfZGlzY2FyZDsKLX07Ci0KLS8qCi0gKiBQcm90b2NvbC1jb21tb24gc3RhdGlzdGljcyBjb2xsZWN0ZWQgYnkgdGhlIFRzdG9ybSAocGVyIGNsaWVudCkKLSAqLwotc3RydWN0IHRzdG9ybV9wZXJfY2xpZW50X3N0YXRzIHsKLQlzdHJ1Y3QgcmVncGFpciByY3ZfdW5pY2FzdF9ieXRlczsKLQlzdHJ1Y3QgcmVncGFpciByY3ZfYnJvYWRjYXN0X2J5dGVzOwotCXN0cnVjdCByZWdwYWlyIHJjdl9tdWx0aWNhc3RfYnl0ZXM7Ci0Jc3RydWN0IHJlZ3BhaXIgcmN2X2Vycm9yX2J5dGVzOwotCV9fbGUzMiBjaGVja3N1bV9kaXNjYXJkOwotCV9fbGUzMiBwYWNrZXRzX3Rvb19iaWdfZGlzY2FyZDsKLQlfX2xlMzIgcmN2X3VuaWNhc3RfcGt0czsKLQlfX2xlMzIgcmN2X2Jyb2FkY2FzdF9wa3RzOwotCV9fbGUzMiByY3ZfbXVsdGljYXN0X3BrdHM7Ci0JX19sZTMyIG5vX2J1ZmZfZGlzY2FyZDsKLQlfX2xlMzIgdHRsMF9kaXNjYXJkOwotCV9fbGUxNiBzdGF0c19jb3VudGVyOwotCV9fbGUxNiByZXNlcnZlZDA7Ci19OwotCi0vKgotICogUHJvdG9jb2wtY29tbW9uIHN0YXRpc3RpY3MgY29sbGVjdGVkIGJ5IHRoZSBUc3Rvcm0KLSAqLwotc3RydWN0IHRzdG9ybV9jb21tb25fc3RhdHMgewotCXN0cnVjdCB0c3Rvcm1fcGVyX3BvcnRfc3RhdHMgcG9ydF9zdGF0aXN0aWNzOwotCXN0cnVjdCB0c3Rvcm1fcGVyX2NsaWVudF9zdGF0cyBjbGllbnRfc3RhdGlzdGljc1tNQVhfU1RBVF9DT1VOVEVSX0lEXTsKLX07Ci0KLS8qCi0gKiBQcm90b2NvbC1jb21tb24gc3RhdGlzdGljcyBjb2xsZWN0ZWQgYnkgdGhlIFVzdG9ybSAocGVyIGNsaWVudCkKLSAqLwotc3RydWN0IHVzdG9ybV9wZXJfY2xpZW50X3N0YXRzIHsKLQlzdHJ1Y3QgcmVncGFpciB1Y2FzdF9ub19idWZmX2J5dGVzOwotCXN0cnVjdCByZWdwYWlyIG1jYXN0X25vX2J1ZmZfYnl0ZXM7Ci0Jc3RydWN0IHJlZ3BhaXIgYmNhc3Rfbm9fYnVmZl9ieXRlczsKLQlfX2xlMzIgdWNhc3Rfbm9fYnVmZl9wa3RzOwotCV9fbGUzMiBtY2FzdF9ub19idWZmX3BrdHM7Ci0JX19sZTMyIGJjYXN0X25vX2J1ZmZfcGt0czsKLQlfX2xlMTYgc3RhdHNfY291bnRlcjsKLQlfX2xlMTYgcmVzZXJ2ZWQwOwotfTsKLQotLyoKLSAqIFByb3RvY29sLWNvbW1vbiBzdGF0aXN0aWNzIGNvbGxlY3RlZCBieSB0aGUgVXN0b3JtCi0gKi8KLXN0cnVjdCB1c3Rvcm1fY29tbW9uX3N0YXRzIHsKLQlzdHJ1Y3QgdXN0b3JtX3Blcl9jbGllbnRfc3RhdHMgY2xpZW50X3N0YXRpc3RpY3NbTUFYX1NUQVRfQ09VTlRFUl9JRF07Ci19OwotCi0vKgotICogRXRoIHN0YXRpc3RpY3MgcXVlcnkgc3RydWN0dXJlIGZvciB0aGUgZXRoX3N0YXRzX3F1ZXJ5IHJhbXJvZAotICovCi1zdHJ1Y3QgZXRoX3N0YXRzX3F1ZXJ5IHsKLQlzdHJ1Y3QgeHN0b3JtX2NvbW1vbl9zdGF0cyB4c3Rvcm1fY29tbW9uOwotCXN0cnVjdCB0c3Rvcm1fY29tbW9uX3N0YXRzIHRzdG9ybV9jb21tb247Ci0Jc3RydWN0IHVzdG9ybV9jb21tb25fc3RhdHMgdXN0b3JtX2NvbW1vbjsKK3N0cnVjdCBlMl9pbnRlZ19kYXRhIHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCBmbGFnczsKKyNkZWZpbmUgRTJfSU5URUdfREFUQV9URVNUSU5HX0VOICgweDE8PDApCisjZGVmaW5lIEUyX0lOVEVHX0RBVEFfVEVTVElOR19FTl9TSElGVCAwCisjZGVmaW5lIEUyX0lOVEVHX0RBVEFfTEJfVFggKDB4MTw8MSkKKyNkZWZpbmUgRTJfSU5URUdfREFUQV9MQl9UWF9TSElGVCAxCisjZGVmaW5lIEUyX0lOVEVHX0RBVEFfQ09TX1RYICgweDE8PDIpCisjZGVmaW5lIEUyX0lOVEVHX0RBVEFfQ09TX1RYX1NISUZUIDIKKyNkZWZpbmUgRTJfSU5URUdfREFUQV9PUFBPUlRVTklTVElDUU0gKDB4MTw8MykKKyNkZWZpbmUgRTJfSU5URUdfREFUQV9PUFBPUlRVTklTVElDUU1fU0hJRlQgMworI2RlZmluZSBFMl9JTlRFR19EQVRBX0RQTVRFU1RSRUxFQVNFRFEgKDB4MTw8NCkKKyNkZWZpbmUgRTJfSU5URUdfREFUQV9EUE1URVNUUkVMRUFTRURRX1NISUZUIDQKKyNkZWZpbmUgRTJfSU5URUdfREFUQV9SRVNFUlZFRCAoMHg3PDw1KQorI2RlZmluZSBFMl9JTlRFR19EQVRBX1JFU0VSVkVEX1NISUZUIDUKKwl1OCBjb3M7CisJdTggdm9xOworCXU4IHBiZl9xdWV1ZTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXU4IHBiZl9xdWV1ZTsKKwl1OCB2b3E7CisJdTggY29zOworCXU4IGZsYWdzOworI2RlZmluZSBFMl9JTlRFR19EQVRBX1RFU1RJTkdfRU4gKDB4MTw8MCkKKyNkZWZpbmUgRTJfSU5URUdfREFUQV9URVNUSU5HX0VOX1NISUZUIDAKKyNkZWZpbmUgRTJfSU5URUdfREFUQV9MQl9UWCAoMHgxPDwxKQorI2RlZmluZSBFMl9JTlRFR19EQVRBX0xCX1RYX1NISUZUIDEKKyNkZWZpbmUgRTJfSU5URUdfREFUQV9DT1NfVFggKDB4MTw8MikKKyNkZWZpbmUgRTJfSU5URUdfREFUQV9DT1NfVFhfU0hJRlQgMgorI2RlZmluZSBFMl9JTlRFR19EQVRBX09QUE9SVFVOSVNUSUNRTSAoMHgxPDwzKQorI2RlZmluZSBFMl9JTlRFR19EQVRBX09QUE9SVFVOSVNUSUNRTV9TSElGVCAzCisjZGVmaW5lIEUyX0lOVEVHX0RBVEFfRFBNVEVTVFJFTEVBU0VEUSAoMHgxPDw0KQorI2RlZmluZSBFMl9JTlRFR19EQVRBX0RQTVRFU1RSRUxFQVNFRFFfU0hJRlQgNAorI2RlZmluZSBFMl9JTlRFR19EQVRBX1JFU0VSVkVEICgweDc8PDUpCisjZGVmaW5lIEUyX0lOVEVHX0RBVEFfUkVTRVJWRURfU0hJRlQgNQorI2VuZGlmCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IHJlc2VydmVkMzsKKwl1OCByZXNlcnZlZDI7CisJdTggcmFtRW47CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1OCByYW1FbjsKKwl1OCByZXNlcnZlZDI7CisJdTE2IHJlc2VydmVkMzsKKyNlbmRpZgogfTsKIAogCiAvKgogICogc2V0IG1hYyBldmVudCBkYXRhCiAgKi8KLXN0cnVjdCBzZXRfbWFjX2V2ZW50X2RhdGEgewotCXUxNiBlY2hvOwotCXUxNiByZXNlcnZlZDA7CitzdHJ1Y3QgZXRoX2V2ZW50X2RhdGEgeworCXUzMiBlY2hvOworCXUzMiByZXNlcnZlZDA7CiAJdTMyIHJlc2VydmVkMTsKK307CisKKworLyoKKyAqIHBmLXZmIGV2ZW50IGRhdGEKKyAqLworc3RydWN0IHZmX3BmX2V2ZW50X2RhdGEgeworCXU4IHZmX2lkOworCXU4IHJlc2VydmVkMDsKKwl1MTYgcmVzZXJ2ZWQxOworCXUzMiBtc2dfYWRkcl9sbzsKKwl1MzIgbXNnX2FkZHJfaGk7Cit9OworCisvKgorICogVkYgRkxSIGV2ZW50IGRhdGEKKyAqLworc3RydWN0IHZmX2Zscl9ldmVudF9kYXRhIHsKKwl1OCB2Zl9pZDsKKwl1OCByZXNlcnZlZDA7CisJdTE2IHJlc2VydmVkMTsKIAl1MzIgcmVzZXJ2ZWQyOworCXUzMiByZXNlcnZlZDM7Cit9OworCisvKgorICogbWFsaWNpb3VzIFZGIGV2ZW50IGRhdGEKKyAqLworc3RydWN0IG1hbGljaW91c192Zl9ldmVudF9kYXRhIHsKKwl1OCB2Zl9pZDsKKwl1OCByZXNlcnZlZDA7CisJdTE2IHJlc2VydmVkMTsKKwl1MzIgcmVzZXJ2ZWQyOworCXUzMiByZXNlcnZlZDM7CiB9OwogCiAvKgogICogdW5pb24gZm9yIGFsbCBldmVudCByaW5nIG1lc3NhZ2UgdHlwZXMKICAqLwogdW5pb24gZXZlbnRfZGF0YSB7Ci0Jc3RydWN0IHNldF9tYWNfZXZlbnRfZGF0YSBzZXRfbWFjX2V2ZW50OworCXN0cnVjdCB2Zl9wZl9ldmVudF9kYXRhIHZmX3BmX2V2ZW50OworCXN0cnVjdCBldGhfZXZlbnRfZGF0YSBldGhfZXZlbnQ7CiAJc3RydWN0IGNmY19kZWxfZXZlbnRfZGF0YSBjZmNfZGVsX2V2ZW50OworCXN0cnVjdCB2Zl9mbHJfZXZlbnRfZGF0YSB2Zl9mbHJfZXZlbnQ7CisJc3RydWN0IG1hbGljaW91c192Zl9ldmVudF9kYXRhIG1hbGljaW91c192Zl9ldmVudDsKIH07CiAKIApAQCAtMzM0Myw3ICs0NDg2LDcgQEAKICAqLwogc3RydWN0IGV2ZW50X3JpbmdfbXNnIHsKIAl1OCBvcGNvZGU7Ci0JdTggcmVzZXJ2ZWQwOworCXU4IGVycm9yOwogCXUxNiByZXNlcnZlZDE7CiAJdW5pb24gZXZlbnRfZGF0YSBkYXRhOwogfTsKQEAgLTMzNjYsMzIgKzQ1MDksODIgQEAKIAogCiAvKgorICogQ29tbW9uIGV2ZW50IHJpbmcgb3Bjb2RlcworICovCitlbnVtIGV2ZW50X3Jpbmdfb3Bjb2RlIHsKKwlFVkVOVF9SSU5HX09QQ09ERV9WRl9QRl9DSEFOTkVMLAorCUVWRU5UX1JJTkdfT1BDT0RFX0ZVTkNUSU9OX1NUQVJULAorCUVWRU5UX1JJTkdfT1BDT0RFX0ZVTkNUSU9OX1NUT1AsCisJRVZFTlRfUklOR19PUENPREVfQ0ZDX0RFTCwKKwlFVkVOVF9SSU5HX09QQ09ERV9DRkNfREVMX1dCLAorCUVWRU5UX1JJTkdfT1BDT0RFX1NUQVRfUVVFUlksCisJRVZFTlRfUklOR19PUENPREVfU1RPUF9UUkFGRklDLAorCUVWRU5UX1JJTkdfT1BDT0RFX1NUQVJUX1RSQUZGSUMsCisJRVZFTlRfUklOR19PUENPREVfVkZfRkxSLAorCUVWRU5UX1JJTkdfT1BDT0RFX01BTElDSU9VU19WRiwKKwlFVkVOVF9SSU5HX09QQ09ERV9GT1JXQVJEX1NFVFVQLAorCUVWRU5UX1JJTkdfT1BDT0RFX1JTU19VUERBVEVfUlVMRVMsCisJRVZFTlRfUklOR19PUENPREVfUkVTRVJWRUQxLAorCUVWRU5UX1JJTkdfT1BDT0RFX1JFU0VSVkVEMiwKKwlFVkVOVF9SSU5HX09QQ09ERV9TRVRfTUFDLAorCUVWRU5UX1JJTkdfT1BDT0RFX0NMQVNTSUZJQ0FUSU9OX1JVTEVTLAorCUVWRU5UX1JJTkdfT1BDT0RFX0ZJTFRFUlNfUlVMRVMsCisJRVZFTlRfUklOR19PUENPREVfTVVMVElDQVNUX1JVTEVTLAorCU1BWF9FVkVOVF9SSU5HX09QQ09ERQorfTsKKworCisvKgorICogTW9kZXMgZm9yIGZhaXJuZXNzIGFsZ29yaXRobQorICovCitlbnVtIGZhaXJuZXNzX21vZGUgeworCUZBSVJORVNTX0NPU19XUlJfTU9ERSwKKwlGQUlSTkVTU19DT1NfRVRTX01PREUsCisJTUFYX0ZBSVJORVNTX01PREUKK307CisKKworLyoKICAqIHBlci12bmljIGZhaXJuZXNzIHZhcmlhYmxlcwogICovCiBzdHJ1Y3QgZmFpcm5lc3NfdmFyc19wZXJfdm4gewogCXUzMiBjb3NfY3JlZGl0X2RlbHRhW01BWF9DT1NfTlVNQkVSXTsKLQl1MzIgcHJvdG9jb2xfY3JlZGl0X2RlbHRhW05VTV9PRl9QUk9UT0NPTFNdOwogCXUzMiB2bl9jcmVkaXRfZGVsdGE7CiAJdTMyIF9fcmVzZXJ2ZWQwOwogfTsKIAogCiAvKgorICogUHJpb3JpdHkgYW5kIGNvcworICovCitzdHJ1Y3QgcHJpb3JpdHlfY29zIHsKKwl1OCBwcmlvcml0eTsKKwl1OCBjb3M7CisJX19sZTE2IHJlc2VydmVkMTsKK307CisKKy8qCiAgKiBUaGUgZGF0YSBmb3IgZmxvdyBjb250cm9sIGNvbmZpZ3VyYXRpb24KICAqLwogc3RydWN0IGZsb3dfY29udHJvbF9jb25maWd1cmF0aW9uIHsKLQlzdHJ1Y3QgcHJpb3JpdHlfY29zCi0JCXRyYWZmaWNfdHlwZV90b19wcmlvcml0eV9jb3NbTUFYX1BGQ19UUkFGRklDX1RZUEVTXTsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgcmVzZXJ2ZWQxOwotCXU4IGRjYl92ZXJzaW9uOwotCXU4IGRjYl9lbmFibGVkOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJc3RydWN0IHByaW9yaXR5X2NvcyB0cmFmZmljX3R5cGVfdG9fcHJpb3JpdHlfY29zW01BWF9UUkFGRklDX1RZUEVTXTsKIAl1OCBkY2JfZW5hYmxlZDsKIAl1OCBkY2JfdmVyc2lvbjsKLQl1MTYgcmVzZXJ2ZWQxOwotI2VuZGlmCi0JdTMyIHJlc2VydmVkMjsKKwl1OCBkb250X2FkZF9wcmlfMF9lbjsKKwl1OCByZXNlcnZlZDE7CisJX19sZTMyIHJlc2VydmVkMjsKK307CisKKworLyoKKyAqCisgKi8KK3N0cnVjdCBmdW5jdGlvbl9zdGFydF9kYXRhIHsKKwlfX2xlMTYgZnVuY3Rpb25fbW9kZTsKKwlfX2xlMTYgc2Rfdmxhbl90YWc7CisJdTE2IHJlc2VydmVkOworCXU4IHBhdGhfaWQ7CisJdTggbmV0d29ya19jb3NfbW9kZTsKIH07CiAKIApAQCAtMzUwNCwxMyArNDY5NywxMyBAQAogCXN0cnVjdCBwY2lfZW50aXR5IHBfZnVuYzsKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKIAl1OCByc3J2MDsKKwl1OCBzdGF0ZTsKIAl1OCBkaGNfcXpvbmVfaWQ7Ci0JdTggX19keW5hbWljX2hjX2xldmVsOwogCXU4IHNhbWVfaWd1X3NiXzFiOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCiAJdTggc2FtZV9pZ3Vfc2JfMWI7Ci0JdTggX19keW5hbWljX2hjX2xldmVsOwogCXU4IGRoY19xem9uZV9pZDsKKwl1OCBzdGF0ZTsKIAl1OCByc3J2MDsKICNlbmRpZgogCXN0cnVjdCByZWdwYWlyIHJzcnYxWzJdOwpAQCAtMzUxOCwxOCArNDcxMSwzMCBAQAogCiAKIC8qCisgKiBTZWdtZW50IHR5cGVzIGZvciBob3N0IGNvYXNsZXNjaW5nCisgKi8KK2VudW0gaGNfc2VnbWVudCB7CisJSENfUkVHVUxBUl9TRUdNRU5ULAorCUhDX0RFRkFVTFRfU0VHTUVOVCwKKwlNQVhfSENfU0VHTUVOVAorfTsKKworCisvKgogICogVGhlIGZhc3QtcGF0aCBzdGF0dXMgYmxvY2sgbWV0YS1kYXRhCiAgKi8KIHN0cnVjdCBoY19zcF9zdGF0dXNfYmxvY2tfZGF0YSB7CiAJc3RydWN0IHJlZ3BhaXIgaG9zdF9zYl9hZGRyOwogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiByc3J2OworCXU4IHJzcnYxOworCXU4IHN0YXRlOwogCXU4IGlndV9zZWdfaWQ7CiAJdTggaWd1X3NiX2lkOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCiAJdTggaWd1X3NiX2lkOwogCXU4IGlndV9zZWdfaWQ7Ci0JdTE2IHJzcnY7CisJdTggc3RhdGU7CisJdTggcnNydjE7CiAjZW5kaWYKIAlzdHJ1Y3QgcGNpX2VudGl0eSBwX2Z1bmM7CiB9OwpAQCAtMzU1NCw2ICs0NzU5LDEyOSBAQAogCiAKIC8qCisgKiBJR1UgYmxvY2sgb3BlcmFydGlvbiBtb2RlcyAoaW4gRXZlcmVzdDIpCisgKi8KK2VudW0gaWd1X21vZGUgeworCUhDX0lHVV9CQ19NT0RFLAorCUhDX0lHVV9OQkNfTU9ERSwKKwlNQVhfSUdVX01PREUKK307CisKKworLyoKKyAqIElQIHZlcnNpb25zCisgKi8KK2VudW0gaXBfdmVyIHsKKwlJUF9WNCwKKwlJUF9WNiwKKwlNQVhfSVBfVkVSCit9OworCisKKy8qCisgKiBNdWx0aS1mdW5jdGlvbiBtb2RlcworICovCitlbnVtIG1mX21vZGUgeworCVNJTkdMRV9GVU5DVElPTiwKKwlNVUxUSV9GVU5DVElPTl9TRCwKKwlNVUxUSV9GVU5DVElPTl9TSSwKKwlNVUxUSV9GVU5DVElPTl9SRVNFUlZFRCwKKwlNQVhfTUZfTU9ERQorfTsKKworLyoKKyAqIFByb3RvY29sLWNvbW1vbiBzdGF0aXN0aWNzIGNvbGxlY3RlZCBieSB0aGUgVHN0b3JtIChwZXIgcGYpCisgKi8KK3N0cnVjdCB0c3Rvcm1fcGVyX3BmX3N0YXRzIHsKKwlzdHJ1Y3QgcmVncGFpciByY3ZfZXJyb3JfYnl0ZXM7Cit9OworCisvKgorICoKKyAqLworc3RydWN0IHBlcl9wZl9zdGF0cyB7CisJc3RydWN0IHRzdG9ybV9wZXJfcGZfc3RhdHMgdHN0b3JtX3BmX3N0YXRpc3RpY3M7Cit9OworCisKKy8qCisgKiBQcm90b2NvbC1jb21tb24gc3RhdGlzdGljcyBjb2xsZWN0ZWQgYnkgdGhlIFRzdG9ybSAocGVyIHBvcnQpCisgKi8KK3N0cnVjdCB0c3Rvcm1fcGVyX3BvcnRfc3RhdHMgeworCV9fbGUzMiBtYWNfZGlzY2FyZDsKKwlfX2xlMzIgbWFjX2ZpbHRlcl9kaXNjYXJkOworCV9fbGUzMiBicmJfdHJ1bmNhdGVfZGlzY2FyZDsKKwlfX2xlMzIgbWZfdGFnX2Rpc2NhcmQ7CisJX19sZTMyIHBhY2tldF9kcm9wOworCV9fbGUzMiByZXNlcnZlZDsKK307CisKKy8qCisgKgorICovCitzdHJ1Y3QgcGVyX3BvcnRfc3RhdHMgeworCXN0cnVjdCB0c3Rvcm1fcGVyX3BvcnRfc3RhdHMgdHN0b3JtX3BvcnRfc3RhdGlzdGljczsKK307CisKKworLyoKKyAqIFByb3RvY29sLWNvbW1vbiBzdGF0aXN0aWNzIGNvbGxlY3RlZCBieSB0aGUgVHN0b3JtIChwZXIgY2xpZW50KQorICovCitzdHJ1Y3QgdHN0b3JtX3Blcl9xdWV1ZV9zdGF0cyB7CisJc3RydWN0IHJlZ3BhaXIgcmN2X3VjYXN0X2J5dGVzOworCV9fbGUzMiByY3ZfdWNhc3RfcGt0czsKKwlfX2xlMzIgY2hlY2tzdW1fZGlzY2FyZDsKKwlzdHJ1Y3QgcmVncGFpciByY3ZfYmNhc3RfYnl0ZXM7CisJX19sZTMyIHJjdl9iY2FzdF9wa3RzOworCV9fbGUzMiBwa3RzX3Rvb19iaWdfZGlzY2FyZDsKKwlzdHJ1Y3QgcmVncGFpciByY3ZfbWNhc3RfYnl0ZXM7CisJX19sZTMyIHJjdl9tY2FzdF9wa3RzOworCV9fbGUzMiB0dGwwX2Rpc2NhcmQ7CisJX19sZTE2IG5vX2J1ZmZfZGlzY2FyZDsKKwlfX2xlMTYgcmVzZXJ2ZWQwOworCV9fbGUzMiByZXNlcnZlZDE7Cit9OworCisvKgorICogUHJvdG9jb2wtY29tbW9uIHN0YXRpc3RpY3MgY29sbGVjdGVkIGJ5IHRoZSBVc3Rvcm0gKHBlciBjbGllbnQpCisgKi8KK3N0cnVjdCB1c3Rvcm1fcGVyX3F1ZXVlX3N0YXRzIHsKKwlzdHJ1Y3QgcmVncGFpciB1Y2FzdF9ub19idWZmX2J5dGVzOworCXN0cnVjdCByZWdwYWlyIG1jYXN0X25vX2J1ZmZfYnl0ZXM7CisJc3RydWN0IHJlZ3BhaXIgYmNhc3Rfbm9fYnVmZl9ieXRlczsKKwlfX2xlMzIgdWNhc3Rfbm9fYnVmZl9wa3RzOworCV9fbGUzMiBtY2FzdF9ub19idWZmX3BrdHM7CisJX19sZTMyIGJjYXN0X25vX2J1ZmZfcGt0czsKKwlfX2xlMzIgY29hbGVzY2VkX3BrdHM7CisJc3RydWN0IHJlZ3BhaXIgY29hbGVzY2VkX2J5dGVzOworCV9fbGUzMiBjb2FsZXNjZWRfZXZlbnRzOworCV9fbGUzMiBjb2FsZXNjZWRfYWJvcnRzOworfTsKKworLyoKKyAqIFByb3RvY29sLWNvbW1vbiBzdGF0aXN0aWNzIGNvbGxlY3RlZCBieSB0aGUgWHN0b3JtIChwZXIgY2xpZW50KQorICovCitzdHJ1Y3QgeHN0b3JtX3Blcl9xdWV1ZV9zdGF0cyB7CisJc3RydWN0IHJlZ3BhaXIgdWNhc3RfYnl0ZXNfc2VudDsKKwlzdHJ1Y3QgcmVncGFpciBtY2FzdF9ieXRlc19zZW50OworCXN0cnVjdCByZWdwYWlyIGJjYXN0X2J5dGVzX3NlbnQ7CisJX19sZTMyIHVjYXN0X3BrdHNfc2VudDsKKwlfX2xlMzIgbWNhc3RfcGt0c19zZW50OworCV9fbGUzMiBiY2FzdF9wa3RzX3NlbnQ7CisJX19sZTMyIGVycm9yX2Ryb3BfcGt0czsKK307CisKKy8qCisgKgorICovCitzdHJ1Y3QgcGVyX3F1ZXVlX3N0YXRzIHsKKwlzdHJ1Y3QgdHN0b3JtX3Blcl9xdWV1ZV9zdGF0cyB0c3Rvcm1fcXVldWVfc3RhdGlzdGljczsKKwlzdHJ1Y3QgdXN0b3JtX3Blcl9xdWV1ZV9zdGF0cyB1c3Rvcm1fcXVldWVfc3RhdGlzdGljczsKKwlzdHJ1Y3QgeHN0b3JtX3Blcl9xdWV1ZV9zdGF0cyB4c3Rvcm1fcXVldWVfc3RhdGlzdGljczsKK307CisKKworLyoKICAqIEZXIHZlcnNpb24gc3RvcmVkIGluIGZpcnN0IGxpbmUgb2YgcHJhbQogICovCiBzdHJ1Y3QgcHJhbV9md192ZXJzaW9uIHsKQEAgLTM1ODIsNyArNDkxMCw2IEBACiAJdTggcHJvdG9jb2xfZGF0YVs4XTsKIAlzdHJ1Y3QgcmVncGFpciBwaHlfYWRkcmVzczsKIAlzdHJ1Y3QgcmVncGFpciBtYWNfY29uZmlnX2FkZHI7Ci0Jc3RydWN0IGNvbW1vbl9xdWVyeV9yYW1yb2RfZGF0YSBxdWVyeV9yYW1yb2RfZGF0YTsKIH07CiAKIC8qCkBAIC0zNjEzLDcgKzQ5NDAsNiBAQAogICogcGVyLXZuaWMgcmF0ZSBzaGFwaW5nIHZhcmlhYmxlcwogICovCiBzdHJ1Y3QgcmF0ZV9zaGFwaW5nX3ZhcnNfcGVyX3ZuIHsKLQlzdHJ1Y3QgcmF0ZV9zaGFwaW5nX2NvdW50ZXIgcHJvdG9jb2xfY291bnRlcnNbTlVNX09GX1BST1RPQ09MU107CiAJc3RydWN0IHJhdGVfc2hhcGluZ19jb3VudGVyIHZuX2NvdW50ZXI7CiB9OwogCkBAIC0zNjI4LDM5ICs0OTU0LDEwMCBAQAogCiAKIC8qCi0gKiBldGgvdG9lIGZsYWdzIHRoYXQgaW5kaWNhdGUgaWYgdG8gcXVlcnkKKyAqIFByb3RvY29sLWNvbW1vbiBzdGF0aXN0aWNzIGNvdW50ZXIKICAqLwotc3RydWN0IHN0YXRzX2luZGljYXRpb25fZmxhZ3MgewotCXUzMiBjb2xsZWN0X2V0aDsKLQl1MzIgY29sbGVjdF90b2U7CitzdHJ1Y3Qgc3RhdHNfY291bnRlciB7CisJX19sZTE2IHhzdGF0c19jb3VudGVyOworCV9fbGUxNiByZXNlcnZlZDA7CisJX19sZTMyIHJlc2VydmVkMTsKKwlfX2xlMTYgdHN0YXRzX2NvdW50ZXI7CisJX19sZTE2IHJlc2VydmVkMjsKKwlfX2xlMzIgcmVzZXJ2ZWQzOworCV9fbGUxNiB1c3RhdHNfY291bnRlcjsKKwlfX2xlMTYgcmVzZXJ2ZWQ0OworCV9fbGUzMiByZXNlcnZlZDU7CisJX19sZTE2IGNzdGF0c19jb3VudGVyOworCV9fbGUxNiByZXNlcnZlZDY7CisJX19sZTMyIHJlc2VydmVkNzsKIH07CiAKIAogLyoKLSAqIHBlci1wb3J0IFBGQyB2YXJpYWJsZXMKKyAqCiAgKi8KLXN0cnVjdCBzdG9ybV9wZmNfc3RydWN0X3Blcl9wb3J0IHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgbWlkX21hY19hZGRyOwotCXUxNiBtc2JfbWFjX2FkZHI7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgbXNiX21hY19hZGRyOwotCXUxNiBtaWRfbWFjX2FkZHI7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgcGZjX3BhdXNlX3F1YW50YV9pbl9uYW5vc2VjOwotCXUxNiBsc2JfbWFjX2FkZHI7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgbHNiX21hY19hZGRyOwotCXUxNiBwZmNfcGF1c2VfcXVhbnRhX2luX25hbm9zZWM7Ci0jZW5kaWYKK3N0cnVjdCBzdGF0c19xdWVyeV9lbnRyeSB7CisJdTgga2luZDsKKwl1OCBpbmRleDsKKwlfX2xlMTYgZnVuY0lEOworCV9fbGUzMiByZXNlcnZlZDsKKwlzdHJ1Y3QgcmVncGFpciBhZGRyZXNzOwogfTsKIAogLyoKLSAqIFBlci1wb3J0IGNvbmdlc3Rpb24gbWFuYWdlbWVudCB2YXJpYWJsZXMKKyAqIHN0YXRpc3RpYyBjb21tYW5kCiAgKi8KLXN0cnVjdCBzdG9ybV9jbW5nX3N0cnVjdF9wZXJfcG9ydCB7Ci0Jc3RydWN0IHN0b3JtX3BmY19zdHJ1Y3RfcGVyX3BvcnQgcGZjX3ZhcnM7CitzdHJ1Y3Qgc3RhdHNfcXVlcnlfY21kX2dyb3VwIHsKKwlzdHJ1Y3Qgc3RhdHNfcXVlcnlfZW50cnkgcXVlcnlbU1RBVFNfUVVFUllfQ01EX0NPVU5UXTsKK307CisKKworLyoKKyAqIHN0YXRpc3RpYyBjb21tYW5kIGhlYWRlcgorICovCitzdHJ1Y3Qgc3RhdHNfcXVlcnlfaGVhZGVyIHsKKwl1OCBjbWRfbnVtOworCXU4IHJlc2VydmVkMDsKKwlfX2xlMTYgZHJ2X3N0YXRzX2NvdW50ZXI7CisJX19sZTMyIHJlc2VydmVkMTsKKwlzdHJ1Y3QgcmVncGFpciBzdGF0c19jb3VudGVyc19hZGRyczsKK307CisKKworLyoKKyAqIFR5cGVzIG9mIHN0YXRpc3RjaXMgcXVlcnkgZW50cnkKKyAqLworZW51bSBzdGF0c19xdWVyeV90eXBlIHsKKwlTVEFUU19UWVBFX1FVRVVFLAorCVNUQVRTX1RZUEVfUE9SVCwKKwlTVEFUU19UWVBFX1BGLAorCVNUQVRTX1RZUEVfVE9FLAorCVNUQVRTX1RZUEVfRkNPRSwKKwlNQVhfU1RBVFNfUVVFUllfVFlQRQorfTsKKworCisvKgorICogSW5kaWNhdGUgb2YgdGhlIGZ1bmN0aW9uIHN0YXR1cyBibG9jayBzdGF0ZQorICovCitlbnVtIHN0YXR1c19ibG9ja19zdGF0ZSB7CisJU0JfRElTQUJMRUQsCisJU0JfRU5BQkxFRCwKKwlTQl9DTEVBTkVELAorCU1BWF9TVEFUVVNfQkxPQ0tfU1RBVEUKK307CisKKworLyoKKyAqIFN0b3JtIElEcyAoaW5jbHVkaW5nIGF0dGVudGlvbnMgZm9yIElHVSByZWxhdGVkIGVudW1zKQorICovCitlbnVtIHN0b3JtX2lkIHsKKwlVU1RPUk1fSUQsCisJQ1NUT1JNX0lELAorCVhTVE9STV9JRCwKKwlUU1RPUk1fSUQsCisJQVRURU5USU9OX0lELAorCU1BWF9TVE9STV9JRAorfTsKKworCisvKgorICogVGFmZmljIHR5cGVzIHVzZWQgaW4gRVRTIGFuZCBmbG93IGNvbnRyb2wgYWxnb3JpdGhtcworICovCitlbnVtIHRyYWZmaWNfdHlwZSB7CisJTExGQ19UUkFGRklDX1RZUEVfTlcsCisJTExGQ19UUkFGRklDX1RZUEVfRkNPRSwKKwlMTEZDX1RSQUZGSUNfVFlQRV9JU0NTSSwKKwlNQVhfVFJBRkZJQ19UWVBFCiB9OwogCiAKQEAgLTM3MTUsNiArNTEwMiwxNiBAQAogCiAKIC8qCisgKiBTdGF0ZSBvZiBWRi1QRiBjaGFubmVsCisgKi8KK2VudW0gdmZfcGZfY2hhbm5lbF9zdGF0ZSB7CisJVkZfUEZfQ0hBTk5FTF9TVEFURV9SRUFEWSwKKwlWRl9QRl9DSEFOTkVMX1NUQVRFX1dBSVRJTkdfRk9SX0FDSywKKwlNQVhfVkZfUEZfQ0hBTk5FTF9TVEFURQorfTsKKworCisvKgogICogem9uZSBBIHBlci1xdWV1ZSBkYXRhCiAgKi8KIHN0cnVjdCB4c3Rvcm1fcXVldWVfem9uZV9kYXRhIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2luaXQuaCBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2luaXQuaAppbmRleCBkNTM5OTIwLi40ZDc0OGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9pbml0LmgKKysrIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfaW5pdC5oCkBAIC0xNSw5OCArMTUsMzQgQEAKICNpZm5kZWYgQk5YMlhfSU5JVF9ICiAjZGVmaW5lIEJOWDJYX0lOSVRfSAogCi0vKiBSQU0wIHNpemUgaW4gYnl0ZXMgKi8KLSNkZWZpbmUgU1RPUk1fSU5UTUVNX1NJWkVfRTEJCTB4NTgwMAotI2RlZmluZSBTVE9STV9JTlRNRU1fU0laRV9FMUgJCTB4MTAwMDAKLSNkZWZpbmUgU1RPUk1fSU5UTUVNX1NJWkUoYnApICgoQ0hJUF9JU19FMShicCkgPyBTVE9STV9JTlRNRU1fU0laRV9FMSA6IFwKLQkJCQkJCSAgICBTVE9STV9JTlRNRU1fU0laRV9FMUgpIC8gNCkKLQotCiAvKiBJbml0IG9wZXJhdGlvbiB0eXBlcyBhbmQgc3RydWN0dXJlcyAqLwotLyogQ29tbW9uIGZvciBib3RoIEUxIGFuZCBFMUggKi8KLSNkZWZpbmUgT1BfUkQJCQkweDEgLyogcmVhZCBzaW5nbGUgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BfV1IJCQkweDIgLyogd3JpdGUgc2luZ2xlIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QX0lXCQkJMHgzIC8qIHdyaXRlIHNpbmdsZSByZWdpc3RlciB1c2luZyBtYWlsYm94ICovCi0jZGVmaW5lIE9QX1NXCQkJMHg0IC8qIGNvcHkgYSBzdHJpbmcgdG8gdGhlIGRldmljZSAqLwotI2RlZmluZSBPUF9TSQkJCTB4NSAvKiBjb3B5IGEgc3RyaW5nIHVzaW5nIG1haWxib3ggKi8KLSNkZWZpbmUgT1BfWlIJCQkweDYgLyogY2xlYXIgbWVtb3J5ICovCi0jZGVmaW5lIE9QX1pQCQkJMHg3IC8qIHVuemlwIHRoZW4gY29weSB3aXRoIERNQUUgKi8KLSNkZWZpbmUgT1BfV1JfNjQJCTB4OCAvKiB3cml0ZSA2NCBiaXQgcGF0dGVybiAqLwotI2RlZmluZSBPUF9XQgkJCTB4OSAvKiBjb3B5IGEgc3RyaW5nIHVzaW5nIERNQUUgKi8KK2VudW0geworCU9QX1JEID0gMHgxLAkvKiByZWFkIGEgc2luZ2xlIHJlZ2lzdGVyICovCisJT1BfV1IsCQkvKiB3cml0ZSBhIHNpbmdsZSByZWdpc3RlciAqLworCU9QX1NXLAkJLyogY29weSBhIHN0cmluZyB0byB0aGUgZGV2aWNlICovCisJT1BfWlIsCQkvKiBjbGVhciBtZW1vcnkgKi8KKwlPUF9aUCwJCS8qIHVuemlwIHRoZW4gY29weSB3aXRoIERNQUUgKi8KKwlPUF9XUl82NCwJLyogd3JpdGUgNjQgYml0IHBhdHRlcm4gKi8KKwlPUF9XQiwJCS8qIGNvcHkgYSBzdHJpbmcgdXNpbmcgRE1BRSAqLworCU9QX1dCX1pSLAkvKiBDbGVhciBhIHN0cmluZyB1c2luZyBETUFFIG9yIGluZGlyZWN0LXdyICovCisJLyogU2tpcCB0aGUgZm9sbG93aW5nIG9wcyBpZiBhbGwgb2YgdGhlIGluaXQgbW9kZXMgZG9uJ3QgbWF0Y2ggKi8KKwlPUF9JRl9NT0RFX09SLAorCS8qIFNraXAgdGhlIGZvbGxvd2luZyBvcHMgaWYgYW55IG9mIHRoZSBpbml0IG1vZGVzIGRvbid0IG1hdGNoICovCisJT1BfSUZfTU9ERV9BTkQsCisJT1BfTUFYCit9OwogCi0vKiBGUEdBIGFuZCBFTVVMIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgT1BfV1JfRU1VTAkJMHhhIC8qIHdyaXRlIHNpbmdsZSByZWdpc3RlciBvbiBFbXVsYXRpb24gKi8KLSNkZWZpbmUgT1BfV1JfRlBHQQkJMHhiIC8qIHdyaXRlIHNpbmdsZSByZWdpc3RlciBvbiBGUEdBICovCi0jZGVmaW5lIE9QX1dSX0FTSUMJCTB4YyAvKiB3cml0ZSBzaW5nbGUgcmVnaXN0ZXIgb24gQVNJQyAqLwotCi0vKiBJbml0IHN0YWdlcyAqLwotLyogTmV2ZXIgcmVvcmRlciBzdGFnZXMgISEhICovCi0jZGVmaW5lIENPTU1PTl9TVEFHRQkJMAotI2RlZmluZSBQT1JUMF9TVEFHRQkJMQotI2RlZmluZSBQT1JUMV9TVEFHRQkJMgotI2RlZmluZSBGVU5DMF9TVEFHRQkJMwotI2RlZmluZSBGVU5DMV9TVEFHRQkJNAotI2RlZmluZSBGVU5DMl9TVEFHRQkJNQotI2RlZmluZSBGVU5DM19TVEFHRQkJNgotI2RlZmluZSBGVU5DNF9TVEFHRQkJNwotI2RlZmluZSBGVU5DNV9TVEFHRQkJOAotI2RlZmluZSBGVU5DNl9TVEFHRQkJOQotI2RlZmluZSBGVU5DN19TVEFHRQkJMTAKLSNkZWZpbmUgU1RBR0VfSURYX01BWAkJMTEKLQotI2RlZmluZSBTVEFHRV9TVEFSVAkJMAotI2RlZmluZSBTVEFHRV9FTkQJCTEKLQotCi0vKiBJbmRpY2VzIG9mIGJsb2NrcyAqLwotI2RlZmluZSBQUlNfQkxPQ0sJCTAKLSNkZWZpbmUgU1JDSF9CTE9DSwkJMQotI2RlZmluZSBUU0RNX0JMT0NLCQkyCi0jZGVmaW5lIFRDTV9CTE9DSwkJMwotI2RlZmluZSBCUkIxX0JMT0NLCQk0Ci0jZGVmaW5lIFRTRU1fQkxPQ0sJCTUKLSNkZWZpbmUgUFhQQ1NfQkxPQ0sJCTYKLSNkZWZpbmUgRU1BQzBfQkxPQ0sJCTcKLSNkZWZpbmUgRU1BQzFfQkxPQ0sJCTgKLSNkZWZpbmUgREJVX0JMT0NLCQk5Ci0jZGVmaW5lIE1JU0NfQkxPQ0sJCTEwCi0jZGVmaW5lIERCR19CTE9DSwkJMTEKLSNkZWZpbmUgTklHX0JMT0NLCQkxMgotI2RlZmluZSBNQ1BfQkxPQ0sJCTEzCi0jZGVmaW5lIFVQQl9CTE9DSwkJMTQKLSNkZWZpbmUgQ1NETV9CTE9DSwkJMTUKLSNkZWZpbmUgVVNETV9CTE9DSwkJMTYKLSNkZWZpbmUgQ0NNX0JMT0NLCQkxNwotI2RlZmluZSBVQ01fQkxPQ0sJCTE4Ci0jZGVmaW5lIFVTRU1fQkxPQ0sJCTE5Ci0jZGVmaW5lIENTRU1fQkxPQ0sJCTIwCi0jZGVmaW5lIFhQQl9CTE9DSwkJMjEKLSNkZWZpbmUgRFFfQkxPQ0sJCTIyCi0jZGVmaW5lIFRJTUVSU19CTE9DSwkJMjMKLSNkZWZpbmUgWFNETV9CTE9DSwkJMjQKLSNkZWZpbmUgUU1fQkxPQ0sJCTI1Ci0jZGVmaW5lIFBCRl9CTE9DSwkJMjYKLSNkZWZpbmUgWENNX0JMT0NLCQkyNwotI2RlZmluZSBYU0VNX0JMT0NLCQkyOAotI2RlZmluZSBDRFVfQkxPQ0sJCTI5Ci0jZGVmaW5lIERNQUVfQkxPQ0sJCTMwCi0jZGVmaW5lIFBYUF9CTE9DSwkJMzEKLSNkZWZpbmUgQ0ZDX0JMT0NLCQkzMgotI2RlZmluZSBIQ19CTE9DSwkJMzMKLSNkZWZpbmUgUFhQMl9CTE9DSwkJMzQKLSNkZWZpbmUgTUlTQ19BRVVfQkxPQ0sJCTM1Ci0jZGVmaW5lIFBHTFVFX0JfQkxPQ0sJCTM2Ci0jZGVmaW5lIElHVV9CTE9DSwkJMzcKLSNkZWZpbmUgQVRDX0JMT0NLCQkzOAotI2RlZmluZSBRTV80UE9SVF9CTE9DSwkJMzkKLSNkZWZpbmUgWFNFTV80UE9SVF9CTE9DSwkJNDAKLQorZW51bSB7CisJU1RBR0VfU1RBUlQsCisJU1RBR0VfRU5ELAorfTsKIAogLyogUmV0dXJucyB0aGUgaW5kZXggb2Ygc3RhcnQgb3IgZW5kIG9mIGEgc3BlY2lmaWMgYmxvY2sgc3RhZ2UgaW4gb3BzIGFycmF5Ki8KICNkZWZpbmUgQkxPQ0tfT1BTX0lEWChibG9jaywgc3RhZ2UsIGVuZCkgXAotCQkJKDIqKCgoYmxvY2spKlNUQUdFX0lEWF9NQVgpICsgKHN0YWdlKSkgKyAoZW5kKSkKKwkoMiooKChibG9jaykqTlVNX09GX0lOSVRfUEhBU0VTKSArIChzdGFnZSkpICsgKGVuZCkpCiAKIAorLyogc3RydWN0cyBmb3IgdGhlIHZhcmlvdXMgb3Bjb2RlcyAqLwogc3RydWN0IHJhd19vcCB7CiAJdTMyIG9wOjg7CiAJdTMyIG9mZnNldDoyNDsKQEAgLTExNiw3ICs1Miw3IEBACiBzdHJ1Y3Qgb3BfcmVhZCB7CiAJdTMyIG9wOjg7CiAJdTMyIG9mZnNldDoyNDsKLQl1MzIgcGFkOworCXUzMiB2YWw7CiB9OwogCiBzdHJ1Y3Qgb3Bfd3JpdGUgewpAQCAtMTI1LDE1ICs2MSwxNSBAQAogCXUzMiB2YWw7CiB9OwogCi1zdHJ1Y3Qgb3Bfc3RyaW5nX3dyaXRlIHsKK3N0cnVjdCBvcF9hcnJfd3JpdGUgewogCXUzMiBvcDo4OwogCXUzMiBvZmZzZXQ6MjQ7Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JdTE2IGRhdGFfb2ZmOwotCXUxNiBkYXRhX2xlbjsKLSNlbHNlIC8qIF9fQklHX0VORElBTiAqLworI2lmZGVmIF9fQklHX0VORElBTgogCXUxNiBkYXRhX2xlbjsKIAl1MTYgZGF0YV9vZmY7CisjZWxzZSAvKiBfX0xJVFRMRV9FTkRJQU4gKi8KKwl1MTYgZGF0YV9vZmY7CisJdTE2IGRhdGFfbGVuOwogI2VuZGlmCiB9OwogCkBAIC0xNDMsMTQgKzc5LDIwOSBAQAogCXUzMiBsZW47CiB9OwogCitzdHJ1Y3Qgb3BfaWZfbW9kZSB7CisJdTMyIG9wOjg7CisJdTMyIGNtZF9vZmZzZXQ6MjQ7CisJdTMyIG1vZGVfYml0X21hcDsKK307CisKKwogdW5pb24gaW5pdF9vcCB7CiAJc3RydWN0IG9wX3JlYWQJCXJlYWQ7CiAJc3RydWN0IG9wX3dyaXRlCQl3cml0ZTsKLQlzdHJ1Y3Qgb3Bfc3RyaW5nX3dyaXRlCXN0cl93cjsKKwlzdHJ1Y3Qgb3BfYXJyX3dyaXRlCWFycl93cjsKIAlzdHJ1Y3Qgb3BfemVybwkJemVybzsKIAlzdHJ1Y3QgcmF3X29wCQlyYXc7CisJc3RydWN0IG9wX2lmX21vZGUJaWZfbW9kZTsKIH07CiAKKworLyogSW5pdCBQaGFzZXMgKi8KK2VudW0geworCVBIQVNFX0NPTU1PTiwKKwlQSEFTRV9QT1JUMCwKKwlQSEFTRV9QT1JUMSwKKwlQSEFTRV9QRjAsCisJUEhBU0VfUEYxLAorCVBIQVNFX1BGMiwKKwlQSEFTRV9QRjMsCisJUEhBU0VfUEY0LAorCVBIQVNFX1BGNSwKKwlQSEFTRV9QRjYsCisJUEhBU0VfUEY3LAorCU5VTV9PRl9JTklUX1BIQVNFUworfTsKKworLyogSW5pdCBNb2RlcyAqLworZW51bSB7CisJTU9ERV9BU0lDICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKwlNT0RFX0ZQR0EgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorCU1PREVfRU1VTCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisJTU9ERV9FMiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwOCwKKwlNT0RFX0UzICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDEwLAorCU1PREVfUE9SVDIgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMjAsCisJTU9ERV9QT1JUNCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDA0MCwKKwlNT0RFX1NGICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDgwLAorCU1PREVfTUYgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAxMDAsCisJTU9ERV9NRl9TRCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDIwMCwKKwlNT0RFX01GX1NJICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwNDAwLAorCU1PREVfTUZfTklWICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDA4MDAsCisJTU9ERV9FM19BMCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMTAwMCwKKwlNT0RFX0UzX0IwICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAyMDAwLAorCU1PREVfQ09TMyAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDQwMDAsCisJTU9ERV9DT1M2ICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwODAwMCwKKwlNT0RFX0xJVFRMRV9FTkRJQU4gICAgICAgICAgICAgPSAweDAwMDEwMDAwLAorCU1PREVfQklHX0VORElBTiAgICAgICAgICAgICAgICA9IDB4MDAwMjAwMDAsCit9OworCisvKiBJbml0IEJsb2NrcyAqLworZW51bSB7CisJQkxPQ0tfQVRDLAorCUJMT0NLX0JSQjEsCisJQkxPQ0tfQ0NNLAorCUJMT0NLX0NEVSwKKwlCTE9DS19DRkMsCisJQkxPQ0tfQ1NETSwKKwlCTE9DS19DU0VNLAorCUJMT0NLX0RCRywKKwlCTE9DS19ETUFFLAorCUJMT0NLX0RPUlEsCisJQkxPQ0tfSEMsCisJQkxPQ0tfSUdVLAorCUJMT0NLX01JU0MsCisJQkxPQ0tfTklHLAorCUJMT0NLX1BCRiwKKwlCTE9DS19QR0xVRV9CLAorCUJMT0NLX1BSUywKKwlCTE9DS19QWFAyLAorCUJMT0NLX1BYUCwKKwlCTE9DS19RTSwKKwlCTE9DS19TUkMsCisJQkxPQ0tfVENNLAorCUJMT0NLX1RNLAorCUJMT0NLX1RTRE0sCisJQkxPQ0tfVFNFTSwKKwlCTE9DS19VQ00sCisJQkxPQ0tfVVBCLAorCUJMT0NLX1VTRE0sCisJQkxPQ0tfVVNFTSwKKwlCTE9DS19YQ00sCisJQkxPQ0tfWFBCLAorCUJMT0NLX1hTRE0sCisJQkxPQ0tfWFNFTSwKKwlCTE9DS19NSVNDX0FFVSwKKwlOVU1fT0ZfSU5JVF9CTE9DS1MKK307CisKKy8qIFFNIHF1ZXVlIG51bWJlcnMgKi8KKyNkZWZpbmUgQk5YMlhfRVRIX1EJCTAKKyNkZWZpbmUgQk5YMlhfVE9FX1EJCTMKKyNkZWZpbmUgQk5YMlhfVE9FX0FDS19RCQk2CisjZGVmaW5lIEJOWDJYX0lTQ1NJX1EJCTkKKyNkZWZpbmUgQk5YMlhfSVNDU0lfQUNLX1EJMTEKKyNkZWZpbmUgQk5YMlhfRkNPRV9RCQkxMAorCisvKiBWbmljcyBwZXIgbW9kZSAqLworI2RlZmluZSBCTlgyWF9QT1JUMl9NT0RFX05VTV9WTklDUyA0CisjZGVmaW5lIEJOWDJYX1BPUlQ0X01PREVfTlVNX1ZOSUNTIDIKKworLyogQ09TIG9mZnNldCBmb3IgcG9ydDEgaW4gRTMgQjAgNHBvcnQgbW9kZSAqLworI2RlZmluZSBCTlgyWF9FM0IwX1BPUlQxX0NPU19PRkZTRVQgMworCisvKiBRTSBSZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgQk5YMlhfUV9WT1FfUkVHX0FERFIocGZfcV9udW0pXAorCShRTV9SRUdfUVZPUUlEWF8wICsgNCAqIChwZl9xX251bSkpCisjZGVmaW5lIEJOWDJYX1ZPUV9RX1JFR19BRERSKGNvcywgcGZfcV9udW0pXAorCShRTV9SRUdfVk9RUU1BU0tfMF9MU0IgKyA0ICogKChjb3MpICogMiArICgocGZfcV9udW0pID4+IDUpKSkKKyNkZWZpbmUgQk5YMlhfUV9DTURRX1JFR19BRERSKHBmX3FfbnVtKVwKKwkoUU1fUkVHX0JZVEVDUkRDTURRXzAgKyA0ICogKChwZl9xX251bSkgPj4gNCkpCisKKy8qIGV4dHJhY3RzIHRoZSBRTSBxdWV1ZSBudW1iZXIgZm9yIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgdm5pYyAqLworI2RlZmluZSBCTlgyWF9QRl9RX05VTShxX251bSwgcG9ydCwgdm5pYylcCisJKCgoKHBvcnQpIDw8IDEpIHwgKHZuaWMpKSAqIDE2ICsgKHFfbnVtKSkKKworCisvKiBNYXBzIHRoZSBzcGVjaWZpZWQgcXVldWUgdG8gdGhlIHNwZWNpZmllZCBDT1MgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9tYXBfcV9jb3Moc3RydWN0IGJueDJ4ICpicCwgdTMyIHFfbnVtLCB1MzIgbmV3X2NvcykKK3sKKwkvKiBmaW5kIGN1cnJlbnQgQ09TIG1hcHBpbmcgKi8KKwl1MzIgY3Vycl9jb3MgPSBSRUdfUkQoYnAsIFFNX1JFR19RVk9RSURYXzAgKyBxX251bSAqIDQpOworCisJLyogY2hlY2sgaWYgcXVldWUtPkNPUyBtYXBwaW5nIGhhcyBjaGFuZ2VkICovCisJaWYgKGN1cnJfY29zICE9IG5ld19jb3MpIHsKKwkJdTMyIG51bV92bmljcyA9IEJOWDJYX1BPUlQyX01PREVfTlVNX1ZOSUNTOworCQl1MzIgcmVnX2FkZHIsIHJlZ19iaXRfbWFwLCB2bmljOworCisJCS8qIHVwZGF0ZSBwYXJhbWV0ZXJzIGZvciA0cG9ydCBtb2RlICovCisJCWlmIChJTklUX01PREVfRkxBR1MoYnApICYgTU9ERV9QT1JUNCkgeworCQkJbnVtX3ZuaWNzID0gQk5YMlhfUE9SVDRfTU9ERV9OVU1fVk5JQ1M7CisJCQlpZiAoQlBfUE9SVChicCkpIHsKKwkJCQljdXJyX2NvcyArPSBCTlgyWF9FM0IwX1BPUlQxX0NPU19PRkZTRVQ7CisJCQkJbmV3X2NvcyArPSBCTlgyWF9FM0IwX1BPUlQxX0NPU19PRkZTRVQ7CisJCQl9CisJCX0KKworCQkvKiBjaGFuZ2UgcXVldWUgbWFwcGluZyBmb3IgZWFjaCBWTklDICovCisJCWZvciAodm5pYyA9IDA7IHZuaWMgPCBudW1fdm5pY3M7IHZuaWMrKykgeworCQkJdTMyIHBmX3FfbnVtID0KKwkJCQlCTlgyWF9QRl9RX05VTShxX251bSwgQlBfUE9SVChicCksIHZuaWMpOworCQkJdTMyIHFfYml0X21hcCA9IDEgPDwgKHBmX3FfbnVtICYgMHgxZik7CisKKwkJCS8qIG92ZXJ3cml0ZSBxdWV1ZS0+Vk9RIG1hcHBpbmcgKi8KKwkJCVJFR19XUihicCwgQk5YMlhfUV9WT1FfUkVHX0FERFIocGZfcV9udW0pLCBuZXdfY29zKTsKKworCQkJLyogY2xlYXIgcXVldWUgYml0IGZyb20gY3VycmVudCBDT1MgYml0IG1hcCAqLworCQkJcmVnX2FkZHIgPSBCTlgyWF9WT1FfUV9SRUdfQUREUihjdXJyX2NvcywgcGZfcV9udW0pOworCQkJcmVnX2JpdF9tYXAgPSBSRUdfUkQoYnAsIHJlZ19hZGRyKTsKKwkJCVJFR19XUihicCwgcmVnX2FkZHIsIHJlZ19iaXRfbWFwICYgKH5xX2JpdF9tYXApKTsKKworCQkJLyogc2V0IHF1ZXVlIGJpdCBpbiBuZXcgQ09TIGJpdCBtYXAgKi8KKwkJCXJlZ19hZGRyID0gQk5YMlhfVk9RX1FfUkVHX0FERFIobmV3X2NvcywgcGZfcV9udW0pOworCQkJcmVnX2JpdF9tYXAgPSBSRUdfUkQoYnAsIHJlZ19hZGRyKTsKKwkJCVJFR19XUihicCwgcmVnX2FkZHIsIHJlZ19iaXRfbWFwIHwgcV9iaXRfbWFwKTsKKworCQkJLyogc2V0L2NsZWFyIHF1ZXVlIGJpdCBpbiBjb21tYW5kLXF1ZXVlIGJpdCBtYXAKKwkJCShFMi9FM0EwIG9ubHksIHZhbGlkIENPUyB2YWx1ZXMgYXJlIDAvMSkgKi8KKwkJCWlmICghKElOSVRfTU9ERV9GTEFHUyhicCkgJiBNT0RFX0UzX0IwKSkgeworCQkJCXJlZ19hZGRyID0gQk5YMlhfUV9DTURRX1JFR19BRERSKHBmX3FfbnVtKTsKKwkJCQlyZWdfYml0X21hcCA9IFJFR19SRChicCwgcmVnX2FkZHIpOworCQkJCXFfYml0X21hcCA9IDEgPDwgKDIgKiAocGZfcV9udW0gJiAweGYpKTsKKwkJCQlyZWdfYml0X21hcCA9IG5ld19jb3MgPworCQkJCQkgICAgICAocmVnX2JpdF9tYXAgfCBxX2JpdF9tYXApIDoKKwkJCQkJICAgICAgKHJlZ19iaXRfbWFwICYgKH5xX2JpdF9tYXApKTsKKwkJCQlSRUdfV1IoYnAsIHJlZ19hZGRyLCByZWdfYml0X21hcCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIENvbmZpZ3VyZXMgdGhlIFFNIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBlci10cmFmZmljLXR5cGUgQ09TZXMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9kY2JfY29uZmlnX3FtKHN0cnVjdCBibngyeCAqYnAsIGVudW0gY29zX21vZGUgbW9kZSwKKwkJCQkgICAgICAgc3RydWN0IHByaW9yaXR5X2NvcyAqdHJhZmZpY19jb3MpCit7CisJYm54MnhfbWFwX3FfY29zKGJwLCBCTlgyWF9GQ09FX1EsCisJCQl0cmFmZmljX2Nvc1tMTEZDX1RSQUZGSUNfVFlQRV9GQ09FXS5jb3MpOworCWJueDJ4X21hcF9xX2NvcyhicCwgQk5YMlhfSVNDU0lfUSwKKwkJCXRyYWZmaWNfY29zW0xMRkNfVFJBRkZJQ19UWVBFX0lTQ1NJXS5jb3MpOworCWJueDJ4X21hcF9xX2NvcyhicCwgQk5YMlhfSVNDU0lfQUNLX1EsCisJCXRyYWZmaWNfY29zW0xMRkNfVFJBRkZJQ19UWVBFX0lTQ1NJXS5jb3MpOworCWlmIChtb2RlICE9IFNUQVRJQ19DT1MpIHsKKwkJLyogcmVxdWlyZWQgb25seSBpbiBiYWNrd2FyZCBjb21wYXRpYmxlIENPUyBtb2RlICovCisJCWJueDJ4X21hcF9xX2NvcyhicCwgQk5YMlhfRVRIX1EsCisJCQkJdHJhZmZpY19jb3NbTExGQ19UUkFGRklDX1RZUEVfTlddLmNvcyk7CisJCWJueDJ4X21hcF9xX2NvcyhicCwgQk5YMlhfVE9FX1EsCisJCQkJdHJhZmZpY19jb3NbTExGQ19UUkFGRklDX1RZUEVfTlddLmNvcyk7CisJCWJueDJ4X21hcF9xX2NvcyhicCwgQk5YMlhfVE9FX0FDS19RLAorCQkJCXRyYWZmaWNfY29zW0xMRkNfVFJBRkZJQ19UWVBFX05XXS5jb3MpOworCX0KK30KKworCisvKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBzdGFydCBvciBlbmQgb2YgYSBzcGVjaWZpYyBibG9jayBzdGFnZSBpbiBvcHMgYXJyYXkqLworI2RlZmluZSBCTE9DS19PUFNfSURYKGJsb2NrLCBzdGFnZSwgZW5kKSBcCisJCQkoMiooKChibG9jaykqTlVNX09GX0lOSVRfUEhBU0VTKSArIChzdGFnZSkpICsgKGVuZCkpCisKKwogI2RlZmluZSBJTklUT1BfU0VUCQkwCS8qIHNldCB0aGUgSFcgZGlyZWN0bHkgKi8KICNkZWZpbmUgSU5JVE9QX0NMRUFSCQkxCS8qIGNsZWFyIHRoZSBIVyBkaXJlY3RseSAqLwogI2RlZmluZSBJTklUT1BfSU5JVAkJMgkvKiBzZXQgdGhlIGluaXQtdmFsdWUgYXJyYXkgKi8KQEAgLTE5NSwyNSArMzI2LDI1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXJpdHkgY29uZmlndXJhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQkxPQ0tfUFJUWV9JTkZPKGJsb2NrLCBlbl9tYXNrLCBtMSwgbTFoLCBtMikgXAorI2RlZmluZSBCTE9DS19QUlRZX0lORk8oYmxvY2ssIGVuX21hc2ssIG0xLCBtMWgsIG0yLCBtMykgXAogeyBcCiAJYmxvY2sjI19SRUdfIyNibG9jayMjX1BSVFlfTUFTSywgXAogCWJsb2NrIyNfUkVHXyMjYmxvY2sjI19QUlRZX1NUU19DTFIsIFwKLQllbl9tYXNrLCB7bTEsIG0xaCwgbTJ9LCAjYmxvY2sgXAorCWVuX21hc2ssIHttMSwgbTFoLCBtMiwgbTN9LCAjYmxvY2sgXAogfQogCi0jZGVmaW5lIEJMT0NLX1BSVFlfSU5GT18wKGJsb2NrLCBlbl9tYXNrLCBtMSwgbTFoLCBtMikgXAorI2RlZmluZSBCTE9DS19QUlRZX0lORk9fMChibG9jaywgZW5fbWFzaywgbTEsIG0xaCwgbTIsIG0zKSBcCiB7IFwKIAlibG9jayMjX1JFR18jI2Jsb2NrIyNfUFJUWV9NQVNLXzAsIFwKIAlibG9jayMjX1JFR18jI2Jsb2NrIyNfUFJUWV9TVFNfQ0xSXzAsIFwKLQllbl9tYXNrLCB7bTEsIG0xaCwgbTJ9LCAjYmxvY2siXzAiIFwKKwllbl9tYXNrLCB7bTEsIG0xaCwgbTIsIG0zfSwgI2Jsb2NrIl8wIiBcCiB9CiAKLSNkZWZpbmUgQkxPQ0tfUFJUWV9JTkZPXzEoYmxvY2ssIGVuX21hc2ssIG0xLCBtMWgsIG0yKSBcCisjZGVmaW5lIEJMT0NLX1BSVFlfSU5GT18xKGJsb2NrLCBlbl9tYXNrLCBtMSwgbTFoLCBtMiwgbTMpIFwKIHsgXAogCWJsb2NrIyNfUkVHXyMjYmxvY2sjI19QUlRZX01BU0tfMSwgXAogCWJsb2NrIyNfUkVHXyMjYmxvY2sjI19QUlRZX1NUU19DTFJfMSwgXAotCWVuX21hc2ssIHttMSwgbTFoLCBtMn0sICNibG9jayJfMSIgXAorCWVuX21hc2ssIHttMSwgbTFoLCBtMiwgbTN9LCAjYmxvY2siXzEiIFwKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CkBAIC0yMjQsNiArMzU1LDcgQEAKIAkJdTMyIGUxOwkJLyogNTc3MTAgKi8KIAkJdTMyIGUxaDsJLyogNTc3MTEgKi8KIAkJdTMyIGUyOwkJLyogNTc3MTIgKi8KKwkJdTMyIGUzOwkJLyogNTc4eHggKi8KIAl9IHJlZ19tYXNrOwkJLyogUmVnaXN0ZXIgbWFzayAoYWxsIHZhbGlkIGJpdHMpICovCiAJY2hhciBuYW1lWzddOwkJLyogQmxvY2sncyBsb25nZXN0IG5hbWUgaXMgNiBjaGFyYWN0ZXJzIGxvbmcKIAkJCQkgKiAobmFtZSArIHN1ZmZpeCkKQEAgLTI0MSwzOSArMzczLDU2IEBACiAJLyogQmxvY2sgSUdVLCBNSVNDLCBQWFAgYW5kIFBYUDIgcGFyaXR5IGVycm9ycyBhcyBsb25nIGFzIHdlIGRvbid0CiAJICogd2FudCB0byBoYW5kbGUgInN5c3RlbSBraWxsIiBmbG93IGF0IHRoZSBtb21lbnQuCiAJICovCi0JQkxPQ0tfUFJUWV9JTkZPKFBYUCwgMHg3ZmZmZmZmLCAweDNmZmZmZmYsIDB4M2ZmZmZmZiwgMHg3ZmZmZmZmKSwKLQlCTE9DS19QUlRZX0lORk9fMChQWFAyLAkweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKSwKLQlCTE9DS19QUlRZX0lORk9fMShQWFAyLAkweDdmZiwgMHg3ZiwgMHg3ZiwgMHg3ZmYpLAotCUJMT0NLX1BSVFlfSU5GTyhIQywgMHg3LCAweDcsIDB4NywgMCksCi0JQkxPQ0tfUFJUWV9JTkZPKElHVSwgMHg3ZmYsIDAsIDAsIDB4N2ZmKSwKLQlCTE9DS19QUlRZX0lORk8oTUlTQywgMHgxLCAweDEsIDB4MSwgMHgxKSwKLQlCTE9DS19QUlRZX0lORk8oUU0sIDAsIDB4MWZmLCAweGZmZiwgMHhmZmYpLAotCUJMT0NLX1BSVFlfSU5GTyhET1JRLCAwLCAweDMsIDB4MywgMHgzKSwKKwlCTE9DS19QUlRZX0lORk8oUFhQLCAweDdmZmZmZmYsIDB4M2ZmZmZmZiwgMHgzZmZmZmZmLCAweDdmZmZmZmYsCisJCQkweDdmZmZmZmYpLAorCUJMT0NLX1BSVFlfSU5GT18wKFBYUDIsCTB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJCQkgIDB4ZmZmZmZmZmYpLAorCUJMT0NLX1BSVFlfSU5GT18xKFBYUDIsCTB4MWZmZmZmZiwgMHg3ZiwgMHg3ZiwgMHg3ZmYsIDB4MWZmZmZmZiksCisJQkxPQ0tfUFJUWV9JTkZPKEhDLCAweDcsIDB4NywgMHg3LCAwLCAwKSwKKwlCTE9DS19QUlRZX0lORk8oTklHLCAweGZmZmZmZmZmLCAweDNmZmZmZmZmLCAweGZmZmZmZmZmLCAwLCAwKSwKKwlCTE9DS19QUlRZX0lORk9fMChOSUcsCTB4ZmZmZmZmZmYsIDAsIDAsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYpLAorCUJMT0NLX1BSVFlfSU5GT18xKE5JRywJMHhmZmZmLCAwLCAwLCAweGZmLCAweGZmZmYpLAorCUJMT0NLX1BSVFlfSU5GTyhJR1UsIDB4N2ZmLCAwLCAwLCAweDdmZiwgMHg3ZmYpLAorCUJMT0NLX1BSVFlfSU5GTyhNSVNDLCAweDEsIDB4MSwgMHgxLCAweDEsIDB4MSksCisJQkxPQ0tfUFJUWV9JTkZPKFFNLCAwLCAweDFmZiwgMHhmZmYsIDB4ZmZmLCAweGZmZiksCisJQkxPQ0tfUFJUWV9JTkZPKEFUQywgMHgxZiwgMCwgMCwgMHgxZiwgMHgxZiksCisJQkxPQ0tfUFJUWV9JTkZPKFBHTFVFX0IsIDB4MywgMCwgMCwgMHgzLCAweDMpLAorCUJMT0NLX1BSVFlfSU5GTyhET1JRLCAwLCAweDMsIDB4MywgMHgzLCAweDMpLAogCXtHUkNCQVNFX1VQQiArIFBCX1JFR19QQl9QUlRZX01BU0ssCi0JCUdSQ0JBU0VfVVBCICsgUEJfUkVHX1BCX1BSVFlfU1RTX0NMUiwgMCwKLQkJezB4ZiwgMHhmLCAweGZ9LCAiVVBCIn0sCisJCUdSQ0JBU0VfVVBCICsgUEJfUkVHX1BCX1BSVFlfU1RTX0NMUiwgMHhmLAorCQl7MHhmLCAweGYsIDB4ZiwgMHhmfSwgIlVQQiJ9LAogCXtHUkNCQVNFX1hQQiArIFBCX1JFR19QQl9QUlRZX01BU0ssCiAJCUdSQ0JBU0VfWFBCICsgUEJfUkVHX1BCX1BSVFlfU1RTX0NMUiwgMCwKLQkJezB4ZiwgMHhmLCAweGZ9LCAiWFBCIn0sCi0JQkxPQ0tfUFJUWV9JTkZPKFNSQywgMHg0LCAweDcsIDB4NywgMHg3KSwKLQlCTE9DS19QUlRZX0lORk8oQ0RVLCAwLCAweDFmLCAweDFmLCAweDFmKSwKLQlCTE9DS19QUlRZX0lORk8oQ0ZDLCAwLCAweGYsIDB4ZiwgMHhmKSwKLQlCTE9DS19QUlRZX0lORk8oREJHLCAwLCAweDEsIDB4MSwgMHgxKSwKLQlCTE9DS19QUlRZX0lORk8oRE1BRSwgMCwgMHhmLCAweGYsIDB4ZiksCi0JQkxPQ0tfUFJUWV9JTkZPKEJSQjEsIDAsIDB4ZiwgMHhmLCAweGYpLAotCUJMT0NLX1BSVFlfSU5GTyhQUlMsICgxPDw2KSwgMHhmZiwgMHhmZiwgMHhmZiksCi0JQkxPQ0tfUFJUWV9JTkZPKFRTRE0sIDB4MTgsIDB4N2ZmLCAweDdmZiwgMHg3ZmYpLAotCUJMT0NLX1BSVFlfSU5GTyhDU0RNLCAweDgsIDB4N2ZmLCAweDdmZiwgMHg3ZmYpLAotCUJMT0NLX1BSVFlfSU5GTyhVU0RNLCAweDM4LCAweDdmZiwgMHg3ZmYsIDB4N2ZmKSwKLQlCTE9DS19QUlRZX0lORk8oWFNETSwgMHg4LCAweDdmZiwgMHg3ZmYsIDB4N2ZmKSwKLQlCTE9DS19QUlRZX0lORk9fMChUU0VNLCAwLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKSwKLQlCTE9DS19QUlRZX0lORk9fMShUU0VNLCAwLCAweDMsIDB4MWYsIDB4M2YpLAotCUJMT0NLX1BSVFlfSU5GT18wKFVTRU0sIDAsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYpLAotCUJMT0NLX1BSVFlfSU5GT18xKFVTRU0sIDAsIDB4MywgMHgxZiwgMHgxZiksCi0JQkxPQ0tfUFJUWV9JTkZPXzAoQ1NFTSwgMCwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiksCi0JQkxPQ0tfUFJUWV9JTkZPXzEoQ1NFTSwgMCwgMHgzLCAweDFmLCAweDFmKSwKLQlCTE9DS19QUlRZX0lORk9fMChYU0VNLCAwLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKSwKLQlCTE9DS19QUlRZX0lORk9fMShYU0VNLCAwLCAweDMsIDB4MWYsIDB4M2YpLAorCQl7MHhmLCAweGYsIDB4ZiwgMHhmfSwgIlhQQiJ9LAorCUJMT0NLX1BSVFlfSU5GTyhTUkMsIDB4NCwgMHg3LCAweDcsIDB4NywgMHg3KSwKKwlCTE9DS19QUlRZX0lORk8oQ0RVLCAwLCAweDFmLCAweDFmLCAweDFmLCAweDFmKSwKKwlCTE9DS19QUlRZX0lORk8oQ0ZDLCAwLCAweGYsIDB4ZiwgMHhmLCAweDNmKSwKKwlCTE9DS19QUlRZX0lORk8oREJHLCAwLCAweDEsIDB4MSwgMHgxLCAweDEpLAorCUJMT0NLX1BSVFlfSU5GTyhETUFFLCAwLCAweGYsIDB4ZiwgMHhmLCAweGYpLAorCUJMT0NLX1BSVFlfSU5GTyhCUkIxLCAwLCAweGYsIDB4ZiwgMHhmLCAweGYpLAorCUJMT0NLX1BSVFlfSU5GTyhQUlMsICgxPDw2KSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiksCisJQkxPQ0tfUFJUWV9JTkZPKFBCRiwgMCwgMCwgMHgzZmZmZiwgMHhmZmZmZiwgMHhmZmZmZmZmKSwKKwlCTE9DS19QUlRZX0lORk8oVE0sIDAsIDAsIDB4N2YsIDB4N2YsIDB4N2YpLAorCUJMT0NLX1BSVFlfSU5GTyhUU0RNLCAweDE4LCAweDdmZiwgMHg3ZmYsIDB4N2ZmLCAweDdmZiksCisJQkxPQ0tfUFJUWV9JTkZPKENTRE0sIDB4OCwgMHg3ZmYsIDB4N2ZmLCAweDdmZiwgMHg3ZmYpLAorCUJMT0NLX1BSVFlfSU5GTyhVU0RNLCAweDM4LCAweDdmZiwgMHg3ZmYsIDB4N2ZmLCAweDdmZiksCisJQkxPQ0tfUFJUWV9JTkZPKFhTRE0sIDB4OCwgMHg3ZmYsIDB4N2ZmLCAweDdmZiwgMHg3ZmYpLAorCUJMT0NLX1BSVFlfSU5GTyhUQ00sIDAsIDAsIDB4N2ZmZmZmZiwgMHg3ZmZmZmZmLCAweDdmZmZmZmYpLAorCUJMT0NLX1BSVFlfSU5GTyhDQ00sIDAsIDAsIDB4N2ZmZmZmZiwgMHg3ZmZmZmZmLCAweDdmZmZmZmYpLAorCUJMT0NLX1BSVFlfSU5GTyhVQ00sIDAsIDAsIDB4N2ZmZmZmZiwgMHg3ZmZmZmZmLCAweDdmZmZmZmYpLAorCUJMT0NLX1BSVFlfSU5GTyhYQ00sIDAsIDAsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYpLAorCUJMT0NLX1BSVFlfSU5GT18wKFRTRU0sIDAsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJCQkgIDB4ZmZmZmZmZmYpLAorCUJMT0NLX1BSVFlfSU5GT18xKFRTRU0sIDAsIDB4MywgMHgxZiwgMHgzZiwgMHgzZiksCisJQkxPQ0tfUFJUWV9JTkZPXzAoVVNFTSwgMCwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwKKwkJCSAgMHhmZmZmZmZmZiksCisJQkxPQ0tfUFJUWV9JTkZPXzEoVVNFTSwgMCwgMHgzLCAweDFmLCAweDFmLCAweDFmKSwKKwlCTE9DS19QUlRZX0lORk9fMChDU0VNLCAwLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLAorCQkJICAweGZmZmZmZmZmKSwKKwlCTE9DS19QUlRZX0lORk9fMShDU0VNLCAwLCAweDMsIDB4MWYsIDB4MWYsIDB4MWYpLAorCUJMT0NLX1BSVFlfSU5GT18wKFhTRU0sIDAsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJCQkgIDB4ZmZmZmZmZmYpLAorCUJMT0NLX1BSVFlfSU5GT18xKFhTRU0sIDAsIDB4MywgMHgxZiwgMHgzZiwgMHgzZiksCiB9OwogCiAKQEAgLTMyNCw4ICs0NzMsMTAgQEAKIAkJcmV0dXJuIGJueDJ4X2Jsb2Nrc19wYXJpdHlfZGF0YVtpZHhdLnJlZ19tYXNrLmUxOwogCWVsc2UgaWYgKENISVBfSVNfRTFIKGJwKSkKIAkJcmV0dXJuIGJueDJ4X2Jsb2Nrc19wYXJpdHlfZGF0YVtpZHhdLnJlZ19tYXNrLmUxaDsKLQllbHNlCisJZWxzZSBpZiAoQ0hJUF9JU19FMihicCkpCiAJCXJldHVybiBibngyeF9ibG9ja3NfcGFyaXR5X2RhdGFbaWR4XS5yZWdfbWFzay5lMjsKKwllbHNlIC8qIENISVBfSVNfRTMgKi8KKwkJcmV0dXJuIGJueDJ4X2Jsb2Nrc19wYXJpdHlfZGF0YVtpZHhdLnJlZ19tYXNrLmUzOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfZGlzYWJsZV9ibG9ja3NfcGFyaXR5KHN0cnVjdCBibngyeCAqYnApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9pbml0X29wcy5oIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfaW5pdF9vcHMuaAppbmRleCBhYWZkMDIzLi43ZWMxNzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9pbml0X29wcy5oCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2luaXRfb3BzLmgKQEAgLTE1LDEzICsxNSwzOSBAQAogI2lmbmRlZiBCTlgyWF9JTklUX09QU19ICiAjZGVmaW5lIEJOWDJYX0lOSVRfT1BTX0gKIAorCisjaWZuZGVmIEJQX0lMVAorI2RlZmluZSBCUF9JTFQoYnApCU5VTEwKKyNlbmRpZgorCisjaWZuZGVmIEJQX0ZVTkMKKyNkZWZpbmUgQlBfRlVOQyhicCkJMAorI2VuZGlmCisKKyNpZm5kZWYgQlBfUE9SVAorI2RlZmluZSBCUF9QT1JUKGJwKQkwCisjZW5kaWYKKworI2lmbmRlZiBCTlgyWF9JTFRfRlJFRQorI2RlZmluZSBCTlgyWF9JTFRfRlJFRSh4LCB5LCBzeikKKyNlbmRpZgorCisjaWZuZGVmIEJOWDJYX0lMVF9aQUxMT0MKKyNkZWZpbmUgQk5YMlhfSUxUX1pBTExPQyh4LCB5LCBzeikKKyNlbmRpZgorCisjaWZuZGVmIElMT0cyCisjZGVmaW5lIElMT0cyKHgpCXgKKyNlbmRpZgorCiBzdGF0aWMgaW50IGJueDJ4X2d1bnppcChzdHJ1Y3QgYm54MnggKmJwLCBjb25zdCB1OCAqemJ1ZiwgaW50IGxlbik7CiBzdGF0aWMgdm9pZCBibngyeF9yZWdfd3JfaW5kKHN0cnVjdCBibngyeCAqYnAsIHUzMiBhZGRyLCB1MzIgdmFsKTsKLXN0YXRpYyB2b2lkIGJueDJ4X3dyaXRlX2RtYWVfcGh5c19sZW4oc3RydWN0IGJueDJ4ICpicCwgZG1hX2FkZHJfdCBwaHlzX2FkZHIsCi0JCQkJICAgICAgdTMyIGFkZHIsIHUzMiBsZW4pOworc3RhdGljIHZvaWQgYm54Mnhfd3JpdGVfZG1hZV9waHlzX2xlbihzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgICAgIGRtYV9hZGRyX3QgcGh5c19hZGRyLCB1MzIgYWRkciwKKwkJCQkgICAgICB1MzIgbGVuKTsKIAotc3RhdGljIHZvaWQgYm54MnhfaW5pdF9zdHJfd3Ioc3RydWN0IGJueDJ4ICpicCwgdTMyIGFkZHIsIGNvbnN0IHUzMiAqZGF0YSwKLQkJCSAgICAgIHUzMiBsZW4pCitzdGF0aWMgdm9pZCBibngyeF9pbml0X3N0cl93cihzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYWRkciwKKwkJCSAgICAgIGNvbnN0IHUzMiAqZGF0YSwgdTMyIGxlbikKIHsKIAl1MzIgaTsKIApAQCAtMjksMjQgKzU1LDMyIEBACiAJCVJFR19XUihicCwgYWRkciArIGkqNCwgZGF0YVtpXSk7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJ4X2luaXRfaW5kX3dyKHN0cnVjdCBibngyeCAqYnAsIHUzMiBhZGRyLCBjb25zdCB1MzIgKmRhdGEsCi0JCQkgICAgICB1MzIgbGVuKQorc3RhdGljIHZvaWQgYm54MnhfaW5pdF9pbmRfd3Ioc3RydWN0IGJueDJ4ICpicCwgdTMyIGFkZHIsCisJCQkgICAgICBjb25zdCB1MzIgKmRhdGEsIHUzMiBsZW4pCiB7CiAJdTMyIGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCVJFR19XUl9JTkQoYnAsIGFkZHIgKyBpKjQsIGRhdGFbaV0pOworCQlibngyeF9yZWdfd3JfaW5kKGJwLCBhZGRyICsgaSo0LCBkYXRhW2ldKTsKIH0KIAotc3RhdGljIHZvaWQgYm54Mnhfd3JpdGVfYmlnX2J1ZihzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYWRkciwgdTMyIGxlbikKK3N0YXRpYyB2b2lkIGJueDJ4X3dyaXRlX2JpZ19idWYoc3RydWN0IGJueDJ4ICpicCwgdTMyIGFkZHIsIHUzMiBsZW4sCisJCQkJdTggd2IpCiB7CiAJaWYgKGJwLT5kbWFlX3JlYWR5KQogCQlibngyeF93cml0ZV9kbWFlX3BoeXNfbGVuKGJwLCBHVU5aSVBfUEhZUyhicCksIGFkZHIsIGxlbik7CisJZWxzZSBpZiAod2IpCisJCS8qCisJCSAqIFdpZGUgYnVzIHJlZ2lzdGVycyB3aXRoIG5vIGRtYWUgbmVlZCB0byBiZSB3cml0dGVuCisJCSAqIHVzaW5nIGluZGlyZWN0IHdyaXRlLgorCQkgKi8KKwkJYm54MnhfaW5pdF9pbmRfd3IoYnAsIGFkZHIsIEdVTlpJUF9CVUYoYnApLCBsZW4pOwogCWVsc2UKIAkJYm54MnhfaW5pdF9zdHJfd3IoYnAsIGFkZHIsIEdVTlpJUF9CVUYoYnApLCBsZW4pOwogfQogCi1zdGF0aWMgdm9pZCBibngyeF9pbml0X2ZpbGwoc3RydWN0IGJueDJ4ICpicCwgdTMyIGFkZHIsIGludCBmaWxsLCB1MzIgbGVuKQorc3RhdGljIHZvaWQgYm54MnhfaW5pdF9maWxsKHN0cnVjdCBibngyeCAqYnAsIHUzMiBhZGRyLCBpbnQgZmlsbCwKKwkJCSAgICB1MzIgbGVuLCB1OCB3YikKIHsKIAl1MzIgYnVmX2xlbiA9ICgoKGxlbio0KSA+IEZXX0JVRl9TSVpFKSA/IEZXX0JVRl9TSVpFIDogKGxlbio0KSk7CiAJdTMyIGJ1Zl9sZW4zMiA9IGJ1Zl9sZW4vNDsKQEAgLTU3LDEyICs5MSwyMCBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gYnVmX2xlbjMyKSB7CiAJCXUzMiBjdXJfbGVuID0gbWluKGJ1Zl9sZW4zMiwgbGVuIC0gaSk7CiAKLQkJYm54Mnhfd3JpdGVfYmlnX2J1ZihicCwgYWRkciArIGkqNCwgY3VyX2xlbik7CisJCWJueDJ4X3dyaXRlX2JpZ19idWYoYnAsIGFkZHIgKyBpKjQsIGN1cl9sZW4sIHdiKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJ4X2luaXRfd3JfNjQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGFkZHIsIGNvbnN0IHUzMiAqZGF0YSwKLQkJCSAgICAgdTMyIGxlbjY0KQorc3RhdGljIHZvaWQgYm54Mnhfd3JpdGVfYmlnX2J1Zl93YihzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYWRkciwgdTMyIGxlbikKK3sKKwlpZiAoYnAtPmRtYWVfcmVhZHkpCisJCWJueDJ4X3dyaXRlX2RtYWVfcGh5c19sZW4oYnAsIEdVTlpJUF9QSFlTKGJwKSwgYWRkciwgbGVuKTsKKwllbHNlCisJCWJueDJ4X2luaXRfaW5kX3dyKGJwLCBhZGRyLCBHVU5aSVBfQlVGKGJwKSwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfaW5pdF93cl82NChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYWRkciwKKwkJCSAgICAgY29uc3QgdTMyICpkYXRhLCB1MzIgbGVuNjQpCiB7CiAJdTMyIGJ1Zl9sZW4zMiA9IEZXX0JVRl9TSVpFLzQ7CiAJdTMyIGxlbiA9IGxlbjY0KjI7CkBAIC04Miw3ICsxMjQsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gYnVmX2xlbjMyKSB7CiAJCXUzMiBjdXJfbGVuID0gbWluKGJ1Zl9sZW4zMiwgbGVuIC0gaSk7CiAKLQkJYm54Mnhfd3JpdGVfYmlnX2J1ZihicCwgYWRkciArIGkqNCwgY3VyX2xlbik7CisJCWJueDJ4X3dyaXRlX2JpZ19idWZfd2IoYnAsIGFkZHIgKyBpKjQsIGN1cl9sZW4pOwogCX0KIH0KIApAQCAtMTAwLDcgKzE0Miw4IEBACiAjZGVmaW5lIElGX0lTX1BSQU1fQUREUihiYXNlLCBhZGRyKSBcCiAJCQlpZiAoKChiYXNlKSA8PSAoYWRkcikpICYmICgoYmFzZSkgKyAweDQwMDAwID49IChhZGRyKSkpCiAKLXN0YXRpYyBjb25zdCB1OCAqYm54Mnhfc2VsX2Jsb2Ioc3RydWN0IGJueDJ4ICpicCwgdTMyIGFkZHIsIGNvbnN0IHU4ICpkYXRhKQorc3RhdGljIGNvbnN0IHU4ICpibngyeF9zZWxfYmxvYihzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYWRkciwKKwkJCQljb25zdCB1OCAqZGF0YSkKIHsKIAlJRl9JU19JTlRfVEFCTEVfQUREUihUU0VNX1JFR19JTlRfVEFCTEUsIGFkZHIpCiAJCWRhdGEgPSBJTklUX1RTRU1fSU5UX1RBQkxFX0RBVEEoYnApOwpAQCAtMTI5LDMxICsxNzIsMTcgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAotc3RhdGljIHZvaWQgYm54Mnhfd3JpdGVfYmlnX2J1Zl93YihzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYWRkciwgdTMyIGxlbikKK3N0YXRpYyB2b2lkIGJueDJ4X2luaXRfd3Jfd2Ioc3RydWN0IGJueDJ4ICpicCwgdTMyIGFkZHIsCisJCQkgICAgIGNvbnN0IHUzMiAqZGF0YSwgdTMyIGxlbikKIHsKIAlpZiAoYnAtPmRtYWVfcmVhZHkpCi0JCWJueDJ4X3dyaXRlX2RtYWVfcGh5c19sZW4oYnAsIEdVTlpJUF9QSFlTKGJwKSwgYWRkciwgbGVuKTsKKwkJVklSVF9XUl9ETUFFX0xFTihicCwgZGF0YSwgYWRkciwgbGVuLCAwKTsKIAllbHNlCi0JCWJueDJ4X2luaXRfaW5kX3dyKGJwLCBhZGRyLCBHVU5aSVBfQlVGKGJwKSwgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgYm54MnhfaW5pdF93cl93YihzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYWRkciwgY29uc3QgdTMyICpkYXRhLAotCQkJICAgICB1MzIgbGVuKQotewotCWNvbnN0IHUzMiAqb2xkX2RhdGEgPSBkYXRhOwotCi0JZGF0YSA9IChjb25zdCB1MzIgKilibngyeF9zZWxfYmxvYihicCwgYWRkciwgKGNvbnN0IHU4ICopZGF0YSk7Ci0KLQlpZiAoYnAtPmRtYWVfcmVhZHkpIHsKLQkJaWYgKG9sZF9kYXRhICE9IGRhdGEpCi0JCQlWSVJUX1dSX0RNQUVfTEVOKGJwLCBkYXRhLCBhZGRyLCBsZW4sIDEpOwotCQllbHNlCi0JCQlWSVJUX1dSX0RNQUVfTEVOKGJwLCBkYXRhLCBhZGRyLCBsZW4sIDApOwotCX0gZWxzZQogCQlibngyeF9pbml0X2luZF93cihicCwgYWRkciwgZGF0YSwgbGVuKTsKIH0KIAotc3RhdGljIHZvaWQgYm54Mnhfd3JfNjQoc3RydWN0IGJueDJ4ICpicCwgdTMyIHJlZywgdTMyIHZhbF9sbywgdTMyIHZhbF9oaSkKK3N0YXRpYyB2b2lkIGJueDJ4X3dyXzY0KHN0cnVjdCBibngyeCAqYnAsIHUzMiByZWcsIHUzMiB2YWxfbG8sCisJCQl1MzIgdmFsX2hpKQogewogCXUzMiB3Yl93cml0ZVsyXTsKIApAQCAtMTYxLDggKzE5MCw4IEBACiAJd2Jfd3JpdGVbMV0gPSB2YWxfaGk7CiAJUkVHX1dSX0RNQUVfTEVOKGJwLCByZWcsIHdiX3dyaXRlLCAyKTsKIH0KLQotc3RhdGljIHZvaWQgYm54MnhfaW5pdF93cl96cChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYWRkciwgdTMyIGxlbiwgdTMyIGJsb2Jfb2ZmKQorc3RhdGljIHZvaWQgYm54MnhfaW5pdF93cl96cChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYWRkciwgdTMyIGxlbiwKKwkJCSAgICAgdTMyIGJsb2Jfb2ZmKQogewogCWNvbnN0IHU4ICpkYXRhID0gTlVMTDsKIAlpbnQgcmM7CkBAIC0xODYsMzkgKzIxNSwzMyBAQAogc3RhdGljIHZvaWQgYm54MnhfaW5pdF9ibG9jayhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYmxvY2ssIHUzMiBzdGFnZSkKIHsKIAl1MTYgb3Bfc3RhcnQgPQotCQlJTklUX09QU19PRkZTRVRTKGJwKVtCTE9DS19PUFNfSURYKGJsb2NrLCBzdGFnZSwgU1RBR0VfU1RBUlQpXTsKKwkJSU5JVF9PUFNfT0ZGU0VUUyhicClbQkxPQ0tfT1BTX0lEWChibG9jaywgc3RhZ2UsCisJCQkJCQkgICAgIFNUQUdFX1NUQVJUKV07CiAJdTE2IG9wX2VuZCA9Ci0JCUlOSVRfT1BTX09GRlNFVFMoYnApW0JMT0NLX09QU19JRFgoYmxvY2ssIHN0YWdlLCBTVEFHRV9FTkQpXTsKKwkJSU5JVF9PUFNfT0ZGU0VUUyhicClbQkxPQ0tfT1BTX0lEWChibG9jaywgc3RhZ2UsCisJCQkJCQkgICAgIFNUQUdFX0VORCldOwogCXVuaW9uIGluaXRfb3AgKm9wOwotCWludCBod193cjsKLQl1MzIgaSwgb3BfdHlwZSwgYWRkciwgbGVuOworCXUzMiBvcF9pZHgsIG9wX3R5cGUsIGFkZHIsIGxlbjsKIAljb25zdCB1MzIgKmRhdGEsICpkYXRhX2Jhc2U7CiAKIAkvKiBJZiBlbXB0eSBibG9jayAqLwogCWlmIChvcF9zdGFydCA9PSBvcF9lbmQpCiAJCXJldHVybjsKIAotCWlmIChDSElQX1JFVl9JU19GUEdBKGJwKSkKLQkJaHdfd3IgPSBPUF9XUl9GUEdBOwotCWVsc2UgaWYgKENISVBfUkVWX0lTX0VNVUwoYnApKQotCQlod193ciA9IE9QX1dSX0VNVUw7Ci0JZWxzZQotCQlod193ciA9IE9QX1dSX0FTSUM7Ci0KIAlkYXRhX2Jhc2UgPSBJTklUX0RBVEEoYnApOwogCi0JZm9yIChpID0gb3Bfc3RhcnQ7IGkgPCBvcF9lbmQ7IGkrKykgeworCWZvciAob3BfaWR4ID0gb3Bfc3RhcnQ7IG9wX2lkeCA8IG9wX2VuZDsgb3BfaWR4KyspIHsKIAotCQlvcCA9ICh1bmlvbiBpbml0X29wICopJihJTklUX09QUyhicClbaV0pOwotCi0JCW9wX3R5cGUgPSBvcC0+c3RyX3dyLm9wOwotCQlhZGRyID0gb3AtPnN0cl93ci5vZmZzZXQ7Ci0JCWxlbiA9IG9wLT5zdHJfd3IuZGF0YV9sZW47Ci0JCWRhdGEgPSBkYXRhX2Jhc2UgKyBvcC0+c3RyX3dyLmRhdGFfb2ZmOwotCi0JCS8qIEhXL0VNVUwgc3BlY2lmaWMgKi8KLQkJaWYgKChvcF90eXBlID4gT1BfV0IpICYmIChvcF90eXBlID09IGh3X3dyKSkKLQkJCW9wX3R5cGUgPSBPUF9XUjsKKwkJb3AgPSAodW5pb24gaW5pdF9vcCAqKSYoSU5JVF9PUFMoYnApW29wX2lkeF0pOworCQkvKiBHZXQgZ2VuZXJpYyBkYXRhICovCisJCW9wX3R5cGUgPSBvcC0+cmF3Lm9wOworCQlhZGRyID0gb3AtPnJhdy5vZmZzZXQ7CisJCS8qIEdldCBkYXRhIHRoYXQncyB1c2VkIGZvciBPUF9TVywgT1BfV0IsIE9QX0ZXLCBPUF9aUCBhbmQKKwkJICogT1BfV1I2NCAod2UgYXNzdW1lIHRoYXQgb3BfYXJyX3dyaXRlIGFuZCBvcF93cml0ZSBoYXZlIHRoZQorCQkgKiBzYW1lIHN0cnVjdHVyZSkuCisJCSAqLworCQlsZW4gPSBvcC0+YXJyX3dyLmRhdGFfbGVuOworCQlkYXRhID0gZGF0YV9iYXNlICsgb3AtPmFycl93ci5kYXRhX29mZjsKIAogCQlzd2l0Y2ggKG9wX3R5cGUpIHsKIAkJY2FzZSBPUF9SRDoKQEAgLTIzMywyMSArMjU2LDM5IEBACiAJCWNhc2UgT1BfV0I6CiAJCQlibngyeF9pbml0X3dyX3diKGJwLCBhZGRyLCBkYXRhLCBsZW4pOwogCQkJYnJlYWs7Ci0JCWNhc2UgT1BfU0k6Ci0JCQlibngyeF9pbml0X2luZF93cihicCwgYWRkciwgZGF0YSwgbGVuKTsKLQkJCWJyZWFrOwogCQljYXNlIE9QX1pSOgotCQkJYm54MnhfaW5pdF9maWxsKGJwLCBhZGRyLCAwLCBvcC0+emVyby5sZW4pOworCQkJYm54MnhfaW5pdF9maWxsKGJwLCBhZGRyLCAwLCBvcC0+emVyby5sZW4sIDApOworCQkJYnJlYWs7CisJCWNhc2UgT1BfV0JfWlI6CisJCQlibngyeF9pbml0X2ZpbGwoYnAsIGFkZHIsIDAsIG9wLT56ZXJvLmxlbiwgMSk7CiAJCQlicmVhazsKIAkJY2FzZSBPUF9aUDoKIAkJCWJueDJ4X2luaXRfd3JfenAoYnAsIGFkZHIsIGxlbiwKLQkJCQkJIG9wLT5zdHJfd3IuZGF0YV9vZmYpOworCQkJCQkgb3AtPmFycl93ci5kYXRhX29mZik7CiAJCQlicmVhazsKIAkJY2FzZSBPUF9XUl82NDoKIAkJCWJueDJ4X2luaXRfd3JfNjQoYnAsIGFkZHIsIGRhdGEsIGxlbik7CiAJCQlicmVhazsKKwkJY2FzZSBPUF9JRl9NT0RFX0FORDoKKwkJCS8qIGlmIGFueSBvZiB0aGUgZmxhZ3MgZG9lc24ndCBtYXRjaCwgc2tpcCB0aGUKKwkJCSAqIGNvbmRpdGlvbmFsIGJsb2NrLgorCQkJICovCisJCQlpZiAoKElOSVRfTU9ERV9GTEFHUyhicCkgJgorCQkJCW9wLT5pZl9tb2RlLm1vZGVfYml0X21hcCkgIT0KKwkJCQlvcC0+aWZfbW9kZS5tb2RlX2JpdF9tYXApCisJCQkJb3BfaWR4ICs9IG9wLT5pZl9tb2RlLmNtZF9vZmZzZXQ7CisJCQlicmVhazsKKwkJY2FzZSBPUF9JRl9NT0RFX09SOgorCQkJLyogaWYgYWxsIHRoZSBmbGFncyBkb24ndCBtYXRjaCwgc2tpcCB0aGUgY29uZGl0aW9uYWwKKwkJCSAqIGJsb2NrLgorCQkJICovCisJCQlpZiAoKElOSVRfTU9ERV9GTEFHUyhicCkgJgorCQkJCW9wLT5pZl9tb2RlLm1vZGVfYml0X21hcCkgPT0gMCkKKwkJCQlvcF9pZHggKz0gb3AtPmlmX21vZGUuY21kX29mZnNldDsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJLyogaGFwcGVucyB3aGVuZXZlciBhbiBvcCBpcyBvZiBhIGRpZmYgSFcgKi8KKwkJCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSEgKi8KKwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC00MTcsNyArNDU4LDggQEAKIAkJUFhQMl9SRUdfUlFfQldfV1JfVUJPVU5EMzB9CiB9OwogCi1zdGF0aWMgdm9pZCBibngyeF9pbml0X3B4cF9hcmIoc3RydWN0IGJueDJ4ICpicCwgaW50IHJfb3JkZXIsIGludCB3X29yZGVyKQorc3RhdGljIHZvaWQgYm54MnhfaW5pdF9weHBfYXJiKHN0cnVjdCBibngyeCAqYnAsIGludCByX29yZGVyLAorCQkJICAgICAgIGludCB3X29yZGVyKQogewogCXUzMiB2YWwsIGk7CiAKQEAgLTQ5MSwxOSArNTMzLDIxIEBACiAJaWYgKChDSElQX0lTX0UxKGJwKSB8fCBDSElQX0lTX0UxSChicCkpICYmIChyX29yZGVyID09IE1BWF9SRF9PUkQpKQogCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX1BEUl9MSU1JVCwgMHhlMDApOwogCi0JaWYgKENISVBfSVNfRTIoYnApKQorCWlmIChDSElQX0lTX0UzKGJwKSkKKwkJUkVHX1dSKGJwLCBQWFAyX1JFR19XUl9VU0RNRFBfVEgsICgweDQgPDwgd19vcmRlcikpOworCWVsc2UgaWYgKENISVBfSVNfRTIoYnApKQogCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1dSX1VTRE1EUF9USCwgKDB4OCA8PCB3X29yZGVyKSk7CiAJZWxzZQogCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1dSX1VTRE1EUF9USCwgKDB4MTggPDwgd19vcmRlcikpOwogCi0JaWYgKENISVBfSVNfRTFIKGJwKSB8fCBDSElQX0lTX0UyKGJwKSkgeworCWlmICghQ0hJUF9JU19FMShicCkpIHsKIAkJLyogICAgTVBTICAgICAgd19vcmRlciAgICAgb3B0aW1hbCBUSCAgICAgIHByZXNlbnRseSBUSAogCQkgKiAgICAxMjggICAgICAgICAwICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAyCiAJCSAqICAgIDI1NiAgICAgICAgIDEgICAgICAgICAgICAgMSAgICAgICAgICAgICAgIDMKIAkJICogICAgPj01MTIgICAgICAgMiAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMwogCQkgKi8KIAkJLyogRE1BRSBpcyBzcGVjaWFsICovCi0JCWlmIChDSElQX0lTX0UyKGJwKSkgeworCQlpZiAoIUNISVBfSVNfRTFIKGJwKSkgewogCQkJLyogRTIgY2FuIHVzZSBvcHRpbWFsIFRIICovCiAJCQl2YWwgPSB3X29yZGVyOwogCQkJUkVHX1dSKGJwLCBQWFAyX1JFR19XUl9ETUFFX01QUywgdmFsKTsKQEAgLTU1Nyw4ICs2MDEsOCBAQAogI2RlZmluZSBJTFRfQUREUjIoeCkJCSgodTMyKSgoMSA8PCAyMCkgfCAoKHU2NCl4ID4+IDQ0KSkpCiAjZGVmaW5lIElMVF9SQU5HRShmLCBsKQkJKCgobCkgPDwgMTApIHwgZikKIAotc3RhdGljIGludCBibngyeF9pbHRfbGluZV9tZW1fb3Aoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGlsdF9saW5lICpsaW5lLAotCQkJCSB1MzIgc2l6ZSwgdTggbWVtb3ApCitzdGF0aWMgaW50IGJueDJ4X2lsdF9saW5lX21lbV9vcChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSBzdHJ1Y3QgaWx0X2xpbmUgKmxpbmUsIHUzMiBzaXplLCB1OCBtZW1vcCkKIHsKIAlpZiAobWVtb3AgPT0gSUxUX01FTU9QX0ZSRUUpIHsKIAkJQk5YMlhfSUxUX0ZSRUUobGluZS0+cGFnZSwgbGluZS0+cGFnZV9tYXBwaW5nLCBsaW5lLT5zaXplKTsKQEAgLTU3Miw3ICs2MTYsOCBAQAogfQogCiAKLXN0YXRpYyBpbnQgYm54MnhfaWx0X2NsaWVudF9tZW1fb3Aoc3RydWN0IGJueDJ4ICpicCwgaW50IGNsaV9udW0sIHU4IG1lbW9wKQorc3RhdGljIGludCBibngyeF9pbHRfY2xpZW50X21lbV9vcChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY2xpX251bSwKKwkJCQkgICB1OCBtZW1vcCkKIHsKIAlpbnQgaSwgcmM7CiAJc3RydWN0IGJueDJ4X2lsdCAqaWx0ID0gQlBfSUxUKGJwKTsKQEAgLTYxNyw4ICs2NjIsOCBAQAogCWJueDJ4X3dyXzY0KGJwLCByZWcsIElMVF9BRERSMShwYWdlX21hcHBpbmcpLCBJTFRfQUREUjIocGFnZV9tYXBwaW5nKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJ4X2lsdF9saW5lX2luaXRfb3Aoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2lsdCAqaWx0LAotCQkJCSAgIGludCBpZHgsIHU4IGluaXRvcCkKK3N0YXRpYyB2b2lkIGJueDJ4X2lsdF9saW5lX2luaXRfb3Aoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICBzdHJ1Y3QgYm54MnhfaWx0ICppbHQsIGludCBpZHgsIHU4IGluaXRvcCkKIHsKIAlkbWFfYWRkcl90CW51bGxfbWFwcGluZzsKIAlpbnQgYWJzX2lkeCA9IGlsdC0+c3RhcnRfbGluZSArIGlkeDsKQEAgLTczMyw3ICs3NzgsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBibngyeF9pbHRfaW5pdF9jbGllbnRfcHN6KHN0cnVjdCBibngyeCAqYnAsIGludCBjbGlfbnVtLAotCQkJCQkgICAgdTMyIHBzel9yZWcsIHU4IGluaXRvcCkKKwkJCQkgICAgICB1MzIgcHN6X3JlZywgdTggaW5pdG9wKQogewogCXN0cnVjdCBibngyeF9pbHQgKmlsdCA9IEJQX0lMVChicCk7CiAJc3RydWN0IGlsdF9jbGllbnRfaW5mbyAqaWx0X2NsaSA9ICZpbHQtPmNsaWVudHNbY2xpX251bV07CkBAIC04NDgsNyArODkzLDggQEAKIAogCS8qIEluaXRpYWxpemUgVDIgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc3JjX2NpZF9jb3VudC0xOyBpKyspCi0JCXQyW2ldLm5leHQgPSAodTY0KSh0Ml9tYXBwaW5nICsgKGkrMSkqc2l6ZW9mKHN0cnVjdCBzcmNfZW50KSk7CisJCXQyW2ldLm5leHQgPSAodTY0KSh0Ml9tYXBwaW5nICsKKwkJCSAgICAgKGkrMSkqc2l6ZW9mKHN0cnVjdCBzcmNfZW50KSk7CiAKIAkvKiB0ZWxsIHRoZSBzZWFyY2hlciB3aGVyZSB0aGUgVDIgdGFibGUgaXMgKi8KIAlSRUdfV1IoYnAsIFNSQ19SRUdfQ09VTlRGUkVFMCArIHBvcnQqNCwgc3JjX2NpZF9jb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9saW5rLmMgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9saW5rLmMKaW5kZXggMDc2ZTExZi4uYmNkOGYwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfbGluay5jCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2xpbmsuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlICJibngyeC5oIgorI2luY2x1ZGUgImJueDJ4X2Ntbi5oIgorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgRVRIX0hMRU4JCQkxNApAQCAtMzUsNiArMzcsMTMgQEAKICNkZWZpbmUgRVRIX01BWF9KVU1CT19QQUNLRVRfU0laRQk5NjAwCiAjZGVmaW5lIE1ESU9fQUNDRVNTX1RJTUVPVVQJCTEwMDAKICNkZWZpbmUgQk1BQ19DT05UUk9MX1JYX0VOQUJMRQkJMgorI2RlZmluZSBXQ19MQU5FX01BWAkJCTQKKyNkZWZpbmUgSTJDX1NXSVRDSF9XSURUSAkJMgorI2RlZmluZSBJMkNfQlNDMAkJCTAKKyNkZWZpbmUgSTJDX0JTQzEJCQkxCisjZGVmaW5lIEkyQ19XQV9SRVRSWV9DTlQJCTMKKyNkZWZpbmUgTUNQUl9JTUNfQ09NTUFORF9SRUFEX09QCTEKKyNkZWZpbmUgTUNQUl9JTUNfQ09NTUFORF9XUklURV9PUAkyCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCQkJU2hvcnRjdXQgZGVmaW5pdGlvbnMJCSAgICovCkBAIC0xMDMsMTYgKzExMiwxMyBAQAogCQkJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzEwR19ISUcKICNkZWZpbmUgR1BfU1RBVFVTXzEwR19DWDQgXAogCQkJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzEwR19DWDQKLSNkZWZpbmUgR1BfU1RBVFVTXzEyR19ISUcgXAotCQkJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzEyR19ISUcKLSNkZWZpbmUgR1BfU1RBVFVTXzEyXzVHIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xMl81RwotI2RlZmluZSBHUF9TVEFUVVNfMTNHCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xM0cKLSNkZWZpbmUgR1BfU1RBVFVTXzE1RwlNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMTVHCi0jZGVmaW5lIEdQX1NUQVRVU18xNkcJTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzE2RwogI2RlZmluZSBHUF9TVEFUVVNfMUdfS1ggTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzFHX0tYCiAjZGVmaW5lIEdQX1NUQVRVU18xMEdfS1g0IFwKIAkJCU1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xMEdfS1g0Ci0KKyNkZWZpbmUJR1BfU1RBVFVTXzEwR19LUiBNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMTBHX0tSCisjZGVmaW5lCUdQX1NUQVRVU18xMEdfWEZJICAgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzEwR19YRkkKKyNkZWZpbmUJR1BfU1RBVFVTXzIwR19EWEdYUyBNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMjBHX0RYR1hTCisjZGVmaW5lCUdQX1NUQVRVU18xMEdfU0ZJICAgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzEwR19TRkkKICNkZWZpbmUgTElOS18xMFRIRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMFRIRAogI2RlZmluZSBMSU5LXzEwVEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEwVEZECiAjZGVmaW5lIExJTktfMTAwVFhIRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMDBUWEhECkBAIC0xMjYsMjAgKzEzMiwxMCBAQAogI2RlZmluZSBMSU5LXzI1MDBYRkQJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMjUwMFhGRAogI2RlZmluZSBMSU5LXzEwR1RGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMEdURkQKICNkZWZpbmUgTElOS18xMEdYRkQJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTBHWEZECi0jZGVmaW5lIExJTktfMTJHVEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEyR1RGRAotI2RlZmluZSBMSU5LXzEyR1hGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMkdYRkQKLSNkZWZpbmUgTElOS18xMl81R1RGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xMl81R1RGRAotI2RlZmluZSBMSU5LXzEyXzVHWEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEyXzVHWEZECi0jZGVmaW5lIExJTktfMTNHVEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzEzR1RGRAotI2RlZmluZSBMSU5LXzEzR1hGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xM0dYRkQKLSNkZWZpbmUgTElOS18xNUdURkQJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTVHVEZECi0jZGVmaW5lIExJTktfMTVHWEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzE1R1hGRAotI2RlZmluZSBMSU5LXzE2R1RGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8xNkdURkQKLSNkZWZpbmUgTElOS18xNkdYRkQJCUxJTktfU1RBVFVTX1NQRUVEX0FORF9EVVBMRVhfMTZHWEZECisjZGVmaW5lIExJTktfMjBHVEZECQlMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYXzIwR1RGRAorI2RlZmluZSBMSU5LXzIwR1hGRAkJTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF8yMEdYRkQKIAotI2RlZmluZSBQSFlfWEdYU19GTEFHCQkJMHgxCi0jZGVmaW5lIFBIWV9TR01JSV9GTEFHCQkJMHgyCi0jZGVmaW5lIFBIWV9TRVJERVNfRkxBRwkJCTB4NAorCiAKIC8qICovCiAjZGVmaW5lIFNGUF9FRVBST01fQ09OX1RZUEVfQUREUgkJMHgyCkBAIC0xNjUsOCArMTYxLDEwNCBAQAogI2RlZmluZSBFRENfTU9ERV9QQVNTSVZFX0RBQwkJCTB4MDA1NQogCiAKKy8qIEJSQiB0aHJlc2hvbGRzIGZvciBFMiovCisjZGVmaW5lIFBGQ19FMl9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX1BBVVNFCQkxNzAKKyNkZWZpbmUgUEZDX0UyX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfTk9OX1BBVVNFCQkwCisKKyNkZWZpbmUgUEZDX0UyX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9QQVVTRQkJMjUwCisjZGVmaW5lIFBGQ19FMl9CUkJfTUFDX1BBVVNFX1hPTl9USFJfTk9OX1BBVVNFCQkwCisKKyNkZWZpbmUgUEZDX0UyX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9QQVVTRQkJMTAKKyNkZWZpbmUgUEZDX0UyX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9OT05fUEFVU0UJCTkwCisKKyNkZWZpbmUgUEZDX0UyX0JSQl9NQUNfRlVMTF9YT05fVEhSX1BBVVNFCQkJNTAKKyNkZWZpbmUgUEZDX0UyX0JSQl9NQUNfRlVMTF9YT05fVEhSX05PTl9QQVVTRQkJMjUwCisKKy8qIEJSQiB0aHJlc2hvbGRzIGZvciBFM0EwICovCisjZGVmaW5lIFBGQ19FM0EwX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfUEFVU0UJCTI5MAorI2RlZmluZSBQRkNfRTNBMF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX05PTl9QQVVTRQkJMAorCisjZGVmaW5lIFBGQ19FM0EwX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9QQVVTRQkJNDEwCisjZGVmaW5lIFBGQ19FM0EwX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9OT05fUEFVU0UJCTAKKworI2RlZmluZSBQRkNfRTNBMF9CUkJfTUFDX0ZVTExfWE9GRl9USFJfUEFVU0UJCTEwCisjZGVmaW5lIFBGQ19FM0EwX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9OT05fUEFVU0UJCTE3MAorCisjZGVmaW5lIFBGQ19FM0EwX0JSQl9NQUNfRlVMTF9YT05fVEhSX1BBVVNFCQk1MAorI2RlZmluZSBQRkNfRTNBMF9CUkJfTUFDX0ZVTExfWE9OX1RIUl9OT05fUEFVU0UJCTQxMAorCisKKy8qIEJSQiB0aHJlc2hvbGRzIGZvciBFM0IwIDIgcG9ydCBtb2RlKi8KKyNkZWZpbmUgUEZDX0UzQjBfMlBfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUl9QQVVTRQkJMTAyNQorI2RlZmluZSBQRkNfRTNCMF8yUF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX05PTl9QQVVTRQkwCisKKyNkZWZpbmUgUEZDX0UzQjBfMlBfQlJCX01BQ19QQVVTRV9YT05fVEhSX1BBVVNFCQkxMDI1CisjZGVmaW5lIFBGQ19FM0IwXzJQX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9OT05fUEFVU0UJMAorCisjZGVmaW5lIFBGQ19FM0IwXzJQX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9QQVVTRQkJMTAKKyNkZWZpbmUgUEZDX0UzQjBfMlBfQlJCX01BQ19GVUxMX1hPRkZfVEhSX05PTl9QQVVTRQkxMDI1CisKKyNkZWZpbmUgUEZDX0UzQjBfMlBfQlJCX01BQ19GVUxMX1hPTl9USFJfUEFVU0UJCTUwCisjZGVmaW5lIFBGQ19FM0IwXzJQX0JSQl9NQUNfRlVMTF9YT05fVEhSX05PTl9QQVVTRQkxMDI1CisKKy8qIG9ubHkgZm9yIEUzQjAqLworI2RlZmluZSBQRkNfRTNCMF8yUF9CUkJfRlVMTF9MQl9YT0ZGX1RIUgkJCTEwMjUKKyNkZWZpbmUgUEZDX0UzQjBfMlBfQlJCX0ZVTExfTEJfWE9OX1RIUgkJCTEwMjUKKworLyogTG9zc3kgK0xvc3NsZXNzIEdVQVJBTlRJRUQgPT0gR1VBUlQgKi8KKyNkZWZpbmUgUEZDX0UzQjBfMlBfTUlYX1BBVVNFX0xCX0dVQVJUCQkJMjg0CisvKiBMb3NzbGVzcyArTG9zc2xlc3MqLworI2RlZmluZSBQRkNfRTNCMF8yUF9QQVVTRV9MQl9HVUFSVAkJCTIzNgorLyogTG9zc3kgK0xvc3N5Ki8KKyNkZWZpbmUgUEZDX0UzQjBfMlBfTk9OX1BBVVNFX0xCX0dVQVJUCQkJMzQyCisKKy8qIExvc3N5ICtMb3NzbGVzcyovCisjZGVmaW5lIFBGQ19FM0IwXzJQX01JWF9QQVVTRV9NQUNfMF9DTEFTU19UX0dVQVJUCQkyODQKKy8qIExvc3NsZXNzICtMb3NzbGVzcyovCisjZGVmaW5lIFBGQ19FM0IwXzJQX1BBVVNFX01BQ18wX0NMQVNTX1RfR1VBUlQJCTIzNgorLyogTG9zc3kgK0xvc3N5Ki8KKyNkZWZpbmUgUEZDX0UzQjBfMlBfTk9OX1BBVVNFX01BQ18wX0NMQVNTX1RfR1VBUlQJCTMzNgorI2RlZmluZSBQRkNfRTNCMF8yUF9CUkJfTUFDXzBfQ0xBU1NfVF9HVUFSVF9IWVNUCQk4MAorCisjZGVmaW5lIFBGQ19FM0IwXzJQX0JSQl9NQUNfMV9DTEFTU19UX0dVQVJUCQkwCisjZGVmaW5lIFBGQ19FM0IwXzJQX0JSQl9NQUNfMV9DTEFTU19UX0dVQVJUX0hZU1QJCTAKKworLyogQlJCIHRocmVzaG9sZHMgZm9yIEUzQjAgNCBwb3J0IG1vZGUgKi8KKyNkZWZpbmUgUEZDX0UzQjBfNFBfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUl9QQVVTRQkJMzA0CisjZGVmaW5lIFBGQ19FM0IwXzRQX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfTk9OX1BBVVNFCTAKKworI2RlZmluZSBQRkNfRTNCMF80UF9CUkJfTUFDX1BBVVNFX1hPTl9USFJfUEFVU0UJCTM4NAorI2RlZmluZSBQRkNfRTNCMF80UF9CUkJfTUFDX1BBVVNFX1hPTl9USFJfTk9OX1BBVVNFCTAKKworI2RlZmluZSBQRkNfRTNCMF80UF9CUkJfTUFDX0ZVTExfWE9GRl9USFJfUEFVU0UJCTEwCisjZGVmaW5lIFBGQ19FM0IwXzRQX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9OT05fUEFVU0UJMzA0CisKKyNkZWZpbmUgUEZDX0UzQjBfNFBfQlJCX01BQ19GVUxMX1hPTl9USFJfUEFVU0UJCTUwCisjZGVmaW5lIFBGQ19FM0IwXzRQX0JSQl9NQUNfRlVMTF9YT05fVEhSX05PTl9QQVVTRQkzODQKKworCisvKiBvbmx5IGZvciBFM0IwKi8KKyNkZWZpbmUgUEZDX0UzQjBfNFBfQlJCX0ZVTExfTEJfWE9GRl9USFIJCQkzMDQKKyNkZWZpbmUgUEZDX0UzQjBfNFBfQlJCX0ZVTExfTEJfWE9OX1RIUgkJCTM4NAorI2RlZmluZSBQRkNfRTNCMF80UF9MQl9HVUFSVAkJCQkxMjAKKworI2RlZmluZSBQRkNfRTNCMF80UF9CUkJfTUFDXzBfQ0xBU1NfVF9HVUFSVAkJMTIwCisjZGVmaW5lIFBGQ19FM0IwXzRQX0JSQl9NQUNfMF9DTEFTU19UX0dVQVJUX0hZU1QJCTgwCisKKyNkZWZpbmUgUEZDX0UzQjBfNFBfQlJCX01BQ18xX0NMQVNTX1RfR1VBUlQJCTgwCisjZGVmaW5lIFBGQ19FM0IwXzRQX0JSQl9NQUNfMV9DTEFTU19UX0dVQVJUX0hZU1QJCTEyMAorCisjZGVmaW5lIERDQlhfSU5WQUxJRF9DT1MJCQkJCSgweEZGKQorCiAjZGVmaW5lIEVUU19CV19MSU1JVF9DUkVESVRfVVBQRVJfQk9VTkQJCSgweDUwMDApCiAjZGVmaW5lIEVUU19CV19MSU1JVF9DUkVESVRfV0VJR0hUCQkoMHg1MDAwKQorI2RlZmluZSBFVFNfRTNCMF9OSUdfTUlOX1dfVkFMX1VQX1RPXzEwR0JQUwkJKDEzNjApCisjZGVmaW5lIEVUU19FM0IwX05JR19NSU5fV19WQUxfMjBHQlBTCQkJKDI3MjApCisjZGVmaW5lIEVUU19FM0IwX1BCRl9NSU5fV19WQUwJCQkJKDEwMDAwKQorCisjZGVmaW5lIE1BWF9QQUNLRVRfU0laRQkJCQkJKDk3MDApCisjZGVmaW5lIFdDX1VDX1RJTUVPVVQJCQkJCTEwMAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMDIsMTQgKzI5NCw4NiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQlFUElPL0dQSU8gc2VjdGlvbgkJCSAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBibngyeF9nZXRfZXBpbyhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgZXBpb19waW4sIHUzMiAqZW4pCit7CisJdTMyIGVwaW9fbWFzaywgZ3Bfb2VuYWJsZTsKKwkqZW4gPSAwOworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChlcGlvX3BpbiA+IDMxKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiSW52YWxpZCBFUElPIHBpbiAlZCB0byBnZXRcbiIsIGVwaW9fcGluKTsKKwkJcmV0dXJuOworCX0KKworCWVwaW9fbWFzayA9IDEgPDwgZXBpb19waW47CisJLyogU2V0IHRoaXMgRVBJTyB0byBvdXRwdXQgKi8KKwlncF9vZW5hYmxlID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfR1BfT0VOQUJMRSk7CisJUkVHX1dSKGJwLCBNQ1BfUkVHX01DUFJfR1BfT0VOQUJMRSwgZ3Bfb2VuYWJsZSAmIH5lcGlvX21hc2spOworCisJKmVuID0gKFJFR19SRChicCwgTUNQX1JFR19NQ1BSX0dQX0lOUFVUUykgJiBlcGlvX21hc2spID4+IGVwaW9fcGluOworfQorc3RhdGljIHZvaWQgYm54Mnhfc2V0X2VwaW8oc3RydWN0IGJueDJ4ICpicCwgdTMyIGVwaW9fcGluLCB1MzIgZW4pCit7CisJdTMyIGVwaW9fbWFzaywgZ3Bfb3V0cHV0LCBncF9vZW5hYmxlOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKGVwaW9fcGluID4gMzEpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJJbnZhbGlkIEVQSU8gcGluICVkIHRvIHNldFxuIiwgZXBpb19waW4pOworCQlyZXR1cm47CisJfQorCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyBFUElPIHBpbiAlZCB0byAlZFxuIiwgZXBpb19waW4sIGVuKTsKKwllcGlvX21hc2sgPSAxIDw8IGVwaW9fcGluOworCS8qIFNldCB0aGlzIEVQSU8gdG8gb3V0cHV0ICovCisJZ3Bfb3V0cHV0ID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfR1BfT1VUUFVUUyk7CisJaWYgKGVuKQorCQlncF9vdXRwdXQgfD0gZXBpb19tYXNrOworCWVsc2UKKwkJZ3Bfb3V0cHV0ICY9IH5lcGlvX21hc2s7CisKKwlSRUdfV1IoYnAsIE1DUF9SRUdfTUNQUl9HUF9PVVRQVVRTLCBncF9vdXRwdXQpOworCisJLyogU2V0IHRoZSB2YWx1ZSBmb3IgdGhpcyBFUElPICovCisJZ3Bfb2VuYWJsZSA9IFJFR19SRChicCwgTUNQX1JFR19NQ1BSX0dQX09FTkFCTEUpOworCVJFR19XUihicCwgTUNQX1JFR19NQ1BSX0dQX09FTkFCTEUsIGdwX29lbmFibGUgfCBlcGlvX21hc2spOworfQorCitzdGF0aWMgdm9pZCBibngyeF9zZXRfY2ZnX3BpbihzdHJ1Y3QgYm54MnggKmJwLCB1MzIgcGluX2NmZywgdTMyIHZhbCkKK3sKKwlpZiAocGluX2NmZyA9PSBQSU5fQ0ZHX05BKQorCQlyZXR1cm47CisJaWYgKHBpbl9jZmcgPj0gUElOX0NGR19FUElPMCkgeworCQlibngyeF9zZXRfZXBpbyhicCwgcGluX2NmZyAtIFBJTl9DRkdfRVBJTzAsIHZhbCk7CisJfSBlbHNlIHsKKwkJdTggZ3Bpb19udW0gPSAocGluX2NmZyAtIFBJTl9DRkdfR1BJTzBfUDApICYgMHgzOworCQl1OCBncGlvX3BvcnQgPSAocGluX2NmZyAtIFBJTl9DRkdfR1BJTzBfUDApID4+IDI7CisJCWJueDJ4X3NldF9ncGlvKGJwLCBncGlvX251bSwgKHU4KXZhbCwgZ3Bpb19wb3J0KTsKKwl9Cit9CisKK3N0YXRpYyB1MzIgYm54MnhfZ2V0X2NmZ19waW4oc3RydWN0IGJueDJ4ICpicCwgdTMyIHBpbl9jZmcsIHUzMiAqdmFsKQoreworCWlmIChwaW5fY2ZnID09IFBJTl9DRkdfTkEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwaW5fY2ZnID49IFBJTl9DRkdfRVBJTzApIHsKKwkJYm54MnhfZ2V0X2VwaW8oYnAsIHBpbl9jZmcgLSBQSU5fQ0ZHX0VQSU8wLCB2YWwpOworCX0gZWxzZSB7CisJCXU4IGdwaW9fbnVtID0gKHBpbl9jZmcgLSBQSU5fQ0ZHX0dQSU8wX1AwKSAmIDB4MzsKKwkJdTggZ3Bpb19wb3J0ID0gKHBpbl9jZmcgLSBQSU5fQ0ZHX0dQSU8wX1AwKSA+PiAyOworCQkqdmFsID0gYm54MnhfZ2V0X2dwaW8oYnAsIGdwaW9fbnVtLCBncGlvX3BvcnQpOworCX0KKwlyZXR1cm4gMDsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCQkJCUVUUyBzZWN0aW9uCQkJICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYm54MnhfZXRzX2Rpc2FibGVkKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQorc3RhdGljIHZvaWQgYm54MnhfZXRzX2UyZTNhMF9kaXNhYmxlZChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKIHsKIAkvKiBFVFMgZGlzYWJsZWQgY29uZmlndXJhdGlvbiovCiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAKLQlEUChORVRJRl9NU0dfTElOSywgIkVUUyBkaXNhYmxlZCBjb25maWd1cmF0aW9uXG4iKTsKKwlEUChORVRJRl9NU0dfTElOSywgIkVUUyBFMkUzIGRpc2FibGVkIGNvbmZpZ3VyYXRpb25cbiIpOwogCiAJLyoKIAkgKiBtYXBwaW5nIGJldHdlZW4gZW50cnkgIHByaW9yaXR5IHRvIGNsaWVudCBudW1iZXIgKDAsMSwyIC1kZWJ1ZyBhbmQKQEAgLTI2Miw3ICs0MjYsNzU2IEBACiAJLyogRGVmaW5lcyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHNsb3RzIGZvciB0aGUgc3RyaWN0IHByaW9yaXR5ICovCiAJUkVHX1dSKGJwLCBQQkZfUkVHX05VTV9TVFJJQ1RfQVJCX1NMT1RTLCAwKTsKIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGVzY3JpcHRpb246CisqCUdldHRpbmcgbWluX3dfdmFsIHdpbGwgYmUgc2V0IGFjY29yZGluZyB0byBsaW5lIHNwZWVkIC4KKyouCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTMyIGJueDJ4X2V0c19nZXRfbWluX3dfdmFsX25pZyhjb25zdCBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCXUzMiBtaW5fd192YWwgPSAwOworCS8qIENhbGN1bGF0ZSBtaW5fd192YWwuKi8KKwlpZiAodmFycy0+bGlua191cCkgeworCQlpZiAoU1BFRURfMjAwMDAgPT0gdmFycy0+bGluZV9zcGVlZCkKKwkJCW1pbl93X3ZhbCA9IEVUU19FM0IwX05JR19NSU5fV19WQUxfMjBHQlBTOworCQllbHNlCisJCQltaW5fd192YWwgPSBFVFNfRTNCMF9OSUdfTUlOX1dfVkFMX1VQX1RPXzEwR0JQUzsKKwl9IGVsc2UKKwkJbWluX3dfdmFsID0gRVRTX0UzQjBfTklHX01JTl9XX1ZBTF8yMEdCUFM7CisJLyoqCisJICogIElmIHRoZSBsaW5rIGlzbid0IHVwIChzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgZXhhbXBsZSApIFRoZQorCSAqICBsaW5rIHdpbGwgYmUgYWNjb3JkaW5nIHRvIDIwR0JQUy4KKwkqLworCXJldHVybiBtaW5fd192YWw7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0aW9uOgorKglHZXR0aW5nIGNyZWRpdCB1cHBlciBib3VuZCBmb3JtIG1pbl93X3ZhbC4KKyouCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTMyIGJueDJ4X2V0c19nZXRfY3JlZGl0X3VwcGVyX2JvdW5kKGNvbnN0IHUzMiBtaW5fd192YWwpCit7CisJY29uc3QgdTMyIGNyZWRpdF91cHBlcl9ib3VuZCA9ICh1MzIpTUFYVkFMKCgxNTAgKiBtaW5fd192YWwpLAorCQkJCQkJTUFYX1BBQ0tFVF9TSVpFKTsKKwlyZXR1cm4gY3JlZGl0X3VwcGVyX2JvdW5kOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEZXNjcmlwdGlvbjoKKyoJU2V0IGNyZWRpdCB1cHBlciBib3VuZCBmb3IgTklHLgorKi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJueDJ4X2V0c19lM2IwX3NldF9jcmVkaXRfdXBwZXJfYm91bmRfbmlnKAorCWNvbnN0IHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCWNvbnN0IHUzMiBtaW5fd192YWwpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJY29uc3QgdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwljb25zdCB1MzIgY3JlZGl0X3VwcGVyX2JvdW5kID0KKwkgICAgYm54MnhfZXRzX2dldF9jcmVkaXRfdXBwZXJfYm91bmQobWluX3dfdmFsKTsKIAorCVJFR19XUihicCwgKHBvcnQpID8gTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1VQUEVSX0JPVU5EXzAgOgorCQlOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfMCwgY3JlZGl0X3VwcGVyX2JvdW5kKTsKKwlSRUdfV1IoYnAsIChwb3J0KSA/IE5JR19SRUdfUDFfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF8xIDoKKwkJICAgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1VQUEVSX0JPVU5EXzEsIGNyZWRpdF91cHBlcl9ib3VuZCk7CisJUkVHX1dSKGJwLCAocG9ydCkgPyBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfMiA6CisJCSAgIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF8yLCBjcmVkaXRfdXBwZXJfYm91bmQpOworCVJFR19XUihicCwgKHBvcnQpID8gTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1VQUEVSX0JPVU5EXzMgOgorCQkgICBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfMywgY3JlZGl0X3VwcGVyX2JvdW5kKTsKKwlSRUdfV1IoYnAsIChwb3J0KSA/IE5JR19SRUdfUDFfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF80IDoKKwkJICAgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1VQUEVSX0JPVU5EXzQsIGNyZWRpdF91cHBlcl9ib3VuZCk7CisJUkVHX1dSKGJwLCAocG9ydCkgPyBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfNSA6CisJCSAgIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF81LCBjcmVkaXRfdXBwZXJfYm91bmQpOworCisJaWYgKDAgPT0gcG9ydCkgeworCQlSRUdfV1IoYnAsIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF82LAorCQkJY3JlZGl0X3VwcGVyX2JvdW5kKTsKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfNywKKwkJCWNyZWRpdF91cHBlcl9ib3VuZCk7CisJCVJFR19XUihicCwgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1VQUEVSX0JPVU5EXzgsCisJCQljcmVkaXRfdXBwZXJfYm91bmQpOworCX0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGVzY3JpcHRpb246CisqCVdpbGwgcmV0dXJuIHRoZSBOSUcgRVRTIHJlZ2lzdGVycyB0byBpbml0IHZhbHVlcy5FeGNlcHQKKyoJY3JlZGl0X3VwcGVyX2JvdW5kLgorKglUaGF0IGlzbid0IHVzZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIChObyBXRlEgaXMgZW5hYmxlZCkgYW5kIHdpbGwgYmUKKyoJY29uZmlndXJlZCBhY29yZGluZyB0byBzcGVjCisqLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYm54MnhfZXRzX2UzYjBfbmlnX2Rpc2FibGVkKGNvbnN0IHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCQljb25zdCBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCWNvbnN0IHU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJY29uc3QgdTMyIG1pbl93X3ZhbCA9IGJueDJ4X2V0c19nZXRfbWluX3dfdmFsX25pZyh2YXJzKTsKKwkvKioKKwkgKiBtYXBwaW5nIGJldHdlZW4gZW50cnkgIHByaW9yaXR5IHRvIGNsaWVudCBudW1iZXIgKDAsMSwyIC1kZWJ1ZyBhbmQKKwkgKiBtYW5hZ2VtZW50IGNsaWVudHMsIDMgLSBDT1MwIGNsaWVudCwgNCAtIENPUzEsIC4uLiA4IC0KKwkgKiBDT1M1KShISUdIRVNUKSA0Yml0cyBjbGllbnQgbnVtLlRPRE9fRVRTIC0gU2hvdWxkIGJlIGRvbmUgYnkKKwkgKiByZXNldCB2YWx1ZSBvciBpbml0IHRvb2wKKwkgKi8KKwlpZiAocG9ydCkgeworCQlSRUdfV1IoYnAsIE5JR19SRUdfUDFfVFhfQVJCX1BSSU9SSVRZX0NMSUVOVDJfTFNCLCAweDU0MzIxMCk7CisJCVJFR19XUihicCwgTklHX1JFR19QMV9UWF9BUkJfUFJJT1JJVFlfQ0xJRU5UMl9NU0IsIDB4MCk7CisJfSBlbHNlIHsKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1AwX1RYX0FSQl9QUklPUklUWV9DTElFTlQyX0xTQiwgMHg3NjU0MzIxMCk7CisJCVJFR19XUihicCwgTklHX1JFR19QMF9UWF9BUkJfUFJJT1JJVFlfQ0xJRU5UMl9NU0IsIDB4OCk7CisJfQorCS8qKgorCSogRm9yIHN0cmljdCBwcmlvcml0eSBlbnRyaWVzIGRlZmluZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZQorCSogc2xvdHMgZm9yIHRoZSBoaWdoZXN0IHByaW9yaXR5LgorCSovCisJLyogVE9ET19FVFMgLSBTaG91bGQgYmUgZG9uZSBieSByZXNldCB2YWx1ZSBvciBpbml0IHRvb2wgKi8KKwlSRUdfV1IoYnAsIChwb3J0KSA/IE5JR19SRUdfUDFfVFhfQVJCX05VTV9TVFJJQ1RfQVJCX1NMT1RTIDoKKwkJICAgTklHX1JFR19QMV9UWF9BUkJfTlVNX1NUUklDVF9BUkJfU0xPVFMsIDB4MTAwKTsKKwkvKioKKwkgKiBtYXBwaW5nIGJldHdlZW4gdGhlIENSRURJVF9XRUlHSFQgcmVnaXN0ZXJzIGFuZCBhY3R1YWwgY2xpZW50CisJICogbnVtYmVycworCSAqLworCS8qIFRPRE9fRVRTIC0gU2hvdWxkIGJlIGRvbmUgYnkgcmVzZXQgdmFsdWUgb3IgaW5pdCB0b29sICovCisJaWYgKHBvcnQpIHsKKwkJLypQb3J0IDEgaGFzIDYgQ09TKi8KKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1AxX1RYX0FSQl9DTElFTlRfQ1JFRElUX01BUDJfTFNCLCAweDIxMDU0Myk7CisJCVJFR19XUihicCwgTklHX1JFR19QMV9UWF9BUkJfQ0xJRU5UX0NSRURJVF9NQVAyX01TQiwgMHgwKTsKKwl9IGVsc2UgeworCQkvKlBvcnQgMCBoYXMgOSBDT1MqLworCQlSRUdfV1IoYnAsIE5JR19SRUdfUDBfVFhfQVJCX0NMSUVOVF9DUkVESVRfTUFQMl9MU0IsCisJCSAgICAgICAweDQzMjEwODc2KTsKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1AwX1RYX0FSQl9DTElFTlRfQ1JFRElUX01BUDJfTVNCLCAweDUpOworCX0KKworCS8qKgorCSAqIEJpdG1hcCBvZiA1Yml0cyBsZW5ndGguIEVhY2ggYml0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbnRyeSBiZWhhdmVzCisJICogYXMgc3RyaWN0LiAgQml0cyAwLDEsMiAtIGRlYnVnIGFuZCBtYW5hZ2VtZW50IGVudHJpZXMsIDMgLQorCSAqIENPUzAgZW50cnksIDQgLSBDT1MxIGVudHJ5LgorCSAqIENPUzEgfCBDT1MwIHwgREVCVUcxIHwgREVCVUcwIHwgTUdNVAorCSAqIGJpdDQgICBiaXQzCSAgYml0MiAgIGJpdDEJICBiaXQwCisJICogTUNQIGFuZCBkZWJ1ZyBhcmUgc3RyaWN0CisJICovCisJaWYgKHBvcnQpCisJCVJFR19XUihicCwgTklHX1JFR19QMV9UWF9BUkJfQ0xJRU5UX0lTX1NUUklDVCwgMHgzZik7CisJZWxzZQorCQlSRUdfV1IoYnAsIE5JR19SRUdfUDBfVFhfQVJCX0NMSUVOVF9JU19TVFJJQ1QsIDB4MWZmKTsKKwkvKiBkZWZpbmVzIHdoaWNoIGVudHJpZXMgKGNsaWVudHMpIGFyZSBzdWJqZWN0ZWQgdG8gV0ZRIGFyYml0cmF0aW9uICovCisJUkVHX1dSKGJwLCAocG9ydCkgPyBOSUdfUkVHX1AxX1RYX0FSQl9DTElFTlRfSVNfU1VCSkVDVDJXRlEgOgorCQkgICBOSUdfUkVHX1AwX1RYX0FSQl9DTElFTlRfSVNfU1VCSkVDVDJXRlEsIDApOworCisJLyoqCisJKiBQbGVhc2Ugbm90aWNlIHRoZSByZWdpc3RlciBhZGRyZXNzIGFyZSBub3RlIGNvbnRpbnVvdXMgYW5kIGEKKwkqIGZvciBoZXJlIGlzIG5vdGUgYXBwcm9wcmlhdGUuSW4gMiBwb3J0IG1vZGUgcG9ydDAgb25seSBDT1MwLTUKKwkqIGNhbiBiZSB1c2VkLiBERUJVRzEsREVCVUcxLE1HTVQgYXJlIG5ldmVyIHVzZWQgZm9yIFdGUSogSW4gNAorCSogcG9ydCBtb2RlIHBvcnQxIG9ubHkgQ09TMC0yIGNhbiBiZSB1c2VkLiBERUJVRzEsREVCVUcxLE1HTVQKKwkqIGFyZSBuZXZlciB1c2VkIGZvciBXRlEKKwkqLworCVJFR19XUihicCwgKHBvcnQpID8gTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1dFSUdIVF8wIDoKKwkJICAgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1dFSUdIVF8wLCAweDApOworCVJFR19XUihicCwgKHBvcnQpID8gTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1dFSUdIVF8xIDoKKwkJICAgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1dFSUdIVF8xLCAweDApOworCVJFR19XUihicCwgKHBvcnQpID8gTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1dFSUdIVF8yIDoKKwkJICAgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1dFSUdIVF8yLCAweDApOworCVJFR19XUihicCwgKHBvcnQpID8gTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1dFSUdIVF8zIDoKKwkJICAgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1dFSUdIVF8zLCAweDApOworCVJFR19XUihicCwgKHBvcnQpID8gTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1dFSUdIVF80IDoKKwkJICAgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1dFSUdIVF80LCAweDApOworCVJFR19XUihicCwgKHBvcnQpID8gTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1dFSUdIVF81IDoKKwkJICAgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1dFSUdIVF81LCAweDApOworCWlmICgwID09IHBvcnQpIHsKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfV0VJR0hUXzYsIDB4MCk7CisJCVJFR19XUihicCwgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1dFSUdIVF83LCAweDApOworCQlSRUdfV1IoYnAsIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfOCwgMHgwKTsKKwl9CisKKwlibngyeF9ldHNfZTNiMF9zZXRfY3JlZGl0X3VwcGVyX2JvdW5kX25pZyhwYXJhbXMsIG1pbl93X3ZhbCk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0aW9uOgorKglTZXQgY3JlZGl0IHVwcGVyIGJvdW5kIGZvciBQQkYuCisqLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYm54MnhfZXRzX2UzYjBfc2V0X2NyZWRpdF91cHBlcl9ib3VuZF9wYmYoCisJY29uc3Qgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJY29uc3QgdTMyIG1pbl93X3ZhbCkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwljb25zdCB1MzIgY3JlZGl0X3VwcGVyX2JvdW5kID0KKwkgICAgYm54MnhfZXRzX2dldF9jcmVkaXRfdXBwZXJfYm91bmQobWluX3dfdmFsKTsKKwljb25zdCB1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCXUzMiBiYXNlX3VwcGVyX2JvdW5kID0gMDsKKwl1OCBtYXhfY29zID0gMDsKKwl1OCBpID0gMDsKKwkvKioKKwkqIEluIDIgcG9ydCBtb2RlIHBvcnQwIGhhcyBDT1MwLTUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgV0ZRLkluIDQKKwkqIHBvcnQgbW9kZSBwb3J0MSBoYXMgQ09TMC0yIHRoYXQgY2FuIGJlIHVzZWQgZm9yIFdGUS4KKwkqLworCWlmICgwID09IHBvcnQpIHsKKwkJYmFzZV91cHBlcl9ib3VuZCA9IFBCRl9SRUdfQ09TMF9VUFBFUl9CT1VORF9QMDsKKwkJbWF4X2NvcyA9IERDQlhfRTNCMF9NQVhfTlVNX0NPU19QT1JUMDsKKwl9IGVsc2UgeworCQliYXNlX3VwcGVyX2JvdW5kID0gUEJGX1JFR19DT1MwX1VQUEVSX0JPVU5EX1AxOworCQltYXhfY29zID0gRENCWF9FM0IwX01BWF9OVU1fQ09TX1BPUlQxOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtYXhfY29zOyBpKyspCisJCVJFR19XUihicCwgYmFzZV91cHBlcl9ib3VuZCArIChpIDw8IDIpLCBjcmVkaXRfdXBwZXJfYm91bmQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0aW9uOgorKglXaWxsIHJldHVybiB0aGUgUEJGIEVUUyByZWdpc3RlcnMgdG8gaW5pdCB2YWx1ZXMuRXhjZXB0CisqCWNyZWRpdF91cHBlcl9ib3VuZC4KKyoJVGhhdCBpc24ndCB1c2VkIGluIHRoaXMgY29uZmlndXJhdGlvbiAoTm8gV0ZRIGlzIGVuYWJsZWQpIGFuZCB3aWxsIGJlCisqCWNvbmZpZ3VyZWQgYWNvcmRpbmcgdG8gc3BlYworKi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJueDJ4X2V0c19lM2IwX3BiZl9kaXNhYmxlZChjb25zdCBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwljb25zdCB1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCWNvbnN0IHUzMiBtaW5fd192YWxfcGJmID0gRVRTX0UzQjBfUEJGX01JTl9XX1ZBTDsKKwl1OCBpID0gMDsKKwl1MzIgYmFzZV93ZWlnaHQgPSAwOworCXU4IG1heF9jb3MgPSAwOworCisJLyoqCisJICogbWFwcGluZyBiZXR3ZWVuIGVudHJ5ICBwcmlvcml0eSB0byBjbGllbnQgbnVtYmVyIDAgLSBDT1MwCisJICogY2xpZW50LCAyIC0gQ09TMSwgLi4uIDUgLSBDT1M1KShISUdIRVNUKSA0Yml0cyBjbGllbnQgbnVtLgorCSAqIFRPRE9fRVRTIC0gU2hvdWxkIGJlIGRvbmUgYnkgcmVzZXQgdmFsdWUgb3IgaW5pdCB0b29sCisJICovCisJaWYgKHBvcnQpCisJCS8qICAweDY4OCAofDAxMXwwIDEwfDAwIDF8MDAwKSAqLworCQlSRUdfV1IoYnAsIFBCRl9SRUdfRVRTX0FSQl9QUklPUklUWV9DTElFTlRfUDEgLCAweDY4OCk7CisJZWxzZQorCQkvKiAgKDEwIDF8MTAwIHwwMTF8MCAxMHwwMCAxfDAwMCkgKi8KKwkJUkVHX1dSKGJwLCBQQkZfUkVHX0VUU19BUkJfUFJJT1JJVFlfQ0xJRU5UX1AwICwgMHgyQzY4OCk7CisKKwkvKiBUT0RPX0VUUyAtIFNob3VsZCBiZSBkb25lIGJ5IHJlc2V0IHZhbHVlIG9yIGluaXQgdG9vbCAqLworCWlmIChwb3J0KQorCQkvKiAweDY4OCAofDAxMXwwIDEwfDAwIDF8MDAwKSovCisJCVJFR19XUihicCwgUEJGX1JFR19FVFNfQVJCX0NMSUVOVF9DUkVESVRfTUFQX1AxLCAweDY4OCk7CisJZWxzZQorCS8qIDB4MkM2ODggKDEwIDF8MTAwIHwwMTF8MCAxMHwwMCAxfDAwMCkgKi8KKwlSRUdfV1IoYnAsIFBCRl9SRUdfRVRTX0FSQl9DTElFTlRfQ1JFRElUX01BUF9QMCwgMHgyQzY4OCk7CisKKwlSRUdfV1IoYnAsIChwb3J0KSA/IFBCRl9SRUdfRVRTX0FSQl9OVU1fU1RSSUNUX0FSQl9TTE9UU19QMSA6CisJCSAgIFBCRl9SRUdfRVRTX0FSQl9OVU1fU1RSSUNUX0FSQl9TTE9UU19QMCAsIDB4MTAwKTsKKworCisJUkVHX1dSKGJwLCAocG9ydCkgPyBQQkZfUkVHX0VUU19BUkJfQ0xJRU5UX0lTX1NUUklDVF9QMSA6CisJCSAgIFBCRl9SRUdfRVRTX0FSQl9DTElFTlRfSVNfU1RSSUNUX1AwICwgMCk7CisKKwlSRUdfV1IoYnAsIChwb3J0KSA/IFBCRl9SRUdfRVRTX0FSQl9DTElFTlRfSVNfU1VCSkVDVDJXRlFfUDEgOgorCQkgICBQQkZfUkVHX0VUU19BUkJfQ0xJRU5UX0lTX1NVQkpFQ1QyV0ZRX1AwICwgMCk7CisJLyoqCisJKiBJbiAyIHBvcnQgbW9kZSBwb3J0MCBoYXMgQ09TMC01IHRoYXQgY2FuIGJlIHVzZWQgZm9yIFdGUS4KKwkqIEluIDQgcG9ydCBtb2RlIHBvcnQxIGhhcyBDT1MwLTIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgV0ZRLgorCSovCisJaWYgKDAgPT0gcG9ydCkgeworCQliYXNlX3dlaWdodCA9IFBCRl9SRUdfQ09TMF9XRUlHSFRfUDA7CisJCW1heF9jb3MgPSBEQ0JYX0UzQjBfTUFYX05VTV9DT1NfUE9SVDA7CisJfSBlbHNlIHsKKwkJYmFzZV93ZWlnaHQgPSBQQkZfUkVHX0NPUzBfV0VJR0hUX1AxOworCQltYXhfY29zID0gRENCWF9FM0IwX01BWF9OVU1fQ09TX1BPUlQxOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtYXhfY29zOyBpKyspCisJCVJFR19XUihicCwgYmFzZV93ZWlnaHQgKyAoMHg0ICogaSksIDApOworCisJYm54MnhfZXRzX2UzYjBfc2V0X2NyZWRpdF91cHBlcl9ib3VuZF9wYmYocGFyYW1zLCBtaW5fd192YWxfcGJmKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGVzY3JpcHRpb246CisqCUUzQjAgZGlzYWJsZSB3aWxsIHJldHVybiBiYXNpY2x5IHRoZSB2YWx1ZXMgdG8gaW5pdCB2YWx1ZXMuCisqLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBibngyeF9ldHNfZTNiMF9kaXNhYmxlZChjb25zdCBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCisJaWYgKCFDSElQX0lTX0UzQjAoYnApKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfZXRzX2UzYjBfZGlzYWJsZWQgdGhlIGNoaXAgaXNuJ3QgRTNCMCIKKwkJCQkgICAiXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYm54MnhfZXRzX2UzYjBfbmlnX2Rpc2FibGVkKHBhcmFtcywgdmFycyk7CisKKwlibngyeF9ldHNfZTNiMF9wYmZfZGlzYWJsZWQocGFyYW1zKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0aW9uOgorKglEaXNhYmxlIHdpbGwgcmV0dXJuIGJhc2ljbHkgdGhlIHZhbHVlcyB0byBpbml0IHZhbHVlcy4KKyouCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm54MnhfZXRzX2Rpc2FibGVkKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCWludCBibngyeF9zdGF0dXMgPSAwOworCisJaWYgKChDSElQX0lTX0UyKGJwKSkgfHwgKENISVBfSVNfRTNBMChicCkpKQorCQlibngyeF9ldHNfZTJlM2EwX2Rpc2FibGVkKHBhcmFtcyk7CisJZWxzZSBpZiAoQ0hJUF9JU19FM0IwKGJwKSkKKwkJYm54Mnhfc3RhdHVzID0gYm54MnhfZXRzX2UzYjBfZGlzYWJsZWQocGFyYW1zLCB2YXJzKTsKKwllbHNlIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF9ldHNfZGlzYWJsZWQgLSBjaGlwIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gYm54Mnhfc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0aW9uCisqCVNldCB0aGUgQ09TIG1hcHBpbWcgdG8gU1AgYW5kIEJXIHVudGlsIHRoaXMgcG9pbnQgYWxsIHRoZSBDT1MgYXJlIG5vdAorKglzZXQgYXMgU1Agb3IgQlcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGJueDJ4X2V0c19lM2IwX2NsaV9tYXAoY29uc3Qgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICBjb25zdCBzdHJ1Y3QgYm54MnhfZXRzX3BhcmFtcyAqZXRzX3BhcmFtcywKKwkJCQkgIGNvbnN0IHU4IGNvc19zcF9iaXRtYXAsCisJCQkJICBjb25zdCB1OCBjb3NfYndfYml0bWFwKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCWNvbnN0IHU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJY29uc3QgdTggbmlnX2NsaV9zcF9iaXRtYXAgPSAweDcgfCAoY29zX3NwX2JpdG1hcCA8PCAzKTsKKwljb25zdCB1OCBwYmZfY2xpX3NwX2JpdG1hcCA9IGNvc19zcF9iaXRtYXA7CisJY29uc3QgdTggbmlnX2NsaV9zdWJqZWN0MndmcV9iaXRtYXAgPSBjb3NfYndfYml0bWFwIDw8IDM7CisJY29uc3QgdTggcGJmX2NsaV9zdWJqZWN0MndmcV9iaXRtYXAgPSBjb3NfYndfYml0bWFwOworCisJUkVHX1dSKGJwLCAocG9ydCkgPyBOSUdfUkVHX1AxX1RYX0FSQl9DTElFTlRfSVNfU1RSSUNUIDoKKwkgICAgICAgTklHX1JFR19QMF9UWF9BUkJfQ0xJRU5UX0lTX1NUUklDVCwgbmlnX2NsaV9zcF9iaXRtYXApOworCisJUkVHX1dSKGJwLCAocG9ydCkgPyBQQkZfUkVHX0VUU19BUkJfQ0xJRU5UX0lTX1NUUklDVF9QMSA6CisJICAgICAgIFBCRl9SRUdfRVRTX0FSQl9DTElFTlRfSVNfU1RSSUNUX1AwICwgcGJmX2NsaV9zcF9iaXRtYXApOworCisJUkVHX1dSKGJwLCAocG9ydCkgPyBOSUdfUkVHX1AxX1RYX0FSQl9DTElFTlRfSVNfU1VCSkVDVDJXRlEgOgorCSAgICAgICBOSUdfUkVHX1AwX1RYX0FSQl9DTElFTlRfSVNfU1VCSkVDVDJXRlEsCisJICAgICAgIG5pZ19jbGlfc3ViamVjdDJ3ZnFfYml0bWFwKTsKKworCVJFR19XUihicCwgKHBvcnQpID8gUEJGX1JFR19FVFNfQVJCX0NMSUVOVF9JU19TVUJKRUNUMldGUV9QMSA6CisJICAgICAgIFBCRl9SRUdfRVRTX0FSQl9DTElFTlRfSVNfU1VCSkVDVDJXRlFfUDAsCisJICAgICAgIHBiZl9jbGlfc3ViamVjdDJ3ZnFfYml0bWFwKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0aW9uOgorKglUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCBiZWNhdXNlIE5JRyBBUkJfQ1JFRElUX1dFSUdIVF9YIGFyZQorKglub3QgY29udGludWVzIGFuZCBBUkJfQ1JFRElUX1dFSUdIVF8wICsgb2Zmc2V0IGlzIHN1aXRhYmxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBibngyeF9ldHNfZTNiMF9zZXRfY29zX2J3KHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICBjb25zdCB1OCBjb3NfZW50cnksCisJCQkJICAgICBjb25zdCB1MzIgbWluX3dfdmFsX25pZywKKwkJCQkgICAgIGNvbnN0IHUzMiBtaW5fd192YWxfcGJmLAorCQkJCSAgICAgY29uc3QgdTE2IHRvdGFsX2J3LAorCQkJCSAgICAgY29uc3QgdTggYncsCisJCQkJICAgICBjb25zdCB1OCBwb3J0KQoreworCXUzMiBuaWdfcmVnX2FkcmVzc19jcmRfd2VpZ2h0ID0gMDsKKwl1MzIgcGJmX3JlZ19hZHJlc3NfY3JkX3dlaWdodCA9IDA7CisJLyogQ2FsY3VsYXRlIGFuZCBzZXQgQlcgZm9yIHRoaXMgQ09TKi8KKwljb25zdCB1MzIgY29zX2J3X25pZyA9IChidyAqIG1pbl93X3ZhbF9uaWcpIC8gdG90YWxfYnc7CisJY29uc3QgdTMyIGNvc19id19wYmYgPSAoYncgKiBtaW5fd192YWxfcGJmKSAvIHRvdGFsX2J3OworCisJc3dpdGNoIChjb3NfZW50cnkpIHsKKwljYXNlIDA6CisJICAgIG5pZ19yZWdfYWRyZXNzX2NyZF93ZWlnaHQgPQorCQkgKHBvcnQpID8gTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1dFSUdIVF8wIDoKKwkJICAgICBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfV0VJR0hUXzA7CisJICAgICBwYmZfcmVnX2FkcmVzc19jcmRfd2VpZ2h0ID0gKHBvcnQpID8KKwkJIFBCRl9SRUdfQ09TMF9XRUlHSFRfUDEgOiBQQkZfUkVHX0NPUzBfV0VJR0hUX1AwOworCSAgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICAgbmlnX3JlZ19hZHJlc3NfY3JkX3dlaWdodCA9IChwb3J0KSA/CisJCSBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfV0VJR0hUXzEgOgorCQkgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1dFSUdIVF8xOworCSAgICAgcGJmX3JlZ19hZHJlc3NfY3JkX3dlaWdodCA9IChwb3J0KSA/CisJCSBQQkZfUkVHX0NPUzFfV0VJR0hUX1AxIDogUEJGX1JFR19DT1MxX1dFSUdIVF9QMDsKKwkgICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgIG5pZ19yZWdfYWRyZXNzX2NyZF93ZWlnaHQgPSAocG9ydCkgPworCQkgTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1dFSUdIVF8yIDoKKwkJIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfMjsKKworCQkgcGJmX3JlZ19hZHJlc3NfY3JkX3dlaWdodCA9IChwb3J0KSA/CisJCSAgICAgUEJGX1JFR19DT1MyX1dFSUdIVF9QMSA6IFBCRl9SRUdfQ09TMl9XRUlHSFRfUDA7CisJICAgICBicmVhazsKKwljYXNlIDM6CisJICAgIGlmIChwb3J0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJICAgICBuaWdfcmVnX2FkcmVzc19jcmRfd2VpZ2h0ID0KKwkJIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfMzsKKwkgICAgIHBiZl9yZWdfYWRyZXNzX2NyZF93ZWlnaHQgPQorCQkgUEJGX1JFR19DT1MzX1dFSUdIVF9QMDsKKwkgICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgaWYgKHBvcnQpCisJCXJldHVybiAtRUlOVkFMOworCSAgICAgbmlnX3JlZ19hZHJlc3NfY3JkX3dlaWdodCA9CisJCSBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfV0VJR0hUXzQ7CisJICAgICBwYmZfcmVnX2FkcmVzc19jcmRfd2VpZ2h0ID0gUEJGX1JFR19DT1M0X1dFSUdIVF9QMDsKKwkgICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgaWYgKHBvcnQpCisJCXJldHVybiAtRUlOVkFMOworCSAgICAgbmlnX3JlZ19hZHJlc3NfY3JkX3dlaWdodCA9CisJCSBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfV0VJR0hUXzU7CisJICAgICBwYmZfcmVnX2FkcmVzc19jcmRfd2VpZ2h0ID0gUEJGX1JFR19DT1M1X1dFSUdIVF9QMDsKKwkgICAgIGJyZWFrOworCX0KKworCVJFR19XUihicCwgbmlnX3JlZ19hZHJlc3NfY3JkX3dlaWdodCwgY29zX2J3X25pZyk7CisKKwlSRUdfV1IoYnAsIHBiZl9yZWdfYWRyZXNzX2NyZF93ZWlnaHQsIGNvc19id19wYmYpOworCisJcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0aW9uOgorKglDYWxjdWxhdGUgdGhlIHRvdGFsIEJXLkEgdmFsdWUgb2YgMCBpc24ndCBsZWdhbC4KKyouCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGJueDJ4X2V0c19lM2IwX2dldF90b3RhbF9idygKKwljb25zdCBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwljb25zdCBzdHJ1Y3QgYm54MnhfZXRzX3BhcmFtcyAqZXRzX3BhcmFtcywKKwl1MTYgKnRvdGFsX2J3KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXU4IGNvc19pZHggPSAwOworCisJKnRvdGFsX2J3ID0gMCA7CisJLyogQ2FsY3VsYXRlIHRvdGFsIEJXIHJlcXVlc3RlZCAqLworCWZvciAoY29zX2lkeCA9IDA7IGNvc19pZHggPCBldHNfcGFyYW1zLT5udW1fb2ZfY29zOyBjb3NfaWR4KyspIHsKKwkJaWYgKGJueDJ4X2Nvc19zdGF0ZV9idyA9PSBldHNfcGFyYW1zLT5jb3NbY29zX2lkeF0uc3RhdGUpIHsKKworCQkJaWYgKDAgPT0gZXRzX3BhcmFtcy0+Y29zW2Nvc19pZHhdLnBhcmFtcy5id19wYXJhbXMuYncpIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgImJueDJ4X2V0c19FM0IwX2NvbmZpZyBCVyIKKwkJCQkJCSAgICJ3YXMgc2V0IHRvIDBcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJKnRvdGFsX2J3ICs9CisJCSAgICBldHNfcGFyYW1zLT5jb3NbY29zX2lkeF0ucGFyYW1zLmJ3X3BhcmFtcy5idzsKKwkgICAgfQorCX0KKworCS8qQ2hlY2sgdGFvdGwgQlcgaXMgdmFsaWQgKi8KKwlpZiAoKDEwMCAhPSAqdG90YWxfYncpIHx8ICgwID09ICp0b3RhbF9idykpIHsKKwkJaWYgKDAgPT0gKnRvdGFsX2J3KSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgImJueDJ4X2V0c19FM0IwX2NvbmZpZyB0b2F0bCBCVyIKKwkJCQkJICAgInNob3VsZG4ndCBiZSAwXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfZXRzX0UzQjBfY29uZmlnIHRvYXRsIEJXIHNob3VsZCBiZSIKKwkJCQkgICAiMTAwXG4iKTsKKwkJLyoqCisJCSogICBXZSBjYW4gaGFuZGxlIGEgY2FzZSB3aHJlIHRoZSBCVyBpc24ndCAxMDAgdGhpcyBjYW4gaGFwcGVuCisJCSogICBpZiB0aGUgVEMgYXJlIGpvaW5lZC4KKwkJKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGVzY3JpcHRpb246CisqCUludmFsaWRhdGUgYWxsIHRoZSBzcF9wcmlfdG9fY29zLgorKi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJueDJ4X2V0c19lM2IwX3NwX3ByaV90b19jb3NfaW5pdCh1OCAqc3BfcHJpX3RvX2NvcykKK3sKKwl1OCBwcmkgPSAwOworCWZvciAocHJpID0gMDsgcHJpIDwgRENCWF9NQVhfTlVNX0NPUzsgcHJpKyspCisJCXNwX3ByaV90b19jb3NbcHJpXSA9IERDQlhfSU5WQUxJRF9DT1M7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0aW9uOgorKglDYWxjdWxhdGUgYW5kIHNldCB0aGUgU1AgKEFSQl9QUklPUklUWV9DTElFTlQpIE5JRyBhbmQgUEJGIHJlZ2lzdGVycworKglhY2NvcmRpbmcgdG8gc3BfcHJpX3RvX2Nvcy4KKyouCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGJueDJ4X2V0c19lM2IwX3NwX3ByaV90b19jb3Nfc2V0KGNvbnN0IHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCQkgICAgdTggKnNwX3ByaV90b19jb3MsIGNvbnN0IHU4IHByaSwKKwkJCQkJICAgIGNvbnN0IHU4IGNvc19lbnRyeSkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwljb25zdCB1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCWNvbnN0IHU4IG1heF9udW1fb2ZfY29zID0gKHBvcnQpID8gRENCWF9FM0IwX01BWF9OVU1fQ09TX1BPUlQxIDoKKwkJRENCWF9FM0IwX01BWF9OVU1fQ09TX1BPUlQwOworCisJaWYgKERDQlhfSU5WQUxJRF9DT1MgIT0gc3BfcHJpX3RvX2Nvc1twcmldKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfZXRzX2UzYjBfc3BfcHJpX3RvX2Nvc19zZXQgaW52YWxpZCAiCisJCQkJICAgInBhcmFtZXRlciBUaGVyZSBjYW4ndCBiZSB0d28gQ09TJ3Mgd2l0aCIKKwkJCQkgICAidGhlIHNhbWUgc3RyaWN0IHByaVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwcmkgPiBtYXhfbnVtX29mX2NvcykgeworCQlEUChORVRJRl9NU0dfTElOSywgImJueDJ4X2V0c19lM2IwX3NwX3ByaV90b19jb3Nfc2V0IGludmFsaWQiCisJCQkgICAgICAgInBhcmFtZXRlciBJbGxlZ2FsIHN0cmljdCBwcmlvcml0eVxuIik7CisJICAgIHJldHVybiAtRUlOVkFMOworCX0KKworCXNwX3ByaV90b19jb3NbcHJpXSA9IGNvc19lbnRyeTsKKwlyZXR1cm4gMDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0aW9uOgorKglSZXR1cm5zIHRoZSBjb3JyZWN0IHZhbHVlIGFjY29yZGluZyB0byBDT1MgYW5kIHByaW9yaXR5IGluCisqCXRoZSBzcF9wcmlfY2xpIHJlZ2lzdGVyLgorKi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1NjQgYm54MnhfZTNiMF9zcF9nZXRfcHJpX2NsaV9yZWcoY29uc3QgdTggY29zLCBjb25zdCB1OCBjb3Nfb2Zmc2V0LAorCQkJCQkgY29uc3QgdTggcHJpX3NldCwKKwkJCQkJIGNvbnN0IHU4IHByaV9vZmZzZXQsCisJCQkJCSBjb25zdCB1OCBlbnRyeV9zaXplKQoreworCXU2NCBwcmlfY2xpX25pZyA9IDA7CisJcHJpX2NsaV9uaWcgPSAoKHU2NCkoY29zICsgY29zX29mZnNldCkpIDw8IChlbnRyeV9zaXplICoKKwkJCQkJCSAgICAocHJpX3NldCArIHByaV9vZmZzZXQpKTsKKworCXJldHVybiBwcmlfY2xpX25pZzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGVzY3JpcHRpb246CisqCVJldHVybnMgdGhlIGNvcnJlY3QgdmFsdWUgYWNjb3JkaW5nIHRvIENPUyBhbmQgcHJpb3JpdHkgaW4gdGhlCisqCXNwX3ByaV9jbGkgcmVnaXN0ZXIgZm9yIE5JRy4KKyouCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTY0IGJueDJ4X2UzYjBfc3BfZ2V0X3ByaV9jbGlfcmVnX25pZyhjb25zdCB1OCBjb3MsIGNvbnN0IHU4IHByaV9zZXQpCit7CisJLyogTUNQIERiZzAgYW5kIGRiZzEgYXJlIGFsd2F5cyB3aXRoIGhpZ2hlciBzdHJpY3QgcHJpKi8KKwljb25zdCB1OCBuaWdfY29zX29mZnNldCA9IDM7CisJY29uc3QgdTggbmlnX3ByaV9vZmZzZXQgPSAzOworCisJcmV0dXJuIGJueDJ4X2UzYjBfc3BfZ2V0X3ByaV9jbGlfcmVnKGNvcywgbmlnX2Nvc19vZmZzZXQsIHByaV9zZXQsCisJCW5pZ19wcmlfb2Zmc2V0LCA0KTsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEZXNjcmlwdGlvbjoKKyoJUmV0dXJucyB0aGUgY29ycmVjdCB2YWx1ZSBhY2NvcmRpbmcgdG8gQ09TIGFuZCBwcmlvcml0eSBpbiB0aGUKKyoJc3BfcHJpX2NsaSByZWdpc3RlciBmb3IgUEJGLgorKi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1NjQgYm54MnhfZTNiMF9zcF9nZXRfcHJpX2NsaV9yZWdfcGJmKGNvbnN0IHU4IGNvcywgY29uc3QgdTggcHJpX3NldCkKK3sKKwljb25zdCB1OCBwYmZfY29zX29mZnNldCA9IDA7CisJY29uc3QgdTggcGJmX3ByaV9vZmZzZXQgPSAwOworCisJcmV0dXJuIGJueDJ4X2UzYjBfc3BfZ2V0X3ByaV9jbGlfcmVnKGNvcywgcGJmX2Nvc19vZmZzZXQsIHByaV9zZXQsCisJCXBiZl9wcmlfb2Zmc2V0LCAzKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0aW9uOgorKglDYWxjdWxhdGUgYW5kIHNldCB0aGUgU1AgKEFSQl9QUklPUklUWV9DTElFTlQpIE5JRyBhbmQgUEJGIHJlZ2lzdGVycworKglhY2NvcmRpbmcgdG8gc3BfcHJpX3RvX2Nvcy4od2hpY2ggQ09TIGhhcyBoaWdoZXIgcHJpb3JpdHkpCisqLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBibngyeF9ldHNfZTNiMF9zcF9zZXRfcHJpX2NsaV9yZWcoY29uc3Qgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJCSAgICAgdTggKnNwX3ByaV90b19jb3MpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggaSA9IDA7CisJY29uc3QgdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwkvKiBNQ1AgRGJnMCBhbmQgZGJnMSBhcmUgYWx3YXlzIHdpdGggaGlnaGVyIHN0cmljdCBwcmkqLworCXU2NCBwcmlfY2xpX25pZyA9IDB4MjEwOworCXUzMiBwcmlfY2xpX3BiZiA9IDB4MDsKKwl1OCBwcmlfc2V0ID0gMDsKKwl1OCBwcmlfYml0bWFzayA9IDA7CisJY29uc3QgdTggbWF4X251bV9vZl9jb3MgPSAocG9ydCkgPyBEQ0JYX0UzQjBfTUFYX05VTV9DT1NfUE9SVDEgOgorCQlEQ0JYX0UzQjBfTUFYX05VTV9DT1NfUE9SVDA7CisKKwl1OCBjb3NfYml0X3RvX3NldCA9ICgxIDw8IG1heF9udW1fb2ZfY29zKSAtIDE7CisKKwkvKiBTZXQgYWxsIHRoZSBzdHJpY3QgcHJpb3JpdHkgZmlyc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWF4X251bV9vZl9jb3M7IGkrKykgeworCQlpZiAoRENCWF9JTlZBTElEX0NPUyAhPSBzcF9wcmlfdG9fY29zW2ldKSB7CisJCQlpZiAoRENCWF9NQVhfTlVNX0NPUyA8PSBzcF9wcmlfdG9fY29zW2ldKSB7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssCisJCQkJCSAgICJibngyeF9ldHNfZTNiMF9zcF9zZXRfcHJpX2NsaV9yZWcgIgorCQkJCQkgICAiaW52YWxpZCBjb3MgZW50cnlcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlwcmlfY2xpX25pZyB8PSBibngyeF9lM2IwX3NwX2dldF9wcmlfY2xpX3JlZ19uaWcoCisJCQkgICAgc3BfcHJpX3RvX2Nvc1tpXSwgcHJpX3NldCk7CisKKwkJCXByaV9jbGlfcGJmIHw9IGJueDJ4X2UzYjBfc3BfZ2V0X3ByaV9jbGlfcmVnX3BiZigKKwkJCSAgICBzcF9wcmlfdG9fY29zW2ldLCBwcmlfc2V0KTsKKwkJCXByaV9iaXRtYXNrID0gMSA8PCBzcF9wcmlfdG9fY29zW2ldOworCQkJLyogQ09TIGlzIHVzZWQgcmVtb3ZlIGl0IGZyb20gYml0bWFwLiovCisJCQlpZiAoMCA9PSAocHJpX2JpdG1hc2sgJiBjb3NfYml0X3RvX3NldCkpIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkJImJueDJ4X2V0c19lM2IwX3NwX3NldF9wcmlfY2xpX3JlZyAiCisJCQkJCSJpbnZhbGlkIFRoZXJlIGNhbid0IGJlIHR3byBDT1MncyB3aXRoIgorCQkJCQkiIHRoZSBzYW1lIHN0cmljdCBwcmlcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJY29zX2JpdF90b19zZXQgJj0gfnByaV9iaXRtYXNrOworCQkJcHJpX3NldCsrOworCQl9CisJfQorCisJLyogU2V0IGFsbCB0aGUgTm9uIHN0cmljdCBwcmlvcml0eSBpPSBDT1MqLworCWZvciAoaSA9IDA7IGkgPCBtYXhfbnVtX29mX2NvczsgaSsrKSB7CisJCXByaV9iaXRtYXNrID0gMSA8PCBpOworCQkvKiBDaGVjayBpZiBDT1Mgd2FzIGFscmVhZHkgdXNlZCBmb3IgU1AgKi8KKwkJaWYgKHByaV9iaXRtYXNrICYgY29zX2JpdF90b19zZXQpIHsKKwkJCS8qIENPUyB3YXNuJ3QgdXNlZCBmb3IgU1AgKi8KKwkJCXByaV9jbGlfbmlnIHw9IGJueDJ4X2UzYjBfc3BfZ2V0X3ByaV9jbGlfcmVnX25pZygKKwkJCSAgICBpLCBwcmlfc2V0KTsKKworCQkJcHJpX2NsaV9wYmYgfD0gYm54MnhfZTNiMF9zcF9nZXRfcHJpX2NsaV9yZWdfcGJmKAorCQkJICAgIGksIHByaV9zZXQpOworCQkJLyogQ09TIGlzIHVzZWQgcmVtb3ZlIGl0IGZyb20gYml0bWFwLiovCisJCQljb3NfYml0X3RvX3NldCAmPSB+cHJpX2JpdG1hc2s7CisJCQlwcmlfc2V0Kys7CisJCX0KKwl9CisKKwlpZiAocHJpX3NldCAhPSBtYXhfbnVtX29mX2NvcykgeworCQlEUChORVRJRl9NU0dfTElOSywgImJueDJ4X2V0c19lM2IwX3NwX3NldF9wcmlfY2xpX3JlZyBub3QgYWxsICIKKwkJCQkgICAiZW50cmllcyB3ZXJlIHNldFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwb3J0KSB7CisJCS8qIE9ubHkgNiB1c2FibGUgY2xpZW50cyovCisJCVJFR19XUihicCwgTklHX1JFR19QMV9UWF9BUkJfUFJJT1JJVFlfQ0xJRU5UMl9MU0IsCisJCSAgICAgICAodTMyKXByaV9jbGlfbmlnKTsKKworCQlSRUdfV1IoYnAsIFBCRl9SRUdfRVRTX0FSQl9QUklPUklUWV9DTElFTlRfUDEgLCBwcmlfY2xpX3BiZik7CisJfSBlbHNlIHsKKwkJLyogT25seSA5IHVzYWJsZSBjbGllbnRzKi8KKwkJY29uc3QgdTMyIHByaV9jbGlfbmlnX2xzYiA9ICh1MzIpIChwcmlfY2xpX25pZyk7CisJCWNvbnN0IHUzMiBwcmlfY2xpX25pZ19tc2IgPSAodTMyKSAoKHByaV9jbGlfbmlnID4+IDMyKSAmIDB4Rik7CisKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1AwX1RYX0FSQl9QUklPUklUWV9DTElFTlQyX0xTQiwKKwkJICAgICAgIHByaV9jbGlfbmlnX2xzYik7CisJCVJFR19XUihicCwgTklHX1JFR19QMF9UWF9BUkJfUFJJT1JJVFlfQ0xJRU5UMl9NU0IsCisJCSAgICAgICBwcmlfY2xpX25pZ19tc2IpOworCisJCVJFR19XUihicCwgUEJGX1JFR19FVFNfQVJCX1BSSU9SSVRZX0NMSUVOVF9QMCAsIHByaV9jbGlfcGJmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGVzY3JpcHRpb246CisqCUNvbmZpZ3VyZSB0aGUgQ09TIHRvIEVUUyBhY2NvcmRpbmcgdG8gQlcgYW5kIFNQIHNldHRpbmdzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGJueDJ4X2V0c19lM2IwX2NvbmZpZyhjb25zdCBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSBjb25zdCBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAorCQkJIGNvbnN0IHN0cnVjdCBibngyeF9ldHNfcGFyYW1zICpldHNfcGFyYW1zKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCWludCBibngyeF9zdGF0dXMgPSAwOworCWNvbnN0IHU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJdTE2IHRvdGFsX2J3ID0gMDsKKwljb25zdCB1MzIgbWluX3dfdmFsX25pZyA9IGJueDJ4X2V0c19nZXRfbWluX3dfdmFsX25pZyh2YXJzKTsKKwljb25zdCB1MzIgbWluX3dfdmFsX3BiZiA9IEVUU19FM0IwX1BCRl9NSU5fV19WQUw7CisJdTggY29zX2J3X2JpdG1hcCA9IDA7CisJdTggY29zX3NwX2JpdG1hcCA9IDA7CisJdTggc3BfcHJpX3RvX2Nvc1tEQ0JYX01BWF9OVU1fQ09TXSA9IHswfTsKKwljb25zdCB1OCBtYXhfbnVtX29mX2NvcyA9IChwb3J0KSA/IERDQlhfRTNCMF9NQVhfTlVNX0NPU19QT1JUMSA6CisJCURDQlhfRTNCMF9NQVhfTlVNX0NPU19QT1JUMDsKKwl1OCBjb3NfZW50cnkgPSAwOworCisJaWYgKCFDSElQX0lTX0UzQjAoYnApKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfZXRzX2UzYjBfZGlzYWJsZWQgdGhlIGNoaXAgaXNuJ3QgRTNCMCIKKwkJCQkgICAiXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChldHNfcGFyYW1zLT5udW1fb2ZfY29zID4gbWF4X251bV9vZl9jb3MpKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfZXRzX0UzQjBfY29uZmlnIHRoZSBudW1iZXIgb2YgQ09TICIKKwkJCQkgICAiaXNuJ3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUHJlcGFyZSBzcCBzdHJpY3QgcHJpb3JpdHkgcGFyYW1ldGVycyovCisJYm54MnhfZXRzX2UzYjBfc3BfcHJpX3RvX2Nvc19pbml0KHNwX3ByaV90b19jb3MpOworCisJLyogUHJlcGFyZSBCVyBwYXJhbWV0ZXJzKi8KKwlibngyeF9zdGF0dXMgPSBibngyeF9ldHNfZTNiMF9nZXRfdG90YWxfYncocGFyYW1zLCBldHNfcGFyYW1zLAorCQkJCQkJICAgJnRvdGFsX2J3KTsKKwlpZiAoMCAhPSBibngyeF9zdGF0dXMpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF9ldHNfRTNCMF9jb25maWcgZ2V0X3RvdGFsX2J3IGZhaWxlZCAiCisJCQkJICAgIlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qKgorCSAqICBVcHBlciBib3VuZCBpcyBzZXQgYWNjb3JkaW5nIHRvIGN1cnJlbnQgbGluayBzcGVlZCAobWluX3dfdmFsCisJICogIHNob3VsZCBiZSB0aGUgc2FtZSBmb3IgdXBwZXIgYm91bmQgYW5kIENPUyBjcmVkaXQgdmFsKS4KKwkgKi8KKwlibngyeF9ldHNfZTNiMF9zZXRfY3JlZGl0X3VwcGVyX2JvdW5kX25pZyhwYXJhbXMsIG1pbl93X3ZhbF9uaWcpOworCWJueDJ4X2V0c19lM2IwX3NldF9jcmVkaXRfdXBwZXJfYm91bmRfcGJmKHBhcmFtcywgbWluX3dfdmFsX3BiZik7CisKKworCWZvciAoY29zX2VudHJ5ID0gMDsgY29zX2VudHJ5IDwgZXRzX3BhcmFtcy0+bnVtX29mX2NvczsgY29zX2VudHJ5KyspIHsKKwkJaWYgKGJueDJ4X2Nvc19zdGF0ZV9idyA9PSBldHNfcGFyYW1zLT5jb3NbY29zX2VudHJ5XS5zdGF0ZSkgeworCQkJY29zX2J3X2JpdG1hcCB8PSAoMSA8PCBjb3NfZW50cnkpOworCQkJLyoqCisJCQkgKiBUaGUgZnVuY3Rpb24gYWxzbyBzZXRzIHRoZSBCVyBpbiBIVyhub3QgdGhlIG1hcHBpbgorCQkJICogeWV0KQorCQkJICovCisJCQlibngyeF9zdGF0dXMgPSBibngyeF9ldHNfZTNiMF9zZXRfY29zX2J3KAorCQkJCWJwLCBjb3NfZW50cnksIG1pbl93X3ZhbF9uaWcsIG1pbl93X3ZhbF9wYmYsCisJCQkJdG90YWxfYncsCisJCQkJZXRzX3BhcmFtcy0+Y29zW2Nvc19lbnRyeV0ucGFyYW1zLmJ3X3BhcmFtcy5idywKKwkJCQkgcG9ydCk7CisJCX0gZWxzZSBpZiAoYm54MnhfY29zX3N0YXRlX3N0cmljdCA9PQorCQkJZXRzX3BhcmFtcy0+Y29zW2Nvc19lbnRyeV0uc3RhdGUpeworCQkJY29zX3NwX2JpdG1hcCB8PSAoMSA8PCBjb3NfZW50cnkpOworCisJCQlibngyeF9zdGF0dXMgPSBibngyeF9ldHNfZTNiMF9zcF9wcmlfdG9fY29zX3NldCgKKwkJCQlwYXJhbXMsCisJCQkJc3BfcHJpX3RvX2NvcywKKwkJCQlldHNfcGFyYW1zLT5jb3NbY29zX2VudHJ5XS5wYXJhbXMuc3BfcGFyYW1zLnByaSwKKwkJCQljb3NfZW50cnkpOworCisJCX0gZWxzZSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgImJueDJ4X2V0c19lM2IwX2NvbmZpZyBjb3Mgc3RhdGUgbm90IgorCQkJCQkgICAiIHZhbGlkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICgwICE9IGJueDJ4X3N0YXR1cykgeworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF9ldHNfZTNiMF9jb25maWcgc2V0IGNvcyBidyAiCisJCQkJCSAgICJmYWlsZWRcbiIpOworCQkJcmV0dXJuIGJueDJ4X3N0YXR1czsKKwkJfQorCX0KKworCS8qIFNldCBTUCByZWdpc3RlciAod2hpY2ggQ09TIGhhcyBoaWdoZXIgcHJpb3JpdHkpICovCisJYm54Mnhfc3RhdHVzID0gYm54MnhfZXRzX2UzYjBfc3Bfc2V0X3ByaV9jbGlfcmVnKHBhcmFtcywKKwkJCQkJCQkgc3BfcHJpX3RvX2Nvcyk7CisKKwlpZiAoMCAhPSBibngyeF9zdGF0dXMpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF9ldHNfRTNCMF9jb25maWcgc2V0X3ByaV9jbGlfcmVnICIKKwkJCQkgICAiZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGJueDJ4X3N0YXR1czsKKwl9CisKKwkvKiBTZXQgY2xpZW50IG1hcHBpbmcgb2YgQlcgYW5kIHN0cmljdCAqLworCWJueDJ4X3N0YXR1cyA9IGJueDJ4X2V0c19lM2IwX2NsaV9tYXAocGFyYW1zLCBldHNfcGFyYW1zLAorCQkJCQkgICAgICBjb3Nfc3BfYml0bWFwLAorCQkJCQkgICAgICBjb3NfYndfYml0bWFwKTsKKworCWlmICgwICE9IGJueDJ4X3N0YXR1cykgeworCQlEUChORVRJRl9NU0dfTElOSywgImJueDJ4X2V0c19FM0IwX2NvbmZpZyBTUCBmYWlsZWRcbiIpOworCQlyZXR1cm4gYm54Mnhfc3RhdHVzOworCX0KKwlyZXR1cm4gMDsKK30KIHN0YXRpYyB2b2lkIGJueDJ4X2V0c19id19saW1pdF9jb21tb24oY29uc3Qgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCiB7CiAJLyogRVRTIGRpc2FibGVkIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTM0Miw3ICsxMjU1LDcgQEAKIAlSRUdfV1IoYnAsIFBCRl9SRUdfQ09TMV9XRUlHSFQsIGNvczFfY3JlZGl0X3dlaWdodCk7CiB9CiAKLXU4IGJueDJ4X2V0c19zdHJpY3QoY29uc3Qgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIGNvbnN0IHU4IHN0cmljdF9jb3MpCitpbnQgYm54MnhfZXRzX3N0cmljdChjb25zdCBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgY29uc3QgdTggc3RyaWN0X2NvcykKIHsKIAkvKiBFVFMgZGlzYWJsZWQgY29uZmlndXJhdGlvbiovCiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CkBAIC0zODgsMjQgKzEzMDEsNjQgQEAKIC8qCQkJUEZDIHNlY3Rpb24JCQkJICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgYm54MnhfYm1hYzJfZ2V0X3BmY19zdGF0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgICAgdTMyIHBmY19mcmFtZXNfc2VudFsyXSwKLQkJCQkgICAgIHUzMiBwZmNfZnJhbWVzX3JlY2VpdmVkWzJdKQorc3RhdGljIHZvaWQgYm54MnhfdXBkYXRlX3BmY194bWFjKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgc3RydWN0IGxpbmtfdmFycyAqdmFycywKKwkJCQkgIHU4IGlzX2xiKQogewotCS8qIFJlYWQgcGZjIHN0YXRpc3RpYyAqLwogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUzMiBibWFjX2FkZHIgPSBwYXJhbXMtPnBvcnQgPyBOSUdfUkVHX0lOR1JFU1NfQk1BQzFfTUVNIDoKLQkJTklHX1JFR19JTkdSRVNTX0JNQUMwX01FTTsKKwl1MzIgeG1hY19iYXNlOworCXUzMiBwYXVzZV92YWwsIHBmYzBfdmFsLCBwZmMxX3ZhbDsKIAotCURQKE5FVElGX01TR19MSU5LLCAicGZjIHN0YXRpc3RpYyByZWFkIGZyb20gQk1BQ1xuIik7CisJLyogWE1BQyBiYXNlIGFkcnIgKi8KKwl4bWFjX2Jhc2UgPSAocGFyYW1zLT5wb3J0KSA/IEdSQ0JBU0VfWE1BQzEgOiBHUkNCQVNFX1hNQUMwOwogCi0JUkVHX1JEX0RNQUUoYnAsIGJtYWNfYWRkciArIEJJR01BQzJfUkVHSVNURVJfVFhfU1RBVF9HVFBQLAotCQkJCQlwZmNfZnJhbWVzX3NlbnQsIDIpOworCS8qIEluaXRpYWxpemUgcGF1c2UgYW5kIHBmYyByZWdpc3RlcnMgKi8KKwlwYXVzZV92YWwgPSAweDE4MDAwOworCXBmYzBfdmFsID0gMHhGRkZGODAwMDsKKwlwZmMxX3ZhbCA9IDB4MjsKIAotCVJFR19SRF9ETUFFKGJwLCBibWFjX2FkZHIgKyBCSUdNQUMyX1JFR0lTVEVSX1JYX1NUQVRfR1JQUCwKLQkJCQkJcGZjX2ZyYW1lc19yZWNlaXZlZCwgMik7CisJLyogTm8gUEZDIHN1cHBvcnQgKi8KKwlpZiAoIShwYXJhbXMtPmZlYXR1cmVfY29uZmlnX2ZsYWdzICYKKwkgICAgICBGRUFUVVJFX0NPTkZJR19QRkNfRU5BQkxFRCkpIHsKIAorCQkvKgorCQkgKiBSWCBmbG93IGNvbnRyb2wgLSBQcm9jZXNzIHBhdXNlIGZyYW1lIGluIHJlY2VpdmUgZGlyZWN0aW9uCisJCSAqLworCQlpZiAodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1JYKQorCQkJcGF1c2VfdmFsIHw9IFhNQUNfUEFVU0VfQ1RSTF9SRUdfUlhfUEFVU0VfRU47CisKKwkJLyoKKwkJICogVFggZmxvdyBjb250cm9sIC0gU2VuZCBwYXVzZSBwYWNrZXQgd2hlbiBidWZmZXIgaXMgZnVsbAorCQkgKi8KKwkJaWYgKHZhcnMtPmZsb3dfY3RybCAmIEJOWDJYX0ZMT1dfQ1RSTF9UWCkKKwkJCXBhdXNlX3ZhbCB8PSBYTUFDX1BBVVNFX0NUUkxfUkVHX1RYX1BBVVNFX0VOOworCX0gZWxzZSB7LyogUEZDIHN1cHBvcnQgKi8KKwkJcGZjMV92YWwgfD0gWE1BQ19QRkNfQ1RSTF9ISV9SRUdfUEZDX1JFRlJFU0hfRU4gfAorCQkJWE1BQ19QRkNfQ1RSTF9ISV9SRUdfUEZDX1NUQVRTX0VOIHwKKwkJCVhNQUNfUEZDX0NUUkxfSElfUkVHX1JYX1BGQ19FTiB8CisJCQlYTUFDX1BGQ19DVFJMX0hJX1JFR19UWF9QRkNfRU47CisJfQorCisJLyogV3JpdGUgcGF1c2UgYW5kIFBGQyByZWdpc3RlcnMgKi8KKwlSRUdfV1IoYnAsIHhtYWNfYmFzZSArIFhNQUNfUkVHX1BBVVNFX0NUUkwsIHBhdXNlX3ZhbCk7CisJUkVHX1dSKGJwLCB4bWFjX2Jhc2UgKyBYTUFDX1JFR19QRkNfQ1RSTCwgcGZjMF92YWwpOworCVJFR19XUihicCwgeG1hY19iYXNlICsgWE1BQ19SRUdfUEZDX0NUUkxfSEksIHBmYzFfdmFsKTsKKworCisJLyogU2V0IE1BQyBhZGRyZXNzIGZvciBzb3VyY2UgVFggUGF1c2UvUEZDIGZyYW1lcyAqLworCVJFR19XUihicCwgeG1hY19iYXNlICsgWE1BQ19SRUdfQ1RSTF9TQV9MTywKKwkgICAgICAgKChwYXJhbXMtPm1hY19hZGRyWzJdIDw8IDI0KSB8CisJCShwYXJhbXMtPm1hY19hZGRyWzNdIDw8IDE2KSB8CisJCShwYXJhbXMtPm1hY19hZGRyWzRdIDw8IDgpIHwKKwkJKHBhcmFtcy0+bWFjX2FkZHJbNV0pKSk7CisJUkVHX1dSKGJwLCB4bWFjX2Jhc2UgKyBYTUFDX1JFR19DVFJMX1NBX0hJLAorCSAgICAgICAoKHBhcmFtcy0+bWFjX2FkZHJbMF0gPDwgOCkgfAorCQkocGFyYW1zLT5tYWNfYWRkclsxXSkpKTsKKworCXVkZWxheSgzMCk7CiB9CisKKwogc3RhdGljIHZvaWQgYm54MnhfZW1hY19nZXRfcGZjX3N0YXQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCiAJCQkJICAgIHUzMiBwZmNfZnJhbWVzX3NlbnRbMl0sCiAJCQkJICAgIHUzMiBwZmNfZnJhbWVzX3JlY2VpdmVkWzJdKQpAQCAtNDM3LDMzICsxMzkwLDU0IEBACiAJcGZjX2ZyYW1lc19zZW50WzBdID0gdmFsX3hvbiArIHZhbF94b2ZmOwogfQogCisvKiBSZWFkIHBmYyBzdGF0aXN0aWMqLwogdm9pZCBibngyeF9wZmNfc3RhdGlzdGljKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAogCQkJIHUzMiBwZmNfZnJhbWVzX3NlbnRbMl0sCiAJCQkgdTMyIHBmY19mcmFtZXNfcmVjZWl2ZWRbMl0pCiB7CiAJLyogUmVhZCBwZmMgc3RhdGlzdGljICovCiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTMyIHZhbAk9IDA7CisKIAlEUChORVRJRl9NU0dfTElOSywgInBmYyBzdGF0aXN0aWNcbiIpOwogCiAJaWYgKCF2YXJzLT5saW5rX3VwKQogCQlyZXR1cm47CiAKLQl2YWwgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX1JFU0VUX1JFR18yKTsKLQlpZiAoKHZhbCAmIChNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfQk1BQzAgPDwgcGFyYW1zLT5wb3J0KSkKLQkgICAgPT0gMCkgewotCQlEUChORVRJRl9NU0dfTElOSywgIkFib3V0IHRvIHJlYWQgc3RhdHMgZnJvbSBFTUFDXG4iKTsKKwlpZiAoTUFDX1RZUEVfRU1BQyA9PSB2YXJzLT5tYWNfdHlwZSkgeworCQlEUChORVRJRl9NU0dfTElOSywgIkFib3V0IHRvIHJlYWQgUEZDIHN0YXRzIGZyb20gRU1BQ1xuIik7CiAJCWJueDJ4X2VtYWNfZ2V0X3BmY19zdGF0KHBhcmFtcywgcGZjX2ZyYW1lc19zZW50LAogCQkJCQlwZmNfZnJhbWVzX3JlY2VpdmVkKTsKLQl9IGVsc2UgewotCQlEUChORVRJRl9NU0dfTElOSywgIkFib3V0IHRvIHJlYWQgc3RhdHMgZnJvbSBCTUFDXG4iKTsKLQkJYm54MnhfYm1hYzJfZ2V0X3BmY19zdGF0KHBhcmFtcywgcGZjX2ZyYW1lc19zZW50LAotCQkJCQkgcGZjX2ZyYW1lc19yZWNlaXZlZCk7CiAJfQogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCQkJTUFDL1BCRiBzZWN0aW9uCQkJCSAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBibngyeF9zZXRfbWRpb19jbGsoc3RydWN0IGJueDJ4ICpicCwgdTMyIGNoaXBfaWQsIHU4IHBvcnQpCit7CisJdTMyIG1vZGUsIGVtYWNfYmFzZTsKKwkvKioKKwkgKiBTZXQgY2xhdXNlIDQ1IG1vZGUsIHNsb3cgZG93biB0aGUgTURJTyBjbG9jayB0byAyLjVNSHoKKwkgKiAoYSB2YWx1ZSBvZiA0OT09MHgzMSkgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBBVVRPIHBvbGwgaXMgb2ZmCisJICovCisKKwlpZiAoQ0hJUF9JU19FMihicCkpCisJCWVtYWNfYmFzZSA9IEdSQ0JBU0VfRU1BQzA7CisJZWxzZQorCQllbWFjX2Jhc2UgPSAocG9ydCkgPyBHUkNCQVNFX0VNQUMxIDogR1JDQkFTRV9FTUFDMDsKKwltb2RlID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UgKyBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSk7CisJbW9kZSAmPSB+KEVNQUNfTURJT19NT0RFX0FVVE9fUE9MTCB8CisJCSAgRU1BQ19NRElPX01PREVfQ0xPQ0tfQ05UKTsKKwlpZiAoVVNFU19XQVJQQ09SRShicCkpCisJCW1vZGUgfD0gKDc0TCA8PCBFTUFDX01ESU9fTU9ERV9DTE9DS19DTlRfQklUU0hJRlQpOworCWVsc2UKKwkJbW9kZSB8PSAoNDlMIDw8IEVNQUNfTURJT19NT0RFX0NMT0NLX0NOVF9CSVRTSElGVCk7CisKKwltb2RlIHw9IChFTUFDX01ESU9fTU9ERV9DTEFVU0VfNDUpOworCVJFR19XUihicCwgZW1hY19iYXNlICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUsIG1vZGUpOworCisJdWRlbGF5KDQwKTsKK30KKwogc3RhdGljIHZvaWQgYm54MnhfZW1hY19pbml0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAogCQkJICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCiB7CkBAIC00OTUsNyArMTQ2OSw3IEBACiAJCX0KIAkJdGltZW91dC0tOwogCX0gd2hpbGUgKHZhbCAmIEVNQUNfTU9ERV9SRVNFVCk7Ci0KKwlibngyeF9zZXRfbWRpb19jbGsoYnAsIHBhcmFtcy0+Y2hpcF9pZCwgcG9ydCk7CiAJLyogU2V0IG1hYyBhZGRyZXNzICovCiAJdmFsID0gKChwYXJhbXMtPm1hY19hZGRyWzBdIDw8IDgpIHwKIAkJcGFyYW1zLT5tYWNfYWRkclsxXSk7CkBAIC01MDgsOSArMTQ4MiwyNDYgQEAKIAlFTUFDX1dSKGJwLCBFTUFDX1JFR19FTUFDX01BQ19NQVRDSCArIDQsIHZhbCk7CiB9CiAKLXN0YXRpYyB1OCBibngyeF9lbWFjX2VuYWJsZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKK3N0YXRpYyB2b2lkIGJueDJ4X3NldF94dW1hY19uaWcoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJdTE2IHR4X3BhdXNlX2VuLAorCQkJCXU4IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKworCVJFR19XUihicCwgcGFyYW1zLT5wb3J0ID8gTklHX1JFR19QMV9NQUNfSU5fRU4gOiBOSUdfUkVHX1AwX01BQ19JTl9FTiwKKwkgICAgICAgZW5hYmxlKTsKKwlSRUdfV1IoYnAsIHBhcmFtcy0+cG9ydCA/IE5JR19SRUdfUDFfTUFDX09VVF9FTiA6IE5JR19SRUdfUDBfTUFDX09VVF9FTiwKKwkgICAgICAgZW5hYmxlKTsKKwlSRUdfV1IoYnAsIHBhcmFtcy0+cG9ydCA/IE5JR19SRUdfUDFfTUFDX1BBVVNFX09VVF9FTiA6CisJICAgICAgIE5JR19SRUdfUDBfTUFDX1BBVVNFX09VVF9FTiwgdHhfcGF1c2VfZW4pOworfQorCitzdGF0aWMgdm9pZCBibngyeF91bWFjX2VuYWJsZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKIAkJCSAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzLCB1OCBsYikKIHsKKwl1MzIgdmFsOworCXUzMiB1bWFjX2Jhc2UgPSBwYXJhbXMtPnBvcnQgPyBHUkNCQVNFX1VNQUMxIDogR1JDQkFTRV9VTUFDMDsKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwkvKiBSZXNldCBVTUFDICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9DTEVBUiwKKwkgICAgICAgKE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1VNQUMwIDw8IHBhcmFtcy0+cG9ydCkpOworCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDAwKTsKKworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfU0VULAorCSAgICAgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfVU1BQzAgPDwgcGFyYW1zLT5wb3J0KSk7CisKKwlEUChORVRJRl9NU0dfTElOSywgImVuYWJsaW5nIFVNQUNcbiIpOworCisJLyoqCisJICogVGhpcyByZWdpc3RlciBkZXRlcm1pbmVzIG9uIHdoaWNoIGV2ZW50cyB0aGUgTUFDIHdpbGwgYXNzZXJ0CisJICogZXJyb3Igb24gdGhlIGkvZiB0byB0aGUgTklHIGFsb25nIHcvIEVPUC4KKwkgKi8KKworCS8qKgorCSAqIEJEIFJFR19XUihicCwgTklHX1JFR19QMF9NQUNfUlNWX0VSUl9NQVNLICsKKwkgKiBwYXJhbXMtPnBvcnQqMHgxNCwgICAgICAweGZmZmZmLgorCSAqLworCS8qIFRoaXMgcmVnaXN0ZXIgb3BlbnMgdGhlIGdhdGUgZm9yIHRoZSBVTUFDIGRlc3BpdGUgaXRzIG5hbWUgKi8KKwlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0VNQUMwX1BPUlQgKyBwYXJhbXMtPnBvcnQqNCwgMSk7CisKKwl2YWwgPSBVTUFDX0NPTU1BTkRfQ09ORklHX1JFR19QUk9NSVNfRU4gfAorCQlVTUFDX0NPTU1BTkRfQ09ORklHX1JFR19QQURfRU4gfAorCQlVTUFDX0NPTU1BTkRfQ09ORklHX1JFR19TV19SRVNFVCB8CisJCVVNQUNfQ09NTUFORF9DT05GSUdfUkVHX05PX0xHVEhfQ0hFQ0s7CisJc3dpdGNoICh2YXJzLT5saW5lX3NwZWVkKSB7CisJY2FzZSBTUEVFRF8xMDoKKwkJdmFsIHw9ICgwPDwyKTsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDA6CisJCXZhbCB8PSAoMTw8Mik7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwMDoKKwkJdmFsIHw9ICgyPDwyKTsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8yNTAwOgorCQl2YWwgfD0gKDM8PDIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUChORVRJRl9NU0dfTElOSywgIkludmFsaWQgc3BlZWQgZm9yIFVNQUMgJWRcbiIsCisJCQkgICAgICAgdmFycy0+bGluZV9zcGVlZCk7CisJCWJyZWFrOworCX0KKwlSRUdfV1IoYnAsIHVtYWNfYmFzZSArIFVNQUNfUkVHX0NPTU1BTkRfQ09ORklHLCB2YWwpOworCXVkZWxheSg1MCk7CisKKwkvKiBTZXQgTUFDIGFkZHJlc3MgZm9yIHNvdXJjZSBUWCBQYXVzZS9QRkMgZnJhbWVzICh1bmRlciBTVyByZXNldCkgKi8KKwlSRUdfV1IoYnAsIHVtYWNfYmFzZSArIFVNQUNfUkVHX01BQ19BRERSMCwKKwkgICAgICAgKChwYXJhbXMtPm1hY19hZGRyWzJdIDw8IDI0KSB8CisJCShwYXJhbXMtPm1hY19hZGRyWzNdIDw8IDE2KSB8CisJCShwYXJhbXMtPm1hY19hZGRyWzRdIDw8IDgpIHwKKwkJKHBhcmFtcy0+bWFjX2FkZHJbNV0pKSk7CisJUkVHX1dSKGJwLCB1bWFjX2Jhc2UgKyBVTUFDX1JFR19NQUNfQUREUjEsCisJICAgICAgICgocGFyYW1zLT5tYWNfYWRkclswXSA8PCA4KSB8CisJCShwYXJhbXMtPm1hY19hZGRyWzFdKSkpOworCisJLyogRW5hYmxlIFJYIGFuZCBUWCAqLworCXZhbCAmPSB+VU1BQ19DT01NQU5EX0NPTkZJR19SRUdfUEFEX0VOOworCXZhbCB8PSBVTUFDX0NPTU1BTkRfQ09ORklHX1JFR19UWF9FTkEgfAorCQlVTUFDX0NPTU1BTkRfQ09ORklHX1JFR19SWF9FTkE7CisJUkVHX1dSKGJwLCB1bWFjX2Jhc2UgKyBVTUFDX1JFR19DT01NQU5EX0NPTkZJRywgdmFsKTsKKwl1ZGVsYXkoNTApOworCisJLyogUmVtb3ZlIFNXIFJlc2V0ICovCisJdmFsICY9IH5VTUFDX0NPTU1BTkRfQ09ORklHX1JFR19TV19SRVNFVDsKKworCS8qIENoZWNrIGxvb3BiYWNrIG1vZGUgKi8KKwlpZiAobGIpCisJCXZhbCB8PSBVTUFDX0NPTU1BTkRfQ09ORklHX1JFR19MT09QX0VOQTsKKwlSRUdfV1IoYnAsIHVtYWNfYmFzZSArIFVNQUNfUkVHX0NPTU1BTkRfQ09ORklHLCB2YWwpOworCisJLyoKKwkgKiBNYXhpbXVtIEZyYW1lIExlbmd0aCAoUlcpLiBEZWZpbmVzIGEgMTQtQml0IG1heGltdW0gZnJhbWUKKwkgKiBsZW5ndGggdXNlZCBieSB0aGUgTUFDIHJlY2VpdmUgbG9naWMgdG8gY2hlY2sgZnJhbWVzLgorCSAqLworCVJFR19XUihicCwgdW1hY19iYXNlICsgVU1BQ19SRUdfTUFYRlIsIDB4MjcxMCk7CisJYm54Mnhfc2V0X3h1bWFjX25pZyhwYXJhbXMsCisJCQkgICAgKCh2YXJzLT5mbG93X2N0cmwgJiBCTlgyWF9GTE9XX0NUUkxfVFgpICE9IDApLCAxKTsKKwl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX1VNQUM7CisKK30KKworc3RhdGljIHU4IGJueDJ4X2lzXzRfcG9ydF9tb2RlKHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHBvcnQ0bW9kZV9vdndyX3ZhbDsKKwkvKiBDaGVjayA0LXBvcnQgb3ZlcnJpZGUgZW5hYmxlZCAqLworCXBvcnQ0bW9kZV9vdndyX3ZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfUE9SVDRNT0RFX0VOX09WV1IpOworCWlmIChwb3J0NG1vZGVfb3Z3cl92YWwgJiAoMTw8MCkpIHsKKwkJLyogUmV0dXJuIDQtcG9ydCBtb2RlIG92ZXJyaWRlIHZhbHVlICovCisJCXJldHVybiAoKHBvcnQ0bW9kZV9vdndyX3ZhbCAmICgxPDwxKSkgPT0gKDE8PDEpKTsKKwl9CisJLyogUmV0dXJuIDQtcG9ydCBtb2RlIGZyb20gaW5wdXQgcGluICovCisJcmV0dXJuICh1OClSRUdfUkQoYnAsIE1JU0NfUkVHX1BPUlQ0TU9ERV9FTik7Cit9CisKKy8qIERlZmluZSB0aGUgWE1BQyBtb2RlICovCitzdGF0aWMgdm9pZCBibngyeF94bWFjX2luaXQoc3RydWN0IGJueDJ4ICpicCwgdTMyIG1heF9zcGVlZCkKK3sKKwl1MzIgaXNfcG9ydDRtb2RlID0gYm54MnhfaXNfNF9wb3J0X21vZGUoYnApOworCisJLyoqCisJKiBJbiA0LXBvcnQgbW9kZSwgbmVlZCB0byBzZXQgdGhlIG1vZGUgb25seSBvbmNlLCBzbyBpZiBYTUFDIGlzCisJKiBhbHJlYWR5IG91dCBvZiByZXNldCwgaXQgbWVhbnMgdGhlIG1vZGUgaGFzIGFscmVhZHkgYmVlbiBzZXQsCisJKiBhbmQgaXQgbXVzdCBub3QqIHJlc2V0IHRoZSBYTUFDIGFnYWluLCBzaW5jZSBpdCBjb250cm9scyBib3RoCisJKiBwb3J0cyBvZiB0aGUgcGF0aAorCSoqLworCisJaWYgKGlzX3BvcnQ0bW9kZSAmJiAoUkVHX1JEKGJwLCBNSVNDX1JFR19SRVNFVF9SRUdfMikgJgorCSAgICAgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfWE1BQykpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJYTUFDIGFscmVhZHkgb3V0IG9mIHJlc2V0IgorCQkJCSAgICIgaW4gNC1wb3J0IG1vZGVcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogSGFyZCByZXNldCAqLworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfQ0xFQVIsCisJICAgICAgIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1hNQUMpOworCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDAwKTsKKworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfU0VULAorCSAgICAgICBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9YTUFDKTsKKwlpZiAoaXNfcG9ydDRtb2RlKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiSW5pdCBYTUFDIHRvIDIgcG9ydHMgeCAxMEcgcGVyIHBhdGhcbiIpOworCisJCS8qICBTZXQgdGhlIG51bWJlciBvZiBwb3J0cyBvbiB0aGUgc3lzdGVtIHNpZGUgdG8gdXAgdG8gMiAqLworCQlSRUdfV1IoYnAsIE1JU0NfUkVHX1hNQUNfQ09SRV9QT1JUX01PREUsIDEpOworCisJCS8qIFNldCB0aGUgbnVtYmVyIG9mIHBvcnRzIG9uIHRoZSBXYXJwIENvcmUgdG8gMTBHICovCisJCVJFR19XUihicCwgTUlTQ19SRUdfWE1BQ19QSFlfUE9SVF9NT0RFLCAzKTsKKwl9IGVsc2UgeworCQkvKiAgU2V0IHRoZSBudW1iZXIgb2YgcG9ydHMgb24gdGhlIHN5c3RlbSBzaWRlIHRvIDEgKi8KKwkJUkVHX1dSKGJwLCBNSVNDX1JFR19YTUFDX0NPUkVfUE9SVF9NT0RFLCAwKTsKKwkJaWYgKG1heF9zcGVlZCA9PSBTUEVFRF8xMDAwMCkgeworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJJbml0IFhNQUMgdG8gMTBHIHggMSIKKwkJCQkJICAgIiBwb3J0IHBlciBwYXRoXG4iKTsKKwkJCS8qIFNldCB0aGUgbnVtYmVyIG9mIHBvcnRzIG9uIHRoZSBXYXJwIENvcmUgdG8gMTBHICovCisJCQlSRUdfV1IoYnAsIE1JU0NfUkVHX1hNQUNfUEhZX1BPUlRfTU9ERSwgMyk7CisJCX0gZWxzZSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgIkluaXQgWE1BQyB0byAyMEcgeCAyIHBvcnRzIgorCQkJCQkgICAiIHBlciBwYXRoXG4iKTsKKwkJCS8qIFNldCB0aGUgbnVtYmVyIG9mIHBvcnRzIG9uIHRoZSBXYXJwIENvcmUgdG8gMjBHICovCisJCQlSRUdfV1IoYnAsIE1JU0NfUkVHX1hNQUNfUEhZX1BPUlRfTU9ERSwgMSk7CisJCX0KKwl9CisJLyogU29mdCByZXNldCAqLworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfQ0xFQVIsCisJICAgICAgIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1hNQUNfU09GVCk7CisJdXNsZWVwX3JhbmdlKDEwMDAsIDEwMDApOworCisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9TRVQsCisJICAgICAgIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1hNQUNfU09GVCk7CisKK30KKworc3RhdGljIHZvaWQgYm54MnhfeG1hY19kaXNhYmxlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQoreworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTMyIHhtYWNfYmFzZSA9IChwb3J0KSA/IEdSQ0JBU0VfWE1BQzEgOiBHUkNCQVNFX1hNQUMwOworCisJaWYgKFJFR19SRChicCwgTUlTQ19SRUdfUkVTRVRfUkVHXzIpICYKKwkgICAgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfWE1BQykgeworCQlEUChORVRJRl9NU0dfTElOSywgIkRpc2FibGUgWE1BQyBvbiBwb3J0ICV4XG4iLCBwb3J0KTsKKwkJUkVHX1dSKGJwLCB4bWFjX2Jhc2UgKyBYTUFDX1JFR19DVFJMLCAwKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDEwMDApOworCQlibngyeF9zZXRfeHVtYWNfbmlnKHBhcmFtcywgMCwgMCk7CisJCVJFR19XUihicCwgeG1hY19iYXNlICsgWE1BQ19SRUdfQ1RSTCwKKwkJICAgICAgIFhNQUNfQ1RSTF9SRUdfU09GVF9SRVNFVCk7CisJfQorfQorCitzdGF0aWMgaW50IGJueDJ4X3htYWNfZW5hYmxlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzLCB1OCBsYikKK3sKKwl1MzIgdmFsLCB4bWFjX2Jhc2U7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJRFAoTkVUSUZfTVNHX0xJTkssICJlbmFibGluZyBYTUFDXG4iKTsKKworCXhtYWNfYmFzZSA9IChwYXJhbXMtPnBvcnQpID8gR1JDQkFTRV9YTUFDMSA6IEdSQ0JBU0VfWE1BQzA7CisKKwlibngyeF94bWFjX2luaXQoYnAsIHZhcnMtPmxpbmVfc3BlZWQpOworCisJLyoKKwkgKiBUaGlzIHJlZ2lzdGVyIGRldGVybWluZXMgb24gd2hpY2ggZXZlbnRzIHRoZSBNQUMgd2lsbCBhc3NlcnQKKwkgKiBlcnJvciBvbiB0aGUgaS9mIHRvIHRoZSBOSUcgYWxvbmcgdy8gRU9QLgorCSAqLworCisJLyoKKwkgKiBUaGlzIHJlZ2lzdGVyIHRlbGxzIHRoZSBOSUcgd2hldGhlciB0byBzZW5kIHRyYWZmaWMgdG8gVU1BQworCSAqIG9yIFhNQUMKKwkgKi8KKwlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0VNQUMwX1BPUlQgKyBwYXJhbXMtPnBvcnQqNCwgMCk7CisKKwkvKiBTZXQgTWF4IHBhY2tldCBzaXplICovCisJUkVHX1dSKGJwLCB4bWFjX2Jhc2UgKyBYTUFDX1JFR19SWF9NQVhfU0laRSwgMHgyNzEwKTsKKworCS8qIENSQyBhcHBlbmQgZm9yIFR4IHBhY2tldHMgKi8KKwlSRUdfV1IoYnAsIHhtYWNfYmFzZSArIFhNQUNfUkVHX1RYX0NUUkwsIDB4QzgwMCk7CisKKwkvKiB1cGRhdGUgUEZDICovCisJYm54MnhfdXBkYXRlX3BmY194bWFjKHBhcmFtcywgdmFycywgMCk7CisKKwkvKiBFbmFibGUgVFggYW5kIFJYICovCisJdmFsID0gWE1BQ19DVFJMX1JFR19UWF9FTiB8IFhNQUNfQ1RSTF9SRUdfUlhfRU47CisKKwkvKiBDaGVjayBsb29wYmFjayBtb2RlICovCisJaWYgKGxiKQorCQl2YWwgfD0gWE1BQ19DVFJMX1JFR19DT1JFX0xPQ0FMX0xQQks7CisJUkVHX1dSKGJwLCB4bWFjX2Jhc2UgKyBYTUFDX1JFR19DVFJMLCB2YWwpOworCWJueDJ4X3NldF94dW1hY19uaWcocGFyYW1zLAorCQkJICAgICgodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKSAhPSAwKSwgMSk7CisKKwl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX1hNQUM7CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgYm54MnhfZW1hY19lbmFibGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsIHU4IGxiKQorewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CiAJdTMyIGVtYWNfYmFzZSA9IHBvcnQgPyBHUkNCQVNFX0VNQUMxIDogR1JDQkFTRV9FTUFDMDsKQEAgLTc2MCw5NSArMTk3MSwzOTggQEAKIAlSRUdfV1JfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDMl9SRUdJU1RFUl9CTUFDX0NPTlRST0wsIHdiX2RhdGEsIDIpOwogfQogCi1zdGF0aWMgdm9pZCBibngyeF91cGRhdGVfcGZjX2JyYihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJc3RydWN0IGxpbmtfdmFycyAqdmFycywKLQkJc3RydWN0IGJueDJ4X25pZ19icmJfcGZjX3BvcnRfcGFyYW1zICpwZmNfcGFyYW1zKQorCisvKiBQRkMgQlJCIGludGVybmFsIHBvcnQgY29uZmlndXJhdGlvbiBwYXJhbXMgKi8KK3N0cnVjdCBibngyeF9wZmNfYnJiX3RocmVzaG9sZF92YWwgeworCXUzMiBwYXVzZV94b2ZmOworCXUzMiBwYXVzZV94b247CisJdTMyIGZ1bGxfeG9mZjsKKwl1MzIgZnVsbF94b247Cit9OworCitzdHJ1Y3QgYm54MnhfcGZjX2JyYl9lM2IwX3ZhbCB7CisJdTMyIGZ1bGxfbGJfeG9mZl90aDsKKwl1MzIgZnVsbF9sYl94b25fdGhyZXNob2xkOworCXUzMiBsYl9ndWFyYW50aWVkOworCXUzMiBtYWNfMF9jbGFzc190X2d1YXJhbnRpZWQ7CisJdTMyIG1hY18wX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0OworCXUzMiBtYWNfMV9jbGFzc190X2d1YXJhbnRpZWQ7CisJdTMyIG1hY18xX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0OworfTsKKworc3RydWN0IGJueDJ4X3BmY19icmJfdGhfdmFsIHsKKwlzdHJ1Y3QgYm54MnhfcGZjX2JyYl90aHJlc2hvbGRfdmFsIHBhdXNlYWJsZV90aDsKKwlzdHJ1Y3QgYm54MnhfcGZjX2JyYl90aHJlc2hvbGRfdmFsIG5vbl9wYXVzZWFibGVfdGg7Cit9Oworc3RhdGljIGludCBibngyeF9wZmNfYnJiX2dldF9jb25maWdfcGFyYW1zKAorCQkJCXN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCXN0cnVjdCBibngyeF9wZmNfYnJiX3RoX3ZhbCAqY29uZmlnX3ZhbCkKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgUEZDIEJSQiBjb25maWd1cmF0aW9uXG4iKTsKKwlpZiAoQ0hJUF9JU19FMihicCkpIHsKKwkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLnBhdXNlX3hvZmYgPQorCQkgICAgUEZDX0UyX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfUEFVU0U7CisJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5wYXVzZV94b24gPQorCQkgICAgUEZDX0UyX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9QQVVTRTsKKwkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLmZ1bGxfeG9mZiA9CisJCSAgICBQRkNfRTJfQlJCX01BQ19GVUxMX1hPRkZfVEhSX1BBVVNFOworCQljb25maWdfdmFsLT5wYXVzZWFibGVfdGguZnVsbF94b24gPQorCQkgICAgUEZDX0UyX0JSQl9NQUNfRlVMTF9YT05fVEhSX1BBVVNFOworCQkvKiBub24gcGF1c2UgYWJsZSovCisJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGgucGF1c2VfeG9mZiA9CisJCSAgICBQRkNfRTJfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUl9OT05fUEFVU0U7CisJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGgucGF1c2VfeG9uID0KKwkJICAgIFBGQ19FMl9CUkJfTUFDX1BBVVNFX1hPTl9USFJfTk9OX1BBVVNFOworCQljb25maWdfdmFsLT5ub25fcGF1c2VhYmxlX3RoLmZ1bGxfeG9mZiA9CisJCSAgICBQRkNfRTJfQlJCX01BQ19GVUxMX1hPRkZfVEhSX05PTl9QQVVTRTsKKwkJY29uZmlnX3ZhbC0+bm9uX3BhdXNlYWJsZV90aC5mdWxsX3hvbiA9CisJCSAgICBQRkNfRTJfQlJCX01BQ19GVUxMX1hPTl9USFJfTk9OX1BBVVNFOworCX0gZWxzZSBpZiAoQ0hJUF9JU19FM0EwKGJwKSkgeworCQljb25maWdfdmFsLT5wYXVzZWFibGVfdGgucGF1c2VfeG9mZiA9CisJCSAgICBQRkNfRTNBMF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX1BBVVNFOworCQljb25maWdfdmFsLT5wYXVzZWFibGVfdGgucGF1c2VfeG9uID0KKwkJICAgIFBGQ19FM0EwX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9QQVVTRTsKKwkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLmZ1bGxfeG9mZiA9CisJCSAgICBQRkNfRTNBMF9CUkJfTUFDX0ZVTExfWE9GRl9USFJfUEFVU0U7CisJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5mdWxsX3hvbiA9CisJCSAgICBQRkNfRTNBMF9CUkJfTUFDX0ZVTExfWE9OX1RIUl9QQVVTRTsKKwkJLyogbm9uIHBhdXNlIGFibGUqLworCQljb25maWdfdmFsLT5ub25fcGF1c2VhYmxlX3RoLnBhdXNlX3hvZmYgPQorCQkgICAgUEZDX0UzQTBfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUl9OT05fUEFVU0U7CisJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGgucGF1c2VfeG9uID0KKwkJICAgIFBGQ19FM0EwX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9OT05fUEFVU0U7CisJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGguZnVsbF94b2ZmID0KKwkJICAgIFBGQ19FM0EwX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9OT05fUEFVU0U7CisJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGguZnVsbF94b24gPQorCQkgICAgUEZDX0UzQTBfQlJCX01BQ19GVUxMX1hPTl9USFJfTk9OX1BBVVNFOworCX0gZWxzZSBpZiAoQ0hJUF9JU19FM0IwKGJwKSkgeworCQlpZiAocGFyYW1zLT5waHlbSU5UX1BIWV0uZmxhZ3MgJgorCQkgICAgRkxBR1NfNF9QT1JUX01PREUpIHsKKwkJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5wYXVzZV94b2ZmID0KKwkJCSAgICBQRkNfRTNCMF80UF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX1BBVVNFOworCQkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLnBhdXNlX3hvbiA9CisJCQkgICAgUEZDX0UzQjBfNFBfQlJCX01BQ19QQVVTRV9YT05fVEhSX1BBVVNFOworCQkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLmZ1bGxfeG9mZiA9CisJCQkgICAgUEZDX0UzQjBfNFBfQlJCX01BQ19GVUxMX1hPRkZfVEhSX1BBVVNFOworCQkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLmZ1bGxfeG9uID0KKwkJCSAgICBQRkNfRTNCMF80UF9CUkJfTUFDX0ZVTExfWE9OX1RIUl9QQVVTRTsKKwkJCS8qIG5vbiBwYXVzZSBhYmxlKi8KKwkJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGgucGF1c2VfeG9mZiA9CisJCQkgICAgUEZDX0UzQjBfNFBfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUl9OT05fUEFVU0U7CisJCQljb25maWdfdmFsLT5ub25fcGF1c2VhYmxlX3RoLnBhdXNlX3hvbiA9CisJCQkgICAgUEZDX0UzQjBfNFBfQlJCX01BQ19QQVVTRV9YT05fVEhSX05PTl9QQVVTRTsKKwkJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGguZnVsbF94b2ZmID0KKwkJCSAgICBQRkNfRTNCMF80UF9CUkJfTUFDX0ZVTExfWE9GRl9USFJfTk9OX1BBVVNFOworCQkJY29uZmlnX3ZhbC0+bm9uX3BhdXNlYWJsZV90aC5mdWxsX3hvbiA9CisJCQkgICAgUEZDX0UzQjBfNFBfQlJCX01BQ19GVUxMX1hPTl9USFJfTk9OX1BBVVNFOworCSAgICB9IGVsc2UgeworCQljb25maWdfdmFsLT5wYXVzZWFibGVfdGgucGF1c2VfeG9mZiA9CisJCSAgICBQRkNfRTNCMF8yUF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX1BBVVNFOworCQljb25maWdfdmFsLT5wYXVzZWFibGVfdGgucGF1c2VfeG9uID0KKwkJICAgIFBGQ19FM0IwXzJQX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9QQVVTRTsKKwkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLmZ1bGxfeG9mZiA9CisJCSAgICBQRkNfRTNCMF8yUF9CUkJfTUFDX0ZVTExfWE9GRl9USFJfUEFVU0U7CisJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5mdWxsX3hvbiA9CisJCQlQRkNfRTNCMF8yUF9CUkJfTUFDX0ZVTExfWE9OX1RIUl9QQVVTRTsKKwkJLyogbm9uIHBhdXNlIGFibGUqLworCQljb25maWdfdmFsLT5ub25fcGF1c2VhYmxlX3RoLnBhdXNlX3hvZmYgPQorCQkgICAgUEZDX0UzQjBfMlBfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUl9OT05fUEFVU0U7CisJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGgucGF1c2VfeG9uID0KKwkJICAgIFBGQ19FM0IwXzJQX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9OT05fUEFVU0U7CisJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGguZnVsbF94b2ZmID0KKwkJICAgIFBGQ19FM0IwXzJQX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9OT05fUEFVU0U7CisJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGguZnVsbF94b24gPQorCQkgICAgUEZDX0UzQjBfMlBfQlJCX01BQ19GVUxMX1hPTl9USFJfTk9OX1BBVVNFOworCSAgICB9CisJfSBlbHNlCisJICAgIHJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYm54MnhfcGZjX2JyYl9nZXRfZTNiMF9jb25maWdfcGFyYW1zKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCQkJIHN0cnVjdCBibngyeF9wZmNfYnJiX2UzYjBfdmFsCisJCQkJCQkgKmUzYjBfdmFsLAorCQkJCQkJIHUzMiBjb3MwX3BhdXNlYWJsZSwKKwkJCQkJCSB1MzIgY29zMV9wYXVzZWFibGUpCit7CisJaWYgKHBhcmFtcy0+cGh5W0lOVF9QSFldLmZsYWdzICYgRkxBR1NfNF9QT1JUX01PREUpIHsKKwkJZTNiMF92YWwtPmZ1bGxfbGJfeG9mZl90aCA9CisJCSAgICBQRkNfRTNCMF80UF9CUkJfRlVMTF9MQl9YT0ZGX1RIUjsKKwkJZTNiMF92YWwtPmZ1bGxfbGJfeG9uX3RocmVzaG9sZCA9CisJCSAgICBQRkNfRTNCMF80UF9CUkJfRlVMTF9MQl9YT05fVEhSOworCQllM2IwX3ZhbC0+bGJfZ3VhcmFudGllZCA9CisJCSAgICBQRkNfRTNCMF80UF9MQl9HVUFSVDsKKwkJZTNiMF92YWwtPm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZCA9CisJCSAgICBQRkNfRTNCMF80UF9CUkJfTUFDXzBfQ0xBU1NfVF9HVUFSVDsKKwkJZTNiMF92YWwtPm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0ID0KKwkJICAgIFBGQ19FM0IwXzRQX0JSQl9NQUNfMF9DTEFTU19UX0dVQVJUX0hZU1Q7CisJCWUzYjBfdmFsLT5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWQgPQorCQkgICAgUEZDX0UzQjBfNFBfQlJCX01BQ18xX0NMQVNTX1RfR1VBUlQ7CisJCWUzYjBfdmFsLT5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCA9CisJCSAgICBQRkNfRTNCMF80UF9CUkJfTUFDXzFfQ0xBU1NfVF9HVUFSVF9IWVNUOworCX0gZWxzZSB7CisJCWUzYjBfdmFsLT5mdWxsX2xiX3hvZmZfdGggPQorCQkgICAgUEZDX0UzQjBfMlBfQlJCX0ZVTExfTEJfWE9GRl9USFI7CisJCWUzYjBfdmFsLT5mdWxsX2xiX3hvbl90aHJlc2hvbGQgPQorCQkgICAgUEZDX0UzQjBfMlBfQlJCX0ZVTExfTEJfWE9OX1RIUjsKKwkJZTNiMF92YWwtPm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0ID0KKwkJICAgIFBGQ19FM0IwXzJQX0JSQl9NQUNfMF9DTEFTU19UX0dVQVJUX0hZU1Q7CisJCWUzYjBfdmFsLT5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWQgPQorCQkgICAgUEZDX0UzQjBfMlBfQlJCX01BQ18xX0NMQVNTX1RfR1VBUlQ7CisJCWUzYjBfdmFsLT5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCA9CisJCSAgICBQRkNfRTNCMF8yUF9CUkJfTUFDXzFfQ0xBU1NfVF9HVUFSVF9IWVNUOworCisJCWlmIChjb3MwX3BhdXNlYWJsZSAhPSBjb3MxX3BhdXNlYWJsZSkgeworCQkJLyogbm9ucGF1c2VhYmxlPSBMb3NzeSArIHBhdXNlYWJsZSA9IExvc3NsZXNzKi8KKwkJCWUzYjBfdmFsLT5sYl9ndWFyYW50aWVkID0KKwkJCSAgICBQRkNfRTNCMF8yUF9NSVhfUEFVU0VfTEJfR1VBUlQ7CisJCQllM2IwX3ZhbC0+bWFjXzBfY2xhc3NfdF9ndWFyYW50aWVkID0KKwkJCSAgICBQRkNfRTNCMF8yUF9NSVhfUEFVU0VfTUFDXzBfQ0xBU1NfVF9HVUFSVDsKKwkJfSBlbHNlIGlmIChjb3MwX3BhdXNlYWJsZSkgeworCQkJLyogTG9zc2xlc3MgK0xvc3NsZXNzKi8KKwkJCWUzYjBfdmFsLT5sYl9ndWFyYW50aWVkID0KKwkJCSAgICBQRkNfRTNCMF8yUF9QQVVTRV9MQl9HVUFSVDsKKwkJCWUzYjBfdmFsLT5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWQgPQorCQkJICAgIFBGQ19FM0IwXzJQX1BBVVNFX01BQ18wX0NMQVNTX1RfR1VBUlQ7CisJCX0gZWxzZSB7CisJCQkvKiBMb3NzeSArTG9zc3kqLworCQkJZTNiMF92YWwtPmxiX2d1YXJhbnRpZWQgPQorCQkJICAgIFBGQ19FM0IwXzJQX05PTl9QQVVTRV9MQl9HVUFSVDsKKwkJCWUzYjBfdmFsLT5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWQgPQorCQkJICAgIFBGQ19FM0IwXzJQX05PTl9QQVVTRV9NQUNfMF9DTEFTU19UX0dVQVJUOworCQl9CisJfQorfQorc3RhdGljIGludCBibngyeF91cGRhdGVfcGZjX2JyYihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQlzdHJ1Y3QgbGlua192YXJzICp2YXJzLAorCQkJCXN0cnVjdCBibngyeF9uaWdfYnJiX3BmY19wb3J0X3BhcmFtcworCQkJCSpwZmNfcGFyYW1zKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXN0cnVjdCBibngyeF9wZmNfYnJiX3RoX3ZhbCBjb25maWdfdmFsID0geyB7MH0gfTsKKwlzdHJ1Y3QgYm54MnhfcGZjX2JyYl90aHJlc2hvbGRfdmFsICpyZWdfdGhfY29uZmlnID0KKwkgICAgJmNvbmZpZ192YWwucGF1c2VhYmxlX3RoOworCXN0cnVjdCBibngyeF9wZmNfYnJiX2UzYjBfdmFsIGUzYjBfdmFsID0gezB9OwogCWludCBzZXRfcGZjID0gcGFyYW1zLT5mZWF0dXJlX2NvbmZpZ19mbGFncyAmCiAJCUZFQVRVUkVfQ09ORklHX1BGQ19FTkFCTEVEOworCWludCBibngyeF9zdGF0dXMgPSAwOworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CiAKIAkvKiBkZWZhdWx0IC0gcGF1c2UgY29uZmlndXJhdGlvbiAqLwotCXUzMiBwYXVzZV94b2ZmX3RoID0gUEZDX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJFU0hPTERfUEFVU0VBQkxFOwotCXUzMiBwYXVzZV94b25fdGggPSBQRkNfQlJCX01BQ19QQVVTRV9YT05fVEhSRVNIT0xEX1BBVVNFQUJMRTsKLQl1MzIgZnVsbF94b2ZmX3RoID0gUEZDX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUkVTSE9MRF9QQVVTRUFCTEU7Ci0JdTMyIGZ1bGxfeG9uX3RoID0gUEZDX0JSQl9NQUNfRlVMTF9YT05fVEhSRVNIT0xEX1BBVVNFQUJMRTsKKwlyZWdfdGhfY29uZmlnID0gJmNvbmZpZ192YWwucGF1c2VhYmxlX3RoOworCWJueDJ4X3N0YXR1cyA9IGJueDJ4X3BmY19icmJfZ2V0X2NvbmZpZ19wYXJhbXMocGFyYW1zLCAmY29uZmlnX3ZhbCk7CisJaWYgKDAgIT0gYm54Mnhfc3RhdHVzKQorCQlyZXR1cm4gYm54Mnhfc3RhdHVzOwogCiAJaWYgKHNldF9wZmMgJiYgcGZjX3BhcmFtcykKIAkJLyogRmlyc3QgQ09TICovCi0JCWlmICghcGZjX3BhcmFtcy0+Y29zMF9wYXVzZWFibGUpIHsKLQkJCXBhdXNlX3hvZmZfdGggPQotCQkJICBQRkNfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUkVTSE9MRF9OT05fUEFVU0VBQkxFOwotCQkJcGF1c2VfeG9uX3RoID0KLQkJCSAgUEZDX0JSQl9NQUNfUEFVU0VfWE9OX1RIUkVTSE9MRF9OT05fUEFVU0VBQkxFOwotCQkJZnVsbF94b2ZmX3RoID0KLQkJCSAgUEZDX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUkVTSE9MRF9OT05fUEFVU0VBQkxFOwotCQkJZnVsbF94b25fdGggPQotCQkJICBQRkNfQlJCX01BQ19GVUxMX1hPTl9USFJFU0hPTERfTk9OX1BBVVNFQUJMRTsKLQkJfQorCQlpZiAoIXBmY19wYXJhbXMtPmNvczBfcGF1c2VhYmxlKQorCQkJcmVnX3RoX2NvbmZpZyA9ICZjb25maWdfdmFsLm5vbl9wYXVzZWFibGVfdGg7CiAJLyoKIAkgKiBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGJlbG93IHdoaWNoIHRoZSBwYXVzZSBzaWduYWwgdG8gY2xhc3MgMAogCSAqIG9mIE1BQyAjbiBpcyBhc3NlcnRlZC4gbj0wLDEKIAkgKi8KLQlSRUdfV1IoYnAsIEJSQjFfUkVHX1BBVVNFXzBfWE9GRl9USFJFU0hPTERfMCAsIHBhdXNlX3hvZmZfdGgpOworCVJFR19XUihicCwgKHBvcnQpID8gQlJCMV9SRUdfUEFVU0VfMF9YT0ZGX1RIUkVTSE9MRF8xIDoKKwkgICAgICAgQlJCMV9SRUdfUEFVU0VfMF9YT0ZGX1RIUkVTSE9MRF8wICwKKwkgICAgICAgcmVnX3RoX2NvbmZpZy0+cGF1c2VfeG9mZik7CiAJLyoKIAkgKiBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGFib3ZlIHdoaWNoIHRoZSBwYXVzZSBzaWduYWwgdG8gY2xhc3MgMAogCSAqIG9mIE1BQyAjbiBpcyBkZS1hc3NlcnRlZC4gbj0wLDEKIAkgKi8KLQlSRUdfV1IoYnAsIEJSQjFfUkVHX1BBVVNFXzBfWE9OX1RIUkVTSE9MRF8wICwgcGF1c2VfeG9uX3RoKTsKKwlSRUdfV1IoYnAsIChwb3J0KSA/IEJSQjFfUkVHX1BBVVNFXzBfWE9OX1RIUkVTSE9MRF8xIDoKKwkgICAgICAgQlJCMV9SRUdfUEFVU0VfMF9YT05fVEhSRVNIT0xEXzAgLCByZWdfdGhfY29uZmlnLT5wYXVzZV94b24pOwogCS8qCiAJICogVGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBiZWxvdyB3aGljaCB0aGUgZnVsbCBzaWduYWwgdG8gY2xhc3MgMAogCSAqIG9mIE1BQyAjbiBpcyBhc3NlcnRlZC4gbj0wLDEKIAkgKi8KLQlSRUdfV1IoYnAsIEJSQjFfUkVHX0ZVTExfMF9YT0ZGX1RIUkVTSE9MRF8wICwgZnVsbF94b2ZmX3RoKTsKKwlSRUdfV1IoYnAsIChwb3J0KSA/IEJSQjFfUkVHX0ZVTExfMF9YT0ZGX1RIUkVTSE9MRF8xIDoKKwkgICAgICAgQlJCMV9SRUdfRlVMTF8wX1hPRkZfVEhSRVNIT0xEXzAgLCByZWdfdGhfY29uZmlnLT5mdWxsX3hvZmYpOwogCS8qCiAJICogVGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBhYm92ZSB3aGljaCB0aGUgZnVsbCBzaWduYWwgdG8gY2xhc3MgMAogCSAqIG9mIE1BQyAjbiBpcyBkZS1hc3NlcnRlZC4gbj0wLDEKIAkgKi8KLQlSRUdfV1IoYnAsIEJSQjFfUkVHX0ZVTExfMF9YT05fVEhSRVNIT0xEXzAgLCBmdWxsX3hvbl90aCk7CisJUkVHX1dSKGJwLCAocG9ydCkgPyBCUkIxX1JFR19GVUxMXzBfWE9OX1RIUkVTSE9MRF8xIDoKKwkgICAgICAgQlJCMV9SRUdfRlVMTF8wX1hPTl9USFJFU0hPTERfMCAsIHJlZ190aF9jb25maWctPmZ1bGxfeG9uKTsKIAogCWlmIChzZXRfcGZjICYmIHBmY19wYXJhbXMpIHsKIAkJLyogU2Vjb25kIENPUyAqLwotCQlpZiAocGZjX3BhcmFtcy0+Y29zMV9wYXVzZWFibGUpIHsKLQkJCXBhdXNlX3hvZmZfdGggPQotCQkJICBQRkNfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUkVTSE9MRF9QQVVTRUFCTEU7Ci0JCQlwYXVzZV94b25fdGggPQotCQkJICBQRkNfQlJCX01BQ19QQVVTRV9YT05fVEhSRVNIT0xEX1BBVVNFQUJMRTsKLQkJCWZ1bGxfeG9mZl90aCA9Ci0JCQkgIFBGQ19CUkJfTUFDX0ZVTExfWE9GRl9USFJFU0hPTERfUEFVU0VBQkxFOwotCQkJZnVsbF94b25fdGggPQotCQkJICBQRkNfQlJCX01BQ19GVUxMX1hPTl9USFJFU0hPTERfUEFVU0VBQkxFOwotCQl9IGVsc2UgewotCQkJcGF1c2VfeG9mZl90aCA9Ci0JCQkgIFBGQ19CUkJfTUFDX1BBVVNFX1hPRkZfVEhSRVNIT0xEX05PTl9QQVVTRUFCTEU7Ci0JCQlwYXVzZV94b25fdGggPQotCQkJICBQRkNfQlJCX01BQ19QQVVTRV9YT05fVEhSRVNIT0xEX05PTl9QQVVTRUFCTEU7Ci0JCQlmdWxsX3hvZmZfdGggPQotCQkJICBQRkNfQlJCX01BQ19GVUxMX1hPRkZfVEhSRVNIT0xEX05PTl9QQVVTRUFCTEU7Ci0JCQlmdWxsX3hvbl90aCA9Ci0JCQkgIFBGQ19CUkJfTUFDX0ZVTExfWE9OX1RIUkVTSE9MRF9OT05fUEFVU0VBQkxFOwotCQl9CisJCWlmIChwZmNfcGFyYW1zLT5jb3MxX3BhdXNlYWJsZSkKKwkJCXJlZ190aF9jb25maWcgPSAmY29uZmlnX3ZhbC5wYXVzZWFibGVfdGg7CisJCWVsc2UKKwkJCXJlZ190aF9jb25maWcgPSAmY29uZmlnX3ZhbC5ub25fcGF1c2VhYmxlX3RoOwogCQkvKgogCQkgKiBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGJlbG93IHdoaWNoIHRoZSBwYXVzZSBzaWduYWwgdG8KIAkJICogY2xhc3MgMSBvZiBNQUMgI24gaXMgYXNzZXJ0ZWQuIG49MCwxCi0JCSAqLwotCQlSRUdfV1IoYnAsIEJSQjFfUkVHX1BBVVNFXzFfWE9GRl9USFJFU0hPTERfMCwgcGF1c2VfeG9mZl90aCk7CisJCSoqLworCQlSRUdfV1IoYnAsIChwb3J0KSA/IEJSQjFfUkVHX1BBVVNFXzFfWE9GRl9USFJFU0hPTERfMSA6CisJCSAgICAgICBCUkIxX1JFR19QQVVTRV8xX1hPRkZfVEhSRVNIT0xEXzAsCisJCSAgICAgICByZWdfdGhfY29uZmlnLT5wYXVzZV94b2ZmKTsKIAkJLyoKIAkJICogVGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBhYm92ZSB3aGljaCB0aGUgcGF1c2Ugc2lnbmFsIHRvCiAJCSAqIGNsYXNzIDEgb2YgTUFDICNuIGlzIGRlLWFzc2VydGVkLiBuPTAsMQogCQkgKi8KLQkJUkVHX1dSKGJwLCBCUkIxX1JFR19QQVVTRV8xX1hPTl9USFJFU0hPTERfMCwgcGF1c2VfeG9uX3RoKTsKKwkJUkVHX1dSKGJwLCAocG9ydCkgPyBCUkIxX1JFR19QQVVTRV8xX1hPTl9USFJFU0hPTERfMSA6CisJCSAgICAgICBCUkIxX1JFR19QQVVTRV8xX1hPTl9USFJFU0hPTERfMCwKKwkJICAgICAgIHJlZ190aF9jb25maWctPnBhdXNlX3hvbik7CiAJCS8qCiAJCSAqIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYmVsb3cgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvCiAJCSAqIGNsYXNzIDEgb2YgTUFDICNuIGlzIGFzc2VydGVkLiBuPTAsMQogCQkgKi8KLQkJUkVHX1dSKGJwLCBCUkIxX1JFR19GVUxMXzFfWE9GRl9USFJFU0hPTERfMCwgZnVsbF94b2ZmX3RoKTsKKwkJUkVHX1dSKGJwLCAocG9ydCkgPyBCUkIxX1JFR19GVUxMXzFfWE9GRl9USFJFU0hPTERfMSA6CisJCSAgICAgICBCUkIxX1JFR19GVUxMXzFfWE9GRl9USFJFU0hPTERfMCwKKwkJICAgICAgIHJlZ190aF9jb25maWctPmZ1bGxfeG9mZik7CiAJCS8qCiAJCSAqIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvCiAJCSAqIGNsYXNzIDEgb2YgTUFDICNuIGlzIGRlLWFzc2VydGVkLiBuPTAsMQogCQkgKi8KLQkJUkVHX1dSKGJwLCBCUkIxX1JFR19GVUxMXzFfWE9OX1RIUkVTSE9MRF8wLCBmdWxsX3hvbl90aCk7CisJCVJFR19XUihicCwgKHBvcnQpID8gQlJCMV9SRUdfRlVMTF8xX1hPTl9USFJFU0hPTERfMSA6CisJCSAgICAgICBCUkIxX1JFR19GVUxMXzFfWE9OX1RIUkVTSE9MRF8wLAorCQkgICAgICAgcmVnX3RoX2NvbmZpZy0+ZnVsbF94b24pOworCisKKwkJaWYgKENISVBfSVNfRTNCMChicCkpIHsKKwkJCS8qU2hvdWxkIGJlIGRvbmUgYnkgaW5pdCB0b29sICovCisJCQkvKgorCQkJKiBCUkJfZW1wdHlfZm9yX2R1cCA9IEJSQjFfUkVHX0JSQl9FTVBUWV9USFJFU0hPTEQKKwkJCSogcmVzZXQgdmFsdWUKKwkJCSogOTQ0CisJCQkqLworCisJCQkvKioKKwkJCSAqIFRoZSBoeXN0ZXJlc2lzIG9uIHRoZSBndWFyYW50aWVkIGJ1ZmZlciBzcGFjZSBmb3IgdGhlIExiIHBvcnQKKwkJCSAqIGJlZm9yZSBzaWduYWxpbmcgWE9OLgorCQkJICoqLworCQkJUkVHX1dSKGJwLCBCUkIxX1JFR19MQl9HVUFSQU5USUVEX0hZU1QsIDgwKTsKKworCQkJYm54MnhfcGZjX2JyYl9nZXRfZTNiMF9jb25maWdfcGFyYW1zKAorCQkJICAgIHBhcmFtcywKKwkJCSAgICAmZTNiMF92YWwsCisJCQkgICAgcGZjX3BhcmFtcy0+Y29zMF9wYXVzZWFibGUsCisJCQkgICAgcGZjX3BhcmFtcy0+Y29zMV9wYXVzZWFibGUpOworCQkJLyoqCisJCQkgKiBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGJlbG93IHdoaWNoIHRoZSBmdWxsIHNpZ25hbCB0byB0aGUKKwkJCSAqIExCIHBvcnQgaXMgYXNzZXJ0ZWQuCisJCQkqLworCQkJUkVHX1dSKGJwLCBCUkIxX1JFR19GVUxMX0xCX1hPRkZfVEhSRVNIT0xELAorCQkJCSAgIGUzYjBfdmFsLmZ1bGxfbGJfeG9mZl90aCk7CisJCQkvKioKKwkJCSAqIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvIHRoZQorCQkJICogTEIgcG9ydCBpcyBkZS1hc3NlcnRlZC4KKwkJCSovCisJCQlSRUdfV1IoYnAsIEJSQjFfUkVHX0ZVTExfTEJfWE9OX1RIUkVTSE9MRCwKKwkJCQkgICBlM2IwX3ZhbC5mdWxsX2xiX3hvbl90aHJlc2hvbGQpOworCQkJLyoqCisJCQkqIFRoZSBudW1iZXIgb2YgYmxvY2tzIGd1YXJhbnRpZWQgZm9yIHRoZSBNQUMgI24gcG9ydC4gbj0wLDEKKwkJCSovCisKKwkJCS8qVGhlIG51bWJlciBvZiBibG9ja3MgZ3VhcmFudGllZCBmb3IgdGhlIExCIHBvcnQuKi8KKwkJCVJFR19XUihicCwgQlJCMV9SRUdfTEJfR1VBUkFOVElFRCwKKwkJCSAgICAgICBlM2IwX3ZhbC5sYl9ndWFyYW50aWVkKTsKKworCQkJLyoqCisJCQkgKiBUaGUgbnVtYmVyIG9mIGJsb2NrcyBndWFyYW50aWVkIGZvciB0aGUgTUFDICNuIHBvcnQuCisJCQkqLworCQkJUkVHX1dSKGJwLCBCUkIxX1JFR19NQUNfR1VBUkFOVElFRF8wLAorCQkJCSAgIDIgKiBlM2IwX3ZhbC5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWQpOworCQkJUkVHX1dSKGJwLCBCUkIxX1JFR19NQUNfR1VBUkFOVElFRF8xLAorCQkJCSAgIDIgKiBlM2IwX3ZhbC5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWQpOworCQkJLyoqCisJCQkgKiBUaGUgbnVtYmVyIG9mIGJsb2NrcyBndWFyYW50aWVkIGZvciBjbGFzcyAjdCBpbiBNQUMwLiB0PTAsMQorCQkJKi8KKwkJCVJFR19XUihicCwgQlJCMV9SRUdfTUFDXzBfQ0xBU1NfMF9HVUFSQU5USUVELAorCQkJICAgICAgIGUzYjBfdmFsLm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZCk7CisJCQlSRUdfV1IoYnAsIEJSQjFfUkVHX01BQ18wX0NMQVNTXzFfR1VBUkFOVElFRCwKKwkJCSAgICAgICBlM2IwX3ZhbC5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWQpOworCQkJLyoqCisJCQkgKiBUaGUgaHlzdGVyZXNpcyBvbiB0aGUgZ3VhcmFudGllZCBidWZmZXIgc3BhY2UgZm9yIGNsYXNzIGluCisJCQkgKiBNQUMwLiAgdD0wLDEKKwkJCSovCisJCQlSRUdfV1IoYnAsIEJSQjFfUkVHX01BQ18wX0NMQVNTXzBfR1VBUkFOVElFRF9IWVNULAorCQkJICAgICAgIGUzYjBfdmFsLm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0KTsKKwkJCVJFR19XUihicCwgQlJCMV9SRUdfTUFDXzBfQ0xBU1NfMV9HVUFSQU5USUVEX0hZU1QsCisJCQkgICAgICAgZTNiMF92YWwubWFjXzBfY2xhc3NfdF9ndWFyYW50aWVkX2h5c3QpOworCisJCQkvKioKKwkJCSAqIFRoZSBudW1iZXIgb2YgYmxvY2tzIGd1YXJhbnRpZWQgZm9yIGNsYXNzICN0IGluIE1BQzEudD0wLDEKKwkJCSovCisJCQlSRUdfV1IoYnAsIEJSQjFfUkVHX01BQ18xX0NMQVNTXzBfR1VBUkFOVElFRCwKKwkJCSAgICAgICBlM2IwX3ZhbC5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWQpOworCQkJUkVHX1dSKGJwLCBCUkIxX1JFR19NQUNfMV9DTEFTU18xX0dVQVJBTlRJRUQsCisJCQkgICAgICAgZTNiMF92YWwubWFjXzFfY2xhc3NfdF9ndWFyYW50aWVkKTsKKwkJCS8qKgorCQkJICogVGhlIGh5c3RlcmVzaXMgb24gdGhlIGd1YXJhbnRpZWQgYnVmZmVyIHNwYWNlIGZvciBjbGFzcyAjdAorCQkJKiBpbiBNQUMxLiAgdD0wLDEKKwkJCSovCisJCQlSRUdfV1IoYnAsIEJSQjFfUkVHX01BQ18xX0NMQVNTXzBfR1VBUkFOVElFRF9IWVNULAorCQkJICAgICAgIGUzYjBfdmFsLm1hY18xX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0KTsKKwkJCVJFR19XUihicCwgQlJCMV9SRUdfTUFDXzFfQ0xBU1NfMV9HVUFSQU5USUVEX0hZU1QsCisJCQkgICAgICAgZTNiMF92YWwubWFjXzFfY2xhc3NfdF9ndWFyYW50aWVkX2h5c3QpOworCisJICAgIH0KKwogCX0KKworCXJldHVybiBibngyeF9zdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGVzY3JpcHRpb246CisqICBUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCBiZWNhdXNlIE5JRyBBUkJfQ1JFRElUX1dFSUdIVF9YIGFyZQorKiAgbm90IGNvbnRpbnVlcyBhbmQgQVJCX0NSRURJVF9XRUlHSFRfMCArIG9mZnNldCBpcyBzdWl0YWJsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBibngyeF9wZmNfbmlnX3J4X3ByaW9yaXR5X21hc2soc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJICAgICAgdTggY29zX2VudHJ5LAorCQkJCQkgICAgICB1MzIgcHJpb3JpdHlfbWFzaywgdTggcG9ydCkKK3sKKwl1MzIgbmlnX3JlZ19yeF9wcmlvcml0eV9tYXNrX2FkZCA9IDA7CisKKwlzd2l0Y2ggKGNvc19lbnRyeSkgeworCWNhc2UgMDoKKwkgICAgIG5pZ19yZWdfcnhfcHJpb3JpdHlfbWFza19hZGQgPSAocG9ydCkgPworCQkgTklHX1JFR19QMV9SWF9DT1MwX1BSSU9SSVRZX01BU0sgOgorCQkgTklHX1JFR19QMF9SWF9DT1MwX1BSSU9SSVRZX01BU0s7CisJICAgICBicmVhazsKKwljYXNlIDE6CisJICAgIG5pZ19yZWdfcnhfcHJpb3JpdHlfbWFza19hZGQgPSAocG9ydCkgPworCQlOSUdfUkVHX1AxX1JYX0NPUzFfUFJJT1JJVFlfTUFTSyA6CisJCU5JR19SRUdfUDBfUlhfQ09TMV9QUklPUklUWV9NQVNLOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIG5pZ19yZWdfcnhfcHJpb3JpdHlfbWFza19hZGQgPSAocG9ydCkgPworCQlOSUdfUkVHX1AxX1JYX0NPUzJfUFJJT1JJVFlfTUFTSyA6CisJCU5JR19SRUdfUDBfUlhfQ09TMl9QUklPUklUWV9NQVNLOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIGlmIChwb3J0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwkgICAgbmlnX3JlZ19yeF9wcmlvcml0eV9tYXNrX2FkZCA9IE5JR19SRUdfUDBfUlhfQ09TM19QUklPUklUWV9NQVNLOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIGlmIChwb3J0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwkgICAgbmlnX3JlZ19yeF9wcmlvcml0eV9tYXNrX2FkZCA9IE5JR19SRUdfUDBfUlhfQ09TNF9QUklPUklUWV9NQVNLOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIGlmIChwb3J0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwkgICAgbmlnX3JlZ19yeF9wcmlvcml0eV9tYXNrX2FkZCA9IE5JR19SRUdfUDBfUlhfQ09TNV9QUklPUklUWV9NQVNLOworCSAgICBicmVhazsKKwl9CisKKwlSRUdfV1IoYnAsIG5pZ19yZWdfcnhfcHJpb3JpdHlfbWFza19hZGQsIHByaW9yaXR5X21hc2spOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBibngyeF91cGRhdGVfbW5nKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1MzIgbGlua19zdGF0dXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisKKwlSRUdfV1IoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCisJICAgICAgIG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCisJCQlwb3J0X21iW3BhcmFtcy0+cG9ydF0ubGlua19zdGF0dXMpLCBsaW5rX3N0YXR1cyk7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X3VwZGF0ZV9wZmNfbmlnKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLApAQCAtODU4LDkgKzIzNzIsOSBAQAogCXUzMiB4Y21fbWFzayA9IDAsIHBwcF9lbmFibGUgPSAwLCBwYXVzZV9lbmFibGUgPSAwLCBsbGZjX291dF9lbiA9IDA7CiAJdTMyIGxsZmNfZW5hYmxlID0gMCwgeGNtMF9vdXRfZW4gPSAwLCBwMF9od3BmY19lbmFibGUgPSAwOwogCXUzMiBwa3RfcHJpb3JpdHlfdG9fY29zID0gMDsKLQl1MzIgdmFsOwogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCWludCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisKIAlpbnQgc2V0X3BmYyA9IHBhcmFtcy0+ZmVhdHVyZV9jb25maWdfZmxhZ3MgJgogCQlGRUFUVVJFX0NPTkZJR19QRkNfRU5BQkxFRDsKIAlEUChORVRJRl9NU0dfTElOSywgInVwZGF0aW5nIHBmYyBuaWcgcGFyYW1ldGVyc1xuIik7CkBAIC04ODEsNiArMjM5NSw5IEBACiAJCXBhdXNlX2VuYWJsZSA9IDA7CiAJCWxsZmNfb3V0X2VuID0gMDsKIAkJbGxmY19lbmFibGUgPSAwOworCQlpZiAoQ0hJUF9JU19FMyhicCkpCisJCQlwcHBfZW5hYmxlID0gMDsKKwkJZWxzZQogCQlwcHBfZW5hYmxlID0gMTsKIAkJeGNtX21hc2sgJj0gfihwb3J0ID8gTklHX0xMSDFfWENNX01BU0tfUkVHX0xMSDFfWENNX01BU0tfQkNOIDoKIAkJCQkgICAgIE5JR19MTEgwX1hDTV9NQVNLX1JFR19MTEgwX1hDTV9NQVNLX0JDTik7CkBAIC04OTksNiArMjQxNiw5IEBACiAJCXhjbTBfb3V0X2VuID0gMTsKIAl9CiAKKwlpZiAoQ0hJUF9JU19FMyhicCkpCisJCVJFR19XUihicCwgcG9ydCA/IE5JR19SRUdfQlJCMV9QQVVTRV9JTl9FTiA6CisJCSAgICAgICBOSUdfUkVHX0JSQjBfUEFVU0VfSU5fRU4sIHBhdXNlX2VuYWJsZSk7CiAJUkVHX1dSKGJwLCBwb3J0ID8gTklHX1JFR19MTEZDX09VVF9FTl8xIDoKIAkgICAgICAgTklHX1JFR19MTEZDX09VVF9FTl8wLCBsbGZjX291dF9lbik7CiAJUkVHX1dSKGJwLCBwb3J0ID8gTklHX1JFR19MTEZDX0VOQUJMRV8xIDoKQEAgLTkyMCwzMCArMjQ0MCwxMyBAQAogCS8qIEhXIFBGQyBUWCBlbmFibGUgKi8KIAlSRUdfV1IoYnAsIE5JR19SRUdfUDBfSFdQRkNfRU5BQkxFLCBwMF9od3BmY19lbmFibGUpOwogCi0JLyogMHgyID0gQk1BQywgMHgxPSBFTUFDICovCi0Jc3dpdGNoICh2YXJzLT5tYWNfdHlwZSkgewotCWNhc2UgTUFDX1RZUEVfRU1BQzoKLQkJdmFsID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBNQUNfVFlQRV9CTUFDOgotCQl2YWwgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl2YWwgPSAwOwotCQlicmVhazsKLQl9Ci0JUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19FTUFDMF9QT1JULCB2YWwpOwotCiAJaWYgKG5pZ19wYXJhbXMpIHsKKwkJdTggaSA9IDA7CiAJCXBrdF9wcmlvcml0eV90b19jb3MgPSBuaWdfcGFyYW1zLT5wa3RfcHJpb3JpdHlfdG9fY29zOwogCi0JCVJFR19XUihicCwgcG9ydCA/IE5JR19SRUdfUDFfUlhfQ09TMF9QUklPUklUWV9NQVNLIDoKLQkJICAgICAgIE5JR19SRUdfUDBfUlhfQ09TMF9QUklPUklUWV9NQVNLLAotCQkgICAgICAgbmlnX3BhcmFtcy0+cnhfY29zMF9wcmlvcml0eV9tYXNrKTsKLQotCQlSRUdfV1IoYnAsIHBvcnQgPyBOSUdfUkVHX1AxX1JYX0NPUzFfUFJJT1JJVFlfTUFTSyA6Ci0JCSAgICAgICBOSUdfUkVHX1AwX1JYX0NPUzFfUFJJT1JJVFlfTUFTSywKLQkJICAgICAgIG5pZ19wYXJhbXMtPnJ4X2NvczFfcHJpb3JpdHlfbWFzayk7CisJCWZvciAoaSA9IDA7IGkgPCBuaWdfcGFyYW1zLT5udW1fb2ZfcnhfY29zX3ByaW9yaXR5X21hc2s7IGkrKykKKwkJCWJueDJ4X3BmY19uaWdfcnhfcHJpb3JpdHlfbWFzayhicCwgaSwKKwkJbmlnX3BhcmFtcy0+cnhfY29zX3ByaW9yaXR5X21hc2tbaV0sIHBvcnQpOwogCiAJCVJFR19XUihicCwgcG9ydCA/IE5JR19SRUdfTExGQ19ISUdIX1BSSU9SSVRZX0NMQVNTRVNfMSA6CiAJCSAgICAgICBOSUdfUkVHX0xMRkNfSElHSF9QUklPUklUWV9DTEFTU0VTXzAsCkBAIC05NTgsOCArMjQ2MSw3IEBACiAJICAgICAgIHBrdF9wcmlvcml0eV90b19jb3MpOwogfQogCi0KLXZvaWQgYm54MnhfdXBkYXRlX3BmYyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKK2ludCBibngyeF91cGRhdGVfcGZjKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAogCQkgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAogCQkgICAgICBzdHJ1Y3QgYm54MnhfbmlnX2JyYl9wZmNfcG9ydF9wYXJhbXMgKnBmY19wYXJhbXMpCiB7CkBAIC05NzAsNDEgKzI0NzIsNTkgQEAKIAkgKi8KIAl1MzIgdmFsOwogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCWludCBibngyeF9zdGF0dXMgPSAwOworCXU4IGJtYWNfbG9vcGJhY2sgPSAocGFyYW1zLT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX0JNQUMpOworCisJaWYgKHBhcmFtcy0+ZmVhdHVyZV9jb25maWdfZmxhZ3MgJiBGRUFUVVJFX0NPTkZJR19QRkNfRU5BQkxFRCkKKwkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS19TVEFUVVNfUEZDX0VOQUJMRUQ7CisJZWxzZQorCQl2YXJzLT5saW5rX3N0YXR1cyAmPSB+TElOS19TVEFUVVNfUEZDX0VOQUJMRUQ7CisKKwlibngyeF91cGRhdGVfbW5nKHBhcmFtcywgdmFycy0+bGlua19zdGF0dXMpOwogCiAJLyogdXBkYXRlIE5JRyBwYXJhbXMgKi8KIAlibngyeF91cGRhdGVfcGZjX25pZyhwYXJhbXMsIHZhcnMsIHBmY19wYXJhbXMpOwogCiAJLyogdXBkYXRlIEJSQiBwYXJhbXMgKi8KLQlibngyeF91cGRhdGVfcGZjX2JyYihwYXJhbXMsIHZhcnMsIHBmY19wYXJhbXMpOworCWJueDJ4X3N0YXR1cyA9IGJueDJ4X3VwZGF0ZV9wZmNfYnJiKHBhcmFtcywgdmFycywgcGZjX3BhcmFtcyk7CisJaWYgKDAgIT0gYm54Mnhfc3RhdHVzKQorCQlyZXR1cm4gYm54Mnhfc3RhdHVzOwogCiAJaWYgKCF2YXJzLT5saW5rX3VwKQotCQlyZXR1cm47Ci0KLQl2YWwgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX1JFU0VUX1JFR18yKTsKLQlpZiAoKHZhbCAmIChNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfQk1BQzAgPDwgcGFyYW1zLT5wb3J0KSkKLQkgICAgPT0gMCkgewotCQlEUChORVRJRl9NU0dfTElOSywgIkFib3V0IHRvIHVwZGF0ZSBQRkMgaW4gRU1BQ1xuIik7Ci0JCWJueDJ4X2VtYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7Ci0JCXJldHVybjsKLQl9CisJCXJldHVybiBibngyeF9zdGF0dXM7CiAKIAlEUChORVRJRl9NU0dfTElOSywgIkFib3V0IHRvIHVwZGF0ZSBQRkMgaW4gQk1BQ1xuIik7Ci0JaWYgKENISVBfSVNfRTIoYnApKQotCQlibngyeF91cGRhdGVfcGZjX2JtYWMyKHBhcmFtcywgdmFycywgMCk7Ci0JZWxzZQotCQlibngyeF91cGRhdGVfcGZjX2JtYWMxKHBhcmFtcywgdmFycyk7CisJaWYgKENISVBfSVNfRTMoYnApKQorCQlibngyeF91cGRhdGVfcGZjX3htYWMocGFyYW1zLCB2YXJzLCAwKTsKKwllbHNlIHsKKwkJdmFsID0gUkVHX1JEKGJwLCBNSVNDX1JFR19SRVNFVF9SRUdfMik7CisJCWlmICgodmFsICYKKwkJICAgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0JNQUMwIDw8IHBhcmFtcy0+cG9ydCkpCisJCSAgICA9PSAwKSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgIkFib3V0IHRvIHVwZGF0ZSBQRkMgaW4gRU1BQ1xuIik7CisJCQlibngyeF9lbWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDApOworCQkJcmV0dXJuIGJueDJ4X3N0YXR1czsKKwkJfQogCi0JdmFsID0gMDsKLQlpZiAoKHBhcmFtcy0+ZmVhdHVyZV9jb25maWdfZmxhZ3MgJgotCSAgICAgIEZFQVRVUkVfQ09ORklHX1BGQ19FTkFCTEVEKSB8fAotCSAgICAodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKSkKLQkJdmFsID0gMTsKLQlSRUdfV1IoYnAsIE5JR19SRUdfQk1BQzBfUEFVU0VfT1VUX0VOICsgcGFyYW1zLT5wb3J0KjQsIHZhbCk7CisJCWlmIChDSElQX0lTX0UyKGJwKSkKKwkJCWJueDJ4X3VwZGF0ZV9wZmNfYm1hYzIocGFyYW1zLCB2YXJzLCBibWFjX2xvb3BiYWNrKTsKKwkJZWxzZQorCQkJYm54MnhfdXBkYXRlX3BmY19ibWFjMShwYXJhbXMsIHZhcnMpOworCisJCXZhbCA9IDA7CisJCWlmICgocGFyYW1zLT5mZWF0dXJlX2NvbmZpZ19mbGFncyAmCisJCSAgICAgRkVBVFVSRV9DT05GSUdfUEZDX0VOQUJMRUQpIHx8CisJCSAgICAodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKSkKKwkJCXZhbCA9IDE7CisJCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9QQVVTRV9PVVRfRU4gKyBwYXJhbXMtPnBvcnQqNCwgdmFsKTsKKwl9CisJcmV0dXJuIGJueDJ4X3N0YXR1czsKIH0KIAotc3RhdGljIHU4IGJueDJ4X2JtYWMxX2VuYWJsZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCSAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycywKLQkJCSAgICAgdTggaXNfbGIpCisKK3N0YXRpYyBpbnQgYm54MnhfYm1hYzFfZW5hYmxlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycywKKwkJCSAgICAgIHU4IGlzX2xiKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CkBAIC0xMDYzLDEyICsyNTgzLDE4IEBACiAJUkVHX1dSX0RNQUUoYnAsIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9SWF9MTEZDX01TR19GTERTLAogCQkgICAgd2JfZGF0YSwgMik7CiAKKwlpZiAodmFycy0+cGh5X2ZsYWdzICYgUEhZX1RYX0VSUk9SX0NIRUNLX0ZMQUcpIHsKKwkJUkVHX1JEX0RNQUUoYnAsIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9SWF9MU1NfU1RBVFVTLAorCQkJICAgIHdiX2RhdGEsIDIpOworCQlpZiAod2JfZGF0YVswXSA+IDApCisJCQlyZXR1cm4gLUVTUkNIOworCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU4IGJueDJ4X2JtYWMyX2VuYWJsZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCSAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycywKLQkJCSAgICAgdTggaXNfbGIpCitzdGF0aWMgaW50IGJueDJ4X2JtYWMyX2VuYWJsZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCisJCQkgICAgICB1OCBpc19sYikKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwpAQCAtMTEyOCwxNCArMjY1NCwyNSBAQAogCXVkZWxheSgzMCk7CiAJYm54MnhfdXBkYXRlX3BmY19ibWFjMihwYXJhbXMsIHZhcnMsIGlzX2xiKTsKIAorCWlmICh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfVFhfRVJST1JfQ0hFQ0tfRkxBRykgeworCQlSRUdfUkRfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDMl9SRUdJU1RFUl9SWF9MU1NfU1RBVCwKKwkJCSAgICB3Yl9kYXRhLCAyKTsKKwkJaWYgKHdiX2RhdGFbMF0gPiAwKSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgIkdvdCBiYWQgTFNTIHN0YXR1cyAweCV4XG4iLAorCQkJCSAgICAgICB3Yl9kYXRhWzBdKTsKKwkJCXJldHVybiAtRVNSQ0g7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU4IGJueDJ4X2JtYWNfZW5hYmxlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCi0JCQkgICAgdTggaXNfbGIpCitzdGF0aWMgaW50IGJueDJ4X2JtYWNfZW5hYmxlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAorCQkJICAgICB1OCBpc19sYikKIHsKLQl1OCByYywgcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwlpbnQgcmMgPSAwOworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJdTMyIHZhbDsKIAkvKiByZXNldCBhbmQgdW5yZXNldCB0aGUgQmlnTWFjICovCkBAIC0xMTczLDE2ICsyNzEwLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLQotc3RhdGljIHZvaWQgYm54MnhfdXBkYXRlX21uZyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTMyIGxpbmtfc3RhdHVzKQotewotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCi0JUkVHX1dSKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKwotCSAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAotCQkJcG9ydF9tYltwYXJhbXMtPnBvcnRdLmxpbmtfc3RhdHVzKSwgbGlua19zdGF0dXMpOwotfQotCiBzdGF0aWMgdm9pZCBibngyeF9ibWFjX3J4X2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCwgdTggcG9ydCkKIHsKIAl1MzIgYm1hY19hZGRyID0gcG9ydCA/IE5JR19SRUdfSU5HUkVTU19CTUFDMV9NRU0gOgpAQCAtMTIxOCw4ICsyNzQ1LDggQEAKIAl9CiB9CiAKLXN0YXRpYyB1OCBibngyeF9wYmZfdXBkYXRlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1MzIgZmxvd19jdHJsLAotCQkJICAgdTMyIGxpbmVfc3BlZWQpCitzdGF0aWMgaW50IGJueDJ4X3BiZl91cGRhdGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHUzMiBmbG93X2N0cmwsCisJCQkgICAgdTMyIGxpbmVfc3BlZWQpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKQEAgLTEyNjksMTggKzI3OTYsNiBAQAogCQljYXNlIFNQRUVEXzEwMDAwOgogCQkJaW5pdF9jcmQgPSB0aHJlc2ggKyA1NTMgLSAyMjsKIAkJCWJyZWFrOwotCi0JCWNhc2UgU1BFRURfMTIwMDA6Ci0JCQlpbml0X2NyZCA9IHRocmVzaCArIDY2NCAtIDIyOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTUEVFRF8xMzAwMDoKLQkJCWluaXRfY3JkID0gdGhyZXNoICsgNzQyIC0gMjI7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUVEXzE2MDAwOgotCQkJaW5pdF9jcmQgPSB0aHJlc2ggKyA3NzggLSAyMjsKLQkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJRFAoTkVUSUZfTVNHX0xJTkssICJJbnZhbGlkIGxpbmVfc3BlZWQgMHgleFxuIiwKIAkJCQkgIGxpbmVfc3BlZWQpOwpAQCAtMTM0OSwzMSArMjg2NCwyMyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoJCQlDTDQ1IGFjY2VzcyBmdW5jdGlvbnMJCQkgICovCisvKgkJCUNMMjIgYWNjZXNzIGZ1bmN0aW9ucwkJCSAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdTggYm54MnhfY2w0NV93cml0ZShzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkgICB1OCBkZXZhZCwgdTE2IHJlZywgdTE2IHZhbCkKK3N0YXRpYyBpbnQgYm54MnhfY2wyMl93cml0ZShzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgICAgICBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJICAgICAgIHUxNiByZWcsIHUxNiB2YWwpCiB7Ci0JdTMyIHRtcCwgc2F2ZWRfbW9kZTsKLQl1OCBpLCByYyA9IDA7Ci0JLyoKLQkgKiBTZXQgY2xhdXNlIDQ1IG1vZGUsIHNsb3cgZG93biB0aGUgTURJTyBjbG9jayB0byAyLjVNSHoKLQkgKiAoYSB2YWx1ZSBvZiA0OT09MHgzMSkgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBBVVRPIHBvbGwgaXMgb2ZmCi0JICovCi0KLQlzYXZlZF9tb2RlID0gUkVHX1JEKGJwLCBwaHktPm1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFKTsKLQl0bXAgPSBzYXZlZF9tb2RlICYgfihFTUFDX01ESU9fTU9ERV9BVVRPX1BPTEwgfAotCQkJICAgICBFTUFDX01ESU9fTU9ERV9DTE9DS19DTlQpOwotCXRtcCB8PSAoRU1BQ19NRElPX01PREVfQ0xBVVNFXzQ1IHwKLQkJKDQ5IDw8IEVNQUNfTURJT19NT0RFX0NMT0NLX0NOVF9CSVRTSElGVCkpOwotCVJFR19XUihicCwgcGh5LT5tZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSwgdG1wKTsKLQlSRUdfUkQoYnAsIHBoeS0+bWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUpOwotCXVkZWxheSg0MCk7CisJdTMyIHRtcCwgbW9kZTsKKwl1OCBpOworCWludCByYyA9IDA7CisJLyogU3dpdGNoIHRvIENMMjIgKi8KKwltb2RlID0gUkVHX1JEKGJwLCBwaHktPm1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFKTsKKwlSRUdfV1IoYnAsIHBoeS0+bWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUsCisJICAgICAgIG1vZGUgJiB+RU1BQ19NRElPX01PREVfQ0xBVVNFXzQ1KTsKIAogCS8qIGFkZHJlc3MgKi8KLQotCXRtcCA9ICgocGh5LT5hZGRyIDw8IDIxKSB8IChkZXZhZCA8PCAxNikgfCByZWcgfAotCSAgICAgICBFTUFDX01ESU9fQ09NTV9DT01NQU5EX0FERFJFU1MgfAorCXRtcCA9ICgocGh5LT5hZGRyIDw8IDIxKSB8IChyZWcgPDwgMTYpIHwgdmFsIHwKKwkgICAgICAgRU1BQ19NRElPX0NPTU1fQ09NTUFORF9XUklURV8yMiB8CiAJICAgICAgIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpOwogCVJFR19XUihicCwgcGh5LT5tZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSwgdG1wKTsKIApAQCAtMTM4OCw1NyArMjg5NSw2MCBAQAogCX0KIAlpZiAodG1wICYgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSkgewogCQlEUChORVRJRl9NU0dfTElOSywgIndyaXRlIHBoeSByZWdpc3RlciBmYWlsZWRcbiIpOwotCQluZXRkZXZfZXJyKGJwLT5kZXYsICAiTURDL01ESU8gYWNjZXNzIHRpbWVvdXRcbiIpOwogCQlyYyA9IC1FRkFVTFQ7Ci0JfSBlbHNlIHsKLQkJLyogZGF0YSAqLwotCQl0bXAgPSAoKHBoeS0+YWRkciA8PCAyMSkgfCAoZGV2YWQgPDwgMTYpIHwgdmFsIHwKLQkJICAgICAgIEVNQUNfTURJT19DT01NX0NPTU1BTkRfV1JJVEVfNDUgfAotCQkgICAgICAgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSk7Ci0JCVJFR19XUihicCwgcGh5LT5tZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSwgdG1wKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgewotCQkJdWRlbGF5KDEwKTsKLQotCQkJdG1wID0gUkVHX1JEKGJwLCBwaHktPm1kaW9fY3RybCArCi0JCQkJICAgICBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSk7Ci0JCQlpZiAoISh0bXAgJiBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKSkgewotCQkJCXVkZWxheSg1KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAodG1wICYgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSkgewotCQkJRFAoTkVUSUZfTVNHX0xJTkssICJ3cml0ZSBwaHkgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQkJCW5ldGRldl9lcnIoYnAtPmRldiwgICJNREMvTURJTyBhY2Nlc3MgdGltZW91dFxuIik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KIAl9Ci0KLQkvKiBSZXN0b3JlIHRoZSBzYXZlZCBtb2RlICovCi0JUkVHX1dSKGJwLCBwaHktPm1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFLCBzYXZlZF9tb2RlKTsKLQorCVJFR19XUihicCwgcGh5LT5tZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSwgbW9kZSk7CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdTggYm54MnhfY2w0NV9yZWFkKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9waHkgKnBoeSwKLQkJCSAgdTggZGV2YWQsIHUxNiByZWcsIHUxNiAqcmV0X3ZhbCkKK3N0YXRpYyBpbnQgYm54MnhfY2wyMl9yZWFkKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgICAgIHUxNiByZWcsIHUxNiAqcmV0X3ZhbCkKIHsKLQl1MzIgdmFsLCBzYXZlZF9tb2RlOworCXUzMiB2YWwsIG1vZGU7CiAJdTE2IGk7Ci0JdTggcmMgPSAwOwotCS8qCi0JICogU2V0IGNsYXVzZSA0NSBtb2RlLCBzbG93IGRvd24gdGhlIE1ESU8gY2xvY2sgdG8gMi41TUh6Ci0JICogKGEgdmFsdWUgb2YgNDk9PTB4MzEpIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgQVVUTyBwb2xsIGlzIG9mZgotCSAqLworCWludCByYyA9IDA7CiAKLQlzYXZlZF9tb2RlID0gUkVHX1JEKGJwLCBwaHktPm1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFKTsKLQl2YWwgPSBzYXZlZF9tb2RlICYgfigoRU1BQ19NRElPX01PREVfQVVUT19QT0xMIHwKLQkJCSAgICAgIEVNQUNfTURJT19NT0RFX0NMT0NLX0NOVCkpOwotCXZhbCB8PSAoRU1BQ19NRElPX01PREVfQ0xBVVNFXzQ1IHwKLQkJKDQ5TCA8PCBFTUFDX01ESU9fTU9ERV9DTE9DS19DTlRfQklUU0hJRlQpKTsKLQlSRUdfV1IoYnAsIHBoeS0+bWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUsIHZhbCk7Ci0JUkVHX1JEKGJwLCBwaHktPm1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFKTsKLQl1ZGVsYXkoNDApOworCS8qIFN3aXRjaCB0byBDTDIyICovCisJbW9kZSA9IFJFR19SRChicCwgcGh5LT5tZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSk7CisJUkVHX1dSKGJwLCBwaHktPm1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFLAorCSAgICAgICBtb2RlICYgfkVNQUNfTURJT19NT0RFX0NMQVVTRV80NSk7CisKKwkvKiBhZGRyZXNzICovCisJdmFsID0gKChwaHktPmFkZHIgPDwgMjEpIHwgKHJlZyA8PCAxNikgfAorCSAgICAgICBFTUFDX01ESU9fQ09NTV9DT01NQU5EX1JFQURfMjIgfAorCSAgICAgICBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKTsKKwlSRUdfV1IoYnAsIHBoeS0+bWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX0NPTU0sIHZhbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgeworCQl1ZGVsYXkoMTApOworCisJCXZhbCA9IFJFR19SRChicCwgcGh5LT5tZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSk7CisJCWlmICghKHZhbCAmIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpKSB7CisJCQkqcmV0X3ZhbCA9ICh1MTYpKHZhbCAmIEVNQUNfTURJT19DT01NX0RBVEEpOworCQkJdWRlbGF5KDUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHZhbCAmIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJyZWFkIHBoeSByZWdpc3RlciBmYWlsZWRcbiIpOworCisJCSpyZXRfdmFsID0gMDsKKwkJcmMgPSAtRUZBVUxUOworCX0KKwlSRUdfV1IoYnAsIHBoeS0+bWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUsIG1vZGUpOworCXJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJQ0w0NSBhY2Nlc3MgZnVuY3Rpb25zCQkJICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgYm54MnhfY2w0NV9yZWFkKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCSAgIHU4IGRldmFkLCB1MTYgcmVnLCB1MTYgKnJldF92YWwpCit7CisJdTMyIHZhbDsKKwl1MTYgaTsKKwlpbnQgcmMgPSAwOwogCiAJLyogYWRkcmVzcyAqLwogCXZhbCA9ICgocGh5LT5hZGRyIDw8IDIxKSB8IChkZXZhZCA8PCAxNikgfCByZWcgfApAQCAtMTQ2MCw3ICsyOTcwLDYgQEAKIAkJbmV0ZGV2X2VycihicC0+ZGV2LCAgIk1EQy9NRElPIGFjY2VzcyB0aW1lb3V0XG4iKTsKIAkJKnJldF92YWwgPSAwOwogCQlyYyA9IC1FRkFVTFQ7Ci0KIAl9IGVsc2UgewogCQkvKiBkYXRhICovCiAJCXZhbCA9ICgocGh5LT5hZGRyIDw8IDIxKSB8IChkZXZhZCA8PCAxNikgfApAQCAtMTQ4NSwxNSArMjk5NCwyMTQgQEAKIAkJCXJjID0gLUVGQVVMVDsKIAkJfQogCX0KLQotCS8qIFJlc3RvcmUgdGhlIHNhdmVkIG1vZGUgKi8KLQlSRUdfV1IoYnAsIHBoeS0+bWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX01PREUsIHNhdmVkX21vZGUpOworCS8qIFdvcmsgYXJvdW5kIGZvciBFMyBBMCAqLworCWlmIChwaHktPmZsYWdzICYgRkxBR1NfTURDX01ESU9fV0EpIHsKKwkJcGh5LT5mbGFncyBePSBGTEFHU19EVU1NWV9SRUFEOworCQlpZiAocGh5LT5mbGFncyAmIEZMQUdTX0RVTU1ZX1JFQUQpIHsKKwkJCXUxNiB0ZW1wX3ZhbDsKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBkZXZhZCwgMHhmLCAmdGVtcF92YWwpOworCQl9CisJfQogCiAJcmV0dXJuIHJjOwogfQogCi11OCBibngyeF9waHlfcmVhZChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTggcGh5X2FkZHIsCi0JCSAgdTggZGV2YWQsIHUxNiByZWcsIHUxNiAqcmV0X3ZhbCkKK3N0YXRpYyBpbnQgYm54MnhfY2w0NV93cml0ZShzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkgICAgdTggZGV2YWQsIHUxNiByZWcsIHUxNiB2YWwpCit7CisJdTMyIHRtcDsKKwl1OCBpOworCWludCByYyA9IDA7CisKKwkvKiBhZGRyZXNzICovCisKKwl0bXAgPSAoKHBoeS0+YWRkciA8PCAyMSkgfCAoZGV2YWQgPDwgMTYpIHwgcmVnIHwKKwkgICAgICAgRU1BQ19NRElPX0NPTU1fQ09NTUFORF9BRERSRVNTIHwKKwkgICAgICAgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSk7CisJUkVHX1dSKGJwLCBwaHktPm1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19DT01NLCB0bXApOworCisJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHsKKwkJdWRlbGF5KDEwKTsKKworCQl0bXAgPSBSRUdfUkQoYnAsIHBoeS0+bWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX0NPTU0pOworCQlpZiAoISh0bXAgJiBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKSkgeworCQkJdWRlbGF5KDUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHRtcCAmIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJ3cml0ZSBwaHkgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJbmV0ZGV2X2VycihicC0+ZGV2LCAgIk1EQy9NRElPIGFjY2VzcyB0aW1lb3V0XG4iKTsKKwkJcmMgPSAtRUZBVUxUOworCisJfSBlbHNlIHsKKwkJLyogZGF0YSAqLworCQl0bXAgPSAoKHBoeS0+YWRkciA8PCAyMSkgfCAoZGV2YWQgPDwgMTYpIHwgdmFsIHwKKwkJICAgICAgIEVNQUNfTURJT19DT01NX0NPTU1BTkRfV1JJVEVfNDUgfAorCQkgICAgICAgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSk7CisJCVJFR19XUihicCwgcGh5LT5tZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSwgdG1wKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgeworCQkJdWRlbGF5KDEwKTsKKworCQkJdG1wID0gUkVHX1JEKGJwLCBwaHktPm1kaW9fY3RybCArCisJCQkJICAgICBFTUFDX1JFR19FTUFDX01ESU9fQ09NTSk7CisJCQlpZiAoISh0bXAgJiBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKSkgeworCQkJCXVkZWxheSg1KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodG1wICYgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSkgeworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJ3cml0ZSBwaHkgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJCW5ldGRldl9lcnIoYnAtPmRldiwgICJNREMvTURJTyBhY2Nlc3MgdGltZW91dFxuIik7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwl9CisJLyogV29yayBhcm91bmQgZm9yIEUzIEEwICovCisJaWYgKHBoeS0+ZmxhZ3MgJiBGTEFHU19NRENfTURJT19XQSkgeworCQlwaHktPmZsYWdzIF49IEZMQUdTX0RVTU1ZX1JFQUQ7CisJCWlmIChwaHktPmZsYWdzICYgRkxBR1NfRFVNTVlfUkVBRCkgeworCQkJdTE2IHRlbXBfdmFsOworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIGRldmFkLCAweGYsICZ0ZW1wX3ZhbCk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJQlNDIGFjY2VzcyBmdW5jdGlvbnMgZnJvbSBFMwkgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBibngyeF9ic2NfbW9kdWxlX3NlbChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgaWR4OworCXUzMiBib2FyZF9jZmcsIHNmcF9jdHJsOworCXUzMiBpMmNfcGluc1tJMkNfU1dJVENIX1dJRFRIXSwgaTJjX3ZhbFtJMkNfU1dJVENIX1dJRFRIXTsKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCS8qIFJlYWQgSTJDIG91dHB1dCBQSU5zICovCisJYm9hcmRfY2ZnID0gUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKworCQkJICAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKKwkJCQkgICAgZGV2X2luZm8uc2hhcmVkX2h3X2NvbmZpZy5ib2FyZCkpOworCWkyY19waW5zW0kyQ19CU0MwXSA9IGJvYXJkX2NmZyAmIFNIQVJFRF9IV19DRkdfRTNfSTJDX01VWDBfTUFTSzsKKwlpMmNfcGluc1tJMkNfQlNDMV0gPSAoYm9hcmRfY2ZnICYgU0hBUkVEX0hXX0NGR19FM19JMkNfTVVYMV9NQVNLKSA+PgorCQkJU0hBUkVEX0hXX0NGR19FM19JMkNfTVVYMV9TSElGVDsKKworCS8qIFJlYWQgSTJDIG91dHB1dCB2YWx1ZSAqLworCXNmcF9jdHJsID0gUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKworCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJCSBkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twb3J0XS5lM19jbW5fcGluX2NmZykpOworCWkyY192YWxbSTJDX0JTQzBdID0gKHNmcF9jdHJsICYgUE9SVF9IV19DRkdfRTNfSTJDX01VWDBfTUFTSykgPiAwOworCWkyY192YWxbSTJDX0JTQzFdID0gKHNmcF9jdHJsICYgUE9SVF9IV19DRkdfRTNfSTJDX01VWDFfTUFTSykgPiAwOworCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyBCU0Mgc3dpdGNoXG4iKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IEkyQ19TV0lUQ0hfV0lEVEg7IGlkeCsrKQorCQlibngyeF9zZXRfY2ZnX3BpbihicCwgaTJjX3BpbnNbaWR4XSwgaTJjX3ZhbFtpZHhdKTsKK30KKworc3RhdGljIGludCBibngyeF9ic2NfcmVhZChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSAgc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJICB1OCBzbF9kZXZpZCwKKwkJCSAgdTE2IHNsX2FkZHIsCisJCQkgIHU4IGxjX2FkZHIsCisJCQkgIHU4IHhmZXJfY250LAorCQkJICB1MzIgKmRhdGFfYXJyYXkpCit7CisJdTMyIHZhbCwgaTsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCisJaWYgKChzbF9kZXZpZCAhPSAweGEwKSAmJiAoc2xfZGV2aWQgIT0gMHhhMikpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJpbnZhbGlkIHNsX2RldmlkIDB4JXhcbiIsIHNsX2RldmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHhmZXJfY250ID4gMTYpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJpbnZhbGlkIHhmZXJfY250ICVkLiBNYXggaXMgMTYgYnl0ZXNcbiIsCisJCQkJCXhmZXJfY250KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWJueDJ4X2JzY19tb2R1bGVfc2VsKHBhcmFtcyk7CisKKwl4ZmVyX2NudCA9IDE2IC0gbGNfYWRkcjsKKworCS8qIGVuYWJsZSB0aGUgZW5naW5lICovCisJdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfSU1DX0NPTU1BTkQpOworCXZhbCB8PSBNQ1BSX0lNQ19DT01NQU5EX0VOQUJMRTsKKwlSRUdfV1IoYnAsIE1DUF9SRUdfTUNQUl9JTUNfQ09NTUFORCwgdmFsKTsKKworCS8qIHByb2dyYW0gc2xhdmUgZGV2aWNlIElEICovCisJdmFsID0gKHNsX2RldmlkIDw8IDE2KSB8IHNsX2FkZHI7CisJUkVHX1dSKGJwLCBNQ1BfUkVHX01DUFJfSU1DX1NMQVZFX0NPTlRST0wsIHZhbCk7CisKKwkvKiBzdGFydCB4ZmVyIHdpdGggMCBieXRlIHRvIHVwZGF0ZSB0aGUgYWRkcmVzcyBwb2ludGVyID8/PyovCisJdmFsID0gKE1DUFJfSU1DX0NPTU1BTkRfRU5BQkxFKSB8CisJICAgICAgKE1DUFJfSU1DX0NPTU1BTkRfV1JJVEVfT1AgPDwKKwkJTUNQUl9JTUNfQ09NTUFORF9PUEVSQVRJT05fQklUU0hJRlQpIHwKKwkJKGxjX2FkZHIgPDwgTUNQUl9JTUNfQ09NTUFORF9UUkFOU0ZFUl9BRERSRVNTX0JJVFNISUZUKSB8ICgwKTsKKwlSRUdfV1IoYnAsIE1DUF9SRUdfTUNQUl9JTUNfQ09NTUFORCwgdmFsKTsKKworCS8qIHBvbGwgZm9yIGNvbXBsZXRpb24gKi8KKwlpID0gMDsKKwl2YWwgPSBSRUdfUkQoYnAsIE1DUF9SRUdfTUNQUl9JTUNfQ09NTUFORCk7CisJd2hpbGUgKCgodmFsID4+IE1DUFJfSU1DX0NPTU1BTkRfSU1DX1NUQVRVU19CSVRTSElGVCkgJiAweDMpICE9IDEpIHsKKwkJdWRlbGF5KDEwKTsKKwkJdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfSU1DX0NPTU1BTkQpOworCQlpZiAoaSsrID4gMTAwMCkgeworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJ3ciAwIGJ5dGUgdGltZWQgb3V0IGFmdGVyICVkIHRyeVxuIiwKKwkJCQkJCQkJaSk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAocmMgPT0gLUVGQVVMVCkKKwkJcmV0dXJuIHJjOworCisJLyogc3RhcnQgeGZlciB3aXRoIHJlYWQgb3AgKi8KKwl2YWwgPSAoTUNQUl9JTUNfQ09NTUFORF9FTkFCTEUpIHwKKwkJKE1DUFJfSU1DX0NPTU1BTkRfUkVBRF9PUCA8PAorCQlNQ1BSX0lNQ19DT01NQU5EX09QRVJBVElPTl9CSVRTSElGVCkgfAorCQkobGNfYWRkciA8PCBNQ1BSX0lNQ19DT01NQU5EX1RSQU5TRkVSX0FERFJFU1NfQklUU0hJRlQpIHwKKwkJICAoeGZlcl9jbnQpOworCVJFR19XUihicCwgTUNQX1JFR19NQ1BSX0lNQ19DT01NQU5ELCB2YWwpOworCisJLyogcG9sbCBmb3IgY29tcGxldGlvbiAqLworCWkgPSAwOworCXZhbCA9IFJFR19SRChicCwgTUNQX1JFR19NQ1BSX0lNQ19DT01NQU5EKTsKKwl3aGlsZSAoKCh2YWwgPj4gTUNQUl9JTUNfQ09NTUFORF9JTUNfU1RBVFVTX0JJVFNISUZUKSAmIDB4MykgIT0gMSkgeworCQl1ZGVsYXkoMTApOworCQl2YWwgPSBSRUdfUkQoYnAsIE1DUF9SRUdfTUNQUl9JTUNfQ09NTUFORCk7CisJCWlmIChpKysgPiAxMDAwKSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgInJkIG9wIHRpbWVkIG91dCBhZnRlciAlZCB0cnlcbiIsIGkpOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHJjID09IC1FRkFVTFQpCisJCXJldHVybiByYzsKKworCWZvciAoaSA9IChsY19hZGRyID4+IDIpOyBpIDwgNDsgaSsrKSB7CisJCWRhdGFfYXJyYXlbaV0gPSBSRUdfUkQoYnAsIChNQ1BfUkVHX01DUFJfSU1DX0RBVEFSRUcwICsgaSo0KSk7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCWRhdGFfYXJyYXlbaV0gPSAoKGRhdGFfYXJyYXlbaV0gJiAweDAwMDAwMGZmKSA8PCAyNCkgfAorCQkJCSgoZGF0YV9hcnJheVtpXSAmIDB4MDAwMGZmMDApIDw8IDgpIHwKKwkJCQkoKGRhdGFfYXJyYXlbaV0gJiAweDAwZmYwMDAwKSA+PiA4KSB8CisJCQkJKChkYXRhX2FycmF5W2ldICYgMHhmZjAwMDAwMCkgPj4gMjQpOworI2VuZGlmCisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYm54MnhfY2w0NV9yZWFkX29yX3dyaXRlKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgICAgIHU4IGRldmFkLCB1MTYgcmVnLCB1MTYgb3JfdmFsKQoreworCXUxNiB2YWw7CisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIGRldmFkLCByZWcsICZ2YWwpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgZGV2YWQsIHJlZywgdmFsIHwgb3JfdmFsKTsKK30KKworaW50IGJueDJ4X3BoeV9yZWFkKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1OCBwaHlfYWRkciwKKwkJICAgdTggZGV2YWQsIHUxNiByZWcsIHUxNiAqcmV0X3ZhbCkKIHsKIAl1OCBwaHlfaW5kZXg7CiAJLyoKQEAgLTE1MTAsOCArMzIxOCw4IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXU4IGJueDJ4X3BoeV93cml0ZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTggcGh5X2FkZHIsCi0JCSAgIHU4IGRldmFkLCB1MTYgcmVnLCB1MTYgdmFsKQoraW50IGJueDJ4X3BoeV93cml0ZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTggcGh5X2FkZHIsCisJCSAgICB1OCBkZXZhZCwgdTE2IHJlZywgdTE2IHZhbCkKIHsKIAl1OCBwaHlfaW5kZXg7CiAJLyoKQEAgLTE1MjcsOSArMzIzNSw2MiBAQAogCX0KIAlyZXR1cm4gLUVJTlZBTDsKIH0KK3N0YXRpYyB1OCBibngyeF9nZXRfd2FycGNvcmVfbGFuZShzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwl1OCBsYW5lID0gMDsKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MzIgcGF0aF9zd2FwLCBwYXRoX3N3YXBfb3ZyOworCXU4IHBhdGgsIHBvcnQ7CiAKLXN0YXRpYyB2b2lkIGJueDJ4X3NldF9hZXJfbW1kX3hneHMoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJICAgc3RydWN0IGJueDJ4X3BoeSAqcGh5KQorCXBhdGggPSBCUF9QQVRIKGJwKTsKKwlwb3J0ID0gcGFyYW1zLT5wb3J0OworCisJaWYgKGJueDJ4X2lzXzRfcG9ydF9tb2RlKGJwKSkgeworCQl1MzIgcG9ydF9zd2FwLCBwb3J0X3N3YXBfb3ZyOworCisJCS8qZmlndXJlIG91dCBwYXRoIHN3YXAgdmFsdWUgKi8KKwkJcGF0aF9zd2FwX292ciA9IFJFR19SRChicCwgTUlTQ19SRUdfRk9VUl9QT1JUX1BBVEhfU1dBUF9PVldSKTsKKwkJaWYgKHBhdGhfc3dhcF9vdnIgJiAweDEpCisJCQlwYXRoX3N3YXAgPSAocGF0aF9zd2FwX292ciAmIDB4Mik7CisJCWVsc2UKKwkJCXBhdGhfc3dhcCA9IFJFR19SRChicCwgTUlTQ19SRUdfRk9VUl9QT1JUX1BBVEhfU1dBUCk7CisKKwkJaWYgKHBhdGhfc3dhcCkKKwkJCXBhdGggPSBwYXRoIF4gMTsKKworCQkvKmZpZ3VyZSBvdXQgcG9ydCBzd2FwIHZhbHVlICovCisJCXBvcnRfc3dhcF9vdnIgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0ZPVVJfUE9SVF9QT1JUX1NXQVBfT1ZXUik7CisJCWlmIChwb3J0X3N3YXBfb3ZyICYgMHgxKQorCQkJcG9ydF9zd2FwID0gKHBvcnRfc3dhcF9vdnIgJiAweDIpOworCQllbHNlCisJCQlwb3J0X3N3YXAgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0ZPVVJfUE9SVF9QT1JUX1NXQVApOworCisJCWlmIChwb3J0X3N3YXApCisJCQlwb3J0ID0gcG9ydCBeIDE7CisKKwkJbGFuZSA9IChwb3J0PDwxKSArIHBhdGg7CisJfSBlbHNlIHsgLyogdHdvIHBvcnQgbW9kZSAtIG5vIHBvcnQgc3dhcCAqLworCisJCS8qZmlndXJlIG91dCBwYXRoIHN3YXAgdmFsdWUgKi8KKwkJcGF0aF9zd2FwX292ciA9CisJCQlSRUdfUkQoYnAsIE1JU0NfUkVHX1RXT19QT1JUX1BBVEhfU1dBUF9PVldSKTsKKwkJaWYgKHBhdGhfc3dhcF9vdnIgJiAweDEpIHsKKwkJCXBhdGhfc3dhcCA9IChwYXRoX3N3YXBfb3ZyICYgMHgyKTsKKwkJfSBlbHNlIHsKKwkJCXBhdGhfc3dhcCA9CisJCQkJUkVHX1JEKGJwLCBNSVNDX1JFR19UV09fUE9SVF9QQVRIX1NXQVApOworCQl9CisJCWlmIChwYXRoX3N3YXApCisJCQlwYXRoID0gcGF0aCBeIDE7CisKKwkJbGFuZSA9IHBhdGggPDwgMSA7CisJfQorCXJldHVybiBsYW5lOworfQorCitzdGF0aWMgdm9pZCBibngyeF9zZXRfYWVyX21tZChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgIHN0cnVjdCBibngyeF9waHkgKnBoeSkKIHsKIAl1MzIgc2VyX2xhbmU7CiAJdTE2IG9mZnNldCwgYWVyX3ZhbDsKQEAgLTE1MzgsMjAgKzMyOTksMjggQEAKIAkJICAgICBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX01BU1RFUl9NQVNLKSA+PgogCQkgICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX1NISUZUKTsKIAotCW9mZnNldCA9IHBoeS0+YWRkciArIHNlcl9sYW5lOwotCWlmIChDSElQX0lTX0UyKGJwKSkKKwlvZmZzZXQgPSAocGh5LT50eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCkgPworCQkocGh5LT5hZGRyICsgc2VyX2xhbmUpIDogMDsKKworCWlmIChVU0VTX1dBUlBDT1JFKGJwKSkgeworCQlhZXJfdmFsID0gYm54MnhfZ2V0X3dhcnBjb3JlX2xhbmUocGh5LCBwYXJhbXMpOworCQkvKgorCQkgKiBJbiBEdWFsLWxhbmUgbW9kZSwgdHdvIGxhbmVzIGFyZSBqb2luZWQgdG9nZXRoZXIsCisJCSAqIHNvIGluIG9yZGVyIHRvIGNvbmZpZ3VyZSB0aGVtLCB0aGUgQUVSIGJyb2FkY2FzdCBtZXRob2QgaXMKKwkJICogdXNlZCBoZXJlLgorCQkgKiAweDIwMCBpcyB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgZm9yIGxhbmVzIDAsMQorCQkgKiAweDIwMSBpcyB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgZm9yIGxhbmVzIDIsMworCQkgKi8KKwkJaWYgKHBoeS0+ZmxhZ3MgJiBGTEFHU19XQ19EVUFMX01PREUpCisJCQlhZXJfdmFsID0gKGFlcl92YWwgPj4gMSkgfCAweDIwMDsKKwl9IGVsc2UgaWYgKENISVBfSVNfRTIoYnApKQogCQlhZXJfdmFsID0gMHgzODAwICsgb2Zmc2V0IC0gMTsKIAllbHNlCiAJCWFlcl92YWwgPSAweDM4MDAgKyBvZmZzZXQ7CisJRFAoTkVUSUZfTVNHX0xJTkssICJTZXQgQUVSIHRvIDB4JXhcbiIsIGFlcl92YWwpOwogCUNMMjJfV1JfT1ZFUl9DTDQ1KGJwLCBwaHksIE1ESU9fUkVHX0JBTktfQUVSX0JMT0NLLAogCQkJICBNRElPX0FFUl9CTE9DS19BRVJfUkVHLCBhZXJfdmFsKTsKLX0KLXN0YXRpYyB2b2lkIGJueDJ4X3NldF9hZXJfbW1kX3NlcmRlcyhzdHJ1Y3QgYm54MnggKmJwLAotCQkJCSAgICAgc3RydWN0IGJueDJ4X3BoeSAqcGh5KQotewotCUNMMjJfV1JfT1ZFUl9DTDQ1KGJwLCBwaHksCi0JCQkgIE1ESU9fUkVHX0JBTktfQUVSX0JMT0NLLAotCQkJICBNRElPX0FFUl9CTE9DS19BRVJfUkVHLCAweDM4MDApOworCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNjExLDIwICszMzgwLDk3OSBAQAogCSAgICAgICBwYXJhbXMtPnBoeVtJTlRfUEhZXS5kZWZfbWRfZGV2YWQpOwogfQogCitzdGF0aWMgdm9pZCBibngyeF9jYWxjX2llZWVfYW5lZ19hZHYoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHUxNiAqaWVlZV9mYykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwkqaWVlZV9mYyA9IE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX0ZVTExfRFVQTEVYOworCS8qKgorCSAqIHJlc29sdmUgcGF1c2UgbW9kZSBhbmQgYWR2ZXJ0aXNlbWVudCBQbGVhc2UgcmVmZXIgdG8gVGFibGUKKwkgKiAyOEItMyBvZiB0aGUgODAyLjNhYi0xOTk5IHNwZWMKKwkgKi8KKworCXN3aXRjaCAocGh5LT5yZXFfZmxvd19jdHJsKSB7CisJY2FzZSBCTlgyWF9GTE9XX0NUUkxfQVVUTzoKKwkJaWYgKHBhcmFtcy0+cmVxX2ZjX2F1dG9fYWR2ID09IEJOWDJYX0ZMT1dfQ1RSTF9CT1RIKQorCQkJKmllZWVfZmMgfD0gTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQk9USDsKKwkJZWxzZQorCQkJKmllZWVfZmMgfD0KKwkJCU1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0FTWU1NRVRSSUM7CisJCWJyZWFrOworCisJY2FzZSBCTlgyWF9GTE9XX0NUUkxfVFg6CisJCSppZWVlX2ZjIHw9IE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0FTWU1NRVRSSUM7CisJCWJyZWFrOworCisJY2FzZSBCTlgyWF9GTE9XX0NUUkxfUlg6CisJY2FzZSBCTlgyWF9GTE9XX0NUUkxfQk9USDoKKwkJKmllZWVfZmMgfD0gTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQk9USDsKKwkJYnJlYWs7CisKKwljYXNlIEJOWDJYX0ZMT1dfQ1RSTF9OT05FOgorCWRlZmF1bHQ6CisJCSppZWVlX2ZjIHw9IE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX05PTkU7CisJCWJyZWFrOworCX0KKwlEUChORVRJRl9NU0dfTElOSywgImllZWVfZmMgPSAweCV4XG4iLCAqaWVlZV9mYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9waHlfdmFycyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXU4IGFjdHVhbF9waHlfaWR4LCBwaHlfaW5kZXgsIGxpbmtfY2ZnX2lkeDsKKwl1OCBwaHlfY29uZmlnX3N3YXBwZWQgPSBwYXJhbXMtPm11bHRpX3BoeV9jb25maWcgJgorCQkJUE9SVF9IV19DRkdfUEhZX1NXQVBQRURfRU5BQkxFRDsKKwlmb3IgKHBoeV9pbmRleCA9IElOVF9QSFk7IHBoeV9pbmRleCA8IHBhcmFtcy0+bnVtX3BoeXM7CisJICAgICAgcGh5X2luZGV4KyspIHsKKwkJbGlua19jZmdfaWR4ID0gTElOS19DT05GSUdfSURYKHBoeV9pbmRleCk7CisJCWFjdHVhbF9waHlfaWR4ID0gcGh5X2luZGV4OworCQlpZiAocGh5X2NvbmZpZ19zd2FwcGVkKSB7CisJCQlpZiAocGh5X2luZGV4ID09IEVYVF9QSFkxKQorCQkJCWFjdHVhbF9waHlfaWR4ID0gRVhUX1BIWTI7CisJCQllbHNlIGlmIChwaHlfaW5kZXggPT0gRVhUX1BIWTIpCisJCQkJYWN0dWFsX3BoeV9pZHggPSBFWFRfUEhZMTsKKwkJfQorCQlwYXJhbXMtPnBoeVthY3R1YWxfcGh5X2lkeF0ucmVxX2Zsb3dfY3RybCA9CisJCQlwYXJhbXMtPnJlcV9mbG93X2N0cmxbbGlua19jZmdfaWR4XTsKKworCQlwYXJhbXMtPnBoeVthY3R1YWxfcGh5X2lkeF0ucmVxX2xpbmVfc3BlZWQgPQorCQkJcGFyYW1zLT5yZXFfbGluZV9zcGVlZFtsaW5rX2NmZ19pZHhdOworCisJCXBhcmFtcy0+cGh5W2FjdHVhbF9waHlfaWR4XS5zcGVlZF9jYXBfbWFzayA9CisJCQlwYXJhbXMtPnNwZWVkX2NhcF9tYXNrW2xpbmtfY2ZnX2lkeF07CisKKwkJcGFyYW1zLT5waHlbYWN0dWFsX3BoeV9pZHhdLnJlcV9kdXBsZXggPQorCQkJcGFyYW1zLT5yZXFfZHVwbGV4W2xpbmtfY2ZnX2lkeF07CisKKwkJaWYgKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWRbbGlua19jZmdfaWR4XSA9PQorCQkgICAgU1BFRURfQVVUT19ORUcpCisJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LX1NUQVRVU19BVVRPX05FR09USUFURV9FTkFCTEVEOworCisJCURQKE5FVElGX01TR19MSU5LLCAicmVxX2Zsb3dfY3RybCAleCwgcmVxX2xpbmVfc3BlZWQgJXgsIgorCQkJICAgIiBzcGVlZF9jYXBfbWFzayAleFxuIiwKKwkJCSAgIHBhcmFtcy0+cGh5W2FjdHVhbF9waHlfaWR4XS5yZXFfZmxvd19jdHJsLAorCQkJICAgcGFyYW1zLT5waHlbYWN0dWFsX3BoeV9pZHhdLnJlcV9saW5lX3NwZWVkLAorCQkJICAgcGFyYW1zLT5waHlbYWN0dWFsX3BoeV9pZHhdLnNwZWVkX2NhcF9tYXNrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2V4dF9waHlfc2V0X3BhdXNlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgICBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJdTE2IHZhbDsKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwkvKiByZWFkIG1vZGlmeSB3cml0ZSBwYXVzZSBhZHZlcnRpemluZyAqLworCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX0FOX0RFVkFELCBNRElPX0FOX1JFR19BRFZfUEFVU0UsICZ2YWwpOworCisJdmFsICY9IH5NRElPX0FOX1JFR19BRFZfUEFVU0VfQk9USDsKKworCS8qIFBsZWFzZSByZWZlciB0byBUYWJsZSAyOEItMyBvZiA4MDIuM2FiLTE5OTkgc3BlYy4gKi8KKwlibngyeF9jYWxjX2llZWVfYW5lZ19hZHYocGh5LCBwYXJhbXMsICZ2YXJzLT5pZWVlX2ZjKTsKKwlpZiAoKHZhcnMtPmllZWVfZmMgJgorCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDKSA9PQorCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDKSB7CisJCXZhbCB8PSBNRElPX0FOX1JFR19BRFZfUEFVU0VfQVNZTU1FVFJJQzsKKwl9CisJaWYgKCh2YXJzLT5pZWVlX2ZjICYKKwkgICAgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQk9USCkgPT0KKwkgICAgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQk9USCkgeworCQl2YWwgfD0gTURJT19BTl9SRUdfQURWX1BBVVNFX1BBVVNFOworCX0KKwlEUChORVRJRl9NU0dfTElOSywgIkV4dCBwaHkgQU4gYWR2ZXJ0aXplIDB4JXhcbiIsIHZhbCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX0FOX0RFVkFELCBNRElPX0FOX1JFR19BRFZfUEFVU0UsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3BhdXNlX3Jlc29sdmUoc3RydWN0IGxpbmtfdmFycyAqdmFycywgdTMyIHBhdXNlX3Jlc3VsdCkKK3sJCQkJCQkvKiAgTEQJICAgIExQCSAqLworCXN3aXRjaCAocGF1c2VfcmVzdWx0KSB7CQkJLyogQVNZTSBQIEFTWU0gUCAqLworCWNhc2UgMHhiOgkJCQkvKiAgIDEgIDAgICAxICAxICovCisJCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9UWDsKKwkJYnJlYWs7CisKKwljYXNlIDB4ZToJCQkJLyogICAxICAxICAgMSAgMCAqLworCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfUlg7CisJCWJyZWFrOworCisJY2FzZSAweDU6CQkJCS8qICAgMCAgMSAgIDAgIDEgKi8KKwljYXNlIDB4NzoJCQkJLyogICAwICAxICAgMSAgMSAqLworCWNhc2UgMHhkOgkJCQkvKiAgIDEgIDEgICAwICAxICovCisJY2FzZSAweGY6CQkJCS8qICAgMSAgMSAgIDEgIDEgKi8KKwkJdmFycy0+Zmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX0JPVEg7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChwYXVzZV9yZXN1bHQgJiAoMTw8MCkpCisJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl9TWU1NRVRSSUNfUEFVU0U7CisJaWYgKHBhdXNlX3Jlc3VsdCAmICgxPDwxKSkKKwkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS19TVEFUVVNfTElOS19QQVJUTkVSX0FTWU1NRVRSSUNfUEFVU0U7Cit9CisKK3N0YXRpYyB1OCBibngyeF9leHRfcGh5X3Jlc29sdmVfZmMoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IGxkX3BhdXNlOwkJLyogbG9jYWwgKi8KKwl1MTYgbHBfcGF1c2U7CQkvKiBsaW5rIHBhcnRuZXIgKi8KKwl1MTYgcGF1c2VfcmVzdWx0OworCXU4IHJldCA9IDA7CisJLyogcmVhZCB0d2ljZSAqLworCisJdmFycy0+Zmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX05PTkU7CisKKwlpZiAocGh5LT5yZXFfZmxvd19jdHJsICE9IEJOWDJYX0ZMT1dfQ1RSTF9BVVRPKQorCQl2YXJzLT5mbG93X2N0cmwgPSBwaHktPnJlcV9mbG93X2N0cmw7CisJZWxzZSBpZiAocGh5LT5yZXFfbGluZV9zcGVlZCAhPSBTUEVFRF9BVVRPX05FRykKKwkJdmFycy0+Zmxvd19jdHJsID0gcGFyYW1zLT5yZXFfZmNfYXV0b19hZHY7CisJZWxzZSBpZiAodmFycy0+bGlua19zdGF0dXMgJiBMSU5LX1NUQVRVU19BVVRPX05FR09USUFURV9DT01QTEVURSkgeworCQlyZXQgPSAxOworCQlpZiAocGh5LT50eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTU0NjE4U0UpIHsKKwkJCWJueDJ4X2NsMjJfcmVhZChicCwgcGh5LAorCQkJCQkweDQsICZsZF9wYXVzZSk7CisJCQlibngyeF9jbDIyX3JlYWQoYnAsIHBoeSwKKwkJCQkJMHg1LCAmbHBfcGF1c2UpOworCQl9IGVsc2UgeworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCisJCQkJCU1ESU9fQU5fREVWQUQsCisJCQkJCU1ESU9fQU5fUkVHX0FEVl9QQVVTRSwgJmxkX3BhdXNlKTsKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAorCQkJCQlNRElPX0FOX0RFVkFELAorCQkJCQlNRElPX0FOX1JFR19MUF9BVVRPX05FRywgJmxwX3BhdXNlKTsKKwkJfQorCQlwYXVzZV9yZXN1bHQgPSAobGRfcGF1c2UgJgorCQkJCU1ESU9fQU5fUkVHX0FEVl9QQVVTRV9NQVNLKSA+PiA4OworCQlwYXVzZV9yZXN1bHQgfD0gKGxwX3BhdXNlICYKKwkJCQkgTURJT19BTl9SRUdfQURWX1BBVVNFX01BU0spID4+IDEwOworCQlEUChORVRJRl9NU0dfTElOSywgIkV4dCBQSFkgcGF1c2UgcmVzdWx0IDB4JXhcbiIsCisJCSAgIHBhdXNlX3Jlc3VsdCk7CisJCWJueDJ4X3BhdXNlX3Jlc29sdmUodmFycywgcGF1c2VfcmVzdWx0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCVdhcnBjb3JlIHNlY3Rpb24JCQkgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhlIGluaXRfaW50ZXJuYWxfd2FycGNvcmUgc2hvdWxkIG1pcnJvciB0aGUgeGd4cywKKyAqIGkuZS4gcmVzZXQgdGhlIGxhbmUgKGlmIG5lZWRlZCksIHNldCBhZXIgZm9yIHRoZQorICogaW5pdCBjb25maWd1cmF0aW9uLCBhbmQgc2V0L2NsZWFyIFNHTUlJIGZsYWcuIEludGVybmFsCisgKiBwaHkgaW5pdCBpcyBkb25lIHB1cmVseSBpbiBwaHlfaW5pdCBzdGFnZS4KKyAqLworc3RhdGljIHZvaWQgYm54Mnhfd2FycGNvcmVfZW5hYmxlX0FOX0tSKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkJc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJCXN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpIHsKKwl1MTYgdmFsMTYgPSAwLCBsYW5lLCBiYW0zNyA9IDA7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJRFAoTkVUSUZfTVNHX0xJTkssICJFbmFibGUgQXV0byBOZWdvdGlhdGlvbiBmb3IgS1JcbiIpOworCS8qIENoZWNrIGFkZGluZyBhZHZlcnRpc2VtZW50IGZvciAxRyBLWCAqLworCWlmICgoKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfQVVUT19ORUcpICYmCisJICAgICAocGh5LT5zcGVlZF9jYXBfbWFzayAmIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMUcpKSB8fAorCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwKSkgeworCQl1MTYgc2RfZGlnaXRhbDsKKwkJdmFsMTYgfD0gKDE8PDUpOworCisJCS8qIEVuYWJsZSBDTDM3IDFHIFBhcmFsbGVsIERldGVjdCAqLworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfQ09OVFJPTDEwMDBYMiwgJnNkX2RpZ2l0YWwpOworCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9DT05UUk9MMTAwMFgyLAorCQkJCSAoc2RfZGlnaXRhbCB8IDB4MSkpOworCisJCURQKE5FVElGX01TR19MSU5LLCAiQWR2ZXJ0aXplIDFHXG4iKTsKKwl9CisJaWYgKCgodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykgJiYKKwkgICAgIChwaHktPnNwZWVkX2NhcF9tYXNrICYgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMEcpKSB8fAorCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSAgU1BFRURfMTAwMDApKSB7CisJCS8qIENoZWNrIGFkZGluZyBhZHZlcnRpc2VtZW50IGZvciAxMEcgS1IgKi8KKwkJdmFsMTYgfD0gKDE8PDcpOworCQkvKiBFbmFibGUgMTBHIFBhcmFsbGVsIERldGVjdCAqLworCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQU5fREVWQUQsCisJCQkJTURJT19XQ19SRUdfUEFSX0RFVF8xMEdfQ1RSTCwgMSk7CisKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJBZHZlcnRpemUgMTBHXG4iKTsKKwl9CisKKwkvKiBTZXQgVHJhbnNtaXQgUE1EIHNldHRpbmdzICovCisJbGFuZSA9IGJueDJ4X2dldF93YXJwY29yZV9sYW5lKHBoeSwgcGFyYW1zKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCSAgICAgIE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVIgKyAweDEwKmxhbmUsCisJCSAgICAgKCgweDAyIDw8IE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVJfUE9TVDJfQ09FRkZfT0ZGU0VUKSB8CisJCSAgICAgICgweDA2IDw8IE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVJfSURSSVZFUl9PRkZTRVQpIHwKKwkJICAgICAgKDB4MDkgPDwgTURJT19XQ19SRUdfVFgwX1RYX0RSSVZFUl9JUFJFX0RSSVZFUl9PRkZTRVQpKSk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0NMNzJfVVNFUkIwX0NMNzJfT1NfREVGX0NUUkwsCisJCQkgMHgwM2YwKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfQ0w3Ml9VU0VSQjBfQ0w3Ml8yUDVfREVGX0NUUkwsCisJCQkgMHgwM2YwKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfQ0w3Ml9VU0VSQjBfQ0w3Ml9NSVNDMV9DT05UUk9MLAorCQkJIDB4MzgzZik7CisKKwkvKiBBZHZlcnRpc2VkIHNwZWVkcyAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19BTl9ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19BTl9JRUVFMUJMS19BTl9BRFZFUlRJU0VNRU5UMSwgdmFsMTYpOworCisJLyogRW5hYmxlIENMMzcgQkFNICovCisJaWYgKFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJICAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwgZGV2X2luZm8uCisJCQkgICAgcG9ydF9od19jb25maWdbcGFyYW1zLT5wb3J0XS5kZWZhdWx0X2NmZykpICYKKwkgICAgUE9SVF9IV19DRkdfRU5BQkxFX0JBTV9PTl9LUl9FTkFCTEVEKSB7CisJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJCU1ESU9fV0NfUkVHX0RJR0lUQUw2X01QNV9ORVhUUEFHRUNUUkwsICZiYW0zNyk7CisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX0RJR0lUQUw2X01QNV9ORVhUUEFHRUNUUkwsIGJhbTM3IHwgMSk7CisJCURQKE5FVElGX01TR19MSU5LLCAiRW5hYmxlIENMMzcgQkFNIG9uIEtSXG4iKTsKKwl9CisKKwkvKiBBZHZlcnRpc2UgcGF1c2UgKi8KKwlibngyeF9leHRfcGh5X3NldF9wYXVzZShwYXJhbXMsIHBoeSwgdmFycyk7CisKKwkvKiBFbmFibGUgQXV0b25lZyAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19BTl9ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19JRUVFMEJMS19NSUlDTlRMLCAweDEwMDApOworCisJLyogT3ZlciAxRyAtIEFOIGxvY2FsIGRldmljZSB1c2VyIHBhZ2UgMSAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX0RJR0lUQUwzX1VQMSwgMHgxZik7CisKKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX0RJR0lUQUw1X01JU0M3LCAmdmFsMTYpOworCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0RJR0lUQUw1X01JU0M3LCB2YWwxNiB8IDB4MTAwKTsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfd2FycGNvcmVfc2V0XzEwR19LUihzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJICAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MTYgdmFsOworCisJLyogRGlzYWJsZSBBdXRvbmVnICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfQ09OVFJPTDEwMDBYMiwgMHg3KTsKKworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19BTl9ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19QQVJfREVUXzEwR19DVFJMLCAwKTsKKworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19DTDcyX1VTRVJCMF9DTDcyX01JU0MxX0NPTlRST0wsIDB4M2YwMCk7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQU5fREVWQUQsCisJCQkgTURJT19XQ19SRUdfQU5fSUVFRTFCTEtfQU5fQURWRVJUSVNFTUVOVDEsIDApOworCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX0FOX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0lFRUUwQkxLX01JSUNOVEwsIDB4MCk7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQlNRElPX1dDX1JFR19ESUdJVEFMM19VUDEsIDB4MSk7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfRElHSVRBTDVfTUlTQzcsIDB4YSk7CisKKwkvKiBEaXNhYmxlIENMMzYgUENTIFR4ICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJTURJT19XQ19SRUdfWEdYU0JMSzFfTEFORUNUUkwwLCAweDApOworCisJLyogRG91YmxlIFdpZGUgU2luZ2xlIERhdGEgUmF0ZSBAIHBsbCByYXRlICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJTURJT19XQ19SRUdfWEdYU0JMSzFfTEFORUNUUkwxLCAweEZGRkYpOworCisJLyogTGVhdmUgY2w3MiB0cmFpbmluZyBlbmFibGUsIG5lZWRlZCBmb3IgS1IgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELAorCQlNRElPX1dDX1JFR19QTURfSUVFRTlCTEtfVEVOR0JBU0VfS1JfUE1EX0NPTlRST0xfUkVHSVNURVJfMTUwLAorCQkweDIpOworCisJLyogTGVhdmUgQ0w3MiBlbmFibGVkICovCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfQ0w3Ml9VU0VSQjBfQ0w3Ml9NSVNDMV9DT05UUk9MLAorCQkJICZ2YWwpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19DTDcyX1VTRVJCMF9DTDcyX01JU0MxX0NPTlRST0wsCisJCQkgdmFsIHwgMHgzODAwKTsKKworCS8qIFNldCBzcGVlZCB2aWEgUE1BL1BNRCByZWdpc3RlciAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsCisJCQkgTURJT19XQ19SRUdfSUVFRTBCTEtfTUlJQ05UTCwgMHgyMDQwKTsKKworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsCisJCQkgTURJT19XQ19SRUdfSUVFRTBCTEtfQVVUT05FR05QLCAweEIpOworCisJLypFbmFibGUgZW5jb2RlZCBmb3JjZWQgc3BlZWQgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9NSVNDMiwgMHgzMCk7CisKKwkvKiBUdXJuIFRYIHNjcmFtYmxlIHBheWxvYWQgb25seSB0aGUgNjQvNjYgc2NyYW1ibGVyICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX1RYNjZfQ09OVFJPTCwgMHg5KTsKKworCS8qIFR1cm4gUlggc2NyYW1ibGUgcGF5bG9hZCBvbmx5IHRoZSA2NC82NiBzY3JhbWJsZXIgKi8KKwlibngyeF9jbDQ1X3JlYWRfb3Jfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQkgTURJT19XQ19SRUdfUlg2Nl9DT05UUk9MLCAweEY5KTsKKworCS8qIHNldCBhbmQgY2xlYXIgbG9vcGJhY2sgdG8gY2F1c2UgYSByZXNldCB0byA2NC82NiBkZWNvZGVyICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0lFRUUwQkxLX01JSUNOVEwsIDB4NDAwMCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0lFRUUwQkxLX01JSUNOVEwsIDB4MCk7CisKK30KKworc3RhdGljIHZvaWQgYm54Mnhfd2FycGNvcmVfc2V0XzEwR19YRkkoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICAgICAgdTggaXNfeGZpKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXUxNiBtaXNjMV92YWwsIHRhcF92YWwsIHR4X2RyaXZlcl92YWwsIGxhbmUsIHZhbDsKKwkvKiBIb2xkIHJ4U2VxU3RhcnQgKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX0RTQzJCMF9EU0NfTUlTQ19DVFJMMCwgJnZhbCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0RTQzJCMF9EU0NfTUlTQ19DVFJMMCwgKHZhbCB8IDB4ODAwMCkpOworCisJLyogSG9sZCB0eF9maWZvX3Jlc2V0ICovCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQlNRElPX1dDX1JFR19TRVJERVNESUdJVEFMX0NPTlRST0wxMDAwWDMsICZ2YWwpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19TRVJERVNESUdJVEFMX0NPTlRST0wxMDAwWDMsICh2YWwgfCAweDEpKTsKKworCS8qIERpc2FibGUgQ0w3MyBBTiAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19BTl9ERVZBRCwgTURJT19BTl9SRUdfQ1RSTCwgMCk7CisKKwkvKiBEaXNhYmxlIDEwMEZYIEVuYWJsZSBhbmQgQXV0by1EZXRlY3QgKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX0ZYMTAwX0NUUkwxLCAmdmFsKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfRlgxMDBfQ1RSTDEsICh2YWwgJiAweEZGRkEpKTsKKworCS8qIERpc2FibGUgMTAwRlggSWRsZSBkZXRlY3QgKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX0ZYMTAwX0NUUkwzLCAmdmFsKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfRlgxMDBfQ1RSTDMsICh2YWwgfCAweDAwODApKTsKKworCS8qIFNldCBCbG9jayBhZGRyZXNzIHRvIFJlbW90ZSBQSFkgJiBDbGVhciBmb3JjZWRfc3BlZWRbNV0gKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX0RJR0lUQUw0X01JU0MzLCAmdmFsKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfRElHSVRBTDRfTUlTQzMsICh2YWwgJiAweEZGN0YpKTsKKworCS8qIFR1cm4gb2ZmIGF1dG8tZGV0ZWN0ICYgZmliZXIgbW9kZSAqLworCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9DT05UUk9MMTAwMFgxLCAmdmFsKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9DT05UUk9MMTAwMFgxLAorCQkJICh2YWwgJiAweEZGRUUpKTsKKworCS8qIFNldCBmaWx0ZXJfZm9yY2VfbGluaywgZGlzYWJsZV9mYWxzZV9saW5rIGFuZCBwYXJhbGxlbF9kZXRlY3QgKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfQ09OVFJPTDEwMDBYMiwgJnZhbCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfQ09OVFJPTDEwMDBYMiwKKwkJCSAoKHZhbCB8IDB4MDAwNikgJiAweEZGRkUpKTsKKworCS8qIFNldCBYRkkgLyBTRkkgKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfTUlTQzEsICZtaXNjMV92YWwpOworCisJbWlzYzFfdmFsICY9IH4oMHgxZik7CisKKwlpZiAoaXNfeGZpKSB7CisJCW1pc2MxX3ZhbCB8PSAweDU7CisJCXRhcF92YWwgPSAoKDB4MDggPDwgTURJT19XQ19SRUdfVFhfRklSX1RBUF9QT1NUX1RBUF9PRkZTRVQpIHwKKwkJCSAgICgweDM3IDw8IE1ESU9fV0NfUkVHX1RYX0ZJUl9UQVBfTUFJTl9UQVBfT0ZGU0VUKSB8CisJCQkgICAoMHgwMCA8PCBNRElPX1dDX1JFR19UWF9GSVJfVEFQX1BSRV9UQVBfT0ZGU0VUKSk7CisJCXR4X2RyaXZlcl92YWwgPQorCQkgICAgICAoKDB4MDAgPDwgTURJT19XQ19SRUdfVFgwX1RYX0RSSVZFUl9QT1NUMl9DT0VGRl9PRkZTRVQpIHwKKwkJICAgICAgICgweDAyIDw8IE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVJfSURSSVZFUl9PRkZTRVQpIHwKKwkJICAgICAgICgweDAzIDw8IE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVJfSVBSRV9EUklWRVJfT0ZGU0VUKSk7CisKKwl9IGVsc2UgeworCQltaXNjMV92YWwgfD0gMHg5OworCQl0YXBfdmFsID0gKCgweDEyIDw8IE1ESU9fV0NfUkVHX1RYX0ZJUl9UQVBfUE9TVF9UQVBfT0ZGU0VUKSB8CisJCQkgICAoMHgyZCA8PCBNRElPX1dDX1JFR19UWF9GSVJfVEFQX01BSU5fVEFQX09GRlNFVCkgfAorCQkJICAgKDB4MDAgPDwgTURJT19XQ19SRUdfVFhfRklSX1RBUF9QUkVfVEFQX09GRlNFVCkpOworCQl0eF9kcml2ZXJfdmFsID0KKwkJICAgICAgKCgweDAyIDw8IE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVJfUE9TVDJfQ09FRkZfT0ZGU0VUKSB8CisJCSAgICAgICAoMHgwMiA8PCBNRElPX1dDX1JFR19UWDBfVFhfRFJJVkVSX0lEUklWRVJfT0ZGU0VUKSB8CisJCSAgICAgICAoMHgwMiA8PCBNRElPX1dDX1JFR19UWDBfVFhfRFJJVkVSX0lQUkVfRFJJVkVSX09GRlNFVCkpOworCX0KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9NSVNDMSwgbWlzYzFfdmFsKTsKKworCS8qIFNldCBUcmFuc21pdCBQTUQgc2V0dGluZ3MgKi8KKwlsYW5lID0gYm54MnhfZ2V0X3dhcnBjb3JlX2xhbmUocGh5LCBwYXJhbXMpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19UWF9GSVJfVEFQLAorCQkJIHRhcF92YWwgfCBNRElPX1dDX1JFR19UWF9GSVJfVEFQX0VOQUJMRSk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVIgKyAweDEwKmxhbmUsCisJCQkgdHhfZHJpdmVyX3ZhbCk7CisKKwkvKiBFbmFibGUgZmliZXIgbW9kZSwgZW5hYmxlIGFuZCBpbnZlcnQgc2lnX2RldCAqLworCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9DT05UUk9MMTAwMFgxLCAmdmFsKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9DT05UUk9MMTAwMFgxLCB2YWwgfCAweGQpOworCisJLyogU2V0IEJsb2NrIGFkZHJlc3MgdG8gUmVtb3RlIFBIWSAmIFNldCBmb3JjZWRfc3BlZWRbNV0sIDQwYml0IG1vZGUgKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX0RJR0lUQUw0X01JU0MzLCAmdmFsKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfRElHSVRBTDRfTUlTQzMsIHZhbCB8IDB4ODA4MCk7CisKKwkvKiAxMEcgWEZJIEZ1bGwgRHVwbGV4ICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0lFRUUwQkxLX01JSUNOVEwsIDB4MTAwKTsKKworCS8qIFJlbGVhc2UgdHhfZmlmb19yZXNldCAqLworCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9DT05UUk9MMTAwMFgzLCAmdmFsKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9DT05UUk9MMTAwMFgzLCB2YWwgJiAweEZGRkUpOworCisJLyogUmVsZWFzZSByeFNlcVN0YXJ0ICovCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQlNRElPX1dDX1JFR19EU0MyQjBfRFNDX01JU0NfQ1RSTDAsICZ2YWwpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19EU0MyQjBfRFNDX01JU0NfQ1RSTDAsICh2YWwgJiAweDdGRkYpKTsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfd2FycGNvcmVfc2V0XzIwR19LUjIoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICAgc3RydWN0IGJueDJ4X3BoeSAqcGh5KQoreworCURQKE5FVElGX01TR19MSU5LLCAiS1IyIHN0aWxsIG5vdCBzdXBwb3J0ZWQgISEhXG4iKTsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfd2FycGNvcmVfc2V0XzIwR19EWEdYUyhzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQkgc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCQkgdTE2IGxhbmUpCit7CisJLyogUngwIGFuYVJ4Q29udHJvbDFHICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX1JYMF9BTkFSWENPTlRST0wxRywgMHg5MCk7CisKKwkvKiBSeDIgYW5hUnhDb250cm9sMUcgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfUlgyX0FOQVJYQ09OVFJPTDFHLCAweDkwKTsKKworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19SWDY2X1NDVzAsIDB4RTA3MCk7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfUlg2Nl9TQ1cxLCAweEMwRDApOworCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX1JYNjZfU0NXMiwgMHhBMEIwKTsKKworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19SWDY2X1NDVzMsIDB4ODA5MCk7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfUlg2Nl9TQ1cwX01BU0ssIDB4RjBGMCk7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfUlg2Nl9TQ1cxX01BU0ssIDB4RjBGMCk7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfUlg2Nl9TQ1cyX01BU0ssIDB4RjBGMCk7CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfUlg2Nl9TQ1czX01BU0ssIDB4RjBGMCk7CisKKwkvKiBTZXJkZXMgRGlnaXRhbCBNaXNjMSAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19TRVJERVNESUdJVEFMX01JU0MxLCAweDYwMDgpOworCisJLyogU2VyZGVzIERpZ2l0YWw0IE1pc2MzICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0RJR0lUQUw0X01JU0MzLCAweDgwODgpOworCisJLyogU2V0IFRyYW5zbWl0IFBNRCBzZXR0aW5ncyAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19UWF9GSVJfVEFQLAorCQkJKCgweDEyIDw8IE1ESU9fV0NfUkVHX1RYX0ZJUl9UQVBfUE9TVF9UQVBfT0ZGU0VUKSB8CisJCQkgKDB4MmQgPDwgTURJT19XQ19SRUdfVFhfRklSX1RBUF9NQUlOX1RBUF9PRkZTRVQpIHwKKwkJCSAoMHgwMCA8PCBNRElPX1dDX1JFR19UWF9GSVJfVEFQX1BSRV9UQVBfT0ZGU0VUKSB8CisJCQkgTURJT19XQ19SRUdfVFhfRklSX1RBUF9FTkFCTEUpKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCSAgICAgIE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVIgKyAweDEwKmxhbmUsCisJCSAgICAgKCgweDAyIDw8IE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVJfUE9TVDJfQ09FRkZfT0ZGU0VUKSB8CisJCSAgICAgICgweDAyIDw8IE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVJfSURSSVZFUl9PRkZTRVQpIHwKKwkJICAgICAgKDB4MDIgPDwgTURJT19XQ19SRUdfVFgwX1RYX0RSSVZFUl9JUFJFX0RSSVZFUl9PRkZTRVQpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3dhcnBjb3JlX3NldF9zZ21paV9zcGVlZChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJCSAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCQkgICB1OCBmaWJlcl9tb2RlKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXUxNiB2YWwxNiwgZGlnY3RybF9reDEsIGRpZ2N0cmxfa3gyOworCXU4IGxhbmU7CisKKwlsYW5lID0gYm54MnhfZ2V0X3dhcnBjb3JlX2xhbmUocGh5LCBwYXJhbXMpOworCisJLyogQ2xlYXIgWEZJIGNsb2NrIGNvbXAgaW4gbm9uLTEwRyBzaW5nbGUgbGFuZSBtb2RlLiAqLworCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJTURJT19XQ19SRUdfUlg2Nl9DT05UUk9MLCAmdmFsMTYpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19SWDY2X0NPTlRST0wsIHZhbDE2ICYgfigzPDwxMykpOworCisJaWYgKHBoeS0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfQVVUT19ORUcpIHsKKwkJLyogU0dNSUkgQXV0b25lZyAqLworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQlNRElPX1dDX1JFR19DT01CT19JRUVFMF9NSUlDVFJMLCAmdmFsMTYpOworCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkJIE1ESU9fV0NfUkVHX0NPTUJPX0lFRUUwX01JSUNUUkwsCisJCQkJIHZhbDE2IHwgMHgxMDAwKTsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJzZXQgU0dNSUkgQVVUT05FR1xuIik7CisJfSBlbHNlIHsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkJTURJT19XQ19SRUdfQ09NQk9fSUVFRTBfTUlJQ1RSTCwgJnZhbDE2KTsKKwkJdmFsMTYgJj0gMHhjZmJmOworCQlzd2l0Y2ggKHBoeS0+cmVxX2xpbmVfc3BlZWQpIHsKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDoKKwkJCXZhbDE2IHw9IDB4MjAwMDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDA6CisJCQl2YWwxNiB8PSAweDAwNDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiU3BlZWQgbm90IHN1cHBvcnRlZDogMHgleCIKKwkJCQkJICAgIlxuIiwgcGh5LT5yZXFfbGluZV9zcGVlZCk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAocGh5LT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJdmFsMTYgfD0gMHgwMTAwOworCisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQlNRElPX1dDX1JFR19DT01CT19JRUVFMF9NSUlDVFJMLCB2YWwxNik7CisKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJzZXQgU0dNSUkgZm9yY2Ugc3BlZWQgJWRcbiIsCisJCQkgICAgICAgcGh5LT5yZXFfbGluZV9zcGVlZCk7CisJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJCU1ESU9fV0NfUkVHX0NPTUJPX0lFRUUwX01JSUNUUkwsICZ2YWwxNik7CisJCURQKE5FVElGX01TR19MSU5LLCAiICAocmVhZGJhY2spICV4XG4iLCB2YWwxNik7CisJfQorCisJLyogU0dNSUkgU2xhdmUgbW9kZSBhbmQgZGlzYWJsZSBzaWduYWwgZGV0ZWN0ICovCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQlNRElPX1dDX1JFR19TRVJERVNESUdJVEFMX0NPTlRST0wxMDAwWDEsICZkaWdjdHJsX2t4MSk7CisJaWYgKGZpYmVyX21vZGUpCisJCWRpZ2N0cmxfa3gxID0gMTsKKwllbHNlCisJCWRpZ2N0cmxfa3gxICY9IDB4ZmY0YTsKKworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfQ09OVFJPTDEwMDBYMSwKKwkJCWRpZ2N0cmxfa3gxKTsKKworCS8qIFR1cm4gb2ZmIHBhcmFsbGVsIGRldGVjdCAqLworCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9DT05UUk9MMTAwMFgyLCAmZGlnY3RybF9reDIpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfQ09OVFJPTDEwMDBYMiwKKwkJCShkaWdjdHJsX2t4MiAmIH4oMTw8MikpKTsKKworCS8qIFJlLWVuYWJsZSBwYXJhbGxlbCBkZXRlY3QgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQlNRElPX1dDX1JFR19TRVJERVNESUdJVEFMX0NPTlRST0wxMDAwWDIsCisJCQkoZGlnY3RybF9reDIgfCAoMTw8MikpKTsKKworCS8qIEVuYWJsZSBhdXRvZGV0ICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9DT05UUk9MMTAwMFgxLAorCQkJKGRpZ2N0cmxfa3gxIHwgMHgxMCkpOworfQorCitzdGF0aWMgdm9pZCBibngyeF93YXJwY29yZV9yZXNldF9sYW5lKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgICAgIHU4IHJlc2V0KQoreworCXUxNiB2YWw7CisJLyogVGFrZSBsYW5lIG91dCBvZiByZXNldCBhZnRlciBjb25maWd1cmF0aW9uIGlzIGZpbmlzaGVkICovCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQlNRElPX1dDX1JFR19ESUdJVEFMNV9NSVNDNiwgJnZhbCk7CisJaWYgKHJlc2V0KQorCQl2YWwgfD0gMHhDMDAwOworCWVsc2UKKwkJdmFsICY9IDB4M0ZGRjsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfRElHSVRBTDVfTUlTQzYsIHZhbCk7CisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfRElHSVRBTDVfTUlTQzYsICZ2YWwpOworfQorCisKKwkvKiBDbGVhciBTRkkvWEZJIGxpbmsgc2V0dGluZ3MgcmVnaXN0ZXJzICovCitzdGF0aWMgdm9pZCBibngyeF93YXJwY29yZV9jbGVhcl9yZWdzKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICAgICB1MTYgbGFuZSkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MTYgdmFsMTY7CisKKwkvKiBTZXQgWEZJIGNsb2NrIGNvbXAgYXMgZGVmYXVsdC4gKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX1JYNjZfQ09OVFJPTCwgJnZhbDE2KTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfUlg2Nl9DT05UUk9MLCB2YWwxNiB8ICgzPDwxMykpOworCisJYm54Mnhfd2FycGNvcmVfcmVzZXRfbGFuZShicCwgcGh5LCAxKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQU5fREVWQUQsIE1ESU9fQU5fUkVHX0NUUkwsIDApOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19GWDEwMF9DVFJMMSwgMHgwMTRhKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfRlgxMDBfQ1RSTDMsIDB4MDgwMCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0RJR0lUQUw0X01JU0MzLCAweDgwMDgpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19TRVJERVNESUdJVEFMX0NPTlRST0wxMDAwWDEsIDB4MDE5NSk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfQ09OVFJPTDEwMDBYMiwgMHgwMDA3KTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkgTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9DT05UUk9MMTAwMFgzLCAweDAwMDIpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19TRVJERVNESUdJVEFMX01JU0MxLCAweDYwMDApOworCWxhbmUgPSBibngyeF9nZXRfd2FycGNvcmVfbGFuZShwaHksIHBhcmFtcyk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX1RYX0ZJUl9UQVAsIDB4MDAwMCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVIgKyAweDEwKmxhbmUsIDB4MDk5MCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0lFRUUwQkxLX01JSUNOVEwsIDB4MjA0MCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0NPTUJPX0lFRUUwX01JSUNUUkwsIDB4MDE0MCk7CisJYm54Mnhfd2FycGNvcmVfcmVzZXRfbGFuZShicCwgcGh5LCAwKTsKK30KKworc3RhdGljIGludCBibngyeF9nZXRfbW9kX2Fic19pbnRfY2ZnKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCQl1MzIgY2hpcF9pZCwKKwkJCQkJCXUzMiBzaG1lbV9iYXNlLCB1OCBwb3J0LAorCQkJCQkJdTggKmdwaW9fbnVtLCB1OCAqZ3Bpb19wb3J0KQoreworCXUzMiBjZmdfcGluOworCSpncGlvX251bSA9IDA7CisJKmdwaW9fcG9ydCA9IDA7CisJaWYgKENISVBfSVNfRTMoYnApKSB7CisJCWNmZ19waW4gPSAoUkVHX1JEKGJwLCBzaG1lbV9iYXNlICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJCWRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLmUzX3NmcF9jdHJsKSkgJgorCQkJCVBPUlRfSFdfQ0ZHX0UzX01PRF9BQlNfTUFTSykgPj4KKwkJCQlQT1JUX0hXX0NGR19FM19NT0RfQUJTX1NISUZUOworCisJCS8qCisJCSAqIFNob3VsZCBub3QgaGFwcGVuLiBUaGlzIGZ1bmN0aW9uIGNhbGxlZCB1cG9uIGludGVycnVwdAorCQkgKiB0cmlnZ2VyZWQgYnkgR1BJTyAoIHNpbmNlIEVQSU8gY2FuIG9ubHkgZ2VuZXJhdGUgaW50ZXJydXB0cworCQkgKiB0byBNQ1ApLgorCQkgKiBTbyBpZiB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgYW5kIG5vbmUgb2YgdGhlIEdQSU9zIHdhcyBzZXQsCisJCSAqIGl0IG1lYW5zIHRoZSBzaGl0IGhpdCB0aGUgZmFuLgorCQkgKi8KKwkJaWYgKChjZmdfcGluIDwgUElOX0NGR19HUElPMF9QMCkgfHwKKwkJICAgIChjZmdfcGluID4gUElOX0NGR19HUElPM19QMSkpIHsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiRVJST1I6IEludmFsaWQgY2ZnIHBpbiAleCBmb3IgIgorCQkJCQkgICAibW9kdWxlIGRldGVjdCBpbmRpY2F0aW9uXG4iLAorCQkJCSAgICAgICBjZmdfcGluKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJKmdwaW9fbnVtID0gKGNmZ19waW4gLSBQSU5fQ0ZHX0dQSU8wX1AwKSAmIDB4MzsKKwkJKmdwaW9fcG9ydCA9IChjZmdfcGluIC0gUElOX0NGR19HUElPMF9QMCkgPj4gMjsKKwl9IGVsc2UgeworCQkqZ3Bpb19udW0gPSBNSVNDX1JFR0lTVEVSU19HUElPXzM7CisJCSpncGlvX3BvcnQgPSBwb3J0OworCX0KKwlEUChORVRJRl9NU0dfTElOSywgIk1PRF9BQlMgaW50IEdQSU8lZF9QJWRcbiIsICpncGlvX251bSwgKmdwaW9fcG9ydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfaXNfc2ZwX21vZHVsZV9wbHVnZ2VkKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgICAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggZ3Bpb19udW0sIGdwaW9fcG9ydDsKKwl1MzIgZ3Bpb192YWw7CisJaWYgKGJueDJ4X2dldF9tb2RfYWJzX2ludF9jZmcoYnAsIHBhcmFtcy0+Y2hpcF9pZCwKKwkJCQkgICAgICBwYXJhbXMtPnNobWVtX2Jhc2UsIHBhcmFtcy0+cG9ydCwKKwkJCQkgICAgICAmZ3Bpb19udW0sICZncGlvX3BvcnQpICE9IDApCisJCXJldHVybiAwOworCWdwaW9fdmFsID0gYm54MnhfZ2V0X2dwaW8oYnAsIGdwaW9fbnVtLCBncGlvX3BvcnQpOworCisJLyogQ2FsbCB0aGUgaGFuZGxpbmcgZnVuY3Rpb24gaW4gY2FzZSBtb2R1bGUgaXMgZGV0ZWN0ZWQgKi8KKwlpZiAoZ3Bpb192YWwgPT0gMCkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfd2FycGNvcmVfY29uZmlnX2luaXQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MzIgc2VyZGVzX25ldF9pZjsKKwl1OCBmaWJlcl9tb2RlOworCXUxNiBsYW5lID0gYm54MnhfZ2V0X3dhcnBjb3JlX2xhbmUocGh5LCBwYXJhbXMpOworCXNlcmRlc19uZXRfaWYgPSAoUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKworCQkJIG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sIGRldl9pbmZvLgorCQkJCSAgcG9ydF9od19jb25maWdbcGFyYW1zLT5wb3J0XS5kZWZhdWx0X2NmZykpICYKKwkJCSBQT1JUX0hXX0NGR19ORVRfU0VSREVTX0lGX01BU0spOworCURQKE5FVElGX01TR19MSU5LLCAiQmVnaW4gV2FycGNvcmUgaW5pdCwgbGlua19zcGVlZCAlZCwgIgorCQkJICAgInNlcmRlc19uZXRfaWYgPSAweCV4XG4iLAorCQkgICAgICAgdmFycy0+bGluZV9zcGVlZCwgc2VyZGVzX25ldF9pZik7CisJYm54Mnhfc2V0X2Flcl9tbWQocGFyYW1zLCBwaHkpOworCisJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9YR1hTX0ZMQUc7CisJaWYgKChzZXJkZXNfbmV0X2lmID09IFBPUlRfSFdfQ0ZHX05FVF9TRVJERVNfSUZfU0dNSUkpIHx8CisJICAgIChwaHktPnJlcV9saW5lX3NwZWVkICYmCisJICAgICAoKHBoeS0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfMTAwKSB8fAorCSAgICAgIChwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEXzEwKSkpKSB7CisJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfU0dNSUlfRkxBRzsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIFNHTUlJIG1vZGVcbiIpOworCQlibngyeF93YXJwY29yZV9jbGVhcl9yZWdzKHBoeSwgcGFyYW1zLCBsYW5lKTsKKwkJYm54Mnhfd2FycGNvcmVfc2V0X3NnbWlpX3NwZWVkKHBoeSwgcGFyYW1zLCAwKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHNlcmRlc19uZXRfaWYpIHsKKwkJY2FzZSBQT1JUX0hXX0NGR19ORVRfU0VSREVTX0lGX0tSOgorCQkJLyogRW5hYmxlIEtSIEF1dG8gTmVnICovCisJCQlpZiAocGFyYW1zLT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX05PTkUpCisJCQkJYm54Mnhfd2FycGNvcmVfZW5hYmxlX0FOX0tSKHBoeSwgcGFyYW1zLCB2YXJzKTsKKwkJCWVsc2UgeworCQkJCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyBLUiAxMEctRm9yY2VcbiIpOworCQkJCWJueDJ4X3dhcnBjb3JlX3NldF8xMEdfS1IocGh5LCBwYXJhbXMsIHZhcnMpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JUX0hXX0NGR19ORVRfU0VSREVTX0lGX1hGSToKKwkJCWJueDJ4X3dhcnBjb3JlX2NsZWFyX3JlZ3MocGh5LCBwYXJhbXMsIGxhbmUpOworCQkJaWYgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTAwMDApIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgMTBHIFhGSVxuIik7CisJCQkJYm54Mnhfd2FycGNvcmVfc2V0XzEwR19YRkkocGh5LCBwYXJhbXMsIDEpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoU0lOR0xFX01FRElBX0RJUkVDVChwYXJhbXMpKSB7CisJCQkJCURQKE5FVElGX01TR19MSU5LLCAiMUcgRmliZXJcbiIpOworCQkJCQlmaWJlcl9tb2RlID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlEUChORVRJRl9NU0dfTElOSywgIjEwLzEwMC8xRyBTR01JSVxuIik7CisJCQkJCWZpYmVyX21vZGUgPSAwOworCQkJCX0KKwkJCQlibngyeF93YXJwY29yZV9zZXRfc2dtaWlfc3BlZWQocGh5LAorCQkJCQkJCQlwYXJhbXMsCisJCQkJCQkJCWZpYmVyX21vZGUpOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX05FVF9TRVJERVNfSUZfU0ZJOgorCisJCQlibngyeF93YXJwY29yZV9jbGVhcl9yZWdzKHBoeSwgcGFyYW1zLCBsYW5lKTsKKwkJCWlmICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzEwMDAwKSB7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIDEwRyBTRklcbiIpOworCQkJCWJueDJ4X3dhcnBjb3JlX3NldF8xMEdfWEZJKHBoeSwgcGFyYW1zLCAwKTsKKwkJCX0gZWxzZSBpZiAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwKSB7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIDFHIEZpYmVyXG4iKTsKKwkJCQlibngyeF93YXJwY29yZV9zZXRfc2dtaWlfc3BlZWQocGh5LCBwYXJhbXMsIDEpOworCQkJfQorCQkJLyogSXNzdWUgTW9kdWxlIGRldGVjdGlvbiAqLworCQkJaWYgKGJueDJ4X2lzX3NmcF9tb2R1bGVfcGx1Z2dlZChwaHksIHBhcmFtcykpCisJCQkJYm54Mnhfc2ZwX21vZHVsZV9kZXRlY3Rpb24ocGh5LCBwYXJhbXMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JUX0hXX0NGR19ORVRfU0VSREVTX0lGX0RYR1hTOgorCQkJaWYgKHZhcnMtPmxpbmVfc3BlZWQgIT0gU1BFRURfMjAwMDApIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgIlNwZWVkIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgMjBHIERYR1hTXG4iKTsKKwkJCWJueDJ4X3dhcnBjb3JlX3NldF8yMEdfRFhHWFMoYnAsIHBoeSwgbGFuZSk7CisJCQkvKiBJc3N1ZSBNb2R1bGUgZGV0ZWN0aW9uICovCisKKwkJCWJueDJ4X3NmcF9tb2R1bGVfZGV0ZWN0aW9uKHBoeSwgcGFyYW1zKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfTkVUX1NFUkRFU19JRl9LUjI6CisJCQlpZiAodmFycy0+bGluZV9zcGVlZCAhPSBTUEVFRF8yMDAwMCkgeworCQkJCURQKE5FVElGX01TR19MSU5LLCAiU3BlZWQgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyAyMEcgS1IyXG4iKTsKKwkJCWJueDJ4X3dhcnBjb3JlX3NldF8yMEdfS1IyKGJwLCBwaHkpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiVW5zdXBwb3J0ZWQgU2VyZGVzIE5ldCBJbnRlcmZhY2UgIgorCQkJCQkgICAiMHgleFxuIiwgc2VyZGVzX25ldF9pZik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBUYWtlIGxhbmUgb3V0IG9mIHJlc2V0IGFmdGVyIGNvbmZpZ3VyYXRpb24gaXMgZmluaXNoZWQgKi8KKwlibngyeF93YXJwY29yZV9yZXNldF9sYW5lKGJwLCBwaHksIDApOworCURQKE5FVElGX01TR19MSU5LLCAiRXhpdCBjb25maWcgaW5pdFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3NmcF9lM19zZXRfdHJhbnNtaXR0ZXIoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJCSBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJCSB1OCB0eF9lbikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MzIgY2ZnX3BpbjsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCisJY2ZnX3BpbiA9IFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJCWRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLmUzX3NmcF9jdHJsKSkgJgorCQkJCVBPUlRfSFdfQ0ZHX1RYX0xBU0VSX01BU0s7CisJLyogU2V0IHRoZSAhdHhfZW4gc2luY2UgdGhpcyBwaW4gaXMgRElTQUJMRV9UWF9MQVNFUiAqLworCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyBXQyBUWCB0byAlZFxuIiwgdHhfZW4pOworCS8qIEZvciAyMEcsIHRoZSBleHBlY3RlZCBwaW4gdG8gYmUgdXNlZCBpcyAzIHBpbnMgYWZ0ZXIgdGhlIGN1cnJlbnQgKi8KKworCWJueDJ4X3NldF9jZmdfcGluKGJwLCBjZmdfcGluLCB0eF9lbiBeIDEpOworCWlmIChwaHktPnNwZWVkX2NhcF9tYXNrICYgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8yMEcpCisJCWJueDJ4X3NldF9jZmdfcGluKGJwLCBjZmdfcGluICsgMywgdHhfZW4gXiAxKTsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfd2FycGNvcmVfbGlua19yZXNldChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJICAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IHZhbDE2OworCWJueDJ4X3NmcF9lM19zZXRfdHJhbnNtaXR0ZXIocGFyYW1zLCBwaHksIDApOworCWJueDJ4X3NldF9tZGlvX2NsayhicCwgcGFyYW1zLT5jaGlwX2lkLCBwYXJhbXMtPnBvcnQpOworCWJueDJ4X3NldF9hZXJfbW1kKHBhcmFtcywgcGh5KTsKKwkvKiBHbG9iYWwgcmVnaXN0ZXIgKi8KKwlibngyeF93YXJwY29yZV9yZXNldF9sYW5lKGJwLCBwaHksIDEpOworCisJLyogQ2xlYXIgbG9vcGJhY2sgc2V0dGluZ3MgKGlmIGFueSkgKi8KKwkvKiAxMEcgJiAyMEcgKi8KKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX0NPTUJPX0lFRUUwX01JSUNUUkwsICZ2YWwxNik7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX0NPTUJPX0lFRUUwX01JSUNUUkwsIHZhbDE2ICYKKwkJCSAweEJGRkYpOworCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQlNRElPX1dDX1JFR19JRUVFMEJMS19NSUlDTlRMLCAmdmFsMTYpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCU1ESU9fV0NfUkVHX0lFRUUwQkxLX01JSUNOVEwsIHZhbDE2ICYgMHhmZmZlKTsKKworCS8qIFVwZGF0ZSB0aG9zZSAxLWNvcHkgcmVnaXN0ZXJzICovCisJQ0wyMl9XUl9PVkVSX0NMNDUoYnAsIHBoeSwgTURJT19SRUdfQkFOS19BRVJfQkxPQ0ssCisJCQkgIE1ESU9fQUVSX0JMT0NLX0FFUl9SRUcsIDApOworCQkvKiBFbmFibGUgMUcgTURJTyAoMS1jb3B5KSAqLworCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJTURJT19XQ19SRUdfWEdYU0JMSzBfWEdYU0NPTlRST0wsCisJCQkmdmFsMTYpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19YR1hTQkxLMF9YR1hTQ09OVFJPTCwKKwkJCSB2YWwxNiAmIH4weDEwKTsKKworCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJTURJT19XQ19SRUdfWEdYU0JMSzFfTEFORUNUUkwyLCAmdmFsMTYpOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCSBNRElPX1dDX1JFR19YR1hTQkxLMV9MQU5FQ1RSTDIsCisJCQkgdmFsMTYgJiAweGZmMDApOworCit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3NldF93YXJwY29yZV9sb29wYmFjayhzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJCXN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXUxNiB2YWwxNjsKKwl1MzIgbGFuZTsKKwlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgV2FycGNvcmUgbG9vcGJhY2sgdHlwZSAleCwgc3BlZWQgJWRcbiIsCisJCSAgICAgICBwYXJhbXMtPmxvb3BiYWNrX21vZGUsIHBoeS0+cmVxX2xpbmVfc3BlZWQpOworCisJaWYgKHBoeS0+cmVxX2xpbmVfc3BlZWQgPCBTUEVFRF8xMDAwMCkgeworCQkvKiAxMC8xMDAvMTAwMCAqLworCisJCS8qIFVwZGF0ZSB0aG9zZSAxLWNvcHkgcmVnaXN0ZXJzICovCisJCUNMMjJfV1JfT1ZFUl9DTDQ1KGJwLCBwaHksIE1ESU9fUkVHX0JBTktfQUVSX0JMT0NLLAorCQkJCSAgTURJT19BRVJfQkxPQ0tfQUVSX1JFRywgMCk7CisJCS8qIEVuYWJsZSAxRyBNRElPICgxLWNvcHkpICovCisJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJCU1ESU9fV0NfUkVHX1hHWFNCTEswX1hHWFNDT05UUk9MLAorCQkJCSZ2YWwxNik7CisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQlNRElPX1dDX1JFR19YR1hTQkxLMF9YR1hTQ09OVFJPTCwKKwkJCQl2YWwxNiB8IDB4MTApOworCQkvKiBTZXQgMUcgbG9vcGJhY2sgYmFzZWQgb24gbGFuZSAoMS1jb3B5KSAqLworCQlsYW5lID0gYm54MnhfZ2V0X3dhcnBjb3JlX2xhbmUocGh5LCBwYXJhbXMpOworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQlNRElPX1dDX1JFR19YR1hTQkxLMV9MQU5FQ1RSTDIsICZ2YWwxNik7CisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQlNRElPX1dDX1JFR19YR1hTQkxLMV9MQU5FQ1RSTDIsCisJCQkJdmFsMTYgfCAoMTw8bGFuZSkpOworCisJCS8qIFN3aXRjaCBiYWNrIHRvIDQtY29weSByZWdpc3RlcnMgKi8KKwkJYm54Mnhfc2V0X2Flcl9tbWQocGFyYW1zLCBwaHkpOworCQkvKiBHbG9iYWwgbG9vcGJhY2ssIG5vdCByZWNvbW1lbmRlZC4gKi8KKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkJTURJT19XQ19SRUdfQ09NQk9fSUVFRTBfTUlJQ1RSTCwgJnZhbDE2KTsKKwkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJCU1ESU9fV0NfUkVHX0NPTUJPX0lFRUUwX01JSUNUUkwsIHZhbDE2IHwKKwkJCQkweDQwMDApOworCX0gZWxzZSB7CisJCS8qIDEwRyAmIDIwRyAqLworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQlNRElPX1dDX1JFR19DT01CT19JRUVFMF9NSUlDVFJMLCAmdmFsMTYpOworCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkJTURJT19XQ19SRUdfQ09NQk9fSUVFRTBfTUlJQ1RSTCwgdmFsMTYgfAorCQkJCSAweDQwMDApOworCisJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJCU1ESU9fV0NfUkVHX0lFRUUwQkxLX01JSUNOVEwsICZ2YWwxNik7CisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQlNRElPX1dDX1JFR19JRUVFMEJMS19NSUlDTlRMLCB2YWwxNiB8IDB4MSk7CisJfQorfQorCiAKIHZvaWQgYm54MnhfbGlua19zdGF0dXNfdXBkYXRlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAogCQkJICAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1OCBsaW5rXzEwZzsKKwl1OCBsaW5rXzEwZ19wbHVzOwogCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJdTMyIHN5bmNfb2Zmc2V0LCBtZWRpYV90eXBlczsKKwkvKiBVcGRhdGUgUEhZIGNvbmZpZ3VyYXRpb24gKi8KKwlzZXRfcGh5X3ZhcnMocGFyYW1zLCB2YXJzKTsKIAogCXZhcnMtPmxpbmtfc3RhdHVzID0gUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKwogCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCiAJCQkJCSAgICBwb3J0X21iW3BvcnRdLmxpbmtfc3RhdHVzKSk7CiAKIAl2YXJzLT5saW5rX3VwID0gKHZhcnMtPmxpbmtfc3RhdHVzICYgTElOS19TVEFUVVNfTElOS19VUCk7Ci0KKwl2YXJzLT5waHlfZmxhZ3MgPSBQSFlfWEdYU19GTEFHOwogCWlmICh2YXJzLT5saW5rX3VwKSB7CiAJCURQKE5FVElGX01TR19MSU5LLCAicGh5IGxpbmsgdXBcbiIpOwogCkBAIC0xNjY0LDI3ICs0MzkyLDkgQEAKIAkJCWNhc2UgTElOS18xMEdURkQ6CiAJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOwogCQkJCWJyZWFrOwotCi0JCQljYXNlIExJTktfMTJHVEZEOgotCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMjAwMDsKKwkJCWNhc2UgTElOS18yMEdURkQ6CisJCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzIwMDAwOwogCQkJCWJyZWFrOwotCi0JCQljYXNlIExJTktfMTJfNUdURkQ6Ci0JCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEyNTAwOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIExJTktfMTNHVEZEOgotCQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMzAwMDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBMSU5LXzE1R1RGRDoKLQkJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTUwMDA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTElOS18xNkdURkQ6Ci0JCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzE2MDAwOwotCQkJCWJyZWFrOwotCiAJCQlkZWZhdWx0OgogCQkJCWJyZWFrOwogCQl9CkBAIC0xNzA1LDE5ICs0NDE1LDI0IEBACiAJCX0gZWxzZSB7CiAJCQl2YXJzLT5waHlfZmxhZ3MgJj0gflBIWV9TR01JSV9GTEFHOwogCQl9Ci0KKwkJaWYgKHZhcnMtPmxpbmVfc3BlZWQgJiYKKwkJICAgIFVTRVNfV0FSUENPUkUoYnApICYmCisJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwKSkKKwkJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfU0dNSUlfRkxBRzsKIAkJLyogYW55dGhpbmcgMTAgYW5kIG92ZXIgdXNlcyB0aGUgYm1hYyAqLwotCQlsaW5rXzEwZyA9ICgodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwMCkgfHwKLQkJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMjAwMCkgfHwKLQkJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMjUwMCkgfHwKLQkJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMzAwMCkgfHwKLQkJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xNTAwMCkgfHwKLQkJCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xNjAwMCkpOwotCQlpZiAobGlua18xMGcpCi0JCQl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX0JNQUM7Ci0JCWVsc2UKLQkJCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfRU1BQzsKKwkJbGlua18xMGdfcGx1cyA9ICh2YXJzLT5saW5lX3NwZWVkID49IFNQRUVEXzEwMDAwKTsKIAorCQlpZiAobGlua18xMGdfcGx1cykgeworCQkJaWYgKFVTRVNfV0FSUENPUkUoYnApKQorCQkJCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfWE1BQzsKKwkJCWVsc2UKKwkJCQl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX0JNQUM7CisJCX0gZWxzZSB7CisJCQlpZiAoVVNFU19XQVJQQ09SRShicCkpCisJCQkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9VTUFDOworCQkJZWxzZQorCQkJCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfRU1BQzsKKwkJfQogCX0gZWxzZSB7IC8qIGxpbmsgZG93biAqLwogCQlEUChORVRJRl9NU0dfTElOSywgInBoeSBsaW5rIGRvd25cbiIpOwogCkBAIC0xNzMxLDggKzQ0NDYsNDAgQEAKIAkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9OT05FOwogCX0KIAotCURQKE5FVElGX01TR19MSU5LLCAibGlua19zdGF0dXMgMHgleCAgcGh5X2xpbmtfdXAgJXhcbiIsCi0JCSB2YXJzLT5saW5rX3N0YXR1cywgdmFycy0+cGh5X2xpbmtfdXApOworCS8qIFN5bmMgbWVkaWEgdHlwZSAqLworCXN5bmNfb2Zmc2V0ID0gcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJCW9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCisJCQkJIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLm1lZGlhX3R5cGUpOworCW1lZGlhX3R5cGVzID0gUkVHX1JEKGJwLCBzeW5jX29mZnNldCk7CisKKwlwYXJhbXMtPnBoeVtJTlRfUEhZXS5tZWRpYV90eXBlID0KKwkJKG1lZGlhX3R5cGVzICYgUE9SVF9IV19DRkdfTUVESUFfVFlQRV9QSFkwX01BU0spID4+CisJCVBPUlRfSFdfQ0ZHX01FRElBX1RZUEVfUEhZMF9TSElGVDsKKwlwYXJhbXMtPnBoeVtFWFRfUEhZMV0ubWVkaWFfdHlwZSA9CisJCShtZWRpYV90eXBlcyAmIFBPUlRfSFdfQ0ZHX01FRElBX1RZUEVfUEhZMV9NQVNLKSA+PgorCQlQT1JUX0hXX0NGR19NRURJQV9UWVBFX1BIWTFfU0hJRlQ7CisJcGFyYW1zLT5waHlbRVhUX1BIWTJdLm1lZGlhX3R5cGUgPQorCQkobWVkaWFfdHlwZXMgJiBQT1JUX0hXX0NGR19NRURJQV9UWVBFX1BIWTJfTUFTSykgPj4KKwkJUE9SVF9IV19DRkdfTUVESUFfVFlQRV9QSFkyX1NISUZUOworCURQKE5FVElGX01TR19MSU5LLCAibWVkaWFfdHlwZXMgPSAweCV4XG4iLCBtZWRpYV90eXBlcyk7CisKKwkvKiBTeW5jIEFFVSBvZmZzZXQgKi8KKwlzeW5jX29mZnNldCA9IHBhcmFtcy0+c2htZW1fYmFzZSArCisJCQlvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJCSBkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twb3J0XS5hZXVfaW50X21hc2spOworCisJdmFycy0+YWV1X2ludF9tYXNrID0gUkVHX1JEKGJwLCBzeW5jX29mZnNldCk7CisKKwkvKiBTeW5jIFBGQyBzdGF0dXMgKi8KKwlpZiAodmFycy0+bGlua19zdGF0dXMgJiBMSU5LX1NUQVRVU19QRkNfRU5BQkxFRCkKKwkJcGFyYW1zLT5mZWF0dXJlX2NvbmZpZ19mbGFncyB8PQorCQkJCQlGRUFUVVJFX0NPTkZJR19QRkNfRU5BQkxFRDsKKwllbHNlCisJCXBhcmFtcy0+ZmVhdHVyZV9jb25maWdfZmxhZ3MgJj0KKwkJCQkJfkZFQVRVUkVfQ09ORklHX1BGQ19FTkFCTEVEOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJsaW5rX3N0YXR1cyAweCV4ICBwaHlfbGlua191cCAleCBpbnRfbWFzayAweCV4XG4iLAorCQkgdmFycy0+bGlua19zdGF0dXMsIHZhcnMtPnBoeV9saW5rX3VwLCB2YXJzLT5hZXVfaW50X21hc2spOwogCURQKE5FVElGX01TR19MSU5LLCAibGluZV9zcGVlZCAleCAgZHVwbGV4ICV4ICBmbG93X2N0cmwgMHgleFxuIiwKIAkJIHZhcnMtPmxpbmVfc3BlZWQsIHZhcnMtPmR1cGxleCwgdmFycy0+Zmxvd19jdHJsKTsKIH0KQEAgLTE3NTksOSArNDUwNiw5IEBACiAJCQkgIChuZXdfbWFzdGVyX2xuIHwgc2VyX2xhbmUpKTsKIH0KIAotc3RhdGljIHU4IGJueDJ4X3Jlc2V0X3VuaWNvcmUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkgICAgICBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkgICAgICB1OCBzZXRfc2VyZGVzKQorc3RhdGljIGludCBibngyeF9yZXNldF91bmljb3JlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICAgIHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCSAgICAgICB1OCBzZXRfc2VyZGVzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXUxNiBtaWlfY29udHJvbDsKQEAgLTIwNDgsOSArNDc5NSw2IEBACiAJCWlmICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzEwMDAwKQogCQkJcmVnX3ZhbCB8PQogCQkJCU1ESU9fU0VSREVTX0RJR0lUQUxfTUlTQzFfRk9SQ0VfU1BFRURfMTBHX0NYNDsKLQkJaWYgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTMwMDApCi0JCQlyZWdfdmFsIHw9Ci0JCQkJTURJT19TRVJERVNfRElHSVRBTF9NSVNDMV9GT1JDRV9TUEVFRF8xM0c7CiAJfQogCiAJQ0wyMl9XUl9PVkVSX0NMNDUoYnAsIHBoeSwKQEAgLTIwNTksOCArNDgwMyw4IEBACiAKIH0KIAotc3RhdGljIHZvaWQgYm54Mnhfc2V0X2JyY21fY2wzN19hZHZlcnRpc21lbnQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJCQkgICAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQorc3RhdGljIHZvaWQgYm54Mnhfc2V0X2JyY21fY2wzN19hZHZlcnRpc2VtZW50KHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkJICAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJdTE2IHZhbCA9IDA7CkBAIC0yMDgxLDQ0ICs0ODI1LDkgQEAKIAkJCSAgTURJT19PVkVSXzFHX1VQMywgMHg0MDApOwogfQogCi1zdGF0aWMgdm9pZCBibngyeF9jYWxjX2llZWVfYW5lZ19hZHYoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJCSAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHUxNiAqaWVlZV9mYykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQkqaWVlZV9mYyA9IE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX0ZVTExfRFVQTEVYOwotCS8qCi0JICogUmVzb2x2ZSBwYXVzZSBtb2RlIGFuZCBhZHZlcnRpc2VtZW50LgotCSAqIFBsZWFzZSByZWZlciB0byBUYWJsZSAyOEItMyBvZiB0aGUgODAyLjNhYi0xOTk5IHNwZWMKLQkgKi8KLQotCXN3aXRjaCAocGh5LT5yZXFfZmxvd19jdHJsKSB7Ci0JY2FzZSBCTlgyWF9GTE9XX0NUUkxfQVVUTzoKLQkJaWYgKHBhcmFtcy0+cmVxX2ZjX2F1dG9fYWR2ID09IEJOWDJYX0ZMT1dfQ1RSTF9CT1RIKQotCQkJKmllZWVfZmMgfD0gTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQk9USDsKLQkJZWxzZQotCQkJKmllZWVfZmMgfD0KLQkJCU1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0FTWU1NRVRSSUM7Ci0JCWJyZWFrOwotCWNhc2UgQk5YMlhfRkxPV19DVFJMX1RYOgotCQkqaWVlZV9mYyB8PSBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDOwotCQlicmVhazsKLQotCWNhc2UgQk5YMlhfRkxPV19DVFJMX1JYOgotCWNhc2UgQk5YMlhfRkxPV19DVFJMX0JPVEg6Ci0JCSppZWVlX2ZjIHw9IE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0JPVEg7Ci0JCWJyZWFrOwotCi0JY2FzZSBCTlgyWF9GTE9XX0NUUkxfTk9ORToKLQlkZWZhdWx0OgotCQkqaWVlZV9mYyB8PSBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9OT05FOwotCQlicmVhazsKLQl9Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJpZWVlX2ZjID0gMHgleFxuIiwgKmllZWVfZmMpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9zZXRfaWVlZV9hbmVnX2FkdmVydGlzbWVudChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkJCSAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJCSAgICAgdTE2IGllZWVfZmMpCitzdGF0aWMgdm9pZCBibngyeF9zZXRfaWVlZV9hbmVnX2FkdmVydGlzZW1lbnQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCQkgICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkJICAgICAgdTE2IGllZWVfZmMpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJdTE2IHZhbDsKQEAgLTIyNTIsMzUgKzQ5NjEsOCBAQAogICogbGluayBtYW5hZ2VtZW50CiAgKi8KIAotc3RhdGljIHZvaWQgYm54MnhfcGF1c2VfcmVzb2x2ZShzdHJ1Y3QgbGlua192YXJzICp2YXJzLCB1MzIgcGF1c2VfcmVzdWx0KQotewkJCQkJCS8qICBMRAkgICAgTFAJICovCi0Jc3dpdGNoIChwYXVzZV9yZXN1bHQpIHsJCQkvKiBBU1lNIFAgQVNZTSBQICovCi0JY2FzZSAweGI6CQkJCS8qICAgMSAgMCAgIDEgIDEgKi8KLQkJdmFycy0+Zmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX1RYOwotCQlicmVhazsKLQotCWNhc2UgMHhlOgkJCQkvKiAgIDEgIDEgICAxICAwICovCi0JCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9SWDsKLQkJYnJlYWs7Ci0KLQljYXNlIDB4NToJCQkJLyogICAwICAxICAgMCAgMSAqLwotCWNhc2UgMHg3OgkJCQkvKiAgIDAgIDEgICAxICAxICovCi0JY2FzZSAweGQ6CQkJCS8qICAgMSAgMSAgIDAgIDEgKi8KLQljYXNlIDB4ZjoJCQkJLyogICAxICAxICAgMSAgMSAqLwotCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfQk9USDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JaWYgKHBhdXNlX3Jlc3VsdCAmICgxPDwwKSkKLQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS19TVEFUVVNfTElOS19QQVJUTkVSX1NZTU1FVFJJQ19QQVVTRTsKLQlpZiAocGF1c2VfcmVzdWx0ICYgKDE8PDEpKQotCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfQVNZTU1FVFJJQ19QQVVTRTsKLX0KLQotc3RhdGljIHU4IGJueDJ4X2RpcmVjdF9wYXJhbGxlbF9kZXRlY3RfdXNlZChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkJCSAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3N0YXRpYyBpbnQgYm54MnhfZGlyZWN0X3BhcmFsbGVsX2RldGVjdF91c2VkKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkJICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAl1MTYgcGRfMTBnLCBzdGF0dXMyXzEwMDB4OwpAQCAtMjM4Myw3ICs1MDY1LDcgQEAKIAkJCQkJIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUxNiByeF9zdGF0dXMsIHVzdGF0X3ZhbCwgY2wzN19mc21fcmVjaWV2ZWQ7CisJdTE2IHJ4X3N0YXR1cywgdXN0YXRfdmFsLCBjbDM3X2ZzbV9yZWNlaXZlZDsKIAlEUChORVRJRl9NU0dfTElOSywgImJueDJ4X2NoZWNrX2ZhbGxiYWNrX3RvX2NsMzdcbiIpOwogCS8qIFN0ZXAgMTogTWFrZSBzdXJlIHNpZ25hbCBpcyBkZXRlY3RlZCAqLwogCUNMMjJfUkRfT1ZFUl9DTDQ1KGJwLCBwaHksCkBAIC0yNDIxLDE1ICs1MTAzLDE1IEBACiAJQ0wyMl9SRF9PVkVSX0NMNDUoYnAsIHBoeSwKIAkJCSAgTURJT19SRUdfQkFOS19SRU1PVEVfUEhZLAogCQkJICBNRElPX1JFTU9URV9QSFlfTUlTQ19SWF9TVEFUVVMsCi0JCQkgICZjbDM3X2ZzbV9yZWNpZXZlZCk7Ci0JaWYgKChjbDM3X2ZzbV9yZWNpZXZlZCAmCisJCQkgICZjbDM3X2ZzbV9yZWNlaXZlZCk7CisJaWYgKChjbDM3X2ZzbV9yZWNlaXZlZCAmCiAJICAgICAoTURJT19SRU1PVEVfUEhZX01JU0NfUlhfU1RBVFVTX0NMMzdfRlNNX1JFQ0VJVkVEX09WRVIxR19NU0cgfAogCSAgICAgTURJT19SRU1PVEVfUEhZX01JU0NfUlhfU1RBVFVTX0NMMzdfRlNNX1JFQ0VJVkVEX0JSQ01fT1VJX01TRykpICE9CiAJICAgIChNRElPX1JFTU9URV9QSFlfTUlTQ19SWF9TVEFUVVNfQ0wzN19GU01fUkVDRUlWRURfT1ZFUjFHX01TRyB8CiAJICAgICAgTURJT19SRU1PVEVfUEhZX01JU0NfUlhfU1RBVFVTX0NMMzdfRlNNX1JFQ0VJVkVEX0JSQ01fT1VJX01TRykpIHsKIAkJRFAoTkVUSUZfTVNHX0xJTkssICJObyBDTDM3IEZTTSB3ZXJlIHJlY2VpdmVkLiAiCiAJCQkgICAgICJtaXNjX3J4X3N0YXR1cygweDgzMzApID0gMHgleFxuIiwKLQkJCSBjbDM3X2ZzbV9yZWNpZXZlZCk7CisJCQkgY2wzN19mc21fcmVjZWl2ZWQpOwogCQlyZXR1cm47CiAJfQogCS8qCkBAIC0yNDYyLDQ1ICs1MTQ0LDI1IEBACiAJCXZhcnMtPmxpbmtfc3RhdHVzIHw9CiAJCQlMSU5LX1NUQVRVU19QQVJBTExFTF9ERVRFQ1RJT05fVVNFRDsKIH0KLQotc3RhdGljIHU4IGJueDJ4X2xpbmtfc2V0dGluZ3Nfc3RhdHVzKHN0cnVjdCBibngyeF9waHkgKnBoeSwKK3N0YXRpYyBpbnQgYm54MnhfZ2V0X2xpbmtfc3BlZWRfZHVwbGV4KHN0cnVjdCBibngyeF9waHkgKnBoeSwKIAkJCQkgICAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKKwkJCQkgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAorCQkJCSAgICAgIHUxNiBpc19saW5rX3VwLAorCQkJCSAgICAgIHUxNiBzcGVlZF9tYXNrLAorCQkJCSAgICAgIHUxNiBpc19kdXBsZXgpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTE2IG5ld19saW5lX3NwZWVkLCBncF9zdGF0dXM7Ci0JdTggcmMgPSAwOwotCi0JLyogUmVhZCBncF9zdGF0dXMgKi8KLQlDTDIyX1JEX09WRVJfQ0w0NShicCwgcGh5LAotCQkJICBNRElPX1JFR19CQU5LX0dQX1NUQVRVUywKLQkJCSAgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzEsCi0JCQkgICZncF9zdGF0dXMpOwotCiAJaWYgKHBoeS0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfQVVUT19ORUcpCiAJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfU1RBVFVTX0FVVE9fTkVHT1RJQVRFX0VOQUJMRUQ7Ci0JaWYgKGdwX3N0YXR1cyAmIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0xJTktfU1RBVFVTKSB7Ci0JCURQKE5FVElGX01TR19MSU5LLCAicGh5IGxpbmsgdXAgZ3Bfc3RhdHVzPTB4JXhcbiIsCi0JCQkgZ3Bfc3RhdHVzKTsKKwlpZiAoaXNfbGlua191cCkgeworCQlEUChORVRJRl9NU0dfTElOSywgInBoeSBsaW5rIHVwXG4iKTsKIAogCQl2YXJzLT5waHlfbGlua191cCA9IDE7CiAJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfU1RBVFVTX0xJTktfVVA7CiAKLQkJaWYgKGdwX3N0YXR1cyAmIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0RVUExFWF9TVEFUVVMpCi0JCQl2YXJzLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQkJZWxzZQotCQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7Ci0KLQkJaWYgKFNJTkdMRV9NRURJQV9ESVJFQ1QocGFyYW1zKSkgewotCQkJYm54MnhfZmxvd19jdHJsX3Jlc29sdmUocGh5LCBwYXJhbXMsIHZhcnMsIGdwX3N0YXR1cyk7Ci0JCQlpZiAocGh5LT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykKLQkJCQlibngyeF94Z3hzX2FuX3Jlc29sdmUocGh5LCBwYXJhbXMsIHZhcnMsCi0JCQkJCQkgICAgICBncF9zdGF0dXMpOwotCQl9Ci0KLQkJc3dpdGNoIChncF9zdGF0dXMgJiBHUF9TVEFUVVNfU1BFRURfTUFTSykgeworCQlzd2l0Y2ggKHNwZWVkX21hc2spIHsKIAkJY2FzZSBHUF9TVEFUVVNfMTBNOgotCQkJbmV3X2xpbmVfc3BlZWQgPSBTUEVFRF8xMDsKKwkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDsKIAkJCWlmICh2YXJzLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCiAJCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18xMFRGRDsKIAkJCWVsc2UKQEAgLTI1MDgsNyArNTE3MCw3IEBACiAJCQlicmVhazsKIAogCQljYXNlIEdQX1NUQVRVU18xMDBNOgotCQkJbmV3X2xpbmVfc3BlZWQgPSBTUEVFRF8xMDA7CisJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwOwogCQkJaWYgKHZhcnMtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKIAkJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEwMFRYRkQ7CiAJCQllbHNlCkBAIC0yNTE3LDcgKzUxNzksNyBAQAogCiAJCWNhc2UgR1BfU1RBVFVTXzFHOgogCQljYXNlIEdQX1NUQVRVU18xR19LWDoKLQkJCW5ld19saW5lX3NwZWVkID0gU1BFRURfMTAwMDsKKwkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOwogCQkJaWYgKHZhcnMtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKIAkJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEwMDBURkQ7CiAJCQllbHNlCkBAIC0yNTI1LDcgKzUxODcsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBHUF9TVEFUVVNfMl81RzoKLQkJCW5ld19saW5lX3NwZWVkID0gU1BFRURfMjUwMDsKKwkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8yNTAwOwogCQkJaWYgKHZhcnMtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKIAkJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzI1MDBURkQ7CiAJCQllbHNlCkBAIC0yNTM2LDUwICs1MTk4LDI4IEBACiAJCWNhc2UgR1BfU1RBVFVTXzZHOgogCQkJRFAoTkVUSUZfTVNHX0xJTkssCiAJCQkJICJsaW5rIHNwZWVkIHVuc3VwcG9ydGVkICBncF9zdGF0dXMgMHgleFxuIiwKLQkJCQkgIGdwX3N0YXR1cyk7CisJCQkJICBzcGVlZF9tYXNrKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWNhc2UgR1BfU1RBVFVTXzEwR19LWDQ6CiAJCWNhc2UgR1BfU1RBVFVTXzEwR19ISUc6CiAJCWNhc2UgR1BfU1RBVFVTXzEwR19DWDQ6Ci0JCQluZXdfbGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOworCQljYXNlIEdQX1NUQVRVU18xMEdfS1I6CisJCWNhc2UgR1BfU1RBVFVTXzEwR19TRkk6CisJCWNhc2UgR1BfU1RBVFVTXzEwR19YRkk6CisJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CiAJCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEwR1RGRDsKIAkJCWJyZWFrOwotCi0JCWNhc2UgR1BfU1RBVFVTXzEyR19ISUc6Ci0JCQluZXdfbGluZV9zcGVlZCA9IFNQRUVEXzEyMDAwOwotCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18xMkdURkQ7CisJCWNhc2UgR1BfU1RBVFVTXzIwR19EWEdYUzoKKwkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8yMDAwMDsKKwkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfMjBHVEZEOwogCQkJYnJlYWs7Ci0KLQkJY2FzZSBHUF9TVEFUVVNfMTJfNUc6Ci0JCQluZXdfbGluZV9zcGVlZCA9IFNQRUVEXzEyNTAwOwotCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS18xMl81R1RGRDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgR1BfU1RBVFVTXzEzRzoKLQkJCW5ld19saW5lX3NwZWVkID0gU1BFRURfMTMwMDA7Ci0JCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEzR1RGRDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgR1BfU1RBVFVTXzE1RzoKLQkJCW5ld19saW5lX3NwZWVkID0gU1BFRURfMTUwMDA7Ci0JCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzE1R1RGRDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgR1BfU1RBVFVTXzE2RzoKLQkJCW5ld19saW5lX3NwZWVkID0gU1BFRURfMTYwMDA7Ci0JCQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LXzE2R1RGRDsKLQkJCWJyZWFrOwotCiAJCWRlZmF1bHQ6CiAJCQlEUChORVRJRl9NU0dfTElOSywKIAkJCQkgICJsaW5rIHNwZWVkIHVuc3VwcG9ydGVkIGdwX3N0YXR1cyAweCV4XG4iLAotCQkJCSAgZ3Bfc3RhdHVzKTsKKwkJCQkgIHNwZWVkX21hc2spOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQotCQl2YXJzLT5saW5lX3NwZWVkID0gbmV3X2xpbmVfc3BlZWQ7Ci0KIAl9IGVsc2UgeyAvKiBsaW5rX2Rvd24gKi8KIAkJRFAoTkVUSUZfTVNHX0xJTkssICJwaHkgbGluayBkb3duXG4iKTsKIApAQCAtMjU4OCw3ICs1MjI4LDQ3IEBACiAJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOwogCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKIAkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9OT05FOworCX0KKwlEUChORVRJRl9NU0dfTElOSywgIiBwaHlfbGlua191cCAleCBsaW5lX3NwZWVkICVkXG4iLAorCQkgICAgdmFycy0+cGh5X2xpbmtfdXAsIHZhcnMtPmxpbmVfc3BlZWQpOworCXJldHVybiAwOworfQogCitzdGF0aWMgaW50IGJueDJ4X2xpbmtfc2V0dGluZ3Nfc3RhdHVzKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisKKwl1MTYgZ3Bfc3RhdHVzLCBkdXBsZXggPSBEVVBMRVhfSEFMRiwgbGlua191cCA9IDAsIHNwZWVkX21hc2s7CisJaW50IHJjID0gMDsKKworCS8qIFJlYWQgZ3Bfc3RhdHVzICovCisJQ0wyMl9SRF9PVkVSX0NMNDUoYnAsIHBoeSwKKwkJCSAgTURJT19SRUdfQkFOS19HUF9TVEFUVVMsCisJCQkgIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxLAorCQkJICAmZ3Bfc3RhdHVzKTsKKwlpZiAoZ3Bfc3RhdHVzICYgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfRFVQTEVYX1NUQVRVUykKKwkJZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJaWYgKGdwX3N0YXR1cyAmIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0xJTktfU1RBVFVTKQorCQlsaW5rX3VwID0gMTsKKwlzcGVlZF9tYXNrID0gZ3Bfc3RhdHVzICYgR1BfU1RBVFVTX1NQRUVEX01BU0s7CisJRFAoTkVUSUZfTVNHX0xJTkssICJncF9zdGF0dXMgMHgleCwgaXNfbGlua191cCAlZCwgc3BlZWRfbWFzayAweCV4XG4iLAorCQkgICAgICAgZ3Bfc3RhdHVzLCBsaW5rX3VwLCBzcGVlZF9tYXNrKTsKKwlyYyA9IGJueDJ4X2dldF9saW5rX3NwZWVkX2R1cGxleChwaHksIHBhcmFtcywgdmFycywgbGlua191cCwgc3BlZWRfbWFzaywKKwkJCQkJIGR1cGxleCk7CisJaWYgKHJjID09IC1FSU5WQUwpCisJCXJldHVybiByYzsKKworCWlmIChncF9zdGF0dXMgJiBNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9MSU5LX1NUQVRVUykgeworCQlpZiAoU0lOR0xFX01FRElBX0RJUkVDVChwYXJhbXMpKSB7CisJCQlibngyeF9mbG93X2N0cmxfcmVzb2x2ZShwaHksIHBhcmFtcywgdmFycywgZ3Bfc3RhdHVzKTsKKwkJCWlmIChwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKQorCQkJCWJueDJ4X3hneHNfYW5fcmVzb2x2ZShwaHksIHBhcmFtcywgdmFycywKKwkJCQkJCSAgICAgIGdwX3N0YXR1cyk7CisJCX0KKwl9IGVsc2UgeyAvKiBsaW5rX2Rvd24gKi8KIAkJaWYgKChwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKSAmJgogCQkgICAgU0lOR0xFX01FRElBX0RJUkVDVChwYXJhbXMpKSB7CiAJCQkvKiBDaGVjayBzaWduYWwgaXMgZGV0ZWN0ZWQgKi8KQEAgLTI1OTYsMTMgKzUyNzYsODYgQEAKIAkJfQogCX0KIAotCURQKE5FVElGX01TR19MSU5LLCAiZ3Bfc3RhdHVzIDB4JXggIHBoeV9saW5rX3VwICV4IGxpbmVfc3BlZWQgJXhcbiIsCi0JCSBncF9zdGF0dXMsIHZhcnMtPnBoeV9saW5rX3VwLCB2YXJzLT5saW5lX3NwZWVkKTsKIAlEUChORVRJRl9NU0dfTElOSywgImR1cGxleCAleCAgZmxvd19jdHJsIDB4JXggbGlua19zdGF0dXMgMHgleFxuIiwKIAkJICAgdmFycy0+ZHVwbGV4LCB2YXJzLT5mbG93X2N0cmwsIHZhcnMtPmxpbmtfc3RhdHVzKTsKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgYm54Mnhfd2FycGNvcmVfcmVhZF9zdGF0dXMoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisKKwl1OCBsYW5lOworCXUxNiBncF9zdGF0dXMxLCBncF9zcGVlZCwgbGlua191cCwgZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJaW50IHJjID0gMDsKKwlsYW5lID0gYm54MnhfZ2V0X3dhcnBjb3JlX2xhbmUocGh5LCBwYXJhbXMpOworCS8qIFJlYWQgZ3Bfc3RhdHVzICovCisJaWYgKHBoeS0+cmVxX2xpbmVfc3BlZWQgPiBTUEVFRF8xMDAwMCkgeworCQl1MTYgdGVtcF9saW5rX3VwOworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQkxLCAmdGVtcF9saW5rX3VwKTsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkJMSwgJmxpbmtfdXApOworCQlEUChORVRJRl9NU0dfTElOSywgIlBDUyBSWCBsaW5rIHN0YXR1cyA9IDB4JXgtLT4weCV4XG4iLAorCQkJICAgICAgIHRlbXBfbGlua191cCwgbGlua191cCk7CisJCWxpbmtfdXAgJj0gKDE8PDIpOworCQlpZiAobGlua191cCkKKwkJCWJueDJ4X2V4dF9waHlfcmVzb2x2ZV9mYyhwaHksIHBhcmFtcywgdmFycyk7CisJfSBlbHNlIHsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQkJTURJT19XQ19SRUdfR1AyX1NUQVRVU19HUF8yXzEsICZncF9zdGF0dXMxKTsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICIweDgxZDEgPSAweCV4XG4iLCBncF9zdGF0dXMxKTsKKwkJLyogQ2hlY2sgZm9yIGVpdGhlciBLUiBvciBnZW5lcmljIGxpbmsgdXAuICovCisJCWdwX3N0YXR1czEgPSAoKGdwX3N0YXR1czEgPj4gOCkgJiAweGYpIHwKKwkJCSgoZ3Bfc3RhdHVzMSA+PiAxMikgJiAweGYpOworCQlsaW5rX3VwID0gZ3Bfc3RhdHVzMSAmICgxIDw8IGxhbmUpOworCQlpZiAobGlua191cCAmJiBTSU5HTEVfTUVESUFfRElSRUNUKHBhcmFtcykpIHsKKwkJCXUxNiBwZCwgZ3Bfc3RhdHVzNDsKKwkJCWlmIChwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKSB7CisJCQkJLyogQ2hlY2sgQXV0b25lZyBjb21wbGV0ZSAqLworCQkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJCQkJTURJT19XQ19SRUdfR1AyX1NUQVRVU19HUF8yXzQsCisJCQkJCQkmZ3Bfc3RhdHVzNCk7CisJCQkJaWYgKGdwX3N0YXR1czQgJiAoKDE8PDEyKTw8bGFuZSkpCisJCQkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9CisJCQkJCUxJTktfU1RBVFVTX0FVVE9fTkVHT1RJQVRFX0NPTVBMRVRFOworCisJCQkJLyogQ2hlY2sgcGFyYWxsZWwgZGV0ZWN0IHVzZWQgKi8KKwkJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQkJCU1ESU9fV0NfUkVHX1BBUl9ERVRfMTBHX1NUQVRVUywKKwkJCQkJCSZwZCk7CisJCQkJaWYgKHBkICYgKDE8PDE1KSkKKwkJCQkJdmFycy0+bGlua19zdGF0dXMgfD0KKwkJCQkJTElOS19TVEFUVVNfUEFSQUxMRUxfREVURUNUSU9OX1VTRUQ7CisJCQl9CisJCQlibngyeF9leHRfcGh5X3Jlc29sdmVfZmMocGh5LCBwYXJhbXMsIHZhcnMpOworCQl9CisJfQorCisJaWYgKGxhbmUgPCAyKSB7CisJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJCU1ESU9fV0NfUkVHX0dQMl9TVEFUVVNfR1BfMl8yLCAmZ3Bfc3BlZWQpOworCX0gZWxzZSB7CisJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJCU1ESU9fV0NfUkVHX0dQMl9TVEFUVVNfR1BfMl8zLCAmZ3Bfc3BlZWQpOworCX0KKwlEUChORVRJRl9NU0dfTElOSywgImxhbmUgJWQgZ3Bfc3BlZWQgMHgleFxuIiwgbGFuZSwgZ3Bfc3BlZWQpOworCisJaWYgKChsYW5lICYgMSkgPT0gMCkKKwkJZ3Bfc3BlZWQgPDw9IDg7CisJZ3Bfc3BlZWQgJj0gMHgzZjAwOworCisKKwlyYyA9IGJueDJ4X2dldF9saW5rX3NwZWVkX2R1cGxleChwaHksIHBhcmFtcywgdmFycywgbGlua191cCwgZ3Bfc3BlZWQsCisJCQkJCSBkdXBsZXgpOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJkdXBsZXggJXggIGZsb3dfY3RybCAweCV4IGxpbmtfc3RhdHVzIDB4JXhcbiIsCisJCSAgIHZhcnMtPmR1cGxleCwgdmFycy0+Zmxvd19jdHJsLCB2YXJzLT5saW5rX3N0YXR1cyk7CisJcmV0dXJuIHJjOworfQogc3RhdGljIHZvaWQgYm54Mnhfc2V0X2dtaWlfdHhfZHJpdmVyKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwpAQCAtMjY0Miw4ICs1Mzk1LDggQEAKIAl9CiB9CiAKLXN0YXRpYyB1OCBibngyeF9lbWFjX3Byb2dyYW0oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCitzdGF0aWMgaW50IGJueDJ4X2VtYWNfcHJvZ3JhbShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKQEAgLTI3MTMsOSArNTQ2Niw5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBibngyeF9pbml0X2ludGVybmFsX3BoeShzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkJICAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQorc3RhdGljIHZvaWQgYm54MnhfeGd4c19jb25maWdfaW5pdChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAl1OCBlbmFibGVfY2w3MyA9IChTSU5HTEVfTUVESUFfRElSRUNUKHBhcmFtcykgfHwKQEAgLTI3NDIsMTEgKzU0OTUsMTEgQEAKIAkJCURQKE5FVElGX01TR19MSU5LLCAibm90IFNHTUlJLCBBTlxuIik7CiAKIAkJCS8qIEFOIGVuYWJsZWQgKi8KLQkJCWJueDJ4X3NldF9icmNtX2NsMzdfYWR2ZXJ0aXNtZW50KHBoeSwgcGFyYW1zKTsKKwkJCWJueDJ4X3NldF9icmNtX2NsMzdfYWR2ZXJ0aXNlbWVudChwaHksIHBhcmFtcyk7CiAKIAkJCS8qIHByb2dyYW0gZHVwbGV4ICYgcGF1c2UgYWR2ZXJ0aXNlbWVudCAoZm9yIGFuZWcpICovCi0JCQlibngyeF9zZXRfaWVlZV9hbmVnX2FkdmVydGlzbWVudChwaHksIHBhcmFtcywKLQkJCQkJCQkgdmFycy0+aWVlZV9mYyk7CisJCQlibngyeF9zZXRfaWVlZV9hbmVnX2FkdmVydGlzZW1lbnQocGh5LCBwYXJhbXMsCisJCQkJCQkJICB2YXJzLT5pZWVlX2ZjKTsKIAogCQkJLyogZW5hYmxlIGF1dG9uZWcgKi8KIAkJCWJueDJ4X3NldF9hdXRvbmVnKHBoeSwgcGFyYW1zLCB2YXJzLCBlbmFibGVfY2w3Myk7CkBAIC0yNzYyLDI5ICs1NTE1LDEyIEBACiAJfQogfQogCi1zdGF0aWMgdTggYm54MnhfaW5pdF9zZXJkZXMoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJICAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCi17Ci0JdTggcmM7Ci0JdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9TR01JSV9GTEFHOwotCWJueDJ4X2NhbGNfaWVlZV9hbmVnX2FkdihwaHksIHBhcmFtcywgJnZhcnMtPmllZWVfZmMpOwotCWJueDJ4X3NldF9hZXJfbW1kX3NlcmRlcyhwYXJhbXMtPmJwLCBwaHkpOwotCXJjID0gYm54MnhfcmVzZXRfdW5pY29yZShwYXJhbXMsIHBoeSwgMSk7Ci0JLyogcmVzZXQgdGhlIFNlckRlcyBhbmQgd2FpdCBmb3IgcmVzZXQgYml0IHJldHVybiBsb3cgKi8KLQlpZiAocmMgIT0gMCkKLQkJcmV0dXJuIHJjOwotCWJueDJ4X3NldF9hZXJfbW1kX3NlcmRlcyhwYXJhbXMtPmJwLCBwaHkpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdTggYm54MnhfaW5pdF94Z3hzKHN0cnVjdCBibngyeF9waHkgKnBoeSwKK3N0YXRpYyBpbnQgYm54MnhfcHJlcGFyZV94Z3hzKHN0cnVjdCBibngyeF9waHkgKnBoeSwKIAkJCSAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCiAJCQkgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCiB7Ci0JdTggcmM7Ci0JdmFycy0+cGh5X2ZsYWdzID0gUEhZX1hHWFNfRkxBRzsKKwlpbnQgcmM7CisJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9YR1hTX0ZMQUc7CiAJaWYgKChwaHktPnJlcV9saW5lX3NwZWVkICYmCiAJICAgICAoKHBoeS0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfMTAwKSB8fAogCSAgICAgIChwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEXzEwKSkpIHx8CkBAIC0yNzkyLDI2ICs1NTI4LDI4IEBACiAJICAgICAocGh5LT5zcGVlZF9jYXBfbWFzayA+PQogCSAgICAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTBNX0ZVTEwpICYmCiAJICAgICAocGh5LT5zcGVlZF9jYXBfbWFzayA8Ci0JICAgICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xRykKLQkgICAgICkpCisJICAgICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xRykpIHx8CisJICAgIChwaHktPnR5cGUgPT0gUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9ESVJFQ1RfU0QpKQogCQl2YXJzLT5waHlfZmxhZ3MgfD0gUEhZX1NHTUlJX0ZMQUc7CiAJZWxzZQogCQl2YXJzLT5waHlfZmxhZ3MgJj0gflBIWV9TR01JSV9GTEFHOwogCiAJYm54MnhfY2FsY19pZWVlX2FuZWdfYWR2KHBoeSwgcGFyYW1zLCAmdmFycy0+aWVlZV9mYyk7Ci0JYm54Mnhfc2V0X2Flcl9tbWRfeGd4cyhwYXJhbXMsIHBoeSk7Ci0JYm54Mnhfc2V0X21hc3Rlcl9sbihwYXJhbXMsIHBoeSk7CisJYm54Mnhfc2V0X2Flcl9tbWQocGFyYW1zLCBwaHkpOworCWlmIChwaHktPnR5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUKQorCQlibngyeF9zZXRfbWFzdGVyX2xuKHBhcmFtcywgcGh5KTsKIAogCXJjID0gYm54MnhfcmVzZXRfdW5pY29yZShwYXJhbXMsIHBoeSwgMCk7CiAJLyogcmVzZXQgdGhlIFNlckRlcyBhbmQgd2FpdCBmb3IgcmVzZXQgYml0IHJldHVybiBsb3cgKi8KIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCi0JYm54Mnhfc2V0X2Flcl9tbWRfeGd4cyhwYXJhbXMsIHBoeSk7Ci0KKwlibngyeF9zZXRfYWVyX21tZChwYXJhbXMsIHBoeSk7CiAJLyogc2V0dGluZyB0aGUgbWFzdGVyTG5fZGVmIGFnYWluIGFmdGVyIHRoZSByZXNldCAqLwotCWJueDJ4X3NldF9tYXN0ZXJfbG4ocGFyYW1zLCBwaHkpOwotCWJueDJ4X3NldF9zd2FwX2xhbmVzKHBhcmFtcywgcGh5KTsKKwlpZiAocGh5LT50eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCkgeworCQlibngyeF9zZXRfbWFzdGVyX2xuKHBhcmFtcywgcGh5KTsKKwkJYm54Mnhfc2V0X3N3YXBfbGFuZXMocGFyYW1zLCBwaHkpOworCX0KIAogCXJldHVybiByYzsKIH0KQEAgLTI4MjMsOCArNTU2MSwxMyBAQAogCXUxNiBjbnQsIGN0cmw7CiAJLyogV2FpdCBmb3Igc29mdCByZXNldCB0byBnZXQgY2xlYXJlZCB1cCB0byAxIHNlYyAqLwogCWZvciAoY250ID0gMDsgY250IDwgMTAwMDsgY250KyspIHsKLQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCi0JCQkJTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19DVFJMLCAmY3RybCk7CisJCWlmIChwaHktPnR5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNNTQ2MThTRSkKKwkJCWJueDJ4X2NsMjJfcmVhZChicCwgcGh5LAorCQkJCU1ESU9fUE1BX1JFR19DVFJMLCAmY3RybCk7CisJCWVsc2UKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAorCQkJCU1ESU9fUE1BX0RFVkFELAorCQkJCU1ESU9fUE1BX1JFR19DVFJMLCAmY3RybCk7CiAJCWlmICghKGN0cmwgJiAoMTw8MTUpKSkKIAkJCWJyZWFrOwogCQltc2xlZXAoMSk7CkBAIC0yODQ1LDcgKzU1ODgsMTEgQEAKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAogCS8qIFNldHRpbmcgdGhlIHN0YXR1cyB0byByZXBvcnQgb24gbGluayB1cCBmb3IgZWl0aGVyIFhHWFMgb3IgU2VyRGVzICovCi0JaWYgKHBhcmFtcy0+c3dpdGNoX2NmZyA9PSBTV0lUQ0hfQ0ZHXzEwRykgeworCWlmIChDSElQX0lTX0UzKGJwKSkgeworCQltYXNrID0gTklHX01BU0tfWEdYUzBfTElOS19TVEFUVVM7CisJCWlmICghKFNJTkdMRV9NRURJQV9ESVJFQ1QocGFyYW1zKSkpCisJCQltYXNrIHw9IE5JR19NQVNLX01JX0lOVDsKKwl9IGVsc2UgaWYgKHBhcmFtcy0+c3dpdGNoX2NmZyA9PSBTV0lUQ0hfQ0ZHXzEwRykgewogCQltYXNrID0gKE5JR19NQVNLX1hHWFMwX0xJTksxMEcgfAogCQkJTklHX01BU0tfWEdYUzBfTElOS19TVEFUVVMpOwogCQlEUChORVRJRl9NU0dfTElOSywgImVuYWJsZWQgWEdYUyBpbnRlcnJ1cHRcbiIpOwpAQCAtMjkxOCwxMSArNTY2NSwxMSBAQAogfQogCiBzdGF0aWMgdm9pZCBibngyeF9saW5rX2ludF9hY2soc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkgICAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycywgdTggaXNfMTBnKQorCQkJICAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsIHU4IGlzXzEwZ19wbHVzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0KKwl1MzIgbWFzazsKIAkvKgogCSAqIEZpcnN0IHJlc2V0IGFsbCBzdGF0dXMgd2UgYXNzdW1lIG9ubHkgb25lIGxpbmUgd2lsbCBiZQogCSAqIGNoYW5nZSBhdCBhIHRpbWUKQEAgLTI5MzIsNDcgKzU2NzksMzQgQEAKIAkJCU5JR19TVEFUVVNfWEdYUzBfTElOS19TVEFUVVMgfAogCQkJTklHX1NUQVRVU19TRVJERVMwX0xJTktfU1RBVFVTKSk7CiAJaWYgKHZhcnMtPnBoeV9saW5rX3VwKSB7Ci0JCWlmIChpc18xMGcpIHsKLQkJCS8qCi0JCQkgKiBEaXNhYmxlIHRoZSAxMEcgbGluayBpbnRlcnJ1cHQgYnkgd3JpdGluZyAxIHRvIHRoZQotCQkJICogc3RhdHVzIHJlZ2lzdGVyCi0JCQkgKi8KLQkJCURQKE5FVElGX01TR19MSU5LLCAiMTBHIFhHWFMgcGh5IGxpbmsgdXBcbiIpOwotCQkJYm54MnhfYml0c19lbihicCwKLQkJCQkgICAgICBOSUdfUkVHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsCi0JCQkJICAgICAgTklHX1NUQVRVU19YR1hTMF9MSU5LMTBHKTsKLQotCQl9IGVsc2UgaWYgKHBhcmFtcy0+c3dpdGNoX2NmZyA9PSBTV0lUQ0hfQ0ZHXzEwRykgewotCQkJLyoKLQkJCSAqIERpc2FibGUgdGhlIGxpbmsgaW50ZXJydXB0IGJ5IHdyaXRpbmcgMSB0byB0aGUKLQkJCSAqIHJlbGV2YW50IGxhbmUgaW4gdGhlIHN0YXR1cyByZWdpc3RlcgotCQkJICovCi0JCQl1MzIgc2VyX2xhbmUgPSAoKHBhcmFtcy0+bGFuZV9jb25maWcgJgorCQlpZiAoVVNFU19XQVJQQ09SRShicCkpCisJCQltYXNrID0gTklHX1NUQVRVU19YR1hTMF9MSU5LX1NUQVRVUzsKKwkJZWxzZSB7CisJCQlpZiAoaXNfMTBnX3BsdXMpCisJCQkJbWFzayA9IE5JR19TVEFUVVNfWEdYUzBfTElOSzEwRzsKKwkJCWVsc2UgaWYgKHBhcmFtcy0+c3dpdGNoX2NmZyA9PSBTV0lUQ0hfQ0ZHXzEwRykgeworCQkJCS8qCisJCQkJICogRGlzYWJsZSB0aGUgbGluayBpbnRlcnJ1cHQgYnkgd3JpdGluZyAxIHRvCisJCQkJICogdGhlIHJlbGV2YW50IGxhbmUgaW4gdGhlIHN0YXR1cyByZWdpc3RlcgorCQkJCSAqLworCQkJCXUzMiBzZXJfbGFuZSA9CisJCQkJCSgocGFyYW1zLT5sYW5lX2NvbmZpZyAmCiAJCQkJICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX01BU0spID4+CiAJCQkJICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX1NISUZUKTsKLQotCQkJRFAoTkVUSUZfTVNHX0xJTkssICIlZCBzcGVlZCBYR1hTIHBoeSBsaW5rIHVwXG4iLAotCQkJCSB2YXJzLT5saW5lX3NwZWVkKTsKLQkJCWJueDJ4X2JpdHNfZW4oYnAsCi0JCQkJICAgICAgTklHX1JFR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0LAotCQkJCSAgICAgICgoMSA8PCBzZXJfbGFuZSkgPDwKLQkJCQkgICAgICAgTklHX1NUQVRVU19YR1hTMF9MSU5LX1NUQVRVU19TSVpFKSk7Ci0KLQkJfSBlbHNlIHsgLyogU2VyRGVzICovCi0JCQlEUChORVRJRl9NU0dfTElOSywgIlNlckRlcyBwaHkgbGluayB1cFxuIik7Ci0JCQkvKgotCQkJICogRGlzYWJsZSB0aGUgbGluayBpbnRlcnJ1cHQgYnkgd3JpdGluZyAxIHRvIHRoZSBzdGF0dXMKLQkJCSAqIHJlZ2lzdGVyCi0JCQkgKi8KLQkJCWJueDJ4X2JpdHNfZW4oYnAsCi0JCQkJICAgICAgTklHX1JFR19TVEFUVVNfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0LAotCQkJCSAgICAgIE5JR19TVEFUVVNfU0VSREVTMF9MSU5LX1NUQVRVUyk7CisJCQkJbWFzayA9ICgoMSA8PCBzZXJfbGFuZSkgPDwKKwkJCQkgICAgICAgTklHX1NUQVRVU19YR1hTMF9MSU5LX1NUQVRVU19TSVpFKTsKKwkJCX0gZWxzZQorCQkJCW1hc2sgPSBOSUdfU1RBVFVTX1NFUkRFUzBfTElOS19TVEFUVVM7CiAJCX0KLQorCQlEUChORVRJRl9NU0dfTElOSywgIkFjayBsaW5rIHVwIGludGVycnVwdCB3aXRoIG1hc2sgMHgleFxuIiwKKwkJCSAgICAgICBtYXNrKTsKKwkJYm54MnhfYml0c19lbihicCwKKwkJCSAgICAgIE5JR19SRUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMCArIHBvcnQqNCwKKwkJCSAgICAgIG1hc2spOwogCX0KIH0KIAotc3RhdGljIHU4IGJueDJ4X2Zvcm1hdF92ZXIodTMyIG51bSwgdTggKnN0ciwgdTE2ICpsZW4pCitzdGF0aWMgaW50IGJueDJ4X2Zvcm1hdF92ZXIodTMyIG51bSwgdTggKnN0ciwgdTE2ICpsZW4pCiB7CiAJdTggKnN0cl9wdHIgPSBzdHI7CiAJdTMyIG1hc2sgPSAweGYwMDAwMDAwOwpAQCAtMzAxMSwxOSArNTc0NSwxOSBAQAogfQogCiAKLXN0YXRpYyB1OCBibngyeF9udWxsX2Zvcm1hdF92ZXIodTMyIHNwaXJvbV92ZXIsIHU4ICpzdHIsIHUxNiAqbGVuKQorc3RhdGljIGludCBibngyeF9udWxsX2Zvcm1hdF92ZXIodTMyIHNwaXJvbV92ZXIsIHU4ICpzdHIsIHUxNiAqbGVuKQogewogCXN0clswXSA9ICdcMCc7CiAJKCpsZW4pLS07CiAJcmV0dXJuIDA7CiB9CiAKLXU4IGJueDJ4X2dldF9leHRfcGh5X2Z3X3ZlcnNpb24oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHU4IGRyaXZlcl9sb2FkZWQsCi0JCQkgICAgICB1OCAqdmVyc2lvbiwgdTE2IGxlbikKK2ludCBibngyeF9nZXRfZXh0X3BoeV9md192ZXJzaW9uKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1OCBkcml2ZXJfbG9hZGVkLAorCQkJCSB1OCAqdmVyc2lvbiwgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgYm54MnggKmJwOwogCXUzMiBzcGlyb21fdmVyID0gMDsKLQl1OCBzdGF0dXMgPSAwOworCWludCBzdGF0dXMgPSAwOwogCXU4ICp2ZXJfcCA9IHZlcnNpb247CiAJdTE2IHJlbWFpbl9sZW4gPSBsZW47CiAJaWYgKHZlcnNpb24gPT0gTlVMTCB8fCBwYXJhbXMgPT0gTlVMTCkKQEAgLTMwNjUsMTUgKzU3OTksMTggQEAKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAogCWlmIChwaHktPnJlcV9saW5lX3NwZWVkICE9IFNQRUVEXzEwMDApIHsKLQkJdTMyIG1kX2RldmFkOworCQl1MzIgbWRfZGV2YWQgPSAwOwogCiAJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyAxMEcgbG9vcGJhY2sgZW5hYmxlXG4iKTsKIAotCQkvKiBjaGFuZ2UgdGhlIHVuaV9waHlfYWRkciBpbiB0aGUgbmlnICovCi0JCW1kX2RldmFkID0gUkVHX1JEKGJwLCAoTklHX1JFR19YR1hTMF9DVFJMX01EX0RFVkFEICsKLQkJCQkgICAgICAgcG9ydCoweDE4KSk7CisJCWlmICghQ0hJUF9JU19FMyhicCkpIHsKKwkJCS8qIGNoYW5nZSB0aGUgdW5pX3BoeV9hZGRyIGluIHRoZSBuaWcgKi8KKwkJCW1kX2RldmFkID0gUkVHX1JEKGJwLCAoTklHX1JFR19YR1hTMF9DVFJMX01EX0RFVkFEICsKKwkJCQkJICAgICAgIHBvcnQqMHgxOCkpOwogCi0JCVJFR19XUihicCwgTklHX1JFR19YR1hTMF9DVFJMX01EX0RFVkFEICsgcG9ydCoweDE4LCAweDUpOworCQkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFMwX0NUUkxfTURfREVWQUQgKyBwb3J0KjB4MTgsCisJCQkgICAgICAgMHg1KTsKKwkJfQogCiAJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKIAkJCQkgNSwKQEAgLTMwODgsMTAgKzU4MjUsMTMgQEAKIAkJCQkgMHg2MDQxKTsKIAkJbXNsZWVwKDIwMCk7CiAJCS8qIHNldCBhZXIgbW1kIGJhY2sgKi8KLQkJYm54Mnhfc2V0X2Flcl9tbWRfeGd4cyhwYXJhbXMsIHBoeSk7CisJCWJueDJ4X3NldF9hZXJfbW1kKHBhcmFtcywgcGh5KTsKIAotCQkvKiBhbmQgbWRfZGV2YWQgKi8KLQkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFMwX0NUUkxfTURfREVWQUQgKyBwb3J0KjB4MTgsIG1kX2RldmFkKTsKKwkJaWYgKCFDSElQX0lTX0UzKGJwKSkgeworCQkJLyogYW5kIG1kX2RldmFkICovCisJCQlSRUdfV1IoYnAsIE5JR19SRUdfWEdYUzBfQ1RSTF9NRF9ERVZBRCArIHBvcnQqMHgxOCwKKwkJCSAgICAgICBtZF9kZXZhZCk7CisJCX0KIAl9IGVsc2UgewogCQl1MTYgbWlpX2N0cmw7CiAJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyAxRyBsb29wYmFjayBlbmFibGVcbiIpOwpAQCAtMzEwNywxMiArNTg0NywxMyBAQAogCX0KIH0KIAotdTggYm54Mnhfc2V0X2xlZChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsIHU4IG1vZGUsIHUzMiBzcGVlZCkKK2ludCBibngyeF9zZXRfbGVkKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsIHU4IG1vZGUsIHUzMiBzcGVlZCkKIHsKIAl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwogCXUxNiBod19sZWRfbW9kZSA9IHBhcmFtcy0+aHdfbGVkX21vZGU7Ci0JdTggcmMgPSAwLCBwaHlfaWR4OworCWludCByYyA9IDA7CisJdTggcGh5X2lkeDsKIAl1MzIgdG1wOwogCXUzMiBlbWFjX2Jhc2UgPSBwb3J0ID8gR1JDQkFTRV9FTUFDMSA6IEdSQ0JBU0VfRU1BQzA7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CkBAIC0zMTQ2LDggKzU4ODcsMTAgQEAKIAkJaWYgKCF2YXJzLT5saW5rX3VwKQogCQkJYnJlYWs7CiAJY2FzZSBMRURfTU9ERV9PTjoKLQkJaWYgKHBhcmFtcy0+cGh5W0VYVF9QSFkxXS50eXBlID09Ci0JCSAgICBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3ICYmCisJCWlmICgoKHBhcmFtcy0+cGh5W0VYVF9QSFkxXS50eXBlID09CisJCQkgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcpIHx8CisJCQkgKHBhcmFtcy0+cGh5W0VYVF9QSFkxXS50eXBlID09CisJCQkgIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjIpKSAmJgogCQkgICAgQ0hJUF9JU19FMihicCkgJiYgcGFyYW1zLT5udW1fcGh5cyA9PSAyKSB7CiAJCQkvKgogCQkJICogVGhpcyBpcyBhIHdvcmstYXJvdW5kIGZvciBFMis4NzI3IENvbmZpZ3VyYXRpb25zCkBAIC0zMTYyLDcgKzU5MDUsOSBAQAogCQkJCQkodG1wIHwgRU1BQ19MRURfT1ZFUlJJREUpKTsKIAkJCQlyZXR1cm4gcmM7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoU0lOR0xFX01FRElBX0RJUkVDVChwYXJhbXMpKSB7CisJCX0gZWxzZSBpZiAoU0lOR0xFX01FRElBX0RJUkVDVChwYXJhbXMpICYmCisJCQkgICAoQ0hJUF9JU19FMXgoYnApIHx8CisJCQkgICAgQ0hJUF9JU19FMihicCkpKSB7CiAJCQkvKgogCQkJICogVGhpcyBpcyBhIHdvcmstYXJvdW5kIGZvciBIVyBpc3N1ZSBmb3VuZCB3aGVuIGxpbmsKIAkJCSAqIGlzIHVwIGluIENMNzMKQEAgLTMyMTQsMjEgKzU5NTksNDkgQEAKICAqIFRoaXMgZnVuY3Rpb24gY29tZXMgdG8gcmVmbGVjdCB0aGUgYWN0dWFsIGxpbmsgc3RhdGUgcmVhZCBESVJFQ1RMWSBmcm9tIHRoZQogICogSFcKICAqLwotdTggYm54MnhfdGVzdF9saW5rKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAotCQkgICB1OCBpc19zZXJkZXMpCitpbnQgYm54MnhfdGVzdF9saW5rKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAorCQkgICAgdTggaXNfc2VyZGVzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXUxNiBncF9zdGF0dXMgPSAwLCBwaHlfaW5kZXggPSAwOwogCXU4IGV4dF9waHlfbGlua191cCA9IDAsIHNlcmRlc19waHlfdHlwZTsKIAlzdHJ1Y3QgbGlua192YXJzIHRlbXBfdmFyczsKKwlzdHJ1Y3QgYm54MnhfcGh5ICppbnRfcGh5ID0gJnBhcmFtcy0+cGh5W0lOVF9QSFldOwogCi0JQ0wyMl9SRF9PVkVSX0NMNDUoYnAsICZwYXJhbXMtPnBoeVtJTlRfUEhZXSwKKwlpZiAoQ0hJUF9JU19FMyhicCkpIHsKKwkJdTE2IGxpbmtfdXA7CisJCWlmIChwYXJhbXMtPnJlcV9saW5lX3NwZWVkW0xJTktfQ09ORklHX0lEWChJTlRfUEhZKV0KKwkJICAgID4gU1BFRURfMTAwMDApIHsKKwkJCS8qIENoZWNrIDIwRyBsaW5rICovCisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIGludF9waHksIE1ESU9fV0NfREVWQUQsCisJCQkJCTEsICZsaW5rX3VwKTsKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgaW50X3BoeSwgTURJT19XQ19ERVZBRCwKKwkJCQkJMSwgJmxpbmtfdXApOworCQkJbGlua191cCAmPSAoMTw8Mik7CisJCX0gZWxzZSB7CisJCQkvKiBDaGVjayAxMEcgbGluayBhbmQgYmVsb3cqLworCQkJdTggbGFuZSA9IGJueDJ4X2dldF93YXJwY29yZV9sYW5lKGludF9waHksIHBhcmFtcyk7CisJCQlibngyeF9jbDQ1X3JlYWQoYnAsIGludF9waHksIE1ESU9fV0NfREVWQUQsCisJCQkJCU1ESU9fV0NfUkVHX0dQMl9TVEFUVVNfR1BfMl8xLAorCQkJCQkmZ3Bfc3RhdHVzKTsKKwkJCWdwX3N0YXR1cyA9ICgoZ3Bfc3RhdHVzID4+IDgpICYgMHhmKSB8CisJCQkJKChncF9zdGF0dXMgPj4gMTIpICYgMHhmKTsKKwkJCWxpbmtfdXAgPSBncF9zdGF0dXMgJiAoMSA8PCBsYW5lKTsKKwkJfQorCQlpZiAoIWxpbmtfdXApCisJCQlyZXR1cm4gLUVTUkNIOworCX0gZWxzZSB7CisJCUNMMjJfUkRfT1ZFUl9DTDQ1KGJwLCBpbnRfcGh5LAogCQkJICBNRElPX1JFR19CQU5LX0dQX1NUQVRVUywKIAkJCSAgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzEsCiAJCQkgICZncF9zdGF0dXMpOwogCS8qIGxpbmsgaXMgdXAgb25seSBpZiBib3RoIGxvY2FsIHBoeSBhbmQgZXh0ZXJuYWwgcGh5IGFyZSB1cCAqLwogCWlmICghKGdwX3N0YXR1cyAmIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0xJTktfU1RBVFVTKSkKIAkJcmV0dXJuIC1FU1JDSDsKKwl9CisJLyogSW4gWEdYUyBsb29wYmFjayBtb2RlLCBkbyBub3QgY2hlY2sgZXh0ZXJuYWwgUEhZICovCisJaWYgKHBhcmFtcy0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19YR1hTKQorCQlyZXR1cm4gMDsKIAogCXN3aXRjaCAocGFyYW1zLT5udW1fcGh5cykgewogCWNhc2UgMToKQEAgLTMyNDUsNyArNjAxOCw5IEBACiAJCQlzZXJkZXNfcGh5X3R5cGUgPSAoKHBhcmFtcy0+cGh5W3BoeV9pbmRleF0ubWVkaWFfdHlwZSA9PQogCQkJCQkgICAgRVRIX1BIWV9TRlBfRklCRVIpIHx8CiAJCQkJCSAgIChwYXJhbXMtPnBoeVtwaHlfaW5kZXhdLm1lZGlhX3R5cGUgPT0KLQkJCQkJICAgIEVUSF9QSFlfWEZQX0ZJQkVSKSk7CisJCQkJCSAgICBFVEhfUEhZX1hGUF9GSUJFUikgfHwKKwkJCQkJICAgKHBhcmFtcy0+cGh5W3BoeV9pbmRleF0ubWVkaWFfdHlwZSA9PQorCQkJCQkgICAgRVRIX1BIWV9EQV9UV0lOQVgpKTsKIAogCQkJaWYgKGlzX3NlcmRlcyAhPSBzZXJkZXNfcGh5X3R5cGUpCiAJCQkJY29udGludWU7CkBAIC0zMjYzLDEwICs2MDM4LDEwIEBACiAJcmV0dXJuIC1FU1JDSDsKIH0KIAotc3RhdGljIHU4IGJueDJ4X2xpbmtfaW5pdGlhbGl6ZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQlzdHJ1Y3QgbGlua192YXJzICp2YXJzKQorc3RhdGljIGludCBibngyeF9saW5rX2luaXRpYWxpemUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCiB7Ci0JdTggcmMgPSAwOworCWludCByYyA9IDA7CiAJdTggcGh5X2luZGV4LCBub25fZXh0X3BoeTsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAkvKgpAQCAtMzI4MiwxMiArNjA1Nyw4IEBACiAJICogKG5vIGV4dGVybmFsIHBoeXMpLCBvciB0aGlzIGJvYXJkIGhhcyBleHRlcm5hbCBwaHkgd2hpY2ggcmVxdWlyZXMKIAkgKiB0byBmaXJzdC4KIAkgKi8KLQotCWlmIChwYXJhbXMtPnBoeVtJTlRfUEhZXS5jb25maWdfaW5pdCkKLQkJcGFyYW1zLT5waHlbSU5UX1BIWV0uY29uZmlnX2luaXQoCi0JCQkmcGFyYW1zLT5waHlbSU5UX1BIWV0sCi0JCQlwYXJhbXMsIHZhcnMpOwotCisJaWYgKCFVU0VTX1dBUlBDT1JFKGJwKSkKKwkJYm54MnhfcHJlcGFyZV94Z3hzKCZwYXJhbXMtPnBoeVtJTlRfUEhZXSwgcGFyYW1zLCB2YXJzKTsKIAkvKiBpbml0IGV4dCBwaHkgYW5kIGVuYWJsZSBsaW5rIHN0YXRlIGludCAqLwogCW5vbl9leHRfcGh5ID0gKFNJTkdMRV9NRURJQV9ESVJFQ1QocGFyYW1zKSB8fAogCQkgICAgICAgKHBhcmFtcy0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19YR1hTKSk7CkBAIC0zMjk2LDEzICs2MDY3LDIyIEBACiAJICAgIChwYXJhbXMtPnBoeVtFWFRfUEhZMV0uZmxhZ3MgJiBGTEFHU19JTklUX1hHWFNfRklSU1QpIHx8CiAJICAgIChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfRVhUX1BIWSkpIHsKIAkJc3RydWN0IGJueDJ4X3BoeSAqcGh5ID0gJnBhcmFtcy0+cGh5W0lOVF9QSFldOwotCQlpZiAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykKKwkJaWYgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfQVVUT19ORUcgJiYKKwkJICAgIChDSElQX0lTX0UxeChicCkgfHwKKwkJICAgICBDSElQX0lTX0UyKGJwKSkpCiAJCQlibngyeF9zZXRfcGFyYWxsZWxfZGV0ZWN0aW9uKHBoeSwgcGFyYW1zKTsKLQkJYm54MnhfaW5pdF9pbnRlcm5hbF9waHkocGh5LCBwYXJhbXMsIHZhcnMpOworCQkJaWYgKHBhcmFtcy0+cGh5W0lOVF9QSFldLmNvbmZpZ19pbml0KQorCQkJCXBhcmFtcy0+cGh5W0lOVF9QSFldLmNvbmZpZ19pbml0KHBoeSwKKwkJCQkJCQkJIHBhcmFtcywKKwkJCQkJCQkJIHZhcnMpOwogCX0KIAogCS8qIEluaXQgZXh0ZXJuYWwgcGh5Ki8KLQlpZiAoIW5vbl9leHRfcGh5KQorCWlmIChub25fZXh0X3BoeSkgeworCQlpZiAocGFyYW1zLT5waHlbSU5UX1BIWV0uc3VwcG9ydGVkICYKKwkJICAgIFNVUFBPUlRFRF9GSUJSRSkKKwkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfU1RBVFVTX1NFUkRFU19MSU5LOworCX0gZWxzZSB7CiAJCWZvciAocGh5X2luZGV4ID0gRVhUX1BIWTE7IHBoeV9pbmRleCA8IHBhcmFtcy0+bnVtX3BoeXM7CiAJCSAgICAgIHBoeV9pbmRleCsrKSB7CiAJCQkvKgpAQCAtMzMxMSwxNyArNjA5MSwyMiBAQAogCQkJICogbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaXJzdCBwaHksIHNpbmNlIHRoZXkgYXJlCiAJCQkgKiBjb25uZWN0ZWQuCiAJCQkgKi8KKwkJCWlmIChwYXJhbXMtPnBoeVtwaHlfaW5kZXhdLnN1cHBvcnRlZCAmCisJCQkgICAgU1VQUE9SVEVEX0ZJQlJFKQorCQkJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfU1RBVFVTX1NFUkRFU19MSU5LOworCiAJCQlpZiAocGh5X2luZGV4ID09IEVYVF9QSFkyICYmCiAJCQkgICAgKGJueDJ4X3BoeV9zZWxlY3Rpb24ocGFyYW1zKSA9PQogCQkJICAgICBQT1JUX0hXX0NGR19QSFlfU0VMRUNUSU9OX0ZJUlNUX1BIWSkpIHsKLQkJCQlEUChORVRJRl9NU0dfTElOSywgIklnbm9yaW5nIHNlY29uZCBwaHlcbiIpOworCQkJCURQKE5FVElGX01TR19MSU5LLCAiTm90IGluaXRpYWxpemluZyIKKwkJCQkJCSIgc2Vjb25kIHBoeVxuIik7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlwYXJhbXMtPnBoeVtwaHlfaW5kZXhdLmNvbmZpZ19pbml0KAogCQkJCSZwYXJhbXMtPnBoeVtwaHlfaW5kZXhdLAogCQkJCXBhcmFtcywgdmFycyk7CiAJCX0KLQorCX0KIAkvKiBSZXNldCB0aGUgaW50ZXJydXB0IGluZGljYXRpb24gYWZ0ZXIgcGh5IHdhcyBpbml0aWFsaXplZCAqLwogCWJueDJ4X2JpdHNfZGlzKGJwLCBOSUdfUkVHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDAgKwogCQkgICAgICAgcGFyYW1zLT5wb3J0KjQsCkBAIC0zMzI5LDYgKzYxMTQsNyBAQAogCQkJTklHX1NUQVRVU19YR1hTMF9MSU5LX1NUQVRVUyB8CiAJCQlOSUdfU1RBVFVTX1NFUkRFUzBfTElOS19TVEFUVVMgfAogCQkJTklHX01BU0tfTUlfSU5UKSk7CisJYm54MnhfdXBkYXRlX21uZyhwYXJhbXMsIHZhcnMtPmxpbmtfc3RhdHVzKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTMzNTksMjAgKzYxNDUsMjUgQEAKIAlEUChORVRJRl9NU0dfTElOSywgInJlc2V0IGV4dGVybmFsIFBIWVxuIik7CiB9CiAKLXN0YXRpYyB1OCBibngyeF91cGRhdGVfbGlua19kb3duKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJICAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCitzdGF0aWMgaW50IGJueDJ4X3VwZGF0ZV9saW5rX2Rvd24oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CiAKIAlEUChORVRJRl9NU0dfTElOSywgIlBvcnQgJXg6IExpbmsgaXMgZG93blxuIiwgcG9ydCk7CiAJYm54Mnhfc2V0X2xlZChwYXJhbXMsIHZhcnMsIExFRF9NT0RFX09GRiwgMCk7Ci0KKwl2YXJzLT5waHlfZmxhZ3MgJj0gflBIWV9QSFlTSUNBTF9MSU5LX0ZMQUc7CiAJLyogaW5kaWNhdGUgbm8gbWFjIGFjdGl2ZSAqLwogCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfTk9ORTsKIAogCS8qIHVwZGF0ZSBzaGFyZWQgbWVtb3J5ICovCi0JdmFycy0+bGlua19zdGF0dXMgPSAwOworCXZhcnMtPmxpbmtfc3RhdHVzICY9IH4oTElOS19TVEFUVVNfU1BFRURfQU5EX0RVUExFWF9NQVNLIHwKKwkJCSAgICAgICBMSU5LX1NUQVRVU19MSU5LX1VQIHwKKwkJCSAgICAgICBMSU5LX1NUQVRVU19BVVRPX05FR09USUFURV9DT01QTEVURSB8CisJCQkgICAgICAgTElOS19TVEFUVVNfUlhfRkxPV19DT05UUk9MX0ZMQUdfTUFTSyB8CisJCQkgICAgICAgTElOS19TVEFUVVNfVFhfRkxPV19DT05UUk9MX0ZMQUdfTUFTSyB8CisJCQkgICAgICAgTElOS19TVEFUVVNfUEFSQUxMRUxfREVURUNUSU9OX0ZMQUdfTUFTSyk7CiAJdmFycy0+bGluZV9zcGVlZCA9IDA7CiAJYm54MnhfdXBkYXRlX21uZyhwYXJhbXMsIHZhcnMtPmxpbmtfc3RhdHVzKTsKIApAQCAtMzM4MCwyNiArNjE3MSwzNCBAQAogCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUgKyBwb3J0KjQsIDEpOwogCiAJLyogZGlzYWJsZSBlbWFjICovCi0JUkVHX1dSKGJwLCBOSUdfUkVHX05JR19FTUFDMF9FTiArIHBvcnQqNCwgMCk7CisJaWYgKCFDSElQX0lTX0UzKGJwKSkKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX05JR19FTUFDMF9FTiArIHBvcnQqNCwgMCk7CiAKIAltc2xlZXAoMTApOwotCi0JLyogcmVzZXQgQmlnTWFjICovCi0JYm54MnhfYm1hY19yeF9kaXNhYmxlKGJwLCBwYXJhbXMtPnBvcnQpOwotCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfQ0xFQVIsCisJLyogcmVzZXQgQmlnTWFjL1htYWMgKi8KKwlpZiAoQ0hJUF9JU19FMXgoYnApIHx8CisJICAgIENISVBfSVNfRTIoYnApKSB7CisJCWJueDJ4X2JtYWNfcnhfZGlzYWJsZShicCwgcGFyYW1zLT5wb3J0KTsKKwkJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKworCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfQ0xFQVIsCiAJICAgICAgIChNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfQk1BQzAgPDwgcG9ydCkpOworCX0KKwlpZiAoQ0hJUF9JU19FMyhicCkpCisJCWJueDJ4X3htYWNfZGlzYWJsZShwYXJhbXMpOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1OCBibngyeF91cGRhdGVfbGlua191cChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCSAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycywKLQkJCSAgICAgdTggbGlua18xMGcpCitzdGF0aWMgaW50IGJueDJ4X3VwZGF0ZV9saW5rX3VwKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCXN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCisJCQkJdTggbGlua18xMGcpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQl1OCByYyA9IDA7CisJaW50IHJjID0gMDsKIAogCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfU1RBVFVTX0xJTktfVVA7CisJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9QSFlTSUNBTF9MSU5LX0ZMQUc7CiAKIAlpZiAodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKQogCQl2YXJzLT5saW5rX3N0YXR1cyB8PQpAQCAtMzQwOCwyNSArNjIwNyw0OCBAQAogCWlmICh2YXJzLT5mbG93X2N0cmwgJiBCTlgyWF9GTE9XX0NUUkxfUlgpCiAJCXZhcnMtPmxpbmtfc3RhdHVzIHw9CiAJCQlMSU5LX1NUQVRVU19SWF9GTE9XX0NPTlRST0xfRU5BQkxFRDsKLQotCWlmIChsaW5rXzEwZykgewotCQlibngyeF9ibWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDApOworCWlmIChVU0VTX1dBUlBDT1JFKGJwKSkgeworCQlpZiAobGlua18xMGcpIHsKKwkJCWlmIChibngyeF94bWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDApID09CisJCQkgICAgLUVTUkNIKSB7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJGb3VuZCBlcnJvcnMgb24gWE1BQ1xuIik7CisJCQkJdmFycy0+bGlua191cCA9IDA7CisJCQkJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9IQUxGX09QRU5fQ09OTl9GTEFHOworCQkJCXZhcnMtPmxpbmtfc3RhdHVzICY9IH5MSU5LX1NUQVRVU19MSU5LX1VQOworCQkJfQorCQl9IGVsc2UKKwkJCWJueDJ4X3VtYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7CiAJCWJueDJ4X3NldF9sZWQocGFyYW1zLCB2YXJzLAotCQkJICAgICAgTEVEX01PREVfT1BFUiwgU1BFRURfMTAwMDApOwotCX0gZWxzZSB7Ci0JCXJjID0gYm54MnhfZW1hY19wcm9ncmFtKHBhcmFtcywgdmFycyk7CisJCQkgICAgICBMRURfTU9ERV9PUEVSLCB2YXJzLT5saW5lX3NwZWVkKTsKKwl9CisJaWYgKChDSElQX0lTX0UxeChicCkgfHwKKwkgICAgIENISVBfSVNfRTIoYnApKSkgeworCQlpZiAobGlua18xMGcpIHsKKwkJCWlmIChibngyeF9ibWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDApID09CisJCQkgICAgLUVTUkNIKSB7CisJCQkJRFAoTkVUSUZfTVNHX0xJTkssICJGb3VuZCBlcnJvcnMgb24gQk1BQ1xuIik7CisJCQkJdmFycy0+bGlua191cCA9IDA7CisJCQkJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9IQUxGX09QRU5fQ09OTl9GTEFHOworCQkJCXZhcnMtPmxpbmtfc3RhdHVzICY9IH5MSU5LX1NUQVRVU19MSU5LX1VQOworCQkJfQogCi0JCWJueDJ4X2VtYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7CisJCQlibngyeF9zZXRfbGVkKHBhcmFtcywgdmFycywKKwkJCQkgICAgICBMRURfTU9ERV9PUEVSLCBTUEVFRF8xMDAwMCk7CisJCX0gZWxzZSB7CisJCQlyYyA9IGJueDJ4X2VtYWNfcHJvZ3JhbShwYXJhbXMsIHZhcnMpOworCQkJYm54MnhfZW1hY19lbmFibGUocGFyYW1zLCB2YXJzLCAwKTsKIAotCQkvKiBBTiBjb21wbGV0ZT8gKi8KLQkJaWYgKCh2YXJzLT5saW5rX3N0YXR1cyAmIExJTktfU1RBVFVTX0FVVE9fTkVHT1RJQVRFX0NPTVBMRVRFKQotCQkgICAgJiYgKCEodmFycy0+cGh5X2ZsYWdzICYgUEhZX1NHTUlJX0ZMQUcpKSAmJgotCQkgICAgU0lOR0xFX01FRElBX0RJUkVDVChwYXJhbXMpKQotCQkJYm54Mnhfc2V0X2dtaWlfdHhfZHJpdmVyKHBhcmFtcyk7CisJCQkvKiBBTiBjb21wbGV0ZT8gKi8KKwkJCWlmICgodmFycy0+bGlua19zdGF0dXMgJgorCQkJICAgICBMSU5LX1NUQVRVU19BVVRPX05FR09USUFURV9DT01QTEVURSkKKwkJCSAgICAmJiAoISh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfU0dNSUlfRkxBRykpICYmCisJCQkgICAgU0lOR0xFX01FRElBX0RJUkVDVChwYXJhbXMpKQorCQkJCWJueDJ4X3NldF9nbWlpX3R4X2RyaXZlcihwYXJhbXMpOworCQl9CiAJfQogCiAJLyogUEJGIC0gbGluayB1cCAqLwotCWlmICghKENISVBfSVNfRTIoYnApKSkKKwlpZiAoQ0hJUF9JU19FMXgoYnApKQogCQlyYyB8PSBibngyeF9wYmZfdXBkYXRlKHBhcmFtcywgdmFycy0+Zmxvd19jdHJsLAogCQkJCSAgICAgICB2YXJzLT5saW5lX3NwZWVkKTsKIApAQCAtMzQ1MSwxNyArNjI3MywxOCBAQAogICogICBleHRlcm5hbCBwaHkgbmVlZHMgdG8gYmUgdXAsIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIDIKICAqICAgZXh0ZXJuYWwgcGh5IGxpbmsgbXVzdCBiZSB1cC4KICAqLwotdTggYm54MnhfbGlua191cGRhdGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCitpbnQgYm54MnhfbGlua191cGRhdGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJc3RydWN0IGxpbmtfdmFycyBwaHlfdmFyc1tNQVhfUEhZU107CiAJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQl1OCBsaW5rXzEwZywgcGh5X2luZGV4OwotCXU4IGV4dF9waHlfbGlua191cCA9IDAsIGN1cl9saW5rX3VwLCByYyA9IDA7CisJdTggbGlua18xMGdfcGx1cywgcGh5X2luZGV4OworCXU4IGV4dF9waHlfbGlua191cCA9IDAsIGN1cl9saW5rX3VwOworCWludCByYyA9IDA7CiAJdTggaXNfbWlfaW50ID0gMDsKIAl1MTYgZXh0X3BoeV9saW5lX3NwZWVkID0gMCwgcHJldl9saW5lX3NwZWVkID0gdmFycy0+bGluZV9zcGVlZDsKIAl1OCBhY3RpdmVfZXh0ZXJuYWxfcGh5ID0gSU5UX1BIWTsKLQl2YXJzLT5saW5rX3N0YXR1cyA9IDA7CisJdmFycy0+cGh5X2ZsYWdzICY9IH5QSFlfSEFMRl9PUEVOX0NPTk5fRkxBRzsKIAlmb3IgKHBoeV9pbmRleCA9IElOVF9QSFk7IHBoeV9pbmRleCA8IHBhcmFtcy0+bnVtX3BoeXM7CiAJICAgICAgcGh5X2luZGV4KyspIHsKIAkJcGh5X3ZhcnNbcGh5X2luZGV4XS5mbG93X2N0cmwgPSAwOwpAQCAtMzQ3MCw4ICs2MjkzLDEyIEBACiAJCXBoeV92YXJzW3BoeV9pbmRleF0uZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CiAJCXBoeV92YXJzW3BoeV9pbmRleF0ucGh5X2xpbmtfdXAgPSAwOwogCQlwaHlfdmFyc1twaHlfaW5kZXhdLmxpbmtfdXAgPSAwOworCQlwaHlfdmFyc1twaHlfaW5kZXhdLmZhdWx0X2RldGVjdGVkID0gMDsKIAl9CiAKKwlpZiAoVVNFU19XQVJQQ09SRShicCkpCisJCWJueDJ4X3NldF9hZXJfbW1kKHBhcmFtcywgJnBhcmFtcy0+cGh5W0lOVF9QSFldKTsKKwogCURQKE5FVElGX01TR19MSU5LLCAicG9ydCAleCwgWEdYUz8leCwgaW50X3N0YXR1cyAweCV4XG4iLAogCQkgcG9ydCwgKHZhcnMtPnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpLAogCQkgUkVHX1JEKGJwLCBOSUdfUkVHX1NUQVRVU19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQpKTsKQEAgLTM0ODgsMTMgKzYzMTUsMTQgQEAKIAkgIFJFR19SRChicCwgTklHX1JFR19YR1hTMF9TVEFUVVNfTElOS19TVEFUVVMgKyBwb3J0KjB4NjgpKTsKIAogCS8qIGRpc2FibGUgZW1hYyAqLwotCVJFR19XUihicCwgTklHX1JFR19OSUdfRU1BQzBfRU4gKyBwb3J0KjQsIDApOworCWlmICghQ0hJUF9JU19FMyhicCkpCisJCVJFR19XUihicCwgTklHX1JFR19OSUdfRU1BQzBfRU4gKyBwb3J0KjQsIDApOwogCiAJLyoKIAkgKiBTdGVwIDE6CiAJICogQ2hlY2sgZXh0ZXJuYWwgbGluayBjaGFuZ2Ugb25seSBmb3IgZXh0ZXJuYWwgcGh5cywgYW5kIGFwcGx5CiAJICogcHJpb3JpdHkgc2VsZWN0aW9uIGJldHdlZW4gdGhlbSBpbiBjYXNlIHRoZSBsaW5rIG9uIGJvdGggcGh5cwotCSAqIGlzIHVwLiBOb3RlIHRoYXQgdGhlIGluc3RlYWQgb2YgdGhlIGNvbW1vbiB2YXJzLCBhIHRlbXBvcmFyeQorCSAqIGlzIHVwLiBOb3RlIHRoYXQgaW5zdGVhZCBvZiB0aGUgY29tbW9uIHZhcnMsIGEgdGVtcG9yYXJ5CiAJICogdmFycyBhcmd1bWVudCBpcyB1c2VkIHNpbmNlIGVhY2ggcGh5IG1heSBoYXZlIGRpZmZlcmVudCBsaW5rLwogCSAqIHNwZWVkL2R1cGxleCByZXN1bHQKIAkgKi8KQEAgLTM2MDEsNiArNjQyOSw4IEBACiAJCWlmIChwYXJhbXMtPnBoeVthY3RpdmVfZXh0ZXJuYWxfcGh5XS5zdXBwb3J0ZWQgJgogCQkgICAgU1VQUE9SVEVEX0ZJQlJFKQogCQkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS19TVEFUVVNfU0VSREVTX0xJTks7CisJCWVsc2UKKwkJCXZhcnMtPmxpbmtfc3RhdHVzICY9IH5MSU5LX1NUQVRVU19TRVJERVNfTElOSzsKIAkJRFAoTkVUSUZfTVNHX0xJTkssICJBY3RpdmUgZXh0ZXJuYWwgcGh5IHNlbGVjdGVkOiAleFxuIiwKIAkJCSAgIGFjdGl2ZV9leHRlcm5hbF9waHkpOwogCX0KQEAgLTM2NDAsMTQgKzY0NzAsOSBAQAogCX0KIAogCS8qIGFueXRoaW5nIDEwIGFuZCBvdmVyIHVzZXMgdGhlIGJtYWMgKi8KLQlsaW5rXzEwZyA9ICgodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwMCkgfHwKLQkJICAgICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzEyMDAwKSB8fAotCQkgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTI1MDApIHx8Ci0JCSAgICAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMzAwMCkgfHwKLQkJICAgICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzE1MDAwKSB8fAotCQkgICAgKHZhcnMtPmxpbmVfc3BlZWQgPT0gU1BFRURfMTYwMDApKTsKKwlsaW5rXzEwZ19wbHVzID0gKHZhcnMtPmxpbmVfc3BlZWQgPj0gU1BFRURfMTAwMDApOwogCi0JYm54MnhfbGlua19pbnRfYWNrKHBhcmFtcywgdmFycywgbGlua18xMGcpOworCWJueDJ4X2xpbmtfaW50X2FjayhwYXJhbXMsIHZhcnMsIGxpbmtfMTBnX3BsdXMpOwogCiAJLyoKIAkgKiBJbiBjYXNlIGV4dGVybmFsIHBoeSBsaW5rIGlzIHVwLCBhbmQgaW50ZXJuYWwgbGluayBpcyBkb3duCkBAIC0zNjcxLDIxICs2NDk2LDI0IEBACiAJCQkJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9TR01JSV9GTEFHOwogCQkJZWxzZQogCQkJCXZhcnMtPnBoeV9mbGFncyAmPSB+UEhZX1NHTUlJX0ZMQUc7Ci0JCQlibngyeF9pbml0X2ludGVybmFsX3BoeSgmcGFyYW1zLT5waHlbSU5UX1BIWV0sCi0JCQkJCQlwYXJhbXMsCisKKwkJCWlmIChwYXJhbXMtPnBoeVtJTlRfUEhZXS5jb25maWdfaW5pdCkKKwkJCQlwYXJhbXMtPnBoeVtJTlRfUEhZXS5jb25maWdfaW5pdCgKKwkJCQkJJnBhcmFtcy0+cGh5W0lOVF9QSFldLCBwYXJhbXMsCiAJCQkJCQl2YXJzKTsKIAkJfQogCX0KIAkvKgogCSAqIExpbmsgaXMgdXAgb25seSBpZiBib3RoIGxvY2FsIHBoeSBhbmQgZXh0ZXJuYWwgcGh5IChpbiBjYXNlIG9mCi0JICogbm9uLWRpcmVjdCBib2FyZCkgYXJlIHVwCisJICogbm9uLWRpcmVjdCBib2FyZCkgYXJlIHVwIGFuZCBubyBmYXVsdCBkZXRlY3RlZCBvbiBhY3RpdmUgUEhZLgogCSAqLwogCXZhcnMtPmxpbmtfdXAgPSAodmFycy0+cGh5X2xpbmtfdXAgJiYKIAkJCSAoZXh0X3BoeV9saW5rX3VwIHx8Ci0JCQkgIFNJTkdMRV9NRURJQV9ESVJFQ1QocGFyYW1zKSkpOworCQkJICBTSU5HTEVfTUVESUFfRElSRUNUKHBhcmFtcykpICYmCisJCQkgKHBoeV92YXJzW2FjdGl2ZV9leHRlcm5hbF9waHldLmZhdWx0X2RldGVjdGVkID09IDApKTsKIAogCWlmICh2YXJzLT5saW5rX3VwKQotCQlyYyA9IGJueDJ4X3VwZGF0ZV9saW5rX3VwKHBhcmFtcywgdmFycywgbGlua18xMGcpOworCQlyYyA9IGJueDJ4X3VwZGF0ZV9saW5rX3VwKHBhcmFtcywgdmFycywgbGlua18xMGdfcGx1cyk7CiAJZWxzZQogCQlyYyA9IGJueDJ4X3VwZGF0ZV9saW5rX2Rvd24ocGFyYW1zLCB2YXJzKTsKIApAQCAtMzcyOSw2OSArNjU1Nyw2IEBACiAJCQkJICBwaHktPnZlcl9hZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgYm54MnhfZXh0X3BoeV9zZXRfcGF1c2Uoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJICAgIHN0cnVjdCBibngyeF9waHkgKnBoeSwKLQkJCQkgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKLXsKLQl1MTYgdmFsOwotCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCS8qIHJlYWQgbW9kaWZ5IHdyaXRlIHBhdXNlIGFkdmVydGl6aW5nICovCi0JYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fQU5fREVWQUQsIE1ESU9fQU5fUkVHX0FEVl9QQVVTRSwgJnZhbCk7Ci0KLQl2YWwgJj0gfk1ESU9fQU5fUkVHX0FEVl9QQVVTRV9CT1RIOwotCi0JLyogUGxlYXNlIHJlZmVyIHRvIFRhYmxlIDI4Qi0zIG9mIDgwMi4zYWItMTk5OSBzcGVjLiAqLwotCWJueDJ4X2NhbGNfaWVlZV9hbmVnX2FkdihwaHksIHBhcmFtcywgJnZhcnMtPmllZWVfZmMpOwotCWlmICgodmFycy0+aWVlZV9mYyAmCi0JICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0FTWU1NRVRSSUMpID09Ci0JICAgIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0FTWU1NRVRSSUMpIHsKLQkJdmFsIHw9IE1ESU9fQU5fUkVHX0FEVl9QQVVTRV9BU1lNTUVUUklDOwotCX0KLQlpZiAoKHZhcnMtPmllZWVfZmMgJgotCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIKSA9PQotCSAgICBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIKSB7Ci0JCXZhbCB8PSBNRElPX0FOX1JFR19BRFZfUEFVU0VfUEFVU0U7Ci0JfQotCURQKE5FVElGX01TR19MSU5LLCAiRXh0IHBoeSBBTiBhZHZlcnRpemUgMHgleFxuIiwgdmFsKTsKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQU5fREVWQUQsIE1ESU9fQU5fUkVHX0FEVl9QQVVTRSwgdmFsKTsKLX0KLQotc3RhdGljIHU4IGJueDJ4X2V4dF9waHlfcmVzb2x2ZV9mYyhzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkJICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKLXsKLQlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1MTYgbGRfcGF1c2U7CQkvKiBsb2NhbCAqLwotCXUxNiBscF9wYXVzZTsJCS8qIGxpbmsgcGFydG5lciAqLwotCXUxNiBwYXVzZV9yZXN1bHQ7Ci0JdTggcmV0ID0gMDsKLQkvKiByZWFkIHR3aWNlICovCi0KLQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKLQotCWlmIChwaHktPnJlcV9mbG93X2N0cmwgIT0gQk5YMlhfRkxPV19DVFJMX0FVVE8pCi0JCXZhcnMtPmZsb3dfY3RybCA9IHBoeS0+cmVxX2Zsb3dfY3RybDsKLQllbHNlIGlmIChwaHktPnJlcV9saW5lX3NwZWVkICE9IFNQRUVEX0FVVE9fTkVHKQotCQl2YXJzLT5mbG93X2N0cmwgPSBwYXJhbXMtPnJlcV9mY19hdXRvX2FkdjsKLQllbHNlIGlmICh2YXJzLT5saW5rX3N0YXR1cyAmIExJTktfU1RBVFVTX0FVVE9fTkVHT1RJQVRFX0NPTVBMRVRFKSB7Ci0JCXJldCA9IDE7Ci0JCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAotCQkJCU1ESU9fQU5fREVWQUQsCi0JCQkJTURJT19BTl9SRUdfQURWX1BBVVNFLCAmbGRfcGF1c2UpOwotCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKLQkJCQlNRElPX0FOX0RFVkFELAotCQkJCU1ESU9fQU5fUkVHX0xQX0FVVE9fTkVHLCAmbHBfcGF1c2UpOwotCQlwYXVzZV9yZXN1bHQgPSAobGRfcGF1c2UgJgotCQkJCU1ESU9fQU5fUkVHX0FEVl9QQVVTRV9NQVNLKSA+PiA4OwotCQlwYXVzZV9yZXN1bHQgfD0gKGxwX3BhdXNlICYKLQkJCQkgTURJT19BTl9SRUdfQURWX1BBVVNFX01BU0spID4+IDEwOwotCQlEUChORVRJRl9NU0dfTElOSywgIkV4dCBQSFkgcGF1c2UgcmVzdWx0IDB4JXhcbiIsCi0JCSAgIHBhdXNlX3Jlc3VsdCk7Ci0JCWJueDJ4X3BhdXNlX3Jlc29sdmUodmFycywgcGF1c2VfcmVzdWx0KTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIHZvaWQgYm54MnhfZXh0X3BoeV8xMEdfYW5fcmVzb2x2ZShzdHJ1Y3QgYm54MnggKmJwLAogCQkJCSAgICAgICBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCiAJCQkJICAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCkBAIC0zODQ1LDEzICs2NjEwLDEzIEBACiAJCQkgICBwYXVzZV9yZXN1bHQpOwogCX0KIH0KLXN0YXRpYyB1OCBibngyeF84MDczXzg3MjdfZXh0ZXJuYWxfcm9tX2Jvb3Qoc3RydWN0IGJueDJ4ICpicCwKLQkJCQkJICAgICAgc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJCQkgICAgICB1OCBwb3J0KQorc3RhdGljIGludCBibngyeF84MDczXzg3MjdfZXh0ZXJuYWxfcm9tX2Jvb3Qoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJICAgICBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJCSAgICAgdTggcG9ydCkKIHsKIAl1MzIgY291bnQgPSAwOwogCXUxNiBmd192ZXIxLCBmd19tc2dvdXQ7Ci0JdTggcmMgPSAwOworCWludCByYyA9IDA7CiAKIAkvKiBCb290IHBvcnQgZnJvbSBleHRlcm5hbCBST00gICovCiAJLyogRURDIGdyc3QgKi8KQEAgLTM5MjYsNyArNjY5MSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoJCQlCQ004MDczIFBIWSBTRUNUSU9OCQkJICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1OCBibngyeF84MDczX2lzX3Nucl9uZWVkZWQoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X3BoeSAqcGh5KQorc3RhdGljIGludCBibngyeF84MDczX2lzX3Nucl9uZWVkZWQoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X3BoeSAqcGh5KQogewogCS8qIFRoaXMgaXMgb25seSByZXF1aXJlZCBmb3IgODA3M0ExLCB2ZXJzaW9uIDEwMiBvbmx5ICovCiAJdTE2IHZhbDsKQEAgLTM5NTIsNyArNjcxNyw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB1OCBibngyeF84MDczX3hhdWlfd2Eoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X3BoeSAqcGh5KQorc3RhdGljIGludCBibngyeF84MDczX3hhdWlfd2Eoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X3BoeSAqcGh5KQogewogCXUxNiB2YWwsIGNudCwgY250MSA7CiAKQEAgLTQwNTksOSArNjgyNCw5IEBACiAJbXNsZWVwKDUwMCk7CiB9CiAKLXN0YXRpYyB1OCBibngyeF84MDczX2NvbmZpZ19pbml0KHN0cnVjdCBibngyeF9waHkgKnBoeSwKLQkJCQkgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCitzdGF0aWMgaW50IGJueDJ4XzgwNzNfY29uZmlnX2luaXQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXUxNiB2YWwgPSAwLCB0bXAxOwpAQCAtNDA4MSw5ICs2ODQ2LDkgQEAKIAogCS8qIGVuYWJsZSBMQVNJICovCiAJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAotCQkJIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfUlhfQUxBUk1fQ1RSTCwgKDE8PDIpKTsKKwkJCSBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfTEFTSV9SWENUUkwsICgxPDwyKSk7CiAJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAotCQkJIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLCAgMHgwMDA0KTsKKwkJCSBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfTEFTSV9DVFJMLCAgMHgwMDA0KTsKIAogCWJueDJ4XzgwNzNfc2V0X3BhdXNlX2NsMzcocGFyYW1zLCBwaHksIHZhcnMpOwogCkBAIC00MDkxLDcgKzY4NTYsNyBAQAogCQkJTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19NODA1MV9NU0dPVVRfUkVHLCAmdG1wMSk7CiAKIAlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKLQkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfUlhfQUxBUk0sICZ0bXAxKTsKKwkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX1JYU1RBVCwgJnRtcDEpOwogCiAJRFAoTkVUSUZfTVNHX0xJTkssICJCZWZvcmUgcm9tIFJYX0FMQVJNKHBvcnQxKTogMHgleFxuIiwgdG1wMSk7CiAKQEAgLTQyMjUsNyArNjk5MCw3IEBACiAJdTE2IGFuMTAwMF9zdGF0dXMgPSAwOwogCiAJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCi0JCQlNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfUkVHX0xBU0lfU1RBVFVTLCAmdmFsMSk7CisJCQlNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfTEFTSV9TVEFULCAmdmFsMSk7CiAKIAlEUChORVRJRl9NU0dfTElOSywgIjg3MDMgTEFTSSBzdGF0dXMgMHgleFxuIiwgdmFsMSk7CiAKQEAgLTQyNDEsNyArNzAwNiw3IEBACiAKIAkvKiBDaGVjayB0aGUgTEFTSSAqLwogCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAotCQkJTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19SWF9BTEFSTSwgJnZhbDIpOworCQkJTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX0xBU0lfUlhTVEFULCAmdmFsMik7CiAKIAlEUChORVRJRl9NU0dfTElOSywgIktSIDB4OTAwMyAweCV4XG4iLCB2YWwyKTsKIApAQCAtNDM2Nyw5ICs3MTMyLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgkJCUJDTTg3MDUgUEhZIFNFQ1RJT04JCQkgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHU4IGJueDJ4Xzg3MDVfY29uZmlnX2luaXQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJCSBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQkgc3RydWN0IGxpbmtfdmFycyAqdmFycykKK3N0YXRpYyBpbnQgYm54MnhfODcwNV9jb25maWdfaW5pdChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJRFAoTkVUSUZfTVNHX0xJTkssICJpbml0IDg3MDVcbiIpOwpAQCAtNDQzMCw2ICs3MTk1LDMwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoJCQlTRlArIG1vZHVsZSBTZWN0aW9uCQkJICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9kaXNhYmxlX3BtZF90cmFuc21pdChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkJICAgc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCQkgICB1OCBwbWRfZGlzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCS8qCisJICogRGlzYWJsZSB0cmFuc21pdHRlciBvbmx5IGZvciBib290Y29kZXMgd2hpY2ggY2FuIGVuYWJsZSBpdCBhZnRlcndhcmRzCisJICogKGZvciBEMyBsaW5rKQorCSAqLworCWlmIChwbWRfZGlzKSB7CisJCWlmIChwYXJhbXMtPmZlYXR1cmVfY29uZmlnX2ZsYWdzICYKKwkJICAgICBGRUFUVVJFX0NPTkZJR19CQ19TVVBQT1JUU19TRlBfVFhfRElTQUJMRUQpCisJCQlEUChORVRJRl9NU0dfTElOSywgIkRpc2FibGluZyBQTUQgdHJhbnNtaXR0ZXJcbiIpOworCQllbHNlIHsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiTk9UIGRpc2FibGluZyBQTUQgdHJhbnNtaXR0ZXJcbiIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCURQKE5FVElGX01TR19MSU5LLCAiRW5hYmxpbmcgUE1EIHRyYW5zbWl0dGVyXG4iKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCisJCQkgTURJT19QTUFfREVWQUQsCisJCQkgTURJT19QTUFfUkVHX1RYX0RJU0FCTEUsIHBtZF9kaXMpOworfQorCiBzdGF0aWMgdTggYm54MnhfZ2V0X2dwaW9fcG9ydChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKIHsKIAl1OCBncGlvX3BvcnQ7CkBAIC00NDQzLDkgKzcyMzIsMTAgQEAKIAlzd2FwX292ZXJyaWRlID0gUkVHX1JEKGJwLCBOSUdfUkVHX1NUUkFQX09WRVJSSURFKTsKIAlyZXR1cm4gZ3Bpb19wb3J0IF4gKHN3YXBfdmFsICYmIHN3YXBfb3ZlcnJpZGUpOwogfQotc3RhdGljIHZvaWQgYm54Mnhfc2ZwX3NldF90cmFuc21pdHRlcihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQkgICAgICBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkJICAgICAgdTggdHhfZW4pCisKK3N0YXRpYyB2b2lkIGJueDJ4X3NmcF9lMWUyX3NldF90cmFuc21pdHRlcihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkJICAgc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCQkgICB1OCB0eF9lbikKIHsKIAl1MTYgdmFsOwogCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CkBAIC00NTAwLDkgKzcyOTAsMjEgQEAKIAl9CiB9CiAKLXN0YXRpYyB1OCBibngyeF84NzI2X3JlYWRfc2ZwX21vZHVsZV9lZXByb20oc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJCQkgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJCSAgICB1MTYgYWRkciwgdTggYnl0ZV9jbnQsIHU4ICpvX2J1ZikKK3N0YXRpYyB2b2lkIGJueDJ4X3NmcF9zZXRfdHJhbnNtaXR0ZXIoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICAgICAgc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgICAgIHU4IHR4X2VuKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyBTRlArIHRyYW5zbWl0dGVyIHRvICVkXG4iLCB0eF9lbik7CisJaWYgKENISVBfSVNfRTMoYnApKQorCQlibngyeF9zZnBfZTNfc2V0X3RyYW5zbWl0dGVyKHBhcmFtcywgcGh5LCB0eF9lbik7CisJZWxzZQorCQlibngyeF9zZnBfZTFlMl9zZXRfdHJhbnNtaXR0ZXIocGFyYW1zLCBwaHksIHR4X2VuKTsKK30KKworc3RhdGljIGludCBibngyeF84NzI2X3JlYWRfc2ZwX21vZHVsZV9lZXByb20oc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCQkgICAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCQkgICAgIHUxNiBhZGRyLCB1OCBieXRlX2NudCwgdTggKm9fYnVmKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXUxNiB2YWwgPSAwOwpAQCAtNDU2Niw5ICs3MzY4LDQ1IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyB1OCBibngyeF84NzI3X3JlYWRfc2ZwX21vZHVsZV9lZXByb20oc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJCQkgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJCSAgICB1MTYgYWRkciwgdTggYnl0ZV9jbnQsIHU4ICpvX2J1ZikKK3N0YXRpYyBpbnQgYm54Mnhfd2FycGNvcmVfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJCQkgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJCQkgdTE2IGFkZHIsIHU4IGJ5dGVfY250LAorCQkJCQkJIHU4ICpvX2J1ZikKK3sKKwlpbnQgcmMgPSAwOworCXU4IGksIGogPSAwLCBjbnQgPSAwOworCXUzMiBkYXRhX2FycmF5WzRdOworCXUxNiBhZGRyMzI7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJLypEUChORVRJRl9NU0dfTElOSywgImJueDJ4X2RpcmVjdF9yZWFkX3NmcF9tb2R1bGVfZWVwcm9tOiIKKwkJCQkJIiBhZGRyICVkLCBjbnQgJWRcbiIsCisJCQkJCWFkZHIsIGJ5dGVfY250KTsqLworCWlmIChieXRlX2NudCA+IDE2KSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiUmVhZGluZyBmcm9tIGVlcHJvbSBpcyIKKwkJCSAgICAiIGlzIGxpbWl0ZWQgdG8gMTYgYnl0ZXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiA0IGJ5dGUgYWxpZ25lZCBhZGRyZXNzICovCisJYWRkcjMyID0gYWRkciAmICh+MHgzKTsKKwlkbyB7CisJCXJjID0gYm54MnhfYnNjX3JlYWQocGFyYW1zLCBwaHksIDB4YTAsIGFkZHIzMiwgMCwgYnl0ZV9jbnQsCisJCQkJICAgIGRhdGFfYXJyYXkpOworCX0gd2hpbGUgKChyYyAhPSAwKSAmJiAoKytjbnQgPCBJMkNfV0FfUkVUUllfQ05UKSk7CisKKwlpZiAocmMgPT0gMCkgeworCQlmb3IgKGkgPSAoYWRkciAtIGFkZHIzMik7IGkgPCBieXRlX2NudCArIChhZGRyIC0gYWRkcjMyKTsgaSsrKSB7CisJCQlvX2J1ZltqXSA9ICooKHU4ICopZGF0YV9hcnJheSArIGkpOworCQkJaisrOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGJueDJ4Xzg3MjdfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJCSAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJCSAgICAgdTE2IGFkZHIsIHU4IGJ5dGVfY250LCB1OCAqb19idWYpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJdTE2IHZhbCwgaTsKQEAgLTQ2NTMsMjcgKzc0OTEsMzkgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotdTggYm54MnhfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkJc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHUxNiBhZGRyLAotCQkJCXU4IGJ5dGVfY250LCB1OCAqb19idWYpCitpbnQgYm54MnhfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1MTYgYWRkciwKKwkJCQkgdTggYnl0ZV9jbnQsIHU4ICpvX2J1ZikKIHsKLQlpZiAocGh5LT50eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYpCi0JCXJldHVybiBibngyeF84NzI2X3JlYWRfc2ZwX21vZHVsZV9lZXByb20ocGh5LCBwYXJhbXMsIGFkZHIsCi0JCQkJCQkJIGJ5dGVfY250LCBvX2J1Zik7Ci0JZWxzZSBpZiAocGh5LT50eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcpCi0JCXJldHVybiBibngyeF84NzI3X3JlYWRfc2ZwX21vZHVsZV9lZXByb20ocGh5LCBwYXJhbXMsIGFkZHIsCi0JCQkJCQkJIGJ5dGVfY250LCBvX2J1Zik7Ci0JcmV0dXJuIC1FSU5WQUw7CisJaW50IHJjID0gLUVJTlZBTDsKKwlzd2l0Y2ggKHBoeS0+dHlwZSkgeworCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNjoKKwkJcmMgPSBibngyeF84NzI2X3JlYWRfc2ZwX21vZHVsZV9lZXByb20ocGh5LCBwYXJhbXMsIGFkZHIsCisJCQkJCQkgICAgICAgYnl0ZV9jbnQsIG9fYnVmKTsKKwlicmVhazsKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzIyOgorCQlyYyA9IGJueDJ4Xzg3MjdfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShwaHksIHBhcmFtcywgYWRkciwKKwkJCQkJCSAgICAgICBieXRlX2NudCwgb19idWYpOworCWJyZWFrOworCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUOgorCQlyYyA9IGJueDJ4X3dhcnBjb3JlX3JlYWRfc2ZwX21vZHVsZV9lZXByb20ocGh5LCBwYXJhbXMsIGFkZHIsCisJCQkJCQkJICAgYnl0ZV9jbnQsIG9fYnVmKTsKKwlicmVhazsKKwl9CisJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdTggYm54MnhfZ2V0X2VkY19tb2RlKHN0cnVjdCBibngyeF9waHkgKnBoeSwKLQkJCSAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkgICAgIHUxNiAqZWRjX21vZGUpCitzdGF0aWMgaW50IGJueDJ4X2dldF9lZGNfbW9kZShzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkgICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgIHUxNiAqZWRjX21vZGUpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTMyIHN5bmNfb2Zmc2V0ID0gMCwgcGh5X2lkeCwgbWVkaWFfdHlwZXM7CiAJdTggdmFsLCBjaGVja19saW1pdGluZ19tb2RlID0gMDsKIAkqZWRjX21vZGUgPSBFRENfTU9ERV9MSU1JVElORzsKIAorCXBoeS0+bWVkaWFfdHlwZSA9IEVUSF9QSFlfVU5TUEVDSUZJRUQ7CiAJLyogRmlyc3QgY2hlY2sgZm9yIGNvcHBlciBjYWJsZSAqLwogCWlmIChibngyeF9yZWFkX3NmcF9tb2R1bGVfZWVwcm9tKHBoeSwKIAkJCQkJIHBhcmFtcywKQEAgLTQ2ODgsNyArNzUzOCw3IEBACiAJY2FzZSBTRlBfRUVQUk9NX0NPTl9UWVBFX1ZBTF9DT1BQRVI6CiAJewogCQl1OCBjb3BwZXJfbW9kdWxlX3R5cGU7Ci0KKwkJcGh5LT5tZWRpYV90eXBlID0gRVRIX1BIWV9EQV9UV0lOQVg7CiAJCS8qCiAJCSAqIENoZWNrIGlmIGl0cyBhY3RpdmUgY2FibGUgKGluY2x1ZGVzIFNGUCsgbW9kdWxlKQogCQkgKiBvZiBwYXNzaXZlIGNhYmxlCkBAIC00Njk3LDggKzc1NDcsNyBAQAogCQkJCQkgICAgICAgcGFyYW1zLAogCQkJCQkgICAgICAgU0ZQX0VFUFJPTV9GQ19UWF9URUNIX0FERFIsCiAJCQkJCSAgICAgICAxLAotCQkJCQkgICAgICAgJmNvcHBlcl9tb2R1bGVfdHlwZSkgIT0KLQkJICAgIDApIHsKKwkJCQkJICAgICAgICZjb3BwZXJfbW9kdWxlX3R5cGUpICE9IDApIHsKIAkJCURQKE5FVElGX01TR19MSU5LLAogCQkJCSJGYWlsZWQgdG8gcmVhZCBjb3BwZXItY2FibGUtdHlwZSIKIAkJCQkiIGZyb20gU0ZQKyBFRVBST01cbiIpOwpAQCAtNDcyMyw2ICs3NTcyLDcgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgU0ZQX0VFUFJPTV9DT05fVFlQRV9WQUxfTEM6CisJCXBoeS0+bWVkaWFfdHlwZSA9IEVUSF9QSFlfU0ZQX0ZJQkVSOwogCQlEUChORVRJRl9NU0dfTElOSywgIk9wdGljIG1vZHVsZSBkZXRlY3RlZFxuIik7CiAJCWNoZWNrX2xpbWl0aW5nX21vZGUgPSAxOwogCQlicmVhazsKQEAgLTQ3MzEsNyArNzU4MSwyMiBAQAogCQkJIHZhbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQorCXN5bmNfb2Zmc2V0ID0gcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKKwkJCSBkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twYXJhbXMtPnBvcnRdLm1lZGlhX3R5cGUpOworCW1lZGlhX3R5cGVzID0gUkVHX1JEKGJwLCBzeW5jX29mZnNldCk7CisJLyogVXBkYXRlIG1lZGlhIHR5cGUgZm9yIG5vbi1QTUYgc3luYyAqLworCWZvciAocGh5X2lkeCA9IElOVF9QSFk7IHBoeV9pZHggPCBNQVhfUEhZUzsgcGh5X2lkeCsrKSB7CisJCWlmICgmKHBhcmFtcy0+cGh5W3BoeV9pZHhdKSA9PSBwaHkpIHsKKwkJCW1lZGlhX3R5cGVzICY9IH4oUE9SVF9IV19DRkdfTUVESUFfVFlQRV9QSFkwX01BU0sgPDwKKwkJCQkoUE9SVF9IV19DRkdfTUVESUFfVFlQRV9QSFkxX1NISUZUICogcGh5X2lkeCkpOworCQkJbWVkaWFfdHlwZXMgfD0gKChwaHktPm1lZGlhX3R5cGUgJgorCQkJCQlQT1JUX0hXX0NGR19NRURJQV9UWVBFX1BIWTBfTUFTSykgPDwKKwkJCQkoUE9SVF9IV19DRkdfTUVESUFfVFlQRV9QSFkxX1NISUZUICogcGh5X2lkeCkpOworCQkJYnJlYWs7CisJCX0KKwl9CisJUkVHX1dSKGJwLCBzeW5jX29mZnNldCwgbWVkaWFfdHlwZXMpOwogCWlmIChjaGVja19saW1pdGluZ19tb2RlKSB7CiAJCXU4IG9wdGlvbnNbU0ZQX0VFUFJPTV9PUFRJT05TX1NJWkVdOwogCQlpZiAoYm54MnhfcmVhZF9zZnBfbW9kdWxlX2VlcHJvbShwaHksCkBAIC00NzU1LDggKzc2MjAsOCBAQAogICogVGhpcyBmdW5jdGlvbiByZWFkIHRoZSByZWxldmFudCBmaWVsZCBmcm9tIHRoZSBtb2R1bGUgKFNGUCspLCBhbmQgdmVyaWZ5IGl0CiAgKiBpcyBjb21wbGlhbnQgd2l0aCB0aGlzIGJvYXJkCiAgKi8KLXN0YXRpYyB1OCBibngyeF92ZXJpZnlfc2ZwX21vZHVsZShzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkJICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3N0YXRpYyBpbnQgYm54MnhfdmVyaWZ5X3NmcF9tb2R1bGUoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXUzMiB2YWwsIGNtZDsKQEAgLTQ4MjUsOCArNzY5MCw4IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyB1OCBibngyeF93YWl0X2Zvcl9zZnBfbW9kdWxlX2luaXRpYWxpemVkKHN0cnVjdCBibngyeF9waHkgKnBoeSwKLQkJCQkJCXN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQorc3RhdGljIGludCBibngyeF93YWl0X2Zvcl9zZnBfbW9kdWxlX2luaXRpYWxpemVkKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkJCSBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKIAogewogCXU4IHZhbDsKQEAgLTQ4NTgsOCArNzcyMyw4IEBACiAJICogSW4gdGhlIEdQSU8gcmVnaXN0ZXIsIGJpdCA0IGlzIHVzZSB0byBkZXRlcm1pbmUgaWYgdGhlIEdQSU9zIGFyZQogCSAqIG9wZXJhdGluZyBhcyBJTlBVVCBvciBhcyBPVVRQVVQuIEJpdCAxIGlzIGZvciBpbnB1dCwgYW5kIDAgZm9yCiAJICogb3V0cHV0Ci0JICogQml0cyAwLTEgZGV0ZXJtaW5lIHRoZSBncGlvcyB2YWx1ZSBmb3IgT1VUUFVUIGluIGNhc2UgYml0IDQgdmFsIGlzIDAKLQkgKiBCaXRzIDgtOSBkZXRlcm1pbmUgdGhlIGdwaW9zIHZhbHVlIGZvciBJTlBVVCBpbiBjYXNlIGJpdCA0IHZhbCBpcyAxCisJICogQml0cyAwLTEgZGV0ZXJtaW5lIHRoZSBHUElPcyB2YWx1ZSBmb3IgT1VUUFVUIGluIGNhc2UgYml0IDQgdmFsIGlzIDAKKwkgKiBCaXRzIDgtOSBkZXRlcm1pbmUgdGhlIEdQSU9zIHZhbHVlIGZvciBJTlBVVCBpbiBjYXNlIGJpdCA0IHZhbCBpcyAxCiAJICogd2hlcmUgdGhlIDFzdCBiaXQgaXMgdGhlIG92ZXItY3VycmVudChvbmx5IGlucHV0KSwgYW5kIDJuZCBiaXQgaXMKIAkgKiBmb3IgcG93ZXIoIG9ubHkgb3V0cHV0ICkKIAkgKgpAQCAtNDg2OCwxNSArNzczMywxNCBAQAogCSAqLwogCWlmIChwaHktPmZsYWdzICYgRkxBR1NfTk9DKQogCQlyZXR1cm47Ci0JaWYgKCEocGh5LT5mbGFncyAmCi0JICAgICAgRkxBR1NfTk9DKSAmJiBpc19wb3dlcl91cCkKKwlpZiAoaXNfcG93ZXJfdXApCiAJCXZhbCA9ICgxPDw0KTsKIAllbHNlCiAJCS8qCiAJCSAqIFNldCBHUElPIGNvbnRyb2wgdG8gT1VUUFVULCBhbmQgc2V0IHRoZSBwb3dlciBiaXQKIAkJICogdG8gYWNjb3JkaW5nIHRvIHRoZSBpc19wb3dlcl91cAogCQkgKi8KLQkJdmFsID0gKCghKGlzX3Bvd2VyX3VwKSkgPDwgMSk7CisJCXZhbCA9ICgxPDwxKTsKIAogCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKIAkJCSBNRElPX1BNQV9ERVZBRCwKQEAgLTQ4ODQsOSArNzc0OCw5IEBACiAJCQkgdmFsKTsKIH0KIAotc3RhdGljIHU4IGJueDJ4Xzg3MjZfc2V0X2xpbWl0aW5nX21vZGUoc3RydWN0IGJueDJ4ICpicCwKLQkJCQkgICAgICAgc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJCSAgICAgICB1MTYgZWRjX21vZGUpCitzdGF0aWMgaW50IGJueDJ4Xzg3MjZfc2V0X2xpbWl0aW5nX21vZGUoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCQl1MTYgZWRjX21vZGUpCiB7CiAJdTE2IGN1cl9saW1pdGluZ19tb2RlOwogCkBAIC00OTM0LDkgKzc3OTgsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTggYm54MnhfODcyN19zZXRfbGltaXRpbmdfbW9kZShzdHJ1Y3QgYm54MnggKmJwLAotCQkJCSAgICAgICBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkJICAgICAgIHUxNiBlZGNfbW9kZSkKK3N0YXRpYyBpbnQgYm54MnhfODcyN19zZXRfbGltaXRpbmdfbW9kZShzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQlzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJCXUxNiBlZGNfbW9kZSkKIHsKIAl1MTYgcGh5X2lkZW50aWZpZXI7CiAJdTE2IHJvbV92ZXIyX3ZhbDsKQEAgLTQ5ODksNyArNzg1Myw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBibngyeF9zZXRfc2ZwX21vZHVsZV9mYXVsdF9sZWQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCitzdGF0aWMgdm9pZCBibngyeF9zZXRfZTFlMl9tb2R1bGVfZmF1bHRfbGVkKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAogCQkJCQkgICB1OCBncGlvX21vZGUpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CkBAIC01MDIxLDEyICs3ODg1LDE0NiBAQAogCX0KIH0KIAotc3RhdGljIHU4IGJueDJ4X3NmcF9tb2R1bGVfZGV0ZWN0aW9uKHN0cnVjdCBibngyeF9waHkgKnBoeSwKLQkJCQkgICAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQorc3RhdGljIHZvaWQgYm54Mnhfc2V0X2UzX21vZHVsZV9mYXVsdF9sZWQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJCSAgdTggZ3Bpb19tb2RlKQoreworCXUzMiBwaW5fY2ZnOworCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJcGluX2NmZyA9IChSRUdfUkQoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCisJCQkgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKKwkJCQkgIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLmUzX3NmcF9jdHJsKSkgJgorCQlQT1JUX0hXX0NGR19FM19GQVVMVF9NRExfTEVEX01BU0spID4+CisJCVBPUlRfSFdfQ0ZHX0UzX0ZBVUxUX01ETF9MRURfU0hJRlQ7CisJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIEZhdWx0IExFRCB0byAlZCB1c2luZyBwaW4gY2ZnICVkXG4iLAorCQkgICAgICAgZ3Bpb19tb2RlLCBwaW5fY2ZnKTsKKwlibngyeF9zZXRfY2ZnX3BpbihicCwgcGluX2NmZywgZ3Bpb19tb2RlKTsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfc2V0X3NmcF9tb2R1bGVfZmF1bHRfbGVkKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCQkgICB1OCBncGlvX21vZGUpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIFNGUCsgbW9kdWxlIGZhdWx0IExFRCB0byAlZFxuIiwgZ3Bpb19tb2RlKTsKKwlpZiAoQ0hJUF9JU19FMyhicCkpIHsKKwkJLyoKKwkJICogTG93ID09PiBpZiBTRlArIG1vZHVsZSBpcyBzdXBwb3J0ZWQgb3RoZXJ3aXNlCisJCSAqIEhpZ2ggPT0+IGlmIFNGUCsgbW9kdWxlIGlzIG5vdCBvbiB0aGUgYXBwcm92ZWQgdmVuZG9yIGxpc3QKKwkJICovCisJCWJueDJ4X3NldF9lM19tb2R1bGVfZmF1bHRfbGVkKHBhcmFtcywgZ3Bpb19tb2RlKTsKKwl9IGVsc2UKKwkJYm54Mnhfc2V0X2UxZTJfbW9kdWxlX2ZhdWx0X2xlZChwYXJhbXMsIGdwaW9fbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3dhcnBjb3JlX3Bvd2VyX21vZHVsZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkJc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCQl1OCBwb3dlcikKK3sKKwl1MzIgcGluX2NmZzsKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKworCXBpbl9jZmcgPSAoUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKworCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJZGV2X2luZm8ucG9ydF9od19jb25maWdbcGFyYW1zLT5wb3J0XS5lM19zZnBfY3RybCkpICYKKwkJCVBPUlRfSFdfQ0ZHX0UzX1BXUl9ESVNfTUFTSykgPj4KKwkJCVBPUlRfSFdfQ0ZHX0UzX1BXUl9ESVNfU0hJRlQ7CisKKwlpZiAocGluX2NmZyA9PSBQSU5fQ0ZHX05BKQorCQlyZXR1cm47CisJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIFNGUCsgbW9kdWxlIHBvd2VyIHRvICVkIHVzaW5nIHBpbiBjZmcgJWRcbiIsCisJCSAgICAgICBwb3dlciwgcGluX2NmZyk7CisJLyoKKwkgKiBMb3cgPT0+IGNvcnJlc3BvbmRpbmcgU0ZQKyBtb2R1bGUgaXMgcG93ZXJlZAorCSAqIGhpZ2ggPT0+IHRoZSBTRlArIG1vZHVsZSBpcyBwb3dlcmVkIGRvd24KKwkgKi8KKwlibngyeF9zZXRfY2ZnX3BpbihicCwgcGluX2NmZywgcG93ZXIgXiAxKTsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfd2FycGNvcmVfaHdfcmVzZXQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwlibngyeF93YXJwY29yZV9wb3dlcl9tb2R1bGUocGFyYW1zLCBwaHksIDApOworfQorCitzdGF0aWMgdm9pZCBibngyeF9wb3dlcl9zZnBfbW9kdWxlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgIHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgICB1OCBwb3dlcikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgU0ZQKyBwb3dlciB0byAleFxuIiwgcG93ZXIpOworCisJc3dpdGNoIChwaHktPnR5cGUpIHsKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3Mjc6CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzIyOgorCQlibngyeF84NzI3X3Bvd2VyX21vZHVsZShwYXJhbXMtPmJwLCBwaHksIHBvd2VyKTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6CisJCWJueDJ4X3dhcnBjb3JlX3Bvd2VyX21vZHVsZShwYXJhbXMsIHBoeSwgcG93ZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CitzdGF0aWMgdm9pZCBibngyeF93YXJwY29yZV9zZXRfbGltaXRpbmdfbW9kZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkJICAgICBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJCSAgICAgdTE2IGVkY19tb2RlKQoreworCXUxNiB2YWwgPSAwOworCXUxNiBtb2RlID0gTURJT19XQ19SRUdfVUNfSU5GT19CMV9GSVJNV0FSRV9NT0RFX0RFRkFVTFQ7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisKKwl1OCBsYW5lID0gYm54MnhfZ2V0X3dhcnBjb3JlX2xhbmUocGh5LCBwYXJhbXMpOworCS8qIFRoaXMgaXMgYSBnbG9iYWwgcmVnaXN0ZXIgd2hpY2ggY29udHJvbHMgYWxsIGxhbmVzICovCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCisJCQlNRElPX1dDX1JFR19VQ19JTkZPX0IxX0ZJUk1XQVJFX01PREUsICZ2YWwpOworCXZhbCAmPSB+KDB4ZiA8PCAobGFuZSA8PCAyKSk7CisKKwlzd2l0Y2ggKGVkY19tb2RlKSB7CisJY2FzZSBFRENfTU9ERV9MSU5FQVI6CisJY2FzZSBFRENfTU9ERV9MSU1JVElORzoKKwkJbW9kZSA9IE1ESU9fV0NfUkVHX1VDX0lORk9fQjFfRklSTVdBUkVfTU9ERV9ERUZBVUxUOworCQlicmVhazsKKwljYXNlIEVEQ19NT0RFX1BBU1NJVkVfREFDOgorCQltb2RlID0gTURJT19XQ19SRUdfVUNfSU5GT19CMV9GSVJNV0FSRV9NT0RFX1NGUF9EQUM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXZhbCB8PSAobW9kZSA8PCAobGFuZSA8PCAyKSk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJIE1ESU9fV0NfUkVHX1VDX0lORk9fQjFfRklSTVdBUkVfTU9ERSwgdmFsKTsKKwkvKiBBIG11c3QgcmVhZCAqLworCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAorCQkJTURJT19XQ19SRUdfVUNfSU5GT19CMV9GSVJNV0FSRV9NT0RFLCAmdmFsKTsKKworCit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9saW1pdGluZ19tb2RlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgICBzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJICAgIHUxNiBlZGNfbW9kZSkKK3sKKwlzd2l0Y2ggKHBoeS0+dHlwZSkgeworCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNjoKKwkJYm54MnhfODcyNl9zZXRfbGltaXRpbmdfbW9kZShwYXJhbXMtPmJwLCBwaHksIGVkY19tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OgorCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyMjoKKwkJYm54MnhfODcyN19zZXRfbGltaXRpbmdfbW9kZShwYXJhbXMtPmJwLCBwaHksIGVkY19tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6CisJCWJueDJ4X3dhcnBjb3JlX3NldF9saW1pdGluZ19tb2RlKHBhcmFtcywgcGh5LCBlZGNfbW9kZSk7CisJCWJyZWFrOworCX0KK30KKworaW50IGJueDJ4X3NmcF9tb2R1bGVfZGV0ZWN0aW9uKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCSAgICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAl1MTYgZWRjX21vZGU7Ci0JdTggcmMgPSAwOworCWludCByYyA9IDA7CiAKIAl1MzIgdmFsID0gUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKwogCQkJICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLCBkZXZfaW5mby4KQEAgLTUwMzQsNyArODAzMiw4IEBACiAKIAlEUChORVRJRl9NU0dfTElOSywgIlNGUCsgbW9kdWxlIHBsdWdnZWQgaW4vb3V0IGRldGVjdGVkIG9uIHBvcnQgJWRcbiIsCiAJCSBwYXJhbXMtPnBvcnQpOwotCisJLyogUG93ZXIgdXAgbW9kdWxlICovCisJYm54MnhfcG93ZXJfc2ZwX21vZHVsZShwYXJhbXMsIHBoeSwgMSk7CiAJaWYgKGJueDJ4X2dldF9lZGNfbW9kZShwaHksIHBhcmFtcywgJmVkY19tb2RlKSAhPSAwKSB7CiAJCURQKE5FVElGX01TR19MSU5LLCAiRmFpbGVkIHRvIGdldCB2YWxpZCBtb2R1bGUgdHlwZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTA0NiwxMiArODA0NSwxMSBAQAogCQlibngyeF9zZXRfc2ZwX21vZHVsZV9mYXVsdF9sZWQocGFyYW1zLAogCQkJCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19ISUdIKTsKIAotCQlpZiAoKHBoeS0+dHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3KSAmJgotCQkgICAgKCh2YWwgJiBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfTUFTSykgPT0KLQkJICAgICBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfUE9XRVJfRE9XTikpIHsKLQkJCS8qIFNodXRkb3duIFNGUCsgbW9kdWxlICovCisJCS8qIENoZWNrIGlmIG5lZWQgdG8gcG93ZXIgZG93biB0aGUgU0ZQKyBtb2R1bGUgKi8KKwkJaWYgKCh2YWwgJiBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfTUFTSykgPT0KKwkJICAgICBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfUE9XRVJfRE9XTikgewogCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTaHV0ZG93biBTRlArIG1vZHVsZSEhXG4iKTsKLQkJCWJueDJ4Xzg3MjdfcG93ZXJfbW9kdWxlKGJwLCBwaHksIDApOworCQkJYm54MnhfcG93ZXJfc2ZwX21vZHVsZShwYXJhbXMsIHBoeSwgMCk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAl9IGVsc2UgewpAQCAtNTA1OSwxOCArODA1NywxMiBAQAogCQlibngyeF9zZXRfc2ZwX21vZHVsZV9mYXVsdF9sZWQocGFyYW1zLCBNSVNDX1JFR0lTVEVSU19HUElPX0xPVyk7CiAJfQogCi0JLyogcG93ZXIgdXAgdGhlIFNGUCBtb2R1bGUgKi8KLQlpZiAocGh5LT50eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjcpCi0JCWJueDJ4Xzg3MjdfcG93ZXJfbW9kdWxlKGJwLCBwaHksIDEpOwotCiAJLyoKIAkgKiBDaGVjayBhbmQgc2V0IGxpbWl0aW5nIG1vZGUgLyBMUk0gbW9kZSBvbiA4NzI2LiBPbiA4NzI3IGl0CiAJICogaXMgZG9uZSBhdXRvbWF0aWNhbGx5CiAJICovCi0JaWYgKHBoeS0+dHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2KQotCQlibngyeF84NzI2X3NldF9saW1pdGluZ19tb2RlKGJwLCBwaHksIGVkY19tb2RlKTsKLQllbHNlCi0JCWJueDJ4Xzg3Mjdfc2V0X2xpbWl0aW5nX21vZGUoYnAsIHBoeSwgZWRjX21vZGUpOworCWJueDJ4X3NldF9saW1pdGluZ19tb2RlKHBhcmFtcywgcGh5LCBlZGNfbW9kZSk7CisKIAkvKgogCSAqIEVuYWJsZSB0cmFuc21pdCBmb3IgdGhpcyBtb2R1bGUgaWYgdGhlIG1vZHVsZSBpcyBhcHByb3ZlZCwgb3IKIAkgKiBpZiB1bmFwcHJvdmVkIG1vZHVsZXMgc2hvdWxkIGFsc28gZW5hYmxlIHRoZSBUeCBsYXNlcgpAQCAtNTA4OCwyMyArODA4MCwzMyBAQAogdm9pZCBibngyeF9oYW5kbGVfbW9kdWxlX2RldGVjdF9pbnQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0Jc3RydWN0IGJueDJ4X3BoeSAqcGh5ID0gJnBhcmFtcy0+cGh5W0VYVF9QSFkxXTsKKwlzdHJ1Y3QgYm54MnhfcGh5ICpwaHk7CiAJdTMyIGdwaW9fdmFsOwotCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CisJdTggZ3Bpb19udW0sIGdwaW9fcG9ydDsKKwlpZiAoQ0hJUF9JU19FMyhicCkpCisJCXBoeSA9ICZwYXJhbXMtPnBoeVtJTlRfUEhZXTsKKwllbHNlCisJCXBoeSA9ICZwYXJhbXMtPnBoeVtFWFRfUEhZMV07CisKKwlpZiAoYm54MnhfZ2V0X21vZF9hYnNfaW50X2NmZyhicCwgcGFyYW1zLT5jaGlwX2lkLCBwYXJhbXMtPnNobWVtX2Jhc2UsCisJCQkJICAgICAgcGFyYW1zLT5wb3J0LCAmZ3Bpb19udW0sICZncGlvX3BvcnQpID09CisJICAgIC1FSU5WQUwpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJGYWlsZWQgdG8gZ2V0IE1PRF9BQlMgaW50ZXJydXB0IGNvbmZpZ1xuIik7CisJCXJldHVybjsKKwl9CiAKIAkvKiBTZXQgdmFsaWQgbW9kdWxlIGxlZCBvZmYgKi8KIAlibngyeF9zZXRfc2ZwX21vZHVsZV9mYXVsdF9sZWQocGFyYW1zLCBNSVNDX1JFR0lTVEVSU19HUElPX0hJR0gpOwogCiAJLyogR2V0IGN1cnJlbnQgZ3BpbyB2YWwgcmVmbGVjdGluZyBtb2R1bGUgcGx1Z2dlZCBpbiAvIG91dCovCi0JZ3Bpb192YWwgPSBibngyeF9nZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18zLCBwb3J0KTsKKwlncGlvX3ZhbCA9IGJueDJ4X2dldF9ncGlvKGJwLCBncGlvX251bSwgZ3Bpb19wb3J0KTsKIAogCS8qIENhbGwgdGhlIGhhbmRsaW5nIGZ1bmN0aW9uIGluIGNhc2UgbW9kdWxlIGlzIGRldGVjdGVkICovCiAJaWYgKGdwaW9fdmFsID09IDApIHsKLQotCQlibngyeF9zZXRfZ3Bpb19pbnQoYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMywKKwkJYm54MnhfcG93ZXJfc2ZwX21vZHVsZShwYXJhbXMsIHBoeSwgMSk7CisJCWJueDJ4X3NldF9ncGlvX2ludChicCwgZ3Bpb19udW0sCiAJCQkJICAgTUlTQ19SRUdJU1RFUlNfR1BJT19JTlRfT1VUUFVUX0NMUiwKLQkJCQkgICBwb3J0KTsKLQorCQkJCSAgIGdwaW9fcG9ydCk7CiAJCWlmIChibngyeF93YWl0X2Zvcl9zZnBfbW9kdWxlX2luaXRpYWxpemVkKHBoeSwgcGFyYW1zKSA9PSAwKQogCQkJYm54Mnhfc2ZwX21vZHVsZV9kZXRlY3Rpb24ocGh5LCBwYXJhbXMpOwogCQllbHNlCkBAIC01MTE1LDEzICs4MTE3LDE0IEBACiAJCQkJCSAgcG9ydF9mZWF0dXJlX2NvbmZpZ1twYXJhbXMtPnBvcnRdLgogCQkJCQkgIGNvbmZpZykpOwogCi0JCWJueDJ4X3NldF9ncGlvX2ludChicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18zLAorCQlibngyeF9zZXRfZ3Bpb19pbnQoYnAsIGdwaW9fbnVtLAogCQkJCSAgIE1JU0NfUkVHSVNURVJTX0dQSU9fSU5UX09VVFBVVF9TRVQsCi0JCQkJICAgcG9ydCk7CisJCQkJICAgZ3Bpb19wb3J0KTsKIAkJLyoKIAkJICogTW9kdWxlIHdhcyBwbHVnZ2VkIG91dC4KIAkJICogRGlzYWJsZSB0cmFuc21pdCBmb3IgdGhpcyBtb2R1bGUKIAkJICovCisJCXBoeS0+bWVkaWFfdHlwZSA9IEVUSF9QSFlfTk9UX1BSRVNFTlQ7CiAJCWlmICgodmFsICYgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX01BU0spID09CiAJCSAgICBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfRElTQUJMRV9UWF9MQVNFUikKIAkJCWJueDJ4X3NmcF9zZXRfdHJhbnNtaXR0ZXIocGFyYW1zLCBwaHksIDApOwpAQCAtNTEyOSw2ICs4MTMyLDI5IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJVXNlZCBieSA4NzA2IGFuZCA4NzI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJueDJ4X3NmcF9tYXNrX2ZhdWx0KHN0cnVjdCBibngyeCAqYnAsCisJCQkJIHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgdTE2IGFsYXJtX3N0YXR1c19vZmZzZXQsCisJCQkJIHUxNiBhbGFybV9jdHJsX29mZnNldCkKK3sKKwl1MTYgYWxhcm1fc3RhdHVzLCB2YWw7CisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCisJCQlNRElPX1BNQV9ERVZBRCwgYWxhcm1fc3RhdHVzX29mZnNldCwKKwkJCSZhbGFybV9zdGF0dXMpOworCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAorCQkJTURJT19QTUFfREVWQUQsIGFsYXJtX3N0YXR1c19vZmZzZXQsCisJCQkmYWxhcm1fc3RhdHVzKTsKKwkvKiBNYXNrIG9yIGVuYWJsZSB0aGUgZmF1bHQgZXZlbnQuICovCisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCBhbGFybV9jdHJsX29mZnNldCwgJnZhbCk7CisJaWYgKGFsYXJtX3N0YXR1cyAmICgxPDwwKSkKKwkJdmFsICY9IH4oMTw8MCk7CisJZWxzZQorCQl2YWwgfD0gKDE8PDApOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsIGFsYXJtX2N0cmxfb2Zmc2V0LCB2YWwpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCQljb21tb24gQkNNODcwNi9CQ004NzI2IFBIWSBTRUNUSU9OCQkgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHU4IGJueDJ4Xzg3MDZfODcyNl9yZWFkX3N0YXR1cyhzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCkBAIC01MTQxLDEyICs4MTY3LDE2IEBACiAJRFAoTkVUSUZfTVNHX0xJTkssICJYR1hTIDg3MDYvODcyNlxuIik7CiAJLyogQ2xlYXIgUlggQWxhcm0qLwogCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAotCQkJTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19SWF9BTEFSTSwgJnZhbDIpOworCQkJTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX0xBU0lfUlhTVEFULCAmdmFsMik7CisKKwlibngyeF9zZnBfbWFza19mYXVsdChicCwgcGh5LCBNRElPX1BNQV9MQVNJX1RYU1RBVCwKKwkJCSAgICAgTURJT19QTUFfTEFTSV9UWENUUkwpOworCiAJLyogY2xlYXIgTEFTSSBpbmRpY2F0aW9uKi8KIAlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKLQkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfTEFTSV9TVEFUVVMsICZ2YWwxKTsKKwkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX1NUQVQsICZ2YWwxKTsKIAlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKLQkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfTEFTSV9TVEFUVVMsICZ2YWwyKTsKKwkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX1NUQVQsICZ2YWwyKTsKIAlEUChORVRJRl9NU0dfTElOSywgIjg3MDYvODcyNiBMQVNJIHN0YXR1cyAweCV4LS0+IDB4JXhcbiIsIHZhbDEsIHZhbDIpOwogCiAJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCkBAIC01MTczLDYgKzgyMDMsMTcgQEAKIAkJYm54MnhfZXh0X3BoeV9yZXNvbHZlX2ZjKHBoeSwgcGFyYW1zLCB2YXJzKTsKIAkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CiAJfQorCisJLyogQ2FwdHVyZSAxMEcgbGluayBmYXVsdC4gUmVhZCB0d2ljZSB0byBjbGVhciBzdGFsZSB2YWx1ZS4gKi8KKwlpZiAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwMCkgeworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsCisJCQkgICAgTURJT19QTUFfTEFTSV9UWFNUQVQsICZ2YWwxKTsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELAorCQkJICAgIE1ESU9fUE1BX0xBU0lfVFhTVEFULCAmdmFsMSk7CisJCWlmICh2YWwxICYgKDE8PDApKQorCQkJdmFycy0+ZmF1bHRfZGV0ZWN0ZWQgPSAxOworCX0KKwogCXJldHVybiBsaW5rX3VwOwogfQogCkBAIC01MTg2LDYgKzgyMjcsMTAgQEAKIAl1MzIgdHhfZW5fbW9kZTsKIAl1MTYgY250LCB2YWwsIHRtcDE7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisKKwkvKiBTUEYrIFBIWTogU2V0IGZsYWcgdG8gY2hlY2sgZm9yIFR4IGVycm9yICovCisJdmFycy0+cGh5X2ZsYWdzID0gUEhZX1RYX0VSUk9SX0NIRUNLX0ZMQUc7CisKIAlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18yLAogCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfSElHSCwgcGFyYW1zLT5wb3J0KTsKIAkvKiBIVyByZXNldCAqLwpAQCAtNTIyOCw3ICs4MjczLDExIEBACiAJCQkJIE1ESU9fUE1BX0RFVkFELAogCQkJCSBNRElPX1BNQV9SRUdfRElHSVRBTF9DVFJMLCAweDQwMCk7CiAJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKLQkJCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19MQVNJX0NUUkwsIDEpOworCQkJCSBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfTEFTSV9UWENUUkwsCisJCQkJIDApOworCQkvKiBBcm0gTEFTSSBmb3IgbGluayBhbmQgVHggZmF1bHQuICovCisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKKwkJCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX0xBU0lfQ1RSTCwgMyk7CiAJfSBlbHNlIHsKIAkJLyogRm9yY2UgMUdicHMgdXNpbmcgYXV0b25lZyB3aXRoIDFHIGFkdmVydGlzZW1lbnQgKi8KIApAQCAtNTI1MSwxMCArODMwMCwxMCBAQAogCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCiAJCQkJIE1ESU9fQU5fREVWQUQsIE1ESU9fQU5fUkVHX0NUUkwsIDB4MTIwMCk7CiAJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKLQkJCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19SWF9BTEFSTV9DVFJMLAorCQkJCSBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfTEFTSV9SWENUUkwsCiAJCQkJIDB4MDQwMCk7CiAJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKLQkJCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19MQVNJX0NUUkwsCisJCQkJIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX0NUUkwsCiAJCQkJIDB4MDAwNCk7CiAJfQogCWJueDJ4X3NhdmVfYmNtX3NwaXJvbV92ZXIoYnAsIHBoeSwgcGFyYW1zLT5wb3J0KTsKQEAgLTUyODEsOSArODMzMCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1OCBibngyeF84NzA2X3JlYWRfc3RhdHVzKHN0cnVjdCBibngyeF9waHkgKnBoeSwKLQkJCQkgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCitzdGF0aWMgaW50IGJueDJ4Xzg3MDZfcmVhZF9zdGF0dXMoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQogewogCXJldHVybiBibngyeF84NzA2Xzg3MjZfcmVhZF9zdGF0dXMocGh5LCBwYXJhbXMsIHZhcnMpOwogfQpAQCAtNTM1OCwxNSArODQwNywxNiBAQAogfQogCiAKLXN0YXRpYyB1OCBibngyeF84NzI2X2NvbmZpZ19pbml0KHN0cnVjdCBibngyeF9waHkgKnBoeSwKLQkJCQkgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCitzdGF0aWMgaW50IGJueDJ4Xzg3MjZfY29uZmlnX2luaXQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCXUzMiB2YWw7Ci0JdTMyIHN3YXBfdmFsLCBzd2FwX292ZXJyaWRlLCBhZXVfZ3Bpb19tYXNrLCBvZmZzZXQ7CiAJRFAoTkVUSUZfTVNHX0xJTkssICJJbml0aWFsaXppbmcgQkNNODcyNlxuIik7CiAKKwkvKiBTUEYrIFBIWTogU2V0IGZsYWcgdG8gY2hlY2sgZm9yIFR4IGVycm9yICovCisJdmFycy0+cGh5X2ZsYWdzID0gUEhZX1RYX0VSUk9SX0NIRUNLX0ZMQUc7CisKIAlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfQ1RSTCwgMTw8MTUpOwogCWJueDJ4X3dhaXRfcmVzZXRfY29tcGxldGUoYnAsIHBoeSwgcGFyYW1zKTsKIApAQCAtNTM4Nyw5ICs4NDM3LDkgQEAKIAkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAogCQkJCSBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfUkVHXzEwR19DVFJMMiwgMHhEKTsKIAkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAotCQkJCSBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfUkVHX0xBU0lfQ1RSTCwgMHg1KTsKKwkJCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX0xBU0lfQ1RSTCwgMHg1KTsKIAkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAotCQkJCSBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfUkVHX1JYX0FMQVJNX0NUUkwsCisJCQkJIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX1JYQ1RSTCwKIAkJCQkgMHg0MDApOwogCX0gZWxzZSBpZiAoKHBoeS0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfQVVUT19ORUcpICYmCiAJCSAgIChwaHktPnNwZWVkX2NhcF9tYXNrICYKQEAgLTU0MTUsMTQgKzg0NjUsMTQgQEAKIAkJICogY2hhbmdlCiAJCSAqLwogCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCi0JCQkJIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLCAweDQpOworCQkJCSBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfTEFTSV9DVFJMLCAweDQpOwogCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCi0JCQkJIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfUlhfQUxBUk1fQ1RSTCwKKwkJCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX0xBU0lfUlhDVFJMLAogCQkJCSAweDQwMCk7CiAKIAl9IGVsc2UgeyAvKiBEZWZhdWx0IDEwRy4gU2V0IG9ubHkgTEFTSSBjb250cm9sICovCiAJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKLQkJCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19MQVNJX0NUUkwsIDEpOworCQkJCSBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfTEFTSV9DVFJMLCAxKTsKIAl9CiAKIAkvKiBTZXQgVFggUHJlRW1waGFzaXMgaWYgbmVlZGVkICovCkBAIC01NDQzLDMwICs4NDkzLDYgQEAKIAkJCQkgcGh5LT50eF9wcmVlbXBoYXNpc1sxXSk7CiAJfQogCi0JLyogU2V0IEdQSU8zIHRvIHRyaWdnZXIgU0ZQKyBtb2R1bGUgaW5zZXJ0aW9uL3JlbW92YWwgKi8KLQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18zLAotCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19JTlBVVF9ISV9aLCBwYXJhbXMtPnBvcnQpOwotCi0JLyogVGhlIEdQSU8gc2hvdWxkIGJlIHN3YXBwZWQgaWYgdGhlIHN3YXAgcmVnaXN0ZXIgaXMgc2V0IGFuZCBhY3RpdmUgKi8KLQlzd2FwX3ZhbCA9IFJFR19SRChicCwgTklHX1JFR19QT1JUX1NXQVApOwotCXN3YXBfb3ZlcnJpZGUgPSBSRUdfUkQoYnAsIE5JR19SRUdfU1RSQVBfT1ZFUlJJREUpOwotCi0JLyogU2VsZWN0IGZ1bmN0aW9uIHVwb24gcG9ydC1zd2FwIGNvbmZpZ3VyYXRpb24gKi8KLQlpZiAocGFyYW1zLT5wb3J0ID09IDApIHsKLQkJb2Zmc2V0ID0gTUlTQ19SRUdfQUVVX0VOQUJMRTFfRlVOQ18wX09VVF8wOwotCQlhZXVfZ3Bpb19tYXNrID0gKHN3YXBfdmFsICYmIHN3YXBfb3ZlcnJpZGUpID8KLQkJCUFFVV9JTlBVVFNfQVRUTl9CSVRTX0dQSU8zX0ZVTkNUSU9OXzEgOgotCQkJQUVVX0lOUFVUU19BVFROX0JJVFNfR1BJTzNfRlVOQ1RJT05fMDsKLQl9IGVsc2UgewotCQlvZmZzZXQgPSBNSVNDX1JFR19BRVVfRU5BQkxFMV9GVU5DXzFfT1VUXzA7Ci0JCWFldV9ncGlvX21hc2sgPSAoc3dhcF92YWwgJiYgc3dhcF9vdmVycmlkZSkgPwotCQkJQUVVX0lOUFVUU19BVFROX0JJVFNfR1BJTzNfRlVOQ1RJT05fMCA6Ci0JCQlBRVVfSU5QVVRTX0FUVE5fQklUU19HUElPM19GVU5DVElPTl8xOwotCX0KLQl2YWwgPSBSRUdfUkQoYnAsIG9mZnNldCk7Ci0JLyogYWRkIEdQSU8zIHRvIGdyb3VwICovCi0JdmFsIHw9IGFldV9ncGlvX21hc2s7Ci0JUkVHX1dSKGJwLCBvZmZzZXQsIHZhbCk7CiAJcmV0dXJuIDA7CiAKIH0KQEAgLTU1NDgsOSArODU3NCw5IEBACiAJCSAgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9MT1csIHBvcnQpOwogfQogCi1zdGF0aWMgdTggYm54MnhfODcyN19jb25maWdfaW5pdChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkJIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCSBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQorc3RhdGljIGludCBibngyeF84NzI3X2NvbmZpZ19pbml0KHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKIHsKIAl1MzIgdHhfZW5fbW9kZTsKIAl1MTYgdG1wMSwgdmFsLCBtb2RfYWJzLCB0bXAyOwpAQCAtNTU1OSwxOCArODU4NSwyNCBAQAogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCS8qIEVuYWJsZSBQTUQgbGluaywgTU9EX0FCU19GTFQsIGFuZCAxRyBsaW5rIGFsYXJtICovCiAKKwkvKiBTUEYrIFBIWTogU2V0IGZsYWcgdG8gY2hlY2sgZm9yIFR4IGVycm9yICovCisJdmFycy0+cGh5X2ZsYWdzID0gUEhZX1RYX0VSUk9SX0NIRUNLX0ZMQUc7CisKIAlibngyeF93YWl0X3Jlc2V0X2NvbXBsZXRlKGJwLCBwaHksIHBhcmFtcyk7CiAJcnhfYWxhcm1fY3RybF92YWwgPSAoMTw8MikgfCAoMTw8NSkgOwotCWxhc2lfY3RybF92YWwgPSAweDAwMDQ7CisJLyogU2hvdWxkIGJlIDB4NiB0byBlbmFibGUgWFMgb24gVHggc2lkZS4gKi8KKwlsYXNpX2N0cmxfdmFsID0gMHgwMDA2OwogCiAJRFAoTkVUSUZfTVNHX0xJTkssICJJbml0aWFsaXppbmcgQkNNODcyN1xuIik7CiAJLyogZW5hYmxlIExBU0kgKi8KIAlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCi0JCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19SWF9BTEFSTV9DVFJMLAorCQkJIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX1JYQ1RSTCwKIAkJCSByeF9hbGFybV9jdHJsX3ZhbCk7Ci0KIAlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCi0JCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19MQVNJX0NUUkwsIGxhc2lfY3RybF92YWwpOworCQkJIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX1RYQ1RSTCwKKwkJCSAwKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCisJCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX0xBU0lfQ1RSTCwgbGFzaV9jdHJsX3ZhbCk7CiAKIAkvKgogCSAqIEluaXRpYWxseSBjb25maWd1cmUgTU9EX0FCUyB0byBpbnRlcnJ1cHQgd2hlbiBtb2R1bGUgaXMKQEAgLTU1OTAsNiArODYyMiw5IEBACiAJCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19QSFlfSURFTlRJRklFUiwgbW9kX2Ficyk7CiAKIAorCS8qIEVuYWJsZS9EaXNhYmxlIFBIWSB0cmFuc21pdHRlciBvdXRwdXQgKi8KKwlibngyeF9zZXRfZGlzYWJsZV9wbWRfdHJhbnNtaXQocGFyYW1zLCBwaHksIDApOworCiAJLyogTWFrZSBNT0RfQUJTIGdpdmUgaW50ZXJydXB0IG9uIGNoYW5nZSAqLwogCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfUkVHXzg3MjdfUENTX09QVF9DVFJMLAogCQkJJnZhbCk7CkBAIC01NjEyLDcgKzg2NDcsNyBAQAogCQkJTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19NODA1MV9NU0dPVVRfUkVHLCAmdG1wMSk7CiAKIAlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKLQkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfUlhfQUxBUk0sICZ0bXAxKTsKKwkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX1JYU1RBVCwgJnRtcDEpOwogCiAJLyogU2V0IG9wdGlvbiAxRyBzcGVlZCAqLwogCWlmIChwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEXzEwMDApIHsKQEAgLTU3MzAsNyArODc2NSw3IEBACiAJCS8qIE1vZHVsZSBpcyBhYnNlbnQgKi8KIAkJRFAoTkVUSUZfTVNHX0xJTkssICJNT0RfQUJTIGluZGljYXRpb24gIgogCQkJICAgICJzaG93IG1vZHVsZSBpcyBhYnNlbnRcbiIpOwotCisJCXBoeS0+bWVkaWFfdHlwZSA9IEVUSF9QSFlfTk9UX1BSRVNFTlQ7CiAJCS8qCiAJCSAqIDEuIFNldCBtb2RfYWJzIHRvIGRldGVjdCBuZXh0IG1vZHVsZQogCQkgKiAgICBwcmVzZW5jZSBldmVudApAQCAtNTc1Miw3ICs4Nzg3LDcgQEAKIAkJICovCiAJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAogCQkJCU1ESU9fUE1BX0RFVkFELAotCQkJCU1ESU9fUE1BX1JFR19SWF9BTEFSTSwgJnJ4X2FsYXJtX3N0YXR1cyk7CisJCQkJTURJT19QTUFfTEFTSV9SWFNUQVQsICZyeF9hbGFybV9zdGF0dXMpOwogCiAJfSBlbHNlIHsKIAkJLyogTW9kdWxlIGlzIHByZXNlbnQgKi8KQEAgLTU3ODEsNyArODgxNiw3IEBACiAJCSAqLwogCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKIAkJCQlNRElPX1BNQV9ERVZBRCwKLQkJCQlNRElPX1BNQV9SRUdfUlhfQUxBUk0sICZyeF9hbGFybV9zdGF0dXMpOworCQkJCU1ESU9fUE1BX0xBU0lfUlhTVEFULCAmcnhfYWxhcm1fc3RhdHVzKTsKIAogCiAJCWlmICgodmFsICYgUE9SVF9GRUFUX0NGR19PUFRfTURMX0VORlJDTU5UX01BU0spID09CkBAIC01ODA1LDI2ICs4ODQwLDI5IEBACiAKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1OCBsaW5rX3VwID0gMDsKKwl1OCBsaW5rX3VwID0gMCwgb2NfcG9ydCA9IHBhcmFtcy0+cG9ydDsKIAl1MTYgbGlua19zdGF0dXMgPSAwOwogCXUxNiByeF9hbGFybV9zdGF0dXMsIGxhc2lfY3RybCwgdmFsMTsKIAogCS8qIElmIFBIWSBpcyBub3QgaW5pdGlhbGl6ZWQsIGRvIG5vdCBjaGVjayBsaW5rIHN0YXR1cyAqLwogCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAotCQkJTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19MQVNJX0NUUkwsCisJCQlNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfTEFTSV9DVFJMLAogCQkJJmxhc2lfY3RybCk7CiAJaWYgKCFsYXNpX2N0cmwpCiAJCXJldHVybiAwOwogCi0JLyogQ2hlY2sgdGhlIExBU0kgKi8KKwkvKiBDaGVjayB0aGUgTEFTSSBvbiBSeCAqLwogCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAotCQkJTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19SWF9BTEFSTSwKKwkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX1JYU1RBVCwKIAkJCSZyeF9hbGFybV9zdGF0dXMpOwogCXZhcnMtPmxpbmVfc3BlZWQgPSAwOwogCURQKE5FVElGX01TR19MSU5LLCAiODcyNyBSWF9BTEFSTV9TVEFUVVMgIDB4JXhcbiIsIHJ4X2FsYXJtX3N0YXR1cyk7CiAKKwlibngyeF9zZnBfbWFza19mYXVsdChicCwgcGh5LCBNRElPX1BNQV9MQVNJX1RYU1RBVCwKKwkJCSAgICAgTURJT19QTUFfTEFTSV9UWENUUkwpOworCiAJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCi0JCQlNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfUkVHX0xBU0lfU1RBVFVTLCAmdmFsMSk7CisJCQlNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfTEFTSV9TVEFULCAmdmFsMSk7CiAKIAlEUChORVRJRl9NU0dfTElOSywgIjg3MjcgTEFTSSBzdGF0dXMgMHgleFxuIiwgdmFsMSk7CiAKQEAgLTU4NDMsOCArODg4MSwxMCBAQAogCQkJCSZ2YWwxKTsKIAogCQlpZiAoKHZhbDEgJiAoMTw8OCkpID09IDApIHsKKwkJCWlmICghQ0hJUF9JU19FMXgoYnApKQorCQkJCW9jX3BvcnQgPSBCUF9QQVRIKGJwKSArIChwYXJhbXMtPnBvcnQgPDwgMSk7CiAJCQlEUChORVRJRl9NU0dfTElOSywgIjg3MjcgUG93ZXIgZmF1bHQgaGFzIGJlZW4gZGV0ZWN0ZWQiCi0JCQkJICAgICAgICIgb24gcG9ydCAlZFxuIiwgcGFyYW1zLT5wb3J0KTsKKwkJCQkgICAgICAgIiBvbiBwb3J0ICVkXG4iLCBvY19wb3J0KTsKIAkJCW5ldGRldl9lcnIoYnAtPmRldiwgIkVycm9yOiAgUG93ZXIgZmF1bHQgb24gUG9ydCAlZCBoYXMiCiAJCQkJCSAgICAiIGJlZW4gZGV0ZWN0ZWQgYW5kIHRoZSBwb3dlciB0byAiCiAJCQkJCSAgICAidGhhdCBTRlArIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIgpAQCAtNTg1MiwxMSArODg5MiwxMSBAQAogCQkJCQkgICAgIiBQbGVhc2UgcmVtb3ZlIHRoZSBTRlArIG1vZHVsZSBhbmQiCiAJCQkJCSAgICAiIHJlc3RhcnQgdGhlIHN5c3RlbSB0byBjbGVhciB0aGlzIgogCQkJCQkgICAgIiBlcnJvci5cbiIsCi0JCQkgcGFyYW1zLT5wb3J0KTsKKwkJCSBvY19wb3J0KTsKIAkJCS8qIERpc2FibGUgYWxsIFJYX0FMQVJNcyBleGNlcHQgZm9yIG1vZF9hYnMgKi8KIAkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKIAkJCQkJIE1ESU9fUE1BX0RFVkFELAotCQkJCQkgTURJT19QTUFfUkVHX1JYX0FMQVJNX0NUUkwsICgxPDw1KSk7CisJCQkJCSBNRElPX1BNQV9MQVNJX1JYQ1RSTCwgKDE8PDUpKTsKIAogCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCiAJCQkJCU1ESU9fUE1BX0RFVkFELApAQCAtNTg2OSw3ICs4OTA5LDcgQEAKIAkJCS8qIENsZWFyIFJYIGFsYXJtICovCiAJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKIAkJCQlNRElPX1BNQV9ERVZBRCwKLQkJCQlNRElPX1BNQV9SRUdfUlhfQUxBUk0sICZyeF9hbGFybV9zdGF0dXMpOworCQkJCU1ESU9fUE1BX0xBU0lfUlhTVEFULCAmcnhfYWxhcm1fc3RhdHVzKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfSAvKiBPdmVyIGN1cnJlbnQgY2hlY2sgKi8KQEAgLTU4NzksNyArODkxOSw3IEBACiAJCWJueDJ4Xzg3MjdfaGFuZGxlX21vZF9hYnMocGh5LCBwYXJhbXMpOwogCQkvKiBFbmFibGUgYWxsIG1vZF9hYnMgYW5kIGxpbmsgZGV0ZWN0aW9uIGJpdHMgKi8KIAkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAotCQkJCSBNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfUkVHX1JYX0FMQVJNX0NUUkwsCisJCQkJIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX1JYQ1RSTCwKIAkJCQkgKCgxPDw1KSB8ICgxPDwyKSkpOwogCX0KIAlEUChORVRJRl9NU0dfTElOSywgIkVuYWJsaW5nIDg3MjcgVFggbGFzZXIgaWYgU0ZQIGlzIGFwcHJvdmVkXG4iKTsKQEAgLTU5MTUsNiArODk1NSwyMCBAQAogCQlEUChORVRJRl9NU0dfTElOSywgInBvcnQgJXg6IEV4dGVybmFsIGxpbmsgaXMgZG93blxuIiwKIAkJCSAgIHBhcmFtcy0+cG9ydCk7CiAJfQorCisJLyogQ2FwdHVyZSAxMEcgbGluayBmYXVsdC4gKi8KKwlpZiAodmFycy0+bGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwMCkgeworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsCisJCQkgICAgTURJT19QTUFfTEFTSV9UWFNUQVQsICZ2YWwxKTsKKworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsCisJCQkgICAgTURJT19QTUFfTEFTSV9UWFNUQVQsICZ2YWwxKTsKKworCQlpZiAodmFsMSAmICgxPDwwKSkgeworCQkJdmFycy0+ZmF1bHRfZGV0ZWN0ZWQgPSAxOworCQl9CisJfQorCiAJaWYgKGxpbmtfdXApIHsKIAkJYm54MnhfZXh0X3BoeV9yZXNvbHZlX2ZjKHBoeSwgcGFyYW1zLCB2YXJzKTsKIAkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CkBAIC01OTQ1LDEwICs4OTk5LDE0IEBACiAJCQkJICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKworCS8qIEVuYWJsZS9EaXNhYmxlIFBIWSB0cmFuc21pdHRlciBvdXRwdXQgKi8KKwlibngyeF9zZXRfZGlzYWJsZV9wbWRfdHJhbnNtaXQocGFyYW1zLCBwaHksIDEpOworCiAJLyogRGlzYWJsZSBUcmFuc21pdHRlciAqLwogCWJueDJ4X3NmcF9zZXRfdHJhbnNtaXR0ZXIocGFyYW1zLCBwaHksIDApOwogCS8qIENsZWFyIExBU0kgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLCAwKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX0NUUkwsIDApOwogCiB9CiAKQEAgLTU5NTgsMTExICs5MDE2LDEwNiBAQAogc3RhdGljIHZvaWQgYm54Mnhfc2F2ZV84NDh4eF9zcGlyb21fdmVyc2lvbihzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCiAJCQkJCSAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQogewotCXUxNiB2YWwsIGZ3X3ZlcjEsIGZ3X3ZlcjIsIGNudCwgYWRqOworCXUxNiB2YWwsIGZ3X3ZlcjEsIGZ3X3ZlcjIsIGNudDsKKwl1OCBwb3J0OwogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCi0JYWRqID0gMDsKLQlpZiAocGh5LT50eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODMzKQotCQlhZGogPSAtMTsKKwlwb3J0ID0gcGFyYW1zLT5wb3J0OwogCiAJLyogRm9yIHRoZSAzMiBiaXRzIHJlZ2lzdGVycyBpbiA4NDh4eCwgYWNjZXNzIHZpYSBNRElPMkFSTSBpbnRlcmZhY2UuKi8KIAkvKiAoMSkgc2V0IHJlZ2lzdGVyIDB4YzIwMF8wMDE0KFNQSV9CUklER0VfQ1RSTF8yKSB0byAweDAzMDAwMDAwICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1BNQV9ERVZBRCwgMHhBODE5ICsgYWRqLCAweDAwMTQpOwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsIDB4QTgxQSArIGFkaiwgMHhjMjAwKTsKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCAweEE4MUIgKyBhZGosIDB4MDAwMCk7Ci0JYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1BNQV9ERVZBRCwgMHhBODFDICsgYWRqLCAweDAzMDApOwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsIDB4QTgxNyArIGFkaiwgMHgwMDA5KTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCAweEE4MTksIDB4MDAxNCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1BNQV9ERVZBRCwgMHhBODFBLCAweGMyMDApOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsIDB4QTgxQiwgMHgwMDAwKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCAweEE4MUMsIDB4MDMwMCk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1BNQV9ERVZBRCwgMHhBODE3LCAweDAwMDkpOwogCiAJZm9yIChjbnQgPSAwOyBjbnQgPCAxMDA7IGNudCsrKSB7Ci0JCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1BNQV9ERVZBRCwgMHhBODE4ICsgYWRqLCAmdmFsKTsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCAweEE4MTgsICZ2YWwpOwogCQlpZiAodmFsICYgMSkKIAkJCWJyZWFrOwogCQl1ZGVsYXkoNSk7CiAJfQogCWlmIChjbnQgPT0gMTAwKSB7CiAJCURQKE5FVElGX01TR19MSU5LLCAiVW5hYmxlIHRvIHJlYWQgODQ4eHggcGh5IGZ3IHZlcnNpb24oMSlcbiIpOwotCQlibngyeF9zYXZlX3NwaXJvbV92ZXJzaW9uKGJwLCBwYXJhbXMtPnBvcnQsIDAsCisJCWJueDJ4X3NhdmVfc3Bpcm9tX3ZlcnNpb24oYnAsIHBvcnQsIDAsCiAJCQkJCSAgcGh5LT52ZXJfYWRkcik7CiAJCXJldHVybjsKIAl9CiAKIAogCS8qIDIpIHJlYWQgcmVnaXN0ZXIgMHhjMjAwXzAwMDAgKFNQSV9GV19TVEFUVVMpICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1BNQV9ERVZBRCwgMHhBODE5ICsgYWRqLCAweDAwMDApOwotCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsIDB4QTgxQSArIGFkaiwgMHhjMjAwKTsKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCAweEE4MTcgKyBhZGosIDB4MDAwQSk7CisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1BNQV9ERVZBRCwgMHhBODE5LCAweDAwMDApOworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsIDB4QTgxQSwgMHhjMjAwKTsKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCAweEE4MTcsIDB4MDAwQSk7CiAJZm9yIChjbnQgPSAwOyBjbnQgPCAxMDA7IGNudCsrKSB7Ci0JCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1BNQV9ERVZBRCwgMHhBODE4ICsgYWRqLCAmdmFsKTsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCAweEE4MTgsICZ2YWwpOwogCQlpZiAodmFsICYgMSkKIAkJCWJyZWFrOwogCQl1ZGVsYXkoNSk7CiAJfQogCWlmIChjbnQgPT0gMTAwKSB7CiAJCURQKE5FVElGX01TR19MSU5LLCAiVW5hYmxlIHRvIHJlYWQgODQ4eHggcGh5IGZ3IHZlcnNpb24oMilcbiIpOwotCQlibngyeF9zYXZlX3NwaXJvbV92ZXJzaW9uKGJwLCBwYXJhbXMtPnBvcnQsIDAsCisJCWJueDJ4X3NhdmVfc3Bpcm9tX3ZlcnNpb24oYnAsIHBvcnQsIDAsCiAJCQkJCSAgcGh5LT52ZXJfYWRkcik7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBsb3dlciAxNiBiaXRzIG9mIHRoZSByZWdpc3RlciBTUElfRldfU1RBVFVTICovCi0JYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCAweEE4MUIgKyBhZGosICZmd192ZXIxKTsKKwlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsIDB4QTgxQiwgJmZ3X3ZlcjEpOwogCS8qIHVwcGVyIDE2IGJpdHMgb2YgcmVnaXN0ZXIgU1BJX0ZXX1NUQVRVUyAqLwotCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1BNQV9ERVZBRCwgMHhBODFDICsgYWRqLCAmZndfdmVyMik7CisJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fUE1BX0RFVkFELCAweEE4MUMsICZmd192ZXIyKTsKIAotCWJueDJ4X3NhdmVfc3Bpcm9tX3ZlcnNpb24oYnAsIHBhcmFtcy0+cG9ydCwgKGZ3X3ZlcjI8PDE2KSB8IGZ3X3ZlcjEsCisJYm54Mnhfc2F2ZV9zcGlyb21fdmVyc2lvbihicCwgcG9ydCwgKGZ3X3ZlcjI8PDE2KSB8IGZ3X3ZlcjEsCiAJCQkJICBwaHktPnZlcl9hZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgYm54MnhfODQ4eHhfc2V0X2xlZChzdHJ1Y3QgYm54MnggKmJwLAogCQkJCXN0cnVjdCBibngyeF9waHkgKnBoeSkKIHsKLQl1MTYgdmFsLCBhZGo7Ci0KLQlhZGogPSAwOwotCWlmIChwaHktPnR5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MzMpCi0JCWFkaiA9IC0xOworCXUxNiB2YWw7CiAKIAkvKiBQSFlDX0NUTF9MRURfQ1RMICovCiAJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCiAJCQlNRElPX1BNQV9ERVZBRCwKLQkJCU1ESU9fUE1BX1JFR184NDgxX0xJTktfU0lHTkFMICsgYWRqLCAmdmFsKTsKKwkJCU1ESU9fUE1BX1JFR184NDgxX0xJTktfU0lHTkFMLCAmdmFsKTsKIAl2YWwgJj0gMHhGRTAwOwogCXZhbCB8PSAweDAwOTI7CiAKIAlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCiAJCQkgTURJT19QTUFfREVWQUQsCi0JCQkgTURJT19QTUFfUkVHXzg0ODFfTElOS19TSUdOQUwgKyBhZGosIHZhbCk7CisJCQkgTURJT19QTUFfUkVHXzg0ODFfTElOS19TSUdOQUwsIHZhbCk7CiAKIAlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCiAJCQkgTURJT19QTUFfREVWQUQsCi0JCQkgTURJT19QTUFfUkVHXzg0ODFfTEVEMV9NQVNLICsgYWRqLAorCQkJIE1ESU9fUE1BX1JFR184NDgxX0xFRDFfTUFTSywKIAkJCSAweDgwKTsKIAogCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKIAkJCSBNRElPX1BNQV9ERVZBRCwKLQkJCSBNRElPX1BNQV9SRUdfODQ4MV9MRUQyX01BU0sgKyBhZGosCisJCQkgTURJT19QTUFfUkVHXzg0ODFfTEVEMl9NQVNLLAogCQkJIDB4MTgpOwogCiAJLyogU2VsZWN0IGFjdGl2aXR5IHNvdXJjZSBieSBUeCBhbmQgUngsIGFzIHN1Z2dlc3RlZCBieSBQSFkgQUUgKi8KIAlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCiAJCQkgTURJT19QTUFfREVWQUQsCi0JCQkgTURJT19QTUFfUkVHXzg0ODFfTEVEM19NQVNLICsgYWRqLAorCQkJIE1ESU9fUE1BX1JFR184NDgxX0xFRDNfTUFTSywKIAkJCSAweDAwMDYpOwogCiAJLyogU2VsZWN0IHRoZSBjbG9zZXN0IGFjdGl2aXR5IGJsaW5rIHJhdGUgdG8gdGhhdCBpbiAxMC8xMDAvMTAwMCAqLwogCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKIAkJCU1ESU9fUE1BX0RFVkFELAotCQkJTURJT19QTUFfUkVHXzg0ODFfTEVEM19CTElOSyArIGFkaiwKKwkJCU1ESU9fUE1BX1JFR184NDgxX0xFRDNfQkxJTkssCiAJCQkwKTsKIAogCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAogCQkJTURJT19QTUFfREVWQUQsCi0JCQlNRElPX1BNQV9SRUdfODQ4MjNfQ1RMX0xFRF9DVExfMSArIGFkaiwgJnZhbCk7CisJCQlNRElPX1BNQV9SRUdfODQ4MjNfQ1RMX0xFRF9DVExfMSwgJnZhbCk7CiAJdmFsIHw9IE1ESU9fUE1BX1JFR184NDgyM19MRUQzX1NUUkVUQ0hfRU47IC8qIHN0cmV0Y2hfZW4gZm9yIExFRDMqLwogCiAJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAogCQkJIE1ESU9fUE1BX0RFVkFELAotCQkJIE1ESU9fUE1BX1JFR184NDgyM19DVExfTEVEX0NUTF8xICsgYWRqLCB2YWwpOworCQkJIE1ESU9fUE1BX1JFR184NDgyM19DVExfTEVEX0NUTF8xLCB2YWwpOwogCiAJLyogJ0ludGVycnVwdCBNYXNrJyAqLwogCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKQEAgLTYwNzAsMTIgKzkxMjMsMTkgQEAKIAkJCSAweEZGRkIsIDB4RkZGRCk7CiB9CiAKLXN0YXRpYyB1OCBibngyeF84NDh4eF9jbW5fY29uZmlnX2luaXQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJCSAgICAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCitzdGF0aWMgaW50IGJueDJ4Xzg0OHh4X2Ntbl9jb25maWdfaW5pdChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJICAgICAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXUxNiBhdXRvbmVnX3ZhbCwgYW5fMTAwMF92YWwsIGFuXzEwXzEwMF92YWw7CisJdTE2IHRtcF9yZXFfbGluZV9zcGVlZDsKKworCXRtcF9yZXFfbGluZV9zcGVlZCA9IHBoeS0+cmVxX2xpbmVfc3BlZWQ7CisJaWYgKHBoeS0+dHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgzMykKKwkJaWYgKHBoeS0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfMTAwMDApCisJCQlwaHktPnJlcV9saW5lX3NwZWVkID0gU1BFRURfQVVUT19ORUc7CisKIAkvKgogCSAqIFRoaXMgcGh5IHVzZXMgdGhlIE5JRyBsYXRjaCBtZWNoYW5pc20gc2luY2UgbGluayBpbmRpY2F0aW9uCiAJICogYXJyaXZlcyB0aHJvdWdoIGl0cyBMRUQ0IGFuZCBub3QgdmlhIGl0cyBMQVNJIHNpZ25hbCwgc28gd2UKQEAgLTYxMjIsMTEgKzkxODIsMTQgQEAKIAkJCSBNRElPX0FOX0RFVkFELCBNRElPX0FOX1JFR184NDgxXzEwMDBUX0NUUkwsCiAJCQkgYW5fMTAwMF92YWwpOwogCi0JLyogc2V0IDEwIHNwZWVkIGFkdmVydGlzZW1lbnQgKi8KKwkvKiBzZXQgMTAwIHNwZWVkIGFkdmVydGlzZW1lbnQgKi8KIAlpZiAoKChwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKSAmJgogCSAgICAgKHBoeS0+c3BlZWRfY2FwX21hc2sgJgotCSAgICAgKFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTAwTV9GVUxMIHwKLQkgICAgICBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwME1fSEFMRikpKSkgeworCSAgICAgIChQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwME1fRlVMTCB8CisJICAgICAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTAwTV9IQUxGKSkgJiYKKwkgICAgIChwaHktPnN1cHBvcnRlZCAmCisJICAgICAgKFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwpKSkpIHsKIAkJYW5fMTBfMTAwX3ZhbCB8PSAoMTw8Nyk7CiAJCS8qIEVuYWJsZSBhdXRvbmVnIGFuZCByZXN0YXJ0IGF1dG9uZWcgZm9yIGxlZ2FjeSBzcGVlZHMgKi8KIAkJYXV0b25lZ192YWwgfD0gKDE8PDkgfCAxPDwxMik7CkBAIC02MTM3LDkgKzkyMDAsMTIgQEAKIAl9CiAJLyogc2V0IDEwIHNwZWVkIGFkdmVydGlzZW1lbnQgKi8KIAlpZiAoKChwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKSAmJgotCSAgICAocGh5LT5zcGVlZF9jYXBfbWFzayAmCi0JICAoUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xME1fRlVMTCB8Ci0JICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xME1fSEFMRikpKSkgeworCSAgICAgKHBoeS0+c3BlZWRfY2FwX21hc2sgJgorCSAgICAgIChQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwTV9GVUxMIHwKKwkgICAgICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xME1fSEFMRikpICYmCisJICAgICAocGh5LT5zdXBwb3J0ZWQgJgorCSAgICAgIChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkgICAgICAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCkpKSkgewogCQlhbl8xMF8xMDBfdmFsIHw9ICgxPDw1KTsKIAkJYXV0b25lZ192YWwgfD0gKDE8PDkgfCAxPDwxMik7CiAJCWlmIChwaHktPnJlcV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCkBAIC02MTQ4LDcgKzkyMTQsMTAgQEAKIAl9CiAKIAkvKiBPbmx5IDEwLzEwMCBhcmUgYWxsb3dlZCB0byB3b3JrIGluIEZPUkNFIG1vZGUgKi8KLQlpZiAocGh5LT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMDApIHsKKwlpZiAoKHBoeS0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfMTAwKSAmJgorCSAgICAocGh5LT5zdXBwb3J0ZWQgJgorCSAgICAgKFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkgICAgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCkpKSB7CiAJCWF1dG9uZWdfdmFsIHw9ICgxPDwxMyk7CiAJCS8qIEVuYWJsZWQgQVVUTy1NRElYIHdoZW4gYXV0b25lZyBpcyBkaXNhYmxlZCAqLwogCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCkBAIC02MTU2LDcgKzkyMjUsMTAgQEAKIAkJCQkgKDE8PDE1IHwgMTw8OSB8IDc8PDApKTsKIAkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIDEwME0gZm9yY2VcbiIpOwogCX0KLQlpZiAocGh5LT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMCkgeworCWlmICgocGh5LT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMCkgJiYKKwkgICAgKHBoeS0+c3VwcG9ydGVkICYKKwkgICAgIChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkgICAgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsKSkpIHsKIAkJLyogRW5hYmxlZCBBVVRPLU1ESVggd2hlbiBhdXRvbmVnIGlzIGRpc2FibGVkICovCiAJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKIAkJCQkgTURJT19BTl9ERVZBRCwgTURJT19BTl9SRUdfODQ4MV9BVVhfQ1RSTCwKQEAgLTYxNzksMTAgKzkyNTEsMTAgQEAKIAkgICAgKHBoeS0+c3BlZWRfY2FwX21hc2sgJgogCSAgICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMEcpKSB8fAogCQkocGh5LT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwMCkpIHsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJBZHZlcnRpc2luZyAxMEdcbiIpOwotCQkvKiBSZXN0YXJ0IGF1dG9uZWcgZm9yIDEwRyovCisJCQlEUChORVRJRl9NU0dfTElOSywgIkFkdmVydGlzaW5nIDEwR1xuIik7CisJCQkvKiBSZXN0YXJ0IGF1dG9uZWcgZm9yIDEwRyovCiAKLQkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAorCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAogCQkJCSBNRElPX0FOX0RFVkFELCBNRElPX0FOX1JFR19DVFJMLAogCQkJCSAweDMyMDApOwogCX0gZWxzZSBpZiAocGh5LT5yZXFfbGluZV9zcGVlZCAhPSBTUEVFRF8xMCAmJgpAQCAtNjE5NSwxMiArOTI2NywxNCBAQAogCS8qIFNhdmUgc3Bpcm9tIHZlcnNpb24gKi8KIAlibngyeF9zYXZlXzg0OHh4X3NwaXJvbV92ZXJzaW9uKHBoeSwgcGFyYW1zKTsKIAorCXBoeS0+cmVxX2xpbmVfc3BlZWQgPSB0bXBfcmVxX2xpbmVfc3BlZWQ7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU4IGJueDJ4Xzg0ODFfY29uZmlnX2luaXQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJCSBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKLQkJCQkgc3RydWN0IGxpbmtfdmFycyAqdmFycykKK3N0YXRpYyBpbnQgYm54MnhfODQ4MV9jb25maWdfaW5pdChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJLyogUmVzdG9yZSBub3JtYWwgcG93ZXIgbW9kZSovCkBAIC02MjE1LDMzICs5Mjg5LDIwMCBAQAogCXJldHVybiBibngyeF84NDh4eF9jbW5fY29uZmlnX2luaXQocGh5LCBwYXJhbXMsIHZhcnMpOwogfQogCi1zdGF0aWMgdTggYm54MnhfODQ4eDNfY29uZmlnX2luaXQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJCSAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkJICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQorCisjZGVmaW5lIFBIWTg0ODMzX0hEU0hLX1dBSVQgMzAwCitzdGF0aWMgaW50IGJueDJ4Xzg0ODMzX3BhaXJfc3dhcF9jZmcoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAorCQkJCSAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJdTMyIGlkeDsKKwl1MzIgcGFpcl9zd2FwOworCXUxNiB2YWw7CisJdTE2IGRhdGE7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJLyogRG8gcGFpciBzd2FwICovCisKKwkvKiBDaGVjayBmb3IgY29uZmlndXJhdGlvbi4gKi8KKwlwYWlyX3N3YXAgPSBSRUdfUkQoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCisJCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJZGV2X2luZm8ucG9ydF9od19jb25maWdbcGFyYW1zLT5wb3J0XS54Z2J0X3BoeV9jZmcpKSAmCisJCVBPUlRfSFdfQ0ZHX1JKNDVfUEFJUl9TV0FQX01BU0s7CisKKwlpZiAocGFpcl9zd2FwID09IDApCisJCXJldHVybiAwOworCisJZGF0YSA9ICh1MTYpcGFpcl9zd2FwOworCisJLyogV3JpdGUgQ01EX09QRU5fT1ZFUlJJREUgdG8gU1RBVFVTIHJlZyAqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCisJCQlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyLAorCQkJUEhZODQ4MzNfQ01EX09QRU5fT1ZFUlJJREUpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgUEhZODQ4MzNfSERTSEtfV0FJVDsgaWR4KyspIHsKKwkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAorCQkJCU1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzIsICZ2YWwpOworCQlpZiAodmFsID09IFBIWTg0ODMzX0NNRF9PUEVOX0ZPUl9DTURTKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9CisJaWYgKGlkeCA+PSBQSFk4NDgzM19IRFNIS19XQUlUKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiUGFpcnN3YXA6IEZXIG5vdCByZWFkeS5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAorCQkJTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHNCwKKwkJCWRhdGEpOworCS8qIElzc3VlIHBhaXIgc3dhcCBjb21tYW5kICovCisJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX0NUTF9ERVZBRCwKKwkJCU1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzAsCisJCQlQSFk4NDgzM19ESUFHX0NNRF9QQUlSX1NXQVBfQ0hBTkdFKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IFBIWTg0ODMzX0hEU0hLX1dBSVQ7IGlkeCsrKSB7CisJCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX0NUTF9ERVZBRCwKKwkJCQlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyLCAmdmFsKTsKKwkJaWYgKCh2YWwgPT0gUEhZODQ4MzNfQ01EX0NPTVBMRVRFX1BBU1MpIHx8CisJCQkodmFsID09IFBIWTg0ODMzX0NNRF9DT01QTEVURV9FUlJPUikpCisJCQlicmVhazsKKwkJbXNsZWVwKDEpOworCX0KKwlpZiAoKGlkeCA+PSBQSFk4NDgzM19IRFNIS19XQUlUKSB8fAorCQkodmFsID09IFBIWTg0ODMzX0NNRF9DT01QTEVURV9FUlJPUikpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJQYWlyc3dhcDogb3ZlcnJpZGUgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAorCQkJTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMiwKKwkJCVBIWTg0ODMzX0NNRF9DTEVBUl9DT01QTEVURSk7CisJRFAoTkVUSUZfTVNHX0xJTkssICJQYWlyc3dhcCBPSywgdmFsPTB4JXhcbiIsIGRhdGEpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1OCBibngyeF84NDgzM19nZXRfcmVzZXRfZ3Bpb3Moc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICB1MzIgc2htZW1fYmFzZV9wYXRoW10sCisJCQkJICAgICAgdTMyIGNoaXBfaWQpCit7CisJdTMyIHJlc2V0X3BpblsyXTsKKwl1MzIgaWR4OworCXU4IHJlc2V0X2dwaW9zOworCWlmIChDSElQX0lTX0UzKGJwKSkgeworCQkvKiBBc3N1bWUgdGhhdCB0aGVzZSB3aWxsIGJlIEdQSU9zLCBub3QgRVBJT3MuICovCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgMjsgaWR4KyspIHsKKwkJCS8qIE1hcCBjb25maWcgcGFyYW0gdG8gcmVnaXN0ZXIgYml0LiAqLworCQkJcmVzZXRfcGluW2lkeF0gPSBSRUdfUkQoYnAsIHNobWVtX2Jhc2VfcGF0aFtpZHhdICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJCWRldl9pbmZvLnBvcnRfaHdfY29uZmlnWzBdLmUzX2Ntbl9waW5fY2ZnKSk7CisJCQlyZXNldF9waW5baWR4XSA9IChyZXNldF9waW5baWR4XSAmCisJCQkJUE9SVF9IV19DRkdfRTNfUEhZX1JFU0VUX01BU0spID4+CisJCQkJUE9SVF9IV19DRkdfRTNfUEhZX1JFU0VUX1NISUZUOworCQkJcmVzZXRfcGluW2lkeF0gLT0gUElOX0NGR19HUElPMF9QMDsKKwkJCXJlc2V0X3BpbltpZHhdID0gKDEgPDwgcmVzZXRfcGluW2lkeF0pOworCQl9CisJCXJlc2V0X2dwaW9zID0gKHU4KShyZXNldF9waW5bMF0gfCByZXNldF9waW5bMV0pOworCX0gZWxzZSB7CisJCS8qIEUyLCBsb29rIGZyb20gZGlmZiBwbGFjZSBvZiBzaG1lbS4gKi8KKwkJZm9yIChpZHggPSAwOyBpZHggPCAyOyBpZHgrKykgeworCQkJcmVzZXRfcGluW2lkeF0gPSBSRUdfUkQoYnAsIHNobWVtX2Jhc2VfcGF0aFtpZHhdICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLAorCQkJCWRldl9pbmZvLnBvcnRfaHdfY29uZmlnWzBdLmRlZmF1bHRfY2ZnKSk7CisJCQlyZXNldF9waW5baWR4XSAmPSBQT1JUX0hXX0NGR19FWFRfUEhZX0dQSU9fUlNUX01BU0s7CisJCQlyZXNldF9waW5baWR4XSAtPSBQT1JUX0hXX0NGR19FWFRfUEhZX0dQSU9fUlNUX0dQSU8wX1AwOworCQkJcmVzZXRfcGluW2lkeF0gPj49IFBPUlRfSFdfQ0ZHX0VYVF9QSFlfR1BJT19SU1RfU0hJRlQ7CisJCQlyZXNldF9waW5baWR4XSA9ICgxIDw8IHJlc2V0X3BpbltpZHhdKTsKKwkJfQorCQlyZXNldF9ncGlvcyA9ICh1OCkocmVzZXRfcGluWzBdIHwgcmVzZXRfcGluWzFdKTsKKwl9CisKKwlyZXR1cm4gcmVzZXRfZ3Bpb3M7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfODQ4MzNfaHdfcmVzZXRfcGh5KHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQlzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1OCByZXNldF9ncGlvczsKKwl1MzIgb3RoZXJfc2htZW1fYmFzZV9hZGRyID0gUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtMl9iYXNlICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3Qgc2htZW0yX3JlZ2lvbiwKKwkJCQlvdGhlcl9zaG1lbV9iYXNlX2FkZHIpKTsKKworCXUzMiBzaG1lbV9iYXNlX3BhdGhbMl07CisJc2htZW1fYmFzZV9wYXRoWzBdID0gcGFyYW1zLT5zaG1lbV9iYXNlOworCXNobWVtX2Jhc2VfcGF0aFsxXSA9IG90aGVyX3NobWVtX2Jhc2VfYWRkcjsKKworCXJlc2V0X2dwaW9zID0gYm54MnhfODQ4MzNfZ2V0X3Jlc2V0X2dwaW9zKGJwLCBzaG1lbV9iYXNlX3BhdGgsCisJCQkJCQkgIHBhcmFtcy0+Y2hpcF9pZCk7CisKKwlibngyeF9zZXRfbXVsdF9ncGlvKGJwLCByZXNldF9ncGlvcywgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfTE9XKTsKKwl1ZGVsYXkoMTApOworCURQKE5FVElGX01TR19MSU5LLCAiODQ4MzMgaHcgcmVzZXQgb24gcGluIHZhbHVlcyAweCV4XG4iLAorCQlyZXNldF9ncGlvcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibngyeF84NDgzM19jb21tb25faW5pdF9waHkoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJCXUzMiBzaG1lbV9iYXNlX3BhdGhbXSwKKwkJCQkJCXUzMiBjaGlwX2lkKQoreworCXU4IHJlc2V0X2dwaW9zOworCisJcmVzZXRfZ3Bpb3MgPSBibngyeF84NDgzM19nZXRfcmVzZXRfZ3Bpb3MoYnAsIHNobWVtX2Jhc2VfcGF0aCwgY2hpcF9pZCk7CisKKwlibngyeF9zZXRfbXVsdF9ncGlvKGJwLCByZXNldF9ncGlvcywgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfTE9XKTsKKwl1ZGVsYXkoMTApOworCWJueDJ4X3NldF9tdWx0X2dwaW8oYnAsIHJlc2V0X2dwaW9zLCBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9ISUdIKTsKKwltc2xlZXAoODAwKTsKKwlEUChORVRJRl9NU0dfTElOSywgIjg0ODMzIHJlc2V0IHB1bHNlIG9uIHBpbiB2YWx1ZXMgMHgleFxuIiwKKwkJcmVzZXRfZ3Bpb3MpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUEhZODQ4MzNfQ09OU1RBTlRfTEFURU5DWSAxMTkzCitzdGF0aWMgaW50IGJueDJ4Xzg0OHgzX2NvbmZpZ19pbml0KHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXU4IHBvcnQsIGluaXRpYWxpemUgPSAxOwotCXUxNiB2YWwsIGFkajsKKwl1MTYgdmFsOwogCXUxNiB0ZW1wOwotCXUzMiBhY3R1YWxfcGh5X3NlbGVjdGlvbiwgY21zX2VuYWJsZTsKLQl1OCByYyA9IDA7Ci0KLQkvKiBUaGlzIGlzIGp1c3QgZm9yIE1ESU9fQ1RMX1JFR184NDgyM19NRURJQSByZWdpc3Rlci4gKi8KLQlhZGogPSAwOwotCWlmIChwaHktPnR5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MzMpCi0JCWFkaiA9IDM7CisJdTMyIGFjdHVhbF9waHlfc2VsZWN0aW9uLCBjbXNfZW5hYmxlLCBpZHg7CisJaW50IHJjID0gMDsKIAogCW1zbGVlcCgxKTsKLQlpZiAoQ0hJUF9JU19FMihicCkpCisKKwlpZiAoIShDSElQX0lTX0UxKGJwKSkpCiAJCXBvcnQgPSBCUF9QQVRIKGJwKTsKIAllbHNlCiAJCXBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0JYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMywKLQkJICAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0hJR0gsCi0JCSAgICAgICBwb3J0KTsKKworCWlmIChwaHktPnR5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MjMpIHsKKwkJYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMywKKwkJCSAgICAgICBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9ISUdILAorCQkJICAgICAgIHBvcnQpOworCX0gZWxzZSB7CisJCS8qIE1ESU8gcmVzZXQgKi8KKwkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAorCQkJCU1ESU9fUE1BX0RFVkFELAorCQkJCU1ESU9fUE1BX1JFR19DVFJMLCAweDgwMDApOworCQkvKiBCcmluZyBQSFkgb3V0IG9mIHN1cGVyIGlzb2xhdGUgbW9kZSAqLworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKKwkJCQlNRElPX0NUTF9ERVZBRCwKKwkJCQlNRElPXzg0ODMzX1RPUF9DRkdfWEdQSFlfU1RSQVAxLCAmdmFsKTsKKwkJdmFsICY9IH5NRElPXzg0ODMzX1NVUEVSX0lTT0xBVEU7CisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKKwkJCQlNRElPX0NUTF9ERVZBRCwKKwkJCQlNRElPXzg0ODMzX1RPUF9DRkdfWEdQSFlfU1RSQVAxLCB2YWwpOworCX0KKwogCWJueDJ4X3dhaXRfcmVzZXRfY29tcGxldGUoYnAsIHBoeSwgcGFyYW1zKTsKKwogCS8qIFdhaXQgZm9yIEdQSFkgdG8gY29tZSBvdXQgb2YgcmVzZXQgKi8KIAltc2xlZXAoNTApOworCisJaWYgKHBoeS0+dHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgzMykKKwkJYm54MnhfODQ4MzNfcGFpcl9zd2FwX2NmZyhwaHksIHBhcmFtcywgdmFycyk7CisKIAkvKgogCSAqIEJDTTg0ODIzIHJlcXVpcmVzIHRoYXQgWEdYUyBsaW5rcyB1cCBmaXJzdCBAIDEwRyBmb3Igbm9ybWFsIGJlaGF2aW9yCiAJICovCkBAIC02MjU0LDE0ICs5NDk1LDIwIEBACiAJLyogU2V0IGR1YWwtbWVkaWEgY29uZmlndXJhdGlvbiBhY2NvcmRpbmcgdG8gY29uZmlndXJhdGlvbiAqLwogCiAJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAotCQkJTURJT19DVExfUkVHXzg0ODIzX01FRElBICsgYWRqLCAmdmFsKTsKKwkJCU1ESU9fQ1RMX1JFR184NDgyM19NRURJQSwgJnZhbCk7CiAJdmFsICY9IH4oTURJT19DVExfUkVHXzg0ODIzX01FRElBX01BQ19NQVNLIHwKIAkJIE1ESU9fQ1RMX1JFR184NDgyM19NRURJQV9MSU5FX01BU0sgfAogCQkgTURJT19DVExfUkVHXzg0ODIzX01FRElBX0NPUFBFUl9DT1JFX0RPV04gfAogCQkgTURJT19DVExfUkVHXzg0ODIzX01FRElBX1BSSU9SSVRZX01BU0sgfAogCQkgTURJT19DVExfUkVHXzg0ODIzX01FRElBX0ZJQkVSXzFHKTsKLQl2YWwgfD0gTURJT19DVExfUkVHXzg0ODIzX0NUUkxfTUFDX1hGSSB8Ci0JCU1ESU9fQ1RMX1JFR184NDgyM19NRURJQV9MSU5FX1hBVUlfTDsKKworCWlmIChDSElQX0lTX0UzKGJwKSkgeworCQl2YWwgJj0gfihNRElPX0NUTF9SRUdfODQ4MjNfTUVESUFfTUFDX01BU0sgfAorCQkJIE1ESU9fQ1RMX1JFR184NDgyM19NRURJQV9MSU5FX01BU0spOworCX0gZWxzZSB7CisJCXZhbCB8PSAoTURJT19DVExfUkVHXzg0ODIzX0NUUkxfTUFDX1hGSSB8CisJCQlNRElPX0NUTF9SRUdfODQ4MjNfTUVESUFfTElORV9YQVVJX0wpOworCX0KIAogCWFjdHVhbF9waHlfc2VsZWN0aW9uID0gYm54MnhfcGh5X3NlbGVjdGlvbihwYXJhbXMpOwogCkBAIC02Mjg3LDI4ICs5NTM0LDkwIEBACiAJCXZhbCB8PSBNRElPX0NUTF9SRUdfODQ4MjNfTUVESUFfRklCRVJfMUc7CiAKIAlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAotCQkJIE1ESU9fQ1RMX1JFR184NDgyM19NRURJQSArIGFkaiwgdmFsKTsKKwkJCSBNRElPX0NUTF9SRUdfODQ4MjNfTUVESUEsIHZhbCk7CiAJRFAoTkVUSUZfTVNHX0xJTkssICJNdWx0aV9waHkgY29uZmlnID0gMHgleCwgTWVkaWEgY29udHJvbCA9IDB4JXhcbiIsCiAJCSAgIHBhcmFtcy0+bXVsdGlfcGh5X2NvbmZpZywgdmFsKTsKIAorCS8qIEF1dG9nckVFRW4gKi8KKwlpZiAocGFyYW1zLT5mZWF0dXJlX2NvbmZpZ19mbGFncyAmCisJCUZFQVRVUkVfQ09ORklHX0FVVE9HUkVFRU5fRU5BQkxFRCkgeworCQkvKiBFbnN1cmUgdGhhdCBmL3cgaXMgcmVhZHkgKi8KKwkJZm9yIChpZHggPSAwOyBpZHggPCBQSFk4NDgzM19IRFNIS19XQUlUOyBpZHgrKykgeworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAorCQkJCQlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyLCAmdmFsKTsKKwkJCWlmICh2YWwgPT0gUEhZODQ4MzNfQ01EX09QRU5fRk9SX0NNRFMpCisJCQkJYnJlYWs7CisJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCk7CisJCX0KKwkJaWYgKGlkeCA+PSBQSFk4NDgzM19IRFNIS19XQUlUKSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgIkF1dG9nckVFRW46IEZXIG5vdCByZWFkeS5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBTZWxlY3QgRUVFIG1vZGUgKi8KKwkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX0NUTF9ERVZBRCwKKwkJCQlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUczLAorCQkJCTB4Mik7CisKKwkJLyogU2V0IElkbGUgYW5kIExhdGVuY3kgKi8KKwkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX0NUTF9ERVZBRCwKKwkJCQlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUc0LAorCQkJCVBIWTg0ODMzX0NPTlNUQU5UX0xBVEVOQ1kgKyAxKTsKKworCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAorCQkJCU1ESU9fODQ4MzNfVE9QX0NGR19EQVRBM19SRUcsCisJCQkJUEhZODQ4MzNfQ09OU1RBTlRfTEFURU5DWSArIDEpOworCisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCisJCQkJTURJT184NDgzM19UT1BfQ0ZHX0RBVEE0X1JFRywKKwkJCQlQSFk4NDgzM19DT05TVEFOVF9MQVRFTkNZKTsKKworCQkvKiBTZW5kIEVFRSBpbnN0cnVjdGlvbiB0byBjb21tYW5kIHJlZ2lzdGVyICovCisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCisJCQkJTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMCwKKwkJCQlQSFk4NDgzM19ESUFHX0NNRF9TRVRfRUVFX01PREUpOworCisJCS8qIEVuc3VyZSB0aGF0IHRoZSBjb21tYW5kIGhhcyBjb21wbGV0ZWQgKi8KKwkJZm9yIChpZHggPSAwOyBpZHggPCBQSFk4NDgzM19IRFNIS19XQUlUOyBpZHgrKykgeworCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAorCQkJCQlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyLCAmdmFsKTsKKwkJCWlmICgodmFsID09IFBIWTg0ODMzX0NNRF9DT01QTEVURV9QQVNTKSB8fAorCQkJCSh2YWwgPT0gUEhZODQ4MzNfQ01EX0NPTVBMRVRFX0VSUk9SKSkKKwkJCQlicmVhazsKKwkJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDAwKTsKKwkJfQorCQlpZiAoKGlkeCA+PSBQSFk4NDgzM19IRFNIS19XQUlUKSB8fAorCQkJKHZhbCA9PSBQSFk4NDgzM19DTURfQ09NUExFVEVfRVJST1IpKSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgIkF1dG9nckVFRW46IGNvbW1hbmQgZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIFJlc2V0IGNvbW1hbmQgaGFuZGxlciAqLworCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAorCQkJICAgIE1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzIsCisJCQkgICAgUEhZODQ4MzNfQ01EX0NMRUFSX0NPTVBMRVRFKTsKKwl9CisKIAlpZiAoaW5pdGlhbGl6ZSkKIAkJcmMgPSBibngyeF84NDh4eF9jbW5fY29uZmlnX2luaXQocGh5LCBwYXJhbXMsIHZhcnMpOwogCWVsc2UKIAkJYm54Mnhfc2F2ZV84NDh4eF9zcGlyb21fdmVyc2lvbihwaHksIHBhcmFtcyk7Ci0JY21zX2VuYWJsZSA9IFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkvKiA4NDgzMyBQSFkgaGFzIGEgYmV0dGVyIGZlYXR1cmUgYW5kIGRvZXNuJ3QgbmVlZCB0byBzdXBwb3J0IHRoaXMuICovCisJaWYgKHBoeS0+dHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgyMykgeworCQljbXNfZW5hYmxlID0gUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKwogCQkJb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKIAkJCWRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BhcmFtcy0+cG9ydF0uZGVmYXVsdF9jZmcpKSAmCiAJCQlQT1JUX0hXX0NGR19FTkFCTEVfQ01TX01BU0s7CiAKLQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCi0JCU1ESU9fQ1RMX1JFR184NDgyM19VU0VSX0NUUkxfUkVHLCAmdmFsKTsKLQlpZiAoY21zX2VuYWJsZSkKLQkJdmFsIHw9IE1ESU9fQ1RMX1JFR184NDgyM19VU0VSX0NUUkxfQ01TOwotCWVsc2UKLQkJdmFsICY9IH5NRElPX0NUTF9SRUdfODQ4MjNfVVNFUl9DVFJMX0NNUzsKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAotCQlNRElPX0NUTF9SRUdfODQ4MjNfVVNFUl9DVFJMX1JFRywgdmFsKTsKLQorCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCisJCQkJTURJT19DVExfUkVHXzg0ODIzX1VTRVJfQ1RSTF9SRUcsICZ2YWwpOworCQlpZiAoY21zX2VuYWJsZSkKKwkJCXZhbCB8PSBNRElPX0NUTF9SRUdfODQ4MjNfVVNFUl9DVFJMX0NNUzsKKwkJZWxzZQorCQkJdmFsICY9IH5NRElPX0NUTF9SRUdfODQ4MjNfVVNFUl9DVFJMX0NNUzsKKwkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX0NUTF9ERVZBRCwKKwkJCQkgTURJT19DVExfUkVHXzg0ODIzX1VTRVJfQ1RSTF9SRUcsIHZhbCk7CisJfQogCiAJcmV0dXJuIHJjOwogfQpAQCAtNjMxOCwyMCArOTYyNywxNiBAQAogCQkJCSAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1MTYgdmFsLCB2YWwxLCB2YWwyLCBhZGo7CisJdTE2IHZhbCwgdmFsMSwgdmFsMjsKIAl1OCBsaW5rX3VwID0gMDsKIAotCS8qIFJlZyBvZmZzZXQgYWRqdXN0bWVudCBmb3IgODQ4MzMgKi8KLQlhZGogPSAwOwotCWlmIChwaHktPnR5cGUgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MzMpCi0JCWFkaiA9IC0xOwogCiAJLyogQ2hlY2sgMTBHLUJhc2VUIGxpbmsgc3RhdHVzICovCiAJLyogQ2hlY2sgUE1EIHNpZ25hbCBvayAqLwogCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAogCQkJTURJT19BTl9ERVZBRCwgMHhGRkZBLCAmdmFsMSk7CiAJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCi0JCQlNRElPX1BNQV9ERVZBRCwgTURJT19QTUFfUkVHXzg0ODFfUE1EX1NJR05BTCArIGFkaiwKKwkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfODQ4MV9QTURfU0lHTkFMLAogCQkJJnZhbDIpOwogCURQKE5FVElGX01TR19MSU5LLCAiQkNNODQ4eHg6IFBNRF9TSUdOQUwgMS5hODExID0gMHgleFxuIiwgdmFsMik7CiAKQEAgLTY0MDMsOSArOTcwOCwxMCBAQAogCXJldHVybiBsaW5rX3VwOwogfQogCi1zdGF0aWMgdTggYm54MnhfODQ4eHhfZm9ybWF0X3Zlcih1MzIgcmF3X3ZlciwgdTggKnN0ciwgdTE2ICpsZW4pCisKK3N0YXRpYyBpbnQgYm54MnhfODQ4eHhfZm9ybWF0X3Zlcih1MzIgcmF3X3ZlciwgdTggKnN0ciwgdTE2ICpsZW4pCiB7Ci0JdTggc3RhdHVzID0gMDsKKwlpbnQgc3RhdHVzID0gMDsKIAl1MzIgc3Bpcm9tX3ZlcjsKIAlzcGlyb21fdmVyID0gKChyYXdfdmVyICYgMHhGODApID4+IDcpIDw8IDE2IHwgKHJhd192ZXIgJiAweDdGKTsKIAlzdGF0dXMgPSBibngyeF9mb3JtYXRfdmVyKHNwaXJvbV92ZXIsIHN0ciwgbGVuKTsKQEAgLTY0MzUsMTMgKzk3NDEsMjcgQEAKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAl1OCBwb3J0OwotCWlmIChDSElQX0lTX0UyKGJwKSkKKwl1MTYgdmFsMTY7CisKKwlpZiAoIShDSElQX0lTX0UxKGJwKSkpCiAJCXBvcnQgPSBCUF9QQVRIKGJwKTsKIAllbHNlCiAJCXBvcnQgPSBwYXJhbXMtPnBvcnQ7Ci0JYm54Mnhfc2V0X2dwaW8oYnAsIE1JU0NfUkVHSVNURVJTX0dQSU9fMywKLQkJICAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0xPVywKLQkJICAgICAgIHBvcnQpOworCisJaWYgKHBoeS0+dHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgyMykgeworCQlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18zLAorCQkJICAgICAgIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0xPVywKKwkJCSAgICAgICBwb3J0KTsKKwl9IGVsc2UgeworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKKwkJCQlNRElPX0NUTF9ERVZBRCwKKwkJCQkweDQwMGYsICZ2YWwxNik7CisJCS8qIFB1dCB0byBsb3cgcG93ZXIgbW9kZSBvbiBuZXdlciBGVyAqLworCQlpZiAoKHZhbDE2ICYgMHgzMDNmKSA+IDB4MTAwOSkKKwkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKKwkJCQkJTURJT19QTUFfREVWQUQsCisJCQkJCU1ESU9fUE1BX1JFR19DVFJMLCAweDgwMCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBibngyeF84NDh4eF9zZXRfbGlua19sZWQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LApAQCAtNjQ0OSwxMSArOTc2OSwxNyBAQAogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXUxNiB2YWw7CisJdTggcG9ydDsKKworCWlmICghKENISVBfSVNfRTEoYnApKSkKKwkJcG9ydCA9IEJQX1BBVEgoYnApOworCWVsc2UKKwkJcG9ydCA9IHBhcmFtcy0+cG9ydDsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgTEVEX01PREVfT0ZGOgogCi0JCURQKE5FVElGX01TR19MSU5LLCAiUG9ydCAweCV4OiBMRUQgTU9ERSBPRkZcbiIsIHBhcmFtcy0+cG9ydCk7CisJCURQKE5FVElGX01TR19MSU5LLCAiUG9ydCAweCV4OiBMRUQgTU9ERSBPRkZcbiIsIHBvcnQpOwogCiAJCWlmICgocGFyYW1zLT5od19sZWRfbW9kZSA8PCBTSEFSRURfSFdfQ0ZHX0xFRF9NT0RFX1NISUZUKSA9PQogCQkgICAgU0hBUkVEX0hXX0NGR19MRURfRVhUUEhZMSkgewpAQCAtNjQ4OSw3ICs5ODE1LDcgQEAKIAljYXNlIExFRF9NT0RFX0ZST05UX1BBTkVMX09GRjoKIAogCQlEUChORVRJRl9NU0dfTElOSywgIlBvcnQgMHgleDogTEVEIE1PREUgRlJPTlQgUEFORUwgT0ZGXG4iLAotCQkgICBwYXJhbXMtPnBvcnQpOworCQkgICBwb3J0KTsKIAogCQlpZiAoKHBhcmFtcy0+aHdfbGVkX21vZGUgPDwgU0hBUkVEX0hXX0NGR19MRURfTU9ERV9TSElGVCkgPT0KIAkJICAgIFNIQVJFRF9IV19DRkdfTEVEX0VYVFBIWTEpIHsKQEAgLTY1MjQsNyArOTg1MCw3IEBACiAJCWJyZWFrOwogCWNhc2UgTEVEX01PREVfT046CiAKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJQb3J0IDB4JXg6IExFRCBNT0RFIE9OXG4iLCBwYXJhbXMtPnBvcnQpOworCQlEUChORVRJRl9NU0dfTElOSywgIlBvcnQgMHgleDogTEVEIE1PREUgT05cbiIsIHBvcnQpOwogCiAJCWlmICgocGFyYW1zLT5od19sZWRfbW9kZSA8PCBTSEFSRURfSFdfQ0ZHX0xFRF9NT0RFX1NISUZUKSA9PQogCQkgICAgU0hBUkVEX0hXX0NGR19MRURfRVhUUEhZMSkgewpAQCAtNjU3MSw3ICs5ODk3LDcgQEAKIAogCWNhc2UgTEVEX01PREVfT1BFUjoKIAotCQlEUChORVRJRl9NU0dfTElOSywgIlBvcnQgMHgleDogTEVEIE1PREUgT1BFUlxuIiwgcGFyYW1zLT5wb3J0KTsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJQb3J0IDB4JXg6IExFRCBNT0RFIE9QRVJcbiIsIHBvcnQpOwogCiAJCWlmICgocGFyYW1zLT5od19sZWRfbW9kZSA8PCBTSEFSRURfSFdfQ0ZHX0xFRF9NT0RFX1NISUZUKSA9PQogCQkgICAgU0hBUkVEX0hXX0NGR19MRURfRVhUUEhZMSkgewpAQCAtNjYzMyw3ICs5OTU5LDM4OCBAQAogCQl9CiAJCWJyZWFrOwogCX0KKworCS8qCisJICogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIEUzKzg0ODMzIHVudGlsIGF1dG9uZWcKKwkgKiByZXN0YXJ0IGlzIGZpeGVkIGluIGYvdworCSAqLworCWlmIChDSElQX0lTX0UzKGJwKSkgeworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKKwkJCQlNRElPX1dDX1JFR19HUDJfU1RBVFVTX0dQXzJfMSwgJnZhbCk7CisJfQogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQk1NDYxOFNFIFBIWSBTRUNUSU9OCQkJICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgYm54MnhfNTQ2MThzZV9jb25maWdfaW5pdChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJCSAgICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkJICAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggcG9ydDsKKwl1MTYgYXV0b25lZ192YWwsIGFuXzEwMDBfdmFsLCBhbl8xMF8xMDBfdmFsLCBmY192YWwsIHRlbXA7CisJdTMyIGNmZ19waW47CisKKwlEUChORVRJRl9NU0dfTElOSywgIjU0NjE4U0UgY2ZnIGluaXRcbiIpOworCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDAwKTsKKworCS8qIFRoaXMgd29ya3Mgd2l0aCBFMyBvbmx5LCBubyBuZWVkIHRvIGNoZWNrIHRoZSBjaGlwCisJICAgYmVmb3JlIGRldGVybWluaW5nIHRoZSBwb3J0LiAqLworCXBvcnQgPSBwYXJhbXMtPnBvcnQ7CisKKwljZmdfcGluID0gKFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJCW9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCisJCQlkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twb3J0XS5lM19jbW5fcGluX2NmZykpICYKKwkJCVBPUlRfSFdfQ0ZHX0UzX1BIWV9SRVNFVF9NQVNLKSA+PgorCQkJUE9SVF9IV19DRkdfRTNfUEhZX1JFU0VUX1NISUZUOworCisJLyogRHJpdmUgcGluIGhpZ2ggdG8gYnJpbmcgdGhlIEdQSFkgb3V0IG9mIHJlc2V0LiAqLworCWJueDJ4X3NldF9jZmdfcGluKGJwLCBjZmdfcGluLCAxKTsKKworCS8qIHdhaXQgZm9yIEdQSFkgdG8gcmVzZXQgKi8KKwltc2xlZXAoNTApOworCisJLyogcmVzZXQgcGh5ICovCisJYm54MnhfY2wyMl93cml0ZShicCwgcGh5LAorCQkJIE1ESU9fUE1BX1JFR19DVFJMLCAweDgwMDApOworCWJueDJ4X3dhaXRfcmVzZXRfY29tcGxldGUoYnAsIHBoeSwgcGFyYW1zKTsKKworCS8qd2FpdCBmb3IgR1BIWSB0byByZXNldCAqLworCW1zbGVlcCg1MCk7CisKKwkvKiBDb25maWd1cmUgTEVENDogc2V0IHRvIElOVFIgKDB4NikuICovCisJLyogQWNjZXNzaW5nIHNoYWRvdyByZWdpc3RlciAweGUuICovCisJYm54MnhfY2wyMl93cml0ZShicCwgcGh5LAorCQkJTURJT19SRUdfR1BIWV9TSEFET1csCisJCQlNRElPX1JFR19HUEhZX1NIQURPV19MRURfU0VMMik7CisJYm54MnhfY2wyMl9yZWFkKGJwLCBwaHksCisJCQlNRElPX1JFR19HUEhZX1NIQURPVywKKwkJCSZ0ZW1wKTsKKwl0ZW1wICY9IH4oMHhmIDw8IDQpOworCXRlbXAgfD0gKDB4NiA8PCA0KTsKKwlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksCisJCQlNRElPX1JFR19HUEhZX1NIQURPVywKKwkJCU1ESU9fUkVHX0dQSFlfU0hBRE9XX1dSX0VOQSB8IHRlbXApOworCS8qIENvbmZpZ3VyZSBJTlRSIGJhc2VkIG9uIGxpbmsgc3RhdHVzIGNoYW5nZS4gKi8KKwlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksCisJCQlNRElPX1JFR19JTlRSX01BU0ssCisJCQl+TURJT19SRUdfSU5UUl9NQVNLX0xJTktfU1RBVFVTKTsKKworCS8qIEZsaXAgdGhlIHNpZ25hbCBkZXRlY3QgcG9sYXJpdHkgKHNldCAweDFjLjB4MWVbOF0pLiAqLworCWJueDJ4X2NsMjJfd3JpdGUoYnAsIHBoeSwKKwkJCU1ESU9fUkVHX0dQSFlfU0hBRE9XLAorCQkJTURJT19SRUdfR1BIWV9TSEFET1dfQVVUT19ERVRfTUVEKTsKKwlibngyeF9jbDIyX3JlYWQoYnAsIHBoeSwKKwkJCU1ESU9fUkVHX0dQSFlfU0hBRE9XLAorCQkJJnRlbXApOworCXRlbXAgfD0gTURJT19SRUdfR1BIWV9TSEFET1dfSU5WRVJUX0ZJQl9TRDsKKwlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksCisJCQlNRElPX1JFR19HUEhZX1NIQURPVywKKwkJCU1ESU9fUkVHX0dQSFlfU0hBRE9XX1dSX0VOQSB8IHRlbXApOworCisJLyogU2V0IHVwIGZjICovCisJLyogUGxlYXNlIHJlZmVyIHRvIFRhYmxlIDI4Qi0zIG9mIDgwMi4zYWItMTk5OSBzcGVjLiAqLworCWJueDJ4X2NhbGNfaWVlZV9hbmVnX2FkdihwaHksIHBhcmFtcywgJnZhcnMtPmllZWVfZmMpOworCWZjX3ZhbCA9IDA7CisJaWYgKCh2YXJzLT5pZWVlX2ZjICYgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfQVNZTU1FVFJJQykgPT0KKwkJCU1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0FTWU1NRVRSSUMpCisJCWZjX3ZhbCB8PSBNRElPX0FOX1JFR19BRFZfUEFVU0VfQVNZTU1FVFJJQzsKKworCWlmICgodmFycy0+aWVlZV9mYyAmIE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX1BBVVNFX0JPVEgpID09CisJCQlNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIKQorCQlmY192YWwgfD0gTURJT19BTl9SRUdfQURWX1BBVVNFX1BBVVNFOworCisJLyogcmVhZCBhbGwgYWR2ZXJ0aXNlbWVudCAqLworCWJueDJ4X2NsMjJfcmVhZChicCwgcGh5LAorCQkJMHgwOSwKKwkJCSZhbl8xMDAwX3ZhbCk7CisKKwlibngyeF9jbDIyX3JlYWQoYnAsIHBoeSwKKwkJCTB4MDQsCisJCQkmYW5fMTBfMTAwX3ZhbCk7CisKKwlibngyeF9jbDIyX3JlYWQoYnAsIHBoeSwKKwkJCU1ESU9fUE1BX1JFR19DVFJMLAorCQkJJmF1dG9uZWdfdmFsKTsKKworCS8qIERpc2FibGUgZm9yY2VkIHNwZWVkICovCisJYXV0b25lZ192YWwgJj0gfigoMTw8NikgfCAoMTw8OCkgfCAoMTw8OSkgfCAoMTw8MTIpIHwgKDE8PDEzKSk7CisJYW5fMTBfMTAwX3ZhbCAmPSB+KCgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSB8ICgxPDw4KSB8ICgxPDwxMCkgfAorCQkJICAgKDE8PDExKSk7CisKKwlpZiAoKChwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKSAmJgorCQkJKHBoeS0+c3BlZWRfY2FwX21hc2sgJgorCQkJUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xRykpIHx8CisJCQkocGh5LT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMDAwKSkgeworCQlhbl8xMDAwX3ZhbCB8PSAoMTw8OCk7CisJCWF1dG9uZWdfdmFsIHw9ICgxPDw5IHwgMTw8MTIpOworCQlpZiAocGh5LT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJYW5fMTAwMF92YWwgfD0gKDE8PDkpOworCQlEUChORVRJRl9NU0dfTElOSywgIkFkdmVydGlzaW5nIDFHXG4iKTsKKwl9IGVsc2UKKwkJYW5fMTAwMF92YWwgJj0gfigoMTw8OCkgfCAoMTw8OSkpOworCisJYm54MnhfY2wyMl93cml0ZShicCwgcGh5LAorCQkJMHgwOSwKKwkJCWFuXzEwMDBfdmFsKTsKKwlibngyeF9jbDIyX3JlYWQoYnAsIHBoeSwKKwkJCTB4MDksCisJCQkmYW5fMTAwMF92YWwpOworCisJLyogc2V0IDEwMCBzcGVlZCBhZHZlcnRpc2VtZW50ICovCisJaWYgKCgocGh5LT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykgJiYKKwkJCShwaHktPnNwZWVkX2NhcF9tYXNrICYKKwkJCShQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwME1fRlVMTCB8CisJCQlQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzEwME1fSEFMRikpKSkgeworCQlhbl8xMF8xMDBfdmFsIHw9ICgxPDw3KTsKKwkJLyogRW5hYmxlIGF1dG9uZWcgYW5kIHJlc3RhcnQgYXV0b25lZyBmb3IgbGVnYWN5IHNwZWVkcyAqLworCQlhdXRvbmVnX3ZhbCB8PSAoMTw8OSB8IDE8PDEyKTsKKworCQlpZiAocGh5LT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJYW5fMTBfMTAwX3ZhbCB8PSAoMTw8OCk7CisJCURQKE5FVElGX01TR19MSU5LLCAiQWR2ZXJ0aXNpbmcgMTAwTVxuIik7CisJfQorCisJLyogc2V0IDEwIHNwZWVkIGFkdmVydGlzZW1lbnQgKi8KKwlpZiAoKChwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKSAmJgorCQkJKHBoeS0+c3BlZWRfY2FwX21hc2sgJgorCQkJKFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTBNX0ZVTEwgfAorCQkJUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xME1fSEFMRikpKSkgeworCQlhbl8xMF8xMDBfdmFsIHw9ICgxPDw1KTsKKwkJYXV0b25lZ192YWwgfD0gKDE8PDkgfCAxPDwxMik7CisJCWlmIChwaHktPnJlcV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQlhbl8xMF8xMDBfdmFsIHw9ICgxPDw2KTsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJBZHZlcnRpc2luZyAxME1cbiIpOworCX0KKworCS8qIE9ubHkgMTAvMTAwIGFyZSBhbGxvd2VkIHRvIHdvcmsgaW4gRk9SQ0UgbW9kZSAqLworCWlmIChwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEXzEwMCkgeworCQlhdXRvbmVnX3ZhbCB8PSAoMTw8MTMpOworCQkvKiBFbmFibGVkIEFVVE8tTURJWCB3aGVuIGF1dG9uZWcgaXMgZGlzYWJsZWQgKi8KKwkJYm54MnhfY2wyMl93cml0ZShicCwgcGh5LAorCQkJCTB4MTgsCisJCQkJKDE8PDE1IHwgMTw8OSB8IDc8PDApKTsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIDEwME0gZm9yY2VcbiIpOworCX0KKwlpZiAocGh5LT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF8xMCkgeworCQkvKiBFbmFibGVkIEFVVE8tTURJWCB3aGVuIGF1dG9uZWcgaXMgZGlzYWJsZWQgKi8KKwkJYm54MnhfY2wyMl93cml0ZShicCwgcGh5LAorCQkJCTB4MTgsCisJCQkJKDE8PDE1IHwgMTw8OSB8IDc8PDApKTsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIDEwTSBmb3JjZVxuIik7CisJfQorCisJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHR1cm4gb24gQXV0by1HckVFRW4gKi8KKwlibngyeF9jbDIyX3JlYWQoYnAsIHBoeSwgTURJT19SRUdfR1BIWV9QSFlJRF9MU0IsICZ0ZW1wKTsKKwlpZiAodGVtcCA9PSBNRElPX1JFR19HUEhZX0lEXzU0NjE4U0UpIHsKKwkJaWYgKHBhcmFtcy0+ZmVhdHVyZV9jb25maWdfZmxhZ3MgJgorCQkgICAgRkVBVFVSRV9DT05GSUdfQVVUT0dSRUVFTl9FTkFCTEVEKSB7CisJCQl0ZW1wID0gNjsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiRW5hYmxpbmcgQXV0by1HckVFRW5cbiIpOworCQl9IGVsc2UgeworCQkJdGVtcCA9IDA7CisJCQlEUChORVRJRl9NU0dfTElOSywgIkRpc2FibGluZyBBdXRvLUdyRUVFblxuIik7CisJCX0KKwkJYm54MnhfY2wyMl93cml0ZShicCwgcGh5LAorCQkJCSBNRElPX1JFR19HUEhZX0NMNDVfQUREUl9SRUcsIE1ESU9fQU5fREVWQUQpOworCQlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksCisJCQkJIE1ESU9fUkVHX0dQSFlfQ0w0NV9EQVRBX1JFRywKKwkJCQkgTURJT19SRUdfR1BIWV9FRUVfQURWKTsKKwkJYm54MnhfY2wyMl93cml0ZShicCwgcGh5LAorCQkJCSBNRElPX1JFR19HUEhZX0NMNDVfQUREUl9SRUcsCisJCQkJICgweDEgPDwgMTQpIHwgTURJT19BTl9ERVZBRCk7CisJCWJueDJ4X2NsMjJfd3JpdGUoYnAsIHBoeSwKKwkJCQkgTURJT19SRUdfR1BIWV9DTDQ1X0RBVEFfUkVHLAorCQkJCSB0ZW1wKTsKKwl9CisKKwlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksCisJCQkweDA0LAorCQkJYW5fMTBfMTAwX3ZhbCB8IGZjX3ZhbCk7CisKKwlpZiAocGh5LT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQlhdXRvbmVnX3ZhbCB8PSAoMTw8OCk7CisKKwlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksCisJCQlNRElPX1BNQV9SRUdfQ1RSTCwgYXV0b25lZ192YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4XzU0NjE4c2Vfc2V0X2xpbmtfbGVkKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgICAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHU4IG1vZGUpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJRFAoTkVUSUZfTVNHX0xJTkssICI1NDYxOFNFIHNldCBsaW5rIGxlZCAobW9kZT0leClcbiIsIG1vZGUpOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTEVEX01PREVfRlJPTlRfUEFORUxfT0ZGOgorCWNhc2UgTEVEX01PREVfT0ZGOgorCWNhc2UgTEVEX01PREVfT1BFUjoKKwljYXNlIExFRF9NT0RFX09OOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4XzU0NjE4c2VfbGlua19yZXNldChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MzIgY2ZnX3BpbjsKKwl1OCBwb3J0OworCisJLyogVGhpcyB3b3JrcyB3aXRoIEUzIG9ubHksIG5vIG5lZWQgdG8gY2hlY2sgdGhlIGNoaXAKKwkgICBiZWZvcmUgZGV0ZXJtaW5pbmcgdGhlIHBvcnQuICovCisJcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwljZmdfcGluID0gKFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJCW9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCisJCQlkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twb3J0XS5lM19jbW5fcGluX2NmZykpICYKKwkJCVBPUlRfSFdfQ0ZHX0UzX1BIWV9SRVNFVF9NQVNLKSA+PgorCQkJUE9SVF9IV19DRkdfRTNfUEhZX1JFU0VUX1NISUZUOworCisJLyogRHJpdmUgcGluIGxvdyB0byBwdXQgR1BIWSBpbiByZXNldC4gKi8KKwlibngyeF9zZXRfY2ZnX3BpbihicCwgY2ZnX3BpbiwgMCk7Cit9CisKK3N0YXRpYyB1OCBibngyeF81NDYxOHNlX3JlYWRfc3RhdHVzKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkJICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IHZhbDsKKwl1OCBsaW5rX3VwID0gMDsKKwl1MTYgbGVnYWN5X3N0YXR1cywgbGVnYWN5X3NwZWVkOworCisJLyogR2V0IHNwZWVkIG9wZXJhdGlvbiBzdGF0dXMgKi8KKwlibngyeF9jbDIyX3JlYWQoYnAsIHBoeSwKKwkJCTB4MTksCisJCQkmbGVnYWN5X3N0YXR1cyk7CisJRFAoTkVUSUZfTVNHX0xJTkssICI1NDYxOFNFIHJlYWRfc3RhdHVzOiAweCV4XG4iLCBsZWdhY3lfc3RhdHVzKTsKKworCS8qIFJlYWQgc3RhdHVzIHRvIGNsZWFyIHRoZSBQSFkgaW50ZXJydXB0LiAqLworCWJueDJ4X2NsMjJfcmVhZChicCwgcGh5LAorCQkJTURJT19SRUdfSU5UUl9TVEFUVVMsCisJCQkmdmFsKTsKKworCWxpbmtfdXAgPSAoKGxlZ2FjeV9zdGF0dXMgJiAoMTw8MikpID09ICgxPDwyKSk7CisKKwlpZiAobGlua191cCkgeworCQlsZWdhY3lfc3BlZWQgPSAobGVnYWN5X3N0YXR1cyAmICg3PDw4KSk7CisJCWlmIChsZWdhY3lfc3BlZWQgPT0gKDc8PDgpKSB7CisJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDsKKwkJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQl9IGVsc2UgaWYgKGxlZ2FjeV9zcGVlZCA9PSAoNjw8OCkpIHsKKwkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOworCQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCX0gZWxzZSBpZiAobGVnYWN5X3NwZWVkID09ICg1PDw4KSkgeworCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDsKKwkJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQl9CisJCS8qIE9taXR0aW5nIDEwMEJhc2UtVDQgZm9yIG5vdyAqLworCQllbHNlIGlmIChsZWdhY3lfc3BlZWQgPT0gKDM8PDgpKSB7CisJCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwOworCQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCX0gZWxzZSBpZiAobGVnYWN5X3NwZWVkID09ICgyPDw4KSkgeworCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwOworCQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCX0gZWxzZSBpZiAobGVnYWN5X3NwZWVkID09ICgxPDw4KSkgeworCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwOworCQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCX0gZWxzZSAvKiBTaG91bGQgbm90IGhhcHBlbiAqLworCQkJdmFycy0+bGluZV9zcGVlZCA9IDA7CisKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJMaW5rIGlzIHVwIGluICVkTWJwcywiCisJCQkgICAiIGlzX2R1cGxleF9mdWxsPSAlZFxuIiwgdmFycy0+bGluZV9zcGVlZCwKKwkJCSAgICh2YXJzLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpKTsKKworCQkvKiBDaGVjayBsZWdhY3kgc3BlZWQgQU4gcmVzb2x1dGlvbiAqLworCQlibngyeF9jbDIyX3JlYWQoYnAsIHBoeSwKKwkJCQkweDAxLAorCQkJCSZ2YWwpOworCQlpZiAodmFsICYgKDE8PDUpKQorCQkJdmFycy0+bGlua19zdGF0dXMgfD0KKwkJCQlMSU5LX1NUQVRVU19BVVRPX05FR09USUFURV9DT01QTEVURTsKKwkJYm54MnhfY2wyMl9yZWFkKGJwLCBwaHksCisJCQkJMHgwNiwKKwkJCQkmdmFsKTsKKwkJaWYgKCh2YWwgJiAoMTw8MCkpID09IDApCisJCQl2YXJzLT5saW5rX3N0YXR1cyB8PQorCQkJCUxJTktfU1RBVFVTX1BBUkFMTEVMX0RFVEVDVElPTl9VU0VEOworCisJCURQKE5FVElGX01TR19MSU5LLCAiQkNNNTQ2MThTRTogbGluayBzcGVlZCBpcyAlZFxuIiwKKwkJCSAgIHZhcnMtPmxpbmVfc3BlZWQpOworCisJCS8qIFJlcG9ydCB3aGV0aGVyIEVFRSBpcyByZXNvbHZlZC4gKi8KKwkJYm54MnhfY2wyMl9yZWFkKGJwLCBwaHksIE1ESU9fUkVHX0dQSFlfUEhZSURfTFNCLCAmdmFsKTsKKwkJaWYgKHZhbCA9PSBNRElPX1JFR19HUEhZX0lEXzU0NjE4U0UpIHsKKwkJCWlmICh2YXJzLT5saW5rX3N0YXR1cyAmCisJCQkgICAgTElOS19TVEFUVVNfQVVUT19ORUdPVElBVEVfQ09NUExFVEUpCisJCQkJdmFsID0gMDsKKwkJCWVsc2UgeworCQkJCWJueDJ4X2NsMjJfd3JpdGUoYnAsIHBoeSwKKwkJCQkJTURJT19SRUdfR1BIWV9DTDQ1X0FERFJfUkVHLAorCQkJCQlNRElPX0FOX0RFVkFEKTsKKwkJCQlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksCisJCQkJCU1ESU9fUkVHX0dQSFlfQ0w0NV9EQVRBX1JFRywKKwkJCQkJTURJT19SRUdfR1BIWV9FRUVfUkVTT0xWRUQpOworCQkJCWJueDJ4X2NsMjJfd3JpdGUoYnAsIHBoeSwKKwkJCQkJTURJT19SRUdfR1BIWV9DTDQ1X0FERFJfUkVHLAorCQkJCQkoMHgxIDw8IDE0KSB8IE1ESU9fQU5fREVWQUQpOworCQkJCWJueDJ4X2NsMjJfcmVhZChicCwgcGh5LAorCQkJCQlNRElPX1JFR19HUEhZX0NMNDVfREFUQV9SRUcsCisJCQkJCSZ2YWwpOworCQkJfQorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJFRUUgcmVzb2x1dGlvbjogMHgleFxuIiwgdmFsKTsKKwkJfQorCisJCWJueDJ4X2V4dF9waHlfcmVzb2x2ZV9mYyhwaHksIHBhcmFtcywgdmFycyk7CisJfQorCXJldHVybiBsaW5rX3VwOworfQorCitzdGF0aWMgdm9pZCBibngyeF81NDYxOHNlX2NvbmZpZ19sb29wYmFjayhzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCisJCQkJCSAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IHZhbDsKKwl1MzIgdW1hY19iYXNlID0gcGFyYW1zLT5wb3J0ID8gR1JDQkFTRV9VTUFDMSA6IEdSQ0JBU0VfVU1BQzA7CisKKwlEUChORVRJRl9NU0dfTElOSywgIjJQTUEvUE1EIGV4dF9waHlfbG9vcGJhY2s6IDU0NjE4c2VcbiIpOworCisJLyogRW5hYmxlIG1hc3Rlci9zbGF2ZSBtYW51YWwgbW1vZGUgYW5kIHNldCB0byBtYXN0ZXIgKi8KKwkvKiBtaWkgd3JpdGUgOSBbYml0cyBzZXQgMTEgMTJdICovCisJYm54MnhfY2wyMl93cml0ZShicCwgcGh5LCAweDA5LCAzPDwxMSk7CisKKwkvKiBmb3JjZWQgMUcgYW5kIGRpc2FibGUgYXV0b25lZyAqLworCS8qIHNldCB2YWwgW21paSByZWFkIDBdICovCisJLyogc2V0IHZhbCBbZXhwciAkdmFsICYgW2JpdHMgY2xlYXIgNiAxMiAxM11dICovCisJLyogc2V0IHZhbCBbZXhwciAkdmFsIHwgW2JpdHMgc2V0IDYgOF1dICovCisJLyogbWlpIHdyaXRlIDAgJHZhbCAqLworCWJueDJ4X2NsMjJfcmVhZChicCwgcGh5LCAweDAwLCAmdmFsKTsKKwl2YWwgJj0gfigoMTw8NikgfCAoMTw8MTIpIHwgKDE8PDEzKSk7CisJdmFsIHw9ICgxPDw2KSB8ICgxPDw4KTsKKwlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksIDB4MDAsIHZhbCk7CisKKwkvKiBTZXQgZXh0ZXJuYWwgbG9vcGJhY2sgYW5kIFR4IHVzaW5nIDZkQiBjb2RpbmcgKi8KKwkvKiBtaWkgd3JpdGUgMHgxOCA3ICovCisJLyogc2V0IHZhbCBbbWlpIHJlYWQgMHgxOF0gKi8KKwkvKiBtaWkgd3JpdGUgMHgxOCBbZXhwciAkdmFsIHwgW2JpdHMgc2V0IDEwIDE1XV0gKi8KKwlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksIDB4MTgsIDcpOworCWJueDJ4X2NsMjJfcmVhZChicCwgcGh5LCAweDE4LCAmdmFsKTsKKwlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksIDB4MTgsIHZhbCB8ICgxPDwxMCkgfCAoMTw8MTUpKTsKKworCS8qIFRoaXMgcmVnaXN0ZXIgb3BlbnMgdGhlIGdhdGUgZm9yIHRoZSBVTUFDIGRlc3BpdGUgaXRzIG5hbWUgKi8KKwlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0VNQUMwX1BPUlQgKyBwYXJhbXMtPnBvcnQqNCwgMSk7CisKKwkvKgorCSAqIE1heGltdW0gRnJhbWUgTGVuZ3RoIChSVykuIERlZmluZXMgYSAxNC1CaXQgbWF4aW11bSBmcmFtZQorCSAqIGxlbmd0aCB1c2VkIGJ5IHRoZSBNQUMgcmVjZWl2ZSBsb2dpYyB0byBjaGVjayBmcmFtZXMuCisJICovCisJUkVHX1dSKGJwLCB1bWFjX2Jhc2UgKyBVTUFDX1JFR19NQVhGUiwgMHgyNzEwKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCQkJU0ZYNzEwMSBQSFkgU0VDVElPTgkJCSAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02NjQ2LDkgKzEwMzUzLDkgQEAKIAkJCSBNRElPX1hTX0RFVkFELCBNRElPX1hTX1NGWDcxMDFfWEdYU19URVNUMSwgMHgxMDApOwogfQogCi1zdGF0aWMgdTggYm54MnhfNzEwMV9jb25maWdfaW5pdChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCi0JCQkJIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCSBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQorc3RhdGljIGludCBibngyeF83MTAxX2NvbmZpZ19pbml0KHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKIHsKIAl1MTYgZndfdmVyMSwgZndfdmVyMiwgdmFsOwogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwpAQCAtNjY2Miw3ICsxMDM2OSw3IEBACiAJYm54Mnhfd2FpdF9yZXNldF9jb21wbGV0ZShicCwgcGh5LCBwYXJhbXMpOwogCiAJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAotCQkJIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfTEFTSV9DVFJMLCAweDEpOworCQkJIE1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX0NUUkwsIDB4MSk7CiAJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIHRoZSBTRlg3MTAxIExFRCB0byBibGluayBvbiB0cmFmZmljXG4iKTsKIAlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCiAJCQkgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR183MTA3X0xFRF9DTlRMLCAoMTw8MykpOwpAQCAtNjY5NCw5ICsxMDQwMSw5IEBACiAJdTggbGlua191cDsKIAl1MTYgdmFsMSwgdmFsMjsKIAlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKLQkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfTEFTSV9TVEFUVVMsICZ2YWwyKTsKKwkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX1NUQVQsICZ2YWwyKTsKIAlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKLQkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9SRUdfTEFTSV9TVEFUVVMsICZ2YWwxKTsKKwkJCU1ESU9fUE1BX0RFVkFELCBNRElPX1BNQV9MQVNJX1NUQVQsICZ2YWwxKTsKIAlEUChORVRJRl9NU0dfTElOSywgIjEwRy1iYXNlLVQgTEFTSSBzdGF0dXMgMHgleC0+MHgleFxuIiwKIAkJICAgdmFsMiwgdmFsMSk7CiAJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCkBAIC02NzIxLDggKzEwNDI4LDcgQEAKIAlyZXR1cm4gbGlua191cDsKIH0KIAotCi1zdGF0aWMgdTggYm54MnhfNzEwMV9mb3JtYXRfdmVyKHUzMiBzcGlyb21fdmVyLCB1OCAqc3RyLCB1MTYgKmxlbikKK3N0YXRpYyBpbnQgYm54MnhfNzEwMV9mb3JtYXRfdmVyKHUzMiBzcGlyb21fdmVyLCB1OCAqc3RyLCB1MTYgKmxlbikKIHsKIAlpZiAoKmxlbiA8IDUpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjgwMCw5ICsxMDUwNiw4IEBACiBzdGF0aWMgc3RydWN0IGJueDJ4X3BoeSBwaHlfbnVsbCA9IHsKIAkudHlwZQkJPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9OT1RfQ09OTiwKIAkuYWRkcgkJPSAwLAotCS5mbGFncwkJPSBGTEFHU19JTklUX1hHWFNfRklSU1QsCiAJLmRlZl9tZF9kZXZhZAk9IDAsCi0JLnJlc2VydmVkCT0gMCwKKwkuZmxhZ3MJCT0gRkxBR1NfSU5JVF9YR1hTX0ZJUlNULAogCS5yeF9wcmVlbXBoYXNpcwk9IHsweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9LAogCS50eF9wcmVlbXBoYXNpcwk9IHsweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9LAogCS5tZGlvX2N0cmwJPSAwLApAQCAtNjgyNyw5ICsxMDUzMiw4IEBACiBzdGF0aWMgc3RydWN0IGJueDJ4X3BoeSBwaHlfc2VyZGVzID0gewogCS50eXBlCQk9IFBPUlRfSFdfQ0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfRElSRUNULAogCS5hZGRyCQk9IDB4ZmYsCi0JLmZsYWdzCQk9IDAsCiAJLmRlZl9tZF9kZXZhZAk9IDAsCi0JLnJlc2VydmVkCT0gMCwKKwkuZmxhZ3MJCT0gMCwKIAkucnhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkudHhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkubWRpb19jdHJsCT0gMCwKQEAgLTY4NDMsMTQgKzEwNTQ3LDE0IEBACiAJCQkgICBTVVBQT1JURURfQXV0b25lZyB8CiAJCQkgICBTVVBQT1JURURfUGF1c2UgfAogCQkJICAgU1VQUE9SVEVEX0FzeW1fUGF1c2UpLAotCS5tZWRpYV90eXBlCT0gRVRIX1BIWV9VTlNQRUNJRklFRCwKKwkubWVkaWFfdHlwZQk9IEVUSF9QSFlfQkFTRV9ULAogCS52ZXJfYWRkcgk9IDAsCiAJLnJlcV9mbG93X2N0cmwJPSAwLAogCS5yZXFfbGluZV9zcGVlZAk9IDAsCiAJLnNwZWVkX2NhcF9tYXNrCT0gMCwKIAkucmVxX2R1cGxleAk9IDAsCiAJLnJzcnYJCT0gMCwKLQkuY29uZmlnX2luaXQJPSAoY29uZmlnX2luaXRfdClibngyeF9pbml0X3NlcmRlcywKKwkuY29uZmlnX2luaXQJPSAoY29uZmlnX2luaXRfdClibngyeF94Z3hzX2NvbmZpZ19pbml0LAogCS5yZWFkX3N0YXR1cwk9IChyZWFkX3N0YXR1c190KWJueDJ4X2xpbmtfc2V0dGluZ3Nfc3RhdHVzLAogCS5saW5rX3Jlc2V0CT0gKGxpbmtfcmVzZXRfdClibngyeF9pbnRfbGlua19yZXNldCwKIAkuY29uZmlnX2xvb3BiYWNrID0gKGNvbmZpZ19sb29wYmFja190KU5VTEwsCkBAIC02ODYzLDkgKzEwNTY3LDggQEAKIHN0YXRpYyBzdHJ1Y3QgYm54MnhfcGh5IHBoeV94Z3hzID0gewogCS50eXBlCQk9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCwKIAkuYWRkcgkJPSAweGZmLAotCS5mbGFncwkJPSAwLAogCS5kZWZfbWRfZGV2YWQJPSAwLAotCS5yZXNlcnZlZAk9IDAsCisJLmZsYWdzCQk9IDAsCiAJLnJ4X3ByZWVtcGhhc2lzCT0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZn0sCiAJLnR4X3ByZWVtcGhhc2lzCT0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZn0sCiAJLm1kaW9fY3RybAk9IDAsCkBAIC02ODgwLDE0ICsxMDU4MywxNCBAQAogCQkJICAgU1VQUE9SVEVEX0F1dG9uZWcgfAogCQkJICAgU1VQUE9SVEVEX1BhdXNlIHwKIAkJCSAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKSwKLQkubWVkaWFfdHlwZQk9IEVUSF9QSFlfVU5TUEVDSUZJRUQsCisJLm1lZGlhX3R5cGUJPSBFVEhfUEhZX0NYNCwKIAkudmVyX2FkZHIJPSAwLAogCS5yZXFfZmxvd19jdHJsCT0gMCwKIAkucmVxX2xpbmVfc3BlZWQJPSAwLAogCS5zcGVlZF9jYXBfbWFzawk9IDAsCiAJLnJlcV9kdXBsZXgJPSAwLAogCS5yc3J2CQk9IDAsCi0JLmNvbmZpZ19pbml0CT0gKGNvbmZpZ19pbml0X3QpYm54MnhfaW5pdF94Z3hzLAorCS5jb25maWdfaW5pdAk9IChjb25maWdfaW5pdF90KWJueDJ4X3hneHNfY29uZmlnX2luaXQsCiAJLnJlYWRfc3RhdHVzCT0gKHJlYWRfc3RhdHVzX3QpYm54MnhfbGlua19zZXR0aW5nc19zdGF0dXMsCiAJLmxpbmtfcmVzZXQJPSAobGlua19yZXNldF90KWJueDJ4X2ludF9saW5rX3Jlc2V0LAogCS5jb25maWdfbG9vcGJhY2sgPSAoY29uZmlnX2xvb3BiYWNrX3QpYm54Mnhfc2V0X3hneHNfbG9vcGJhY2ssCkBAIC02ODk2LDEzICsxMDU5OSw0OSBAQAogCS5zZXRfbGlua19sZWQJPSAoc2V0X2xpbmtfbGVkX3QpTlVMTCwKIAkucGh5X3NwZWNpZmljX2Z1bmMgPSAocGh5X3NwZWNpZmljX2Z1bmNfdClOVUxMCiB9Oworc3RhdGljIHN0cnVjdCBibngyeF9waHkgcGh5X3dhcnBjb3JlID0geworCS50eXBlCQk9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJUkVDVCwKKwkuYWRkcgkJPSAweGZmLAorCS5kZWZfbWRfZGV2YWQJPSAwLAorCS5mbGFncwkJPSBGTEFHU19IV19MT0NLX1JFUVVJUkVELAorCS5yeF9wcmVlbXBoYXNpcwk9IHsweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9LAorCS50eF9wcmVlbXBoYXNpcwk9IHsweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9LAorCS5tZGlvX2N0cmwJPSAwLAorCS5zdXBwb3J0ZWQJPSAoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8CisJCQkgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJICAgICBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CisJCQkgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCSAgICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCSAgICAgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8CisJCQkgICAgIFNVUFBPUlRFRF8yMDAwMGJhc2VLUjJfRnVsbCB8CisJCQkgICAgIFNVUFBPUlRFRF8yMDAwMGJhc2VNTEQyX0Z1bGwgfAorCQkJICAgICBTVVBQT1JURURfRklCUkUgfAorCQkJICAgICBTVVBQT1JURURfQXV0b25lZyB8CisJCQkgICAgIFNVUFBPUlRFRF9QYXVzZSB8CisJCQkgICAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKSwKKwkubWVkaWFfdHlwZQk9IEVUSF9QSFlfVU5TUEVDSUZJRUQsCisJLnZlcl9hZGRyCT0gMCwKKwkucmVxX2Zsb3dfY3RybAk9IDAsCisJLnJlcV9saW5lX3NwZWVkCT0gMCwKKwkuc3BlZWRfY2FwX21hc2sJPSAwLAorCS8qIHJlcV9kdXBsZXggPSAqLzAsCisJLyogcnNydiA9ICovMCwKKwkuY29uZmlnX2luaXQJPSAoY29uZmlnX2luaXRfdClibngyeF93YXJwY29yZV9jb25maWdfaW5pdCwKKwkucmVhZF9zdGF0dXMJPSAocmVhZF9zdGF0dXNfdClibngyeF93YXJwY29yZV9yZWFkX3N0YXR1cywKKwkubGlua19yZXNldAk9IChsaW5rX3Jlc2V0X3QpYm54Mnhfd2FycGNvcmVfbGlua19yZXNldCwKKwkuY29uZmlnX2xvb3BiYWNrID0gKGNvbmZpZ19sb29wYmFja190KWJueDJ4X3NldF93YXJwY29yZV9sb29wYmFjaywKKwkuZm9ybWF0X2Z3X3Zlcgk9IChmb3JtYXRfZndfdmVyX3QpTlVMTCwKKwkuaHdfcmVzZXQJPSAoaHdfcmVzZXRfdClibngyeF93YXJwY29yZV9od19yZXNldCwKKwkuc2V0X2xpbmtfbGVkCT0gKHNldF9saW5rX2xlZF90KU5VTEwsCisJLnBoeV9zcGVjaWZpY19mdW5jID0gKHBoeV9zcGVjaWZpY19mdW5jX3QpTlVMTAorfTsKKwogCiBzdGF0aWMgc3RydWN0IGJueDJ4X3BoeSBwaHlfNzEwMSA9IHsKIAkudHlwZQkJPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxLAogCS5hZGRyCQk9IDB4ZmYsCi0JLmZsYWdzCQk9IEZMQUdTX0ZBTl9GQUlMVVJFX0RFVF9SRVEsCiAJLmRlZl9tZF9kZXZhZAk9IDAsCi0JLnJlc2VydmVkCT0gMCwKKwkuZmxhZ3MJCT0gRkxBR1NfRkFOX0ZBSUxVUkVfREVUX1JFUSwKIAkucnhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkudHhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkubWRpb19jdHJsCT0gMCwKQEAgLTY5MzAsOSArMTA2NjksOCBAQAogc3RhdGljIHN0cnVjdCBibngyeF9waHkgcGh5XzgwNzMgPSB7CiAJLnR5cGUJCT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODA3MywKIAkuYWRkcgkJPSAweGZmLAotCS5mbGFncwkJPSBGTEFHU19IV19MT0NLX1JFUVVJUkVELAogCS5kZWZfbWRfZGV2YWQJPSAwLAotCS5yZXNlcnZlZAk9IDAsCisJLmZsYWdzCQk9IEZMQUdTX0hXX0xPQ0tfUkVRVUlSRUQsCiAJLnJ4X3ByZWVtcGhhc2lzCT0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZn0sCiAJLnR4X3ByZWVtcGhhc2lzCT0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZn0sCiAJLm1kaW9fY3RybAk9IDAsCkBAIC02OTQzLDcgKzEwNjgxLDcgQEAKIAkJCSAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKIAkJCSAgIFNVUFBPUlRFRF9QYXVzZSB8CiAJCQkgICBTVVBQT1JURURfQXN5bV9QYXVzZSksCi0JLm1lZGlhX3R5cGUJPSBFVEhfUEhZX1VOU1BFQ0lGSUVELAorCS5tZWRpYV90eXBlCT0gRVRIX1BIWV9LUiwKIAkudmVyX2FkZHIJPSAwLAogCS5yZXFfZmxvd19jdHJsCT0gMCwKIAkucmVxX2xpbmVfc3BlZWQJPSAwLApAQCAtNjk2Miw5ICsxMDcwMCw4IEBACiBzdGF0aWMgc3RydWN0IGJueDJ4X3BoeSBwaHlfODcwNSA9IHsKIAkudHlwZQkJPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA1LAogCS5hZGRyCQk9IDB4ZmYsCi0JLmZsYWdzCQk9IEZMQUdTX0lOSVRfWEdYU19GSVJTVCwKIAkuZGVmX21kX2RldmFkCT0gMCwKLQkucmVzZXJ2ZWQJPSAwLAorCS5mbGFncwkJPSBGTEFHU19JTklUX1hHWFNfRklSU1QsCiAJLnJ4X3ByZWVtcGhhc2lzCT0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZn0sCiAJLnR4X3ByZWVtcGhhc2lzCT0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZn0sCiAJLm1kaW9fY3RybAk9IDAsCkBAIC02OTkxLDkgKzEwNzI4LDggQEAKIHN0YXRpYyBzdHJ1Y3QgYm54MnhfcGh5IHBoeV84NzA2ID0gewogCS50eXBlCQk9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDYsCiAJLmFkZHIJCT0gMHhmZiwKLQkuZmxhZ3MJCT0gRkxBR1NfSU5JVF9YR1hTX0ZJUlNULAogCS5kZWZfbWRfZGV2YWQJPSAwLAotCS5yZXNlcnZlZAk9IDAsCisJLmZsYWdzCQk9IEZMQUdTX0lOSVRfWEdYU19GSVJTVCwKIAkucnhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkudHhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkubWRpb19jdHJsCT0gMCwKQEAgLTcwMjIsMTAgKzEwNzU4LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgYm54MnhfcGh5IHBoeV84NzI2ID0gewogCS50eXBlCQk9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjYsCiAJLmFkZHIJCT0gMHhmZiwKKwkuZGVmX21kX2RldmFkCT0gMCwKIAkuZmxhZ3MJCT0gKEZMQUdTX0hXX0xPQ0tfUkVRVUlSRUQgfAogCQkJICAgRkxBR1NfSU5JVF9YR1hTX0ZJUlNUKSwKLQkuZGVmX21kX2RldmFkCT0gMCwKLQkucmVzZXJ2ZWQJPSAwLAogCS5yeF9wcmVlbXBoYXNpcwk9IHsweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9LAogCS50eF9wcmVlbXBoYXNpcwk9IHsweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9LAogCS5tZGlvX2N0cmwJPSAwLApAQCAtNzAzNSw3ICsxMDc3MCw3IEBACiAJCQkgICBTVVBQT1JURURfRklCUkUgfAogCQkJICAgU1VQUE9SVEVEX1BhdXNlIHwKIAkJCSAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKSwKLQkubWVkaWFfdHlwZQk9IEVUSF9QSFlfU0ZQX0ZJQkVSLAorCS5tZWRpYV90eXBlCT0gRVRIX1BIWV9OT1RfUFJFU0VOVCwKIAkudmVyX2FkZHIJPSAwLAogCS5yZXFfZmxvd19jdHJsCT0gMCwKIAkucmVxX2xpbmVfc3BlZWQJPSAwLApAQCAtNzA1NSw5ICsxMDc5MCw4IEBACiBzdGF0aWMgc3RydWN0IGJueDJ4X3BoeSBwaHlfODcyNyA9IHsKIAkudHlwZQkJPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAogCS5hZGRyCQk9IDB4ZmYsCi0JLmZsYWdzCQk9IEZMQUdTX0ZBTl9GQUlMVVJFX0RFVF9SRVEsCiAJLmRlZl9tZF9kZXZhZAk9IDAsCi0JLnJlc2VydmVkCT0gMCwKKwkuZmxhZ3MJCT0gRkxBR1NfRkFOX0ZBSUxVUkVfREVUX1JFUSwKIAkucnhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkudHhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkubWRpb19jdHJsCT0gMCwKQEAgLTcwNjYsNyArMTA4MDAsNyBAQAogCQkJICAgU1VQUE9SVEVEX0ZJQlJFIHwKIAkJCSAgIFNVUFBPUlRFRF9QYXVzZSB8CiAJCQkgICBTVVBQT1JURURfQXN5bV9QYXVzZSksCi0JLm1lZGlhX3R5cGUJPSBFVEhfUEhZX1NGUF9GSUJFUiwKKwkubWVkaWFfdHlwZQk9IEVUSF9QSFlfTk9UX1BSRVNFTlQsCiAJLnZlcl9hZGRyCT0gMCwKIAkucmVxX2Zsb3dfY3RybAk9IDAsCiAJLnJlcV9saW5lX3NwZWVkCT0gMCwKQEAgLTcwODUsMTAgKzEwODE5LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgYm54MnhfcGh5IHBoeV84NDgxID0gewogCS50eXBlCQk9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODEsCiAJLmFkZHIJCT0gMHhmZiwKKwkuZGVmX21kX2RldmFkCT0gMCwKIAkuZmxhZ3MJCT0gRkxBR1NfRkFOX0ZBSUxVUkVfREVUX1JFUSB8CiAJCQkgIEZMQUdTX1JFQVJNX0xBVENIX1NJR05BTCwKLQkuZGVmX21kX2RldmFkCT0gMCwKLQkucmVzZXJ2ZWQJPSAwLAogCS5yeF9wcmVlbXBoYXNpcwk9IHsweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9LAogCS50eF9wcmVlbXBoYXNpcwk9IHsweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9LAogCS5tZGlvX2N0cmwJPSAwLApAQCAtNzEyMiwxMCArMTA4NTUsOSBAQAogc3RhdGljIHN0cnVjdCBibngyeF9waHkgcGh5Xzg0ODIzID0gewogCS50eXBlCQk9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODIzLAogCS5hZGRyCQk9IDB4ZmYsCisJLmRlZl9tZF9kZXZhZAk9IDAsCiAJLmZsYWdzCQk9IEZMQUdTX0ZBTl9GQUlMVVJFX0RFVF9SRVEgfAogCQkJICBGTEFHU19SRUFSTV9MQVRDSF9TSUdOQUwsCi0JLmRlZl9tZF9kZXZhZAk9IDAsCi0JLnJlc2VydmVkCT0gMCwKIAkucnhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkudHhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkubWRpb19jdHJsCT0gMCwKQEAgLTcxNTksMTYgKzEwODkxLDEzIEBACiBzdGF0aWMgc3RydWN0IGJueDJ4X3BoeSBwaHlfODQ4MzMgPSB7CiAJLnR5cGUJCT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODQ4MzMsCiAJLmFkZHIJCT0gMHhmZiwKKwkuZGVmX21kX2RldmFkCT0gMCwKIAkuZmxhZ3MJCT0gRkxBR1NfRkFOX0ZBSUxVUkVfREVUX1JFUSB8CiAJCQkgICAgRkxBR1NfUkVBUk1fTEFUQ0hfU0lHTkFMLAotCS5kZWZfbWRfZGV2YWQJPSAwLAotCS5yZXNlcnZlZAk9IDAsCiAJLnJ4X3ByZWVtcGhhc2lzCT0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZn0sCiAJLnR4X3ByZWVtcGhhc2lzCT0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZn0sCiAJLm1kaW9fY3RybAk9IDAsCi0JLnN1cHBvcnRlZAk9IChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKLQkJCSAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAotCQkJICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCS5zdXBwb3J0ZWQJPSAoU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAogCQkJICAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAogCQkJICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKIAkJCSAgIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfApAQCAtNzE4OCwxMSArMTA5MTcsNDQgQEAKIAkubGlua19yZXNldAk9IChsaW5rX3Jlc2V0X3QpYm54MnhfODQ4eDNfbGlua19yZXNldCwKIAkuY29uZmlnX2xvb3BiYWNrID0gKGNvbmZpZ19sb29wYmFja190KU5VTEwsCiAJLmZvcm1hdF9md192ZXIJPSAoZm9ybWF0X2Z3X3Zlcl90KWJueDJ4Xzg0OHh4X2Zvcm1hdF92ZXIsCi0JLmh3X3Jlc2V0CT0gKGh3X3Jlc2V0X3QpTlVMTCwKKwkuaHdfcmVzZXQJPSAoaHdfcmVzZXRfdClibngyeF84NDgzM19od19yZXNldF9waHksCiAJLnNldF9saW5rX2xlZAk9IChzZXRfbGlua19sZWRfdClibngyeF84NDh4eF9zZXRfbGlua19sZWQsCiAJLnBoeV9zcGVjaWZpY19mdW5jID0gKHBoeV9zcGVjaWZpY19mdW5jX3QpTlVMTAogfTsKIAorc3RhdGljIHN0cnVjdCBibngyeF9waHkgcGh5XzU0NjE4c2UgPSB7CisJLnR5cGUJCT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNNTQ2MThTRSwKKwkuYWRkcgkJPSAweGZmLAorCS5kZWZfbWRfZGV2YWQJPSAwLAorCS5mbGFncwkJPSBGTEFHU19JTklUX1hHWFNfRklSU1QsCisJLnJ4X3ByZWVtcGhhc2lzCT0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZn0sCisJLnR4X3ByZWVtcGhhc2lzCT0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZn0sCisJLm1kaW9fY3RybAk9IDAsCisJLnN1cHBvcnRlZAk9IChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCSAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQkJICAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkJICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCSAgIFNVUFBPUlRFRF9UUCB8CisJCQkgICBTVVBQT1JURURfQXV0b25lZyB8CisJCQkgICBTVVBQT1JURURfUGF1c2UgfAorCQkJICAgU1VQUE9SVEVEX0FzeW1fUGF1c2UpLAorCS5tZWRpYV90eXBlCT0gRVRIX1BIWV9CQVNFX1QsCisJLnZlcl9hZGRyCT0gMCwKKwkucmVxX2Zsb3dfY3RybAk9IDAsCisJLnJlcV9saW5lX3NwZWVkCT0gMCwKKwkuc3BlZWRfY2FwX21hc2sJPSAwLAorCS8qIHJlcV9kdXBsZXggPSAqLzAsCisJLyogcnNydiA9ICovMCwKKwkuY29uZmlnX2luaXQJPSAoY29uZmlnX2luaXRfdClibngyeF81NDYxOHNlX2NvbmZpZ19pbml0LAorCS5yZWFkX3N0YXR1cwk9IChyZWFkX3N0YXR1c190KWJueDJ4XzU0NjE4c2VfcmVhZF9zdGF0dXMsCisJLmxpbmtfcmVzZXQJPSAobGlua19yZXNldF90KWJueDJ4XzU0NjE4c2VfbGlua19yZXNldCwKKwkuY29uZmlnX2xvb3BiYWNrID0gKGNvbmZpZ19sb29wYmFja190KWJueDJ4XzU0NjE4c2VfY29uZmlnX2xvb3BiYWNrLAorCS5mb3JtYXRfZndfdmVyCT0gKGZvcm1hdF9md192ZXJfdClOVUxMLAorCS5od19yZXNldAk9IChod19yZXNldF90KU5VTEwsCisJLnNldF9saW5rX2xlZAk9IChzZXRfbGlua19sZWRfdClibngyeF81NDYxOHNlX3NldF9saW5rX2xlZCwKKwkucGh5X3NwZWNpZmljX2Z1bmMgPSAocGh5X3NwZWNpZmljX2Z1bmNfdClOVUxMCit9OwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUG9wdWxhdGUgdGhlIHBoeSBhY2NvcmRpbmcuIE1haW4gZnVuY3Rpb246IGJueDJ4X3BvcHVsYXRlX3BoeSAgICovCkBAIC03MjU5LDggKzExMDIxLDggQEAKIAogCXJldHVybiBleHRfcGh5X2NvbmZpZzsKIH0KLXN0YXRpYyB1OCBibngyeF9wb3B1bGF0ZV9pbnRfcGh5KHN0cnVjdCBibngyeCAqYnAsIHUzMiBzaG1lbV9iYXNlLCB1OCBwb3J0LAotCQkJCSBzdHJ1Y3QgYm54MnhfcGh5ICpwaHkpCitzdGF0aWMgaW50IGJueDJ4X3BvcHVsYXRlX2ludF9waHkoc3RydWN0IGJueDJ4ICpicCwgdTMyIHNobWVtX2Jhc2UsIHU4IHBvcnQsCisJCQkJICBzdHJ1Y3QgYm54MnhfcGh5ICpwaHkpCiB7CiAJdTMyIHBoeV9hZGRyOwogCXUzMiBjaGlwX2lkOwpAQCAtNzI2OSwyMiArMTEwMzEsMTA1IEBACiAJCQlkZXZfaW5mby5wb3J0X2ZlYXR1cmVfY29uZmlnW3BvcnRdLmxpbmtfY29uZmlnKSkgJgogCQkJICBQT1JUX0ZFQVRVUkVfQ09OTkVDVEVEX1NXSVRDSF9NQVNLKTsKIAljaGlwX2lkID0gUkVHX1JEKGJwLCBNSVNDX1JFR19DSElQX05VTSkgPDwgMTY7Ci0Jc3dpdGNoIChzd2l0Y2hfY2ZnKSB7Ci0JY2FzZSBTV0lUQ0hfQ0ZHXzFHOgorCURQKE5FVElGX01TR19MSU5LLCAiOmNoaXBfaWQgPSAweCV4XG4iLCBjaGlwX2lkKTsKKwlpZiAoVVNFU19XQVJQQ09SRShicCkpIHsKKwkJdTMyIHNlcmRlc19uZXRfaWY7CiAJCXBoeV9hZGRyID0gUkVHX1JEKGJwLAotCQkJCQlOSUdfUkVHX1NFUkRFUzBfQ1RSTF9QSFlfQUREUiArCi0JCQkJCXBvcnQgKiAweDEwKTsKLQkJKnBoeSA9IHBoeV9zZXJkZXM7Ci0JCWJyZWFrOwotCWNhc2UgU1dJVENIX0NGR18xMEc6Ci0JCXBoeV9hZGRyID0gUkVHX1JEKGJwLAotCQkJCQlOSUdfUkVHX1hHWFMwX0NUUkxfUEhZX0FERFIgKwotCQkJCQlwb3J0ICogMHgxOCk7Ci0JCSpwaHkgPSBwaHlfeGd4czsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJJbnZhbGlkIHN3aXRjaF9jZmdcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkgIE1JU0NfUkVHX1dDMF9DVFJMX1BIWV9BRERSKTsKKwkJKnBoeSA9IHBoeV93YXJwY29yZTsKKwkJaWYgKFJFR19SRChicCwgTUlTQ19SRUdfUE9SVDRNT0RFX0VOX09WV1IpID09IDB4MykKKwkJCXBoeS0+ZmxhZ3MgfD0gRkxBR1NfNF9QT1JUX01PREU7CisJCWVsc2UKKwkJCXBoeS0+ZmxhZ3MgJj0gfkZMQUdTXzRfUE9SVF9NT0RFOworCQkJLyogQ2hlY2sgRHVhbCBtb2RlICovCisJCXNlcmRlc19uZXRfaWYgPSAoUkVHX1JEKGJwLCBzaG1lbV9iYXNlICsKKwkJCQkJb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwgZGV2X2luZm8uCisJCQkJCXBvcnRfaHdfY29uZmlnW3BvcnRdLmRlZmF1bHRfY2ZnKSkgJgorCQkJCSBQT1JUX0hXX0NGR19ORVRfU0VSREVTX0lGX01BU0spOworCQkvKgorCQkgKiBTZXQgdGhlIGFwcHJvcHJpYXRlIHN1cHBvcnRlZCBhbmQgZmxhZ3MgaW5kaWNhdGlvbnMgcGVyCisJCSAqIGludGVyZmFjZSB0eXBlIG9mIHRoZSBjaGlwCisJCSAqLworCQlzd2l0Y2ggKHNlcmRlc19uZXRfaWYpIHsKKwkJY2FzZSBQT1JUX0hXX0NGR19ORVRfU0VSREVTX0lGX1NHTUlJOgorCQkJcGh5LT5zdXBwb3J0ZWQgJj0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkJCQkgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCQkJICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQkJCQkgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkJCSAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgIFNVUFBPUlRFRF9GSUJSRSB8CisJCQkJCSAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJCQkJICAgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCQkJICAgU1VQUE9SVEVEX0FzeW1fUGF1c2UpOworCQkJcGh5LT5tZWRpYV90eXBlID0gRVRIX1BIWV9CQVNFX1Q7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUX0hXX0NGR19ORVRfU0VSREVTX0lGX1hGSToKKwkJCXBoeS0+bWVkaWFfdHlwZSA9IEVUSF9QSFlfWEZQX0ZJQkVSOworCQkJYnJlYWs7CisJCWNhc2UgUE9SVF9IV19DRkdfTkVUX1NFUkRFU19JRl9TRkk6CisJCQlwaHktPnN1cHBvcnRlZCAmPSAoU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgIFNVUFBPUlRFRF9GSUJSRSB8CisJCQkJCSAgIFNVUFBPUlRFRF9QYXVzZSB8CisJCQkJCSAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlKTsKKwkJCXBoeS0+bWVkaWFfdHlwZSA9IEVUSF9QSFlfU0ZQX0ZJQkVSOworCQkJYnJlYWs7CisJCWNhc2UgUE9SVF9IV19DRkdfTkVUX1NFUkRFU19JRl9LUjoKKwkJCXBoeS0+bWVkaWFfdHlwZSA9IEVUSF9QSFlfS1I7CisJCQlwaHktPnN1cHBvcnRlZCAmPSAoU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgIFNVUFBPUlRFRF9GSUJSRSB8CisJCQkJCSAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJCQkJICAgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCQkJICAgU1VQUE9SVEVEX0FzeW1fUGF1c2UpOworCQkJYnJlYWs7CisJCWNhc2UgUE9SVF9IV19DRkdfTkVUX1NFUkRFU19JRl9EWEdYUzoKKwkJCXBoeS0+bWVkaWFfdHlwZSA9IEVUSF9QSFlfS1I7CisJCQlwaHktPmZsYWdzIHw9IEZMQUdTX1dDX0RVQUxfTU9ERTsKKwkJCXBoeS0+c3VwcG9ydGVkICY9IChTVVBQT1JURURfMjAwMDBiYXNlTUxEMl9GdWxsIHwKKwkJCQkJICAgU1VQUE9SVEVEX0ZJQlJFIHwKKwkJCQkJICAgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCQkJICAgU1VQUE9SVEVEX0FzeW1fUGF1c2UpOworCQkJYnJlYWs7CisJCWNhc2UgUE9SVF9IV19DRkdfTkVUX1NFUkRFU19JRl9LUjI6CisJCQlwaHktPm1lZGlhX3R5cGUgPSBFVEhfUEhZX0tSOworCQkJcGh5LT5mbGFncyB8PSBGTEFHU19XQ19EVUFMX01PREU7CisJCQlwaHktPnN1cHBvcnRlZCAmPSAoU1VQUE9SVEVEXzIwMDAwYmFzZUtSMl9GdWxsIHwKKwkJCQkJICAgU1VQUE9SVEVEX0ZJQlJFIHwKKwkJCQkJICAgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCQkJICAgU1VQUE9SVEVEX0FzeW1fUGF1c2UpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUChORVRJRl9NU0dfTElOSywgIlVua25vd24gV0MgaW50ZXJmYWNlIHR5cGUgMHgleFxuIiwKKwkJCQkgICAgICAgc2VyZGVzX25ldF9pZik7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIEVuYWJsZSBNREMvTURJTyB3b3JrLWFyb3VuZCBmb3IgRTMgQTAgc2luY2UgZnJlZSBydW5uaW5nIE1EQworCQkgKiB3YXMgbm90IHNldCBhcyBleHBlY3RlZC4gRm9yIEIwLCBFQ08gd2lsbCBiZSBlbmFibGVkIHNvIHRoZXJlCisJCSAqIHdvbid0IGJlIGFuIGlzc3VlIHRoZXJlCisJCSAqLworCQlpZiAoQ0hJUF9SRVYoYnApID09IENISVBfUkVWX0F4KQorCQkJcGh5LT5mbGFncyB8PSBGTEFHU19NRENfTURJT19XQTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHN3aXRjaF9jZmcpIHsKKwkJY2FzZSBTV0lUQ0hfQ0ZHXzFHOgorCQkJcGh5X2FkZHIgPSBSRUdfUkQoYnAsCisJCQkJCSAgTklHX1JFR19TRVJERVMwX0NUUkxfUEhZX0FERFIgKworCQkJCQkgIHBvcnQgKiAweDEwKTsKKwkJCSpwaHkgPSBwaHlfc2VyZGVzOworCQkJYnJlYWs7CisJCWNhc2UgU1dJVENIX0NGR18xMEc6CisJCQlwaHlfYWRkciA9IFJFR19SRChicCwKKwkJCQkJICBOSUdfUkVHX1hHWFMwX0NUUkxfUEhZX0FERFIgKworCQkJCQkgIHBvcnQgKiAweDE4KTsKKwkJCSpwaHkgPSBwaHlfeGd4czsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJJbnZhbGlkIHN3aXRjaF9jZmdcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAl9CiAJcGh5LT5hZGRyID0gKHU4KXBoeV9hZGRyOwogCXBoeS0+bWRpb19jdHJsID0gYm54MnhfZ2V0X2VtYWNfYmFzZShicCwKQEAgLTczMDIsMTIgKzExMTQ3LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1OCBibngyeF9wb3B1bGF0ZV9leHRfcGh5KHN0cnVjdCBibngyeCAqYnAsCi0JCQkJIHU4IHBoeV9pbmRleCwKLQkJCQkgdTMyIHNobWVtX2Jhc2UsCi0JCQkJIHUzMiBzaG1lbTJfYmFzZSwKLQkJCQkgdTggcG9ydCwKLQkJCQkgc3RydWN0IGJueDJ4X3BoeSAqcGh5KQorc3RhdGljIGludCBibngyeF9wb3B1bGF0ZV9leHRfcGh5KHN0cnVjdCBibngyeCAqYnAsCisJCQkJICB1OCBwaHlfaW5kZXgsCisJCQkJICB1MzIgc2htZW1fYmFzZSwKKwkJCQkgIHUzMiBzaG1lbTJfYmFzZSwKKwkJCQkgIHU4IHBvcnQsCisJCQkJICBzdHJ1Y3QgYm54MnhfcGh5ICpwaHkpCiB7CiAJdTMyIGV4dF9waHlfY29uZmlnLCBwaHlfdHlwZSwgY29uZmlnMjsKIAl1MzIgbWRjX21kaW9fYWNjZXNzID0gU0hBUkVEX0hXX0NGR19NRENfTURJT19BQ0NFU1MxX0JPVEg7CkBAIC03MzM2LDYgKzExMTgxLDcgQEAKIAkJKnBoeSA9IHBoeV84NzI3OwogCQlwaHktPmZsYWdzIHw9IEZMQUdTX05PQzsKIAkJYnJlYWs7CisJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzIyOgogCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyNzoKIAkJbWRjX21kaW9fYWNjZXNzID0gU0hBUkVEX0hXX0NGR19NRENfTURJT19BQ0NFU1MxX0VNQUMxOwogCQkqcGh5ID0gcGh5Xzg3Mjc7CkBAIC03MzQ5LDYgKzExMTk1LDkgQEAKIAljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODMzOgogCQkqcGh5ID0gcGh5Xzg0ODMzOwogCQlicmVhazsKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTU0NjE4U0U6CisJCSpwaHkgPSBwaHlfNTQ2MThzZTsKKwkJYnJlYWs7CiAJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9TRlg3MTAxOgogCQkqcGh5ID0gcGh5XzcxMDE7CiAJCWJyZWFrOwpAQCAtNzQxMCwxMCArMTEyNTksMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU4IGJueDJ4X3BvcHVsYXRlX3BoeShzdHJ1Y3QgYm54MnggKmJwLCB1OCBwaHlfaW5kZXgsIHUzMiBzaG1lbV9iYXNlLAotCQkJICAgICB1MzIgc2htZW0yX2Jhc2UsIHU4IHBvcnQsIHN0cnVjdCBibngyeF9waHkgKnBoeSkKK3N0YXRpYyBpbnQgYm54MnhfcG9wdWxhdGVfcGh5KHN0cnVjdCBibngyeCAqYnAsIHU4IHBoeV9pbmRleCwgdTMyIHNobWVtX2Jhc2UsCisJCQkgICAgICB1MzIgc2htZW0yX2Jhc2UsIHU4IHBvcnQsIHN0cnVjdCBibngyeF9waHkgKnBoeSkKIHsKLQl1OCBzdGF0dXMgPSAwOworCWludCBzdGF0dXMgPSAwOwogCXBoeS0+dHlwZSA9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX05PVF9DT05OOwogCWlmIChwaHlfaW5kZXggPT0gSU5UX1BIWSkKIAkJcmV0dXJuIGJueDJ4X3BvcHVsYXRlX2ludF9waHkoYnAsIHNobWVtX2Jhc2UsIHBvcnQsIHBoeSk7CkBAIC03NTI3LDEwICsxMTM3NiwxMCBAQAogfQogCiAKLXU4IGJueDJ4X3BoeV9wcm9iZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK2ludCBibngyeF9waHlfcHJvYmUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCiB7CiAJdTggcGh5X2luZGV4LCBhY3R1YWxfcGh5X2lkeCwgbGlua19jZmdfaWR4OwotCXUzMiBwaHlfY29uZmlnX3N3YXBwZWQ7CisJdTMyIHBoeV9jb25maWdfc3dhcHBlZCwgc3luY19vZmZzZXQsIG1lZGlhX3R5cGVzOwogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXN0cnVjdCBibngyeF9waHkgKnBoeTsKIAlwYXJhbXMtPm51bV9waHlzID0gMDsKQEAgLTc1NjcsNiArMTE0MTYsMjYgQEAKIAkJaWYgKHBoeS0+dHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9OT1RfQ09OTikKIAkJCWJyZWFrOwogCisJCXN5bmNfb2Zmc2V0ID0gcGFyYW1zLT5zaG1lbV9iYXNlICsKKwkJCW9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCisJCQlkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twYXJhbXMtPnBvcnRdLm1lZGlhX3R5cGUpOworCQltZWRpYV90eXBlcyA9IFJFR19SRChicCwgc3luY19vZmZzZXQpOworCisJCS8qCisJCSAqIFVwZGF0ZSBtZWRpYSB0eXBlIGZvciBub24tUE1GIHN5bmMgb25seSBmb3IgdGhlIGZpcnN0IHRpbWUKKwkJICogSW4gY2FzZSB0aGUgbWVkaWEgdHlwZSBjaGFuZ2VzIGFmdGVyd2FyZHMsIGl0IHdpbGwgYmUgdXBkYXRlZAorCQkgKiB1c2luZyB0aGUgdXBkYXRlX3N0YXR1cyBmdW5jdGlvbgorCQkgKi8KKwkJaWYgKChtZWRpYV90eXBlcyAmIChQT1JUX0hXX0NGR19NRURJQV9UWVBFX1BIWTBfTUFTSyA8PAorCQkJCSAgICAoUE9SVF9IV19DRkdfTUVESUFfVFlQRV9QSFkxX1NISUZUICoKKwkJCQkgICAgIGFjdHVhbF9waHlfaWR4KSkpID09IDApIHsKKwkJCW1lZGlhX3R5cGVzIHw9ICgocGh5LT5tZWRpYV90eXBlICYKKwkJCQkJUE9SVF9IV19DRkdfTUVESUFfVFlQRV9QSFkwX01BU0spIDw8CisJCQkJKFBPUlRfSFdfQ0ZHX01FRElBX1RZUEVfUEhZMV9TSElGVCAqCisJCQkJIGFjdHVhbF9waHlfaWR4KSk7CisJCX0KKwkJUkVHX1dSKGJwLCBzeW5jX29mZnNldCwgbWVkaWFfdHlwZXMpOworCiAJCWJueDJ4X3BoeV9kZWZfY2ZnKHBhcmFtcywgcGh5LCBwaHlfaW5kZXgpOwogCQlwYXJhbXMtPm51bV9waHlzKys7CiAJfQpAQCAtNzU3NSw0MyArMTE0NDQsMTQxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9waHlfdmFycyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKK3ZvaWQgYm54MnhfaW5pdF9ibWFjX2xvb3BiYWNrKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKLQl1OCBhY3R1YWxfcGh5X2lkeCwgcGh5X2luZGV4LCBsaW5rX2NmZ19pZHg7Ci0JdTggcGh5X2NvbmZpZ19zd2FwcGVkID0gcGFyYW1zLT5tdWx0aV9waHlfY29uZmlnICYKLQkJCVBPUlRfSFdfQ0ZHX1BIWV9TV0FQUEVEX0VOQUJMRUQ7Ci0JZm9yIChwaHlfaW5kZXggPSBJTlRfUEhZOyBwaHlfaW5kZXggPCBwYXJhbXMtPm51bV9waHlzOwotCSAgICAgIHBoeV9pbmRleCsrKSB7Ci0JCWxpbmtfY2ZnX2lkeCA9IExJTktfQ09ORklHX0lEWChwaHlfaW5kZXgpOwotCQlhY3R1YWxfcGh5X2lkeCA9IHBoeV9pbmRleDsKLQkJaWYgKHBoeV9jb25maWdfc3dhcHBlZCkgewotCQkJaWYgKHBoeV9pbmRleCA9PSBFWFRfUEhZMSkKLQkJCQlhY3R1YWxfcGh5X2lkeCA9IEVYVF9QSFkyOwotCQkJZWxzZSBpZiAocGh5X2luZGV4ID09IEVYVF9QSFkyKQotCQkJCWFjdHVhbF9waHlfaWR4ID0gRVhUX1BIWTE7Ci0JCX0KLQkJcGFyYW1zLT5waHlbYWN0dWFsX3BoeV9pZHhdLnJlcV9mbG93X2N0cmwgPQotCQkJcGFyYW1zLT5yZXFfZmxvd19jdHJsW2xpbmtfY2ZnX2lkeF07CisJCXZhcnMtPmxpbmtfdXAgPSAxOworCQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CisJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKKwkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9CTUFDOwogCi0JCXBhcmFtcy0+cGh5W2FjdHVhbF9waHlfaWR4XS5yZXFfbGluZV9zcGVlZCA9Ci0JCQlwYXJhbXMtPnJlcV9saW5lX3NwZWVkW2xpbmtfY2ZnX2lkeF07CisJCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9YR1hTX0ZMQUc7CiAKLQkJcGFyYW1zLT5waHlbYWN0dWFsX3BoeV9pZHhdLnNwZWVkX2NhcF9tYXNrID0KLQkJCXBhcmFtcy0+c3BlZWRfY2FwX21hc2tbbGlua19jZmdfaWR4XTsKKwkJYm54MnhfeGd4c19kZWFzc2VydChwYXJhbXMpOwogCi0JCXBhcmFtcy0+cGh5W2FjdHVhbF9waHlfaWR4XS5yZXFfZHVwbGV4ID0KLQkJCXBhcmFtcy0+cmVxX2R1cGxleFtsaW5rX2NmZ19pZHhdOworCQkvKiBzZXQgYm1hYyBsb29wYmFjayAqLworCQlibngyeF9ibWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDEpOwogCi0JCURQKE5FVElGX01TR19MSU5LLCAicmVxX2Zsb3dfY3RybCAleCwgcmVxX2xpbmVfc3BlZWQgJXgsIgotCQkJICAgIiBzcGVlZF9jYXBfbWFzayAleFxuIiwKLQkJCSAgIHBhcmFtcy0+cGh5W2FjdHVhbF9waHlfaWR4XS5yZXFfZmxvd19jdHJsLAotCQkJICAgcGFyYW1zLT5waHlbYWN0dWFsX3BoeV9pZHhdLnJlcV9saW5lX3NwZWVkLAotCQkJICAgcGFyYW1zLT5waHlbYWN0dWFsX3BoeV9pZHhdLnNwZWVkX2NhcF9tYXNrKTsKLQl9CisJCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUgKyBwYXJhbXMtPnBvcnQqNCwgMCk7CiB9CiAKLXU4IGJueDJ4X3BoeV9pbml0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQordm9pZCBibngyeF9pbml0X2VtYWNfbG9vcGJhY2soc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCQl2YXJzLT5saW5rX3VwID0gMTsKKwkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDA7CisJCXZhcnMtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKKwkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9FTUFDOworCisJCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9YR1hTX0ZMQUc7CisKKwkJYm54MnhfeGd4c19kZWFzc2VydChwYXJhbXMpOworCQkvKiBzZXQgYm1hYyBsb29wYmFjayAqLworCQlibngyeF9lbWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDEpOworCQlibngyeF9lbWFjX3Byb2dyYW0ocGFyYW1zLCB2YXJzKTsKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19EUkFJTjBfTU9ERSArIHBhcmFtcy0+cG9ydCo0LCAwKTsKK30KKwordm9pZCBibngyeF9pbml0X3htYWNfbG9vcGJhY2soc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXZhcnMtPmxpbmtfdXAgPSAxOworCWlmICghcGFyYW1zLT5yZXFfbGluZV9zcGVlZFswXSkKKwkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOworCWVsc2UKKwkJdmFycy0+bGluZV9zcGVlZCA9IHBhcmFtcy0+cmVxX2xpbmVfc3BlZWRbMF07CisJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJdmFycy0+Zmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX05PTkU7CisJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9YTUFDOworCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9YR1hTX0ZMQUc7CisJLyoKKwkgKiBTZXQgV0MgdG8gbG9vcGJhY2sgbW9kZSBzaW5jZSBsaW5rIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgY2xvY2sKKwkgKiB0byB0aGUgWE1BQyBpbiAyMEcgbW9kZQorCSAqLworCWlmICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzIwMDAwKSB7CisJCWJueDJ4X3NldF9hZXJfbW1kKHBhcmFtcywgJnBhcmFtcy0+cGh5WzBdKTsKKwkJYm54Mnhfd2FycGNvcmVfcmVzZXRfbGFuZShicCwgJnBhcmFtcy0+cGh5WzBdLCAwKTsKKwkJcGFyYW1zLT5waHlbSU5UX1BIWV0uY29uZmlnX2xvb3BiYWNrKAorCQkJJnBhcmFtcy0+cGh5W0lOVF9QSFldLAorCQkJcGFyYW1zKTsKKwl9CisJYm54MnhfeG1hY19lbmFibGUocGFyYW1zLCB2YXJzLCAxKTsKKwlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0RSQUlOMF9NT0RFICsgcGFyYW1zLT5wb3J0KjQsIDApOworfQorCit2b2lkIGJueDJ4X2luaXRfdW1hY19sb29wYmFjayhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdmFycy0+bGlua191cCA9IDE7CisJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDA7CisJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJdmFycy0+Zmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX05PTkU7CisJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9VTUFDOworCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9YR1hTX0ZMQUc7CisJYm54MnhfdW1hY19lbmFibGUocGFyYW1zLCB2YXJzLCAxKTsKKworCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUgKyBwYXJhbXMtPnBvcnQqNCwgMCk7Cit9CisKK3ZvaWQgYm54MnhfaW5pdF94Z3hzX2xvb3BiYWNrKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwkJdmFycy0+bGlua191cCA9IDE7CisJCXZhcnMtPmZsb3dfY3RybCA9IEJOWDJYX0ZMT1dfQ1RSTF9OT05FOworCQl2YXJzLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwlpZiAocGFyYW1zLT5yZXFfbGluZV9zcGVlZFswXSA9PSBTUEVFRF8xMDAwKQorCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDA7CisJZWxzZQorCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOworCisJaWYgKCFVU0VTX1dBUlBDT1JFKGJwKSkKKwkJYm54MnhfeGd4c19kZWFzc2VydChwYXJhbXMpOworCWJueDJ4X2xpbmtfaW5pdGlhbGl6ZShwYXJhbXMsIHZhcnMpOworCisJaWYgKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWRbMF0gPT0gU1BFRURfMTAwMCkgeworCQlpZiAoVVNFU19XQVJQQ09SRShicCkpCisJCQlibngyeF91bWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDApOworCQllbHNlIHsKKwkJCWJueDJ4X2VtYWNfcHJvZ3JhbShwYXJhbXMsIHZhcnMpOworCQkJYm54MnhfZW1hY19lbmFibGUocGFyYW1zLCB2YXJzLCAwKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChVU0VTX1dBUlBDT1JFKGJwKSkKKwkJCWJueDJ4X3htYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7CisJCWVsc2UKKwkJCWJueDJ4X2JtYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7CisJfQorCisJCWlmIChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfWEdYUykgeworCQkJLyogc2V0IDEwRyBYR1hTIGxvb3BiYWNrICovCisJCQlwYXJhbXMtPnBoeVtJTlRfUEhZXS5jb25maWdfbG9vcGJhY2soCisJCQkJJnBhcmFtcy0+cGh5W0lOVF9QSFldLAorCQkJCXBhcmFtcyk7CisKKwkJfSBlbHNlIHsKKwkJCS8qIHNldCBleHRlcm5hbCBwaHkgbG9vcGJhY2sgKi8KKwkJCXU4IHBoeV9pbmRleDsKKwkJCWZvciAocGh5X2luZGV4ID0gRVhUX1BIWTE7CisJCQkgICAgICBwaHlfaW5kZXggPCBwYXJhbXMtPm51bV9waHlzOyBwaHlfaW5kZXgrKykgeworCQkJCWlmIChwYXJhbXMtPnBoeVtwaHlfaW5kZXhdLmNvbmZpZ19sb29wYmFjaykKKwkJCQkJcGFyYW1zLT5waHlbcGh5X2luZGV4XS5jb25maWdfbG9vcGJhY2soCisJCQkJCQkmcGFyYW1zLT5waHlbcGh5X2luZGV4XSwKKwkJCQkJCXBhcmFtcyk7CisJCQl9CisJCX0KKwkJUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19EUkFJTjBfTU9ERSArIHBhcmFtcy0+cG9ydCo0LCAwKTsKKworCWJueDJ4X3NldF9sZWQocGFyYW1zLCB2YXJzLCBMRURfTU9ERV9PUEVSLCB2YXJzLT5saW5lX3NwZWVkKTsKK30KKworaW50IGJueDJ4X3BoeV9pbml0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCURQKE5FVElGX01TR19MSU5LLCAiUGh5IEluaXRpYWxpemF0aW9uIHN0YXJ0ZWRcbiIpOwpAQCAtNzY0MSwxMDEgKzExNjA4LDQzIEBACiAJCURQKE5FVElGX01TR19MSU5LLCAiTm8gcGh5IGZvdW5kIGZvciBpbml0aWFsaXphdGlvbiAhIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzZXRfcGh5X3ZhcnMocGFyYW1zKTsKKwlzZXRfcGh5X3ZhcnMocGFyYW1zLCB2YXJzKTsKIAogCURQKE5FVElGX01TR19MSU5LLCAiTnVtIG9mIHBoeXMgb24gYm9hcmQ6ICVkXG4iLCBwYXJhbXMtPm51bV9waHlzKTsKLQlpZiAocGFyYW1zLT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX0JNQUMpIHsKLQotCQl2YXJzLT5saW5rX3VwID0gMTsKLQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOwotCQl2YXJzLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQkJdmFycy0+Zmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX05PTkU7Ci0JCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfQk1BQzsKLQotCQl2YXJzLT5waHlfZmxhZ3MgPSBQSFlfWEdYU19GTEFHOwotCi0JCWJueDJ4X3hneHNfZGVhc3NlcnQocGFyYW1zKTsKLQotCQkvKiBzZXQgYm1hYyBsb29wYmFjayAqLwotCQlibngyeF9ibWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDEpOwotCi0JCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUgKyBwYXJhbXMtPnBvcnQqNCwgMCk7Ci0KLQl9IGVsc2UgaWYgKHBhcmFtcy0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19FTUFDKSB7Ci0KLQkJdmFycy0+bGlua191cCA9IDE7Ci0JCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOwotCQl2YXJzLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQkJdmFycy0+Zmxvd19jdHJsID0gQk5YMlhfRkxPV19DVFJMX05PTkU7Ci0JCXZhcnMtPm1hY190eXBlID0gTUFDX1RZUEVfRU1BQzsKLQotCQl2YXJzLT5waHlfZmxhZ3MgPSBQSFlfWEdYU19GTEFHOwotCi0JCWJueDJ4X3hneHNfZGVhc3NlcnQocGFyYW1zKTsKLQkJLyogc2V0IGJtYWMgbG9vcGJhY2sgKi8KLQkJYm54MnhfZW1hY19lbmFibGUocGFyYW1zLCB2YXJzLCAxKTsKLQkJYm54MnhfZW1hY19wcm9ncmFtKHBhcmFtcywgdmFycyk7Ci0JCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUgKyBwYXJhbXMtPnBvcnQqNCwgMCk7Ci0KLQl9IGVsc2UgaWYgKChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfWEdYUykgfHwKLQkJICAgKHBhcmFtcy0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19FWFRfUEhZKSkgewotCi0JCXZhcnMtPmxpbmtfdXAgPSAxOwotCQl2YXJzLT5mbG93X2N0cmwgPSBCTlgyWF9GTE9XX0NUUkxfTk9ORTsKLQkJdmFycy0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCWlmIChwYXJhbXMtPnJlcV9saW5lX3NwZWVkWzBdID09IFNQRUVEXzEwMDApIHsKLQkJCXZhcnMtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOwotCQkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9FTUFDOwotCQl9IGVsc2UgewotCQkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOwotCQkJdmFycy0+bWFjX3R5cGUgPSBNQUNfVFlQRV9CTUFDOworCXN3aXRjaCAocGFyYW1zLT5sb29wYmFja19tb2RlKSB7CisJY2FzZSBMT09QQkFDS19CTUFDOgorCQlibngyeF9pbml0X2JtYWNfbG9vcGJhY2socGFyYW1zLCB2YXJzKTsKKwkJYnJlYWs7CisJY2FzZSBMT09QQkFDS19FTUFDOgorCQlibngyeF9pbml0X2VtYWNfbG9vcGJhY2socGFyYW1zLCB2YXJzKTsKKwkJYnJlYWs7CisJY2FzZSBMT09QQkFDS19YTUFDOgorCQlibngyeF9pbml0X3htYWNfbG9vcGJhY2socGFyYW1zLCB2YXJzKTsKKwkJYnJlYWs7CisJY2FzZSBMT09QQkFDS19VTUFDOgorCQlibngyeF9pbml0X3VtYWNfbG9vcGJhY2socGFyYW1zLCB2YXJzKTsKKwkJYnJlYWs7CisJY2FzZSBMT09QQkFDS19YR1hTOgorCWNhc2UgTE9PUEJBQ0tfRVhUX1BIWToKKwkJYm54MnhfaW5pdF94Z3hzX2xvb3BiYWNrKHBhcmFtcywgdmFycyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICghQ0hJUF9JU19FMyhicCkpIHsKKwkJCWlmIChwYXJhbXMtPnN3aXRjaF9jZmcgPT0gU1dJVENIX0NGR18xMEcpCisJCQkJYm54MnhfeGd4c19kZWFzc2VydChwYXJhbXMpOworCQkJZWxzZQorCQkJCWJueDJ4X3NlcmRlc19kZWFzc2VydChicCwgcGFyYW1zLT5wb3J0KTsKIAkJfQotCi0JCWJueDJ4X3hneHNfZGVhc3NlcnQocGFyYW1zKTsKLQkJYm54MnhfbGlua19pbml0aWFsaXplKHBhcmFtcywgdmFycyk7Ci0KLQkJaWYgKHBhcmFtcy0+cmVxX2xpbmVfc3BlZWRbMF0gPT0gU1BFRURfMTAwMCkgewotCQkJYm54MnhfZW1hY19wcm9ncmFtKHBhcmFtcywgdmFycyk7Ci0JCQlibngyeF9lbWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDApOwotCQl9IGVsc2UKLQkJCWJueDJ4X2JtYWNfZW5hYmxlKHBhcmFtcywgdmFycywgMCk7Ci0JCWlmIChwYXJhbXMtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfWEdYUykgewotCQkJLyogc2V0IDEwRyBYR1hTIGxvb3BiYWNrICovCi0JCQlwYXJhbXMtPnBoeVtJTlRfUEhZXS5jb25maWdfbG9vcGJhY2soCi0JCQkJJnBhcmFtcy0+cGh5W0lOVF9QSFldLAotCQkJCXBhcmFtcyk7Ci0KLQkJfSBlbHNlIHsKLQkJCS8qIHNldCBleHRlcm5hbCBwaHkgbG9vcGJhY2sgKi8KLQkJCXU4IHBoeV9pbmRleDsKLQkJCWZvciAocGh5X2luZGV4ID0gRVhUX1BIWTE7Ci0JCQkgICAgICBwaHlfaW5kZXggPCBwYXJhbXMtPm51bV9waHlzOyBwaHlfaW5kZXgrKykgewotCQkJCWlmIChwYXJhbXMtPnBoeVtwaHlfaW5kZXhdLmNvbmZpZ19sb29wYmFjaykKLQkJCQkJcGFyYW1zLT5waHlbcGh5X2luZGV4XS5jb25maWdfbG9vcGJhY2soCi0JCQkJCQkmcGFyYW1zLT5waHlbcGh5X2luZGV4XSwKLQkJCQkJCXBhcmFtcyk7Ci0JCQl9Ci0JCX0KLQkJUkVHX1dSKGJwLCBOSUdfUkVHX0VHUkVTU19EUkFJTjBfTU9ERSArIHBhcmFtcy0+cG9ydCo0LCAwKTsKLQotCQlibngyeF9zZXRfbGVkKHBhcmFtcywgdmFycywKLQkJCSAgICAgIExFRF9NT0RFX09QRVIsIHZhcnMtPmxpbmVfc3BlZWQpOwotCX0gZWxzZQotCS8qIE5vIGxvb3BiYWNrICovCi0JewotCQlpZiAocGFyYW1zLT5zd2l0Y2hfY2ZnID09IFNXSVRDSF9DRkdfMTBHKQotCQkJYm54MnhfeGd4c19kZWFzc2VydChwYXJhbXMpOwotCQllbHNlCi0JCQlibngyeF9zZXJkZXNfZGVhc3NlcnQoYnAsIHBhcmFtcy0+cG9ydCk7Ci0KIAkJYm54MnhfbGlua19pbml0aWFsaXplKHBhcmFtcywgdmFycyk7CiAJCW1zbGVlcCgzMCk7CiAJCWJueDJ4X2xpbmtfaW50X2VuYWJsZShwYXJhbXMpOworCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CiB9Ci11OCBibngyeF9saW5rX3Jlc2V0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAotCQkgICAgdTggcmVzZXRfZXh0X3BoeSkKKworaW50IGJueDJ4X2xpbmtfcmVzZXQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCisJCSAgICAgdTggcmVzZXRfZXh0X3BoeSkKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAl1OCBwaHlfaW5kZXgsIHBvcnQgPSBwYXJhbXMtPnBvcnQsIGNsZWFyX2xhdGNoX2luZCA9IDA7CkBAIC03NzUzLDE0ICsxMTY2MiwxOSBAQAogCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRFJBSU4wX01PREUgKyBwb3J0KjQsIDEpOwogCiAJLyogZGlzYWJsZSBuaWcgZWdyZXNzIGludGVyZmFjZSAqLwotCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9PVVRfRU4gKyBwb3J0KjQsIDApOwotCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRU1BQzBfT1VUX0VOICsgcG9ydCo0LCAwKTsKKwlpZiAoIUNISVBfSVNfRTMoYnApKSB7CisJCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9PVVRfRU4gKyBwb3J0KjQsIDApOworCQlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0VNQUMwX09VVF9FTiArIHBvcnQqNCwgMCk7CisJfQogCiAJLyogU3RvcCBCaWdNYWMgcnggKi8KLQlibngyeF9ibWFjX3J4X2Rpc2FibGUoYnAsIHBvcnQpOwotCisJaWYgKCFDSElQX0lTX0UzKGJwKSkKKwkJYm54MnhfYm1hY19yeF9kaXNhYmxlKGJwLCBwb3J0KTsKKwllbHNlCisJCWJueDJ4X3htYWNfZGlzYWJsZShwYXJhbXMpOwogCS8qIGRpc2FibGUgZW1hYyAqLwotCVJFR19XUihicCwgTklHX1JFR19OSUdfRU1BQzBfRU4gKyBwb3J0KjQsIDApOworCWlmICghQ0hJUF9JU19FMyhicCkpCisJCVJFR19XUihicCwgTklHX1JFR19OSUdfRU1BQzBfRU4gKyBwb3J0KjQsIDApOwogCiAJbXNsZWVwKDEwKTsKIAkvKiBUaGUgUEhZIHJlc2V0IGlzIGNvbnRyb2xsZWQgYnkgR1BJTyAxCkBAIC03Nzk2LDIxICsxMTcxMCwyMiBAQAogCSAgICAgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0JNQUMwIDw8IHBvcnQpKTsKIAogCS8qIGRpc2FibGUgbmlnIGluZ3Jlc3MgaW50ZXJmYWNlICovCi0JUkVHX1dSKGJwLCBOSUdfUkVHX0JNQUMwX0lOX0VOICsgcG9ydCo0LCAwKTsKLQlSRUdfV1IoYnAsIE5JR19SRUdfRU1BQzBfSU5fRU4gKyBwb3J0KjQsIDApOwotCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9PVVRfRU4gKyBwb3J0KjQsIDApOwotCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRU1BQzBfT1VUX0VOICsgcG9ydCo0LCAwKTsKKwlpZiAoIUNISVBfSVNfRTMoYnApKSB7CisJCVJFR19XUihicCwgTklHX1JFR19CTUFDMF9JTl9FTiArIHBvcnQqNCwgMCk7CisJCVJFR19XUihicCwgTklHX1JFR19FTUFDMF9JTl9FTiArIHBvcnQqNCwgMCk7CisJfQogCXZhcnMtPmxpbmtfdXAgPSAwOworCXZhcnMtPnBoeV9mbGFncyA9IDA7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoJCQkJQ29tbW9uIGZ1bmN0aW9uCQkJCSAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdTggYm54MnhfODA3M19jb21tb25faW5pdF9waHkoc3RydWN0IGJueDJ4ICpicCwKLQkJCQkgICAgIHUzMiBzaG1lbV9iYXNlX3BhdGhbXSwKLQkJCQkgICAgIHUzMiBzaG1lbTJfYmFzZV9wYXRoW10sIHU4IHBoeV9pbmRleCwKLQkJCQkgICAgIHUzMiBjaGlwX2lkKQorc3RhdGljIGludCBibngyeF84MDczX2NvbW1vbl9pbml0X3BoeShzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgICAgIHUzMiBzaG1lbV9iYXNlX3BhdGhbXSwKKwkJCQkgICAgICB1MzIgc2htZW0yX2Jhc2VfcGF0aFtdLCB1OCBwaHlfaW5kZXgsCisJCQkJICAgICAgdTMyIGNoaXBfaWQpCiB7CiAJc3RydWN0IGJueDJ4X3BoeSBwaHlbUE9SVF9NQVhdOwogCXN0cnVjdCBibngyeF9waHkgKnBoeV9ibGtbUE9SVF9NQVhdOwpAQCAtNzgyNiwxNCArMTE3NDEsMTQgQEAKIAlmb3IgKHBvcnQgPSBQT1JUX01BWCAtIDE7IHBvcnQgPj0gUE9SVF8wOyBwb3J0LS0pIHsKIAkJdTMyIHNobWVtX2Jhc2UsIHNobWVtMl9iYXNlOwogCQkvKiBJbiBFMiwgc2FtZSBwaHkgaXMgdXNpbmcgZm9yIHBvcnQwIG9mIHRoZSB0d28gcGF0aHMgKi8KLQkJaWYgKENISVBfSVNfRTIoYnApKSB7Ci0JCQlzaG1lbV9iYXNlID0gc2htZW1fYmFzZV9wYXRoW3BvcnRdOwotCQkJc2htZW0yX2Jhc2UgPSBzaG1lbTJfYmFzZV9wYXRoW3BvcnRdOwotCQkJcG9ydF9vZl9wYXRoID0gMDsKLQkJfSBlbHNlIHsKKwkJaWYgKENISVBfSVNfRTF4KGJwKSkgewogCQkJc2htZW1fYmFzZSA9IHNobWVtX2Jhc2VfcGF0aFswXTsKIAkJCXNobWVtMl9iYXNlID0gc2htZW0yX2Jhc2VfcGF0aFswXTsKIAkJCXBvcnRfb2ZfcGF0aCA9IHBvcnQ7CisJCX0gZWxzZSB7CisJCQlzaG1lbV9iYXNlID0gc2htZW1fYmFzZV9wYXRoW3BvcnRdOworCQkJc2htZW0yX2Jhc2UgPSBzaG1lbTJfYmFzZV9wYXRoW3BvcnRdOworCQkJcG9ydF9vZl9wYXRoID0gMDsKIAkJfQogCiAJCS8qIEV4dHJhY3QgdGhlIGV4dCBwaHkgYWRkcmVzcyBmb3IgdGhlIHBvcnQgKi8KQEAgLTc4NzcsMTAgKzExNzkyLDEwIEBACiAKIAkvKiBQQVJUMiAtIERvd25sb2FkIGZpcm13YXJlIHRvIGJvdGggcGh5cyAqLwogCWZvciAocG9ydCA9IFBPUlRfTUFYIC0gMTsgcG9ydCA+PSBQT1JUXzA7IHBvcnQtLSkgewotCQlpZiAoQ0hJUF9JU19FMihicCkpCi0JCQlwb3J0X29mX3BhdGggPSAwOwotCQllbHNlCisJCWlmIChDSElQX0lTX0UxeChicCkpCiAJCQlwb3J0X29mX3BhdGggPSBwb3J0OworCQllbHNlCisJCQlwb3J0X29mX3BhdGggPSAwOwogCiAJCURQKE5FVElGX01TR19MSU5LLCAiTG9hZGluZyBzcGlyb20gZm9yIHBoeSBhZGRyZXNzIDB4JXhcbiIsCiAJCQkgICBwaHlfYmxrW3BvcnRdLT5hZGRyKTsKQEAgLTc5MzMsMTAgKzExODQ4LDEwIEBACiAJfQogCXJldHVybiAwOwogfQotc3RhdGljIHU4IGJueDJ4Xzg3MjZfY29tbW9uX2luaXRfcGh5KHN0cnVjdCBibngyeCAqYnAsCi0JCQkJICAgICB1MzIgc2htZW1fYmFzZV9wYXRoW10sCi0JCQkJICAgICB1MzIgc2htZW0yX2Jhc2VfcGF0aFtdLCB1OCBwaHlfaW5kZXgsCi0JCQkJICAgICB1MzIgY2hpcF9pZCkKK3N0YXRpYyBpbnQgYm54MnhfODcyNl9jb21tb25faW5pdF9waHkoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICB1MzIgc2htZW1fYmFzZV9wYXRoW10sCisJCQkJICAgICAgdTMyIHNobWVtMl9iYXNlX3BhdGhbXSwgdTggcGh5X2luZGV4LAorCQkJCSAgICAgIHUzMiBjaGlwX2lkKQogewogCXUzMiB2YWw7CiAJczggcG9ydDsKQEAgLTc5NTQsMTIgKzExODY5LDEyIEBACiAJCXUzMiBzaG1lbV9iYXNlLCBzaG1lbTJfYmFzZTsKIAogCQkvKiBJbiBFMiwgc2FtZSBwaHkgaXMgdXNpbmcgZm9yIHBvcnQwIG9mIHRoZSB0d28gcGF0aHMgKi8KLQkJaWYgKENISVBfSVNfRTIoYnApKSB7Ci0JCQlzaG1lbV9iYXNlID0gc2htZW1fYmFzZV9wYXRoW3BvcnRdOwotCQkJc2htZW0yX2Jhc2UgPSBzaG1lbTJfYmFzZV9wYXRoW3BvcnRdOwotCQl9IGVsc2UgeworCQlpZiAoQ0hJUF9JU19FMXgoYnApKSB7CiAJCQlzaG1lbV9iYXNlID0gc2htZW1fYmFzZV9wYXRoWzBdOwogCQkJc2htZW0yX2Jhc2UgPSBzaG1lbTJfYmFzZV9wYXRoWzBdOworCQl9IGVsc2UgeworCQkJc2htZW1fYmFzZSA9IHNobWVtX2Jhc2VfcGF0aFtwb3J0XTsKKwkJCXNobWVtMl9iYXNlID0gc2htZW0yX2Jhc2VfcGF0aFtwb3J0XTsKIAkJfQogCQkvKiBFeHRyYWN0IHRoZSBleHQgcGh5IGFkZHJlc3MgZm9yIHRoZSBwb3J0ICovCiAJCWlmIChibngyeF9wb3B1bGF0ZV9waHkoYnAsIHBoeV9pbmRleCwgc2htZW1fYmFzZSwgc2htZW0yX2Jhc2UsCkBAIC04MDI3LDEwICsxMTk0MiwxMSBAQAogCQlicmVhazsKIAl9CiB9Ci1zdGF0aWMgdTggYm54MnhfODcyN19jb21tb25faW5pdF9waHkoc3RydWN0IGJueDJ4ICpicCwKLQkJCQkgICAgIHUzMiBzaG1lbV9iYXNlX3BhdGhbXSwKLQkJCQkgICAgIHUzMiBzaG1lbTJfYmFzZV9wYXRoW10sIHU4IHBoeV9pbmRleCwKLQkJCQkgICAgIHUzMiBjaGlwX2lkKQorCitzdGF0aWMgaW50IGJueDJ4Xzg3MjdfY29tbW9uX2luaXRfcGh5KHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgdTMyIHNobWVtX2Jhc2VfcGF0aFtdLAorCQkJCSAgICAgIHUzMiBzaG1lbTJfYmFzZV9wYXRoW10sIHU4IHBoeV9pbmRleCwKKwkJCQkgICAgICB1MzIgY2hpcF9pZCkKIHsKIAlzOCBwb3J0LCByZXNldF9ncGlvOwogCXUzMiBzd2FwX3ZhbCwgc3dhcF9vdmVycmlkZTsKQEAgLTgwNjcsMTQgKzExOTgzLDE0IEBACiAJCXUzMiBzaG1lbV9iYXNlLCBzaG1lbTJfYmFzZTsKIAogCQkvKiBJbiBFMiwgc2FtZSBwaHkgaXMgdXNpbmcgZm9yIHBvcnQwIG9mIHRoZSB0d28gcGF0aHMgKi8KLQkJaWYgKENISVBfSVNfRTIoYnApKSB7Ci0JCQlzaG1lbV9iYXNlID0gc2htZW1fYmFzZV9wYXRoW3BvcnRdOwotCQkJc2htZW0yX2Jhc2UgPSBzaG1lbTJfYmFzZV9wYXRoW3BvcnRdOwotCQkJcG9ydF9vZl9wYXRoID0gMDsKLQkJfSBlbHNlIHsKKwkJaWYgKENISVBfSVNfRTF4KGJwKSkgewogCQkJc2htZW1fYmFzZSA9IHNobWVtX2Jhc2VfcGF0aFswXTsKIAkJCXNobWVtMl9iYXNlID0gc2htZW0yX2Jhc2VfcGF0aFswXTsKIAkJCXBvcnRfb2ZfcGF0aCA9IHBvcnQ7CisJCX0gZWxzZSB7CisJCQlzaG1lbV9iYXNlID0gc2htZW1fYmFzZV9wYXRoW3BvcnRdOworCQkJc2htZW0yX2Jhc2UgPSBzaG1lbTJfYmFzZV9wYXRoW3BvcnRdOworCQkJcG9ydF9vZl9wYXRoID0gMDsKIAkJfQogCiAJCS8qIEV4dHJhY3QgdGhlIGV4dCBwaHkgYWRkcmVzcyBmb3IgdGhlIHBvcnQgKi8KQEAgLTgxMDksMjUgKzEyMDI1LDI5IEBACiAJfQogCS8qIFBBUlQyIC0gRG93bmxvYWQgZmlybXdhcmUgdG8gYm90aCBwaHlzICovCiAJZm9yIChwb3J0ID0gUE9SVF9NQVggLSAxOyBwb3J0ID49IFBPUlRfMDsgcG9ydC0tKSB7Ci0JCWlmIChDSElQX0lTX0UyKGJwKSkKLQkJCXBvcnRfb2ZfcGF0aCA9IDA7Ci0JCWVsc2UKKwkJaWYgKENISVBfSVNfRTF4KGJwKSkKIAkJCXBvcnRfb2ZfcGF0aCA9IHBvcnQ7CisJCWVsc2UKKwkJCXBvcnRfb2ZfcGF0aCA9IDA7CiAJCURQKE5FVElGX01TR19MSU5LLCAiTG9hZGluZyBzcGlyb20gZm9yIHBoeSBhZGRyZXNzIDB4JXhcbiIsCiAJCQkgICBwaHlfYmxrW3BvcnRdLT5hZGRyKTsKIAkJaWYgKGJueDJ4XzgwNzNfODcyN19leHRlcm5hbF9yb21fYm9vdChicCwgcGh5X2Jsa1twb3J0XSwKIAkJCQkJCSAgICAgIHBvcnRfb2ZfcGF0aCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogRGlzYWJsZSBQSFkgdHJhbnNtaXR0ZXIgb3V0cHV0ICovCisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeV9ibGtbcG9ydF0sCisJCQkJIE1ESU9fUE1BX0RFVkFELAorCQkJCSBNRElPX1BNQV9SRUdfVFhfRElTQUJMRSwgMSk7CiAKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1OCBibngyeF9leHRfcGh5X2NvbW1vbl9pbml0KHN0cnVjdCBibngyeCAqYnAsIHUzMiBzaG1lbV9iYXNlX3BhdGhbXSwKLQkJCQkgICAgdTMyIHNobWVtMl9iYXNlX3BhdGhbXSwgdTggcGh5X2luZGV4LAotCQkJCSAgICB1MzIgZXh0X3BoeV90eXBlLCB1MzIgY2hpcF9pZCkKK3N0YXRpYyBpbnQgYm54MnhfZXh0X3BoeV9jb21tb25faW5pdChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgc2htZW1fYmFzZV9wYXRoW10sCisJCQkJICAgICB1MzIgc2htZW0yX2Jhc2VfcGF0aFtdLCB1OCBwaHlfaW5kZXgsCisJCQkJICAgICB1MzIgZXh0X3BoeV90eXBlLCB1MzIgY2hpcF9pZCkKIHsKLQl1OCByYyA9IDA7CisJaW50IHJjID0gMDsKIAogCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7CiAJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004MDczOgpAQCAtODEzNSw3ICsxMjA1NSw3IEBACiAJCQkJCQlzaG1lbTJfYmFzZV9wYXRoLAogCQkJCQkJcGh5X2luZGV4LCBjaGlwX2lkKTsKIAkJYnJlYWs7Ci0KKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MjI6CiAJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3OgogCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcyN19OT0M6CiAJCXJjID0gYm54MnhfODcyN19jb21tb25faW5pdF9waHkoYnAsIHNobWVtX2Jhc2VfcGF0aCwKQEAgLTgxNTIsNiArMTIwNzIsMTMgQEAKIAkJCQkJCXNobWVtMl9iYXNlX3BhdGgsCiAJCQkJCQlwaHlfaW5kZXgsIGNoaXBfaWQpOwogCQlicmVhazsKKwljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODMzOgorCQkvKgorCQkgKiBHUElPMydzIGFyZSBsaW5rZWQsIGFuZCBzbyBib3RoIG5lZWQgdG8gYmUgdG9nZ2xlZAorCQkgKiB0byBvYnRhaW4gcmVxdWlyZWQgMnVzIHB1bHNlLgorCQkgKi8KKwkJcmMgPSBibngyeF84NDgzM19jb21tb25faW5pdF9waHkoYnAsIHNobWVtX2Jhc2VfcGF0aCwgY2hpcF9pZCk7CisJCWJyZWFrOwogCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRkFJTFVSRToKIAkJcmMgPSAtRUlOVkFMOwogCQlicmVhazsKQEAgLTgxNjksMTUgKzEyMDk2LDIxIEBACiAJcmV0dXJuIHJjOwogfQogCi11OCBibngyeF9jb21tb25faW5pdF9waHkoc3RydWN0IGJueDJ4ICpicCwgdTMyIHNobWVtX2Jhc2VfcGF0aFtdLAotCQkJIHUzMiBzaG1lbTJfYmFzZV9wYXRoW10sIHUzMiBjaGlwX2lkKQoraW50IGJueDJ4X2NvbW1vbl9pbml0X3BoeShzdHJ1Y3QgYm54MnggKmJwLCB1MzIgc2htZW1fYmFzZV9wYXRoW10sCisJCQkgIHUzMiBzaG1lbTJfYmFzZV9wYXRoW10sIHUzMiBjaGlwX2lkKQogewotCXU4IHJjID0gMDsKLQl1MzIgcGh5X3ZlcjsKLQl1OCBwaHlfaW5kZXg7CisJaW50IHJjID0gMDsKKwl1MzIgcGh5X3ZlciwgdmFsOworCXU4IHBoeV9pbmRleCA9IDA7CiAJdTMyIGV4dF9waHlfdHlwZSwgZXh0X3BoeV9jb25maWc7CisJYm54Mnhfc2V0X21kaW9fY2xrKGJwLCBjaGlwX2lkLCBQT1JUXzApOworCWJueDJ4X3NldF9tZGlvX2NsayhicCwgY2hpcF9pZCwgUE9SVF8xKTsKIAlEUChORVRJRl9NU0dfTElOSywgIkJlZ2luIGNvbW1vbiBwaHkgaW5pdFxuIik7Ci0KKwlpZiAoQ0hJUF9JU19FMyhicCkpIHsKKwkJLyogRW5hYmxlIEVQSU8gKi8KKwkJdmFsID0gUkVHX1JEKGJwLCBNSVNDX1JFR19HRU5fUFVSUF9IV0cpOworCQlSRUdfV1IoYnAsIE1JU0NfUkVHX0dFTl9QVVJQX0hXRywgdmFsIHwgMSk7CisJfQogCS8qIENoZWNrIGlmIGNvbW1vbiBpbml0IHdhcyBhbHJlYWR5IGRvbmUgKi8KIAlwaHlfdmVyID0gUkVHX1JEKGJwLCBzaG1lbV9iYXNlX3BhdGhbMF0gKwogCQkJIG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCkBAIC04MjAzLDYgKzEyMTM2LDEzNSBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIHZvaWQgYm54MnhfY2hlY2tfb3Zlcl9jdXJyKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MzIgY2ZnX3BpbjsKKwl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OworCXUzMiBwaW5fdmFsOworCisJY2ZnX3BpbiA9IChSRUdfUkQoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCisJCQkgIG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCisJCQkgICAgICAgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uZTNfY21uX3Bpbl9jZmcxKSkgJgorCQkgICBQT1JUX0hXX0NGR19FM19PVkVSX0NVUlJFTlRfTUFTSykgPj4KKwkJUE9SVF9IV19DRkdfRTNfT1ZFUl9DVVJSRU5UX1NISUZUOworCisJLyogSWdub3JlIGNoZWNrIGlmIG5vIGV4dGVybmFsIGlucHV0IFBJTiBhdmFpbGFibGUgKi8KKwlpZiAoYm54MnhfZ2V0X2NmZ19waW4oYnAsIGNmZ19waW4sICZwaW5fdmFsKSAhPSAwKQorCQlyZXR1cm47CisKKwlpZiAoIXBpbl92YWwpIHsKKwkJaWYgKCh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfT1ZFUl9DVVJSRU5UX0ZMQUcpID09IDApIHsKKwkJCW5ldGRldl9lcnIoYnAtPmRldiwgIkVycm9yOiAgUG93ZXIgZmF1bHQgb24gUG9ydCAlZCBoYXMiCisJCQkJCSAgICAiIGJlZW4gZGV0ZWN0ZWQgYW5kIHRoZSBwb3dlciB0byAiCisJCQkJCSAgICAidGhhdCBTRlArIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIgorCQkJCQkgICAgIiB0byBwcmV2ZW50IGZhaWx1cmUgb2YgdGhlIGNhcmQuIgorCQkJCQkgICAgIiBQbGVhc2UgcmVtb3ZlIHRoZSBTRlArIG1vZHVsZSBhbmQiCisJCQkJCSAgICAiIHJlc3RhcnQgdGhlIHN5c3RlbSB0byBjbGVhciB0aGlzIgorCQkJCQkgICAgIiBlcnJvci5cbiIsCisJCQkgcGFyYW1zLT5wb3J0KTsKKwkJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfT1ZFUl9DVVJSRU5UX0ZMQUc7CisJCX0KKwl9IGVsc2UKKwkJdmFycy0+cGh5X2ZsYWdzICY9IH5QSFlfT1ZFUl9DVVJSRU5UX0ZMQUc7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2FuYWx5emVfbGlua19lcnJvcihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsIHUzMiBsc3Nfc3RhdHVzKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCS8qIENvbXBhcmUgbmV3IHZhbHVlIHdpdGggcHJldmlvdXMgdmFsdWUgKi8KKwl1OCBsZWRfbW9kZTsKKwl1MzIgaGFsZl9vcGVuX2Nvbm4gPSAodmFycy0+cGh5X2ZsYWdzICYgUEhZX0hBTEZfT1BFTl9DT05OX0ZMQUcpID4gMDsKKworCS8qRFAoTkVUSUZfTVNHX0xJTkssICJDSEVDSyBMSU5LOiAleCBoYWxmX29wZW46JXgtPiBsc3M6JXhcbiIsCisJCSAgICAgICB2YXJzLT5saW5rX3VwLAorCQkgICAgICAgaGFsZl9vcGVuX2Nvbm4sIGxzc19zdGF0dXMpOyovCisKKwlpZiAoKGxzc19zdGF0dXMgXiBoYWxmX29wZW5fY29ubikgPT0gMCkKKwkJcmV0dXJuOworCisJLyogSWYgdmFsdWVzIGRpZmZlciAqLworCURQKE5FVElGX01TR19MSU5LLCAiTGluayBjaGFuZ2VkOiV4ICV4LT4leFxuIiwgdmFycy0+bGlua191cCwKKwkJICAgICAgIGhhbGZfb3Blbl9jb25uLCBsc3Nfc3RhdHVzKTsKKworCS8qCisJICogYS4gVXBkYXRlIHNobWVtLT5saW5rX3N0YXR1cyBhY2NvcmRpbmdseQorCSAqIGIuIFVwZGF0ZSBsaW5rX3ZhcnMtPmxpbmtfdXAKKwkgKi8KKwlpZiAobHNzX3N0YXR1cykgeworCQl2YXJzLT5saW5rX3N0YXR1cyAmPSB+TElOS19TVEFUVVNfTElOS19VUDsKKwkJdmFycy0+bGlua191cCA9IDA7CisJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfSEFMRl9PUEVOX0NPTk5fRkxBRzsKKwkJLyoKKwkJICogU2V0IExFRCBtb2RlIHRvIG9mZiBzaW5jZSB0aGUgUEhZIGRvZXNuJ3Qga25vdyBhYm91dCB0aGVzZQorCQkgKiBlcnJvcnMKKwkJICovCisJCWxlZF9tb2RlID0gTEVEX01PREVfT0ZGOworCX0gZWxzZSB7CisJCXZhcnMtPmxpbmtfc3RhdHVzIHw9IExJTktfU1RBVFVTX0xJTktfVVA7CisJCXZhcnMtPmxpbmtfdXAgPSAxOworCQl2YXJzLT5waHlfZmxhZ3MgJj0gflBIWV9IQUxGX09QRU5fQ09OTl9GTEFHOworCQlsZWRfbW9kZSA9IExFRF9NT0RFX09QRVI7CisJfQorCS8qIFVwZGF0ZSB0aGUgTEVEIGFjY29yZGluZyB0byB0aGUgbGluayBzdGF0ZSAqLworCWJueDJ4X3NldF9sZWQocGFyYW1zLCB2YXJzLCBsZWRfbW9kZSwgU1BFRURfMTAwMDApOworCisJLyogVXBkYXRlIGxpbmsgc3RhdHVzIGluIHRoZSBzaGFyZWQgbWVtb3J5ICovCisJYm54MnhfdXBkYXRlX21uZyhwYXJhbXMsIHZhcnMtPmxpbmtfc3RhdHVzKTsKKworCS8qIEMuIFRyaWdnZXIgR2VuZXJhbCBBdHRlbnRpb24gKi8KKwl2YXJzLT5wZXJpb2RpY19mbGFncyB8PSBQRVJJT0RJQ19GTEFHU19MSU5LX0VWRU5UOworCWJueDJ4X25vdGlmeV9saW5rX2NoYW5nZWQoYnApOworfQorCitzdGF0aWMgdm9pZCBibngyeF9jaGVja19oYWxmX29wZW5fY29ubihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwl1MzIgbHNzX3N0YXR1cyA9IDA7CisJdTMyIG1hY19iYXNlOworCS8qIEluIGNhc2UgbGluayBzdGF0dXMgaXMgcGh5c2ljYWxseSB1cCBAIDEwRyBkbyAqLworCWlmICgodmFycy0+cGh5X2ZsYWdzICYgUEhZX1BIWVNJQ0FMX0xJTktfRkxBRykgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKCFDSElQX0lTX0UzKGJwKSAmJgorCSAgICAoUkVHX1JEKGJwLCBNSVNDX1JFR19SRVNFVF9SRUdfMikgJgorCQkgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0JNQUMwIDw8IHBhcmFtcy0+cG9ydCkpKSB7CisJCS8qIENoZWNrIEUxWCAvIEUyIEJNQUMgKi8KKwkJdTMyIGxzc19zdGF0dXNfcmVnOworCQl1MzIgd2JfZGF0YVsyXTsKKwkJbWFjX2Jhc2UgPSBwYXJhbXMtPnBvcnQgPyBOSUdfUkVHX0lOR1JFU1NfQk1BQzFfTUVNIDoKKwkJCU5JR19SRUdfSU5HUkVTU19CTUFDMF9NRU07CisJCS8qICBSZWFkIEJJR01BQ19SRUdJU1RFUl9SWF9MU1NfU1RBVFVTICovCisJCWlmIChDSElQX0lTX0UyKGJwKSkKKwkJCWxzc19zdGF0dXNfcmVnID0gQklHTUFDMl9SRUdJU1RFUl9SWF9MU1NfU1RBVDsKKwkJZWxzZQorCQkJbHNzX3N0YXR1c19yZWcgPSBCSUdNQUNfUkVHSVNURVJfUlhfTFNTX1NUQVRVUzsKKworCQlSRUdfUkRfRE1BRShicCwgbWFjX2Jhc2UgKyBsc3Nfc3RhdHVzX3JlZywgd2JfZGF0YSwgMik7CisJCWxzc19zdGF0dXMgPSAod2JfZGF0YVswXSA+IDApOworCisJCWJueDJ4X2FuYWx5emVfbGlua19lcnJvcihwYXJhbXMsIHZhcnMsIGxzc19zdGF0dXMpOworCX0KK30KKwordm9pZCBibngyeF9wZXJpb2RfZnVuYyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgc3RydWN0IGxpbmtfdmFycyAqdmFycykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKKwlpZiAoIXBhcmFtcykgeworCQlEUChORVRJRl9NU0dfTElOSywgIkluaW5pdGxpYXplZCBwYXJhbXMgIVxuIik7CisJCXJldHVybjsKKwl9CisJLyogRFAoTkVUSUZfTVNHX0xJTkssICJQZXJpb2RpYyBjYWxsZWQgdmFycy0+cGh5X2ZsYWdzIDB4JXggc3BlZWQgMHgleAorCSBSRVNFVF9SRUdfMiAweCV4XG4iLCB2YXJzLT5waHlfZmxhZ3MsIHZhcnMtPmxpbmVfc3BlZWQsCisJICBSRUdfUkQoYnAsIE1JU0NfUkVHX1JFU0VUX1JFR18yKSk7ICovCisJYm54MnhfY2hlY2tfaGFsZl9vcGVuX2Nvbm4ocGFyYW1zLCB2YXJzKTsKKwlpZiAoQ0hJUF9JU19FMyhicCkpCisJCWJueDJ4X2NoZWNrX292ZXJfY3VycihwYXJhbXMsIHZhcnMpOworfQorCiB1OCBibngyeF9od19sb2NrX3JlcXVpcmVkKHN0cnVjdCBibngyeCAqYnAsIHUzMiBzaG1lbV9iYXNlLCB1MzIgc2htZW0yX2Jhc2UpCiB7CiAJdTggcGh5X2luZGV4OwpAQCAtODI0NSw3ICsxMjMwNywxNSBAQAogdm9pZCBibngyeF9od19yZXNldF9waHkoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCiB7CiAJdTggcGh5X2luZGV4OwotCWZvciAocGh5X2luZGV4ID0gRVhUX1BIWTE7IHBoeV9pbmRleCA8IE1BWF9QSFlTOworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCWJueDJ4X3VwZGF0ZV9tbmcocGFyYW1zLCAwKTsKKwlibngyeF9iaXRzX2RpcyhicCwgTklHX1JFR19NQVNLX0lOVEVSUlVQVF9QT1JUMCArIHBhcmFtcy0+cG9ydCo0LAorCQkgICAgICAgKE5JR19NQVNLX1hHWFMwX0xJTktfU1RBVFVTIHwKKwkJCU5JR19NQVNLX1hHWFMwX0xJTksxMEcgfAorCQkJTklHX01BU0tfU0VSREVTMF9MSU5LX1NUQVRVUyB8CisJCQlOSUdfTUFTS19NSV9JTlQpKTsKKworCWZvciAocGh5X2luZGV4ID0gSU5UX1BIWTsgcGh5X2luZGV4IDwgTUFYX1BIWVM7CiAJICAgICAgcGh5X2luZGV4KyspIHsKIAkJaWYgKHBhcmFtcy0+cGh5W3BoeV9pbmRleF0uaHdfcmVzZXQpIHsKIAkJCXBhcmFtcy0+cGh5W3BoeV9pbmRleF0uaHdfcmVzZXQoCkBAIC04MjU1LDMgKzEyMzI1LDcyIEBACiAJCX0KIAl9CiB9CisKK3ZvaWQgYm54MnhfaW5pdF9tb2RfYWJzX2ludChzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAorCQkJICAgIHUzMiBjaGlwX2lkLCB1MzIgc2htZW1fYmFzZSwgdTMyIHNobWVtMl9iYXNlLAorCQkJICAgIHU4IHBvcnQpCit7CisJdTggZ3Bpb19udW0gPSAweGZmLCBncGlvX3BvcnQgPSAweGZmLCBwaHlfaW5kZXg7CisJdTMyIHZhbDsKKwl1MzIgb2Zmc2V0LCBhZXVfbWFzaywgc3dhcF92YWwsIHN3YXBfb3ZlcnJpZGUsIHN5bmNfb2Zmc2V0OworCWlmIChDSElQX0lTX0UzKGJwKSkgeworCQlpZiAoYm54MnhfZ2V0X21vZF9hYnNfaW50X2NmZyhicCwgY2hpcF9pZCwKKwkJCQkJICAgICAgc2htZW1fYmFzZSwKKwkJCQkJICAgICAgcG9ydCwKKwkJCQkJICAgICAgJmdwaW9fbnVtLAorCQkJCQkgICAgICAmZ3Bpb19wb3J0KSAhPSAwKQorCQkJcmV0dXJuOworCX0gZWxzZSB7CisJCXN0cnVjdCBibngyeF9waHkgcGh5OworCQlmb3IgKHBoeV9pbmRleCA9IEVYVF9QSFkxOyBwaHlfaW5kZXggPCBNQVhfUEhZUzsKKwkJICAgICAgcGh5X2luZGV4KyspIHsKKwkJCWlmIChibngyeF9wb3B1bGF0ZV9waHkoYnAsIHBoeV9pbmRleCwgc2htZW1fYmFzZSwKKwkJCQkJICAgICAgIHNobWVtMl9iYXNlLCBwb3J0LCAmcGh5KQorCQkJICAgICE9IDApIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgInBvcHVsYXRlIHBoeSBmYWlsZWRcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChwaHkudHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI2KSB7CisJCQkJZ3Bpb19udW0gPSBNSVNDX1JFR0lTVEVSU19HUElPXzM7CisJCQkJZ3Bpb19wb3J0ID0gcG9ydDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChncGlvX251bSA9PSAweGZmKQorCQlyZXR1cm47CisKKwkvKiBTZXQgR1BJTzMgdG8gdHJpZ2dlciBTRlArIG1vZHVsZSBpbnNlcnRpb24vcmVtb3ZhbCAqLworCWJueDJ4X3NldF9ncGlvKGJwLCBncGlvX251bSwgTUlTQ19SRUdJU1RFUlNfR1BJT19JTlBVVF9ISV9aLCBncGlvX3BvcnQpOworCisJc3dhcF92YWwgPSBSRUdfUkQoYnAsIE5JR19SRUdfUE9SVF9TV0FQKTsKKwlzd2FwX292ZXJyaWRlID0gUkVHX1JEKGJwLCBOSUdfUkVHX1NUUkFQX09WRVJSSURFKTsKKwlncGlvX3BvcnQgXj0gKHN3YXBfdmFsICYmIHN3YXBfb3ZlcnJpZGUpOworCisJdmFycy0+YWV1X2ludF9tYXNrID0gQUVVX0lOUFVUU19BVFROX0JJVFNfR1BJTzBfRlVOQ1RJT05fMCA8PAorCQkoZ3Bpb19udW0gKyAoZ3Bpb19wb3J0IDw8IDIpKTsKKworCXN5bmNfb2Zmc2V0ID0gc2htZW1fYmFzZSArCisJCW9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCisJCQkgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uYWV1X2ludF9tYXNrKTsKKwlSRUdfV1IoYnAsIHN5bmNfb2Zmc2V0LCB2YXJzLT5hZXVfaW50X21hc2spOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIE1PRF9BQlMgKEdQSU8lZF9QJWQpIEFFVSB0byAweCV4XG4iLAorCQkgICAgICAgZ3Bpb19udW0sIGdwaW9fcG9ydCwgdmFycy0+YWV1X2ludF9tYXNrKTsKKworCWlmIChwb3J0ID09IDApCisJCW9mZnNldCA9IE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMF9PVVRfMDsKKwllbHNlCisJCW9mZnNldCA9IE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMV9PVVRfMDsKKworCS8qIE9wZW4gYXBwcm9wcmlhdGUgQUVVIGZvciBpbnRlcnJ1cHRzICovCisJYWV1X21hc2sgPSBSRUdfUkQoYnAsIG9mZnNldCk7CisJYWV1X21hc2sgfD0gdmFycy0+YWV1X2ludF9tYXNrOworCVJFR19XUihicCwgb2Zmc2V0LCBhZXVfbWFzayk7CisKKwkvKiBFbmFibGUgdGhlIEdQSU8gdG8gdHJpZ2dlciBpbnRlcnJ1cHQgKi8KKwl2YWwgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0dQSU9fRVZFTlRfRU4pOworCXZhbCB8PSAxIDw8IChncGlvX251bSArIChncGlvX3BvcnQgPDwgMikpOworCVJFR19XUihicCwgTUlTQ19SRUdfR1BJT19FVkVOVF9FTiwgdmFsKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2xpbmsuaCBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2xpbmsuaAppbmRleCA5MmYzNmI2Li42YTc3MDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9saW5rLmgKKysrIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfbGluay5oCkBAIC0zMywxMiArMzMsMTMgQEAKICNkZWZpbmUgQk5YMlhfRkxPV19DVFJMX0JPVEgJCVBPUlRfRkVBVFVSRV9GTE9XX0NPTlRST0xfQk9USAogI2RlZmluZSBCTlgyWF9GTE9XX0NUUkxfTk9ORQkJUE9SVF9GRUFUVVJFX0ZMT1dfQ09OVFJPTF9OT05FCiAKKyNkZWZpbmUgTkVUX1NFUkRFU19JRl9YRkkJCTEKKyNkZWZpbmUgTkVUX1NFUkRFU19JRl9TRkkJCTIKKyNkZWZpbmUgTkVUX1NFUkRFU19JRl9LUgkJMworI2RlZmluZSBORVRfU0VSREVTX0lGX0RYR1hTCTQKKwogI2RlZmluZSBTUEVFRF9BVVRPX05FRwkJMAotI2RlZmluZSBTUEVFRF8xMjAwMAkJMTIwMDAKLSNkZWZpbmUgU1BFRURfMTI1MDAJCTEyNTAwCi0jZGVmaW5lIFNQRUVEXzEzMDAwCQkxMzAwMAotI2RlZmluZSBTUEVFRF8xNTAwMAkJMTUwMDAKLSNkZWZpbmUgU1BFRURfMTYwMDAJCTE2MDAwCisjZGVmaW5lIFNQRUVEXzIwMDAwCQkyMDAwMAogCiAjZGVmaW5lIFNGUF9FRVBST01fVkVORE9SX05BTUVfQUREUgkJMHgxNAogI2RlZmluZSBTRlBfRUVQUk9NX1ZFTkRPUl9OQU1FX1NJWkUJCTE2CkBAIC00Niw2ICs0NywxMiBAQAogI2RlZmluZSBTRlBfRUVQUk9NX1ZFTkRPUl9PVUlfU0laRQkJMwogI2RlZmluZSBTRlBfRUVQUk9NX1BBUlRfTk9fQUREUgkJCTB4MjgKICNkZWZpbmUgU0ZQX0VFUFJPTV9QQVJUX05PX1NJWkUJCQkxNgorI2RlZmluZSBTRlBfRUVQUk9NX1JFVklTSU9OX0FERFIJCTB4MzgKKyNkZWZpbmUgU0ZQX0VFUFJPTV9SRVZJU0lPTl9TSVpFCQk0CisjZGVmaW5lIFNGUF9FRVBST01fU0VSSUFMX0FERFIJCQkweDQ0CisjZGVmaW5lIFNGUF9FRVBST01fU0VSSUFMX1NJWkUJCQkxNgorI2RlZmluZSBTRlBfRUVQUk9NX0RBVEVfQUREUgkJCTB4NTQgLyogQVNDSUkgWVlNTUREICovCisjZGVmaW5lIFNGUF9FRVBST01fREFURV9TSVpFCQkJNgogI2RlZmluZSBQV1JfRkxUX0VSUl9NU0dfTEVOCQkJMjUwCiAKICNkZWZpbmUgWEdYU19FWFRfUEhZX1RZUEUoZXh0X3BoeV9jb25maWcpIFwKQEAgLTYyLDI1ICs2OSwyNiBAQAogI2RlZmluZSBTSU5HTEVfTUVESUEocGFyYW1zKQkJKHBhcmFtcy0+bnVtX3BoeXMgPT0gMikKIC8qIER1YWwgTWVkaWEgYm9hcmQgY29udGFpbnMgdHdvIGV4dGVybmFsIHBoeSB3aXRoIGRpZmZlcmVudCBtZWRpYSAqLwogI2RlZmluZSBEVUFMX01FRElBKHBhcmFtcykJCShwYXJhbXMtPm51bV9waHlzID09IDMpCisKKyNkZWZpbmUgRldfUEFSQU1fUEhZX0FERFJfTUFTSwkJMHgwMDAwMDBGRgorI2RlZmluZSBGV19QQVJBTV9QSFlfVFlQRV9NQVNLCQkweDAwMDBGRjAwCisjZGVmaW5lIEZXX1BBUkFNX01ESU9fQ1RSTF9NQVNLCQkweEZGRkYwMDAwCiAjZGVmaW5lIEZXX1BBUkFNX01ESU9fQ1RSTF9PRkZTRVQJCTE2CisjZGVmaW5lIEZXX1BBUkFNX1BIWV9BRERSKGZ3X3BhcmFtKSAoZndfcGFyYW0gJiBcCisJCQkJCSAgIEZXX1BBUkFNX1BIWV9BRERSX01BU0spCisjZGVmaW5lIEZXX1BBUkFNX1BIWV9UWVBFKGZ3X3BhcmFtKSAoZndfcGFyYW0gJiBcCisJCQkJCSAgIEZXX1BBUkFNX1BIWV9UWVBFX01BU0spCisjZGVmaW5lIEZXX1BBUkFNX01ESU9fQ1RSTChmd19wYXJhbSkgKChmd19wYXJhbSAmIFwKKwkJCQkJICAgIEZXX1BBUkFNX01ESU9fQ1RSTF9NQVNLKSA+PiBcCisJCQkJCSAgICBGV19QQVJBTV9NRElPX0NUUkxfT0ZGU0VUKQogI2RlZmluZSBGV19QQVJBTV9TRVQocGh5X2FkZHIsIHBoeV90eXBlLCBtZGlvX2FjY2VzcykgXAogCShwaHlfYWRkciB8IHBoeV90eXBlIHwgbWRpb19hY2Nlc3MgPDwgRldfUEFSQU1fTURJT19DVFJMX09GRlNFVCkKIAotI2RlZmluZSBQRkNfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUkVTSE9MRF9QQVVTRUFCTEUJCTE3MAotI2RlZmluZSBQRkNfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUkVTSE9MRF9OT05fUEFVU0VBQkxFCQkwCi0KLSNkZWZpbmUgUEZDX0JSQl9NQUNfUEFVU0VfWE9OX1RIUkVTSE9MRF9QQVVTRUFCTEUJCQkyNTAKLSNkZWZpbmUgUEZDX0JSQl9NQUNfUEFVU0VfWE9OX1RIUkVTSE9MRF9OT05fUEFVU0VBQkxFCQkwCi0KLSNkZWZpbmUgUEZDX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUkVTSE9MRF9QQVVTRUFCTEUJCQkxMAotI2RlZmluZSBQRkNfQlJCX01BQ19GVUxMX1hPRkZfVEhSRVNIT0xEX05PTl9QQVVTRUFCTEUJCTkwCi0KLSNkZWZpbmUgUEZDX0JSQl9NQUNfRlVMTF9YT05fVEhSRVNIT0xEX1BBVVNFQUJMRQkJCTUwCi0jZGVmaW5lIFBGQ19CUkJfTUFDX0ZVTExfWE9OX1RIUkVTSE9MRF9OT05fUEFVU0VBQkxFCQkyNTAKIAogI2RlZmluZSBQRkNfQlJCX0ZVTExfTEJfWE9GRl9USFJFU0hPTEQJCQkJMTcwCiAjZGVmaW5lIFBGQ19CUkJfRlVMTF9MQl9YT05fVEhSRVNIT0xECQkJCTI1MAogCisjZGVmaW5lIE1BWFZBTChhLCBiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3RzICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjEsOCArMTI5LDggQEAKIAogCS8qIExvYWRlZCBkdXJpbmcgaW5pdCAqLwogCXU4IGFkZHI7Ci0KLQl1OCBmbGFnczsKKwl1OCBkZWZfbWRfZGV2YWQ7CisJdTE2IGZsYWdzOwogCS8qIFJlcXVpcmUgSFcgbG9jayAqLwogI2RlZmluZSBGTEFHU19IV19MT0NLX1JFUVVJUkVECQkoMTw8MCkKIAkvKiBObyBPdmVyLUN1cnJlbnQgZGV0ZWN0aW9uICovCkBAIC0xMzEsMTEgKzEzOSwxMyBAQAogI2RlZmluZSBGTEFHU19GQU5fRkFJTFVSRV9ERVRfUkVRCSgxPDwyKQogCS8qIEluaXRpYWxpemUgZmlyc3QgdGhlIFhHWFMgYW5kIG9ubHkgdGhlbiB0aGUgcGh5IGl0c2VsZiAqLwogI2RlZmluZSBGTEFHU19JTklUX1hHWFNfRklSU1QJCSgxPDwzKQorI2RlZmluZSBGTEFHU19XQ19EVUFMX01PREUJCSgxPDw0KQorI2RlZmluZSBGTEFHU180X1BPUlRfTU9ERQkJKDE8PDUpCiAjZGVmaW5lIEZMQUdTX1JFQVJNX0xBVENIX1NJR05BTAkoMTw8NikKICNkZWZpbmUgRkxBR1NfU0ZQX05PVF9BUFBST1ZFRAkJKDE8PDcpCisjZGVmaW5lIEZMQUdTX01EQ19NRElPX1dBCQkoMTw8OCkKKyNkZWZpbmUgRkxBR1NfRFVNTVlfUkVBRAkJKDE8PDkpCiAKLQl1OCBkZWZfbWRfZGV2YWQ7Ci0JdTggcmVzZXJ2ZWQ7CiAJLyogcHJlZW1waGFzaXMgdmFsdWVzIGZvciB0aGUgcnggc2lkZSAqLwogCXUxNiByeF9wcmVlbXBoYXNpc1s0XTsKIApAQCAtMTUzLDYgKzE2Myw4IEBACiAjZGVmaW5lCUVUSF9QSFlfWEZQX0ZJQkVSICAgMHgyCiAjZGVmaW5lCUVUSF9QSFlfREFfVFdJTkFYICAgMHgzCiAjZGVmaW5lCUVUSF9QSFlfQkFTRV9UICAgICAgMHg0CisjZGVmaW5lCUVUSF9QSFlfS1IgICAgICAgICAgMHhmMAorI2RlZmluZQlFVEhfUEhZX0NYNCAgICAgICAgIDB4ZjEKICNkZWZpbmUJRVRIX1BIWV9OT1RfUFJFU0VOVCAweGZmCiAKIAkvKiBUaGUgYWRkcmVzcyBpbiB3aGljaCB2ZXJzaW9uIGlzIGxvY2F0ZWQqLwpAQCAtMjM4LDYgKzI1MCw4IEBACiAjZGVmaW5lIEZFQVRVUkVfQ09ORklHX1BGQ19FTkFCTEVECQkJKDE8PDEpCiAjZGVmaW5lIEZFQVRVUkVfQ09ORklHX0JDX1NVUFBPUlRTX09QVF9NRExfVlJGWQkJKDE8PDIpCiAjZGVmaW5lIEZFQVRVUkVfQ09ORklHX0JDX1NVUFBPUlRTX0RVQUxfUEhZX09QVF9NRExfVlJGWQkoMTw8MykKKyNkZWZpbmUgRkVBVFVSRV9DT05GSUdfQVVUT0dSRUVFTl9FTkFCTEVECQkJKDE8PDkpCisjZGVmaW5lIEZFQVRVUkVfQ09ORklHX0JDX1NVUFBPUlRTX1NGUF9UWF9ESVNBQkxFRAkJKDE8PDEwKQogCS8qIFdpbGwgYmUgcG9wdWxhdGVkIGR1cmluZyBjb21tb24gaW5pdCAqLwogCXN0cnVjdCBibngyeF9waHkgcGh5W01BWF9QSFlTXTsKIApAQCAtMjU3LDExICsyNzEsMTkgQEAKIC8qIE91dHB1dCBwYXJhbWV0ZXJzICovCiBzdHJ1Y3QgbGlua192YXJzIHsKIAl1OCBwaHlfZmxhZ3M7CisjZGVmaW5lIFBIWV9YR1hTX0ZMQUcJCQkoMTw8MCkKKyNkZWZpbmUgUEhZX1NHTUlJX0ZMQUcJCQkoMTw8MSkKKyNkZWZpbmUgUEhZX1BIWVNJQ0FMX0xJTktfRkxBRwkJKDE8PDIpCisjZGVmaW5lIFBIWV9IQUxGX09QRU5fQ09OTl9GTEFHCQkoMTw8MykKKyNkZWZpbmUgUEhZX09WRVJfQ1VSUkVOVF9GTEFHCQkoMTw8NCkKKyNkZWZpbmUgUEhZX1RYX0VSUk9SX0NIRUNLX0ZMQUcJCSgxPDw1KQogCiAJdTggbWFjX3R5cGU7CiAjZGVmaW5lIE1BQ19UWVBFX05PTkUJCTAKICNkZWZpbmUgTUFDX1RZUEVfRU1BQwkJMQogI2RlZmluZSBNQUNfVFlQRV9CTUFDCQkyCisjZGVmaW5lIE1BQ19UWVBFX1VNQUMJCTMKKyNkZWZpbmUgTUFDX1RZUEVfWE1BQwkJNAogCiAJdTggcGh5X2xpbmtfdXA7IC8qIGludGVybmFsIHBoeSBsaW5rIGluZGljYXRpb24gKi8KIAl1OCBsaW5rX3VwOwpAQCAtMjc0LDQ1ICsyOTYsNTIgQEAKIAogCS8qIFRoZSBzYW1lIGRlZmluaXRpb25zIGFzIHRoZSBzaG1lbSBwYXJhbWV0ZXIgKi8KIAl1MzIgbGlua19zdGF0dXM7CisJdTggZmF1bHRfZGV0ZWN0ZWQ7CisJdTggcnNydjE7CisJdTE2IHBlcmlvZGljX2ZsYWdzOworI2RlZmluZSBQRVJJT0RJQ19GTEFHU19MSU5LX0VWRU5UCTB4MDAwMQorCisJdTMyIGFldV9pbnRfbWFzazsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGJueDJ4X3BoeV9pbml0KHN0cnVjdCBsaW5rX3BhcmFtcyAqaW5wdXQsIHN0cnVjdCBsaW5rX3ZhcnMgKm91dHB1dCk7CitpbnQgYm54MnhfcGh5X2luaXQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpOwogCiAvKiBSZXNldCB0aGUgbGluay4gU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGRyaXZlciBvciBpbnRlcmZhY2UgZ29lcyBkb3duCiAgICBCZWZvcmUgY2FsbGluZyBwaHkgZmlybXdhcmUgdXBncmFkZSwgdGhlIHJlc2V0X2V4dF9waHkgc2hvdWxkIGJlIHNldAogICAgdG8gMCAqLwotdTggYm54MnhfbGlua19yZXNldChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgc3RydWN0IGxpbmtfdmFycyAqdmFycywKLQkJICB1OCByZXNldF9leHRfcGh5KTsKK2ludCBibngyeF9saW5rX3Jlc2V0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAorCQkgICAgIHU4IHJlc2V0X2V4dF9waHkpOwogCiAvKiBibngyeF9saW5rX3VwZGF0ZSBzaG91bGQgYmUgY2FsbGVkIHVwb24gbGluayBpbnRlcnJ1cHQgKi8KLXU4IGJueDJ4X2xpbmtfdXBkYXRlKHN0cnVjdCBsaW5rX3BhcmFtcyAqaW5wdXQsIHN0cnVjdCBsaW5rX3ZhcnMgKm91dHB1dCk7CitpbnQgYm54MnhfbGlua191cGRhdGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpOwogCiAvKiB1c2UgdGhlIGZvbGxvd2luZyBwaHkgZnVuY3Rpb25zIHRvIHJlYWQvd3JpdGUgZnJvbSBleHRlcm5hbF9waHkKICAgSW4gb3JkZXIgdG8gdXNlIGl0IHRvIHJlYWQvd3JpdGUgaW50ZXJuYWwgcGh5IHJlZ2lzdGVycywgdXNlCiAgIERFRkFVTFRfUEhZX0RFVl9BRERSIGFzIGRldmFkLCBhbmQgKF9iYW5rICsgKF9hZGRyICYgMHhmKSkgYXMKICAgdGhlIHJlZ2lzdGVyICovCi11OCBibngyeF9waHlfcmVhZChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTggcGh5X2FkZHIsCi0JCSAgdTggZGV2YWQsIHUxNiByZWcsIHUxNiAqcmV0X3ZhbCk7CitpbnQgYm54MnhfcGh5X3JlYWQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHU4IHBoeV9hZGRyLAorCQkgICB1OCBkZXZhZCwgdTE2IHJlZywgdTE2ICpyZXRfdmFsKTsKIAotdTggYm54MnhfcGh5X3dyaXRlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1OCBwaHlfYWRkciwKLQkJICAgdTggZGV2YWQsIHUxNiByZWcsIHUxNiB2YWwpOworaW50IGJueDJ4X3BoeV93cml0ZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTggcGh5X2FkZHIsCisJCSAgICB1OCBkZXZhZCwgdTE2IHJlZywgdTE2IHZhbCk7CisKIC8qIFJlYWRzIHRoZSBsaW5rX3N0YXR1cyBmcm9tIHRoZSBzaG1lbSwKICAgIGFuZCB1cGRhdGUgdGhlIGxpbmsgdmFycyBhY2NvcmRpbmdseSAqLwogdm9pZCBibngyeF9saW5rX3N0YXR1c191cGRhdGUoc3RydWN0IGxpbmtfcGFyYW1zICppbnB1dCwKIAkJCSAgICBzdHJ1Y3QgbGlua192YXJzICpvdXRwdXQpOwogLyogcmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmd192ZXJzaW9uIG9mIHRoZSBleHRlcm5hbCBwaHkgKi8KLXU4IGJueDJ4X2dldF9leHRfcGh5X2Z3X3ZlcnNpb24oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHU4IGRyaXZlcl9sb2FkZWQsCi0JCQkgICAgICB1OCAqdmVyc2lvbiwgdTE2IGxlbik7CitpbnQgYm54MnhfZ2V0X2V4dF9waHlfZndfdmVyc2lvbihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgdTggZHJpdmVyX2xvYWRlZCwKKwkJCQkgdTggKnZlcnNpb24sIHUxNiBsZW4pOwogCiAvKiBTZXQvVW5zZXQgdGhlIGxlZAogICAgQmFzaWNhbGx5LCB0aGUgQ0xDIHRha2VzIGNhcmUgb2YgdGhlIGxlZCBmb3IgdGhlIGxpbmssIGJ1dCBpbiBjYXNlIG9uZSBuZWVkcwogICAgdG8gc2V0L3Vuc2V0IHRoZSBsZWQgdW5uYXR1cmFsbHksIHNldCB0aGUgIm1vZGUiIHRvIExFRF9NT0RFX09QRVIgdG8KICAgIGJsaW5rIHRoZSBsZWQsIGFuZCBMRURfTU9ERV9PRkYgdG8gc2V0IHRoZSBsZWQgb2ZmLiovCi11OCBibngyeF9zZXRfbGVkKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAotCQkgdTggbW9kZSwgdTMyIHNwZWVkKTsKK2ludCBibngyeF9zZXRfbGVkKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQkgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsIHU4IG1vZGUsIHUzMiBzcGVlZCk7CiAjZGVmaW5lIExFRF9NT0RFX09GRgkJCTAKICNkZWZpbmUgTEVEX01PREVfT04JCQkxCiAjZGVmaW5lIExFRF9NT0RFX09QRVIJCQkyCkBAIC0zMjQsMTIgKzM1MywxMiBAQAogCiAvKiBHZXQgdGhlIGFjdHVhbCBsaW5rIHN0YXR1cy4gSW4gY2FzZSBpdCByZXR1cm5zIDAsIGxpbmsgaXMgdXAsCiAJb3RoZXJ3aXNlIGxpbmsgaXMgZG93biovCi11OCBibngyeF90ZXN0X2xpbmsoc3RydWN0IGxpbmtfcGFyYW1zICppbnB1dCwgc3RydWN0IGxpbmtfdmFycyAqdmFycywKLQkJICAgdTggaXNfc2VyZGVzKTsKK2ludCBibngyeF90ZXN0X2xpbmsoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCisJCSAgICB1OCBpc19zZXJkZXMpOwogCiAvKiBPbmUtdGltZSBpbml0aWFsaXphdGlvbiBmb3IgZXh0ZXJuYWwgcGh5IGFmdGVyIHBvd2VyIHVwICovCi11OCBibngyeF9jb21tb25faW5pdF9waHkoc3RydWN0IGJueDJ4ICpicCwgdTMyIHNobWVtX2Jhc2VfcGF0aFtdLAotCQkJIHUzMiBzaG1lbTJfYmFzZV9wYXRoW10sIHUzMiBjaGlwX2lkKTsKK2ludCBibngyeF9jb21tb25faW5pdF9waHkoc3RydWN0IGJueDJ4ICpicCwgdTMyIHNobWVtX2Jhc2VfcGF0aFtdLAorCQkJICB1MzIgc2htZW0yX2Jhc2VfcGF0aFtdLCB1MzIgY2hpcF9pZCk7CiAKIC8qIFJlc2V0IHRoZSBleHRlcm5hbCBQSFkgdXNpbmcgR1BJTyAqLwogdm9pZCBibngyeF9leHRfcGh5X2h3X3Jlc2V0KHN0cnVjdCBibngyeCAqYnAsIHU4IHBvcnQpOwpAQCAtMzM4LDkgKzM2Nyw5IEBACiB2b2lkIGJueDJ4X3NmeDcxMDFfc3Bfc3dfcmVzZXQoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X3BoeSAqcGh5KTsKIAogLyogUmVhZCAiYnl0ZV9jbnQiIGJ5dGVzIGZyb20gYWRkcmVzcyAiYWRkciIgZnJvbSB0aGUgU0ZQKyBFRVBST00gKi8KLXU4IGJueDJ4X3JlYWRfc2ZwX21vZHVsZV9lZXByb20oc3RydWN0IGJueDJ4X3BoeSAqcGh5LAotCQkJCXN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1MTYgYWRkciwKLQkJCQl1OCBieXRlX2NudCwgdTggKm9fYnVmKTsKK2ludCBibngyeF9yZWFkX3NmcF9tb2R1bGVfZWVwcm9tKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHUxNiBhZGRyLAorCQkJCSB1OCBieXRlX2NudCwgdTggKm9fYnVmKTsKIAogdm9pZCBibngyeF9od19yZXNldF9waHkoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpOwogCkBAIC0zNTIsMTEgKzM4MSwyOCBAQAogdTMyIGJueDJ4X3BoeV9zZWxlY3Rpb24oc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpOwogCiAvKiBQcm9iZSB0aGUgcGh5cyBvbiBib2FyZCwgYW5kIHBvcHVsYXRlIHRoZW0gaW4gInBhcmFtcyIgKi8KLXU4IGJueDJ4X3BoeV9wcm9iZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcyk7CitpbnQgYm54MnhfcGh5X3Byb2JlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKTsKKwogLyogQ2hlY2tzIGlmIGZhbiBmYWlsdXJlIGRldGVjdGlvbiBpcyByZXF1aXJlZCBvbiBvbmUgb2YgdGhlIHBoeXMgb24gYm9hcmQgKi8KIHU4IGJueDJ4X2Zhbl9mYWlsdXJlX2RldF9yZXEoc3RydWN0IGJueDJ4ICpicCwgdTMyIHNobWVtX2Jhc2UsCiAJCQkgICAgIHUzMiBzaG1lbTJfYmFzZSwgdTggcG9ydCk7CiAKKworCisvKiBEQ0JYIHN0cnVjdHMgKi8KKworLyogTnVtYmVyIG9mIG1heGltdW0gQ09TIHBlciBjaGlwICovCisjZGVmaW5lIERDQlhfRTJFM19NQVhfTlVNX0NPUwkJKDIpCisjZGVmaW5lIERDQlhfRTNCMF9NQVhfTlVNX0NPU19QT1JUMAkoNikKKyNkZWZpbmUgRENCWF9FM0IwX01BWF9OVU1fQ09TX1BPUlQxCSgzKQorI2RlZmluZSBEQ0JYX0UzQjBfTUFYX05VTV9DT1MJCSggXAorCQkJTUFYVkFMKERDQlhfRTNCMF9NQVhfTlVNX0NPU19QT1JUMCwgXAorCQkJICAgIERDQlhfRTNCMF9NQVhfTlVNX0NPU19QT1JUMSkpCisKKyNkZWZpbmUgRENCWF9NQVhfTlVNX0NPUwkJCSggXAorCQkJTUFYVkFMKERDQlhfRTNCMF9NQVhfTlVNX0NPUywgXAorCQkJICAgIERDQlhfRTJFM19NQVhfTlVNX0NPUykpCisKIC8qIFBGQyBwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1zICovCiBzdHJ1Y3QgYm54MnhfbmlnX2JyYl9wZmNfcG9ydF9wYXJhbXMgewogCS8qIE5JRyAqLwpAQCAtMzY0LDggKzQxMCw4IEBACiAJdTMyIGxsZmNfb3V0X2VuOwogCXUzMiBsbGZjX2VuYWJsZTsKIAl1MzIgcGt0X3ByaW9yaXR5X3RvX2NvczsKLQl1MzIgcnhfY29zMF9wcmlvcml0eV9tYXNrOwotCXUzMiByeF9jb3MxX3ByaW9yaXR5X21hc2s7CisJdTggbnVtX29mX3J4X2Nvc19wcmlvcml0eV9tYXNrOworCXUzMiByeF9jb3NfcHJpb3JpdHlfbWFza1tEQ0JYX01BWF9OVU1fQ09TXTsKIAl1MzIgbGxmY19oaWdoX3ByaW9yaXR5X2NsYXNzZXM7CiAJdTMyIGxsZmNfbG93X3ByaW9yaXR5X2NsYXNzZXM7CiAJLyogQlJCICovCkBAIC0zNzMsMjcgKzQxOSw3NCBAQAogCXUzMiBjb3MxX3BhdXNlYWJsZTsKIH07CiAKKworLyogRVRTIHBvcnQgY29uZmlndXJhdGlvbiBwYXJhbXMgKi8KK3N0cnVjdCBibngyeF9ldHNfYndfcGFyYW1zIHsKKwl1OCBidzsKK307CisKK3N0cnVjdCBibngyeF9ldHNfc3BfcGFyYW1zIHsKKwkvKioKKwkgKiB2YWxpZCB2YWx1ZXMgYXJlIDAgLSA1LiAwIGlzIGhpZ2hlc3Qgc3RyaWN0IHByaW9yaXR5LgorCSAqIFRoZXJlIGNhbid0IGJlIHR3byBDT1MncyB3aXRoIHRoZSBzYW1lIHByaS4KKwkgKi8KKwl1OCBwcmk7Cit9OworCitlbnVtIGJueDJ4X2Nvc19zdGF0ZSB7CisJYm54MnhfY29zX3N0YXRlX3N0cmljdCA9IDAsCisJYm54MnhfY29zX3N0YXRlX2J3ID0gMSwKK307CisKK3N0cnVjdCBibngyeF9ldHNfY29zX3BhcmFtcyB7CisJZW51bSBibngyeF9jb3Nfc3RhdGUgc3RhdGUgOworCXVuaW9uIHsKKwkJc3RydWN0IGJueDJ4X2V0c19id19wYXJhbXMgYndfcGFyYW1zOworCQlzdHJ1Y3QgYm54MnhfZXRzX3NwX3BhcmFtcyBzcF9wYXJhbXM7CisJfSBwYXJhbXM7Cit9OworCitzdHJ1Y3QgYm54MnhfZXRzX3BhcmFtcyB7CisJdTggbnVtX29mX2NvczsgLyogTnVtYmVyIG9mIHZhbGlkIENPUyBlbnRyaWVzKi8KKwlzdHJ1Y3QgYm54MnhfZXRzX2Nvc19wYXJhbXMgY29zW0RDQlhfTUFYX05VTV9DT1NdOworfTsKKwogLyoqCiAgKiBVc2VkIHRvIHVwZGF0ZSB0aGUgUEZDIGF0dHJpYnV0ZXMgaW4gRU1BQywgQk1BQywgTklHIGFuZCBCUkIKICAqIHdoZW4gbGluayBpcyBhbHJlYWR5IHVwCiAgKi8KLXZvaWQgYm54MnhfdXBkYXRlX3BmYyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKK2ludCBibngyeF91cGRhdGVfcGZjKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAogCQkgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAogCQkgICAgICBzdHJ1Y3QgYm54MnhfbmlnX2JyYl9wZmNfcG9ydF9wYXJhbXMgKnBmY19wYXJhbXMpOwogCiAKIC8qIFVzZWQgdG8gY29uZmlndXJlIHRoZSBFVFMgdG8gZGlzYWJsZSAqLwotdm9pZCBibngyeF9ldHNfZGlzYWJsZWQoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpOworaW50IGJueDJ4X2V0c19kaXNhYmxlZChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJICAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpOwogCiAvKiBVc2VkIHRvIGNvbmZpZ3VyZSB0aGUgRVRTIHRvIEJXIGxpbWl0ZWQgKi8KIHZvaWQgYm54MnhfZXRzX2J3X2xpbWl0KGNvbnN0IHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBjb25zdCB1MzIgY29zMF9idywKIAkJCWNvbnN0IHUzMiBjb3MxX2J3KTsKIAogLyogVXNlZCB0byBjb25maWd1cmUgdGhlIEVUUyB0byBzdHJpY3QgKi8KLXU4IGJueDJ4X2V0c19zdHJpY3QoY29uc3Qgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIGNvbnN0IHU4IHN0cmljdF9jb3MpOworaW50IGJueDJ4X2V0c19zdHJpY3QoY29uc3Qgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIGNvbnN0IHU4IHN0cmljdF9jb3MpOwogCisKKy8qICBDb25maWd1cmUgdGhlIENPUyB0byBFVFMgYWNjb3JkaW5nIHRvIEJXIGFuZCBTUCBzZXR0aW5ncy4qLworaW50IGJueDJ4X2V0c19lM2IwX2NvbmZpZyhjb25zdCBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSBjb25zdCBzdHJ1Y3QgbGlua192YXJzICp2YXJzLAorCQkJIGNvbnN0IHN0cnVjdCBibngyeF9ldHNfcGFyYW1zICpldHNfcGFyYW1zKTsKIC8qIFJlYWQgcGZjIHN0YXRpc3RpYyovCiB2b2lkIGJueDJ4X3BmY19zdGF0aXN0aWMoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCiAJCQkJCQkgdTMyIHBmY19mcmFtZXNfc2VudFsyXSwKIAkJCQkJCSB1MzIgcGZjX2ZyYW1lc19yZWNlaXZlZFsyXSk7Cit2b2lkIGJueDJ4X2luaXRfbW9kX2Fic19pbnQoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGxpbmtfdmFycyAqdmFycywKKwkJCSAgICB1MzIgY2hpcF9pZCwgdTMyIHNobWVtX2Jhc2UsIHUzMiBzaG1lbTJfYmFzZSwKKwkJCSAgICB1OCBwb3J0KTsKKworaW50IGJueDJ4X3NmcF9tb2R1bGVfZGV0ZWN0aW9uKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCSAgICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcyk7CisKK3ZvaWQgYm54MnhfcGVyaW9kX2Z1bmMoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpOworCiAjZW5kaWYgLyogQk5YMlhfTElOS19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9tYWluLmMgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9tYWluLmMKaW5kZXggNGI3MDMxMS4uMTUwNzA5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X21haW4uYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CkBAIC00OSwxMyArNTAsMTQgQEAKICNpbmNsdWRlIDxsaW51eC96bGliLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKLSNkZWZpbmUgQk5YMlhfTUFJTgogI2luY2x1ZGUgImJueDJ4LmgiCiAjaW5jbHVkZSAiYm54MnhfaW5pdC5oIgogI2luY2x1ZGUgImJueDJ4X2luaXRfb3BzLmgiCiAjaW5jbHVkZSAiYm54MnhfY21uLmgiCiAjaW5jbHVkZSAiYm54MnhfZGNiLmgiCisjaW5jbHVkZSAiYm54Mnhfc3AuaCIKIAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSAiYm54MnhfZndfZmlsZV9oZHIuaCIKQEAgLTczLDEyICs3NSwxNCBAQAogI2RlZmluZSBUWF9USU1FT1VUCQkoNSpIWikKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQotCSJCcm9hZGNvbSBOZXRYdHJlbWUgSUkgNTc3MXggMTBHaWdhYml0IEV0aGVybmV0IERyaXZlciAiCisJIkJyb2FkY29tIE5ldFh0cmVtZSBJSSA1NzcxeC81Nzh4eCAxMC8yMC1HaWdhYml0IEV0aGVybmV0IERyaXZlciAiCiAJRFJWX01PRFVMRV9OQU1FICIgIiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CiAKIE1PRFVMRV9BVVRIT1IoIkVsaWV6ZXIgVGFtaXIiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gTmV0WHRyZW1lIElJICIKLQkJICAgIkJDTTU3NzEwLzU3NzExLzU3NzExRS81NzcxMi81NzcxMkUgRHJpdmVyIik7CisJCSAgICJCQ001NzcxMC81NzcxMS81NzcxMUUvIgorCQkgICAiNTc3MTIvNTc3MTJfTUYvNTc4MDAvNTc4MDBfTUYvNTc4MTAvNTc4MTBfTUYvIgorCQkgICAiNTc4NDAvNTc4NDBfTUYgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOwogTU9EVUxFX0ZJUk1XQVJFKEZXX0ZJTEVfTkFNRV9FMSk7CkBAIC05OSw5ICsxMDMsMTEgQEAKIG1vZHVsZV9wYXJhbShkaXNhYmxlX3RwYSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV90cGEsICIgRGlzYWJsZSB0aGUgVFBBIChMUk8pIGZlYXR1cmUiKTsKIAorI2RlZmluZSBJTlRfTU9ERV9JTlR4CQkJMQorI2RlZmluZSBJTlRfTU9ERV9NU0kJCQkyCiBzdGF0aWMgaW50IGludF9tb2RlOwogbW9kdWxlX3BhcmFtKGludF9tb2RlLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpbnRfbW9kZSwgIiBGb3JjZSBpbnRlcnJ1cHQgbW9kZSBvdGhlciB0aGVuIE1TSS1YICIKK01PRFVMRV9QQVJNX0RFU0MoaW50X21vZGUsICIgRm9yY2UgaW50ZXJydXB0IG1vZGUgb3RoZXIgdGhhbiBNU0ktWCAiCiAJCQkJIigxIElOVCN4OyAyIE1TSSkiKTsKIAogc3RhdGljIGludCBkcm9wbGVzc19mYzsKQEAgLTEyMCwzNyArMTI2LDg3IEBACiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiIERlZmF1bHQgZGVidWcgbXNnbGV2ZWwiKTsKIAotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpibngyeF93cTsKIAotI2lmZGVmIEJDTV9DTklDCi1zdGF0aWMgdTggQUxMX0VOT0RFX01BQ1NbXSA9IHsweDAxLCAweDEwLCAweDE4LCAweDAxLCAweDAwLCAweDAxfTsKLSNlbmRpZgorCitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYm54Mnhfd3E7CiAKIGVudW0gYm54MnhfYm9hcmRfdHlwZSB7CiAJQkNNNTc3MTAgPSAwLAotCUJDTTU3NzExID0gMSwKLQlCQ001NzcxMUUgPSAyLAotCUJDTTU3NzEyID0gMywKLQlCQ001NzcxMkUgPSA0CisJQkNNNTc3MTEsCisJQkNNNTc3MTFFLAorCUJDTTU3NzEyLAorCUJDTTU3NzEyX01GLAorCUJDTTU3ODAwLAorCUJDTTU3ODAwX01GLAorCUJDTTU3ODEwLAorCUJDTTU3ODEwX01GLAorCUJDTTU3ODQwLAorCUJDTTU3ODQwX01GCiB9OwogCiAvKiBpbmRleGVkIGJ5IGJvYXJkX3R5cGUsIGFib3ZlICovCiBzdGF0aWMgc3RydWN0IHsKIAljaGFyICpuYW1lOwogfSBib2FyZF9pbmZvW10gX19kZXZpbml0ZGF0YSA9IHsKLQl7ICJCcm9hZGNvbSBOZXRYdHJlbWUgSUkgQkNNNTc3MTAgWEdiIiB9LAotCXsgIkJyb2FkY29tIE5ldFh0cmVtZSBJSSBCQ001NzcxMSBYR2IiIH0sCi0JeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3NzExRSBYR2IiIH0sCi0JeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3NzEyIFhHYiIgfSwKLQl7ICJCcm9hZGNvbSBOZXRYdHJlbWUgSUkgQkNNNTc3MTJFIFhHYiIgfQorCXsgIkJyb2FkY29tIE5ldFh0cmVtZSBJSSBCQ001NzcxMCAxMCBHaWdhYml0IFBDSWUgW0V2ZXJlc3RdIiB9LAorCXsgIkJyb2FkY29tIE5ldFh0cmVtZSBJSSBCQ001NzcxMSAxMCBHaWdhYml0IFBDSWUiIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3NzExRSAxMCBHaWdhYml0IFBDSWUiIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3NzEyIDEwIEdpZ2FiaXQgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3NzEyIDEwIEdpZ2FiaXQgRXRoZXJuZXQgTXVsdGkgRnVuY3Rpb24iIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3ODAwIDEwIEdpZ2FiaXQgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3ODAwIDEwIEdpZ2FiaXQgRXRoZXJuZXQgTXVsdGkgRnVuY3Rpb24iIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3ODEwIDEwIEdpZ2FiaXQgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3ODEwIDEwIEdpZ2FiaXQgRXRoZXJuZXQgTXVsdGkgRnVuY3Rpb24iIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3ODQwIDEwLzIwIEdpZ2FiaXQgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3ODQwIDEwLzIwIEdpZ2FiaXQgIgorCQkJCQkJIkV0aGVybmV0IE11bHRpIEZ1bmN0aW9uIn0KIH07CiAKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9OWDJfNTc3MTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OWDJfNTc3MTAJCUNISVBfTlVNXzU3NzEwCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9OWDJfNTc3MTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OWDJfNTc3MTEJCUNISVBfTlVNXzU3NzExCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9OWDJfNTc3MTFFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyXzU3NzExRQlDSElQX05VTV81NzcxMUUKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX05YMl81NzcxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05YMl81NzcxMgkJQ0hJUF9OVU1fNTc3MTIKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX05YMl81NzcxMl9NRgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05YMl81NzcxMl9NRglDSElQX05VTV81NzcxMl9NRgorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfTlgyXzU3ODAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyXzU3ODAwCQlDSElQX05VTV81NzgwMAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfTlgyXzU3ODAwX01GCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyXzU3ODAwX01GCUNISVBfTlVNXzU3ODAwX01GCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9OWDJfNTc4MTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OWDJfNTc4MTAJCUNISVBfTlVNXzU3ODEwCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9OWDJfNTc4MTBfTUYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OWDJfNTc4MTBfTUYJQ0hJUF9OVU1fNTc4MTBfTUYKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX05YMl81Nzg0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05YMl81Nzg0MAkJQ0hJUF9OVU1fNTc4NDAKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX05YMl81Nzg0MF9NRgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05YMl81Nzg0MF9NRglDSElQX05VTV81Nzg0MF9NRgorI2VuZGlmCiBzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoYm54MnhfcGNpX3RibCkgPSB7CiAJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgUENJX0RFVklDRV9JRF9OWDJfNTc3MTApLCBCQ001NzcxMCB9LAogCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfTlgyXzU3NzExKSwgQkNNNTc3MTEgfSwKIAl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCBQQ0lfREVWSUNFX0lEX05YMl81NzcxMUUpLCBCQ001NzcxMUUgfSwKIAl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCBQQ0lfREVWSUNFX0lEX05YMl81NzcxMiksIEJDTTU3NzEyIH0sCi0JeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgUENJX0RFVklDRV9JRF9OWDJfNTc3MTJFKSwgQkNNNTc3MTJFIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgUENJX0RFVklDRV9JRF9OWDJfNTc3MTJfTUYpLCBCQ001NzcxMl9NRiB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfTlgyXzU3ODAwKSwgQkNNNTc4MDAgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCBQQ0lfREVWSUNFX0lEX05YMl81NzgwMF9NRiksIEJDTTU3ODAwX01GIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgUENJX0RFVklDRV9JRF9OWDJfNTc4MTApLCBCQ001NzgxMCB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfTlgyXzU3ODEwX01GKSwgQkNNNTc4MTBfTUYgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCBQQ0lfREVWSUNFX0lEX05YMl81Nzg0MCksIEJDTTU3ODQwIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgUENJX0RFVklDRV9JRF9OWDJfNTc4NDBfTUYpLCBCQ001Nzg0MF9NRiB9LAogCXsgMCB9CiB9OwogCkBAIC0xNjcsNDggKzIyMyw2IEBACiAJUkVHX1dSKGJwLCAgYWRkciArIDQsIFU2NF9ISShtYXBwaW5nKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3N0b3JtX21lbXNldF9maWxsKHN0cnVjdCBibngyeCAqYnAsCi0JCQkJICAgICAgIHUzMiBhZGRyLCBzaXplX3Qgc2l6ZSwgdTMyIHZhbCkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZS80OyBpKyspCi0JCVJFR19XUihicCwgIGFkZHIgKyAoaSAqIDQpLCB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3Rvcm1fbWVtc2V0X3VzdGF0c196ZXJvKHN0cnVjdCBibngyeCAqYnAsCi0JCQkJCSAgICB1OCBwb3J0LCB1MTYgc3RhdF9pZCkKLXsKLQlzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdXN0b3JtX3Blcl9jbGllbnRfc3RhdHMpOwotCi0JdTMyIGFkZHIgPSBCQVJfVVNUUk9STV9JTlRNRU0gKwotCQkJVVNUT1JNX1BFUl9DT1VOVEVSX0lEX1NUQVRTX09GRlNFVChwb3J0LCBzdGF0X2lkKTsKLQotCV9fc3Rvcm1fbWVtc2V0X2ZpbGwoYnAsIGFkZHIsIHNpemUsIDApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3Rvcm1fbWVtc2V0X3RzdGF0c196ZXJvKHN0cnVjdCBibngyeCAqYnAsCi0JCQkJCSAgICB1OCBwb3J0LCB1MTYgc3RhdF9pZCkKLXsKLQlzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHN0b3JtX3Blcl9jbGllbnRfc3RhdHMpOwotCi0JdTMyIGFkZHIgPSBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkJVFNUT1JNX1BFUl9DT1VOVEVSX0lEX1NUQVRTX09GRlNFVChwb3J0LCBzdGF0X2lkKTsKLQotCV9fc3Rvcm1fbWVtc2V0X2ZpbGwoYnAsIGFkZHIsIHNpemUsIDApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3Rvcm1fbWVtc2V0X3hzdGF0c196ZXJvKHN0cnVjdCBibngyeCAqYnAsCi0JCQkJCSAgICB1OCBwb3J0LCB1MTYgc3RhdF9pZCkKLXsKLQlzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeHN0b3JtX3Blcl9jbGllbnRfc3RhdHMpOwotCi0JdTMyIGFkZHIgPSBCQVJfWFNUUk9STV9JTlRNRU0gKwotCQkJWFNUT1JNX1BFUl9DT1VOVEVSX0lEX1NUQVRTX09GRlNFVChwb3J0LCBzdGF0X2lkKTsKLQotCV9fc3Rvcm1fbWVtc2V0X2ZpbGwoYnAsIGFkZHIsIHNpemUsIDApOwotfQotCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzdG9ybV9tZW1zZXRfc3BxX2FkZHIoc3RydWN0IGJueDJ4ICpicCwKIAkJCQkJIGRtYV9hZGRyX3QgbWFwcGluZywgdTE2IGFic19maWQpCiB7CkBAIC0yMTgsMTAzICsyMzIsNiBAQAogCV9fc3Rvcm1fbWVtc2V0X2RtYV9tYXBwaW5nKGJwLCBhZGRyLCBtYXBwaW5nKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHN0b3JtX21lbXNldF9vdihzdHJ1Y3QgYm54MnggKmJwLCB1MTYgb3YsIHUxNiBhYnNfZmlkKQotewotCVJFR19XUjE2KGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKyBYU1RPUk1fRTFIT1ZfT0ZGU0VUKGFic19maWQpLCBvdik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdG9ybV9tZW1zZXRfZnVuY19jZmcoc3RydWN0IGJueDJ4ICpicCwKLQkJCQlzdHJ1Y3QgdHN0b3JtX2V0aF9mdW5jdGlvbl9jb21tb25fY29uZmlnICp0Y2ZnLAotCQkJCXUxNiBhYnNfZmlkKQotewotCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCB0c3Rvcm1fZXRoX2Z1bmN0aW9uX2NvbW1vbl9jb25maWcpOwotCi0JdTMyIGFkZHIgPSBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkJVFNUT1JNX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfT0ZGU0VUKGFic19maWQpOwotCi0JX19zdG9ybV9tZW1zZXRfc3RydWN0KGJwLCBhZGRyLCBzaXplLCAodTMyICopdGNmZyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdG9ybV9tZW1zZXRfeHN0YXRzX2ZsYWdzKHN0cnVjdCBibngyeCAqYnAsCi0JCQkJc3RydWN0IHN0YXRzX2luZGljYXRpb25fZmxhZ3MgKmZsYWdzLAotCQkJCXUxNiBhYnNfZmlkKQotewotCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBzdGF0c19pbmRpY2F0aW9uX2ZsYWdzKTsKLQotCXUzMiBhZGRyID0gQkFSX1hTVFJPUk1fSU5UTUVNICsgWFNUT1JNX1NUQVRTX0ZMQUdTX09GRlNFVChhYnNfZmlkKTsKLQotCV9fc3Rvcm1fbWVtc2V0X3N0cnVjdChicCwgYWRkciwgc2l6ZSwgKHUzMiAqKWZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0b3JtX21lbXNldF90c3RhdHNfZmxhZ3Moc3RydWN0IGJueDJ4ICpicCwKLQkJCQlzdHJ1Y3Qgc3RhdHNfaW5kaWNhdGlvbl9mbGFncyAqZmxhZ3MsCi0JCQkJdTE2IGFic19maWQpCi17Ci0Jc2l6ZV90IHNpemUgPSBzaXplb2Yoc3RydWN0IHN0YXRzX2luZGljYXRpb25fZmxhZ3MpOwotCi0JdTMyIGFkZHIgPSBCQVJfVFNUUk9STV9JTlRNRU0gKyBUU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKGFic19maWQpOwotCi0JX19zdG9ybV9tZW1zZXRfc3RydWN0KGJwLCBhZGRyLCBzaXplLCAodTMyICopZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3Rvcm1fbWVtc2V0X3VzdGF0c19mbGFncyhzdHJ1Y3QgYm54MnggKmJwLAotCQkJCXN0cnVjdCBzdGF0c19pbmRpY2F0aW9uX2ZsYWdzICpmbGFncywKLQkJCQl1MTYgYWJzX2ZpZCkKLXsKLQlzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc3RhdHNfaW5kaWNhdGlvbl9mbGFncyk7Ci0KLQl1MzIgYWRkciA9IEJBUl9VU1RST1JNX0lOVE1FTSArIFVTVE9STV9TVEFUU19GTEFHU19PRkZTRVQoYWJzX2ZpZCk7Ci0KLQlfX3N0b3JtX21lbXNldF9zdHJ1Y3QoYnAsIGFkZHIsIHNpemUsICh1MzIgKilmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdG9ybV9tZW1zZXRfY3N0YXRzX2ZsYWdzKHN0cnVjdCBibngyeCAqYnAsCi0JCQkJc3RydWN0IHN0YXRzX2luZGljYXRpb25fZmxhZ3MgKmZsYWdzLAotCQkJCXUxNiBhYnNfZmlkKQotewotCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBzdGF0c19pbmRpY2F0aW9uX2ZsYWdzKTsKLQotCXUzMiBhZGRyID0gQkFSX0NTVFJPUk1fSU5UTUVNICsgQ1NUT1JNX1NUQVRTX0ZMQUdTX09GRlNFVChhYnNfZmlkKTsKLQotCV9fc3Rvcm1fbWVtc2V0X3N0cnVjdChicCwgYWRkciwgc2l6ZSwgKHUzMiAqKWZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0b3JtX21lbXNldF94c3RhdHNfYWRkcihzdHJ1Y3QgYm54MnggKmJwLAotCQkJCQkgICBkbWFfYWRkcl90IG1hcHBpbmcsIHUxNiBhYnNfZmlkKQotewotCXUzMiBhZGRyID0gQkFSX1hTVFJPUk1fSU5UTUVNICsKLQkJWFNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChhYnNfZmlkKTsKLQotCV9fc3Rvcm1fbWVtc2V0X2RtYV9tYXBwaW5nKGJwLCBhZGRyLCBtYXBwaW5nKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0b3JtX21lbXNldF90c3RhdHNfYWRkcihzdHJ1Y3QgYm54MnggKmJwLAotCQkJCQkgICBkbWFfYWRkcl90IG1hcHBpbmcsIHUxNiBhYnNfZmlkKQotewotCXUzMiBhZGRyID0gQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkJVFNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChhYnNfZmlkKTsKLQotCV9fc3Rvcm1fbWVtc2V0X2RtYV9tYXBwaW5nKGJwLCBhZGRyLCBtYXBwaW5nKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0b3JtX21lbXNldF91c3RhdHNfYWRkcihzdHJ1Y3QgYm54MnggKmJwLAotCQkJCQkgICBkbWFfYWRkcl90IG1hcHBpbmcsIHUxNiBhYnNfZmlkKQotewotCXUzMiBhZGRyID0gQkFSX1VTVFJPUk1fSU5UTUVNICsKLQkJVVNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChhYnNfZmlkKTsKLQotCV9fc3Rvcm1fbWVtc2V0X2RtYV9tYXBwaW5nKGJwLCBhZGRyLCBtYXBwaW5nKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0b3JtX21lbXNldF9jc3RhdHNfYWRkcihzdHJ1Y3QgYm54MnggKmJwLAotCQkJCQkgICBkbWFfYWRkcl90IG1hcHBpbmcsIHUxNiBhYnNfZmlkKQotewotCXUzMiBhZGRyID0gQkFSX0NTVFJPUk1fSU5UTUVNICsKLQkJQ1NUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChhYnNfZmlkKTsKLQotCV9fc3Rvcm1fbWVtc2V0X2RtYV9tYXBwaW5nKGJwLCBhZGRyLCBtYXBwaW5nKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHN0b3JtX21lbXNldF92Zl90b19wZihzdHJ1Y3QgYm54MnggKmJwLCB1MTYgYWJzX2ZpZCwKIAkJCQkJIHUxNiBwZl9pZCkKIHsKQEAgLTM1OSw0NSArMjc2LDYgQEAKIAlSRUdfV1IxNihicCwgYWRkciwgZXFfcHJvZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzdG9ybV9tZW1zZXRfaGNfdGltZW91dChzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LAotCQkJCQkgICAgIHUxNiBmd19zYl9pZCwgdTggc2JfaW5kZXgsCi0JCQkJCSAgICAgdTggdGlja3MpCi17Ci0KLQlpbnQgaW5kZXhfb2Zmc2V0ID0gQ0hJUF9JU19FMihicCkgPwotCQlvZmZzZXRvZihzdHJ1Y3QgaGNfc3RhdHVzX2Jsb2NrX2RhdGFfZTIsIGluZGV4X2RhdGEpIDoKLQkJb2Zmc2V0b2Yoc3RydWN0IGhjX3N0YXR1c19ibG9ja19kYXRhX2UxeCwgaW5kZXhfZGF0YSk7Ci0JdTMyIGFkZHIgPSBCQVJfQ1NUUk9STV9JTlRNRU0gKwotCQkJQ1NUT1JNX1NUQVRVU19CTE9DS19EQVRBX09GRlNFVChmd19zYl9pZCkgKwotCQkJaW5kZXhfb2Zmc2V0ICsKLQkJCXNpemVvZihzdHJ1Y3QgaGNfaW5kZXhfZGF0YSkqc2JfaW5kZXggKwotCQkJb2Zmc2V0b2Yoc3RydWN0IGhjX2luZGV4X2RhdGEsIHRpbWVvdXQpOwotCVJFR19XUjgoYnAsIGFkZHIsIHRpY2tzKTsKLQlEUChORVRJRl9NU0dfSFcsICJwb3J0ICV4IGZ3X3NiX2lkICVkIHNiX2luZGV4ICVkIHRpY2tzICVkXG4iLAotCQkJICBwb3J0LCBmd19zYl9pZCwgc2JfaW5kZXgsIHRpY2tzKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdG9ybV9tZW1zZXRfaGNfZGlzYWJsZShzdHJ1Y3QgYm54MnggKmJwLCB1OCBwb3J0LAotCQkJCQkgICAgIHUxNiBmd19zYl9pZCwgdTggc2JfaW5kZXgsCi0JCQkJCSAgICAgdTggZGlzYWJsZSkKLXsKLQl1MzIgZW5hYmxlX2ZsYWcgPSBkaXNhYmxlID8gMCA6ICgxIDw8IEhDX0lOREVYX0RBVEFfSENfRU5BQkxFRF9TSElGVCk7Ci0JaW50IGluZGV4X29mZnNldCA9IENISVBfSVNfRTIoYnApID8KLQkJb2Zmc2V0b2Yoc3RydWN0IGhjX3N0YXR1c19ibG9ja19kYXRhX2UyLCBpbmRleF9kYXRhKSA6Ci0JCW9mZnNldG9mKHN0cnVjdCBoY19zdGF0dXNfYmxvY2tfZGF0YV9lMXgsIGluZGV4X2RhdGEpOwotCXUzMiBhZGRyID0gQkFSX0NTVFJPUk1fSU5UTUVNICsKLQkJCUNTVE9STV9TVEFUVVNfQkxPQ0tfREFUQV9PRkZTRVQoZndfc2JfaWQpICsKLQkJCWluZGV4X29mZnNldCArCi0JCQlzaXplb2Yoc3RydWN0IGhjX2luZGV4X2RhdGEpKnNiX2luZGV4ICsKLQkJCW9mZnNldG9mKHN0cnVjdCBoY19pbmRleF9kYXRhLCBmbGFncyk7Ci0JdTE2IGZsYWdzID0gUkVHX1JEMTYoYnAsIGFkZHIpOwotCS8qIGNsZWFyIGFuZCBzZXQgKi8KLQlmbGFncyAmPSB+SENfSU5ERVhfREFUQV9IQ19FTkFCTEVEOwotCWZsYWdzIHw9IGVuYWJsZV9mbGFnOwotCVJFR19XUjE2KGJwLCBhZGRyLCBmbGFncyk7Ci0JRFAoTkVUSUZfTVNHX0hXLCAicG9ydCAleCBmd19zYl9pZCAlZCBzYl9pbmRleCAlZCBkaXNhYmxlICVkXG4iLAotCQkJICBwb3J0LCBmd19zYl9pZCwgc2JfaW5kZXgsIGRpc2FibGUpOwotfQotCiAvKiB1c2VkIG9ubHkgYXQgaW5pdAogICogbG9ja2luZyBpcyBkb25lIGJ5IG1jcAogICovCkBAIC00OTEsMTMgKzM2OSw2IEBACiAKIH0KIAotY29uc3QgdTMyIGRtYWVfcmVnX2dvX2NbXSA9IHsKLQlETUFFX1JFR19HT19DMCwgRE1BRV9SRUdfR09fQzEsIERNQUVfUkVHX0dPX0MyLCBETUFFX1JFR19HT19DMywKLQlETUFFX1JFR19HT19DNCwgRE1BRV9SRUdfR09fQzUsIERNQUVfUkVHX0dPX0M2LCBETUFFX1JFR19HT19DNywKLQlETUFFX1JFR19HT19DOCwgRE1BRV9SRUdfR09fQzksIERNQUVfUkVHX0dPX0MxMCwgRE1BRV9SRUdfR09fQzExLAotCURNQUVfUkVHX0dPX0MxMiwgRE1BRV9SRUdfR09fQzEzLCBETUFFX1JFR19HT19DMTQsIERNQUVfUkVHX0dPX0MxNQotfTsKLQogLyogY29weSBjb21tYW5kIGludG8gRE1BRSBjb21tYW5kIG1lbW9yeSBhbmQgc2V0IERNQUUgY29tbWFuZCBnbyAqLwogdm9pZCBibngyeF9wb3N0X2RtYWUoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGRtYWVfY29tbWFuZCAqZG1hZSwgaW50IGlkeCkKIHsKQEAgLTU3OCw3ICs0NDksMTEgQEAKIAkgICBicC0+c2xvd3BhdGgtPndiX2RhdGFbMF0sIGJwLT5zbG93cGF0aC0+d2JfZGF0YVsxXSwKIAkgICBicC0+c2xvd3BhdGgtPndiX2RhdGFbMl0sIGJwLT5zbG93cGF0aC0+d2JfZGF0YVszXSk7CiAKLQkvKiBsb2NrIHRoZSBkbWFlIGNoYW5uZWwgKi8KKwkvKgorCSAqIExvY2sgdGhlIGRtYWUgY2hhbm5lbC4gRGlzYWJsZSBCSHMgdG8gcHJldmVudCBhIGRlYWQtbG9jaworCSAqIGFzIGxvbmcgYXMgdGhpcyBjb2RlIGlzIGNhbGxlZCBib3RoIGZyb20gc3lzY2FsbCBjb250ZXh0IGFuZAorCSAqIGZyb20gbmRvX3NldF9yeF9tb2RlKCkgZmxvdyB0aGF0IG1heSBiZSBjYWxsZWQgZnJvbSBCSC4KKwkgKi8KIAlzcGluX2xvY2tfYmgoJmJwLT5kbWFlX2xvY2spOwogCiAJLyogcmVzZXQgY29tcGxldGlvbiAqLwpAQCAtODMzLDkgKzcwOCw5IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBibngyeF9md19kdW1wKHN0cnVjdCBibngyeCAqYnApCit2b2lkIGJueDJ4X2Z3X2R1bXBfbHZsKHN0cnVjdCBibngyeCAqYnAsIGNvbnN0IGNoYXIgKmx2bCkKIHsKLQl1MzIgYWRkcjsKKwl1MzIgYWRkciwgdmFsOwogCXUzMiBtYXJrLCBvZmZzZXQ7CiAJX19iZTMyIGRhdGFbOV07CiAJaW50IHdvcmQ7CkBAIC04NDQsNiArNzE5LDE0IEBACiAJCUJOWDJYX0VSUigiTk8gTUNQIC0gY2FuIG5vdCBkdW1wXG4iKTsKIAkJcmV0dXJuOwogCX0KKwluZXRkZXZfcHJpbnRrKGx2bCwgYnAtPmRldiwgImJjICVkLiVkLiVkXG4iLAorCQkoYnAtPmNvbW1vbi5iY192ZXIgJiAweGZmMDAwMCkgPj4gMTYsCisJCShicC0+Y29tbW9uLmJjX3ZlciAmIDB4ZmYwMCkgPj4gOCwKKwkJKGJwLT5jb21tb24uYmNfdmVyICYgMHhmZikpOworCisJdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfQ1BVX1BST0dSQU1fQ09VTlRFUik7CisJaWYgKHZhbCA9PSBSRUdfUkQoYnAsIE1DUF9SRUdfTUNQUl9DUFVfUFJPR1JBTV9DT1VOVEVSKSkKKwkJcHJpbnRrKCIlcyIgIk1DUCBQQyBhdCAweCV4XG4iLCBsdmwsIHZhbCk7CiAKIAlpZiAoQlBfUEFUSChicCkgPT0gMCkKIAkJdHJhY2Vfc2htZW1fYmFzZSA9IGJwLT5jb21tb24uc2htZW1fYmFzZTsKQEAgLTg1Myw5ICs3MzYsOSBAQAogCW1hcmsgPSBSRUdfUkQoYnAsIGFkZHIpOwogCW1hcmsgPSAoQ0hJUF9JU19FMXgoYnApID8gTUNQX1JFR19NQ1BSX1NDUkFUQ0ggOiBNQ1BfQV9SRUdfTUNQUl9TQ1JBVENIKQogCQkJKyAoKG1hcmsgKyAweDMpICYgfjB4MykgLSAweDA4MDAwMDAwOwotCXByX2VycigiYmVnaW4gZncgZHVtcCAobWFyayAweCV4KVxuIiwgbWFyayk7CisJcHJpbnRrKCIlcyIgImJlZ2luIGZ3IGR1bXAgKG1hcmsgMHgleClcbiIsIGx2bCwgbWFyayk7CiAKLQlwcl9lcnIoIiIpOworCXByaW50aygiJXMiLCBsdmwpOwogCWZvciAob2Zmc2V0ID0gbWFyazsgb2Zmc2V0IDw9IHRyYWNlX3NobWVtX2Jhc2U7IG9mZnNldCArPSAweDgqNCkgewogCQlmb3IgKHdvcmQgPSAwOyB3b3JkIDwgODsgd29yZCsrKQogCQkJZGF0YVt3b3JkXSA9IGh0b25sKFJFR19SRChicCwgb2Zmc2V0ICsgNCp3b3JkKSk7CkBAIC04NjgsNyArNzUxLDEyIEBACiAJCWRhdGFbOF0gPSAweDA7CiAJCXByX2NvbnQoIiVzIiwgKGNoYXIgKilkYXRhKTsKIAl9Ci0JcHJfZXJyKCJlbmQgb2YgZncgZHVtcFxuIik7CisJcHJpbnRrKCIlcyIgImVuZCBvZiBmdyBkdW1wXG4iLCBsdmwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfZndfZHVtcChzdHJ1Y3QgYm54MnggKmJwKQoreworCWJueDJ4X2Z3X2R1bXBfbHZsKGJwLCBLRVJOX0VSUik7CiB9CiAKIHZvaWQgYm54MnhfcGFuaWNfZHVtcChzdHJ1Y3QgYm54MnggKmJwKQpAQCAtODc5LDYgKzc2Nyw3IEBACiAJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKICNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCiAJdTE2IHN0YXJ0ID0gMCwgZW5kID0gMDsKKwl1OCBjb3M7CiAjZW5kaWYKIAogCWJwLT5zdGF0c19zdGF0ZSA9IFNUQVRTX1NUQVRFX0RJU0FCTEVEOwpAQCAtODg5LDkgKzc3OCw5IEBACiAJLyogSW5kaWNlcyAqLwogCS8qIENvbW1vbiAqLwogCUJOWDJYX0VSUigiZGVmX2lkeCgweCV4KSAgZGVmX2F0dF9pZHgoMHgleCkgIGF0dG5fc3RhdGUoMHgleCkiCi0JCSAgIiAgc3BxX3Byb2RfaWR4KDB4JXgpXG4iLAotCQkgIGJwLT5kZWZfaWR4LCBicC0+ZGVmX2F0dF9pZHgsCi0JCSAgYnAtPmF0dG5fc3RhdGUsIGJwLT5zcHFfcHJvZF9pZHgpOworCQkgICIgIHNwcV9wcm9kX2lkeCgweCV4KSBuZXh0X3N0YXRzX2NudCgweCV4KVxuIiwKKwkJICBicC0+ZGVmX2lkeCwgYnAtPmRlZl9hdHRfaWR4LCBicC0+YXR0bl9zdGF0ZSwKKwkJICBicC0+c3BxX3Byb2RfaWR4LCBicC0+c3RhdHNfY291bnRlcik7CiAJQk5YMlhfRVJSKCJEU0I6IGF0dG4gYml0cygweCV4KSAgYWNrKDB4JXgpICBpZCgweCV4KSAgaWR4KDB4JXgpXG4iLAogCQkgIGJwLT5kZWZfc3RhdHVzX2Jsay0+YXR0ZW5fc3RhdHVzX2Jsb2NrLmF0dG5fYml0cywKIAkJICBicC0+ZGVmX3N0YXR1c19ibGstPmF0dGVuX3N0YXR1c19ibG9jay5hdHRuX2JpdHNfYWNrLApAQCAtOTA4LDE1ICs3OTcsMTcgQEAKIAkJCUNTVE9STV9TUF9TVEFUVVNfQkxPQ0tfREFUQV9PRkZTRVQoZnVuYykgKwogCQkJaSpzaXplb2YodTMyKSk7CiAKLQlwcl9jb250KCJpZ3Vfc2JfaWQoMHgleCkgIGlndV9zZWdfaWQgKDB4JXgpICIKKwlwcl9jb250KCJpZ3Vfc2JfaWQoMHgleCkgIGlndV9zZWdfaWQoMHgleCkgIgogCQkJICJwZl9pZCgweCV4KSAgdm5pY19pZCgweCV4KSAgIgotCQkJICJ2Zl9pZCgweCV4KSAgdmZfdmFsaWQgKDB4JXgpXG4iLAorCQkJICJ2Zl9pZCgweCV4KSAgdmZfdmFsaWQgKDB4JXgpICIKKwkJCSAic3RhdGUoMHgleClcbiIsCiAJICAgICAgIHNwX3NiX2RhdGEuaWd1X3NiX2lkLAogCSAgICAgICBzcF9zYl9kYXRhLmlndV9zZWdfaWQsCiAJICAgICAgIHNwX3NiX2RhdGEucF9mdW5jLnBmX2lkLAogCSAgICAgICBzcF9zYl9kYXRhLnBfZnVuYy52bmljX2lkLAogCSAgICAgICBzcF9zYl9kYXRhLnBfZnVuYy52Zl9pZCwKLQkgICAgICAgc3Bfc2JfZGF0YS5wX2Z1bmMudmZfdmFsaWQpOworCSAgICAgICBzcF9zYl9kYXRhLnBfZnVuYy52Zl92YWxpZCwKKwkgICAgICAgc3Bfc2JfZGF0YS5zdGF0ZSk7CiAKIAogCWZvcl9lYWNoX2V0aF9xdWV1ZShicCwgaSkgewpAQCAtOTI1LDE1ICs4MTYsMTYgQEAKIAkJc3RydWN0IGhjX3N0YXR1c19ibG9ja19kYXRhX2UyIHNiX2RhdGFfZTI7CiAJCXN0cnVjdCBoY19zdGF0dXNfYmxvY2tfZGF0YV9lMXggc2JfZGF0YV9lMXg7CiAJCXN0cnVjdCBoY19zdGF0dXNfYmxvY2tfc20gICpoY19zbV9wID0KLQkJCUNISVBfSVNfRTIoYnApID8KLQkJCXNiX2RhdGFfZTIuY29tbW9uLnN0YXRlX21hY2hpbmUgOgotCQkJc2JfZGF0YV9lMXguY29tbW9uLnN0YXRlX21hY2hpbmU7CisJCQlDSElQX0lTX0UxeChicCkgPworCQkJc2JfZGF0YV9lMXguY29tbW9uLnN0YXRlX21hY2hpbmUgOgorCQkJc2JfZGF0YV9lMi5jb21tb24uc3RhdGVfbWFjaGluZTsKIAkJc3RydWN0IGhjX2luZGV4X2RhdGEgKmhjX2luZGV4X3AgPQotCQkJQ0hJUF9JU19FMihicCkgPwotCQkJc2JfZGF0YV9lMi5pbmRleF9kYXRhIDoKLQkJCXNiX2RhdGFfZTF4LmluZGV4X2RhdGE7Ci0JCWludCBkYXRhX3NpemU7CisJCQlDSElQX0lTX0UxeChicCkgPworCQkJc2JfZGF0YV9lMXguaW5kZXhfZGF0YSA6CisJCQlzYl9kYXRhX2UyLmluZGV4X2RhdGE7CisJCXU4IGRhdGFfc2l6ZSwgY29zOwogCQl1MzIgKnNiX2RhdGFfcDsKKwkJc3RydWN0IGJueDJ4X2ZwX3R4ZGF0YSB0eGRhdGE7CiAKIAkJLyogUnggKi8KIAkJQk5YMlhfRVJSKCJmcCVkOiByeF9iZF9wcm9kKDB4JXgpICByeF9iZF9jb25zKDB4JXgpIgpAQCAtOTQ4LDE0ICs4NDAsMjAgQEAKIAkJCSAgbGUxNl90b19jcHUoZnAtPmZwX2hjX2lkeCkpOwogCiAJCS8qIFR4ICovCi0JCUJOWDJYX0VSUigiZnAlZDogdHhfcGt0X3Byb2QoMHgleCkgIHR4X3BrdF9jb25zKDB4JXgpIgotCQkJICAiICB0eF9iZF9wcm9kKDB4JXgpICB0eF9iZF9jb25zKDB4JXgpIgotCQkJICAiICAqdHhfY29uc19zYigweCV4KVxuIiwKLQkJCSAgaSwgZnAtPnR4X3BrdF9wcm9kLCBmcC0+dHhfcGt0X2NvbnMsIGZwLT50eF9iZF9wcm9kLAotCQkJICBmcC0+dHhfYmRfY29ucywgbGUxNl90b19jcHUoKmZwLT50eF9jb25zX3NiKSk7CisJCWZvcl9lYWNoX2Nvc19pbl90eF9xdWV1ZShmcCwgY29zKQorCQl7CisJCQl0eGRhdGEgPSBmcC0+dHhkYXRhW2Nvc107CisJCQlCTlgyWF9FUlIoImZwJWQ6IHR4X3BrdF9wcm9kKDB4JXgpICB0eF9wa3RfY29ucygweCV4KSIKKwkJCQkgICIgIHR4X2JkX3Byb2QoMHgleCkgIHR4X2JkX2NvbnMoMHgleCkiCisJCQkJICAiICAqdHhfY29uc19zYigweCV4KVxuIiwKKwkJCQkgIGksIHR4ZGF0YS50eF9wa3RfcHJvZCwKKwkJCQkgIHR4ZGF0YS50eF9wa3RfY29ucywgdHhkYXRhLnR4X2JkX3Byb2QsCisJCQkJICB0eGRhdGEudHhfYmRfY29ucywKKwkJCQkgIGxlMTZfdG9fY3B1KCp0eGRhdGEudHhfY29uc19zYikpOworCQl9CiAKLQkJbG9vcCA9IENISVBfSVNfRTIoYnApID8KLQkJCUhDX1NCX01BWF9JTkRJQ0VTX0UyIDogSENfU0JfTUFYX0lORElDRVNfRTFYOworCQlsb29wID0gQ0hJUF9JU19FMXgoYnApID8KKwkJCUhDX1NCX01BWF9JTkRJQ0VTX0UxWCA6IEhDX1NCX01BWF9JTkRJQ0VTX0UyOwogCiAJCS8qIGhvc3Qgc2IgZGF0YSAqLwogCkBAIC05NzUsMzUgKzg3MywzOSBAQAogCQkJICAgICAgIGZwLT5zYl9pbmRleF92YWx1ZXNbal0sCiAJCQkgICAgICAgKGogPT0gbG9vcCAtIDEpID8gIikiIDogIiAiKTsKIAkJLyogZncgc2IgZGF0YSAqLwotCQlkYXRhX3NpemUgPSBDSElQX0lTX0UyKGJwKSA/Ci0JCQlzaXplb2Yoc3RydWN0IGhjX3N0YXR1c19ibG9ja19kYXRhX2UyKSA6Ci0JCQlzaXplb2Yoc3RydWN0IGhjX3N0YXR1c19ibG9ja19kYXRhX2UxeCk7CisJCWRhdGFfc2l6ZSA9IENISVBfSVNfRTF4KGJwKSA/CisJCQlzaXplb2Yoc3RydWN0IGhjX3N0YXR1c19ibG9ja19kYXRhX2UxeCkgOgorCQkJc2l6ZW9mKHN0cnVjdCBoY19zdGF0dXNfYmxvY2tfZGF0YV9lMik7CiAJCWRhdGFfc2l6ZSAvPSBzaXplb2YodTMyKTsKLQkJc2JfZGF0YV9wID0gQ0hJUF9JU19FMihicCkgPwotCQkJKHUzMiAqKSZzYl9kYXRhX2UyIDoKLQkJCSh1MzIgKikmc2JfZGF0YV9lMXg7CisJCXNiX2RhdGFfcCA9IENISVBfSVNfRTF4KGJwKSA/CisJCQkodTMyICopJnNiX2RhdGFfZTF4IDoKKwkJCSh1MzIgKikmc2JfZGF0YV9lMjsKIAkJLyogY29weSBzYiBkYXRhIGluIGhlcmUgKi8KIAkJZm9yIChqID0gMDsgaiA8IGRhdGFfc2l6ZTsgaisrKQogCQkJKihzYl9kYXRhX3AgKyBqKSA9IFJFR19SRChicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKIAkJCQlDU1RPUk1fU1RBVFVTX0JMT0NLX0RBVEFfT0ZGU0VUKGZwLT5md19zYl9pZCkgKwogCQkJCWogKiBzaXplb2YodTMyKSk7CiAKLQkJaWYgKENISVBfSVNfRTIoYnApKSB7Ci0JCQlwcl9jb250KCJwZl9pZCgweCV4KSAgdmZfaWQgKDB4JXgpICB2Zl92YWxpZCgweCV4KSAiCi0JCQkJInZuaWNfaWQoMHgleCkgIHNhbWVfaWd1X3NiXzFiKDB4JXgpXG4iLAorCQlpZiAoIUNISVBfSVNfRTF4KGJwKSkgeworCQkJcHJfY29udCgicGZfaWQoMHgleCkgIHZmX2lkKDB4JXgpICB2Zl92YWxpZCgweCV4KSAiCisJCQkJInZuaWNfaWQoMHgleCkgIHNhbWVfaWd1X3NiXzFiKDB4JXgpICIKKwkJCQkic3RhdGUoMHgleClcbiIsCiAJCQkJc2JfZGF0YV9lMi5jb21tb24ucF9mdW5jLnBmX2lkLAogCQkJCXNiX2RhdGFfZTIuY29tbW9uLnBfZnVuYy52Zl9pZCwKIAkJCQlzYl9kYXRhX2UyLmNvbW1vbi5wX2Z1bmMudmZfdmFsaWQsCiAJCQkJc2JfZGF0YV9lMi5jb21tb24ucF9mdW5jLnZuaWNfaWQsCi0JCQkJc2JfZGF0YV9lMi5jb21tb24uc2FtZV9pZ3Vfc2JfMWIpOworCQkJCXNiX2RhdGFfZTIuY29tbW9uLnNhbWVfaWd1X3NiXzFiLAorCQkJCXNiX2RhdGFfZTIuY29tbW9uLnN0YXRlKTsKIAkJfSBlbHNlIHsKLQkJCXByX2NvbnQoInBmX2lkKDB4JXgpICB2Zl9pZCAoMHgleCkgIHZmX3ZhbGlkKDB4JXgpICIKLQkJCQkidm5pY19pZCgweCV4KSAgc2FtZV9pZ3Vfc2JfMWIoMHgleClcbiIsCisJCQlwcl9jb250KCJwZl9pZCgweCV4KSAgdmZfaWQoMHgleCkgIHZmX3ZhbGlkKDB4JXgpICIKKwkJCQkidm5pY19pZCgweCV4KSAgc2FtZV9pZ3Vfc2JfMWIoMHgleCkgIgorCQkJCSJzdGF0ZSgweCV4KVxuIiwKIAkJCQlzYl9kYXRhX2UxeC5jb21tb24ucF9mdW5jLnBmX2lkLAogCQkJCXNiX2RhdGFfZTF4LmNvbW1vbi5wX2Z1bmMudmZfaWQsCiAJCQkJc2JfZGF0YV9lMXguY29tbW9uLnBfZnVuYy52Zl92YWxpZCwKIAkJCQlzYl9kYXRhX2UxeC5jb21tb24ucF9mdW5jLnZuaWNfaWQsCi0JCQkJc2JfZGF0YV9lMXguY29tbW9uLnNhbWVfaWd1X3NiXzFiKTsKKwkJCQlzYl9kYXRhX2UxeC5jb21tb24uc2FtZV9pZ3Vfc2JfMWIsCisJCQkJc2JfZGF0YV9lMXguY29tbW9uLnN0YXRlKTsKIAkJfQogCiAJCS8qIFNCX1NNcyBkYXRhICovCkBAIC0xMDY3LDIzICs5NjksMzEgQEAKIAkvKiBUeCAqLwogCWZvcl9lYWNoX3R4X3F1ZXVlKGJwLCBpKSB7CiAJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOworCQlmb3JfZWFjaF9jb3NfaW5fdHhfcXVldWUoZnAsIGNvcykgeworCQkJc3RydWN0IGJueDJ4X2ZwX3R4ZGF0YSAqdHhkYXRhID0gJmZwLT50eGRhdGFbY29zXTsKIAotCQlzdGFydCA9IFRYX0JEKGxlMTZfdG9fY3B1KCpmcC0+dHhfY29uc19zYikgLSAxMCk7Ci0JCWVuZCA9IFRYX0JEKGxlMTZfdG9fY3B1KCpmcC0+dHhfY29uc19zYikgKyAyNDUpOwotCQlmb3IgKGogPSBzdGFydDsgaiAhPSBlbmQ7IGogPSBUWF9CRChqICsgMSkpIHsKLQkJCXN0cnVjdCBzd190eF9iZCAqc3dfYmQgPSAmZnAtPnR4X2J1Zl9yaW5nW2pdOworCQkJc3RhcnQgPSBUWF9CRChsZTE2X3RvX2NwdSgqdHhkYXRhLT50eF9jb25zX3NiKSAtIDEwKTsKKwkJCWVuZCA9IFRYX0JEKGxlMTZfdG9fY3B1KCp0eGRhdGEtPnR4X2NvbnNfc2IpICsgMjQ1KTsKKwkJCWZvciAoaiA9IHN0YXJ0OyBqICE9IGVuZDsgaiA9IFRYX0JEKGogKyAxKSkgeworCQkJCXN0cnVjdCBzd190eF9iZCAqc3dfYmQgPQorCQkJCQkmdHhkYXRhLT50eF9idWZfcmluZ1tqXTsKIAotCQkJQk5YMlhfRVJSKCJmcCVkOiBwYWNrZXRbJXhdPVslcCwleF1cbiIsCi0JCQkJICBpLCBqLCBzd19iZC0+c2tiLCBzd19iZC0+Zmlyc3RfYmQpOwotCQl9CisJCQkJQk5YMlhfRVJSKCJmcCVkOiB0eGRhdGEgJWQsICIKKwkJCQkJICAicGFja2V0WyV4XT1bJXAsJXhdXG4iLAorCQkJCQkgIGksIGNvcywgaiwgc3dfYmQtPnNrYiwKKwkJCQkJICBzd19iZC0+Zmlyc3RfYmQpOworCQkJfQogCi0JCXN0YXJ0ID0gVFhfQkQoZnAtPnR4X2JkX2NvbnMgLSAxMCk7Ci0JCWVuZCA9IFRYX0JEKGZwLT50eF9iZF9jb25zICsgMjU0KTsKLQkJZm9yIChqID0gc3RhcnQ7IGogIT0gZW5kOyBqID0gVFhfQkQoaiArIDEpKSB7Ci0JCQl1MzIgKnR4X2JkID0gKHUzMiAqKSZmcC0+dHhfZGVzY19yaW5nW2pdOworCQkJc3RhcnQgPSBUWF9CRCh0eGRhdGEtPnR4X2JkX2NvbnMgLSAxMCk7CisJCQllbmQgPSBUWF9CRCh0eGRhdGEtPnR4X2JkX2NvbnMgKyAyNTQpOworCQkJZm9yIChqID0gc3RhcnQ7IGogIT0gZW5kOyBqID0gVFhfQkQoaiArIDEpKSB7CisJCQkJdTMyICp0eF9iZCA9ICh1MzIgKikmdHhkYXRhLT50eF9kZXNjX3Jpbmdbal07CiAKLQkJCUJOWDJYX0VSUigiZnAlZDogdHhfYmRbJXhdPVsleDoleDoleDoleF1cbiIsCi0JCQkJICBpLCBqLCB0eF9iZFswXSwgdHhfYmRbMV0sIHR4X2JkWzJdLCB0eF9iZFszXSk7CisJCQkJQk5YMlhfRVJSKCJmcCVkOiB0eGRhdGEgJWQsIHR4X2JkWyV4XT0iCisJCQkJCSAgIlsleDoleDoleDoleF1cbiIsCisJCQkJCSAgaSwgY29zLCBqLCB0eF9iZFswXSwgdHhfYmRbMV0sCisJCQkJCSAgdHhfYmRbMl0sIHR4X2JkWzNdKTsKKwkJCX0KIAkJfQogCX0KICNlbmRpZgpAQCAtMTA5Miw2ICsxMDAyLDM3MyBAQAogCUJOWDJYX0VSUigiZW5kIGNyYXNoIGR1bXAgLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogfQogCisvKgorICogRkxSIFN1cHBvcnQgZm9yIEUyCisgKgorICogYm54MnhfcGZfZmxyX2NsbnVwKCkgaXMgY2FsbGVkIGR1cmluZyBuaWNfbG9hZCBpbiB0aGUgcGVyIGZ1bmN0aW9uIEhXCisgKiBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZSBGTFJfV0FJVF9VU0VDCQkxMDAwMAkvKiAxMCBtaWxpc2Vjb25kcyAqLworI2RlZmluZSBGTFJfV0FJVF9JTlRFUkFWQUwJNTAJLyogdXNlYyAqLworI2RlZmluZQlGTFJfUE9MTF9DTlQJCShGTFJfV0FJVF9VU0VDL0ZMUl9XQUlUX0lOVEVSQVZBTCkgLyogMjAwICovCisKK3N0cnVjdCBwYmZfcE5fYnVmX3JlZ3MgeworCWludCBwTjsKKwl1MzIgaW5pdF9jcmQ7CisJdTMyIGNyZDsKKwl1MzIgY3JkX2ZyZWVkOworfTsKKworc3RydWN0IHBiZl9wTl9jbWRfcmVncyB7CisJaW50IHBOOworCXUzMiBsaW5lc19vY2N1cDsKKwl1MzIgbGluZXNfZnJlZWQ7Cit9OworCitzdGF0aWMgdm9pZCBibngyeF9wYmZfcE5fYnVmX2ZsdXNoZWQoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgIHN0cnVjdCBwYmZfcE5fYnVmX3JlZ3MgKnJlZ3MsCisJCQkJICAgICB1MzIgcG9sbF9jb3VudCkKK3sKKwl1MzIgaW5pdF9jcmQsIGNyZCwgY3JkX3N0YXJ0LCBjcmRfZnJlZWQsIGNyZF9mcmVlZF9zdGFydDsKKwl1MzIgY3VyX2NudCA9IHBvbGxfY291bnQ7CisKKwljcmRfZnJlZWQgPSBjcmRfZnJlZWRfc3RhcnQgPSBSRUdfUkQoYnAsIHJlZ3MtPmNyZF9mcmVlZCk7CisJY3JkID0gY3JkX3N0YXJ0ID0gUkVHX1JEKGJwLCByZWdzLT5jcmQpOworCWluaXRfY3JkID0gUkVHX1JEKGJwLCByZWdzLT5pbml0X2NyZCk7CisKKwlEUChCTlgyWF9NU0dfU1AsICJJTklUIENSRURJVFslZF0gOiAleFxuIiwgcmVncy0+cE4sIGluaXRfY3JkKTsKKwlEUChCTlgyWF9NU0dfU1AsICJDUkVESVRbJWRdICAgICAgOiBzOiV4XG4iLCByZWdzLT5wTiwgY3JkKTsKKwlEUChCTlgyWF9NU0dfU1AsICJDUkVESVRfRlJFRURbJWRdOiBzOiV4XG4iLCByZWdzLT5wTiwgY3JkX2ZyZWVkKTsKKworCXdoaWxlICgoY3JkICE9IGluaXRfY3JkKSAmJiAoKHUzMilTVUJfUzMyKGNyZF9mcmVlZCwgY3JkX2ZyZWVkX3N0YXJ0KSA8CisJICAgICAgIChpbml0X2NyZCAtIGNyZF9zdGFydCkpKSB7CisJCWlmIChjdXJfY250LS0pIHsKKwkJCXVkZWxheShGTFJfV0FJVF9JTlRFUkFWQUwpOworCQkJY3JkID0gUkVHX1JEKGJwLCByZWdzLT5jcmQpOworCQkJY3JkX2ZyZWVkID0gUkVHX1JEKGJwLCByZWdzLT5jcmRfZnJlZWQpOworCQl9IGVsc2UgeworCQkJRFAoQk5YMlhfTVNHX1NQLCAiUEJGIHR4IGJ1ZmZlclslZF0gdGltZWQgb3V0XG4iLAorCQkJICAgcmVncy0+cE4pOworCQkJRFAoQk5YMlhfTVNHX1NQLCAiQ1JFRElUWyVkXSAgICAgIDogYzoleFxuIiwKKwkJCSAgIHJlZ3MtPnBOLCBjcmQpOworCQkJRFAoQk5YMlhfTVNHX1NQLCAiQ1JFRElUX0ZSRUVEWyVkXTogYzoleFxuIiwKKwkJCSAgIHJlZ3MtPnBOLCBjcmRfZnJlZWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJRFAoQk5YMlhfTVNHX1NQLCAiV2FpdGVkICVkKiVkIHVzZWMgZm9yIFBCRiB0eCBidWZmZXJbJWRdXG4iLAorCSAgIHBvbGxfY291bnQtY3VyX2NudCwgRkxSX1dBSVRfSU5URVJBVkFMLCByZWdzLT5wTik7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3BiZl9wTl9jbWRfZmx1c2hlZChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgICAgc3RydWN0IHBiZl9wTl9jbWRfcmVncyAqcmVncywKKwkJCQkgICAgIHUzMiBwb2xsX2NvdW50KQoreworCXUzMiBvY2N1cCwgdG9fZnJlZSwgZnJlZWQsIGZyZWVkX3N0YXJ0OworCXUzMiBjdXJfY250ID0gcG9sbF9jb3VudDsKKworCW9jY3VwID0gdG9fZnJlZSA9IFJFR19SRChicCwgcmVncy0+bGluZXNfb2NjdXApOworCWZyZWVkID0gZnJlZWRfc3RhcnQgPSBSRUdfUkQoYnAsIHJlZ3MtPmxpbmVzX2ZyZWVkKTsKKworCURQKEJOWDJYX01TR19TUCwgIk9DQ1VQQU5DWVslZF0gICA6IHM6JXhcbiIsIHJlZ3MtPnBOLCBvY2N1cCk7CisJRFAoQk5YMlhfTVNHX1NQLCAiTElORVNfRlJFRURbJWRdIDogczoleFxuIiwgcmVncy0+cE4sIGZyZWVkKTsKKworCXdoaWxlIChvY2N1cCAmJiAoKHUzMilTVUJfUzMyKGZyZWVkLCBmcmVlZF9zdGFydCkgPCB0b19mcmVlKSkgeworCQlpZiAoY3VyX2NudC0tKSB7CisJCQl1ZGVsYXkoRkxSX1dBSVRfSU5URVJBVkFMKTsKKwkJCW9jY3VwID0gUkVHX1JEKGJwLCByZWdzLT5saW5lc19vY2N1cCk7CisJCQlmcmVlZCA9IFJFR19SRChicCwgcmVncy0+bGluZXNfZnJlZWQpOworCQl9IGVsc2UgeworCQkJRFAoQk5YMlhfTVNHX1NQLCAiUEJGIGNtZCBxdWV1ZVslZF0gdGltZWQgb3V0XG4iLAorCQkJICAgcmVncy0+cE4pOworCQkJRFAoQk5YMlhfTVNHX1NQLCAiT0NDVVBBTkNZWyVkXSAgIDogczoleFxuIiwKKwkJCSAgIHJlZ3MtPnBOLCBvY2N1cCk7CisJCQlEUChCTlgyWF9NU0dfU1AsICJMSU5FU19GUkVFRFslZF0gOiBzOiV4XG4iLAorCQkJICAgcmVncy0+cE4sIGZyZWVkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCURQKEJOWDJYX01TR19TUCwgIldhaXRlZCAlZColZCB1c2VjIGZvciBQQkYgY21kIHF1ZXVlWyVkXVxuIiwKKwkgICBwb2xsX2NvdW50LWN1cl9jbnQsIEZMUl9XQUlUX0lOVEVSQVZBTCwgcmVncy0+cE4pOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBibngyeF9mbHJfY2xudXBfcmVnX3BvbGwoc3RydWN0IGJueDJ4ICpicCwgdTMyIHJlZywKKwkJCQkgICAgIHUzMiBleHBlY3RlZCwgdTMyIHBvbGxfY291bnQpCit7CisJdTMyIGN1cl9jbnQgPSBwb2xsX2NvdW50OworCXUzMiB2YWw7CisKKwl3aGlsZSAoKHZhbCA9IFJFR19SRChicCwgcmVnKSkgIT0gZXhwZWN0ZWQgJiYgY3VyX2NudC0tKQorCQl1ZGVsYXkoRkxSX1dBSVRfSU5URVJBVkFMKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2Zscl9jbG51cF9wb2xsX2h3X2NvdW50ZXIoc3RydWN0IGJueDJ4ICpicCwgdTMyIHJlZywKKwkJCQkJCSAgY2hhciAqbXNnLCB1MzIgcG9sbF9jbnQpCit7CisJdTMyIHZhbCA9IGJueDJ4X2Zscl9jbG51cF9yZWdfcG9sbChicCwgcmVnLCAwLCBwb2xsX2NudCk7CisJaWYgKHZhbCAhPSAwKSB7CisJCUJOWDJYX0VSUigiJXMgdXNhZ2UgY291bnQ9JWRcbiIsIG1zZywgdmFsKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGJueDJ4X2Zscl9jbG51cF9wb2xsX2NvdW50KHN0cnVjdCBibngyeCAqYnApCit7CisJLyogYWRqdXN0IHBvbGxpbmcgdGltZW91dCAqLworCWlmIChDSElQX1JFVl9JU19FTVVMKGJwKSkKKwkJcmV0dXJuIEZMUl9QT0xMX0NOVCAqIDIwMDA7CisKKwlpZiAoQ0hJUF9SRVZfSVNfRlBHQShicCkpCisJCXJldHVybiBGTFJfUE9MTF9DTlQgKiAxMjA7CisKKwlyZXR1cm4gRkxSX1BPTExfQ05UOworfQorCitzdGF0aWMgdm9pZCBibngyeF90eF9od19mbHVzaGVkKHN0cnVjdCBibngyeCAqYnAsIHUzMiBwb2xsX2NvdW50KQoreworCXN0cnVjdCBwYmZfcE5fY21kX3JlZ3MgY21kX3JlZ3NbXSA9IHsKKwkJezAsIChDSElQX0lTX0UzQjAoYnApKSA/CisJCQlQQkZfUkVHX1RRX09DQ1VQQU5DWV9RMCA6CisJCQlQQkZfUkVHX1AwX1RRX09DQ1VQQU5DWSwKKwkJICAgIChDSElQX0lTX0UzQjAoYnApKSA/CisJCQlQQkZfUkVHX1RRX0xJTkVTX0ZSRUVEX0NOVF9RMCA6CisJCQlQQkZfUkVHX1AwX1RRX0xJTkVTX0ZSRUVEX0NOVH0sCisJCXsxLCAoQ0hJUF9JU19FM0IwKGJwKSkgPworCQkJUEJGX1JFR19UUV9PQ0NVUEFOQ1lfUTEgOgorCQkJUEJGX1JFR19QMV9UUV9PQ0NVUEFOQ1ksCisJCSAgICAoQ0hJUF9JU19FM0IwKGJwKSkgPworCQkJUEJGX1JFR19UUV9MSU5FU19GUkVFRF9DTlRfUTEgOgorCQkJUEJGX1JFR19QMV9UUV9MSU5FU19GUkVFRF9DTlR9LAorCQl7NCwgKENISVBfSVNfRTNCMChicCkpID8KKwkJCVBCRl9SRUdfVFFfT0NDVVBBTkNZX0xCX1EgOgorCQkJUEJGX1JFR19QNF9UUV9PQ0NVUEFOQ1ksCisJCSAgICAoQ0hJUF9JU19FM0IwKGJwKSkgPworCQkJUEJGX1JFR19UUV9MSU5FU19GUkVFRF9DTlRfTEJfUSA6CisJCQlQQkZfUkVHX1A0X1RRX0xJTkVTX0ZSRUVEX0NOVH0KKwl9OworCisJc3RydWN0IHBiZl9wTl9idWZfcmVncyBidWZfcmVnc1tdID0geworCQl7MCwgKENISVBfSVNfRTNCMChicCkpID8KKwkJCVBCRl9SRUdfSU5JVF9DUkRfUTAgOgorCQkJUEJGX1JFR19QMF9JTklUX0NSRCAsCisJCSAgICAoQ0hJUF9JU19FM0IwKGJwKSkgPworCQkJUEJGX1JFR19DUkVESVRfUTAgOgorCQkJUEJGX1JFR19QMF9DUkVESVQsCisJCSAgICAoQ0hJUF9JU19FM0IwKGJwKSkgPworCQkJUEJGX1JFR19JTlRFUk5BTF9DUkRfRlJFRURfQ05UX1EwIDoKKwkJCVBCRl9SRUdfUDBfSU5URVJOQUxfQ1JEX0ZSRUVEX0NOVH0sCisJCXsxLCAoQ0hJUF9JU19FM0IwKGJwKSkgPworCQkJUEJGX1JFR19JTklUX0NSRF9RMSA6CisJCQlQQkZfUkVHX1AxX0lOSVRfQ1JELAorCQkgICAgKENISVBfSVNfRTNCMChicCkpID8KKwkJCVBCRl9SRUdfQ1JFRElUX1ExIDoKKwkJCVBCRl9SRUdfUDFfQ1JFRElULAorCQkgICAgKENISVBfSVNfRTNCMChicCkpID8KKwkJCVBCRl9SRUdfSU5URVJOQUxfQ1JEX0ZSRUVEX0NOVF9RMSA6CisJCQlQQkZfUkVHX1AxX0lOVEVSTkFMX0NSRF9GUkVFRF9DTlR9LAorCQl7NCwgKENISVBfSVNfRTNCMChicCkpID8KKwkJCVBCRl9SRUdfSU5JVF9DUkRfTEJfUSA6CisJCQlQQkZfUkVHX1A0X0lOSVRfQ1JELAorCQkgICAgKENISVBfSVNfRTNCMChicCkpID8KKwkJCVBCRl9SRUdfQ1JFRElUX0xCX1EgOgorCQkJUEJGX1JFR19QNF9DUkVESVQsCisJCSAgICAoQ0hJUF9JU19FM0IwKGJwKSkgPworCQkJUEJGX1JFR19JTlRFUk5BTF9DUkRfRlJFRURfQ05UX0xCX1EgOgorCQkJUEJGX1JFR19QNF9JTlRFUk5BTF9DUkRfRlJFRURfQ05UfSwKKwl9OworCisJaW50IGk7CisKKwkvKiBWZXJpZnkgdGhlIGNvbW1hbmQgcXVldWVzIGFyZSBmbHVzaGVkIFAwLCBQMSwgUDQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbWRfcmVncyk7IGkrKykKKwkJYm54MnhfcGJmX3BOX2NtZF9mbHVzaGVkKGJwLCAmY21kX3JlZ3NbaV0sIHBvbGxfY291bnQpOworCisKKwkvKiBWZXJpZnkgdGhlIHRyYW5zbWlzc2lvbiBidWZmZXJzIGFyZSBmbHVzaGVkIFAwLCBQMSwgUDQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidWZfcmVncyk7IGkrKykKKwkJYm54MnhfcGJmX3BOX2J1Zl9mbHVzaGVkKGJwLCAmYnVmX3JlZ3NbaV0sIHBvbGxfY291bnQpOworfQorCisjZGVmaW5lIE9QX0dFTl9QQVJBTShwYXJhbSkgXAorCSgoKHBhcmFtKSA8PCBTRE1fT1BfR0VOX0NPTVBfUEFSQU1fU0hJRlQpICYgU0RNX09QX0dFTl9DT01QX1BBUkFNKQorCisjZGVmaW5lIE9QX0dFTl9UWVBFKHR5cGUpIFwKKwkoKCh0eXBlKSA8PCBTRE1fT1BfR0VOX0NPTVBfVFlQRV9TSElGVCkgJiBTRE1fT1BfR0VOX0NPTVBfVFlQRSkKKworI2RlZmluZSBPUF9HRU5fQUdHX1ZFQ1QoaW5kZXgpIFwKKwkoKChpbmRleCkgPDwgU0RNX09QX0dFTl9BR0dfVkVDVF9JRFhfU0hJRlQpICYgU0RNX09QX0dFTl9BR0dfVkVDVF9JRFgpCisKKworc3RhdGljIGlubGluZSBpbnQgYm54Mnhfc2VuZF9maW5hbF9jbG51cChzdHJ1Y3QgYm54MnggKmJwLCB1OCBjbG51cF9mdW5jLAorCQkJCQkgdTMyIHBvbGxfY250KQoreworCXN0cnVjdCBzZG1fb3BfZ2VuIG9wX2dlbiA9IHswfTsKKworCXUzMiBjb21wX2FkZHIgPSBCQVJfQ1NUUk9STV9JTlRNRU0gKworCQkJQ1NUT1JNX0ZJTkFMX0NMRUFOVVBfQ09NUExFVEVfT0ZGU0VUKGNsbnVwX2Z1bmMpOworCWludCByZXQgPSAwOworCisJaWYgKFJFR19SRChicCwgY29tcF9hZGRyKSkgeworCQlCTlgyWF9FUlIoIkNsZWFudXAgY29tcGxldGUgaXMgbm90IDBcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlvcF9nZW4uY29tbWFuZCB8PSBPUF9HRU5fUEFSQU0oWFNUT1JNX0FHR19JTlRfRklOQUxfQ0xFQU5VUF9JTkRFWCk7CisJb3BfZ2VuLmNvbW1hbmQgfD0gT1BfR0VOX1RZUEUoWFNUT1JNX0FHR19JTlRfRklOQUxfQ0xFQU5VUF9DT01QX1RZUEUpOworCW9wX2dlbi5jb21tYW5kIHw9IE9QX0dFTl9BR0dfVkVDVChjbG51cF9mdW5jKTsKKwlvcF9nZW4uY29tbWFuZCB8PSAxIDw8IFNETV9PUF9HRU5fQUdHX1ZFQ1RfSURYX1ZBTElEX1NISUZUOworCisJRFAoQk5YMlhfTVNHX1NQLCAiRlcgRmluYWwgY2xlYW51cFxuIik7CisJUkVHX1dSKGJwLCBYU0RNX1JFR19PUEVSQVRJT05fR0VOLCBvcF9nZW4uY29tbWFuZCk7CisKKwlpZiAoYm54MnhfZmxyX2NsbnVwX3JlZ19wb2xsKGJwLCBjb21wX2FkZHIsIDEsIHBvbGxfY250KSAhPSAxKSB7CisJCUJOWDJYX0VSUigiRlcgZmluYWwgY2xlYW51cCBkaWQgbm90IHN1Y2NlZWRcbiIpOworCQlyZXQgPSAxOworCX0KKwkvKiBaZXJvIGNvbXBsZXRpb24gZm9yIG54dCBGTFIgKi8KKwlSRUdfV1IoYnAsIGNvbXBfYWRkciwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHU4IGJueDJ4X2lzX3BjaWVfcGVuZGluZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBwb3M7CisJdTE2IHN0YXR1czsKKworCXBvcyA9IHBjaV9wY2llX2NhcChkZXYpOworCWlmICghcG9zKQorCQlyZXR1cm4gZmFsc2U7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfREVWU1RBLCAmc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzICYgUENJX0VYUF9ERVZTVEFfVFJQTkQ7Cit9CisKKy8qIFBGIEZMUiBzcGVjaWZpYyByb3V0aW5lcworKi8KK3N0YXRpYyBpbnQgYm54MnhfcG9sbF9od191c2FnZV9jb3VudGVycyhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgcG9sbF9jbnQpCit7CisKKwkvKiB3YWl0IGZvciBDRkMgUEYgdXNhZ2UtY291bnRlciB0byB6ZXJvIChpbmNsdWRlcyBhbGwgdGhlIFZGcykgKi8KKwlpZiAoYm54MnhfZmxyX2NsbnVwX3BvbGxfaHdfY291bnRlcihicCwKKwkJCUNGQ19SRUdfTlVNX0xDSURTX0lOU0lERV9QRiwKKwkJCSJDRkMgUEYgdXNhZ2UgY291bnRlciB0aW1lZCBvdXQiLAorCQkJcG9sbF9jbnQpKQorCQlyZXR1cm4gMTsKKworCisJLyogV2FpdCBmb3IgRFEgUEYgdXNhZ2UtY291bnRlciB0byB6ZXJvICh1bnRpbCBEUSBjbGVhbnVwKSAqLworCWlmIChibngyeF9mbHJfY2xudXBfcG9sbF9od19jb3VudGVyKGJwLAorCQkJRE9SUV9SRUdfUEZfVVNBR0VfQ05ULAorCQkJIkRRIFBGIHVzYWdlIGNvdW50ZXIgdGltZWQgb3V0IiwKKwkJCXBvbGxfY250KSkKKwkJcmV0dXJuIDE7CisKKwkvKiBXYWl0IGZvciBRTSBQRiB1c2FnZS1jb3VudGVyIHRvIHplcm8gKHVudGlsIERRIGNsZWFudXApICovCisJaWYgKGJueDJ4X2Zscl9jbG51cF9wb2xsX2h3X2NvdW50ZXIoYnAsCisJCQlRTV9SRUdfUEZfVVNHX0NOVF8wICsgNCpCUF9GVU5DKGJwKSwKKwkJCSJRTSBQRiB1c2FnZSBjb3VudGVyIHRpbWVkIG91dCIsCisJCQlwb2xsX2NudCkpCisJCXJldHVybiAxOworCisJLyogV2FpdCBmb3IgVGltZXIgUEYgdXNhZ2UtY291bnRlcnMgdG8gemVybyAodW50aWwgRFEgY2xlYW51cCkgKi8KKwlpZiAoYm54MnhfZmxyX2NsbnVwX3BvbGxfaHdfY291bnRlcihicCwKKwkJCVRNX1JFR19MSU4wX1ZOSUNfVUMgKyA0KkJQX1BPUlQoYnApLAorCQkJIlRpbWVycyBWTklDIHVzYWdlIGNvdW50ZXIgdGltZWQgb3V0IiwKKwkJCXBvbGxfY250KSkKKwkJcmV0dXJuIDE7CisJaWYgKGJueDJ4X2Zscl9jbG51cF9wb2xsX2h3X2NvdW50ZXIoYnAsCisJCQlUTV9SRUdfTElOMF9OVU1fU0NBTlMgKyA0KkJQX1BPUlQoYnApLAorCQkJIlRpbWVycyBOVU1fU0NBTlMgdXNhZ2UgY291bnRlciB0aW1lZCBvdXQiLAorCQkJcG9sbF9jbnQpKQorCQlyZXR1cm4gMTsKKworCS8qIFdhaXQgRE1BRSBQRiB1c2FnZSBjb3VudGVyIHRvIHplcm8gKi8KKwlpZiAoYm54MnhfZmxyX2NsbnVwX3BvbGxfaHdfY291bnRlcihicCwKKwkJCWRtYWVfcmVnX2dvX2NbSU5JVF9ETUFFX0MoYnApXSwKKwkJCSJETUFFIGRvbW1hbmQgcmVnaXN0ZXIgdGltZWQgb3V0IiwKKwkJCXBvbGxfY250KSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm54MnhfaHdfZW5hYmxlX3N0YXR1cyhzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBSRUdfUkQoYnAsIENGQ19SRUdfV0VBS19FTkFCTEVfUEYpOworCURQKEJOWDJYX01TR19TUCwgIkNGQ19SRUdfV0VBS19FTkFCTEVfUEYgaXMgMHgleFxuIiwgdmFsKTsKKworCXZhbCA9IFJFR19SRChicCwgUEJGX1JFR19ESVNBQkxFX1BGKTsKKwlEUChCTlgyWF9NU0dfU1AsICJQQkZfUkVHX0RJU0FCTEVfUEYgaXMgMHgleFxuIiwgdmFsKTsKKworCXZhbCA9IFJFR19SRChicCwgSUdVX1JFR19QQ0lfUEZfTVNJX0VOKTsKKwlEUChCTlgyWF9NU0dfU1AsICJJR1VfUkVHX1BDSV9QRl9NU0lfRU4gaXMgMHgleFxuIiwgdmFsKTsKKworCXZhbCA9IFJFR19SRChicCwgSUdVX1JFR19QQ0lfUEZfTVNJWF9FTik7CisJRFAoQk5YMlhfTVNHX1NQLCAiSUdVX1JFR19QQ0lfUEZfTVNJWF9FTiBpcyAweCV4XG4iLCB2YWwpOworCisJdmFsID0gUkVHX1JEKGJwLCBJR1VfUkVHX1BDSV9QRl9NU0lYX0ZVTkNfTUFTSyk7CisJRFAoQk5YMlhfTVNHX1NQLCAiSUdVX1JFR19QQ0lfUEZfTVNJWF9GVU5DX01BU0sgaXMgMHgleFxuIiwgdmFsKTsKKworCXZhbCA9IFJFR19SRChicCwgUEdMVUVfQl9SRUdfU0hBRE9XX0JNRV9QRl83XzBfQ0xSKTsKKwlEUChCTlgyWF9NU0dfU1AsICJQR0xVRV9CX1JFR19TSEFET1dfQk1FX1BGXzdfMF9DTFIgaXMgMHgleFxuIiwgdmFsKTsKKworCXZhbCA9IFJFR19SRChicCwgUEdMVUVfQl9SRUdfRkxSX1JFUVVFU1RfUEZfN18wX0NMUik7CisJRFAoQk5YMlhfTVNHX1NQLCAiUEdMVUVfQl9SRUdfRkxSX1JFUVVFU1RfUEZfN18wX0NMUiBpcyAweCV4XG4iLCB2YWwpOworCisJdmFsID0gUkVHX1JEKGJwLCBQR0xVRV9CX1JFR19JTlRFUk5BTF9QRklEX0VOQUJMRV9NQVNURVIpOworCURQKEJOWDJYX01TR19TUCwgIlBHTFVFX0JfUkVHX0lOVEVSTkFMX1BGSURfRU5BQkxFX01BU1RFUiBpcyAweCV4XG4iLAorCSAgIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfcGZfZmxyX2NsbnVwKHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHBvbGxfY250ID0gYm54MnhfZmxyX2NsbnVwX3BvbGxfY291bnQoYnApOworCisJRFAoQk5YMlhfTVNHX1NQLCAiQ2xlYW51cCBhZnRlciBGTFIgUEZbJWRdXG4iLCBCUF9BQlNfRlVOQyhicCkpOworCisJLyogUmUtZW5hYmxlIFBGIHRhcmdldCByZWFkIGFjY2VzcyAqLworCVJFR19XUihicCwgUEdMVUVfQl9SRUdfSU5URVJOQUxfUEZJRF9FTkFCTEVfVEFSR0VUX1JFQUQsIDEpOworCisJLyogUG9sbCBIVyB1c2FnZSBjb3VudGVycyAqLworCWlmIChibngyeF9wb2xsX2h3X3VzYWdlX2NvdW50ZXJzKGJwLCBwb2xsX2NudCkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBaZXJvIHRoZSBpZ3UgJ3RyYWlsaW5nIGVkZ2UnIGFuZCAnbGVhZGluZyBlZGdlJyAqLworCisJLyogU2VuZCB0aGUgRlcgY2xlYW51cCBjb21tYW5kICovCisJaWYgKGJueDJ4X3NlbmRfZmluYWxfY2xudXAoYnAsICh1OClCUF9GVU5DKGJwKSwgcG9sbF9jbnQpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogQVRDIGNsZWFudXAgKi8KKworCS8qIFZlcmlmeSBUWCBodyBpcyBmbHVzaGVkICovCisJYm54MnhfdHhfaHdfZmx1c2hlZChicCwgcG9sbF9jbnQpOworCisJLyogV2FpdCAxMDBtcyAobm90IGFkanVzdGVkIGFjY29yZGluZyB0byBwbGF0Zm9ybSkgKi8KKwltc2xlZXAoMTAwKTsKKworCS8qIFZlcmlmeSBubyBwZW5kaW5nIHBjaSB0cmFuc2FjdGlvbnMgKi8KKwlpZiAoYm54MnhfaXNfcGNpZV9wZW5kaW5nKGJwLT5wZGV2KSkKKwkJQk5YMlhfRVJSKCJQQ0lFIFRyYW5zYWN0aW9ucyBzdGlsbCBwZW5kaW5nXG4iKTsKKworCS8qIERlYnVnICovCisJYm54MnhfaHdfZW5hYmxlX3N0YXR1cyhicCk7CisKKwkvKgorCSAqIE1hc3RlciBlbmFibGUgLSBEdWUgdG8gV0IgRE1BRSB3cml0ZXMgcGVyZm9ybWVkIGJlZm9yZSB0aGlzCisJICogcmVnaXN0ZXIgaXMgcmUtaW5pdGlhbGl6ZWQgYXMgcGFydCBvZiB0aGUgcmVndWxhciBmdW5jdGlvbiBpbml0CisJICovCisJUkVHX1dSKGJwLCBQR0xVRV9CX1JFR19JTlRFUk5BTF9QRklEX0VOQUJMRV9NQVNURVIsIDEpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGJueDJ4X2hjX2ludF9lbmFibGUoc3RydWN0IGJueDJ4ICpicCkKIHsKIAlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwpAQCAtMTI3Miw3ICsxNTQ5LDcgQEAKIAkJQk5YMlhfRVJSKCJCVUchIHByb3BlciB2YWwgbm90IHJlYWQgZnJvbSBJR1UhXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgYm54MnhfaW50X2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCkKK3ZvaWQgYm54MnhfaW50X2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCkKIHsKIAlpZiAoYnAtPmNvbW1vbi5pbnRfYmxvY2sgPT0gSU5UX0JMT0NLX0hDKQogCQlibngyeF9oY19pbnRfZGlzYWJsZShicCk7CkBAIC0xMjg1LDEwICsxNTYyLDYgQEAKIAlpbnQgbXNpeCA9IChicC0+ZmxhZ3MgJiBVU0lOR19NU0lYX0ZMQUcpID8gMSA6IDA7CiAJaW50IGksIG9mZnNldDsKIAotCS8qIGRpc2FibGUgaW50ZXJydXB0IGhhbmRsaW5nICovCi0JYXRvbWljX2luYygmYnAtPmludHJfc2VtKTsKLQlzbXBfd21iKCk7IC8qIEVuc3VyZSB0aGF0IGJwLT5pbnRyX3NlbSB1cGRhdGUgaXMgU01QLXNhZmUgKi8KLQogCWlmIChkaXNhYmxlX2h3KQogCQkvKiBwcmV2ZW50IHRoZSBIVyBmcm9tIHNlbmRpbmcgaW50ZXJydXB0cyAqLwogCQlibngyeF9pbnRfZGlzYWJsZShicCk7CkBAIC0xMzAxLDEyICsxNTc0LDEzIEBACiAJCW9mZnNldCsrOwogI2VuZGlmCiAJCWZvcl9lYWNoX2V0aF9xdWV1ZShicCwgaSkKLQkJCXN5bmNocm9uaXplX2lycShicC0+bXNpeF90YWJsZVtpICsgb2Zmc2V0XS52ZWN0b3IpOworCQkJc3luY2hyb25pemVfaXJxKGJwLT5tc2l4X3RhYmxlW29mZnNldCsrXS52ZWN0b3IpOwogCX0gZWxzZQogCQlzeW5jaHJvbml6ZV9pcnEoYnAtPnBkZXYtPmlycSk7CiAKIAkvKiBtYWtlIHN1cmUgc3BfdGFzayBpcyBub3QgcnVubmluZyAqLwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmJwLT5zcF90YXNrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZicC0+cGVyaW9kX3Rhc2spOwogCWZsdXNoX3dvcmtxdWV1ZShibngyeF93cSk7CiB9CiAKQEAgLTEzNTAsNTkgKzE2MjQsMTI5IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCisvKioKKyAqIGJueDJ4X2dldF9sZWFkZXJfbG9ja19yZXNvdXJjZSAtIGdldCB0aGUgcmVjb3ZlcnkgbGVhZGVyIHJlc291cmNlIGlkCisgKgorICogQGJwOglkcml2ZXIgaGFuZGxlCisgKgorICogUmV0dXJucyB0aGUgcmVjb3ZlcnkgbGVhZGVyIHJlc291cmNlIGlkIGFjY29yZGluZyB0byB0aGUgZW5naW5lIHRoaXMgZnVuY3Rpb24KKyAqIGJlbG9uZ3MgdG8uIEN1cnJlbnRseSBvbmx5IG9ubHkgMiBlbmdpbmVzIGlzIHN1cHBvcnRlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYm54MnhfZ2V0X2xlYWRlcl9sb2NrX3Jlc291cmNlKHN0cnVjdCBibngyeCAqYnApCit7CisJaWYgKEJQX1BBVEgoYnApKQorCQlyZXR1cm4gSFdfTE9DS19SRVNPVVJDRV9SRUNPVkVSWV9MRUFERVJfMTsKKwllbHNlCisJCXJldHVybiBIV19MT0NLX1JFU09VUkNFX1JFQ09WRVJZX0xFQURFUl8wOworfQorCisvKioKKyAqIGJueDJ4X3RyeWxvY2tfbGVhZGVyX2xvY2stIHRyeSB0byBhcXVpcmUgYSBsZWFkZXIgbG9jay4KKyAqCisgKiBAYnA6IGRyaXZlciBoYW5kbGUKKyAqCisgKiBUcmllcyB0byBhcXVpcmUgYSBsZWFkZXIgbG9jayBmb3IgY3V1cmVudCBlbmdpbmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBibngyeF90cnlsb2NrX2xlYWRlcl9sb2NrKHN0cnVjdCBibngyeCAqYnApCit7CisJcmV0dXJuIGJueDJ4X3RyeWxvY2tfaHdfbG9jayhicCwgYm54MnhfZ2V0X2xlYWRlcl9sb2NrX3Jlc291cmNlKGJwKSk7Cit9CisKICNpZmRlZiBCQ01fQ05JQwotc3RhdGljIHZvaWQgYm54MnhfY25pY19jZmNfY29tcChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY2lkKTsKK3N0YXRpYyB2b2lkIGJueDJ4X2NuaWNfY2ZjX2NvbXAoc3RydWN0IGJueDJ4ICpicCwgaW50IGNpZCwgdTggZXJyKTsKICNlbmRpZgogCi12b2lkIGJueDJ4X3NwX2V2ZW50KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCi0JCQkgICB1bmlvbiBldGhfcnhfY3FlICpycl9jcWUpCit2b2lkIGJueDJ4X3NwX2V2ZW50KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsIHVuaW9uIGV0aF9yeF9jcWUgKnJyX2NxZSkKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gZnAtPmJwOwogCWludCBjaWQgPSBTV19DSUQocnJfY3FlLT5yYW1yb2RfY3FlLmNvbm5fYW5kX2NtZF9kYXRhKTsKIAlpbnQgY29tbWFuZCA9IENRRV9DTUQocnJfY3FlLT5yYW1yb2RfY3FlLmNvbm5fYW5kX2NtZF9kYXRhKTsKKwllbnVtIGJueDJ4X3F1ZXVlX2NtZCBkcnZfY21kID0gQk5YMlhfUV9DTURfTUFYOworCXN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogKnFfb2JqID0gJmZwLT5xX29iajsKIAogCURQKEJOWDJYX01TR19TUCwKIAkgICAiZnAgJWQgIGNpZCAlZCAgZ290IHJhbXJvZCAjJWQgIHN0YXRlIGlzICV4ICB0eXBlIGlzICVkXG4iLAogCSAgIGZwLT5pbmRleCwgY2lkLCBjb21tYW5kLCBicC0+c3RhdGUsCiAJICAgcnJfY3FlLT5yYW1yb2RfY3FlLnJhbXJvZF90eXBlKTsKIAotCXN3aXRjaCAoY29tbWFuZCB8IGZwLT5zdGF0ZSkgewotCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX0NMSUVOVF9TRVRVUCB8IEJOWDJYX0ZQX1NUQVRFX09QRU5JTkcpOgotCQlEUChORVRJRl9NU0dfSUZVUCwgImdvdCBNVUxUSVslZF0gc2V0dXAgcmFtcm9kXG4iLCBjaWQpOwotCQlmcC0+c3RhdGUgPSBCTlgyWF9GUF9TVEFURV9PUEVOOworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX0NMSUVOVF9VUERBVEUpOgorCQlEUChCTlgyWF9NU0dfU1AsICJnb3QgVVBEQVRFIHJhbXJvZC4gQ0lEICVkXG4iLCBjaWQpOworCQlkcnZfY21kID0gQk5YMlhfUV9DTURfVVBEQVRFOwogCQlicmVhazsKIAotCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX0hBTFQgfCBCTlgyWF9GUF9TVEFURV9IQUxUSU5HKToKLQkJRFAoTkVUSUZfTVNHX0lGRE9XTiwgImdvdCBNVUxUSVslZF0gaGFsdCByYW1yb2RcbiIsIGNpZCk7Ci0JCWZwLT5zdGF0ZSA9IEJOWDJYX0ZQX1NUQVRFX0hBTFRFRDsKKwljYXNlIChSQU1ST0RfQ01EX0lEX0VUSF9DTElFTlRfU0VUVVApOgorCQlEUChCTlgyWF9NU0dfU1AsICJnb3QgTVVMVElbJWRdIHNldHVwIHJhbXJvZFxuIiwgY2lkKTsKKwkJZHJ2X2NtZCA9IEJOWDJYX1FfQ01EX1NFVFVQOwogCQlicmVhazsKIAotCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX1RFUk1JTkFURSB8IEJOWDJYX0ZQX1NUQVRFX1RFUk1JTkFUSU5HKToKLQkJRFAoTkVUSUZfTVNHX0lGRE9XTiwgImdvdCBNVUxUSVslZF0gdGVtaW5hdGUgcmFtcm9kXG4iLCBjaWQpOwotCQlmcC0+c3RhdGUgPSBCTlgyWF9GUF9TVEFURV9URVJNSU5BVEVEOworCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX1RYX1FVRVVFX1NFVFVQKToKKwkJRFAoTkVUSUZfTVNHX0lGVVAsICJnb3QgTVVMVElbJWRdIHR4LW9ubHkgc2V0dXAgcmFtcm9kXG4iLCBjaWQpOworCQlkcnZfY21kID0gQk5YMlhfUV9DTURfU0VUVVBfVFhfT05MWTsKKwkJYnJlYWs7CisKKwljYXNlIChSQU1ST0RfQ01EX0lEX0VUSF9IQUxUKToKKwkJRFAoQk5YMlhfTVNHX1NQLCAiZ290IE1VTFRJWyVkXSBoYWx0IHJhbXJvZFxuIiwgY2lkKTsKKwkJZHJ2X2NtZCA9IEJOWDJYX1FfQ01EX0hBTFQ7CisJCWJyZWFrOworCisJY2FzZSAoUkFNUk9EX0NNRF9JRF9FVEhfVEVSTUlOQVRFKToKKwkJRFAoQk5YMlhfTVNHX1NQLCAiZ290IE1VTFRJWyVkXSB0ZW1pbmF0ZSByYW1yb2RcbiIsIGNpZCk7CisJCWRydl9jbWQgPSBCTlgyWF9RX0NNRF9URVJNSU5BVEU7CisJCWJyZWFrOworCisJY2FzZSAoUkFNUk9EX0NNRF9JRF9FVEhfRU1QVFkpOgorCQlEUChCTlgyWF9NU0dfU1AsICJnb3QgTVVMVElbJWRdIGVtcHR5IHJhbXJvZFxuIiwgY2lkKTsKKwkJZHJ2X2NtZCA9IEJOWDJYX1FfQ01EX0VNUFRZOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUJOWDJYX0VSUigidW5leHBlY3RlZCBNQyByZXBseSAoJWQpICAiCi0JCQkgICJmcFslZF0gc3RhdGUgaXMgJXhcbiIsCi0JCQkgIGNvbW1hbmQsIGZwLT5pbmRleCwgZnAtPnN0YXRlKTsKLQkJYnJlYWs7CisJCUJOWDJYX0VSUigidW5leHBlY3RlZCBNQyByZXBseSAoJWQpIG9uIGZwWyVkXVxuIiwKKwkJCSAgY29tbWFuZCwgZnAtPmluZGV4KTsKKwkJcmV0dXJuOwogCX0KIAorCWlmICgoZHJ2X2NtZCAhPSBCTlgyWF9RX0NNRF9NQVgpICYmCisJICAgIHFfb2JqLT5jb21wbGV0ZV9jbWQoYnAsIHFfb2JqLCBkcnZfY21kKSkKKwkJLyogcV9vYmotPmNvbXBsZXRlX2NtZCgpIGZhaWx1cmUgbWVhbnMgdGhhdCB0aGlzIHdhcworCQkgKiBhbiB1bmV4cGVjdGVkIGNvbXBsZXRpb24uCisJCSAqCisJCSAqIEluIHRoaXMgY2FzZSB3ZSBkb24ndCB3YW50IHRvIGluY3JlYXNlIHRoZSBicC0+c3BxX2xlZnQKKwkJICogYmVjYXVzZSBhcHBhcmVudGx5IHdlIGhhdmVuJ3Qgc2VudCB0aGlzIGNvbW1hbmQgdGhlIGZpcnN0CisJCSAqIHBsYWNlLgorCQkgKi8KKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJCWJueDJ4X3BhbmljKCk7CisjZWxzZQorCQlyZXR1cm47CisjZW5kaWYKKwogCXNtcF9tYl9fYmVmb3JlX2F0b21pY19pbmMoKTsKIAlhdG9taWNfaW5jKCZicC0+Y3Ffc3BxX2xlZnQpOwotCS8qIHB1c2ggdGhlIGNoYW5nZSBpbiBmcC0+c3RhdGUgYW5kIHRvd2FyZHMgdGhlIG1lbW9yeSAqLwotCXNtcF93bWIoKTsKKwkvKiBwdXNoIHRoZSBjaGFuZ2UgaW4gYnAtPnNwcV9sZWZ0IGFuZCB0b3dhcmRzIHRoZSBtZW1vcnkgKi8KKwlzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKTsKKworCURQKEJOWDJYX01TR19TUCwgImJwLT5jcV9zcHFfbGVmdCAleFxuIiwgYXRvbWljX3JlYWQoJmJwLT5jcV9zcHFfbGVmdCkpOwogCiAJcmV0dXJuOwogfQogCit2b2lkIGJueDJ4X3VwZGF0ZV9yeF9wcm9kKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCisJCQl1MTYgYmRfcHJvZCwgdTE2IHJ4X2NvbXBfcHJvZCwgdTE2IHJ4X3NnZV9wcm9kKQoreworCXUzMiBzdGFydCA9IEJBUl9VU1RST1JNX0lOVE1FTSArIGZwLT51c3Rvcm1fcnhfcHJvZHNfb2Zmc2V0OworCisJYm54MnhfdXBkYXRlX3J4X3Byb2RfZ2VuKGJwLCBmcCwgYmRfcHJvZCwgcnhfY29tcF9wcm9kLCByeF9zZ2VfcHJvZCwKKwkJCQkgc3RhcnQpOworfQorCiBpcnFyZXR1cm5fdCBibngyeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXZfaW5zdGFuY2UpOwogCXUxNiBzdGF0dXMgPSBibngyeF9hY2tfaW50KGJwKTsKIAl1MTYgbWFzazsKIAlpbnQgaTsKKwl1OCBjb3M7CiAKIAkvKiBSZXR1cm4gaGVyZSBpZiBpbnRlcnJ1cHQgaXMgc2hhcmVkIGFuZCBpdCdzIG5vdCBmb3IgdXMgKi8KIAlpZiAodW5saWtlbHkoc3RhdHVzID09IDApKSB7CkBAIC0xNDExLDEyICsxNzU1LDYgQEAKIAl9CiAJRFAoTkVUSUZfTVNHX0lOVFIsICJnb3QgYW4gaW50ZXJydXB0ICBzdGF0dXMgMHgleFxuIiwgc3RhdHVzKTsKIAotCS8qIFJldHVybiBoZXJlIGlmIGludGVycnVwdCBpcyBkaXNhYmxlZCAqLwotCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmYnAtPmludHJfc2VtKSAhPSAwKSkgewotCQlEUChORVRJRl9NU0dfSU5UUiwgImNhbGxlZCBidXQgaW50cl9zZW0gbm90IDAsIHJldHVybmluZ1xuIik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KICNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCiAJaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpCiAJCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTE0MjUsMTEgKzE3NjMsMTIgQEAKIAlmb3JfZWFjaF9ldGhfcXVldWUoYnAsIGkpIHsKIAkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07CiAKLQkJbWFzayA9IDB4MiA8PCAoZnAtPmluZGV4ICsgQ05JQ19DT05URVhUX1VTRSk7CisJCW1hc2sgPSAweDIgPDwgKGZwLT5pbmRleCArIENOSUNfUFJFU0VOVCk7CiAJCWlmIChzdGF0dXMgJiBtYXNrKSB7Ci0JCQkvKiBIYW5kbGUgUnggYW5kIFR4IGFjY29yZGluZyB0byBTQiBpZCAqLworCQkJLyogSGFuZGxlIFJ4IG9yIFR4IGFjY29yZGluZyB0byBTQiBpZCAqLwogCQkJcHJlZmV0Y2goZnAtPnJ4X2NvbnNfc2IpOwotCQkJcHJlZmV0Y2goZnAtPnR4X2NvbnNfc2IpOworCQkJZm9yX2VhY2hfY29zX2luX3R4X3F1ZXVlKGZwLCBjb3MpCisJCQkJcHJlZmV0Y2goZnAtPnR4ZGF0YVtjb3NdLnR4X2NvbnNfc2IpOwogCQkJcHJlZmV0Y2goJmZwLT5zYl9ydW5uaW5nX2luZGV4W1NNX1JYX0lEXSk7CiAJCQluYXBpX3NjaGVkdWxlKCZibngyeF9mcChicCwgZnAtPmluZGV4LCBuYXBpKSk7CiAJCQlzdGF0dXMgJj0gfm1hc2s7CkBAIC0xNDQxLDExICsxNzgwLDEzIEBACiAJaWYgKHN0YXR1cyAmIChtYXNrIHwgMHgxKSkgewogCQlzdHJ1Y3QgY25pY19vcHMgKmNfb3BzID0gTlVMTDsKIAotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCWNfb3BzID0gcmN1X2RlcmVmZXJlbmNlKGJwLT5jbmljX29wcyk7Ci0JCWlmIChjX29wcykKLQkJCWNfb3BzLT5jbmljX2hhbmRsZXIoYnAtPmNuaWNfZGF0YSwgTlVMTCk7Ci0JCXJjdV9yZWFkX3VubG9jaygpOworCQlpZiAobGlrZWx5KGJwLT5zdGF0ZSA9PSBCTlgyWF9TVEFURV9PUEVOKSkgeworCQkJcmN1X3JlYWRfbG9jaygpOworCQkJY19vcHMgPSByY3VfZGVyZWZlcmVuY2UoYnAtPmNuaWNfb3BzKTsKKwkJCWlmIChjX29wcykKKwkJCQljX29wcy0+Y25pY19oYW5kbGVyKGJwLT5jbmljX2RhdGEsIE5VTEwpOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCX0KIAogCQlzdGF0dXMgJj0gfm1hc2s7CiAJfQpAQCAtMTQ2Niw5ICsxODA3LDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qIGVuZCBvZiBmYXN0IHBhdGggKi8KLQotCiAvKiBMaW5rICovCiAKIC8qCkBAIC0xNTIwLDYgKzE4NTgsMTEgQEAKIAlyZXR1cm4gLUVBR0FJTjsKIH0KIAoraW50IGJueDJ4X3JlbGVhc2VfbGVhZGVyX2xvY2soc3RydWN0IGJueDJ4ICpicCkKK3sKKwlyZXR1cm4gYm54MnhfcmVsZWFzZV9od19sb2NrKGJwLCBibngyeF9nZXRfbGVhZGVyX2xvY2tfcmVzb3VyY2UoYnApKTsKK30KKwogaW50IGJueDJ4X3JlbGVhc2VfaHdfbG9jayhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgcmVzb3VyY2UpCiB7CiAJdTMyIGxvY2tfc3RhdHVzOwpAQCAtMTY0MCw2ICsxOTgzLDUzIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBibngyeF9zZXRfbXVsdF9ncGlvKHN0cnVjdCBibngyeCAqYnAsIHU4IHBpbnMsIHUzMiBtb2RlKQoreworCXUzMiBncGlvX3JlZyA9IDA7CisJaW50IHJjID0gMDsKKworCS8qIEFueSBwb3J0IHN3YXBwaW5nIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGNhbGxlci4gKi8KKworCWJueDJ4X2FjcXVpcmVfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9HUElPKTsKKwkvKiByZWFkIEdQSU8gYW5kIG1hc2sgZXhjZXB0IHRoZSBmbG9hdCBiaXRzICovCisJZ3Bpb19yZWcgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0dQSU8pOworCWdwaW9fcmVnICY9IH4ocGlucyA8PCBNSVNDX1JFR0lTVEVSU19HUElPX0ZMT0FUX1BPUyk7CisJZ3Bpb19yZWcgJj0gfihwaW5zIDw8IE1JU0NfUkVHSVNURVJTX0dQSU9fQ0xSX1BPUyk7CisJZ3Bpb19yZWcgJj0gfihwaW5zIDw8IE1JU0NfUkVHSVNURVJTX0dQSU9fU0VUX1BPUyk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0xPVzoKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXQgR1BJTyAweCV4IC0+IG91dHB1dCBsb3dcbiIsIHBpbnMpOworCQkvKiBzZXQgQ0xSICovCisJCWdwaW9fcmVnIHw9IChwaW5zIDw8IE1JU0NfUkVHSVNURVJTX0dQSU9fQ0xSX1BPUyk7CisJCWJyZWFrOworCisJY2FzZSBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9ISUdIOgorCQlEUChORVRJRl9NU0dfTElOSywgIlNldCBHUElPIDB4JXggLT4gb3V0cHV0IGhpZ2hcbiIsIHBpbnMpOworCQkvKiBzZXQgU0VUICovCisJCWdwaW9fcmVnIHw9IChwaW5zIDw8IE1JU0NfUkVHSVNURVJTX0dQSU9fU0VUX1BPUyk7CisJCWJyZWFrOworCisJY2FzZSBNSVNDX1JFR0lTVEVSU19HUElPX0lOUFVUX0hJX1o6CisJCURQKE5FVElGX01TR19MSU5LLCAiU2V0IEdQSU8gMHgleCAtPiBpbnB1dFxuIiwgcGlucyk7CisJCS8qIHNldCBGTE9BVCAqLworCQlncGlvX3JlZyB8PSAocGlucyA8PCBNSVNDX1JFR0lTVEVSU19HUElPX0ZMT0FUX1BPUyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQk5YMlhfRVJSKCJJbnZhbGlkIEdQSU8gbW9kZSBhc3NpZ25tZW50ICVkXG4iLCBtb2RlKTsKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlpZiAocmMgPT0gMCkKKwkJUkVHX1dSKGJwLCBNSVNDX1JFR19HUElPLCBncGlvX3JlZyk7CisKKwlibngyeF9yZWxlYXNlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfR1BJTyk7CisKKwlyZXR1cm4gcmM7Cit9CisKIGludCBibngyeF9zZXRfZ3Bpb19pbnQoc3RydWN0IGJueDJ4ICpicCwgaW50IGdwaW9fbnVtLCB1MzIgbW9kZSwgdTggcG9ydCkKIHsKIAkvKiBUaGUgR1BJTyBzaG91bGQgYmUgc3dhcHBlZCBpZiBzd2FwIHJlZ2lzdGVyIGlzIHNldCBhbmQgYWN0aXZlICovCkBAIC0xNzMyLDQ1ICsyMTIyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGJueDJ4X2dldF9saW5rX2NmZ19pZHgoc3RydWN0IGJueDJ4ICpicCkKLXsKLQl1MzIgc2VsX3BoeV9pZHggPSAwOwotCWlmIChicC0+bGlua192YXJzLmxpbmtfdXApIHsKLQkJc2VsX3BoeV9pZHggPSBFWFRfUEhZMTsKLQkJLyogSW4gY2FzZSBsaW5rIGlzIFNFUkRFUywgY2hlY2sgaWYgdGhlIEVYVF9QSFkyIGlzIHRoZSBvbmUgKi8KLQkJaWYgKChicC0+bGlua192YXJzLmxpbmtfc3RhdHVzICYgTElOS19TVEFUVVNfU0VSREVTX0xJTkspICYmCi0JCSAgICAoYnAtPmxpbmtfcGFyYW1zLnBoeVtFWFRfUEhZMl0uc3VwcG9ydGVkICYgU1VQUE9SVEVEX0ZJQlJFKSkKLQkJCXNlbF9waHlfaWR4ID0gRVhUX1BIWTI7Ci0JfSBlbHNlIHsKLQotCQlzd2l0Y2ggKGJueDJ4X3BoeV9zZWxlY3Rpb24oJmJwLT5saW5rX3BhcmFtcykpIHsKLQkJY2FzZSBQT1JUX0hXX0NGR19QSFlfU0VMRUNUSU9OX0hBUkRXQVJFX0RFRkFVTFQ6Ci0JCWNhc2UgUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9GSVJTVF9QSFk6Ci0JCWNhc2UgUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9GSVJTVF9QSFlfUFJJT1JJVFk6Ci0JCSAgICAgICBzZWxfcGh5X2lkeCA9IEVYVF9QSFkxOwotCQkgICAgICAgYnJlYWs7Ci0JCWNhc2UgUE9SVF9IV19DRkdfUEhZX1NFTEVDVElPTl9TRUNPTkRfUEhZOgotCQljYXNlIFBPUlRfSFdfQ0ZHX1BIWV9TRUxFQ1RJT05fU0VDT05EX1BIWV9QUklPUklUWToKLQkJICAgICAgIHNlbF9waHlfaWR4ID0gRVhUX1BIWTI7Ci0JCSAgICAgICBicmVhazsKLQkJfQotCX0KLQkvKgotCSogVGhlIHNlbGVjdGVkIGFjdGl2ZWQgUEhZIGlzIGFsd2F5cyBhZnRlciBzd2FwcGluZyAoaW4gY2FzZSBQSFkKLQkqIHN3YXBwaW5nIGlzIGVuYWJsZWQpLiBTbyB3aGVuIHN3YXBwaW5nIGlzIGVuYWJsZWQsIHdlIG5lZWQgdG8gcmV2ZXJzZQotCSogdGhlIGNvbmZpZ3VyYXRpb24KLQkqLwotCi0JaWYgKGJwLT5saW5rX3BhcmFtcy5tdWx0aV9waHlfY29uZmlnICYKLQkgICAgUE9SVF9IV19DRkdfUEhZX1NXQVBQRURfRU5BQkxFRCkgewotCQlpZiAoc2VsX3BoeV9pZHggPT0gRVhUX1BIWTEpCi0JCQlzZWxfcGh5X2lkeCA9IEVYVF9QSFkyOwotCQllbHNlIGlmIChzZWxfcGh5X2lkeCA9PSBFWFRfUEhZMikKLQkJCXNlbF9waHlfaWR4ID0gRVhUX1BIWTE7Ci0JfQotCXJldHVybiBMSU5LX0NPTkZJR19JRFgoc2VsX3BoeV9pZHgpOwotfQotCiB2b2lkIGJueDJ4X2NhbGNfZmNfYWR2KHN0cnVjdCBibngyeCAqYnApCiB7CiAJdTggY2ZnX2lkeCA9IGJueDJ4X2dldF9saW5rX2NmZ19pZHgoYnApOwpAQCAtMTgwMywxMCArMjE1NCwxMiBAQAogCQl1OCByYzsKIAkJaW50IGNmeF9pZHggPSBibngyeF9nZXRfbGlua19jZmdfaWR4KGJwKTsKIAkJdTE2IHJlcV9saW5lX3NwZWVkID0gYnAtPmxpbmtfcGFyYW1zLnJlcV9saW5lX3NwZWVkW2NmeF9pZHhdOwotCQkvKiBJbml0aWFsaXplIGxpbmsgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgdmFyaWFibGVzICovCi0JCS8qIEl0IGlzIHJlY29tbWVuZGVkIHRvIHR1cm4gb2ZmIFJYIEZDIGZvciBqdW1ibyBmcmFtZXMKLQkJICAgZm9yIGJldHRlciBwZXJmb3JtYW5jZSAqLwotCQlpZiAoKENISVBfSVNfRTF4KGJwKSkgJiYgKGJwLT5kZXYtPm10dSA+IDUwMDApKQorCQkvKgorCQkgKiBJbml0aWFsaXplIGxpbmsgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgdmFyaWFibGVzCisJCSAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHR1cm4gb2ZmIFJYIEZDIGZvciBqdW1ibyBmcmFtZXMKKwkJICogZm9yIGJldHRlciBwZXJmb3JtYW5jZQorCQkgKi8KKwkJaWYgKENISVBfSVNfRTF4KGJwKSAmJiAoYnAtPmRldi0+bXR1ID4gNTAwMCkpCiAJCQlicC0+bGlua19wYXJhbXMucmVxX2ZjX2F1dG9fYWR2ID0gQk5YMlhfRkxPV19DVFJMX1RYOwogCQllbHNlCiAJCQlicC0+bGlua19wYXJhbXMucmVxX2ZjX2F1dG9fYWR2ID0gQk5YMlhfRkxPV19DVFJMX0JPVEg7CkBAIC0xODE0LDggKzIxNjcsMTggQEAKIAkJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7CiAKIAkJaWYgKGxvYWRfbW9kZSA9PSBMT0FEX0RJQUcpIHsKLQkJCWJwLT5saW5rX3BhcmFtcy5sb29wYmFja19tb2RlID0gTE9PUEJBQ0tfWEdYUzsKLQkJCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZFtjZnhfaWR4XSA9IFNQRUVEXzEwMDAwOworCQkJc3RydWN0IGxpbmtfcGFyYW1zICpscCA9ICZicC0+bGlua19wYXJhbXM7CisJCQlscC0+bG9vcGJhY2tfbW9kZSA9IExPT1BCQUNLX1hHWFM7CisJCQkvKiBkbyBQSFkgbG9vcGJhY2sgYXQgMTBHIHNwZWVkLCBpZiBwb3NzaWJsZSAqLworCQkJaWYgKGxwLT5yZXFfbGluZV9zcGVlZFtjZnhfaWR4XSA8IFNQRUVEXzEwMDAwKSB7CisJCQkJaWYgKGxwLT5zcGVlZF9jYXBfbWFza1tjZnhfaWR4XSAmCisJCQkJICAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTBHKQorCQkJCQlscC0+cmVxX2xpbmVfc3BlZWRbY2Z4X2lkeF0gPQorCQkJCQlTUEVFRF8xMDAwMDsKKwkJCQllbHNlCisJCQkJCWxwLT5yZXFfbGluZV9zcGVlZFtjZnhfaWR4XSA9CisJCQkJCVNQRUVEXzEwMDA7CisJCQl9CiAJCX0KIAogCQlyYyA9IGJueDJ4X3BoeV9pbml0KCZicC0+bGlua19wYXJhbXMsICZicC0+bGlua192YXJzKTsKQEAgLTE4MjcsNyArMjE5MCw4IEBACiAJCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSAmJiBicC0+bGlua192YXJzLmxpbmtfdXApIHsKIAkJCWJueDJ4X3N0YXRzX2hhbmRsZShicCwgU1RBVFNfRVZFTlRfTElOS19VUCk7CiAJCQlibngyeF9saW5rX3JlcG9ydChicCk7Ci0JCX0KKwkJfSBlbHNlCisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoYm54Mnhfd3EsICZicC0+cGVyaW9kX3Rhc2ssIDApOwogCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWRbY2Z4X2lkeF0gPSByZXFfbGluZV9zcGVlZDsKIAkJcmV0dXJuIHJjOwogCX0KQEAgLTE5NDEsOCArMjMwNSwxMiBAQAogCQlicC0+dm5fd2VpZ2h0X3N1bSArPSB2bl9taW5fcmF0ZTsKIAl9CiAKLQkvKiAuLi4gb25seSBpZiBhbGwgbWluIHJhdGVzIGFyZSB6ZXJvcyAtIGRpc2FibGUgZmFpcm5lc3MgKi8KLQlpZiAoYWxsX3plcm8pIHsKKwkvKiBpZiBFVFMgb3IgYWxsIG1pbiByYXRlcyBhcmUgemVyb3MgLSBkaXNhYmxlIGZhaXJuZXNzICovCisJaWYgKEJOWDJYX0lTX0VUU19FTkFCTEVEKGJwKSkgeworCQlicC0+Y21uZy5mbGFncy5jbW5nX2VuYWJsZXMgJj0KKwkJCQkJfkNNTkdfRkxBR1NfUEVSX1BPUlRfRkFJUk5FU1NfVk47CisJCURQKE5FVElGX01TR19JRlVQLCAiRmFpcm5lc3Mgd2lsbCBiZSBkaXNhYmxlZCBkdWUgdG8gRVRTXG4iKTsKKwl9IGVsc2UgaWYgKGFsbF96ZXJvKSB7CiAJCWJwLT5jbW5nLmZsYWdzLmNtbmdfZW5hYmxlcyAmPQogCQkJCQl+Q01OR19GTEFHU19QRVJfUE9SVF9GQUlSTkVTU19WTjsKIAkJRFAoTkVUSUZfTVNHX0lGVVAsICJBbGwgTUlOIHZhbHVlcyBhcmUgemVyb2VzIgpAQCAtMjE0MywxMSArMjUxMSwxMSBAQAogCQkJICAgICAgIHBhdXNlX2VuYWJsZWQpOwogCQl9CiAKLQkJaWYgKGJwLT5saW5rX3ZhcnMubWFjX3R5cGUgPT0gTUFDX1RZUEVfQk1BQykgeworCQlpZiAoYnAtPmxpbmtfdmFycy5tYWNfdHlwZSAhPSBNQUNfVFlQRV9FTUFDKSB7CiAJCQlzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzICpwc3RhdHM7CiAKIAkJCXBzdGF0cyA9IGJueDJ4X3NwKGJwLCBwb3J0X3N0YXRzKTsKLQkJCS8qIHJlc2V0IG9sZCBibWFjIHN0YXRzICovCisJCQkvKiByZXNldCBvbGQgbWFjIHN0YXRzICovCiAJCQltZW1zZXQoJihwc3RhdHMtPm1hY19zdHhbMF0pLCAwLAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWFjX3N0eCkpOwogCQl9CkBAIC0yMTk3LDEyICsyNTY1LDIzIEBACiAJYnAtPnBvcnQucG1mID0gMTsKIAlEUChORVRJRl9NU0dfTElOSywgInBtZiAlZFxuIiwgYnAtPnBvcnQucG1mKTsKIAorCS8qCisJICogV2UgbmVlZCB0aGUgbWIoKSB0byBlbnN1cmUgdGhlIG9yZGVyaW5nIGJldHdlZW4gdGhlIHdyaXRpbmcgdG8KKwkgKiBicC0+cG9ydC5wbWYgaGVyZSBhbmQgcmVhZGluZyBpdCBmcm9tIHRoZSBibngyeF9wZXJpb2RpY190YXNrKCkuCisJICovCisJc21wX21iKCk7CisKKwkvKiBxdWV1ZSBhIHBlcmlvZGljIHRhc2sgKi8KKwlxdWV1ZV9kZWxheWVkX3dvcmsoYm54Mnhfd3EsICZicC0+cGVyaW9kX3Rhc2ssIDApOworCisJYm54MnhfZGNieF9wbWZfdXBkYXRlKGJwKTsKKwogCS8qIGVuYWJsZSBuaWcgYXR0ZW50aW9uICovCiAJdmFsID0gKDB4ZmYwZiB8ICgxIDw8IChCUF9FMUhWTihicCkgKyA0KSkpOwogCWlmIChicC0+Y29tbW9uLmludF9ibG9jayA9PSBJTlRfQkxPQ0tfSEMpIHsKIAkJUkVHX1dSKGJwLCBIQ19SRUdfVFJBSUxJTkdfRURHRV8wICsgcG9ydCo4LCB2YWwpOwogCQlSRUdfV1IoYnAsIEhDX1JFR19MRUFESU5HX0VER0VfMCArIHBvcnQqOCwgdmFsKTsKLQl9IGVsc2UgaWYgKENISVBfSVNfRTIoYnApKSB7CisJfSBlbHNlIGlmICghQ0hJUF9JU19FMXgoYnApKSB7CiAJCVJFR19XUihicCwgSUdVX1JFR19UUkFJTElOR19FREdFX0xBVENILCB2YWwpOwogCQlSRUdfV1IoYnAsIElHVV9SRUdfTEVBRElOR19FREdFX0xBVENILCB2YWwpOwogCX0KQEAgLTIyMzIsNyArMjYxMSw4IEBACiAJU0hNRU1fV1IoYnAsIGZ1bmNfbWJbbWJfaWR4XS5kcnZfbWJfcGFyYW0sIHBhcmFtKTsKIAlTSE1FTV9XUihicCwgZnVuY19tYlttYl9pZHhdLmRydl9tYl9oZWFkZXIsIChjb21tYW5kIHwgc2VxKSk7CiAKLQlEUChCTlgyWF9NU0dfTUNQLCAid3JvdGUgY29tbWFuZCAoJXgpIHRvIEZXIE1CXG4iLCAoY29tbWFuZCB8IHNlcSkpOworCURQKEJOWDJYX01TR19NQ1AsICJ3cm90ZSBjb21tYW5kICgleCkgdG8gRlcgTUIgcGFyYW0gMHglMDh4XG4iLAorCQkJKGNvbW1hbmQgfCBzZXEpLCBwYXJhbSk7CiAKIAlkbyB7CiAJCS8qIGxldCB0aGUgRlcgZG8gaXQncyBtYWdpYyAuLi4gKi8KQEAgLTIyNjMsMTQxICsyNjQzLDI1IEBACiBzdGF0aWMgdTggc3RhdF9jb3VudGVyX3ZhbGlkKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCiB7CiAjaWZkZWYgQkNNX0NOSUMKLQlpZiAoSVNfRkNPRV9GUChmcCkgJiYgSVNfTUYoYnApKQorCS8qIFN0YXRpc3RpY3MgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIENOSUMgQ2xpZW50cyBhdCB0aGUgbW9tZW50ICovCisJaWYgKElTX0ZDT0VfRlAoZnApKQogCQlyZXR1cm4gZmFsc2U7CiAjZW5kaWYKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotLyogbXVzdCBiZSBjYWxsZWQgdW5kZXIgcnRubF9sb2NrICovCi1zdGF0aWMgdm9pZCBibngyeF9yeHFfc2V0X21hY19maWx0ZXJzKHN0cnVjdCBibngyeCAqYnAsIHUxNiBjbF9pZCwgdTMyIGZpbHRlcnMpCit2b2lkIGJueDJ4X2Z1bmNfaW5pdChzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54MnhfZnVuY19pbml0X3BhcmFtcyAqcCkKIHsKLQl1MzIgbWFzayA9ICgxIDw8IGNsX2lkKTsKKwlpZiAoQ0hJUF9JU19FMXgoYnApKSB7CisJCXN0cnVjdCB0c3Rvcm1fZXRoX2Z1bmN0aW9uX2NvbW1vbl9jb25maWcgdGNmZyA9IHswfTsKIAotCS8qIGluaXRpYWwgc2VldGluZyBpcyBCTlgyWF9BQ0NFUFRfTk9ORSAqLwotCXU4IGRyb3BfYWxsX3VjYXN0ID0gMSwgZHJvcF9hbGxfYmNhc3QgPSAxLCBkcm9wX2FsbF9tY2FzdCA9IDE7Ci0JdTggYWNjcF9hbGxfdWNhc3QgPSAwLCBhY2NwX2FsbF9iY2FzdCA9IDAsIGFjY3BfYWxsX21jYXN0ID0gMDsKLQl1OCB1bm1hdGNoZWRfdW5pY2FzdCA9IDA7Ci0KLQlpZiAoZmlsdGVycyAmIEJOWDJYX0FDQ0VQVF9VTk1BVENIRURfVUNBU1QpCi0JCXVubWF0Y2hlZF91bmljYXN0ID0gMTsKLQotCWlmIChmaWx0ZXJzICYgQk5YMlhfUFJPTUlTQ1VPVVNfTU9ERSkgewotCQkvKiBwcm9taXNjaW91cyAtIGFjY2VwdCBhbGwsIGRyb3Agbm9uZSAqLwotCQlkcm9wX2FsbF91Y2FzdCA9IGRyb3BfYWxsX2JjYXN0ID0gZHJvcF9hbGxfbWNhc3QgPSAwOwotCQlhY2NwX2FsbF91Y2FzdCA9IGFjY3BfYWxsX2JjYXN0ID0gYWNjcF9hbGxfbWNhc3QgPSAxOwotCQlpZiAoSVNfTUZfU0koYnApKSB7Ci0JCQkvKgotCQkJICogU0kgbW9kZSBkZWZpbmVzIHRvIGFjY2VwdCBpbiBwcm9taXNjdW9zIG1vZGUKLQkJCSAqIG9ubHkgdW5tYXRjaGVkIHBhY2tldHMKLQkJCSAqLwotCQkJdW5tYXRjaGVkX3VuaWNhc3QgPSAxOwotCQkJYWNjcF9hbGxfdWNhc3QgPSAwOwotCQl9CisJCXN0b3JtX21lbXNldF9mdW5jX2NmZyhicCwgJnRjZmcsIHAtPmZ1bmNfaWQpOwogCX0KLQlpZiAoZmlsdGVycyAmIEJOWDJYX0FDQ0VQVF9VTklDQVNUKSB7Ci0JCS8qIGFjY2VwdCBtYXRjaGVkIHVjYXN0ICovCi0JCWRyb3BfYWxsX3VjYXN0ID0gMDsKLQl9Ci0JaWYgKGZpbHRlcnMgJiBCTlgyWF9BQ0NFUFRfTVVMVElDQVNUKQotCQkvKiBhY2NlcHQgbWF0Y2hlZCBtY2FzdCAqLwotCQlkcm9wX2FsbF9tY2FzdCA9IDA7Ci0KLQlpZiAoZmlsdGVycyAmIEJOWDJYX0FDQ0VQVF9BTExfVU5JQ0FTVCkgewotCQkvKiBhY2NlcHQgYWxsIG1jYXN0ICovCi0JCWRyb3BfYWxsX3VjYXN0ID0gMDsKLQkJYWNjcF9hbGxfdWNhc3QgPSAxOwotCX0KLQlpZiAoZmlsdGVycyAmIEJOWDJYX0FDQ0VQVF9BTExfTVVMVElDQVNUKSB7Ci0JCS8qIGFjY2VwdCBhbGwgbWNhc3QgKi8KLQkJZHJvcF9hbGxfbWNhc3QgPSAwOwotCQlhY2NwX2FsbF9tY2FzdCA9IDE7Ci0JfQotCWlmIChmaWx0ZXJzICYgQk5YMlhfQUNDRVBUX0JST0FEQ0FTVCkgewotCQkvKiBhY2NlcHQgKGFsbCkgYmNhc3QgKi8KLQkJZHJvcF9hbGxfYmNhc3QgPSAwOwotCQlhY2NwX2FsbF9iY2FzdCA9IDE7Ci0JfQotCi0JYnAtPm1hY19maWx0ZXJzLnVjYXN0X2Ryb3BfYWxsID0gZHJvcF9hbGxfdWNhc3QgPwotCQlicC0+bWFjX2ZpbHRlcnMudWNhc3RfZHJvcF9hbGwgfCBtYXNrIDoKLQkJYnAtPm1hY19maWx0ZXJzLnVjYXN0X2Ryb3BfYWxsICYgfm1hc2s7Ci0KLQlicC0+bWFjX2ZpbHRlcnMubWNhc3RfZHJvcF9hbGwgPSBkcm9wX2FsbF9tY2FzdCA/Ci0JCWJwLT5tYWNfZmlsdGVycy5tY2FzdF9kcm9wX2FsbCB8IG1hc2sgOgotCQlicC0+bWFjX2ZpbHRlcnMubWNhc3RfZHJvcF9hbGwgJiB+bWFzazsKLQotCWJwLT5tYWNfZmlsdGVycy5iY2FzdF9kcm9wX2FsbCA9IGRyb3BfYWxsX2JjYXN0ID8KLQkJYnAtPm1hY19maWx0ZXJzLmJjYXN0X2Ryb3BfYWxsIHwgbWFzayA6Ci0JCWJwLT5tYWNfZmlsdGVycy5iY2FzdF9kcm9wX2FsbCAmIH5tYXNrOwotCi0JYnAtPm1hY19maWx0ZXJzLnVjYXN0X2FjY2VwdF9hbGwgPSBhY2NwX2FsbF91Y2FzdCA/Ci0JCWJwLT5tYWNfZmlsdGVycy51Y2FzdF9hY2NlcHRfYWxsIHwgbWFzayA6Ci0JCWJwLT5tYWNfZmlsdGVycy51Y2FzdF9hY2NlcHRfYWxsICYgfm1hc2s7Ci0KLQlicC0+bWFjX2ZpbHRlcnMubWNhc3RfYWNjZXB0X2FsbCA9IGFjY3BfYWxsX21jYXN0ID8KLQkJYnAtPm1hY19maWx0ZXJzLm1jYXN0X2FjY2VwdF9hbGwgfCBtYXNrIDoKLQkJYnAtPm1hY19maWx0ZXJzLm1jYXN0X2FjY2VwdF9hbGwgJiB+bWFzazsKLQotCWJwLT5tYWNfZmlsdGVycy5iY2FzdF9hY2NlcHRfYWxsID0gYWNjcF9hbGxfYmNhc3QgPwotCQlicC0+bWFjX2ZpbHRlcnMuYmNhc3RfYWNjZXB0X2FsbCB8IG1hc2sgOgotCQlicC0+bWFjX2ZpbHRlcnMuYmNhc3RfYWNjZXB0X2FsbCAmIH5tYXNrOwotCi0JYnAtPm1hY19maWx0ZXJzLnVubWF0Y2hlZF91bmljYXN0ID0gdW5tYXRjaGVkX3VuaWNhc3QgPwotCQlicC0+bWFjX2ZpbHRlcnMudW5tYXRjaGVkX3VuaWNhc3QgfCBtYXNrIDoKLQkJYnAtPm1hY19maWx0ZXJzLnVubWF0Y2hlZF91bmljYXN0ICYgfm1hc2s7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X2Z1bmNfaW5pdChzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54MnhfZnVuY19pbml0X3BhcmFtcyAqcCkKLXsKLQlzdHJ1Y3QgdHN0b3JtX2V0aF9mdW5jdGlvbl9jb21tb25fY29uZmlnIHRjZmcgPSB7MH07Ci0JdTE2IHJzc19mbGdzOwotCi0JLyogdHBhICovCi0JaWYgKHAtPmZ1bmNfZmxncyAmIEZVTkNfRkxHX1RQQSkKLQkJdGNmZy5jb25maWdfZmxhZ3MgfD0KLQkJVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX0VOQUJMRV9UUEE7Ci0KLQkvKiBzZXQgcnNzIGZsYWdzICovCi0JcnNzX2ZsZ3MgPSAocC0+cnNzLT5tb2RlIDw8Ci0JCVRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfTU9ERV9TSElGVCk7Ci0KLQlpZiAocC0+cnNzLT5jYXAgJiBSU1NfSVBWNF9DQVApCi0JCXJzc19mbGdzIHw9IFJTU19JUFY0X0NBUF9NQVNLOwotCWlmIChwLT5yc3MtPmNhcCAmIFJTU19JUFY0X1RDUF9DQVApCi0JCXJzc19mbGdzIHw9IFJTU19JUFY0X1RDUF9DQVBfTUFTSzsKLQlpZiAocC0+cnNzLT5jYXAgJiBSU1NfSVBWNl9DQVApCi0JCXJzc19mbGdzIHw9IFJTU19JUFY2X0NBUF9NQVNLOwotCWlmIChwLT5yc3MtPmNhcCAmIFJTU19JUFY2X1RDUF9DQVApCi0JCXJzc19mbGdzIHw9IFJTU19JUFY2X1RDUF9DQVBfTUFTSzsKLQotCXRjZmcuY29uZmlnX2ZsYWdzIHw9IHJzc19mbGdzOwotCXRjZmcucnNzX3Jlc3VsdF9tYXNrID0gcC0+cnNzLT5yZXN1bHRfbWFzazsKLQotCXN0b3JtX21lbXNldF9mdW5jX2NmZyhicCwgJnRjZmcsIHAtPmZ1bmNfaWQpOwogCiAJLyogRW5hYmxlIHRoZSBmdW5jdGlvbiBpbiB0aGUgRlcgKi8KIAlzdG9ybV9tZW1zZXRfdmZfdG9fcGYoYnAsIHAtPmZ1bmNfaWQsIHAtPnBmX2lkKTsKIAlzdG9ybV9tZW1zZXRfZnVuY19lbihicCwgcC0+ZnVuY19pZCwgMSk7CiAKLQkvKiBzdGF0aXN0aWNzICovCi0JaWYgKHAtPmZ1bmNfZmxncyAmIEZVTkNfRkxHX1NUQVRTKSB7Ci0JCXN0cnVjdCBzdGF0c19pbmRpY2F0aW9uX2ZsYWdzIHN0YXRzX2ZsYWdzID0gezB9OwotCQlzdGF0c19mbGFncy5jb2xsZWN0X2V0aCA9IDE7Ci0KLQkJc3Rvcm1fbWVtc2V0X3hzdGF0c19mbGFncyhicCwgJnN0YXRzX2ZsYWdzLCBwLT5mdW5jX2lkKTsKLQkJc3Rvcm1fbWVtc2V0X3hzdGF0c19hZGRyKGJwLCBwLT5md19zdGF0X21hcCwgcC0+ZnVuY19pZCk7Ci0KLQkJc3Rvcm1fbWVtc2V0X3RzdGF0c19mbGFncyhicCwgJnN0YXRzX2ZsYWdzLCBwLT5mdW5jX2lkKTsKLQkJc3Rvcm1fbWVtc2V0X3RzdGF0c19hZGRyKGJwLCBwLT5md19zdGF0X21hcCwgcC0+ZnVuY19pZCk7Ci0KLQkJc3Rvcm1fbWVtc2V0X3VzdGF0c19mbGFncyhicCwgJnN0YXRzX2ZsYWdzLCBwLT5mdW5jX2lkKTsKLQkJc3Rvcm1fbWVtc2V0X3VzdGF0c19hZGRyKGJwLCBwLT5md19zdGF0X21hcCwgcC0+ZnVuY19pZCk7Ci0KLQkJc3Rvcm1fbWVtc2V0X2NzdGF0c19mbGFncyhicCwgJnN0YXRzX2ZsYWdzLCBwLT5mdW5jX2lkKTsKLQkJc3Rvcm1fbWVtc2V0X2NzdGF0c19hZGRyKGJwLCBwLT5md19zdGF0X21hcCwgcC0+ZnVuY19pZCk7Ci0JfQotCiAJLyogc3BxICovCiAJaWYgKHAtPmZ1bmNfZmxncyAmIEZVTkNfRkxHX1NQUSkgewogCQlzdG9ybV9tZW1zZXRfc3BxX2FkZHIoYnAsIHAtPnNwcV9tYXAsIHAtPmZ1bmNfaWQpOwpAQCAtMjQwNiwzOSArMjY3MCw5MSBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB1MTYgYm54MnhfZ2V0X2NsX2ZsYWdzKHN0cnVjdCBibngyeCAqYnAsCi0JCQkJICAgICBzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwKQorLyoqCisgKiBibngyeF9nZXRfdHhfb25seV9mbGFncyAtIFJldHVybiBjb21tb24gZmxhZ3MKKyAqCisgKiBAYnAJCWRldmljZSBoYW5kbGUKKyAqIEBmcAkJcXVldWUgaGFuZGxlCisgKiBAemVyb19zdGF0cwlUUlVFIGlmIHN0YXRpc3RpY3MgemVyb2luZyBpcyBuZWVkZWQKKyAqCisgKiBSZXR1cm4gdGhlIGZsYWdzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIFR4LW9ubHkgYW5kIG5vdCBub3JtYWwgY29ubmVjdGlvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBibngyeF9nZXRfY29tbW9uX2ZsYWdzKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCQkgICBzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLAorCQkJCQkJICAgYm9vbCB6ZXJvX3N0YXRzKQogewotCXUxNiBmbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKLQkvKiBjYWxjdWxhdGUgcXVldWUgZmxhZ3MgKi8KLQlmbGFncyB8PSBRVUVVRV9GTEdfQ0FDSEVfQUxJR047Ci0JZmxhZ3MgfD0gUVVFVUVfRkxHX0hDOwotCWZsYWdzIHw9IElTX01GX1NEKGJwKSA/IFFVRVVFX0ZMR19PViA6IDA7CisJLyogUEYgZHJpdmVyIHdpbGwgYWx3YXlzIGluaXRpYWxpemUgdGhlIFF1ZXVlIHRvIGFuIEFDVElWRSBzdGF0ZSAqLworCV9fc2V0X2JpdChCTlgyWF9RX0ZMR19BQ1RJVkUsICZmbGFncyk7CiAKLQlmbGFncyB8PSBRVUVVRV9GTEdfVkxBTjsKLQlEUChORVRJRl9NU0dfSUZVUCwgInZsYW4gcmVtb3ZhbCBlbmFibGVkXG4iKTsKLQotCWlmICghZnAtPmRpc2FibGVfdHBhKQotCQlmbGFncyB8PSBRVUVVRV9GTEdfVFBBOwotCi0JZmxhZ3MgPSBzdGF0X2NvdW50ZXJfdmFsaWQoYnAsIGZwKSA/Ci0JCQkoZmxhZ3MgfCBRVUVVRV9GTEdfU1RBVFMpIDogKGZsYWdzICYgflFVRVVFX0ZMR19TVEFUUyk7CisJLyogdHggb25seSBjb25uZWN0aW9ucyBjb2xsZWN0IHN0YXRpc3RpY3MgKG9uIHRoZSBzYW1lIGluZGV4IGFzIHRoZQorCSAqICBwYXJlbnQgY29ubmVjdGlvbikuIFRoZSBzdGF0aXN0aWNzIGFyZSB6ZXJvZWQgd2hlbiB0aGUgcGFyZW50CisJICogIGNvbm5lY3Rpb24gaXMgaW5pdGlhbGl6ZWQuCisJICovCisJaWYgKHN0YXRfY291bnRlcl92YWxpZChicCwgZnApKSB7CisJCV9fc2V0X2JpdChCTlgyWF9RX0ZMR19TVEFUUywgJmZsYWdzKTsKKwkJaWYgKHplcm9fc3RhdHMpCisJCQlfX3NldF9iaXQoQk5YMlhfUV9GTEdfWkVST19TVEFUUywgJmZsYWdzKTsKKwl9CiAKIAlyZXR1cm4gZmxhZ3M7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJ4X3BmX3J4X2NsX3ByZXAoc3RydWN0IGJueDJ4ICpicCwKLQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLCBzdHJ1Y3QgcnhxX3BhdXNlX3BhcmFtcyAqcGF1c2UsCi0Jc3RydWN0IGJueDJ4X3J4cV9pbml0X3BhcmFtcyAqcnhxX2luaXQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYm54MnhfZ2V0X3FfZmxhZ3Moc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJICAgICAgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKKwkJCQkJICAgICAgYm9vbCBsZWFkaW5nKQogewotCXUxNiBtYXhfc2dlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCS8qIGNhbGN1bGF0ZSBvdGhlciBxdWV1ZSBmbGFncyAqLworCWlmIChJU19NRl9TRChicCkpCisJCV9fc2V0X2JpdChCTlgyWF9RX0ZMR19PViwgJmZsYWdzKTsKKworCWlmIChJU19GQ09FX0ZQKGZwKSkKKwkJX19zZXRfYml0KEJOWDJYX1FfRkxHX0ZDT0UsICZmbGFncyk7CisKKwlpZiAoIWZwLT5kaXNhYmxlX3RwYSkgeworCQlfX3NldF9iaXQoQk5YMlhfUV9GTEdfVFBBLCAmZmxhZ3MpOworCQlfX3NldF9iaXQoQk5YMlhfUV9GTEdfVFBBX0lQVjYsICZmbGFncyk7CisJfQorCisJaWYgKGxlYWRpbmcpIHsKKwkJX19zZXRfYml0KEJOWDJYX1FfRkxHX0xFQURJTkdfUlNTLCAmZmxhZ3MpOworCQlfX3NldF9iaXQoQk5YMlhfUV9GTEdfTUNBU1QsICZmbGFncyk7CisJfQorCisJLyogQWx3YXlzIHNldCBIVyBWTEFOIHN0cmlwcGluZyAqLworCV9fc2V0X2JpdChCTlgyWF9RX0ZMR19WTEFOLCAmZmxhZ3MpOworCisKKwlyZXR1cm4gZmxhZ3MgfCBibngyeF9nZXRfY29tbW9uX2ZsYWdzKGJwLCBmcCwgdHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3BmX3FfcHJlcF9nZW5lcmFsKHN0cnVjdCBibngyeCAqYnAsCisJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgc3RydWN0IGJueDJ4X2dlbmVyYWxfc2V0dXBfcGFyYW1zICpnZW5faW5pdCwKKwl1OCBjb3MpCit7CisJZ2VuX2luaXQtPnN0YXRfaWQgPSBibngyeF9zdGF0c19pZChmcCk7CisJZ2VuX2luaXQtPnNwY2xfaWQgPSBmcC0+Y2xfaWQ7CisKKwkvKiBBbHdheXMgdXNlIG1pbmktanVtYm8gTVRVIGZvciBGQ29FIEwyIHJpbmcgKi8KKwlpZiAoSVNfRkNPRV9GUChmcCkpCisJCWdlbl9pbml0LT5tdHUgPSBCTlgyWF9GQ09FX01JTklfSlVNQk9fTVRVOworCWVsc2UKKwkJZ2VuX2luaXQtPm10dSA9IGJwLT5kZXYtPm10dTsKKworCWdlbl9pbml0LT5jb3MgPSBjb3M7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3BmX3J4X3FfcHJlcChzdHJ1Y3QgYm54MnggKmJwLAorCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsIHN0cnVjdCByeHFfcGF1c2VfcGFyYW1zICpwYXVzZSwKKwlzdHJ1Y3QgYm54MnhfcnhxX3NldHVwX3BhcmFtcyAqcnhxX2luaXQpCit7CisJdTggbWF4X3NnZSA9IDA7CiAJdTE2IHNnZV9zeiA9IDA7CiAJdTE2IHRwYV9hZ2dfc2l6ZSA9IDA7CiAKLQkvKiBjYWxjdWxhdGUgcXVldWUgZmxhZ3MgKi8KLQl1MTYgZmxhZ3MgPSBibngyeF9nZXRfY2xfZmxhZ3MoYnAsIGZwKTsKLQogCWlmICghZnAtPmRpc2FibGVfdHBhKSB7CiAJCXBhdXNlLT5zZ2VfdGhfaGkgPSAyNTA7CiAJCXBhdXNlLT5zZ2VfdGhfbG8gPSAxNTA7CkBAIC0yNDU5LDgwICsyNzc1LDc0IEBACiAJCXBhdXNlLT5iZF90aF9sbyA9IDI1MDsKIAkJcGF1c2UtPnJjcV90aF9oaSA9IDM1MDsKIAkJcGF1c2UtPnJjcV90aF9sbyA9IDI1MDsKLQkJcGF1c2UtPnNnZV90aF9oaSA9IDA7Ci0JCXBhdXNlLT5zZ2VfdGhfbG8gPSAwOworCiAJCXBhdXNlLT5wcmlfbWFwID0gMTsKIAl9CiAKIAkvKiByeHEgc2V0dXAgKi8KLQlyeHFfaW5pdC0+ZmxhZ3MgPSBmbGFnczsKLQlyeHFfaW5pdC0+Y3h0ID0gJmJwLT5jb250ZXh0LnZjeHRbZnAtPmNpZF0uZXRoOwogCXJ4cV9pbml0LT5kc2NyX21hcCA9IGZwLT5yeF9kZXNjX21hcHBpbmc7CiAJcnhxX2luaXQtPnNnZV9tYXAgPSBmcC0+cnhfc2dlX21hcHBpbmc7CiAJcnhxX2luaXQtPnJjcV9tYXAgPSBmcC0+cnhfY29tcF9tYXBwaW5nOwogCXJ4cV9pbml0LT5yY3FfbnBfbWFwID0gZnAtPnJ4X2NvbXBfbWFwcGluZyArIEJDTV9QQUdFX1NJWkU7CiAKLQkvKiBBbHdheXMgdXNlIG1pbmktanVtYm8gTVRVIGZvciBGQ29FIEwyIHJpbmcgKi8KLQlpZiAoSVNfRkNPRV9GUChmcCkpCi0JCXJ4cV9pbml0LT5tdHUgPSBCTlgyWF9GQ09FX01JTklfSlVNQk9fTVRVOwotCWVsc2UKLQkJcnhxX2luaXQtPm10dSA9IGJwLT5kZXYtPm10dTsKKwkvKiBUaGlzIHNob3VsZCBiZSBhIG1heGltdW0gbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdGhhdCBtYXkgYmUKKwkgKiBwbGFjZWQgb24gdGhlIEJEIChub3QgaW5jbHVkaW5nIHBhZGRpbmdzKS4KKwkgKi8KKwlyeHFfaW5pdC0+YnVmX3N6ID0gZnAtPnJ4X2J1Zl9zaXplIC0gQk5YMlhfRldfUlhfQUxJR04gLQorCQlJUF9IRUFERVJfQUxJR05NRU5UX1BBRERJTkc7CiAKLQlyeHFfaW5pdC0+YnVmX3N6ID0gZnAtPnJ4X2J1Zl9zaXplOwogCXJ4cV9pbml0LT5jbF9xem9uZV9pZCA9IGZwLT5jbF9xem9uZV9pZDsKLQlyeHFfaW5pdC0+Y2xfaWQgPSBmcC0+Y2xfaWQ7Ci0JcnhxX2luaXQtPnNwY2xfaWQgPSBmcC0+Y2xfaWQ7Ci0JcnhxX2luaXQtPnN0YXRfaWQgPSBmcC0+Y2xfaWQ7CiAJcnhxX2luaXQtPnRwYV9hZ2dfc3ogPSB0cGFfYWdnX3NpemU7CiAJcnhxX2luaXQtPnNnZV9idWZfc3ogPSBzZ2Vfc3o7CiAJcnhxX2luaXQtPm1heF9zZ2VzX3BrdCA9IG1heF9zZ2U7CisJcnhxX2luaXQtPnJzc19lbmdpbmVfaWQgPSBCUF9GVU5DKGJwKTsKKworCS8qIE1heGltdW0gbnVtYmVyIG9yIHNpbXVsdGFuZW91cyBUUEEgYWdncmVnYXRpb24gZm9yIHRoaXMgUXVldWUuCisJICoKKwkgKiBGb3IgUEYgQ2xpZW50cyBpdCBzaG91bGQgYmUgdGhlIG1heGltdW0gYXZhbGlhYmxlIG51bWJlci4KKwkgKiBWRiBkcml2ZXIocykgbWF5IHdhbnQgdG8gZGVmaW5lIGl0IHRvIGEgc21hbGxlciB2YWx1ZS4KKwkgKi8KKwlyeHFfaW5pdC0+bWF4X3RwYV9xdWV1ZXMgPQorCQkoQ0hJUF9JU19FMShicCkgPyBFVEhfTUFYX0FHR1JFR0FUSU9OX1FVRVVFU19FMSA6CisJCUVUSF9NQVhfQUdHUkVHQVRJT05fUVVFVUVTX0UxSF9FMik7CisKIAlyeHFfaW5pdC0+Y2FjaGVfbGluZV9sb2cgPSBCTlgyWF9SWF9BTElHTl9TSElGVDsKIAlyeHFfaW5pdC0+Zndfc2JfaWQgPSBmcC0+Zndfc2JfaWQ7CiAKIAlpZiAoSVNfRkNPRV9GUChmcCkpCiAJCXJ4cV9pbml0LT5zYl9jcV9pbmRleCA9IEhDX1NQX0lOREVYX0VUSF9GQ09FX1JYX0NRX0NPTlM7CiAJZWxzZQotCQlyeHFfaW5pdC0+c2JfY3FfaW5kZXggPSBVX1NCX0VUSF9SWF9DUV9JTkRFWDsKLQotCXJ4cV9pbml0LT5jaWQgPSBIV19DSUQoYnAsIGZwLT5jaWQpOwotCi0JcnhxX2luaXQtPmhjX3JhdGUgPSBicC0+cnhfdGlja3MgPyAoMTAwMDAwMCAvIGJwLT5yeF90aWNrcykgOiAwOworCQlyeHFfaW5pdC0+c2JfY3FfaW5kZXggPSBIQ19JTkRFWF9FVEhfUlhfQ1FfQ09OUzsKIH0KIAotc3RhdGljIHZvaWQgYm54MnhfcGZfdHhfY2xfcHJlcChzdHJ1Y3QgYm54MnggKmJwLAotCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsIHN0cnVjdCBibngyeF90eHFfaW5pdF9wYXJhbXMgKnR4cV9pbml0KQorc3RhdGljIHZvaWQgYm54MnhfcGZfdHhfcV9wcmVwKHN0cnVjdCBibngyeCAqYnAsCisJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgc3RydWN0IGJueDJ4X3R4cV9zZXR1cF9wYXJhbXMgKnR4cV9pbml0LAorCXU4IGNvcykKIHsKLQl1MTYgZmxhZ3MgPSBibngyeF9nZXRfY2xfZmxhZ3MoYnAsIGZwKTsKLQotCXR4cV9pbml0LT5mbGFncyA9IGZsYWdzOwotCXR4cV9pbml0LT5jeHQgPSAmYnAtPmNvbnRleHQudmN4dFtmcC0+Y2lkXS5ldGg7Ci0JdHhxX2luaXQtPmRzY3JfbWFwID0gZnAtPnR4X2Rlc2NfbWFwcGluZzsKLQl0eHFfaW5pdC0+c3RhdF9pZCA9IGZwLT5jbF9pZDsKLQl0eHFfaW5pdC0+Y2lkID0gSFdfQ0lEKGJwLCBmcC0+Y2lkKTsKLQl0eHFfaW5pdC0+c2JfY3FfaW5kZXggPSBDX1NCX0VUSF9UWF9DUV9JTkRFWDsKKwl0eHFfaW5pdC0+ZHNjcl9tYXAgPSBmcC0+dHhkYXRhW2Nvc10udHhfZGVzY19tYXBwaW5nOworCXR4cV9pbml0LT5zYl9jcV9pbmRleCA9IEhDX0lOREVYX0VUSF9GSVJTVF9UWF9DUV9DT05TICsgY29zOwogCXR4cV9pbml0LT50cmFmZmljX3R5cGUgPSBMTEZDX1RSQUZGSUNfVFlQRV9OVzsKIAl0eHFfaW5pdC0+Zndfc2JfaWQgPSBmcC0+Zndfc2JfaWQ7CiAKKwkvKgorCSAqIHNldCB0aGUgdHNzIGxlYWRpbmcgY2xpZW50IGlkIGZvciBUWCBjbGFzc2ZpY2F0aW9uID09CisJICogbGVhZGluZyBSU1MgY2xpZW50IGlkCisJICovCisJdHhxX2luaXQtPnRzc19sZWFkaW5nX2NsX2lkID0gYm54MnhfZnAoYnAsIDAsIGNsX2lkKTsKKwogCWlmIChJU19GQ09FX0ZQKGZwKSkgewogCQl0eHFfaW5pdC0+c2JfY3FfaW5kZXggPSBIQ19TUF9JTkRFWF9FVEhfRkNPRV9UWF9DUV9DT05TOwogCQl0eHFfaW5pdC0+dHJhZmZpY190eXBlID0gTExGQ19UUkFGRklDX1RZUEVfRkNPRTsKIAl9Ci0KLQl0eHFfaW5pdC0+aGNfcmF0ZSA9IGJwLT50eF90aWNrcyA/ICgxMDAwMDAwIC8gYnAtPnR4X3RpY2tzKSA6IDA7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X3BmX2luaXQoc3RydWN0IGJueDJ4ICpicCkKIHsKIAlzdHJ1Y3QgYm54MnhfZnVuY19pbml0X3BhcmFtcyBmdW5jX2luaXQgPSB7MH07Ci0Jc3RydWN0IGJueDJ4X3Jzc19wYXJhbXMgcnNzID0gezB9OwogCXN0cnVjdCBldmVudF9yaW5nX2RhdGEgZXFfZGF0YSA9IHsgezB9IH07CiAJdTE2IGZsYWdzOwogCi0JLyogcGYgc3BlY2lmaWMgc2V0dXBzICovCi0JaWYgKCFDSElQX0lTX0UxKGJwKSkKLQkJc3Rvcm1fbWVtc2V0X292KGJwLCBicC0+bWZfb3YsIEJQX0ZVTkMoYnApKTsKLQotCWlmIChDSElQX0lTX0UyKGJwKSkgeworCWlmICghQ0hJUF9JU19FMXgoYnApKSB7CiAJCS8qIHJlc2V0IElHVSBQRiBzdGF0aXN0aWNzOiBNU0lYICsgQVRUTiAqLwogCQkvKiBQRiAqLwogCQlSRUdfV1IoYnAsIElHVV9SRUdfU1RBVElTVElDX05VTV9NRVNTQUdFX1NFTlQgKwpAQCAtMjU1MCwyNyArMjg2MCwxNCBAQAogCS8qIGZ1bmN0aW9uIHNldHVwIGZsYWdzICovCiAJZmxhZ3MgPSAoRlVOQ19GTEdfU1RBVFMgfCBGVU5DX0ZMR19MRUFESU5HIHwgRlVOQ19GTEdfU1BRKTsKIAotCWlmIChDSElQX0lTX0UxeChicCkpCi0JCWZsYWdzIHw9IChicC0+ZmxhZ3MgJiBUUEFfRU5BQkxFX0ZMQUcpID8gRlVOQ19GTEdfVFBBIDogMDsKLQllbHNlCi0JCWZsYWdzIHw9IEZVTkNfRkxHX1RQQTsKLQotCS8qIGZ1bmN0aW9uIHNldHVwICovCi0KLQkvKioKLQkgKiBBbHRob3VnaCBSU1MgaXMgbWVhbmluZ2xlc3Mgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSBIVyBxdWV1ZSB3ZQotCSAqIHN0aWxsIG5lZWQgaXQgZW5hYmxlZCBpbiBvcmRlciB0byBoYXZlIEhXIFJ4IGhhc2ggZ2VuZXJhdGVkLgorCS8qIFRoaXMgZmxhZyBpcyByZWxldmFudCBmb3IgRTF4IG9ubHkuCisJICogRTIgZG9lc24ndCBoYXZlIGEgVFBBIGNvbmZpZ3VyYXRpb24gaW4gYSBmdW5jdGlvbiBsZXZlbC4KIAkgKi8KLQlyc3MuY2FwID0gKFJTU19JUFY0X0NBUCB8IFJTU19JUFY0X1RDUF9DQVAgfAotCQkgICBSU1NfSVBWNl9DQVAgfCBSU1NfSVBWNl9UQ1BfQ0FQKTsKLQlyc3MubW9kZSA9IGJwLT5tdWx0aV9tb2RlOwotCXJzcy5yZXN1bHRfbWFzayA9IE1VTFRJX01BU0s7Ci0JZnVuY19pbml0LnJzcyA9ICZyc3M7CisJZmxhZ3MgfD0gKGJwLT5mbGFncyAmIFRQQV9FTkFCTEVfRkxBRykgPyBGVU5DX0ZMR19UUEEgOiAwOwogCiAJZnVuY19pbml0LmZ1bmNfZmxncyA9IGZsYWdzOwogCWZ1bmNfaW5pdC5wZl9pZCA9IEJQX0ZVTkMoYnApOwogCWZ1bmNfaW5pdC5mdW5jX2lkID0gQlBfRlVOQyhicCk7Ci0JZnVuY19pbml0LmZ3X3N0YXRfbWFwID0gYm54Mnhfc3BfbWFwcGluZyhicCwgZndfc3RhdHMpOwogCWZ1bmNfaW5pdC5zcHFfbWFwID0gYnAtPnNwcV9tYXBwaW5nOwogCWZ1bmNfaW5pdC5zcHFfcHJvZCA9IGJwLT5zcHFfcHJvZF9pZHg7CiAKQEAgLTI1NzksMTEgKzI4NzYsMTEgQEAKIAltZW1zZXQoJihicC0+Y21uZyksIDAsIHNpemVvZihzdHJ1Y3QgY21uZ19zdHJ1Y3RfcGVyX3BvcnQpKTsKIAogCS8qCi0JQ29uZ2VzdGlvbiBtYW5hZ2VtZW50IHZhbHVlcyBkZXBlbmQgb24gdGhlIGxpbmsgcmF0ZQotCVRoZXJlIGlzIG5vIGFjdGl2ZSBsaW5rIHNvIGluaXRpYWwgbGluayByYXRlIGlzIHNldCB0byAxMCBHYnBzLgotCVdoZW4gdGhlIGxpbmsgY29tZXMgdXAgVGhlIGNvbmdlc3Rpb24gbWFuYWdlbWVudCB2YWx1ZXMgYXJlCi0JcmUtY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGFjdHVhbCBsaW5rIHJhdGUuCi0JKi8KKwkgKiBDb25nZXN0aW9uIG1hbmFnZW1lbnQgdmFsdWVzIGRlcGVuZCBvbiB0aGUgbGluayByYXRlCisJICogVGhlcmUgaXMgbm8gYWN0aXZlIGxpbmsgc28gaW5pdGlhbCBsaW5rIHJhdGUgaXMgc2V0IHRvIDEwIEdicHMuCisJICogV2hlbiB0aGUgbGluayBjb21lcyB1cCBUaGUgY29uZ2VzdGlvbiBtYW5hZ2VtZW50IHZhbHVlcyBhcmUKKwkgKiByZS1jYWxjdWxhdGVkIGFjY29yZGluZyB0byB0aGUgYWN0dWFsIGxpbmsgcmF0ZS4KKwkgKi8KIAlicC0+bGlua192YXJzLmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKIAlibngyeF9jbW5nX2Zuc19pbml0KGJwLCB0cnVlLCBibngyeF9nZXRfY21uZ19mbnNfbW9kZShicCkpOwogCkBAIC0yNTkxLDEwICsyODg4LDYgQEAKIAlpZiAoYnAtPnBvcnQucG1mKQogCQlzdG9ybV9tZW1zZXRfY21uZyhicCwgJmJwLT5jbW5nLCBCUF9QT1JUKGJwKSk7CiAKLQkvKiBubyByeCB1bnRpbCBsaW5rIGlzIHVwICovCi0JYnAtPnJ4X21vZGUgPSBCTlgyWF9SWF9NT0RFX05PTkU7Ci0JYm54Mnhfc2V0X3N0b3JtX3J4X21vZGUoYnApOwotCiAJLyogaW5pdCBFdmVudCBRdWV1ZSAqLwogCWVxX2RhdGEuYmFzZV9hZGRyLmhpID0gVTY0X0hJKGJwLT5lcV9tYXBwaW5nKTsKIAllcV9kYXRhLmJhc2VfYWRkci5sbyA9IFU2NF9MTyhicC0+ZXFfbWFwcGluZyk7CkBAIC0yNjA5LDExICsyOTAyLDkgQEAKIHsKIAlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwogCi0JbmV0aWZfdHhfZGlzYWJsZShicC0+ZGV2KTsKKwlibngyeF90eF9kaXNhYmxlKGJwKTsKIAogCVJFR19XUihicCwgTklHX1JFR19MTEgwX0ZVTkNfRU4gKyBwb3J0KjgsIDApOwotCi0JbmV0aWZfY2Fycmllcl9vZmYoYnAtPmRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X2UxaF9lbmFibGUoc3RydWN0IGJueDJ4ICpicCkKQEAgLTI3MDgsMjAgKzI5OTksNjAgQEAKIHsKIAlpbnQgZnVuYyA9IEJQX0ZVTkMoYnApOwogCi0JLyogTWFrZSBzdXJlIHRoYXQgQkQgZGF0YSBpcyB1cGRhdGVkIGJlZm9yZSB3cml0aW5nIHRoZSBwcm9kdWNlciAqLwotCXdtYigpOworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgQkQgZGF0YSBpcyB1cGRhdGVkIGJlZm9yZSB3cml0aW5nIHRoZSBwcm9kdWNlcjoKKwkgKiBCRCBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIG1lbW9yeSwgdGhlIHByb2R1Y2VyIGlzIHJlYWQgZnJvbSB0aGUKKwkgKiBtZW1vcnksIHRodXMgd2UgbmVlZCBhIGZ1bGwgbWVtb3J5IGJhcnJpZXIgdG8gZW5zdXJlIHRoZSBvcmRlcmluZy4KKwkgKi8KKwltYigpOwogCiAJUkVHX1dSMTYoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArIFhTVE9STV9TUFFfUFJPRF9PRkZTRVQoZnVuYyksCiAJCSBicC0+c3BxX3Byb2RfaWR4KTsKIAltbWlvd2IoKTsKIH0KIAotLyogdGhlIHNsb3cgcGF0aCBxdWV1ZSBpcyBvZGQgc2luY2UgY29tcGxldGlvbnMgYXJyaXZlIG9uIHRoZSBmYXN0cGF0aCByaW5nICovCisvKioKKyAqIGJueDJ4X2lzX2NvbnRleHRsZXNzX3JhbXJvZCAtIGNoZWNrIGlmIHRoZSBjdXJyZW50IGNvbW1hbmQgZW5kcyBvbiBFUQorICoKKyAqIEBjbWQ6CWNvbW1hbmQgdG8gY2hlY2sKKyAqIEBjbWRfdHlwZToJY29tbWFuZCB0eXBlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBibngyeF9pc19jb250ZXh0bGVzc19yYW1yb2QoaW50IGNtZCwgaW50IGNtZF90eXBlKQoreworCWlmICgoY21kX3R5cGUgPT0gTk9ORV9DT05ORUNUSU9OX1RZUEUpIHx8CisJICAgIChjbWQgPT0gUkFNUk9EX0NNRF9JRF9FVEhfRk9SV0FSRF9TRVRVUCkgfHwKKwkgICAgKGNtZCA9PSBSQU1ST0RfQ01EX0lEX0VUSF9DTEFTU0lGSUNBVElPTl9SVUxFUykgfHwKKwkgICAgKGNtZCA9PSBSQU1ST0RfQ01EX0lEX0VUSF9GSUxURVJfUlVMRVMpIHx8CisJICAgIChjbWQgPT0gUkFNUk9EX0NNRF9JRF9FVEhfTVVMVElDQVNUX1JVTEVTKSB8fAorCSAgICAoY21kID09IFJBTVJPRF9DTURfSURfRVRIX1NFVF9NQUMpIHx8CisJICAgIChjbWQgPT0gUkFNUk9EX0NNRF9JRF9FVEhfUlNTX1VQREFURSkpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworCit9CisKKworLyoqCisgKiBibngyeF9zcF9wb3N0IC0gcGxhY2UgYSBzaW5nbGUgY29tbWFuZCBvbiBhbiBTUCByaW5nCisgKgorICogQGJwOgkJZHJpdmVyIGhhbmRsZQorICogQGNvbW1hbmQ6CWNvbW1hbmQgdG8gcGxhY2UgKGUuZy4gU0VUVVAsIEZJTFRFUl9SVUxFUywgZXRjLikKKyAqIEBjaWQ6CVNXIENJRCB0aGUgY29tbWFuZCBpcyByZWxhdGVkIHRvCisgKiBAZGF0YV9oaToJY29tbWFuZCBwcml2YXRlIGRhdGEgYWRkcmVzcyAoaGlnaCAzMiBiaXRzKQorICogQGRhdGFfbG86CWNvbW1hbmQgcHJpdmF0ZSBkYXRhIGFkZHJlc3MgKGxvdyAzMiBiaXRzKQorICogQGNtZF90eXBlOgljb21tYW5kIHR5cGUgKGUuZy4gTk9ORSwgRVRIKQorICoKKyAqIFNQIGRhdGEgaXMgaGFuZGxlZCBhcyBpZiBpdCdzIGFsd2F5cyBhbiBhZGRyZXNzIHBhaXIsIHRodXMgZGF0YSBmaWVsZHMgYXJlCisgKiBub3Qgc3dhcHBlZCB0byBsaXR0bGUgZW5kaWFuIGluIHVwcGVyIGZ1bmN0aW9ucy4gSW5zdGVhZCB0aGlzIGZ1bmN0aW9uIHN3YXBzCisgKiBkYXRhIGFzIGlmIGl0J3MgdHdvIHUzMiBmaWVsZHMuCisgKi8KIGludCBibngyeF9zcF9wb3N0KHN0cnVjdCBibngyeCAqYnAsIGludCBjb21tYW5kLCBpbnQgY2lkLAotCQkgIHUzMiBkYXRhX2hpLCB1MzIgZGF0YV9sbywgaW50IGNvbW1vbikKKwkJICB1MzIgZGF0YV9oaSwgdTMyIGRhdGFfbG8sIGludCBjbWRfdHlwZSkKIHsKIAlzdHJ1Y3QgZXRoX3NwZSAqc3BlOwogCXUxNiB0eXBlOworCWJvb2wgY29tbW9uID0gYm54MnhfaXNfY29udGV4dGxlc3NfcmFtcm9kKGNvbW1hbmQsIGNtZF90eXBlKTsKIAogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKIAlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkKQEAgLTI3NTEsMTcgKzMwODIsNyBAQAogCQkJY3B1X3RvX2xlMzIoKGNvbW1hbmQgPDwgU1BFX0hEUl9DTURfSURfU0hJRlQpIHwKIAkJCQkgICAgSFdfQ0lEKGJwLCBjaWQpKTsKIAotCWlmIChjb21tb24pCi0JCS8qIENvbW1vbiByYW1yb2RzOgotCQkgKglGVU5DX1NUQVJULCBGVU5DX1NUT1AsIENGQ19ERUwsIFNUQVRTLCBTRVRfTUFDCi0JCSAqCVRSQUZGSUNfU1RPUCwgVFJBRkZJQ19TVEFSVAotCQkgKi8KLQkJdHlwZSA9IChOT05FX0NPTk5FQ1RJT05fVFlQRSA8PCBTUEVfSERSX0NPTk5fVFlQRV9TSElGVCkKLQkJCSYgU1BFX0hEUl9DT05OX1RZUEU7Ci0JZWxzZQotCQkvKiBFVEggcmFtcm9kczogU0VUVVAsIEhBTFQgKi8KLQkJdHlwZSA9IChFVEhfQ09OTkVDVElPTl9UWVBFIDw8IFNQRV9IRFJfQ09OTl9UWVBFX1NISUZUKQotCQkJJiBTUEVfSERSX0NPTk5fVFlQRTsKKwl0eXBlID0gKGNtZF90eXBlIDw8IFNQRV9IRFJfQ09OTl9UWVBFX1NISUZUKSAmIFNQRV9IRFJfQ09OTl9UWVBFOwogCiAJdHlwZSB8PSAoKEJQX0ZVTkMoYnApIDw8IFNQRV9IRFJfRlVOQ1RJT05fSURfU0hJRlQpICYKIAkJIFNQRV9IRFJfRlVOQ1RJT05fSUQpOwpAQCAtMjc3MSwyNSArMzA5MiwyMyBAQAogCXNwZS0+ZGF0YS51cGRhdGVfZGF0YV9hZGRyLmhpID0gY3B1X3RvX2xlMzIoZGF0YV9oaSk7CiAJc3BlLT5kYXRhLnVwZGF0ZV9kYXRhX2FkZHIubG8gPSBjcHVfdG9fbGUzMihkYXRhX2xvKTsKIAotCS8qIHN0YXRzIHJhbXJvZCBoYXMgaXQncyBvd24gc2xvdCBvbiB0aGUgc3BxICovCi0JaWYgKGNvbW1hbmQgIT0gUkFNUk9EX0NNRF9JRF9DT01NT05fU1RBVF9RVUVSWSkgewotCQkvKiBJdCdzIG9rIGlmIHRoZSBhY3R1YWwgZGVjcmVtZW50IGlzIGlzc3VlZCB0b3dhcmRzIHRoZSBtZW1vcnkKLQkJICogc29tZXdoZXJlIGJldHdlZW4gdGhlIHNwaW5fbG9jayBhbmQgc3Bpbl91bmxvY2suIFRodXMgbm8KLQkJICogbW9yZSBleHBsaWN0IG1lbW9yeSBiYXJyaWVyIGlzIG5lZWRlZC4KLQkJICovCi0JCWlmIChjb21tb24pCi0JCQlhdG9taWNfZGVjKCZicC0+ZXFfc3BxX2xlZnQpOwotCQllbHNlCi0JCQlhdG9taWNfZGVjKCZicC0+Y3Ffc3BxX2xlZnQpOwotCX0KKwkvKgorCSAqIEl0J3Mgb2sgaWYgdGhlIGFjdHVhbCBkZWNyZW1lbnQgaXMgaXNzdWVkIHRvd2FyZHMgdGhlIG1lbW9yeQorCSAqIHNvbWV3aGVyZSBiZXR3ZWVuIHRoZSBzcGluX2xvY2sgYW5kIHNwaW5fdW5sb2NrLiBUaHVzIG5vCisJICogbW9yZSBleHBsaWN0IG1lbW9yeSBiYXJyaWVyIGlzIG5lZWRlZC4KKwkgKi8KKwlpZiAoY29tbW9uKQorCQlhdG9taWNfZGVjKCZicC0+ZXFfc3BxX2xlZnQpOworCWVsc2UKKwkJYXRvbWljX2RlYygmYnAtPmNxX3NwcV9sZWZ0KTsKIAogCiAJRFAoQk5YMlhfTVNHX1NQLypORVRJRl9NU0dfVElNRVIqLywKLQkgICAiU1BRRVsleF0gKCV4OiV4KSAgY29tbWFuZCAlZCAgaHdfY2lkICV4ICBkYXRhICgleDoleCkgIgotCSAgICJ0eXBlKDB4JXgpIGxlZnQgKEVUSCwgQ09NTU9OKSAoJXgsJXgpXG4iLAorCSAgICJTUFFFWyV4XSAoJXg6JXgpICAoY21kLCBjb21tb24/KSAoJWQsJWQpICBod19jaWQgJXggIGRhdGEgKCV4OiV4KSAiCisJICAgInR5cGUoMHgleCkgbGVmdCAoQ1EsIEVRKSAoJXgsJXgpXG4iLAogCSAgIGJwLT5zcHFfcHJvZF9pZHgsICh1MzIpVTY0X0hJKGJwLT5zcHFfbWFwcGluZyksCiAJICAgKHUzMikoVTY0X0xPKGJwLT5zcHFfbWFwcGluZykgKwotCSAgICh2b2lkICopYnAtPnNwcV9wcm9kX2JkIC0gKHZvaWQgKilicC0+c3BxKSwgY29tbWFuZCwKKwkgICAodm9pZCAqKWJwLT5zcHFfcHJvZF9iZCAtICh2b2lkICopYnAtPnNwcSksIGNvbW1hbmQsIGNvbW1vbiwKIAkgICBIV19DSUQoYnAsIGNpZCksIGRhdGFfaGksIGRhdGFfbG8sIHR5cGUsCiAJICAgYXRvbWljX3JlYWQoJmJwLT5jcV9zcHFfbGVmdCksIGF0b21pY19yZWFkKCZicC0+ZXFfc3BxX2xlZnQpKTsKIApAQCAtMjg5Miw5ICszMjExLDE1IEBACiAKIAkJCS8qIHNhdmUgbmlnIGludGVycnVwdCBtYXNrICovCiAJCQluaWdfbWFzayA9IFJFR19SRChicCwgbmlnX2ludF9tYXNrX2FkZHIpOwotCQkJUkVHX1dSKGJwLCBuaWdfaW50X21hc2tfYWRkciwgMCk7CiAKLQkJCWJueDJ4X2xpbmtfYXR0bihicCk7CisJCQkvKiBJZiBuaWdfbWFzayBpcyBub3Qgc2V0LCBubyBuZWVkIHRvIGNhbGwgdGhlIHVwZGF0ZQorCQkJICogZnVuY3Rpb24uCisJCQkgKi8KKwkJCWlmIChuaWdfbWFzaykgeworCQkJCVJFR19XUihicCwgbmlnX2ludF9tYXNrX2FkZHIsIDApOworCisJCQkJYm54MnhfbGlua19hdHRuKGJwKTsKKwkJCX0KIAogCQkJLyogaGFuZGxlIHVuaWNvcmUgYXR0bj8gKi8KIAkJfQpAQCAtMjk5OSw4ICszMzI0LDcgQEAKIAkJYm54MnhfZmFuX2ZhaWx1cmUoYnApOwogCX0KIAotCWlmIChhdHRuICYgKEFFVV9JTlBVVFNfQVRUTl9CSVRTX0dQSU8zX0ZVTkNUSU9OXzAgfAotCQkgICAgQUVVX0lOUFVUU19BVFROX0JJVFNfR1BJTzNfRlVOQ1RJT05fMSkpIHsKKwlpZiAoKGF0dG4gJiBicC0+bGlua192YXJzLmFldV9pbnRfbWFzaykgJiYgYnAtPnBvcnQucG1mKSB7CiAJCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOwogCQlibngyeF9oYW5kbGVfbW9kdWxlX2RldGVjdF9pbnQoJmJwLT5saW5rX3BhcmFtcyk7CiAJCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOwpAQCAtMzA2MywxMyArMzM4NywxMyBAQAogCX0KIAogCWlmIChhdHRuICYgQUVVX0lOUFVUU19BVFROX0JJVFNfUFhQX0hXX0lOVEVSUlVQVCkgewotCiAJCXZhbCA9IFJFR19SRChicCwgUFhQX1JFR19QWFBfSU5UX1NUU19DTFJfMCk7Ci0JCUJOWDJYX0VSUigiUFhQIGh3IGF0dGVudGlvbiAweCV4XG4iLCB2YWwpOworCQlCTlgyWF9FUlIoIlBYUCBodyBhdHRlbnRpb24tMCAweCV4XG4iLCB2YWwpOwogCQkvKiBSUV9VU0RNRFBfRklGT19PVkVSRkxPVyAqLwogCQlpZiAodmFsICYgMHgxODAwMCkKIAkJCUJOWDJYX0VSUigiRkFUQUwgZXJyb3IgZnJvbSBQWFBcbiIpOwotCQlpZiAoQ0hJUF9JU19FMihicCkpIHsKKworCQlpZiAoIUNISVBfSVNfRTF4KGJwKSkgewogCQkJdmFsID0gUkVHX1JEKGJwLCBQWFBfUkVHX1BYUF9JTlRfU1RTX0NMUl8xKTsKIAkJCUJOWDJYX0VSUigiUFhQIGh3IGF0dGVudGlvbi0xIDB4JXhcbiIsIHZhbCk7CiAJCX0KQEAgLTMxMTcsMjAgKzM0NDEsMzEgQEAKIAkJCWlmICgoYnAtPnBvcnQucG1mID09IDApICYmICh2YWwgJiBEUlZfU1RBVFVTX1BNRikpCiAJCQkJYm54MnhfcG1mX3VwZGF0ZShicCk7CiAKLQkJCS8qIEFsd2F5cyBjYWxsIGl0IGhlcmU6IGJueDJ4X2xpbmtfcmVwb3J0KCkgd2lsbAotCQkJICogcHJldmVudCB0aGUgbGluayBpbmRpY2F0aW9uIGR1cGxpY2F0aW9uLgotCQkJICovCi0JCQlibngyeF9fbGlua19zdGF0dXNfdXBkYXRlKGJwKTsKLQogCQkJaWYgKGJwLT5wb3J0LnBtZiAmJgogCQkJICAgICh2YWwgJiBEUlZfU1RBVFVTX0RDQlhfTkVHT1RJQVRJT05fUkVTVUxUUykgJiYKIAkJCQlicC0+ZGNieF9lbmFibGVkID4gMCkKIAkJCQkvKiBzdGFydCBkY2J4IHN0YXRlIG1hY2hpbmUgKi8KIAkJCQlibngyeF9kY2J4X3NldF9wYXJhbXMoYnAsCiAJCQkJCUJOWDJYX0RDQlhfU1RBVEVfTkVHX1JFQ0VJVkVEKTsKKwkJCWlmIChicC0+bGlua192YXJzLnBlcmlvZGljX2ZsYWdzICYKKwkJCSAgICBQRVJJT0RJQ19GTEFHU19MSU5LX0VWRU5UKSB7CisJCQkJLyogIHN5bmMgd2l0aCBsaW5rICovCisJCQkJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7CisJCQkJYnAtPmxpbmtfdmFycy5wZXJpb2RpY19mbGFncyAmPQorCQkJCQl+UEVSSU9ESUNfRkxBR1NfTElOS19FVkVOVDsKKwkJCQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKKwkJCQlpZiAoSVNfTUYoYnApKQorCQkJCQlibngyeF9saW5rX3N5bmNfbm90aWZ5KGJwKTsKKwkJCQlibngyeF9saW5rX3JlcG9ydChicCk7CisJCQl9CisJCQkvKiBBbHdheXMgY2FsbCBpdCBoZXJlOiBibngyeF9saW5rX3JlcG9ydCgpIHdpbGwKKwkJCSAqIHByZXZlbnQgdGhlIGxpbmsgaW5kaWNhdGlvbiBkdXBsaWNhdGlvbi4KKwkJCSAqLworCQkJYm54MnhfX2xpbmtfc3RhdHVzX3VwZGF0ZShicCk7CiAJCX0gZWxzZSBpZiAoYXR0biAmIEJOWDJYX01DX0FTU0VSVF9CSVRTKSB7CiAKIAkJCUJOWDJYX0VSUigiTUMgYXNzZXJ0IVxuIik7CisJCQlibngyeF9tY19hc3NlcnQoYnApOwogCQkJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfR0VORVJBTF9BVFROXzEwLCAwKTsKIAkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl85LCAwKTsKIAkJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl84LCAwKTsKQEAgLTMxNjMsNzIgKzM0OTgsMTg1IEBACiAJfQogfQogCi0jZGVmaW5lIEJOWDJYX01JU0NfR0VOX1JFRyAgICAgIE1JU0NfUkVHX0dFTkVSSUNfUE9SXzEKLSNkZWZpbmUgTE9BRF9DT1VOVEVSX0JJVFMJMTYgLyogTnVtYmVyIG9mIGJpdHMgZm9yIGxvYWQgY291bnRlciAqLwotI2RlZmluZSBMT0FEX0NPVU5URVJfTUFTSwkoKCh1MzIpMHgxIDw8IExPQURfQ09VTlRFUl9CSVRTKSAtIDEpCi0jZGVmaW5lIFJFU0VUX0RPTkVfRkxBR19NQVNLCSh+TE9BRF9DT1VOVEVSX01BU0spCi0jZGVmaW5lIFJFU0VUX0RPTkVfRkxBR19TSElGVAlMT0FEX0NPVU5URVJfQklUUworLyoKKyAqIEJpdHMgbWFwOgorICogMC03ICAgLSBFbmdpbmUwIGxvYWQgY291bnRlci4KKyAqIDgtMTUgIC0gRW5naW5lMSBsb2FkIGNvdW50ZXIuCisgKiAxNiAgICAtIEVuZ2luZTAgUkVTRVRfSU5fUFJPR1JFU1MgYml0LgorICogMTcgICAgLSBFbmdpbmUxIFJFU0VUX0lOX1BST0dSRVNTIGJpdC4KKyAqIDE4ICAgIC0gRW5naW5lMCBPTkVfSVNfTE9BREVELiBTZXQgd2hlbiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGZ1bmN0aW9uCisgKiAgICAgICAgIG9uIHRoZSBlbmdpbmUKKyAqIDE5ICAgIC0gRW5naW5lMSBPTkVfSVNfTE9BREVELgorICogMjAgICAgLSBDaGlwIHJlc2V0IGZsb3cgYml0LiBXaGVuIHNldCBub25lLWxlYWRlciBtdXN0IHdhaXQgZm9yIGJvdGggZW5naW5lcworICogICAgICAgICBsZWFkZXIgdG8gY29tcGxldGUgKGNoZWNrIGZvciBib3RoIFJFU0VUX0lOX1BST0dSRVNTIGJpdHMgYW5kIG5vdCBmb3IKKyAqICAgICAgICAganVzdCB0aGUgb25lIGJlbG9uZ2luZyB0byBpdHMgZW5naW5lKS4KKyAqCisgKi8KKyNkZWZpbmUgQk5YMlhfUkVDT1ZFUllfR0xPQl9SRUcJCU1JU0NfUkVHX0dFTkVSSUNfUE9SXzEKKworI2RlZmluZSBCTlgyWF9QQVRIMF9MT0FEX0NOVF9NQVNLCTB4MDAwMDAwZmYKKyNkZWZpbmUgQk5YMlhfUEFUSDBfTE9BRF9DTlRfU0hJRlQJMAorI2RlZmluZSBCTlgyWF9QQVRIMV9MT0FEX0NOVF9NQVNLCTB4MDAwMGZmMDAKKyNkZWZpbmUgQk5YMlhfUEFUSDFfTE9BRF9DTlRfU0hJRlQJOAorI2RlZmluZSBCTlgyWF9QQVRIMF9SU1RfSU5fUFJPR19CSVQJMHgwMDAxMDAwMAorI2RlZmluZSBCTlgyWF9QQVRIMV9SU1RfSU5fUFJPR19CSVQJMHgwMDAyMDAwMAorI2RlZmluZSBCTlgyWF9HTE9CQUxfUkVTRVRfQklUCQkweDAwMDQwMDAwCiAKIC8qCisgKiBTZXQgdGhlIEdMT0JBTF9SRVNFVCBiaXQuCisgKgorICogU2hvdWxkIGJlIHJ1biB1bmRlciBydG5sIGxvY2sKKyAqLwordm9pZCBibngyeF9zZXRfcmVzZXRfZ2xvYmFsKHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHZhbAk9IFJFR19SRChicCwgQk5YMlhfUkVDT1ZFUllfR0xPQl9SRUcpOworCisJUkVHX1dSKGJwLCBCTlgyWF9SRUNPVkVSWV9HTE9CX1JFRywgdmFsIHwgQk5YMlhfR0xPQkFMX1JFU0VUX0JJVCk7CisJYmFycmllcigpOworCW1taW93YigpOworfQorCisvKgorICogQ2xlYXIgdGhlIEdMT0JBTF9SRVNFVCBiaXQuCisgKgorICogU2hvdWxkIGJlIHJ1biB1bmRlciBydG5sIGxvY2sKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2NsZWFyX3Jlc2V0X2dsb2JhbChzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWwJPSBSRUdfUkQoYnAsIEJOWDJYX1JFQ09WRVJZX0dMT0JfUkVHKTsKKworCVJFR19XUihicCwgQk5YMlhfUkVDT1ZFUllfR0xPQl9SRUcsIHZhbCAmICh+Qk5YMlhfR0xPQkFMX1JFU0VUX0JJVCkpOworCWJhcnJpZXIoKTsKKwltbWlvd2IoKTsKK30KKworLyoKKyAqIENoZWNrcyB0aGUgR0xPQkFMX1JFU0VUIGJpdC4KKyAqCiAgKiBzaG91bGQgYmUgcnVuIHVuZGVyIHJ0bmwgbG9jawogICovCitzdGF0aWMgaW5saW5lIGJvb2wgYm54MnhfcmVzZXRfaXNfZ2xvYmFsKHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHZhbAk9IFJFR19SRChicCwgQk5YMlhfUkVDT1ZFUllfR0xPQl9SRUcpOworCisJRFAoTkVUSUZfTVNHX0hXLCAiR0VOX1JFR19WQUw9MHglMDh4XG4iLCB2YWwpOworCXJldHVybiAodmFsICYgQk5YMlhfR0xPQkFMX1JFU0VUX0JJVCkgPyB0cnVlIDogZmFsc2U7Cit9CisKKy8qCisgKiBDbGVhciBSRVNFVF9JTl9QUk9HUkVTUyBiaXQgZm9yIHRoZSBjdXJyZW50IGVuZ2luZS4KKyAqCisgKiBTaG91bGQgYmUgcnVuIHVuZGVyIHJ0bmwgbG9jaworICovCiBzdGF0aWMgaW5saW5lIHZvaWQgYm54Mnhfc2V0X3Jlc2V0X2RvbmUoc3RydWN0IGJueDJ4ICpicCkKIHsKLQl1MzIgdmFsCT0gUkVHX1JEKGJwLCBCTlgyWF9NSVNDX0dFTl9SRUcpOwotCXZhbCAmPSB+KDEgPDwgUkVTRVRfRE9ORV9GTEFHX1NISUZUKTsKLQlSRUdfV1IoYnAsIEJOWDJYX01JU0NfR0VOX1JFRywgdmFsKTsKKwl1MzIgdmFsCT0gUkVHX1JEKGJwLCBCTlgyWF9SRUNPVkVSWV9HTE9CX1JFRyk7CisJdTMyIGJpdCA9IEJQX1BBVEgoYnApID8KKwkJQk5YMlhfUEFUSDFfUlNUX0lOX1BST0dfQklUIDogQk5YMlhfUEFUSDBfUlNUX0lOX1BST0dfQklUOworCisJLyogQ2xlYXIgdGhlIGJpdCAqLworCXZhbCAmPSB+Yml0OworCVJFR19XUihicCwgQk5YMlhfUkVDT1ZFUllfR0xPQl9SRUcsIHZhbCk7CiAJYmFycmllcigpOwogCW1taW93YigpOwogfQogCiAvKgorICogU2V0IFJFU0VUX0lOX1BST0dSRVNTIGZvciB0aGUgY3VycmVudCBlbmdpbmUuCisgKgogICogc2hvdWxkIGJlIHJ1biB1bmRlciBydG5sIGxvY2sKICAqLwotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3NldF9yZXNldF9pbl9wcm9ncmVzcyhzdHJ1Y3QgYm54MnggKmJwKQordm9pZCBibngyeF9zZXRfcmVzZXRfaW5fcHJvZ3Jlc3Moc3RydWN0IGJueDJ4ICpicCkKIHsKLQl1MzIgdmFsCT0gUkVHX1JEKGJwLCBCTlgyWF9NSVNDX0dFTl9SRUcpOwotCXZhbCB8PSAoMSA8PCAxNik7Ci0JUkVHX1dSKGJwLCBCTlgyWF9NSVNDX0dFTl9SRUcsIHZhbCk7CisJdTMyIHZhbAk9IFJFR19SRChicCwgQk5YMlhfUkVDT1ZFUllfR0xPQl9SRUcpOworCXUzMiBiaXQgPSBCUF9QQVRIKGJwKSA/CisJCUJOWDJYX1BBVEgxX1JTVF9JTl9QUk9HX0JJVCA6IEJOWDJYX1BBVEgwX1JTVF9JTl9QUk9HX0JJVDsKKworCS8qIFNldCB0aGUgYml0ICovCisJdmFsIHw9IGJpdDsKKwlSRUdfV1IoYnAsIEJOWDJYX1JFQ09WRVJZX0dMT0JfUkVHLCB2YWwpOwogCWJhcnJpZXIoKTsKIAltbWlvd2IoKTsKIH0KIAogLyoKKyAqIENoZWNrcyB0aGUgUkVTRVRfSU5fUFJPR1JFU1MgYml0IGZvciB0aGUgZ2l2ZW4gZW5naW5lLgogICogc2hvdWxkIGJlIHJ1biB1bmRlciBydG5sIGxvY2sKICAqLwotYm9vbCBibngyeF9yZXNldF9pc19kb25lKHN0cnVjdCBibngyeCAqYnApCitib29sIGJueDJ4X3Jlc2V0X2lzX2RvbmUoc3RydWN0IGJueDJ4ICpicCwgaW50IGVuZ2luZSkKIHsKLQl1MzIgdmFsCT0gUkVHX1JEKGJwLCBCTlgyWF9NSVNDX0dFTl9SRUcpOwotCURQKE5FVElGX01TR19IVywgIkdFTl9SRUdfVkFMPTB4JTA4eFxuIiwgdmFsKTsKLQlyZXR1cm4gKHZhbCAmIFJFU0VUX0RPTkVfRkxBR19NQVNLKSA/IGZhbHNlIDogdHJ1ZTsKKwl1MzIgdmFsCT0gUkVHX1JEKGJwLCBCTlgyWF9SRUNPVkVSWV9HTE9CX1JFRyk7CisJdTMyIGJpdCA9IGVuZ2luZSA/CisJCUJOWDJYX1BBVEgxX1JTVF9JTl9QUk9HX0JJVCA6IEJOWDJYX1BBVEgwX1JTVF9JTl9QUk9HX0JJVDsKKworCS8qIHJldHVybiBmYWxzZSBpZiBiaXQgaXMgc2V0ICovCisJcmV0dXJuICh2YWwgJiBiaXQpID8gZmFsc2UgOiB0cnVlOwogfQogCiAvKgorICogSW5jcmVtZW50IHRoZSBsb2FkIGNvdW50ZXIgZm9yIHRoZSBjdXJyZW50IGVuZ2luZS4KKyAqCiAgKiBzaG91bGQgYmUgcnVuIHVuZGVyIHJ0bmwgbG9jawogICovCi1pbmxpbmUgdm9pZCBibngyeF9pbmNfbG9hZF9jbnQoc3RydWN0IGJueDJ4ICpicCkKK3ZvaWQgYm54MnhfaW5jX2xvYWRfY250KHN0cnVjdCBibngyeCAqYnApCiB7Ci0JdTMyIHZhbDEsIHZhbCA9IFJFR19SRChicCwgQk5YMlhfTUlTQ19HRU5fUkVHKTsKKwl1MzIgdmFsMSwgdmFsID0gUkVHX1JEKGJwLCBCTlgyWF9SRUNPVkVSWV9HTE9CX1JFRyk7CisJdTMyIG1hc2sgPSBCUF9QQVRIKGJwKSA/IEJOWDJYX1BBVEgxX0xPQURfQ05UX01BU0sgOgorCQkJICAgICBCTlgyWF9QQVRIMF9MT0FEX0NOVF9NQVNLOworCXUzMiBzaGlmdCA9IEJQX1BBVEgoYnApID8gQk5YMlhfUEFUSDFfTE9BRF9DTlRfU0hJRlQgOgorCQkJICAgICBCTlgyWF9QQVRIMF9MT0FEX0NOVF9TSElGVDsKIAogCURQKE5FVElGX01TR19IVywgIk9sZCBHRU5fUkVHX1ZBTD0weCUwOHhcbiIsIHZhbCk7CiAKLQl2YWwxID0gKCh2YWwgJiBMT0FEX0NPVU5URVJfTUFTSykgKyAxKSAmIExPQURfQ09VTlRFUl9NQVNLOwotCVJFR19XUihicCwgQk5YMlhfTUlTQ19HRU5fUkVHLCAodmFsICYgUkVTRVRfRE9ORV9GTEFHX01BU0spIHwgdmFsMSk7CisJLyogZ2V0IHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUgKi8KKwl2YWwxID0gKHZhbCAmIG1hc2spID4+IHNoaWZ0OworCisJLyogaW5jcmVtZW50Li4uICovCisJdmFsMSsrOworCisJLyogY2xlYXIgdGhlIG9sZCB2YWx1ZSAqLworCXZhbCAmPSB+bWFzazsKKworCS8qIHNldCB0aGUgbmV3IG9uZSAqLworCXZhbCB8PSAoKHZhbDEgPDwgc2hpZnQpICYgbWFzayk7CisKKwlSRUdfV1IoYnAsIEJOWDJYX1JFQ09WRVJZX0dMT0JfUkVHLCB2YWwpOwogCWJhcnJpZXIoKTsKIAltbWlvd2IoKTsKIH0KIAotLyoKLSAqIHNob3VsZCBiZSBydW4gdW5kZXIgcnRubCBsb2NrCisvKioKKyAqIGJueDJ4X2RlY19sb2FkX2NudCAtIGRlY3JlbWVudCB0aGUgbG9hZCBjb3VudGVyCisgKgorICogQGJwOgkJZHJpdmVyIGhhbmRsZQorICoKKyAqIFNob3VsZCBiZSBydW4gdW5kZXIgcnRubCBsb2NrLgorICogRGVjcmVtZW50cyB0aGUgbG9hZCBjb3VudGVyIGZvciB0aGUgY3VycmVudCBlbmdpbmUuIFJldHVybnMKKyAqIHRoZSBuZXcgY291bnRlciB2YWx1ZS4KICAqLwogdTMyIGJueDJ4X2RlY19sb2FkX2NudChzdHJ1Y3QgYm54MnggKmJwKQogewotCXUzMiB2YWwxLCB2YWwgPSBSRUdfUkQoYnAsIEJOWDJYX01JU0NfR0VOX1JFRyk7CisJdTMyIHZhbDEsIHZhbCA9IFJFR19SRChicCwgQk5YMlhfUkVDT1ZFUllfR0xPQl9SRUcpOworCXUzMiBtYXNrID0gQlBfUEFUSChicCkgPyBCTlgyWF9QQVRIMV9MT0FEX0NOVF9NQVNLIDoKKwkJCSAgICAgQk5YMlhfUEFUSDBfTE9BRF9DTlRfTUFTSzsKKwl1MzIgc2hpZnQgPSBCUF9QQVRIKGJwKSA/IEJOWDJYX1BBVEgxX0xPQURfQ05UX1NISUZUIDoKKwkJCSAgICAgQk5YMlhfUEFUSDBfTE9BRF9DTlRfU0hJRlQ7CiAKIAlEUChORVRJRl9NU0dfSFcsICJPbGQgR0VOX1JFR19WQUw9MHglMDh4XG4iLCB2YWwpOwogCi0JdmFsMSA9ICgodmFsICYgTE9BRF9DT1VOVEVSX01BU0spIC0gMSkgJiBMT0FEX0NPVU5URVJfTUFTSzsKLQlSRUdfV1IoYnAsIEJOWDJYX01JU0NfR0VOX1JFRywgKHZhbCAmIFJFU0VUX0RPTkVfRkxBR19NQVNLKSB8IHZhbDEpOworCS8qIGdldCB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlICovCisJdmFsMSA9ICh2YWwgJiBtYXNrKSA+PiBzaGlmdDsKKworCS8qIGRlY3JlbWVudC4uLiAqLworCXZhbDEtLTsKKworCS8qIGNsZWFyIHRoZSBvbGQgdmFsdWUgKi8KKwl2YWwgJj0gfm1hc2s7CisKKwkvKiBzZXQgdGhlIG5ldyBvbmUgKi8KKwl2YWwgfD0gKCh2YWwxIDw8IHNoaWZ0KSAmIG1hc2spOworCisJUkVHX1dSKGJwLCBCTlgyWF9SRUNPVkVSWV9HTE9CX1JFRywgdmFsKTsKIAliYXJyaWVyKCk7CiAJbW1pb3diKCk7CiAKQEAgLTMyMzYsMTcgKzM2ODQsMzkgQEAKIH0KIAogLyoKKyAqIFJlYWQgdGhlIGxvYWQgY291bnRlciBmb3IgdGhlIGN1cnJlbnQgZW5naW5lLgorICoKICAqIHNob3VsZCBiZSBydW4gdW5kZXIgcnRubCBsb2NrCiAgKi8KLXN0YXRpYyBpbmxpbmUgdTMyIGJueDJ4X2dldF9sb2FkX2NudChzdHJ1Y3QgYm54MnggKmJwKQorc3RhdGljIGlubGluZSB1MzIgYm54MnhfZ2V0X2xvYWRfY250KHN0cnVjdCBibngyeCAqYnAsIGludCBlbmdpbmUpCiB7Ci0JcmV0dXJuIFJFR19SRChicCwgQk5YMlhfTUlTQ19HRU5fUkVHKSAmIExPQURfQ09VTlRFUl9NQVNLOworCXUzMiBtYXNrID0gKGVuZ2luZSA/IEJOWDJYX1BBVEgxX0xPQURfQ05UX01BU0sgOgorCQkJICAgICBCTlgyWF9QQVRIMF9MT0FEX0NOVF9NQVNLKTsKKwl1MzIgc2hpZnQgPSAoZW5naW5lID8gQk5YMlhfUEFUSDFfTE9BRF9DTlRfU0hJRlQgOgorCQkJICAgICBCTlgyWF9QQVRIMF9MT0FEX0NOVF9TSElGVCk7CisJdTMyIHZhbCA9IFJFR19SRChicCwgQk5YMlhfUkVDT1ZFUllfR0xPQl9SRUcpOworCisJRFAoTkVUSUZfTVNHX0hXLCAiR0xPQl9SRUc9MHglMDh4XG4iLCB2YWwpOworCisJdmFsID0gKHZhbCAmIG1hc2spID4+IHNoaWZ0OworCisJRFAoTkVUSUZfTVNHX0hXLCAibG9hZF9jbnQgZm9yIGVuZ2luZSAlZCA9ICVkXG4iLCBlbmdpbmUsIHZhbCk7CisKKwlyZXR1cm4gdmFsOwogfQogCisvKgorICogUmVzZXQgdGhlIGxvYWQgY291bnRlciBmb3IgdGhlIGN1cnJlbnQgZW5naW5lLgorICoKKyAqIHNob3VsZCBiZSBydW4gdW5kZXIgcnRubCBsb2NrCisgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9jbGVhcl9sb2FkX2NudChzdHJ1Y3QgYm54MnggKmJwKQogewotCXUzMiB2YWwgPSBSRUdfUkQoYnAsIEJOWDJYX01JU0NfR0VOX1JFRyk7Ci0JUkVHX1dSKGJwLCBCTlgyWF9NSVNDX0dFTl9SRUcsIHZhbCAmICh+TE9BRF9DT1VOVEVSX01BU0spKTsKKwl1MzIgdmFsID0gUkVHX1JEKGJwLCBCTlgyWF9SRUNPVkVSWV9HTE9CX1JFRyk7CisJdTMyIG1hc2sgPSAoQlBfUEFUSChicCkgPyBCTlgyWF9QQVRIMV9MT0FEX0NOVF9NQVNLIDoKKwkJCSAgICAgQk5YMlhfUEFUSDBfTE9BRF9DTlRfTUFTSyk7CisKKwlSRUdfV1IoYnAsIEJOWDJYX1JFQ09WRVJZX0dMT0JfUkVHLCB2YWwgJiAofm1hc2spKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9wcmludF9uZXh0X2Jsb2NrKGludCBpZHgsIGNvbnN0IGNoYXIgKmJsaykKQEAgLTMyNTYsNyArMzcyNiw4IEBACiAJcHJfY29udCgiJXMiLCBibGspOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBibngyeF9wcmludF9ibG9ja3Nfd2l0aF9wYXJpdHkwKHUzMiBzaWcsIGludCBwYXJfbnVtKQorc3RhdGljIGlubGluZSBpbnQgYm54MnhfY2hlY2tfYmxvY2tzX3dpdGhfcGFyaXR5MCh1MzIgc2lnLCBpbnQgcGFyX251bSwKKwkJCQkJCSAgYm9vbCBwcmludCkKIHsKIAlpbnQgaSA9IDA7CiAJdTMyIGN1cl9iaXQgPSAwOwpAQCAtMzI2NSwxOSArMzczNiwzMyBAQAogCQlpZiAoc2lnICYgY3VyX2JpdCkgewogCQkJc3dpdGNoIChjdXJfYml0KSB7CiAJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0JSQl9QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiQlJCIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJCUkIiKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfUEFSU0VSX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJQQVJTRVIiKTsKKwkJCQlpZiAocHJpbnQpCisJCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlBBUlNFUiIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19UU0RNX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJUU0RNIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJUU0RNIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1NFQVJDSEVSX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJTRUFSQ0hFUiIpOworCQkJCWlmIChwcmludCkKKwkJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLAorCQkJCQkJCSAgIlNFQVJDSEVSIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RDTV9QQVJJVFlfRVJST1I6CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJUQ00iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNFTUlfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlRTRU1JIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJUU0VNSSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19QQkNMSUVOVF9QQVJJVFlfRVJST1I6CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJYUEIiKTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtMzI4OSw3ICszNzc0LDggQEAKIAlyZXR1cm4gcGFyX251bTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYm54MnhfcHJpbnRfYmxvY2tzX3dpdGhfcGFyaXR5MSh1MzIgc2lnLCBpbnQgcGFyX251bSkKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2NoZWNrX2Jsb2Nrc193aXRoX3Bhcml0eTEodTMyIHNpZywgaW50IHBhcl9udW0sCisJCQkJCQkgIGJvb2wgKmdsb2JhbCwgYm9vbCBwcmludCkKIHsKIAlpbnQgaSA9IDA7CiAJdTMyIGN1cl9iaXQgPSAwOwpAQCAtMzI5NywzOCArMzc4Myw3MiBAQAogCQljdXJfYml0ID0gKCh1MzIpMHgxIDw8IGkpOwogCQlpZiAoc2lnICYgY3VyX2JpdCkgewogCQkJc3dpdGNoIChjdXJfYml0KSB7Ci0JCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BCQ0xJRU5UX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJQQkNMSUVOVCIpOworCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19QQkZfUEFSSVRZX0VSUk9SOgorCQkJCWlmIChwcmludCkKKwkJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiUEJGIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1FNX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJRTSIpOworCQkJCWlmIChwcmludCkKKwkJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiUU0iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfVElNRVJTX1BBUklUWV9FUlJPUjoKKwkJCQlpZiAocHJpbnQpCisJCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlRNIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1hTRE1fUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlhTRE0iKTsKKwkJCQlpZiAocHJpbnQpCisJCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlhTRE0iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfWENNX1BBUklUWV9FUlJPUjoKKwkJCQlpZiAocHJpbnQpCisJCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlhDTSIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19YU0VNSV9QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiWFNFTUkiKTsKKwkJCQlpZiAocHJpbnQpCisJCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlhTRU1JIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0RPT1JCRUxMUV9QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiRE9PUkJFTExRIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssCisJCQkJCQkJICAiRE9PUkJFTExRIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX05JR19QQVJJVFlfRVJST1I6CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJOSUciKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfVkFVWF9QQ0lfQ09SRV9QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiVkFVWCBQQ0kgQ09SRSIpOworCQkJCWlmIChwcmludCkKKwkJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLAorCQkJCQkJCSAgIlZBVVggUENJIENPUkUiKTsKKwkJCQkqZ2xvYmFsID0gdHJ1ZTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfREVCVUdfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIkRFQlVHIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJERUJVRyIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VU0RNX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJVU0RNIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJVU0RNIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VDTV9QQVJJVFlfRVJST1I6CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJVQ00iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfVVNFTUlfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlVTRU1JIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJVU0VNSSIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VUEJfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlVQQiIpOworCQkJCWlmIChwcmludCkKKwkJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiVVBCIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRE1fUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIkNTRE0iKTsKKwkJCQlpZiAocHJpbnQpCisJCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIkNTRE0iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0NNX1BBUklUWV9FUlJPUjoKKwkJCQlpZiAocHJpbnQpCisJCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIkNDTSIpOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC0zMzQwLDcgKzM4NjAsOCBAQAogCXJldHVybiBwYXJfbnVtOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBibngyeF9wcmludF9ibG9ja3Nfd2l0aF9wYXJpdHkyKHUzMiBzaWcsIGludCBwYXJfbnVtKQorc3RhdGljIGlubGluZSBpbnQgYm54MnhfY2hlY2tfYmxvY2tzX3dpdGhfcGFyaXR5Mih1MzIgc2lnLCBpbnQgcGFyX251bSwKKwkJCQkJCSAgYm9vbCBwcmludCkKIHsKIAlpbnQgaSA9IDA7CiAJdTMyIGN1cl9iaXQgPSAwOwpAQCAtMzM0OSwyNiArMzg3MCwzNyBAQAogCQlpZiAoc2lnICYgY3VyX2JpdCkgewogCQkJc3dpdGNoIChjdXJfYml0KSB7CiAJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRU1JX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJDU0VNSSIpOworCQkJCWlmIChwcmludCkKKwkJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiQ1NFTUkiKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfUFhQX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJQWFAiKTsKKwkJCQlpZiAocHJpbnQpCisJCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlBYUCIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBRVVfSU5fQVRUTl9CSVRTX1BYUFBDSUNMT0NLQ0xJRU5UX1BBUklUWV9FUlJPUjoKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssCisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssCiAJCQkJCSJQWFBQQ0lDTE9DS0NMSUVOVCIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DRkNfUEFSSVRZX0VSUk9SOgotCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIkNGQyIpOworCQkJCWlmIChwcmludCkKKwkJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiQ0ZDIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NEVV9QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiQ0RVIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJDRFUiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfRE1BRV9QQVJJVFlfRVJST1I6CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJETUFFIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0lHVV9QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiSUdVIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJJR1UiKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfTUlTQ19QQVJJVFlfRVJST1I6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiTUlTQyIpOworCQkJCWlmIChwcmludCkKKwkJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiTUlTQyIpOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC0zMzgwLDcgKzM5MTIsOCBAQAogCXJldHVybiBwYXJfbnVtOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBibngyeF9wcmludF9ibG9ja3Nfd2l0aF9wYXJpdHkzKHUzMiBzaWcsIGludCBwYXJfbnVtKQorc3RhdGljIGlubGluZSBpbnQgYm54MnhfY2hlY2tfYmxvY2tzX3dpdGhfcGFyaXR5Myh1MzIgc2lnLCBpbnQgcGFyX251bSwKKwkJCQkJCSAgYm9vbCAqZ2xvYmFsLCBib29sIHByaW50KQogewogCWludCBpID0gMDsKIAl1MzIgY3VyX2JpdCA9IDA7CkBAIC0zMzg5LDE2ICszOTIyLDI3IEBACiAJCWlmIChzaWcgJiBjdXJfYml0KSB7CiAJCQlzd2l0Y2ggKGN1cl9iaXQpIHsKIAkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfTUNQX0xBVENIRURfUk9NX1BBUklUWToKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJNQ1AgUk9NIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJNQ1AgUk9NIik7CisJCQkJKmdsb2JhbCA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX01DUF9MQVRDSEVEX1VNUF9SWF9QQVJJVFk6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiTUNQIFVNUCBSWCIpOworCQkJCWlmIChwcmludCkKKwkJCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLAorCQkJCQkJCSAgIk1DUCBVTVAgUlgiKTsKKwkJCQkqZ2xvYmFsID0gdHJ1ZTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfTUNQX0xBVENIRURfVU1QX1RYX1BBUklUWToKLQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssICJNQ1AgVU1QIFRYIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssCisJCQkJCQkJICAiTUNQIFVNUCBUWCIpOworCQkJCSpnbG9iYWwgPSB0cnVlOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9TQ1BBRF9QQVJJVFk6Ci0JCQkJX3ByaW50X25leHRfYmxvY2socGFyX251bSsrLCAiTUNQIFNDUEFEIik7CisJCQkJaWYgKHByaW50KQorCQkJCQlfcHJpbnRfbmV4dF9ibG9jayhwYXJfbnVtKyssCisJCQkJCQkJICAiTUNQIFNDUEFEIik7CisJCQkJKmdsb2JhbCA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTM0MTAsMzggKzM5NTQsODIgQEAKIAlyZXR1cm4gcGFyX251bTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGJueDJ4X3Bhcml0eV9hdHRuKHN0cnVjdCBibngyeCAqYnAsIHUzMiBzaWcwLCB1MzIgc2lnMSwKLQkJCQkgICAgIHUzMiBzaWcyLCB1MzIgc2lnMykKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2NoZWNrX2Jsb2Nrc193aXRoX3Bhcml0eTQodTMyIHNpZywgaW50IHBhcl9udW0sCisJCQkJCQkgIGJvb2wgcHJpbnQpCiB7Ci0JaWYgKChzaWcwICYgSFdfUFJUWV9BU1NFUlRfU0VUXzApIHx8IChzaWcxICYgSFdfUFJUWV9BU1NFUlRfU0VUXzEpIHx8Ci0JICAgIChzaWcyICYgSFdfUFJUWV9BU1NFUlRfU0VUXzIpIHx8IChzaWczICYgSFdfUFJUWV9BU1NFUlRfU0VUXzMpKSB7CisJaW50IGkgPSAwOworCXUzMiBjdXJfYml0ID0gMDsKKwlmb3IgKGkgPSAwOyBzaWc7IGkrKykgeworCQljdXJfYml0ID0gKCh1MzIpMHgxIDw8IGkpOworCQlpZiAoc2lnICYgY3VyX2JpdCkgeworCQkJc3dpdGNoIChjdXJfYml0KSB7CisJCQljYXNlIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BHTFVFX1BBUklUWV9FUlJPUjoKKwkJCQlpZiAocHJpbnQpCisJCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIlBHTFVFX0IiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUVVX0lOUFVUU19BVFROX0JJVFNfQVRDX1BBUklUWV9FUlJPUjoKKwkJCQlpZiAocHJpbnQpCisJCQkJCV9wcmludF9uZXh0X2Jsb2NrKHBhcl9udW0rKywgIkFUQyIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBDbGVhciB0aGUgYml0ICovCisJCQlzaWcgJj0gfmN1cl9iaXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcGFyX251bTsKK30KKworc3RhdGljIGlubGluZSBib29sIGJueDJ4X3Bhcml0eV9hdHRuKHN0cnVjdCBibngyeCAqYnAsIGJvb2wgKmdsb2JhbCwgYm9vbCBwcmludCwKKwkJCQkgICAgIHUzMiAqc2lnKQoreworCWlmICgoc2lnWzBdICYgSFdfUFJUWV9BU1NFUlRfU0VUXzApIHx8CisJICAgIChzaWdbMV0gJiBIV19QUlRZX0FTU0VSVF9TRVRfMSkgfHwKKwkgICAgKHNpZ1syXSAmIEhXX1BSVFlfQVNTRVJUX1NFVF8yKSB8fAorCSAgICAoc2lnWzNdICYgSFdfUFJUWV9BU1NFUlRfU0VUXzMpIHx8CisJICAgIChzaWdbNF0gJiBIV19QUlRZX0FTU0VSVF9TRVRfNCkpIHsKIAkJaW50IHBhcl9udW0gPSAwOwogCQlEUChORVRJRl9NU0dfSFcsICJXYXMgcGFyaXR5IGVycm9yOiBIVyBibG9jayBwYXJpdHkgYXR0ZW50aW9uOiAiCi0JCQkiWzBdOjB4JTA4eCBbMV06MHglMDh4ICIKLQkJCSJbMl06MHglMDh4IFszXToweCUwOHhcbiIsCi0JCQkgIHNpZzAgJiBIV19QUlRZX0FTU0VSVF9TRVRfMCwKLQkJCSAgc2lnMSAmIEhXX1BSVFlfQVNTRVJUX1NFVF8xLAotCQkJICBzaWcyICYgSFdfUFJUWV9BU1NFUlRfU0VUXzIsCi0JCQkgIHNpZzMgJiBIV19QUlRZX0FTU0VSVF9TRVRfMyk7Ci0JCXByaW50ayhLRVJOX0VSUiIlczogUGFyaXR5IGVycm9ycyBkZXRlY3RlZCBpbiBibG9ja3M6ICIsCi0JCSAgICAgICBicC0+ZGV2LT5uYW1lKTsKLQkJcGFyX251bSA9IGJueDJ4X3ByaW50X2Jsb2Nrc193aXRoX3Bhcml0eTAoCi0JCQlzaWcwICYgSFdfUFJUWV9BU1NFUlRfU0VUXzAsIHBhcl9udW0pOwotCQlwYXJfbnVtID0gYm54MnhfcHJpbnRfYmxvY2tzX3dpdGhfcGFyaXR5MSgKLQkJCXNpZzEgJiBIV19QUlRZX0FTU0VSVF9TRVRfMSwgcGFyX251bSk7Ci0JCXBhcl9udW0gPSBibngyeF9wcmludF9ibG9ja3Nfd2l0aF9wYXJpdHkyKAotCQkJc2lnMiAmIEhXX1BSVFlfQVNTRVJUX1NFVF8yLCBwYXJfbnVtKTsKLQkJcGFyX251bSA9IGJueDJ4X3ByaW50X2Jsb2Nrc193aXRoX3Bhcml0eTMoCi0JCQlzaWczICYgSFdfUFJUWV9BU1NFUlRfU0VUXzMsIHBhcl9udW0pOwotCQlwcmludGsoIlxuIik7CisJCQkiWzBdOjB4JTA4eCBbMV06MHglMDh4IFsyXToweCUwOHggWzNdOjB4JTA4eCAiCisJCQkiWzRdOjB4JTA4eFxuIiwKKwkJCSAgc2lnWzBdICYgSFdfUFJUWV9BU1NFUlRfU0VUXzAsCisJCQkgIHNpZ1sxXSAmIEhXX1BSVFlfQVNTRVJUX1NFVF8xLAorCQkJICBzaWdbMl0gJiBIV19QUlRZX0FTU0VSVF9TRVRfMiwKKwkJCSAgc2lnWzNdICYgSFdfUFJUWV9BU1NFUlRfU0VUXzMsCisJCQkgIHNpZ1s0XSAmIEhXX1BSVFlfQVNTRVJUX1NFVF80KTsKKwkJaWYgKHByaW50KQorCQkJbmV0ZGV2X2VycihicC0+ZGV2LAorCQkJCSAgICJQYXJpdHkgZXJyb3JzIGRldGVjdGVkIGluIGJsb2NrczogIik7CisJCXBhcl9udW0gPSBibngyeF9jaGVja19ibG9ja3Nfd2l0aF9wYXJpdHkwKAorCQkJc2lnWzBdICYgSFdfUFJUWV9BU1NFUlRfU0VUXzAsIHBhcl9udW0sIHByaW50KTsKKwkJcGFyX251bSA9IGJueDJ4X2NoZWNrX2Jsb2Nrc193aXRoX3Bhcml0eTEoCisJCQlzaWdbMV0gJiBIV19QUlRZX0FTU0VSVF9TRVRfMSwgcGFyX251bSwgZ2xvYmFsLCBwcmludCk7CisJCXBhcl9udW0gPSBibngyeF9jaGVja19ibG9ja3Nfd2l0aF9wYXJpdHkyKAorCQkJc2lnWzJdICYgSFdfUFJUWV9BU1NFUlRfU0VUXzIsIHBhcl9udW0sIHByaW50KTsKKwkJcGFyX251bSA9IGJueDJ4X2NoZWNrX2Jsb2Nrc193aXRoX3Bhcml0eTMoCisJCQlzaWdbM10gJiBIV19QUlRZX0FTU0VSVF9TRVRfMywgcGFyX251bSwgZ2xvYmFsLCBwcmludCk7CisJCXBhcl9udW0gPSBibngyeF9jaGVja19ibG9ja3Nfd2l0aF9wYXJpdHk0KAorCQkJc2lnWzRdICYgSFdfUFJUWV9BU1NFUlRfU0VUXzQsIHBhcl9udW0sIHByaW50KTsKKworCQlpZiAocHJpbnQpCisJCQlwcl9jb250KCJcbiIpOworCiAJCXJldHVybiB0cnVlOwogCX0gZWxzZQogCQlyZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgYm54MnhfY2hrX3Bhcml0eV9hdHRuKHN0cnVjdCBibngyeCAqYnApCisvKioKKyAqIGJueDJ4X2Noa19wYXJpdHlfYXR0biAtIGNoZWNrcyBmb3IgcGFyaXR5IGF0dGVudGlvbnMuCisgKgorICogQGJwOgkJZHJpdmVyIGhhbmRsZQorICogQGdsb2JhbDoJdHJ1ZSBpZiB0aGVyZSB3YXMgYSBnbG9iYWwgYXR0ZW50aW9uCisgKiBAcHJpbnQ6CXNob3cgcGFyaXR5IGF0dGVudGlvbiBpbiBzeXNsb2cKKyAqLworYm9vbCBibngyeF9jaGtfcGFyaXR5X2F0dG4oc3RydWN0IGJueDJ4ICpicCwgYm9vbCAqZ2xvYmFsLCBib29sIHByaW50KQogewotCXN0cnVjdCBhdHRuX3JvdXRlIGF0dG47CisJc3RydWN0IGF0dG5fcm91dGUgYXR0biA9IHsgezB9IH07CiAJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKIAogCWF0dG4uc2lnWzBdID0gUkVHX1JEKGJwLApAQCAtMzQ1Nyw4ICs0MDQ1LDEyIEBACiAJCU1JU0NfUkVHX0FFVV9BRlRFUl9JTlZFUlRfNF9GVU5DXzAgKwogCQkJICAgICBwb3J0KjQpOwogCi0JcmV0dXJuIGJueDJ4X3Bhcml0eV9hdHRuKGJwLCBhdHRuLnNpZ1swXSwgYXR0bi5zaWdbMV0sIGF0dG4uc2lnWzJdLAotCQkJCQlhdHRuLnNpZ1szXSk7CisJaWYgKCFDSElQX0lTX0UxeChicCkpCisJCWF0dG4uc2lnWzRdID0gUkVHX1JEKGJwLAorCQkJTUlTQ19SRUdfQUVVX0FGVEVSX0lOVkVSVF81X0ZVTkNfMCArCisJCQkJICAgICBwb3J0KjQpOworCisJcmV0dXJuIGJueDJ4X3Bhcml0eV9hdHRuKGJwLCBnbG9iYWwsIHByaW50LCBhdHRuLnNpZyk7CiB9CiAKIApAQCAtMzUzNywyMSArNDEyOSwyNSBAQAogCXUzMiByZWdfYWRkcjsKIAl1MzIgdmFsOwogCXUzMiBhZXVfbWFzazsKKwlib29sIGdsb2JhbCA9IGZhbHNlOwogCiAJLyogbmVlZCB0byB0YWtlIEhXIGxvY2sgYmVjYXVzZSBNQ1Agb3Igb3RoZXIgcG9ydCBtaWdodCBhbHNvCiAJICAgdHJ5IHRvIGhhbmRsZSB0aGlzIGV2ZW50ICovCiAJYm54MnhfYWNxdWlyZV9hbHIoYnApOwogCi0JaWYgKENISVBfUEFSSVRZX0VOQUJMRUQoYnApICYmIGJueDJ4X2Noa19wYXJpdHlfYXR0bihicCkpIHsKKwlpZiAoYm54MnhfY2hrX3Bhcml0eV9hdHRuKGJwLCAmZ2xvYmFsLCB0cnVlKSkgeworI2lmbmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCiAJCWJwLT5yZWNvdmVyeV9zdGF0ZSA9IEJOWDJYX1JFQ09WRVJZX0lOSVQ7Ci0JCWJueDJ4X3NldF9yZXNldF9pbl9wcm9ncmVzcyhicCk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYnAtPnJlc2V0X3Rhc2ssIDApOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5zcF9ydG5sX3Rhc2ssIDApOwogCQkvKiBEaXNhYmxlIEhXIGludGVycnVwdHMgKi8KIAkJYm54MnhfaW50X2Rpc2FibGUoYnApOwotCQlibngyeF9yZWxlYXNlX2FscihicCk7CiAJCS8qIEluIGNhc2Ugb2YgcGFyaXR5IGVycm9ycyBkb24ndCBoYW5kbGUgYXR0ZW50aW9ucyBzbyB0aGF0CiAJCSAqIG90aGVyIGZ1bmN0aW9uIHdvdWxkICJzZWUiIHBhcml0eSBlcnJvcnMuCiAJCSAqLworI2Vsc2UKKwkJYm54MnhfcGFuaWMoKTsKKyNlbmRpZgorCQlibngyeF9yZWxlYXNlX2FscihicCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM1NTksNyArNDE1NSw3IEBACiAJYXR0bi5zaWdbMV0gPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0FFVV9BRlRFUl9JTlZFUlRfMl9GVU5DXzAgKyBwb3J0KjQpOwogCWF0dG4uc2lnWzJdID0gUkVHX1JEKGJwLCBNSVNDX1JFR19BRVVfQUZURVJfSU5WRVJUXzNfRlVOQ18wICsgcG9ydCo0KTsKIAlhdHRuLnNpZ1szXSA9IFJFR19SRChicCwgTUlTQ19SRUdfQUVVX0FGVEVSX0lOVkVSVF80X0ZVTkNfMCArIHBvcnQqNCk7Ci0JaWYgKENISVBfSVNfRTIoYnApKQorCWlmICghQ0hJUF9JU19FMXgoYnApKQogCQlhdHRuLnNpZ1s0XSA9CiAJCSAgICAgIFJFR19SRChicCwgTUlTQ19SRUdfQUVVX0FGVEVSX0lOVkVSVF81X0ZVTkNfMCArIHBvcnQqNCk7CiAJZWxzZQpAQCAtMzY1NSw2ICs0MjUxLDE1IEBACiAJCWJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQoYnAsIGRlYXNzZXJ0ZWQpOwogfQogCit2b2lkIGJueDJ4X2lndV9hY2tfc2Ioc3RydWN0IGJueDJ4ICpicCwgdTggaWd1X3NiX2lkLCB1OCBzZWdtZW50LAorCQkgICAgICB1MTYgaW5kZXgsIHU4IG9wLCB1OCB1cGRhdGUpCit7CisJdTMyIGlndV9hZGRyID0gQkFSX0lHVV9JTlRNRU0gKyAoSUdVX0NNRF9JTlRfQUNLX0JBU0UgKyBpZ3Vfc2JfaWQpKjg7CisKKwlibngyeF9pZ3VfYWNrX3NiX2dlbihicCwgaWd1X3NiX2lkLCBzZWdtZW50LCBpbmRleCwgb3AsIHVwZGF0ZSwKKwkJCSAgICAgaWd1X2FkZHIpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfdXBkYXRlX2VxX3Byb2Qoc3RydWN0IGJueDJ4ICpicCwgdTE2IHByb2QpCiB7CiAJLyogTm8gbWVtb3J5IGJhcnJpZXJzICovCkBAIC0zNjY2LDYgKzQyNzEsOCBAQAogc3RhdGljIGludCAgYm54MnhfY25pY19oYW5kbGVfY2ZjX2RlbChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgY2lkLAogCQkJCSAgICAgIHVuaW9uIGV2ZW50X3JpbmdfZWxlbSAqZWxlbSkKIHsKKwl1OCBlcnIgPSBlbGVtLT5tZXNzYWdlLmVycm9yOworCiAJaWYgKCFicC0+Y25pY19ldGhfZGV2LnN0YXJ0aW5nX2NpZCAgfHwKIAkgICAgKGNpZCA8IGJwLT5jbmljX2V0aF9kZXYuc3RhcnRpbmdfY2lkICYmCiAJICAgIGNpZCAhPSBicC0+Y25pY19ldGhfZGV2LmlzY3NpX2wyX2NpZCkpCkBAIC0zNjczLDE2ICs0MjgwLDEyMyBAQAogCiAJRFAoQk5YMlhfTVNHX1NQLCAiZ290IGRlbGV0ZSByYW1yb2QgZm9yIENOSUMgQ0lEICVkXG4iLCBjaWQpOwogCi0JaWYgKHVubGlrZWx5KGVsZW0tPm1lc3NhZ2UuZGF0YS5jZmNfZGVsX2V2ZW50LmVycm9yKSkgeworCWlmICh1bmxpa2VseShlcnIpKSB7CisKIAkJQk5YMlhfRVJSKCJnb3QgZGVsZXRlIHJhbXJvZCBmb3IgQ05JQyBDSUQgJWQgd2l0aCBlcnJvciFcbiIsCiAJCQkgIGNpZCk7CiAJCWJueDJ4X3BhbmljX2R1bXAoYnApOwogCX0KLQlibngyeF9jbmljX2NmY19jb21wKGJwLCBjaWQpOworCWJueDJ4X2NuaWNfY2ZjX2NvbXAoYnAsIGNpZCwgZXJyKTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfaGFuZGxlX21jYXN0X2VxZShzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zIHJwYXJhbTsKKwlpbnQgcmM7CisKKwltZW1zZXQoJnJwYXJhbSwgMCwgc2l6ZW9mKHJwYXJhbSkpOworCisJcnBhcmFtLm1jYXN0X29iaiA9ICZicC0+bWNhc3Rfb2JqOworCisJbmV0aWZfYWRkcl9sb2NrX2JoKGJwLT5kZXYpOworCisJLyogQ2xlYXIgcGVuZGluZyBzdGF0ZSBmb3IgdGhlIGxhc3QgY29tbWFuZCAqLworCWJwLT5tY2FzdF9vYmoucmF3LmNsZWFyX3BlbmRpbmcoJmJwLT5tY2FzdF9vYmoucmF3KTsKKworCS8qIElmIHRoZXJlIGFyZSBwZW5kaW5nIG1jYXN0IGNvbW1hbmRzIC0gc2VuZCB0aGVtICovCisJaWYgKGJwLT5tY2FzdF9vYmouY2hlY2tfcGVuZGluZygmYnAtPm1jYXN0X29iaikpIHsKKwkJcmMgPSBibngyeF9jb25maWdfbWNhc3QoYnAsICZycGFyYW0sIEJOWDJYX01DQVNUX0NNRF9DT05UKTsKKwkJaWYgKHJjIDwgMCkKKwkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIHNlbmQgcGVuZGluZyBtY2FzdCBjb21tYW5kczogJWRcbiIsCisJCQkJICByYyk7CisJfQorCisJbmV0aWZfYWRkcl91bmxvY2tfYmgoYnAtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9oYW5kbGVfY2xhc3NpZmljYXRpb25fZXFlKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCQkgICB1bmlvbiBldmVudF9yaW5nX2VsZW0gKmVsZW0pCit7CisJdW5zaWduZWQgbG9uZyByYW1yb2RfZmxhZ3MgPSAwOworCWludCByYyA9IDA7CisJdTMyIGNpZCA9IGVsZW0tPm1lc3NhZ2UuZGF0YS5ldGhfZXZlbnQuZWNobyAmIEJOWDJYX1NXQ0lEX01BU0s7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqdmxhbl9tYWNfb2JqOworCisJLyogQWx3YXlzIHB1c2ggbmV4dCBjb21tYW5kcyBvdXQsIGRvbid0IHdhaXQgaGVyZSAqLworCV9fc2V0X2JpdChSQU1ST0RfQ09OVCwgJnJhbXJvZF9mbGFncyk7CisKKwlzd2l0Y2ggKGVsZW0tPm1lc3NhZ2UuZGF0YS5ldGhfZXZlbnQuZWNobyA+PiBCTlgyWF9TV0NJRF9TSElGVCkgeworCWNhc2UgQk5YMlhfRklMVEVSX01BQ19QRU5ESU5HOgorI2lmZGVmIEJDTV9DTklDCisJCWlmIChjaWQgPT0gQk5YMlhfSVNDU0lfRVRIX0NJRCkKKwkJCXZsYW5fbWFjX29iaiA9ICZicC0+aXNjc2lfbDJfbWFjX29iajsKKwkJZWxzZQorI2VuZGlmCisJCQl2bGFuX21hY19vYmogPSAmYnAtPmZwW2NpZF0ubWFjX29iajsKKworCQlicmVhazsKKwkJdmxhbl9tYWNfb2JqID0gJmJwLT5mcFtjaWRdLm1hY19vYmo7CisKKwljYXNlIEJOWDJYX0ZJTFRFUl9NQ0FTVF9QRU5ESU5HOgorCQkvKiBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgZm9yIDU3NzEwIHdoZXJlIG11bHRpY2FzdCBNQUNzIGFyZQorCQkgKiBjb25maWd1cmVkIGFzIHVuaWNhc3QgTUFDcyB1c2luZyB0aGUgc2FtZSByYW1yb2QuCisJCSAqLworCQlibngyeF9oYW5kbGVfbWNhc3RfZXFlKGJwKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiVW5zdXBwb3J0ZWQgY2xhc3NpZmljYXRpb24gY29tbWFuZDogJWRcbiIsCisJCQkgIGVsZW0tPm1lc3NhZ2UuZGF0YS5ldGhfZXZlbnQuZWNobyk7CisJCXJldHVybjsKKwl9CisKKwlyYyA9IHZsYW5fbWFjX29iai0+Y29tcGxldGUoYnAsIHZsYW5fbWFjX29iaiwgZWxlbSwgJnJhbXJvZF9mbGFncyk7CisKKwlpZiAocmMgPCAwKQorCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBzY2hlZHVsZSBuZXcgY29tbWFuZHM6ICVkXG4iLCByYyk7CisJZWxzZSBpZiAocmMgPiAwKQorCQlEUChCTlgyWF9NU0dfU1AsICJTY2hlZHVsZWQgbmV4dCBwZW5kaW5nIGNvbW1hbmRzLi4uXG4iKTsKKworfQorCisjaWZkZWYgQkNNX0NOSUMKK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9pc2NzaV9ldGhfcnhfbW9kZShzdHJ1Y3QgYm54MnggKmJwLCBib29sIHN0YXJ0KTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfaGFuZGxlX3J4X21vZGVfZXFlKHN0cnVjdCBibngyeCAqYnApCit7CisJbmV0aWZfYWRkcl9sb2NrX2JoKGJwLT5kZXYpOworCisJY2xlYXJfYml0KEJOWDJYX0ZJTFRFUl9SWF9NT0RFX1BFTkRJTkcsICZicC0+c3Bfc3RhdGUpOworCisJLyogU2VuZCByeF9tb2RlIGNvbW1hbmQgYWdhaW4gaWYgd2FzIHJlcXVlc3RlZCAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMlhfRklMVEVSX1JYX01PREVfU0NIRUQsICZicC0+c3Bfc3RhdGUpKQorCQlibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShicCk7CisjaWZkZWYgQkNNX0NOSUMKKwllbHNlIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMlhfRklMVEVSX0lTQ1NJX0VUSF9TVEFSVF9TQ0hFRCwKKwkJCQkgICAgJmJwLT5zcF9zdGF0ZSkpCisJCWJueDJ4X3NldF9pc2NzaV9ldGhfcnhfbW9kZShicCwgdHJ1ZSk7CisJZWxzZSBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJYX0ZJTFRFUl9JU0NTSV9FVEhfU1RPUF9TQ0hFRCwKKwkJCQkgICAgJmJwLT5zcF9zdGF0ZSkpCisJCWJueDJ4X3NldF9pc2NzaV9ldGhfcnhfbW9kZShicCwgZmFsc2UpOworI2VuZGlmCisKKwluZXRpZl9hZGRyX3VubG9ja19iaChicC0+ZGV2KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYm54MnhfcXVldWVfc3Bfb2JqICpibngyeF9jaWRfdG9fcV9vYmooCisJc3RydWN0IGJueDJ4ICpicCwgdTMyIGNpZCkKK3sKKwlEUChCTlgyWF9NU0dfU1AsICJyZXRyaWV2aW5nIGZwIGZyb20gY2lkICVkIiwgY2lkKTsKKyNpZmRlZiBCQ01fQ05JQworCWlmIChjaWQgPT0gQk5YMlhfRkNPRV9FVEhfQ0lEKQorCQlyZXR1cm4gJmJueDJ4X2Zjb2UoYnAsIHFfb2JqKTsKKwllbHNlCisjZW5kaWYKKwkJcmV0dXJuICZibngyeF9mcChicCwgQ0lEX1RPX0ZQKGNpZCksIHFfb2JqKTsKK30KKwogc3RhdGljIHZvaWQgYm54MnhfZXFfaW50KHN0cnVjdCBibngyeCAqYnApCiB7CiAJdTE2IGh3X2NvbnMsIHN3X2NvbnMsIHN3X3Byb2Q7CkBAIC0zNjkwLDYgKzQ0MDQsOSBAQAogCXUzMiBjaWQ7CiAJdTggb3Bjb2RlOwogCWludCBzcHFlX2NudCA9IDA7CisJc3RydWN0IGJueDJ4X3F1ZXVlX3NwX29iaiAqcV9vYmo7CisJc3RydWN0IGJueDJ4X2Z1bmNfc3Bfb2JqICpmX29iaiA9ICZicC0+ZnVuY19vYmo7CisJc3RydWN0IGJueDJ4X3Jhd19vYmogKnJzc19yYXcgPSAmYnAtPnJzc19jb25mX29iai5yYXc7CiAKIAlod19jb25zID0gbGUxNl90b19jcHUoKmJwLT5lcV9jb25zX3NiKTsKIApAQCAtMzcwOCw3ICs0NDI1LDcgQEAKIAlzd19jb25zID0gYnAtPmVxX2NvbnM7CiAJc3dfcHJvZCA9IGJwLT5lcV9wcm9kOwogCi0JRFAoQk5YMlhfTVNHX1NQLCAiRVE6ICBod19jb25zICV1ICBzd19jb25zICV1IGJwLT5jcV9zcHFfbGVmdCAldVxuIiwKKwlEUChCTlgyWF9NU0dfU1AsICJFUTogIGh3X2NvbnMgJXUgIHN3X2NvbnMgJXUgYnAtPmVxX3NwcV9sZWZ0ICV4XG4iLAogCQkJaHdfY29ucywgc3dfY29ucywgYXRvbWljX3JlYWQoJmJwLT5lcV9zcHFfbGVmdCkpOwogCiAJZm9yICg7IHN3X2NvbnMgIT0gaHdfY29uczsKQEAgLTM3MjQsOSArNDQ0MSwxMCBAQAogCQkvKiBoYW5kbGUgZXEgZWxlbWVudCAqLwogCQlzd2l0Y2ggKG9wY29kZSkgewogCQljYXNlIEVWRU5UX1JJTkdfT1BDT0RFX1NUQVRfUVVFUlk6Ci0JCQlEUChORVRJRl9NU0dfVElNRVIsICJnb3Qgc3RhdGlzdGljcyBjb21wIGV2ZW50XG4iKTsKKwkJCURQKE5FVElGX01TR19USU1FUiwgImdvdCBzdGF0aXN0aWNzIGNvbXAgZXZlbnQgJWRcbiIsCisJCQkgICBicC0+c3RhdHNfY29tcCsrKTsKIAkJCS8qIG5vdGhpbmcgdG8gZG8gd2l0aCBzdGF0cyBjb21wICovCi0JCQljb250aW51ZTsKKwkJCWdvdG8gbmV4dF9zcHFlOwogCiAJCWNhc2UgRVZFTlRfUklOR19PUENPREVfQ0ZDX0RFTDoKIAkJCS8qIGhhbmRsZSBhY2NvcmRpbmcgdG8gY2lkIHJhbmdlICovCkBAIC0zNzM0LDYwICs0NDUyLDEwMCBAQAogCQkJICogd2UgbWF5IHdhbnQgdG8gdmVyaWZ5IGhlcmUgdGhhdCB0aGUgYnAgc3RhdGUgaXMKIAkJCSAqIEhBTFRJTkcKIAkJCSAqLwotCQkJRFAoTkVUSUZfTVNHX0lGRE9XTiwKKwkJCURQKEJOWDJYX01TR19TUCwKIAkJCSAgICJnb3QgZGVsZXRlIHJhbXJvZCBmb3IgTVVMVElbJWRdXG4iLCBjaWQpOwogI2lmZGVmIEJDTV9DTklDCiAJCQlpZiAoIWJueDJ4X2NuaWNfaGFuZGxlX2NmY19kZWwoYnAsIGNpZCwgZWxlbSkpCiAJCQkJZ290byBuZXh0X3NwcWU7Ci0JCQlpZiAoY2lkID09IEJOWDJYX0ZDT0VfRVRIX0NJRCkKLQkJCQlibngyeF9mY29lKGJwLCBzdGF0ZSkgPSBCTlgyWF9GUF9TVEFURV9DTE9TRUQ7Ci0JCQllbHNlCiAjZW5kaWYKLQkJCQlibngyeF9mcChicCwgY2lkLCBzdGF0ZSkgPQotCQkJCQkJQk5YMlhfRlBfU1RBVEVfQ0xPU0VEOworCQkJcV9vYmogPSBibngyeF9jaWRfdG9fcV9vYmooYnAsIGNpZCk7CisKKwkJCWlmIChxX29iai0+Y29tcGxldGVfY21kKGJwLCBxX29iaiwgQk5YMlhfUV9DTURfQ0ZDX0RFTCkpCisJCQkJYnJlYWs7CisKKwogCiAJCQlnb3RvIG5leHRfc3BxZTsKIAogCQljYXNlIEVWRU5UX1JJTkdfT1BDT0RFX1NUT1BfVFJBRkZJQzoKLQkJCURQKE5FVElGX01TR19JRlVQLCAiZ290IFNUT1AgVFJBRkZJQ1xuIik7CisJCQlEUChCTlgyWF9NU0dfU1AsICJnb3QgU1RPUCBUUkFGRklDXG4iKTsKKwkJCWlmIChmX29iai0+Y29tcGxldGVfY21kKGJwLCBmX29iaiwKKwkJCQkJCUJOWDJYX0ZfQ01EX1RYX1NUT1ApKQorCQkJCWJyZWFrOwogCQkJYm54MnhfZGNieF9zZXRfcGFyYW1zKGJwLCBCTlgyWF9EQ0JYX1NUQVRFX1RYX1BBVVNFRCk7CiAJCQlnb3RvIG5leHRfc3BxZTsKKwogCQljYXNlIEVWRU5UX1JJTkdfT1BDT0RFX1NUQVJUX1RSQUZGSUM6Ci0JCQlEUChORVRJRl9NU0dfSUZVUCwgImdvdCBTVEFSVCBUUkFGRklDXG4iKTsKKwkJCURQKEJOWDJYX01TR19TUCwgImdvdCBTVEFSVCBUUkFGRklDXG4iKTsKKwkJCWlmIChmX29iai0+Y29tcGxldGVfY21kKGJwLCBmX29iaiwKKwkJCQkJCUJOWDJYX0ZfQ01EX1RYX1NUQVJUKSkKKwkJCQlicmVhazsKIAkJCWJueDJ4X2RjYnhfc2V0X3BhcmFtcyhicCwgQk5YMlhfRENCWF9TVEFURV9UWF9SRUxFQVNFRCk7CiAJCQlnb3RvIG5leHRfc3BxZTsKKwkJY2FzZSBFVkVOVF9SSU5HX09QQ09ERV9GVU5DVElPTl9TVEFSVDoKKwkJCURQKEJOWDJYX01TR19TUCwgImdvdCBGVU5DX1NUQVJUIHJhbXJvZFxuIik7CisJCQlpZiAoZl9vYmotPmNvbXBsZXRlX2NtZChicCwgZl9vYmosIEJOWDJYX0ZfQ01EX1NUQVJUKSkKKwkJCQlicmVhazsKKworCQkJZ290byBuZXh0X3NwcWU7CisKKwkJY2FzZSBFVkVOVF9SSU5HX09QQ09ERV9GVU5DVElPTl9TVE9QOgorCQkJRFAoQk5YMlhfTVNHX1NQLCAiZ290IEZVTkNfU1RPUCByYW1yb2RcbiIpOworCQkJaWYgKGZfb2JqLT5jb21wbGV0ZV9jbWQoYnAsIGZfb2JqLCBCTlgyWF9GX0NNRF9TVE9QKSkKKwkJCQlicmVhazsKKworCQkJZ290byBuZXh0X3NwcWU7CiAJCX0KIAogCQlzd2l0Y2ggKG9wY29kZSB8IGJwLT5zdGF0ZSkgewotCQljYXNlIChFVkVOVF9SSU5HX09QQ09ERV9GVU5DVElPTl9TVEFSVCB8CisJCWNhc2UgKEVWRU5UX1JJTkdfT1BDT0RFX1JTU19VUERBVEVfUlVMRVMgfAorCQkgICAgICBCTlgyWF9TVEFURV9PUEVOKToKKwkJY2FzZSAoRVZFTlRfUklOR19PUENPREVfUlNTX1VQREFURV9SVUxFUyB8CiAJCSAgICAgIEJOWDJYX1NUQVRFX09QRU5JTkdfV0FJVDRfUE9SVCk6Ci0JCQlEUChORVRJRl9NU0dfSUZVUCwgImdvdCBzZXR1cCByYW1yb2RcbiIpOwotCQkJYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfRlVOQ19TVEFSVEVEOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAoRVZFTlRfUklOR19PUENPREVfRlVOQ1RJT05fU1RPUCB8Ci0JCSAgICAgIEJOWDJYX1NUQVRFX0NMT1NJTkdfV0FJVDRfSEFMVCk6Ci0JCQlEUChORVRJRl9NU0dfSUZET1dOLCAiZ290IGhhbHQgcmFtcm9kXG4iKTsKLQkJCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX0NMT1NJTkdfV0FJVDRfVU5MT0FEOworCQkJY2lkID0gZWxlbS0+bWVzc2FnZS5kYXRhLmV0aF9ldmVudC5lY2hvICYKKwkJCQlCTlgyWF9TV0NJRF9NQVNLOworCQkJRFAoQk5YMlhfTVNHX1NQLCAiZ290IFJTU19VUERBVEUgcmFtcm9kLiBDSUQgJWRcbiIsCisJCQkgICBjaWQpOworCQkJcnNzX3Jhdy0+Y2xlYXJfcGVuZGluZyhyc3NfcmF3KTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgKEVWRU5UX1JJTkdfT1BDT0RFX1NFVF9NQUMgfCBCTlgyWF9TVEFURV9PUEVOKToKIAkJY2FzZSAoRVZFTlRfUklOR19PUENPREVfU0VUX01BQyB8IEJOWDJYX1NUQVRFX0RJQUcpOgotCQkJRFAoTkVUSUZfTVNHX0lGVVAsICJnb3Qgc2V0IG1hYyByYW1yb2RcbiIpOwotCQkJaWYgKGVsZW0tPm1lc3NhZ2UuZGF0YS5zZXRfbWFjX2V2ZW50LmVjaG8pCi0JCQkJYnAtPnNldF9tYWNfcGVuZGluZyA9IDA7Ci0JCQlicmVhazsKLQogCQljYXNlIChFVkVOVF9SSU5HX09QQ09ERV9TRVRfTUFDIHwKIAkJICAgICAgQk5YMlhfU1RBVEVfQ0xPU0lOR19XQUlUNF9IQUxUKToKLQkJCURQKE5FVElGX01TR19JRkRPV04sICJnb3QgKHVuKXNldCBtYWMgcmFtcm9kXG4iKTsKLQkJCWlmIChlbGVtLT5tZXNzYWdlLmRhdGEuc2V0X21hY19ldmVudC5lY2hvKQotCQkJCWJwLT5zZXRfbWFjX3BlbmRpbmcgPSAwOworCQljYXNlIChFVkVOVF9SSU5HX09QQ09ERV9DTEFTU0lGSUNBVElPTl9SVUxFUyB8CisJCSAgICAgIEJOWDJYX1NUQVRFX09QRU4pOgorCQljYXNlIChFVkVOVF9SSU5HX09QQ09ERV9DTEFTU0lGSUNBVElPTl9SVUxFUyB8CisJCSAgICAgIEJOWDJYX1NUQVRFX0RJQUcpOgorCQljYXNlIChFVkVOVF9SSU5HX09QQ09ERV9DTEFTU0lGSUNBVElPTl9SVUxFUyB8CisJCSAgICAgIEJOWDJYX1NUQVRFX0NMT1NJTkdfV0FJVDRfSEFMVCk6CisJCQlEUChCTlgyWF9NU0dfU1AsICJnb3QgKHVuKXNldCBtYWMgcmFtcm9kXG4iKTsKKwkJCWJueDJ4X2hhbmRsZV9jbGFzc2lmaWNhdGlvbl9lcWUoYnAsIGVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSAoRVZFTlRfUklOR19PUENPREVfTVVMVElDQVNUX1JVTEVTIHwKKwkJICAgICAgQk5YMlhfU1RBVEVfT1BFTik6CisJCWNhc2UgKEVWRU5UX1JJTkdfT1BDT0RFX01VTFRJQ0FTVF9SVUxFUyB8CisJCSAgICAgIEJOWDJYX1NUQVRFX0RJQUcpOgorCQljYXNlIChFVkVOVF9SSU5HX09QQ09ERV9NVUxUSUNBU1RfUlVMRVMgfAorCQkgICAgICBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0X0hBTFQpOgorCQkJRFAoQk5YMlhfTVNHX1NQLCAiZ290IG1jYXN0IHJhbXJvZFxuIik7CisJCQlibngyeF9oYW5kbGVfbWNhc3RfZXFlKGJwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgKEVWRU5UX1JJTkdfT1BDT0RFX0ZJTFRFUlNfUlVMRVMgfAorCQkgICAgICBCTlgyWF9TVEFURV9PUEVOKToKKwkJY2FzZSAoRVZFTlRfUklOR19PUENPREVfRklMVEVSU19SVUxFUyB8CisJCSAgICAgIEJOWDJYX1NUQVRFX0RJQUcpOgorCQljYXNlIChFVkVOVF9SSU5HX09QQ09ERV9GSUxURVJTX1JVTEVTIHwKKwkJICAgICAgQk5YMlhfU1RBVEVfQ0xPU0lOR19XQUlUNF9IQUxUKToKKwkJCURQKEJOWDJYX01TR19TUCwgImdvdCByeF9tb2RlIHJhbXJvZFxuIik7CisJCQlibngyeF9oYW5kbGVfcnhfbW9kZV9lcWUoYnApOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQkvKiB1bmtub3duIGV2ZW50IGxvZyBlcnJvciBhbmQgY29udGludWUgKi8KLQkJCUJOWDJYX0VSUigiVW5rbm93biBFUSBldmVudCAlZFxuIiwKLQkJCQkgIGVsZW0tPm1lc3NhZ2Uub3Bjb2RlKTsKKwkJCUJOWDJYX0VSUigiVW5rbm93biBFUSBldmVudCAlZCwgYnAtPnN0YXRlIDB4JXhcbiIsCisJCQkJICBlbGVtLT5tZXNzYWdlLm9wY29kZSwgYnAtPnN0YXRlKTsKIAkJfQogbmV4dF9zcHFlOgogCQlzcHFlX2NudCsrOwpAQCAtMzgxMCwxMiArNDU2OCw2IEBACiAJc3RydWN0IGJueDJ4ICpicCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYm54MngsIHNwX3Rhc2sud29yayk7CiAJdTE2IHN0YXR1czsKIAotCS8qIFJldHVybiBoZXJlIGlmIGludGVycnVwdCBpcyBkaXNhYmxlZCAqLwotCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmYnAtPmludHJfc2VtKSAhPSAwKSkgewotCQlEUChORVRJRl9NU0dfSU5UUiwgImNhbGxlZCBidXQgaW50cl9zZW0gbm90IDAsIHJldHVybmluZ1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KIAlzdGF0dXMgPSBibngyeF91cGRhdGVfZHNiX2lkeChicCk7CiAvKglpZiAoc3RhdHVzID09IDApCQkJCSAgICAgKi8KIC8qCQlCTlgyWF9FUlIoInNwdXJpb3VzIHNsb3dwYXRoIGludGVycnVwdCFcbiIpOyAqLwpAQCAtMzgzNCw4ICs0NTg2LDE1IEBACiAJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSBibngyeF9mY29lX2ZwKGJwKTsKIAogCQlpZiAoKCFOT19GQ09FKGJwKSkgJiYKLQkJCShibngyeF9oYXNfcnhfd29yayhmcCkgfHwgYm54MnhfaGFzX3R4X3dvcmsoZnApKSkKKwkJCShibngyeF9oYXNfcnhfd29yayhmcCkgfHwgYm54MnhfaGFzX3R4X3dvcmsoZnApKSkgeworCQkJLyoKKwkJCSAqIFByZXZlbnQgbG9jYWwgYm90dG9tLWhhbHZlcyBmcm9tIHJ1bm5pbmcgYXMKKwkJCSAqIHdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlIGxvY2FsIE5BUEkgbGlzdC4KKwkJCSAqLworCQkJbG9jYWxfYmhfZGlzYWJsZSgpOwogCQkJbmFwaV9zY2hlZHVsZSgmYm54MnhfZmNvZShicCwgbmFwaSkpOworCQkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCX0KICNlbmRpZgogCQkvKiBIYW5kbGUgRVEgY29tcGxldGlvbnMgKi8KIAkJYm54MnhfZXFfaW50KGJwKTsKQEAgLTM4NTksMTIgKzQ2MTgsNiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CiAJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CiAKLQkvKiBSZXR1cm4gaGVyZSBpZiBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQgKi8KLQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmJwLT5pbnRyX3NlbSkgIT0gMCkpIHsKLQkJRFAoTkVUSUZfTVNHX0lOVFIsICJjYWxsZWQgYnV0IGludHJfc2VtIG5vdCAwLCByZXR1cm5pbmdcbiIpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCiAJYm54MnhfYWNrX3NiKGJwLCBicC0+aWd1X2RzYl9pZCwgVVNUT1JNX0lELCAwLAogCQkgICAgIElHVV9JTlRfRElTQUJMRSwgMCk7CiAKQEAgLTM4OTEsMjAgKzQ2NDQsMjcgQEAKIAogLyogZW5kIG9mIHNsb3cgcGF0aCAqLwogCisKK3ZvaWQgYm54MnhfZHJ2X3B1bHNlKHN0cnVjdCBibngyeCAqYnApCit7CisJU0hNRU1fV1IoYnAsIGZ1bmNfbWJbQlBfRldfTUJfSURYKGJwKV0uZHJ2X3B1bHNlX21iLAorCQkgYnAtPmZ3X2Rydl9wdWxzZV93cl9zZXEpOworfQorCisKIHN0YXRpYyB2b2lkIGJueDJ4X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKKwl1OCBjb3M7CiAJc3RydWN0IGJueDJ4ICpicCA9IChzdHJ1Y3QgYm54MnggKikgZGF0YTsKIAogCWlmICghbmV0aWZfcnVubmluZyhicC0+ZGV2KSkKIAkJcmV0dXJuOwogCi0JaWYgKGF0b21pY19yZWFkKCZicC0+aW50cl9zZW0pICE9IDApCi0JCWdvdG8gdGltZXJfcmVzdGFydDsKLQogCWlmIChwb2xsKSB7CiAJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwWzBdOwogCi0JCWJueDJ4X3R4X2ludChmcCk7CisJCWZvcl9lYWNoX2Nvc19pbl90eF9xdWV1ZShmcCwgY29zKQorCQkJYm54MnhfdHhfaW50KGJwLCAmZnAtPnR4ZGF0YVtjb3NdKTsKIAkJYm54MnhfcnhfaW50KGZwLCAxMDAwKTsKIAl9CiAKQEAgLTM5MTcsNyArNDY3Nyw3IEBACiAJCWJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxICY9IERSVl9QVUxTRV9TRVFfTUFTSzsKIAkJLyogVEJEIC0gYWRkIFNZU1RFTV9USU1FICovCiAJCWRydl9wdWxzZSA9IGJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxOwotCQlTSE1FTV9XUihicCwgZnVuY19tYlttYl9pZHhdLmRydl9wdWxzZV9tYiwgZHJ2X3B1bHNlKTsKKwkJYm54MnhfZHJ2X3B1bHNlKGJwKTsKIAogCQltY3BfcHVsc2UgPSAoU0hNRU1fUkQoYnAsIGZ1bmNfbWJbbWJfaWR4XS5tY3BfcHVsc2VfbWIpICYKIAkJCSAgICAgTUNQX1BVTFNFX1NFUV9NQVNLKTsKQEAgLTM5MzUsNyArNDY5NSw2IEBACiAJaWYgKGJwLT5zdGF0ZSA9PSBCTlgyWF9TVEFURV9PUEVOKQogCQlibngyeF9zdGF0c19oYW5kbGUoYnAsIFNUQVRTX0VWRU5UX1VQREFURSk7CiAKLXRpbWVyX3Jlc3RhcnQ6CiAJbW9kX3RpbWVyKCZicC0+dGltZXIsIGppZmZpZXMgKyBicC0+Y3VycmVudF9pbnRlcnZhbCk7CiB9CiAKQEAgLTM5ODEsMTggKzQ3NDAsMTYgQEAKIAlzdHJ1Y3QgaGNfc3RhdHVzX2Jsb2NrX2RhdGFfZTF4IHNiX2RhdGFfZTF4OwogCiAJLyogZGlzYWJsZSB0aGUgZnVuY3Rpb24gZmlyc3QgKi8KLQlpZiAoQ0hJUF9JU19FMihicCkpIHsKKwlpZiAoIUNISVBfSVNfRTF4KGJwKSkgewogCQltZW1zZXQoJnNiX2RhdGFfZTIsIDAsIHNpemVvZihzdHJ1Y3QgaGNfc3RhdHVzX2Jsb2NrX2RhdGFfZTIpKTsKLQkJc2JfZGF0YV9lMi5jb21tb24ucF9mdW5jLnBmX2lkID0gSENfRlVOQ1RJT05fRElTQUJMRUQ7Ci0JCXNiX2RhdGFfZTIuY29tbW9uLnBfZnVuYy52Zl9pZCA9IEhDX0ZVTkNUSU9OX0RJU0FCTEVEOworCQlzYl9kYXRhX2UyLmNvbW1vbi5zdGF0ZSA9IFNCX0RJU0FCTEVEOwogCQlzYl9kYXRhX2UyLmNvbW1vbi5wX2Z1bmMudmZfdmFsaWQgPSBmYWxzZTsKIAkJc2JfZGF0YV9wID0gKHUzMiAqKSZzYl9kYXRhX2UyOwogCQlkYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGhjX3N0YXR1c19ibG9ja19kYXRhX2UyKS9zaXplb2YodTMyKTsKIAl9IGVsc2UgewogCQltZW1zZXQoJnNiX2RhdGFfZTF4LCAwLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBoY19zdGF0dXNfYmxvY2tfZGF0YV9lMXgpKTsKLQkJc2JfZGF0YV9lMXguY29tbW9uLnBfZnVuYy5wZl9pZCA9IEhDX0ZVTkNUSU9OX0RJU0FCTEVEOwotCQlzYl9kYXRhX2UxeC5jb21tb24ucF9mdW5jLnZmX2lkID0gSENfRlVOQ1RJT05fRElTQUJMRUQ7CisJCXNiX2RhdGFfZTF4LmNvbW1vbi5zdGF0ZSA9IFNCX0RJU0FCTEVEOwogCQlzYl9kYXRhX2UxeC5jb21tb24ucF9mdW5jLnZmX3ZhbGlkID0gZmFsc2U7CiAJCXNiX2RhdGFfcCA9ICh1MzIgKikmc2JfZGF0YV9lMXg7CiAJCWRhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaGNfc3RhdHVzX2Jsb2NrX2RhdGFfZTF4KS9zaXplb2YodTMyKTsKQEAgLTQwMjYsOCArNDc4Myw3IEBACiAJc3RydWN0IGhjX3NwX3N0YXR1c19ibG9ja19kYXRhIHNwX3NiX2RhdGE7CiAJbWVtc2V0KCZzcF9zYl9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IGhjX3NwX3N0YXR1c19ibG9ja19kYXRhKSk7CiAKLQlzcF9zYl9kYXRhLnBfZnVuYy5wZl9pZCA9IEhDX0ZVTkNUSU9OX0RJU0FCTEVEOwotCXNwX3NiX2RhdGEucF9mdW5jLnZmX2lkID0gSENfRlVOQ1RJT05fRElTQUJMRUQ7CisJc3Bfc2JfZGF0YS5zdGF0ZSA9IFNCX0RJU0FCTEVEOwogCXNwX3NiX2RhdGEucF9mdW5jLnZmX3ZhbGlkID0gZmFsc2U7CiAKIAlibngyeF93cl9zcF9zYl9kYXRhKGJwLCAmc3Bfc2JfZGF0YSk7CkBAIC00MDcwLDggKzQ4MjYsOSBAQAogCiAJYm54MnhfemVyb19mcF9zYihicCwgZndfc2JfaWQpOwogCi0JaWYgKENISVBfSVNfRTIoYnApKSB7CisJaWYgKCFDSElQX0lTX0UxeChicCkpIHsKIAkJbWVtc2V0KCZzYl9kYXRhX2UyLCAwLCBzaXplb2Yoc3RydWN0IGhjX3N0YXR1c19ibG9ja19kYXRhX2UyKSk7CisJCXNiX2RhdGFfZTIuY29tbW9uLnN0YXRlID0gU0JfRU5BQkxFRDsKIAkJc2JfZGF0YV9lMi5jb21tb24ucF9mdW5jLnBmX2lkID0gQlBfRlVOQyhicCk7CiAJCXNiX2RhdGFfZTIuY29tbW9uLnBfZnVuYy52Zl9pZCA9IHZmaWQ7CiAJCXNiX2RhdGFfZTIuY29tbW9uLnBfZnVuYy52Zl92YWxpZCA9IHZmX3ZhbGlkOwpAQCAtNDA4NSw2ICs0ODQyLDcgQEAKIAl9IGVsc2UgewogCQltZW1zZXQoJnNiX2RhdGFfZTF4LCAwLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBoY19zdGF0dXNfYmxvY2tfZGF0YV9lMXgpKTsKKwkJc2JfZGF0YV9lMXguY29tbW9uLnN0YXRlID0gU0JfRU5BQkxFRDsKIAkJc2JfZGF0YV9lMXguY29tbW9uLnBfZnVuYy5wZl9pZCA9IEJQX0ZVTkMoYnApOwogCQlzYl9kYXRhX2UxeC5jb21tb24ucF9mdW5jLnZmX2lkID0gMHhmZjsKIAkJc2JfZGF0YV9lMXguY29tbW9uLnBfZnVuYy52Zl92YWxpZCA9IGZhbHNlOwpAQCAtNDEwOCwyNSArNDg2NiwyMCBAQAogCWJueDJ4X3dyX2ZwX3NiX2RhdGEoYnAsIGZ3X3NiX2lkLCBzYl9kYXRhX3AsIGRhdGFfc2l6ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJ4X3VwZGF0ZV9jb2FsZXNjZV9zYl9pbmRleChzdHJ1Y3QgYm54MnggKmJwLCB1MTYgZndfc2JfaWQsCi0JCQkJCXU4IHNiX2luZGV4LCB1OCBkaXNhYmxlLCB1MTYgdXNlYykKLXsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCXU4IHRpY2tzID0gdXNlYyAvIEJOWDJYX0JUUjsKLQotCXN0b3JtX21lbXNldF9oY190aW1lb3V0KGJwLCBwb3J0LCBmd19zYl9pZCwgc2JfaW5kZXgsIHRpY2tzKTsKLQotCWRpc2FibGUgPSBkaXNhYmxlID8gMSA6ICh1c2VjID8gMCA6IDEpOwotCXN0b3JtX21lbXNldF9oY19kaXNhYmxlKGJwLCBwb3J0LCBmd19zYl9pZCwgc2JfaW5kZXgsIGRpc2FibGUpOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF91cGRhdGVfY29hbGVzY2Vfc2Ioc3RydWN0IGJueDJ4ICpicCwgdTE2IGZ3X3NiX2lkLAorc3RhdGljIHZvaWQgYm54MnhfdXBkYXRlX2NvYWxlc2NlX3NiKHN0cnVjdCBibngyeCAqYnAsIHU4IGZ3X3NiX2lkLAogCQkJCSAgICAgdTE2IHR4X3VzZWMsIHUxNiByeF91c2VjKQogewotCWJueDJ4X3VwZGF0ZV9jb2FsZXNjZV9zYl9pbmRleChicCwgZndfc2JfaWQsIFVfU0JfRVRIX1JYX0NRX0lOREVYLAorCWJueDJ4X3VwZGF0ZV9jb2FsZXNjZV9zYl9pbmRleChicCwgZndfc2JfaWQsIEhDX0lOREVYX0VUSF9SWF9DUV9DT05TLAogCQkJCSAgICBmYWxzZSwgcnhfdXNlYyk7Ci0JYm54MnhfdXBkYXRlX2NvYWxlc2NlX3NiX2luZGV4KGJwLCBmd19zYl9pZCwgQ19TQl9FVEhfVFhfQ1FfSU5ERVgsCi0JCQkJICAgIGZhbHNlLCB0eF91c2VjKTsKKwlibngyeF91cGRhdGVfY29hbGVzY2Vfc2JfaW5kZXgoYnAsIGZ3X3NiX2lkLAorCQkJCSAgICAgICBIQ19JTkRFWF9FVEhfVFhfQ1FfQ09OU19DT1MwLCBmYWxzZSwKKwkJCQkgICAgICAgdHhfdXNlYyk7CisJYm54MnhfdXBkYXRlX2NvYWxlc2NlX3NiX2luZGV4KGJwLCBmd19zYl9pZCwKKwkJCQkgICAgICAgSENfSU5ERVhfRVRIX1RYX0NRX0NPTlNfQ09TMSwgZmFsc2UsCisJCQkJICAgICAgIHR4X3VzZWMpOworCWJueDJ4X3VwZGF0ZV9jb2FsZXNjZV9zYl9pbmRleChicCwgZndfc2JfaWQsCisJCQkJICAgICAgIEhDX0lOREVYX0VUSF9UWF9DUV9DT05TX0NPUzIsIGZhbHNlLAorCQkJCSAgICAgICB0eF91c2VjKTsKIH0KIAogc3RhdGljIHZvaWQgYm54MnhfaW5pdF9kZWZfc2Ioc3RydWN0IGJueDJ4ICpicCkKQEAgLTQxNjcsNyArNDkyMCw3IEBACiAJCQlicC0+YXR0bl9ncm91cFtpbmRleF0uc2lnW3NpbmRleF0gPQogCQkJICAgUkVHX1JEKGJwLCByZWdfb2Zmc2V0ICsgc2luZGV4KjB4NCArIDB4MTAqaW5kZXgpOwogCi0JCWlmIChDSElQX0lTX0UyKGJwKSkKKwkJaWYgKCFDSElQX0lTX0UxeChicCkpCiAJCQkvKgogCQkJICogZW5hYmxlNSBpcyBzZXBhcmF0ZSBmcm9tIHRoZSByZXN0IG9mIHRoZSByZWdpc3RlcnMsCiAJCQkgKiBhbmQgdGhlcmVmb3JlIHRoZSBhZGRyZXNzIHNraXAgaXMgNApAQCAtNDE4NSw3ICs0OTM4LDcgQEAKIAogCQlSRUdfV1IoYnAsIHJlZ19vZmZzZXQsIFU2NF9MTyhzZWN0aW9uKSk7CiAJCVJFR19XUihicCwgcmVnX29mZnNldCArIDQsIFU2NF9ISShzZWN0aW9uKSk7Ci0JfSBlbHNlIGlmIChDSElQX0lTX0UyKGJwKSkgeworCX0gZWxzZSBpZiAoIUNISVBfSVNfRTF4KGJwKSkgewogCQlSRUdfV1IoYnAsIElHVV9SRUdfQVRUTl9NU0dfQUREUl9MLCBVNjRfTE8oc2VjdGlvbikpOwogCQlSRUdfV1IoYnAsIElHVV9SRUdfQVRUTl9NU0dfQUREUl9ILCBVNjRfSEkoc2VjdGlvbikpOwogCX0KQEAgLTQxOTUsNiArNDk0OCw3IEBACiAKIAlibngyeF96ZXJvX3NwX3NiKGJwKTsKIAorCXNwX3NiX2RhdGEuc3RhdGUJCT0gU0JfRU5BQkxFRDsKIAlzcF9zYl9kYXRhLmhvc3Rfc2JfYWRkci5sbwk9IFU2NF9MTyhzZWN0aW9uKTsKIAlzcF9zYl9kYXRhLmhvc3Rfc2JfYWRkci5oaQk9IFU2NF9ISShzZWN0aW9uKTsKIAlzcF9zYl9kYXRhLmlndV9zYl9pZAkJPSBpZ3Vfc3Bfc2JfaW5kZXg7CkBAIC00MjA1LDkgKzQ5NTksNiBAQAogCiAJYm54Mnhfd3Jfc3Bfc2JfZGF0YShicCwgJnNwX3NiX2RhdGEpOwogCi0JYnAtPnN0YXRzX3BlbmRpbmcgPSAwOwotCWJwLT5zZXRfbWFjX3BlbmRpbmcgPSAwOwotCiAJYm54MnhfYWNrX3NiKGJwLCBicC0+aWd1X2RzYl9pZCwgVVNUT1JNX0lELCAwLCBJR1VfSU5UX0VOQUJMRSwgMCk7CiB9CiAKQEAgLTQyNTMsMTQ2ICs1MDA0LDEyOSBAQAogCQltaW5fdChpbnQsIE1BWF9TUF9ERVNDX0NOVCAtIE1BWF9TUFFfUEVORElORywgTlVNX0VRX0RFU0MpIC0gMSk7CiB9CiAKLXZvaWQgYm54MnhfcHVzaF9pbmRpcl90YWJsZShzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBmdW5jID0gQlBfRlVOQyhicCk7Ci0JaW50IGk7CiAKLQlpZiAoYnAtPm11bHRpX21vZGUgPT0gRVRIX1JTU19NT0RFX0RJU0FCTEVEKQorLyogY2FsbGVkIHdpdGggbmV0aWZfYWRkcl9sb2NrX2JoKCkgKi8KK3ZvaWQgYm54Mnhfc2V0X3FfcnhfbW9kZShzdHJ1Y3QgYm54MnggKmJwLCB1OCBjbF9pZCwKKwkJCSB1bnNpZ25lZCBsb25nIHJ4X21vZGVfZmxhZ3MsCisJCQkgdW5zaWduZWQgbG9uZyByeF9hY2NlcHRfZmxhZ3MsCisJCQkgdW5zaWduZWQgbG9uZyB0eF9hY2NlcHRfZmxhZ3MsCisJCQkgdW5zaWduZWQgbG9uZyByYW1yb2RfZmxhZ3MpCit7CisJc3RydWN0IGJueDJ4X3J4X21vZGVfcmFtcm9kX3BhcmFtcyByYW1yb2RfcGFyYW07CisJaW50IHJjOworCisJbWVtc2V0KCZyYW1yb2RfcGFyYW0sIDAsIHNpemVvZihyYW1yb2RfcGFyYW0pKTsKKworCS8qIFByZXBhcmUgcmFtcm9kIHBhcmFtZXRlcnMgKi8KKwlyYW1yb2RfcGFyYW0uY2lkID0gMDsKKwlyYW1yb2RfcGFyYW0uY2xfaWQgPSBjbF9pZDsKKwlyYW1yb2RfcGFyYW0ucnhfbW9kZV9vYmogPSAmYnAtPnJ4X21vZGVfb2JqOworCXJhbXJvZF9wYXJhbS5mdW5jX2lkID0gQlBfRlVOQyhicCk7CisKKwlyYW1yb2RfcGFyYW0ucHN0YXRlID0gJmJwLT5zcF9zdGF0ZTsKKwlyYW1yb2RfcGFyYW0uc3RhdGUgPSBCTlgyWF9GSUxURVJfUlhfTU9ERV9QRU5ESU5HOworCisJcmFtcm9kX3BhcmFtLnJkYXRhID0gYm54Mnhfc3AoYnAsIHJ4X21vZGVfcmRhdGEpOworCXJhbXJvZF9wYXJhbS5yZGF0YV9tYXBwaW5nID0gYm54Mnhfc3BfbWFwcGluZyhicCwgcnhfbW9kZV9yZGF0YSk7CisKKwlzZXRfYml0KEJOWDJYX0ZJTFRFUl9SWF9NT0RFX1BFTkRJTkcsICZicC0+c3Bfc3RhdGUpOworCisJcmFtcm9kX3BhcmFtLnJhbXJvZF9mbGFncyA9IHJhbXJvZF9mbGFnczsKKwlyYW1yb2RfcGFyYW0ucnhfbW9kZV9mbGFncyA9IHJ4X21vZGVfZmxhZ3M7CisKKwlyYW1yb2RfcGFyYW0ucnhfYWNjZXB0X2ZsYWdzID0gcnhfYWNjZXB0X2ZsYWdzOworCXJhbXJvZF9wYXJhbS50eF9hY2NlcHRfZmxhZ3MgPSB0eF9hY2NlcHRfZmxhZ3M7CisKKwlyYyA9IGJueDJ4X2NvbmZpZ19yeF9tb2RlKGJwLCAmcmFtcm9kX3BhcmFtKTsKKwlpZiAocmMgPCAwKSB7CisJCUJOWDJYX0VSUigiU2V0IHJ4X21vZGUgJWQgZmFpbGVkXG4iLCBicC0+cnhfbW9kZSk7CiAJCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBUU1RPUk1fSU5ESVJFQ1RJT05fVEFCTEVfU0laRTsgaSsrKQotCQlSRUdfV1I4KGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkJVFNUT1JNX0lORElSRUNUSU9OX1RBQkxFX09GRlNFVChmdW5jKSArIGksCi0JCQlicC0+ZnAtPmNsX2lkICsgYnAtPnJ4X2luZGlyX3RhYmxlW2ldKTsKKwl9CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJ4X2luaXRfaW5kX3RhYmxlKHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVFNUT1JNX0lORElSRUNUSU9OX1RBQkxFX1NJWkU7IGkrKykKLQkJYnAtPnJ4X2luZGlyX3RhYmxlW2ldID0gaSAlIEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKTsKLQotCWJueDJ4X3B1c2hfaW5kaXJfdGFibGUoYnApOwotfQotCisvKiBjYWxsZWQgd2l0aCBuZXRpZl9hZGRyX2xvY2tfYmgoKSAqLwogdm9pZCBibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShzdHJ1Y3QgYm54MnggKmJwKQogewotCWludCBtb2RlID0gYnAtPnJ4X21vZGU7Ci0JaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQl1MTYgY2xfaWQ7Ci0JdTMyIGRlZl9xX2ZpbHRlcnMgPSAwOworCXVuc2lnbmVkIGxvbmcgcnhfbW9kZV9mbGFncyA9IDAsIHJhbXJvZF9mbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyByeF9hY2NlcHRfZmxhZ3MgPSAwLCB0eF9hY2NlcHRfZmxhZ3MgPSAwOwogCi0JLyogQWxsIGJ1dCBtYW5hZ2VtZW50IHVuaWNhc3QgcGFja2V0cyBzaG91bGQgcGFzcyB0byB0aGUgaG9zdCBhcyB3ZWxsICovCi0JdTMyIGxsaF9tYXNrID0KLQkJTklHX0xMSDBfQlJCMV9EUlZfTUFTS19SRUdfTExIMF9CUkIxX0RSVl9NQVNLX0JSQ1NUIHwKLQkJTklHX0xMSDBfQlJCMV9EUlZfTUFTS19SRUdfTExIMF9CUkIxX0RSVl9NQVNLX01MQ1NUIHwKLQkJTklHX0xMSDBfQlJCMV9EUlZfTUFTS19SRUdfTExIMF9CUkIxX0RSVl9NQVNLX1ZMQU4gfAotCQlOSUdfTExIMF9CUkIxX0RSVl9NQVNLX1JFR19MTEgwX0JSQjFfRFJWX01BU0tfTk9fVkxBTjsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgQk5YMlhfUlhfTU9ERV9OT05FOiAvKiBubyBSeCAqLwotCQlkZWZfcV9maWx0ZXJzID0gQk5YMlhfQUNDRVBUX05PTkU7CiAjaWZkZWYgQkNNX0NOSUMKLQkJaWYgKCFOT19GQ09FKGJwKSkgewotCQkJY2xfaWQgPSBibngyeF9mY29lKGJwLCBjbF9pZCk7Ci0JCQlibngyeF9yeHFfc2V0X21hY19maWx0ZXJzKGJwLCBjbF9pZCwgQk5YMlhfQUNDRVBUX05PTkUpOwotCQl9Ci0jZW5kaWYKLQkJYnJlYWs7CisJaWYgKCFOT19GQ09FKGJwKSkKIAorCQkvKiBDb25maWd1cmUgcnhfbW9kZSBvZiBGQ29FIFF1ZXVlICovCisJCV9fc2V0X2JpdChCTlgyWF9SWF9NT0RFX0ZDT0VfRVRILCAmcnhfbW9kZV9mbGFncyk7CisjZW5kaWYKKworCXN3aXRjaCAoYnAtPnJ4X21vZGUpIHsKKwljYXNlIEJOWDJYX1JYX01PREVfTk9ORToKKwkJLyoKKwkJICogJ2Ryb3AgYWxsJyBzdXBlcnNlZGVzIGFueSBhY2NlcHQgZmxhZ3MgdGhhdCBtYXkgaGF2ZSBiZWVuCisJCSAqIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCisJCSAqLworCQlicmVhazsKIAljYXNlIEJOWDJYX1JYX01PREVfTk9STUFMOgotCQlkZWZfcV9maWx0ZXJzIHw9IEJOWDJYX0FDQ0VQVF9VTklDQVNUIHwgQk5YMlhfQUNDRVBUX0JST0FEQ0FTVCB8Ci0JCQkJQk5YMlhfQUNDRVBUX01VTFRJQ0FTVDsKLSNpZmRlZiBCQ01fQ05JQwotCQlpZiAoIU5PX0ZDT0UoYnApKSB7Ci0JCQljbF9pZCA9IGJueDJ4X2Zjb2UoYnAsIGNsX2lkKTsKLQkJCWJueDJ4X3J4cV9zZXRfbWFjX2ZpbHRlcnMoYnAsIGNsX2lkLAotCQkJCQkJICBCTlgyWF9BQ0NFUFRfVU5JQ0FTVCB8Ci0JCQkJCQkgIEJOWDJYX0FDQ0VQVF9NVUxUSUNBU1QpOwotCQl9Ci0jZW5kaWYKLQkJYnJlYWs7CisJCV9fc2V0X2JpdChCTlgyWF9BQ0NFUFRfVU5JQ0FTVCwgJnJ4X2FjY2VwdF9mbGFncyk7CisJCV9fc2V0X2JpdChCTlgyWF9BQ0NFUFRfTVVMVElDQVNULCAmcnhfYWNjZXB0X2ZsYWdzKTsKKwkJX19zZXRfYml0KEJOWDJYX0FDQ0VQVF9CUk9BRENBU1QsICZyeF9hY2NlcHRfZmxhZ3MpOwogCisJCS8qIGludGVybmFsIHN3aXRjaGluZyBtb2RlICovCisJCV9fc2V0X2JpdChCTlgyWF9BQ0NFUFRfVU5JQ0FTVCwgJnR4X2FjY2VwdF9mbGFncyk7CisJCV9fc2V0X2JpdChCTlgyWF9BQ0NFUFRfTVVMVElDQVNULCAmdHhfYWNjZXB0X2ZsYWdzKTsKKwkJX19zZXRfYml0KEJOWDJYX0FDQ0VQVF9CUk9BRENBU1QsICZ0eF9hY2NlcHRfZmxhZ3MpOworCisJCWJyZWFrOwogCWNhc2UgQk5YMlhfUlhfTU9ERV9BTExNVUxUSToKLQkJZGVmX3FfZmlsdGVycyB8PSBCTlgyWF9BQ0NFUFRfVU5JQ0FTVCB8IEJOWDJYX0FDQ0VQVF9CUk9BRENBU1QgfAotCQkJCUJOWDJYX0FDQ0VQVF9BTExfTVVMVElDQVNUOwotI2lmZGVmIEJDTV9DTklDCi0JCS8qCi0JCSAqICBQcmV2ZW50IGR1cGxpY2F0aW9uIG9mIG11bHRpY2FzdCBwYWNrZXRzIGJ5IGNvbmZpZ3VyaW5nIEZDb0UKLQkJICogIEwyIENsaWVudCB0byByZWNlaXZlIG9ubHkgbWF0Y2hlZCB1bmljYXN0IGZyYW1lcy4KLQkJICovCi0JCWlmICghTk9fRkNPRShicCkpIHsKLQkJCWNsX2lkID0gYm54MnhfZmNvZShicCwgY2xfaWQpOwotCQkJYm54MnhfcnhxX3NldF9tYWNfZmlsdGVycyhicCwgY2xfaWQsCi0JCQkJCQkgIEJOWDJYX0FDQ0VQVF9VTklDQVNUKTsKLQkJfQotI2VuZGlmCi0JCWJyZWFrOworCQlfX3NldF9iaXQoQk5YMlhfQUNDRVBUX1VOSUNBU1QsICZyeF9hY2NlcHRfZmxhZ3MpOworCQlfX3NldF9iaXQoQk5YMlhfQUNDRVBUX0FMTF9NVUxUSUNBU1QsICZyeF9hY2NlcHRfZmxhZ3MpOworCQlfX3NldF9iaXQoQk5YMlhfQUNDRVBUX0JST0FEQ0FTVCwgJnJ4X2FjY2VwdF9mbGFncyk7CiAKKwkJLyogaW50ZXJuYWwgc3dpdGNoaW5nIG1vZGUgKi8KKwkJX19zZXRfYml0KEJOWDJYX0FDQ0VQVF9VTklDQVNULCAmdHhfYWNjZXB0X2ZsYWdzKTsKKwkJX19zZXRfYml0KEJOWDJYX0FDQ0VQVF9BTExfTVVMVElDQVNULCAmdHhfYWNjZXB0X2ZsYWdzKTsKKwkJX19zZXRfYml0KEJOWDJYX0FDQ0VQVF9CUk9BRENBU1QsICZ0eF9hY2NlcHRfZmxhZ3MpOworCisJCWJyZWFrOwogCWNhc2UgQk5YMlhfUlhfTU9ERV9QUk9NSVNDOgotCQlkZWZfcV9maWx0ZXJzIHw9IEJOWDJYX1BST01JU0NVT1VTX01PREU7Ci0jaWZkZWYgQkNNX0NOSUMKLQkJLyoKLQkJICogIFByZXZlbnQgcGFja2V0cyBkdXBsaWNhdGlvbiBieSBjb25maWd1cmluZyBEUk9QX0FMTCBmb3IgRkNvRQotCQkgKiAgTDIgQ2xpZW50LgorCQkvKiBBY2NvcmRpbmcgdG8gZGVmZmluaXRpb24gb2YgU0kgbW9kZSwgaWZhY2UgaW4gcHJvbWlzYyBtb2RlCisJCSAqIHNob3VsZCByZWNlaXZlIG1hdGNoZWQgYW5kIHVubWF0Y2hlZCAoaW4gcmVzb2x1dGlvbiBvZiBwb3J0KQorCQkgKiB1bmljYXN0IHBhY2tldHMuCiAJCSAqLwotCQlpZiAoIU5PX0ZDT0UoYnApKSB7Ci0JCQljbF9pZCA9IGJueDJ4X2Zjb2UoYnAsIGNsX2lkKTsKLQkJCWJueDJ4X3J4cV9zZXRfbWFjX2ZpbHRlcnMoYnAsIGNsX2lkLCBCTlgyWF9BQ0NFUFRfTk9ORSk7Ci0JCX0KLSNlbmRpZgotCQkvKiBwYXNzIG1hbmFnZW1lbnQgdW5pY2FzdCBwYWNrZXRzIGFzIHdlbGwgKi8KLQkJbGxoX21hc2sgfD0gTklHX0xMSDBfQlJCMV9EUlZfTUFTS19SRUdfTExIMF9CUkIxX0RSVl9NQVNLX1VOQ1NUOwotCQlicmVhazsKKwkJX19zZXRfYml0KEJOWDJYX0FDQ0VQVF9VTk1BVENIRUQsICZyeF9hY2NlcHRfZmxhZ3MpOworCQlfX3NldF9iaXQoQk5YMlhfQUNDRVBUX1VOSUNBU1QsICZyeF9hY2NlcHRfZmxhZ3MpOworCQlfX3NldF9iaXQoQk5YMlhfQUNDRVBUX0FMTF9NVUxUSUNBU1QsICZyeF9hY2NlcHRfZmxhZ3MpOworCQlfX3NldF9iaXQoQk5YMlhfQUNDRVBUX0JST0FEQ0FTVCwgJnJ4X2FjY2VwdF9mbGFncyk7CiAKLQlkZWZhdWx0OgotCQlCTlgyWF9FUlIoIkJBRCByeCBtb2RlICglZClcbiIsIG1vZGUpOworCQkvKiBpbnRlcm5hbCBzd2l0Y2hpbmcgbW9kZSAqLworCQlfX3NldF9iaXQoQk5YMlhfQUNDRVBUX0FMTF9NVUxUSUNBU1QsICZ0eF9hY2NlcHRfZmxhZ3MpOworCQlfX3NldF9iaXQoQk5YMlhfQUNDRVBUX0JST0FEQ0FTVCwgJnR4X2FjY2VwdF9mbGFncyk7CisKKwkJaWYgKElTX01GX1NJKGJwKSkKKwkJCV9fc2V0X2JpdChCTlgyWF9BQ0NFUFRfQUxMX1VOSUNBU1QsICZ0eF9hY2NlcHRfZmxhZ3MpOworCQllbHNlCisJCQlfX3NldF9iaXQoQk5YMlhfQUNDRVBUX1VOSUNBU1QsICZ0eF9hY2NlcHRfZmxhZ3MpOworCiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiVW5rbm93biByeF9tb2RlOiAlZFxuIiwgYnAtPnJ4X21vZGUpOworCQlyZXR1cm47CiAJfQogCi0JY2xfaWQgPSBCUF9MX0lEKGJwKTsKLQlibngyeF9yeHFfc2V0X21hY19maWx0ZXJzKGJwLCBjbF9pZCwgZGVmX3FfZmlsdGVycyk7CisJaWYgKGJwLT5yeF9tb2RlICE9IEJOWDJYX1JYX01PREVfTk9ORSkgeworCQlfX3NldF9iaXQoQk5YMlhfQUNDRVBUX0FOWV9WTEFOLCAmcnhfYWNjZXB0X2ZsYWdzKTsKKwkJX19zZXRfYml0KEJOWDJYX0FDQ0VQVF9BTllfVkxBTiwgJnR4X2FjY2VwdF9mbGFncyk7CisJfQogCi0JUkVHX1dSKGJwLAotCSAgICAgICAocG9ydCA/IE5JR19SRUdfTExIMV9CUkIxX0RSVl9NQVNLIDoKLQkJICAgICAgIE5JR19SRUdfTExIMF9CUkIxX0RSVl9NQVNLKSwgbGxoX21hc2spOworCV9fc2V0X2JpdChSQU1ST0RfUlgsICZyYW1yb2RfZmxhZ3MpOworCV9fc2V0X2JpdChSQU1ST0RfVFgsICZyYW1yb2RfZmxhZ3MpOwogCi0JRFAoTkVUSUZfTVNHX0lGVVAsICJyeCBtb2RlICVkXG4iCi0JCSJkcm9wX3VjYXN0IDB4JXhcbmRyb3BfbWNhc3QgMHgleFxuZHJvcF9iY2FzdCAweCV4XG4iCi0JCSJhY2NwX3VjYXN0IDB4JXhcbmFjY3BfbWNhc3QgMHgleFxuYWNjcF9iY2FzdCAweCV4XG4iCi0JCSJ1bm1hdGNoZWRfdWNhc3QgMHgleFxuIiwgbW9kZSwKLQkJYnAtPm1hY19maWx0ZXJzLnVjYXN0X2Ryb3BfYWxsLAotCQlicC0+bWFjX2ZpbHRlcnMubWNhc3RfZHJvcF9hbGwsCi0JCWJwLT5tYWNfZmlsdGVycy5iY2FzdF9kcm9wX2FsbCwKLQkJYnAtPm1hY19maWx0ZXJzLnVjYXN0X2FjY2VwdF9hbGwsCi0JCWJwLT5tYWNfZmlsdGVycy5tY2FzdF9hY2NlcHRfYWxsLAotCQlicC0+bWFjX2ZpbHRlcnMuYmNhc3RfYWNjZXB0X2FsbCwKLQkJYnAtPm1hY19maWx0ZXJzLnVubWF0Y2hlZF91bmljYXN0Ci0JKTsKLQotCXN0b3JtX21lbXNldF9tYWNfZmlsdGVycyhicCwgJmJwLT5tYWNfZmlsdGVycywgQlBfRlVOQyhicCkpOworCWJueDJ4X3NldF9xX3J4X21vZGUoYnAsIGJwLT5mcC0+Y2xfaWQsIHJ4X21vZGVfZmxhZ3MsIHJ4X2FjY2VwdF9mbGFncywKKwkJCSAgICB0eF9hY2NlcHRfZmxhZ3MsIHJhbXJvZF9mbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X2luaXRfaW50ZXJuYWxfY29tbW9uKHN0cnVjdCBibngyeCAqYnApCiB7CiAJaW50IGk7CiAKLQlpZiAoIUNISVBfSVNfRTEoYnApKSB7Ci0KLQkJLyogeHN0b3JtIG5lZWRzIHRvIGtub3cgd2hldGhlciB0byBhZGQgIG92bGFuIHRvIHBhY2tldHMgb3Igbm90LAotCQkgKiBpbiBzd2l0Y2gtaW5kZXBlbmRlbnQgd2UnbGwgd3JpdGUgMCB0byBoZXJlLi4uICovCi0JCVJFR19XUjgoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSArIFhTVE9STV9GVU5DVElPTl9NT0RFX09GRlNFVCwKLQkJCWJwLT5tZl9tb2RlKTsKLQkJUkVHX1dSOChicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsgVFNUT1JNX0ZVTkNUSU9OX01PREVfT0ZGU0VULAotCQkJYnAtPm1mX21vZGUpOwotCQlSRUdfV1I4KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKyBDU1RPUk1fRlVOQ1RJT05fTU9ERV9PRkZTRVQsCi0JCQlicC0+bWZfbW9kZSk7Ci0JCVJFR19XUjgoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArIFVTVE9STV9GVU5DVElPTl9NT0RFX09GRlNFVCwKLQkJCWJwLT5tZl9tb2RlKTsKLQl9Ci0KIAlpZiAoSVNfTUZfU0koYnApKQogCQkvKgogCQkgKiBJbiBzd2l0Y2ggaW5kZXBlbmRlbnQgbW9kZSwgdGhlIFRTVE9STSBuZWVkcyB0byBhY2NlcHQKQEAgLTQ0MDEsMjUgKzUxMzUsMjIgQEAKIAkJICovCiAJCVJFR19XUjgoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSArCiAJCQkgICAgVFNUT1JNX0FDQ0VQVF9DTEFTU0lGWV9GQUlMRURfT0ZGU0VULCAyKTsKKwllbHNlIGlmICghQ0hJUF9JU19FMShicCkpIC8qIDU3NzEwIGRvZXNuJ3Qgc3VwcG9ydCBNRiAqLworCQlSRUdfV1I4KGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKworCQkJICAgIFRTVE9STV9BQ0NFUFRfQ0xBU1NJRllfRkFJTEVEX09GRlNFVCwgMCk7CiAKIAkvKiBaZXJvIHRoaXMgbWFudWFsbHkgYXMgaXRzIGluaXRpYWxpemF0aW9uIGlzCiAJICAgY3VycmVudGx5IG1pc3NpbmcgaW4gdGhlIGluaXRUb29sICovCiAJZm9yIChpID0gMDsgaSA8IChVU1RPUk1fQUdHX0RBVEFfU0laRSA+PiAyKTsgaSsrKQogCQlSRUdfV1IoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSArCiAJCSAgICAgICBVU1RPUk1fQUdHX0RBVEFfT0ZGU0VUICsgaSAqIDQsIDApOwotCWlmIChDSElQX0lTX0UyKGJwKSkgeworCWlmICghQ0hJUF9JU19FMXgoYnApKSB7CiAJCVJFR19XUjgoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArIENTVE9STV9JR1VfTU9ERV9PRkZTRVQsCiAJCQlDSElQX0lOVF9NT0RFX0lTX0JDKGJwKSA/CiAJCQlIQ19JR1VfQkNfTU9ERSA6IEhDX0lHVV9OQkNfTU9ERSk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBibngyeF9pbml0X2ludGVybmFsX3BvcnQoc3RydWN0IGJueDJ4ICpicCkKLXsKLQkvKiBwb3J0ICovCi0JYm54MnhfZGNiX2luaXRfaW50bWVtX3BmYyhicCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGJueDJ4X2luaXRfaW50ZXJuYWwoc3RydWN0IGJueDJ4ICpicCwgdTMyIGxvYWRfY29kZSkKIHsKIAlzd2l0Y2ggKGxvYWRfY29kZSkgewpAQCAtNDQyOSw3ICs1MTYwLDcgQEAKIAkJLyogbm8gYnJlYWsgKi8KIAogCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfUE9SVDoKLQkJYm54MnhfaW5pdF9pbnRlcm5hbF9wb3J0KGJwKTsKKwkJLyogbm90aGluZyB0byBkbyAqLwogCQkvKiBubyBicmVhayAqLwogCiAJY2FzZSBGV19NU0dfQ09ERV9EUlZfTE9BRF9GVU5DVElPTjoKQEAgLTQ0NDMsMzEgKzUxNzQsNzAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJ4X2luaXRfZnBfc2Ioc3RydWN0IGJueDJ4ICpicCwgaW50IGZwX2lkeCkKK3N0YXRpYyBpbmxpbmUgdTggYm54MnhfZnBfaWd1X3NiX2lkKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCit7CisJcmV0dXJuIGZwLT5icC0+aWd1X2Jhc2Vfc2IgKyBmcC0+aW5kZXggKyBDTklDX1BSRVNFTlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggYm54MnhfZnBfZndfc2JfaWQoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwlyZXR1cm4gZnAtPmJwLT5iYXNlX2Z3X25kc2IgKyBmcC0+aW5kZXggKyBDTklDX1BSRVNFTlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggYm54MnhfZnBfY2xfaWQoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwlpZiAoQ0hJUF9JU19FMXgoZnAtPmJwKSkKKwkJcmV0dXJuIEJQX0xfSUQoZnAtPmJwKSArIGZwLT5pbmRleDsKKwllbHNlCS8qIFdlIHdhbnQgQ2xpZW50IElEIHRvIGJlIHRoZSBzYW1lIGFzIElHVSBTQiBJRCBmb3IgNTc3MTIgKi8KKwkJcmV0dXJuIGJueDJ4X2ZwX2lndV9zYl9pZChmcCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2luaXRfZXRoX2ZwKHN0cnVjdCBibngyeCAqYnAsIGludCBmcF9pZHgpCiB7CiAJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbZnBfaWR4XTsKLQotCWZwLT5zdGF0ZSA9IEJOWDJYX0ZQX1NUQVRFX0NMT1NFRDsKKwl1OCBjb3M7CisJdW5zaWduZWQgbG9uZyBxX3R5cGUgPSAwOworCXUzMiBjaWRzW0JOWDJYX01VTFRJX1RYX0NPU10gPSB7IDAgfTsKIAogCWZwLT5jaWQgPSBmcF9pZHg7Ci0JZnAtPmNsX2lkID0gQlBfTF9JRChicCkgKyBmcF9pZHg7Ci0JZnAtPmZ3X3NiX2lkID0gYnAtPmJhc2VfZndfbmRzYiArIGZwLT5jbF9pZCArIENOSUNfQ09OVEVYVF9VU0U7Ci0JZnAtPmlndV9zYl9pZCA9IGJwLT5pZ3VfYmFzZV9zYiArIGZwX2lkeCArIENOSUNfQ09OVEVYVF9VU0U7CisJZnAtPmNsX2lkID0gYm54MnhfZnBfY2xfaWQoZnApOworCWZwLT5md19zYl9pZCA9IGJueDJ4X2ZwX2Z3X3NiX2lkKGZwKTsKKwlmcC0+aWd1X3NiX2lkID0gYm54MnhfZnBfaWd1X3NiX2lkKGZwKTsKIAkvKiBxWm9uZSBpZCBlcXVhbHMgdG8gRlcgKHBlciBwYXRoKSBjbGllbnQgaWQgKi8KLQlmcC0+Y2xfcXpvbmVfaWQgID0gZnAtPmNsX2lkICsKLQkJCSAgIEJQX1BPUlQoYnApKihDSElQX0lTX0UyKGJwKSA/IEVUSF9NQVhfUlhfQ0xJRU5UU19FMiA6Ci0JCQkJRVRIX01BWF9SWF9DTElFTlRTX0UxSCk7CisJZnAtPmNsX3F6b25lX2lkICA9IGJueDJ4X2ZwX3F6b25lX2lkKGZwKTsKKwogCS8qIGluaXQgc2hvcnRjdXQgKi8KLQlmcC0+dXN0b3JtX3J4X3Byb2RzX29mZnNldCA9IENISVBfSVNfRTIoYnApID8KLQkJCSAgICBVU1RPUk1fUlhfUFJPRFNfRTJfT0ZGU0VUKGZwLT5jbF9xem9uZV9pZCkgOgotCQkJICAgIFVTVE9STV9SWF9QUk9EU19FMVhfT0ZGU0VUKEJQX1BPUlQoYnApLCBmcC0+Y2xfaWQpOworCWZwLT51c3Rvcm1fcnhfcHJvZHNfb2Zmc2V0ID0gYm54MnhfcnhfdXN0b3JtX3Byb2RzX29mZnNldChmcCk7CiAJLyogU2V0dXAgU0IgaW5kaWNpZXMgKi8KIAlmcC0+cnhfY29uc19zYiA9IEJOWDJYX1JYX1NCX0lOREVYOwotCWZwLT50eF9jb25zX3NiID0gQk5YMlhfVFhfU0JfSU5ERVg7CisKKwkvKiBDb25maWd1cmUgUXVldWUgU3RhdGUgb2JqZWN0ICovCisJX19zZXRfYml0KEJOWDJYX1FfVFlQRV9IQVNfUlgsICZxX3R5cGUpOworCV9fc2V0X2JpdChCTlgyWF9RX1RZUEVfSEFTX1RYLCAmcV90eXBlKTsKKworCUJVR19PTihmcC0+bWF4X2NvcyA+IEJOWDJYX01VTFRJX1RYX0NPUyk7CisKKwkvKiBpbml0IHR4IGRhdGEgKi8KKwlmb3JfZWFjaF9jb3NfaW5fdHhfcXVldWUoZnAsIGNvcykgeworCQlibngyeF9pbml0X3R4ZGF0YShicCwgJmZwLT50eGRhdGFbY29zXSwKKwkJCQkgIENJRF9DT1NfVE9fVFhfT05MWV9DSUQoZnAtPmNpZCwgY29zKSwKKwkJCQkgIEZQX0NPU19UT19UWFEoZnAsIGNvcyksCisJCQkJICBCTlgyWF9UWF9TQl9JTkRFWF9CQVNFICsgY29zKTsKKwkJY2lkc1tjb3NdID0gZnAtPnR4ZGF0YVtjb3NdLmNpZDsKKwl9CisKKwlibngyeF9pbml0X3F1ZXVlX29iaihicCwgJmZwLT5xX29iaiwgZnAtPmNsX2lkLCBjaWRzLCBmcC0+bWF4X2NvcywKKwkJCSAgICAgQlBfRlVOQyhicCksIGJueDJ4X3NwKGJwLCBxX3JkYXRhKSwKKwkJCSAgICAgYm54Mnhfc3BfbWFwcGluZyhicCwgcV9yZGF0YSksIHFfdHlwZSk7CisKKwkvKioKKwkgKiBDb25maWd1cmUgY2xhc3NpZmljYXRpb24gREJzOiBBbHdheXMgZW5hYmxlIFR4IHN3aXRjaGluZworCSAqLworCWJueDJ4X2luaXRfdmxhbl9tYWNfZnBfb2JqcyhmcCwgQk5YMlhfT0JKX1RZUEVfUlhfVFgpOwogCiAJRFAoTkVUSUZfTVNHX0lGVVAsICJxdWV1ZVslZF06ICBibngyeF9pbml0X3NiKCVwLCVwKSAgIgogCQkJCSAgICJjbF9pZCAlZCAgZndfc2IgJWQgIGlndV9zYiAlZFxuIiwKLQkJICAgZnBfaWR4LCBicCwgZnAtPnN0YXR1c19ibGsuZTF4X3NiLCBmcC0+Y2xfaWQsIGZwLT5md19zYl9pZCwKKwkJICAgZnBfaWR4LCBicCwgZnAtPnN0YXR1c19ibGsuZTJfc2IsIGZwLT5jbF9pZCwgZnAtPmZ3X3NiX2lkLAogCQkgICBmcC0+aWd1X3NiX2lkKTsKIAlibngyeF9pbml0X3NiKGJwLCBmcC0+c3RhdHVzX2Jsa19tYXBwaW5nLCBCTlgyWF9WRl9JRF9JTlZBTElELCBmYWxzZSwKIAkJICAgICAgZnAtPmZ3X3NiX2lkLCBmcC0+aWd1X3NiX2lkKTsKQEAgLTQ0ODAsMTcgKzUyNTAsMjEgQEAKIAlpbnQgaTsKIAogCWZvcl9lYWNoX2V0aF9xdWV1ZShicCwgaSkKLQkJYm54MnhfaW5pdF9mcF9zYihicCwgaSk7CisJCWJueDJ4X2luaXRfZXRoX2ZwKGJwLCBpKTsKICNpZmRlZiBCQ01fQ05JQwogCWlmICghTk9fRkNPRShicCkpCiAJCWJueDJ4X2luaXRfZmNvZV9mcChicCk7CiAKIAlibngyeF9pbml0X3NiKGJwLCBicC0+Y25pY19zYl9tYXBwaW5nLAogCQkgICAgICBCTlgyWF9WRl9JRF9JTlZBTElELCBmYWxzZSwKLQkJICAgICAgQ05JQ19TQl9JRChicCksIENOSUNfSUdVX1NCX0lEKGJwKSk7CisJCSAgICAgIGJueDJ4X2NuaWNfZndfc2JfaWQoYnApLCBibngyeF9jbmljX2lndV9zYl9pZChicCkpOwogCiAjZW5kaWYKIAorCS8qIEluaXRpYWxpemUgTU9EX0FCUyBpbnRlcnJ1cHRzICovCisJYm54MnhfaW5pdF9tb2RfYWJzX2ludChicCwgJmJwLT5saW5rX3ZhcnMsIGJwLT5jb21tb24uY2hpcF9pZCwKKwkJCSAgICAgICBicC0+Y29tbW9uLnNobWVtX2Jhc2UsIGJwLT5jb21tb24uc2htZW0yX2Jhc2UsCisJCQkgICAgICAgQlBfUE9SVChicCkpOwogCS8qIGVuc3VyZSBzdGF0dXMgYmxvY2sgaW5kaWNlcyB3ZXJlIHJlYWQgKi8KIAlybWIoKTsKIApAQCAtNDUwMiwxMiArNTI3Niw4IEBACiAJYm54MnhfaW5pdF9lcV9yaW5nKGJwKTsKIAlibngyeF9pbml0X2ludGVybmFsKGJwLCBsb2FkX2NvZGUpOwogCWJueDJ4X3BmX2luaXQoYnApOwotCWJueDJ4X2luaXRfaW5kX3RhYmxlKGJwKTsKIAlibngyeF9zdGF0c19pbml0KGJwKTsKIAotCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGFyZSByZWFkeSBmb3IgaW50ZXJydXB0cyAqLwotCWF0b21pY19zZXQoJmJwLT5pbnRyX3NlbSwgMCk7Ci0KIAkvKiBmbHVzaCBhbGwgYmVmb3JlIGVuYWJsaW5nIGludGVycnVwdHMgKi8KIAltYigpOwogCW1taW93YigpOwpAQCAtNDUzNyw4ICs1MzA3LDcgQEAKIAlpZiAoYnAtPnN0cm0gID09IE5VTEwpCiAJCWdvdG8gZ3VuemlwX25vbWVtMjsKIAotCWJwLT5zdHJtLT53b3Jrc3BhY2UgPSBrbWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCksCi0JCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJYnAtPnN0cm0tPndvcmtzcGFjZSA9IHZtYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CiAJaWYgKGJwLT5zdHJtLT53b3Jrc3BhY2UgPT0gTlVMTCkKIAkJZ290byBndW56aXBfbm9tZW0zOwogCkBAIC00NTYyLDcgKzUzMzEsNyBAQAogc3RhdGljIHZvaWQgYm54MnhfZ3VuemlwX2VuZChzdHJ1Y3QgYm54MnggKmJwKQogewogCWlmIChicC0+c3RybSkgewotCQlrZnJlZShicC0+c3RybS0+d29ya3NwYWNlKTsKKwkJdmZyZWUoYnAtPnN0cm0tPndvcmtzcGFjZSk7CiAJCWtmcmVlKGJwLT5zdHJtKTsKIAkJYnAtPnN0cm0gPSBOVUxMOwogCX0KQEAgLTQ3MTEsOCArNTQ4MCw4IEBACiAJbXNsZWVwKDUwKTsKIAlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1NFVCwgMHgwMyk7CiAJbXNsZWVwKDUwKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBCUkIxX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFBSU19CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19CUkIxLCBQSEFTRV9DT01NT04pOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1BSUywgUEhBU0VfQ09NTU9OKTsKIAogCURQKE5FVElGX01TR19IVywgInBhcnQyXG4iKTsKIApAQCAtNDc3Niw4ICs1NTQ1LDggQEAKIAltc2xlZXAoNTApOwogCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfU0VULCAweDAzKTsKIAltc2xlZXAoNTApOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIEJSQjFfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgUFJTX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX0JSQjEsIFBIQVNFX0NPTU1PTik7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfUFJTLCBQSEFTRV9DT01NT04pOwogI2lmbmRlZiBCQ01fQ05JQwogCS8qIHNldCBOSUMgbW9kZSAqLwogCVJFR19XUihicCwgUFJTX1JFR19OSUNfTU9ERSwgMSk7CkBAIC00Nzk3LDcgKzU1NjYsNyBAQAogc3RhdGljIHZvaWQgYm54MnhfZW5hYmxlX2Jsb2Nrc19hdHRlbnRpb24oc3RydWN0IGJueDJ4ICpicCkKIHsKIAlSRUdfV1IoYnAsIFBYUF9SRUdfUFhQX0lOVF9NQVNLXzAsIDApOwotCWlmIChDSElQX0lTX0UyKGJwKSkKKwlpZiAoIUNISVBfSVNfRTF4KGJwKSkKIAkJUkVHX1dSKGJwLCBQWFBfUkVHX1BYUF9JTlRfTUFTS18xLCAweDQwKTsKIAllbHNlCiAJCVJFR19XUihicCwgUFhQX1JFR19QWFBfSU5UX01BU0tfMSwgMCk7CkBAIC00ODMxLDcgKzU2MDAsNyBAQAogCiAJaWYgKENISVBfUkVWX0lTX0ZQR0EoYnApKQogCQlSRUdfV1IoYnAsIFBYUDJfUkVHX1BYUDJfSU5UX01BU0tfMCwgMHg1ODAwMDApOwotCWVsc2UgaWYgKENISVBfSVNfRTIoYnApKQorCWVsc2UgaWYgKCFDSElQX0lTX0UxeChicCkpCiAJCVJFR19XUihicCwgUFhQMl9SRUdfUFhQMl9JTlRfTUFTS18wLAogCQkJICAgKFBYUDJfUFhQMl9JTlRfTUFTS18wX1JFR19QR0xfQ1BMX09GCiAJCQkJfCBQWFAyX1BYUDJfSU5UX01BU0tfMF9SRUdfUEdMX0NQTF9BRlQKQEAgLTQ4NDQsNyArNTYxMywxMSBAQAogCVJFR19XUihicCwgVFNETV9SRUdfVFNETV9JTlRfTUFTS18xLCAwKTsKIAlSRUdfV1IoYnAsIFRDTV9SRUdfVENNX0lOVF9NQVNLLCAwKTsKIC8qCVJFR19XUihicCwgVFNFTV9SRUdfVFNFTV9JTlRfTUFTS18wLCAwKTsgKi8KLS8qCVJFR19XUihicCwgVFNFTV9SRUdfVFNFTV9JTlRfTUFTS18xLCAwKTsgKi8KKworCWlmICghQ0hJUF9JU19FMXgoYnApKQorCQkvKiBlbmFibGUgVkZDIGF0dGVudGlvbnM6IGJpdHMgMTEgYW5kIDEyLCBiaXRzIDMxOjEzIHJlc2VydmVkICovCisJCVJFR19XUihicCwgVFNFTV9SRUdfVFNFTV9JTlRfTUFTS18xLCAweDA3ZmYpOworCiAJUkVHX1dSKGJwLCBDRFVfUkVHX0NEVV9JTlRfTUFTSywgMCk7CiAJUkVHX1dSKGJwLCBETUFFX1JFR19ETUFFX0lOVF9NQVNLLCAwKTsKIC8qCVJFR19XUihicCwgTUlTQ19SRUdfTUlTQ19JTlRfTUFTSywgMCk7ICovCkBAIC00ODUzLDEwICs1NjI2LDI0IEBACiAKIHN0YXRpYyB2b2lkIGJueDJ4X3Jlc2V0X2NvbW1vbihzdHJ1Y3QgYm54MnggKmJwKQogeworCXUzMiB2YWwgPSAweDE0MDA7CisKIAkvKiByZXNldF9jb21tb24gKi8KIAlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX0NMRUFSLAogCSAgICAgICAweGQzZmZmZjdmKTsKLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSLCAweDE0MDMpOworCisJaWYgKENISVBfSVNfRTMoYnApKSB7CisJCXZhbCB8PSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9NU1RBVDA7CisJCXZhbCB8PSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9NU1RBVDE7CisJfQorCisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9DTEVBUiwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfc2V0dXBfZG1hZShzdHJ1Y3QgYm54MnggKmJwKQoreworCWJwLT5kbWFlX3JlYWR5ID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmYnAtPmRtYWVfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X2luaXRfcHhwKHN0cnVjdCBibngyeCAqYnApCkBAIC00ODY1LDcgKzU2NTIsNyBAQAogCWludCByX29yZGVyLCB3X29yZGVyOwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnAtPnBkZXYsCi0JCQkgICAgIGJwLT5wY2llX2NhcCArIFBDSV9FWFBfREVWQ1RMLCAmZGV2Y3RsKTsKKwkJCSAgICAgcGNpX3BjaWVfY2FwKGJwLT5wZGV2KSArIFBDSV9FWFBfREVWQ1RMLCAmZGV2Y3RsKTsKIAlEUChORVRJRl9NU0dfSFcsICJyZWFkIDB4JXggZnJvbSBkZXZjdGxcbiIsIGRldmN0bCk7CiAJd19vcmRlciA9ICgoZGV2Y3RsICYgUENJX0VYUF9ERVZDVExfUEFZTE9BRCkgPj4gNSk7CiAJaWYgKGJwLT5tcnJzID09IC0xKQpAQCAtNDk3Myw3ICs1NzYwLDcgQEAKIAlEUChORVRJRl9NU0dfSFcsICJQcmV0ZW5kaW5nIHRvIGZ1bmMgJWRcbiIsIHByZXRlbmRfZnVuY19udW0pOwogfQogCi1zdGF0aWMgdm9pZCBibngyeF9wZl9kaXNhYmxlKHN0cnVjdCBibngyeCAqYnApCit2b2lkIGJueDJ4X3BmX2Rpc2FibGUoc3RydWN0IGJueDJ4ICpicCkKIHsKIAl1MzIgdmFsID0gUkVHX1JEKGJwLCBJR1VfUkVHX1BGX0NPTkZJR1VSQVRJT04pOwogCXZhbCAmPSB+SUdVX1BGX0NPTkZfRlVOQ19FTjsKQEAgLTQ5ODMsMjIgKzU3NzAsNDggQEAKIAlSRUdfV1IoYnAsIENGQ19SRUdfV0VBS19FTkFCTEVfUEYsIDApOwogfQogCi1zdGF0aWMgaW50IGJueDJ4X2luaXRfaHdfY29tbW9uKHN0cnVjdCBibngyeCAqYnAsIHUzMiBsb2FkX2NvZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfX2NvbW1vbl9pbml0X3BoeShzdHJ1Y3QgYm54MnggKmJwKQogewotCXUzMiB2YWwsIGk7CisJdTMyIHNobWVtX2Jhc2VbMl0sIHNobWVtMl9iYXNlWzJdOworCXNobWVtX2Jhc2VbMF0gPSAgYnAtPmNvbW1vbi5zaG1lbV9iYXNlOworCXNobWVtMl9iYXNlWzBdID0gYnAtPmNvbW1vbi5zaG1lbTJfYmFzZTsKKwlpZiAoIUNISVBfSVNfRTF4KGJwKSkgeworCQlzaG1lbV9iYXNlWzFdID0KKwkJCVNITUVNMl9SRChicCwgb3RoZXJfc2htZW1fYmFzZV9hZGRyKTsKKwkJc2htZW0yX2Jhc2VbMV0gPQorCQkJU0hNRU0yX1JEKGJwLCBvdGhlcl9zaG1lbTJfYmFzZV9hZGRyKTsKKwl9CisJYm54MnhfYWNxdWlyZV9waHlfbG9jayhicCk7CisJYm54MnhfY29tbW9uX2luaXRfcGh5KGJwLCBzaG1lbV9iYXNlLCBzaG1lbTJfYmFzZSwKKwkJCSAgICAgIGJwLT5jb21tb24uY2hpcF9pZCk7CisJYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7Cit9CisKKy8qKgorICogYm54MnhfaW5pdF9od19jb21tb24gLSBpbml0aWFsaXplIHRoZSBIVyBhdCB0aGUgQ09NTU9OIHBoYXNlLgorICoKKyAqIEBicDoJCWRyaXZlciBoYW5kbGUKKyAqLworc3RhdGljIGludCBibngyeF9pbml0X2h3X2NvbW1vbihzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWw7CiAKIAlEUChCTlgyWF9NU0dfTUNQLCAic3RhcnRpbmcgY29tbW9uIGluaXQgIGZ1bmMgJWRcbiIsIEJQX0FCU19GVU5DKGJwKSk7CiAKIAlibngyeF9yZXNldF9jb21tb24oYnApOwogCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfU0VULCAweGZmZmZmZmZmKTsKLQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1NFVCwgMHhmZmZjKTsKIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIE1JU0NfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JaWYgKCFDSElQX0lTX0UxKGJwKSkKLQkJUkVHX1dSKGJwLCBNSVNDX1JFR19FMUhNRl9NT0RFLCBJU19NRihicCkpOworCXZhbCA9IDB4ZmZmYzsKKwlpZiAoQ0hJUF9JU19FMyhicCkpIHsKKwkJdmFsIHw9IE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX01TVEFUMDsKKwkJdmFsIHw9IE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX01TVEFUMTsKKwl9CisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9TRVQsIHZhbCk7CiAKLQlpZiAoQ0hJUF9JU19FMihicCkpIHsKLQkJdTggZmlkOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX01JU0MsIFBIQVNFX0NPTU1PTik7CisKKwlpZiAoIUNISVBfSVNfRTF4KGJwKSkgeworCQl1OCBhYnNfZnVuY19pZDsKIAogCQkvKioKIAkJICogNC1wb3J0IG1vZGUgb3IgMi1wb3J0IG1vZGUgd2UgbmVlZCB0byB0dXJuIG9mIG1hc3Rlci1lbmFibGUKQEAgLTUwMDcsMjkgKzU4MjAsMzAgQEAKIAkJICogZm9yIGFsbCBmdW5jdGlvbnMgb24gdGhlIGdpdmVuIHBhdGgsIHRoaXMgbWVhbnMgMCwyLDQsNiBmb3IKIAkJICogcGF0aCAwIGFuZCAxLDMsNSw3IGZvciBwYXRoIDEKIAkJICovCi0JCWZvciAoZmlkID0gQlBfUEFUSChicCk7IGZpZCAgPCBFMl9GVU5DX01BWCoyOyBmaWQgKz0gMikgewotCQkJaWYgKGZpZCA9PSBCUF9BQlNfRlVOQyhicCkpIHsKKwkJZm9yIChhYnNfZnVuY19pZCA9IEJQX1BBVEgoYnApOworCQkgICAgIGFic19mdW5jX2lkIDwgRTJfRlVOQ19NQVgqMjsgYWJzX2Z1bmNfaWQgKz0gMikgeworCQkJaWYgKGFic19mdW5jX2lkID09IEJQX0FCU19GVU5DKGJwKSkgewogCQkJCVJFR19XUihicCwKIAkJCQkgICAgUEdMVUVfQl9SRUdfSU5URVJOQUxfUEZJRF9FTkFCTEVfTUFTVEVSLAogCQkJCSAgICAxKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJYm54MnhfcHJldGVuZF9mdW5jKGJwLCBmaWQpOworCQkJYm54MnhfcHJldGVuZF9mdW5jKGJwLCBhYnNfZnVuY19pZCk7CiAJCQkvKiBjbGVhciBwZiBlbmFibGUgKi8KIAkJCWJueDJ4X3BmX2Rpc2FibGUoYnApOwogCQkJYm54MnhfcHJldGVuZF9mdW5jKGJwLCBCUF9BQlNfRlVOQyhicCkpOwogCQl9CiAJfQogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgUFhQX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1BYUCwgUEhBU0VfQ09NTU9OKTsKIAlpZiAoQ0hJUF9JU19FMShicCkpIHsKIAkJLyogZW5hYmxlIEhXIGludGVycnVwdCBmcm9tIFBYUCBvbiBVU0RNIG92ZXJmbG93CiAJCSAgIGJpdCAxNiBvbiBJTlRfTUFTS18wICovCiAJCVJFR19XUihicCwgUFhQX1JFR19QWFBfSU5UX01BU0tfMCwgMCk7CiAJfQogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgUFhQMl9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19QWFAyLCBQSEFTRV9DT01NT04pOwogCWJueDJ4X2luaXRfcHhwKGJwKTsKIAogI2lmZGVmIF9fQklHX0VORElBTgpAQCAtNTA3Miw3ICs1ODg2LDY5IEBACiAJICogVGhpcyBuZWVkcyB0byBiZSBkb25lIGJ5IHRoZSBmaXJzdCBQRiB0aGF0IGlzIGxvYWRlZCBpbiBhIHBhdGgKIAkgKiAoaS5lLiBjb21tb24gcGhhc2UpCiAJICovCi0JaWYgKENISVBfSVNfRTIoYnApKSB7CisJaWYgKCFDSElQX0lTX0UxeChicCkpIHsKKy8qIEluIEUyIHRoZXJlIGlzIGEgYnVnIGluIHRoZSB0aW1lcnMgYmxvY2sgdGhhdCBjYW4gY2F1c2UgZnVuY3Rpb24gNiAvIDcKKyAqIChpLmUuIHZuaWMzKSB0byBzdGFydCBldmVuIGlmIGl0IGlzIG1hcmtlZCBhcyAic2Nhbi1vZmYiLgorICogVGhpcyBvY2N1cnMgd2hlbiBhIGRpZmZlcmVudCBmdW5jdGlvbiAoZnVuYzIsMykgaXMgYmVpbmcgbWFya2VkCisgKiBhcyAic2Nhbi1vZmYiLiBSZWFsLWxpZmUgc2NlbmFyaW8gZm9yIGV4YW1wbGU6IGlmIGEgZHJpdmVyIGlzIGJlaW5nCisgKiBsb2FkLXVubG9hZGVkIHdoaWxlIGZ1bmM2LDcgYXJlIGRvd24uIFRoaXMgd2lsbCBjYXVzZSB0aGUgdGltZXIgdG8gYWNjZXNzCisgKiB0aGUgaWx0LCB0cmFuc2xhdGUgdG8gYSBsb2dpY2FsIGFkZHJlc3MgYW5kIHNlbmQgYSByZXF1ZXN0IHRvIHJlYWQvd3JpdGUuCisgKiBTaW5jZSB0aGUgaWx0IGZvciB0aGUgZnVuY3Rpb24gdGhhdCBpcyBkb3duIGlzIG5vdCB2YWxpZCwgdGhpcyB3aWxsIGNhdXNlCisgKiBhIHRyYW5zbGF0aW9uIGVycm9yIHdoaWNoIGlzIHVucmVjb3ZlcmFibGUuCisgKiBUaGUgV29ya2Fyb3VuZCBpcyBpbnRlbmRlZCB0byBtYWtlIHN1cmUgdGhhdCB3aGVuIHRoaXMgaGFwcGVucyBub3RoaW5nIGZhdGFsCisgKiB3aWxsIG9jY3VyLiBUaGUgd29ya2Fyb3VuZDoKKyAqCTEuICBGaXJzdCBQRiBkcml2ZXIgd2hpY2ggbG9hZHMgb24gYSBwYXRoIHdpbGw6CisgKgkJYS4gIEFmdGVyIHRha2luZyB0aGUgY2hpcCBvdXQgb2YgcmVzZXQsIGJ5IHVzaW5nIHByZXRlbmQsCisgKgkJICAgIGl0IHdpbGwgd3JpdGUgIjAiIHRvIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzIG9mCisgKgkJICAgIHRoZSBvdGhlciB2bmljcy4KKyAqCQkgICAgUkVHX1dSKHBkZXYsIFBHTFVFX0JfUkVHX0lOVEVSTkFMX1BGSURfRU5BQkxFX01BU1RFUiwgMCk7CisgKgkJICAgIFJFR19XUihwZGV2LCBDRkNfUkVHX1dFQUtfRU5BQkxFX1BGLDApOworICoJCSAgICBSRUdfV1IocGRldiwgQ0ZDX1JFR19TVFJPTkdfRU5BQkxFX1BGLDApOworICoJCSAgICBBbmQgZm9yIGl0c2VsZiBpdCB3aWxsIHdyaXRlICcxJyB0bworICoJCSAgICBQR0xVRV9CX1JFR19JTlRFUk5BTF9QRklEX0VOQUJMRV9NQVNURVIgdG8gZW5hYmxlCisgKgkJICAgIGRtYWUtb3BlcmF0aW9ucyAod3JpdGluZyB0byBwcmFtIGZvciBleGFtcGxlLikKKyAqCQkgICAgbm90ZTogY2FuIGJlIGRvbmUgZm9yIG9ubHkgZnVuY3Rpb24gNiw3IGJ1dCBjbGVhbmVyIHRoaXMKKyAqCQkJICB3YXkuCisgKgkJYi4gIFdyaXRlIHplcm8rdmFsaWQgdG8gdGhlIGVudGlyZSBJTFQuCisgKgkJYy4gIEluaXQgdGhlIGZpcnN0X3RpbWVyc19pbHRfZW50cnksIGxhc3RfdGltZXJzX2lsdF9lbnRyeSBvZgorICoJCSAgICBWTklDMyAob2YgdGhhdCBwb3J0KS4gVGhlIHJhbmdlIGFsbG9jYXRlZCB3aWxsIGJlIHRoZQorICoJCSAgICBlbnRpcmUgSUxULiBUaGlzIGlzIG5lZWRlZCB0byBwcmV2ZW50ICBJTFQgcmFuZ2UgZXJyb3IuCisgKgkyLiAgQW55IFBGIGRyaXZlciBsb2FkIGZsb3c6CisgKgkJYS4gIElMVCB1cGRhdGUgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzc2VzIG9mIHRoZSBhbGxvY2F0ZWQKKyAqCQkgICAgbG9naWNhbCBwYWdlcy4KKyAqCQliLiAgV2FpdCAyMG1zZWMuIC0gbm90ZSB0aGF0IHRoaXMgdGltZW91dCBpcyBuZWVkZWQgdG8gbWFrZQorICoJCSAgICBzdXJlIHRoZXJlIGFyZSBubyByZXF1ZXN0cyBpbiBvbmUgb2YgdGhlIFBYUCBpbnRlcm5hbAorICoJCSAgICBxdWV1ZXMgd2l0aCAib2xkIiBJTFQgYWRkcmVzc2VzLgorICoJCWMuICBQRiBlbmFibGUgaW4gdGhlIFBHTEMuCisgKgkJZC4gIENsZWFyIHRoZSB3YXNfZXJyb3Igb2YgdGhlIFBGIGluIHRoZSBQR0xDLiAoY291bGQgaGF2ZQorICoJCSAgICBvY2N1cmVkIHdoaWxlIGRyaXZlciB3YXMgZG93bikKKyAqCQllLiAgUEYgZW5hYmxlIGluIHRoZSBDRkMgKFdFQUsgKyBTVFJPTkcpCisgKgkJZi4gIFRpbWVycyBzY2FuIGVuYWJsZQorICoJMy4gIFBGIGRyaXZlciB1bmxvYWQgZmxvdzoKKyAqCQlhLiAgQ2xlYXIgdGhlIFRpbWVycyBzY2FuX2VuLgorICoJCWIuICBQb2xsaW5nIGZvciBzY2FuX29uPTAgZm9yIHRoYXQgUEYuCisgKgkJYy4gIENsZWFyIHRoZSBQRiBlbmFibGUgYml0IGluIHRoZSBQWFAuCisgKgkJZC4gIENsZWFyIHRoZSBQRiBlbmFibGUgaW4gdGhlIENGQyAoV0VBSyArIFNUUk9ORykKKyAqCQllLiAgV3JpdGUgemVybyt2YWxpZCB0byBhbGwgSUxUIGVudHJpZXMgKFRoZSB2YWxpZCBiaXQgbXVzdAorICoJCSAgICBzdGF5IHNldCkKKyAqCQlmLiAgSWYgdGhpcyBpcyBWTklDIDMgb2YgYSBwb3J0IHRoZW4gYWxzbyBpbml0CisgKgkJICAgIGZpcnN0X3RpbWVyc19pbHRfZW50cnkgdG8gemVybyBhbmQgbGFzdF90aW1lcnNfaWx0X2VudHJ5CisgKgkJICAgIHRvIHRoZSBsYXN0IGVucnR5IGluIHRoZSBJTFQuCisgKgorICoJTm90ZXM6CisgKglDdXJyZW50bHkgdGhlIFBGIGVycm9yIGluIHRoZSBQR0xDIGlzIG5vbiByZWNvdmVyYWJsZS4KKyAqCUluIHRoZSBmdXR1cmUgdGhlIHRoZXJlIHdpbGwgYmUgYSByZWNvdmVyeSByb3V0aW5lIGZvciB0aGlzIGVycm9yLgorICoJQ3VycmVudGx5IGF0dGVudGlvbiBpcyBtYXNrZWQuCisgKglIYXZpbmcgYW4gTUNQIGxvY2sgb24gdGhlIGxvYWQvdW5sb2FkIHByb2Nlc3MgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQKKyAqCXRoZXJlIGlzIG5vIFRpbWVyIGRpc2FibGUgZHVyaW5nIEZ1bmM2LzcgZW5hYmxlLiBUaGlzIGlzIGJlY2F1c2UgdGhlCisgKglUaW1lcnMgc2NhbiBpcyBjdXJyZW50bHkgYmVpbmcgY2xlYXJlZCBieSB0aGUgTUNQIG9uIEZMUi4KKyAqCVN0ZXAgMi5kIGNhbiBiZSBkb25lIG9ubHkgZm9yIFBGNi83IGFuZCB0aGUgZHJpdmVyIGNhbiBhbHNvIGNoZWNrIGlmCisgKgl0aGVyZSBpcyBlcnJvciBiZWZvcmUgY2xlYXJpbmcgaXQuIEJ1dCB0aGUgZmxvdyBhYm92ZSBpcyBzaW1wbGVyIGFuZAorICoJbW9yZSBnZW5lcmFsLgorICoJQWxsIElMVCBlbnRyaWVzIGFyZSB3cml0dGVuIGJ5IHplcm8rdmFsaWQgYW5kIG5vdCBqdXN0IFBGNi83CisgKglJTFQgZW50cmllcyBzaW5jZSBpbiB0aGUgZnV0dXJlIHRoZSBJTFQgZW50cmllcyBhbGxvY2F0aW9uIGZvcgorICoJUEYtcyBtaWdodCBiZSBkeW5hbWljLgorICovCiAJCXN0cnVjdCBpbHRfY2xpZW50X2luZm8gaWx0X2NsaTsKIAkJc3RydWN0IGJueDJ4X2lsdCBpbHQ7CiAJCW1lbXNldCgmaWx0X2NsaSwgMCwgc2l6ZW9mKHN0cnVjdCBpbHRfY2xpZW50X2luZm8pKTsKQEAgLTUwODYsNyArNTk2Miw3IEBACiAJCS8qIFN0ZXAgMTogc2V0IHplcm9lcyB0byBhbGwgaWx0IHBhZ2UgZW50cmllcyB3aXRoIHZhbGlkIGJpdCBvbgogCQkgKiBTdGVwIDI6IHNldCB0aGUgdGltZXJzIGZpcnN0L2xhc3QgaWx0IGVudHJ5IHRvIHBvaW50CiAJCSAqIHRvIHRoZSBlbnRpcmUgcmFuZ2UgdG8gcHJldmVudCBJTFQgcmFuZ2UgZXJyb3IgZm9yIDNyZC80dGgKLQkJICogdm5pYwkodGhpcyBjb2RlIGFzc3VtZXMgZXhpc3RlbmNlIG9mIHRoZSB2bmljKQorCQkgKiB2bmljCSh0aGlzIGNvZGUgYXNzdW1lcyBleGlzdGFuY2Ugb2YgdGhlIHZuaWMpCiAJCSAqCiAJCSAqIGJvdGggc3RlcHMgcGVyZm9ybWVkIGJ5IGNhbGwgdG8gYm54MnhfaWx0X2NsaWVudF9pbml0X29wKCkKIAkJICogd2l0aCBkdW1teSBUTSBjbGllbnQKQEAgLTUxMDcsMTIgKzU5ODMsMTIgQEAKIAlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX0RJU0FCTEVfSU5QVVRTLCAwKTsKIAlSRUdfV1IoYnAsIFBYUDJfUkVHX1JEX0RJU0FCTEVfSU5QVVRTLCAwKTsKIAotCWlmIChDSElQX0lTX0UyKGJwKSkgeworCWlmICghQ0hJUF9JU19FMXgoYnApKSB7CiAJCWludCBmYWN0b3IgPSBDSElQX1JFVl9JU19FTVVMKGJwKSA/IDEwMDAgOgogCQkJCShDSElQX1JFVl9JU19GUEdBKGJwKSA/IDQwMCA6IDApOwotCQlibngyeF9pbml0X2Jsb2NrKGJwLCBQR0xVRV9CX0JMT0NLLCBDT01NT05fU1RBR0UpOworCQlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19QR0xVRV9CLCBQSEFTRV9DT01NT04pOwogCi0JCWJueDJ4X2luaXRfYmxvY2soYnAsIEFUQ19CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwkJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfQVRDLCBQSEFTRV9DT01NT04pOwogCiAJCS8qIGxldCB0aGUgSFcgZG8gaXQncyBtYWdpYyAuLi4gKi8KIAkJZG8gewpAQCAtNTEyNiwyNiArNjAwMiwyNyBAQAogCQl9CiAJfQogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgRE1BRV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19ETUFFLCBQSEFTRV9DT01NT04pOwogCiAJLyogY2xlYW4gdGhlIERNQUUgbWVtb3J5ICovCiAJYnAtPmRtYWVfcmVhZHkgPSAxOwotCWJueDJ4X2luaXRfZmlsbChicCwgVFNFTV9SRUdfUFJBTSwgMCwgOCk7CisJYm54MnhfaW5pdF9maWxsKGJwLCBUU0VNX1JFR19QUkFNLCAwLCA4LCAxKTsKIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIFRDTV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBVQ01fQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgQ0NNX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFhDTV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19UQ00sIFBIQVNFX0NPTU1PTik7CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19VQ00sIFBIQVNFX0NPTU1PTik7CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19DQ00sIFBIQVNFX0NPTU1PTik7CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19YQ00sIFBIQVNFX0NPTU1PTik7CiAKIAlibngyeF9yZWFkX2RtYWUoYnAsIFhTRU1fUkVHX1BBU1NJVkVfQlVGRkVSLCAzKTsKIAlibngyeF9yZWFkX2RtYWUoYnAsIENTRU1fUkVHX1BBU1NJVkVfQlVGRkVSLCAzKTsKIAlibngyeF9yZWFkX2RtYWUoYnAsIFRTRU1fUkVHX1BBU1NJVkVfQlVGRkVSLCAzKTsKIAlibngyeF9yZWFkX2RtYWUoYnAsIFVTRU1fUkVHX1BBU1NJVkVfQlVGRkVSLCAzKTsKIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIFFNX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1FNLCBQSEFTRV9DT01NT04pOwogCi0JaWYgKENISVBfTU9ERV9JU180X1BPUlQoYnApKQotCQlibngyeF9pbml0X2Jsb2NrKGJwLCBRTV80UE9SVF9CTE9DSywgQ09NTU9OX1NUQUdFKTsKIAogCS8qIFFNIHF1ZXVlcyBwb2ludGVycyB0YWJsZSAqLwogCWJueDJ4X3FtX2luaXRfcHRyX3RhYmxlKGJwLCBicC0+cW1fY2lkX2NvdW50LCBJTklUT1BfU0VUKTsKQEAgLTUxNTUsNTcgKzYwMzIsNTEgQEAKIAlSRUdfV1IoYnAsIFFNX1JFR19TT0ZUX1JFU0VULCAwKTsKIAogI2lmZGVmIEJDTV9DTklDCi0JYm54MnhfaW5pdF9ibG9jayhicCwgVElNRVJTX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1RNLCBQSEFTRV9DT01NT04pOwogI2VuZGlmCiAKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBEUV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19ET1JRLCBQSEFTRV9DT01NT04pOwogCVJFR19XUihicCwgRE9SUV9SRUdfRFBNX0NJRF9PRlNULCBCTlgyWF9EQl9TSElGVCk7Ci0KLQlpZiAoIUNISVBfUkVWX0lTX1NMT1coYnApKSB7CisJaWYgKCFDSElQX1JFVl9JU19TTE9XKGJwKSkKIAkJLyogZW5hYmxlIGh3IGludGVycnVwdCBmcm9tIGRvb3JiZWxsIFEgKi8KIAkJUkVHX1dSKGJwLCBET1JRX1JFR19ET1JRX0lOVF9NQVNLLCAwKTsKLQl9CiAKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBCUkIxX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWlmIChDSElQX01PREVfSVNfNF9QT1JUKGJwKSkgewotCQlSRUdfV1IoYnAsIEJSQjFfUkVHX0ZVTExfTEJfWE9GRl9USFJFU0hPTEQsIDI0OCk7Ci0JCVJFR19XUihicCwgQlJCMV9SRUdfRlVMTF9MQl9YT05fVEhSRVNIT0xELCAzMjgpOwotCX0KKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19CUkIxLCBQSEFTRV9DT01NT04pOwogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgUFJTX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1BSUywgUEhBU0VfQ09NTU9OKTsKIAlSRUdfV1IoYnAsIFBSU19SRUdfQV9QUlNVXzIwLCAweGYpOwotI2lmbmRlZiBCQ01fQ05JQwotCS8qIHNldCBOSUMgbW9kZSAqLwotCVJFR19XUihicCwgUFJTX1JFR19OSUNfTU9ERSwgMSk7Ci0jZW5kaWYKLQlpZiAoIUNISVBfSVNfRTEoYnApKQotCQlSRUdfV1IoYnAsIFBSU19SRUdfRTFIT1ZfTU9ERSwgSVNfTUZfU0QoYnApKTsKIAotCWlmIChDSElQX0lTX0UyKGJwKSkgewotCQkvKiBCaXQtbWFwIGluZGljYXRpbmcgd2hpY2ggTDIgaGRycyBtYXkgYXBwZWFyIGFmdGVyIHRoZQotCQkgICBiYXNpYyBFdGhlcm5ldCBoZWFkZXIgKi8KLQkJaW50IGhhc19vdmxhbiA9IElTX01GX1NEKGJwKTsKLQkJUkVHX1dSKGJwLCBQUlNfUkVHX0hEUlNfQUZURVJfQkFTSUMsIChoYXNfb3ZsYW4gPyA3IDogNikpOwotCQlSRUdfV1IoYnAsIFBSU19SRUdfTVVTVF9IQVZFX0hEUlMsIChoYXNfb3ZsYW4gPyAxIDogMCkpOworCWlmICghQ0hJUF9JU19FMShicCkpCisJCVJFR19XUihicCwgUFJTX1JFR19FMUhPVl9NT0RFLCBicC0+cGF0aF9oYXNfb3ZsYW4pOworCisJaWYgKCFDSElQX0lTX0UxeChicCkgJiYgIUNISVBfSVNfRTNCMChicCkpCisJCS8qIEJpdC1tYXAgaW5kaWNhdGluZyB3aGljaCBMMiBoZHJzIG1heSBhcHBlYXIKKwkJICogYWZ0ZXIgdGhlIGJhc2ljIEV0aGVybmV0IGhlYWRlcgorCQkgKi8KKwkJUkVHX1dSKGJwLCBQUlNfUkVHX0hEUlNfQUZURVJfQkFTSUMsCisJCSAgICAgICBicC0+cGF0aF9oYXNfb3ZsYW4gPyA3IDogNik7CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19UU0RNLCBQSEFTRV9DT01NT04pOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX0NTRE0sIFBIQVNFX0NPTU1PTik7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfVVNETSwgUEhBU0VfQ09NTU9OKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19YU0RNLCBQSEFTRV9DT01NT04pOworCisJaWYgKCFDSElQX0lTX0UxeChicCkpIHsKKwkJLyogcmVzZXQgVkZDIG1lbW9yaWVzICovCisJCVJFR19XUihicCwgVFNFTV9SRUdfRkFTVF9NRU1PUlkgKyBWRkNfUkVHX01FTU9SSUVTX1JTVCwKKwkJCSAgIFZGQ19NRU1PUklFU19SU1RfUkVHX0NBTV9SU1QgfAorCQkJICAgVkZDX01FTU9SSUVTX1JTVF9SRUdfUkFNX1JTVCk7CisJCVJFR19XUihicCwgWFNFTV9SRUdfRkFTVF9NRU1PUlkgKyBWRkNfUkVHX01FTU9SSUVTX1JTVCwKKwkJCSAgIFZGQ19NRU1PUklFU19SU1RfUkVHX0NBTV9SU1QgfAorCQkJICAgVkZDX01FTU9SSUVTX1JTVF9SRUdfUkFNX1JTVCk7CisKKwkJbXNsZWVwKDIwKTsKIAl9CiAKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBUU0RNX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIENTRE1fQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgVVNETV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBYU0RNX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCi0JYm54MnhfaW5pdF9maWxsKGJwLCBUU0VNX1JFR19GQVNUX01FTU9SWSwgMCwgU1RPUk1fSU5UTUVNX1NJWkUoYnApKTsKLQlibngyeF9pbml0X2ZpbGwoYnAsIFVTRU1fUkVHX0ZBU1RfTUVNT1JZLCAwLCBTVE9STV9JTlRNRU1fU0laRShicCkpOwotCWJueDJ4X2luaXRfZmlsbChicCwgQ1NFTV9SRUdfRkFTVF9NRU1PUlksIDAsIFNUT1JNX0lOVE1FTV9TSVpFKGJwKSk7Ci0JYm54MnhfaW5pdF9maWxsKGJwLCBYU0VNX1JFR19GQVNUX01FTU9SWSwgMCwgU1RPUk1fSU5UTUVNX1NJWkUoYnApKTsKLQotCWJueDJ4X2luaXRfYmxvY2soYnAsIFRTRU1fQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgVVNFTV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBDU0VNX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFhTRU1fQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0KLQlpZiAoQ0hJUF9NT0RFX0lTXzRfUE9SVChicCkpCi0JCWJueDJ4X2luaXRfYmxvY2soYnAsIFhTRU1fNFBPUlRfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfVFNFTSwgUEhBU0VfQ09NTU9OKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19VU0VNLCBQSEFTRV9DT01NT04pOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX0NTRU0sIFBIQVNFX0NPTU1PTik7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfWFNFTSwgUEhBU0VfQ09NTU9OKTsKIAogCS8qIHN5bmMgc2VtaSBydGMgKi8KIAlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX0NMRUFSLApAQCAtNTIxMywyMSArNjA4NCwxOCBAQAogCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfU0VULAogCSAgICAgICAweDgwMDAwMDAwKTsKIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIFVQQl9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBYUEJfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgUEJGX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1VQQiwgUEhBU0VfQ09NTU9OKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19YUEIsIFBIQVNFX0NPTU1PTik7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfUEJGLCBQSEFTRV9DT01NT04pOwogCi0JaWYgKENISVBfSVNfRTIoYnApKSB7Ci0JCWludCBoYXNfb3ZsYW4gPSBJU19NRl9TRChicCk7Ci0JCVJFR19XUihicCwgUEJGX1JFR19IRFJTX0FGVEVSX0JBU0lDLCAoaGFzX292bGFuID8gNyA6IDYpKTsKLQkJUkVHX1dSKGJwLCBQQkZfUkVHX01VU1RfSEFWRV9IRFJTLCAoaGFzX292bGFuID8gMSA6IDApKTsKLQl9CisJaWYgKCFDSElQX0lTX0UxeChicCkpCisJCVJFR19XUihicCwgUEJGX1JFR19IRFJTX0FGVEVSX0JBU0lDLAorCQkgICAgICAgYnAtPnBhdGhfaGFzX292bGFuID8gNyA6IDYpOwogCiAJUkVHX1dSKGJwLCBTUkNfUkVHX1NPRlRfUlNULCAxKTsKLQlmb3IgKGkgPSBTUkNfUkVHX0tFWVJTUzBfMDsgaSA8PSBTUkNfUkVHX0tFWVJTUzFfOTsgaSArPSA0KQotCQlSRUdfV1IoYnAsIGksIHJhbmRvbTMyKCkpOwogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgU1JDSF9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19TUkMsIFBIQVNFX0NPTU1PTik7CisKICNpZmRlZiBCQ01fQ05JQwogCVJFR19XUihicCwgU1JDX1JFR19LRVlTRUFSQ0hfMCwgMHg2MzI4NTY3Mik7CiAJUkVHX1dSKGJwLCBTUkNfUkVHX0tFWVNFQVJDSF8xLCAweDI0YjhmMmNjKTsKQEAgLTUyNDgsMTEgKzYxMTYsMTEgQEAKIAkJCQkJICAib2YgY2R1X2NvbnRleHQoJWxkKVxuIiwKIAkJCSAobG9uZylzaXplb2YodW5pb24gY2R1X2NvbnRleHQpKTsKIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIENEVV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19DRFUsIFBIQVNFX0NPTU1PTik7CiAJdmFsID0gKDQgPDwgMjQpICsgKDAgPDwgMTIpICsgMTAyNDsKIAlSRUdfV1IoYnAsIENEVV9SRUdfQ0RVX0dMT0JBTF9QQVJBTVMsIHZhbCk7CiAKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBDRkNfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfQ0ZDLCBQSEFTRV9DT01NT04pOwogCVJFR19XUihicCwgQ0ZDX1JFR19JTklUX1JFRywgMHg3RkYpOwogCS8qIGVuYWJsZSBjb250ZXh0IHZhbGlkYXRpb24gaW50ZXJydXB0IGZyb20gQ0ZDICovCiAJUkVHX1dSKGJwLCBDRkNfUkVHX0NGQ19JTlRfTUFTSywgMCk7CkBAIC01MjYwLDIwICs2MTI4LDE5IEBACiAJLyogc2V0IHRoZSB0aHJlc2hvbGRzIHRvIHByZXZlbnQgQ0ZDL0NEVSByYWNlICovCiAJUkVHX1dSKGJwLCBDRkNfUkVHX0RFQlVHMCwgMHgyMDAyMDAwMCk7CiAKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBIQ19CTE9DSywgQ09NTU9OX1NUQUdFKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19IQywgUEhBU0VfQ09NTU9OKTsKIAotCWlmIChDSElQX0lTX0UyKGJwKSAmJiBCUF9OT01DUChicCkpCisJaWYgKCFDSElQX0lTX0UxeChicCkgJiYgQlBfTk9NQ1AoYnApKQogCQlSRUdfV1IoYnAsIElHVV9SRUdfUkVTRVRfTUVNT1JJRVMsIDB4MzYpOwogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgSUdVX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIE1JU0NfQUVVX0JMT0NLLCBDT01NT05fU1RBR0UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX0lHVSwgUEhBU0VfQ09NTU9OKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19NSVNDX0FFVSwgUEhBU0VfQ09NTU9OKTsKIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIFBYUENTX0JMT0NLLCBDT01NT05fU1RBR0UpOwogCS8qIFJlc2V0IFBDSUUgZXJyb3JzIGZvciBkZWJ1ZyAqLwogCVJFR19XUihicCwgMHgyODE0LCAweGZmZmZmZmZmKTsKIAlSRUdfV1IoYnAsIDB4MzgyMCwgMHhmZmZmZmZmZik7CiAKLQlpZiAoQ0hJUF9JU19FMihicCkpIHsKKwlpZiAoIUNISVBfSVNfRTF4KGJwKSkgewogCQlSRUdfV1IoYnAsIFBDSUNGR19PRkZTRVQgKyBQWFBDU19UTF9DT05UUk9MXzUsCiAJCQkgICAoUFhQQ1NfVExfQ09OVFJPTF81X0VSUl9VTlNQUE9SVDEgfAogCQkJCVBYUENTX1RMX0NPTlRST0xfNV9FUlJfVU5TUFBPUlQpKTsKQEAgLTUyODcsMjEgKzYxNTQsMTUgQEAKIAkJCQlQWFBDU19UTF9GVU5DNjc4X1NUQVRfRVJSX1VOU1BQT1JUNSkpOwogCX0KIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIEVNQUMwX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIEVNQUMxX0JMT0NLLCBDT01NT05fU1RBR0UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIERCVV9CTE9DSywgQ09NTU9OX1NUQUdFKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBEQkdfQkxPQ0ssIENPTU1PTl9TVEFHRSk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBOSUdfQkxPQ0ssIENPTU1PTl9TVEFHRSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfTklHLCBQSEFTRV9DT01NT04pOwogCWlmICghQ0hJUF9JU19FMShicCkpIHsKLQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xMSF9NRl9NT0RFLCBJU19NRihicCkpOworCQkvKiBpbiBFMyB0aGlzIGRvbmUgaW4gcGVyLXBvcnQgc2VjdGlvbiAqLworCQlpZiAoIUNISVBfSVNfRTMoYnApKQorCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xMSF9NRl9NT0RFLCBJU19NRihicCkpOworCX0KKwlpZiAoQ0hJUF9JU19FMUgoYnApKQorCQkvKiBub3QgYXBwbGljYWJsZSBmb3IgRTIgKGFuZCBhYm92ZSAuLi4pICovCiAJCVJFR19XUihicCwgTklHX1JFR19MTEhfRTFIT1ZfTU9ERSwgSVNfTUZfU0QoYnApKTsKLQl9Ci0JaWYgKENISVBfSVNfRTIoYnApKSB7Ci0JCS8qIEJpdC1tYXAgaW5kaWNhdGluZyB3aGljaCBMMiBoZHJzIG1heSBhcHBlYXIgYWZ0ZXIgdGhlCi0JCSAgIGJhc2ljIEV0aGVybmV0IGhlYWRlciAqLwotCQlSRUdfV1IoYnAsIE5JR19SRUdfUDBfSERSU19BRlRFUl9CQVNJQywgKElTX01GX1NEKGJwKSA/IDcgOiA2KSk7Ci0JfQogCiAJaWYgKENISVBfUkVWX0lTX1NMT1coYnApKQogCQltc2xlZXAoMjAwKTsKQEAgLTUzNDMsMTI3ICs2MjA0LDEzNiBAQAogCVJFR19SRChicCwgUFhQMl9SRUdfUFhQMl9JTlRfU1RTX0NMUl8wKTsKIAogCWJueDJ4X2VuYWJsZV9ibG9ja3NfYXR0ZW50aW9uKGJwKTsKLQlpZiAoQ0hJUF9QQVJJVFlfRU5BQkxFRChicCkpCi0JCWJueDJ4X2VuYWJsZV9ibG9ja3NfcGFyaXR5KGJwKTsKKwlibngyeF9lbmFibGVfYmxvY2tzX3Bhcml0eShicCk7CiAKIAlpZiAoIUJQX05PTUNQKGJwKSkgewotCQkvKiBJbiBFMiAyLVBPUlQgbW9kZSwgc2FtZSBleHQgcGh5IGlzIHVzZWQgZm9yIHRoZSB0d28gcGF0aHMgKi8KLQkJaWYgKChsb2FkX2NvZGUgPT0gRldfTVNHX0NPREVfRFJWX0xPQURfQ09NTU9OX0NISVApIHx8Ci0JCSAgICBDSElQX0lTX0UxeChicCkpIHsKLQkJCXUzMiBzaG1lbV9iYXNlWzJdLCBzaG1lbTJfYmFzZVsyXTsKLQkJCXNobWVtX2Jhc2VbMF0gPSAgYnAtPmNvbW1vbi5zaG1lbV9iYXNlOwotCQkJc2htZW0yX2Jhc2VbMF0gPSBicC0+Y29tbW9uLnNobWVtMl9iYXNlOwotCQkJaWYgKENISVBfSVNfRTIoYnApKSB7Ci0JCQkJc2htZW1fYmFzZVsxXSA9Ci0JCQkJCVNITUVNMl9SRChicCwgb3RoZXJfc2htZW1fYmFzZV9hZGRyKTsKLQkJCQlzaG1lbTJfYmFzZVsxXSA9Ci0JCQkJCVNITUVNMl9SRChicCwgb3RoZXJfc2htZW0yX2Jhc2VfYWRkcik7Ci0JCQl9Ci0JCQlibngyeF9hY3F1aXJlX3BoeV9sb2NrKGJwKTsKLQkJCWJueDJ4X2NvbW1vbl9pbml0X3BoeShicCwgc2htZW1fYmFzZSwgc2htZW0yX2Jhc2UsCi0JCQkJCSAgICAgIGJwLT5jb21tb24uY2hpcF9pZCk7Ci0JCQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKLQkJfQorCQlpZiAoQ0hJUF9JU19FMXgoYnApKQorCQkJYm54MnhfX2NvbW1vbl9pbml0X3BoeShicCk7CiAJfSBlbHNlCiAJCUJOWDJYX0VSUigiQm9vdGNvZGUgaXMgbWlzc2luZyAtIGNhbiBub3QgaW5pdGlhbGl6ZSBsaW5rXG4iKTsKIAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGJueDJ4X2luaXRfaHdfY29tbW9uX2NoaXAgLSBpbml0IEhXIGF0IHRoZSBDT01NT05fQ0hJUCBwaGFzZS4KKyAqCisgKiBAYnA6CQlkcml2ZXIgaGFuZGxlCisgKi8KK3N0YXRpYyBpbnQgYm54MnhfaW5pdF9od19jb21tb25fY2hpcChzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCByYyA9IGJueDJ4X2luaXRfaHdfY29tbW9uKGJwKTsKKworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogSW4gRTIgMi1QT1JUIG1vZGUsIHNhbWUgZXh0IHBoeSBpcyB1c2VkIGZvciB0aGUgdHdvIHBhdGhzICovCisJaWYgKCFCUF9OT01DUChicCkpCisJCWJueDJ4X19jb21tb25faW5pdF9waHkoYnApOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYm54MnhfaW5pdF9od19wb3J0KHN0cnVjdCBibngyeCAqYnApCiB7CiAJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKLQlpbnQgaW5pdF9zdGFnZSA9IHBvcnQgPyBQT1JUMV9TVEFHRSA6IFBPUlQwX1NUQUdFOworCWludCBpbml0X3BoYXNlID0gcG9ydCA/IFBIQVNFX1BPUlQxIDogUEhBU0VfUE9SVDA7CiAJdTMyIGxvdywgaGlnaDsKIAl1MzIgdmFsOwogCisJYm54MnhfX2xpbmtfcmVzZXQoYnApOworCiAJRFAoQk5YMlhfTVNHX01DUCwgInN0YXJ0aW5nIHBvcnQgaW5pdCAgcG9ydCAlZFxuIiwgcG9ydCk7CiAKIAlSRUdfV1IoYnAsIE5JR19SRUdfTUFTS19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsIDApOwogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgUFhQX0JMT0NLLCBpbml0X3N0YWdlKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBQWFAyX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19NSVNDLCBpbml0X3BoYXNlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19QWFAsIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1BYUDIsIGluaXRfcGhhc2UpOwogCiAJLyogVGltZXJzIGJ1ZyB3b3JrYXJvdW5kOiBkaXNhYmxlcyB0aGUgcGZfbWFzdGVyIGJpdCBpbiBwZ2x1ZSBhdAogCSAqIGNvbW1vbiBwaGFzZSwgd2UgbmVlZCB0byBlbmFibGUgaXQgaGVyZSBiZWZvcmUgYW55IGRtYWUgYWNjZXNzIGFyZQogCSAqIGF0dGVtcHRlZC4gVGhlcmVmb3JlIHdlIG1hbnVhbGx5IGFkZGVkIHRoZSBlbmFibGUtbWFzdGVyIHRvIHRoZQogCSAqIHBvcnQgcGhhc2UgKGl0IGFsc28gaGFwcGVucyBpbiB0aGUgZnVuY3Rpb24gcGhhc2UpCiAJICovCi0JaWYgKENISVBfSVNfRTIoYnApKQorCWlmICghQ0hJUF9JU19FMXgoYnApKQogCQlSRUdfV1IoYnAsIFBHTFVFX0JfUkVHX0lOVEVSTkFMX1BGSURfRU5BQkxFX01BU1RFUiwgMSk7CiAKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBUQ01fQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFVDTV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgQ0NNX0JMT0NLLCBpbml0X3N0YWdlKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBYQ01fQkxPQ0ssIGluaXRfc3RhZ2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX0FUQywgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfRE1BRSwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfUEdMVUVfQiwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfUU0sIGluaXRfcGhhc2UpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfVENNLCBpbml0X3BoYXNlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19VQ00sIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX0NDTSwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfWENNLCBpbml0X3BoYXNlKTsKIAogCS8qIFFNIGNpZCAoY29ubmVjdGlvbikgY291bnQgKi8KIAlibngyeF9xbV9pbml0X2NpZF9jb3VudChicCwgYnAtPnFtX2NpZF9jb3VudCwgSU5JVE9QX1NFVCk7CiAKICNpZmRlZiBCQ01fQ05JQwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFRJTUVSU19CTE9DSywgaW5pdF9zdGFnZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfVE0sIGluaXRfcGhhc2UpOwogCVJFR19XUihicCwgVE1fUkVHX0xJTjBfU0NBTl9USU1FICsgcG9ydCo0LCAyMCk7CiAJUkVHX1dSKGJwLCBUTV9SRUdfTElOMF9NQVhfQUNUSVZFX0NJRCArIHBvcnQqNCwgMzEpOwogI2VuZGlmCiAKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBEUV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0KLQlpZiAoQ0hJUF9NT0RFX0lTXzRfUE9SVChicCkpCi0JCWJueDJ4X2luaXRfYmxvY2soYnAsIFFNXzRQT1JUX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19ET1JRLCBpbml0X3BoYXNlKTsKIAogCWlmIChDSElQX0lTX0UxKGJwKSB8fCBDSElQX0lTX0UxSChicCkpIHsKLQkJYm54MnhfaW5pdF9ibG9jayhicCwgQlJCMV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSAmJiBDSElQX0lTX0UxKGJwKSkgewotCQkJLyogbm8gcGF1c2UgZm9yIGVtdWxhdGlvbiBhbmQgRlBHQSAqLwotCQkJbG93ID0gMDsKLQkJCWhpZ2ggPSA1MTM7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoSVNfTUYoYnApKQotCQkJCWxvdyA9ICgoYnAtPmZsYWdzICYgT05FX1BPUlRfRkxBRykgPyAxNjAgOiAyNDYpOwotCQkJZWxzZSBpZiAoYnAtPmRldi0+bXR1ID4gNDA5NikgewotCQkJCWlmIChicC0+ZmxhZ3MgJiBPTkVfUE9SVF9GTEFHKQotCQkJCQlsb3cgPSAxNjA7Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhbCA9IGJwLT5kZXYtPm10dTsKLQkJCQkJLyogKDI0KjEwMjQgKyB2YWwqNCkvMjU2ICovCi0JCQkJCWxvdyA9IDk2ICsgKHZhbC82NCkgKwotCQkJCQkJCSgodmFsICUgNjQpID8gMSA6IDApOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWxvdyA9ICgoYnAtPmZsYWdzICYgT05FX1BPUlRfRkxBRykgPyA4MCA6IDE2MCk7Ci0JCQloaWdoID0gbG93ICsgNTY7CS8qIDE0KjEwMjQvMjU2ICovCi0JCX0KKwkJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfQlJCMSwgaW5pdF9waGFzZSk7CisKKwkJaWYgKElTX01GKGJwKSkKKwkJCWxvdyA9ICgoYnAtPmZsYWdzICYgT05FX1BPUlRfRkxBRykgPyAxNjAgOiAyNDYpOworCQllbHNlIGlmIChicC0+ZGV2LT5tdHUgPiA0MDk2KSB7CisJCQlpZiAoYnAtPmZsYWdzICYgT05FX1BPUlRfRkxBRykKKwkJCQlsb3cgPSAxNjA7CisJCQllbHNlIHsKKwkJCQl2YWwgPSBicC0+ZGV2LT5tdHU7CisJCQkJLyogKDI0KjEwMjQgKyB2YWwqNCkvMjU2ICovCisJCQkJbG93ID0gOTYgKyAodmFsLzY0KSArCisJCQkJCQkoKHZhbCAlIDY0KSA/IDEgOiAwKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlsb3cgPSAoKGJwLT5mbGFncyAmIE9ORV9QT1JUX0ZMQUcpID8gODAgOiAxNjApOworCQloaWdoID0gbG93ICsgNTY7CS8qIDE0KjEwMjQvMjU2ICovCiAJCVJFR19XUihicCwgQlJCMV9SRUdfUEFVU0VfTE9XX1RIUkVTSE9MRF8wICsgcG9ydCo0LCBsb3cpOwogCQlSRUdfV1IoYnAsIEJSQjFfUkVHX1BBVVNFX0hJR0hfVEhSRVNIT0xEXzAgKyBwb3J0KjQsIGhpZ2gpOwogCX0KIAotCWlmIChDSElQX01PREVfSVNfNF9QT1JUKGJwKSkgewotCQlSRUdfV1IoYnAsIEJSQjFfUkVHX1BBVVNFXzBfWE9GRl9USFJFU0hPTERfMCArIHBvcnQqOCwgMjQ4KTsKLQkJUkVHX1dSKGJwLCBCUkIxX1JFR19QQVVTRV8wX1hPTl9USFJFU0hPTERfMCArIHBvcnQqOCwgMzI4KTsKLQkJUkVHX1dSKGJwLCAoQlBfUE9SVChicCkgPyBCUkIxX1JFR19NQUNfR1VBUkFOVElFRF8xIDoKLQkJCQkJICBCUkIxX1JFR19NQUNfR1VBUkFOVElFRF8wKSwgNDApOwotCX0KLQotCWJueDJ4X2luaXRfYmxvY2soYnAsIFBSU19CTE9DSywgaW5pdF9zdGFnZSk7Ci0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBUU0RNX0JMT0NLLCBpbml0X3N0YWdlKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBDU0RNX0JMT0NLLCBpbml0X3N0YWdlKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBVU0RNX0JMT0NLLCBpbml0X3N0YWdlKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBYU0RNX0JMT0NLLCBpbml0X3N0YWdlKTsKLQotCWJueDJ4X2luaXRfYmxvY2soYnAsIFRTRU1fQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFVTRU1fQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIENTRU1fQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFhTRU1fQkxPQ0ssIGluaXRfc3RhZ2UpOwogCWlmIChDSElQX01PREVfSVNfNF9QT1JUKGJwKSkKLQkJYm54MnhfaW5pdF9ibG9jayhicCwgWFNFTV80UE9SVF9CTE9DSywgaW5pdF9zdGFnZSk7CisJCVJFR19XUihicCwgKEJQX1BPUlQoYnApID8KKwkJCSAgICBCUkIxX1JFR19NQUNfR1VBUkFOVElFRF8xIDoKKwkJCSAgICBCUkIxX1JFR19NQUNfR1VBUkFOVElFRF8wKSwgNDApOwogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgVVBCX0JMT0NLLCBpbml0X3N0YWdlKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBYUEJfQkxPQ0ssIGluaXRfc3RhZ2UpOwogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgUEJGX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19QUlMsIGluaXRfcGhhc2UpOworCWlmIChDSElQX0lTX0UzQjAoYnApKQorCQkvKiBPdmxhbiBleGlzdHMgb25seSBpZiB3ZSBhcmUgaW4gbXVsdGktZnVuY3Rpb24gKworCQkgKiBzd2l0Y2gtZGVwZW5kZW50IG1vZGUsIGluIHN3aXRjaC1pbmRlcGVuZGVudCB0aGVyZQorCQkgKiBpcyBubyBvdmxhbiBoZWFkZXJzCisJCSAqLworCQlSRUdfV1IoYnAsIEJQX1BPUlQoYnApID8KKwkJICAgICAgIFBSU19SRUdfSERSU19BRlRFUl9CQVNJQ19QT1JUXzEgOgorCQkgICAgICAgUFJTX1JFR19IRFJTX0FGVEVSX0JBU0lDX1BPUlRfMCwKKwkJICAgICAgIChicC0+cGF0aF9oYXNfb3ZsYW4gPyA3IDogNikpOwogCi0JaWYgKCFDSElQX0lTX0UyKGJwKSkgeworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1RTRE0sIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX0NTRE0sIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1VTRE0sIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1hTRE0sIGluaXRfcGhhc2UpOworCisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfVFNFTSwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfVVNFTSwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfQ1NFTSwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfWFNFTSwgaW5pdF9waGFzZSk7CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19VUEIsIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1hQQiwgaW5pdF9waGFzZSk7CisKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19QQkYsIGluaXRfcGhhc2UpOworCisJaWYgKENISVBfSVNfRTF4KGJwKSkgewogCQkvKiBjb25maWd1cmUgUEJGIHRvIHdvcmsgd2l0aG91dCBQQVVTRSBtdHUgOTAwMCAqLwogCQlSRUdfV1IoYnAsIFBCRl9SRUdfUDBfUEFVU0VfRU5BQkxFICsgcG9ydCo0LCAwKTsKIApAQCAtNTQ3OSwyMCArNjM0OSwyMCBAQAogCX0KIAogI2lmZGVmIEJDTV9DTklDCi0JYm54MnhfaW5pdF9ibG9jayhicCwgU1JDSF9CTE9DSywgaW5pdF9zdGFnZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfU1JDLCBpbml0X3BoYXNlKTsKICNlbmRpZgotCWJueDJ4X2luaXRfYmxvY2soYnAsIENEVV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgQ0ZDX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19DRFUsIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX0NGQywgaW5pdF9waGFzZSk7CiAKIAlpZiAoQ0hJUF9JU19FMShicCkpIHsKIAkJUkVHX1dSKGJwLCBIQ19SRUdfTEVBRElOR19FREdFXzAgKyBwb3J0KjgsIDApOwogCQlSRUdfV1IoYnAsIEhDX1JFR19UUkFJTElOR19FREdFXzAgKyBwb3J0KjgsIDApOwogCX0KLQlibngyeF9pbml0X2Jsb2NrKGJwLCBIQ19CTE9DSywgaW5pdF9zdGFnZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfSEMsIGluaXRfcGhhc2UpOwogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgSUdVX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19JR1UsIGluaXRfcGhhc2UpOwogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgTUlTQ19BRVVfQkxPQ0ssIGluaXRfc3RhZ2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX01JU0NfQUVVLCBpbml0X3BoYXNlKTsKIAkvKiBpbml0IGFldV9tYXNrX2F0dG5fZnVuY18wLzE6CiAJICogIC0gU0YgbW9kZTogYml0cyAzLTcgYXJlIG1hc2tlZC4gb25seSBiaXRzIDAtMiBhcmUgaW4gdXNlCiAJICogIC0gTUYgbW9kZTogYml0IDMgaXMgbWFza2VkLiBiaXRzIDAtMiBhcmUgaW4gdXNlIGFzIGluIFNGCkBAIC01NTAyLDIyICs2MzcyLDMxIEBACiAJdmFsIHw9IENISVBfSVNfRTEoYnApID8gMCA6IDB4MTA7CiAJUkVHX1dSKGJwLCBNSVNDX1JFR19BRVVfTUFTS19BVFROX0ZVTkNfMCArIHBvcnQqNCwgdmFsKTsKIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIFBYUENTX0JMT0NLLCBpbml0X3N0YWdlKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBFTUFDMF9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgRU1BQzFfQkxPQ0ssIGluaXRfc3RhZ2UpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIERCVV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgREJHX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19OSUcsIGluaXRfcGhhc2UpOwogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgTklHX0JMT0NLLCBpbml0X3N0YWdlKTsKKwlpZiAoIUNISVBfSVNfRTF4KGJwKSkgeworCQkvKiBCaXQtbWFwIGluZGljYXRpbmcgd2hpY2ggTDIgaGRycyBtYXkgYXBwZWFyIGFmdGVyIHRoZQorCQkgKiBiYXNpYyBFdGhlcm5ldCBoZWFkZXIKKwkJICovCisJCVJFR19XUihicCwgQlBfUE9SVChicCkgPworCQkJICAgTklHX1JFR19QMV9IRFJTX0FGVEVSX0JBU0lDIDoKKwkJCSAgIE5JR19SRUdfUDBfSERSU19BRlRFUl9CQVNJQywKKwkJCSAgIElTX01GX1NEKGJwKSA/IDcgOiA2KTsKIAotCVJFR19XUihicCwgTklHX1JFR19YR1hTX1NFUkRFUzBfTU9ERV9TRUwgKyBwb3J0KjQsIDEpOworCQlpZiAoQ0hJUF9JU19FMyhicCkpCisJCQlSRUdfV1IoYnAsIEJQX1BPUlQoYnApID8KKwkJCQkgICBOSUdfUkVHX0xMSDFfTUZfTU9ERSA6CisJCQkJICAgTklHX1JFR19MTEhfTUZfTU9ERSwgSVNfTUYoYnApKTsKKwl9CisJaWYgKCFDSElQX0lTX0UzKGJwKSkKKwkJUkVHX1dSKGJwLCBOSUdfUkVHX1hHWFNfU0VSREVTMF9NT0RFX1NFTCArIHBvcnQqNCwgMSk7CiAKIAlpZiAoIUNISVBfSVNfRTEoYnApKSB7CiAJCS8qIDB4MiBkaXNhYmxlIG1mX292LCAweDEgZW5hYmxlICovCiAJCVJFR19XUihicCwgTklHX1JFR19MTEgwX0JSQjFfRFJWX01BU0tfTUYgKyBwb3J0KjQsCiAJCSAgICAgICAoSVNfTUZfU0QoYnApID8gMHgxIDogMHgyKSk7CiAKLQkJaWYgKENISVBfSVNfRTIoYnApKSB7CisJCWlmICghQ0hJUF9JU19FMXgoYnApKSB7CiAJCQl2YWwgPSAwOwogCQkJc3dpdGNoIChicC0+bWZfbW9kZSkgewogCQkJY2FzZSBNVUxUSV9GVU5DVElPTl9TRDoKQEAgLTU1MzgsMTcgKzY0MTcsMTYgQEAKIAkJfQogCX0KIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIE1DUF9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgRE1BRV9CTE9DSywgaW5pdF9zdGFnZSk7Ci0JaWYgKGJueDJ4X2Zhbl9mYWlsdXJlX2RldF9yZXEoYnAsIGJwLT5jb21tb24uc2htZW1fYmFzZSwKLQkJCQkgICAgICBicC0+Y29tbW9uLnNobWVtMl9iYXNlLCBwb3J0KSkgeworCisJLyogSWYgU1BJTzUgaXMgc2V0IHRvIGdlbmVyYXRlIGludGVycnVwdHMsIGVuYWJsZSBpdCBmb3IgdGhpcyBwb3J0ICovCisJdmFsID0gUkVHX1JEKGJwLCBNSVNDX1JFR19TUElPX0VWRU5UX0VOKTsKKwlpZiAodmFsICYgKDEgPDwgTUlTQ19SRUdJU1RFUlNfU1BJT181KSkgewogCQl1MzIgcmVnX2FkZHIgPSAocG9ydCA/IE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMV9PVVRfMCA6CiAJCQkJICAgICAgIE1JU0NfUkVHX0FFVV9FTkFCTEUxX0ZVTkNfMF9PVVRfMCk7CiAJCXZhbCA9IFJFR19SRChicCwgcmVnX2FkZHIpOwogCQl2YWwgfD0gQUVVX0lOUFVUU19BVFROX0JJVFNfU1BJTzU7CiAJCVJFR19XUihicCwgcmVnX2FkZHIsIHZhbCk7CiAJfQotCWJueDJ4X19saW5rX3Jlc2V0KGJwKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTU2Nyw3ICs2NDQ1LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2lndV9jbGVhcl9zYihzdHJ1Y3QgYm54MnggKmJwLCB1OCBpZHVfc2JfaWQpCiB7Ci0JYm54MnhfaWd1X2NsZWFyX3NiX2dlbihicCwgaWR1X3NiX2lkLCB0cnVlIC8qUEYqLyk7CisJYm54MnhfaWd1X2NsZWFyX3NiX2dlbihicCwgQlBfRlVOQyhicCksIGlkdV9zYl9pZCwgdHJ1ZSAvKlBGKi8pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfY2xlYXJfZnVuY19pbHQoc3RydWN0IGJueDJ4ICpicCwgdTMyIGZ1bmMpCkBAIC01NTgxLDYgKzY0NTksNyBAQAogewogCWludCBwb3J0ID0gQlBfUE9SVChicCk7CiAJaW50IGZ1bmMgPSBCUF9GVU5DKGJwKTsKKwlpbnQgaW5pdF9waGFzZSA9IFBIQVNFX1BGMCArIGZ1bmM7CiAJc3RydWN0IGJueDJ4X2lsdCAqaWx0ID0gQlBfSUxUKGJwKTsKIAl1MTYgY2R1X2lsdF9zdGFydDsKIAl1MzIgYWRkciwgdmFsOwpAQCAtNTU4OSw2ICs2NDY4LDEwIEBACiAKIAlEUChCTlgyWF9NU0dfTUNQLCAic3RhcnRpbmcgZnVuYyBpbml0ICBmdW5jICVkXG4iLCBmdW5jKTsKIAorCS8qIEZMUiBjbGVhbnVwIC0gaG1tbSAqLworCWlmICghQ0hJUF9JU19FMXgoYnApKQorCQlibngyeF9wZl9mbHJfY2xudXAoYnApOworCiAJLyogc2V0IE1TSSByZWNvbmZpZ3VyZSBjYXBhYmlsaXR5ICovCiAJaWYgKGJwLT5jb21tb24uaW50X2Jsb2NrID09IElOVF9CTE9DS19IQykgewogCQlhZGRyID0gKHBvcnQgPyBIQ19SRUdfQ09ORklHXzEgOiBIQ19SRUdfQ09ORklHXzApOwpAQCAtNTU5Nyw2ICs2NDgwLDkgQEAKIAkJUkVHX1dSKGJwLCBhZGRyLCB2YWwpOwogCX0KIAorCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1BYUCwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfUFhQMiwgaW5pdF9waGFzZSk7CisKIAlpbHQgPSBCUF9JTFQoYnApOwogCWNkdV9pbHRfc3RhcnQgPSBpbHQtPmNsaWVudHNbSUxUX0NMSUVOVF9DRFVdLnN0YXJ0OwogCkBAIC01NjIyLDcgKzY1MDgsNyBAQAogCVJFR19XUihicCwgUFJTX1JFR19OSUNfTU9ERSwgMSk7CiAjZW5kaWYgIC8qIEJDTV9DTklDICovCiAKLQlpZiAoQ0hJUF9JU19FMihicCkpIHsKKwlpZiAoIUNISVBfSVNfRTF4KGJwKSkgewogCQl1MzIgcGZfY29uZiA9IElHVV9QRl9DT05GX0ZVTkNfRU47CiAKIAkJLyogVHVybiBvbiBhIHNpbmdsZSBJU1IgbW9kZSBpbiBJR1UgaWYgZHJpdmVyIGlzIGdvaW5nIHRvIHVzZQpAQCAtNTY0OSw1OCArNjUzNSw1NSBAQAogCiAJYnAtPmRtYWVfcmVhZHkgPSAxOwogCi0JYm54MnhfaW5pdF9ibG9jayhicCwgUEdMVUVfQl9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19QR0xVRV9CLCBpbml0X3BoYXNlKTsKIAotCWlmIChDSElQX0lTX0UyKGJwKSkKKwlpZiAoIUNISVBfSVNfRTF4KGJwKSkKIAkJUkVHX1dSKGJwLCBQR0xVRV9CX1JFR19XQVNfRVJST1JfUEZfN18wX0NMUiwgZnVuYyk7CiAKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBNSVNDX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFRDTV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBVQ01fQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgQ0NNX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFhDTV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBUU0VNX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFVTRU1fQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgQ1NFTV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBYU0VNX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX0FUQywgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfRE1BRSwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfTklHLCBpbml0X3BoYXNlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19TUkMsIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX01JU0MsIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1RDTSwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfVUNNLCBpbml0X3BoYXNlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19DQ00sIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1hDTSwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfVFNFTSwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfVVNFTSwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfQ1NFTSwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfWFNFTSwgaW5pdF9waGFzZSk7CiAKLQlpZiAoQ0hJUF9JU19FMihicCkpIHsKLQkJUkVHX1dSKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKyBYU1RPUk1fUEFUSF9JRF9PRkZTRVQsCi0JCQkJCQkJCUJQX1BBVEgoYnApKTsKLQkJUkVHX1dSKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKyBDU1RPUk1fUEFUSF9JRF9PRkZTRVQsCi0JCQkJCQkJCUJQX1BBVEgoYnApKTsKLQl9Ci0KLQlpZiAoQ0hJUF9NT0RFX0lTXzRfUE9SVChicCkpCi0JCWJueDJ4X2luaXRfYmxvY2soYnAsIFhTRU1fNFBPUlRfQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0KLQlpZiAoQ0hJUF9JU19FMihicCkpCisJaWYgKCFDSElQX0lTX0UxeChicCkpCiAJCVJFR19XUihicCwgUU1fUkVHX1BGX0VOLCAxKTsKIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIFFNX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOworCWlmICghQ0hJUF9JU19FMXgoYnApKSB7CisJCVJFR19XUihicCwgVFNFTV9SRUdfVkZQRl9FUlJfTlVNLCBCTlgyWF9NQVhfTlVNX09GX1ZGUyArIGZ1bmMpOworCQlSRUdfV1IoYnAsIFVTRU1fUkVHX1ZGUEZfRVJSX05VTSwgQk5YMlhfTUFYX05VTV9PRl9WRlMgKyBmdW5jKTsKKwkJUkVHX1dSKGJwLCBDU0VNX1JFR19WRlBGX0VSUl9OVU0sIEJOWDJYX01BWF9OVU1fT0ZfVkZTICsgZnVuYyk7CisJCVJFR19XUihicCwgWFNFTV9SRUdfVkZQRl9FUlJfTlVNLCBCTlgyWF9NQVhfTlVNX09GX1ZGUyArIGZ1bmMpOworCX0KKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19RTSwgaW5pdF9waGFzZSk7CiAKLQlpZiAoQ0hJUF9NT0RFX0lTXzRfUE9SVChicCkpCi0JCWJueDJ4X2luaXRfYmxvY2soYnAsIFFNXzRQT1JUX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCi0JYm54MnhfaW5pdF9ibG9jayhicCwgVElNRVJTX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIERRX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIEJSQjFfQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgUFJTX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFRTRE1fQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgQ1NETV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBVU0RNX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFhTRE1fQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgVVBCX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIFhQQl9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBQQkZfQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0JaWYgKENISVBfSVNfRTIoYnApKQorCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1RNLCBpbml0X3BoYXNlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19ET1JRLCBpbml0X3BoYXNlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19CUkIxLCBpbml0X3BoYXNlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19QUlMsIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1RTRE0sIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX0NTRE0sIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1VTRE0sIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1hTRE0sIGluaXRfcGhhc2UpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX1VQQiwgaW5pdF9waGFzZSk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfWFBCLCBpbml0X3BoYXNlKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19QQkYsIGluaXRfcGhhc2UpOworCWlmICghQ0hJUF9JU19FMXgoYnApKQogCQlSRUdfV1IoYnAsIFBCRl9SRUdfRElTQUJMRV9QRiwgMCk7CiAKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBDRFVfQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7CisJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfQ0RVLCBpbml0X3BoYXNlKTsKIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIENGQ19CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKKwlibngyeF9pbml0X2Jsb2NrKGJwLCBCTE9DS19DRkMsIGluaXRfcGhhc2UpOwogCi0JaWYgKENISVBfSVNfRTIoYnApKQorCWlmICghQ0hJUF9JU19FMXgoYnApKQogCQlSRUdfV1IoYnAsIENGQ19SRUdfV0VBS19FTkFCTEVfUEYsIDEpOwogCiAJaWYgKElTX01GKGJwKSkgewpAQCAtNTcwOCw3ICs2NTkxLDcgQEAKIAkJUkVHX1dSKGJwLCBOSUdfUkVHX0xMSDBfRlVOQ19WTEFOX0lEICsgcG9ydCo4LCBicC0+bWZfb3YpOwogCX0KIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIE1JU0NfQUVVX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOworCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX01JU0NfQUVVLCBpbml0X3BoYXNlKTsKIAogCS8qIEhDIGluaXQgcGVyIGZ1bmN0aW9uICovCiAJaWYgKGJwLT5jb21tb24uaW50X2Jsb2NrID09IElOVF9CTE9DS19IQykgewpAQCAtNTcxOCwyMSArNjYwMSwyMSBAQAogCQkJUkVHX1dSKGJwLCBIQ19SRUdfTEVBRElOR19FREdFXzAgKyBwb3J0KjgsIDApOwogCQkJUkVHX1dSKGJwLCBIQ19SRUdfVFJBSUxJTkdfRURHRV8wICsgcG9ydCo4LCAwKTsKIAkJfQotCQlibngyeF9pbml0X2Jsb2NrKGJwLCBIQ19CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKKwkJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfSEMsIGluaXRfcGhhc2UpOwogCiAJfSBlbHNlIHsKIAkJaW50IG51bV9zZWdzLCBzYl9pZHgsIHByb2Rfb2Zmc2V0OwogCiAJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl8xMiArIGZ1bmMqNCwgMCk7CiAKLQkJaWYgKENISVBfSVNfRTIoYnApKSB7CisJCWlmICghQ0hJUF9JU19FMXgoYnApKSB7CiAJCQlSRUdfV1IoYnAsIElHVV9SRUdfTEVBRElOR19FREdFX0xBVENILCAwKTsKIAkJCVJFR19XUihicCwgSUdVX1JFR19UUkFJTElOR19FREdFX0xBVENILCAwKTsKIAkJfQogCi0JCWJueDJ4X2luaXRfYmxvY2soYnAsIElHVV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKKwkJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfSUdVLCBpbml0X3BoYXNlKTsKIAotCQlpZiAoQ0hJUF9JU19FMihicCkpIHsKKwkJaWYgKCFDSElQX0lTX0UxeChicCkpIHsKIAkJCWludCBkc2JfaWR4ID0gMDsKIAkJCS8qKgogCQkJICogUHJvZHVjZXIgbWVtb3J5OgpAQCAtNTgyNywxMyArNjcxMCw2IEBACiAJUkVHX1dSKGJwLCAweDIxMTQsIDB4ZmZmZmZmZmYpOwogCVJFR19XUihicCwgMHgyMTIwLCAweGZmZmZmZmZmKTsKIAotCWJueDJ4X2luaXRfYmxvY2soYnAsIEVNQUMwX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIEVNQUMxX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIERCVV9CTE9DSywgRlVOQzBfU1RBR0UgKyBmdW5jKTsKLQlibngyeF9pbml0X2Jsb2NrKGJwLCBEQkdfQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0JYm54MnhfaW5pdF9ibG9jayhicCwgTUNQX0JMT0NLLCBGVU5DMF9TVEFHRSArIGZ1bmMpOwotCWJueDJ4X2luaXRfYmxvY2soYnAsIERNQUVfQkxPQ0ssIEZVTkMwX1NUQUdFICsgZnVuYyk7Ci0KIAlpZiAoQ0hJUF9JU19FMXgoYnApKSB7CiAJCW1haW5fbWVtX3NpemUgPSBIQ19SRUdfTUFJTl9NRU1PUllfU0laRSAvIDI7IC8qZHdvcmRzKi8KIAkJbWFpbl9tZW1fYmFzZSA9IEhDX1JFR19NQUlOX01FTU9SWSArCkBAIC01ODU5LDY1ICs2NzM1LDI2IEBACiAJCVJFR19SRChicCwgbWFpbl9tZW1fcHJ0eV9jbHIpOwogCX0KIAorI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwkvKiBFbmFibGUgU1RPUk1zIFNQIGxvZ2dpbmcgKi8KKwlSRUdfV1I4KGJwLCBCQVJfVVNUUk9STV9JTlRNRU0gKworCSAgICAgICBVU1RPUk1fUkVDT1JEX1NMT1dfUEFUSF9PRkZTRVQoQlBfRlVOQyhicCkpLCAxKTsKKwlSRUdfV1I4KGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKworCSAgICAgICBUU1RPUk1fUkVDT1JEX1NMT1dfUEFUSF9PRkZTRVQoQlBfRlVOQyhicCkpLCAxKTsKKwlSRUdfV1I4KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKworCSAgICAgICBDU1RPUk1fUkVDT1JEX1NMT1dfUEFUSF9PRkZTRVQoQlBfRlVOQyhicCkpLCAxKTsKKwlSRUdfV1I4KGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKworCSAgICAgICBYU1RPUk1fUkVDT1JEX1NMT1dfUEFUSF9PRkZTRVQoQlBfRlVOQyhicCkpLCAxKTsKKyNlbmRpZgorCiAJYm54MnhfcGh5X3Byb2JlKCZicC0+bGlua19wYXJhbXMpOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBibngyeF9pbml0X2h3KHN0cnVjdCBibngyeCAqYnAsIHUzMiBsb2FkX2NvZGUpCi17Ci0JaW50IHJjID0gMDsKLQotCURQKEJOWDJYX01TR19NQ1AsICJmdW5jdGlvbiAlZCAgbG9hZF9jb2RlICV4XG4iLAotCSAgIEJQX0FCU19GVU5DKGJwKSwgbG9hZF9jb2RlKTsKLQotCWJwLT5kbWFlX3JlYWR5ID0gMDsKLQlzcGluX2xvY2tfaW5pdCgmYnAtPmRtYWVfbG9jayk7Ci0KLQlzd2l0Y2ggKGxvYWRfY29kZSkgewotCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfQ09NTU9OOgotCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfQ09NTU9OX0NISVA6Ci0JCXJjID0gYm54MnhfaW5pdF9od19jb21tb24oYnAsIGxvYWRfY29kZSk7Ci0JCWlmIChyYykKLQkJCWdvdG8gaW5pdF9od19lcnI7Ci0JCS8qIG5vIGJyZWFrICovCi0KLQljYXNlIEZXX01TR19DT0RFX0RSVl9MT0FEX1BPUlQ6Ci0JCXJjID0gYm54MnhfaW5pdF9od19wb3J0KGJwKTsKLQkJaWYgKHJjKQotCQkJZ290byBpbml0X2h3X2VycjsKLQkJLyogbm8gYnJlYWsgKi8KLQotCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfRlVOQ1RJT046Ci0JCXJjID0gYm54MnhfaW5pdF9od19mdW5jKGJwKTsKLQkJaWYgKHJjKQotCQkJZ290byBpbml0X2h3X2VycjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlCTlgyWF9FUlIoIlVua25vd24gbG9hZF9jb2RlICgweCV4KSBmcm9tIE1DUFxuIiwgbG9hZF9jb2RlKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFCUF9OT01DUChicCkpIHsKLQkJaW50IG1iX2lkeCA9IEJQX0ZXX01CX0lEWChicCk7Ci0KLQkJYnAtPmZ3X2Rydl9wdWxzZV93cl9zZXEgPQotCQkJCShTSE1FTV9SRChicCwgZnVuY19tYlttYl9pZHhdLmRydl9wdWxzZV9tYikgJgotCQkJCSBEUlZfUFVMU0VfU0VRX01BU0spOwotCQlEUChCTlgyWF9NU0dfTUNQLCAiZHJ2X3B1bHNlIDB4JXhcbiIsIGJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxKTsKLQl9Ci0KLWluaXRfaHdfZXJyOgotCWJueDJ4X2d1bnppcF9lbmQoYnApOwotCi0JcmV0dXJuIHJjOwotfQogCiB2b2lkIGJueDJ4X2ZyZWVfbWVtKHN0cnVjdCBibngyeCAqYnApCiB7Ci0JYm54MnhfZ3VuemlwX2VuZChicCk7Ci0KIAkvKiBmYXN0cGF0aCAqLwogCWJueDJ4X2ZyZWVfZnBfbWVtKGJwKTsKIAkvKiBlbmQgb2YgZmFzdHBhdGggKi8KQEAgLTU5MjUsNiArNjc2Miw5IEBACiAJQk5YMlhfUENJX0ZSRUUoYnAtPmRlZl9zdGF0dXNfYmxrLCBicC0+ZGVmX3N0YXR1c19ibGtfbWFwcGluZywKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgaG9zdF9zcF9zdGF0dXNfYmxvY2spKTsKIAorCUJOWDJYX1BDSV9GUkVFKGJwLT5md19zdGF0cywgYnAtPmZ3X3N0YXRzX21hcHBpbmcsCisJCSAgICAgICBicC0+Zndfc3RhdHNfZGF0YV9zeiArIGJwLT5md19zdGF0c19yZXFfc3opOworCiAJQk5YMlhfUENJX0ZSRUUoYnAtPnNsb3dwYXRoLCBicC0+c2xvd3BhdGhfbWFwcGluZywKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgYm54Mnhfc2xvd3BhdGgpKTsKIApAQCAtNTkzNiw3ICs2Nzc2LDcgQEAKIAlCTlgyWF9GUkVFKGJwLT5pbHQtPmxpbmVzKTsKIAogI2lmZGVmIEJDTV9DTklDCi0JaWYgKENISVBfSVNfRTIoYnApKQorCWlmICghQ0hJUF9JU19FMXgoYnApKQogCQlCTlgyWF9QQ0lfRlJFRShicC0+Y25pY19zYi5lMl9zYiwgYnAtPmNuaWNfc2JfbWFwcGluZywKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IGhvc3RfaGNfc3RhdHVzX2Jsb2NrX2UyKSk7CiAJZWxzZQpAQCAtNTk1MCwxOCArNjc5MCw2NyBAQAogCiAJQk5YMlhfUENJX0ZSRUUoYnAtPmVxX3JpbmcsIGJwLT5lcV9tYXBwaW5nLAogCQkgICAgICAgQkNNX1BBR0VfU0laRSAqIE5VTV9FUV9QQUdFUyk7Cit9CiAKLQlCTlgyWF9GUkVFKGJwLT5yeF9pbmRpcl90YWJsZSk7CitzdGF0aWMgaW5saW5lIGludCBibngyeF9hbGxvY19md19zdGF0c19tZW0oc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgbnVtX2dyb3VwczsKKworCS8qIG51bWJlciBvZiBldGhfcXVldWVzICovCisJdTggbnVtX3F1ZXVlX3N0YXRzID0gQk5YMlhfTlVNX0VUSF9RVUVVRVMoYnApOworCisJLyogVG90YWwgbnVtYmVyIG9mIEZXIHN0YXRpc3RpY3MgcmVxdWVzdHMgPQorCSAqIDEgZm9yIHBvcnQgc3RhdHMgKyAxIGZvciBQRiBzdGF0cyArIG51bV9ldGhfcXVldWVzICovCisJYnAtPmZ3X3N0YXRzX251bSA9IDIgKyBudW1fcXVldWVfc3RhdHM7CisKKworCS8qIFJlcXVlc3QgaXMgYnVpbHQgZnJvbSBzdGF0c19xdWVyeV9oZWFkZXIgYW5kIGFuIGFycmF5IG9mCisJICogc3RhdHNfcXVlcnlfY21kX2dyb3VwIGVhY2ggb2Ygd2hpY2ggY29udGFpbnMKKwkgKiBTVEFUU19RVUVSWV9DTURfQ09VTlQgcnVsZXMuIFRoZSByZWFsIG51bWJlciBvciByZXF1ZXN0cyBpcworCSAqIGNvbmZpZ3VyZWQgaW4gdGhlIHN0YXRzX3F1ZXJ5X2hlYWRlci4KKwkgKi8KKwludW1fZ3JvdXBzID0gKDIgKyBudW1fcXVldWVfc3RhdHMpIC8gU1RBVFNfUVVFUllfQ01EX0NPVU5UICsKKwkJKCgoMiArIG51bV9xdWV1ZV9zdGF0cykgJSBTVEFUU19RVUVSWV9DTURfQ09VTlQpID8gMSA6IDApOworCisJYnAtPmZ3X3N0YXRzX3JlcV9zeiA9IHNpemVvZihzdHJ1Y3Qgc3RhdHNfcXVlcnlfaGVhZGVyKSArCisJCQludW1fZ3JvdXBzICogc2l6ZW9mKHN0cnVjdCBzdGF0c19xdWVyeV9jbWRfZ3JvdXApOworCisJLyogRGF0YSBmb3Igc3RhdGlzdGljcyByZXF1ZXN0cyArIHN0YXRzX2NvbnRlcgorCSAqCisJICogc3RhdHNfY291bnRlciBob2xkcyBwZXItU1RPUk0gY291bnRlcnMgdGhhdCBhcmUgaW5jcmVtZW50ZWQKKwkgKiB3aGVuIFNUT1JNIGhhcyBmaW5pc2hlZCB3aXRoIHRoZSBjdXJyZW50IHJlcXVlc3QuCisJICovCisJYnAtPmZ3X3N0YXRzX2RhdGFfc3ogPSBzaXplb2Yoc3RydWN0IHBlcl9wb3J0X3N0YXRzKSArCisJCXNpemVvZihzdHJ1Y3QgcGVyX3BmX3N0YXRzKSArCisJCXNpemVvZihzdHJ1Y3QgcGVyX3F1ZXVlX3N0YXRzKSAqIG51bV9xdWV1ZV9zdGF0cyArCisJCXNpemVvZihzdHJ1Y3Qgc3RhdHNfY291bnRlcik7CisKKwlCTlgyWF9QQ0lfQUxMT0MoYnAtPmZ3X3N0YXRzLCAmYnAtPmZ3X3N0YXRzX21hcHBpbmcsCisJCQlicC0+Zndfc3RhdHNfZGF0YV9zeiArIGJwLT5md19zdGF0c19yZXFfc3opOworCisJLyogU2V0IHNob3J0Y3V0cyAqLworCWJwLT5md19zdGF0c19yZXEgPSAoc3RydWN0IGJueDJ4X2Z3X3N0YXRzX3JlcSAqKWJwLT5md19zdGF0czsKKwlicC0+Zndfc3RhdHNfcmVxX21hcHBpbmcgPSBicC0+Zndfc3RhdHNfbWFwcGluZzsKKworCWJwLT5md19zdGF0c19kYXRhID0gKHN0cnVjdCBibngyeF9md19zdGF0c19kYXRhICopCisJCSgodTggKilicC0+Zndfc3RhdHMgKyBicC0+Zndfc3RhdHNfcmVxX3N6KTsKKworCWJwLT5md19zdGF0c19kYXRhX21hcHBpbmcgPSBicC0+Zndfc3RhdHNfbWFwcGluZyArCisJCQkJICAgYnAtPmZ3X3N0YXRzX3JlcV9zejsKKwlyZXR1cm4gMDsKKworYWxsb2NfbWVtX2VycjoKKwlCTlgyWF9QQ0lfRlJFRShicC0+Zndfc3RhdHMsIGJwLT5md19zdGF0c19tYXBwaW5nLAorCQkgICAgICAgYnAtPmZ3X3N0YXRzX2RhdGFfc3ogKyBicC0+Zndfc3RhdHNfcmVxX3N6KTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogCiBpbnQgYm54MnhfYWxsb2NfbWVtKHN0cnVjdCBibngyeCAqYnApCiB7Ci0JaWYgKGJueDJ4X2d1bnppcF9pbml0KGJwKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KICNpZmRlZiBCQ01fQ05JQwotCWlmIChDSElQX0lTX0UyKGJwKSkKKwlpZiAoIUNISVBfSVNfRTF4KGJwKSkKKwkJLyogc2l6ZSA9IHRoZSBzdGF0dXMgYmxvY2sgKyByYW1yb2QgYnVmZmVycyAqLwogCQlCTlgyWF9QQ0lfQUxMT0MoYnAtPmNuaWNfc2IuZTJfc2IsICZicC0+Y25pY19zYl9tYXBwaW5nLAogCQkJCXNpemVvZihzdHJ1Y3QgaG9zdF9oY19zdGF0dXNfYmxvY2tfZTIpKTsKIAllbHNlCkBAIC01OTc5LDcgKzY4NjgsMTEgQEAKIAlCTlgyWF9QQ0lfQUxMT0MoYnAtPnNsb3dwYXRoLCAmYnAtPnNsb3dwYXRoX21hcHBpbmcsCiAJCQlzaXplb2Yoc3RydWN0IGJueDJ4X3Nsb3dwYXRoKSk7CiAKLQlicC0+Y29udGV4dC5zaXplID0gc2l6ZW9mKHVuaW9uIGNkdV9jb250ZXh0KSAqIGJwLT5sMl9jaWRfY291bnQ7CisJLyogQWxsb2NhdGVkIG1lbW9yeSBmb3IgRlcgc3RhdGlzdGljcyAgKi8KKwlpZiAoYm54MnhfYWxsb2NfZndfc3RhdHNfbWVtKGJwKSkKKwkJZ290byBhbGxvY19tZW1fZXJyOworCisJYnAtPmNvbnRleHQuc2l6ZSA9IHNpemVvZih1bmlvbiBjZHVfY29udGV4dCkgKiBCTlgyWF9MMl9DSURfQ09VTlQoYnApOwogCiAJQk5YMlhfUENJX0FMTE9DKGJwLT5jb250ZXh0LnZjeHQsICZicC0+Y29udGV4dC5jeHRfbWFwcGluZywKIAkJCWJwLT5jb250ZXh0LnNpemUpOwpAQCAtNTk5Niw4ICs2ODg5LDYgQEAKIAlCTlgyWF9QQ0lfQUxMT0MoYnAtPmVxX3JpbmcsICZicC0+ZXFfbWFwcGluZywKIAkJCUJDTV9QQUdFX1NJWkUgKiBOVU1fRVFfUEFHRVMpOwogCi0JQk5YMlhfQUxMT0MoYnAtPnJ4X2luZGlyX3RhYmxlLCBzaXplb2YoYnAtPnJ4X2luZGlyX3RhYmxlWzBdKSAqCi0JCSAgICBUU1RPUk1fSU5ESVJFQ1RJT05fVEFCTEVfU0laRSk7CiAKIAkvKiBmYXN0cGF0aCAqLwogCS8qIG5lZWQgdG8gYmUgZG9uZSBhdCB0aGUgZW5kLCBzaW5jZSBpdCdzIHNlbGYgYWRqdXN0aW5nIHRvIGFtb3VudApAQCAtNjAxNSw2MzEgKzY5MDYsNzcgQEAKIC8qCiAgKiBJbml0IHNlcnZpY2UgZnVuY3Rpb25zCiAgKi8KLXN0YXRpYyBpbnQgYm54Mnhfd2FpdF9yYW1yb2Qoc3RydWN0IGJueDJ4ICpicCwgaW50IHN0YXRlLCBpbnQgaWR4LAotCQkJICAgICBpbnQgKnN0YXRlX3AsIGludCBmbGFncyk7CiAKLWludCBibngyeF9mdW5jX3N0YXJ0KHN0cnVjdCBibngyeCAqYnApCitpbnQgYm54Mnhfc2V0X21hY19vbmUoc3RydWN0IGJueDJ4ICpicCwgdTggKm1hYywKKwkJICAgICAgc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqb2JqLCBib29sIHNldCwKKwkJICAgICAgaW50IG1hY190eXBlLCB1bnNpZ25lZCBsb25nICpyYW1yb2RfZmxhZ3MpCiB7Ci0JYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9DT01NT05fRlVOQ1RJT05fU1RBUlQsIDAsIDAsIDAsIDEpOworCWludCByYzsKKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfcmFtcm9kX3BhcmFtcyByYW1yb2RfcGFyYW07CiAKLQkvKiBXYWl0IGZvciBjb21wbGV0aW9uICovCi0JcmV0dXJuIGJueDJ4X3dhaXRfcmFtcm9kKGJwLCBCTlgyWF9TVEFURV9GVU5DX1NUQVJURUQsIDAsICYoYnAtPnN0YXRlKSwKLQkJCQkgV0FJVF9SQU1ST0RfQ09NTU9OKTsKLX0KKwltZW1zZXQoJnJhbXJvZF9wYXJhbSwgMCwgc2l6ZW9mKHJhbXJvZF9wYXJhbSkpOwogCi1zdGF0aWMgaW50IGJueDJ4X2Z1bmNfc3RvcChzdHJ1Y3QgYm54MnggKmJwKQotewotCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfQ09NTU9OX0ZVTkNUSU9OX1NUT1AsIDAsIDAsIDAsIDEpOworCS8qIEZpbGwgZ2VuZXJhbCBwYXJhbWV0ZXJzICovCisJcmFtcm9kX3BhcmFtLnZsYW5fbWFjX29iaiA9IG9iajsKKwlyYW1yb2RfcGFyYW0ucmFtcm9kX2ZsYWdzID0gKnJhbXJvZF9mbGFnczsKIAotCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQlyZXR1cm4gYm54Mnhfd2FpdF9yYW1yb2QoYnAsIEJOWDJYX1NUQVRFX0NMT1NJTkdfV0FJVDRfVU5MT0FELAotCQkJCSAgICAgIDAsICYoYnAtPnN0YXRlKSwgV0FJVF9SQU1ST0RfQ09NTU9OKTsKLX0KKwkvKiBGaWxsIGEgdXNlciByZXF1ZXN0IHNlY3Rpb24gaWYgbmVlZGVkICovCisJaWYgKCF0ZXN0X2JpdChSQU1ST0RfQ09OVCwgcmFtcm9kX2ZsYWdzKSkgeworCQltZW1jcHkocmFtcm9kX3BhcmFtLnVzZXJfcmVxLnUubWFjLm1hYywgbWFjLCBFVEhfQUxFTik7CiAKLS8qKgotICogYm54Mnhfc2V0X21hY19hZGRyX2dlbiAtIHNldCBhIE1BQyBpbiBhIENBTSBmb3IgYSBmZXcgTDIgQ2xpZW50cyBmb3IgRTF4IGNoaXBzCi0gKgotICogQGJwOgkJZHJpdmVyIGhhbmRsZQotICogQHNldDoJc2V0IG9yIGNsZWFyIGFuIGVudHJ5ICgxIG9yIDApCi0gKiBAbWFjOglwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgYSBNQUMKLSAqIEBjbF9iaXRfdmVjOgliaXQgdmVjdG9yIG9mIGNsaWVudHMgdG8gcmVnaXN0ZXIgYSBNQUMgZm9yCi0gKiBAY2FtX29mZnNldDoJb2Zmc2V0IGluIGEgQ0FNIHRvIHVzZQotICogQGlzX2JjYXN0OglpcyB0aGUgc2V0IE1BQyBhIGJyb2FkY2FzdCBhZGRyZXNzIChmb3IgRTEgb25seSkKLSAqLwotc3RhdGljIHZvaWQgYm54Mnhfc2V0X21hY19hZGRyX2dlbihzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc2V0LCBjb25zdCB1OCAqbWFjLAotCQkJCSAgIHUzMiBjbF9iaXRfdmVjLCB1OCBjYW1fb2Zmc2V0LAotCQkJCSAgIHU4IGlzX2JjYXN0KQotewotCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKmNvbmZpZyA9Ci0JCShzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICopYm54Mnhfc3AoYnAsIG1hY19jb25maWcpOwotCWludCByYW1yb2RfZmxhZ3MgPSBXQUlUX1JBTVJPRF9DT01NT047CisJCV9fc2V0X2JpdChtYWNfdHlwZSwgJnJhbXJvZF9wYXJhbS51c2VyX3JlcS52bGFuX21hY19mbGFncyk7CiAKLQlicC0+c2V0X21hY19wZW5kaW5nID0gMTsKLQotCWNvbmZpZy0+aGRyLmxlbmd0aCA9IDE7Ci0JY29uZmlnLT5oZHIub2Zmc2V0ID0gY2FtX29mZnNldDsKLQljb25maWctPmhkci5jbGllbnRfaWQgPSAweGZmOwotCS8qIE1hcmsgdGhlIHNpbmdsZSBNQUMgY29uZmlndXJhdGlvbiByYW1yb2QgYXMgb3Bwb3NlZCB0byBhCi0JICogVUMvTUMgbGlzdCBjb25maWd1cmF0aW9uKS4KLQkgKi8KLQljb25maWctPmhkci5lY2hvID0gMTsKLQotCS8qIHByaW1hcnkgTUFDICovCi0JY29uZmlnLT5jb25maWdfdGFibGVbMF0ubXNiX21hY19hZGRyID0KLQkJCQkJc3dhYjE2KCoodTE2ICopJm1hY1swXSk7Ci0JY29uZmlnLT5jb25maWdfdGFibGVbMF0ubWlkZGxlX21hY19hZGRyID0KLQkJCQkJc3dhYjE2KCoodTE2ICopJm1hY1syXSk7Ci0JY29uZmlnLT5jb25maWdfdGFibGVbMF0ubHNiX21hY19hZGRyID0KLQkJCQkJc3dhYjE2KCoodTE2ICopJm1hY1s0XSk7Ci0JY29uZmlnLT5jb25maWdfdGFibGVbMF0uY2xpZW50c19iaXRfdmVjdG9yID0KLQkJCQkJY3B1X3RvX2xlMzIoY2xfYml0X3ZlYyk7Ci0JY29uZmlnLT5jb25maWdfdGFibGVbMF0udmxhbl9pZCA9IDA7Ci0JY29uZmlnLT5jb25maWdfdGFibGVbMF0ucGZfaWQgPSBCUF9GVU5DKGJwKTsKLQlpZiAoc2V0KQotCQlTRVRfRkxBRyhjb25maWctPmNvbmZpZ190YWJsZVswXS5mbGFncywKLQkJCU1BQ19DT05GSUdVUkFUSU9OX0VOVFJZX0FDVElPTl9UWVBFLAotCQkJVF9FVEhfTUFDX0NPTU1BTkRfU0VUKTsKLQllbHNlCi0JCVNFVF9GTEFHKGNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmZsYWdzLAotCQkJTUFDX0NPTkZJR1VSQVRJT05fRU5UUllfQUNUSU9OX1RZUEUsCi0JCQlUX0VUSF9NQUNfQ09NTUFORF9JTlZBTElEQVRFKTsKLQotCWlmIChpc19iY2FzdCkKLQkJU0VUX0ZMQUcoY29uZmlnLT5jb25maWdfdGFibGVbMF0uZmxhZ3MsCi0JCQlNQUNfQ09ORklHVVJBVElPTl9FTlRSWV9CUk9BRENBU1QsIDEpOwotCi0JRFAoTkVUSUZfTVNHX0lGVVAsICIlcyBNQUMgKCUwNHg6JTA0eDolMDR4KSAgUEZfSUQgJWQgIENMSUQgbWFzayAlZFxuIiwKLQkgICAoc2V0ID8gInNldHRpbmciIDogImNsZWFyaW5nIiksCi0JICAgY29uZmlnLT5jb25maWdfdGFibGVbMF0ubXNiX21hY19hZGRyLAotCSAgIGNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLm1pZGRsZV9tYWNfYWRkciwKLQkgICBjb25maWctPmNvbmZpZ190YWJsZVswXS5sc2JfbWFjX2FkZHIsIEJQX0ZVTkMoYnApLCBjbF9iaXRfdmVjKTsKLQotCW1iKCk7Ci0KLQlibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0NPTU1PTl9TRVRfTUFDLCAwLAotCQkgICAgICBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX2NvbmZpZykpLAotCQkgICAgICBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX2NvbmZpZykpLCAxKTsKLQotCS8qIFdhaXQgZm9yIGEgY29tcGxldGlvbiAqLwotCWJueDJ4X3dhaXRfcmFtcm9kKGJwLCAwLCAwLCAmYnAtPnNldF9tYWNfcGVuZGluZywgcmFtcm9kX2ZsYWdzKTsKLX0KLQotc3RhdGljIGludCBibngyeF93YWl0X3JhbXJvZChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc3RhdGUsIGludCBpZHgsCi0JCQkgICAgIGludCAqc3RhdGVfcCwgaW50IGZsYWdzKQotewotCS8qIGNhbiB0YWtlIGEgd2hpbGUgaWYgYW55IHBvcnQgaXMgcnVubmluZyAqLwotCWludCBjbnQgPSA1MDAwOwotCXU4IHBvbGwgPSBmbGFncyAmIFdBSVRfUkFNUk9EX1BPTEw7Ci0JdTggY29tbW9uID0gZmxhZ3MgJiBXQUlUX1JBTVJPRF9DT01NT047Ci0KLQlEUChORVRJRl9NU0dfSUZVUCwgIiVzIGZvciBzdGF0ZSB0byBiZWNvbWUgJXggb24gSURYIFslZF1cbiIsCi0JICAgcG9sbCA/ICJwb2xsaW5nIiA6ICJ3YWl0aW5nIiwgc3RhdGUsIGlkeCk7Ci0KLQltaWdodF9zbGVlcCgpOwotCXdoaWxlIChjbnQtLSkgewotCQlpZiAocG9sbCkgewotCQkJaWYgKGNvbW1vbikKLQkJCQlibngyeF9lcV9pbnQoYnApOwotCQkJZWxzZSB7Ci0JCQkJYm54MnhfcnhfaW50KGJwLT5mcCwgMTApOwotCQkJCS8qIGlmIGluZGV4IGlzIGRpZmZlcmVudCBmcm9tIDAKLQkJCQkgKiB0aGUgcmVwbHkgZm9yIHNvbWUgY29tbWFuZHMgd2lsbAotCQkJCSAqIGJlIG9uIHRoZSBub24gZGVmYXVsdCBxdWV1ZQotCQkJCSAqLwotCQkJCWlmIChpZHgpCi0JCQkJCWJueDJ4X3J4X2ludCgmYnAtPmZwW2lkeF0sIDEwKTsKLQkJCX0KLQkJfQotCi0JCW1iKCk7IC8qIHN0YXRlIGlzIGNoYW5nZWQgYnkgYm54Mnhfc3BfZXZlbnQoKSAqLwotCQlpZiAoKnN0YXRlX3AgPT0gc3RhdGUpIHsKLSNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCi0JCQlEUChORVRJRl9NU0dfSUZVUCwgImV4aXQgIChjbnQgJWQpXG4iLCA1MDAwIC0gY250KTsKLSNlbmRpZgotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQltc2xlZXAoMSk7Ci0KLQkJaWYgKGJwLT5wYW5pYykKLQkJCXJldHVybiAtRUlPOworCQkvKiBTZXQgdGhlIGNvbW1hbmQ6IEFERCBvciBERUwgKi8KKwkJaWYgKHNldCkKKwkJCXJhbXJvZF9wYXJhbS51c2VyX3JlcS5jbWQgPSBCTlgyWF9WTEFOX01BQ19BREQ7CisJCWVsc2UKKwkJCXJhbXJvZF9wYXJhbS51c2VyX3JlcS5jbWQgPSBCTlgyWF9WTEFOX01BQ19ERUw7CiAJfQogCi0JLyogdGltZW91dCEgKi8KLQlCTlgyWF9FUlIoInRpbWVvdXQgJXMgZm9yIHN0YXRlICV4IG9uIElEWCBbJWRdXG4iLAotCQkgIHBvbGwgPyAicG9sbGluZyIgOiAid2FpdGluZyIsIHN0YXRlLCBpZHgpOwotI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKLQlibngyeF9wYW5pYygpOwotI2VuZGlmCi0KLQlyZXR1cm4gLUVCVVNZOwotfQotCi1zdGF0aWMgdTggYm54MnhfZTFoX2NhbV9vZmZzZXQoc3RydWN0IGJueDJ4ICpicCwgdTggcmVsX29mZnNldCkKLXsKLQlpZiAoQ0hJUF9JU19FMUgoYnApKQotCQlyZXR1cm4gRTFIX0ZVTkNfTUFYICogcmVsX29mZnNldCArIEJQX0ZVTkMoYnApOwotCWVsc2UgaWYgKENISVBfTU9ERV9JU180X1BPUlQoYnApKQotCQlyZXR1cm4gRTJfRlVOQ19NQVggKiByZWxfb2Zmc2V0ICsgQlBfRlVOQyhicCk7Ci0JZWxzZQotCQlyZXR1cm4gRTJfRlVOQ19NQVggKiByZWxfb2Zmc2V0ICsgQlBfVk4oYnApOwotfQotCi0vKioKLSAqICBMTEggQ0FNIGxpbmUgYWxsb2NhdGlvbnM6IGN1cnJlbnRseSBvbmx5IGlTQ1NJIGFuZCBFVEggbWFjcyBhcmUKLSAqICByZWxldmFudC4gSW4gYWRkaXRpb24sIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgdHVuZWQgZm9yIGEKLSAqICBzaW5nbGUgRVRIIE1BQy4KLSAqLwotZW51bSB7Ci0JTExIX0NBTV9JU0NTSV9FVEhfTElORSA9IDAsCi0JTExIX0NBTV9FVEhfTElORSwKLQlMTEhfQ0FNX01BWF9QRl9MSU5FID0gTklHX1JFR19MTEgxX0ZVTkNfTUVNX1NJWkUKLX07Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3NldF9tYWNfaW5fbmlnKHN0cnVjdCBibngyeCAqYnAsCi0JCQkgIGludCBzZXQsCi0JCQkgIHVuc2lnbmVkIGNoYXIgKmRldl9hZGRyLAotCQkJICBpbnQgaW5kZXgpCi17Ci0JdTMyIHdiX2RhdGFbMl07Ci0JdTMyIG1lbV9vZmZzZXQsIGVuYV9vZmZzZXQsIG1lbV9pbmRleDsKLQkvKioKLQkgKiBpbmRleGVzIG1hcHBpbmc6Ci0JICogMC4uNyAtIGdvZXMgdG8gTUVNCi0JICogOC4uMTUgLSBnb2VzIHRvIE1FTTIKLQkgKi8KLQotCWlmICghSVNfTUZfU0koYnApIHx8IGluZGV4ID4gTExIX0NBTV9NQVhfUEZfTElORSkKLQkJcmV0dXJuOwotCi0JLyogY2FsY3VsYXRlIG1lbW9yeSBzdGFydCBvZmZzZXQgYWNjb3JkaW5nIHRvIHRoZSBtYXBwaW5nCi0JICogYW5kIGluZGV4IGluIHRoZSBtZW1vcnkgKi8KLQlpZiAoaW5kZXggPCBOSUdfTExIX0ZVTkNfTUVNX01BWF9PRkZTRVQpIHsKLQkJbWVtX29mZnNldCA9IEJQX1BPUlQoYnApID8gTklHX1JFR19MTEgxX0ZVTkNfTUVNIDoKLQkJCQkJICAgTklHX1JFR19MTEgwX0ZVTkNfTUVNOwotCQllbmFfb2Zmc2V0ID0gQlBfUE9SVChicCkgPyBOSUdfUkVHX0xMSDFfRlVOQ19NRU1fRU5BQkxFIDoKLQkJCQkJICAgTklHX1JFR19MTEgwX0ZVTkNfTUVNX0VOQUJMRTsKLQkJbWVtX2luZGV4ID0gaW5kZXg7Ci0JfSBlbHNlIHsKLQkJbWVtX29mZnNldCA9IEJQX1BPUlQoYnApID8gTklHX1JFR19QMV9MTEhfRlVOQ19NRU0yIDoKLQkJCQkJICAgTklHX1JFR19QMF9MTEhfRlVOQ19NRU0yOwotCQllbmFfb2Zmc2V0ID0gQlBfUE9SVChicCkgPyBOSUdfUkVHX1AxX0xMSF9GVU5DX01FTTJfRU5BQkxFIDoKLQkJCQkJICAgTklHX1JFR19QMF9MTEhfRlVOQ19NRU0yX0VOQUJMRTsKLQkJbWVtX2luZGV4ID0gaW5kZXggLSBOSUdfTExIX0ZVTkNfTUVNX01BWF9PRkZTRVQ7Ci0JfQotCi0JaWYgKHNldCkgewotCQkvKiBMTEhfRlVOQ19NRU0gaXMgYSB1NjQgV0IgcmVnaXN0ZXIgKi8KLQkJbWVtX29mZnNldCArPSA4Km1lbV9pbmRleDsKLQotCQl3Yl9kYXRhWzBdID0gKChkZXZfYWRkclsyXSA8PCAyNCkgfCAoZGV2X2FkZHJbM10gPDwgMTYpIHwKLQkJCSAgICAgIChkZXZfYWRkcls0XSA8PCAgOCkgfCAgZGV2X2FkZHJbNV0pOwotCQl3Yl9kYXRhWzFdID0gKChkZXZfYWRkclswXSA8PCAgOCkgfCAgZGV2X2FkZHJbMV0pOwotCi0JCVJFR19XUl9ETUFFKGJwLCBtZW1fb2Zmc2V0LCB3Yl9kYXRhLCAyKTsKLQl9Ci0KLQkvKiBlbmFibGUvZGlzYWJsZSB0aGUgZW50cnkgKi8KLQlSRUdfV1IoYnAsIGVuYV9vZmZzZXQgKyA0Km1lbV9pbmRleCwgc2V0KTsKLQotfQotCi12b2lkIGJueDJ4X3NldF9ldGhfbWFjKHN0cnVjdCBibngyeCAqYnAsIGludCBzZXQpCi17Ci0JdTggY2FtX29mZnNldCA9IChDSElQX0lTX0UxKGJwKSA/IChCUF9QT1JUKGJwKSA/IDMyIDogMCkgOgotCQkJIGJueDJ4X2UxaF9jYW1fb2Zmc2V0KGJwLCBDQU1fRVRIX0xJTkUpKTsKLQotCS8qIG5ldHdvcmtpbmcgIE1BQyAqLwotCWJueDJ4X3NldF9tYWNfYWRkcl9nZW4oYnAsIHNldCwgYnAtPmRldi0+ZGV2X2FkZHIsCi0JCQkgICAgICAgKDEgPDwgYnAtPmZwLT5jbF9pZCksIGNhbV9vZmZzZXQgLCAwKTsKLQotCWJueDJ4X3NldF9tYWNfaW5fbmlnKGJwLCBzZXQsIGJwLT5kZXYtPmRldl9hZGRyLCBMTEhfQ0FNX0VUSF9MSU5FKTsKLQotCWlmIChDSElQX0lTX0UxKGJwKSkgewotCQkvKiBicm9hZGNhc3QgTUFDICovCi0JCXN0YXRpYyBjb25zdCB1OCBiY2FzdFtFVEhfQUxFTl0gPSB7Ci0JCQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCi0JCX07Ci0JCWJueDJ4X3NldF9tYWNfYWRkcl9nZW4oYnAsIHNldCwgYmNhc3QsIDAsIGNhbV9vZmZzZXQgKyAxLCAxKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggYm54MnhfZTFfY2FtX21jX29mZnNldChzdHJ1Y3QgYm54MnggKmJwKQotewotCXJldHVybiBDSElQX1JFVl9JU19TTE9XKGJwKSA/Ci0JCShCTlgyWF9NQVhfRU1VTF9NVUxUSSAqICgxICsgQlBfUE9SVChicCkpKSA6Ci0JCShCTlgyWF9NQVhfTVVMVElDQVNUICogKDEgKyBCUF9QT1JUKGJwKSkpOwotfQotCi0vKiBzZXQgbWMgbGlzdCwgZG8gbm90IHdhaXQgYXMgd2FpdCBpbXBsaWVzIHNsZWVwIGFuZAotICogc2V0X3J4X21vZGUgY2FuIGJlIGludm9rZWQgZnJvbSBub24tc2xlZXBhYmxlIGNvbnRleHQuCi0gKgotICogSW5zdGVhZCB3ZSB1c2UgdGhlIHNhbWUgcmFtcm9kIGRhdGEgYnVmZmVyIGVhY2ggdGltZSB3ZSBuZWVkCi0gKiB0byBjb25maWd1cmUgYSBsaXN0IG9mIGFkZHJlc3NlcywgYW5kIHVzZSB0aGUgZmFjdCB0aGF0IHRoZQotICogbGlzdCBvZiBNQUNzIGlzIGNoYW5nZWQgaW4gYW4gaW5jcmVtZW50YWwgd2F5IGFuZCB0aGF0IHRoZQotICogZnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIHRoZSBuZXRpZl9hZGRyX2xvY2suIEEgdGVtcG9yYXJ5Ci0gKiBpbmNvbnNpc3RlbnQgQ0FNIGNvbmZpZ3VyYXRpb24gKHBvc3NpYmxlIGluIGNhc2Ugb2YgYSB2ZXJ5IGZhc3QKLSAqIHNlcXVlbmNlIG9mIGFkZC9kZWwvYWRkIG9uIHRoZSBob3N0IHNpZGUpIHdpbGwgc2hvcnRseSBiZQotICogcmVzdG9yZWQgYnkgdGhlIGhhbmRsZXIgb2YgdGhlIGxhc3QgcmFtcm9kLgotICovCi1zdGF0aWMgaW50IGJueDJ4X3NldF9lMV9tY19saXN0KHN0cnVjdCBibngyeCAqYnApCi17Ci0JaW50IGkgPSAwLCBvbGQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJwLT5kZXY7Ci0JdTggb2Zmc2V0ID0gYm54MnhfZTFfY2FtX21jX29mZnNldChicCk7Ci0Jc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQlzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICpjb25maWdfY21kID0gYm54Mnhfc3AoYnAsIG1jYXN0X2NvbmZpZyk7Ci0JZG1hX2FkZHJfdCBjb25maWdfY21kX21hcCA9IGJueDJ4X3NwX21hcHBpbmcoYnAsIG1jYXN0X2NvbmZpZyk7Ci0KLQlpZiAobmV0ZGV2X21jX2NvdW50KGRldikgPiBCTlgyWF9NQVhfTVVMVElDQVNUKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKLQkJLyogY29weSBtYWMgKi8KLQkJY29uZmlnX2NtZC0+Y29uZmlnX3RhYmxlW2ldLm1zYl9tYWNfYWRkciA9Ci0JCQlzd2FiMTYoKih1MTYgKikmYm54MnhfbWNfYWRkcihoYSlbMF0pOwotCQljb25maWdfY21kLT5jb25maWdfdGFibGVbaV0ubWlkZGxlX21hY19hZGRyID0KLQkJCXN3YWIxNigqKHUxNiAqKSZibngyeF9tY19hZGRyKGhhKVsyXSk7Ci0JCWNvbmZpZ19jbWQtPmNvbmZpZ190YWJsZVtpXS5sc2JfbWFjX2FkZHIgPQotCQkJc3dhYjE2KCoodTE2ICopJmJueDJ4X21jX2FkZHIoaGEpWzRdKTsKLQotCQljb25maWdfY21kLT5jb25maWdfdGFibGVbaV0udmxhbl9pZCA9IDA7Ci0JCWNvbmZpZ19jbWQtPmNvbmZpZ190YWJsZVtpXS5wZl9pZCA9IEJQX0ZVTkMoYnApOwotCQljb25maWdfY21kLT5jb25maWdfdGFibGVbaV0uY2xpZW50c19iaXRfdmVjdG9yID0KLQkJCWNwdV90b19sZTMyKDEgPDwgQlBfTF9JRChicCkpOwotCi0JCVNFVF9GTEFHKGNvbmZpZ19jbWQtPmNvbmZpZ190YWJsZVtpXS5mbGFncywKLQkJCU1BQ19DT05GSUdVUkFUSU9OX0VOVFJZX0FDVElPTl9UWVBFLAotCQkJVF9FVEhfTUFDX0NPTU1BTkRfU0VUKTsKLQotCQlEUChORVRJRl9NU0dfSUZVUCwKLQkJICAgInNldHRpbmcgTUNBU1RbJWRdICglMDR4OiUwNHg6JTA0eClcbiIsIGksCi0JCSAgIGNvbmZpZ19jbWQtPmNvbmZpZ190YWJsZVtpXS5tc2JfbWFjX2FkZHIsCi0JCSAgIGNvbmZpZ19jbWQtPmNvbmZpZ190YWJsZVtpXS5taWRkbGVfbWFjX2FkZHIsCi0JCSAgIGNvbmZpZ19jbWQtPmNvbmZpZ190YWJsZVtpXS5sc2JfbWFjX2FkZHIpOwotCQlpKys7Ci0JfQotCW9sZCA9IGNvbmZpZ19jbWQtPmhkci5sZW5ndGg7Ci0JaWYgKG9sZCA+IGkpIHsKLQkJZm9yICg7IGkgPCBvbGQ7IGkrKykgewotCQkJaWYgKENBTV9JU19JTlZBTElEKGNvbmZpZ19jbWQtPgotCQkJCQkgICBjb25maWdfdGFibGVbaV0pKSB7Ci0JCQkJLyogYWxyZWFkeSBpbnZhbGlkYXRlZCAqLwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogaW52YWxpZGF0ZSAqLwotCQkJU0VUX0ZMQUcoY29uZmlnX2NtZC0+Y29uZmlnX3RhYmxlW2ldLmZsYWdzLAotCQkJCU1BQ19DT05GSUdVUkFUSU9OX0VOVFJZX0FDVElPTl9UWVBFLAotCQkJCVRfRVRIX01BQ19DT01NQU5EX0lOVkFMSURBVEUpOwotCQl9Ci0JfQotCi0Jd21iKCk7Ci0KLQljb25maWdfY21kLT5oZHIubGVuZ3RoID0gaTsKLQljb25maWdfY21kLT5oZHIub2Zmc2V0ID0gb2Zmc2V0OwotCWNvbmZpZ19jbWQtPmhkci5jbGllbnRfaWQgPSAweGZmOwotCS8qIE1hcmsgdGhhdCB0aGlzIHJhbXJvZCBkb2Vzbid0IHVzZSBicC0+c2V0X21hY19wZW5kaW5nIGZvcgotCSAqIHN5bmNocm9uaXphdGlvbi4KLQkgKi8KLQljb25maWdfY21kLT5oZHIuZWNobyA9IDA7Ci0KLQltYigpOwotCi0JcmV0dXJuIGJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfQ09NTU9OX1NFVF9NQUMsIDAsCi0JCSAgIFU2NF9ISShjb25maWdfY21kX21hcCksIFU2NF9MTyhjb25maWdfY21kX21hcCksIDEpOwotfQotCi12b2lkIGJueDJ4X2ludmFsaWRhdGVfZTFfbWNfbGlzdChzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBpOwotCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKmNvbmZpZ19jbWQgPSBibngyeF9zcChicCwgbWNhc3RfY29uZmlnKTsKLQlkbWFfYWRkcl90IGNvbmZpZ19jbWRfbWFwID0gYm54Mnhfc3BfbWFwcGluZyhicCwgbWNhc3RfY29uZmlnKTsKLQlpbnQgcmFtcm9kX2ZsYWdzID0gV0FJVF9SQU1ST0RfQ09NTU9OOwotCXU4IG9mZnNldCA9IGJueDJ4X2UxX2NhbV9tY19vZmZzZXQoYnApOwotCi0JZm9yIChpID0gMDsgaSA8IEJOWDJYX01BWF9NVUxUSUNBU1Q7IGkrKykKLQkJU0VUX0ZMQUcoY29uZmlnX2NtZC0+Y29uZmlnX3RhYmxlW2ldLmZsYWdzLAotCQkJTUFDX0NPTkZJR1VSQVRJT05fRU5UUllfQUNUSU9OX1RZUEUsCi0JCQlUX0VUSF9NQUNfQ09NTUFORF9JTlZBTElEQVRFKTsKLQotCXdtYigpOwotCi0JY29uZmlnX2NtZC0+aGRyLmxlbmd0aCA9IEJOWDJYX01BWF9NVUxUSUNBU1Q7Ci0JY29uZmlnX2NtZC0+aGRyLm9mZnNldCA9IG9mZnNldDsKLQljb25maWdfY21kLT5oZHIuY2xpZW50X2lkID0gMHhmZjsKLQkvKiBXZSdsbCB3YWl0IGZvciBhIGNvbXBsZXRpb24gdGhpcyB0aW1lLi4uICovCi0JY29uZmlnX2NtZC0+aGRyLmVjaG8gPSAxOwotCi0JYnAtPnNldF9tYWNfcGVuZGluZyA9IDE7Ci0KLQltYigpOwotCi0JYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9DT01NT05fU0VUX01BQywgMCwKLQkJICAgICAgVTY0X0hJKGNvbmZpZ19jbWRfbWFwKSwgVTY0X0xPKGNvbmZpZ19jbWRfbWFwKSwgMSk7Ci0KLQkvKiBXYWl0IGZvciBhIGNvbXBsZXRpb24gKi8KLQlibngyeF93YWl0X3JhbXJvZChicCwgMCwgMCwgJmJwLT5zZXRfbWFjX3BlbmRpbmcsCi0JCQkJcmFtcm9kX2ZsYWdzKTsKLQotfQotCi0vKiBBY2NlcHQgb25lIG9yIG1vcmUgbXVsdGljYXN0cyAqLwotc3RhdGljIGludCBibngyeF9zZXRfZTFoX21jX2xpc3Qoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnAtPmRldjsKLQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCXUzMiBtY19maWx0ZXJbTUNfSEFTSF9TSVpFXTsKLQl1MzIgY3JjLCBiaXQsIHJlZ2lkeDsKLQlpbnQgaTsKLQotCW1lbXNldChtY19maWx0ZXIsIDAsIDQgKiBNQ19IQVNIX1NJWkUpOwotCi0JbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewotCQlEUChORVRJRl9NU0dfSUZVUCwgIkFkZGluZyBtY2FzdCBNQUM6ICVwTVxuIiwKLQkJICAgYm54MnhfbWNfYWRkcihoYSkpOwotCi0JCWNyYyA9IGNyYzMyY19sZSgwLCBibngyeF9tY19hZGRyKGhhKSwKLQkJCQlFVEhfQUxFTik7Ci0JCWJpdCA9IChjcmMgPj4gMjQpICYgMHhmZjsKLQkJcmVnaWR4ID0gYml0ID4+IDU7Ci0JCWJpdCAmPSAweDFmOwotCQltY19maWx0ZXJbcmVnaWR4XSB8PSAoMSA8PCBiaXQpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBNQ19IQVNIX1NJWkU7IGkrKykKLQkJUkVHX1dSKGJwLCBNQ19IQVNIX09GRlNFVChicCwgaSksCi0JCSAgICAgICBtY19maWx0ZXJbaV0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgYm54MnhfaW52YWxpZGF0ZV9lMWhfbWNfbGlzdChzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1DX0hBU0hfU0laRTsgaSsrKQotCQlSRUdfV1IoYnAsIE1DX0hBU0hfT0ZGU0VUKGJwLCBpKSwgMCk7Ci19Ci0KLSNpZmRlZiBCQ01fQ05JQwotLyoqCi0gKiBibngyeF9zZXRfaXNjc2lfZXRoX21hY19hZGRyIC0gc2V0IGlTQ1NJIE1BQyhzKS4KLSAqCi0gKiBAYnA6CQlkcml2ZXIgaGFuZGxlCi0gKiBAc2V0OglzZXQgb3IgY2xlYXIgdGhlIENBTSBlbnRyeQotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCB3YWl0IHVudGlsIHRoZSByYW1kb3JkIGNvbXBsZXRpb24gcmV0dXJucy4KLSAqIFJldHVybiAwIGlmIHN1Y2Nlc3MsIC1FTk9ERVYgaWYgcmFtcm9kIGRvZXNuJ3QgcmV0dXJuLgotICovCi1zdGF0aWMgaW50IGJueDJ4X3NldF9pc2NzaV9ldGhfbWFjX2FkZHIoc3RydWN0IGJueDJ4ICpicCwgaW50IHNldCkKLXsKLQl1OCBjYW1fb2Zmc2V0ID0gKENISVBfSVNfRTEoYnApID8gKChCUF9QT1JUKGJwKSA/IDMyIDogMCkgKyAyKSA6Ci0JCQkgYm54MnhfZTFoX2NhbV9vZmZzZXQoYnAsIENBTV9JU0NTSV9FVEhfTElORSkpOwotCXUzMiBpc2NzaV9sMl9jbF9pZCA9IEJOWDJYX0lTQ1NJX0VUSF9DTF9JRCArCi0JCUJQX0UxSFZOKGJwKSAqIE5PTkVfRVRIX0NPTlRFWFRfVVNFOwotCXUzMiBjbF9iaXRfdmVjID0gKDEgPDwgaXNjc2lfbDJfY2xfaWQpOwotCXU4ICppc2NzaV9tYWMgPSBicC0+Y25pY19ldGhfZGV2LmlzY3NpX21hYzsKLQotCS8qIFNlbmQgYSBTRVRfTUFDIHJhbXJvZCAqLwotCWJueDJ4X3NldF9tYWNfYWRkcl9nZW4oYnAsIHNldCwgaXNjc2lfbWFjLCBjbF9iaXRfdmVjLAotCQkJICAgICAgIGNhbV9vZmZzZXQsIDApOwotCi0JYm54Mnhfc2V0X21hY19pbl9uaWcoYnAsIHNldCwgaXNjc2lfbWFjLCBMTEhfQ0FNX0lTQ1NJX0VUSF9MSU5FKTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGJueDJ4X3NldF9maXBfZXRoX21hY19hZGRyIC0gc2V0IEZDb0UgTDIgTUFDKHMpCi0gKgotICogQGJwOgkJZHJpdmVyIGhhbmRsZQotICogQHNldDoJc2V0IG9yIGNsZWFyIHRoZSBDQU0gZW50cnkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgd2FpdCB1bnRpbCB0aGUgcmFtcm9kIGNvbXBsZXRpb24gcmV0dXJucy4KLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzLCAtRU5PREVWIGlmIHJhbXJvZCBkb2Vzbid0IHJldHVybi4KLSAqLwotaW50IGJueDJ4X3NldF9maXBfZXRoX21hY19hZGRyKHN0cnVjdCBibngyeCAqYnAsIGludCBzZXQpCi17Ci0JdTMyIGNsX2JpdF92ZWMgPSAoMSA8PCBibngyeF9mY29lKGJwLCBjbF9pZCkpOwotCS8qKgotCSAqIENBTSBhbGxvY2F0aW9uIGZvciBFMUgKLQkgKiBldGggdW5pY2FzdHM6IGJ5IGZ1bmMgbnVtYmVyCi0JICogaXNjc2k6IGJ5IGZ1bmMgbnVtYmVyCi0JICogZmlwIHVuaWNhc3Q6IGJ5IGZ1bmMgbnVtYmVyCi0JICogZmlwIG11bHRpY2FzdDogYnkgZnVuYyBudW1iZXIKLQkgKi8KLQlibngyeF9zZXRfbWFjX2FkZHJfZ2VuKGJwLCBzZXQsIGJwLT5maXBfbWFjLAotCQljbF9iaXRfdmVjLCBibngyeF9lMWhfY2FtX29mZnNldChicCwgQ0FNX0ZJUF9FVEhfTElORSksIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBibngyeF9zZXRfYWxsX2Vub2RlX21hY3Moc3RydWN0IGJueDJ4ICpicCwgaW50IHNldCkKLXsKLQl1MzIgY2xfYml0X3ZlYyA9ICgxIDw8IGJueDJ4X2Zjb2UoYnAsIGNsX2lkKSk7Ci0KLQkvKioKLQkgKiBDQU0gYWxsb2NhdGlvbiBmb3IgRTFICi0JICogZXRoIHVuaWNhc3RzOiBieSBmdW5jIG51bWJlcgotCSAqIGlzY3NpOiBieSBmdW5jIG51bWJlcgotCSAqIGZpcCB1bmljYXN0OiBieSBmdW5jIG51bWJlcgotCSAqIGZpcCBtdWx0aWNhc3Q6IGJ5IGZ1bmMgbnVtYmVyCi0JICovCi0JYm54Mnhfc2V0X21hY19hZGRyX2dlbihicCwgc2V0LCBBTExfRU5PREVfTUFDUywJY2xfYml0X3ZlYywKLQkJYm54MnhfZTFoX2NhbV9vZmZzZXQoYnAsIENBTV9GSVBfTUNBU1RfTElORSksIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgYm54MnhfZmlsbF9jbF9pbml0X2RhdGEoc3RydWN0IGJueDJ4ICpicCwKLQkJCQkgICAgc3RydWN0IGJueDJ4X2NsaWVudF9pbml0X3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgICB1OCBhY3RpdmF0ZSwKLQkJCQkgICAgc3RydWN0IGNsaWVudF9pbml0X3JhbXJvZF9kYXRhICpkYXRhKQotewotCS8qIENsZWFyIHRoZSBidWZmZXIgKi8KLQltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7Ci0KLQkvKiBnZW5lcmFsICovCi0JZGF0YS0+Z2VuZXJhbC5jbGllbnRfaWQgPSBwYXJhbXMtPnJ4cV9wYXJhbXMuY2xfaWQ7Ci0JZGF0YS0+Z2VuZXJhbC5zdGF0aXN0aWNzX2NvdW50ZXJfaWQgPSBwYXJhbXMtPnJ4cV9wYXJhbXMuc3RhdF9pZDsKLQlkYXRhLT5nZW5lcmFsLnN0YXRpc3RpY3NfZW5fZmxnID0KLQkJKHBhcmFtcy0+cnhxX3BhcmFtcy5mbGFncyAmIFFVRVVFX0ZMR19TVEFUUykgPyAxIDogMDsKLQlkYXRhLT5nZW5lcmFsLmlzX2Zjb2VfZmxnID0KLQkJKHBhcmFtcy0+cmFtcm9kX3BhcmFtcy5mbGFncyAmIENMSUVOVF9JU19GQ09FKSA/IDEgOiAwOwotCWRhdGEtPmdlbmVyYWwuYWN0aXZhdGVfZmxnID0gYWN0aXZhdGU7Ci0JZGF0YS0+Z2VuZXJhbC5zcF9jbGllbnRfaWQgPSBwYXJhbXMtPnJ4cV9wYXJhbXMuc3BjbF9pZDsKLQotCS8qIFJ4IGRhdGEgKi8KLQlkYXRhLT5yeC50cGFfZW5fZmxnID0KLQkJKHBhcmFtcy0+cnhxX3BhcmFtcy5mbGFncyAmIFFVRVVFX0ZMR19UUEEpID8gMSA6IDA7Ci0JZGF0YS0+cngudm1xdWV1ZV9tb2RlX2VuX2ZsZyA9IDA7Ci0JZGF0YS0+cnguY2FjaGVfbGluZV9hbGlnbm1lbnRfbG9nX3NpemUgPQotCQlwYXJhbXMtPnJ4cV9wYXJhbXMuY2FjaGVfbGluZV9sb2c7Ci0JZGF0YS0+cnguZW5hYmxlX2R5bmFtaWNfaGMgPQotCQkocGFyYW1zLT5yeHFfcGFyYW1zLmZsYWdzICYgUVVFVUVfRkxHX0RIQykgPyAxIDogMDsKLQlkYXRhLT5yeC5tYXhfc2dlc19mb3JfcGFja2V0ID0gcGFyYW1zLT5yeHFfcGFyYW1zLm1heF9zZ2VzX3BrdDsKLQlkYXRhLT5yeC5jbGllbnRfcXpvbmVfaWQgPSBwYXJhbXMtPnJ4cV9wYXJhbXMuY2xfcXpvbmVfaWQ7Ci0JZGF0YS0+cngubWF4X2FnZ19zaXplID0gcGFyYW1zLT5yeHFfcGFyYW1zLnRwYV9hZ2dfc3o7Ci0KLQkvKiBXZSBkb24ndCBzZXQgZHJvcCBmbGFncyAqLwotCWRhdGEtPnJ4LmRyb3BfaXBfY3NfZXJyX2ZsZyA9IDA7Ci0JZGF0YS0+cnguZHJvcF90Y3BfY3NfZXJyX2ZsZyA9IDA7Ci0JZGF0YS0+cnguZHJvcF90dGwwX2ZsZyA9IDA7Ci0JZGF0YS0+cnguZHJvcF91ZHBfY3NfZXJyX2ZsZyA9IDA7Ci0KLQlkYXRhLT5yeC5pbm5lcl92bGFuX3JlbW92YWxfZW5hYmxlX2ZsZyA9Ci0JCShwYXJhbXMtPnJ4cV9wYXJhbXMuZmxhZ3MgJiBRVUVVRV9GTEdfVkxBTikgPyAxIDogMDsKLQlkYXRhLT5yeC5vdXRlcl92bGFuX3JlbW92YWxfZW5hYmxlX2ZsZyA9Ci0JCShwYXJhbXMtPnJ4cV9wYXJhbXMuZmxhZ3MgJiBRVUVVRV9GTEdfT1YpID8gMSA6IDA7Ci0JZGF0YS0+cnguc3RhdHVzX2Jsb2NrX2lkID0gcGFyYW1zLT5yeHFfcGFyYW1zLmZ3X3NiX2lkOwotCWRhdGEtPnJ4LnJ4X3NiX2luZGV4X251bWJlciA9IHBhcmFtcy0+cnhxX3BhcmFtcy5zYl9jcV9pbmRleDsKLQlkYXRhLT5yeC5iZF9idWZmX3NpemUgPSBjcHVfdG9fbGUxNihwYXJhbXMtPnJ4cV9wYXJhbXMuYnVmX3N6KTsKLQlkYXRhLT5yeC5zZ2VfYnVmZl9zaXplID0gY3B1X3RvX2xlMTYocGFyYW1zLT5yeHFfcGFyYW1zLnNnZV9idWZfc3opOwotCWRhdGEtPnJ4Lm10dSA9IGNwdV90b19sZTE2KHBhcmFtcy0+cnhxX3BhcmFtcy5tdHUpOwotCWRhdGEtPnJ4LmJkX3BhZ2VfYmFzZS5sbyA9Ci0JCWNwdV90b19sZTMyKFU2NF9MTyhwYXJhbXMtPnJ4cV9wYXJhbXMuZHNjcl9tYXApKTsKLQlkYXRhLT5yeC5iZF9wYWdlX2Jhc2UuaGkgPQotCQljcHVfdG9fbGUzMihVNjRfSEkocGFyYW1zLT5yeHFfcGFyYW1zLmRzY3JfbWFwKSk7Ci0JZGF0YS0+cnguc2dlX3BhZ2VfYmFzZS5sbyA9Ci0JCWNwdV90b19sZTMyKFU2NF9MTyhwYXJhbXMtPnJ4cV9wYXJhbXMuc2dlX21hcCkpOwotCWRhdGEtPnJ4LnNnZV9wYWdlX2Jhc2UuaGkgPQotCQljcHVfdG9fbGUzMihVNjRfSEkocGFyYW1zLT5yeHFfcGFyYW1zLnNnZV9tYXApKTsKLQlkYXRhLT5yeC5jcWVfcGFnZV9iYXNlLmxvID0KLQkJY3B1X3RvX2xlMzIoVTY0X0xPKHBhcmFtcy0+cnhxX3BhcmFtcy5yY3FfbWFwKSk7Ci0JZGF0YS0+cnguY3FlX3BhZ2VfYmFzZS5oaSA9Ci0JCWNwdV90b19sZTMyKFU2NF9ISShwYXJhbXMtPnJ4cV9wYXJhbXMucmNxX21hcCkpOwotCWRhdGEtPnJ4LmlzX2xlYWRpbmdfcnNzID0KLQkJKHBhcmFtcy0+cmFtcm9kX3BhcmFtcy5mbGFncyAmIENMSUVOVF9JU19MRUFESU5HX1JTUykgPyAxIDogMDsKLQlkYXRhLT5yeC5pc19hcHByb3hfbWNhc3QgPSBkYXRhLT5yeC5pc19sZWFkaW5nX3JzczsKLQotCS8qIFR4IGRhdGEgKi8KLQlkYXRhLT50eC5lbmZvcmNlX3NlY3VyaXR5X2ZsZyA9IDA7IC8qIFZGIHNwZWNpZmljICovCi0JZGF0YS0+dHgudHhfc3RhdHVzX2Jsb2NrX2lkID0gcGFyYW1zLT50eHFfcGFyYW1zLmZ3X3NiX2lkOwotCWRhdGEtPnR4LnR4X3NiX2luZGV4X251bWJlciA9IHBhcmFtcy0+dHhxX3BhcmFtcy5zYl9jcV9pbmRleDsKLQlkYXRhLT50eC5tdHUgPSAwOyAvKiBWRiBzcGVjaWZpYyAqLwotCWRhdGEtPnR4LnR4X2JkX3BhZ2VfYmFzZS5sbyA9Ci0JCWNwdV90b19sZTMyKFU2NF9MTyhwYXJhbXMtPnR4cV9wYXJhbXMuZHNjcl9tYXApKTsKLQlkYXRhLT50eC50eF9iZF9wYWdlX2Jhc2UuaGkgPQotCQljcHVfdG9fbGUzMihVNjRfSEkocGFyYW1zLT50eHFfcGFyYW1zLmRzY3JfbWFwKSk7Ci0KLQkvKiBmbG93IGNvbnRyb2wgZGF0YSAqLwotCWRhdGEtPmZjLmNxZV9wYXVzZV90aHJfbG93ID0gY3B1X3RvX2xlMTYocGFyYW1zLT5wYXVzZS5yY3FfdGhfbG8pOwotCWRhdGEtPmZjLmNxZV9wYXVzZV90aHJfaGlnaCA9IGNwdV90b19sZTE2KHBhcmFtcy0+cGF1c2UucmNxX3RoX2hpKTsKLQlkYXRhLT5mYy5iZF9wYXVzZV90aHJfbG93ID0gY3B1X3RvX2xlMTYocGFyYW1zLT5wYXVzZS5iZF90aF9sbyk7Ci0JZGF0YS0+ZmMuYmRfcGF1c2VfdGhyX2hpZ2ggPSBjcHVfdG9fbGUxNihwYXJhbXMtPnBhdXNlLmJkX3RoX2hpKTsKLQlkYXRhLT5mYy5zZ2VfcGF1c2VfdGhyX2xvdyA9IGNwdV90b19sZTE2KHBhcmFtcy0+cGF1c2Uuc2dlX3RoX2xvKTsKLQlkYXRhLT5mYy5zZ2VfcGF1c2VfdGhyX2hpZ2ggPSBjcHVfdG9fbGUxNihwYXJhbXMtPnBhdXNlLnNnZV90aF9oaSk7Ci0JZGF0YS0+ZmMucnhfY29zX21hc2sgPSBjcHVfdG9fbGUxNihwYXJhbXMtPnBhdXNlLnByaV9tYXApOwotCi0JZGF0YS0+ZmMuc2FmY19ncm91cF9udW0gPSBwYXJhbXMtPnR4cV9wYXJhbXMuY29zOwotCWRhdGEtPmZjLnNhZmNfZ3JvdXBfZW5fZmxnID0KLQkJKHBhcmFtcy0+dHhxX3BhcmFtcy5mbGFncyAmIFFVRVVFX0ZMR19DT1MpID8gMSA6IDA7Ci0JZGF0YS0+ZmMudHJhZmZpY190eXBlID0KLQkJKHBhcmFtcy0+cmFtcm9kX3BhcmFtcy5mbGFncyAmIENMSUVOVF9JU19GQ09FKSA/Ci0JCUxMRkNfVFJBRkZJQ19UWVBFX0ZDT0UgOiBMTEZDX1RSQUZGSUNfVFlQRV9OVzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3NldF9jdHhfdmFsaWRhdGlvbihzdHJ1Y3QgZXRoX2NvbnRleHQgKmN4dCwgdTMyIGNpZCkKLXsKLQkvKiB1c3Rvcm0gY3h0IHZhbGlkYXRpb24gKi8KLQljeHQtPnVzdG9ybV9hZ19jb250ZXh0LmNkdV91c2FnZSA9Ci0JCUNEVV9SU1JWRF9WQUxVRV9UWVBFX0EoY2lkLCBDRFVfUkVHSU9OX05VTUJFUl9VQ01fQUcsCi0JCQkJICAgICAgIEVUSF9DT05ORUNUSU9OX1RZUEUpOwotCS8qIHhjb250ZXh0IHZhbGlkYXRpb24gKi8KLQljeHQtPnhzdG9ybV9hZ19jb250ZXh0LmNkdV9yZXNlcnZlZCA9Ci0JCUNEVV9SU1JWRF9WQUxVRV9UWVBFX0EoY2lkLCBDRFVfUkVHSU9OX05VTUJFUl9YQ01fQUcsCi0JCQkJICAgICAgIEVUSF9DT05ORUNUSU9OX1RZUEUpOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3NldHVwX2Z3X2NsaWVudChzdHJ1Y3QgYm54MnggKmJwLAotCQkJCSBzdHJ1Y3QgYm54MnhfY2xpZW50X2luaXRfcGFyYW1zICpwYXJhbXMsCi0JCQkJIHU4IGFjdGl2YXRlLAotCQkJCSBzdHJ1Y3QgY2xpZW50X2luaXRfcmFtcm9kX2RhdGEgKmRhdGEsCi0JCQkJIGRtYV9hZGRyX3QgZGF0YV9tYXBwaW5nKQotewotCXUxNiBoY191c2VjOwotCWludCByYW1yb2QgPSBSQU1ST0RfQ01EX0lEX0VUSF9DTElFTlRfU0VUVVA7Ci0JaW50IHJhbXJvZF9mbGFncyA9IDAsIHJjOwotCi0JLyogSEMgYW5kIGNvbnRleHQgdmFsaWRhdGlvbiB2YWx1ZXMgKi8KLQloY191c2VjID0gcGFyYW1zLT50eHFfcGFyYW1zLmhjX3JhdGUgPwotCQkxMDAwMDAwIC8gcGFyYW1zLT50eHFfcGFyYW1zLmhjX3JhdGUgOiAwOwotCWJueDJ4X3VwZGF0ZV9jb2FsZXNjZV9zYl9pbmRleChicCwKLQkJCXBhcmFtcy0+dHhxX3BhcmFtcy5md19zYl9pZCwKLQkJCXBhcmFtcy0+dHhxX3BhcmFtcy5zYl9jcV9pbmRleCwKLQkJCSEocGFyYW1zLT50eHFfcGFyYW1zLmZsYWdzICYgUVVFVUVfRkxHX0hDKSwKLQkJCWhjX3VzZWMpOwotCi0JKihwYXJhbXMtPnJhbXJvZF9wYXJhbXMucHN0YXRlKSA9IEJOWDJYX0ZQX1NUQVRFX09QRU5JTkc7Ci0KLQloY191c2VjID0gcGFyYW1zLT5yeHFfcGFyYW1zLmhjX3JhdGUgPwotCQkxMDAwMDAwIC8gcGFyYW1zLT5yeHFfcGFyYW1zLmhjX3JhdGUgOiAwOwotCWJueDJ4X3VwZGF0ZV9jb2FsZXNjZV9zYl9pbmRleChicCwKLQkJCXBhcmFtcy0+cnhxX3BhcmFtcy5md19zYl9pZCwKLQkJCXBhcmFtcy0+cnhxX3BhcmFtcy5zYl9jcV9pbmRleCwKLQkJCSEocGFyYW1zLT5yeHFfcGFyYW1zLmZsYWdzICYgUVVFVUVfRkxHX0hDKSwKLQkJCWhjX3VzZWMpOwotCi0JYm54Mnhfc2V0X2N0eF92YWxpZGF0aW9uKHBhcmFtcy0+cnhxX3BhcmFtcy5jeHQsCi0JCQkJIHBhcmFtcy0+cnhxX3BhcmFtcy5jaWQpOwotCi0JLyogemVybyBzdGF0cyAqLwotCWlmIChwYXJhbXMtPnR4cV9wYXJhbXMuZmxhZ3MgJiBRVUVVRV9GTEdfU1RBVFMpCi0JCXN0b3JtX21lbXNldF94c3RhdHNfemVybyhicCwgQlBfUE9SVChicCksCi0JCQkJCSBwYXJhbXMtPnR4cV9wYXJhbXMuc3RhdF9pZCk7Ci0KLQlpZiAocGFyYW1zLT5yeHFfcGFyYW1zLmZsYWdzICYgUVVFVUVfRkxHX1NUQVRTKSB7Ci0JCXN0b3JtX21lbXNldF91c3RhdHNfemVybyhicCwgQlBfUE9SVChicCksCi0JCQkJCSBwYXJhbXMtPnJ4cV9wYXJhbXMuc3RhdF9pZCk7Ci0JCXN0b3JtX21lbXNldF90c3RhdHNfemVybyhicCwgQlBfUE9SVChicCksCi0JCQkJCSBwYXJhbXMtPnJ4cV9wYXJhbXMuc3RhdF9pZCk7Ci0JfQotCi0JLyogRmlsbCB0aGUgcmFtcm9kIGRhdGEgKi8KLQlibngyeF9maWxsX2NsX2luaXRfZGF0YShicCwgcGFyYW1zLCBhY3RpdmF0ZSwgZGF0YSk7Ci0KLQkvKiBTRVRVUCByYW1yb2QuCi0JICoKLQkgKiBibngyeF9zcF9wb3N0KCkgdGFrZXMgYSBzcGluX2xvY2sgdGh1cyBubyBvdGhlciBleHBsaWN0IG1lbW9yeQotCSAqIGJhcnJpZXIgZXhjZXB0IGZyb20gbW1pb3diKCkgaXMgbmVlZGVkIHRvIGltcG9zZSBhCi0JICogcHJvcGVyIG9yZGVyaW5nIG9mIG1lbW9yeSBvcGVyYXRpb25zLgotCSAqLwotCW1taW93YigpOwotCi0KLQlibngyeF9zcF9wb3N0KGJwLCByYW1yb2QsIHBhcmFtcy0+cmFtcm9kX3BhcmFtcy5jaWQsCi0JCSAgICAgIFU2NF9ISShkYXRhX21hcHBpbmcpLCBVNjRfTE8oZGF0YV9tYXBwaW5nKSwgMCk7Ci0KLQkvKiBXYWl0IGZvciBjb21wbGV0aW9uICovCi0JcmMgPSBibngyeF93YWl0X3JhbXJvZChicCwgcGFyYW1zLT5yYW1yb2RfcGFyYW1zLnN0YXRlLAotCQkJCSBwYXJhbXMtPnJhbXJvZF9wYXJhbXMuaW5kZXgsCi0JCQkJIHBhcmFtcy0+cmFtcm9kX3BhcmFtcy5wc3RhdGUsCi0JCQkJIHJhbXJvZF9mbGFncyk7CisJcmMgPSBibngyeF9jb25maWdfdmxhbl9tYWMoYnAsICZyYW1yb2RfcGFyYW0pOworCWlmIChyYyA8IDApCisJCUJOWDJYX0VSUigiJXMgTUFDIGZhaWxlZFxuIiwgKHNldCA/ICJTZXQiIDogIkRlbCIpKTsKIAlyZXR1cm4gcmM7CiB9CiAKK2ludCBibngyeF9kZWxfYWxsX21hY3Moc3RydWN0IGJueDJ4ICpicCwKKwkJICAgICAgIHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm1hY19vYmosCisJCSAgICAgICBpbnQgbWFjX3R5cGUsIGJvb2wgd2FpdF9mb3JfY29tcCkKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyByYW1yb2RfZmxhZ3MgPSAwLCB2bGFuX21hY19mbGFncyA9IDA7CisKKwkvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIHJlcXVlc3RlZCAqLworCWlmICh3YWl0X2Zvcl9jb21wKQorCQlfX3NldF9iaXQoUkFNUk9EX0NPTVBfV0FJVCwgJnJhbXJvZF9mbGFncyk7CisKKwkvKiBTZXQgdGhlIG1hYyB0eXBlIG9mIGFkZHJlc3NlcyB3ZSB3YW50IHRvIGNsZWFyICovCisJX19zZXRfYml0KG1hY190eXBlLCAmdmxhbl9tYWNfZmxhZ3MpOworCisJcmMgPSBtYWNfb2JqLT5kZWxldGVfYWxsKGJwLCBtYWNfb2JqLCAmdmxhbl9tYWNfZmxhZ3MsICZyYW1yb2RfZmxhZ3MpOworCWlmIChyYyA8IDApCisJCUJOWDJYX0VSUigiRmFpbGVkIHRvIGRlbGV0ZSBNQUNzOiAlZFxuIiwgcmMpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgYm54Mnhfc2V0X2V0aF9tYWMoc3RydWN0IGJueDJ4ICpicCwgYm9vbCBzZXQpCit7CisJdW5zaWduZWQgbG9uZyByYW1yb2RfZmxhZ3MgPSAwOworCisJRFAoTkVUSUZfTVNHX0lGVVAsICJBZGRpbmcgRXRoIE1BQ1xuIik7CisKKwlfX3NldF9iaXQoUkFNUk9EX0NPTVBfV0FJVCwgJnJhbXJvZF9mbGFncyk7CisJLyogRXRoIE1BQyBpcyBzZXQgb24gUlNTIGxlYWRpbmcgY2xpZW50IChmcFswXSkgKi8KKwlyZXR1cm4gYm54Mnhfc2V0X21hY19vbmUoYnAsIGJwLT5kZXYtPmRldl9hZGRyLCAmYnAtPmZwLT5tYWNfb2JqLCBzZXQsCisJCQkJIEJOWDJYX0VUSF9NQUMsICZyYW1yb2RfZmxhZ3MpOworfQorCitpbnQgYm54Mnhfc2V0dXBfbGVhZGluZyhzdHJ1Y3QgYm54MnggKmJwKQoreworCXJldHVybiBibngyeF9zZXR1cF9xdWV1ZShicCwgJmJwLT5mcFswXSwgMSk7Cit9CisKIC8qKgogICogYm54Mnhfc2V0X2ludF9tb2RlIC0gY29uZmlndXJlIGludGVycnVwdCBtb2RlCiAgKgpAQCAtNjY0NywxNiArNjk4NCwxNCBAQAogICoKICAqIEluIGNhc2Ugb2YgTVNJLVggaXQgd2lsbCBhbHNvIHRyeSB0byBlbmFibGUgTVNJLVguCiAgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IGJueDJ4X3NldF9pbnRfbW9kZShzdHJ1Y3QgYm54MnggKmJwKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGJueDJ4X3NldF9pbnRfbW9kZShzdHJ1Y3QgYm54MnggKmJwKQogewotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGJwLT5pbnRfbW9kZSkgeworCXN3aXRjaCAoaW50X21vZGUpIHsKIAljYXNlIElOVF9NT0RFX01TSToKIAkJYm54MnhfZW5hYmxlX21zaShicCk7CiAJCS8qIGZhbGxpbmcgdGhyb3VnaC4uLiAqLwogCWNhc2UgSU5UX01PREVfSU5UeDoKLQkJYnAtPm51bV9xdWV1ZXMgPSAxICsgTk9ORV9FVEhfQ09OVEVYVF9VU0U7CisJCWJwLT5udW1fcXVldWVzID0gMSArIE5PTl9FVEhfQ09OVEVYVF9VU0U7CiAJCURQKE5FVElGX01TR19JRlVQLCAic2V0IG51bWJlciBvZiBxdWV1ZXMgdG8gMVxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC02NjcwLDggKzcwMDUsNyBAQAogCQkgKiBzbyB0cnkgdG8gZW5hYmxlIE1TSS1YIHdpdGggdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgZnAncwogCQkgKiBhbmQgZmFsbGJhY2sgdG8gTVNJIG9yIGxlZ2FjeSBJTlR4IHdpdGggb25lIGZwCiAJCSAqLwotCQlyYyA9IGJueDJ4X2VuYWJsZV9tc2l4KGJwKTsKLQkJaWYgKHJjKSB7CisJCWlmIChibngyeF9lbmFibGVfbXNpeChicCkpIHsKIAkJCS8qIGZhaWxlZCB0byBlbmFibGUgTVNJLVggKi8KIAkJCWlmIChicC0+bXVsdGlfbW9kZSkKIAkJCQlEUChORVRJRl9NU0dfSUZVUCwKQEAgLTY2NzksMTcgKzcwMTMsMTUgQEAKIAkJCQkJICAiZW5hYmxlIE1TSS1YICglZCksICIKIAkJCQkJICAic2V0IG51bWJlciBvZiBxdWV1ZXMgdG8gJWRcbiIsCiAJCQkJICAgYnAtPm51bV9xdWV1ZXMsCi0JCQkJICAgMSArIE5PTkVfRVRIX0NPTlRFWFRfVVNFKTsKLQkJCWJwLT5udW1fcXVldWVzID0gMSArIE5PTkVfRVRIX0NPTlRFWFRfVVNFOworCQkJCSAgIDEgKyBOT05fRVRIX0NPTlRFWFRfVVNFKTsKKwkJCWJwLT5udW1fcXVldWVzID0gMSArIE5PTl9FVEhfQ09OVEVYVF9VU0U7CiAKKwkJCS8qIFRyeSB0byBlbmFibGUgTVNJICovCiAJCQlpZiAoIShicC0+ZmxhZ3MgJiBESVNBQkxFX01TSV9GTEFHKSkKIAkJCQlibngyeF9lbmFibGVfbXNpKGJwKTsKIAkJfQotCiAJCWJyZWFrOwogCX0KLQotCXJldHVybiByYzsKIH0KIAogLyogbXVzdCBiZSBjYWxsZWQgcHJpb2lyIHRvIGFueSBIVyBpbml0aWFsaXphdGlvbnMgKi8KQEAgLTY3MTMsNyArNzA0NSw3IEBACiAJaWx0X2NsaWVudC0+cGFnZV9zaXplID0gQ0RVX0lMVF9QQUdFX1NaOwogCWlsdF9jbGllbnQtPmZsYWdzID0gSUxUX0NMSUVOVF9TS0lQX01FTTsKIAlpbHRfY2xpZW50LT5zdGFydCA9IGxpbmU7Ci0JbGluZSArPSBMMl9JTFRfTElORVMoYnApOworCWxpbmUgKz0gYm54MnhfY2lkX2lsdF9saW5lcyhicCk7CiAjaWZkZWYgQkNNX0NOSUMKIAlsaW5lICs9IENOSUNfSUxUX0xJTkVTOwogI2VuZGlmCkBAIC02NzkzLDkyICs3MTI1LDI1OCBAQAogI2Vsc2UKIAlpbHRfY2xpZW50LT5mbGFncyA9IChJTFRfQ0xJRU5UX1NLSVBfSU5JVCB8IElMVF9DTElFTlRfU0tJUF9NRU0pOwogI2VuZGlmCisJQlVHX09OKGxpbmUgPiBJTFRfTUFYX0xJTkVTKTsKIH0KIAotaW50IGJueDJ4X3NldHVwX2NsaWVudChzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLAotCQkgICAgICAgaW50IGlzX2xlYWRpbmcpCisvKioKKyAqIGJueDJ4X3BmX3FfcHJlcF9pbml0IC0gcHJlcGFyZSBJTklUIHRyYW5zaXRpb24gcGFyYW1ldGVycworICoKKyAqIEBicDoJCQlkcml2ZXIgaGFuZGxlCisgKiBAZnA6CQkJcG9pbnRlciB0byBmYXN0cGF0aAorICogQGluaXRfcGFyYW1zOglwb2ludGVyIHRvIHBhcmFtZXRlcnMgc3RydWN0dXJlCisgKgorICogcGFyYW1ldGVycyBjb25maWd1cmVkOgorICogICAgICAtIEhDIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgLSBRdWV1ZSdzIENEVSBjb250ZXh0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9wZl9xX3ByZXBfaW5pdChzdHJ1Y3QgYm54MnggKmJwLAorCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsIHN0cnVjdCBibngyeF9xdWV1ZV9pbml0X3BhcmFtcyAqaW5pdF9wYXJhbXMpCiB7Ci0Jc3RydWN0IGJueDJ4X2NsaWVudF9pbml0X3BhcmFtcyBwYXJhbXMgPSB7IHswfSB9OworCisJdTggY29zOworCS8qIEZDb0UgUXVldWUgdXNlcyBEZWZhdWx0IFNCLCB0aHVzIGhhcyBubyBIQyBjYXBhYmlsaXRpZXMgKi8KKwlpZiAoIUlTX0ZDT0VfRlAoZnApKSB7CisJCV9fc2V0X2JpdChCTlgyWF9RX0ZMR19IQywgJmluaXRfcGFyYW1zLT5yeC5mbGFncyk7CisJCV9fc2V0X2JpdChCTlgyWF9RX0ZMR19IQywgJmluaXRfcGFyYW1zLT50eC5mbGFncyk7CisKKwkJLyogSWYgSEMgaXMgc3VwcG9ydGVyZCwgZW5hYmxlIGhvc3QgY29hbGVzY2luZyBpbiB0aGUgdHJhbnNpdGlvbgorCQkgKiB0byBJTklUIHN0YXRlLgorCQkgKi8KKwkJX19zZXRfYml0KEJOWDJYX1FfRkxHX0hDX0VOLCAmaW5pdF9wYXJhbXMtPnJ4LmZsYWdzKTsKKwkJX19zZXRfYml0KEJOWDJYX1FfRkxHX0hDX0VOLCAmaW5pdF9wYXJhbXMtPnR4LmZsYWdzKTsKKworCQkvKiBIQyByYXRlICovCisJCWluaXRfcGFyYW1zLT5yeC5oY19yYXRlID0gYnAtPnJ4X3RpY2tzID8KKwkJCSgxMDAwMDAwIC8gYnAtPnJ4X3RpY2tzKSA6IDA7CisJCWluaXRfcGFyYW1zLT50eC5oY19yYXRlID0gYnAtPnR4X3RpY2tzID8KKwkJCSgxMDAwMDAwIC8gYnAtPnR4X3RpY2tzKSA6IDA7CisKKwkJLyogRlcgU0IgSUQgKi8KKwkJaW5pdF9wYXJhbXMtPnJ4LmZ3X3NiX2lkID0gaW5pdF9wYXJhbXMtPnR4LmZ3X3NiX2lkID0KKwkJCWZwLT5md19zYl9pZDsKKworCQkvKgorCQkgKiBDUSBpbmRleCBhbW9uZyB0aGUgU0IgaW5kaWNlczogRkNvRSBjbGllbnRzIHVzZXMgdGhlIGRlZmF1bHQKKwkJICogU0IsIHRoZXJlZm9yZSBpdCdzIGRpZmZlcmVudC4KKwkJICovCisJCWluaXRfcGFyYW1zLT5yeC5zYl9jcV9pbmRleCA9IEhDX0lOREVYX0VUSF9SWF9DUV9DT05TOworCQlpbml0X3BhcmFtcy0+dHguc2JfY3FfaW5kZXggPSBIQ19JTkRFWF9FVEhfRklSU1RfVFhfQ1FfQ09OUzsKKwl9CisKKwkvKiBzZXQgbWF4aW11bSBudW1iZXIgb2YgQ09TcyBzdXBwb3J0ZWQgYnkgdGhpcyBxdWV1ZSAqLworCWluaXRfcGFyYW1zLT5tYXhfY29zID0gZnAtPm1heF9jb3M7CisKKwlEUChCTlgyWF9NU0dfU1AsICJmcDogJWQgc2V0dGluZyBxdWV1ZSBwYXJhbXMgbWF4IGNvcyB0bzogJWQiLAorCSAgICBmcC0+aW5kZXgsIGluaXRfcGFyYW1zLT5tYXhfY29zKTsKKworCS8qIHNldCB0aGUgY29udGV4dCBwb2ludGVycyBxdWV1ZSBvYmplY3QgKi8KKwlmb3IgKGNvcyA9IEZJUlNUX1RYX0NPU19JTkRFWDsgY29zIDwgaW5pdF9wYXJhbXMtPm1heF9jb3M7IGNvcysrKQorCQlpbml0X3BhcmFtcy0+Y3h0c1tjb3NdID0KKwkJCSZicC0+Y29udGV4dC52Y3h0W2ZwLT50eGRhdGFbY29zXS5jaWRdLmV0aDsKK30KKworaW50IGJueDJ4X3NldHVwX3R4X29ubHkoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKKwkJCXN0cnVjdCBibngyeF9xdWV1ZV9zdGF0ZV9wYXJhbXMgKnFfcGFyYW1zLAorCQkJc3RydWN0IGJueDJ4X3F1ZXVlX3NldHVwX3R4X29ubHlfcGFyYW1zICp0eF9vbmx5X3BhcmFtcywKKwkJCWludCB0eF9pbmRleCwgYm9vbCBsZWFkaW5nKQoreworCW1lbXNldCh0eF9vbmx5X3BhcmFtcywgMCwgc2l6ZW9mKCp0eF9vbmx5X3BhcmFtcykpOworCisJLyogU2V0IHRoZSBjb21tYW5kICovCisJcV9wYXJhbXMtPmNtZCA9IEJOWDJYX1FfQ01EX1NFVFVQX1RYX09OTFk7CisKKwkvKiBTZXQgdHgtb25seSBRVUVVRSBmbGFnczogZG9uJ3QgemVybyBzdGF0aXN0aWNzICovCisJdHhfb25seV9wYXJhbXMtPmZsYWdzID0gYm54MnhfZ2V0X2NvbW1vbl9mbGFncyhicCwgZnAsIGZhbHNlKTsKKworCS8qIGNob29zZSB0aGUgaW5kZXggb2YgdGhlIGNpZCB0byBzZW5kIHRoZSBzbG93IHBhdGggb24gKi8KKwl0eF9vbmx5X3BhcmFtcy0+Y2lkX2luZGV4ID0gdHhfaW5kZXg7CisKKwkvKiBTZXQgZ2VuZXJhbCBUWF9PTkxZX1NFVFVQIHBhcmFtZXRlcnMgKi8KKwlibngyeF9wZl9xX3ByZXBfZ2VuZXJhbChicCwgZnAsICZ0eF9vbmx5X3BhcmFtcy0+Z2VuX3BhcmFtcywgdHhfaW5kZXgpOworCisJLyogU2V0IFR4IFRYX09OTFlfU0VUVVAgcGFyYW1ldGVycyAqLworCWJueDJ4X3BmX3R4X3FfcHJlcChicCwgZnAsICZ0eF9vbmx5X3BhcmFtcy0+dHhxX3BhcmFtcywgdHhfaW5kZXgpOworCisJRFAoQk5YMlhfTVNHX1NQLCAicHJlcGFyaW5nIHRvIHNlbmQgdHgtb25seSByYW1yb2QgZm9yIGNvbm5lY3Rpb246IgorCQkJICJjb3MgJWQsIHByaW1hcnkgY2lkICVkLCBjaWQgJWQsICIKKwkJCSAiY2xpZW50IGlkICVkLCBzcC1jbGllbnQgaWQgJWQsIGZsYWdzICVseCIsCisJICAgdHhfaW5kZXgsIHFfcGFyYW1zLT5xX29iai0+Y2lkc1tGSVJTVF9UWF9DT1NfSU5ERVhdLAorCSAgIHFfcGFyYW1zLT5xX29iai0+Y2lkc1t0eF9pbmRleF0sIHFfcGFyYW1zLT5xX29iai0+Y2xfaWQsCisJICAgdHhfb25seV9wYXJhbXMtPmdlbl9wYXJhbXMuc3BjbF9pZCwgdHhfb25seV9wYXJhbXMtPmZsYWdzKTsKKworCS8qIHNlbmQgdGhlIHJhbXJvZCAqLworCXJldHVybiBibngyeF9xdWV1ZV9zdGF0ZV9jaGFuZ2UoYnAsIHFfcGFyYW1zKTsKK30KKworCisvKioKKyAqIGJueDJ4X3NldHVwX3F1ZXVlIC0gc2V0dXAgcXVldWUKKyAqCisgKiBAYnA6CQlkcml2ZXIgaGFuZGxlCisgKiBAZnA6CQlwb2ludGVyIHRvIGZhc3RwYXRoCisgKiBAbGVhZGluZzoJaXMgbGVhZGluZworICoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgMiBzdGVwcyBpbiBhIFF1ZXVlIHN0YXRlIG1hY2hpbmUKKyAqICAgICAgYWN0dWFsbHk6IDEpIFJFU0VULT5JTklUIDIpIElOSVQtPlNFVFVQCisgKi8KKworaW50IGJueDJ4X3NldHVwX3F1ZXVlKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCisJCSAgICAgICBib29sIGxlYWRpbmcpCit7CisJc3RydWN0IGJueDJ4X3F1ZXVlX3N0YXRlX3BhcmFtcyBxX3BhcmFtcyA9IHswfTsKKwlzdHJ1Y3QgYm54MnhfcXVldWVfc2V0dXBfcGFyYW1zICpzZXR1cF9wYXJhbXMgPQorCQkJCQkJJnFfcGFyYW1zLnBhcmFtcy5zZXR1cDsKKwlzdHJ1Y3QgYm54MnhfcXVldWVfc2V0dXBfdHhfb25seV9wYXJhbXMgKnR4X29ubHlfcGFyYW1zID0KKwkJCQkJCSZxX3BhcmFtcy5wYXJhbXMudHhfb25seTsKIAlpbnQgcmM7CisJdTggdHhfaW5kZXg7CisKKwlEUChCTlgyWF9NU0dfU1AsICJzZXR0aW5nIHVwIHF1ZXVlICVkIiwgZnAtPmluZGV4KTsKIAogCS8qIHJlc2V0IElHVSBzdGF0ZSBza2lwIEZDb0UgTDIgcXVldWUgKi8KIAlpZiAoIUlTX0ZDT0VfRlAoZnApKQogCQlibngyeF9hY2tfc2IoYnAsIGZwLT5pZ3Vfc2JfaWQsIFVTVE9STV9JRCwgMCwKIAkJCSAgICAgSUdVX0lOVF9FTkFCTEUsIDApOwogCi0JcGFyYW1zLnJhbXJvZF9wYXJhbXMucHN0YXRlID0gJmZwLT5zdGF0ZTsKLQlwYXJhbXMucmFtcm9kX3BhcmFtcy5zdGF0ZSA9IEJOWDJYX0ZQX1NUQVRFX09QRU47Ci0JcGFyYW1zLnJhbXJvZF9wYXJhbXMuaW5kZXggPSBmcC0+aW5kZXg7Ci0JcGFyYW1zLnJhbXJvZF9wYXJhbXMuY2lkID0gZnAtPmNpZDsKKwlxX3BhcmFtcy5xX29iaiA9ICZmcC0+cV9vYmo7CisJLyogV2Ugd2FudCB0byB3YWl0IGZvciBjb21wbGV0aW9uIGluIHRoaXMgY29udGV4dCAqLworCV9fc2V0X2JpdChSQU1ST0RfQ09NUF9XQUlULCAmcV9wYXJhbXMucmFtcm9kX2ZsYWdzKTsKIAotI2lmZGVmIEJDTV9DTklDCi0JaWYgKElTX0ZDT0VfRlAoZnApKQotCQlwYXJhbXMucmFtcm9kX3BhcmFtcy5mbGFncyB8PSBDTElFTlRfSVNfRkNPRTsKKwkvKiBQcmVwYXJlIHRoZSBJTklUIHBhcmFtZXRlcnMgKi8KKwlibngyeF9wZl9xX3ByZXBfaW5pdChicCwgZnAsICZxX3BhcmFtcy5wYXJhbXMuaW5pdCk7CiAKLSNlbmRpZgorCS8qIFNldCB0aGUgY29tbWFuZCAqLworCXFfcGFyYW1zLmNtZCA9IEJOWDJYX1FfQ01EX0lOSVQ7CiAKLQlpZiAoaXNfbGVhZGluZykKLQkJcGFyYW1zLnJhbXJvZF9wYXJhbXMuZmxhZ3MgfD0gQ0xJRU5UX0lTX0xFQURJTkdfUlNTOworCS8qIENoYW5nZSB0aGUgc3RhdGUgdG8gSU5JVCAqLworCXJjID0gYm54MnhfcXVldWVfc3RhdGVfY2hhbmdlKGJwLCAmcV9wYXJhbXMpOworCWlmIChyYykgeworCQlCTlgyWF9FUlIoIlF1ZXVlKCVkKSBJTklUIGZhaWxlZFxuIiwgZnAtPmluZGV4KTsKKwkJcmV0dXJuIHJjOworCX0KIAotCWJueDJ4X3BmX3J4X2NsX3ByZXAoYnAsIGZwLCAmcGFyYW1zLnBhdXNlLCAmcGFyYW1zLnJ4cV9wYXJhbXMpOworCURQKEJOWDJYX01TR19TUCwgImluaXQgY29tcGxldGUiKTsKIAotCWJueDJ4X3BmX3R4X2NsX3ByZXAoYnAsIGZwLCAmcGFyYW1zLnR4cV9wYXJhbXMpOwogCi0JcmMgPSBibngyeF9zZXR1cF9md19jbGllbnQoYnAsICZwYXJhbXMsIDEsCi0JCQkJICAgICBibngyeF9zcChicCwgY2xpZW50X2luaXRfZGF0YSksCi0JCQkJICAgICBibngyeF9zcF9tYXBwaW5nKGJwLCBjbGllbnRfaW5pdF9kYXRhKSk7CisJLyogTm93IG1vdmUgdGhlIFF1ZXVlIHRvIHRoZSBTRVRVUCBzdGF0ZS4uLiAqLworCW1lbXNldChzZXR1cF9wYXJhbXMsIDAsIHNpemVvZigqc2V0dXBfcGFyYW1zKSk7CisKKwkvKiBTZXQgUVVFVUUgZmxhZ3MgKi8KKwlzZXR1cF9wYXJhbXMtPmZsYWdzID0gYm54MnhfZ2V0X3FfZmxhZ3MoYnAsIGZwLCBsZWFkaW5nKTsKKworCS8qIFNldCBnZW5lcmFsIFNFVFVQIHBhcmFtZXRlcnMgKi8KKwlibngyeF9wZl9xX3ByZXBfZ2VuZXJhbChicCwgZnAsICZzZXR1cF9wYXJhbXMtPmdlbl9wYXJhbXMsCisJCQkJRklSU1RfVFhfQ09TX0lOREVYKTsKKworCWJueDJ4X3BmX3J4X3FfcHJlcChicCwgZnAsICZzZXR1cF9wYXJhbXMtPnBhdXNlX3BhcmFtcywKKwkJCSAgICAmc2V0dXBfcGFyYW1zLT5yeHFfcGFyYW1zKTsKKworCWJueDJ4X3BmX3R4X3FfcHJlcChicCwgZnAsICZzZXR1cF9wYXJhbXMtPnR4cV9wYXJhbXMsCisJCQkgICBGSVJTVF9UWF9DT1NfSU5ERVgpOworCisJLyogU2V0IHRoZSBjb21tYW5kICovCisJcV9wYXJhbXMuY21kID0gQk5YMlhfUV9DTURfU0VUVVA7CisKKwkvKiBDaGFuZ2UgdGhlIHN0YXRlIHRvIFNFVFVQICovCisJcmMgPSBibngyeF9xdWV1ZV9zdGF0ZV9jaGFuZ2UoYnAsICZxX3BhcmFtcyk7CisJaWYgKHJjKSB7CisJCUJOWDJYX0VSUigiUXVldWUoJWQpIFNFVFVQIGZhaWxlZFxuIiwgZnAtPmluZGV4KTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIGxvb3AgdGhyb3VnaCB0aGUgcmVsZXZhbnQgdHgtb25seSBpbmRpY2VzICovCisJZm9yICh0eF9pbmRleCA9IEZJUlNUX1RYX09OTFlfQ09TX0lOREVYOworCSAgICAgIHR4X2luZGV4IDwgZnAtPm1heF9jb3M7CisJICAgICAgdHhfaW5kZXgrKykgeworCisJCS8qIHByZXBhcmUgYW5kIHNlbmQgdHgtb25seSByYW1yb2QqLworCQlyYyA9IGJueDJ4X3NldHVwX3R4X29ubHkoYnAsIGZwLCAmcV9wYXJhbXMsCisJCQkJCSAgdHhfb25seV9wYXJhbXMsIHR4X2luZGV4LCBsZWFkaW5nKTsKKwkJaWYgKHJjKSB7CisJCQlCTlgyWF9FUlIoIlF1ZXVlKCVkLiVkKSBUWF9PTkxZX1NFVFVQIGZhaWxlZFxuIiwKKwkJCQkgIGZwLT5pbmRleCwgdHhfaW5kZXgpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGJueDJ4X3N0b3BfZndfY2xpZW50KHN0cnVjdCBibngyeCAqYnAsCi0JCQkJc3RydWN0IGJueDJ4X2NsaWVudF9yYW1yb2RfcGFyYW1zICpwKQorc3RhdGljIGludCBibngyeF9zdG9wX3F1ZXVlKHN0cnVjdCBibngyeCAqYnAsIGludCBpbmRleCkKIHsKLQlpbnQgcmM7Ci0KLQlpbnQgcG9sbF9mbGFnID0gcC0+cG9sbCA/IFdBSVRfUkFNUk9EX1BPTEwgOiAwOwotCi0JLyogaGFsdCB0aGUgY29ubmVjdGlvbiAqLwotCSpwLT5wc3RhdGUgPSBCTlgyWF9GUF9TVEFURV9IQUxUSU5HOwotCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX0hBTFQsIHAtPmNpZCwgMCwKLQkJCQkJCSAgcC0+Y2xfaWQsIDApOwotCi0JLyogV2FpdCBmb3IgY29tcGxldGlvbiAqLwotCXJjID0gYm54Mnhfd2FpdF9yYW1yb2QoYnAsIEJOWDJYX0ZQX1NUQVRFX0hBTFRFRCwgcC0+aW5kZXgsCi0JCQkgICAgICAgcC0+cHN0YXRlLCBwb2xsX2ZsYWcpOwotCWlmIChyYykgLyogdGltZW91dCAqLwotCQlyZXR1cm4gcmM7Ci0KLQkqcC0+cHN0YXRlID0gQk5YMlhfRlBfU1RBVEVfVEVSTUlOQVRJTkc7Ci0JYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfVEVSTUlOQVRFLCBwLT5jaWQsIDAsCi0JCQkJCQkgICAgICAgcC0+Y2xfaWQsIDApOwotCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQlyYyA9IGJueDJ4X3dhaXRfcmFtcm9kKGJwLCBCTlgyWF9GUF9TVEFURV9URVJNSU5BVEVELCBwLT5pbmRleCwKLQkJCSAgICAgICBwLT5wc3RhdGUsIHBvbGxfZmxhZyk7Ci0JaWYgKHJjKSAvKiB0aW1lb3V0ICovCi0JCXJldHVybiByYzsKLQotCi0JLyogZGVsZXRlIGNmYyBlbnRyeSAqLwotCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfQ09NTU9OX0NGQ19ERUwsIHAtPmNpZCwgMCwgMCwgMSk7Ci0KLQkvKiBXYWl0IGZvciBjb21wbGV0aW9uICovCi0JcmMgPSBibngyeF93YWl0X3JhbXJvZChicCwgQk5YMlhfRlBfU1RBVEVfQ0xPU0VELCBwLT5pbmRleCwKLQkJCSAgICAgICBwLT5wc3RhdGUsIFdBSVRfUkFNUk9EX0NPTU1PTik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGJueDJ4X3N0b3BfY2xpZW50KHN0cnVjdCBibngyeCAqYnAsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgYm54MnhfY2xpZW50X3JhbXJvZF9wYXJhbXMgY2xpZW50X3N0b3AgPSB7MH07CiAJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaW5kZXhdOworCXN0cnVjdCBibngyeF9mcF90eGRhdGEgKnR4ZGF0YTsKKwlzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zIHFfcGFyYW1zID0gezB9OworCWludCByYywgdHhfaW5kZXg7CiAKLQljbGllbnRfc3RvcC5pbmRleCA9IGluZGV4OwotCWNsaWVudF9zdG9wLmNpZCA9IGZwLT5jaWQ7Ci0JY2xpZW50X3N0b3AuY2xfaWQgPSBmcC0+Y2xfaWQ7Ci0JY2xpZW50X3N0b3AucHN0YXRlID0gJihmcC0+c3RhdGUpOwotCWNsaWVudF9zdG9wLnBvbGwgPSAwOworCURQKEJOWDJYX01TR19TUCwgInN0b3BwaW5nIHF1ZXVlICVkIGNpZCAlZCIsIGluZGV4LCBmcC0+Y2lkKTsKIAotCXJldHVybiBibngyeF9zdG9wX2Z3X2NsaWVudChicCwgJmNsaWVudF9zdG9wKTsKKwlxX3BhcmFtcy5xX29iaiA9ICZmcC0+cV9vYmo7CisJLyogV2Ugd2FudCB0byB3YWl0IGZvciBjb21wbGV0aW9uIGluIHRoaXMgY29udGV4dCAqLworCV9fc2V0X2JpdChSQU1ST0RfQ09NUF9XQUlULCAmcV9wYXJhbXMucmFtcm9kX2ZsYWdzKTsKKworCisJLyogY2xvc2UgdHgtb25seSBjb25uZWN0aW9ucyAqLworCWZvciAodHhfaW5kZXggPSBGSVJTVF9UWF9PTkxZX0NPU19JTkRFWDsKKwkgICAgIHR4X2luZGV4IDwgZnAtPm1heF9jb3M7CisJICAgICB0eF9pbmRleCsrKXsKKworCQkvKiBhc2NlcnRhaW4gdGhpcyBpcyBhIG5vcm1hbCBxdWV1ZSovCisJCXR4ZGF0YSA9ICZmcC0+dHhkYXRhW3R4X2luZGV4XTsKKworCQlEUChCTlgyWF9NU0dfU1AsICJzdG9wcGluZyB0eC1vbmx5IHF1ZXVlICVkIiwKKwkJCQkJCQl0eGRhdGEtPnR4cV9pbmRleCk7CisKKwkJLyogc2VuZCBoYWx0IHRlcm1pbmF0ZSBvbiB0eC1vbmx5IGNvbm5lY3Rpb24gKi8KKwkJcV9wYXJhbXMuY21kID0gQk5YMlhfUV9DTURfVEVSTUlOQVRFOworCQltZW1zZXQoJnFfcGFyYW1zLnBhcmFtcy50ZXJtaW5hdGUsIDAsCisJCSAgICAgICBzaXplb2YocV9wYXJhbXMucGFyYW1zLnRlcm1pbmF0ZSkpOworCQlxX3BhcmFtcy5wYXJhbXMudGVybWluYXRlLmNpZF9pbmRleCA9IHR4X2luZGV4OworCisJCXJjID0gYm54MnhfcXVldWVfc3RhdGVfY2hhbmdlKGJwLCAmcV9wYXJhbXMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyogc2VuZCBoYWx0IHRlcm1pbmF0ZSBvbiB0eC1vbmx5IGNvbm5lY3Rpb24gKi8KKwkJcV9wYXJhbXMuY21kID0gQk5YMlhfUV9DTURfQ0ZDX0RFTDsKKwkJbWVtc2V0KCZxX3BhcmFtcy5wYXJhbXMuY2ZjX2RlbCwgMCwKKwkJICAgICAgIHNpemVvZihxX3BhcmFtcy5wYXJhbXMuY2ZjX2RlbCkpOworCQlxX3BhcmFtcy5wYXJhbXMuY2ZjX2RlbC5jaWRfaW5kZXggPSB0eF9pbmRleDsKKwkJcmMgPSBibngyeF9xdWV1ZV9zdGF0ZV9jaGFuZ2UoYnAsICZxX3BhcmFtcyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisJLyogU3RvcCB0aGUgcHJpbWFyeSBjb25uZWN0aW9uOiAqLworCS8qIC4uLmhhbHQgdGhlIGNvbm5lY3Rpb24gKi8KKwlxX3BhcmFtcy5jbWQgPSBCTlgyWF9RX0NNRF9IQUxUOworCXJjID0gYm54MnhfcXVldWVfc3RhdGVfY2hhbmdlKGJwLCAmcV9wYXJhbXMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogLi4udGVybWluYXRlIHRoZSBjb25uZWN0aW9uICovCisJcV9wYXJhbXMuY21kID0gQk5YMlhfUV9DTURfVEVSTUlOQVRFOworCW1lbXNldCgmcV9wYXJhbXMucGFyYW1zLnRlcm1pbmF0ZSwgMCwKKwkgICAgICAgc2l6ZW9mKHFfcGFyYW1zLnBhcmFtcy50ZXJtaW5hdGUpKTsKKwlxX3BhcmFtcy5wYXJhbXMudGVybWluYXRlLmNpZF9pbmRleCA9IEZJUlNUX1RYX0NPU19JTkRFWDsKKwlyYyA9IGJueDJ4X3F1ZXVlX3N0YXRlX2NoYW5nZShicCwgJnFfcGFyYW1zKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwkvKiAuLi5kZWxldGUgY2ZjIGVudHJ5ICovCisJcV9wYXJhbXMuY21kID0gQk5YMlhfUV9DTURfQ0ZDX0RFTDsKKwltZW1zZXQoJnFfcGFyYW1zLnBhcmFtcy5jZmNfZGVsLCAwLAorCSAgICAgICBzaXplb2YocV9wYXJhbXMucGFyYW1zLmNmY19kZWwpKTsKKwlxX3BhcmFtcy5wYXJhbXMuY2ZjX2RlbC5jaWRfaW5kZXggPSBGSVJTVF9UWF9DT1NfSU5ERVg7CisJcmV0dXJuIGJueDJ4X3F1ZXVlX3N0YXRlX2NoYW5nZShicCwgJnFfcGFyYW1zKTsKIH0KIAogCkBAIC02ODg3LDEyICs3Mzg1LDYgQEAKIAlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwogCWludCBmdW5jID0gQlBfRlVOQyhicCk7CiAJaW50IGk7Ci0JaW50IHBmdW5jX29mZnNldF9mcCA9IG9mZnNldG9mKHN0cnVjdCBoY19zYl9kYXRhLCBwX2Z1bmMpICsKLQkJCShDSElQX0lTX0UyKGJwKSA/Ci0JCQkgb2Zmc2V0b2Yoc3RydWN0IGhjX3N0YXR1c19ibG9ja19kYXRhX2UyLCBjb21tb24pIDoKLQkJCSBvZmZzZXRvZihzdHJ1Y3QgaGNfc3RhdHVzX2Jsb2NrX2RhdGFfZTF4LCBjb21tb24pKTsKLQlpbnQgcGZ1bmNfb2Zmc2V0X3NwID0gb2Zmc2V0b2Yoc3RydWN0IGhjX3NwX3N0YXR1c19ibG9ja19kYXRhLCBwX2Z1bmMpOwotCWludCBwZmlkX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBwY2lfZW50aXR5LCBwZl9pZCk7CiAKIAkvKiBEaXNhYmxlIHRoZSBmdW5jdGlvbiBpbiB0aGUgRlcgKi8KIAlSRUdfV1I4KGJwLCBCQVJfWFNUUk9STV9JTlRNRU0gKyBYU1RPUk1fRlVOQ19FTl9PRkZTRVQoZnVuYyksIDApOwpAQCAtNjkwMywyMCArNzM5NSwyMSBAQAogCS8qIEZQIFNCcyAqLwogCWZvcl9lYWNoX2V0aF9xdWV1ZShicCwgaSkgewogCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKLQkJUkVHX1dSOChicCwKLQkJCUJBUl9DU1RST1JNX0lOVE1FTSArCi0JCQlDU1RPUk1fU1RBVFVTX0JMT0NLX0RBVEFfT0ZGU0VUKGZwLT5md19zYl9pZCkKLQkJCSsgcGZ1bmNfb2Zmc2V0X2ZwICsgcGZpZF9vZmZzZXQsCi0JCQlIQ19GVU5DVElPTl9ESVNBQkxFRCk7CisJCVJFR19XUjgoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSArCisJCQkgICBDU1RPUk1fU1RBVFVTX0JMT0NLX0RBVEFfU1RBVEVfT0ZGU0VUKGZwLT5md19zYl9pZCksCisJCQkgICBTQl9ESVNBQkxFRCk7CiAJfQogCisjaWZkZWYgQkNNX0NOSUMKKwkvKiBDTklDIFNCICovCisJUkVHX1dSOChicCwgQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkJQ1NUT1JNX1NUQVRVU19CTE9DS19EQVRBX1NUQVRFX09GRlNFVChibngyeF9jbmljX2Z3X3NiX2lkKGJwKSksCisJCVNCX0RJU0FCTEVEKTsKKyNlbmRpZgogCS8qIFNQIFNCICovCi0JUkVHX1dSOChicCwKLQkJQkFSX0NTVFJPUk1fSU5UTUVNICsKLQkJQ1NUT1JNX1NQX1NUQVRVU19CTE9DS19EQVRBX09GRlNFVChmdW5jKSArCi0JCXBmdW5jX29mZnNldF9zcCArIHBmaWRfb2Zmc2V0LAotCQlIQ19GVU5DVElPTl9ESVNBQkxFRCk7Ci0KKwlSRUdfV1I4KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0gKworCQkgICBDU1RPUk1fU1BfU1RBVFVTX0JMT0NLX0RBVEFfU1RBVEVfT0ZGU0VUKGZ1bmMpLAorCQkgICBTQl9ESVNBQkxFRCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgWFNUT1JNX1NQUV9EQVRBX1NJWkUgLyA0OyBpKyspCiAJCVJFR19XUihicCwgQkFSX1hTVFJPUk1fSU5UTUVNICsgWFNUT1JNX1NQUV9EQVRBX09GRlNFVChmdW5jKSwKQEAgLTY5NTAsNyArNzQ0Myw3IEBACiAJLyogVGltZXJzIHdvcmthcm91bmQgYnVnIGZvciBFMjogaWYgdGhpcyBpcyB2bmljLTMsCiAJICogd2UgbmVlZCB0byBzZXQgdGhlIGVudGlyZSBpbHQgcmFuZ2UgZm9yIHRoaXMgdGltZXJzLgogCSAqLwotCWlmIChDSElQX0lTX0UyKGJwKSAmJiBCUF9WTihicCkgPT0gMykgeworCWlmICghQ0hJUF9JU19FMXgoYnApICYmIEJQX1ZOKGJwKSA9PSAzKSB7CiAJCXN0cnVjdCBpbHRfY2xpZW50X2luZm8gaWx0X2NsaTsKIAkJLyogdXNlIGR1bW15IFRNIGNsaWVudCAqLwogCQltZW1zZXQoJmlsdF9jbGksIDAsIHNpemVvZihzdHJ1Y3QgaWx0X2NsaWVudF9pbmZvKSk7CkBAIC02OTYyLDcgKzc0NTUsNyBAQAogCX0KIAogCS8qIHRoaXMgYXNzdW1lcyB0aGF0IHJlc2V0X3BvcnQoKSBjYWxsZWQgYmVmb3JlIHJlc2V0X2Z1bmMoKSovCi0JaWYgKENISVBfSVNfRTIoYnApKQorCWlmICghQ0hJUF9JU19FMXgoYnApKQogCQlibngyeF9wZl9kaXNhYmxlKGJwKTsKIAogCWJwLT5kbWFlX3JlYWR5ID0gMDsKQEAgLTY5NzMsNiArNzQ2Niw5IEBACiAJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKIAl1MzIgdmFsOwogCisJLyogUmVzZXQgcGh5c2ljYWwgTGluayAqLworCWJueDJ4X19saW5rX3Jlc2V0KGJwKTsKKwogCVJFR19XUihicCwgTklHX1JFR19NQVNLX0lOVEVSUlVQVF9QT1JUMCArIHBvcnQqNCwgMCk7CiAKIAkvKiBEbyBub3QgcmN2IHBhY2tldHMgdG8gQlJCICovCkBAIC02OTk0LDkyICs3NDkwLDY2IEBACiAJLyogVE9ETzogQ2xvc2UgRG9vcmJlbGwgcG9ydD8gKi8KIH0KIAotc3RhdGljIHZvaWQgYm54MnhfcmVzZXRfY2hpcChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgcmVzZXRfY29kZSkKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3Jlc2V0X2h3KHN0cnVjdCBibngyeCAqYnAsIHUzMiBsb2FkX2NvZGUpCiB7Ci0JRFAoQk5YMlhfTVNHX01DUCwgImZ1bmN0aW9uICVkICByZXNldF9jb2RlICV4XG4iLAotCSAgIEJQX0FCU19GVU5DKGJwKSwgcmVzZXRfY29kZSk7CisJc3RydWN0IGJueDJ4X2Z1bmNfc3RhdGVfcGFyYW1zIGZ1bmNfcGFyYW1zID0gezB9OwogCi0Jc3dpdGNoIChyZXNldF9jb2RlKSB7Ci0JY2FzZSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0NPTU1PTjoKLQkJYm54MnhfcmVzZXRfcG9ydChicCk7Ci0JCWJueDJ4X3Jlc2V0X2Z1bmMoYnApOwotCQlibngyeF9yZXNldF9jb21tb24oYnApOwotCQlicmVhazsKKwkvKiBQcmVwYXJlIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIHN0YXRlIHRyYW5zaXRpb25zICovCisJX19zZXRfYml0KFJBTVJPRF9DT01QX1dBSVQsICZmdW5jX3BhcmFtcy5yYW1yb2RfZmxhZ3MpOwogCi0JY2FzZSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX1BPUlQ6Ci0JCWJueDJ4X3Jlc2V0X3BvcnQoYnApOwotCQlibngyeF9yZXNldF9mdW5jKGJwKTsKLQkJYnJlYWs7CisJZnVuY19wYXJhbXMuZl9vYmogPSAmYnAtPmZ1bmNfb2JqOworCWZ1bmNfcGFyYW1zLmNtZCA9IEJOWDJYX0ZfQ01EX0hXX1JFU0VUOwogCi0JY2FzZSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0ZVTkNUSU9OOgotCQlibngyeF9yZXNldF9mdW5jKGJwKTsKLQkJYnJlYWs7CisJZnVuY19wYXJhbXMucGFyYW1zLmh3X2luaXQubG9hZF9waGFzZSA9IGxvYWRfY29kZTsKIAotCWRlZmF1bHQ6Ci0JCUJOWDJYX0VSUigiVW5rbm93biByZXNldF9jb2RlICgweCV4KSBmcm9tIE1DUFxuIiwgcmVzZXRfY29kZSk7Ci0JCWJyZWFrOwotCX0KKwlyZXR1cm4gYm54MnhfZnVuY19zdGF0ZV9jaGFuZ2UoYnAsICZmdW5jX3BhcmFtcyk7CiB9CiAKLSNpZmRlZiBCQ01fQ05JQwotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2RlbF9mY29lX2V0aF9tYWNzKHN0cnVjdCBibngyeCAqYnApCitzdGF0aWMgaW5saW5lIGludCBibngyeF9mdW5jX3N0b3Aoc3RydWN0IGJueDJ4ICpicCkKIHsKLQlpZiAoYnAtPmZsYWdzICYgRkNPRV9NQUNTX1NFVCkgewotCQlpZiAoIUlTX01GX1NEKGJwKSkKLQkJCWJueDJ4X3NldF9maXBfZXRoX21hY19hZGRyKGJwLCAwKTsKKwlzdHJ1Y3QgYm54MnhfZnVuY19zdGF0ZV9wYXJhbXMgZnVuY19wYXJhbXMgPSB7MH07CisJaW50IHJjOwogCi0JCWJueDJ4X3NldF9hbGxfZW5vZGVfbWFjcyhicCwgMCk7CisJLyogUHJlcGFyZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbiBzdGF0ZSB0cmFuc2l0aW9ucyAqLworCV9fc2V0X2JpdChSQU1ST0RfQ09NUF9XQUlULCAmZnVuY19wYXJhbXMucmFtcm9kX2ZsYWdzKTsKKwlmdW5jX3BhcmFtcy5mX29iaiA9ICZicC0+ZnVuY19vYmo7CisJZnVuY19wYXJhbXMuY21kID0gQk5YMlhfRl9DTURfU1RPUDsKIAotCQlicC0+ZmxhZ3MgJj0gfkZDT0VfTUFDU19TRVQ7Ci0JfQotfQotI2VuZGlmCi0KLXZvaWQgYm54MnhfY2hpcF9jbGVhbnVwKHN0cnVjdCBibngyeCAqYnAsIGludCB1bmxvYWRfbW9kZSkKLXsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCXUzMiByZXNldF9jb2RlID0gMDsKLQlpbnQgaSwgY250LCByYzsKLQotCS8qIFdhaXQgdW50aWwgdHggZmFzdHBhdGggdGFza3MgY29tcGxldGUgKi8KLQlmb3JfZWFjaF90eF9xdWV1ZShicCwgaSkgewotCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKLQotCQljbnQgPSAxMDAwOwotCQl3aGlsZSAoYm54MnhfaGFzX3R4X3dvcmtfdW5sb2FkKGZwKSkgewotCi0JCQlpZiAoIWNudCkgewotCQkJCUJOWDJYX0VSUigidGltZW91dCB3YWl0aW5nIGZvciBxdWV1ZVslZF1cbiIsCi0JCQkJCSAgaSk7CisJLyoKKwkgKiBUcnkgdG8gc3RvcCB0aGUgZnVuY3Rpb24gdGhlICdnb29kIHdheScuIElmIGZhaWxzIChpbiBjYXNlCisJICogb2YgYSBwYXJpdHkgZXJyb3IgZHVyaW5nIGJueDJ4X2NoaXBfY2xlYW51cCgpKSBhbmQgd2UgYXJlCisJICogbm90IGluIGEgZGVidWcgbW9kZSwgcGVyZm9ybSBhIHN0YXRlIHRyYW5zYWN0aW9uIGluIG9yZGVyIHRvCisJICogZW5hYmxlIGZ1cnRoZXIgSFdfUkVTRVQgdHJhbnNhY3Rpb24uCisJICovCisJcmMgPSBibngyeF9mdW5jX3N0YXRlX2NoYW5nZShicCwgJmZ1bmNfcGFyYW1zKTsKKwlpZiAocmMpIHsKICNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCi0JCQkJYm54MnhfcGFuaWMoKTsKLQkJCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gcmM7CiAjZWxzZQotCQkJCWJyZWFrOworCQlCTlgyWF9FUlIoIkZVTkNfU1RPUCByYW1yb2QgZmFpbGVkLiBSdW5uaW5nIGEgZHJ5ICIKKwkJCSAgInRyYW5zYWN0aW9uXG4iKTsKKwkJX19zZXRfYml0KFJBTVJPRF9EUlZfQ0xSX09OTFksICZmdW5jX3BhcmFtcy5yYW1yb2RfZmxhZ3MpOworCQlyZXR1cm4gYm54MnhfZnVuY19zdGF0ZV9jaGFuZ2UoYnAsICZmdW5jX3BhcmFtcyk7CiAjZW5kaWYKLQkJCX0KLQkJCWNudC0tOwotCQkJbXNsZWVwKDEpOwotCQl9Ci0JfQotCS8qIEdpdmUgSFcgdGltZSB0byBkaXNjYXJkIG9sZCB0eCBtZXNzYWdlcyAqLwotCW1zbGVlcCgxKTsKLQotCWJueDJ4X3NldF9ldGhfbWFjKGJwLCAwKTsKLQotCWJueDJ4X2ludmFsaWRhdGVfdWNfbGlzdChicCk7Ci0KLQlpZiAoQ0hJUF9JU19FMShicCkpCi0JCWJueDJ4X2ludmFsaWRhdGVfZTFfbWNfbGlzdChicCk7Ci0JZWxzZSB7Ci0JCWJueDJ4X2ludmFsaWRhdGVfZTFoX21jX2xpc3QoYnApOwotCQlSRUdfV1IoYnAsIE5JR19SRUdfTExIMF9GVU5DX0VOICsgcG9ydCo4LCAwKTsKIAl9CiAKLSNpZmRlZiBCQ01fQ05JQwotCWJueDJ4X2RlbF9mY29lX2V0aF9tYWNzKGJwKTsKLSNlbmRpZgorCXJldHVybiAwOworfQogCisvKioKKyAqIGJueDJ4X3NlbmRfdW5sb2FkX3JlcSAtIHJlcXVlc3QgdW5sb2FkIG1vZGUgZnJvbSB0aGUgTUNQLgorICoKKyAqIEBicDoJCQlkcml2ZXIgaGFuZGxlCisgKiBAdW5sb2FkX21vZGU6CXJlcXVlc3RlZCBmdW5jdGlvbidzIHVubG9hZCBtb2RlCisgKgorICogUmV0dXJuIHVubG9hZCBtb2RlIHJldHVybmVkIGJ5IHRoZSBNQ1A6IENPTU1PTiwgUE9SVCBvciBGVU5DLgorICovCit1MzIgYm54Mnhfc2VuZF91bmxvYWRfcmVxKHN0cnVjdCBibngyeCAqYnAsIGludCB1bmxvYWRfbW9kZSkKK3sKKwl1MzIgcmVzZXRfY29kZSA9IDA7CisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKworCS8qIFNlbGVjdCB0aGUgVU5MT0FEIHJlcXVlc3QgbW9kZSAqLwogCWlmICh1bmxvYWRfbW9kZSA9PSBVTkxPQURfTk9STUFMKQogCQlyZXNldF9jb2RlID0gRFJWX01TR19DT0RFX1VOTE9BRF9SRVFfV09MX0RJUzsKIApAQCAtNzEwNiw1NCArNzU3NiwyMTUgQEAKIAl9IGVsc2UKIAkJcmVzZXRfY29kZSA9IERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dPTF9ESVM7CiAKLQkvKiBDbG9zZSBtdWx0aSBhbmQgbGVhZGluZyBjb25uZWN0aW9ucwotCSAgIENvbXBsZXRpb25zIGZvciByYW1yb2RzIGFyZSBjb2xsZWN0ZWQgaW4gYSBzeW5jaHJvbm91cyB3YXkgKi8KLQlmb3JfZWFjaF9xdWV1ZShicCwgaSkKLQotCQlpZiAoYm54Mnhfc3RvcF9jbGllbnQoYnAsIGkpKQotI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKLQkJCXJldHVybjsKLSNlbHNlCi0JCQlnb3RvIHVubG9hZF9lcnJvcjsKLSNlbmRpZgotCi0JcmMgPSBibngyeF9mdW5jX3N0b3AoYnApOwotCWlmIChyYykgewotCQlCTlgyWF9FUlIoIkZ1bmN0aW9uIHN0b3AgZmFpbGVkIVxuIik7Ci0jaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCQlyZXR1cm47Ci0jZWxzZQotCQlnb3RvIHVubG9hZF9lcnJvcjsKLSNlbmRpZgotCX0KLSNpZm5kZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotdW5sb2FkX2Vycm9yOgotI2VuZGlmCisJLyogU2VuZCB0aGUgcmVxdWVzdCB0byB0aGUgTUNQICovCiAJaWYgKCFCUF9OT01DUChicCkpCiAJCXJlc2V0X2NvZGUgPSBibngyeF9md19jb21tYW5kKGJwLCByZXNldF9jb2RlLCAwKTsKIAllbHNlIHsKKwkJaW50IHBhdGggPSBCUF9QQVRIKGJwKTsKKwogCQlEUChORVRJRl9NU0dfSUZET1dOLCAiTk8gTUNQIC0gbG9hZCBjb3VudHNbJWRdICAgICAgIgotCQkJCSAgICAgIiVkLCAlZCwgJWRcbiIsIEJQX1BBVEgoYnApLAotCQkgICBsb2FkX2NvdW50W0JQX1BBVEgoYnApXVswXSwKLQkJICAgbG9hZF9jb3VudFtCUF9QQVRIKGJwKV1bMV0sCi0JCSAgIGxvYWRfY291bnRbQlBfUEFUSChicCldWzJdKTsKLQkJbG9hZF9jb3VudFtCUF9QQVRIKGJwKV1bMF0tLTsKLQkJbG9hZF9jb3VudFtCUF9QQVRIKGJwKV1bMSArIHBvcnRdLS07CisJCQkJICAgICAiJWQsICVkLCAlZFxuIiwKKwkJICAgcGF0aCwgbG9hZF9jb3VudFtwYXRoXVswXSwgbG9hZF9jb3VudFtwYXRoXVsxXSwKKwkJICAgbG9hZF9jb3VudFtwYXRoXVsyXSk7CisJCWxvYWRfY291bnRbcGF0aF1bMF0tLTsKKwkJbG9hZF9jb3VudFtwYXRoXVsxICsgcG9ydF0tLTsKIAkJRFAoTkVUSUZfTVNHX0lGRE9XTiwgIk5PIE1DUCAtIG5ldyBsb2FkIGNvdW50c1slZF0gICIKLQkJCQkgICAgICIlZCwgJWQsICVkXG4iLCBCUF9QQVRIKGJwKSwKLQkJICAgbG9hZF9jb3VudFtCUF9QQVRIKGJwKV1bMF0sIGxvYWRfY291bnRbQlBfUEFUSChicCldWzFdLAotCQkgICBsb2FkX2NvdW50W0JQX1BBVEgoYnApXVsyXSk7Ci0JCWlmIChsb2FkX2NvdW50W0JQX1BBVEgoYnApXVswXSA9PSAwKQorCQkJCSAgICAgIiVkLCAlZCwgJWRcbiIsCisJCSAgIHBhdGgsIGxvYWRfY291bnRbcGF0aF1bMF0sIGxvYWRfY291bnRbcGF0aF1bMV0sCisJCSAgIGxvYWRfY291bnRbcGF0aF1bMl0pOworCQlpZiAobG9hZF9jb3VudFtwYXRoXVswXSA9PSAwKQogCQkJcmVzZXRfY29kZSA9IEZXX01TR19DT0RFX0RSVl9VTkxPQURfQ09NTU9OOwotCQllbHNlIGlmIChsb2FkX2NvdW50W0JQX1BBVEgoYnApXVsxICsgcG9ydF0gPT0gMCkKKwkJZWxzZSBpZiAobG9hZF9jb3VudFtwYXRoXVsxICsgcG9ydF0gPT0gMCkKIAkJCXJlc2V0X2NvZGUgPSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX1BPUlQ7CiAJCWVsc2UKIAkJCXJlc2V0X2NvZGUgPSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0ZVTkNUSU9OOwogCX0KIAotCWlmICgocmVzZXRfY29kZSA9PSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0NPTU1PTikgfHwKLQkgICAgKHJlc2V0X2NvZGUgPT0gRldfTVNHX0NPREVfRFJWX1VOTE9BRF9QT1JUKSkKLQkJYm54MnhfX2xpbmtfcmVzZXQoYnApOworCXJldHVybiByZXNldF9jb2RlOworfQorCisvKioKKyAqIGJueDJ4X3NlbmRfdW5sb2FkX2RvbmUgLSBzZW5kIFVOTE9BRF9ET05FIGNvbW1hbmQgdG8gdGhlIE1DUC4KKyAqCisgKiBAYnA6CQlkcml2ZXIgaGFuZGxlCisgKi8KK3ZvaWQgYm54Mnhfc2VuZF91bmxvYWRfZG9uZShzdHJ1Y3QgYm54MnggKmJwKQoreworCS8qIFJlcG9ydCBVTkxPQURfRE9ORSB0byBNQ1AgKi8KKwlpZiAoIUJQX05PTUNQKGJwKSkKKwkJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX1VOTE9BRF9ET05FLCAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfZnVuY193YWl0X3N0YXJ0ZWQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgdG91dCA9IDUwOworCWludCBtc2l4ID0gKGJwLT5mbGFncyAmIFVTSU5HX01TSVhfRkxBRykgPyAxIDogMDsKKworCWlmICghYnAtPnBvcnQucG1mKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogKGFzc3VtcHRpb246IE5vIEF0dGVudGlvbiBmcm9tIE1DUCBhdCB0aGlzIHN0YWdlKQorCSAqIFBNRiBwcm9iYWJseSBpbiB0aGUgbWlkZGxlIG9mIFRYZGlzYWJsZS9lbmFibGUgdHJhbnNhY3Rpb24KKwkgKiAxLiBTeW5jIElSUyBmb3IgZGVmYXVsdCBTQgorCSAqIDIuIFN5bmMgU1AgcXVldWUgLSB0aGlzIGd1YXJhbnRlcyB1cyB0aGF0IGF0dGVudGlvbiBoYW5kbGluZyBzdGFydGVkCisJICogMy4gV2FpdCwgdGhhdCBUWGRpc2FibGUvZW5hYmxlIHRyYW5zYWN0aW9uIGNvbXBsZXRlcworCSAqCisJICogMSsyIGd1cmFudHkgdGhhdCBpZiBEQ0J4IGF0dGVudGlvbiB3YXMgc2NoZWR1bGVkIGl0IGFscmVhZHkgY2hhbmdlZAorCSAqIHBlbmRpbmcgYml0IG9mIHRyYW5zYWN0aW9uIGZyb20gU1RBUlRFRC0tPlRYX1NUT1BQRUQsIGlmIHdlIGFscmVkeQorCSAqIHJlY2VpdmVkIGNvbXBsZXR0aW9uIGZvciB0aGUgdHJhbnNhY3Rpb24gdGhlIHN0YXRlIGlzIFRYX1NUT1BQRUQuCisJICogU3RhdGUgd2lsbCByZXR1cm4gdG8gU1RBUlRFRCBhZnRlciBjb21wbGV0aW9uIG9mIFRYX1NUT1BQRUQtLT5TVEFSVEVECisJICogdHJhbnNhY3Rpb24uCisJICovCisKKwkvKiBtYWtlIHN1cmUgZGVmYXVsdCBTQiBJU1IgaXMgZG9uZSAqLworCWlmIChtc2l4KQorCQlzeW5jaHJvbml6ZV9pcnEoYnAtPm1zaXhfdGFibGVbMF0udmVjdG9yKTsKKwllbHNlCisJCXN5bmNocm9uaXplX2lycShicC0+cGRldi0+aXJxKTsKKworCWZsdXNoX3dvcmtxdWV1ZShibngyeF93cSk7CisKKwl3aGlsZSAoYm54MnhfZnVuY19nZXRfc3RhdGUoYnAsICZicC0+ZnVuY19vYmopICE9CisJCQkJQk5YMlhfRl9TVEFURV9TVEFSVEVEICYmIHRvdXQtLSkKKwkJbXNsZWVwKDIwKTsKKworCWlmIChibngyeF9mdW5jX2dldF9zdGF0ZShicCwgJmJwLT5mdW5jX29iaikgIT0KKwkJCQkJCUJOWDJYX0ZfU1RBVEVfU1RBUlRFRCkgeworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwkJcmV0dXJuIC1FQlVTWTsKKyNlbHNlCisJCS8qCisJCSAqIEZhaWxlZCB0byBjb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24gaW4gYSAiZ29vZCB3YXkiCisJCSAqIEZvcmNlIGJvdGggdHJhbnNhY3Rpb25zIHdpdGggQ0xSIGJpdAorCQkgKi8KKwkJc3RydWN0IGJueDJ4X2Z1bmNfc3RhdGVfcGFyYW1zIGZ1bmNfcGFyYW1zID0gezB9OworCisJCURQKEJOWDJYX01TR19TUCwgIkhtbW0uLi4gdW5leHBlY3RlZCBmdW5jdGlvbiBzdGF0ZSEgIgorCQkJICAiRm9yY2luZyBTVEFSVEVELS0+VFhfU1QwUFBFRC0tPlNUQVJURURcbiIpOworCisJCWZ1bmNfcGFyYW1zLmZfb2JqID0gJmJwLT5mdW5jX29iajsKKwkJX19zZXRfYml0KFJBTVJPRF9EUlZfQ0xSX09OTFksCisJCQkJCSZmdW5jX3BhcmFtcy5yYW1yb2RfZmxhZ3MpOworCisJCS8qIFNUQVJURUQtLT5UWF9TVDBQUEVEICovCisJCWZ1bmNfcGFyYW1zLmNtZCA9IEJOWDJYX0ZfQ01EX1RYX1NUT1A7CisJCWJueDJ4X2Z1bmNfc3RhdGVfY2hhbmdlKGJwLCAmZnVuY19wYXJhbXMpOworCisJCS8qIFRYX1NUMFBQRUQtLT5TVEFSVEVEICovCisJCWZ1bmNfcGFyYW1zLmNtZCA9IEJOWDJYX0ZfQ01EX1RYX1NUQVJUOworCQlyZXR1cm4gYm54MnhfZnVuY19zdGF0ZV9jaGFuZ2UoYnAsICZmdW5jX3BhcmFtcyk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBibngyeF9jaGlwX2NsZWFudXAoc3RydWN0IGJueDJ4ICpicCwgaW50IHVubG9hZF9tb2RlKQoreworCWludCBwb3J0ID0gQlBfUE9SVChicCk7CisJaW50IGksIHJjID0gMDsKKwl1OCBjb3M7CisJc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgcnBhcmFtID0gezB9OworCXUzMiByZXNldF9jb2RlOworCisJLyogV2FpdCB1bnRpbCB0eCBmYXN0cGF0aCB0YXNrcyBjb21wbGV0ZSAqLworCWZvcl9lYWNoX3R4X3F1ZXVlKGJwLCBpKSB7CisJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOworCisJCWZvcl9lYWNoX2Nvc19pbl90eF9xdWV1ZShmcCwgY29zKQorCQkJcmMgPSBibngyeF9jbGVhbl90eF9xdWV1ZShicCwgJmZwLT50eGRhdGFbY29zXSk7CisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCQlpZiAocmMpCisJCQlyZXR1cm47CisjZW5kaWYKKwl9CisKKwkvKiBHaXZlIEhXIHRpbWUgdG8gZGlzY2FyZCBvbGQgdHggbWVzc2FnZXMgKi8KKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCk7CisKKwkvKiBDbGVhbiBhbGwgRVRIIE1BQ3MgKi8KKwlyYyA9IGJueDJ4X2RlbF9hbGxfbWFjcyhicCwgJmJwLT5mcFswXS5tYWNfb2JqLCBCTlgyWF9FVEhfTUFDLCBmYWxzZSk7CisJaWYgKHJjIDwgMCkKKwkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gZGVsZXRlIGFsbCBFVEggbWFjczogJWRcbiIsIHJjKTsKKworCS8qIENsZWFuIHVwIFVDIGxpc3QgICovCisJcmMgPSBibngyeF9kZWxfYWxsX21hY3MoYnAsICZicC0+ZnBbMF0ubWFjX29iaiwgQk5YMlhfVUNfTElTVF9NQUMsCisJCQkJdHJ1ZSk7CisJaWYgKHJjIDwgMCkKKwkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gc2NoZWR1bGUgREVMIGNvbW1hbmRzIGZvciBVQyBNQUNzIGxpc3Q6ICIKKwkJCSAgIiVkXG4iLCByYyk7CisKKwkvKiBEaXNhYmxlIExMSCAqLworCWlmICghQ0hJUF9JU19FMShicCkpCisJCVJFR19XUihicCwgTklHX1JFR19MTEgwX0ZVTkNfRU4gKyBwb3J0KjgsIDApOworCisJLyogU2V0ICJkcm9wIGFsbCIgKHN0b3AgUngpLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBhIG5ldGlmX2FkZHJfbG9jaygpIGhlcmUgaW4gb3JkZXIgdG8gcHJldmVudAorCSAqIGEgcmFjZSBiZXR3ZWVuIHRoZSBjb21wbGV0aW9uIGNvZGUgYW5kIHRoaXMgY29kZS4KKwkgKi8KKwluZXRpZl9hZGRyX2xvY2tfYmgoYnAtPmRldik7CisJLyogU2NoZWR1bGUgdGhlIHJ4X21vZGUgY29tbWFuZCAqLworCWlmICh0ZXN0X2JpdChCTlgyWF9GSUxURVJfUlhfTU9ERV9QRU5ESU5HLCAmYnAtPnNwX3N0YXRlKSkKKwkJc2V0X2JpdChCTlgyWF9GSUxURVJfUlhfTU9ERV9TQ0hFRCwgJmJwLT5zcF9zdGF0ZSk7CisJZWxzZQorCQlibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShicCk7CisKKwkvKiBDbGVhbnVwIG11bHRpY2FzdCBjb25maWd1cmF0aW9uICovCisJcnBhcmFtLm1jYXN0X29iaiA9ICZicC0+bWNhc3Rfb2JqOworCXJjID0gYm54MnhfY29uZmlnX21jYXN0KGJwLCAmcnBhcmFtLCBCTlgyWF9NQ0FTVF9DTURfREVMKTsKKwlpZiAocmMgPCAwKQorCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBzZW5kIERFTCBtdWx0aWNhc3QgY29tbWFuZDogJWRcbiIsIHJjKTsKKworCW5ldGlmX2FkZHJfdW5sb2NrX2JoKGJwLT5kZXYpOworCisKKworCS8qCisJICogU2VuZCB0aGUgVU5MT0FEX1JFUVVFU1QgdG8gdGhlIE1DUC4gVGhpcyB3aWxsIHJldHVybiBpZgorCSAqIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHBlcmZvcm0gRlVOQywgUE9SVCBvciBDT01NT04gSFcKKwkgKiByZXNldC4KKwkgKi8KKwlyZXNldF9jb2RlID0gYm54Mnhfc2VuZF91bmxvYWRfcmVxKGJwLCB1bmxvYWRfbW9kZSk7CisKKwkvKgorCSAqIChhc3N1bXB0aW9uOiBObyBBdHRlbnRpb24gZnJvbSBNQ1AgYXQgdGhpcyBzdGFnZSkKKwkgKiBQTUYgcHJvYmFibHkgaW4gdGhlIG1pZGRsZSBvZiBUWGRpc2FibGUvZW5hYmxlIHRyYW5zYWN0aW9uCisJICovCisJcmMgPSBibngyeF9mdW5jX3dhaXRfc3RhcnRlZChicCk7CisJaWYgKHJjKSB7CisJCUJOWDJYX0VSUigiYm54MnhfZnVuY193YWl0X3N0YXJ0ZWQgZmFpbGVkXG4iKTsKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJCXJldHVybjsKKyNlbmRpZgorCX0KKworCS8qIENsb3NlIG11bHRpIGFuZCBsZWFkaW5nIGNvbm5lY3Rpb25zCisJICogQ29tcGxldGlvbnMgZm9yIHJhbXJvZHMgYXJlIGNvbGxlY3RlZCBpbiBhIHN5bmNocm9ub3VzIHdheQorCSAqLworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKQorCQlpZiAoYm54Mnhfc3RvcF9xdWV1ZShicCwgaSkpCisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCQkJcmV0dXJuOworI2Vsc2UKKwkJCWdvdG8gdW5sb2FkX2Vycm9yOworI2VuZGlmCisJLyogSWYgU1Agc2V0dGluZ3MgZGlkbid0IGdldCBjb21wbGV0ZWQgc28gZmFyIC0gc29tZXRoaW5nCisJICogdmVyeSB3cm9uZyBoYXMgaGFwcGVuLgorCSAqLworCWlmICghYm54Mnhfd2FpdF9zcF9jb21wKGJwLCB+MHgwVUwpKQorCQlCTlgyWF9FUlIoIkhtbW0uLi4gQ29tbW9uIHNsb3cgcGF0aCByYW1yb2RzIGdvdCBzdHVjayFcbiIpOworCisjaWZuZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKK3VubG9hZF9lcnJvcjoKKyNlbmRpZgorCXJjID0gYm54MnhfZnVuY19zdG9wKGJwKTsKKwlpZiAocmMpIHsKKwkJQk5YMlhfRVJSKCJGdW5jdGlvbiBzdG9wIGZhaWxlZCFcbiIpOworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwkJcmV0dXJuOworI2VuZGlmCisJfQogCiAJLyogRGlzYWJsZSBIVyBpbnRlcnJ1cHRzLCBOQVBJICovCiAJYm54MnhfbmV0aWZfc3RvcChicCwgMSk7CkBAIC03MTYyLDEyICs3NzkzLDEzIEBACiAJYm54MnhfZnJlZV9pcnEoYnApOwogCiAJLyogUmVzZXQgdGhlIGNoaXAgKi8KLQlibngyeF9yZXNldF9jaGlwKGJwLCByZXNldF9jb2RlKTsKKwlyYyA9IGJueDJ4X3Jlc2V0X2h3KGJwLCByZXNldF9jb2RlKTsKKwlpZiAocmMpCisJCUJOWDJYX0VSUigiSFdfUkVTRVQgZmFpbGVkXG4iKTsKKwogCiAJLyogUmVwb3J0IFVOTE9BRF9ET05FIHRvIE1DUCAqLwotCWlmICghQlBfTk9NQ1AoYnApKQotCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfVU5MT0FEX0RPTkUsIDApOwotCisJYm54Mnhfc2VuZF91bmxvYWRfZG9uZShicCk7CiB9CiAKIHZvaWQgYm54MnhfZGlzYWJsZV9jbG9zZV90aGVfZ2F0ZShzdHJ1Y3QgYm54MnggKmJwKQpAQCAtNzE4NCw3ICs3ODE2LDcgQEAKIAkJdmFsID0gUkVHX1JEKGJwLCBhZGRyKTsKIAkJdmFsICY9IH4oMHgzMDApOwogCQlSRUdfV1IoYnAsIGFkZHIsIHZhbCk7Ci0JfSBlbHNlIGlmIChDSElQX0lTX0UxSChicCkpIHsKKwl9IGVsc2UgewogCQl2YWwgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX0FFVV9HRU5FUkFMX01BU0spOwogCQl2YWwgJj0gfihNSVNDX0FFVV9HRU5FUkFMX01BU0tfUkVHX0FFVV9QWFBfQ0xPU0VfTUFTSyB8CiAJCQkgTUlTQ19BRVVfR0VORVJBTF9NQVNLX1JFR19BRVVfTklHX0NMT1NFX01BU0spOwpAQCAtNzE5NSwyNCArNzgyNywzNyBAQAogLyogQ2xvc2UgZ2F0ZXMgIzIsICMzIGFuZCAjNDogKi8KIHN0YXRpYyB2b2lkIGJueDJ4X3NldF8yMzRfZ2F0ZXMoc3RydWN0IGJueDJ4ICpicCwgYm9vbCBjbG9zZSkKIHsKLQl1MzIgdmFsLCBhZGRyOworCXUzMiB2YWw7CiAKIAkvKiBHYXRlcyAjMiBhbmQgIzRhIGFyZSBjbG9zZWQvb3BlbmVkIGZvciAibm90IEUxIiBvbmx5ICovCiAJaWYgKCFDSElQX0lTX0UxKGJwKSkgewogCQkvKiAjNCAqLwotCQl2YWwgPSBSRUdfUkQoYnAsIFBYUF9SRUdfSFNUX0RJU0NBUkRfRE9PUkJFTExTKTsKLQkJUkVHX1dSKGJwLCBQWFBfUkVHX0hTVF9ESVNDQVJEX0RPT1JCRUxMUywKLQkJICAgICAgIGNsb3NlID8gKHZhbCB8IDB4MSkgOiAodmFsICYgKH4odTMyKTEpKSk7CisJCVJFR19XUihicCwgUFhQX1JFR19IU1RfRElTQ0FSRF9ET09SQkVMTFMsICEhY2xvc2UpOwogCQkvKiAjMiAqLwotCQl2YWwgPSBSRUdfUkQoYnAsIFBYUF9SRUdfSFNUX0RJU0NBUkRfSU5URVJOQUxfV1JJVEVTKTsKLQkJUkVHX1dSKGJwLCBQWFBfUkVHX0hTVF9ESVNDQVJEX0lOVEVSTkFMX1dSSVRFUywKLQkJICAgICAgIGNsb3NlID8gKHZhbCB8IDB4MSkgOiAodmFsICYgKH4odTMyKTEpKSk7CisJCVJFR19XUihicCwgUFhQX1JFR19IU1RfRElTQ0FSRF9JTlRFUk5BTF9XUklURVMsICEhY2xvc2UpOwogCX0KIAogCS8qICMzICovCi0JYWRkciA9IEJQX1BPUlQoYnApID8gSENfUkVHX0NPTkZJR18xIDogSENfUkVHX0NPTkZJR18wOwotCXZhbCA9IFJFR19SRChicCwgYWRkcik7Ci0JUkVHX1dSKGJwLCBhZGRyLCAoIWNsb3NlKSA/ICh2YWwgfCAweDEpIDogKHZhbCAmICh+KHUzMikxKSkpOworCWlmIChDSElQX0lTX0UxeChicCkpIHsKKwkJLyogUHJldmVudCBpbnRlcnJ1cHRzIGZyb20gSEMgb24gYm90aCBwb3J0cyAqLworCQl2YWwgPSBSRUdfUkQoYnAsIEhDX1JFR19DT05GSUdfMSk7CisJCVJFR19XUihicCwgSENfUkVHX0NPTkZJR18xLAorCQkgICAgICAgKCFjbG9zZSkgPyAodmFsIHwgSENfQ09ORklHXzFfUkVHX0JMT0NLX0RJU0FCTEVfMSkgOgorCQkgICAgICAgKHZhbCAmIH4odTMyKUhDX0NPTkZJR18xX1JFR19CTE9DS19ESVNBQkxFXzEpKTsKKworCQl2YWwgPSBSRUdfUkQoYnAsIEhDX1JFR19DT05GSUdfMCk7CisJCVJFR19XUihicCwgSENfUkVHX0NPTkZJR18wLAorCQkgICAgICAgKCFjbG9zZSkgPyAodmFsIHwgSENfQ09ORklHXzBfUkVHX0JMT0NLX0RJU0FCTEVfMCkgOgorCQkgICAgICAgKHZhbCAmIH4odTMyKUhDX0NPTkZJR18wX1JFR19CTE9DS19ESVNBQkxFXzApKTsKKwl9IGVsc2UgeworCQkvKiBQcmV2ZW50IGluY29tbWluZyBpbnRlcnJ1cHRzIGluIElHVSAqLworCQl2YWwgPSBSRUdfUkQoYnAsIElHVV9SRUdfQkxPQ0tfQ09ORklHVVJBVElPTik7CisKKwkJUkVHX1dSKGJwLCBJR1VfUkVHX0JMT0NLX0NPTkZJR1VSQVRJT04sCisJCSAgICAgICAoIWNsb3NlKSA/CisJCSAgICAgICAodmFsIHwgSUdVX0JMT0NLX0NPTkZJR1VSQVRJT05fUkVHX0JMT0NLX0VOQUJMRSkgOgorCQkgICAgICAgKHZhbCAmIH4odTMyKUlHVV9CTE9DS19DT05GSUdVUkFUSU9OX1JFR19CTE9DS19FTkFCTEUpKTsKKwl9CiAKIAlEUChORVRJRl9NU0dfSFcsICIlcyBnYXRlcyAjMiwgIzMgYW5kICM0XG4iLAogCQljbG9zZSA/ICJjbG9zaW5nIiA6ICJvcGVuaW5nIik7CkBAIC03MzMwLDcgKzc5NzUsNiBAQAogCWlmICghQ0hJUF9JU19FMShicCkpIHsKIAkJUkVHX1dSKGJwLCBQWFAyX1JFR19SRF9TVEFSVF9JTklULCAwKTsKIAkJUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9SQkNfRE9ORSwgMCk7Ci0JCVJFR19XUihicCwgUFhQMl9SRUdfUlFfQ0ZHX0RPTkUsIDApOwogCQltbWlvd2IoKTsKIAl9CiB9CkBAIC03MzQ1LDQ2ICs3OTg5LDEzMyBAQAogICogICAgICAtIEdSQwogICogICAgICAtIFJCQ04sIFJCQ1AKICAqLwotc3RhdGljIHZvaWQgYm54MnhfcHJvY2Vzc19raWxsX2NoaXBfcmVzZXQoc3RydWN0IGJueDJ4ICpicCkKK3N0YXRpYyB2b2lkIGJueDJ4X3Byb2Nlc3Nfa2lsbF9jaGlwX3Jlc2V0KHN0cnVjdCBibngyeCAqYnAsIGJvb2wgZ2xvYmFsKQogewogCXUzMiBub3RfcmVzZXRfbWFzazEsIHJlc2V0X21hc2sxLCBub3RfcmVzZXRfbWFzazIsIHJlc2V0X21hc2syOworCXUzMiBnbG9iYWxfYml0czIsIHN0YXlfcmVzZXQyOwogCisJLyoKKwkgKiBCaXRzIHRoYXQgaGF2ZSB0byBiZSBzZXQgaW4gcmVzZXRfbWFzazIgaWYgd2Ugd2FudCB0byByZXNldCAnZ2xvYmFsJworCSAqIChwZXIgY2hpcCkgYmxvY2tzLgorCSAqLworCWdsb2JhbF9iaXRzMiA9CisJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9NQ1BfTl9SRVNFVF9DTU5fQ1BVIHwKKwkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX01DUF9OX1JFU0VUX0NNTl9DT1JFOworCisJLyogRG9uJ3QgcmVzZXQgdGhlIGZvbGxvd2luZyBibG9ja3MgKi8KIAlub3RfcmVzZXRfbWFzazEgPQogCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9SU1RfSEMgfAogCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9SU1RfUFhQViB8CiAJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1JTVF9QWFA7CiAKIAlub3RfcmVzZXRfbWFzazIgPQotCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfTURJTyB8CisJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9QQ0lfTURJTyB8CiAJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9FTUFDMF9IQVJEX0NPUkUgfAogCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfRU1BQzFfSEFSRF9DT1JFIHwKIAkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX01JU0NfQ09SRSB8CiAJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9SQkNOIHwKIAkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0dSQyAgfAogCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfTUNQX05fUkVTRVRfUkVHX0hBUkRfQ09SRSB8Ci0JCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9NQ1BfTl9IQVJEX0NPUkVfUlNUX0I7CisJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9NQ1BfTl9IQVJEX0NPUkVfUlNUX0IgfAorCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfQVRDIHwKKwkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUEdMQzsKIAorCS8qCisJICogS2VlcCB0aGUgZm9sbG93aW5nIGJsb2NrcyBpbiByZXNldDoKKwkgKiAgLSBhbGwgeHhNQUNzIGFyZSBoYW5kbGVkIGJ5IHRoZSBibngyeF9saW5rIGNvZGUuCisJICovCisJc3RheV9yZXNldDIgPQorCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfQk1BQzAgfAorCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfQk1BQzEgfAorCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfRU1BQzAgfAorCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfRU1BQzEgfAorCQlNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9VTUFDMCB8CisJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1VNQUMxIHwKKwkJTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfWE1BQyB8CisJCU1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1hNQUNfU09GVDsKKworCS8qIEZ1bGwgcmVzZXQgbWFza3MgYWNjb3JkaW5nIHRvIHRoZSBjaGlwICovCiAJcmVzZXRfbWFzazEgPSAweGZmZmZmZmZmOwogCiAJaWYgKENISVBfSVNfRTEoYnApKQogCQlyZXNldF9tYXNrMiA9IDB4ZmZmZjsKLQllbHNlCisJZWxzZSBpZiAoQ0hJUF9JU19FMUgoYnApKQogCQlyZXNldF9tYXNrMiA9IDB4MWZmZmY7CisJZWxzZSBpZiAoQ0hJUF9JU19FMihicCkpCisJCXJlc2V0X21hc2syID0gMHhmZmZmZjsKKwllbHNlIC8qIENISVBfSVNfRTMgKi8KKwkJcmVzZXRfbWFzazIgPSAweDNmZmZmZmY7CisKKwkvKiBEb24ndCByZXNldCBnbG9iYWwgYmxvY2tzIHVubGVzcyB3ZSBuZWVkIHRvICovCisJaWYgKCFnbG9iYWwpCisJCXJlc2V0X21hc2syICY9IH5nbG9iYWxfYml0czI7CisKKwkvKgorCSAqIEluIGNhc2Ugb2YgYXR0ZW50aW9uIGluIHRoZSBRTSwgd2UgbmVlZCB0byByZXNldCBQWFAKKwkgKiAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX1BYUF9SUV9SRF9XUikgYmVmb3JlIFFNCisJICogYmVjYXVzZSBvdGhlcndpc2UgUU0gcmVzZXQgd291bGQgcmVsZWFzZSAnY2xvc2UgdGhlIGdhdGVzJyBzaG9ydGx5CisJICogYmVmb3JlIHJlc2V0dGluZyB0aGUgUFhQLCB0aGVuIHRoZSBQU1dSUSB3b3VsZCBzZW5kIGEgd3JpdGUKKwkgKiByZXF1ZXN0IHRvIFBHTFVFLiBUaGVuIHdoZW4gUFhQIGlzIHJlc2V0LCBQR0xVRSB3b3VsZCB0cnkgdG8KKwkgKiByZWFkIHRoZSBwYXlsb2FkIGRhdGEgZnJvbSBQU1dXUiwgYnV0IFBTV1dSIHdvdWxkIG5vdAorCSAqIHJlc3BvbmQuIFRoZSB3cml0ZSBxdWV1ZSBpbiBQR0xVRSB3b3VsZCBzdHVjaywgZG1hZSBjb21tYW5kcworCSAqIHdvdWxkIG5vdCByZXR1cm4uIFRoZXJlZm9yZSBpdCdzIGltcG9ydGFudCB0byByZXNldCB0aGUgc2Vjb25kCisJICogcmVzZXQgcmVnaXN0ZXIgKGNvbnRhaW5pbmcgdGhlCisJICogTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX1BYUF9SUV9SRF9XUiBiaXQpIGJlZm9yZSB0aGUKKwkgKiBmaXJzdCBvbmUgKGNvbnRhaW5pbmcgdGhlIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1JTVF9RTQorCSAqIGJpdCkuCisJICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9DTEVBUiwKKwkgICAgICAgcmVzZXRfbWFzazIgJiAofm5vdF9yZXNldF9tYXNrMikpOwogCiAJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9DTEVBUiwKIAkgICAgICAgcmVzZXRfbWFzazEgJiAofm5vdF9yZXNldF9tYXNrMSkpOwotCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfQ0xFQVIsCi0JICAgICAgIHJlc2V0X21hc2syICYgKH5ub3RfcmVzZXRfbWFzazIpKTsKKworCWJhcnJpZXIoKTsKKwltbWlvd2IoKTsKKworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfU0VULAorCSAgICAgICByZXNldF9tYXNrMiAmICh+c3RheV9yZXNldDIpKTsKIAogCWJhcnJpZXIoKTsKIAltbWlvd2IoKTsKIAogCVJFR19XUihicCwgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfU0VULCByZXNldF9tYXNrMSk7Ci0JUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MgKyBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9TRVQsIHJlc2V0X21hc2syKTsKIAltbWlvd2IoKTsKIH0KIAotc3RhdGljIGludCBibngyeF9wcm9jZXNzX2tpbGwoc3RydWN0IGJueDJ4ICpicCkKKy8qKgorICogYm54MnhfZXJfcG9sbF9pZ3VfdnEgLSBwb2xsIGZvciBwZW5kaW5nIHdyaXRlcyBiaXQuCisgKiBJdCBzaG91bGQgZ2V0IGNsZWFyZWQgaW4gbm8gbW9yZSB0aGFuIDFzLgorICoKKyAqIEBicDoJZHJpdmVyIGhhbmRsZQorICoKKyAqIEl0IHNob3VsZCBnZXQgY2xlYXJlZCBpbiBubyBtb3JlIHRoYW4gMXMuIFJldHVybnMgMCBpZgorICogcGVuZGluZyB3cml0ZXMgYml0IGdldHMgY2xlYXJlZC4KKyAqLworc3RhdGljIGludCBibngyeF9lcl9wb2xsX2lndV92cShzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiBjbnQgPSAxMDAwOworCXUzMiBwZW5kX2JpdHMgPSAwOworCisJZG8geworCQlwZW5kX2JpdHMgID0gUkVHX1JEKGJwLCBJR1VfUkVHX1BFTkRJTkdfQklUU19TVEFUVVMpOworCisJCWlmIChwZW5kX2JpdHMgPT0gMCkKKwkJCWJyZWFrOworCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDAwKTsKKwl9IHdoaWxlIChjbnQtLSA+IDApOworCisJaWYgKGNudCA8PSAwKSB7CisJCUJOWDJYX0VSUigiU3RpbGwgcGVuZGluZyBJR1UgcmVxdWVzdHMgcGVuZF9iaXRzPSV4IVxuIiwKKwkJCSAgcGVuZF9iaXRzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibngyeF9wcm9jZXNzX2tpbGwoc3RydWN0IGJueDJ4ICpicCwgYm9vbCBnbG9iYWwpCiB7CiAJaW50IGNudCA9IDEwMDA7CiAJdTMyIHZhbCA9IDA7CkBAIC03NDAzLDcgKzgxMzQsNyBAQAogCQkgICAgKChwb3J0X2lzX2lkbGVfMSAmIDB4MSkgPT0gMHgxKSAmJgogCQkgICAgKHBnbF9leHBfcm9tMiA9PSAweGZmZmZmZmZmKSkKIAkJCWJyZWFrOwotCQltc2xlZXAoMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDAwKTsKIAl9IHdoaWxlIChjbnQtLSA+IDApOwogCiAJaWYgKGNudCA8PSAwKSB7CkBAIC03NDIzLDYgKzgxNTQsMTEgQEAKIAkvKiBDbG9zZSBnYXRlcyAjMiwgIzMgYW5kICM0ICovCiAJYm54Mnhfc2V0XzIzNF9nYXRlcyhicCwgdHJ1ZSk7CiAKKwkvKiBQb2xsIGZvciBJR1UgVlFzIGZvciA1NzcxMiBhbmQgbmV3ZXIgY2hpcHMgKi8KKwlpZiAoIUNISVBfSVNfRTF4KGJwKSAmJiBibngyeF9lcl9wb2xsX2lndV92cShicCkpCisJCXJldHVybiAtRUFHQUlOOworCisKIAkvKiBUQkQ6IEluZGljYXRlIHRoYXQgInByb2Nlc3Mga2lsbCIgaXMgaW4gcHJvZ3Jlc3MgdG8gTUNQICovCiAKIAkvKiBDbGVhciAidW5wcmVwYXJlZCIgYml0ICovCkBAIC03NDM1LDI1ICs4MTcxLDI4IEBACiAJLyogV2FpdCBmb3IgMW1zIHRvIGVtcHR5IEdMVUUgYW5kIFBDSS1FIGNvcmUgcXVldWVzLAogCSAqIFBTV0hTVCwgR1JDIGFuZCBQU1dSRCBUZXRyaXMgYnVmZmVyLgogCSAqLwotCW1zbGVlcCgxKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCk7CiAKIAkvKiBQcmVwYXJlIHRvIGNoaXAgcmVzZXQ6ICovCiAJLyogTUNQICovCi0JYm54MnhfcmVzZXRfbWNwX3ByZXAoYnAsICZ2YWwpOworCWlmIChnbG9iYWwpCisJCWJueDJ4X3Jlc2V0X21jcF9wcmVwKGJwLCAmdmFsKTsKIAogCS8qIFBYUCAqLwogCWJueDJ4X3B4cF9wcmVwKGJwKTsKIAliYXJyaWVyKCk7CiAKIAkvKiByZXNldCB0aGUgY2hpcCAqLwotCWJueDJ4X3Byb2Nlc3Nfa2lsbF9jaGlwX3Jlc2V0KGJwKTsKKwlibngyeF9wcm9jZXNzX2tpbGxfY2hpcF9yZXNldChicCwgZ2xvYmFsKTsKIAliYXJyaWVyKCk7CiAKIAkvKiBSZWNvdmVyIGFmdGVyIHJlc2V0OiAqLwogCS8qIE1DUCAqLwotCWlmIChibngyeF9yZXNldF9tY3BfY29tcChicCwgdmFsKSkKKwlpZiAoZ2xvYmFsICYmIGJueDJ4X3Jlc2V0X21jcF9jb21wKGJwLCB2YWwpKQogCQlyZXR1cm4gLUVBR0FJTjsKIAorCS8qIFRCRDogQWRkIHJlc2V0dGluZyB0aGUgTk9fTUNQIG1vZGUgREIgaGVyZSAqLworCiAJLyogUFhQICovCiAJYm54MnhfcHhwX3ByZXAoYnApOwogCkBAIC03NDY2LDQzICs4MjA1LDg1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYm54MnhfbGVhZGVyX3Jlc2V0KHN0cnVjdCBibngyeCAqYnApCitpbnQgYm54MnhfbGVhZGVyX3Jlc2V0KHN0cnVjdCBibngyeCAqYnApCiB7CiAJaW50IHJjID0gMDsKKwlib29sIGdsb2JhbCA9IGJueDJ4X3Jlc2V0X2lzX2dsb2JhbChicCk7CisKIAkvKiBUcnkgdG8gcmVjb3ZlciBhZnRlciB0aGUgZmFpbHVyZSAqLwotCWlmIChibngyeF9wcm9jZXNzX2tpbGwoYnApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFNvbWV0aGluZyBiYWQgaGFkIGhhcHBlbiEgQWlpIVxuIiwKLQkJICAgICAgIGJwLT5kZXYtPm5hbWUpOworCWlmIChibngyeF9wcm9jZXNzX2tpbGwoYnAsIGdsb2JhbCkpIHsKKwkJbmV0ZGV2X2VycihicC0+ZGV2LCAiU29tZXRoaW5nIGJhZCBoYWQgaGFwcGVuIG9uIGVuZ2luZSAlZCEgIgorCQkJCSAgICAiQWlpIVxuIiwgQlBfUEFUSChicCkpOwogCQlyYyA9IC1FQUdBSU47CiAJCWdvdG8gZXhpdF9sZWFkZXJfcmVzZXQ7CiAJfQogCi0JLyogQ2xlYXIgInJlc2V0IGlzIGluIHByb2dyZXNzIiBiaXQgYW5kIHVwZGF0ZSB0aGUgZHJpdmVyIHN0YXRlICovCisJLyoKKwkgKiBDbGVhciBSRVNFVF9JTl9QUk9HUkVTIGFuZCBSRVNFVF9HTE9CQUwgYml0cyBhbmQgdXBkYXRlIHRoZSBkcml2ZXIKKwkgKiBzdGF0ZS4KKwkgKi8KIAlibngyeF9zZXRfcmVzZXRfZG9uZShicCk7Ci0JYnAtPnJlY292ZXJ5X3N0YXRlID0gQk5YMlhfUkVDT1ZFUllfRE9ORTsKKwlpZiAoZ2xvYmFsKQorCQlibngyeF9jbGVhcl9yZXNldF9nbG9iYWwoYnApOwogCiBleGl0X2xlYWRlcl9yZXNldDoKIAlicC0+aXNfbGVhZGVyID0gMDsKLQlibngyeF9yZWxlYXNlX2h3X2xvY2soYnAsIEhXX0xPQ0tfUkVTT1VSQ0VfUkVTRVJWRURfMDgpOwotCXNtcF93bWIoKTsKKwlibngyeF9yZWxlYXNlX2xlYWRlcl9sb2NrKGJwKTsKKwlzbXBfbWIoKTsKIAlyZXR1cm4gcmM7CiB9CiAKLS8qIEFzc3VtcHRpb246IHJ1bnMgdW5kZXIgcnRubCBsb2NrLiBUaGlzIHRvZ2V0aGVyIHdpdGggdGhlIGZhY3QKLSAqIHRoYXQgaXQncyBjYWxsZWQgb25seSBmcm9tIGJueDJ4X3Jlc2V0X3Rhc2soKSBlbnN1cmUgdGhhdCBpdAorc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3JlY292ZXJ5X2ZhaWxlZChzdHJ1Y3QgYm54MnggKmJwKQoreworCW5ldGRldl9lcnIoYnAtPmRldiwgIlJlY292ZXJ5IGhhcyBmYWlsZWQuIFBvd2VyIGN5Y2xlIGlzIG5lZWRlZC5cbiIpOworCisJLyogRGlzY29ubmVjdCB0aGlzIGRldmljZSAqLworCW5ldGlmX2RldmljZV9kZXRhY2goYnAtPmRldik7CisKKwkvKgorCSAqIEJsb2NrIGlmdXAgZm9yIGFsbCBmdW5jdGlvbiBvbiB0aGlzIGVuZ2luZSB1bnRpbCAicHJvY2VzcyBraWxsIgorCSAqIG9yIHBvd2VyIGN5Y2xlLgorCSAqLworCWJueDJ4X3NldF9yZXNldF9pbl9wcm9ncmVzcyhicCk7CisKKwkvKiBTaHV0IGRvd24gdGhlIHBvd2VyICovCisJYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lfRDNob3QpOworCisJYnAtPnJlY292ZXJ5X3N0YXRlID0gQk5YMlhfUkVDT1ZFUllfRkFJTEVEOworCisJc21wX21iKCk7Cit9CisKKy8qCisgKiBBc3N1bXB0aW9uOiBydW5zIHVuZGVyIHJ0bmwgbG9jay4gVGhpcyB0b2dldGhlciB3aXRoIHRoZSBmYWN0CisgKiB0aGF0IGl0J3MgY2FsbGVkIG9ubHkgZnJvbSBibngyeF9zcF9ydG5sKCkgZW5zdXJlIHRoYXQgaXQKICAqIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIHdoZW4gbmV0aWZfcnVubmluZyhicC0+ZGV2KSBpcyBmYWxzZS4KICAqLwogc3RhdGljIHZvaWQgYm54MnhfcGFyaXR5X3JlY292ZXIoc3RydWN0IGJueDJ4ICpicCkKIHsKKwlib29sIGdsb2JhbCA9IGZhbHNlOworCiAJRFAoTkVUSUZfTVNHX0hXLCAiSGFuZGxpbmcgcGFyaXR5XG4iKTsKIAl3aGlsZSAoMSkgewogCQlzd2l0Y2ggKGJwLT5yZWNvdmVyeV9zdGF0ZSkgewogCQljYXNlIEJOWDJYX1JFQ09WRVJZX0lOSVQ6CiAJCQlEUChORVRJRl9NU0dfSFcsICJTdGF0ZSBpcyBCTlgyWF9SRUNPVkVSWV9JTklUXG4iKTsKKwkJCWJueDJ4X2Noa19wYXJpdHlfYXR0bihicCwgJmdsb2JhbCwgZmFsc2UpOworCiAJCQkvKiBUcnkgdG8gZ2V0IGEgTEVBREVSX0xPQ0sgSFcgbG9jayAqLwotCQkJaWYgKGJueDJ4X3RyeWxvY2tfaHdfbG9jayhicCwKLQkJCQlIV19MT0NLX1JFU09VUkNFX1JFU0VSVkVEXzA4KSkKKwkJCWlmIChibngyeF90cnlsb2NrX2xlYWRlcl9sb2NrKGJwKSkgeworCQkJCWJueDJ4X3NldF9yZXNldF9pbl9wcm9ncmVzcyhicCk7CisJCQkJLyoKKwkJCQkgKiBDaGVjayBpZiB0aGVyZSBpcyBhIGdsb2JhbCBhdHRlbnRpb24gYW5kIGlmCisJCQkJICogdGhlcmUgd2FzIGEgZ2xvYmFsIGF0dGVudGlvbiwgc2V0IHRoZSBnbG9iYWwKKwkJCQkgKiByZXNldCBiaXQuCisJCQkJICovCisKKwkJCQlpZiAoZ2xvYmFsKQorCQkJCQlibngyeF9zZXRfcmVzZXRfZ2xvYmFsKGJwKTsKKwogCQkJCWJwLT5pc19sZWFkZXIgPSAxOworCQkJfQogCiAJCQkvKiBTdG9wIHRoZSBkcml2ZXIgKi8KIAkJCS8qIElmIGludGVyZmFjZSBoYXMgYmVlbiByZW1vdmVkIC0gYnJlYWsgKi8KQEAgLTc1MTAsMjEgKzgyOTEsNDcgQEAKIAkJCQlyZXR1cm47CiAKIAkJCWJwLT5yZWNvdmVyeV9zdGF0ZSA9IEJOWDJYX1JFQ09WRVJZX1dBSVQ7Ci0JCQkvKiBFbnN1cmUgImlzX2xlYWRlciIgYW5kICJyZWNvdmVyeV9zdGF0ZSIKLQkJCSAqICB1cGRhdGUgdmFsdWVzIGFyZSBzZWVuIG9uIG90aGVyIENQVXMKKworCQkJLyoKKwkJCSAqIFJlc2V0IE1DUCBjb21tYW5kIHNlcXVlbmNlIG51bWJlciBhbmQgTUNQIG1haWwgYm94CisJCQkgKiBzZXF1ZW5jZSBhcyB3ZSBhcmUgZ29pbmcgdG8gcmVzZXQgdGhlIE1DUC4KIAkJCSAqLwotCQkJc21wX3dtYigpOworCQkJaWYgKGdsb2JhbCkgeworCQkJCWJwLT5md19zZXEgPSAwOworCQkJCWJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxID0gMDsKKwkJCX0KKworCQkJLyogRW5zdXJlICJpc19sZWFkZXIiLCBNQ1AgY29tbWFuZCBzZXF1ZW5jZSBhbmQKKwkJCSAqICJyZWNvdmVyeV9zdGF0ZSIgdXBkYXRlIHZhbHVlcyBhcmUgc2VlbiBvbiBvdGhlcgorCQkJICogQ1BVcy4KKwkJCSAqLworCQkJc21wX21iKCk7CiAJCQlicmVhazsKIAogCQljYXNlIEJOWDJYX1JFQ09WRVJZX1dBSVQ6CiAJCQlEUChORVRJRl9NU0dfSFcsICJTdGF0ZSBpcyBCTlgyWF9SRUNPVkVSWV9XQUlUXG4iKTsKIAkJCWlmIChicC0+aXNfbGVhZGVyKSB7Ci0JCQkJdTMyIGxvYWRfY291bnRlciA9IGJueDJ4X2dldF9sb2FkX2NudChicCk7Ci0JCQkJaWYgKGxvYWRfY291bnRlcikgeworCQkJCWludCBvdGhlcl9lbmdpbmUgPSBCUF9QQVRIKGJwKSA/IDAgOiAxOworCQkJCXUzMiBvdGhlcl9sb2FkX2NvdW50ZXIgPQorCQkJCQlibngyeF9nZXRfbG9hZF9jbnQoYnAsIG90aGVyX2VuZ2luZSk7CisJCQkJdTMyIGxvYWRfY291bnRlciA9CisJCQkJCWJueDJ4X2dldF9sb2FkX2NudChicCwgQlBfUEFUSChicCkpOworCQkJCWdsb2JhbCA9IGJueDJ4X3Jlc2V0X2lzX2dsb2JhbChicCk7CisKKwkJCQkvKgorCQkJCSAqIEluIGNhc2Ugb2YgYSBwYXJpdHkgaW4gYSBnbG9iYWwgYmxvY2ssIGxldAorCQkJCSAqIHRoZSBmaXJzdCBsZWFkZXIgdGhhdCBwZXJmb3JtcyBhCisJCQkJICogbGVhZGVyX3Jlc2V0KCkgcmVzZXQgdGhlIGdsb2JhbCBibG9ja3MgaW4KKwkJCQkgKiBvcmRlciB0byBjbGVhciBnbG9iYWwgYXR0ZW50aW9ucy4gT3RoZXJ3aXNlCisJCQkJICogdGhlIHRoZSBnYXRlcyB3aWxsIHJlbWFpbiBjbG9zZWQgZm9yIHRoYXQKKwkJCQkgKiBlbmdpbmUuCisJCQkJICovCisJCQkJaWYgKGxvYWRfY291bnRlciB8fAorCQkJCSAgICAoZ2xvYmFsICYmIG90aGVyX2xvYWRfY291bnRlcikpIHsKIAkJCQkJLyogV2FpdCB1bnRpbCBhbGwgb3RoZXIgZnVuY3Rpb25zIGdldAogCQkJCQkgKiBkb3duLgogCQkJCQkgKi8KLQkJCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+cmVzZXRfdGFzaywKKwkJCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+c3BfcnRubF90YXNrLAogCQkJCQkJCQlIWi8xMCk7CiAJCQkJCXJldHVybjsKIAkJCQl9IGVsc2UgewpAQCAtNzUzMywzNyArODM0MCwyNyBAQAogCQkJCQkgKiBub3JtYWwuIEluIGFueSBjYXNlIGl0J3MgYW4gZXhpdAogCQkJCQkgKiBwb2ludCBmb3IgYSBsZWFkZXIuCiAJCQkJCSAqLwotCQkJCQlpZiAoYm54MnhfbGVhZGVyX3Jlc2V0KGJwKSB8fAotCQkJCQlibngyeF9uaWNfbG9hZChicCwgTE9BRF9OT1JNQUwpKSB7Ci0JCQkJCQlwcmludGsoS0VSTl9FUlIiJXM6IFJlY292ZXJ5ICIKLQkJCQkJCSJoYXMgZmFpbGVkLiBQb3dlciBjeWNsZSBpcyAiCi0JCQkJCQkibmVlZGVkLlxuIiwgYnAtPmRldi0+bmFtZSk7Ci0JCQkJCQkvKiBEaXNjb25uZWN0IHRoaXMgZGV2aWNlICovCi0JCQkJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGJwLT5kZXYpOwotCQkJCQkJLyogQmxvY2sgaWZ1cCBmb3IgYWxsIGZ1bmN0aW9uCi0JCQkJCQkgKiBvZiB0aGlzIEFTSUMgdW50aWwKLQkJCQkJCSAqICJwcm9jZXNzIGtpbGwiIG9yIHBvd2VyCi0JCQkJCQkgKiBjeWNsZS4KLQkJCQkJCSAqLwotCQkJCQkJYm54Mnhfc2V0X3Jlc2V0X2luX3Byb2dyZXNzKGJwKTsKLQkJCQkJCS8qIFNodXQgZG93biB0aGUgcG93ZXIgKi8KLQkJCQkJCWJueDJ4X3NldF9wb3dlcl9zdGF0ZShicCwKLQkJCQkJCQkJUENJX0QzaG90KTsKKwkJCQkJaWYgKGJueDJ4X2xlYWRlcl9yZXNldChicCkpIHsKKwkJCQkJCWJueDJ4X3JlY292ZXJ5X2ZhaWxlZChicCk7CiAJCQkJCQlyZXR1cm47CiAJCQkJCX0KIAotCQkJCQlyZXR1cm47CisJCQkJCS8qIElmIHdlIGFyZSBoZXJlLCBtZWFucyB0aGF0IHRoZQorCQkJCQkgKiBsZWFkZXIgaGFzIHN1Y2NlZWRlZCBhbmQgZG9lc24ndAorCQkJCQkgKiB3YW50IHRvIGJlIGEgbGVhZGVyIGFueSBtb3JlLiBUcnkKKwkJCQkJICogdG8gY29udGludWUgYXMgYSBub25lLWxlYWRlci4KKwkJCQkJICovCisJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0gZWxzZSB7IC8qIG5vbi1sZWFkZXIgKi8KLQkJCQlpZiAoIWJueDJ4X3Jlc2V0X2lzX2RvbmUoYnApKSB7CisJCQkJaWYgKCFibngyeF9yZXNldF9pc19kb25lKGJwLCBCUF9QQVRIKGJwKSkpIHsKIAkJCQkJLyogVHJ5IHRvIGdldCBhIExFQURFUl9MT0NLIEhXIGxvY2sgYXMKIAkJCQkJICogbG9uZyBhcyBhIGZvcm1lciBsZWFkZXIgbWF5IGhhdmUKIAkJCQkJICogYmVlbiB1bmxvYWRlZCBieSB0aGUgdXNlciBvcgogCQkJCQkgKiByZWxlYXNlZCBhIGxlYWRlcnNoaXAgYnkgYW5vdGhlcgogCQkJCQkgKiByZWFzb24uCiAJCQkJCSAqLwotCQkJCQlpZiAoYm54MnhfdHJ5bG9ja19od19sb2NrKGJwLAotCQkJCQkgICAgSFdfTE9DS19SRVNPVVJDRV9SRVNFUlZFRF8wOCkpIHsKKwkJCQkJaWYgKGJueDJ4X3RyeWxvY2tfbGVhZGVyX2xvY2soYnApKSB7CiAJCQkJCQkvKiBJJ20gYSBsZWFkZXIgbm93ISBSZXN0YXJ0IGEKIAkJCQkJCSAqIHN3aXRjaCBjYXNlLgogCQkJCQkJICovCkBAIC03NTcxLDE4ICs4MzY4LDMwIEBACiAJCQkJCQlicmVhazsKIAkJCQkJfQogCi0JCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYnAtPnJlc2V0X3Rhc2ssCisJCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYnAtPnNwX3J0bmxfdGFzaywKIAkJCQkJCQkJSFovMTApOwogCQkJCQlyZXR1cm47CiAKLQkJCQl9IGVsc2UgeyAvKiBBIGxlYWRlciBoYXMgY29tcGxldGVkCi0JCQkJCSAgKiB0aGUgInByb2Nlc3Mga2lsbCIuIEl0J3MgYW4gZXhpdAotCQkJCQkgICogcG9pbnQgZm9yIGEgbm9uLWxlYWRlci4KLQkJCQkJICAqLwotCQkJCQlibngyeF9uaWNfbG9hZChicCwgTE9BRF9OT1JNQUwpOwotCQkJCQlicC0+cmVjb3Zlcnlfc3RhdGUgPQotCQkJCQkJQk5YMlhfUkVDT1ZFUllfRE9ORTsKLQkJCQkJc21wX3dtYigpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIElmIHRoZXJlIHdhcyBhIGdsb2JhbCBhdHRlbnRpb24sIHdhaXQKKwkJCQkJICogZm9yIGl0IHRvIGJlIGNsZWFyZWQuCisJCQkJCSAqLworCQkJCQlpZiAoYm54MnhfcmVzZXRfaXNfZ2xvYmFsKGJwKSkgeworCQkJCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKAorCQkJCQkJCSZicC0+c3BfcnRubF90YXNrLAorCQkJCQkJCUhaLzEwKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCisJCQkJCWlmIChibngyeF9uaWNfbG9hZChicCwgTE9BRF9OT1JNQUwpKQorCQkJCQkJYm54MnhfcmVjb3ZlcnlfZmFpbGVkKGJwKTsKKwkJCQkJZWxzZSB7CisJCQkJCQlicC0+cmVjb3Zlcnlfc3RhdGUgPQorCQkJCQkJCUJOWDJYX1JFQ09WRVJZX0RPTkU7CisJCQkJCQlzbXBfbWIoKTsKKwkJCQkJfQorCiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9CkBAIC03NTk1LDM1ICs4NDA0LDkyIEBACiAvKiBibngyeF9uaWNfdW5sb2FkKCkgZmx1c2hlcyB0aGUgYm54Mnhfd3EsIHRodXMgcmVzZXQgdGFzayBpcwogICogc2NoZWR1bGVkIG9uIGEgZ2VuZXJhbCBxdWV1ZSBpbiBvcmRlciB0byBwcmV2ZW50IGEgZGVhZCBsb2NrLgogICovCi1zdGF0aWMgdm9pZCBibngyeF9yZXNldF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGJueDJ4X3NwX3J0bmxfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGJueDJ4ICpicCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYm54MngsIHJlc2V0X3Rhc2sud29yayk7Ci0KLSNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCi0JQk5YMlhfRVJSKCJyZXNldCB0YXNrIGNhbGxlZCBidXQgU1RPUF9PTl9FUlJPUiBkZWZpbmVkIgotCQkgICIgc28gcmVzZXQgbm90IGRvbmUgdG8gYWxsb3cgZGVidWcgZHVtcCxcbiIKLQkgS0VSTl9FUlIgIiB5b3Ugd2lsbCBuZWVkIHRvIHJlYm9vdCB3aGVuIGRvbmVcbiIpOwotCXJldHVybjsKLSNlbmRpZgorCXN0cnVjdCBibngyeCAqYnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJueDJ4LCBzcF9ydG5sX3Rhc2sud29yayk7CiAKIAlydG5sX2xvY2soKTsKIAogCWlmICghbmV0aWZfcnVubmluZyhicC0+ZGV2KSkKLQkJZ290byByZXNldF90YXNrX2V4aXQ7CisJCWdvdG8gc3BfcnRubF9leGl0OwogCi0JaWYgKHVubGlrZWx5KGJwLT5yZWNvdmVyeV9zdGF0ZSAhPSBCTlgyWF9SRUNPVkVSWV9ET05FKSkKKwkvKiBpZiBzdG9wIG9uIGVycm9yIGlzIGRlZmluZWQgbm8gcmVjb3ZlcnkgZmxvd3Mgc2hvdWxkIGJlIGV4ZWN1dGVkICovCisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCUJOWDJYX0VSUigicmVjb3ZlcnkgZmxvdyBjYWxsZWQgYnV0IFNUT1BfT05fRVJST1IgZGVmaW5lZCAiCisJCSAgInNvIHJlc2V0IG5vdCBkb25lIHRvIGFsbG93IGRlYnVnIGR1bXAsXG4iCisJCSAgInlvdSB3aWxsIG5lZWQgdG8gcmVib290IHdoZW4gZG9uZVxuIik7CisJZ290byBzcF9ydG5sX25vdF9yZXNldDsKKyNlbmRpZgorCisJaWYgKHVubGlrZWx5KGJwLT5yZWNvdmVyeV9zdGF0ZSAhPSBCTlgyWF9SRUNPVkVSWV9ET05FKSkgeworCQkvKgorCQkgKiBDbGVhciBhbGwgcGVuZGluZyBTUCBjb21tYW5kcyBhcyB3ZSBhcmUgZ29pbmcgdG8gcmVzZXQgdGhlCisJCSAqIGZ1bmN0aW9uIGFueXdheS4KKwkJICovCisJCWJwLT5zcF9ydG5sX3N0YXRlID0gMDsKKwkJc21wX21iKCk7CisKIAkJYm54MnhfcGFyaXR5X3JlY292ZXIoYnApOwotCWVsc2UgewotCQlibngyeF9uaWNfdW5sb2FkKGJwLCBVTkxPQURfTk9STUFMKTsKLQkJYm54MnhfbmljX2xvYWQoYnAsIExPQURfTk9STUFMKTsKKworCQlnb3RvIHNwX3J0bmxfZXhpdDsKIAl9CiAKLXJlc2V0X3Rhc2tfZXhpdDoKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJYX1NQX1JUTkxfVFhfVElNRU9VVCwgJmJwLT5zcF9ydG5sX3N0YXRlKSkgeworCQkvKgorCQkgKiBDbGVhciBhbGwgcGVuZGluZyBTUCBjb21tYW5kcyBhcyB3ZSBhcmUgZ29pbmcgdG8gcmVzZXQgdGhlCisJCSAqIGZ1bmN0aW9uIGFueXdheS4KKwkJICovCisJCWJwLT5zcF9ydG5sX3N0YXRlID0gMDsKKwkJc21wX21iKCk7CisKKwkJYm54MnhfbmljX3VubG9hZChicCwgVU5MT0FEX05PUk1BTCk7CisJCWJueDJ4X25pY19sb2FkKGJwLCBMT0FEX05PUk1BTCk7CisKKwkJZ290byBzcF9ydG5sX2V4aXQ7CisJfQorI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKK3NwX3J0bmxfbm90X3Jlc2V0OgorI2VuZGlmCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyWF9TUF9SVE5MX1NFVFVQX1RDLCAmYnAtPnNwX3J0bmxfc3RhdGUpKQorCQlibngyeF9zZXR1cF90YyhicC0+ZGV2LCBicC0+ZGNieF9wb3J0X3BhcmFtcy5ldHMubnVtX29mX2Nvcyk7CisKK3NwX3J0bmxfZXhpdDoKIAlydG5sX3VubG9jaygpOwogfQogCiAvKiBlbmQgb2YgbmljIGxvYWQvdW5sb2FkICovCiAKK3N0YXRpYyB2b2lkIGJueDJ4X3BlcmlvZF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBibngyeCwgcGVyaW9kX3Rhc2sud29yayk7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCisJCWdvdG8gcGVyaW9kX3Rhc2tfZXhpdDsKKworCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkgeworCQlCTlgyWF9FUlIoInBlcmlvZCB0YXNrIGNhbGxlZCBvbiBlbXVsYXRpb24sIGlnbm9yaW5nXG4iKTsKKwkJZ290byBwZXJpb2RfdGFza19leGl0OworCX0KKworCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOworCS8qCisJICogVGhlIGJhcnJpZXIgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGUgb3JkZXJpbmcgYmV0d2VlbiB0aGUgd3JpdGluZyB0bworCSAqIHRoZSBicC0+cG9ydC5wbWYgaW4gdGhlIGJueDJ4X25pY19sb2FkKCkgb3IgYm54MnhfcG1mX3VwZGF0ZSgpIGFuZAorCSAqIHRoZSByZWFkaW5nIGhlcmUuCisJICovCisJc21wX21iKCk7CisJaWYgKGJwLT5wb3J0LnBtZikgeworCQlibngyeF9wZXJpb2RfZnVuYygmYnAtPmxpbmtfcGFyYW1zLCAmYnAtPmxpbmtfdmFycyk7CisKKwkJLyogUmUtcXVldWUgdGFzayBpbiAxIHNlYyAqLworCQlxdWV1ZV9kZWxheWVkX3dvcmsoYm54Mnhfd3EsICZicC0+cGVyaW9kX3Rhc2ssIDEqSFopOworCX0KKworCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOworcGVyaW9kX3Rhc2tfZXhpdDoKKwlyZXR1cm47Cit9CisKIC8qCiAgKiBJbml0IHNlcnZpY2UgZnVuY3Rpb25zCiAgKi8KQEAgLTc2ODEsOCArODU0Nyw4IEBACiAJCQl1MzIgcmVzZXRfY29kZSA9IERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dPTF9ESVM7CiAJCQkvKiBzYXZlIG91ciBwZl9udW0gKi8KIAkJCWludCBvcmlnX3BmX251bSA9IGJwLT5wZl9udW07Ci0JCQl1MzIgc3dhcF9lbjsKLQkJCXUzMiBzd2FwX3ZhbDsKKwkJCWludCBwb3J0OworCQkJdTMyIHN3YXBfZW4sIHN3YXBfdmFsLCB2YWx1ZTsKIAogCQkJLyogY2xlYXIgdGhlIFVOREkgaW5kaWNhdGlvbiAqLwogCQkJUkVHX1dSKGJwLCBET1JRX1JFR19OT1JNX0NJRF9PRlNULCAwKTsKQEAgLTc3MTcsMjEgKzg1ODMsMTkgQEAKIAkJCWJueDJ4X3JlbGVhc2VfaHdfbG9jayhicCwgSFdfTE9DS19SRVNPVVJDRV9VTkRJKTsKIAogCQkJYm54MnhfdW5kaV9pbnRfZGlzYWJsZShicCk7CisJCQlwb3J0ID0gQlBfUE9SVChicCk7CiAKIAkJCS8qIGNsb3NlIGlucHV0IHRyYWZmaWMgYW5kIHdhaXQgZm9yIGl0ICovCiAJCQkvKiBEbyBub3QgcmN2IHBhY2tldHMgdG8gQlJCICovCi0JCQlSRUdfV1IoYnAsCi0JCQkgICAgICAoQlBfUE9SVChicCkgPyBOSUdfUkVHX0xMSDFfQlJCMV9EUlZfTUFTSyA6Ci0JCQkJCSAgICAgTklHX1JFR19MTEgwX0JSQjFfRFJWX01BU0spLCAweDApOworCQkJUkVHX1dSKGJwLCAocG9ydCA/IE5JR19SRUdfTExIMV9CUkIxX0RSVl9NQVNLIDoKKwkJCQkJICAgTklHX1JFR19MTEgwX0JSQjFfRFJWX01BU0spLCAweDApOwogCQkJLyogRG8gbm90IGRpcmVjdCByY3YgcGFja2V0cyB0aGF0IGFyZSBub3QgZm9yIE1DUCB0bwogCQkJICogdGhlIEJSQiAqLwotCQkJUkVHX1dSKGJwLAotCQkJICAgICAgIChCUF9QT1JUKGJwKSA/IE5JR19SRUdfTExIMV9CUkIxX05PVF9NQ1AgOgotCQkJCQkgICAgICBOSUdfUkVHX0xMSDBfQlJCMV9OT1RfTUNQKSwgMHgwKTsKKwkJCVJFR19XUihicCwgKHBvcnQgPyBOSUdfUkVHX0xMSDFfQlJCMV9OT1RfTUNQIDoKKwkJCQkJICAgTklHX1JFR19MTEgwX0JSQjFfTk9UX01DUCksIDB4MCk7CiAJCQkvKiBjbGVhciBBRVUgKi8KLQkJCVJFR19XUihicCwKLQkJCSAgICAgKEJQX1BPUlQoYnApID8gTUlTQ19SRUdfQUVVX01BU0tfQVRUTl9GVU5DXzEgOgotCQkJCQkgICAgTUlTQ19SRUdfQUVVX01BU0tfQVRUTl9GVU5DXzApLCAwKTsKKwkJCVJFR19XUihicCwgKHBvcnQgPyBNSVNDX1JFR19BRVVfTUFTS19BVFROX0ZVTkNfMSA6CisJCQkJCSAgIE1JU0NfUkVHX0FFVV9NQVNLX0FUVE5fRlVOQ18wKSwgMCk7CiAJCQltc2xlZXAoMTApOwogCiAJCQkvKiBzYXZlIE5JRyBwb3J0IHN3YXAgaW5mbyAqLwpAQCAtNzc0MSw5ICs4NjA1LDE3IEBACiAJCQlSRUdfV1IoYnAsCiAJCQkgICAgICAgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfQ0xFQVIsCiAJCQkgICAgICAgMHhkM2ZmZmZmZik7CisKKwkJCXZhbHVlID0gMHgxNDAwOworCQkJaWYgKENISVBfSVNfRTMoYnApKSB7CisJCQkJdmFsdWUgfD0gTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfTVNUQVQwOworCQkJCXZhbHVlIHw9IE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX01TVEFUMTsKKwkJCX0KKwogCQkJUkVHX1dSKGJwLAogCQkJICAgICAgIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSLAotCQkJICAgICAgIDB4MTQwMyk7CisJCQkgICAgICAgdmFsdWUpOworCiAJCQkvKiB0YWtlIHRoZSBOSUcgb3V0IG9mIHJlc2V0IGFuZCByZXN0b3JlIHN3YXAgdmFsdWVzICovCiAJCQlSRUdfV1IoYnAsCiAJCQkgICAgICAgR1JDQkFTRV9NSVNDICsgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfU0VULApAQCAtNzc4NCw3ICs4NjU2LDcgQEAKIAkvKiBTZXQgZG9vcmJlbGwgc2l6ZSAqLwogCWJwLT5kYl9zaXplID0gKDEgPDwgQk5YMlhfREJfU0hJRlQpOwogCi0JaWYgKENISVBfSVNfRTIoYnApKSB7CisJaWYgKCFDSElQX0lTX0UxeChicCkpIHsKIAkJdmFsID0gUkVHX1JEKGJwLCBNSVNDX1JFR19QT1JUNE1PREVfRU5fT1ZXUik7CiAJCWlmICgodmFsICYgMSkgPT0gMCkKIAkJCXZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfUE9SVDRNT0RFX0VOKTsKQEAgLTc4MDQsMTYgKzg2NzYsNiBAQAogCQlicC0+cGZpZCA9IGJwLT5wZl9udW07CQkJLyogMC4uNyAqLwogCX0KIAotCS8qCi0JICogc2V0IGJhc2UgRlcgbm9uLWRlZmF1bHQgKGZhc3QgcGF0aCkgc3RhdHVzIGJsb2NrIGlkLCB0aGlzIHZhbHVlIGlzCi0JICogdXNlZCB0byBpbml0aWFsaXplIHRoZSBmd19zYl9pZCBzYXZlZCBvbiB0aGUgZnAvcXVldWUgc3RydWN0dXJlIHRvCi0JICogZGV0ZXJtaW5lIHRoZSBpZCB1c2VkIGJ5IHRoZSBGVy4KLQkgKi8KLQlpZiAoQ0hJUF9JU19FMXgoYnApKQotCQlicC0+YmFzZV9md19uZHNiID0gQlBfUE9SVChicCkgKiBGUF9TQl9NQVhfRTF4OwotCWVsc2UgLyogRTIgKi8KLQkJYnAtPmJhc2VfZndfbmRzYiA9IEJQX1BPUlQoYnApICogRlBfU0JfTUFYX0UyOwotCiAJYnAtPmxpbmtfcGFyYW1zLmNoaXBfaWQgPSBicC0+Y29tbW9uLmNoaXBfaWQ7CiAJQk5YMlhfREVWX0lORk8oImNoaXAgSUQgaXMgMHgleFxuIiwgaWQpOwogCkBAIC03ODI1LDEzICs4Njg3LDE1IEBACiAJfQogCiAJdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfTlZNX0NGRzQpOwotCWJwLT5jb21tb24uZmxhc2hfc2l6ZSA9IChOVlJBTV8xTUJfU0laRSA8PAorCWJwLT5jb21tb24uZmxhc2hfc2l6ZSA9IChCTlgyWF9OVlJBTV8xTUJfU0laRSA8PAogCQkJCSAodmFsICYgTUNQUl9OVk1fQ0ZHNF9GTEFTSF9TSVpFKSk7CiAJQk5YMlhfREVWX0lORk8oImZsYXNoX3NpemUgMHgleCAoJWQpXG4iLAogCQkgICAgICAgYnAtPmNvbW1vbi5mbGFzaF9zaXplLCBicC0+Y29tbW9uLmZsYXNoX3NpemUpOwogCiAJYm54MnhfaW5pdF9zaG1lbShicCk7CiAKKworCiAJYnAtPmNvbW1vbi5zaG1lbTJfYmFzZSA9IFJFR19SRChicCwgKEJQX1BBVEgoYnApID8KIAkJCQkJTUlTQ19SRUdfR0VORVJJQ19DUl8xIDoKIAkJCQkJTUlTQ19SRUdfR0VORVJJQ19DUl8wKSk7CkBAIC03ODgwLDYgKzg3NDQsMTAgQEAKIAkJKHZhbCA+PSBSRVFfQkNfVkVSXzRfVlJGWV9TUEVDSUZJQ19QSFlfT1BUX01ETCkgPwogCQlGRUFUVVJFX0NPTkZJR19CQ19TVVBQT1JUU19EVUFMX1BIWV9PUFRfTURMX1ZSRlkgOiAwOwogCisJYnAtPmxpbmtfcGFyYW1zLmZlYXR1cmVfY29uZmlnX2ZsYWdzIHw9CisJCSh2YWwgPj0gUkVRX0JDX1ZFUl80X1NGUF9UWF9ESVNBQkxFX1NVUFBPUlRFRCkgPworCQlGRUFUVVJFX0NPTkZJR19CQ19TVVBQT1JUU19TRlBfVFhfRElTQUJMRUQgOiAwOworCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnAtPnBkZXYsIGJwLT5wbV9jYXAgKyBQQ0lfUE1fUE1DLCAmcG1jKTsKIAlicC0+ZmxhZ3MgfD0gKHBtYyAmIFBDSV9QTV9DQVBfUE1FX0QzY29sZCkgPyAwIDogTk9fV09MX0ZMQUc7CiAKQEAgLTc5MDQsMTQgKzg3NzIsMTEgQEAKIAlpbnQgdm4gPSBCUF9FMUhWTihicCk7CiAJaW50IGlndV9zYl9pZDsKIAl1MzIgdmFsOwotCXU4IGZpZDsKKwl1OCBmaWQsIGlndV9zYl9jbnQgPSAwOwogCiAJYnAtPmlndV9iYXNlX3NiID0gMHhmZjsKLQlicC0+aWd1X3NiX2NudCA9IDA7CiAJaWYgKENISVBfSU5UX01PREVfSVNfQkMoYnApKSB7Ci0JCWJwLT5pZ3Vfc2JfY250ID0gbWluX3QodTgsIEZQX1NCX01BWF9FMXgsCi0JCQkJICAgICAgIE5VTV9JR1VfU0JfUkVRVUlSRUQoYnAtPmwyX2NpZF9jb3VudCkpOwotCisJCWlndV9zYl9jbnQgPSBicC0+aWd1X3NiX2NudDsKIAkJYnAtPmlndV9iYXNlX3NiID0gKENISVBfTU9ERV9JU180X1BPUlQoYnApID8gcGZpZCA6IHZuKSAqCiAJCQlGUF9TQl9NQVhfRTF4OwogCkBAIC03OTM3LDEzICs4ODAyLDIxIEBACiAJCQllbHNlIHsKIAkJCQlpZiAoYnAtPmlndV9iYXNlX3NiID09IDB4ZmYpCiAJCQkJCWJwLT5pZ3VfYmFzZV9zYiA9IGlndV9zYl9pZDsKLQkJCQlicC0+aWd1X3NiX2NudCsrOworCQkJCWlndV9zYl9jbnQrKzsKIAkJCX0KIAkJfQogCX0KLQlicC0+aWd1X3NiX2NudCA9IG1pbl90KHU4LCBicC0+aWd1X3NiX2NudCwKLQkJCQkgICBOVU1fSUdVX1NCX1JFUVVJUkVEKGJwLT5sMl9jaWRfY291bnQpKTsKLQlpZiAoYnAtPmlndV9zYl9jbnQgPT0gMCkKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJLyoKKwkgKiBJdCdzIGV4cGVjdGVkIHRoYXQgbnVtYmVyIG9mIENBTSBlbnRyaWVzIGZvciB0aGlzIGZ1bmN0aW9ucyBpcyBlcXVhbAorCSAqIHRvIHRoZSBudW1iZXIgZXZhbHVhdGVkIGJhc2VkIG9uIHRoZSBNU0ktWCB0YWJsZSBzaXplLiBXZSB3YW50IGEKKwkgKiBoYXJzaCB3YXJuaW5nIGlmIHRoZXNlIHZhbHVlcyBhcmUgZGlmZmVyZW50IQorCSAqLworCVdBUk5fT04oYnAtPmlndV9zYl9jbnQgIT0gaWd1X3NiX2NudCk7CisjZW5kaWYKKworCWlmIChpZ3Vfc2JfY250ID09IDApCiAJCUJOWDJYX0VSUigiQ0FNIGNvbmZpZ3VyYXRpb24gZXJyb3JcbiIpOwogfQogCkBAIC03OTkxLDI0ICs4ODY0LDI1IEBACiAJCQlyZXR1cm47CiAJfQogCi0Jc3dpdGNoIChzd2l0Y2hfY2ZnKSB7Ci0JY2FzZSBTV0lUQ0hfQ0ZHXzFHOgotCQlicC0+cG9ydC5waHlfYWRkciA9IFJFR19SRChicCwgTklHX1JFR19TRVJERVMwX0NUUkxfUEhZX0FERFIgKwotCQkJCQkgICBwb3J0KjB4MTApOwotCQlCTlgyWF9ERVZfSU5GTygicGh5X2FkZHIgMHgleFxuIiwgYnAtPnBvcnQucGh5X2FkZHIpOwotCQlicmVhazsKLQotCWNhc2UgU1dJVENIX0NGR18xMEc6Ci0JCWJwLT5wb3J0LnBoeV9hZGRyID0gUkVHX1JEKGJwLCBOSUdfUkVHX1hHWFMwX0NUUkxfUEhZX0FERFIgKwotCQkJCQkgICBwb3J0KjB4MTgpOwotCQlCTlgyWF9ERVZfSU5GTygicGh5X2FkZHIgMHgleFxuIiwgYnAtPnBvcnQucGh5X2FkZHIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUJOWDJYX0VSUigiQkFEIHN3aXRjaF9jZmcgbGlua19jb25maWcgMHgleFxuIiwKLQkJCSAgYnAtPnBvcnQubGlua19jb25maWdbMF0pOwotCQlyZXR1cm47CisJaWYgKENISVBfSVNfRTMoYnApKQorCQlicC0+cG9ydC5waHlfYWRkciA9IFJFR19SRChicCwgTUlTQ19SRUdfV0MwX0NUUkxfUEhZX0FERFIpOworCWVsc2UgeworCQlzd2l0Y2ggKHN3aXRjaF9jZmcpIHsKKwkJY2FzZSBTV0lUQ0hfQ0ZHXzFHOgorCQkJYnAtPnBvcnQucGh5X2FkZHIgPSBSRUdfUkQoCisJCQkJYnAsIE5JR19SRUdfU0VSREVTMF9DVFJMX1BIWV9BRERSICsgcG9ydCoweDEwKTsKKwkJCWJyZWFrOworCQljYXNlIFNXSVRDSF9DRkdfMTBHOgorCQkJYnAtPnBvcnQucGh5X2FkZHIgPSBSRUdfUkQoCisJCQkJYnAsIE5JR19SRUdfWEdYUzBfQ1RSTF9QSFlfQUREUiArIHBvcnQqMHgxOCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJOWDJYX0VSUigiQkFEIHN3aXRjaF9jZmcgbGlua19jb25maWcgMHgleFxuIiwKKwkJCQkgIGJwLT5wb3J0LmxpbmtfY29uZmlnWzBdKTsKKwkJCXJldHVybjsKKwkJfQogCX0KKwlCTlgyWF9ERVZfSU5GTygicGh5X2FkZHIgMHgleFxuIiwgYnAtPnBvcnQucGh5X2FkZHIpOwogCS8qIG1hc2sgd2hhdCB3ZSBzdXBwb3J0IGFjY29yZGluZyB0byBzcGVlZF9jYXBfbWFzayBwZXIgY29uZmlndXJhdGlvbiAqLwogCWZvciAoaWR4ID0gMDsgaWR4IDwgY2ZnX3NpemU7IGlkeCsrKSB7CiAJCWlmICghKGJwLT5saW5rX3BhcmFtcy5zcGVlZF9jYXBfbWFza1tpZHhdICYKQEAgLTgwODksNyArODk2Myw3IEBACiAJCQkJCShBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CiAJCQkJCSBBRFZFUlRJU0VEX1RQKTsKIAkJCX0gZWxzZSB7Ci0JCQkJQk5YMlhfRVJST1IoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgorCQkJCUJOWDJYX0VSUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCiAJCQkJCSAgICAiSW52YWxpZCBsaW5rX2NvbmZpZyAweCV4IgogCQkJCQkgICAgIiAgc3BlZWRfY2FwX21hc2sgMHgleFxuIiwKIAkJCQkJICAgIGxpbmtfY29uZmlnLApAQCAtODEwOCw3ICs4OTgyLDcgQEAKIAkJCQkJKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwKIAkJCQkJIEFEVkVSVElTRURfVFApOwogCQkJfSBlbHNlIHsKLQkJCQlCTlgyWF9FUlJPUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJCQkJQk5YMlhfRVJSKCJOVlJBTSBjb25maWcgZXJyb3IuICIKIAkJCQkJICAgICJJbnZhbGlkIGxpbmtfY29uZmlnIDB4JXgiCiAJCQkJCSAgICAiICBzcGVlZF9jYXBfbWFzayAweCV4XG4iLAogCQkJCQkgICAgbGlua19jb25maWcsCkBAIC04MTI2LDcgKzkwMDAsNyBAQAogCQkJCQkoQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKIAkJCQkJIEFEVkVSVElTRURfVFApOwogCQkJfSBlbHNlIHsKLQkJCQlCTlgyWF9FUlJPUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJCQkJQk5YMlhfRVJSKCJOVlJBTSBjb25maWcgZXJyb3IuICIKIAkJCQkJICAgICJJbnZhbGlkIGxpbmtfY29uZmlnIDB4JXgiCiAJCQkJCSAgICAiICBzcGVlZF9jYXBfbWFzayAweCV4XG4iLAogCQkJCQkgICAgbGlua19jb25maWcsCkBAIC04MTQ2LDcgKzkwMjAsNyBAQAogCQkJCQkoQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwKIAkJCQkJIEFEVkVSVElTRURfVFApOwogCQkJfSBlbHNlIHsKLQkJCQlCTlgyWF9FUlJPUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJCQkJQk5YMlhfRVJSKCJOVlJBTSBjb25maWcgZXJyb3IuICIKIAkJCQkgICAgIkludmFsaWQgbGlua19jb25maWcgMHgleCIKIAkJCQkgICAgIiAgc3BlZWRfY2FwX21hc2sgMHgleFxuIiwKIAkJCQkgICAgbGlua19jb25maWcsCkBAIC04MTY0LDcgKzkwMzgsNyBAQAogCQkJCQkoQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CiAJCQkJCSBBRFZFUlRJU0VEX1RQKTsKIAkJCX0gZWxzZSB7Ci0JCQkJQk5YMlhfRVJST1IoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgorCQkJCUJOWDJYX0VSUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCiAJCQkJICAgICJJbnZhbGlkIGxpbmtfY29uZmlnIDB4JXgiCiAJCQkJICAgICIgIHNwZWVkX2NhcF9tYXNrIDB4JXhcbiIsCiAJCQkJICAgIGxpbmtfY29uZmlnLApAQCAtODE4Miw3ICs5MDU2LDcgQEAKIAkJCQkJKEFEVkVSVElTRURfMjUwMGJhc2VYX0Z1bGwgfAogCQkJCQkJQURWRVJUSVNFRF9UUCk7CiAJCQl9IGVsc2UgewotCQkJCUJOWDJYX0VSUk9SKCJOVlJBTSBjb25maWcgZXJyb3IuICIKKwkJCQlCTlgyWF9FUlIoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgogCQkJCSAgICAiSW52YWxpZCBsaW5rX2NvbmZpZyAweCV4IgogCQkJCSAgICAiICBzcGVlZF9jYXBfbWFzayAweCV4XG4iLAogCQkJCSAgICBsaW5rX2NvbmZpZywKQEAgLTgxOTIsOCArOTA2Niw2IEBACiAJCQlicmVhazsKIAogCQljYXNlIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzEwR19DWDQ6Ci0JCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMTBHX0tYNDoKLQkJY2FzZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xMEdfS1I6CiAJCQlpZiAoYnAtPnBvcnQuc3VwcG9ydGVkW2lkeF0gJgogCQkJICAgIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwpIHsKIAkJCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWRbaWR4XSA9CkBAIC04MjAyLDcgKzkwNzQsNyBAQAogCQkJCQkoQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwgfAogCQkJCQkJQURWRVJUSVNFRF9GSUJSRSk7CiAJCQl9IGVsc2UgewotCQkJCUJOWDJYX0VSUk9SKCJOVlJBTSBjb25maWcgZXJyb3IuICIKKwkJCQlCTlgyWF9FUlIoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgogCQkJCSAgICAiSW52YWxpZCBsaW5rX2NvbmZpZyAweCV4IgogCQkJCSAgICAiICBzcGVlZF9jYXBfbWFzayAweCV4XG4iLAogCQkJCSAgICBsaW5rX2NvbmZpZywKQEAgLTgyMTAsMTEgKzkwODIsMTQgQEAKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlicmVhazsKKwkJY2FzZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8yMEc6CisJCQlicC0+bGlua19wYXJhbXMucmVxX2xpbmVfc3BlZWRbaWR4XSA9IFNQRUVEXzIwMDAwOwogCisJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCUJOWDJYX0VSUk9SKCJOVlJBTSBjb25maWcgZXJyb3IuICIKLQkJCQkgICAgIkJBRCBsaW5rIHNwZWVkIGxpbmtfY29uZmlnIDB4JXhcbiIsCi0JCQkJCSAgbGlua19jb25maWcpOworCQkJQk5YMlhfRVJSKCJOVlJBTSBjb25maWcgZXJyb3IuICIKKwkJCQkgICJCQUQgbGluayBzcGVlZCBsaW5rX2NvbmZpZyAweCV4XG4iLAorCQkJCSAgbGlua19jb25maWcpOwogCQkJCWJwLT5saW5rX3BhcmFtcy5yZXFfbGluZV9zcGVlZFtpZHhdID0KIAkJCQkJCQlTUEVFRF9BVVRPX05FRzsKIAkJCQlicC0+cG9ydC5hZHZlcnRpc2luZ1tpZHhdID0KQEAgLTgzMjUsMTAgKzkyMDAsMTMgQEAKICNpZmRlZiBCQ01fQ05JQwogc3RhdGljIHZvaWQgX19kZXZpbml0IGJueDJ4X2dldF9jbmljX2luZm8oc3RydWN0IGJueDJ4ICpicCkKIHsKKwlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCWludCBmdW5jID0gQlBfQUJTX0ZVTkMoYnApOworCiAJdTMyIG1heF9pc2NzaV9jb25uID0gRldfRU5DT0RFXzMyQklUX1BBVFRFUk4gXiBTSE1FTV9SRChicCwKLQkJCQlkcnZfbGljX2tleVtCUF9QT1JUKGJwKV0ubWF4X2lzY3NpX2Nvbm4pOworCQkJCWRydl9saWNfa2V5W3BvcnRdLm1heF9pc2NzaV9jb25uKTsKIAl1MzIgbWF4X2Zjb2VfY29ubiA9IEZXX0VOQ09ERV8zMkJJVF9QQVRURVJOIF4gU0hNRU1fUkQoYnAsCi0JCQkJZHJ2X2xpY19rZXlbQlBfUE9SVChicCldLm1heF9mY29lX2Nvbm4pOworCQkJCWRydl9saWNfa2V5W3BvcnRdLm1heF9mY29lX2Nvbm4pOwogCiAJLyogR2V0IHRoZSBudW1iZXIgb2YgbWF4aW11bSBhbGxvd2VkIGlTQ1NJIGFuZCBGQ29FIGNvbm5lY3Rpb25zICovCiAJYnAtPmNuaWNfZXRoX2Rldi5tYXhfaXNjc2lfY29ubiA9CkBAIC04MzM5LDExICs5MjE3LDU5IEBACiAJCShtYXhfZmNvZV9jb25uICYgQk5YMlhfTUFYX0ZDT0VfSU5JVF9DT05OX01BU0spID4+CiAJCUJOWDJYX01BWF9GQ09FX0lOSVRfQ09OTl9TSElGVDsKIAorCS8qIFJlYWQgdGhlIFdXTjogKi8KKwlpZiAoIUlTX01GKGJwKSkgeworCQkvKiBQb3J0IGluZm8gKi8KKwkJYnAtPmNuaWNfZXRoX2Rldi5mY29lX3d3bl9wb3J0X25hbWVfaGkgPQorCQkJU0hNRU1fUkQoYnAsCisJCQkJZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uCisJCQkJIGZjb2Vfd3duX3BvcnRfbmFtZV91cHBlcik7CisJCWJwLT5jbmljX2V0aF9kZXYuZmNvZV93d25fcG9ydF9uYW1lX2xvID0KKwkJCVNITUVNX1JEKGJwLAorCQkJCWRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLgorCQkJCSBmY29lX3d3bl9wb3J0X25hbWVfbG93ZXIpOworCisJCS8qIE5vZGUgaW5mbyAqLworCQlicC0+Y25pY19ldGhfZGV2LmZjb2Vfd3duX25vZGVfbmFtZV9oaSA9CisJCQlTSE1FTV9SRChicCwKKwkJCQlkZXZfaW5mby5wb3J0X2h3X2NvbmZpZ1twb3J0XS4KKwkJCQkgZmNvZV93d25fbm9kZV9uYW1lX3VwcGVyKTsKKwkJYnAtPmNuaWNfZXRoX2Rldi5mY29lX3d3bl9ub2RlX25hbWVfbG8gPQorCQkJU0hNRU1fUkQoYnAsCisJCQkJZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uCisJCQkJIGZjb2Vfd3duX25vZGVfbmFtZV9sb3dlcik7CisJfSBlbHNlIGlmICghSVNfTUZfU0QoYnApKSB7CisJCXUzMiBjZmcgPSBNRl9DRkdfUkQoYnAsIGZ1bmNfZXh0X2NvbmZpZ1tmdW5jXS5mdW5jX2NmZyk7CisKKwkJLyoKKwkJICogUmVhZCB0aGUgV1dOIGluZm8gb25seSBpZiB0aGUgRkNvRSBmZWF0dXJlIGlzIGVuYWJsZWQgZm9yCisJCSAqIHRoaXMgZnVuY3Rpb24uCisJCSAqLworCQlpZiAoY2ZnICYgTUFDUF9GVU5DX0NGR19GTEFHU19GQ09FX09GRkxPQUQpIHsKKwkJCS8qIFBvcnQgaW5mbyAqLworCQkJYnAtPmNuaWNfZXRoX2Rldi5mY29lX3d3bl9wb3J0X25hbWVfaGkgPQorCQkJCU1GX0NGR19SRChicCwgZnVuY19leHRfY29uZmlnW2Z1bmNdLgorCQkJCQkJZmNvZV93d25fcG9ydF9uYW1lX3VwcGVyKTsKKwkJCWJwLT5jbmljX2V0aF9kZXYuZmNvZV93d25fcG9ydF9uYW1lX2xvID0KKwkJCQlNRl9DRkdfUkQoYnAsIGZ1bmNfZXh0X2NvbmZpZ1tmdW5jXS4KKwkJCQkJCWZjb2Vfd3duX3BvcnRfbmFtZV9sb3dlcik7CisKKwkJCS8qIE5vZGUgaW5mbyAqLworCQkJYnAtPmNuaWNfZXRoX2Rldi5mY29lX3d3bl9ub2RlX25hbWVfaGkgPQorCQkJCU1GX0NGR19SRChicCwgZnVuY19leHRfY29uZmlnW2Z1bmNdLgorCQkJCQkJZmNvZV93d25fbm9kZV9uYW1lX3VwcGVyKTsKKwkJCWJwLT5jbmljX2V0aF9kZXYuZmNvZV93d25fbm9kZV9uYW1lX2xvID0KKwkJCQlNRl9DRkdfUkQoYnAsIGZ1bmNfZXh0X2NvbmZpZ1tmdW5jXS4KKwkJCQkJCWZjb2Vfd3duX25vZGVfbmFtZV9sb3dlcik7CisJCX0KKwl9CisKIAlCTlgyWF9ERVZfSU5GTygibWF4X2lzY3NpX2Nvbm4gMHgleCBtYXhfZmNvZV9jb25uIDB4JXhcbiIsCiAJCSAgICAgICBicC0+Y25pY19ldGhfZGV2Lm1heF9pc2NzaV9jb25uLAogCQkgICAgICAgYnAtPmNuaWNfZXRoX2Rldi5tYXhfZmNvZV9jb25uKTsKIAotCS8qIElmIG1hbWltdW0gYWxsb3dlZCBudW1iZXIgb2YgY29ubmVjdGlvbnMgaXMgemVybyAtCisJLyoKKwkgKiBJZiBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGlzIHplcm8gLQogCSAqIGRpc2FibGUgdGhlIGZlYXR1cmUuCiAJICovCiAJaWYgKCFicC0+Y25pY19ldGhfZGV2Lm1heF9pc2NzaV9jb25uKQpAQCAtODM2NCw2ICs5MjkwLDkgQEAKIAl1OCAqZmlwX21hYyA9IGJwLT5maXBfbWFjOwogI2VuZGlmCiAKKwkvKiBaZXJvIHByaW1hcnkgTUFDIGNvbmZpZ3VyYXRpb24gKi8KKwltZW1zZXQoYnAtPmRldi0+ZGV2X2FkZHIsIDAsIEVUSF9BTEVOKTsKKwogCWlmIChCUF9OT01DUChicCkpIHsKIAkJQk5YMlhfRVJST1IoIndhcm5pbmc6IHJhbmRvbSBNQUMgd29ya2Fyb3VuZCBhY3RpdmVcbiIpOwogCQlyYW5kb21fZXRoZXJfYWRkcihicC0+ZGV2LT5kZXZfYWRkcik7CkBAIC04Mzg1LDkgKzkzMTQsMTAgQEAKIAkJCQkJCSAgICAgaXNjc2lfbWFjX2FkZHJfdXBwZXIpOwogCQkJCXZhbCA9IE1GX0NGR19SRChicCwgZnVuY19leHRfY29uZmlnW2Z1bmNdLgogCQkJCQkJICAgIGlzY3NpX21hY19hZGRyX2xvd2VyKTsKLQkJCQlCTlgyWF9ERVZfSU5GTygiUmVhZCBpU0NTSSBNQUM6ICIKLQkJCQkJICAgICAgICIweCV4OjB4JTA0eFxuIiwgdmFsMiwgdmFsKTsKIAkJCQlibngyeF9zZXRfbWFjX2J1Zihpc2NzaV9tYWMsIHZhbCwgdmFsMik7CisJCQkJQk5YMlhfREVWX0lORk8oIlJlYWQgaVNDU0kgTUFDOiAiCisJCQkJCSAgICAgICBCTlgyWF9NQUNfRk1UIlxuIiwKKwkJCQkJICAgICAgIEJOWDJYX01BQ19QUk5fTElTVChpc2NzaV9tYWMpKTsKIAkJCX0gZWxzZQogCQkJCWJwLT5mbGFncyB8PSBOT19JU0NTSV9PT09fRkxBRyB8IE5PX0lTQ1NJX0ZMQUc7CiAKQEAgLTgzOTYsOSArOTMyNiwxMCBAQAogCQkJCQkJICAgICBmY29lX21hY19hZGRyX3VwcGVyKTsKIAkJCQl2YWwgPSBNRl9DRkdfUkQoYnAsIGZ1bmNfZXh0X2NvbmZpZ1tmdW5jXS4KIAkJCQkJCSAgICBmY29lX21hY19hZGRyX2xvd2VyKTsKLQkJCQlCTlgyWF9ERVZfSU5GTygiUmVhZCBGQ29FIE1BQyB0byAiCi0JCQkJCSAgICAgICAiMHgleDoweCUwNHhcbiIsIHZhbDIsIHZhbCk7CiAJCQkJYm54Mnhfc2V0X21hY19idWYoZmlwX21hYywgdmFsLCB2YWwyKTsKKwkJCQlCTlgyWF9ERVZfSU5GTygiUmVhZCBGQ29FIEwyIE1BQyB0byAiCisJCQkJCSAgICAgICBCTlgyWF9NQUNfRk1UIlxuIiwKKwkJCQkJICAgICAgIEJOWDJYX01BQ19QUk5fTElTVChmaXBfbWFjKSk7CiAKIAkJCX0gZWxzZQogCQkJCWJwLT5mbGFncyB8PSBOT19GQ09FX0ZMQUc7CkBAIC04NDE2LDYgKzkzNDcsMTIgQEAKIAkJdmFsID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLgogCQkJCSAgIGlzY3NpX21hY19sb3dlcik7CiAJCWJueDJ4X3NldF9tYWNfYnVmKGlzY3NpX21hYywgdmFsLCB2YWwyKTsKKworCQl2YWwyID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnBvcnRfaHdfY29uZmlnW3BvcnRdLgorCQkJCSAgICBmY29lX2ZpcF9tYWNfdXBwZXIpOworCQl2YWwgPSBTSE1FTV9SRChicCwgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uCisJCQkJICAgZmNvZV9maXBfbWFjX2xvd2VyKTsKKwkJYm54Mnhfc2V0X21hY19idWYoZmlwX21hYywgdmFsLCB2YWwyKTsKICNlbmRpZgogCX0KIApAQCAtODQyMywxMyArOTM2MCw5IEBACiAJbWVtY3B5KGJwLT5kZXYtPnBlcm1fYWRkciwgYnAtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAogI2lmZGVmIEJDTV9DTklDCi0JLyogU2V0IHRoZSBGQ29FIE1BQyBpbiBtb2RlcyBvdGhlciB0aGVuIE1GX1NJICovCi0JaWYgKCFDSElQX0lTX0UxeChicCkpIHsKLQkJaWYgKElTX01GX1NEKGJwKSkKLQkJCW1lbWNweShmaXBfbWFjLCBicC0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCQllbHNlIGlmICghSVNfTUYoYnApKQotCQkJbWVtY3B5KGZpcF9tYWMsIGlzY3NpX21hYywgRVRIX0FMRU4pOwotCX0KKwkvKiBTZXQgdGhlIEZDb0UgTUFDIGluIE1GX1NEIG1vZGUgKi8KKwlpZiAoIUNISVBfSVNfRTF4KGJwKSAmJiBJU19NRl9TRChicCkpCisJCW1lbWNweShmaXBfbWFjLCBicC0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCiAJLyogRGlzYWJsZSBpU0NTSSBpZiBNQUMgY29uZmlndXJhdGlvbiBpcwogCSAqIGludmFsaWQuCkBAIC04NDQ3LDYgKzkzODAsMTMgQEAKIAkJbWVtc2V0KGJwLT5maXBfbWFjLCAwLCBFVEhfQUxFTik7CiAJfQogI2VuZGlmCisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYnAtPmRldi0+ZGV2X2FkZHIpKQorCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LAorCQkJImJhZCBFdGhlcm5ldCBNQUMgYWRkcmVzcyBjb25maWd1cmF0aW9uOiAiCisJCQlCTlgyWF9NQUNfRk1UIiwgY2hhbmdlIGl0IG1hbnVhbGx5IGJlZm9yZSBicmluZ2luZyB1cCAiCisJCQkidGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgaW50ZXJmYWNlXG4iLAorCQkJQk5YMlhfTUFDX1BSTl9MSVNUKGJwLT5kZXYtPmRldl9hZGRyKSk7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGJueDJ4X2dldF9od2luZm8oc3RydWN0IGJueDJ4ICpicCkKQEAgLTg0NTgsMjcgKzkzOTgsNjYgQEAKIAogCWJueDJ4X2dldF9jb21tb25faHdpbmZvKGJwKTsKIAorCS8qCisJICogaW5pdGlhbGl6ZSBJR1UgcGFyYW1ldGVycworCSAqLwogCWlmIChDSElQX0lTX0UxeChicCkpIHsKIAkJYnAtPmNvbW1vbi5pbnRfYmxvY2sgPSBJTlRfQkxPQ0tfSEM7CiAKIAkJYnAtPmlndV9kc2JfaWQgPSBERUZfU0JfSUdVX0lEOwogCQlicC0+aWd1X2Jhc2Vfc2IgPSAwOwotCQlicC0+aWd1X3NiX2NudCA9IG1pbl90KHU4LCBGUF9TQl9NQVhfRTF4LAotCQkJCSAgICAgICBOVU1fSUdVX1NCX1JFUVVJUkVEKGJwLT5sMl9jaWRfY291bnQpKTsKIAl9IGVsc2UgewogCQlicC0+Y29tbW9uLmludF9ibG9jayA9IElOVF9CTE9DS19JR1U7CiAJCXZhbCA9IFJFR19SRChicCwgSUdVX1JFR19CTE9DS19DT05GSUdVUkFUSU9OKTsKKwogCQlpZiAodmFsICYgSUdVX0JMT0NLX0NPTkZJR1VSQVRJT05fUkVHX0JBQ0tXQVJEX0NPTVBfRU4pIHsKLQkJCURQKE5FVElGX01TR19QUk9CRSwgIklHVSBCYWNrd2FyZCBDb21wYXRpYmxlIE1vZGVcbiIpOworCQkJaW50IHRvdXQgPSA1MDAwOworCisJCQlCTlgyWF9ERVZfSU5GTygiRk9SQ0lORyBOb3JtYWwgTW9kZVxuIik7CisKKwkJCXZhbCAmPSB+KElHVV9CTE9DS19DT05GSUdVUkFUSU9OX1JFR19CQUNLV0FSRF9DT01QX0VOKTsKKwkJCVJFR19XUihicCwgSUdVX1JFR19CTE9DS19DT05GSUdVUkFUSU9OLCB2YWwpOworCQkJUkVHX1dSKGJwLCBJR1VfUkVHX1JFU0VUX01FTU9SSUVTLCAweDdmKTsKKworCQkJd2hpbGUgKHRvdXQgJiYgUkVHX1JEKGJwLCBJR1VfUkVHX1JFU0VUX01FTU9SSUVTKSkgeworCQkJCXRvdXQtLTsKKwkJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCk7CisJCQl9CisKKwkJCWlmIChSRUdfUkQoYnAsIElHVV9SRUdfUkVTRVRfTUVNT1JJRVMpKSB7CisJCQkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKKwkJCQkJIkZPUkNJTkcgTm9ybWFsIE1vZGUgZmFpbGVkISEhXG4iKTsKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJfQorCQl9CisKKwkJaWYgKHZhbCAmIElHVV9CTE9DS19DT05GSUdVUkFUSU9OX1JFR19CQUNLV0FSRF9DT01QX0VOKSB7CisJCQlCTlgyWF9ERVZfSU5GTygiSUdVIEJhY2t3YXJkIENvbXBhdGlibGUgTW9kZVxuIik7CiAJCQlicC0+Y29tbW9uLmludF9ibG9jayB8PSBJTlRfQkxPQ0tfTU9ERV9CV19DT01QOwogCQl9IGVsc2UKLQkJCURQKE5FVElGX01TR19QUk9CRSwgIklHVSBOb3JtYWwgTW9kZVxuIik7CisJCQlCTlgyWF9ERVZfSU5GTygiSUdVIE5vcm1hbCBNb2RlXG4iKTsKIAogCQlibngyeF9nZXRfaWd1X2NhbV9pbmZvKGJwKTsKIAogCX0KLQlEUChORVRJRl9NU0dfUFJPQkUsICJpZ3VfZHNiX2lkICVkICBpZ3VfYmFzZV9zYiAlZCAgaWd1X3NiX2NudCAlZFxuIiwKLQkJCSAgICAgYnAtPmlndV9kc2JfaWQsIGJwLT5pZ3VfYmFzZV9zYiwgYnAtPmlndV9zYl9jbnQpOworCisJLyoKKwkgKiBzZXQgYmFzZSBGVyBub24tZGVmYXVsdCAoZmFzdCBwYXRoKSBzdGF0dXMgYmxvY2sgaWQsIHRoaXMgdmFsdWUgaXMKKwkgKiB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGZ3X3NiX2lkIHNhdmVkIG9uIHRoZSBmcC9xdWV1ZSBzdHJ1Y3R1cmUgdG8KKwkgKiBkZXRlcm1pbmUgdGhlIGlkIHVzZWQgYnkgdGhlIEZXLgorCSAqLworCWlmIChDSElQX0lTX0UxeChicCkpCisJCWJwLT5iYXNlX2Z3X25kc2IgPSBCUF9QT1JUKGJwKSAqIEZQX1NCX01BWF9FMXggKyBCUF9MX0lEKGJwKTsKKwllbHNlIC8qCisJICAgICAgKiA1NzcxMiAtIHdlIGN1cnJlbnRseSB1c2Ugb25lIEZXIFNCIHBlciBJR1UgU0IgKFJ4IGFuZCBUeCBvZgorCSAgICAgICogdGhlIHNhbWUgcXVldWUgYXJlIGluZGljYXRlZCBvbiB0aGUgc2FtZSBJR1UgU0IpLiBTbyB3ZSBwcmVmZXIKKwkgICAgICAqIEZXIGFuZCBJR1UgU0JzIHRvIGJlIHRoZSBzYW1lIHZhbHVlLgorCSAgICAgICovCisJCWJwLT5iYXNlX2Z3X25kc2IgPSBicC0+aWd1X2Jhc2Vfc2I7CisKKwlCTlgyWF9ERVZfSU5GTygiaWd1X2RzYl9pZCAlZCAgaWd1X2Jhc2Vfc2IgJWQgIGlndV9zYl9jbnQgJWRcbiIKKwkJICAgICAgICJiYXNlX2Z3X25kc2IgJWRcbiIsIGJwLT5pZ3VfZHNiX2lkLCBicC0+aWd1X2Jhc2Vfc2IsCisJCSAgICAgICBicC0+aWd1X3NiX2NudCwgYnAtPmJhc2VfZndfbmRzYik7CiAKIAkvKgogCSAqIEluaXRpYWxpemUgTUYgY29uZmlndXJhdGlvbgpAQCAtODQ4OSwxMCArOTQ2OCwxMCBAQAogCXZuID0gQlBfRTFIVk4oYnApOwogCiAJaWYgKCFDSElQX0lTX0UxKGJwKSAmJiAhQlBfTk9NQ1AoYnApKSB7Ci0JCURQKE5FVElGX01TR19QUk9CRSwKLQkJCSAgICAic2htZW0yYmFzZSAweCV4LCBzaXplICVkLCBtZmNmZyBvZmZzZXQgJWRcbiIsCi0JCQkgICAgYnAtPmNvbW1vbi5zaG1lbTJfYmFzZSwgU0hNRU0yX1JEKGJwLCBzaXplKSwKLQkJCSAgICAodTMyKW9mZnNldG9mKHN0cnVjdCBzaG1lbTJfcmVnaW9uLCBtZl9jZmdfYWRkcikpOworCQlCTlgyWF9ERVZfSU5GTygic2htZW0yYmFzZSAweCV4LCBzaXplICVkLCBtZmNmZyBvZmZzZXQgJWRcbiIsCisJCQkgICAgICAgYnAtPmNvbW1vbi5zaG1lbTJfYmFzZSwgU0hNRU0yX1JEKGJwLCBzaXplKSwKKwkJCSAgICAgICh1MzIpb2Zmc2V0b2Yoc3RydWN0IHNobWVtMl9yZWdpb24sIG1mX2NmZ19hZGRyKSk7CisKIAkJaWYgKFNITUVNMl9IQVMoYnAsIG1mX2NmZ19hZGRyKSkKIAkJCWJwLT5jb21tb24ubWZfY2ZnX2Jhc2UgPSBTSE1FTTJfUkQoYnAsIG1mX2NmZ19hZGRyKTsKIAkJZWxzZQpAQCAtODUyMyw4ICs5NTAyLDggQEAKIAkJCQkJYnAtPm1mX2NvbmZpZ1t2bl0gPSBNRl9DRkdfUkQoYnAsCiAJCQkJCQkgICBmdW5jX21mX2NvbmZpZ1tmdW5jXS5jb25maWcpOwogCQkJCX0gZWxzZQotCQkJCQlEUChORVRJRl9NU0dfUFJPQkUsICJpbGxlZ2FsIE1BQyAiCi0JCQkJCQkJICAgICJhZGRyZXNzIGZvciBTSVxuIik7CisJCQkJCUJOWDJYX0RFVl9JTkZPKCJpbGxlZ2FsIE1BQyBhZGRyZXNzICIKKwkJCQkJCSAgICAgICAiZm9yIFNJXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgU0hBUkVEX0ZFQVRfQ0ZHX0ZPUkNFX1NGX01PREVfTUZfQUxMT1dFRDoKIAkJCQkvKiBnZXQgT1YgY29uZmlndXJhdGlvbiAqLwpAQCAtODUzNywxNCArOTUxNiwxMiBAQAogCQkJCQlicC0+bWZfY29uZmlnW3ZuXSA9IE1GX0NGR19SRChicCwKIAkJCQkJCWZ1bmNfbWZfY29uZmlnW2Z1bmNdLmNvbmZpZyk7CiAJCQkJfSBlbHNlCi0JCQkJCURQKE5FVElGX01TR19QUk9CRSwgImlsbGVnYWwgT1YgZm9yICIKLQkJCQkJCQkgICAgIlNEXG4iKTsKKwkJCQkJQk5YMlhfREVWX0lORk8oImlsbGVnYWwgT1YgZm9yIFNEXG4iKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJLyogVW5rbm93biBjb25maWd1cmF0aW9uOiByZXNldCBtZl9jb25maWcgKi8KIAkJCQlicC0+bWZfY29uZmlnW3ZuXSA9IDA7Ci0JCQkJRFAoTkVUSUZfTVNHX1BST0JFLCAiVW5rbm93biBNRiBtb2RlIDB4JXhcbiIsCi0JCQkJICAgdmFsKTsKKwkJCQlCTlgyWF9ERVZfSU5GTygidW5rb3duIE1GIG1vZGUgMHgleFxuIiwgdmFsKTsKIAkJCX0KIAkJfQogCkBAIC04NTU3LDEzICs5NTM0LDE2IEBACiAJCQkgICAgICBGVU5DX01GX0NGR19FMUhPVl9UQUdfTUFTSzsKIAkJCWlmICh2YWwgIT0gRlVOQ19NRl9DRkdfRTFIT1ZfVEFHX0RFRkFVTFQpIHsKIAkJCQlicC0+bWZfb3YgPSB2YWw7Ci0JCQkJQk5YMlhfREVWX0lORk8oIk1GIE9WIGZvciBmdW5jICVkIGlzICVkIgotCQkJCQkgICAgICAgIiAoMHglMDR4KVxuIiwgZnVuYywKLQkJCQkJICAgICAgIGJwLT5tZl9vdiwgYnAtPm1mX292KTsKKwkJCQlicC0+cGF0aF9oYXNfb3ZsYW4gPSB0cnVlOworCisJCQkJQk5YMlhfREVWX0lORk8oIk1GIE9WIGZvciBmdW5jICVkIGlzICVkICIKKwkJCQkJICAgICAgICIoMHglMDR4KVxuIiwgZnVuYywgYnAtPm1mX292LAorCQkJCQkgICAgICAgYnAtPm1mX292KTsKIAkJCX0gZWxzZSB7Ci0JCQkJQk5YMlhfRVJSKCJObyB2YWxpZCBNRiBPViBmb3IgZnVuYyAlZCwiCi0JCQkJCSAgIiAgYWJvcnRpbmdcbiIsIGZ1bmMpOwotCQkJCXJjID0gLUVQRVJNOworCQkJCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsCisJCQkJCSJObyB2YWxpZCBNRiBPViBmb3IgZnVuYyAlZCwgIgorCQkJCQkiYWJvcnRpbmdcbiIsIGZ1bmMpOworCQkJCXJldHVybiAtRVBFUk07CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBNVUxUSV9GVU5DVElPTl9TSToKQEAgLTg1NzIsMzEgKzk1NTIsNDAgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJaWYgKHZuKSB7Ci0JCQkJQk5YMlhfRVJSKCJWTiAlZCBpbiBzaW5nbGUgZnVuY3Rpb24gbW9kZSwiCi0JCQkJCSAgIiAgYWJvcnRpbmdcbiIsIHZuKTsKLQkJCQlyYyA9IC1FUEVSTTsKKwkJCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LAorCQkJCQkiVk4gJWQgaXMgaW4gYSBzaW5nbGUgZnVuY3Rpb24gbW9kZSwgIgorCQkJCQkiYWJvcnRpbmdcbiIsIHZuKTsKKwkJCQlyZXR1cm4gLUVQRVJNOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KIAorCQkvKiBjaGVjayBpZiBvdGhlciBwb3J0IG9uIHRoZSBwYXRoIG5lZWRzIG92bGFuOgorCQkgKiBTaW5jZSBNRiBjb25maWd1cmF0aW9uIGlzIHNoYXJlZCBiZXR3ZWVuIHBvcnRzCisJCSAqIFBvc3NpYmxlIG1peGVkIG1vZGVzIGFyZSBvbmx5CisJCSAqIHtTRiwgU0l9IHtTRiwgU0R9IHtTRCwgU0Z9IHtTSSwgU0Z9CisJCSAqLworCQlpZiAoQ0hJUF9NT0RFX0lTXzRfUE9SVChicCkgJiYKKwkJICAgICFicC0+cGF0aF9oYXNfb3ZsYW4gJiYKKwkJICAgICFJU19NRihicCkgJiYKKwkJICAgIGJwLT5jb21tb24ubWZfY2ZnX2Jhc2UgIT0gU0hNRU1fTUZfQ0ZHX0FERFJfTk9ORSkgeworCQkJdTggb3RoZXJfcG9ydCA9ICFCUF9QT1JUKGJwKTsKKwkJCXU4IG90aGVyX2Z1bmMgPSBCUF9QQVRIKGJwKSArIDIqb3RoZXJfcG9ydDsKKwkJCXZhbCA9IE1GX0NGR19SRChicCwKKwkJCQkJZnVuY19tZl9jb25maWdbb3RoZXJfZnVuY10uZTFob3ZfdGFnKTsKKwkJCWlmICh2YWwgIT0gRlVOQ19NRl9DRkdfRTFIT1ZfVEFHX0RFRkFVTFQpCisJCQkJYnAtPnBhdGhfaGFzX292bGFuID0gdHJ1ZTsKKwkJfQogCX0KIAogCS8qIGFkanVzdCBpZ3Vfc2JfY250IHRvIE1GIGZvciBFMXggKi8KIAlpZiAoQ0hJUF9JU19FMXgoYnApICYmIElTX01GKGJwKSkKIAkJYnAtPmlndV9zYl9jbnQgLz0gRTFIVk5fTUFYOwogCi0JLyoKLQkgKiBhZGp1c3QgRTIgc2IgY291bnQ6IHRvIGJlIHJlbW92ZWQgd2hlbiBGVyB3aWxsIHN1cHBvcnQKLQkgKiBtb3JlIHRoZW4gMTYgTDIgY2xpZW50cwotCSAqLwotI2RlZmluZSBNQVhfTDJfQ0xJRU5UUwkJCQkxNgotCWlmIChDSElQX0lTX0UyKGJwKSkKLQkJYnAtPmlndV9zYl9jbnQgPSBtaW5fdCh1OCwgYnAtPmlndV9zYl9jbnQsCi0JCQkJICAgICAgIE1BWF9MMl9DTElFTlRTIC8gKElTX01GKGJwKSA/IDQgOiAxKSk7CisJLyogcG9ydCBpbmZvICovCisJYm54MnhfZ2V0X3BvcnRfaHdpbmZvKGJwKTsKIAogCWlmICghQlBfTk9NQ1AoYnApKSB7Ci0JCWJueDJ4X2dldF9wb3J0X2h3aW5mbyhicCk7Ci0KIAkJYnAtPmZ3X3NlcSA9CiAJCQkoU0hNRU1fUkQoYnAsIGZ1bmNfbWJbQlBfRldfTUJfSURYKGJwKV0uZHJ2X21iX2hlYWRlcikgJgogCQkJIERSVl9NU0dfU0VRX05VTUJFUl9NQVNLKTsKQEAgLTg2MTAsNiArOTU5OSwxNiBAQAogCWJueDJ4X2dldF9jbmljX2luZm8oYnApOwogI2VuZGlmCiAKKwkvKiBHZXQgY3VycmVudCBGVyBwdWxzZSBzZXF1ZW5jZSAqLworCWlmICghQlBfTk9NQ1AoYnApKSB7CisJCWludCBtYl9pZHggPSBCUF9GV19NQl9JRFgoYnApOworCisJCWJwLT5md19kcnZfcHVsc2Vfd3Jfc2VxID0KKwkJCQkoU0hNRU1fUkQoYnAsIGZ1bmNfbWJbbWJfaWR4XS5kcnZfcHVsc2VfbWIpICYKKwkJCQkgRFJWX1BVTFNFX1NFUV9NQVNLKTsKKwkJQk5YMlhfREVWX0lORk8oImRydl9wdWxzZSAweCV4XG4iLCBicC0+ZndfZHJ2X3B1bHNlX3dyX3NlcSk7CisJfQorCiAJcmV0dXJuIHJjOwogfQogCkBAIC04Njc3LDE2ICs5Njc2LDU5IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYm54Mnhfc2V0X21vZGVzX2JpdG1hcChzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiBmbGFncyA9IDA7CisKKwlpZiAoQ0hJUF9SRVZfSVNfRlBHQShicCkpCisJCVNFVF9GTEFHUyhmbGFncywgTU9ERV9GUEdBKTsKKwllbHNlIGlmIChDSElQX1JFVl9JU19FTVVMKGJwKSkKKwkJU0VUX0ZMQUdTKGZsYWdzLCBNT0RFX0VNVUwpOworCWVsc2UKKwkJU0VUX0ZMQUdTKGZsYWdzLCBNT0RFX0FTSUMpOworCisJaWYgKENISVBfTU9ERV9JU180X1BPUlQoYnApKQorCQlTRVRfRkxBR1MoZmxhZ3MsIE1PREVfUE9SVDQpOworCWVsc2UKKwkJU0VUX0ZMQUdTKGZsYWdzLCBNT0RFX1BPUlQyKTsKKworCWlmIChDSElQX0lTX0UyKGJwKSkKKwkJU0VUX0ZMQUdTKGZsYWdzLCBNT0RFX0UyKTsKKwllbHNlIGlmIChDSElQX0lTX0UzKGJwKSkgeworCQlTRVRfRkxBR1MoZmxhZ3MsIE1PREVfRTMpOworCQlpZiAoQ0hJUF9SRVYoYnApID09IENISVBfUkVWX0F4KQorCQkJU0VUX0ZMQUdTKGZsYWdzLCBNT0RFX0UzX0EwKTsKKwkJZWxzZSAvKmlmIChDSElQX1JFVihicCkgPT0gQ0hJUF9SRVZfQngpKi8KKwkJCVNFVF9GTEFHUyhmbGFncywgTU9ERV9FM19CMCB8IE1PREVfQ09TMyk7CisJfQorCisJaWYgKElTX01GKGJwKSkgeworCQlTRVRfRkxBR1MoZmxhZ3MsIE1PREVfTUYpOworCQlzd2l0Y2ggKGJwLT5tZl9tb2RlKSB7CisJCWNhc2UgTVVMVElfRlVOQ1RJT05fU0Q6CisJCQlTRVRfRkxBR1MoZmxhZ3MsIE1PREVfTUZfU0QpOworCQkJYnJlYWs7CisJCWNhc2UgTVVMVElfRlVOQ1RJT05fU0k6CisJCQlTRVRfRkxBR1MoZmxhZ3MsIE1PREVfTUZfU0kpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UKKwkJU0VUX0ZMQUdTKGZsYWdzLCBNT0RFX1NGKTsKKworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCVNFVF9GTEFHUyhmbGFncywgTU9ERV9MSVRUTEVfRU5ESUFOKTsKKyNlbHNlIC8qKF9fQklHX0VORElBTikqLworCVNFVF9GTEFHUyhmbGFncywgTU9ERV9CSUdfRU5ESUFOKTsKKyNlbmRpZgorCUlOSVRfTU9ERV9GTEFHUyhicCkgPSBmbGFnczsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgYm54MnhfaW5pdF9icChzdHJ1Y3QgYm54MnggKmJwKQogewogCWludCBmdW5jOwogCWludCB0aW1lcl9pbnRlcnZhbDsKIAlpbnQgcmM7CiAKLQkvKiBEaXNhYmxlIGludGVycnVwdCBoYW5kbGluZyB1bnRpbCBIVyBpcyBpbml0aWFsaXplZCAqLwotCWF0b21pY19zZXQoJmJwLT5pbnRyX3NlbSwgMSk7Ci0Jc21wX3dtYigpOyAvKiBFbnN1cmUgdGhhdCBicC0+aW50cl9zZW0gdXBkYXRlIGlzIFNNUC1zYWZlICovCi0KIAltdXRleF9pbml0KCZicC0+cG9ydC5waHlfbXV0ZXgpOwogCW11dGV4X2luaXQoJmJwLT5md19tYl9tdXRleCk7CiAJc3Bpbl9sb2NrX2luaXQoJmJwLT5zdGF0c19sb2NrKTsKQEAgLTg2OTUsMTIgKzk3MzcsMTcgQEAKICNlbmRpZgogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmJwLT5zcF90YXNrLCBibngyeF9zcF90YXNrKTsKLQlJTklUX0RFTEFZRURfV09SSygmYnAtPnJlc2V0X3Rhc2ssIGJueDJ4X3Jlc2V0X3Rhc2spOwotCisJSU5JVF9ERUxBWUVEX1dPUksoJmJwLT5zcF9ydG5sX3Rhc2ssIGJueDJ4X3NwX3J0bmxfdGFzayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmJwLT5wZXJpb2RfdGFzaywgYm54MnhfcGVyaW9kX3Rhc2spOwogCXJjID0gYm54MnhfZ2V0X2h3aW5mbyhicCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKLQlpZiAoIXJjKQotCQlyYyA9IGJueDJ4X2FsbG9jX21lbV9icChicCk7CisJYm54Mnhfc2V0X21vZGVzX2JpdG1hcChicCk7CisKKwlyYyA9IGJueDJ4X2FsbG9jX21lbV9icChicCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlibngyeF9yZWFkX2Z3aW5mbyhicCk7CiAKQEAgLTg3MTgsNyArOTc2NSw2IEBACiAJCQkJCSJtdXN0IGxvYWQgZGV2aWNlcyBpbiBvcmRlciFcbiIpOwogCiAJYnAtPm11bHRpX21vZGUgPSBtdWx0aV9tb2RlOwotCWJwLT5pbnRfbW9kZSA9IGludF9tb2RlOwogCiAJLyogU2V0IFRQQSBmbGFncyAqLwogCWlmIChkaXNhYmxlX3RwYSkgewpAQCAtODc1NCw2ICs5ODAwLDIxIEBACiAJYm54MnhfZGNieF9zZXRfc3RhdGUoYnAsIHRydWUsIEJOWDJYX0RDQlhfRU5BQkxFRF9PTl9ORUdfT04pOwogCWJueDJ4X2RjYnhfaW5pdF9wYXJhbXMoYnApOwogCisjaWZkZWYgQkNNX0NOSUMKKwlpZiAoQ0hJUF9JU19FMXgoYnApKQorCQlicC0+Y25pY19iYXNlX2NsX2lkID0gRlBfU0JfTUFYX0UxeDsKKwllbHNlCisJCWJwLT5jbmljX2Jhc2VfY2xfaWQgPSBGUF9TQl9NQVhfRTI7CisjZW5kaWYKKworCS8qIG11bHRpcGxlIHR4IHByaW9yaXR5ICovCisJaWYgKENISVBfSVNfRTF4KGJwKSkKKwkJYnAtPm1heF9jb3MgPSBCTlgyWF9NVUxUSV9UWF9DT1NfRTFYOworCWlmIChDSElQX0lTX0UyKGJwKSB8fCBDSElQX0lTX0UzQTAoYnApKQorCQlicC0+bWF4X2NvcyA9IEJOWDJYX01VTFRJX1RYX0NPU19FMl9FM0EwOworCWlmIChDSElQX0lTX0UzQjAoYnApKQorCQlicC0+bWF4X2NvcyA9IEJOWDJYX01VTFRJX1RYX0NPU19FM0IwOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC04NzYyLDQ5ICs5ODIzLDcwIEBACiAqIEdlbmVyYWwgc2VydmljZSBmdW5jdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qCisgKiBuZXRfZGV2aWNlIHNlcnZpY2UgZnVuY3Rpb25zCisgKi8KKwogLyogY2FsbGVkIHdpdGggcnRubF9sb2NrICovCiBzdGF0aWMgaW50IGJueDJ4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlib29sIGdsb2JhbCA9IGZhbHNlOworCWludCBvdGhlcl9lbmdpbmUgPSBCUF9QQVRIKGJwKSA/IDAgOiAxOworCXUzMiBvdGhlcl9sb2FkX2NvdW50ZXIsIGxvYWRfY291bnRlcjsKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAKIAlibngyeF9zZXRfcG93ZXJfc3RhdGUoYnAsIFBDSV9EMCk7CiAKLQlpZiAoIWJueDJ4X3Jlc2V0X2lzX2RvbmUoYnApKSB7Ci0JCWRvIHsKLQkJCS8qIFJlc2V0IE1DUCBtYWlsIGJveCBzZXF1ZW5jZSBpZiB0aGVyZSBpcyBvbiBnb2luZwotCQkJICogcmVjb3ZlcnkKLQkJCSAqLwotCQkJYnAtPmZ3X3NlcSA9IDA7CisJb3RoZXJfbG9hZF9jb3VudGVyID0gYm54MnhfZ2V0X2xvYWRfY250KGJwLCBvdGhlcl9lbmdpbmUpOworCWxvYWRfY291bnRlciA9IGJueDJ4X2dldF9sb2FkX2NudChicCwgQlBfUEFUSChicCkpOwogCi0JCQkvKiBJZiBpdCdzIHRoZSBmaXJzdCBmdW5jdGlvbiB0byBsb2FkIGFuZCByZXNldCBkb25lCi0JCQkgKiBpcyBzdGlsbCBub3QgY2xlYXJlZCBpdCBtYXkgbWVhbiB0aGF0LiBXZSBkb24ndAotCQkJICogY2hlY2sgdGhlIGF0dGVudGlvbiBzdGF0ZSBoZXJlIGJlY2F1c2UgaXQgbWF5IGhhdmUKLQkJCSAqIGFscmVhZHkgYmVlbiBjbGVhcmVkIGJ5IGEgImNvbW1vbiIgcmVzZXQgYnV0IHdlCi0JCQkgKiBzaGVsbCBwcm9jZWVkIHdpdGggInByb2Nlc3Mga2lsbCIgYW55d2F5LgorCS8qCisJICogSWYgcGFyaXR5IGhhZCBoYXBwZW4gZHVyaW5nIHRoZSB1bmxvYWQsIHRoZW4gYXR0ZW50aW9ucworCSAqIGFuZC9vciBSRUNPVkVSWV9JTl9QUk9HUkVTIG1heSBzdGlsbCBiZSBzZXQuIEluIHRoaXMgY2FzZSB3ZQorCSAqIHdhbnQgdGhlIGZpcnN0IGZ1bmN0aW9uIGxvYWRlZCBvbiB0aGUgY3VycmVudCBlbmdpbmUgdG8KKwkgKiBjb21wbGV0ZSB0aGUgcmVjb3ZlcnkuCisJICovCisJaWYgKCFibngyeF9yZXNldF9pc19kb25lKGJwLCBCUF9QQVRIKGJwKSkgfHwKKwkgICAgYm54MnhfY2hrX3Bhcml0eV9hdHRuKGJwLCAmZ2xvYmFsLCB0cnVlKSkKKwkJZG8geworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGFyZSBhdHRlbnRpb25zIGFuZCB0aGV5IGFyZSBpbiBhIGdsb2JhbAorCQkJICogYmxvY2tzLCBzZXQgdGhlIEdMT0JBTF9SRVNFVCBiaXQgcmVnYXJkbGVzcyB3aGV0aGVyCisJCQkgKiBpdCB3aWxsIGJlIHRoaXMgZnVuY3Rpb24gdGhhdCB3aWxsIGNvbXBsZXRlIHRoZQorCQkJICogcmVjb3Zlcnkgb3Igbm90LgogCQkJICovCi0JCQlpZiAoKGJueDJ4X2dldF9sb2FkX2NudChicCkgPT0gMCkgJiYKLQkJCQlibngyeF90cnlsb2NrX2h3X2xvY2soYnAsCi0JCQkJSFdfTE9DS19SRVNPVVJDRV9SRVNFUlZFRF8wOCkgJiYKLQkJCQkoIWJueDJ4X2xlYWRlcl9yZXNldChicCkpKSB7Ci0JCQkJRFAoTkVUSUZfTVNHX0hXLCAiUmVjb3ZlcmVkIGluIG9wZW5cbiIpOworCQkJaWYgKGdsb2JhbCkKKwkJCQlibngyeF9zZXRfcmVzZXRfZ2xvYmFsKGJwKTsKKworCQkJLyoKKwkJCSAqIE9ubHkgdGhlIGZpcnN0IGZ1bmN0aW9uIG9uIHRoZSBjdXJyZW50IGVuZ2luZSBzaG91bGQKKwkJCSAqIHRyeSB0byByZWNvdmVyIGluIG9wZW4uIEluIGNhc2Ugb2YgYXR0ZW50aW9ucyBpbgorCQkJICogZ2xvYmFsIGJsb2NrcyBvbmx5IHRoZSBmaXJzdCBpbiB0aGUgY2hpcCBzaG91bGQgdHJ5CisJCQkgKiB0byByZWNvdmVyLgorCQkJICovCisJCQlpZiAoKCFsb2FkX2NvdW50ZXIgJiYKKwkJCSAgICAgKCFnbG9iYWwgfHwgIW90aGVyX2xvYWRfY291bnRlcikpICYmCisJCQkgICAgYm54MnhfdHJ5bG9ja19sZWFkZXJfbG9jayhicCkgJiYKKwkJCSAgICAhYm54MnhfbGVhZGVyX3Jlc2V0KGJwKSkgeworCQkJCW5ldGRldl9pbmZvKGJwLT5kZXYsICJSZWNvdmVyZWQgaW4gb3BlblxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAKKwkJCS8qIHJlY292ZXJ5IGhhcyBmYWlsZWQuLi4gKi8KIAkJCWJueDJ4X3NldF9wb3dlcl9zdGF0ZShicCwgUENJX0QzaG90KTsKKwkJCWJwLT5yZWNvdmVyeV9zdGF0ZSA9IEJOWDJYX1JFQ09WRVJZX0ZBSUxFRDsKIAotCQkJcHJpbnRrKEtFUk5fRVJSIiVzOiBSZWNvdmVyeSBmbG93IGhhc24ndCBiZWVuIHByb3Blcmx5IgorCQkJbmV0ZGV2X2VycihicC0+ZGV2LCAiUmVjb3ZlcnkgZmxvdyBoYXNuJ3QgYmVlbiBwcm9wZXJseSIKIAkJCSIgY29tcGxldGVkIHlldC4gVHJ5IGFnYWluIGxhdGVyLiBJZiB1IHN0aWxsIHNlZSB0aGlzIgogCQkJIiBtZXNzYWdlIGFmdGVyIGEgZmV3IHJldHJpZXMgdGhlbiBwb3dlciBjeWNsZSBpcyIKLQkJCSIgcmVxdWlyZWQuXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCSIgcmVxdWlyZWQuXG4iKTsKIAogCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0gd2hpbGUgKDApOwotCX0KIAogCWJwLT5yZWNvdmVyeV9zdGF0ZSA9IEJOWDJYX1JFQ09WRVJZX0RPTkU7Ci0KIAlyZXR1cm4gYm54MnhfbmljX2xvYWQoYnAsIExPQURfT1BFTik7CiB9CiAKQEAgLTg4MTUsMTk4ICs5ODk3LDEyNiBAQAogCiAJLyogVW5sb2FkIHRoZSBkcml2ZXIsIHJlbGVhc2UgSVJRcyAqLwogCWJueDJ4X25pY191bmxvYWQoYnAsIFVOTE9BRF9DTE9TRSk7CisKKwkvKiBQb3dlciBvZmYgKi8KIAlibngyeF9zZXRfcG93ZXJfc3RhdGUoYnAsIFBDSV9EM2hvdCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBFMV9NQVhfVUNfTElTVAkyOQotI2RlZmluZSBFMUhfTUFYX1VDX0xJU1QJMzAKLSNkZWZpbmUgRTJfTUFYX1VDX0xJU1QJMTQKLXN0YXRpYyBpbmxpbmUgdTggYm54MnhfbWF4X3VjX2xpc3Qoc3RydWN0IGJueDJ4ICpicCkKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2luaXRfbWNhc3RfbWFjc19saXN0KHN0cnVjdCBibngyeCAqYnAsCisJCQkJCSBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCkKIHsKLQlpZiAoQ0hJUF9JU19FMShicCkpCi0JCXJldHVybiBFMV9NQVhfVUNfTElTVDsKLQllbHNlIGlmIChDSElQX0lTX0UxSChicCkpCi0JCXJldHVybiBFMUhfTUFYX1VDX0xJU1Q7Ci0JZWxzZQotCQlyZXR1cm4gRTJfTUFYX1VDX0xJU1Q7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1OCBibngyeF91Y19saXN0X2NhbV9vZmZzZXQoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpZiAoQ0hJUF9JU19FMShicCkpCi0JCS8qIENBTSBFbnRyaWVzIGZvciBQb3J0MDoKLQkJICogICAgICAwIC0gcHJpbSBFVEggTUFDCi0JCSAqICAgICAgMSAtIEJDQVNUIE1BQwotCQkgKiAgICAgIDIgLSBpU0NTSSBMMiByaW5nIEVUSCBNQUMKLQkJICogICAgICAzLTMxIC0gVUMgTUFDcwotCQkgKgotCQkgKiBQb3J0MSBlbnRyaWVzIGFyZSBhbGxvY2F0ZWQgdGhlIHNhbWUgd2F5IHN0YXJ0aW5nIGZyb20KLQkJICogZW50cnkgMzIuCi0JCSAqLwotCQlyZXR1cm4gMyArIDMyICogQlBfUE9SVChicCk7Ci0JZWxzZSBpZiAoQ0hJUF9JU19FMUgoYnApKSB7Ci0JCS8qIENBTSBFbnRyaWVzOgotCQkgKiAgICAgIDAtNyAgLSBwcmltIEVUSCBNQUMgZm9yIGVhY2ggZnVuY3Rpb24KLQkJICogICAgICA4LTE1IC0gaVNDU0kgTDIgcmluZyBFVEggTUFDIGZvciBlYWNoIGZ1bmN0aW9uCi0JCSAqICAgICAgMTYgdGlsbCAyNTUgVUMgTUFDIGxpc3RzIGZvciBlYWNoIGZ1bmN0aW9uCi0JCSAqCi0JCSAqIFJlbWFyazogVGhlcmUgaXMgbm8gRkNvRSBzdXBwb3J0IGZvciBFMUgsIHRodXMgRkNvRSByZWxhdGVkCi0JCSAqICAgICAgICAgTUFDcyBhcmUgbm90IGNvbnNpZGVyZWQuCi0JCSAqLwotCQlyZXR1cm4gRTFIX0ZVTkNfTUFYICogKENBTV9JU0NTSV9FVEhfTElORSArIDEpICsKLQkJCWJueDJ4X21heF91Y19saXN0KGJwKSAqIEJQX0ZVTkMoYnApOwotCX0gZWxzZSB7Ci0JCS8qIENBTSBFbnRyaWVzICh0aGVyZSBpcyBhIHNlcGFyYXRlIENBTSBwZXIgZW5naW5lKToKLQkJICogICAgICAwLTQgIC0gcHJpbSBFVEggTUFDIGZvciBlYWNoIGZ1bmN0aW9uCi0JCSAqICAgICAgNC03IC0gaVNDU0kgTDIgcmluZyBFVEggTUFDIGZvciBlYWNoIGZ1bmN0aW9uCi0JCSAqICAgICAgOC0xMSAtIEZJUCB1Y2FzdCBMMiBNQUMgZm9yIGVhY2ggZnVuY3Rpb24KLQkJICogICAgICAxMi0xNSAtIEFMTF9FTk9ERV9NQUNTIG1jYXN0IE1BQyBmb3IgZWFjaCBmdW5jdGlvbgotCQkgKiAgICAgIDE2IHRpbGwgNzEgVUMgTUFDIGxpc3RzIGZvciBlYWNoIGZ1bmN0aW9uCi0JCSAqLwotCQl1OCBmdW5jX2lkeCA9Ci0JCQkoQ0hJUF9NT0RFX0lTXzRfUE9SVChicCkgPyBCUF9GVU5DKGJwKSA6IEJQX1ZOKGJwKSk7Ci0KLQkJcmV0dXJuIEUyX0ZVTkNfTUFYICogKENBTV9NQVhfUEZfTElORSArIDEpICsKLQkJCWJueDJ4X21heF91Y19saXN0KGJwKSAqIGZ1bmNfaWR4OwotCX0KLX0KLQotLyogc2V0IHVjIGxpc3QsIGRvIG5vdCB3YWl0IGFzIHdhaXQgaW1wbGllcyBzbGVlcCBhbmQKLSAqIHNldF9yeF9tb2RlIGNhbiBiZSBpbnZva2VkIGZyb20gbm9uLXNsZWVwYWJsZSBjb250ZXh0LgotICoKLSAqIEluc3RlYWQgd2UgdXNlIHRoZSBzYW1lIHJhbXJvZCBkYXRhIGJ1ZmZlciBlYWNoIHRpbWUgd2UgbmVlZAotICogdG8gY29uZmlndXJlIGEgbGlzdCBvZiBhZGRyZXNzZXMsIGFuZCB1c2UgdGhlIGZhY3QgdGhhdCB0aGUKLSAqIGxpc3Qgb2YgTUFDcyBpcyBjaGFuZ2VkIGluIGFuIGluY3JlbWVudGFsIHdheSBhbmQgdGhhdCB0aGUKLSAqIGZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciB0aGUgbmV0aWZfYWRkcl9sb2NrLiBBIHRlbXBvcmFyeQotICogaW5jb25zaXN0ZW50IENBTSBjb25maWd1cmF0aW9uIChwb3NzaWJsZSBpbiBjYXNlIG9mIHZlcnkgZmFzdAotICogc2VxdWVuY2Ugb2YgYWRkL2RlbC9hZGQgb24gdGhlIGhvc3Qgc2lkZSkgd2lsbCBzaG9ydGx5IGJlCi0gKiByZXN0b3JlZCBieSB0aGUgaGFuZGxlciBvZiB0aGUgbGFzdCByYW1yb2QuCi0gKi8KLXN0YXRpYyBpbnQgYm54Mnhfc2V0X3VjX2xpc3Qoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgaSA9IDAsIG9sZDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnAtPmRldjsKLQl1OCBvZmZzZXQgPSBibngyeF91Y19saXN0X2NhbV9vZmZzZXQoYnApOworCWludCBtY19jb3VudCA9IG5ldGRldl9tY19jb3VudChicC0+ZGV2KTsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtICptY19tYWMgPQorCQlremFsbG9jKHNpemVvZigqbWNfbWFjKSAqIG1jX2NvdW50LCBHRlBfQVRPTUlDKTsKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKmNvbmZpZ19jbWQgPSBibngyeF9zcChicCwgdWNfbWFjX2NvbmZpZyk7Ci0JZG1hX2FkZHJfdCBjb25maWdfY21kX21hcCA9IGJueDJ4X3NwX21hcHBpbmcoYnAsIHVjX21hY19jb25maWcpOwogCi0JaWYgKG5ldGRldl91Y19jb3VudChkZXYpID4gYm54MnhfbWF4X3VjX2xpc3QoYnApKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIW1jX21hYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX0xJU1RfSEVBRCgmcC0+bWNhc3RfbGlzdCk7CisKKwluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgYnAtPmRldikgeworCQltY19tYWMtPm1hYyA9IGJueDJ4X21jX2FkZHIoaGEpOworCQlsaXN0X2FkZF90YWlsKCZtY19tYWMtPmxpbmssICZwLT5tY2FzdF9saXN0KTsKKwkJbWNfbWFjKys7CisJfQorCisJcC0+bWNhc3RfbGlzdF9sZW4gPSBtY19jb3VudDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfZnJlZV9tY2FzdF9tYWNzX2xpc3QoCisJc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnApCit7CisJc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSAqbWNfbWFjID0KKwkJbGlzdF9maXJzdF9lbnRyeSgmcC0+bWNhc3RfbGlzdCwgc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSwKKwkJCQkgbGluayk7CisKKwlXQVJOX09OKCFtY19tYWMpOworCWtmcmVlKG1jX21hYyk7Cit9CisKKy8qKgorICogYm54Mnhfc2V0X3VjX2xpc3QgLSBjb25maWd1cmUgYSBuZXcgdW5pY2FzdCBNQUNzIGxpc3QuCisgKgorICogQGJwOiBkcml2ZXIgaGFuZGxlCisgKgorICogV2Ugd2lsbCB1c2UgemVybyAoMCkgYXMgYSBNQUMgdHlwZSBmb3IgdGhlc2UgTUFDcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYm54Mnhfc2V0X3VjX2xpc3Qoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJwLT5kZXY7CisJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICptYWNfb2JqID0gJmJwLT5mcC0+bWFjX29iajsKKwl1bnNpZ25lZCBsb25nIHJhbXJvZF9mbGFncyA9IDA7CisKKwkvKiBGaXJzdCBzY2hlZHVsZSBhIGNsZWFudXAgdXAgb2Ygb2xkIGNvbmZpZ3VyYXRpb24gKi8KKwlyYyA9IGJueDJ4X2RlbF9hbGxfbWFjcyhicCwgbWFjX29iaiwgQk5YMlhfVUNfTElTVF9NQUMsIGZhbHNlKTsKKwlpZiAocmMgPCAwKSB7CisJCUJOWDJYX0VSUigiRmFpbGVkIHRvIHNjaGVkdWxlIERFTEVURSBvcGVyYXRpb25zOiAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQogCiAJbmV0ZGV2X2Zvcl9lYWNoX3VjX2FkZHIoaGEsIGRldikgewotCQkvKiBjb3B5IG1hYyAqLwotCQljb25maWdfY21kLT5jb25maWdfdGFibGVbaV0ubXNiX21hY19hZGRyID0KLQkJCXN3YWIxNigqKHUxNiAqKSZibngyeF91Y19hZGRyKGhhKVswXSk7Ci0JCWNvbmZpZ19jbWQtPmNvbmZpZ190YWJsZVtpXS5taWRkbGVfbWFjX2FkZHIgPQotCQkJc3dhYjE2KCoodTE2ICopJmJueDJ4X3VjX2FkZHIoaGEpWzJdKTsKLQkJY29uZmlnX2NtZC0+Y29uZmlnX3RhYmxlW2ldLmxzYl9tYWNfYWRkciA9Ci0JCQlzd2FiMTYoKih1MTYgKikmYm54MnhfdWNfYWRkcihoYSlbNF0pOwotCi0JCWNvbmZpZ19jbWQtPmNvbmZpZ190YWJsZVtpXS52bGFuX2lkID0gMDsKLQkJY29uZmlnX2NtZC0+Y29uZmlnX3RhYmxlW2ldLnBmX2lkID0gQlBfRlVOQyhicCk7Ci0JCWNvbmZpZ19jbWQtPmNvbmZpZ190YWJsZVtpXS5jbGllbnRzX2JpdF92ZWN0b3IgPQotCQkJY3B1X3RvX2xlMzIoMSA8PCBCUF9MX0lEKGJwKSk7Ci0KLQkJU0VUX0ZMQUcoY29uZmlnX2NtZC0+Y29uZmlnX3RhYmxlW2ldLmZsYWdzLAotCQkJTUFDX0NPTkZJR1VSQVRJT05fRU5UUllfQUNUSU9OX1RZUEUsCi0JCQlUX0VUSF9NQUNfQ09NTUFORF9TRVQpOwotCi0JCURQKE5FVElGX01TR19JRlVQLAotCQkgICAic2V0dGluZyBVQ0FTVFslZF0gKCUwNHg6JTA0eDolMDR4KVxuIiwgaSwKLQkJICAgY29uZmlnX2NtZC0+Y29uZmlnX3RhYmxlW2ldLm1zYl9tYWNfYWRkciwKLQkJICAgY29uZmlnX2NtZC0+Y29uZmlnX3RhYmxlW2ldLm1pZGRsZV9tYWNfYWRkciwKLQkJICAgY29uZmlnX2NtZC0+Y29uZmlnX3RhYmxlW2ldLmxzYl9tYWNfYWRkcik7Ci0KLQkJaSsrOwotCi0JCS8qIFNldCB1YyBNQUMgaW4gTklHICovCi0JCWJueDJ4X3NldF9tYWNfaW5fbmlnKGJwLCAxLCBibngyeF91Y19hZGRyKGhhKSwKLQkJCQkgICAgIExMSF9DQU1fRVRIX0xJTkUgKyBpKTsKLQl9Ci0Jb2xkID0gY29uZmlnX2NtZC0+aGRyLmxlbmd0aDsKLQlpZiAob2xkID4gaSkgewotCQlmb3IgKDsgaSA8IG9sZDsgaSsrKSB7Ci0JCQlpZiAoQ0FNX0lTX0lOVkFMSUQoY29uZmlnX2NtZC0+Ci0JCQkJCSAgIGNvbmZpZ190YWJsZVtpXSkpIHsKLQkJCQkvKiBhbHJlYWR5IGludmFsaWRhdGVkICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBpbnZhbGlkYXRlICovCi0JCQlTRVRfRkxBRyhjb25maWdfY21kLT5jb25maWdfdGFibGVbaV0uZmxhZ3MsCi0JCQkJTUFDX0NPTkZJR1VSQVRJT05fRU5UUllfQUNUSU9OX1RZUEUsCi0JCQkJVF9FVEhfTUFDX0NPTU1BTkRfSU5WQUxJREFURSk7CisJCXJjID0gYm54Mnhfc2V0X21hY19vbmUoYnAsIGJueDJ4X3VjX2FkZHIoaGEpLCBtYWNfb2JqLCB0cnVlLAorCQkJCSAgICAgICBCTlgyWF9VQ19MSVNUX01BQywgJnJhbXJvZF9mbGFncyk7CisJCWlmIChyYyA8IDApIHsKKwkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIHNjaGVkdWxlIEFERCBvcGVyYXRpb25zOiAlZFxuIiwKKwkJCQkgIHJjKTsKKwkJCXJldHVybiByYzsKIAkJfQogCX0KIAotCXdtYigpOwotCi0JY29uZmlnX2NtZC0+aGRyLmxlbmd0aCA9IGk7Ci0JY29uZmlnX2NtZC0+aGRyLm9mZnNldCA9IG9mZnNldDsKLQljb25maWdfY21kLT5oZHIuY2xpZW50X2lkID0gMHhmZjsKLQkvKiBNYXJrIHRoYXQgdGhpcyByYW1yb2QgZG9lc24ndCB1c2UgYnAtPnNldF9tYWNfcGVuZGluZyBmb3IKLQkgKiBzeW5jaHJvbml6YXRpb24uCi0JICovCi0JY29uZmlnX2NtZC0+aGRyLmVjaG8gPSAwOwotCi0JbWIoKTsKLQotCXJldHVybiBibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0NPTU1PTl9TRVRfTUFDLCAwLAotCQkgICBVNjRfSEkoY29uZmlnX2NtZF9tYXApLCBVNjRfTE8oY29uZmlnX2NtZF9tYXApLCAxKTsKLQotfQotCi12b2lkIGJueDJ4X2ludmFsaWRhdGVfdWNfbGlzdChzdHJ1Y3QgYm54MnggKmJwKQotewotCWludCBpOwotCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKmNvbmZpZ19jbWQgPSBibngyeF9zcChicCwgdWNfbWFjX2NvbmZpZyk7Ci0JZG1hX2FkZHJfdCBjb25maWdfY21kX21hcCA9IGJueDJ4X3NwX21hcHBpbmcoYnAsIHVjX21hY19jb25maWcpOwotCWludCByYW1yb2RfZmxhZ3MgPSBXQUlUX1JBTVJPRF9DT01NT047Ci0JdTggb2Zmc2V0ID0gYm54MnhfdWNfbGlzdF9jYW1fb2Zmc2V0KGJwKTsKLQl1OCBtYXhfbGlzdF9zaXplID0gYm54MnhfbWF4X3VjX2xpc3QoYnApOwotCi0JZm9yIChpID0gMDsgaSA8IG1heF9saXN0X3NpemU7IGkrKykgewotCQlTRVRfRkxBRyhjb25maWdfY21kLT5jb25maWdfdGFibGVbaV0uZmxhZ3MsCi0JCQlNQUNfQ09ORklHVVJBVElPTl9FTlRSWV9BQ1RJT05fVFlQRSwKLQkJCVRfRVRIX01BQ19DT01NQU5EX0lOVkFMSURBVEUpOwotCQlibngyeF9zZXRfbWFjX2luX25pZyhicCwgMCwgTlVMTCwgTExIX0NBTV9FVEhfTElORSArIDEgKyBpKTsKLQl9Ci0KLQl3bWIoKTsKLQotCWNvbmZpZ19jbWQtPmhkci5sZW5ndGggPSBtYXhfbGlzdF9zaXplOwotCWNvbmZpZ19jbWQtPmhkci5vZmZzZXQgPSBvZmZzZXQ7Ci0JY29uZmlnX2NtZC0+aGRyLmNsaWVudF9pZCA9IDB4ZmY7Ci0JLyogV2UnbGwgd2FpdCBmb3IgYSBjb21wbGV0aW9uIHRoaXMgdGltZS4uLiAqLwotCWNvbmZpZ19jbWQtPmhkci5lY2hvID0gMTsKLQotCWJwLT5zZXRfbWFjX3BlbmRpbmcgPSAxOwotCi0JbWIoKTsKLQotCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfQ09NTU9OX1NFVF9NQUMsIDAsCi0JCSAgICAgIFU2NF9ISShjb25maWdfY21kX21hcCksIFU2NF9MTyhjb25maWdfY21kX21hcCksIDEpOwotCi0JLyogV2FpdCBmb3IgYSBjb21wbGV0aW9uICovCi0JYm54Mnhfd2FpdF9yYW1yb2QoYnAsIDAsIDAsICZicC0+c2V0X21hY19wZW5kaW5nLAotCQkJCXJhbXJvZF9mbGFncyk7Ci0KKwkvKiBFeGVjdXRlIHRoZSBwZW5kaW5nIGNvbW1hbmRzICovCisJX19zZXRfYml0KFJBTVJPRF9DT05ULCAmcmFtcm9kX2ZsYWdzKTsKKwlyZXR1cm4gYm54Mnhfc2V0X21hY19vbmUoYnAsIE5VTEwsIG1hY19vYmosIGZhbHNlIC8qIGRvbid0IGNhcmUgKi8sCisJCQkJIEJOWDJYX1VDX0xJU1RfTUFDLCAmcmFtcm9kX2ZsYWdzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYm54Mnhfc2V0X21jX2xpc3Qoc3RydWN0IGJueDJ4ICpicCkKIHsKLQkvKiBzb21lIG11bHRpY2FzdHMgKi8KLQlpZiAoQ0hJUF9JU19FMShicCkpIHsKLQkJcmV0dXJuIGJueDJ4X3NldF9lMV9tY19saXN0KGJwKTsKLQl9IGVsc2UgeyAvKiBFMUggYW5kIG5ld2VyICovCi0JCXJldHVybiBibngyeF9zZXRfZTFoX21jX2xpc3QoYnApOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBicC0+ZGV2OworCXN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zIHJwYXJhbSA9IHswfTsKKwlpbnQgcmMgPSAwOworCisJcnBhcmFtLm1jYXN0X29iaiA9ICZicC0+bWNhc3Rfb2JqOworCisJLyogZmlyc3QsIGNsZWFyIGFsbCBjb25maWd1cmVkIG11bHRpY2FzdCBNQUNzICovCisJcmMgPSBibngyeF9jb25maWdfbWNhc3QoYnAsICZycGFyYW0sIEJOWDJYX01DQVNUX0NNRF9ERUwpOworCWlmIChyYyA8IDApIHsKKwkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gY2xlYXIgbXVsdGljYXN0ICIKKwkJCSAgImNvbmZpZ3VyYXRpb246ICVkXG4iLCByYyk7CisJCXJldHVybiByYzsKIAl9CisKKwkvKiB0aGVuLCBjb25maWd1cmUgYSBuZXcgTUFDcyBsaXN0ICovCisJaWYgKG5ldGRldl9tY19jb3VudChkZXYpKSB7CisJCXJjID0gYm54MnhfaW5pdF9tY2FzdF9tYWNzX2xpc3QoYnAsICZycGFyYW0pOworCQlpZiAocmMpIHsKKwkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSBtdWx0aWNhc3QgTUFDcyAiCisJCQkJICAibGlzdDogJWRcbiIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCS8qIE5vdyBhZGQgdGhlIG5ldyBNQUNzICovCisJCXJjID0gYm54MnhfY29uZmlnX21jYXN0KGJwLCAmcnBhcmFtLAorCQkJCQlCTlgyWF9NQ0FTVF9DTURfQUREKTsKKwkJaWYgKHJjIDwgMCkKKwkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIHNldCBhIG5ldyBtdWx0aWNhc3QgIgorCQkJCSAgImNvbmZpZ3VyYXRpb246ICVkXG4iLCByYyk7CisKKwkJYm54MnhfZnJlZV9tY2FzdF9tYWNzX2xpc3QoJnJwYXJhbSk7CisJfQorCisJcmV0dXJuIHJjOwogfQogCi0vKiBjYWxsZWQgd2l0aCBuZXRpZl90eF9sb2NrIGZyb20gZGV2X21jYXN0LmMgKi8KKworLyogSWYgYnAtPnN0YXRlIGlzIE9QRU4sIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBuZXRpZl9hZGRyX2xvY2tfYmgoKSAqLwogdm9pZCBibngyeF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtOTAxNywyMyArMTAwMjcsMzEgQEAKIAkJcmV0dXJuOwogCX0KIAotCURQKE5FVElGX01TR19JRlVQLCAiZGV2LT5mbGFncyA9ICV4XG4iLCBkZXYtPmZsYWdzKTsKKwlEUChORVRJRl9NU0dfSUZVUCwgImRldi0+ZmxhZ3MgPSAleFxuIiwgYnAtPmRldi0+ZmxhZ3MpOwogCiAJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKIAkJcnhfbW9kZSA9IEJOWDJYX1JYX01PREVfUFJPTUlTQzsKLQllbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCWVsc2UgaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fAorCQkgKChuZXRkZXZfbWNfY291bnQoZGV2KSA+IEJOWDJYX01BWF9NVUxUSUNBU1QpICYmCisJCSAgQ0hJUF9JU19FMShicCkpKQogCQlyeF9tb2RlID0gQk5YMlhfUlhfTU9ERV9BTExNVUxUSTsKIAllbHNlIHsKIAkJLyogc29tZSBtdWx0aWNhc3RzICovCi0JCWlmIChibngyeF9zZXRfbWNfbGlzdChicCkpCisJCWlmIChibngyeF9zZXRfbWNfbGlzdChicCkgPCAwKQogCQkJcnhfbW9kZSA9IEJOWDJYX1JYX01PREVfQUxMTVVMVEk7CiAKLQkJLyogc29tZSB1bmljYXN0cyAqLwotCQlpZiAoYm54Mnhfc2V0X3VjX2xpc3QoYnApKQorCQlpZiAoYm54Mnhfc2V0X3VjX2xpc3QoYnApIDwgMCkKIAkJCXJ4X21vZGUgPSBCTlgyWF9SWF9NT0RFX1BST01JU0M7CiAJfQogCiAJYnAtPnJ4X21vZGUgPSByeF9tb2RlOworCisJLyogU2NoZWR1bGUgdGhlIHJ4X21vZGUgY29tbWFuZCAqLworCWlmICh0ZXN0X2JpdChCTlgyWF9GSUxURVJfUlhfTU9ERV9QRU5ESU5HLCAmYnAtPnNwX3N0YXRlKSkgeworCQlzZXRfYml0KEJOWDJYX0ZJTFRFUl9SWF9NT0RFX1NDSEVELCAmYnAtPnNwX3N0YXRlKTsKKwkJcmV0dXJuOworCX0KKwogCWJueDJ4X3NldF9zdG9ybV9yeF9tb2RlKGJwKTsKIH0KIApAQCAtOTEyMiwxMCArMTAxNDAsMzUgQEAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gcG9sbF9ibngyeCwKICNlbmRpZgorCS5uZG9fc2V0dXBfdGMJCT0gYm54Mnhfc2V0dXBfdGMsCisKKyNpZiBkZWZpbmVkKE5FVERFVl9GQ09FX1dXTk4pICYmIGRlZmluZWQoQkNNX0NOSUMpCisJLm5kb19mY29lX2dldF93d24JPSBibngyeF9mY29lX2dldF93d24sCisjZW5kaWYKIH07CiAKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3NldF9jb2hlcmVuY3lfbWFzayhzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZicC0+cGRldi0+ZGV2OworCisJaWYgKGRtYV9zZXRfbWFzayhkZXYsIERNQV9CSVRfTUFTSyg2NCkpID09IDApIHsKKwkJYnAtPmZsYWdzIHw9IFVTSU5HX0RBQ19GTEFHOworCQlpZiAoZG1hX3NldF9jb2hlcmVudF9tYXNrKGRldiwgRE1BX0JJVF9NQVNLKDY0KSkgIT0gMCkgeworCQkJZGV2X2VycihkZXYsICJkbWFfc2V0X2NvaGVyZW50X21hc2sgZmFpbGVkLCAiCisJCQkJICAgICAiYWJvcnRpbmdcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9IGVsc2UgaWYgKGRtYV9zZXRfbWFzayhkZXYsIERNQV9CSVRfTUFTSygzMikpICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJTeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBETUEsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGJueDJ4X2luaXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGJvYXJkX3R5cGUpCiB7CiAJc3RydWN0IGJueDJ4ICpicDsKIAlpbnQgcmM7CkBAIC05MTc5LDI5ICsxMDIyMiwxNSBAQAogCQlnb3RvIGVycl9vdXRfcmVsZWFzZTsKIAl9CiAKLQlicC0+cGNpZV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKLQlpZiAoYnAtPnBjaWVfY2FwID09IDApIHsKLQkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKLQkJCSJDYW5ub3QgZmluZCBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5LCBhYm9ydGluZ1xuIik7CisJaWYgKCFwY2lfaXNfcGNpZShwZGV2KSkgeworCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LAkiTm90IFBDSSBFeHByZXNzLCBhYm9ydGluZ1xuIik7CiAJCXJjID0gLUVJTzsKIAkJZ290byBlcnJfb3V0X3JlbGVhc2U7CiAJfQogCi0JaWYgKGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKSA9PSAwKSB7Ci0JCWJwLT5mbGFncyB8PSBVU0lOR19EQUNfRkxBRzsKLQkJaWYgKGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKSAhPSAwKSB7Ci0JCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LCAiZG1hX3NldF9jb2hlcmVudF9tYXNrIgotCQkJICAgICAgICIgZmFpbGVkLCBhYm9ydGluZ1xuIik7Ci0JCQlyYyA9IC1FSU87Ci0JCQlnb3RvIGVycl9vdXRfcmVsZWFzZTsKLQkJfQotCi0JfSBlbHNlIGlmIChkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSkgIT0gMCkgewotCQlkZXZfZXJyKCZicC0+cGRldi0+ZGV2LAotCQkJIlN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IERNQSwgYWJvcnRpbmdcbiIpOwotCQlyYyA9IC1FSU87CisJcmMgPSBibngyeF9zZXRfY29oZXJlbmN5X21hc2soYnApOworCWlmIChyYykKIAkJZ290byBlcnJfb3V0X3JlbGVhc2U7Ci0JfQogCiAJZGV2LT5tZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CiAJZGV2LT5iYXNlX2FkZHIgPSBkZXYtPm1lbV9zdGFydDsKQEAgLTkyMTcsMTYgKzEwMjQ2LDYgQEAKIAkJZ290byBlcnJfb3V0X3JlbGVhc2U7CiAJfQogCi0JYnAtPmRvb3JiZWxscyA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksCi0JCQkJCW1pbl90KHU2NCwgQk5YMlhfREJfU0laRShicCksCi0JCQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpKTsKLQlpZiAoIWJwLT5kb29yYmVsbHMpIHsKLQkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKLQkJCSJDYW5ub3QgbWFwIGRvb3JiZWxsIHNwYWNlLCBhYm9ydGluZ1xuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0X3VubWFwOwotCX0KLQogCWJueDJ4X3NldF9wb3dlcl9zdGF0ZShicCwgUENJX0QwKTsKIAogCS8qIGNsZWFuIGluZGlyZWN0IGFkZHJlc3NlcyAqLwpAQCAtOTIzNyw2ICsxMDI1NiwxNSBAQAogCVJFR19XUihicCwgUFhQMl9SRUdfUEdMX0FERFJfOTBfRjAgKyBCUF9QT1JUKGJwKSoxNiwgMCk7CiAJUkVHX1dSKGJwLCBQWFAyX1JFR19QR0xfQUREUl85NF9GMCArIEJQX1BPUlQoYnApKjE2LCAwKTsKIAorCS8qCisJICogRW5hYmxlIGludGVybmFsIHRhcmdldC1yZWFkIChpbiBjYXNlIHdlIGFyZSBwcm9iZWQgYWZ0ZXIgUEYgRkxSKS4KKwkgKiBNdXN0IGJlIGRvbmUgcHJpb3IgdG8gYW55IEJBUiByZWFkIGFjY2Vzcy4gT25seSBmb3IgNTc3MTIgYW5kIHVwCisJICovCisJaWYgKGJvYXJkX3R5cGUgIT0gQkNNNTc3MTAgJiYKKwkgICAgYm9hcmRfdHlwZSAhPSBCQ001NzcxMSAmJgorCSAgICBib2FyZF90eXBlICE9IEJDTTU3NzExRSkKKwkJUkVHX1dSKGJwLCBQR0xVRV9CX1JFR19JTlRFUk5BTF9QRklEX0VOQUJMRV9UQVJHRVRfUkVBRCwgMSk7CisKIAkvKiBSZXNldCB0aGUgbG9hZCBjb3VudGVyICovCiAJYm54MnhfY2xlYXJfbG9hZF9jbnQoYnApOwogCkBAIC05MjczLDE2ICsxMDMwMSw2IEBACiAKIAlyZXR1cm4gMDsKIAotZXJyX291dF91bm1hcDoKLQlpZiAoYnAtPnJlZ3ZpZXcpIHsKLQkJaW91bm1hcChicC0+cmVndmlldyk7Ci0JCWJwLT5yZWd2aWV3ID0gTlVMTDsKLQl9Ci0JaWYgKGJwLT5kb29yYmVsbHMpIHsKLQkJaW91bm1hcChicC0+ZG9vcmJlbGxzKTsKLQkJYnAtPmRvb3JiZWxscyA9IE5VTEw7Ci0JfQotCiBlcnJfb3V0X3JlbGVhc2U6CiAJaWYgKGF0b21pY19yZWFkKCZwZGV2LT5lbmFibGVfY250KSA9PSAxKQogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwpAQCAtOTQ1MSw3ICsxMDQ2OSw3IEBACiAJCWZ3X2ZpbGVfbmFtZSA9IEZXX0ZJTEVfTkFNRV9FMTsKIAllbHNlIGlmIChDSElQX0lTX0UxSChicCkpCiAJCWZ3X2ZpbGVfbmFtZSA9IEZXX0ZJTEVfTkFNRV9FMUg7Ci0JZWxzZSBpZiAoQ0hJUF9JU19FMihicCkpCisJZWxzZSBpZiAoIUNISVBfSVNfRTF4KGJwKSkKIAkJZndfZmlsZV9uYW1lID0gRldfRklMRV9OQU1FX0UyOwogCWVsc2UgewogCQlCTlgyWF9FUlIoIlVuc3VwcG9ydGVkIGNoaXAgcmV2aXNpb25cbiIpOwpAQCAtOTUxOSw5ICsxMDUzNyw0NyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYm54Mnhfc2V0X3FtX2NpZF9jb3VudChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgbDJfY2lkX2NvdW50KQorc3RhdGljIHZvaWQgYm54MnhfcmVsZWFzZV9maXJtd2FyZShzdHJ1Y3QgYm54MnggKmJwKQogewotCWludCBjaWRfY291bnQgPSBMMl9GUF9DT1VOVChsMl9jaWRfY291bnQpOworCWtmcmVlKGJwLT5pbml0X29wc19vZmZzZXRzKTsKKwlrZnJlZShicC0+aW5pdF9vcHMpOworCWtmcmVlKGJwLT5pbml0X2RhdGEpOworCXJlbGVhc2VfZmlybXdhcmUoYnAtPmZpcm13YXJlKTsKK30KKworCitzdGF0aWMgc3RydWN0IGJueDJ4X2Z1bmNfc3BfZHJ2X29wcyBibngyeF9mdW5jX3NwX2RydiA9IHsKKwkuaW5pdF9od19jbW5fY2hpcCA9IGJueDJ4X2luaXRfaHdfY29tbW9uX2NoaXAsCisJLmluaXRfaHdfY21uICAgICAgPSBibngyeF9pbml0X2h3X2NvbW1vbiwKKwkuaW5pdF9od19wb3J0ICAgICA9IGJueDJ4X2luaXRfaHdfcG9ydCwKKwkuaW5pdF9od19mdW5jICAgICA9IGJueDJ4X2luaXRfaHdfZnVuYywKKworCS5yZXNldF9od19jbW4gICAgID0gYm54MnhfcmVzZXRfY29tbW9uLAorCS5yZXNldF9od19wb3J0ICAgID0gYm54MnhfcmVzZXRfcG9ydCwKKwkucmVzZXRfaHdfZnVuYyAgICA9IGJueDJ4X3Jlc2V0X2Z1bmMsCisKKwkuZ3VuemlwX2luaXQgICAgICA9IGJueDJ4X2d1bnppcF9pbml0LAorCS5ndW56aXBfZW5kICAgICAgID0gYm54MnhfZ3VuemlwX2VuZCwKKworCS5pbml0X2Z3ICAgICAgICAgID0gYm54MnhfaW5pdF9maXJtd2FyZSwKKwkucmVsZWFzZV9mdyAgICAgICA9IGJueDJ4X3JlbGVhc2VfZmlybXdhcmUsCit9OworCit2b2lkIGJueDJ4X19pbml0X2Z1bmNfb2JqKHN0cnVjdCBibngyeCAqYnApCit7CisJLyogUHJlcGFyZSBETUFFIHJlbGF0ZWQgZHJpdmVyIHJlc291cmNlcyAqLworCWJueDJ4X3NldHVwX2RtYWUoYnApOworCisJYm54MnhfaW5pdF9mdW5jX29iaihicCwgJmJwLT5mdW5jX29iaiwKKwkJCSAgICBibngyeF9zcChicCwgZnVuY19yZGF0YSksCisJCQkgICAgYm54Mnhfc3BfbWFwcGluZyhicCwgZnVuY19yZGF0YSksCisJCQkgICAgJmJueDJ4X2Z1bmNfc3BfZHJ2KTsKK30KKworLyogbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgc3Jpb3YtZW5hYmxlICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9zZXRfcW1fY2lkX2NvdW50KHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGNpZF9jb3VudCA9IEJOWDJYX0wyX0NJRF9DT1VOVChicCk7CiAKICNpZmRlZiBCQ01fQ05JQwogCWNpZF9jb3VudCArPSBDTklDX0NJRF9NQVg7CkBAIC05NTI5LDI0ICsxMDU4NSw3NCBAQAogCXJldHVybiByb3VuZHVwKGNpZF9jb3VudCwgUU1fQ0lEX1JPVU5EKTsKIH0KIAorLyoqCisgKiBibngyeF9nZXRfbnVtX25vbmVfZGVmX3NicyAtIHJldHVybiB0aGUgbnVtYmVyIG9mIG5vbmUgZGVmYXVsdCBTQnMKKyAqCisgKiBAZGV2OglwY2kgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9nZXRfbnVtX25vbl9kZWZfc2JzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBwb3M7CisJdTE2IGNvbnRyb2w7CisKKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfTVNJWCk7CisKKwkvKgorCSAqIElmIE1TSS1YIGlzIG5vdCBzdXBwb3J0ZWQgLSByZXR1cm4gbnVtYmVyIG9mIFNCcyBuZWVkZWQgdG8gc3VwcG9ydAorCSAqIG9uZSBmYXN0IHBhdGggcXVldWU6IG9uZSBGUCBxdWV1ZSArIFNCIGZvciBDTklDCisJICovCisJaWYgKCFwb3MpCisJCXJldHVybiAxICsgQ05JQ19QUkVTRU5UOworCisJLyoKKwkgKiBUaGUgdmFsdWUgaW4gdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGlzIHRoZSBpbmRleCBvZiB0aGUgbGFzdAorCSAqIGVudHJ5LCBuYW1lbHkgb25lIGxlc3MgdGhhbiB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHRhYmxlLCB3aGljaCBpcworCSAqIGV4YWN0bHkgd2hhdCB3ZSB3YW50IHRvIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb246IG51bWJlciBvZiBhbGwgU0JzCisJICogd2l0aG91dCB0aGUgZGVmYXVsdCBTQi4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgICsgUENJX01TSV9GTEFHUywgJmNvbnRyb2wpOworCXJldHVybiBjb250cm9sICYgUENJX01TSVhfRkxBR1NfUVNJWkU7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGJueDJ4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOwogCXN0cnVjdCBibngyeCAqYnA7CiAJaW50IHBjaWVfd2lkdGgsIHBjaWVfc3BlZWQ7Ci0JaW50IHJjLCBjaWRfY291bnQ7CisJaW50IHJjLCBtYXhfbm9uX2RlZl9zYnM7CisJaW50IHJ4X2NvdW50LCB0eF9jb3VudCwgcnNzX2NvdW50OworCS8qCisJICogQW4gZXN0aW1hdGVkIG1heGltdW0gc3VwcG9ydGVkIENvUyBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBjaGlwCisJICogdmVyc2lvbi4KKwkgKiBXZSB3aWxsIHRyeSB0byByb3VnaGx5IGVzdGltYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBDb1NlcyB0aGlzIGNoaXAKKwkgKiBtYXkgc3VwcG9ydCBpbiBvcmRlciB0byBtaW5pbWl6ZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgVHgKKwkgKiBuZXRkZXZfcXVldWUncy4gVGhpcyBudW1iZXIgd2lsbCBiZSBhY2N1cmF0ZWx5IGNhbGN1bGF0ZWQgZHVyaW5nIHRoZQorCSAqIGluaXRpYWxpemF0aW9uIG9mIGJwLT5tYXhfY29zIGJhc2VkIG9uIHRoZSBjaGlwIHZlcnNpb25zIEFORCBjaGlwCisJICogcmV2aXNpb24gaW4gdGhlIGJueDJ4X2luaXRfYnAoKS4KKwkgKi8KKwl1OCBtYXhfY29zX2VzdCA9IDA7CiAKIAlzd2l0Y2ggKGVudC0+ZHJpdmVyX2RhdGEpIHsKIAljYXNlIEJDTTU3NzEwOgogCWNhc2UgQkNNNTc3MTE6CiAJY2FzZSBCQ001NzcxMUU6Ci0JCWNpZF9jb3VudCA9IEZQX1NCX01BWF9FMXg7CisJCW1heF9jb3NfZXN0ID0gQk5YMlhfTVVMVElfVFhfQ09TX0UxWDsKIAkJYnJlYWs7CiAKIAljYXNlIEJDTTU3NzEyOgotCWNhc2UgQkNNNTc3MTJFOgotCQljaWRfY291bnQgPSBGUF9TQl9NQVhfRTI7CisJY2FzZSBCQ001NzcxMl9NRjoKKwkJbWF4X2Nvc19lc3QgPSBCTlgyWF9NVUxUSV9UWF9DT1NfRTJfRTNBMDsKKwkJYnJlYWs7CisKKwljYXNlIEJDTTU3ODAwOgorCWNhc2UgQkNNNTc4MDBfTUY6CisJY2FzZSBCQ001NzgxMDoKKwljYXNlIEJDTTU3ODEwX01GOgorCWNhc2UgQkNNNTc4NDA6CisJY2FzZSBCQ001Nzg0MF9NRjoKKwkJbWF4X2Nvc19lc3QgPSBCTlgyWF9NVUxUSV9UWF9DT1NfRTNCMDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtOTU1NSwzOCArMTA2NjEsNzcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JY2lkX2NvdW50ICs9IE5PTkVfRVRIX0NPTlRFWFRfVVNFICsgQ05JQ19DT05URVhUX1VTRTsKKwltYXhfbm9uX2RlZl9zYnMgPSBibngyeF9nZXRfbnVtX25vbl9kZWZfc2JzKHBkZXYpOworCisJLyogISEhIEZJWE1FICEhIQorCSAqIERvIG5vdCBhbGxvdyB0aGUgbWF4aW11bSBTQiBjb3VudCB0byBncm93IGFib3ZlIDE2CisJICogc2luY2UgU3BlY2lhbCBDSURzIHN0YXJ0cyBmcm9tIDE2KkJOWDJYX01VTFRJX1RYX0NPUz00OC4KKwkgKiBXZSB3aWxsIHVzZSB0aGUgRlBfU0JfTUFYX0UxeCBtYWNybyBmb3IgdGhpcyBtYXR0ZXIuCisJICovCisJbWF4X25vbl9kZWZfc2JzID0gbWluX3QoaW50LCBGUF9TQl9NQVhfRTF4LCBtYXhfbm9uX2RlZl9zYnMpOworCisJV0FSTl9PTighbWF4X25vbl9kZWZfc2JzKTsKKworCS8qIE1heGltdW0gbnVtYmVyIG9mIFJTUyBxdWV1ZXM6IG9uZSBJR1UgU0IgZ29lcyB0byBDTklDICovCisJcnNzX2NvdW50ID0gbWF4X25vbl9kZWZfc2JzIC0gQ05JQ19QUkVTRU5UOworCisJLyogTWF4aW11bSBudW1iZXIgb2YgbmV0ZGV2IFJ4IHF1ZXVlczogUlNTICsgRkNvRSBMMiAqLworCXJ4X2NvdW50ID0gcnNzX2NvdW50ICsgRkNPRV9QUkVTRU5UOworCisJLyoKKwkgKiBNYXhpbXVtIG51bWJlciBvZiBuZXRkZXYgVHggcXVldWVzOgorCSAqICAgICAgTWF4aW11bSBUU1MgcXVldWVzICogTWF4aW11bSBzdXBwb3J0ZWQgbnVtYmVyIG9mIENvUyAgKyBGQ29FIEwyCisJICovCisJdHhfY291bnQgPSBNQVhfVFhRU19QRVJfQ09TICogbWF4X2Nvc19lc3QgKyBGQ09FX1BSRVNFTlQ7CiAKIAkvKiBkZXYgemVyb2VkIGluIGluaXRfZXRoZXJkZXYgKi8KLQlkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2YoKmJwKSwgY2lkX2NvdW50KTsKKwlkZXYgPSBhbGxvY19ldGhlcmRldl9tcXMoc2l6ZW9mKCpicCksIHR4X2NvdW50LCByeF9jb3VudCk7CiAJaWYgKCFkZXYpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIG5ldCBkZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlicCA9IG5ldGRldl9wcml2KGRldik7Ci0JYnAtPm1zZ19lbmFibGUgPSBkZWJ1ZzsKIAorCURQKE5FVElGX01TR19EUlYsICJBbGxvY2F0ZWQgbmV0ZGV2IHdpdGggJWQgdHggYW5kICVkIHJ4IHF1ZXVlc1xuIiwKKwkJCSAgdHhfY291bnQsIHJ4X2NvdW50KTsKKworCWJwLT5pZ3Vfc2JfY250ID0gbWF4X25vbl9kZWZfc2JzOworCWJwLT5tc2dfZW5hYmxlID0gZGVidWc7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKLQlicC0+bDJfY2lkX2NvdW50ID0gY2lkX2NvdW50OwotCi0JcmMgPSBibngyeF9pbml0X2RldihwZGV2LCBkZXYpOworCXJjID0gYm54MnhfaW5pdF9kZXYocGRldiwgZGV2LCBlbnQtPmRyaXZlcl9kYXRhKTsKIAlpZiAocmMgPCAwKSB7CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXJldHVybiByYzsKIAl9CiAKKwlEUChORVRJRl9NU0dfRFJWLCAibWF4X25vbl9kZWZfc2JzICVkIiwgbWF4X25vbl9kZWZfc2JzKTsKKwogCXJjID0gYm54MnhfaW5pdF9icChicCk7CiAJaWYgKHJjKQogCQlnb3RvIGluaXRfb25lX2V4aXQ7CiAKKwkvKgorCSAqIE1hcCBkb29yYmVscyBoZXJlIGFzIHdlIG5lZWQgdGhlIHJlYWwgdmFsdWUgb2YgYnAtPm1heF9jb3Mgd2hpY2gKKwkgKiBpcyBpbml0aWFsaXplZCBpbiBibngyeF9pbml0X2JwKCkuCisJICovCisJYnAtPmRvb3JiZWxscyA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksCisJCQkJCW1pbl90KHU2NCwgQk5YMlhfREJfU0laRShicCksCisJCQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpKTsKKwlpZiAoIWJwLT5kb29yYmVsbHMpIHsKKwkJZGV2X2VycigmYnAtPnBkZXYtPmRldiwKKwkJCSJDYW5ub3QgbWFwIGRvb3JiZWxsIHNwYWNlLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBpbml0X29uZV9leGl0OworCX0KKwogCS8qIGNhbGMgcW1fY2lkX2NvdW50ICovCi0JYnAtPnFtX2NpZF9jb3VudCA9IGJueDJ4X3NldF9xbV9jaWRfY291bnQoYnAsIGNpZF9jb3VudCk7CisJYnAtPnFtX2NpZF9jb3VudCA9IGJueDJ4X3NldF9xbV9jaWRfY291bnQoYnApOwogCiAjaWZkZWYgQkNNX0NOSUMKLQkvKiBkaXNhYmxlIEZDT0UgTDIgcXVldWUgZm9yIEUxeCovCi0JaWYgKENISVBfSVNfRTF4KGJwKSkKKwkvKiBkaXNhYmxlIEZDT0UgTDIgcXVldWUgZm9yIEUxeCBhbmQgRTMqLworCWlmIChDSElQX0lTX0UxeChicCkgfHwgQ0hJUF9JU19FMyhicCkpCiAJCWJwLT5mbGFncyB8PSBOT19GQ09FX0ZMQUc7CiAKICNlbmRpZgpAQCAtOTY4Niw3ICsxMDgzMSw3IEBACiAJYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lfRDNob3QpOwogCiAJLyogTWFrZSBzdXJlIFJFU0VUIHRhc2sgaXMgbm90IHNjaGVkdWxlZCBiZWZvcmUgY29udGludWluZyAqLwotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnAtPnJlc2V0X3Rhc2spOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnAtPnNwX3J0bmxfdGFzayk7CiAKIAlpZiAoYnAtPnJlZ3ZpZXcpCiAJCWlvdW5tYXAoYnAtPnJlZ3ZpZXcpOwpAQCAtOTcxMywxMiArMTA4NTgsMTcgQEAKIAogCWJwLT5yeF9tb2RlID0gQk5YMlhfUlhfTU9ERV9OT05FOwogCisjaWZkZWYgQkNNX0NOSUMKKwlibngyeF9jbmljX25vdGlmeShicCwgQ05JQ19DVExfU1RPUF9DTUQpOworI2VuZGlmCisJLyogU3RvcCBUeCAqLworCWJueDJ4X3R4X2Rpc2FibGUoYnApOworCiAJYm54MnhfbmV0aWZfc3RvcChicCwgMCk7Ci0JbmV0aWZfY2Fycmllcl9vZmYoYnAtPmRldik7CiAKIAlkZWxfdGltZXJfc3luYygmYnAtPnRpbWVyKTsKLQlicC0+c3RhdHNfc3RhdGUgPSBTVEFUU19TVEFURV9ESVNBQkxFRDsKLQlEUChCTlgyWF9NU0dfU1RBVFMsICJzdGF0c19zdGF0ZSAtIERJU0FCTEVEXG4iKTsKKworCWJueDJ4X3N0YXRzX2hhbmRsZShicCwgU1RBVFNfRVZFTlRfU1RPUCk7CiAKIAkvKiBSZWxlYXNlIElSUXMgKi8KIAlibngyeF9mcmVlX2lycShicCk7CkBAIC05NzMzLDYgKzEwODgzLDggQEAKIAogCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX0NMT1NFRDsKIAorCW5ldGlmX2NhcnJpZXJfb2ZmKGJwLT5kZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk4NDUsOCArMTA5OTcsOCBAQAogCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKGJwLT5yZWNvdmVyeV9zdGF0ZSAhPSBCTlgyWF9SRUNPVkVSWV9ET05FKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSGFuZGxpbmcgcGFyaXR5IGVycm9yIHJlY292ZXJ5LiAiCi0JCQkJIlRyeSBhZ2FpbiBsYXRlclxuIik7CisJCW5ldGRldl9lcnIoYnAtPmRldiwgIkhhbmRsaW5nIHBhcml0eSBlcnJvciByZWNvdmVyeS4gIgorCQkJCSAgICAiVHJ5IGFnYWluIGxhdGVyXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtOTkwNSwxMCArMTEwNTcsMzMgQEAKIAlkZXN0cm95X3dvcmtxdWV1ZShibngyeF93cSk7CiB9CiAKK3ZvaWQgYm54Mnhfbm90aWZ5X2xpbmtfY2hhbmdlZChzdHJ1Y3QgYm54MnggKmJwKQoreworCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl8xMiArIEJQX0ZVTkMoYnApKnNpemVvZih1MzIpLCAxKTsKK30KKwogbW9kdWxlX2luaXQoYm54MnhfaW5pdCk7CiBtb2R1bGVfZXhpdChibngyeF9jbGVhbnVwKTsKIAogI2lmZGVmIEJDTV9DTklDCisvKioKKyAqIGJueDJ4X3NldF9pc2NzaV9ldGhfbWFjX2FkZHIgLSBzZXQgaVNDU0kgTUFDKHMpLgorICoKKyAqIEBicDoJCWRyaXZlciBoYW5kbGUKKyAqIEBzZXQ6CXNldCBvciBjbGVhciB0aGUgQ0FNIGVudHJ5CisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHdhaXQgdW50aWwgdGhlIHJhbWRvcmQgY29tcGxldGlvbiByZXR1cm5zLgorICogUmV0dXJuIDAgaWYgc3VjY2VzcywgLUVOT0RFViBpZiByYW1yb2QgZG9lc24ndCByZXR1cm4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3NldF9pc2NzaV9ldGhfbWFjX2FkZHIoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1bnNpZ25lZCBsb25nIHJhbXJvZF9mbGFncyA9IDA7CisKKwlfX3NldF9iaXQoUkFNUk9EX0NPTVBfV0FJVCwgJnJhbXJvZF9mbGFncyk7CisJcmV0dXJuIGJueDJ4X3NldF9tYWNfb25lKGJwLCBicC0+Y25pY19ldGhfZGV2LmlzY3NpX21hYywKKwkJCQkgJmJwLT5pc2NzaV9sMl9tYWNfb2JqLCB0cnVlLAorCQkJCSBCTlgyWF9JU0NTSV9FVEhfTUFDLCAmcmFtcm9kX2ZsYWdzKTsKK30KIAogLyogY291bnQgZGVub3RlcyB0aGUgbnVtYmVyIG9mIG5ldyBjb21wbGV0aW9ucyB3ZSBoYXZlIHNlZW4gKi8KIHN0YXRpYyB2b2lkIGJueDJ4X2NuaWNfc3BfcG9zdChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY291bnQpCkBAIC05OTI5LDIzICsxMTEwNCwyMiBAQAogCQl1MTYgdHlwZSA9ICAobGUxNl90b19jcHUoYnAtPmNuaWNfa3dxX2NvbnMtPmhkci50eXBlKQogCQkJCSYgU1BFX0hEUl9DT05OX1RZUEUpID4+CiAJCQkJU1BFX0hEUl9DT05OX1RZUEVfU0hJRlQ7CisJCXU4IGNtZCA9IChsZTMyX3RvX2NwdShicC0+Y25pY19rd3FfY29ucy0+aGRyLmNvbm5fYW5kX2NtZF9kYXRhKQorCQkJCT4+IFNQRV9IRFJfQ01EX0lEX1NISUZUKSAmIDB4ZmY7CiAKIAkJLyogU2V0IHZhbGlkYXRpb24gZm9yIGlTQ1NJIEwyIGNsaWVudCBiZWZvcmUgc2VuZGluZyBTRVRVUAogCQkgKiAgcmFtcm9kCiAJCSAqLwogCQlpZiAodHlwZSA9PSBFVEhfQ09OTkVDVElPTl9UWVBFKSB7Ci0JCQl1OCBjbWQgPSAobGUzMl90b19jcHUoYnAtPmNuaWNfa3dxX2NvbnMtPgotCQkJCQkgICAgIGhkci5jb25uX2FuZF9jbWRfZGF0YSkgPj4KLQkJCQlTUEVfSERSX0NNRF9JRF9TSElGVCkgJiAweGZmOwotCiAJCQlpZiAoY21kID09IFJBTVJPRF9DTURfSURfRVRIX0NMSUVOVF9TRVRVUCkKLQkJCQlibngyeF9zZXRfY3R4X3ZhbGlkYXRpb24oJmJwLT5jb250ZXh0LgotCQkJCQkJdmN4dFtCTlgyWF9JU0NTSV9FVEhfQ0lEXS5ldGgsCi0JCQkJCUhXX0NJRChicCwgQk5YMlhfSVNDU0lfRVRIX0NJRCkpOworCQkJCWJueDJ4X3NldF9jdHhfdmFsaWRhdGlvbihicCwgJmJwLT5jb250ZXh0LgorCQkJCQl2Y3h0W0JOWDJYX0lTQ1NJX0VUSF9DSURdLmV0aCwKKwkJCQkJQk5YMlhfSVNDU0lfRVRIX0NJRCk7CiAJCX0KIAotCQkvKiBUaGVyZSBtYXkgYmUgbm90IG1vcmUgdGhhbiA4IEwyIGFuZCBub3QgbW9yZSB0aGFuIDggTDUgU1BFcwotCQkgKiBXZSBhbHNvIGNoZWNrIHRoYXQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZworCQkvKgorCQkgKiBUaGVyZSBtYXkgYmUgbm90IG1vcmUgdGhhbiA4IEwyLCBub3QgbW9yZSB0aGFuIDggTDUgU1BFcworCQkgKiBhbmQgaW4gdGhlIGFpci4gV2UgYWxzbyBjaGVjayB0aGF0IG51bWJlciBvZiBvdXRzdGFuZGluZwogCQkgKiBDT01NT04gcmFtcm9kcyBpcyBub3QgbW9yZSB0aGFuIHRoZSBFUSBhbmQgU1BRIGNhbgogCQkgKiBhY2NvbW1vZGF0ZS4KIAkJICovCkBAIC0xMDA3MSwxOCArMTEyNDUsNjEgQEAKIAlyZXR1cm4gYm54MnhfY25pY19jdGxfc2VuZChicCwgJmN0bCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJ4X2NuaWNfY2ZjX2NvbXAoc3RydWN0IGJueDJ4ICpicCwgaW50IGNpZCkKK3N0YXRpYyB2b2lkIGJueDJ4X2NuaWNfY2ZjX2NvbXAoc3RydWN0IGJueDJ4ICpicCwgaW50IGNpZCwgdTggZXJyKQogewotCXN0cnVjdCBjbmljX2N0bF9pbmZvIGN0bDsKKwlzdHJ1Y3QgY25pY19jdGxfaW5mbyBjdGwgPSB7MH07CiAKIAkvKiBmaXJzdCB3ZSB0ZWxsIENOSUMgYW5kIG9ubHkgdGhlbiB3ZSBjb3VudCB0aGlzIGFzIGEgY29tcGxldGlvbiAqLwogCWN0bC5jbWQgPSBDTklDX0NUTF9DT01QTEVUSU9OX0NNRDsKIAljdGwuZGF0YS5jb21wLmNpZCA9IGNpZDsKKwljdGwuZGF0YS5jb21wLmVycm9yID0gZXJyOwogCiAJYm54MnhfY25pY19jdGxfc2VuZF9iaChicCwgJmN0bCk7CiAJYm54MnhfY25pY19zcF9wb3N0KGJwLCAwKTsKIH0KIAorCisvKiBDYWxsZWQgd2l0aCBuZXRpZl9hZGRyX2xvY2tfYmgoKSB0YWtlbi4KKyAqIFNldHMgYW4gcnhfbW9kZSBjb25maWcgZm9yIGFuIGlTQ1NJIEVUSCBjbGllbnQuCisgKiBEb2Vzbid0IGJsb2NrLgorICogQ29tcGxldGlvbiBzaG91bGQgYmUgY2hlY2tlZCBvdXRzaWRlLgorICovCitzdGF0aWMgdm9pZCBibngyeF9zZXRfaXNjc2lfZXRoX3J4X21vZGUoc3RydWN0IGJueDJ4ICpicCwgYm9vbCBzdGFydCkKK3sKKwl1bnNpZ25lZCBsb25nIGFjY2VwdF9mbGFncyA9IDAsIHJhbXJvZF9mbGFncyA9IDA7CisJdTggY2xfaWQgPSBibngyeF9jbmljX2V0aF9jbF9pZChicCwgQk5YMlhfSVNDU0lfRVRIX0NMX0lEX0lEWCk7CisJaW50IHNjaGVkX3N0YXRlID0gQk5YMlhfRklMVEVSX0lTQ1NJX0VUSF9TVE9QX1NDSEVEOworCisJaWYgKHN0YXJ0KSB7CisJCS8qIFN0YXJ0IGFjY2VwdGluZyBvbiBpU0NTSSBMMiByaW5nLiBBY2NlcHQgYWxsIG11bHRpY2FzdHMKKwkJICogYmVjYXVzZSBpdCdzIHRoZSBvbmx5IHdheSBmb3IgVUlPIFF1ZXVlIHRvIGFjY2VwdAorCQkgKiBtdWx0aWNhc3RzIChpbiBub24tcHJvbWlzY3VvdXMgbW9kZSBvbmx5IG9uZSBRdWV1ZSBwZXIKKwkJICogZnVuY3Rpb24gd2lsbCByZWNlaXZlIG11bHRpY2FzdCBwYWNrZXRzIChsZWFkaW5nIGluIG91cgorCQkgKiBjYXNlKS4KKwkJICovCisJCV9fc2V0X2JpdChCTlgyWF9BQ0NFUFRfVU5JQ0FTVCwgJmFjY2VwdF9mbGFncyk7CisJCV9fc2V0X2JpdChCTlgyWF9BQ0NFUFRfQUxMX01VTFRJQ0FTVCwgJmFjY2VwdF9mbGFncyk7CisJCV9fc2V0X2JpdChCTlgyWF9BQ0NFUFRfQlJPQURDQVNULCAmYWNjZXB0X2ZsYWdzKTsKKwkJX19zZXRfYml0KEJOWDJYX0FDQ0VQVF9BTllfVkxBTiwgJmFjY2VwdF9mbGFncyk7CisKKwkJLyogQ2xlYXIgU1RPUF9QRU5ESU5HIGJpdCBpZiBTVEFSVCBpcyByZXF1ZXN0ZWQgKi8KKwkJY2xlYXJfYml0KEJOWDJYX0ZJTFRFUl9JU0NTSV9FVEhfU1RPUF9TQ0hFRCwgJmJwLT5zcF9zdGF0ZSk7CisKKwkJc2NoZWRfc3RhdGUgPSBCTlgyWF9GSUxURVJfSVNDU0lfRVRIX1NUQVJUX1NDSEVEOworCX0gZWxzZQorCQkvKiBDbGVhciBTVEFSVF9QRU5ESU5HIGJpdCBpZiBTVE9QIGlzIHJlcXVlc3RlZCAqLworCQljbGVhcl9iaXQoQk5YMlhfRklMVEVSX0lTQ1NJX0VUSF9TVEFSVF9TQ0hFRCwgJmJwLT5zcF9zdGF0ZSk7CisKKwlpZiAodGVzdF9iaXQoQk5YMlhfRklMVEVSX1JYX01PREVfUEVORElORywgJmJwLT5zcF9zdGF0ZSkpCisJCXNldF9iaXQoc2NoZWRfc3RhdGUsICZicC0+c3Bfc3RhdGUpOworCWVsc2UgeworCQlfX3NldF9iaXQoUkFNUk9EX1JYLCAmcmFtcm9kX2ZsYWdzKTsKKwkJYm54Mnhfc2V0X3FfcnhfbW9kZShicCwgY2xfaWQsIDAsIGFjY2VwdF9mbGFncywgMCwKKwkJCQkgICAgcmFtcm9kX2ZsYWdzKTsKKwl9Cit9CisKKwogc3RhdGljIGludCBibngyeF9kcnZfY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkcnZfY3RsX2luZm8gKmN0bCkKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTEwMTA2LDQ1ICsxMTMyMyw2NSBAQAogCiAJLyogcnRubF9sb2NrIGlzIGhlbGQuICAqLwogCWNhc2UgRFJWX0NUTF9TVEFSVF9MMl9DTUQ6IHsKLQkJdTMyIGNsaSA9IGN0bC0+ZGF0YS5yaW5nLmNsaWVudF9pZDsKKwkJc3RydWN0IGNuaWNfZXRoX2RldiAqY3AgPSAmYnAtPmNuaWNfZXRoX2RldjsKKwkJdW5zaWduZWQgbG9uZyBzcF9iaXRzID0gMDsKIAotCQkvKiBDbGVhciBGQ29FIEZJUCBhbmQgQUxMIEVOT0RFIE1BQ3MgYWRkcmVzc2VzIGZpcnN0ICovCi0JCWJueDJ4X2RlbF9mY29lX2V0aF9tYWNzKGJwKTsKKwkJLyogQ29uZmlndXJlIHRoZSBpU0NTSSBjbGFzc2lmaWNhdGlvbiBvYmplY3QgKi8KKwkJYm54MnhfaW5pdF9tYWNfb2JqKGJwLCAmYnAtPmlzY3NpX2wyX21hY19vYmosCisJCQkJICAgY3AtPmlzY3NpX2wyX2NsaWVudF9pZCwKKwkJCQkgICBjcC0+aXNjc2lfbDJfY2lkLCBCUF9GVU5DKGJwKSwKKwkJCQkgICBibngyeF9zcChicCwgbWFjX3JkYXRhKSwKKwkJCQkgICBibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfcmRhdGEpLAorCQkJCSAgIEJOWDJYX0ZJTFRFUl9NQUNfUEVORElORywKKwkJCQkgICAmYnAtPnNwX3N0YXRlLCBCTlgyWF9PQkpfVFlQRV9SWCwKKwkJCQkgICAmYnAtPm1hY3NfcG9vbCk7CiAKIAkJLyogU2V0IGlTQ1NJIE1BQyBhZGRyZXNzICovCi0JCWJueDJ4X3NldF9pc2NzaV9ldGhfbWFjX2FkZHIoYnAsIDEpOworCQlyYyA9IGJueDJ4X3NldF9pc2NzaV9ldGhfbWFjX2FkZHIoYnApOworCQlpZiAocmMpCisJCQlicmVhazsKIAogCQltbWlvd2IoKTsKIAkJYmFycmllcigpOwogCi0JCS8qIFN0YXJ0IGFjY2VwdGluZyBvbiBpU0NTSSBMMiByaW5nLiBBY2NlcHQgYWxsIG11bHRpY2FzdHMKLQkJICogYmVjYXVzZSBpdCdzIHRoZSBvbmx5IHdheSBmb3IgVUlPIENsaWVudCB0byBhY2NlcHQKLQkJICogbXVsdGljYXN0cyAoaW4gbm9uLXByb21pc2N1b3VzIG1vZGUgb25seSBvbmUgQ2xpZW50IHBlcgotCQkgKiBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgbXVsdGljYXN0IHBhY2tldHMgKGxlYWRpbmcgaW4gb3VyCi0JCSAqIGNhc2UpLgotCQkgKi8KLQkJYm54MnhfcnhxX3NldF9tYWNfZmlsdGVycyhicCwgY2xpLAotCQkJQk5YMlhfQUNDRVBUX1VOSUNBU1QgfAotCQkJQk5YMlhfQUNDRVBUX0JST0FEQ0FTVCB8Ci0JCQlCTlgyWF9BQ0NFUFRfQUxMX01VTFRJQ0FTVCk7Ci0JCXN0b3JtX21lbXNldF9tYWNfZmlsdGVycyhicCwgJmJwLT5tYWNfZmlsdGVycywgQlBfRlVOQyhicCkpOworCQkvKiBTdGFydCBhY2NlcHRpbmcgb24gaVNDU0kgTDIgcmluZyAqLworCisJCW5ldGlmX2FkZHJfbG9ja19iaChkZXYpOworCQlibngyeF9zZXRfaXNjc2lfZXRoX3J4X21vZGUoYnAsIHRydWUpOworCQluZXRpZl9hZGRyX3VubG9ja19iaChkZXYpOworCisJCS8qIGJpdHMgdG8gd2FpdCBvbiAqLworCQlfX3NldF9iaXQoQk5YMlhfRklMVEVSX1JYX01PREVfUEVORElORywgJnNwX2JpdHMpOworCQlfX3NldF9iaXQoQk5YMlhfRklMVEVSX0lTQ1NJX0VUSF9TVEFSVF9TQ0hFRCwgJnNwX2JpdHMpOworCisJCWlmICghYm54Mnhfd2FpdF9zcF9jb21wKGJwLCBzcF9iaXRzKSkKKwkJCUJOWDJYX0VSUigicnhfbW9kZSBjb21wbGV0aW9uIHRpbWVkIG91dCFcbiIpOwogCiAJCWJyZWFrOwogCX0KIAogCS8qIHJ0bmxfbG9jayBpcyBoZWxkLiAgKi8KIAljYXNlIERSVl9DVExfU1RPUF9MMl9DTUQ6IHsKLQkJdTMyIGNsaSA9IGN0bC0+ZGF0YS5yaW5nLmNsaWVudF9pZDsKKwkJdW5zaWduZWQgbG9uZyBzcF9iaXRzID0gMDsKIAogCQkvKiBTdG9wIGFjY2VwdGluZyBvbiBpU0NTSSBMMiByaW5nICovCi0JCWJueDJ4X3J4cV9zZXRfbWFjX2ZpbHRlcnMoYnAsIGNsaSwgQk5YMlhfQUNDRVBUX05PTkUpOwotCQlzdG9ybV9tZW1zZXRfbWFjX2ZpbHRlcnMoYnAsICZicC0+bWFjX2ZpbHRlcnMsIEJQX0ZVTkMoYnApKTsKKwkJbmV0aWZfYWRkcl9sb2NrX2JoKGRldik7CisJCWJueDJ4X3NldF9pc2NzaV9ldGhfcnhfbW9kZShicCwgZmFsc2UpOworCQluZXRpZl9hZGRyX3VubG9ja19iaChkZXYpOworCisJCS8qIGJpdHMgdG8gd2FpdCBvbiAqLworCQlfX3NldF9iaXQoQk5YMlhfRklMVEVSX1JYX01PREVfUEVORElORywgJnNwX2JpdHMpOworCQlfX3NldF9iaXQoQk5YMlhfRklMVEVSX0lTQ1NJX0VUSF9TVE9QX1NDSEVELCAmc3BfYml0cyk7CisKKwkJaWYgKCFibngyeF93YWl0X3NwX2NvbXAoYnAsIHNwX2JpdHMpKQorCQkJQk5YMlhfRVJSKCJyeF9tb2RlIGNvbXBsZXRpb24gdGltZWQgb3V0IVxuIik7CiAKIAkJbW1pb3diKCk7CiAJCWJhcnJpZXIoKTsKIAogCQkvKiBVbnNldCBpU0NTSSBMMiBNQUMgKi8KLQkJYm54Mnhfc2V0X2lzY3NpX2V0aF9tYWNfYWRkcihicCwgMCk7CisJCXJjID0gYm54MnhfZGVsX2FsbF9tYWNzKGJwLCAmYnAtPmlzY3NpX2wyX21hY19vYmosCisJCQkJCUJOWDJYX0lTQ1NJX0VUSF9NQUMsIHRydWUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBEUlZfQ1RMX1JFVF9MMl9TUFFfQ1JFRElUX0NNRDogewpAQCAtMTAxNTYsMTEgKzExMzkzLDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBEUlZfQ1RMX0lTQ1NJX1NUT1BQRURfQ01EOiB7Ci0JCWJueDJ4X2RjYnhfc2V0X3BhcmFtcyhicCwgQk5YMlhfRENCWF9TVEFURV9JU0NTSV9TVE9QUEVEKTsKLQkJYnJlYWs7Ci0JfQotCiAJZGVmYXVsdDoKIAkJQk5YMlhfRVJSKCJ1bmtub3duIGNvbW1hbmQgJXhcbiIsIGN0bC0+Y21kKTsKIAkJcmMgPSAtRUlOVkFMOwpAQCAtMTAxODEsMTMgKzExNDEzLDEzIEBACiAJCWNwLT5kcnZfc3RhdGUgJj0gfkNOSUNfRFJWX1NUQVRFX1VTSU5HX01TSVg7CiAJCWNwLT5pcnFfYXJyWzBdLmlycV9mbGFncyAmPSB+Q05JQ19JUlFfRkxfTVNJWDsKIAl9Ci0JaWYgKENISVBfSVNfRTIoYnApKQorCWlmICghQ0hJUF9JU19FMXgoYnApKQogCQljcC0+aXJxX2FyclswXS5zdGF0dXNfYmxrID0gKHZvaWQgKilicC0+Y25pY19zYi5lMl9zYjsKIAllbHNlCiAJCWNwLT5pcnFfYXJyWzBdLnN0YXR1c19ibGsgPSAodm9pZCAqKWJwLT5jbmljX3NiLmUxeF9zYjsKIAotCWNwLT5pcnFfYXJyWzBdLnN0YXR1c19ibGtfbnVtID0gQ05JQ19TQl9JRChicCk7Ci0JY3AtPmlycV9hcnJbMF0uc3RhdHVzX2Jsa19udW0yID0gQ05JQ19JR1VfU0JfSUQoYnApOworCWNwLT5pcnFfYXJyWzBdLnN0YXR1c19ibGtfbnVtID0gIGJueDJ4X2NuaWNfZndfc2JfaWQoYnApOworCWNwLT5pcnFfYXJyWzBdLnN0YXR1c19ibGtfbnVtMiA9IGJueDJ4X2NuaWNfaWd1X3NiX2lkKGJwKTsKIAljcC0+aXJxX2FyclsxXS5zdGF0dXNfYmxrID0gYnAtPmRlZl9zdGF0dXNfYmxrOwogCWNwLT5pcnFfYXJyWzFdLnN0YXR1c19ibGtfbnVtID0gREVGX1NCX0lEOwogCWNwLT5pcnFfYXJyWzFdLnN0YXR1c19ibGtfbnVtMiA9IERFRl9TQl9JR1VfSUQ7CkBAIC0xMDIwNCw5ICsxMTQzNiw2IEBACiAJaWYgKG9wcyA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChhdG9taWNfcmVhZCgmYnAtPmludHJfc2VtKSAhPSAwKQotCQlyZXR1cm4gLUVCVVNZOwotCiAJYnAtPmNuaWNfa3dxID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghYnAtPmNuaWNfa3dxKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTEwMjIxLDcgKzExNDUwLDcgQEAKIAlicC0+Y25pY19kYXRhID0gZGF0YTsKIAogCWNwLT5udW1faXJxID0gMDsKLQljcC0+ZHJ2X3N0YXRlID0gQ05JQ19EUlZfU1RBVEVfUkVHRDsKKwljcC0+ZHJ2X3N0YXRlIHw9IENOSUNfRFJWX1NUQVRFX1JFR0Q7CiAJY3AtPmlyb19hcnIgPSBicC0+aXJvX2FycjsKIAogCWJueDJ4X3NldHVwX2NuaWNfaXJxX2luZm8oYnApOwpAQCAtMTAyNzUsOCArMTE1MDQsOCBAQAogCWNwLT5kcnZfcmVnaXN0ZXJfY25pYyA9IGJueDJ4X3JlZ2lzdGVyX2NuaWM7CiAJY3AtPmRydl91bnJlZ2lzdGVyX2NuaWMgPSBibngyeF91bnJlZ2lzdGVyX2NuaWM7CiAJY3AtPmZjb2VfaW5pdF9jaWQgPSBCTlgyWF9GQ09FX0VUSF9DSUQ7Ci0JY3AtPmlzY3NpX2wyX2NsaWVudF9pZCA9IEJOWDJYX0lTQ1NJX0VUSF9DTF9JRCArCi0JCUJQX0UxSFZOKGJwKSAqIE5PTkVfRVRIX0NPTlRFWFRfVVNFOworCWNwLT5pc2NzaV9sMl9jbGllbnRfaWQgPQorCQlibngyeF9jbmljX2V0aF9jbF9pZChicCwgQk5YMlhfSVNDU0lfRVRIX0NMX0lEX0lEWCk7CiAJY3AtPmlzY3NpX2wyX2NpZCA9IEJOWDJYX0lTQ1NJX0VUSF9DSUQ7CiAKIAlpZiAoTk9fSVNDU0lfT09PKGJwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X3JlZy5oIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfcmVnLmgKaW5kZXggODZiYmEyNS4uMDI0NjFmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfcmVnLmgKKysrIGIvZHJpdmVycy9uZXQvYm54MngvYm54MnhfcmVnLmgKQEAgLTMyLDcgKzMyLDExIEBACiAvKiBbUiAxXSBBVEMgaW5pdGFsaXphdGlvbiBkb25lICovCiAjZGVmaW5lIEFUQ19SRUdfQVRDX0lOSVRfRE9ORQkJCQkJIDB4MTEwMGJjCiAvKiBbUkMgNl0gSW50ZXJydXB0IHJlZ2lzdGVyICMwIHJlYWQgY2xlYXIgKi8KLSNkZWZpbmUgQVRDX1JFR19BVENfSU5UX1NUU19DTFIJCQkJIDB4MTEwMWMwCisjZGVmaW5lIEFUQ19SRUdfQVRDX0lOVF9TVFNfQ0xSCQkJCQkgMHgxMTAxYzAKKy8qIFtSVyA1XSBQYXJpdHkgbWFzayByZWdpc3RlciAjMCByZWFkL3dyaXRlICovCisjZGVmaW5lIEFUQ19SRUdfQVRDX1BSVFlfTUFTSwkJCQkJIDB4MTEwMWQ4CisvKiBbUkMgNV0gUGFyaXR5IHJlZ2lzdGVyICMwIHJlYWQgY2xlYXIgKi8KKyNkZWZpbmUgQVRDX1JFR19BVENfUFJUWV9TVFNfQ0xSCQkJCSAweDExMDFkMAogLyogW1JXIDE5XSBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAjMCByZWFkL3dyaXRlICovCiAjZGVmaW5lIEJSQjFfUkVHX0JSQjFfSU5UX01BU0sJCQkJCSAweDYwMTI4CiAvKiBbUiAxOV0gSW50ZXJydXB0IHJlZ2lzdGVyICMwIHJlYWQgKi8KQEAgLTU0LDE2ICs1OCwyMCBAQAogLyogW1JXIDEwXSBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGJlbG93IHdoaWNoIHRoZSBmdWxsIHNpZ25hbCB0byBjbGFzcyAwCiAgKiBpcyBhc3NlcnRlZCAqLwogI2RlZmluZSBCUkIxX1JFR19GVUxMXzBfWE9GRl9USFJFU0hPTERfMAkJCSAweDYwMWQwCi0vKiBbUlcgMTBdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvIGNsYXNzIDAKKyNkZWZpbmUgQlJCMV9SRUdfRlVMTF8wX1hPRkZfVEhSRVNIT0xEXzEJCQkgMHg2MDIzMAorLyogW1JXIDExXSBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGFib3ZlIHdoaWNoIHRoZSBmdWxsIHNpZ25hbCB0byBjbGFzcyAwCiAgKiBpcyBkZS1hc3NlcnRlZCAqLwogI2RlZmluZSBCUkIxX1JFR19GVUxMXzBfWE9OX1RIUkVTSE9MRF8wCQkJCSAweDYwMWQ0Ci0vKiBbUlcgMTBdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYmVsb3cgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvIGNsYXNzIDEKKyNkZWZpbmUgQlJCMV9SRUdfRlVMTF8wX1hPTl9USFJFU0hPTERfMQkJCQkgMHg2MDIzNAorLyogW1JXIDExXSBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGJlbG93IHdoaWNoIHRoZSBmdWxsIHNpZ25hbCB0byBjbGFzcyAxCiAgKiBpcyBhc3NlcnRlZCAqLwogI2RlZmluZSBCUkIxX1JFR19GVUxMXzFfWE9GRl9USFJFU0hPTERfMAkJCSAweDYwMWQ4Ci0vKiBbUlcgMTBdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvIGNsYXNzIDEKKyNkZWZpbmUgQlJCMV9SRUdfRlVMTF8xX1hPRkZfVEhSRVNIT0xEXzEJCQkgMHg2MDIzOAorLyogW1JXIDExXSBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGFib3ZlIHdoaWNoIHRoZSBmdWxsIHNpZ25hbCB0byBjbGFzcyAxCiAgKiBpcyBkZS1hc3NlcnRlZCAqLwogI2RlZmluZSBCUkIxX1JFR19GVUxMXzFfWE9OX1RIUkVTSE9MRF8wCQkJCSAweDYwMWRjCi0vKiBbUlcgMTBdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYmVsb3cgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvIHRoZSBMQgorI2RlZmluZSBCUkIxX1JFR19GVUxMXzFfWE9OX1RIUkVTSE9MRF8xCQkJCSAweDYwMjNjCisvKiBbUlcgMTFdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYmVsb3cgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvIHRoZSBMQgogICogcG9ydCBpcyBhc3NlcnRlZCAqLwogI2RlZmluZSBCUkIxX1JFR19GVUxMX0xCX1hPRkZfVEhSRVNIT0xECQkJCSAweDYwMWUwCiAvKiBbUlcgMTBdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvIHRoZSBMQgpAQCAtNzUsMTUgKzgzLDQ5IEBACiAvKiBbUlcgMTBdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYmVsb3cgd2hpY2ggdGhlIEhpZ2hfbGxmYyBzaWduYWwgdG8KICAgIGludGVyZmFjZSAjbiBpcyBhc3NlcnRlZC4gKi8KICNkZWZpbmUgQlJCMV9SRUdfSElHSF9MTEZDX0xPV19USFJFU0hPTERfMAkJCSAweDYwMTNjCi0vKiBbUlcgMjNdIExMIFJBTSBkYXRhLiAqLwotI2RlZmluZSBCUkIxX1JFR19MTF9SQU0gCQkJCQkgMHg2MTAwMAorLyogW1JXIDExXSBUaGUgbnVtYmVyIG9mIGJsb2NrcyBndWFyYW50aWVkIGZvciB0aGUgTEIgcG9ydCAqLworI2RlZmluZSBCUkIxX1JFR19MQl9HVUFSQU5USUVECQkJCQkgMHg2MDFlYworLyogW1JXIDExXSBUaGUgaHlzdGVyZXNpcyBvbiB0aGUgZ3VhcmFudGllZCBidWZmZXIgc3BhY2UgZm9yIHRoZSBMYiBwb3J0CisgKiBiZWZvcmUgc2lnbmFsaW5nIFhPTi4gKi8KKyNkZWZpbmUgQlJCMV9SRUdfTEJfR1VBUkFOVElFRF9IWVNUCQkJCSAweDYwMjY0CisvKiBbUlcgMjRdIExMIFJBTSBkYXRhLiAqLworI2RlZmluZSBCUkIxX1JFR19MTF9SQU0JCQkJCQkgMHg2MTAwMAogLyogW1JXIDEwXSBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGFib3ZlIHdoaWNoIHRoZSBMb3dfbGxmYyBzaWduYWwgdG8KICAgIGludGVyZmFjZSAjbiBpcyBkZS1hc3NlcnRlZC4gKi8KICNkZWZpbmUgQlJCMV9SRUdfTE9XX0xMRkNfSElHSF9USFJFU0hPTERfMAkJCSAweDYwMTZjCiAvKiBbUlcgMTBdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYmVsb3cgd2hpY2ggdGhlIExvd19sbGZjIHNpZ25hbCB0bwogICAgaW50ZXJmYWNlICNuIGlzIGFzc2VydGVkLiAqLwogI2RlZmluZSBCUkIxX1JFR19MT1dfTExGQ19MT1dfVEhSRVNIT0xEXzAJCQkgMHg2MDE1YwotLyogW1JXIDEwXSBUaGUgbnVtYmVyIG9mIGJsb2NrcyBndWFyYW50aWVkIGZvciB0aGUgTUFDIHBvcnQgKi8KKy8qIFtSVyAxMV0gVGhlIG51bWJlciBvZiBibG9ja3MgZ3VhcmFudGllZCBmb3IgY2xhc3MgMCBpbiBNQUMgMC4gVGhlCisgKiByZWdpc3RlciBpcyBhcHBsaWNhYmxlIG9ubHkgd2hlbiBwZXJfY2xhc3NfZ3VhcmFudHlfbW9kZSBpcyBzZXQuICovCisjZGVmaW5lIEJSQjFfUkVHX01BQ18wX0NMQVNTXzBfR1VBUkFOVElFRAkJCSAweDYwMjQ0CisvKiBbUlcgMTFdIFRoZSBoeXN0ZXJlc2lzIG9uIHRoZSBndWFyYW50aWVkIGJ1ZmZlciBzcGFjZSBmb3IgY2xhc3MgMCBpbiBNQUMKKyAqIDEgYmVmb3JlIHNpZ25hbGluZyBYT04uIFRoZSByZWdpc3RlciBpcyBhcHBsaWNhYmxlIG9ubHkgd2hlbgorICogcGVyX2NsYXNzX2d1YXJhbnR5X21vZGUgaXMgc2V0LiAqLworI2RlZmluZSBCUkIxX1JFR19NQUNfMF9DTEFTU18wX0dVQVJBTlRJRURfSFlTVAkJCSAweDYwMjU0CisvKiBbUlcgMTFdIFRoZSBudW1iZXIgb2YgYmxvY2tzIGd1YXJhbnRpZWQgZm9yIGNsYXNzIDEgaW4gTUFDIDAuIFRoZQorICogcmVnaXN0ZXIgaXMgYXBwbGljYWJsZSBvbmx5IHdoZW4gcGVyX2NsYXNzX2d1YXJhbnR5X21vZGUgaXMgc2V0LiAqLworI2RlZmluZSBCUkIxX1JFR19NQUNfMF9DTEFTU18xX0dVQVJBTlRJRUQJCQkgMHg2MDI0OAorLyogW1JXIDExXSBUaGUgaHlzdGVyZXNpcyBvbiB0aGUgZ3VhcmFudGllZCBidWZmZXIgc3BhY2UgZm9yIGNsYXNzIDFpbiBNQUMgMAorICogYmVmb3JlIHNpZ25hbGluZyBYT04uIFRoZSByZWdpc3RlciBpcyBhcHBsaWNhYmxlIG9ubHkgd2hlbgorICogcGVyX2NsYXNzX2d1YXJhbnR5X21vZGUgaXMgc2V0LiAqLworI2RlZmluZSBCUkIxX1JFR19NQUNfMF9DTEFTU18xX0dVQVJBTlRJRURfSFlTVAkJCSAweDYwMjU4CisvKiBbUlcgMTFdIFRoZSBudW1iZXIgb2YgYmxvY2tzIGd1YXJhbnRpZWQgZm9yIGNsYXNzIDBpbiBNQUMxLlRoZSByZWdpc3RlcgorICogaXMgYXBwbGljYWJsZSBvbmx5IHdoZW4gcGVyX2NsYXNzX2d1YXJhbnR5X21vZGUgaXMgc2V0LiAqLworI2RlZmluZSBCUkIxX1JFR19NQUNfMV9DTEFTU18wX0dVQVJBTlRJRUQJCQkgMHg2MDI0YworLyogW1JXIDExXSBUaGUgaHlzdGVyZXNpcyBvbiB0aGUgZ3VhcmFudGllZCBidWZmZXIgc3BhY2UgZm9yIGNsYXNzIDAgaW4gTUFDCisgKiAxIGJlZm9yZSBzaWduYWxpbmcgWE9OLiBUaGUgcmVnaXN0ZXIgaXMgYXBwbGljYWJsZSBvbmx5IHdoZW4KKyAqIHBlcl9jbGFzc19ndWFyYW50eV9tb2RlIGlzIHNldC4gKi8KKyNkZWZpbmUgQlJCMV9SRUdfTUFDXzFfQ0xBU1NfMF9HVUFSQU5USUVEX0hZU1QJCQkgMHg2MDI1YworLyogW1JXIDExXSBUaGUgbnVtYmVyIG9mIGJsb2NrcyBndWFyYW50aWVkIGZvciBjbGFzcyAxIGluIE1BQyAxLiBUaGUKKyAqIHJlZ2lzdGVyIGlzIGFwcGxpY2FibGUgb25seSB3aGVuIHBlcl9jbGFzc19ndWFyYW50eV9tb2RlIGlzIHNldC4gKi8KKyNkZWZpbmUgQlJCMV9SRUdfTUFDXzFfQ0xBU1NfMV9HVUFSQU5USUVECQkJIDB4NjAyNTAKKy8qIFtSVyAxMV0gVGhlIGh5c3RlcmVzaXMgb24gdGhlIGd1YXJhbnRpZWQgYnVmZmVyIHNwYWNlIGZvciBjbGFzcyAxIGluIE1BQworICogMSBiZWZvcmUgc2lnbmFsaW5nIFhPTi4gVGhlIHJlZ2lzdGVyIGlzIGFwcGxpY2FibGUgb25seSB3aGVuCisgKiBwZXJfY2xhc3NfZ3VhcmFudHlfbW9kZSBpcyBzZXQuICovCisjZGVmaW5lIEJSQjFfUkVHX01BQ18xX0NMQVNTXzFfR1VBUkFOVElFRF9IWVNUCQkJIDB4NjAyNjAKKy8qIFtSVyAxMV0gVGhlIG51bWJlciBvZiBibG9ja3MgZ3VhcmFudGllZCBmb3IgdGhlIE1BQyBwb3J0LiBUaGUgcmVnaXN0ZXIgaXMKKyAqIGFwcGxpY2FibGUgb25seSB3aGVuIHBlcl9jbGFzc19ndWFyYW50eV9tb2RlIGlzIHJlc2V0LiAqLwogI2RlZmluZSBCUkIxX1JFR19NQUNfR1VBUkFOVElFRF8wCQkJCSAweDYwMWU4CiAjZGVmaW5lIEJSQjFfUkVHX01BQ19HVUFSQU5USUVEXzEJCQkJIDB4NjAyNDAKIC8qIFtSIDI0XSBUaGUgbnVtYmVyIG9mIGZ1bGwgYmxvY2tzLiAqLwpAQCAtMTAwLDE1ICsxNDIsMTkgQEAKIC8qIFtSVyAxMF0gVGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBiZWxvdyB3aGljaCB0aGUgcGF1c2Ugc2lnbmFsIHRvIGNsYXNzIDAKICAqIGlzIGFzc2VydGVkICovCiAjZGVmaW5lIEJSQjFfUkVHX1BBVVNFXzBfWE9GRl9USFJFU0hPTERfMAkJCSAweDYwMWMwCi0vKiBbUlcgMTBdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIHBhdXNlIHNpZ25hbCB0byBjbGFzcyAwCisjZGVmaW5lIEJSQjFfUkVHX1BBVVNFXzBfWE9GRl9USFJFU0hPTERfMQkJCSAweDYwMjIwCisvKiBbUlcgMTFdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIHBhdXNlIHNpZ25hbCB0byBjbGFzcyAwCiAgKiBpcyBkZS1hc3NlcnRlZCAqLwogI2RlZmluZSBCUkIxX1JFR19QQVVTRV8wX1hPTl9USFJFU0hPTERfMAkJCSAweDYwMWM0Ci0vKiBbUlcgMTBdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYmVsb3cgd2hpY2ggdGhlIHBhdXNlIHNpZ25hbCB0byBjbGFzcyAxCisjZGVmaW5lIEJSQjFfUkVHX1BBVVNFXzBfWE9OX1RIUkVTSE9MRF8xCQkJIDB4NjAyMjQKKy8qIFtSVyAxMV0gVGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBiZWxvdyB3aGljaCB0aGUgcGF1c2Ugc2lnbmFsIHRvIGNsYXNzIDEKICAqIGlzIGFzc2VydGVkICovCiAjZGVmaW5lIEJSQjFfUkVHX1BBVVNFXzFfWE9GRl9USFJFU0hPTERfMAkJCSAweDYwMWM4Ci0vKiBbUlcgMTBdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIHBhdXNlIHNpZ25hbCB0byBjbGFzcyAxCisjZGVmaW5lIEJSQjFfUkVHX1BBVVNFXzFfWE9GRl9USFJFU0hPTERfMQkJCSAweDYwMjI4CisvKiBbUlcgMTFdIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIHBhdXNlIHNpZ25hbCB0byBjbGFzcyAxCiAgKiBpcyBkZS1hc3NlcnRlZCAqLwogI2RlZmluZSBCUkIxX1JFR19QQVVTRV8xX1hPTl9USFJFU0hPTERfMAkJCSAweDYwMWNjCisjZGVmaW5lIEJSQjFfUkVHX1BBVVNFXzFfWE9OX1RIUkVTSE9MRF8xCQkJIDB4NjAyMmMKIC8qIFtSVyAxMF0gV3JpdGUgY2xpZW50IDA6IERlLWFzc2VydCBwYXVzZSB0aHJlc2hvbGQuIE5vdCBGdW5jdGlvbmFsICovCiAjZGVmaW5lIEJSQjFfUkVHX1BBVVNFX0hJR0hfVEhSRVNIT0xEXzAgCQkJIDB4NjAwNzgKICNkZWZpbmUgQlJCMV9SRUdfUEFVU0VfSElHSF9USFJFU0hPTERfMSAJCQkgMHg2MDA3YwpAQCAtMzI1LDcgKzM3MSw3IEBACiAgICBtZWNoYW5pc20uIFRoZSBmaWVsZHMgYXJlOiBbNTowXSAtIG1lc3NhZ2UgbGVuZ3RoOyBbMTI6Nl0gLSBtZXNzYWdlCiAgICBwb2ludGVyOyAxODoxM10gLSBuZXh0IHBvaW50ZXIuICovCiAjZGVmaW5lIENDTV9SRUdfWFhfREVTQ1JfVEFCTEUJCQkJCSAweGQwMzAwCi0jZGVmaW5lIENDTV9SRUdfWFhfREVTQ1JfVEFCTEVfU0laRQkJCQkgMzYKKyNkZWZpbmUgQ0NNX1JFR19YWF9ERVNDUl9UQUJMRV9TSVpFCQkJCSAyNAogLyogW1IgN10gVXNlZCB0byByZWFkIHRoZSB2YWx1ZSBvZiBYWCBwcm90ZWN0aW9uIEZyZWUgY291bnRlci4gKi8KICNkZWZpbmUgQ0NNX1JFR19YWF9GUkVFIAkJCQkJIDB4ZDAxODQKIC8qIFtSVyA2XSBJbml0aWFsIHZhbHVlIGZvciB0aGUgY3JlZGl0IGNvdW50ZXI7IHJlc3BvbnNpYmxlIGZvciBmdWxmaWxsaW5nCkBAIC00MjIsNiArNDY4LDcgQEAKICNkZWZpbmUgQ0ZDX1JFR19OVU1fTENJRFNfQUxMT0MgCQkJCSAweDEwNDAyMAogLyogW1IgOV0gTnVtYmVyIG9mIEFycml2aW5nIExDSURzIGluIExpbmsgTGlzdCBCbG9jayAqLwogI2RlZmluZSBDRkNfUkVHX05VTV9MQ0lEU19BUlJJVklORwkJCQkgMHgxMDQwMDQKKyNkZWZpbmUgQ0ZDX1JFR19OVU1fTENJRFNfSU5TSURFX1BGCQkJCSAweDEwNDEyMAogLyogW1IgOV0gTnVtYmVyIG9mIExlYXZpbmcgTENJRHMgaW4gTGluayBMaXN0IEJsb2NrICovCiAjZGVmaW5lIENGQ19SRUdfTlVNX0xDSURTX0xFQVZJTkcJCQkJIDB4MTA0MDE4CiAjZGVmaW5lIENGQ19SRUdfV0VBS19FTkFCTEVfUEYJCQkJCSAweDEwNDEyNApAQCAtNzgzLDYgKzgzMCw3IEBACiAvKiBbUlcgM10gVGhlIG51bWJlciBvZiBzaW11bHRhbmVvdXMgb3V0c3RhbmRpbmcgcmVxdWVzdHMgdG8gQ29udGV4dCBGZXRjaAogICAgSW50ZXJmYWNlLiAqLwogI2RlZmluZSBET1JRX1JFR19PVVRTVF9SRVEJCQkJCSAweDE3MDAzYworI2RlZmluZSBET1JRX1JFR19QRl9VU0FHRV9DTlQJCQkJCSAweDE3MDFkMAogI2RlZmluZSBET1JRX1JFR19SRUdOCQkJCQkJIDB4MTcwMDM4CiAvKiBbUiA0XSBDdXJyZW50IHZhbHVlIG9mIHJlc3BvbnNlIEEgY291bnRlciBjcmVkaXQuIEluaXRpYWwgY3JlZGl0IGlzCiAgICBjb25maWd1cmVkIHRocm91Z2ggd3JpdGUgdG8gfmRvcnFfcmVnaXN0ZXJzX3JzcF9pbml0X2NyZC5yc3BfaW5pdF9jcmQKQEAgLTgwMiwxMCArODUwLDEyIEBACiAvKiBbUlcgMjhdIFRDTSBIZWFkZXIgd2hlbiBib3RoIFVMUCBhbmQgVENQIGNvbnRleHQgaXMgbG9hZGVkLiAqLwogI2RlZmluZSBET1JRX1JFR19TSFJUX0NNSEVBRAkJCQkJIDB4MTcwMDU0CiAjZGVmaW5lIEhDX0NPTkZJR18wX1JFR19BVFROX0JJVF9FTl8wCQkJCSAoMHgxPDw0KQorI2RlZmluZSBIQ19DT05GSUdfMF9SRUdfQkxPQ0tfRElTQUJMRV8wCQkJCSAoMHgxPDwwKQogI2RlZmluZSBIQ19DT05GSUdfMF9SRUdfSU5UX0xJTkVfRU5fMAkJCQkgKDB4MTw8MykKICNkZWZpbmUgSENfQ09ORklHXzBfUkVHX01TSV9BVFROX0VOXzAJCQkJICgweDE8PDcpCiAjZGVmaW5lIEhDX0NPTkZJR18wX1JFR19NU0lfTVNJWF9JTlRfRU5fMAkJCSAoMHgxPDwyKQotI2RlZmluZSBIQ19DT05GSUdfMF9SRUdfU0lOR0xFX0lTUl9FTl8wIAkJCSAoMHgxPDwxKQorI2RlZmluZSBIQ19DT05GSUdfMF9SRUdfU0lOR0xFX0lTUl9FTl8wCQkJCSAoMHgxPDwxKQorI2RlZmluZSBIQ19DT05GSUdfMV9SRUdfQkxPQ0tfRElTQUJMRV8xCQkJCSAoMHgxPDwwKQogI2RlZmluZSBIQ19SRUdfQUdHX0lOVF8wCQkJCQkgMHgxMDgwNTAKICNkZWZpbmUgSENfUkVHX0FHR19JTlRfMQkJCQkJIDB4MTA4MDU0CiAjZGVmaW5lIEhDX1JFR19BVFROX0JJVCAJCQkJCSAweDEwODEyMApAQCAtODQ0LDYgKzg5NCw3IEBACiAjZGVmaW5lIEhDX1JFR19WUUlEXzAJCQkJCQkgMHgxMDgwMDgKICNkZWZpbmUgSENfUkVHX1ZRSURfMQkJCQkJCSAweDEwODAwYwogI2RlZmluZSBJR1VfQkxPQ0tfQ09ORklHVVJBVElPTl9SRUdfQkFDS1dBUkRfQ09NUF9FTgkJICgweDE8PDEpCisjZGVmaW5lIElHVV9CTE9DS19DT05GSUdVUkFUSU9OX1JFR19CTE9DS19FTkFCTEUJCSAoMHgxPDwwKQogI2RlZmluZSBJR1VfUkVHX0FUVEVOVElPTl9BQ0tfQklUUwkJCQkgMHgxMzAxMDgKIC8qIFtSIDRdIERlYnVnOiBhdHRuX2ZzbSAqLwogI2RlZmluZSBJR1VfUkVHX0FUVE5fRlNNCQkJCQkgMHgxMzAwNTQKQEAgLTkzMyw2ICs5ODQsMTQgQEAKICAqIGNsZWFyOyAxID0gc2V0LiBEYXRhIHZhbGlkIG9ubHkgaW4gYWRkcmVzc2VzIDAtNC4gYWxsIHRoZSByZXN0IGFyZSB6ZXJvLiAqLwogI2RlZmluZSBJR1VfUkVHX1dSSVRFX0RPTkVfUEVORElORwkJCQkgMHgxMzA0ODAKICNkZWZpbmUgTUNQX0FfUkVHX01DUFJfU0NSQVRDSAkJCQkJIDB4M2EwMDAwCisjZGVmaW5lIE1DUF9SRUdfTUNQUl9DUFVfUFJPR1JBTV9DT1VOVEVSCQkJIDB4ODUwMWMKKyNkZWZpbmUgTUNQX1JFR19NQ1BSX0dQX0lOUFVUUwkJCQkJIDB4ODAwYzAKKyNkZWZpbmUgTUNQX1JFR19NQ1BSX0dQX09FTkFCTEUJCQkJCSAweDgwMGM4CisjZGVmaW5lIE1DUF9SRUdfTUNQUl9HUF9PVVRQVVRTCQkJCQkgMHg4MDBjNAorI2RlZmluZSBNQ1BfUkVHX01DUFJfSU1DX0NPTU1BTkQJCQkJIDB4ODU5MDAKKyNkZWZpbmUgTUNQX1JFR19NQ1BSX0lNQ19EQVRBUkVHMAkJCQkgMHg4NTkyMAorI2RlZmluZSBNQ1BfUkVHX01DUFJfSU1DX1NMQVZFX0NPTlRST0wJCQkJIDB4ODU5MDQKKyNkZWZpbmUgTUNQX1JFR19NQ1BSX0NQVV9QUk9HUkFNX0NPVU5URVIJCQkgMHg4NTAxYwogI2RlZmluZSBNQ1BfUkVHX01DUFJfTlZNX0FDQ0VTU19FTkFCTEUJCQkJIDB4ODY0MjQKICNkZWZpbmUgTUNQX1JFR19NQ1BSX05WTV9BRERSCQkJCQkgMHg4NjQwYwogI2RlZmluZSBNQ1BfUkVHX01DUFJfTlZNX0NGRzQJCQkJCSAweDg2NDJjCkBAIC0xNDI5LDExICsxNDg4LDM3IEBACiAvKiBbUlcgMV0gZTFobWYgZm9yIFdPTC4gSWYgY2xyIFdPTCBzaWduYWwgbyB0aGUgUFhQIHdpbGwgYmUgc2VuZCBvbiBiaXQgMAogICAgb25seS4gKi8KICNkZWZpbmUgTUlTQ19SRUdfRTFITUZfTU9ERQkJCQkJIDB4YTVmOAorLyogW1IgMV0gU3RhdHVzIG9mIGZvdXIgcG9ydCBtb2RlIHBhdGggc3dhcCBpbnB1dCBwaW4uICovCisjZGVmaW5lIE1JU0NfUkVHX0ZPVVJfUE9SVF9QQVRIX1NXQVAJCQkJIDB4YTc1YworLyogW1JXIDJdIDQgcG9ydCBwYXRoIHN3YXAgb3ZlcndyaXRlLlswXSAtIE92ZXJ3cml0ZSBjb250cm9sOyBpZiBpdCBpcyAwIC0KKyAgIHRoZSBwYXRoX3N3YXAgb3V0cHV0IGlzIGVxdWFsIHRvIDQgcG9ydCBtb2RlIHBhdGggc3dhcCBpbnB1dCBwaW47IGlmIGl0CisgICBpcyAxIC0gdGhlIHBhdGhfc3dhcCBvdXRwdXQgaXMgZXF1YWwgdG8gYml0WzFdIG9mIHRoaXMgcmVnaXN0ZXI7IFsxXSAtCisgICBPdmVyd3JpdGUgdmFsdWUuIElmIGJpdFswXSBvZiB0aGlzIHJlZ2lzdGVyIGlzIDEgdGhpcyBpcyB0aGUgdmFsdWUgdGhhdAorICAgcmVjZWl2ZXMgdGhlIHBhdGhfc3dhcCBvdXRwdXQuIFJlc2V0IG9uIEhhcmQgcmVzZXQuICovCisjZGVmaW5lIE1JU0NfUkVHX0ZPVVJfUE9SVF9QQVRIX1NXQVBfT1ZXUgkJCSAweGE3MzgKKy8qIFtSIDFdIFN0YXR1cyBvZiA0IHBvcnQgbW9kZSBwb3J0IHN3YXAgaW5wdXQgcGluLiAqLworI2RlZmluZSBNSVNDX1JFR19GT1VSX1BPUlRfUE9SVF9TV0FQCQkJCSAweGE3NTQKKy8qIFtSVyAyXSA0IHBvcnQgcG9ydCBzd2FwIG92ZXJ3cml0ZS5bMF0gLSBPdmVyd3JpdGUgY29udHJvbDsgaWYgaXQgaXMgMCAtCisgICB0aGUgcG9ydF9zd2FwIG91dHB1dCBpcyBlcXVhbCB0byA0IHBvcnQgbW9kZSBwb3J0IHN3YXAgaW5wdXQgcGluOyBpZiBpdAorICAgaXMgMSAtIHRoZSBwb3J0X3N3YXAgb3V0cHV0IGlzIGVxdWFsIHRvIGJpdFsxXSBvZiB0aGlzIHJlZ2lzdGVyOyBbMV0gLQorICAgT3ZlcndyaXRlIHZhbHVlLiBJZiBiaXRbMF0gb2YgdGhpcyByZWdpc3RlciBpcyAxIHRoaXMgaXMgdGhlIHZhbHVlIHRoYXQKKyAgIHJlY2VpdmVzIHRoZSBwb3J0X3N3YXAgb3V0cHV0LiBSZXNldCBvbiBIYXJkIHJlc2V0LiAqLworI2RlZmluZSBNSVNDX1JFR19GT1VSX1BPUlRfUE9SVF9TV0FQX09WV1IJCQkgMHhhNzM0CiAvKiBbUlcgMzJdIERlYnVnIG9ubHk6IHNwYXJlIFJXIHJlZ2lzdGVyIHJlc2V0IGJ5IGNvcmUgcmVzZXQgKi8KICNkZWZpbmUgTUlTQ19SRUdfR0VORVJJQ19DUl8wCQkJCQkgMHhhNDYwCiAjZGVmaW5lIE1JU0NfUkVHX0dFTkVSSUNfQ1JfMQkJCQkJIDB4YTQ2NAogLyogW1JXIDMyXSBEZWJ1ZyBvbmx5OiBzcGFyZSBSVyByZWdpc3RlciByZXNldCBieSBwb3IgcmVzZXQgKi8KICNkZWZpbmUgTUlTQ19SRUdfR0VORVJJQ19QT1JfMQkJCQkJIDB4YTQ3NAorLyogW1JXIDMyXSBCaXRbMF06IEVQSU8gTU9ERSBTRUw6IFNldHRpbmcgdGhpcyBiaXQgdG8gMSB3aWxsIGFsbG93IFNXL0ZXIHRvCisgICB1c2UgYWxsIG9mIHRoZSAzMiBFeHRlbmRlZCBHUElPIHBpbnMuIFdpdGhvdXQgc2V0dGluZyB0aGlzIGJpdDsgYW4gRVBJTworICAgY2FuIG5vdCBiZSBjb25maWd1cmVkIGFzIGFuIG91dHB1dC4gRWFjaCBvdXRwdXQgaGFzIGl0cyBvdXRwdXQgZW5hYmxlIGluCisgICB0aGUgTUNQIHJlZ2lzdGVyIHNwYWNlOyBidXQgdGhpcyBiaXQgbmVlZHMgdG8gYmUgc2V0IHRvIG1ha2UgdXNlIG9mIHRoYXQuCisgICBCaXRbMzoxXSBzcGFyZS4gQml0WzRdOiBXQ1ZUTU9OX1BXUkROOiBQb3dlcmRvd24gZm9yIFdhcnBjb3JlIFZUTU9OLiBXaGVuCisgICBzZXQgdG8gMSAtIFBvd2VyZG93bi4gQml0WzVdOiBXQ1ZUTU9OX1JFU0VUQjogUmVzZXQgZm9yIFdhcnBjb3JlIFZUTU9OLgorICAgV2hlbiBzZXQgdG8gMCAtIHZUTU9OIGlzIGluIHJlc2V0LiBCaXRbNl06IHNldHRpbmcgdGhpcyBiaXQgd2lsbCBjaGFuZ2UKKyAgIHRoZSBpL28gdG8gYW4gb3V0cHV0IGFuZCB3aWxsIGRyaXZlIHRoZSBUaW1lU3luYyBvdXRwdXQuIEJpdFszMTo3XToKKyAgIHNwYXJlLiBHbG9iYWwgcmVnaXN0ZXIuIFJlc2V0IGJ5IGhhcmQgcmVzZXQuICovCisjZGVmaW5lIE1JU0NfUkVHX0dFTl9QVVJQX0hXRwkJCQkJIDB4YTlhMAogLyogW1JXIDMyXSBHUElPLiBbMzEtMjhdIEZMT0FUIHBvcnQgMDsgWzI3LTI0XSBGTE9BVCBwb3J0IDA7IFdoZW4gYW55IG9mCiAgICB0aGVzZSBiaXRzIGlzIHdyaXR0ZW4gYXMgYSAnMSc7IHRoZSBjb3JyZXNwb25kaW5nIFNQSU8gYml0IHdpbGwgdHVybiBvZmYKICAgIGl0J3MgZHJpdmVycyBhbmQgYmVjb21lIGFuIGlucHV0LiBUaGlzIGlzIHRoZSByZXNldCBzdGF0ZSBvZiBhbGwgR1BJTwpAQCAtMTYzNiw2ICsxNzIxLDE0IEBACiAgICBpbiB0aGlzIHJlZ2lzdGVyLiBhZGRyZXNzIDAgLSB0aW1lciAxOyBhZGRyZXNzIDEgLSB0aW1lciAyLCAuLi4gIGFkZHJlc3MgNyAtCiAgICB0aW1lciA4ICovCiAjZGVmaW5lIE1JU0NfUkVHX1NXX1RJTUVSX1ZBTAkJCQkJIDB4YTVjMAorLyogW1IgMV0gU3RhdHVzIG9mIHR3byBwb3J0IG1vZGUgcGF0aCBzd2FwIGlucHV0IHBpbi4gKi8KKyNkZWZpbmUgTUlTQ19SRUdfVFdPX1BPUlRfUEFUSF9TV0FQCQkJCSAweGE3NTgKKy8qIFtSVyAyXSAyIHBvcnQgc3dhcCBvdmVyd3JpdGUuWzBdIC0gT3ZlcndyaXRlIGNvbnRyb2w7IGlmIGl0IGlzIDAgLSB0aGUKKyAgIHBhdGhfc3dhcCBvdXRwdXQgaXMgZXF1YWwgdG8gMiBwb3J0IG1vZGUgcGF0aCBzd2FwIGlucHV0IHBpbjsgaWYgaXQgaXMgMQorICAgLSB0aGUgcGF0aF9zd2FwIG91dHB1dCBpcyBlcXVhbCB0byBiaXRbMV0gb2YgdGhpcyByZWdpc3RlcjsgWzFdIC0KKyAgIE92ZXJ3cml0ZSB2YWx1ZS4gSWYgYml0WzBdIG9mIHRoaXMgcmVnaXN0ZXIgaXMgMSB0aGlzIGlzIHRoZSB2YWx1ZSB0aGF0CisgICByZWNlaXZlcyB0aGUgcGF0aF9zd2FwIG91dHB1dC4gUmVzZXQgb24gSGFyZCByZXNldC4gKi8KKyNkZWZpbmUgTUlTQ19SRUdfVFdPX1BPUlRfUEFUSF9TV0FQX09WV1IJCQkgMHhhNzJjCiAvKiBbUlcgMV0gU2V0IGJ5IHRoZSBNQ1AgdG8gcmVtZW1iZXIgaWYgb25lIG9yIG1vcmUgb2YgdGhlIGRyaXZlcnMgaXMvYXJlCiAgICBsb2FkZWQ7IDAtcHJlcGFyZTsgLXVucHJlcGFyZSAqLwogI2RlZmluZSBNSVNDX1JFR19VTlBSRVBBUkVECQkJCQkgMHhhNDI0CkBAIC0xNjQ0LDYgKzE3MzcsMzYgQEAKICNkZWZpbmUgTklHX0xMSDBfQlJCMV9EUlZfTUFTS19SRUdfTExIMF9CUkIxX0RSVl9NQVNLX05PX1ZMQU4JICgweDE8PDQpCiAjZGVmaW5lIE5JR19MTEgwX0JSQjFfRFJWX01BU0tfUkVHX0xMSDBfQlJCMV9EUlZfTUFTS19VTkNTVAkgKDB4MTw8MikKICNkZWZpbmUgTklHX0xMSDBfQlJCMV9EUlZfTUFTS19SRUdfTExIMF9CUkIxX0RSVl9NQVNLX1ZMQU4JICgweDE8PDMpCisvKiBbUlcgNV0gTURJTyBQSFkgQWRkcmVzcy4gVGhlIFdDIHVzZXMgdGhpcyBhZGRyZXNzIHRvIGRldGVybWluZSB3aGV0aGVyIG9yCisgKiBub3QgaXQgaXMgdGhlIHJlY2lwaWVudCBvZiB0aGUgbWVzc2FnZSBvbiB0aGUgTURJTyBpbnRlcmZhY2UuIFRoZSB2YWx1ZQorICogaXMgY29tcGFyZWQgdG8gdGhlIHZhbHVlIG9uIGN0cmxfbWRfZGV2YWQuIERyaXZlcyBvdXRwdXQKKyAqIG1pc2NfeGd4czBfcGh5X2FkZHIuIEdsb2JhbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUlTQ19SRUdfV0MwX0NUUkxfUEhZX0FERFIJCQkJIDB4YTljYworLyogW1JXIDJdIFhNQUMgQ29yZSBwb3J0IG1vZGUuIEluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHBvcnRzIG9uIHRoZSBzeXN0ZW0KKyAgIHNpZGUuIFRoaXMgc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwaHlfcG9ydF9tb2RlOyBpZiBzb21lIG9mIHRoZQorICAgcG9ydHMgYXJlIG5vdCB1c2VkLiBUaGlzIGVuYWJsZXMgcmVkdWN0aW9uIG9mIGZyZXF1ZW5jeSBvbiB0aGUgY29yZSBzaWRlLgorICAgVGhpcyBpcyBhIHN0cmFwIGlucHV0IGZvciB0aGUgWE1BQ19NUCBjb3JlLiAwMCAtIFNpbmdsZSBQb3J0IE1vZGU7IDAxIC0KKyAgIER1YWwgUG9ydCBNb2RlOyAxMCAtIFRyaSBQb3J0IE1vZGU7IDExIC0gUXVhZCBQb3J0IE1vZGUuIFRoaXMgaXMgYSBzdHJhcAorICAgaW5wdXQgZm9yIHRoZSBYTUFDX01QIGNvcmU7IGFuZCBzaG91bGQgYmUgY2hhbmdlZCBvbmx5IHdoaWxlIHJlc2V0IGlzCisgICBoZWxkIGxvdy4gUmVzZXQgb24gSGFyZCByZXNldC4gKi8KKyNkZWZpbmUgTUlTQ19SRUdfWE1BQ19DT1JFX1BPUlRfTU9ERQkJCQkgMHhhOTY0CisvKiBbUlcgMl0gWE1BQyBQSFkgcG9ydCBtb2RlLiBJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBwb3J0cyBvbiB0aGUgV2FycAorICAgQ29yZS4gVGhpcyBpcyBhIHN0cmFwIGlucHV0IGZvciB0aGUgWE1BQ19NUCBjb3JlLiAwMCAtIFNpbmdsZSBQb3J0IE1vZGU7CisgICAwMSAtIER1YWwgUG9ydCBNb2RlOyAxeCAtIFF1YWQgUG9ydCBNb2RlOyBUaGlzIGlzIGEgc3RyYXAgaW5wdXQgZm9yIHRoZQorICAgWE1BQ19NUCBjb3JlOyBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgb25seSB3aGlsZSByZXNldCBpcyBoZWxkIGxvdy4gUmVzZXQKKyAgIG9uIEhhcmQgcmVzZXQuICovCisjZGVmaW5lIE1JU0NfUkVHX1hNQUNfUEhZX1BPUlRfTU9ERQkJCQkgMHhhOTYwCisvKiBbUlcgMzJdIDEgWzQ3XSBQYWNrZXQgU2l6ZSA9IDY0IFdyaXRlIHRvIHRoaXMgcmVnaXN0ZXIgd3JpdGUgYml0cyAzMTowLgorICogUmVhZHMgZnJvbSB0aGlzIHJlZ2lzdGVyIHdpbGwgY2xlYXIgYml0cyAzMTowLiAqLworI2RlZmluZSBNU1RBVF9SRUdfUlhfU1RBVF9HUjY0X0xPCQkJCSAweDIwMAorLyogW1JXIDMyXSAxIFswMF0gVHggR29vZCBQYWNrZXQgQ291bnQgV3JpdGUgdG8gdGhpcyByZWdpc3RlciB3cml0ZSBiaXRzCisgKiAzMTowLiBSZWFkcyBmcm9tIHRoaXMgcmVnaXN0ZXIgd2lsbCBjbGVhciBiaXRzIDMxOjAuICovCisjZGVmaW5lIE1TVEFUX1JFR19UWF9TVEFUX0dUWFBPS19MTwkJCQkgMAorI2RlZmluZSBOSUdfTExIMF9CUkIxX0RSVl9NQVNLX1JFR19MTEgwX0JSQjFfRFJWX01BU0tfQlJDU1QJICgweDE8PDApCisjZGVmaW5lIE5JR19MTEgwX0JSQjFfRFJWX01BU0tfUkVHX0xMSDBfQlJCMV9EUlZfTUFTS19NTENTVAkgKDB4MTw8MSkKKyNkZWZpbmUgTklHX0xMSDBfQlJCMV9EUlZfTUFTS19SRUdfTExIMF9CUkIxX0RSVl9NQVNLX05PX1ZMQU4JICgweDE8PDQpCisjZGVmaW5lIE5JR19MTEgwX0JSQjFfRFJWX01BU0tfUkVHX0xMSDBfQlJCMV9EUlZfTUFTS19VTkNTVAkgKDB4MTw8MikKKyNkZWZpbmUgTklHX0xMSDBfQlJCMV9EUlZfTUFTS19SRUdfTExIMF9CUkIxX0RSVl9NQVNLX1ZMQU4JICgweDE8PDMpCiAjZGVmaW5lIE5JR19MTEgwX1hDTV9NQVNLX1JFR19MTEgwX1hDTV9NQVNLX0JDTgkJCSAoMHgxPDwwKQogI2RlZmluZSBOSUdfTExIMV9YQ01fTUFTS19SRUdfTExIMV9YQ01fTUFTS19CQ04JCQkgKDB4MTw8MCkKICNkZWZpbmUgTklHX01BU0tfSU5URVJSVVBUX1BPUlQwX1JFR19NQVNLX0VNQUMwX01JU0NfTUlfSU5UCSAoMHgxPDwwKQpAQCAtMTgzNyw2ICsxOTYwLDEwIEBACiAjZGVmaW5lIE5JR19SRUdfTExIMV9GVU5DX01FTQkJCQkJIDB4MTYxYzAKICNkZWZpbmUgTklHX1JFR19MTEgxX0ZVTkNfTUVNX0VOQUJMRQkJCQkgMHgxNjE2MAogI2RlZmluZSBOSUdfUkVHX0xMSDFfRlVOQ19NRU1fU0laRQkJCQkgMTYKKy8qIFtSVyAxXSBXaGVuIHRoaXMgYml0IGlzIHNldDsgdGhlIExMSCB3aWxsIGNsYXNzaWZ5IHRoZSBwYWNrZXQgYmVmb3JlCisgKiBzZW5kaW5nIGl0IHRvIHRoZSBCUkIgb3IgY2FsY3VsYXRpbmcgV29MIG9uIGl0LiBUaGlzIGJpdCBjb250cm9scyBwb3J0IDEKKyAqIG9ubHkuIFRoZSBsZWdhY3kgbGxoX211bHRpX2Z1bmN0aW9uX21vZGUgYml0IGNvbnRyb2xzIHBvcnQgMC4gKi8KKyNkZWZpbmUgTklHX1JFR19MTEgxX01GX01PREUJCQkJCSAweDE4NjE0CiAvKiBbUlcgOF0gaW5pdCBjcmVkaXQgY291bnRlciBmb3IgcG9ydDEgaW4gTExIICovCiAjZGVmaW5lIE5JR19SRUdfTExIMV9YQ01fSU5JVF9DUkVESVQJCQkJIDB4MTA1NjQKICNkZWZpbmUgTklHX1JFR19MTEgxX1hDTV9NQVNLCQkJCQkgMHgxMDEzNApAQCAtMTg1OCwxMSArMTk4NSwyNSBAQAogLyogW1IgMzJdIEludGVycnVwdCByZWdpc3RlciAjMCByZWFkICovCiAjZGVmaW5lIE5JR19SRUdfTklHX0lOVF9TVFNfMAkJCQkJIDB4MTAzYjAKICNkZWZpbmUgTklHX1JFR19OSUdfSU5UX1NUU18xCQkJCQkgMHgxMDNjMAorLyogW1IgMzJdIExlZ2FjeSBFMSBhbmQgRTFIIGxvY2F0aW9uIGZvciBwYXJpdHkgZXJyb3IgbWFzayByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTklHX1JFR19OSUdfUFJUWV9NQVNLCQkJCQkgMHgxMDNkYworLyogW1JXIDMyXSBQYXJpdHkgbWFzayByZWdpc3RlciAjMCByZWFkL3dyaXRlICovCisjZGVmaW5lIE5JR19SRUdfTklHX1BSVFlfTUFTS18wCQkJCQkgMHgxODNjOAorI2RlZmluZSBOSUdfUkVHX05JR19QUlRZX01BU0tfMQkJCQkJIDB4MTgzZDgKIC8qIFtSIDMyXSBMZWdhY3kgRTEgYW5kIEUxSCBsb2NhdGlvbiBmb3IgcGFyaXR5IGVycm9yIHN0YXR1cyByZWdpc3Rlci4gKi8KICNkZWZpbmUgTklHX1JFR19OSUdfUFJUWV9TVFMJCQkJCSAweDEwM2QwCiAvKiBbUiAzMl0gUGFyaXR5IHJlZ2lzdGVyICMwIHJlYWQgKi8KICNkZWZpbmUgTklHX1JFR19OSUdfUFJUWV9TVFNfMAkJCQkJIDB4MTgzYmMKICNkZWZpbmUgTklHX1JFR19OSUdfUFJUWV9TVFNfMQkJCQkJIDB4MTgzY2MKKy8qIFtSIDMyXSBMZWdhY3kgRTEgYW5kIEUxSCBsb2NhdGlvbiBmb3IgcGFyaXR5IGVycm9yIHN0YXR1cyBjbGVhciByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTklHX1JFR19OSUdfUFJUWV9TVFNfQ0xSCQkJCSAweDEwM2Q0CisvKiBbUkMgMzJdIFBhcml0eSByZWdpc3RlciAjMCByZWFkIGNsZWFyICovCisjZGVmaW5lIE5JR19SRUdfTklHX1BSVFlfU1RTX0NMUl8wCQkJCSAweDE4M2MwCisjZGVmaW5lIE5JR19SRUdfTklHX1BSVFlfU1RTX0NMUl8xCQkJCSAweDE4M2QwCisjZGVmaW5lIE1DUFJfSU1DX0NPTU1BTkRfRU5BQkxFCQkJCQkgKDFMPDwzMSkKKyNkZWZpbmUgTUNQUl9JTUNfQ09NTUFORF9JTUNfU1RBVFVTX0JJVFNISUZUCQkJIDE2CisjZGVmaW5lIE1DUFJfSU1DX0NPTU1BTkRfT1BFUkFUSU9OX0JJVFNISUZUCQkJIDI4CisjZGVmaW5lIE1DUFJfSU1DX0NPTU1BTkRfVFJBTlNGRVJfQUREUkVTU19CSVRTSElGVAkJIDgKIC8qIFtSVyA2XSBCaXQtbWFwIGluZGljYXRpbmcgd2hpY2ggTDIgaGRycyBtYXkgYXBwZWFyIGFmdGVyIHRoZSBiYXNpYwogICogRXRoZXJuZXQgaGVhZGVyLiAqLwogI2RlZmluZSBOSUdfUkVHX1AwX0hEUlNfQUZURVJfQkFTSUMJCQkJIDB4MTgwMzgKQEAgLTE4NzIsNiArMjAxMywxMiBAQAogI2RlZmluZSBOSUdfUkVHX1AwX0hXUEZDX0VOQUJMRQkJCQkgMHgxODA3OAogI2RlZmluZSBOSUdfUkVHX1AwX0xMSF9GVU5DX01FTTIJCQkJIDB4MTg0ODAKICNkZWZpbmUgTklHX1JFR19QMF9MTEhfRlVOQ19NRU0yX0VOQUJMRQkJCSAweDE4NDQwCisvKiBbUlcgMV0gSW5wdXQgZW5hYmxlIGZvciBSWCBNQUMgaW50ZXJmYWNlLiAqLworI2RlZmluZSBOSUdfUkVHX1AwX01BQ19JTl9FTgkJCQkJIDB4MTg1YWMKKy8qIFtSVyAxXSBPdXRwdXQgZW5hYmxlIGZvciBUWCBNQUMgaW50ZXJmYWNlICovCisjZGVmaW5lIE5JR19SRUdfUDBfTUFDX09VVF9FTgkJCQkJIDB4MTg1YjAKKy8qIFtSVyAxXSBPdXRwdXQgZW5hYmxlIGZvciBUWCBQQVVTRSBzaWduYWwgdG8gdGhlIE1BQy4gKi8KKyNkZWZpbmUgTklHX1JFR19QMF9NQUNfUEFVU0VfT1VUX0VOCQkJCSAweDE4NWI0CiAvKiBbUlcgMzJdIEVpZ2h0IDQtYml0IGNvbmZpZ3VyYXRpb25zIGZvciBzcGVjaWZ5aW5nIHdoaWNoIENPUyAoMC0xNSBmb3IKICAqIGZ1dHVyZSBleHBhbnNpb24pIGVhY2ggcHJpb3J0eSBpcyB0byBiZSBtYXBwZWQgdG8uIEJpdHMgMzowIHNwZWNpZnkgdGhlCiAgKiBDT1MgZm9yIHByaW9yaXR5IDAuIEJpdHMgMzE6Mjggc3BlY2lmeSB0aGUgQ09TIGZvciBwcmlvcml0eSA3LiBUaGUgMy1iaXQKQEAgLTE4ODgsMTEgKzIwMzUsNTIgQEAKICAqIHRoYW4gb25lIGJpdCBtYXkgYmUgc2V0OyBhbGxvd2luZyBtdWx0aXBsZSBwcmlvcml0aWVzIHRvIGJlIG1hcHBlZCB0byBvbmUKICAqIENPUy4gKi8KICNkZWZpbmUgTklHX1JFR19QMF9SWF9DT1MxX1BSSU9SSVRZX01BU0sJCQkgMHgxODA1YworLyogW1JXIDE2XSBCaXQtbWFwIGluZGljYXRpbmcgd2hpY2ggU0FGQy9QRkMgcHJpb3JpdGllcyB0byBtYXAgdG8gQ09TIDIuIEEKKyAqIHByaW9yaXR5IGlzIG1hcHBlZCB0byBDT1MgMiB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG1hc2sgYml0IGlzIDEuIE1vcmUKKyAqIHRoYW4gb25lIGJpdCBtYXkgYmUgc2V0OyBhbGxvd2luZyBtdWx0aXBsZSBwcmlvcml0aWVzIHRvIGJlIG1hcHBlZCB0byBvbmUKKyAqIENPUy4gKi8KKyNkZWZpbmUgTklHX1JFR19QMF9SWF9DT1MyX1BSSU9SSVRZX01BU0sJCQkgMHgxODZiMAorLyogW1JXIDE2XSBCaXQtbWFwIGluZGljYXRpbmcgd2hpY2ggU0FGQy9QRkMgcHJpb3JpdGllcyB0byBtYXAgdG8gQ09TIDMuIEEKKyAqIHByaW9yaXR5IGlzIG1hcHBlZCB0byBDT1MgMyB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG1hc2sgYml0IGlzIDEuIE1vcmUKKyAqIHRoYW4gb25lIGJpdCBtYXkgYmUgc2V0OyBhbGxvd2luZyBtdWx0aXBsZSBwcmlvcml0aWVzIHRvIGJlIG1hcHBlZCB0byBvbmUKKyAqIENPUy4gKi8KKyNkZWZpbmUgTklHX1JFR19QMF9SWF9DT1MzX1BSSU9SSVRZX01BU0sJCQkgMHgxODZiNAorLyogW1JXIDE2XSBCaXQtbWFwIGluZGljYXRpbmcgd2hpY2ggU0FGQy9QRkMgcHJpb3JpdGllcyB0byBtYXAgdG8gQ09TIDQuIEEKKyAqIHByaW9yaXR5IGlzIG1hcHBlZCB0byBDT1MgNCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG1hc2sgYml0IGlzIDEuIE1vcmUKKyAqIHRoYW4gb25lIGJpdCBtYXkgYmUgc2V0OyBhbGxvd2luZyBtdWx0aXBsZSBwcmlvcml0aWVzIHRvIGJlIG1hcHBlZCB0byBvbmUKKyAqIENPUy4gKi8KKyNkZWZpbmUgTklHX1JFR19QMF9SWF9DT1M0X1BSSU9SSVRZX01BU0sJCQkgMHgxODZiOAorLyogW1JXIDE2XSBCaXQtbWFwIGluZGljYXRpbmcgd2hpY2ggU0FGQy9QRkMgcHJpb3JpdGllcyB0byBtYXAgdG8gQ09TIDUuIEEKKyAqIHByaW9yaXR5IGlzIG1hcHBlZCB0byBDT1MgNSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG1hc2sgYml0IGlzIDEuIE1vcmUKKyAqIHRoYW4gb25lIGJpdCBtYXkgYmUgc2V0OyBhbGxvd2luZyBtdWx0aXBsZSBwcmlvcml0aWVzIHRvIGJlIG1hcHBlZCB0byBvbmUKKyAqIENPUy4gKi8KKyNkZWZpbmUgTklHX1JFR19QMF9SWF9DT1M1X1BSSU9SSVRZX01BU0sJCQkgMHgxODZiYworLyogW1IgMV0gUlggRklGTyBmb3IgcmVjZWl2aW5nIGRhdGEgZnJvbSBNQUMgaXMgZW1wdHkuICovCiAvKiBbUlcgMTVdIFNwZWNpZnkgd2hpY2ggb2YgdGhlIGNyZWRpdCByZWdpc3RlcnMgdGhlIGNsaWVudCBpcyB0byBiZSBtYXBwZWQKICAqIHRvLiBCaXRzWzI6MF0gYXJlIGZvciBjbGllbnQgMDsgYml0cyBbMTQ6MTJdIGFyZSBmb3IgY2xpZW50IDQuIEZvcgogICogY2xpZW50cyB0aGF0IGFyZSBub3Qgc3ViamVjdCB0byBXRlEgY3JlZGl0IGJsb2NraW5nIC0gdGhlaXIKICAqIHNwZWNpZmljYXRpb25zIGhlcmUgYXJlIG5vdCB1c2VkLiAqLwogI2RlZmluZSBOSUdfUkVHX1AwX1RYX0FSQl9DTElFTlRfQ1JFRElUX01BUAkJCSAweDE4MGYwCisvKiBbUlcgMzJdIFNwZWNpZnkgd2hpY2ggb2YgdGhlIGNyZWRpdCByZWdpc3RlcnMgdGhlIGNsaWVudCBpcyB0byBiZSBtYXBwZWQKKyAqIHRvLiBUaGlzIHJlZ2lzdGVyIHNwZWNpZmllcyBiaXRzIDMxOjAgb2YgdGhlIDM2LWJpdCB2YWx1ZS4gQml0c1szOjBdIGFyZQorICogZm9yIGNsaWVudCAwOyBiaXRzIFszNTozMl0gYXJlIGZvciBjbGllbnQgOC4gRm9yIGNsaWVudHMgdGhhdCBhcmUgbm90CisgKiBzdWJqZWN0IHRvIFdGUSBjcmVkaXQgYmxvY2tpbmcgLSB0aGVpciBzcGVjaWZpY2F0aW9ucyBoZXJlIGFyZSBub3QgdXNlZC4KKyAqIFRoaXMgaXMgYSBuZXcgcmVnaXN0ZXIgKHdpdGggMl8pIGFkZGVkIGluIEUzIEIwIHRvIGFjY29tbW9kYXRlIHRoZSA5CisgKiBpbnB1dCBjbGllbnRzIHRvIEVUUyBhcmJpdGVyLiBUaGUgcmVzZXQgZGVmYXVsdCBpcyBzZXQgZm9yIG1hbmFnZW1lbnQgYW5kCisgKiBkZWJ1ZyB0byB1c2UgY3JlZGl0IHJlZ2lzdGVycyA2LCA3LCBhbmQgOCwgcmVzcGVjdGl2ZWx5LCBhbmQgQ09TZXMgMC01IHRvCisgKiB1c2UgY3JlZGl0IHJlZ2lzdGVycyAwLTUgcmVzcGVjdGl2ZWx5ICgweDU0MzIxMDg3NikuIE5vdGUgdGhhdCBjcmVkaXQKKyAqIHJlZ2lzdGVycyBjYW4gbm90IGJlIHNoYXJlZCBiZXR3ZWVuIGNsaWVudHMuICovCisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NMSUVOVF9DUkVESVRfTUFQMl9MU0IJCSAweDE4Njg4CisvKiBbUlcgNF0gU3BlY2lmeSB3aGljaCBvZiB0aGUgY3JlZGl0IHJlZ2lzdGVycyB0aGUgY2xpZW50IGlzIHRvIGJlIG1hcHBlZAorICogdG8uIFRoaXMgcmVnaXN0ZXIgc3BlY2lmaWVzIGJpdHMgMzU6MzIgb2YgdGhlIDM2LWJpdCB2YWx1ZS4gQml0c1szOjBdIGFyZQorICogZm9yIGNsaWVudCAwOyBiaXRzIFszNTozMl0gYXJlIGZvciBjbGllbnQgOC4gRm9yIGNsaWVudHMgdGhhdCBhcmUgbm90CisgKiBzdWJqZWN0IHRvIFdGUSBjcmVkaXQgYmxvY2tpbmcgLSB0aGVpciBzcGVjaWZpY2F0aW9ucyBoZXJlIGFyZSBub3QgdXNlZC4KKyAqIFRoaXMgaXMgYSBuZXcgcmVnaXN0ZXIgKHdpdGggMl8pIGFkZGVkIGluIEUzIEIwIHRvIGFjY29tbW9kYXRlIHRoZSA5CisgKiBpbnB1dCBjbGllbnRzIHRvIEVUUyBhcmJpdGVyLiBUaGUgcmVzZXQgZGVmYXVsdCBpcyBzZXQgZm9yIG1hbmFnZW1lbnQgYW5kCisgKiBkZWJ1ZyB0byB1c2UgY3JlZGl0IHJlZ2lzdGVycyA2LCA3LCBhbmQgOCwgcmVzcGVjdGl2ZWx5LCBhbmQgQ09TZXMgMC01IHRvCisgKiB1c2UgY3JlZGl0IHJlZ2lzdGVycyAwLTUgcmVzcGVjdGl2ZWx5ICgweDU0MzIxMDg3NikuIE5vdGUgdGhhdCBjcmVkaXQKKyAqIHJlZ2lzdGVycyBjYW4gbm90IGJlIHNoYXJlZCBiZXR3ZWVuIGNsaWVudHMuICovCisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NMSUVOVF9DUkVESVRfTUFQMl9NU0IJCSAweDE4NjhjCiAvKiBbUlcgNV0gU3BlY2lmeSB3aGV0aGVyIHRoZSBjbGllbnQgY29tcGV0ZXMgZGlyZWN0bHkgaW4gdGhlIHN0cmljdAogICogcHJpb3JpdHkgYXJiaXRlci4gVGhlIGJpdHMgYXJlIG1hcHBlZCBhY2NvcmRpbmcgdG8gY2xpZW50IElEIChjbGllbnQgSURzCiAgKiBhcmUgZGVmaW5lZCBpbiB0eF9hcmJfcHJpb3JpdHlfY2xpZW50KS4gRGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gZW5hYmxlCkBAIC0xOTA3LDEwICsyMDk1LDI0IEBACiAgKiByZWFjaC4gKi8KICNkZWZpbmUgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1VQUEVSX0JPVU5EXzAJCQkgMHgxODEwYwogI2RlZmluZSBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfMQkJCSAweDE4MTEwCisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF8yCQkJIDB4MTgxMTQKKyNkZWZpbmUgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1VQUEVSX0JPVU5EXzMJCQkgMHgxODExOAorI2RlZmluZSBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfNAkJCSAweDE4MTFjCisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF81CQkJIDB4MTg2YTAKKyNkZWZpbmUgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1VQUEVSX0JPVU5EXzYJCQkgMHgxODZhNAorI2RlZmluZSBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfNwkJCSAweDE4NmE4CisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF84CQkJIDB4MTg2YWMKIC8qIFtSVyAzMl0gU3BlY2lmeSB0aGUgd2VpZ2h0IChpbiBieXRlcykgdG8gYmUgYWRkZWQgdG8gY3JlZGl0IHJlZ2lzdGVyIDAKICAqIHdoZW4gaXQgaXMgdGltZSB0byBpbmNyZW1lbnQuICovCiAjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfMAkJCSAweDE4MGY4CiAjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfMQkJCSAweDE4MGZjCisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfMgkJCSAweDE4MTAwCisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfMwkJCSAweDE4MTA0CisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfNAkJCSAweDE4MTA4CisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfNQkJCSAweDE4NjkwCisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfNgkJCSAweDE4Njk0CisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfNwkJCSAweDE4Njk4CisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfOAkJCSAweDE4NjljCiAvKiBbUlcgMTJdIFNwZWNpZnkgdGhlIG51bWJlciBvZiBzdHJpY3QgcHJpb3JpdHkgYXJiaXRyYXRpb24gc2xvdHMgYmV0d2VlbgogICogdHdvIHJvdW5kLXJvYmluIGFyYml0cmF0aW9uIHNsb3RzIHRvIGF2b2lkIHN0YXJ2YXRpb24uIEEgdmFsdWUgb2YgMCBtZWFucwogICogbm8gc3RyaWN0IHByaW9yaXR5IGN5Y2xlcyAtIHRoZSBzdHJpY3QgcHJpb3JpdHkgd2l0aCBhbnRpLXN0YXJ2YXRpb24KQEAgLTE5MjUsOCArMjEyNywzNiBAQAogICogZm9yIG1hbmFnZW1lbnQgYXQgcHJpb3JpdHkgMDsgZGVidWcgdHJhZmZpYyBhdCBwcmlvcml0aWVzIDEgYW5kIDI7IENPUzAKICAqIHRyYWZmaWMgYXQgcHJpb3JpdHkgMzsgYW5kIENPUzEgdHJhZmZpYyBhdCBwcmlvcml0eSA0LiAqLwogI2RlZmluZSBOSUdfUkVHX1AwX1RYX0FSQl9QUklPUklUWV9DTElFTlQJCQkgMHgxODBlNAorLyogW1JXIDZdIEJpdC1tYXAgaW5kaWNhdGluZyB3aGljaCBMMiBoZHJzIG1heSBhcHBlYXIgYWZ0ZXIgdGhlIGJhc2ljCisgKiBFdGhlcm5ldCBoZWFkZXIuICovCisjZGVmaW5lIE5JR19SRUdfUDFfSERSU19BRlRFUl9CQVNJQwkJCQkgMHgxODE4YwogI2RlZmluZSBOSUdfUkVHX1AxX0xMSF9GVU5DX01FTTIJCQkJIDB4MTg0YzAKICNkZWZpbmUgTklHX1JFR19QMV9MTEhfRlVOQ19NRU0yX0VOQUJMRQkJCSAweDE4NDYwCisvKiBbUlcgMzJdIFNwZWNpZnkgdGhlIGNsaWVudCBudW1iZXIgdG8gYmUgYXNzaWduZWQgdG8gZWFjaCBwcmlvcml0eSBvZiB0aGUKKyAqIHN0cmljdCBwcmlvcml0eSBhcmJpdGVyLiBUaGlzIHJlZ2lzdGVyIHNwZWNpZmllcyBiaXRzIDMxOjAgb2YgdGhlIDM2LWJpdAorICogdmFsdWUuIFByaW9yaXR5IDAgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuIEJpdHMgWzM6MF0gYXJlIGZvciBwcmlvcml0eSAwCisgKiBjbGllbnQ7IGJpdHMgWzM1LTMyXSBhcmUgZm9yIHByaW9yaXR5IDggY2xpZW50LiBUaGUgY2xpZW50cyBhcmUgYXNzaWduZWQKKyAqIHRoZSBmb2xsb3dpbmcgSURzOiAwLW1hbmFnZW1lbnQ7IDEtZGVidWcgdHJhZmZpYyBmcm9tIHRoaXMgcG9ydDsgMi1kZWJ1ZworICogdHJhZmZpYyBmcm9tIG90aGVyIHBvcnQ7IDMtQ09TMCB0cmFmZmljOyA0LUNPUzEgdHJhZmZpYzsgNS1DT1MyIHRyYWZmaWM7CisgKiA2LUNPUzMgdHJhZmZpYzsgNy1DT1M0IHRyYWZmaWM7IDgtQ09TNSB0cmFmZmljLiBUaGUgcmVzZXQgdmFsdWVbMzU6MF0gaXMKKyAqIHNldCB0byAweDM0NTY3ODAyMS4gVGhpcyBpcyBhIG5ldyByZWdpc3RlciAod2l0aCAyXykgYWRkZWQgaW4gRTMgQjAgdG8KKyAqIGFjY29tbW9kYXRlIHRoZSA5IGlucHV0IGNsaWVudHMgdG8gRVRTIGFyYml0ZXIuICovCisjZGVmaW5lIE5JR19SRUdfUDBfVFhfQVJCX1BSSU9SSVRZX0NMSUVOVDJfTFNCCQkJIDB4MTg2ODAKKy8qIFtSVyA0XSBTcGVjaWZ5IHRoZSBjbGllbnQgbnVtYmVyIHRvIGJlIGFzc2lnbmVkIHRvIGVhY2ggcHJpb3JpdHkgb2YgdGhlCisgKiBzdHJpY3QgcHJpb3JpdHkgYXJiaXRlci4gVGhpcyByZWdpc3RlciBzcGVjaWZpZXMgYml0cyAzNTozMiBvZiB0aGUgMzYtYml0CisgKiB2YWx1ZS4gUHJpb3JpdHkgMCBpcyB0aGUgaGlnaGVzdCBwcmlvcml0eS4gQml0cyBbMzowXSBhcmUgZm9yIHByaW9yaXR5IDAKKyAqIGNsaWVudDsgYml0cyBbMzUtMzJdIGFyZSBmb3IgcHJpb3JpdHkgOCBjbGllbnQuIFRoZSBjbGllbnRzIGFyZSBhc3NpZ25lZAorICogdGhlIGZvbGxvd2luZyBJRHM6IDAtbWFuYWdlbWVudDsgMS1kZWJ1ZyB0cmFmZmljIGZyb20gdGhpcyBwb3J0OyAyLWRlYnVnCisgKiB0cmFmZmljIGZyb20gb3RoZXIgcG9ydDsgMy1DT1MwIHRyYWZmaWM7IDQtQ09TMSB0cmFmZmljOyA1LUNPUzIgdHJhZmZpYzsKKyAqIDYtQ09TMyB0cmFmZmljOyA3LUNPUzQgdHJhZmZpYzsgOC1DT1M1IHRyYWZmaWMuIFRoZSByZXNldCB2YWx1ZVszNTowXSBpcworICogc2V0IHRvIDB4MzQ1Njc4MDIxLiBUaGlzIGlzIGEgbmV3IHJlZ2lzdGVyICh3aXRoIDJfKSBhZGRlZCBpbiBFMyBCMCB0bworICogYWNjb21tb2RhdGUgdGhlIDkgaW5wdXQgY2xpZW50cyB0byBFVFMgYXJiaXRlci4gKi8KKyNkZWZpbmUgTklHX1JFR19QMF9UWF9BUkJfUFJJT1JJVFlfQ0xJRU5UMl9NU0IJCQkgMHgxODY4NAorI2RlZmluZSBOSUdfUkVHX1AxX01BQ19JTl9FTgkJCQkJIDB4MTg1YzAKKy8qIFtSVyAxXSBPdXRwdXQgZW5hYmxlIGZvciBUWCBNQUMgaW50ZXJmYWNlICovCisjZGVmaW5lIE5JR19SRUdfUDFfTUFDX09VVF9FTgkJCQkJIDB4MTg1YzQKKy8qIFtSVyAxXSBPdXRwdXQgZW5hYmxlIGZvciBUWCBQQVVTRSBzaWduYWwgdG8gdGhlIE1BQy4gKi8KKyNkZWZpbmUgTklHX1JFR19QMV9NQUNfUEFVU0VfT1VUX0VOCQkJCSAweDE4NWM4CiAvKiBbUlcgMzJdIEVpZ2h0IDQtYml0IGNvbmZpZ3VyYXRpb25zIGZvciBzcGVjaWZ5aW5nIHdoaWNoIENPUyAoMC0xNSBmb3IKICAqIGZ1dHVyZSBleHBhbnNpb24pIGVhY2ggcHJpb3J0eSBpcyB0byBiZSBtYXBwZWQgdG8uIEJpdHMgMzowIHNwZWNpZnkgdGhlCiAgKiBDT1MgZm9yIHByaW9yaXR5IDAuIEJpdHMgMzE6Mjggc3BlY2lmeSB0aGUgQ09TIGZvciBwcmlvcml0eSA3LiBUaGUgMy1iaXQKQEAgLTE5NDMsNiArMjE3MywxMDUgQEAKICAqIHRoYW4gb25lIGJpdCBtYXkgYmUgc2V0OyBhbGxvd2luZyBtdWx0aXBsZSBwcmlvcml0aWVzIHRvIGJlIG1hcHBlZCB0byBvbmUKICAqIENPUy4gKi8KICNkZWZpbmUgTklHX1JFR19QMV9SWF9DT1MxX1BSSU9SSVRZX01BU0sJCQkgMHgxODFiMAorLyogW1JXIDE2XSBCaXQtbWFwIGluZGljYXRpbmcgd2hpY2ggU0FGQy9QRkMgcHJpb3JpdGllcyB0byBtYXAgdG8gQ09TIDIuIEEKKyAqIHByaW9yaXR5IGlzIG1hcHBlZCB0byBDT1MgMiB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG1hc2sgYml0IGlzIDEuIE1vcmUKKyAqIHRoYW4gb25lIGJpdCBtYXkgYmUgc2V0OyBhbGxvd2luZyBtdWx0aXBsZSBwcmlvcml0aWVzIHRvIGJlIG1hcHBlZCB0byBvbmUKKyAqIENPUy4gKi8KKyNkZWZpbmUgTklHX1JFR19QMV9SWF9DT1MyX1BSSU9SSVRZX01BU0sJCQkgMHgxODZmOAorLyogW1IgMV0gUlggRklGTyBmb3IgcmVjZWl2aW5nIGRhdGEgZnJvbSBNQUMgaXMgZW1wdHkuICovCisjZGVmaW5lIE5JR19SRUdfUDFfUlhfTUFDRklGT19FTVBUWQkJCQkgMHgxODU4YworLyogW1IgMV0gVExMSCBGSUZPIGlzIGVtcHR5LiAqLworI2RlZmluZSBOSUdfUkVHX1AxX1RMTEhfRklGT19FTVBUWQkJCQkgMHgxODMzOAorLyogW1JXIDMyXSBTcGVjaWZ5IHdoaWNoIG9mIHRoZSBjcmVkaXQgcmVnaXN0ZXJzIHRoZSBjbGllbnQgaXMgdG8gYmUgbWFwcGVkCisgKiB0by4gVGhpcyByZWdpc3RlciBzcGVjaWZpZXMgYml0cyAzMTowIG9mIHRoZSAzNi1iaXQgdmFsdWUuIEJpdHNbMzowXSBhcmUKKyAqIGZvciBjbGllbnQgMDsgYml0cyBbMzU6MzJdIGFyZSBmb3IgY2xpZW50IDguIEZvciBjbGllbnRzIHRoYXQgYXJlIG5vdAorICogc3ViamVjdCB0byBXRlEgY3JlZGl0IGJsb2NraW5nIC0gdGhlaXIgc3BlY2lmaWNhdGlvbnMgaGVyZSBhcmUgbm90IHVzZWQuCisgKiBUaGlzIGlzIGEgbmV3IHJlZ2lzdGVyICh3aXRoIDJfKSBhZGRlZCBpbiBFMyBCMCB0byBhY2NvbW1vZGF0ZSB0aGUgOQorICogaW5wdXQgY2xpZW50cyB0byBFVFMgYXJiaXRlci4gVGhlIHJlc2V0IGRlZmF1bHQgaXMgc2V0IGZvciBtYW5hZ2VtZW50IGFuZAorICogZGVidWcgdG8gdXNlIGNyZWRpdCByZWdpc3RlcnMgNiwgNywgYW5kIDgsIHJlc3BlY3RpdmVseSwgYW5kIENPU2VzIDAtNSB0bworICogdXNlIGNyZWRpdCByZWdpc3RlcnMgMC01IHJlc3BlY3RpdmVseSAoMHg1NDMyMTA4NzYpLiBOb3RlIHRoYXQgY3JlZGl0CisgKiByZWdpc3RlcnMgY2FuIG5vdCBiZSBzaGFyZWQgYmV0d2VlbiBjbGllbnRzLiBOb3RlIGFsc28gdGhhdCB0aGVyZSBhcmUKKyAqIG9ubHkgQ09TMC0yIGluIHBvcnQgMS0gdGhlcmUgaXMgYSB0b3RhbCBvZiA2IGNsaWVudHMgaW4gcG9ydCAxLiBPbmx5CisgKiBjcmVkaXQgcmVnaXN0ZXJzIDAtNSBhcmUgdmFsaWQuIFRoaXMgcmVnaXN0ZXIgc2hvdWxkIGJlIGNvbmZpZ3VyZWQKKyAqIGFwcHJvcHJpYXRlbHkgYmVmb3JlIGVuYWJsaW5nIFdGUS4gKi8KKyNkZWZpbmUgTklHX1JFR19QMV9UWF9BUkJfQ0xJRU5UX0NSRURJVF9NQVAyX0xTQgkJIDB4MTg2ZTgKKy8qIFtSVyA0XSBTcGVjaWZ5IHdoaWNoIG9mIHRoZSBjcmVkaXQgcmVnaXN0ZXJzIHRoZSBjbGllbnQgaXMgdG8gYmUgbWFwcGVkCisgKiB0by4gVGhpcyByZWdpc3RlciBzcGVjaWZpZXMgYml0cyAzNTozMiBvZiB0aGUgMzYtYml0IHZhbHVlLiBCaXRzWzM6MF0gYXJlCisgKiBmb3IgY2xpZW50IDA7IGJpdHMgWzM1OjMyXSBhcmUgZm9yIGNsaWVudCA4LiBGb3IgY2xpZW50cyB0aGF0IGFyZSBub3QKKyAqIHN1YmplY3QgdG8gV0ZRIGNyZWRpdCBibG9ja2luZyAtIHRoZWlyIHNwZWNpZmljYXRpb25zIGhlcmUgYXJlIG5vdCB1c2VkLgorICogVGhpcyBpcyBhIG5ldyByZWdpc3RlciAod2l0aCAyXykgYWRkZWQgaW4gRTMgQjAgdG8gYWNjb21tb2RhdGUgdGhlIDkKKyAqIGlucHV0IGNsaWVudHMgdG8gRVRTIGFyYml0ZXIuIFRoZSByZXNldCBkZWZhdWx0IGlzIHNldCBmb3IgbWFuYWdlbWVudCBhbmQKKyAqIGRlYnVnIHRvIHVzZSBjcmVkaXQgcmVnaXN0ZXJzIDYsIDcsIGFuZCA4LCByZXNwZWN0aXZlbHksIGFuZCBDT1NlcyAwLTUgdG8KKyAqIHVzZSBjcmVkaXQgcmVnaXN0ZXJzIDAtNSByZXNwZWN0aXZlbHkgKDB4NTQzMjEwODc2KS4gTm90ZSB0aGF0IGNyZWRpdAorICogcmVnaXN0ZXJzIGNhbiBub3QgYmUgc2hhcmVkIGJldHdlZW4gY2xpZW50cy4gTm90ZSBhbHNvIHRoYXQgdGhlcmUgYXJlCisgKiBvbmx5IENPUzAtMiBpbiBwb3J0IDEtIHRoZXJlIGlzIGEgdG90YWwgb2YgNiBjbGllbnRzIGluIHBvcnQgMS4gT25seQorICogY3JlZGl0IHJlZ2lzdGVycyAwLTUgYXJlIHZhbGlkLiBUaGlzIHJlZ2lzdGVyIHNob3VsZCBiZSBjb25maWd1cmVkCisgKiBhcHByb3ByaWF0ZWx5IGJlZm9yZSBlbmFibGluZyBXRlEuICovCisjZGVmaW5lIE5JR19SRUdfUDFfVFhfQVJCX0NMSUVOVF9DUkVESVRfTUFQMl9NU0IJCSAweDE4NmVjCisvKiBbUlcgOV0gU3BlY2lmeSB3aGV0aGVyIHRoZSBjbGllbnQgY29tcGV0ZXMgZGlyZWN0bHkgaW4gdGhlIHN0cmljdAorICogcHJpb3JpdHkgYXJiaXRlci4gVGhlIGJpdHMgYXJlIG1hcHBlZCBhY2NvcmRpbmcgdG8gY2xpZW50IElEIChjbGllbnQgSURzCisgKiBhcmUgZGVmaW5lZCBpbiB0eF9hcmJfcHJpb3JpdHlfY2xpZW50Mik6IDAtbWFuYWdlbWVudDsgMS1kZWJ1ZyB0cmFmZmljCisgKiBmcm9tIHRoaXMgcG9ydDsgMi1kZWJ1ZyB0cmFmZmljIGZyb20gb3RoZXIgcG9ydDsgMy1DT1MwIHRyYWZmaWM7IDQtQ09TMQorICogdHJhZmZpYzsgNS1DT1MyIHRyYWZmaWM7IDYtQ09TMyB0cmFmZmljOyA3LUNPUzQgdHJhZmZpYzsgOC1DT1M1IHRyYWZmaWMuCisgKiBEZWZhdWx0IHZhbHVlIGlzIHNldCB0byBlbmFibGUgc3RyaWN0IHByaW9yaXRpZXMgZm9yIGFsbCBjbGllbnRzLiAqLworI2RlZmluZSBOSUdfUkVHX1AxX1RYX0FSQl9DTElFTlRfSVNfU1RSSUNUCQkJIDB4MTgyMzQKKy8qIFtSVyA5XSBTcGVjaWZ5IHdoZXRoZXIgdGhlIGNsaWVudCBpcyBzdWJqZWN0IHRvIFdGUSBjcmVkaXQgYmxvY2tpbmcuIFRoZQorICogYml0cyBhcmUgbWFwcGVkIGFjY29yZGluZyB0byBjbGllbnQgSUQgKGNsaWVudCBJRHMgYXJlIGRlZmluZWQgaW4KKyAqIHR4X2FyYl9wcmlvcml0eV9jbGllbnQyKTogMC1tYW5hZ2VtZW50OyAxLWRlYnVnIHRyYWZmaWMgZnJvbSB0aGlzIHBvcnQ7CisgKiAyLWRlYnVnIHRyYWZmaWMgZnJvbSBvdGhlciBwb3J0OyAzLUNPUzAgdHJhZmZpYzsgNC1DT1MxIHRyYWZmaWM7IDUtQ09TMgorICogdHJhZmZpYzsgNi1DT1MzIHRyYWZmaWM7IDctQ09TNCB0cmFmZmljOyA4LUNPUzUgdHJhZmZpYy4gRGVmYXVsdCB2YWx1ZSBpcworICogMCBmb3Igbm90IHVzaW5nIFdGUSBjcmVkaXQgYmxvY2tpbmcuICovCisjZGVmaW5lIE5JR19SRUdfUDFfVFhfQVJCX0NMSUVOVF9JU19TVUJKRUNUMldGUQkJCSAweDE4MjM4CisjZGVmaW5lIE5JR19SRUdfUDFfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF8wCQkJIDB4MTgyNTgKKyNkZWZpbmUgTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1VQUEVSX0JPVU5EXzEJCQkgMHgxODI1YworI2RlZmluZSBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfMgkJCSAweDE4MjYwCisjZGVmaW5lIE5JR19SRUdfUDFfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF8zCQkJIDB4MTgyNjQKKyNkZWZpbmUgTklHX1JFR19QMV9UWF9BUkJfQ1JFRElUX1VQUEVSX0JPVU5EXzQJCQkgMHgxODI2OAorI2RlZmluZSBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfNQkJCSAweDE4NmY0CisvKiBbUlcgMzJdIFNwZWNpZnkgdGhlIHdlaWdodCAoaW4gYnl0ZXMpIHRvIGJlIGFkZGVkIHRvIGNyZWRpdCByZWdpc3RlciAwCisgKiB3aGVuIGl0IGlzIHRpbWUgdG8gaW5jcmVtZW50LiAqLworI2RlZmluZSBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfV0VJR0hUXzAJCQkgMHgxODI0NAorI2RlZmluZSBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfV0VJR0hUXzEJCQkgMHgxODI0OAorI2RlZmluZSBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfV0VJR0hUXzIJCQkgMHgxODI0YworI2RlZmluZSBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfV0VJR0hUXzMJCQkgMHgxODI1MAorI2RlZmluZSBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfV0VJR0hUXzQJCQkgMHgxODI1NAorI2RlZmluZSBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfV0VJR0hUXzUJCQkgMHgxODZmMAorLyogW1JXIDEyXSBTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc3RyaWN0IHByaW9yaXR5IGFyYml0cmF0aW9uIHNsb3RzIGJldHdlZW4KKyAgIHR3byByb3VuZC1yb2JpbiBhcmJpdHJhdGlvbiBzbG90cyB0byBhdm9pZCBzdGFydmF0aW9uLiBBIHZhbHVlIG9mIDAgbWVhbnMKKyAgIG5vIHN0cmljdCBwcmlvcml0eSBjeWNsZXMgLSB0aGUgc3RyaWN0IHByaW9yaXR5IHdpdGggYW50aS1zdGFydmF0aW9uCisgICBhcmJpdGVyIGJlY29tZXMgYSByb3VuZC1yb2JpbiBhcmJpdGVyLiAqLworI2RlZmluZSBOSUdfUkVHX1AxX1RYX0FSQl9OVU1fU1RSSUNUX0FSQl9TTE9UUwkJCSAweDE4MjQwCisvKiBbUlcgMzJdIFNwZWNpZnkgdGhlIGNsaWVudCBudW1iZXIgdG8gYmUgYXNzaWduZWQgdG8gZWFjaCBwcmlvcml0eSBvZiB0aGUKKyAgIHN0cmljdCBwcmlvcml0eSBhcmJpdGVyLiBUaGlzIHJlZ2lzdGVyIHNwZWNpZmllcyBiaXRzIDMxOjAgb2YgdGhlIDM2LWJpdAorICAgdmFsdWUuIFByaW9yaXR5IDAgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuIEJpdHMgWzM6MF0gYXJlIGZvciBwcmlvcml0eSAwCisgICBjbGllbnQ7IGJpdHMgWzM1LTMyXSBhcmUgZm9yIHByaW9yaXR5IDggY2xpZW50LiBUaGUgY2xpZW50cyBhcmUgYXNzaWduZWQKKyAgIHRoZSBmb2xsb3dpbmcgSURzOiAwLW1hbmFnZW1lbnQ7IDEtZGVidWcgdHJhZmZpYyBmcm9tIHRoaXMgcG9ydDsgMi1kZWJ1ZworICAgdHJhZmZpYyBmcm9tIG90aGVyIHBvcnQ7IDMtQ09TMCB0cmFmZmljOyA0LUNPUzEgdHJhZmZpYzsgNS1DT1MyIHRyYWZmaWM7CisgICA2LUNPUzMgdHJhZmZpYzsgNy1DT1M0IHRyYWZmaWM7IDgtQ09TNSB0cmFmZmljLiBUaGUgcmVzZXQgdmFsdWVbMzU6MF0gaXMKKyAgIHNldCB0byAweDM0NTY3ODAyMS4gVGhpcyBpcyBhIG5ldyByZWdpc3RlciAod2l0aCAyXykgYWRkZWQgaW4gRTMgQjAgdG8KKyAgIGFjY29tbW9kYXRlIHRoZSA5IGlucHV0IGNsaWVudHMgdG8gRVRTIGFyYml0ZXIuIE5vdGUgdGhhdCB0aGlzIHJlZ2lzdGVyCisgICBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGZvciBwb3J0IDAsIGV4Y2VwdCB0aGF0IHBvcnQgMSBvbmx5IGhhcyBDT1MgMC0yCisgICB0cmFmZmljLiBUaGVyZSBpcyBubyB0cmFmZmljIGZvciBDT1MgMy01IG9mIHBvcnQgMS4gKi8KKyNkZWZpbmUgTklHX1JFR19QMV9UWF9BUkJfUFJJT1JJVFlfQ0xJRU5UMl9MU0IJCQkgMHgxODZlMAorLyogW1JXIDRdIFNwZWNpZnkgdGhlIGNsaWVudCBudW1iZXIgdG8gYmUgYXNzaWduZWQgdG8gZWFjaCBwcmlvcml0eSBvZiB0aGUKKyAgIHN0cmljdCBwcmlvcml0eSBhcmJpdGVyLiBUaGlzIHJlZ2lzdGVyIHNwZWNpZmllcyBiaXRzIDM1OjMyIG9mIHRoZSAzNi1iaXQKKyAgIHZhbHVlLiBQcmlvcml0eSAwIGlzIHRoZSBoaWdoZXN0IHByaW9yaXR5LiBCaXRzIFszOjBdIGFyZSBmb3IgcHJpb3JpdHkgMAorICAgY2xpZW50OyBiaXRzIFszNS0zMl0gYXJlIGZvciBwcmlvcml0eSA4IGNsaWVudC4gVGhlIGNsaWVudHMgYXJlIGFzc2lnbmVkCisgICB0aGUgZm9sbG93aW5nIElEczogMC1tYW5hZ2VtZW50OyAxLWRlYnVnIHRyYWZmaWMgZnJvbSB0aGlzIHBvcnQ7IDItZGVidWcKKyAgIHRyYWZmaWMgZnJvbSBvdGhlciBwb3J0OyAzLUNPUzAgdHJhZmZpYzsgNC1DT1MxIHRyYWZmaWM7IDUtQ09TMiB0cmFmZmljOworICAgNi1DT1MzIHRyYWZmaWM7IDctQ09TNCB0cmFmZmljOyA4LUNPUzUgdHJhZmZpYy4gVGhlIHJlc2V0IHZhbHVlWzM1OjBdIGlzCisgICBzZXQgdG8gMHgzNDU2NzgwMjEuIFRoaXMgaXMgYSBuZXcgcmVnaXN0ZXIgKHdpdGggMl8pIGFkZGVkIGluIEUzIEIwIHRvCisgICBhY2NvbW1vZGF0ZSB0aGUgOSBpbnB1dCBjbGllbnRzIHRvIEVUUyBhcmJpdGVyLiBOb3RlIHRoYXQgdGhpcyByZWdpc3RlcgorICAgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBmb3IgcG9ydCAwLCBleGNlcHQgdGhhdCBwb3J0IDEgb25seSBoYXMgQ09TIDAtMgorICAgdHJhZmZpYy4gVGhlcmUgaXMgbm8gdHJhZmZpYyBmb3IgQ09TIDMtNSBvZiBwb3J0IDEuICovCisjZGVmaW5lIE5JR19SRUdfUDFfVFhfQVJCX1BSSU9SSVRZX0NMSUVOVDJfTVNCCQkJIDB4MTg2ZTQKKy8qIFtSIDFdIFRYIEZJRk8gZm9yIHRyYW5zbWl0dGluZyBkYXRhIHRvIE1BQyBpcyBlbXB0eS4gKi8KKyNkZWZpbmUgTklHX1JFR19QMV9UWF9NQUNGSUZPX0VNUFRZCQkJCSAweDE4NTk0CisvKiBbUiAxXSBGSUZPIGVtcHR5IHN0YXR1cyBvZiB0aGUgTUNQIFRYIEZJRk8gdXNlZCBmb3Igc3RvcmluZyBNQ1AgcGFja2V0cworICAgZm9yd2FyZGVkIHRvIHRoZSBob3N0LiAqLworI2RlZmluZSBOSUdfUkVHX1AxX1RYX01OR19IT1NUX0ZJRk9fRU1QVFkJCQkgMHgxODJiOAorLyogW1JXIDMyXSBTcGVjaWZ5IHRoZSB1cHBlciBib3VuZCB0aGF0IGNyZWRpdCByZWdpc3RlciAwIGlzIGFsbG93ZWQgdG8KKyAqIHJlYWNoLiAqLwogLyogW1JXIDFdIFBhdXNlIGVuYWJsZSBmb3IgcG9ydDAuIFRoaXMgcmVnaXN0ZXIgbWF5IGdldCAxIG9ubHkgd2hlbgogICAgfnNhZmNfZW5hYmxlLnNhZmNfZW5hYmxlID0gMCBhbmQgcHBwX2VuYWJsZS5wcHBfZW5hYmxlID0wIGZvciB0aGUgc2FtZQogICAgcG9ydCAqLwpAQCAtMjAyNiwxMiArMjM1NSw0NSBAQAogI2RlZmluZSBOSUdfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMF9SRUdfU1RBVFVTX1hHWFMwX0xJTktfU1RBVFVTX1NJWkUgMTgKIC8qIFtSVyAzMV0gVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSB3ZWlnaHQgb2YgQ09TMCBpbiB0aGUgRVRTIGNvbW1hbmQgYXJiaXRlci4gKi8KICNkZWZpbmUgUEJGX1JFR19DT1MwX1VQUEVSX0JPVU5ECQkJCSAweDE1YzA1YworLyogW1JXIDMxXSBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHdlaWdodCBvZiBDT1MwIGluIHRoZSBFVFMgY29tbWFuZCBhcmJpdGVyCisgKiBvZiBwb3J0IDAuICovCisjZGVmaW5lIFBCRl9SRUdfQ09TMF9VUFBFUl9CT1VORF9QMAkJCQkgMHgxNWMyY2MKKy8qIFtSVyAzMV0gVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSB3ZWlnaHQgb2YgQ09TMCBpbiB0aGUgRVRTIGNvbW1hbmQgYXJiaXRlcgorICogb2YgcG9ydCAxLiAqLworI2RlZmluZSBQQkZfUkVHX0NPUzBfVVBQRVJfQk9VTkRfUDEJCQkJIDB4MTVjMmU0CiAvKiBbUlcgMzFdIFRoZSB3ZWlnaHQgb2YgQ09TMCBpbiB0aGUgRVRTIGNvbW1hbmQgYXJiaXRlci4gKi8KICNkZWZpbmUgUEJGX1JFR19DT1MwX1dFSUdIVAkJCQkJIDB4MTVjMDU0CisvKiBbUlcgMzFdIFRoZSB3ZWlnaHQgb2YgQ09TMCBpbiBwb3J0IDAgRVRTIGNvbW1hbmQgYXJiaXRlci4gKi8KKyNkZWZpbmUgUEJGX1JFR19DT1MwX1dFSUdIVF9QMAkJCQkJIDB4MTVjMmE4CisvKiBbUlcgMzFdIFRoZSB3ZWlnaHQgb2YgQ09TMCBpbiBwb3J0IDEgRVRTIGNvbW1hbmQgYXJiaXRlci4gKi8KKyNkZWZpbmUgUEJGX1JFR19DT1MwX1dFSUdIVF9QMQkJCQkJIDB4MTVjMmMwCiAvKiBbUlcgMzFdIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgd2VpZ2h0IG9mIENPUzEgaW4gdGhlIEVUUyBjb21tYW5kIGFyYml0ZXIuICovCiAjZGVmaW5lIFBCRl9SRUdfQ09TMV9VUFBFUl9CT1VORAkJCQkgMHgxNWMwNjAKIC8qIFtSVyAzMV0gVGhlIHdlaWdodCBvZiBDT1MxIGluIHRoZSBFVFMgY29tbWFuZCBhcmJpdGVyLiAqLwogI2RlZmluZSBQQkZfUkVHX0NPUzFfV0VJR0hUCQkJCQkgMHgxNWMwNTgKKy8qIFtSVyAzMV0gVGhlIHdlaWdodCBvZiBDT1MxIGluIHBvcnQgMCBFVFMgY29tbWFuZCBhcmJpdGVyLiAqLworI2RlZmluZSBQQkZfUkVHX0NPUzFfV0VJR0hUX1AwCQkJCQkgMHgxNWMyYWMKKy8qIFtSVyAzMV0gVGhlIHdlaWdodCBvZiBDT1MxIGluIHBvcnQgMSBFVFMgY29tbWFuZCBhcmJpdGVyLiAqLworI2RlZmluZSBQQkZfUkVHX0NPUzFfV0VJR0hUX1AxCQkJCQkgMHgxNWMyYzQKKy8qIFtSVyAzMV0gVGhlIHdlaWdodCBvZiBDT1MyIGluIHBvcnQgMCBFVFMgY29tbWFuZCBhcmJpdGVyLiAqLworI2RlZmluZSBQQkZfUkVHX0NPUzJfV0VJR0hUX1AwCQkJCQkgMHgxNWMyYjAKKy8qIFtSVyAzMV0gVGhlIHdlaWdodCBvZiBDT1MyIGluIHBvcnQgMSBFVFMgY29tbWFuZCBhcmJpdGVyLiAqLworI2RlZmluZSBQQkZfUkVHX0NPUzJfV0VJR0hUX1AxCQkJCQkgMHgxNWMyYzgKKy8qIFtSVyAzMV0gVGhlIHdlaWdodCBvZiBDT1MzIGluIHBvcnQgMCBFVFMgY29tbWFuZCBhcmJpdGVyLiAqLworI2RlZmluZSBQQkZfUkVHX0NPUzNfV0VJR0hUX1AwCQkJCQkgMHgxNWMyYjQKKy8qIFtSVyAzMV0gVGhlIHdlaWdodCBvZiBDT1M0IGluIHBvcnQgMCBFVFMgY29tbWFuZCBhcmJpdGVyLiAqLworI2RlZmluZSBQQkZfUkVHX0NPUzRfV0VJR0hUX1AwCQkJCQkgMHgxNWMyYjgKKy8qIFtSVyAzMV0gVGhlIHdlaWdodCBvZiBDT1M1IGluIHBvcnQgMCBFVFMgY29tbWFuZCBhcmJpdGVyLiAqLworI2RlZmluZSBQQkZfUkVHX0NPUzVfV0VJR0hUX1AwCQkJCQkgMHgxNWMyYmMKKy8qIFtSIDExXSBDdXJyZW50IGNyZWRpdCBmb3IgdGhlIExCIHF1ZXVlIGluIHRoZSB0eCBwb3J0IGJ1ZmZlcnMgaW4gMTYgYnl0ZQorICogbGluZXMuICovCisjZGVmaW5lIFBCRl9SRUdfQ1JFRElUX0xCX1EJCQkJCSAweDE0MDMzOAorLyogW1IgMTFdIEN1cnJlbnQgY3JlZGl0IGZvciBxdWV1ZSAwIGluIHRoZSB0eCBwb3J0IGJ1ZmZlcnMgaW4gMTYgYnl0ZQorICogbGluZXMuICovCisjZGVmaW5lIFBCRl9SRUdfQ1JFRElUX1EwCQkJCQkgMHgxNDAzM2MKKy8qIFtSIDExXSBDdXJyZW50IGNyZWRpdCBmb3IgcXVldWUgMSBpbiB0aGUgdHggcG9ydCBidWZmZXJzIGluIDE2IGJ5dGUKKyAqIGxpbmVzLiAqLworI2RlZmluZSBQQkZfUkVHX0NSRURJVF9RMQkJCQkJIDB4MTQwMzQwCiAvKiBbUlcgMV0gRGlzYWJsZSBwcm9jZXNzaW5nIGZ1cnRoZXIgdGFza3MgZnJvbSBwb3J0IDAgKGFmdGVyIGVuZGluZyB0aGUKICAgIGN1cnJlbnQgdGFzayBpbiBwcm9jZXNzKS4gKi8KICNkZWZpbmUgUEJGX1JFR19ESVNBQkxFX05FV19UQVNLX1BST0NfUDAJCQkgMHgxNDAwNWMKQEAgLTIwNDIsNiArMjQwNCw1MiBAQAogICAgY3VycmVudCB0YXNrIGluIHByb2Nlc3MpLiAqLwogI2RlZmluZSBQQkZfUkVHX0RJU0FCTEVfTkVXX1RBU0tfUFJPQ19QNAkJCSAweDE0MDA2YwogI2RlZmluZSBQQkZfUkVHX0RJU0FCTEVfUEYJCQkJCSAweDE0MDJlOAorLyogW1JXIDE4XSBGb3IgcG9ydCAwOiBGb3IgZWFjaCBjbGllbnQgdGhhdCBpcyBzdWJqZWN0IHRvIFdGUSAodGhlCisgKiBjb3JyZXNwb25kaW5nIGJpdCBpcyAxKTsgaW5kaWNhdGVzIHRvIHdoaWNoIG9mIHRoZSBjcmVkaXQgcmVnaXN0ZXJzIHRoaXMKKyAqIGNsaWVudCBpcyBtYXBwZWQuIEZvciBjbGllbnRzIHdoaWNoIGFyZSBub3QgY3JlZGl0IGJsb2NrZWQ7IHRoZWlyIG1hcHBpbmcKKyAqIGlzIGRvbnQgY2FyZS4gKi8KKyNkZWZpbmUgUEJGX1JFR19FVFNfQVJCX0NMSUVOVF9DUkVESVRfTUFQX1AwCQkJIDB4MTVjMjg4CisvKiBbUlcgOV0gRm9yIHBvcnQgMTogRm9yIGVhY2ggY2xpZW50IHRoYXQgaXMgc3ViamVjdCB0byBXRlEgKHRoZQorICogY29ycmVzcG9uZGluZyBiaXQgaXMgMSk7IGluZGljYXRlcyB0byB3aGljaCBvZiB0aGUgY3JlZGl0IHJlZ2lzdGVycyB0aGlzCisgKiBjbGllbnQgaXMgbWFwcGVkLiBGb3IgY2xpZW50cyB3aGljaCBhcmUgbm90IGNyZWRpdCBibG9ja2VkOyB0aGVpciBtYXBwaW5nCisgKiBpcyBkb250IGNhcmUuICovCisjZGVmaW5lIFBCRl9SRUdfRVRTX0FSQl9DTElFTlRfQ1JFRElUX01BUF9QMQkJCSAweDE1YzI4YworLyogW1JXIDZdIEZvciBwb3J0IDA6IEJpdCBwZXIgY2xpZW50IHRvIGluZGljYXRlIGlmIHRoZSBjbGllbnQgY29tcGV0ZXMgaW4KKyAqIHRoZSBzdHJpY3QgcHJpb3JpdHkgYXJiaXRlciBkaXJlY3RseSAoY29ycmVzcG9uZGluZyBiaXQgPSAxKTsgb3IgZmlyc3QKKyAqIGdvZXMgdG8gdGhlIFJSIGFyYml0ZXIgKGNvcnJlc3BvbmRpbmcgYml0ID0gMCk7IGFuZCB0aGVuIGNvbXBldGVzIGluIHRoZQorICogbG93ZXN0IHByaW9yaXR5IGluIHRoZSBzdHJpY3QtcHJpb3JpdHkgYXJiaXRlci4gKi8KKyNkZWZpbmUgUEJGX1JFR19FVFNfQVJCX0NMSUVOVF9JU19TVFJJQ1RfUDAJCQkgMHgxNWMyNzgKKy8qIFtSVyAzXSBGb3IgcG9ydCAxOiBCaXQgcGVyIGNsaWVudCB0byBpbmRpY2F0ZSBpZiB0aGUgY2xpZW50IGNvbXBldGVzIGluCisgKiB0aGUgc3RyaWN0IHByaW9yaXR5IGFyYml0ZXIgZGlyZWN0bHkgKGNvcnJlc3BvbmRpbmcgYml0ID0gMSk7IG9yIGZpcnN0CisgKiBnb2VzIHRvIHRoZSBSUiBhcmJpdGVyIChjb3JyZXNwb25kaW5nIGJpdCA9IDApOyBhbmQgdGhlbiBjb21wZXRlcyBpbiB0aGUKKyAqIGxvd2VzdCBwcmlvcml0eSBpbiB0aGUgc3RyaWN0LXByaW9yaXR5IGFyYml0ZXIuICovCisjZGVmaW5lIFBCRl9SRUdfRVRTX0FSQl9DTElFTlRfSVNfU1RSSUNUX1AxCQkJIDB4MTVjMjdjCisvKiBbUlcgNl0gRm9yIHBvcnQgMDogQml0IHBlciBjbGllbnQgdG8gaW5kaWNhdGUgaWYgdGhlIGNsaWVudCBpcyBzdWJqZWN0IHRvCisgKiBXRlEgY3JlZGl0IGJsb2NraW5nIChjb3JyZXNwb25kaW5nIGJpdCA9IDEpLiAqLworI2RlZmluZSBQQkZfUkVHX0VUU19BUkJfQ0xJRU5UX0lTX1NVQkpFQ1QyV0ZRX1AwCQkgMHgxNWMyODAKKy8qIFtSVyAzXSBGb3IgcG9ydCAwOiBCaXQgcGVyIGNsaWVudCB0byBpbmRpY2F0ZSBpZiB0aGUgY2xpZW50IGlzIHN1YmplY3QgdG8KKyAqIFdGUSBjcmVkaXQgYmxvY2tpbmcgKGNvcnJlc3BvbmRpbmcgYml0ID0gMSkuICovCisjZGVmaW5lIFBCRl9SRUdfRVRTX0FSQl9DTElFTlRfSVNfU1VCSkVDVDJXRlFfUDEJCSAweDE1YzI4NAorLyogW1JXIDE2XSBGb3IgcG9ydCAwOiBUaGUgbnVtYmVyIG9mIHN0cmljdCBwcmlvcml0eSBhcmJpdHJhdGlvbiBzbG90cworICogYmV0d2VlbiAyIFJSIGFyYml0cmF0aW9uIHNsb3RzLiBBIHZhbHVlIG9mIDAgbWVhbnMgbm8gc3RyaWN0IHByaW9yaXR5CisgKiBjeWNsZXM7IGkuZS4gdGhlIHN0cmljdC1wcmlvcml0eSB3LyBhbnRpLXN0YXJ2YXRpb24gYXJiaXRlciBpcyBhIFJSCisgKiBhcmJpdGVyLiAqLworI2RlZmluZSBQQkZfUkVHX0VUU19BUkJfTlVNX1NUUklDVF9BUkJfU0xPVFNfUDAJCQkgMHgxNWMyYTAKKy8qIFtSVyAxNl0gRm9yIHBvcnQgMTogVGhlIG51bWJlciBvZiBzdHJpY3QgcHJpb3JpdHkgYXJiaXRyYXRpb24gc2xvdHMKKyAqIGJldHdlZW4gMiBSUiBhcmJpdHJhdGlvbiBzbG90cy4gQSB2YWx1ZSBvZiAwIG1lYW5zIG5vIHN0cmljdCBwcmlvcml0eQorICogY3ljbGVzOyBpLmUuIHRoZSBzdHJpY3QtcHJpb3JpdHkgdy8gYW50aS1zdGFydmF0aW9uIGFyYml0ZXIgaXMgYSBSUgorICogYXJiaXRlci4gKi8KKyNkZWZpbmUgUEJGX1JFR19FVFNfQVJCX05VTV9TVFJJQ1RfQVJCX1NMT1RTX1AxCQkJIDB4MTVjMmE0CisvKiBbUlcgMThdIEZvciBwb3J0IDA6IEluZGljYXRlcyB3aGljaCBjbGllbnQgaXMgY29ubmVjdGVkIHRvIGVhY2ggcHJpb3JpdHkKKyAqIGluIHRoZSBzdHJpY3QtcHJpb3JpdHkgYXJiaXRlci4gUHJpb3JpdHkgMCBpcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgYW5kCisgKiBwcmlvcml0eSA1IGlzIHRoZSBsb3dlc3Q7IHRvIHdoaWNoIHRoZSBSUiBvdXRwdXQgaXMgY29ubmVjdGVkIHRvICh0aGlzIGlzCisgKiBub3QgY29uZmlndXJhYmxlKS4gKi8KKyNkZWZpbmUgUEJGX1JFR19FVFNfQVJCX1BSSU9SSVRZX0NMSUVOVF9QMAkJCSAweDE1YzI3MAorLyogW1JXIDldIEZvciBwb3J0IDE6IEluZGljYXRlcyB3aGljaCBjbGllbnQgaXMgY29ubmVjdGVkIHRvIGVhY2ggcHJpb3JpdHkKKyAqIGluIHRoZSBzdHJpY3QtcHJpb3JpdHkgYXJiaXRlci4gUHJpb3JpdHkgMCBpcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgYW5kCisgKiBwcmlvcml0eSA1IGlzIHRoZSBsb3dlc3Q7IHRvIHdoaWNoIHRoZSBSUiBvdXRwdXQgaXMgY29ubmVjdGVkIHRvICh0aGlzIGlzCisgKiBub3QgY29uZmlndXJhYmxlKS4gKi8KKyNkZWZpbmUgUEJGX1JFR19FVFNfQVJCX1BSSU9SSVRZX0NMSUVOVF9QMQkJCSAweDE1YzI3NAogLyogW1JXIDFdIEluZGljYXRlcyB0aGF0IEVUUyBpcyBwZXJmb3JtZWQgYmV0d2VlbiB0aGUgQ09TZXMgaW4gdGhlIGNvbW1hbmQKICAqIGFyYml0ZXIuIElmIHJlc2V0IHN0cmljdCBwcmlvcml0eSB3LyBhbnRpLXN0YXJ2YXRpb24gd2lsbCBiZSBwZXJmb3JtZWQKICAqIHcvbyBXRlEuICovCkBAIC0yMDQ5LDE0ICsyNDU3LDI1IEBACiAvKiBbUlcgNl0gQml0LW1hcCBpbmRpY2F0aW5nIHdoaWNoIEwyIGhkcnMgbWF5IGFwcGVhciBhZnRlciB0aGUgYmFzaWMKICAqIEV0aGVybmV0IGhlYWRlci4gKi8KICNkZWZpbmUgUEJGX1JFR19IRFJTX0FGVEVSX0JBU0lDCQkJCSAweDE1YzBhOAotLyogW1JXIDFdIEluZGljYXRlcyB3aGljaCBDT1MgaXMgY29ubmN0ZWQgdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgaW4gdGhlCi0gKiBjb21tYW5kIGFyYml0ZXIuICovCisvKiBbUlcgNl0gQml0LW1hcCBpbmRpY2F0aW5nIHdoaWNoIEwyIGhkcnMgbWF5IGFwcGVhciBhZnRlciBMMiB0YWcgMCAqLworI2RlZmluZSBQQkZfUkVHX0hEUlNfQUZURVJfVEFHXzAJCQkJIDB4MTVjMGI4CisvKiBbUiAxXSBSZW1vdmVkIGZvciBFMyBCMCAtIEluZGljYXRlcyB3aGljaCBDT1MgaXMgY29ubmN0ZWQgdG8gdGhlIGhpZ2hlc3QKKyAqIHByaW9yaXR5IGluIHRoZSBjb21tYW5kIGFyYml0ZXIuICovCiAjZGVmaW5lIFBCRl9SRUdfSElHSF9QUklPUklUWV9DT1NfTlVNCQkJCSAweDE1YzA0YwogI2RlZmluZSBQQkZfUkVHX0lGX0VOQUJMRV9SRUcJCQkJCSAweDE0MDA0NAogLyogW1JXIDFdIEluaXQgYml0LiBXaGVuIHNldCB0aGUgaW5pdGlhbCBjcmVkaXRzIGFyZSBjb3BpZWQgdG8gdGhlIGNyZWRpdAogICAgcmVnaXN0ZXJzIChleGNlcHQgdGhlIHBvcnQgY3JlZGl0cykuIFNob3VsZCBiZSBzZXQgYW5kIHRoZW4gcmVzZXQgYWZ0ZXIKICAgIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBibG9jayBoYXMgZW5kZWQuICovCiAjZGVmaW5lIFBCRl9SRUdfSU5JVAkJCQkJCSAweDE0MDAwMAorLyogW1JXIDExXSBJbml0aWFsIGNyZWRpdCBmb3IgdGhlIExCIHF1ZXVlIGluIHRoZSB0eCBwb3J0IGJ1ZmZlcnMgaW4gMTYgYnl0ZQorICogbGluZXMuICovCisjZGVmaW5lIFBCRl9SRUdfSU5JVF9DUkRfTEJfUQkJCQkJIDB4MTVjMjQ4CisvKiBbUlcgMTFdIEluaXRpYWwgY3JlZGl0IGZvciBxdWV1ZSAwIGluIHRoZSB0eCBwb3J0IGJ1ZmZlcnMgaW4gMTYgYnl0ZQorICogbGluZXMuICovCisjZGVmaW5lIFBCRl9SRUdfSU5JVF9DUkRfUTAJCQkJCSAweDE1YzIzMAorLyogW1JXIDExXSBJbml0aWFsIGNyZWRpdCBmb3IgcXVldWUgMSBpbiB0aGUgdHggcG9ydCBidWZmZXJzIGluIDE2IGJ5dGUKKyAqIGxpbmVzLiAqLworI2RlZmluZSBQQkZfUkVHX0lOSVRfQ1JEX1ExCQkJCQkgMHgxNWMyMzQKIC8qIFtSVyAxXSBJbml0IGJpdCBmb3IgcG9ydCAwLiBXaGVuIHNldCB0aGUgaW5pdGlhbCBjcmVkaXQgb2YgcG9ydCAwIGlzCiAgICBjb3BpZWQgdG8gdGhlIGNyZWRpdCByZWdpc3Rlci4gU2hvdWxkIGJlIHNldCBhbmQgdGhlbiByZXNldCBhZnRlciB0aGUKICAgIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBvcnQgaGFzIGVuZGVkLiAqLwpAQCAtMjA2OSw2ICsyNDg4LDE1IEBACiAgICBjb3BpZWQgdG8gdGhlIGNyZWRpdCByZWdpc3Rlci4gU2hvdWxkIGJlIHNldCBhbmQgdGhlbiByZXNldCBhZnRlciB0aGUKICAgIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBvcnQgaGFzIGVuZGVkLiAqLwogI2RlZmluZSBQQkZfUkVHX0lOSVRfUDQgCQkJCQkgMHgxNDAwMGMKKy8qIFtSIDMyXSBDeWNsaWMgY291bnRlciBmb3IgdGhlIGFtb3VudCBjcmVkaXRzIGluIDE2IGJ5dGVzIGxpbmVzIGFkZGVkIGZvcgorICogdGhlIExCIHF1ZXVlLiBSZXNldCB1cG9uIGluaXQuICovCisjZGVmaW5lIFBCRl9SRUdfSU5URVJOQUxfQ1JEX0ZSRUVEX0NOVF9MQl9RCQkJIDB4MTQwMzU0CisvKiBbUiAzMl0gQ3ljbGljIGNvdW50ZXIgZm9yIHRoZSBhbW91bnQgY3JlZGl0cyBpbiAxNiBieXRlcyBsaW5lcyBhZGRlZCBmb3IKKyAqIHF1ZXVlIDAuIFJlc2V0IHVwb24gaW5pdC4gKi8KKyNkZWZpbmUgUEJGX1JFR19JTlRFUk5BTF9DUkRfRlJFRURfQ05UX1EwCQkJIDB4MTQwMzU4CisvKiBbUiAzMl0gQ3ljbGljIGNvdW50ZXIgZm9yIHRoZSBhbW91bnQgY3JlZGl0cyBpbiAxNiBieXRlcyBsaW5lcyBhZGRlZCBmb3IKKyAqIHF1ZXVlIDEuIFJlc2V0IHVwb24gaW5pdC4gKi8KKyNkZWZpbmUgUEJGX1JFR19JTlRFUk5BTF9DUkRfRlJFRURfQ05UX1ExCQkJIDB4MTQwMzVjCiAvKiBbUlcgMV0gRW5hYmxlIGZvciBtYWMgaW50ZXJmYWNlIDAuICovCiAjZGVmaW5lIFBCRl9SRUdfTUFDX0lGMF9FTkFCTEUJCQkJCSAweDE0MDAzMAogLyogW1JXIDFdIEVuYWJsZSBmb3IgbWFjIGludGVyZmFjZSAxLiAqLwpAQCAtMjA4OSwyNCArMjUxNyw0OSBAQAogLyogW1JXIDExXSBJbml0aWFsIGNyZWRpdCBmb3IgcG9ydCAwIGluIHRoZSB0eCBwb3J0IGJ1ZmZlcnMgaW4gMTYgYnl0ZQogICAgbGluZXMuICovCiAjZGVmaW5lIFBCRl9SRUdfUDBfSU5JVF9DUkQJCQkJCSAweDE0MDBkMAotLyogW1JXIDFdIEluZGljYXRpb24gdGhhdCBwYXVzZSBpcyBlbmFibGVkIGZvciBwb3J0IDAuICovCi0jZGVmaW5lIFBCRl9SRUdfUDBfUEFVU0VfRU5BQkxFIAkJCQkgMHgxNDAwMTQKLS8qIFtSIDhdIE51bWJlciBvZiB0YXNrcyBpbiBwb3J0IDAgdGFzayBxdWV1ZS4gKi8KKy8qIFtSIDMyXSBDeWNsaWMgY291bnRlciBmb3IgdGhlIGFtb3VudCBjcmVkaXRzIGluIDE2IGJ5dGVzIGxpbmVzIGFkZGVkIGZvcgorICogcG9ydCAwLiBSZXNldCB1cG9uIGluaXQuICovCisjZGVmaW5lIFBCRl9SRUdfUDBfSU5URVJOQUxfQ1JEX0ZSRUVEX0NOVAkJCSAweDE0MDMwOAorLyogW1IgMV0gUmVtb3ZlZCBmb3IgRTMgQjAgLSBJbmRpY2F0aW9uIHRoYXQgcGF1c2UgaXMgZW5hYmxlZCBmb3IgcG9ydCAwLiAqLworI2RlZmluZSBQQkZfUkVHX1AwX1BBVVNFX0VOQUJMRQkJCQkJIDB4MTQwMDE0CisvKiBbUiA4XSBSZW1vdmVkIGZvciBFMyBCMCAtIE51bWJlciBvZiB0YXNrcyBpbiBwb3J0IDAgdGFzayBxdWV1ZS4gKi8KICNkZWZpbmUgUEJGX1JFR19QMF9UQVNLX0NOVAkJCQkJIDB4MTQwMjA0Ci0vKiBbUiAxMV0gQ3VycmVudCBjcmVkaXQgZm9yIHBvcnQgMSBpbiB0aGUgdHggcG9ydCBidWZmZXJzIGluIDE2IGJ5dGUgbGluZXMuICovCisvKiBbUiAzMl0gUmVtb3ZlZCBmb3IgRTMgQjAgLSBDeWNsaWMgY291bnRlciBmb3IgbnVtYmVyIG9mIDggYnl0ZSBsaW5lcworICogZnJlZWQgZnJvbSB0aGUgdGFzayBxdWV1ZSBvZiBwb3J0IDAuIFJlc2V0IHVwb24gaW5pdC4gKi8KKyNkZWZpbmUgUEJGX1JFR19QMF9UUV9MSU5FU19GUkVFRF9DTlQJCQkJIDB4MTQwMmYwCisvKiBbUiAxMl0gTnVtYmVyIG9mIDggYnl0ZXMgbGluZXMgb2NjdXBpZWQgaW4gdGhlIHRhc2sgcXVldWUgb2YgcG9ydCAwLiAqLworI2RlZmluZSBQQkZfUkVHX1AwX1RRX09DQ1VQQU5DWQkJCQkJIDB4MTQwMmZjCisvKiBbUiAxMV0gUmVtb3ZlZCBmb3IgRTMgQjAgLSBDdXJyZW50IGNyZWRpdCBmb3IgcG9ydCAxIGluIHRoZSB0eCBwb3J0CisgKiBidWZmZXJzIGluIDE2IGJ5dGUgbGluZXMuICovCiAjZGVmaW5lIFBCRl9SRUdfUDFfQ1JFRElUCQkJCQkgMHgxNDAyMDgKLS8qIFtSVyAxMV0gSW5pdGlhbCBjcmVkaXQgZm9yIHBvcnQgMSBpbiB0aGUgdHggcG9ydCBidWZmZXJzIGluIDE2IGJ5dGUKLSAgIGxpbmVzLiAqLworLyogW1IgMTFdIFJlbW92ZWQgZm9yIEUzIEIwIC0gSW5pdGlhbCBjcmVkaXQgZm9yIHBvcnQgMCBpbiB0aGUgdHggcG9ydAorICogYnVmZmVycyBpbiAxNiBieXRlIGxpbmVzLiAqLwogI2RlZmluZSBQQkZfUkVHX1AxX0lOSVRfQ1JECQkJCQkgMHgxNDAwZDQKLS8qIFtSIDhdIE51bWJlciBvZiB0YXNrcyBpbiBwb3J0IDEgdGFzayBxdWV1ZS4gKi8KKy8qIFtSIDMyXSBDeWNsaWMgY291bnRlciBmb3IgdGhlIGFtb3VudCBjcmVkaXRzIGluIDE2IGJ5dGVzIGxpbmVzIGFkZGVkIGZvcgorICogcG9ydCAxLiBSZXNldCB1cG9uIGluaXQuICovCisjZGVmaW5lIFBCRl9SRUdfUDFfSU5URVJOQUxfQ1JEX0ZSRUVEX0NOVAkJCSAweDE0MDMwYworLyogW1IgOF0gUmVtb3ZlZCBmb3IgRTMgQjAgLSBOdW1iZXIgb2YgdGFza3MgaW4gcG9ydCAxIHRhc2sgcXVldWUuICovCiAjZGVmaW5lIFBCRl9SRUdfUDFfVEFTS19DTlQJCQkJCSAweDE0MDIwYworLyogW1IgMzJdIFJlbW92ZWQgZm9yIEUzIEIwIC0gQ3ljbGljIGNvdW50ZXIgZm9yIG51bWJlciBvZiA4IGJ5dGUgbGluZXMKKyAqIGZyZWVkIGZyb20gdGhlIHRhc2sgcXVldWUgb2YgcG9ydCAxLiBSZXNldCB1cG9uIGluaXQuICovCisjZGVmaW5lIFBCRl9SRUdfUDFfVFFfTElORVNfRlJFRURfQ05UCQkJCSAweDE0MDJmNAorLyogW1IgMTJdIE51bWJlciBvZiA4IGJ5dGVzIGxpbmVzIG9jY3VwaWVkIGluIHRoZSB0YXNrIHF1ZXVlIG9mIHBvcnQgMS4gKi8KKyNkZWZpbmUgUEJGX1JFR19QMV9UUV9PQ0NVUEFOQ1kJCQkJCSAweDE0MDMwMAogLyogW1IgMTFdIEN1cnJlbnQgY3JlZGl0IGZvciBwb3J0IDQgaW4gdGhlIHR4IHBvcnQgYnVmZmVycyBpbiAxNiBieXRlIGxpbmVzLiAqLwogI2RlZmluZSBQQkZfUkVHX1A0X0NSRURJVAkJCQkJIDB4MTQwMjEwCiAvKiBbUlcgMTFdIEluaXRpYWwgY3JlZGl0IGZvciBwb3J0IDQgaW4gdGhlIHR4IHBvcnQgYnVmZmVycyBpbiAxNiBieXRlCiAgICBsaW5lcy4gKi8KICNkZWZpbmUgUEJGX1JFR19QNF9JTklUX0NSRAkJCQkJIDB4MTQwMGUwCi0vKiBbUiA4XSBOdW1iZXIgb2YgdGFza3MgaW4gcG9ydCA0IHRhc2sgcXVldWUuICovCisvKiBbUiAzMl0gQ3ljbGljIGNvdW50ZXIgZm9yIHRoZSBhbW91bnQgY3JlZGl0cyBpbiAxNiBieXRlcyBsaW5lcyBhZGRlZCBmb3IKKyAqIHBvcnQgNC4gUmVzZXQgdXBvbiBpbml0LiAqLworI2RlZmluZSBQQkZfUkVHX1A0X0lOVEVSTkFMX0NSRF9GUkVFRF9DTlQJCQkgMHgxNDAzMTAKKy8qIFtSIDhdIFJlbW92ZWQgZm9yIEUzIEIwIC0gTnVtYmVyIG9mIHRhc2tzIGluIHBvcnQgNCB0YXNrIHF1ZXVlLiAqLwogI2RlZmluZSBQQkZfUkVHX1A0X1RBU0tfQ05UCQkJCQkgMHgxNDAyMTQKKy8qIFtSIDMyXSBSZW1vdmVkIGZvciBFMyBCMCAtIEN5Y2xpYyBjb3VudGVyIGZvciBudW1iZXIgb2YgOCBieXRlIGxpbmVzCisgKiBmcmVlZCBmcm9tIHRoZSB0YXNrIHF1ZXVlIG9mIHBvcnQgNC4gUmVzZXQgdXBvbiBpbml0LiAqLworI2RlZmluZSBQQkZfUkVHX1A0X1RRX0xJTkVTX0ZSRUVEX0NOVAkJCQkgMHgxNDAyZjgKKy8qIFtSIDEyXSBOdW1iZXIgb2YgOCBieXRlcyBsaW5lcyBvY2N1cGllZCBpbiB0aGUgdGFzayBxdWV1ZSBvZiBwb3J0IDQuICovCisjZGVmaW5lIFBCRl9SRUdfUDRfVFFfT0NDVVBBTkNZCQkJCQkgMHgxNDAzMDQKIC8qIFtSVyA1XSBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAjMCByZWFkL3dyaXRlICovCiAjZGVmaW5lIFBCRl9SRUdfUEJGX0lOVF9NQVNLCQkJCQkgMHgxNDAxZDQKIC8qIFtSIDVdIEludGVycnVwdCByZWdpc3RlciAjMCByZWFkICovCkBAIC0yMTE1LDYgKzI1NjgsMjcgQEAKICNkZWZpbmUgUEJGX1JFR19QQkZfUFJUWV9NQVNLCQkJCQkgMHgxNDAxZTQKIC8qIFtSQyAyMF0gUGFyaXR5IHJlZ2lzdGVyICMwIHJlYWQgY2xlYXIgKi8KICNkZWZpbmUgUEJGX1JFR19QQkZfUFJUWV9TVFNfQ0xSCQkJCSAweDE0MDFkYworLyogW1JXIDE2XSBUaGUgRXRoZXJuZXQgdHlwZSB2YWx1ZSBmb3IgTDIgdGFnIDAgKi8KKyNkZWZpbmUgUEJGX1JFR19UQUdfRVRIRVJUWVBFXzAJCQkJCSAweDE1YzA5MAorLyogW1JXIDRdIFRoZSBsZW5ndGggb2YgdGhlIGluZm8gZmllbGQgZm9yIEwyIHRhZyAwLiBUaGUgbGVuZ3RoIGlzIGJldHdlZW4KKyAqIDJCIGFuZCAxNEI7IGluIDJCIGdyYW51bGFyaXR5ICovCisjZGVmaW5lIFBCRl9SRUdfVEFHX0xFTl8wCQkJCQkgMHgxNWMwOWMKKy8qIFtSIDMyXSBDeWNsaWMgY291bnRlciBmb3IgbnVtYmVyIG9mIDggYnl0ZSBsaW5lcyBmcmVlZCBmcm9tIHRoZSBMQiB0YXNrCisgKiBxdWV1ZS4gUmVzZXQgdXBvbiBpbml0LiAqLworI2RlZmluZSBQQkZfUkVHX1RRX0xJTkVTX0ZSRUVEX0NOVF9MQl9RCQkJCSAweDE0MDM4YworLyogW1IgMzJdIEN5Y2xpYyBjb3VudGVyIGZvciBudW1iZXIgb2YgOCBieXRlIGxpbmVzIGZyZWVkIGZyb20gdGhlIHRhc2sKKyAqIHF1ZXVlIDAuIFJlc2V0IHVwb24gaW5pdC4gKi8KKyNkZWZpbmUgUEJGX1JFR19UUV9MSU5FU19GUkVFRF9DTlRfUTAJCQkJIDB4MTQwMzkwCisvKiBbUiAzMl0gQ3ljbGljIGNvdW50ZXIgZm9yIG51bWJlciBvZiA4IGJ5dGUgbGluZXMgZnJlZWQgZnJvbSB0YXNrIHF1ZXVlIDEuCisgKiBSZXNldCB1cG9uIGluaXQuICovCisjZGVmaW5lIFBCRl9SRUdfVFFfTElORVNfRlJFRURfQ05UX1ExCQkJCSAweDE0MDM5NAorLyogW1IgMTNdIE51bWJlciBvZiA4IGJ5dGVzIGxpbmVzIG9jY3VwaWVkIGluIHRoZSB0YXNrIHF1ZXVlIG9mIHRoZSBMQgorICogcXVldWUuICovCisjZGVmaW5lIFBCRl9SRUdfVFFfT0NDVVBBTkNZX0xCX1EJCQkJIDB4MTQwM2E4CisvKiBbUiAxM10gTnVtYmVyIG9mIDggYnl0ZXMgbGluZXMgb2NjdXBpZWQgaW4gdGhlIHRhc2sgcXVldWUgb2YgcXVldWUgMC4gKi8KKyNkZWZpbmUgUEJGX1JFR19UUV9PQ0NVUEFOQ1lfUTAJCQkJCSAweDE0MDNhYworLyogW1IgMTNdIE51bWJlciBvZiA4IGJ5dGVzIGxpbmVzIG9jY3VwaWVkIGluIHRoZSB0YXNrIHF1ZXVlIG9mIHF1ZXVlIDEuICovCisjZGVmaW5lIFBCRl9SRUdfVFFfT0NDVVBBTkNZX1ExCQkJCQkgMHgxNDAzYjAKICNkZWZpbmUgUEJfUkVHX0NPTlRST0wJCQkJCQkgMAogLyogW1JXIDJdIEludGVycnVwdCBtYXNrIHJlZ2lzdGVyICMwIHJlYWQvd3JpdGUgKi8KICNkZWZpbmUgUEJfUkVHX1BCX0lOVF9NQVNLCQkJCQkgMHgyOApAQCAtMjIwNiw4ICsyNjgwLDEyIEBACiAjZGVmaW5lIFBHTFVFX0JfUkVHX1BHTFVFX0JfSU5UX1NUUwkJCQkgMHg5Mjk4CiAvKiBbUkMgOV0gSW50ZXJydXB0IHJlZ2lzdGVyICMwIHJlYWQgY2xlYXIgKi8KICNkZWZpbmUgUEdMVUVfQl9SRUdfUEdMVUVfQl9JTlRfU1RTX0NMUgkJCSAweDkyOWMKKy8qIFtSVyAyXSBQYXJpdHkgbWFzayByZWdpc3RlciAjMCByZWFkL3dyaXRlICovCisjZGVmaW5lIFBHTFVFX0JfUkVHX1BHTFVFX0JfUFJUWV9NQVNLCQkJCSAweDkyYjQKIC8qIFtSIDJdIFBhcml0eSByZWdpc3RlciAjMCByZWFkICovCiAjZGVmaW5lIFBHTFVFX0JfUkVHX1BHTFVFX0JfUFJUWV9TVFMJCQkJIDB4OTJhOAorLyogW1JDIDJdIFBhcml0eSByZWdpc3RlciAjMCByZWFkIGNsZWFyICovCisjZGVmaW5lIFBHTFVFX0JfUkVHX1BHTFVFX0JfUFJUWV9TVFNfQ0xSCQkJIDB4OTJhYwogLyogW1IgMTNdIERldGFpbHMgb2YgZmlyc3QgcmVxdWVzdCByZWNlaXZlZCB3aXRoIGVycm9yLiBbMjowXSAtIFBGSUQuIFszXSAtCiAgKiBWRl9WQUxJRC4gWzk6NF0gLSBWRklELiBbMTE6MTBdIC0gRXJyb3IgQ29kZSAtIDAgLSBJbmRpY2F0ZXMgQ29tcGxldGlvbgogICogVGltZW91dCBvZiBhIFVzZXIgVHggbm9uLXBvc3RlZCByZXF1ZXN0LiAxIC0gdW5zdXBwb3J0ZWQgcmVxdWVzdC4gMiAtCkBAIC0yNDQ0LDEwICsyOTIyLDI0IEBACiAvKiBbUlcgNl0gQml0LW1hcCBpbmRpY2F0aW5nIHdoaWNoIEwyIGhkcnMgbWF5IGFwcGVhciBhZnRlciB0aGUgYmFzaWMKICAqIEV0aGVybmV0IGhlYWRlci4gKi8KICNkZWZpbmUgUFJTX1JFR19IRFJTX0FGVEVSX0JBU0lDCQkJCSAweDQwMjM4CisvKiBbUlcgNl0gQml0LW1hcCBpbmRpY2F0aW5nIHdoaWNoIEwyIGhkcnMgbWF5IGFwcGVhciBhZnRlciB0aGUgYmFzaWMKKyAqIEV0aGVybmV0IGhlYWRlciBmb3IgcG9ydCAwIHBhY2tldHMuICovCisjZGVmaW5lIFBSU19SRUdfSERSU19BRlRFUl9CQVNJQ19QT1JUXzAJCQkJIDB4NDAyNzAKKyNkZWZpbmUgUFJTX1JFR19IRFJTX0FGVEVSX0JBU0lDX1BPUlRfMQkJCQkgMHg0MDI5MAorLyogW1IgNl0gQml0LW1hcCBpbmRpY2F0aW5nIHdoaWNoIEwyIGhkcnMgbWF5IGFwcGVhciBhZnRlciBMMiB0YWcgMCAqLworI2RlZmluZSBQUlNfUkVHX0hEUlNfQUZURVJfVEFHXzAJCQkJIDB4NDAyNDgKKy8qIFtSVyA2XSBCaXQtbWFwIGluZGljYXRpbmcgd2hpY2ggTDIgaGRycyBtYXkgYXBwZWFyIGFmdGVyIEwyIHRhZyAwIGZvcgorICogcG9ydCAwIHBhY2tldHMgKi8KKyNkZWZpbmUgUFJTX1JFR19IRFJTX0FGVEVSX1RBR18wX1BPUlRfMAkJCQkgMHg0MDI4MAorI2RlZmluZSBQUlNfUkVHX0hEUlNfQUZURVJfVEFHXzBfUE9SVF8xCQkJCSAweDQwMmEwCiAvKiBbUlcgNF0gVGhlIGluY3JlbWVudCB2YWx1ZSB0byBzZW5kIGluIHRoZSBDRkMgbG9hZCByZXF1ZXN0IG1lc3NhZ2UgKi8KICNkZWZpbmUgUFJTX1JFR19JTkNfVkFMVUUJCQkJCSAweDQwMDQ4CiAvKiBbUlcgNl0gQml0LW1hcCBpbmRpY2F0aW5nIHdoaWNoIGhlYWRlcnMgbXVzdCBhcHBlYXIgaW4gdGhlIHBhY2tldCAqLwogI2RlZmluZSBQUlNfUkVHX01VU1RfSEFWRV9IRFJTCQkJCQkgMHg0MDI1NAorLyogW1JXIDZdIEJpdC1tYXAgaW5kaWNhdGluZyB3aGljaCBoZWFkZXJzIG11c3QgYXBwZWFyIGluIHRoZSBwYWNrZXQgZm9yCisgKiBwb3J0IDAgcGFja2V0cyAqLworI2RlZmluZSBQUlNfUkVHX01VU1RfSEFWRV9IRFJTX1BPUlRfMAkJCQkgMHg0MDI4YworI2RlZmluZSBQUlNfUkVHX01VU1RfSEFWRV9IRFJTX1BPUlRfMQkJCQkgMHg0MDJhYwogI2RlZmluZSBQUlNfUkVHX05JQ19NT0RFCQkJCQkgMHg0MDEzOAogLyogW1JXIDhdIFRoZSA4LWJpdCBldmVudCBJRCBmb3IgY2FzZXMgd2hlcmUgdGhlcmUgaXMgbm8gbWF0Y2ggb24gdGhlCiAgICBjb25uZWN0aW9uLiBVc2VkIGluIHBhY2tldCBzdGFydCBtZXNzYWdlIHRvIFRDTS4gKi8KQEAgLTI0OTYsNiArMjk4OCwxMSBAQAogI2RlZmluZSBQUlNfUkVHX1NFUklBTF9OVU1fU1RBVFVTX01TQgkJCQkgMHg0MDE1OAogLyogW1IgNF0gZGVidWcgb25seTogU1JDIGN1cnJlbnQgY3JlZGl0LiBUcmFuc2FjdGlvbiBiYXNlZC4gKi8KICNkZWZpbmUgUFJTX1JFR19TUkNfQ1VSUkVOVF9DUkVESVQJCQkJIDB4NDAxNmMKKy8qIFtSVyAxNl0gVGhlIEV0aGVybmV0IHR5cGUgdmFsdWUgZm9yIEwyIHRhZyAwICovCisjZGVmaW5lIFBSU19SRUdfVEFHX0VUSEVSVFlQRV8wCQkJCQkgMHg0MDFkNAorLyogW1JXIDRdIFRoZSBsZW5ndGggb2YgdGhlIGluZm8gZmllbGQgZm9yIEwyIHRhZyAwLiBUaGUgbGVuZ3RoIGlzIGJldHdlZW4KKyAqIDJCIGFuZCAxNEI7IGluIDJCIGdyYW51bGFyaXR5ICovCisjZGVmaW5lIFBSU19SRUdfVEFHX0xFTl8wCQkJCQkgMHg0MDIyYwogLyogW1IgOF0gZGVidWcgb25seTogVENNIGN1cnJlbnQgY3JlZGl0LiBDeWNsZSBiYXNlZC4gKi8KICNkZWZpbmUgUFJTX1JFR19UQ01fQ1VSUkVOVF9DUkVESVQJCQkJIDB4NDAxNjAKIC8qIFtSIDhdIGRlYnVnIG9ubHk6IFRTRE0gY3VycmVudCBjcmVkaXQuIFRyYW5zYWN0aW9uIGJhc2VkLiAqLwpAQCAtMzA4MCw2ICszNTc3LDcgQEAKICNkZWZpbmUgUU1fUkVHX0JZVEVDUkVESVRBRlVMTFRIUgkJCQkgMHgxNjgwOTQKIC8qIFtSVyA0XSBUaGUgaW5pdGlhbCBjcmVkaXQgZm9yIGludGVyZmFjZSAqLwogI2RlZmluZSBRTV9SRUdfQ01JTklUQ1JEXzAJCQkJCSAweDE2ODBjYworI2RlZmluZSBRTV9SRUdfQllURUNSRENNRFFfMAkJCQkJIDB4MTZlNmU4CiAjZGVmaW5lIFFNX1JFR19DTUlOSVRDUkRfMQkJCQkJIDB4MTY4MGQwCiAjZGVmaW5lIFFNX1JFR19DTUlOSVRDUkRfMgkJCQkJIDB4MTY4MGQ0CiAjZGVmaW5lIFFNX1JFR19DTUlOSVRDUkRfMwkJCQkJIDB4MTY4MGQ4CkBAIC0zMTcwLDcgKzM2NjgsMTAgQEAKIC8qIFtSVyAyXSBUaGUgUENJIGF0dHJpYnV0ZXMgZmllbGQgdXNlZCBpbiB0aGUgUENJIHJlcXVlc3QuICovCiAjZGVmaW5lIFFNX1JFR19QQ0lSRVFBVCAJCQkJCSAweDE2ODA1NAogI2RlZmluZSBRTV9SRUdfUEZfRU4JCQkJCQkgMHgxNmU3MGMKLS8qIFtSIDE2XSBUaGUgYnl0ZSBjcmVkaXQgb2YgcG9ydCAwICovCisvKiBbUiAyNF0gVGhlIG51bWJlciBvZiB0YXNrcyBzdG9yZWQgaW4gdGhlIFFNIGZvciB0aGUgUEYuIG9ubHkgZXZlbgorICogZnVuY3Rpb25zIGFyZSB2YWxpZCBpbiBFMiAob2RkIEkgcmVnaXN0ZXJzIHdpbGwgYmUgaGFyZCB3aXJlZCB0byAwKSAqLworI2RlZmluZSBRTV9SRUdfUEZfVVNHX0NOVF8wCQkJCQkgMHgxNmUwNDAKKy8qIFtSIDE2XSBOT1QgVVNFRCAqLwogI2RlZmluZSBRTV9SRUdfUE9SVDBCWVRFQ1JECQkJCQkgMHgxNjgzMDAKIC8qIFtSIDE2XSBUaGUgYnl0ZSBjcmVkaXQgb2YgcG9ydCAxICovCiAjZGVmaW5lIFFNX1JFR19QT1JUMUJZVEVDUkQJCQkJCSAweDE2ODMwNApAQCAtMzcyNSw3ICs0MjI2LDcgQEAKICAgIG1lY2hhbmlzbS4gVGhlIGZpZWxkcyBhcmU6IFs1OjBdIC0gbGVuZ3RoIG9mIHRoZSBtZXNzYWdlOyAxNTo2XSAtIG1lc3NhZ2UKICAgIHBvaW50ZXI7IDIwOjE2XSAtIG5leHQgcG9pbnRlci4gKi8KICNkZWZpbmUgVENNX1JFR19YWF9ERVNDUl9UQUJMRQkJCQkJIDB4NTAyODAKLSNkZWZpbmUgVENNX1JFR19YWF9ERVNDUl9UQUJMRV9TSVpFCQkJCSAzMgorI2RlZmluZSBUQ01fUkVHX1hYX0RFU0NSX1RBQkxFX1NJWkUJCQkJIDI5CiAvKiBbUiA2XSBVc2UgdG8gcmVhZCB0aGUgdmFsdWUgb2YgWFggcHJvdGVjdGlvbiBGcmVlIGNvdW50ZXIuICovCiAjZGVmaW5lIFRDTV9SRUdfWFhfRlJFRSAJCQkJCSAweDUwMTc4CiAvKiBbUlcgNl0gSW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNyZWRpdCBjb3VudGVyOyByZXNwb25zaWJsZSBmb3IgZnVsZmlsbGluZwpAQCAtMzc4Miw2ICs0MjgzLDggQEAKICNkZWZpbmUgVE1fUkVHX0xJTjBfTE9HSUNfQUREUgkJCQkJIDB4MTY0MjQwCiAvKiBbUlcgMThdIExpbmVhcjAgTWF4IGFjdGl2ZSBjaWQgKGluIGJhbmtzIG9mIDMyIGVudHJpZXMpLiAqLwogI2RlZmluZSBUTV9SRUdfTElOMF9NQVhfQUNUSVZFX0NJRAkJCQkgMHgxNjQwNDgKKy8qIFtTVCAxNl0gTGluZWFyMCBOdW1iZXIgb2Ygc2NhbnMgY291bnRlci4gKi8KKyNkZWZpbmUgVE1fUkVHX0xJTjBfTlVNX1NDQU5TCQkJCQkgMHgxNjQwYTAKIC8qIFtXQiA2NF0gTGluZWFyMCBwaHkgYWRkcmVzcy4gKi8KICNkZWZpbmUgVE1fUkVHX0xJTjBfUEhZX0FERFIJCQkJCSAweDE2NDI3MAogLyogW1JXIDFdIExpbmVhcjAgcGh5c2ljYWwgYWRkcmVzcyB2YWxpZC4gKi8KQEAgLTM3ODksNiArNDI5Miw3IEBACiAjZGVmaW5lIFRNX1JFR19MSU4wX1NDQU5fT04JCQkJCSAweDE2NDBkMAogLyogW1JXIDI0XSBMaW5lYXIwIGFycmF5IHNjYW4gdGltZW91dC4gKi8KICNkZWZpbmUgVE1fUkVHX0xJTjBfU0NBTl9USU1FCQkJCQkgMHgxNjQwM2MKKyNkZWZpbmUgVE1fUkVHX0xJTjBfVk5JQ19VQwkJCQkJIDB4MTY0MTI4CiAvKiBbUlcgMzJdIExpbmVhcjEgbG9naWMgYWRkcmVzcy4gKi8KICNkZWZpbmUgVE1fUkVHX0xJTjFfTE9HSUNfQUREUgkJCQkJIDB4MTY0MjUwCiAvKiBbV0IgNjRdIExpbmVhcjEgcGh5IGFkZHJlc3MuICovCkBAIC00MTc1LDYgKzQ2NzksOCBAQAogI2RlZmluZSBVQ01fUkVHX1VDTV9JTlRfTUFTSwkJCQkJIDB4ZTAxZDQKIC8qIFtSIDExXSBJbnRlcnJ1cHQgcmVnaXN0ZXIgIzAgcmVhZCAqLwogI2RlZmluZSBVQ01fUkVHX1VDTV9JTlRfU1RTCQkJCQkgMHhlMDFjOAorLyogW1JXIDI3XSBQYXJpdHkgbWFzayByZWdpc3RlciAjMCByZWFkL3dyaXRlICovCisjZGVmaW5lIFVDTV9SRUdfVUNNX1BSVFlfTUFTSwkJCQkJIDB4ZTAxZTQKIC8qIFtSIDI3XSBQYXJpdHkgcmVnaXN0ZXIgIzAgcmVhZCAqLwogI2RlZmluZSBVQ01fUkVHX1VDTV9QUlRZX1NUUwkJCQkJIDB4ZTAxZDgKIC8qIFtSQyAyN10gUGFyaXR5IHJlZ2lzdGVyICMwIHJlYWQgY2xlYXIgKi8KQEAgLTQyNDgsNyArNDc1NCw3IEBACiAgICBtZWNoYW5pc20uIFRoZSBmaWVsZHMgYXJlOls1OjBdIC0gbWVzc2FnZSBsZW5ndGg7IDE0OjZdIC0gbWVzc2FnZQogICAgcG9pbnRlcjsgMTk6MTVdIC0gbmV4dCBwb2ludGVyLiAqLwogI2RlZmluZSBVQ01fUkVHX1hYX0RFU0NSX1RBQkxFCQkJCQkgMHhlMDI4MAotI2RlZmluZSBVQ01fUkVHX1hYX0RFU0NSX1RBQkxFX1NJWkUJCQkJIDMyCisjZGVmaW5lIFVDTV9SRUdfWFhfREVTQ1JfVEFCTEVfU0laRQkJCQkgMjcKIC8qIFtSIDZdIFVzZSB0byByZWFkIHRoZSBYWCBwcm90ZWN0aW9uIEZyZWUgY291bnRlci4gKi8KICNkZWZpbmUgVUNNX1JFR19YWF9GUkVFIAkJCQkJIDB4ZTAxNmMKIC8qIFtSVyA2XSBJbml0aWFsIHZhbHVlIGZvciB0aGUgY3JlZGl0IGNvdW50ZXI7IHJlc3BvbnNpYmxlIGZvciBmdWxmaWxsaW5nCkBAIC00MjY1LDYgKzQ3NzEsMjMgQEAKICAgIFRoZSBmaWVsZHMgYXJlOiBbNDowXSAtIHRhaWwgcG9pbnRlcjsgMTA6NV0gLSBMaW5rIExpc3Qgc2l6ZTsgMTU6MTFdIC0KICAgIGhlYWRlciBwb2ludGVyLiAqLwogI2RlZmluZSBVQ01fUkVHX1hYX1RBQkxFCQkJCQkgMHhlMDMwMAorI2RlZmluZSBVTUFDX0NPTU1BTkRfQ09ORklHX1JFR19MT09QX0VOQQkJCSAoMHgxPDwxNSkKKyNkZWZpbmUgVU1BQ19DT01NQU5EX0NPTkZJR19SRUdfTk9fTEdUSF9DSEVDSwkJCSAoMHgxPDwyNCkKKyNkZWZpbmUgVU1BQ19DT01NQU5EX0NPTkZJR19SRUdfUEFEX0VOCQkJCSAoMHgxPDw1KQorI2RlZmluZSBVTUFDX0NPTU1BTkRfQ09ORklHX1JFR19QUk9NSVNfRU4JCQkgKDB4MTw8NCkKKyNkZWZpbmUgVU1BQ19DT01NQU5EX0NPTkZJR19SRUdfUlhfRU5BCQkJCSAoMHgxPDwxKQorI2RlZmluZSBVTUFDX0NPTU1BTkRfQ09ORklHX1JFR19TV19SRVNFVAkJCSAoMHgxPDwxMykKKyNkZWZpbmUgVU1BQ19DT01NQU5EX0NPTkZJR19SRUdfVFhfRU5BCQkJCSAoMHgxPDwwKQorI2RlZmluZSBVTUFDX1JFR19DT01NQU5EX0NPTkZJRwkJCQkJIDB4OAorLyogW1JXIDMyXSBSZWdpc3RlciBCaXQgMCByZWZlcnMgdG8gQml0IDE2IG9mIHRoZSBNQUMgYWRkcmVzczsgQml0IDEgcmVmZXJzCisgKiB0byBiaXQgMTcgb2YgdGhlIE1BQyBhZGRyZXNzIGV0Yy4gKi8KKyNkZWZpbmUgVU1BQ19SRUdfTUFDX0FERFIwCQkJCQkgMHhjCisvKiBbUlcgMTZdIFJlZ2lzdGVyIEJpdCAwIHJlZmVycyB0byBCaXQgMCBvZiB0aGUgTUFDIGFkZHJlc3M7IFJlZ2lzdGVyIEJpdCAxCisgKiByZWZlcnMgdG8gQml0IDEgb2YgdGhlIE1BQyBhZGRyZXNzIGV0Yy4gQml0cyAxNiB0byAzMSBhcmUgcmVzZXJ2ZWQuICovCisjZGVmaW5lIFVNQUNfUkVHX01BQ19BRERSMQkJCQkJIDB4MTAKKy8qIFtSVyAxNF0gRGVmaW5lcyBhIDE0LUJpdCBtYXhpbXVtIGZyYW1lIGxlbmd0aCB1c2VkIGJ5IHRoZSBNQUMgcmVjZWl2ZQorICogbG9naWMgdG8gY2hlY2sgZnJhbWVzLiAqLworI2RlZmluZSBVTUFDX1JFR19NQVhGUgkJCQkJCSAweDE0CiAvKiBbUlcgOF0gVGhlIGV2ZW50IGlkIGZvciBhZ2dyZWdhdGVkIGludGVycnVwdCAwICovCiAjZGVmaW5lIFVTRE1fUkVHX0FHR19JTlRfRVZFTlRfMAkJCQkgMHhjNDAzOAogI2RlZmluZSBVU0RNX1JFR19BR0dfSU5UX0VWRU5UXzEJCQkJIDB4YzQwM2MKQEAgLTQ2OTYsOCArNTIxOSwxMyBAQAogI2RlZmluZSBYQ01fUkVHX1hDTV9JTlRfTUFTSwkJCQkJIDB4MjAyYjQKIC8qIFtSIDE0XSBJbnRlcnJ1cHQgcmVnaXN0ZXIgIzAgcmVhZCAqLwogI2RlZmluZSBYQ01fUkVHX1hDTV9JTlRfU1RTCQkJCQkgMHgyMDJhOAorLyogW1JXIDMwXSBQYXJpdHkgbWFzayByZWdpc3RlciAjMCByZWFkL3dyaXRlICovCisjZGVmaW5lIFhDTV9SRUdfWENNX1BSVFlfTUFTSwkJCQkJIDB4MjAyYzQKIC8qIFtSIDMwXSBQYXJpdHkgcmVnaXN0ZXIgIzAgcmVhZCAqLwogI2RlZmluZSBYQ01fUkVHX1hDTV9QUlRZX1NUUwkJCQkJIDB4MjAyYjgKKy8qIFtSQyAzMF0gUGFyaXR5IHJlZ2lzdGVyICMwIHJlYWQgY2xlYXIgKi8KKyNkZWZpbmUgWENNX1JFR19YQ01fUFJUWV9TVFNfQ0xSCQkJCSAweDIwMmJjCisKIC8qIFtSVyA0XSBUaGUgc2l6ZSBvZiBBRyBjb250ZXh0IHJlZ2lvbiAwIGluIFJFRy1wYWlycy4gRGVzaWduYXRlcyB0aGUgTVMKICAgIFJFRy1wYWlyIG51bWJlciAoZS5nLiBpZiByZWdpb24gMCBpcyA2IFJFRy1wYWlyczsgdGhlIHZhbHVlIHNob3VsZCBiZSA1KS4KICAgIElzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGhlIEFHIGNvbnRleHQgUkVHLXBhaXJzIHdyaXR0ZW4gYmFjazsKQEAgLTQ3NzIsNiArNTMwMCwzNCBAQAogI2RlZmluZSBYQ01fUkVHX1hYX01TR19OVU0JCQkJCSAweDIwNDI4CiAvKiBbUlcgOF0gVGhlIEV2ZW50IElEOyBzZW50IHRvIHRoZSBTVE9STSBpbiBjYXNlIG9mIFhYIG92ZXJmbG93LiAqLwogI2RlZmluZSBYQ01fUkVHX1hYX09WRkxfRVZOVF9JRCAJCQkJIDB4MjAwNTgKKyNkZWZpbmUgWE1BQ19DTEVBUl9SWF9MU1NfU1RBVFVTX1JFR19DTEVBUl9MT0NBTF9GQVVMVF9TVEFUVVMJICgweDE8PDApCisjZGVmaW5lIFhNQUNfQ0xFQVJfUlhfTFNTX1NUQVRVU19SRUdfQ0xFQVJfUkVNT1RFX0ZBVUxUX1NUQVRVUwkgKDB4MTw8MSkKKyNkZWZpbmUgWE1BQ19DVFJMX1JFR19DT1JFX0xPQ0FMX0xQQksJCQkJICgweDE8PDMpCisjZGVmaW5lIFhNQUNfQ1RSTF9SRUdfUlhfRU4JCQkJCSAoMHgxPDwxKQorI2RlZmluZSBYTUFDX0NUUkxfUkVHX1NPRlRfUkVTRVQJCQkJICgweDE8PDYpCisjZGVmaW5lIFhNQUNfQ1RSTF9SRUdfVFhfRU4JCQkJCSAoMHgxPDwwKQorI2RlZmluZSBYTUFDX1BBVVNFX0NUUkxfUkVHX1JYX1BBVVNFX0VOCQkJCSAoMHgxPDwxOCkKKyNkZWZpbmUgWE1BQ19QQVVTRV9DVFJMX1JFR19UWF9QQVVTRV9FTgkJCQkgKDB4MTw8MTcpCisjZGVmaW5lIFhNQUNfUEZDX0NUUkxfSElfUkVHX1BGQ19SRUZSRVNIX0VOCQkJICgweDE8PDApCisjZGVmaW5lIFhNQUNfUEZDX0NUUkxfSElfUkVHX1BGQ19TVEFUU19FTgkJCSAoMHgxPDwzKQorI2RlZmluZSBYTUFDX1BGQ19DVFJMX0hJX1JFR19SWF9QRkNfRU4JCQkJICgweDE8PDQpCisjZGVmaW5lIFhNQUNfUEZDX0NUUkxfSElfUkVHX1RYX1BGQ19FTgkJCQkgKDB4MTw8NSkKKyNkZWZpbmUgWE1BQ19SRUdfQ0xFQVJfUlhfTFNTX1NUQVRVUwkJCQkgMHg2MAorI2RlZmluZSBYTUFDX1JFR19DVFJMCQkJCQkJIDAKKy8qIFtSVyAxNl0gVXBwZXIgNDggYml0cyBvZiBjdHJsX3NhIHJlZ2lzdGVyLiBVc2VkIGFzIHRoZSBTQSBpbiBQQVVTRS9QRkMKKyAqIHBhY2tldHMgdHJhbnNtaXR0ZWQgYnkgdGhlIE1BQyAqLworI2RlZmluZSBYTUFDX1JFR19DVFJMX1NBX0hJCQkJCQkgMHgyYworLyogW1JXIDMyXSBMb3dlciA0OCBiaXRzIG9mIGN0cmxfc2EgcmVnaXN0ZXIuIFVzZWQgYXMgdGhlIFNBIGluIFBBVVNFL1BGQworICogcGFja2V0cyB0cmFuc21pdHRlZCBieSB0aGUgTUFDICovCisjZGVmaW5lIFhNQUNfUkVHX0NUUkxfU0FfTE8JCQkJCSAweDI4CisjZGVmaW5lIFhNQUNfUkVHX1BBVVNFX0NUUkwJCQkJCSAweDY4CisjZGVmaW5lIFhNQUNfUkVHX1BGQ19DVFJMCQkJCQkgMHg3MAorI2RlZmluZSBYTUFDX1JFR19QRkNfQ1RSTF9ISQkJCQkJIDB4NzQKKyNkZWZpbmUgWE1BQ19SRUdfUlhfTFNTX1NUQVRVUwkJCQkJIDB4NTgKKy8qIFtSVyAxNF0gTWF4aW11bSBwYWNrZXQgc2l6ZSBpbiByZWNlaXZlIGRpcmVjdGlvbjsgZXhjbHVzaXZlIG9mIHByZWFtYmxlICYKKyAqIENSQyBpbiBzdHJpcCBtb2RlICovCisjZGVmaW5lIFhNQUNfUkVHX1JYX01BWF9TSVpFCQkJCQkgMHg0MAorI2RlZmluZSBYTUFDX1JFR19UWF9DVFJMCQkJCQkgMHgyMAogLyogW1JXIDE2XSBJbmRpcmVjdCBhY2Nlc3MgdG8gdGhlIFhYIHRhYmxlIG9mIHRoZSBYWCBwcm90ZWN0aW9uIG1lY2hhbmlzbS4KICAgIFRoZSBmaWVsZHMgYXJlOls0OjBdIC0gdGFpbCBwb2ludGVyOyA5OjVdIC0gTGluayBMaXN0IHNpemU7IDE0OjEwXSAtCiAgICBoZWFkZXIgcG9pbnRlci4gKi8KQEAgLTQ4NDYsNiArNTQwMiwxMCBAQAogI2RlZmluZSBYU0RNX1JFR19OVU1fT0ZfUTlfQ01ECQkJCQkgMHgxNjYyNjgKIC8qIFtSVyAxM10gVGhlIHN0YXJ0IGFkZHJlc3MgaW4gdGhlIGludGVybmFsIFJBTSBmb3IgcXVldWUgY291bnRlcnMgKi8KICNkZWZpbmUgWFNETV9SRUdfUV9DT1VOVEVSX1NUQVJUX0FERFIJCQkJIDB4MTY2MDEwCisvKiBbVyAxN10gR2VuZXJhdGUgYW4gb3BlcmF0aW9uIGFmdGVyIGNvbXBsZXRpb247IGJpdC0xNiBpcworICogQWdnVmVjdElkeF92YWxpZDsgYml0cyAxNTo4IGFyZSBBZ2dWZWN0SWR4OyBiaXRzIDc6NSBhcmUgdGhlIFRSSUcgYW5kCisgKiBiaXRzIDQ6MCBhcmUgdGhlIFQxMjRQYXJhbVs0OjBdICovCisjZGVmaW5lIFhTRE1fUkVHX09QRVJBVElPTl9HRU4JCQkJCSAweDE2NjRjNAogLyogW1IgMV0gcHhwX2N0cmwgcmRfZGF0YSBmaWZvIGVtcHR5IGluIHNkbV9kbWFfcnNwIGJsb2NrICovCiAjZGVmaW5lIFhTRE1fUkVHX1JTUF9QWFBfQ1RSTF9SREFUQV9FTVBUWQkJCSAweDE2NjU0OAogLyogW1IgMV0gcGFyc2VyIGZpZm8gZW1wdHkgaW4gc2RtX3N5bmMgYmxvY2sgKi8KQEAgLTUwMTksNiArNTU3OSw3IEBACiAjZGVmaW5lIEJJR01BQ19SRUdJU1RFUl9DTlRfTUFYX1NJWkUJCQkJICgweDA1PDwzKQogI2RlZmluZSBCSUdNQUNfUkVHSVNURVJfUlhfQ09OVFJPTAkJCQkgKDB4MjE8PDMpCiAjZGVmaW5lIEJJR01BQ19SRUdJU1RFUl9SWF9MTEZDX01TR19GTERTCQkJICgweDQ2PDwzKQorI2RlZmluZSBCSUdNQUNfUkVHSVNURVJfUlhfTFNTX1NUQVRVUwkJCQkgKDB4NDM8PDMpCiAjZGVmaW5lIEJJR01BQ19SRUdJU1RFUl9SWF9NQVhfU0laRQkJCQkgKDB4MjM8PDMpCiAjZGVmaW5lIEJJR01BQ19SRUdJU1RFUl9SWF9TVEFUX0dSNjQJCQkJICgweDI2PDwzKQogI2RlZmluZSBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9HUklQSgkJCQkgKDB4NDI8PDMpCkBAIC01MDM0LDYgKzU1OTUsNyBAQAogI2RlZmluZSBCSUdNQUMyX1JFR0lTVEVSX1BGQ19DT05UUk9MCQkJCSAoMHgwNjw8MykKICNkZWZpbmUgQklHTUFDMl9SRUdJU1RFUl9SWF9DT05UUk9MCQkJCSAoMHgzQTw8MykKICNkZWZpbmUgQklHTUFDMl9SRUdJU1RFUl9SWF9MTEZDX01TR19GTERTCQkJICgweDYyPDwzKQorI2RlZmluZSBCSUdNQUMyX1JFR0lTVEVSX1JYX0xTU19TVEFUCQkJCSAoMHgzRTw8MykKICNkZWZpbmUgQklHTUFDMl9SRUdJU1RFUl9SWF9NQVhfU0laRQkJCQkgKDB4M0M8PDMpCiAjZGVmaW5lIEJJR01BQzJfUkVHSVNURVJfUlhfU1RBVF9HUjY0CQkJCSAoMHg0MDw8MykKICNkZWZpbmUgQklHTUFDMl9SRUdJU1RFUl9SWF9TVEFUX0dSSVBKCQkJCSAoMHg1Zjw8MykKQEAgLTUwNTIsNyArNTYxNCw5IEBACiAjZGVmaW5lIEVNQUNfTEVEX09WRVJSSURFCQkJCQkgKDFMPDwwKQogI2RlZmluZSBFTUFDX0xFRF9UUkFGRklDCQkJCQkgKDFMPDw2KQogI2RlZmluZSBFTUFDX01ESU9fQ09NTV9DT01NQU5EX0FERFJFU1MJCQkJICgwTDw8MjYpCisjZGVmaW5lIEVNQUNfTURJT19DT01NX0NPTU1BTkRfUkVBRF8yMgkJCQkgKDJMPDwyNikKICNkZWZpbmUgRU1BQ19NRElPX0NPTU1fQ09NTUFORF9SRUFEXzQ1CQkJCSAoM0w8PDI2KQorI2RlZmluZSBFTUFDX01ESU9fQ09NTV9DT01NQU5EX1dSSVRFXzIyCQkJCSAoMUw8PDI2KQogI2RlZmluZSBFTUFDX01ESU9fQ09NTV9DT01NQU5EX1dSSVRFXzQ1IAkJCSAoMUw8PDI2KQogI2RlZmluZSBFTUFDX01ESU9fQ09NTV9EQVRBCQkJCQkgKDB4ZmZmZkw8PDApCiAjZGVmaW5lIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kJCQkJICgxTDw8MjkpCkBAIC01MTI4LDE2ICs1NjkyLDMwIEBACiAjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1JTVF9QWFBWCQkJICgweDE8PDI3KQogI2RlZmluZSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9TRVQJCQkJIDB4NTg0CiAjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSCQkJIDB4NTk4CisjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX01TVEFUMAkJCSAoMHgxPDwyNCkKKyNkZWZpbmUgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfTVNUQVQxCQkJICgweDE8PDI1KQorI2RlZmluZSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9QR0xDCQkJCSAoMHgxPDwxOSkKKyNkZWZpbmUgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0FUQwkJCSAoMHgxPDwxNykKICNkZWZpbmUgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0JNQUMwCQkJICgweDE8PDApCisjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9CTUFDMQkJCSAoMHgxPDwxKQorI2RlZmluZSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfRU1BQzAJCQkgKDB4MTw8MikKICNkZWZpbmUgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0VNQUMwX0hBUkRfQ09SRQkJICgweDE8PDE0KQorI2RlZmluZSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfRU1BQzEJCQkgKDB4MTw8MykKICNkZWZpbmUgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0VNQUMxX0hBUkRfQ09SRQkJICgweDE8PDE1KQogI2RlZmluZSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfR1JDCQkJICgweDE8PDQpCiAjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9NQ1BfTl9IQVJEX0NPUkVfUlNUX0IJICgweDE8PDYpCisjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9NQ1BfTl9SRVNFVF9DTU5fQ09SRQkgKDB4MTw8OCkKKyNkZWZpbmUgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX01DUF9OX1JFU0VUX0NNTl9DUFUJICgweDE8PDcpCiAjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9NQ1BfTl9SRVNFVF9SRUdfSEFSRF9DT1JFICgweDE8PDUpCiAjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9NRElPCQkJICgweDE8PDEzKQogI2RlZmluZSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfTUlTQ19DT1JFCQkgKDB4MTw8MTEpCisjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9QQ0lfTURJTwkJCSAoMHgxPDwxMykKICNkZWZpbmUgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX1JCQ04JCQkgKDB4MTw8OSkKICNkZWZpbmUgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfU0VUCQkJCSAweDU5NAorI2RlZmluZSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9VTUFDMAkJCSAoMHgxPDwyMCkKKyNkZWZpbmUgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfVU1BQzEJCQkgKDB4MTw8MjEpCisjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1hNQUMJCQkJICgweDE8PDIyKQorI2RlZmluZSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9YTUFDX1NPRlQJCQkgKDB4MTw8MjMpCiAjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX0NMRUFSCQkJIDB4NWE4CiAjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX01JU0NfTklHX01VWF9TRVJERVMwX0lERFEJICgweDE8PDEpCiAjZGVmaW5lIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX01JU0NfTklHX01VWF9TRVJERVMwX1BXUkRXTgkgKDB4MTw8MikKQEAgLTUxNjAsNzQgKzU3MzgsODYgQEAKICNkZWZpbmUgTUlTQ19SRUdJU1RFUlNfU1BJT19PVVRQVVRfSElHSCAJCQkgMQogI2RlZmluZSBNSVNDX1JFR0lTVEVSU19TUElPX09VVFBVVF9MT1cJCQkJIDAKICNkZWZpbmUgTUlTQ19SRUdJU1RFUlNfU1BJT19TRVRfUE9TCQkJCSA4CisjZGVmaW5lIEhXX0xPQ0tfRFJWX0ZMQUdTCQkJCQkgMTAKICNkZWZpbmUgSFdfTE9DS19NQVhfUkVTT1VSQ0VfVkFMVUUJCQkJIDMxCiAjZGVmaW5lIEhXX0xPQ0tfUkVTT1VSQ0VfR1BJTwkJCQkJIDEKICNkZWZpbmUgSFdfTE9DS19SRVNPVVJDRV9NRElPCQkJCQkgMAotI2RlZmluZSBIV19MT0NLX1JFU09VUkNFX1BPUlQwX0FUVF9NQVNLIAkJCSAzCi0jZGVmaW5lIEhXX0xPQ0tfUkVTT1VSQ0VfUkVTRVJWRURfMDgJCQkJIDgKKyNkZWZpbmUgSFdfTE9DS19SRVNPVVJDRV9QT1JUMF9BVFRfTUFTSwkJCQkgMworI2RlZmluZSBIV19MT0NLX1JFU09VUkNFX1JFQ09WRVJZX0xFQURFUl8wCQkJIDgKKyNkZWZpbmUgSFdfTE9DS19SRVNPVVJDRV9SRUNPVkVSWV9MRUFERVJfMQkJCSA5CiAjZGVmaW5lIEhXX0xPQ0tfUkVTT1VSQ0VfU1BJTwkJCQkJIDIKICNkZWZpbmUgSFdfTE9DS19SRVNPVVJDRV9VTkRJCQkJCQkgNQotI2RlZmluZSBQUlNfRkxBR19PVkVSRVRIX0lQVjQJCQkJCSAxCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0FUQ19IV19JTlRFUlJVUFQJCSAgICAgICgweDE8PDQpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0FUQ19QQVJJVFlfRVJST1IJCSAgICAgICgweDE8PDUpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0JSQl9QQVJJVFlfRVJST1IJCSAgICAgICgxPDwxOCkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0NNX0hXX0lOVEVSUlVQVAkJICAgICAgKDE8PDMxKQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DRFVfSFdfSU5URVJSVVBUCQkgICAgICAoMTw8OSkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0RVX1BBUklUWV9FUlJPUgkJICAgICAgKDE8PDgpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NGQ19IV19JTlRFUlJVUFQJCSAgICAgICgxPDw3KQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DRkNfUEFSSVRZX0VSUk9SCQkgICAgICAoMTw8NikKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfQ1NETV9IV19JTlRFUlJVUFQJCSAgICAgICgxPDwyOSkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfQ1NETV9QQVJJVFlfRVJST1IJCSAgICAgICgxPDwyOCkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfQ1NFTUlfSFdfSU5URVJSVVBUIAkgICAgICAoMTw8MSkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfQ1NFTUlfUEFSSVRZX0VSUk9SIAkgICAgICAoMTw8MCkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfREVCVUdfUEFSSVRZX0VSUk9SIAkgICAgICAoMTw8MTgpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0RNQUVfSFdfSU5URVJSVVBUCQkgICAgICAoMTw8MTEpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0RPT1JCRUxMUV9IV19JTlRFUlJVUFQJICAgICAgKDE8PDEzKQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19ET09SQkVMTFFfUEFSSVRZX0VSUk9SCSAgICAgICgxPDwxMikKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfR1BJTzNfRlVOQ1RJT05fMAkJICAgICAgKDE8PDUpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0dQSU8zX0ZVTkNUSU9OXzEJCSAgICAgICgxPDw5KQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19JR1VfUEFSSVRZX0VSUk9SCQkgICAgICAoMTw8MTIpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX01DUF9MQVRDSEVEX1JPTV9QQVJJVFkJICAgICAgKDE8PDI4KQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9TQ1BBRF9QQVJJVFkJICAgICAgKDE8PDMxKQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9VTVBfUlhfUEFSSVRZCSAgICAgICgxPDwyOSkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfTUNQX0xBVENIRURfVU1QX1RYX1BBUklUWQkgICAgICAoMTw8MzApCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX01JU0NfSFdfSU5URVJSVVBUCQkgICAgICAoMTw8MTUpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX01JU0NfUEFSSVRZX0VSUk9SCQkgICAgICAoMTw8MTQpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BBUlNFUl9QQVJJVFlfRVJST1IJICAgICAgKDE8PDIwKQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19QQkNMSUVOVF9QQVJJVFlfRVJST1IJICAgICAgKDE8PDApCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BCRl9IV19JTlRFUlJVUFQJCSAgICAgICgxPDwzMSkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfUEdMVUVfSFdfSU5URVJSVVBUCSAgICAgICgweDE8PDIpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BHTFVFX1BBUklUWV9FUlJPUgkgICAgICAoMHgxPDwzKQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19QWFBfSFdfSU5URVJSVVBUCQkgICAgICAoMTw8MykKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfUFhQX1BBUklUWV9FUlJPUgkJICAgICAgKDE8PDIpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BYUFBDSUNMT0NLQ0xJRU5UX0hXX0lOVEVSUlVQVCAgICgxPDw1KQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19QWFBQQ0lDTE9DS0NMSUVOVF9QQVJJVFlfRVJST1IgICAoMTw8NCkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfUU1fSFdfSU5URVJSVVBUCQkgICAgICAoMTw8MykKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfUU1fUEFSSVRZX0VSUk9SCQkgICAgICAoMTw8MikKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfU0VBUkNIRVJfUEFSSVRZX0VSUk9SCSAgICAgICgxPDwyMikKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfU1BJTzUJCQkgICAgICAoMTw8MTUpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RDTV9IV19JTlRFUlJVUFQJCSAgICAgICgxPDwyNykKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVElNRVJTX0hXX0lOVEVSUlVQVAkgICAgICAoMTw8NSkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNETV9IV19JTlRFUlJVUFQJCSAgICAgICgxPDwyNSkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNETV9QQVJJVFlfRVJST1IJCSAgICAgICgxPDwyNCkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNFTUlfSFdfSU5URVJSVVBUIAkgICAgICAoMTw8MjkpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RTRU1JX1BBUklUWV9FUlJPUiAJICAgICAgKDE8PDI4KQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VQ01fSFdfSU5URVJSVVBUCQkgICAgICAoMTw8MjMpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VQQl9IV19JTlRFUlJVUFQJCSAgICAgICgxPDwyNykKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVVBCX1BBUklUWV9FUlJPUgkJICAgICAgKDE8PDI2KQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VU0RNX0hXX0lOVEVSUlVQVAkJICAgICAgKDE8PDIxKQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VU0RNX1BBUklUWV9FUlJPUgkJICAgICAgKDE8PDIwKQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VU0VNSV9IV19JTlRFUlJVUFQgCSAgICAgICgxPDwyNSkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVVNFTUlfUEFSSVRZX0VSUk9SIAkgICAgICAoMTw8MjQpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1ZBVVhfUENJX0NPUkVfUEFSSVRZX0VSUk9SICAgICAgICgxPDwxNikKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfWENNX0hXX0lOVEVSUlVQVAkJICAgICAgKDE8PDkpCi0jZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1hTRE1fSFdfSU5URVJSVVBUCQkgICAgICAoMTw8NykKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfWFNETV9QQVJJVFlfRVJST1IJCSAgICAgICgxPDw2KQotI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19YU0VNSV9IV19JTlRFUlJVUFQgCSAgICAgICgxPDwxMSkKLSNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfWFNFTUlfUEFSSVRZX0VSUk9SIAkgICAgICAoMTw8MTApCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0FUQ19IV19JTlRFUlJVUFQJCQkgKDB4MTw8NCkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfQVRDX1BBUklUWV9FUlJPUgkJCSAoMHgxPDw1KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19CUkJfUEFSSVRZX0VSUk9SCQkJICgweDE8PDE4KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DQ01fSFdfSU5URVJSVVBUCQkJICgweDE8PDMxKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DQ01fUEFSSVRZX0VSUk9SCQkJICgweDE8PDMwKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DRFVfSFdfSU5URVJSVVBUCQkJICgweDE8PDkpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NEVV9QQVJJVFlfRVJST1IJCQkgKDB4MTw8OCkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfQ0ZDX0hXX0lOVEVSUlVQVAkJCSAoMHgxPDw3KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DRkNfUEFSSVRZX0VSUk9SCQkJICgweDE8PDYpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRE1fSFdfSU5URVJSVVBUCQkJICgweDE8PDI5KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19DU0RNX1BBUklUWV9FUlJPUgkJCSAoMHgxPDwyOCkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfQ1NFTUlfSFdfSU5URVJSVVBUCQkJICgweDE8PDEpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0NTRU1JX1BBUklUWV9FUlJPUgkJCSAoMHgxPDwwKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19ERUJVR19QQVJJVFlfRVJST1IJCQkgKDB4MTw8MTgpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0RNQUVfSFdfSU5URVJSVVBUCQkJICgweDE8PDExKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19ETUFFX1BBUklUWV9FUlJPUgkJCSAoMHgxPDwxMCkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfRE9PUkJFTExRX0hXX0lOVEVSUlVQVAkJICgweDE8PDEzKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19ET09SQkVMTFFfUEFSSVRZX0VSUk9SCQkgKDB4MTw8MTIpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0dQSU8wX0ZVTkNUSU9OXzAJCQkgKDB4MTw8MikKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfSUdVX1BBUklUWV9FUlJPUgkJCSAoMHgxPDwxMikKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfTUNQX0xBVENIRURfUk9NX1BBUklUWQkJICgweDE8PDI4KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9TQ1BBRF9QQVJJVFkJCSAoMHgxPDwzMSkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfTUNQX0xBVENIRURfVU1QX1JYX1BBUklUWQkJICgweDE8PDI5KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19NQ1BfTEFUQ0hFRF9VTVBfVFhfUEFSSVRZCQkgKDB4MTw8MzApCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX01JU0NfSFdfSU5URVJSVVBUCQkJICgweDE8PDE1KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19NSVNDX1BBUklUWV9FUlJPUgkJCSAoMHgxPDwxNCkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfTklHX1BBUklUWV9FUlJPUgkJCSAoMHgxPDwxNCkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfUEFSU0VSX1BBUklUWV9FUlJPUgkJICgweDE8PDIwKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19QQkNMSUVOVF9IV19JTlRFUlJVUFQJCSAoMHgxPDwzMSkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfUEJDTElFTlRfUEFSSVRZX0VSUk9SCQkgKDB4MTw8MzApCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BCRl9QQVJJVFlfRVJST1IJCQkgKDB4MTw8MCkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfUEdMVUVfSFdfSU5URVJSVVBUCQkJICgweDE8PDIpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BHTFVFX1BBUklUWV9FUlJPUgkJCSAoMHgxPDwzKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19QWFBQQ0lDTE9DS0NMSUVOVF9IV19JTlRFUlJVUFQJICgweDE8PDUpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1BYUFBDSUNMT0NLQ0xJRU5UX1BBUklUWV9FUlJPUgkgKDB4MTw8NCkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfUFhQX0hXX0lOVEVSUlVQVAkJCSAoMHgxPDwzKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19QWFBfUEFSSVRZX0VSUk9SCQkJICgweDE8PDIpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1FNX0hXX0lOVEVSUlVQVAkJCSAoMHgxPDwzKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19RTV9QQVJJVFlfRVJST1IJCQkgKDB4MTw8MikKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfU0VBUkNIRVJfUEFSSVRZX0VSUk9SCQkgKDB4MTw8MjIpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1NQSU81CQkJCSAoMHgxPDwxNSkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVENNX0hXX0lOVEVSUlVQVAkJCSAoMHgxPDwyNykKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVENNX1BBUklUWV9FUlJPUgkJCSAoMHgxPDwyNikKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVElNRVJTX0hXX0lOVEVSUlVQVAkJICgweDE8PDUpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RJTUVSU19QQVJJVFlfRVJST1IJCSAoMHgxPDw0KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19UU0RNX0hXX0lOVEVSUlVQVAkJCSAoMHgxPDwyNSkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNETV9QQVJJVFlfRVJST1IJCQkgKDB4MTw8MjQpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1RTRU1JX0hXX0lOVEVSUlVQVAkJCSAoMHgxPDwyOSkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVFNFTUlfUEFSSVRZX0VSUk9SCQkJICgweDE8PDI4KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VQ01fSFdfSU5URVJSVVBUCQkJICgweDE8PDIzKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VQ01fUEFSSVRZX0VSUk9SCQkJICgweDE8PDIyKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VUEJfSFdfSU5URVJSVVBUCQkJICgweDE8PDI3KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VUEJfUEFSSVRZX0VSUk9SCQkJICgweDE8PDI2KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19VU0RNX0hXX0lOVEVSUlVQVAkJCSAoMHgxPDwyMSkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVVNETV9QQVJJVFlfRVJST1IJCQkgKDB4MTw8MjApCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1VTRU1JX0hXX0lOVEVSUlVQVAkJCSAoMHgxPDwyNSkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfVVNFTUlfUEFSSVRZX0VSUk9SCQkJICgweDE8PDI0KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19WQVVYX1BDSV9DT1JFX1BBUklUWV9FUlJPUgkJICgweDE8PDE2KQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19YQ01fSFdfSU5URVJSVVBUCQkJICgweDE8PDkpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX1hDTV9QQVJJVFlfRVJST1IJCQkgKDB4MTw8OCkKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfWFNETV9IV19JTlRFUlJVUFQJCQkgKDB4MTw8NykKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfWFNETV9QQVJJVFlfRVJST1IJCQkgKDB4MTw8NikKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfWFNFTUlfSFdfSU5URVJSVVBUCQkJICgweDE8PDExKQorI2RlZmluZSBBRVVfSU5QVVRTX0FUVE5fQklUU19YU0VNSV9QQVJJVFlfRVJST1IJCQkgKDB4MTw8MTApCisKKyNkZWZpbmUgQUVVX0lOUFVUU19BVFROX0JJVFNfR1BJTzNfRlVOQ1RJT05fMAkJCSgweDE8PDUpCisjZGVmaW5lIEFFVV9JTlBVVFNfQVRUTl9CSVRTX0dQSU8zX0ZVTkNUSU9OXzEJCQkoMHgxPDw5KQorCiAjZGVmaW5lIFJFU0VSVkVEX0dFTkVSQUxfQVRURU5USU9OX0JJVF8wCTAKIAotI2RlZmluZSBFVkVSRVNUX0dFTl9BVFROX0lOX1VTRV9NQVNLCQkweDNmZmUwCisjZGVmaW5lIEVWRVJFU1RfR0VOX0FUVE5fSU5fVVNFX01BU0sJCTB4N2ZmZTAKICNkZWZpbmUgRVZFUkVTVF9MQVRDSEVEX0FUVE5fSU5fVVNFX01BU0sJMHhmZmUwMDAwMAogCiAjZGVmaW5lIFJFU0VSVkVEX0dFTkVSQUxfQVRURU5USU9OX0JJVF82CTYKQEAgLTUzMTcsNyArNTkwNywxMyBAQAogI2RlZmluZSBHUkNCQVNFX0hDCQkweDEwODAwMAogI2RlZmluZSBHUkNCQVNFX1BYUDIJCTB4MTIwMDAwCiAjZGVmaW5lIEdSQ0JBU0VfUEJGCQkweDE0MDAwMAorI2RlZmluZSBHUkNCQVNFX1VNQUMwCQkweDE2MDAwMAorI2RlZmluZSBHUkNCQVNFX1VNQUMxCQkweDE2MDQwMAogI2RlZmluZSBHUkNCQVNFX1hQQgkJMHgxNjEwMDAKKyNkZWZpbmUgR1JDQkFTRV9NU1RBVDAJICAgIDB4MTYyMDAwCisjZGVmaW5lIEdSQ0JBU0VfTVNUQVQxCSAgICAweDE2MjgwMAorI2RlZmluZSBHUkNCQVNFX1hNQUMwCQkweDE2MzAwMAorI2RlZmluZSBHUkNCQVNFX1hNQUMxCQkweDE2MzgwMAogI2RlZmluZSBHUkNCQVNFX1RJTUVSUwkJMHgxNjQwMDAKICNkZWZpbmUgR1JDQkFTRV9YU0RNCQkweDE2NjAwMAogI2RlZmluZSBHUkNCQVNFX1FNCQkweDE2ODAwMApAQCAtNTg4Myw2ICs2NDc5LDEwIEBACiAjZGVmaW5lIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xNkcJCTB4MEMwMAogI2RlZmluZSBNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMUdfS1gJMHgwRDAwCiAjZGVmaW5lIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0FDVFVBTF9TUEVFRF8xMEdfS1g0CTB4MEUwMAorI2RlZmluZSBNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMTBHX0tSCTB4MEYwMAorI2RlZmluZSBNRElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9BQ1RVQUxfU1BFRURfMTBHX1hGSQkweDFCMDAKKyNkZWZpbmUgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzIwR19EWEdYUwkweDFFMDAKKyNkZWZpbmUgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzFfQUNUVUFMX1NQRUVEXzEwR19TRkkJMHgxRjAwCiAKIAogI2RlZmluZSBNRElPX1JFR19CQU5LXzEwR19QQVJBTExFTF9ERVRFQ1QJCTB4ODEzMApAQCAtNjAzMiwxNSArNjYzMiwxMSBAQAogI2RlZmluZSBNRElPX1BNQV9SRUdfQ1RSTAkJMHgwCiAjZGVmaW5lIE1ESU9fUE1BX1JFR19TVEFUVVMJCTB4MQogI2RlZmluZSBNRElPX1BNQV9SRUdfMTBHX0NUUkwyCQkweDcKKyNkZWZpbmUgTURJT19QTUFfUkVHX1RYX0RJU0FCTEUJCTB4MDAwOQogI2RlZmluZSBNRElPX1BNQV9SRUdfUlhfU0QJCTB4YQogLypiY20qLwogI2RlZmluZSBNRElPX1BNQV9SRUdfQkNNX0NUUkwJCTB4MDA5NgogI2RlZmluZSBNRElPX1BNQV9SRUdfRkVDX0NUUkwJCTB4MDBhYgotI2RlZmluZSBNRElPX1BNQV9SRUdfUlhfQUxBUk1fQ1RSTAkweDkwMDAKLSNkZWZpbmUgTURJT19QTUFfUkVHX0xBU0lfQ1RSTAkJMHg5MDAyCi0jZGVmaW5lIE1ESU9fUE1BX1JFR19SWF9BTEFSTQkJMHg5MDAzCi0jZGVmaW5lIE1ESU9fUE1BX1JFR19UWF9BTEFSTQkJMHg5MDA0Ci0jZGVmaW5lIE1ESU9fUE1BX1JFR19MQVNJX1NUQVRVUwkweDkwMDUKICNkZWZpbmUgTURJT19QTUFfUkVHX1BIWV9JREVOVElGSUVSCTB4YzgwMAogI2RlZmluZSBNRElPX1BNQV9SRUdfRElHSVRBTF9DVFJMCTB4YzgwOAogI2RlZmluZSBNRElPX1BNQV9SRUdfRElHSVRBTF9TVEFUVVMJMHhjODA5CkBAIC02MjAxLDYgKzY3OTcsMTY5IEBACiAjZGVmaW5lIE1ESU9fUE1BX1JFR184NDgyM19DVExfTEVEX0NUTF8xCQkweGE4ZTMKICNkZWZpbmUgTURJT19QTUFfUkVHXzg0ODIzX0xFRDNfU1RSRVRDSF9FTgkJMHgwMDgwCiAKKy8qIEJDTTg0ODMzIG9ubHkgKi8KKyNkZWZpbmUgTURJT184NDgzM19UT1BfQ0ZHX1hHUEhZX1NUUkFQMQkJCTB4NDAxYQorI2RlZmluZSBNRElPXzg0ODMzX1NVUEVSX0lTT0xBVEUJCTB4ODAwMAorLyogVGhlc2UgYXJlIG1haWxib3ggcmVnaXN0ZXIgc2V0IHVzZWQgYnkgODQ4MzMuICovCisjZGVmaW5lIE1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzAJCQkweDQwMDUKKyNkZWZpbmUgTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMQkJCTB4NDAwNgorI2RlZmluZSBNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyCQkJMHg0MDA3CisjZGVmaW5lIE1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzMJCQkweDQwMDgKKyNkZWZpbmUgTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHNAkJCTB4NDAwOQorI2RlZmluZSBNRElPXzg0ODMzX1RPUF9DRkdfREFUQTNfUkVHCQkJMHg0MDExCisjZGVmaW5lIE1ESU9fODQ4MzNfVE9QX0NGR19EQVRBNF9SRUcJCQkweDQwMTIKKworLyogTWFpbGJveCBjb21tYW5kIHNldCB1c2VkIGJ5IDg0ODMzLiAqLworI2RlZmluZSBQSFk4NDgzM19ESUFHX0NNRF9QQUlSX1NXQVBfQ0hBTkdFCQkweDIKKy8qIE1haWxib3ggc3RhdHVzIHNldCB1c2VkIGJ5IDg0ODMzLiAqLworI2RlZmluZSBQSFk4NDgzM19DTURfUkVDRUlWRUQJCQkJMHgwMDAxCisjZGVmaW5lIFBIWTg0ODMzX0NNRF9JTl9QUk9HUkVTUwkJCTB4MDAwMgorI2RlZmluZSBQSFk4NDgzM19DTURfQ09NUExFVEVfUEFTUwkJCTB4MDAwNAorI2RlZmluZSBQSFk4NDgzM19DTURfQ09NUExFVEVfRVJST1IJCQkweDAwMDgKKyNkZWZpbmUgUEhZODQ4MzNfQ01EX09QRU5fRk9SX0NNRFMJCQkweDAwMTAKKyNkZWZpbmUgUEhZODQ4MzNfQ01EX1NZU1RFTV9CT09UCQkJMHgwMDIwCisjZGVmaW5lIFBIWTg0ODMzX0NNRF9OT1RfT1BFTl9GT1JfQ01EUwkJCTB4MDA0MAorI2RlZmluZSBQSFk4NDgzM19DTURfQ0xFQVJfQ09NUExFVEUJCQkweDAwODAKKyNkZWZpbmUgUEhZODQ4MzNfQ01EX09QRU5fT1ZFUlJJREUJCQkweGE1YTUKKworCisvKiA4NDgzMyBGL1cgRmVhdHVyZSBDb21tYW5kcyAqLworI2RlZmluZSBQSFk4NDgzM19ESUFHX0NNRF9HRVRfRUVFX01PREUJCQkweDI3CisjZGVmaW5lIFBIWTg0ODMzX0RJQUdfQ01EX1NFVF9FRUVfTU9ERQkJCTB4MjgKKworLyogV2FycGNvcmUgY2xhdXNlIDQ1IGFkZHJlc3NpbmcgKi8KKyNkZWZpbmUgTURJT19XQ19ERVZBRAkJCQkJMHgzCisjZGVmaW5lIE1ESU9fV0NfUkVHX0lFRUUwQkxLX01JSUNOVEwJCQkweDAKKyNkZWZpbmUgTURJT19XQ19SRUdfSUVFRTBCTEtfQVVUT05FR05QCQkJMHg3CisjZGVmaW5lIE1ESU9fV0NfUkVHX0FOX0lFRUUxQkxLX0FOX0FEVkVSVElTRU1FTlQwCTB4MTAKKyNkZWZpbmUgTURJT19XQ19SRUdfQU5fSUVFRTFCTEtfQU5fQURWRVJUSVNFTUVOVDEJMHgxMQorI2RlZmluZSBNRElPX1dDX1JFR19QTURfSUVFRTlCTEtfVEVOR0JBU0VfS1JfUE1EX0NPTlRST0xfUkVHSVNURVJfMTUwICAweDk2CisjZGVmaW5lIE1ESU9fV0NfUkVHX1hHWFNCTEswX1hHWFNDT05UUk9MCQkweDgwMDAKKyNkZWZpbmUgTURJT19XQ19SRUdfWEdYU0JMSzBfTUlTQ0NPTlRST0wxCQkweDgwMGUKKyNkZWZpbmUgTURJT19XQ19SRUdfWEdYU0JMSzFfREVTS0VXCQkJMHg4MDEwCisjZGVmaW5lIE1ESU9fV0NfUkVHX1hHWFNCTEsxX0xBTkVDVFJMMAkJCTB4ODAxNQorI2RlZmluZSBNRElPX1dDX1JFR19YR1hTQkxLMV9MQU5FQ1RSTDEJCQkweDgwMTYKKyNkZWZpbmUgTURJT19XQ19SRUdfWEdYU0JMSzFfTEFORUNUUkwyCQkJMHg4MDE3CisjZGVmaW5lIE1ESU9fV0NfUkVHX1RYMF9BTkFfQ1RSTDAJCQkweDgwNjEKKyNkZWZpbmUgTURJT19XQ19SRUdfVFgxX0FOQV9DVFJMMAkJCTB4ODA3MQorI2RlZmluZSBNRElPX1dDX1JFR19UWDJfQU5BX0NUUkwwCQkJMHg4MDgxCisjZGVmaW5lIE1ESU9fV0NfUkVHX1RYM19BTkFfQ1RSTDAJCQkweDgwOTEKKyNkZWZpbmUgTURJT19XQ19SRUdfVFgwX1RYX0RSSVZFUgkJCTB4ODA2NworI2RlZmluZSBNRElPX1dDX1JFR19UWDBfVFhfRFJJVkVSX0lQUkVfRFJJVkVSX09GRlNFVAkJMHgwNAorI2RlZmluZSBNRElPX1dDX1JFR19UWDBfVFhfRFJJVkVSX0lQUkVfRFJJVkVSX01BU0sJCQkweDAwZjAKKyNkZWZpbmUgTURJT19XQ19SRUdfVFgwX1RYX0RSSVZFUl9JRFJJVkVSX09GRlNFVAkJMHgwOAorI2RlZmluZSBNRElPX1dDX1JFR19UWDBfVFhfRFJJVkVSX0lEUklWRVJfTUFTSwkJCQkweDBmMDAKKyNkZWZpbmUgTURJT19XQ19SRUdfVFgwX1RYX0RSSVZFUl9QT1NUMl9DT0VGRl9PRkZTRVQJCTB4MGMKKyNkZWZpbmUgTURJT19XQ19SRUdfVFgwX1RYX0RSSVZFUl9QT1NUMl9DT0VGRl9NQVNLCQkJMHg3MDAwCisjZGVmaW5lIE1ESU9fV0NfUkVHX1RYMV9UWF9EUklWRVIJCQkweDgwNzcKKyNkZWZpbmUgTURJT19XQ19SRUdfVFgyX1RYX0RSSVZFUgkJCTB4ODA4NworI2RlZmluZSBNRElPX1dDX1JFR19UWDNfVFhfRFJJVkVSCQkJMHg4MDk3CisjZGVmaW5lIE1ESU9fV0NfUkVHX1JYMF9BTkFSWENPTlRST0wxRwkJCTB4ODBiOQorI2RlZmluZSBNRElPX1dDX1JFR19SWDJfQU5BUlhDT05UUk9MMUcJCQkweDgwZDkKKyNkZWZpbmUgTURJT19XQ19SRUdfUlgwX1BDSV9DVFJMCQkJMHg4MGJhCisjZGVmaW5lIE1ESU9fV0NfUkVHX1JYMV9QQ0lfQ1RSTAkJCTB4ODBjYQorI2RlZmluZSBNRElPX1dDX1JFR19SWDJfUENJX0NUUkwJCQkweDgwZGEKKyNkZWZpbmUgTURJT19XQ19SRUdfUlgzX1BDSV9DVFJMCQkJMHg4MGVhCisjZGVmaW5lIE1ESU9fV0NfUkVHX1hHWFNCTEsyX1VOSUNPUkVfTU9ERV8xMEcJCTB4ODEwNAorI2RlZmluZSBNRElPX1dDX1JFR19YR1hTX1NUQVRVUzMJCQkweDgxMjkKKyNkZWZpbmUgTURJT19XQ19SRUdfUEFSX0RFVF8xMEdfU1RBVFVTCQkJMHg4MTMwCisjZGVmaW5lIE1ESU9fV0NfUkVHX1BBUl9ERVRfMTBHX0NUUkwJCQkweDgxMzEKKyNkZWZpbmUgTURJT19XQ19SRUdfWEdYU19YMl9DT05UUk9MMgkJCTB4ODE0MQorI2RlZmluZSBNRElPX1dDX1JFR19YR1hTX1JYX0xOX1NXQVAxCQkJMHg4MTZCCisjZGVmaW5lIE1ESU9fV0NfUkVHX1hHWFNfVFhfTE5fU1dBUDEJCQkweDgxNjkKKyNkZWZpbmUgTURJT19XQ19SRUdfR1AyX1NUQVRVU19HUF8yXzAJCQkweDgxZDAKKyNkZWZpbmUgTURJT19XQ19SRUdfR1AyX1NUQVRVU19HUF8yXzEJCQkweDgxZDEKKyNkZWZpbmUgTURJT19XQ19SRUdfR1AyX1NUQVRVU19HUF8yXzIJCQkweDgxZDIKKyNkZWZpbmUgTURJT19XQ19SRUdfR1AyX1NUQVRVU19HUF8yXzMJCQkweDgxZDMKKyNkZWZpbmUgTURJT19XQ19SRUdfR1AyX1NUQVRVU19HUF8yXzQJCQkweDgxZDQKKyNkZWZpbmUgTURJT19XQ19SRUdfVUNfSU5GT19CMF9ERUFEX1RSQVAJCTB4ODFFRQorI2RlZmluZSBNRElPX1dDX1JFR19VQ19JTkZPX0IxX1ZFUlNJT04JCQkweDgxRjAKKyNkZWZpbmUgTURJT19XQ19SRUdfVUNfSU5GT19CMV9GSVJNV0FSRV9NT0RFCQkweDgxRjIKKyNkZWZpbmUgTURJT19XQ19SRUdfVUNfSU5GT19CMV9GSVJNV0FSRV9MQU5FMF9PRkZTRVQJMHgwCisjZGVmaW5lIE1ESU9fV0NfUkVHX1VDX0lORk9fQjFfRklSTVdBUkVfTU9ERV9ERUZBVUxUCSAgICAweDAKKyNkZWZpbmUgTURJT19XQ19SRUdfVUNfSU5GT19CMV9GSVJNV0FSRV9NT0RFX1NGUF9PUFRfTFIJICAgIDB4MQorI2RlZmluZSBNRElPX1dDX1JFR19VQ19JTkZPX0IxX0ZJUk1XQVJFX01PREVfU0ZQX0RBQwkgICAgMHgyCisjZGVmaW5lIE1ESU9fV0NfUkVHX1VDX0lORk9fQjFfRklSTVdBUkVfTU9ERV9TRlBfWExBVUkJICAgIDB4MworI2RlZmluZSBNRElPX1dDX1JFR19VQ19JTkZPX0IxX0ZJUk1XQVJFX01PREVfTE9OR19DSF82RwkgICAgMHg0CisjZGVmaW5lIE1ESU9fV0NfUkVHX1VDX0lORk9fQjFfRklSTVdBUkVfTEFORTFfT0ZGU0VUCTB4NAorI2RlZmluZSBNRElPX1dDX1JFR19VQ19JTkZPX0IxX0ZJUk1XQVJFX0xBTkUyX09GRlNFVAkweDgKKyNkZWZpbmUgTURJT19XQ19SRUdfVUNfSU5GT19CMV9GSVJNV0FSRV9MQU5FM19PRkZTRVQJMHhjCisjZGVmaW5lIE1ESU9fV0NfUkVHX1VDX0lORk9fQjFfQ1JDCQkJMHg4MUZFCisjZGVmaW5lIE1ESU9fV0NfUkVHX0RTQ19TTUMJCQkJMHg4MjEzCisjZGVmaW5lIE1ESU9fV0NfUkVHX0RTQzJCMF9EU0NfTUlTQ19DVFJMMAkJMHg4MjFlCisjZGVmaW5lIE1ESU9fV0NfUkVHX1RYX0ZJUl9UQVAJCQkJMHg4MmUyCisjZGVmaW5lIE1ESU9fV0NfUkVHX1RYX0ZJUl9UQVBfUFJFX1RBUF9PRkZTRVQJCTB4MDAKKyNkZWZpbmUgTURJT19XQ19SRUdfVFhfRklSX1RBUF9QUkVfVEFQX01BU0sJCQkweDAwMGYKKyNkZWZpbmUgTURJT19XQ19SRUdfVFhfRklSX1RBUF9NQUlOX1RBUF9PRkZTRVQJCTB4MDQKKyNkZWZpbmUgTURJT19XQ19SRUdfVFhfRklSX1RBUF9NQUlOX1RBUF9NQVNLCQkweDAzZjAKKyNkZWZpbmUgTURJT19XQ19SRUdfVFhfRklSX1RBUF9QT1NUX1RBUF9PRkZTRVQJCTB4MGEKKyNkZWZpbmUgTURJT19XQ19SRUdfVFhfRklSX1RBUF9QT1NUX1RBUF9NQVNLCQkweDdjMDAKKyNkZWZpbmUgTURJT19XQ19SRUdfVFhfRklSX1RBUF9FTkFCTEUJCTB4ODAwMAorI2RlZmluZSBNRElPX1dDX1JFR19DTDcyX1VTRVJCMF9DTDcyX01JU0MxX0NPTlRST0wJMHg4MmUzCisjZGVmaW5lIE1ESU9fV0NfUkVHX0NMNzJfVVNFUkIwX0NMNzJfT1NfREVGX0NUUkwJMHg4MmU2CisjZGVmaW5lIE1ESU9fV0NfUkVHX0NMNzJfVVNFUkIwX0NMNzJfQlJfREVGX0NUUkwJMHg4MmU3CisjZGVmaW5lIE1ESU9fV0NfUkVHX0NMNzJfVVNFUkIwX0NMNzJfMlA1X0RFRl9DVFJMCTB4ODJlOAorI2RlZmluZSBNRElPX1dDX1JFR19DTDcyX1VTRVJCMF9DTDcyX01JU0M0X0NPTlRST0wJMHg4MmVjCisjZGVmaW5lIE1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfQ09OVFJPTDEwMDBYMQkJMHg4MzAwCisjZGVmaW5lIE1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfQ09OVFJPTDEwMDBYMgkJMHg4MzAxCisjZGVmaW5lIE1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfQ09OVFJPTDEwMDBYMwkJMHg4MzAyCisjZGVmaW5lIE1ESU9fV0NfUkVHX1NFUkRFU0RJR0lUQUxfU1RBVFVTMTAwMFgxCQkweDgzMDQKKyNkZWZpbmUgTURJT19XQ19SRUdfU0VSREVTRElHSVRBTF9NSVNDMQkJCTB4ODMwOAorI2RlZmluZSBNRElPX1dDX1JFR19TRVJERVNESUdJVEFMX01JU0MyCQkJMHg4MzA5CisjZGVmaW5lIE1ESU9fV0NfUkVHX0RJR0lUQUwzX1VQMQkJCTB4ODMyOQorI2RlZmluZSBNRElPX1dDX1JFR19ESUdJVEFMNF9NSVNDMwkJCTB4ODMzYworI2RlZmluZSBNRElPX1dDX1JFR19ESUdJVEFMNV9NSVNDNgkJCTB4ODM0NQorI2RlZmluZSBNRElPX1dDX1JFR19ESUdJVEFMNV9NSVNDNwkJCTB4ODM0OQorI2RlZmluZSBNRElPX1dDX1JFR19ESUdJVEFMNV9BQ1RVQUxfU1BFRUQJCTB4ODM0ZQorI2RlZmluZSBNRElPX1dDX1JFR19ESUdJVEFMNl9NUDVfTkVYVFBBR0VDVFJMCQkweDgzNTAKKyNkZWZpbmUgTURJT19XQ19SRUdfQ0w0OV9VU0VSQjBfQ1RSTAkJCTB4ODM2OAorI2RlZmluZSBNRElPX1dDX1JFR19UWDY2X0NPTlRST0wJCQkweDgzYjAKKyNkZWZpbmUgTURJT19XQ19SRUdfUlg2Nl9DT05UUk9MCQkJMHg4M2MwCisjZGVmaW5lIE1ESU9fV0NfUkVHX1JYNjZfU0NXMAkJCQkweDgzYzIKKyNkZWZpbmUgTURJT19XQ19SRUdfUlg2Nl9TQ1cxCQkJCTB4ODNjMworI2RlZmluZSBNRElPX1dDX1JFR19SWDY2X1NDVzIJCQkJMHg4M2M0CisjZGVmaW5lIE1ESU9fV0NfUkVHX1JYNjZfU0NXMwkJCQkweDgzYzUKKyNkZWZpbmUgTURJT19XQ19SRUdfUlg2Nl9TQ1cwX01BU0sJCQkweDgzYzYKKyNkZWZpbmUgTURJT19XQ19SRUdfUlg2Nl9TQ1cxX01BU0sJCQkweDgzYzcKKyNkZWZpbmUgTURJT19XQ19SRUdfUlg2Nl9TQ1cyX01BU0sJCQkweDgzYzgKKyNkZWZpbmUgTURJT19XQ19SRUdfUlg2Nl9TQ1czX01BU0sJCQkweDgzYzkKKyNkZWZpbmUgTURJT19XQ19SRUdfRlgxMDBfQ1RSTDEJCQkJMHg4NDAwCisjZGVmaW5lIE1ESU9fV0NfUkVHX0ZYMTAwX0NUUkwzCQkJCTB4ODQwMgorCisjZGVmaW5lIE1ESU9fV0NfUkVHX01JQ1JPQkxLX0NNRAkJCTB4ZmZjMgorI2RlZmluZSBNRElPX1dDX1JFR19NSUNST0JMS19ETF9TVEFUVVMJCQkweGZmYzUKKyNkZWZpbmUgTURJT19XQ19SRUdfTUlDUk9CTEtfQ01EMwkJCTB4ZmZjYworCisjZGVmaW5lIE1ESU9fV0NfUkVHX0FFUkJMS19BRVIJCQkJMHhmZmRlCisjZGVmaW5lIE1ESU9fV0NfUkVHX0NPTUJPX0lFRUUwX01JSUNUUkwJCQkweGZmZTAKKyNkZWZpbmUgTURJT19XQ19SRUdfQ09NQk9fSUVFRTBfTUlJSVNUQVQJCTB4ZmZlMQorCisjZGVmaW5lIE1ESU9fV0MwX1hHWFNfQkxLMl9MQU5FX1JFU0VUCQkJMHg4MTBBCisjZGVmaW5lIE1ESU9fV0MwX1hHWFNfQkxLMl9MQU5FX1JFU0VUX1JYX0JJVFNISUZUCTAKKyNkZWZpbmUgTURJT19XQzBfWEdYU19CTEsyX0xBTkVfUkVTRVRfVFhfQklUU0hJRlQJNAorCisjZGVmaW5lIE1ESU9fV0MwX1hHWFNfQkxLNl9YR1hTX1gyX0NPTlRST0wyCQkweDgxNDEKKworI2RlZmluZSBESUdJVEFMNV9BQ1RVQUxfU1BFRURfVFhfTUFTSwkJCTB4MDAzZgorCisvKiA1NDYxOHNlICovCisjZGVmaW5lIE1ESU9fUkVHX0dQSFlfUEhZSURfTFNCCQkJCTB4MworI2RlZmluZSBNRElPX1JFR19HUEhZX0lEXzU0NjE4U0UJCTB4NWNkNQorI2RlZmluZSBNRElPX1JFR19HUEhZX0NMNDVfQUREUl9SRUcJCQkweGQKKyNkZWZpbmUgTURJT19SRUdfR1BIWV9DTDQ1X0RBVEFfUkVHCQkJMHhlCisjZGVmaW5lIE1ESU9fUkVHX0dQSFlfRUVFX0FEVgkJCTB4M2MKKyNkZWZpbmUgTURJT19SRUdfR1BIWV9FRUVfMUcJCSgweDEgPDwgMikKKyNkZWZpbmUgTURJT19SRUdfR1BIWV9FRUVfMTAwCQkoMHgxIDw8IDEpCisjZGVmaW5lIE1ESU9fUkVHX0dQSFlfRUVFX1JFU09MVkVECQkweDgwM2UKKyNkZWZpbmUgTURJT19SRUdfSU5UUl9TVEFUVVMJCQkJMHgxYQorI2RlZmluZSBNRElPX1JFR19JTlRSX01BU0sJCQkJMHgxYgorI2RlZmluZSBNRElPX1JFR19JTlRSX01BU0tfTElOS19TVEFUVVMJCQkoMHgxIDw8IDEpCisjZGVmaW5lIE1ESU9fUkVHX0dQSFlfU0hBRE9XCQkJCTB4MWMKKyNkZWZpbmUgTURJT19SRUdfR1BIWV9TSEFET1dfTEVEX1NFTDIJCQkoMHgwZSA8PCAxMCkKKyNkZWZpbmUgTURJT19SRUdfR1BIWV9TSEFET1dfV1JfRU5BCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgTURJT19SRUdfR1BIWV9TSEFET1dfQVVUT19ERVRfTUVECQkoMHgxZSA8PCAxMCkKKyNkZWZpbmUgTURJT19SRUdfR1BIWV9TSEFET1dfSU5WRVJUX0ZJQl9TRAkJKDB4MSA8PCA4KQorCiAjZGVmaW5lIElHVV9GVU5DX0JBU0UJCQkweDA0MDAKIAogI2RlZmluZSBJR1VfQUREUl9NU0lYCQkJMHgwMDAwCkBAIC02MjE3LDExICs2OTc2LDYgQEAKICNkZWZpbmUgSUdVX0FERFJfTVNJX0FERFJfSEkJMHgwMjEyCiAjZGVmaW5lIElHVV9BRERSX01TSV9EQVRBCQkweDAyMTMKIAotI2RlZmluZSBJR1VfSU5UX0VOQUJMRQkJCTAKLSNkZWZpbmUgSUdVX0lOVF9ESVNBQkxFIAkJMQotI2RlZmluZSBJR1VfSU5UX05PUAkJCQkyCi0jZGVmaW5lIElHVV9JTlRfTk9QMgkJCTMKLQogI2RlZmluZSBJR1VfVVNFX1JFR0lTVEVSX3VzdG9ybV90eXBlXzBfc2JfY2xlYW51cCAgMAogI2RlZmluZSBJR1VfVVNFX1JFR0lTVEVSX3VzdG9ybV90eXBlXzFfc2JfY2xlYW51cCAgMQogI2RlZmluZSBJR1VfVVNFX1JFR0lTVEVSX2NzdG9ybV90eXBlXzBfc2JfY2xlYW51cCAgMgpAQCAtNjI5MiwxNSArNzA0Niw2IEBACiAjZGVmaW5lIElHVV9CQ19CQVNFX0RTQl9QUk9EICAgMTI4CiAjZGVmaW5lIElHVV9OT1JNX0JBU0VfRFNCX1BST0QgMTM2CiAKLSNkZWZpbmUgSUdVX0NUUkxfQ01EX1RZUEVfV1JcCi0JMQotI2RlZmluZSBJR1VfQ1RSTF9DTURfVFlQRV9SRFwKLQkwCi0KLSNkZWZpbmUgSUdVX1NFR19BQ0NFU1NfTk9STSAgIDAKLSNkZWZpbmUgSUdVX1NFR19BQ0NFU1NfREVGICAgIDEKLSNkZWZpbmUgSUdVX1NFR19BQ0NFU1NfQVRUTiAgIDIKLQogCS8qIEZJRCAoaWYgVkYgLSBbNl0gPSAwOyBbNTowXSA9IFZGIG51bWJlcjsgaWYgUEYgLSBbNl0gPSAxOyBcCiAJWzU6Ml0gPSAwOyBbMTowXSA9IFBGIG51bWJlcikgKi8KICNkZWZpbmUgSUdVX0ZJRF9FTkNPREVfSVNfUEYJICAgICgweDE8PDYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9zcC5jIGIvZHJpdmVycy9uZXQvYm54MngvYm54Mnhfc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjUyZjExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYm54MngvYm54Mnhfc3AuYwpAQCAtMCwwICsxLDU2OTIgQEAKKy8qIGJueDJ4X3NwLmM6IEJyb2FkY29tIEV2ZXJlc3QgbmV0d29yayBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHRvIHlvdQorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGF2YWlsYWJsZQorICogYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwgKHRoZSAiR1BMIikuCisgKgorICogTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUgdGhpcworICogc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZCB1bmRlciBhCisgKiBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3Igd3JpdHRlbgorICogY29uc2VudC4KKyAqCisgKiBNYWludGFpbmVkIGJ5OiBFaWxvbiBHcmVlbnN0ZWluIDxlaWxvbmdAYnJvYWRjb20uY29tPgorICogV3JpdHRlbiBieTogVmxhZGlzbGF2IFpvbG90YXJvdgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMmMuaD4KKyNpbmNsdWRlICJibngyeC5oIgorI2luY2x1ZGUgImJueDJ4X2Ntbi5oIgorI2luY2x1ZGUgImJueDJ4X3NwLmgiCisKKyNkZWZpbmUgQk5YMlhfTUFYX0VNVUxfTVVMVEkJCTE2CisKKy8qKioqIEV4ZSBRdWV1ZSBpbnRlcmZhY2VzICoqKiovCisKKy8qKgorICogYm54MnhfZXhlX3F1ZXVlX2luaXQgLSBpbml0IHRoZSBFeGUgUXVldWUgb2JqZWN0CisgKgorICogQG86CQlwb2l0ZXIgdG8gdGhlIG9iamVjdAorICogQGV4ZV9sZW46CWxlbmd0aAorICogQG93bmVyOglwb2l0ZXIgdG8gdGhlIG93bmVyCisgKiBAdmFsaWRhdGU6CXZhbGlkYXRlIGZ1bmN0aW9uIHBvaW50ZXIKKyAqIEBvcHRpbWl6ZToJb3B0aW1pemUgZnVuY3Rpb24gcG9pbnRlcgorICogQGV4ZWM6CWV4ZWN1dGUgZnVuY3Rpb24gcG9pbnRlcgorICogQGdldDoJZ2V0IGZ1bmN0aW9uIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2V4ZV9xdWV1ZV9pbml0KHN0cnVjdCBibngyeCAqYnAsCisJCQkJCXN0cnVjdCBibngyeF9leGVfcXVldWVfb2JqICpvLAorCQkJCQlpbnQgZXhlX2xlbiwKKwkJCQkJdW5pb24gYm54MnhfcWFibGVfb2JqICpvd25lciwKKwkJCQkJZXhlX3FfdmFsaWRhdGUgdmFsaWRhdGUsCisJCQkJCWV4ZV9xX29wdGltaXplIG9wdGltaXplLAorCQkJCQlleGVfcV9leGVjdXRlIGV4ZWMsCisJCQkJCWV4ZV9xX2dldCBnZXQpCit7CisJbWVtc2V0KG8sIDAsIHNpemVvZigqbykpOworCisJSU5JVF9MSVNUX0hFQUQoJm8tPmV4ZV9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJm8tPnBlbmRpbmdfY29tcCk7CisKKwlzcGluX2xvY2tfaW5pdCgmby0+bG9jayk7CisKKwlvLT5leGVfY2h1bmtfbGVuID0gZXhlX2xlbjsKKwlvLT5vd25lciAgICAgICAgID0gb3duZXI7CisKKwkvKiBPd25lciBzcGVjaWZpYyBjYWxsYmFja3MgKi8KKwlvLT52YWxpZGF0ZSAgICAgID0gdmFsaWRhdGU7CisJby0+b3B0aW1pemUgICAgICA9IG9wdGltaXplOworCW8tPmV4ZWN1dGUgICAgICAgPSBleGVjOworCW8tPmdldCAgICAgICAgICAgPSBnZXQ7CisKKwlEUChCTlgyWF9NU0dfU1AsICJTZXR1cCB0aGUgZXhlY3V0aW9uIHF1ZXVlIHdpdGggdGhlIGNodW5rICIKKwkJCSAibGVuZ3RoIG9mICVkXG4iLCBleGVfbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2V4ZV9xdWV1ZV9mcmVlX2VsZW0oc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJICAgICBzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICplbGVtKQoreworCURQKEJOWDJYX01TR19TUCwgIkRlbGV0aW5nIGFuIGV4ZV9xdWV1ZSBlbGVtZW50XG4iKTsKKwlrZnJlZShlbGVtKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfZXhlX3F1ZXVlX2xlbmd0aChzdHJ1Y3QgYm54MnhfZXhlX3F1ZXVlX29iaiAqbykKK3sKKwlzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICplbGVtOworCWludCBjbnQgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZvLT5sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZWxlbSwgJm8tPmV4ZV9xdWV1ZSwgbGluaykKKwkJY250Kys7CisKKwlzcGluX3VubG9ja19iaCgmby0+bG9jayk7CisKKwlyZXR1cm4gY250OworfQorCisvKioKKyAqIGJueDJ4X2V4ZV9xdWV1ZV9hZGQgLSBhZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgZXhlY3V0aW9uIHF1ZXVlCisgKgorICogQGJwOgkJZHJpdmVyIGhhbmRsZQorICogQG86CQlxdWV1ZQorICogQGNtZDoJbmV3IGNvbW1hbmQgdG8gYWRkCisgKiBAcmVzdG9yZToJdHJ1ZSAtIGRvIG5vdCBvcHRpbWl6ZSB0aGUgY29tbWFuZAorICoKKyAqIElmIHRoZSBlbGVtZW50IGlzIG9wdGltaXplZCBvciBpcyBpbGxlZ2FsLCBmcmVlcyBpdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYm54MnhfZXhlX3F1ZXVlX2FkZChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgICAgIHN0cnVjdCBibngyeF9leGVfcXVldWVfb2JqICpvLAorCQkJCSAgICAgIHN0cnVjdCBibngyeF9leGVxX2VsZW0gKmVsZW0sCisJCQkJICAgICAgYm9vbCByZXN0b3JlKQoreworCWludCByYzsKKworCXNwaW5fbG9ja19iaCgmby0+bG9jayk7CisKKwlpZiAoIXJlc3RvcmUpIHsKKwkJLyogVHJ5IHRvIGNhbmNlbCB0aGlzIGVsZW1lbnQgcXVldWUgKi8KKwkJcmMgPSBvLT5vcHRpbWl6ZShicCwgby0+b3duZXIsIGVsZW0pOworCQlpZiAocmMpCisJCQlnb3RvIGZyZWVfYW5kX2V4aXQ7CisKKwkJLyogQ2hlY2sgaWYgdGhpcyByZXF1ZXN0IGlzIG9rICovCisJCXJjID0gby0+dmFsaWRhdGUoYnAsIG8tPm93bmVyLCBlbGVtKTsKKwkJaWYgKHJjKSB7CisJCQlCTlgyWF9FUlIoIlByZWFtYmxlIGZhaWxlZDogJWRcbiIsIHJjKTsKKwkJCWdvdG8gZnJlZV9hbmRfZXhpdDsKKwkJfQorCX0KKworCS8qIElmIHNvLCBhZGQgaXQgdG8gdGhlIGV4ZWN1dGlvbiBxdWV1ZSAqLworCWxpc3RfYWRkX3RhaWwoJmVsZW0tPmxpbmssICZvLT5leGVfcXVldWUpOworCisJc3Bpbl91bmxvY2tfYmgoJm8tPmxvY2spOworCisJcmV0dXJuIDA7CisKK2ZyZWVfYW5kX2V4aXQ6CisJYm54MnhfZXhlX3F1ZXVlX2ZyZWVfZWxlbShicCwgZWxlbSk7CisKKwlzcGluX3VubG9ja19iaCgmby0+bG9jayk7CisKKwlyZXR1cm4gcmM7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fYm54MnhfZXhlX3F1ZXVlX3Jlc2V0X3BlbmRpbmcoCisJc3RydWN0IGJueDJ4ICpicCwKKwlzdHJ1Y3QgYm54MnhfZXhlX3F1ZXVlX29iaiAqbykKK3sKKwlzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICplbGVtOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZvLT5wZW5kaW5nX2NvbXApKSB7CisJCWVsZW0gPSBsaXN0X2ZpcnN0X2VudHJ5KCZvLT5wZW5kaW5nX2NvbXAsCisJCQkJCXN0cnVjdCBibngyeF9leGVxX2VsZW0sIGxpbmspOworCisJCWxpc3RfZGVsKCZlbGVtLT5saW5rKTsKKwkJYm54MnhfZXhlX3F1ZXVlX2ZyZWVfZWxlbShicCwgZWxlbSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfZXhlX3F1ZXVlX3Jlc2V0X3BlbmRpbmcoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJCSBzdHJ1Y3QgYm54MnhfZXhlX3F1ZXVlX29iaiAqbykKK3sKKworCXNwaW5fbG9ja19iaCgmby0+bG9jayk7CisKKwlfX2JueDJ4X2V4ZV9xdWV1ZV9yZXNldF9wZW5kaW5nKGJwLCBvKTsKKworCXNwaW5fdW5sb2NrX2JoKCZvLT5sb2NrKTsKKworfQorCisvKioKKyAqIGJueDJ4X2V4ZV9xdWV1ZV9zdGVwIC0gZXhlY3V0ZSBvbmUgZXhlY3V0aW9uIGNodW5rIGF0b21pY2FsbHkKKyAqCisgKiBAYnA6CQkJZHJpdmVyIGhhbmRsZQorICogQG86CQkJcXVldWUKKyAqIEByYW1yb2RfZmxhZ3M6CWZsYWdzCisgKgorICogKEF0b21pY3kgaXMgZW5zdXJlZCB1c2luZyB0aGUgZXhlX3F1ZXVlLT5sb2NrKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYm54MnhfZXhlX3F1ZXVlX3N0ZXAoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICAgc3RydWN0IGJueDJ4X2V4ZV9xdWV1ZV9vYmogKm8sCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnJhbXJvZF9mbGFncykKK3sKKwlzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICplbGVtLCBzcGFjZXI7CisJaW50IGN1cl9sZW4gPSAwLCByYzsKKworCW1lbXNldCgmc3BhY2VyLCAwLCBzaXplb2Yoc3BhY2VyKSk7CisKKwlzcGluX2xvY2tfYmgoJm8tPmxvY2spOworCisJLyoKKwkgKiBOZXh0IHN0ZXAgc2hvdWxkIG5vdCBiZSBwZXJmb3JtZWQgdW50aWwgdGhlIGN1cnJlbnQgaXMgZmluaXNoZWQsCisJICogdW5sZXNzIGEgRFJWX0NMRUFSX09OTFkgYml0IGlzIHNldC4gSW4gdGhpcyBjYXNlIHdlIGp1c3Qgd2FudCB0bworCSAqIHByb3Blcmx5IGNsZWFyIG9iamVjdCBpbnRlcm5hbHMgd2l0aG91dCBzZW5kaW5nIGFueSBjb21tYW5kIHRvIHRoZSBGVworCSAqIHdoaWNoIGFsc28gaW1wbGllcyB0aGVyZSB3b24ndCBiZSBhbnkgY29tcGxldGlvbiB0byBjbGVhciB0aGUKKwkgKiAncGVuZGluZycgbGlzdC4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJm8tPnBlbmRpbmdfY29tcCkpIHsKKwkJaWYgKHRlc3RfYml0KFJBTVJPRF9EUlZfQ0xSX09OTFksIHJhbXJvZF9mbGFncykpIHsKKwkJCURQKEJOWDJYX01TR19TUCwgIlJBTVJPRF9EUlZfQ0xSX09OTFkgcmVxdWVzdGVkOiAiCisJCQkJCSAicmVzZXR0aW5nIHBlbmRpbmdfY29tcFxuIik7CisJCQlfX2JueDJ4X2V4ZV9xdWV1ZV9yZXNldF9wZW5kaW5nKGJwLCBvKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZvLT5sb2NrKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyoKKwkgKiBSdW4gdGhyb3VnaCB0aGUgcGVuZGluZyBjb21tYW5kcyBsaXN0IGFuZCBjcmVhdGUgYSBuZXh0CisJICogZXhlY3V0aW9uIGNodW5rLgorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmby0+ZXhlX3F1ZXVlKSkgeworCQllbGVtID0gbGlzdF9maXJzdF9lbnRyeSgmby0+ZXhlX3F1ZXVlLCBzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtLAorCQkJCQlsaW5rKTsKKwkJV0FSTl9PTighZWxlbS0+Y21kX2xlbik7CisKKwkJaWYgKGN1cl9sZW4gKyBlbGVtLT5jbWRfbGVuIDw9IG8tPmV4ZV9jaHVua19sZW4pIHsKKwkJCWN1cl9sZW4gKz0gZWxlbS0+Y21kX2xlbjsKKwkJCS8qCisJCQkgKiBQcmV2ZW50IGZyb20gYm90aCBsaXN0cyBiZWluZyBlbXB0eSB3aGVuIG1vdmluZyBhbgorCQkJICogZWxlbWVudC4gVGhpcyB3aWxsIGFsbG93IHRoZSBjYWxsIG9mCisJCQkgKiBibngyeF9leGVfcXVldWVfZW1wdHkoKSB3aXRob3V0IGxvY2tpbmcuCisJCQkgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJnNwYWNlci5saW5rLCAmby0+cGVuZGluZ19jb21wKTsKKwkJCW1iKCk7CisJCQlsaXN0X2RlbCgmZWxlbS0+bGluayk7CisJCQlsaXN0X2FkZF90YWlsKCZlbGVtLT5saW5rLCAmby0+cGVuZGluZ19jb21wKTsKKwkJCWxpc3RfZGVsKCZzcGFjZXIubGluayk7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCFjdXJfbGVuKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZvLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBvLT5leGVjdXRlKGJwLCBvLT5vd25lciwgJm8tPnBlbmRpbmdfY29tcCwgcmFtcm9kX2ZsYWdzKTsKKwlpZiAocmMgPCAwKQorCQkvKgorCQkgKiAgSW4gY2FzZSBvZiBhbiBlcnJvciByZXR1cm4gdGhlIGNvbW1hbmRzIGJhY2sgdG8gdGhlIHF1ZXVlCisJCSAqICBhbmQgcmVzZXQgdGhlIHBlbmRpbmdfY29tcC4KKwkJICovCisJCWxpc3Rfc3BsaWNlX2luaXQoJm8tPnBlbmRpbmdfY29tcCwgJm8tPmV4ZV9xdWV1ZSk7CisJZWxzZSBpZiAoIXJjKQorCQkvKgorCQkgKiBJZiB6ZXJvIGlzIHJldHVybmVkLCBtZWFucyB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgcGVuZGluZworCQkgKiBjb21wbGV0aW9ucyBhbmQgd2UgbWF5IGRpc21pc3MgdGhlIHBlbmRpbmcgbGlzdC4KKwkJICovCisJCV9fYm54MnhfZXhlX3F1ZXVlX3Jlc2V0X3BlbmRpbmcoYnAsIG8pOworCisJc3Bpbl91bmxvY2tfYmgoJm8tPmxvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIGlubGluZSBib29sIGJueDJ4X2V4ZV9xdWV1ZV9lbXB0eShzdHJ1Y3QgYm54MnhfZXhlX3F1ZXVlX29iaiAqbykKK3sKKwlib29sIGVtcHR5ID0gbGlzdF9lbXB0eSgmby0+ZXhlX3F1ZXVlKTsKKworCS8qIERvbid0IHJlb3JkZXIhISEgKi8KKwltYigpOworCisJcmV0dXJuIGVtcHR5ICYmIGxpc3RfZW1wdHkoJm8tPnBlbmRpbmdfY29tcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSAqYm54MnhfZXhlX3F1ZXVlX2FsbG9jX2VsZW0oCisJc3RydWN0IGJueDJ4ICpicCkKK3sKKwlEUChCTlgyWF9NU0dfU1AsICJBbGxvY2F0aW5nIGEgbmV3IGV4ZV9xdWV1ZSBlbGVtZW50XG4iKTsKKwlyZXR1cm4ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSksIEdGUF9BVE9NSUMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqIHJhd19vYmogZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJvb2wgYm54MnhfcmF3X2NoZWNrX3BlbmRpbmcoc3RydWN0IGJueDJ4X3Jhd19vYmogKm8pCit7CisJcmV0dXJuICEhdGVzdF9iaXQoby0+c3RhdGUsIG8tPnBzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3Jhd19jbGVhcl9wZW5kaW5nKHN0cnVjdCBibngyeF9yYXdfb2JqICpvKQoreworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCWNsZWFyX2JpdChvLT5zdGF0ZSwgby0+cHN0YXRlKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9yYXdfc2V0X3BlbmRpbmcoc3RydWN0IGJueDJ4X3Jhd19vYmogKm8pCit7CisJc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCk7CisJc2V0X2JpdChvLT5zdGF0ZSwgby0+cHN0YXRlKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworfQorCisvKioKKyAqIGJueDJ4X3N0YXRlX3dhaXQgLSB3YWl0IHVudGlsIHRoZSBnaXZlbiBiaXQoc3RhdGUpIGlzIGNsZWFyZWQKKyAqCisgKiBAYnA6CQlkZXZpY2UgaGFuZGxlCisgKiBAc3RhdGU6CXN0YXRlIHdoaWNoIGlzIHRvIGJlIGNsZWFyZWQKKyAqIEBzdGF0ZV9wOglzdGF0ZSBidWZmZXIKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3N0YXRlX3dhaXQoc3RydWN0IGJueDJ4ICpicCwgaW50IHN0YXRlLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgKnBzdGF0ZSkKK3sKKwkvKiBjYW4gdGFrZSBhIHdoaWxlIGlmIGFueSBwb3J0IGlzIHJ1bm5pbmcgKi8KKwlpbnQgY250ID0gNTAwMDsKKworCisJaWYgKENISVBfUkVWX0lTX0VNVUwoYnApKQorCQljbnQgKj0gMjA7CisKKwlEUChCTlgyWF9NU0dfU1AsICJ3YWl0aW5nIGZvciBzdGF0ZSB0byBiZWNvbWUgJWRcbiIsIHN0YXRlKTsKKworCW1pZ2h0X3NsZWVwKCk7CisJd2hpbGUgKGNudC0tKSB7CisJCWlmICghdGVzdF9iaXQoc3RhdGUsIHBzdGF0ZSkpIHsKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJCQlEUChCTlgyWF9NU0dfU1AsICJleGl0ICAoY250ICVkKVxuIiwgNTAwMCAtIGNudCk7CisjZW5kaWYKKwkJCXJldHVybiAwOworCQl9CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDEwMDApOworCisJCWlmIChicC0+cGFuaWMpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiB0aW1lb3V0ISAqLworCUJOWDJYX0VSUigidGltZW91dCB3YWl0aW5nIGZvciBzdGF0ZSAlZFxuIiwgc3RhdGUpOworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwlibngyeF9wYW5pYygpOworI2VuZGlmCisKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IGJueDJ4X3Jhd193YWl0KHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9yYXdfb2JqICpyYXcpCit7CisJcmV0dXJuIGJueDJ4X3N0YXRlX3dhaXQoYnAsIHJhdy0+c3RhdGUsIHJhdy0+cHN0YXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqIENsYXNzaWZpY2F0aW9uIHZlcmJzOiBTZXQvRGVsIE1BQy9WTEFOL1ZMQU4tTUFDICoqKioqKioqKioqKi8KKy8qIGNyZWRpdCBoYW5kbGluZyBjYWxsYmFja3MgKi8KK3N0YXRpYyBib29sIGJueDJ4X2dldF9jYW1fb2Zmc2V0X21hYyhzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLCBpbnQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICptcCA9IG8tPm1hY3NfcG9vbDsKKworCVdBUk5fT04oIW1wKTsKKworCXJldHVybiBtcC0+Z2V0X2VudHJ5KG1wLCBvZmZzZXQpOworfQorCitzdGF0aWMgYm9vbCBibngyeF9nZXRfY3JlZGl0X21hYyhzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvKQoreworCXN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmogKm1wID0gby0+bWFjc19wb29sOworCisJV0FSTl9PTighbXApOworCisJcmV0dXJuIG1wLT5nZXQobXAsIDEpOworfQorCitzdGF0aWMgYm9vbCBibngyeF9nZXRfY2FtX29mZnNldF92bGFuKHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8sIGludCAqb2Zmc2V0KQoreworCXN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmogKnZwID0gby0+dmxhbnNfcG9vbDsKKworCVdBUk5fT04oIXZwKTsKKworCXJldHVybiB2cC0+Z2V0X2VudHJ5KHZwLCBvZmZzZXQpOworfQorCitzdGF0aWMgYm9vbCBibngyeF9nZXRfY3JlZGl0X3ZsYW4oc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbykKK3sKKwlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICp2cCA9IG8tPnZsYW5zX3Bvb2w7CisKKwlXQVJOX09OKCF2cCk7CisKKwlyZXR1cm4gdnAtPmdldCh2cCwgMSk7Cit9CisKK3N0YXRpYyBib29sIGJueDJ4X2dldF9jcmVkaXRfdmxhbl9tYWMoc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbykKK3sKKwlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICptcCA9IG8tPm1hY3NfcG9vbDsKKwlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICp2cCA9IG8tPnZsYW5zX3Bvb2w7CisKKwlpZiAoIW1wLT5nZXQobXAsIDEpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoIXZwLT5nZXQodnAsIDEpKSB7CisJCW1wLT5wdXQobXAsIDEpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGJueDJ4X3B1dF9jYW1fb2Zmc2V0X21hYyhzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmogKm1wID0gby0+bWFjc19wb29sOworCisJcmV0dXJuIG1wLT5wdXRfZW50cnkobXAsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBib29sIGJueDJ4X3B1dF9jcmVkaXRfbWFjKHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8pCit7CisJc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqbXAgPSBvLT5tYWNzX3Bvb2w7CisKKwlyZXR1cm4gbXAtPnB1dChtcCwgMSk7Cit9CisKK3N0YXRpYyBib29sIGJueDJ4X3B1dF9jYW1fb2Zmc2V0X3ZsYW4oc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbywgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICp2cCA9IG8tPnZsYW5zX3Bvb2w7CisKKwlyZXR1cm4gdnAtPnB1dF9lbnRyeSh2cCwgb2Zmc2V0KTsKK30KKworc3RhdGljIGJvb2wgYm54MnhfcHV0X2NyZWRpdF92bGFuKHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8pCit7CisJc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqdnAgPSBvLT52bGFuc19wb29sOworCisJcmV0dXJuIHZwLT5wdXQodnAsIDEpOworfQorCitzdGF0aWMgYm9vbCBibngyeF9wdXRfY3JlZGl0X3ZsYW5fbWFjKHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8pCit7CisJc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqbXAgPSBvLT5tYWNzX3Bvb2w7CisJc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqdnAgPSBvLT52bGFuc19wb29sOworCisJaWYgKCFtcC0+cHV0KG1wLCAxKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCF2cC0+cHV0KHZwLCAxKSkgeworCQltcC0+Z2V0KG1wLCAxKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKiBjaGVja19hZGQoKSBjYWxsYmFja3MgKi8KK3N0YXRpYyBpbnQgYm54MnhfY2hlY2tfbWFjX2FkZChzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLAorCQkJICAgICAgIHVuaW9uIGJueDJ4X2NsYXNzaWZpY2F0aW9uX3JhbXJvZF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBibngyeF92bGFuX21hY19yZWdpc3RyeV9lbGVtICpwb3M7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGF0YS0+bWFjLm1hYykpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgaWYgYSByZXF1ZXN0ZWQgTUFDIGFscmVhZHkgZXhpc3RzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZvLT5oZWFkLCBsaW5rKQorCQlpZiAoIW1lbWNtcChkYXRhLT5tYWMubWFjLCBwb3MtPnUubWFjLm1hYywgRVRIX0FMRU4pKQorCQkJcmV0dXJuIC1FRVhJU1Q7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibngyeF9jaGVja192bGFuX2FkZChzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLAorCQkJCXVuaW9uIGJueDJ4X2NsYXNzaWZpY2F0aW9uX3JhbXJvZF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBibngyeF92bGFuX21hY19yZWdpc3RyeV9lbGVtICpwb3M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJm8tPmhlYWQsIGxpbmspCisJCWlmIChkYXRhLT52bGFuLnZsYW4gPT0gcG9zLT51LnZsYW4udmxhbikKKwkJCXJldHVybiAtRUVYSVNUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfY2hlY2tfdmxhbl9tYWNfYWRkKHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8sCisJCQkJICAgdW5pb24gYm54MnhfY2xhc3NpZmljYXRpb25fcmFtcm9kX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JlZ2lzdHJ5X2VsZW0gKnBvczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmby0+aGVhZCwgbGluaykKKwkJaWYgKChkYXRhLT52bGFuX21hYy52bGFuID09IHBvcy0+dS52bGFuX21hYy52bGFuKSAmJgorCQkgICAgKCFtZW1jbXAoZGF0YS0+dmxhbl9tYWMubWFjLCBwb3MtPnUudmxhbl9tYWMubWFjLAorCQkJICAgICBFVEhfQUxFTikpKQorCQkJcmV0dXJuIC1FRVhJU1Q7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBjaGVja19kZWwoKSBjYWxsYmFja3MgKi8KK3N0YXRpYyBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfcmVnaXN0cnlfZWxlbSAqCisJYm54MnhfY2hlY2tfbWFjX2RlbChzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLAorCQkJICAgIHVuaW9uIGJueDJ4X2NsYXNzaWZpY2F0aW9uX3JhbXJvZF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBibngyeF92bGFuX21hY19yZWdpc3RyeV9lbGVtICpwb3M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJm8tPmhlYWQsIGxpbmspCisJCWlmICghbWVtY21wKGRhdGEtPm1hYy5tYWMsIHBvcy0+dS5tYWMubWFjLCBFVEhfQUxFTikpCisJCQlyZXR1cm4gcG9zOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfcmVnaXN0cnlfZWxlbSAqCisJYm54MnhfY2hlY2tfdmxhbl9kZWwoc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbywKKwkJCSAgICAgdW5pb24gYm54MnhfY2xhc3NpZmljYXRpb25fcmFtcm9kX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JlZ2lzdHJ5X2VsZW0gKnBvczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmby0+aGVhZCwgbGluaykKKwkJaWYgKGRhdGEtPnZsYW4udmxhbiA9PSBwb3MtPnUudmxhbi52bGFuKQorCQkJcmV0dXJuIHBvczsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JlZ2lzdHJ5X2VsZW0gKgorCWJueDJ4X2NoZWNrX3ZsYW5fbWFjX2RlbChzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLAorCQkJCSB1bmlvbiBibngyeF9jbGFzc2lmaWNhdGlvbl9yYW1yb2RfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfcmVnaXN0cnlfZWxlbSAqcG9zOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZvLT5oZWFkLCBsaW5rKQorCQlpZiAoKGRhdGEtPnZsYW5fbWFjLnZsYW4gPT0gcG9zLT51LnZsYW5fbWFjLnZsYW4pICYmCisJCSAgICAoIW1lbWNtcChkYXRhLT52bGFuX21hYy5tYWMsIHBvcy0+dS52bGFuX21hYy5tYWMsCisJCQkgICAgIEVUSF9BTEVOKSkpCisJCQlyZXR1cm4gcG9zOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGNoZWNrX21vdmUoKSBjYWxsYmFjayAqLworc3RhdGljIGJvb2wgYm54MnhfY2hlY2tfbW92ZShzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpzcmNfbywKKwkJCSAgICAgc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqZHN0X28sCisJCQkgICAgIHVuaW9uIGJueDJ4X2NsYXNzaWZpY2F0aW9uX3JhbXJvZF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBibngyeF92bGFuX21hY19yZWdpc3RyeV9lbGVtICpwb3M7CisJaW50IHJjOworCisJLyogQ2hlY2sgaWYgd2UgY2FuIGRlbGV0ZSB0aGUgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZmlyc3QKKwkgKiBvYmplY3QuCisJICovCisJcG9zID0gc3JjX28tPmNoZWNrX2RlbChzcmNfbywgZGF0YSk7CisKKwkvKiAgY2hlY2sgaWYgY29uZmlndXJhdGlvbiBjYW4gYmUgYWRkZWQgKi8KKwlyYyA9IGRzdF9vLT5jaGVja19hZGQoZHN0X28sIGRhdGEpOworCisJLyogSWYgdGhpcyBjbGFzc2lmaWNhdGlvbiBjYW4gbm90IGJlIGFkZGVkIChpcyBhbHJlYWR5IHNldCkKKwkgKiBvciBjYW4ndCBiZSBkZWxldGVkIC0gcmV0dXJuIGFuIGVycm9yLgorCSAqLworCWlmIChyYyB8fCAhcG9zKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgYm54MnhfY2hlY2tfbW92ZV9hbHdheXNfZXJyKAorCXN0cnVjdCBibngyeF92bGFuX21hY19vYmogKnNyY19vLAorCXN0cnVjdCBibngyeF92bGFuX21hY19vYmogKmRzdF9vLAorCXVuaW9uIGJueDJ4X2NsYXNzaWZpY2F0aW9uX3JhbXJvZF9kYXRhICpkYXRhKQoreworCXJldHVybiBmYWxzZTsKK30KKworCitzdGF0aWMgaW5saW5lIHU4IGJueDJ4X3ZsYW5fbWFjX2dldF9yeF90eF9mbGFnKHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8pCit7CisJc3RydWN0IGJueDJ4X3Jhd19vYmogKnJhdyA9ICZvLT5yYXc7CisJdTggcnhfdHhfZmxhZyA9IDA7CisKKwlpZiAoKHJhdy0+b2JqX3R5cGUgPT0gQk5YMlhfT0JKX1RZUEVfVFgpIHx8CisJICAgIChyYXctPm9ial90eXBlID09IEJOWDJYX09CSl9UWVBFX1JYX1RYKSkKKwkJcnhfdHhfZmxhZyB8PSBFVEhfQ0xBU1NJRllfQ01EX0hFQURFUl9UWF9DTUQ7CisKKwlpZiAoKHJhdy0+b2JqX3R5cGUgPT0gQk5YMlhfT0JKX1RZUEVfUlgpIHx8CisJICAgIChyYXctPm9ial90eXBlID09IEJOWDJYX09CSl9UWVBFX1JYX1RYKSkKKwkJcnhfdHhfZmxhZyB8PSBFVEhfQ0xBU1NJRllfQ01EX0hFQURFUl9SWF9DTUQ7CisKKwlyZXR1cm4gcnhfdHhfZmxhZzsKK30KKworLyogTExIIENBTSBsaW5lIGFsbG9jYXRpb25zICovCitlbnVtIHsKKwlMTEhfQ0FNX0lTQ1NJX0VUSF9MSU5FID0gMCwKKwlMTEhfQ0FNX0VUSF9MSU5FLAorCUxMSF9DQU1fTUFYX1BGX0xJTkUgPSBOSUdfUkVHX0xMSDFfRlVOQ19NRU1fU0laRSAvIDIKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9zZXRfbWFjX2luX25pZyhzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSBib29sIGFkZCwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIsIGludCBpbmRleCkKK3sKKwl1MzIgd2JfZGF0YVsyXTsKKwl1MzIgcmVnX29mZnNldCA9IEJQX1BPUlQoYnApID8gTklHX1JFR19MTEgxX0ZVTkNfTUVNIDoKKwkJCSBOSUdfUkVHX0xMSDBfRlVOQ19NRU07CisKKwlpZiAoIUlTX01GX1NJKGJwKSB8fCBpbmRleCA+IExMSF9DQU1fTUFYX1BGX0xJTkUpCisJCXJldHVybjsKKworCURQKEJOWDJYX01TR19TUCwgIkdvaW5nIHRvICVzIExMSCBjb25maWd1cmF0aW9uIGF0IGVudHJ5ICVkXG4iLAorCQkJIChhZGQgPyAiQUREIiA6ICJERUxFVEUiKSwgaW5kZXgpOworCisJaWYgKGFkZCkgeworCQkvKiBMTEhfRlVOQ19NRU0gaXMgYSB1NjQgV0IgcmVnaXN0ZXIgKi8KKwkJcmVnX29mZnNldCArPSA4KmluZGV4OworCisJCXdiX2RhdGFbMF0gPSAoKGRldl9hZGRyWzJdIDw8IDI0KSB8IChkZXZfYWRkclszXSA8PCAxNikgfAorCQkJICAgICAgKGRldl9hZGRyWzRdIDw8ICA4KSB8ICBkZXZfYWRkcls1XSk7CisJCXdiX2RhdGFbMV0gPSAoKGRldl9hZGRyWzBdIDw8ICA4KSB8ICBkZXZfYWRkclsxXSk7CisKKwkJUkVHX1dSX0RNQUUoYnAsIHJlZ19vZmZzZXQsIHdiX2RhdGEsIDIpOworCX0KKworCVJFR19XUihicCwgKEJQX1BPUlQoYnApID8gTklHX1JFR19MTEgxX0ZVTkNfTUVNX0VOQUJMRSA6CisJCQkJICBOSUdfUkVHX0xMSDBfRlVOQ19NRU1fRU5BQkxFKSArIDQqaW5kZXgsIGFkZCk7Cit9CisKKy8qKgorICogYm54Mnhfdmxhbl9tYWNfc2V0X2NtZF9oZHJfZTIgLSBzZXQgYSBoZWFkZXIgaW4gYSBzaW5nbGUgY2xhc3NpZnkgcmFtcm9kCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQG86CQlxdWV1ZSBmb3Igd2hpY2ggd2Ugd2FudCB0byBjb25maWd1cmUgdGhpcyBydWxlCisgKiBAYWRkOglpZiB0cnVlIHRoZSBjb21tYW5kIGlzIGFuIEFERCBjb21tYW5kLCBERUwgb3RoZXJ3aXNlCisgKiBAb3Bjb2RlOglDTEFTU0lGWV9SVUxFX09QQ09ERV9YWFgKKyAqIEBoZHI6CXBvaW50ZXIgdG8gYSBoZWFkZXIgdG8gc2V0dXAKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF92bGFuX21hY19zZXRfY21kX2hkcl9lMihzdHJ1Y3QgYm54MnggKmJwLAorCXN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8sIGJvb2wgYWRkLCBpbnQgb3Bjb2RlLAorCXN0cnVjdCBldGhfY2xhc3NpZnlfY21kX2hlYWRlciAqaGRyKQoreworCXN0cnVjdCBibngyeF9yYXdfb2JqICpyYXcgPSAmby0+cmF3OworCisJaGRyLT5jbGllbnRfaWQgPSByYXctPmNsX2lkOworCWhkci0+ZnVuY19pZCA9IHJhdy0+ZnVuY19pZDsKKworCS8qIFJ4IG9yL2FuZCBUeCAoaW50ZXJuYWwgc3dpdGNoaW5nKSBjb25maWd1cmF0aW9uID8gKi8KKwloZHItPmNtZF9nZW5lcmFsX2RhdGEgfD0KKwkJYm54Mnhfdmxhbl9tYWNfZ2V0X3J4X3R4X2ZsYWcobyk7CisKKwlpZiAoYWRkKQorCQloZHItPmNtZF9nZW5lcmFsX2RhdGEgfD0gRVRIX0NMQVNTSUZZX0NNRF9IRUFERVJfSVNfQUREOworCisJaGRyLT5jbWRfZ2VuZXJhbF9kYXRhIHw9CisJCShvcGNvZGUgPDwgRVRIX0NMQVNTSUZZX0NNRF9IRUFERVJfT1BDT0RFX1NISUZUKTsKK30KKworLyoqCisgKiBibngyeF92bGFuX21hY19zZXRfcmRhdGFfaGRyX2UyIC0gc2V0IHRoZSBjbGFzc2lmeSByYW1yb2QgZGF0YSBoZWFkZXIKKyAqCisgKiBAY2lkOgljb25uZWN0aW9uIGlkCisgKiBAdHlwZToJQk5YMlhfRklMVEVSX1hYWF9QRU5ESU5HCisgKiBAaGRyOglwb2l0ZXIgdG8gaGVhZGVyIHRvIHNldHVwCisgKiBAcnVsZV9jbnQ6CisgKgorICogY3VycmVudGx5IHdlIGFsd2F5cyBjb25maWd1cmUgb25lIHJ1bGUgYW5kIGVjaG8gZmllbGQgdG8gY29udGFpbiBhIENJRCBhbmQgYW4KKyAqIG9wY29kZSB0eXBlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYm54Mnhfdmxhbl9tYWNfc2V0X3JkYXRhX2hkcl9lMih1MzIgY2lkLCBpbnQgdHlwZSwKKwkJCQlzdHJ1Y3QgZXRoX2NsYXNzaWZ5X2hlYWRlciAqaGRyLCBpbnQgcnVsZV9jbnQpCit7CisJaGRyLT5lY2hvID0gKGNpZCAmIEJOWDJYX1NXQ0lEX01BU0spIHwgKHR5cGUgPDwgQk5YMlhfU1dDSURfU0hJRlQpOworCWhkci0+cnVsZV9jbnQgPSAodTgpcnVsZV9jbnQ7Cit9CisKKworLyogaHdfY29uZmlnKCkgY2FsbGJhY2tzICovCitzdGF0aWMgdm9pZCBibngyeF9zZXRfb25lX21hY19lMihzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLAorCQkJCSBzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICplbGVtLCBpbnQgcnVsZV9pZHgsCisJCQkJIGludCBjYW1fb2Zmc2V0KQoreworCXN0cnVjdCBibngyeF9yYXdfb2JqICpyYXcgPSAmby0+cmF3OworCXN0cnVjdCBldGhfY2xhc3NpZnlfcnVsZXNfcmFtcm9kX2RhdGEgKmRhdGEgPQorCQkoc3RydWN0IGV0aF9jbGFzc2lmeV9ydWxlc19yYW1yb2RfZGF0YSAqKShyYXctPnJkYXRhKTsKKwlpbnQgcnVsZV9jbnQgPSBydWxlX2lkeCArIDEsIGNtZCA9IGVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLmNtZDsKKwl1bmlvbiBldGhfY2xhc3NpZnlfcnVsZV9jbWQgKnJ1bGVfZW50cnkgPSAmZGF0YS0+cnVsZXNbcnVsZV9pZHhdOworCWJvb2wgYWRkID0gKGNtZCA9PSBCTlgyWF9WTEFOX01BQ19BREQpID8gdHJ1ZSA6IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgKnZsYW5fbWFjX2ZsYWdzID0gJmVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnZsYW5fbWFjX2ZsYWdzOworCXU4ICptYWMgPSBlbGVtLT5jbWRfZGF0YS52bGFuX21hYy51Lm1hYy5tYWM7CisKKwkvKgorCSAqIFNldCBMTEggQ0FNIGVudHJ5OiBjdXJyZW50bHkgb25seSBpU0NTSSBhbmQgRVRIIG1hY3MgYXJlCisJICogcmVsZXZhbnQuIEluIGFkZGl0aW9uLCBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHR1bmVkIGZvciBhCisJICogc2luZ2xlIEVUSCBNQUMuCisJICoKKwkgKiBXaGVuIG11bHRpcGxlIHVuaWNhc3QgRVRIIE1BQ3MgUEYgY29uZmlndXJhdGlvbiBpbiBzd2l0Y2gKKwkgKiBpbmRlcGVuZGVudCBtb2RlIGlzIHJlcXVpcmVkIChOZXRRLCBtdWx0aXBsZSBuZXRkZXYgTUFDcywKKwkgKiBldGMuKSwgY29uc2lkZXIgYmV0dGVyIHV0aWxpc2F0aW9uIG9mIDggcGVyIGZ1bmN0aW9uIE1BQworCSAqIGVudHJpZXMgaW4gdGhlIExMSCByZWdpc3Rlci4gVGhlcmUgaXMgYWxzbworCSAqIE5JR19SRUdfUFswMV1fTExIX0ZVTkNfTUVNMiByZWdpc3RlcnMgdGhhdCBjb21wbGV0ZSB0aGUKKwkgKiB0b3RhbCBudW1iZXIgb2YgQ0FNIGVudHJpZXMgdG8gMTYuCisJICoKKwkgKiBDdXJyZW50bHkgd2Ugd29uJ3QgY29uZmlndXJlIE5JRyBmb3IgTUFDcyBvdGhlciB0aGFuIGEgcHJpbWFyeSBFVEgKKwkgKiBNQUMgYW5kIGlTQ1NJIEwyIE1BQy4KKwkgKgorCSAqIElmIHRoaXMgTUFDIGlzIG1vdmluZyBmcm9tIG9uZSBRdWV1ZSB0byBhbm90aGVyLCBubyBuZWVkIHRvIGNoYW5nZQorCSAqIE5JRyBjb25maWd1cmF0aW9uLgorCSAqLworCWlmIChjbWQgIT0gQk5YMlhfVkxBTl9NQUNfTU9WRSkgeworCQlpZiAodGVzdF9iaXQoQk5YMlhfSVNDU0lfRVRIX01BQywgdmxhbl9tYWNfZmxhZ3MpKQorCQkJYm54Mnhfc2V0X21hY19pbl9uaWcoYnAsIGFkZCwgbWFjLAorCQkJCQkgICAgIExMSF9DQU1fSVNDU0lfRVRIX0xJTkUpOworCQllbHNlIGlmICh0ZXN0X2JpdChCTlgyWF9FVEhfTUFDLCB2bGFuX21hY19mbGFncykpCisJCQlibngyeF9zZXRfbWFjX2luX25pZyhicCwgYWRkLCBtYWMsIExMSF9DQU1fRVRIX0xJTkUpOworCX0KKworCS8qIFJlc2V0IHRoZSByYW1yb2QgZGF0YSBidWZmZXIgZm9yIHRoZSBmaXJzdCBydWxlICovCisJaWYgKHJ1bGVfaWR4ID09IDApCisJCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKworCS8qIFNldHVwIGEgY29tbWFuZCBoZWFkZXIgKi8KKwlibngyeF92bGFuX21hY19zZXRfY21kX2hkcl9lMihicCwgbywgYWRkLCBDTEFTU0lGWV9SVUxFX09QQ09ERV9NQUMsCisJCQkJICAgICAgJnJ1bGVfZW50cnktPm1hYy5oZWFkZXIpOworCisJRFAoQk5YMlhfTVNHX1NQLCAiQWJvdXQgdG8gJXMgTUFDICJCTlgyWF9NQUNfRk1UIiBmb3IgIgorCQkJICJRdWV1ZSAlZFxuIiwgKGFkZCA/ICJhZGQiIDogImRlbGV0ZSIpLAorCQkJIEJOWDJYX01BQ19QUk5fTElTVChtYWMpLCByYXctPmNsX2lkKTsKKworCS8qIFNldCBhIE1BQyBpdHNlbGYgKi8KKwlibngyeF9zZXRfZndfbWFjX2FkZHIoJnJ1bGVfZW50cnktPm1hYy5tYWNfbXNiLAorCQkJICAgICAgJnJ1bGVfZW50cnktPm1hYy5tYWNfbWlkLAorCQkJICAgICAgJnJ1bGVfZW50cnktPm1hYy5tYWNfbHNiLCBtYWMpOworCisJLyogTU9WRTogQWRkIGEgcnVsZSB0aGF0IHdpbGwgYWRkIHRoaXMgTUFDIHRvIHRoZSB0YXJnZXQgUXVldWUgKi8KKwlpZiAoY21kID09IEJOWDJYX1ZMQU5fTUFDX01PVkUpIHsKKwkJcnVsZV9lbnRyeSsrOworCQlydWxlX2NudCsrOworCisJCS8qIFNldHVwIHJhbXJvZCBkYXRhICovCisJCWJueDJ4X3ZsYW5fbWFjX3NldF9jbWRfaGRyX2UyKGJwLAorCQkJCQllbGVtLT5jbWRfZGF0YS52bGFuX21hYy50YXJnZXRfb2JqLAorCQkJCQkgICAgICB0cnVlLCBDTEFTU0lGWV9SVUxFX09QQ09ERV9NQUMsCisJCQkJCSAgICAgICZydWxlX2VudHJ5LT5tYWMuaGVhZGVyKTsKKworCQkvKiBTZXQgYSBNQUMgaXRzZWxmICovCisJCWJueDJ4X3NldF9md19tYWNfYWRkcigmcnVsZV9lbnRyeS0+bWFjLm1hY19tc2IsCisJCQkJICAgICAgJnJ1bGVfZW50cnktPm1hYy5tYWNfbWlkLAorCQkJCSAgICAgICZydWxlX2VudHJ5LT5tYWMubWFjX2xzYiwgbWFjKTsKKwl9CisKKwkvKiBTZXQgdGhlIHJhbXJvZCBkYXRhIGhlYWRlciAqLworCS8qIFRPRE86IHRha2UgdGhpcyB0byB0aGUgaGlnaGVyIGxldmVsIGluIG9yZGVyIHRvIHByZXZlbnQgbXVsdGlwbGUKKwkJIHdyaXRpbmcgKi8KKwlibngyeF92bGFuX21hY19zZXRfcmRhdGFfaGRyX2UyKHJhdy0+Y2lkLCByYXctPnN0YXRlLCAmZGF0YS0+aGVhZGVyLAorCQkJCQlydWxlX2NudCk7Cit9CisKKy8qKgorICogYm54Mnhfdmxhbl9tYWNfc2V0X3JkYXRhX2hkcl9lMXggLSBzZXQgYSBoZWFkZXIgaW4gYSBzaW5nbGUgY2xhc3NpZnkgcmFtcm9kCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQG86CQlxdWV1ZQorICogQHR5cGU6CisgKiBAY2FtX29mZnNldDoJb2Zmc2V0IGluIGNhbSBtZW1vcnkKKyAqIEBoZHI6CXBvaW50ZXIgdG8gYSBoZWFkZXIgdG8gc2V0dXAKKyAqCisgKiBFMS9FMUgKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3ZsYW5fbWFjX3NldF9yZGF0YV9oZHJfZTF4KHN0cnVjdCBibngyeCAqYnAsCisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbywgaW50IHR5cGUsIGludCBjYW1fb2Zmc2V0LAorCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9oZHIgKmhkcikKK3sKKwlzdHJ1Y3QgYm54MnhfcmF3X29iaiAqciA9ICZvLT5yYXc7CisKKwloZHItPmxlbmd0aCA9IDE7CisJaGRyLT5vZmZzZXQgPSAodTgpY2FtX29mZnNldDsKKwloZHItPmNsaWVudF9pZCA9IDB4ZmY7CisJaGRyLT5lY2hvID0gKChyLT5jaWQgJiBCTlgyWF9TV0NJRF9NQVNLKSB8ICh0eXBlIDw8IEJOWDJYX1NXQ0lEX1NISUZUKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF92bGFuX21hY19zZXRfY2ZnX2VudHJ5X2UxeChzdHJ1Y3QgYm54MnggKmJwLAorCXN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8sIGJvb2wgYWRkLCBpbnQgb3Bjb2RlLCB1OCAqbWFjLAorCXUxNiB2bGFuX2lkLCBzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fZW50cnkgKmNmZ19lbnRyeSkKK3sKKwlzdHJ1Y3QgYm54MnhfcmF3X29iaiAqciA9ICZvLT5yYXc7CisJdTMyIGNsX2JpdF92ZWMgPSAoMSA8PCByLT5jbF9pZCk7CisKKwljZmdfZW50cnktPmNsaWVudHNfYml0X3ZlY3RvciA9IGNwdV90b19sZTMyKGNsX2JpdF92ZWMpOworCWNmZ19lbnRyeS0+cGZfaWQgPSByLT5mdW5jX2lkOworCWNmZ19lbnRyeS0+dmxhbl9pZCA9IGNwdV90b19sZTE2KHZsYW5faWQpOworCisJaWYgKGFkZCkgeworCQlTRVRfRkxBRyhjZmdfZW50cnktPmZsYWdzLCBNQUNfQ09ORklHVVJBVElPTl9FTlRSWV9BQ1RJT05fVFlQRSwKKwkJCSBUX0VUSF9NQUNfQ09NTUFORF9TRVQpOworCQlTRVRfRkxBRyhjZmdfZW50cnktPmZsYWdzLAorCQkJIE1BQ19DT05GSUdVUkFUSU9OX0VOVFJZX1ZMQU5fRklMVEVSSU5HX01PREUsIG9wY29kZSk7CisKKwkJLyogU2V0IGEgTUFDIGluIGEgcmFtcm9kIGRhdGEgKi8KKwkJYm54Mnhfc2V0X2Z3X21hY19hZGRyKCZjZmdfZW50cnktPm1zYl9tYWNfYWRkciwKKwkJCQkgICAgICAmY2ZnX2VudHJ5LT5taWRkbGVfbWFjX2FkZHIsCisJCQkJICAgICAgJmNmZ19lbnRyeS0+bHNiX21hY19hZGRyLCBtYWMpOworCX0gZWxzZQorCQlTRVRfRkxBRyhjZmdfZW50cnktPmZsYWdzLCBNQUNfQ09ORklHVVJBVElPTl9FTlRSWV9BQ1RJT05fVFlQRSwKKwkJCSBUX0VUSF9NQUNfQ09NTUFORF9JTlZBTElEQVRFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3ZsYW5fbWFjX3NldF9yZGF0YV9lMXgoc3RydWN0IGJueDJ4ICpicCwKKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLCBpbnQgdHlwZSwgaW50IGNhbV9vZmZzZXQsIGJvb2wgYWRkLAorCXU4ICptYWMsIHUxNiB2bGFuX2lkLCBpbnQgb3Bjb2RlLCBzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICpjb25maWcpCit7CisJc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2VudHJ5ICpjZmdfZW50cnkgPSAmY29uZmlnLT5jb25maWdfdGFibGVbMF07CisJc3RydWN0IGJueDJ4X3Jhd19vYmogKnJhdyA9ICZvLT5yYXc7CisKKwlibngyeF92bGFuX21hY19zZXRfcmRhdGFfaGRyX2UxeChicCwgbywgdHlwZSwgY2FtX29mZnNldCwKKwkJCQkJICZjb25maWctPmhkcik7CisJYm54Mnhfdmxhbl9tYWNfc2V0X2NmZ19lbnRyeV9lMXgoYnAsIG8sIGFkZCwgb3Bjb2RlLCBtYWMsIHZsYW5faWQsCisJCQkJCSBjZmdfZW50cnkpOworCisJRFAoQk5YMlhfTVNHX1NQLCAiJXMgTUFDICJCTlgyWF9NQUNfRk1UIiBDTElEICVkIENBTSBvZmZzZXQgJWRcbiIsCisJCQkgKGFkZCA/ICJzZXR0aW5nIiA6ICJjbGVhcmluZyIpLAorCQkJIEJOWDJYX01BQ19QUk5fTElTVChtYWMpLCByYXctPmNsX2lkLCBjYW1fb2Zmc2V0KTsKK30KKworLyoqCisgKiBibngyeF9zZXRfb25lX21hY19lMXggLSBmaWxsIGEgc2luZ2xlIE1BQyBydWxlIHJhbXJvZCBkYXRhCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQG86CQlibngyeF92bGFuX21hY19vYmoKKyAqIEBlbGVtOglibngyeF9leGVxX2VsZW0KKyAqIEBydWxlX2lkeDoJcnVsZV9pZHgKKyAqIEBjYW1fb2Zmc2V0OiBjYW1fb2Zmc2V0CisgKi8KK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9vbmVfbWFjX2UxeChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbywKKwkJCQkgIHN0cnVjdCBibngyeF9leGVxX2VsZW0gKmVsZW0sIGludCBydWxlX2lkeCwKKwkJCQkgIGludCBjYW1fb2Zmc2V0KQoreworCXN0cnVjdCBibngyeF9yYXdfb2JqICpyYXcgPSAmby0+cmF3OworCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKmNvbmZpZyA9CisJCShzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICopKHJhdy0+cmRhdGEpOworCS8qCisJICogNTc3MTAgYW5kIDU3NzExIGRvIG5vdCBzdXBwb3J0IE1PVkUgY29tbWFuZCwKKwkgKiBzbyBpdCdzIGVpdGhlciBBREQgb3IgREVMCisJICovCisJYm9vbCBhZGQgPSAoZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMuY21kID09IEJOWDJYX1ZMQU5fTUFDX0FERCkgPworCQl0cnVlIDogZmFsc2U7CisKKwkvKiBSZXNldCB0aGUgcmFtcm9kIGRhdGEgYnVmZmVyICovCisJbWVtc2V0KGNvbmZpZywgMCwgc2l6ZW9mKCpjb25maWcpKTsKKworCWJueDJ4X3ZsYW5fbWFjX3NldF9yZGF0YV9lMXgoYnAsIG8sIEJOWDJYX0ZJTFRFUl9NQUNfUEVORElORywKKwkJCQkgICAgIGNhbV9vZmZzZXQsIGFkZCwKKwkJCQkgICAgIGVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnUubWFjLm1hYywgMCwKKwkJCQkgICAgIEVUSF9WTEFOX0ZJTFRFUl9BTllfVkxBTiwgY29uZmlnKTsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfc2V0X29uZV92bGFuX2UyKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLAorCQkJCSAgc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSAqZWxlbSwgaW50IHJ1bGVfaWR4LAorCQkJCSAgaW50IGNhbV9vZmZzZXQpCit7CisJc3RydWN0IGJueDJ4X3Jhd19vYmogKnJhdyA9ICZvLT5yYXc7CisJc3RydWN0IGV0aF9jbGFzc2lmeV9ydWxlc19yYW1yb2RfZGF0YSAqZGF0YSA9CisJCShzdHJ1Y3QgZXRoX2NsYXNzaWZ5X3J1bGVzX3JhbXJvZF9kYXRhICopKHJhdy0+cmRhdGEpOworCWludCBydWxlX2NudCA9IHJ1bGVfaWR4ICsgMTsKKwl1bmlvbiBldGhfY2xhc3NpZnlfcnVsZV9jbWQgKnJ1bGVfZW50cnkgPSAmZGF0YS0+cnVsZXNbcnVsZV9pZHhdOworCWludCBjbWQgPSBlbGVtLT5jbWRfZGF0YS52bGFuX21hYy5jbWQ7CisJYm9vbCBhZGQgPSAoY21kID09IEJOWDJYX1ZMQU5fTUFDX0FERCkgPyB0cnVlIDogZmFsc2U7CisJdTE2IHZsYW4gPSBlbGVtLT5jbWRfZGF0YS52bGFuX21hYy51LnZsYW4udmxhbjsKKworCS8qIFJlc2V0IHRoZSByYW1yb2QgZGF0YSBidWZmZXIgZm9yIHRoZSBmaXJzdCBydWxlICovCisJaWYgKHJ1bGVfaWR4ID09IDApCisJCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKworCS8qIFNldCBhIHJ1bGUgaGVhZGVyICovCisJYm54Mnhfdmxhbl9tYWNfc2V0X2NtZF9oZHJfZTIoYnAsIG8sIGFkZCwgQ0xBU1NJRllfUlVMRV9PUENPREVfVkxBTiwKKwkJCQkgICAgICAmcnVsZV9lbnRyeS0+dmxhbi5oZWFkZXIpOworCisJRFAoQk5YMlhfTVNHX1NQLCAiQWJvdXQgdG8gJXMgVkxBTiAlZFxuIiwgKGFkZCA/ICJhZGQiIDogImRlbGV0ZSIpLAorCQkJIHZsYW4pOworCisJLyogU2V0IGEgVkxBTiBpdHNlbGYgKi8KKwlydWxlX2VudHJ5LT52bGFuLnZsYW4gPSBjcHVfdG9fbGUxNih2bGFuKTsKKworCS8qIE1PVkU6IEFkZCBhIHJ1bGUgdGhhdCB3aWxsIGFkZCB0aGlzIE1BQyB0byB0aGUgdGFyZ2V0IFF1ZXVlICovCisJaWYgKGNtZCA9PSBCTlgyWF9WTEFOX01BQ19NT1ZFKSB7CisJCXJ1bGVfZW50cnkrKzsKKwkJcnVsZV9jbnQrKzsKKworCQkvKiBTZXR1cCByYW1yb2QgZGF0YSAqLworCQlibngyeF92bGFuX21hY19zZXRfY21kX2hkcl9lMihicCwKKwkJCQkJZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMudGFyZ2V0X29iaiwKKwkJCQkJICAgICAgdHJ1ZSwgQ0xBU1NJRllfUlVMRV9PUENPREVfVkxBTiwKKwkJCQkJICAgICAgJnJ1bGVfZW50cnktPnZsYW4uaGVhZGVyKTsKKworCQkvKiBTZXQgYSBWTEFOIGl0c2VsZiAqLworCQlydWxlX2VudHJ5LT52bGFuLnZsYW4gPSBjcHVfdG9fbGUxNih2bGFuKTsKKwl9CisKKwkvKiBTZXQgdGhlIHJhbXJvZCBkYXRhIGhlYWRlciAqLworCS8qIFRPRE86IHRha2UgdGhpcyB0byB0aGUgaGlnaGVyIGxldmVsIGluIG9yZGVyIHRvIHByZXZlbnQgbXVsdGlwbGUKKwkJIHdyaXRpbmcgKi8KKwlibngyeF92bGFuX21hY19zZXRfcmRhdGFfaGRyX2UyKHJhdy0+Y2lkLCByYXctPnN0YXRlLCAmZGF0YS0+aGVhZGVyLAorCQkJCQlydWxlX2NudCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9vbmVfdmxhbl9tYWNfZTIoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLAorCQkJCSAgICAgIHN0cnVjdCBibngyeF9leGVxX2VsZW0gKmVsZW0sCisJCQkJICAgICAgaW50IHJ1bGVfaWR4LCBpbnQgY2FtX29mZnNldCkKK3sKKwlzdHJ1Y3QgYm54MnhfcmF3X29iaiAqcmF3ID0gJm8tPnJhdzsKKwlzdHJ1Y3QgZXRoX2NsYXNzaWZ5X3J1bGVzX3JhbXJvZF9kYXRhICpkYXRhID0KKwkJKHN0cnVjdCBldGhfY2xhc3NpZnlfcnVsZXNfcmFtcm9kX2RhdGEgKikocmF3LT5yZGF0YSk7CisJaW50IHJ1bGVfY250ID0gcnVsZV9pZHggKyAxOworCXVuaW9uIGV0aF9jbGFzc2lmeV9ydWxlX2NtZCAqcnVsZV9lbnRyeSA9ICZkYXRhLT5ydWxlc1tydWxlX2lkeF07CisJaW50IGNtZCA9IGVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLmNtZDsKKwlib29sIGFkZCA9IChjbWQgPT0gQk5YMlhfVkxBTl9NQUNfQUREKSA/IHRydWUgOiBmYWxzZTsKKwl1MTYgdmxhbiA9IGVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnUudmxhbl9tYWMudmxhbjsKKwl1OCAqbWFjID0gZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMudS52bGFuX21hYy5tYWM7CisKKworCS8qIFJlc2V0IHRoZSByYW1yb2QgZGF0YSBidWZmZXIgZm9yIHRoZSBmaXJzdCBydWxlICovCisJaWYgKHJ1bGVfaWR4ID09IDApCisJCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKworCS8qIFNldCBhIHJ1bGUgaGVhZGVyICovCisJYm54Mnhfdmxhbl9tYWNfc2V0X2NtZF9oZHJfZTIoYnAsIG8sIGFkZCwgQ0xBU1NJRllfUlVMRV9PUENPREVfUEFJUiwKKwkJCQkgICAgICAmcnVsZV9lbnRyeS0+cGFpci5oZWFkZXIpOworCisJLyogU2V0IFZMQU4gYW5kIE1BQyB0aGVtc2VsdnMgKi8KKwlydWxlX2VudHJ5LT5wYWlyLnZsYW4gPSBjcHVfdG9fbGUxNih2bGFuKTsKKwlibngyeF9zZXRfZndfbWFjX2FkZHIoJnJ1bGVfZW50cnktPnBhaXIubWFjX21zYiwKKwkJCSAgICAgICZydWxlX2VudHJ5LT5wYWlyLm1hY19taWQsCisJCQkgICAgICAmcnVsZV9lbnRyeS0+cGFpci5tYWNfbHNiLCBtYWMpOworCisJLyogTU9WRTogQWRkIGEgcnVsZSB0aGF0IHdpbGwgYWRkIHRoaXMgTUFDIHRvIHRoZSB0YXJnZXQgUXVldWUgKi8KKwlpZiAoY21kID09IEJOWDJYX1ZMQU5fTUFDX01PVkUpIHsKKwkJcnVsZV9lbnRyeSsrOworCQlydWxlX2NudCsrOworCisJCS8qIFNldHVwIHJhbXJvZCBkYXRhICovCisJCWJueDJ4X3ZsYW5fbWFjX3NldF9jbWRfaGRyX2UyKGJwLAorCQkJCQllbGVtLT5jbWRfZGF0YS52bGFuX21hYy50YXJnZXRfb2JqLAorCQkJCQkgICAgICB0cnVlLCBDTEFTU0lGWV9SVUxFX09QQ09ERV9QQUlSLAorCQkJCQkgICAgICAmcnVsZV9lbnRyeS0+cGFpci5oZWFkZXIpOworCisJCS8qIFNldCBhIFZMQU4gaXRzZWxmICovCisJCXJ1bGVfZW50cnktPnBhaXIudmxhbiA9IGNwdV90b19sZTE2KHZsYW4pOworCQlibngyeF9zZXRfZndfbWFjX2FkZHIoJnJ1bGVfZW50cnktPnBhaXIubWFjX21zYiwKKwkJCQkgICAgICAmcnVsZV9lbnRyeS0+cGFpci5tYWNfbWlkLAorCQkJCSAgICAgICZydWxlX2VudHJ5LT5wYWlyLm1hY19sc2IsIG1hYyk7CisJfQorCisJLyogU2V0IHRoZSByYW1yb2QgZGF0YSBoZWFkZXIgKi8KKwkvKiBUT0RPOiB0YWtlIHRoaXMgdG8gdGhlIGhpZ2hlciBsZXZlbCBpbiBvcmRlciB0byBwcmV2ZW50IG11bHRpcGxlCisJCSB3cml0aW5nICovCisJYm54Mnhfdmxhbl9tYWNfc2V0X3JkYXRhX2hkcl9lMihyYXctPmNpZCwgcmF3LT5zdGF0ZSwgJmRhdGEtPmhlYWRlciwKKwkJCQkJcnVsZV9jbnQpOworfQorCisvKioKKyAqIGJueDJ4X3NldF9vbmVfdmxhbl9tYWNfZTFoIC0KKyAqCisgKiBAYnA6CQlkZXZpY2UgaGFuZGxlCisgKiBAbzoJCWJueDJ4X3ZsYW5fbWFjX29iagorICogQGVsZW06CWJueDJ4X2V4ZXFfZWxlbQorICogQHJ1bGVfaWR4OglydWxlX2lkeAorICogQGNhbV9vZmZzZXQ6CWNhbV9vZmZzZXQKKyAqLworc3RhdGljIHZvaWQgYm54Mnhfc2V0X29uZV92bGFuX21hY19lMWgoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICAgc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbywKKwkJCQkgICAgICAgc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSAqZWxlbSwKKwkJCQkgICAgICAgaW50IHJ1bGVfaWR4LCBpbnQgY2FtX29mZnNldCkKK3sKKwlzdHJ1Y3QgYm54MnhfcmF3X29iaiAqcmF3ID0gJm8tPnJhdzsKKwlzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICpjb25maWcgPQorCQkoc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2NtZCAqKShyYXctPnJkYXRhKTsKKwkvKgorCSAqIDU3NzEwIGFuZCA1NzcxMSBkbyBub3Qgc3VwcG9ydCBNT1ZFIGNvbW1hbmQsCisJICogc28gaXQncyBlaXRoZXIgQUREIG9yIERFTAorCSAqLworCWJvb2wgYWRkID0gKGVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLmNtZCA9PSBCTlgyWF9WTEFOX01BQ19BREQpID8KKwkJdHJ1ZSA6IGZhbHNlOworCisJLyogUmVzZXQgdGhlIHJhbXJvZCBkYXRhIGJ1ZmZlciAqLworCW1lbXNldChjb25maWcsIDAsIHNpemVvZigqY29uZmlnKSk7CisKKwlibngyeF92bGFuX21hY19zZXRfcmRhdGFfZTF4KGJwLCBvLCBCTlgyWF9GSUxURVJfVkxBTl9NQUNfUEVORElORywKKwkJCQkgICAgIGNhbV9vZmZzZXQsIGFkZCwKKwkJCQkgICAgIGVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnUudmxhbl9tYWMubWFjLAorCQkJCSAgICAgZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMudS52bGFuX21hYy52bGFuLAorCQkJCSAgICAgRVRIX1ZMQU5fRklMVEVSX0NMQVNTSUZZLCBjb25maWcpOworfQorCisjZGVmaW5lIGxpc3RfbmV4dF9lbnRyeShwb3MsIG1lbWJlcikgXAorCWxpc3RfZW50cnkoKHBvcyktPm1lbWJlci5uZXh0LCB0eXBlb2YoKihwb3MpKSwgbWVtYmVyKQorCisvKioKKyAqIGJueDJ4X3ZsYW5fbWFjX3Jlc3RvcmUgLSByZWNvbmZpZ3VyZSBuZXh0IE1BQy9WTEFOL1ZMQU4tTUFDIGVsZW1lbnQKKyAqCisgKiBAYnA6CQlkZXZpY2UgaGFuZGxlCisgKiBAcDoJCWNvbW1hbmQgcGFyYW1ldGVycworICogQHBwb3M6CXBvaW50ZXIgdG8gdGhlIGNvb2t5CisgKgorICogcmVjb25maWd1cmUgbmV4dCBNQUMvVkxBTi9WTEFOLU1BQyBlbGVtZW50IGZyb20gdGhlCisgKiBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgZWxlbWVudHMgbGlzdC4KKyAqCisgKiBmcm9tIGNvbW1hbmQgcGFyYW1ldGVycyBvbmx5IFJBTVJPRF9DT01QX1dBSVQgYml0IGluIHJhbXJvZF9mbGFncyBpcwl0YWtlbgorICogaW50byBhbiBhY2NvdW50CisgKgorICogcG9pbnRlciB0byB0aGUgY29va3kgIC0gdGhhdCBzaG91bGQgYmUgZ2l2ZW4gYmFjayBpbiB0aGUgbmV4dCBjYWxsIHRvIG1ha2UKKyAqIGZ1bmN0aW9uIGhhbmRsZSB0aGUgbmV4dCBlbGVtZW50LiBJZiAqcHBvcyBpcyBzZXQgdG8gTlVMTCBpdCB3aWxsIHJlc3RhcnQgdGhlCisgKiBpdGVyYXRvci4gSWYgcmV0dXJuZWQgKnBwb3MgPT0gTlVMTCB0aGlzIG1lYW5zIHRoYXQgdGhlIGxhc3QgZWxlbWVudCBoYXMgYmVlbgorICogaGFuZGxlZC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgYm54Mnhfdmxhbl9tYWNfcmVzdG9yZShzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JhbXJvZF9wYXJhbXMgKnAsCisJCQkgICBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfcmVnaXN0cnlfZWxlbSAqKnBwb3MpCit7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JlZ2lzdHJ5X2VsZW0gKnBvczsKKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvID0gcC0+dmxhbl9tYWNfb2JqOworCisJLyogSWYgbGlzdCBpcyBlbXB0eSAtIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCWlmIChsaXN0X2VtcHR5KCZvLT5oZWFkKSkgeworCQkqcHBvcyA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCS8qIG1ha2UgYSBzdGVwLi4uICovCisJaWYgKCpwcG9zID09IE5VTEwpCisJCSpwcG9zID0gbGlzdF9maXJzdF9lbnRyeSgmby0+aGVhZCwKKwkJCQkJIHN0cnVjdCBibngyeF92bGFuX21hY19yZWdpc3RyeV9lbGVtLAorCQkJCQkgbGluayk7CisJZWxzZQorCQkqcHBvcyA9IGxpc3RfbmV4dF9lbnRyeSgqcHBvcywgbGluayk7CisKKwlwb3MgPSAqcHBvczsKKworCS8qIElmIGl0J3MgdGhlIGxhc3Qgc3RlcCAtIHJldHVybiBOVUxMICovCisJaWYgKGxpc3RfaXNfbGFzdCgmcG9zLT5saW5rLCAmby0+aGVhZCkpCisJCSpwcG9zID0gTlVMTDsKKworCS8qIFByZXBhcmUgYSAndXNlcl9yZXEnICovCisJbWVtY3B5KCZwLT51c2VyX3JlcS51LCAmcG9zLT51LCBzaXplb2YocG9zLT51KSk7CisKKwkvKiBTZXQgdGhlIGNvbW1hbmQgKi8KKwlwLT51c2VyX3JlcS5jbWQgPSBCTlgyWF9WTEFOX01BQ19BREQ7CisKKwkvKiBTZXQgdmxhbl9tYWNfZmxhZ3MgKi8KKwlwLT51c2VyX3JlcS52bGFuX21hY19mbGFncyA9IHBvcy0+dmxhbl9tYWNfZmxhZ3M7CisKKwkvKiBTZXQgYSByZXN0b3JlIGJpdCAqLworCV9fc2V0X2JpdChSQU1ST0RfUkVTVE9SRSwgJnAtPnJhbXJvZF9mbGFncyk7CisKKwlyZXR1cm4gYm54MnhfY29uZmlnX3ZsYW5fbWFjKGJwLCBwKTsKK30KKworLyoKKyAqIGJueDJ4X2V4ZXFfZ2V0X21hYy9ibngyeF9leGVxX2dldF92bGFuL2JueDJ4X2V4ZXFfZ2V0X3ZsYW5fbWFjIHJldHVybiBhCisgKiBwb2ludGVyIHRvIGFuIGVsZW1lbnQgd2l0aCBhIHNwZWNpZmljIGNyaXRlcmlhIGFuZCBOVUxMIGlmIHN1Y2ggYW4gZWxlbWVudAorICogaGFzbid0IGJlZW4gZm91bmQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICpibngyeF9leGVxX2dldF9tYWMoCisJc3RydWN0IGJueDJ4X2V4ZV9xdWV1ZV9vYmogKm8sCisJc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSAqZWxlbSkKK3sKKwlzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICpwb3M7CisJc3RydWN0IGJueDJ4X21hY19yYW1yb2RfZGF0YSAqZGF0YSA9ICZlbGVtLT5jbWRfZGF0YS52bGFuX21hYy51Lm1hYzsKKworCS8qIENoZWNrIHBlbmRpbmcgZm9yIGV4ZWN1dGlvbiBjb21tYW5kcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmby0+ZXhlX3F1ZXVlLCBsaW5rKQorCQlpZiAoIW1lbWNtcCgmcG9zLT5jbWRfZGF0YS52bGFuX21hYy51Lm1hYywgZGF0YSwKKwkJCSAgICAgIHNpemVvZigqZGF0YSkpICYmCisJCSAgICAocG9zLT5jbWRfZGF0YS52bGFuX21hYy5jbWQgPT0gZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMuY21kKSkKKwkJCXJldHVybiBwb3M7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBibngyeF9leGVxX2VsZW0gKmJueDJ4X2V4ZXFfZ2V0X3ZsYW4oCisJc3RydWN0IGJueDJ4X2V4ZV9xdWV1ZV9vYmogKm8sCisJc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSAqZWxlbSkKK3sKKwlzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICpwb3M7CisJc3RydWN0IGJueDJ4X3ZsYW5fcmFtcm9kX2RhdGEgKmRhdGEgPSAmZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMudS52bGFuOworCisJLyogQ2hlY2sgcGVuZGluZyBmb3IgZXhlY3V0aW9uIGNvbW1hbmRzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZvLT5leGVfcXVldWUsIGxpbmspCisJCWlmICghbWVtY21wKCZwb3MtPmNtZF9kYXRhLnZsYW5fbWFjLnUudmxhbiwgZGF0YSwKKwkJCSAgICAgIHNpemVvZigqZGF0YSkpICYmCisJCSAgICAocG9zLT5jbWRfZGF0YS52bGFuX21hYy5jbWQgPT0gZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMuY21kKSkKKwkJCXJldHVybiBwb3M7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBibngyeF9leGVxX2VsZW0gKmJueDJ4X2V4ZXFfZ2V0X3ZsYW5fbWFjKAorCXN0cnVjdCBibngyeF9leGVfcXVldWVfb2JqICpvLAorCXN0cnVjdCBibngyeF9leGVxX2VsZW0gKmVsZW0pCit7CisJc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSAqcG9zOworCXN0cnVjdCBibngyeF92bGFuX21hY19yYW1yb2RfZGF0YSAqZGF0YSA9CisJCSZlbGVtLT5jbWRfZGF0YS52bGFuX21hYy51LnZsYW5fbWFjOworCisJLyogQ2hlY2sgcGVuZGluZyBmb3IgZXhlY3V0aW9uIGNvbW1hbmRzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZvLT5leGVfcXVldWUsIGxpbmspCisJCWlmICghbWVtY21wKCZwb3MtPmNtZF9kYXRhLnZsYW5fbWFjLnUudmxhbl9tYWMsIGRhdGEsCisJCQkgICAgICBzaXplb2YoKmRhdGEpKSAmJgorCQkgICAgKHBvcy0+Y21kX2RhdGEudmxhbl9tYWMuY21kID09IGVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLmNtZCkpCisJCQlyZXR1cm4gcG9zOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogYm54MnhfdmFsaWRhdGVfdmxhbl9tYWNfYWRkIC0gY2hlY2sgaWYgYW4gQUREIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQHFvOgkJYm54MnhfcWFibGVfb2JqCisgKiBAZWxlbToJYm54MnhfZXhlcV9lbGVtCisgKgorICogQ2hlY2tzIHRoYXQgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIGNhbiBiZSBhZGRlZC4gSWYgeWVzIGFuZCBpZgorICogcmVxdWVzdGVkLCBjb25zdW1lIENBTSBjcmVkaXQuCisgKgorICogVGhlICd2YWxpZGF0ZScgaXMgcnVuIGFmdGVyIHRoZSAnb3B0aW1pemUnLgorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgYm54MnhfdmFsaWRhdGVfdmxhbl9tYWNfYWRkKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCSAgICAgIHVuaW9uIGJueDJ4X3FhYmxlX29iaiAqcW8sCisJCQkJCSAgICAgIHN0cnVjdCBibngyeF9leGVxX2VsZW0gKmVsZW0pCit7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbyA9ICZxby0+dmxhbl9tYWM7CisJc3RydWN0IGJueDJ4X2V4ZV9xdWV1ZV9vYmogKmV4ZXEgPSAmby0+ZXhlX3F1ZXVlOworCWludCByYzsKKworCS8qIENoZWNrIHRoZSByZWdpc3RyeSAqLworCXJjID0gby0+Y2hlY2tfYWRkKG8sICZlbGVtLT5jbWRfZGF0YS52bGFuX21hYy51KTsKKwlpZiAocmMpIHsKKwkJRFAoQk5YMlhfTVNHX1NQLCAiQUREIGNvbW1hbmQgaXMgbm90IGFsbG93ZWQgY29uc2lkZXJpbmcgIgorCQkJCSAiY3VycmVudCByZWdpc3RyeSBzdGF0ZVxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZXJlIGlzIGEgcGVuZGluZyBBREQgY29tbWFuZCBmb3IgdGhpcworCSAqIE1BQy9WTEFOL1ZMQU4tTUFDLiBSZXR1cm4gYW4gZXJyb3IgaWYgdGhlcmUgaXMuCisJICovCisJaWYgKGV4ZXEtPmdldChleGVxLCBlbGVtKSkgeworCQlEUChCTlgyWF9NU0dfU1AsICJUaGVyZSBpcyBhIHBlbmRpbmcgQUREIGNvbW1hbmQgYWxyZWFkeVxuIik7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCS8qCisJICogVE9ETzogQ2hlY2sgdGhlIHBlbmRpbmcgTU9WRSBmcm9tIG90aGVyIG9iamVjdHMgd2hlcmUgdGhpcworCSAqIG9iamVjdCBpcyBhIGRlc3RpbmF0aW9uIG9iamVjdC4KKwkgKi8KKworCS8qIENvbnN1bWUgdGhlIGNyZWRpdCBpZiBub3QgcmVxdWVzdGVkIG5vdCB0byAqLworCWlmICghKHRlc3RfYml0KEJOWDJYX0RPTlRfQ09OU1VNRV9DQU1fQ1JFRElULAorCQkgICAgICAgJmVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnZsYW5fbWFjX2ZsYWdzKSB8fAorCSAgICBvLT5nZXRfY3JlZGl0KG8pKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBibngyeF92YWxpZGF0ZV92bGFuX21hY19kZWwgLSBjaGVjayBpZiB0aGUgREVMIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQHFvOgkJcXVhYmxlIG9iamVjdCB0byBjaGVjaworICogQGVsZW06CWVsZW1lbnQgdGhhdCBuZWVkcyB0byBiZSBkZWxldGVkCisgKgorICogQ2hlY2tzIHRoYXQgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIGNhbiBiZSBkZWxldGVkLiBJZiB5ZXMgYW5kIGlmCisgKiByZXF1ZXN0ZWQsIHJldHVybnMgYSBDQU0gY3JlZGl0LgorICoKKyAqIFRoZSAndmFsaWRhdGUnIGlzIHJ1biBhZnRlciB0aGUgJ29wdGltaXplJy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYm54MnhfdmFsaWRhdGVfdmxhbl9tYWNfZGVsKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCSAgICAgIHVuaW9uIGJueDJ4X3FhYmxlX29iaiAqcW8sCisJCQkJCSAgICAgIHN0cnVjdCBibngyeF9leGVxX2VsZW0gKmVsZW0pCit7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbyA9ICZxby0+dmxhbl9tYWM7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JlZ2lzdHJ5X2VsZW0gKnBvczsKKwlzdHJ1Y3QgYm54MnhfZXhlX3F1ZXVlX29iaiAqZXhlcSA9ICZvLT5leGVfcXVldWU7CisJc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSBxdWVyeV9lbGVtOworCisJLyogSWYgdGhpcyBjbGFzc2lmaWNhdGlvbiBjYW4gbm90IGJlIGRlbGV0ZWQgKGRvZXNuJ3QgZXhpc3QpCisJICogLSByZXR1cm4gYSBCTlgyWF9FWElTVC4KKwkgKi8KKwlwb3MgPSBvLT5jaGVja19kZWwobywgJmVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnUpOworCWlmICghcG9zKSB7CisJCURQKEJOWDJYX01TR19TUCwgIkRFTCBjb21tYW5kIGlzIG5vdCBhbGxvd2VkIGNvbnNpZGVyaW5nICIKKwkJCQkgImN1cnJlbnQgcmVnaXN0cnkgc3RhdGVcbiIpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIERFTCBvciBNT1ZFIGNvbW1hbmRzIGZvciB0aGlzCisJICogTUFDL1ZMQU4vVkxBTi1NQUMuIFJldHVybiBhbiBlcnJvciBpZiBzby4KKwkgKi8KKwltZW1jcHkoJnF1ZXJ5X2VsZW0sIGVsZW0sIHNpemVvZihxdWVyeV9lbGVtKSk7CisKKwkvKiBDaGVjayBmb3IgTU9WRSBjb21tYW5kcyAqLworCXF1ZXJ5X2VsZW0uY21kX2RhdGEudmxhbl9tYWMuY21kID0gQk5YMlhfVkxBTl9NQUNfTU9WRTsKKwlpZiAoZXhlcS0+Z2V0KGV4ZXEsICZxdWVyeV9lbGVtKSkgeworCQlCTlgyWF9FUlIoIlRoZXJlIGlzIGEgcGVuZGluZyBNT1ZFIGNvbW1hbmQgYWxyZWFkeVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIGZvciBERUwgY29tbWFuZHMgKi8KKwlpZiAoZXhlcS0+Z2V0KGV4ZXEsIGVsZW0pKSB7CisJCURQKEJOWDJYX01TR19TUCwgIlRoZXJlIGlzIGEgcGVuZGluZyBERUwgY29tbWFuZCBhbHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJLyogUmV0dXJuIHRoZSBjcmVkaXQgdG8gdGhlIGNyZWRpdCBwb29sIGlmIG5vdCByZXF1ZXN0ZWQgbm90IHRvICovCisJaWYgKCEodGVzdF9iaXQoQk5YMlhfRE9OVF9DT05TVU1FX0NBTV9DUkVESVQsCisJCSAgICAgICAmZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMudmxhbl9tYWNfZmxhZ3MpIHx8CisJICAgIG8tPnB1dF9jcmVkaXQobykpKSB7CisJCUJOWDJYX0VSUigiRmFpbGVkIHRvIHJldHVybiBhIGNyZWRpdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGJueDJ4X3ZhbGlkYXRlX3ZsYW5fbWFjX21vdmUgLSBjaGVjayBpZiB0aGUgTU9WRSBjb21tYW5kIGNhbiBiZSBleGVjdXRlZAorICoKKyAqIEBicDoJCWRldmljZSBoYW5kbGUKKyAqIEBxbzoJCXF1YWJsZSBvYmplY3QgdG8gY2hlY2sgKHNvdXJjZSkKKyAqIEBlbGVtOgllbGVtZW50IHRoYXQgbmVlZHMgdG8gYmUgbW92ZWQKKyAqCisgKiBDaGVja3MgdGhhdCB0aGUgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gY2FuIGJlIG1vdmVkLiBJZiB5ZXMgYW5kIGlmCisgKiByZXF1ZXN0ZWQsIHJldHVybnMgYSBDQU0gY3JlZGl0LgorICoKKyAqIFRoZSAndmFsaWRhdGUnIGlzIHJ1biBhZnRlciB0aGUgJ29wdGltaXplJy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYm54MnhfdmFsaWRhdGVfdmxhbl9tYWNfbW92ZShzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQkgICAgICAgdW5pb24gYm54MnhfcWFibGVfb2JqICpxbywKKwkJCQkJICAgICAgIHN0cnVjdCBibngyeF9leGVxX2VsZW0gKmVsZW0pCit7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqc3JjX28gPSAmcW8tPnZsYW5fbWFjOworCXN0cnVjdCBibngyeF92bGFuX21hY19vYmogKmRlc3RfbyA9IGVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnRhcmdldF9vYmo7CisJc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSBxdWVyeV9lbGVtOworCXN0cnVjdCBibngyeF9leGVfcXVldWVfb2JqICpzcmNfZXhlcSA9ICZzcmNfby0+ZXhlX3F1ZXVlOworCXN0cnVjdCBibngyeF9leGVfcXVldWVfb2JqICpkZXN0X2V4ZXEgPSAmZGVzdF9vLT5leGVfcXVldWU7CisKKwkvKgorCSAqIENoZWNrIGlmIHdlIGNhbiBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlZ2lzdHJ5CisJICogc3RhdGUuCisJICovCisJaWYgKCFzcmNfby0+Y2hlY2tfbW92ZShzcmNfbywgZGVzdF9vLCAmZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMudSkpIHsKKwkJRFAoQk5YMlhfTVNHX1NQLCAiTU9WRSBjb21tYW5kIGlzIG5vdCBhbGxvd2VkIGNvbnNpZGVyaW5nICIKKwkJCQkgImN1cnJlbnQgcmVnaXN0cnkgc3RhdGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZXJlIGlzIGFuIGFscmVhZHkgcGVuZGluZyBERUwgb3IgTU9WRSBjb21tYW5kIGZvciB0aGUKKwkgKiBzb3VyY2Ugb2JqZWN0IG9yIEFERCBjb21tYW5kIGZvciBhIGRlc3RpbmF0aW9uIG9iamVjdC4gUmV0dXJuIGFuCisJICogZXJyb3IgaWYgc28uCisJICovCisJbWVtY3B5KCZxdWVyeV9lbGVtLCBlbGVtLCBzaXplb2YocXVlcnlfZWxlbSkpOworCisJLyogQ2hlY2sgREVMIG9uIHNvdXJjZSAqLworCXF1ZXJ5X2VsZW0uY21kX2RhdGEudmxhbl9tYWMuY21kID0gQk5YMlhfVkxBTl9NQUNfREVMOworCWlmIChzcmNfZXhlcS0+Z2V0KHNyY19leGVxLCAmcXVlcnlfZWxlbSkpIHsKKwkJQk5YMlhfRVJSKCJUaGVyZSBpcyBhIHBlbmRpbmcgREVMIGNvbW1hbmQgb24gdGhlIHNvdXJjZSAiCisJCQkgICJxdWV1ZSBhbHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgTU9WRSBvbiBzb3VyY2UgKi8KKwlpZiAoc3JjX2V4ZXEtPmdldChzcmNfZXhlcSwgZWxlbSkpIHsKKwkJRFAoQk5YMlhfTVNHX1NQLCAiVGhlcmUgaXMgYSBwZW5kaW5nIE1PVkUgY29tbWFuZCBhbHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJLyogQ2hlY2sgQUREIG9uIGRlc3RpbmF0aW9uICovCisJcXVlcnlfZWxlbS5jbWRfZGF0YS52bGFuX21hYy5jbWQgPSBCTlgyWF9WTEFOX01BQ19BREQ7CisJaWYgKGRlc3RfZXhlcS0+Z2V0KGRlc3RfZXhlcSwgJnF1ZXJ5X2VsZW0pKSB7CisJCUJOWDJYX0VSUigiVGhlcmUgaXMgYSBwZW5kaW5nIEFERCBjb21tYW5kIG9uIHRoZSAiCisJCQkgICJkZXN0aW5hdGlvbiBxdWV1ZSBhbHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29uc3VtZSB0aGUgY3JlZGl0IGlmIG5vdCByZXF1ZXN0ZWQgbm90IHRvICovCisJaWYgKCEodGVzdF9iaXQoQk5YMlhfRE9OVF9DT05TVU1FX0NBTV9DUkVESVRfREVTVCwKKwkJICAgICAgICZlbGVtLT5jbWRfZGF0YS52bGFuX21hYy52bGFuX21hY19mbGFncykgfHwKKwkgICAgZGVzdF9vLT5nZXRfY3JlZGl0KGRlc3RfbykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKHRlc3RfYml0KEJOWDJYX0RPTlRfQ09OU1VNRV9DQU1fQ1JFRElULAorCQkgICAgICAgJmVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnZsYW5fbWFjX2ZsYWdzKSB8fAorCSAgICBzcmNfby0+cHV0X2NyZWRpdChzcmNfbykpKSB7CisJCS8qIHJldHVybiB0aGUgY3JlZGl0IHRha2VuIGZyb20gZGVzdC4uLiAqLworCQlkZXN0X28tPnB1dF9jcmVkaXQoZGVzdF9vKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfdmFsaWRhdGVfdmxhbl9tYWMoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICB1bmlvbiBibngyeF9xYWJsZV9vYmogKnFvLAorCQkJCSAgIHN0cnVjdCBibngyeF9leGVxX2VsZW0gKmVsZW0pCit7CisJc3dpdGNoIChlbGVtLT5jbWRfZGF0YS52bGFuX21hYy5jbWQpIHsKKwljYXNlIEJOWDJYX1ZMQU5fTUFDX0FERDoKKwkJcmV0dXJuIGJueDJ4X3ZhbGlkYXRlX3ZsYW5fbWFjX2FkZChicCwgcW8sIGVsZW0pOworCWNhc2UgQk5YMlhfVkxBTl9NQUNfREVMOgorCQlyZXR1cm4gYm54MnhfdmFsaWRhdGVfdmxhbl9tYWNfZGVsKGJwLCBxbywgZWxlbSk7CisJY2FzZSBCTlgyWF9WTEFOX01BQ19NT1ZFOgorCQlyZXR1cm4gYm54MnhfdmFsaWRhdGVfdmxhbl9tYWNfbW92ZShicCwgcW8sIGVsZW0pOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyoqCisgKiBibngyeF93YWl0X3ZsYW5fbWFjIC0gcGFzc2l2bHkgd2FpdCBmb3IgNSBzZWNvbmRzIHVudGlsIGFsbCB3b3JrIGNvbXBsZXRlcy4KKyAqCisgKiBAYnA6CQlkZXZpY2UgaGFuZGxlCisgKiBAbzoJCWJueDJ4X3ZsYW5fbWFjX29iagorICoKKyAqLworc3RhdGljIGludCBibngyeF93YWl0X3ZsYW5fbWFjKHN0cnVjdCBibngyeCAqYnAsCisJCQkgICAgICAgc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbykKK3sKKwlpbnQgY250ID0gNTAwMCwgcmM7CisJc3RydWN0IGJueDJ4X2V4ZV9xdWV1ZV9vYmogKmV4ZXEgPSAmby0+ZXhlX3F1ZXVlOworCXN0cnVjdCBibngyeF9yYXdfb2JqICpyYXcgPSAmby0+cmF3OworCisJd2hpbGUgKGNudC0tKSB7CisJCS8qIFdhaXQgZm9yIHRoZSBjdXJyZW50IGNvbW1hbmQgdG8gY29tcGxldGUgKi8KKwkJcmMgPSByYXctPndhaXRfY29tcChicCwgcmF3KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qIFdhaXQgdW50aWwgdGhlcmUgYXJlIG5vIHBlbmRpbmcgY29tbWFuZHMgKi8KKwkJaWYgKCFibngyeF9leGVfcXVldWVfZW1wdHkoZXhlcSkpCisJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCk7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUJVU1k7Cit9CisKKy8qKgorICogYm54MnhfY29tcGxldGVfdmxhbl9tYWMgLSBjb21wbGV0ZSBvbmUgVkxBTi1NQUMgcmFtcm9kCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQG86CQlibngyeF92bGFuX21hY19vYmoKKyAqIEBjcWU6CisgKiBAY29udDoJaWYgdHJ1ZSBzY2hlZHVsZSBuZXh0IGV4ZWN1dGlvbiBjaHVuaworICoKKyAqLworc3RhdGljIGludCBibngyeF9jb21wbGV0ZV92bGFuX21hYyhzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgIHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8sCisJCQkJICAgdW5pb24gZXZlbnRfcmluZ19lbGVtICpjcWUsCisJCQkJICAgdW5zaWduZWQgbG9uZyAqcmFtcm9kX2ZsYWdzKQoreworCXN0cnVjdCBibngyeF9yYXdfb2JqICpyID0gJm8tPnJhdzsKKwlpbnQgcmM7CisKKwkvKiBSZXNldCBwZW5kaW5nIGxpc3QgKi8KKwlibngyeF9leGVfcXVldWVfcmVzZXRfcGVuZGluZyhicCwgJm8tPmV4ZV9xdWV1ZSk7CisKKwkvKiBDbGVhciBwZW5kaW5nICovCisJci0+Y2xlYXJfcGVuZGluZyhyKTsKKworCS8qIElmIHJhbXJvZCBmYWlsZWQgdGhpcyBpcyBtb3N0IGxpa2VseSBhIFNXIGJ1ZyAqLworCWlmIChjcWUtPm1lc3NhZ2UuZXJyb3IpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUnVuIHRoZSBuZXh0IGJ1bGsgb2YgcGVuZGluZyBjb21tYW5kcyBpZiByZXF1ZXRlZCAqLworCWlmICh0ZXN0X2JpdChSQU1ST0RfQ09OVCwgcmFtcm9kX2ZsYWdzKSkgeworCQlyYyA9IGJueDJ4X2V4ZV9xdWV1ZV9zdGVwKGJwLCAmby0+ZXhlX3F1ZXVlLCByYW1yb2RfZmxhZ3MpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKworCS8qIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyByZXR1cm4gUEVORElORyAqLworCWlmICghYm54MnhfZXhlX3F1ZXVlX2VtcHR5KCZvLT5leGVfcXVldWUpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGJueDJ4X29wdGltaXplX3ZsYW5fbWFjIC0gb3B0aW1pemUgQUREIGFuZCBERUwgY29tbWFuZHMuCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQG86CQlibngyeF9xYWJsZV9vYmoKKyAqIEBlbGVtOglibngyeF9leGVxX2VsZW0KKyAqLworc3RhdGljIGludCBibngyeF9vcHRpbWl6ZV92bGFuX21hYyhzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgIHVuaW9uIGJueDJ4X3FhYmxlX29iaiAqcW8sCisJCQkJICAgc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSAqZWxlbSkKK3sKKwlzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtIHF1ZXJ5LCAqcG9zOworCXN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8gPSAmcW8tPnZsYW5fbWFjOworCXN0cnVjdCBibngyeF9leGVfcXVldWVfb2JqICpleGVxID0gJm8tPmV4ZV9xdWV1ZTsKKworCW1lbWNweSgmcXVlcnksIGVsZW0sIHNpemVvZihxdWVyeSkpOworCisJc3dpdGNoIChlbGVtLT5jbWRfZGF0YS52bGFuX21hYy5jbWQpIHsKKwljYXNlIEJOWDJYX1ZMQU5fTUFDX0FERDoKKwkJcXVlcnkuY21kX2RhdGEudmxhbl9tYWMuY21kID0gQk5YMlhfVkxBTl9NQUNfREVMOworCQlicmVhazsKKwljYXNlIEJOWDJYX1ZMQU5fTUFDX0RFTDoKKwkJcXVlcnkuY21kX2RhdGEudmxhbl9tYWMuY21kID0gQk5YMlhfVkxBTl9NQUNfQUREOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBEb24ndCBoYW5kbGUgYW55dGhpbmcgb3RoZXIgdGhhbiBBREQgb3IgREVMICovCisJCXJldHVybiAwOworCX0KKworCS8qIElmIHdlIGZvdW5kIHRoZSBhcHByb3ByaWF0ZSBlbGVtZW50IC0gZGVsZXRlIGl0ICovCisJcG9zID0gZXhlcS0+Z2V0KGV4ZXEsICZxdWVyeSk7CisJaWYgKHBvcykgeworCisJCS8qIFJldHVybiB0aGUgY3JlZGl0IG9mIHRoZSBvcHRpbWl6ZWQgY29tbWFuZCAqLworCQlpZiAoIXRlc3RfYml0KEJOWDJYX0RPTlRfQ09OU1VNRV9DQU1fQ1JFRElULAorCQkJICAgICAgJnBvcy0+Y21kX2RhdGEudmxhbl9tYWMudmxhbl9tYWNfZmxhZ3MpKSB7CisJCQlpZiAoKHF1ZXJ5LmNtZF9kYXRhLnZsYW5fbWFjLmNtZCA9PQorCQkJICAgICBCTlgyWF9WTEFOX01BQ19BREQpICYmICFvLT5wdXRfY3JlZGl0KG8pKSB7CisJCQkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gcmV0dXJuIHRoZSBjcmVkaXQgZm9yIHRoZSAiCisJCQkJCSAgIm9wdGltaXplZCBBREQgY29tbWFuZFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgaWYgKCFvLT5nZXRfY3JlZGl0KG8pKSB7IC8qIFZMQU5fTUFDX0RFTCAqLworCQkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIHJlY292ZXIgdGhlIGNyZWRpdCBmcm9tICIKKwkJCQkJICAidGhlIG9wdGltaXplZCBERUwgY29tbWFuZFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKworCQlEUChCTlgyWF9NU0dfU1AsICJPcHRpbWl6aW5nICVzIGNvbW1hbmRcbiIsCisJCQkgICAoZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMuY21kID09IEJOWDJYX1ZMQU5fTUFDX0FERCkgPworCQkJICAgIkFERCIgOiAiREVMIik7CisKKwkJbGlzdF9kZWwoJnBvcy0+bGluayk7CisJCWJueDJ4X2V4ZV9xdWV1ZV9mcmVlX2VsZW0oYnAsIHBvcyk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGJueDJ4X3ZsYW5fbWFjX2dldF9yZWdpc3RyeV9lbGVtIC0gcHJlcGFyZSBhIHJlZ2lzdHJ5IGVsZW1lbnQKKyAqCisgKiBAYnA6CSAgZGV2aWNlIGhhbmRsZQorICogQG86CisgKiBAZWxlbToKKyAqIEByZXN0b3JlOgorICogQHJlOgorICoKKyAqIHByZXBhcmUgYSByZWdpc3RyeSBlbGVtZW50IGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb21tYW5kIHJlcXVlc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3ZsYW5fbWFjX2dldF9yZWdpc3RyeV9lbGVtKAorCXN0cnVjdCBibngyeCAqYnAsCisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbywKKwlzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICplbGVtLAorCWJvb2wgcmVzdG9yZSwKKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfcmVnaXN0cnlfZWxlbSAqKnJlKQoreworCWludCBjbWQgPSBlbGVtLT5jbWRfZGF0YS52bGFuX21hYy5jbWQ7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JlZ2lzdHJ5X2VsZW0gKnJlZ19lbGVtOworCisJLyogQWxsb2NhdGUgYSBuZXcgcmVnaXN0cnkgZWxlbWVudCBpZiBuZWVkZWQuICovCisJaWYgKCFyZXN0b3JlICYmCisJICAgICgoY21kID09IEJOWDJYX1ZMQU5fTUFDX0FERCkgfHwgKGNtZCA9PSBCTlgyWF9WTEFOX01BQ19NT1ZFKSkpIHsKKwkJcmVnX2VsZW0gPSBremFsbG9jKHNpemVvZigqcmVnX2VsZW0pLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFyZWdfZWxlbSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIEdldCBhIG5ldyBDQU0gb2Zmc2V0ICovCisJCWlmICghby0+Z2V0X2NhbV9vZmZzZXQobywgJnJlZ19lbGVtLT5jYW1fb2Zmc2V0KSkgeworCQkJLyoKKwkJCSAqIFRoaXMgc2hlbGwgbmV2ZXIgaGFwcGVuLCBiZWNhdXNlIHdlIGhhdmUgY2hlY2tlZCB0aGUKKwkJCSAqIENBTSBhdmFpbGlhYmlsaXR5IGluIHRoZSAndmFsaWRhdGUnLgorCQkJICovCisJCQlXQVJOX09OKDEpOworCQkJa2ZyZWUocmVnX2VsZW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlEUChCTlgyWF9NU0dfU1AsICJHb3QgY2FtIG9mZnNldCAlZFxuIiwgcmVnX2VsZW0tPmNhbV9vZmZzZXQpOworCisJCS8qIFNldCBhIFZMQU4tTUFDIGRhdGEgKi8KKwkJbWVtY3B5KCZyZWdfZWxlbS0+dSwgJmVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnUsCisJCQkgIHNpemVvZihyZWdfZWxlbS0+dSkpOworCisJCS8qIENvcHkgdGhlIGZsYWdzIChuZWVkZWQgZm9yIERFTCBhbmQgUkVTVE9SRSBmbG93cykgKi8KKwkJcmVnX2VsZW0tPnZsYW5fbWFjX2ZsYWdzID0KKwkJCWVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnZsYW5fbWFjX2ZsYWdzOworCX0gZWxzZSAvKiBERUwsIFJFU1RPUkUgKi8KKwkJcmVnX2VsZW0gPSBvLT5jaGVja19kZWwobywgJmVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnUpOworCisJKnJlID0gcmVnX2VsZW07CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYm54MnhfZXhlY3V0ZV92bGFuX21hYyAtIGV4ZWN1dGUgdmxhbiBtYWMgY29tbWFuZAorICoKKyAqIEBicDoJCQlkZXZpY2UgaGFuZGxlCisgKiBAcW86CisgKiBAZXhlX2NodW5rOgorICogQHJhbXJvZF9mbGFnczoKKyAqCisgKiBnbyBhbmQgc2VuZCBhIHJhbXJvZCEKKyAqLworc3RhdGljIGludCBibngyeF9leGVjdXRlX3ZsYW5fbWFjKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICB1bmlvbiBibngyeF9xYWJsZV9vYmogKnFvLAorCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqZXhlX2NodW5rLAorCQkJCSAgdW5zaWduZWQgbG9uZyAqcmFtcm9kX2ZsYWdzKQoreworCXN0cnVjdCBibngyeF9leGVxX2VsZW0gKmVsZW07CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbyA9ICZxby0+dmxhbl9tYWMsICpjYW1fb2JqOworCXN0cnVjdCBibngyeF9yYXdfb2JqICpyID0gJm8tPnJhdzsKKwlpbnQgcmMsIGlkeCA9IDA7CisJYm9vbCByZXN0b3JlID0gdGVzdF9iaXQoUkFNUk9EX1JFU1RPUkUsIHJhbXJvZF9mbGFncyk7CisJYm9vbCBkcnZfb25seSA9IHRlc3RfYml0KFJBTVJPRF9EUlZfQ0xSX09OTFksIHJhbXJvZF9mbGFncyk7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JlZ2lzdHJ5X2VsZW0gKnJlZ19lbGVtOworCWludCBjbWQ7CisKKwkvKgorCSAqIElmIERSSVZFUl9PTkxZIGV4ZWN1dGlvbiBpcyByZXF1ZXN0ZWQsIGNsZWFudXAgYSByZWdpc3RyeQorCSAqIGFuZCBleGl0LiBPdGhlcndpc2Ugc2VuZCBhIHJhbXJvZCB0byBGVy4KKwkgKi8KKwlpZiAoIWRydl9vbmx5KSB7CisJCVdBUk5fT04oci0+Y2hlY2tfcGVuZGluZyhyKSk7CisKKwkJLyogU2V0IHBlbmRpbmcgKi8KKwkJci0+c2V0X3BlbmRpbmcocik7CisKKwkJLyogRmlsbCB0aGEgcmFtcm9kIGRhdGEgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbGVtLCBleGVfY2h1bmssIGxpbmspIHsKKwkJCWNtZCA9IGVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLmNtZDsKKwkJCS8qCisJCQkgKiBXZSB3aWxsIGFkZCB0byB0aGUgdGFyZ2V0IG9iamVjdCBpbiBNT1ZFIGNvbW1hbmQsIHNvCisJCQkgKiBjaGFuZ2UgdGhlIG9iamVjdCBmb3IgYSBDQU0gc2VhcmNoLgorCQkJICovCisJCQlpZiAoY21kID09IEJOWDJYX1ZMQU5fTUFDX01PVkUpCisJCQkJY2FtX29iaiA9IGVsZW0tPmNtZF9kYXRhLnZsYW5fbWFjLnRhcmdldF9vYmo7CisJCQllbHNlCisJCQkJY2FtX29iaiA9IG87CisKKwkJCXJjID0gYm54Mnhfdmxhbl9tYWNfZ2V0X3JlZ2lzdHJ5X2VsZW0oYnAsIGNhbV9vYmosCisJCQkJCQkJICAgICAgZWxlbSwgcmVzdG9yZSwKKwkJCQkJCQkgICAgICAmcmVnX2VsZW0pOworCQkJaWYgKHJjKQorCQkJCWdvdG8gZXJyb3JfZXhpdDsKKworCQkJV0FSTl9PTighcmVnX2VsZW0pOworCisJCQkvKiBQdXNoIGEgbmV3IGVudHJ5IGludG8gdGhlIHJlZ2lzdHJ5ICovCisJCQlpZiAoIXJlc3RvcmUgJiYKKwkJCSAgICAoKGNtZCA9PSBCTlgyWF9WTEFOX01BQ19BREQpIHx8CisJCQkgICAgKGNtZCA9PSBCTlgyWF9WTEFOX01BQ19NT1ZFKSkpCisJCQkJbGlzdF9hZGQoJnJlZ19lbGVtLT5saW5rLCAmY2FtX29iai0+aGVhZCk7CisKKwkJCS8qIENvbmZpZ3VyZSBhIHNpbmdsZSBjb21tYW5kIGluIGEgcmFtcm9kIGRhdGEgYnVmZmVyICovCisJCQlvLT5zZXRfb25lX3J1bGUoYnAsIG8sIGVsZW0sIGlkeCwKKwkJCQkJcmVnX2VsZW0tPmNhbV9vZmZzZXQpOworCisJCQkvKiBNT1ZFIGNvbW1hbmQgY29uc3VtZXMgMiBlbnRyaWVzIGluIHRoZSByYW1yb2QgZGF0YSAqLworCQkJaWYgKGNtZCA9PSBCTlgyWF9WTEFOX01BQ19NT1ZFKQorCQkJCWlkeCArPSAyOworCQkJZWxzZQorCQkJCWlkeCsrOworCQl9CisKKwkJLyoKKwkJICogIE5vIG5lZWQgZm9yIGFuIGV4cGxpY2l0IG1lbW9yeSBiYXJyaWVyIGhlcmUgYXMgbG9uZyB3ZSB3b3VsZAorCQkgKiAgbmVlZCB0byBlbnN1cmUgdGhlIG9yZGVyaW5nIG9mIHdyaXRpbmcgdG8gdGhlIFNQUSBlbGVtZW50CisJCSAqICBhbmQgdXBkYXRpbmcgb2YgdGhlIFNQUSBwcm9kdWNlciB3aGljaCBpbnZvbHZlcyBhIG1lbW9yeQorCQkgKiAgcmVhZCBhbmQgd2Ugd2lsbCBoYXZlIHRvIHB1dCBhIGZ1bGwgbWVtb3J5IGJhcnJpZXIgdGhlcmUKKwkJICogIChpbnNpZGUgYm54Mnhfc3BfcG9zdCgpKS4KKwkJICovCisKKwkJcmMgPSBibngyeF9zcF9wb3N0KGJwLCBvLT5yYW1yb2RfY21kLCByLT5jaWQsCisJCQkJICAgVTY0X0hJKHItPnJkYXRhX21hcHBpbmcpLAorCQkJCSAgIFU2NF9MTyhyLT5yZGF0YV9tYXBwaW5nKSwKKwkJCQkgICBFVEhfQ09OTkVDVElPTl9UWVBFKTsKKwkJaWYgKHJjKQorCQkJZ290byBlcnJvcl9leGl0OworCX0KKworCS8qIE5vdywgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIHRoZSByYW1yb2QgLSBjbGVhbiB1cCB0aGUgcmVnaXN0cnkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVsZW0sIGV4ZV9jaHVuaywgbGluaykgeworCQljbWQgPSBlbGVtLT5jbWRfZGF0YS52bGFuX21hYy5jbWQ7CisJCWlmICgoY21kID09IEJOWDJYX1ZMQU5fTUFDX0RFTCkgfHwKKwkJICAgIChjbWQgPT0gQk5YMlhfVkxBTl9NQUNfTU9WRSkpIHsKKwkJCXJlZ19lbGVtID0gby0+Y2hlY2tfZGVsKG8sICZlbGVtLT5jbWRfZGF0YS52bGFuX21hYy51KTsKKworCQkJV0FSTl9PTighcmVnX2VsZW0pOworCisJCQlvLT5wdXRfY2FtX29mZnNldChvLCByZWdfZWxlbS0+Y2FtX29mZnNldCk7CisJCQlsaXN0X2RlbCgmcmVnX2VsZW0tPmxpbmspOworCQkJa2ZyZWUocmVnX2VsZW0pOworCQl9CisJfQorCisJaWYgKCFkcnZfb25seSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKKworZXJyb3JfZXhpdDoKKwlyLT5jbGVhcl9wZW5kaW5nKHIpOworCisJLyogQ2xlYW51cCBhIHJlZ2lzdHJ5IGluIGNhc2Ugb2YgYSBmYWlsdXJlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbGVtLCBleGVfY2h1bmssIGxpbmspIHsKKwkJY21kID0gZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMuY21kOworCisJCWlmIChjbWQgPT0gQk5YMlhfVkxBTl9NQUNfTU9WRSkKKwkJCWNhbV9vYmogPSBlbGVtLT5jbWRfZGF0YS52bGFuX21hYy50YXJnZXRfb2JqOworCQllbHNlCisJCQljYW1fb2JqID0gbzsKKworCQkvKiBEZWxldGUgYWxsIG5ld2x5IGFkZGVkIGFib3ZlIGVudHJpZXMgKi8KKwkJaWYgKCFyZXN0b3JlICYmCisJCSAgICAoKGNtZCA9PSBCTlgyWF9WTEFOX01BQ19BREQpIHx8CisJCSAgICAoY21kID09IEJOWDJYX1ZMQU5fTUFDX01PVkUpKSkgeworCQkJcmVnX2VsZW0gPSBvLT5jaGVja19kZWwoY2FtX29iaiwKKwkJCQkJCSZlbGVtLT5jbWRfZGF0YS52bGFuX21hYy51KTsKKwkJCWlmIChyZWdfZWxlbSkgeworCQkJCWxpc3RfZGVsKCZyZWdfZWxlbS0+bGluayk7CisJCQkJa2ZyZWUocmVnX2VsZW0pOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW5saW5lIGludCBibngyeF92bGFuX21hY19wdXNoX25ld19jbWQoCisJc3RydWN0IGJueDJ4ICpicCwKKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfcmFtcm9kX3BhcmFtcyAqcCkKK3sKKwlzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICplbGVtOworCXN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8gPSBwLT52bGFuX21hY19vYmo7CisJYm9vbCByZXN0b3JlID0gdGVzdF9iaXQoUkFNUk9EX1JFU1RPUkUsICZwLT5yYW1yb2RfZmxhZ3MpOworCisJLyogQWxsb2NhdGUgdGhlIGV4ZWN1dGlvbiBxdWV1ZSBlbGVtZW50ICovCisJZWxlbSA9IGJueDJ4X2V4ZV9xdWV1ZV9hbGxvY19lbGVtKGJwKTsKKwlpZiAoIWVsZW0pCisJCXJldHVybiAtRU5PTUVNOworCisJLyogU2V0IHRoZSBjb21tYW5kICdsZW5ndGgnICovCisJc3dpdGNoIChwLT51c2VyX3JlcS5jbWQpIHsKKwljYXNlIEJOWDJYX1ZMQU5fTUFDX01PVkU6CisJCWVsZW0tPmNtZF9sZW4gPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllbGVtLT5jbWRfbGVuID0gMTsKKwl9CisKKwkvKiBGaWxsIHRoZSBvYmplY3Qgc3BlY2lmaWMgaW5mbyAqLworCW1lbWNweSgmZWxlbS0+Y21kX2RhdGEudmxhbl9tYWMsICZwLT51c2VyX3JlcSwgc2l6ZW9mKHAtPnVzZXJfcmVxKSk7CisKKwkvKiBUcnkgdG8gYWRkIGEgbmV3IGNvbW1hbmQgdG8gdGhlIHBlbmRpbmcgbGlzdCAqLworCXJldHVybiBibngyeF9leGVfcXVldWVfYWRkKGJwLCAmby0+ZXhlX3F1ZXVlLCBlbGVtLCByZXN0b3JlKTsKK30KKworLyoqCisgKiBibngyeF9jb25maWdfdmxhbl9tYWMgLSBjb25maWd1cmUgVkxBTi9NQUMvVkxBTl9NQUMgZmlsdGVyaW5nIHJ1bGVzLgorICoKKyAqIEBicDoJICBkZXZpY2UgaGFuZGxlCisgKiBAcDoKKyAqCisgKi8KK2ludCBibngyeF9jb25maWdfdmxhbl9tYWMoCisJc3RydWN0IGJueDJ4ICpicCwKKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfcmFtcm9kX3BhcmFtcyAqcCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8gPSBwLT52bGFuX21hY19vYmo7CisJdW5zaWduZWQgbG9uZyAqcmFtcm9kX2ZsYWdzID0gJnAtPnJhbXJvZF9mbGFnczsKKwlib29sIGNvbnQgPSB0ZXN0X2JpdChSQU1ST0RfQ09OVCwgcmFtcm9kX2ZsYWdzKTsKKwlzdHJ1Y3QgYm54MnhfcmF3X29iaiAqcmF3ID0gJm8tPnJhdzsKKworCS8qCisJICogQWRkIG5ldyBlbGVtZW50cyB0byB0aGUgZXhlY3V0aW9uIGxpc3QgZm9yIGNvbW1hbmRzIHRoYXQgcmVxdWlyZSBpdC4KKwkgKi8KKwlpZiAoIWNvbnQpIHsKKwkJcmMgPSBibngyeF92bGFuX21hY19wdXNoX25ld19jbWQoYnAsIHApOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyoKKwkgKiBJZiBub3RoaW5nIHdpbGwgYmUgZXhlY3V0ZWQgZnVydGhlciBpbiB0aGlzIGl0ZXJhdGlvbiB3ZSB3YW50IHRvCisJICogcmV0dXJuIFBFTkRJTkcgaWYgdGhlcmUgYXJlIHBlbmRpbmcgY29tbWFuZHMKKwkgKi8KKwlpZiAoIWJueDJ4X2V4ZV9xdWV1ZV9lbXB0eSgmby0+ZXhlX3F1ZXVlKSkKKwkJcmMgPSAxOworCisJaWYgKHRlc3RfYml0KFJBTVJPRF9EUlZfQ0xSX09OTFksIHJhbXJvZF9mbGFncykpICB7CisJCURQKEJOWDJYX01TR19TUCwgIlJBTVJPRF9EUlZfQ0xSX09OTFkgcmVxdWVzdGVkOiAiCisJCQkJICJjbGVhcmluZyBhIHBlbmRpbmcgYml0LlxuIik7CisJCXJhdy0+Y2xlYXJfcGVuZGluZyhyYXcpOworCX0KKworCS8qIEV4ZWN1dGUgY29tbWFuZHMgaWYgcmVxdWlyZWQgKi8KKwlpZiAoY29udCB8fCB0ZXN0X2JpdChSQU1ST0RfRVhFQywgcmFtcm9kX2ZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChSQU1ST0RfQ09NUF9XQUlULCByYW1yb2RfZmxhZ3MpKSB7CisJCXJjID0gYm54MnhfZXhlX3F1ZXVlX3N0ZXAoYnAsICZvLT5leGVfcXVldWUsIHJhbXJvZF9mbGFncyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyoKKwkgKiBSQU1ST0RfQ09NUF9XQUlUIGlzIGEgc3VwZXJzZXQgb2YgUkFNUk9EX0VYRUMuIElmIGl0IHdhcyBzZXQKKwkgKiB0aGVuIHVzZXIgd2FudCB0byB3YWl0IHVudGlsIHRoZSBsYXN0IGNvbW1hbmQgaXMgZG9uZS4KKwkgKi8KKwlpZiAodGVzdF9iaXQoUkFNUk9EX0NPTVBfV0FJVCwgJnAtPnJhbXJvZF9mbGFncykpIHsKKwkJLyoKKwkJICogV2FpdCBtYXhpbXVtIGZvciB0aGUgY3VycmVudCBleGVfcXVldWUgbGVuZ3RoIGl0ZXJhdGlvbnMgcGx1cworCQkgKiBvbmUgKGZvciB0aGUgY3VycmVudCBwZW5kaW5nIGNvbW1hbmQpLgorCQkgKi8KKwkJaW50IG1heF9pdGVyYXRpb25zID0gYm54MnhfZXhlX3F1ZXVlX2xlbmd0aCgmby0+ZXhlX3F1ZXVlKSArIDE7CisKKwkJd2hpbGUgKCFibngyeF9leGVfcXVldWVfZW1wdHkoJm8tPmV4ZV9xdWV1ZSkgJiYKKwkJICAgICAgIG1heF9pdGVyYXRpb25zLS0pIHsKKworCQkJLyogV2FpdCBmb3IgdGhlIGN1cnJlbnQgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCQkJcmMgPSByYXctPndhaXRfY29tcChicCwgcmF3KTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisKKwkJCS8qIE1ha2UgYSBuZXh0IHN0ZXAgKi8KKwkJCXJjID0gYm54MnhfZXhlX3F1ZXVlX3N0ZXAoYnAsICZvLT5leGVfcXVldWUsCisJCQkJCQkgIHJhbXJvZF9mbGFncyk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCXJldHVybiByYzsKK30KKworCisKKy8qKgorICogYm54Mnhfdmxhbl9tYWNfZGVsX2FsbCAtIGRlbGV0ZSBlbGVtZW50cyB3aXRoIGdpdmVuIHZsYW5fbWFjX2ZsYWdzIHNwZWMKKyAqCisgKiBAYnA6CQkJZGV2aWNlIGhhbmRsZQorICogQG86CisgKiBAdmxhbl9tYWNfZmxhZ3M6CisgKiBAcmFtcm9kX2ZsYWdzOglleGVjdXRpb24gZmxhZ3MgdG8gYmUgdXNlZCBmb3IgdGhpcyBkZWxldGlvbgorICoKKyAqIGlmIHRoZSBsYXN0IG9wZXJhdGlvbiBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGhlcmUgYXJlIG5vCisgKiBtb3JlZWxlbWVudHMgbGVmdCwgcG9zaXRpdmUgdmFsdWUgaWYgdGhlIGxhc3Qgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQKKyAqIHN1Y2Nlc3NmdWxseSBhbmQgdGhlcmUgYXJlIG1vcmUgcHJldmlvdXNseSBjb25maWd1cmVkIGVsZW1lbnRzLCBuZWdhdGl2ZQorICogdmFsdWUgaXMgY3VycmVudCBvcGVyYXRpb24gaGFzIGZhaWxlZC4KKyAqLworc3RhdGljIGludCBibngyeF92bGFuX21hY19kZWxfYWxsKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLAorCQkJCSAgdW5zaWduZWQgbG9uZyAqdmxhbl9tYWNfZmxhZ3MsCisJCQkJICB1bnNpZ25lZCBsb25nICpyYW1yb2RfZmxhZ3MpCit7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JlZ2lzdHJ5X2VsZW0gKnBvcyA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfcmFtcm9kX3BhcmFtcyBwOworCXN0cnVjdCBibngyeF9leGVfcXVldWVfb2JqICpleGVxID0gJm8tPmV4ZV9xdWV1ZTsKKwlzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICpleGVxX3BvcywgKmV4ZXFfcG9zX247CisKKwkvKiBDbGVhciBwZW5kaW5nIGNvbW1hbmRzIGZpcnN0ICovCisKKwlzcGluX2xvY2tfYmgoJmV4ZXEtPmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV4ZXFfcG9zLCBleGVxX3Bvc19uLCAmZXhlcS0+ZXhlX3F1ZXVlLCBsaW5rKSB7CisJCWlmIChleGVxX3Bvcy0+Y21kX2RhdGEudmxhbl9tYWMudmxhbl9tYWNfZmxhZ3MgPT0KKwkJICAgICp2bGFuX21hY19mbGFncykKKwkJCWxpc3RfZGVsKCZleGVxX3Bvcy0+bGluayk7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJmV4ZXEtPmxvY2spOworCisJLyogUHJlcGFyZSBhIGNvbW1hbmQgcmVxdWVzdCAqLworCW1lbXNldCgmcCwgMCwgc2l6ZW9mKHApKTsKKwlwLnZsYW5fbWFjX29iaiA9IG87CisJcC5yYW1yb2RfZmxhZ3MgPSAqcmFtcm9kX2ZsYWdzOworCXAudXNlcl9yZXEuY21kID0gQk5YMlhfVkxBTl9NQUNfREVMOworCisJLyoKKwkgKiBBZGQgYWxsIGJ1dCB0aGUgbGFzdCBWTEFOLU1BQyB0byB0aGUgZXhlY3V0aW9uIHF1ZXVlIHdpdGhvdXQgYWN0dWFsbHkKKwkgKiBleGVjdXRpb24gYW55dGhpbmcuCisJICovCisJX19jbGVhcl9iaXQoUkFNUk9EX0NPTVBfV0FJVCwgJnAucmFtcm9kX2ZsYWdzKTsKKwlfX2NsZWFyX2JpdChSQU1ST0RfRVhFQywgJnAucmFtcm9kX2ZsYWdzKTsKKwlfX2NsZWFyX2JpdChSQU1ST0RfQ09OVCwgJnAucmFtcm9kX2ZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmby0+aGVhZCwgbGluaykgeworCQlpZiAocG9zLT52bGFuX21hY19mbGFncyA9PSAqdmxhbl9tYWNfZmxhZ3MpIHsKKwkJCXAudXNlcl9yZXEudmxhbl9tYWNfZmxhZ3MgPSBwb3MtPnZsYW5fbWFjX2ZsYWdzOworCQkJbWVtY3B5KCZwLnVzZXJfcmVxLnUsICZwb3MtPnUsIHNpemVvZihwb3MtPnUpKTsKKwkJCXJjID0gYm54MnhfY29uZmlnX3ZsYW5fbWFjKGJwLCAmcCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gYWRkIGEgbmV3IERFTCBjb21tYW5kXG4iKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwl9CisKKwlwLnJhbXJvZF9mbGFncyA9ICpyYW1yb2RfZmxhZ3M7CisJX19zZXRfYml0KFJBTVJPRF9DT05ULCAmcC5yYW1yb2RfZmxhZ3MpOworCisJcmV0dXJuIGJueDJ4X2NvbmZpZ192bGFuX21hYyhicCwgJnApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfaW5pdF9yYXdfb2JqKHN0cnVjdCBibngyeF9yYXdfb2JqICpyYXcsIHU4IGNsX2lkLAorCXUzMiBjaWQsIHU4IGZ1bmNfaWQsIHZvaWQgKnJkYXRhLCBkbWFfYWRkcl90IHJkYXRhX21hcHBpbmcsIGludCBzdGF0ZSwKKwl1bnNpZ25lZCBsb25nICpwc3RhdGUsIGJueDJ4X29ial90eXBlIHR5cGUpCit7CisJcmF3LT5mdW5jX2lkID0gZnVuY19pZDsKKwlyYXctPmNpZCA9IGNpZDsKKwlyYXctPmNsX2lkID0gY2xfaWQ7CisJcmF3LT5yZGF0YSA9IHJkYXRhOworCXJhdy0+cmRhdGFfbWFwcGluZyA9IHJkYXRhX21hcHBpbmc7CisJcmF3LT5zdGF0ZSA9IHN0YXRlOworCXJhdy0+cHN0YXRlID0gcHN0YXRlOworCXJhdy0+b2JqX3R5cGUgPSB0eXBlOworCXJhdy0+Y2hlY2tfcGVuZGluZyA9IGJueDJ4X3Jhd19jaGVja19wZW5kaW5nOworCXJhdy0+Y2xlYXJfcGVuZGluZyA9IGJueDJ4X3Jhd19jbGVhcl9wZW5kaW5nOworCXJhdy0+c2V0X3BlbmRpbmcgPSBibngyeF9yYXdfc2V0X3BlbmRpbmc7CisJcmF3LT53YWl0X2NvbXAgPSBibngyeF9yYXdfd2FpdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2luaXRfdmxhbl9tYWNfY29tbW9uKHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8sCisJdTggY2xfaWQsIHUzMiBjaWQsIHU4IGZ1bmNfaWQsIHZvaWQgKnJkYXRhLCBkbWFfYWRkcl90IHJkYXRhX21hcHBpbmcsCisJaW50IHN0YXRlLCB1bnNpZ25lZCBsb25nICpwc3RhdGUsIGJueDJ4X29ial90eXBlIHR5cGUsCisJc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqbWFjc19wb29sLAorCXN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmogKnZsYW5zX3Bvb2wpCit7CisJSU5JVF9MSVNUX0hFQUQoJm8tPmhlYWQpOworCisJby0+bWFjc19wb29sID0gbWFjc19wb29sOworCW8tPnZsYW5zX3Bvb2wgPSB2bGFuc19wb29sOworCisJby0+ZGVsZXRlX2FsbCA9IGJueDJ4X3ZsYW5fbWFjX2RlbF9hbGw7CisJby0+cmVzdG9yZSA9IGJueDJ4X3ZsYW5fbWFjX3Jlc3RvcmU7CisJby0+Y29tcGxldGUgPSBibngyeF9jb21wbGV0ZV92bGFuX21hYzsKKwlvLT53YWl0ID0gYm54Mnhfd2FpdF92bGFuX21hYzsKKworCWJueDJ4X2luaXRfcmF3X29iaigmby0+cmF3LCBjbF9pZCwgY2lkLCBmdW5jX2lkLCByZGF0YSwgcmRhdGFfbWFwcGluZywKKwkJCSAgIHN0YXRlLCBwc3RhdGUsIHR5cGUpOworfQorCisKK3ZvaWQgYm54MnhfaW5pdF9tYWNfb2JqKHN0cnVjdCBibngyeCAqYnAsCisJCQlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICptYWNfb2JqLAorCQkJdTggY2xfaWQsIHUzMiBjaWQsIHU4IGZ1bmNfaWQsIHZvaWQgKnJkYXRhLAorCQkJZG1hX2FkZHJfdCByZGF0YV9tYXBwaW5nLCBpbnQgc3RhdGUsCisJCQl1bnNpZ25lZCBsb25nICpwc3RhdGUsIGJueDJ4X29ial90eXBlIHR5cGUsCisJCQlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICptYWNzX3Bvb2wpCit7CisJdW5pb24gYm54MnhfcWFibGVfb2JqICpxYWJsZV9vYmogPSAodW5pb24gYm54MnhfcWFibGVfb2JqICopbWFjX29iajsKKworCWJueDJ4X2luaXRfdmxhbl9tYWNfY29tbW9uKG1hY19vYmosIGNsX2lkLCBjaWQsIGZ1bmNfaWQsIHJkYXRhLAorCQkJCSAgIHJkYXRhX21hcHBpbmcsIHN0YXRlLCBwc3RhdGUsIHR5cGUsCisJCQkJICAgbWFjc19wb29sLCBOVUxMKTsKKworCS8qIENBTSBjcmVkaXQgcG9vbCBoYW5kbGluZyAqLworCW1hY19vYmotPmdldF9jcmVkaXQgPSBibngyeF9nZXRfY3JlZGl0X21hYzsKKwltYWNfb2JqLT5wdXRfY3JlZGl0ID0gYm54MnhfcHV0X2NyZWRpdF9tYWM7CisJbWFjX29iai0+Z2V0X2NhbV9vZmZzZXQgPSBibngyeF9nZXRfY2FtX29mZnNldF9tYWM7CisJbWFjX29iai0+cHV0X2NhbV9vZmZzZXQgPSBibngyeF9wdXRfY2FtX29mZnNldF9tYWM7CisKKwlpZiAoQ0hJUF9JU19FMXgoYnApKSB7CisJCW1hY19vYmotPnNldF9vbmVfcnVsZSAgICAgID0gYm54Mnhfc2V0X29uZV9tYWNfZTF4OworCQltYWNfb2JqLT5jaGVja19kZWwgICAgICAgICA9IGJueDJ4X2NoZWNrX21hY19kZWw7CisJCW1hY19vYmotPmNoZWNrX2FkZCAgICAgICAgID0gYm54MnhfY2hlY2tfbWFjX2FkZDsKKwkJbWFjX29iai0+Y2hlY2tfbW92ZSAgICAgICAgPSBibngyeF9jaGVja19tb3ZlX2Fsd2F5c19lcnI7CisJCW1hY19vYmotPnJhbXJvZF9jbWQgICAgICAgID0gUkFNUk9EX0NNRF9JRF9FVEhfU0VUX01BQzsKKworCQkvKiBFeGUgUXVldWUgKi8KKwkJYm54MnhfZXhlX3F1ZXVlX2luaXQoYnAsCisJCQkJICAgICAmbWFjX29iai0+ZXhlX3F1ZXVlLCAxLCBxYWJsZV9vYmosCisJCQkJICAgICBibngyeF92YWxpZGF0ZV92bGFuX21hYywKKwkJCQkgICAgIGJueDJ4X29wdGltaXplX3ZsYW5fbWFjLAorCQkJCSAgICAgYm54MnhfZXhlY3V0ZV92bGFuX21hYywKKwkJCQkgICAgIGJueDJ4X2V4ZXFfZ2V0X21hYyk7CisJfSBlbHNlIHsKKwkJbWFjX29iai0+c2V0X29uZV9ydWxlICAgICAgPSBibngyeF9zZXRfb25lX21hY19lMjsKKwkJbWFjX29iai0+Y2hlY2tfZGVsICAgICAgICAgPSBibngyeF9jaGVja19tYWNfZGVsOworCQltYWNfb2JqLT5jaGVja19hZGQgICAgICAgICA9IGJueDJ4X2NoZWNrX21hY19hZGQ7CisJCW1hY19vYmotPmNoZWNrX21vdmUgICAgICAgID0gYm54MnhfY2hlY2tfbW92ZTsKKwkJbWFjX29iai0+cmFtcm9kX2NtZCAgICAgICAgPQorCQkJUkFNUk9EX0NNRF9JRF9FVEhfQ0xBU1NJRklDQVRJT05fUlVMRVM7CisKKwkJLyogRXhlIFF1ZXVlICovCisJCWJueDJ4X2V4ZV9xdWV1ZV9pbml0KGJwLAorCQkJCSAgICAgJm1hY19vYmotPmV4ZV9xdWV1ZSwgQ0xBU1NJRllfUlVMRVNfQ09VTlQsCisJCQkJICAgICBxYWJsZV9vYmosIGJueDJ4X3ZhbGlkYXRlX3ZsYW5fbWFjLAorCQkJCSAgICAgYm54Mnhfb3B0aW1pemVfdmxhbl9tYWMsCisJCQkJICAgICBibngyeF9leGVjdXRlX3ZsYW5fbWFjLAorCQkJCSAgICAgYm54MnhfZXhlcV9nZXRfbWFjKTsKKwl9Cit9CisKK3ZvaWQgYm54MnhfaW5pdF92bGFuX29iaihzdHJ1Y3QgYm54MnggKmJwLAorCQkJIHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKnZsYW5fb2JqLAorCQkJIHU4IGNsX2lkLCB1MzIgY2lkLCB1OCBmdW5jX2lkLCB2b2lkICpyZGF0YSwKKwkJCSBkbWFfYWRkcl90IHJkYXRhX21hcHBpbmcsIGludCBzdGF0ZSwKKwkJCSB1bnNpZ25lZCBsb25nICpwc3RhdGUsIGJueDJ4X29ial90eXBlIHR5cGUsCisJCQkgc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqdmxhbnNfcG9vbCkKK3sKKwl1bmlvbiBibngyeF9xYWJsZV9vYmogKnFhYmxlX29iaiA9ICh1bmlvbiBibngyeF9xYWJsZV9vYmogKil2bGFuX29iajsKKworCWJueDJ4X2luaXRfdmxhbl9tYWNfY29tbW9uKHZsYW5fb2JqLCBjbF9pZCwgY2lkLCBmdW5jX2lkLCByZGF0YSwKKwkJCQkgICByZGF0YV9tYXBwaW5nLCBzdGF0ZSwgcHN0YXRlLCB0eXBlLCBOVUxMLAorCQkJCSAgIHZsYW5zX3Bvb2wpOworCisJdmxhbl9vYmotPmdldF9jcmVkaXQgPSBibngyeF9nZXRfY3JlZGl0X3ZsYW47CisJdmxhbl9vYmotPnB1dF9jcmVkaXQgPSBibngyeF9wdXRfY3JlZGl0X3ZsYW47CisJdmxhbl9vYmotPmdldF9jYW1fb2Zmc2V0ID0gYm54MnhfZ2V0X2NhbV9vZmZzZXRfdmxhbjsKKwl2bGFuX29iai0+cHV0X2NhbV9vZmZzZXQgPSBibngyeF9wdXRfY2FtX29mZnNldF92bGFuOworCisJaWYgKENISVBfSVNfRTF4KGJwKSkgeworCQlCTlgyWF9FUlIoIkRvIG5vdCBzdXBwb3J0IGNoaXBzIG90aGVycyB0aGFuIEUyIGFuZCBuZXdlclxuIik7CisJCUJVRygpOworCX0gZWxzZSB7CisJCXZsYW5fb2JqLT5zZXRfb25lX3J1bGUgICAgICA9IGJueDJ4X3NldF9vbmVfdmxhbl9lMjsKKwkJdmxhbl9vYmotPmNoZWNrX2RlbCAgICAgICAgID0gYm54MnhfY2hlY2tfdmxhbl9kZWw7CisJCXZsYW5fb2JqLT5jaGVja19hZGQgICAgICAgICA9IGJueDJ4X2NoZWNrX3ZsYW5fYWRkOworCQl2bGFuX29iai0+Y2hlY2tfbW92ZSAgICAgICAgPSBibngyeF9jaGVja19tb3ZlOworCQl2bGFuX29iai0+cmFtcm9kX2NtZCAgICAgICAgPQorCQkJUkFNUk9EX0NNRF9JRF9FVEhfQ0xBU1NJRklDQVRJT05fUlVMRVM7CisKKwkJLyogRXhlIFF1ZXVlICovCisJCWJueDJ4X2V4ZV9xdWV1ZV9pbml0KGJwLAorCQkJCSAgICAgJnZsYW5fb2JqLT5leGVfcXVldWUsIENMQVNTSUZZX1JVTEVTX0NPVU5ULAorCQkJCSAgICAgcWFibGVfb2JqLCBibngyeF92YWxpZGF0ZV92bGFuX21hYywKKwkJCQkgICAgIGJueDJ4X29wdGltaXplX3ZsYW5fbWFjLAorCQkJCSAgICAgYm54MnhfZXhlY3V0ZV92bGFuX21hYywKKwkJCQkgICAgIGJueDJ4X2V4ZXFfZ2V0X3ZsYW4pOworCX0KK30KKwordm9pZCBibngyeF9pbml0X3ZsYW5fbWFjX29iaihzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgICBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICp2bGFuX21hY19vYmosCisJCQkgICAgIHU4IGNsX2lkLCB1MzIgY2lkLCB1OCBmdW5jX2lkLCB2b2lkICpyZGF0YSwKKwkJCSAgICAgZG1hX2FkZHJfdCByZGF0YV9tYXBwaW5nLCBpbnQgc3RhdGUsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBzdGF0ZSwgYm54Mnhfb2JqX3R5cGUgdHlwZSwKKwkJCSAgICAgc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqbWFjc19wb29sLAorCQkJICAgICBzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICp2bGFuc19wb29sKQoreworCXVuaW9uIGJueDJ4X3FhYmxlX29iaiAqcWFibGVfb2JqID0KKwkJKHVuaW9uIGJueDJ4X3FhYmxlX29iaiAqKXZsYW5fbWFjX29iajsKKworCWJueDJ4X2luaXRfdmxhbl9tYWNfY29tbW9uKHZsYW5fbWFjX29iaiwgY2xfaWQsIGNpZCwgZnVuY19pZCwgcmRhdGEsCisJCQkJICAgcmRhdGFfbWFwcGluZywgc3RhdGUsIHBzdGF0ZSwgdHlwZSwKKwkJCQkgICBtYWNzX3Bvb2wsIHZsYW5zX3Bvb2wpOworCisJLyogQ0FNIHBvb2wgaGFuZGxpbmcgKi8KKwl2bGFuX21hY19vYmotPmdldF9jcmVkaXQgPSBibngyeF9nZXRfY3JlZGl0X3ZsYW5fbWFjOworCXZsYW5fbWFjX29iai0+cHV0X2NyZWRpdCA9IGJueDJ4X3B1dF9jcmVkaXRfdmxhbl9tYWM7CisJLyoKKwkgKiBDQU0gb2Zmc2V0IGlzIHJlbGV2YW50IGZvciA1NzcxMCBhbmQgNTc3MTEgY2hpcHMgb25seSB3aGljaCBoYXZlIGEKKwkgKiBzaW5nbGUgQ0FNIGZvciBib3RoIE1BQ3MgYW5kIFZMQU4tTUFDIHBhaXJzLiBTbyB0aGUgb2Zmc2V0CisJICogd2lsbCBiZSB0YWtlbiBmcm9tIE1BQ3MnIHBvb2wgb2JqZWN0IG9ubHkuCisJICovCisJdmxhbl9tYWNfb2JqLT5nZXRfY2FtX29mZnNldCA9IGJueDJ4X2dldF9jYW1fb2Zmc2V0X21hYzsKKwl2bGFuX21hY19vYmotPnB1dF9jYW1fb2Zmc2V0ID0gYm54MnhfcHV0X2NhbV9vZmZzZXRfbWFjOworCisJaWYgKENISVBfSVNfRTEoYnApKSB7CisJCUJOWDJYX0VSUigiRG8gbm90IHN1cHBvcnQgY2hpcHMgb3RoZXJzIHRoYW4gRTJcbiIpOworCQlCVUcoKTsKKwl9IGVsc2UgaWYgKENISVBfSVNfRTFIKGJwKSkgeworCQl2bGFuX21hY19vYmotPnNldF9vbmVfcnVsZSAgICAgID0gYm54Mnhfc2V0X29uZV92bGFuX21hY19lMWg7CisJCXZsYW5fbWFjX29iai0+Y2hlY2tfZGVsICAgICAgICAgPSBibngyeF9jaGVja192bGFuX21hY19kZWw7CisJCXZsYW5fbWFjX29iai0+Y2hlY2tfYWRkICAgICAgICAgPSBibngyeF9jaGVja192bGFuX21hY19hZGQ7CisJCXZsYW5fbWFjX29iai0+Y2hlY2tfbW92ZSAgICAgICAgPSBibngyeF9jaGVja19tb3ZlX2Fsd2F5c19lcnI7CisJCXZsYW5fbWFjX29iai0+cmFtcm9kX2NtZCAgICAgICAgPSBSQU1ST0RfQ01EX0lEX0VUSF9TRVRfTUFDOworCisJCS8qIEV4ZSBRdWV1ZSAqLworCQlibngyeF9leGVfcXVldWVfaW5pdChicCwKKwkJCQkgICAgICZ2bGFuX21hY19vYmotPmV4ZV9xdWV1ZSwgMSwgcWFibGVfb2JqLAorCQkJCSAgICAgYm54MnhfdmFsaWRhdGVfdmxhbl9tYWMsCisJCQkJICAgICBibngyeF9vcHRpbWl6ZV92bGFuX21hYywKKwkJCQkgICAgIGJueDJ4X2V4ZWN1dGVfdmxhbl9tYWMsCisJCQkJICAgICBibngyeF9leGVxX2dldF92bGFuX21hYyk7CisJfSBlbHNlIHsKKwkJdmxhbl9tYWNfb2JqLT5zZXRfb25lX3J1bGUgICAgICA9IGJueDJ4X3NldF9vbmVfdmxhbl9tYWNfZTI7CisJCXZsYW5fbWFjX29iai0+Y2hlY2tfZGVsICAgICAgICAgPSBibngyeF9jaGVja192bGFuX21hY19kZWw7CisJCXZsYW5fbWFjX29iai0+Y2hlY2tfYWRkICAgICAgICAgPSBibngyeF9jaGVja192bGFuX21hY19hZGQ7CisJCXZsYW5fbWFjX29iai0+Y2hlY2tfbW92ZSAgICAgICAgPSBibngyeF9jaGVja19tb3ZlOworCQl2bGFuX21hY19vYmotPnJhbXJvZF9jbWQgICAgICAgID0KKwkJCVJBTVJPRF9DTURfSURfRVRIX0NMQVNTSUZJQ0FUSU9OX1JVTEVTOworCisJCS8qIEV4ZSBRdWV1ZSAqLworCQlibngyeF9leGVfcXVldWVfaW5pdChicCwKKwkJCQkgICAgICZ2bGFuX21hY19vYmotPmV4ZV9xdWV1ZSwKKwkJCQkgICAgIENMQVNTSUZZX1JVTEVTX0NPVU5ULAorCQkJCSAgICAgcWFibGVfb2JqLCBibngyeF92YWxpZGF0ZV92bGFuX21hYywKKwkJCQkgICAgIGJueDJ4X29wdGltaXplX3ZsYW5fbWFjLAorCQkJCSAgICAgYm54MnhfZXhlY3V0ZV92bGFuX21hYywKKwkJCQkgICAgIGJueDJ4X2V4ZXFfZ2V0X3ZsYW5fbWFjKTsKKwl9CisKK30KKworLyogUlhfTU9ERSB2ZXJiczogRFJPUF9BTEwvQUNDRVBUX0FMTC9BQ0NFUFRfQUxMX01VTFRJL0FDQ0VQVF9BTExfVkxBTi9OT1JNQUwgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N0b3JtX21lbXNldF9tYWNfZmlsdGVycyhzdHJ1Y3QgYm54MnggKmJwLAorCQkJc3RydWN0IHRzdG9ybV9ldGhfbWFjX2ZpbHRlcl9jb25maWcgKm1hY19maWx0ZXJzLAorCQkJdTE2IHBmX2lkKQoreworCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCB0c3Rvcm1fZXRoX21hY19maWx0ZXJfY29uZmlnKTsKKworCXUzMiBhZGRyID0gQkFSX1RTVFJPUk1fSU5UTUVNICsKKwkJCVRTVE9STV9NQUNfRklMVEVSX0NPTkZJR19PRkZTRVQocGZfaWQpOworCisJX19zdG9ybV9tZW1zZXRfc3RydWN0KGJwLCBhZGRyLCBzaXplLCAodTMyICopbWFjX2ZpbHRlcnMpOworfQorCitzdGF0aWMgaW50IGJueDJ4X3NldF9yeF9tb2RlX2UxeChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSBzdHJ1Y3QgYm54MnhfcnhfbW9kZV9yYW1yb2RfcGFyYW1zICpwKQoreworCS8qIHVwZGF0ZSB0aGUgYnAgTUFDIGZpbHRlciBzdHJ1Y3R1cmUgICovCisJdTMyIG1hc2sgPSAoMSA8PCBwLT5jbF9pZCk7CisKKwlzdHJ1Y3QgdHN0b3JtX2V0aF9tYWNfZmlsdGVyX2NvbmZpZyAqbWFjX2ZpbHRlcnMgPQorCQkoc3RydWN0IHRzdG9ybV9ldGhfbWFjX2ZpbHRlcl9jb25maWcgKilwLT5yZGF0YTsKKworCS8qIGluaXRpYWwgc2VldGluZyBpcyBkcm9wLWFsbCAqLworCXU4IGRyb3BfYWxsX3VjYXN0ID0gMSwgZHJvcF9hbGxfbWNhc3QgPSAxOworCXU4IGFjY3BfYWxsX3VjYXN0ID0gMCwgYWNjcF9hbGxfYmNhc3QgPSAwLCBhY2NwX2FsbF9tY2FzdCA9IDA7CisJdTggdW5tYXRjaGVkX3VuaWNhc3QgPSAwOworCisgICAgLyogSW4gZTF4IHRoZXJlIHdlIG9ubHkgdGFrZSBpbnRvIGFjY291bnQgcnggYWNjZW90IGZsYWcgc2luY2UgdHggc3dpdGNoaW5nCisgICAgICogaXNuJ3QgZW5hYmxlZC4gKi8KKwlpZiAodGVzdF9iaXQoQk5YMlhfQUNDRVBUX1VOSUNBU1QsICZwLT5yeF9hY2NlcHRfZmxhZ3MpKQorCQkvKiBhY2NlcHQgbWF0Y2hlZCB1Y2FzdCAqLworCQlkcm9wX2FsbF91Y2FzdCA9IDA7CisKKwlpZiAodGVzdF9iaXQoQk5YMlhfQUNDRVBUX01VTFRJQ0FTVCwgJnAtPnJ4X2FjY2VwdF9mbGFncykpCisJCS8qIGFjY2VwdCBtYXRjaGVkIG1jYXN0ICovCisJCWRyb3BfYWxsX21jYXN0ID0gMDsKKworCWlmICh0ZXN0X2JpdChCTlgyWF9BQ0NFUFRfQUxMX1VOSUNBU1QsICZwLT5yeF9hY2NlcHRfZmxhZ3MpKSB7CisJCS8qIGFjY2VwdCBhbGwgbWNhc3QgKi8KKwkJZHJvcF9hbGxfdWNhc3QgPSAwOworCQlhY2NwX2FsbF91Y2FzdCA9IDE7CisJfQorCWlmICh0ZXN0X2JpdChCTlgyWF9BQ0NFUFRfQUxMX01VTFRJQ0FTVCwgJnAtPnJ4X2FjY2VwdF9mbGFncykpIHsKKwkJLyogYWNjZXB0IGFsbCBtY2FzdCAqLworCQlkcm9wX2FsbF9tY2FzdCA9IDA7CisJCWFjY3BfYWxsX21jYXN0ID0gMTsKKwl9CisJaWYgKHRlc3RfYml0KEJOWDJYX0FDQ0VQVF9CUk9BRENBU1QsICZwLT5yeF9hY2NlcHRfZmxhZ3MpKQorCQkvKiBhY2NlcHQgKGFsbCkgYmNhc3QgKi8KKwkJYWNjcF9hbGxfYmNhc3QgPSAxOworCWlmICh0ZXN0X2JpdChCTlgyWF9BQ0NFUFRfVU5NQVRDSEVELCAmcC0+cnhfYWNjZXB0X2ZsYWdzKSkKKwkJLyogYWNjZXB0IHVubWF0Y2hlZCB1bmljYXN0cyAqLworCQl1bm1hdGNoZWRfdW5pY2FzdCA9IDE7CisKKwltYWNfZmlsdGVycy0+dWNhc3RfZHJvcF9hbGwgPSBkcm9wX2FsbF91Y2FzdCA/CisJCW1hY19maWx0ZXJzLT51Y2FzdF9kcm9wX2FsbCB8IG1hc2sgOgorCQltYWNfZmlsdGVycy0+dWNhc3RfZHJvcF9hbGwgJiB+bWFzazsKKworCW1hY19maWx0ZXJzLT5tY2FzdF9kcm9wX2FsbCA9IGRyb3BfYWxsX21jYXN0ID8KKwkJbWFjX2ZpbHRlcnMtPm1jYXN0X2Ryb3BfYWxsIHwgbWFzayA6CisJCW1hY19maWx0ZXJzLT5tY2FzdF9kcm9wX2FsbCAmIH5tYXNrOworCisJbWFjX2ZpbHRlcnMtPnVjYXN0X2FjY2VwdF9hbGwgPSBhY2NwX2FsbF91Y2FzdCA/CisJCW1hY19maWx0ZXJzLT51Y2FzdF9hY2NlcHRfYWxsIHwgbWFzayA6CisJCW1hY19maWx0ZXJzLT51Y2FzdF9hY2NlcHRfYWxsICYgfm1hc2s7CisKKwltYWNfZmlsdGVycy0+bWNhc3RfYWNjZXB0X2FsbCA9IGFjY3BfYWxsX21jYXN0ID8KKwkJbWFjX2ZpbHRlcnMtPm1jYXN0X2FjY2VwdF9hbGwgfCBtYXNrIDoKKwkJbWFjX2ZpbHRlcnMtPm1jYXN0X2FjY2VwdF9hbGwgJiB+bWFzazsKKworCW1hY19maWx0ZXJzLT5iY2FzdF9hY2NlcHRfYWxsID0gYWNjcF9hbGxfYmNhc3QgPworCQltYWNfZmlsdGVycy0+YmNhc3RfYWNjZXB0X2FsbCB8IG1hc2sgOgorCQltYWNfZmlsdGVycy0+YmNhc3RfYWNjZXB0X2FsbCAmIH5tYXNrOworCisJbWFjX2ZpbHRlcnMtPnVubWF0Y2hlZF91bmljYXN0ID0gdW5tYXRjaGVkX3VuaWNhc3QgPworCQltYWNfZmlsdGVycy0+dW5tYXRjaGVkX3VuaWNhc3QgfCBtYXNrIDoKKwkJbWFjX2ZpbHRlcnMtPnVubWF0Y2hlZF91bmljYXN0ICYgfm1hc2s7CisKKwlEUChCTlgyWF9NU0dfU1AsICJkcm9wX3VjYXN0IDB4JXhcbmRyb3BfbWNhc3QgMHgleFxuIGFjY3BfdWNhc3QgMHgleFxuIgorCQkJICJhY2NwX21jYXN0IDB4JXhcbmFjY3BfYmNhc3QgMHgleFxuIiwKKwkJCSBtYWNfZmlsdGVycy0+dWNhc3RfZHJvcF9hbGwsCisJCQkgbWFjX2ZpbHRlcnMtPm1jYXN0X2Ryb3BfYWxsLAorCQkJIG1hY19maWx0ZXJzLT51Y2FzdF9hY2NlcHRfYWxsLAorCQkJIG1hY19maWx0ZXJzLT5tY2FzdF9hY2NlcHRfYWxsLAorCQkJIG1hY19maWx0ZXJzLT5iY2FzdF9hY2NlcHRfYWxsKTsKKworCS8qIHdyaXRlIHRoZSBNQUMgZmlsdGVyIHN0cnVjdHVyZSovCisJX19zdG9ybV9tZW1zZXRfbWFjX2ZpbHRlcnMoYnAsIG1hY19maWx0ZXJzLCBwLT5mdW5jX2lkKTsKKworCS8qIFRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkICovCisJY2xlYXJfYml0KHAtPnN0YXRlLCBwLT5wc3RhdGUpOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2V0dXAgcmFtcm9kIGRhdGEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9yeF9tb2RlX3NldF9yZGF0YV9oZHJfZTIodTMyIGNpZCwKKwkJCQlzdHJ1Y3QgZXRoX2NsYXNzaWZ5X2hlYWRlciAqaGRyLAorCQkJCXU4IHJ1bGVfY250KQoreworCWhkci0+ZWNobyA9IGNpZDsKKwloZHItPnJ1bGVfY250ID0gcnVsZV9jbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9yeF9tb2RlX3NldF9jbWRfc3RhdGVfZTIoc3RydWN0IGJueDJ4ICpicCwKKwkJCQl1bnNpZ25lZCBsb25nIGFjY2VwdF9mbGFncywKKwkJCQlzdHJ1Y3QgZXRoX2ZpbHRlcl9ydWxlc19jbWQgKmNtZCwKKwkJCQlib29sIGNsZWFyX2FjY2VwdF9hbGwpCit7CisJdTE2IHN0YXRlOworCisJLyogc3RhcnQgd2l0aCAnZHJvcC1hbGwnICovCisJc3RhdGUgPSBFVEhfRklMVEVSX1JVTEVTX0NNRF9VQ0FTVF9EUk9QX0FMTCB8CisJCUVUSF9GSUxURVJfUlVMRVNfQ01EX01DQVNUX0RST1BfQUxMOworCisJaWYgKGFjY2VwdF9mbGFncykgeworCQlpZiAodGVzdF9iaXQoQk5YMlhfQUNDRVBUX1VOSUNBU1QsICZhY2NlcHRfZmxhZ3MpKQorCQkJc3RhdGUgJj0gfkVUSF9GSUxURVJfUlVMRVNfQ01EX1VDQVNUX0RST1BfQUxMOworCisJCWlmICh0ZXN0X2JpdChCTlgyWF9BQ0NFUFRfTVVMVElDQVNULCAmYWNjZXB0X2ZsYWdzKSkKKwkJCXN0YXRlICY9IH5FVEhfRklMVEVSX1JVTEVTX0NNRF9NQ0FTVF9EUk9QX0FMTDsKKworCQlpZiAodGVzdF9iaXQoQk5YMlhfQUNDRVBUX0FMTF9VTklDQVNULCAmYWNjZXB0X2ZsYWdzKSkgeworCQkJc3RhdGUgJj0gfkVUSF9GSUxURVJfUlVMRVNfQ01EX1VDQVNUX0RST1BfQUxMOworCQkJc3RhdGUgfD0gRVRIX0ZJTFRFUl9SVUxFU19DTURfVUNBU1RfQUNDRVBUX0FMTDsKKwkJfQorCisJCWlmICh0ZXN0X2JpdChCTlgyWF9BQ0NFUFRfQUxMX01VTFRJQ0FTVCwgJmFjY2VwdF9mbGFncykpIHsKKwkJCXN0YXRlIHw9IEVUSF9GSUxURVJfUlVMRVNfQ01EX01DQVNUX0FDQ0VQVF9BTEw7CisJCQlzdGF0ZSAmPSB+RVRIX0ZJTFRFUl9SVUxFU19DTURfTUNBU1RfRFJPUF9BTEw7CisJCX0KKwkJaWYgKHRlc3RfYml0KEJOWDJYX0FDQ0VQVF9CUk9BRENBU1QsICZhY2NlcHRfZmxhZ3MpKQorCQkJc3RhdGUgfD0gRVRIX0ZJTFRFUl9SVUxFU19DTURfQkNBU1RfQUNDRVBUX0FMTDsKKworCQlpZiAodGVzdF9iaXQoQk5YMlhfQUNDRVBUX1VOTUFUQ0hFRCwgJmFjY2VwdF9mbGFncykpIHsKKwkJCXN0YXRlICY9IH5FVEhfRklMVEVSX1JVTEVTX0NNRF9VQ0FTVF9EUk9QX0FMTDsKKwkJCXN0YXRlIHw9IEVUSF9GSUxURVJfUlVMRVNfQ01EX1VDQVNUX0FDQ0VQVF9VTk1BVENIRUQ7CisJCX0KKwkJaWYgKHRlc3RfYml0KEJOWDJYX0FDQ0VQVF9BTllfVkxBTiwgJmFjY2VwdF9mbGFncykpCisJCQlzdGF0ZSB8PSBFVEhfRklMVEVSX1JVTEVTX0NNRF9BQ0NFUFRfQU5ZX1ZMQU47CisJfQorCisJLyogQ2xlYXIgQUNDRVBUX0FMTF9YWFggZmxhZ3MgZm9yIEZDb0UgTDIgUXVldWUgKi8KKwlpZiAoY2xlYXJfYWNjZXB0X2FsbCkgeworCQlzdGF0ZSAmPSB+RVRIX0ZJTFRFUl9SVUxFU19DTURfTUNBU1RfQUNDRVBUX0FMTDsKKwkJc3RhdGUgJj0gfkVUSF9GSUxURVJfUlVMRVNfQ01EX0JDQVNUX0FDQ0VQVF9BTEw7CisJCXN0YXRlICY9IH5FVEhfRklMVEVSX1JVTEVTX0NNRF9VQ0FTVF9BQ0NFUFRfQUxMOworCQlzdGF0ZSAmPSB+RVRIX0ZJTFRFUl9SVUxFU19DTURfVUNBU1RfQUNDRVBUX1VOTUFUQ0hFRDsKKwl9CisKKwljbWQtPnN0YXRlID0gY3B1X3RvX2xlMTYoc3RhdGUpOworCit9CisKK3N0YXRpYyBpbnQgYm54Mnhfc2V0X3J4X21vZGVfZTIoc3RydWN0IGJueDJ4ICpicCwKKwkJCQlzdHJ1Y3QgYm54MnhfcnhfbW9kZV9yYW1yb2RfcGFyYW1zICpwKQoreworCXN0cnVjdCBldGhfZmlsdGVyX3J1bGVzX3JhbXJvZF9kYXRhICpkYXRhID0gcC0+cmRhdGE7CisJaW50IHJjOworCXU4IHJ1bGVfaWR4ID0gMDsKKworCS8qIFJlc2V0IHRoZSByYW1yb2QgZGF0YSBidWZmZXIgKi8KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisKKwkvKiBTZXR1cCByYW1yb2QgZGF0YSAqLworCisJLyogVHggKGludGVybmFsIHN3aXRjaGluZykgKi8KKwlpZiAodGVzdF9iaXQoUkFNUk9EX1RYLCAmcC0+cmFtcm9kX2ZsYWdzKSkgeworCQlkYXRhLT5ydWxlc1tydWxlX2lkeF0uY2xpZW50X2lkID0gcC0+Y2xfaWQ7CisJCWRhdGEtPnJ1bGVzW3J1bGVfaWR4XS5mdW5jX2lkID0gcC0+ZnVuY19pZDsKKworCQlkYXRhLT5ydWxlc1tydWxlX2lkeF0uY21kX2dlbmVyYWxfZGF0YSA9CisJCQlFVEhfRklMVEVSX1JVTEVTX0NNRF9UWF9DTUQ7CisKKwkJYm54MnhfcnhfbW9kZV9zZXRfY21kX3N0YXRlX2UyKGJwLCBwLT50eF9hY2NlcHRfZmxhZ3MsCisJCQkmKGRhdGEtPnJ1bGVzW3J1bGVfaWR4KytdKSwgZmFsc2UpOworCX0KKworCS8qIFJ4ICovCisJaWYgKHRlc3RfYml0KFJBTVJPRF9SWCwgJnAtPnJhbXJvZF9mbGFncykpIHsKKwkJZGF0YS0+cnVsZXNbcnVsZV9pZHhdLmNsaWVudF9pZCA9IHAtPmNsX2lkOworCQlkYXRhLT5ydWxlc1tydWxlX2lkeF0uZnVuY19pZCA9IHAtPmZ1bmNfaWQ7CisKKwkJZGF0YS0+cnVsZXNbcnVsZV9pZHhdLmNtZF9nZW5lcmFsX2RhdGEgPQorCQkJRVRIX0ZJTFRFUl9SVUxFU19DTURfUlhfQ01EOworCisJCWJueDJ4X3J4X21vZGVfc2V0X2NtZF9zdGF0ZV9lMihicCwgcC0+cnhfYWNjZXB0X2ZsYWdzLAorCQkJJihkYXRhLT5ydWxlc1tydWxlX2lkeCsrXSksIGZhbHNlKTsKKwl9CisKKworCS8qCisJICogSWYgRkNvRSBRdWV1ZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZCBjb25maWd1cmUgdGhlIFJ4IGFuZAorCSAqIGludGVybmFsIHN3aXRjaGluZyBtb2RlcyBmb3IgdGhpcyBxdWV1ZSBpbiBzZXBhcmF0ZSBydWxlcy4KKwkgKgorCSAqIEZDb0UgcXVldWUgc2hlbGwgbmV2ZXIgYmUgc2V0IHRvIEFDQ0VQVF9BTEwgcGFja2V0cyBvZiBhbnkgc29ydDoKKwkgKiBNQ0FTVF9BTEwsIFVDQVNUX0FMTCwgQkNBU1RfQUxMIGFuZCBVTk1BVENIRUQuCisJICovCisJaWYgKHRlc3RfYml0KEJOWDJYX1JYX01PREVfRkNPRV9FVEgsICZwLT5yeF9tb2RlX2ZsYWdzKSkgeworCQkvKiAgVHggKGludGVybmFsIHN3aXRjaGluZykgKi8KKwkJaWYgKHRlc3RfYml0KFJBTVJPRF9UWCwgJnAtPnJhbXJvZF9mbGFncykpIHsKKwkJCWRhdGEtPnJ1bGVzW3J1bGVfaWR4XS5jbGllbnRfaWQgPSBibngyeF9mY29lKGJwLCBjbF9pZCk7CisJCQlkYXRhLT5ydWxlc1tydWxlX2lkeF0uZnVuY19pZCA9IHAtPmZ1bmNfaWQ7CisKKwkJCWRhdGEtPnJ1bGVzW3J1bGVfaWR4XS5jbWRfZ2VuZXJhbF9kYXRhID0KKwkJCQkJCUVUSF9GSUxURVJfUlVMRVNfQ01EX1RYX0NNRDsKKworCQkJYm54MnhfcnhfbW9kZV9zZXRfY21kX3N0YXRlX2UyKGJwLCBwLT50eF9hY2NlcHRfZmxhZ3MsCisJCQkJCQkgICAgICYoZGF0YS0+cnVsZXNbcnVsZV9pZHgrK10pLAorCQkJCQkJICAgICAgIHRydWUpOworCQl9CisKKwkJLyogUnggKi8KKwkJaWYgKHRlc3RfYml0KFJBTVJPRF9SWCwgJnAtPnJhbXJvZF9mbGFncykpIHsKKwkJCWRhdGEtPnJ1bGVzW3J1bGVfaWR4XS5jbGllbnRfaWQgPSBibngyeF9mY29lKGJwLCBjbF9pZCk7CisJCQlkYXRhLT5ydWxlc1tydWxlX2lkeF0uZnVuY19pZCA9IHAtPmZ1bmNfaWQ7CisKKwkJCWRhdGEtPnJ1bGVzW3J1bGVfaWR4XS5jbWRfZ2VuZXJhbF9kYXRhID0KKwkJCQkJCUVUSF9GSUxURVJfUlVMRVNfQ01EX1JYX0NNRDsKKworCQkJYm54MnhfcnhfbW9kZV9zZXRfY21kX3N0YXRlX2UyKGJwLCBwLT5yeF9hY2NlcHRfZmxhZ3MsCisJCQkJCQkgICAgICYoZGF0YS0+cnVsZXNbcnVsZV9pZHgrK10pLAorCQkJCQkJICAgICAgIHRydWUpOworCQl9CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIHJhbXJvZCBoZWFkZXIgKG1vc3QgaW1wb3J0YW50bHkgLSBudW1iZXIgb2YgcnVsZXMgdG8KKwkgKiBjb25maWd1cmUpLgorCSAqLworCWJueDJ4X3J4X21vZGVfc2V0X3JkYXRhX2hkcl9lMihwLT5jaWQsICZkYXRhLT5oZWFkZXIsIHJ1bGVfaWR4KTsKKworCURQKEJOWDJYX01TR19TUCwgIkFib3V0IHRvIGNvbmZpZ3VyZSAlZCBydWxlcywgcnhfYWNjZXB0X2ZsYWdzIDB4JWx4LCAiCisJCQkgInR4X2FjY2VwdF9mbGFncyAweCVseFxuIiwKKwkJCSBkYXRhLT5oZWFkZXIucnVsZV9jbnQsIHAtPnJ4X2FjY2VwdF9mbGFncywKKwkJCSBwLT50eF9hY2NlcHRfZmxhZ3MpOworCisJLyoKKwkgKiAgTm8gbmVlZCBmb3IgYW4gZXhwbGljaXQgbWVtb3J5IGJhcnJpZXIgaGVyZSBhcyBsb25nIHdlIHdvdWxkCisJICogIG5lZWQgdG8gZW5zdXJlIHRoZSBvcmRlcmluZyBvZiB3cml0aW5nIHRvIHRoZSBTUFEgZWxlbWVudAorCSAqICBhbmQgdXBkYXRpbmcgb2YgdGhlIFNQUSBwcm9kdWNlciB3aGljaCBpbnZvbHZlcyBhIG1lbW9yeQorCSAqICByZWFkIGFuZCB3ZSB3aWxsIGhhdmUgdG8gcHV0IGEgZnVsbCBtZW1vcnkgYmFycmllciB0aGVyZQorCSAqICAoaW5zaWRlIGJueDJ4X3NwX3Bvc3QoKSkuCisJICovCisKKwkvKiBTZW5kIGEgcmFtcm9kICovCisJcmMgPSBibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9GSUxURVJfUlVMRVMsIHAtPmNpZCwKKwkJCSAgIFU2NF9ISShwLT5yZGF0YV9tYXBwaW5nKSwKKwkJCSAgIFU2NF9MTyhwLT5yZGF0YV9tYXBwaW5nKSwKKwkJCSAgIEVUSF9DT05ORUNUSU9OX1RZUEUpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogUmFtcm9kIGNvbXBsZXRpb24gaXMgcGVuZGluZyAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGJueDJ4X3dhaXRfcnhfbW9kZV9jb21wX2UyKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgc3RydWN0IGJueDJ4X3J4X21vZGVfcmFtcm9kX3BhcmFtcyAqcCkKK3sKKwlyZXR1cm4gYm54Mnhfc3RhdGVfd2FpdChicCwgcC0+c3RhdGUsIHAtPnBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfZW1wdHlfcnhfbW9kZV93YWl0KHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgIHN0cnVjdCBibngyeF9yeF9tb2RlX3JhbXJvZF9wYXJhbXMgKnApCit7CisJLyogRG8gbm90aGluZyAqLworCXJldHVybiAwOworfQorCitpbnQgYm54MnhfY29uZmlnX3J4X21vZGUoc3RydWN0IGJueDJ4ICpicCwKKwkJCSBzdHJ1Y3QgYm54MnhfcnhfbW9kZV9yYW1yb2RfcGFyYW1zICpwKQoreworCWludCByYzsKKworCS8qIENvbmZpZ3VyZSB0aGUgbmV3IGNsYXNzaWZpY2F0aW9uIGluIHRoZSBjaGlwICovCisJcmMgPSBwLT5yeF9tb2RlX29iai0+Y29uZmlnX3J4X21vZGUoYnAsIHApOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIFdhaXQgZm9yIGEgcmFtcm9kIGNvbXBsZXRpb24gaWYgd2FzIHJlcXVlc3RlZCAqLworCWlmICh0ZXN0X2JpdChSQU1ST0RfQ09NUF9XQUlULCAmcC0+cmFtcm9kX2ZsYWdzKSkgeworCQlyYyA9IHAtPnJ4X21vZGVfb2JqLT53YWl0X2NvbXAoYnAsIHApOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIHJjOworfQorCit2b2lkIGJueDJ4X2luaXRfcnhfbW9kZV9vYmooc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgICBzdHJ1Y3QgYm54MnhfcnhfbW9kZV9vYmogKm8pCit7CisJaWYgKENISVBfSVNfRTF4KGJwKSkgeworCQlvLT53YWl0X2NvbXAgICAgICA9IGJueDJ4X2VtcHR5X3J4X21vZGVfd2FpdDsKKwkJby0+Y29uZmlnX3J4X21vZGUgPSBibngyeF9zZXRfcnhfbW9kZV9lMXg7CisJfSBlbHNlIHsKKwkJby0+d2FpdF9jb21wICAgICAgPSBibngyeF93YWl0X3J4X21vZGVfY29tcF9lMjsKKwkJby0+Y29uZmlnX3J4X21vZGUgPSBibngyeF9zZXRfcnhfbW9kZV9lMjsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKiogTXVsdGljYXN0IHZlcmJzOiBTRVQsIENMRUFSICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHU4IGJueDJ4X21jYXN0X2Jpbl9mcm9tX21hYyh1OCAqbWFjKQoreworCXJldHVybiAoY3JjMzJjX2xlKDAsIG1hYywgRVRIX0FMRU4pID4+IDI0KSAmIDB4ZmY7Cit9CisKK3N0cnVjdCBibngyeF9tY2FzdF9tYWNfZWxlbSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCXU4IG1hY1tFVEhfQUxFTl07CisJdTggcGFkWzJdOyAvKiBGb3IgYSBuYXR1cmFsIGFsaWdubWVudCBvZiB0aGUgZm9sbG93aW5nIGJ1ZmZlciAqLworfTsKKworc3RydWN0IGJueDJ4X3BlbmRpbmdfbWNhc3RfY21kIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJaW50IHR5cGU7IC8qIEJOWDJYX01DQVNUX0NNRF9YICovCisJdW5pb24geworCQlzdHJ1Y3QgbGlzdF9oZWFkIG1hY3NfaGVhZDsKKwkJdTMyIG1hY3NfbnVtOyAvKiBOZWVkZWQgZm9yIERFTCBjb21tYW5kICovCisJCWludCBuZXh0X2JpbjsgLyogTmVlZGVkIGZvciBSRVNUT1JFIGZsb3cgd2l0aCBhcHJveCBtYXRjaCAqLworCX0gZGF0YTsKKworCWJvb2wgZG9uZTsgLyogc2V0IHRvIHRydWUsIHdoZW4gdGhlIGNvbW1hbmQgaGFzIGJlZW4gaGFuZGxlZCwKKwkJICAgICogcHJhY3RpY2FsbHkgdXNlZCBpbiA1NzcxMiBoYW5kbGluZyBvbmx5LCB3aGVyZSBvbmUgcGVuZGluZworCQkgICAgKiBjb21tYW5kIG1heSBiZSBoYW5kbGVkIGluIGEgZmV3IG9wZXJhdGlvbnMuIEFzIGxvbmcgYXMgZm9yCisJCSAgICAqIG90aGVyIGNoaXBzIGV2ZXJ5IG9wZXJhdGlvbiBoYW5kbGluZyBpcyBjb21wbGV0ZWQgaW4gYQorCQkgICAgKiBzaW5nbGUgcmFtcm9kLCB0aGVyZSBpcyBubyBuZWVkIHRvIHV0aWxpemUgdGhpcyBmaWVsZC4KKwkJICAgICovCit9OworCitzdGF0aWMgaW50IGJueDJ4X21jYXN0X3dhaXQoc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgICBzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvKQoreworCWlmIChibngyeF9zdGF0ZV93YWl0KGJwLCBvLT5zY2hlZF9zdGF0ZSwgby0+cmF3LnBzdGF0ZSkgfHwKKwkJCW8tPnJhdy53YWl0X2NvbXAoYnAsICZvLT5yYXcpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfbWNhc3RfZW5xdWV1ZV9jbWQoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICBzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvLAorCQkJCSAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCQkJCSAgIGludCBjbWQpCit7CisJaW50IHRvdGFsX3N6OworCXN0cnVjdCBibngyeF9wZW5kaW5nX21jYXN0X2NtZCAqbmV3X2NtZDsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfbWFjX2VsZW0gKmN1cl9tYWMgPSBOVUxMOworCXN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW0gKnBvczsKKwlpbnQgbWFjc19saXN0X2xlbiA9ICgoY21kID09IEJOWDJYX01DQVNUX0NNRF9BREQpID8KKwkJCSAgICAgcC0+bWNhc3RfbGlzdF9sZW4gOiAwKTsKKworCS8qIElmIHRoZSBjb21tYW5kIGlzIGVtcHR5ICgiaGFuZGxlIHBlbmRpbmcgY29tbWFuZHMgb25seSIpLCBicmVhayAqLworCWlmICghcC0+bWNhc3RfbGlzdF9sZW4pCisJCXJldHVybiAwOworCisJdG90YWxfc3ogPSBzaXplb2YoKm5ld19jbWQpICsKKwkJbWFjc19saXN0X2xlbiAqIHNpemVvZihzdHJ1Y3QgYm54MnhfbWNhc3RfbWFjX2VsZW0pOworCisJLyogQWRkIG1jYXN0IGlzIGNhbGxlZCB1bmRlciBzcGluX2xvY2ssIHRodXMgY2FsbGluZyB3aXRoIEdGUF9BVE9NSUMgKi8KKwluZXdfY21kID0ga3phbGxvYyh0b3RhbF9zeiwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIW5ld19jbWQpCisJCXJldHVybiAtRU5PTUVNOworCisJRFAoQk5YMlhfTVNHX1NQLCAiQWJvdXQgdG8gZW5xdWV1ZSBhIG5ldyAlZCBjb21tYW5kLiAiCisJCQkgIm1hY3NfbGlzdF9sZW49JWRcbiIsIGNtZCwgbWFjc19saXN0X2xlbik7CisKKwlJTklUX0xJU1RfSEVBRCgmbmV3X2NtZC0+ZGF0YS5tYWNzX2hlYWQpOworCisJbmV3X2NtZC0+dHlwZSA9IGNtZDsKKwluZXdfY21kLT5kb25lID0gZmFsc2U7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQk5YMlhfTUNBU1RfQ01EX0FERDoKKwkJY3VyX21hYyA9IChzdHJ1Y3QgYm54MnhfbWNhc3RfbWFjX2VsZW0gKikKKwkJCSAgKCh1OCAqKW5ld19jbWQgKyBzaXplb2YoKm5ld19jbWQpKTsKKworCQkvKiBQdXNoIHRoZSBNQUNzIG9mIHRoZSBjdXJyZW50IGNvbW1hbmQgaW50byB0aGUgcGVuZGlnIGNvbW1hbmQKKwkJICogTUFDcyBsaXN0OiBGSUZPCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnAtPm1jYXN0X2xpc3QsIGxpbmspIHsKKwkJCW1lbWNweShjdXJfbWFjLT5tYWMsIHBvcy0+bWFjLCBFVEhfQUxFTik7CisJCQlsaXN0X2FkZF90YWlsKCZjdXJfbWFjLT5saW5rLCAmbmV3X2NtZC0+ZGF0YS5tYWNzX2hlYWQpOworCQkJY3VyX21hYysrOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIEJOWDJYX01DQVNUX0NNRF9ERUw6CisJCW5ld19jbWQtPmRhdGEubWFjc19udW0gPSBwLT5tY2FzdF9saXN0X2xlbjsKKwkJYnJlYWs7CisKKwljYXNlIEJOWDJYX01DQVNUX0NNRF9SRVNUT1JFOgorCQluZXdfY21kLT5kYXRhLm5leHRfYmluID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCTlgyWF9FUlIoIlVua25vd24gY29tbWFuZDogJWRcbiIsIGNtZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFB1c2ggdGhlIG5ldyBwZW5kaW5nIGNvbW1hbmQgdG8gdGhlIHRhaWwgb2YgdGhlIHBlbmRpbmcgbGlzdDogRklGTyAqLworCWxpc3RfYWRkX3RhaWwoJm5ld19jbWQtPmxpbmssICZvLT5wZW5kaW5nX2NtZHNfaGVhZCk7CisKKwlvLT5zZXRfc2NoZWQobyk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBibngyeF9tY2FzdF9nZXRfbmV4dF9iaW4gLSBnZXQgdGhlIG5leHQgc2V0IGJpbiAoaW5kZXgpCisgKgorICogQG86CisgKiBAbGFzdDoJaW5kZXggdG8gc3RhcnQgbG9va2luZyBmcm9tIChpbmNsdWRpbmcpCisgKgorICogcmV0dXJucyB0aGUgbmV4dCBmb3VuZCAoc2V0KSBiaW4gb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBub25lIGlzIGZvdW5kLgorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9tY2FzdF9nZXRfbmV4dF9iaW4oc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbywgaW50IGxhc3QpCit7CisJaW50IGksIGosIGlubmVyX3N0YXJ0ID0gbGFzdCAlIEJJVF9WRUM2NF9FTEVNX1NaOworCisJZm9yIChpID0gbGFzdCAvIEJJVF9WRUM2NF9FTEVNX1NaOyBpIDwgQk5YMlhfTUNBU1RfVkVDX1NaOyBpKyspIHsKKwkJaWYgKG8tPnJlZ2lzdHJ5LmFwcm94X21hdGNoLnZlY1tpXSkKKwkJCWZvciAoaiA9IGlubmVyX3N0YXJ0OyBqIDwgQklUX1ZFQzY0X0VMRU1fU1o7IGorKykgeworCQkJCWludCBjdXJfYml0ID0gaiArIEJJVF9WRUM2NF9FTEVNX1NaICogaTsKKwkJCQlpZiAoQklUX1ZFQzY0X1RFU1RfQklUKG8tPnJlZ2lzdHJ5LmFwcm94X21hdGNoLgorCQkJCQkJICAgICAgIHZlYywgY3VyX2JpdCkpIHsKKwkJCQkJcmV0dXJuIGN1cl9iaXQ7CisJCQkJfQorCQkJfQorCQlpbm5lcl9zdGFydCA9IDA7CisJfQorCisJLyogTm9uZSBmb3VuZCAqLworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBibngyeF9tY2FzdF9jbGVhcl9maXJzdF9iaW4gLSBmaW5kIHRoZSBmaXJzdCBzZXQgYmluIGFuZCBjbGVhciBpdAorICoKKyAqIEBvOgorICoKKyAqIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBiaW4gb3IgLTEgaWYgbm9uZSBpcyBmb3VuZAorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9tY2FzdF9jbGVhcl9maXJzdF9iaW4oc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbykKK3sKKwlpbnQgY3VyX2JpdCA9IGJueDJ4X21jYXN0X2dldF9uZXh0X2JpbihvLCAwKTsKKworCWlmIChjdXJfYml0ID49IDApCisJCUJJVF9WRUM2NF9DTEVBUl9CSVQoby0+cmVnaXN0cnkuYXByb3hfbWF0Y2gudmVjLCBjdXJfYml0KTsKKworCXJldHVybiBjdXJfYml0OworfQorCitzdGF0aWMgaW5saW5lIHU4IGJueDJ4X21jYXN0X2dldF9yeF90eF9mbGFnKHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8pCit7CisJc3RydWN0IGJueDJ4X3Jhd19vYmogKnJhdyA9ICZvLT5yYXc7CisJdTggcnhfdHhfZmxhZyA9IDA7CisKKwlpZiAoKHJhdy0+b2JqX3R5cGUgPT0gQk5YMlhfT0JKX1RZUEVfVFgpIHx8CisJICAgIChyYXctPm9ial90eXBlID09IEJOWDJYX09CSl9UWVBFX1JYX1RYKSkKKwkJcnhfdHhfZmxhZyB8PSBFVEhfTVVMVElDQVNUX1JVTEVTX0NNRF9UWF9DTUQ7CisKKwlpZiAoKHJhdy0+b2JqX3R5cGUgPT0gQk5YMlhfT0JKX1RZUEVfUlgpIHx8CisJICAgIChyYXctPm9ial90eXBlID09IEJOWDJYX09CSl9UWVBFX1JYX1RYKSkKKwkJcnhfdHhfZmxhZyB8PSBFVEhfTVVMVElDQVNUX1JVTEVTX0NNRF9SWF9DTUQ7CisKKwlyZXR1cm4gcnhfdHhfZmxhZzsKK30KKworc3RhdGljIHZvaWQgYm54MnhfbWNhc3Rfc2V0X29uZV9ydWxlX2UyKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCXN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8sIGludCBpZHgsCisJCQkJCXVuaW9uIGJueDJ4X21jYXN0X2NvbmZpZ19kYXRhICpjZmdfZGF0YSwKKwkJCQkJaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYm54MnhfcmF3X29iaiAqciA9ICZvLT5yYXc7CisJc3RydWN0IGV0aF9tdWx0aWNhc3RfcnVsZXNfcmFtcm9kX2RhdGEgKmRhdGEgPQorCQkoc3RydWN0IGV0aF9tdWx0aWNhc3RfcnVsZXNfcmFtcm9kX2RhdGEgKikoci0+cmRhdGEpOworCXU4IGZ1bmNfaWQgPSByLT5mdW5jX2lkOworCXU4IHJ4X3R4X2FkZF9mbGFnID0gYm54MnhfbWNhc3RfZ2V0X3J4X3R4X2ZsYWcobyk7CisJaW50IGJpbjsKKworCWlmICgoY21kID09IEJOWDJYX01DQVNUX0NNRF9BREQpIHx8IChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX1JFU1RPUkUpKQorCQlyeF90eF9hZGRfZmxhZyB8PSBFVEhfTVVMVElDQVNUX1JVTEVTX0NNRF9JU19BREQ7CisKKwlkYXRhLT5ydWxlc1tpZHhdLmNtZF9nZW5lcmFsX2RhdGEgfD0gcnhfdHhfYWRkX2ZsYWc7CisKKwkvKiBHZXQgYSBiaW4gYW5kIHVwZGF0ZSBhIGJpbnMnIHZlY3RvciAqLworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBCTlgyWF9NQ0FTVF9DTURfQUREOgorCQliaW4gPSBibngyeF9tY2FzdF9iaW5fZnJvbV9tYWMoY2ZnX2RhdGEtPm1hYyk7CisJCUJJVF9WRUM2NF9TRVRfQklUKG8tPnJlZ2lzdHJ5LmFwcm94X21hdGNoLnZlYywgYmluKTsKKwkJYnJlYWs7CisKKwljYXNlIEJOWDJYX01DQVNUX0NNRF9ERUw6CisJCS8qIElmIHRoZXJlIHdlcmUgbm8gbW9yZSBiaW5zIHRvIGNsZWFyCisJCSAqIChibngyeF9tY2FzdF9jbGVhcl9maXJzdF9iaW4oKSByZXR1cm5zIC0xKSB0aGVuIHdlIHdvdWxkCisJCSAqIGNsZWFyIGFueSAoMHhmZikgYmluLgorCQkgKiBTZWUgYm54MnhfbWNhc3RfdmFsaWRhdGVfZTIoKSBmb3IgZXhwbGFuYXRpb24gd2hlbiBpdCBtYXkKKwkJICogaGFwcGVuLgorCQkgKi8KKwkJYmluID0gYm54MnhfbWNhc3RfY2xlYXJfZmlyc3RfYmluKG8pOworCQlicmVhazsKKworCWNhc2UgQk5YMlhfTUNBU1RfQ01EX1JFU1RPUkU6CisJCWJpbiA9IGNmZ19kYXRhLT5iaW47CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQk5YMlhfRVJSKCJVbmtub3duIGNvbW1hbmQ6ICVkXG4iLCBjbWQpOworCQlyZXR1cm47CisJfQorCisJRFAoQk5YMlhfTVNHX1NQLCAiJXMgYmluICVkXG4iLAorCQkJICgocnhfdHhfYWRkX2ZsYWcgJiBFVEhfTVVMVElDQVNUX1JVTEVTX0NNRF9JU19BREQpID8KKwkJCSAiU2V0dGluZyIgIDogIkNsZWFyaW5nIiksIGJpbik7CisKKwlkYXRhLT5ydWxlc1tpZHhdLmJpbl9pZCAgICA9ICh1OCliaW47CisJZGF0YS0+cnVsZXNbaWR4XS5mdW5jX2lkICAgPSBmdW5jX2lkOworCWRhdGEtPnJ1bGVzW2lkeF0uZW5naW5lX2lkID0gby0+ZW5naW5lX2lkOworfQorCisvKioKKyAqIGJueDJ4X21jYXN0X2hhbmRsZV9yZXN0b3JlX2NtZF9lMiAtIHJlc3RvcmUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSByZWdpc3RyeQorICoKKyAqIEBicDoJCWRldmljZSBoYW5kbGUKKyAqIEBvOgorICogQHN0YXJ0X2JpbjoJaW5kZXggaW4gdGhlIHJlZ2lzdHJ5IHRvIHN0YXJ0IGZyb20gKGluY2x1ZGluZykKKyAqIEByZGF0YV9pZHg6CWluZGV4IGluIHRoZSByYW1yb2QgZGF0YSB0byBzdGFydCBmcm9tCisgKgorICogcmV0dXJucyBsYXN0IGhhbmRsZWQgYmluIGluZGV4IG9yIC0xIGlmIGFsbCBiaW5zIGhhdmUgYmVlbiBoYW5kbGVkCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X21jYXN0X2hhbmRsZV9yZXN0b3JlX2NtZF9lMigKKwlzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvICwgaW50IHN0YXJ0X2JpbiwKKwlpbnQgKnJkYXRhX2lkeCkKK3sKKwlpbnQgY3VyX2JpbiwgY250ID0gKnJkYXRhX2lkeDsKKwl1bmlvbiBibngyeF9tY2FzdF9jb25maWdfZGF0YSBjZmdfZGF0YSA9IHswfTsKKworCS8qIGdvIHRocm91Z2ggdGhlIHJlZ2lzdHJ5IGFuZCBjb25maWd1cmUgdGhlIGJpbnMgZnJvbSBpdCAqLworCWZvciAoY3VyX2JpbiA9IGJueDJ4X21jYXN0X2dldF9uZXh0X2JpbihvLCBzdGFydF9iaW4pOyBjdXJfYmluID49IDA7CisJICAgIGN1cl9iaW4gPSBibngyeF9tY2FzdF9nZXRfbmV4dF9iaW4obywgY3VyX2JpbiArIDEpKSB7CisKKwkJY2ZnX2RhdGEuYmluID0gKHU4KWN1cl9iaW47CisJCW8tPnNldF9vbmVfcnVsZShicCwgbywgY250LCAmY2ZnX2RhdGEsCisJCQkJQk5YMlhfTUNBU1RfQ01EX1JFU1RPUkUpOworCisJCWNudCsrOworCisJCURQKEJOWDJYX01TR19TUCwgIkFib3V0IHRvIGNvbmZpZ3VyZSBhIGJpbiAlZFxuIiwgY3VyX2Jpbik7CisKKwkJLyogQnJlYWsgaWYgd2UgcmVhY2hlZCB0aGUgbWF4aW11bSBudW1iZXIKKwkJICogb2YgcnVsZXMuCisJCSAqLworCQlpZiAoY250ID49IG8tPm1heF9jbWRfbGVuKQorCQkJYnJlYWs7CisJfQorCisJKnJkYXRhX2lkeCA9IGNudDsKKworCXJldHVybiBjdXJfYmluOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfbWNhc3RfaGRsX3BlbmRpbmdfYWRkX2UyKHN0cnVjdCBibngyeCAqYnAsCisJc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbywgc3RydWN0IGJueDJ4X3BlbmRpbmdfbWNhc3RfY21kICpjbWRfcG9zLAorCWludCAqbGluZV9pZHgpCit7CisJc3RydWN0IGJueDJ4X21jYXN0X21hY19lbGVtICpwbWFjX3BvcywgKnBtYWNfcG9zX247CisJaW50IGNudCA9ICpsaW5lX2lkeDsKKwl1bmlvbiBibngyeF9tY2FzdF9jb25maWdfZGF0YSBjZmdfZGF0YSA9IHswfTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbWFjX3BvcywgcG1hY19wb3NfbiwgJmNtZF9wb3MtPmRhdGEubWFjc19oZWFkLAorCQkJCSBsaW5rKSB7CisKKwkJY2ZnX2RhdGEubWFjID0gJnBtYWNfcG9zLT5tYWNbMF07CisJCW8tPnNldF9vbmVfcnVsZShicCwgbywgY250LCAmY2ZnX2RhdGEsIGNtZF9wb3MtPnR5cGUpOworCisJCWNudCsrOworCisJCURQKEJOWDJYX01TR19TUCwgIkFib3V0IHRvIGNvbmZpZ3VyZSAiQk5YMlhfTUFDX0ZNVAorCQkJCSAiIG1jYXN0IE1BQ1xuIiwKKwkJCQkgQk5YMlhfTUFDX1BSTl9MSVNUKHBtYWNfcG9zLT5tYWMpKTsKKworCQlsaXN0X2RlbCgmcG1hY19wb3MtPmxpbmspOworCisJCS8qIEJyZWFrIGlmIHdlIHJlYWNoZWQgdGhlIG1heGltdW0gbnVtYmVyCisJCSAqIG9mIHJ1bGVzLgorCQkgKi8KKwkJaWYgKGNudCA+PSBvLT5tYXhfY21kX2xlbikKKwkJCWJyZWFrOworCX0KKworCSpsaW5lX2lkeCA9IGNudDsKKworCS8qIGlmIG5vIG1vcmUgTUFDcyB0byBjb25maWd1cmUgLSB3ZSBhcmUgZG9uZSAqLworCWlmIChsaXN0X2VtcHR5KCZjbWRfcG9zLT5kYXRhLm1hY3NfaGVhZCkpCisJCWNtZF9wb3MtPmRvbmUgPSB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfbWNhc3RfaGRsX3BlbmRpbmdfZGVsX2UyKHN0cnVjdCBibngyeCAqYnAsCisJc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbywgc3RydWN0IGJueDJ4X3BlbmRpbmdfbWNhc3RfY21kICpjbWRfcG9zLAorCWludCAqbGluZV9pZHgpCit7CisJaW50IGNudCA9ICpsaW5lX2lkeDsKKworCXdoaWxlIChjbWRfcG9zLT5kYXRhLm1hY3NfbnVtKSB7CisJCW8tPnNldF9vbmVfcnVsZShicCwgbywgY250LCBOVUxMLCBjbWRfcG9zLT50eXBlKTsKKworCQljbnQrKzsKKworCQljbWRfcG9zLT5kYXRhLm1hY3NfbnVtLS07CisKKwkJICBEUChCTlgyWF9NU0dfU1AsICJEZWxldGluZyBNQUMuICVkIGxlZnQsY250IGlzICVkXG4iLAorCQkJCSAgIGNtZF9wb3MtPmRhdGEubWFjc19udW0sIGNudCk7CisKKwkJLyogQnJlYWsgaWYgd2UgcmVhY2hlZCB0aGUgbWF4aW11bQorCQkgKiBudW1iZXIgb2YgcnVsZXMuCisJCSAqLworCQlpZiAoY250ID49IG8tPm1heF9jbWRfbGVuKQorCQkJYnJlYWs7CisJfQorCisJKmxpbmVfaWR4ID0gY250OworCisJLyogSWYgd2UgY2xlYXJlZCBhbGwgYmlucyAtIHdlIGFyZSBkb25lICovCisJaWYgKCFjbWRfcG9zLT5kYXRhLm1hY3NfbnVtKQorCQljbWRfcG9zLT5kb25lID0gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X21jYXN0X2hkbF9wZW5kaW5nX3Jlc3RvcmVfZTIoc3RydWN0IGJueDJ4ICpicCwKKwlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvLCBzdHJ1Y3QgYm54MnhfcGVuZGluZ19tY2FzdF9jbWQgKmNtZF9wb3MsCisJaW50ICpsaW5lX2lkeCkKK3sKKwljbWRfcG9zLT5kYXRhLm5leHRfYmluID0gby0+aGRsX3Jlc3RvcmUoYnAsIG8sIGNtZF9wb3MtPmRhdGEubmV4dF9iaW4sCisJCQkJCQlsaW5lX2lkeCk7CisKKwlpZiAoY21kX3Bvcy0+ZGF0YS5uZXh0X2JpbiA8IDApCisJCS8qIElmIG8tPnNldF9yZXN0b3JlIHJldHVybmVkIC0xIHdlIGFyZSBkb25lICovCisJCWNtZF9wb3MtPmRvbmUgPSB0cnVlOworCWVsc2UKKwkJLyogU3RhcnQgZnJvbSB0aGUgbmV4dCBiaW4gbmV4dCB0aW1lICovCisJCWNtZF9wb3MtPmRhdGEubmV4dF9iaW4rKzsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfbWNhc3RfaGFuZGxlX3BlbmRpbmdfY21kc19lMihzdHJ1Y3QgYm54MnggKmJwLAorCQkJCXN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwKQoreworCXN0cnVjdCBibngyeF9wZW5kaW5nX21jYXN0X2NtZCAqY21kX3BvcywgKmNtZF9wb3NfbjsKKwlpbnQgY250ID0gMDsKKwlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvID0gcC0+bWNhc3Rfb2JqOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNtZF9wb3MsIGNtZF9wb3NfbiwgJm8tPnBlbmRpbmdfY21kc19oZWFkLAorCQkJCSBsaW5rKSB7CisJCXN3aXRjaCAoY21kX3Bvcy0+dHlwZSkgeworCQljYXNlIEJOWDJYX01DQVNUX0NNRF9BREQ6CisJCQlibngyeF9tY2FzdF9oZGxfcGVuZGluZ19hZGRfZTIoYnAsIG8sIGNtZF9wb3MsICZjbnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCTlgyWF9NQ0FTVF9DTURfREVMOgorCQkJYm54MnhfbWNhc3RfaGRsX3BlbmRpbmdfZGVsX2UyKGJwLCBvLCBjbWRfcG9zLCAmY250KTsKKwkJCWJyZWFrOworCisJCWNhc2UgQk5YMlhfTUNBU1RfQ01EX1JFU1RPUkU6CisJCQlibngyeF9tY2FzdF9oZGxfcGVuZGluZ19yZXN0b3JlX2UyKGJwLCBvLCBjbWRfcG9zLAorCQkJCQkJCSAgICZjbnQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUJOWDJYX0VSUigiVW5rbm93biBjb21tYW5kOiAlZFxuIiwgY21kX3Bvcy0+dHlwZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIElmIHRoZSBjb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCAtIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0CisJCSAqIGFuZCBmcmVlIHRoZSBtZW1vcnkKKwkJICovCisJCWlmIChjbWRfcG9zLT5kb25lKSB7CisJCQlsaXN0X2RlbCgmY21kX3Bvcy0+bGluayk7CisJCQlrZnJlZShjbWRfcG9zKTsKKwkJfQorCisJCS8qIEJyZWFrIGlmIHdlIHJlYWNoZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJ1bGVzICovCisJCWlmIChjbnQgPj0gby0+bWF4X2NtZF9sZW4pCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfbWNhc3RfaGRsX2FkZChzdHJ1Y3QgYm54MnggKmJwLAorCXN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8sIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCWludCAqbGluZV9pZHgpCit7CisJc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSAqbWxpc3RfcG9zOworCXVuaW9uIGJueDJ4X21jYXN0X2NvbmZpZ19kYXRhIGNmZ19kYXRhID0gezB9OworCWludCBjbnQgPSAqbGluZV9pZHg7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1saXN0X3BvcywgJnAtPm1jYXN0X2xpc3QsIGxpbmspIHsKKwkJY2ZnX2RhdGEubWFjID0gbWxpc3RfcG9zLT5tYWM7CisJCW8tPnNldF9vbmVfcnVsZShicCwgbywgY250LCAmY2ZnX2RhdGEsIEJOWDJYX01DQVNUX0NNRF9BREQpOworCisJCWNudCsrOworCisJCURQKEJOWDJYX01TR19TUCwgIkFib3V0IHRvIGNvbmZpZ3VyZSAiQk5YMlhfTUFDX0ZNVAorCQkJCSAiIG1jYXN0IE1BQ1xuIiwKKwkJCQkgQk5YMlhfTUFDX1BSTl9MSVNUKG1saXN0X3Bvcy0+bWFjKSk7CisJfQorCisJKmxpbmVfaWR4ID0gY250OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfbWNhc3RfaGRsX2RlbChzdHJ1Y3QgYm54MnggKmJwLAorCXN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8sIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCWludCAqbGluZV9pZHgpCit7CisJaW50IGNudCA9ICpsaW5lX2lkeCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwLT5tY2FzdF9saXN0X2xlbjsgaSsrKSB7CisJCW8tPnNldF9vbmVfcnVsZShicCwgbywgY250LCBOVUxMLCBCTlgyWF9NQ0FTVF9DTURfREVMKTsKKworCQljbnQrKzsKKworCQlEUChCTlgyWF9NU0dfU1AsICJEZWxldGluZyBNQUMuICVkIGxlZnRcbiIsCisJCQkJIHAtPm1jYXN0X2xpc3RfbGVuIC0gaSAtIDEpOworCX0KKworCSpsaW5lX2lkeCA9IGNudDsKK30KKworLyoqCisgKiBibngyeF9tY2FzdF9oYW5kbGVfY3VycmVudF9jbWQgLQorICoKKyAqIEBicDoJCWRldmljZSBoYW5kbGUKKyAqIEBwOgorICogQGNtZDoKKyAqIEBzdGFydF9jbnQ6CWZpcnN0IGxpbmUgaW4gdGhlIHJhbXJvZCBkYXRhIHRoYXQgbWF5IGJlIHVzZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZmYgdGhlcmUgaXMgZW5vdWdoIHBsYWNlIGZvciB0aGUgY3VycmVudCBjb21tYW5kIGluCisgKiB0aGUgcmFtcm9kIGRhdGEuCisgKiBSZXR1cm5zIG51bWJlciBvZiBsaW5lcyBmaWxsZWQgaW4gdGhlIHJhbXJvZCBkYXRhIGluIHRvdGFsLgorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9tY2FzdF9oYW5kbGVfY3VycmVudF9jbWQoc3RydWN0IGJueDJ4ICpicCwKKwkJCXN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLCBpbnQgY21kLAorCQkJaW50IHN0YXJ0X2NudCkKK3sKKwlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvID0gcC0+bWNhc3Rfb2JqOworCWludCBjbnQgPSBzdGFydF9jbnQ7CisKKwlEUChCTlgyWF9NU0dfU1AsICJwLT5tY2FzdF9saXN0X2xlbj0lZFxuIiwgcC0+bWNhc3RfbGlzdF9sZW4pOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEJOWDJYX01DQVNUX0NNRF9BREQ6CisJCWJueDJ4X21jYXN0X2hkbF9hZGQoYnAsIG8sIHAsICZjbnQpOworCQlicmVhazsKKworCWNhc2UgQk5YMlhfTUNBU1RfQ01EX0RFTDoKKwkJYm54MnhfbWNhc3RfaGRsX2RlbChicCwgbywgcCwgJmNudCk7CisJCWJyZWFrOworCisJY2FzZSBCTlgyWF9NQ0FTVF9DTURfUkVTVE9SRToKKwkJby0+aGRsX3Jlc3RvcmUoYnAsIG8sIDAsICZjbnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiVW5rbm93biBjb21tYW5kOiAlZFxuIiwgY21kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVGhlIGN1cnJlbnQgY29tbWFuZCBoYXMgYmVlbiBoYW5kbGVkICovCisJcC0+bWNhc3RfbGlzdF9sZW4gPSAwOworCisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIGludCBibngyeF9tY2FzdF92YWxpZGF0ZV9lMihzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCQkJCSAgIGludCBjbWQpCit7CisJc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbyA9IHAtPm1jYXN0X29iajsKKwlpbnQgcmVnX3N6ID0gby0+Z2V0X3JlZ2lzdHJ5X3NpemUobyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCS8qIERFTCBjb21tYW5kIGRlbGV0ZXMgYWxsIGN1cnJlbnRseSBjb25maWd1cmVkIE1BQ3MgKi8KKwljYXNlIEJOWDJYX01DQVNUX0NNRF9ERUw6CisJCW8tPnNldF9yZWdpc3RyeV9zaXplKG8sIDApOworCQkvKiBEb24ndCBicmVhayAqLworCisJLyogUkVTVE9SRSBjb21tYW5kIHdpbGwgcmVzdG9yZSB0aGUgZW50aXJlIG11bHRpY2FzdCBjb25maWd1cmF0aW9uICovCisJY2FzZSBCTlgyWF9NQ0FTVF9DTURfUkVTVE9SRToKKwkJLyogSGVyZSB3ZSBzZXQgdGhlIGFwcHJveGltYXRlIGFtb3VudCBvZiB3b3JrIHRvIGRvLCB3aGljaCBpbgorCQkgKiBmYWN0IG1heSBiZSBvbmx5IGxlc3MgYXMgc29tZSBNQUNzIGluIHBvc3Rwb25lZCBBREQKKwkJICogY29tbWFuZChzKSBzY2hlZHVsZWQgYmVmb3JlIHRoaXMgY29tbWFuZCBtYXkgZmFsbCBpbnRvCisJCSAqIHRoZSBzYW1lIGJpbiBhbmQgdGhlIGFjdHVhbCBudW1iZXIgb2YgYmlucyBzZXQgaW4gdGhlCisJCSAqIHJlZ2lzdHJ5IHdvdWxkIGJlIGxlc3MgdGhhbiB3ZSBlc3RpbWF0ZWQgaGVyZS4gU2VlCisJCSAqIGJueDJ4X21jYXN0X3NldF9vbmVfcnVsZV9lMigpIGZvciBmdXJ0aGVyIGRldGFpbHMuCisJCSAqLworCQlwLT5tY2FzdF9saXN0X2xlbiA9IHJlZ19zejsKKwkJYnJlYWs7CisKKwljYXNlIEJOWDJYX01DQVNUX0NNRF9BREQ6CisJY2FzZSBCTlgyWF9NQ0FTVF9DTURfQ09OVDoKKwkJLyogSGVyZSB3ZSBhc3N1bWUgdGhhdCBhbGwgbmV3IE1BQ3Mgd2lsbCBmYWxsIGludG8gbmV3IGJpbnMuCisJCSAqIEhvd2V2ZXIgd2Ugd2lsbCBjb3JyZWN0IHRoZSByZWFsIHJlZ2lzdHJ5IHNpemUgYWZ0ZXIgd2UKKwkJICogaGFuZGxlIGFsbCBwZW5kaW5nIGNvbW1hbmRzLgorCQkgKi8KKwkJby0+c2V0X3JlZ2lzdHJ5X3NpemUobywgcmVnX3N6ICsgcC0+bWNhc3RfbGlzdF9sZW4pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiVW5rbm93biBjb21tYW5kOiAlZFxuIiwgY21kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisKKwkvKiBJbmNyZWFzZSB0aGUgdG90YWwgbnVtYmVyIG9mIE1BQ3MgcGVuZGluZyB0byBiZSBjb25maWd1cmVkICovCisJby0+dG90YWxfcGVuZGluZ19udW0gKz0gcC0+bWNhc3RfbGlzdF9sZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm54MnhfbWNhc3RfcmV2ZXJ0X2UyKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnAsCisJCQkJICAgICAgaW50IG9sZF9udW1fYmlucykKK3sKKwlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvID0gcC0+bWNhc3Rfb2JqOworCisJby0+c2V0X3JlZ2lzdHJ5X3NpemUobywgb2xkX251bV9iaW5zKTsKKwlvLT50b3RhbF9wZW5kaW5nX251bSAtPSBwLT5tY2FzdF9saXN0X2xlbjsKK30KKworLyoqCisgKiBibngyeF9tY2FzdF9zZXRfcmRhdGFfaGRyX2UyIC0gc2V0cyBhIGhlYWRlciB2YWx1ZXMKKyAqCisgKiBAYnA6CQlkZXZpY2UgaGFuZGxlCisgKiBAcDoKKyAqIEBsZW46CW51bWJlciBvZiBydWxlcyB0byBoYW5kbGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X21jYXN0X3NldF9yZGF0YV9oZHJfZTIoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnAsCisJCQkJCXU4IGxlbikKK3sKKwlzdHJ1Y3QgYm54MnhfcmF3X29iaiAqciA9ICZwLT5tY2FzdF9vYmotPnJhdzsKKwlzdHJ1Y3QgZXRoX211bHRpY2FzdF9ydWxlc19yYW1yb2RfZGF0YSAqZGF0YSA9CisJCShzdHJ1Y3QgZXRoX211bHRpY2FzdF9ydWxlc19yYW1yb2RfZGF0YSAqKShyLT5yZGF0YSk7CisKKwlkYXRhLT5oZWFkZXIuZWNobyA9ICgoci0+Y2lkICYgQk5YMlhfU1dDSURfTUFTSykgfAorCQkJICAoQk5YMlhfRklMVEVSX01DQVNUX1BFTkRJTkcgPDwgQk5YMlhfU1dDSURfU0hJRlQpKTsKKwlkYXRhLT5oZWFkZXIucnVsZV9jbnQgPSBsZW47Cit9CisKKy8qKgorICogYm54MnhfbWNhc3RfcmVmcmVzaF9yZWdpc3RyeV9lMiAtIHJlY2FsY3VsYXRlIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHNldCBiaW5zCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQG86CisgKgorICogUmVjYWxjdWxhdGUgdGhlIGFjdHVhbCBudW1iZXIgb2Ygc2V0IGJpbnMgaW4gdGhlIHJlZ2lzdHJ5IHVzaW5nIEJyaWFuCisgKiBLZXJuaWdoYW4ncyBhbGdvcml0aG06IGl0J3MgZXhlY3V0aW9uIGNvbXBsZXhpdHkgaXMgYXMgYSBudW1iZXIgb2Ygc2V0IGJpbnMuCisgKgorICogcmV0dXJucyAwIGZvciB0aGUgY29tcGxpYW5jZSB3aXRoIGJueDJ4X21jYXN0X3JlZnJlc2hfcmVnaXN0cnlfZTEoKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYm54MnhfbWNhc3RfcmVmcmVzaF9yZWdpc3RyeV9lMihzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQkJICBzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvKQoreworCWludCBpLCBjbnQgPSAwOworCXU2NCBlbGVtOworCisJZm9yIChpID0gMDsgaSA8IEJOWDJYX01DQVNUX1ZFQ19TWjsgaSsrKSB7CisJCWVsZW0gPSBvLT5yZWdpc3RyeS5hcHJveF9tYXRjaC52ZWNbaV07CisJCWZvciAoOyBlbGVtOyBjbnQrKykKKwkJCWVsZW0gJj0gZWxlbSAtIDE7CisJfQorCisJby0+c2V0X3JlZ2lzdHJ5X3NpemUobywgY250KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJueDJ4X21jYXN0X3NldHVwX2UyKHN0cnVjdCBibngyeCAqYnAsCisJCQkJc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnAsCisJCQkJaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYm54MnhfcmF3X29iaiAqcmF3ID0gJnAtPm1jYXN0X29iai0+cmF3OworCXN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8gPSBwLT5tY2FzdF9vYmo7CisJc3RydWN0IGV0aF9tdWx0aWNhc3RfcnVsZXNfcmFtcm9kX2RhdGEgKmRhdGEgPQorCQkoc3RydWN0IGV0aF9tdWx0aWNhc3RfcnVsZXNfcmFtcm9kX2RhdGEgKikocmF3LT5yZGF0YSk7CisJaW50IGNudCA9IDAsIHJjOworCisJLyogUmVzZXQgdGhlIHJhbXJvZCBkYXRhIGJ1ZmZlciAqLworCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKworCWNudCA9IGJueDJ4X21jYXN0X2hhbmRsZV9wZW5kaW5nX2NtZHNfZTIoYnAsIHApOworCisJLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgcGVuZGluZyBjb21tYW5kcyAtIGNsZWFyIFNDSEVEVUxFRCBzdGF0ZSAqLworCWlmIChsaXN0X2VtcHR5KCZvLT5wZW5kaW5nX2NtZHNfaGVhZCkpCisJCW8tPmNsZWFyX3NjaGVkKG8pOworCisJLyogVGhlIGJlbG93IG1heSBiZSB0cnVlIGlmZiB0aGVyZSB3YXMgZW5vdWdoIHJvb20gaW4gcmFtcm9kCisJICogZGF0YSBmb3IgYWxsIHBlbmRpbmcgY29tbWFuZHMgYW5kIGZvciB0aGUgY3VycmVudAorCSAqIGNvbW1hbmQuIE90aGVyd2lzZSB0aGUgY3VycmVudCBjb21tYW5kIHdvdWxkIGhhdmUgYmVlbiBhZGRlZAorCSAqIHRvIHRoZSBwZW5kaW5nIGNvbW1hbmRzIGFuZCBwLT5tY2FzdF9saXN0X2xlbiB3b3VsZCBoYXZlIGJlZW4KKwkgKiB6ZXJvZWQuCisJICovCisJaWYgKHAtPm1jYXN0X2xpc3RfbGVuID4gMCkKKwkJY250ID0gYm54MnhfbWNhc3RfaGFuZGxlX2N1cnJlbnRfY21kKGJwLCBwLCBjbWQsIGNudCk7CisKKwkvKiBXZSd2ZSBwdWxsZWQgb3V0IHNvbWUgTUFDcyAtIHVwZGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mCisJICogb3V0c3RhbmRpbmcuCisJICovCisJby0+dG90YWxfcGVuZGluZ19udW0gLT0gY250OworCisJLyogc2VuZCBhIHJhbXJvZCAqLworCVdBUk5fT04oby0+dG90YWxfcGVuZGluZ19udW0gPCAwKTsKKwlXQVJOX09OKGNudCA+IG8tPm1heF9jbWRfbGVuKTsKKworCWJueDJ4X21jYXN0X3NldF9yZGF0YV9oZHJfZTIoYnAsIHAsICh1OCljbnQpOworCisJLyogVXBkYXRlIGEgcmVnaXN0cnkgc2l6ZSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBwZW5kaW5nIG9wZXJhdGlvbnMuCisJICoKKwkgKiBXZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdHJ5IHNpemUgaWYgdGhlcmUgYXJlCisJICogcGVuZGluZyBvcGVyYXRpb25zIGJlY2F1c2Ugd2Ugd2FudCBpdCB0byBhbHdheXMgYmUgZXF1YWwgdG8gdGhlCisJICogZXhhY3Qgb3IgdGhlIGFwcHJveGltYXRlIG51bWJlciAoc2VlIGJueDJ4X21jYXN0X3ZhbGlkYXRlX2UyKCkpIG9mCisJICogc2V0IGJpbnMgYWZ0ZXIgdGhlIGxhc3QgcmVxdWVzdGVkIG9wZXJhdGlvbiBpbiBvcmRlciB0byBwcm9wZXJseQorCSAqIGV2YWx1YXRlIHRoZSBzaXplIG9mIHRoZSBuZXh0IERFTC9SRVNUT1JFIG9wZXJhdGlvbi4KKwkgKgorCSAqIE5vdGUgdGhhdCB3ZSB1cGRhdGUgdGhlIHJlZ2lzdHJ5IGl0c2VsZiBkdXJpbmcgY29tbWFuZChzKSBoYW5kbGluZworCSAqIC0gc2VlIGJueDJ4X21jYXN0X3NldF9vbmVfcnVsZV9lMigpLiBUaGF0J3MgYmVjYXVzZSBmb3IgNTc3MTIgd2UKKwkgKiBhZ2dyZWdhdGUgbXVsdGlwbGUgY29tbWFuZHMgKEFERC9ERUwvUkVTVE9SRSkgaW50byBvbmUgcmFtcm9kIGJ1dAorCSAqIHdpdGggYSBsaW1pdGVkIGFtb3VudCBvZiB1cGRhdGUgY29tbWFuZHMgKHBlciBNQUMvYmluKSBhbmQgd2UgZG9uJ3QKKwkgKiBrbm93IGluIHRoaXMgc2NvcGUgd2hhdCB0aGUgYWN0dWFsIHN0YXRlIG9mIGJpbnMgY29uZmlndXJhdGlvbiBpcworCSAqIGdvaW5nIHRvIGJlIGFmdGVyIHRoaXMgcmFtcm9kLgorCSAqLworCWlmICghby0+dG90YWxfcGVuZGluZ19udW0pCisJCWJueDJ4X21jYXN0X3JlZnJlc2hfcmVnaXN0cnlfZTIoYnAsIG8pOworCisJLyoKKwkgKiBJZiBDTEVBUl9PTkxZIHdhcyByZXF1ZXN0ZWQgLSBkb24ndCBzZW5kIGEgcmFtcm9kIGFuZCBjbGVhcgorCSAqIFJBTVJPRF9QRU5ESU5HIHN0YXR1cyBpbW1lZGlhdGVseS4KKwkgKi8KKwlpZiAodGVzdF9iaXQoUkFNUk9EX0RSVl9DTFJfT05MWSwgJnAtPnJhbXJvZF9mbGFncykpIHsKKwkJcmF3LT5jbGVhcl9wZW5kaW5nKHJhdyk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qCisJCSAqICBObyBuZWVkIGZvciBhbiBleHBsaWNpdCBtZW1vcnkgYmFycmllciBoZXJlIGFzIGxvbmcgd2Ugd291bGQKKwkJICogIG5lZWQgdG8gZW5zdXJlIHRoZSBvcmRlcmluZyBvZiB3cml0aW5nIHRvIHRoZSBTUFEgZWxlbWVudAorCQkgKiAgYW5kIHVwZGF0aW5nIG9mIHRoZSBTUFEgcHJvZHVjZXIgd2hpY2ggaW52b2x2ZXMgYSBtZW1vcnkKKwkJICogIHJlYWQgYW5kIHdlIHdpbGwgaGF2ZSB0byBwdXQgYSBmdWxsIG1lbW9yeSBiYXJyaWVyIHRoZXJlCisJCSAqICAoaW5zaWRlIGJueDJ4X3NwX3Bvc3QoKSkuCisJCSAqLworCisJCS8qIFNlbmQgYSByYW1yb2QgKi8KKwkJcmMgPSBibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9NVUxUSUNBU1RfUlVMRVMsCisJCQkJICAgcmF3LT5jaWQsIFU2NF9ISShyYXctPnJkYXRhX21hcHBpbmcpLAorCQkJCSAgIFU2NF9MTyhyYXctPnJkYXRhX21hcHBpbmcpLAorCQkJCSAgIEVUSF9DT05ORUNUSU9OX1RZUEUpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyogUmFtcm9kIGNvbXBsZXRpb24gaXMgcGVuZGluZyAqLworCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfbWNhc3RfdmFsaWRhdGVfZTFoKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCQkJCSAgICBpbnQgY21kKQoreworCS8qIE1hcmssIHRoYXQgdGhlcmUgaXMgYSB3b3JrIHRvIGRvICovCisJaWYgKChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX0RFTCkgfHwgKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfUkVTVE9SRSkpCisJCXAtPm1jYXN0X2xpc3RfbGVuID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibngyeF9tY2FzdF9yZXZlcnRfZTFoKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCQkJCSAgICAgICBpbnQgb2xkX251bV9iaW5zKQoreworCS8qIERvIG5vdGhpbmcgKi8KK30KKworI2RlZmluZSBCTlgyWF81NzcxMV9TRVRfTUNfRklMVEVSKGZpbHRlciwgYml0KSBcCitkbyB7IFwKKwkoZmlsdGVyKVsoYml0KSA+PiA1XSB8PSAoMSA8PCAoKGJpdCkgJiAweDFmKSk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9tY2FzdF9oZGxfYWRkX2UxaChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQkgICBzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvLAorCQkJCQkgICBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwKKwkJCQkJICAgdTMyICptY19maWx0ZXIpCit7CisJc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSAqbWxpc3RfcG9zOworCWludCBiaXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1saXN0X3BvcywgJnAtPm1jYXN0X2xpc3QsIGxpbmspIHsKKwkJYml0ID0gYm54MnhfbWNhc3RfYmluX2Zyb21fbWFjKG1saXN0X3Bvcy0+bWFjKTsKKwkJQk5YMlhfNTc3MTFfU0VUX01DX0ZJTFRFUihtY19maWx0ZXIsIGJpdCk7CisKKwkJRFAoQk5YMlhfTVNHX1NQLCAiQWJvdXQgdG8gY29uZmlndXJlICIKKwkJCQkgQk5YMlhfTUFDX0ZNVCIgbWNhc3QgTUFDLCBiaW4gJWRcbiIsCisJCQkJIEJOWDJYX01BQ19QUk5fTElTVChtbGlzdF9wb3MtPm1hYyksIGJpdCk7CisKKwkJLyogYm9va2tlZXBpbmcuLi4gKi8KKwkJQklUX1ZFQzY0X1NFVF9CSVQoby0+cmVnaXN0cnkuYXByb3hfbWF0Y2gudmVjLAorCQkJCSAgYml0KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9tY2FzdF9oZGxfcmVzdG9yZV9lMWgoc3RydWN0IGJueDJ4ICpicCwKKwlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvLCBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwKKwl1MzIgKm1jX2ZpbHRlcikKK3sKKwlpbnQgYml0OworCisJZm9yIChiaXQgPSBibngyeF9tY2FzdF9nZXRfbmV4dF9iaW4obywgMCk7CisJICAgICBiaXQgPj0gMDsKKwkgICAgIGJpdCA9IGJueDJ4X21jYXN0X2dldF9uZXh0X2JpbihvLCBiaXQgKyAxKSkgeworCQlCTlgyWF81NzcxMV9TRVRfTUNfRklMVEVSKG1jX2ZpbHRlciwgYml0KTsKKwkJRFAoQk5YMlhfTVNHX1NQLCAiQWJvdXQgdG8gc2V0IGJpbiAlZFxuIiwgYml0KTsKKwl9Cit9CisKKy8qIE9uIDU3NzExIHdlIHdyaXRlIHRoZSBtdWx0aWNhc3QgTUFDcycgYXByb3hpbWF0ZSBtYXRjaAorICogdGFibGUgYnkgZGlyZWN0bHkgaW50byB0aGUgVFNUT1JNJ3MgaW50ZXJuYWwgUkFNLiBTbyB3ZSBkb24ndAorICogcmVhbGx5IG5lZWQgdG8gaGFuZGxlIGFueSB0cmlja3MgdG8gbWFrZSBpdCB3b3JrLgorICovCitzdGF0aWMgaW50IGJueDJ4X21jYXN0X3NldHVwX2UxaChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwKKwkJCQkgaW50IGNtZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvID0gcC0+bWNhc3Rfb2JqOworCXN0cnVjdCBibngyeF9yYXdfb2JqICpyID0gJm8tPnJhdzsKKworCS8qIElmIENMRUFSX09OTFkgaGFzIGJlZW4gcmVxdWVzdGVkIC0gY2xlYXIgdGhlIHJlZ2lzdHJ5CisJICogYW5kIGNsZWFyIGEgcGVuZGluZyBiaXQuCisJICovCisJaWYgKCF0ZXN0X2JpdChSQU1ST0RfRFJWX0NMUl9PTkxZLCAmcC0+cmFtcm9kX2ZsYWdzKSkgeworCQl1MzIgbWNfZmlsdGVyW01DX0hBU0hfU0laRV0gPSB7MH07CisKKwkJLyogU2V0IHRoZSBtdWx0aWNhc3QgZmlsdGVyIGJpdHMgYmVmb3JlIHdyaXRpbmcgaXQgaW50bworCQkgKiB0aGUgaW50ZXJuYWwgbWVtb3J5LgorCQkgKi8KKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBCTlgyWF9NQ0FTVF9DTURfQUREOgorCQkJYm54MnhfbWNhc3RfaGRsX2FkZF9lMWgoYnAsIG8sIHAsIG1jX2ZpbHRlcik7CisJCQlicmVhazsKKworCQljYXNlIEJOWDJYX01DQVNUX0NNRF9ERUw6CisJCQlEUChCTlgyWF9NU0dfU1AsICJJbnZhbGlkYXRpbmcgbXVsdGljYXN0ICIKKwkJCQkJICJNQUNzIGNvbmZpZ3VyYXRpb25cbiIpOworCisJCQkvKiBjbGVhciB0aGUgcmVnaXN0cnkgKi8KKwkJCW1lbXNldChvLT5yZWdpc3RyeS5hcHJveF9tYXRjaC52ZWMsIDAsCisJCQkgICAgICAgc2l6ZW9mKG8tPnJlZ2lzdHJ5LmFwcm94X21hdGNoLnZlYykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCTlgyWF9NQ0FTVF9DTURfUkVTVE9SRToKKwkJCWJueDJ4X21jYXN0X2hkbF9yZXN0b3JlX2UxaChicCwgbywgcCwgbWNfZmlsdGVyKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCTlgyWF9FUlIoIlVua25vd24gY29tbWFuZDogJWRcbiIsIGNtZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIFNldCB0aGUgbWNhc3QgZmlsdGVyIGluIHRoZSBpbnRlcm5hbCBtZW1vcnkgKi8KKwkJZm9yIChpID0gMDsgaSA8IE1DX0hBU0hfU0laRTsgaSsrKQorCQkJUkVHX1dSKGJwLCBNQ19IQVNIX09GRlNFVChicCwgaSksIG1jX2ZpbHRlcltpXSk7CisJfSBlbHNlCisJCS8qIGNsZWFyIHRoZSByZWdpc3RyeSAqLworCQltZW1zZXQoby0+cmVnaXN0cnkuYXByb3hfbWF0Y2gudmVjLCAwLAorCQkgICAgICAgc2l6ZW9mKG8tPnJlZ2lzdHJ5LmFwcm94X21hdGNoLnZlYykpOworCisJLyogV2UgYXJlIGRvbmUgKi8KKwlyLT5jbGVhcl9wZW5kaW5nKHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfbWNhc3RfdmFsaWRhdGVfZTEoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwKKwkJCQkgICBpbnQgY21kKQoreworCXN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8gPSBwLT5tY2FzdF9vYmo7CisJaW50IHJlZ19zeiA9IG8tPmdldF9yZWdpc3RyeV9zaXplKG8pOworCisJc3dpdGNoIChjbWQpIHsKKwkvKiBERUwgY29tbWFuZCBkZWxldGVzIGFsbCBjdXJyZW50bHkgY29uZmlndXJlZCBNQUNzICovCisJY2FzZSBCTlgyWF9NQ0FTVF9DTURfREVMOgorCQlvLT5zZXRfcmVnaXN0cnlfc2l6ZShvLCAwKTsKKwkJLyogRG9uJ3QgYnJlYWsgKi8KKworCS8qIFJFU1RPUkUgY29tbWFuZCB3aWxsIHJlc3RvcmUgdGhlIGVudGlyZSBtdWx0aWNhc3QgY29uZmlndXJhdGlvbiAqLworCWNhc2UgQk5YMlhfTUNBU1RfQ01EX1JFU1RPUkU6CisJCXAtPm1jYXN0X2xpc3RfbGVuID0gcmVnX3N6OworCQkgIERQKEJOWDJYX01TR19TUCwgIkNvbW1hbmQgJWQsIHAtPm1jYXN0X2xpc3RfbGVuPSVkXG4iLAorCQkJCSAgIGNtZCwgcC0+bWNhc3RfbGlzdF9sZW4pOworCQlicmVhazsKKworCWNhc2UgQk5YMlhfTUNBU1RfQ01EX0FERDoKKwljYXNlIEJOWDJYX01DQVNUX0NNRF9DT05UOgorCQkvKiBNdWx0aWNhc3QgTUFDcyBvbiA1NzcxMCBhcmUgY29uZmlndXJlZCBhcyB1bmljYXN0IE1BQ3MgYW5kCisJCSAqIHRoZXJlIGlzIG9ubHkgYSBsaW1pdGVkIG51bWJlciBvZiBDQU0gZW50cmllcyBmb3IgdGhhdAorCQkgKiBtYXR0ZXIuCisJCSAqLworCQlpZiAocC0+bWNhc3RfbGlzdF9sZW4gPiBvLT5tYXhfY21kX2xlbikgeworCQkJQk5YMlhfRVJSKCJDYW4ndCBjb25maWd1cmUgbW9yZSB0aGFuICVkIG11bHRpY2FzdCBNQUNzIgorCQkJCSAgICJvbiA1NzcxMFxuIiwgby0+bWF4X2NtZF9sZW4pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogRXZlcnkgY29uZmlndXJlZCBNQUMgc2hvdWxkIGJlIGNsZWFyZWQgaWYgREVMIGNvbW1hbmQgaXMKKwkJICogY2FsbGVkLiBPbmx5IHRoZSBsYXN0IEFERCBjb21tYW5kIGlzIHJlbGV2YW50IGFzIGxvbmcgYXMKKwkJICogZXZlcnkgQUREIGNvbW1hbmRzIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgY29uZmlndXJhdGlvbi4KKwkJICovCisJCURQKEJOWDJYX01TR19TUCwgInAtPm1jYXN0X2xpc3RfbGVuPSVkXG4iLCBwLT5tY2FzdF9saXN0X2xlbik7CisJCWlmIChwLT5tY2FzdF9saXN0X2xlbiA+IDApCisJCQlvLT5zZXRfcmVnaXN0cnlfc2l6ZShvLCBwLT5tY2FzdF9saXN0X2xlbik7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCTlgyWF9FUlIoIlVua25vd24gY29tbWFuZDogJWRcbiIsIGNtZCk7CisJCXJldHVybiAtRUlOVkFMOworCisJfQorCisJLyogV2Ugd2FudCB0byBlbnN1cmUgdGhhdCBjb21tYW5kcyBhcmUgZXhlY3V0ZWQgb25lIGJ5IG9uZSBmb3IgNTc3MTAuCisJICogVGhlcmVmb3JlIGVhY2ggbm9uZS1lbXB0eSBjb21tYW5kIHdpbGwgY29uc3VtZSBvLT5tYXhfY21kX2xlbi4KKwkgKi8KKwlpZiAocC0+bWNhc3RfbGlzdF9sZW4pCisJCW8tPnRvdGFsX3BlbmRpbmdfbnVtICs9IG8tPm1heF9jbWRfbGVuOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X21jYXN0X3JldmVydF9lMShzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCQkJCSAgICAgIGludCBvbGRfbnVtX21hY3MpCit7CisJc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbyA9IHAtPm1jYXN0X29iajsKKworCW8tPnNldF9yZWdpc3RyeV9zaXplKG8sIG9sZF9udW1fbWFjcyk7CisKKwkvKiBJZiBjdXJyZW50IGNvbW1hbmQgaGFzbid0IGJlZW4gaGFuZGxlZCB5ZXQgYW5kIHdlIGFyZQorCSAqIGhlcmUgbWVhbnMgdGhhdCBpdCdzIG1lYW50IHRvIGJlIGRyb3BwZWQgYW5kIHdlIGhhdmUgdG8KKwkgKiB1cGRhdGUgdGhlIG51bWJlciBvZiBvdXRzdGFuZGxpbmcgTUFDcyBhY2NvcmRpbmdseS4KKwkgKi8KKwlpZiAocC0+bWNhc3RfbGlzdF9sZW4pCisJCW8tPnRvdGFsX3BlbmRpbmdfbnVtIC09IG8tPm1heF9jbWRfbGVuOworfQorCitzdGF0aWMgdm9pZCBibngyeF9tY2FzdF9zZXRfb25lX3J1bGVfZTEoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbywgaW50IGlkeCwKKwkJCQkJdW5pb24gYm54MnhfbWNhc3RfY29uZmlnX2RhdGEgKmNmZ19kYXRhLAorCQkJCQlpbnQgY21kKQoreworCXN0cnVjdCBibngyeF9yYXdfb2JqICpyID0gJm8tPnJhdzsKKwlzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICpkYXRhID0KKwkJKHN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKikoci0+cmRhdGEpOworCisJLyogY29weSBtYWMgKi8KKwlpZiAoKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfQUREKSB8fCAoY21kID09IEJOWDJYX01DQVNUX0NNRF9SRVNUT1JFKSkgeworCQlibngyeF9zZXRfZndfbWFjX2FkZHIoJmRhdGEtPmNvbmZpZ190YWJsZVtpZHhdLm1zYl9tYWNfYWRkciwKKwkJCQkgICAgICAmZGF0YS0+Y29uZmlnX3RhYmxlW2lkeF0ubWlkZGxlX21hY19hZGRyLAorCQkJCSAgICAgICZkYXRhLT5jb25maWdfdGFibGVbaWR4XS5sc2JfbWFjX2FkZHIsCisJCQkJICAgICAgY2ZnX2RhdGEtPm1hYyk7CisKKwkJZGF0YS0+Y29uZmlnX3RhYmxlW2lkeF0udmxhbl9pZCA9IDA7CisJCWRhdGEtPmNvbmZpZ190YWJsZVtpZHhdLnBmX2lkID0gci0+ZnVuY19pZDsKKwkJZGF0YS0+Y29uZmlnX3RhYmxlW2lkeF0uY2xpZW50c19iaXRfdmVjdG9yID0KKwkJCWNwdV90b19sZTMyKDEgPDwgci0+Y2xfaWQpOworCisJCVNFVF9GTEFHKGRhdGEtPmNvbmZpZ190YWJsZVtpZHhdLmZsYWdzLAorCQkJIE1BQ19DT05GSUdVUkFUSU9OX0VOVFJZX0FDVElPTl9UWVBFLAorCQkJIFRfRVRIX01BQ19DT01NQU5EX1NFVCk7CisJfQorfQorCisvKioKKyAqIGJueDJ4X21jYXN0X3NldF9yZGF0YV9oZHJfZTEgIC0gc2V0IGhlYWRlciB2YWx1ZXMgaW4gbWFjX2NvbmZpZ3VyYXRpb25fY21kCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQHA6CisgKiBAbGVuOgludW1iZXIgb2YgcnVsZXMgdG8gaGFuZGxlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9tY2FzdF9zZXRfcmRhdGFfaGRyX2UxKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCXN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCQkJCQl1OCBsZW4pCit7CisJc3RydWN0IGJueDJ4X3Jhd19vYmogKnIgPSAmcC0+bWNhc3Rfb2JqLT5yYXc7CisJc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2NtZCAqZGF0YSA9CisJCShzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICopKHItPnJkYXRhKTsKKworCXU4IG9mZnNldCA9IChDSElQX1JFVl9JU19TTE9XKGJwKSA/CisJCSAgICAgQk5YMlhfTUFYX0VNVUxfTVVMVEkqKDEgKyByLT5mdW5jX2lkKSA6CisJCSAgICAgQk5YMlhfTUFYX01VTFRJQ0FTVCooMSArIHItPmZ1bmNfaWQpKTsKKworCWRhdGEtPmhkci5vZmZzZXQgPSBvZmZzZXQ7CisJZGF0YS0+aGRyLmNsaWVudF9pZCA9IDB4ZmY7CisJZGF0YS0+aGRyLmVjaG8gPSAoKHItPmNpZCAmIEJOWDJYX1NXQ0lEX01BU0spIHwKKwkJCSAgKEJOWDJYX0ZJTFRFUl9NQ0FTVF9QRU5ESU5HIDw8IEJOWDJYX1NXQ0lEX1NISUZUKSk7CisJZGF0YS0+aGRyLmxlbmd0aCA9IGxlbjsKK30KKworLyoqCisgKiBibngyeF9tY2FzdF9oYW5kbGVfcmVzdG9yZV9jbWRfZTEgLSByZXN0b3JlIGNvbW1hbmQgZm9yIDU3NzEwCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQG86CisgKiBAc3RhcnRfaWR4OglpbmRleCBpbiB0aGUgcmVnaXN0cnkgdG8gc3RhcnQgZnJvbQorICogQHJkYXRhX2lkeDoJaW5kZXggaW4gdGhlIHJhbXJvZCBkYXRhIHRvIHN0YXJ0IGZyb20KKyAqCisgKiByZXN0b3JlIGNvbW1hbmQgZm9yIDU3NzEwIGlzIGxpa2UgYWxsIG90aGVyIGNvbW1hbmRzIC0gYWx3YXlzIGEgc3RhbmQgYWxvbmUKKyAqIGNvbW1hbmQgLSBzdGFydF9pZHggYW5kIHJkYXRhX2lkeCB3aWxsIGFsd2F5cyBiZSAwLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzCisgKiBzdWNjZWVkLgorICogcmV0dXJucyAtMSB0byBjb21wbHkgd2l0aCA1NzcxMiB2YXJpYW50LgorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9tY2FzdF9oYW5kbGVfcmVzdG9yZV9jbWRfZTEoCisJc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbyAsIGludCBzdGFydF9pZHgsCisJaW50ICpyZGF0YV9pZHgpCit7CisJc3RydWN0IGJueDJ4X21jYXN0X21hY19lbGVtICplbGVtOworCWludCBpID0gMDsKKwl1bmlvbiBibngyeF9tY2FzdF9jb25maWdfZGF0YSBjZmdfZGF0YSA9IHswfTsKKworCS8qIGdvIHRocm91Z2ggdGhlIHJlZ2lzdHJ5IGFuZCBjb25maWd1cmUgdGhlIE1BQ3MgZnJvbSBpdC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVsZW0sICZvLT5yZWdpc3RyeS5leGFjdF9tYXRjaC5tYWNzLCBsaW5rKSB7CisJCWNmZ19kYXRhLm1hYyA9ICZlbGVtLT5tYWNbMF07CisJCW8tPnNldF9vbmVfcnVsZShicCwgbywgaSwgJmNmZ19kYXRhLCBCTlgyWF9NQ0FTVF9DTURfUkVTVE9SRSk7CisKKwkJaSsrOworCisJCSAgRFAoQk5YMlhfTVNHX1NQLCAiQWJvdXQgdG8gY29uZmlndXJlICJCTlgyWF9NQUNfRk1UCisJCQkJICAgIiBtY2FzdCBNQUNcbiIsCisJCQkJICAgQk5YMlhfTUFDX1BSTl9MSVNUKGNmZ19kYXRhLm1hYykpOworCX0KKworCSpyZGF0YV9pZHggPSBpOworCisJcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X21jYXN0X2hhbmRsZV9wZW5kaW5nX2NtZHNfZTEoCisJc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnApCit7CisJc3RydWN0IGJueDJ4X3BlbmRpbmdfbWNhc3RfY21kICpjbWRfcG9zOworCXN0cnVjdCBibngyeF9tY2FzdF9tYWNfZWxlbSAqcG1hY19wb3M7CisJc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbyA9IHAtPm1jYXN0X29iajsKKwl1bmlvbiBibngyeF9tY2FzdF9jb25maWdfZGF0YSBjZmdfZGF0YSA9IHswfTsKKwlpbnQgY250ID0gMDsKKworCisJLyogSWYgbm90aGluZyB0byBiZSBkb25lIC0gcmV0dXJuICovCisJaWYgKGxpc3RfZW1wdHkoJm8tPnBlbmRpbmdfY21kc19oZWFkKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBIYW5kbGUgdGhlIGZpcnN0IGNvbW1hbmQgKi8KKwljbWRfcG9zID0gbGlzdF9maXJzdF9lbnRyeSgmby0+cGVuZGluZ19jbWRzX2hlYWQsCisJCQkJICAgc3RydWN0IGJueDJ4X3BlbmRpbmdfbWNhc3RfY21kLCBsaW5rKTsKKworCXN3aXRjaCAoY21kX3Bvcy0+dHlwZSkgeworCWNhc2UgQk5YMlhfTUNBU1RfQ01EX0FERDoKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwbWFjX3BvcywgJmNtZF9wb3MtPmRhdGEubWFjc19oZWFkLCBsaW5rKSB7CisJCQljZmdfZGF0YS5tYWMgPSAmcG1hY19wb3MtPm1hY1swXTsKKwkJCW8tPnNldF9vbmVfcnVsZShicCwgbywgY250LCAmY2ZnX2RhdGEsIGNtZF9wb3MtPnR5cGUpOworCisJCQljbnQrKzsKKworCQkJRFAoQk5YMlhfTVNHX1NQLCAiQWJvdXQgdG8gY29uZmlndXJlICJCTlgyWF9NQUNfRk1UCisJCQkJCSAiIG1jYXN0IE1BQ1xuIiwKKwkJCQkJIEJOWDJYX01BQ19QUk5fTElTVChwbWFjX3Bvcy0+bWFjKSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJOWDJYX01DQVNUX0NNRF9ERUw6CisJCWNudCA9IGNtZF9wb3MtPmRhdGEubWFjc19udW07CisJCURQKEJOWDJYX01TR19TUCwgIkFib3V0IHRvIGRlbGV0ZSAlZCBtdWx0aWNhc3QgTUFDc1xuIiwgY250KTsKKwkJYnJlYWs7CisKKwljYXNlIEJOWDJYX01DQVNUX0NNRF9SRVNUT1JFOgorCQlvLT5oZGxfcmVzdG9yZShicCwgbywgMCwgJmNudCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQk5YMlhfRVJSKCJVbmtub3duIGNvbW1hbmQ6ICVkXG4iLCBjbWRfcG9zLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGlzdF9kZWwoJmNtZF9wb3MtPmxpbmspOworCWtmcmVlKGNtZF9wb3MpOworCisJcmV0dXJuIGNudDsKK30KKworLyoqCisgKiBibngyeF9nZXRfZndfbWFjX2FkZHIgLSByZXZlcnQgdGhlIGJueDJ4X3NldF9md19tYWNfYWRkcigpLgorICoKKyAqIEBmd19oaToKKyAqIEBmd19taWQ6CisgKiBAZndfbG86CisgKiBAbWFjOgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfZ2V0X2Z3X21hY19hZGRyKF9fbGUxNiAqZndfaGksIF9fbGUxNiAqZndfbWlkLAorCQkJCQkgX19sZTE2ICpmd19sbywgdTggKm1hYykKK3sKKwltYWNbMV0gPSAoKHU4ICopZndfaGkpWzBdOworCW1hY1swXSA9ICgodTggKilmd19oaSlbMV07CisJbWFjWzNdID0gKCh1OCAqKWZ3X21pZClbMF07CisJbWFjWzJdID0gKCh1OCAqKWZ3X21pZClbMV07CisJbWFjWzVdID0gKCh1OCAqKWZ3X2xvKVswXTsKKwltYWNbNF0gPSAoKHU4ICopZndfbG8pWzFdOworfQorCisvKioKKyAqIGJueDJ4X21jYXN0X3JlZnJlc2hfcmVnaXN0cnlfZTEgLQorICoKKyAqIEBicDoJCWRldmljZSBoYW5kbGUKKyAqIEBjbnQ6CisgKgorICogQ2hlY2sgdGhlIHJhbXJvZCBkYXRhIGZpcnN0IGVudHJ5IGZsYWcgdG8gc2VlIGlmIGl0J3MgYSBERUxFVEUgb3IgQUREIGNvbW1hbmQKKyAqIGFuZCB1cGRhdGUgdGhlIHJlZ2lzdHJ5IGNvcnJlc3BvbmRpbmdseTogaWYgQUREIC0gYWxsb2NhdGUgYSBtZW1vcnkgYW5kIGFkZAorICogdGhlIGVudHJpZXMgdG8gdGhlIHJlZ2lzdHJ5IChsaXN0KSwgaWYgREVMRVRFIC0gY2xlYXIgdGhlIHJlZ2lzdHJ5IGFuZCBmcmVlCisgKiB0aGUgbWVtb3J5LgorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9tY2FzdF9yZWZyZXNoX3JlZ2lzdHJ5X2UxKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCQkgIHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8pCit7CisJc3RydWN0IGJueDJ4X3Jhd19vYmogKnJhdyA9ICZvLT5yYXc7CisJc3RydWN0IGJueDJ4X21jYXN0X21hY19lbGVtICplbGVtOworCXN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKmRhdGEgPQorCQkJKHN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKikocmF3LT5yZGF0YSk7CisKKwkvKiBJZiBmaXJzdCBlbnRyeSBjb250YWlucyBhIFNFVCBiaXQgLSB0aGUgY29tbWFuZCB3YXMgQURELAorCSAqIG90aGVyd2lzZSAtIERFTF9BTEwKKwkgKi8KKwlpZiAoR0VUX0ZMQUcoZGF0YS0+Y29uZmlnX3RhYmxlWzBdLmZsYWdzLAorCQkJTUFDX0NPTkZJR1VSQVRJT05fRU5UUllfQUNUSU9OX1RZUEUpKSB7CisJCWludCBpLCBsZW4gPSBkYXRhLT5oZHIubGVuZ3RoOworCisJCS8qIEJyZWFrIGlmIGl0IHdhcyBhIFJFU1RPUkUgY29tbWFuZCAqLworCQlpZiAoIWxpc3RfZW1wdHkoJm8tPnJlZ2lzdHJ5LmV4YWN0X21hdGNoLm1hY3MpKQorCQkJcmV0dXJuIDA7CisKKwkJZWxlbSA9IGt6YWxsb2Moc2l6ZW9mKCplbGVtKSpsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoIWVsZW0pIHsKKwkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdHJ5IG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgZWxlbSsrKSB7CisJCQlibngyeF9nZXRfZndfbWFjX2FkZHIoCisJCQkJJmRhdGEtPmNvbmZpZ190YWJsZVtpXS5tc2JfbWFjX2FkZHIsCisJCQkJJmRhdGEtPmNvbmZpZ190YWJsZVtpXS5taWRkbGVfbWFjX2FkZHIsCisJCQkJJmRhdGEtPmNvbmZpZ190YWJsZVtpXS5sc2JfbWFjX2FkZHIsCisJCQkJZWxlbS0+bWFjKTsKKwkJCURQKEJOWDJYX01TR19TUCwgIkFkZGluZyByZWdpc3RyeSBlbnRyeSBmb3IgWyIKKwkJCQkJIEJOWDJYX01BQ19GTVQiXVxuIiwKKwkJCQkgICBCTlgyWF9NQUNfUFJOX0xJU1QoZWxlbS0+bWFjKSk7CisJCQlsaXN0X2FkZF90YWlsKCZlbGVtLT5saW5rLAorCQkJCSAgICAgICZvLT5yZWdpc3RyeS5leGFjdF9tYXRjaC5tYWNzKTsKKwkJfQorCX0gZWxzZSB7CisJCWVsZW0gPSBsaXN0X2ZpcnN0X2VudHJ5KCZvLT5yZWdpc3RyeS5leGFjdF9tYXRjaC5tYWNzLAorCQkJCQlzdHJ1Y3QgYm54MnhfbWNhc3RfbWFjX2VsZW0sIGxpbmspOworCQlEUChCTlgyWF9NU0dfU1AsICJEZWxldGluZyBhIHJlZ2lzdHJ5XG4iKTsKKwkJa2ZyZWUoZWxlbSk7CisJCUlOSVRfTElTVF9IRUFEKCZvLT5yZWdpc3RyeS5leGFjdF9tYXRjaC5tYWNzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibngyeF9tY2FzdF9zZXR1cF9lMShzdHJ1Y3QgYm54MnggKmJwLAorCQkJCXN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCQkJCWludCBjbWQpCit7CisJc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbyA9IHAtPm1jYXN0X29iajsKKwlzdHJ1Y3QgYm54MnhfcmF3X29iaiAqcmF3ID0gJm8tPnJhdzsKKwlzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25fY21kICpkYXRhID0KKwkJKHN0cnVjdCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKikocmF3LT5yZGF0YSk7CisJaW50IGNudCA9IDAsIGksIHJjOworCisJLyogUmVzZXQgdGhlIHJhbXJvZCBkYXRhIGJ1ZmZlciAqLworCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKworCS8qIEZpcnN0IHNldCBhbGwgZW50cmllcyBhcyBpbnZhbGlkICovCisJZm9yIChpID0gMDsgaSA8IG8tPm1heF9jbWRfbGVuIDsgaSsrKQorCQlTRVRfRkxBRyhkYXRhLT5jb25maWdfdGFibGVbaV0uZmxhZ3MsCisJCQkgTUFDX0NPTkZJR1VSQVRJT05fRU5UUllfQUNUSU9OX1RZUEUsCisJCQkgVF9FVEhfTUFDX0NPTU1BTkRfSU5WQUxJREFURSk7CisKKwkvKiBIYW5kbGUgcGVuZGluZyBjb21tYW5kcyBmaXJzdCAqLworCWNudCA9IGJueDJ4X21jYXN0X2hhbmRsZV9wZW5kaW5nX2NtZHNfZTEoYnAsIHApOworCisJLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgcGVuZGluZyBjb21tYW5kcyAtIGNsZWFyIFNDSEVEVUxFRCBzdGF0ZSAqLworCWlmIChsaXN0X2VtcHR5KCZvLT5wZW5kaW5nX2NtZHNfaGVhZCkpCisJCW8tPmNsZWFyX3NjaGVkKG8pOworCisJLyogVGhlIGJlbG93IG1heSBiZSB0cnVlIGlmZiB0aGVyZSB3ZXJlIG5vIHBlbmRpbmcgY29tbWFuZHMgKi8KKwlpZiAoIWNudCkKKwkJY250ID0gYm54MnhfbWNhc3RfaGFuZGxlX2N1cnJlbnRfY21kKGJwLCBwLCBjbWQsIDApOworCisJLyogRm9yIDU3NzEwIGV2ZXJ5IGNvbW1hbmQgaGFzIG8tPm1heF9jbWRfbGVuIGxlbmd0aCB0byBlbnN1cmUgdGhhdAorCSAqIGNvbW1hbmRzIGFyZSBkb25lIG9uZSBhdCBhIHRpbWUuCisJICovCisJby0+dG90YWxfcGVuZGluZ19udW0gLT0gby0+bWF4X2NtZF9sZW47CisKKwkvKiBzZW5kIGEgcmFtcm9kICovCisKKwlXQVJOX09OKGNudCA+IG8tPm1heF9jbWRfbGVuKTsKKworCS8qIFNldCByYW1yb2QgaGVhZGVyIChpbiBwYXJ0aWN1bGFyLCBhIG51bWJlciBvZiBlbnRyaWVzIHRvIHVwZGF0ZSkgKi8KKwlibngyeF9tY2FzdF9zZXRfcmRhdGFfaGRyX2UxKGJwLCBwLCAodTgpY250KTsKKworCS8qIHVwZGF0ZSBhIHJlZ2lzdHJ5OiB3ZSBuZWVkIHRoZSByZWdpc3RyeSBjb250ZW50cyB0byBiZSBhbHdheXMgdXAKKwkgKiB0byBkYXRlIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gZXhlY3V0ZSBhIFJFU1RPUkUgb3Bjb2RlLiBIZXJlCisJICogd2UgdXNlIHRoZSBmYWN0IHRoYXQgZm9yIDU3NzEwIHdlIHNlbnQgb25lIGNvbW1hbmQgYXQgYSB0aW1lCisJICogaGVuY2Ugd2UgbWF5IHRha2UgdGhlIHJlZ2lzdHJ5IHVwZGF0ZSBvdXQgb2YgdGhlIGNvbW1hbmQgaGFuZGxpbmcKKwkgKiBhbmQgZG8gaXQgaW4gYSBzaW1wbGVyIHdheSBoZXJlLgorCSAqLworCXJjID0gYm54MnhfbWNhc3RfcmVmcmVzaF9yZWdpc3RyeV9lMShicCwgbyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKgorCSAqIElmIENMRUFSX09OTFkgd2FzIHJlcXVlc3RlZCAtIGRvbid0IHNlbmQgYSByYW1yb2QgYW5kIGNsZWFyCisJICogUkFNUk9EX1BFTkRJTkcgc3RhdHVzIGltbWVkaWF0ZWx5LgorCSAqLworCWlmICh0ZXN0X2JpdChSQU1ST0RfRFJWX0NMUl9PTkxZLCAmcC0+cmFtcm9kX2ZsYWdzKSkgeworCQlyYXctPmNsZWFyX3BlbmRpbmcocmF3KTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogIE5vIG5lZWQgZm9yIGFuIGV4cGxpY2l0IG1lbW9yeSBiYXJyaWVyIGhlcmUgYXMgbG9uZyB3ZSB3b3VsZAorCQkgKiAgbmVlZCB0byBlbnN1cmUgdGhlIG9yZGVyaW5nIG9mIHdyaXRpbmcgdG8gdGhlIFNQUSBlbGVtZW50CisJCSAqICBhbmQgdXBkYXRpbmcgb2YgdGhlIFNQUSBwcm9kdWNlciB3aGljaCBpbnZvbHZlcyBhIG1lbW9yeQorCQkgKiAgcmVhZCBhbmQgd2Ugd2lsbCBoYXZlIHRvIHB1dCBhIGZ1bGwgbWVtb3J5IGJhcnJpZXIgdGhlcmUKKwkJICogIChpbnNpZGUgYm54Mnhfc3BfcG9zdCgpKS4KKwkJICovCisKKwkJLyogU2VuZCBhIHJhbXJvZCAqLworCQlyYyA9IGJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX1NFVF9NQUMsIHJhdy0+Y2lkLAorCQkJCSAgIFU2NF9ISShyYXctPnJkYXRhX21hcHBpbmcpLAorCQkJCSAgIFU2NF9MTyhyYXctPnJkYXRhX21hcHBpbmcpLAorCQkJCSAgIEVUSF9DT05ORUNUSU9OX1RZUEUpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyogUmFtcm9kIGNvbXBsZXRpb24gaXMgcGVuZGluZyAqLworCQlyZXR1cm4gMTsKKwl9CisKK30KKworc3RhdGljIGludCBibngyeF9tY2FzdF9nZXRfcmVnaXN0cnlfc2l6ZV9leGFjdChzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvKQoreworCXJldHVybiBvLT5yZWdpc3RyeS5leGFjdF9tYXRjaC5udW1fbWFjc19zZXQ7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfbWNhc3RfZ2V0X3JlZ2lzdHJ5X3NpemVfYXByb3goc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbykKK3sKKwlyZXR1cm4gby0+cmVnaXN0cnkuYXByb3hfbWF0Y2gubnVtX2JpbnNfc2V0OworfQorCitzdGF0aWMgdm9pZCBibngyeF9tY2FzdF9zZXRfcmVnaXN0cnlfc2l6ZV9leGFjdChzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvLAorCQkJCQkJaW50IG4pCit7CisJby0+cmVnaXN0cnkuZXhhY3RfbWF0Y2gubnVtX21hY3Nfc2V0ID0gbjsKK30KKworc3RhdGljIHZvaWQgYm54MnhfbWNhc3Rfc2V0X3JlZ2lzdHJ5X3NpemVfYXByb3goc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbywKKwkJCQkJCWludCBuKQoreworCW8tPnJlZ2lzdHJ5LmFwcm94X21hdGNoLm51bV9iaW5zX3NldCA9IG47Cit9CisKK2ludCBibngyeF9jb25maWdfbWNhc3Qoc3RydWN0IGJueDJ4ICpicCwKKwkJICAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCQkgICAgICAgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvID0gcC0+bWNhc3Rfb2JqOworCXN0cnVjdCBibngyeF9yYXdfb2JqICpyID0gJm8tPnJhdzsKKwlpbnQgcmMgPSAwLCBvbGRfcmVnX3NpemU7CisKKwkvKiBUaGlzIGlzIG5lZWRlZCB0byByZWNvdmVyIG51bWJlciBvZiBjdXJyZW50bHkgY29uZmlndXJlZCBtY2FzdCBtYWNzCisJICogaW4gY2FzZSBvZiBmYWlsdXJlLgorCSAqLworCW9sZF9yZWdfc2l6ZSA9IG8tPmdldF9yZWdpc3RyeV9zaXplKG8pOworCisJLyogRG8gc29tZSBjYWxjdWxhdGlvbnMgYW5kIGNoZWNrcyAqLworCXJjID0gby0+dmFsaWRhdGUoYnAsIHAsIGNtZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBSZXR1cm4gaWYgdGhlcmUgaXMgbm8gd29yayB0byBkbyAqLworCWlmICgoIXAtPm1jYXN0X2xpc3RfbGVuKSAmJiAoIW8tPmNoZWNrX3NjaGVkKG8pKSkKKwkJcmV0dXJuIDA7CisKKwlEUChCTlgyWF9NU0dfU1AsICJvLT50b3RhbF9wZW5kaW5nX251bT0lZCBwLT5tY2FzdF9saXN0X2xlbj0lZCAiCisJCQkgIm8tPm1heF9jbWRfbGVuPSVkXG4iLCBvLT50b3RhbF9wZW5kaW5nX251bSwKKwkJCSBwLT5tY2FzdF9saXN0X2xlbiwgby0+bWF4X2NtZF9sZW4pOworCisJLyogRW5xdWV1ZSB0aGUgY3VycmVudCBjb21tYW5kIHRvIHRoZSBwZW5kaW5nIGxpc3QgaWYgd2UgY2FuJ3QgY29tcGxldGUKKwkgKiBpdCBpbiB0aGUgY3VycmVudCBpdGVyYXRpb24KKwkgKi8KKwlpZiAoci0+Y2hlY2tfcGVuZGluZyhyKSB8fAorCSAgICAoKG8tPm1heF9jbWRfbGVuID4gMCkgJiYgKG8tPnRvdGFsX3BlbmRpbmdfbnVtID4gby0+bWF4X2NtZF9sZW4pKSkgeworCQlyYyA9IG8tPmVucXVldWVfY21kKGJwLCBwLT5tY2FzdF9vYmosIHAsIGNtZCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGVycm9yX2V4aXQxOworCisJCS8qIEFzIGxvbmcgYXMgdGhlIGN1cnJlbnQgY29tbWFuZCBpcyBpbiBhIGNvbW1hbmQgbGlzdCB3ZQorCQkgKiBkb24ndCBuZWVkIHRvIGhhbmRsZSBpdCBzZXBhcmF0ZWx5LgorCQkgKi8KKwkJcC0+bWNhc3RfbGlzdF9sZW4gPSAwOworCX0KKworCWlmICghci0+Y2hlY2tfcGVuZGluZyhyKSkgeworCisJCS8qIFNldCAncGVuZGluZycgc3RhdGUgKi8KKwkJci0+c2V0X3BlbmRpbmcocik7CisKKwkJLyogQ29uZmlndXJlIHRoZSBuZXcgY2xhc3NpZmljYXRpb24gaW4gdGhlIGNoaXAgKi8KKwkJcmMgPSBvLT5jb25maWdfbWNhc3QoYnAsIHAsIGNtZCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGVycm9yX2V4aXQyOworCisJCS8qIFdhaXQgZm9yIGEgcmFtcm9kIGNvbXBsZXRpb24gaWYgd2FzIHJlcXVlc3RlZCAqLworCQlpZiAodGVzdF9iaXQoUkFNUk9EX0NPTVBfV0FJVCwgJnAtPnJhbXJvZF9mbGFncykpCisJCQlyYyA9IG8tPndhaXRfY29tcChicCwgbyk7CisJfQorCisJcmV0dXJuIHJjOworCitlcnJvcl9leGl0MjoKKwlyLT5jbGVhcl9wZW5kaW5nKHIpOworCitlcnJvcl9leGl0MToKKwlvLT5yZXZlcnQoYnAsIHAsIG9sZF9yZWdfc2l6ZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X21jYXN0X2NsZWFyX3NjaGVkKHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8pCit7CisJc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCk7CisJY2xlYXJfYml0KG8tPnNjaGVkX3N0YXRlLCBvLT5yYXcucHN0YXRlKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9tY2FzdF9zZXRfc2NoZWQoc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbykKK3sKKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwlzZXRfYml0KG8tPnNjaGVkX3N0YXRlLCBvLT5yYXcucHN0YXRlKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworfQorCitzdGF0aWMgYm9vbCBibngyeF9tY2FzdF9jaGVja19zY2hlZChzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvKQoreworCXJldHVybiAhIXRlc3RfYml0KG8tPnNjaGVkX3N0YXRlLCBvLT5yYXcucHN0YXRlKTsKK30KKworc3RhdGljIGJvb2wgYm54MnhfbWNhc3RfY2hlY2tfcGVuZGluZyhzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvKQoreworCXJldHVybiBvLT5yYXcuY2hlY2tfcGVuZGluZygmby0+cmF3KSB8fCBvLT5jaGVja19zY2hlZChvKTsKK30KKwordm9pZCBibngyeF9pbml0X21jYXN0X29iaihzdHJ1Y3QgYm54MnggKmJwLAorCQkJICBzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICptY2FzdF9vYmosCisJCQkgIHU4IG1jYXN0X2NsX2lkLCB1MzIgbWNhc3RfY2lkLCB1OCBmdW5jX2lkLAorCQkJICB1OCBlbmdpbmVfaWQsIHZvaWQgKnJkYXRhLCBkbWFfYWRkcl90IHJkYXRhX21hcHBpbmcsCisJCQkgIGludCBzdGF0ZSwgdW5zaWduZWQgbG9uZyAqcHN0YXRlLCBibngyeF9vYmpfdHlwZSB0eXBlKQoreworCW1lbXNldChtY2FzdF9vYmosIDAsIHNpemVvZigqbWNhc3Rfb2JqKSk7CisKKwlibngyeF9pbml0X3Jhd19vYmooJm1jYXN0X29iai0+cmF3LCBtY2FzdF9jbF9pZCwgbWNhc3RfY2lkLCBmdW5jX2lkLAorCQkJICAgcmRhdGEsIHJkYXRhX21hcHBpbmcsIHN0YXRlLCBwc3RhdGUsIHR5cGUpOworCisJbWNhc3Rfb2JqLT5lbmdpbmVfaWQgPSBlbmdpbmVfaWQ7CisKKwlJTklUX0xJU1RfSEVBRCgmbWNhc3Rfb2JqLT5wZW5kaW5nX2NtZHNfaGVhZCk7CisKKwltY2FzdF9vYmotPnNjaGVkX3N0YXRlID0gQk5YMlhfRklMVEVSX01DQVNUX1NDSEVEOworCW1jYXN0X29iai0+Y2hlY2tfc2NoZWQgPSBibngyeF9tY2FzdF9jaGVja19zY2hlZDsKKwltY2FzdF9vYmotPnNldF9zY2hlZCA9IGJueDJ4X21jYXN0X3NldF9zY2hlZDsKKwltY2FzdF9vYmotPmNsZWFyX3NjaGVkID0gYm54MnhfbWNhc3RfY2xlYXJfc2NoZWQ7CisKKwlpZiAoQ0hJUF9JU19FMShicCkpIHsKKwkJbWNhc3Rfb2JqLT5jb25maWdfbWNhc3QgICAgICA9IGJueDJ4X21jYXN0X3NldHVwX2UxOworCQltY2FzdF9vYmotPmVucXVldWVfY21kICAgICAgID0gYm54MnhfbWNhc3RfZW5xdWV1ZV9jbWQ7CisJCW1jYXN0X29iai0+aGRsX3Jlc3RvcmUgICAgICAgPQorCQkJYm54MnhfbWNhc3RfaGFuZGxlX3Jlc3RvcmVfY21kX2UxOworCQltY2FzdF9vYmotPmNoZWNrX3BlbmRpbmcgICAgID0gYm54MnhfbWNhc3RfY2hlY2tfcGVuZGluZzsKKworCQlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkpCisJCQltY2FzdF9vYmotPm1heF9jbWRfbGVuID0gQk5YMlhfTUFYX0VNVUxfTVVMVEk7CisJCWVsc2UKKwkJCW1jYXN0X29iai0+bWF4X2NtZF9sZW4gPSBCTlgyWF9NQVhfTVVMVElDQVNUOworCisJCW1jYXN0X29iai0+d2FpdF9jb21wICAgICAgICAgPSBibngyeF9tY2FzdF93YWl0OworCQltY2FzdF9vYmotPnNldF9vbmVfcnVsZSAgICAgID0gYm54MnhfbWNhc3Rfc2V0X29uZV9ydWxlX2UxOworCQltY2FzdF9vYmotPnZhbGlkYXRlICAgICAgICAgID0gYm54MnhfbWNhc3RfdmFsaWRhdGVfZTE7CisJCW1jYXN0X29iai0+cmV2ZXJ0ICAgICAgICAgICAgPSBibngyeF9tY2FzdF9yZXZlcnRfZTE7CisJCW1jYXN0X29iai0+Z2V0X3JlZ2lzdHJ5X3NpemUgPQorCQkJYm54MnhfbWNhc3RfZ2V0X3JlZ2lzdHJ5X3NpemVfZXhhY3Q7CisJCW1jYXN0X29iai0+c2V0X3JlZ2lzdHJ5X3NpemUgPQorCQkJYm54MnhfbWNhc3Rfc2V0X3JlZ2lzdHJ5X3NpemVfZXhhY3Q7CisKKwkJLyogNTc3MTAgaXMgdGhlIG9ubHkgY2hpcCB0aGF0IHVzZXMgdGhlIGV4YWN0IG1hdGNoIGZvciBtY2FzdAorCQkgKiBhdCB0aGUgbW9tZW50LgorCQkgKi8KKwkJSU5JVF9MSVNUX0hFQUQoJm1jYXN0X29iai0+cmVnaXN0cnkuZXhhY3RfbWF0Y2gubWFjcyk7CisKKwl9IGVsc2UgaWYgKENISVBfSVNfRTFIKGJwKSkgeworCQltY2FzdF9vYmotPmNvbmZpZ19tY2FzdCAgPSBibngyeF9tY2FzdF9zZXR1cF9lMWg7CisJCW1jYXN0X29iai0+ZW5xdWV1ZV9jbWQgICA9IE5VTEw7CisJCW1jYXN0X29iai0+aGRsX3Jlc3RvcmUgICA9IE5VTEw7CisJCW1jYXN0X29iai0+Y2hlY2tfcGVuZGluZyA9IGJueDJ4X21jYXN0X2NoZWNrX3BlbmRpbmc7CisKKwkJLyogNTc3MTEgZG9lc24ndCBzZW5kIGEgcmFtcm9kLCBzbyBpdCBoYXMgdW5saW1pdGVkIGNyZWRpdAorCQkgKiBmb3Igb25lIGNvbW1hbmQuCisJCSAqLworCQltY2FzdF9vYmotPm1heF9jbWRfbGVuICAgICAgID0gLTE7CisJCW1jYXN0X29iai0+d2FpdF9jb21wICAgICAgICAgPSBibngyeF9tY2FzdF93YWl0OworCQltY2FzdF9vYmotPnNldF9vbmVfcnVsZSAgICAgID0gTlVMTDsKKwkJbWNhc3Rfb2JqLT52YWxpZGF0ZSAgICAgICAgICA9IGJueDJ4X21jYXN0X3ZhbGlkYXRlX2UxaDsKKwkJbWNhc3Rfb2JqLT5yZXZlcnQgICAgICAgICAgICA9IGJueDJ4X21jYXN0X3JldmVydF9lMWg7CisJCW1jYXN0X29iai0+Z2V0X3JlZ2lzdHJ5X3NpemUgPQorCQkJYm54MnhfbWNhc3RfZ2V0X3JlZ2lzdHJ5X3NpemVfYXByb3g7CisJCW1jYXN0X29iai0+c2V0X3JlZ2lzdHJ5X3NpemUgPQorCQkJYm54MnhfbWNhc3Rfc2V0X3JlZ2lzdHJ5X3NpemVfYXByb3g7CisJfSBlbHNlIHsKKwkJbWNhc3Rfb2JqLT5jb25maWdfbWNhc3QgICAgICA9IGJueDJ4X21jYXN0X3NldHVwX2UyOworCQltY2FzdF9vYmotPmVucXVldWVfY21kICAgICAgID0gYm54MnhfbWNhc3RfZW5xdWV1ZV9jbWQ7CisJCW1jYXN0X29iai0+aGRsX3Jlc3RvcmUgICAgICAgPQorCQkJYm54MnhfbWNhc3RfaGFuZGxlX3Jlc3RvcmVfY21kX2UyOworCQltY2FzdF9vYmotPmNoZWNrX3BlbmRpbmcgICAgID0gYm54MnhfbWNhc3RfY2hlY2tfcGVuZGluZzsKKwkJLyogVE9ETzogVGhlcmUgc2hvdWxkIGJlIGEgcHJvcGVyIEhTSSBkZWZpbmUgZm9yIHRoaXMgbnVtYmVyISEhCisJCSAqLworCQltY2FzdF9vYmotPm1heF9jbWRfbGVuICAgICAgID0gMTY7CisJCW1jYXN0X29iai0+d2FpdF9jb21wICAgICAgICAgPSBibngyeF9tY2FzdF93YWl0OworCQltY2FzdF9vYmotPnNldF9vbmVfcnVsZSAgICAgID0gYm54MnhfbWNhc3Rfc2V0X29uZV9ydWxlX2UyOworCQltY2FzdF9vYmotPnZhbGlkYXRlICAgICAgICAgID0gYm54MnhfbWNhc3RfdmFsaWRhdGVfZTI7CisJCW1jYXN0X29iai0+cmV2ZXJ0ICAgICAgICAgICAgPSBibngyeF9tY2FzdF9yZXZlcnRfZTI7CisJCW1jYXN0X29iai0+Z2V0X3JlZ2lzdHJ5X3NpemUgPQorCQkJYm54MnhfbWNhc3RfZ2V0X3JlZ2lzdHJ5X3NpemVfYXByb3g7CisJCW1jYXN0X29iai0+c2V0X3JlZ2lzdHJ5X3NpemUgPQorCQkJYm54MnhfbWNhc3Rfc2V0X3JlZ2lzdHJ5X3NpemVfYXByb3g7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIENyZWRpdCBoYW5kbGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIGF0b21pY19hZGRfaWZsZXNzIC0gYWRkIGlmIHRoZSByZXN1bHQgaXMgbGVzcyB0aGFuIGEgZ2l2ZW4gdmFsdWUuCisgKgorICogQHY6CXBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogQGE6CXRoZSBhbW91bnQgdG8gYWRkIHRvIHYuLi4KKyAqIEB1OgkuLi5pZiAodiArIGEpIGlzIGxlc3MgdGhhbiB1LgorICoKKyAqIHJldHVybnMgdHJ1ZSBpZiAodiArIGEpIHdhcyBsZXNzIHRoYW4gdSwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2F0b21pY19hZGRfaWZsZXNzKGF0b21pY190ICp2LCBpbnQgYSwgaW50IHUpCit7CisJaW50IGMsIG9sZDsKKworCWMgPSBhdG9taWNfcmVhZCh2KTsKKwlmb3IgKDs7KSB7CisJCWlmICh1bmxpa2VseShjICsgYSA+PSB1KSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlvbGQgPSBhdG9taWNfY21weGNoZygodiksIGMsIGMgKyBhKTsKKwkJaWYgKGxpa2VseShvbGQgPT0gYykpCisJCQlicmVhazsKKwkJYyA9IG9sZDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBhdG9taWNfZGVjX2lmbW9lIC0gZGVjIGlmIHRoZSByZXN1bHQgaXMgbW9yZSBvciBlcXVhbCB0aGFuIGEgZ2l2ZW4gdmFsdWUuCisgKgorICogQHY6CXBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogQGE6CXRoZSBhbW91bnQgdG8gZGVjIGZyb20gdi4uLgorICogQHU6CS4uLmlmICh2IC0gYSkgaXMgbW9yZSBvciBlcXVhbCB0aGFuIHUuCisgKgorICogcmV0dXJucyB0cnVlIGlmICh2IC0gYSkgd2FzIG1vcmUgb3IgZXF1YWwgdGhhbiB1LCBhbmQgZmFsc2UKKyAqIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIF9fYXRvbWljX2RlY19pZm1vZShhdG9taWNfdCAqdiwgaW50IGEsIGludCB1KQoreworCWludCBjLCBvbGQ7CisKKwljID0gYXRvbWljX3JlYWQodik7CisJZm9yICg7OykgeworCQlpZiAodW5saWtlbHkoYyAtIGEgPCB1KSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlvbGQgPSBhdG9taWNfY21weGNoZygodiksIGMsIGMgLSBhKTsKKwkJaWYgKGxpa2VseShvbGQgPT0gYykpCisJCQlicmVhazsKKwkJYyA9IG9sZDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgYm54MnhfY3JlZGl0X3Bvb2xfZ2V0KHN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmogKm8sIGludCBjbnQpCit7CisJYm9vbCByYzsKKworCXNtcF9tYigpOworCXJjID0gX19hdG9taWNfZGVjX2lmbW9lKCZvLT5jcmVkaXQsIGNudCwgMCk7CisJc21wX21iKCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBib29sIGJueDJ4X2NyZWRpdF9wb29sX3B1dChzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICpvLCBpbnQgY250KQoreworCWJvb2wgcmM7CisKKwlzbXBfbWIoKTsKKworCS8qIERvbid0IGxldCB0byByZWZpbGwgaWYgY3JlZGl0ICsgY250ID4gcG9vbF9zeiAqLworCXJjID0gX19hdG9taWNfYWRkX2lmbGVzcygmby0+Y3JlZGl0LCBjbnQsIG8tPnBvb2xfc3ogKyAxKTsKKworCXNtcF9tYigpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGJueDJ4X2NyZWRpdF9wb29sX2NoZWNrKHN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmogKm8pCit7CisJaW50IGN1cl9jcmVkaXQ7CisKKwlzbXBfbWIoKTsKKwljdXJfY3JlZGl0ID0gYXRvbWljX3JlYWQoJm8tPmNyZWRpdCk7CisKKwlyZXR1cm4gY3VyX2NyZWRpdDsKK30KKworc3RhdGljIGJvb2wgYm54MnhfY3JlZGl0X3Bvb2xfYWx3YXlzX3RydWUoc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqbywKKwkJCQkJICBpbnQgY250KQoreworCXJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyBib29sIGJueDJ4X2NyZWRpdF9wb29sX2dldF9lbnRyeSgKKwlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICpvLAorCWludCAqb2Zmc2V0KQoreworCWludCBpZHgsIHZlYywgaTsKKworCSpvZmZzZXQgPSAtMTsKKworCS8qIEZpbmQgImludGVybmFsIGNhbS1vZmZzZXQiIHRoZW4gYWRkIHRvIGJhc2UgZm9yIHRoaXMgb2JqZWN0Li4uICovCisJZm9yICh2ZWMgPSAwOyB2ZWMgPCBCTlgyWF9QT09MX1ZFQ19TSVpFOyB2ZWMrKykgeworCisJCS8qIFNraXAgdGhlIGN1cnJlbnQgdmVjdG9yIGlmIHRoZXJlIGFyZSBubyBmcmVlIGVudHJpZXMgaW4gaXQgKi8KKwkJaWYgKCFvLT5wb29sX21pcnJvclt2ZWNdKQorCQkJY29udGludWU7CisKKwkJLyogSWYgd2UndmUgZ290IGhlcmUgd2UgYXJlIGdvaW5nIHRvIGZpbmQgYSBmcmVlIGVudHJ5ICovCisJCWZvciAoaWR4ID0gdmVjICogQk5YMlhfUE9PTF9WRUNfU0laRSwgaSA9IDA7CisJCSAgICAgIGkgPCBCSVRfVkVDNjRfRUxFTV9TWjsgaWR4KyssIGkrKykKKworCQkJaWYgKEJJVF9WRUM2NF9URVNUX0JJVChvLT5wb29sX21pcnJvciwgaWR4KSkgeworCQkJCS8qIEdvdCBvbmUhISAqLworCQkJCUJJVF9WRUM2NF9DTEVBUl9CSVQoby0+cG9vbF9taXJyb3IsIGlkeCk7CisJCQkJKm9mZnNldCA9IG8tPmJhc2VfcG9vbF9vZmZzZXQgKyBpZHg7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBibngyeF9jcmVkaXRfcG9vbF9wdXRfZW50cnkoCisJc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqbywKKwlpbnQgb2Zmc2V0KQoreworCWlmIChvZmZzZXQgPCBvLT5iYXNlX3Bvb2xfb2Zmc2V0KQorCQlyZXR1cm4gZmFsc2U7CisKKwlvZmZzZXQgLT0gby0+YmFzZV9wb29sX29mZnNldDsKKworCWlmIChvZmZzZXQgPj0gby0+cG9vbF9zeikKKwkJcmV0dXJuIGZhbHNlOworCisJLyogUmV0dXJuIHRoZSBlbnRyeSB0byB0aGUgcG9vbCAqLworCUJJVF9WRUM2NF9TRVRfQklUKG8tPnBvb2xfbWlycm9yLCBvZmZzZXQpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGJueDJ4X2NyZWRpdF9wb29sX3B1dF9lbnRyeV9hbHdheXNfdHJ1ZSgKKwlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICpvLAorCWludCBvZmZzZXQpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGJueDJ4X2NyZWRpdF9wb29sX2dldF9lbnRyeV9hbHdheXNfdHJ1ZSgKKwlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICpvLAorCWludCAqb2Zmc2V0KQoreworCSpvZmZzZXQgPSAtMTsKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKgorICogYm54MnhfaW5pdF9jcmVkaXRfcG9vbCAtIGluaXRpYWxpemUgY3JlZGl0IHBvb2wgaW50ZXJuYWxzLgorICoKKyAqIEBwOgorICogQGJhc2U6CUJhc2UgZW50cnkgaW4gdGhlIENBTSB0byB1c2UuCisgKiBAY3JlZGl0Oglwb29sIHNpemUuCisgKgorICogSWYgYmFzZSBpcyBuZWdhdGl2ZSBubyBDQU0gZW50cmllcyBoYW5kbGluZyB3aWxsIGJlIHBlcmZvcm1lZC4KKyAqIElmIGNyZWRpdCBpcyBuZWdhdGl2ZSBwb29sIG9wZXJhdGlvbnMgd2lsbCBhbHdheXMgc3VjY2VlZCAodW5saW1pdGVkIHBvb2wpLgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2luaXRfY3JlZGl0X3Bvb2woc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqcCwKKwkJCQkJICBpbnQgYmFzZSwgaW50IGNyZWRpdCkKK3sKKwkvKiBaZXJvIHRoZSBvYmplY3QgZmlyc3QgKi8KKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisKKwkvKiBTZXQgdGhlIHRhYmxlIHRvIGFsbCAxcyAqLworCW1lbXNldCgmcC0+cG9vbF9taXJyb3IsIDB4ZmYsIHNpemVvZihwLT5wb29sX21pcnJvcikpOworCisJLyogSW5pdCBhIHBvb2wgYXMgZnVsbCAqLworCWF0b21pY19zZXQoJnAtPmNyZWRpdCwgY3JlZGl0KTsKKworCS8qIFRoZSB0b3RhbCBwb2xsIHNpemUgKi8KKwlwLT5wb29sX3N6ID0gY3JlZGl0OworCisJcC0+YmFzZV9wb29sX29mZnNldCA9IGJhc2U7CisKKwkvKiBDb21taXQgdGhlIGNoYW5nZSAqLworCXNtcF9tYigpOworCisJcC0+Y2hlY2sgPSBibngyeF9jcmVkaXRfcG9vbF9jaGVjazsKKworCS8qIGlmIHBvb2wgY3JlZGl0IGlzIG5lZ2F0aXZlIC0gZGlzYWJsZSB0aGUgY2hlY2tzICovCisJaWYgKGNyZWRpdCA+PSAwKSB7CisJCXAtPnB1dCAgICAgID0gYm54MnhfY3JlZGl0X3Bvb2xfcHV0OworCQlwLT5nZXQgICAgICA9IGJueDJ4X2NyZWRpdF9wb29sX2dldDsKKwkJcC0+cHV0X2VudHJ5ID0gYm54MnhfY3JlZGl0X3Bvb2xfcHV0X2VudHJ5OworCQlwLT5nZXRfZW50cnkgPSBibngyeF9jcmVkaXRfcG9vbF9nZXRfZW50cnk7CisJfSBlbHNlIHsKKwkJcC0+cHV0ICAgICAgPSBibngyeF9jcmVkaXRfcG9vbF9hbHdheXNfdHJ1ZTsKKwkJcC0+Z2V0ICAgICAgPSBibngyeF9jcmVkaXRfcG9vbF9hbHdheXNfdHJ1ZTsKKwkJcC0+cHV0X2VudHJ5ID0gYm54MnhfY3JlZGl0X3Bvb2xfcHV0X2VudHJ5X2Fsd2F5c190cnVlOworCQlwLT5nZXRfZW50cnkgPSBibngyeF9jcmVkaXRfcG9vbF9nZXRfZW50cnlfYWx3YXlzX3RydWU7CisJfQorCisJLyogSWYgYmFzZSBpcyBuZWdhdGl2ZSAtIGRpc2FibGUgZW50cmllcyBoYW5kbGluZyAqLworCWlmIChiYXNlIDwgMCkgeworCQlwLT5wdXRfZW50cnkgPSBibngyeF9jcmVkaXRfcG9vbF9wdXRfZW50cnlfYWx3YXlzX3RydWU7CisJCXAtPmdldF9lbnRyeSA9IGJueDJ4X2NyZWRpdF9wb29sX2dldF9lbnRyeV9hbHdheXNfdHJ1ZTsKKwl9Cit9CisKK3ZvaWQgYm54MnhfaW5pdF9tYWNfY3JlZGl0X3Bvb2woc3RydWN0IGJueDJ4ICpicCwKKwkJCQlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICpwLCB1OCBmdW5jX2lkLAorCQkJCXU4IGZ1bmNfbnVtKQoreworLyogVE9ETzogdGhpcyB3aWxsIGJlIGRlZmluZWQgaW4gY29uc3RzIGFzIHdlbGwuLi4gKi8KKyNkZWZpbmUgQk5YMlhfQ0FNX1NJWkVfRU1VTCA1CisKKwlpbnQgY2FtX3N6OworCisJaWYgKENISVBfSVNfRTEoYnApKSB7CisJCS8qIEluIEUxLCBNdWx0aWNhc3QgaXMgc2F2ZWQgaW4gY2FtLi4uICovCisJCWlmICghQ0hJUF9SRVZfSVNfU0xPVyhicCkpCisJCQljYW1fc3ogPSAoTUFYX01BQ19DUkVESVRfRTEgLyAyKSAtIEJOWDJYX01BWF9NVUxUSUNBU1Q7CisJCWVsc2UKKwkJCWNhbV9zeiA9IEJOWDJYX0NBTV9TSVpFX0VNVUwgLSBCTlgyWF9NQVhfRU1VTF9NVUxUSTsKKworCQlibngyeF9pbml0X2NyZWRpdF9wb29sKHAsIGZ1bmNfaWQgKiBjYW1fc3osIGNhbV9zeik7CisKKwl9IGVsc2UgaWYgKENISVBfSVNfRTFIKGJwKSkgeworCQkvKiBDQU0gY3JlZGl0IGlzIGVxdWFseSBkaXZpZGVkIGJldHdlZW4gYWxsIGFjdGl2ZSBmdW5jdGlvbnMKKwkJICogb24gdGhlIFBPUlQhLgorCQkgKi8KKwkJaWYgKChmdW5jX251bSA+IDApKSB7CisJCQlpZiAoIUNISVBfUkVWX0lTX1NMT1coYnApKQorCQkJCWNhbV9zeiA9IChNQVhfTUFDX0NSRURJVF9FMUggLyAoMipmdW5jX251bSkpOworCQkJZWxzZQorCQkJCWNhbV9zeiA9IEJOWDJYX0NBTV9TSVpFX0VNVUw7CisJCQlibngyeF9pbml0X2NyZWRpdF9wb29sKHAsIGZ1bmNfaWQgKiBjYW1fc3osIGNhbV9zeik7CisJCX0gZWxzZSB7CisJCQkvKiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4hIEJsb2NrIE1BQyBvcGVyYXRpb25zLiAqLworCQkJYm54MnhfaW5pdF9jcmVkaXRfcG9vbChwLCAwLCAwKTsKKwkJfQorCisJfSBlbHNlIHsKKworCQkvKgorCQkgKiBDQU0gY3JlZGl0IGlzIGVxdWFseSBkaXZpZGVkIGJldHdlZW4gYWxsIGFjdGl2ZSBmdW5jdGlvbnMKKwkJICogb24gdGhlIFBBVEguCisJCSAqLworCQlpZiAoKGZ1bmNfbnVtID4gMCkpIHsKKwkJCWlmICghQ0hJUF9SRVZfSVNfU0xPVyhicCkpCisJCQkJY2FtX3N6ID0gKE1BWF9NQUNfQ1JFRElUX0UyIC8gZnVuY19udW0pOworCQkJZWxzZQorCQkJCWNhbV9zeiA9IEJOWDJYX0NBTV9TSVpFX0VNVUw7CisKKwkJCS8qCisJCQkgKiBObyBuZWVkIGZvciBDQU0gZW50cmllcyBoYW5kbGluZyBmb3IgNTc3MTIgYW5kCisJCQkgKiBuZXdlci4KKwkJCSAqLworCQkJYm54MnhfaW5pdF9jcmVkaXRfcG9vbChwLCAtMSwgY2FtX3N6KTsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgQmxvY2sgTUFDIG9wZXJhdGlvbnMuICovCisJCQlibngyeF9pbml0X2NyZWRpdF9wb29sKHAsIDAsIDApOworCQl9CisKKwl9Cit9CisKK3ZvaWQgYm54MnhfaW5pdF92bGFuX2NyZWRpdF9wb29sKHN0cnVjdCBibngyeCAqYnAsCisJCQkJIHN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmogKnAsCisJCQkJIHU4IGZ1bmNfaWQsCisJCQkJIHU4IGZ1bmNfbnVtKQoreworCWlmIChDSElQX0lTX0UxeChicCkpIHsKKwkJLyoKKwkJICogVGhlcmUgaXMgbm8gVkxBTiBjcmVkaXQgaW4gSFcgb24gNTc3MTAgYW5kIDU3NzExIG9ubHkKKwkJICogTUFDIC8gTUFDLVZMQU4gY2FuIGJlIHNldAorCQkgKi8KKwkJYm54MnhfaW5pdF9jcmVkaXRfcG9vbChwLCAwLCAtMSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQ0FNIGNyZWRpdCBpcyBlcXVhbHkgZGl2aWRlZCBiZXR3ZWVuIGFsbCBhY3RpdmUgZnVuY3Rpb25zCisJCSAqIG9uIHRoZSBQQVRILgorCQkgKi8KKwkJaWYgKGZ1bmNfbnVtID4gMCkgeworCQkJaW50IGNyZWRpdCA9IE1BWF9WTEFOX0NSRURJVF9FMiAvIGZ1bmNfbnVtOworCQkJYm54MnhfaW5pdF9jcmVkaXRfcG9vbChwLCBmdW5jX2lkICogY3JlZGl0LCBjcmVkaXQpOworCQl9IGVsc2UKKwkJCS8qIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgQmxvY2sgVkxBTiBvcGVyYXRpb25zLiAqLworCQkJYm54MnhfaW5pdF9jcmVkaXRfcG9vbChwLCAwLCAwKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKiogUlNTIENvbmZpZ3VyYXRpb24gKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBibngyeF9kZWJ1Z19wcmludF9pbmRfdGFibGUgLSBwcmludHMgdGhlIGluZGlyZWN0aW9uIHRhYmxlIGNvbmZpZ3VyYXRpb24uCisgKgorICogQGJwOgkJZHJpdmVyIGhhbmxkZQorICogQHA6CQlwb2ludGVyIHRvIHJzcyBjb25maWd1cmF0aW9uCisgKgorICogUHJpbnRzIGl0IHdoZW4gTkVUSUZfTVNHX0lGVVAgZGVidWcgbGV2ZWwgaXMgY29uZmlndXJlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2RlYnVnX3ByaW50X2luZF90YWJsZShzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQlzdHJ1Y3QgYm54MnhfY29uZmlnX3Jzc19wYXJhbXMgKnApCit7CisJaW50IGk7CisKKwlEUChCTlgyWF9NU0dfU1AsICJTZXR0aW5nIGluZGlyZWN0aW9uIHRhYmxlIHRvOlxuIik7CisJRFAoQk5YMlhfTVNHX1NQLCAiMHgwMDAwOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgVF9FVEhfSU5ESVJFQ1RJT05fVEFCTEVfU0laRTsgaSsrKSB7CisJCURQX0NPTlQoQk5YMlhfTVNHX1NQLCAiMHglMDJ4ICIsIHAtPmluZF90YWJsZVtpXSk7CisKKwkJLyogUHJpbnQgNCBieXRlcyBpbiBhIGxpbmUgKi8KKwkJaWYgKChpICsgMSA8IFRfRVRIX0lORElSRUNUSU9OX1RBQkxFX1NJWkUpICYmCisJCSAgICAoKChpICsgMSkgJiAweDMpID09IDApKSB7CisJCQlEUF9DT05UKEJOWDJYX01TR19TUCwgIlxuIik7CisJCQlEUChCTlgyWF9NU0dfU1AsICIweCUwNHg6ICIsIGkgKyAxKTsKKwkJfQorCX0KKworCURQX0NPTlQoQk5YMlhfTVNHX1NQLCAiXG4iKTsKK30KKworLyoqCisgKiBibngyeF9zZXR1cF9yc3MgLSBjb25maWd1cmUgUlNTCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQHA6CQlyc3MgY29uZmlndXJhdGlvbgorICoKKyAqIHNlbmRzIG9uIFVQREFURSByYW1yb2QgZm9yIHRoYXQgbWF0dGVyLgorICovCitzdGF0aWMgaW50IGJueDJ4X3NldHVwX3JzcyhzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgc3RydWN0IGJueDJ4X2NvbmZpZ19yc3NfcGFyYW1zICpwKQoreworCXN0cnVjdCBibngyeF9yc3NfY29uZmlnX29iaiAqbyA9IHAtPnJzc19vYmo7CisJc3RydWN0IGJueDJ4X3Jhd19vYmogKnIgPSAmby0+cmF3OworCXN0cnVjdCBldGhfcnNzX3VwZGF0ZV9yYW1yb2RfZGF0YSAqZGF0YSA9CisJCShzdHJ1Y3QgZXRoX3Jzc191cGRhdGVfcmFtcm9kX2RhdGEgKikoci0+cmRhdGEpOworCXU4IHJzc19tb2RlID0gMDsKKwlpbnQgcmM7CisKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisKKwlEUChCTlgyWF9NU0dfU1AsICJDb25maWd1cmluZyBSU1NcbiIpOworCisJLyogU2V0IGFuIGVjaG8gZmllbGQgKi8KKwlkYXRhLT5lY2hvID0gKHItPmNpZCAmIEJOWDJYX1NXQ0lEX01BU0spIHwKKwkJICAgICAoci0+c3RhdGUgPDwgQk5YMlhfU1dDSURfU0hJRlQpOworCisJLyogUlNTIG1vZGUgKi8KKwlpZiAodGVzdF9iaXQoQk5YMlhfUlNTX01PREVfRElTQUJMRUQsICZwLT5yc3NfZmxhZ3MpKQorCQlyc3NfbW9kZSA9IEVUSF9SU1NfTU9ERV9ESVNBQkxFRDsKKwllbHNlIGlmICh0ZXN0X2JpdChCTlgyWF9SU1NfTU9ERV9SRUdVTEFSLCAmcC0+cnNzX2ZsYWdzKSkKKwkJcnNzX21vZGUgPSBFVEhfUlNTX01PREVfUkVHVUxBUjsKKwllbHNlIGlmICh0ZXN0X2JpdChCTlgyWF9SU1NfTU9ERV9WTEFOX1BSSSwgJnAtPnJzc19mbGFncykpCisJCXJzc19tb2RlID0gRVRIX1JTU19NT0RFX1ZMQU5fUFJJOworCWVsc2UgaWYgKHRlc3RfYml0KEJOWDJYX1JTU19NT0RFX0UxSE9WX1BSSSwgJnAtPnJzc19mbGFncykpCisJCXJzc19tb2RlID0gRVRIX1JTU19NT0RFX0UxSE9WX1BSSTsKKwllbHNlIGlmICh0ZXN0X2JpdChCTlgyWF9SU1NfTU9ERV9JUF9EU0NQLCAmcC0+cnNzX2ZsYWdzKSkKKwkJcnNzX21vZGUgPSBFVEhfUlNTX01PREVfSVBfRFNDUDsKKworCWRhdGEtPnJzc19tb2RlID0gcnNzX21vZGU7CisKKwlEUChCTlgyWF9NU0dfU1AsICJyc3NfbW9kZT0lZFxuIiwgcnNzX21vZGUpOworCisJLyogUlNTIGNhcGFiaWxpdGllcyAqLworCWlmICh0ZXN0X2JpdChCTlgyWF9SU1NfSVBWNCwgJnAtPnJzc19mbGFncykpCisJCWRhdGEtPmNhcGFiaWxpdGllcyB8PQorCQkJRVRIX1JTU19VUERBVEVfUkFNUk9EX0RBVEFfSVBWNF9DQVBBQklMSVRZOworCisJaWYgKHRlc3RfYml0KEJOWDJYX1JTU19JUFY0X1RDUCwgJnAtPnJzc19mbGFncykpCisJCWRhdGEtPmNhcGFiaWxpdGllcyB8PQorCQkJRVRIX1JTU19VUERBVEVfUkFNUk9EX0RBVEFfSVBWNF9UQ1BfQ0FQQUJJTElUWTsKKworCWlmICh0ZXN0X2JpdChCTlgyWF9SU1NfSVBWNiwgJnAtPnJzc19mbGFncykpCisJCWRhdGEtPmNhcGFiaWxpdGllcyB8PQorCQkJRVRIX1JTU19VUERBVEVfUkFNUk9EX0RBVEFfSVBWNl9DQVBBQklMSVRZOworCisJaWYgKHRlc3RfYml0KEJOWDJYX1JTU19JUFY2X1RDUCwgJnAtPnJzc19mbGFncykpCisJCWRhdGEtPmNhcGFiaWxpdGllcyB8PQorCQkJRVRIX1JTU19VUERBVEVfUkFNUk9EX0RBVEFfSVBWNl9UQ1BfQ0FQQUJJTElUWTsKKworCS8qIEhhc2hpbmcgbWFzayAqLworCWRhdGEtPnJzc19yZXN1bHRfbWFzayA9IHAtPnJzc19yZXN1bHRfbWFzazsKKworCS8qIFJTUyBlbmdpbmUgSUQgKi8KKwlkYXRhLT5yc3NfZW5naW5lX2lkID0gby0+ZW5naW5lX2lkOworCisJRFAoQk5YMlhfTVNHX1NQLCAicnNzX2VuZ2luZV9pZD0lZFxuIiwgZGF0YS0+cnNzX2VuZ2luZV9pZCk7CisKKwkvKiBJbmRpcmVjdGlvbiB0YWJsZSAqLworCW1lbWNweShkYXRhLT5pbmRpcmVjdGlvbl90YWJsZSwgcC0+aW5kX3RhYmxlLAorCQkgIFRfRVRIX0lORElSRUNUSU9OX1RBQkxFX1NJWkUpOworCisJLyogUmVtZW1iZXIgdGhlIGxhc3QgY29uZmlndXJhdGlvbiAqLworCW1lbWNweShvLT5pbmRfdGFibGUsIHAtPmluZF90YWJsZSwgVF9FVEhfSU5ESVJFQ1RJT05fVEFCTEVfU0laRSk7CisKKwkvKiBQcmludCB0aGUgaW5kaXJlY3Rpb24gdGFibGUgKi8KKwlpZiAobmV0aWZfbXNnX2lmdXAoYnApKQorCQlibngyeF9kZWJ1Z19wcmludF9pbmRfdGFibGUoYnAsIHApOworCisJLyogUlNTIGtleXMgKi8KKwlpZiAodGVzdF9iaXQoQk5YMlhfUlNTX1NFVF9TUkNILCAmcC0+cnNzX2ZsYWdzKSkgeworCQltZW1jcHkoJmRhdGEtPnJzc19rZXlbMF0sICZwLT5yc3Nfa2V5WzBdLAorCQkgICAgICAgc2l6ZW9mKGRhdGEtPnJzc19rZXkpKTsKKwkJZGF0YS0+Y2FwYWJpbGl0aWVzIHw9IEVUSF9SU1NfVVBEQVRFX1JBTVJPRF9EQVRBX1VQREFURV9SU1NfS0VZOworCX0KKworCS8qCisJICogIE5vIG5lZWQgZm9yIGFuIGV4cGxpY2l0IG1lbW9yeSBiYXJyaWVyIGhlcmUgYXMgbG9uZyB3ZSB3b3VsZAorCSAqICBuZWVkIHRvIGVuc3VyZSB0aGUgb3JkZXJpbmcgb2Ygd3JpdGluZyB0byB0aGUgU1BRIGVsZW1lbnQKKwkgKiAgYW5kIHVwZGF0aW5nIG9mIHRoZSBTUFEgcHJvZHVjZXIgd2hpY2ggaW52b2x2ZXMgYSBtZW1vcnkKKwkgKiAgcmVhZCBhbmQgd2Ugd2lsbCBoYXZlIHRvIHB1dCBhIGZ1bGwgbWVtb3J5IGJhcnJpZXIgdGhlcmUKKwkgKiAgKGluc2lkZSBibngyeF9zcF9wb3N0KCkpLgorCSAqLworCisJLyogU2VuZCBhIHJhbXJvZCAqLworCXJjID0gYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfUlNTX1VQREFURSwgci0+Y2lkLAorCQkJICAgVTY0X0hJKHItPnJkYXRhX21hcHBpbmcpLAorCQkJICAgVTY0X0xPKHItPnJkYXRhX21hcHBpbmcpLAorCQkJICAgRVRIX0NPTk5FQ1RJT05fVFlQRSk7CisKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBibngyeF9nZXRfcnNzX2luZF90YWJsZShzdHJ1Y3QgYm54MnhfcnNzX2NvbmZpZ19vYmogKnJzc19vYmosCisJCQkgICAgIHU4ICppbmRfdGFibGUpCit7CisJbWVtY3B5KGluZF90YWJsZSwgcnNzX29iai0+aW5kX3RhYmxlLCBzaXplb2YocnNzX29iai0+aW5kX3RhYmxlKSk7Cit9CisKK2ludCBibngyeF9jb25maWdfcnNzKHN0cnVjdCBibngyeCAqYnAsCisJCSAgICAgc3RydWN0IGJueDJ4X2NvbmZpZ19yc3NfcGFyYW1zICpwKQoreworCWludCByYzsKKwlzdHJ1Y3QgYm54MnhfcnNzX2NvbmZpZ19vYmogKm8gPSBwLT5yc3Nfb2JqOworCXN0cnVjdCBibngyeF9yYXdfb2JqICpyID0gJm8tPnJhdzsKKworCS8qIERvIG5vdGhpbmcgaWYgb25seSBkcml2ZXIgY2xlYW51cCB3YXMgcmVxdWVzdGVkICovCisJaWYgKHRlc3RfYml0KFJBTVJPRF9EUlZfQ0xSX09OTFksICZwLT5yYW1yb2RfZmxhZ3MpKQorCQlyZXR1cm4gMDsKKworCXItPnNldF9wZW5kaW5nKHIpOworCisJcmMgPSBvLT5jb25maWdfcnNzKGJwLCBwKTsKKwlpZiAocmMgPCAwKSB7CisJCXItPmNsZWFyX3BlbmRpbmcocik7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAodGVzdF9iaXQoUkFNUk9EX0NPTVBfV0FJVCwgJnAtPnJhbXJvZF9mbGFncykpCisJCXJjID0gci0+d2FpdF9jb21wKGJwLCByKTsKKworCXJldHVybiByYzsKK30KKworCit2b2lkIGJueDJ4X2luaXRfcnNzX2NvbmZpZ19vYmooc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgICAgICBzdHJ1Y3QgYm54MnhfcnNzX2NvbmZpZ19vYmogKnJzc19vYmosCisJCQkgICAgICAgdTggY2xfaWQsIHUzMiBjaWQsIHU4IGZ1bmNfaWQsIHU4IGVuZ2luZV9pZCwKKwkJCSAgICAgICB2b2lkICpyZGF0YSwgZG1hX2FkZHJfdCByZGF0YV9tYXBwaW5nLAorCQkJICAgICAgIGludCBzdGF0ZSwgdW5zaWduZWQgbG9uZyAqcHN0YXRlLAorCQkJICAgICAgIGJueDJ4X29ial90eXBlIHR5cGUpCit7CisJYm54MnhfaW5pdF9yYXdfb2JqKCZyc3Nfb2JqLT5yYXcsIGNsX2lkLCBjaWQsIGZ1bmNfaWQsIHJkYXRhLAorCQkJICAgcmRhdGFfbWFwcGluZywgc3RhdGUsIHBzdGF0ZSwgdHlwZSk7CisKKwlyc3Nfb2JqLT5lbmdpbmVfaWQgID0gZW5naW5lX2lkOworCXJzc19vYmotPmNvbmZpZ19yc3MgPSBibngyeF9zZXR1cF9yc3M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqIFF1ZXVlIHN0YXRlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBibngyeF9xdWV1ZV9zdGF0ZV9jaGFuZ2UgLSBwZXJmb3JtIFF1ZXVlIHN0YXRlIGNoYW5nZSB0cmFuc2l0aW9uCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQHBhcmFtczoJcGFyYW1ldGVycyB0byBwZXJmb3JtIHRoZSB0cmFuc2l0aW9uCisgKgorICogcmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0cmFuc2l0aW9uLCBuZWdhdGl2ZSBlcnJvcgorICogY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUsIHBvc2l0aXZlIChFQlVTWSkgdmFsdWUgaWYgdGhlcmUgaXMgYSBjb21wbGV0aW9uCisgKiB0byB0aGF0IGlzIHN0aWxsIHBlbmRpbmcgKHBvc3NpYmxlIG9ubHkgaWYgUkFNUk9EX0NPTVBfV0FJVCBpcworICogbm90IHNldCBpbiBwYXJhbXMtPnJhbXJvZF9mbGFncyBmb3IgYXN5bmNocm9ub3VzIGNvbW1hbmRzKS4KKyAqCisgKi8KK2ludCBibngyeF9xdWV1ZV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgICAgc3RydWN0IGJueDJ4X3F1ZXVlX3N0YXRlX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogKm8gPSBwYXJhbXMtPnFfb2JqOworCWludCByYywgcGVuZGluZ19iaXQ7CisJdW5zaWduZWQgbG9uZyAqcGVuZGluZyA9ICZvLT5wZW5kaW5nOworCisJLyogQ2hlY2sgdGhhdCB0aGUgcmVxdWVzdGVkIHRyYW5zaXRpb24gaXMgbGVnYWwgKi8KKwlpZiAoby0+Y2hlY2tfdHJhbnNpdGlvbihicCwgbywgcGFyYW1zKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBTZXQgInBlbmRpbmciIGJpdCAqLworCXBlbmRpbmdfYml0ID0gby0+c2V0X3BlbmRpbmcobywgcGFyYW1zKTsKKworCS8qIERvbid0IHNlbmQgYSBjb21tYW5kIGlmIG9ubHkgZHJpdmVyIGNsZWFudXAgd2FzIHJlcXVlc3RlZCAqLworCWlmICh0ZXN0X2JpdChSQU1ST0RfRFJWX0NMUl9PTkxZLCAmcGFyYW1zLT5yYW1yb2RfZmxhZ3MpKQorCQlvLT5jb21wbGV0ZV9jbWQoYnAsIG8sIHBlbmRpbmdfYml0KTsKKwllbHNlIHsKKwkJLyogU2VuZCBhIHJhbXJvZCAqLworCQlyYyA9IG8tPnNlbmRfY21kKGJwLCBwYXJhbXMpOworCQlpZiAocmMpIHsKKwkJCW8tPm5leHRfc3RhdGUgPSBCTlgyWF9RX1NUQVRFX01BWDsKKwkJCWNsZWFyX2JpdChwZW5kaW5nX2JpdCwgcGVuZGluZyk7CisJCQlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJaWYgKHRlc3RfYml0KFJBTVJPRF9DT01QX1dBSVQsICZwYXJhbXMtPnJhbXJvZF9mbGFncykpIHsKKwkJCXJjID0gby0+d2FpdF9jb21wKGJwLCBvLCBwZW5kaW5nX2JpdCk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAhIXRlc3RfYml0KHBlbmRpbmdfYml0LCBwZW5kaW5nKTsKK30KKworCitzdGF0aWMgaW50IGJueDJ4X3F1ZXVlX3NldF9wZW5kaW5nKHN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogKm9iaiwKKwkJCQkgICBzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJZW51bSBibngyeF9xdWV1ZV9jbWQgY21kID0gcGFyYW1zLT5jbWQsIGJpdDsKKworCS8qIEFDVElWQVRFIGFuZCBERUFDVElWQVRFIGNvbW1hbmRzIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2YKKwkgKiBVUERBVEUgY29tbWFuZC4KKwkgKi8KKwlpZiAoKGNtZCA9PSBCTlgyWF9RX0NNRF9BQ1RJVkFURSkgfHwKKwkgICAgKGNtZCA9PSBCTlgyWF9RX0NNRF9ERUFDVElWQVRFKSkKKwkJYml0ID0gQk5YMlhfUV9DTURfVVBEQVRFOworCWVsc2UKKwkJYml0ID0gY21kOworCisJc2V0X2JpdChiaXQsICZvYmotPnBlbmRpbmcpOworCXJldHVybiBiaXQ7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfcXVldWVfd2FpdF9jb21wKHN0cnVjdCBibngyeCAqYnAsCisJCQkJIHN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogKm8sCisJCQkJIGVudW0gYm54MnhfcXVldWVfY21kIGNtZCkKK3sKKwlyZXR1cm4gYm54Mnhfc3RhdGVfd2FpdChicCwgY21kLCAmby0+cGVuZGluZyk7Cit9CisKKy8qKgorICogYm54MnhfcXVldWVfY29tcF9jbWQgLSBjb21wbGV0ZSB0aGUgc3RhdGUgY2hhbmdlIGNvbW1hbmQuCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQG86CisgKiBAY21kOgorICoKKyAqIENoZWNrcyB0aGF0IHRoZSBhcnJpdmVkIGNvbXBsZXRpb24gaXMgZXhwZWN0ZWQuCisgKi8KK3N0YXRpYyBpbnQgYm54MnhfcXVldWVfY29tcF9jbWQoc3RydWN0IGJueDJ4ICpicCwKKwkJCQlzdHJ1Y3QgYm54MnhfcXVldWVfc3Bfb2JqICpvLAorCQkJCWVudW0gYm54MnhfcXVldWVfY21kIGNtZCkKK3sKKwl1bnNpZ25lZCBsb25nIGN1cl9wZW5kaW5nID0gby0+cGVuZGluZzsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KGNtZCwgJmN1cl9wZW5kaW5nKSkgeworCQlCTlgyWF9FUlIoIkJhZCBNQyByZXBseSAlZCBmb3IgcXVldWUgJWQgaW4gc3RhdGUgJWQgIgorCQkJICAicGVuZGluZyAweCVseCwgbmV4dF9zdGF0ZSAlZFxuIiwgY21kLAorCQkJICBvLT5jaWRzW0JOWDJYX1BSSU1BUllfQ0lEX0lOREVYXSwKKwkJCSAgby0+c3RhdGUsIGN1cl9wZW5kaW5nLCBvLT5uZXh0X3N0YXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG8tPm5leHRfdHhfb25seSA+PSBvLT5tYXhfY29zKQorCQkvKiA+PSBiZWN1YXNlIHR4IG9ubHkgbXVzdCBhbHdheXMgYmUgc21hbGxlciB0aGFuIGNvcyBzaW5jZSB0aGUKKwkJICogcHJpbWFyeSBjb25uZWN0aW9uIHN1cG9ydHMgQ09TIDAKKwkJICovCisJCUJOWDJYX0VSUigiaWxsZWdhbCB2YWx1ZSBmb3IgbmV4dCB0eF9vbmx5OiAlZC4gbWF4IGNvcyB3YXMgJWQiLAorCQkJICAgby0+bmV4dF90eF9vbmx5LCBvLT5tYXhfY29zKTsKKworCURQKEJOWDJYX01TR19TUCwgIkNvbXBsZXRpbmcgY29tbWFuZCAlZCBmb3IgcXVldWUgJWQsICIKKwkJCSAic2V0dGluZyBzdGF0ZSB0byAlZFxuIiwgY21kLAorCQkJIG8tPmNpZHNbQk5YMlhfUFJJTUFSWV9DSURfSU5ERVhdLCBvLT5uZXh0X3N0YXRlKTsKKworCWlmIChvLT5uZXh0X3R4X29ubHkpICAvKiBwcmludCBudW0gdHgtb25seSBpZiBhbnkgZXhpc3QgKi8KKwkJRFAoQk5YMlhfTVNHX1NQLCAicHJpbWFyeSBjaWQgJWQ6IG51bSB0eC1vbmx5IGNvbnMgJWQiLAorCQkJICAgby0+Y2lkc1tCTlgyWF9QUklNQVJZX0NJRF9JTkRFWF0sIG8tPm5leHRfdHhfb25seSk7CisKKwlvLT5zdGF0ZSA9IG8tPm5leHRfc3RhdGU7CisJby0+bnVtX3R4X29ubHkgPSBvLT5uZXh0X3R4X29ubHk7CisJby0+bmV4dF9zdGF0ZSA9IEJOWDJYX1FfU1RBVEVfTUFYOworCisJLyogSXQncyBpbXBvcnRhbnQgdGhhdCBvLT5zdGF0ZSBhbmQgby0+bmV4dF9zdGF0ZSBhcmUKKwkgKiB1cGRhdGVkIGJlZm9yZSBvLT5wZW5kaW5nLgorCSAqLworCXdtYigpOworCisJY2xlYXJfYml0KGNtZCwgJm8tPnBlbmRpbmcpOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm54MnhfcV9maWxsX3NldHVwX2RhdGFfZTIoc3RydWN0IGJueDJ4ICpicCwKKwkJCQlzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpjbWRfcGFyYW1zLAorCQkJCXN0cnVjdCBjbGllbnRfaW5pdF9yYW1yb2RfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgYm54MnhfcXVldWVfc2V0dXBfcGFyYW1zICpwYXJhbXMgPSAmY21kX3BhcmFtcy0+cGFyYW1zLnNldHVwOworCisJLyogUnggZGF0YSAqLworCisJLyogSVB2NiBUUEEgc3VwcG9ydGVkIGZvciBFMiBhbmQgYWJvdmUgb25seSAqLworCWRhdGEtPnJ4LnRwYV9lbiB8PSB0ZXN0X2JpdChCTlgyWF9RX0ZMR19UUEFfSVBWNiwgJnBhcmFtcy0+ZmxhZ3MpICoKKwkJCQlDTElFTlRfSU5JVF9SWF9EQVRBX1RQQV9FTl9JUFY2OworfQorCitzdGF0aWMgdm9pZCBibngyeF9xX2ZpbGxfaW5pdF9nZW5lcmFsX2RhdGEoc3RydWN0IGJueDJ4ICpicCwKKwkJCQlzdHJ1Y3QgYm54MnhfcXVldWVfc3Bfb2JqICpvLAorCQkJCXN0cnVjdCBibngyeF9nZW5lcmFsX3NldHVwX3BhcmFtcyAqcGFyYW1zLAorCQkJCXN0cnVjdCBjbGllbnRfaW5pdF9nZW5lcmFsX2RhdGEgKmdlbl9kYXRhLAorCQkJCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCWdlbl9kYXRhLT5jbGllbnRfaWQgPSBvLT5jbF9pZDsKKworCWlmICh0ZXN0X2JpdChCTlgyWF9RX0ZMR19TVEFUUywgZmxhZ3MpKSB7CisJCWdlbl9kYXRhLT5zdGF0aXN0aWNzX2NvdW50ZXJfaWQgPQorCQkJCQlwYXJhbXMtPnN0YXRfaWQ7CisJCWdlbl9kYXRhLT5zdGF0aXN0aWNzX2VuX2ZsZyA9IDE7CisJCWdlbl9kYXRhLT5zdGF0aXN0aWNzX3plcm9fZmxnID0KKwkJCXRlc3RfYml0KEJOWDJYX1FfRkxHX1pFUk9fU1RBVFMsIGZsYWdzKTsKKwl9IGVsc2UKKwkJZ2VuX2RhdGEtPnN0YXRpc3RpY3NfY291bnRlcl9pZCA9CisJCQkJCURJU0FCTEVfU1RBVElTVElDX0NPVU5URVJfSURfVkFMVUU7CisKKwlnZW5fZGF0YS0+aXNfZmNvZV9mbGcgPSB0ZXN0X2JpdChCTlgyWF9RX0ZMR19GQ09FLCBmbGFncyk7CisJZ2VuX2RhdGEtPmFjdGl2YXRlX2ZsZyA9IHRlc3RfYml0KEJOWDJYX1FfRkxHX0FDVElWRSwgZmxhZ3MpOworCWdlbl9kYXRhLT5zcF9jbGllbnRfaWQgPSBwYXJhbXMtPnNwY2xfaWQ7CisJZ2VuX2RhdGEtPm10dSA9IGNwdV90b19sZTE2KHBhcmFtcy0+bXR1KTsKKwlnZW5fZGF0YS0+ZnVuY19pZCA9IG8tPmZ1bmNfaWQ7CisKKworCWdlbl9kYXRhLT5jb3MgPSBwYXJhbXMtPmNvczsKKworCWdlbl9kYXRhLT50cmFmZmljX3R5cGUgPQorCQl0ZXN0X2JpdChCTlgyWF9RX0ZMR19GQ09FLCBmbGFncykgPworCQlMTEZDX1RSQUZGSUNfVFlQRV9GQ09FIDogTExGQ19UUkFGRklDX1RZUEVfTlc7CisKKwlEUChCTlgyWF9NU0dfU1AsICJmbGFnczogYWN0aXZlICVkLCBjb3MgJWQsIHN0YXRzIGVuICVkIiwKKwkgICBnZW5fZGF0YS0+YWN0aXZhdGVfZmxnLCBnZW5fZGF0YS0+Y29zLCBnZW5fZGF0YS0+c3RhdGlzdGljc19lbl9mbGcpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9xX2ZpbGxfaW5pdF90eF9kYXRhKHN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogKm8sCisJCQkJc3RydWN0IGJueDJ4X3R4cV9zZXR1cF9wYXJhbXMgKnBhcmFtcywKKwkJCQlzdHJ1Y3QgY2xpZW50X2luaXRfdHhfZGF0YSAqdHhfZGF0YSwKKwkJCQl1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwl0eF9kYXRhLT5lbmZvcmNlX3NlY3VyaXR5X2ZsZyA9CisJCXRlc3RfYml0KEJOWDJYX1FfRkxHX1RYX1NFQywgZmxhZ3MpOworCXR4X2RhdGEtPmRlZmF1bHRfdmxhbiA9CisJCWNwdV90b19sZTE2KHBhcmFtcy0+ZGVmYXVsdF92bGFuKTsKKwl0eF9kYXRhLT5kZWZhdWx0X3ZsYW5fZmxnID0KKwkJdGVzdF9iaXQoQk5YMlhfUV9GTEdfREVGX1ZMQU4sIGZsYWdzKTsKKwl0eF9kYXRhLT50eF9zd2l0Y2hpbmdfZmxnID0KKwkJdGVzdF9iaXQoQk5YMlhfUV9GTEdfVFhfU1dJVENILCBmbGFncyk7CisJdHhfZGF0YS0+YW50aV9zcG9vZmluZ19mbGcgPQorCQl0ZXN0X2JpdChCTlgyWF9RX0ZMR19BTlRJX1NQT09GLCBmbGFncyk7CisJdHhfZGF0YS0+dHhfc3RhdHVzX2Jsb2NrX2lkID0gcGFyYW1zLT5md19zYl9pZDsKKwl0eF9kYXRhLT50eF9zYl9pbmRleF9udW1iZXIgPSBwYXJhbXMtPnNiX2NxX2luZGV4OworCXR4X2RhdGEtPnRzc19sZWFkaW5nX2NsaWVudF9pZCA9IHBhcmFtcy0+dHNzX2xlYWRpbmdfY2xfaWQ7CisKKwl0eF9kYXRhLT50eF9iZF9wYWdlX2Jhc2UubG8gPQorCQljcHVfdG9fbGUzMihVNjRfTE8ocGFyYW1zLT5kc2NyX21hcCkpOworCXR4X2RhdGEtPnR4X2JkX3BhZ2VfYmFzZS5oaSA9CisJCWNwdV90b19sZTMyKFU2NF9ISShwYXJhbXMtPmRzY3JfbWFwKSk7CisKKwkvKiBEb24ndCBjb25maWd1cmUgYW55IFR4IHN3aXRjaGluZyBtb2RlIGR1cmluZyBxdWV1ZSBTRVRVUCAqLworCXR4X2RhdGEtPnN0YXRlID0gMDsKK30KKworc3RhdGljIHZvaWQgYm54MnhfcV9maWxsX2luaXRfcGF1c2VfZGF0YShzdHJ1Y3QgYm54MnhfcXVldWVfc3Bfb2JqICpvLAorCQkJCXN0cnVjdCByeHFfcGF1c2VfcGFyYW1zICpwYXJhbXMsCisJCQkJc3RydWN0IGNsaWVudF9pbml0X3J4X2RhdGEgKnJ4X2RhdGEpCit7CisJLyogZmxvdyBjb250cm9sIGRhdGEgKi8KKwlyeF9kYXRhLT5jcWVfcGF1c2VfdGhyX2xvdyA9IGNwdV90b19sZTE2KHBhcmFtcy0+cmNxX3RoX2xvKTsKKwlyeF9kYXRhLT5jcWVfcGF1c2VfdGhyX2hpZ2ggPSBjcHVfdG9fbGUxNihwYXJhbXMtPnJjcV90aF9oaSk7CisJcnhfZGF0YS0+YmRfcGF1c2VfdGhyX2xvdyA9IGNwdV90b19sZTE2KHBhcmFtcy0+YmRfdGhfbG8pOworCXJ4X2RhdGEtPmJkX3BhdXNlX3Rocl9oaWdoID0gY3B1X3RvX2xlMTYocGFyYW1zLT5iZF90aF9oaSk7CisJcnhfZGF0YS0+c2dlX3BhdXNlX3Rocl9sb3cgPSBjcHVfdG9fbGUxNihwYXJhbXMtPnNnZV90aF9sbyk7CisJcnhfZGF0YS0+c2dlX3BhdXNlX3Rocl9oaWdoID0gY3B1X3RvX2xlMTYocGFyYW1zLT5zZ2VfdGhfaGkpOworCXJ4X2RhdGEtPnJ4X2Nvc19tYXNrID0gY3B1X3RvX2xlMTYocGFyYW1zLT5wcmlfbWFwKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfcV9maWxsX2luaXRfcnhfZGF0YShzdHJ1Y3QgYm54MnhfcXVldWVfc3Bfb2JqICpvLAorCQkJCXN0cnVjdCBibngyeF9yeHFfc2V0dXBfcGFyYW1zICpwYXJhbXMsCisJCQkJc3RydWN0IGNsaWVudF9pbml0X3J4X2RhdGEgKnJ4X2RhdGEsCisJCQkJdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJCS8qIFJ4IGRhdGEgKi8KKwlyeF9kYXRhLT50cGFfZW4gPSB0ZXN0X2JpdChCTlgyWF9RX0ZMR19UUEEsIGZsYWdzKSAqCisJCQkJQ0xJRU5UX0lOSVRfUlhfREFUQV9UUEFfRU5fSVBWNDsKKwlyeF9kYXRhLT52bXF1ZXVlX21vZGVfZW5fZmxnID0gMDsKKworCXJ4X2RhdGEtPmNhY2hlX2xpbmVfYWxpZ25tZW50X2xvZ19zaXplID0KKwkJcGFyYW1zLT5jYWNoZV9saW5lX2xvZzsKKwlyeF9kYXRhLT5lbmFibGVfZHluYW1pY19oYyA9CisJCXRlc3RfYml0KEJOWDJYX1FfRkxHX0RIQywgZmxhZ3MpOworCXJ4X2RhdGEtPm1heF9zZ2VzX2Zvcl9wYWNrZXQgPSBwYXJhbXMtPm1heF9zZ2VzX3BrdDsKKwlyeF9kYXRhLT5jbGllbnRfcXpvbmVfaWQgPSBwYXJhbXMtPmNsX3F6b25lX2lkOworCXJ4X2RhdGEtPm1heF9hZ2dfc2l6ZSA9IGNwdV90b19sZTE2KHBhcmFtcy0+dHBhX2FnZ19zeik7CisKKwkvKiBBbHdheXMgc3RhcnQgaW4gRFJPUF9BTEwgbW9kZSAqLworCXJ4X2RhdGEtPnN0YXRlID0gY3B1X3RvX2xlMTYoQ0xJRU5UX0lOSVRfUlhfREFUQV9VQ0FTVF9EUk9QX0FMTCB8CisJCQkJICAgICBDTElFTlRfSU5JVF9SWF9EQVRBX01DQVNUX0RST1BfQUxMKTsKKworCS8qIFdlIGRvbid0IHNldCBkcm9wIGZsYWdzICovCisJcnhfZGF0YS0+ZHJvcF9pcF9jc19lcnJfZmxnID0gMDsKKwlyeF9kYXRhLT5kcm9wX3RjcF9jc19lcnJfZmxnID0gMDsKKwlyeF9kYXRhLT5kcm9wX3R0bDBfZmxnID0gMDsKKwlyeF9kYXRhLT5kcm9wX3VkcF9jc19lcnJfZmxnID0gMDsKKwlyeF9kYXRhLT5pbm5lcl92bGFuX3JlbW92YWxfZW5hYmxlX2ZsZyA9CisJCXRlc3RfYml0KEJOWDJYX1FfRkxHX1ZMQU4sIGZsYWdzKTsKKwlyeF9kYXRhLT5vdXRlcl92bGFuX3JlbW92YWxfZW5hYmxlX2ZsZyA9CisJCXRlc3RfYml0KEJOWDJYX1FfRkxHX09WLCBmbGFncyk7CisJcnhfZGF0YS0+c3RhdHVzX2Jsb2NrX2lkID0gcGFyYW1zLT5md19zYl9pZDsKKwlyeF9kYXRhLT5yeF9zYl9pbmRleF9udW1iZXIgPSBwYXJhbXMtPnNiX2NxX2luZGV4OworCXJ4X2RhdGEtPm1heF90cGFfcXVldWVzID0gcGFyYW1zLT5tYXhfdHBhX3F1ZXVlczsKKwlyeF9kYXRhLT5tYXhfYnl0ZXNfb25fYmQgPSBjcHVfdG9fbGUxNihwYXJhbXMtPmJ1Zl9zeik7CisJcnhfZGF0YS0+c2dlX2J1ZmZfc2l6ZSA9IGNwdV90b19sZTE2KHBhcmFtcy0+c2dlX2J1Zl9zeik7CisJcnhfZGF0YS0+YmRfcGFnZV9iYXNlLmxvID0KKwkJY3B1X3RvX2xlMzIoVTY0X0xPKHBhcmFtcy0+ZHNjcl9tYXApKTsKKwlyeF9kYXRhLT5iZF9wYWdlX2Jhc2UuaGkgPQorCQljcHVfdG9fbGUzMihVNjRfSEkocGFyYW1zLT5kc2NyX21hcCkpOworCXJ4X2RhdGEtPnNnZV9wYWdlX2Jhc2UubG8gPQorCQljcHVfdG9fbGUzMihVNjRfTE8ocGFyYW1zLT5zZ2VfbWFwKSk7CisJcnhfZGF0YS0+c2dlX3BhZ2VfYmFzZS5oaSA9CisJCWNwdV90b19sZTMyKFU2NF9ISShwYXJhbXMtPnNnZV9tYXApKTsKKwlyeF9kYXRhLT5jcWVfcGFnZV9iYXNlLmxvID0KKwkJY3B1X3RvX2xlMzIoVTY0X0xPKHBhcmFtcy0+cmNxX21hcCkpOworCXJ4X2RhdGEtPmNxZV9wYWdlX2Jhc2UuaGkgPQorCQljcHVfdG9fbGUzMihVNjRfSEkocGFyYW1zLT5yY3FfbWFwKSk7CisJcnhfZGF0YS0+aXNfbGVhZGluZ19yc3MgPSB0ZXN0X2JpdChCTlgyWF9RX0ZMR19MRUFESU5HX1JTUywgZmxhZ3MpOworCisJaWYgKHRlc3RfYml0KEJOWDJYX1FfRkxHX01DQVNULCBmbGFncykpIHsKKwkJcnhfZGF0YS0+YXBwcm94X21jYXN0X2VuZ2luZV9pZCA9IG8tPmZ1bmNfaWQ7CisJCXJ4X2RhdGEtPmlzX2FwcHJveF9tY2FzdCA9IDE7CisJfQorCisJcnhfZGF0YS0+cnNzX2VuZ2luZV9pZCA9IHBhcmFtcy0+cnNzX2VuZ2luZV9pZDsKKworCS8qIHNpbGVudCB2bGFuIHJlbW92YWwgKi8KKwlyeF9kYXRhLT5zaWxlbnRfdmxhbl9yZW1vdmFsX2ZsZyA9CisJCXRlc3RfYml0KEJOWDJYX1FfRkxHX1NJTEVOVF9WTEFOX1JFTSwgZmxhZ3MpOworCXJ4X2RhdGEtPnNpbGVudF92bGFuX3ZhbHVlID0KKwkJY3B1X3RvX2xlMTYocGFyYW1zLT5zaWxlbnRfcmVtb3ZhbF92YWx1ZSk7CisJcnhfZGF0YS0+c2lsZW50X3ZsYW5fbWFzayA9CisJCWNwdV90b19sZTE2KHBhcmFtcy0+c2lsZW50X3JlbW92YWxfbWFzayk7CisKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgZ2VuZXJhbCwgdHggYW5kIHJ4IHBhcnRzIG9mIGEgcXVldWUgb2JqZWN0ICovCitzdGF0aWMgdm9pZCBibngyeF9xX2ZpbGxfc2V0dXBfZGF0YV9jbW4oc3RydWN0IGJueDJ4ICpicCwKKwkJCQlzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpjbWRfcGFyYW1zLAorCQkJCXN0cnVjdCBjbGllbnRfaW5pdF9yYW1yb2RfZGF0YSAqZGF0YSkKK3sKKwlibngyeF9xX2ZpbGxfaW5pdF9nZW5lcmFsX2RhdGEoYnAsIGNtZF9wYXJhbXMtPnFfb2JqLAorCQkJCSAgICAgICAmY21kX3BhcmFtcy0+cGFyYW1zLnNldHVwLmdlbl9wYXJhbXMsCisJCQkJICAgICAgICZkYXRhLT5nZW5lcmFsLAorCQkJCSAgICAgICAmY21kX3BhcmFtcy0+cGFyYW1zLnNldHVwLmZsYWdzKTsKKworCWJueDJ4X3FfZmlsbF9pbml0X3R4X2RhdGEoY21kX3BhcmFtcy0+cV9vYmosCisJCQkJICAmY21kX3BhcmFtcy0+cGFyYW1zLnNldHVwLnR4cV9wYXJhbXMsCisJCQkJICAmZGF0YS0+dHgsCisJCQkJICAmY21kX3BhcmFtcy0+cGFyYW1zLnNldHVwLmZsYWdzKTsKKworCWJueDJ4X3FfZmlsbF9pbml0X3J4X2RhdGEoY21kX3BhcmFtcy0+cV9vYmosCisJCQkJICAmY21kX3BhcmFtcy0+cGFyYW1zLnNldHVwLnJ4cV9wYXJhbXMsCisJCQkJICAmZGF0YS0+cngsCisJCQkJICAmY21kX3BhcmFtcy0+cGFyYW1zLnNldHVwLmZsYWdzKTsKKworCWJueDJ4X3FfZmlsbF9pbml0X3BhdXNlX2RhdGEoY21kX3BhcmFtcy0+cV9vYmosCisJCQkJICAgICAmY21kX3BhcmFtcy0+cGFyYW1zLnNldHVwLnBhdXNlX3BhcmFtcywKKwkJCQkgICAgICZkYXRhLT5yeCk7Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIGdlbmVyYWwgYW5kIHR4IHBhcnRzIG9mIGEgdHgtb25seSBxdWV1ZSBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGJueDJ4X3FfZmlsbF9zZXR1cF90eF9vbmx5KHN0cnVjdCBibngyeCAqYnAsCisJCQkJc3RydWN0IGJueDJ4X3F1ZXVlX3N0YXRlX3BhcmFtcyAqY21kX3BhcmFtcywKKwkJCQlzdHJ1Y3QgdHhfcXVldWVfaW5pdF9yYW1yb2RfZGF0YSAqZGF0YSkKK3sKKwlibngyeF9xX2ZpbGxfaW5pdF9nZW5lcmFsX2RhdGEoYnAsIGNtZF9wYXJhbXMtPnFfb2JqLAorCQkJCSAgICAgICAmY21kX3BhcmFtcy0+cGFyYW1zLnR4X29ubHkuZ2VuX3BhcmFtcywKKwkJCQkgICAgICAgJmRhdGEtPmdlbmVyYWwsCisJCQkJICAgICAgICZjbWRfcGFyYW1zLT5wYXJhbXMudHhfb25seS5mbGFncyk7CisKKwlibngyeF9xX2ZpbGxfaW5pdF90eF9kYXRhKGNtZF9wYXJhbXMtPnFfb2JqLAorCQkJCSAgJmNtZF9wYXJhbXMtPnBhcmFtcy50eF9vbmx5LnR4cV9wYXJhbXMsCisJCQkJICAmZGF0YS0+dHgsCisJCQkJICAmY21kX3BhcmFtcy0+cGFyYW1zLnR4X29ubHkuZmxhZ3MpOworCisJRFAoQk5YMlhfTVNHX1NQLCAiY2lkICVkLCB0eCBiZCBwYWdlIGxvICV4IGhpICV4IixjbWRfcGFyYW1zLT5xX29iai0+Y2lkc1swXSwKKwkgICBkYXRhLT50eC50eF9iZF9wYWdlX2Jhc2UubG8sIGRhdGEtPnR4LnR4X2JkX3BhZ2VfYmFzZS5oaSk7Cit9CisKKy8qKgorICogYm54MnhfcV9pbml0IC0gaW5pdCBIVy9GVyBxdWV1ZQorICoKKyAqIEBicDoJCWRldmljZSBoYW5kbGUKKyAqIEBwYXJhbXM6CisgKgorICogSFcvRlcgaW5pdGlhbCBRdWV1ZSBjb25maWd1cmF0aW9uOgorICogICAgICAtIEhDOiBSeCBhbmQgVHgKKyAqICAgICAgLSBDRFUgY29udGV4dCB2YWxpZGF0aW9uCisgKgorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9xX2luaXQoc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgICAgICBzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4X3F1ZXVlX3NwX29iaiAqbyA9IHBhcmFtcy0+cV9vYmo7CisJc3RydWN0IGJueDJ4X3F1ZXVlX2luaXRfcGFyYW1zICppbml0ID0gJnBhcmFtcy0+cGFyYW1zLmluaXQ7CisJdTE2IGhjX3VzZWM7CisJdTggY29zOworCisJLyogVHggSEMgY29uZmlndXJhdGlvbiAqLworCWlmICh0ZXN0X2JpdChCTlgyWF9RX1RZUEVfSEFTX1RYLCAmby0+dHlwZSkgJiYKKwkgICAgdGVzdF9iaXQoQk5YMlhfUV9GTEdfSEMsICZpbml0LT50eC5mbGFncykpIHsKKwkJaGNfdXNlYyA9IGluaXQtPnR4LmhjX3JhdGUgPyAxMDAwMDAwIC8gaW5pdC0+dHguaGNfcmF0ZSA6IDA7CisKKwkJYm54MnhfdXBkYXRlX2NvYWxlc2NlX3NiX2luZGV4KGJwLCBpbml0LT50eC5md19zYl9pZCwKKwkJCWluaXQtPnR4LnNiX2NxX2luZGV4LAorCQkJIXRlc3RfYml0KEJOWDJYX1FfRkxHX0hDX0VOLCAmaW5pdC0+dHguZmxhZ3MpLAorCQkJaGNfdXNlYyk7CisJfQorCisJLyogUnggSEMgY29uZmlndXJhdGlvbiAqLworCWlmICh0ZXN0X2JpdChCTlgyWF9RX1RZUEVfSEFTX1JYLCAmby0+dHlwZSkgJiYKKwkgICAgdGVzdF9iaXQoQk5YMlhfUV9GTEdfSEMsICZpbml0LT5yeC5mbGFncykpIHsKKwkJaGNfdXNlYyA9IGluaXQtPnJ4LmhjX3JhdGUgPyAxMDAwMDAwIC8gaW5pdC0+cnguaGNfcmF0ZSA6IDA7CisKKwkJYm54MnhfdXBkYXRlX2NvYWxlc2NlX3NiX2luZGV4KGJwLCBpbml0LT5yeC5md19zYl9pZCwKKwkJCWluaXQtPnJ4LnNiX2NxX2luZGV4LAorCQkJIXRlc3RfYml0KEJOWDJYX1FfRkxHX0hDX0VOLCAmaW5pdC0+cnguZmxhZ3MpLAorCQkJaGNfdXNlYyk7CisJfQorCisJLyogU2V0IENEVSBjb250ZXh0IHZhbGlkYXRpb24gdmFsdWVzICovCisJZm9yIChjb3MgPSAwOyBjb3MgPCBvLT5tYXhfY29zOyBjb3MrKykgeworCQlEUChCTlgyWF9NU0dfU1AsICJzZXR0aW5nIGNvbnRleHQgdmFsaWRhdGlvbi4gY2lkICVkLCBjb3MgJWQiLAorCQkJCSBvLT5jaWRzW2Nvc10sIGNvcyk7CisJCURQKEJOWDJYX01TR19TUCwgImNvbnRleHQgcG9pbnRlciAlcCIsIGluaXQtPmN4dHNbY29zXSk7CisJCWJueDJ4X3NldF9jdHhfdmFsaWRhdGlvbihicCwgaW5pdC0+Y3h0c1tjb3NdLCBvLT5jaWRzW2Nvc10pOworCX0KKworCS8qIEFzIG5vIHJhbXJvZCBpcyBzZW50LCBjb21wbGV0ZSB0aGUgY29tbWFuZCBpbW1lZGlhdGVseSAgKi8KKwlvLT5jb21wbGV0ZV9jbWQoYnAsIG8sIEJOWDJYX1FfQ01EX0lOSVQpOworCisJbW1pb3diKCk7CisJc21wX21iKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfcV9zZW5kX3NldHVwX2UxeChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQlzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4X3F1ZXVlX3NwX29iaiAqbyA9IHBhcmFtcy0+cV9vYmo7CisJc3RydWN0IGNsaWVudF9pbml0X3JhbXJvZF9kYXRhICpyZGF0YSA9CisJCShzdHJ1Y3QgY2xpZW50X2luaXRfcmFtcm9kX2RhdGEgKilvLT5yZGF0YTsKKwlkbWFfYWRkcl90IGRhdGFfbWFwcGluZyA9IG8tPnJkYXRhX21hcHBpbmc7CisJaW50IHJhbXJvZCA9IFJBTVJPRF9DTURfSURfRVRIX0NMSUVOVF9TRVRVUDsKKworCS8qIENsZWFyIHRoZSByYW1yb2QgZGF0YSAqLworCW1lbXNldChyZGF0YSwgMCwgc2l6ZW9mKCpyZGF0YSkpOworCisJLyogRmlsbCB0aGUgcmFtcm9kIGRhdGEgKi8KKwlibngyeF9xX2ZpbGxfc2V0dXBfZGF0YV9jbW4oYnAsIHBhcmFtcywgcmRhdGEpOworCisJLyoKKwkgKiAgTm8gbmVlZCBmb3IgYW4gZXhwbGljaXQgbWVtb3J5IGJhcnJpZXIgaGVyZSBhcyBsb25nIHdlIHdvdWxkCisJICogIG5lZWQgdG8gZW5zdXJlIHRoZSBvcmRlcmluZyBvZiB3cml0aW5nIHRvIHRoZSBTUFEgZWxlbWVudAorCSAqICBhbmQgdXBkYXRpbmcgb2YgdGhlIFNQUSBwcm9kdWNlciB3aGljaCBpbnZvbHZlcyBhIG1lbW9yeQorCSAqICByZWFkIGFuZCB3ZSB3aWxsIGhhdmUgdG8gcHV0IGEgZnVsbCBtZW1vcnkgYmFycmllciB0aGVyZQorCSAqICAoaW5zaWRlIGJueDJ4X3NwX3Bvc3QoKSkuCisJICovCisKKwlyZXR1cm4gYm54Mnhfc3BfcG9zdChicCwgcmFtcm9kLCBvLT5jaWRzW0JOWDJYX1BSSU1BUllfQ0lEX0lOREVYXSwKKwkJCSAgICAgVTY0X0hJKGRhdGFfbWFwcGluZyksCisJCQkgICAgIFU2NF9MTyhkYXRhX21hcHBpbmcpLCBFVEhfQ09OTkVDVElPTl9UWVBFKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfcV9zZW5kX3NldHVwX2UyKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCXN0cnVjdCBibngyeF9xdWV1ZV9zdGF0ZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnhfcXVldWVfc3Bfb2JqICpvID0gcGFyYW1zLT5xX29iajsKKwlzdHJ1Y3QgY2xpZW50X2luaXRfcmFtcm9kX2RhdGEgKnJkYXRhID0KKwkJKHN0cnVjdCBjbGllbnRfaW5pdF9yYW1yb2RfZGF0YSAqKW8tPnJkYXRhOworCWRtYV9hZGRyX3QgZGF0YV9tYXBwaW5nID0gby0+cmRhdGFfbWFwcGluZzsKKwlpbnQgcmFtcm9kID0gUkFNUk9EX0NNRF9JRF9FVEhfQ0xJRU5UX1NFVFVQOworCisJLyogQ2xlYXIgdGhlIHJhbXJvZCBkYXRhICovCisJbWVtc2V0KHJkYXRhLCAwLCBzaXplb2YoKnJkYXRhKSk7CisKKwkvKiBGaWxsIHRoZSByYW1yb2QgZGF0YSAqLworCWJueDJ4X3FfZmlsbF9zZXR1cF9kYXRhX2NtbihicCwgcGFyYW1zLCByZGF0YSk7CisJYm54MnhfcV9maWxsX3NldHVwX2RhdGFfZTIoYnAsIHBhcmFtcywgcmRhdGEpOworCisJLyoKKwkgKiAgTm8gbmVlZCBmb3IgYW4gZXhwbGljaXQgbWVtb3J5IGJhcnJpZXIgaGVyZSBhcyBsb25nIHdlIHdvdWxkCisJICogIG5lZWQgdG8gZW5zdXJlIHRoZSBvcmRlcmluZyBvZiB3cml0aW5nIHRvIHRoZSBTUFEgZWxlbWVudAorCSAqICBhbmQgdXBkYXRpbmcgb2YgdGhlIFNQUSBwcm9kdWNlciB3aGljaCBpbnZvbHZlcyBhIG1lbW9yeQorCSAqICByZWFkIGFuZCB3ZSB3aWxsIGhhdmUgdG8gcHV0IGEgZnVsbCBtZW1vcnkgYmFycmllciB0aGVyZQorCSAqICAoaW5zaWRlIGJueDJ4X3NwX3Bvc3QoKSkuCisJICovCisKKwlyZXR1cm4gYm54Mnhfc3BfcG9zdChicCwgcmFtcm9kLCBvLT5jaWRzW0JOWDJYX1BSSU1BUllfQ0lEX0lOREVYXSwKKwkJCSAgICAgVTY0X0hJKGRhdGFfbWFwcGluZyksCisJCQkgICAgIFU2NF9MTyhkYXRhX21hcHBpbmcpLCBFVEhfQ09OTkVDVElPTl9UWVBFKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfcV9zZW5kX3NldHVwX3R4X29ubHkoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgIHN0cnVjdCBibngyeF9xdWV1ZV9zdGF0ZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnhfcXVldWVfc3Bfb2JqICpvID0gcGFyYW1zLT5xX29iajsKKwlzdHJ1Y3QgdHhfcXVldWVfaW5pdF9yYW1yb2RfZGF0YSAqcmRhdGEgPQorCQkoc3RydWN0IHR4X3F1ZXVlX2luaXRfcmFtcm9kX2RhdGEgKilvLT5yZGF0YTsKKwlkbWFfYWRkcl90IGRhdGFfbWFwcGluZyA9IG8tPnJkYXRhX21hcHBpbmc7CisJaW50IHJhbXJvZCA9IFJBTVJPRF9DTURfSURfRVRIX1RYX1FVRVVFX1NFVFVQOworCXN0cnVjdCBibngyeF9xdWV1ZV9zZXR1cF90eF9vbmx5X3BhcmFtcyAqdHhfb25seV9wYXJhbXMgPQorCQkmcGFyYW1zLT5wYXJhbXMudHhfb25seTsKKwl1OCBjaWRfaW5kZXggPSB0eF9vbmx5X3BhcmFtcy0+Y2lkX2luZGV4OworCisKKwlpZiAoY2lkX2luZGV4ID49IG8tPm1heF9jb3MpIHsKKwkJQk5YMlhfRVJSKCJxdWV1ZVslZF06IGNpZF9pbmRleCAoJWQpIGlzIG91dCBvZiByYW5nZVxuIiwKKwkJCSAgby0+Y2xfaWQsIGNpZF9pbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCURQKEJOWDJYX01TR19TUCwgInBhcmFtZXRlcnMgcmVjZWl2ZWQ6IGNvczogJWQgc3AtaWQ6ICVkIiwKKwkJCSB0eF9vbmx5X3BhcmFtcy0+Z2VuX3BhcmFtcy5jb3MsCisJCQkgdHhfb25seV9wYXJhbXMtPmdlbl9wYXJhbXMuc3BjbF9pZCk7CisKKwkvKiBDbGVhciB0aGUgcmFtcm9kIGRhdGEgKi8KKwltZW1zZXQocmRhdGEsIDAsIHNpemVvZigqcmRhdGEpKTsKKworCS8qIEZpbGwgdGhlIHJhbXJvZCBkYXRhICovCisJYm54MnhfcV9maWxsX3NldHVwX3R4X29ubHkoYnAsIHBhcmFtcywgcmRhdGEpOworCisJRFAoQk5YMlhfTVNHX1NQLCAic2VuZGluZyB0eC1vbmx5IHJhbXJvZDogY2lkICVkLCBjbGllbnQtaWQgJWQsIgorCQkJICJzcC1jbGllbnQgaWQgJWQsIGNvcyAlZCIsCisJCQkgby0+Y2lkc1tjaWRfaW5kZXhdLAorCQkJIHJkYXRhLT5nZW5lcmFsLmNsaWVudF9pZCwKKwkJCSByZGF0YS0+Z2VuZXJhbC5zcF9jbGllbnRfaWQsIHJkYXRhLT5nZW5lcmFsLmNvcyk7CisKKwkvKgorCSAqICBObyBuZWVkIGZvciBhbiBleHBsaWNpdCBtZW1vcnkgYmFycmllciBoZXJlIGFzIGxvbmcgd2Ugd291bGQKKwkgKiAgbmVlZCB0byBlbnN1cmUgdGhlIG9yZGVyaW5nIG9mIHdyaXRpbmcgdG8gdGhlIFNQUSBlbGVtZW50CisJICogIGFuZCB1cGRhdGluZyBvZiB0aGUgU1BRIHByb2R1Y2VyIHdoaWNoIGludm9sdmVzIGEgbWVtb3J5CisJICogIHJlYWQgYW5kIHdlIHdpbGwgaGF2ZSB0byBwdXQgYSBmdWxsIG1lbW9yeSBiYXJyaWVyIHRoZXJlCisJICogIChpbnNpZGUgYm54Mnhfc3BfcG9zdCgpKS4KKwkgKi8KKworCXJldHVybiBibngyeF9zcF9wb3N0KGJwLCByYW1yb2QsIG8tPmNpZHNbY2lkX2luZGV4XSwKKwkJCSAgICAgVTY0X0hJKGRhdGFfbWFwcGluZyksCisJCQkgICAgIFU2NF9MTyhkYXRhX21hcHBpbmcpLCBFVEhfQ09OTkVDVElPTl9UWVBFKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfcV9maWxsX3VwZGF0ZV9kYXRhKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICBzdHJ1Y3QgYm54MnhfcXVldWVfc3Bfb2JqICpvYmosCisJCQkJICAgICBzdHJ1Y3QgYm54MnhfcXVldWVfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgICAgc3RydWN0IGNsaWVudF91cGRhdGVfcmFtcm9kX2RhdGEgKmRhdGEpCit7CisJLyogQ2xpZW50IElEIG9mIHRoZSBjbGllbnQgdG8gdXBkYXRlICovCisJZGF0YS0+Y2xpZW50X2lkID0gb2JqLT5jbF9pZDsKKworCS8qIEZ1bmN0aW9uIElEIG9mIHRoZSBjbGllbnQgdG8gdXBkYXRlICovCisJZGF0YS0+ZnVuY19pZCA9IG9iai0+ZnVuY19pZDsKKworCS8qIERlZmF1bHQgVkxBTiB2YWx1ZSAqLworCWRhdGEtPmRlZmF1bHRfdmxhbiA9IGNwdV90b19sZTE2KHBhcmFtcy0+ZGVmX3ZsYW4pOworCisJLyogSW5uZXIgVkxBTiBzdHJpcHBpbmcgKi8KKwlkYXRhLT5pbm5lcl92bGFuX3JlbW92YWxfZW5hYmxlX2ZsZyA9CisJCXRlc3RfYml0KEJOWDJYX1FfVVBEQVRFX0lOX1ZMQU5fUkVNLCAmcGFyYW1zLT51cGRhdGVfZmxhZ3MpOworCWRhdGEtPmlubmVyX3ZsYW5fcmVtb3ZhbF9jaGFuZ2VfZmxnID0KKwkJdGVzdF9iaXQoQk5YMlhfUV9VUERBVEVfSU5fVkxBTl9SRU1fQ0hORywKKwkJCSAmcGFyYW1zLT51cGRhdGVfZmxhZ3MpOworCisJLyogT3V0ZXIgVkxBTiBzcmlwcGluZyAqLworCWRhdGEtPm91dGVyX3ZsYW5fcmVtb3ZhbF9lbmFibGVfZmxnID0KKwkJdGVzdF9iaXQoQk5YMlhfUV9VUERBVEVfT1VUX1ZMQU5fUkVNLCAmcGFyYW1zLT51cGRhdGVfZmxhZ3MpOworCWRhdGEtPm91dGVyX3ZsYW5fcmVtb3ZhbF9jaGFuZ2VfZmxnID0KKwkJdGVzdF9iaXQoQk5YMlhfUV9VUERBVEVfT1VUX1ZMQU5fUkVNX0NITkcsCisJCQkgJnBhcmFtcy0+dXBkYXRlX2ZsYWdzKTsKKworCS8qIERyb3AgcGFja2V0cyB0aGF0IGhhdmUgc291cmNlIE1BQyB0aGF0IGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMKKwkgKiBRdWV1ZS4KKwkgKi8KKwlkYXRhLT5hbnRpX3Nwb29maW5nX2VuYWJsZV9mbGcgPQorCQl0ZXN0X2JpdChCTlgyWF9RX1VQREFURV9BTlRJX1NQT09GLCAmcGFyYW1zLT51cGRhdGVfZmxhZ3MpOworCWRhdGEtPmFudGlfc3Bvb2ZpbmdfY2hhbmdlX2ZsZyA9CisJCXRlc3RfYml0KEJOWDJYX1FfVVBEQVRFX0FOVElfU1BPT0ZfQ0hORywgJnBhcmFtcy0+dXBkYXRlX2ZsYWdzKTsKKworCS8qIEFjdGl2YXRlL0RlYWN0aXZhdGUgKi8KKwlkYXRhLT5hY3RpdmF0ZV9mbGcgPQorCQl0ZXN0X2JpdChCTlgyWF9RX1VQREFURV9BQ1RJVkFURSwgJnBhcmFtcy0+dXBkYXRlX2ZsYWdzKTsKKwlkYXRhLT5hY3RpdmF0ZV9jaGFuZ2VfZmxnID0KKwkJdGVzdF9iaXQoQk5YMlhfUV9VUERBVEVfQUNUSVZBVEVfQ0hORywgJnBhcmFtcy0+dXBkYXRlX2ZsYWdzKTsKKworCS8qIEVuYWJsZSBkZWZhdWx0IFZMQU4gKi8KKwlkYXRhLT5kZWZhdWx0X3ZsYW5fZW5hYmxlX2ZsZyA9CisJCXRlc3RfYml0KEJOWDJYX1FfVVBEQVRFX0RFRl9WTEFOX0VOLCAmcGFyYW1zLT51cGRhdGVfZmxhZ3MpOworCWRhdGEtPmRlZmF1bHRfdmxhbl9jaGFuZ2VfZmxnID0KKwkJdGVzdF9iaXQoQk5YMlhfUV9VUERBVEVfREVGX1ZMQU5fRU5fQ0hORywKKwkJCSAmcGFyYW1zLT51cGRhdGVfZmxhZ3MpOworCisJLyogc2lsZW50IHZsYW4gcmVtb3ZhbCAqLworCWRhdGEtPnNpbGVudF92bGFuX2NoYW5nZV9mbGcgPQorCQl0ZXN0X2JpdChCTlgyWF9RX1VQREFURV9TSUxFTlRfVkxBTl9SRU1fQ0hORywKKwkJCSAmcGFyYW1zLT51cGRhdGVfZmxhZ3MpOworCWRhdGEtPnNpbGVudF92bGFuX3JlbW92YWxfZmxnID0KKwkJdGVzdF9iaXQoQk5YMlhfUV9VUERBVEVfU0lMRU5UX1ZMQU5fUkVNLCAmcGFyYW1zLT51cGRhdGVfZmxhZ3MpOworCWRhdGEtPnNpbGVudF92bGFuX3ZhbHVlID0gY3B1X3RvX2xlMTYocGFyYW1zLT5zaWxlbnRfcmVtb3ZhbF92YWx1ZSk7CisJZGF0YS0+c2lsZW50X3ZsYW5fbWFzayA9IGNwdV90b19sZTE2KHBhcmFtcy0+c2lsZW50X3JlbW92YWxfbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3Ffc2VuZF91cGRhdGUoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICBzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4X3F1ZXVlX3NwX29iaiAqbyA9IHBhcmFtcy0+cV9vYmo7CisJc3RydWN0IGNsaWVudF91cGRhdGVfcmFtcm9kX2RhdGEgKnJkYXRhID0KKwkJKHN0cnVjdCBjbGllbnRfdXBkYXRlX3JhbXJvZF9kYXRhICopby0+cmRhdGE7CisJZG1hX2FkZHJfdCBkYXRhX21hcHBpbmcgPSBvLT5yZGF0YV9tYXBwaW5nOworCXN0cnVjdCBibngyeF9xdWV1ZV91cGRhdGVfcGFyYW1zICp1cGRhdGVfcGFyYW1zID0KKwkJJnBhcmFtcy0+cGFyYW1zLnVwZGF0ZTsKKwl1OCBjaWRfaW5kZXggPSB1cGRhdGVfcGFyYW1zLT5jaWRfaW5kZXg7CisKKwlpZiAoY2lkX2luZGV4ID49IG8tPm1heF9jb3MpIHsKKwkJQk5YMlhfRVJSKCJxdWV1ZVslZF06IGNpZF9pbmRleCAoJWQpIGlzIG91dCBvZiByYW5nZVxuIiwKKwkJCSAgby0+Y2xfaWQsIGNpZF9pbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJLyogQ2xlYXIgdGhlIHJhbXJvZCBkYXRhICovCisJbWVtc2V0KHJkYXRhLCAwLCBzaXplb2YoKnJkYXRhKSk7CisKKwkvKiBGaWxsIHRoZSByYW1yb2QgZGF0YSAqLworCWJueDJ4X3FfZmlsbF91cGRhdGVfZGF0YShicCwgbywgdXBkYXRlX3BhcmFtcywgcmRhdGEpOworCisJLyoKKwkgKiAgTm8gbmVlZCBmb3IgYW4gZXhwbGljaXQgbWVtb3J5IGJhcnJpZXIgaGVyZSBhcyBsb25nIHdlIHdvdWxkCisJICogIG5lZWQgdG8gZW5zdXJlIHRoZSBvcmRlcmluZyBvZiB3cml0aW5nIHRvIHRoZSBTUFEgZWxlbWVudAorCSAqICBhbmQgdXBkYXRpbmcgb2YgdGhlIFNQUSBwcm9kdWNlciB3aGljaCBpbnZvbHZlcyBhIG1lbW9yeQorCSAqICByZWFkIGFuZCB3ZSB3aWxsIGhhdmUgdG8gcHV0IGEgZnVsbCBtZW1vcnkgYmFycmllciB0aGVyZQorCSAqICAoaW5zaWRlIGJueDJ4X3NwX3Bvc3QoKSkuCisJICovCisKKwlyZXR1cm4gYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfQ0xJRU5UX1VQREFURSwKKwkJCSAgICAgby0+Y2lkc1tjaWRfaW5kZXhdLCBVNjRfSEkoZGF0YV9tYXBwaW5nKSwKKwkJCSAgICAgVTY0X0xPKGRhdGFfbWFwcGluZyksIEVUSF9DT05ORUNUSU9OX1RZUEUpOworfQorCisvKioKKyAqIGJueDJ4X3Ffc2VuZF9kZWFjdGl2YXRlIC0gc2VuZCBERUFDVElWQVRFIGNvbW1hbmQKKyAqCisgKiBAYnA6CQlkZXZpY2UgaGFuZGxlCisgKiBAcGFyYW1zOgorICoKKyAqIGltcGxlbWVudGVkIHVzaW5nIHRoZSBVUERBVEUgY29tbWFuZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYm54MnhfcV9zZW5kX2RlYWN0aXZhdGUoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJc3RydWN0IGJueDJ4X3F1ZXVlX3N0YXRlX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeF9xdWV1ZV91cGRhdGVfcGFyYW1zICp1cGRhdGUgPSAmcGFyYW1zLT5wYXJhbXMudXBkYXRlOworCisJbWVtc2V0KHVwZGF0ZSwgMCwgc2l6ZW9mKCp1cGRhdGUpKTsKKworCV9fc2V0X2JpdChCTlgyWF9RX1VQREFURV9BQ1RJVkFURV9DSE5HLCAmdXBkYXRlLT51cGRhdGVfZmxhZ3MpOworCisJcmV0dXJuIGJueDJ4X3Ffc2VuZF91cGRhdGUoYnAsIHBhcmFtcyk7Cit9CisKKy8qKgorICogYm54MnhfcV9zZW5kX2FjdGl2YXRlIC0gc2VuZCBBQ1RJVkFURSBjb21tYW5kCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQHBhcmFtczoKKyAqCisgKiBpbXBsZW1lbnRlZCB1c2luZyB0aGUgVVBEQVRFIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3Ffc2VuZF9hY3RpdmF0ZShzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQlzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4X3F1ZXVlX3VwZGF0ZV9wYXJhbXMgKnVwZGF0ZSA9ICZwYXJhbXMtPnBhcmFtcy51cGRhdGU7CisKKwltZW1zZXQodXBkYXRlLCAwLCBzaXplb2YoKnVwZGF0ZSkpOworCisJX19zZXRfYml0KEJOWDJYX1FfVVBEQVRFX0FDVElWQVRFLCAmdXBkYXRlLT51cGRhdGVfZmxhZ3MpOworCV9fc2V0X2JpdChCTlgyWF9RX1VQREFURV9BQ1RJVkFURV9DSE5HLCAmdXBkYXRlLT51cGRhdGVfZmxhZ3MpOworCisJcmV0dXJuIGJueDJ4X3Ffc2VuZF91cGRhdGUoYnAsIHBhcmFtcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3Ffc2VuZF91cGRhdGVfdHBhKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCXN0cnVjdCBibngyeF9xdWV1ZV9zdGF0ZV9wYXJhbXMgKnBhcmFtcykKK3sKKwkvKiBUT0RPOiBOb3QgaW1wbGVtZW50ZWQgeWV0LiAqLworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfcV9zZW5kX2hhbHQoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgc3RydWN0IGJueDJ4X3F1ZXVlX3N0YXRlX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogKm8gPSBwYXJhbXMtPnFfb2JqOworCisJcmV0dXJuIGJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX0hBTFQsCisJCQkgICAgIG8tPmNpZHNbQk5YMlhfUFJJTUFSWV9DSURfSU5ERVhdLCAwLCBvLT5jbF9pZCwKKwkJCSAgICAgRVRIX0NPTk5FQ1RJT05fVFlQRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X3Ffc2VuZF9jZmNfZGVsKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgIHN0cnVjdCBibngyeF9xdWV1ZV9zdGF0ZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm54MnhfcXVldWVfc3Bfb2JqICpvID0gcGFyYW1zLT5xX29iajsKKwl1OCBjaWRfaWR4ID0gcGFyYW1zLT5wYXJhbXMuY2ZjX2RlbC5jaWRfaW5kZXg7CisKKwlpZiAoY2lkX2lkeCA+PSBvLT5tYXhfY29zKSB7CisJCUJOWDJYX0VSUigicXVldWVbJWRdOiBjaWRfaW5kZXggKCVkKSBpcyBvdXQgb2YgcmFuZ2VcbiIsCisJCQkgIG8tPmNsX2lkLCBjaWRfaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfQ09NTU9OX0NGQ19ERUwsCisJCQkgICAgIG8tPmNpZHNbY2lkX2lkeF0sIDAsIDAsIE5PTkVfQ09OTkVDVElPTl9UWVBFKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfcV9zZW5kX3Rlcm1pbmF0ZShzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQlzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4X3F1ZXVlX3NwX29iaiAqbyA9IHBhcmFtcy0+cV9vYmo7CisJdTggY2lkX2luZGV4ID0gcGFyYW1zLT5wYXJhbXMudGVybWluYXRlLmNpZF9pbmRleDsKKworCWlmIChjaWRfaW5kZXggPj0gby0+bWF4X2NvcykgeworCQlCTlgyWF9FUlIoInF1ZXVlWyVkXTogY2lkX2luZGV4ICglZCkgaXMgb3V0IG9mIHJhbmdlXG4iLAorCQkJICBvLT5jbF9pZCwgY2lkX2luZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX1RFUk1JTkFURSwKKwkJCSAgICAgby0+Y2lkc1tjaWRfaW5kZXhdLCAwLCAwLCBFVEhfQ09OTkVDVElPTl9UWVBFKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfcV9zZW5kX2VtcHR5KHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICBzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4X3F1ZXVlX3NwX29iaiAqbyA9IHBhcmFtcy0+cV9vYmo7CisKKwlyZXR1cm4gYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfRU1QVFksCisJCQkgICAgIG8tPmNpZHNbQk5YMlhfUFJJTUFSWV9DSURfSU5ERVhdLCAwLCAwLAorCQkJICAgICBFVEhfQ09OTkVDVElPTl9UWVBFKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfcXVldWVfc2VuZF9jbWRfY21uKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCXN0cnVjdCBibngyeF9xdWV1ZV9zdGF0ZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlzd2l0Y2ggKHBhcmFtcy0+Y21kKSB7CisJY2FzZSBCTlgyWF9RX0NNRF9JTklUOgorCQlyZXR1cm4gYm54MnhfcV9pbml0KGJwLCBwYXJhbXMpOworCWNhc2UgQk5YMlhfUV9DTURfU0VUVVBfVFhfT05MWToKKwkJcmV0dXJuIGJueDJ4X3Ffc2VuZF9zZXR1cF90eF9vbmx5KGJwLCBwYXJhbXMpOworCWNhc2UgQk5YMlhfUV9DTURfREVBQ1RJVkFURToKKwkJcmV0dXJuIGJueDJ4X3Ffc2VuZF9kZWFjdGl2YXRlKGJwLCBwYXJhbXMpOworCWNhc2UgQk5YMlhfUV9DTURfQUNUSVZBVEU6CisJCXJldHVybiBibngyeF9xX3NlbmRfYWN0aXZhdGUoYnAsIHBhcmFtcyk7CisJY2FzZSBCTlgyWF9RX0NNRF9VUERBVEU6CisJCXJldHVybiBibngyeF9xX3NlbmRfdXBkYXRlKGJwLCBwYXJhbXMpOworCWNhc2UgQk5YMlhfUV9DTURfVVBEQVRFX1RQQToKKwkJcmV0dXJuIGJueDJ4X3Ffc2VuZF91cGRhdGVfdHBhKGJwLCBwYXJhbXMpOworCWNhc2UgQk5YMlhfUV9DTURfSEFMVDoKKwkJcmV0dXJuIGJueDJ4X3Ffc2VuZF9oYWx0KGJwLCBwYXJhbXMpOworCWNhc2UgQk5YMlhfUV9DTURfQ0ZDX0RFTDoKKwkJcmV0dXJuIGJueDJ4X3Ffc2VuZF9jZmNfZGVsKGJwLCBwYXJhbXMpOworCWNhc2UgQk5YMlhfUV9DTURfVEVSTUlOQVRFOgorCQlyZXR1cm4gYm54MnhfcV9zZW5kX3Rlcm1pbmF0ZShicCwgcGFyYW1zKTsKKwljYXNlIEJOWDJYX1FfQ01EX0VNUFRZOgorCQlyZXR1cm4gYm54MnhfcV9zZW5kX2VtcHR5KGJwLCBwYXJhbXMpOworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiVW5rbm93biBjb21tYW5kOiAlZFxuIiwgcGFyYW1zLT5jbWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfcXVldWVfc2VuZF9jbWRfZTF4KHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgIHN0cnVjdCBibngyeF9xdWV1ZV9zdGF0ZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlzd2l0Y2ggKHBhcmFtcy0+Y21kKSB7CisJY2FzZSBCTlgyWF9RX0NNRF9TRVRVUDoKKwkJcmV0dXJuIGJueDJ4X3Ffc2VuZF9zZXR1cF9lMXgoYnAsIHBhcmFtcyk7CisJY2FzZSBCTlgyWF9RX0NNRF9JTklUOgorCWNhc2UgQk5YMlhfUV9DTURfU0VUVVBfVFhfT05MWToKKwljYXNlIEJOWDJYX1FfQ01EX0RFQUNUSVZBVEU6CisJY2FzZSBCTlgyWF9RX0NNRF9BQ1RJVkFURToKKwljYXNlIEJOWDJYX1FfQ01EX1VQREFURToKKwljYXNlIEJOWDJYX1FfQ01EX1VQREFURV9UUEE6CisJY2FzZSBCTlgyWF9RX0NNRF9IQUxUOgorCWNhc2UgQk5YMlhfUV9DTURfQ0ZDX0RFTDoKKwljYXNlIEJOWDJYX1FfQ01EX1RFUk1JTkFURToKKwljYXNlIEJOWDJYX1FfQ01EX0VNUFRZOgorCQlyZXR1cm4gYm54MnhfcXVldWVfc2VuZF9jbWRfY21uKGJwLCBwYXJhbXMpOworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiVW5rbm93biBjb21tYW5kOiAlZFxuIiwgcGFyYW1zLT5jbWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfcXVldWVfc2VuZF9jbWRfZTIoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICBzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJc3dpdGNoIChwYXJhbXMtPmNtZCkgeworCWNhc2UgQk5YMlhfUV9DTURfU0VUVVA6CisJCXJldHVybiBibngyeF9xX3NlbmRfc2V0dXBfZTIoYnAsIHBhcmFtcyk7CisJY2FzZSBCTlgyWF9RX0NNRF9JTklUOgorCWNhc2UgQk5YMlhfUV9DTURfU0VUVVBfVFhfT05MWToKKwljYXNlIEJOWDJYX1FfQ01EX0RFQUNUSVZBVEU6CisJY2FzZSBCTlgyWF9RX0NNRF9BQ1RJVkFURToKKwljYXNlIEJOWDJYX1FfQ01EX1VQREFURToKKwljYXNlIEJOWDJYX1FfQ01EX1VQREFURV9UUEE6CisJY2FzZSBCTlgyWF9RX0NNRF9IQUxUOgorCWNhc2UgQk5YMlhfUV9DTURfQ0ZDX0RFTDoKKwljYXNlIEJOWDJYX1FfQ01EX1RFUk1JTkFURToKKwljYXNlIEJOWDJYX1FfQ01EX0VNUFRZOgorCQlyZXR1cm4gYm54MnhfcXVldWVfc2VuZF9jbWRfY21uKGJwLCBwYXJhbXMpOworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiVW5rbm93biBjb21tYW5kOiAlZFxuIiwgcGFyYW1zLT5jbWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qKgorICogYm54MnhfcXVldWVfY2hrX3RyYW5zaXRpb24gLSBjaGVjayBzdGF0ZSBtYWNoaW5lIG9mIGEgcmVndWxhciBRdWV1ZQorICoKKyAqIEBicDoJCWRldmljZSBoYW5kbGUKKyAqIEBvOgorICogQHBhcmFtczoKKyAqCisgKiAobm90IEZvcndhcmRpbmcpCisgKiBJdCBib3RoIGNoZWNrcyBpZiB0aGUgcmVxdWVzdGVkIGNvbW1hbmQgaXMgbGVnYWwgaW4gYSBjdXJyZW50CisgKiBzdGF0ZSBhbmQsIGlmIGl0J3MgbGVnYWwsIHNldHMgYSBgbmV4dF9zdGF0ZScgaW4gdGhlIG9iamVjdAorICogdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNvbXBsZXRpb24gZmxvdyB0byBzZXQgdGhlIGBzdGF0ZScKKyAqIG9mIHRoZSBvYmplY3QuCisgKgorICogcmV0dXJucyAwIGlmIGEgcmVxdWVzdGVkIGNvbW1hbmQgaXMgYSBsZWdhbCB0cmFuc2l0aW9uLAorICogICAgICAgICAtRUlOVkFMIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBibngyeF9xdWV1ZV9jaGtfdHJhbnNpdGlvbihzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgICAgIHN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogKm8sCisJCQkJICAgICAgc3RydWN0IGJueDJ4X3F1ZXVlX3N0YXRlX3BhcmFtcyAqcGFyYW1zKQoreworCWVudW0gYm54MnhfcV9zdGF0ZSBzdGF0ZSA9IG8tPnN0YXRlLCBuZXh0X3N0YXRlID0gQk5YMlhfUV9TVEFURV9NQVg7CisJZW51bSBibngyeF9xdWV1ZV9jbWQgY21kID0gcGFyYW1zLT5jbWQ7CisJc3RydWN0IGJueDJ4X3F1ZXVlX3VwZGF0ZV9wYXJhbXMgKnVwZGF0ZV9wYXJhbXMgPQorCQkgJnBhcmFtcy0+cGFyYW1zLnVwZGF0ZTsKKwl1OCBuZXh0X3R4X29ubHkgPSBvLT5udW1fdHhfb25seTsKKworCS8qCisJICogRm9yZ2V0IGFsbCBwZW5kaW5nIGZvciBjb21wbGV0aW9uIGNvbW1hbmRzIGlmIGEgZHJpdmVyIG9ubHkgc3RhdGUKKwkgKiB0cmFuc2l0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC4KKwkgKi8KKwlpZiAodGVzdF9iaXQoUkFNUk9EX0RSVl9DTFJfT05MWSwgJnBhcmFtcy0+cmFtcm9kX2ZsYWdzKSkgeworCQlvLT5wZW5kaW5nID0gMDsKKwkJby0+bmV4dF9zdGF0ZSA9IEJOWDJYX1FfU1RBVEVfTUFYOworCX0KKworCS8qCisJICogRG9uJ3QgYWxsb3cgYSBuZXh0IHN0YXRlIHRyYW5zaXRpb24gaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YKKwkgKiB0aGUgcHJldmlvdXMgb25lLgorCSAqLworCWlmIChvLT5wZW5kaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgQk5YMlhfUV9TVEFURV9SRVNFVDoKKwkJaWYgKGNtZCA9PSBCTlgyWF9RX0NNRF9JTklUKQorCQkJbmV4dF9zdGF0ZSA9IEJOWDJYX1FfU1RBVEVfSU5JVElBTElaRUQ7CisKKwkJYnJlYWs7CisJY2FzZSBCTlgyWF9RX1NUQVRFX0lOSVRJQUxJWkVEOgorCQlpZiAoY21kID09IEJOWDJYX1FfQ01EX1NFVFVQKSB7CisJCQlpZiAodGVzdF9iaXQoQk5YMlhfUV9GTEdfQUNUSVZFLAorCQkJCSAgICAgJnBhcmFtcy0+cGFyYW1zLnNldHVwLmZsYWdzKSkKKwkJCQluZXh0X3N0YXRlID0gQk5YMlhfUV9TVEFURV9BQ1RJVkU7CisJCQllbHNlCisJCQkJbmV4dF9zdGF0ZSA9IEJOWDJYX1FfU1RBVEVfSU5BQ1RJVkU7CisJCX0KKworCQlicmVhazsKKwljYXNlIEJOWDJYX1FfU1RBVEVfQUNUSVZFOgorCQlpZiAoY21kID09IEJOWDJYX1FfQ01EX0RFQUNUSVZBVEUpCisJCQluZXh0X3N0YXRlID0gQk5YMlhfUV9TVEFURV9JTkFDVElWRTsKKworCQllbHNlIGlmICgoY21kID09IEJOWDJYX1FfQ01EX0VNUFRZKSB8fAorCQkJIChjbWQgPT0gQk5YMlhfUV9DTURfVVBEQVRFX1RQQSkpCisJCQluZXh0X3N0YXRlID0gQk5YMlhfUV9TVEFURV9BQ1RJVkU7CisKKwkJZWxzZSBpZiAoY21kID09IEJOWDJYX1FfQ01EX1NFVFVQX1RYX09OTFkpIHsKKwkJCW5leHRfc3RhdGUgPSBCTlgyWF9RX1NUQVRFX01VTFRJX0NPUzsKKwkJCW5leHRfdHhfb25seSA9IDE7CisJCX0KKworCQllbHNlIGlmIChjbWQgPT0gQk5YMlhfUV9DTURfSEFMVCkKKwkJCW5leHRfc3RhdGUgPSBCTlgyWF9RX1NUQVRFX1NUT1BQRUQ7CisKKwkJZWxzZSBpZiAoY21kID09IEJOWDJYX1FfQ01EX1VQREFURSkgeworCQkJLyogSWYgImFjdGl2ZSIgc3RhdGUgY2hhbmdlIGlzIHJlcXVlc3RlZCwgdXBkYXRlIHRoZQorCQkJICogIHN0YXRlIGFjY29yZGluZ2x5LgorCQkJICovCisJCQlpZiAodGVzdF9iaXQoQk5YMlhfUV9VUERBVEVfQUNUSVZBVEVfQ0hORywKKwkJCQkgICAgICZ1cGRhdGVfcGFyYW1zLT51cGRhdGVfZmxhZ3MpICYmCisJCQkgICAgIXRlc3RfYml0KEJOWDJYX1FfVVBEQVRFX0FDVElWQVRFLAorCQkJCSAgICAgICZ1cGRhdGVfcGFyYW1zLT51cGRhdGVfZmxhZ3MpKQorCQkJCW5leHRfc3RhdGUgPSBCTlgyWF9RX1NUQVRFX0lOQUNUSVZFOworCQkJZWxzZQorCQkJCW5leHRfc3RhdGUgPSBCTlgyWF9RX1NUQVRFX0FDVElWRTsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgQk5YMlhfUV9TVEFURV9NVUxUSV9DT1M6CisJCWlmIChjbWQgPT0gQk5YMlhfUV9DTURfVEVSTUlOQVRFKQorCQkJbmV4dF9zdGF0ZSA9IEJOWDJYX1FfU1RBVEVfTUNPU19URVJNSU5BVEVEOworCisJCWVsc2UgaWYgKGNtZCA9PSBCTlgyWF9RX0NNRF9TRVRVUF9UWF9PTkxZKSB7CisJCQluZXh0X3N0YXRlID0gQk5YMlhfUV9TVEFURV9NVUxUSV9DT1M7CisJCQluZXh0X3R4X29ubHkgPSBvLT5udW1fdHhfb25seSArIDE7CisJCX0KKworCQllbHNlIGlmICgoY21kID09IEJOWDJYX1FfQ01EX0VNUFRZKSB8fAorCQkJIChjbWQgPT0gQk5YMlhfUV9DTURfVVBEQVRFX1RQQSkpCisJCQluZXh0X3N0YXRlID0gQk5YMlhfUV9TVEFURV9NVUxUSV9DT1M7CisKKwkJZWxzZSBpZiAoY21kID09IEJOWDJYX1FfQ01EX1VQREFURSkgeworCQkJLyogSWYgImFjdGl2ZSIgc3RhdGUgY2hhbmdlIGlzIHJlcXVlc3RlZCwgdXBkYXRlIHRoZQorCQkJICogIHN0YXRlIGFjY29yZGluZ2x5LgorCQkJICovCisJCQlpZiAodGVzdF9iaXQoQk5YMlhfUV9VUERBVEVfQUNUSVZBVEVfQ0hORywKKwkJCQkgICAgICZ1cGRhdGVfcGFyYW1zLT51cGRhdGVfZmxhZ3MpICYmCisJCQkgICAgIXRlc3RfYml0KEJOWDJYX1FfVVBEQVRFX0FDVElWQVRFLAorCQkJCSAgICAgICZ1cGRhdGVfcGFyYW1zLT51cGRhdGVfZmxhZ3MpKQorCQkJCW5leHRfc3RhdGUgPSBCTlgyWF9RX1NUQVRFX0lOQUNUSVZFOworCQkJZWxzZQorCQkJCW5leHRfc3RhdGUgPSBCTlgyWF9RX1NUQVRFX01VTFRJX0NPUzsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgQk5YMlhfUV9TVEFURV9NQ09TX1RFUk1JTkFURUQ6CisJCWlmIChjbWQgPT0gQk5YMlhfUV9DTURfQ0ZDX0RFTCkgeworCQkJbmV4dF90eF9vbmx5ID0gby0+bnVtX3R4X29ubHkgLSAxOworCQkJaWYgKG5leHRfdHhfb25seSA9PSAwKQorCQkJCW5leHRfc3RhdGUgPSBCTlgyWF9RX1NUQVRFX0FDVElWRTsKKwkJCWVsc2UKKwkJCQluZXh0X3N0YXRlID0gQk5YMlhfUV9TVEFURV9NVUxUSV9DT1M7CisJCX0KKworCQlicmVhazsKKwljYXNlIEJOWDJYX1FfU1RBVEVfSU5BQ1RJVkU6CisJCWlmIChjbWQgPT0gQk5YMlhfUV9DTURfQUNUSVZBVEUpCisJCQluZXh0X3N0YXRlID0gQk5YMlhfUV9TVEFURV9BQ1RJVkU7CisKKwkJZWxzZSBpZiAoKGNtZCA9PSBCTlgyWF9RX0NNRF9FTVBUWSkgfHwKKwkJCSAoY21kID09IEJOWDJYX1FfQ01EX1VQREFURV9UUEEpKQorCQkJbmV4dF9zdGF0ZSA9IEJOWDJYX1FfU1RBVEVfSU5BQ1RJVkU7CisKKwkJZWxzZSBpZiAoY21kID09IEJOWDJYX1FfQ01EX0hBTFQpCisJCQluZXh0X3N0YXRlID0gQk5YMlhfUV9TVEFURV9TVE9QUEVEOworCisJCWVsc2UgaWYgKGNtZCA9PSBCTlgyWF9RX0NNRF9VUERBVEUpIHsKKwkJCS8qIElmICJhY3RpdmUiIHN0YXRlIGNoYW5nZSBpcyByZXF1ZXN0ZWQsIHVwZGF0ZSB0aGUKKwkJCSAqIHN0YXRlIGFjY29yZGluZ2x5LgorCQkJICovCisJCQlpZiAodGVzdF9iaXQoQk5YMlhfUV9VUERBVEVfQUNUSVZBVEVfQ0hORywKKwkJCQkgICAgICZ1cGRhdGVfcGFyYW1zLT51cGRhdGVfZmxhZ3MpICYmCisJCQkgICAgdGVzdF9iaXQoQk5YMlhfUV9VUERBVEVfQUNUSVZBVEUsCisJCQkJICAgICAmdXBkYXRlX3BhcmFtcy0+dXBkYXRlX2ZsYWdzKSl7CisJCQkJaWYgKG8tPm51bV90eF9vbmx5ID09IDApCisJCQkJCW5leHRfc3RhdGUgPSBCTlgyWF9RX1NUQVRFX0FDVElWRTsKKwkJCQllbHNlIC8qIHR4IG9ubHkgcXVldWVzIGV4aXN0IGZvciB0aGlzIHF1ZXVlICovCisJCQkJCW5leHRfc3RhdGUgPSBCTlgyWF9RX1NUQVRFX01VTFRJX0NPUzsKKwkJCX0gZWxzZQorCQkJCW5leHRfc3RhdGUgPSBCTlgyWF9RX1NUQVRFX0lOQUNUSVZFOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBCTlgyWF9RX1NUQVRFX1NUT1BQRUQ6CisJCWlmIChjbWQgPT0gQk5YMlhfUV9DTURfVEVSTUlOQVRFKQorCQkJbmV4dF9zdGF0ZSA9IEJOWDJYX1FfU1RBVEVfVEVSTUlOQVRFRDsKKworCQlicmVhazsKKwljYXNlIEJOWDJYX1FfU1RBVEVfVEVSTUlOQVRFRDoKKwkJaWYgKGNtZCA9PSBCTlgyWF9RX0NNRF9DRkNfREVMKQorCQkJbmV4dF9zdGF0ZSA9IEJOWDJYX1FfU1RBVEVfUkVTRVQ7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQk5YMlhfRVJSKCJJbGxlZ2FsIHN0YXRlOiAlZFxuIiwgc3RhdGUpOworCX0KKworCS8qIFRyYW5zaXRpb24gaXMgYXNzdXJlZCAqLworCWlmIChuZXh0X3N0YXRlICE9IEJOWDJYX1FfU1RBVEVfTUFYKSB7CisJCURQKEJOWDJYX01TR19TUCwgIkdvb2Qgc3RhdGUgdHJhbnNpdGlvbjogJWQoJWQpLT4lZFxuIiwKKwkJCQkgc3RhdGUsIGNtZCwgbmV4dF9zdGF0ZSk7CisJCW8tPm5leHRfc3RhdGUgPSBuZXh0X3N0YXRlOworCQlvLT5uZXh0X3R4X29ubHkgPSBuZXh0X3R4X29ubHk7CisJCXJldHVybiAwOworCX0KKworCURQKEJOWDJYX01TR19TUCwgIkJhZCBzdGF0ZSB0cmFuc2l0aW9uIHJlcXVlc3Q6ICVkICVkXG4iLCBzdGF0ZSwgY21kKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCit2b2lkIGJueDJ4X2luaXRfcXVldWVfb2JqKHN0cnVjdCBibngyeCAqYnAsCisJCQkgIHN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogKm9iaiwKKwkJCSAgdTggY2xfaWQsIHUzMiAqY2lkcywgdTggY2lkX2NudCwgdTggZnVuY19pZCwKKwkJCSAgdm9pZCAqcmRhdGEsCisJCQkgIGRtYV9hZGRyX3QgcmRhdGFfbWFwcGluZywgdW5zaWduZWQgbG9uZyB0eXBlKQoreworCW1lbXNldChvYmosIDAsIHNpemVvZigqb2JqKSk7CisKKwkvKiBXZSBzdXBwb3J0IG9ubHkgQk5YMlhfTVVMVElfVFhfQ09TIFR4IENvUyBhdCB0aGUgbW9tZW50ICovCisJQlVHX09OKEJOWDJYX01VTFRJX1RYX0NPUyA8IGNpZF9jbnQpOworCisJbWVtY3B5KG9iai0+Y2lkcywgY2lkcywgc2l6ZW9mKG9iai0+Y2lkc1swXSkgKiBjaWRfY250KTsKKwlvYmotPm1heF9jb3MgPSBjaWRfY250OworCW9iai0+Y2xfaWQgPSBjbF9pZDsKKwlvYmotPmZ1bmNfaWQgPSBmdW5jX2lkOworCW9iai0+cmRhdGEgPSByZGF0YTsKKwlvYmotPnJkYXRhX21hcHBpbmcgPSByZGF0YV9tYXBwaW5nOworCW9iai0+dHlwZSA9IHR5cGU7CisJb2JqLT5uZXh0X3N0YXRlID0gQk5YMlhfUV9TVEFURV9NQVg7CisKKwlpZiAoQ0hJUF9JU19FMXgoYnApKQorCQlvYmotPnNlbmRfY21kID0gYm54MnhfcXVldWVfc2VuZF9jbWRfZTF4OworCWVsc2UKKwkJb2JqLT5zZW5kX2NtZCA9IGJueDJ4X3F1ZXVlX3NlbmRfY21kX2UyOworCisJb2JqLT5jaGVja190cmFuc2l0aW9uID0gYm54MnhfcXVldWVfY2hrX3RyYW5zaXRpb247CisKKwlvYmotPmNvbXBsZXRlX2NtZCA9IGJueDJ4X3F1ZXVlX2NvbXBfY21kOworCW9iai0+d2FpdF9jb21wID0gYm54MnhfcXVldWVfd2FpdF9jb21wOworCW9iai0+c2V0X3BlbmRpbmcgPSBibngyeF9xdWV1ZV9zZXRfcGVuZGluZzsKK30KKwordm9pZCBibngyeF9xdWV1ZV9zZXRfY29zX2NpZChzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgICBzdHJ1Y3QgYm54MnhfcXVldWVfc3Bfb2JqICpvYmosCisJCQkgICAgIHUzMiBjaWQsIHU4IGluZGV4KQoreworCW9iai0+Y2lkc1tpbmRleF0gPSBjaWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqIEZ1bmN0aW9uIHN0YXRlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlbnVtIGJueDJ4X2Z1bmNfc3RhdGUgYm54MnhfZnVuY19nZXRfc3RhdGUoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJICAgc3RydWN0IGJueDJ4X2Z1bmNfc3Bfb2JqICpvKQoreworCS8qIGluIHRoZSBtaWRkbGUgb2YgdHJhbnNhY3Rpb24gLSByZXR1cm4gSU5WQUxJRCBzdGF0ZSAqLworCWlmIChvLT5wZW5kaW5nKQorCQlyZXR1cm4gQk5YMlhfRl9TVEFURV9NQVg7CisKKwkvKgorCSAqIHVuc3VyZSB0aGUgb3JkZXIgb2YgcmVhZGluZyBvZiBvLT5wZW5kaW5nIGFuZCBvLT5zdGF0ZQorCSAqIG8tPnBlbmRpbmcgc2hvdWxkIGJlIHJlYWQgZmlyc3QKKwkgKi8KKwlybWIoKTsKKworCXJldHVybiBvLT5zdGF0ZTsKK30KKworc3RhdGljIGludCBibngyeF9mdW5jX3dhaXRfY29tcChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCXN0cnVjdCBibngyeF9mdW5jX3NwX29iaiAqbywKKwkJCQllbnVtIGJueDJ4X2Z1bmNfY21kIGNtZCkKK3sKKwlyZXR1cm4gYm54Mnhfc3RhdGVfd2FpdChicCwgY21kLCAmby0+cGVuZGluZyk7Cit9CisKKy8qKgorICogYm54MnhfZnVuY19zdGF0ZV9jaGFuZ2VfY29tcCAtIGNvbXBsZXRlIHRoZSBzdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb24KKyAqCisgKiBAYnA6CQlkZXZpY2UgaGFuZGxlCisgKiBAbzoKKyAqIEBjbWQ6CisgKgorICogQ2FsbGVkIG9uIHN0YXRlIGNoYW5nZSB0cmFuc2l0aW9uLiBDb21wbGV0ZXMgdGhlIHN0YXRlCisgKiBtYWNoaW5lIHRyYW5zaXRpb24gb25seSAtIG5vIEhXIGludGVyYWN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9mdW5jX3N0YXRlX2NoYW5nZV9jb21wKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCSAgICAgICBzdHJ1Y3QgYm54MnhfZnVuY19zcF9vYmogKm8sCisJCQkJCSAgICAgICBlbnVtIGJueDJ4X2Z1bmNfY21kIGNtZCkKK3sKKwl1bnNpZ25lZCBsb25nIGN1cl9wZW5kaW5nID0gby0+cGVuZGluZzsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KGNtZCwgJmN1cl9wZW5kaW5nKSkgeworCQlCTlgyWF9FUlIoIkJhZCBNQyByZXBseSAlZCBmb3IgZnVuYyAlZCBpbiBzdGF0ZSAlZCAiCisJCQkgICJwZW5kaW5nIDB4JWx4LCBuZXh0X3N0YXRlICVkXG4iLCBjbWQsIEJQX0ZVTkMoYnApLAorCQkJICBvLT5zdGF0ZSwgY3VyX3BlbmRpbmcsIG8tPm5leHRfc3RhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlEUChCTlgyWF9NU0dfU1AsICJDb21wbGV0aW5nIGNvbW1hbmQgJWQgZm9yIGZ1bmMgJWQsIHNldHRpbmcgc3RhdGUgdG8gIgorCQkJICIlZFxuIiwgY21kLCBCUF9GVU5DKGJwKSwgby0+bmV4dF9zdGF0ZSk7CisKKwlvLT5zdGF0ZSA9IG8tPm5leHRfc3RhdGU7CisJby0+bmV4dF9zdGF0ZSA9IEJOWDJYX0ZfU1RBVEVfTUFYOworCisJLyogSXQncyBpbXBvcnRhbnQgdGhhdCBvLT5zdGF0ZSBhbmQgby0+bmV4dF9zdGF0ZSBhcmUKKwkgKiB1cGRhdGVkIGJlZm9yZSBvLT5wZW5kaW5nLgorCSAqLworCXdtYigpOworCisJY2xlYXJfYml0KGNtZCwgJm8tPnBlbmRpbmcpOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBibngyeF9mdW5jX2NvbXBfY21kIC0gY29tcGxldGUgdGhlIHN0YXRlIGNoYW5nZSBjb21tYW5kCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQG86CisgKiBAY21kOgorICoKKyAqIENoZWNrcyB0aGF0IHRoZSBhcnJpdmVkIGNvbXBsZXRpb24gaXMgZXhwZWN0ZWQuCisgKi8KK3N0YXRpYyBpbnQgYm54MnhfZnVuY19jb21wX2NtZChzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgICAgIHN0cnVjdCBibngyeF9mdW5jX3NwX29iaiAqbywKKwkJCSAgICAgICBlbnVtIGJueDJ4X2Z1bmNfY21kIGNtZCkKK3sKKwkvKiBDb21wbGV0ZSB0aGUgc3RhdGUgbWFjaGluZSBwYXJ0IGZpcnN0LCBjaGVjayBpZiBpdCdzIGEKKwkgKiBsZWdhbCBjb21wbGV0aW9uLgorCSAqLworCWludCByYyA9IGJueDJ4X2Z1bmNfc3RhdGVfY2hhbmdlX2NvbXAoYnAsIG8sIGNtZCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGJueDJ4X2Z1bmNfY2hrX3RyYW5zaXRpb24gLSBwZXJmb3JtIGZ1bmN0aW9uIHN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbgorICoKKyAqIEBicDoJCWRldmljZSBoYW5kbGUKKyAqIEBvOgorICogQHBhcmFtczoKKyAqCisgKiBJdCBib3RoIGNoZWNrcyBpZiB0aGUgcmVxdWVzdGVkIGNvbW1hbmQgaXMgbGVnYWwgaW4gYSBjdXJyZW50CisgKiBzdGF0ZSBhbmQsIGlmIGl0J3MgbGVnYWwsIHNldHMgYSBgbmV4dF9zdGF0ZScgaW4gdGhlIG9iamVjdAorICogdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNvbXBsZXRpb24gZmxvdyB0byBzZXQgdGhlIGBzdGF0ZScKKyAqIG9mIHRoZSBvYmplY3QuCisgKgorICogcmV0dXJucyAwIGlmIGEgcmVxdWVzdGVkIGNvbW1hbmQgaXMgYSBsZWdhbCB0cmFuc2l0aW9uLAorICogICAgICAgICAtRUlOVkFMIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBibngyeF9mdW5jX2Noa190cmFuc2l0aW9uKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICBzdHJ1Y3QgYm54MnhfZnVuY19zcF9vYmogKm8sCisJCQkJICAgICBzdHJ1Y3QgYm54MnhfZnVuY19zdGF0ZV9wYXJhbXMgKnBhcmFtcykKK3sKKwllbnVtIGJueDJ4X2Z1bmNfc3RhdGUgc3RhdGUgPSBvLT5zdGF0ZSwgbmV4dF9zdGF0ZSA9IEJOWDJYX0ZfU1RBVEVfTUFYOworCWVudW0gYm54MnhfZnVuY19jbWQgY21kID0gcGFyYW1zLT5jbWQ7CisKKwkvKgorCSAqIEZvcmdldCBhbGwgcGVuZGluZyBmb3IgY29tcGxldGlvbiBjb21tYW5kcyBpZiBhIGRyaXZlciBvbmx5IHN0YXRlCisJICogdHJhbnNpdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuCisJICovCisJaWYgKHRlc3RfYml0KFJBTVJPRF9EUlZfQ0xSX09OTFksICZwYXJhbXMtPnJhbXJvZF9mbGFncykpIHsKKwkJby0+cGVuZGluZyA9IDA7CisJCW8tPm5leHRfc3RhdGUgPSBCTlgyWF9GX1NUQVRFX01BWDsKKwl9CisKKwkvKgorCSAqIERvbid0IGFsbG93IGEgbmV4dCBzdGF0ZSB0cmFuc2l0aW9uIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mCisJICogdGhlIHByZXZpb3VzIG9uZS4KKwkgKi8KKwlpZiAoby0+cGVuZGluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEJOWDJYX0ZfU1RBVEVfUkVTRVQ6CisJCWlmIChjbWQgPT0gQk5YMlhfRl9DTURfSFdfSU5JVCkKKwkJCW5leHRfc3RhdGUgPSBCTlgyWF9GX1NUQVRFX0lOSVRJQUxJWkVEOworCisJCWJyZWFrOworCWNhc2UgQk5YMlhfRl9TVEFURV9JTklUSUFMSVpFRDoKKwkJaWYgKGNtZCA9PSBCTlgyWF9GX0NNRF9TVEFSVCkKKwkJCW5leHRfc3RhdGUgPSBCTlgyWF9GX1NUQVRFX1NUQVJURUQ7CisKKwkJZWxzZSBpZiAoY21kID09IEJOWDJYX0ZfQ01EX0hXX1JFU0VUKQorCQkJbmV4dF9zdGF0ZSA9IEJOWDJYX0ZfU1RBVEVfUkVTRVQ7CisKKwkJYnJlYWs7CisJY2FzZSBCTlgyWF9GX1NUQVRFX1NUQVJURUQ6CisJCWlmIChjbWQgPT0gQk5YMlhfRl9DTURfU1RPUCkKKwkJCW5leHRfc3RhdGUgPSBCTlgyWF9GX1NUQVRFX0lOSVRJQUxJWkVEOworCQllbHNlIGlmIChjbWQgPT0gQk5YMlhfRl9DTURfVFhfU1RPUCkKKwkJCW5leHRfc3RhdGUgPSBCTlgyWF9GX1NUQVRFX1RYX1NUT1BQRUQ7CisKKwkJYnJlYWs7CisJY2FzZSBCTlgyWF9GX1NUQVRFX1RYX1NUT1BQRUQ6CisJCWlmIChjbWQgPT0gQk5YMlhfRl9DTURfVFhfU1RBUlQpCisJCQluZXh0X3N0YXRlID0gQk5YMlhfRl9TVEFURV9TVEFSVEVEOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiVW5rbm93biBzdGF0ZTogJWRcbiIsIHN0YXRlKTsKKwl9CisKKwkvKiBUcmFuc2l0aW9uIGlzIGFzc3VyZWQgKi8KKwlpZiAobmV4dF9zdGF0ZSAhPSBCTlgyWF9GX1NUQVRFX01BWCkgeworCQlEUChCTlgyWF9NU0dfU1AsICJHb29kIGZ1bmN0aW9uIHN0YXRlIHRyYW5zaXRpb246ICVkKCVkKS0+JWRcbiIsCisJCQkJIHN0YXRlLCBjbWQsIG5leHRfc3RhdGUpOworCQlvLT5uZXh0X3N0YXRlID0gbmV4dF9zdGF0ZTsKKwkJcmV0dXJuIDA7CisJfQorCisJRFAoQk5YMlhfTVNHX1NQLCAiQmFkIGZ1bmN0aW9uIHN0YXRlIHRyYW5zaXRpb24gcmVxdWVzdDogJWQgJWRcbiIsCisJCQkgc3RhdGUsIGNtZCk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiBibngyeF9mdW5jX2luaXRfZnVuYyAtIHBlcmZvcm1zIEhXIGluaXQgYXQgZnVuY3Rpb24gc3RhZ2UKKyAqCisgKiBAYnA6CQlkZXZpY2UgaGFuZGxlCisgKiBAZHJ2OgorICoKKyAqIEluaXQgSFcgd2hlbiB0aGUgY3VycmVudCBwaGFzZSBpcworICogRldfTVNHX0NPREVfRFJWX0xPQURfRlVOQ1RJT046IGluaXRpYWxpemUgb25seSBGVU5DVElPTi1vbmx5CisgKiBIVyBibG9ja3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2Z1bmNfaW5pdF9mdW5jKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBibngyeF9mdW5jX3NwX2Rydl9vcHMgKmRydikKK3sKKwlyZXR1cm4gZHJ2LT5pbml0X2h3X2Z1bmMoYnApOworfQorCisvKioKKyAqIGJueDJ4X2Z1bmNfaW5pdF9wb3J0IC0gcGVyZm9ybXMgSFcgaW5pdCBhdCBwb3J0IHN0YWdlCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQGRydjoKKyAqCisgKiBJbml0IEhXIHdoZW4gdGhlIGN1cnJlbnQgcGhhc2UgaXMKKyAqIEZXX01TR19DT0RFX0RSVl9MT0FEX1BPUlQ6IGluaXRpYWxpemUgUE9SVC1vbmx5IGFuZAorICogRlVOQ1RJT04tb25seSBIVyBibG9ja3MuCisgKgorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9mdW5jX2luaXRfcG9ydChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYm54MnhfZnVuY19zcF9kcnZfb3BzICpkcnYpCit7CisJaW50IHJjID0gZHJ2LT5pbml0X2h3X3BvcnQoYnApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGJueDJ4X2Z1bmNfaW5pdF9mdW5jKGJwLCBkcnYpOworfQorCisvKioKKyAqIGJueDJ4X2Z1bmNfaW5pdF9jbW5fY2hpcCAtIHBlcmZvcm1zIEhXIGluaXQgYXQgY2hpcC1jb21tb24gc3RhZ2UKKyAqCisgKiBAYnA6CQlkZXZpY2UgaGFuZGxlCisgKiBAZHJ2OgorICoKKyAqIEluaXQgSFcgd2hlbiB0aGUgY3VycmVudCBwaGFzZSBpcworICogRldfTVNHX0NPREVfRFJWX0xPQURfQ09NTU9OX0NISVA6IGluaXRpYWxpemUgQ09NTU9OX0NISVAsCisgKiBQT1JULW9ubHkgYW5kIEZVTkNUSU9OLW9ubHkgSFcgYmxvY2tzLgorICovCitzdGF0aWMgaW5saW5lIGludCBibngyeF9mdW5jX2luaXRfY21uX2NoaXAoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJY29uc3Qgc3RydWN0IGJueDJ4X2Z1bmNfc3BfZHJ2X29wcyAqZHJ2KQoreworCWludCByYyA9IGRydi0+aW5pdF9od19jbW5fY2hpcChicCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gYm54MnhfZnVuY19pbml0X3BvcnQoYnAsIGRydik7Cit9CisKKy8qKgorICogYm54MnhfZnVuY19pbml0X2NtbiAtIHBlcmZvcm1zIEhXIGluaXQgYXQgY29tbW9uIHN0YWdlCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQGRydjoKKyAqCisgKiBJbml0IEhXIHdoZW4gdGhlIGN1cnJlbnQgcGhhc2UgaXMKKyAqIEZXX01TR19DT0RFX0RSVl9MT0FEX0NPTU1PTl9DSElQOiBpbml0aWFsaXplIENPTU1PTiwKKyAqIFBPUlQtb25seSBhbmQgRlVOQ1RJT04tb25seSBIVyBibG9ja3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJueDJ4X2Z1bmNfaW5pdF9jbW4oc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgYm54MnhfZnVuY19zcF9kcnZfb3BzICpkcnYpCit7CisJaW50IHJjID0gZHJ2LT5pbml0X2h3X2NtbihicCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gYm54MnhfZnVuY19pbml0X3BvcnQoYnAsIGRydik7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfZnVuY19od19pbml0KHN0cnVjdCBibngyeCAqYnAsCisJCQkgICAgICBzdHJ1Y3QgYm54MnhfZnVuY19zdGF0ZV9wYXJhbXMgKnBhcmFtcykKK3sKKwl1MzIgbG9hZF9jb2RlID0gcGFyYW1zLT5wYXJhbXMuaHdfaW5pdC5sb2FkX3BoYXNlOworCXN0cnVjdCBibngyeF9mdW5jX3NwX29iaiAqbyA9IHBhcmFtcy0+Zl9vYmo7CisJY29uc3Qgc3RydWN0IGJueDJ4X2Z1bmNfc3BfZHJ2X29wcyAqZHJ2ID0gby0+ZHJ2OworCWludCByYyA9IDA7CisKKwlEUChCTlgyWF9NU0dfU1AsICJmdW5jdGlvbiAlZCAgbG9hZF9jb2RlICV4XG4iLAorCQkJIEJQX0FCU19GVU5DKGJwKSwgbG9hZF9jb2RlKTsKKworCS8qIFByZXBhcmUgYnVmZmVycyBmb3IgdW56aXBwaW5nIHRoZSBGVyAqLworCXJjID0gZHJ2LT5ndW56aXBfaW5pdChicCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBQcmVwYXJlIEZXICovCisJcmMgPSBkcnYtPmluaXRfZncoYnApOworCWlmIChyYykgeworCQlCTlgyWF9FUlIoIkVycm9yIGxvYWRpbmcgZmlybXdhcmVcbiIpOworCQlnb3RvIGZ3X2luaXRfZXJyOworCX0KKworCS8qIEhhbmRsZSB0aGUgYmVnaW5uaW5nIG9mIENPTU1PTl9YWFggcGFzZXMgc2VwYXJhdGVsbHkuLi4gKi8KKwlzd2l0Y2ggKGxvYWRfY29kZSkgeworCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfQ09NTU9OX0NISVA6CisJCXJjID0gYm54MnhfZnVuY19pbml0X2Ntbl9jaGlwKGJwLCBkcnYpOworCQlpZiAocmMpCisJCQlnb3RvIGluaXRfaHdfZXJyOworCisJCWJyZWFrOworCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfQ09NTU9OOgorCQlyYyA9IGJueDJ4X2Z1bmNfaW5pdF9jbW4oYnAsIGRydik7CisJCWlmIChyYykKKwkJCWdvdG8gaW5pdF9od19lcnI7CisKKwkJYnJlYWs7CisJY2FzZSBGV19NU0dfQ09ERV9EUlZfTE9BRF9QT1JUOgorCQlyYyA9IGJueDJ4X2Z1bmNfaW5pdF9wb3J0KGJwLCBkcnYpOworCQlpZiAocmMpCisJCQlnb3RvIGluaXRfaHdfZXJyOworCisJCWJyZWFrOworCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfRlVOQ1RJT046CisJCXJjID0gYm54MnhfZnVuY19pbml0X2Z1bmMoYnAsIGRydik7CisJCWlmIChyYykKKwkJCWdvdG8gaW5pdF9od19lcnI7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQk5YMlhfRVJSKCJVbmtub3duIGxvYWRfY29kZSAoMHgleCkgZnJvbSBNQ1BcbiIsIGxvYWRfY29kZSk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisKK2luaXRfaHdfZXJyOgorCWRydi0+cmVsZWFzZV9mdyhicCk7CisKK2Z3X2luaXRfZXJyOgorCWRydi0+Z3VuemlwX2VuZChicCk7CisKKwkvKiBJbiBjYXNlIG9mIHN1Y2Nlc3MsIGNvbXBsZXRlIHRoZSBjb21hbmQgaW1tZWRpYXRlbGx5OiBubyByYW1yb2RzCisJICogaGF2ZSBiZWVuIHNlbnQuCisJICovCisJaWYgKCFyYykKKwkJby0+Y29tcGxldGVfY21kKGJwLCBvLCBCTlgyWF9GX0NNRF9IV19JTklUKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBibngyeF9mdW5jX3Jlc2V0X2Z1bmMgLSByZXNldCBIVyBhdCBmdW5jdGlvbiBzdGFnZQorICoKKyAqIEBicDoJCWRldmljZSBoYW5kbGUKKyAqIEBkcnY6CisgKgorICogUmVzZXQgSFcgYXQgRldfTVNHX0NPREVfRFJWX1VOTE9BRF9GVU5DVElPTiBzdGFnZTogcmVzZXQgb25seQorICogRlVOQ1RJT04tb25seSBIVyBibG9ja3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9mdW5jX3Jlc2V0X2Z1bmMoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJY29uc3Qgc3RydWN0IGJueDJ4X2Z1bmNfc3BfZHJ2X29wcyAqZHJ2KQoreworCWRydi0+cmVzZXRfaHdfZnVuYyhicCk7Cit9CisKKy8qKgorICogYm54MnhfZnVuY19yZXNldF9wb3J0IC0gcmVzZXIgSFcgYXQgcG9ydCBzdGFnZQorICoKKyAqIEBicDoJCWRldmljZSBoYW5kbGUKKyAqIEBkcnY6CisgKgorICogUmVzZXQgSFcgYXQgRldfTVNHX0NPREVfRFJWX1VOTE9BRF9QT1JUIHN0YWdlOiByZXNldAorICogRlVOQ1RJT04tb25seSBhbmQgUE9SVC1vbmx5IEhXIGJsb2Nrcy4KKyAqCisgKiAgICAgICAgICAgICAgICAgISEhSU1QT1JUQU5UISEhCisgKgorICogSXQncyBpbXBvcnRhbnQgdG8gY2FsbCByZXNldF9wb3J0IGJlZm9yZSByZXNldF9mdW5jKCkgYXMgdGhlIGxhc3QgdGhpbmcKKyAqIHJlc2V0X2Z1bmMgZG9lcyBpcyBwZl9kaXNhYmxlKCkgdGh1cyBkaXNhYmxpbmcgUEdMVUVfQiwgd2hpY2gKKyAqIG1ha2VzIGltcG9zc2libGUgYW55IERNQUUgdHJhbnNhY3Rpb25zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfZnVuY19yZXNldF9wb3J0KHN0cnVjdCBibngyeCAqYnAsCisJCQkJCWNvbnN0IHN0cnVjdCBibngyeF9mdW5jX3NwX2Rydl9vcHMgKmRydikKK3sKKwlkcnYtPnJlc2V0X2h3X3BvcnQoYnApOworCWJueDJ4X2Z1bmNfcmVzZXRfZnVuYyhicCwgZHJ2KTsKK30KKworLyoqCisgKiBibngyeF9mdW5jX3Jlc2V0X2NtbiAtIHJlc2VyIEhXIGF0IGNvbW1vbiBzdGFnZQorICoKKyAqIEBicDoJCWRldmljZSBoYW5kbGUKKyAqIEBkcnY6CisgKgorICogUmVzZXQgSFcgYXQgRldfTVNHX0NPREVfRFJWX1VOTE9BRF9DT01NT04gYW5kCisgKiBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0NPTU1PTl9DSElQIHN0YWdlczogcmVzZXQgQ09NTU9OLAorICogQ09NTU9OX0NISVAsIEZVTkNUSU9OLW9ubHkgYW5kIFBPUlQtb25seSBIVyBibG9ja3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9mdW5jX3Jlc2V0X2NtbihzdHJ1Y3QgYm54MnggKmJwLAorCQkJCQljb25zdCBzdHJ1Y3QgYm54MnhfZnVuY19zcF9kcnZfb3BzICpkcnYpCit7CisJYm54MnhfZnVuY19yZXNldF9wb3J0KGJwLCBkcnYpOworCWRydi0+cmVzZXRfaHdfY21uKGJwKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBibngyeF9mdW5jX2h3X3Jlc2V0KHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgc3RydWN0IGJueDJ4X2Z1bmNfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJdTMyIHJlc2V0X3BoYXNlID0gcGFyYW1zLT5wYXJhbXMuaHdfcmVzZXQucmVzZXRfcGhhc2U7CisJc3RydWN0IGJueDJ4X2Z1bmNfc3Bfb2JqICpvID0gcGFyYW1zLT5mX29iajsKKwljb25zdCBzdHJ1Y3QgYm54MnhfZnVuY19zcF9kcnZfb3BzICpkcnYgPSBvLT5kcnY7CisKKwlEUChCTlgyWF9NU0dfU1AsICJmdW5jdGlvbiAlZCAgcmVzZXRfcGhhc2UgJXhcbiIsIEJQX0FCU19GVU5DKGJwKSwKKwkJCSByZXNldF9waGFzZSk7CisKKwlzd2l0Y2ggKHJlc2V0X3BoYXNlKSB7CisJY2FzZSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0NPTU1PTjoKKwkJYm54MnhfZnVuY19yZXNldF9jbW4oYnAsIGRydik7CisJCWJyZWFrOworCWNhc2UgRldfTVNHX0NPREVfRFJWX1VOTE9BRF9QT1JUOgorCQlibngyeF9mdW5jX3Jlc2V0X3BvcnQoYnAsIGRydik7CisJCWJyZWFrOworCWNhc2UgRldfTVNHX0NPREVfRFJWX1VOTE9BRF9GVU5DVElPTjoKKwkJYm54MnhfZnVuY19yZXNldF9mdW5jKGJwLCBkcnYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCTlgyWF9FUlIoIlVua25vd24gcmVzZXRfcGhhc2UgKDB4JXgpIGZyb20gTUNQXG4iLAorCQkJICAgcmVzZXRfcGhhc2UpOworCQlicmVhazsKKwl9CisKKwkvKiBDb21wbGV0ZSB0aGUgY29tYW5kIGltbWVkaWF0ZWxseTogbm8gcmFtcm9kcyBoYXZlIGJlZW4gc2VudC4gKi8KKwlvLT5jb21wbGV0ZV9jbWQoYnAsIG8sIEJOWDJYX0ZfQ01EX0hXX1JFU0VUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBibngyeF9mdW5jX3NlbmRfc3RhcnQoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJc3RydWN0IGJueDJ4X2Z1bmNfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJueDJ4X2Z1bmNfc3Bfb2JqICpvID0gcGFyYW1zLT5mX29iajsKKwlzdHJ1Y3QgZnVuY3Rpb25fc3RhcnRfZGF0YSAqcmRhdGEgPQorCQkoc3RydWN0IGZ1bmN0aW9uX3N0YXJ0X2RhdGEgKilvLT5yZGF0YTsKKwlkbWFfYWRkcl90IGRhdGFfbWFwcGluZyA9IG8tPnJkYXRhX21hcHBpbmc7CisJc3RydWN0IGJueDJ4X2Z1bmNfc3RhcnRfcGFyYW1zICpzdGFydF9wYXJhbXMgPSAmcGFyYW1zLT5wYXJhbXMuc3RhcnQ7CisKKwltZW1zZXQocmRhdGEsIDAsIHNpemVvZigqcmRhdGEpKTsKKworCS8qIEZpbGwgdGhlIHJhbXJvZCBkYXRhIHdpdGggcHJvdmlkZWQgcGFyYW1ldGVycyAqLworCXJkYXRhLT5mdW5jdGlvbl9tb2RlID0gY3B1X3RvX2xlMTYoc3RhcnRfcGFyYW1zLT5tZl9tb2RlKTsKKwlyZGF0YS0+c2Rfdmxhbl90YWcgICA9IHN0YXJ0X3BhcmFtcy0+c2Rfdmxhbl90YWc7CisJcmRhdGEtPnBhdGhfaWQgICAgICAgPSBCUF9QQVRIKGJwKTsKKwlyZGF0YS0+bmV0d29ya19jb3NfbW9kZSA9IHN0YXJ0X3BhcmFtcy0+bmV0d29ya19jb3NfbW9kZTsKKworCS8qCisJICogIE5vIG5lZWQgZm9yIGFuIGV4cGxpY2l0IG1lbW9yeSBiYXJyaWVyIGhlcmUgYXMgbG9uZyB3ZSB3b3VsZAorCSAqICBuZWVkIHRvIGVuc3VyZSB0aGUgb3JkZXJpbmcgb2Ygd3JpdGluZyB0byB0aGUgU1BRIGVsZW1lbnQKKwkgKiAgYW5kIHVwZGF0aW5nIG9mIHRoZSBTUFEgcHJvZHVjZXIgd2hpY2ggaW52b2x2ZXMgYSBtZW1vcnkKKwkgKiAgcmVhZCBhbmQgd2Ugd2lsbCBoYXZlIHRvIHB1dCBhIGZ1bGwgbWVtb3J5IGJhcnJpZXIgdGhlcmUKKwkgKiAgKGluc2lkZSBibngyeF9zcF9wb3N0KCkpLgorCSAqLworCisJcmV0dXJuIGJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfQ09NTU9OX0ZVTkNUSU9OX1NUQVJULCAwLAorCQkJICAgICBVNjRfSEkoZGF0YV9tYXBwaW5nKSwKKwkJCSAgICAgVTY0X0xPKGRhdGFfbWFwcGluZyksIE5PTkVfQ09OTkVDVElPTl9UWVBFKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfZnVuY19zZW5kX3N0b3Aoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICAgc3RydWN0IGJueDJ4X2Z1bmNfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJcmV0dXJuIGJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfQ09NTU9OX0ZVTkNUSU9OX1NUT1AsIDAsIDAsIDAsCisJCQkgICAgIE5PTkVfQ09OTkVDVElPTl9UWVBFKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfZnVuY19zZW5kX3R4X3N0b3Aoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICAgc3RydWN0IGJueDJ4X2Z1bmNfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJcmV0dXJuIGJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfQ09NTU9OX1NUT1BfVFJBRkZJQywgMCwgMCwgMCwKKwkJCSAgICAgTk9ORV9DT05ORUNUSU9OX1RZUEUpOworfQorc3RhdGljIGlubGluZSBpbnQgYm54MnhfZnVuY19zZW5kX3R4X3N0YXJ0KHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgIHN0cnVjdCBibngyeF9mdW5jX3N0YXRlX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeF9mdW5jX3NwX29iaiAqbyA9IHBhcmFtcy0+Zl9vYmo7CisJc3RydWN0IGZsb3dfY29udHJvbF9jb25maWd1cmF0aW9uICpyZGF0YSA9CisJCShzdHJ1Y3QgZmxvd19jb250cm9sX2NvbmZpZ3VyYXRpb24gKilvLT5yZGF0YTsKKwlkbWFfYWRkcl90IGRhdGFfbWFwcGluZyA9IG8tPnJkYXRhX21hcHBpbmc7CisJc3RydWN0IGJueDJ4X2Z1bmNfdHhfc3RhcnRfcGFyYW1zICp0eF9zdGFydF9wYXJhbXMgPQorCQkmcGFyYW1zLT5wYXJhbXMudHhfc3RhcnQ7CisJaW50IGk7CisKKwltZW1zZXQocmRhdGEsIDAsIHNpemVvZigqcmRhdGEpKTsKKworCXJkYXRhLT5kY2JfZW5hYmxlZCA9IHR4X3N0YXJ0X3BhcmFtcy0+ZGNiX2VuYWJsZWQ7CisJcmRhdGEtPmRjYl92ZXJzaW9uID0gdHhfc3RhcnRfcGFyYW1zLT5kY2JfdmVyc2lvbjsKKwlyZGF0YS0+ZG9udF9hZGRfcHJpXzBfZW4gPSB0eF9zdGFydF9wYXJhbXMtPmRvbnRfYWRkX3ByaV8wX2VuOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmRhdGEtPnRyYWZmaWNfdHlwZV90b19wcmlvcml0eV9jb3MpOyBpKyspCisJCXJkYXRhLT50cmFmZmljX3R5cGVfdG9fcHJpb3JpdHlfY29zW2ldID0KKwkJCXR4X3N0YXJ0X3BhcmFtcy0+dHJhZmZpY190eXBlX3RvX3ByaW9yaXR5X2Nvc1tpXTsKKworCXJldHVybiBibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0NPTU1PTl9TVEFSVF9UUkFGRklDLCAwLAorCQkJICAgICBVNjRfSEkoZGF0YV9tYXBwaW5nKSwKKwkJCSAgICAgVTY0X0xPKGRhdGFfbWFwcGluZyksIE5PTkVfQ09OTkVDVElPTl9UWVBFKTsKK30KKworc3RhdGljIGludCBibngyeF9mdW5jX3NlbmRfY21kKHN0cnVjdCBibngyeCAqYnAsCisJCQkgICAgICAgc3RydWN0IGJueDJ4X2Z1bmNfc3RhdGVfcGFyYW1zICpwYXJhbXMpCit7CisJc3dpdGNoIChwYXJhbXMtPmNtZCkgeworCWNhc2UgQk5YMlhfRl9DTURfSFdfSU5JVDoKKwkJcmV0dXJuIGJueDJ4X2Z1bmNfaHdfaW5pdChicCwgcGFyYW1zKTsKKwljYXNlIEJOWDJYX0ZfQ01EX1NUQVJUOgorCQlyZXR1cm4gYm54MnhfZnVuY19zZW5kX3N0YXJ0KGJwLCBwYXJhbXMpOworCWNhc2UgQk5YMlhfRl9DTURfU1RPUDoKKwkJcmV0dXJuIGJueDJ4X2Z1bmNfc2VuZF9zdG9wKGJwLCBwYXJhbXMpOworCWNhc2UgQk5YMlhfRl9DTURfSFdfUkVTRVQ6CisJCXJldHVybiBibngyeF9mdW5jX2h3X3Jlc2V0KGJwLCBwYXJhbXMpOworCWNhc2UgQk5YMlhfRl9DTURfVFhfU1RPUDoKKwkJcmV0dXJuIGJueDJ4X2Z1bmNfc2VuZF90eF9zdG9wKGJwLCBwYXJhbXMpOworCWNhc2UgQk5YMlhfRl9DTURfVFhfU1RBUlQ6CisJCXJldHVybiBibngyeF9mdW5jX3NlbmRfdHhfc3RhcnQoYnAsIHBhcmFtcyk7CisJZGVmYXVsdDoKKwkJQk5YMlhfRVJSKCJVbmtub3duIGNvbW1hbmQ6ICVkXG4iLCBwYXJhbXMtPmNtZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKwordm9pZCBibngyeF9pbml0X2Z1bmNfb2JqKHN0cnVjdCBibngyeCAqYnAsCisJCQkgc3RydWN0IGJueDJ4X2Z1bmNfc3Bfb2JqICpvYmosCisJCQkgdm9pZCAqcmRhdGEsIGRtYV9hZGRyX3QgcmRhdGFfbWFwcGluZywKKwkJCSBzdHJ1Y3QgYm54MnhfZnVuY19zcF9kcnZfb3BzICpkcnZfaWZhY2UpCit7CisJbWVtc2V0KG9iaiwgMCwgc2l6ZW9mKCpvYmopKTsKKworCW11dGV4X2luaXQoJm9iai0+b25lX3BlbmRpbmdfbXV0ZXgpOworCisJb2JqLT5yZGF0YSA9IHJkYXRhOworCW9iai0+cmRhdGFfbWFwcGluZyA9IHJkYXRhX21hcHBpbmc7CisKKwlvYmotPnNlbmRfY21kID0gYm54MnhfZnVuY19zZW5kX2NtZDsKKwlvYmotPmNoZWNrX3RyYW5zaXRpb24gPSBibngyeF9mdW5jX2Noa190cmFuc2l0aW9uOworCW9iai0+Y29tcGxldGVfY21kID0gYm54MnhfZnVuY19jb21wX2NtZDsKKwlvYmotPndhaXRfY29tcCA9IGJueDJ4X2Z1bmNfd2FpdF9jb21wOworCisJb2JqLT5kcnYgPSBkcnZfaWZhY2U7Cit9CisKKy8qKgorICogYm54MnhfZnVuY19zdGF0ZV9jaGFuZ2UgLSBwZXJmb3JtIEZ1bmN0aW9uIHN0YXRlIGNoYW5nZSB0cmFuc2l0aW9uCisgKgorICogQGJwOgkJZGV2aWNlIGhhbmRsZQorICogQHBhcmFtczoJcGFyYW1ldGVycyB0byBwZXJmb3JtIHRoZSB0cmFuc2FjdGlvbgorICoKKyAqIHJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdHJhbnNpdGlvbiwKKyAqICAgICAgICAgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUsIHBvc2l0aXZlCisgKiAgICAgICAgIChFQlVTWSkgdmFsdWUgaWYgdGhlcmUgaXMgYSBjb21wbGV0aW9uIHRvIHRoYXQgaXMKKyAqICAgICAgICAgc3RpbGwgcGVuZGluZyAocG9zc2libGUgb25seSBpZiBSQU1ST0RfQ09NUF9XQUlUIGlzCisgKiAgICAgICAgIG5vdCBzZXQgaW4gcGFyYW1zLT5yYW1yb2RfZmxhZ3MgZm9yIGFzeW5jaHJvbm91cworICogICAgICAgICBjb21tYW5kcykuCisgKi8KK2ludCBibngyeF9mdW5jX3N0YXRlX2NoYW5nZShzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgIHN0cnVjdCBibngyeF9mdW5jX3N0YXRlX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBibngyeF9mdW5jX3NwX29iaiAqbyA9IHBhcmFtcy0+Zl9vYmo7CisJaW50IHJjOworCWVudW0gYm54MnhfZnVuY19jbWQgY21kID0gcGFyYW1zLT5jbWQ7CisJdW5zaWduZWQgbG9uZyAqcGVuZGluZyA9ICZvLT5wZW5kaW5nOworCisJbXV0ZXhfbG9jaygmby0+b25lX3BlbmRpbmdfbXV0ZXgpOworCisJLyogQ2hlY2sgdGhhdCB0aGUgcmVxdWVzdGVkIHRyYW5zaXRpb24gaXMgbGVnYWwgKi8KKwlpZiAoby0+Y2hlY2tfdHJhbnNpdGlvbihicCwgbywgcGFyYW1zKSkgeworCQltdXRleF91bmxvY2soJm8tPm9uZV9wZW5kaW5nX211dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0ICJwZW5kaW5nIiBiaXQgKi8KKwlzZXRfYml0KGNtZCwgcGVuZGluZyk7CisKKwkvKiBEb24ndCBzZW5kIGEgY29tbWFuZCBpZiBvbmx5IGRyaXZlciBjbGVhbnVwIHdhcyByZXF1ZXN0ZWQgKi8KKwlpZiAodGVzdF9iaXQoUkFNUk9EX0RSVl9DTFJfT05MWSwgJnBhcmFtcy0+cmFtcm9kX2ZsYWdzKSkgeworCQlibngyeF9mdW5jX3N0YXRlX2NoYW5nZV9jb21wKGJwLCBvLCBjbWQpOworCQltdXRleF91bmxvY2soJm8tPm9uZV9wZW5kaW5nX211dGV4KTsKKwl9IGVsc2UgeworCQkvKiBTZW5kIGEgcmFtcm9kICovCisJCXJjID0gby0+c2VuZF9jbWQoYnAsIHBhcmFtcyk7CisKKwkJbXV0ZXhfdW5sb2NrKCZvLT5vbmVfcGVuZGluZ19tdXRleCk7CisKKwkJaWYgKHJjKSB7CisJCQlvLT5uZXh0X3N0YXRlID0gQk5YMlhfRl9TVEFURV9NQVg7CisJCQljbGVhcl9iaXQoY21kLCBwZW5kaW5nKTsKKwkJCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlpZiAodGVzdF9iaXQoUkFNUk9EX0NPTVBfV0FJVCwgJnBhcmFtcy0+cmFtcm9kX2ZsYWdzKSkgeworCQkJcmMgPSBvLT53YWl0X2NvbXAoYnAsIG8sIGNtZCk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAhIXRlc3RfYml0KGNtZCwgcGVuZGluZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9zcC5oIGIvZHJpdmVycy9uZXQvYm54MngvYm54Mnhfc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTUxN2MyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYm54MngvYm54Mnhfc3AuaApAQCAtMCwwICsxLDEyOTcgQEAKKy8qIGJueDJ4X3NwLmg6IEJyb2FkY29tIEV2ZXJlc3QgbmV0d29yayBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHRvIHlvdQorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGF2YWlsYWJsZQorICogYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwgKHRoZSAiR1BMIikuCisgKgorICogTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUgdGhpcworICogc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZCB1bmRlciBhCisgKiBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3Igd3JpdHRlbgorICogY29uc2VudC4KKyAqCisgKiBNYWludGFpbmVkIGJ5OiBFaWxvbiBHcmVlbnN0ZWluIDxlaWxvbmdAYnJvYWRjb20uY29tPgorICogV3JpdHRlbiBieTogVmxhZGlzbGF2IFpvbG90YXJvdgorICoKKyAqLworI2lmbmRlZiBCTlgyWF9TUF9WRVJCUworI2RlZmluZSBCTlgyWF9TUF9WRVJCUworCitzdHJ1Y3QgYm54Mng7CitzdHJ1Y3QgZXRoX2NvbnRleHQ7CisKKy8qIEJpdHMgcmVwcmVzZW50aW5nIGdlbmVyYWwgY29tbWFuZCdzIGNvbmZpZ3VyYXRpb24gKi8KK2VudW0geworCVJBTVJPRF9UWCwKKwlSQU1ST0RfUlgsCisJLyogV2FpdCB1bnRpbCBhbGwgcGVuZGluZyBjb21tYW5kcyBjb21wbGV0ZSAqLworCVJBTVJPRF9DT01QX1dBSVQsCisJLyogRG9uJ3Qgc2VuZCBhIHJhbXJvZCwgb25seSB1cGRhdGUgYSByZWdpc3RyeSAqLworCVJBTVJPRF9EUlZfQ0xSX09OTFksCisJLyogQ29uZmlndXJlIEhXIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBvYmplY3Qgc3RhdGUgKi8KKwlSQU1ST0RfUkVTVE9SRSwKKwkgLyogRXhlY3V0ZSB0aGUgbmV4dCBjb21tYW5kIG5vdyAqLworCVJBTVJPRF9FWEVDLAorCS8qCisJICogRG9uJ3QgYWRkIGEgbmV3IGNvbW1hbmQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBvZiBwb3Nwb25lZAorCSAqIGNvbW1hbmRzLiBJZiBub3Qgc2V0IGEgbmV3IGNvbW1hbmQgd2lsbCBiZSBhZGRlZCB0byB0aGUKKwkgKiBwZW5kaW5nIGNvbW1hbmRzIGxpc3QuCisJICovCisJUkFNUk9EX0NPTlQsCit9OworCit0eXBlZGVmIGVudW0geworCUJOWDJYX09CSl9UWVBFX1JYLAorCUJOWDJYX09CSl9UWVBFX1RYLAorCUJOWDJYX09CSl9UWVBFX1JYX1RYLAorfSBibngyeF9vYmpfdHlwZTsKKworLyogRmlsdGVyaW5nIHN0YXRlcyAqLworZW51bSB7CisJQk5YMlhfRklMVEVSX01BQ19QRU5ESU5HLAorCUJOWDJYX0ZJTFRFUl9WTEFOX1BFTkRJTkcsCisJQk5YMlhfRklMVEVSX1ZMQU5fTUFDX1BFTkRJTkcsCisJQk5YMlhfRklMVEVSX1JYX01PREVfUEVORElORywKKwlCTlgyWF9GSUxURVJfUlhfTU9ERV9TQ0hFRCwKKwlCTlgyWF9GSUxURVJfSVNDU0lfRVRIX1NUQVJUX1NDSEVELAorCUJOWDJYX0ZJTFRFUl9JU0NTSV9FVEhfU1RPUF9TQ0hFRCwKKwlCTlgyWF9GSUxURVJfRkNPRV9FVEhfU1RBUlRfU0NIRUQsCisJQk5YMlhfRklMVEVSX0ZDT0VfRVRIX1NUT1BfU0NIRUQsCisJQk5YMlhfRklMVEVSX01DQVNUX1BFTkRJTkcsCisJQk5YMlhfRklMVEVSX01DQVNUX1NDSEVELAorCUJOWDJYX0ZJTFRFUl9SU1NfQ09ORl9QRU5ESU5HLAorfTsKKworc3RydWN0IGJueDJ4X3Jhd19vYmogeworCXU4CQlmdW5jX2lkOworCisJLyogUXVldWUgcGFyYW1zICovCisJdTgJCWNsX2lkOworCXUzMgkJY2lkOworCisJLyogUmFtcm9kIGRhdGEgYnVmZmVyIHBhcmFtcyAqLworCXZvaWQJCSpyZGF0YTsKKwlkbWFfYWRkcl90CXJkYXRhX21hcHBpbmc7CisKKwkvKiBSYW1yb2Qgc3RhdGUgcGFyYW1zICovCisJaW50CQlzdGF0ZTsgICAvKiAicmFtcm9kIGlzIHBlbmRpbmciIHN0YXRlIGJpdCAqLworCXVuc2lnbmVkIGxvbmcJKnBzdGF0ZTsgLyogcG9pbnRlciB0byBzdGF0ZSBidWZmZXIgKi8KKworCWJueDJ4X29ial90eXBlCW9ial90eXBlOworCisJaW50ICgqd2FpdF9jb21wKShzdHJ1Y3QgYm54MnggKmJwLAorCQkJIHN0cnVjdCBibngyeF9yYXdfb2JqICpvKTsKKworCWJvb2wgKCpjaGVja19wZW5kaW5nKShzdHJ1Y3QgYm54MnhfcmF3X29iaiAqbyk7CisJdm9pZCAoKmNsZWFyX3BlbmRpbmcpKHN0cnVjdCBibngyeF9yYXdfb2JqICpvKTsKKwl2b2lkICgqc2V0X3BlbmRpbmcpKHN0cnVjdCBibngyeF9yYXdfb2JqICpvKTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFZMQU4tTUFDIGNvbW1hbmRzIHJlbGF0ZWQgcGFyYW1ldGVycyAqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYm54MnhfbWFjX3JhbXJvZF9kYXRhIHsKKwl1OCBtYWNbRVRIX0FMRU5dOworfTsKKworc3RydWN0IGJueDJ4X3ZsYW5fcmFtcm9kX2RhdGEgeworCXUxNiB2bGFuOworfTsKKworc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JhbXJvZF9kYXRhIHsKKwl1OCBtYWNbRVRIX0FMRU5dOworCXUxNiB2bGFuOworfTsKKwordW5pb24gYm54MnhfY2xhc3NpZmljYXRpb25fcmFtcm9kX2RhdGEgeworCXN0cnVjdCBibngyeF9tYWNfcmFtcm9kX2RhdGEgbWFjOworCXN0cnVjdCBibngyeF92bGFuX3JhbXJvZF9kYXRhIHZsYW47CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JhbXJvZF9kYXRhIHZsYW5fbWFjOworfTsKKworLyogVkxBTl9NQUMgY29tbWFuZHMgKi8KK2VudW0gYm54Mnhfdmxhbl9tYWNfY21kIHsKKwlCTlgyWF9WTEFOX01BQ19BREQsCisJQk5YMlhfVkxBTl9NQUNfREVMLAorCUJOWDJYX1ZMQU5fTUFDX01PVkUsCit9OworCitzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfZGF0YSB7CisJLyogUmVxdWVzdGVkIGNvbW1hbmQ6IEJOWDJYX1ZMQU5fTUFDX1hYICovCisJZW51bSBibngyeF92bGFuX21hY19jbWQgY21kOworCS8qCisJICogdXNlZCB0byBjb250YWluIHRoZSBkYXRhIHJlbGF0ZWQgdmxhbl9tYWNfZmxhZ3MgYml0cyBmcm9tCisJICogcmFtcm9kIHBhcmFtZXRlcnMuCisJICovCisJdW5zaWduZWQgbG9uZyB2bGFuX21hY19mbGFnczsKKworCS8qIE5lZWRlZCBmb3IgTU9WRSBjb21tYW5kICovCisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqdGFyZ2V0X29iajsKKworCXVuaW9uIGJueDJ4X2NsYXNzaWZpY2F0aW9uX3JhbXJvZF9kYXRhIHU7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEV4ZSBRdWV1ZSBvYmogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5pb24gYm54MnhfZXhlX3F1ZXVlX2NtZF9kYXRhIHsKKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfZGF0YSB2bGFuX21hYzsKKworCXN0cnVjdCB7CisJCS8qIFRPRE8gKi8KKwl9IG1jYXN0OworfTsKKworc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSB7CisJc3RydWN0IGxpc3RfaGVhZAkJbGluazsKKworCS8qIExlbmd0aCBvZiB0aGlzIGVsZW1lbnQgaW4gdGhlIGV4ZV9jaHVuay4gKi8KKwlpbnQJCQkJY21kX2xlbjsKKworCXVuaW9uIGJueDJ4X2V4ZV9xdWV1ZV9jbWRfZGF0YQljbWRfZGF0YTsKK307CisKK3VuaW9uIGJueDJ4X3FhYmxlX29iajsKKwordW5pb24gYm54MnhfZXhlcV9jb21wX2VsZW0geworCXVuaW9uIGV2ZW50X3JpbmdfZWxlbSAqZWxlbTsKK307CisKK3N0cnVjdCBibngyeF9leGVfcXVldWVfb2JqOworCit0eXBlZGVmIGludCAoKmV4ZV9xX3ZhbGlkYXRlKShzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgICAgdW5pb24gYm54MnhfcWFibGVfb2JqICpvLAorCQkJICAgICAgc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSAqZWxlbSk7CisKKy8qKgorICogQHJldHVybiBwb3NpdGl2ZSBpcyBlbnRyeSB3YXMgb3B0aW1pemVkLCAwIC0gaWYgbm90LCBuZWdhdGl2ZQorICogICAgICAgICBpbiBjYXNlIG9mIGFuIGVycm9yLgorICovCit0eXBlZGVmIGludCAoKmV4ZV9xX29wdGltaXplKShzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgICAgdW5pb24gYm54MnhfcWFibGVfb2JqICpvLAorCQkJICAgICAgc3RydWN0IGJueDJ4X2V4ZXFfZWxlbSAqZWxlbSk7Cit0eXBlZGVmIGludCAoKmV4ZV9xX2V4ZWN1dGUpKHN0cnVjdCBibngyeCAqYnAsCisJCQkgICAgIHVuaW9uIGJueDJ4X3FhYmxlX29iaiAqbywKKwkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqZXhlX2NodW5rLAorCQkJICAgICB1bnNpZ25lZCBsb25nICpyYW1yb2RfZmxhZ3MpOwordHlwZWRlZiBzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICoKKwkJCSgqZXhlX3FfZ2V0KShzdHJ1Y3QgYm54MnhfZXhlX3F1ZXVlX29iaiAqbywKKwkJCQkgICAgIHN0cnVjdCBibngyeF9leGVxX2VsZW0gKmVsZW0pOworCitzdHJ1Y3QgYm54MnhfZXhlX3F1ZXVlX29iaiB7CisJLyoKKwkgKiBDb21tYW5kcyBwZW5kaW5nIGZvciBhbiBleGVjdXRpb24uCisJICovCisJc3RydWN0IGxpc3RfaGVhZAlleGVfcXVldWU7CisKKwkvKgorCSAqIENvbW1hbmRzIHBlbmRpbmcgZm9yIGFuIGNvbXBsZXRpb24uCisJICovCisJc3RydWN0IGxpc3RfaGVhZAlwZW5kaW5nX2NvbXA7CisKKwlzcGlubG9ja190CQlsb2NrOworCisJLyogTWF4aW11bSBsZW5ndGggb2YgY29tbWFuZHMnIGxpc3QgZm9yIG9uZSBleGVjdXRpb24gKi8KKwlpbnQJCQlleGVfY2h1bmtfbGVuOworCisJdW5pb24gYm54MnhfcWFibGVfb2JqCSpvd25lcjsKKworCS8qKioqKiogVmlydHVhbCBmdW5jdGlvbnMgKioqKioqLworCS8qKgorCSAqIENhbGxlZCBiZWZvcmUgY29tbWFuZHMgZXhlY3V0aW9uIGZvciBjb21tYW5kcyB0aGF0IGFyZSByZWFsbHkKKwkgKiBnb2luZyB0byBiZSBleGVjdXRlZCAoYWZ0ZXIgJ29wdGltaXplJykuCisJICoKKwkgKiBNdXN0IHJ1biB1bmRlciBleGVfcXVldWUtPmxvY2sKKwkgKi8KKwlleGVfcV92YWxpZGF0ZQkJdmFsaWRhdGU7CisKKworCS8qKgorCSAqIFRoaXMgd2lsbCB0cnkgdG8gY2FuY2VsIHRoZSBjdXJyZW50IHBlbmRpbmcgY29tbWFuZHMgbGlzdAorCSAqIGNvbnNpZGVyaW5nIHRoZSBuZXcgY29tbWFuZC4KKwkgKgorCSAqIE11c3QgcnVuIHVuZGVyIGV4ZV9xdWV1ZS0+bG9jaworCSAqLworCWV4ZV9xX29wdGltaXplCQlvcHRpbWl6ZTsKKworCS8qKgorCSAqIFJ1biB0aGUgbmV4dCBjb21tYW5kcyBjaHVuayAob3duZXIgc3BlY2lmaWMpLgorCSAqLworCWV4ZV9xX2V4ZWN1dGUJCWV4ZWN1dGU7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGV4ZV9xdWV1ZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIHNwZWNpZmljIGNvbW1hbmQKKwkgKiBpZiBhbnkuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4KKwkgKi8KKwlleGVfcV9nZXQJCWdldDsKK307CisvKioqKioqKioqKioqKioqKiogQ2xhc3NpZmljYXRpb24gdmVyYnM6IFNldC9EZWwgTUFDL1ZMQU4vVkxBTi1NQUMgKioqKioqKioqKioqLworLyoKKyAqIEVsZW1lbnQgaW4gdGhlIFZMQU5fTUFDIHJlZ2lzdHJ5IGxpc3QgaGF2aW5nIGFsbCBjdXJyZW50eSBjb25maWd1cmVkCisgKiBydWxlcy4KKyAqLworc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JlZ2lzdHJ5X2VsZW0geworCXN0cnVjdCBsaXN0X2hlYWQJbGluazsKKworCS8qCisJICogVXNlZCB0byBzdG9yZSB0aGUgY2FtIG9mZnNldCB1c2VkIGZvciB0aGUgbWFjL3ZsYW4vdmxhbi1tYWMuCisJICogUmVsZXZhbnQgZm9yIDU3NzEwIGFuZCA1NzcxMSBvbmx5LiBWTEFOcyBhbmQgTUFDcyBzaGFyZSB0aGUKKwkgKiBzYW1lIENBTSBmb3IgdGhlc2UgY2hpcHMuCisJICovCisJaW50CQkJY2FtX29mZnNldDsKKworCS8qIE5lZWRlZCBmb3IgREVMIGFuZCBSRVNUT1JFIGZsb3dzICovCisJdW5zaWduZWQgbG9uZwkJdmxhbl9tYWNfZmxhZ3M7CisKKwl1bmlvbiBibngyeF9jbGFzc2lmaWNhdGlvbl9yYW1yb2RfZGF0YSB1OworfTsKKworLyogQml0cyByZXByZXNlbnRpbmcgVkxBTl9NQUMgY29tbWFuZHMgc3BlY2lmaWMgZmxhZ3MgKi8KK2VudW0geworCUJOWDJYX1VDX0xJU1RfTUFDLAorCUJOWDJYX0VUSF9NQUMsCisJQk5YMlhfSVNDU0lfRVRIX01BQywKKwlCTlgyWF9ORVRRX0VUSF9NQUMsCisJQk5YMlhfRE9OVF9DT05TVU1FX0NBTV9DUkVESVQsCisJQk5YMlhfRE9OVF9DT05TVU1FX0NBTV9DUkVESVRfREVTVCwKK307CisKK3N0cnVjdCBibngyeF92bGFuX21hY19yYW1yb2RfcGFyYW1zIHsKKwkvKiBPYmplY3QgdG8gcnVuIHRoZSBjb21tYW5kIGZyb20gKi8KKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICp2bGFuX21hY19vYmo7CisKKwkvKiBHZW5lcmFsIGNvbW1hbmQgZmxhZ3M6IENPTVBfV0FJVCwgZXRjLiAqLworCXVuc2lnbmVkIGxvbmcgcmFtcm9kX2ZsYWdzOworCisJLyogQ29tbWFuZCBzcGVjaWZpYyBjb25maWd1cmF0aW9uIHJlcXVlc3QgKi8KKwlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfZGF0YSB1c2VyX3JlcTsKK307CisKK3N0cnVjdCBibngyeF92bGFuX21hY19vYmogeworCXN0cnVjdCBibngyeF9yYXdfb2JqIHJhdzsKKworCS8qIEJvb2trZWVwaW5nIGxpc3Q6IHdpbGwgcHJldmVudCB0aGUgYWRkaXRpb24gb2YgYWxyZWFkeSBleGlzdGluZworCSAqIGVudHJpZXMuCisJICovCisJc3RydWN0IGxpc3RfaGVhZAkJaGVhZDsKKworCS8qIFRPRE86IEFkZCBpdCdzIGluaXRpYWxpemF0aW9uIGluIHRoZSBpbml0IGZ1bmN0aW9ucyAqLworCXN0cnVjdCBibngyeF9leGVfcXVldWVfb2JqCWV4ZV9xdWV1ZTsKKworCS8qIE1BQ3MgY3JlZGl0IHBvb2wgKi8KKwlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqCSptYWNzX3Bvb2w7CisKKwkvKiBWTEFOcyBjcmVkaXQgcG9vbCAqLworCXN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmoJKnZsYW5zX3Bvb2w7CisKKwkvKiBSQU1ST0QgY29tbWFuZCB0byBiZSB1c2VkICovCisJaW50CQkJCXJhbXJvZF9jbWQ7CisKKwkvKioKKwkgKiBDaGVja3MgaWYgQURELXJhbXJvZCB3aXRoIHRoZSBnaXZlbiBwYXJhbXMgbWF5IGJlIHBlcmZvcm1lZC4KKwkgKgorCSAqIEByZXR1cm4gemVybyBpZiB0aGUgZWxlbWVudCBtYXkgYmUgYWRkZWQKKwkgKi8KKworCWludCAoKmNoZWNrX2FkZCkoc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbywKKwkJCSB1bmlvbiBibngyeF9jbGFzc2lmaWNhdGlvbl9yYW1yb2RfZGF0YSAqZGF0YSk7CisKKwkvKioKKwkgKiBDaGVja3MgaWYgREVMLXJhbXJvZCB3aXRoIHRoZSBnaXZlbiBwYXJhbXMgbWF5IGJlIHBlcmZvcm1lZC4KKwkgKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBtYXkgYmUgZGVsZXRlZAorCSAqLworCXN0cnVjdCBibngyeF92bGFuX21hY19yZWdpc3RyeV9lbGVtICoKKwkJKCpjaGVja19kZWwpKHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8sCisJCQkgICAgIHVuaW9uIGJueDJ4X2NsYXNzaWZpY2F0aW9uX3JhbXJvZF9kYXRhICpkYXRhKTsKKworCS8qKgorCSAqIENoZWNrcyBpZiBERUwtcmFtcm9kIHdpdGggdGhlIGdpdmVuIHBhcmFtcyBtYXkgYmUgcGVyZm9ybWVkLgorCSAqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IG1heSBiZSBkZWxldGVkCisJICovCisJYm9vbCAoKmNoZWNrX21vdmUpKHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKnNyY19vLAorCQkJICAgc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqZHN0X28sCisJCQkgICB1bmlvbiBibngyeF9jbGFzc2lmaWNhdGlvbl9yYW1yb2RfZGF0YSAqZGF0YSk7CisKKwkvKioKKwkgKiAgVXBkYXRlIHRoZSByZWxldmFudCBjcmVkaXQgb2JqZWN0KHMpIChjb25zdW1lL3JldHVybgorCSAqICBjb3JyZXNwb25kaW5nbHkpLgorCSAqLworCWJvb2wgKCpnZXRfY3JlZGl0KShzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvKTsKKwlib29sICgqcHV0X2NyZWRpdCkoc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbyk7CisJYm9vbCAoKmdldF9jYW1fb2Zmc2V0KShzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLCBpbnQgKm9mZnNldCk7CisJYm9vbCAoKnB1dF9jYW1fb2Zmc2V0KShzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLCBpbnQgb2Zmc2V0KTsKKworCS8qKgorCSAqIENvbmZpZ3VyZXMgb25lIHJ1bGUgaW4gdGhlIHJhbXJvZCBkYXRhIGJ1ZmZlci4KKwkgKi8KKwl2b2lkICgqc2V0X29uZV9ydWxlKShzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgICBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLAorCQkJICAgICBzdHJ1Y3QgYm54MnhfZXhlcV9lbGVtICplbGVtLCBpbnQgcnVsZV9pZHgsCisJCQkgICAgIGludCBjYW1fb2Zmc2V0KTsKKworCS8qKgorCSogIERlbGV0ZSBhbGwgY29uZmlndXJlZCBlbGVtZW50cyBoYXZpbmcgdGhlIGdpdmVuCisJKiAgdmxhbl9tYWNfZmxhZ3Mgc3BlY2lmaWNhdGlvbi4gQXNzdW1lcyBubyBwZW5kaW5nIGZvcgorCSogIGV4ZWN1dGlvbiBjb21tYW5kcy4gV2lsbCBzY2hlZHVsZSBhbGwgYWxsIGN1cnJlbnRseQorCSogIGNvbmZpZ3VyZWQgTUFDcy9WTEFOcy9WTEFOLU1BQ3MgbWF0Y2hpbmcgdGhlIHZsYW5fbWFjX2ZsYWdzCisJKiAgc3BlY2lmaWNhdGlvbiBmb3IgZGVsZXRpb24gYW5kIHdpbGwgdXNlIHRoZSBnaXZlbgorCSogIHJhbXJvZF9mbGFncyBmb3IgdGhlIGxhc3QgREVMIG9wZXJhdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBicAorCSAqIEBwYXJhbSBvCisJICogQHBhcmFtIHJhbXJvZF9mbGFncyBSQU1ST0RfWFggZmxhZ3MKKwkgKgorCSAqIEByZXR1cm4gMCBpZiB0aGUgbGFzdCBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKwkgKiAgICAgICAgIGFuZCB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cyBsZWZ0LCBwb3NpdGl2ZSB2YWx1ZQorCSAqICAgICAgICAgaWYgdGhlcmUgYXJlIHBlbmRpbmcgZm9yIGNvbXBsZXRpb24gY29tbWFuZHMsCisJICogICAgICAgICBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisJICovCisJaW50ICgqZGVsZXRlX2FsbCkoc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbywKKwkJCSAgdW5zaWduZWQgbG9uZyAqdmxhbl9tYWNfZmxhZ3MsCisJCQkgIHVuc2lnbmVkIGxvbmcgKnJhbXJvZF9mbGFncyk7CisKKwkvKioKKwkgKiBSZWNvbmZpZ3VyZXMgdGhlIG5leHQgTUFDL1ZMQU4vVkxBTi1NQUMgZWxlbWVudCBmcm9tIHRoZSBwcmV2aW91c2x5CisJICogY29uZmlndXJlZCBlbGVtZW50cyBsaXN0LgorCSAqCisJICogQHBhcmFtIGJwCisJICogQHBhcmFtIHAgQ29tbWFuZCBwYXJhbWV0ZXJzIChSQU1ST0RfQ09NUF9XQUlUIGJpdCBpbgorCSAqICAgICAgICAgIHJhbXJvZF9mbGFncyBpcyBvbmx5IHRha2VuIGludG8gYW4gYWNjb3VudCkKKwkgKiBAcGFyYW0gcHBvcyBhIHBvaW50ZXIgdG8gdGhlIGNvb2t5IHRoYXQgc2hvdWxkIGJlIGdpdmVuIGJhY2sgaW4gdGhlCisJICogICAgICAgIG5leHQgY2FsbCB0byBtYWtlIGZ1bmN0aW9uIGhhbmRsZSB0aGUgbmV4dCBlbGVtZW50LiBJZgorCSAqICAgICAgICAqcHBvcyBpcyBzZXQgdG8gTlVMTCBpdCB3aWxsIHJlc3RhcnQgdGhlIGl0ZXJhdG9yLgorCSAqICAgICAgICBJZiByZXR1cm5lZCAqcHBvcyA9PSBOVUxMIHRoaXMgbWVhbnMgdGhhdCB0aGUgbGFzdAorCSAqICAgICAgICBlbGVtZW50IGhhcyBiZWVuIGhhbmRsZWQuCisJICoKKwkgKiBAcmV0dXJuIGludAorCSAqLworCWludCAoKnJlc3RvcmUpKHN0cnVjdCBibngyeCAqYnAsCisJCSAgICAgICBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfcmFtcm9kX3BhcmFtcyAqcCwKKwkJICAgICAgIHN0cnVjdCBibngyeF92bGFuX21hY19yZWdpc3RyeV9lbGVtICoqcHBvcyk7CisKKwkvKioKKwkgKiBTaG91bGQgYmUgY2FsbGVkIG9uIGEgY29tcGxldGlvbiBhcml2YWwuCisJICoKKwkgKiBAcGFyYW0gYnAKKwkgKiBAcGFyYW0gbworCSAqIEBwYXJhbSBjcWUgQ29tcGxldGlvbiBlbGVtZW50IHdlIGFyZSBoYW5kbGluZworCSAqIEBwYXJhbSByYW1yb2RfZmxhZ3MgaWYgUkFNUk9EX0NPTlQgaXMgc2V0IHRoZSBuZXh0IGJ1bGsgb2YKKwkgKgkJICAgICAgIHBlbmRpbmcgY29tbWFuZHMgd2lsbCBiZSBleGVjdXRlZC4KKwkgKgkJICAgICAgIFJBTVJPRF9EUlZfQ0xSX09OTFkgYW5kIFJBTVJPRF9SRVNUT1JFCisJICoJCSAgICAgICBtYXkgYWxzbyBiZSBzZXQgaWYgbmVlZGVkLgorCSAqCisJICogQHJldHVybiAwIGlmIHRoZXJlIGFyZSBuZWl0aGVyIHBlbmRpbmcgbm9yIHdhaXRpbmcgZm9yCisJICogICAgICAgICBjb21wbGV0aW9uIGNvbW1hbmRzLiBQb3NpdGl2ZSB2YWx1ZSBpZiB0aGVyZSBhcmUKKwkgKiAgICAgICAgIHBlbmRpbmcgZm9yIGV4ZWN1dGlvbiBvciBmb3IgY29tcGxldGlvbiBjb21tYW5kcy4KKwkgKiAgICAgICAgIE5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YgYW4gZXJyb3IgKGluY2x1ZGluZyBhbgorCSAqICAgICAgICAgZXJyb3IgaW4gdGhlIGNxZSkuCisJICovCisJaW50ICgqY29tcGxldGUpKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8sCisJCQl1bmlvbiBldmVudF9yaW5nX2VsZW0gKmNxZSwKKwkJCXVuc2lnbmVkIGxvbmcgKnJhbXJvZF9mbGFncyk7CisKKwkvKioKKwkgKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIGFsbCBjb21tYW5kcy4gRG9uJ3Qgc2NoZWR1bGUgbmV3IG9uZXMsCisJICoganVzdCB3YWl0LiBJdCBhc3N1bWVzIHRoYXQgdGhlIGNvbXBsZXRpb24gY29kZSB3aWxsIHNjaGVkdWxlCisJICogZm9yIG5ldyBjb21tYW5kcy4KKwkgKi8KKwlpbnQgKCp3YWl0KShzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvKTsKK307CisKKy8qKiBSWF9NT0RFIHZlcmJzOkRST1BfQUxML0FDQ0VQVF9BTEwvQUNDRVBUX0FMTF9NVUxUSS9BQ0NFUFRfQUxMX1ZMQU4vTk9STUFMICovCisKKy8qIFJYX01PREUgcmFtcm9kIHNwZXNpYWwgZmxhZ3M6IHNldCBpbiByeF9tb2RlX2ZsYWdzIGZpZWxkIGluCisgKiBhIGJueDJ4X3J4X21vZGVfcmFtcm9kX3BhcmFtcy4KKyAqLworZW51bSB7CisJQk5YMlhfUlhfTU9ERV9GQ09FX0VUSCwKKwlCTlgyWF9SWF9NT0RFX0lTQ1NJX0VUSCwKK307CisKK2VudW0geworCUJOWDJYX0FDQ0VQVF9VTklDQVNULAorCUJOWDJYX0FDQ0VQVF9NVUxUSUNBU1QsCisJQk5YMlhfQUNDRVBUX0FMTF9VTklDQVNULAorCUJOWDJYX0FDQ0VQVF9BTExfTVVMVElDQVNULAorCUJOWDJYX0FDQ0VQVF9CUk9BRENBU1QsCisJQk5YMlhfQUNDRVBUX1VOTUFUQ0hFRCwKKwlCTlgyWF9BQ0NFUFRfQU5ZX1ZMQU4KK307CisKK3N0cnVjdCBibngyeF9yeF9tb2RlX3JhbXJvZF9wYXJhbXMgeworCXN0cnVjdCBibngyeF9yeF9tb2RlX29iaiAqcnhfbW9kZV9vYmo7CisJdW5zaWduZWQgbG9uZyAqcHN0YXRlOworCWludCBzdGF0ZTsKKwl1OCBjbF9pZDsKKwl1MzIgY2lkOworCXU4IGZ1bmNfaWQ7CisJdW5zaWduZWQgbG9uZyByYW1yb2RfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyByeF9tb2RlX2ZsYWdzOworCisJLyoKKwkgKiByZGF0YSBpcyBlaXRoZXIgYSBwb2ludGVyIHRvIGV0aF9maWx0ZXJfcnVsZXNfcmFtcm9kX2RhdGEoZTIpIG9yIHRvCisJICogYSB0c3Rvcm1fZXRoX21hY19maWx0ZXJfY29uZmlnIChlMXgpLgorCSAqLworCXZvaWQgKnJkYXRhOworCWRtYV9hZGRyX3QgcmRhdGFfbWFwcGluZzsKKworCS8qIFJ4IG1vZGUgc2V0dGluZ3MgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2FjY2VwdF9mbGFnczsKKworCS8qIGludGVybmFsIHN3aXRjaGluZyBzZXR0aW5ncyAqLworCXVuc2lnbmVkIGxvbmcgdHhfYWNjZXB0X2ZsYWdzOworfTsKKworc3RydWN0IGJueDJ4X3J4X21vZGVfb2JqIHsKKwlpbnQgKCpjb25maWdfcnhfbW9kZSkoc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgICAgIHN0cnVjdCBibngyeF9yeF9tb2RlX3JhbXJvZF9wYXJhbXMgKnApOworCisJaW50ICgqd2FpdF9jb21wKShzdHJ1Y3QgYm54MnggKmJwLAorCQkJIHN0cnVjdCBibngyeF9yeF9tb2RlX3JhbXJvZF9wYXJhbXMgKnApOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKiogU2V0IG11bHRpY2FzdCBncm91cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCXU4ICptYWM7Cit9OworCit1bmlvbiBibngyeF9tY2FzdF9jb25maWdfZGF0YSB7CisJdTggKm1hYzsKKwl1OCBiaW47IC8qIHVzZWQgaW4gYSBSRVNUT1JFIGZsb3cgKi8KK307CisKK3N0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zIHsKKwlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICptY2FzdF9vYmo7CisKKwkvKiBSZWxldmFudCBvcHRpb25zIGFyZSBSQU1ST0RfQ09NUF9XQUlUIGFuZCBSQU1ST0RfRFJWX0NMUl9PTkxZICovCisJdW5zaWduZWQgbG9uZyByYW1yb2RfZmxhZ3M7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1jYXN0X2xpc3Q7IC8qIGxpc3Qgb2Ygc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSAqLworCS8qKiBUT0RPOgorCSAqICAgICAgLSByZW5hbWUgaXQgdG8gbWFjc19udW0uCisJICogICAgICAtIEFkZCBhIG5ldyBjb21tYW5kIHR5cGUgZm9yIGhhbmRsaW5nIHBlbmRpbmcgY29tbWFuZHMKKwkgKiAgICAgICAgKHJlbW92ZSAiemVybyBzZW1hbnRpY3MiKS4KKwkgKgorCSAqICBMZW5ndGggb2YgbWNhc3RfbGlzdC4gSWYgemVybyBhbmQgQUREX0NPTlQgY29tbWFuZCAtIHBvc3QKKwkgKiAgcGVuZGluZyBjb21tYW5kcy4KKwkgKi8KKwlpbnQgbWNhc3RfbGlzdF9sZW47Cit9OworCitlbnVtIHsKKwlCTlgyWF9NQ0FTVF9DTURfQURELAorCUJOWDJYX01DQVNUX0NNRF9DT05ULAorCUJOWDJYX01DQVNUX0NNRF9ERUwsCisJQk5YMlhfTUNBU1RfQ01EX1JFU1RPUkUsCit9OworCitzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqIHsKKwlzdHJ1Y3QgYm54MnhfcmF3X29iaiByYXc7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCSNkZWZpbmUgQk5YMlhfTUNBU1RfQklOU19OVU0JMjU2CisJCSNkZWZpbmUgQk5YMlhfTUNBU1RfVkVDX1NaCShCTlgyWF9NQ0FTVF9CSU5TX05VTSAvIDY0KQorCQkJdTY0IHZlY1tCTlgyWF9NQ0FTVF9WRUNfU1pdOworCisJCQkvKiogTnVtYmVyIG9mIEJJTnMgdG8gY2xlYXIuIFNob3VsZCBiZSB1cGRhdGVkCisJCQkgKiAgaW1tZWRpYXRlbHkgd2hlbiBhIGNvbW1hbmQgYXJyaXZlcyBpbiBvcmRlciB0bworCQkJICogIHByb3Blcmx5IGNyZWF0ZSBERUwgY29tbWFuZHMuCisJCQkgKi8KKwkJCWludCBudW1fYmluc19zZXQ7CisJCX0gYXByb3hfbWF0Y2g7CisKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgbWFjczsKKwkJCWludCBudW1fbWFjc19zZXQ7CisJCX0gZXhhY3RfbWF0Y2g7CisJfSByZWdpc3RyeTsKKworCS8qIFBlbmRpbmcgY29tbWFuZHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmdfY21kc19oZWFkOworCisJLyogQSBzdGF0ZSB0aGF0IGlzIHNldCBpbiByYXcucHN0YXRlLCB3aGVuIHRoZXJlIGFyZSBwZW5kaW5nIGNvbW1hbmRzICovCisJaW50IHNjaGVkX3N0YXRlOworCisJLyogTWF4aW1hbCBudW1iZXIgb2YgbWNhc3QgTUFDcyBjb25maWd1cmVkIGluIG9uZSBjb21tYW5kICovCisJaW50IG1heF9jbWRfbGVuOworCisJLyogVG90YWwgbnVtYmVyIG9mIGN1cnJlbnRseSBwZW5kaW5nIE1BQ3MgdG8gY29uZmlndXJlOiBib3RoCisJICogaW4gdGhlIHBlbmRpbmcgY29tbWFuZHMgbGlzdCBhbmQgaW4gdGhlIGN1cnJlbnQgY29tbWFuZC4KKwkgKi8KKwlpbnQgdG90YWxfcGVuZGluZ19udW07CisKKwl1OCBlbmdpbmVfaWQ7CisKKwkvKioKKwkgKiBAcGFyYW0gY21kIGNvbW1hbmQgdG8gZXhlY3V0ZSAoQk5YMlhfTUNBU1RfQ01EX1gsIHNlZSBhYm92ZSkKKwkgKi8KKwlpbnQgKCpjb25maWdfbWNhc3QpKHN0cnVjdCBibngyeCAqYnAsCisJCQkJc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnAsIGludCBjbWQpOworCisJLyoqCisJICogRmlsbHMgdGhlIHJhbXJvZCBkYXRhIGR1cmluZyB0aGUgUkVTVE9SRSBmbG93LgorCSAqCisJICogQHBhcmFtIGJwCisJICogQHBhcmFtIG8KKwkgKiBAcGFyYW0gc3RhcnRfaWR4IFJlZ2lzdHJ5IGluZGV4IHRvIHN0YXJ0IGZyb20KKwkgKiBAcGFyYW0gcmRhdGFfaWR4IEluZGV4IGluIHRoZSByYW1yb2QgZGF0YSB0byBzdGFydCBmcm9tCisJICoKKwkgKiBAcmV0dXJuIC0xIGlmIHdlIGhhbmRsZWQgdGhlIHdob2xlIHJlZ2lzdHJ5IG9yIGluZGV4IG9mIHRoZSBsYXN0CisJICogICAgICAgICBoYW5kbGVkIHJlZ2lzdHJ5IGVsZW1lbnQuCisJICovCisJaW50ICgqaGRsX3Jlc3RvcmUpKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8sCisJCQkgICBpbnQgc3RhcnRfYmluLCBpbnQgKnJkYXRhX2lkeCk7CisKKwlpbnQgKCplbnF1ZXVlX2NtZCkoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbywKKwkJCSAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLCBpbnQgY21kKTsKKworCXZvaWQgKCpzZXRfb25lX3J1bGUpKHN0cnVjdCBibngyeCAqYnAsCisJCQkgICAgIHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8sIGludCBpZHgsCisJCQkgICAgIHVuaW9uIGJueDJ4X21jYXN0X2NvbmZpZ19kYXRhICpjZmdfZGF0YSwgaW50IGNtZCk7CisKKwkvKiogQ2hlY2tzIGlmIHRoZXJlIGFyZSBtb3JlIG1jYXN0IE1BQ3MgdG8gYmUgc2V0IG9yIGEgcHJldmlvdXMKKwkgKiAgY29tbWFuZCBpcyBzdGlsbCBwZW5kaW5nLgorCSAqLworCWJvb2wgKCpjaGVja19wZW5kaW5nKShzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvKTsKKworCS8qKgorCSAqIFNldC9DbGVhci9DaGVjayBTQ0hFRFVMRUQgc3RhdGUgb2YgdGhlIG9iamVjdAorCSAqLworCXZvaWQgKCpzZXRfc2NoZWQpKHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8pOworCXZvaWQgKCpjbGVhcl9zY2hlZCkoc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbyk7CisJYm9vbCAoKmNoZWNrX3NjaGVkKShzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvKTsKKworCS8qIFdhaXQgdW50aWwgYWxsIHBlbmRpbmcgY29tbWFuZHMgY29tcGxldGUgKi8KKwlpbnQgKCp3YWl0X2NvbXApKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8pOworCisJLyoqCisJICogSGFuZGxlIHRoZSBpbnRlcm5hbCBvYmplY3QgY291bnRlcnMgbmVlZGVkIGZvciBwcm9wZXIKKwkgKiBjb21tYW5kcyBoYW5kbGluZy4gQ2hlY2tzIHRoYXQgdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgYXJlCisJICogZmVhc2libGUuCisJICovCisJaW50ICgqdmFsaWRhdGUpKHN0cnVjdCBibngyeCAqYnAsCisJCQlzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwgaW50IGNtZCk7CisKKwkvKioKKwkgKiBSZXN0b3JlIHRoZSB2YWx1ZXMgb2YgaW50ZXJuYWwgY291bnRlcnMgaW4gY2FzZSBvZiBhIGZhaWx1cmUuCisJICovCisJdm9pZCAoKnJldmVydCkoc3RydWN0IGJueDJ4ICpicCwKKwkJICAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCQkgICAgICAgaW50IG9sZF9udW1fYmlucyk7CisKKwlpbnQgKCpnZXRfcmVnaXN0cnlfc2l6ZSkoc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbyk7CisJdm9pZCAoKnNldF9yZWdpc3RyeV9zaXplKShzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvLCBpbnQgbik7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIENyZWRpdCBoYW5kbGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiB7CisKKwkvKiBDdXJyZW50IGFtb3VudCBvZiBjcmVkaXQgaW4gdGhlIHBvb2wgKi8KKwlhdG9taWNfdAljcmVkaXQ7CisKKwkvKiBNYXhpbXVtIGFsbG93ZWQgY3JlZGl0LiBwdXQoKSB3aWxsIGNoZWNrIGFnYWluc3QgaXQuICovCisJaW50CQlwb29sX3N6OworCisJLyoKKwkgKiAgQWxsb2NhdGUgYSBwb29sIHRhYmxlIHN0YXRpY2FsbHkuCisJICoKKwkgKiAgQ3VycmVudGx5IHRoZSBtYW1pbXVtIGFsbG93ZWQgc2l6ZSBpcyBNQVhfTUFDX0NSRURJVF9FMigyNzIpCisJICoKKwkgKiAgVGhlIHNldCBiaXQgaW4gdGhlIHRhYmxlIHdpbGwgbWVhbiB0aGF0IHRoZSBlbnRyeSBpcyBhdmFpbGFibGUuCisJICovCisjZGVmaW5lIEJOWDJYX1BPT0xfVkVDX1NJWkUJKE1BWF9NQUNfQ1JFRElUX0UyIC8gNjQpCisJdTY0CQlwb29sX21pcnJvcltCTlgyWF9QT09MX1ZFQ19TSVpFXTsKKworCS8qIEJhc2UgcG9vbCBvZmZzZXQgKGluaXRpYWxpemVkIGRpZmZlcmVudGx5ICovCisJaW50CQliYXNlX3Bvb2xfb2Zmc2V0OworCisJLyoqCisJICogR2V0IHRoZSBuZXh0IGZyZWUgcG9vbCBlbnRyeS4KKwkgKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSB3YXMgYSBmcmVlIGVudHJ5IGluIHRoZSBwb29sCisJICovCisJYm9vbCAoKmdldF9lbnRyeSkoc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqbywgaW50ICplbnRyeSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGVudHJ5IGJhY2sgdG8gdGhlIHBvb2wuCisJICoKKwkgKiBAcmV0dXJuIHRydWUgaWYgZW50cnkgaXMgbGVnYWwgYW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorCSAqICAgICAgICAgcmV0dXJuZWQgdG8gdGhlIHBvb2wuCisJICovCisJYm9vbCAoKnB1dF9lbnRyeSkoc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqbywgaW50IGVudHJ5KTsKKworCS8qKgorCSAqIEdldCB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBjcmVkaXQgZnJvbSB0aGUgcG9vbC4KKwkgKgorCSAqIEBwYXJhbSBjbnQgQW1vdW50IG9mIHJlcXVlc3RlZCBjcmVkaXQKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsCisJICovCisJYm9vbCAoKmdldCkoc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqbywgaW50IGNudCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjcmVkaXQgdG8gdGhlIHBvb2wuCisJICoKKwkgKiBAcGFyYW0gY250IEFtb3VudCBvZiBjcmVkaXQgdG8gcmV0dXJuCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bAorCSAqLworCWJvb2wgKCpwdXQpKHN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmogKm8sIGludCBjbnQpOworCisJLyoqCisJICogUmVhZHMgdGhlIGN1cnJlbnQgYW1vdW50IG9mIGNyZWRpdC4KKwkgKi8KKwlpbnQgKCpjaGVjaykoc3RydWN0IGJueDJ4X2NyZWRpdF9wb29sX29iaiAqbyk7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIFJTUyBjb25maWd1cmF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZW51bSB7CisJLyogUlNTX01PREUgYml0cyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCisJQk5YMlhfUlNTX01PREVfRElTQUJMRUQsCisJQk5YMlhfUlNTX01PREVfUkVHVUxBUiwKKwlCTlgyWF9SU1NfTU9ERV9WTEFOX1BSSSwKKwlCTlgyWF9SU1NfTU9ERV9FMUhPVl9QUkksCisJQk5YMlhfUlNTX01PREVfSVBfRFNDUCwKKworCUJOWDJYX1JTU19TRVRfU1JDSCwgLyogU2V0dXAgc2VhcmNoZXIsIEUxeCBzcGVjaWZpYyBmbGFnICovCisKKwlCTlgyWF9SU1NfSVBWNCwKKwlCTlgyWF9SU1NfSVBWNF9UQ1AsCisJQk5YMlhfUlNTX0lQVjYsCisJQk5YMlhfUlNTX0lQVjZfVENQLAorfTsKKworc3RydWN0IGJueDJ4X2NvbmZpZ19yc3NfcGFyYW1zIHsKKwlzdHJ1Y3QgYm54MnhfcnNzX2NvbmZpZ19vYmogKnJzc19vYmo7CisKKwkvKiBtYXkgaGF2ZSBSQU1ST0RfQ09NUF9XQUlUIHNldCBvbmx5ICovCisJdW5zaWduZWQgbG9uZwlyYW1yb2RfZmxhZ3M7CisKKwkvKiBCTlgyWF9SU1NfWCBiaXRzICovCisJdW5zaWduZWQgbG9uZwlyc3NfZmxhZ3M7CisKKwkvKiBOdW1iZXIgaGFzaCBiaXRzIHRvIHRha2UgaW50byBhbiBhY2NvdW50ICovCisJdTgJCXJzc19yZXN1bHRfbWFzazsKKworCS8qIEluZGlyZWN0aW9uIHRhYmxlICovCisJdTgJCWluZF90YWJsZVtUX0VUSF9JTkRJUkVDVElPTl9UQUJMRV9TSVpFXTsKKworCS8qIFJTUyBoYXNoIHZhbHVlcyAqLworCXUzMgkJcnNzX2tleVsxMF07CisKKwkvKiB2YWxpZCBvbmx5IGlmZiBCTlgyWF9SU1NfVVBEQVRFX1RPRSBpcyBzZXQgKi8KKwl1MTYJCXRvZV9yc3NfYml0bWFwOworfTsKKworc3RydWN0IGJueDJ4X3Jzc19jb25maWdfb2JqIHsKKwlzdHJ1Y3QgYm54MnhfcmF3X29iaglyYXc7CisKKwkvKiBSU1MgZW5naW5lIHRvIHVzZSAqLworCXU4CQkJZW5naW5lX2lkOworCisJLyogTGFzdCBjb25maWd1cmVkIGluZGlyZWN0aW9uIHRhYmxlICovCisJdTgJCQlpbmRfdGFibGVbVF9FVEhfSU5ESVJFQ1RJT05fVEFCTEVfU0laRV07CisKKwlpbnQgKCpjb25maWdfcnNzKShzdHJ1Y3QgYm54MnggKmJwLAorCQkJICBzdHJ1Y3QgYm54MnhfY29uZmlnX3Jzc19wYXJhbXMgKnApOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqIFF1ZXVlIHN0YXRlIHVwZGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVVBEQVRFIGNvbW1hbmQgb3B0aW9ucyAqLworZW51bSB7CisJQk5YMlhfUV9VUERBVEVfSU5fVkxBTl9SRU0sCisJQk5YMlhfUV9VUERBVEVfSU5fVkxBTl9SRU1fQ0hORywKKwlCTlgyWF9RX1VQREFURV9PVVRfVkxBTl9SRU0sCisJQk5YMlhfUV9VUERBVEVfT1VUX1ZMQU5fUkVNX0NITkcsCisJQk5YMlhfUV9VUERBVEVfQU5USV9TUE9PRiwKKwlCTlgyWF9RX1VQREFURV9BTlRJX1NQT09GX0NITkcsCisJQk5YMlhfUV9VUERBVEVfQUNUSVZBVEUsCisJQk5YMlhfUV9VUERBVEVfQUNUSVZBVEVfQ0hORywKKwlCTlgyWF9RX1VQREFURV9ERUZfVkxBTl9FTiwKKwlCTlgyWF9RX1VQREFURV9ERUZfVkxBTl9FTl9DSE5HLAorCUJOWDJYX1FfVVBEQVRFX1NJTEVOVF9WTEFOX1JFTV9DSE5HLAorCUJOWDJYX1FfVVBEQVRFX1NJTEVOVF9WTEFOX1JFTQorfTsKKworLyogQWxsb3dlZCBRdWV1ZSBzdGF0ZXMgKi8KK2VudW0gYm54MnhfcV9zdGF0ZSB7CisJQk5YMlhfUV9TVEFURV9SRVNFVCwKKwlCTlgyWF9RX1NUQVRFX0lOSVRJQUxJWkVELAorCUJOWDJYX1FfU1RBVEVfQUNUSVZFLAorCUJOWDJYX1FfU1RBVEVfTVVMVElfQ09TLAorCUJOWDJYX1FfU1RBVEVfTUNPU19URVJNSU5BVEVELAorCUJOWDJYX1FfU1RBVEVfSU5BQ1RJVkUsCisJQk5YMlhfUV9TVEFURV9TVE9QUEVELAorCUJOWDJYX1FfU1RBVEVfVEVSTUlOQVRFRCwKKwlCTlgyWF9RX1NUQVRFX0ZMUkVELAorCUJOWDJYX1FfU1RBVEVfTUFYLAorfTsKKworLyogQWxsb3dlZCBjb21tYW5kcyAqLworZW51bSBibngyeF9xdWV1ZV9jbWQgeworCUJOWDJYX1FfQ01EX0lOSVQsCisJQk5YMlhfUV9DTURfU0VUVVAsCisJQk5YMlhfUV9DTURfU0VUVVBfVFhfT05MWSwKKwlCTlgyWF9RX0NNRF9ERUFDVElWQVRFLAorCUJOWDJYX1FfQ01EX0FDVElWQVRFLAorCUJOWDJYX1FfQ01EX1VQREFURSwKKwlCTlgyWF9RX0NNRF9VUERBVEVfVFBBLAorCUJOWDJYX1FfQ01EX0hBTFQsCisJQk5YMlhfUV9DTURfQ0ZDX0RFTCwKKwlCTlgyWF9RX0NNRF9URVJNSU5BVEUsCisJQk5YMlhfUV9DTURfRU1QVFksCisJQk5YMlhfUV9DTURfTUFYLAorfTsKKworLyogcXVldWUgU0VUVVAgKyBJTklUIGZsYWdzICovCitlbnVtIHsKKwlCTlgyWF9RX0ZMR19UUEEsCisJQk5YMlhfUV9GTEdfVFBBX0lQVjYsCisJQk5YMlhfUV9GTEdfU1RBVFMsCisJQk5YMlhfUV9GTEdfWkVST19TVEFUUywKKwlCTlgyWF9RX0ZMR19BQ1RJVkUsCisJQk5YMlhfUV9GTEdfT1YsCisJQk5YMlhfUV9GTEdfVkxBTiwKKwlCTlgyWF9RX0ZMR19DT1MsCisJQk5YMlhfUV9GTEdfSEMsCisJQk5YMlhfUV9GTEdfSENfRU4sCisJQk5YMlhfUV9GTEdfREhDLAorCUJOWDJYX1FfRkxHX0ZDT0UsCisJQk5YMlhfUV9GTEdfTEVBRElOR19SU1MsCisJQk5YMlhfUV9GTEdfTUNBU1QsCisJQk5YMlhfUV9GTEdfREVGX1ZMQU4sCisJQk5YMlhfUV9GTEdfVFhfU1dJVENILAorCUJOWDJYX1FfRkxHX1RYX1NFQywKKwlCTlgyWF9RX0ZMR19BTlRJX1NQT09GLAorCUJOWDJYX1FfRkxHX1NJTEVOVF9WTEFOX1JFTQorfTsKKworLyogUXVldWUgdHlwZSBvcHRpb25zOiBxdWV1ZSB0eXBlIG1heSBiZSBhIGNvbXBpbmF0aW9uIG9mIGJlbG93LiAqLworZW51bSBibngyeF9xX3R5cGUgeworCS8qKiBUT0RPOiBDb25zaWRlciBtb3ZpbmcgYm90aCB0aGVzZSBmbGFncyBpbnRvIHRoZSBpbml0KCkKKwkgKiAgICAgICAgcmFtcm9kIHBhcmFtcy4KKwkgKi8KKwlCTlgyWF9RX1RZUEVfSEFTX1JYLAorCUJOWDJYX1FfVFlQRV9IQVNfVFgsCit9OworCisjZGVmaW5lIEJOWDJYX1BSSU1BUllfQ0lEX0lOREVYCQkJMAorI2RlZmluZSBCTlgyWF9NVUxUSV9UWF9DT1NfRTFYCQkJMQorI2RlZmluZSBCTlgyWF9NVUxUSV9UWF9DT1NfRTJfRTNBMAkJMgorI2RlZmluZSBCTlgyWF9NVUxUSV9UWF9DT1NfRTNCMAkJCTMKKyNkZWZpbmUgQk5YMlhfTVVMVElfVFhfQ09TCQkJQk5YMlhfTVVMVElfVFhfQ09TX0UzQjAKKworCitzdHJ1Y3QgYm54MnhfcXVldWVfaW5pdF9wYXJhbXMgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJCXUxNgkJaGNfcmF0ZTsKKwkJdTgJCWZ3X3NiX2lkOworCQl1OAkJc2JfY3FfaW5kZXg7CisJfSB0eDsKKworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJCXUxNgkJaGNfcmF0ZTsKKwkJdTgJCWZ3X3NiX2lkOworCQl1OAkJc2JfY3FfaW5kZXg7CisJfSByeDsKKworCS8qIENJRCBjb250ZXh0IGluIHRoZSBob3N0IG1lbW9yeSAqLworCXN0cnVjdCBldGhfY29udGV4dCAqY3h0c1tCTlgyWF9NVUxUSV9UWF9DT1NdOworCisJLyogbWF4aW11bSBudW1iZXIgb2YgY29zIHN1cHBvcnRlZCBieSBoYXJkd2FyZSAqLworCXU4IG1heF9jb3M7Cit9OworCitzdHJ1Y3QgYm54MnhfcXVldWVfdGVybWluYXRlX3BhcmFtcyB7CisJLyogaW5kZXggd2l0aGluIHRoZSB0eF9vbmx5IGNpZHMgb2YgdGhpcyBxdWV1ZSBvYmplY3QgKi8KKwl1OCBjaWRfaW5kZXg7Cit9OworCitzdHJ1Y3QgYm54MnhfcXVldWVfY2ZjX2RlbF9wYXJhbXMgeworCS8qIGluZGV4IHdpdGhpbiB0aGUgdHhfb25seSBjaWRzIG9mIHRoaXMgcXVldWUgb2JqZWN0ICovCisJdTggY2lkX2luZGV4OworfTsKKworc3RydWN0IGJueDJ4X3F1ZXVlX3VwZGF0ZV9wYXJhbXMgeworCXVuc2lnbmVkIGxvbmcJdXBkYXRlX2ZsYWdzOyAvKiBCTlgyWF9RX1VQREFURV9YWCBiaXRzICovCisJdTE2CQlkZWZfdmxhbjsKKwl1MTYJCXNpbGVudF9yZW1vdmFsX3ZhbHVlOworCXUxNgkJc2lsZW50X3JlbW92YWxfbWFzazsKKy8qIGluZGV4IHdpdGhpbiB0aGUgdHhfb25seSBjaWRzIG9mIHRoaXMgcXVldWUgb2JqZWN0ICovCisJdTgJCWNpZF9pbmRleDsKK307CisKK3N0cnVjdCByeHFfcGF1c2VfcGFyYW1zIHsKKwl1MTYJCWJkX3RoX2xvOworCXUxNgkJYmRfdGhfaGk7CisJdTE2CQlyY3FfdGhfbG87CisJdTE2CQlyY3FfdGhfaGk7CisJdTE2CQlzZ2VfdGhfbG87IC8qIHZhbGlkIGlmZiBCTlgyWF9RX0ZMR19UUEEgKi8KKwl1MTYJCXNnZV90aF9oaTsgLyogdmFsaWQgaWZmIEJOWDJYX1FfRkxHX1RQQSAqLworCXUxNgkJcHJpX21hcDsKK307CisKKy8qIGdlbmVyYWwgKi8KK3N0cnVjdCBibngyeF9nZW5lcmFsX3NldHVwX3BhcmFtcyB7CisJLyogdmFsaWQgaWZmIEJOWDJYX1FfRkxHX1NUQVRTICovCisJdTgJCXN0YXRfaWQ7CisKKwl1OAkJc3BjbF9pZDsKKwl1MTYJCW10dTsKKwl1OAkJY29zOworfTsKKworc3RydWN0IGJueDJ4X3J4cV9zZXR1cF9wYXJhbXMgeworCS8qIGRtYSAqLworCWRtYV9hZGRyX3QJZHNjcl9tYXA7CisJZG1hX2FkZHJfdAlzZ2VfbWFwOworCWRtYV9hZGRyX3QJcmNxX21hcDsKKwlkbWFfYWRkcl90CXJjcV9ucF9tYXA7CisKKwl1MTYJCWRyb3BfZmxhZ3M7CisJdTE2CQlidWZfc3o7CisJdTgJCWZ3X3NiX2lkOworCXU4CQljbF9xem9uZV9pZDsKKworCS8qIHZhbGlkIGlmZiBCTlgyWF9RX0ZMR19UUEEgKi8KKwl1MTYJCXRwYV9hZ2dfc3o7CisJdTE2CQlzZ2VfYnVmX3N6OworCXU4CQltYXhfc2dlc19wa3Q7CisJdTgJCW1heF90cGFfcXVldWVzOworCXU4CQlyc3NfZW5naW5lX2lkOworCisJdTgJCWNhY2hlX2xpbmVfbG9nOworCisJdTgJCXNiX2NxX2luZGV4OworCisJLyogdmFsaWQgaWZmIEJYTjJYX1FfRkxHX1NJTEVOVF9WTEFOX1JFTSAqLworCXUxNiBzaWxlbnRfcmVtb3ZhbF92YWx1ZTsKKwl1MTYgc2lsZW50X3JlbW92YWxfbWFzazsKK307CisKK3N0cnVjdCBibngyeF90eHFfc2V0dXBfcGFyYW1zIHsKKwkvKiBkbWEgKi8KKwlkbWFfYWRkcl90CWRzY3JfbWFwOworCisJdTgJCWZ3X3NiX2lkOworCXU4CQlzYl9jcV9pbmRleDsKKwl1OAkJY29zOwkJLyogdmFsaWQgaWZmIEJOWDJYX1FfRkxHX0NPUyAqLworCXUxNgkJdHJhZmZpY190eXBlOworCS8qIGVxdWFscyB0byB0aGUgbGVhZGluZyByc3MgY2xpZW50IGlkLCB1c2VkIGZvciBUWCBjbGFzc2lmaWNhdGlvbiovCisJdTgJCXRzc19sZWFkaW5nX2NsX2lkOworCisJLyogdmFsaWQgaWZmIEJOWDJYX1FfRkxHX0RFRl9WTEFOICovCisJdTE2CQlkZWZhdWx0X3ZsYW47Cit9OworCitzdHJ1Y3QgYm54MnhfcXVldWVfc2V0dXBfcGFyYW1zIHsKKwlzdHJ1Y3QgYm54MnhfZ2VuZXJhbF9zZXR1cF9wYXJhbXMgZ2VuX3BhcmFtczsKKwlzdHJ1Y3QgYm54MnhfdHhxX3NldHVwX3BhcmFtcyB0eHFfcGFyYW1zOworCXN0cnVjdCBibngyeF9yeHFfc2V0dXBfcGFyYW1zIHJ4cV9wYXJhbXM7CisJc3RydWN0IHJ4cV9wYXVzZV9wYXJhbXMgcGF1c2VfcGFyYW1zOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit9OworCitzdHJ1Y3QgYm54MnhfcXVldWVfc2V0dXBfdHhfb25seV9wYXJhbXMgeworCXN0cnVjdCBibngyeF9nZW5lcmFsX3NldHVwX3BhcmFtcwlnZW5fcGFyYW1zOworCXN0cnVjdCBibngyeF90eHFfc2V0dXBfcGFyYW1zCQl0eHFfcGFyYW1zOworCXVuc2lnbmVkIGxvbmcJCQkJZmxhZ3M7CisJLyogaW5kZXggd2l0aGluIHRoZSB0eF9vbmx5IGNpZHMgb2YgdGhpcyBxdWV1ZSBvYmplY3QgKi8KKwl1OAkJCQkJY2lkX2luZGV4OworfTsKKworc3RydWN0IGJueDJ4X3F1ZXVlX3N0YXRlX3BhcmFtcyB7CisJc3RydWN0IGJueDJ4X3F1ZXVlX3NwX29iaiAqcV9vYmo7CisKKwkvKiBDdXJyZW50IGNvbW1hbmQgKi8KKwllbnVtIGJueDJ4X3F1ZXVlX2NtZCBjbWQ7CisKKwkvKiBtYXkgaGF2ZSBSQU1ST0RfQ09NUF9XQUlUIHNldCBvbmx5ICovCisJdW5zaWduZWQgbG9uZyByYW1yb2RfZmxhZ3M7CisKKwkvKiBQYXJhbXMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbW1hbmQgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBibngyeF9xdWV1ZV91cGRhdGVfcGFyYW1zCXVwZGF0ZTsKKwkJc3RydWN0IGJueDJ4X3F1ZXVlX3NldHVwX3BhcmFtcwkJc2V0dXA7CisJCXN0cnVjdCBibngyeF9xdWV1ZV9pbml0X3BhcmFtcwkJaW5pdDsKKwkJc3RydWN0IGJueDJ4X3F1ZXVlX3NldHVwX3R4X29ubHlfcGFyYW1zCXR4X29ubHk7CisJCXN0cnVjdCBibngyeF9xdWV1ZV90ZXJtaW5hdGVfcGFyYW1zCXRlcm1pbmF0ZTsKKwkJc3RydWN0IGJueDJ4X3F1ZXVlX2NmY19kZWxfcGFyYW1zCWNmY19kZWw7CisJfSBwYXJhbXM7Cit9OworCitzdHJ1Y3QgYm54MnhfcXVldWVfc3Bfb2JqIHsKKwl1MzIJCWNpZHNbQk5YMlhfTVVMVElfVFhfQ09TXTsKKwl1OAkJY2xfaWQ7CisJdTgJCWZ1bmNfaWQ7CisKKwkvKgorCSAqIG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgc3VwcG9ydGVkIGJ5IHF1ZXVlLgorCSAqIFRoZSBwcmltYXJ5IGNvbm5lY3Rpb24gb2YgdGhlIHF1ZXVlIHN1cHBvdHJzIHRoZSBmaXJzdCB0cmFmZmljCisJICogY2xhc3MuIEFueSBmdXJ0aGVyIHRyYWZmaWMgY2xhc3MgaXMgc3VwcG90ZWQgYnkgYSB0eC1vbmx5CisJICogY29ubmVjdGlvbi4KKwkgKgorCSAqIFRoZXJlZm9yZSBtYXhfY29zIGlzIGFsc28gYSBudW1iZXIgb2YgdmFsaWQgZW50cmllcyBpbiB0aGUgY2lkcworCSAqIGFycmF5LgorCSAqLworCXU4IG1heF9jb3M7CisJdTggbnVtX3R4X29ubHksIG5leHRfdHhfb25seTsKKworCWVudW0gYm54MnhfcV9zdGF0ZSBzdGF0ZSwgbmV4dF9zdGF0ZTsKKworCS8qIGJpdHMgZnJvbSBlbnVtIGJueDJ4X3FfdHlwZSAqLworCXVuc2lnbmVkIGxvbmcJdHlwZTsKKworCS8qIEJOWDJYX1FfQ01EX1hYIGJpdHMuIFRoaXMgb2JqZWN0IGltcGxlbWVudHMgIm9uZQorCSAqIHBlbmRpbmciIHBhcmFkaWdtIGJ1dCBmb3IgZGVidWcgYW5kIHRyYWNpbmcgcHVycG9zZXMgaXQncworCSAqIG1vcmUgY29udmluaWVudCB0byBoYXZlIGRpZmZlcmVudCBiaXRzIGZvciBkaWZmZXJlbnQKKwkgKiBjb21tYW5kcy4KKwkgKi8KKwl1bnNpZ25lZCBsb25nCXBlbmRpbmc7CisKKwkvKiBCdWZmZXIgdG8gdXNlIGFzIGEgcmFtcm9kIGRhdGEgYW5kIGl0cyBtYXBwaW5nICovCisJdm9pZAkJKnJkYXRhOworCWRtYV9hZGRyX3QJcmRhdGFfbWFwcGluZzsKKworCS8qKgorCSAqIFBlcmZvcm1zIG9uZSBzdGF0ZSBjaGFuZ2UgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorCSAqCisJICogQHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorCSAqLworCWludCAoKnNlbmRfY21kKShzdHJ1Y3QgYm54MnggKmJwLAorCQkJc3RydWN0IGJueDJ4X3F1ZXVlX3N0YXRlX3BhcmFtcyAqcGFyYW1zKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHBlbmRpbmcgYml0IGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIHRyYW5zaXRpb24uCisJICovCisJaW50ICgqc2V0X3BlbmRpbmcpKHN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogKm8sCisJCQkgICBzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpwYXJhbXMpOworCisJLyoqCisJICogQ2hlY2tzIHRoYXQgdGhlIHJlcXVlc3RlZCBzdGF0ZSB0cmFuc2l0aW9uIGlzIGxlZ2FsLgorCSAqLworCWludCAoKmNoZWNrX3RyYW5zaXRpb24pKHN0cnVjdCBibngyeCAqYnAsCisJCQkJc3RydWN0IGJueDJ4X3F1ZXVlX3NwX29iaiAqbywKKwkJCQlzdHJ1Y3QgYm54MnhfcXVldWVfc3RhdGVfcGFyYW1zICpwYXJhbXMpOworCisJLyoqCisJICogQ29tcGxldGVzIHRoZSBwZW5kaW5nIGNvbW1hbmQuCisJICovCisJaW50ICgqY29tcGxldGVfY21kKShzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgIHN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogKm8sCisJCQkgICAgZW51bSBibngyeF9xdWV1ZV9jbWQpOworCisJaW50ICgqd2FpdF9jb21wKShzdHJ1Y3QgYm54MnggKmJwLAorCQkJIHN0cnVjdCBibngyeF9xdWV1ZV9zcF9vYmogKm8sCisJCQkgZW51bSBibngyeF9xdWV1ZV9jbWQgY21kKTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqIEZ1bmN0aW9uIHN0YXRlIHVwZGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBbGxvd2VkIEZ1bmN0aW9uIHN0YXRlcyAqLworZW51bSBibngyeF9mdW5jX3N0YXRlIHsKKwlCTlgyWF9GX1NUQVRFX1JFU0VULAorCUJOWDJYX0ZfU1RBVEVfSU5JVElBTElaRUQsCisJQk5YMlhfRl9TVEFURV9TVEFSVEVELAorCUJOWDJYX0ZfU1RBVEVfVFhfU1RPUFBFRCwKKwlCTlgyWF9GX1NUQVRFX01BWCwKK307CisKKy8qIEFsbG93ZWQgRnVuY3Rpb24gY29tbWFuZHMgKi8KK2VudW0gYm54MnhfZnVuY19jbWQgeworCUJOWDJYX0ZfQ01EX0hXX0lOSVQsCisJQk5YMlhfRl9DTURfU1RBUlQsCisJQk5YMlhfRl9DTURfU1RPUCwKKwlCTlgyWF9GX0NNRF9IV19SRVNFVCwKKwlCTlgyWF9GX0NNRF9UWF9TVE9QLAorCUJOWDJYX0ZfQ01EX1RYX1NUQVJULAorCUJOWDJYX0ZfQ01EX01BWCwKK307CisKK3N0cnVjdCBibngyeF9mdW5jX2h3X2luaXRfcGFyYW1zIHsKKwkvKiBBIGxvYWQgcGhhc2UgcmV0dXJuZWQgYnkgTUNQLgorCSAqCisJICogTWF5IGJlOgorCSAqCQlGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT05fQ0hJUAorCSAqCQlGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT04KKwkgKgkJRldfTVNHX0NPREVfRFJWX0xPQURfUE9SVAorCSAqCQlGV19NU0dfQ09ERV9EUlZfTE9BRF9GVU5DVElPTgorCSAqLworCXUzMiBsb2FkX3BoYXNlOworfTsKKworc3RydWN0IGJueDJ4X2Z1bmNfaHdfcmVzZXRfcGFyYW1zIHsKKwkvKiBBIGxvYWQgcGhhc2UgcmV0dXJuZWQgYnkgTUNQLgorCSAqCisJICogTWF5IGJlOgorCSAqCQlGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT05fQ0hJUAorCSAqCQlGV19NU0dfQ09ERV9EUlZfTE9BRF9DT01NT04KKwkgKgkJRldfTVNHX0NPREVfRFJWX0xPQURfUE9SVAorCSAqCQlGV19NU0dfQ09ERV9EUlZfTE9BRF9GVU5DVElPTgorCSAqLworCXUzMiByZXNldF9waGFzZTsKK307CisKK3N0cnVjdCBibngyeF9mdW5jX3N0YXJ0X3BhcmFtcyB7CisJLyogTXVsdGkgRnVuY3Rpb24gbW9kZToKKwkgKgktIFNpbmdsZSBGdW5jdGlvbgorCSAqCS0gU3dpdGNoIERlcGVuZGVudAorCSAqCS0gU3dpdGNoIEluZGVwZW5kZW50CisJICovCisJdTE2IG1mX21vZGU7CisKKwkvKiBTd2l0Y2ggRGVwZW5kZW50IG1vZGUgb3V0ZXIgVkxBTiB0YWcgKi8KKwl1MTYgc2Rfdmxhbl90YWc7CisKKwkvKiBGdW5jdGlvbiBjb3MgbW9kZSAqLworCXU4IG5ldHdvcmtfY29zX21vZGU7Cit9OworCitzdHJ1Y3QgYm54MnhfZnVuY190eF9zdGFydF9wYXJhbXMgeworCXN0cnVjdCBwcmlvcml0eV9jb3MgdHJhZmZpY190eXBlX3RvX3ByaW9yaXR5X2Nvc1tNQVhfVFJBRkZJQ19UWVBFU107CisJdTggZGNiX2VuYWJsZWQ7CisJdTggZGNiX3ZlcnNpb247CisJdTggZG9udF9hZGRfcHJpXzBfZW47Cit9OworCitzdHJ1Y3QgYm54MnhfZnVuY19zdGF0ZV9wYXJhbXMgeworCXN0cnVjdCBibngyeF9mdW5jX3NwX29iaiAqZl9vYmo7CisKKwkvKiBDdXJyZW50IGNvbW1hbmQgKi8KKwllbnVtIGJueDJ4X2Z1bmNfY21kIGNtZDsKKworCS8qIG1heSBoYXZlIFJBTVJPRF9DT01QX1dBSVQgc2V0IG9ubHkgKi8KKwl1bnNpZ25lZCBsb25nCXJhbXJvZF9mbGFnczsKKworCS8qIFBhcmFtcyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgY29tbWFuZCAqLworCXVuaW9uIHsKKwkJc3RydWN0IGJueDJ4X2Z1bmNfaHdfaW5pdF9wYXJhbXMgaHdfaW5pdDsKKwkJc3RydWN0IGJueDJ4X2Z1bmNfaHdfcmVzZXRfcGFyYW1zIGh3X3Jlc2V0OworCQlzdHJ1Y3QgYm54MnhfZnVuY19zdGFydF9wYXJhbXMgc3RhcnQ7CisJCXN0cnVjdCBibngyeF9mdW5jX3R4X3N0YXJ0X3BhcmFtcyB0eF9zdGFydDsKKwl9IHBhcmFtczsKK307CisKK3N0cnVjdCBibngyeF9mdW5jX3NwX2Rydl9vcHMgeworCS8qIEluaXQgdG9vbCArIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb246CisJICogICAgICAtIENvbW1vbiBDaGlwCisJICogICAgICAtIENvbW1vbiAocGVyIFBhdGgpCisJICogICAgICAtIFBvcnQKKwkgKiAgICAgIC0gRnVuY3Rpb24gcGhhc2VzCisJICovCisJaW50ICgqaW5pdF9od19jbW5fY2hpcCkoc3RydWN0IGJueDJ4ICpicCk7CisJaW50ICgqaW5pdF9od19jbW4pKHN0cnVjdCBibngyeCAqYnApOworCWludCAoKmluaXRfaHdfcG9ydCkoc3RydWN0IGJueDJ4ICpicCk7CisJaW50ICgqaW5pdF9od19mdW5jKShzdHJ1Y3QgYm54MnggKmJwKTsKKworCS8qIFJlc2V0IEZ1bmN0aW9uIEhXOiBDb21tb24sIFBvcnQsIEZ1bmN0aW9uIHBoYXNlcy4gKi8KKwl2b2lkICgqcmVzZXRfaHdfY21uKShzdHJ1Y3QgYm54MnggKmJwKTsKKwl2b2lkICgqcmVzZXRfaHdfcG9ydCkoc3RydWN0IGJueDJ4ICpicCk7CisJdm9pZCAoKnJlc2V0X2h3X2Z1bmMpKHN0cnVjdCBibngyeCAqYnApOworCisJLyogSW5pdC9GcmVlIEdVTlpJUCByZXNvdXJjZXMgKi8KKwlpbnQgKCpndW56aXBfaW5pdCkoc3RydWN0IGJueDJ4ICpicCk7CisJdm9pZCAoKmd1bnppcF9lbmQpKHN0cnVjdCBibngyeCAqYnApOworCisJLyogUHJlcGFyZS9SZWxlYXNlIEZXIHJlc291cmNlcyAqLworCWludCAoKmluaXRfZncpKHN0cnVjdCBibngyeCAqYnApOworCXZvaWQgKCpyZWxlYXNlX2Z3KShzdHJ1Y3QgYm54MnggKmJwKTsKK307CisKK3N0cnVjdCBibngyeF9mdW5jX3NwX29iaiB7CisJZW51bSBibngyeF9mdW5jX3N0YXRlCXN0YXRlLCBuZXh0X3N0YXRlOworCisJLyogQk5YMlhfRlVOQ19DTURfWFggYml0cy4gVGhpcyBvYmplY3QgaW1wbGVtZW50cyAib25lCisJICogcGVuZGluZyIgcGFyYWRpZ20gYnV0IGZvciBkZWJ1ZyBhbmQgdHJhY2luZyBwdXJwb3NlcyBpdCdzCisJICogbW9yZSBjb252aW5pZW50IHRvIGhhdmUgZGlmZmVyZW50IGJpdHMgZm9yIGRpZmZlcmVudAorCSAqIGNvbW1hbmRzLgorCSAqLworCXVuc2lnbmVkIGxvbmcJCXBlbmRpbmc7CisKKwkvKiBCdWZmZXIgdG8gdXNlIGFzIGEgcmFtcm9kIGRhdGEgYW5kIGl0cyBtYXBwaW5nICovCisJdm9pZAkJCSpyZGF0YTsKKwlkbWFfYWRkcl90CQlyZGF0YV9tYXBwaW5nOworCisJLyogdGhpcyBtdXRleCB2YWxpZGF0ZXMgdGhhdCB3aGVuIHBlbmRpbmcgZmxhZyBpcyB0YWtlbiwgdGhlIG5leHQKKwkgKiByYW1yb2QgdG8gYmUgc2VudCB3aWxsIGJlIHRoZSBvbmUgc2V0IHRoZSBwZW5kaW5nIGJpdAorCSAqLworCXN0cnVjdCBtdXRleAkJb25lX3BlbmRpbmdfbXV0ZXg7CisKKwkvKiBEcml2ZXIgaW50ZXJmYWNlICovCisJc3RydWN0IGJueDJ4X2Z1bmNfc3BfZHJ2X29wcwkqZHJ2OworCisJLyoqCisJICogUGVyZm9ybXMgb25lIHN0YXRlIGNoYW5nZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHBhcmFtZXRlcnMuCisJICoKKwkgKiBAcmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisJICovCisJaW50ICgqc2VuZF9jbWQpKHN0cnVjdCBibngyeCAqYnAsCisJCQlzdHJ1Y3QgYm54MnhfZnVuY19zdGF0ZV9wYXJhbXMgKnBhcmFtcyk7CisKKwkvKioKKwkgKiBDaGVja3MgdGhhdCB0aGUgcmVxdWVzdGVkIHN0YXRlIHRyYW5zaXRpb24gaXMgbGVnYWwuCisJICovCisJaW50ICgqY2hlY2tfdHJhbnNpdGlvbikoc3RydWN0IGJueDJ4ICpicCwKKwkJCQlzdHJ1Y3QgYm54MnhfZnVuY19zcF9vYmogKm8sCisJCQkJc3RydWN0IGJueDJ4X2Z1bmNfc3RhdGVfcGFyYW1zICpwYXJhbXMpOworCisJLyoqCisJICogQ29tcGxldGVzIHRoZSBwZW5kaW5nIGNvbW1hbmQuCisJICovCisJaW50ICgqY29tcGxldGVfY21kKShzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgIHN0cnVjdCBibngyeF9mdW5jX3NwX29iaiAqbywKKwkJCSAgICBlbnVtIGJueDJ4X2Z1bmNfY21kIGNtZCk7CisKKwlpbnQgKCp3YWl0X2NvbXApKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF9mdW5jX3NwX29iaiAqbywKKwkJCSBlbnVtIGJueDJ4X2Z1bmNfY21kIGNtZCk7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKiBJbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUXVldWVhYmxlIG9iamVjdHMgc2V0ICovCit1bmlvbiBibngyeF9xYWJsZV9vYmogeworCXN0cnVjdCBibngyeF92bGFuX21hY19vYmogdmxhbl9tYWM7Cit9OworLyoqKioqKioqKioqKioqIEZ1bmN0aW9uIHN0YXRlIHVwZGF0ZSAqKioqKioqKiovCit2b2lkIGJueDJ4X2luaXRfZnVuY19vYmooc3RydWN0IGJueDJ4ICpicCwKKwkJCSBzdHJ1Y3QgYm54MnhfZnVuY19zcF9vYmogKm9iaiwKKwkJCSB2b2lkICpyZGF0YSwgZG1hX2FkZHJfdCByZGF0YV9tYXBwaW5nLAorCQkJIHN0cnVjdCBibngyeF9mdW5jX3NwX2Rydl9vcHMgKmRydl9pZmFjZSk7CisKK2ludCBibngyeF9mdW5jX3N0YXRlX2NoYW5nZShzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgIHN0cnVjdCBibngyeF9mdW5jX3N0YXRlX3BhcmFtcyAqcGFyYW1zKTsKKworZW51bSBibngyeF9mdW5jX3N0YXRlIGJueDJ4X2Z1bmNfZ2V0X3N0YXRlKHN0cnVjdCBibngyeCAqYnAsCisJCQkJCSAgIHN0cnVjdCBibngyeF9mdW5jX3NwX29iaiAqbyk7CisvKioqKioqKioqKioqKioqKioqKiBRdWV1ZSBTdGF0ZSAqKioqKioqKioqKioqKi8KK3ZvaWQgYm54MnhfaW5pdF9xdWV1ZV9vYmooc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgc3RydWN0IGJueDJ4X3F1ZXVlX3NwX29iaiAqb2JqLCB1OCBjbF9pZCwgdTMyICpjaWRzLAorCQkJICB1OCBjaWRfY250LCB1OCBmdW5jX2lkLCB2b2lkICpyZGF0YSwKKwkJCSAgZG1hX2FkZHJfdCByZGF0YV9tYXBwaW5nLCB1bnNpZ25lZCBsb25nIHR5cGUpOworCitpbnQgYm54MnhfcXVldWVfc3RhdGVfY2hhbmdlKHN0cnVjdCBibngyeCAqYnAsCisJCQkgICAgIHN0cnVjdCBibngyeF9xdWV1ZV9zdGF0ZV9wYXJhbXMgKnBhcmFtcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKiogVkxBTi1NQUMgKioqKioqKioqKioqKioqKi8KK3ZvaWQgYm54MnhfaW5pdF9tYWNfb2JqKHN0cnVjdCBibngyeCAqYnAsCisJCQlzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICptYWNfb2JqLAorCQkJdTggY2xfaWQsIHUzMiBjaWQsIHU4IGZ1bmNfaWQsIHZvaWQgKnJkYXRhLAorCQkJZG1hX2FkZHJfdCByZGF0YV9tYXBwaW5nLCBpbnQgc3RhdGUsCisJCQl1bnNpZ25lZCBsb25nICpwc3RhdGUsIGJueDJ4X29ial90eXBlIHR5cGUsCisJCQlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICptYWNzX3Bvb2wpOworCit2b2lkIGJueDJ4X2luaXRfdmxhbl9vYmooc3RydWN0IGJueDJ4ICpicCwKKwkJCSBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICp2bGFuX29iaiwKKwkJCSB1OCBjbF9pZCwgdTMyIGNpZCwgdTggZnVuY19pZCwgdm9pZCAqcmRhdGEsCisJCQkgZG1hX2FkZHJfdCByZGF0YV9tYXBwaW5nLCBpbnQgc3RhdGUsCisJCQkgdW5zaWduZWQgbG9uZyAqcHN0YXRlLCBibngyeF9vYmpfdHlwZSB0eXBlLAorCQkJIHN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmogKnZsYW5zX3Bvb2wpOworCit2b2lkIGJueDJ4X2luaXRfdmxhbl9tYWNfb2JqKHN0cnVjdCBibngyeCAqYnAsCisJCQkgICAgIHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKnZsYW5fbWFjX29iaiwKKwkJCSAgICAgdTggY2xfaWQsIHUzMiBjaWQsIHU4IGZ1bmNfaWQsIHZvaWQgKnJkYXRhLAorCQkJICAgICBkbWFfYWRkcl90IHJkYXRhX21hcHBpbmcsIGludCBzdGF0ZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyAqcHN0YXRlLCBibngyeF9vYmpfdHlwZSB0eXBlLAorCQkJICAgICBzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICptYWNzX3Bvb2wsCisJCQkgICAgIHN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmogKnZsYW5zX3Bvb2wpOworCitpbnQgYm54MnhfY29uZmlnX3ZsYW5fbWFjKHN0cnVjdCBibngyeCAqYnAsCisJCQkgIHN0cnVjdCBibngyeF92bGFuX21hY19yYW1yb2RfcGFyYW1zICpwKTsKKworaW50IGJueDJ4X3ZsYW5fbWFjX21vdmUoc3RydWN0IGJueDJ4ICpicCwKKwkJCXN0cnVjdCBibngyeF92bGFuX21hY19yYW1yb2RfcGFyYW1zICpwLAorCQkJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqZGVzdF9vKTsKKworLyoqKioqKioqKioqKioqKioqKioqKiBSWCBNT0RFICoqKioqKioqKioqKioqKiovCisKK3ZvaWQgYm54MnhfaW5pdF9yeF9tb2RlX29iaihzdHJ1Y3QgYm54MnggKmJwLAorCQkJICAgIHN0cnVjdCBibngyeF9yeF9tb2RlX29iaiAqbyk7CisKKy8qKgorICogU2VuZCBhbmQgUlhfTU9ERSByYW1yb2QgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSBicAorICogQHBhcmFtIHAgQ29tbWFuZCBwYXJhbWV0ZXJzCisgKgorICogQHJldHVybiAwIC0gaWYgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsbCBhbmQgdGhlcmUgaXMgbm8gcGVuZGluZyBjb21wbGV0aW9ucywKKyAqICAgICAgICAgcG9zaXRpdmUgbnVtYmVyIC0gaWYgdGhlcmUgYXJlIHBlbmRpbmcgY29tcGxldGlvbnMsCisgKiAgICAgICAgIG5lZ2F0aXZlIC0gaWYgdGhlcmUgd2VyZSBlcnJvcnMKKyAqLworaW50IGJueDJ4X2NvbmZpZ19yeF9tb2RlKHN0cnVjdCBibngyeCAqYnAsCisJCQkgc3RydWN0IGJueDJ4X3J4X21vZGVfcmFtcm9kX3BhcmFtcyAqcCk7CisKKy8qKioqKioqKioqKioqKioqKiogTVVMVElDQVNUUyAqKioqKioqKioqKioqKioqLworCit2b2lkIGJueDJ4X2luaXRfbWNhc3Rfb2JqKHN0cnVjdCBibngyeCAqYnAsCisJCQkgIHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm1jYXN0X29iaiwKKwkJCSAgdTggbWNhc3RfY2xfaWQsIHUzMiBtY2FzdF9jaWQsIHU4IGZ1bmNfaWQsCisJCQkgIHU4IGVuZ2luZV9pZCwgdm9pZCAqcmRhdGEsIGRtYV9hZGRyX3QgcmRhdGFfbWFwcGluZywKKwkJCSAgaW50IHN0YXRlLCB1bnNpZ25lZCBsb25nICpwc3RhdGUsCisJCQkgIGJueDJ4X29ial90eXBlIHR5cGUpOworCisvKioKKyAqIENvbmZpZ3VyZSBtdWx0aWNhc3QgTUFDcyBsaXN0LiBNYXkgY29uZmlndXJlIGEgbmV3IGxpc3QKKyAqIHByb3ZpZGVkIGluIHAtPm1jYXN0X2xpc3QgKEJOWDJYX01DQVNUX0NNRF9BREQpLCBjbGVhbiB1cAorICogKEJOWDJYX01DQVNUX0NNRF9ERUwpIG9yIHJlc3RvcmUgKEJOWDJYX01DQVNUX0NNRF9SRVNUT1JFKSBhIGN1cnJlbnQKKyAqIGNvbmZpZ3VyYXRpb24sIGNvbnRpbnVlIHRvIGV4ZWN1dGUgdGhlIHBlbmRpbmcgY29tbWFuZHMKKyAqIChCTlgyWF9NQ0FTVF9DTURfQ09OVCkuCisgKgorICogSWYgcHJldmlvdXMgY29tbWFuZCBpcyBzdGlsbCBwZW5kaW5nIG9yIGlmIG51bWJlciBvZiBNQUNzIHRvCisgKiBjb25maWd1cmUgaXMgbW9yZSB0aGF0IG1heGltdW0gbnVtYmVyIG9mIE1BQ3MgaW4gb25lIGNvbW1hbmQsCisgKiB0aGUgY3VycmVudCBjb21tYW5kIHdpbGwgYmUgZW5xdWV1ZWQgdG8gdGhlIHRhaWwgb2YgdGhlCisgKiBwZW5kaW5nIGNvbW1hbmRzIGxpc3QuCisgKgorICogQHBhcmFtIGJwCisgKiBAcGFyYW0gcAorICogQHBhcmFtIGNvbW1hbmQgdG8gZXhlY3V0ZTogQk5YMlhfTUNBU1RfQ01EX1gKKyAqCisgKiBAcmV0dXJuIDAgaXMgb3BlcmF0aW9uIHdhcyBzdWNlc3NmdWxsIGFuZCB0aGVyZSBhcmUgbm8gcGVuZGluZyBjb21wbGV0aW9ucywKKyAqICAgICAgICAgbmVnYXRpdmUgaWYgdGhlcmUgd2VyZSBlcnJvcnMsIHBvc2l0aXZlIGlmIHRoZXJlIGFyZSBwZW5kaW5nCisgKiAgICAgICAgIGNvbXBsZXRpb25zLgorICovCitpbnQgYm54MnhfY29uZmlnX21jYXN0KHN0cnVjdCBibngyeCAqYnAsCisJCSAgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwgaW50IGNtZCk7CisKKy8qKioqKioqKioqKioqKioqKiogQ1JFRElUIFBPT0wgKioqKioqKioqKioqKioqKi8KK3ZvaWQgYm54MnhfaW5pdF9tYWNfY3JlZGl0X3Bvb2woc3RydWN0IGJueDJ4ICpicCwKKwkJCQlzdHJ1Y3QgYm54MnhfY3JlZGl0X3Bvb2xfb2JqICpwLCB1OCBmdW5jX2lkLAorCQkJCXU4IGZ1bmNfbnVtKTsKK3ZvaWQgYm54MnhfaW5pdF92bGFuX2NyZWRpdF9wb29sKHN0cnVjdCBibngyeCAqYnAsCisJCQkJIHN0cnVjdCBibngyeF9jcmVkaXRfcG9vbF9vYmogKnAsIHU4IGZ1bmNfaWQsCisJCQkJIHU4IGZ1bmNfbnVtKTsKKworCisvKioqKioqKioqKioqKioqKioqIFJTUyBDT05GSUdVUkFUSU9OICoqKioqKioqKioqKioqKiovCit2b2lkIGJueDJ4X2luaXRfcnNzX2NvbmZpZ19vYmooc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgICAgICBzdHJ1Y3QgYm54MnhfcnNzX2NvbmZpZ19vYmogKnJzc19vYmosCisJCQkgICAgICAgdTggY2xfaWQsIHUzMiBjaWQsIHU4IGZ1bmNfaWQsIHU4IGVuZ2luZV9pZCwKKwkJCSAgICAgICB2b2lkICpyZGF0YSwgZG1hX2FkZHJfdCByZGF0YV9tYXBwaW5nLAorCQkJICAgICAgIGludCBzdGF0ZSwgdW5zaWduZWQgbG9uZyAqcHN0YXRlLAorCQkJICAgICAgIGJueDJ4X29ial90eXBlIHR5cGUpOworCisvKioKKyAqIFVwZGF0ZXMgUlNTIGNvbmZpZ3VyYXRpb24gYWNjb3JkaW5nIHRvIHByb3ZpZGVkIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIGJwCisgKiBAcGFyYW0gcAorICoKKyAqIEByZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MKKyAqLworaW50IGJueDJ4X2NvbmZpZ19yc3Moc3RydWN0IGJueDJ4ICpicCwKKwkJICAgICBzdHJ1Y3QgYm54MnhfY29uZmlnX3Jzc19wYXJhbXMgKnApOworCisvKioKKyAqIFJldHVybiB0aGUgY3VycmVudCBpbmRfdGFibGUgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gYnAKKyAqIEBwYXJhbSBpbmRfdGFibGUgYnVmZmVyIHRvIGZpbGwgd2l0aCB0aGUgY3VycmVudCBpbmRpcmVjdGlvbgorICogICAgICAgICAgICAgICAgICB0YWJsZSBjb250ZW50LiBTaG91bGQgYmUgYXQgbGVhc3QKKyAqICAgICAgICAgICAgICAgICAgVF9FVEhfSU5ESVJFQ1RJT05fVEFCTEVfU0laRSBieXRlcyBsb25nLgorICovCit2b2lkIGJueDJ4X2dldF9yc3NfaW5kX3RhYmxlKHN0cnVjdCBibngyeF9yc3NfY29uZmlnX29iaiAqcnNzX29iaiwKKwkJCSAgICAgdTggKmluZF90YWJsZSk7CisKKyNlbmRpZiAvKiBCTlgyWF9TUF9WRVJCUyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MngvYm54Mnhfc3RhdHMuYyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X3N0YXRzLmMKaW5kZXggZTUzNWJmYS4uNzcxZjY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MngvYm54Mnhfc3RhdHMuYworKysgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9zdGF0cy5jCkBAIC0xNCwxMjEgKzE0LDEyIEBACiAgKiBTdGF0aXN0aWNzIGFuZCBMaW5rIG1hbmFnZW1lbnQgYnkgWWl0Y2hhayBHZXJ0bmVyCiAgKgogICovCi0jaW5jbHVkZSAiYm54MnhfY21uLmgiCiAjaW5jbHVkZSAiYm54Mnhfc3RhdHMuaCIKKyNpbmNsdWRlICJibngyeF9jbW4uaCIKKwogCiAvKiBTdGF0aXN0aWNzICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE1hY3JvcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogc3VtW2hpOmxvXSArPSBhZGRbaGk6bG9dICovCi0jZGVmaW5lIEFERF82NChzX2hpLCBhX2hpLCBzX2xvLCBhX2xvKSBcCi0JZG8geyBcCi0JCXNfbG8gKz0gYV9sbzsgXAotCQlzX2hpICs9IGFfaGkgKyAoKHNfbG8gPCBhX2xvKSA/IDEgOiAwKTsgXAotCX0gd2hpbGUgKDApCi0KLS8qIGRpZmZlcmVuY2UgPSBtaW51ZW5kIC0gc3VidHJhaGVuZCAqLwotI2RlZmluZSBESUZGXzY0KGRfaGksIG1faGksIHNfaGksIGRfbG8sIG1fbG8sIHNfbG8pIFwKLQlkbyB7IFwKLQkJaWYgKG1fbG8gPCBzX2xvKSB7IFwKLQkJCS8qIHVuZGVyZmxvdyAqLyBcCi0JCQlkX2hpID0gbV9oaSAtIHNfaGk7IFwKLQkJCWlmIChkX2hpID4gMCkgeyBcCi0JCQkJLyogd2UgY2FuICdsb2FuJyAxICovIFwKLQkJCQlkX2hpLS07IFwKLQkJCQlkX2xvID0gbV9sbyArIChVSU5UX01BWCAtIHNfbG8pICsgMTsgXAotCQkJfSBlbHNlIHsgXAotCQkJCS8qIG1faGkgPD0gc19oaSAqLyBcCi0JCQkJZF9oaSA9IDA7IFwKLQkJCQlkX2xvID0gMDsgXAotCQkJfSBcCi0JCX0gZWxzZSB7IFwKLQkJCS8qIG1fbG8gPj0gc19sbyAqLyBcCi0JCQlpZiAobV9oaSA8IHNfaGkpIHsgXAotCQkJCWRfaGkgPSAwOyBcCi0JCQkJZF9sbyA9IDA7IFwKLQkJCX0gZWxzZSB7IFwKLQkJCQkvKiBtX2hpID49IHNfaGkgKi8gXAotCQkJCWRfaGkgPSBtX2hpIC0gc19oaTsgXAotCQkJCWRfbG8gPSBtX2xvIC0gc19sbzsgXAotCQkJfSBcCi0JCX0gXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVVBEQVRFX1NUQVQ2NChzLCB0KSBcCi0JZG8geyBcCi0JCURJRkZfNjQoZGlmZi5oaSwgbmV3LT5zIyNfaGksIHBzdGF0cy0+bWFjX3N0eFswXS50IyNfaGksIFwKLQkJCWRpZmYubG8sIG5ldy0+cyMjX2xvLCBwc3RhdHMtPm1hY19zdHhbMF0udCMjX2xvKTsgXAotCQlwc3RhdHMtPm1hY19zdHhbMF0udCMjX2hpID0gbmV3LT5zIyNfaGk7IFwKLQkJcHN0YXRzLT5tYWNfc3R4WzBdLnQjI19sbyA9IG5ldy0+cyMjX2xvOyBcCi0JCUFERF82NChwc3RhdHMtPm1hY19zdHhbMV0udCMjX2hpLCBkaWZmLmhpLCBcCi0JCSAgICAgICBwc3RhdHMtPm1hY19zdHhbMV0udCMjX2xvLCBkaWZmLmxvKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVVBEQVRFX1NUQVQ2NF9OSUcocywgdCkgXAotCWRvIHsgXAotCQlESUZGXzY0KGRpZmYuaGksIG5ldy0+cyMjX2hpLCBvbGQtPnMjI19oaSwgXAotCQkJZGlmZi5sbywgbmV3LT5zIyNfbG8sIG9sZC0+cyMjX2xvKTsgXAotCQlBRERfNjQoZXN0YXRzLT50IyNfaGksIGRpZmYuaGksIFwKLQkJICAgICAgIGVzdGF0cy0+dCMjX2xvLCBkaWZmLmxvKTsgXAotCX0gd2hpbGUgKDApCi0KLS8qIHN1bVtoaTpsb10gKz0gYWRkICovCi0jZGVmaW5lIEFERF9FWFRFTkRfNjQoc19oaSwgc19sbywgYSkgXAotCWRvIHsgXAotCQlzX2xvICs9IGE7IFwKLQkJc19oaSArPSAoc19sbyA8IGEpID8gMSA6IDA7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVQREFURV9FWFRFTkRfU1RBVChzKSBcCi0JZG8geyBcCi0JCUFERF9FWFRFTkRfNjQocHN0YXRzLT5tYWNfc3R4WzFdLnMjI19oaSwgXAotCQkJICAgICAgcHN0YXRzLT5tYWNfc3R4WzFdLnMjI19sbywgXAotCQkJICAgICAgbmV3LT5zKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVVBEQVRFX0VYVEVORF9UU1RBVChzLCB0KSBcCi0JZG8geyBcCi0JCWRpZmYgPSBsZTMyX3RvX2NwdSh0Y2xpZW50LT5zKSAtIGxlMzJfdG9fY3B1KG9sZF90Y2xpZW50LT5zKTsgXAotCQlvbGRfdGNsaWVudC0+cyA9IHRjbGllbnQtPnM7IFwKLQkJQUREX0VYVEVORF82NChxc3RhdHMtPnQjI19oaSwgcXN0YXRzLT50IyNfbG8sIGRpZmYpOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBVUERBVEVfRVhURU5EX1VTVEFUKHMsIHQpIFwKLQlkbyB7IFwKLQkJZGlmZiA9IGxlMzJfdG9fY3B1KHVjbGllbnQtPnMpIC0gbGUzMl90b19jcHUob2xkX3VjbGllbnQtPnMpOyBcCi0JCW9sZF91Y2xpZW50LT5zID0gdWNsaWVudC0+czsgXAotCQlBRERfRVhURU5EXzY0KHFzdGF0cy0+dCMjX2hpLCBxc3RhdHMtPnQjI19sbywgZGlmZik7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVQREFURV9FWFRFTkRfWFNUQVQocywgdCkgXAotCWRvIHsgXAotCQlkaWZmID0gbGUzMl90b19jcHUoeGNsaWVudC0+cykgLSBsZTMyX3RvX2NwdShvbGRfeGNsaWVudC0+cyk7IFwKLQkJb2xkX3hjbGllbnQtPnMgPSB4Y2xpZW50LT5zOyBcCi0JCUFERF9FWFRFTkRfNjQocXN0YXRzLT50IyNfaGksIHFzdGF0cy0+dCMjX2xvLCBkaWZmKTsgXAotCX0gd2hpbGUgKDApCi0KLS8qIG1pbnVlbmQgLT0gc3VidHJhaGVuZCAqLwotI2RlZmluZSBTVUJfNjQobV9oaSwgc19oaSwgbV9sbywgc19sbykgXAotCWRvIHsgXAotCQlESUZGXzY0KG1faGksIG1faGksIHNfaGksIG1fbG8sIG1fbG8sIHNfbG8pOyBcCi0JfSB3aGlsZSAoMCkKLQotLyogbWludWVuZFtoaTpsb10gLT0gc3VidHJhaGVuZCAqLwotI2RlZmluZSBTVUJfRVhURU5EXzY0KG1faGksIG1fbG8sIHMpIFwKLQlkbyB7IFwKLQkJU1VCXzY0KG1faGksIDAsIG1fbG8sIHMpOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTVUJfRVhURU5EX1VTVEFUKHMsIHQpIFwKLQlkbyB7IFwKLQkJZGlmZiA9IGxlMzJfdG9fY3B1KHVjbGllbnQtPnMpIC0gbGUzMl90b19jcHUob2xkX3VjbGllbnQtPnMpOyBcCi0JCVNVQl9FWFRFTkRfNjQocXN0YXRzLT50IyNfaGksIHFzdGF0cy0+dCMjX2xvLCBkaWZmKTsgXAotCX0gd2hpbGUgKDApCi0KIC8qCiAgKiBHZW5lcmFsIHNlcnZpY2UgZnVuY3Rpb25zCiAgKi8KQEAgLTE0OSwxMiArNDAsMTYgQEAKICAqIEluaXQgc2VydmljZSBmdW5jdGlvbnMKICAqLwogCi0KKy8qIFBvc3QgdGhlIG5leHQgc3RhdGlzdGljcyByYW1yb2QuIFByb3RlY3QgaXQgd2l0aCB0aGUgc3BpbiBpbgorICogb3JkZXIgdG8gZW5zdXJlIHRoZSBzdHJpY3Qgb3JkZXIgYmV0d2VlbiBzdGF0aXN0aWNzIHJhbXJvZHMKKyAqIChlYWNoIHJhbXJvZCBoYXMgYSBzZXF1ZW5jZSBudW1iZXIgcGFzc2VkIGluIGEKKyAqIGJwLT5md19zdGF0c19yZXEtPmhkci5kcnZfc3RhdHNfY291bnRlciBhbmQgcmFtcm9kcyBtdXN0IGJlCisgKiBzZW50IGluIG9yZGVyKS4KKyAqLwogc3RhdGljIHZvaWQgYm54Mnhfc3Rvcm1fc3RhdHNfcG9zdChzdHJ1Y3QgYm54MnggKmJwKQogewogCWlmICghYnAtPnN0YXRzX3BlbmRpbmcpIHsKLQkJc3RydWN0IGNvbW1vbl9xdWVyeV9yYW1yb2RfZGF0YSByYW1yb2RfZGF0YSA9IHswfTsKLQkJaW50IGksIHJjOworCQlpbnQgcmM7CiAKIAkJc3Bpbl9sb2NrX2JoKCZicC0+c3RhdHNfbG9jayk7CiAKQEAgLTE2MywxNCArNTgsMTkgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCXJhbXJvZF9kYXRhLmRydl9jb3VudGVyID0gYnAtPnN0YXRzX2NvdW50ZXIrKzsKLQkJcmFtcm9kX2RhdGEuY29sbGVjdF9wb3J0ID0gYnAtPnBvcnQucG1mID8gMSA6IDA7Ci0JCWZvcl9lYWNoX2V0aF9xdWV1ZShicCwgaSkKLQkJCXJhbXJvZF9kYXRhLmN0cl9pZF92ZWN0b3IgfD0gKDEgPDwgYnAtPmZwW2ldLmNsX2lkKTsKKwkJYnAtPmZ3X3N0YXRzX3JlcS0+aGRyLmRydl9zdGF0c19jb3VudGVyID0KKwkJCWNwdV90b19sZTE2KGJwLT5zdGF0c19jb3VudGVyKyspOwogCisJCURQKE5FVElGX01TR19USU1FUiwgIlNlbmRpbmcgc3RhdGlzdGljcyByYW1yb2QgJWRcbiIsCisJCQlicC0+Zndfc3RhdHNfcmVxLT5oZHIuZHJ2X3N0YXRzX2NvdW50ZXIpOworCisKKworCQkvKiBzZW5kIEZXIHN0YXRzIHJhbXJvZCAqLwogCQlyYyA9IGJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfQ09NTU9OX1NUQVRfUVVFUlksIDAsCi0JCQkJICAgKCh1MzIgKikmcmFtcm9kX2RhdGEpWzFdLAotCQkJCSAgICgodTMyICopJnJhbXJvZF9kYXRhKVswXSwgMSk7CisJCQkJICAgVTY0X0hJKGJwLT5md19zdGF0c19yZXFfbWFwcGluZyksCisJCQkJICAgVTY0X0xPKGJwLT5md19zdGF0c19yZXFfbWFwcGluZyksCisJCQkJICAgTk9ORV9DT05ORUNUSU9OX1RZUEUpOwogCQlpZiAocmMgPT0gMCkKIAkJCWJwLT5zdGF0c19wZW5kaW5nID0gMTsKIApAQCAtMjMwLDcgKzEzMCw3IEBACiAJCQlicmVhazsKIAkJfQogCQljbnQtLTsKLQkJbXNsZWVwKDEpOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCk7CiAJfQogCXJldHVybiAxOwogfQpAQCAtMzM4LDY5ICsyMzgsOCBAQAogCW9wY29kZSA9IGJueDJ4X2RtYWVfb3Bjb2RlKGJwLCBETUFFX1NSQ19HUkMsIERNQUVfRFNUX1BDSSwKIAkJCQkgICB0cnVlLCBETUFFX0NPTVBfR1JDKTsKIAotCWlmIChicC0+bGlua192YXJzLm1hY190eXBlID09IE1BQ19UWVBFX0JNQUMpIHsKLQotCQltYWNfYWRkciA9IChwb3J0ID8gTklHX1JFR19JTkdSRVNTX0JNQUMxX01FTSA6Ci0JCQkJICAgTklHX1JFR19JTkdSRVNTX0JNQUMwX01FTSk7Ci0KLQkJLyogQklHTUFDX1JFR0lTVEVSX1RYX1NUQVRfR1RQS1QgLi4KLQkJICAgQklHTUFDX1JFR0lTVEVSX1RYX1NUQVRfR1RCWVQgKi8KLQkJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOwotCQlkbWFlLT5vcGNvZGUgPSBvcGNvZGU7Ci0JCWlmIChDSElQX0lTX0UxeChicCkpIHsKLQkJCWRtYWUtPnNyY19hZGRyX2xvID0gKG1hY19hZGRyICsKLQkJCQkgICAgIEJJR01BQ19SRUdJU1RFUl9UWF9TVEFUX0dUUEtUKSA+PiAyOwotCQkJZG1hZS0+bGVuID0gKDggKyBCSUdNQUNfUkVHSVNURVJfVFhfU1RBVF9HVEJZVCAtCi0JCQkJICAgICBCSUdNQUNfUkVHSVNURVJfVFhfU1RBVF9HVFBLVCkgPj4gMjsKLQkJfSBlbHNlIHsKLQkJCWRtYWUtPnNyY19hZGRyX2xvID0gKG1hY19hZGRyICsKLQkJCQkgICAgIEJJR01BQzJfUkVHSVNURVJfVFhfU1RBVF9HVFBPSykgPj4gMjsKLQkJCWRtYWUtPmxlbiA9ICg4ICsgQklHTUFDMl9SRUdJU1RFUl9UWF9TVEFUX0dUQllUIC0KLQkJCQkgICAgIEJJR01BQzJfUkVHSVNURVJfVFhfU1RBVF9HVFBPSykgPj4gMjsKLQkJfQotCi0JCWRtYWUtPnNyY19hZGRyX2hpID0gMDsKLQkJZG1hZS0+ZHN0X2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX3N0YXRzKSk7Ci0JCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykpOwotCQlkbWFlLT5jb21wX2FkZHJfbG8gPSBkbWFlX3JlZ19nb19jW2xvYWRlcl9pZHhdID4+IDI7Ci0JCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7Ci0JCWRtYWUtPmNvbXBfdmFsID0gMTsKLQotCQkvKiBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9HUjY0IC4uCi0JCSAgIEJJR01BQ19SRUdJU1RFUl9SWF9TVEFUX0dSSVBKICovCi0JCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKLQkJZG1hZS0+b3Bjb2RlID0gb3Bjb2RlOwotCQlkbWFlLT5zcmNfYWRkcl9oaSA9IDA7Ci0JCWlmIChDSElQX0lTX0UxeChicCkpIHsKLQkJCWRtYWUtPnNyY19hZGRyX2xvID0gKG1hY19hZGRyICsKLQkJCQkJICAgICBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9HUjY0KSA+PiAyOwotCQkJZG1hZS0+ZHN0X2FkZHJfbG8gPQotCQkJCVU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpICsKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgYm1hYzFfc3RhdHMsIHJ4X3N0YXRfZ3I2NF9sbykpOwotCQkJZG1hZS0+ZHN0X2FkZHJfaGkgPQotCQkJCVU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpICsKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgYm1hYzFfc3RhdHMsIHJ4X3N0YXRfZ3I2NF9sbykpOwotCQkJZG1hZS0+bGVuID0gKDggKyBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9HUklQSiAtCi0JCQkJICAgICBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9HUjY0KSA+PiAyOwotCQl9IGVsc2UgewotCQkJZG1hZS0+c3JjX2FkZHJfbG8gPQotCQkJCShtYWNfYWRkciArIEJJR01BQzJfUkVHSVNURVJfUlhfU1RBVF9HUjY0KSA+PiAyOwotCQkJZG1hZS0+ZHN0X2FkZHJfbG8gPQotCQkJCVU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpICsKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgYm1hYzJfc3RhdHMsIHJ4X3N0YXRfZ3I2NF9sbykpOwotCQkJZG1hZS0+ZHN0X2FkZHJfaGkgPQotCQkJCVU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpICsKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgYm1hYzJfc3RhdHMsIHJ4X3N0YXRfZ3I2NF9sbykpOwotCQkJZG1hZS0+bGVuID0gKDggKyBCSUdNQUMyX1JFR0lTVEVSX1JYX1NUQVRfR1JJUEogLQotCQkJCSAgICAgQklHTUFDMl9SRUdJU1RFUl9SWF9TVEFUX0dSNjQpID4+IDI7Ci0JCX0KLQotCQlkbWFlLT5jb21wX2FkZHJfbG8gPSBkbWFlX3JlZ19nb19jW2xvYWRlcl9pZHhdID4+IDI7Ci0JCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7Ci0JCWRtYWUtPmNvbXBfdmFsID0gMTsKLQotCX0gZWxzZSBpZiAoYnAtPmxpbmtfdmFycy5tYWNfdHlwZSA9PSBNQUNfVFlQRV9FTUFDKSB7Ci0KKwkvKiBFTUFDIGlzIHNwZWNpYWwgKi8KKwlpZiAoYnAtPmxpbmtfdmFycy5tYWNfdHlwZSA9PSBNQUNfVFlQRV9FTUFDKSB7CiAJCW1hY19hZGRyID0gKHBvcnQgPyBHUkNCQVNFX0VNQUMxIDogR1JDQkFTRV9FTUFDMCk7CiAKIAkJLyogRU1BQ19SRUdfRU1BQ19SWF9TVEFUX0FDIChFTUFDX1JFR19FTUFDX1JYX1NUQVRfQUNfQ09VTlQpKi8KQEAgLTQ0NSw0NiArMjg0LDEyMiBAQAogCQlkbWFlLT5jb21wX2FkZHJfbG8gPSBkbWFlX3JlZ19nb19jW2xvYWRlcl9pZHhdID4+IDI7CiAJCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7CiAJCWRtYWUtPmNvbXBfdmFsID0gMTsKKwl9IGVsc2UgeworCQl1MzIgdHhfc3JjX2FkZHJfbG8sIHJ4X3NyY19hZGRyX2xvOworCQl1MTYgcnhfbGVuLCB0eF9sZW47CisKKwkJLyogY29uZmlndXJlIHRoZSBwYXJhbXMgYWNjb3JkaW5nIHRvIE1BQyB0eXBlICovCisJCXN3aXRjaCAoYnAtPmxpbmtfdmFycy5tYWNfdHlwZSkgeworCQljYXNlIE1BQ19UWVBFX0JNQUM6CisJCQltYWNfYWRkciA9IChwb3J0ID8gTklHX1JFR19JTkdSRVNTX0JNQUMxX01FTSA6CisJCQkJCSAgIE5JR19SRUdfSU5HUkVTU19CTUFDMF9NRU0pOworCisJCQkvKiBCSUdNQUNfUkVHSVNURVJfVFhfU1RBVF9HVFBLVCAuLgorCQkJICAgQklHTUFDX1JFR0lTVEVSX1RYX1NUQVRfR1RCWVQgKi8KKwkJCWlmIChDSElQX0lTX0UxeChicCkpIHsKKwkJCQl0eF9zcmNfYWRkcl9sbyA9IChtYWNfYWRkciArCisJCQkJCUJJR01BQ19SRUdJU1RFUl9UWF9TVEFUX0dUUEtUKSA+PiAyOworCQkJCXR4X2xlbiA9ICg4ICsgQklHTUFDX1JFR0lTVEVSX1RYX1NUQVRfR1RCWVQgLQorCQkJCQkgIEJJR01BQ19SRUdJU1RFUl9UWF9TVEFUX0dUUEtUKSA+PiAyOworCQkJCXJ4X3NyY19hZGRyX2xvID0gKG1hY19hZGRyICsKKwkJCQkJQklHTUFDX1JFR0lTVEVSX1JYX1NUQVRfR1I2NCkgPj4gMjsKKwkJCQlyeF9sZW4gPSAoOCArIEJJR01BQ19SRUdJU1RFUl9SWF9TVEFUX0dSSVBKIC0KKwkJCQkJICBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9HUjY0KSA+PiAyOworCQkJfSBlbHNlIHsKKwkJCQl0eF9zcmNfYWRkcl9sbyA9IChtYWNfYWRkciArCisJCQkJCUJJR01BQzJfUkVHSVNURVJfVFhfU1RBVF9HVFBPSykgPj4gMjsKKwkJCQl0eF9sZW4gPSAoOCArIEJJR01BQzJfUkVHSVNURVJfVFhfU1RBVF9HVEJZVCAtCisJCQkJCSAgQklHTUFDMl9SRUdJU1RFUl9UWF9TVEFUX0dUUE9LKSA+PiAyOworCQkJCXJ4X3NyY19hZGRyX2xvID0gKG1hY19hZGRyICsKKwkJCQkJQklHTUFDMl9SRUdJU1RFUl9SWF9TVEFUX0dSNjQpID4+IDI7CisJCQkJcnhfbGVuID0gKDggKyBCSUdNQUMyX1JFR0lTVEVSX1JYX1NUQVRfR1JJUEogLQorCQkJCQkgIEJJR01BQzJfUkVHSVNURVJfUlhfU1RBVF9HUjY0KSA+PiAyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNQUNfVFlQRV9VTUFDOiAvKiBoYW5kbGVkIGJ5IE1TVEFUICovCisJCWNhc2UgTUFDX1RZUEVfWE1BQzogLyogaGFuZGxlZCBieSBNU1RBVCAqLworCQlkZWZhdWx0OgorCQkJbWFjX2FkZHIgPSBwb3J0ID8gR1JDQkFTRV9NU1RBVDEgOiBHUkNCQVNFX01TVEFUMDsKKwkJCXR4X3NyY19hZGRyX2xvID0gKG1hY19hZGRyICsKKwkJCQkJICBNU1RBVF9SRUdfVFhfU1RBVF9HVFhQT0tfTE8pID4+IDI7CisJCQlyeF9zcmNfYWRkcl9sbyA9IChtYWNfYWRkciArCisJCQkJCSAgTVNUQVRfUkVHX1JYX1NUQVRfR1I2NF9MTykgPj4gMjsKKwkJCXR4X2xlbiA9IHNpemVvZihicC0+c2xvd3BhdGgtPgorCQkJCQltYWNfc3RhdHMubXN0YXRfc3RhdHMuc3RhdHNfdHgpID4+IDI7CisJCQlyeF9sZW4gPSBzaXplb2YoYnAtPnNsb3dwYXRoLT4KKwkJCQkJbWFjX3N0YXRzLm1zdGF0X3N0YXRzLnN0YXRzX3J4KSA+PiAyOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBUWCBzdGF0cyAqLworCQlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7CisJCWRtYWUtPm9wY29kZSA9IG9wY29kZTsKKwkJZG1hZS0+c3JjX2FkZHJfbG8gPSB0eF9zcmNfYWRkcl9sbzsKKwkJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOworCQlkbWFlLT5sZW4gPSB0eF9sZW47CisJCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykpOworCQlkbWFlLT5kc3RfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpKTsKKwkJZG1hZS0+Y29tcF9hZGRyX2xvID0gZG1hZV9yZWdfZ29fY1tsb2FkZXJfaWR4XSA+PiAyOworCQlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOworCQlkbWFlLT5jb21wX3ZhbCA9IDE7CisKKwkJLyogUlggc3RhdHMgKi8KKwkJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOworCQlkbWFlLT5vcGNvZGUgPSBvcGNvZGU7CisJCWRtYWUtPnNyY19hZGRyX2hpID0gMDsKKwkJZG1hZS0+c3JjX2FkZHJfbG8gPSByeF9zcmNfYWRkcl9sbzsKKwkJZG1hZS0+ZHN0X2FkZHJfbG8gPQorCQkJVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykgKyAodHhfbGVuIDw8IDIpKTsKKwkJZG1hZS0+ZHN0X2FkZHJfaGkgPQorCQkJVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykgKyAodHhfbGVuIDw8IDIpKTsKKwkJZG1hZS0+bGVuID0gcnhfbGVuOworCQlkbWFlLT5jb21wX2FkZHJfbG8gPSBkbWFlX3JlZ19nb19jW2xvYWRlcl9pZHhdID4+IDI7CisJCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7CisJCWRtYWUtPmNvbXBfdmFsID0gMTsKIAl9CiAKIAkvKiBOSUcgKi8KKwlpZiAoIUNISVBfSVNfRTMoYnApKSB7CisJCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKKwkJZG1hZS0+b3Bjb2RlID0gb3Bjb2RlOworCQlkbWFlLT5zcmNfYWRkcl9sbyA9IChwb3J0ID8gTklHX1JFR19TVEFUMV9FR1JFU1NfTUFDX1BLVDAgOgorCQkJCQkgICAgTklHX1JFR19TVEFUMF9FR1JFU1NfTUFDX1BLVDApID4+IDI7CisJCWRtYWUtPnNyY19hZGRyX2hpID0gMDsKKwkJZG1hZS0+ZHN0X2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbmlnX3N0YXRzKSArCisJCQkJb2Zmc2V0b2Yoc3RydWN0IG5pZ19zdGF0cywgZWdyZXNzX21hY19wa3QwX2xvKSk7CisJCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG5pZ19zdGF0cykgKworCQkJCW9mZnNldG9mKHN0cnVjdCBuaWdfc3RhdHMsIGVncmVzc19tYWNfcGt0MF9sbykpOworCQlkbWFlLT5sZW4gPSAoMipzaXplb2YodTMyKSkgPj4gMjsKKwkJZG1hZS0+Y29tcF9hZGRyX2xvID0gZG1hZV9yZWdfZ29fY1tsb2FkZXJfaWR4XSA+PiAyOworCQlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOworCQlkbWFlLT5jb21wX3ZhbCA9IDE7CisKKwkJZG1hZSA9IGJueDJ4X3NwKGJwLCBkbWFlW2JwLT5leGVjdXRlcl9pZHgrK10pOworCQlkbWFlLT5vcGNvZGUgPSBvcGNvZGU7CisJCWRtYWUtPnNyY19hZGRyX2xvID0gKHBvcnQgPyBOSUdfUkVHX1NUQVQxX0VHUkVTU19NQUNfUEtUMSA6CisJCQkJCSAgICBOSUdfUkVHX1NUQVQwX0VHUkVTU19NQUNfUEtUMSkgPj4gMjsKKwkJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOworCQlkbWFlLT5kc3RfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBuaWdfc3RhdHMpICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3QgbmlnX3N0YXRzLCBlZ3Jlc3NfbWFjX3BrdDFfbG8pKTsKKwkJZG1hZS0+ZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbmlnX3N0YXRzKSArCisJCQkJb2Zmc2V0b2Yoc3RydWN0IG5pZ19zdGF0cywgZWdyZXNzX21hY19wa3QxX2xvKSk7CisJCWRtYWUtPmxlbiA9ICgyKnNpemVvZih1MzIpKSA+PiAyOworCQlkbWFlLT5jb21wX2FkZHJfbG8gPSBkbWFlX3JlZ19nb19jW2xvYWRlcl9pZHhdID4+IDI7CisJCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7CisJCWRtYWUtPmNvbXBfdmFsID0gMTsKKwl9CisKIAlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7Ci0JZG1hZS0+b3Bjb2RlID0gb3Bjb2RlOworCWRtYWUtPm9wY29kZSA9IGJueDJ4X2RtYWVfb3Bjb2RlKGJwLCBETUFFX1NSQ19HUkMsIERNQUVfRFNUX1BDSSwKKwkJCQkJCSB0cnVlLCBETUFFX0NPTVBfUENJKTsKIAlkbWFlLT5zcmNfYWRkcl9sbyA9IChwb3J0ID8gTklHX1JFR19TVEFUMV9CUkJfRElTQ0FSRCA6CiAJCQkJICAgIE5JR19SRUdfU1RBVDBfQlJCX0RJU0NBUkQpID4+IDI7CiAJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOwogCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG5pZ19zdGF0cykpOwogCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG5pZ19zdGF0cykpOwogCWRtYWUtPmxlbiA9IChzaXplb2Yoc3RydWN0IG5pZ19zdGF0cykgLSA0KnNpemVvZih1MzIpKSA+PiAyOwotCWRtYWUtPmNvbXBfYWRkcl9sbyA9IGRtYWVfcmVnX2dvX2NbbG9hZGVyX2lkeF0gPj4gMjsKLQlkbWFlLT5jb21wX2FkZHJfaGkgPSAwOwotCWRtYWUtPmNvbXBfdmFsID0gMTsKIAotCWRtYWUgPSBibngyeF9zcChicCwgZG1hZVticC0+ZXhlY3V0ZXJfaWR4KytdKTsKLQlkbWFlLT5vcGNvZGUgPSBvcGNvZGU7Ci0JZG1hZS0+c3JjX2FkZHJfbG8gPSAocG9ydCA/IE5JR19SRUdfU1RBVDFfRUdSRVNTX01BQ19QS1QwIDoKLQkJCQkgICAgTklHX1JFR19TVEFUMF9FR1JFU1NfTUFDX1BLVDApID4+IDI7Ci0JZG1hZS0+c3JjX2FkZHJfaGkgPSAwOwotCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG5pZ19zdGF0cykgKwotCQkJb2Zmc2V0b2Yoc3RydWN0IG5pZ19zdGF0cywgZWdyZXNzX21hY19wa3QwX2xvKSk7Ci0JZG1hZS0+ZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbmlnX3N0YXRzKSArCi0JCQlvZmZzZXRvZihzdHJ1Y3QgbmlnX3N0YXRzLCBlZ3Jlc3NfbWFjX3BrdDBfbG8pKTsKLQlkbWFlLT5sZW4gPSAoMipzaXplb2YodTMyKSkgPj4gMjsKLQlkbWFlLT5jb21wX2FkZHJfbG8gPSBkbWFlX3JlZ19nb19jW2xvYWRlcl9pZHhdID4+IDI7Ci0JZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKLQlkbWFlLT5jb21wX3ZhbCA9IDE7Ci0KLQlkbWFlID0gYm54Mnhfc3AoYnAsIGRtYWVbYnAtPmV4ZWN1dGVyX2lkeCsrXSk7Ci0JZG1hZS0+b3Bjb2RlID0gYm54MnhfZG1hZV9vcGNvZGUoYnAsIERNQUVfU1JDX0dSQywgRE1BRV9EU1RfUENJLAotCQkJCQkgdHJ1ZSwgRE1BRV9DT01QX1BDSSk7Ci0JZG1hZS0+c3JjX2FkZHJfbG8gPSAocG9ydCA/IE5JR19SRUdfU1RBVDFfRUdSRVNTX01BQ19QS1QxIDoKLQkJCQkgICAgTklHX1JFR19TVEFUMF9FR1JFU1NfTUFDX1BLVDEpID4+IDI7Ci0JZG1hZS0+c3JjX2FkZHJfaGkgPSAwOwotCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG5pZ19zdGF0cykgKwotCQkJb2Zmc2V0b2Yoc3RydWN0IG5pZ19zdGF0cywgZWdyZXNzX21hY19wa3QxX2xvKSk7Ci0JZG1hZS0+ZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbmlnX3N0YXRzKSArCi0JCQlvZmZzZXRvZihzdHJ1Y3QgbmlnX3N0YXRzLCBlZ3Jlc3NfbWFjX3BrdDFfbG8pKTsKLQlkbWFlLT5sZW4gPSAoMipzaXplb2YodTMyKSkgPj4gMjsKIAlkbWFlLT5jb21wX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgc3RhdHNfY29tcCkpOwogCWRtYWUtPmNvbXBfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7CiAJZG1hZS0+Y29tcF92YWwgPSBETUFFX0NPTVBfVkFMOwpAQCAtNTY2LDcgKzQ4MSw4IEBACiAJCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncmpiciwgcnhfc3RhdF9ldGhlcnN0YXRzamFiYmVycyk7CiAJCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncnhjZiwgcnhfc3RhdF9tYWNjb250cm9sZnJhbWVzcmVjZWl2ZWQpOwogCQlVUERBVEVfU1RBVDY0KHJ4X3N0YXRfZ3J4cGYsIHJ4X3N0YXRfeG9mZnN0YXRlZW50ZXJlZCk7Ci0JCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncnhwZiwgcnhfc3RhdF9ibWFjX3hwZik7CisJCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncnhwZiwgcnhfc3RhdF9tYWNfeHBmKTsKKwogCQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3R4cGYsIHR4X3N0YXRfb3V0eG9mZnNlbnQpOwogCQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3R4cGYsIHR4X3N0YXRfZmxvd2NvbnRyb2xkb25lKTsKIAkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0NjQsIHR4X3N0YXRfZXRoZXJzdGF0c3BrdHM2NG9jdGV0cyk7CkBAIC01ODAsMTMgKzQ5NiwxMyBAQAogCQkJCXR4X3N0YXRfZXRoZXJzdGF0c3BrdHM1MTJvY3RldHN0bzEwMjNvY3RldHMpOwogCQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3QxNTE4LAogCQkJCXR4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMDI0b2N0ZXRzdG8xNTIyb2N0ZXRzKTsKLQkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0MjA0NywgdHhfc3RhdF9ibWFjXzIwNDcpOwotCQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3Q0MDk1LCB0eF9zdGF0X2JtYWNfNDA5NSk7Ci0JCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDkyMTYsIHR4X3N0YXRfYm1hY185MjE2KTsKLQkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0MTYzODMsIHR4X3N0YXRfYm1hY18xNjM4Myk7CisJCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDIwNDcsIHR4X3N0YXRfbWFjXzIwNDcpOworCQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3Q0MDk1LCB0eF9zdGF0X21hY180MDk1KTsKKwkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0OTIxNiwgdHhfc3RhdF9tYWNfOTIxNik7CisJCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDE2MzgzLCB0eF9zdGF0X21hY18xNjM4Myk7CiAJCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndGVyciwKIAkJCQl0eF9zdGF0X2RvdDNzdGF0c2ludGVybmFsbWFjdHJhbnNtaXRlcnJvcnMpOwotCQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3R1ZmwsIHR4X3N0YXRfYm1hY191ZmwpOworCQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3R1ZmwsIHR4X3N0YXRfbWFjX3VmbCk7CiAKIAl9IGVsc2UgewogCQlzdHJ1Y3QgYm1hYzJfc3RhdHMgKm5ldyA9IGJueDJ4X3NwKGJwLCBtYWNfc3RhdHMuYm1hYzJfc3RhdHMpOwpAQCAtNjAwLDcgKzUxNiw3IEBACiAJCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncmpiciwgcnhfc3RhdF9ldGhlcnN0YXRzamFiYmVycyk7CiAJCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncnhjZiwgcnhfc3RhdF9tYWNjb250cm9sZnJhbWVzcmVjZWl2ZWQpOwogCQlVUERBVEVfU1RBVDY0KHJ4X3N0YXRfZ3J4cGYsIHJ4X3N0YXRfeG9mZnN0YXRlZW50ZXJlZCk7Ci0JCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncnhwZiwgcnhfc3RhdF9ibWFjX3hwZik7CisJCVVQREFURV9TVEFUNjQocnhfc3RhdF9ncnhwZiwgcnhfc3RhdF9tYWNfeHBmKTsKIAkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0eHBmLCB0eF9zdGF0X291dHhvZmZzZW50KTsKIAkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0eHBmLCB0eF9zdGF0X2Zsb3djb250cm9sZG9uZSk7CiAJCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDY0LCB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNjRvY3RldHMpOwpAQCAtNjE0LDE5ICs1MzAsOTYgQEAKIAkJCQl0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNTEyb2N0ZXRzdG8xMDIzb2N0ZXRzKTsKIAkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0MTUxOCwKIAkJCQl0eF9zdGF0X2V0aGVyc3RhdHNwa3RzMTAyNG9jdGV0c3RvMTUyMm9jdGV0cyk7Ci0JCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDIwNDcsIHR4X3N0YXRfYm1hY18yMDQ3KTsKLQkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0NDA5NSwgdHhfc3RhdF9ibWFjXzQwOTUpOwotCQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3Q5MjE2LCB0eF9zdGF0X2JtYWNfOTIxNik7Ci0JCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDE2MzgzLCB0eF9zdGF0X2JtYWNfMTYzODMpOworCQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3QyMDQ3LCB0eF9zdGF0X21hY18yMDQ3KTsKKwkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0NDA5NSwgdHhfc3RhdF9tYWNfNDA5NSk7CisJCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndDkyMTYsIHR4X3N0YXRfbWFjXzkyMTYpOworCQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3QxNjM4MywgdHhfc3RhdF9tYWNfMTYzODMpOwogCQlVUERBVEVfU1RBVDY0KHR4X3N0YXRfZ3RlcnIsCiAJCQkJdHhfc3RhdF9kb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzKTsKLQkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0dWZsLCB0eF9zdGF0X2JtYWNfdWZsKTsKKwkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0dWZsLCB0eF9zdGF0X21hY191ZmwpOwogCX0KIAogCWVzdGF0cy0+cGF1c2VfZnJhbWVzX3JlY2VpdmVkX2hpID0KLQkJCQlwc3RhdHMtPm1hY19zdHhbMV0ucnhfc3RhdF9ibWFjX3hwZl9oaTsKKwkJCQlwc3RhdHMtPm1hY19zdHhbMV0ucnhfc3RhdF9tYWNfeHBmX2hpOwogCWVzdGF0cy0+cGF1c2VfZnJhbWVzX3JlY2VpdmVkX2xvID0KLQkJCQlwc3RhdHMtPm1hY19zdHhbMV0ucnhfc3RhdF9ibWFjX3hwZl9sbzsKKwkJCQlwc3RhdHMtPm1hY19zdHhbMV0ucnhfc3RhdF9tYWNfeHBmX2xvOworCisJZXN0YXRzLT5wYXVzZV9mcmFtZXNfc2VudF9oaSA9CisJCQkJcHN0YXRzLT5tYWNfc3R4WzFdLnR4X3N0YXRfb3V0eG9mZnNlbnRfaGk7CisJZXN0YXRzLT5wYXVzZV9mcmFtZXNfc2VudF9sbyA9CisJCQkJcHN0YXRzLT5tYWNfc3R4WzFdLnR4X3N0YXRfb3V0eG9mZnNlbnRfbG87Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X21zdGF0X3N0YXRzX3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBob3N0X3BvcnRfc3RhdHMgKnBzdGF0cyA9IGJueDJ4X3NwKGJwLCBwb3J0X3N0YXRzKTsKKwlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzICplc3RhdHMgPSAmYnAtPmV0aF9zdGF0czsKKworCXN0cnVjdCBtc3RhdF9zdGF0cyAqbmV3ID0gYm54Mnhfc3AoYnAsIG1hY19zdGF0cy5tc3RhdF9zdGF0cyk7CisKKwlBRERfU1RBVDY0KHN0YXRzX3J4LnJ4X2dyZXJiLCByeF9zdGF0X2lmaGNpbmJhZG9jdGV0cyk7CisJQUREX1NUQVQ2NChzdGF0c19yeC5yeF9ncmZjcywgcnhfc3RhdF9kb3Qzc3RhdHNmY3NlcnJvcnMpOworCUFERF9TVEFUNjQoc3RhdHNfcngucnhfZ3J1bmQsIHJ4X3N0YXRfZXRoZXJzdGF0c3VuZGVyc2l6ZXBrdHMpOworCUFERF9TVEFUNjQoc3RhdHNfcngucnhfZ3JvdnIsIHJ4X3N0YXRfZG90M3N0YXRzZnJhbWVzdG9vbG9uZyk7CisJQUREX1NUQVQ2NChzdGF0c19yeC5yeF9ncmZyZywgcnhfc3RhdF9ldGhlcnN0YXRzZnJhZ21lbnRzKTsKKwlBRERfU1RBVDY0KHN0YXRzX3J4LnJ4X2dyeGNmLCByeF9zdGF0X21hY2NvbnRyb2xmcmFtZXNyZWNlaXZlZCk7CisJQUREX1NUQVQ2NChzdGF0c19yeC5yeF9ncnhwZiwgcnhfc3RhdF94b2Zmc3RhdGVlbnRlcmVkKTsKKwlBRERfU1RBVDY0KHN0YXRzX3J4LnJ4X2dyeHBmLCByeF9zdGF0X21hY194cGYpOworCUFERF9TVEFUNjQoc3RhdHNfdHgudHhfZ3R4cGYsIHR4X3N0YXRfb3V0eG9mZnNlbnQpOworCUFERF9TVEFUNjQoc3RhdHNfdHgudHhfZ3R4cGYsIHR4X3N0YXRfZmxvd2NvbnRyb2xkb25lKTsKKworCisJQUREX1NUQVQ2NChzdGF0c190eC50eF9ndDY0LCB0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNjRvY3RldHMpOworCUFERF9TVEFUNjQoc3RhdHNfdHgudHhfZ3QxMjcsCisJCQl0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNjVvY3RldHN0bzEyN29jdGV0cyk7CisJQUREX1NUQVQ2NChzdGF0c190eC50eF9ndDI1NSwKKwkJCXR4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMjhvY3RldHN0bzI1NW9jdGV0cyk7CisJQUREX1NUQVQ2NChzdGF0c190eC50eF9ndDUxMSwKKwkJCXR4X3N0YXRfZXRoZXJzdGF0c3BrdHMyNTZvY3RldHN0bzUxMW9jdGV0cyk7CisJQUREX1NUQVQ2NChzdGF0c190eC50eF9ndDEwMjMsCisJCQl0eF9zdGF0X2V0aGVyc3RhdHNwa3RzNTEyb2N0ZXRzdG8xMDIzb2N0ZXRzKTsKKwlBRERfU1RBVDY0KHN0YXRzX3R4LnR4X2d0MTUxOCwKKwkJCXR4X3N0YXRfZXRoZXJzdGF0c3BrdHMxMDI0b2N0ZXRzdG8xNTIyb2N0ZXRzKTsKKwlBRERfU1RBVDY0KHN0YXRzX3R4LnR4X2d0MjA0NywgdHhfc3RhdF9tYWNfMjA0Nyk7CisKKwlBRERfU1RBVDY0KHN0YXRzX3R4LnR4X2d0NDA5NSwgdHhfc3RhdF9tYWNfNDA5NSk7CisJQUREX1NUQVQ2NChzdGF0c190eC50eF9ndDkyMTYsIHR4X3N0YXRfbWFjXzkyMTYpOworCUFERF9TVEFUNjQoc3RhdHNfdHgudHhfZ3QxNjM4MywgdHhfc3RhdF9tYWNfMTYzODMpOworCisJQUREX1NUQVQ2NChzdGF0c190eC50eF9ndGVyciwKKwkJCXR4X3N0YXRfZG90M3N0YXRzaW50ZXJuYWxtYWN0cmFuc21pdGVycm9ycyk7CisJQUREX1NUQVQ2NChzdGF0c190eC50eF9ndHVmbCwgdHhfc3RhdF9tYWNfdWZsKTsKKworCUFERF82NChlc3RhdHMtPmV0aGVyc3RhdHNwa3RzMTAyNG9jdGV0c3RvMTUyMm9jdGV0c19oaSwKKwkgICAgICAgbmV3LT5zdGF0c190eC50eF9ndDE1MThfaGksCisJICAgICAgIGVzdGF0cy0+ZXRoZXJzdGF0c3BrdHMxMDI0b2N0ZXRzdG8xNTIyb2N0ZXRzX2xvLAorCSAgICAgICBuZXctPnN0YXRzX3R4LnR4X2d0MTUxOF9sbyk7CisKKwlBRERfNjQoZXN0YXRzLT5ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzX2hpLAorCSAgICAgICBuZXctPnN0YXRzX3R4LnR4X2d0MjA0N19oaSwKKwkgICAgICAgZXN0YXRzLT5ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzX2xvLAorCSAgICAgICBuZXctPnN0YXRzX3R4LnR4X2d0MjA0N19sbyk7CisKKwlBRERfNjQoZXN0YXRzLT5ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzX2hpLAorCSAgICAgICBuZXctPnN0YXRzX3R4LnR4X2d0NDA5NV9oaSwKKwkgICAgICAgZXN0YXRzLT5ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzX2xvLAorCSAgICAgICBuZXctPnN0YXRzX3R4LnR4X2d0NDA5NV9sbyk7CisKKwlBRERfNjQoZXN0YXRzLT5ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzX2hpLAorCSAgICAgICBuZXctPnN0YXRzX3R4LnR4X2d0OTIxNl9oaSwKKwkgICAgICAgZXN0YXRzLT5ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzX2xvLAorCSAgICAgICBuZXctPnN0YXRzX3R4LnR4X2d0OTIxNl9sbyk7CisKKworCUFERF82NChlc3RhdHMtPmV0aGVyc3RhdHNwa3Rzb3ZlcjE1MjJvY3RldHNfaGksCisJICAgICAgIG5ldy0+c3RhdHNfdHgudHhfZ3QxNjM4M19oaSwKKwkgICAgICAgZXN0YXRzLT5ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzX2xvLAorCSAgICAgICBuZXctPnN0YXRzX3R4LnR4X2d0MTYzODNfbG8pOworCisJZXN0YXRzLT5wYXVzZV9mcmFtZXNfcmVjZWl2ZWRfaGkgPQorCQkJCXBzdGF0cy0+bWFjX3N0eFsxXS5yeF9zdGF0X21hY194cGZfaGk7CisJZXN0YXRzLT5wYXVzZV9mcmFtZXNfcmVjZWl2ZWRfbG8gPQorCQkJCXBzdGF0cy0+bWFjX3N0eFsxXS5yeF9zdGF0X21hY194cGZfbG87CiAKIAllc3RhdHMtPnBhdXNlX2ZyYW1lc19zZW50X2hpID0KIAkJCQlwc3RhdHMtPm1hY19zdHhbMV0udHhfc3RhdF9vdXR4b2Zmc2VudF9oaTsKQEAgLTcwMiwxNSArNjk1LDI2IEBACiAJCXUzMiBoaTsKIAl9IGRpZmY7CiAKLQlpZiAoYnAtPmxpbmtfdmFycy5tYWNfdHlwZSA9PSBNQUNfVFlQRV9CTUFDKQorCXN3aXRjaCAoYnAtPmxpbmtfdmFycy5tYWNfdHlwZSkgeworCWNhc2UgTUFDX1RZUEVfQk1BQzoKIAkJYm54MnhfYm1hY19zdGF0c191cGRhdGUoYnApOworCQlicmVhazsKIAotCWVsc2UgaWYgKGJwLT5saW5rX3ZhcnMubWFjX3R5cGUgPT0gTUFDX1RZUEVfRU1BQykKKwljYXNlIE1BQ19UWVBFX0VNQUM6CiAJCWJueDJ4X2VtYWNfc3RhdHNfdXBkYXRlKGJwKTsKKwkJYnJlYWs7CiAKLQllbHNlIHsgLyogdW5yZWFjaGVkICovCisJY2FzZSBNQUNfVFlQRV9VTUFDOgorCWNhc2UgTUFDX1RZUEVfWE1BQzoKKwkJYm54MnhfbXN0YXRfc3RhdHNfdXBkYXRlKGJwKTsKKwkJYnJlYWs7CisKKwljYXNlIE1BQ19UWVBFX05PTkU6IC8qIHVucmVhY2hlZCAqLwogCQlCTlgyWF9FUlIoInN0YXRzIHVwZGF0ZWQgYnkgRE1BRSBidXQgbm8gTUFDIGFjdGl2ZVxuIik7CiAJCXJldHVybiAtMTsKKworCWRlZmF1bHQ6IC8qIHVucmVhY2hlZCAqLworCQlCTlgyWF9FUlIoIlVua25vd24gTUFDIHR5cGVcbiIpOwogCX0KIAogCUFERF9FWFRFTkRfNjQocHN0YXRzLT5icmJfZHJvcF9oaSwgcHN0YXRzLT5icmJfZHJvcF9sbywKQEAgLTcxOCw5ICs3MjIsMTIgQEAKIAlBRERfRVhURU5EXzY0KGVzdGF0cy0+YnJiX3RydW5jYXRlX2hpLCBlc3RhdHMtPmJyYl90cnVuY2F0ZV9sbywKIAkJICAgICAgbmV3LT5icmJfdHJ1bmNhdGUgLSBvbGQtPmJyYl90cnVuY2F0ZSk7CiAKLQlVUERBVEVfU1RBVDY0X05JRyhlZ3Jlc3NfbWFjX3BrdDAsCisJaWYgKCFDSElQX0lTX0UzKGJwKSkgeworCQlVUERBVEVfU1RBVDY0X05JRyhlZ3Jlc3NfbWFjX3BrdDAsCiAJCQkJCWV0aGVyc3RhdHNwa3RzMTAyNG9jdGV0c3RvMTUyMm9jdGV0cyk7Ci0JVVBEQVRFX1NUQVQ2NF9OSUcoZWdyZXNzX21hY19wa3QxLCBldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzKTsKKwkJVVBEQVRFX1NUQVQ2NF9OSUcoZWdyZXNzX21hY19wa3QxLAorCQkJCQlldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0ZXRzKTsKKwl9CiAKIAltZW1jcHkob2xkLCBuZXcsIHNpemVvZihzdHJ1Y3QgbmlnX3N0YXRzKSk7CiAKQEAgLTc0NiwxMSArNzUzLDEzIEBACiAKIHN0YXRpYyBpbnQgYm54Mnhfc3Rvcm1fc3RhdHNfdXBkYXRlKHN0cnVjdCBibngyeCAqYnApCiB7Ci0Jc3RydWN0IGV0aF9zdGF0c19xdWVyeSAqc3RhdHMgPSBibngyeF9zcChicCwgZndfc3RhdHMpOwogCXN0cnVjdCB0c3Rvcm1fcGVyX3BvcnRfc3RhdHMgKnRwb3J0ID0KLQkJCQkJJnN0YXRzLT50c3Rvcm1fY29tbW9uLnBvcnRfc3RhdGlzdGljczsKKwkJCQkmYnAtPmZ3X3N0YXRzX2RhdGEtPnBvcnQudHN0b3JtX3BvcnRfc3RhdGlzdGljczsKKwlzdHJ1Y3QgdHN0b3JtX3Blcl9wZl9zdGF0cyAqdGZ1bmMgPQorCQkJCSZicC0+Zndfc3RhdHNfZGF0YS0+cGYudHN0b3JtX3BmX3N0YXRpc3RpY3M7CiAJc3RydWN0IGhvc3RfZnVuY19zdGF0cyAqZnN0YXRzID0gYm54Mnhfc3AoYnAsIGZ1bmNfc3RhdHMpOwogCXN0cnVjdCBibngyeF9ldGhfc3RhdHMgKmVzdGF0cyA9ICZicC0+ZXRoX3N0YXRzOworCXN0cnVjdCBzdGF0c19jb3VudGVyICpjb3VudGVycyA9ICZicC0+Zndfc3RhdHNfZGF0YS0+c3Rvcm1fY291bnRlcnM7CiAJaW50IGk7CiAJdTE2IGN1cl9zdGF0c19jb3VudGVyOwogCkBAIC03NjEsNiArNzcwLDM1IEBACiAJY3VyX3N0YXRzX2NvdW50ZXIgPSBicC0+c3RhdHNfY291bnRlciAtIDE7CiAJc3Bpbl91bmxvY2tfYmgoJmJwLT5zdGF0c19sb2NrKTsKIAorCS8qIGFyZSBzdG9ybSBzdGF0cyB2YWxpZD8gKi8KKwlpZiAobGUxNl90b19jcHUoY291bnRlcnMtPnhzdGF0c19jb3VudGVyKSAhPSBjdXJfc3RhdHNfY291bnRlcikgeworCQlEUChCTlgyWF9NU0dfU1RBVFMsICJzdGF0cyBub3QgdXBkYXRlZCBieSB4c3Rvcm0iCisJCSAgICIgIHhzdG9ybSBjb3VudGVyICgweCV4KSAhPSBzdGF0c19jb3VudGVyICgweCV4KVxuIiwKKwkJICAgbGUxNl90b19jcHUoY291bnRlcnMtPnhzdGF0c19jb3VudGVyKSwgYnAtPnN0YXRzX2NvdW50ZXIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAobGUxNl90b19jcHUoY291bnRlcnMtPnVzdGF0c19jb3VudGVyKSAhPSBjdXJfc3RhdHNfY291bnRlcikgeworCQlEUChCTlgyWF9NU0dfU1RBVFMsICJzdGF0cyBub3QgdXBkYXRlZCBieSB1c3Rvcm0iCisJCSAgICIgIHVzdG9ybSBjb3VudGVyICgweCV4KSAhPSBzdGF0c19jb3VudGVyICgweCV4KVxuIiwKKwkJICAgbGUxNl90b19jcHUoY291bnRlcnMtPnVzdGF0c19jb3VudGVyKSwgYnAtPnN0YXRzX2NvdW50ZXIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAobGUxNl90b19jcHUoY291bnRlcnMtPmNzdGF0c19jb3VudGVyKSAhPSBjdXJfc3RhdHNfY291bnRlcikgeworCQlEUChCTlgyWF9NU0dfU1RBVFMsICJzdGF0cyBub3QgdXBkYXRlZCBieSBjc3Rvcm0iCisJCSAgICIgIGNzdG9ybSBjb3VudGVyICgweCV4KSAhPSBzdGF0c19jb3VudGVyICgweCV4KVxuIiwKKwkJICAgbGUxNl90b19jcHUoY291bnRlcnMtPmNzdGF0c19jb3VudGVyKSwgYnAtPnN0YXRzX2NvdW50ZXIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAobGUxNl90b19jcHUoY291bnRlcnMtPnRzdGF0c19jb3VudGVyKSAhPSBjdXJfc3RhdHNfY291bnRlcikgeworCQlEUChCTlgyWF9NU0dfU1RBVFMsICJzdGF0cyBub3QgdXBkYXRlZCBieSB0c3Rvcm0iCisJCSAgICIgIHRzdG9ybSBjb3VudGVyICgweCV4KSAhPSBzdGF0c19jb3VudGVyICgweCV4KVxuIiwKKwkJICAgbGUxNl90b19jcHUoY291bnRlcnMtPnRzdGF0c19jb3VudGVyKSwgYnAtPnN0YXRzX2NvdW50ZXIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKIAltZW1jcHkoJihmc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpKSwKIAkgICAgICAgJihibngyeF9zcChicCwgZnVuY19zdGF0c19iYXNlKS0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGkpLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGhvc3RfZnVuY19zdGF0cykgLSAyKnNpemVvZih1MzIpKTsKQEAgLTc3MCw5NCArODA4LDg0IEBACiAJZXN0YXRzLT5ldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19sbyA9IDA7CiAJZXN0YXRzLT5ub19idWZmX2Rpc2NhcmRfaGkgPSAwOwogCWVzdGF0cy0+bm9fYnVmZl9kaXNjYXJkX2xvID0gMDsKKwllc3RhdHMtPnRvdGFsX3RwYV9hZ2dyZWdhdGlvbnNfaGkgPSAwOworCWVzdGF0cy0+dG90YWxfdHBhX2FnZ3JlZ2F0aW9uc19sbyA9IDA7CisJZXN0YXRzLT50b3RhbF90cGFfYWdncmVnYXRlZF9mcmFtZXNfaGkgPSAwOworCWVzdGF0cy0+dG90YWxfdHBhX2FnZ3JlZ2F0ZWRfZnJhbWVzX2xvID0gMDsKKwllc3RhdHMtPnRvdGFsX3RwYV9ieXRlc19oaSA9IDA7CisJZXN0YXRzLT50b3RhbF90cGFfYnl0ZXNfbG8gPSAwOwogCiAJZm9yX2VhY2hfZXRoX3F1ZXVlKGJwLCBpKSB7CiAJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2ldOwotCQlpbnQgY2xfaWQgPSBmcC0+Y2xfaWQ7Ci0JCXN0cnVjdCB0c3Rvcm1fcGVyX2NsaWVudF9zdGF0cyAqdGNsaWVudCA9Ci0JCQkJJnN0YXRzLT50c3Rvcm1fY29tbW9uLmNsaWVudF9zdGF0aXN0aWNzW2NsX2lkXTsKLQkJc3RydWN0IHRzdG9ybV9wZXJfY2xpZW50X3N0YXRzICpvbGRfdGNsaWVudCA9ICZmcC0+b2xkX3RjbGllbnQ7Ci0JCXN0cnVjdCB1c3Rvcm1fcGVyX2NsaWVudF9zdGF0cyAqdWNsaWVudCA9Ci0JCQkJJnN0YXRzLT51c3Rvcm1fY29tbW9uLmNsaWVudF9zdGF0aXN0aWNzW2NsX2lkXTsKLQkJc3RydWN0IHVzdG9ybV9wZXJfY2xpZW50X3N0YXRzICpvbGRfdWNsaWVudCA9ICZmcC0+b2xkX3VjbGllbnQ7Ci0JCXN0cnVjdCB4c3Rvcm1fcGVyX2NsaWVudF9zdGF0cyAqeGNsaWVudCA9Ci0JCQkJJnN0YXRzLT54c3Rvcm1fY29tbW9uLmNsaWVudF9zdGF0aXN0aWNzW2NsX2lkXTsKLQkJc3RydWN0IHhzdG9ybV9wZXJfY2xpZW50X3N0YXRzICpvbGRfeGNsaWVudCA9ICZmcC0+b2xkX3hjbGllbnQ7CisJCXN0cnVjdCB0c3Rvcm1fcGVyX3F1ZXVlX3N0YXRzICp0Y2xpZW50ID0KKwkJCSZicC0+Zndfc3RhdHNfZGF0YS0+cXVldWVfc3RhdHNbaV0uCisJCQl0c3Rvcm1fcXVldWVfc3RhdGlzdGljczsKKwkJc3RydWN0IHRzdG9ybV9wZXJfcXVldWVfc3RhdHMgKm9sZF90Y2xpZW50ID0gJmZwLT5vbGRfdGNsaWVudDsKKwkJc3RydWN0IHVzdG9ybV9wZXJfcXVldWVfc3RhdHMgKnVjbGllbnQgPQorCQkJJmJwLT5md19zdGF0c19kYXRhLT5xdWV1ZV9zdGF0c1tpXS4KKwkJCXVzdG9ybV9xdWV1ZV9zdGF0aXN0aWNzOworCQlzdHJ1Y3QgdXN0b3JtX3Blcl9xdWV1ZV9zdGF0cyAqb2xkX3VjbGllbnQgPSAmZnAtPm9sZF91Y2xpZW50OworCQlzdHJ1Y3QgeHN0b3JtX3Blcl9xdWV1ZV9zdGF0cyAqeGNsaWVudCA9CisJCQkmYnAtPmZ3X3N0YXRzX2RhdGEtPnF1ZXVlX3N0YXRzW2ldLgorCQkJeHN0b3JtX3F1ZXVlX3N0YXRpc3RpY3M7CisJCXN0cnVjdCB4c3Rvcm1fcGVyX3F1ZXVlX3N0YXRzICpvbGRfeGNsaWVudCA9ICZmcC0+b2xkX3hjbGllbnQ7CiAJCXN0cnVjdCBibngyeF9ldGhfcV9zdGF0cyAqcXN0YXRzID0gJmZwLT5ldGhfcV9zdGF0czsKIAkJdTMyIGRpZmY7CiAKLQkJLyogYXJlIHN0b3JtIHN0YXRzIHZhbGlkPyAqLwotCQlpZiAobGUxNl90b19jcHUoeGNsaWVudC0+c3RhdHNfY291bnRlcikgIT0gY3VyX3N0YXRzX2NvdW50ZXIpIHsKLQkJCURQKEJOWDJYX01TR19TVEFUUywgIlslZF0gc3RhdHMgbm90IHVwZGF0ZWQgYnkgeHN0b3JtIgotCQkJICAgIiAgeHN0b3JtIGNvdW50ZXIgKDB4JXgpICE9IHN0YXRzX2NvdW50ZXIgKDB4JXgpXG4iLAotCQkJICAgaSwgeGNsaWVudC0+c3RhdHNfY291bnRlciwgY3VyX3N0YXRzX2NvdW50ZXIgKyAxKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAobGUxNl90b19jcHUodGNsaWVudC0+c3RhdHNfY291bnRlcikgIT0gY3VyX3N0YXRzX2NvdW50ZXIpIHsKLQkJCURQKEJOWDJYX01TR19TVEFUUywgIlslZF0gc3RhdHMgbm90IHVwZGF0ZWQgYnkgdHN0b3JtIgotCQkJICAgIiAgdHN0b3JtIGNvdW50ZXIgKDB4JXgpICE9IHN0YXRzX2NvdW50ZXIgKDB4JXgpXG4iLAotCQkJICAgaSwgdGNsaWVudC0+c3RhdHNfY291bnRlciwgY3VyX3N0YXRzX2NvdW50ZXIgKyAxKTsKLQkJCXJldHVybiAtMjsKLQkJfQotCQlpZiAobGUxNl90b19jcHUodWNsaWVudC0+c3RhdHNfY291bnRlcikgIT0gY3VyX3N0YXRzX2NvdW50ZXIpIHsKLQkJCURQKEJOWDJYX01TR19TVEFUUywgIlslZF0gc3RhdHMgbm90IHVwZGF0ZWQgYnkgdXN0b3JtIgotCQkJICAgIiAgdXN0b3JtIGNvdW50ZXIgKDB4JXgpICE9IHN0YXRzX2NvdW50ZXIgKDB4JXgpXG4iLAotCQkJICAgaSwgdWNsaWVudC0+c3RhdHNfY291bnRlciwgY3VyX3N0YXRzX2NvdW50ZXIgKyAxKTsKLQkJCXJldHVybiAtNDsKLQkJfQorCQlEUChCTlgyWF9NU0dfU1RBVFMsICJxdWV1ZVslZF06IHVjYXN0X3NlbnQgMHgleCwgIgorCQkJCSAgICAiYmNhc3Rfc2VudCAweCV4IG1jYXN0X3NlbnQgMHgleFxuIiwKKwkJICAgaSwgeGNsaWVudC0+dWNhc3RfcGt0c19zZW50LAorCQkgICB4Y2xpZW50LT5iY2FzdF9wa3RzX3NlbnQsIHhjbGllbnQtPm1jYXN0X3BrdHNfc2VudCk7CiAKKwkJRFAoQk5YMlhfTVNHX1NUQVRTLCAiLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCQlxc3RhdHMtPnRvdGFsX2Jyb2FkY2FzdF9ieXRlc19yZWNlaXZlZF9oaSA9CisJCQlsZTMyX3RvX2NwdSh0Y2xpZW50LT5yY3ZfYmNhc3RfYnl0ZXMuaGkpOworCQlxc3RhdHMtPnRvdGFsX2Jyb2FkY2FzdF9ieXRlc19yZWNlaXZlZF9sbyA9CisJCQlsZTMyX3RvX2NwdSh0Y2xpZW50LT5yY3ZfYmNhc3RfYnl0ZXMubG8pOworCisJCXFzdGF0cy0+dG90YWxfbXVsdGljYXN0X2J5dGVzX3JlY2VpdmVkX2hpID0KKwkJCWxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl9tY2FzdF9ieXRlcy5oaSk7CisJCXFzdGF0cy0+dG90YWxfbXVsdGljYXN0X2J5dGVzX3JlY2VpdmVkX2xvID0KKwkJCWxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl9tY2FzdF9ieXRlcy5sbyk7CisKKwkJcXN0YXRzLT50b3RhbF91bmljYXN0X2J5dGVzX3JlY2VpdmVkX2hpID0KKwkJCWxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl91Y2FzdF9ieXRlcy5oaSk7CisJCXFzdGF0cy0+dG90YWxfdW5pY2FzdF9ieXRlc19yZWNlaXZlZF9sbyA9CisJCQlsZTMyX3RvX2NwdSh0Y2xpZW50LT5yY3ZfdWNhc3RfYnl0ZXMubG8pOworCisJCS8qCisJCSAqIHN1bSB0byB0b3RhbF9ieXRlc19yZWNlaXZlZCBhbGwKKwkJICogdW5pY2FzdC9tdWx0aWNhc3QvYnJvYWRjYXN0CisJCSAqLwogCQlxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpID0KLQkJCWxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl9icm9hZGNhc3RfYnl0ZXMuaGkpOworCQkJcXN0YXRzLT50b3RhbF9icm9hZGNhc3RfYnl0ZXNfcmVjZWl2ZWRfaGk7CiAJCXFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8gPQotCQkJbGUzMl90b19jcHUodGNsaWVudC0+cmN2X2Jyb2FkY2FzdF9ieXRlcy5sbyk7CisJCQlxc3RhdHMtPnRvdGFsX2Jyb2FkY2FzdF9ieXRlc19yZWNlaXZlZF9sbzsKIAogCQlBRERfNjQocXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9oaSwKLQkJICAgICAgIGxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl9tdWx0aWNhc3RfYnl0ZXMuaGkpLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF9tdWx0aWNhc3RfYnl0ZXNfcmVjZWl2ZWRfaGksCiAJCSAgICAgICBxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvLAotCQkgICAgICAgbGUzMl90b19jcHUodGNsaWVudC0+cmN2X211bHRpY2FzdF9ieXRlcy5sbykpOworCQkgICAgICAgcXN0YXRzLT50b3RhbF9tdWx0aWNhc3RfYnl0ZXNfcmVjZWl2ZWRfbG8pOwogCiAJCUFERF82NChxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpLAotCQkgICAgICAgbGUzMl90b19jcHUodGNsaWVudC0+cmN2X3VuaWNhc3RfYnl0ZXMuaGkpLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF91bmljYXN0X2J5dGVzX3JlY2VpdmVkX2hpLAogCQkgICAgICAgcXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9sbywKLQkJICAgICAgIGxlMzJfdG9fY3B1KHRjbGllbnQtPnJjdl91bmljYXN0X2J5dGVzLmxvKSk7Ci0KLQkJU1VCXzY0KHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGksCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT5iY2FzdF9ub19idWZmX2J5dGVzLmhpKSwKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT5iY2FzdF9ub19idWZmX2J5dGVzLmxvKSk7Ci0KLQkJU1VCXzY0KHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGksCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT5tY2FzdF9ub19idWZmX2J5dGVzLmhpKSwKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT5tY2FzdF9ub19idWZmX2J5dGVzLmxvKSk7Ci0KLQkJU1VCXzY0KHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGksCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT51Y2FzdF9ub19idWZmX2J5dGVzLmhpKSwKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCi0JCSAgICAgICBsZTMyX3RvX2NwdSh1Y2xpZW50LT51Y2FzdF9ub19idWZmX2J5dGVzLmxvKSk7CisJCSAgICAgICBxc3RhdHMtPnRvdGFsX3VuaWNhc3RfYnl0ZXNfcmVjZWl2ZWRfbG8pOwogCiAJCXFzdGF0cy0+dmFsaWRfYnl0ZXNfcmVjZWl2ZWRfaGkgPQogCQkJCQlxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpOwogCQlxc3RhdHMtPnZhbGlkX2J5dGVzX3JlY2VpdmVkX2xvID0KIAkJCQkJcXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9sbzsKIAotCQlxc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2hpID0KLQkJCQlsZTMyX3RvX2NwdSh0Y2xpZW50LT5yY3ZfZXJyb3JfYnl0ZXMuaGkpOwotCQlxc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2xvID0KLQkJCQlsZTMyX3RvX2NwdSh0Y2xpZW50LT5yY3ZfZXJyb3JfYnl0ZXMubG8pOwogCi0JCUFERF82NChxc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpLAotCQkgICAgICAgcXN0YXRzLT5lcnJvcl9ieXRlc19yZWNlaXZlZF9oaSwKLQkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCi0JCSAgICAgICBxc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2xvKTsKLQotCQlVUERBVEVfRVhURU5EX1RTVEFUKHJjdl91bmljYXN0X3BrdHMsCisJCVVQREFURV9FWFRFTkRfVFNUQVQocmN2X3VjYXN0X3BrdHMsCiAJCQkJCXRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZCk7Ci0JCVVQREFURV9FWFRFTkRfVFNUQVQocmN2X211bHRpY2FzdF9wa3RzLAorCQlVUERBVEVfRVhURU5EX1RTVEFUKHJjdl9tY2FzdF9wa3RzLAogCQkJCQl0b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZCk7Ci0JCVVQREFURV9FWFRFTkRfVFNUQVQocmN2X2Jyb2FkY2FzdF9wa3RzLAorCQlVUERBVEVfRVhURU5EX1RTVEFUKHJjdl9iY2FzdF9wa3RzLAogCQkJCQl0b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZCk7Ci0JCVVQREFURV9FWFRFTkRfVFNUQVQocGFja2V0c190b29fYmlnX2Rpc2NhcmQsCisJCVVQREFURV9FWFRFTkRfVFNUQVQocGt0c190b29fYmlnX2Rpc2NhcmQsCiAJCQkJCWV0aGVyc3RhdHNvdmVycnNpemVwa3RzKTsKIAkJVVBEQVRFX0VYVEVORF9UU1RBVChub19idWZmX2Rpc2NhcmQsIG5vX2J1ZmZfZGlzY2FyZCk7CiAKQEAgLTg3MSwzMCArODk5LDc4IEBACiAJCVVQREFURV9FWFRFTkRfVVNUQVQobWNhc3Rfbm9fYnVmZl9wa3RzLCBub19idWZmX2Rpc2NhcmQpOwogCQlVUERBVEVfRVhURU5EX1VTVEFUKGJjYXN0X25vX2J1ZmZfcGt0cywgbm9fYnVmZl9kaXNjYXJkKTsKIAorCQlxc3RhdHMtPnRvdGFsX2Jyb2FkY2FzdF9ieXRlc190cmFuc21pdHRlZF9oaSA9CisJCQlsZTMyX3RvX2NwdSh4Y2xpZW50LT5iY2FzdF9ieXRlc19zZW50LmhpKTsKKwkJcXN0YXRzLT50b3RhbF9icm9hZGNhc3RfYnl0ZXNfdHJhbnNtaXR0ZWRfbG8gPQorCQkJbGUzMl90b19jcHUoeGNsaWVudC0+YmNhc3RfYnl0ZXNfc2VudC5sbyk7CisKKwkJcXN0YXRzLT50b3RhbF9tdWx0aWNhc3RfYnl0ZXNfdHJhbnNtaXR0ZWRfaGkgPQorCQkJbGUzMl90b19jcHUoeGNsaWVudC0+bWNhc3RfYnl0ZXNfc2VudC5oaSk7CisJCXFzdGF0cy0+dG90YWxfbXVsdGljYXN0X2J5dGVzX3RyYW5zbWl0dGVkX2xvID0KKwkJCWxlMzJfdG9fY3B1KHhjbGllbnQtPm1jYXN0X2J5dGVzX3NlbnQubG8pOworCisJCXFzdGF0cy0+dG90YWxfdW5pY2FzdF9ieXRlc190cmFuc21pdHRlZF9oaSA9CisJCQlsZTMyX3RvX2NwdSh4Y2xpZW50LT51Y2FzdF9ieXRlc19zZW50LmhpKTsKKwkJcXN0YXRzLT50b3RhbF91bmljYXN0X2J5dGVzX3RyYW5zbWl0dGVkX2xvID0KKwkJCWxlMzJfdG9fY3B1KHhjbGllbnQtPnVjYXN0X2J5dGVzX3NlbnQubG8pOworCQkvKgorCQkgKiBzdW0gdG8gdG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWQgYWxsCisJCSAqIHVuaWNhc3QvbXVsdGljYXN0L2Jyb2FkY2FzdAorCQkgKi8KIAkJcXN0YXRzLT50b3RhbF9ieXRlc190cmFuc21pdHRlZF9oaSA9Ci0JCQkJbGUzMl90b19jcHUoeGNsaWVudC0+dW5pY2FzdF9ieXRlc19zZW50LmhpKTsKKwkJCQlxc3RhdHMtPnRvdGFsX3VuaWNhc3RfYnl0ZXNfdHJhbnNtaXR0ZWRfaGk7CiAJCXFzdGF0cy0+dG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfbG8gPQotCQkJCWxlMzJfdG9fY3B1KHhjbGllbnQtPnVuaWNhc3RfYnl0ZXNfc2VudC5sbyk7CisJCQkJcXN0YXRzLT50b3RhbF91bmljYXN0X2J5dGVzX3RyYW5zbWl0dGVkX2xvOwogCiAJCUFERF82NChxc3RhdHMtPnRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hpLAotCQkgICAgICAgbGUzMl90b19jcHUoeGNsaWVudC0+bXVsdGljYXN0X2J5dGVzX3NlbnQuaGkpLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF9icm9hZGNhc3RfYnl0ZXNfdHJhbnNtaXR0ZWRfaGksCiAJCSAgICAgICBxc3RhdHMtPnRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2xvLAotCQkgICAgICAgbGUzMl90b19jcHUoeGNsaWVudC0+bXVsdGljYXN0X2J5dGVzX3NlbnQubG8pKTsKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfYnJvYWRjYXN0X2J5dGVzX3RyYW5zbWl0dGVkX2xvKTsKIAogCQlBRERfNjQocXN0YXRzLT50b3RhbF9ieXRlc190cmFuc21pdHRlZF9oaSwKLQkJICAgICAgIGxlMzJfdG9fY3B1KHhjbGllbnQtPmJyb2FkY2FzdF9ieXRlc19zZW50LmhpKSwKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfbXVsdGljYXN0X2J5dGVzX3RyYW5zbWl0dGVkX2hpLAogCQkgICAgICAgcXN0YXRzLT50b3RhbF9ieXRlc190cmFuc21pdHRlZF9sbywKLQkJICAgICAgIGxlMzJfdG9fY3B1KHhjbGllbnQtPmJyb2FkY2FzdF9ieXRlc19zZW50LmxvKSk7CisJCSAgICAgICBxc3RhdHMtPnRvdGFsX211bHRpY2FzdF9ieXRlc190cmFuc21pdHRlZF9sbyk7CiAKLQkJVVBEQVRFX0VYVEVORF9YU1RBVCh1bmljYXN0X3BrdHNfc2VudCwKKwkJVVBEQVRFX0VYVEVORF9YU1RBVCh1Y2FzdF9wa3RzX3NlbnQsCiAJCQkJCXRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZCk7Ci0JCVVQREFURV9FWFRFTkRfWFNUQVQobXVsdGljYXN0X3BrdHNfc2VudCwKKwkJVVBEQVRFX0VYVEVORF9YU1RBVChtY2FzdF9wa3RzX3NlbnQsCiAJCQkJCXRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkKTsKLQkJVVBEQVRFX0VYVEVORF9YU1RBVChicm9hZGNhc3RfcGt0c19zZW50LAorCQlVUERBVEVfRVhURU5EX1hTVEFUKGJjYXN0X3BrdHNfc2VudCwKIAkJCQkJdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWQpOwogCi0JCW9sZF90Y2xpZW50LT5jaGVja3N1bV9kaXNjYXJkID0gdGNsaWVudC0+Y2hlY2tzdW1fZGlzY2FyZDsKLQkJb2xkX3RjbGllbnQtPnR0bDBfZGlzY2FyZCA9IHRjbGllbnQtPnR0bDBfZGlzY2FyZDsKKwkJVVBEQVRFX0VYVEVORF9UU1RBVChjaGVja3N1bV9kaXNjYXJkLAorCQkJCSAgICB0b3RhbF9wYWNrZXRzX3JlY2VpdmVkX2NoZWNrc3VtX2Rpc2NhcmRlZCk7CisJCVVQREFURV9FWFRFTkRfVFNUQVQodHRsMF9kaXNjYXJkLAorCQkJCSAgICB0b3RhbF9wYWNrZXRzX3JlY2VpdmVkX3R0bDBfZGlzY2FyZGVkKTsKKworCQlVUERBVEVfRVhURU5EX1hTVEFUKGVycm9yX2Ryb3BfcGt0cywKKwkJCQkgICAgdG90YWxfdHJhbnNtaXR0ZWRfZHJvcHBlZF9wYWNrZXRzX2Vycm9yKTsKKworCQkvKiBUUEEgYWdncmVnYXRpb25zIGNvbXBsZXRlZCAqLworCQlVUERBVEVfRVhURU5EX1VTVEFUKGNvYWxlc2NlZF9ldmVudHMsIHRvdGFsX3RwYV9hZ2dyZWdhdGlvbnMpOworCQkvKiBOdW1iZXIgb2YgbmV0d29yayBmcmFtZXMgYWdncmVnYXRlZCBieSBUUEEgKi8KKwkJVVBEQVRFX0VYVEVORF9VU1RBVChjb2FsZXNjZWRfcGt0cywKKwkJCQkgICAgdG90YWxfdHBhX2FnZ3JlZ2F0ZWRfZnJhbWVzKTsKKwkJLyogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluIGNvbXBsZXRlZCBUUEEgYWdncmVnYXRpb25zICovCisJCXFzdGF0cy0+dG90YWxfdHBhX2J5dGVzX2xvID0KKwkJCWxlMzJfdG9fY3B1KHVjbGllbnQtPmNvYWxlc2NlZF9ieXRlcy5sbyk7CisJCXFzdGF0cy0+dG90YWxfdHBhX2J5dGVzX2hpID0KKwkJCWxlMzJfdG9fY3B1KHVjbGllbnQtPmNvYWxlc2NlZF9ieXRlcy5oaSk7CisKKwkJLyogVFBBIHN0YXRzIHBlci1mdW5jdGlvbiAqLworCQlBRERfNjQoZXN0YXRzLT50b3RhbF90cGFfYWdncmVnYXRpb25zX2hpLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF90cGFfYWdncmVnYXRpb25zX2hpLAorCQkgICAgICAgZXN0YXRzLT50b3RhbF90cGFfYWdncmVnYXRpb25zX2xvLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF90cGFfYWdncmVnYXRpb25zX2xvKTsKKwkJQUREXzY0KGVzdGF0cy0+dG90YWxfdHBhX2FnZ3JlZ2F0ZWRfZnJhbWVzX2hpLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF90cGFfYWdncmVnYXRlZF9mcmFtZXNfaGksCisJCSAgICAgICBlc3RhdHMtPnRvdGFsX3RwYV9hZ2dyZWdhdGVkX2ZyYW1lc19sbywKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfdHBhX2FnZ3JlZ2F0ZWRfZnJhbWVzX2xvKTsKKwkJQUREXzY0KGVzdGF0cy0+dG90YWxfdHBhX2J5dGVzX2hpLAorCQkgICAgICAgcXN0YXRzLT50b3RhbF90cGFfYnl0ZXNfaGksCisJCSAgICAgICBlc3RhdHMtPnRvdGFsX3RwYV9ieXRlc19sbywKKwkJICAgICAgIHFzdGF0cy0+dG90YWxfdHBhX2J5dGVzX2xvKTsKIAogCQlBRERfNjQoZnN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9oaSwKIAkJICAgICAgIHFzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGksCkBAIC05MzMsMTAgKzEwMDksNiBAQAogCQkgICAgICAgZnN0YXRzLT52YWxpZF9ieXRlc19yZWNlaXZlZF9sbywKIAkJICAgICAgIHFzdGF0cy0+dmFsaWRfYnl0ZXNfcmVjZWl2ZWRfbG8pOwogCi0JCUFERF82NChlc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2hpLAotCQkgICAgICAgcXN0YXRzLT5lcnJvcl9ieXRlc19yZWNlaXZlZF9oaSwKLQkJICAgICAgIGVzdGF0cy0+ZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfbG8sCi0JCSAgICAgICBxc3RhdHMtPmVycm9yX2J5dGVzX3JlY2VpdmVkX2xvKTsKIAkJQUREXzY0KGVzdGF0cy0+ZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfaGksCiAJCSAgICAgICBxc3RhdHMtPmV0aGVyc3RhdHNvdmVycnNpemVwa3RzX2hpLAogCQkgICAgICAgZXN0YXRzLT5ldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19sbywKQEAgLTk1MCw5ICsxMDIyLDE5IEBACiAJICAgICAgIGZzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCiAJICAgICAgIGVzdGF0cy0+cnhfc3RhdF9pZmhjaW5iYWRvY3RldHNfbG8pOwogCisJQUREXzY0KGZzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGksCisJICAgICAgIHRmdW5jLT5yY3ZfZXJyb3JfYnl0ZXMuaGksCisJICAgICAgIGZzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfbG8sCisJICAgICAgIHRmdW5jLT5yY3ZfZXJyb3JfYnl0ZXMubG8pOworCiAJbWVtY3B5KGVzdGF0cywgJihmc3RhdHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpKSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBob3N0X2Z1bmNfc3RhdHMpIC0gMipzaXplb2YodTMyKSk7CiAKKwlBRERfNjQoZXN0YXRzLT5lcnJvcl9ieXRlc19yZWNlaXZlZF9oaSwKKwkgICAgICAgdGZ1bmMtPnJjdl9lcnJvcl9ieXRlcy5oaSwKKwkgICAgICAgZXN0YXRzLT5lcnJvcl9ieXRlc19yZWNlaXZlZF9sbywKKwkgICAgICAgdGZ1bmMtPnJjdl9lcnJvcl9ieXRlcy5sbyk7CisKIAlBRERfNjQoZXN0YXRzLT5ldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19oaSwKIAkgICAgICAgZXN0YXRzLT5yeF9zdGF0X2RvdDNzdGF0c2ZyYW1lc3Rvb2xvbmdfaGksCiAJICAgICAgIGVzdGF0cy0+ZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfbG8sCkBAIC05NjUsOCArMTA0Nyw4IEBACiAJaWYgKGJwLT5wb3J0LnBtZikgewogCQllc3RhdHMtPm1hY19maWx0ZXJfZGlzY2FyZCA9CiAJCQkJbGUzMl90b19jcHUodHBvcnQtPm1hY19maWx0ZXJfZGlzY2FyZCk7Ci0JCWVzdGF0cy0+eHhvdmVyZmxvd19kaXNjYXJkID0KLQkJCQlsZTMyX3RvX2NwdSh0cG9ydC0+eHhvdmVyZmxvd19kaXNjYXJkKTsKKwkJZXN0YXRzLT5tZl90YWdfZGlzY2FyZCA9CisJCQkJbGUzMl90b19jcHUodHBvcnQtPm1mX3RhZ19kaXNjYXJkKTsKIAkJZXN0YXRzLT5icmJfdHJ1bmNhdGVfZGlzY2FyZCA9CiAJCQkJbGUzMl90b19jcHUodHBvcnQtPmJyYl90cnVuY2F0ZV9kaXNjYXJkKTsKIAkJZXN0YXRzLT5tYWNfZGlzY2FyZCA9IGxlMzJfdG9fY3B1KHRwb3J0LT5tYWNfZGlzY2FyZCk7CkBAIC0xMDIzLDcgKzExMDUsNyBAQAogCW5zdGF0cy0+cnhfZnJhbWVfZXJyb3JzID0KIAkJYm54MnhfaGlsbygmZXN0YXRzLT5yeF9zdGF0X2RvdDNzdGF0c2FsaWdubWVudGVycm9yc19oaSk7CiAJbnN0YXRzLT5yeF9maWZvX2Vycm9ycyA9IGJueDJ4X2hpbG8oJmVzdGF0cy0+bm9fYnVmZl9kaXNjYXJkX2hpKTsKLQluc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgPSBlc3RhdHMtPnh4b3ZlcmZsb3dfZGlzY2FyZDsKKwluc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgPSAwOwogCiAJbnN0YXRzLT5yeF9lcnJvcnMgPSBuc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKwogCQkJICAgIG5zdGF0cy0+cnhfb3Zlcl9lcnJvcnMgKwpAQCAtMTA2NSwxMCArMTE0NywyNyBAQAogCX0KIH0KIAorc3RhdGljIGJvb2wgYm54MnhfZWRlYnVnX3N0YXRzX3N0b3BwZWQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgdmFsOworCisJaWYgKFNITUVNMl9IQVMoYnAsIGVkZWJ1Z19kcml2ZXJfaWZbMV0pKSB7CisJCXZhbCA9IFNITUVNMl9SRChicCwgZWRlYnVnX2RyaXZlcl9pZlsxXSk7CisKKwkJaWYgKHZhbCA9PSBFREVCVUdfRFJJVkVSX0lGX09QX0NPREVfRElTQUJMRV9TVEFUKQorCQkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgdm9pZCBibngyeF9zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKIHsKIAl1MzIgKnN0YXRzX2NvbXAgPSBibngyeF9zcChicCwgc3RhdHNfY29tcCk7CiAKKwlpZiAoYm54MnhfZWRlYnVnX3N0YXRzX3N0b3BwZWQoYnApKQorCQlyZXR1cm47CisKIAlpZiAoKnN0YXRzX2NvbXAgIT0gRE1BRV9DT01QX1ZBTCkKIAkJcmV0dXJuOwogCkBAIC0xMDg2LDEwICsxMTg1LDkgQEAKIAogCWlmIChuZXRpZl9tc2dfdGltZXIoYnApKSB7CiAJCXN0cnVjdCBibngyeF9ldGhfc3RhdHMgKmVzdGF0cyA9ICZicC0+ZXRoX3N0YXRzOwotCQlpbnQgaTsKKwkJaW50IGksIGNvczsKIAotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJyYiBkcm9wcyAldSAgYnJiIHRydW5jYXRlICV1XG4iLAotCQkgICAgICAgYnAtPmRldi0+bmFtZSwKKwkJbmV0ZGV2X2RiZyhicC0+ZGV2LCAiYnJiIGRyb3BzICV1ICBicmIgdHJ1bmNhdGUgJXVcbiIsCiAJCSAgICAgICBlc3RhdHMtPmJyYl9kcm9wX2xvLCBlc3RhdHMtPmJyYl90cnVuY2F0ZV9sbyk7CiAKIAkJZm9yX2VhY2hfZXRoX3F1ZXVlKGJwLCBpKSB7CkBAIC0xMTA4LDIwICsxMjA2LDMyIEBACiAKIAkJZm9yX2VhY2hfZXRoX3F1ZXVlKGJwLCBpKSB7CiAJCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKKwkJCXN0cnVjdCBibngyeF9mcF90eGRhdGEgKnR4ZGF0YTsKIAkJCXN0cnVjdCBibngyeF9ldGhfcV9zdGF0cyAqcXN0YXRzID0gJmZwLT5ldGhfcV9zdGF0czsKLQkJCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cSA9Ci0JCQkJbmV0ZGV2X2dldF90eF9xdWV1ZShicC0+ZGV2LCBpKTsKKwkJCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKIAotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBhdmFpbCglNHUpICAqdHhfY29uc19zYigldSkiCi0JCQkJCSAgIiAgdHggcGt0KCVsdSkgdHggY2FsbHMgKCVsdSkiCi0JCQkJCSAgIiAgJXMgKFhvZmYgZXZlbnRzICV1KVxuIiwKLQkJCSAgICAgICBmcC0+bmFtZSwgYm54MnhfdHhfYXZhaWwoZnApLAotCQkJICAgICAgIGxlMTZfdG9fY3B1KCpmcC0+dHhfY29uc19zYiksCi0JCQkgICAgICAgYm54MnhfaGlsbygmcXN0YXRzLT4KLQkJCQkJICB0b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGkpLAotCQkJICAgICAgIGZwLT50eF9wa3QsCi0JCQkgICAgICAgKG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQodHhxKSA/ICJYb2ZmIiA6ICJYb24iKSwKLQkJCSAgICAgICBxc3RhdHMtPmRyaXZlcl94b2ZmKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggcGt0KCVsdSkgKFhvZmYgZXZlbnRzICV1KSIsCisJCQkJZnAtPm5hbWUsIGJueDJ4X2hpbG8oCisJCQkJJnFzdGF0cy0+dG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpKSwKKwkJCQlxc3RhdHMtPmRyaXZlcl94b2ZmKTsKKworCQkJZm9yX2VhY2hfY29zX2luX3R4X3F1ZXVlKGZwLCBjb3MpIHsKKwkJCQl0eGRhdGEgPSAmZnAtPnR4ZGF0YVtjb3NdOworCQkJCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoYnAtPmRldiwKKwkJCQkJCUZQX0NPU19UT19UWFEoZnAsIGNvcykpOworCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVkOiB0eCBhdmFpbCglNHUpIgorCQkJCSAgICAgICAiICAqdHhfY29uc19zYigldSkiCisJCQkJICAgICAgICIgIHR4IGNhbGxzICglbHUpIgorCQkJCSAgICAgICAiICAlc1xuIiwKKwkJCQkgICAgICAgY29zLAorCQkJCSAgICAgICBibngyeF90eF9hdmFpbChicCwgdHhkYXRhKSwKKwkJCQkgICAgICAgbGUxNl90b19jcHUoKnR4ZGF0YS0+dHhfY29uc19zYiksCisJCQkJICAgICAgIHR4ZGF0YS0+dHhfcGt0LAorCQkJCSAgICAgICAobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpID8KKwkJCQkJIlhvZmYiIDogIlhvbiIpCisJCQkJICAgICAgICk7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTExNDksNiArMTI1OSw3IEBACiAJCWVsc2UKIAkJCWRtYWUtPm9wY29kZSA9IGJueDJ4X2RtYWVfb3Bjb2RlX2FkZF9jb21wKAogCQkJCQkJb3Bjb2RlLCBETUFFX0NPTVBfUENJKTsKKwogCQlkbWFlLT5zcmNfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBwb3J0X3N0YXRzKSk7CiAJCWRtYWUtPnNyY19hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpKTsKIAkJZG1hZS0+ZHN0X2FkZHJfbG8gPSBicC0+cG9ydC5wb3J0X3N0eCA+PiAyOwpAQCAtMTIzNSwxMyArMTM0Niw5IEBACiB2b2lkIGJueDJ4X3N0YXRzX2hhbmRsZShzdHJ1Y3QgYm54MnggKmJwLCBlbnVtIGJueDJ4X3N0YXRzX2V2ZW50IGV2ZW50KQogewogCWVudW0gYm54Mnhfc3RhdHNfc3RhdGUgc3RhdGU7Ci0KIAlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkKIAkJcmV0dXJuOwotCiAJYm54Mnhfc3RhdHNfc3RtW2JwLT5zdGF0c19zdGF0ZV1bZXZlbnRdLmFjdGlvbihicCk7Ci0KLQkvKiBQcm90ZWN0IGEgc3RhdGUgY2hhbmdlIGZsb3cgKi8KIAlzcGluX2xvY2tfYmgoJmJwLT5zdGF0c19sb2NrKTsKIAlzdGF0ZSA9IGJwLT5zdGF0c19zdGF0ZTsKIAlicC0+c3RhdHNfc3RhdGUgPSBibngyeF9zdGF0c19zdG1bc3RhdGVdW2V2ZW50XS5uZXh0X3N0YXRlOwpAQCAtMTI5Nyw3ICsxNDA0LDcgQEAKIAlmdW5jX3N0eCA9IGJwLT5mdW5jX3N0eDsKIAogCWZvciAodm4gPSBWTl8wOyB2biA8IHZuX21heDsgdm4rKykgewotCQlpbnQgbWJfaWR4ID0gIUNISVBfSVNfRTIoYnApID8gMip2biArIEJQX1BPUlQoYnApIDogdm47CisJCWludCBtYl9pZHggPSBDSElQX0lTX0UxeChicCkgPyAyKnZuICsgQlBfUE9SVChicCkgOiB2bjsKIAogCQlicC0+ZnVuY19zdHggPSBTSE1FTV9SRChicCwgZnVuY19tYlttYl9pZHhdLmZ3X21iX3BhcmFtKTsKIAkJYm54MnhfZnVuY19zdGF0c19pbml0KGJwKTsKQEAgLTEzMzksMTIgKzE0NDYsOTcgQEAKIAlibngyeF9zdGF0c19jb21wKGJwKTsKIH0KIAorLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJlcGFyZSB0aGUgc3RhdGlzdGljcyByYW1yb2QgZGF0YSB0aGUgd2F5CisgKiB3ZSB3aWxsIG9ubHkgaGF2ZSB0byBpbmNyZW1lbnQgdGhlIHN0YXRpc3RpY3MgY291bnRlciBhbmQKKyAqIHNlbmQgdGhlIHJhbXJvZCBlYWNoIHRpbWUgd2UgaGF2ZSB0by4KKyAqCisgKiBAcGFyYW0gYnAKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3ByZXBfZndfc3RhdHNfcmVxKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGk7CisJc3RydWN0IHN0YXRzX3F1ZXJ5X2hlYWRlciAqc3RhdHNfaGRyID0gJmJwLT5md19zdGF0c19yZXEtPmhkcjsKKworCWRtYV9hZGRyX3QgY3VyX2RhdGFfb2Zmc2V0OworCXN0cnVjdCBzdGF0c19xdWVyeV9lbnRyeSAqY3VyX3F1ZXJ5X2VudHJ5OworCisJc3RhdHNfaGRyLT5jbWRfbnVtID0gYnAtPmZ3X3N0YXRzX251bTsKKwlzdGF0c19oZHItPmRydl9zdGF0c19jb3VudGVyID0gMDsKKworCS8qIHN0b3JtX2NvdW50ZXJzIHN0cnVjdCBjb250YWlucyB0aGUgY291bnRlcnMgb2YgY29tcGxldGVkCisJICogc3RhdGlzdGljcyByZXF1ZXN0cyBwZXIgc3Rvcm0gd2hpY2ggYXJlIGluY3JlbWVudGVkIGJ5IEZXCisJICogZWFjaCB0aW1lIGl0IGNvbXBsZXRlcyBoYWRuaW5nIGEgc3RhdGlzdGljcyByYW1yb2QuIFdlIHdpbGwKKwkgKiBjaGVjayB0aGVzZSBjb3VudGVycyBpbiB0aGUgdGltZXIgaGFuZGxlciBhbmQgZGlzY2FyZCBhCisJICogKHN0YXRpc3RpY3MpIHJhbXJvZCBjb21wbGV0aW9uLgorCSAqLworCWN1cl9kYXRhX29mZnNldCA9IGJwLT5md19zdGF0c19kYXRhX21hcHBpbmcgKworCQlvZmZzZXRvZihzdHJ1Y3QgYm54MnhfZndfc3RhdHNfZGF0YSwgc3Rvcm1fY291bnRlcnMpOworCisJc3RhdHNfaGRyLT5zdGF0c19jb3VudGVyc19hZGRycy5oaSA9CisJCWNwdV90b19sZTMyKFU2NF9ISShjdXJfZGF0YV9vZmZzZXQpKTsKKwlzdGF0c19oZHItPnN0YXRzX2NvdW50ZXJzX2FkZHJzLmxvID0KKwkJY3B1X3RvX2xlMzIoVTY0X0xPKGN1cl9kYXRhX29mZnNldCkpOworCisJLyogcHJlcGFyZSB0byB0aGUgZmlyc3Qgc3RhdHMgcmFtcm9kICh3aWxsIGJlIGNvbXBsZXRlZCB3aXRoCisJICogdGhlIGNvdW50ZXJzIGVxdWFsIHRvIHplcm8pIC0gaW5pdCBjb3VudGVycyB0byBzb21ldGhpZyBkaWZmZXJlbnQuCisJICovCisJbWVtc2V0KCZicC0+Zndfc3RhdHNfZGF0YS0+c3Rvcm1fY291bnRlcnMsIDB4ZmYsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc3RhdHNfY291bnRlcikpOworCisJLyoqKiogUG9ydCBGVyBzdGF0aXN0aWNzIGRhdGEgKioqKi8KKwljdXJfZGF0YV9vZmZzZXQgPSBicC0+Zndfc3RhdHNfZGF0YV9tYXBwaW5nICsKKwkJb2Zmc2V0b2Yoc3RydWN0IGJueDJ4X2Z3X3N0YXRzX2RhdGEsIHBvcnQpOworCisJY3VyX3F1ZXJ5X2VudHJ5ID0gJmJwLT5md19zdGF0c19yZXEtPnF1ZXJ5W0JOWDJYX1BPUlRfUVVFUllfSURYXTsKKworCWN1cl9xdWVyeV9lbnRyeS0+a2luZCA9IFNUQVRTX1RZUEVfUE9SVDsKKwkvKiBGb3IgcG9ydCBxdWVyeSBpbmRleCBpcyBhIERPTlQgQ0FSRSAqLworCWN1cl9xdWVyeV9lbnRyeS0+aW5kZXggPSBCUF9QT1JUKGJwKTsKKwkvKiBGb3IgcG9ydCBxdWVyeSBmdW5jSUQgaXMgYSBET05UIENBUkUgKi8KKwljdXJfcXVlcnlfZW50cnktPmZ1bmNJRCA9IGNwdV90b19sZTE2KEJQX0ZVTkMoYnApKTsKKwljdXJfcXVlcnlfZW50cnktPmFkZHJlc3MuaGkgPSBjcHVfdG9fbGUzMihVNjRfSEkoY3VyX2RhdGFfb2Zmc2V0KSk7CisJY3VyX3F1ZXJ5X2VudHJ5LT5hZGRyZXNzLmxvID0gY3B1X3RvX2xlMzIoVTY0X0xPKGN1cl9kYXRhX29mZnNldCkpOworCisJLyoqKiogUEYgRlcgc3RhdGlzdGljcyBkYXRhICoqKiovCisJY3VyX2RhdGFfb2Zmc2V0ID0gYnAtPmZ3X3N0YXRzX2RhdGFfbWFwcGluZyArCisJCW9mZnNldG9mKHN0cnVjdCBibngyeF9md19zdGF0c19kYXRhLCBwZik7CisKKwljdXJfcXVlcnlfZW50cnkgPSAmYnAtPmZ3X3N0YXRzX3JlcS0+cXVlcnlbQk5YMlhfUEZfUVVFUllfSURYXTsKKworCWN1cl9xdWVyeV9lbnRyeS0+a2luZCA9IFNUQVRTX1RZUEVfUEY7CisJLyogRm9yIFBGIHF1ZXJ5IGluZGV4IGlzIGEgRE9OVCBDQVJFICovCisJY3VyX3F1ZXJ5X2VudHJ5LT5pbmRleCA9IEJQX1BPUlQoYnApOworCWN1cl9xdWVyeV9lbnRyeS0+ZnVuY0lEID0gY3B1X3RvX2xlMTYoQlBfRlVOQyhicCkpOworCWN1cl9xdWVyeV9lbnRyeS0+YWRkcmVzcy5oaSA9IGNwdV90b19sZTMyKFU2NF9ISShjdXJfZGF0YV9vZmZzZXQpKTsKKwljdXJfcXVlcnlfZW50cnktPmFkZHJlc3MubG8gPSBjcHVfdG9fbGUzMihVNjRfTE8oY3VyX2RhdGFfb2Zmc2V0KSk7CisKKwkvKioqKiBDbGllbnRzJyBxdWVyaWVzICoqKiovCisJY3VyX2RhdGFfb2Zmc2V0ID0gYnAtPmZ3X3N0YXRzX2RhdGFfbWFwcGluZyArCisJCW9mZnNldG9mKHN0cnVjdCBibngyeF9md19zdGF0c19kYXRhLCBxdWV1ZV9zdGF0cyk7CisKKwlmb3JfZWFjaF9ldGhfcXVldWUoYnAsIGkpIHsKKwkJY3VyX3F1ZXJ5X2VudHJ5ID0KKwkJCSZicC0+Zndfc3RhdHNfcmVxLT4KKwkJCQkJcXVlcnlbQk5YMlhfRklSU1RfUVVFVUVfUVVFUllfSURYICsgaV07CisKKwkJY3VyX3F1ZXJ5X2VudHJ5LT5raW5kID0gU1RBVFNfVFlQRV9RVUVVRTsKKwkJY3VyX3F1ZXJ5X2VudHJ5LT5pbmRleCA9IGJueDJ4X3N0YXRzX2lkKCZicC0+ZnBbaV0pOworCQljdXJfcXVlcnlfZW50cnktPmZ1bmNJRCA9IGNwdV90b19sZTE2KEJQX0ZVTkMoYnApKTsKKwkJY3VyX3F1ZXJ5X2VudHJ5LT5hZGRyZXNzLmhpID0KKwkJCWNwdV90b19sZTMyKFU2NF9ISShjdXJfZGF0YV9vZmZzZXQpKTsKKwkJY3VyX3F1ZXJ5X2VudHJ5LT5hZGRyZXNzLmxvID0KKwkJCWNwdV90b19sZTMyKFU2NF9MTyhjdXJfZGF0YV9vZmZzZXQpKTsKKworCQljdXJfZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBwZXJfcXVldWVfc3RhdHMpOworCX0KK30KKwogdm9pZCBibngyeF9zdGF0c19pbml0KHN0cnVjdCBibngyeCAqYnApCiB7Ci0JaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwlpbnQgLyphYnMqL3BvcnQgPSBCUF9QT1JUKGJwKTsKIAlpbnQgbWJfaWR4ID0gQlBfRldfTUJfSURYKGJwKTsKIAlpbnQgaTsKLQlzdHJ1Y3QgZXRoX3N0YXRzX3F1ZXJ5ICpzdGF0cyA9IGJueDJ4X3NwKGJwLCBmd19zdGF0cyk7CiAKIAlicC0+c3RhdHNfcGVuZGluZyA9IDA7CiAJYnAtPmV4ZWN1dGVyX2lkeCA9IDA7CkBAIC0xMzYyLDQ1ICsxNTU0LDM1IEBACiAJRFAoQk5YMlhfTVNHX1NUQVRTLCAicG9ydF9zdHggMHgleCAgZnVuY19zdHggMHgleFxuIiwKIAkgICBicC0+cG9ydC5wb3J0X3N0eCwgYnAtPmZ1bmNfc3R4KTsKIAorCXBvcnQgPSBCUF9QT1JUKGJwKTsKIAkvKiBwb3J0IHN0YXRzICovCiAJbWVtc2V0KCYoYnAtPnBvcnQub2xkX25pZ19zdGF0cyksIDAsIHNpemVvZihzdHJ1Y3QgbmlnX3N0YXRzKSk7CiAJYnAtPnBvcnQub2xkX25pZ19zdGF0cy5icmJfZGlzY2FyZCA9CiAJCQlSRUdfUkQoYnAsIE5JR19SRUdfU1RBVDBfQlJCX0RJU0NBUkQgKyBwb3J0KjB4MzgpOwogCWJwLT5wb3J0Lm9sZF9uaWdfc3RhdHMuYnJiX3RydW5jYXRlID0KIAkJCVJFR19SRChicCwgTklHX1JFR19TVEFUMF9CUkJfVFJVTkNBVEUgKyBwb3J0KjB4MzgpOwotCVJFR19SRF9ETUFFKGJwLCBOSUdfUkVHX1NUQVQwX0VHUkVTU19NQUNfUEtUMCArIHBvcnQqMHg1MCwKLQkJICAgICYoYnAtPnBvcnQub2xkX25pZ19zdGF0cy5lZ3Jlc3NfbWFjX3BrdDBfbG8pLCAyKTsKLQlSRUdfUkRfRE1BRShicCwgTklHX1JFR19TVEFUMF9FR1JFU1NfTUFDX1BLVDEgKyBwb3J0KjB4NTAsCi0JCSAgICAmKGJwLT5wb3J0Lm9sZF9uaWdfc3RhdHMuZWdyZXNzX21hY19wa3QxX2xvKSwgMik7CisJaWYgKCFDSElQX0lTX0UzKGJwKSkgeworCQlSRUdfUkRfRE1BRShicCwgTklHX1JFR19TVEFUMF9FR1JFU1NfTUFDX1BLVDAgKyBwb3J0KjB4NTAsCisJCQkgICAgJihicC0+cG9ydC5vbGRfbmlnX3N0YXRzLmVncmVzc19tYWNfcGt0MF9sbyksIDIpOworCQlSRUdfUkRfRE1BRShicCwgTklHX1JFR19TVEFUMF9FR1JFU1NfTUFDX1BLVDEgKyBwb3J0KjB4NTAsCisJCQkgICAgJihicC0+cG9ydC5vbGRfbmlnX3N0YXRzLmVncmVzc19tYWNfcGt0MV9sbyksIDIpOworCX0KIAogCS8qIGZ1bmN0aW9uIHN0YXRzICovCiAJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKIAkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbaV07CiAKLQkJbWVtc2V0KCZmcC0+b2xkX3RjbGllbnQsIDAsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IHRzdG9ybV9wZXJfY2xpZW50X3N0YXRzKSk7Ci0JCW1lbXNldCgmZnAtPm9sZF91Y2xpZW50LCAwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1c3Rvcm1fcGVyX2NsaWVudF9zdGF0cykpOwotCQltZW1zZXQoJmZwLT5vbGRfeGNsaWVudCwgMCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgeHN0b3JtX3Blcl9jbGllbnRfc3RhdHMpKTsKLQkJbWVtc2V0KCZmcC0+ZXRoX3Ffc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgYm54MnhfZXRoX3Ffc3RhdHMpKTsKKwkJbWVtc2V0KCZmcC0+b2xkX3RjbGllbnQsIDAsIHNpemVvZihmcC0+b2xkX3RjbGllbnQpKTsKKwkJbWVtc2V0KCZmcC0+b2xkX3VjbGllbnQsIDAsIHNpemVvZihmcC0+b2xkX3VjbGllbnQpKTsKKwkJbWVtc2V0KCZmcC0+b2xkX3hjbGllbnQsIDAsIHNpemVvZihmcC0+b2xkX3hjbGllbnQpKTsKKwkJbWVtc2V0KCZmcC0+ZXRoX3Ffc3RhdHMsIDAsIHNpemVvZihmcC0+ZXRoX3Ffc3RhdHMpKTsKIAl9CiAKLQkvKiBGVyBzdGF0cyBhcmUgY3VycmVudGx5IGNvbGxlY3RlZCBmb3IgRVRIIGNsaWVudHMgb25seSAqLwotCWZvcl9lYWNoX2V0aF9xdWV1ZShicCwgaSkgewotCQkvKiBTZXQgaW5pdGlhbCBzdGF0cyBjb3VudGVyIGluIHRoZSBzdGF0cyByYW1yb2QgZGF0YSB0byAtMSAqLwotCQlpbnQgY2xfaWQgPSBicC0+ZnBbaV0uY2xfaWQ7CisJLyogUHJlcGFyZSBzdGF0aXN0aWNzIHJhbXJvZCBkYXRhICovCisJYm54MnhfcHJlcF9md19zdGF0c19yZXEoYnApOwogCi0JCXN0YXRzLT54c3Rvcm1fY29tbW9uLmNsaWVudF9zdGF0aXN0aWNzW2NsX2lkXS4KLQkJCXN0YXRzX2NvdW50ZXIgPSAweGZmZmY7Ci0JCXN0YXRzLT51c3Rvcm1fY29tbW9uLmNsaWVudF9zdGF0aXN0aWNzW2NsX2lkXS4KLQkJCXN0YXRzX2NvdW50ZXIgPSAweGZmZmY7Ci0JCXN0YXRzLT50c3Rvcm1fY29tbW9uLmNsaWVudF9zdGF0aXN0aWNzW2NsX2lkXS4KLQkJCXN0YXRzX2NvdW50ZXIgPSAweGZmZmY7Ci0JfQotCi0JbWVtc2V0KCZicC0+ZGV2LT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7Ci0JbWVtc2V0KCZicC0+ZXRoX3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGJueDJ4X2V0aF9zdGF0cykpOworCW1lbXNldCgmYnAtPmRldi0+c3RhdHMsIDAsIHNpemVvZihicC0+ZGV2LT5zdGF0cykpOworCW1lbXNldCgmYnAtPmV0aF9zdGF0cywgMCwgc2l6ZW9mKGJwLT5ldGhfc3RhdHMpKTsKIAogCWJwLT5zdGF0c19zdGF0ZSA9IFNUQVRTX1NUQVRFX0RJU0FCTEVEOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9zdGF0cy5oIGIvZHJpdmVycy9uZXQvYm54MngvYm54Mnhfc3RhdHMuaAppbmRleCA0NWQxNGQ4Li41ZDhjZTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9zdGF0cy5oCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X3N0YXRzLmgKQEAgLTE0LDQ4ICsxNCwxMSBAQAogICogU3RhdGlzdGljcyBhbmQgTGluayBtYW5hZ2VtZW50IGJ5IFlpdGNoYWsgR2VydG5lcgogICoKICAqLwotCiAjaWZuZGVmIEJOWDJYX1NUQVRTX0gKICNkZWZpbmUgQk5YMlhfU1RBVFNfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotc3RydWN0IGJueDJ4X2V0aF9xX3N0YXRzIHsKLQl1MzIgdG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGk7Ci0JdTMyIHRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvOwotCXUzMiB0b3RhbF9ieXRlc190cmFuc21pdHRlZF9oaTsKLQl1MzIgdG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfbG87Ci0JdTMyIHRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaTsKLQl1MzIgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvOwotCXUzMiB0b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaTsKLQl1MzIgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfcmVjZWl2ZWRfbG87Ci0JdTMyIHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpOwotCXUzMiB0b3RhbF9icm9hZGNhc3RfcGFja2V0c19yZWNlaXZlZF9sbzsKLQl1MzIgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpOwotCXUzMiB0b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG87Ci0JdTMyIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpOwotCXUzMiB0b3RhbF9tdWx0aWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbzsKLQl1MzIgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGk7Ci0JdTMyIHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvOwotCXUzMiB2YWxpZF9ieXRlc19yZWNlaXZlZF9oaTsKLQl1MzIgdmFsaWRfYnl0ZXNfcmVjZWl2ZWRfbG87Ci0KLQl1MzIgZXJyb3JfYnl0ZXNfcmVjZWl2ZWRfaGk7Ci0JdTMyIGVycm9yX2J5dGVzX3JlY2VpdmVkX2xvOwotCXUzMiBldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19oaTsKLQl1MzIgZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfbG87Ci0JdTMyIG5vX2J1ZmZfZGlzY2FyZF9oaTsKLQl1MzIgbm9fYnVmZl9kaXNjYXJkX2xvOwotCi0JdTMyIGRyaXZlcl94b2ZmOwotCXUzMiByeF9lcnJfZGlzY2FyZF9wa3Q7Ci0JdTMyIHJ4X3NrYl9hbGxvY19mYWlsZWQ7Ci0JdTMyIGh3X2NzdW1fZXJyOwotfTsKLQotI2RlZmluZSBRX1NUQVRTX09GRlNFVDMyKHN0YXRfbmFtZSkgXAotCQkJKG9mZnNldG9mKHN0cnVjdCBibngyeF9ldGhfcV9zdGF0cywgc3RhdF9uYW1lKSAvIDQpCi0KIHN0cnVjdCBuaWdfc3RhdHMgewogCXUzMiBicmJfZGlzY2FyZDsKIAl1MzIgYnJiX3BhY2tldDsKQEAgLTIxMiw3ICsxNzUsNyBAQAogCXUzMiBicmJfdHJ1bmNhdGVfbG87CiAKIAl1MzIgbWFjX2ZpbHRlcl9kaXNjYXJkOwotCXUzMiB4eG92ZXJmbG93X2Rpc2NhcmQ7CisJdTMyIG1mX3RhZ19kaXNjYXJkOwogCXUzMiBicmJfdHJ1bmNhdGVfZGlzY2FyZDsKIAl1MzIgbWFjX2Rpc2NhcmQ7CiAKQEAgLTIyMiwxNiArMTg1LDE5NyBAQAogCXUzMiBod19jc3VtX2VycjsKIAogCXUzMiBuaWdfdGltZXJfbWF4OworCisJLyogVFBBICovCisJdTMyIHRvdGFsX3RwYV9hZ2dyZWdhdGlvbnNfaGk7CisJdTMyIHRvdGFsX3RwYV9hZ2dyZWdhdGlvbnNfbG87CisJdTMyIHRvdGFsX3RwYV9hZ2dyZWdhdGVkX2ZyYW1lc19oaTsKKwl1MzIgdG90YWxfdHBhX2FnZ3JlZ2F0ZWRfZnJhbWVzX2xvOworCXUzMiB0b3RhbF90cGFfYnl0ZXNfaGk7CisJdTMyIHRvdGFsX3RwYV9ieXRlc19sbzsKIH07CiAKLSNkZWZpbmUgU1RBVFNfT0ZGU0VUMzIoc3RhdF9uYW1lKSBcCi0JCQkob2Zmc2V0b2Yoc3RydWN0IGJueDJ4X2V0aF9zdGF0cywgc3RhdF9uYW1lKSAvIDQpCiAKLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0cnVjdCBibngyeF9ldGhfcV9zdGF0cyB7CisJdTMyIHRvdGFsX3VuaWNhc3RfYnl0ZXNfcmVjZWl2ZWRfaGk7CisJdTMyIHRvdGFsX3VuaWNhc3RfYnl0ZXNfcmVjZWl2ZWRfbG87CisJdTMyIHRvdGFsX2Jyb2FkY2FzdF9ieXRlc19yZWNlaXZlZF9oaTsKKwl1MzIgdG90YWxfYnJvYWRjYXN0X2J5dGVzX3JlY2VpdmVkX2xvOworCXUzMiB0b3RhbF9tdWx0aWNhc3RfYnl0ZXNfcmVjZWl2ZWRfaGk7CisJdTMyIHRvdGFsX211bHRpY2FzdF9ieXRlc19yZWNlaXZlZF9sbzsKKwl1MzIgdG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGk7CisJdTMyIHRvdGFsX2J5dGVzX3JlY2VpdmVkX2xvOworCXUzMiB0b3RhbF91bmljYXN0X2J5dGVzX3RyYW5zbWl0dGVkX2hpOworCXUzMiB0b3RhbF91bmljYXN0X2J5dGVzX3RyYW5zbWl0dGVkX2xvOworCXUzMiB0b3RhbF9icm9hZGNhc3RfYnl0ZXNfdHJhbnNtaXR0ZWRfaGk7CisJdTMyIHRvdGFsX2Jyb2FkY2FzdF9ieXRlc190cmFuc21pdHRlZF9sbzsKKwl1MzIgdG90YWxfbXVsdGljYXN0X2J5dGVzX3RyYW5zbWl0dGVkX2hpOworCXUzMiB0b3RhbF9tdWx0aWNhc3RfYnl0ZXNfdHJhbnNtaXR0ZWRfbG87CisJdTMyIHRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hpOworCXUzMiB0b3RhbF9ieXRlc190cmFuc21pdHRlZF9sbzsKKwl1MzIgdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpOworCXUzMiB0b3RhbF91bmljYXN0X3BhY2tldHNfcmVjZWl2ZWRfbG87CisJdTMyIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpOworCXUzMiB0b3RhbF9tdWx0aWNhc3RfcGFja2V0c19yZWNlaXZlZF9sbzsKKwl1MzIgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGk7CisJdTMyIHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvOworCXUzMiB0b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGk7CisJdTMyIHRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9sbzsKKwl1MzIgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGk7CisJdTMyIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvOworCXUzMiB0b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaTsKKwl1MzIgdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG87CisJdTMyIHZhbGlkX2J5dGVzX3JlY2VpdmVkX2hpOworCXUzMiB2YWxpZF9ieXRlc19yZWNlaXZlZF9sbzsKKworCXUzMiBldGhlcnN0YXRzb3ZlcnJzaXplcGt0c19oaTsKKwl1MzIgZXRoZXJzdGF0c292ZXJyc2l6ZXBrdHNfbG87CisJdTMyIG5vX2J1ZmZfZGlzY2FyZF9oaTsKKwl1MzIgbm9fYnVmZl9kaXNjYXJkX2xvOworCisJdTMyIGRyaXZlcl94b2ZmOworCXUzMiByeF9lcnJfZGlzY2FyZF9wa3Q7CisJdTMyIHJ4X3NrYl9hbGxvY19mYWlsZWQ7CisJdTMyIGh3X2NzdW1fZXJyOworCisJdTMyIHRvdGFsX3BhY2tldHNfcmVjZWl2ZWRfY2hlY2tzdW1fZGlzY2FyZGVkX2hpOworCXUzMiB0b3RhbF9wYWNrZXRzX3JlY2VpdmVkX2NoZWNrc3VtX2Rpc2NhcmRlZF9sbzsKKwl1MzIgdG90YWxfcGFja2V0c19yZWNlaXZlZF90dGwwX2Rpc2NhcmRlZF9oaTsKKwl1MzIgdG90YWxfcGFja2V0c19yZWNlaXZlZF90dGwwX2Rpc2NhcmRlZF9sbzsKKwl1MzIgdG90YWxfdHJhbnNtaXR0ZWRfZHJvcHBlZF9wYWNrZXRzX2Vycm9yX2hpOworCXUzMiB0b3RhbF90cmFuc21pdHRlZF9kcm9wcGVkX3BhY2tldHNfZXJyb3JfbG87CisKKwkvKiBUUEEgKi8KKwl1MzIgdG90YWxfdHBhX2FnZ3JlZ2F0aW9uc19oaTsKKwl1MzIgdG90YWxfdHBhX2FnZ3JlZ2F0aW9uc19sbzsKKwl1MzIgdG90YWxfdHBhX2FnZ3JlZ2F0ZWRfZnJhbWVzX2hpOworCXUzMiB0b3RhbF90cGFfYWdncmVnYXRlZF9mcmFtZXNfbG87CisJdTMyIHRvdGFsX3RwYV9ieXRlc19oaTsKKwl1MzIgdG90YWxfdHBhX2J5dGVzX2xvOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTWFjcm9zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzdW1baGk6bG9dICs9IGFkZFtoaTpsb10gKi8KKyNkZWZpbmUgQUREXzY0KHNfaGksIGFfaGksIHNfbG8sIGFfbG8pIFwKKwlkbyB7IFwKKwkJc19sbyArPSBhX2xvOyBcCisJCXNfaGkgKz0gYV9oaSArICgoc19sbyA8IGFfbG8pID8gMSA6IDApOyBcCisJfSB3aGlsZSAoMCkKKworLyogZGlmZmVyZW5jZSA9IG1pbnVlbmQgLSBzdWJ0cmFoZW5kICovCisjZGVmaW5lIERJRkZfNjQoZF9oaSwgbV9oaSwgc19oaSwgZF9sbywgbV9sbywgc19sbykgXAorCWRvIHsgXAorCQlpZiAobV9sbyA8IHNfbG8pIHsgXAorCQkJLyogdW5kZXJmbG93ICovIFwKKwkJCWRfaGkgPSBtX2hpIC0gc19oaTsgXAorCQkJaWYgKGRfaGkgPiAwKSB7IFwKKwkJCQkvKiB3ZSBjYW4gJ2xvYW4nIDEgKi8gXAorCQkJCWRfaGktLTsgXAorCQkJCWRfbG8gPSBtX2xvICsgKFVJTlRfTUFYIC0gc19sbykgKyAxOyBcCisJCQl9IGVsc2UgeyBcCisJCQkJLyogbV9oaSA8PSBzX2hpICovIFwKKwkJCQlkX2hpID0gMDsgXAorCQkJCWRfbG8gPSAwOyBcCisJCQl9IFwKKwkJfSBlbHNlIHsgXAorCQkJLyogbV9sbyA+PSBzX2xvICovIFwKKwkJCWlmIChtX2hpIDwgc19oaSkgeyBcCisJCQkJZF9oaSA9IDA7IFwKKwkJCQlkX2xvID0gMDsgXAorCQkJfSBlbHNlIHsgXAorCQkJCS8qIG1faGkgPj0gc19oaSAqLyBcCisJCQkJZF9oaSA9IG1faGkgLSBzX2hpOyBcCisJCQkJZF9sbyA9IG1fbG8gLSBzX2xvOyBcCisJCQl9IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVUERBVEVfU1RBVDY0KHMsIHQpIFwKKwlkbyB7IFwKKwkJRElGRl82NChkaWZmLmhpLCBuZXctPnMjI19oaSwgcHN0YXRzLT5tYWNfc3R4WzBdLnQjI19oaSwgXAorCQkJZGlmZi5sbywgbmV3LT5zIyNfbG8sIHBzdGF0cy0+bWFjX3N0eFswXS50IyNfbG8pOyBcCisJCXBzdGF0cy0+bWFjX3N0eFswXS50IyNfaGkgPSBuZXctPnMjI19oaTsgXAorCQlwc3RhdHMtPm1hY19zdHhbMF0udCMjX2xvID0gbmV3LT5zIyNfbG87IFwKKwkJQUREXzY0KHBzdGF0cy0+bWFjX3N0eFsxXS50IyNfaGksIGRpZmYuaGksIFwKKwkJICAgICAgIHBzdGF0cy0+bWFjX3N0eFsxXS50IyNfbG8sIGRpZmYubG8pOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVUERBVEVfU1RBVDY0X05JRyhzLCB0KSBcCisJZG8geyBcCisJCURJRkZfNjQoZGlmZi5oaSwgbmV3LT5zIyNfaGksIG9sZC0+cyMjX2hpLCBcCisJCQlkaWZmLmxvLCBuZXctPnMjI19sbywgb2xkLT5zIyNfbG8pOyBcCisJCUFERF82NChlc3RhdHMtPnQjI19oaSwgZGlmZi5oaSwgXAorCQkgICAgICAgZXN0YXRzLT50IyNfbG8sIGRpZmYubG8pOyBcCisJfSB3aGlsZSAoMCkKKworLyogc3VtW2hpOmxvXSArPSBhZGQgKi8KKyNkZWZpbmUgQUREX0VYVEVORF82NChzX2hpLCBzX2xvLCBhKSBcCisJZG8geyBcCisJCXNfbG8gKz0gYTsgXAorCQlzX2hpICs9IChzX2xvIDwgYSkgPyAxIDogMDsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQUREX1NUQVQ2NChkaWZmLCB0KSBcCisJZG8geyBcCisJCUFERF82NChwc3RhdHMtPm1hY19zdHhbMV0udCMjX2hpLCBuZXctPmRpZmYjI19oaSwgXAorCQkgICAgICAgcHN0YXRzLT5tYWNfc3R4WzFdLnQjI19sbywgbmV3LT5kaWZmIyNfbG8pOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVUERBVEVfRVhURU5EX1NUQVQocykgXAorCWRvIHsgXAorCQlBRERfRVhURU5EXzY0KHBzdGF0cy0+bWFjX3N0eFsxXS5zIyNfaGksIFwKKwkJCSAgICAgIHBzdGF0cy0+bWFjX3N0eFsxXS5zIyNfbG8sIFwKKwkJCSAgICAgIG5ldy0+cyk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFVQREFURV9FWFRFTkRfVFNUQVQocywgdCkgXAorCWRvIHsgXAorCQlkaWZmID0gbGUzMl90b19jcHUodGNsaWVudC0+cykgLSBsZTMyX3RvX2NwdShvbGRfdGNsaWVudC0+cyk7IFwKKwkJb2xkX3RjbGllbnQtPnMgPSB0Y2xpZW50LT5zOyBcCisJCUFERF9FWFRFTkRfNjQocXN0YXRzLT50IyNfaGksIHFzdGF0cy0+dCMjX2xvLCBkaWZmKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgVVBEQVRFX0VYVEVORF9VU1RBVChzLCB0KSBcCisJZG8geyBcCisJCWRpZmYgPSBsZTMyX3RvX2NwdSh1Y2xpZW50LT5zKSAtIGxlMzJfdG9fY3B1KG9sZF91Y2xpZW50LT5zKTsgXAorCQlvbGRfdWNsaWVudC0+cyA9IHVjbGllbnQtPnM7IFwKKwkJQUREX0VYVEVORF82NChxc3RhdHMtPnQjI19oaSwgcXN0YXRzLT50IyNfbG8sIGRpZmYpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBVUERBVEVfRVhURU5EX1hTVEFUKHMsIHQpIFwKKwlkbyB7IFwKKwkJZGlmZiA9IGxlMzJfdG9fY3B1KHhjbGllbnQtPnMpIC0gbGUzMl90b19jcHUob2xkX3hjbGllbnQtPnMpOyBcCisJCW9sZF94Y2xpZW50LT5zID0geGNsaWVudC0+czsgXAorCQlBRERfRVhURU5EXzY0KHFzdGF0cy0+dCMjX2hpLCBxc3RhdHMtPnQjI19sbywgZGlmZik7IFwKKwl9IHdoaWxlICgwKQorCisvKiBtaW51ZW5kIC09IHN1YnRyYWhlbmQgKi8KKyNkZWZpbmUgU1VCXzY0KG1faGksIHNfaGksIG1fbG8sIHNfbG8pIFwKKwlkbyB7IFwKKwkJRElGRl82NChtX2hpLCBtX2hpLCBzX2hpLCBtX2xvLCBtX2xvLCBzX2xvKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIG1pbnVlbmRbaGk6bG9dIC09IHN1YnRyYWhlbmQgKi8KKyNkZWZpbmUgU1VCX0VYVEVORF82NChtX2hpLCBtX2xvLCBzKSBcCisJZG8geyBcCisJCVNVQl82NChtX2hpLCAwLCBtX2xvLCBzKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU1VCX0VYVEVORF9VU1RBVChzLCB0KSBcCisJZG8geyBcCisJCWRpZmYgPSBsZTMyX3RvX2NwdSh1Y2xpZW50LT5zKSAtIGxlMzJfdG9fY3B1KG9sZF91Y2xpZW50LT5zKTsgXAorCQlTVUJfRVhURU5EXzY0KHFzdGF0cy0+dCMjX2hpLCBxc3RhdHMtPnQjI19sbywgZGlmZik7IFwKKwl9IHdoaWxlICgwKQorCisKKy8qIGZvcndhcmQgKi8KIHN0cnVjdCBibngyeDsKIAogdm9pZCBibngyeF9zdGF0c19pbml0KHN0cnVjdCBibngyeCAqYnApOwogCi1leHRlcm4gY29uc3QgdTMyIGRtYWVfcmVnX2dvX2NbXTsKK3ZvaWQgYm54Mnhfc3RhdHNfaGFuZGxlKHN0cnVjdCBibngyeCAqYnAsIGVudW0gYm54Mnhfc3RhdHNfZXZlbnQgZXZlbnQpOwogCiAjZW5kaWYgLyogQk5YMlhfU1RBVFNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jCmluZGV4IGM3NTM3YWJjLi5hMDQ3ZWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAlpZiAoYm9uZCA9PSBOVUxMKQogCQlyZXR1cm4gQk9ORF9BRF9TVEFCTEU7CiAKLQlyZXR1cm4gQk9ORF9BRF9JTkZPKGJvbmQpLmFnZ19zZWxlY3RfbW9kZTsKKwlyZXR1cm4gYm9uZC0+cGFyYW1zLmFkX3NlbGVjdDsKIH0KIAogLyoqCkBAIC0xODU5LDcgKzE4NTksNiBAQAogdm9pZCBib25kXzNhZF9pbml0aWF0ZV9hZ2dfc2VsZWN0aW9uKHN0cnVjdCBib25kaW5nICpib25kLCBpbnQgdGltZW91dCkKIHsKIAlCT05EX0FEX0lORk8oYm9uZCkuYWdnX3NlbGVjdF90aW1lciA9IHRpbWVvdXQ7Ci0JQk9ORF9BRF9JTkZPKGJvbmQpLmFnZ19zZWxlY3RfbW9kZSA9IGJvbmQtPnBhcmFtcy5hZF9zZWxlY3Q7CiB9CiAKIHN0YXRpYyB1MTYgYWdncmVnYXRvcl9pZGVudGlmaWVyOwpAQCAtMTg2OCwxMSArMTg2NywxMCBAQAogICogYm9uZF8zYWRfaW5pdGlhbGl6ZSAtIGluaXRpYWxpemUgYSBib25kJ3MgODAyLjNhZCBwYXJhbWV0ZXJzIGFuZCBzdHJ1Y3R1cmVzCiAgKiBAYm9uZDogYm9uZGluZyBzdHJ1Y3QgdG8gd29yayBvbgogICogQHRpY2tfcmVzb2x1dGlvbjogdGljayBkdXJhdGlvbiAobWlsbGlzZWNvbmQgcmVzb2x1dGlvbikKLSAqIEBsYWNwX2Zhc3Q6IGJvb2xlYW4uIHdoZXRoZXIgZmFzdCBwZXJpb2RpYyBzaG91bGQgYmUgdXNlZAogICoKICAqIENhbiBiZSBjYWxsZWQgb25seSBhZnRlciB0aGUgbWFjIGFkZHJlc3Mgb2YgdGhlIGJvbmQgaXMgc2V0LgogICovCi12b2lkIGJvbmRfM2FkX2luaXRpYWxpemUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHUxNiB0aWNrX3Jlc29sdXRpb24sIGludCBsYWNwX2Zhc3QpCit2b2lkIGJvbmRfM2FkX2luaXRpYWxpemUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHUxNiB0aWNrX3Jlc29sdXRpb24pCiB7CiAJLy8gY2hlY2sgdGhhdCB0aGUgYm9uZCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0CiAJaWYgKE1BQ19BRERSRVNTX0NPTVBBUkUoJihCT05EX0FEX0lORk8oYm9uZCkuc3lzdGVtLnN5c19tYWNfYWRkciksCkBAIC0xODgwLDcgKzE4NzgsNiBAQAogCiAJCWFnZ3JlZ2F0b3JfaWRlbnRpZmllciA9IDA7CiAKLQkJQk9ORF9BRF9JTkZPKGJvbmQpLmxhY3BfZmFzdCA9IGxhY3BfZmFzdDsKIAkJQk9ORF9BRF9JTkZPKGJvbmQpLnN5c3RlbS5zeXNfcHJpb3JpdHkgPSAweEZGRkY7CiAJCUJPTkRfQURfSU5GTyhib25kKS5zeXN0ZW0uc3lzX21hY19hZGRyID0gKigoc3RydWN0IG1hY19hZGRyICopYm9uZC0+ZGV2LT5kZXZfYWRkcik7CiAKQEAgLTE5MTgsNyArMTkxNSw3IEBACiAJCS8vIHBvcnQgaW5pdGlhbGl6YXRpb24KIAkJcG9ydCA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydCk7CiAKLQkJYWRfaW5pdGlhbGl6ZV9wb3J0KHBvcnQsIEJPTkRfQURfSU5GTyhib25kKS5sYWNwX2Zhc3QpOworCQlhZF9pbml0aWFsaXplX3BvcnQocG9ydCwgYm9uZC0+cGFyYW1zLmxhY3BfZmFzdCk7CiAKIAkJcG9ydC0+c2xhdmUgPSBzbGF2ZTsKIAkJcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIgPSBTTEFWRV9BRF9JTkZPKHNsYXZlKS5pZDsKQEAgLTIzNDUsOCArMjM0MiwxNyBAQAogICovCiBpbnQgYm9uZF8zYWRfc2V0X2NhcnJpZXIoc3RydWN0IGJvbmRpbmcgKmJvbmQpCiB7Ci0JaWYgKF9fZ2V0X2FjdGl2ZV9hZ2coJihTTEFWRV9BRF9JTkZPKGJvbmQtPmZpcnN0X3NsYXZlKS5hZ2dyZWdhdG9yKSkpIHsKLQkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGJvbmQtPmRldikpIHsKKwlzdHJ1Y3QgYWdncmVnYXRvciAqYWN0aXZlOworCisJYWN0aXZlID0gX19nZXRfYWN0aXZlX2FnZygmKFNMQVZFX0FEX0lORk8oYm9uZC0+Zmlyc3Rfc2xhdmUpLmFnZ3JlZ2F0b3IpKTsKKwlpZiAoYWN0aXZlKSB7CisJCS8qIGFyZSBlbm91Z2ggc2xhdmVzIGF2YWlsYWJsZSB0byBjb25zaWRlciBsaW5rIHVwPyAqLworCQlpZiAoYWN0aXZlLT5udW1fb2ZfcG9ydHMgPCBib25kLT5wYXJhbXMubWluX2xpbmtzKSB7CisJCQlpZiAobmV0aWZfY2Fycmllcl9vayhib25kLT5kZXYpKSB7CisJCQkJbmV0aWZfY2Fycmllcl9vZmYoYm9uZC0+ZGV2KTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfSBlbHNlIGlmICghbmV0aWZfY2Fycmllcl9vayhib25kLT5kZXYpKSB7CiAJCQluZXRpZl9jYXJyaWVyX29uKGJvbmQtPmRldik7CiAJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMjQ3MywzICsyNDc5LDM0IEBACiAJYm9uZF8zYWRfcnhfaW5kaWNhdGlvbigoc3RydWN0IGxhY3BkdSAqKSBza2ItPmRhdGEsIHNsYXZlLCBza2ItPmxlbik7CiAJcmVhZF91bmxvY2soJmJvbmQtPmxvY2spOwogfQorCisvKgorICogV2hlbiBtb2RpZnkgbGFjcF9yYXRlIHBhcmFtZXRlciB2aWEgc3lzZnMsCisgKiB1cGRhdGUgYWN0b3Jfb3Blcl9wb3J0X3N0YXRlIG9mIGVhY2ggcG9ydC4KKyAqCisgKiBIb2xkIHNsYXZlLT5zdGF0ZV9tYWNoaW5lX2xvY2ssCisgKiBzbyB3ZSBjYW4gbW9kaWZ5IHBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSwKKyAqIG5vIG1hdHRlciBib25kIGlzIHVwIG9yIGRvd24uCisgKi8KK3ZvaWQgYm9uZF8zYWRfdXBkYXRlX2xhY3BfcmF0ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOworCXN0cnVjdCBwb3J0ICpwb3J0ID0gTlVMTDsKKwlpbnQgbGFjcF9mYXN0OworCisJcmVhZF9sb2NrKCZib25kLT5sb2NrKTsKKwlsYWNwX2Zhc3QgPSBib25kLT5wYXJhbXMubGFjcF9mYXN0OworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlwb3J0ID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0KTsKKwkJX19nZXRfc3RhdGVfbWFjaGluZV9sb2NrKHBvcnQpOworCQlpZiAobGFjcF9mYXN0KQorCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlIHw9IEFEX1NUQVRFX0xBQ1BfVElNRU9VVDsKKwkJZWxzZQorCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9MQUNQX1RJTUVPVVQ7CisJCV9fcmVsZWFzZV9zdGF0ZV9tYWNoaW5lX2xvY2socG9ydCk7CisJfQorCisJcmVhZF91bmxvY2soJmJvbmQtPmxvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5oIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5oCmluZGV4IDBlZTNmMTYuLjIzNWIyY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuaAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmgKQEAgLTI1MywxMSArMjUzLDYgQEAKIHN0cnVjdCBhZF9ib25kX2luZm8gewogCXN0cnVjdCBhZF9zeXN0ZW0gc3lzdGVtOwkgICAgLyogODAyLjNhZCBzeXN0ZW0gc3RydWN0dXJlICovCiAJdTMyIGFnZ19zZWxlY3RfdGltZXI7CSAgICAvLyBUaW1lciB0byBzZWxlY3QgYWdncmVnYXRvciBhZnRlciBhbGwgYWRhcHRlcidzIGhhbmQgc2hha2VzCi0JdTMyIGFnZ19zZWxlY3RfbW9kZTsJICAgIC8vIE1vZGUgb2Ygc2VsZWN0aW9uIG9mIGFjdGl2ZSBhZ2dyZWdhdG9yKGJhbmR3aWR0aC9jb3VudCkKLQlpbnQgbGFjcF9mYXN0OwkJLyogd2hldGhlciBmYXN0IHBlcmlvZGljIHR4IHNob3VsZCBiZQotCQkJCSAqIHJlcXVlc3RlZAotCQkJCSAqLwotCXN0cnVjdCB0aW1lcl9saXN0IGFkX3RpbWVyOwogfTsKIAogc3RydWN0IGFkX3NsYXZlX2luZm8gewpAQCAtMjY5LDcgKzI2NCw3IEBACiB9OwogCiAvLyA9PT09PT09PT09PT09PT09PSBBRCBFeHBvcnRlZCBmdW5jdGlvbnMgdG8gdGhlIG1haW4gYm9uZGluZyBjb2RlID09PT09PT09PT09PT09PT09PQotdm9pZCBib25kXzNhZF9pbml0aWFsaXplKHN0cnVjdCBib25kaW5nICpib25kLCB1MTYgdGlja19yZXNvbHV0aW9uLCBpbnQgbGFjcF9mYXN0KTsKK3ZvaWQgYm9uZF8zYWRfaW5pdGlhbGl6ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgdTE2IHRpY2tfcmVzb2x1dGlvbik7CiBpbnQgIGJvbmRfM2FkX2JpbmRfc2xhdmUoc3RydWN0IHNsYXZlICpzbGF2ZSk7CiB2b2lkIGJvbmRfM2FkX3VuYmluZF9zbGF2ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKTsKIHZvaWQgYm9uZF8zYWRfc3RhdGVfbWFjaGluZV9oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKQEAgLTI4Miw1ICsyNzcsNiBAQAogdm9pZCBib25kXzNhZF9sYWNwZHVfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYm9uZGluZyAqYm9uZCwKIAkJCSAgc3RydWN0IHNsYXZlICpzbGF2ZSk7CiBpbnQgYm9uZF8zYWRfc2V0X2NhcnJpZXIoc3RydWN0IGJvbmRpbmcgKmJvbmQpOwordm9pZCBib25kXzNhZF91cGRhdGVfbGFjcF9yYXRlKHN0cnVjdCBib25kaW5nICpib25kKTsKICNlbmRpZiAvL19fQk9ORF8zQURfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwppbmRleCAyZGY5Mjc2Li43ZjhiMjBhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwpAQCAtNjM1LDcgKzYzNSw3IEBACiAJCQljbGllbnRfaW5mby0+bnR0ID0gMDsKIAkJfQogCi0JCWlmIChib25kLT52bGdycCkgeworCQlpZiAoYm9uZF92bGFuX3VzZWQoYm9uZCkpIHsKIAkJCWlmICghdmxhbl9nZXRfdGFnKHNrYiwgJmNsaWVudF9pbmZvLT52bGFuX2lkKSkKIAkJCQljbGllbnRfaW5mby0+dGFnID0gMTsKIAkJfQpAQCAtODQ3LDcgKzg0Nyw3IEBACiAJCXNrYi0+cHJpb3JpdHkgPSBUQ19QUklPX0NPTlRST0w7CiAJCXNrYi0+ZGV2ID0gc2xhdmUtPmRldjsKIAotCQlpZiAoYm9uZC0+dmxncnApIHsKKwkJaWYgKGJvbmRfdmxhbl91c2VkKGJvbmQpKSB7CiAJCQlzdHJ1Y3Qgdmxhbl9lbnRyeSAqdmxhbjsKIAogCQkJdmxhbiA9IGJvbmRfbmV4dF92bGFuKGJvbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfaXB2Ni5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2lwdjYuYwppbmRleCA4NGZiZDRlLi4wMjdhMGVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfaXB2Ni5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9pcHY2LmMKQEAgLTE4MywxMCArMTgzLDEwIEBACiAJCX0KIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgewotCQkJaWYgKCFib25kLT52bGdycCkKLQkJCQljb250aW51ZTsKLQkJCXZsYW5fZGV2ID0gdmxhbl9ncm91cF9nZXRfZGV2aWNlKGJvbmQtPnZsZ3JwLAotCQkJCQkJCSB2bGFuLT52bGFuX2lkKTsKKwkJCXJjdV9yZWFkX2xvY2soKTsKKwkJCXZsYW5fZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXAoYm9uZC0+ZGV2LAorCQkJCQkJCXZsYW4tPnZsYW5faWQpOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlpZiAodmxhbl9kZXYgPT0gZXZlbnRfZGV2KSB7CiAJCQkJc3dpdGNoIChldmVudCkgewogCQkJCWNhc2UgTkVUREVWX1VQOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggMTdiNGRkOS4uMDI4NDJkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC05OCw2ICs5OCw3IEBACiBzdGF0aWMgY2hhciAqcHJpbWFyeTsKIHN0YXRpYyBjaGFyICpwcmltYXJ5X3Jlc2VsZWN0Owogc3RhdGljIGNoYXIgKmxhY3BfcmF0ZTsKK3N0YXRpYyBpbnQgbWluX2xpbmtzOwogc3RhdGljIGNoYXIgKmFkX3NlbGVjdDsKIHN0YXRpYyBjaGFyICp4bWl0X2hhc2hfcG9saWN5Owogc3RhdGljIGludCBhcnBfaW50ZXJ2YWwgPSBCT05EX0xJTktfQVJQX0lOVEVSVjsKQEAgLTE1MCw2ICsxNTEsOSBAQAogTU9EVUxFX1BBUk1fREVTQyhhZF9zZWxlY3QsICI4MDMuYWQgYWdncmVnYXRpb24gc2VsZWN0aW9uIGxvZ2ljOyAiCiAJCQkgICAgIjAgZm9yIHN0YWJsZSAoZGVmYXVsdCksIDEgZm9yIGJhbmR3aWR0aCwgIgogCQkJICAgICIyIGZvciBjb3VudCIpOworbW9kdWxlX3BhcmFtKG1pbl9saW5rcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWluX2xpbmtzLCAiTWluaW11bSBudW1iZXIgb2YgYXZhaWxhYmxlIGxpbmtzIGJlZm9yZSB0dXJuaW5nIG9uIGNhcnJpZXIiKTsKKwogbW9kdWxlX3BhcmFtKHhtaXRfaGFzaF9wb2xpY3ksIGNoYXJwLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoeG1pdF9oYXNoX3BvbGljeSwgImJhbGFuY2UteG9yIGFuZCA4MDIuM2FkIGhhc2hpbmcgbWV0aG9kOyAiCiAJCQkJICAgIjAgZm9yIGxheWVyIDIgKGRlZmF1bHQpLCAxIGZvciBsYXllciAzKzQsICIKQEAgLTMyOSwxNiArMzMzLDYgQEAKIAogCQkJa2ZyZWUodmxhbik7CiAKLQkJCWlmIChsaXN0X2VtcHR5KCZib25kLT52bGFuX2xpc3QpICYmCi0JCQkgICAgKGJvbmQtPnNsYXZlX2NudCA9PSAwKSkgewotCQkJCS8qIExhc3QgVkxBTiByZW1vdmVkIGFuZCBubyBzbGF2ZXMsIHNvCi0JCQkJICogcmVzdG9yZSBibG9jayBvbiBhZGRpbmcgVkxBTnMuIFRoaXMgd2lsbAotCQkJCSAqIGJlIHJlbW92ZWQgb25jZSBuZXcgc2xhdmVzIHRoYXQgYXJlIG5vdAotCQkJCSAqIFZMQU4gY2hhbGxlbmdlZCB3aWxsIGJlIGFkZGVkLgotCQkJCSAqLwotCQkJCWJvbmQtPmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQ7Ci0JCQl9Ci0KIAkJCXJlcyA9IDA7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMzg4LDYgKzM4Miw4IEBACiAJcmV0dXJuIG5leHQ7CiB9CiAKKyNkZWZpbmUgYm9uZF9xdWV1ZV9tYXBwaW5nKHNrYikgKCoodTE2ICopKChza2IpLT5jYikpCisKIC8qKgogICogYm9uZF9kZXZfcXVldWVfeG1pdCAtIFByZXBhcmUgc2tiIGZvciB4bWl0LgogICoKQEAgLTQwMCw2ICszOTYsOSBAQAogewogCXNrYi0+ZGV2ID0gc2xhdmVfZGV2OwogCXNrYi0+cHJpb3JpdHkgPSAxOworCisJc2tiLT5xdWV1ZV9tYXBwaW5nID0gYm9uZF9xdWV1ZV9tYXBwaW5nKHNrYik7CisKIAlpZiAodW5saWtlbHkobmV0cG9sbF90eF9ydW5uaW5nKHNsYXZlX2RldikpKQogCQlib25kX25ldHBvbGxfc2VuZF9za2IoYm9uZF9nZXRfc2xhdmVfYnlfZGV2KGJvbmQsIHNsYXZlX2RldiksIHNrYik7CiAJZWxzZQpAQCAtNDA5LDkgKzQwOCw4IEBACiB9CiAKIC8qCi0gKiBJbiB0aGUgZm9sbG93aW5nIDMgZnVuY3Rpb25zLCBib25kX3ZsYW5fcnhfcmVnaXN0ZXIoKSwgYm9uZF92bGFuX3J4X2FkZF92aWQKLSAqIGFuZCBib25kX3ZsYW5fcnhfa2lsbF92aWQsIFdlIGRvbid0IHByb3RlY3QgdGhlIHNsYXZlIGxpc3QgaXRlcmF0aW9uIHdpdGggYQotICogbG9jayBiZWNhdXNlOgorICogSW4gdGhlIGZvbGxvd2luZyAyIGZ1bmN0aW9ucywgYm9uZF92bGFuX3J4X2FkZF92aWQgYW5kIGJvbmRfdmxhbl9yeF9raWxsX3ZpZCwKKyAqIFdlIGRvbid0IHByb3RlY3QgdGhlIHNsYXZlIGxpc3QgaXRlcmF0aW9uIHdpdGggYSBsb2NrIGJlY2F1c2U6CiAgKiBhLiBUaGlzIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgaW4gSU9DVEwgY29udGV4dCwKICAqIGIuIFRoZSBvcGVyYXRpb24gaXMgcHJvdGVjdGVkIGJ5IHRoZSBSVE5MIHNlbWFwaG9yZSBpbiB0aGUgODAyMXEgY29kZSwKICAqIGMuIEhvbGRpbmcgYSBsb2NrIHdpdGggQkggZGlzYWJsZWQgd2hpbGUgZGlyZWN0bHkgY2FsbGluZyBhIGJhc2UgZHJpdmVyCkBAIC00MjcsMzMgKzQyNSw2IEBACiAqLwogCiAvKioKLSAqIGJvbmRfdmxhbl9yeF9yZWdpc3RlciAtIFByb3BhZ2F0ZXMgcmVnaXN0cmF0aW9uIHRvIHNsYXZlcwotICogQGJvbmRfZGV2OiBib25kaW5nIG5ldCBkZXZpY2UgdGhhdCBnb3QgY2FsbGVkCi0gKiBAZ3JwOiB2bGFuIGdyb3VwIGJlaW5nIHJlZ2lzdGVyZWQKLSAqLwotc3RhdGljIHZvaWQgYm9uZF92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiwKLQkJCQkgIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBuZXRkZXZfcHJpdihib25kX2Rldik7Ci0Jc3RydWN0IHNsYXZlICpzbGF2ZTsKLQlpbnQgaTsKLQotCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOwotCWJvbmQtPnZsZ3JwID0gZ3JwOwotCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7Ci0KLQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYgPSBzbGF2ZS0+ZGV2OwotCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKnNsYXZlX29wcyA9IHNsYXZlX2Rldi0+bmV0ZGV2X29wczsKLQotCQlpZiAoKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpICYmCi0JCSAgICBzbGF2ZV9vcHMtPm5kb192bGFuX3J4X3JlZ2lzdGVyKSB7Ci0JCQlzbGF2ZV9vcHMtPm5kb192bGFuX3J4X3JlZ2lzdGVyKHNsYXZlX2RldiwgZ3JwKTsKLQkJfQotCX0KLX0KLQotLyoqCiAgKiBib25kX3ZsYW5fcnhfYWRkX3ZpZCAtIFByb3BhZ2F0ZXMgYWRkaW5nIGFuIGlkIHRvIHNsYXZlcwogICogQGJvbmRfZGV2OiBib25kaW5nIG5ldCBkZXZpY2UgdGhhdCBnb3QgY2FsbGVkCiAgKiBAdmlkOiB2bGFuIGlkIGJlaW5nIGFkZGVkCkBAIC00OTAsNyArNDYxLDYgQEAKIHsKIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IG5ldGRldl9wcml2KGJvbmRfZGV2KTsKIAlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOwotCXN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2RldjsKIAlpbnQgaSwgcmVzOwogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgewpAQCAtNDk5LDEyICs0NjksNyBAQAogCiAJCWlmICgoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpICYmCiAJCSAgICBzbGF2ZV9vcHMtPm5kb192bGFuX3J4X2tpbGxfdmlkKSB7Ci0JCQkvKiBTYXZlIGFuZCB0aGVuIHJlc3RvcmUgdmxhbl9kZXYgaW4gdGhlIGdycCBhcnJheSwKLQkJCSAqIHNpbmNlIHRoZSBzbGF2ZSdzIGRyaXZlciBtaWdodCBjbGVhciBpdC4KLQkJCSAqLwotCQkJdmxhbl9kZXYgPSB2bGFuX2dyb3VwX2dldF9kZXZpY2UoYm9uZC0+dmxncnAsIHZpZCk7CiAJCQlzbGF2ZV9vcHMtPm5kb192bGFuX3J4X2tpbGxfdmlkKHNsYXZlX2RldiwgdmlkKTsKLQkJCXZsYW5fZ3JvdXBfc2V0X2RldmljZShib25kLT52bGdycCwgdmlkLCB2bGFuX2Rldik7CiAJCX0KIAl9CiAKQEAgLTUyMCwxMyArNDg1LDYgQEAKIAlzdHJ1Y3Qgdmxhbl9lbnRyeSAqdmxhbjsKIAljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKnNsYXZlX29wcyA9IHNsYXZlX2Rldi0+bmV0ZGV2X29wczsKIAotCWlmICghYm9uZC0+dmxncnApCi0JCXJldHVybjsKLQotCWlmICgoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkgJiYKLQkgICAgc2xhdmVfb3BzLT5uZG9fdmxhbl9yeF9yZWdpc3RlcikKLQkJc2xhdmVfb3BzLT5uZG9fdmxhbl9yeF9yZWdpc3RlcihzbGF2ZV9kZXYsIGJvbmQtPnZsZ3JwKTsKLQogCWlmICghKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKSB8fAogCSAgICAhKHNsYXZlX29wcy0+bmRvX3ZsYW5fcnhfYWRkX3ZpZCkpCiAJCXJldHVybjsKQEAgLTU0MCwzMCArNDk4LDE2IEBACiB7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpzbGF2ZV9vcHMgPSBzbGF2ZV9kZXYtPm5ldGRldl9vcHM7CiAJc3RydWN0IHZsYW5fZW50cnkgKnZsYW47Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZGV2OwotCi0JaWYgKCFib25kLT52bGdycCkKLQkJcmV0dXJuOwogCiAJaWYgKCEoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpIHx8CiAJICAgICEoc2xhdmVfb3BzLT5uZG9fdmxhbl9yeF9raWxsX3ZpZCkpCi0JCWdvdG8gdW5yZWc7CisJCXJldHVybjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodmxhbiwgJmJvbmQtPnZsYW5fbGlzdCwgdmxhbl9saXN0KSB7CiAJCWlmICghdmxhbi0+dmxhbl9pZCkKIAkJCWNvbnRpbnVlOwotCQkvKiBTYXZlIGFuZCB0aGVuIHJlc3RvcmUgdmxhbl9kZXYgaW4gdGhlIGdycCBhcnJheSwKLQkJICogc2luY2UgdGhlIHNsYXZlJ3MgZHJpdmVyIG1pZ2h0IGNsZWFyIGl0LgotCQkgKi8KLQkJdmxhbl9kZXYgPSB2bGFuX2dyb3VwX2dldF9kZXZpY2UoYm9uZC0+dmxncnAsIHZsYW4tPnZsYW5faWQpOwogCQlzbGF2ZV9vcHMtPm5kb192bGFuX3J4X2tpbGxfdmlkKHNsYXZlX2Rldiwgdmxhbi0+dmxhbl9pZCk7Ci0JCXZsYW5fZ3JvdXBfc2V0X2RldmljZShib25kLT52bGdycCwgdmxhbi0+dmxhbl9pZCwgdmxhbl9kZXYpOwogCX0KLQotdW5yZWc6Ci0JaWYgKChzbGF2ZV9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKSAmJgotCSAgICBzbGF2ZV9vcHMtPm5kb192bGFuX3J4X3JlZ2lzdGVyKQotCQlzbGF2ZV9vcHMtPm5kb192bGFuX3J4X3JlZ2lzdGVyKHNsYXZlX2RldiwgTlVMTCk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaW5rIHN0YXR1cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTYyOSwxNSArNTczLDggQEAKIAkJcmV0dXJuIC0xOwogCiAJc2xhdmVfc3BlZWQgPSBldGh0b29sX2NtZF9zcGVlZCgmZXRvb2wpOwotCXN3aXRjaCAoc2xhdmVfc3BlZWQpIHsKLQljYXNlIFNQRUVEXzEwOgotCWNhc2UgU1BFRURfMTAwOgotCWNhc2UgU1BFRURfMTAwMDoKLQljYXNlIFNQRUVEXzEwMDAwOgotCQlicmVhazsKLQlkZWZhdWx0OgorCWlmIChzbGF2ZV9zcGVlZCA9PSAwIHx8IHNsYXZlX3NwZWVkID09ICgoX191MzIpIC0xKSkKIAkJcmV0dXJuIC0xOwotCX0KIAogCXN3aXRjaCAoZXRvb2wuZHVwbGV4KSB7CiAJY2FzZSBEVVBMRVhfRlVMTDoKQEAgLTg0NCwxMyArNzgxLDEzIEBACiAJX19ib25kX3Jlc2VuZF9pZ21wX2pvaW5fcmVxdWVzdHMoYm9uZC0+ZGV2KTsKIAogCS8qIHJlam9pbiBhbGwgZ3JvdXBzIG9uIHZsYW4gZGV2aWNlcyAqLwotCWlmIChib25kLT52bGdycCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgewotCQkJdmxhbl9kZXYgPSB2bGFuX2dyb3VwX2dldF9kZXZpY2UoYm9uZC0+dmxncnAsCi0JCQkJCQkJIHZsYW4tPnZsYW5faWQpOwotCQkJaWYgKHZsYW5fZGV2KQotCQkJCV9fYm9uZF9yZXNlbmRfaWdtcF9qb2luX3JlcXVlc3RzKHZsYW5fZGV2KTsKLQkJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkodmxhbiwgJmJvbmQtPnZsYW5fbGlzdCwgdmxhbl9saXN0KSB7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJdmxhbl9kZXYgPSBfX3ZsYW5fZmluZF9kZXZfZGVlcChib25kLT5kZXYsCisJCQkJCQl2bGFuLT52bGFuX2lkKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWlmICh2bGFuX2RldikKKwkJCV9fYm9uZF9yZXNlbmRfaWdtcF9qb2luX3JlcXVlc3RzKHZsYW5fZGV2KTsKIAl9CiAKIAlpZiAoLS1ib25kLT5pZ21wX3JldHJhbnMgPiAwKQpAQCAtMTI5Miw2ICsxMjI5LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlucC0+ZGV2ID0gc2xhdmUtPmRldjsKKwlzdHJsY3B5KG5wLT5kZXZfbmFtZSwgc2xhdmUtPmRldi0+bmFtZSwgSUZOQU1TSVopOwogCWVyciA9IF9fbmV0cG9sbF9zZXR1cChucCk7CiAJaWYgKGVycikgewogCQlrZnJlZShucCk7CkBAIC0xNDIyLDkgKzEzNjAsOSBAQAogCXJldHVybiBmZWF0dXJlczsKIH0KIAotI2RlZmluZSBCT05EX1ZMQU5fRkVBVFVSRVMJKE5FVElGX0ZfQUxMX1RYX09GRkxPQURTIHwgXAotCQkJCSBORVRJRl9GX1NPRlRfRkVBVFVSRVMgfCBcCi0JCQkJIE5FVElGX0ZfTFJPKQorI2RlZmluZSBCT05EX1ZMQU5fRkVBVFVSRVMJKE5FVElGX0ZfQUxMX0NTVU0gfCBORVRJRl9GX1NHIHwgXAorCQkJCSBORVRJRl9GX0ZSQUdMSVNUIHwgTkVUSUZfRl9BTExfVFNPIHwgXAorCQkJCSBORVRJRl9GX0hJR0hETUEgfCBORVRJRl9GX0xSTykKIAogc3RhdGljIHZvaWQgYm9uZF9jb21wdXRlX2ZlYXR1cmVzKHN0cnVjdCBib25kaW5nICpib25kKQogewpAQCAtMTU2NCw3ICsxNTAyLDcgQEAKIAkvKiBubyBuZWVkIHRvIGxvY2sgc2luY2Ugd2UncmUgcHJvdGVjdGVkIGJ5IHJ0bmxfbG9jayAqLwogCWlmIChzbGF2ZV9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQpIHsKIAkJcHJfZGVidWcoIiVzOiBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRFxuIiwgc2xhdmVfZGV2LT5uYW1lKTsKLQkJaWYgKGJvbmQtPnZsZ3JwKSB7CisJCWlmIChib25kX3ZsYW5fdXNlZChib25kKSkgewogCQkJcHJfZXJyKCIlczogRXJyb3I6IGNhbm5vdCBlbnNsYXZlIFZMQU4gY2hhbGxlbmdlZCBzbGF2ZSAlcyBvbiBWTEFOIGVuYWJsZWQgYm9uZCAlc1xuIiwKIAkJCSAgICAgICBib25kX2Rldi0+bmFtZSwgc2xhdmVfZGV2LT5uYW1lLCBib25kX2Rldi0+bmFtZSk7CiAJCQlyZXR1cm4gLUVQRVJNOwpAQCAtMTg1MCw4ICsxNzg4LDcgQEAKIAkJCS8qIEluaXRpYWxpemUgQUQgd2l0aCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIEFEIHRpbWVyIGlzIGNhbGxlZCBpbiAxIHNlY29uZAogCQkJICogY2FuIGJlIGNhbGxlZCBvbmx5IGFmdGVyIHRoZSBtYWMgYWRkcmVzcyBvZiB0aGUgYm9uZCBpcyBzZXQKIAkJCSAqLwotCQkJYm9uZF8zYWRfaW5pdGlhbGl6ZShib25kLCAxMDAwL0FEX1RJTUVSX0lOVEVSVkFMLAotCQkJCQkgICAgYm9uZC0+cGFyYW1zLmxhY3BfZmFzdCk7CisJCQlib25kXzNhZF9pbml0aWFsaXplKGJvbmQsIDEwMDAvQURfVElNRVJfSU5URVJWQUwpOwogCQl9IGVsc2UgewogCQkJU0xBVkVfQURfSU5GTyhuZXdfc2xhdmUpLmlkID0KIAkJCQlTTEFWRV9BRF9JTkZPKG5ld19zbGF2ZS0+cHJldikuaWQgKyAxOwpAQCAtMjA3Myw3ICsyMDEwLDcgQEAKIAkJICovCiAJCW1lbXNldChib25kX2Rldi0+ZGV2X2FkZHIsIDAsIGJvbmRfZGV2LT5hZGRyX2xlbik7CiAKLQkJaWYgKGJvbmQtPnZsZ3JwKSB7CisJCWlmIChib25kX3ZsYW5fdXNlZChib25kKSkgewogCQkJcHJfd2FybmluZygiJXM6IFdhcm5pbmc6IGNsZWFyaW5nIEhXIGFkZHJlc3Mgb2YgJXMgd2hpbGUgaXQgc3RpbGwgaGFzIFZMQU5zLlxuIiwKIAkJCQkgICBib25kX2Rldi0+bmFtZSwgYm9uZF9kZXYtPm5hbWUpOwogCQkJcHJfd2FybmluZygiJXM6IFdoZW4gcmUtYWRkaW5nIHNsYXZlcywgbWFrZSBzdXJlIHRoZSBib25kJ3MgSFcgYWRkcmVzcyBtYXRjaGVzIGl0cyBWTEFOcycuXG4iLApAQCAtMjI1NSw3ICsyMTkyLDcgQEAKIAkgKi8KIAltZW1zZXQoYm9uZF9kZXYtPmRldl9hZGRyLCAwLCBib25kX2Rldi0+YWRkcl9sZW4pOwogCi0JaWYgKGJvbmQtPnZsZ3JwKSB7CisJaWYgKGJvbmRfdmxhbl91c2VkKGJvbmQpKSB7CiAJCXByX3dhcm5pbmcoIiVzOiBXYXJuaW5nOiBjbGVhcmluZyBIVyBhZGRyZXNzIG9mICVzIHdoaWxlIGl0IHN0aWxsIGhhcyBWTEFOcy5cbiIsCiAJCQkgICBib25kX2Rldi0+bmFtZSwgYm9uZF9kZXYtPm5hbWUpOwogCQlwcl93YXJuaW5nKCIlczogV2hlbiByZS1hZGRpbmcgc2xhdmVzLCBtYWtlIHN1cmUgdGhlIGJvbmQncyBIVyBhZGRyZXNzIG1hdGNoZXMgaXRzIFZMQU5zJy5cbiIsCkBAIC0yNjkzLDcgKzI2MzAsNyBAQAogCQlpZiAoIXRhcmdldHNbaV0pCiAJCQlicmVhazsKIAkJcHJfZGVidWcoImJhc2E6IHRhcmdldCAleFxuIiwgdGFyZ2V0c1tpXSk7Ci0JCWlmICghYm9uZC0+dmxncnApIHsKKwkJaWYgKCFib25kX3ZsYW5fdXNlZChib25kKSkgewogCQkJcHJfZGVidWcoImJhc2E6IGVtcHR5IHZsYW46IGFycF9zZW5kXG4iKTsKIAkJCWJvbmRfYXJwX3NlbmQoc2xhdmUtPmRldiwgQVJQT1BfUkVRVUVTVCwgdGFyZ2V0c1tpXSwKIAkJCQkgICAgICBib25kLT5tYXN0ZXJfaXAsIDApOwpAQCAtMjcyOCw3ICsyNjY1LDEwIEBACiAKIAkJdmxhbl9pZCA9IDA7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodmxhbiwgJmJvbmQtPnZsYW5fbGlzdCwgdmxhbl9saXN0KSB7Ci0JCQl2bGFuX2RldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZShib25kLT52bGdycCwgdmxhbi0+dmxhbl9pZCk7CisJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQl2bGFuX2RldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwKGJvbmQtPmRldiwKKwkJCQkJCQl2bGFuLT52bGFuX2lkKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJaWYgKHZsYW5fZGV2ID09IHJ0LT5kc3QuZGV2KSB7CiAJCQkJdmxhbl9pZCA9IHZsYW4tPnZsYW5faWQ7CiAJCQkJcHJfZGVidWcoImJhc2E6IHZsYW4gbWF0Y2ggb24gJXMgJWRcbiIsCkBAIC0zMzg5LDkgKzMzMjksOCBAQAogCQl9CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bGFuLCAmYm9uZC0+dmxhbl9saXN0LCB2bGFuX2xpc3QpIHsKLQkJCWlmICghYm9uZC0+dmxncnApCi0JCQkJY29udGludWU7Ci0JCQl2bGFuX2RldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZShib25kLT52bGdycCwgdmxhbi0+dmxhbl9pZCk7CisJCQl2bGFuX2RldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwKGJvbmQtPmRldiwKKwkJCQkJCQl2bGFuLT52bGFuX2lkKTsKIAkJCWlmICh2bGFuX2RldiA9PSBldmVudF9kZXYpIHsKIAkJCQlzd2l0Y2ggKGV2ZW50KSB7CiAJCQkJY2FzZSBORVRERVZfVVA6CkBAIC0zNDUwLDcgKzMzODksNyBAQAogCWludCBsYXllcjRfeG9yID0gMDsKIAogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgewotCQlpZiAoIShpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkgJiYKKwkJaWYgKCFpcF9pc19mcmFnbWVudChpcGgpICYmCiAJCSAgICAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCB8fAogCQkgICAgIGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApKSB7CiAJCQlsYXllcjRfeG9yID0gbnRvaHMoKCpsYXllcjRoZHIgXiAqKGxheWVyNGhkciArIDEpKSk7CkBAIC00MjA2LDYgKzQxNDUsNyBAQAogCXJldHVybiByZXM7CiB9CiAKKwogc3RhdGljIHUxNiBib25kX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCS8qCkBAIC00MjE2LDYgKzQxNTYsMTEgQEAKIAkgKi8KIAl1MTYgdHhxID0gc2tiX3J4X3F1ZXVlX3JlY29yZGVkKHNrYikgPyBza2JfZ2V0X3J4X3F1ZXVlKHNrYikgOiAwOwogCisJLyoKKwkgKiBTYXZlIHRoZSBvcmlnaW5hbCB0eHEgdG8gcmVzdG9yZSBiZWZvcmUgcGFzc2luZyB0byB0aGUgZHJpdmVyCisJICovCisJYm9uZF9xdWV1ZV9tYXBwaW5nKHNrYikgPSBza2ItPnF1ZXVlX21hcHBpbmc7CisKIAlpZiAodW5saWtlbHkodHhxID49IGRldi0+cmVhbF9udW1fdHhfcXVldWVzKSkgewogCQlkbyB7CiAJCQl0eHEgLT0gZGV2LT5yZWFsX251bV90eF9xdWV1ZXM7CkBAIC00MzM3LDEwICs0MjgyLDkgQEAKIAkubmRvX2RvX2lvY3RsCQk9IGJvbmRfZG9faW9jdGwsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBib25kX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gYm9uZF9jaGFuZ2VfbXR1LAotCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGJvbmRfc2V0X21hY19hZGRyZXNzLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gYm9uZF9zZXRfbWFjX2FkZHJlc3MsCiAJLm5kb19uZWlnaF9zZXR1cAk9IGJvbmRfbmVpZ2hfc2V0dXAsCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gYm9uZF92bGFuX3J4X3JlZ2lzdGVyLAotCS5uZG9fdmxhbl9yeF9hZGRfdmlkIAk9IGJvbmRfdmxhbl9yeF9hZGRfdmlkLAorCS5uZG9fdmxhbl9yeF9hZGRfdmlkCT0gYm9uZF92bGFuX3J4X2FkZF92aWQsCiAJLm5kb192bGFuX3J4X2tpbGxfdmlkCT0gYm9uZF92bGFuX3J4X2tpbGxfdmlkLAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19uZXRwb2xsX3NldHVwCT0gYm9uZF9uZXRwb2xsX3NldHVwLApAQCAtNDgwNCw2ICs0NzQ4LDcgQEAKIAlwYXJhbXMtPnR4X3F1ZXVlcyA9IHR4X3F1ZXVlczsKIAlwYXJhbXMtPmFsbF9zbGF2ZXNfYWN0aXZlID0gYWxsX3NsYXZlc19hY3RpdmU7CiAJcGFyYW1zLT5yZXNlbmRfaWdtcCA9IHJlc2VuZF9pZ21wOworCXBhcmFtcy0+bWluX2xpbmtzID0gbWluX2xpbmtzOwogCiAJaWYgKHByaW1hcnkpIHsKIAkJc3RybmNweShwYXJhbXMtPnByaW1hcnksIHByaW1hcnksIElGTkFNU0laKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9wcm9jZnMuYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9wcm9jZnMuYwppbmRleCBjOTczMDdkLi45NWRlOTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfcHJvY2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3Byb2Nmcy5jCkBAIC0xMjUsNiArMTI1LDcgQEAKIAkJc2VxX3B1dHMoc2VxLCAiXG44MDIuM2FkIGluZm9cbiIpOwogCQlzZXFfcHJpbnRmKHNlcSwgIkxBQ1AgcmF0ZTogJXNcbiIsCiAJCQkgICAoYm9uZC0+cGFyYW1zLmxhY3BfZmFzdCkgPyAiZmFzdCIgOiAic2xvdyIpOworCQlzZXFfcHJpbnRmKHNlcSwgIk1pbiBsaW5rczogJWRcbiIsIGJvbmQtPnBhcmFtcy5taW5fbGlua3MpOwogCQlzZXFfcHJpbnRmKHNlcSwgIkFnZ3JlZ2F0b3Igc2VsZWN0aW9uIHBvbGljeSAoYWRfc2VsZWN0KTogJXNcbiIsCiAJCQkgICBhZF9zZWxlY3RfdGJsW2JvbmQtPnBhcmFtcy5hZF9zZWxlY3RdLm1vZGVuYW1lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3N5c2ZzLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwppbmRleCA4OGZjYjI1Li5iNjA4MzVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwpAQCAtODA0LDYgKzgwNCw3IEBACiAKIAlpZiAoKG5ld192YWx1ZSA9PSAxKSB8fCAobmV3X3ZhbHVlID09IDApKSB7CiAJCWJvbmQtPnBhcmFtcy5sYWNwX2Zhc3QgPSBuZXdfdmFsdWU7CisJCWJvbmRfM2FkX3VwZGF0ZV9sYWNwX3JhdGUoYm9uZCk7CiAJCXByX2luZm8oIiVzOiBTZXR0aW5nIExBQ1AgcmF0ZSB0byAlcyAoJWQpLlxuIiwKIAkJCWJvbmQtPmRldi0+bmFtZSwgYm9uZF9sYWNwX3RibFtuZXdfdmFsdWVdLm1vZGVuYW1lLAogCQkJbmV3X3ZhbHVlKTsKQEAgLTgxOCw2ICs4MTksMzggQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihsYWNwX3JhdGUsIFNfSVJVR08gfCBTX0lXVVNSLAogCQkgICBib25kaW5nX3Nob3dfbGFjcCwgYm9uZGluZ19zdG9yZV9sYWNwKTsKIAorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X21pbl9saW5rcyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYm9uZC0+cGFyYW1zLm1pbl9saW5rcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfbWluX2xpbmtzKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgbmV3X3ZhbHVlOworCisJcmV0ID0ga3N0cnRvdWludChidWYsIDAsICZuZXdfdmFsdWUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IElnbm9yaW5nIGludmFsaWQgbWluIGxpbmtzIHZhbHVlICVzLlxuIiwKKwkJICAgICAgIGJvbmQtPmRldi0+bmFtZSwgYnVmKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcl9pbmZvKCIlczogU2V0dGluZyBtaW4gbGlua3MgdmFsdWUgdG8gJXVcbiIsCisJCWJvbmQtPmRldi0+bmFtZSwgbmV3X3ZhbHVlKTsKKwlib25kLT5wYXJhbXMubWluX2xpbmtzID0gbmV3X3ZhbHVlOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihtaW5fbGlua3MsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBib25kaW5nX3Nob3dfbWluX2xpbmtzLCBib25kaW5nX3N0b3JlX21pbl9saW5rcyk7CisKIHN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19hZF9zZWxlY3Qoc3RydWN0IGRldmljZSAqZCwKIAkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgICAgICBjaGFyICpidWYpCkBAIC0xNjAwLDYgKzE2MzMsNyBAQAogCSZkZXZfYXR0cl9xdWV1ZV9pZC5hdHRyLAogCSZkZXZfYXR0cl9hbGxfc2xhdmVzX2FjdGl2ZS5hdHRyLAogCSZkZXZfYXR0cl9yZXNlbmRfaWdtcC5hdHRyLAorCSZkZXZfYXR0cl9taW5fbGlua3MuYXR0ciwKIAlOVUxMLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmggYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaAppbmRleCBlYTFkMDA1Li40MzUyNmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaApAQCAtMTQ3LDYgKzE0Nyw3IEBACiAJaW50IHVwZGVsYXk7CiAJaW50IGRvd25kZWxheTsKIAlpbnQgbGFjcF9mYXN0OworCXVuc2lnbmVkIGludCBtaW5fbGlua3M7CiAJaW50IGFkX3NlbGVjdDsKIAljaGFyIHByaW1hcnlbSUZOQU1TSVpdOwogCWludCBwcmltYXJ5X3Jlc2VsZWN0OwpAQCAtMjM5LDggKzI0MCw2IEBACiAJc3RydWN0ICAgYWxiX2JvbmRfaW5mbyBhbGJfaW5mbzsKIAlzdHJ1Y3QgICBib25kX3BhcmFtcyBwYXJhbXM7CiAJc3RydWN0ICAgbGlzdF9oZWFkIHZsYW5fbGlzdDsKLQlzdHJ1Y3QgICB2bGFuX2dyb3VwICp2bGdycDsKLQlzdHJ1Y3QgICBwYWNrZXRfdHlwZSBhcnBfbW9uX3B0OwogCXN0cnVjdCAgIHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwogCXN0cnVjdCAgIGRlbGF5ZWRfd29yayBtaWlfd29yazsKIAlzdHJ1Y3QgICBkZWxheWVkX3dvcmsgYXJwX3dvcms7CkBAIC0yNTMsNiArMjUyLDExIEBACiAjZW5kaWYgLyogQ09ORklHX0RFQlVHX0ZTICovCiB9OwogCitzdGF0aWMgaW5saW5lIGJvb2wgYm9uZF92bGFuX3VzZWQoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZib25kLT52bGFuX2xpc3QpOworfQorCiAjZGVmaW5lIGJvbmRfc2xhdmVfZ2V0X3JjdShkZXYpIFwKIAkoKHN0cnVjdCBzbGF2ZSAqKSByY3VfZGVyZWZlcmVuY2UoZGV2LT5yeF9oYW5kbGVyX2RhdGEpKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ic2RfY29tcC5jIGIvZHJpdmVycy9uZXQvYnNkX2NvbXAuYwppbmRleCA2ZTk5ZDgwLi5hOWI3NTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ic2RfY29tcC5jCisrKyBiL2RyaXZlcnMvbmV0L2JzZF9jb21wLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogI2RlZmluZSBMQVNUCTI1NQogCiAjZGVmaW5lIE1BWENPREUoYikJKCgxIDw8IChiKSkgLSAxKQotI2RlZmluZSBCQURDT0RFTTEJTUFYQ09ERShNQVhfQlNEX0JJVFMpOworI2RlZmluZSBCQURDT0RFTTEJTUFYQ09ERShNQVhfQlNEX0JJVFMpCiAKICNkZWZpbmUgQlNEX0hBU0gocHJlZml4LHN1ZmZpeCxoc2hpZnQpICgoKCh1bnNpZ25lZCBsb25nKShzdWZmaXgpKTw8KGhzaGlmdCkpIFwKIAkJCQkJIF4gKHVuc2lnbmVkIGxvbmcpKHByZWZpeCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYWlmL0tjb25maWcgYi9kcml2ZXJzL25ldC9jYWlmL0tjb25maWcKaW5kZXggMDllZDNmNC4uYWJmNGQ3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FpZi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2NhaWYvS2NvbmZpZwpAQCAtMzgsMyArMzgsMTIgQEAKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJVGhlIENBSUYgc2hhcmVkIG1lbW9yeSBwcm90b2NvbCBkcml2ZXIgZm9yIHRoZSBTVEUgVVg1NTAwIHBsYXRmb3JtLgorCitjb25maWcgQ0FJRl9IU0kKKyAgICAgICB0cmlzdGF0ZSAiQ0FJRiBIU0kgdHJhbnNwb3J0IGRyaXZlciIKKyAgICAgICBkZXBlbmRzIG9uIENBSUYKKyAgICAgICBkZWZhdWx0IG4KKyAgICAgICAtLS1oZWxwLS0tCisgICAgICAgVGhlIGNhaWYgbG93IGxldmVsIGRyaXZlciBmb3IgQ0FJRiBvdmVyIEhTSS4KKyAgICAgICBCZSBhd2FyZSB0aGF0IGlmIHlvdSBlbmFibGUgdGhpcyB0aGVuIHlvdSBhbHNvIG5lZWQgdG8KKyAgICAgICBlbmFibGUgYSBsb3ctbGV2ZWwgSFNJIGRyaXZlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NhaWYvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9jYWlmL01ha2VmaWxlCmluZGV4IDk1NjBiOWQuLjkxZGZmODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NhaWYvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvY2FpZi9NYWtlZmlsZQpAQCAtMTAsMyArMTAsNiBAQAogIyBTaGFyZWQgbWVtb3J5CiBjYWlmX3NobS1vYmpzIDo9IGNhaWZfc2htY29yZS5vIGNhaWZfc2htX3U1NTAwLm8KIG9iai0kKENPTkZJR19DQUlGX1NITSkgKz0gY2FpZl9zaG0ubworCisjIEhTSSBpbnRlcmZhY2UKK29iai0kKENPTkZJR19DQUlGX0hTSSkgKz0gY2FpZl9oc2kubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX2hzaS5jIGIvZHJpdmVycy9uZXQvY2FpZi9jYWlmX2hzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWMyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfaHNpLmMKQEAgLTAsMCArMSwxMjE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBBQiAyMDEwCisgKiBDb250YWN0OiBTanVyIEJyZW5kZWxhbmQgLyBzanVyLmJyYW5kZWxhbmRAc3Rlcmljc3Nvbi5jb20KKyAqIEF1dGhvcjogIERhbmllbCBNYXJ0ZW5zc29uIC8gZGFuaWVsLm1hcnRlbnNzb25Ac3Rlcmljc3Nvbi5jb20KKyAqCSAgICBEbWl0cnkuVGFybnlhZ2luICAvIGRtaXRyeS50YXJueWFnaW5Ac3Rlcmljc3Nvbi5jb20KKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxuZXQvY2FpZi9jYWlmX2xheWVyLmg+CisjaW5jbHVkZSA8bmV0L2NhaWYvY2FpZl9oc2kuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRGFuaWVsIE1hcnRlbnNzb248ZGFuaWVsLm1hcnRlbnNzb25Ac3Rlcmljc3Nvbi5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNBSUYgSFNJIGRyaXZlciIpOworCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBmb3IgYWxpZ25tZW50LiAqLworI2RlZmluZSBQQURfUE9XMih4LCBwb3cpICgoKCh4KSYoKHBvdyktMSkpID09IDApID8gMCA6XAorCQkJCSgoKHBvdyktKCh4KSYoKHBvdyktMSkpKSkpCisKKy8qCisgKiBIU0kgcGFkZGluZyBvcHRpb25zLgorICogV2FybmluZzogbXVzdCBiZSBhIGJhc2Ugb2YgMiAoJiBvcGVyYXRpb24gdXNlZCkgYW5kIGNhbiBub3QgYmUgemVybyAhCisgKi8KK3N0YXRpYyBpbnQgaHNpX2hlYWRfYWxpZ24gPSA0OworbW9kdWxlX3BhcmFtKGhzaV9oZWFkX2FsaWduLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhoc2lfaGVhZF9hbGlnbiwgIkhTSSBoZWFkIGFsaWdubWVudC4iKTsKKworc3RhdGljIGludCBoc2lfdGFpbF9hbGlnbiA9IDQ7Cittb2R1bGVfcGFyYW0oaHNpX3RhaWxfYWxpZ24sIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGhzaV90YWlsX2FsaWduLCAiSFNJIHRhaWwgYWxpZ25tZW50LiIpOworCisvKgorICogSFNJIGxpbmsgbGF5ZXIgZmxvd2NvbnRyb2wgdGhyZXNob2xkcy4KKyAqIFdhcm5pbmc6IEEgaGlnaCB0aHJlc2hvbGQgdmFsdWUgbWlndGggaW5jcmVhc2UgdGhyb3VnaHB1dCBidXQgaXQgd2lsbCBhdAorICogdGhlIHNhbWUgdGltZSBwcmV2ZW50IGNoYW5uZWwgcHJpb3JpdGl6YXRpb24gYW5kIGluY3JlYXNlIHRoZSByaXNrIG9mCisgKiBmbG9vZGluZyB0aGUgbW9kZW0uIFRoZSBoaWdoIHRocmVzaG9sZCBzaG91bGQgYmUgYWJvdmUgdGhlIGxvdy4KKyAqLworc3RhdGljIGludCBoc2lfaGlnaF90aHJlc2hvbGQgPSAxMDA7Cittb2R1bGVfcGFyYW0oaHNpX2hpZ2hfdGhyZXNob2xkLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhoc2lfaGlnaF90aHJlc2hvbGQsICJIU0kgaGlnaCB0aHJlc2hvbGQgKEZMT1cgT0ZGKS4iKTsKKworc3RhdGljIGludCBoc2lfbG93X3RocmVzaG9sZCA9IDUwOworbW9kdWxlX3BhcmFtKGhzaV9sb3dfdGhyZXNob2xkLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhoc2lfbG93X3RocmVzaG9sZCwgIkhTSSBoaWdoIHRocmVzaG9sZCAoRkxPVyBPTikuIik7CisKKyNkZWZpbmUgT04gMQorI2RlZmluZSBPRkYgMAorCisvKgorICogVGhyZXNob2xkIHZhbHVlcyBmb3IgdGhlIEhTSSBwYWNrZXQgcXVldWUuIEZsb3djb250cm9sIHdpbGwgYmUgYXNzZXJ0ZWQKKyAqIHdoZW4gdGhlIG51bWJlciBvZiBwYWNrZXRzIGV4Y2VlZHMgSElHSF9XQVRFUl9NQVJLLiBJdCB3aWxsIG5vdCBiZQorICogZGUtYXNzZXJ0ZWQgYmVmb3JlIHRoZSBudW1iZXIgb2YgcGFja2V0cyBkcm9wcyBiZWxvdyBMT1dfV0FURVJfTUFSSy4KKyAqLworI2RlZmluZSBMT1dfV0FURVJfTUFSSyAgIGhzaV9sb3dfdGhyZXNob2xkCisjZGVmaW5lIEhJR0hfV0FURVJfTUFSSyAgaHNpX2hpZ2hfdGhyZXNob2xkCisKK3N0YXRpYyBMSVNUX0hFQUQoY2Zoc2lfbGlzdCk7CitzdGF0aWMgc3BpbmxvY2tfdCBjZmhzaV9saXN0X2xvY2s7CisKK3N0YXRpYyB2b2lkIGNmaHNpX2luYWN0aXZpdHlfdG91dCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY2Zoc2kgKmNmaHNpID0gKHN0cnVjdCBjZmhzaSAqKWFyZzsKKworCWRldl9kYmcoJmNmaHNpLT5uZGV2LT5kZXYsICIlcy5cbiIsCisJCV9fZnVuY19fKTsKKworCS8qIFNjaGVkdWxlIHBvd2VyIGRvd24gd29yayBxdWV1ZS4gKi8KKwlpZiAoIXRlc3RfYml0KENGSFNJX1NIVVRET1dOLCAmY2Zoc2ktPmJpdHMpKQorCQlxdWV1ZV93b3JrKGNmaHNpLT53cSwgJmNmaHNpLT53YWtlX2Rvd25fd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGNmaHNpX2Fib3J0X3R4KHN0cnVjdCBjZmhzaSAqY2Zoc2kpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWZvciAoOzspIHsKKwkJc3Bpbl9sb2NrX2JoKCZjZmhzaS0+bG9jayk7CisJCXNrYiA9IHNrYl9kZXF1ZXVlKCZjZmhzaS0+cWhlYWQpOworCQlpZiAoIXNrYikKKwkJCWJyZWFrOworCisJCWNmaHNpLT5uZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJY2Zoc2ktPm5kZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJc3Bpbl91bmxvY2tfYmgoJmNmaHNpLT5sb2NrKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCWNmaHNpLT50eF9zdGF0ZSA9IENGSFNJX1RYX1NUQVRFX0lETEU7CisJaWYgKCF0ZXN0X2JpdChDRkhTSV9TSFVURE9XTiwgJmNmaHNpLT5iaXRzKSkKKwkJbW9kX3RpbWVyKCZjZmhzaS0+dGltZXIsIGppZmZpZXMgKyBDRkhTSV9JTkFDVElWSVRZX1RPVVQpOworCXNwaW5fdW5sb2NrX2JoKCZjZmhzaS0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgY2Zoc2lfZmx1c2hfZmlmbyhzdHJ1Y3QgY2Zoc2kgKmNmaHNpKQoreworCWNoYXIgYnVmZmVyWzMyXTsgLyogQW55IHJlYXNvbmFibGUgdmFsdWUgKi8KKwlzaXplX3QgZmlmb19vY2N1cGFuY3k7CisJaW50IHJldDsKKworCWRldl9kYmcoJmNmaHNpLT5uZGV2LT5kZXYsICIlcy5cbiIsCisJCV9fZnVuY19fKTsKKworCisJcmV0ID0gY2Zoc2ktPmRldi0+Y2Zoc2lfd2FrZV91cChjZmhzaS0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl93YXJuKCZjZmhzaS0+bmRldi0+ZGV2LAorCQkJIiVzOiBjYW4ndCB3YWtlIHVwIEhTSSBpbnRlcmZhY2U6ICVkLlxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRvIHsKKwkJcmV0ID0gY2Zoc2ktPmRldi0+Y2Zoc2lfZmlmb19vY2N1cGFuY3koY2Zoc2ktPmRldiwKKwkJCQkmZmlmb19vY2N1cGFuY3kpOworCQlpZiAocmV0KSB7CisJCQlkZXZfd2FybigmY2Zoc2ktPm5kZXYtPmRldiwKKwkJCQkiJXM6IGNhbid0IGdldCBGSUZPIG9jY3VwYW5jeTogJWQuXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoIWZpZm9fb2NjdXBhbmN5KQorCQkJLyogTm8gbW9yZSBkYXRhLCBleGl0dGluZyBub3JtYWxseSAqLworCQkJYnJlYWs7CisKKwkJZmlmb19vY2N1cGFuY3kgPSBtaW4oc2l6ZW9mKGJ1ZmZlciksIGZpZm9fb2NjdXBhbmN5KTsKKwkJc2V0X2JpdChDRkhTSV9GTFVTSF9GSUZPLCAmY2Zoc2ktPmJpdHMpOworCQlyZXQgPSBjZmhzaS0+ZGV2LT5jZmhzaV9yeChidWZmZXIsIGZpZm9fb2NjdXBhbmN5LAorCQkJCWNmaHNpLT5kZXYpOworCQlpZiAocmV0KSB7CisJCQljbGVhcl9iaXQoQ0ZIU0lfRkxVU0hfRklGTywgJmNmaHNpLT5iaXRzKTsKKwkJCWRldl93YXJuKCZjZmhzaS0+bmRldi0+ZGV2LAorCQkJCSIlczogY2FuJ3QgcmVhZCBkYXRhOiAlZC5cbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IDUgKiBIWjsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoY2Zoc2ktPmZsdXNoX2ZpZm9fd2FpdCwKKwkJCSAhdGVzdF9iaXQoQ0ZIU0lfRkxVU0hfRklGTywgJmNmaHNpLT5iaXRzKSwgcmV0KTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X3dhcm4oJmNmaHNpLT5uZGV2LT5kZXYsCisJCQkJIiVzOiBjYW4ndCB3YWl0IGZvciBmbHVzaCBjb21wbGV0ZTogJWQuXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoIXJldCkgeworCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJCWRldl93YXJuKCZjZmhzaS0+bmRldi0+ZGV2LAorCQkJCSIlczogdGltZW91dCB3YWl0aW5nIGZvciBmbHVzaCBjb21wbGV0ZS5cbiIsCisJCQkJX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWNmaHNpLT5kZXYtPmNmaHNpX3dha2VfZG93bihjZmhzaS0+ZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2Zoc2lfdHhfZnJtKHN0cnVjdCBjZmhzaV9kZXNjICpkZXNjLCBzdHJ1Y3QgY2Zoc2kgKmNmaHNpKQoreworCWludCBuZnJtcyA9IDA7CisJaW50IHBsZF9sZW4gPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggKnBmcm0gPSBkZXNjLT5lbWJfZnJtICsgQ0ZIU0lfTUFYX0VNQl9GUk1fU1o7CisKKwlza2IgPSBza2JfZGVxdWV1ZSgmY2Zoc2ktPnFoZWFkKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gZW1iZWQgYSBDQUlGIGZyYW1lLiAqLworCWlmIChza2ItPmxlbiA8IENGSFNJX01BWF9FTUJfRlJNX1NaKSB7CisJCXN0cnVjdCBjYWlmX3BheWxvYWRfaW5mbyAqaW5mbzsKKwkJaW50IGhwYWQgPSAwOworCQlpbnQgdHBhZCA9IDA7CisKKwkJLyogQ2FsY3VsYXRlIG5lZWRlZCBoZWFkIGFsaWdubWVudCBhbmQgdGFpbCBhbGlnbm1lbnQuICovCisJCWluZm8gPSAoc3RydWN0IGNhaWZfcGF5bG9hZF9pbmZvICopJnNrYi0+Y2I7CisKKwkJaHBhZCA9IDEgKyBQQURfUE9XMigoaW5mby0+aGRyX2xlbiArIDEpLCBoc2lfaGVhZF9hbGlnbik7CisJCXRwYWQgPSBQQURfUE9XMigoc2tiLT5sZW4gKyBocGFkKSwgaHNpX3RhaWxfYWxpZ24pOworCisJCS8qIENoZWNrIGlmIGZyYW1lIHN0aWxsIGZpdHMgd2l0aCBhZGRlZCBhbGlnbm1lbnQuICovCisJCWlmICgoc2tiLT5sZW4gKyBocGFkICsgdHBhZCkgPD0gQ0ZIU0lfTUFYX0VNQl9GUk1fU1opIHsKKwkJCXU4ICpwZW1iID0gZGVzYy0+ZW1iX2ZybTsKKwkJCWRlc2MtPm9mZnNldCA9IENGSFNJX0RFU0NfU0hPUlRfU1o7CisJCQkqcGVtYiA9ICh1OCkoaHBhZCAtIDEpOworCQkJcGVtYiArPSBocGFkOworCisJCQkvKiBVcGRhdGUgbmV0d29yayBzdGF0aXN0aWNzLiAqLworCQkJY2Zoc2ktPm5kZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWNmaHNpLT5uZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCQkJLyogQ29weSBpbiBlbWJlZGRlZCBDQUlGIGZyYW1lLiAqLworCQkJc2tiX2NvcHlfYml0cyhza2IsIDAsIHBlbWIsIHNrYi0+bGVuKTsKKwkJCWNvbnN1bWVfc2tiKHNrYik7CisJCQlza2IgPSBOVUxMOworCQl9CisJfSBlbHNlCisJCS8qIENsZWFyIG9mZnNldC4gKi8KKwkJZGVzYy0+b2Zmc2V0ID0gMDsKKworCS8qIENyZWF0ZSBwYXlsb2FkIENBSUYgZnJhbWVzLiAqLworCXBmcm0gPSBkZXNjLT5lbWJfZnJtICsgQ0ZIU0lfTUFYX0VNQl9GUk1fU1o7CisJd2hpbGUgKG5mcm1zIDwgQ0ZIU0lfTUFYX1BLVFMpIHsKKwkJc3RydWN0IGNhaWZfcGF5bG9hZF9pbmZvICppbmZvOworCQlpbnQgaHBhZCA9IDA7CisJCWludCB0cGFkID0gMDsKKworCQlpZiAoIXNrYikKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZjZmhzaS0+cWhlYWQpOworCisJCWlmICghc2tiKQorCQkJYnJlYWs7CisKKwkJLyogQ2FsY3VsYXRlIG5lZWRlZCBoZWFkIGFsaWdubWVudCBhbmQgdGFpbCBhbGlnbm1lbnQuICovCisJCWluZm8gPSAoc3RydWN0IGNhaWZfcGF5bG9hZF9pbmZvICopJnNrYi0+Y2I7CisKKwkJaHBhZCA9IDEgKyBQQURfUE9XMigoaW5mby0+aGRyX2xlbiArIDEpLCBoc2lfaGVhZF9hbGlnbik7CisJCXRwYWQgPSBQQURfUE9XMigoc2tiLT5sZW4gKyBocGFkKSwgaHNpX3RhaWxfYWxpZ24pOworCisJCS8qIEZpbGwgaW4gQ0FJRiBmcmFtZSBsZW5ndGggaW4gZGVzY3JpcHRvci4gKi8KKwkJZGVzYy0+Y2Zmcm1fbGVuW25mcm1zXSA9IGhwYWQgKyBza2ItPmxlbiArIHRwYWQ7CisKKwkJLyogRmlsbCBoZWFkIHBhZGRpbmcgaW5mb3JtYXRpb24uICovCisJCSpwZnJtID0gKHU4KShocGFkIC0gMSk7CisJCXBmcm0gKz0gaHBhZDsKKworCQkvKiBVcGRhdGUgbmV0d29yayBzdGF0aXN0aWNzLiAqLworCQljZmhzaS0+bmRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQljZmhzaS0+bmRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkJLyogQ29weSBpbiBDQUlGIGZyYW1lLiAqLworCQlza2JfY29weV9iaXRzKHNrYiwgMCwgcGZybSwgc2tiLT5sZW4pOworCisJCS8qIFVwZGF0ZSBwYXlsb2FkIGxlbmd0aC4gKi8KKwkJcGxkX2xlbiArPSBkZXNjLT5jZmZybV9sZW5bbmZybXNdOworCisJCS8qIFVwZGF0ZSBmcmFtZSBwb2ludGVyLiAqLworCQlwZnJtICs9IHNrYi0+bGVuICsgdHBhZDsKKwkJY29uc3VtZV9za2Ioc2tiKTsKKwkJc2tiID0gTlVMTDsKKworCQkvKiBVcGRhdGUgbnVtYmVyIG9mIGZyYW1lcy4gKi8KKwkJbmZybXMrKzsKKwl9CisKKwkvKiBVbnVzZWQgbGVuZ3RoIGZpZWxkcyBzaG91bGQgYmUgemVyby1maWxsZWQgKGFjY29yZGluZyB0byBTUEVDKS4gKi8KKwl3aGlsZSAobmZybXMgPCBDRkhTSV9NQVhfUEtUUykgeworCQlkZXNjLT5jZmZybV9sZW5bbmZybXNdID0gMHgwMDAwOworCQluZnJtcysrOworCX0KKworCS8qIENoZWNrIGlmIHdlIGNhbiBwaWdneS1iYWNrIGFub3RoZXIgZGVzY3JpcHRvci4gKi8KKwlza2IgPSBza2JfcGVlaygmY2Zoc2ktPnFoZWFkKTsKKwlpZiAoc2tiKQorCQlkZXNjLT5oZWFkZXIgfD0gQ0ZIU0lfUElHR1lfREVTQzsKKwllbHNlCisJCWRlc2MtPmhlYWRlciAmPSB+Q0ZIU0lfUElHR1lfREVTQzsKKworCXJldHVybiBDRkhTSV9ERVNDX1NaICsgcGxkX2xlbjsKK30KKworc3RhdGljIHZvaWQgY2Zoc2lfdHhfZG9uZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2Zoc2kgKmNmaHNpID0gTlVMTDsKKwlzdHJ1Y3QgY2Zoc2lfZGVzYyAqZGVzYyA9IE5VTEw7CisJaW50IGxlbiA9IDA7CisJaW50IHJlczsKKworCWNmaHNpID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjZmhzaSwgdHhfZG9uZV93b3JrKTsKKwlkZXZfZGJnKCZjZmhzaS0+bmRldi0+ZGV2LCAiJXMuXG4iLAorCQlfX2Z1bmNfXyk7CisKKwlpZiAodGVzdF9iaXQoQ0ZIU0lfU0hVVERPV04sICZjZmhzaS0+Yml0cykpCisJCXJldHVybjsKKworCWRlc2MgPSAoc3RydWN0IGNmaHNpX2Rlc2MgKiljZmhzaS0+dHhfYnVmOworCisJZG8geworCQkvKgorCQkgKiBTZW5kIGZsb3cgb24gaWYgZmxvdyBvZmYgaGFzIGJlZW4gcHJldmlvdXNseSBzaWduYWxsZWQKKwkJICogYW5kIG51bWJlciBvZiBwYWNrZXRzIGlzIGJlbG93IGxvdyB3YXRlciBtYXJrLgorCQkgKi8KKwkJc3Bpbl9sb2NrX2JoKCZjZmhzaS0+bG9jayk7CisJCWlmIChjZmhzaS0+Zmxvd19vZmZfc2VudCAmJgorCQkJCWNmaHNpLT5xaGVhZC5xbGVuIDw9IGNmaHNpLT5xX2xvd19tYXJrICYmCisJCQkJY2Zoc2ktPmNmZGV2LmZsb3djdHJsKSB7CisKKwkJCWNmaHNpLT5mbG93X29mZl9zZW50ID0gMDsKKwkJCWNmaHNpLT5jZmRldi5mbG93Y3RybChjZmhzaS0+bmRldiwgT04pOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZjZmhzaS0+bG9jayk7CisKKwkJLyogQ3JlYXRlIEhTSSBmcmFtZS4gKi8KKwkJbGVuID0gY2Zoc2lfdHhfZnJtKGRlc2MsIGNmaHNpKTsKKwkJaWYgKCFsZW4pIHsKKwkJCWNmaHNpLT50eF9zdGF0ZSA9IENGSFNJX1RYX1NUQVRFX0lETEU7CisJCQkvKiBTdGFydCBpbmFjdGl2aXR5IHRpbWVyLiAqLworCQkJbW9kX3RpbWVyKCZjZmhzaS0+dGltZXIsCisJCQkJCWppZmZpZXMgKyBDRkhTSV9JTkFDVElWSVRZX1RPVVQpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBTZXQgdXAgbmV3IHRyYW5zZmVyLiAqLworCQlyZXMgPSBjZmhzaS0+ZGV2LT5jZmhzaV90eChjZmhzaS0+dHhfYnVmLCBsZW4sIGNmaHNpLT5kZXYpOworCQlpZiAoV0FSTl9PTihyZXMgPCAwKSkgeworCQkJZGV2X2VycigmY2Zoc2ktPm5kZXYtPmRldiwgIiVzOiBUWCBlcnJvciAlZC5cbiIsCisJCQkJX19mdW5jX18sIHJlcyk7CisJCX0KKwl9IHdoaWxlIChyZXMgPCAwKTsKK30KKworc3RhdGljIHZvaWQgY2Zoc2lfdHhfZG9uZV9jYihzdHJ1Y3QgY2Zoc2lfZHJ2ICpkcnYpCit7CisJc3RydWN0IGNmaHNpICpjZmhzaTsKKworCWNmaHNpID0gY29udGFpbmVyX29mKGRydiwgc3RydWN0IGNmaHNpLCBkcnYpOworCWRldl9kYmcoJmNmaHNpLT5uZGV2LT5kZXYsICIlcy5cbiIsCisJCV9fZnVuY19fKTsKKworCWlmICh0ZXN0X2JpdChDRkhTSV9TSFVURE9XTiwgJmNmaHNpLT5iaXRzKSkKKwkJcmV0dXJuOworCisJcXVldWVfd29yayhjZmhzaS0+d3EsICZjZmhzaS0+dHhfZG9uZV93b3JrKTsKK30KKworc3RhdGljIGludCBjZmhzaV9yeF9kZXNjKHN0cnVjdCBjZmhzaV9kZXNjICpkZXNjLCBzdHJ1Y3QgY2Zoc2kgKmNmaHNpKQoreworCWludCB4ZmVyX3N6ID0gMDsKKwlpbnQgbmZybXMgPSAwOworCXUxNiAqcGxlbiA9IE5VTEw7CisJdTggKnBmcm0gPSBOVUxMOworCisJaWYgKChkZXNjLT5oZWFkZXIgJiB+Q0ZIU0lfUElHR1lfREVTQykgfHwKKwkJCShkZXNjLT5vZmZzZXQgPiBDRkhTSV9NQVhfRU1CX0ZSTV9TWikpIHsKKwkJZGV2X2VycigmY2Zoc2ktPm5kZXYtPmRldiwgIiVzOiBJbnZhbGlkIGRlc2NyaXB0b3IuXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBmb3IgZW1iZWRkZWQgQ0FJRiBmcmFtZS4gKi8KKwlpZiAoZGVzYy0+b2Zmc2V0KSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXU4ICpkc3QgPSBOVUxMOworCQlpbnQgbGVuID0gMCwgcmV0cmllcyA9IDA7CisJCXBmcm0gPSAoKHU4ICopZGVzYykgKyBkZXNjLT5vZmZzZXQ7CisKKwkJLyogUmVtb3ZlIG9mZnNldCBwYWRkaW5nLiAqLworCQlwZnJtICs9ICpwZnJtICsgMTsKKworCQkvKiBSZWFkIGxlbmd0aCBvZiBDQUlGIGZyYW1lIChsaXR0bGUgZW5kaWFuKS4gKi8KKwkJbGVuID0gKnBmcm07CisJCWxlbiB8PSAoKCoocGZybSsxKSkgPDwgOCkgJiAweEZGMDA7CisJCWxlbiArPSAyOwkvKiBBZGQgRkNTIGZpZWxkcy4gKi8KKworCisJCS8qIEFsbG9jYXRlIFNLQiAoT0sgZXZlbiBpbiBJUlEgY29udGV4dCkuICovCisJCXNrYiA9IGFsbG9jX3NrYihsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJd2hpbGUgKCFza2IpIHsKKwkJCXJldHJpZXMrKzsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCQlza2IgPSBhbGxvY19za2IobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoc2tiKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNsZXB0IGZvciAldSAiCisJCQkJCQkiYmVmb3JlIGdldHRpbmcgbWVtb3J5XG4iLAorCQkJCQkJX19mdW5jX18sIHJldHJpZXMpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHJldHJpZXMgPiBIWikgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNsZXB0IGZvciAxSFogYW5kICIKKwkJCQkJCSJkaWQgbm90IGdldCBtZW1vcnlcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCQkJY2Zoc2ktPm5kZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlnb3RvIGRyb3BfZnJhbWU7CisJCQl9CisJCX0KKwkJY2FpZl9hc3NlcnQoc2tiICE9IE5VTEwpOworCisJCWRzdCA9IHNrYl9wdXQoc2tiLCBsZW4pOworCQltZW1jcHkoZHN0LCBwZnJtLCBsZW4pOworCisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9DQUlGKTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwkJc2tiLT5kZXYgPSBjZmhzaS0+bmRldjsKKworCQkvKgorCQkgKiBXZSBhcmUgY2FsbGVkIGZyb20gYSBhcmNoIHNwZWNpZmljIHBsYXRmb3JtIGRldmljZS4KKwkJICogVW5mb3J0dW5hdGVseSB3ZSBkb24ndCBrbm93IHdoYXQgY29udGV4dCB3ZSdyZQorCQkgKiBydW5uaW5nIGluLgorCQkgKi8KKwkJaWYgKGluX2ludGVycnVwdCgpKQorCQkJbmV0aWZfcngoc2tiKTsKKwkJZWxzZQorCQkJbmV0aWZfcnhfbmkoc2tiKTsKKworCQkvKiBVcGRhdGUgbmV0d29yayBzdGF0aXN0aWNzLiAqLworCQljZmhzaS0+bmRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQljZmhzaS0+bmRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCX0KKworZHJvcF9mcmFtZToKKwkvKiBDYWxjdWxhdGUgdHJhbnNmZXIgbGVuZ3RoLiAqLworCXBsZW4gPSBkZXNjLT5jZmZybV9sZW47CisJd2hpbGUgKG5mcm1zIDwgQ0ZIU0lfTUFYX1BLVFMgJiYgKnBsZW4pIHsKKwkJeGZlcl9zeiArPSAqcGxlbjsKKwkJcGxlbisrOworCQluZnJtcysrOworCX0KKworCS8qIENoZWNrIGZvciBwaWdneS1iYWNrZWQgZGVzY3JpcHRvci4gKi8KKwlpZiAoZGVzYy0+aGVhZGVyICYgQ0ZIU0lfUElHR1lfREVTQykKKwkJeGZlcl9zeiArPSBDRkhTSV9ERVNDX1NaOworCisJaWYgKHhmZXJfc3ogJSA0KSB7CisJCWRldl9lcnIoJmNmaHNpLT5uZGV2LT5kZXYsCisJCQkJIiVzOiBJbnZhbGlkIHBheWxvYWQgbGVuOiAlZCwgaWdub3JlZC5cbiIsCisJCQlfX2Z1bmNfXywgeGZlcl9zeik7CisJCXhmZXJfc3ogPSAwOworCX0KKworCXJldHVybiB4ZmVyX3N6OworfQorCitzdGF0aWMgaW50IGNmaHNpX3J4X3BsZChzdHJ1Y3QgY2Zoc2lfZGVzYyAqZGVzYywgc3RydWN0IGNmaHNpICpjZmhzaSkKK3sKKwlpbnQgcnhfc3ogPSAwOworCWludCBuZnJtcyA9IDA7CisJdTE2ICpwbGVuID0gTlVMTDsKKwl1OCAqcGZybSA9IE5VTEw7CisKKwkvKiBTYW5pdHkgY2hlY2sgaGVhZGVyIGFuZCBvZmZzZXQuICovCisJaWYgKFdBUk5fT04oKGRlc2MtPmhlYWRlciAmIH5DRkhTSV9QSUdHWV9ERVNDKSB8fAorCQkJKGRlc2MtPm9mZnNldCA+IENGSFNJX01BWF9FTUJfRlJNX1NaKSkpIHsKKwkJZGV2X2VycigmY2Zoc2ktPm5kZXYtPmRldiwgIiVzOiBJbnZhbGlkIGRlc2NyaXB0b3IuXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTZXQgZnJhbWUgcG9pbnRlciB0byBzdGFydCBvZiBwYXlsb2FkLiAqLworCXBmcm0gPSBkZXNjLT5lbWJfZnJtICsgQ0ZIU0lfTUFYX0VNQl9GUk1fU1o7CisJcGxlbiA9IGRlc2MtPmNmZnJtX2xlbjsKKwl3aGlsZSAobmZybXMgPCBDRkhTSV9NQVhfUEtUUyAmJiAqcGxlbikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1OCAqZHN0ID0gTlVMTDsKKwkJdTggKnBjZmZybSA9IE5VTEw7CisJCWludCBsZW4gPSAwLCByZXRyaWVzID0gMDsKKworCQlpZiAoV0FSTl9PTihkZXNjLT5jZmZybV9sZW5bbmZybXNdID4gQ0ZIU0lfTUFYX1BBWUxPQURfU1opKSB7CisJCQlkZXZfZXJyKCZjZmhzaS0+bmRldi0+ZGV2LCAiJXM6IEludmFsaWQgcGF5bG9hZC5cbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBDQUlGIGZyYW1lIHN0YXJ0cyBhZnRlciBoZWFkIHBhZGRpbmcuICovCisJCXBjZmZybSA9IHBmcm0gKyAqcGZybSArIDE7CisKKwkJLyogUmVhZCBsZW5ndGggb2YgQ0FJRiBmcmFtZSAobGl0dGxlIGVuZGlhbikuICovCisJCWxlbiA9ICpwY2Zmcm07CisJCWxlbiB8PSAoKCoocGNmZnJtICsgMSkpIDw8IDgpICYgMHhGRjAwOworCQlsZW4gKz0gMjsJLyogQWRkIEZDUyBmaWVsZHMuICovCisKKwkJLyogQWxsb2NhdGUgU0tCIChPSyBldmVuIGluIElSUSBjb250ZXh0KS4gKi8KKwkJc2tiID0gYWxsb2Nfc2tiKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQl3aGlsZSAoIXNrYikgeworCQkJcmV0cmllcysrOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJCXNrYiA9IGFsbG9jX3NrYihsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChza2IpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2xlcHQgZm9yICV1ICIKKwkJCQkJCSJiZWZvcmUgZ2V0dGluZyBtZW1vcnlcbiIsCisJCQkJCQlfX2Z1bmNfXywgcmV0cmllcyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocmV0cmllcyA+IEhaKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2xlcHQgZm9yIDFIWiAiCisJCQkJCQkiYW5kIGRpZCBub3QgZ2V0IG1lbW9yeVxuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJCQljZmhzaS0+bmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWdvdG8gZHJvcF9mcmFtZTsKKwkJCX0KKwkJfQorCQljYWlmX2Fzc2VydChza2IgIT0gTlVMTCk7CisKKwkJZHN0ID0gc2tiX3B1dChza2IsIGxlbik7CisJCW1lbWNweShkc3QsIHBjZmZybSwgbGVuKTsKKworCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQ0FJRik7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJCXNrYi0+ZGV2ID0gY2Zoc2ktPm5kZXY7CisKKwkJLyoKKwkJICogV2UncmUgY2FsbGVkIGZyb20gYSBwbGF0Zm9ybSBkZXZpY2UsCisJCSAqIGFuZCBkb24ndCBrbm93IHRoZSBjb250ZXh0IHdlJ3JlIHJ1bm5pbmcgaW4uCisJCSAqLworCQlpZiAoaW5faW50ZXJydXB0KCkpCisJCQluZXRpZl9yeChza2IpOworCQllbHNlCisJCQluZXRpZl9yeF9uaShza2IpOworCisJCS8qIFVwZGF0ZSBuZXR3b3JrIHN0YXRpc3RpY3MuICovCisJCWNmaHNpLT5uZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWNmaHNpLT5uZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKK2Ryb3BfZnJhbWU6CisJCXBmcm0gKz0gKnBsZW47CisJCXJ4X3N6ICs9ICpwbGVuOworCQlwbGVuKys7CisJCW5mcm1zKys7CisJfQorCisJcmV0dXJuIHJ4X3N6OworfQorCitzdGF0aWMgdm9pZCBjZmhzaV9yeF9kb25lX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCByZXM7CisJaW50IGRlc2NfcGxkX2xlbiA9IDA7CisJc3RydWN0IGNmaHNpICpjZmhzaSA9IE5VTEw7CisJc3RydWN0IGNmaHNpX2Rlc2MgKmRlc2MgPSBOVUxMOworCisJY2Zoc2kgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNmaHNpLCByeF9kb25lX3dvcmspOworCWRlc2MgPSAoc3RydWN0IGNmaHNpX2Rlc2MgKiljZmhzaS0+cnhfYnVmOworCisJZGV2X2RiZygmY2Zoc2ktPm5kZXYtPmRldiwgIiVzOiBLaWNrIHRpbWVyIGlmIHBlbmRpbmcuXG4iLAorCQlfX2Z1bmNfXyk7CisKKwlpZiAodGVzdF9iaXQoQ0ZIU0lfU0hVVERPV04sICZjZmhzaS0+Yml0cykpCisJCXJldHVybjsKKworCS8qIFVwZGF0ZSBpbmFjdGl2aXR5IHRpbWVyIGlmIHBlbmRpbmcuICovCisJbW9kX3RpbWVyX3BlbmRpbmcoJmNmaHNpLT50aW1lciwgamlmZmllcyArIENGSFNJX0lOQUNUSVZJVFlfVE9VVCk7CisKKwlpZiAoY2Zoc2ktPnJ4X3N0YXRlID09IENGSFNJX1JYX1NUQVRFX0RFU0MpIHsKKwkJZGVzY19wbGRfbGVuID0gY2Zoc2lfcnhfZGVzYyhkZXNjLCBjZmhzaSk7CisJfSBlbHNlIHsKKwkJaW50IHBsZF9sZW47CisKKwkJcGxkX2xlbiA9IGNmaHNpX3J4X3BsZChkZXNjLCBjZmhzaSk7CisKKwkJaWYgKChwbGRfbGVuID4gMCkgJiYgKGRlc2MtPmhlYWRlciAmIENGSFNJX1BJR0dZX0RFU0MpKSB7CisJCQlzdHJ1Y3QgY2Zoc2lfZGVzYyAqcGlnZ3lfZGVzYzsKKwkJCXBpZ2d5X2Rlc2MgPSAoc3RydWN0IGNmaHNpX2Rlc2MgKikKKwkJCQkoZGVzYy0+ZW1iX2ZybSArIENGSFNJX01BWF9FTUJfRlJNX1NaICsKKwkJCQkJCXBsZF9sZW4pOworCisJCQkvKiBFeHRyYWN0IHBpZ2d5LWJhY2tlZCBkZXNjcmlwdG9yLiAqLworCQkJZGVzY19wbGRfbGVuID0gY2Zoc2lfcnhfZGVzYyhwaWdneV9kZXNjLCBjZmhzaSk7CisKKwkJCS8qCisJCQkgKiBDb3B5IG5lZWRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwaWdneS1iYWNrZWQKKwkJCSAqIGRlc2NyaXB0b3IgdG8gdGhlIGRlc2NyaXB0b3IgaW4gdGhlIHN0YXJ0LgorCQkJICovCisJCQltZW1jcHkoKHU4ICopZGVzYywgKHU4ICopcGlnZ3lfZGVzYywKKwkJCQkJQ0ZIU0lfREVTQ19TSE9SVF9TWik7CisJCX0KKwl9CisKKwlpZiAoZGVzY19wbGRfbGVuKSB7CisJCWNmaHNpLT5yeF9zdGF0ZSA9IENGSFNJX1JYX1NUQVRFX1BBWUxPQUQ7CisJCWNmaHNpLT5yeF9wdHIgPSBjZmhzaS0+cnhfYnVmICsgQ0ZIU0lfREVTQ19TWjsKKwkJY2Zoc2ktPnJ4X2xlbiA9IGRlc2NfcGxkX2xlbjsKKwl9IGVsc2UgeworCQljZmhzaS0+cnhfc3RhdGUgPSBDRkhTSV9SWF9TVEFURV9ERVNDOworCQljZmhzaS0+cnhfcHRyID0gY2Zoc2ktPnJ4X2J1ZjsKKwkJY2Zoc2ktPnJ4X2xlbiA9IENGSFNJX0RFU0NfU1o7CisJfQorCWNsZWFyX2JpdChDRkhTSV9QRU5ESU5HX1JYLCAmY2Zoc2ktPmJpdHMpOworCisJaWYgKHRlc3RfYml0KENGSFNJX0FXQUtFLCAmY2Zoc2ktPmJpdHMpKSB7CisJCS8qIFNldCB1cCBuZXcgdHJhbnNmZXIuICovCisJCWRldl9kYmcoJmNmaHNpLT5uZGV2LT5kZXYsICIlczogU3RhcnQgUlguXG4iLAorCQkJX19mdW5jX18pOworCQlyZXMgPSBjZmhzaS0+ZGV2LT5jZmhzaV9yeChjZmhzaS0+cnhfcHRyLCBjZmhzaS0+cnhfbGVuLAorCQkJCWNmaHNpLT5kZXYpOworCQlpZiAoV0FSTl9PTihyZXMgPCAwKSkgeworCQkJZGV2X2VycigmY2Zoc2ktPm5kZXYtPmRldiwgIiVzOiBSWCBlcnJvciAlZC5cbiIsCisJCQkJX19mdW5jX18sIHJlcyk7CisJCQljZmhzaS0+bmRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQljZmhzaS0+bmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjZmhzaV9yeF9kb25lX2NiKHN0cnVjdCBjZmhzaV9kcnYgKmRydikKK3sKKwlzdHJ1Y3QgY2Zoc2kgKmNmaHNpOworCisJY2Zoc2kgPSBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3QgY2Zoc2ksIGRydik7CisJZGV2X2RiZygmY2Zoc2ktPm5kZXYtPmRldiwgIiVzLlxuIiwKKwkJX19mdW5jX18pOworCisJaWYgKHRlc3RfYml0KENGSFNJX1NIVVRET1dOLCAmY2Zoc2ktPmJpdHMpKQorCQlyZXR1cm47CisKKwlzZXRfYml0KENGSFNJX1BFTkRJTkdfUlgsICZjZmhzaS0+Yml0cyk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENGSFNJX0ZMVVNIX0ZJRk8sICZjZmhzaS0+Yml0cykpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2Zoc2ktPmZsdXNoX2ZpZm9fd2FpdCk7CisJZWxzZQorCQlxdWV1ZV93b3JrKGNmaHNpLT53cSwgJmNmaHNpLT5yeF9kb25lX3dvcmspOworfQorCitzdGF0aWMgdm9pZCBjZmhzaV93YWtlX3VwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2Zoc2kgKmNmaHNpID0gTlVMTDsKKwlpbnQgcmVzOworCWludCBsZW47CisJbG9uZyByZXQ7CisKKwljZmhzaSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY2Zoc2ksIHdha2VfdXBfd29yayk7CisKKwlpZiAodGVzdF9iaXQoQ0ZIU0lfU0hVVERPV04sICZjZmhzaS0+Yml0cykpCisJCXJldHVybjsKKworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChDRkhTSV9BV0FLRSwgJmNmaHNpLT5iaXRzKSkpIHsKKwkJLyogSXQgaGFwcGVuZXMgd2hlbiB3YWtldXAgaXMgcmVxdWVzdGVkIGJ5CisJCSAqIGJvdGggZW5kcyBhdCB0aGUgc2FtZSB0aW1lLiAqLworCQljbGVhcl9iaXQoQ0ZIU0lfV0FLRV9VUCwgJmNmaHNpLT5iaXRzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFjdGl2YXRlIHdha2UgbGluZS4gKi8KKwljZmhzaS0+ZGV2LT5jZmhzaV93YWtlX3VwKGNmaHNpLT5kZXYpOworCisJZGV2X2RiZygmY2Zoc2ktPm5kZXYtPmRldiwgIiVzOiBTdGFydCB3YWl0aW5nLlxuIiwKKwkJX19mdW5jX18pOworCisJLyogV2FpdCBmb3IgYWNrbm93bGVkZ2UuICovCisJcmV0ID0gQ0ZIU0lfV0FLRVVQX1RPVVQ7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoY2Zoc2ktPndha2VfdXBfd2FpdCwKKwkJCQkJdGVzdF9iaXQoQ0ZIU0lfV0FLRV9VUF9BQ0ssCisJCQkJCQkJJmNmaHNpLT5iaXRzKSwgcmV0KTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKKwkJLyogSW50ZXJydXB0ZWQgYnkgc2lnbmFsLiAqLworCQlkZXZfaW5mbygmY2Zoc2ktPm5kZXYtPmRldiwgIiVzOiBTaWduYWxsZWQ6ICVsZC5cbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJY2xlYXJfYml0KENGSFNJX1dBS0VfVVAsICZjZmhzaS0+Yml0cyk7CisJCWNmaHNpLT5kZXYtPmNmaHNpX3dha2VfZG93bihjZmhzaS0+ZGV2KTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoIXJldCkgeworCQkvKiBXYWtldXAgdGltZW91dCAqLworCQlkZXZfZXJyKCZjZmhzaS0+bmRldi0+ZGV2LCAiJXM6IFRpbWVvdXQuXG4iLAorCQkJX19mdW5jX18pOworCQljbGVhcl9iaXQoQ0ZIU0lfV0FLRV9VUCwgJmNmaHNpLT5iaXRzKTsKKwkJY2Zoc2ktPmRldi0+Y2Zoc2lfd2FrZV9kb3duKGNmaHNpLT5kZXYpOworCQlyZXR1cm47CisJfQorCWRldl9kYmcoJmNmaHNpLT5uZGV2LT5kZXYsICIlczogV29rZW4uXG4iLAorCQlfX2Z1bmNfXyk7CisKKwkvKiBDbGVhciBwb3dlciB1cCBiaXQuICovCisJc2V0X2JpdChDRkhTSV9BV0FLRSwgJmNmaHNpLT5iaXRzKTsKKwljbGVhcl9iaXQoQ0ZIU0lfV0FLRV9VUCwgJmNmaHNpLT5iaXRzKTsKKworCS8qIFJlc3VtZSByZWFkIG9wZXJhdGlvbi4gKi8KKwlpZiAoIXRlc3RfYml0KENGSFNJX1BFTkRJTkdfUlgsICZjZmhzaS0+Yml0cykpIHsKKwkJZGV2X2RiZygmY2Zoc2ktPm5kZXYtPmRldiwgIiVzOiBTdGFydCBSWC5cbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJlcyA9IGNmaHNpLT5kZXYtPmNmaHNpX3J4KGNmaHNpLT5yeF9wdHIsCisJCQkJY2Zoc2ktPnJ4X2xlbiwgY2Zoc2ktPmRldik7CisJCWlmIChXQVJOX09OKHJlcyA8IDApKSB7CisJCQlkZXZfZXJyKCZjZmhzaS0+bmRldi0+ZGV2LCAiJXM6IFJYIGVycm9yICVkLlxuIiwKKwkJCQlfX2Z1bmNfXywgcmVzKTsKKwkJfQorCX0KKworCS8qIENsZWFyIHBvd2VyIHVwIGFja25vd2xlZG1lbnQuICovCisJY2xlYXJfYml0KENGSFNJX1dBS0VfVVBfQUNLLCAmY2Zoc2ktPmJpdHMpOworCisJc3Bpbl9sb2NrX2JoKCZjZmhzaS0+bG9jayk7CisKKwkvKiBSZXN1bWUgdHJhbnNtaXQgaWYgcXVldWUgaXMgbm90IGVtcHR5LiAqLworCWlmICghc2tiX3BlZWsoJmNmaHNpLT5xaGVhZCkpIHsKKwkJZGV2X2RiZygmY2Zoc2ktPm5kZXYtPmRldiwgIiVzOiBQZWVyIHdha2UsIHN0YXJ0IHRpbWVyLlxuIiwKKwkJCV9fZnVuY19fKTsKKwkJLyogU3RhcnQgaW5hY3Rpdml0eSB0aW1lci4gKi8KKwkJbW9kX3RpbWVyKCZjZmhzaS0+dGltZXIsCisJCQkJamlmZmllcyArIENGSFNJX0lOQUNUSVZJVFlfVE9VVCk7CisJCXNwaW5fdW5sb2NrX2JoKCZjZmhzaS0+bG9jayk7CisJCXJldHVybjsKKwl9CisKKwlkZXZfZGJnKCZjZmhzaS0+bmRldi0+ZGV2LCAiJXM6IEhvc3Qgd2FrZS5cbiIsCisJCV9fZnVuY19fKTsKKworCXNwaW5fdW5sb2NrX2JoKCZjZmhzaS0+bG9jayk7CisKKwkvKiBDcmVhdGUgSFNJIGZyYW1lLiAqLworCWxlbiA9IGNmaHNpX3R4X2ZybSgoc3RydWN0IGNmaHNpX2Rlc2MgKiljZmhzaS0+dHhfYnVmLCBjZmhzaSk7CisKKwlpZiAobGlrZWx5KGxlbiA+IDApKSB7CisJCS8qIFNldCB1cCBuZXcgdHJhbnNmZXIuICovCisJCXJlcyA9IGNmaHNpLT5kZXYtPmNmaHNpX3R4KGNmaHNpLT50eF9idWYsIGxlbiwgY2Zoc2ktPmRldik7CisJCWlmIChXQVJOX09OKHJlcyA8IDApKSB7CisJCQlkZXZfZXJyKCZjZmhzaS0+bmRldi0+ZGV2LCAiJXM6IFRYIGVycm9yICVkLlxuIiwKKwkJCQlfX2Z1bmNfXywgcmVzKTsKKwkJCWNmaHNpX2Fib3J0X3R4KGNmaHNpKTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9lcnIoJmNmaHNpLT5uZGV2LT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gY3JlYXRlIEhTSSBmcmFtZTogJWQuXG4iLAorCQkJCV9fZnVuY19fLCBsZW4pOworCX0KKworfQorCitzdGF0aWMgdm9pZCBjZmhzaV93YWtlX2Rvd24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWxvbmcgcmV0OworCXN0cnVjdCBjZmhzaSAqY2Zoc2kgPSBOVUxMOworCXNpemVfdCBmaWZvX29jY3VwYW5jeTsKKworCWNmaHNpID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjZmhzaSwgd2FrZV9kb3duX3dvcmspOworCWRldl9kYmcoJmNmaHNpLT5uZGV2LT5kZXYsICIlcy5cbiIsCisJCV9fZnVuY19fKTsKKworCWlmICh0ZXN0X2JpdChDRkhTSV9TSFVURE9XTiwgJmNmaHNpLT5iaXRzKSkKKwkJcmV0dXJuOworCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgc29tZXRoaW5nIGluIEZJRk8uICovCisJaWYgKFdBUk5fT04oY2Zoc2ktPmRldi0+Y2Zoc2lfZmlmb19vY2N1cGFuY3koY2Zoc2ktPmRldiwKKwkJCQkJCQkmZmlmb19vY2N1cGFuY3kpKSkKKwkJZmlmb19vY2N1cGFuY3kgPSAwOworCisJaWYgKGZpZm9fb2NjdXBhbmN5KSB7CisJCWRldl9kYmcoJmNmaHNpLT5uZGV2LT5kZXYsCisJCQkJIiVzOiAldSB3b3JkcyBpbiBSWCBGSUZPLCByZXN0YXJ0IHRpbWVyLlxuIiwKKwkJCQlfX2Z1bmNfXywgKHVuc2lnbmVkKSBmaWZvX29jY3VwYW5jeSk7CisJCXNwaW5fbG9ja19iaCgmY2Zoc2ktPmxvY2spOworCQltb2RfdGltZXIoJmNmaHNpLT50aW1lciwKKwkJCQlqaWZmaWVzICsgQ0ZIU0lfSU5BQ1RJVklUWV9UT1VUKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmNmaHNpLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENhbmNlbCBwZW5kaW5nIFJYIHJlcXVlc3RzICovCisJY2Zoc2ktPmRldi0+Y2Zoc2lfcnhfY2FuY2VsKGNmaHNpLT5kZXYpOworCisJLyogRGVhY3RpdmF0ZSB3YWtlIGxpbmUuICovCisJY2Zoc2ktPmRldi0+Y2Zoc2lfd2FrZV9kb3duKGNmaHNpLT5kZXYpOworCisJLyogV2FpdCBmb3IgYWNrbm93bGVkZ2UuICovCisJcmV0ID0gQ0ZIU0lfV0FLRVVQX1RPVVQ7CisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoY2Zoc2ktPndha2VfZG93bl93YWl0LAorCQkJCQl0ZXN0X2JpdChDRkhTSV9XQUtFX0RPV05fQUNLLAorCQkJCQkJCSZjZmhzaS0+Yml0cyksCisJCQkJCXJldCk7CisJaWYgKHJldCA8IDApIHsKKwkJLyogSW50ZXJydXB0ZWQgYnkgc2lnbmFsLiAqLworCQlkZXZfaW5mbygmY2Zoc2ktPm5kZXYtPmRldiwgIiVzOiBTaWduYWxsZWQ6ICVsZC5cbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoIXJldCkgeworCQkvKiBUaW1lb3V0ICovCisJCWRldl9lcnIoJmNmaHNpLT5uZGV2LT5kZXYsICIlczogVGltZW91dC5cbiIsCisJCQlfX2Z1bmNfXyk7CisJfQorCisJLyogQ2xlYXIgcG93ZXIgZG93biBhY2tub3dsZWRtZW50LiAqLworCWNsZWFyX2JpdChDRkhTSV9XQUtFX0RPV05fQUNLLCAmY2Zoc2ktPmJpdHMpOworCWNsZWFyX2JpdChDRkhTSV9BV0FLRSwgJmNmaHNpLT5iaXRzKTsKKworCS8qIENoZWNrIGlmIHRoZXJlIGlzIHNvbWV0aGluZyBpbiBGSUZPLiAqLworCWlmIChXQVJOX09OKGNmaHNpLT5kZXYtPmNmaHNpX2ZpZm9fb2NjdXBhbmN5KGNmaHNpLT5kZXYsCisJCQkJCQkJJmZpZm9fb2NjdXBhbmN5KSkpCisJCWZpZm9fb2NjdXBhbmN5ID0gMDsKKworCWlmIChmaWZvX29jY3VwYW5jeSkgeworCQlkZXZfZGJnKCZjZmhzaS0+bmRldi0+ZGV2LAorCQkJCSIlczogJXUgd29yZHMgaW4gUlggRklGTywgd2FrZXVwIGZvcmNlZC5cbiIsCisJCQkJX19mdW5jX18sICh1bnNpZ25lZCkgZmlmb19vY2N1cGFuY3kpOworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQ0ZIU0lfV0FLRV9VUCwgJmNmaHNpLT5iaXRzKSkKKwkJCXF1ZXVlX3dvcmsoY2Zoc2ktPndxLCAmY2Zoc2ktPndha2VfdXBfd29yayk7CisJfSBlbHNlCisJCWRldl9kYmcoJmNmaHNpLT5uZGV2LT5kZXYsICIlczogRG9uZS5cbiIsCisJCQlfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIGNmaHNpX3dha2VfdXBfY2Ioc3RydWN0IGNmaHNpX2RydiAqZHJ2KQoreworCXN0cnVjdCBjZmhzaSAqY2Zoc2kgPSBOVUxMOworCisJY2Zoc2kgPSBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3QgY2Zoc2ksIGRydik7CisJZGV2X2RiZygmY2Zoc2ktPm5kZXYtPmRldiwgIiVzLlxuIiwKKwkJX19mdW5jX18pOworCisJc2V0X2JpdChDRkhTSV9XQUtFX1VQX0FDSywgJmNmaHNpLT5iaXRzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNmaHNpLT53YWtlX3VwX3dhaXQpOworCisJaWYgKHRlc3RfYml0KENGSFNJX1NIVVRET1dOLCAmY2Zoc2ktPmJpdHMpKQorCQlyZXR1cm47CisKKwkvKiBTY2hlZHVsZSB3YWtlIHVwIHdvcmsgcXVldWUgaWYgdGhlIHBlZXIgaW5pdGlhdGVzLiAqLworCWlmICghdGVzdF9hbmRfc2V0X2JpdChDRkhTSV9XQUtFX1VQLCAmY2Zoc2ktPmJpdHMpKQorCQlxdWV1ZV93b3JrKGNmaHNpLT53cSwgJmNmaHNpLT53YWtlX3VwX3dvcmspOworfQorCitzdGF0aWMgdm9pZCBjZmhzaV93YWtlX2Rvd25fY2Ioc3RydWN0IGNmaHNpX2RydiAqZHJ2KQoreworCXN0cnVjdCBjZmhzaSAqY2Zoc2kgPSBOVUxMOworCisJY2Zoc2kgPSBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3QgY2Zoc2ksIGRydik7CisJZGV2X2RiZygmY2Zoc2ktPm5kZXYtPmRldiwgIiVzLlxuIiwKKwkJX19mdW5jX18pOworCisJLyogSW5pdGlhdGluZyBsb3cgcG93ZXIgaXMgb25seSBwZXJtaXR0ZWQgYnkgdGhlIGhvc3QgKHVzKS4gKi8KKwlzZXRfYml0KENGSFNJX1dBS0VfRE9XTl9BQ0ssICZjZmhzaS0+Yml0cyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjZmhzaS0+d2FrZV9kb3duX3dhaXQpOworfQorCitzdGF0aWMgaW50IGNmaHNpX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2Zoc2kgKmNmaHNpID0gTlVMTDsKKwlpbnQgc3RhcnRfeGZlciA9IDA7CisJaW50IHRpbWVyX2FjdGl2ZTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNmaHNpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19iaCgmY2Zoc2ktPmxvY2spOworCisJc2tiX3F1ZXVlX3RhaWwoJmNmaHNpLT5xaGVhZCwgc2tiKTsKKworCS8qIFNhbml0eSBjaGVjazsgeG1pdCBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB1bnJlZ2lzdGVyX25ldGRldiAqLworCWlmIChXQVJOX09OKHRlc3RfYml0KENGSFNJX1NIVVRET1dOLCAmY2Zoc2ktPmJpdHMpKSkgeworCQlzcGluX3VubG9ja19iaCgmY2Zoc2ktPmxvY2spOworCQljZmhzaV9hYm9ydF90eChjZmhzaSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFNlbmQgZmxvdyBvZmYgaWYgbnVtYmVyIG9mIHBhY2tldHMgaXMgYWJvdmUgaGlnaCB3YXRlciBtYXJrLiAqLworCWlmICghY2Zoc2ktPmZsb3dfb2ZmX3NlbnQgJiYKKwkJY2Zoc2ktPnFoZWFkLnFsZW4gPiBjZmhzaS0+cV9oaWdoX21hcmsgJiYKKwkJY2Zoc2ktPmNmZGV2LmZsb3djdHJsKSB7CisJCWNmaHNpLT5mbG93X29mZl9zZW50ID0gMTsKKwkJY2Zoc2ktPmNmZGV2LmZsb3djdHJsKGNmaHNpLT5uZGV2LCBPRkYpOworCX0KKworCWlmIChjZmhzaS0+dHhfc3RhdGUgPT0gQ0ZIU0lfVFhfU1RBVEVfSURMRSkgeworCQljZmhzaS0+dHhfc3RhdGUgPSBDRkhTSV9UWF9TVEFURV9YRkVSOworCQlzdGFydF94ZmVyID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmY2Zoc2ktPmxvY2spOworCisJaWYgKCFzdGFydF94ZmVyKQorCQlyZXR1cm4gMDsKKworCS8qIERlbGV0ZSBpbmFjdGl2aXR5IHRpbWVyIGlmIHN0YXJ0ZWQuICovCisjaWZkZWYgQ09ORklHX1NNUAorCXRpbWVyX2FjdGl2ZSA9IGRlbF90aW1lcl9zeW5jKCZjZmhzaS0+dGltZXIpOworI2Vsc2UKKwl0aW1lcl9hY3RpdmUgPSBkZWxfdGltZXIoJmNmaHNpLT50aW1lcik7CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCisJaWYgKHRpbWVyX2FjdGl2ZSkgeworCQlzdHJ1Y3QgY2Zoc2lfZGVzYyAqZGVzYyA9IChzdHJ1Y3QgY2Zoc2lfZGVzYyAqKWNmaHNpLT50eF9idWY7CisJCWludCBsZW47CisJCWludCByZXM7CisKKwkJLyogQ3JlYXRlIEhTSSBmcmFtZS4gKi8KKwkJbGVuID0gY2Zoc2lfdHhfZnJtKGRlc2MsIGNmaHNpKTsKKwkJQlVHX09OKCFsZW4pOworCisJCS8qIFNldCB1cCBuZXcgdHJhbnNmZXIuICovCisJCXJlcyA9IGNmaHNpLT5kZXYtPmNmaHNpX3R4KGNmaHNpLT50eF9idWYsIGxlbiwgY2Zoc2ktPmRldik7CisJCWlmIChXQVJOX09OKHJlcyA8IDApKSB7CisJCQlkZXZfZXJyKCZjZmhzaS0+bmRldi0+ZGV2LCAiJXM6IFRYIGVycm9yICVkLlxuIiwKKwkJCQlfX2Z1bmNfXywgcmVzKTsKKwkJCWNmaHNpX2Fib3J0X3R4KGNmaHNpKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNjaGVkdWxlIHdha2UgdXAgd29yayBxdWV1ZSBpZiB0aGUgd2UgaW5pdGlhdGUuICovCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChDRkhTSV9XQUtFX1VQLCAmY2Zoc2ktPmJpdHMpKQorCQkJcXVldWVfd29yayhjZmhzaS0+d3EsICZjZmhzaS0+d2FrZV91cF93b3JrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZmhzaV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2Zoc2lfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjZmhzaV9vcHMgPSB7CisJLm5kb19vcGVuID0gY2Zoc2lfb3BlbiwKKwkubmRvX3N0b3AgPSBjZmhzaV9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQgPSBjZmhzaV94bWl0Cit9OworCitzdGF0aWMgdm9pZCBjZmhzaV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjZmhzaSAqY2Zoc2kgPSBuZXRkZXZfcHJpdihkZXYpOworCWRldi0+ZmVhdHVyZXMgPSAwOworCWRldi0+bmV0ZGV2X29wcyA9ICZjZmhzaV9vcHM7CisJZGV2LT50eXBlID0gQVJQSFJEX0NBSUY7CisJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVCB8IElGRl9OT0FSUDsKKwlkZXYtPm10dSA9IENGSFNJX01BWF9QQVlMT0FEX1NaOworCWRldi0+dHhfcXVldWVfbGVuID0gMDsKKwlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZjZmhzaS0+cWhlYWQpOworCWNmaHNpLT5jZmRldi5saW5rX3NlbGVjdCA9IENBSUZfTElOS19ISUdIX0JBTkRXOworCWNmaHNpLT5jZmRldi51c2VfZnJhZyA9IGZhbHNlOworCWNmaHNpLT5jZmRldi51c2Vfc3R4ID0gZmFsc2U7CisJY2Zoc2ktPmNmZGV2LnVzZV9mY3MgPSBmYWxzZTsKKwljZmhzaS0+bmRldiA9IGRldjsKK30KKworaW50IGNmaHNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNmaHNpICpjZmhzaSA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IGNmaHNpX2RldiAqZGV2OworCWludCByZXM7CisKKwluZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgY2Zoc2kpLCAiY2Zoc2klZCIsIGNmaHNpX3NldHVwKTsKKwlpZiAoIW5kZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGFsbG9jX25ldGRldiBmYWlsZWQuXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljZmhzaSA9IG5ldGRldl9wcml2KG5kZXYpOworCWNmaHNpLT5uZGV2ID0gbmRldjsKKwljZmhzaS0+cGRldiA9IHBkZXY7CisKKwkvKiBJbml0aWFsaXplIHN0YXRlIHZhaWFibGVzLiAqLworCWNmaHNpLT50eF9zdGF0ZSA9IENGSFNJX1RYX1NUQVRFX0lETEU7CisJY2Zoc2ktPnJ4X3N0YXRlID0gQ0ZIU0lfUlhfU1RBVEVfREVTQzsKKworCS8qIFNldCBmbG93IGluZm8gKi8KKwljZmhzaS0+Zmxvd19vZmZfc2VudCA9IDA7CisJY2Zoc2ktPnFfbG93X21hcmsgPSBMT1dfV0FURVJfTUFSSzsKKwljZmhzaS0+cV9oaWdoX21hcmsgPSBISUdIX1dBVEVSX01BUks7CisKKwkvKiBBc3NpZ24gdGhlIEhTSSBkZXZpY2UuICovCisJZGV2ID0gKHN0cnVjdCBjZmhzaV9kZXYgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwljZmhzaS0+ZGV2ID0gZGV2OworCisJLyogQXNzaWduIHRoZSBkcml2ZXIgdG8gdGhpcyBIU0kgZGV2aWNlLiAqLworCWRldi0+ZHJ2ID0gJmNmaHNpLT5kcnY7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgVFggYnVmZmVyIHdpdGggdGhlIHNpemUgb2YgYSBIU0kgcGFja2V0IGRlc2NyaXB0b3JzCisJICogYW5kIHRoZSBuZWNlc3Nhcnkgcm9vbSBmb3IgQ0FJRiBwYXlsb2FkIGZyYW1lcy4KKwkgKi8KKwljZmhzaS0+dHhfYnVmID0ga3phbGxvYyhDRkhTSV9CVUZfU1pfVFgsIEdGUF9LRVJORUwpOworCWlmICghY2Zoc2ktPnR4X2J1ZikgeworCQlkZXZfZXJyKCZuZGV2LT5kZXYsICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIFRYIGJ1ZmZlci5cbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJlcyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2FsbG9jX3R4OworCX0KKworCS8qCisJICogQWxsb2NhdGUgYSBSWCBidWZmZXIgd2l0aCB0aGUgc2l6ZSBvZiB0d28gSFNJIHBhY2tldCBkZXNjcmlwdG9ycyBhbmQKKwkgKiB0aGUgbmVjZXNzYXJ5IHJvb20gZm9yIENBSUYgcGF5bG9hZCBmcmFtZXMuCisJICovCisJY2Zoc2ktPnJ4X2J1ZiA9IGt6YWxsb2MoQ0ZIU0lfQlVGX1NaX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNmaHNpLT5yeF9idWYpIHsKKwkJZGV2X2VycigmbmRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBSWCBidWZmZXIuXG4iLAorCQkJX19mdW5jX18pOworCQlyZXMgPSAtRU5PREVWOworCQlnb3RvIGVycl9hbGxvY19yeDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHJlY2VpdmUgdmFyaWFibGVzLiAqLworCWNmaHNpLT5yeF9wdHIgPSBjZmhzaS0+cnhfYnVmOworCWNmaHNpLT5yeF9sZW4gPSBDRkhTSV9ERVNDX1NaOworCisJLyogSW5pdGlhbGl6ZSBzcGluIGxvY2tzLiAqLworCXNwaW5fbG9ja19pbml0KCZjZmhzaS0+bG9jayk7CisKKwkvKiBTZXQgdXAgdGhlIGRyaXZlci4gKi8KKwljZmhzaS0+ZHJ2LnR4X2RvbmVfY2IgPSBjZmhzaV90eF9kb25lX2NiOworCWNmaHNpLT5kcnYucnhfZG9uZV9jYiA9IGNmaHNpX3J4X2RvbmVfY2I7CisKKwkvKiBJbml0aWFsaXplIHRoZSB3b3JrIHF1ZXVlcy4gKi8KKwlJTklUX1dPUksoJmNmaHNpLT53YWtlX3VwX3dvcmssIGNmaHNpX3dha2VfdXApOworCUlOSVRfV09SSygmY2Zoc2ktPndha2VfZG93bl93b3JrLCBjZmhzaV93YWtlX2Rvd24pOworCUlOSVRfV09SSygmY2Zoc2ktPnJ4X2RvbmVfd29yaywgY2Zoc2lfcnhfZG9uZV93b3JrKTsKKwlJTklUX1dPUksoJmNmaHNpLT50eF9kb25lX3dvcmssIGNmaHNpX3R4X2RvbmVfd29yayk7CisKKwkvKiBDbGVhciBhbGwgYml0IGZpZWxkcy4gKi8KKwljbGVhcl9iaXQoQ0ZIU0lfV0FLRV9VUF9BQ0ssICZjZmhzaS0+Yml0cyk7CisJY2xlYXJfYml0KENGSFNJX1dBS0VfRE9XTl9BQ0ssICZjZmhzaS0+Yml0cyk7CisJY2xlYXJfYml0KENGSFNJX1dBS0VfVVAsICZjZmhzaS0+Yml0cyk7CisJY2xlYXJfYml0KENGSFNJX0FXQUtFLCAmY2Zoc2ktPmJpdHMpOworCWNsZWFyX2JpdChDRkhTSV9QRU5ESU5HX1JYLCAmY2Zoc2ktPmJpdHMpOworCisJLyogQ3JlYXRlIHdvcmsgdGhyZWFkLiAqLworCWNmaHNpLT53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKHBkZXYtPm5hbWUpOworCWlmICghY2Zoc2ktPndxKSB7CisJCWRldl9lcnIoJm5kZXYtPmRldiwgIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHdvcmsgcXVldWUuXG4iLAorCQkJX19mdW5jX18pOworCQlyZXMgPSAtRU5PREVWOworCQlnb3RvIGVycl9jcmVhdGVfd3E7CisJfQorCisJLyogSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlcy4gKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjZmhzaS0+d2FrZV91cF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjZmhzaS0+d2FrZV9kb3duX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNmaHNpLT5mbHVzaF9maWZvX3dhaXQpOworCisJLyogU2V0dXAgdGhlIGluYWN0aXZpdHkgdGltZXIuICovCisJaW5pdF90aW1lcigmY2Zoc2ktPnRpbWVyKTsKKwljZmhzaS0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNmaHNpOworCWNmaHNpLT50aW1lci5mdW5jdGlvbiA9IGNmaHNpX2luYWN0aXZpdHlfdG91dDsKKworCS8qIEFkZCBDQUlGIEhTSSBkZXZpY2UgdG8gbGlzdC4gKi8KKwlzcGluX2xvY2soJmNmaHNpX2xpc3RfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY2Zoc2ktPmxpc3QsICZjZmhzaV9saXN0KTsKKwlzcGluX3VubG9jaygmY2Zoc2lfbGlzdF9sb2NrKTsKKworCS8qIEFjdGl2YXRlIEhTSSBpbnRlcmZhY2UuICovCisJcmVzID0gY2Zoc2ktPmRldi0+Y2Zoc2lfdXAoY2Zoc2ktPmRldik7CisJaWYgKHJlcykgeworCQlkZXZfZXJyKCZjZmhzaS0+bmRldi0+ZGV2LAorCQkJIiVzOiBjYW4ndCBhY3RpdmF0ZSBIU0kgaW50ZXJmYWNlOiAlZC5cbiIsCisJCQlfX2Z1bmNfXywgcmVzKTsKKwkJZ290byBlcnJfYWN0aXZhdGU7CisJfQorCisJLyogRmx1c2ggRklGTyAqLworCXJlcyA9IGNmaHNpX2ZsdXNoX2ZpZm8oY2Zoc2kpOworCWlmIChyZXMpIHsKKwkJZGV2X2VycigmbmRldi0+ZGV2LCAiJXM6IENhbid0IGZsdXNoIEZJRk86ICVkLlxuIiwKKwkJCV9fZnVuY19fLCByZXMpOworCQlnb3RvIGVycl9uZXRfcmVnOworCX0KKworCWNmaHNpLT5kcnYud2FrZV91cF9jYiA9IGNmaHNpX3dha2VfdXBfY2I7CisJY2Zoc2ktPmRydi53YWtlX2Rvd25fY2IgPSBjZmhzaV93YWtlX2Rvd25fY2I7CisKKwkvKiBSZWdpc3RlciBuZXR3b3JrIGRldmljZS4gKi8KKwlyZXMgPSByZWdpc3Rlcl9uZXRkZXYobmRldik7CisJaWYgKHJlcykgeworCQlkZXZfZXJyKCZuZGV2LT5kZXYsICIlczogUmVnaXN0cmF0aW9uIGVycm9yOiAlZC5cbiIsCisJCQlfX2Z1bmNfXywgcmVzKTsKKwkJZ290byBlcnJfbmV0X3JlZzsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJcmV0dXJuIHJlczsKKworIGVycl9uZXRfcmVnOgorCWNmaHNpLT5kZXYtPmNmaHNpX2Rvd24oY2Zoc2ktPmRldik7CisgZXJyX2FjdGl2YXRlOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGNmaHNpLT53cSk7CisgZXJyX2NyZWF0ZV93cToKKwlrZnJlZShjZmhzaS0+cnhfYnVmKTsKKyBlcnJfYWxsb2Nfcng6CisJa2ZyZWUoY2Zoc2ktPnR4X2J1Zik7CisgZXJyX2FsbG9jX3R4OgorCWZyZWVfbmV0ZGV2KG5kZXYpOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgY2Zoc2lfc2h1dGRvd24oc3RydWN0IGNmaHNpICpjZmhzaSwgYm9vbCByZW1vdmVfcGxhdGZvcm1fZGV2KQoreworCXU4ICp0eF9idWYsICpyeF9idWY7CisKKwkvKiBTdG9wIFRYaW5nICovCisJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKGNmaHNpLT5uZGV2KTsKKworCS8qIGdvaW5nIHRvIHNodXRkb3duIGRyaXZlciAqLworCXNldF9iaXQoQ0ZIU0lfU0hVVERPV04sICZjZmhzaS0+Yml0cyk7CisKKwlpZiAocmVtb3ZlX3BsYXRmb3JtX2RldikgeworCQkvKiBGbHVzaCB3b3JrcXVldWUgKi8KKwkJZmx1c2hfd29ya3F1ZXVlKGNmaHNpLT53cSk7CisKKwkJLyogTm90aWZ5IGRldmljZS4gKi8KKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoY2Zoc2ktPnBkZXYpOworCX0KKworCS8qIEZsdXNoIHdvcmtxdWV1ZSAqLworCWZsdXNoX3dvcmtxdWV1ZShjZmhzaS0+d3EpOworCisJLyogRGVsZXRlIHRpbWVyIGlmIHBlbmRpbmcgKi8KKyNpZmRlZiBDT05GSUdfU01QCisJZGVsX3RpbWVyX3N5bmMoJmNmaHNpLT50aW1lcik7CisjZWxzZQorCWRlbF90aW1lcigmY2Zoc2ktPnRpbWVyKTsKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKKwkvKiBDYW5jZWwgcGVuZGluZyBSWCByZXF1ZXN0IChpZiBhbnkpICovCisJY2Zoc2ktPmRldi0+Y2Zoc2lfcnhfY2FuY2VsKGNmaHNpLT5kZXYpOworCisJLyogRmx1c2ggYWdhaW4gYW5kIGRlc3Ryb3kgd29ya3F1ZXVlICovCisJZGVzdHJveV93b3JrcXVldWUoY2Zoc2ktPndxKTsKKworCS8qIFN0b3JlIGJ1ZmZlcmVzOiB3aWxsIGJlIGZyZWVkIGxhdGVyLiAqLworCXR4X2J1ZiA9IGNmaHNpLT50eF9idWY7CisJcnhfYnVmID0gY2Zoc2ktPnJ4X2J1ZjsKKworCS8qIEZsdXNoIHRyYW5zbWl0IHF1ZXVlcy4gKi8KKwljZmhzaV9hYm9ydF90eChjZmhzaSk7CisKKwkvKiBEZWFjdGl2YXRlIGludGVyZmFjZSAqLworCWNmaHNpLT5kZXYtPmNmaHNpX2Rvd24oY2Zoc2ktPmRldik7CisKKwkvKiBGaW5hbGx5IHVucmVnaXN0ZXIgdGhlIG5ldHdvcmsgZGV2aWNlLiAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KGNmaHNpLT5uZGV2KTsKKworCS8qIEZyZWUgYnVmZmVycy4gKi8KKwlrZnJlZSh0eF9idWYpOworCWtmcmVlKHJ4X2J1Zik7Cit9CisKK2ludCBjZmhzaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqbjsKKwlzdHJ1Y3QgY2Zoc2kgKmNmaHNpID0gTlVMTDsKKwlzdHJ1Y3QgY2Zoc2lfZGV2ICpkZXY7CisKKwlkZXYgPSAoc3RydWN0IGNmaHNpX2RldiAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXNwaW5fbG9jaygmY2Zoc2lfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9ub2RlLCBuLCAmY2Zoc2lfbGlzdCkgeworCQljZmhzaSA9IGxpc3RfZW50cnkobGlzdF9ub2RlLCBzdHJ1Y3QgY2Zoc2ksIGxpc3QpOworCQkvKiBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZS4gKi8KKwkJaWYgKGNmaHNpLT5kZXYgPT0gZGV2KSB7CisJCQkvKiBSZW1vdmUgZnJvbSBsaXN0LiAqLworCQkJbGlzdF9kZWwobGlzdF9ub2RlKTsKKwkJCXNwaW5fdW5sb2NrKCZjZmhzaV9saXN0X2xvY2spOworCisJCQkvKiBTaHV0ZG93biBkcml2ZXIuICovCisJCQljZmhzaV9zaHV0ZG93bihjZmhzaSwgZmFsc2UpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmY2Zoc2lfbGlzdF9sb2NrKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjZmhzaV9wbGF0X2RydiA9IHsKKwkucHJvYmUgPSBjZmhzaV9wcm9iZSwKKwkucmVtb3ZlID0gY2Zoc2lfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImNmaHNpIiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIH0sCit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgY2Zoc2lfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqbjsKKwlzdHJ1Y3QgY2Zoc2kgKmNmaHNpID0gTlVMTDsKKworCXNwaW5fbG9jaygmY2Zoc2lfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9ub2RlLCBuLCAmY2Zoc2lfbGlzdCkgeworCQljZmhzaSA9IGxpc3RfZW50cnkobGlzdF9ub2RlLCBzdHJ1Y3QgY2Zoc2ksIGxpc3QpOworCisJCS8qIFJlbW92ZSBmcm9tIGxpc3QuICovCisJCWxpc3RfZGVsKGxpc3Rfbm9kZSk7CisJCXNwaW5fdW5sb2NrKCZjZmhzaV9saXN0X2xvY2spOworCisJCS8qIFNodXRkb3duIGRyaXZlci4gKi8KKwkJY2Zoc2lfc2h1dGRvd24oY2Zoc2ksIHRydWUpOworCisJCXNwaW5fbG9jaygmY2Zoc2lfbGlzdF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmNmaHNpX2xpc3RfbG9jayk7CisKKwkvKiBVbnJlZ2lzdGVyIHBsYXRmb3JtIGRyaXZlci4gKi8KKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY2Zoc2lfcGxhdF9kcnYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjZmhzaV9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXN1bHQ7CisKKwkvKiBJbml0aWFsaXplIHNwaW4gbG9jay4gKi8KKwlzcGluX2xvY2tfaW5pdCgmY2Zoc2lfbGlzdF9sb2NrKTsKKworCS8qIFJlZ2lzdGVyIHBsYXRmb3JtIGRyaXZlci4gKi8KKwlyZXN1bHQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmNmaHNpX3BsYXRfZHJ2KTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIHBsYXRmb3JtIEhTSSBkcml2ZXI6ICVkLlxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyX2Rldl9yZWdpc3RlcjsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworCisgZXJyX2Rldl9yZWdpc3RlcjoKKwlyZXR1cm4gcmVzdWx0OworfQorCittb2R1bGVfaW5pdChjZmhzaV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChjZmhzaV9leGl0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc2VyaWFsLmMgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc2VyaWFsLmMKaW5kZXggM2RmMGMwZi4uMjM0MDZlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zZXJpYWwuYwpAQCAtNCw4ICs0LDggQEAKICAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NobV91NTUwMC5jIGIvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NobV91NTUwMC5jCmluZGV4IDVmNzcxYWIuLjg5ZDc2YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zaG1fdTU1MDAuYworKysgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc2htX3U1NTAwLmMKQEAgLTcsNyArNyw2IEBACiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjoiIGZtdAogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zaG1jb3JlLmMgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc2htY29yZS5jCmluZGV4IDczMWFhMTEuLmQ0YjI2ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zaG1jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NobWNvcmUuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJdTMyIGF2YWlsX2VtcHR5YnVmZiA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKLQlwc2htX2RydiA9IChzdHJ1Y3Qgc2htZHJ2X2xheWVyICopcHJpdjsKKwlwc2htX2RydiA9IHByaXY7CiAKIAkvKiBDaGVjayBmb3IgcmVjZWl2ZWQgYnVmZmVycy4gKi8KIAlpZiAobWJ4X21zZyAmIFNITV9GVUxMX01BU0spIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zcGkuYyBiL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zcGkuYwppbmRleCA1N2U2MzkzLi4wZjhkZWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NwaS5jCkBAIC01LDcgKzUsNiBAQAogICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NwaV9zbGF2ZS5jIGIvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NwaV9zbGF2ZS5jCmluZGV4IGIwMDllMDMuLmUxMzllMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zcGlfc2xhdmUuYworKysgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc3BpX3NsYXZlLmMKQEAgLTQsNyArNCw2IEBACiAgKiBBdXRob3I6ICBEYW5pZWwgTWFydGVuc3NvbiAvIERhbmllbC5NYXJ0ZW5zc29uQHN0ZXJpY3Nzb24uY29tCiAgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIuCiAgKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwppbmRleCAxZDY5OWUzLi5mNmM5OGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwpAQCAtNCw3ICs0LDYgQEAKIGNvbmZpZyBDQU5fVkNBTgogCXRyaXN0YXRlICJWaXJ0dWFsIExvY2FsIENBTiBJbnRlcmZhY2UgKHZjYW4pIgogCWRlcGVuZHMgb24gQ0FOCi0JZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgU2ltaWxhciB0byB0aGUgbmV0d29yayBsb29wYmFjayBkZXZpY2VzLCB2Y2FuIG9mZmVycyBhCiAJICB2aXJ0dWFsIGxvY2FsIENBTiBpbnRlcmZhY2UuCkBAIC0xNSw3ICsxNCw2IEBACiBjb25maWcgQ0FOX1NMQ0FOCiAJdHJpc3RhdGUgIlNlcmlhbCAvIFVTQiBzZXJpYWwgQ0FOIEFkYXB0b3JzIChzbGNhbikiCiAJZGVwZW5kcyBvbiBDQU4KLQlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBDQU4gZHJpdmVyIGZvciBzZXZlcmFsICdsb3cgY29zdCcgQ0FOIGludGVyZmFjZXMgdGhhdCBhcmUgYXR0YWNoZWQKIAkgIHZpYSBzZXJpYWwgbGluZXMgb3IgdmlhIFVTQi10by1zZXJpYWwgYWRhcHRlcnMgdXNpbmcgdGhlIExBV0lDRUwKQEAgLTM2LDcgKzM0LDcgQEAKIGNvbmZpZyBDQU5fREVWCiAJdHJpc3RhdGUgIlBsYXRmb3JtIENBTiBkcml2ZXJzIHdpdGggTmV0bGluayBzdXBwb3J0IgogCWRlcGVuZHMgb24gQ0FOCi0JZGVmYXVsdCBZCisJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgRW5hYmxlcyB0aGUgY29tbW9uIGZyYW1ld29yayBmb3IgcGxhdGZvcm0gQ0FOIGRyaXZlcnMgd2l0aCBOZXRsaW5rCiAJICBzdXBwb3J0LiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZvciBDQU4gZHJpdmVycy4KQEAgLTQ1LDcgKzQzLDcgQEAKIGNvbmZpZyBDQU5fQ0FMQ19CSVRUSU1JTkcKIAlib29sICJDQU4gYml0LXRpbWluZyBjYWxjdWxhdGlvbiIKIAlkZXBlbmRzIG9uIENBTl9ERVYKLQlkZWZhdWx0IFkKKwlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBJZiBlbmFibGVkLCBDQU4gYml0LXRpbWluZyBwYXJhbWV0ZXJzIHdpbGwgYmUgY2FsY3VsYXRlZCBmb3IgdGhlCiAJICBiaXQtcmF0ZSBzcGVjaWZpZWQgdmlhIE5ldGxpbmsgYXJndW1lbnQgImJpdHJhdGUiIHdoZW4gdGhlIGRldmljZQpAQCAtNTgsOSArNTYsMTAgQEAKIAogY29uZmlnIENBTl9BVDkxCiAJdHJpc3RhdGUgIkF0bWVsIEFUOTEgb25jaGlwIENBTiBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gQ0FOX0RFViAmJiBBUkNIX0FUOTFTQU05MjYzCisJZGVwZW5kcyBvbiBDQU5fREVWICYmIChBUkNIX0FUOTFTQU05MjYzIHx8IEFSQ0hfQVQ5MVNBTTlYNSkKIAktLS1oZWxwLS0tCi0JICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgU29DIENBTiBjb250cm9sbGVyIGluIEF0bWVsJ3MgQVQ5MVNBTTkyNjMuCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgU29DIENBTiBjb250cm9sbGVyIGluIEF0bWVsJ3MgQVQ5MVNBTTkyNjMKKwkgIGFuZCBBVDkxU0FNOVg1IHByb2Nlc3NvcnMuCiAKIGNvbmZpZyBDQU5fVElfSEVDQwogCWRlcGVuZHMgb24gQ0FOX0RFViAmJiBBUkNIX09NQVAzCkBAIC0xMjQsNyArMTIzLDYgQEAKIGNvbmZpZyBDQU5fREVCVUdfREVWSUNFUwogCWJvb2wgIkNBTiBkZXZpY2VzIGRlYnVnZ2luZyBtZXNzYWdlcyIKIAlkZXBlbmRzIG9uIENBTgotCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIENBTiBkZXZpY2UgZHJpdmVycyB0byBwcm9kdWNlIGEgYnVuY2ggb2YKIAkgIGRlYnVnIG1lc3NhZ2VzIHRvIHRoZSBzeXN0ZW0gbG9nLiAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSBoYXZpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9hdDkxX2Nhbi5jIGIvZHJpdmVycy9uZXQvY2FuL2F0OTFfY2FuLmMKaW5kZXggNzRlZmI1YS4uMTIxZWRlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2F0OTFfY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2F0OTFfY2FuLmMKQEAgLTQxLDMyICs0MSw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAKLSNkZWZpbmUgQVQ5MV9OQVBJX1dFSUdIVAkxMQotCi0vKgotICogUlgvVFggTWFpbGJveCBzcGxpdAotICogZG9uJ3QgZGFyZSB0byB0b3VjaAotICovCi0jZGVmaW5lIEFUOTFfTUJfUlhfTlVNCQkxMQotI2RlZmluZSBBVDkxX01CX1RYX1NISUZUCTIKLQotI2RlZmluZSBBVDkxX01CX1JYX0ZJUlNUCTEKLSNkZWZpbmUgQVQ5MV9NQl9SWF9MQVNUCQkoQVQ5MV9NQl9SWF9GSVJTVCArIEFUOTFfTUJfUlhfTlVNIC0gMSkKLQotI2RlZmluZSBBVDkxX01CX1JYX01BU0soaSkJKCgxIDw8IChpKSkgLSAxKQotI2RlZmluZSBBVDkxX01CX1JYX1NQTElUCTgKLSNkZWZpbmUgQVQ5MV9NQl9SWF9MT1dfTEFTVAkoQVQ5MV9NQl9SWF9TUExJVCAtIDEpCi0jZGVmaW5lIEFUOTFfTUJfUlhfTE9XX01BU0sJKEFUOTFfTUJfUlhfTUFTSyhBVDkxX01CX1JYX1NQTElUKSAmIFwKLQkJCQkgfkFUOTFfTUJfUlhfTUFTSyhBVDkxX01CX1JYX0ZJUlNUKSkKLQotI2RlZmluZSBBVDkxX01CX1RYX05VTQkJKDEgPDwgQVQ5MV9NQl9UWF9TSElGVCkKLSNkZWZpbmUgQVQ5MV9NQl9UWF9GSVJTVAkoQVQ5MV9NQl9SWF9MQVNUICsgMSkKLSNkZWZpbmUgQVQ5MV9NQl9UWF9MQVNUCQkoQVQ5MV9NQl9UWF9GSVJTVCArIEFUOTFfTUJfVFhfTlVNIC0gMSkKLQotI2RlZmluZSBBVDkxX05FWFRfUFJJT19TSElGVAkoQVQ5MV9NQl9UWF9TSElGVCkKLSNkZWZpbmUgQVQ5MV9ORVhUX1BSSU9fTUFTSwkoMHhmIDw8IEFUOTFfTUJfVFhfU0hJRlQpCi0jZGVmaW5lIEFUOTFfTkVYVF9NQl9NQVNLCShBVDkxX01CX1RYX05VTSAtIDEpCi0jZGVmaW5lIEFUOTFfTkVYVF9NQVNLCQkoKEFUOTFfTUJfVFhfTlVNIC0gMSkgfCBBVDkxX05FWFRfUFJJT19NQVNLKQorI2RlZmluZSBBVDkxX01CX01BU0soaSkJCSgoMSA8PCAoaSkpIC0gMSkKIAogLyogQ29tbW9uIHJlZ2lzdGVycyAqLwogZW51bSBhdDkxX3JlZyB7CkBAIC0xMjgsMTIgKzEwMyw2IEBACiB9OwogCiAvKiBJbnRlcnJ1cHQgbWFzayBiaXRzICovCi0jZGVmaW5lIEFUOTFfSVJRX01CX1JYCQkoKDEgPDwgKEFUOTFfTUJfUlhfTEFTVCArIDEpKSBcCi0JCQkJIC0gKDEgPDwgQVQ5MV9NQl9SWF9GSVJTVCkpCi0jZGVmaW5lIEFUOTFfSVJRX01CX1RYCQkoKDEgPDwgKEFUOTFfTUJfVFhfTEFTVCArIDEpKSBcCi0JCQkJIC0gKDEgPDwgQVQ5MV9NQl9UWF9GSVJTVCkpCi0jZGVmaW5lIEFUOTFfSVJRX01CX0FMTAkJKEFUOTFfSVJRX01CX1JYIHwgQVQ5MV9JUlFfTUJfVFgpCi0KICNkZWZpbmUgQVQ5MV9JUlFfRVJSQQkJKDEgPDwgMTYpCiAjZGVmaW5lIEFUOTFfSVJRX1dBUk4JCSgxIDw8IDE3KQogI2RlZmluZSBBVDkxX0lSUV9FUlJQCQkoMSA8PCAxOCkKQEAgLTE1NiwyMiArMTI1LDUxIEBACiAKICNkZWZpbmUgQVQ5MV9JUlFfQUxMCQkoMHgxZmZmZmZmZikKIAorZW51bSBhdDkxX2RldnR5cGUgeworCUFUOTFfREVWVFlQRV9TQU05MjYzLAorCUFUOTFfREVWVFlQRV9TQU05WDUsCit9OworCitzdHJ1Y3QgYXQ5MV9kZXZ0eXBlX2RhdGEgeworCXVuc2lnbmVkIGludCByeF9maXJzdDsKKwl1bnNpZ25lZCBpbnQgcnhfc3BsaXQ7CisJdW5zaWduZWQgaW50IHJ4X2xhc3Q7CisJdW5zaWduZWQgaW50IHR4X3NoaWZ0OworCWVudW0gYXQ5MV9kZXZ0eXBlIHR5cGU7Cit9OworCiBzdHJ1Y3QgYXQ5MV9wcml2IHsKLQlzdHJ1Y3QgY2FuX3ByaXYJCWNhbjsJICAgLyogbXVzdCBiZSB0aGUgZmlyc3QgbWVtYmVyISAqLwotCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7Ci0Jc3RydWN0IG5hcGlfc3RydWN0CW5hcGk7CisJc3RydWN0IGNhbl9wcml2IGNhbjsJCS8qIG11c3QgYmUgdGhlIGZpcnN0IG1lbWJlciEgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOwogCi0Jdm9pZCBfX2lvbWVtCQkqcmVnX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKIAotCXUzMgkJCXJlZ19zcjsKLQl1bnNpZ25lZCBpbnQJCXR4X25leHQ7Ci0JdW5zaWduZWQgaW50CQl0eF9lY2hvOwotCXVuc2lnbmVkIGludAkJcnhfbmV4dDsKKwl1MzIgcmVnX3NyOworCXVuc2lnbmVkIGludCB0eF9uZXh0OworCXVuc2lnbmVkIGludCB0eF9lY2hvOworCXVuc2lnbmVkIGludCByeF9uZXh0OworCXN0cnVjdCBhdDkxX2RldnR5cGVfZGF0YSBkZXZ0eXBlX2RhdGE7CiAKLQlzdHJ1Y3QgY2xrCQkqY2xrOwotCXN0cnVjdCBhdDkxX2Nhbl9kYXRhCSpwZGF0YTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGF0OTFfY2FuX2RhdGEgKnBkYXRhOwogCi0JY2FuaWRfdAkJCW1iMF9pZDsKKwljYW5pZF90IG1iMF9pZDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXQ5MV9kZXZ0eXBlX2RhdGEgYXQ5MV9kZXZ0eXBlX2RhdGFbXSBfX2RldmluaXRjb25zdCA9IHsKKwlbQVQ5MV9ERVZUWVBFX1NBTTkyNjNdID0geworCQkucnhfZmlyc3QgPSAxLAorCQkucnhfc3BsaXQgPSA4LAorCQkucnhfbGFzdCA9IDExLAorCQkudHhfc2hpZnQgPSAyLAorCX0sCisJW0FUOTFfREVWVFlQRV9TQU05WDVdID0geworCQkucnhfZmlyc3QgPSAwLAorCQkucnhfc3BsaXQgPSA0LAorCQkucnhfbGFzdCA9IDUsCisJCS50eF9zaGlmdCA9IDEsCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2FuX2JpdHRpbWluZ19jb25zdCBhdDkxX2JpdHRpbWluZ19jb25zdCA9IHsKQEAgLTE4NiwxOSArMTg0LDExMSBAQAogCS5icnBfaW5jCT0gMSwKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IGdldF90eF9uZXh0X21iKGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYpCi17Ci0JcmV0dXJuIChwcml2LT50eF9uZXh0ICYgQVQ5MV9ORVhUX01CX01BU0spICsgQVQ5MV9NQl9UWF9GSVJTVDsKKyNkZWZpbmUgQVQ5MV9JUyhfbW9kZWwpIFwKK3N0YXRpYyBpbmxpbmUgaW50IGF0OTFfaXNfc2FtIyNfbW9kZWwoY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdikgXAoreyBcCisJcmV0dXJuIHByaXYtPmRldnR5cGVfZGF0YS50eXBlID09IEFUOTFfREVWVFlQRV9TQU0jI19tb2RlbDsgXAogfQogCi1zdGF0aWMgaW5saW5lIGludCBnZXRfdHhfbmV4dF9wcmlvKGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYpCitBVDkxX0lTKDkyNjMpOworQVQ5MV9JUyg5WDUpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfbWJfcnhfZmlyc3QoY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdikKIHsKLQlyZXR1cm4gKHByaXYtPnR4X25leHQgPj4gQVQ5MV9ORVhUX1BSSU9fU0hJRlQpICYgMHhmOworCXJldHVybiBwcml2LT5kZXZ0eXBlX2RhdGEucnhfZmlyc3Q7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGdldF90eF9lY2hvX21iKGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfbWJfcnhfbGFzdChjb25zdCBzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2KQogewotCXJldHVybiAocHJpdi0+dHhfZWNobyAmIEFUOTFfTkVYVF9NQl9NQVNLKSArIEFUOTFfTUJfVFhfRklSU1Q7CisJcmV0dXJuIHByaXYtPmRldnR5cGVfZGF0YS5yeF9sYXN0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfbWJfcnhfc3BsaXQoY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdikKK3sKKwlyZXR1cm4gcHJpdi0+ZGV2dHlwZV9kYXRhLnJ4X3NwbGl0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfbWJfcnhfbnVtKGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYpCit7CisJcmV0dXJuIGdldF9tYl9yeF9sYXN0KHByaXYpIC0gZ2V0X21iX3J4X2ZpcnN0KHByaXYpICsgMTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X21iX3J4X2xvd19sYXN0KGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYpCit7CisJcmV0dXJuIGdldF9tYl9yeF9zcGxpdChwcml2KSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9tYl9yeF9sb3dfbWFzayhjb25zdCBzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2KQoreworCXJldHVybiBBVDkxX01CX01BU0soZ2V0X21iX3J4X3NwbGl0KHByaXYpKSAmCisJCX5BVDkxX01CX01BU0soZ2V0X21iX3J4X2ZpcnN0KHByaXYpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X21iX3R4X3NoaWZ0KGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYpCit7CisJcmV0dXJuIHByaXYtPmRldnR5cGVfZGF0YS50eF9zaGlmdDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X21iX3R4X251bShjb25zdCBzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2KQoreworCXJldHVybiAxIDw8IGdldF9tYl90eF9zaGlmdChwcml2KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X21iX3R4X2ZpcnN0KGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYpCit7CisJcmV0dXJuIGdldF9tYl9yeF9sYXN0KHByaXYpICsgMTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X21iX3R4X2xhc3QoY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdikKK3sKKwlyZXR1cm4gZ2V0X21iX3R4X2ZpcnN0KHByaXYpICsgZ2V0X21iX3R4X251bShwcml2KSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9uZXh0X3ByaW9fc2hpZnQoY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdikKK3sKKwlyZXR1cm4gZ2V0X21iX3R4X3NoaWZ0KHByaXYpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfbmV4dF9wcmlvX21hc2soY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdikKK3sKKwlyZXR1cm4gMHhmIDw8IGdldF9tYl90eF9zaGlmdChwcml2KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X25leHRfbWJfbWFzayhjb25zdCBzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2KQoreworCXJldHVybiBBVDkxX01CX01BU0soZ2V0X21iX3R4X3NoaWZ0KHByaXYpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X25leHRfbWFzayhjb25zdCBzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2KQoreworCXJldHVybiBnZXRfbmV4dF9tYl9tYXNrKHByaXYpIHwgZ2V0X25leHRfcHJpb19tYXNrKHByaXYpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfaXJxX21iX3J4KGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYpCit7CisJcmV0dXJuIEFUOTFfTUJfTUFTSyhnZXRfbWJfcnhfbGFzdChwcml2KSArIDEpICYKKwkJfkFUOTFfTUJfTUFTSyhnZXRfbWJfcnhfZmlyc3QocHJpdikpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfaXJxX21iX3R4KGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYpCit7CisJcmV0dXJuIEFUOTFfTUJfTUFTSyhnZXRfbWJfdHhfbGFzdChwcml2KSArIDEpICYKKwkJfkFUOTFfTUJfTUFTSyhnZXRfbWJfdHhfZmlyc3QocHJpdikpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfdHhfbmV4dF9tYihjb25zdCBzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2KQoreworCXJldHVybiAocHJpdi0+dHhfbmV4dCAmIGdldF9uZXh0X21iX21hc2socHJpdikpICsgZ2V0X21iX3R4X2ZpcnN0KHByaXYpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfdHhfbmV4dF9wcmlvKGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYpCit7CisJcmV0dXJuIChwcml2LT50eF9uZXh0ID4+IGdldF9uZXh0X3ByaW9fc2hpZnQocHJpdikpICYgMHhmOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfdHhfZWNob19tYihjb25zdCBzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2KQoreworCXJldHVybiAocHJpdi0+dHhfZWNobyAmIGdldF9uZXh0X21iX21hc2socHJpdikpICsgZ2V0X21iX3R4X2ZpcnN0KHByaXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBhdDkxX3JlYWQoY29uc3Qgc3RydWN0IGF0OTFfcHJpdiAqcHJpdiwgZW51bSBhdDkxX3JlZyByZWcpCkBAIC0yNTksMjkgKzM0OSwyOSBAQAogCSAqIG92ZXJmbG93LgogCSAqLwogCXJlZ19taWQgPSBhdDkxX2Nhbl9pZF90b19yZWdfbWlkKHByaXYtPm1iMF9pZCk7Ci0JZm9yIChpID0gMDsgaSA8IEFUOTFfTUJfUlhfRklSU1Q7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBnZXRfbWJfcnhfZmlyc3QocHJpdik7IGkrKykgewogCQlzZXRfbWJfbW9kZShwcml2LCBpLCBBVDkxX01CX01PREVfRElTQUJMRUQpOwogCQlhdDkxX3dyaXRlKHByaXYsIEFUOTFfTUlEKGkpLCByZWdfbWlkKTsKIAkJYXQ5MV93cml0ZShwcml2LCBBVDkxX01DUihpKSwgMHgwKTsJLyogY2xlYXIgZGxjICovCiAJfQogCi0JZm9yIChpID0gQVQ5MV9NQl9SWF9GSVJTVDsgaSA8IEFUOTFfTUJfUlhfTEFTVDsgaSsrKQorCWZvciAoaSA9IGdldF9tYl9yeF9maXJzdChwcml2KTsgaSA8IGdldF9tYl9yeF9sYXN0KHByaXYpOyBpKyspCiAJCXNldF9tYl9tb2RlKHByaXYsIGksIEFUOTFfTUJfTU9ERV9SWCk7Ci0Jc2V0X21iX21vZGUocHJpdiwgQVQ5MV9NQl9SWF9MQVNULCBBVDkxX01CX01PREVfUlhfT1ZSV1IpOworCXNldF9tYl9tb2RlKHByaXYsIGdldF9tYl9yeF9sYXN0KHByaXYpLCBBVDkxX01CX01PREVfUlhfT1ZSV1IpOwogCiAJLyogcmVzZXQgYWNjZXB0YW5jZSBtYXNrIGFuZCBpZCByZWdpc3RlciAqLwotCWZvciAoaSA9IEFUOTFfTUJfUlhfRklSU1Q7IGkgPD0gQVQ5MV9NQl9SWF9MQVNUOyBpKyspIHsKLQkJYXQ5MV93cml0ZShwcml2LCBBVDkxX01BTShpKSwgMHgwICk7CisJZm9yIChpID0gZ2V0X21iX3J4X2ZpcnN0KHByaXYpOyBpIDw9IGdldF9tYl9yeF9sYXN0KHByaXYpOyBpKyspIHsKKwkJYXQ5MV93cml0ZShwcml2LCBBVDkxX01BTShpKSwgMHgwKTsKIAkJYXQ5MV93cml0ZShwcml2LCBBVDkxX01JRChpKSwgQVQ5MV9NSURfTUlERSk7CiAJfQogCiAJLyogVGhlIGxhc3QgNCBtYWlsYm94ZXMgYXJlIHVzZWQgZm9yIHRyYW5zbWl0dGluZy4gKi8KLQlmb3IgKGkgPSBBVDkxX01CX1RYX0ZJUlNUOyBpIDw9IEFUOTFfTUJfVFhfTEFTVDsgaSsrKQorCWZvciAoaSA9IGdldF9tYl90eF9maXJzdChwcml2KTsgaSA8PSBnZXRfbWJfdHhfbGFzdChwcml2KTsgaSsrKQogCQlzZXRfbWJfbW9kZV9wcmlvKHByaXYsIGksIEFUOTFfTUJfTU9ERV9UWCwgMCk7CiAKIAkvKiBSZXNldCB0eCBhbmQgcnggaGVscGVyIHBvaW50ZXJzICovCiAJcHJpdi0+dHhfbmV4dCA9IHByaXYtPnR4X2VjaG8gPSAwOwotCXByaXYtPnJ4X25leHQgPSBBVDkxX01CX1JYX0ZJUlNUOworCXByaXYtPnJ4X25leHQgPSBnZXRfbWJfcnhfZmlyc3QocHJpdik7CiB9CiAKIHN0YXRpYyBpbnQgYXQ5MV9zZXRfYml0dGltaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0zMzYsNyArNDI2LDcgQEAKIAlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOwogCiAJLyogRW5hYmxlIGludGVycnVwdHMgKi8KLQlyZWdfaWVyID0gQVQ5MV9JUlFfTUJfUlggfCBBVDkxX0lSUV9FUlJQIHwgQVQ5MV9JUlFfRVJSX0ZSQU1FOworCXJlZ19pZXIgPSBnZXRfaXJxX21iX3J4KHByaXYpIHwgQVQ5MV9JUlFfRVJSUCB8IEFUOTFfSVJRX0VSUl9GUkFNRTsKIAlhdDkxX3dyaXRlKHByaXYsIEFUOTFfSURSLCBBVDkxX0lSUV9BTEwpOwogCWF0OTFfd3JpdGUocHJpdiwgQVQ5MV9JRVIsIHJlZ19pZXIpOwogfQpAQCAtMzc1LDggKzQ2NSw4IEBACiAgKiBtYWlsYm94LCBidXQgd2l0aG91dCB0aGUgb2Zmc2V0IEFUOTFfTUJfVFhfRklSU1QuIFRoZSBsb3dlciBiaXRzCiAgKiBlbmNvZGUgdGhlIG1haWxib3ggbnVtYmVyLCB0aGUgdXBwZXIgNCBiaXRzIHRoZSBtYWlsYm94IHByaW9yaXR5OgogICoKLSAqIHByaXYtPnR4X25leHQgPSAocHJpbyA8PCBBVDkxX05FWFRfUFJJT19TSElGVCkgfHwKLSAqICAgICAgICAgICAgICAgICAobWIgLSBBVDkxX01CX1RYX0ZJUlNUKTsKKyAqIHByaXYtPnR4X25leHQgPSAocHJpbyA8PCBnZXRfbmV4dF9wcmlvX3NoaWZ0KHByaXYpKSB8CisgKiAgICAgICAgICAgICAgICAgKG1iIC0gZ2V0X21iX3R4X2ZpcnN0KHByaXYpKTsKICAqCiAgKi8KIHN0YXRpYyBuZXRkZXZfdHhfdCBhdDkxX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTQxNyw3ICs1MDcsNyBAQAogCXN0YXRzLT50eF9ieXRlcyArPSBjZi0+Y2FuX2RsYzsKIAogCS8qIF9OT1RFXzogc3VidHJhY3QgQVQ5MV9NQl9UWF9GSVJTVCBvZmZzZXQgZnJvbSBtYiEgKi8KLQljYW5fcHV0X2VjaG9fc2tiKHNrYiwgZGV2LCBtYiAtIEFUOTFfTUJfVFhfRklSU1QpOworCWNhbl9wdXRfZWNob19za2Ioc2tiLCBkZXYsIG1iIC0gZ2V0X21iX3R4X2ZpcnN0KHByaXYpKTsKIAogCS8qCiAJICogd2UgaGF2ZSB0byBzdG9wIHRoZSBxdWV1ZSBhbmQgZGVsaXZlciBhbGwgbWVzc2FnZXMgaW4gY2FzZQpAQCAtNDMwLDcgKzUyMCw3IEBACiAJcHJpdi0+dHhfbmV4dCsrOwogCWlmICghKGF0OTFfcmVhZChwcml2LCBBVDkxX01TUihnZXRfdHhfbmV4dF9tYihwcml2KSkpICYKIAkgICAgICBBVDkxX01TUl9NUkRZKSB8fAotCSAgICAocHJpdi0+dHhfbmV4dCAmIEFUOTFfTkVYVF9NQVNLKSA9PSAwKQorCSAgICAocHJpdi0+dHhfbmV4dCAmIGdldF9uZXh0X21hc2socHJpdikpID09IDApCiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIHRoaXMgbWFpbGJveCAqLwpAQCAtNDQ3LDcgKzUzNyw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBhdDkxX2FjdGl2YXRlX3J4X2xvdyhjb25zdCBzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2KQogewotCXUzMiBtYXNrID0gQVQ5MV9NQl9SWF9MT1dfTUFTSzsKKwl1MzIgbWFzayA9IGdldF9tYl9yeF9sb3dfbWFzayhwcml2KTsKIAlhdDkxX3dyaXRlKHByaXYsIEFUOTFfVENSLCBtYXNrKTsKIH0KIApAQCAtNTEzLDE3ICs2MDMsMTkgQEAKIAkJY2YtPmNhbl9pZCA9IChyZWdfbWlkID4+IDE4KSAmIENBTl9TRkZfTUFTSzsKIAogCXJlZ19tc3IgPSBhdDkxX3JlYWQocHJpdiwgQVQ5MV9NU1IobWIpKTsKLQlpZiAocmVnX21zciAmIEFUOTFfTVNSX01SVFIpCi0JCWNmLT5jYW5faWQgfD0gQ0FOX1JUUl9GTEFHOwogCWNmLT5jYW5fZGxjID0gZ2V0X2Nhbl9kbGMoKHJlZ19tc3IgPj4gMTYpICYgMHhmKTsKIAotCSoodTMyICopKGNmLT5kYXRhICsgMCkgPSBhdDkxX3JlYWQocHJpdiwgQVQ5MV9NREwobWIpKTsKLQkqKHUzMiAqKShjZi0+ZGF0YSArIDQpID0gYXQ5MV9yZWFkKHByaXYsIEFUOTFfTURIKG1iKSk7CisJaWYgKHJlZ19tc3IgJiBBVDkxX01TUl9NUlRSKQorCQljZi0+Y2FuX2lkIHw9IENBTl9SVFJfRkxBRzsKKwllbHNlIHsKKwkJKih1MzIgKikoY2YtPmRhdGEgKyAwKSA9IGF0OTFfcmVhZChwcml2LCBBVDkxX01ETChtYikpOworCQkqKHUzMiAqKShjZi0+ZGF0YSArIDQpID0gYXQ5MV9yZWFkKHByaXYsIEFUOTFfTURIKG1iKSk7CisJfQogCiAJLyogYWxsb3cgUlggb2YgZXh0ZW5kZWQgZnJhbWVzICovCiAJYXQ5MV93cml0ZShwcml2LCBBVDkxX01JRChtYiksIEFUOTFfTUlEX01JREUpOwogCi0JaWYgKHVubGlrZWx5KG1iID09IEFUOTFfTUJfUlhfTEFTVCAmJiByZWdfbXNyICYgQVQ5MV9NU1JfTU1JKSkKKwlpZiAodW5saWtlbHkobWIgPT0gZ2V0X21iX3J4X2xhc3QocHJpdikgJiYgcmVnX21zciAmIEFUOTFfTVNSX01NSSkpCiAJCWF0OTFfcnhfb3ZlcmZsb3dfZXJyKGRldik7CiB9CiAKQEAgLTU2MSw4ICs2NTMsOSBAQAogICoKICAqIFRoZW9yeSBvZiBPcGVyYXRpb246CiAgKgotICogMTEgb2YgdGhlIDE2IG1haWxib3hlcyBvbiB0aGUgY2hpcCBhcmUgcmVzZXJ2ZWQgZm9yIFJYLiB3ZSBzcGxpdAotICogdGhlbSBpbnRvIDIgZ3JvdXBzLiBUaGUgbG93ZXIgZ3JvdXAgaG9sZHMgNyBhbmQgdXBwZXIgNCBtYWlsYm94ZXMuCisgKiBBYm91dCAzLzQgb2YgdGhlIG1haWxib3hlcyAoZ2V0X21iX3J4X2ZpcnN0KCkuLi5nZXRfbWJfcnhfbGFzdCgpKQorICogb24gdGhlIGNoaXAgYXJlIHJlc2VydmVkIGZvciBSWC4gV2Ugc3BsaXQgdGhlbSBpbnRvIDIgZ3JvdXBzLiBUaGUKKyAqIGxvd2VyIGdyb3VwIHJhbmdlcyBmcm9tIGdldF9tYl9yeF9maXJzdCgpIHRvIGdldF9tYl9yeF9sb3dfbGFzdCgpLgogICoKICAqIExpa2UgaXQgb3Igbm90LCBidXQgdGhlIGNoaXAgYWx3YXlzIHNhdmVzIGEgcmVjZWl2ZWQgQ0FOIG1lc3NhZ2UKICAqIGludG8gdGhlIGZpcnN0IGZyZWUgbWFpbGJveCBpdCBmaW5kcyAoc3RhcnRpbmcgd2l0aCB0aGUKQEAgLTYxMCwyMyArNzAzLDIzIEBACiAJdW5zaWduZWQgaW50IG1iOwogCWludCByZWNlaXZlZCA9IDA7CiAKLQlpZiAocHJpdi0+cnhfbmV4dCA+IEFUOTFfTUJfUlhfTE9XX0xBU1QgJiYKLQkgICAgcmVnX3NyICYgQVQ5MV9NQl9SWF9MT1dfTUFTSykKKwlpZiAocHJpdi0+cnhfbmV4dCA+IGdldF9tYl9yeF9sb3dfbGFzdChwcml2KSAmJgorCSAgICByZWdfc3IgJiBnZXRfbWJfcnhfbG93X21hc2socHJpdikpCiAJCW5ldGRldl9pbmZvKGRldiwKIAkJCSJvcmRlciBvZiBpbmNvbWluZyBmcmFtZXMgY2Fubm90IGJlIGd1YXJhbnRlZWRcbiIpOwogCiAgYWdhaW46Ci0JZm9yIChtYiA9IGZpbmRfbmV4dF9iaXQoYWRkciwgQVQ5MV9NQl9SWF9MQVNUICsgMSwgcHJpdi0+cnhfbmV4dCk7Ci0JICAgICBtYiA8IEFUOTFfTUJfUlhfTEFTVCArIDEgJiYgcXVvdGEgPiAwOworCWZvciAobWIgPSBmaW5kX25leHRfYml0KGFkZHIsIGdldF9tYl90eF9maXJzdChwcml2KSwgcHJpdi0+cnhfbmV4dCk7CisJICAgICBtYiA8IGdldF9tYl90eF9maXJzdChwcml2KSAmJiBxdW90YSA+IDA7CiAJICAgICByZWdfc3IgPSBhdDkxX3JlYWQocHJpdiwgQVQ5MV9TUiksCi0JICAgICBtYiA9IGZpbmRfbmV4dF9iaXQoYWRkciwgQVQ5MV9NQl9SWF9MQVNUICsgMSwgKytwcml2LT5yeF9uZXh0KSkgeworCSAgICAgbWIgPSBmaW5kX25leHRfYml0KGFkZHIsIGdldF9tYl90eF9maXJzdChwcml2KSwgKytwcml2LT5yeF9uZXh0KSkgewogCQlhdDkxX3JlYWRfbXNnKGRldiwgbWIpOwogCiAJCS8qIHJlYWN0aXZhdGUgbWFpbGJveGVzICovCi0JCWlmIChtYiA9PSBBVDkxX01CX1JYX0xPV19MQVNUKQorCQlpZiAobWIgPT0gZ2V0X21iX3J4X2xvd19sYXN0KHByaXYpKQogCQkJLyogYWxsIGxvd2VyIG1haWxib3hlZCwgaWYganVzdCBmaW5pc2hlZCBpdCAqLwogCQkJYXQ5MV9hY3RpdmF0ZV9yeF9sb3cocHJpdik7Ci0JCWVsc2UgaWYgKG1iID4gQVQ5MV9NQl9SWF9MT1dfTEFTVCkKKwkJZWxzZSBpZiAobWIgPiBnZXRfbWJfcnhfbG93X2xhc3QocHJpdikpCiAJCQkvKiBvbmx5IHRoZSBtYWlsYm94IHdlIHJlYWQgKi8KIAkJCWF0OTFfYWN0aXZhdGVfcnhfbWIocHJpdiwgbWIpOwogCkBAIC02MzUsOSArNzI4LDkgQEAKIAl9CiAKIAkvKiB1cHBlciBncm91cCBjb21wbGV0ZWQsIGxvb2sgYWdhaW4gaW4gbG93ZXIgKi8KLQlpZiAocHJpdi0+cnhfbmV4dCA+IEFUOTFfTUJfUlhfTE9XX0xBU1QgJiYKLQkgICAgcXVvdGEgPiAwICYmIG1iID4gQVQ5MV9NQl9SWF9MQVNUKSB7Ci0JCXByaXYtPnJ4X25leHQgPSBBVDkxX01CX1JYX0ZJUlNUOworCWlmIChwcml2LT5yeF9uZXh0ID4gZ2V0X21iX3J4X2xvd19sYXN0KHByaXYpICYmCisJICAgIHF1b3RhID4gMCAmJiBtYiA+IGdldF9tYl9yeF9sYXN0KHByaXYpKSB7CisJCXByaXYtPnJ4X25leHQgPSBnZXRfbWJfcnhfZmlyc3QocHJpdik7CiAJCWdvdG8gYWdhaW47CiAJfQogCkBAIC03MjAsNyArODEzLDcgQEAKIAl1MzIgcmVnX3NyID0gYXQ5MV9yZWFkKHByaXYsIEFUOTFfU1IpOwogCWludCB3b3JrX2RvbmUgPSAwOwogCi0JaWYgKHJlZ19zciAmIEFUOTFfSVJRX01CX1JYKQorCWlmIChyZWdfc3IgJiBnZXRfaXJxX21iX3J4KHByaXYpKQogCQl3b3JrX2RvbmUgKz0gYXQ5MV9wb2xsX3J4KGRldiwgcXVvdGEgLSB3b3JrX2RvbmUpOwogCiAJLyoKQEAgLTczNCw3ICs4MjcsNyBAQAogCWlmICh3b3JrX2RvbmUgPCBxdW90YSkgewogCQkvKiBlbmFibGUgSVJRcyBmb3IgZnJhbWUgZXJyb3JzIGFuZCBhbGwgbWFpbGJveGVzID49IHJ4X25leHQgKi8KIAkJdTMyIHJlZ19pZXIgPSBBVDkxX0lSUV9FUlJfRlJBTUU7Ci0JCXJlZ19pZXIgfD0gQVQ5MV9JUlFfTUJfUlggJiB+QVQ5MV9NQl9SWF9NQVNLKHByaXYtPnJ4X25leHQpOworCQlyZWdfaWVyIHw9IGdldF9pcnFfbWJfcngocHJpdikgJiB+QVQ5MV9NQl9NQVNLKHByaXYtPnJ4X25leHQpOwogCiAJCW5hcGlfY29tcGxldGUobmFwaSk7CiAJCWF0OTFfd3JpdGUocHJpdiwgQVQ5MV9JRVIsIHJlZ19pZXIpOwpAQCAtNzgzLDcgKzg3Niw3IEBACiAJCWlmIChsaWtlbHkocmVnX21zciAmIEFUOTFfTVNSX01SRFkgJiYKIAkJCSAgIH5yZWdfbXNyICYgQVQ5MV9NU1JfTUFCVCkpIHsKIAkJCS8qIF9OT1RFXzogc3VidHJhY3QgQVQ5MV9NQl9UWF9GSVJTVCBvZmZzZXQgZnJvbSBtYiEgKi8KLQkJCWNhbl9nZXRfZWNob19za2IoZGV2LCBtYiAtIEFUOTFfTUJfVFhfRklSU1QpOworCQkJY2FuX2dldF9lY2hvX3NrYihkZXYsIG1iIC0gZ2V0X21iX3R4X2ZpcnN0KHByaXYpKTsKIAkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQl9CiAJfQpAQCAtNzkzLDggKzg4Niw4IEBACiAJICogd2UgZ2V0IGEgVFggaW50IGZvciB0aGUgbGFzdCBjYW4gZnJhbWUgZGlyZWN0bHkgYmVmb3JlIGEKIAkgKiB3cmFwIGFyb3VuZC4KIAkgKi8KLQlpZiAoKHByaXYtPnR4X25leHQgJiBBVDkxX05FWFRfTUFTSykgIT0gMCB8fAotCSAgICAocHJpdi0+dHhfZWNobyAmIEFUOTFfTkVYVF9NQVNLKSA9PSAwKQorCWlmICgocHJpdi0+dHhfbmV4dCAmIGdldF9uZXh0X21hc2socHJpdikpICE9IDAgfHwKKwkgICAgKHByaXYtPnR4X2VjaG8gJiBnZXRfbmV4dF9tYXNrKHByaXYpKSA9PSAwKQogCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CiAKQEAgLTkwNiw2ICs5OTksMjkgQEAKIAlhdDkxX3dyaXRlKHByaXYsIEFUOTFfSUVSLCByZWdfaWVyKTsKIH0KIAorc3RhdGljIGludCBhdDkxX2dldF9zdGF0ZV9ieV9iZWMoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJZW51bSBjYW5fc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBjYW5fYmVycl9jb3VudGVyIGJlYzsKKwlpbnQgZXJyOworCisJZXJyID0gYXQ5MV9nZXRfYmVycl9jb3VudGVyKGRldiwgJmJlYyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChiZWMudHhlcnIgPCA5NiAmJiBiZWMucnhlcnIgPCA5NikKKwkJKnN0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX0FDVElWRTsKKwllbHNlIGlmIChiZWMudHhlcnIgPCAxMjggJiYgYmVjLnJ4ZXJyIDwgMTI4KQorCQkqc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfV0FSTklORzsKKwllbHNlIGlmIChiZWMudHhlcnIgPCAyNTYgJiYgYmVjLnJ4ZXJyIDwgMjU2KQorCQkqc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfUEFTU0lWRTsKKwllbHNlCisJCSpzdGF0ZSA9IENBTl9TVEFURV9CVVNfT0ZGOworCisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIHZvaWQgYXQ5MV9pcnFfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGF0OTFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CkBAIC05MTMsMjEgKzEwMjksMjggQEAKIAlzdHJ1Y3QgY2FuX2ZyYW1lICpjZjsKIAllbnVtIGNhbl9zdGF0ZSBuZXdfc3RhdGU7CiAJdTMyIHJlZ19zcjsKKwlpbnQgZXJyOwogCi0JcmVnX3NyID0gYXQ5MV9yZWFkKHByaXYsIEFUOTFfU1IpOworCWlmIChhdDkxX2lzX3NhbTkyNjMocHJpdikpIHsKKwkJcmVnX3NyID0gYXQ5MV9yZWFkKHByaXYsIEFUOTFfU1IpOwogCi0JLyogd2UgbmVlZCB0byBsb29rIGF0IHRoZSB1bm1hc2tlZCByZWdfc3IgKi8KLQlpZiAodW5saWtlbHkocmVnX3NyICYgQVQ5MV9JUlFfQk9GRikpCi0JCW5ld19zdGF0ZSA9IENBTl9TVEFURV9CVVNfT0ZGOwotCWVsc2UgaWYgKHVubGlrZWx5KHJlZ19zciAmIEFUOTFfSVJRX0VSUlApKQotCQluZXdfc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfUEFTU0lWRTsKLQllbHNlIGlmICh1bmxpa2VseShyZWdfc3IgJiBBVDkxX0lSUV9XQVJOKSkKLQkJbmV3X3N0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX1dBUk5JTkc7Ci0JZWxzZSBpZiAobGlrZWx5KHJlZ19zciAmIEFUOTFfSVJRX0VSUkEpKQotCQluZXdfc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOwotCWVsc2UgewotCQluZXRkZXZfZXJyKGRldiwgIkJVRyEgaGFyZHdhcmUgaW4gdW5kZWZpbmVkIHN0YXRlXG4iKTsKLQkJcmV0dXJuOworCQkvKiB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHVubWFza2VkIHJlZ19zciAqLworCQlpZiAodW5saWtlbHkocmVnX3NyICYgQVQ5MV9JUlFfQk9GRikpCisJCQluZXdfc3RhdGUgPSBDQU5fU1RBVEVfQlVTX09GRjsKKwkJZWxzZSBpZiAodW5saWtlbHkocmVnX3NyICYgQVQ5MV9JUlFfRVJSUCkpCisJCQluZXdfc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfUEFTU0lWRTsKKwkJZWxzZSBpZiAodW5saWtlbHkocmVnX3NyICYgQVQ5MV9JUlFfV0FSTikpCisJCQluZXdfc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfV0FSTklORzsKKwkJZWxzZSBpZiAobGlrZWx5KHJlZ19zciAmIEFUOTFfSVJRX0VSUkEpKQorCQkJbmV3X3N0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX0FDVElWRTsKKwkJZWxzZSB7CisJCQluZXRkZXZfZXJyKGRldiwgIkJVRyEgaGFyZHdhcmUgaW4gdW5kZWZpbmVkIHN0YXRlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWVyciA9IGF0OTFfZ2V0X3N0YXRlX2J5X2JlYyhkZXYsICZuZXdfc3RhdGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuOwogCX0KIAogCS8qIHN0YXRlIGhhc24ndCBjaGFuZ2VkICovCkBAIC05NjgsMTkgKzEwOTEsMTkgQEAKIAloYW5kbGVkID0gSVJRX0hBTkRMRUQ7CiAKIAkvKiBSZWNlaXZlIG9yIGVycm9yIGludGVycnVwdD8gLT4gbmFwaSAqLwotCWlmIChyZWdfc3IgJiAoQVQ5MV9JUlFfTUJfUlggfCBBVDkxX0lSUV9FUlJfRlJBTUUpKSB7CisJaWYgKHJlZ19zciAmIChnZXRfaXJxX21iX3J4KHByaXYpIHwgQVQ5MV9JUlFfRVJSX0ZSQU1FKSkgewogCQkvKgogCQkgKiBUaGUgZXJyb3IgYml0cyBhcmUgY2xlYXIgb24gcmVhZCwKIAkJICogc2F2ZSBmb3IgbGF0ZXIgdXNlLgogCQkgKi8KIAkJcHJpdi0+cmVnX3NyID0gcmVnX3NyOwogCQlhdDkxX3dyaXRlKHByaXYsIEFUOTFfSURSLAotCQkJICAgQVQ5MV9JUlFfTUJfUlggfCBBVDkxX0lSUV9FUlJfRlJBTUUpOworCQkJICAgZ2V0X2lycV9tYl9yeChwcml2KSB8IEFUOTFfSVJRX0VSUl9GUkFNRSk7CiAJCW5hcGlfc2NoZWR1bGUoJnByaXYtPm5hcGkpOwogCX0KIAogCS8qIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KLQlpZiAocmVnX3NyICYgQVQ5MV9JUlFfTUJfVFgpCisJaWYgKHJlZ19zciAmIGdldF9pcnFfbWJfdHgocHJpdikpCiAJCWF0OTFfaXJxX3R4KGRldiwgcmVnX3NyKTsKIAogCWF0OTFfaXJxX2VycihkZXYpOwpAQCAtMTEyMyw2ICsxMjQ2LDggQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgYXQ5MV9jYW5fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwljb25zdCBzdHJ1Y3QgYXQ5MV9kZXZ0eXBlX2RhdGEgKmRldnR5cGVfZGF0YTsKKwllbnVtIGF0OTFfZGV2dHlwZSBkZXZ0eXBlOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IGF0OTFfcHJpdiAqcHJpdjsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTExMzAsNiArMTI1NSw5IEBACiAJdm9pZCBfX2lvbWVtICphZGRyOwogCWludCBlcnIsIGlycTsKIAorCWRldnR5cGUgPSBwZGV2LT5pZF9lbnRyeS0+ZHJpdmVyX2RhdGE7CisJZGV2dHlwZV9kYXRhID0gJmF0OTFfZGV2dHlwZV9kYXRhW2RldnR5cGVdOworCiAJY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiY2FuX2NsayIpOwogCWlmIChJU19FUlIoY2xrKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBjbG9jayBkZWZpbmVkXG4iKTsKQEAgLTExNTcsNyArMTI4NSw4IEBACiAJCWdvdG8gZXhpdF9yZWxlYXNlOwogCX0KIAotCWRldiA9IGFsbG9jX2NhbmRldihzaXplb2Yoc3RydWN0IGF0OTFfcHJpdiksIEFUOTFfTUJfVFhfTlVNKTsKKwlkZXYgPSBhbGxvY19jYW5kZXYoc2l6ZW9mKHN0cnVjdCBhdDkxX3ByaXYpLAorCQkJICAgMSA8PCBkZXZ0eXBlX2RhdGEtPnR4X3NoaWZ0KTsKIAlpZiAoIWRldikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGV4aXRfaW91bm1hcDsKQEAgLTExNjYsNyArMTI5NSw2IEBACiAJZGV2LT5uZXRkZXZfb3BzCT0gJmF0OTFfbmV0ZGV2X29wczsKIAlkZXYtPmlycSA9IGlycTsKIAlkZXYtPmZsYWdzIHw9IElGRl9FQ0hPOwotCWRldi0+c3lzZnNfZ3JvdXBzWzBdID0gJmF0OTFfc3lzZnNfYXR0cl9ncm91cDsKIAogCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXByaXYtPmNhbi5jbG9jay5mcmVxID0gY2xrX2dldF9yYXRlKGNsayk7CkBAIC0xMTc0LDEzICsxMzAyLDE4IEBACiAJcHJpdi0+Y2FuLmRvX3NldF9tb2RlID0gYXQ5MV9zZXRfbW9kZTsKIAlwcml2LT5jYW4uZG9fZ2V0X2JlcnJfY291bnRlciA9IGF0OTFfZ2V0X2JlcnJfY291bnRlcjsKIAlwcml2LT5jYW4uY3RybG1vZGVfc3VwcG9ydGVkID0gQ0FOX0NUUkxNT0RFXzNfU0FNUExFUzsKLQlwcml2LT5yZWdfYmFzZSA9IGFkZHI7CiAJcHJpdi0+ZGV2ID0gZGV2OworCXByaXYtPnJlZ19iYXNlID0gYWRkcjsKKwlwcml2LT5kZXZ0eXBlX2RhdGEgPSAqZGV2dHlwZV9kYXRhOworCXByaXYtPmRldnR5cGVfZGF0YS50eXBlID0gZGV2dHlwZTsKIAlwcml2LT5jbGsgPSBjbGs7CiAJcHJpdi0+cGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlwcml2LT5tYjBfaWQgPSAweDdmZjsKIAotCW5ldGlmX25hcGlfYWRkKGRldiwgJnByaXYtPm5hcGksIGF0OTFfcG9sbCwgQVQ5MV9OQVBJX1dFSUdIVCk7CisJbmV0aWZfbmFwaV9hZGQoZGV2LCAmcHJpdi0+bmFwaSwgYXQ5MV9wb2xsLCBnZXRfbWJfcnhfbnVtKHByaXYpKTsKKworCWlmIChhdDkxX2lzX3NhbTkyNjMocHJpdikpCisJCWRldi0+c3lzZnNfZ3JvdXBzWzBdID0gJmF0OTFfc3lzZnNfYXR0cl9ncm91cDsKIAogCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBkZXYpOwogCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CkBAIC0xMjMwLDEzICsxMzYzLDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGF0OTFfY2FuX2lkX3RhYmxlW10gPSB7CisJeworCQkubmFtZSA9ICJhdDkxX2NhbiIsCisJCS5kcml2ZXJfZGF0YSA9IEFUOTFfREVWVFlQRV9TQU05MjYzLAorCX0sIHsKKwkJLm5hbWUgPSAiYXQ5MXNhbTl4NV9jYW4iLAorCQkuZHJpdmVyX2RhdGEgPSBBVDkxX0RFVlRZUEVfU0FNOVg1LAorCX0sIHsKKwkJLyogc2VudGluZWwgKi8KKwl9Cit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdDkxX2Nhbl9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGF0OTFfY2FuX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXQ5MV9jYW5fcmVtb3ZlKSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSBLQlVJTERfTU9ETkFNRSwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLnByb2JlID0gYXQ5MV9jYW5fcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGF0OTFfY2FuX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKKwkuaWRfdGFibGUgPSBhdDkxX2Nhbl9pZF90YWJsZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGF0OTFfY2FuX21vZHVsZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vYmZpbl9jYW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi9iZmluX2Nhbi5jCmluZGV4IGI2ZTg5MGQuLmExYzVhYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9iZmluX2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9iZmluX2Nhbi5jCkBAIC03OSw4ICs3OSw4IEBACiAJaWYgKHByaXYtPmNhbi5jdHJsbW9kZSAmIENBTl9DVFJMTU9ERV8zX1NBTVBMRVMpCiAJCXRpbWluZyB8PSBTQU07CiAKLQliZmluX3dyaXRlMTYoJnJlZy0+Y2xvY2ssIGNsayk7Ci0JYmZpbl93cml0ZTE2KCZyZWctPnRpbWluZywgdGltaW5nKTsKKwliZmluX3dyaXRlKCZyZWctPmNsb2NrLCBjbGspOworCWJmaW5fd3JpdGUoJnJlZy0+dGltaW5nLCB0aW1pbmcpOwogCiAJZGV2X2luZm8oZGV2LT5kZXYucGFyZW50LCAic2V0dGluZyBDTE9DSz0weCUwNHggVElNSU5HPTB4JTA0eFxuIiwKIAkJCWNsaywgdGltaW5nKTsKQEAgLTk2LDE2ICs5NiwxNiBAQAogCWludCBpOwogCiAJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JYmZpbl93cml0ZTE2KCZyZWctPm1iaW0xLCAwKTsKLQliZmluX3dyaXRlMTYoJnJlZy0+bWJpbTIsIDApOwotCWJmaW5fd3JpdGUxNigmcmVnLT5naW0sIDApOworCWJmaW5fd3JpdGUoJnJlZy0+bWJpbTEsIDApOworCWJmaW5fd3JpdGUoJnJlZy0+bWJpbTIsIDApOworCWJmaW5fd3JpdGUoJnJlZy0+Z2ltLCAwKTsKIAogCS8qIHJlc2V0IGNhbiBhbmQgZW50ZXIgY29uZmlndXJhdGlvbiBtb2RlICovCi0JYmZpbl93cml0ZTE2KCZyZWctPmNvbnRyb2wsIFNSUyB8IENDUik7CisJYmZpbl93cml0ZSgmcmVnLT5jb250cm9sLCBTUlMgfCBDQ1IpOwogCVNTWU5DKCk7Ci0JYmZpbl93cml0ZTE2KCZyZWctPmNvbnRyb2wsIENDUik7CisJYmZpbl93cml0ZSgmcmVnLT5jb250cm9sLCBDQ1IpOwogCVNTWU5DKCk7Ci0Jd2hpbGUgKCEoYmZpbl9yZWFkMTYoJnJlZy0+Y29udHJvbCkgJiBDQ0EpKSB7CisJd2hpbGUgKCEoYmZpbl9yZWFkKCZyZWctPmNvbnRyb2wpICYgQ0NBKSkgewogCQl1ZGVsYXkoMTApOwogCQlpZiAoLS10aW1lb3V0ID09IDApIHsKIAkJCWRldl9lcnIoZGV2LT5kZXYucGFyZW50LApAQCAtMTE5LDMzICsxMTksMzMgQEAKIAkgKiBieSB3cml0aW5nIHRvIENBTiBNYWlsYm94IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzIDEgYW5kIDIKIAkgKiBGb3IgYWxsIGJpdHM6IDAgLSBNYWlsYm94IGRpc2FibGVkLCAxIC0gTWFpbGJveCBlbmFibGVkCiAJICovCi0JYmZpbl93cml0ZTE2KCZyZWctPm1jMSwgMCk7Ci0JYmZpbl93cml0ZTE2KCZyZWctPm1jMiwgMCk7CisJYmZpbl93cml0ZSgmcmVnLT5tYzEsIDApOworCWJmaW5fd3JpdGUoJnJlZy0+bWMyLCAwKTsKIAogCS8qIFNldCBNYWlsYm94IERpcmVjdGlvbiAqLwotCWJmaW5fd3JpdGUxNigmcmVnLT5tZDEsIDB4RkZGRik7ICAgLyogbWFpbGJveCAxLTE2IGFyZSBSWCAqLwotCWJmaW5fd3JpdGUxNigmcmVnLT5tZDIsIDApOyAgIC8qIG1haWxib3ggMTctMzIgYXJlIFRYICovCisJYmZpbl93cml0ZSgmcmVnLT5tZDEsIDB4RkZGRik7ICAgLyogbWFpbGJveCAxLTE2IGFyZSBSWCAqLworCWJmaW5fd3JpdGUoJnJlZy0+bWQyLCAwKTsgICAvKiBtYWlsYm94IDE3LTMyIGFyZSBUWCAqLwogCiAJLyogUkVDRUlWRV9TVERfQ0hMICovCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQliZmluX3dyaXRlMTYoJnJlZy0+Y2hsW1JFQ0VJVkVfU1REX0NITCArIGldLmlkMCwgMCk7Ci0JCWJmaW5fd3JpdGUxNigmcmVnLT5jaGxbUkVDRUlWRV9TVERfQ0hMICsgaV0uaWQxLCBBTUUpOwotCQliZmluX3dyaXRlMTYoJnJlZy0+Y2hsW1JFQ0VJVkVfU1REX0NITCArIGldLmRsYywgMCk7Ci0JCWJmaW5fd3JpdGUxNigmcmVnLT5tc2tbUkVDRUlWRV9TVERfQ0hMICsgaV0uYW1oLCAweDFGRkYpOwotCQliZmluX3dyaXRlMTYoJnJlZy0+bXNrW1JFQ0VJVkVfU1REX0NITCArIGldLmFtbCwgMHhGRkZGKTsKKwkJYmZpbl93cml0ZSgmcmVnLT5jaGxbUkVDRUlWRV9TVERfQ0hMICsgaV0uaWQwLCAwKTsKKwkJYmZpbl93cml0ZSgmcmVnLT5jaGxbUkVDRUlWRV9TVERfQ0hMICsgaV0uaWQxLCBBTUUpOworCQliZmluX3dyaXRlKCZyZWctPmNobFtSRUNFSVZFX1NURF9DSEwgKyBpXS5kbGMsIDApOworCQliZmluX3dyaXRlKCZyZWctPm1za1tSRUNFSVZFX1NURF9DSEwgKyBpXS5hbWgsIDB4MUZGRik7CisJCWJmaW5fd3JpdGUoJnJlZy0+bXNrW1JFQ0VJVkVfU1REX0NITCArIGldLmFtbCwgMHhGRkZGKTsKIAl9CiAKIAkvKiBSRUNFSVZFX0VYVF9DSEwgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCWJmaW5fd3JpdGUxNigmcmVnLT5jaGxbUkVDRUlWRV9FWFRfQ0hMICsgaV0uaWQwLCAwKTsKLQkJYmZpbl93cml0ZTE2KCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSEwgKyBpXS5pZDEsIEFNRSB8IElERSk7Ci0JCWJmaW5fd3JpdGUxNigmcmVnLT5jaGxbUkVDRUlWRV9FWFRfQ0hMICsgaV0uZGxjLCAwKTsKLQkJYmZpbl93cml0ZTE2KCZyZWctPm1za1tSRUNFSVZFX0VYVF9DSEwgKyBpXS5hbWgsIDB4MUZGRik7Ci0JCWJmaW5fd3JpdGUxNigmcmVnLT5tc2tbUkVDRUlWRV9FWFRfQ0hMICsgaV0uYW1sLCAweEZGRkYpOworCQliZmluX3dyaXRlKCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSEwgKyBpXS5pZDAsIDApOworCQliZmluX3dyaXRlKCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSEwgKyBpXS5pZDEsIEFNRSB8IElERSk7CisJCWJmaW5fd3JpdGUoJnJlZy0+Y2hsW1JFQ0VJVkVfRVhUX0NITCArIGldLmRsYywgMCk7CisJCWJmaW5fd3JpdGUoJnJlZy0+bXNrW1JFQ0VJVkVfRVhUX0NITCArIGldLmFtaCwgMHgxRkZGKTsKKwkJYmZpbl93cml0ZSgmcmVnLT5tc2tbUkVDRUlWRV9FWFRfQ0hMICsgaV0uYW1sLCAweEZGRkYpOwogCX0KIAotCWJmaW5fd3JpdGUxNigmcmVnLT5tYzIsIEJJVChUUkFOU01JVF9DSEwgLSAxNikpOwotCWJmaW5fd3JpdGUxNigmcmVnLT5tYzEsIEJJVChSRUNFSVZFX1NURF9DSEwpICsgQklUKFJFQ0VJVkVfRVhUX0NITCkpOworCWJmaW5fd3JpdGUoJnJlZy0+bWMyLCBCSVQoVFJBTlNNSVRfQ0hMIC0gMTYpKTsKKwliZmluX3dyaXRlKCZyZWctPm1jMSwgQklUKFJFQ0VJVkVfU1REX0NITCkgKyBCSVQoUkVDRUlWRV9FWFRfQ0hMKSk7CiAJU1NZTkMoKTsKIAogCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9TVE9QUEVEOwpAQCAtMTYwLDkgKzE2MCw5IEBACiAJLyoKIAkgKiBsZWF2ZSBjb25maWd1cmF0aW9uIG1vZGUKIAkgKi8KLQliZmluX3dyaXRlMTYoJnJlZy0+Y29udHJvbCwgYmZpbl9yZWFkMTYoJnJlZy0+Y29udHJvbCkgJiB+Q0NSKTsKKwliZmluX3dyaXRlKCZyZWctPmNvbnRyb2wsIGJmaW5fcmVhZCgmcmVnLT5jb250cm9sKSAmIH5DQ1IpOwogCi0Jd2hpbGUgKGJmaW5fcmVhZDE2KCZyZWctPnN0YXR1cykgJiBDQ0EpIHsKKwl3aGlsZSAoYmZpbl9yZWFkKCZyZWctPnN0YXR1cykgJiBDQ0EpIHsKIAkJdWRlbGF5KDEwKTsKIAkJaWYgKC0tdGltZW91dCA9PSAwKSB7CiAJCQlkZXZfZXJyKGRldi0+ZGV2LnBhcmVudCwKQEAgLTE3NCwyNSArMTc0LDI1IEBACiAJLyoKIAkgKiBjbGVhciBfQWxsXyAgdHggYW5kIHJ4IGludGVycnVwdHMKIAkgKi8KLQliZmluX3dyaXRlMTYoJnJlZy0+bWJ0aWYxLCAweEZGRkYpOwotCWJmaW5fd3JpdGUxNigmcmVnLT5tYnRpZjIsIDB4RkZGRik7Ci0JYmZpbl93cml0ZTE2KCZyZWctPm1icmlmMSwgMHhGRkZGKTsKLQliZmluX3dyaXRlMTYoJnJlZy0+bWJyaWYyLCAweEZGRkYpOworCWJmaW5fd3JpdGUoJnJlZy0+bWJ0aWYxLCAweEZGRkYpOworCWJmaW5fd3JpdGUoJnJlZy0+bWJ0aWYyLCAweEZGRkYpOworCWJmaW5fd3JpdGUoJnJlZy0+bWJyaWYxLCAweEZGRkYpOworCWJmaW5fd3JpdGUoJnJlZy0+bWJyaWYyLCAweEZGRkYpOwogCiAJLyoKIAkgKiBjbGVhciBnbG9iYWwgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgogCSAqLwotCWJmaW5fd3JpdGUxNigmcmVnLT5naXMsIDB4N0ZGKTsgLyogb3ZlcndyaXRlcyB3aXRoICcxJyAqLworCWJmaW5fd3JpdGUoJnJlZy0+Z2lzLCAweDdGRik7IC8qIG92ZXJ3cml0ZXMgd2l0aCAnMScgKi8KIAogCS8qCiAJICogSW5pdGlhbGl6ZSBJbnRlcnJ1cHRzCiAJICogLSBzZXQgYml0cyBpbiB0aGUgbWFpbGJveCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgogCSAqIC0gZ2xvYmFsIGludGVycnVwdCBtYXNrCiAJICovCi0JYmZpbl93cml0ZTE2KCZyZWctPm1iaW0xLCBCSVQoUkVDRUlWRV9TVERfQ0hMKSArIEJJVChSRUNFSVZFX0VYVF9DSEwpKTsKLQliZmluX3dyaXRlMTYoJnJlZy0+bWJpbTIsIEJJVChUUkFOU01JVF9DSEwgLSAxNikpOworCWJmaW5fd3JpdGUoJnJlZy0+bWJpbTEsIEJJVChSRUNFSVZFX1NURF9DSEwpICsgQklUKFJFQ0VJVkVfRVhUX0NITCkpOworCWJmaW5fd3JpdGUoJnJlZy0+bWJpbTIsIEJJVChUUkFOU01JVF9DSEwgLSAxNikpOwogCi0JYmZpbl93cml0ZTE2KCZyZWctPmdpbSwgRVBJTSB8IEJPSU0gfCBSTUxJTSk7CisJYmZpbl93cml0ZSgmcmVnLT5naW0sIEVQSU0gfCBCT0lNIHwgUk1MSU0pOwogCVNTWU5DKCk7CiB9CiAKQEAgLTI0MiwzNyArMjQyLDI4IEBACiAKIAkvKiBmaWxsIGlkICovCiAJaWYgKGlkICYgQ0FOX0VGRl9GTEFHKSB7Ci0JCWJmaW5fd3JpdGUxNigmcmVnLT5jaGxbVFJBTlNNSVRfQ0hMXS5pZDAsIGlkKTsKLQkJaWYgKGlkICYgQ0FOX1JUUl9GTEFHKQotCQkJd3JpdGV3KCgoaWQgJiAweDFGRkYwMDAwKSA+PiAxNikgfCBJREUgfCBBTUUgfCBSVFIsCi0JCQkJCSZyZWctPmNobFtUUkFOU01JVF9DSExdLmlkMSk7Ci0JCWVsc2UKLQkJCXdyaXRldygoKGlkICYgMHgxRkZGMDAwMCkgPj4gMTYpIHwgSURFIHwgQU1FLAotCQkJCQkmcmVnLT5jaGxbVFJBTlNNSVRfQ0hMXS5pZDEpOwotCi0JfSBlbHNlIHsKLQkJaWYgKGlkICYgQ0FOX1JUUl9GTEFHKQotCQkJd3JpdGV3KChpZCA8PCAyKSB8IEFNRSB8IFJUUiwKLQkJCQkmcmVnLT5jaGxbVFJBTlNNSVRfQ0hMXS5pZDEpOwotCQllbHNlCi0JCQliZmluX3dyaXRlMTYoJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uaWQxLAotCQkJCQkoaWQgPDwgMikgfCBBTUUpOwotCX0KKwkJYmZpbl93cml0ZSgmcmVnLT5jaGxbVFJBTlNNSVRfQ0hMXS5pZDAsIGlkKTsKKwkJdmFsID0gKChpZCAmIDB4MUZGRjAwMDApID4+IDE2KSB8IElERTsKKwl9IGVsc2UKKwkJdmFsID0gKGlkIDw8IDIpOworCWlmIChpZCAmIENBTl9SVFJfRkxBRykKKwkJdmFsIHw9IFJUUjsKKwliZmluX3dyaXRlKCZyZWctPmNobFtUUkFOU01JVF9DSExdLmlkMSwgdmFsIHwgQU1FKTsKIAogCS8qIGZpbGwgcGF5bG9hZCAqLwogCWZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDIpIHsKIAkJdmFsID0gKCg3IC0gaSkgPCBkbGMgPyAoZGF0YVs3IC0gaV0pIDogMCkgKwogCQkJKCg2IC0gaSkgPCBkbGMgPyAoZGF0YVs2IC0gaV0gPDwgOCkgOiAwKTsKLQkJYmZpbl93cml0ZTE2KCZyZWctPmNobFtUUkFOU01JVF9DSExdLmRhdGFbaV0sIHZhbCk7CisJCWJmaW5fd3JpdGUoJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uZGF0YVtpXSwgdmFsKTsKIAl9CiAKIAkvKiBmaWxsIGRhdGEgbGVuZ3RoIGNvZGUgKi8KLQliZmluX3dyaXRlMTYoJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uZGxjLCBkbGMpOworCWJmaW5fd3JpdGUoJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uZGxjLCBkbGMpOwogCiAJY2FuX3B1dF9lY2hvX3NrYihza2IsIGRldiwgMCk7CiAKIAkvKiBzZXQgdHJhbnNtaXQgcmVxdWVzdCAqLwotCWJmaW5fd3JpdGUxNigmcmVnLT50cnMyLCBCSVQoVFJBTlNNSVRfQ0hMIC0gMTYpKTsKKwliZmluX3dyaXRlKCZyZWctPnRyczIsIEJJVChUUkFOU01JVF9DSEwgLSAxNikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTUsMjYgKzI4NiwyNiBAQAogCS8qIGdldCBpZCAqLwogCWlmIChpc3JjICYgQklUKFJFQ0VJVkVfRVhUX0NITCkpIHsKIAkJLyogZXh0ZW5kZWQgZnJhbWUgZm9ybWF0IChFRkYpICovCi0JCWNmLT5jYW5faWQgPSAoKGJmaW5fcmVhZDE2KCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSExdLmlkMSkKKwkJY2YtPmNhbl9pZCA9ICgoYmZpbl9yZWFkKCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSExdLmlkMSkKIAkJCSAgICAgJiAweDFGRkYpIDw8IDE2KQotCQkJICAgICArIGJmaW5fcmVhZDE2KCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSExdLmlkMCk7CisJCQkgICAgICsgYmZpbl9yZWFkKCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSExdLmlkMCk7CiAJCWNmLT5jYW5faWQgfD0gQ0FOX0VGRl9GTEFHOwogCQlvYmogPSBSRUNFSVZFX0VYVF9DSEw7CiAJfSBlbHNlIHsKIAkJLyogc3RhbmRhcmQgZnJhbWUgZm9ybWF0IChTRkYpICovCi0JCWNmLT5jYW5faWQgPSAoYmZpbl9yZWFkMTYoJnJlZy0+Y2hsW1JFQ0VJVkVfU1REX0NITF0uaWQxKQorCQljZi0+Y2FuX2lkID0gKGJmaW5fcmVhZCgmcmVnLT5jaGxbUkVDRUlWRV9TVERfQ0hMXS5pZDEpCiAJCQkgICAgICYgMHgxZmZjKSA+PiAyOwogCQlvYmogPSBSRUNFSVZFX1NURF9DSEw7CiAJfQotCWlmIChiZmluX3JlYWQxNigmcmVnLT5jaGxbb2JqXS5pZDEpICYgUlRSKQorCWlmIChiZmluX3JlYWQoJnJlZy0+Y2hsW29ial0uaWQxKSAmIFJUUikKIAkJY2YtPmNhbl9pZCB8PSBDQU5fUlRSX0ZMQUc7CiAKIAkvKiBnZXQgZGF0YSBsZW5ndGggY29kZSAqLwotCWNmLT5jYW5fZGxjID0gZ2V0X2Nhbl9kbGMoYmZpbl9yZWFkMTYoJnJlZy0+Y2hsW29ial0uZGxjKSAmIDB4Rik7CisJY2YtPmNhbl9kbGMgPSBnZXRfY2FuX2RsYyhiZmluX3JlYWQoJnJlZy0+Y2hsW29ial0uZGxjKSAmIDB4Rik7CiAKIAkvKiBnZXQgcGF5bG9hZCAqLwogCWZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDIpIHsKLQkJdmFsID0gYmZpbl9yZWFkMTYoJnJlZy0+Y2hsW29ial0uZGF0YVtpXSk7CisJCXZhbCA9IGJmaW5fcmVhZCgmcmVnLT5jaGxbb2JqXS5kYXRhW2ldKTsKIAkJY2YtPmRhdGFbNyAtIGldID0gKDcgLSBpKSA8IGNmLT5jYW5fZGxjID8gdmFsIDogMDsKIAkJY2YtPmRhdGFbNiAtIGldID0gKDYgLSBpKSA8IGNmLT5jYW5fZGxjID8gKHZhbCA+PiA4KSA6IDA7CiAJfQpAQCAtMzY4LDcgKzM1OSw3IEBACiAKIAlpZiAoc3RhdGUgIT0gcHJpdi0+Y2FuLnN0YXRlICYmIChzdGF0ZSA9PSBDQU5fU1RBVEVfRVJST1JfV0FSTklORyB8fAogCQkJCXN0YXRlID09IENBTl9TVEFURV9FUlJPUl9QQVNTSVZFKSkgewotCQl1MTYgY2VjID0gYmZpbl9yZWFkMTYoJnJlZy0+Y2VjKTsKKwkJdTE2IGNlYyA9IGJmaW5fcmVhZCgmcmVnLT5jZWMpOwogCQl1OCByeGVyciA9IGNlYzsKIAkJdTggdHhlcnIgPSBjZWMgPj4gODsKIApAQCAtNDE5LDIzICs0MTAsMjMgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKIAl1MTYgc3RhdHVzLCBpc3JjOwogCi0JaWYgKChpcnEgPT0gcHJpdi0+dHhfaXJxKSAmJiBiZmluX3JlYWQxNigmcmVnLT5tYnRpZjIpKSB7CisJaWYgKChpcnEgPT0gcHJpdi0+dHhfaXJxKSAmJiBiZmluX3JlYWQoJnJlZy0+bWJ0aWYyKSkgewogCQkvKiB0cmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0ICovCi0JCWJmaW5fd3JpdGUxNigmcmVnLT5tYnRpZjIsIDB4RkZGRik7CisJCWJmaW5fd3JpdGUoJnJlZy0+bWJ0aWYyLCAweEZGRkYpOwogCQlzdGF0cy0+dHhfcGFja2V0cysrOwotCQlzdGF0cy0+dHhfYnl0ZXMgKz0gYmZpbl9yZWFkMTYoJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uZGxjKTsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IGJmaW5fcmVhZCgmcmVnLT5jaGxbVFJBTlNNSVRfQ0hMXS5kbGMpOwogCQljYW5fZ2V0X2VjaG9fc2tiKGRldiwgMCk7CiAJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLQl9IGVsc2UgaWYgKChpcnEgPT0gcHJpdi0+cnhfaXJxKSAmJiBiZmluX3JlYWQxNigmcmVnLT5tYnJpZjEpKSB7CisJfSBlbHNlIGlmICgoaXJxID09IHByaXYtPnJ4X2lycSkgJiYgYmZpbl9yZWFkKCZyZWctPm1icmlmMSkpIHsKIAkJLyogcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KLQkJaXNyYyA9IGJmaW5fcmVhZDE2KCZyZWctPm1icmlmMSk7Ci0JCWJmaW5fd3JpdGUxNigmcmVnLT5tYnJpZjEsIDB4RkZGRik7CisJCWlzcmMgPSBiZmluX3JlYWQoJnJlZy0+bWJyaWYxKTsKKwkJYmZpbl93cml0ZSgmcmVnLT5tYnJpZjEsIDB4RkZGRik7CiAJCWJmaW5fY2FuX3J4KGRldiwgaXNyYyk7Ci0JfSBlbHNlIGlmICgoaXJxID09IHByaXYtPmVycl9pcnEpICYmIGJmaW5fcmVhZDE2KCZyZWctPmdpcykpIHsKKwl9IGVsc2UgaWYgKChpcnEgPT0gcHJpdi0+ZXJyX2lycSkgJiYgYmZpbl9yZWFkKCZyZWctPmdpcykpIHsKIAkJLyogZXJyb3IgaW50ZXJydXB0ICovCi0JCWlzcmMgPSBiZmluX3JlYWQxNigmcmVnLT5naXMpOwotCQlzdGF0dXMgPSBiZmluX3JlYWQxNigmcmVnLT5lc3IpOwotCQliZmluX3dyaXRlMTYoJnJlZy0+Z2lzLCAweDdGRik7CisJCWlzcmMgPSBiZmluX3JlYWQoJnJlZy0+Z2lzKTsKKwkJc3RhdHVzID0gYmZpbl9yZWFkKCZyZWctPmVzcik7CisJCWJmaW5fd3JpdGUoJnJlZy0+Z2lzLCAweDdGRik7CiAJCWJmaW5fY2FuX2VycihkZXYsIGlzcmMsIHN0YXR1cyk7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIElSUV9OT05FOwpAQCAtNjQwLDkgKzYzMSw5IEBACiAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCS8qIGVudGVyIHNsZWVwIG1vZGUgKi8KLQkJYmZpbl93cml0ZTE2KCZyZWctPmNvbnRyb2wsIGJmaW5fcmVhZDE2KCZyZWctPmNvbnRyb2wpIHwgU01SKTsKKwkJYmZpbl93cml0ZSgmcmVnLT5jb250cm9sLCBiZmluX3JlYWQoJnJlZy0+Y29udHJvbCkgfCBTTVIpOwogCQlTU1lOQygpOwotCQl3aGlsZSAoIShiZmluX3JlYWQxNigmcmVnLT5pbnRyKSAmIFNNQUNLKSkgeworCQl3aGlsZSAoIShiZmluX3JlYWQoJnJlZy0+aW50cikgJiBTTUFDSykpIHsKIAkJCXVkZWxheSgxMCk7CiAJCQlpZiAoLS10aW1lb3V0ID09IDApIHsKIAkJCQlkZXZfZXJyKGRldi0+ZGV2LnBhcmVudCwKQEAgLTY2Myw3ICs2NTQsNyBAQAogCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewogCQkvKiBsZWF2ZSBzbGVlcCBtb2RlICovCi0JCWJmaW5fd3JpdGUxNigmcmVnLT5pbnRyLCAwKTsKKwkJYmZpbl93cml0ZSgmcmVnLT5pbnRyLCAwKTsKIAkJU1NZTkMoKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9jX2Nhbi9jX2Nhbi5jIGIvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuLmMKaW5kZXggN2U1Y2MwYi4uNTM2YmRhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuLmMKQEAgLTI2LDcgKzI2LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0zNCw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bGludXgvY2FuLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vY19jYW4vY19jYW5fcGxhdGZvcm0uYyBiL2RyaXZlcnMvbmV0L2Nhbi9jX2Nhbi9jX2Nhbl9wbGF0Zm9ybS5jCmluZGV4IGNjOTA4MjQuLjBiNWM2ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9jX2Nhbi9jX2Nhbl9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9jX2Nhbi9jX2Nhbl9wbGF0Zm9ybS5jCkBAIC0yMCw3ICsyMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMjgsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9kZXYuYyBiL2RyaXZlcnMvbmV0L2Nhbi9kZXYuYwppbmRleCBkMGY4YzdlLi45YmYxMTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2Rldi5jCkBAIC0yMDgsNyArMjA4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGNhbl9nZXRfYml0dGltaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBjYW5fYml0dGltaW5nICpidCkKK3N0YXRpYyBpbnQgY2FuX2dldF9iaXR0aW1pbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNhbl9iaXR0aW1pbmcgKmJ0KQogewogCXN0cnVjdCBjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9qYW56LWljYW4zLmMgYi9kcml2ZXJzL25ldC9jYW4vamFuei1pY2FuMy5jCmluZGV4IGYxOTQyY2EuLjMyNzc4ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9qYW56LWljYW4zLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2phbnotaWNhbjMuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nhbi9lcnJvci5oPgogCiAjaW5jbHVkZSA8bGludXgvbWZkL2phbnouaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KIAogLyogdGhlIERQTSBoYXMgNjRrIG9mIG1lbW9yeSwgb3JnYW5pemVkIGludG8gMjU2eCAyNTYgYnl0ZSBwYWdlcyAqLwogI2RlZmluZSBEUE1fTlVNX1BBR0VTCQkyNTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL3NqYTEwMDAuaCBiL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL3NqYTEwMDAuaAppbmRleCBkZThlNzc4Li43OGJkNGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9zamExMDAwLmgKKysrIGIvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvc2phMTAwMC5oCkBAIC00Nyw2ICs0Nyw3IEBACiAjaWZuZGVmIFNKQTEwMDBfREVWX0gKICNkZWZpbmUgU0pBMTAwMF9ERVZfSAogCisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAjaW5jbHVkZSA8bGludXgvY2FuL2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nhbi9wbGF0Zm9ybS9zamExMDAwLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL3NqYTEwMDBfb2ZfcGxhdGZvcm0uYyBiL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL3NqYTEwMDBfb2ZfcGxhdGZvcm0uYwppbmRleCA5NzkzZGY2Li5jZWU2YmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9zamExMDAwX29mX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvc2phMTAwMF9vZl9wbGF0Zm9ybS5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Nhbi9kZXYuaD4KIAogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vc2xjYW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi9zbGNhbi5jCmluZGV4IDFiNDlkZjYuLmY1MjNmMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9zbGNhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9zbGNhbi5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jYW4uaD4KIAogc3RhdGljIF9faW5pdGRhdGEgY29uc3QgY2hhciBiYW5uZXJbXSA9CkBAIC05NSwxMCArOTYsNiBAQAogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogRmxhZyB2YWx1ZXMvIG1vZGUgZXRjICAgICAqLwogI2RlZmluZSBTTEZfSU5VU0UJCTAJCS8qIENoYW5uZWwgaW4gdXNlICAgICAgICAgICAgKi8KICNkZWZpbmUgU0xGX0VSUk9SCQkxICAgICAgICAgICAgICAgLyogUGFyaXR5LCBldGMuIGVycm9yICAgICAgICAqLwotCi0JdW5zaWduZWQgY2hhcgkJbGVhc2VkOwotCWRldl90CQkJbGluZTsKLQlwaWRfdAkJCXBpZDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqKnNsY2FuX2RldnM7CkBAIC0xNDIsMjEgKzEzOSw2IEBACiAgICoJCQlTVEFOREFSRCBTTENBTiBERUNBUFNVTEFUSU9OCQkJICoKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IGFzYzJuaWJibGUoY2hhciBjKQotewotCi0JaWYgKChjID49ICcwJykgJiYgKGMgPD0gJzknKSkKLQkJcmV0dXJuIGMgLSAnMCc7Ci0KLQlpZiAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnRicpKQotCQlyZXR1cm4gYyAtICdBJyArIDEwOwotCi0JaWYgKChjID49ICdhJykgJiYgKGMgPD0gJ2YnKSkKLQkJcmV0dXJuIGMgLSAnYScgKyAxMDsKLQotCXJldHVybiAxNjsgLyogZXJyb3IgKi8KLX0KLQogLyogU2VuZCBvbmUgY29tcGxldGVseSBkZWNhcHN1bGF0ZWQgY2FuX2ZyYW1lIHRvIHRoZSBuZXR3b3JrIGxheWVyICovCiBzdGF0aWMgdm9pZCBzbGNfYnVtcChzdHJ1Y3Qgc2xjYW4gKnNsKQogewpAQCAtMTk1LDE4ICsxNzcsMTYgQEAKIAkqKHU2NCAqKSAoJmNmLmRhdGEpID0gMDsgLyogY2xlYXIgcGF5bG9hZCAqLwogCiAJZm9yIChpID0gMCwgZGxjX3BvcysrOyBpIDwgY2YuY2FuX2RsYzsgaSsrKSB7Ci0KLQkJdG1wID0gYXNjMm5pYmJsZShzbC0+cmJ1ZmZbZGxjX3BvcysrXSk7Ci0JCWlmICh0bXAgPiAweDBGKQorCQl0bXAgPSBoZXhfdG9fYmluKHNsLT5yYnVmZltkbGNfcG9zKytdKTsKKwkJaWYgKHRtcCA8IDApCiAJCQlyZXR1cm47CiAJCWNmLmRhdGFbaV0gPSAodG1wIDw8IDQpOwotCQl0bXAgPSBhc2MybmliYmxlKHNsLT5yYnVmZltkbGNfcG9zKytdKTsKLQkJaWYgKHRtcCA+IDB4MEYpCisJCXRtcCA9IGhleF90b19iaW4oc2wtPnJidWZmW2RsY19wb3MrK10pOworCQlpZiAodG1wIDwgMCkKIAkJCXJldHVybjsKIAkJY2YuZGF0YVtpXSB8PSB0bXA7CiAJfQogCi0KIAlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgY2FuX2ZyYW1lKSk7CiAJaWYgKCFza2IpCiAJCXJldHVybjsKQEAgLTQ2Miw3ICs0NDIsNyBAQAogCQkJYnJlYWs7CiAKIAkJc2wgPSBuZXRkZXZfcHJpdihkZXYpOwotCQlpZiAoc2wtPnR0eSB8fCBzbC0+bGVhc2VkKQorCQlpZiAoc2wtPnR0eSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkKIAkJCWRldl9jbG9zZShkZXYpOwpAQCAtNDczLDEyICs0NTMsMTAgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2xjYW4gKnNsY19hbGxvYyhkZXZfdCBsaW5lKQogewogCWludCBpOworCWNoYXIgbmFtZVtJRk5BTVNJWl07CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CiAJc3RydWN0IHNsY2FuICAgICAgICpzbDsKIAotCWlmIChzbGNhbl9kZXZzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwkvKiBNYXN0ZXIgYXJyYXkgbWlzc2luZyAhICovCi0KIAlmb3IgKGkgPSAwOyBpIDwgbWF4ZGV2OyBpKyspIHsKIAkJZGV2ID0gc2xjYW5fZGV2c1tpXTsKIAkJaWYgKGRldiA9PSBOVUxMKQpAQCAtNDkwLDI1ICs0NjgsMTIgQEAKIAlpZiAoaSA+PSBtYXhkZXYpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKGRldikgewotCQlzbCA9IG5ldGRldl9wcml2KGRldik7Ci0JCWlmICh0ZXN0X2JpdChTTEZfSU5VU0UsICZzbC0+ZmxhZ3MpKSB7Ci0JCQl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOwotCQkJZGV2ID0gTlVMTDsKLQkJCXNsY2FuX2RldnNbaV0gPSBOVUxMOwotCQl9Ci0JfQorCXNwcmludGYobmFtZSwgInNsY2FuJWQiLCBpKTsKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKCpzbCksIG5hbWUsIHNsY19zZXR1cCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOwogCi0JaWYgKCFkZXYpIHsKLQkJY2hhciBuYW1lW0lGTkFNU0laXTsKLQkJc3ByaW50ZihuYW1lLCAic2xjYW4lZCIsIGkpOwotCi0JCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnNsKSwgbmFtZSwgc2xjX3NldHVwKTsKLQkJaWYgKCFkZXYpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGV2LT5iYXNlX2FkZHIgID0gaTsKLQl9Ci0KKwlkZXYtPmJhc2VfYWRkciAgPSBpOwogCXNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCS8qIEluaXRpYWxpemUgY2hhbm5lbCBjb250cm9sIGRhdGEgKi8KQEAgLTU2NSw4ICs1MzAsNiBAQAogCiAJc2wtPnR0eSA9IHR0eTsKIAl0dHktPmRpc2NfZGF0YSA9IHNsOwotCXNsLT5saW5lID0gdHR5X2Rldm51bSh0dHkpOwotCXNsLT5waWQgPSBjdXJyZW50LT5waWQ7CiAKIAlpZiAoIXRlc3RfYml0KFNMRl9JTlVTRSwgJnNsLT5mbGFncykpIHsKIAkJLyogUGVyZm9ybSB0aGUgbG93LWxldmVsIFNMQ0FOIGluaXRpYWxpemF0aW9uLiAqLwpAQCAtNjE3LDggKzU4MCw2IEBACiAKIAl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CiAJc2wtPnR0eSA9IE5VTEw7Ci0JaWYgKCFzbC0+bGVhc2VkKQotCQlzbC0+bGluZSA9IDA7CiAKIAkvKiBGbHVzaCBuZXR3b3JrIHNpZGUgKi8KIAl1bnJlZ2lzdGVyX25ldGRldihzbC0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9zb2Z0aW5nL3NvZnRpbmdfZncuYyBiL2RyaXZlcnMvbmV0L2Nhbi9zb2Z0aW5nL3NvZnRpbmdfZncuYwppbmRleCBiNTIwNzg0Li4zMTA1OTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vc29mdGluZy9zb2Z0aW5nX2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3NvZnRpbmcvc29mdGluZ19mdy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSAic29mdGluZy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vc29mdGluZy9zb2Z0aW5nX21haW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi9zb2Z0aW5nL3NvZnRpbmdfbWFpbi5jCmluZGV4IDYwYTQ5ZTUuLjA5YThiODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9zb2Z0aW5nL3NvZnRpbmdfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9zb2Z0aW5nL3NvZnRpbmdfbWFpbi5jCkBAIC0xNywxMCArMTcsMTAgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlICJzb2Z0aW5nLmgiCiAKQEAgLTc5OSw3ICs3OTksNyBAQAogCWlmICghcHJlcykKIAkJZ290byBwbGF0Zm9ybV9yZXNvdXJjZV9mYWlsZWQ7CiAJY2FyZC0+ZHByYW1fcGh5cyA9IHByZXMtPnN0YXJ0OwotCWNhcmQtPmRwcmFtX3NpemUgPSBwcmVzLT5lbmQgLSBwcmVzLT5zdGFydCArIDE7CisJY2FyZC0+ZHByYW1fc2l6ZSA9IHJlc291cmNlX3NpemUocHJlcyk7CiAJY2FyZC0+ZHByYW0gPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+ZHByYW1fcGh5cywgY2FyZC0+ZHByYW1fc2l6ZSk7CiAJaWYgKCFjYXJkLT5kcHJhbSkgewogCQlkZXZfYWxlcnQoJmNhcmQtPnBkZXYtPmRldiwgImRwcmFtIGlvcmVtYXAgZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYyBiL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYwppbmRleCAyMmNlMDNlLi5iNDE0ZjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYXNzaW5pLmMKKysrIGIvZHJpdmVycy9uZXQvY2Fzc2luaS5jCkBAIC03NSw2ICs3NSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY29tbW9uLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2NvbW1vbi5oCmluZGV4IGMyNmQ4NjMuLjVjY2JlZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jb21tb24uaApAQCAtMjQwLDggKzI0MCw2IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IGV4dF9pbnRyX2hhbmRsZXJfdGFzazsKIAlzdHJ1Y3QgYWRhcHRlcl9wYXJhbXMgcGFyYW1zOwogCi0Jc3RydWN0IHZsYW5fZ3JvdXAgKnZsYW5fZ3JwOwotCiAJLyogVGVybWluYXRvciBtb2R1bGVzLiAqLwogCXN0cnVjdCBzZ2UgICAgKnNnZTsKIAlzdHJ1Y3QgcGVlc3BpICplc3BpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9jeGdiMi5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jeGdiMi5jCmluZGV4IGI0MjJkODMuLjNlZGJiYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3hnYjIuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2N4Z2IyLmMKQEAgLTI2Myw2ICsyNjMsOCBAQAogCWlmICghb3RoZXJfcG9ydHMgJiYgYWRhcHRlci0+cGFyYW1zLnN0YXRzX3VwZGF0ZV9wZXJpb2QpCiAJCXNjaGVkdWxlX21hY19zdGF0c191cGRhdGUoYWRhcHRlciwKIAkJCQkJICBhZGFwdGVyLT5wYXJhbXMuc3RhdHNfdXBkYXRlX3BlcmlvZCk7CisKKwl0MV92bGFuX21vZGUoYWRhcHRlciwgZGV2LT5mZWF0dXJlcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0OSwxOSArODUxLDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKLXN0YXRpYyB2b2lkIHQxX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQorc3RhdGljIHUzMiB0MV9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQogeworCS8qCisJICogU2luY2UgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2VwYXJhdGUgcngvdHggdmxhbiBhY2NlbAorCSAqIGVuYWJsZS9kaXNhYmxlIG1ha2Ugc3VyZSB0eCBmbGFnIGlzIGFsd2F5cyBpbiBzYW1lIHN0YXRlIGFzIHJ4LgorCSAqLworCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYOworCWVsc2UKKwkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfSFdfVkxBTl9UWDsKKworCXJldHVybiBmZWF0dXJlczsKK30KKworc3RhdGljIGludCB0MV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQoreworCXUzMiBjaGFuZ2VkID0gZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOwogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5tbF9wcml2OwogCi0Jc3Bpbl9sb2NrX2lycSgmYWRhcHRlci0+YXN5bmNfbG9jayk7Ci0JYWRhcHRlci0+dmxhbl9ncnAgPSBncnA7Ci0JdDFfc2V0X3ZsYW5fYWNjZWwoYWRhcHRlciwgZ3JwICE9IE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+YXN5bmNfbG9jayk7Ci19Ci0jZW5kaWYKKwlpZiAoY2hhbmdlZCAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJdDFfdmxhbl9tb2RlKGFkYXB0ZXIsIGZlYXR1cmVzKTsKIAorCXJldHVybiAwOworfQogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiBzdGF0aWMgdm9pZCB0MV9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC05NTUsOSArOTY4LDggQEAKIAkubmRvX2RvX2lvY3RsCQk9IHQxX2lvY3RsLAogCS5uZG9fY2hhbmdlX210dQkJPSB0MV9jaGFuZ2VfbXR1LAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gdDFfc2V0X21hY19hZGRyLAotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IHQxX3ZsYW5fcnhfcmVnaXN0ZXIsCi0jZW5kaWYKKwkubmRvX2ZpeF9mZWF0dXJlcwk9IHQxX2ZpeF9mZWF0dXJlcywKKwkubmRvX3NldF9mZWF0dXJlcwk9IHQxX3NldF9mZWF0dXJlcywKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gdDFfbmV0cG9sbCwKICNlbmRpZgpAQCAtMTA4MCwxMCArMTA5Miw5IEBACiAJCWlmIChwY2lfdXNpbmdfZGFjKQogCQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAJCWlmICh2bGFuX3Rzb19jYXBhYmxlKGFkYXB0ZXIpKSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCiAJCQluZXRkZXYtPmZlYXR1cmVzIHw9CiAJCQkJTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOwotI2VuZGlmCisJCQluZXRkZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9SWDsKIAogCQkJLyogVDIwNDogZGlzYWJsZSBUU08gKi8KIAkJCWlmICghKGlzX1QyKGFkYXB0ZXIpKSB8fCBiaS0+cG9ydF9udW1iZXIgIT0gNCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmMKaW5kZXggNTgzODBkMi4uZTlhMDNmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jCkBAIC03NDIsMTMgKzc0MiwxNCBAQAogLyoKICAqIEVuYWJsZS9kaXNhYmxlIFZMQU4gYWNjZWxlcmF0aW9uLgogICovCi12b2lkIHQxX3NldF92bGFuX2FjY2VsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgb25fb2ZmKQordm9pZCB0MV92bGFuX21vZGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgc2dlICpzZ2UgPSBhZGFwdGVyLT5zZ2U7CiAKLQlzZ2UtPnNnZV9jb250cm9sICY9IH5GX1ZMQU5fWFRSQUNUOwotCWlmIChvbl9vZmYpCisJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKQogCQlzZ2UtPnNnZV9jb250cm9sIHw9IEZfVkxBTl9YVFJBQ1Q7CisJZWxzZQorCQlzZ2UtPnNnZV9jb250cm9sICY9IH5GX1ZMQU5fWFRSQUNUOwogCWlmIChhZGFwdGVyLT5vcGVuX2RldmljZV9tYXApIHsKIAkJd3JpdGVsKHNnZS0+c2dlX2NvbnRyb2wsIGFkYXB0ZXItPnJlZ3MgKyBBX1NHX0NPTlRST0wpOwogCQlyZWFkbChhZGFwdGVyLT5yZWdzICsgQV9TR19DT05UUk9MKTsgICAvKiBmbHVzaCAqLwpAQCAtMTM5NywxMiArMTM5OCwxMSBAQAogCX0gZWxzZQogCQlza2JfY2hlY2tzdW1fbm9uZV9hc3NlcnQoc2tiKTsKIAotCWlmICh1bmxpa2VseShhZGFwdGVyLT52bGFuX2dycCAmJiBwLT52bGFuX3ZhbGlkKSkgeworCWlmIChwLT52bGFuX3ZhbGlkKSB7CiAJCXN0LT52bGFuX3h0cmFjdCsrOwotCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBhZGFwdGVyLT52bGFuX2dycCwKLQkJCQkJIG50b2hzKHAtPnZsYW4pKTsKLQl9IGVsc2UKLQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIG50b2hzKHAtPnZsYW4pKTsKKwl9CisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIH0KIAogLyoKQEAgLTE4NzUsMTMgKzE4NzUsMTEgQEAKIAl9CiAJY3BsLT5pZmYgPSBkZXYtPmlmX3BvcnQ7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKIAlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CiAJCWNwbC0+dmxhbl92YWxpZCA9IDE7CiAJCWNwbC0+dmxhbiA9IGh0b25zKHZsYW5fdHhfdGFnX2dldChza2IpKTsKIAkJc3QtPnZsYW5faW5zZXJ0Kys7CiAJfSBlbHNlCi0jZW5kaWYKIAkJY3BsLT52bGFuX3ZhbGlkID0gMDsKIAogc2VuZDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5oCmluZGV4IDAwY2MzN2YuLmUwMzk4MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuaApAQCAtNzksNyArNzksNyBAQAogaW50IHQxX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICosIGludCk7CiAKIG5ldGRldl90eF90IHQxX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIHQxX3NldF92bGFuX2FjY2VsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgb25fb2ZmKTsKK3ZvaWQgdDFfdmxhbl9tb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZmVhdHVyZXMpOwogdm9pZCB0MV9zZ2Vfc3RhcnQoc3RydWN0IHNnZSAqKTsKIHZvaWQgdDFfc2dlX3N0b3Aoc3RydWN0IHNnZSAqKTsKIGludCB0MV9zZ2VfaW50cl9lcnJvcl9oYW5kbGVyKHN0cnVjdCBzZ2UgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jbmljLmMgYi9kcml2ZXJzL25ldC9jbmljLmMKaW5kZXggMTFhOTJhZi4uOTRhMmU1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY25pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2NuaWMuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIGNuaWMuYzogQnJvYWRjb20gQ05JQyBjb3JlIG5ldHdvcmsgZHJpdmVyLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNi0yMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKICNkZWZpbmUgQkNNX1ZMQU4gMQogI2VuZGlmCkBAIC0zMjcsNyArMzI4LDcgQEAKIAkJbXNsZWVwKDEwMCk7CiAJCXJldHJ5Kys7CiAJfQotCXJldHVybiAwOworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgY25pY19jbV91cGNhbGwoc3RydWN0IGNuaWNfbG9jYWwgKiwgc3RydWN0IGNuaWNfc29jayAqLCB1OCk7CkBAIC02MDUsMTEgKzYwNiwxMiBAQAogfQogRVhQT1JUX1NZTUJPTChjbmljX3VucmVnaXN0ZXJfZHJpdmVyKTsKIAotc3RhdGljIGludCBjbmljX2luaXRfaWRfdGJsKHN0cnVjdCBjbmljX2lkX3RibCAqaWRfdGJsLCB1MzIgc2l6ZSwgdTMyIHN0YXJ0X2lkKQorc3RhdGljIGludCBjbmljX2luaXRfaWRfdGJsKHN0cnVjdCBjbmljX2lkX3RibCAqaWRfdGJsLCB1MzIgc2l6ZSwgdTMyIHN0YXJ0X2lkLAorCQkJICAgIHUzMiBuZXh0KQogewogCWlkX3RibC0+c3RhcnQgPSBzdGFydF9pZDsKIAlpZF90YmwtPm1heCA9IHNpemU7Ci0JaWRfdGJsLT5uZXh0ID0gMDsKKwlpZF90YmwtPm5leHQgPSBuZXh0OwogCXNwaW5fbG9ja19pbml0KCZpZF90YmwtPmxvY2spOwogCWlkX3RibC0+dGFibGUgPSBremFsbG9jKERJVl9ST1VORF9VUChzaXplLCAzMikgKiA0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlkX3RibC0+dGFibGUpCkBAIC04MzUsNyArODM3LDYgQEAKIAljcC0+Y3R4X2Jsa3MgPSAwOwogCiAJY25pY19mcmVlX2RtYShkZXYsICZjcC0+Z2JsX2J1Zl9pbmZvKTsKLQljbmljX2ZyZWVfZG1hKGRldiwgJmNwLT5jb25uX2J1Zl9pbmZvKTsKIAljbmljX2ZyZWVfZG1hKGRldiwgJmNwLT5rd3FfaW5mbyk7CiAJY25pY19mcmVlX2RtYShkZXYsICZjcC0+a3dxXzE2X2RhdGFfaW5mbyk7CiAJY25pY19mcmVlX2RtYShkZXYsICZjcC0+a2NxMi5kbWEpOwpAQCAtODk5LDI0ICs5MDAsNTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjbmljX2FsbG9jX2tjcShzdHJ1Y3QgY25pY19kZXYgKmRldiwgc3RydWN0IGtjcV9pbmZvICppbmZvKQorc3RhdGljIHUxNiBjbmljX2JueDJfbmV4dF9pZHgodTE2IGlkeCkKIHsKLQlpbnQgZXJyLCBpLCBpc19ibngyID0gMDsKKwlyZXR1cm4gaWR4ICsgMTsKK30KKworc3RhdGljIHUxNiBjbmljX2JueDJfaHdfaWR4KHUxNiBpZHgpCit7CisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIHUxNiBjbmljX2JueDJ4X25leHRfaWR4KHUxNiBpZHgpCit7CisJaWR4Kys7CisJaWYgKChpZHggJiBNQVhfS0NRRV9DTlQpID09IE1BWF9LQ1FFX0NOVCkKKwkJaWR4Kys7CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgdTE2IGNuaWNfYm54MnhfaHdfaWR4KHUxNiBpZHgpCit7CisJaWYgKChpZHggJiBNQVhfS0NRRV9DTlQpID09IE1BWF9LQ1FFX0NOVCkKKwkJaWR4Kys7CisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIGludCBjbmljX2FsbG9jX2tjcShzdHJ1Y3QgY25pY19kZXYgKmRldiwgc3RydWN0IGtjcV9pbmZvICppbmZvLAorCQkJICBib29sIHVzZV9wZ190YmwpCit7CisJaW50IGVyciwgaSwgdXNlX3BhZ2VfdGJsID0gMDsKIAlzdHJ1Y3Qga2NxZSAqKmtjcTsKIAotCWlmICh0ZXN0X2JpdChDTklDX0ZfQk5YMl9DTEFTUywgJmRldi0+ZmxhZ3MpKQotCQlpc19ibngyID0gMTsKKwlpZiAodXNlX3BnX3RibCkKKwkJdXNlX3BhZ2VfdGJsID0gMTsKIAotCWVyciA9IGNuaWNfYWxsb2NfZG1hKGRldiwgJmluZm8tPmRtYSwgS0NRX1BBR0VfQ05ULCBpc19ibngyKTsKKwllcnIgPSBjbmljX2FsbG9jX2RtYShkZXYsICZpbmZvLT5kbWEsIEtDUV9QQUdFX0NOVCwgdXNlX3BhZ2VfdGJsKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJa2NxID0gKHN0cnVjdCBrY3FlICoqKSBpbmZvLT5kbWEucGdfYXJyOwogCWluZm8tPmtjcSA9IGtjcTsKIAotCWlmIChpc19ibngyKQorCWluZm8tPm5leHRfaWR4ID0gY25pY19ibngyX25leHRfaWR4OworCWluZm8tPmh3X2lkeCA9IGNuaWNfYm54Ml9od19pZHg7CisJaWYgKHVzZV9wZ190YmwpCiAJCXJldHVybiAwOwogCisJaW5mby0+bmV4dF9pZHggPSBjbmljX2JueDJ4X25leHRfaWR4OworCWluZm8tPmh3X2lkeCA9IGNuaWNfYm54MnhfaHdfaWR4OworCiAJZm9yIChpID0gMDsgaSA8IEtDUV9QQUdFX0NOVDsgaSsrKSB7CiAJCXN0cnVjdCBibngyeF9iZF9jaGFpbl9uZXh0ICpuZXh0ID0KIAkJCShzdHJ1Y3QgYm54MnhfYmRfY2hhaW5fbmV4dCAqKSAma2NxW2ldW01BWF9LQ1FFX0NOVF07CkBAIC0xMDU5LDcgKzEwOTIsNyBAQAogCQlnb3RvIGVycm9yOwogCWNwLT5rd3EgPSAoc3RydWN0IGt3cWUgKiopIGNwLT5rd3FfaW5mby5wZ19hcnI7CiAKLQlyZXQgPSBjbmljX2FsbG9jX2tjcShkZXYsICZjcC0+a2NxMSk7CisJcmV0ID0gY25pY19hbGxvY19rY3EoZGV2LCAmY3AtPmtjcTEsIHRydWUpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTExMzksMjUgKzExNzIsMTcgQEAKIAogCWNwLT5pcm9fYXJyID0gZXRoZGV2LT5pcm9fYXJyOwogCi0JY3AtPm1heF9jaWRfc3BhY2UgPSBNQVhfSVNDU0lfVEJMX1NaICsgQk5YMlhfRkNPRV9OVU1fQ09OTkVDVElPTlM7CisJY3AtPm1heF9jaWRfc3BhY2UgPSBNQVhfSVNDU0lfVEJMX1NaOwogCWNwLT5pc2NzaV9zdGFydF9jaWQgPSBzdGFydF9jaWQ7CiAJY3AtPmZjb2Vfc3RhcnRfY2lkID0gc3RhcnRfY2lkICsgTUFYX0lTQ1NJX1RCTF9TWjsKIAotCWlmIChCTlgyWF9DSElQX0lTX0UyKGNwLT5jaGlwX2lkKSkgeworCWlmIChCTlgyWF9DSElQX0lTX0UyX1BMVVMoY3AtPmNoaXBfaWQpKSB7CiAJCWNwLT5tYXhfY2lkX3NwYWNlICs9IEJOWDJYX0ZDT0VfTlVNX0NPTk5FQ1RJT05TOwogCQljcC0+ZmNvZV9pbml0X2NpZCA9IGV0aGRldi0+ZmNvZV9pbml0X2NpZDsKIAkJaWYgKCFjcC0+ZmNvZV9pbml0X2NpZCkKIAkJCWNwLT5mY29lX2luaXRfY2lkID0gMHgxMDsKIAl9CiAKLQlpZiAoc3RhcnRfY2lkIDwgQk5YMlhfSVNDU0lfU1RBUlRfQ0lEKSB7Ci0JCXUzMiBkZWx0YSA9IEJOWDJYX0lTQ1NJX1NUQVJUX0NJRCAtIHN0YXJ0X2NpZDsKLQotCQljcC0+aXNjc2lfc3RhcnRfY2lkID0gQk5YMlhfSVNDU0lfU1RBUlRfQ0lEOwotCQljcC0+ZmNvZV9zdGFydF9jaWQgKz0gZGVsdGE7Ci0JCWNwLT5tYXhfY2lkX3NwYWNlICs9IGRlbHRhOwotCX0KLQogCWNwLT5pc2NzaV90YmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY25pY19pc2NzaSkgKiBNQVhfSVNDU0lfVEJMX1NaLAogCQkJCUdGUF9LRVJORUwpOwogCWlmICghY3AtPmlzY3NpX3RibCkKQEAgLTExOTUsMjIgKzEyMjAsMTYgQEAKIAkJCWorKzsKIAl9CiAKLQlyZXQgPSBjbmljX2FsbG9jX2tjcShkZXYsICZjcC0+a2NxMSk7CisJcmV0ID0gY25pY19hbGxvY19rY3EoZGV2LCAmY3AtPmtjcTEsIGZhbHNlKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yOwogCi0JaWYgKEJOWDJYX0NISVBfSVNfRTIoY3AtPmNoaXBfaWQpKSB7Ci0JCXJldCA9IGNuaWNfYWxsb2Nfa2NxKGRldiwgJmNwLT5rY3EyKTsKKwlpZiAoQk5YMlhfQ0hJUF9JU19FMl9QTFVTKGNwLT5jaGlwX2lkKSkgeworCQlyZXQgPSBjbmljX2FsbG9jX2tjcShkZXYsICZjcC0+a2NxMiwgdHJ1ZSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yOwogCX0KIAotCXBhZ2VzID0gUEFHRV9BTElHTihCTlgyWF9JU0NTSV9OVU1fQ09OTkVDVElPTlMgKgotCQkJICAgQk5YMlhfSVNDU0lfQ09OTl9CVUZfU0laRSkgLyBQQUdFX1NJWkU7Ci0JcmV0ID0gY25pY19hbGxvY19kbWEoZGV2LCAmY3AtPmNvbm5fYnVmX2luZm8sIHBhZ2VzLCAxKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yOwotCiAJcGFnZXMgPSBQQUdFX0FMSUdOKEJOWDJYX0lTQ1NJX0dMQl9CVUZfU0laRSkgLyBQQUdFX1NJWkU7CiAJcmV0ID0gY25pY19hbGxvY19kbWEoZGV2LCAmY3AtPmdibF9idWZfaW5mbywgcGFnZXMsIDApOwogCWlmIChyZXQpCkBAIC0xNTc3LDYgKzE1OTYsNyBAQAogCXN0cnVjdCBpc2NzaV9jb250ZXh0ICppY3R4OwogCXN0cnVjdCByZWdwYWlyIGNvbnRleHRfYWRkcjsKIAlpbnQgaSwgaiwgbiA9IDIsIG5fbWF4OworCXU4IHBvcnQgPSBDTklDX1BPUlQoY3ApOwogCiAJY3R4LT5jdHhfZmxhZ3MgPSAwOwogCWlmICghcmVxMi0+bnVtX2FkZGl0aW9uYWxfd3FlcykKQEAgLTE2MjgsNiArMTY0OCwxNyBAQAogCQlYU1RPUk1fSVNDU0lfQ09OVEVYVF9GTEFHU19CX0lNTUVESUFURV9EQVRBOwogCWljdHgtPnhzdG9ybV9zdF9jb250ZXh0LmlzY3NpLmZsYWdzLmZsYWdzIHw9CiAJCVhTVE9STV9JU0NTSV9DT05URVhUX0ZMQUdTX0JfSU5JVElBTF9SMlQ7CisJaWN0eC0+eHN0b3JtX3N0X2NvbnRleHQuY29tbW9uLmV0aGVybmV0LnJlc2VydmVkX3ZsYW5fdHlwZSA9CisJCUVUSF9QXzgwMjFROworCWlmIChCTlgyWF9DSElQX0lTX0UyX1BMVVMoY3AtPmNoaXBfaWQpICYmCisJCWNwLT5wb3J0X21vZGUgPT0gQ0hJUF8yX1BPUlRfTU9ERSkgeworCisJCXBvcnQgPSAwOworCX0KKwlpY3R4LT54c3Rvcm1fc3RfY29udGV4dC5jb21tb24uZmxhZ3MgPQorCQkxIDw8IFhTVE9STV9DT01NT05fQ09OVEVYVF9TRUNUSU9OX1BIWVNRX0lOSVRJQUxJWkVEX1NISUZUOworCWljdHgtPnhzdG9ybV9zdF9jb250ZXh0LmNvbW1vbi5mbGFncyA9CisJCXBvcnQgPDwgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fUEJGX1BPUlRfU0hJRlQ7CiAKIAlpY3R4LT50c3Rvcm1fc3RfY29udGV4dC5pc2NzaS5oZHJfYnl0ZXNfMl9mZXRjaCA9IElTQ1NJX0hFQURFUl9TSVpFOwogCS8qIFRTVE9STSByZXF1aXJlcyB0aGUgYmFzZSBhZGRyZXNzIG9mIFJRIERCICYgbm90IFBURSAqLwpAQCAtMTg0Myw4ICsxODc0LDExIEBACiAJcmV0ID0gY25pY19zdWJtaXRfa3dxZV8xNihkZXYsIFJBTVJPRF9DTURfSURfQ09NTU9OX0NGQ19ERUwsCiAJCQkJICBod19jaWQsIE5PTkVfQ09OTkVDVElPTl9UWVBFLCAmbDVfZGF0YSk7CiAKLQlpZiAocmV0ID09IDApCisJaWYgKHJldCA9PSAwKSB7CiAJCXdhaXRfZXZlbnQoY3R4LT53YWl0cSwgY3R4LT53YWl0X2NvbmQpOworCQlpZiAodW5saWtlbHkodGVzdF9iaXQoQ1RYX0ZMX0NJRF9FUlJPUiwgJmN0eC0+Y3R4X2ZsYWdzKSkpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC0xODc5LDggKzE5MTMsMTAgQEAKIHNraXBfY2ZjX2RlbGV0ZToKIAljbmljX2ZyZWVfYm54MnhfY29ubl9yZXNjKGRldiwgbDVfY2lkKTsKIAotCWF0b21pY19kZWMoJmNwLT5pc2NzaV9jb25uKTsKLQljbGVhcl9iaXQoQ1RYX0ZMX09GRkxEX1NUQVJULCAmY3R4LT5jdHhfZmxhZ3MpOworCWlmICghcmV0KSB7CisJCWF0b21pY19kZWMoJmNwLT5pc2NzaV9jb25uKTsKKwkJY2xlYXJfYml0KENUWF9GTF9PRkZMRF9TVEFSVCwgJmN0eC0+Y3R4X2ZsYWdzKTsKKwl9CiAKIGRlc3Ryb3lfcmVwbHk6CiAJbWVtc2V0KCZrY3FlLCAwLCBzaXplb2Yoa2NxZSkpOwpAQCAtMTkzOSw4ICsxOTc1LDYgQEAKIAkJdHN0b3JtX2J1Zi0+a2FfaW50ZXJ2YWwgPSBrd3FlMy0+a2FfaW50ZXJ2YWw7CiAJCXRzdG9ybV9idWYtPmthX21heF9wcm9iZV9jb3VudCA9IGt3cWUzLT5rYV9tYXhfcHJvYmVfY291bnQ7CiAJfQotCXRzdG9ybV9idWYtPnJjdl9idWYgPSBrd3FlMy0+cmN2X2J1ZjsKLQl0c3Rvcm1fYnVmLT5zbmRfYnVmID0ga3dxZTMtPnNuZF9idWY7CiAJdHN0b3JtX2J1Zi0+bWF4X3J0X3RpbWUgPSAweGZmZmZmZmZmOwogfQogCkBAIC0xOTY5LDE1ICsyMDAzLDE0IEBACiAJCSBUU1RPUk1fSVNDU0lfVENQX1ZBUlNfTFNCX0xPQ0FMX01BQ19BRERSX09GRlNFVChwZmlkKSArIDEsCiAJCSBtYWNbNF0pOwogCUNOSUNfV1I4KGRldiwgQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkJIFRTVE9STV9JU0NTSV9UQ1BfVkFSU19NU0JfTE9DQUxfTUFDX0FERFJfT0ZGU0VUKHBmaWQpLCBtYWNbM10pOworCQkgVFNUT1JNX0lTQ1NJX1RDUF9WQVJTX01JRF9MT0NBTF9NQUNfQUREUl9PRkZTRVQocGZpZCksIG1hY1szXSk7CiAJQ05JQ19XUjgoZGV2LCBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkgVFNUT1JNX0lTQ1NJX1RDUF9WQVJTX01TQl9MT0NBTF9NQUNfQUREUl9PRkZTRVQocGZpZCkgKyAxLAorCQkgVFNUT1JNX0lTQ1NJX1RDUF9WQVJTX01JRF9MT0NBTF9NQUNfQUREUl9PRkZTRVQocGZpZCkgKyAxLAogCQkgbWFjWzJdKTsKIAlDTklDX1dSOChkZXYsIEJBUl9UU1RST1JNX0lOVE1FTSArCi0JCSBUU1RPUk1fSVNDU0lfVENQX1ZBUlNfTVNCX0xPQ0FMX01BQ19BRERSX09GRlNFVChwZmlkKSArIDIsCi0JCSBtYWNbMV0pOworCQkgVFNUT1JNX0lTQ1NJX1RDUF9WQVJTX01TQl9MT0NBTF9NQUNfQUREUl9PRkZTRVQocGZpZCksIG1hY1sxXSk7CiAJQ05JQ19XUjgoZGV2LCBCQVJfVFNUUk9STV9JTlRNRU0gKwotCQkgVFNUT1JNX0lTQ1NJX1RDUF9WQVJTX01TQl9MT0NBTF9NQUNfQUREUl9PRkZTRVQocGZpZCkgKyAzLAorCQkgVFNUT1JNX0lTQ1NJX1RDUF9WQVJTX01TQl9MT0NBTF9NQUNfQUREUl9PRkZTRVQocGZpZCkgKyAxLAogCQkgbWFjWzBdKTsKIH0KIApAQCAtMjE1Niw3ICsyMTg5LDcgQEAKIAltZW1zZXQoZmNvZV9zdGF0LCAwLCBzaXplb2YoKmZjb2Vfc3RhdCkpOwogCW1lbWNweSgmZmNvZV9zdGF0LT5zdGF0X2t3cWUsIHJlcSwgc2l6ZW9mKCpyZXEpKTsKIAotCXJldCA9IGNuaWNfc3VibWl0X2t3cWVfMTYoZGV2LCBGQ09FX1JBTVJPRF9DTURfSURfU1RBVCwgY2lkLAorCXJldCA9IGNuaWNfc3VibWl0X2t3cWVfMTYoZGV2LCBGQ09FX1JBTVJPRF9DTURfSURfU1RBVF9GVU5DLCBjaWQsCiAJCQkJICBGQ09FX0NPTk5FQ1RJT05fVFlQRSwgJmw1X2RhdGEpOwogCXJldHVybiByZXQ7CiB9CkBAIC0yMjAxLDEyICsyMjM0LDkgQEAKIAltZW1jcHkoJmZjb2VfaW5pdC0+aW5pdF9rd3FlMSwgcmVxMSwgc2l6ZW9mKCpyZXExKSk7CiAJbWVtY3B5KCZmY29lX2luaXQtPmluaXRfa3dxZTIsIHJlcTIsIHNpemVvZigqcmVxMikpOwogCW1lbWNweSgmZmNvZV9pbml0LT5pbml0X2t3cWUzLCByZXEzLCBzaXplb2YoKnJlcTMpKTsKLQlmY29lX2luaXQtPmVxX2FkZHIubG8gPSBjcC0+a2NxMi5kbWEucGdfbWFwX2FyclswXSAmIDB4ZmZmZmZmZmY7Ci0JZmNvZV9pbml0LT5lcV9hZGRyLmhpID0gKHU2NCkgY3AtPmtjcTIuZG1hLnBnX21hcF9hcnJbMF0gPj4gMzI7Ci0JZmNvZV9pbml0LT5lcV9uZXh0X3BhZ2VfYWRkci5sbyA9Ci0JCWNwLT5rY3EyLmRtYS5wZ19tYXBfYXJyWzFdICYgMHhmZmZmZmZmZjsKLQlmY29lX2luaXQtPmVxX25leHRfcGFnZV9hZGRyLmhpID0KLQkJKHU2NCkgY3AtPmtjcTIuZG1hLnBnX21hcF9hcnJbMV0gPj4gMzI7CisJZmNvZV9pbml0LT5lcV9wYmxfYmFzZS5sbyA9IGNwLT5rY3EyLmRtYS5wZ3RibF9tYXAgJiAweGZmZmZmZmZmOworCWZjb2VfaW5pdC0+ZXFfcGJsX2Jhc2UuaGkgPSAodTY0KSBjcC0+a2NxMi5kbWEucGd0YmxfbWFwID4+IDMyOworCWZjb2VfaW5pdC0+ZXFfcGJsX3NpemUgPSBjcC0+a2NxMi5kbWEubnVtX3BhZ2VzOwogCiAJZmNvZV9pbml0LT5zYl9udW0gPSBjcC0+c3RhdHVzX2Jsa19udW07CiAJZmNvZV9pbml0LT5lcV9wcm9kID0gTUFYX0tDUV9JRFg7CkBAIC0yMjE0LDcgKzIyNDQsNyBAQAogCWNwLT5rY3EyLnN3X3Byb2RfaWR4ID0gMDsKIAogCWNpZCA9IEJOWDJYX0hXX0NJRChjcCwgY3AtPmZjb2VfaW5pdF9jaWQpOwotCXJldCA9IGNuaWNfc3VibWl0X2t3cWVfMTYoZGV2LCBGQ09FX1JBTVJPRF9DTURfSURfSU5JVCwgY2lkLAorCXJldCA9IGNuaWNfc3VibWl0X2t3cWVfMTYoZGV2LCBGQ09FX1JBTVJPRF9DTURfSURfSU5JVF9GVU5DLCBjaWQsCiAJCQkJICBGQ09FX0NPTk5FQ1RJT05fVFlQRSwgJmw1X2RhdGEpOwogCSp3b3JrID0gMzsKIAlyZXR1cm4gcmV0OwpAQCAtMjQxOCw2ICsyNDQ4LDMwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgY25pY19ibngyeF9kZWxldGVfd2FpdChzdHJ1Y3QgY25pY19kZXYgKmRldiwgdTMyIHN0YXJ0X2NpZCkKK3sKKwlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKKwl1MzIgaTsKKworCWZvciAoaSA9IHN0YXJ0X2NpZDsgaSA8IGNwLT5tYXhfY2lkX3NwYWNlOyBpKyspIHsKKwkJc3RydWN0IGNuaWNfY29udGV4dCAqY3R4ID0gJmNwLT5jdHhfdGJsW2ldOworCQlpbnQgajsKKworCQl3aGlsZSAodGVzdF9iaXQoQ1RYX0ZMX0RFTEVURV9XQUlULCAmY3R4LT5jdHhfZmxhZ3MpKQorCQkJbXNsZWVwKDEwKTsKKworCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7CisJCQlpZiAoIXRlc3RfYml0KENUWF9GTF9PRkZMRF9TVEFSVCwgJmN0eC0+Y3R4X2ZsYWdzKSkKKwkJCQlicmVhazsKKwkJCW1zbGVlcCgyMCk7CisJCX0KKworCQlpZiAodGVzdF9iaXQoQ1RYX0ZMX09GRkxEX1NUQVJULCAmY3R4LT5jdHhfZmxhZ3MpKQorCQkJbmV0ZGV2X3dhcm4oZGV2LT5uZXRkZXYsICJDSUQgJXggbm90IGRlbGV0ZWRcbiIsCisJCQkJICAgY3R4LT5jaWQpOworCX0KK30KKwogc3RhdGljIGludCBjbmljX2JueDJ4X2Zjb2VfZndfZGVzdHJveShzdHJ1Y3QgY25pY19kZXYgKmRldiwgc3RydWN0IGt3cWUgKmt3cWUpCiB7CiAJc3RydWN0IGZjb2Vfa3dxZV9kZXN0cm95ICpyZXE7CkBAIC0yNDI2LDExICsyNDgwLDEzIEBACiAJaW50IHJldDsKIAl1MzIgY2lkOwogCisJY25pY19ibngyeF9kZWxldGVfd2FpdChkZXYsIE1BWF9JU0NTSV9UQkxfU1opOworCiAJcmVxID0gKHN0cnVjdCBmY29lX2t3cWVfZGVzdHJveSAqKSBrd3FlOwogCWNpZCA9IEJOWDJYX0hXX0NJRChjcCwgY3AtPmZjb2VfaW5pdF9jaWQpOwogCiAJbWVtc2V0KCZsNV9kYXRhLCAwLCBzaXplb2YobDVfZGF0YSkpOwotCXJldCA9IGNuaWNfc3VibWl0X2t3cWVfMTYoZGV2LCBGQ09FX1JBTVJPRF9DTURfSURfREVTVFJPWSwgY2lkLAorCXJldCA9IGNuaWNfc3VibWl0X2t3cWVfMTYoZGV2LCBGQ09FX1JBTVJPRF9DTURfSURfREVTVFJPWV9GVU5DLCBjaWQsCiAJCQkJICBGQ09FX0NPTk5FQ1RJT05fVFlQRSwgJmw1X2RhdGEpOwogCXJldHVybiByZXQ7CiB9CkBAIC0yNTExLDcgKzI1NjcsNyBAQAogCWlmICghdGVzdF9iaXQoQ05JQ19GX0NOSUNfVVAsICZkZXYtPmZsYWdzKSkKIAkJcmV0dXJuIC1FQUdBSU47CQkvKiBibngyIGlzIGRvd24gKi8KIAotCWlmIChCTlgyWF9DSElQX05VTShjcC0+Y2hpcF9pZCkgPT0gQk5YMlhfQ0hJUF9OVU1fNTc3MTApCisJaWYgKCFCTlgyWF9DSElQX0lTX0UyX1BMVVMoY3AtPmNoaXBfaWQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fd3FlczsgKSB7CkBAIC0yNjUxLDMyICsyNzA3LDYgQEAKIAkJY25pY19zcHFfY29tcGxldGlvbihkZXYsIERSVl9DVExfUkVUX0w1X1NQUV9DUkVESVRfQ01ELCBjb21wKTsKIH0KIAotc3RhdGljIHUxNiBjbmljX2JueDJfbmV4dF9pZHgodTE2IGlkeCkKLXsKLQlyZXR1cm4gaWR4ICsgMTsKLX0KLQotc3RhdGljIHUxNiBjbmljX2JueDJfaHdfaWR4KHUxNiBpZHgpCi17Ci0JcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljIHUxNiBjbmljX2JueDJ4X25leHRfaWR4KHUxNiBpZHgpCi17Ci0JaWR4Kys7Ci0JaWYgKChpZHggJiBNQVhfS0NRRV9DTlQpID09IE1BWF9LQ1FFX0NOVCkKLQkJaWR4Kys7Ci0KLQlyZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgdTE2IGNuaWNfYm54MnhfaHdfaWR4KHUxNiBpZHgpCi17Ci0JaWYgKChpZHggJiBNQVhfS0NRRV9DTlQpID09IE1BWF9LQ1FFX0NOVCkKLQkJaWR4Kys7Ci0JcmV0dXJuIGlkeDsKLX0KLQogc3RhdGljIGludCBjbmljX2dldF9rY3FlcyhzdHJ1Y3QgY25pY19kZXYgKmRldiwgc3RydWN0IGtjcV9pbmZvICppbmZvKQogewogCXN0cnVjdCBjbmljX2xvY2FsICpjcCA9IGRldi0+Y25pY19wcml2OwpAQCAtMjY4NywxMiArMjcxNywxMiBAQAogCWkgPSByaSA9IGxhc3QgPSBpbmZvLT5zd19wcm9kX2lkeDsKIAlyaSAmPSBNQVhfS0NRX0lEWDsKIAlod19wcm9kID0gKmluZm8tPmh3X3Byb2RfaWR4X3B0cjsKLQlod19wcm9kID0gY3AtPmh3X2lkeChod19wcm9kKTsKKwlod19wcm9kID0gaW5mby0+aHdfaWR4KGh3X3Byb2QpOwogCiAJd2hpbGUgKChpICE9IGh3X3Byb2QpICYmIChrY3FlX2NudCA8IE1BWF9DT01QTEVURURfS0NRRSkpIHsKIAkJa2NxZSA9ICZpbmZvLT5rY3FbS0NRX1BHKHJpKV1bS0NRX0lEWChyaSldOwogCQljcC0+Y29tcGxldGVkX2tjcVtrY3FlX2NudCsrXSA9IGtjcWU7Ci0JCWkgPSBjcC0+bmV4dF9pZHgoaSk7CisJCWkgPSBpbmZvLT5uZXh0X2lkeChpKTsKIAkJcmkgPSBpICYgTUFYX0tDUV9JRFg7CiAJCWlmIChsaWtlbHkoIShrY3FlLT5rY3FlX29wX2ZsYWcgJiBLQ1FFX0ZMQUdTX05FWFQpKSkgewogCQkJbGFzdF9jbnQgPSBrY3FlX2NudDsKQEAgLTI3NzgsMTMgKzI4MDgsMTAgQEAKIAogCQkvKiBUZWxsIGNvbXBpbGVyIHRoYXQgc3RhdHVzX2JsayBmaWVsZHMgY2FuIGNoYW5nZS4gKi8KIAkJYmFycmllcigpOwotCQlpZiAoc3RhdHVzX2lkeCAhPSAqY3AtPmtjcTEuc3RhdHVzX2lkeF9wdHIpIHsKLQkJCXN0YXR1c19pZHggPSAodTE2KSAqY3AtPmtjcTEuc3RhdHVzX2lkeF9wdHI7Ci0JCQkvKiBzdGF0dXMgYmxvY2sgaW5kZXggbXVzdCBiZSByZWFkIGZpcnN0ICovCi0JCQlybWIoKTsKLQkJCWNwLT5rd3FfY29uX2lkeCA9ICpjcC0+a3dxX2Nvbl9pZHhfcHRyOwotCQl9IGVsc2UKLQkJCWJyZWFrOworCQlzdGF0dXNfaWR4ID0gKHUxNikgKmNwLT5rY3ExLnN0YXR1c19pZHhfcHRyOworCQkvKiBzdGF0dXMgYmxvY2sgaW5kZXggbXVzdCBiZSByZWFkIGZpcnN0ICovCisJCXJtYigpOworCQljcC0+a3dxX2Nvbl9pZHggPSAqY3AtPmt3cV9jb25faWR4X3B0cjsKIAl9CiAKIAlDTklDX1dSMTYoZGV2LCBjcC0+a2NxMS5pb19hZGRyLCBjcC0+a2NxMS5zd19wcm9kX2lkeCk7CkBAIC0yOTA4LDggKzI5MzUsNiBAQAogCiAJCS8qIFRlbGwgY29tcGlsZXIgdGhhdCBzYmxrIGZpZWxkcyBjYW4gY2hhbmdlLiAqLwogCQliYXJyaWVyKCk7Ci0JCWlmIChsYXN0X3N0YXR1cyA9PSAqaW5mby0+c3RhdHVzX2lkeF9wdHIpCi0JCQlicmVhazsKIAogCQlsYXN0X3N0YXR1cyA9ICppbmZvLT5zdGF0dXNfaWR4X3B0cjsKIAkJLyogc3RhdHVzIGJsb2NrIGluZGV4IG11c3QgYmUgcmVhZCBiZWZvcmUgcmVhZGluZyB0aGUgS0NRICovCkBAIC0yOTMzLDcgKzI5NTgsNyBAQAogCQlDTklDX1dSMTYoZGV2LCBjcC0+a2NxMS5pb19hZGRyLAogCQkJICBjcC0+a2NxMS5zd19wcm9kX2lkeCArIE1BWF9LQ1FfSURYKTsKIAotCQlpZiAoIUJOWDJYX0NISVBfSVNfRTIoY3AtPmNoaXBfaWQpKSB7CisJCWlmICghQk5YMlhfQ0hJUF9JU19FMl9QTFVTKGNwLT5jaGlwX2lkKSkgewogCQkJY25pY19hY2tfYm54MnhfaW50KGRldiwgY3AtPmJueDJ4X2lndV9zYl9pZCwgVVNUT1JNX0lELAogCQkJCQkgICBzdGF0dXNfaWR4LCBJR1VfSU5UX0VOQUJMRSwgMSk7CiAJCQlicmVhazsKQEAgLTMwNTIsMTMgKzMwNzcsMjEgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgQ05JQ19DVExfQ09NUExFVElPTl9DTUQ6IHsKLQkJdTMyIGNpZCA9IEJOWDJYX1NXX0NJRChpbmZvLT5kYXRhLmNvbXAuY2lkKTsKKwkJc3RydWN0IGNuaWNfY3RsX2NvbXBsZXRpb24gKmNvbXAgPSAmaW5mby0+ZGF0YS5jb21wOworCQl1MzIgY2lkID0gQk5YMlhfU1dfQ0lEKGNvbXAtPmNpZCk7CiAJCXUzMiBsNV9jaWQ7CiAJCXN0cnVjdCBjbmljX2xvY2FsICpjcCA9IGRldi0+Y25pY19wcml2OwogCiAJCWlmIChjbmljX2dldF9sNV9jaWQoY3AsIGNpZCwgJmw1X2NpZCkgPT0gMCkgewogCQkJc3RydWN0IGNuaWNfY29udGV4dCAqY3R4ID0gJmNwLT5jdHhfdGJsW2w1X2NpZF07CiAKKwkJCWlmICh1bmxpa2VseShjb21wLT5lcnJvcikpIHsKKwkJCQlzZXRfYml0KENUWF9GTF9DSURfRVJST1IsICZjdHgtPmN0eF9mbGFncyk7CisJCQkJbmV0ZGV2X2VycihkZXYtPm5ldGRldiwKKwkJCQkJICAgIkNJRCAleCBDRkMgZGVsZXRlIGNvbXAgZXJyb3IgJXhcbiIsCisJCQkJCSAgIGNpZCwgY29tcC0+ZXJyb3IpOworCQkJfQorCiAJCQljdHgtPndhaXRfY29uZCA9IDE7CiAJCQl3YWtlX3VwKCZjdHgtPndhaXRxKTsKIAkJfQpAQCAtMzc3Miw3ICszODA1LDEzIEBACiAJCWJyZWFrOwogCiAJY2FzZSBMNF9LQ1FFX09QQ09ERV9WQUxVRV9DTE9TRV9SRUNFSVZFRDoKLQkJY25pY19jbV91cGNhbGwoY3AsIGNzaywgb3Bjb2RlKTsKKwkJLyogYWZ0ZXIgd2UgYWxyZWFkeSBzZW50IENMT1NFX1JFUSAqLworCQlpZiAodGVzdF9iaXQoQ05JQ19GX0JOWDJYX0NMQVNTLCAmZGV2LT5mbGFncykgJiYKKwkJICAgICF0ZXN0X2JpdChTS19GX09GRkxEX0NPTVBMRVRFLCAmY3NrLT5mbGFncykgJiYKKwkJICAgIGNzay0+c3RhdGUgPT0gTDRfS0NRRV9PUENPREVfVkFMVUVfQ0xPU0VfQ09NUCkKKwkJCWNwLT5jbG9zZV9jb25uKGNzaywgTDRfS0NRRV9PUENPREVfVkFMVUVfUkVTRVRfQ09NUCk7CisJCWVsc2UKKwkJCWNuaWNfY21fdXBjYWxsKGNwLCBjc2ssIG9wY29kZSk7CiAJCWJyZWFrOwogCX0KIAljc2tfcHV0KGNzayk7CkBAIC0zODAzLDE0ICszODQyLDE3IEBACiBzdGF0aWMgaW50IGNuaWNfY21fYWxsb2NfbWVtKHN0cnVjdCBjbmljX2RldiAqZGV2KQogewogCXN0cnVjdCBjbmljX2xvY2FsICpjcCA9IGRldi0+Y25pY19wcml2OworCXUzMiBwb3J0X2lkOwogCiAJY3AtPmNza190YmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY25pY19zb2NrKSAqIE1BWF9DTV9TS19UQkxfU1osCiAJCQkgICAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWNwLT5jc2tfdGJsKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXBvcnRfaWQgPSByYW5kb20zMigpOworCXBvcnRfaWQgJT0gQ05JQ19MT0NBTF9QT1JUX1JBTkdFOwogCWlmIChjbmljX2luaXRfaWRfdGJsKCZjcC0+Y3NrX3BvcnRfdGJsLCBDTklDX0xPQ0FMX1BPUlRfUkFOR0UsCi0JCQkgICAgIENOSUNfTE9DQUxfUE9SVF9NSU4pKSB7CisJCQkgICAgIENOSUNfTE9DQUxfUE9SVF9NSU4sIHBvcnRfaWQpKSB7CiAJCWNuaWNfY21fZnJlZV9tZW0oZGV2KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzgyNiwxMiArMzg2OCwxNCBAQAogCX0KIAogCS8qIDEuIElmIGV2ZW50IG9wY29kZSBtYXRjaGVzIHRoZSBleHBlY3RlZCBldmVudCBpbiBjc2stPnN0YXRlCi0JICogMi4gSWYgdGhlIGV4cGVjdGVkIGV2ZW50IGlzIENMT1NFX0NPTVAsIHdlIGFjY2VwdCBhbnkgZXZlbnQKKwkgKiAyLiBJZiB0aGUgZXhwZWN0ZWQgZXZlbnQgaXMgQ0xPU0VfQ09NUCBvciBSRVNFVF9DT01QLCB3ZSBhY2NlcHQgYW55CisJICogICAgZXZlbnQKIAkgKiAzLiBJZiB0aGUgZXhwZWN0ZWQgZXZlbnQgaXMgMCwgbWVhbmluZyB0aGUgY29ubmVjdGlvbiB3YXMgbmV2ZXIKIAkgKiAgICBuZXZlciBlc3RhYmxpc2hlZCwgd2UgYWNjZXB0IHRoZSBvcGNvZGUgZnJvbSBjbV9hYm9ydC4KIAkgKi8KIAlpZiAob3Bjb2RlID09IGNzay0+c3RhdGUgfHwgY3NrLT5zdGF0ZSA9PSAwIHx8Ci0JICAgIGNzay0+c3RhdGUgPT0gTDRfS0NRRV9PUENPREVfVkFMVUVfQ0xPU0VfQ09NUCkgeworCSAgICBjc2stPnN0YXRlID09IEw0X0tDUUVfT1BDT0RFX1ZBTFVFX0NMT1NFX0NPTVAgfHwKKwkgICAgY3NrLT5zdGF0ZSA9PSBMNF9LQ1FFX09QQ09ERV9WQUxVRV9SRVNFVF9DT01QKSB7CiAJCWlmICghdGVzdF9hbmRfc2V0X2JpdChTS19GX0NMT1NJTkcsICZjc2stPmZsYWdzKSkgewogCQkJaWYgKGNzay0+c3RhdGUgPT0gMCkKIAkJCQljc2stPnN0YXRlID0gb3Bjb2RlOwpAQCAtMzg2NSw3ICszOTA5LDcgQEAKIHsKIAl1MzIgc2VlZDsKIAotCWdldF9yYW5kb21fYnl0ZXMoJnNlZWQsIDQpOworCXNlZWQgPSByYW5kb20zMigpOwogCWNuaWNfY3R4X3dyKGRldiwgNDUsIDAsIHNlZWQpOwogCXJldHVybiAwOwogfQpAQCAtMzkxMiw3ICszOTU2LDYgQEAKIHN0YXRpYyB2b2lkIGNuaWNfY21fc3RvcF9ibngyeF9odyhzdHJ1Y3QgY25pY19kZXYgKmRldikKIHsKIAlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKLQlpbnQgaTsKIAogCWlmICghY3AtPmN0eF90YmwpCiAJCXJldHVybjsKQEAgLTM5MjAsMTYgKzM5NjMsNyBAQAogCWlmICghbmV0aWZfcnVubmluZyhkZXYtPm5ldGRldikpCiAJCXJldHVybjsKIAotCWZvciAoaSA9IDA7IGkgPCBjcC0+bWF4X2NpZF9zcGFjZTsgaSsrKSB7Ci0JCXN0cnVjdCBjbmljX2NvbnRleHQgKmN0eCA9ICZjcC0+Y3R4X3RibFtpXTsKLQotCQl3aGlsZSAodGVzdF9iaXQoQ1RYX0ZMX0RFTEVURV9XQUlULCAmY3R4LT5jdHhfZmxhZ3MpKQotCQkJbXNsZWVwKDEwKTsKLQotCQlpZiAodGVzdF9iaXQoQ1RYX0ZMX09GRkxEX1NUQVJULCAmY3R4LT5jdHhfZmxhZ3MpKQotCQkJbmV0ZGV2X3dhcm4oZGV2LT5uZXRkZXYsICJDSUQgJXggbm90IGRlbGV0ZWRcbiIsCi0JCQkJICAgY3R4LT5jaWQpOwotCX0KKwljbmljX2JueDJ4X2RlbGV0ZV93YWl0KGRldiwgMCk7CiAKIAljYW5jZWxfZGVsYXllZF93b3JrKCZjcC0+ZGVsZXRlX3Rhc2spOwogCWZsdXNoX3dvcmtxdWV1ZShjbmljX3dxKTsKQEAgLTM5OTIsNiArNDAyNiw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgY3AtPm1heF9jaWRfc3BhY2U7IGkrKykgewogCQlzdHJ1Y3QgY25pY19jb250ZXh0ICpjdHggPSAmY3AtPmN0eF90YmxbaV07CisJCWludCBlcnI7CiAKIAkJaWYgKCF0ZXN0X2JpdChDVFhfRkxfT0ZGTERfU1RBUlQsICZjdHgtPmN0eF9mbGFncykgfHwKIAkJICAgICF0ZXN0X2JpdChDVFhfRkxfREVMRVRFX1dBSVQsICZjdHgtPmN0eF9mbGFncykpCkBAIC00MDA1LDEzICs0MDQwLDE1IEBACiAJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KENUWF9GTF9ERUxFVEVfV0FJVCwgJmN0eC0+Y3R4X2ZsYWdzKSkKIAkJCWNvbnRpbnVlOwogCi0JCWNuaWNfYm54MnhfZGVzdHJveV9yYW1yb2QoZGV2LCBpKTsKKwkJZXJyID0gY25pY19ibngyeF9kZXN0cm95X3JhbXJvZChkZXYsIGkpOwogCiAJCWNuaWNfZnJlZV9ibngyeF9jb25uX3Jlc2MoZGV2LCBpKTsKLQkJaWYgKGN0eC0+dWxwX3Byb3RvX2lkID09IENOSUNfVUxQX0lTQ1NJKQotCQkJYXRvbWljX2RlYygmY3AtPmlzY3NpX2Nvbm4pOworCQlpZiAoIWVycikgeworCQkJaWYgKGN0eC0+dWxwX3Byb3RvX2lkID09IENOSUNfVUxQX0lTQ1NJKQorCQkJCWF0b21pY19kZWMoJmNwLT5pc2NzaV9jb25uKTsKIAotCQljbGVhcl9iaXQoQ1RYX0ZMX09GRkxEX1NUQVJULCAmY3R4LT5jdHhfZmxhZ3MpOworCQkJY2xlYXJfYml0KENUWF9GTF9PRkZMRF9TVEFSVCwgJmN0eC0+Y3R4X2ZsYWdzKTsKKwkJfQogCX0KIAogCWlmIChuZWVkX3Jlc2NoZWQpCkBAIC00MjE4LDE0ICs0MjU1LDYgQEAKIAkJQk5YMl9QQ0lDRkdfSU5UX0FDS19DTURfSU5ERVhfVkFMSUQgfCBjcC0+bGFzdF9zdGF0dXNfaWR4KTsKIH0KIAotc3RhdGljIHZvaWQgY25pY19nZXRfYm54Ml9pc2NzaV9pbmZvKHN0cnVjdCBjbmljX2RldiAqZGV2KQotewotCXUzMiBtYXhfY29ubjsKLQotCW1heF9jb25uID0gY25pY19yZWdfcmRfaW5kKGRldiwgQk5YMl9GV19NQVhfSVNDU0lfQ09OTik7Ci0JZGV2LT5tYXhfaXNjc2lfY29ubiA9IG1heF9jb25uOwotfQotCiBzdGF0aWMgdm9pZCBjbmljX2Rpc2FibGVfYm54Ml9pbnRfc3luYyhzdHJ1Y3QgY25pY19kZXYgKmRldikKIHsKIAlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKQEAgLTQyOTEsNyArNDMyMCw3IEBACiAJdmFsID0gQk5YMl9MMkNUWF9DTURfVFlQRV9UWVBFX0wyIHwgKDggPDwgMTYpOwogCWNuaWNfY3R4X3dyKGRldiwgY2lkX2FkZHIsIG9mZnNldDEsIHZhbCk7CiAKLQl0eGJkID0gKHN0cnVjdCB0eF9iZCAqKSB1ZGV2LT5sMl9yaW5nOworCXR4YmQgPSB1ZGV2LT5sMl9yaW5nOwogCiAJYnVmX21hcCA9IHVkZXYtPmwyX2J1Zl9tYXA7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9UWF9ERVNDX0NOVDsgaSsrLCB0eGJkKyspIHsKQEAgLTQzNTAsNyArNDM3OSw3IEBACiAJCXZhbCA9IEJOWDJfTDJDVFhfTDJfU1RBVFVTQl9OVU0oc2JfaWQpOwogCWNuaWNfY3R4X3dyKGRldiwgY2lkX2FkZHIsIEJOWDJfTDJDVFhfSE9TVF9CRElEWCwgdmFsKTsKIAotCXJ4YmQgPSAoc3RydWN0IHJ4X2JkICopICh1ZGV2LT5sMl9yaW5nICsgQkNNX1BBR0VfU0laRSk7CisJcnhiZCA9IHVkZXYtPmwyX3JpbmcgKyBCQ01fUEFHRV9TSVpFOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfUlhfREVTQ19DTlQ7IGkrKywgcnhiZCsrKSB7CiAJCWRtYV9hZGRyX3QgYnVmX21hcDsKIAkJaW50IG4gPSAoaSAlIGNwLT5sMl9yeF9yaW5nX3NpemUpICsgMTsKQEAgLTQ1NTAsOCArNDU3OSw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JY25pY19nZXRfYm54Ml9pc2NzaV9pbmZvKGRldik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDYxNyw3ICs0NjQ0LDcgQEAKIAkJCUNTVE9STV9TVEFUVVNfQkxPQ0tfREFUQV9PRkZTRVQoc2JfaWQpICsKIAkJCW9mZnNldG9mKHN0cnVjdCBoY19zdGF0dXNfYmxvY2tfZGF0YV9lMXgsIGluZGV4X2RhdGEpICsKIAkJCXNpemVvZihzdHJ1Y3QgaGNfaW5kZXhfZGF0YSkqSENfSU5ERVhfSVNDU0lfRVFfQ09OUyArCi0JCQlvZmZzZXRvZihzdHJ1Y3QgaGNfaW5kZXhfZGF0YSwgdGltZW91dCksIDY0IC8gMTIpOworCQkJb2Zmc2V0b2Yoc3RydWN0IGhjX2luZGV4X2RhdGEsIHRpbWVvdXQpLCA2NCAvIDQpOwogCWNuaWNfc3Rvcm1fbWVtc2V0X2hjX2Rpc2FibGUoZGV2LCBzYl9pZCwgSENfSU5ERVhfSVNDU0lfRVFfQ09OUywgMCk7CiB9CiAKQEAgLTQ2MzMsNyArNDY2MCw2IEBACiAJdW5pb24gZXRoX3R4X2JkX3R5cGVzICp0eGJkID0gKHVuaW9uIGV0aF90eF9iZF90eXBlcyAqKSB1ZGV2LT5sMl9yaW5nOwogCWRtYV9hZGRyX3QgYnVmX21hcCwgcmluZ19tYXAgPSB1ZGV2LT5sMl9yaW5nX21hcDsKIAlzdHJ1Y3QgaG9zdF9zcF9zdGF0dXNfYmxvY2sgKnNiID0gY3AtPmJueDJ4X2RlZl9zdGF0dXNfYmxrOwotCWludCBwb3J0ID0gQ05JQ19QT1JUKGNwKTsKIAlpbnQgaTsKIAl1MzIgY2xpID0gY3AtPmV0aGRldi0+aXNjc2lfbDJfY2xpZW50X2lkOwogCXUzMiB2YWw7CkBAIC00Njc0LDEwICs0NzAwLDkgQEAKIAogCS8qIHJlc2V0IHhzdG9ybSBwZXIgY2xpZW50IHN0YXRpc3RpY3MgKi8KIAlpZiAoY2xpIDwgTUFYX1NUQVRfQ09VTlRFUl9JRCkgewotCQl2YWwgPSBCQVJfWFNUUk9STV9JTlRNRU0gKwotCQkgICAgICBYU1RPUk1fUEVSX0NPVU5URVJfSURfU1RBVFNfT0ZGU0VUKHBvcnQsIGNsaSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IHhzdG9ybV9wZXJfY2xpZW50X3N0YXRzKSAvIDQ7IGkrKykKLQkJCUNOSUNfV1IoZGV2LCB2YWwgKyBpICogNCwgMCk7CisJCWRhdGEtPmdlbmVyYWwuc3RhdGlzdGljc196ZXJvX2ZsZyA9IDE7CisJCWRhdGEtPmdlbmVyYWwuc3RhdGlzdGljc19lbl9mbGcgPSAxOworCQlkYXRhLT5nZW5lcmFsLnN0YXRpc3RpY3NfY291bnRlcl9pZCA9IGNsaTsKIAl9CiAKIAljcC0+dHhfY29uc19wdHIgPQpAQCAtNDY5NSw3ICs0NzIwLDYgQEAKIAkJCQkodWRldi0+bDJfcmluZyArICgyICogQkNNX1BBR0VfU0laRSkpOwogCXN0cnVjdCBob3N0X3NwX3N0YXR1c19ibG9jayAqc2IgPSBjcC0+Ym54MnhfZGVmX3N0YXR1c19ibGs7CiAJaW50IGk7Ci0JaW50IHBvcnQgPSBDTklDX1BPUlQoY3ApOwogCXUzMiBjbGkgPSBjcC0+ZXRoZGV2LT5pc2NzaV9sMl9jbGllbnRfaWQ7CiAJaW50IGNsX3F6b25lX2lkID0gQk5YMlhfQ0xfUVpPTkVfSUQoY3AsIGNsaSk7CiAJdTMyIHZhbDsKQEAgLTQ3MDMsMTAgKzQ3MjcsMTAgQEAKIAogCS8qIEdlbmVyYWwgZGF0YSAqLwogCWRhdGEtPmdlbmVyYWwuY2xpZW50X2lkID0gY2xpOwotCWRhdGEtPmdlbmVyYWwuc3RhdGlzdGljc19lbl9mbGcgPSAxOwotCWRhdGEtPmdlbmVyYWwuc3RhdGlzdGljc19jb3VudGVyX2lkID0gY2xpOwogCWRhdGEtPmdlbmVyYWwuYWN0aXZhdGVfZmxnID0gMTsKIAlkYXRhLT5nZW5lcmFsLnNwX2NsaWVudF9pZCA9IGNsaTsKKwlkYXRhLT5nZW5lcmFsLm10dSA9IGNwdV90b19sZTE2KGNwLT5sMl9zaW5nbGVfYnVmX3NpemUgLSAxNCk7CisJZGF0YS0+Z2VuZXJhbC5mdW5jX2lkID0gY3AtPnBmaWQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQk5YMlhfTUFYX1JYX0RFU0NfQ05UOyBpKyssIHJ4YmQrKykgewogCQlkbWFfYWRkcl90IGJ1Zl9tYXA7CkBAIC00NzQwLDIzICs0NzY0LDEyIEBACiAJZGF0YS0+cnguc3RhdHVzX2Jsb2NrX2lkID0gQk5YMlhfREVGX1NCX0lEOwogCiAJZGF0YS0+cnguY2FjaGVfbGluZV9hbGlnbm1lbnRfbG9nX3NpemUgPSBMMV9DQUNIRV9TSElGVDsKLQlkYXRhLT5yeC5iZF9idWZmX3NpemUgPQljcHVfdG9fbGUxNihjcC0+bDJfc2luZ2xlX2J1Zl9zaXplKTsKIAotCWRhdGEtPnJ4Lm10dSA9IGNwdV90b19sZTE2KGNwLT5sMl9zaW5nbGVfYnVmX3NpemUgLSAxNCk7CisJZGF0YS0+cngubWF4X2J5dGVzX29uX2JkID0gY3B1X3RvX2xlMTYoY3AtPmwyX3NpbmdsZV9idWZfc2l6ZSk7CiAJZGF0YS0+cngub3V0ZXJfdmxhbl9yZW1vdmFsX2VuYWJsZV9mbGcgPSAxOwotCi0JLyogcmVzZXQgdHN0b3JtIGFuZCB1c3Rvcm0gcGVyIGNsaWVudCBzdGF0aXN0aWNzICovCi0JaWYgKGNsaSA8IE1BWF9TVEFUX0NPVU5URVJfSUQpIHsKLQkJdmFsID0gQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkJICAgICAgVFNUT1JNX1BFUl9DT1VOVEVSX0lEX1NUQVRTX09GRlNFVChwb3J0LCBjbGkpOwotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCB0c3Rvcm1fcGVyX2NsaWVudF9zdGF0cykgLyA0OyBpKyspCi0JCQlDTklDX1dSKGRldiwgdmFsICsgaSAqIDQsIDApOwotCi0JCXZhbCA9IEJBUl9VU1RST1JNX0lOVE1FTSArCi0JCSAgICAgIFVTVE9STV9QRVJfQ09VTlRFUl9JRF9TVEFUU19PRkZTRVQocG9ydCwgY2xpKTsKLQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgdXN0b3JtX3Blcl9jbGllbnRfc3RhdHMpIC8gNDsgaSsrKQotCQkJQ05JQ19XUihkZXYsIHZhbCArIGkgKiA0LCAwKTsKLQl9CisJZGF0YS0+cnguc2lsZW50X3ZsYW5fcmVtb3ZhbF9mbGcgPSAxOworCWRhdGEtPnJ4LnNpbGVudF92bGFuX3ZhbHVlID0gMDsKKwlkYXRhLT5yeC5zaWxlbnRfdmxhbl9tYXNrID0gMHhmZmZmOwogCiAJY3AtPnJ4X2NvbnNfcHRyID0KIAkJJnNiLT5zcF9zYi5pbmRleF92YWx1ZXNbSENfU1BfSU5ERVhfRVRIX0lTQ1NJX1JYX0NRX0NPTlNdOwpAQCAtNDc3Miw3ICs0Nzg1LDcgQEAKIAkJCSAgIENTVE9STV9JU0NTSV9FUV9QUk9EX09GRlNFVChwZmlkLCAwKTsKIAljcC0+a2NxMS5zd19wcm9kX2lkeCA9IDA7CiAKLQlpZiAoQk5YMlhfQ0hJUF9JU19FMihjcC0+Y2hpcF9pZCkpIHsKKwlpZiAoQk5YMlhfQ0hJUF9JU19FMl9QTFVTKGNwLT5jaGlwX2lkKSkgewogCQlzdHJ1Y3QgaG9zdF9oY19zdGF0dXNfYmxvY2tfZTIgKnNiID0gY3AtPnN0YXR1c19ibGsuZ2VuOwogCiAJCWNwLT5rY3ExLmh3X3Byb2RfaWR4X3B0ciA9CkBAIC00Nzg4LDcgKzQ4MDEsNyBAQAogCQkJJnNiLT5zYi5ydW5uaW5nX2luZGV4W1NNX1JYX0lEXTsKIAl9CiAKLQlpZiAoQk5YMlhfQ0hJUF9JU19FMihjcC0+Y2hpcF9pZCkpIHsKKwlpZiAoQk5YMlhfQ0hJUF9JU19FMl9QTFVTKGNwLT5jaGlwX2lkKSkgewogCQlzdHJ1Y3QgaG9zdF9oY19zdGF0dXNfYmxvY2tfZTIgKnNiID0gY3AtPnN0YXR1c19ibGsuZ2VuOwogCiAJCWNwLT5rY3EyLmlvX2FkZHIgPSBCQVJfVVNUUk9STV9JTlRNRU0gKwpAQCAtNDgwNSwxMCArNDgxOCwxMiBAQAogewogCXN0cnVjdCBjbmljX2xvY2FsICpjcCA9IGRldi0+Y25pY19wcml2OwogCXN0cnVjdCBjbmljX2V0aF9kZXYgKmV0aGRldiA9IGNwLT5ldGhkZXY7Ci0JaW50IGZ1bmMgPSBDTklDX0ZVTkMoY3ApLCByZXQsIGk7CisJaW50IGZ1bmMgPSBDTklDX0ZVTkMoY3ApLCByZXQ7CiAJdTMyIHBmaWQ7CiAKLQlpZiAoQk5YMlhfQ0hJUF9JU19FMihjcC0+Y2hpcF9pZCkpIHsKKwljcC0+cG9ydF9tb2RlID0gQ0hJUF9QT1JUX01PREVfTk9ORTsKKworCWlmIChCTlgyWF9DSElQX0lTX0UyX1BMVVMoY3AtPmNoaXBfaWQpKSB7CiAJCXUzMiB2YWwgPSBDTklDX1JEKGRldiwgTUlTQ19SRUdfUE9SVDRNT0RFX0VOX09WV1IpOwogCiAJCWlmICghKHZhbCAmIDEpKQpAQCAtNDgxNiwyNSArNDgzMSwyOCBAQAogCQllbHNlCiAJCQl2YWwgPSAodmFsID4+IDEpICYgMTsKIAotCQlpZiAodmFsKQorCQlpZiAodmFsKSB7CisJCQljcC0+cG9ydF9tb2RlID0gQ0hJUF80X1BPUlRfTU9ERTsKIAkJCWNwLT5wZmlkID0gZnVuYyA+PiAxOwotCQllbHNlCisJCX0gZWxzZSB7CisJCQljcC0+cG9ydF9tb2RlID0gQ0hJUF8yX1BPUlRfTU9ERTsKIAkJCWNwLT5wZmlkID0gZnVuYyAmIDB4NjsKKwkJfQogCX0gZWxzZSB7CiAJCWNwLT5wZmlkID0gZnVuYzsKIAl9CiAJcGZpZCA9IGNwLT5wZmlkOwogCiAJcmV0ID0gY25pY19pbml0X2lkX3RibCgmY3AtPmNpZF90YmwsIE1BWF9JU0NTSV9UQkxfU1osCi0JCQkgICAgICAgY3AtPmlzY3NpX3N0YXJ0X2NpZCk7CisJCQkgICAgICAgY3AtPmlzY3NpX3N0YXJ0X2NpZCwgMCk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChCTlgyWF9DSElQX0lTX0UyKGNwLT5jaGlwX2lkKSkgeworCWlmIChCTlgyWF9DSElQX0lTX0UyX1BMVVMoY3AtPmNoaXBfaWQpKSB7CiAJCXJldCA9IGNuaWNfaW5pdF9pZF90YmwoJmNwLT5mY29lX2NpZF90YmwsCiAJCQkJCUJOWDJYX0ZDT0VfTlVNX0NPTk5FQ1RJT05TLAotCQkJCQljcC0+ZmNvZV9zdGFydF9jaWQpOworCQkJCQljcC0+ZmNvZV9zdGFydF9jaWQsIDApOwogCiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTQ4NjgsMTUgKzQ4ODYsNiBAQAogCQlDU1RPUk1fSVNDU0lfRVFfU0JfSU5ERVhfT0ZGU0VUKHBmaWQsIDApLAogCQlIQ19JTkRFWF9JU0NTSV9FUV9DT05TKTsKIAotCWZvciAoaSA9IDA7IGkgPCBjcC0+Y29ubl9idWZfaW5mby5udW1fcGFnZXM7IGkrKykgewotCQlDTklDX1dSKGRldiwgQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkJCVRTVE9STV9JU0NTSV9DT05OX0JVRl9QQkxfT0ZGU0VUKHBmaWQsIGkpLAotCQkJY3AtPmNvbm5fYnVmX2luZm8ucGd0YmxbMiAqIGldKTsKLQkJQ05JQ19XUihkZXYsIEJBUl9UU1RST1JNX0lOVE1FTSArCi0JCQlUU1RPUk1fSVNDU0lfQ09OTl9CVUZfUEJMX09GRlNFVChwZmlkLCBpKSArIDQsCi0JCQljcC0+Y29ubl9idWZfaW5mby5wZ3RibFsoMiAqIGkpICsgMV0pOwotCX0KLQogCUNOSUNfV1IoZGV2LCBCQVJfVVNUUk9STV9JTlRNRU0gKwogCQlVU1RPUk1fSVNDU0lfR0xPQkFMX0JVRl9QSFlTX0FERFJfT0ZGU0VUKHBmaWQpLAogCQljcC0+Z2JsX2J1Zl9pbmZvLnBnX21hcF9hcnJbMF0gJiAweGZmZmZmZmZmKTsKQEAgLTQ5MTUsNyArNDkyNCw3IEBACiAJCXN0cnVjdCBjbGllbnRfaW5pdF9yYW1yb2RfZGF0YSAqZGF0YTsKIAkJdW5pb24gbDVjbV9zcGVjaWZpY19kYXRhIGw1X2RhdGE7CiAJCXN0cnVjdCB1c3Rvcm1fZXRoX3J4X3Byb2R1Y2VycyByeF9wcm9kcyA9IHswfTsKLQkJdTMyIG9mZiwgaTsKKwkJdTMyIG9mZiwgaSwgKmNpZF9wdHI7CiAKIAkJcnhfcHJvZHMuYmRfcHJvZCA9IDA7CiAJCXJ4X3Byb2RzLmNxZV9wcm9kID0gQk5YMlhfTUFYX1JDUV9ERVNDX0NOVDsKQEAgLTQ5MjQsNyArNDkzMyw3IEBACiAJCWNsX3F6b25lX2lkID0gQk5YMlhfQ0xfUVpPTkVfSUQoY3AsIGNsaSk7CiAKIAkJb2ZmID0gQkFSX1VTVFJPUk1fSU5UTUVNICsKLQkJCShCTlgyWF9DSElQX0lTX0UyKGNwLT5jaGlwX2lkKSA/CisJCQkoQk5YMlhfQ0hJUF9JU19FMl9QTFVTKGNwLT5jaGlwX2lkKSA/CiAJCQkgVVNUT1JNX1JYX1BST0RTX0UyX09GRlNFVChjbF9xem9uZV9pZCkgOgogCQkJIFVTVE9STV9SWF9QUk9EU19FMVhfT0ZGU0VUKENOSUNfUE9SVChjcCksIGNsaSkpOwogCkBAIC00OTM0LDYgKzQ5NDMsNyBAQAogCQlzZXRfYml0KENOSUNfTENMX0ZMX0wyX1dBSVQsICZjcC0+Y25pY19sb2NhbF9mbGFncyk7CiAKIAkJZGF0YSA9IHVkZXYtPmwyX2J1ZjsKKwkJY2lkX3B0ciA9IHVkZXYtPmwyX2J1ZiArIDEyOwogCiAJCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKIApAQCAtNDk1OCwxMiArNDk2OCwxNSBAQAogCQkJCSJpU0NTSSBDTElFTlRfU0VUVVAgZGlkIG5vdCBjb21wbGV0ZVxuIik7CiAJCWNuaWNfc3BxX2NvbXBsZXRpb24oZGV2LCBEUlZfQ1RMX1JFVF9MMl9TUFFfQ1JFRElUX0NNRCwgMSk7CiAJCWNuaWNfcmluZ19jdGwoZGV2LCBjaWQsIGNsaSwgMSk7CisJCSpjaWRfcHRyID0gY2lkOwogCX0KIH0KIAogc3RhdGljIHZvaWQgY25pY19zaHV0ZG93bl9yaW5ncyhzdHJ1Y3QgY25pY19kZXYgKmRldikKIHsKIAlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKKwlzdHJ1Y3QgY25pY191aW9fZGV2ICp1ZGV2ID0gY3AtPnVkZXY7CisJdm9pZCAqcnhfcmluZzsKIAogCWlmICghdGVzdF9iaXQoQ05JQ19MQ0xfRkxfUklOR1NfSU5JVEVELCAmY3AtPmNuaWNfbG9jYWxfZmxhZ3MpKQogCQlyZXR1cm47CkBAIC00OTcxLDcgKzQ5ODQsNiBAQAogCWlmICh0ZXN0X2JpdChDTklDX0ZfQk5YMl9DTEFTUywgJmRldi0+ZmxhZ3MpKSB7CiAJCWNuaWNfc2h1dGRvd25fYm54Ml9yeF9yaW5nKGRldik7CiAJfSBlbHNlIGlmICh0ZXN0X2JpdChDTklDX0ZfQk5YMlhfQ0xBU1MsICZkZXYtPmZsYWdzKSkgewotCQlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKIAkJdTMyIGNsaSA9IGNwLT5ldGhkZXYtPmlzY3NpX2wyX2NsaWVudF9pZDsKIAkJdTMyIGNpZCA9IGNwLT5ldGhkZXYtPmlzY3NpX2wyX2NpZDsKIAkJdW5pb24gbDVjbV9zcGVjaWZpY19kYXRhIGw1X2RhdGE7CkBAIC01MDAxLDYgKzUwMTMsOCBAQAogCQltc2xlZXAoMTApOwogCX0KIAljbGVhcl9iaXQoQ05JQ19MQ0xfRkxfUklOR1NfSU5JVEVELCAmY3AtPmNuaWNfbG9jYWxfZmxhZ3MpOworCXJ4X3JpbmcgPSB1ZGV2LT5sMl9yaW5nICsgQkNNX1BBR0VfU0laRTsKKwltZW1zZXQocnhfcmluZywgMCwgQkNNX1BBR0VfU0laRSk7CiB9CiAKIHN0YXRpYyBpbnQgY25pY19yZWdpc3Rlcl9uZXRkZXYoc3RydWN0IGNuaWNfZGV2ICpkZXYpCkBAIC01MjE3LDYgKzUyMzEsOCBAQAogCWNkZXYtPnBjaWRldiA9IHBkZXY7CiAJY3AtPmNoaXBfaWQgPSBldGhkZXYtPmNoaXBfaWQ7CiAKKwljZGV2LT5tYXhfaXNjc2lfY29ubiA9IGV0aGRldi0+bWF4X2lzY3NpX2Nvbm47CisKIAljcC0+Y25pY19vcHMgPSAmY25pY19ibngyX29wczsKIAljcC0+c3RhcnRfaHcgPSBjbmljX3N0YXJ0X2JueDJfaHc7CiAJY3AtPnN0b3BfaHcgPSBjbmljX3N0b3BfYm54Ml9odzsKQEAgLTUyMjgsOCArNTI0NCw2IEBACiAJY3AtPmVuYWJsZV9pbnQgPSBjbmljX2VuYWJsZV9ibngyX2ludDsKIAljcC0+ZGlzYWJsZV9pbnRfc3luYyA9IGNuaWNfZGlzYWJsZV9ibngyX2ludF9zeW5jOwogCWNwLT5jbG9zZV9jb25uID0gY25pY19jbG9zZV9ibngyX2Nvbm47Ci0JY3AtPm5leHRfaWR4ID0gY25pY19ibngyX25leHRfaWR4OwotCWNwLT5od19pZHggPSBjbmljX2JueDJfaHdfaWR4OwogCXJldHVybiBjZGV2OwogCiBjbmljX2VycjoKQEAgLTUyNzQsNyArNTI4OCw3IEBACiAKIAlpZiAoIShldGhkZXYtPmRydl9zdGF0ZSAmIENOSUNfRFJWX1NUQVRFX05PX0lTQ1NJKSkKIAkJY2Rldi0+bWF4X2lzY3NpX2Nvbm4gPSBldGhkZXYtPm1heF9pc2NzaV9jb25uOwotCWlmIChCTlgyWF9DSElQX0lTX0UyKGNwLT5jaGlwX2lkKSAmJgorCWlmIChCTlgyWF9DSElQX0lTX0UyX1BMVVMoY3AtPmNoaXBfaWQpICYmCiAJICAgICEoZXRoZGV2LT5kcnZfc3RhdGUgJiBDTklDX0RSVl9TVEFURV9OT19GQ09FKSkKIAkJY2Rldi0+bWF4X2Zjb2VfY29ubiA9IGV0aGRldi0+bWF4X2Zjb2VfY29ubjsKIApAQCAtNTI5MCwxMyArNTMwNCwxMSBAQAogCWNwLT5zdG9wX2NtID0gY25pY19jbV9zdG9wX2JueDJ4X2h3OwogCWNwLT5lbmFibGVfaW50ID0gY25pY19lbmFibGVfYm54MnhfaW50OwogCWNwLT5kaXNhYmxlX2ludF9zeW5jID0gY25pY19kaXNhYmxlX2JueDJ4X2ludF9zeW5jOwotCWlmIChCTlgyWF9DSElQX0lTX0UyKGNwLT5jaGlwX2lkKSkKKwlpZiAoQk5YMlhfQ0hJUF9JU19FMl9QTFVTKGNwLT5jaGlwX2lkKSkKIAkJY3AtPmFja19pbnQgPSBjbmljX2Fja19ibngyeF9lMl9tc2l4OwogCWVsc2UKIAkJY3AtPmFja19pbnQgPSBjbmljX2Fja19ibngyeF9tc2l4OwogCWNwLT5jbG9zZV9jb25uID0gY25pY19jbG9zZV9ibngyeF9jb25uOwotCWNwLT5uZXh0X2lkeCA9IGNuaWNfYm54MnhfbmV4dF9pZHg7Ci0JY3AtPmh3X2lkeCA9IGNuaWNfYm54MnhfaHdfaWR4OwogCXJldHVybiBjZGV2OwogfQogCkBAIC01MzIyLDYgKzUzMzQsMjcgQEAKIAlyZXR1cm4gY2RldjsKIH0KIAorc3RhdGljIHZvaWQgY25pY19yY3ZfbmV0ZXZlbnQoc3RydWN0IGNuaWNfbG9jYWwgKmNwLCB1bnNpZ25lZCBsb25nIGV2ZW50LAorCQkJICAgICAgdTE2IHZsYW5faWQpCit7CisJaW50IGlmX3R5cGU7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZm9yIChpZl90eXBlID0gMDsgaWZfdHlwZSA8IE1BWF9DTklDX1VMUF9UWVBFOyBpZl90eXBlKyspIHsKKwkJc3RydWN0IGNuaWNfdWxwX29wcyAqdWxwX29wczsKKwkJdm9pZCAqY3R4OworCisJCXVscF9vcHMgPSByY3VfZGVyZWZlcmVuY2UoY3AtPnVscF9vcHNbaWZfdHlwZV0pOworCQlpZiAoIXVscF9vcHMgfHwgIXVscF9vcHMtPmluZGljYXRlX25ldGV2ZW50KQorCQkJY29udGludWU7CisKKwkJY3R4ID0gY3AtPnVscF9oYW5kbGVbaWZfdHlwZV07CisKKwkJdWxwX29wcy0+aW5kaWNhdGVfbmV0ZXZlbnQoY3R4LCBldmVudCwgdmxhbl9pZCk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCiAvKioKICAqIG5ldGRldiBldmVudCBoYW5kbGVyCiAgKi8KQEAgLTUzMzAsMTIgKzUzNjMsMTEgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHRyOwogCXN0cnVjdCBjbmljX2RldiAqZGV2OwotCWludCBpZl90eXBlOwogCWludCBuZXdfZGV2ID0gMDsKIAogCWRldiA9IGNuaWNfZnJvbV9uZXRkZXYobmV0ZGV2KTsKIAotCWlmICghZGV2ICYmIChldmVudCA9PSBORVRERVZfUkVHSVNURVIgfHwgZXZlbnQgPT0gTkVUREVWX1VQKSkgeworCWlmICghZGV2ICYmIChldmVudCA9PSBORVRERVZfUkVHSVNURVIgfHwgbmV0aWZfcnVubmluZyhuZXRkZXYpKSkgewogCQkvKiBDaGVjayBmb3IgdGhlIGhvdC1wbHVnIGRldmljZSAqLwogCQlkZXYgPSBpc19jbmljX2RldihuZXRkZXYpOwogCQlpZiAoZGV2KSB7CkBAIC01MzUxLDcgKzUzODMsNyBAQAogCQllbHNlIGlmIChldmVudCA9PSBORVRERVZfVU5SRUdJU1RFUikKIAkJCWNuaWNfdWxwX2V4aXQoZGV2KTsKIAotCQlpZiAoZXZlbnQgPT0gTkVUREVWX1VQKSB7CisJCWlmIChldmVudCA9PSBORVRERVZfVVAgfHwgKG5ld19kZXYgJiYgbmV0aWZfcnVubmluZyhuZXRkZXYpKSkgewogCQkJaWYgKGNuaWNfcmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgewogCQkJCWNuaWNfcHV0KGRldik7CiAJCQkJZ290byBkb25lOwpAQCAtNTM2MCwyMCArNTM5Miw3IEBACiAJCQkJY25pY191bHBfc3RhcnQoZGV2KTsKIAkJfQogCi0JCXJjdV9yZWFkX2xvY2soKTsKLQkJZm9yIChpZl90eXBlID0gMDsgaWZfdHlwZSA8IE1BWF9DTklDX1VMUF9UWVBFOyBpZl90eXBlKyspIHsKLQkJCXN0cnVjdCBjbmljX3VscF9vcHMgKnVscF9vcHM7Ci0JCQl2b2lkICpjdHg7Ci0KLQkJCXVscF9vcHMgPSByY3VfZGVyZWZlcmVuY2UoY3AtPnVscF9vcHNbaWZfdHlwZV0pOwotCQkJaWYgKCF1bHBfb3BzIHx8ICF1bHBfb3BzLT5pbmRpY2F0ZV9uZXRldmVudCkKLQkJCQljb250aW51ZTsKLQotCQkJY3R4ID0gY3AtPnVscF9oYW5kbGVbaWZfdHlwZV07Ci0KLQkJCXVscF9vcHMtPmluZGljYXRlX25ldGV2ZW50KGN0eCwgZXZlbnQpOwotCQl9Ci0JCXJjdV9yZWFkX3VubG9jaygpOworCQljbmljX3Jjdl9uZXRldmVudChjcCwgZXZlbnQsIDApOwogCiAJCWlmIChldmVudCA9PSBORVRERVZfR09JTkdfRE9XTikgewogCQkJY25pY191bHBfc3RvcChkZXYpOwpAQCAtNTM4OSw2ICs1NDA4LDE5IEBACiAJCQlnb3RvIGRvbmU7CiAJCX0KIAkJY25pY19wdXQoZGV2KTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbGRldjsKKwkJdTE2IHZpZDsKKworCQl2aWQgPSBjbmljX2dldF92bGFuKG5ldGRldiwgJnJlYWxkZXYpOworCQlpZiAocmVhbGRldikgeworCQkJZGV2ID0gY25pY19mcm9tX25ldGRldihyZWFsZGV2KTsKKwkJCWlmIChkZXYpIHsKKwkJCQl2aWQgfD0gVkxBTl9UQUdfUFJFU0VOVDsKKwkJCQljbmljX3Jjdl9uZXRldmVudChkZXYtPmNuaWNfcHJpdiwgZXZlbnQsIHZpZCk7CisJCQkJY25pY19wdXQoZGV2KTsKKwkJCX0KKwkJfQogCX0KIGRvbmU6CiAJcmV0dXJuIE5PVElGWV9ET05FOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY25pYy5oIGIvZHJpdmVycy9uZXQvY25pYy5oCmluZGV4IDMzNjdhNmQzLi43YTI5MjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jbmljLmgKKysrIGIvZHJpdmVycy9uZXQvY25pYy5oCkBAIC0xLDYgKzEsNiBAQAogLyogY25pYy5oOiBCcm9hZGNvbSBDTklDIGNvcmUgbmV0d29yayBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC02OCwxMSArNjgsNiBAQAogI2RlZmluZSBCTlgyX1BHX0NUWF9NQVAJCQkweDFhMDAzNAogI2RlZmluZSBCTlgyX0lTQ1NJX0NUWF9NQVAJCTB4MWEwMDc0CiAKLXN0cnVjdCBjbmljX3JlZGlyZWN0X2VudHJ5IHsKLQlzdHJ1Y3QgZHN0X2VudHJ5ICpvbGRfZHN0OwotCXN0cnVjdCBkc3RfZW50cnkgKm5ld19kc3Q7Ci19OwotCiAjZGVmaW5lIE1BWF9DT01QTEVURURfS0NRRQk2NAogCiAjZGVmaW5lIE1BWF9DTklDX0w1X0NPTlRFWFQJMjU2CkBAIC0xNzEsNiArMTY2LDcgQEAKIAl1bnNpZ25lZCBsb25nCQljdHhfZmxhZ3M7CiAjZGVmaW5lCUNUWF9GTF9PRkZMRF9TVEFSVAkwCiAjZGVmaW5lCUNUWF9GTF9ERUxFVEVfV0FJVAkxCisjZGVmaW5lCUNUWF9GTF9DSURfRVJST1IJMgogCXU4CQkJdWxwX3Byb3RvX2lkOwogCXVuaW9uIHsKIAkJc3RydWN0IGNuaWNfaXNjc2kJKmlzY3NpOwpAQCAtMTg1LDYgKzE4MSw5IEBACiAJdTE2CQlzd19wcm9kX2lkeDsKIAl1MTYJCSpzdGF0dXNfaWR4X3B0cjsKIAl1MzIJCWlvX2FkZHI7CisKKwl1MTYJCSgqbmV4dF9pZHgpKHUxNik7CisJdTE2CQkoKmh3X2lkeCkodTE2KTsKIH07CiAKIHN0cnVjdCBpcm8gewpAQCAtMjQyLDcgKzI0MSw3IEBACiAJdTE2CQlyeF9jb25zOwogCXUxNgkJdHhfY29uczsKIAotCXN0cnVjdCBpcm8JCSppcm9fYXJyOworCWNvbnN0IHN0cnVjdCBpcm8JKmlyb19hcnI7CiAjZGVmaW5lIElSTyAoKChzdHJ1Y3QgY25pY19sb2NhbCAqKSBkZXYtPmNuaWNfcHJpdiktPmlyb19hcnIpCiAKIAlzdHJ1Y3QgY25pY19kbWEJCWt3cV9pbmZvOwpAQCAtMjgzLDcgKzI4Miw2IEBACiAJc3RydWN0IGNuaWNfc29jawkqY3NrX3RibDsKIAlzdHJ1Y3QgY25pY19pZF90YmwJY3NrX3BvcnRfdGJsOwogCi0Jc3RydWN0IGNuaWNfZG1hCQljb25uX2J1Zl9pbmZvOwogCXN0cnVjdCBjbmljX2RtYQkJZ2JsX2J1Zl9pbmZvOwogCiAJc3RydWN0IGNuaWNfaXNjc2kJKmlzY3NpX3RibDsKQEAgLTMxNyw2ICszMTUsMTEgQEAKIAl1MzIJCQljaGlwX2lkOwogCWludAkJCWZ1bmM7CiAJdTMyCQkJcGZpZDsKKwl1OAkJCXBvcnRfbW9kZTsKKyNkZWZpbmUgQ0hJUF80X1BPUlRfTU9ERQkwCisjZGVmaW5lIENISVBfMl9QT1JUX01PREUJMQorI2RlZmluZSBDSElQX1BPUlRfTU9ERV9OT05FCTIKKwogCXUzMgkJCXNobWVtX2Jhc2U7CiAKIAlzdHJ1Y3QgY25pY19vcHMJCSpjbmljX29wczsKQEAgLTMzMiw4ICszMzUsNiBAQAogCXZvaWQJCQkoKmRpc2FibGVfaW50X3N5bmMpKHN0cnVjdCBjbmljX2RldiAqKTsKIAl2b2lkCQkJKCphY2tfaW50KShzdHJ1Y3QgY25pY19kZXYgKik7CiAJdm9pZAkJCSgqY2xvc2VfY29ubikoc3RydWN0IGNuaWNfc29jayAqLCB1MzIgb3Bjb2RlKTsKLQl1MTYJCQkoKm5leHRfaWR4KSh1MTYpOwotCXUxNgkJCSgqaHdfaWR4KSh1MTYpOwogfTsKIAogc3RydWN0IGJueDJ4X2JkX2NoYWluX25leHQgewpAQCAtMzY4LDcgKzM2OSw2IEBACiAjZGVmaW5lIEJOWDJYX0lTQ1NJX01BWF9QRU5ESU5HX1IyVFMJNAogI2RlZmluZSBCTlgyWF9JU0NTSV9SMlRRRV9TSVpFCQk4CiAjZGVmaW5lIEJOWDJYX0lTQ1NJX0hRX0JEX1NJWkUJCTY0Ci0jZGVmaW5lIEJOWDJYX0lTQ1NJX0NPTk5fQlVGX1NJWkUJNjQKICNkZWZpbmUgQk5YMlhfSVNDU0lfR0xCX0JVRl9TSVpFCTY0CiAjZGVmaW5lIEJOWDJYX0lTQ1NJX1BCTF9OT1RfQ0FDSEVECTB4ZmYKICNkZWZpbmUgQk5YMlhfSVNDU0lfUERVX0hFQURFUl9OT1RfQ0FDSEVECTB4ZmYKQEAgLTM4NCw2ICszODQsOSBAQAogI2RlZmluZSBCTlgyWF9DSElQX05VTV81NzcxMkUJCTB4MTY2MwogI2RlZmluZSBCTlgyWF9DSElQX05VTV81NzcxMwkJMHgxNjUxCiAjZGVmaW5lIEJOWDJYX0NISVBfTlVNXzU3NzEzRQkJMHgxNjUyCisjZGVmaW5lIEJOWDJYX0NISVBfTlVNXzU3ODAwCQkweDE2OGEKKyNkZWZpbmUgQk5YMlhfQ0hJUF9OVU1fNTc4MTAJCTB4MTY4ZQorI2RlZmluZSBCTlgyWF9DSElQX05VTV81Nzg0MAkJMHgxNjhkCiAKICNkZWZpbmUgQk5YMlhfQ0hJUF9OVU0oeCkJCSh4ID4+IDE2KQogI2RlZmluZSBCTlgyWF9DSElQX0lTXzU3NzEwKHgpCQlcCkBAIC00MDIsOSArNDA1LDE5IEBACiAJKEJOWDJYX0NISVBfTlVNKHgpID09IEJOWDJYX0NISVBfTlVNXzU3NzEzKQogI2RlZmluZSBCTlgyWF9DSElQX0lTXzU3NzEzRSh4KQkJXAogCShCTlgyWF9DSElQX05VTSh4KSA9PSBCTlgyWF9DSElQX05VTV81NzcxM0UpCisjZGVmaW5lIEJOWDJYX0NISVBfSVNfNTc4MDAoeCkJCVwKKwkoQk5YMlhfQ0hJUF9OVU0oeCkgPT0gQk5YMlhfQ0hJUF9OVU1fNTc4MDApCisjZGVmaW5lIEJOWDJYX0NISVBfSVNfNTc4MTAoeCkJCVwKKwkoQk5YMlhfQ0hJUF9OVU0oeCkgPT0gQk5YMlhfQ0hJUF9OVU1fNTc4MTApCisjZGVmaW5lIEJOWDJYX0NISVBfSVNfNTc4NDAoeCkJCVwKKwkoQk5YMlhfQ0hJUF9OVU0oeCkgPT0gQk5YMlhfQ0hJUF9OVU1fNTc4NDApCiAjZGVmaW5lIEJOWDJYX0NISVBfSVNfRTIoeCkJCVwKIAkoQk5YMlhfQ0hJUF9JU181NzcxMih4KSB8fCBCTlgyWF9DSElQX0lTXzU3NzEyRSh4KSB8fCBcCiAJIEJOWDJYX0NISVBfSVNfNTc3MTMoeCkgfHwgQk5YMlhfQ0hJUF9JU181NzcxM0UoeCkpCisjZGVmaW5lIEJOWDJYX0NISVBfSVNfRTMoeCkJCQlcCisJKEJOWDJYX0NISVBfSVNfNTc4MDAoeCkgfHwgQk5YMlhfQ0hJUF9JU181NzgxMCh4KSB8fCBcCisJIEJOWDJYX0NISVBfSVNfNTc4NDAoeCkpCisjZGVmaW5lIEJOWDJYX0NISVBfSVNfRTJfUExVUyh4KSAoQk5YMlhfQ0hJUF9JU19FMih4KSB8fCBCTlgyWF9DSElQX0lTX0UzKHgpKQogCiAjZGVmaW5lIElTX0UxSF9PRkZTRVQgICAgICAgCQlCTlgyWF9DSElQX0lTX0UxSChjcC0+Y2hpcF9pZCkKIApAQCAtNDQxLDggKzQ1NCw4IEBACiAKICNkZWZpbmUgQ05JQ19QT1JUKGNwKQkJCSgoY3ApLT5wZmlkICYgMSkKICNkZWZpbmUgQ05JQ19GVU5DKGNwKQkJCSgoY3ApLT5mdW5jKQotI2RlZmluZSBDTklDX1BBVEgoY3ApCQkJKCFCTlgyWF9DSElQX0lTX0UyKGNwLT5jaGlwX2lkKSA/IDAgOlwKLQkJCQkJIChDTklDX0ZVTkMoY3ApICYgMSkpCisjZGVmaW5lIENOSUNfUEFUSChjcCkJCQkoIUJOWDJYX0NISVBfSVNfRTJfUExVUyhjcC0+Y2hpcF9pZCkgPyBcCisJCQkJCSAwIDogKENOSUNfRlVOQyhjcCkgJiAxKSkKICNkZWZpbmUgQ05JQ19FMUhWTihjcCkJCQkoKGNwKS0+cGZpZCA+PiAxKQogCiAjZGVmaW5lIEJOWDJYX0hXX0NJRChjcCwgeCkJCSgoQ05JQ19QT1JUKGNwKSA8PCAyMykgfCBcCkBAIC00NTEsMTAgKzQ2NCwxNSBAQAogI2RlZmluZSBCTlgyWF9TV19DSUQoeCkJCQkoeCAmIDB4MWZmZmYpCiAKICNkZWZpbmUgQk5YMlhfQ0xfUVpPTkVfSUQoY3AsIGNsaSkJCQkJCVwKLQkJKGNsaSArIChDTklDX1BPUlQoY3ApICogKEJOWDJYX0NISVBfSVNfRTIoY3AtPmNoaXBfaWQpID9cCi0JCQkJCUVUSF9NQVhfUlhfQ0xJRU5UU19FMiA6CQlcCi0JCQkJCUVUSF9NQVhfUlhfQ0xJRU5UU19FMUgpKSkKKwkJKEJOWDJYX0NISVBfSVNfRTJfUExVUyhjcC0+Y2hpcF9pZCkgPyBjbGkgOgkJXAorCQkgY2xpICsgKENOSUNfUE9SVChjcCkgKiBFVEhfTUFYX1JYX0NMSUVOVFNfRTFIKSkKIAotI2RlZmluZSBUQ1BfVFNUT1JNX09PT19EUk9QX0FORF9QUk9DX0FDSwkoMDw8NCkKKyNpZm5kZWYgTUFYX1NUQVRfQ09VTlRFUl9JRAorI2RlZmluZSBNQVhfU1RBVF9DT1VOVEVSX0lECQkJCQkJXAorCShCTlgyWF9DSElQX0lTX0UxSCgoY3ApLT5jaGlwX2lkKSA/IE1BWF9TVEFUX0NPVU5URVJfSURfRTFIIDoJXAorCSAoKEJOWDJYX0NISVBfSVNfRTJfUExVUygoY3ApLT5jaGlwX2lkKSkgPyBNQVhfU1RBVF9DT1VOVEVSX0lEX0UyIDpcCisJICBNQVhfU1RBVF9DT1VOVEVSX0lEX0UxKSkKKyNlbmRpZgorCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY25pY19kZWZzLmggYi9kcml2ZXJzL25ldC9jbmljX2RlZnMuaAppbmRleCBmZGJjMDA0Li5lNDdkMjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jbmljX2RlZnMuaAorKysgYi9kcml2ZXJzL25ldC9jbmljX2RlZnMuaApAQCAtMSw3ICsxLDcgQEAKIAogLyogY25pYy5jOiBCcm9hZGNvbSBDTklDIGNvcmUgbmV0d29yayBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IEJyb2FkY29tIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC00NSwxMyArNDUsMTMgQEAKICNkZWZpbmUgRkNPRV9LQ1FFX09QQ09ERV9DUV9FVkVOVF9OT1RJRklDQVRJT04gICgweDIwKQogI2RlZmluZSBGQ09FX0tDUUVfT1BDT0RFX0ZDT0VfRVJST1IJCQkJKDB4MjEpCiAKLSNkZWZpbmUgRkNPRV9SQU1ST0RfQ01EX0lEX0lOSVQJCQkoRkNPRV9LQ1FFX09QQ09ERV9JTklUX0ZVTkMpCi0jZGVmaW5lIEZDT0VfUkFNUk9EX0NNRF9JRF9ERVNUUk9ZCQkoRkNPRV9LQ1FFX09QQ09ERV9ERVNUUk9ZX0ZVTkMpCisjZGVmaW5lIEZDT0VfUkFNUk9EX0NNRF9JRF9JTklUX0ZVTkMJCShGQ09FX0tDUUVfT1BDT0RFX0lOSVRfRlVOQykKKyNkZWZpbmUgRkNPRV9SQU1ST0RfQ01EX0lEX0RFU1RST1lfRlVOQwkJKEZDT0VfS0NRRV9PUENPREVfREVTVFJPWV9GVU5DKQorI2RlZmluZSBGQ09FX1JBTVJPRF9DTURfSURfU1RBVF9GVU5DCQkoRkNPRV9LQ1FFX09QQ09ERV9TVEFUX0ZVTkMpCiAjZGVmaW5lIEZDT0VfUkFNUk9EX0NNRF9JRF9PRkZMT0FEX0NPTk4JCShGQ09FX0tDUUVfT1BDT0RFX09GRkxPQURfQ09OTikKICNkZWZpbmUgRkNPRV9SQU1ST0RfQ01EX0lEX0VOQUJMRV9DT05OCQkoRkNPRV9LQ1FFX09QQ09ERV9FTkFCTEVfQ09OTikKICNkZWZpbmUgRkNPRV9SQU1ST0RfQ01EX0lEX0RJU0FCTEVfQ09OTgkJKEZDT0VfS0NRRV9PUENPREVfRElTQUJMRV9DT05OKQogI2RlZmluZSBGQ09FX1JBTVJPRF9DTURfSURfREVTVFJPWV9DT05OCQkoRkNPRV9LQ1FFX09QQ09ERV9ERVNUUk9ZX0NPTk4pCi0jZGVmaW5lIEZDT0VfUkFNUk9EX0NNRF9JRF9TVEFUCQkJKEZDT0VfS0NRRV9PUENPREVfU1RBVF9GVU5DKQogI2RlZmluZSBGQ09FX1JBTVJPRF9DTURfSURfVEVSTUlOQVRFX0NPTk4JKDB4ODEpCiAKICNkZWZpbmUgRkNPRV9LV1FFX09QQ09ERV9JTklUMSAgICAgICAgICAgICAgICAgICgwKQpAQCAtNjQxLDIwICs2NDEsMjAgQEAKICNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9SRVNFUlZFRF9VTFBfUlhfU0VfQ0ZfRU5fU0hJRlQgMTIKICNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9SRVNFUlZFRF9VTFBfUlhfSU5WX0NGX0VOICgweDE8PDEzKQogI2RlZmluZSBfX0NTVE9STV9JU0NTSV9BR19DT05URVhUX1JFU0VSVkVEX1VMUF9SWF9JTlZfQ0ZfRU5fU0hJRlQgMTMKLSNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9QRU5ESU5HX0NPTVBMRVRJT04zX0NGICgweDM8PDE0KQotI2RlZmluZSBfX0NTVE9STV9JU0NTSV9BR19DT05URVhUX1BFTkRJTkdfQ09NUExFVElPTjNfQ0ZfU0hJRlQgMTQKKyNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg0X0NGICgweDM8PDE0KQorI2RlZmluZSBfX0NTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDRfQ0ZfU0hJRlQgMTQKICNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9SRVNFUlZFRDY2ICgweDM8PDE2KQogI2RlZmluZSBfX0NTVE9STV9JU0NTSV9BR19DT05URVhUX1JFU0VSVkVENjZfU0hJRlQgMTYKICNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9GSU5fUkVDRUlWRURfQ0ZfRU4gKDB4MTw8MTgpCiAjZGVmaW5lIF9fQ1NUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRklOX1JFQ0VJVkVEX0NGX0VOX1NISUZUIDE4Ci0jZGVmaW5lIF9fQ1NUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUEVORElOR19DT01QTEVUSU9OMF9DRl9FTiAoMHgxPDwxOSkKLSNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9QRU5ESU5HX0NPTVBMRVRJT04wX0NGX0VOX1NISUZUIDE5Ci0jZGVmaW5lIF9fQ1NUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUEVORElOR19DT01QTEVUSU9OMV9DRl9FTiAoMHgxPDwyMCkKLSNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9QRU5ESU5HX0NPTVBMRVRJT04xX0NGX0VOX1NISUZUIDIwCi0jZGVmaW5lIF9fQ1NUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUEVORElOR19DT01QTEVUSU9OMl9DRl9FTiAoMHgxPDwyMSkKLSNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9QRU5ESU5HX0NPTVBMRVRJT04yX0NGX0VOX1NISUZUIDIxCi0jZGVmaW5lIF9fQ1NUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUEVORElOR19DT01QTEVUSU9OM19DRl9FTiAoMHgxPDwyMikKLSNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9QRU5ESU5HX0NPTVBMRVRJT04zX0NGX0VOX1NISUZUIDIyCisjZGVmaW5lIF9fQ1NUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYMV9DRl9FTiAoMHgxPDwxOSkKKyNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVgxX0NGX0VOX1NISUZUIDE5CisjZGVmaW5lIF9fQ1NUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYMl9DRl9FTiAoMHgxPDwyMCkKKyNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVgyX0NGX0VOX1NISUZUIDIwCisjZGVmaW5lIF9fQ1NUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYM19DRl9FTiAoMHgxPDwyMSkKKyNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVgzX0NGX0VOX1NISUZUIDIxCisjZGVmaW5lIF9fQ1NUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYNF9DRl9FTiAoMHgxPDwyMikKKyNkZWZpbmUgX19DU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg0X0NGX0VOX1NISUZUIDIyCiAjZGVmaW5lIF9fQ1NUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUkVMX1NFUV9SVUxFICgweDc8PDIzKQogI2RlZmluZSBfX0NTVE9STV9JU0NTSV9BR19DT05URVhUX1JFTF9TRVFfUlVMRV9TSElGVCAyMwogI2RlZmluZSBDU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9IUV9QUk9EX1JVTEUgKDB4Mzw8MjYpCkBAIC02OTQsNTc0ICs2OTQsNjY4IEBACiAjZW5kaWYKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKIAl1MTYgX19yZXNlcnZlZDY0OwotCXUxNiBfX2NxX3VfcHJvZDA7CisJdTE2IGNxX3VfcHJvZDsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBfX2NxX3VfcHJvZDA7CisJdTE2IGNxX3VfcHJvZDsKIAl1MTYgX19yZXNlcnZlZDY0OwogI2VuZGlmCiAJdTMyIF9fY3FfdV9wcm9kMTsKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKIAl1MTYgX19hZ2dfdmFyczM7Ci0JdTE2IF9fY3FfdV9wcm9kMjsKKwl1MTYgY3FfdV9wZW5kOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IF9fY3FfdV9wcm9kMjsKKwl1MTYgY3FfdV9wZW5kOwogCXUxNiBfX2FnZ192YXJzMzsKICNlbmRpZgogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQogCXUxNiBfX2F1eDJfdGg7Ci0JdTE2IF9fY3FfdV9wcm9kMzsKKwl1MTYgYXV4Ml92YWw7CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgX19jcV91X3Byb2QzOworCXUxNiBhdXgyX3ZhbDsKIAl1MTYgX19hdXgyX3RoOwogI2VuZGlmCiB9OwogCiAvKgotICogUGFyYW1ldGVycyBpbml0aWFsaXplZCBkdXJpbmcgb2ZmbG9hZGVkIGFjY29yZGluZyB0byBGTE9HSS9QTE9HSS9QUkxJIGFuZCB1c2VkIGluIEZDb0UgY29udGV4dCBzZWN0aW9uCisgKiBUaGUgZmNvZSBleHRyYSBhZ2dyZWdhdGl2ZSBjb250ZXh0IHNlY3Rpb24gb2YgVHN0b3JtCiAgKi8KLXN0cnVjdCB1c3Rvcm1fZmNvZV9wYXJhbXMgeworc3RydWN0IHRzdG9ybV9mY29lX2V4dHJhX2FnX2NvbnRleHRfc2VjdGlvbiB7CisJdTMyIF9fYWdnX3ZhbDE7CiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IGZjb2VfY29ubl9pZDsKLQl1MTYgZmxhZ3M7Ci0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX01VTF9OX1BPUlRfSURTICgweDE8PDApCi0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX01VTF9OX1BPUlRfSURTX1NISUZUIDAKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfRV9EX1RPVl9SRVMgKDB4MTw8MSkKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfRV9EX1RPVl9SRVNfU0hJRlQgMQotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9DT05UX0lOQ1JfU0VRX0NOVCAoMHgxPDwyKQotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9DT05UX0lOQ1JfU0VRX0NOVF9TSElGVCAyCi0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0NPTkZfUkVRICgweDE8PDMpCi0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0NPTkZfUkVRX1NISUZUIDMKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfUkVDX1ZBTElEICgweDE8PDQpCi0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX1JFQ19WQUxJRF9TSElGVCA0Ci0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0NRX1RPR0dMRV9CSVQgKDB4MTw8NSkKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfQ1FfVE9HR0xFX0JJVF9TSElGVCA1Ci0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX1hGUlFfVE9HR0xFX0JJVCAoMHgxPDw2KQotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9YRlJRX1RPR0dMRV9CSVRfU0hJRlQgNgotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9DMl9WQUxJRCAoMHgxPDw3KQotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9DMl9WQUxJRF9TSElGVCA3Ci0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0FDS18wICgweDE8PDgpCi0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0FDS18wX1NISUZUIDgKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX1JTUlYwICgweDdGPDw5KQotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfUlNSVjBfU0hJRlQgOQorCXU4IF9fdGNwX2FnZ192YXJzMjsKKwl1OCBfX2FnZ192YWwzOworCXUxNiBfX2FnZ192YWwyOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGZsYWdzOwotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9NVUxfTl9QT1JUX0lEUyAoMHgxPDwwKQotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9NVUxfTl9QT1JUX0lEU19TSElGVCAwCi0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0VfRF9UT1ZfUkVTICgweDE8PDEpCi0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0VfRF9UT1ZfUkVTX1NISUZUIDEKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfQ09OVF9JTkNSX1NFUV9DTlQgKDB4MTw8MikKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfQ09OVF9JTkNSX1NFUV9DTlRfU0hJRlQgMgotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9DT05GX1JFUSAoMHgxPDwzKQotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9DT05GX1JFUV9TSElGVCAzCi0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX1JFQ19WQUxJRCAoMHgxPDw0KQotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9SRUNfVkFMSURfU0hJRlQgNAotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9DUV9UT0dHTEVfQklUICgweDE8PDUpCi0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0NRX1RPR0dMRV9CSVRfU0hJRlQgNQotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9YRlJRX1RPR0dMRV9CSVQgKDB4MTw8NikKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfWEZSUV9UT0dHTEVfQklUX1NISUZUIDYKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfQzJfVkFMSUQgKDB4MTw8NykKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfQzJfVkFMSURfU0hJRlQgNwotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9BQ0tfMCAoMHgxPDw4KQotI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9BQ0tfMF9TSElGVCA4Ci0jZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19SU1JWMCAoMHg3Rjw8OSkKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX1JTUlYwX1NISUZUIDkKLQl1MTYgZmNvZV9jb25uX2lkOworCXUxNiBfX2FnZ192YWwyOworCXU4IF9fYWdnX3ZhbDM7CisJdTggX190Y3BfYWdnX3ZhcnMyOwogI2VuZGlmCiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggaGNfY3NkbV9ieXRlX2VuOwotCXU4IGZ1bmNfaWQ7Ci0JdTggcG9ydF9pZDsKLQl1OCB2bmljX2lkOworCXUxNiBfX2FnZ192YWw1OworCXU4IF9fYWdnX3ZhbDY7CisJdTggX190Y3BfYWdnX3ZhcnMzOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggdm5pY19pZDsKLQl1OCBwb3J0X2lkOwotCXU4IGZ1bmNfaWQ7Ci0JdTggaGNfY3NkbV9ieXRlX2VuOworCXU4IF9fdGNwX2FnZ192YXJzMzsKKwl1OCBfX2FnZ192YWw2OworCXUxNiBfX2FnZ192YWw1OwogI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJ4X3RvdGFsX2NvbmNfc2VxczsKLQl1MTYgcnhfbWF4X2ZjX3BheV9sZW47Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcnhfbWF4X2ZjX3BheV9sZW47Ci0JdTE2IHJ4X3RvdGFsX2NvbmNfc2VxczsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBveF9pZDsKLQl1MTYgcnhfbWF4X2NvbmNfc2VxczsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiByeF9tYXhfY29uY19zZXFzOwotCXUxNiBveF9pZDsKLSNlbmRpZgorCXUzMiBfX2xjcV9wcm9kOworCXUzMiBydHRfc2VxOworCXUzMiBydHRfdGltZTsKKwl1MzIgX19yZXNlcnZlZDY2OworCXUzMiB3bmRfcmlnaHRfZWRnZTsKKwl1MzIgdGNwX2FnZ192YXJzMTsKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0ZJTl9TRU5UX0ZMQUcgKDB4MTw8MCkKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0ZJTl9TRU5UX0ZMQUdfU0hJRlQgMAorI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fTEFTVF9QQUNLRVRfRklOX0ZMQUcgKDB4MTw8MSkKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0xBU1RfUEFDS0VUX0ZJTl9GTEFHX1NISUZUIDEKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1dORF9VUERfQ0YgKDB4Mzw8MikKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1dORF9VUERfQ0ZfU0hJRlQgMgorI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fVElNRU9VVF9DRiAoMHgzPDw0KQorI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fVElNRU9VVF9DRl9TSElGVCA0CisjZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9XTkRfVVBEX0NGX0VOICgweDE8PDYpCisjZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9XTkRfVVBEX0NGX0VOX1NISUZUIDYKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1RJTUVPVVRfQ0ZfRU4gKDB4MTw8NykKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1RJTUVPVVRfQ0ZfRU5fU0hJRlQgNworI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVUUkFOU01JVF9TRVFfRU4gKDB4MTw8OCkKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1JFVFJBTlNNSVRfU0VRX0VOX1NISUZUIDgKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fTENRX1NORF9FTiAoMHgxPDw5KQorI2RlZmluZSBfX1RTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9MQ1FfU05EX0VOX1NISUZUIDkKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDFfRkxBRyAoMHgxPDwxMCkKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDFfRkxBR19TSElGVCAxMAorI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMl9GTEFHICgweDE8PDExKQorI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMl9GTEFHX1NISUZUIDExCisjZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0NGX0VOICgweDE8PDEyKQorI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMV9DRl9FTl9TSElGVCAxMgorI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMl9DRl9FTiAoMHgxPDwxMykKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfQ0ZfRU5fU0hJRlQgMTMKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDFfQ0YgKDB4Mzw8MTQpCisjZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0NGX1NISUZUIDE0CisjZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgyX0NGICgweDM8PDE2KQorI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMl9DRl9TSElGVCAxNgorI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fVFhfQkxPQ0tFRCAoMHgxPDwxOCkKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1RYX0JMT0NLRURfU0hJRlQgMTgKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMTBfQ0ZfRU4gKDB4MTw8MTkpCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDEwX0NGX0VOX1NISUZUIDE5CisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDExX0NGX0VOICgweDE8PDIwKQorI2RlZmluZSBfX1RTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxMV9DRl9FTl9TSElGVCAyMAorI2RlZmluZSBfX1RTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxMl9DRl9FTiAoMHgxPDwyMSkKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMTJfQ0ZfRU5fU0hJRlQgMjEKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRUQxICgweDM8PDIyKQorI2RlZmluZSBfX1RTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9SRVNFUlZFRDFfU0hJRlQgMjIKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1JFVFJBTlNNSVRfUEVORF9TRVEgKDB4Rjw8MjQpCisjZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9SRVRSQU5TTUlUX1BFTkRfU0VRX1NISUZUIDI0CisjZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9SRVRSQU5TTUlUX0RPTkVfU0VRICgweEY8PDI4KQorI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVUUkFOU01JVF9ET05FX1NFUV9TSElGVCAyOAorCXUzMiBzbmRfbWF4OworCXUzMiBfX2xjcV9jb25zOworCXUzMiBfX3Jlc2VydmVkMjsKIH07CiAKIC8qCi0gKiBGQ29FIDE2LWJpdHMgaW5kZXggc3RydWN0dXJlCisgKiBUaGUgZmNvZSBhZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIFRzdG9ybQogICovCi1zdHJ1Y3QgZmNvZV9pZHgxNl9maWVsZHMgewotCXUxNiBmaWVsZHM7Ci0jZGVmaW5lIEZDT0VfSURYMTZfRklFTERTX0lEWCAoMHg3RkZGPDwwKQotI2RlZmluZSBGQ09FX0lEWDE2X0ZJRUxEU19JRFhfU0hJRlQgMAotI2RlZmluZSBGQ09FX0lEWDE2X0ZJRUxEU19NU0IgKDB4MTw8MTUpCi0jZGVmaW5lIEZDT0VfSURYMTZfRklFTERTX01TQl9TSElGVCAxNQorc3RydWN0IHRzdG9ybV9mY29lX2FnX2NvbnRleHQgeworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiB1bHBfY3JlZGl0OworCXU4IGFnZ192YXJzMTsKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0wICgweDE8PDApCisjZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMF9TSElGVCAwCisjZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMSAoMHgxPDwxKQorI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTFfU0hJRlQgMQorI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTIgKDB4MTw8MikKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yX1NISUZUIDIKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0zICgweDE8PDMpCisjZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNM19TSElGVCAzCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9RVUVVRTBfRkxVU0hfQ0YgKDB4Mzw8NCkKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX1FVRVVFMF9GTFVTSF9DRl9TSElGVCA0CisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVgzX0ZMQUcgKDB4MTw8NikKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDNfRkxBR19TSElGVCA2CisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0ZMQUcgKDB4MTw8NykKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDRfRkxBR19TSElGVCA3CisJdTggc3RhdGU7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1OCBzdGF0ZTsKKwl1OCBhZ2dfdmFyczE7CisjZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMCAoMHgxPDwwKQorI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTBfU0hJRlQgMAorI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTEgKDB4MTw8MSkKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0xX1NISUZUIDEKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yICgweDE8PDIpCisjZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMl9TSElGVCAyCisjZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMyAoMHgxPDwzKQorI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTNfU0hJRlQgMworI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfUVVFVUUwX0ZMVVNIX0NGICgweDM8PDQpCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9RVUVVRTBfRkxVU0hfQ0ZfU0hJRlQgNAorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYM19GTEFHICgweDE8PDYpCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVgzX0ZMQUdfU0hJRlQgNgorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNF9GTEFHICgweDE8PDcpCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0ZMQUdfU0hJRlQgNworCXUxNiB1bHBfY3JlZGl0OworI2VuZGlmCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IF9fYWdnX3ZhbDQ7CisJdTE2IGFnZ192YXJzMjsKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDVfRkxBRyAoMHgxPDwwKQorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNV9GTEFHX1NISUZUIDAKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDZfRkxBRyAoMHgxPDwxKQorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNl9GTEFHX1NISUZUIDEKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDRfQ0YgKDB4Mzw8MikKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDRfQ0ZfU0hJRlQgMgorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNV9DRiAoMHgzPDw0KQorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNV9DRl9TSElGVCA0CisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg2X0NGICgweDM8PDYpCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg2X0NGX1NISUZUIDYKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDdfQ0YgKDB4Mzw8OCkKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDdfQ0ZfU0hJRlQgOAorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYN19GTEFHICgweDE8PDEwKQorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYN19GTEFHX1NISUZUIDEwCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9RVUVVRTBfRkxVU0hfQ0ZfRU4gKDB4MTw8MTEpCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9RVUVVRTBfRkxVU0hfQ0ZfRU5fU0hJRlQgMTEKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0NGX0VOICgweDE8PDEyKQorI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDRfQ0ZfRU5fU0hJRlQgMTIKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg1X0NGX0VOICgweDE8PDEzKQorI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDVfQ0ZfRU5fU0hJRlQgMTMKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg2X0NGX0VOICgweDE8PDE0KQorI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDZfQ0ZfRU5fU0hJRlQgMTQKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg3X0NGX0VOICgweDE8PDE1KQorI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDdfQ0ZfRU5fU0hJRlQgMTUKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBhZ2dfdmFyczI7CisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg1X0ZMQUcgKDB4MTw8MCkKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDVfRkxBR19TSElGVCAwCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg2X0ZMQUcgKDB4MTw8MSkKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDZfRkxBR19TSElGVCAxCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0NGICgweDM8PDIpCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0NGX1NISUZUIDIKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDVfQ0YgKDB4Mzw8NCkKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDVfQ0ZfU0hJRlQgNAorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNl9DRiAoMHgzPDw2KQorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNl9DRl9TSElGVCA2CisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg3X0NGICgweDM8PDgpCisjZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg3X0NGX1NISUZUIDgKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDdfRkxBRyAoMHgxPDwxMCkKKyNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDdfRkxBR19TSElGVCAxMAorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfUVVFVUUwX0ZMVVNIX0NGX0VOICgweDE8PDExKQorI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfUVVFVUUwX0ZMVVNIX0NGX0VOX1NISUZUIDExCisjZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNF9DRl9FTiAoMHgxPDwxMikKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0NGX0VOX1NISUZUIDEyCisjZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNV9DRl9FTiAoMHgxPDwxMykKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg1X0NGX0VOX1NISUZUIDEzCisjZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNl9DRl9FTiAoMHgxPDwxNCkKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg2X0NGX0VOX1NISUZUIDE0CisjZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYN19DRl9FTiAoMHgxPDwxNSkKKyNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg3X0NGX0VOX1NISUZUIDE1CisJdTE2IF9fYWdnX3ZhbDQ7CisjZW5kaWYKKwlzdHJ1Y3QgdHN0b3JtX2Zjb2VfZXh0cmFfYWdfY29udGV4dF9zZWN0aW9uIF9fZXh0cmFfc2VjdGlvbjsKK307CisKKworCisvKgorICogVGhlIHRjcCBhZ2dyZWdhdGl2ZSBjb250ZXh0IHNlY3Rpb24gb2YgVHN0b3JtCisgKi8KK3N0cnVjdCB0c3Rvcm1fdGNwX3RjcF9hZ19jb250ZXh0X3NlY3Rpb24geworCXUzMiBfX2FnZ192YWwxOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IF9fdGNwX2FnZ192YXJzMjsKKwl1OCBfX2FnZ192YWwzOworCXUxNiBfX2FnZ192YWwyOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IF9fYWdnX3ZhbDI7CisJdTggX19hZ2dfdmFsMzsKKwl1OCBfX3RjcF9hZ2dfdmFyczI7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgX19hZ2dfdmFsNTsKKwl1OCBfX2FnZ192YWw2OworCXU4IF9fdGNwX2FnZ192YXJzMzsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXU4IF9fdGNwX2FnZ192YXJzMzsKKwl1OCBfX2FnZ192YWw2OworCXUxNiBfX2FnZ192YWw1OworI2VuZGlmCisJdTMyIHNuZF9ueHQ7CisJdTMyIHJ0dF9zZXE7CisJdTMyIHJ0dF90aW1lOworCXUzMiBfX3Jlc2VydmVkNjY7CisJdTMyIHduZF9yaWdodF9lZGdlOworCXUzMiB0Y3BfYWdnX3ZhcnMxOworI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fRklOX1NFTlRfRkxBRyAoMHgxPDwwKQorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fRklOX1NFTlRfRkxBR19TSElGVCAwCisjZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9MQVNUX1BBQ0tFVF9GSU5fRkxBRyAoMHgxPDwxKQorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fTEFTVF9QQUNLRVRfRklOX0ZMQUdfU0hJRlQgMQorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fV05EX1VQRF9DRiAoMHgzPDwyKQorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fV05EX1VQRF9DRl9TSElGVCAyCisjZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9USU1FT1VUX0NGICgweDM8PDQpCisjZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9USU1FT1VUX0NGX1NISUZUIDQKKyNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1dORF9VUERfQ0ZfRU4gKDB4MTw8NikKKyNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1dORF9VUERfQ0ZfRU5fU0hJRlQgNgorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVElNRU9VVF9DRl9FTiAoMHgxPDw3KQorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVElNRU9VVF9DRl9FTl9TSElGVCA3CisjZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9SRVRSQU5TTUlUX1NFUV9FTiAoMHgxPDw4KQorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fUkVUUkFOU01JVF9TRVFfRU5fU0hJRlQgOAorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fU05EX05YVF9FTiAoMHgxPDw5KQorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fU05EX05YVF9FTl9TSElGVCA5CisjZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0ZMQUcgKDB4MTw8MTApCisjZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0ZMQUdfU0hJRlQgMTAKKyNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfRkxBRyAoMHgxPDwxMSkKKyNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfRkxBR19TSElGVCAxMQorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMV9DRl9FTiAoMHgxPDwxMikKKyNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDFfQ0ZfRU5fU0hJRlQgMTIKKyNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfQ0ZfRU4gKDB4MTw8MTMpCisjZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgyX0NGX0VOX1NISUZUIDEzCisjZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0NGICgweDM8PDE0KQorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMV9DRl9TSElGVCAxNAorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMl9DRiAoMHgzPDwxNikKKyNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfQ0ZfU0hJRlQgMTYKKyNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1RYX0JMT0NLRUQgKDB4MTw8MTgpCisjZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9UWF9CTE9DS0VEX1NISUZUIDE4CisjZGVmaW5lIF9fVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDEwX0NGX0VOICgweDE8PDE5KQorI2RlZmluZSBfX1RTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxMF9DRl9FTl9TSElGVCAxOQorI2RlZmluZSBfX1RTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxMV9DRl9FTiAoMHgxPDwyMCkKKyNkZWZpbmUgX19UU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMTFfQ0ZfRU5fU0hJRlQgMjAKKyNkZWZpbmUgX19UU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMTJfQ0ZfRU4gKDB4MTw8MjEpCisjZGVmaW5lIF9fVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDEyX0NGX0VOX1NISUZUIDIxCisjZGVmaW5lIF9fVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1JFU0VSVkVEMSAoMHgzPDwyMikKKyNkZWZpbmUgX19UU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRUQxX1NISUZUIDIyCisjZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9SRVRSQU5TTUlUX1BFTkRfU0VRICgweEY8PDI0KQorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fUkVUUkFOU01JVF9QRU5EX1NFUV9TSElGVCAyNAorI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fUkVUUkFOU01JVF9ET05FX1NFUSAoMHhGPDwyOCkKKyNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1JFVFJBTlNNSVRfRE9ORV9TRVFfU0hJRlQgMjgKKwl1MzIgc25kX21heDsKKwl1MzIgc25kX3VuYTsKKwl1MzIgX19yZXNlcnZlZDI7CiB9OwogCiAvKgotICogRkNvRSAxNi1iaXRzIGluZGV4IHVuaW9uCisgKiBUaGUgaXNjc2kgYWdncmVnYXRpdmUgY29udGV4dCBvZiBUc3Rvcm0KICAqLwotdW5pb24gZmNvZV9pZHgxNl9maWVsZF91bmlvbiB7Ci0Jc3RydWN0IGZjb2VfaWR4MTZfZmllbGRzIGZpZWxkczsKLQl1MTYgdmFsOworc3RydWN0IHRzdG9ybV9pc2NzaV9hZ19jb250ZXh0IHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgdWxwX2NyZWRpdDsKKwl1OCBhZ2dfdmFyczE7CisjZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTAgKDB4MTw8MCkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMF9TSElGVCAwCisjZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTEgKDB4MTw8MSkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMV9TSElGVCAxCisjZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTIgKDB4MTw8MikKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMl9TSElGVCAyCisjZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTMgKDB4MTw8MykKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNM19TSElGVCAzCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUVVFVUVTX0ZMVVNIX1EwX0NGICgweDM8PDQpCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUVVFVUVTX0ZMVVNIX1EwX0NGX1NISUZUIDQKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVgzX0ZMQUcgKDB4MTw8NikKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVgzX0ZMQUdfU0hJRlQgNgorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FDS19PTl9GSU5fU0VOVF9GTEFHICgweDE8PDcpCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUNLX09OX0ZJTl9TRU5UX0ZMQUdfU0hJRlQgNworCXU4IHN0YXRlOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTggc3RhdGU7CisJdTggYWdnX3ZhcnMxOworI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0wICgweDE8PDApCisjZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTBfU0hJRlQgMAorI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0xICgweDE8PDEpCisjZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTFfU0hJRlQgMQorI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yICgweDE8PDIpCisjZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTJfU0hJRlQgMgorI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0zICgweDE8PDMpCisjZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTNfU0hJRlQgMworI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1FVRVVFU19GTFVTSF9RMF9DRiAoMHgzPDw0KQorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1FVRVVFU19GTFVTSF9RMF9DRl9TSElGVCA0CisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYM19GTEFHICgweDE8PDYpCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYM19GTEFHX1NISUZUIDYKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BQ0tfT05fRklOX1NFTlRfRkxBRyAoMHgxPDw3KQorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FDS19PTl9GSU5fU0VOVF9GTEFHX1NISUZUIDcKKwl1MTYgdWxwX2NyZWRpdDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBfX2FnZ192YWw0OworCXUxNiBhZ2dfdmFyczI7CisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfTVNMX1RJTUVSX1NFVF9GTEFHICgweDE8PDApCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfTVNMX1RJTUVSX1NFVF9GTEFHX1NISUZUIDAKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9GSU5fU0VOVF9GSVJTVF9GTEFHICgweDE8PDEpCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRklOX1NFTlRfRklSU1RfRkxBR19TSElGVCAxCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUlNUX1NFTlRfQ0YgKDB4Mzw8MikKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9SU1RfU0VOVF9DRl9TSElGVCAyCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfV0FLRVVQX0NBTExfQ0YgKDB4Mzw8NCkKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9XQUtFVVBfQ0FMTF9DRl9TSElGVCA0CisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYNl9DRiAoMHgzPDw2KQorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDZfQ0ZfU0hJRlQgNgorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDdfQ0YgKDB4Mzw8OCkKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg3X0NGX1NISUZUIDgKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg3X0ZMQUcgKDB4MTw8MTApCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYN19GTEFHX1NISUZUIDEwCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUVVFVUVTX0ZMVVNIX1EwX0NGX0VOICgweDE8PDExKQorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1FVRVVFU19GTFVTSF9RMF9DRl9FTl9TSElGVCAxMQorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1JTVF9TRU5UX0NGX0VOICgweDE8PDEyKQorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1JTVF9TRU5UX0NGX0VOX1NISUZUIDEyCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfV0FLRVVQX0NBTExfQ0ZfRU4gKDB4MTw8MTMpCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfV0FLRVVQX0NBTExfQ0ZfRU5fU0hJRlQgMTMKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYNl9DRl9FTiAoMHgxPDwxNCkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYNl9DRl9FTl9TSElGVCAxNAorI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg3X0NGX0VOICgweDE8PDE1KQorI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg3X0NGX0VOX1NISUZUIDE1CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgYWdnX3ZhcnMyOworI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX01TTF9USU1FUl9TRVRfRkxBRyAoMHgxPDwwKQorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX01TTF9USU1FUl9TRVRfRkxBR19TSElGVCAwCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRklOX1NFTlRfRklSU1RfRkxBRyAoMHgxPDwxKQorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0ZJTl9TRU5UX0ZJUlNUX0ZMQUdfU0hJRlQgMQorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1JTVF9TRU5UX0NGICgweDM8PDIpCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUlNUX1NFTlRfQ0ZfU0hJRlQgMgorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1dBS0VVUF9DQUxMX0NGICgweDM8PDQpCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfV0FLRVVQX0NBTExfQ0ZfU0hJRlQgNAorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDZfQ0YgKDB4Mzw8NikKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg2X0NGX1NISUZUIDYKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg3X0NGICgweDM8PDgpCisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYN19DRl9TSElGVCA4CisjZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYN19GTEFHICgweDE8PDEwKQorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDdfRkxBR19TSElGVCAxMAorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1FVRVVFU19GTFVTSF9RMF9DRl9FTiAoMHgxPDwxMSkKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9RVUVVRVNfRkxVU0hfUTBfQ0ZfRU5fU0hJRlQgMTEKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9SU1RfU0VOVF9DRl9FTiAoMHgxPDwxMikKKyNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9SU1RfU0VOVF9DRl9FTl9TSElGVCAxMgorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1dBS0VVUF9DQUxMX0NGX0VOICgweDE8PDEzKQorI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1dBS0VVUF9DQUxMX0NGX0VOX1NISUZUIDEzCisjZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDZfQ0ZfRU4gKDB4MTw8MTQpCisjZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDZfQ0ZfRU5fU0hJRlQgMTQKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYN19DRl9FTiAoMHgxPDwxNSkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYN19DRl9FTl9TSElGVCAxNQorCXUxNiBfX2FnZ192YWw0OworI2VuZGlmCisJc3RydWN0IHRzdG9ybV90Y3BfdGNwX2FnX2NvbnRleHRfc2VjdGlvbiB0Y3A7CiB9OwogCisKKwogLyoKLSAqIDQgcmVncyBzaXplCisgKiBUaGUgZmNvZSBhZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIFVzdG9ybQogICovCi1zdHJ1Y3QgZmNvZV9iZF9jdHggewotCXUzMiBidWZfYWRkcl9oaTsKLQl1MzIgYnVmX2FkZHJfbG87CitzdHJ1Y3QgdXN0b3JtX2Zjb2VfYWdfY29udGV4dCB7CiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJzcnYwOwotCXUxNiBidWZfbGVuOworCXU4IF9fYXV4X2NvdW50ZXJfZmxhZ3M7CisJdTggYWdnX3ZhcnMyOworI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX1RYX0NGICgweDM8PDApCisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfVFhfQ0ZfU0hJRlQgMAorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfVElNRVJfQ0YgKDB4Mzw8MikKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1RJTUVSX0NGX1NISUZUIDIKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BR0dfTUlTQzRfUlVMRSAoMHg3PDw0KQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0FHR19NSVNDNF9SVUxFX1NISUZUIDQKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FHR19WQUwyX01BU0sgKDB4MTw8NykKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FHR19WQUwyX01BU0tfU0hJRlQgNworCXU4IGFnZ192YXJzMTsKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTAgKDB4MTw8MCkKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTBfU0hJRlQgMAorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTEgKDB4MTw8MSkKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0xX1NISUZUIDEKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yICgweDE8PDIpCisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMl9TSElGVCAyCisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMyAoMHgxPDwzKQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTNfU0hJRlQgMworI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0lOVl9DRiAoMHgzPDw0KQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0lOVl9DRl9TSElGVCA0CisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRiAoMHgzPDw2KQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NPTVBMRVRJT05fQ0ZfU0hJRlQgNgorCXU4IHN0YXRlOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGJ1Zl9sZW47Ci0JdTE2IHJzcnYwOworCXU4IHN0YXRlOworCXU4IGFnZ192YXJzMTsKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTAgKDB4MTw8MCkKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTBfU0hJRlQgMAorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTEgKDB4MTw8MSkKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0xX1NISUZUIDEKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yICgweDE8PDIpCisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMl9TSElGVCAyCisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMyAoMHgxPDwzKQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTNfU0hJRlQgMworI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0lOVl9DRiAoMHgzPDw0KQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0lOVl9DRl9TSElGVCA0CisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRiAoMHgzPDw2KQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NPTVBMRVRJT05fQ0ZfU0hJRlQgNgorCXU4IGFnZ192YXJzMjsKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9UWF9DRiAoMHgzPDwwKQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX1RYX0NGX1NISUZUIDAKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1RJTUVSX0NGICgweDM8PDIpCisjZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9USU1FUl9DRl9TSElGVCAyCisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQUdHX01JU0M0X1JVTEUgKDB4Nzw8NCkKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BR0dfTUlTQzRfUlVMRV9TSElGVCA0CisjZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BR0dfVkFMMl9NQVNLICgweDE8PDcpCisjZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BR0dfVkFMMl9NQVNLX1NISUZUIDcKKwl1OCBfX2F1eF9jb3VudGVyX2ZsYWdzOwogI2VuZGlmCiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJzcnYxOwotCXUxNiBmbGFnczsKKwl1OCBjZHVfdXNhZ2U7CisJdTggYWdnX21pc2MyOworCXUxNiBwYmZfdHhfc2VxX2FjazsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBmbGFnczsKLQl1MTYgcnNydjE7CisJdTE2IHBiZl90eF9zZXFfYWNrOworCXU4IGFnZ19taXNjMjsKKwl1OCBjZHVfdXNhZ2U7CiAjZW5kaWYKLX07Ci0KLS8qCi0gKiBQYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBwbGFjZW1lbnQgYWNjb3JkaW5nIHRvIFNHTAotICovCi1zdHJ1Y3QgdXN0b3JtX2Zjb2VfZGF0YV9wbGFjZSB7CisJdTMyIGFnZ19taXNjNDsKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgY2FjaGVkX3NnZV9vZmY7Ci0JdTggY2FjaGVkX251bV9zZ2VzOwotCXU4IGNhY2hlZF9zZ2VfaWR4OworCXU4IGFnZ192YWwzX3RoOworCXU4IGFnZ192YWwzOworCXUxNiBhZ2dfbWlzYzM7CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBjYWNoZWRfc2dlX2lkeDsKLQl1OCBjYWNoZWRfbnVtX3NnZXM7Ci0JdTE2IGNhY2hlZF9zZ2Vfb2ZmOworCXUxNiBhZ2dfbWlzYzM7CisJdTggYWdnX3ZhbDM7CisJdTggYWdnX3ZhbDNfdGg7CiAjZW5kaWYKLQlzdHJ1Y3QgZmNvZV9iZF9jdHggY2FjaGVkX3NnZVszXTsKLX07Ci0KLXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3R4d3JfcnhyZCB7CisJdTMyIGV4cGlyZWRfdGFza19pZDsKKwl1MzIgYWdnX21pc2M0X3RoOwogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiB2ZXJpZnlfdHhfc2VxOwotCXU4IGluaXRfZmxhZ3M7Ci0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1RBU0tfVFlQRSAoMHg3PDwwKQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9UQVNLX1RZUEVfU0hJRlQgMAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9ERVZfVFlQRSAoMHgxPDwzKQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9ERVZfVFlQRV9TSElGVCAzCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX0NMQVNTX1RZUEUgKDB4MTw8NCkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfQ0xBU1NfVFlQRV9TSElGVCA0Ci0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1NJTkdMRV9TR0UgKDB4MTw8NSkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfU0lOR0xFX1NHRV9TSElGVCA1Ci0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1JTUlY1ICgweDM8PDYpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1JTUlY1X1NISUZUIDYKLQl1OCB0eF9mbGFnczsKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfVFhfU1RBVEUgKDB4Rjw8MCkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfVFhfU1RBVEVfU0hJRlQgMAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9SU1JWNCAoMHhGPDw0KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9SU1JWNF9TSElGVCA0Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCB0eF9mbGFnczsKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfVFhfU1RBVEUgKDB4Rjw8MCkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfVFhfU1RBVEVfU0hJRlQgMAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9SU1JWNCAoMHhGPDw0KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9SU1JWNF9TSElGVCA0Ci0JdTggaW5pdF9mbGFnczsKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfVEFTS19UWVBFICgweDc8PDApCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1RBU0tfVFlQRV9TSElGVCAwCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX0RFVl9UWVBFICgweDE8PDMpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX0RFVl9UWVBFX1NISUZUIDMKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfQ0xBU1NfVFlQRSAoMHgxPDw0KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9DTEFTU19UWVBFX1NISUZUIDQKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfU0lOR0xFX1NHRSAoMHgxPDw1KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9TSU5HTEVfU0dFX1NISUZUIDUKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfUlNSVjUgKDB4Mzw8NikKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfUlNSVjVfU0hJRlQgNgotCXUxNiB2ZXJpZnlfdHhfc2VxOwotI2VuZGlmCi19OwotCi1zdHJ1Y3QgZmNvZV9mY3BfY21kX3BheWxvYWQgewotCXUzMiBvcGFxdWVbOF07Ci19OwotCi1zdHJ1Y3QgZmNvZV9mY19oZHIgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IGNzX2N0bDsKLQl1OCBzX2lkWzNdOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggc19pZFszXTsKLQl1OCBjc19jdGw7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCByX2N0bDsKLQl1OCBkX2lkWzNdOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggZF9pZFszXTsKLQl1OCByX2N0bDsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IHNlcV9pZDsKLQl1OCBkZl9jdGw7Ci0JdTE2IHNlcV9jbnQ7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgc2VxX2NudDsKLQl1OCBkZl9jdGw7Ci0JdTggc2VxX2lkOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggdHlwZTsKLQl1OCBmX2N0bFszXTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IGZfY3RsWzNdOwotCXU4IHR5cGU7Ci0jZW5kaWYKLQl1MzIgcGFyYW1ldGVyczsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgb3hfaWQ7Ci0JdTE2IHJ4X2lkOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHJ4X2lkOwotCXUxNiBveF9pZDsKLSNlbmRpZgotfTsKLQotc3RydWN0IGZjb2VfZmNfZnJhbWUgewotCXN0cnVjdCBmY29lX2ZjX2hkciBmY19oZHI7Ci0JdTMyIHJlc2VydmVkMFsyXTsKLX07Ci0KLXVuaW9uIGZjb2VfY21kX2Zsb3dfaW5mbyB7Ci0Jc3RydWN0IGZjb2VfZmNwX2NtZF9wYXlsb2FkIGZjcF9jbWRfcGF5bG9hZDsKLQlzdHJ1Y3QgZmNvZV9mY19mcmFtZSBtcF9mY19mcmFtZTsKLX07Ci0KLXN0cnVjdCBmY29lX3JlYWRfZmxvd19pbmZvIHsKLQlzdHJ1Y3QgZmNvZV9mY19oZHIgZmNfZGF0YV9pbl9oZHI7Ci0JdTMyIHJlc2VydmVkWzJdOwotfTsKLQotc3RydWN0IGZjb2VfZmNwX3hmcl9yZHlfcGF5bG9hZCB7Ci0JdTMyIGJ1cnN0X2xlbjsKLQl1MzIgZGF0YV9ybzsKLX07Ci0KLXN0cnVjdCBmY29lX3dyaXRlX2Zsb3dfaW5mbyB7Ci0Jc3RydWN0IGZjb2VfZmNfaGRyIGZjX2RhdGFfb3V0X2hkcjsKLQlzdHJ1Y3QgZmNvZV9mY3BfeGZyX3JkeV9wYXlsb2FkIGZjcF94ZnJfcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBmY29lX2ZjcF9yc3BfZmxhZ3MgewotCXU4IGZsYWdzOwotI2RlZmluZSBGQ09FX0ZDUF9SU1BfRkxBR1NfRkNQX1JTUF9MRU5fVkFMSUQgKDB4MTw8MCkKLSNkZWZpbmUgRkNPRV9GQ1BfUlNQX0ZMQUdTX0ZDUF9SU1BfTEVOX1ZBTElEX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9GQ1BfUlNQX0ZMQUdTX0ZDUF9TTlNfTEVOX1ZBTElEICgweDE8PDEpCi0jZGVmaW5lIEZDT0VfRkNQX1JTUF9GTEFHU19GQ1BfU05TX0xFTl9WQUxJRF9TSElGVCAxCi0jZGVmaW5lIEZDT0VfRkNQX1JTUF9GTEFHU19GQ1BfUkVTSURfT1ZFUiAoMHgxPDwyKQotI2RlZmluZSBGQ09FX0ZDUF9SU1BfRkxBR1NfRkNQX1JFU0lEX09WRVJfU0hJRlQgMgotI2RlZmluZSBGQ09FX0ZDUF9SU1BfRkxBR1NfRkNQX1JFU0lEX1VOREVSICgweDE8PDMpCi0jZGVmaW5lIEZDT0VfRkNQX1JTUF9GTEFHU19GQ1BfUkVTSURfVU5ERVJfU0hJRlQgMwotI2RlZmluZSBGQ09FX0ZDUF9SU1BfRkxBR1NfRkNQX0NPTkZfUkVRICgweDE8PDQpCi0jZGVmaW5lIEZDT0VfRkNQX1JTUF9GTEFHU19GQ1BfQ09ORl9SRVFfU0hJRlQgNAotI2RlZmluZSBGQ09FX0ZDUF9SU1BfRkxBR1NfRkNQX0JJRElfRkxBR1MgKDB4Nzw8NSkKLSNkZWZpbmUgRkNPRV9GQ1BfUlNQX0ZMQUdTX0ZDUF9CSURJX0ZMQUdTX1NISUZUIDUKLX07Ci0KLXN0cnVjdCBmY29lX2ZjcF9yc3BfcGF5bG9hZCB7Ci0Jc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWQwOwotCXUzMiBmY3BfcmVzaWQ7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJldHJ5X2RlbGF5X3RpbWVyOwotCXN0cnVjdCBmY29lX2ZjcF9yc3BfZmxhZ3MgZmNwX2ZsYWdzOwotCXU4IHNjc2lfc3RhdHVzX2NvZGU7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBzY3NpX3N0YXR1c19jb2RlOwotCXN0cnVjdCBmY29lX2ZjcF9yc3BfZmxhZ3MgZmNwX2ZsYWdzOwotCXUxNiByZXRyeV9kZWxheV90aW1lcjsKLSNlbmRpZgotCXUzMiBmY3BfcnNwX2xlbjsKLQl1MzIgZmNwX3Nuc19sZW47Ci19OwotCi0vKgotICogRml4ZWQgc2l6ZSBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8gcGxhbnQgaXQgaW4gVW5pb24gc3RydWN0dXJlCi0gKi8KLXN0cnVjdCBmY29lX2ZjcF9yc3BfdW5pb24gewotCXN0cnVjdCBmY29lX2ZjcF9yc3BfcGF5bG9hZCBwYXlsb2FkOwotCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkMDsKLX07Ci0KLS8qCi0gKiBGaXhlZCBzaXplIHN0cnVjdHVyZSBpbiBvcmRlciB0byBwbGFudCBpdCBpbiBVbmlvbiBzdHJ1Y3R1cmUKLSAqLwotc3RydWN0IGZjb2VfYWJ0c19yc3BfdW5pb24gewotCXUzMiByX2N0bDsKLQl1MzIgYWJ0c19yc3BfcGF5bG9hZFs3XTsKLX07Ci0KLXVuaW9uIGZjb2VfcnNwX2Zsb3dfaW5mbyB7Ci0Jc3RydWN0IGZjb2VfZmNwX3JzcF91bmlvbiBmY3BfcnNwOwotCXN0cnVjdCBmY29lX2FidHNfcnNwX3VuaW9uIGFidHNfcnNwOwotfTsKLQotc3RydWN0IGZjb2VfY2xlYW51cF9mbG93X2luZm8gewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiByZXNlcnZlZDE7Ci0JdTE2IHRhc2tfaWQ7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgdGFza19pZDsKLQl1MTYgcmVzZXJ2ZWQxOwotI2VuZGlmCi0JdTMyIHJlc2VydmVkMls3XTsKLX07Ci0KLS8qCi0gKiAzMiBieXRlcyB1c2VkIGZvciBnZW5lcmFsIHB1cnBvc2VzCi0gKi8KLXVuaW9uIGZjb2VfZ2VuZXJhbF90YXNrX2N0eCB7Ci0JdW5pb24gZmNvZV9jbWRfZmxvd19pbmZvIGNtZF9pbmZvOwotCXN0cnVjdCBmY29lX3JlYWRfZmxvd19pbmZvIHJlYWRfaW5mbzsKLQlzdHJ1Y3QgZmNvZV93cml0ZV9mbG93X2luZm8gd3JpdGVfaW5mbzsKLQl1bmlvbiBmY29lX3JzcF9mbG93X2luZm8gcnNwX2luZm87Ci0Jc3RydWN0IGZjb2VfY2xlYW51cF9mbG93X2luZm8gY2xlYW51cF9pbmZvOwotCXUzMiBjb21wX2luZm9bOF07Ci19OwotCi1zdHJ1Y3QgZmNvZV9zX3N0YXRfY3R4IHsKLQl1OCBmbGFnczsKLSNkZWZpbmUgRkNPRV9TX1NUQVRfQ1RYX0FDVElWRSAoMHgxPDwwKQotI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfQUNUSVZFX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9TX1NUQVRfQ1RYX0FDS19BQk9SVF9TRVFfQ09ORCAoMHgxPDwxKQotI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfQUNLX0FCT1JUX1NFUV9DT05EX1NISUZUIDEKLSNkZWZpbmUgRkNPRV9TX1NUQVRfQ1RYX0FCVFNfUEVSRk9STUVEICgweDE8PDIpCi0jZGVmaW5lIEZDT0VfU19TVEFUX0NUWF9BQlRTX1BFUkZPUk1FRF9TSElGVCAyCi0jZGVmaW5lIEZDT0VfU19TVEFUX0NUWF9TRVFfVElNRU9VVCAoMHgxPDwzKQotI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfU0VRX1RJTUVPVVRfU0hJRlQgMwotI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfUF9SSlQgKDB4MTw8NCkKLSNkZWZpbmUgRkNPRV9TX1NUQVRfQ1RYX1BfUkpUX1NISUZUIDQKLSNkZWZpbmUgRkNPRV9TX1NUQVRfQ1RYX0FDS19FT0ZUICgweDE8PDUpCi0jZGVmaW5lIEZDT0VfU19TVEFUX0NUWF9BQ0tfRU9GVF9TSElGVCA1Ci0jZGVmaW5lIEZDT0VfU19TVEFUX0NUWF9SU1JWMSAoMHgzPDw2KQotI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfUlNSVjFfU0hJRlQgNgotfTsKLQotLyoKLSAqIENvbW1vbiBzZWN0aW9uLiBCb3RoIFRYIGFuZCBSWCBwcm9jZXNzaW5nIG1pZ2h0IHdyaXRlIGFuZCByZWFkIGZyb20gaXQgaW4gZGlmZmVyZW50IGZsb3dzCi0gKi8KLXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3R4X3J4X2NtbiB7Ci0JdTMyIGRhdGFfMl90cm5zOwotCXVuaW9uIGZjb2VfZ2VuZXJhbF90YXNrX2N0eCBnZW5lcmFsOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiB0eF9sb3dfc2VxX2NudDsKLQlzdHJ1Y3QgZmNvZV9zX3N0YXRfY3R4IHR4X3Nfc3RhdDsKLQl1OCB0eF9zZXFfaWQ7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCB0eF9zZXFfaWQ7Ci0Jc3RydWN0IGZjb2Vfc19zdGF0X2N0eCB0eF9zX3N0YXQ7Ci0JdTE2IHR4X2xvd19zZXFfY250OwotI2VuZGlmCi0JdTMyIGNvbW1vbl9mbGFnczsKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWF9SWF9DTU5fQ0lEICgweEZGRkZGRjw8MCkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWF9SWF9DTU5fQ0lEX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWF9SWF9DTU5fVkFMSUQgKDB4MTw8MjQpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX1ZBTElEX1NISUZUIDI0Ci0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX1NFUV9JTklUICgweDE8PDI1KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9TRVFfSU5JVF9TSElGVCAyNQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9QRU5EX1hGRVIgKDB4MTw8MjYpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX1BFTkRfWEZFUl9TSElGVCAyNgotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9QRU5EX0NPTkYgKDB4MTw8MjcpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX1BFTkRfQ09ORl9TSElGVCAyNwotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9FWFBfRklSU1RfRlJBTUUgKDB4MTw8MjgpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX0VYUF9GSVJTVF9GUkFNRV9TSElGVCAyOAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9SU1JWICgweDc8PDI5KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9SU1JWX1NISUZUIDI5Ci19OwotCi1zdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeV9yeHdyX3R4cmQgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiByeF9pZDsKLQl1MTYgcnhfZmxhZ3M7Ci0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX1JYX1NUQVRFICgweEY8PDApCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX1JYX1NUQVRFX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfTlVNX1JRX1dRRSAoMHg3PDw0KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9OVU1fUlFfV1FFX1NISUZUIDQKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfQ09ORl9SRVEgKDB4MTw8NykKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfQ09ORl9SRVFfU0hJRlQgNwotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9NSVNTX0ZSQU1FICgweDE8PDgpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX01JU1NfRlJBTUVfU0hJRlQgOAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9SRVNFUlZFRDAgKDB4N0Y8PDkpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX1JFU0VSVkVEMF9TSElGVCA5Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcnhfZmxhZ3M7Ci0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX1JYX1NUQVRFICgweEY8PDApCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX1JYX1NUQVRFX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfTlVNX1JRX1dRRSAoMHg3PDw0KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9OVU1fUlFfV1FFX1NISUZUIDQKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfQ09ORl9SRVEgKDB4MTw8NykKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfQ09ORl9SRVFfU0hJRlQgNwotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9NSVNTX0ZSQU1FICgweDE8PDgpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX01JU1NfRlJBTUVfU0hJRlQgOAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9SRVNFUlZFRDAgKDB4N0Y8PDkpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX1JFU0VSVkVEMF9TSElGVCA5Ci0JdTE2IHJ4X2lkOwotI2VuZGlmCi19OwotCi1zdHJ1Y3QgZmNvZV9zZXFfY3R4IHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgbG93X3NlcV9jbnQ7Ci0Jc3RydWN0IGZjb2Vfc19zdGF0X2N0eCBzX3N0YXQ7Ci0JdTggc2VxX2lkOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggc2VxX2lkOwotCXN0cnVjdCBmY29lX3Nfc3RhdF9jdHggc19zdGF0OwotCXUxNiBsb3dfc2VxX2NudDsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBlcnJfc2VxX2NudDsKLQl1MTYgaGlnaF9zZXFfY250OwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGhpZ2hfc2VxX2NudDsKLQl1MTYgZXJyX3NlcV9jbnQ7Ci0jZW5kaWYKLQl1MzIgbG93X2V4cF9ybzsKLQl1MzIgaGlnaF9leHBfcm87Ci19OwotCi1zdHJ1Y3QgZmNvZV9zaW5nbGVfc2dlX2N0eCB7Ci0Jc3RydWN0IHJlZ3BhaXIgY3VyX2J1Zl9hZGRyOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiByZXNlcnZlZDA7Ci0JdTE2IGN1cl9idWZfcmVtOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGN1cl9idWZfcmVtOwotCXUxNiByZXNlcnZlZDA7Ci0jZW5kaWYKLX07Ci0KLXN0cnVjdCBmY29lX211bF9zZ2VzX2N0eCB7Ci0Jc3RydWN0IHJlZ3BhaXIgY3VyX3NnZV9hZGRyOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IHNnbF9zaXplOwotCXU4IGN1cl9zZ2VfaWR4OwotCXUxNiBjdXJfc2dlX29mZjsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBjdXJfc2dlX29mZjsKLQl1OCBjdXJfc2dlX2lkeDsKLQl1OCBzZ2xfc2l6ZTsKLSNlbmRpZgotfTsKLQotdW5pb24gZmNvZV9zZ2xfY3R4IHsKLQlzdHJ1Y3QgZmNvZV9zaW5nbGVfc2dlX2N0eCBzaW5nbGVfc2dlOwotCXN0cnVjdCBmY29lX211bF9zZ2VzX2N0eCBtdWxfc2dlczsKLX07Ci0KLXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3J4X29ubHkgewotCXN0cnVjdCBmY29lX3NlcV9jdHggc2VxX2N0eDsKLQlzdHJ1Y3QgZmNvZV9zZXFfY3R4IG9vb19zZXFfY3R4OwotCXUzMiByc3J2MzsKLQl1bmlvbiBmY29lX3NnbF9jdHggc2dsX2N0eDsKLX07Ci0KLXN0cnVjdCB1c3Rvcm1fZmNvZV90YXNrX2N0eF9lbnRyeV9yZCB7Ci0Jc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnlfdHh3cl9yeHJkIHR4X3dyX3J4X3JkOwotCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3R4X3J4X2NtbiBjbW47Ci0Jc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnlfcnh3cl90eHJkIHJ4X3dyX3R4X3JkOwotCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3J4X29ubHkgcnhfd3I7Ci0JdTMyIHJlc2VydmVkOwotfTsKLQotLyoKLSAqIFVzdG9ybSBGQ29FIFN0b3JtIENvbnRleHQKLSAqLwotc3RydWN0IHVzdG9ybV9mY29lX3N0X2NvbnRleHQgewotCXN0cnVjdCB1c3Rvcm1fZmNvZV9wYXJhbXMgZmNvZV9wYXJhbXM7Ci0Jc3RydWN0IHJlZ3BhaXIgdGFza19hZGRyOwotCXN0cnVjdCByZWdwYWlyIGNxX2Jhc2VfYWRkcjsKLQlzdHJ1Y3QgcmVncGFpciBycV9wYmxfYmFzZTsKLQlzdHJ1Y3QgcmVncGFpciBycV9jdXJfcGFnZV9hZGRyOwotCXN0cnVjdCByZWdwYWlyIGNvbmZxX3BibF9iYXNlX2FkZHI7Ci0Jc3RydWN0IHJlZ3BhaXIgY29ubl9kYl9iYXNlOwotCXN0cnVjdCByZWdwYWlyIHhmcnFfYmFzZV9hZGRyOwotCXN0cnVjdCByZWdwYWlyIGxjcV9iYXNlX2FkZHI7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdW5pb24gZmNvZV9pZHgxNl9maWVsZF91bmlvbiBycV9jb25zOwotCXVuaW9uIGZjb2VfaWR4MTZfZmllbGRfdW5pb24gcnFfcHJvZDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXVuaW9uIGZjb2VfaWR4MTZfZmllbGRfdW5pb24gcnFfcHJvZDsKLQl1bmlvbiBmY29lX2lkeDE2X2ZpZWxkX3VuaW9uIHJxX2NvbnM7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgeGZycV9wcm9kOworCXUxNiBjcV9wcm9kOwogCXUxNiBjcV9jb25zOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCiAJdTE2IGNxX2NvbnM7Ci0JdTE2IHhmcnFfcHJvZDsKKwl1MTYgY3FfcHJvZDsKICNlbmRpZgogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBsY3FfY29uczsKLQl1MTYgaGNfY3JhbV9hZGRyZXNzOworCXUxNiBfX3Jlc2VydmVkMjsKKwl1OCBkZWNpc2lvbl9ydWxlczsKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9DUV9ERUNfUlVMRSAoMHg3PDwwKQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NRX0RFQ19SVUxFX1NISUZUIDAKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FHR19WQUwzX1JVTEUgKDB4Nzw8MykKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FHR19WQUwzX1JVTEVfU0hJRlQgMworI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NRX0FSTV9OX0ZMQUcgKDB4MTw8NikKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9DUV9BUk1fTl9GTEFHX1NISUZUIDYKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1JFU0VSVkVEMSAoMHgxPDw3KQorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfUkVTRVJWRUQxX1NISUZUIDcKKwl1OCBkZWNpc2lvbl9ydWxlX2VuYWJsZV9iaXRzOworI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfUkVTRVJWRURfSU5WX0NGX0VOICgweDE8PDApCisjZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9SRVNFUlZFRF9JTlZfQ0ZfRU5fU0hJRlQgMAorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NPTVBMRVRJT05fQ0ZfRU4gKDB4MTw8MSkKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9DT01QTEVUSU9OX0NGX0VOX1NISUZUIDEKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9UWF9DRl9FTiAoMHgxPDwyKQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX1RYX0NGX0VOX1NISUZUIDIKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1RJTUVSX0NGX0VOICgweDE8PDMpCisjZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9USU1FUl9DRl9FTl9TSElGVCAzCisjZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVgxX0NGX0VOICgweDE8PDQpCisjZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVgxX0NGX0VOX1NISUZUIDQKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1FVRVVFMF9DRl9FTiAoMHgxPDw1KQorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfUVVFVUUwX0NGX0VOX1NISUZUIDUKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDNfQ0ZfRU4gKDB4MTw8NikKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDNfQ0ZfRU5fU0hJRlQgNgorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfRFFfQ0ZfRU4gKDB4MTw8NykKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0RRX0NGX0VOX1NISUZUIDcKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBoY19jcmFtX2FkZHJlc3M7Ci0JdTE2IGxjcV9jb25zOworCXU4IGRlY2lzaW9uX3J1bGVfZW5hYmxlX2JpdHM7CisjZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9SRVNFUlZFRF9JTlZfQ0ZfRU4gKDB4MTw8MCkKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1JFU0VSVkVEX0lOVl9DRl9FTl9TSElGVCAwCisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRl9FTiAoMHgxPDwxKQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NPTVBMRVRJT05fQ0ZfRU5fU0hJRlQgMQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX1RYX0NGX0VOICgweDE8PDIpCisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfVFhfQ0ZfRU5fU0hJRlQgMgorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfVElNRVJfQ0ZfRU4gKDB4MTw8MykKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1RJTUVSX0NGX0VOX1NISUZUIDMKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDFfQ0ZfRU4gKDB4MTw8NCkKKyNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDFfQ0ZfRU5fU0hJRlQgNAorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfUVVFVUUwX0NGX0VOICgweDE8PDUpCisjZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9RVUVVRTBfQ0ZfRU5fU0hJRlQgNQorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYM19DRl9FTiAoMHgxPDw2KQorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYM19DRl9FTl9TSElGVCA2CisjZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9EUV9DRl9FTiAoMHgxPDw3KQorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfRFFfQ0ZfRU5fU0hJRlQgNworCXU4IGRlY2lzaW9uX3J1bGVzOworI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NRX0RFQ19SVUxFICgweDc8PDApCisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQ1FfREVDX1JVTEVfU0hJRlQgMAorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfQUdHX1ZBTDNfUlVMRSAoMHg3PDwzKQorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfQUdHX1ZBTDNfUlVMRV9TSElGVCAzCisjZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQ1FfQVJNX05fRkxBRyAoMHgxPDw2KQorI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NRX0FSTV9OX0ZMQUdfU0hJRlQgNgorI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfUkVTRVJWRUQxICgweDE8PDcpCisjZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9SRVNFUlZFRDFfU0hJRlQgNworCXUxNiBfX3Jlc2VydmVkMjsKICNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBzcV94ZnJxX2xjcV9jb25mcV9zaXplOwotCXUxNiBjb25mcV9wcm9kOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGNvbmZxX3Byb2Q7Ci0JdTE2IHNxX3hmcnFfbGNxX2NvbmZxX3NpemU7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBoY19jc2RtX2FnZ19pbnQ7Ci0JdTggZmxhZ3M7Ci0jZGVmaW5lIFVTVE9STV9GQ09FX1NUX0NPTlRFWFRfTUlEX1NFUV9QUk9DX0ZMQUcgKDB4MTw8MCkKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfU1RfQ09OVEVYVF9NSURfU0VRX1BST0NfRkxBR19TSElGVCAwCi0jZGVmaW5lIFVTVE9STV9GQ09FX1NUX0NPTlRFWFRfQ0FDSEVEX0NPTk5fRkxBRyAoMHgxPDwxKQotI2RlZmluZSBVU1RPUk1fRkNPRV9TVF9DT05URVhUX0NBQ0hFRF9DT05OX0ZMQUdfU0hJRlQgMQotI2RlZmluZSBVU1RPUk1fRkNPRV9TVF9DT05URVhUX0NBQ0hFRF9UQ0VfRkxBRyAoMHgxPDwyKQotI2RlZmluZSBVU1RPUk1fRkNPRV9TVF9DT05URVhUX0NBQ0hFRF9UQ0VfRkxBR19TSElGVCAyCi0jZGVmaW5lIFVTVE9STV9GQ09FX1NUX0NPTlRFWFRfUlNSVjEgKDB4MUY8PDMpCi0jZGVmaW5lIFVTVE9STV9GQ09FX1NUX0NPTlRFWFRfUlNSVjFfU0hJRlQgMwotCXU4IGF2YWlsYWJsZV9ycWVzOwotCXU4IHNwX3FfZmx1c2hfY250OwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggc3BfcV9mbHVzaF9jbnQ7Ci0JdTggYXZhaWxhYmxlX3JxZXM7Ci0JdTggZmxhZ3M7Ci0jZGVmaW5lIFVTVE9STV9GQ09FX1NUX0NPTlRFWFRfTUlEX1NFUV9QUk9DX0ZMQUcgKDB4MTw8MCkKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfU1RfQ09OVEVYVF9NSURfU0VRX1BST0NfRkxBR19TSElGVCAwCi0jZGVmaW5lIFVTVE9STV9GQ09FX1NUX0NPTlRFWFRfQ0FDSEVEX0NPTk5fRkxBRyAoMHgxPDwxKQotI2RlZmluZSBVU1RPUk1fRkNPRV9TVF9DT05URVhUX0NBQ0hFRF9DT05OX0ZMQUdfU0hJRlQgMQotI2RlZmluZSBVU1RPUk1fRkNPRV9TVF9DT05URVhUX0NBQ0hFRF9UQ0VfRkxBRyAoMHgxPDwyKQotI2RlZmluZSBVU1RPUk1fRkNPRV9TVF9DT05URVhUX0NBQ0hFRF9UQ0VfRkxBR19TSElGVCAyCi0jZGVmaW5lIFVTVE9STV9GQ09FX1NUX0NPTlRFWFRfUlNSVjEgKDB4MUY8PDMpCi0jZGVmaW5lIFVTVE9STV9GQ09FX1NUX0NPTlRFWFRfUlNSVjFfU0hJRlQgMwotCXU4IGhjX2NzZG1fYWdnX2ludDsKLSNlbmRpZgotCXN0cnVjdCB1c3Rvcm1fZmNvZV9kYXRhX3BsYWNlIGRhdGFfcGxhY2U7Ci0Jc3RydWN0IHVzdG9ybV9mY29lX3Rhc2tfY3R4X2VudHJ5X3JkIHRjZTsKIH07CiAKKwogLyoKLSAqIFRoZSBGQ29FIG5vbi1hZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIFRzdG9ybQorICogVGhlIGlzY3NpIGFnZ3JlZ2F0aXZlIGNvbnRleHQgb2YgVXN0b3JtCiAgKi8KLXN0cnVjdCB0c3Rvcm1fZmNvZV9zdF9jb250ZXh0IHsKLQlzdHJ1Y3QgcmVncGFpciByZXNlcnZlZDA7Ci0Jc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWQxOworc3RydWN0IHVzdG9ybV9pc2NzaV9hZ19jb250ZXh0IHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCBfX2F1eF9jb3VudGVyX2ZsYWdzOworCXU4IGFnZ192YXJzMjsKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVFhfQ0YgKDB4Mzw8MCkKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVFhfQ0ZfU0hJRlQgMAorI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX1RJTUVSX0NGICgweDM8PDIpCisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVElNRVJfQ0ZfU0hJRlQgMgorI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfTUlTQzRfUlVMRSAoMHg3PDw0KQorI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfTUlTQzRfUlVMRV9TSElGVCA0CisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDJfTUFTSyAoMHgxPDw3KQorI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0FHR19WQUwyX01BU0tfU0hJRlQgNworCXU4IGFnZ192YXJzMTsKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0wICgweDE8PDApCisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMF9TSElGVCAwCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTEgKDB4MTw8MSkKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMV9TSElGVCAxCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTIgKDB4MTw8MikKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMl9TSElGVCAyCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTMgKDB4MTw8MykKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNM19TSElGVCAzCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0lOVl9DRiAoMHgzPDw0KQorI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9JTlZfQ0ZfU0hJRlQgNAorI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9DT01QTEVUSU9OX0NGICgweDM8PDYpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0NPTVBMRVRJT05fQ0ZfU0hJRlQgNgorCXU4IHN0YXRlOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTggc3RhdGU7CisJdTggYWdnX3ZhcnMxOworI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTAgKDB4MTw8MCkKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0wX1NISUZUIDAKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMSAoMHgxPDwxKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0xX1NISUZUIDEKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMiAoMHgxPDwyKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yX1NISUZUIDIKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMyAoMHgxPDwzKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0zX1NISUZUIDMKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfSU5WX0NGICgweDM8PDQpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0lOVl9DRl9TSElGVCA0CisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0NPTVBMRVRJT05fQ0YgKDB4Mzw8NikKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRl9TSElGVCA2CisJdTggYWdnX3ZhcnMyOworI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9UWF9DRiAoMHgzPDwwKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9UWF9DRl9TSElGVCAwCisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVElNRVJfQ0YgKDB4Mzw8MikKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9USU1FUl9DRl9TSElGVCAyCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0FHR19NSVNDNF9SVUxFICgweDc8PDQpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0FHR19NSVNDNF9SVUxFX1NISUZUIDQKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfVkFMMl9NQVNLICgweDE8PDcpCisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDJfTUFTS19TSElGVCA3CisJdTggX19hdXhfY291bnRlcl9mbGFnczsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IGNkdV91c2FnZTsKKwl1OCBhZ2dfbWlzYzI7CisJdTE2IF9fY3FfbG9jYWxfY29tcF9pdHRfdmFsOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IF9fY3FfbG9jYWxfY29tcF9pdHRfdmFsOworCXU4IGFnZ19taXNjMjsKKwl1OCBjZHVfdXNhZ2U7CisjZW5kaWYKKwl1MzIgYWdnX21pc2M0OworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IGFnZ192YWwzX3RoOworCXU4IGFnZ192YWwzOworCXUxNiBhZ2dfbWlzYzM7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgYWdnX21pc2MzOworCXU4IGFnZ192YWwzOworCXU4IGFnZ192YWwzX3RoOworI2VuZGlmCisJdTMyIGFnZ192YWwxOworCXUzMiBhZ2dfbWlzYzRfdGg7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IGFnZ192YWwyX3RoOworCXUxNiBhZ2dfdmFsMjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBhZ2dfdmFsMjsKKwl1MTYgYWdnX3ZhbDJfdGg7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgX19yZXNlcnZlZDI7CisJdTggZGVjaXNpb25fcnVsZXM7CisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0FHR19WQUwyX1JVTEUgKDB4Nzw8MCkKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDJfUlVMRV9TSElGVCAwCisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDNfUlVMRSAoMHg3PDwzKQorI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0FHR19WQUwzX1JVTEVfU0hJRlQgMworI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfVkFMMl9BUk1fTl9GTEFHICgweDE8PDYpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0FHR19WQUwyX0FSTV9OX0ZMQUdfU0hJRlQgNgorI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX1JFU0VSVkVEMSAoMHgxPDw3KQorI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX1JFU0VSVkVEMV9TSElGVCA3CisJdTggZGVjaXNpb25fcnVsZV9lbmFibGVfYml0czsKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfSU5WX0NGX0VOICgweDE8PDApCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0lOVl9DRl9FTl9TSElGVCAwCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0NPTVBMRVRJT05fQ0ZfRU4gKDB4MTw8MSkKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRl9FTl9TSElGVCAxCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX1RYX0NGX0VOICgweDE8PDIpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX1RYX0NGX0VOX1NISUZUIDIKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9USU1FUl9DRl9FTiAoMHgxPDwzKQorI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX1RJTUVSX0NGX0VOX1NISUZUIDMKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9DUV9MT0NBTF9DT01QX0NGX0VOICgweDE8PDQpCisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQ1FfTE9DQUxfQ09NUF9DRl9FTl9TSElGVCA0CisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUVVFVUVTX0ZMVVNIX1EwX0NGX0VOICgweDE8PDUpCisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUVVFVUVTX0ZMVVNIX1EwX0NGX0VOX1NISUZUIDUKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVgzX0NGX0VOICgweDE8PDYpCisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYM19DRl9FTl9TSElGVCA2CisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRFFfQ0ZfRU4gKDB4MTw8NykKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9EUV9DRl9FTl9TSElGVCA3CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1OCBkZWNpc2lvbl9ydWxlX2VuYWJsZV9iaXRzOworI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9JTlZfQ0ZfRU4gKDB4MTw8MCkKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfSU5WX0NGX0VOX1NISUZUIDAKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRl9FTiAoMHgxPDwxKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9DT01QTEVUSU9OX0NGX0VOX1NISUZUIDEKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVFhfQ0ZfRU4gKDB4MTw8MikKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVFhfQ0ZfRU5fU0hJRlQgMgorI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX1RJTUVSX0NGX0VOICgweDE8PDMpCisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVElNRVJfQ0ZfRU5fU0hJRlQgMworI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0NRX0xPQ0FMX0NPTVBfQ0ZfRU4gKDB4MTw8NCkKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9DUV9MT0NBTF9DT01QX0NGX0VOX1NISUZUIDQKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9RVUVVRVNfRkxVU0hfUTBfQ0ZfRU4gKDB4MTw8NSkKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9RVUVVRVNfRkxVU0hfUTBfQ0ZfRU5fU0hJRlQgNQorI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDNfQ0ZfRU4gKDB4MTw8NikKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVgzX0NGX0VOX1NISUZUIDYKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9EUV9DRl9FTiAoMHgxPDw3KQorI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0RRX0NGX0VOX1NISUZUIDcKKwl1OCBkZWNpc2lvbl9ydWxlczsKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDJfUlVMRSAoMHg3PDwwKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfVkFMMl9SVUxFX1NISUZUIDAKKyNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfVkFMM19SVUxFICgweDc8PDMpCisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDNfUlVMRV9TSElGVCAzCisjZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0FHR19WQUwyX0FSTV9OX0ZMQUcgKDB4MTw8NikKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDJfQVJNX05fRkxBR19TSElGVCA2CisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUkVTRVJWRUQxICgweDE8PDcpCisjZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUkVTRVJWRUQxX1NISUZUIDcKKwl1MTYgX19yZXNlcnZlZDI7CisjZW5kaWYKIH07CiAKKwogLyoKICAqIFRoZSBmY29lIGFnZ3JlZ2F0aXZlIGNvbnRleHQgc2VjdGlvbiBvZiBYc3Rvcm0KICAqLwpAQCAtMTI3Miw4ICsxMzY2LDggQEAKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRUQ1MV9TSElGVCAwCiAjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FDS19UT19GRV9VUERBVEVEICgweDM8PDIpCiAjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FDS19UT19GRV9VUERBVEVEX1NISUZUIDIKLSNkZWZpbmUgWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1BCRl9UWF9TRVFfQUNLX0NGICgweDM8PDQpCi0jZGVmaW5lIFhTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9QQkZfVFhfU0VRX0FDS19DRl9TSElGVCA0CisjZGVmaW5lIFhTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9TSURFQkFORF9TRU5UX0NGICgweDM8PDQpCisjZGVmaW5lIFhTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9TSURFQkFORF9TRU5UX0NGX1NISUZUIDQKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRURfQ0xFQVJfREFfVElNRVJfRU4gKDB4MTw8NikKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRURfQ0xFQVJfREFfVElNRVJfRU5fU0hJRlQgNgogI2RlZmluZSBfX1hTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9SRVNFUlZFRF9EQV9FWFBJUkFUSU9OX0ZMQUcgKDB4MTw8NykKQEAgLTEyODgsMjAgKzEzODIsMjAgQEAKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRUQ1MV9TSElGVCAwCiAjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FDS19UT19GRV9VUERBVEVEICgweDM8PDIpCiAjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FDS19UT19GRV9VUERBVEVEX1NISUZUIDIKLSNkZWZpbmUgWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1BCRl9UWF9TRVFfQUNLX0NGICgweDM8PDQpCi0jZGVmaW5lIFhTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9QQkZfVFhfU0VRX0FDS19DRl9TSElGVCA0CisjZGVmaW5lIFhTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9TSURFQkFORF9TRU5UX0NGICgweDM8PDQpCisjZGVmaW5lIFhTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9TSURFQkFORF9TRU5UX0NGX1NISUZUIDQKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRURfQ0xFQVJfREFfVElNRVJfRU4gKDB4MTw8NikKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRURfQ0xFQVJfREFfVElNRVJfRU5fU0hJRlQgNgogI2RlZmluZSBfX1hTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9SRVNFUlZFRF9EQV9FWFBJUkFUSU9OX0ZMQUcgKDB4MTw8NykKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRURfREFfRVhQSVJBVElPTl9GTEFHX1NISUZUIDcKICNlbmRpZgotCXUzMiBfX3Rhc2tfYWRkcl9sbzsKLQl1MzIgX190YXNrX2FkZHJfaGk7CisJdTMyIHNuZF9ueHQ7CisJdTMyIHR4X3duZDsKIAl1MzIgX19yZXNlcnZlZDU1OwotCXUzMiBfX3R4X3Byb2RzOworCXUzMiBsb2NhbF9hZHZfd25kOwogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQogCXU4IF9fYWdnX3ZhbDhfdGg7Ci0JdTggX19hZ2dfdmFsODsKKwl1OCBfX3R4X2Rlc3Q7CiAJdTE2IHRjcF9hZ2dfdmFyczI7CiAjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1JFU0VSVkVENTcgKDB4MTw8MCkKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRUQ1N19TSElGVCAwCkBAIC0xMzE3LDggKzE0MTEsOCBAQAogI2RlZmluZSBfX1hTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9SRVNFUlZFRDYwX1NISUZUIDUKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRURfQUNLX1RPX0ZFX1VQREFURURfRU4gKDB4MTw8NikKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRURfQUNLX1RPX0ZFX1VQREFURURfRU5fU0hJRlQgNgotI2RlZmluZSBYU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUEJGX1RYX1NFUV9BQ0tfQ0ZfRU4gKDB4MTw8NykKLSNkZWZpbmUgWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1BCRl9UWF9TRVFfQUNLX0NGX0VOX1NISUZUIDcKKyNkZWZpbmUgWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1NJREVCQU5EX1NFTlRfQ0ZfRU4gKDB4MTw8NykKKyNkZWZpbmUgWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1NJREVCQU5EX1NFTlRfQ0ZfRU5fU0hJRlQgNwogI2RlZmluZSBfX1hTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9SRVNFUlZFRF9UWF9GSU5fRkxBR19FTiAoMHgxPDw4KQogI2RlZmluZSBfX1hTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9SRVNFUlZFRF9UWF9GSU5fRkxBR19FTl9TSElGVCA4CiAjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDFfRkxBRyAoMHgxPDw5KQpAQCAtMTMyNyw4ICsxNDIxLDggQEAKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fU0VUX1JUT19DRl9TSElGVCAxMAogI2RlZmluZSBfX1hTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9UU19UT19FQ0hPX1VQREFURURfQ0YgKDB4Mzw8MTIpCiAjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1RTX1RPX0VDSE9fVVBEQVRFRF9DRl9TSElGVCAxMgotI2RlZmluZSBfX1hTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVg4X0NGICgweDM8PDE0KQotI2RlZmluZSBfX1hTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVg4X0NGX1NISUZUIDE0CisjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1RYX0RFU1RfVVBEQVRFRF9DRiAoMHgzPDwxNCkKKyNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fVFhfREVTVF9VUERBVEVEX0NGX1NISUZUIDE0CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKIAl1MTYgdGNwX2FnZ192YXJzMjsKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRUQ1NyAoMHgxPDwwKQpAQCAtMTM0NSw4ICsxNDM5LDggQEAKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRUQ2MF9TSElGVCA1CiAjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1JFU0VSVkVEX0FDS19UT19GRV9VUERBVEVEX0VOICgweDE8PDYpCiAjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1JFU0VSVkVEX0FDS19UT19GRV9VUERBVEVEX0VOX1NISUZUIDYKLSNkZWZpbmUgWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1BCRl9UWF9TRVFfQUNLX0NGX0VOICgweDE8PDcpCi0jZGVmaW5lIFhTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9QQkZfVFhfU0VRX0FDS19DRl9FTl9TSElGVCA3CisjZGVmaW5lIFhTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9TSURFQkFORF9TRU5UX0NGX0VOICgweDE8PDcpCisjZGVmaW5lIFhTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9TSURFQkFORF9TRU5UX0NGX0VOX1NISUZUIDcKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRURfVFhfRklOX0ZMQUdfRU4gKDB4MTw8OCkKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRURfVFhfRklOX0ZMQUdfRU5fU0hJRlQgOAogI2RlZmluZSBfX1hTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0ZMQUcgKDB4MTw8OSkKQEAgLTEzNTUsOSArMTQ0OSw5IEBACiAjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1NFVF9SVE9fQ0ZfU0hJRlQgMTAKICNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fVFNfVE9fRUNIT19VUERBVEVEX0NGICgweDM8PDEyKQogI2RlZmluZSBfX1hTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9UU19UT19FQ0hPX1VQREFURURfQ0ZfU0hJRlQgMTIKLSNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYOF9DRiAoMHgzPDwxNCkKLSNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYOF9DRl9TSElGVCAxNAotCXU4IF9fYWdnX3ZhbDg7CisjZGVmaW5lIF9fWFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1RYX0RFU1RfVVBEQVRFRF9DRiAoMHgzPDwxNCkKKyNkZWZpbmUgX19YU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fVFhfREVTVF9VUERBVEVEX0NGX1NISUZUIDE0CisJdTggX190eF9kZXN0OwogCXU4IF9fYWdnX3ZhbDhfdGg7CiAjZW5kaWYKIAl1MzIgX19zcV9iYXNlX2FkZHJfbG87CkBAIC0xNTkxLDkgKzE2ODUsOSBAQAogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQogCXU4IF9fcmVzZXJ2ZWQxOwogCXU4IF9fYWdnX3ZhbDZfdGg7Ci0JdTE2IF9fY29uZnFfdHhfcHJvZDsKKwl1MTYgX19hZ2dfdmFsOTsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBfX2NvbmZxX3R4X3Byb2Q7CisJdTE2IF9fYWdnX3ZhbDk7CiAJdTggX19hZ2dfdmFsNl90aDsKIAl1OCBfX3Jlc2VydmVkMTsKICNlbmRpZgpAQCAtMTYwNSwxNiArMTY5OSwxNiBAQAogCXUxNiBjb25mcV9jb25zOwogI2VuZGlmCiAJdTMyIGFnZ192YXJzODsKLSNkZWZpbmUgX19YU1RPUk1fRkNPRV9BR19DT05URVhUX0NBQ0hFX1dRRV9JRFggKDB4RkZGRkZGPDwwKQotI2RlZmluZSBfX1hTVE9STV9GQ09FX0FHX0NPTlRFWFRfQ0FDSEVfV1FFX0lEWF9TSElGVCAwCisjZGVmaW5lIFhTVE9STV9GQ09FX0FHX0NPTlRFWFRfQUdHX01JU0MyICgweEZGRkZGRjw8MCkKKyNkZWZpbmUgWFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BR0dfTUlTQzJfU0hJRlQgMAogI2RlZmluZSBYU1RPUk1fRkNPRV9BR19DT05URVhUX0FHR19NSVNDMyAoMHhGRjw8MjQpCiAjZGVmaW5lIFhTVE9STV9GQ09FX0FHX0NPTlRFWFRfQUdHX01JU0MzX1NISUZUIDI0CiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IG94X2lkOworCXUxNiBhZ2dfbWlzYzA7CiAJdTE2IHNxX3Byb2Q7CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKIAl1MTYgc3FfcHJvZDsKLQl1MTYgb3hfaWQ7CisJdTE2IGFnZ19taXNjMDsKICNlbmRpZgogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQogCXU4IGFnZ192YWwzOwpAQCAtMTYyOCw5ODYgKzE3MjIsNTEgQEAKIAl1OCBhZ2dfdmFsMzsKICNlbmRpZgogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBfX3BiZl90eF9zZXFfYWNrOworCXUxNiBfX2FnZ19taXNjMTsKIAl1MTYgYWdnX2xpbWl0MTsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQogCXUxNiBhZ2dfbGltaXQxOwotCXUxNiBfX3BiZl90eF9zZXFfYWNrOworCXUxNiBfX2FnZ19taXNjMTsKICNlbmRpZgogCXUzMiBjb21wbGV0aW9uX3NlcTsKIAl1MzIgY29uZnFfcGJsX2Jhc2VfbG87CiAJdTMyIGNvbmZxX3BibF9iYXNlX2hpOwogfTsKIAotLyoKLSAqIFRoZSBmY29lIGV4dHJhIGFnZ3JlZ2F0aXZlIGNvbnRleHQgc2VjdGlvbiBvZiBUc3Rvcm0KLSAqLwotc3RydWN0IHRzdG9ybV9mY29lX2V4dHJhX2FnX2NvbnRleHRfc2VjdGlvbiB7Ci0JdTMyIF9fYWdnX3ZhbDE7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggX190Y3BfYWdnX3ZhcnMyOwotCXU4IF9fYWdnX3ZhbDM7Ci0JdTE2IF9fYWdnX3ZhbDI7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgX19hZ2dfdmFsMjsKLQl1OCBfX2FnZ192YWwzOwotCXU4IF9fdGNwX2FnZ192YXJzMjsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBfX2FnZ192YWw1OwotCXU4IF9fYWdnX3ZhbDY7Ci0JdTggX190Y3BfYWdnX3ZhcnMzOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggX190Y3BfYWdnX3ZhcnMzOwotCXU4IF9fYWdnX3ZhbDY7Ci0JdTE2IF9fYWdnX3ZhbDU7Ci0jZW5kaWYKLQl1MzIgX19sY3FfcHJvZDsKLQl1MzIgcnR0X3NlcTsKLQl1MzIgcnR0X3RpbWU7Ci0JdTMyIF9fcmVzZXJ2ZWQ2NjsKLQl1MzIgd25kX3JpZ2h0X2VkZ2U7Ci0JdTMyIHRjcF9hZ2dfdmFyczE7Ci0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9GSU5fU0VOVF9GTEFHICgweDE8PDApCi0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9GSU5fU0VOVF9GTEFHX1NISUZUIDAKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0xBU1RfUEFDS0VUX0ZJTl9GTEFHICgweDE8PDEpCi0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9MQVNUX1BBQ0tFVF9GSU5fRkxBR19TSElGVCAxCi0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9XTkRfVVBEX0NGICgweDM8PDIpCi0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9XTkRfVVBEX0NGX1NISUZUIDIKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1RJTUVPVVRfQ0YgKDB4Mzw8NCkKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1RJTUVPVVRfQ0ZfU0hJRlQgNAotI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fV05EX1VQRF9DRl9FTiAoMHgxPDw2KQotI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fV05EX1VQRF9DRl9FTl9TSElGVCA2Ci0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9USU1FT1VUX0NGX0VOICgweDE8PDcpCi0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9USU1FT1VUX0NGX0VOX1NISUZUIDcKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1JFVFJBTlNNSVRfU0VRX0VOICgweDE8PDgpCi0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9SRVRSQU5TTUlUX1NFUV9FTl9TSElGVCA4Ci0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0xDUV9TTkRfRU4gKDB4MTw8OSkKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fTENRX1NORF9FTl9TSElGVCA5Ci0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0ZMQUcgKDB4MTw8MTApCi0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0ZMQUdfU0hJRlQgMTAKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfRkxBRyAoMHgxPDwxMSkKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfRkxBR19TSElGVCAxMQotI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMV9DRl9FTiAoMHgxPDwxMikKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDFfQ0ZfRU5fU0hJRlQgMTIKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfQ0ZfRU4gKDB4MTw8MTMpCi0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgyX0NGX0VOX1NISUZUIDEzCi0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0NGICgweDM8PDE0KQotI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMV9DRl9TSElGVCAxNAotI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMl9DRiAoMHgzPDwxNikKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfQ0ZfU0hJRlQgMTYKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1RYX0JMT0NLRUQgKDB4MTw8MTgpCi0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9UWF9CTE9DS0VEX1NISUZUIDE4Ci0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDEwX0NGX0VOICgweDE8PDE5KQotI2RlZmluZSBfX1RTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxMF9DRl9FTl9TSElGVCAxOQotI2RlZmluZSBfX1RTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxMV9DRl9FTiAoMHgxPDwyMCkKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMTFfQ0ZfRU5fU0hJRlQgMjAKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fQVVYMTJfQ0ZfRU4gKDB4MTw8MjEpCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDEyX0NGX0VOX1NISUZUIDIxCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1JFU0VSVkVEMSAoMHgzPDwyMikKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRUQxX1NISUZUIDIyCi0jZGVmaW5lIFRTVE9STV9GQ09FX0VYVFJBX0FHX0NPTlRFWFRfU0VDVElPTl9SRVRSQU5TTUlUX1BFTkRfU0VRICgweEY8PDI0KQotI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVUUkFOU01JVF9QRU5EX1NFUV9TSElGVCAyNAotI2RlZmluZSBUU1RPUk1fRkNPRV9FWFRSQV9BR19DT05URVhUX1NFQ1RJT05fUkVUUkFOU01JVF9ET05FX1NFUSAoMHhGPDwyOCkKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfRVhUUkFfQUdfQ09OVEVYVF9TRUNUSU9OX1JFVFJBTlNNSVRfRE9ORV9TRVFfU0hJRlQgMjgKLQl1MzIgc25kX21heDsKLQl1MzIgX19sY3FfY29uczsKLQl1MzIgX19yZXNlcnZlZDI7Ci19OwogCi0vKgotICogVGhlIGZjb2UgYWdncmVnYXRpdmUgY29udGV4dCBvZiBUc3Rvcm0KLSAqLwotc3RydWN0IHRzdG9ybV9mY29lX2FnX2NvbnRleHQgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiB1bHBfY3JlZGl0OwotCXU4IGFnZ192YXJzMTsKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0wICgweDE8PDApCi0jZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMF9TSElGVCAwCi0jZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMSAoMHgxPDwxKQotI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTFfU0hJRlQgMQotI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTIgKDB4MTw8MikKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yX1NISUZUIDIKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0zICgweDE8PDMpCi0jZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNM19TSElGVCAzCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9RVUVVRTBfRkxVU0hfQ0YgKDB4Mzw8NCkKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX1FVRVVFMF9GTFVTSF9DRl9TSElGVCA0Ci0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVgzX0ZMQUcgKDB4MTw8NikKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDNfRkxBR19TSElGVCA2Ci0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0ZMQUcgKDB4MTw8NykKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDRfRkxBR19TSElGVCA3Ci0JdTggc3RhdGU7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBzdGF0ZTsKLQl1OCBhZ2dfdmFyczE7Ci0jZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMCAoMHgxPDwwKQotI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTBfU0hJRlQgMAotI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTEgKDB4MTw8MSkKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0xX1NISUZUIDEKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yICgweDE8PDIpCi0jZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMl9TSElGVCAyCi0jZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMyAoMHgxPDwzKQotI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTNfU0hJRlQgMwotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfUVVFVUUwX0ZMVVNIX0NGICgweDM8PDQpCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9RVUVVRTBfRkxVU0hfQ0ZfU0hJRlQgNAotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYM19GTEFHICgweDE8PDYpCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVgzX0ZMQUdfU0hJRlQgNgotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNF9GTEFHICgweDE8PDcpCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0ZMQUdfU0hJRlQgNwotCXUxNiB1bHBfY3JlZGl0OwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IF9fYWdnX3ZhbDQ7Ci0JdTE2IGFnZ192YXJzMjsKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDVfRkxBRyAoMHgxPDwwKQotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNV9GTEFHX1NISUZUIDAKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDZfRkxBRyAoMHgxPDwxKQotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNl9GTEFHX1NISUZUIDEKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDRfQ0YgKDB4Mzw8MikKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDRfQ0ZfU0hJRlQgMgotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNV9DRiAoMHgzPDw0KQotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNV9DRl9TSElGVCA0Ci0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg2X0NGICgweDM8PDYpCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg2X0NGX1NISUZUIDYKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDdfQ0YgKDB4Mzw8OCkKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDdfQ0ZfU0hJRlQgOAotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYN19GTEFHICgweDE8PDEwKQotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYN19GTEFHX1NISUZUIDEwCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9RVUVVRTBfRkxVU0hfQ0ZfRU4gKDB4MTw8MTEpCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9RVUVVRTBfRkxVU0hfQ0ZfRU5fU0hJRlQgMTEKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0NGX0VOICgweDE8PDEyKQotI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDRfQ0ZfRU5fU0hJRlQgMTIKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg1X0NGX0VOICgweDE8PDEzKQotI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDVfQ0ZfRU5fU0hJRlQgMTMKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg2X0NGX0VOICgweDE8PDE0KQotI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDZfQ0ZfRU5fU0hJRlQgMTQKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg3X0NGX0VOICgweDE8PDE1KQotI2RlZmluZSBUU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDdfQ0ZfRU5fU0hJRlQgMTUKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBhZ2dfdmFyczI7Ci0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg1X0ZMQUcgKDB4MTw8MCkKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDVfRkxBR19TSElGVCAwCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg2X0ZMQUcgKDB4MTw8MSkKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDZfRkxBR19TSElGVCAxCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0NGICgweDM8PDIpCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0NGX1NISUZUIDIKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDVfQ0YgKDB4Mzw8NCkKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDVfQ0ZfU0hJRlQgNAotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNl9DRiAoMHgzPDw2KQotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNl9DRl9TSElGVCA2Ci0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg3X0NGICgweDM8PDgpCi0jZGVmaW5lIF9fVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg3X0NGX1NISUZUIDgKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDdfRkxBRyAoMHgxPDwxMCkKLSNkZWZpbmUgX19UU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDdfRkxBR19TSElGVCAxMAotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfUVVFVUUwX0ZMVVNIX0NGX0VOICgweDE8PDExKQotI2RlZmluZSBfX1RTVE9STV9GQ09FX0FHX0NPTlRFWFRfUVVFVUUwX0ZMVVNIX0NGX0VOX1NISUZUIDExCi0jZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNF9DRl9FTiAoMHgxPDwxMikKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg0X0NGX0VOX1NISUZUIDEyCi0jZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNV9DRl9FTiAoMHgxPDwxMykKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg1X0NGX0VOX1NISUZUIDEzCi0jZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYNl9DRl9FTiAoMHgxPDwxNCkKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg2X0NGX0VOX1NISUZUIDE0Ci0jZGVmaW5lIFRTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYN19DRl9FTiAoMHgxPDwxNSkKLSNkZWZpbmUgVFNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVg3X0NGX0VOX1NISUZUIDE1Ci0JdTE2IF9fYWdnX3ZhbDQ7Ci0jZW5kaWYKLQlzdHJ1Y3QgdHN0b3JtX2Zjb2VfZXh0cmFfYWdfY29udGV4dF9zZWN0aW9uIF9fZXh0cmFfc2VjdGlvbjsKLX07Ci0KLS8qCi0gKiBUaGUgZmNvZSBhZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIFVzdG9ybQotICovCi1zdHJ1Y3QgdXN0b3JtX2Zjb2VfYWdfY29udGV4dCB7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggX19hdXhfY291bnRlcl9mbGFnczsKLQl1OCBhZ2dfdmFyczI7Ci0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfVFhfQ0YgKDB4Mzw8MCkKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9UWF9DRl9TSElGVCAwCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9USU1FUl9DRiAoMHgzPDwyKQotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfVElNRVJfQ0ZfU0hJRlQgMgotI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0FHR19NSVNDNF9SVUxFICgweDc8PDQpCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQUdHX01JU0M0X1JVTEVfU0hJRlQgNAotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfQUdHX1ZBTDJfTUFTSyAoMHgxPDw3KQotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfQUdHX1ZBTDJfTUFTS19TSElGVCA3Ci0JdTggYWdnX3ZhcnMxOwotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMCAoMHgxPDwwKQotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMF9TSElGVCAwCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMSAoMHgxPDwxKQotI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTFfU0hJRlQgMQotI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTIgKDB4MTw8MikKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yX1NISUZUIDIKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0zICgweDE8PDMpCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNM19TSElGVCAzCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfSU5WX0NGICgweDM8PDQpCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfSU5WX0NGX1NISUZUIDQKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9DT01QTEVUSU9OX0NGICgweDM8PDYpCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRl9TSElGVCA2Ci0JdTggc3RhdGU7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBzdGF0ZTsKLQl1OCBhZ2dfdmFyczE7Ci0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0wICgweDE8PDApCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0wX1NISUZUIDAKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0xICgweDE8PDEpCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMV9TSElGVCAxCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMiAoMHgxPDwyKQotI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTJfU0hJRlQgMgotI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0VYSVNUU19JTl9RTTMgKDB4MTw8MykKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0zX1NISUZUIDMKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9JTlZfQ0YgKDB4Mzw8NCkKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9JTlZfQ0ZfU0hJRlQgNAotI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NPTVBMRVRJT05fQ0YgKDB4Mzw8NikKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9DT01QTEVUSU9OX0NGX1NISUZUIDYKLQl1OCBhZ2dfdmFyczI7Ci0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfVFhfQ0YgKDB4Mzw8MCkKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9UWF9DRl9TSElGVCAwCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9USU1FUl9DRiAoMHgzPDwyKQotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfVElNRVJfQ0ZfU0hJRlQgMgotI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0FHR19NSVNDNF9SVUxFICgweDc8PDQpCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQUdHX01JU0M0X1JVTEVfU0hJRlQgNAotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfQUdHX1ZBTDJfTUFTSyAoMHgxPDw3KQotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfQUdHX1ZBTDJfTUFTS19TSElGVCA3Ci0JdTggX19hdXhfY291bnRlcl9mbGFnczsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IGNkdV91c2FnZTsKLQl1OCBhZ2dfbWlzYzI7Ci0JdTE2IHBiZl90eF9zZXFfYWNrOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHBiZl90eF9zZXFfYWNrOwotCXU4IGFnZ19taXNjMjsKLQl1OCBjZHVfdXNhZ2U7Ci0jZW5kaWYKLQl1MzIgYWdnX21pc2M0OwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IGFnZ192YWwzX3RoOwotCXU4IGFnZ192YWwzOwotCXUxNiBhZ2dfbWlzYzM7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgYWdnX21pc2MzOwotCXU4IGFnZ192YWwzOwotCXU4IGFnZ192YWwzX3RoOwotI2VuZGlmCi0JdTMyIGV4cGlyZWRfdGFza19pZDsKLQl1MzIgYWdnX21pc2M0X3RoOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBjcV9wcm9kOwotCXUxNiBjcV9jb25zOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGNxX2NvbnM7Ci0JdTE2IGNxX3Byb2Q7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgX19yZXNlcnZlZDI7Ci0JdTggZGVjaXNpb25fcnVsZXM7Ci0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQ1FfREVDX1JVTEUgKDB4Nzw8MCkKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9DUV9ERUNfUlVMRV9TSElGVCAwCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BR0dfVkFMM19SVUxFICgweDc8PDMpCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BR0dfVkFMM19SVUxFX1NISUZUIDMKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9DUV9BUk1fTl9GTEFHICgweDE8PDYpCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQ1FfQVJNX05fRkxBR19TSElGVCA2Ci0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9SRVNFUlZFRDEgKDB4MTw8NykKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1JFU0VSVkVEMV9TSElGVCA3Ci0JdTggZGVjaXNpb25fcnVsZV9lbmFibGVfYml0czsKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1JFU0VSVkVEX0lOVl9DRl9FTiAoMHgxPDwwKQotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfUkVTRVJWRURfSU5WX0NGX0VOX1NISUZUIDAKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9DT01QTEVUSU9OX0NGX0VOICgweDE8PDEpCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRl9FTl9TSElGVCAxCi0jZGVmaW5lIFVTVE9STV9GQ09FX0FHX0NPTlRFWFRfVFhfQ0ZfRU4gKDB4MTw8MikKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9UWF9DRl9FTl9TSElGVCAyCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9USU1FUl9DRl9FTiAoMHgxPDwzKQotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfVElNRVJfQ0ZfRU5fU0hJRlQgMwotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYMV9DRl9FTiAoMHgxPDw0KQotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfQVVYMV9DRl9FTl9TSElGVCA0Ci0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9RVUVVRTBfQ0ZfRU4gKDB4MTw8NSkKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1FVRVVFMF9DRl9FTl9TSElGVCA1Ci0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVgzX0NGX0VOICgweDE8PDYpCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVgzX0NGX0VOX1NISUZUIDYKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0RRX0NGX0VOICgweDE8PDcpCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9EUV9DRl9FTl9TSElGVCA3Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBkZWNpc2lvbl9ydWxlX2VuYWJsZV9iaXRzOwotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfUkVTRVJWRURfSU5WX0NGX0VOICgweDE8PDApCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9SRVNFUlZFRF9JTlZfQ0ZfRU5fU0hJRlQgMAotI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NPTVBMRVRJT05fQ0ZfRU4gKDB4MTw8MSkKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9DT01QTEVUSU9OX0NGX0VOX1NISUZUIDEKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9UWF9DRl9FTiAoMHgxPDwyKQotI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX1RYX0NGX0VOX1NISUZUIDIKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1RJTUVSX0NGX0VOICgweDE8PDMpCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9USU1FUl9DRl9FTl9TSElGVCAzCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVgxX0NGX0VOICgweDE8PDQpCi0jZGVmaW5lIF9fVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9BVVgxX0NGX0VOX1NISUZUIDQKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1FVRVVFMF9DRl9FTiAoMHgxPDw1KQotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfUVVFVUUwX0NGX0VOX1NISUZUIDUKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDNfQ0ZfRU4gKDB4MTw8NikKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FVWDNfQ0ZfRU5fU0hJRlQgNgotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfRFFfQ0ZfRU4gKDB4MTw8NykKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0RRX0NGX0VOX1NISUZUIDcKLQl1OCBkZWNpc2lvbl9ydWxlczsKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9DUV9ERUNfUlVMRSAoMHg3PDwwKQotI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NRX0RFQ19SVUxFX1NISUZUIDAKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FHR19WQUwzX1JVTEUgKDB4Nzw8MykKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX0FHR19WQUwzX1JVTEVfU0hJRlQgMwotI2RlZmluZSBVU1RPUk1fRkNPRV9BR19DT05URVhUX0NRX0FSTV9OX0ZMQUcgKDB4MTw8NikKLSNkZWZpbmUgVVNUT1JNX0ZDT0VfQUdfQ09OVEVYVF9DUV9BUk1fTl9GTEFHX1NISUZUIDYKLSNkZWZpbmUgX19VU1RPUk1fRkNPRV9BR19DT05URVhUX1JFU0VSVkVEMSAoMHgxPDw3KQotI2RlZmluZSBfX1VTVE9STV9GQ09FX0FHX0NPTlRFWFRfUkVTRVJWRUQxX1NISUZUIDcKLQl1MTYgX19yZXNlcnZlZDI7Ci0jZW5kaWYKLX07Ci0KLS8qCi0gKiBFdGhlcm5ldCBjb250ZXh0IHNlY3Rpb24KLSAqLwotc3RydWN0IHhzdG9ybV9mY29lX2V0aF9jb250ZXh0X3NlY3Rpb24gewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IHJlbW90ZV9hZGRyXzQ7Ci0JdTggcmVtb3RlX2FkZHJfNTsKLQl1OCBsb2NhbF9hZGRyXzA7Ci0JdTggbG9jYWxfYWRkcl8xOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggbG9jYWxfYWRkcl8xOwotCXU4IGxvY2FsX2FkZHJfMDsKLQl1OCByZW1vdGVfYWRkcl81OwotCXU4IHJlbW90ZV9hZGRyXzQ7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCByZW1vdGVfYWRkcl8wOwotCXU4IHJlbW90ZV9hZGRyXzE7Ci0JdTggcmVtb3RlX2FkZHJfMjsKLQl1OCByZW1vdGVfYWRkcl8zOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggcmVtb3RlX2FkZHJfMzsKLQl1OCByZW1vdGVfYWRkcl8yOwotCXU4IHJlbW90ZV9hZGRyXzE7Ci0JdTggcmVtb3RlX2FkZHJfMDsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiByZXNlcnZlZF92bGFuX3R5cGU7Ci0JdTE2IHBhcmFtczsKLSNkZWZpbmUgWFNUT1JNX0ZDT0VfRVRIX0NPTlRFWFRfU0VDVElPTl9WTEFOX0lEICgweEZGRjw8MCkKLSNkZWZpbmUgWFNUT1JNX0ZDT0VfRVRIX0NPTlRFWFRfU0VDVElPTl9WTEFOX0lEX1NISUZUIDAKLSNkZWZpbmUgWFNUT1JNX0ZDT0VfRVRIX0NPTlRFWFRfU0VDVElPTl9DRkkgKDB4MTw8MTIpCi0jZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fQ0ZJX1NISUZUIDEyCi0jZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fUFJJT1JJVFkgKDB4Nzw8MTMpCi0jZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fUFJJT1JJVFlfU0hJRlQgMTMKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBwYXJhbXM7Ci0jZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fVkxBTl9JRCAoMHhGRkY8PDApCi0jZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fVkxBTl9JRF9TSElGVCAwCi0jZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fQ0ZJICgweDE8PDEyKQotI2RlZmluZSBYU1RPUk1fRkNPRV9FVEhfQ09OVEVYVF9TRUNUSU9OX0NGSV9TSElGVCAxMgotI2RlZmluZSBYU1RPUk1fRkNPRV9FVEhfQ09OVEVYVF9TRUNUSU9OX1BSSU9SSVRZICgweDc8PDEzKQotI2RlZmluZSBYU1RPUk1fRkNPRV9FVEhfQ09OVEVYVF9TRUNUSU9OX1BSSU9SSVRZX1NISUZUIDEzCi0JdTE2IHJlc2VydmVkX3ZsYW5fdHlwZTsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IGxvY2FsX2FkZHJfMjsKLQl1OCBsb2NhbF9hZGRyXzM7Ci0JdTggbG9jYWxfYWRkcl80OwotCXU4IGxvY2FsX2FkZHJfNTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IGxvY2FsX2FkZHJfNTsKLQl1OCBsb2NhbF9hZGRyXzQ7Ci0JdTggbG9jYWxfYWRkcl8zOwotCXU4IGxvY2FsX2FkZHJfMjsKLSNlbmRpZgotfTsKLQotLyoKLSAqIEZsYWdzIHVzZWQgaW4gRkNvRSBjb250ZXh0IHNlY3Rpb24gLSAxIGJ5dGUKLSAqLwotc3RydWN0IHhzdG9ybV9mY29lX2NvbnRleHRfZmxhZ3MgewotCXU4IGZsYWdzOwotI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfUFJPQ19RICgweDM8PDApCi0jZGVmaW5lIFhTVE9STV9GQ09FX0NPTlRFWFRfRkxBR1NfQl9QUk9DX1FfU0hJRlQgMAotI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfTUlEX1NFUSAoMHgxPDwyKQotI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfTUlEX1NFUV9TSElGVCAyCi0jZGVmaW5lIFhTVE9STV9GQ09FX0NPTlRFWFRfRkxBR1NfQl9FWENIQU5HRV9DTEVBTlVQX0RFRkZFUkVEICgweDE8PDMpCi0jZGVmaW5lIFhTVE9STV9GQ09FX0NPTlRFWFRfRkxBR1NfQl9FWENIQU5HRV9DTEVBTlVQX0RFRkZFUkVEX1NISUZUIDMKLSNkZWZpbmUgWFNUT1JNX0ZDT0VfQ09OVEVYVF9GTEFHU19CX1JFQ19TVVBQT1JUICgweDE8PDQpCi0jZGVmaW5lIFhTVE9STV9GQ09FX0NPTlRFWFRfRkxBR1NfQl9SRUNfU1VQUE9SVF9TSElGVCA0Ci0jZGVmaW5lIFhTVE9STV9GQ09FX0NPTlRFWFRfRkxBR1NfQl9TUV9UT0dHTEUgKDB4MTw8NSkKLSNkZWZpbmUgWFNUT1JNX0ZDT0VfQ09OVEVYVF9GTEFHU19CX1NRX1RPR0dMRV9TSElGVCA1Ci0jZGVmaW5lIFhTVE9STV9GQ09FX0NPTlRFWFRfRkxBR1NfQl9YRlJRX1RPR0dMRSAoMHgxPDw2KQotI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfWEZSUV9UT0dHTEVfU0hJRlQgNgotI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfQUJUU19ERUZGRVJFRCAoMHgxPDw3KQotI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfQUJUU19ERUZGRVJFRF9TSElGVCA3Ci19OwotCi0vKgotICogRkNvRSBTUSBlbGVtZW50Ci0gKi8KLXN0cnVjdCBmY29lX3NxZSB7Ci0JdTE2IHdxZTsKLSNkZWZpbmUgRkNPRV9TUUVfVEFTS19JRCAoMHg3RkZGPDwwKQotI2RlZmluZSBGQ09FX1NRRV9UQVNLX0lEX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9TUUVfVE9HR0xFX0JJVCAoMHgxPDwxNSkKLSNkZWZpbmUgRkNPRV9TUUVfVE9HR0xFX0JJVF9TSElGVCAxNQotfTsKLQotLyoKLSAqIEZDb0UgWEZSUSBlbGVtZW50Ci0gKi8KLXN0cnVjdCBmY29lX3hmcnFlIHsKLQl1MTYgd3FlOwotI2RlZmluZSBGQ09FX1hGUlFFX1RBU0tfSUQgKDB4N0ZGRjw8MCkKLSNkZWZpbmUgRkNPRV9YRlJRRV9UQVNLX0lEX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9YRlJRRV9UT0dHTEVfQklUICgweDE8PDE1KQotI2RlZmluZSBGQ09FX1hGUlFFX1RPR0dMRV9CSVRfU0hJRlQgMTUKLX07Ci0KLS8qCi0gKiBGQ29FIFNRXFhGUlEgZWxlbWVudAotICovCi1zdHJ1Y3QgZmNvZV9jYWNoZWRfd3FlIHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQlzdHJ1Y3QgZmNvZV94ZnJxZSB4ZnJxZTsKLQlzdHJ1Y3QgZmNvZV9zcWUgc3FlOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0Jc3RydWN0IGZjb2Vfc3FlIHNxZTsKLQlzdHJ1Y3QgZmNvZV94ZnJxZSB4ZnJxZTsKLSNlbmRpZgotfTsKLQotc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnlfdHhfb25seSB7Ci0JdW5pb24gZmNvZV9zZ2xfY3R4IHNnbF9jdHg7Ci19OwotCi1zdHJ1Y3QgeHN0b3JtX2Zjb2VfdGFza19jdHhfZW50cnlfcmQgewotCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3R4X29ubHkgdHhfd3I7Ci0Jc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnlfdHh3cl9yeHJkIHR4X3dyX3J4X3JkOwotCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3R4X3J4X2NtbiBjbW47Ci0Jc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnlfcnh3cl90eHJkIHJ4X3dyX3R4X3JkOwotfTsKLQotLyoKLSAqIENhY2hlZCBTR0VzCi0gKi8KLXN0cnVjdCBjb21tb25fZmNvZV9zZ2wgewotCXN0cnVjdCBmY29lX2JkX2N0eCBzZ2VbMl07Ci19OwotCi0vKgotICogRkNQX0RBVEEgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgdHJhbnNtaXNzaW9uCi0gKi8KLXN0cnVjdCB4c3Rvcm1fZmNvZV9mY3BfZGF0YSB7Ci0JdTMyIGlvX3JlbTsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgY2FjaGVkX3NnZV9vZmY7Ci0JdTggY2FjaGVkX251bV9zZ2VzOwotCXU4IGNhY2hlZF9zZ2VfaWR4OwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggY2FjaGVkX3NnZV9pZHg7Ci0JdTggY2FjaGVkX251bV9zZ2VzOwotCXUxNiBjYWNoZWRfc2dlX29mZjsKLSNlbmRpZgotCXN0cnVjdCBjb21tb25fZmNvZV9zZ2wgY2FjaGVkX3NnbDsKLX07Ci0KLS8qCi0gKiBGQ29FIGNvbnRleHQgc2VjdGlvbgotICovCi1zdHJ1Y3QgeHN0b3JtX2Zjb2VfY29udGV4dF9zZWN0aW9uIHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCB2bGFuX2ZsYWc7Ci0JdTggc19pZFszXTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IHNfaWRbM107Ci0JdTggdmxhbl9mbGFnOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggZnVuY19pZDsKLQl1OCBkX2lkWzNdOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggZF9pZFszXTsKLQl1OCBmdW5jX2lkOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHNxX3hmcnFfbGNxX2NvbmZxX3NpemU7Ci0JdTE2IHR4X21heF9mY19wYXlfbGVuOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHR4X21heF9mY19wYXlfbGVuOwotCXUxNiBzcV94ZnJxX2xjcV9jb25mcV9zaXplOwotI2VuZGlmCi0JdTMyIGxjcV9wcm9kOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IHBvcnRfaWQ7Ci0JdTggdHhfbWF4X2NvbmNfc2Vxc19jMzsKLQl1OCBzZXFfaWQ7Ci0Jc3RydWN0IHhzdG9ybV9mY29lX2NvbnRleHRfZmxhZ3MgdHhfZmxhZ3M7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQlzdHJ1Y3QgeHN0b3JtX2Zjb2VfY29udGV4dF9mbGFncyB0eF9mbGFnczsKLQl1OCBzZXFfaWQ7Ci0JdTggdHhfbWF4X2NvbmNfc2Vxc19jMzsKLQl1OCBwb3J0X2lkOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHZlcmlmeV90eF9zZXE7Ci0JdTggZnVuY19tb2RlOwotCXU4IHZuaWNfaWQ7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCB2bmljX2lkOwotCXU4IGZ1bmNfbW9kZTsKLQl1MTYgdmVyaWZ5X3R4X3NlcTsKLSNlbmRpZgotCXN0cnVjdCByZWdwYWlyIGNvbmZxX2N1cnJfcGFnZV9hZGRyOwotCXN0cnVjdCBmY29lX2NhY2hlZF93cWUgY2FjaGVkX3dxZVs4XTsKLQlzdHJ1Y3QgcmVncGFpciBsY3FfYmFzZV9hZGRyOwotCXN0cnVjdCB4c3Rvcm1fZmNvZV90YXNrX2N0eF9lbnRyeV9yZCB0Y2U7Ci0Jc3RydWN0IHhzdG9ybV9mY29lX2ZjcF9kYXRhIGZjcF9kYXRhOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBmY29lX3R4X3N0YXRfcGFyYW1zX3JhbV9hZGRyOwotCXUxNiBjbW5nX3BvcnRfcmFtX2FkZHI7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgY21uZ19wb3J0X3JhbV9hZGRyOwotCXUxNiBmY29lX3R4X3N0YXRfcGFyYW1zX3JhbV9hZGRyOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggZmNwX2NtZF9wYl9jbWRfc2l6ZTsKLQl1OCBldGhfaGRyX3NpemU7Ci0JdTE2IHBiZl9hZGRyOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHBiZl9hZGRyOwotCXU4IGV0aF9oZHJfc2l6ZTsKLQl1OCBmY3BfY21kX3BiX2NtZF9zaXplOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggcmVzZXJ2ZWQyWzJdOwotCXU4IGNvczsKLQl1OCBkY2JfdmVyc2lvbjsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IGRjYl92ZXJzaW9uOwotCXU4IGNvczsKLQl1OCByZXNlcnZlZDJbMl07Ci0jZW5kaWYKLQl1MzIgcmVzZXJ2ZWQzOwotCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkNFsyXTsKLX07Ci0KLS8qCi0gKiBYc3Rvcm0gRkNvRSBTdG9ybSBDb250ZXh0Ci0gKi8KLXN0cnVjdCB4c3Rvcm1fZmNvZV9zdF9jb250ZXh0IHsKLQlzdHJ1Y3QgeHN0b3JtX2Zjb2VfZXRoX2NvbnRleHRfc2VjdGlvbiBldGg7Ci0Jc3RydWN0IHhzdG9ybV9mY29lX2NvbnRleHRfc2VjdGlvbiBmY29lOwotfTsKLQotLyoKLSAqIEZjb2UgY29ubmVjdGlvbiBjb250ZXh0Ci0gKi8KLXN0cnVjdCBmY29lX2NvbnRleHQgewotCXN0cnVjdCB1c3Rvcm1fZmNvZV9zdF9jb250ZXh0IHVzdG9ybV9zdF9jb250ZXh0OwotCXN0cnVjdCB0c3Rvcm1fZmNvZV9zdF9jb250ZXh0IHRzdG9ybV9zdF9jb250ZXh0OwotCXN0cnVjdCB4c3Rvcm1fZmNvZV9hZ19jb250ZXh0IHhzdG9ybV9hZ19jb250ZXh0OwotCXN0cnVjdCB0c3Rvcm1fZmNvZV9hZ19jb250ZXh0IHRzdG9ybV9hZ19jb250ZXh0OwotCXN0cnVjdCB1c3Rvcm1fZmNvZV9hZ19jb250ZXh0IHVzdG9ybV9hZ19jb250ZXh0OwotCXN0cnVjdCB0aW1lcnNfYmxvY2tfY29udGV4dCB0aW1lcnNfY29udGV4dDsKLQlzdHJ1Y3QgeHN0b3JtX2Zjb2Vfc3RfY29udGV4dCB4c3Rvcm1fc3RfY29udGV4dDsKLX07Ci0KLS8qCi0gKiBpU0NTSSBjb250ZXh0IHJlZ2lvbiwgdXNlZCBvbmx5IGluIGlTQ1NJCi0gKi8KLXN0cnVjdCB1c3Rvcm1faXNjc2lfcnFfZGIgewotCXN0cnVjdCByZWdwYWlyIHBibF9iYXNlOwotCXN0cnVjdCByZWdwYWlyIGN1cnJfcGJlOwotfTsKLQotLyoKLSAqIGlTQ1NJIGNvbnRleHQgcmVnaW9uLCB1c2VkIG9ubHkgaW4gaVNDU0kKLSAqLwotc3RydWN0IHVzdG9ybV9pc2NzaV9yMnRxX2RiIHsKLQlzdHJ1Y3QgcmVncGFpciBwYmxfYmFzZTsKLQlzdHJ1Y3QgcmVncGFpciBjdXJyX3BiZTsKLX07Ci0KLS8qCi0gKiBpU0NTSSBjb250ZXh0IHJlZ2lvbiwgdXNlZCBvbmx5IGluIGlTQ1NJCi0gKi8KLXN0cnVjdCB1c3Rvcm1faXNjc2lfY3FfZGIgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBjcV9zbjsKLQl1MTYgcHJvZDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBwcm9kOwotCXUxNiBjcV9zbjsKLSNlbmRpZgotCXN0cnVjdCByZWdwYWlyIGN1cnJfcGJlOwotfTsKLQotLyoKLSAqIGlTQ1NJIGNvbnRleHQgcmVnaW9uLCB1c2VkIG9ubHkgaW4gaVNDU0kKLSAqLwotc3RydWN0IHJpbmdzX2RiIHsKLQlzdHJ1Y3QgdXN0b3JtX2lzY3NpX3JxX2RiIHJxOwotCXN0cnVjdCB1c3Rvcm1faXNjc2lfcjJ0cV9kYiByMnRxOwotCXN0cnVjdCB1c3Rvcm1faXNjc2lfY3FfZGIgY3FbOF07Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJxX3Byb2Q7Ci0JdTE2IHIydHFfcHJvZDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiByMnRxX3Byb2Q7Ci0JdTE2IHJxX3Byb2Q7Ci0jZW5kaWYKLQlzdHJ1Y3QgcmVncGFpciBjcV9wYmxfYmFzZTsKLX07Ci0KLS8qCi0gKiBpU0NTSSBjb250ZXh0IHJlZ2lvbiwgdXNlZCBvbmx5IGluIGlTQ1NJCi0gKi8KLXN0cnVjdCB1c3Rvcm1faXNjc2lfcGxhY2VtZW50X2RiIHsKLQl1MzIgc2dsX2Jhc2VfbG87Ci0JdTMyIHNnbF9iYXNlX2hpOwotCXUzMiBsb2NhbF9zZ2VfMF9hZGRyZXNzX2hpOwotCXUzMiBsb2NhbF9zZ2VfMF9hZGRyZXNzX2xvOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBjdXJyX3NnZV9vZmZzZXQ7Ci0JdTE2IGxvY2FsX3NnZV8wX3NpemU7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgbG9jYWxfc2dlXzBfc2l6ZTsKLQl1MTYgY3Vycl9zZ2Vfb2Zmc2V0OwotI2VuZGlmCi0JdTMyIGxvY2FsX3NnZV8xX2FkZHJlc3NfaGk7Ci0JdTMyIGxvY2FsX3NnZV8xX2FkZHJlc3NfbG87Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJlc2VydmVkNjsKLQl1MTYgbG9jYWxfc2dlXzFfc2l6ZTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBsb2NhbF9zZ2VfMV9zaXplOwotCXUxNiByZXNlcnZlZDY7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBzZ2xfc2l6ZTsKLQl1OCBsb2NhbF9zZ2VfaW5kZXhfMmI7Ci0JdTE2IHJlc2VydmVkNzsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiByZXNlcnZlZDc7Ci0JdTggbG9jYWxfc2dlX2luZGV4XzJiOwotCXU4IHNnbF9zaXplOwotI2VuZGlmCi0JdTMyIHJlbV9wZHU7Ci0JdTMyIHBsYWNlX2RiX2JpdGZpZWxkXzE7Ci0jZGVmaW5lIFVTVE9STV9JU0NTSV9QTEFDRU1FTlRfREJfUkVNX1BEVV9QQVlMT0FEICgweEZGRkZGRjw8MCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1BMQUNFTUVOVF9EQl9SRU1fUERVX1BBWUxPQURfU0hJRlQgMAotI2RlZmluZSBVU1RPUk1fSVNDU0lfUExBQ0VNRU5UX0RCX0NRX0lEICgweEZGPDwyNCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1BMQUNFTUVOVF9EQl9DUV9JRF9TSElGVCAyNAotCXUzMiBwbGFjZV9kYl9iaXRmaWVsZF8yOwotI2RlZmluZSBVU1RPUk1fSVNDU0lfUExBQ0VNRU5UX0RCX0JZVEVTXzJfVFJVTkNBVEUgKDB4RkZGRkZGPDwwKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfUExBQ0VNRU5UX0RCX0JZVEVTXzJfVFJVTkNBVEVfU0hJRlQgMAotI2RlZmluZSBVU1RPUk1fSVNDU0lfUExBQ0VNRU5UX0RCX0hPU1RfU0dFX0lOREVYICgweEZGPDwyNCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1BMQUNFTUVOVF9EQl9IT1NUX1NHRV9JTkRFWF9TSElGVCAyNAotCXUzMiBuYWw7Ci0jZGVmaW5lIFVTVE9STV9JU0NTSV9QTEFDRU1FTlRfREJfUkVNX1NHRV9TSVpFICgweEZGRkZGRjw8MCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1BMQUNFTUVOVF9EQl9SRU1fU0dFX1NJWkVfU0hJRlQgMAotI2RlZmluZSBVU1RPUk1fSVNDU0lfUExBQ0VNRU5UX0RCX0VYUF9QQURESU5HXzJCICgweDM8PDI0KQotI2RlZmluZSBVU1RPUk1fSVNDU0lfUExBQ0VNRU5UX0RCX0VYUF9QQURESU5HXzJCX1NISUZUIDI0Ci0jZGVmaW5lIFVTVE9STV9JU0NTSV9QTEFDRU1FTlRfREJfRVhQX0RJR0VTVF8zQiAoMHg3PDwyNikKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1BMQUNFTUVOVF9EQl9FWFBfRElHRVNUXzNCX1NISUZUIDI2Ci0jZGVmaW5lIFVTVE9STV9JU0NTSV9QTEFDRU1FTlRfREJfTkFMX0xFTl8zQiAoMHg3PDwyOSkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1BMQUNFTUVOVF9EQl9OQUxfTEVOXzNCX1NISUZUIDI5Ci19OwotCi0vKgotICogVXN0b3JtIGlTQ1NJIFN0b3JtIENvbnRleHQKLSAqLwotc3RydWN0IHVzdG9ybV9pc2NzaV9zdF9jb250ZXh0IHsKLQl1MzIgZXhwX3N0YXRfc247Ci0JdTMyIGV4cF9kYXRhX3NuOwotCXN0cnVjdCByaW5nc19kYiByaW5nOwotCXN0cnVjdCByZWdwYWlyIHRhc2tfcGJsX2Jhc2U7Ci0Jc3RydWN0IHJlZ3BhaXIgdGNlX3BoeV9hZGRyOwotCXN0cnVjdCB1c3Rvcm1faXNjc2lfcGxhY2VtZW50X2RiIHBsYWNlX2RiOwotCXUzMiByZXNlcnZlZDg7Ci0JdTMyIHJlbV9yY3ZfbGVuOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBoZHJfaXR0OwotCXUxNiBpc2NzaV9jb25uX2lkOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGlzY3NpX2Nvbm5faWQ7Ci0JdTE2IGhkcl9pdHQ7Ci0jZW5kaWYKLQl1MzIgbmFsX2J5dGVzOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IGhkcl9zZWNvbmRfYnl0ZV91bmlvbjsKLQl1OCBiaXRmaWVsZF8wOwotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CTUlERExFT0ZQRFUgKDB4MTw8MCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQk1JRERMRU9GUERVX1NISUZUIDAKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQkZFTkNFQ1FFICgweDE8PDEpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JGRU5DRUNRRV9TSElGVCAxCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JSRVNFVENSQyAoMHgxPDwyKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CUkVTRVRDUkNfU0hJRlQgMgotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9SRVNFUlZFRDEgKDB4MUY8PDMpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX1JFU0VSVkVEMV9TSElGVCAzCi0JdTggdGFza19wZHVfY2FjaGVfaW5kZXg7Ci0JdTggdGFza19wYmVfY2FjaGVfaW5kZXg7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCB0YXNrX3BiZV9jYWNoZV9pbmRleDsKLQl1OCB0YXNrX3BkdV9jYWNoZV9pbmRleDsKLQl1OCBiaXRmaWVsZF8wOwotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CTUlERExFT0ZQRFUgKDB4MTw8MCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQk1JRERMRU9GUERVX1NISUZUIDAKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQkZFTkNFQ1FFICgweDE8PDEpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JGRU5DRUNRRV9TSElGVCAxCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JSRVNFVENSQyAoMHgxPDwyKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CUkVTRVRDUkNfU0hJRlQgMgotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9SRVNFUlZFRDEgKDB4MUY8PDMpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX1JFU0VSVkVEMV9TSElGVCAzCi0JdTggaGRyX3NlY29uZF9ieXRlX3VuaW9uOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJlc2VydmVkMzsKLQl1OCByZXNlcnZlZDI7Ci0JdTggYWNEZWNyZW1lbnQ7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBhY0RlY3JlbWVudDsKLQl1OCByZXNlcnZlZDI7Ci0JdTE2IHJlc2VydmVkMzsKLSNlbmRpZgotCXUzMiB0YXNrX3N0YXQ7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggaGRyX29wY29kZTsKLQl1OCBudW1fY3FzOwotCXUxNiByZXNlcnZlZDU7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcmVzZXJ2ZWQ1OwotCXU4IG51bV9jcXM7Ci0JdTggaGRyX29wY29kZTsKLSNlbmRpZgotCXUzMiBuZWdvdGlhdGVkX3J4OwotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9NQVhfUkVDVl9QRFVfTEVOR1RIICgweEZGRkZGRjw8MCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfTUFYX1JFQ1ZfUERVX0xFTkdUSF9TSElGVCAwCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX01BWF9PVVRTVEFORElOR19SMlRTICgweEZGPDwyNCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfTUFYX09VVFNUQU5ESU5HX1IyVFNfU0hJRlQgMjQKLQl1MzIgbmVnb3RpYXRlZF9yeF9hbmRfZmxhZ3M7Ci0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX01BWF9CVVJTVF9MRU5HVEggKDB4RkZGRkZGPDwwKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9NQVhfQlVSU1RfTEVOR1RIX1NISUZUIDAKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQl9DUUVfUE9TVEVEX09SX0hFQURFUl9DQUNIRUQgKDB4MTw8MjQpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JfQ1FFX1BPU1RFRF9PUl9IRUFERVJfQ0FDSEVEX1NISUZUIDI0Ci0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JfSERSX0RJR0VTVF9FTiAoMHgxPDwyNSkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQl9IRFJfRElHRVNUX0VOX1NISUZUIDI1Ci0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JfREFUQV9ESUdFU1RfRU4gKDB4MTw8MjYpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JfREFUQV9ESUdFU1RfRU5fU0hJRlQgMjYKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQl9QUk9UT0NPTF9FUlJPUiAoMHgxPDwyNykKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQl9QUk9UT0NPTF9FUlJPUl9TSElGVCAyNwotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CX1RBU0tfVkFMSUQgKDB4MTw8MjgpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JfVEFTS19WQUxJRF9TSElGVCAyOAotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9UQVNLX1RZUEUgKDB4Mzw8MjkpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX1RBU0tfVFlQRV9TSElGVCAyOQotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CX0FMTF9EQVRBX0FDS0VEICgweDE8PDMxKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CX0FMTF9EQVRBX0FDS0VEX1NISUZUIDMxCi19OwotCi0vKgotICogVENQIGNvbnRleHQgcmVnaW9uLCBzaGFyZWQgaW4gVE9FLCBSRE1BIGFuZCBJU0NTSQotICovCi1zdHJ1Y3QgdHN0b3JtX3RjcF9zdF9jb250ZXh0X3NlY3Rpb24gewotCXUzMiBmbGFnczE7Ci0jZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1JUVF9TUlRUICgweEZGRkZGRjw8MCkKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fUlRUX1NSVFRfU0hJRlQgMAotI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9QQVdTX0lOVkFMSUQgKDB4MTw8MjQpCi0jZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1BBV1NfSU5WQUxJRF9TSElGVCAyNAotI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9USU1FU1RBTVBfRVhJU1RTICgweDE8PDI1KQotI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9USU1FU1RBTVBfRVhJU1RTX1NISUZUIDI1Ci0jZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1JFU0VSVkVEMCAoMHgxPDwyNikKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fUkVTRVJWRUQwX1NISUZUIDI2Ci0jZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1NUT1BfUlhfUEFZTE9BRCAoMHgxPDwyNykKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fU1RPUF9SWF9QQVlMT0FEX1NISUZUIDI3Ci0jZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0tBX0VOQUJMRUQgKDB4MTw8MjgpCi0jZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0tBX0VOQUJMRURfU0hJRlQgMjgKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fRklSU1RfUlRPX0VTVElNQVRFICgweDE8PDI5KQotI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9GSVJTVF9SVE9fRVNUSU1BVEVfU0hJRlQgMjkKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fTUFYX1NFR19SRVRSQU5TTUlUX0VOICgweDE8PDMwKQotI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9NQVhfU0VHX1JFVFJBTlNNSVRfRU5fU0hJRlQgMzAKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fTEFTVF9JU0xFX0hBU19GSU4gKDB4MTw8MzEpCi0jZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0xBU1RfSVNMRV9IQVNfRklOX1NISUZUIDMxCi0JdTMyIGZsYWdzMjsKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fUlRUX1ZBUklBVElPTiAoMHhGRkZGRkY8PDApCi0jZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1JUVF9WQVJJQVRJT05fU0hJRlQgMAotI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9EQV9FTiAoMHgxPDwyNCkKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fREFfRU5fU0hJRlQgMjQKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fREFfQ09VTlRFUl9FTiAoMHgxPDwyNSkKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fREFfQ09VTlRFUl9FTl9TSElGVCAyNQotI2RlZmluZSBfX1RTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0tBX1BST0JFX1NFTlQgKDB4MTw8MjYpCi0jZGVmaW5lIF9fVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fS0FfUFJPQkVfU0VOVF9TSElGVCAyNgotI2RlZmluZSBfX1RTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1BFUlNJU1RfUFJPQkVfU0VOVCAoMHgxPDwyNykKLSNkZWZpbmUgX19UU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9QRVJTSVNUX1BST0JFX1NFTlRfU0hJRlQgMjcKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0wyX1NUQVRTVElDUyAoMHgxPDwyOCkKLSNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0wyX1NUQVRTVElDU19TSElGVCAyOAotI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9VUERBVEVfTDRfU1RBVFNUSUNTICgweDE8PDI5KQotI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9VUERBVEVfTDRfU1RBVFNUSUNTX1NISUZUIDI5Ci0jZGVmaW5lIF9fVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fSU5fV0lORE9XX1JTVF9BVFRBQ0sgKDB4MTw8MzApCi0jZGVmaW5lIF9fVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fSU5fV0lORE9XX1JTVF9BVFRBQ0tfU0hJRlQgMzAKLSNkZWZpbmUgX19UU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9JTl9XSU5ET1dfU1lOX0FUVEFDSyAoMHgxPDwzMSkKLSNkZWZpbmUgX19UU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9JTl9XSU5ET1dfU1lOX0FUVEFDS19TSElGVCAzMQotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBtc3M7Ci0JdTggdGNwX3NtX3N0YXRlOwotCXU4IHJ0b19leHA7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBydG9fZXhwOwotCXU4IHRjcF9zbV9zdGF0ZTsKLQl1MTYgbXNzOwotI2VuZGlmCi0JdTMyIHJjdl9ueHQ7Ci0JdTMyIHRpbWVzdGFtcF9yZWNlbnQ7Ci0JdTMyIHRpbWVzdGFtcF9yZWNlbnRfdGltZTsKLQl1MzIgY3duZDsKLQl1MzIgc3NfdGhyZXNoOwotCXUzMiBjd25kX2FjY3VtOwotCXUzMiBwcmV2X3NlZ19zZXE7Ci0JdTMyIGV4cGVjdGVkX3JlbF9zZXE7Ci0JdTMyIHJlY292ZXI7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggcmV0cmFuc21pdF9jb3VudDsKLQl1OCBrYV9tYXhfcHJvYmVfY291bnQ7Ci0JdTggcGVyc2lzdF9wcm9iZV9jb3VudDsKLQl1OCBrYV9wcm9iZV9jb3VudDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IGthX3Byb2JlX2NvdW50OwotCXU4IHBlcnNpc3RfcHJvYmVfY291bnQ7Ci0JdTgga2FfbWF4X3Byb2JlX2NvdW50OwotCXU4IHJldHJhbnNtaXRfY291bnQ7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBzdGF0aXN0aWNzX2NvdW50ZXJfaWQ7Ci0JdTggb29vX3N1cHBvcnRfbW9kZTsKLQl1OCBzbmRfd25kX3NjYWxlOwotCXU4IGR1cF9hY2tfY291bnQ7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBkdXBfYWNrX2NvdW50OwotCXU4IHNuZF93bmRfc2NhbGU7Ci0JdTggb29vX3N1cHBvcnRfbW9kZTsKLQl1OCBzdGF0aXN0aWNzX2NvdW50ZXJfaWQ7Ci0jZW5kaWYKLQl1MzIgcmV0cmFuc21pdF9zdGFydF90aW1lOwotCXUzMiBrYV90aW1lb3V0OwotCXUzMiBrYV9pbnRlcnZhbDsKLQl1MzIgaXNsZV9zdGFydF9zZXE7Ci0JdTMyIGlzbGVfZW5kX3NlcTsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgc2Vjb25kX2lzbGVfYWRkcmVzczsKLQl1MTYgcmVjZW50X3NlZ193bmQ7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcmVjZW50X3NlZ193bmQ7Ci0JdTE2IHNlY29uZF9pc2xlX2FkZHJlc3M7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBtYXhfaXNsZXNfZXZlcl9oYXBwZW5lZDsKLQl1OCBpc2xlc19udW1iZXI7Ci0JdTE2IGxhc3RfaXNsZV9hZGRyZXNzOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGxhc3RfaXNsZV9hZGRyZXNzOwotCXU4IGlzbGVzX251bWJlcjsKLQl1OCBtYXhfaXNsZXNfZXZlcl9oYXBwZW5lZDsKLSNlbmRpZgotCXUzMiBtYXhfcnRfdGltZTsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgbHNiX21hY19hZGRyZXNzOwotCXUxNiB2bGFuX2lkOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHZsYW5faWQ7Ci0JdTE2IGxzYl9tYWNfYWRkcmVzczsKLSNlbmRpZgotCXUzMiBtc2JfbWFjX2FkZHJlc3M7Ci0JdTMyIHJpZ2h0bW9zdF9yZWNlaXZlZF9zZXE7Ci19OwotCi0vKgotICogVGVybWluYXRpb24gdmFyaWFibGVzCi0gKi8KLXN0cnVjdCBpc2NzaV90ZXJtX3ZhcnMgewotCXU4IEJpdE1hcDsKLSNkZWZpbmUgSVNDU0lfVEVSTV9WQVJTX1RDUF9TVEFURSAoMHhGPDwwKQotI2RlZmluZSBJU0NTSV9URVJNX1ZBUlNfVENQX1NUQVRFX1NISUZUIDAKLSNkZWZpbmUgSVNDU0lfVEVSTV9WQVJTX0ZJTl9SRUNFSVZFRF9TQklUICgweDE8PDQpCi0jZGVmaW5lIElTQ1NJX1RFUk1fVkFSU19GSU5fUkVDRUlWRURfU0JJVF9TSElGVCA0Ci0jZGVmaW5lIElTQ1NJX1RFUk1fVkFSU19BQ0tfT05fRklOX1JFQ0VJVkVEX1NCSVQgKDB4MTw8NSkKLSNkZWZpbmUgSVNDU0lfVEVSTV9WQVJTX0FDS19PTl9GSU5fUkVDRUlWRURfU0JJVF9TSElGVCA1Ci0jZGVmaW5lIElTQ1NJX1RFUk1fVkFSU19URVJNX09OX0NISVAgKDB4MTw8NikKLSNkZWZpbmUgSVNDU0lfVEVSTV9WQVJTX1RFUk1fT05fQ0hJUF9TSElGVCA2Ci0jZGVmaW5lIElTQ1NJX1RFUk1fVkFSU19SU1JWICgweDE8PDcpCi0jZGVmaW5lIElTQ1NJX1RFUk1fVkFSU19SU1JWX1NISUZUIDcKLX07Ci0KLS8qCi0gKiBpU0NTSSBjb250ZXh0IHJlZ2lvbiwgdXNlZCBvbmx5IGluIGlTQ1NJCi0gKi8KLXN0cnVjdCB0c3Rvcm1faXNjc2lfc3RfY29udGV4dF9zZWN0aW9uIHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgcmVtX3RjcF9kYXRhX2xlbjsKLQl1MTYgYnJiX29mZnNldDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBicmJfb2Zmc2V0OwotCXUxNiByZW1fdGNwX2RhdGFfbGVuOwotI2VuZGlmCi0JdTMyIGIybmg7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJxX2NvbnM7Ci0JdTggZmxhZ3M7Ci0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9IRFJfRElHRVNUX0VOICgweDE8PDApCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9IRFJfRElHRVNUX0VOX1NISUZUIDAKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9CX0RBVEFfRElHRVNUX0VOICgweDE8PDEpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9EQVRBX0RJR0VTVF9FTl9TSElGVCAxCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9QQVJUSUFMX0hFQURFUiAoMHgxPDwyKQotI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfUEFSVElBTF9IRUFERVJfU0hJRlQgMgotI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfRlVMTF9GRUFUVVJFICgweDE8PDMpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9GVUxMX0ZFQVRVUkVfU0hJRlQgMwotI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfRFJPUF9BTExfUERVUyAoMHgxPDw0KQotI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfRFJPUF9BTExfUERVU19TSElGVCA0Ci0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fRkxBR1NfUlNSViAoMHg3PDw1KQotI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0ZMQUdTX1JTUlZfU0hJRlQgNQotCXU4IGhkcl9ieXRlc18yX2ZldGNoOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggaGRyX2J5dGVzXzJfZmV0Y2g7Ci0JdTggZmxhZ3M7Ci0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9IRFJfRElHRVNUX0VOICgweDE8PDApCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9IRFJfRElHRVNUX0VOX1NISUZUIDAKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9CX0RBVEFfRElHRVNUX0VOICgweDE8PDEpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9EQVRBX0RJR0VTVF9FTl9TSElGVCAxCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9QQVJUSUFMX0hFQURFUiAoMHgxPDwyKQotI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfUEFSVElBTF9IRUFERVJfU0hJRlQgMgotI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfRlVMTF9GRUFUVVJFICgweDE8PDMpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9GVUxMX0ZFQVRVUkVfU0hJRlQgMwotI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfRFJPUF9BTExfUERVUyAoMHgxPDw0KQotI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfRFJPUF9BTExfUERVU19TSElGVCA0Ci0jZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fRkxBR1NfUlNSViAoMHg3PDw1KQotI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0ZMQUdTX1JTUlZfU0hJRlQgNQotCXUxNiBycV9jb25zOwotI2VuZGlmCi0Jc3RydWN0IHJlZ3BhaXIgcnFfZGJfcGh5X2FkZHI7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0Jc3RydWN0IGlzY3NpX3Rlcm1fdmFycyB0ZXJtX3ZhcnM7Ci0JdTggc2NyYXRjaHBhZF9pZHg7Ci0JdTE2IGlzY3NpX2Nvbm5faWQ7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgaXNjc2lfY29ubl9pZDsKLQl1OCBzY3JhdGNocGFkX2lkeDsKLQlzdHJ1Y3QgaXNjc2lfdGVybV92YXJzIHRlcm1fdmFyczsKLSNlbmRpZgotCXUzMiBwcm9jZXNzX254dDsKLX07Ci0KLS8qCi0gKiBUaGUgaVNDU0kgbm9uLWFnZ3JlZ2F0aXZlIGNvbnRleHQgb2YgVHN0b3JtCi0gKi8KLXN0cnVjdCB0c3Rvcm1faXNjc2lfc3RfY29udGV4dCB7Ci0Jc3RydWN0IHRzdG9ybV90Y3Bfc3RfY29udGV4dF9zZWN0aW9uIHRjcDsKLQlzdHJ1Y3QgdHN0b3JtX2lzY3NpX3N0X2NvbnRleHRfc2VjdGlvbiBpc2NzaTsKLX07CiAKIC8qCiAgKiBUaGUgdGNwIGFnZ3JlZ2F0aXZlIGNvbnRleHQgc2VjdGlvbiBvZiBYc3Rvcm0KICAqLwogc3RydWN0IHhzdG9ybV90Y3BfdGNwX2FnX2NvbnRleHRfc2VjdGlvbiB7CiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggX190Y3BfYWdnX3ZhcnMxOworCXU4IHRjcF9hZ2dfdmFyczE7CisjZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1NFVF9EQV9USU1FUl9DRiAoMHgzPDwwKQorI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9TRVRfREFfVElNRVJfQ0ZfU0hJRlQgMAorI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BQ0tfVE9fRkVfVVBEQVRFRCAoMHgzPDwyKQorI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BQ0tfVE9fRkVfVVBEQVRFRF9TSElGVCAyCisjZGVmaW5lIFhTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9TSURFQkFORF9TRU5UX0NGICgweDM8PDQpCisjZGVmaW5lIFhTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9TSURFQkFORF9TRU5UX0NGX1NISUZUIDQKKyNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQ0xFQVJfREFfVElNRVJfRU4gKDB4MTw8NikKKyNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQ0xFQVJfREFfVElNRVJfRU5fU0hJRlQgNgorI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9EQV9FWFBJUkFUSU9OX0ZMQUcgKDB4MTw8NykKKyNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fREFfRVhQSVJBVElPTl9GTEFHX1NISUZUIDcKIAl1OCBfX2RhX2NudDsKIAl1MTYgbXNzOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCiAJdTE2IG1zczsKIAl1OCBfX2RhX2NudDsKLQl1OCBfX3RjcF9hZ2dfdmFyczE7CisJdTggdGNwX2FnZ192YXJzMTsKKyNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fU0VUX0RBX1RJTUVSX0NGICgweDM8PDApCisjZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1NFVF9EQV9USU1FUl9DRl9TSElGVCAwCisjZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FDS19UT19GRV9VUERBVEVEICgweDM8PDIpCisjZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FDS19UT19GRV9VUERBVEVEX1NISUZUIDIKKyNkZWZpbmUgWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1NJREVCQU5EX1NFTlRfQ0YgKDB4Mzw8NCkKKyNkZWZpbmUgWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1NJREVCQU5EX1NFTlRfQ0ZfU0hJRlQgNAorI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9DTEVBUl9EQV9USU1FUl9FTiAoMHgxPDw2KQorI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9DTEVBUl9EQV9USU1FUl9FTl9TSElGVCA2CisjZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0RBX0VYUElSQVRJT05fRkxBRyAoMHgxPDw3KQorI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9EQV9FWFBJUkFUSU9OX0ZMQUdfU0hJRlQgNwogI2VuZGlmCiAJdTMyIHNuZF9ueHQ7CiAJdTMyIHR4X3duZDsKQEAgLTI2MTUsNyArMTc3NCw3IEBACiAJdTMyIGxvY2FsX2Fkdl93bmQ7CiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCiAJdTggX19hZ2dfdmFsOF90aDsKLQl1OCBfX2FnZ192YWw4OworCXU4IF9fdHhfZGVzdDsKIAl1MTYgdGNwX2FnZ192YXJzMjsKICNkZWZpbmUgWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1RYX0ZJTl9GTEFHICgweDE8PDApCiAjZGVmaW5lIFhTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9UWF9GSU5fRkxBR19TSElGVCAwCkBAIC0yNjMxLDggKzE3OTAsOCBAQAogI2RlZmluZSBYU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fREFfRU5BQkxFX1NISUZUIDUKICNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQUNLX1RPX0ZFX1VQREFURURfRU4gKDB4MTw8NikKICNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQUNLX1RPX0ZFX1VQREFURURfRU5fU0hJRlQgNgotI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgzX0NGX0VOICgweDE8PDcpCi0jZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDNfQ0ZfRU5fU0hJRlQgNworI2RlZmluZSBYU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fU0lERUJBTkRfU0VOVF9DRl9FTiAoMHgxPDw3KQorI2RlZmluZSBYU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fU0lERUJBTkRfU0VOVF9DRl9FTl9TSElGVCA3CiAjZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1RYX0ZJTl9GTEFHX0VOICgweDE8PDgpCiAjZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1RYX0ZJTl9GTEFHX0VOX1NISUZUIDgKICNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMV9GTEFHICgweDE8PDkpCkBAIC0yNjQxLDggKzE4MDAsOCBAQAogI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9TRVRfUlRPX0NGX1NISUZUIDEwCiAjZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1RTX1RPX0VDSE9fVVBEQVRFRF9DRiAoMHgzPDwxMikKICNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVFNfVE9fRUNIT19VUERBVEVEX0NGX1NISUZUIDEyCi0jZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDhfQ0YgKDB4Mzw8MTQpCi0jZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDhfQ0ZfU0hJRlQgMTQKKyNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVFhfREVTVF9VUERBVEVEX0NGICgweDM8PDE0KQorI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9UWF9ERVNUX1VQREFURURfQ0ZfU0hJRlQgMTQKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQogCXUxNiB0Y3BfYWdnX3ZhcnMyOwogI2RlZmluZSBYU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVFhfRklOX0ZMQUcgKDB4MTw8MCkKQEAgLTI2NTksOCArMTgxOCw4IEBACiAjZGVmaW5lIFhTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9EQV9FTkFCTEVfU0hJRlQgNQogI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BQ0tfVE9fRkVfVVBEQVRFRF9FTiAoMHgxPDw2KQogI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BQ0tfVE9fRkVfVVBEQVRFRF9FTl9TSElGVCA2Ci0jZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDNfQ0ZfRU4gKDB4MTw8NykKLSNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYM19DRl9FTl9TSElGVCA3CisjZGVmaW5lIFhTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9TSURFQkFORF9TRU5UX0NGX0VOICgweDE8PDcpCisjZGVmaW5lIFhTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9TSURFQkFORF9TRU5UX0NGX0VOX1NISUZUIDcKICNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVFhfRklOX0ZMQUdfRU4gKDB4MTw8OCkKICNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVFhfRklOX0ZMQUdfRU5fU0hJRlQgOAogI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0ZMQUcgKDB4MTw8OSkKQEAgLTI2NjksOSArMTgyOCw5IEBACiAjZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1NFVF9SVE9fQ0ZfU0hJRlQgMTAKICNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVFNfVE9fRUNIT19VUERBVEVEX0NGICgweDM8PDEyKQogI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9UU19UT19FQ0hPX1VQREFURURfQ0ZfU0hJRlQgMTIKLSNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYOF9DRiAoMHgzPDwxNCkKLSNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYOF9DRl9TSElGVCAxNAotCXU4IF9fYWdnX3ZhbDg7CisjZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1RYX0RFU1RfVVBEQVRFRF9DRiAoMHgzPDwxNCkKKyNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVFhfREVTVF9VUERBVEVEX0NGX1NISUZUIDE0CisJdTggX190eF9kZXN0OwogCXU4IF9fYWdnX3ZhbDhfdGg7CiAjZW5kaWYKIAl1MzIgYWNrX3RvX2Zhcl9lbmQ7CkBAIC0yNjk5LDggKzE4NTgsOCBAQAogCXUzMiB0Y3BfYWdnX3ZhcnM2OwogI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9UU19UT19FQ0hPX0NGX0VOICgweDE8PDApCiAjZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1RTX1RPX0VDSE9fQ0ZfRU5fU0hJRlQgMAotI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVg4X0NGX0VOICgweDE8PDEpCi0jZGVmaW5lIF9fWFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDhfQ0ZfRU5fU0hJRlQgMQorI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9UWF9ERVNUX1VQREFURURfQ0ZfRU4gKDB4MTw8MSkKKyNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVFhfREVTVF9VUERBVEVEX0NGX0VOX1NISUZUIDEKICNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYOV9DRl9FTiAoMHgxPDwyKQogI2RlZmluZSBfX1hTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVg5X0NGX0VOX1NISUZUIDIKICNkZWZpbmUgX19YU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMTBfQ0ZfRU4gKDB4MTw8MykKQEAgLTI5OTcsMzIxICsyMTU2LDIxMTYgQEAKIAl1MzIgcnN0X3NlcV9udW07CiB9OwogCi0vKgotICogVGhlIHRjcCBhZ2dyZWdhdGl2ZSBjb250ZXh0IHNlY3Rpb24gb2YgVHN0b3JtCi0gKi8KLXN0cnVjdCB0c3Rvcm1fdGNwX3RjcF9hZ19jb250ZXh0X3NlY3Rpb24gewotCXUzMiBfX2FnZ192YWwxOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IF9fdGNwX2FnZ192YXJzMjsKLQl1OCBfX2FnZ192YWwzOwotCXUxNiBfX2FnZ192YWwyOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IF9fYWdnX3ZhbDI7Ci0JdTggX19hZ2dfdmFsMzsKLQl1OCBfX3RjcF9hZ2dfdmFyczI7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgX19hZ2dfdmFsNTsKLQl1OCBfX2FnZ192YWw2OwotCXU4IF9fdGNwX2FnZ192YXJzMzsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IF9fdGNwX2FnZ192YXJzMzsKLQl1OCBfX2FnZ192YWw2OwotCXUxNiBfX2FnZ192YWw1OwotI2VuZGlmCi0JdTMyIHNuZF9ueHQ7Ci0JdTMyIHJ0dF9zZXE7Ci0JdTMyIHJ0dF90aW1lOwotCXUzMiBfX3Jlc2VydmVkNjY7Ci0JdTMyIHduZF9yaWdodF9lZGdlOwotCXUzMiB0Y3BfYWdnX3ZhcnMxOwotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fRklOX1NFTlRfRkxBRyAoMHgxPDwwKQotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fRklOX1NFTlRfRkxBR19TSElGVCAwCi0jZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9MQVNUX1BBQ0tFVF9GSU5fRkxBRyAoMHgxPDwxKQotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fTEFTVF9QQUNLRVRfRklOX0ZMQUdfU0hJRlQgMQotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fV05EX1VQRF9DRiAoMHgzPDwyKQotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fV05EX1VQRF9DRl9TSElGVCAyCi0jZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9USU1FT1VUX0NGICgweDM8PDQpCi0jZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9USU1FT1VUX0NGX1NISUZUIDQKLSNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1dORF9VUERfQ0ZfRU4gKDB4MTw8NikKLSNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1dORF9VUERfQ0ZfRU5fU0hJRlQgNgotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVElNRU9VVF9DRl9FTiAoMHgxPDw3KQotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fVElNRU9VVF9DRl9FTl9TSElGVCA3Ci0jZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9SRVRSQU5TTUlUX1NFUV9FTiAoMHgxPDw4KQotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fUkVUUkFOU01JVF9TRVFfRU5fU0hJRlQgOAotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fU05EX05YVF9FTiAoMHgxPDw5KQotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fU05EX05YVF9FTl9TSElGVCA5Ci0jZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0ZMQUcgKDB4MTw8MTApCi0jZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0ZMQUdfU0hJRlQgMTAKLSNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfRkxBRyAoMHgxPDwxMSkKLSNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfRkxBR19TSElGVCAxMQotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMV9DRl9FTiAoMHgxPDwxMikKLSNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDFfQ0ZfRU5fU0hJRlQgMTIKLSNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfQ0ZfRU4gKDB4MTw8MTMpCi0jZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgyX0NGX0VOX1NISUZUIDEzCi0jZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxX0NGICgweDM8PDE0KQotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMV9DRl9TSElGVCAxNAotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMl9DRiAoMHgzPDwxNikKLSNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDJfQ0ZfU0hJRlQgMTYKLSNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1RYX0JMT0NLRUQgKDB4MTw8MTgpCi0jZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9UWF9CTE9DS0VEX1NISUZUIDE4Ci0jZGVmaW5lIF9fVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDEwX0NGX0VOICgweDE8PDE5KQotI2RlZmluZSBfX1RTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxMF9DRl9FTl9TSElGVCAxOQotI2RlZmluZSBfX1RTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9BVVgxMV9DRl9FTiAoMHgxPDwyMCkKLSNkZWZpbmUgX19UU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMTFfQ0ZfRU5fU0hJRlQgMjAKLSNkZWZpbmUgX19UU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fQVVYMTJfQ0ZfRU4gKDB4MTw8MjEpCi0jZGVmaW5lIF9fVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX0FVWDEyX0NGX0VOX1NISUZUIDIxCi0jZGVmaW5lIF9fVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1JFU0VSVkVEMSAoMHgzPDwyMikKLSNkZWZpbmUgX19UU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fUkVTRVJWRUQxX1NISUZUIDIyCi0jZGVmaW5lIFRTVE9STV9UQ1BfVENQX0FHX0NPTlRFWFRfU0VDVElPTl9SRVRSQU5TTUlUX1BFTkRfU0VRICgweEY8PDI0KQotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fUkVUUkFOU01JVF9QRU5EX1NFUV9TSElGVCAyNAotI2RlZmluZSBUU1RPUk1fVENQX1RDUF9BR19DT05URVhUX1NFQ1RJT05fUkVUUkFOU01JVF9ET05FX1NFUSAoMHhGPDwyOCkKLSNkZWZpbmUgVFNUT1JNX1RDUF9UQ1BfQUdfQ09OVEVYVF9TRUNUSU9OX1JFVFJBTlNNSVRfRE9ORV9TRVFfU0hJRlQgMjgKLQl1MzIgc25kX21heDsKLQl1MzIgc25kX3VuYTsKLQl1MzIgX19yZXNlcnZlZDI7Ci19OwogCiAvKgotICogVGhlIGlzY3NpIGFnZ3JlZ2F0aXZlIGNvbnRleHQgb2YgVHN0b3JtCisgKiBUaGUgTDVjbSBhZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIFhTdG9ybQogICovCi1zdHJ1Y3QgdHN0b3JtX2lzY3NpX2FnX2NvbnRleHQgeworc3RydWN0IHhzdG9ybV9sNWNtX2FnX2NvbnRleHQgewogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiB1bHBfY3JlZGl0OworCXUxNiBhZ2dfdmFsMTsKIAl1OCBhZ2dfdmFyczE7Ci0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTAgKDB4MTw8MCkKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMF9TSElGVCAwCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTEgKDB4MTw8MSkKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMV9TSElGVCAxCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTIgKDB4MTw8MikKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMl9TSElGVCAyCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTMgKDB4MTw8MykKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNM19TSElGVCAzCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUVVFVUVTX0ZMVVNIX1EwX0NGICgweDM8PDQpCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUVVFVUVTX0ZMVVNIX1EwX0NGX1NISUZUIDQKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVgzX0ZMQUcgKDB4MTw8NikKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVgzX0ZMQUdfU0hJRlQgNgotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FDS19PTl9GSU5fU0VOVF9GTEFHICgweDE8PDcpCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUNLX09OX0ZJTl9TRU5UX0ZMQUdfU0hJRlQgNworI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMCAoMHgxPDwwKQorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMF9TSElGVCAwCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMSAoMHgxPDwxKQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0VYSVNUU19JTl9RTTFfU0hJRlQgMQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0VYSVNUU19JTl9RTTIgKDB4MTw8MikKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yX1NISUZUIDIKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0zICgweDE8PDMpCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNM19TSElGVCAzCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9NT1JFX1RPX1NFTkRfRU4gKDB4MTw8NCkKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX01PUkVfVE9fU0VORF9FTl9TSElGVCA0CisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfTkFHTEVfRU4gKDB4MTw8NSkKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9OQUdMRV9FTl9TSElGVCA1CisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9EUV9TUEFSRV9GTEFHICgweDE8PDYpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9EUV9TUEFSRV9GTEFHX1NISUZUIDYKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX1VOQV9HVF9OWFRfRU4gKDB4MTw8NykKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX1VOQV9HVF9OWFRfRU5fU0hJRlQgNwogCXU4IHN0YXRlOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCiAJdTggc3RhdGU7CiAJdTggYWdnX3ZhcnMxOwotI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0wICgweDE8PDApCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTBfU0hJRlQgMAotI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0xICgweDE8PDEpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTFfU0hJRlQgMQotI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yICgweDE8PDIpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTJfU0hJRlQgMgotI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0zICgweDE8PDMpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTNfU0hJRlQgMwotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1FVRVVFU19GTFVTSF9RMF9DRiAoMHgzPDw0KQotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1FVRVVFU19GTFVTSF9RMF9DRl9TSElGVCA0Ci0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYM19GTEFHICgweDE8PDYpCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYM19GTEFHX1NISUZUIDYKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BQ0tfT05fRklOX1NFTlRfRkxBRyAoMHgxPDw3KQotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FDS19PTl9GSU5fU0VOVF9GTEFHX1NISUZUIDcKLQl1MTYgdWxwX2NyZWRpdDsKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0VYSVNUU19JTl9RTTAgKDB4MTw8MCkKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0VYSVNUU19JTl9RTTBfU0hJRlQgMAorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0VYSVNUU19JTl9RTTEgKDB4MTw8MSkKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0xX1NISUZUIDEKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yICgweDE8PDIpCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMl9TSElGVCAyCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMyAoMHgxPDwzKQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0VYSVNUU19JTl9RTTNfU0hJRlQgMworI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfTU9SRV9UT19TRU5EX0VOICgweDE8PDQpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9NT1JFX1RPX1NFTkRfRU5fU0hJRlQgNAorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX05BR0xFX0VOICgweDE8PDUpCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfTkFHTEVfRU5fU0hJRlQgNQorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfRFFfU1BBUkVfRkxBRyAoMHgxPDw2KQorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfRFFfU1BBUkVfRkxBR19TSElGVCA2CisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9VTkFfR1RfTlhUX0VOICgweDE8PDcpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9VTkFfR1RfTlhUX0VOX1NISUZUIDcKKwl1MTYgYWdnX3ZhbDE7CiAjZW5kaWYKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgX19hZ2dfdmFsNDsKLQl1MTYgYWdnX3ZhcnMyOwotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX01TTF9USU1FUl9TRVRfRkxBRyAoMHgxPDwwKQotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX01TTF9USU1FUl9TRVRfRkxBR19TSElGVCAwCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRklOX1NFTlRfRklSU1RfRkxBRyAoMHgxPDwxKQotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0ZJTl9TRU5UX0ZJUlNUX0ZMQUdfU0hJRlQgMQotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1JTVF9TRU5UX0NGICgweDM8PDIpCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUlNUX1NFTlRfQ0ZfU0hJRlQgMgotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1dBS0VVUF9DQUxMX0NGICgweDM8PDQpCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfV0FLRVVQX0NBTExfQ0ZfU0hJRlQgNAotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDZfQ0YgKDB4Mzw8NikKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg2X0NGX1NISUZUIDYKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg3X0NGICgweDM8PDgpCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYN19DRl9TSElGVCA4Ci0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYN19GTEFHICgweDE8PDEwKQotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDdfRkxBR19TSElGVCAxMAotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1FVRVVFU19GTFVTSF9RMF9DRl9FTiAoMHgxPDwxMSkKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9RVUVVRVNfRkxVU0hfUTBfQ0ZfRU5fU0hJRlQgMTEKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9SU1RfU0VOVF9DRl9FTiAoMHgxPDwxMikKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9SU1RfU0VOVF9DRl9FTl9TSElGVCAxMgotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1dBS0VVUF9DQUxMX0NGX0VOICgweDE8PDEzKQotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1dBS0VVUF9DQUxMX0NGX0VOX1NISUZUIDEzCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDZfQ0ZfRU4gKDB4MTw8MTQpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDZfQ0ZfRU5fU0hJRlQgMTQKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYN19DRl9FTiAoMHgxPDwxNSkKLSNkZWZpbmUgVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYN19DRl9FTl9TSElGVCAxNQotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGFnZ192YXJzMjsKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9NU0xfVElNRVJfU0VUX0ZMQUcgKDB4MTw8MCkKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9NU0xfVElNRVJfU0VUX0ZMQUdfU0hJRlQgMAotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0ZJTl9TRU5UX0ZJUlNUX0ZMQUcgKDB4MTw8MSkKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9GSU5fU0VOVF9GSVJTVF9GTEFHX1NISUZUIDEKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9SU1RfU0VOVF9DRiAoMHgzPDwyKQotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1JTVF9TRU5UX0NGX1NISUZUIDIKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9XQUtFVVBfQ0FMTF9DRiAoMHgzPDw0KQotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX1dBS0VVUF9DQUxMX0NGX1NISUZUIDQKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg2X0NGICgweDM8PDYpCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYNl9DRl9TSElGVCA2Ci0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQVVYN19DRiAoMHgzPDw4KQotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDdfQ0ZfU0hJRlQgOAotI2RlZmluZSBfX1RTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDdfRkxBRyAoMHgxPDwxMCkKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg3X0ZMQUdfU0hJRlQgMTAKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9RVUVVRVNfRkxVU0hfUTBfQ0ZfRU4gKDB4MTw8MTEpCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUVVFVUVTX0ZMVVNIX1EwX0NGX0VOX1NISUZUIDExCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUlNUX1NFTlRfQ0ZfRU4gKDB4MTw8MTIpCi0jZGVmaW5lIF9fVFNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUlNUX1NFTlRfQ0ZfRU5fU0hJRlQgMTIKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9XQUtFVVBfQ0FMTF9DRl9FTiAoMHgxPDwxMykKLSNkZWZpbmUgX19UU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9XQUtFVVBfQ0FMTF9DRl9FTl9TSElGVCAxMwotI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg2X0NGX0VOICgweDE8PDE0KQotI2RlZmluZSBUU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVg2X0NGX0VOX1NISUZUIDE0Ci0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDdfQ0ZfRU4gKDB4MTw8MTUpCi0jZGVmaW5lIFRTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDdfQ0ZfRU5fU0hJRlQgMTUKLQl1MTYgX19hZ2dfdmFsNDsKLSNlbmRpZgotCXN0cnVjdCB0c3Rvcm1fdGNwX3RjcF9hZ19jb250ZXh0X3NlY3Rpb24gdGNwOwotfTsKLQotLyoKLSAqIFRoZSBpc2NzaSBhZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIFVzdG9ybQotICovCi1zdHJ1Y3QgdXN0b3JtX2lzY3NpX2FnX2NvbnRleHQgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IF9fYXV4X2NvdW50ZXJfZmxhZ3M7CisJdTggY2R1X3Jlc2VydmVkOworCXU4IF9fYWdnX3ZhcnM0OworCXU4IGFnZ192YXJzMzsKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9QSFlTSUNBTF9RVUVVRV9OVU0yICgweDNGPDwwKQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX1BIWVNJQ0FMX1FVRVVFX05VTTJfU0hJRlQgMAorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfUlhfVFNfRU5fQ0YgKDB4Mzw8NikKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX1JYX1RTX0VOX0NGX1NISUZUIDYKIAl1OCBhZ2dfdmFyczI7Ci0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX1RYX0NGICgweDM8PDApCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX1RYX0NGX1NISUZUIDAKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9USU1FUl9DRiAoMHgzPDwyKQotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX1RJTUVSX0NGX1NISUZUIDIKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX01JU0M0X1JVTEUgKDB4Nzw8NCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX01JU0M0X1JVTEVfU0hJRlQgNAotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0FHR19WQUwyX01BU0sgKDB4MTw8NykKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfVkFMMl9NQVNLX1NISUZUIDcKLQl1OCBhZ2dfdmFyczE7Ci0jZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMCAoMHgxPDwwKQotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTBfU0hJRlQgMAotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0xICgweDE8PDEpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTFfU0hJRlQgMQotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yICgweDE8PDIpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTJfU0hJRlQgMgotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0zICgweDE8PDMpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTNfU0hJRlQgMwotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9JTlZfQ0YgKDB4Mzw8NCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfSU5WX0NGX1NISUZUIDQKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRiAoMHgzPDw2KQotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9DT01QTEVUSU9OX0NGX1NISUZUIDYKLQl1OCBzdGF0ZTsKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVg0X0NGICgweDM8PDApCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYNF9DRl9TSElGVCAwCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9EUV9TUEFSRV9GTEFHX0VOICgweDE8PDIpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9EUV9TUEFSRV9GTEFHX0VOX1NISUZUIDIKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDhfRkxBRyAoMHgxPDwzKQorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYOF9GTEFHX1NISUZUIDMKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDlfRkxBRyAoMHgxPDw0KQorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYOV9GTEFHX1NISUZUIDQKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFMSAoMHgzPDw1KQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0RFQ0lTSU9OX1JVTEUxX1NISUZUIDUKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVg0X0NGX0VOICgweDE8PDcpCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYNF9DRl9FTl9TSElGVCA3CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBzdGF0ZTsKLQl1OCBhZ2dfdmFyczE7Ci0jZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfRVhJU1RTX0lOX1FNMCAoMHgxPDwwKQotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTBfU0hJRlQgMAotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0xICgweDE8PDEpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTFfU0hJRlQgMQotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0yICgweDE8PDIpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTJfU0hJRlQgMgotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9FWElTVFNfSU5fUU0zICgweDE8PDMpCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0VYSVNUU19JTl9RTTNfU0hJRlQgMwotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9JTlZfQ0YgKDB4Mzw8NCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfSU5WX0NGX1NISUZUIDQKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRiAoMHgzPDw2KQotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9DT01QTEVUSU9OX0NGX1NISUZUIDYKIAl1OCBhZ2dfdmFyczI7Ci0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX1RYX0NGICgweDM8PDApCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX1RYX0NGX1NISUZUIDAKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9USU1FUl9DRiAoMHgzPDwyKQotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX1RJTUVSX0NGX1NISUZUIDIKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX01JU0M0X1JVTEUgKDB4Nzw8NCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX01JU0M0X1JVTEVfU0hJRlQgNAotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0FHR19WQUwyX01BU0sgKDB4MTw8NykKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfVkFMMl9NQVNLX1NISUZUIDcKLQl1OCBfX2F1eF9jb3VudGVyX2ZsYWdzOworI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDRfQ0YgKDB4Mzw8MCkKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVg0X0NGX1NISUZUIDAKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0RRX1NQQVJFX0ZMQUdfRU4gKDB4MTw8MikKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0RRX1NQQVJFX0ZMQUdfRU5fU0hJRlQgMgorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYOF9GTEFHICgweDE8PDMpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVg4X0ZMQUdfU0hJRlQgMworI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYOV9GTEFHICgweDE8PDQpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVg5X0ZMQUdfU0hJRlQgNAorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0RFQ0lTSU9OX1JVTEUxICgweDM8PDUpCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfREVDSVNJT05fUlVMRTFfU0hJRlQgNQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDRfQ0ZfRU4gKDB4MTw8NykKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVg0X0NGX0VOX1NISUZUIDcKKwl1OCBhZ2dfdmFyczM7CisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfUEhZU0lDQUxfUVVFVUVfTlVNMiAoMHgzRjw8MCkKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9QSFlTSUNBTF9RVUVVRV9OVU0yX1NISUZUIDAKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX1JYX1RTX0VOX0NGICgweDM8PDYpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9SWF9UU19FTl9DRl9TSElGVCA2CisJdTggX19hZ2dfdmFyczQ7CisJdTggY2R1X3Jlc2VydmVkOworI2VuZGlmCisJdTMyIG1vcmVfdG9fc2VuZDsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgYWdnX3ZhcnM1OworI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0RFQ0lTSU9OX1JVTEU1ICgweDM8PDApCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfREVDSVNJT05fUlVMRTVfU0hJRlQgMAorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX1BIWVNJQ0FMX1FVRVVFX05VTTAgKDB4M0Y8PDIpCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfUEhZU0lDQUxfUVVFVUVfTlVNMF9TSElGVCAyCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfUEhZU0lDQUxfUVVFVUVfTlVNMSAoMHgzRjw8OCkKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9QSFlTSUNBTF9RVUVVRV9OVU0xX1NISUZUIDgKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFMiAoMHgzPDwxNCkKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFMl9TSElGVCAxNAorCXUxNiBhZ2dfdmFsNF90aDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBhZ2dfdmFsNF90aDsKKwl1MTYgYWdnX3ZhcnM1OworI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0RFQ0lTSU9OX1JVTEU1ICgweDM8PDApCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfREVDSVNJT05fUlVMRTVfU0hJRlQgMAorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX1BIWVNJQ0FMX1FVRVVFX05VTTAgKDB4M0Y8PDIpCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfUEhZU0lDQUxfUVVFVUVfTlVNMF9TSElGVCAyCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfUEhZU0lDQUxfUVVFVUVfTlVNMSAoMHgzRjw8OCkKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9QSFlTSUNBTF9RVUVVRV9OVU0xX1NISUZUIDgKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFMiAoMHgzPDwxNCkKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFMl9TSElGVCAxNAorI2VuZGlmCisJc3RydWN0IHhzdG9ybV90Y3BfdGNwX2FnX2NvbnRleHRfc2VjdGlvbiB0Y3A7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IGFnZ192YXJzNzsKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FHR19WQUwxMV9ERUNJU0lPTl9SVUxFICgweDc8PDApCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BR0dfVkFMMTFfREVDSVNJT05fUlVMRV9TSElGVCAwCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVgxM19GTEFHICgweDE8PDMpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVgxM19GTEFHX1NISUZUIDMKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX1NUT1JNU19TWU5DX0NGICgweDM8PDQpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9TVE9STVNfU1lOQ19DRl9TSElGVCA0CisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfREVDSVNJT05fUlVMRTMgKDB4Mzw8NikKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFM19TSElGVCA2CisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYMV9DRiAoMHgzPDw4KQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDFfQ0ZfU0hJRlQgOAorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQ09NUExFVElPTl9TRVFfREVDSVNJT05fTUFTSyAoMHgxPDwxMCkKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0NPTVBMRVRJT05fU0VRX0RFQ0lTSU9OX01BU0tfU0hJRlQgMTAKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDFfQ0ZfRU4gKDB4MTw8MTEpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVgxX0NGX0VOX1NISUZUIDExCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVgxMF9GTEFHICgweDE8PDEyKQorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYMTBfRkxBR19TSElGVCAxMgorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYMTFfRkxBRyAoMHgxPDwxMykKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDExX0ZMQUdfU0hJRlQgMTMKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDEyX0ZMQUcgKDB4MTw8MTQpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVgxMl9GTEFHX1NISUZUIDE0CisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9SWF9XTkRfU0NMX0VOICgweDE8PDE1KQorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfUlhfV05EX1NDTF9FTl9TSElGVCAxNQorCXU4IGFnZ192YWwzX3RoOworCXU4IGFnZ192YXJzNjsKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFNiAoMHg3PDwwKQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0RFQ0lTSU9OX1JVTEU2X1NISUZUIDAKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFNyAoMHg3PDwzKQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0RFQ0lTSU9OX1JVTEU3X1NISUZUIDMKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFNCAoMHgzPDw2KQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0RFQ0lTSU9OX1JVTEU0X1NISUZUIDYKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXU4IGFnZ192YXJzNjsKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFNiAoMHg3PDwwKQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0RFQ0lTSU9OX1JVTEU2X1NISUZUIDAKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFNyAoMHg3PDwzKQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0RFQ0lTSU9OX1JVTEU3X1NISUZUIDMKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFNCAoMHgzPDw2KQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0RFQ0lTSU9OX1JVTEU0X1NISUZUIDYKKwl1OCBhZ2dfdmFsM190aDsKKwl1MTYgYWdnX3ZhcnM3OworI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQUdHX1ZBTDExX0RFQ0lTSU9OX1JVTEUgKDB4Nzw8MCkKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FHR19WQUwxMV9ERUNJU0lPTl9SVUxFX1NISUZUIDAKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDEzX0ZMQUcgKDB4MTw8MykKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDEzX0ZMQUdfU0hJRlQgMworI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfU1RPUk1TX1NZTkNfQ0YgKDB4Mzw8NCkKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX1NUT1JNU19TWU5DX0NGX1NISUZUIDQKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9ERUNJU0lPTl9SVUxFMyAoMHgzPDw2KQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0RFQ0lTSU9OX1JVTEUzX1NISUZUIDYKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVgxX0NGICgweDM8PDgpCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYMV9DRl9TSElGVCA4CisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9DT01QTEVUSU9OX1NFUV9ERUNJU0lPTl9NQVNLICgweDE8PDEwKQorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQ09NUExFVElPTl9TRVFfREVDSVNJT05fTUFTS19TSElGVCAxMAorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYMV9DRl9FTiAoMHgxPDwxMSkKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDFfQ0ZfRU5fU0hJRlQgMTEKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDEwX0ZMQUcgKDB4MTw8MTIpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVgxMF9GTEFHX1NISUZUIDEyCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BVVgxMV9GTEFHICgweDE8PDEzKQorI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYMTFfRkxBR19TSElGVCAxMworI2RlZmluZSBfX1hTVE9STV9MNUNNX0FHX0NPTlRFWFRfQVVYMTJfRkxBRyAoMHgxPDwxNCkKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX0FVWDEyX0ZMQUdfU0hJRlQgMTQKKyNkZWZpbmUgX19YU1RPUk1fTDVDTV9BR19DT05URVhUX1JYX1dORF9TQ0xfRU4gKDB4MTw8MTUpCisjZGVmaW5lIF9fWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9SWF9XTkRfU0NMX0VOX1NISUZUIDE1CiAjZW5kaWYKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBjZHVfdXNhZ2U7Ci0JdTggYWdnX21pc2MyOwotCXUxNiBfX2NxX2xvY2FsX2NvbXBfaXR0X3ZhbDsKKwl1MTYgX19hZ2dfdmFsMTFfdGg7CisJdTE2IF9fZ2VuX2RhdGE7CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgX19jcV9sb2NhbF9jb21wX2l0dF92YWw7Ci0JdTggYWdnX21pc2MyOwotCXU4IGNkdV91c2FnZTsKKwl1MTYgX19nZW5fZGF0YTsKKwl1MTYgX19hZ2dfdmFsMTFfdGg7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCBfX3Jlc2VydmVkMTsKKwl1OCBfX2FnZ192YWw2X3RoOworCXUxNiBfX2FnZ192YWw5OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IF9fYWdnX3ZhbDk7CisJdTggX19hZ2dfdmFsNl90aDsKKwl1OCBfX3Jlc2VydmVkMTsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBhZ2dfdmFsMl90aDsKKwl1MTYgYWdnX3ZhbDI7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgYWdnX3ZhbDI7CisJdTE2IGFnZ192YWwyX3RoOworI2VuZGlmCisJdTMyIGFnZ192YXJzODsKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BR0dfTUlTQzIgKDB4RkZGRkZGPDwwKQorI2RlZmluZSBYU1RPUk1fTDVDTV9BR19DT05URVhUX0FHR19NSVNDMl9TSElGVCAwCisjZGVmaW5lIFhTVE9STV9MNUNNX0FHX0NPTlRFWFRfQUdHX01JU0MzICgweEZGPDwyNCkKKyNkZWZpbmUgWFNUT1JNX0w1Q01fQUdfQ09OVEVYVF9BR0dfTUlTQzNfU0hJRlQgMjQKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgYWdnX21pc2MwOworCXUxNiBhZ2dfdmFsNDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBhZ2dfdmFsNDsKKwl1MTYgYWdnX21pc2MwOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTggYWdnX3ZhbDM7CisJdTggYWdnX3ZhbDY7CisJdTggYWdnX3ZhbDVfdGg7CisJdTggYWdnX3ZhbDU7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1OCBhZ2dfdmFsNTsKKwl1OCBhZ2dfdmFsNV90aDsKKwl1OCBhZ2dfdmFsNjsKKwl1OCBhZ2dfdmFsMzsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBfX2FnZ19taXNjMTsKKwl1MTYgYWdnX2xpbWl0MTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBhZ2dfbGltaXQxOworCXUxNiBfX2FnZ19taXNjMTsKKyNlbmRpZgorCXUzMiBjb21wbGV0aW9uX3NlcTsKIAl1MzIgYWdnX21pc2M0OworCXUzMiByc3Rfc2VxX251bTsKK307CisKKy8qCisgKiBBQlRTIGluZm8gJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9hYnRzX2luZm8geworCV9fbGUxNiBhYm9ydGVkX3Rhc2tfaWQ7CisJX19sZTE2IHJlc2VydmVkMDsKKwlfX2xlMzIgcmVzZXJ2ZWQxOworfTsKKworCisvKgorICogRml4ZWQgc2l6ZSBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8gcGxhbnQgaXQgaW4gVW5pb24gc3RydWN0dXJlCisgKiAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2FidHNfcnNwX3VuaW9uIHsKKwl1OCByX2N0bDsKKwl1OCByc3J2WzNdOworCV9fbGUzMiBhYnRzX3JzcF9wYXlsb2FkWzddOworfTsKKworCisvKgorICogNCByZWdzIHNpemUgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9iZF9jdHggeworCV9fbGUzMiBidWZfYWRkcl9oaTsKKwlfX2xlMzIgYnVmX2FkZHJfbG87CisJX19sZTE2IGJ1Zl9sZW47CisJX19sZTE2IHJzcnYwOworCV9fbGUxNiBmbGFnczsKKwlfX2xlMTYgcnNydjE7Cit9OworCisKKy8qCisgKiBGQ29FIGNhY2hlZCBzZ2VzIGNvbnRleHQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9jYWNoZWRfc2dlX2N0eCB7CisJc3RydWN0IHJlZ3BhaXIgY3VyX2J1Zl9hZGRyOworCV9fbGUxNiBjdXJfYnVmX3JlbTsKKwlfX2xlMTYgc2Vjb25kX2J1Zl9yZW07CisJc3RydWN0IHJlZ3BhaXIgc2Vjb25kX2J1Zl9hZGRyOworfTsKKworCisvKgorICogQ2xlYW51cCBpbmZvICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfY2xlYW51cF9pbmZvIHsKKwlfX2xlMTYgY2xlYW5lZF90YXNrX2lkOworCV9fbGUxNiByb2xsZWRfdHhfc2VxX2NudDsKKwlfX2xlMzIgcm9sbGVkX3R4X2RhdGFfb2Zmc2V0OworfTsKKworCisvKgorICogRmNwIFJTUCBmbGFncyAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2ZjcF9yc3BfZmxhZ3MgeworCXU4IGZsYWdzOworI2RlZmluZSBGQ09FX0ZDUF9SU1BfRkxBR1NfRkNQX1JTUF9MRU5fVkFMSUQgKDB4MTw8MCkKKyNkZWZpbmUgRkNPRV9GQ1BfUlNQX0ZMQUdTX0ZDUF9SU1BfTEVOX1ZBTElEX1NISUZUIDAKKyNkZWZpbmUgRkNPRV9GQ1BfUlNQX0ZMQUdTX0ZDUF9TTlNfTEVOX1ZBTElEICgweDE8PDEpCisjZGVmaW5lIEZDT0VfRkNQX1JTUF9GTEFHU19GQ1BfU05TX0xFTl9WQUxJRF9TSElGVCAxCisjZGVmaW5lIEZDT0VfRkNQX1JTUF9GTEFHU19GQ1BfUkVTSURfT1ZFUiAoMHgxPDwyKQorI2RlZmluZSBGQ09FX0ZDUF9SU1BfRkxBR1NfRkNQX1JFU0lEX09WRVJfU0hJRlQgMgorI2RlZmluZSBGQ09FX0ZDUF9SU1BfRkxBR1NfRkNQX1JFU0lEX1VOREVSICgweDE8PDMpCisjZGVmaW5lIEZDT0VfRkNQX1JTUF9GTEFHU19GQ1BfUkVTSURfVU5ERVJfU0hJRlQgMworI2RlZmluZSBGQ09FX0ZDUF9SU1BfRkxBR1NfRkNQX0NPTkZfUkVRICgweDE8PDQpCisjZGVmaW5lIEZDT0VfRkNQX1JTUF9GTEFHU19GQ1BfQ09ORl9SRVFfU0hJRlQgNAorI2RlZmluZSBGQ09FX0ZDUF9SU1BfRkxBR1NfRkNQX0JJRElfRkxBR1MgKDB4Nzw8NSkKKyNkZWZpbmUgRkNPRV9GQ1BfUlNQX0ZMQUdTX0ZDUF9CSURJX0ZMQUdTX1NISUZUIDUKK307CisKKy8qCisgKiBGY3AgUlNQIHBheWxvYWQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9mY3BfcnNwX3BheWxvYWQgeworCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkMDsKKwlfX2xlMzIgZmNwX3Jlc2lkOworCXU4IHNjc2lfc3RhdHVzX2NvZGU7CisJc3RydWN0IGZjb2VfZmNwX3JzcF9mbGFncyBmY3BfZmxhZ3M7CisJX19sZTE2IHJldHJ5X2RlbGF5X3RpbWVyOworCV9fbGUzMiBmY3BfcnNwX2xlbjsKKwlfX2xlMzIgZmNwX3Nuc19sZW47Cit9OworCisvKgorICogRml4ZWQgc2l6ZSBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8gcGxhbnQgaXQgaW4gVW5pb24gc3RydWN0dXJlCisgKiAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2ZjcF9yc3BfdW5pb24geworCXN0cnVjdCBmY29lX2ZjcF9yc3BfcGF5bG9hZCBwYXlsb2FkOworCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkMDsKK307CisKKy8qCisgKiBGQyBoZWFkZXIgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9mY19oZHIgeworCXU4IHNfaWRbM107CisJdTggY3NfY3RsOworCXU4IGRfaWRbM107CisJdTggcl9jdGw7CisJX19sZTE2IHNlcV9jbnQ7CisJdTggZGZfY3RsOworCXU4IHNlcV9pZDsKKwl1OCBmX2N0bFszXTsKKwl1OCB0eXBlOworCV9fbGUzMiBwYXJhbWV0ZXJzOworCV9fbGUxNiByeF9pZDsKKwlfX2xlMTYgb3hfaWQ7Cit9OworCisvKgorICogRkMgaGVhZGVyIHVuaW9uICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfbXBfcnNwX3VuaW9uIHsKKwlzdHJ1Y3QgZmNvZV9mY19oZHIgZmNfaGRyOworCV9fbGUzMiBtcF9wYXlsb2FkX2xlbjsKKwlfX2xlMzIgcnNydjsKK307CisKKy8qCisgKiBDb21wbGV0aW9uIGluZm9ybWF0aW9uICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLwordW5pb24gZmNvZV9jb21wX2Zsb3dfaW5mbyB7CisJc3RydWN0IGZjb2VfZmNwX3JzcF91bmlvbiBmY3BfcnNwOworCXN0cnVjdCBmY29lX2FidHNfcnNwX3VuaW9uIGFidHNfcnNwOworCXN0cnVjdCBmY29lX21wX3JzcF91bmlvbiBtcF9yc3A7CisJX19sZTMyIG9wYXF1ZVs4XTsKK307CisKKworLyoKKyAqIEV4dGVybmFsIEFCVFMgaW5mbyAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2V4dF9hYnRzX2luZm8geworCV9fbGUzMiByc3J2MFs2XTsKKwlzdHJ1Y3QgZmNvZV9hYnRzX2luZm8gY3R4OworfTsKKworCisvKgorICogRXh0ZXJuYWwgY2xlYW51cCBpbmZvICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfZXh0X2NsZWFudXBfaW5mbyB7CisJX19sZTMyIHJzcnYwWzZdOworCXN0cnVjdCBmY29lX2NsZWFudXBfaW5mbyBjdHg7Cit9OworCisKKy8qCisgKiBGY29lIEZXIFR4IHNlcXVlbmNlIGNvbnRleHQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9md190eF9zZXFfY3R4IHsKKwlfX2xlMzIgZGF0YV9vZmZzZXQ7CisJX19sZTE2IHNlcV9jbnQ7CisJX19sZTE2IHJzcnYwOworfTsKKworLyoKKyAqIEZjb2UgZXh0ZXJuYWwgRlcgVHggc2VxdWVuY2UgY29udGV4dCAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2V4dF9md190eF9zZXFfY3R4IHsKKwlfX2xlMzIgcnNydjBbNl07CisJc3RydWN0IGZjb2VfZndfdHhfc2VxX2N0eCBjdHg7Cit9OworCisKKy8qCisgKiBGQ29FIG11bHRpcGxlIHNnZXMgY29udGV4dCAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX211bF9zZ2VzX2N0eCB7CisJc3RydWN0IHJlZ3BhaXIgY3VyX3NnZV9hZGRyOworCV9fbGUxNiBjdXJfc2dlX29mZjsKKwl1OCBjdXJfc2dlX2lkeDsKKwl1OCBzZ2xfc2l6ZTsKK307CisKKy8qCisgKiBGQ29FIGV4dGVybmFsIG11bHRpcGxlIHNnZXMgY29udGV4dCAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2V4dF9tdWxfc2dlc19jdHggeworCXN0cnVjdCBmY29lX211bF9zZ2VzX2N0eCBtdWxfc2dsOworCXN0cnVjdCByZWdwYWlyIHJzcnYwOworfTsKKworCisvKgorICogRkNQIENNRCBwYXlsb2FkICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfZmNwX2NtZF9wYXlsb2FkIHsKKwlfX2xlMzIgb3BhcXVlWzhdOworfTsKKworCisKKworCisvKgorICogRmNwIHhmciByZHkgcGF5bG9hZCAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2ZjcF94ZnJfcmR5X3BheWxvYWQgeworCV9fbGUzMiBidXJzdF9sZW47CisJX19sZTMyIGRhdGFfcm87Cit9OworCisKKy8qCisgKiBGQyBmcmFtZSAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2ZjX2ZyYW1lIHsKKwlzdHJ1Y3QgZmNvZV9mY19oZHIgZmNfaGRyOworCV9fbGUzMiByZXNlcnZlZDBbMl07Cit9OworCisKKworCisvKgorICogRkNvRSBLQ1EgQ1FFIHBhcmFtZXRlcnMgJCRLRUVQX0VORElBTk5FU1MkJAorICovCit1bmlvbiBmY29lX2tjcWVfcGFyYW1zIHsKKwlfX2xlMzIgcmVzZXJ2ZWQwWzRdOworfTsKKworLyoKKyAqIEZDb0UgS0NRIENRRSAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2tjcWUgeworCV9fbGUzMiBmY29lX2Nvbm5faWQ7CisJX19sZTMyIGNvbXBsZXRpb25fc3RhdHVzOworCV9fbGUzMiBmY29lX2Nvbm5fY29udGV4dF9pZDsKKwl1bmlvbiBmY29lX2tjcWVfcGFyYW1zIHBhcmFtczsKKwlfX2xlMTYgcWVfc2VsZl9zZXE7CisJdTggb3BfY29kZTsKKwl1OCBmbGFnczsKKyNkZWZpbmUgRkNPRV9LQ1FFX1JFU0VSVkVEMCAoMHg3PDwwKQorI2RlZmluZSBGQ09FX0tDUUVfUkVTRVJWRUQwX1NISUZUIDAKKyNkZWZpbmUgRkNPRV9LQ1FFX1JBTVJPRF9DT01QTEVUSU9OICgweDE8PDMpCisjZGVmaW5lIEZDT0VfS0NRRV9SQU1ST0RfQ09NUExFVElPTl9TSElGVCAzCisjZGVmaW5lIEZDT0VfS0NRRV9MQVlFUl9DT0RFICgweDc8PDQpCisjZGVmaW5lIEZDT0VfS0NRRV9MQVlFUl9DT0RFX1NISUZUIDQKKyNkZWZpbmUgRkNPRV9LQ1FFX0xJTktFRF9XSVRIX05FWFQgKDB4MTw8NykKKyNkZWZpbmUgRkNPRV9LQ1FFX0xJTktFRF9XSVRIX05FWFRfU0hJRlQgNworfTsKKworCisKKy8qCisgKiBGQ29FIEtXUUUgaGVhZGVyICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgeworCXU4IG9wX2NvZGU7CisJdTggZmxhZ3M7CisjZGVmaW5lIEZDT0VfS1dRRV9IRUFERVJfUkVTRVJWRUQwICgweEY8PDApCisjZGVmaW5lIEZDT0VfS1dRRV9IRUFERVJfUkVTRVJWRUQwX1NISUZUIDAKKyNkZWZpbmUgRkNPRV9LV1FFX0hFQURFUl9MQVlFUl9DT0RFICgweDc8PDQpCisjZGVmaW5lIEZDT0VfS1dRRV9IRUFERVJfTEFZRVJfQ09ERV9TSElGVCA0CisjZGVmaW5lIEZDT0VfS1dRRV9IRUFERVJfUkVTRVJWRUQxICgweDE8PDcpCisjZGVmaW5lIEZDT0VfS1dRRV9IRUFERVJfUkVTRVJWRUQxX1NISUZUIDcKK307CisKKy8qCisgKiBGQ29FIGZpcm13YXJlIGluaXQgcmVxdWVzdCAxICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2Vfa3dxZV9pbml0MSB7CisJX19sZTE2IG51bV90YXNrczsKKwlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7CisJX19sZTMyIHRhc2tfbGlzdF9wYmxfYWRkcl9sbzsKKwlfX2xlMzIgdGFza19saXN0X3BibF9hZGRyX2hpOworCV9fbGUzMiBkdW1teV9idWZmZXJfYWRkcl9sbzsKKwlfX2xlMzIgZHVtbXlfYnVmZmVyX2FkZHJfaGk7CisJX19sZTE2IHNxX251bV93cWVzOworCV9fbGUxNiBycV9udW1fd3FlczsKKwlfX2xlMTYgcnFfYnVmZmVyX2xvZ19zaXplOworCV9fbGUxNiBjcV9udW1fd3FlczsKKwlfX2xlMTYgbXR1OworCXU4IG51bV9zZXNzaW9uc19sb2c7CisJdTggZmxhZ3M7CisjZGVmaW5lIEZDT0VfS1dRRV9JTklUMV9MT0dfUEFHRV9TSVpFICgweEY8PDApCisjZGVmaW5lIEZDT0VfS1dRRV9JTklUMV9MT0dfUEFHRV9TSVpFX1NISUZUIDAKKyNkZWZpbmUgRkNPRV9LV1FFX0lOSVQxX0xPR19DQUNIRURfUEJFU19QRVJfRlVOQyAoMHg3PDw0KQorI2RlZmluZSBGQ09FX0tXUUVfSU5JVDFfTE9HX0NBQ0hFRF9QQkVTX1BFUl9GVU5DX1NISUZUIDQKKyNkZWZpbmUgRkNPRV9LV1FFX0lOSVQxX1JFU0VSVkVEMSAoMHgxPDw3KQorI2RlZmluZSBGQ09FX0tXUUVfSU5JVDFfUkVTRVJWRUQxX1NISUZUIDcKK307CisKKy8qCisgKiBGQ29FIGZpcm13YXJlIGluaXQgcmVxdWVzdCAyICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2Vfa3dxZV9pbml0MiB7CisJdTggaHNpX21ham9yX3ZlcnNpb247CisJdTggaHNpX21pbm9yX3ZlcnNpb247CisJc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOworCV9fbGUzMiBoYXNoX3RibF9wYmxfYWRkcl9sbzsKKwlfX2xlMzIgaGFzaF90YmxfcGJsX2FkZHJfaGk7CisJX19sZTMyIHQyX2hhc2hfdGJsX2FkZHJfbG87CisJX19sZTMyIHQyX2hhc2hfdGJsX2FkZHJfaGk7CisJX19sZTMyIHQyX3B0cl9oYXNoX3RibF9hZGRyX2xvOworCV9fbGUzMiB0Ml9wdHJfaGFzaF90YmxfYWRkcl9oaTsKKwlfX2xlMzIgZnJlZV9saXN0X2NvdW50OworfTsKKworLyoKKyAqIEZDb0UgZmlybXdhcmUgaW5pdCByZXF1ZXN0IDMgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9rd3FlX2luaXQzIHsKKwlfX2xlMTYgcmVzZXJ2ZWQwOworCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKKwlfX2xlMzIgZXJyb3JfYml0X21hcF9sbzsKKwlfX2xlMzIgZXJyb3JfYml0X21hcF9oaTsKKwl1OCBwZXJmX2NvbmZpZzsKKwl1OCByZXNlcnZlZDIxWzNdOworCV9fbGUzMiByZXNlcnZlZDJbNF07Cit9OworCisvKgorICogRkNvRSBjb25uZWN0aW9uIG9mZmxvYWQgcmVxdWVzdCAxICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQxIHsKKwlfX2xlMTYgZmNvZV9jb25uX2lkOworCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKKwlfX2xlMzIgc3FfYWRkcl9sbzsKKwlfX2xlMzIgc3FfYWRkcl9oaTsKKwlfX2xlMzIgcnFfcGJsX2FkZHJfbG87CisJX19sZTMyIHJxX3BibF9hZGRyX2hpOworCV9fbGUzMiBycV9maXJzdF9wYmVfYWRkcl9sbzsKKwlfX2xlMzIgcnFfZmlyc3RfcGJlX2FkZHJfaGk7CisJX19sZTE2IHJxX3Byb2Q7CisJX19sZTE2IHJlc2VydmVkMDsKK307CisKKy8qCisgKiBGQ29FIGNvbm5lY3Rpb24gb2ZmbG9hZCByZXF1ZXN0IDIgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fb2ZmbG9hZDIgeworCV9fbGUxNiB0eF9tYXhfZmNfcGF5X2xlbjsKKwlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7CisJX19sZTMyIGNxX2FkZHJfbG87CisJX19sZTMyIGNxX2FkZHJfaGk7CisJX19sZTMyIHhmZXJxX2FkZHJfbG87CisJX19sZTMyIHhmZXJxX2FkZHJfaGk7CisJX19sZTMyIGNvbm5fZGJfYWRkcl9sbzsKKwlfX2xlMzIgY29ubl9kYl9hZGRyX2hpOworCV9fbGUzMiByZXNlcnZlZDE7Cit9OworCisvKgorICogRkNvRSBjb25uZWN0aW9uIG9mZmxvYWQgcmVxdWVzdCAzICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQzIHsKKwlfX2xlMTYgdmxhbl90YWc7CisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX1ZMQU5fSUQgKDB4RkZGPDwwKQorI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19WTEFOX0lEX1NISUZUIDAKKyNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQ0ZJICgweDE8PDEyKQorI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19DRklfU0hJRlQgMTIKKyNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfUFJJT1JJVFkgKDB4Nzw8MTMpCisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX1BSSU9SSVRZX1NISUZUIDEzCisJc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOworCXU4IHNfaWRbM107CisJdTggdHhfbWF4X2NvbmNfc2Vxc19jMzsKKwl1OCBkX2lkWzNdOworCXU4IGZsYWdzOworI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX01VTF9OX1BPUlRfSURTICgweDE8PDApCisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfTVVMX05fUE9SVF9JRFNfU0hJRlQgMAorI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0VfRF9UT1ZfUkVTICgweDE8PDEpCisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfRV9EX1RPVl9SRVNfU0hJRlQgMQorI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0NPTlRfSU5DUl9TRVFfQ05UICgweDE8PDIpCisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQ09OVF9JTkNSX1NFUV9DTlRfU0hJRlQgMgorI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0NPTkZfUkVRICgweDE8PDMpCisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQ09ORl9SRVFfU0hJRlQgMworI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX1JFQ19WQUxJRCAoMHgxPDw0KQorI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX1JFQ19WQUxJRF9TSElGVCA0CisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQzJfVkFMSUQgKDB4MTw8NSkKKyNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9DMl9WQUxJRF9TSElGVCA1CisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQUNLXzAgKDB4MTw8NikKKyNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9BQ0tfMF9TSElGVCA2CisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfVkxBTl9GTEFHICgweDE8PDcpCisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfVkxBTl9GTEFHX1NISUZUIDcKKwlfX2xlMzIgcmVzZXJ2ZWQ7CisJX19sZTMyIGNvbmZxX2ZpcnN0X3BiZV9hZGRyX2xvOworCV9fbGUzMiBjb25mcV9maXJzdF9wYmVfYWRkcl9oaTsKKwlfX2xlMTYgdHhfdG90YWxfY29uY19zZXFzOworCV9fbGUxNiByeF9tYXhfZmNfcGF5X2xlbjsKKwlfX2xlMTYgcnhfdG90YWxfY29uY19zZXFzOworCXU4IHJ4X21heF9jb25jX3NlcXNfYzM7CisJdTggcnhfb3Blbl9zZXFzX2V4Y2hfYzM7Cit9OworCisvKgorICogRkNvRSBjb25uZWN0aW9uIG9mZmxvYWQgcmVxdWVzdCA0ICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQ0IHsKKwl1OCBlX2RfdG92X3RpbWVyX3ZhbDsKKwl1OCByZXNlcnZlZDI7CisJc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOworCXU4IHNyY19tYWNfYWRkcl9sb1syXTsKKwl1OCBzcmNfbWFjX2FkZHJfbWlkWzJdOworCXU4IHNyY19tYWNfYWRkcl9oaVsyXTsKKwl1OCBkc3RfbWFjX2FkZHJfaGlbMl07CisJdTggZHN0X21hY19hZGRyX2xvWzJdOworCXU4IGRzdF9tYWNfYWRkcl9taWRbMl07CisJX19sZTMyIGxjcV9hZGRyX2xvOworCV9fbGUzMiBsY3FfYWRkcl9oaTsKKwlfX2xlMzIgY29uZnFfcGJsX2Jhc2VfYWRkcl9sbzsKKwlfX2xlMzIgY29uZnFfcGJsX2Jhc2VfYWRkcl9oaTsKK307CisKKy8qCisgKiBGQ29FIGNvbm5lY3Rpb24gZW5hYmxlIHJlcXVlc3QgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fZW5hYmxlX2Rpc2FibGUgeworCV9fbGUxNiByZXNlcnZlZDA7CisJc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOworCXU4IHNyY19tYWNfYWRkcl9sb1syXTsKKwl1OCBzcmNfbWFjX2FkZHJfbWlkWzJdOworCXU4IHNyY19tYWNfYWRkcl9oaVsyXTsKKwl1MTYgdmxhbl90YWc7CisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1ZMQU5fSUQgKDB4RkZGPDwwKQorI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9WTEFOX0lEX1NISUZUIDAKKyNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfQ0ZJICgweDE8PDEyKQorI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9DRklfU0hJRlQgMTIKKyNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfUFJJT1JJVFkgKDB4Nzw8MTMpCisjZGVmaW5lIEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1BSSU9SSVRZX1NISUZUIDEzCisJdTggZHN0X21hY19hZGRyX2xvWzJdOworCXU4IGRzdF9tYWNfYWRkcl9taWRbMl07CisJdTggZHN0X21hY19hZGRyX2hpWzJdOworCV9fbGUxNiByZXNlcnZlZDE7CisJdTggc19pZFszXTsKKwl1OCB2bGFuX2ZsYWc7CisJdTggZF9pZFszXTsKKwl1OCByZXNlcnZlZDM7CisJX19sZTMyIGNvbnRleHRfaWQ7CisJX19sZTMyIGNvbm5faWQ7CisJX19sZTMyIHJlc2VydmVkNDsKK307CisKKy8qCisgKiBGQ29FIGNvbm5lY3Rpb24gZGVzdHJveSByZXF1ZXN0ICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2Vfa3dxZV9jb25uX2Rlc3Ryb3kgeworCV9fbGUxNiByZXNlcnZlZDA7CisJc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOworCV9fbGUzMiBjb250ZXh0X2lkOworCV9fbGUzMiBjb25uX2lkOworCV9fbGUzMiByZXNlcnZlZDFbNV07Cit9OworCisvKgorICogRkNvZSBkZXN0cm95IHJlcXVlc3QgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9rd3FlX2Rlc3Ryb3kgeworCV9fbGUxNiByZXNlcnZlZDA7CisJc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOworCV9fbGUzMiByZXNlcnZlZDFbN107Cit9OworCisvKgorICogRkNvZSBzdGF0aXN0aWNzIHJlcXVlc3QgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9rd3FlX3N0YXQgeworCV9fbGUxNiByZXNlcnZlZDA7CisJc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOworCV9fbGUzMiBzdGF0X3BhcmFtc19hZGRyX2xvOworCV9fbGUzMiBzdGF0X3BhcmFtc19hZGRyX2hpOworCV9fbGUzMiByZXNlcnZlZDFbNV07Cit9OworCisvKgorICogRkNvRSBLV1EgV1FFICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLwordW5pb24gZmNvZV9rd3FlIHsKKwlzdHJ1Y3QgZmNvZV9rd3FlX2luaXQxIGluaXQxOworCXN0cnVjdCBmY29lX2t3cWVfaW5pdDIgaW5pdDI7CisJc3RydWN0IGZjb2Vfa3dxZV9pbml0MyBpbml0MzsKKwlzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fb2ZmbG9hZDEgY29ubl9vZmZsb2FkMTsKKwlzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fb2ZmbG9hZDIgY29ubl9vZmZsb2FkMjsKKwlzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fb2ZmbG9hZDMgY29ubl9vZmZsb2FkMzsKKwlzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fb2ZmbG9hZDQgY29ubl9vZmZsb2FkNDsKKwlzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fZW5hYmxlX2Rpc2FibGUgY29ubl9lbmFibGVfZGlzYWJsZTsKKwlzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fZGVzdHJveSBjb25uX2Rlc3Ryb3k7CisJc3RydWN0IGZjb2Vfa3dxZV9kZXN0cm95IGRlc3Ryb3k7CisJc3RydWN0IGZjb2Vfa3dxZV9zdGF0IHN0YXRpc3RpY3M7Cit9OworCisKKworCisKKworCisKKworCisKKworCisKKworCisvKgorICogVFggU0dMIGNvbnRleHQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCit1bmlvbiBmY29lX3NnbF91bmlvbl9jdHggeworCXN0cnVjdCBmY29lX2NhY2hlZF9zZ2VfY3R4IGNhY2hlZF9zZ2U7CisJc3RydWN0IGZjb2VfZXh0X211bF9zZ2VzX2N0eCBzZ2w7CisJX19sZTMyIG9wYXF1ZVs1XTsKK307CisKKy8qCisgKiBEYXRhLUluL0VMUy9CTFMgaW5mb3JtYXRpb24gJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9yZWFkX2Zsb3dfaW5mbyB7CisJdW5pb24gZmNvZV9zZ2xfdW5pb25fY3R4IHNnbF9jdHg7CisJX19sZTMyIHJzcnYwWzNdOworfTsKKworCisvKgorICogRmNvZSBzdGF0IGNvbnRleHQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9zX3N0YXRfY3R4IHsKKwl1OCBmbGFnczsKKyNkZWZpbmUgRkNPRV9TX1NUQVRfQ1RYX0FDVElWRSAoMHgxPDwwKQorI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfQUNUSVZFX1NISUZUIDAKKyNkZWZpbmUgRkNPRV9TX1NUQVRfQ1RYX0FDS19BQk9SVF9TRVFfQ09ORCAoMHgxPDwxKQorI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfQUNLX0FCT1JUX1NFUV9DT05EX1NISUZUIDEKKyNkZWZpbmUgRkNPRV9TX1NUQVRfQ1RYX0FCVFNfUEVSRk9STUVEICgweDE8PDIpCisjZGVmaW5lIEZDT0VfU19TVEFUX0NUWF9BQlRTX1BFUkZPUk1FRF9TSElGVCAyCisjZGVmaW5lIEZDT0VfU19TVEFUX0NUWF9TRVFfVElNRU9VVCAoMHgxPDwzKQorI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfU0VRX1RJTUVPVVRfU0hJRlQgMworI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfUF9SSlQgKDB4MTw8NCkKKyNkZWZpbmUgRkNPRV9TX1NUQVRfQ1RYX1BfUkpUX1NISUZUIDQKKyNkZWZpbmUgRkNPRV9TX1NUQVRfQ1RYX0FDS19FT0ZUICgweDE8PDUpCisjZGVmaW5lIEZDT0VfU19TVEFUX0NUWF9BQ0tfRU9GVF9TSElGVCA1CisjZGVmaW5lIEZDT0VfU19TVEFUX0NUWF9SU1JWMSAoMHgzPDw2KQorI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfUlNSVjFfU0hJRlQgNgorfTsKKworLyoKKyAqIEZjb2Ugcnggc2VxIGNvbnRleHQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9yeF9zZXFfY3R4IHsKKwl1OCBzZXFfaWQ7CisJc3RydWN0IGZjb2Vfc19zdGF0X2N0eCBzX3N0YXQ7CisJX19sZTE2IHNlcV9jbnQ7CisJX19sZTMyIGxvd19leHBfcm87CisJX19sZTMyIGhpZ2hfZXhwX3JvOworfTsKKworCisvKgorICogRmNvZSByeF93ciB1bmlvbiBjb250ZXh0ICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLwordW5pb24gZmNvZV9yeF93cl91bmlvbl9jdHggeworCXN0cnVjdCBmY29lX3JlYWRfZmxvd19pbmZvIHJlYWRfaW5mbzsKKwl1bmlvbiBmY29lX2NvbXBfZmxvd19pbmZvIGNvbXBfaW5mbzsKKwlfX2xlMzIgb3BhcXVlWzhdOworfTsKKworCisKKy8qCisgKiBGQ29FIFNRIGVsZW1lbnQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9zcWUgeworCV9fbGUxNiB3cWU7CisjZGVmaW5lIEZDT0VfU1FFX1RBU0tfSUQgKDB4N0ZGRjw8MCkKKyNkZWZpbmUgRkNPRV9TUUVfVEFTS19JRF9TSElGVCAwCisjZGVmaW5lIEZDT0VfU1FFX1RPR0dMRV9CSVQgKDB4MTw8MTUpCisjZGVmaW5lIEZDT0VfU1FFX1RPR0dMRV9CSVRfU0hJRlQgMTUKK307CisKKworCisvKgorICogMTQgcmVncyAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX3RjZV90eF9vbmx5IHsKKwl1bmlvbiBmY29lX3NnbF91bmlvbl9jdHggc2dsX2N0eDsKKwlfX2xlMzIgcnNydjA7Cit9OworCisvKgorICogMzIgYnl0ZXMgKDggcmVncykgdXNlZCBmb3IgVFggb25seSBwdXJwb3NlcyAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3VuaW9uIGZjb2VfdHhfd3JfcnhfcmRfdW5pb25fY3R4IHsKKwlzdHJ1Y3QgZmNvZV9mY19mcmFtZSB0eF9mcmFtZTsKKwlzdHJ1Y3QgZmNvZV9mY3BfY21kX3BheWxvYWQgZmNwX2NtZDsKKwlzdHJ1Y3QgZmNvZV9leHRfY2xlYW51cF9pbmZvIGNsZWFudXA7CisJc3RydWN0IGZjb2VfZXh0X2FidHNfaW5mbyBhYnRzOworCXN0cnVjdCBmY29lX2V4dF9md190eF9zZXFfY3R4IHR4X3NlcTsKKwlfX2xlMzIgb3BhcXVlWzhdOworfTsKKworLyoKKyAqIHRjZV90eF93cl9yeF9yZF9jb25zdCAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX3RjZV90eF93cl9yeF9yZF9jb25zdCB7CisJdTggaW5pdF9mbGFnczsKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVEFTS19UWVBFICgweDc8PDApCisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RBU0tfVFlQRV9TSElGVCAwCisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0RFVl9UWVBFICgweDE8PDMpCisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0RFVl9UWVBFX1NISUZUIDMKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfQ0xBU1NfVFlQRSAoMHgxPDw0KQorI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9DTEFTU19UWVBFX1NISUZUIDQKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfQ0FDSEVEX1NHRSAoMHgzPDw1KQorI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9DQUNIRURfU0dFX1NISUZUIDUKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfU1VQUE9SVF9SRUNfVE9WICgweDE8PDcpCisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1NVUFBPUlRfUkVDX1RPVl9TSElGVCA3CisJdTggdHhfZmxhZ3M7CisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RYX1ZBTElEICgweDE8PDApCisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RYX1ZBTElEX1NISUZUIDAKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVFhfU1RBVEUgKDB4Rjw8MSkKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVFhfU1RBVEVfU0hJRlQgMQorI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9SU1JWMSAoMHgxPDw1KQorI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9SU1JWMV9TSElGVCA1CisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RYX1NFUV9JTklUICgweDE8PDYpCisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RYX1NFUV9JTklUX1NISUZUIDYKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfUlNSVjIgKDB4MTw8NykKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfUlNSVjJfU0hJRlQgNworCV9fbGUxNiByc3J2MzsKKwlfX2xlMzIgdmVyaWZ5X3R4X3NlcTsKK307CisKKy8qCisgKiB0Y2VfdHhfd3JfcnhfcmQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV90Y2VfdHhfd3JfcnhfcmQgeworCXVuaW9uIGZjb2VfdHhfd3JfcnhfcmRfdW5pb25fY3R4IHVuaW9uX2N0eDsKKwlzdHJ1Y3QgZmNvZV90Y2VfdHhfd3JfcnhfcmRfY29uc3QgY29uc3RfY3R4OworfTsKKworLyoKKyAqIHRjZV9yeF93cl90eF9yZF9jb25zdCAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX3RjZV9yeF93cl90eF9yZF9jb25zdCB7CisJX19sZTMyIGRhdGFfMl90cm5zOworCV9fbGUzMiBpbml0X2ZsYWdzOworI2RlZmluZSBGQ09FX1RDRV9SWF9XUl9UWF9SRF9DT05TVF9DSUQgKDB4RkZGRkZGPDwwKQorI2RlZmluZSBGQ09FX1RDRV9SWF9XUl9UWF9SRF9DT05TVF9DSURfU0hJRlQgMAorI2RlZmluZSBGQ09FX1RDRV9SWF9XUl9UWF9SRF9DT05TVF9SU1JWMCAoMHhGRjw8MjQpCisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX0NPTlNUX1JTUlYwX1NISUZUIDI0Cit9OworCisvKgorICogdGNlX3J4X3dyX3R4X3JkX3ZhciAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX3RjZV9yeF93cl90eF9yZF92YXIgeworCV9fbGUxNiByeF9mbGFnczsKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX1JTUlYxICgweEY8PDApCisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9SU1JWMV9TSElGVCAwCisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9OVU1fUlFfV1FFICgweDc8PDQpCisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9OVU1fUlFfV1FFX1NISUZUIDQKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX0NPTkZfUkVRICgweDE8PDcpCisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9DT05GX1JFUV9TSElGVCA3CisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9SWF9TVEFURSAoMHhGPDw4KQorI2RlZmluZSBGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfUlhfU1RBVEVfU0hJRlQgOAorI2RlZmluZSBGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfRVhQX0ZJUlNUX0ZSQU1FICgweDE8PDEyKQorI2RlZmluZSBGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfRVhQX0ZJUlNUX0ZSQU1FX1NISUZUIDEyCisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9SWF9TRVFfSU5JVCAoMHgxPDwxMykKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX1JYX1NFUV9JTklUX1NISUZUIDEzCisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9SU1JWMiAoMHgxPDwxNCkKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX1JTUlYyX1NISUZUIDE0CisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9SWF9WQUxJRCAoMHgxPDwxNSkKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX1JYX1ZBTElEX1NISUZUIDE1CisJX19sZTE2IHJ4X2lkOworCXN0cnVjdCBmY29lX2ZjcF94ZnJfcmR5X3BheWxvYWQgZmNwX3hmcl9yZHk7Cit9OworCisvKgorICogdGNlX3J4X3dyX3R4X3JkICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfdGNlX3J4X3dyX3R4X3JkIHsKKwlzdHJ1Y3QgZmNvZV90Y2Vfcnhfd3JfdHhfcmRfY29uc3QgY29uc3RfY3R4OworCXN0cnVjdCBmY29lX3RjZV9yeF93cl90eF9yZF92YXIgdmFyX2N0eDsKK307CisKKy8qCisgKiB0Y2Vfcnhfb25seSAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX3RjZV9yeF9vbmx5IHsKKwlzdHJ1Y3QgZmNvZV9yeF9zZXFfY3R4IHJ4X3NlcV9jdHg7CisJdW5pb24gZmNvZV9yeF93cl91bmlvbl9jdHggdW5pb25fY3R4OworfTsKKworLyoKKyAqIHRhc2tfY3R4X2VudHJ5ICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgeworCXN0cnVjdCBmY29lX3RjZV90eF9vbmx5IHR4d3Jfb25seTsKKwlzdHJ1Y3QgZmNvZV90Y2VfdHhfd3JfcnhfcmQgdHh3cl9yeHJkOworCXN0cnVjdCBmY29lX3RjZV9yeF93cl90eF9yZCByeHdyX3R4cmQ7CisJc3RydWN0IGZjb2VfdGNlX3J4X29ubHkgcnh3cl9vbmx5OworfTsKKworCisKKworCisKKworCisKKworLyoKKyAqIEZDb0UgWEZSUSBlbGVtZW50ICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfeGZycWUgeworCV9fbGUxNiB3cWU7CisjZGVmaW5lIEZDT0VfWEZSUUVfVEFTS19JRCAoMHg3RkZGPDwwKQorI2RlZmluZSBGQ09FX1hGUlFFX1RBU0tfSURfU0hJRlQgMAorI2RlZmluZSBGQ09FX1hGUlFFX1RPR0dMRV9CSVQgKDB4MTw8MTUpCisjZGVmaW5lIEZDT0VfWEZSUUVfVE9HR0xFX0JJVF9TSElGVCAxNQorfTsKKworCisvKgorICogQ2FjaGVkIFNHRXMgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgY29tbW9uX2Zjb2Vfc2dsIHsKKwlzdHJ1Y3QgZmNvZV9iZF9jdHggc2dlWzNdOworfTsKKworCisvKgorICogRkNvRSBTUVxYRlJRIGVsZW1lbnQKKyAqLworc3RydWN0IGZjb2VfY2FjaGVkX3dxZSB7CisJc3RydWN0IGZjb2Vfc3FlIHNxZTsKKwlzdHJ1Y3QgZmNvZV94ZnJxZSB4ZnJxZTsKK307CisKKworLyoKKyAqIEZDb0UgY29ubmVjdGlvbiBlbmFibGVcZGlzYWJsZSBwYXJhbXMgcGFzc2VkIGJ5IGRyaXZlciB0byBGVyBpbiBGQ29FIGVuYWJsZQorICogcmFtcm9kICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfY29ubl9lbmFibGVfZGlzYWJsZV9yYW1yb2RfcGFyYW1zIHsKKwlzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fZW5hYmxlX2Rpc2FibGUgZW5hYmxlX2Rpc2FibGVfa3dxZTsKK307CisKKworLyoKKyAqIEZDb0UgY29ubmVjdGlvbiBvZmZsb2FkIHBhcmFtcyBwYXNzZWQgYnkgZHJpdmVyIHRvIEZXIGluIEZDb0Ugb2ZmbG9hZCByYW1yb2QKKyAqICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfY29ubl9vZmZsb2FkX3JhbXJvZF9wYXJhbXMgeworCXN0cnVjdCBmY29lX2t3cWVfY29ubl9vZmZsb2FkMSBvZmZsb2FkX2t3cWUxOworCXN0cnVjdCBmY29lX2t3cWVfY29ubl9vZmZsb2FkMiBvZmZsb2FkX2t3cWUyOworCXN0cnVjdCBmY29lX2t3cWVfY29ubl9vZmZsb2FkMyBvZmZsb2FkX2t3cWUzOworCXN0cnVjdCBmY29lX2t3cWVfY29ubl9vZmZsb2FkNCBvZmZsb2FkX2t3cWU0OworfTsKKworCitzdHJ1Y3QgdXN0b3JtX2Zjb2VfbW5nX2N0eCB7CiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggYWdnX3ZhbDNfdGg7Ci0JdTggYWdnX3ZhbDM7Ci0JdTE2IGFnZ19taXNjMzsKKwl1OCBtaWRfc2VxX3Byb2NfZmxhZzsKKwl1OCB0Y2VfaW5fY2FtX2ZsYWc7CisJdTggdGNlX29uX2lvcl9mbGFnOworCXU4IGVuX2NhY2hlZF90Y2VfZmxhZzsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBhZ2dfbWlzYzM7Ci0JdTggYWdnX3ZhbDM7Ci0JdTggYWdnX3ZhbDNfdGg7Ci0jZW5kaWYKLQl1MzIgYWdnX3ZhbDE7Ci0JdTMyIGFnZ19taXNjNF90aDsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgYWdnX3ZhbDJfdGg7Ci0JdTE2IGFnZ192YWwyOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGFnZ192YWwyOwotCXUxNiBhZ2dfdmFsMl90aDsKKwl1OCBlbl9jYWNoZWRfdGNlX2ZsYWc7CisJdTggdGNlX29uX2lvcl9mbGFnOworCXU4IHRjZV9pbl9jYW1fZmxhZzsKKwl1OCBtaWRfc2VxX3Byb2NfZmxhZzsKICNlbmRpZgogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBfX3Jlc2VydmVkMjsKLQl1OCBkZWNpc2lvbl9ydWxlczsKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDJfUlVMRSAoMHg3PDwwKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfVkFMMl9SVUxFX1NISUZUIDAKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfVkFMM19SVUxFICgweDc8PDMpCi0jZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDNfUlVMRV9TSElGVCAzCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0FHR19WQUwyX0FSTV9OX0ZMQUcgKDB4MTw8NikKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDJfQVJNX05fRkxBR19TSElGVCA2Ci0jZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUkVTRVJWRUQxICgweDE8PDcpCi0jZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUkVTRVJWRUQxX1NISUZUIDcKLQl1OCBkZWNpc2lvbl9ydWxlX2VuYWJsZV9iaXRzOwotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9JTlZfQ0ZfRU4gKDB4MTw8MCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfSU5WX0NGX0VOX1NISUZUIDAKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRl9FTiAoMHgxPDwxKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9DT01QTEVUSU9OX0NGX0VOX1NISUZUIDEKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVFhfQ0ZfRU4gKDB4MTw8MikKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVFhfQ0ZfRU5fU0hJRlQgMgotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX1RJTUVSX0NGX0VOICgweDE8PDMpCi0jZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVElNRVJfQ0ZfRU5fU0hJRlQgMwotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0NRX0xPQ0FMX0NPTVBfQ0ZfRU4gKDB4MTw8NCkKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9DUV9MT0NBTF9DT01QX0NGX0VOX1NISUZUIDQKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9RVUVVRVNfRkxVU0hfUTBfQ0ZfRU4gKDB4MTw8NSkKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9RVUVVRVNfRkxVU0hfUTBfQ0ZfRU5fU0hJRlQgNQotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDNfQ0ZfRU4gKDB4MTw8NikKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVgzX0NGX0VOX1NISUZUIDYKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9EUV9DRl9FTiAoMHgxPDw3KQotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0RRX0NGX0VOX1NISUZUIDcKKwl1OCB0Y2VfY2FtX2FkZHI7CisJdTggY2FjaGVkX2Nvbm5fZmxhZzsKKwl1MTYgcnNydjA7CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBkZWNpc2lvbl9ydWxlX2VuYWJsZV9iaXRzOwotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9JTlZfQ0ZfRU4gKDB4MTw8MCkKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfSU5WX0NGX0VOX1NISUZUIDAKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQ09NUExFVElPTl9DRl9FTiAoMHgxPDwxKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9DT01QTEVUSU9OX0NGX0VOX1NISUZUIDEKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVFhfQ0ZfRU4gKDB4MTw8MikKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVFhfQ0ZfRU5fU0hJRlQgMgotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX1RJTUVSX0NGX0VOICgweDE8PDMpCi0jZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfVElNRVJfQ0ZfRU5fU0hJRlQgMwotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0NRX0xPQ0FMX0NPTVBfQ0ZfRU4gKDB4MTw8NCkKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9DUV9MT0NBTF9DT01QX0NGX0VOX1NISUZUIDQKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9RVUVVRVNfRkxVU0hfUTBfQ0ZfRU4gKDB4MTw8NSkKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9RVUVVRVNfRkxVU0hfUTBfQ0ZfRU5fU0hJRlQgNQotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0FVWDNfQ0ZfRU4gKDB4MTw8NikKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BVVgzX0NGX0VOX1NISUZUIDYKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9EUV9DRl9FTiAoMHgxPDw3KQotI2RlZmluZSBfX1VTVE9STV9JU0NTSV9BR19DT05URVhUX0RRX0NGX0VOX1NISUZUIDcKLQl1OCBkZWNpc2lvbl9ydWxlczsKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDJfUlVMRSAoMHg3PDwwKQotI2RlZmluZSBVU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfVkFMMl9SVUxFX1NISUZUIDAKLSNkZWZpbmUgX19VU1RPUk1fSVNDU0lfQUdfQ09OVEVYVF9BR0dfVkFMM19SVUxFICgweDc8PDMpCi0jZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDNfUlVMRV9TSElGVCAzCi0jZGVmaW5lIFVTVE9STV9JU0NTSV9BR19DT05URVhUX0FHR19WQUwyX0FSTV9OX0ZMQUcgKDB4MTw8NikKLSNkZWZpbmUgVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfQUdHX1ZBTDJfQVJNX05fRkxBR19TSElGVCA2Ci0jZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUkVTRVJWRUQxICgweDE8PDcpCi0jZGVmaW5lIF9fVVNUT1JNX0lTQ1NJX0FHX0NPTlRFWFRfUkVTRVJWRUQxX1NISUZUIDcKLQl1MTYgX19yZXNlcnZlZDI7CisJdTE2IHJzcnYwOworCXU4IGNhY2hlZF9jb25uX2ZsYWc7CisJdTggdGNlX2NhbV9hZGRyOwogI2VuZGlmCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IGRtYV90Y2VfcmFtX2FkZHI7CisJdTE2IHRjZV9yYW1fYWRkcjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiB0Y2VfcmFtX2FkZHI7CisJdTE2IGRtYV90Y2VfcmFtX2FkZHI7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgb3hfaWQ7CisJdTE2IHdyX2RvbmVfc2VxOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IHdyX2RvbmVfc2VxOworCXUxNiBveF9pZDsKKyNlbmRpZgorCXN0cnVjdCByZWdwYWlyIHRhc2tfYWRkcjsKK307CisKKy8qCisgKiBQYXJhbWV0ZXJzIGluaXRpYWxpemVkIGR1cmluZyBvZmZsb2FkZWQgYWNjb3JkaW5nIHRvIEZMT0dJL1BMT0dJL1BSTEkgYW5kCisgKiB1c2VkIGluIEZDb0UgY29udGV4dCBzZWN0aW9uCisgKi8KK3N0cnVjdCB1c3Rvcm1fZmNvZV9wYXJhbXMgeworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBmY29lX2Nvbm5faWQ7CisJdTE2IGZsYWdzOworI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9NVUxfTl9QT1JUX0lEUyAoMHgxPDwwKQorI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9NVUxfTl9QT1JUX0lEU19TSElGVCAwCisjZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0VfRF9UT1ZfUkVTICgweDE8PDEpCisjZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0VfRF9UT1ZfUkVTX1NISUZUIDEKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfQ09OVF9JTkNSX1NFUV9DTlQgKDB4MTw8MikKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfQ09OVF9JTkNSX1NFUV9DTlRfU0hJRlQgMgorI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9DT05GX1JFUSAoMHgxPDwzKQorI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9DT05GX1JFUV9TSElGVCAzCisjZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX1JFQ19WQUxJRCAoMHgxPDw0KQorI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9SRUNfVkFMSURfU0hJRlQgNAorI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9DUV9UT0dHTEVfQklUICgweDE8PDUpCisjZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0NRX1RPR0dMRV9CSVRfU0hJRlQgNQorI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9YRlJRX1RPR0dMRV9CSVQgKDB4MTw8NikKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfWEZSUV9UT0dHTEVfQklUX1NISUZUIDYKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX1JTUlYwICgweDFGRjw8NykKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX1JTUlYwX1NISUZUIDcKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBmbGFnczsKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfTVVMX05fUE9SVF9JRFMgKDB4MTw8MCkKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfTVVMX05fUE9SVF9JRFNfU0hJRlQgMAorI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9FX0RfVE9WX1JFUyAoMHgxPDwxKQorI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9FX0RfVE9WX1JFU19TSElGVCAxCisjZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0NPTlRfSU5DUl9TRVFfQ05UICgweDE8PDIpCisjZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX0NPTlRfSU5DUl9TRVFfQ05UX1NISUZUIDIKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfQ09ORl9SRVEgKDB4MTw8MykKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfQ09ORl9SRVFfU0hJRlQgMworI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9SRUNfVkFMSUQgKDB4MTw8NCkKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfUkVDX1ZBTElEX1NISUZUIDQKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfQ1FfVE9HR0xFX0JJVCAoMHgxPDw1KQorI2RlZmluZSBVU1RPUk1fRkNPRV9QQVJBTVNfQl9DUV9UT0dHTEVfQklUX1NISUZUIDUKKyNkZWZpbmUgVVNUT1JNX0ZDT0VfUEFSQU1TX0JfWEZSUV9UT0dHTEVfQklUICgweDE8PDYpCisjZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19CX1hGUlFfVE9HR0xFX0JJVF9TSElGVCA2CisjZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19SU1JWMCAoMHgxRkY8PDcpCisjZGVmaW5lIFVTVE9STV9GQ09FX1BBUkFNU19SU1JWMF9TSElGVCA3CisJdTE2IGZjb2VfY29ubl9pZDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IGhjX2NzZG1fYnl0ZV9lbjsKKwl1OCBmdW5jX2lkOworCXU4IHBvcnRfaWQ7CisJdTggdm5pY19pZDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXU4IHZuaWNfaWQ7CisJdTggcG9ydF9pZDsKKwl1OCBmdW5jX2lkOworCXU4IGhjX2NzZG1fYnl0ZV9lbjsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiByeF90b3RhbF9jb25jX3NlcXM7CisJdTE2IHJ4X21heF9mY19wYXlfbGVuOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IHJ4X21heF9mY19wYXlfbGVuOworCXUxNiByeF90b3RhbF9jb25jX3NlcXM7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCB0YXNrX3BiZV9pZHhfb2ZmOworCXU4IHRhc2tfaW5fcGFnZV9sb2dfc2l6ZTsKKwl1MTYgcnhfbWF4X2NvbmNfc2VxczsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiByeF9tYXhfY29uY19zZXFzOworCXU4IHRhc2tfaW5fcGFnZV9sb2dfc2l6ZTsKKwl1OCB0YXNrX3BiZV9pZHhfb2ZmOworI2VuZGlmCit9OworCisvKgorICogRkNvRSAxNi1iaXRzIGluZGV4IHN0cnVjdHVyZQorICovCitzdHJ1Y3QgZmNvZV9pZHgxNl9maWVsZHMgeworCXUxNiBmaWVsZHM7CisjZGVmaW5lIEZDT0VfSURYMTZfRklFTERTX0lEWCAoMHg3RkZGPDwwKQorI2RlZmluZSBGQ09FX0lEWDE2X0ZJRUxEU19JRFhfU0hJRlQgMAorI2RlZmluZSBGQ09FX0lEWDE2X0ZJRUxEU19NU0IgKDB4MTw8MTUpCisjZGVmaW5lIEZDT0VfSURYMTZfRklFTERTX01TQl9TSElGVCAxNQorfTsKKworLyoKKyAqIEZDb0UgMTYtYml0cyBpbmRleCB1bmlvbgorICovCit1bmlvbiBmY29lX2lkeDE2X2ZpZWxkX3VuaW9uIHsKKwlzdHJ1Y3QgZmNvZV9pZHgxNl9maWVsZHMgZmllbGRzOworCXUxNiB2YWw7Cit9OworCisvKgorICogUGFyYW1ldGVycyByZXF1aXJlZCBmb3IgcGxhY2VtZW50IGFjY29yZGluZyB0byBTR0wKKyAqLworc3RydWN0IHVzdG9ybV9mY29lX2RhdGFfcGxhY2VfbW5nIHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgc2dlX29mZjsKKwl1OCBudW1fc2dlczsKKwl1OCBzZ2VfaWR4OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTggc2dlX2lkeDsKKwl1OCBudW1fc2dlczsKKwl1MTYgc2dlX29mZjsKKyNlbmRpZgorfTsKKworLyoKKyAqIFBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIHBsYWNlbWVudCBhY2NvcmRpbmcgdG8gU0dMCisgKi8KK3N0cnVjdCB1c3Rvcm1fZmNvZV9kYXRhX3BsYWNlIHsKKwlzdHJ1Y3QgdXN0b3JtX2Zjb2VfZGF0YV9wbGFjZV9tbmcgY2FjaGVkX21uZzsKKwlzdHJ1Y3QgZmNvZV9iZF9jdHggY2FjaGVkX3NnZVsyXTsKK307CisKKy8qCisgKiBUWCBwcm9jZXNzaW5nIHNoYWxsIHdyaXRlIGFuZCBSWCBwcm9jZXNzaW5nIHNoYWxsIHJlYWQgZnJvbSB0aGlzIHNlY3Rpb24KKyAqLwordW5pb24gZmNvZV91X3RjZV90eF93cl9yeF9yZF91bmlvbiB7CisJc3RydWN0IGZjb2VfYWJ0c19pbmZvIGFidHM7CisJc3RydWN0IGZjb2VfY2xlYW51cF9pbmZvIGNsZWFudXA7CisJc3RydWN0IGZjb2VfZndfdHhfc2VxX2N0eCB0eF9zZXFfY3R4OworCXUzMiBvcGFxdWVbMl07Cit9OworCisvKgorICogVFggcHJvY2Vzc2luZyBzaGFsbCB3cml0ZSBhbmQgUlggcHJvY2Vzc2luZyBzaGFsbCByZWFkIGZyb20gdGhpcyBzZWN0aW9uCisgKi8KK3N0cnVjdCBmY29lX3VfdGNlX3R4X3dyX3J4X3JkIHsKKwl1bmlvbiBmY29lX3VfdGNlX3R4X3dyX3J4X3JkX3VuaW9uIHVuaW9uX2N0eDsKKwlzdHJ1Y3QgZmNvZV90Y2VfdHhfd3JfcnhfcmRfY29uc3QgY29uc3RfY3R4OworfTsKKworc3RydWN0IHVzdG9ybV9mY29lX3RjZSB7CisJc3RydWN0IGZjb2VfdV90Y2VfdHhfd3JfcnhfcmQgdHh3cl9yeHJkOworCXN0cnVjdCBmY29lX3RjZV9yeF93cl90eF9yZCByeHdyX3R4cmQ7CisJc3RydWN0IGZjb2VfdGNlX3J4X29ubHkgcnh3cjsKK307CisKK3N0cnVjdCB1c3Rvcm1fZmNvZV9jYWNoZV9jdHggeworCXUzMiByc3J2MDsKKwlzdHJ1Y3QgdXN0b3JtX2Zjb2VfZGF0YV9wbGFjZSBkYXRhX3BsYWNlOworCXN0cnVjdCB1c3Rvcm1fZmNvZV90Y2UgdGNlOworfTsKKworLyoKKyAqIFVzdG9ybSBGQ29FIFN0b3JtIENvbnRleHQKKyAqLworc3RydWN0IHVzdG9ybV9mY29lX3N0X2NvbnRleHQgeworCXN0cnVjdCB1c3Rvcm1fZmNvZV9tbmdfY3R4IG1uZ19jdHg7CisJc3RydWN0IHVzdG9ybV9mY29lX3BhcmFtcyBmY29lX3BhcmFtczsKKwlzdHJ1Y3QgcmVncGFpciBjcV9iYXNlX2FkZHI7CisJc3RydWN0IHJlZ3BhaXIgcnFfcGJsX2Jhc2U7CisJc3RydWN0IHJlZ3BhaXIgcnFfY3VyX3BhZ2VfYWRkcjsKKwlzdHJ1Y3QgcmVncGFpciBjb25mcV9wYmxfYmFzZV9hZGRyOworCXN0cnVjdCByZWdwYWlyIGNvbm5fZGJfYmFzZTsKKwlzdHJ1Y3QgcmVncGFpciB4ZnJxX2Jhc2VfYWRkcjsKKwlzdHJ1Y3QgcmVncGFpciBsY3FfYmFzZV9hZGRyOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXVuaW9uIGZjb2VfaWR4MTZfZmllbGRfdW5pb24gcnFfY29uczsKKwl1bmlvbiBmY29lX2lkeDE2X2ZpZWxkX3VuaW9uIHJxX3Byb2Q7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1bmlvbiBmY29lX2lkeDE2X2ZpZWxkX3VuaW9uIHJxX3Byb2Q7CisJdW5pb24gZmNvZV9pZHgxNl9maWVsZF91bmlvbiBycV9jb25zOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IHhmcnFfcHJvZDsKKwl1MTYgY3FfY29uczsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBjcV9jb25zOworCXUxNiB4ZnJxX3Byb2Q7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgbGNxX2NvbnM7CisJdTE2IGhjX2NyYW1fYWRkcmVzczsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBoY19jcmFtX2FkZHJlc3M7CisJdTE2IGxjcV9jb25zOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IHNxX3hmcnFfbGNxX2NvbmZxX3NpemU7CisJdTE2IGNvbmZxX3Byb2Q7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgY29uZnFfcHJvZDsKKwl1MTYgc3FfeGZycV9sY3FfY29uZnFfc2l6ZTsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IGhjX2NzZG1fYWdnX2ludDsKKwl1OCByc3J2MjsKKwl1OCBhdmFpbGFibGVfcnFlczsKKwl1OCBzcF9xX2ZsdXNoX2NudDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXU4IHNwX3FfZmx1c2hfY250OworCXU4IGF2YWlsYWJsZV9ycWVzOworCXU4IHJzcnYyOworCXU4IGhjX2NzZG1fYWdnX2ludDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBudW1fcGVuZF90YXNrczsKKwl1MTYgcGJmX2Fja19yYW1fYWRkcjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBwYmZfYWNrX3JhbV9hZGRyOworCXUxNiBudW1fcGVuZF90YXNrczsKKyNlbmRpZgorCXN0cnVjdCB1c3Rvcm1fZmNvZV9jYWNoZV9jdHggY2FjaGVfY3R4OworfTsKKworLyoKKyAqIFRoZSBGQ29FIG5vbi1hZ2dyZWdhdGl2ZSBjb250ZXh0IG9mIFRzdG9ybQorICovCitzdHJ1Y3QgdHN0b3JtX2Zjb2Vfc3RfY29udGV4dCB7CisJc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWQwOworCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkMTsKK307CisKKy8qCisgKiBFdGhlcm5ldCBjb250ZXh0IHNlY3Rpb24KKyAqLworc3RydWN0IHhzdG9ybV9mY29lX2V0aF9jb250ZXh0X3NlY3Rpb24geworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IHJlbW90ZV9hZGRyXzQ7CisJdTggcmVtb3RlX2FkZHJfNTsKKwl1OCBsb2NhbF9hZGRyXzA7CisJdTggbG9jYWxfYWRkcl8xOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTggbG9jYWxfYWRkcl8xOworCXU4IGxvY2FsX2FkZHJfMDsKKwl1OCByZW1vdGVfYWRkcl81OworCXU4IHJlbW90ZV9hZGRyXzQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCByZW1vdGVfYWRkcl8wOworCXU4IHJlbW90ZV9hZGRyXzE7CisJdTggcmVtb3RlX2FkZHJfMjsKKwl1OCByZW1vdGVfYWRkcl8zOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTggcmVtb3RlX2FkZHJfMzsKKwl1OCByZW1vdGVfYWRkcl8yOworCXU4IHJlbW90ZV9hZGRyXzE7CisJdTggcmVtb3RlX2FkZHJfMDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiByZXNlcnZlZF92bGFuX3R5cGU7CisJdTE2IHBhcmFtczsKKyNkZWZpbmUgWFNUT1JNX0ZDT0VfRVRIX0NPTlRFWFRfU0VDVElPTl9WTEFOX0lEICgweEZGRjw8MCkKKyNkZWZpbmUgWFNUT1JNX0ZDT0VfRVRIX0NPTlRFWFRfU0VDVElPTl9WTEFOX0lEX1NISUZUIDAKKyNkZWZpbmUgWFNUT1JNX0ZDT0VfRVRIX0NPTlRFWFRfU0VDVElPTl9DRkkgKDB4MTw8MTIpCisjZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fQ0ZJX1NISUZUIDEyCisjZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fUFJJT1JJVFkgKDB4Nzw8MTMpCisjZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fUFJJT1JJVFlfU0hJRlQgMTMKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBwYXJhbXM7CisjZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fVkxBTl9JRCAoMHhGRkY8PDApCisjZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fVkxBTl9JRF9TSElGVCAwCisjZGVmaW5lIFhTVE9STV9GQ09FX0VUSF9DT05URVhUX1NFQ1RJT05fQ0ZJICgweDE8PDEyKQorI2RlZmluZSBYU1RPUk1fRkNPRV9FVEhfQ09OVEVYVF9TRUNUSU9OX0NGSV9TSElGVCAxMgorI2RlZmluZSBYU1RPUk1fRkNPRV9FVEhfQ09OVEVYVF9TRUNUSU9OX1BSSU9SSVRZICgweDc8PDEzKQorI2RlZmluZSBYU1RPUk1fRkNPRV9FVEhfQ09OVEVYVF9TRUNUSU9OX1BSSU9SSVRZX1NISUZUIDEzCisJdTE2IHJlc2VydmVkX3ZsYW5fdHlwZTsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IGxvY2FsX2FkZHJfMjsKKwl1OCBsb2NhbF9hZGRyXzM7CisJdTggbG9jYWxfYWRkcl80OworCXU4IGxvY2FsX2FkZHJfNTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXU4IGxvY2FsX2FkZHJfNTsKKwl1OCBsb2NhbF9hZGRyXzQ7CisJdTggbG9jYWxfYWRkcl8zOworCXU4IGxvY2FsX2FkZHJfMjsKKyNlbmRpZgorfTsKKworLyoKKyAqIEZsYWdzIHVzZWQgaW4gRkNvRSBjb250ZXh0IHNlY3Rpb24gLSAxIGJ5dGUKKyAqLworc3RydWN0IHhzdG9ybV9mY29lX2NvbnRleHRfZmxhZ3MgeworCXU4IGZsYWdzOworI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfUFJPQ19RICgweDM8PDApCisjZGVmaW5lIFhTVE9STV9GQ09FX0NPTlRFWFRfRkxBR1NfQl9QUk9DX1FfU0hJRlQgMAorI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfTUlEX1NFUSAoMHgxPDwyKQorI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfTUlEX1NFUV9TSElGVCAyCisjZGVmaW5lIFhTVE9STV9GQ09FX0NPTlRFWFRfRkxBR1NfQl9CTE9DS19TUSAoMHgxPDwzKQorI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfQkxPQ0tfU1FfU0hJRlQgMworI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfUkVDX1NVUFBPUlQgKDB4MTw8NCkKKyNkZWZpbmUgWFNUT1JNX0ZDT0VfQ09OVEVYVF9GTEFHU19CX1JFQ19TVVBQT1JUX1NISUZUIDQKKyNkZWZpbmUgWFNUT1JNX0ZDT0VfQ09OVEVYVF9GTEFHU19CX1NRX1RPR0dMRSAoMHgxPDw1KQorI2RlZmluZSBYU1RPUk1fRkNPRV9DT05URVhUX0ZMQUdTX0JfU1FfVE9HR0xFX1NISUZUIDUKKyNkZWZpbmUgWFNUT1JNX0ZDT0VfQ09OVEVYVF9GTEFHU19CX1hGUlFfVE9HR0xFICgweDE8PDYpCisjZGVmaW5lIFhTVE9STV9GQ09FX0NPTlRFWFRfRkxBR1NfQl9YRlJRX1RPR0dMRV9TSElGVCA2CisjZGVmaW5lIFhTVE9STV9GQ09FX0NPTlRFWFRfRkxBR1NfQl9WTlRBR19WTEFOICgweDE8PDcpCisjZGVmaW5lIFhTVE9STV9GQ09FX0NPTlRFWFRfRkxBR1NfQl9WTlRBR19WTEFOX1NISUZUIDcKK307CisKK3N0cnVjdCB4c3Rvcm1fZmNvZV90Y2UgeworCXN0cnVjdCBmY29lX3RjZV90eF9vbmx5IHR4d3I7CisJc3RydWN0IGZjb2VfdGNlX3R4X3dyX3J4X3JkIHR4d3JfcnhyZDsKK307CisKKy8qCisgKiBGQ1BfREFUQSBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciB0cmFuc21pc3Npb24KKyAqLworc3RydWN0IHhzdG9ybV9mY29lX2ZjcF9kYXRhIHsKKwl1MzIgaW9fcmVtOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBjYWNoZWRfc2dlX29mZjsKKwl1OCBjYWNoZWRfbnVtX3NnZXM7CisJdTggY2FjaGVkX3NnZV9pZHg7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1OCBjYWNoZWRfc2dlX2lkeDsKKwl1OCBjYWNoZWRfbnVtX3NnZXM7CisJdTE2IGNhY2hlZF9zZ2Vfb2ZmOworI2VuZGlmCisJdTMyIGJ1Zl9hZGRyX2hpXzA7CisJdTMyIGJ1Zl9hZGRyX2xvXzA7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IG51bV9vZl9wZW5kaW5nX3Rhc2tzOworCXUxNiBidWZfbGVuXzA7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgYnVmX2xlbl8wOworCXUxNiBudW1fb2ZfcGVuZGluZ190YXNrczsKKyNlbmRpZgorCXUzMiBidWZfYWRkcl9oaV8xOworCXUzMiBidWZfYWRkcl9sb18xOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiB0YXNrX3BiZV9pZHhfb2ZmOworCXUxNiBidWZfbGVuXzE7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgYnVmX2xlbl8xOworCXUxNiB0YXNrX3BiZV9pZHhfb2ZmOworI2VuZGlmCisJdTMyIGJ1Zl9hZGRyX2hpXzI7CisJdTMyIGJ1Zl9hZGRyX2xvXzI7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IG94X2lkOworCXUxNiBidWZfbGVuXzI7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgYnVmX2xlbl8yOworCXUxNiBveF9pZDsKKyNlbmRpZgorfTsKKworLyoKKyAqIHZsYW4gY29uZmlndXJhdGlvbgorICovCitzdHJ1Y3QgeHN0b3JtX2Zjb2Vfdmxhbl9jb25mIHsKKwl1OCB2bGFuX2NvbmY7CisjZGVmaW5lIFhTVE9STV9GQ09FX1ZMQU5fQ09ORl9QUklPUklUWSAoMHg3PDwwKQorI2RlZmluZSBYU1RPUk1fRkNPRV9WTEFOX0NPTkZfUFJJT1JJVFlfU0hJRlQgMAorI2RlZmluZSBYU1RPUk1fRkNPRV9WTEFOX0NPTkZfSU5ORVJfVkxBTl9GTEFHICgweDE8PDMpCisjZGVmaW5lIFhTVE9STV9GQ09FX1ZMQU5fQ09ORl9JTk5FUl9WTEFOX0ZMQUdfU0hJRlQgMworI2RlZmluZSBYU1RPUk1fRkNPRV9WTEFOX0NPTkZfUkVTRVJWRUQgKDB4Rjw8NCkKKyNkZWZpbmUgWFNUT1JNX0ZDT0VfVkxBTl9DT05GX1JFU0VSVkVEX1NISUZUIDQKK307CisKKy8qCisgKiBGQ29FIDE2LWJpdHMgdmxhbiBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGZjb2Vfdmxhbl9maWVsZHMgeworCXUxNiBmaWVsZHM7CisjZGVmaW5lIEZDT0VfVkxBTl9GSUVMRFNfVklEICgweEZGRjw8MCkKKyNkZWZpbmUgRkNPRV9WTEFOX0ZJRUxEU19WSURfU0hJRlQgMAorI2RlZmluZSBGQ09FX1ZMQU5fRklFTERTX0NMSSAoMHgxPDwxMikKKyNkZWZpbmUgRkNPRV9WTEFOX0ZJRUxEU19DTElfU0hJRlQgMTIKKyNkZWZpbmUgRkNPRV9WTEFOX0ZJRUxEU19QUkkgKDB4Nzw8MTMpCisjZGVmaW5lIEZDT0VfVkxBTl9GSUVMRFNfUFJJX1NISUZUIDEzCit9OworCisvKgorICogRkNvRSAxNi1iaXRzIHZsYW4gdW5pb24KKyAqLwordW5pb24gZmNvZV92bGFuX2ZpZWxkX3VuaW9uIHsKKwlzdHJ1Y3QgZmNvZV92bGFuX2ZpZWxkcyBmaWVsZHM7CisJdTE2IHZhbDsKK307CisKKy8qCisgKiBGQ29FIDE2LWJpdHMgdmxhbiwgdmlmIHVuaW9uCisgKi8KK3VuaW9uIGZjb2Vfdmxhbl92aWZfZmllbGRfdW5pb24geworCXVuaW9uIGZjb2Vfdmxhbl9maWVsZF91bmlvbiB2bGFuOworCXUxNiB2aWY7Cit9OworCisvKgorICogRkNvRSBjb250ZXh0IHNlY3Rpb24KKyAqLworc3RydWN0IHhzdG9ybV9mY29lX2NvbnRleHRfc2VjdGlvbiB7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTggY3NfY3RsOworCXU4IHNfaWRbM107CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1OCBzX2lkWzNdOworCXU4IGNzX2N0bDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IHJjdGw7CisJdTggZF9pZFszXTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXU4IGRfaWRbM107CisJdTggcmN0bDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBzcV94ZnJxX2xjcV9jb25mcV9zaXplOworCXUxNiB0eF9tYXhfZmNfcGF5X2xlbjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiB0eF9tYXhfZmNfcGF5X2xlbjsKKwl1MTYgc3FfeGZycV9sY3FfY29uZnFfc2l6ZTsKKyNlbmRpZgorCXUzMiBsY3FfcHJvZDsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCBwb3J0X2lkOworCXU4IGZ1bmNfaWQ7CisJdTggc2VxX2lkOworCXN0cnVjdCB4c3Rvcm1fZmNvZV9jb250ZXh0X2ZsYWdzIHR4X2ZsYWdzOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJc3RydWN0IHhzdG9ybV9mY29lX2NvbnRleHRfZmxhZ3MgdHhfZmxhZ3M7CisJdTggc2VxX2lkOworCXU4IGZ1bmNfaWQ7CisJdTggcG9ydF9pZDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBtdHU7CisJdTggZnVuY19tb2RlOworCXU4IHZuaWNfaWQ7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1OCB2bmljX2lkOworCXU4IGZ1bmNfbW9kZTsKKwl1MTYgbXR1OworI2VuZGlmCisJc3RydWN0IHJlZ3BhaXIgY29uZnFfY3Vycl9wYWdlX2FkZHI7CisJc3RydWN0IGZjb2VfY2FjaGVkX3dxZSBjYWNoZWRfd3FlWzhdOworCXN0cnVjdCByZWdwYWlyIGxjcV9iYXNlX2FkZHI7CisJc3RydWN0IHhzdG9ybV9mY29lX3RjZSB0Y2U7CisJc3RydWN0IHhzdG9ybV9mY29lX2ZjcF9kYXRhIGZjcF9kYXRhOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IHR4X21heF9jb25jX3NlcXNfYzM7CisJdTggdmxhbl9mbGFnOworCXU4IGRjYl92YWw7CisJdTggZGF0YV9wYl9jbWRfc2l6ZTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXU4IGRhdGFfcGJfY21kX3NpemU7CisJdTggZGNiX3ZhbDsKKwl1OCB2bGFuX2ZsYWc7CisJdTggdHhfbWF4X2NvbmNfc2Vxc19jMzsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBmY29lX3R4X3N0YXRfcGFyYW1zX3JhbV9hZGRyOworCXUxNiBmY29lX3R4X2ZjX3NlcV9yYW1fYWRkcjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBmY29lX3R4X2ZjX3NlcV9yYW1fYWRkcjsKKwl1MTYgZmNvZV90eF9zdGF0X3BhcmFtc19yYW1fYWRkcjsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IGZjcF9jbWRfbGluZV9jcmVkaXQ7CisJdTggZXRoX2hkcl9zaXplOworCXUxNiBwYmZfYWRkcjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBwYmZfYWRkcjsKKwl1OCBldGhfaGRyX3NpemU7CisJdTggZmNwX2NtZF9saW5lX2NyZWRpdDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXVuaW9uIGZjb2Vfdmxhbl92aWZfZmllbGRfdW5pb24gbXVsdGlfZnVuY192YWw7CisJdTggcGFnZV9sb2dfc2l6ZTsKKwlzdHJ1Y3QgeHN0b3JtX2Zjb2Vfdmxhbl9jb25mIG9yaWdfdmxhbl9jb25mOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJc3RydWN0IHhzdG9ybV9mY29lX3ZsYW5fY29uZiBvcmlnX3ZsYW5fY29uZjsKKwl1OCBwYWdlX2xvZ19zaXplOworCXVuaW9uIGZjb2Vfdmxhbl92aWZfZmllbGRfdW5pb24gbXVsdGlfZnVuY192YWw7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgZmNwX2NtZF9mcmFtZV9zaXplOworCXUxNiBwYmZfYWRkcl9mZjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBwYmZfYWRkcl9mZjsKKwl1MTYgZmNwX2NtZF9mcmFtZV9zaXplOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTggdmxhbl9udW07CisJdTggY29zOworCXU4IGNhY2hlX3hmcnFfY29uczsKKwl1OCBjYWNoZV9zcV9jb25zOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTggY2FjaGVfc3FfY29uczsKKwl1OCBjYWNoZV94ZnJxX2NvbnM7CisJdTggY29zOworCXU4IHZsYW5fbnVtOworI2VuZGlmCisJdTMyIHZlcmlmeV90eF9zZXE7Cit9OworCisvKgorICogWHN0b3JtIEZDb0UgU3Rvcm0gQ29udGV4dAorICovCitzdHJ1Y3QgeHN0b3JtX2Zjb2Vfc3RfY29udGV4dCB7CisJc3RydWN0IHhzdG9ybV9mY29lX2V0aF9jb250ZXh0X3NlY3Rpb24gZXRoOworCXN0cnVjdCB4c3Rvcm1fZmNvZV9jb250ZXh0X3NlY3Rpb24gZmNvZTsKK307CisKKy8qCisgKiBGY29lIGNvbm5lY3Rpb24gY29udGV4dAorICovCitzdHJ1Y3QgZmNvZV9jb250ZXh0IHsKKwlzdHJ1Y3QgdXN0b3JtX2Zjb2Vfc3RfY29udGV4dCB1c3Rvcm1fc3RfY29udGV4dDsKKwlzdHJ1Y3QgdHN0b3JtX2Zjb2Vfc3RfY29udGV4dCB0c3Rvcm1fc3RfY29udGV4dDsKKwlzdHJ1Y3QgeHN0b3JtX2Zjb2VfYWdfY29udGV4dCB4c3Rvcm1fYWdfY29udGV4dDsKKwlzdHJ1Y3QgdHN0b3JtX2Zjb2VfYWdfY29udGV4dCB0c3Rvcm1fYWdfY29udGV4dDsKKwlzdHJ1Y3QgdXN0b3JtX2Zjb2VfYWdfY29udGV4dCB1c3Rvcm1fYWdfY29udGV4dDsKKwlzdHJ1Y3QgdGltZXJzX2Jsb2NrX2NvbnRleHQgdGltZXJzX2NvbnRleHQ7CisJc3RydWN0IHhzdG9ybV9mY29lX3N0X2NvbnRleHQgeHN0b3JtX3N0X2NvbnRleHQ7Cit9OworCisvKgorICogRkNvRSBpbml0IHBhcmFtcyBwYXNzZWQgYnkgZHJpdmVyIHRvIEZXIGluIEZDb0UgaW5pdCByYW1yb2QKKyAqICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfaW5pdF9yYW1yb2RfcGFyYW1zIHsKKwlzdHJ1Y3QgZmNvZV9rd3FlX2luaXQxIGluaXRfa3dxZTE7CisJc3RydWN0IGZjb2Vfa3dxZV9pbml0MiBpbml0X2t3cWUyOworCXN0cnVjdCBmY29lX2t3cWVfaW5pdDMgaW5pdF9rd3FlMzsKKwlzdHJ1Y3QgcmVncGFpciBlcV9wYmxfYmFzZTsKKwlfX2xlMzIgZXFfcGJsX3NpemU7CisJX19sZTMyIHJlc2VydmVkMjsKKwlfX2xlMTYgZXFfcHJvZDsKKwlfX2xlMTYgc2JfbnVtOworCXU4IHNiX2lkOworCXU4IHJlc2VydmVkMDsKKwlfX2xlMTYgcmVzZXJ2ZWQxOworfTsKKworLyoKKyAqIEZDb0Ugc3RhdGlzdGljcyBwYXJhbXMgYnVmZmVyIHBhc3NlZCBieSBkcml2ZXIgdG8gRlcgaW4gRkNvRSBzdGF0aXN0aWNzCisgKiByYW1yb2QgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9zdGF0X3JhbXJvZF9wYXJhbXMgeworCXN0cnVjdCBmY29lX2t3cWVfc3RhdCBzdGF0X2t3cWU7Cit9OworCisvKgorICogQ1EgREIgQ1EgcHJvZHVjZXIgYW5kIHBlbmRpbmcgY29tcGxldGlvbiBjb3VudGVyCisgKi8KK3N0cnVjdCBpc2NzaV9jcV9kYl9wcm9kX3BuZF9jbXBsdG5fY250IHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgY250cjsKKwl1MTYgcHJvZDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBwcm9kOworCXUxNiBjbnRyOworI2VuZGlmCit9OworCisvKgorICogQ1EgREIgcGVuZGluZyBjb21wbGV0aW9uIElUVCBhcnJheQorICovCitzdHJ1Y3QgaXNjc2lfY3FfZGJfcHJvZF9wbmRfY21wbHRuX2NudF9hcnIgeworCXN0cnVjdCBpc2NzaV9jcV9kYl9wcm9kX3BuZF9jbXBsdG5fY250IHByb2RfcGVuZF9jb21wWzhdOworfTsKKworLyoKKyAqIENzdG9ybSBDUSBzZXF1ZW5jZSB0byBub3RpZnkgYXJyYXksIHVwZGF0ZWQgYnkgZHJpdmVyCisgKi8KK3N0cnVjdCBpc2NzaV9jcV9kYl9zcW5fMl9ub3RpZnlfYXJyIHsKKwl1MTYgc3FuWzhdOworfTsKKworLyoKKyAqIENzdG9ybSBpU0NTSSBTdG9ybSBDb250ZXh0CisgKi8KK3N0cnVjdCBjc3Rvcm1faXNjc2lfc3RfY29udGV4dCB7CisJc3RydWN0IGlzY3NpX2NxX2RiX3Byb2RfcG5kX2NtcGx0bl9jbnRfYXJyIGNxX2NfcHJvZF9wZW5kX2NvbXBfY3RyX2FycjsKKwlzdHJ1Y3QgaXNjc2lfY3FfZGJfc3FuXzJfbm90aWZ5X2FyciBjcV9jX3Byb2Rfc3FuX2FycjsKKwlzdHJ1Y3QgaXNjc2lfY3FfZGJfc3FuXzJfbm90aWZ5X2FyciBjcV9jX3Nxbl8yX25vdGlmeV9hcnI7CisJc3RydWN0IHJlZ3BhaXIgaHFfcGJsX2Jhc2U7CisJc3RydWN0IHJlZ3BhaXIgaHFfY3Vycl9wYmU7CisJc3RydWN0IHJlZ3BhaXIgdGFza19wYmxfYmFzZTsKKwlzdHJ1Y3QgcmVncGFpciBjcV9kYl9iYXNlOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBocV9iZF9pdHQ7CisJdTE2IGlzY3NpX2Nvbm5faWQ7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgaXNjc2lfY29ubl9pZDsKKwl1MTYgaHFfYmRfaXR0OworI2VuZGlmCisJdTMyIGhxX2JkX2RhdGFfc2VnbWVudF9sZW47CisJdTMyIGhxX2JkX2J1ZmZlcl9vZmZzZXQ7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTggcnNydjsKKwl1OCBjcV9wcm9jX2VuX2JpdF9tYXA7CisJdTggY3FfcGVuZF9jb21wX2l0dF92YWxpZF9iaXRfbWFwOworCXU4IGhxX2JkX29wY29kZTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXU4IGhxX2JkX29wY29kZTsKKwl1OCBjcV9wZW5kX2NvbXBfaXR0X3ZhbGlkX2JpdF9tYXA7CisJdTggY3FfcHJvY19lbl9iaXRfbWFwOworCXU4IHJzcnY7CisjZW5kaWYKKwl1MzIgaHFfdGNwX3NlcTsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgZmxhZ3M7CisjZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0RBVEFfRElHRVNUX0VOICgweDE8PDApCisjZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0RBVEFfRElHRVNUX0VOX1NISUZUIDAKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSERSX0RJR0VTVF9FTiAoMHgxPDwxKQorI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IRFJfRElHRVNUX0VOX1NISUZUIDEKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSFFfQkRfQ1RYVF9WQUxJRCAoMHgxPDwyKQorI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IUV9CRF9DVFhUX1ZBTElEX1NISUZUIDIKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSFFfQkRfTENMX0NNUExOX0ZMRyAoMHgxPDwzKQorI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IUV9CRF9MQ0xfQ01QTE5fRkxHX1NISUZUIDMKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSFFfQkRfV1JJVEVfVEFTSyAoMHgxPDw0KQorI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IUV9CRF9XUklURV9UQVNLX1NISUZUIDQKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQ1RSTF9GTEFHU19SU1JWICgweDdGRjw8NSkKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQ1RSTF9GTEFHU19SU1JWX1NISUZUIDUKKwl1MTYgaHFfY29uczsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBocV9jb25zOworCXUxNiBmbGFnczsKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfREFUQV9ESUdFU1RfRU4gKDB4MTw8MCkKKyNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfREFUQV9ESUdFU1RfRU5fU0hJRlQgMAorI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IRFJfRElHRVNUX0VOICgweDE8PDEpCisjZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0hEUl9ESUdFU1RfRU5fU0hJRlQgMQorI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IUV9CRF9DVFhUX1ZBTElEICgweDE8PDIpCisjZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0hRX0JEX0NUWFRfVkFMSURfU0hJRlQgMgorI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IUV9CRF9MQ0xfQ01QTE5fRkxHICgweDE8PDMpCisjZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0hRX0JEX0xDTF9DTVBMTl9GTEdfU0hJRlQgMworI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IUV9CRF9XUklURV9UQVNLICgweDE8PDQpCisjZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0hRX0JEX1dSSVRFX1RBU0tfU0hJRlQgNAorI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9DVFJMX0ZMQUdTX1JTUlYgKDB4N0ZGPDw1KQorI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9DVFJMX0ZMQUdTX1JTUlZfU0hJRlQgNQorI2VuZGlmCisJc3RydWN0IHJlZ3BhaXIgcnNydjE7Cit9OworCisKKy8qCisgKiBTQ1NJIHJlYWQvd3JpdGUgU1EgV1FFCisgKi8KK3N0cnVjdCBpc2NzaV9jbWRfcGR1X2hkcl9saXR0bGVfZW5kaWFuIHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCBvcGNvZGU7CisJdTggb3BfYXR0cjsKKyNkZWZpbmUgSVNDU0lfQ01EX1BEVV9IRFJfTElUVExFX0VORElBTl9BVFRSSUJVVEVTICgweDc8PDApCisjZGVmaW5lIElTQ1NJX0NNRF9QRFVfSERSX0xJVFRMRV9FTkRJQU5fQVRUUklCVVRFU19TSElGVCAwCisjZGVmaW5lIElTQ1NJX0NNRF9QRFVfSERSX0xJVFRMRV9FTkRJQU5fUlNSVjEgKDB4Mzw8MykKKyNkZWZpbmUgSVNDU0lfQ01EX1BEVV9IRFJfTElUVExFX0VORElBTl9SU1JWMV9TSElGVCAzCisjZGVmaW5lIElTQ1NJX0NNRF9QRFVfSERSX0xJVFRMRV9FTkRJQU5fV1JJVEVfRkxBRyAoMHgxPDw1KQorI2RlZmluZSBJU0NTSV9DTURfUERVX0hEUl9MSVRUTEVfRU5ESUFOX1dSSVRFX0ZMQUdfU0hJRlQgNQorI2RlZmluZSBJU0NTSV9DTURfUERVX0hEUl9MSVRUTEVfRU5ESUFOX1JFQURfRkxBRyAoMHgxPDw2KQorI2RlZmluZSBJU0NTSV9DTURfUERVX0hEUl9MSVRUTEVfRU5ESUFOX1JFQURfRkxBR19TSElGVCA2CisjZGVmaW5lIElTQ1NJX0NNRF9QRFVfSERSX0xJVFRMRV9FTkRJQU5fRklOQUxfRkxBRyAoMHgxPDw3KQorI2RlZmluZSBJU0NTSV9DTURfUERVX0hEUl9MSVRUTEVfRU5ESUFOX0ZJTkFMX0ZMQUdfU0hJRlQgNworCXUxNiByc3J2MDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiByc3J2MDsKKwl1OCBvcF9hdHRyOworI2RlZmluZSBJU0NTSV9DTURfUERVX0hEUl9MSVRUTEVfRU5ESUFOX0FUVFJJQlVURVMgKDB4Nzw8MCkKKyNkZWZpbmUgSVNDU0lfQ01EX1BEVV9IRFJfTElUVExFX0VORElBTl9BVFRSSUJVVEVTX1NISUZUIDAKKyNkZWZpbmUgSVNDU0lfQ01EX1BEVV9IRFJfTElUVExFX0VORElBTl9SU1JWMSAoMHgzPDwzKQorI2RlZmluZSBJU0NTSV9DTURfUERVX0hEUl9MSVRUTEVfRU5ESUFOX1JTUlYxX1NISUZUIDMKKyNkZWZpbmUgSVNDU0lfQ01EX1BEVV9IRFJfTElUVExFX0VORElBTl9XUklURV9GTEFHICgweDE8PDUpCisjZGVmaW5lIElTQ1NJX0NNRF9QRFVfSERSX0xJVFRMRV9FTkRJQU5fV1JJVEVfRkxBR19TSElGVCA1CisjZGVmaW5lIElTQ1NJX0NNRF9QRFVfSERSX0xJVFRMRV9FTkRJQU5fUkVBRF9GTEFHICgweDE8PDYpCisjZGVmaW5lIElTQ1NJX0NNRF9QRFVfSERSX0xJVFRMRV9FTkRJQU5fUkVBRF9GTEFHX1NISUZUIDYKKyNkZWZpbmUgSVNDU0lfQ01EX1BEVV9IRFJfTElUVExFX0VORElBTl9GSU5BTF9GTEFHICgweDE8PDcpCisjZGVmaW5lIElTQ1NJX0NNRF9QRFVfSERSX0xJVFRMRV9FTkRJQU5fRklOQUxfRkxBR19TSElGVCA3CisJdTggb3Bjb2RlOworI2VuZGlmCisJdTMyIGRhdGFfZmllbGRzOworI2RlZmluZSBJU0NTSV9DTURfUERVX0hEUl9MSVRUTEVfRU5ESUFOX0RBVEFfU0VHTUVOVF9MRU5HVEggKDB4RkZGRkZGPDwwKQorI2RlZmluZSBJU0NTSV9DTURfUERVX0hEUl9MSVRUTEVfRU5ESUFOX0RBVEFfU0VHTUVOVF9MRU5HVEhfU0hJRlQgMAorI2RlZmluZSBJU0NTSV9DTURfUERVX0hEUl9MSVRUTEVfRU5ESUFOX1RPVEFMX0FIU19MRU5HVEggKDB4RkY8PDI0KQorI2RlZmluZSBJU0NTSV9DTURfUERVX0hEUl9MSVRUTEVfRU5ESUFOX1RPVEFMX0FIU19MRU5HVEhfU0hJRlQgMjQKKwlzdHJ1Y3QgcmVncGFpciBsdW47CisJdTMyIGl0dDsKKwl1MzIgZXhwZWN0ZWRfZGF0YV90cmFuc2Zlcl9sZW5ndGg7CisJdTMyIGNtZF9zbjsKKwl1MzIgZXhwX3N0YXRfc247CisJdTMyIHNjc2lfY29tbWFuZF9ibG9ja1s0XTsKK307CisKKworLyoKKyAqIEJ1ZmZlciBwZXIgY29ubmVjdGlvbiwgdXNlZCBpbiBUc3Rvcm0KKyAqLworc3RydWN0IGlzY3NpX2Nvbm5fYnVmIHsKKwlzdHJ1Y3QgcmVncGFpciByZXNlcnZlZFs4XTsKK307CisKKworLyoKKyAqIGlTQ1NJIGNvbnRleHQgcmVnaW9uLCB1c2VkIG9ubHkgaW4gaVNDU0kKKyAqLworc3RydWN0IHVzdG9ybV9pc2NzaV9ycV9kYiB7CisJc3RydWN0IHJlZ3BhaXIgcGJsX2Jhc2U7CisJc3RydWN0IHJlZ3BhaXIgY3Vycl9wYmU7Cit9OworCisvKgorICogaVNDU0kgY29udGV4dCByZWdpb24sIHVzZWQgb25seSBpbiBpU0NTSQorICovCitzdHJ1Y3QgdXN0b3JtX2lzY3NpX3IydHFfZGIgeworCXN0cnVjdCByZWdwYWlyIHBibF9iYXNlOworCXN0cnVjdCByZWdwYWlyIGN1cnJfcGJlOworfTsKKworLyoKKyAqIGlTQ1NJIGNvbnRleHQgcmVnaW9uLCB1c2VkIG9ubHkgaW4gaVNDU0kKKyAqLworc3RydWN0IHVzdG9ybV9pc2NzaV9jcV9kYiB7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IGNxX3NuOworCXUxNiBwcm9kOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IHByb2Q7CisJdTE2IGNxX3NuOworI2VuZGlmCisJc3RydWN0IHJlZ3BhaXIgY3Vycl9wYmU7Cit9OworCisvKgorICogaVNDU0kgY29udGV4dCByZWdpb24sIHVzZWQgb25seSBpbiBpU0NTSQorICovCitzdHJ1Y3QgcmluZ3NfZGIgeworCXN0cnVjdCB1c3Rvcm1faXNjc2lfcnFfZGIgcnE7CisJc3RydWN0IHVzdG9ybV9pc2NzaV9yMnRxX2RiIHIydHE7CisJc3RydWN0IHVzdG9ybV9pc2NzaV9jcV9kYiBjcVs4XTsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgcnFfcHJvZDsKKwl1MTYgcjJ0cV9wcm9kOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IHIydHFfcHJvZDsKKwl1MTYgcnFfcHJvZDsKKyNlbmRpZgorCXN0cnVjdCByZWdwYWlyIGNxX3BibF9iYXNlOworfTsKKworLyoKKyAqIGlTQ1NJIGNvbnRleHQgcmVnaW9uLCB1c2VkIG9ubHkgaW4gaVNDU0kKKyAqLworc3RydWN0IHVzdG9ybV9pc2NzaV9wbGFjZW1lbnRfZGIgeworCXUzMiBzZ2xfYmFzZV9sbzsKKwl1MzIgc2dsX2Jhc2VfaGk7CisJdTMyIGxvY2FsX3NnZV8wX2FkZHJlc3NfaGk7CisJdTMyIGxvY2FsX3NnZV8wX2FkZHJlc3NfbG87CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IGN1cnJfc2dlX29mZnNldDsKKwl1MTYgbG9jYWxfc2dlXzBfc2l6ZTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBsb2NhbF9zZ2VfMF9zaXplOworCXUxNiBjdXJyX3NnZV9vZmZzZXQ7CisjZW5kaWYKKwl1MzIgbG9jYWxfc2dlXzFfYWRkcmVzc19oaTsKKwl1MzIgbG9jYWxfc2dlXzFfYWRkcmVzc19sbzsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCBleHBfcGFkZGluZ18yYjsKKwl1OCBuYWxfbGVuXzNiOworCXUxNiBsb2NhbF9zZ2VfMV9zaXplOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IGxvY2FsX3NnZV8xX3NpemU7CisJdTggbmFsX2xlbl8zYjsKKwl1OCBleHBfcGFkZGluZ18yYjsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IHNnbF9zaXplOworCXU4IGxvY2FsX3NnZV9pbmRleF8yYjsKKwl1MTYgcmVzZXJ2ZWQ3OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IHJlc2VydmVkNzsKKwl1OCBsb2NhbF9zZ2VfaW5kZXhfMmI7CisJdTggc2dsX3NpemU7CisjZW5kaWYKKwl1MzIgcmVtX3BkdTsKKwl1MzIgcGxhY2VfZGJfYml0ZmllbGRfMTsKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1BMQUNFTUVOVF9EQl9SRU1fUERVX1BBWUxPQUQgKDB4RkZGRkZGPDwwKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfUExBQ0VNRU5UX0RCX1JFTV9QRFVfUEFZTE9BRF9TSElGVCAwCisjZGVmaW5lIFVTVE9STV9JU0NTSV9QTEFDRU1FTlRfREJfQ1FfSUQgKDB4RkY8PDI0KQorI2RlZmluZSBVU1RPUk1fSVNDU0lfUExBQ0VNRU5UX0RCX0NRX0lEX1NISUZUIDI0CisJdTMyIHBsYWNlX2RiX2JpdGZpZWxkXzI7CisjZGVmaW5lIFVTVE9STV9JU0NTSV9QTEFDRU1FTlRfREJfQllURVNfMl9UUlVOQ0FURSAoMHhGRkZGRkY8PDApCisjZGVmaW5lIFVTVE9STV9JU0NTSV9QTEFDRU1FTlRfREJfQllURVNfMl9UUlVOQ0FURV9TSElGVCAwCisjZGVmaW5lIFVTVE9STV9JU0NTSV9QTEFDRU1FTlRfREJfSE9TVF9TR0VfSU5ERVggKDB4RkY8PDI0KQorI2RlZmluZSBVU1RPUk1fSVNDU0lfUExBQ0VNRU5UX0RCX0hPU1RfU0dFX0lOREVYX1NISUZUIDI0CisJdTMyIG5hbDsKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1BMQUNFTUVOVF9EQl9SRU1fU0dFX1NJWkUgKDB4RkZGRkZGPDwwKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfUExBQ0VNRU5UX0RCX1JFTV9TR0VfU0laRV9TSElGVCAwCisjZGVmaW5lIFVTVE9STV9JU0NTSV9QTEFDRU1FTlRfREJfRVhQX0RJR0VTVF8zQiAoMHhGRjw8MjQpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9QTEFDRU1FTlRfREJfRVhQX0RJR0VTVF8zQl9TSElGVCAyNAorfTsKKworLyoKKyAqIFVzdG9ybSBpU0NTSSBTdG9ybSBDb250ZXh0CisgKi8KK3N0cnVjdCB1c3Rvcm1faXNjc2lfc3RfY29udGV4dCB7CisJdTMyIGV4cF9zdGF0X3NuOworCXUzMiBleHBfZGF0YV9zbjsKKwlzdHJ1Y3QgcmluZ3NfZGIgcmluZzsKKwlzdHJ1Y3QgcmVncGFpciB0YXNrX3BibF9iYXNlOworCXN0cnVjdCByZWdwYWlyIHRjZV9waHlfYWRkcjsKKwlzdHJ1Y3QgdXN0b3JtX2lzY3NpX3BsYWNlbWVudF9kYiBwbGFjZV9kYjsKKwl1MzIgcmVzZXJ2ZWQ4OworCXUzMiByZW1fcmN2X2xlbjsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgaGRyX2l0dDsKKwl1MTYgaXNjc2lfY29ubl9pZDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBpc2NzaV9jb25uX2lkOworCXUxNiBoZHJfaXR0OworI2VuZGlmCisJdTMyIG5hbF9ieXRlczsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCBoZHJfc2Vjb25kX2J5dGVfdW5pb247CisJdTggYml0ZmllbGRfMDsKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQk1JRERMRU9GUERVICgweDE8PDApCisjZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JNSURETEVPRlBEVV9TSElGVCAwCisjZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JGRU5DRUNRRSAoMHgxPDwxKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CRkVOQ0VDUUVfU0hJRlQgMQorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CUkVTRVRDUkMgKDB4MTw8MikKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQlJFU0VUQ1JDX1NISUZUIDIKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfUkVTRVJWRUQxICgweDFGPDwzKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9SRVNFUlZFRDFfU0hJRlQgMworCXU4IHRhc2tfcGR1X2NhY2hlX2luZGV4OworCXU4IHRhc2tfcGJlX2NhY2hlX2luZGV4OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTggdGFza19wYmVfY2FjaGVfaW5kZXg7CisJdTggdGFza19wZHVfY2FjaGVfaW5kZXg7CisJdTggYml0ZmllbGRfMDsKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQk1JRERMRU9GUERVICgweDE8PDApCisjZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JNSURETEVPRlBEVV9TSElGVCAwCisjZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JGRU5DRUNRRSAoMHgxPDwxKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CRkVOQ0VDUUVfU0hJRlQgMQorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CUkVTRVRDUkMgKDB4MTw8MikKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQlJFU0VUQ1JDX1NISUZUIDIKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfUkVTRVJWRUQxICgweDFGPDwzKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9SRVNFUlZFRDFfU0hJRlQgMworCXU4IGhkcl9zZWNvbmRfYnl0ZV91bmlvbjsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiByZXNlcnZlZDM7CisJdTggcmVzZXJ2ZWQyOworCXU4IGFjRGVjcmVtZW50OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTggYWNEZWNyZW1lbnQ7CisJdTggcmVzZXJ2ZWQyOworCXUxNiByZXNlcnZlZDM7CisjZW5kaWYKKwl1MzIgdGFza19zdGF0OworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IGhkcl9vcGNvZGU7CisJdTggbnVtX2NxczsKKwl1MTYgcmVzZXJ2ZWQ1OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IHJlc2VydmVkNTsKKwl1OCBudW1fY3FzOworCXU4IGhkcl9vcGNvZGU7CisjZW5kaWYKKwl1MzIgbmVnb3RpYXRlZF9yeDsKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfTUFYX1JFQ1ZfUERVX0xFTkdUSCAoMHhGRkZGRkY8PDApCisjZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX01BWF9SRUNWX1BEVV9MRU5HVEhfU0hJRlQgMAorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9NQVhfT1VUU1RBTkRJTkdfUjJUUyAoMHhGRjw8MjQpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX01BWF9PVVRTVEFORElOR19SMlRTX1NISUZUIDI0CisJdTMyIG5lZ290aWF0ZWRfcnhfYW5kX2ZsYWdzOworI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9NQVhfQlVSU1RfTEVOR1RIICgweEZGRkZGRjw8MCkKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfTUFYX0JVUlNUX0xFTkdUSF9TSElGVCAwCisjZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JfQ1FFX1BPU1RFRF9PUl9IRUFERVJfQ0FDSEVEICgweDE8PDI0KQorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CX0NRRV9QT1NURURfT1JfSEVBREVSX0NBQ0hFRF9TSElGVCAyNAorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CX0hEUl9ESUdFU1RfRU4gKDB4MTw8MjUpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JfSERSX0RJR0VTVF9FTl9TSElGVCAyNQorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CX0RBVEFfRElHRVNUX0VOICgweDE8PDI2KQorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CX0RBVEFfRElHRVNUX0VOX1NISUZUIDI2CisjZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JfUFJPVE9DT0xfRVJST1IgKDB4MTw8MjcpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9TVF9DT05URVhUX0JfUFJPVE9DT0xfRVJST1JfU0hJRlQgMjcKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQl9UQVNLX1ZBTElEICgweDE8PDI4KQorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9CX1RBU0tfVkFMSURfU0hJRlQgMjgKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfVEFTS19UWVBFICgweDM8PDI5KQorI2RlZmluZSBVU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9UQVNLX1RZUEVfU0hJRlQgMjkKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQl9BTExfREFUQV9BQ0tFRCAoMHgxPDwzMSkKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQl9BTExfREFUQV9BQ0tFRF9TSElGVCAzMQorfTsKKworLyoKKyAqIFRDUCBjb250ZXh0IHJlZ2lvbiwgc2hhcmVkIGluIFRPRSwgUkRNQSBhbmQgSVNDU0kKKyAqLworc3RydWN0IHRzdG9ybV90Y3Bfc3RfY29udGV4dF9zZWN0aW9uIHsKKwl1MzIgZmxhZ3MxOworI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9SVFRfU1JUVCAoMHhGRkZGRkY8PDApCisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1JUVF9TUlRUX1NISUZUIDAKKyNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fUEFXU19JTlZBTElEICgweDE8PDI0KQorI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9QQVdTX0lOVkFMSURfU0hJRlQgMjQKKyNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fVElNRVNUQU1QX0VYSVNUUyAoMHgxPDwyNSkKKyNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fVElNRVNUQU1QX0VYSVNUU19TSElGVCAyNQorI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9SRVNFUlZFRDAgKDB4MTw8MjYpCisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1JFU0VSVkVEMF9TSElGVCAyNgorI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9TVE9QX1JYX1BBWUxPQUQgKDB4MTw8MjcpCisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1NUT1BfUlhfUEFZTE9BRF9TSElGVCAyNworI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9LQV9FTkFCTEVEICgweDE8PDI4KQorI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9LQV9FTkFCTEVEX1NISUZUIDI4CisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0ZJUlNUX1JUT19FU1RJTUFURSAoMHgxPDwyOSkKKyNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fRklSU1RfUlRPX0VTVElNQVRFX1NISUZUIDI5CisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX01BWF9TRUdfUkVUUkFOU01JVF9FTiAoMHgxPDwzMCkKKyNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fTUFYX1NFR19SRVRSQU5TTUlUX0VOX1NISUZUIDMwCisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0xBU1RfSVNMRV9IQVNfRklOICgweDE8PDMxKQorI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9MQVNUX0lTTEVfSEFTX0ZJTl9TSElGVCAzMQorCXUzMiBmbGFnczI7CisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1JUVF9WQVJJQVRJT04gKDB4RkZGRkZGPDwwKQorI2RlZmluZSBUU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9SVFRfVkFSSUFUSU9OX1NISUZUIDAKKyNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fREFfRU4gKDB4MTw8MjQpCisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0RBX0VOX1NISUZUIDI0CisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0RBX0NPVU5URVJfRU4gKDB4MTw8MjUpCisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0RBX0NPVU5URVJfRU5fU0hJRlQgMjUKKyNkZWZpbmUgX19UU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9LQV9QUk9CRV9TRU5UICgweDE8PDI2KQorI2RlZmluZSBfX1RTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0tBX1BST0JFX1NFTlRfU0hJRlQgMjYKKyNkZWZpbmUgX19UU1RPUk1fVENQX1NUX0NPTlRFWFRfU0VDVElPTl9QRVJTSVNUX1BST0JFX1NFTlQgKDB4MTw8MjcpCisjZGVmaW5lIF9fVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fUEVSU0lTVF9QUk9CRV9TRU5UX1NISUZUIDI3CisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1VQREFURV9MMl9TVEFUU1RJQ1MgKDB4MTw8MjgpCisjZGVmaW5lIFRTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX1VQREFURV9MMl9TVEFUU1RJQ1NfU0hJRlQgMjgKKyNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0w0X1NUQVRTVElDUyAoMHgxPDwyOSkKKyNkZWZpbmUgVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0w0X1NUQVRTVElDU19TSElGVCAyOQorI2RlZmluZSBfX1RTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0lOX1dJTkRPV19SU1RfQVRUQUNLICgweDE8PDMwKQorI2RlZmluZSBfX1RTVE9STV9UQ1BfU1RfQ09OVEVYVF9TRUNUSU9OX0lOX1dJTkRPV19SU1RfQVRUQUNLX1NISUZUIDMwCisjZGVmaW5lIF9fVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fSU5fV0lORE9XX1NZTl9BVFRBQ0sgKDB4MTw8MzEpCisjZGVmaW5lIF9fVFNUT1JNX1RDUF9TVF9DT05URVhUX1NFQ1RJT05fSU5fV0lORE9XX1NZTl9BVFRBQ0tfU0hJRlQgMzEKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgbXNzOworCXU4IHRjcF9zbV9zdGF0ZTsKKwl1OCBydG9fZXhwOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTggcnRvX2V4cDsKKwl1OCB0Y3Bfc21fc3RhdGU7CisJdTE2IG1zczsKKyNlbmRpZgorCXUzMiByY3Zfbnh0OworCXUzMiB0aW1lc3RhbXBfcmVjZW50OworCXUzMiB0aW1lc3RhbXBfcmVjZW50X3RpbWU7CisJdTMyIGN3bmQ7CisJdTMyIHNzX3RocmVzaDsKKwl1MzIgY3duZF9hY2N1bTsKKwl1MzIgcHJldl9zZWdfc2VxOworCXUzMiBleHBlY3RlZF9yZWxfc2VxOworCXUzMiByZWNvdmVyOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IHJldHJhbnNtaXRfY291bnQ7CisJdTgga2FfbWF4X3Byb2JlX2NvdW50OworCXU4IHBlcnNpc3RfcHJvYmVfY291bnQ7CisJdTgga2FfcHJvYmVfY291bnQ7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1OCBrYV9wcm9iZV9jb3VudDsKKwl1OCBwZXJzaXN0X3Byb2JlX2NvdW50OworCXU4IGthX21heF9wcm9iZV9jb3VudDsKKwl1OCByZXRyYW5zbWl0X2NvdW50OworI2VuZGlmCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTggc3RhdGlzdGljc19jb3VudGVyX2lkOworCXU4IG9vb19zdXBwb3J0X21vZGU7CisJdTggc25kX3duZF9zY2FsZTsKKwl1OCBkdXBfYWNrX2NvdW50OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTggZHVwX2Fja19jb3VudDsKKwl1OCBzbmRfd25kX3NjYWxlOworCXU4IG9vb19zdXBwb3J0X21vZGU7CisJdTggc3RhdGlzdGljc19jb3VudGVyX2lkOworI2VuZGlmCisJdTMyIHJldHJhbnNtaXRfc3RhcnRfdGltZTsKKwl1MzIga2FfdGltZW91dDsKKwl1MzIga2FfaW50ZXJ2YWw7CisJdTMyIGlzbGVfc3RhcnRfc2VxOworCXUzMiBpc2xlX2VuZF9zZXE7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IHNlY29uZF9pc2xlX2FkZHJlc3M7CisJdTE2IHJlY2VudF9zZWdfd25kOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IHJlY2VudF9zZWdfd25kOworCXUxNiBzZWNvbmRfaXNsZV9hZGRyZXNzOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTggbWF4X2lzbGVzX2V2ZXJfaGFwcGVuZWQ7CisJdTggaXNsZXNfbnVtYmVyOworCXUxNiBsYXN0X2lzbGVfYWRkcmVzczsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBsYXN0X2lzbGVfYWRkcmVzczsKKwl1OCBpc2xlc19udW1iZXI7CisJdTggbWF4X2lzbGVzX2V2ZXJfaGFwcGVuZWQ7CisjZW5kaWYKKwl1MzIgbWF4X3J0X3RpbWU7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IGxzYl9tYWNfYWRkcmVzczsKKwl1MTYgdmxhbl9pZDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiB2bGFuX2lkOworCXUxNiBsc2JfbWFjX2FkZHJlc3M7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgbXNiX21hY19hZGRyZXNzOworCXUxNiBtaWRfbWFjX2FkZHJlc3M7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgbWlkX21hY19hZGRyZXNzOworCXUxNiBtc2JfbWFjX2FkZHJlc3M7CisjZW5kaWYKKwl1MzIgcmlnaHRtb3N0X3JlY2VpdmVkX3NlcTsKK307CisKKy8qCisgKiBUZXJtaW5hdGlvbiB2YXJpYWJsZXMKKyAqLworc3RydWN0IGlzY3NpX3Rlcm1fdmFycyB7CisJdTggQml0TWFwOworI2RlZmluZSBJU0NTSV9URVJNX1ZBUlNfVENQX1NUQVRFICgweEY8PDApCisjZGVmaW5lIElTQ1NJX1RFUk1fVkFSU19UQ1BfU1RBVEVfU0hJRlQgMAorI2RlZmluZSBJU0NTSV9URVJNX1ZBUlNfRklOX1JFQ0VJVkVEX1NCSVQgKDB4MTw8NCkKKyNkZWZpbmUgSVNDU0lfVEVSTV9WQVJTX0ZJTl9SRUNFSVZFRF9TQklUX1NISUZUIDQKKyNkZWZpbmUgSVNDU0lfVEVSTV9WQVJTX0FDS19PTl9GSU5fUkVDRUlWRURfU0JJVCAoMHgxPDw1KQorI2RlZmluZSBJU0NTSV9URVJNX1ZBUlNfQUNLX09OX0ZJTl9SRUNFSVZFRF9TQklUX1NISUZUIDUKKyNkZWZpbmUgSVNDU0lfVEVSTV9WQVJTX1RFUk1fT05fQ0hJUCAoMHgxPDw2KQorI2RlZmluZSBJU0NTSV9URVJNX1ZBUlNfVEVSTV9PTl9DSElQX1NISUZUIDYKKyNkZWZpbmUgSVNDU0lfVEVSTV9WQVJTX1JTUlYgKDB4MTw8NykKKyNkZWZpbmUgSVNDU0lfVEVSTV9WQVJTX1JTUlZfU0hJRlQgNworfTsKKworLyoKKyAqIGlTQ1NJIGNvbnRleHQgcmVnaW9uLCB1c2VkIG9ubHkgaW4gaVNDU0kKKyAqLworc3RydWN0IHRzdG9ybV9pc2NzaV9zdF9jb250ZXh0X3NlY3Rpb24geworCXUzMiBuYWxQYXlsb2FkOworCXUzMiBiMm5oOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBycV9jb25zOworCXU4IGZsYWdzOworI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfSERSX0RJR0VTVF9FTiAoMHgxPDwwKQorI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfSERSX0RJR0VTVF9FTl9TSElGVCAwCisjZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9EQVRBX0RJR0VTVF9FTiAoMHgxPDwxKQorI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfREFUQV9ESUdFU1RfRU5fU0hJRlQgMQorI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfUEFSVElBTF9IRUFERVIgKDB4MTw8MikKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9CX1BBUlRJQUxfSEVBREVSX1NISUZUIDIKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9CX0ZVTExfRkVBVFVSRSAoMHgxPDwzKQorI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfRlVMTF9GRUFUVVJFX1NISUZUIDMKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9CX0RST1BfQUxMX1BEVVMgKDB4MTw8NCkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9CX0RST1BfQUxMX1BEVVNfU0hJRlQgNAorI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX05BTExFTiAoMHgzPDw1KQorI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX05BTExFTl9TSElGVCA1CisjZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fUlNSVjAgKDB4MTw8NykKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9SU1JWMF9TSElGVCA3CisJdTggaGRyX2J5dGVzXzJfZmV0Y2g7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1OCBoZHJfYnl0ZXNfMl9mZXRjaDsKKwl1OCBmbGFnczsKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9CX0hEUl9ESUdFU1RfRU4gKDB4MTw8MCkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9CX0hEUl9ESUdFU1RfRU5fU0hJRlQgMAorI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX0JfREFUQV9ESUdFU1RfRU4gKDB4MTw8MSkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9CX0RBVEFfRElHRVNUX0VOX1NISUZUIDEKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9CX1BBUlRJQUxfSEVBREVSICgweDE8PDIpCisjZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9QQVJUSUFMX0hFQURFUl9TSElGVCAyCisjZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9GVUxMX0ZFQVRVUkUgKDB4MTw8MykKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9CX0ZVTExfRkVBVFVSRV9TSElGVCAzCisjZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9EUk9QX0FMTF9QRFVTICgweDE8PDQpCisjZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fQl9EUk9QX0FMTF9QRFVTX1NISUZUIDQKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9OQUxMRU4gKDB4Mzw8NSkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfU0VDVElPTl9OQUxMRU5fU0hJRlQgNQorI2RlZmluZSBUU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9TRUNUSU9OX1JTUlYwICgweDE8PDcpCisjZGVmaW5lIFRTVE9STV9JU0NTSV9TVF9DT05URVhUX1NFQ1RJT05fUlNSVjBfU0hJRlQgNworCXUxNiBycV9jb25zOworI2VuZGlmCisJc3RydWN0IHJlZ3BhaXIgcnFfZGJfcGh5X2FkZHI7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJc3RydWN0IGlzY3NpX3Rlcm1fdmFycyB0ZXJtX3ZhcnM7CisJdTggcnNydjE7CisJdTE2IGlzY3NpX2Nvbm5faWQ7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgaXNjc2lfY29ubl9pZDsKKwl1OCByc3J2MTsKKwlzdHJ1Y3QgaXNjc2lfdGVybV92YXJzIHRlcm1fdmFyczsKKyNlbmRpZgorCXUzMiBwcm9jZXNzX254dDsKK307CisKKy8qCisgKiBUaGUgaVNDU0kgbm9uLWFnZ3JlZ2F0aXZlIGNvbnRleHQgb2YgVHN0b3JtCisgKi8KK3N0cnVjdCB0c3Rvcm1faXNjc2lfc3RfY29udGV4dCB7CisJc3RydWN0IHRzdG9ybV90Y3Bfc3RfY29udGV4dF9zZWN0aW9uIHRjcDsKKwlzdHJ1Y3QgdHN0b3JtX2lzY3NpX3N0X2NvbnRleHRfc2VjdGlvbiBpc2NzaTsKIH07CiAKIC8qCkBAIC0zNTA5LDcgKzQ0NjMsMjcgQEAKIAl1MTYgd2luZG93X3NjYWxpbmdfZmFjdG9yOwogCXUxNiBwc2V1ZG9fY3N1bTsKICNlbmRpZgotCXUzMiByZXNlcnZlZDI7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IHJlc2VydmVkMjsKKwl1OCBzdGF0aXN0aWNzX2NvdW50ZXJfaWQ7CisJdTggc3RhdGlzdGljc19wYXJhbXM7CisjZGVmaW5lIFhTVE9STV9UQ1BfQ09OVEVYVF9TRUNUSU9OX1VQREFURV9MMl9TVEFUU1RJQ1MgKDB4MTw8MCkKKyNkZWZpbmUgWFNUT1JNX1RDUF9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0wyX1NUQVRTVElDU19TSElGVCAwCisjZGVmaW5lIFhTVE9STV9UQ1BfQ09OVEVYVF9TRUNUSU9OX1VQREFURV9MNF9TVEFUU1RJQ1MgKDB4MTw8MSkKKyNkZWZpbmUgWFNUT1JNX1RDUF9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0w0X1NUQVRTVElDU19TSElGVCAxCisjZGVmaW5lIFhTVE9STV9UQ1BfQ09OVEVYVF9TRUNUSU9OX1JFU0VSVkVEICgweDNGPDwyKQorI2RlZmluZSBYU1RPUk1fVENQX0NPTlRFWFRfU0VDVElPTl9SRVNFUlZFRF9TSElGVCAyCisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1OCBzdGF0aXN0aWNzX3BhcmFtczsKKyNkZWZpbmUgWFNUT1JNX1RDUF9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0wyX1NUQVRTVElDUyAoMHgxPDwwKQorI2RlZmluZSBYU1RPUk1fVENQX0NPTlRFWFRfU0VDVElPTl9VUERBVEVfTDJfU1RBVFNUSUNTX1NISUZUIDAKKyNkZWZpbmUgWFNUT1JNX1RDUF9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0w0X1NUQVRTVElDUyAoMHgxPDwxKQorI2RlZmluZSBYU1RPUk1fVENQX0NPTlRFWFRfU0VDVElPTl9VUERBVEVfTDRfU1RBVFNUSUNTX1NISUZUIDEKKyNkZWZpbmUgWFNUT1JNX1RDUF9DT05URVhUX1NFQ1RJT05fUkVTRVJWRUQgKDB4M0Y8PDIpCisjZGVmaW5lIFhTVE9STV9UQ1BfQ09OVEVYVF9TRUNUSU9OX1JFU0VSVkVEX1NISUZUIDIKKwl1OCBzdGF0aXN0aWNzX2NvdW50ZXJfaWQ7CisJdTE2IHJlc2VydmVkMjsKKyNlbmRpZgogCXUzMiB0c190aW1lX2RpZmY7CiAJdTMyIF9fbmV4dF90aW1lcl9leHBpcjsKIH07CkBAIC0zNTIyLDI5ICs0NDk2LDMxIEBACiAJdW5pb24geHN0b3JtX2lwX2NvbnRleHRfc2VjdGlvbl90eXBlcyBpcF91bmlvbjsKIAlzdHJ1Y3QgeHN0b3JtX3RjcF9jb250ZXh0X3NlY3Rpb24gdGNwOwogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiByZXNlcnZlZDsKLQl1OCBzdGF0aXN0aWNzX3BhcmFtczsKLSNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0wyX1NUQVRTVElDUyAoMHgxPDwwKQotI2RlZmluZSBYU1RPUk1fQ09NTU9OX0NPTlRFWFRfU0VDVElPTl9VUERBVEVfTDJfU1RBVFNUSUNTX1NISUZUIDAKLSNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0w0X1NUQVRTVElDUyAoMHgxPDwxKQotI2RlZmluZSBYU1RPUk1fQ09NTU9OX0NPTlRFWFRfU0VDVElPTl9VUERBVEVfTDRfU1RBVFNUSUNTX1NISUZUIDEKLSNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fU1RBVElTVElDU19DT1VOVEVSX0lEICgweDFGPDwyKQotI2RlZmluZSBYU1RPUk1fQ09NTU9OX0NPTlRFWFRfU0VDVElPTl9TVEFUSVNUSUNTX0NPVU5URVJfSURfU0hJRlQgMgotI2RlZmluZSBYU1RPUk1fQ09NTU9OX0NPTlRFWFRfU0VDVElPTl9EQ0JfRVhJU1RTICgweDE8PDcpCi0jZGVmaW5lIFhTVE9STV9DT01NT05fQ09OVEVYVF9TRUNUSU9OX0RDQl9FWElTVFNfU0hJRlQgNworCXU4IF9fZGNiX3ZhbDsKKwl1OCBmbGFnczsKKyNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fUEhZU1FfSU5JVElBTElaRUQgKDB4MTw8MCkKKyNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fUEhZU1FfSU5JVElBTElaRURfU0hJRlQgMAorI2RlZmluZSBYU1RPUk1fQ09NTU9OX0NPTlRFWFRfU0VDVElPTl9QQkZfUE9SVCAoMHg3PDwxKQorI2RlZmluZSBYU1RPUk1fQ09NTU9OX0NPTlRFWFRfU0VDVElPTl9QQkZfUE9SVF9TSElGVCAxCisjZGVmaW5lIFhTVE9STV9DT01NT05fQ09OVEVYVF9TRUNUSU9OX1ZMQU5fTU9ERSAoMHgxPDw0KQorI2RlZmluZSBYU1RPUk1fQ09NTU9OX0NPTlRFWFRfU0VDVElPTl9WTEFOX01PREVfU0hJRlQgNAorI2RlZmluZSBYU1RPUk1fQ09NTU9OX0NPTlRFWFRfU0VDVElPTl9PUklHSU5BTF9QUklPUklUWSAoMHg3PDw1KQorI2RlZmluZSBYU1RPUk1fQ09NTU9OX0NPTlRFWFRfU0VDVElPTl9PUklHSU5BTF9QUklPUklUWV9TSElGVCA1CisJdTggcmVzZXJ2ZWQ7CiAJdTggaXBfdmVyc2lvbl8xYjsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQogCXU4IGlwX3ZlcnNpb25fMWI7Ci0JdTggc3RhdGlzdGljc19wYXJhbXM7Ci0jZGVmaW5lIFhTVE9STV9DT01NT05fQ09OVEVYVF9TRUNUSU9OX1VQREFURV9MMl9TVEFUU1RJQ1MgKDB4MTw8MCkKLSNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0wyX1NUQVRTVElDU19TSElGVCAwCi0jZGVmaW5lIFhTVE9STV9DT01NT05fQ09OVEVYVF9TRUNUSU9OX1VQREFURV9MNF9TVEFUU1RJQ1MgKDB4MTw8MSkKLSNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fVVBEQVRFX0w0X1NUQVRTVElDU19TSElGVCAxCi0jZGVmaW5lIFhTVE9STV9DT01NT05fQ09OVEVYVF9TRUNUSU9OX1NUQVRJU1RJQ1NfQ09VTlRFUl9JRCAoMHgxRjw8MikKLSNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fU1RBVElTVElDU19DT1VOVEVSX0lEX1NISUZUIDIKLSNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fRENCX0VYSVNUUyAoMHgxPDw3KQotI2RlZmluZSBYU1RPUk1fQ09NTU9OX0NPTlRFWFRfU0VDVElPTl9EQ0JfRVhJU1RTX1NISUZUIDcKLQl1MTYgcmVzZXJ2ZWQ7CisJdTggcmVzZXJ2ZWQ7CisJdTggZmxhZ3M7CisjZGVmaW5lIFhTVE9STV9DT01NT05fQ09OVEVYVF9TRUNUSU9OX1BIWVNRX0lOSVRJQUxJWkVEICgweDE8PDApCisjZGVmaW5lIFhTVE9STV9DT01NT05fQ09OVEVYVF9TRUNUSU9OX1BIWVNRX0lOSVRJQUxJWkVEX1NISUZUIDAKKyNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fUEJGX1BPUlQgKDB4Nzw8MSkKKyNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fUEJGX1BPUlRfU0hJRlQgMQorI2RlZmluZSBYU1RPUk1fQ09NTU9OX0NPTlRFWFRfU0VDVElPTl9WTEFOX01PREUgKDB4MTw8NCkKKyNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fVkxBTl9NT0RFX1NISUZUIDQKKyNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fT1JJR0lOQUxfUFJJT1JJVFkgKDB4Nzw8NSkKKyNkZWZpbmUgWFNUT1JNX0NPTU1PTl9DT05URVhUX1NFQ1RJT05fT1JJR0lOQUxfUFJJT1JJVFlfU0hJRlQgNQorCXU4IF9fZGNiX3ZhbDsKICNlbmRpZgogfTsKIApAQCAtMzY4Miw5OSArNDY1OCw2IEBACiB9OwogCiAvKgotICogQ1EgREIgQ1EgcHJvZHVjZXIgYW5kIHBlbmRpbmcgY29tcGxldGlvbiBjb3VudGVyCi0gKi8KLXN0cnVjdCBpc2NzaV9jcV9kYl9wcm9kX3BuZF9jbXBsdG5fY250IHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgY250cjsKLQl1MTYgcHJvZDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBwcm9kOwotCXUxNiBjbnRyOwotI2VuZGlmCi19OwotCi0vKgotICogQ1EgREIgcGVuZGluZyBjb21wbGV0aW9uIElUVCBhcnJheQotICovCi1zdHJ1Y3QgaXNjc2lfY3FfZGJfcHJvZF9wbmRfY21wbHRuX2NudF9hcnIgewotCXN0cnVjdCBpc2NzaV9jcV9kYl9wcm9kX3BuZF9jbXBsdG5fY250IHByb2RfcGVuZF9jb21wWzhdOwotfTsKLQotLyoKLSAqIENzdG9ybSBDUSBzZXF1ZW5jZSB0byBub3RpZnkgYXJyYXksIHVwZGF0ZWQgYnkgZHJpdmVyCi0gKi8KLXN0cnVjdCBpc2NzaV9jcV9kYl9zcW5fMl9ub3RpZnlfYXJyIHsKLQl1MTYgc3FuWzhdOwotfTsKLQotLyoKLSAqIENzdG9ybSBpU0NTSSBTdG9ybSBDb250ZXh0Ci0gKi8KLXN0cnVjdCBjc3Rvcm1faXNjc2lfc3RfY29udGV4dCB7Ci0Jc3RydWN0IGlzY3NpX2NxX2RiX3Byb2RfcG5kX2NtcGx0bl9jbnRfYXJyIGNxX2NfcHJvZF9wZW5kX2NvbXBfY3RyX2FycjsKLQlzdHJ1Y3QgaXNjc2lfY3FfZGJfc3FuXzJfbm90aWZ5X2FyciBjcV9jX3Byb2Rfc3FuX2FycjsKLQlzdHJ1Y3QgaXNjc2lfY3FfZGJfc3FuXzJfbm90aWZ5X2FyciBjcV9jX3Nxbl8yX25vdGlmeV9hcnI7Ci0Jc3RydWN0IHJlZ3BhaXIgaHFfcGJsX2Jhc2U7Ci0Jc3RydWN0IHJlZ3BhaXIgaHFfY3Vycl9wYmU7Ci0Jc3RydWN0IHJlZ3BhaXIgdGFza19wYmxfYmFzZTsKLQlzdHJ1Y3QgcmVncGFpciBjcV9kYl9iYXNlOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBocV9iZF9pdHQ7Ci0JdTE2IGlzY3NpX2Nvbm5faWQ7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgaXNjc2lfY29ubl9pZDsKLQl1MTYgaHFfYmRfaXR0OwotI2VuZGlmCi0JdTMyIGhxX2JkX2RhdGFfc2VnbWVudF9sZW47Ci0JdTMyIGhxX2JkX2J1ZmZlcl9vZmZzZXQ7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggdGltZXJfZW50cnlfaWR4OwotCXU4IGNxX3Byb2NfZW5fYml0X21hcDsKLQl1OCBjcV9wZW5kX2NvbXBfaXR0X3ZhbGlkX2JpdF9tYXA7Ci0JdTggaHFfYmRfb3Bjb2RlOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggaHFfYmRfb3Bjb2RlOwotCXU4IGNxX3BlbmRfY29tcF9pdHRfdmFsaWRfYml0X21hcDsKLQl1OCBjcV9wcm9jX2VuX2JpdF9tYXA7Ci0JdTggdGltZXJfZW50cnlfaWR4OwotI2VuZGlmCi0JdTMyIGhxX3RjcF9zZXE7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IGZsYWdzOwotI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9EQVRBX0RJR0VTVF9FTiAoMHgxPDwwKQotI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9EQVRBX0RJR0VTVF9FTl9TSElGVCAwCi0jZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0hEUl9ESUdFU1RfRU4gKDB4MTw8MSkKLSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSERSX0RJR0VTVF9FTl9TSElGVCAxCi0jZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0hRX0JEX0NUWFRfVkFMSUQgKDB4MTw8MikKLSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSFFfQkRfQ1RYVF9WQUxJRF9TSElGVCAyCi0jZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0hRX0JEX0xDTF9DTVBMTl9GTEcgKDB4MTw8MykKLSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSFFfQkRfTENMX0NNUExOX0ZMR19TSElGVCAzCi0jZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0hRX0JEX1dSSVRFX1RBU0sgKDB4MTw8NCkKLSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSFFfQkRfV1JJVEVfVEFTS19TSElGVCA0Ci0jZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0NUUkxfRkxBR1NfUlNSViAoMHg3RkY8PDUpCi0jZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0NUUkxfRkxBR1NfUlNSVl9TSElGVCA1Ci0JdTE2IGhxX2NvbnM7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgaHFfY29uczsKLQl1MTYgZmxhZ3M7Ci0jZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0RBVEFfRElHRVNUX0VOICgweDE8PDApCi0jZGVmaW5lIENTVE9STV9JU0NTSV9TVF9DT05URVhUX0RBVEFfRElHRVNUX0VOX1NISUZUIDAKLSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSERSX0RJR0VTVF9FTiAoMHgxPDwxKQotI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IRFJfRElHRVNUX0VOX1NISUZUIDEKLSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSFFfQkRfQ1RYVF9WQUxJRCAoMHgxPDwyKQotI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IUV9CRF9DVFhUX1ZBTElEX1NISUZUIDIKLSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSFFfQkRfTENMX0NNUExOX0ZMRyAoMHgxPDwzKQotI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IUV9CRF9MQ0xfQ01QTE5fRkxHX1NISUZUIDMKLSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfSFFfQkRfV1JJVEVfVEFTSyAoMHgxPDw0KQotI2RlZmluZSBDU1RPUk1fSVNDU0lfU1RfQ09OVEVYVF9IUV9CRF9XUklURV9UQVNLX1NISUZUIDQKLSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQ1RSTF9GTEFHU19SU1JWICgweDdGRjw8NSkKLSNkZWZpbmUgQ1NUT1JNX0lTQ1NJX1NUX0NPTlRFWFRfQ1RSTF9GTEFHU19SU1JWX1NISUZUIDUKLSNlbmRpZgotCXN0cnVjdCByZWdwYWlyIHJzcnYxOwotfTsKLQotLyoKICAqIElzY3NpIGNvbm5lY3Rpb24gY29udGV4dAogICovCiBzdHJ1Y3QgaXNjc2lfY29udGV4dCB7CkBAIC0zNzkxLDU4NCArNDY3NCwzODkgQEAKIAlzdHJ1Y3QgY3N0b3JtX2lzY3NpX3N0X2NvbnRleHQgY3N0b3JtX3N0X2NvbnRleHQ7CiB9OwogCisKIC8qCi0gKiBGQ29FIEtDUSBDUUUgcGFyYW1ldGVycworICogUERVIGhlYWRlciBvZiBhbiBpU0NTSSBEQVRBLU9VVAogICovCi11bmlvbiBmY29lX2tjcWVfcGFyYW1zIHsKLQl1MzIgcmVzZXJ2ZWQwWzRdOworc3RydWN0IGlzY3NpX2RhdGFfcGR1X2hkcl9saXR0bGVfZW5kaWFuIHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCBvcGNvZGU7CisJdTggb3BfYXR0cjsKKyNkZWZpbmUgSVNDU0lfREFUQV9QRFVfSERSX0xJVFRMRV9FTkRJQU5fUlNSVjEgKDB4N0Y8PDApCisjZGVmaW5lIElTQ1NJX0RBVEFfUERVX0hEUl9MSVRUTEVfRU5ESUFOX1JTUlYxX1NISUZUIDAKKyNkZWZpbmUgSVNDU0lfREFUQV9QRFVfSERSX0xJVFRMRV9FTkRJQU5fRklOQUxfRkxBRyAoMHgxPDw3KQorI2RlZmluZSBJU0NTSV9EQVRBX1BEVV9IRFJfTElUVExFX0VORElBTl9GSU5BTF9GTEFHX1NISUZUIDcKKwl1MTYgcnNydjA7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgcnNydjA7CisJdTggb3BfYXR0cjsKKyNkZWZpbmUgSVNDU0lfREFUQV9QRFVfSERSX0xJVFRMRV9FTkRJQU5fUlNSVjEgKDB4N0Y8PDApCisjZGVmaW5lIElTQ1NJX0RBVEFfUERVX0hEUl9MSVRUTEVfRU5ESUFOX1JTUlYxX1NISUZUIDAKKyNkZWZpbmUgSVNDU0lfREFUQV9QRFVfSERSX0xJVFRMRV9FTkRJQU5fRklOQUxfRkxBRyAoMHgxPDw3KQorI2RlZmluZSBJU0NTSV9EQVRBX1BEVV9IRFJfTElUVExFX0VORElBTl9GSU5BTF9GTEFHX1NISUZUIDcKKwl1OCBvcGNvZGU7CisjZW5kaWYKKwl1MzIgZGF0YV9maWVsZHM7CisjZGVmaW5lIElTQ1NJX0RBVEFfUERVX0hEUl9MSVRUTEVfRU5ESUFOX0RBVEFfU0VHTUVOVF9MRU5HVEggKDB4RkZGRkZGPDwwKQorI2RlZmluZSBJU0NTSV9EQVRBX1BEVV9IRFJfTElUVExFX0VORElBTl9EQVRBX1NFR01FTlRfTEVOR1RIX1NISUZUIDAKKyNkZWZpbmUgSVNDU0lfREFUQV9QRFVfSERSX0xJVFRMRV9FTkRJQU5fVE9UQUxfQUhTX0xFTkdUSCAoMHhGRjw8MjQpCisjZGVmaW5lIElTQ1NJX0RBVEFfUERVX0hEUl9MSVRUTEVfRU5ESUFOX1RPVEFMX0FIU19MRU5HVEhfU0hJRlQgMjQKKwlzdHJ1Y3QgcmVncGFpciBsdW47CisJdTMyIGl0dDsKKwl1MzIgdHR0OworCXUzMiByc3J2MjsKKwl1MzIgZXhwX3N0YXRfc247CisJdTMyIHJzcnYzOworCXUzMiBkYXRhX3NuOworCXUzMiBidWZmZXJfb2Zmc2V0OworCXUzMiByc3J2NDsKK307CisKKworLyoKKyAqIFBEVSBoZWFkZXIgb2YgYW4gaVNDU0kgbG9naW4gcmVxdWVzdAorICovCitzdHJ1Y3QgaXNjc2lfbG9naW5fcmVxX2hkcl9saXR0bGVfZW5kaWFuIHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1OCBvcGNvZGU7CisJdTggb3BfYXR0cjsKKyNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9MSVRUTEVfRU5ESUFOX05TRyAoMHgzPDwwKQorI2RlZmluZSBJU0NTSV9MT0dJTl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fTlNHX1NISUZUIDAKKyNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9MSVRUTEVfRU5ESUFOX0NTRyAoMHgzPDwyKQorI2RlZmluZSBJU0NTSV9MT0dJTl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fQ1NHX1NISUZUIDIKKyNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9MSVRUTEVfRU5ESUFOX1JTUlYwICgweDM8PDQpCisjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfTElUVExFX0VORElBTl9SU1JWMF9TSElGVCA0CisjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfTElUVExFX0VORElBTl9DT05USU5VRV9GTEcgKDB4MTw8NikKKyNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9MSVRUTEVfRU5ESUFOX0NPTlRJTlVFX0ZMR19TSElGVCA2CisjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfTElUVExFX0VORElBTl9UUkFOU0lUICgweDE8PDcpCisjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfTElUVExFX0VORElBTl9UUkFOU0lUX1NISUZUIDcKKwl1OCB2ZXJzaW9uX21heDsKKwl1OCB2ZXJzaW9uX21pbjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXU4IHZlcnNpb25fbWluOworCXU4IHZlcnNpb25fbWF4OworCXU4IG9wX2F0dHI7CisjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfTElUVExFX0VORElBTl9OU0cgKDB4Mzw8MCkKKyNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9MSVRUTEVfRU5ESUFOX05TR19TSElGVCAwCisjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfTElUVExFX0VORElBTl9DU0cgKDB4Mzw8MikKKyNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9MSVRUTEVfRU5ESUFOX0NTR19TSElGVCAyCisjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfTElUVExFX0VORElBTl9SU1JWMCAoMHgzPDw0KQorI2RlZmluZSBJU0NTSV9MT0dJTl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fUlNSVjBfU0hJRlQgNAorI2RlZmluZSBJU0NTSV9MT0dJTl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fQ09OVElOVUVfRkxHICgweDE8PDYpCisjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfTElUVExFX0VORElBTl9DT05USU5VRV9GTEdfU0hJRlQgNgorI2RlZmluZSBJU0NTSV9MT0dJTl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fVFJBTlNJVCAoMHgxPDw3KQorI2RlZmluZSBJU0NTSV9MT0dJTl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fVFJBTlNJVF9TSElGVCA3CisJdTggb3Bjb2RlOworI2VuZGlmCisJdTMyIGRhdGFfZmllbGRzOworI2RlZmluZSBJU0NTSV9MT0dJTl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fREFUQV9TRUdNRU5UX0xFTkdUSCAoMHhGRkZGRkY8PDApCisjZGVmaW5lIElTQ1NJX0xPR0lOX1JFUV9IRFJfTElUVExFX0VORElBTl9EQVRBX1NFR01FTlRfTEVOR1RIX1NISUZUIDAKKyNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9MSVRUTEVfRU5ESUFOX1RPVEFMX0FIU19MRU5HVEggKDB4RkY8PDI0KQorI2RlZmluZSBJU0NTSV9MT0dJTl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fVE9UQUxfQUhTX0xFTkdUSF9TSElGVCAyNAorCXUzMiBpc2lkX2xvOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBpc2lkX2hpOworCXUxNiB0c2loOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IHRzaWg7CisJdTE2IGlzaWRfaGk7CisjZW5kaWYKKwl1MzIgaXR0OworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBjaWQ7CisJdTE2IHJzcnYxOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IHJzcnYxOworCXUxNiBjaWQ7CisjZW5kaWYKKwl1MzIgY21kX3NuOworCXUzMiBleHBfc3RhdF9zbjsKKwl1MzIgcnNydjJbNF07CiB9OwogCiAvKgotICogRkNvRSBLQ1EgQ1FFCisgKiBQRFUgaGVhZGVyIG9mIGFuIGlTQ1NJIGxvZ291dCByZXF1ZXN0CiAgKi8KLXN0cnVjdCBmY29lX2tjcWUgewotCXUzMiBmY29lX2Nvbm5faWQ7Ci0JdTMyIGNvbXBsZXRpb25fc3RhdHVzOwotCXUzMiBmY29lX2Nvbm5fY29udGV4dF9pZDsKLQl1bmlvbiBmY29lX2tjcWVfcGFyYW1zIHBhcmFtczsKK3N0cnVjdCBpc2NzaV9sb2dvdXRfcmVxX2hkcl9saXR0bGVfZW5kaWFuIHsKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBmbGFnczsKLSNkZWZpbmUgRkNPRV9LQ1FFX1JFU0VSVkVEMCAoMHg3PDwwKQotI2RlZmluZSBGQ09FX0tDUUVfUkVTRVJWRUQwX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9LQ1FFX1JBTVJPRF9DT01QTEVUSU9OICgweDE8PDMpCi0jZGVmaW5lIEZDT0VfS0NRRV9SQU1ST0RfQ09NUExFVElPTl9TSElGVCAzCi0jZGVmaW5lIEZDT0VfS0NRRV9MQVlFUl9DT0RFICgweDc8PDQpCi0jZGVmaW5lIEZDT0VfS0NRRV9MQVlFUl9DT0RFX1NISUZUIDQKLSNkZWZpbmUgRkNPRV9LQ1FFX0xJTktFRF9XSVRIX05FWFQgKDB4MTw8NykKLSNkZWZpbmUgRkNPRV9LQ1FFX0xJTktFRF9XSVRIX05FWFRfU0hJRlQgNwotCXU4IG9wX2NvZGU7Ci0JdTE2IHFlX3NlbGZfc2VxOworCXU4IG9wY29kZTsKKwl1OCBvcF9hdHRyOworI2RlZmluZSBJU0NTSV9MT0dPVVRfUkVRX0hEUl9MSVRUTEVfRU5ESUFOX1JFQVNPTl9DT0RFICgweDdGPDwwKQorI2RlZmluZSBJU0NTSV9MT0dPVVRfUkVRX0hEUl9MSVRUTEVfRU5ESUFOX1JFQVNPTl9DT0RFX1NISUZUIDAKKyNkZWZpbmUgSVNDU0lfTE9HT1VUX1JFUV9IRFJfTElUVExFX0VORElBTl9SU1JWMV8xICgweDE8PDcpCisjZGVmaW5lIElTQ1NJX0xPR09VVF9SRVFfSERSX0xJVFRMRV9FTkRJQU5fUlNSVjFfMV9TSElGVCA3CisJdTE2IHJzcnYwOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHFlX3NlbGZfc2VxOwotCXU4IG9wX2NvZGU7Ci0JdTggZmxhZ3M7Ci0jZGVmaW5lIEZDT0VfS0NRRV9SRVNFUlZFRDAgKDB4Nzw8MCkKLSNkZWZpbmUgRkNPRV9LQ1FFX1JFU0VSVkVEMF9TSElGVCAwCi0jZGVmaW5lIEZDT0VfS0NRRV9SQU1ST0RfQ09NUExFVElPTiAoMHgxPDwzKQotI2RlZmluZSBGQ09FX0tDUUVfUkFNUk9EX0NPTVBMRVRJT05fU0hJRlQgMwotI2RlZmluZSBGQ09FX0tDUUVfTEFZRVJfQ09ERSAoMHg3PDw0KQotI2RlZmluZSBGQ09FX0tDUUVfTEFZRVJfQ09ERV9TSElGVCA0Ci0jZGVmaW5lIEZDT0VfS0NRRV9MSU5LRURfV0lUSF9ORVhUICgweDE8PDcpCi0jZGVmaW5lIEZDT0VfS0NRRV9MSU5LRURfV0lUSF9ORVhUX1NISUZUIDcKKwl1MTYgcnNydjA7CisJdTggb3BfYXR0cjsKKyNkZWZpbmUgSVNDU0lfTE9HT1VUX1JFUV9IRFJfTElUVExFX0VORElBTl9SRUFTT05fQ09ERSAoMHg3Rjw8MCkKKyNkZWZpbmUgSVNDU0lfTE9HT1VUX1JFUV9IRFJfTElUVExFX0VORElBTl9SRUFTT05fQ09ERV9TSElGVCAwCisjZGVmaW5lIElTQ1NJX0xPR09VVF9SRVFfSERSX0xJVFRMRV9FTkRJQU5fUlNSVjFfMSAoMHgxPDw3KQorI2RlZmluZSBJU0NTSV9MT0dPVVRfUkVRX0hEUl9MSVRUTEVfRU5ESUFOX1JTUlYxXzFfU0hJRlQgNworCXU4IG9wY29kZTsKICNlbmRpZgorCXUzMiBkYXRhX2ZpZWxkczsKKyNkZWZpbmUgSVNDU0lfTE9HT1VUX1JFUV9IRFJfTElUVExFX0VORElBTl9EQVRBX1NFR01FTlRfTEVOR1RIICgweEZGRkZGRjw8MCkKKyNkZWZpbmUgSVNDU0lfTE9HT1VUX1JFUV9IRFJfTElUVExFX0VORElBTl9EQVRBX1NFR01FTlRfTEVOR1RIX1NISUZUIDAKKyNkZWZpbmUgSVNDU0lfTE9HT1VUX1JFUV9IRFJfTElUVExFX0VORElBTl9UT1RBTF9BSFNfTEVOR1RIICgweEZGPDwyNCkKKyNkZWZpbmUgSVNDU0lfTE9HT1VUX1JFUV9IRFJfTElUVExFX0VORElBTl9UT1RBTF9BSFNfTEVOR1RIX1NISUZUIDI0CisJdTMyIHJzcnYyWzJdOworCXUzMiBpdHQ7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IGNpZDsKKwl1MTYgcnNydjE7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1MTYgcnNydjE7CisJdTE2IGNpZDsKKyNlbmRpZgorCXUzMiBjbWRfc247CisJdTMyIGV4cF9zdGF0X3NuOworCXUzMiByc3J2M1s0XTsKIH07CiAKIC8qCi0gKiBGQ29FIEtXUUUgaGVhZGVyCisgKiBQRFUgaGVhZGVyIG9mIGFuIGlTQ1NJIFRNRiByZXF1ZXN0CiAgKi8KLXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIHsKK3N0cnVjdCBpc2NzaV90bWZfcmVxX2hkcl9saXR0bGVfZW5kaWFuIHsKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBmbGFnczsKLSNkZWZpbmUgRkNPRV9LV1FFX0hFQURFUl9SRVNFUlZFRDAgKDB4Rjw8MCkKLSNkZWZpbmUgRkNPRV9LV1FFX0hFQURFUl9SRVNFUlZFRDBfU0hJRlQgMAotI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX0xBWUVSX0NPREUgKDB4Nzw8NCkKLSNkZWZpbmUgRkNPRV9LV1FFX0hFQURFUl9MQVlFUl9DT0RFX1NISUZUIDQKLSNkZWZpbmUgRkNPRV9LV1FFX0hFQURFUl9SRVNFUlZFRDEgKDB4MTw8NykKLSNkZWZpbmUgRkNPRV9LV1FFX0hFQURFUl9SRVNFUlZFRDFfU0hJRlQgNwotCXU4IG9wX2NvZGU7CisJdTggb3Bjb2RlOworCXU4IG9wX2F0dHI7CisjZGVmaW5lIElTQ1NJX1RNRl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fRlVOQ1RJT04gKDB4N0Y8PDApCisjZGVmaW5lIElTQ1NJX1RNRl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fRlVOQ1RJT05fU0hJRlQgMAorI2RlZmluZSBJU0NTSV9UTUZfUkVRX0hEUl9MSVRUTEVfRU5ESUFOX1JTUlYxXzEgKDB4MTw8NykKKyNkZWZpbmUgSVNDU0lfVE1GX1JFUV9IRFJfTElUVExFX0VORElBTl9SU1JWMV8xX1NISUZUIDcKKwl1MTYgcnNydjA7CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBvcF9jb2RlOwotCXU4IGZsYWdzOwotI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX1JFU0VSVkVEMCAoMHhGPDwwKQotI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX1JFU0VSVkVEMF9TSElGVCAwCi0jZGVmaW5lIEZDT0VfS1dRRV9IRUFERVJfTEFZRVJfQ09ERSAoMHg3PDw0KQotI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX0xBWUVSX0NPREVfU0hJRlQgNAotI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX1JFU0VSVkVEMSAoMHgxPDw3KQotI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX1JFU0VSVkVEMV9TSElGVCA3CisJdTE2IHJzcnYwOworCXU4IG9wX2F0dHI7CisjZGVmaW5lIElTQ1NJX1RNRl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fRlVOQ1RJT04gKDB4N0Y8PDApCisjZGVmaW5lIElTQ1NJX1RNRl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fRlVOQ1RJT05fU0hJRlQgMAorI2RlZmluZSBJU0NTSV9UTUZfUkVRX0hEUl9MSVRUTEVfRU5ESUFOX1JTUlYxXzEgKDB4MTw8NykKKyNkZWZpbmUgSVNDU0lfVE1GX1JFUV9IRFJfTElUVExFX0VORElBTl9SU1JWMV8xX1NISUZUIDcKKwl1OCBvcGNvZGU7CiAjZW5kaWYKKwl1MzIgZGF0YV9maWVsZHM7CisjZGVmaW5lIElTQ1NJX1RNRl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fREFUQV9TRUdNRU5UX0xFTkdUSCAoMHhGRkZGRkY8PDApCisjZGVmaW5lIElTQ1NJX1RNRl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fREFUQV9TRUdNRU5UX0xFTkdUSF9TSElGVCAwCisjZGVmaW5lIElTQ1NJX1RNRl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fVE9UQUxfQUhTX0xFTkdUSCAoMHhGRjw8MjQpCisjZGVmaW5lIElTQ1NJX1RNRl9SRVFfSERSX0xJVFRMRV9FTkRJQU5fVE9UQUxfQUhTX0xFTkdUSF9TSElGVCAyNAorCXN0cnVjdCByZWdwYWlyIGx1bjsKKwl1MzIgaXR0OworCXUzMiByZWZlcmVuY2VkX3Rhc2tfdGFnOworCXUzMiBjbWRfc247CisJdTMyIGV4cF9zdGF0X3NuOworCXUzMiByZWZfY21kX3NuOworCXUzMiBleHBfZGF0YV9zbjsKKwl1MzIgcnNydjJbMl07CiB9OwogCiAvKgotICogRkNvRSBmaXJtd2FyZSBpbml0IHJlcXVlc3QgMQorICogUERVIGhlYWRlciBvZiBhbiBpU0NTSSBUZXh0IHJlcXVlc3QKICAqLwotc3RydWN0IGZjb2Vfa3dxZV9pbml0MSB7CitzdHJ1Y3QgaXNjc2lfdGV4dF9yZXFfaGRyX2xpdHRsZV9lbmRpYW4gewogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLQl1MTYgbnVtX3Rhc2tzOworCXU4IG9wY29kZTsKKwl1OCBvcF9hdHRyOworI2RlZmluZSBJU0NTSV9URVhUX1JFUV9IRFJfTElUVExFX0VORElBTl9SU1JWMSAoMHgzRjw8MCkKKyNkZWZpbmUgSVNDU0lfVEVYVF9SRVFfSERSX0xJVFRMRV9FTkRJQU5fUlNSVjFfU0hJRlQgMAorI2RlZmluZSBJU0NTSV9URVhUX1JFUV9IRFJfTElUVExFX0VORElBTl9DT05USU5VRV9GTEcgKDB4MTw8NikKKyNkZWZpbmUgSVNDU0lfVEVYVF9SRVFfSERSX0xJVFRMRV9FTkRJQU5fQ09OVElOVUVfRkxHX1NISUZUIDYKKyNkZWZpbmUgSVNDU0lfVEVYVF9SRVFfSERSX0xJVFRMRV9FTkRJQU5fRklOQUwgKDB4MTw8NykKKyNkZWZpbmUgSVNDU0lfVEVYVF9SRVFfSERSX0xJVFRMRV9FTkRJQU5fRklOQUxfU0hJRlQgNworCXUxNiByc3J2MDsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBudW1fdGFza3M7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOworCXUxNiByc3J2MDsKKwl1OCBvcF9hdHRyOworI2RlZmluZSBJU0NTSV9URVhUX1JFUV9IRFJfTElUVExFX0VORElBTl9SU1JWMSAoMHgzRjw8MCkKKyNkZWZpbmUgSVNDU0lfVEVYVF9SRVFfSERSX0xJVFRMRV9FTkRJQU5fUlNSVjFfU0hJRlQgMAorI2RlZmluZSBJU0NTSV9URVhUX1JFUV9IRFJfTElUVExFX0VORElBTl9DT05USU5VRV9GTEcgKDB4MTw8NikKKyNkZWZpbmUgSVNDU0lfVEVYVF9SRVFfSERSX0xJVFRMRV9FTkRJQU5fQ09OVElOVUVfRkxHX1NISUZUIDYKKyNkZWZpbmUgSVNDU0lfVEVYVF9SRVFfSERSX0xJVFRMRV9FTkRJQU5fRklOQUwgKDB4MTw8NykKKyNkZWZpbmUgSVNDU0lfVEVYVF9SRVFfSERSX0xJVFRMRV9FTkRJQU5fRklOQUxfU0hJRlQgNworCXU4IG9wY29kZTsKICNlbmRpZgotCXUzMiB0YXNrX2xpc3RfcGJsX2FkZHJfbG87Ci0JdTMyIHRhc2tfbGlzdF9wYmxfYWRkcl9oaTsKLQl1MzIgZHVtbXlfYnVmZmVyX2FkZHJfbG87Ci0JdTMyIGR1bW15X2J1ZmZlcl9hZGRyX2hpOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBycV9udW1fd3FlczsKLQl1MTYgc3FfbnVtX3dxZXM7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgc3FfbnVtX3dxZXM7Ci0JdTE2IHJxX251bV93cWVzOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IGNxX251bV93cWVzOwotCXUxNiBycV9idWZmZXJfbG9nX3NpemU7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcnFfYnVmZmVyX2xvZ19zaXplOwotCXUxNiBjcV9udW1fd3FlczsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IGZsYWdzOwotI2RlZmluZSBGQ09FX0tXUUVfSU5JVDFfTE9HX1BBR0VfU0laRSAoMHhGPDwwKQotI2RlZmluZSBGQ09FX0tXUUVfSU5JVDFfTE9HX1BBR0VfU0laRV9TSElGVCAwCi0jZGVmaW5lIEZDT0VfS1dRRV9JTklUMV9MT0dfQ0FDSEVEX1BCRVNfUEVSX0ZVTkMgKDB4Nzw8NCkKLSNkZWZpbmUgRkNPRV9LV1FFX0lOSVQxX0xPR19DQUNIRURfUEJFU19QRVJfRlVOQ19TSElGVCA0Ci0jZGVmaW5lIEZDT0VfS1dRRV9JTklUMV9SRVNFUlZFRDEgKDB4MTw8NykKLSNkZWZpbmUgRkNPRV9LV1FFX0lOSVQxX1JFU0VSVkVEMV9TSElGVCA3Ci0JdTggbnVtX3Nlc3Npb25zX2xvZzsKLQl1MTYgbXR1OwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IG10dTsKLQl1OCBudW1fc2Vzc2lvbnNfbG9nOwotCXU4IGZsYWdzOwotI2RlZmluZSBGQ09FX0tXUUVfSU5JVDFfTE9HX1BBR0VfU0laRSAoMHhGPDwwKQotI2RlZmluZSBGQ09FX0tXUUVfSU5JVDFfTE9HX1BBR0VfU0laRV9TSElGVCAwCi0jZGVmaW5lIEZDT0VfS1dRRV9JTklUMV9MT0dfQ0FDSEVEX1BCRVNfUEVSX0ZVTkMgKDB4Nzw8NCkKLSNkZWZpbmUgRkNPRV9LV1FFX0lOSVQxX0xPR19DQUNIRURfUEJFU19QRVJfRlVOQ19TSElGVCA0Ci0jZGVmaW5lIEZDT0VfS1dRRV9JTklUMV9SRVNFUlZFRDEgKDB4MTw8NykKLSNkZWZpbmUgRkNPRV9LV1FFX0lOSVQxX1JFU0VSVkVEMV9TSElGVCA3Ci0jZW5kaWYKKwl1MzIgZGF0YV9maWVsZHM7CisjZGVmaW5lIElTQ1NJX1RFWFRfUkVRX0hEUl9MSVRUTEVfRU5ESUFOX0RBVEFfU0VHTUVOVF9MRU5HVEggKDB4RkZGRkZGPDwwKQorI2RlZmluZSBJU0NTSV9URVhUX1JFUV9IRFJfTElUVExFX0VORElBTl9EQVRBX1NFR01FTlRfTEVOR1RIX1NISUZUIDAKKyNkZWZpbmUgSVNDU0lfVEVYVF9SRVFfSERSX0xJVFRMRV9FTkRJQU5fVE9UQUxfQUhTX0xFTkdUSCAoMHhGRjw8MjQpCisjZGVmaW5lIElTQ1NJX1RFWFRfUkVRX0hEUl9MSVRUTEVfRU5ESUFOX1RPVEFMX0FIU19MRU5HVEhfU0hJRlQgMjQKKwlzdHJ1Y3QgcmVncGFpciBsdW47CisJdTMyIGl0dDsKKwl1MzIgdHR0OworCXUzMiBjbWRfc247CisJdTMyIGV4cF9zdGF0X3NuOworCXUzMiByc3J2M1s0XTsKIH07CiAKIC8qCi0gKiBGQ29FIGZpcm13YXJlIGluaXQgcmVxdWVzdCAyCisgKiBQRFUgaGVhZGVyIG9mIGFuIGlTQ1NJIE5vcC1PdXQKICAqLwotc3RydWN0IGZjb2Vfa3dxZV9pbml0MiB7CitzdHJ1Y3QgaXNjc2lfbm9wX291dF9oZHJfbGl0dGxlX2VuZGlhbiB7CiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0Jc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotCXUxNiByZXNlcnZlZDA7CisJdTggb3Bjb2RlOworCXU4IG9wX2F0dHI7CisjZGVmaW5lIElTQ1NJX05PUF9PVVRfSERSX0xJVFRMRV9FTkRJQU5fUlNSVjEgKDB4N0Y8PDApCisjZGVmaW5lIElTQ1NJX05PUF9PVVRfSERSX0xJVFRMRV9FTkRJQU5fUlNSVjFfU0hJRlQgMAorI2RlZmluZSBJU0NTSV9OT1BfT1VUX0hEUl9MSVRUTEVfRU5ESUFOX1JTUlYyXzEgKDB4MTw8NykKKyNkZWZpbmUgSVNDU0lfTk9QX09VVF9IRFJfTElUVExFX0VORElBTl9SU1JWMl8xX1NISUZUIDcKKwl1MTYgcnNydjA7CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcmVzZXJ2ZWQwOwotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKKwl1MTYgcnNydjA7CisJdTggb3BfYXR0cjsKKyNkZWZpbmUgSVNDU0lfTk9QX09VVF9IRFJfTElUVExFX0VORElBTl9SU1JWMSAoMHg3Rjw8MCkKKyNkZWZpbmUgSVNDU0lfTk9QX09VVF9IRFJfTElUVExFX0VORElBTl9SU1JWMV9TSElGVCAwCisjZGVmaW5lIElTQ1NJX05PUF9PVVRfSERSX0xJVFRMRV9FTkRJQU5fUlNSVjJfMSAoMHgxPDw3KQorI2RlZmluZSBJU0NTSV9OT1BfT1VUX0hEUl9MSVRUTEVfRU5ESUFOX1JTUlYyXzFfU0hJRlQgNworCXU4IG9wY29kZTsKICNlbmRpZgotCXUzMiBoYXNoX3RibF9wYmxfYWRkcl9sbzsKLQl1MzIgaGFzaF90YmxfcGJsX2FkZHJfaGk7Ci0JdTMyIHQyX2hhc2hfdGJsX2FkZHJfbG87Ci0JdTMyIHQyX2hhc2hfdGJsX2FkZHJfaGk7Ci0JdTMyIHQyX3B0cl9oYXNoX3RibF9hZGRyX2xvOwotCXUzMiB0Ml9wdHJfaGFzaF90YmxfYWRkcl9oaTsKLQl1MzIgZnJlZV9saXN0X2NvdW50OworCXUzMiBkYXRhX2ZpZWxkczsKKyNkZWZpbmUgSVNDU0lfTk9QX09VVF9IRFJfTElUVExFX0VORElBTl9EQVRBX1NFR01FTlRfTEVOR1RIICgweEZGRkZGRjw8MCkKKyNkZWZpbmUgSVNDU0lfTk9QX09VVF9IRFJfTElUVExFX0VORElBTl9EQVRBX1NFR01FTlRfTEVOR1RIX1NISUZUIDAKKyNkZWZpbmUgSVNDU0lfTk9QX09VVF9IRFJfTElUVExFX0VORElBTl9UT1RBTF9BSFNfTEVOR1RIICgweEZGPDwyNCkKKyNkZWZpbmUgSVNDU0lfTk9QX09VVF9IRFJfTElUVExFX0VORElBTl9UT1RBTF9BSFNfTEVOR1RIX1NISUZUIDI0CisJc3RydWN0IHJlZ3BhaXIgbHVuOworCXUzMiBpdHQ7CisJdTMyIHR0dDsKKwl1MzIgY21kX3NuOworCXUzMiBleHBfc3RhdF9zbjsKKwl1MzIgcnNydjNbNF07CiB9OwogCiAvKgotICogRkNvRSBmaXJtd2FyZSBpbml0IHJlcXVlc3QgMworICogaXNjc2kgcGR1IGhlYWRlcnMgaW4gbGl0dGxlIGVuZGlhbiBmb3JtLgogICovCi1zdHJ1Y3QgZmNvZV9rd3FlX2luaXQzIHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0JdTE2IHJlc2VydmVkMDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiByZXNlcnZlZDA7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotI2VuZGlmCi0JdTMyIGVycm9yX2JpdF9tYXBfbG87Ci0JdTMyIGVycm9yX2JpdF9tYXBfaGk7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggcmVzZXJ2ZWQyMVszXTsKLQl1OCBjYWNoZWRfc2Vzc2lvbl9lbmFibGU7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBjYWNoZWRfc2Vzc2lvbl9lbmFibGU7Ci0JdTggcmVzZXJ2ZWQyMVszXTsKLSNlbmRpZgotCXUzMiByZXNlcnZlZDJbNF07Cit1bmlvbiBpc2NzaV9wZHVfaGVhZGVyc19saXR0bGVfZW5kaWFuIHsKKwl1MzIgZnVsbEhlYWRlclNpemVbMTJdOworCXN0cnVjdCBpc2NzaV9jbWRfcGR1X2hkcl9saXR0bGVfZW5kaWFuIGNvbW1hbmRfcGR1X2hkcjsKKwlzdHJ1Y3QgaXNjc2lfZGF0YV9wZHVfaGRyX2xpdHRsZV9lbmRpYW4gZGF0YV9vdXRfcGR1X2hkcjsKKwlzdHJ1Y3QgaXNjc2lfbG9naW5fcmVxX2hkcl9saXR0bGVfZW5kaWFuIGxvZ2luX3JlcV9wZHVfaGRyOworCXN0cnVjdCBpc2NzaV9sb2dvdXRfcmVxX2hkcl9saXR0bGVfZW5kaWFuIGxvZ291dF9yZXFfcGR1X2hkcjsKKwlzdHJ1Y3QgaXNjc2lfdG1mX3JlcV9oZHJfbGl0dGxlX2VuZGlhbiB0bWZfcmVxX3BkdV9oZHI7CisJc3RydWN0IGlzY3NpX3RleHRfcmVxX2hkcl9saXR0bGVfZW5kaWFuIHRleHRfcmVxX3BkdV9oZHI7CisJc3RydWN0IGlzY3NpX25vcF9vdXRfaGRyX2xpdHRsZV9lbmRpYW4gbm9wX291dF9wZHVfaGRyOwogfTsKIAotLyoKLSAqIEZDb0UgY29ubmVjdGlvbiBvZmZsb2FkIHJlcXVlc3QgMQotICovCi1zdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fb2ZmbG9hZDEgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLQl1MTYgZmNvZV9jb25uX2lkOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGZjb2VfY29ubl9pZDsKLQlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0jZW5kaWYKLQl1MzIgc3FfYWRkcl9sbzsKLQl1MzIgc3FfYWRkcl9oaTsKLQl1MzIgcnFfcGJsX2FkZHJfbG87Ci0JdTMyIHJxX3BibF9hZGRyX2hpOwotCXUzMiBycV9maXJzdF9wYmVfYWRkcl9sbzsKLQl1MzIgcnFfZmlyc3RfcGJlX2FkZHJfaGk7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJlc2VydmVkMDsKLQl1MTYgcnFfcHJvZDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBycV9wcm9kOwotCXUxNiByZXNlcnZlZDA7Ci0jZW5kaWYKLX07Ci0KLS8qCi0gKiBGQ29FIGNvbm5lY3Rpb24gb2ZmbG9hZCByZXF1ZXN0IDIKLSAqLwotc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQyIHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0JdTE2IHR4X21heF9mY19wYXlfbGVuOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHR4X21heF9mY19wYXlfbGVuOwotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLSNlbmRpZgotCXUzMiBjcV9hZGRyX2xvOwotCXUzMiBjcV9hZGRyX2hpOwotCXUzMiB4ZmVycV9hZGRyX2xvOwotCXUzMiB4ZmVycV9hZGRyX2hpOwotCXUzMiBjb25uX2RiX2FkZHJfbG87Ci0JdTMyIGNvbm5fZGJfYWRkcl9oaTsKLQl1MzIgcmVzZXJ2ZWQxOwotfTsKLQotLyoKLSAqIEZDb0UgY29ubmVjdGlvbiBvZmZsb2FkIHJlcXVlc3QgMwotICovCi1zdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fb2ZmbG9hZDMgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLQl1MTYgdmxhbl90YWc7Ci0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX1ZMQU5fSUQgKDB4RkZGPDwwKQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19WTEFOX0lEX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQ0ZJICgweDE8PDEyKQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19DRklfU0hJRlQgMTIKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfUFJJT1JJVFkgKDB4Nzw8MTMpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX1BSSU9SSVRZX1NISUZUIDEzCi0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgdmxhbl90YWc7Ci0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX1ZMQU5fSUQgKDB4RkZGPDwwKQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19WTEFOX0lEX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQ0ZJICgweDE8PDEyKQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19DRklfU0hJRlQgMTIKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfUFJJT1JJVFkgKDB4Nzw8MTMpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX1BSSU9SSVRZX1NISUZUIDEzCi0Jc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggdHhfbWF4X2NvbmNfc2Vxc19jMzsKLQl1OCBzX2lkWzNdOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggc19pZFszXTsKLQl1OCB0eF9tYXhfY29uY19zZXFzX2MzOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggZmxhZ3M7Ci0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfTVVMX05fUE9SVF9JRFMgKDB4MTw8MCkKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9NVUxfTl9QT1JUX0lEU19TSElGVCAwCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfRV9EX1RPVl9SRVMgKDB4MTw8MSkKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9FX0RfVE9WX1JFU19TSElGVCAxCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQ09OVF9JTkNSX1NFUV9DTlQgKDB4MTw8MikKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9DT05UX0lOQ1JfU0VRX0NOVF9TSElGVCAyCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQ09ORl9SRVEgKDB4MTw8MykKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9DT05GX1JFUV9TSElGVCAzCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfUkVDX1ZBTElEICgweDE8PDQpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfUkVDX1ZBTElEX1NISUZUIDQKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9DMl9WQUxJRCAoMHgxPDw1KQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0MyX1ZBTElEX1NISUZUIDUKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9BQ0tfMCAoMHgxPDw2KQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0FDS18wX1NISUZUIDYKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9WTEFOX0ZMQUcgKDB4MTw8NykKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9WTEFOX0ZMQUdfU0hJRlQgNwotCXU4IGRfaWRbM107Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBkX2lkWzNdOwotCXU4IGZsYWdzOwotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX01VTF9OX1BPUlRfSURTICgweDE8PDApCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfTVVMX05fUE9SVF9JRFNfU0hJRlQgMAotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0VfRF9UT1ZfUkVTICgweDE8PDEpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfRV9EX1RPVl9SRVNfU0hJRlQgMQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0NPTlRfSU5DUl9TRVFfQ05UICgweDE8PDIpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQ09OVF9JTkNSX1NFUV9DTlRfU0hJRlQgMgotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0NPTkZfUkVRICgweDE8PDMpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQ09ORl9SRVFfU0hJRlQgMwotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX1JFQ19WQUxJRCAoMHgxPDw0KQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX1JFQ19WQUxJRF9TSElGVCA0Ci0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQzJfVkFMSUQgKDB4MTw8NSkKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9DMl9WQUxJRF9TSElGVCA1Ci0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQUNLXzAgKDB4MTw8NikKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9BQ0tfMF9TSElGVCA2Ci0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfVkxBTl9GTEFHICgweDE8PDcpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfVkxBTl9GTEFHX1NISUZUIDcKLSNlbmRpZgotCXUzMiByZXNlcnZlZDsKLQl1MzIgY29uZnFfZmlyc3RfcGJlX2FkZHJfbG87Ci0JdTMyIGNvbmZxX2ZpcnN0X3BiZV9hZGRyX2hpOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiByeF9tYXhfZmNfcGF5X2xlbjsKLQl1MTYgdHhfdG90YWxfY29uY19zZXFzOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHR4X3RvdGFsX2NvbmNfc2VxczsKLQl1MTYgcnhfbWF4X2ZjX3BheV9sZW47Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCByeF9vcGVuX3NlcXNfZXhjaF9jMzsKLQl1OCByeF9tYXhfY29uY19zZXFzX2MzOwotCXUxNiByeF90b3RhbF9jb25jX3NlcXM7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcnhfdG90YWxfY29uY19zZXFzOwotCXU4IHJ4X21heF9jb25jX3NlcXNfYzM7Ci0JdTggcnhfb3Blbl9zZXFzX2V4Y2hfYzM7Ci0jZW5kaWYKLX07Ci0KLS8qCi0gKiBGQ29FIGNvbm5lY3Rpb24gb2ZmbG9hZCByZXF1ZXN0IDQKLSAqLwotc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQ0IHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0JdTggcmVzZXJ2ZWQyOwotCXU4IGVfZF90b3ZfdGltZXJfdmFsOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggZV9kX3Rvdl90aW1lcl92YWw7Ci0JdTggcmVzZXJ2ZWQyOwotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLSNlbmRpZgotCXU4IHNyY19tYWNfYWRkcl9sbzMyWzRdOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IGRzdF9tYWNfYWRkcl9oaTE2WzJdOwotCXU4IHNyY19tYWNfYWRkcl9oaTE2WzJdOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggc3JjX21hY19hZGRyX2hpMTZbMl07Ci0JdTggZHN0X21hY19hZGRyX2hpMTZbMl07Ci0jZW5kaWYKLQl1OCBkc3RfbWFjX2FkZHJfbG8zMls0XTsKLQl1MzIgbGNxX2FkZHJfbG87Ci0JdTMyIGxjcV9hZGRyX2hpOwotCXUzMiBjb25mcV9wYmxfYmFzZV9hZGRyX2xvOwotCXUzMiBjb25mcV9wYmxfYmFzZV9hZGRyX2hpOwotfTsKLQotLyoKLSAqIEZDb0UgY29ubmVjdGlvbiBlbmFibGUgcmVxdWVzdAotICovCi1zdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fZW5hYmxlX2Rpc2FibGUgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLQl1MTYgcmVzZXJ2ZWQwOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHJlc2VydmVkMDsKLQlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0jZW5kaWYKLQl1OCBzcmNfbWFjX2FkZHJfbG8zMls0XTsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgdmxhbl90YWc7Ci0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1ZMQU5fSUQgKDB4RkZGPDwwKQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9WTEFOX0lEX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfQ0ZJICgweDE8PDEyKQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9DRklfU0hJRlQgMTIKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfUFJJT1JJVFkgKDB4Nzw8MTMpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1BSSU9SSVRZX1NISUZUIDEzCi0JdTggc3JjX21hY19hZGRyX2hpMTZbMl07Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBzcmNfbWFjX2FkZHJfaGkxNlsyXTsKLQl1MTYgdmxhbl90YWc7Ci0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1ZMQU5fSUQgKDB4RkZGPDwwKQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9WTEFOX0lEX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfQ0ZJICgweDE8PDEyKQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9DRklfU0hJRlQgMTIKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfUFJJT1JJVFkgKDB4Nzw8MTMpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1BSSU9SSVRZX1NISUZUIDEzCi0jZW5kaWYKLQl1OCBkc3RfbWFjX2FkZHJfbG8zMls0XTsKK3N0cnVjdCBpc2NzaV9ocV9iZCB7CisJdW5pb24gaXNjc2lfcGR1X2hlYWRlcnNfbGl0dGxlX2VuZGlhbiBwZHVfaGVhZGVyOwogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQogCXUxNiByZXNlcnZlZDE7Ci0JdTggZHN0X21hY19hZGRyX2hpMTZbMl07CisJdTE2IGxjbF9jbXBfZmxnOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggZHN0X21hY19hZGRyX2hpMTZbMl07CisJdTE2IGxjbF9jbXBfZmxnOwogCXUxNiByZXNlcnZlZDE7CiAjZW5kaWYKKwl1MzIgc2dsX2Jhc2VfbG87CisJdTMyIHNnbF9iYXNlX2hpOwogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IHZsYW5fZmxhZzsKLQl1OCBzX2lkWzNdOworCXU4IHNnbF9zaXplOworCXU4IHNnZV9pbmRleDsKKwl1MTYgc2dlX29mZnNldDsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IHNfaWRbM107Ci0JdTggdmxhbl9mbGFnOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggcmVzZXJ2ZWQzOwotCXU4IGRfaWRbM107Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBkX2lkWzNdOwotCXU4IHJlc2VydmVkMzsKLSNlbmRpZgotCXUzMiBjb250ZXh0X2lkOwotCXUzMiBjb25uX2lkOwotCXUzMiByZXNlcnZlZDQ7Ci19OwotCi0vKgotICogRkNvRSBjb25uZWN0aW9uIGRlc3Ryb3kgcmVxdWVzdAotICovCi1zdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fZGVzdHJveSB7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0Jc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotCXUxNiByZXNlcnZlZDA7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcmVzZXJ2ZWQwOwotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLSNlbmRpZgotCXUzMiBjb250ZXh0X2lkOwotCXUzMiBjb25uX2lkOwotCXUzMiByZXNlcnZlZDFbNV07Ci19OwotCi0vKgotICogRkNvZSBkZXN0cm95IHJlcXVlc3QKLSAqLwotc3RydWN0IGZjb2Vfa3dxZV9kZXN0cm95IHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0JdTE2IHJlc2VydmVkMDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiByZXNlcnZlZDA7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotI2VuZGlmCi0JdTMyIHJlc2VydmVkMVs3XTsKLX07Ci0KLS8qCi0gKiBGQ29lIHN0YXRpc3RpY3MgcmVxdWVzdAotICovCi1zdHJ1Y3QgZmNvZV9rd3FlX3N0YXQgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLQl1MTYgcmVzZXJ2ZWQwOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHJlc2VydmVkMDsKLQlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0jZW5kaWYKLQl1MzIgc3RhdF9wYXJhbXNfYWRkcl9sbzsKLQl1MzIgc3RhdF9wYXJhbXNfYWRkcl9oaTsKLQl1MzIgcmVzZXJ2ZWQxWzVdOwotfTsKLQotLyoKLSAqIEZDb0UgS1dRIFdRRQotICovCi11bmlvbiBmY29lX2t3cWUgewotCXN0cnVjdCBmY29lX2t3cWVfaW5pdDEgaW5pdDE7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9pbml0MiBpbml0MjsKLQlzdHJ1Y3QgZmNvZV9rd3FlX2luaXQzIGluaXQzOwotCXN0cnVjdCBmY29lX2t3cWVfY29ubl9vZmZsb2FkMSBjb25uX29mZmxvYWQxOwotCXN0cnVjdCBmY29lX2t3cWVfY29ubl9vZmZsb2FkMiBjb25uX29mZmxvYWQyOwotCXN0cnVjdCBmY29lX2t3cWVfY29ubl9vZmZsb2FkMyBjb25uX29mZmxvYWQzOwotCXN0cnVjdCBmY29lX2t3cWVfY29ubl9vZmZsb2FkNCBjb25uX29mZmxvYWQ0OwotCXN0cnVjdCBmY29lX2t3cWVfY29ubl9lbmFibGVfZGlzYWJsZSBjb25uX2VuYWJsZV9kaXNhYmxlOwotCXN0cnVjdCBmY29lX2t3cWVfY29ubl9kZXN0cm95IGNvbm5fZGVzdHJveTsKLQlzdHJ1Y3QgZmNvZV9rd3FlX2Rlc3Ryb3kgZGVzdHJveTsKLQlzdHJ1Y3QgZmNvZV9rd3FlX3N0YXQgc3RhdGlzdGljczsKLX07Ci0KLXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5IHsKLQlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeV90eF9vbmx5IHR4X3dyX29ubHk7Ci0Jc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnlfdHh3cl9yeHJkIHR4X3dyX3J4X3JkOwotCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3R4X3J4X2NtbiBjbW47Ci0Jc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnlfcnh3cl90eHJkIHJ4X3dyX3R4X3JkOwotCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3J4X29ubHkgcnhfd3Jfb25seTsKLQl1MzIgcmVzZXJ2ZWRbNF07Ci19OwotCi0vKgotICogRkNvRSBjb25uZWN0aW9uIGVuYWJsZVxkaXNhYmxlIHBhcmFtcyBwYXNzZWQgYnkgZHJpdmVyIHRvIEZXIGluIEZDb0UgZW5hYmxlIHJhbXJvZAotICovCi1zdHJ1Y3QgZmNvZV9jb25uX2VuYWJsZV9kaXNhYmxlX3JhbXJvZF9wYXJhbXMgewotCXN0cnVjdCBmY29lX2t3cWVfY29ubl9lbmFibGVfZGlzYWJsZSBlbmFibGVfZGlzYWJsZV9rd3FlOwotfTsKLQotCi0vKgotICogRkNvRSBjb25uZWN0aW9uIG9mZmxvYWQgcGFyYW1zIHBhc3NlZCBieSBkcml2ZXIgdG8gRlcgaW4gRkNvRSBvZmZsb2FkIHJhbXJvZAotICovCi1zdHJ1Y3QgZmNvZV9jb25uX29mZmxvYWRfcmFtcm9kX3BhcmFtcyB7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQxIG9mZmxvYWRfa3dxZTE7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQyIG9mZmxvYWRfa3dxZTI7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQzIG9mZmxvYWRfa3dxZTM7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQ0IG9mZmxvYWRfa3dxZTQ7Ci19OwotCi0vKgotICogRkNvRSBpbml0IHBhcmFtcyBwYXNzZWQgYnkgZHJpdmVyIHRvIEZXIGluIEZDb0UgaW5pdCByYW1yb2QKLSAqLwotc3RydWN0IGZjb2VfaW5pdF9yYW1yb2RfcGFyYW1zIHsKLQlzdHJ1Y3QgZmNvZV9rd3FlX2luaXQxIGluaXRfa3dxZTE7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9pbml0MiBpbml0X2t3cWUyOwotCXN0cnVjdCBmY29lX2t3cWVfaW5pdDMgaW5pdF9rd3FlMzsKLQlzdHJ1Y3QgcmVncGFpciBlcV9hZGRyOwotCXN0cnVjdCByZWdwYWlyIGVxX25leHRfcGFnZV9hZGRyOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBzYl9udW07Ci0JdTE2IGVxX3Byb2Q7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgZXFfcHJvZDsKLQl1MTYgc2JfbnVtOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJlc2VydmVkMTsKLQl1OCByZXNlcnZlZDA7Ci0JdTggc2JfaWQ7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBzYl9pZDsKLQl1OCByZXNlcnZlZDA7Ci0JdTE2IHJlc2VydmVkMTsKKwl1MTYgc2dlX29mZnNldDsKKwl1OCBzZ2VfaW5kZXg7CisJdTggc2dsX3NpemU7CiAjZW5kaWYKIH07CiAKIAogLyoKLSAqIEZDb0Ugc3RhdGlzdGljcyBwYXJhbXMgYnVmZmVyIHBhc3NlZCBieSBkcml2ZXIgdG8gRlcgaW4gRkNvRSBzdGF0aXN0aWNzIHJhbXJvZAorICogQ1FFIGRhdGEgZm9yIEwyIE9PTyBjb25uZWN0aW9uICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwotc3RydWN0IGZjb2Vfc3RhdF9yYW1yb2RfcGFyYW1zIHsKLQlzdHJ1Y3QgZmNvZV9rd3FlX3N0YXQgc3RhdF9rd3FlOworc3RydWN0IGlzY3NpX2wyX29vb19kYXRhIHsKKwlfX2xlMzIgaXNjc2lfY2lkOworCXU4IGRyb3BfaXNsZTsKKwl1OCBkcm9wX3NpemU7CisJdTggb29vX29wY29kZTsKKwl1OCBvb29faXNsZTsKKwl1OCByZXNlcnZlZFs4XTsKIH07CiAKIAotLyoKLSAqIEZDb0UgMTYtYml0cyB2bGFuIHN0cnVjdHVyZQotICovCi1zdHJ1Y3QgZmNvZV92bGFuX2ZpZWxkcyB7Ci0JdTE2IGZpZWxkczsKLSNkZWZpbmUgRkNPRV9WTEFOX0ZJRUxEU19WSUQgKDB4RkZGPDwwKQotI2RlZmluZSBGQ09FX1ZMQU5fRklFTERTX1ZJRF9TSElGVCAwCi0jZGVmaW5lIEZDT0VfVkxBTl9GSUVMRFNfQ0xJICgweDE8PDEyKQotI2RlZmluZSBGQ09FX1ZMQU5fRklFTERTX0NMSV9TSElGVCAxMgotI2RlZmluZSBGQ09FX1ZMQU5fRklFTERTX1BSSSAoMHg3PDwxMykKLSNkZWZpbmUgRkNPRV9WTEFOX0ZJRUxEU19QUklfU0hJRlQgMTMKKworCisKKworc3RydWN0IGlzY3NpX3Rhc2tfY29udGV4dF9lbnRyeV94dWNfY193cml0ZV9vbmx5IHsKKwl1MzIgdG90YWxfZGF0YV9hY2tlZDsKIH07CiAKLQotLyoKLSAqIEZDb0UgMTYtYml0cyB2bGFuIHVuaW9uCi0gKi8KLXVuaW9uIGZjb2Vfdmxhbl9maWVsZF91bmlvbiB7Ci0Jc3RydWN0IGZjb2Vfdmxhbl9maWVsZHMgZmllbGRzOwotCXUxNiB2YWw7CitzdHJ1Y3QgaXNjc2lfdGFza19jb250ZXh0X3IydF90YWJsZV9lbnRyeSB7CisJdTMyIHR0dDsKKwl1MzIgZGVzaXJlZF9kYXRhX2xlbjsKIH07CiAKLS8qCi0gKiBQYXJhbWV0ZXJzIHVzZWQgZm9yIENsYXNzIDIgdmVyaWZpY2F0aW9ucwotICovCi1zdHJ1Y3QgdXN0b3JtX2Zjb2VfYzJfcGFyYW1zIHsKK3N0cnVjdCBpc2NzaV90YXNrX2NvbnRleHRfZW50cnlfeHVjX3Vfd3JpdGVfb25seSB7CisJdTMyIGV4cF9yMnRfc247CisJc3RydWN0IGlzY3NpX3Rhc2tfY29udGV4dF9yMnRfdGFibGVfZW50cnkgcjJ0X3RhYmxlWzRdOwogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiBlMmVfY3JlZGl0OwotCXUxNiBjb25fc2VxOworCXUxNiBkYXRhX2luX2NvdW50OworCXU4IGNxX2lkOworCXU4IHZhbGlkXzFiOwogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGNvbl9zZXE7Ci0JdTE2IGUyZV9jcmVkaXQ7CisJdTggdmFsaWRfMWI7CisJdTggY3FfaWQ7CisJdTE2IGRhdGFfaW5fY291bnQ7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgYWNrcV9wcm9kOwotCXUxNiBvcGVuX3NlcV9wZXJfZXhjaDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBvcGVuX3NlcV9wZXJfZXhjaDsKLQl1MTYgYWNrcV9wcm9kOwotI2VuZGlmCi0Jc3RydWN0IHJlZ3BhaXIgYWNrcV9wYmxfYmFzZTsKLQlzdHJ1Y3QgcmVncGFpciBhY2txX2N1cl9zZWc7CiB9OwogCi0vKgotICogUGFyYW1ldGVycyB1c2VkIGZvciBDbGFzcyAyIHZlcmlmaWNhdGlvbnMKLSAqLwotc3RydWN0IHhzdG9ybV9mY29lX2MyX3BhcmFtcyB7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJlc2VydmVkMDsKLQl1OCBhY2txX3hfcHJvZDsKLQl1OCBtYXhfY29uY19zZXFzX2MyOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggbWF4X2NvbmNfc2Vxc19jMjsKLQl1OCBhY2txX3hfcHJvZDsKLQl1MTYgcmVzZXJ2ZWQwOwotI2VuZGlmCi0Jc3RydWN0IHJlZ3BhaXIgYWNrcV9wYmxfYmFzZTsKLQlzdHJ1Y3QgcmVncGFpciBhY2txX2N1cl9zZWc7CitzdHJ1Y3QgaXNjc2lfdGFza19jb250ZXh0X2VudHJ5X3h1YyB7CisJc3RydWN0IGlzY3NpX3Rhc2tfY29udGV4dF9lbnRyeV94dWNfY193cml0ZV9vbmx5IHdyaXRlX2M7CisJdTMyIGV4cF9kYXRhX3RyYW5zZmVyX2xlbjsKKwlzdHJ1Y3QgaXNjc2lfdGFza19jb250ZXh0X2VudHJ5X3h1Y194X3dyaXRlX29ubHkgd3JpdGVfeDsKKwl1MzIgbHVuX2xvOworCXN0cnVjdCBpc2NzaV90YXNrX2NvbnRleHRfZW50cnlfeHVjX3h1X3dyaXRlX2JvdGggd3JpdGVfeHU7CisJdTMyIGx1bl9oaTsKKwlzdHJ1Y3QgaXNjc2lfdGFza19jb250ZXh0X2VudHJ5X3h1Y191X3dyaXRlX29ubHkgd3JpdGVfdTsKIH07CiAKLS8qCi0gKiBCdWZmZXIgcGVyIGNvbm5lY3Rpb24sIHVzZWQgaW4gVHN0b3JtCi0gKi8KLXN0cnVjdCBpc2NzaV9jb25uX2J1ZiB7Ci0Jc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWRbOF07CitzdHJ1Y3QgaXNjc2lfdGFza19jb250ZXh0X2VudHJ5X3UgeworCXUzMiBleHBfcjJ0X2J1ZmZfb2Zmc2V0OworCXUzMiByZW1fcmN2X2xlbjsKKwl1MzIgZXhwX2RhdGFfc247CiB9OwogCitzdHJ1Y3QgaXNjc2lfdGFza19jb250ZXh0X2VudHJ5IHsKKwlzdHJ1Y3QgaXNjc2lfdGFza19jb250ZXh0X2VudHJ5X3ggdGNlX3g7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IGRhdGFfb3V0X2NvdW50OworCXUxNiByc3J2MDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiByc3J2MDsKKwl1MTYgZGF0YV9vdXRfY291bnQ7CisjZW5kaWYKKwlzdHJ1Y3QgaXNjc2lfdGFza19jb250ZXh0X2VudHJ5X3h1YyB0Y2VfeHVjOworCXN0cnVjdCBpc2NzaV90YXNrX2NvbnRleHRfZW50cnlfdSB0Y2VfdTsKKwl1MzIgcnNydjFbN107Cit9OworCisKKworCisKKworCisKK3N0cnVjdCBpc2NzaV90YXNrX2NvbnRleHRfZW50cnlfeHVjX3hfaW5pdF9vbmx5IHsKKwlzdHJ1Y3QgcmVncGFpciBsdW47CisJdTMyIGV4cF9kYXRhX3RyYW5zZmVyX2xlbjsKK307CisKKworCisKKworCisKKworCisKKworCisKKworCisKKwogLyoKICAqIGlwdjYgc3RydWN0dXJlCiAgKi8KQEAgLTQzNzksNiArNTA2Nyw4IEBACiAJdTMyIGlwX2FkZHJfaGlfaGk7CiB9OwogCisKKwogLyoKICAqIGw1Y20tIGNvbm5lY3Rpb24gaWRlbnRpZmljYXRpb24gcGFyYW1zCiAgKi8KQEAgLTQ0NjAsOCArNTE1MCw3IEBACiAgKiBsNWNtLXRzdG9ybSBjb25uZWN0aW9uIGJ1ZmZlcgogICovCiBzdHJ1Y3QgbDVjbV90c3Rvcm1fY29ubl9idWZmZXIgewotCXUzMiBzbmRfYnVmOwotCXUzMiByY3ZfYnVmOworCXUzMiByc3J2MVsyXTsKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKIAl1MTYgcGFyYW1zOwogI2RlZmluZSBMNUNNX1RTVE9STV9DT05OX0JVRkZFUl9ERUxBWUVEX0FDS19FTkFCTEUgKDB4MTw8MCkKQEAgLTQ0OTMsNiArNTE4Miw3MiBAQAogCXN0cnVjdCBsNWNtX3RzdG9ybV9jb25uX2J1ZmZlciB0c3Rvcm1fY29ubl9idWZmZXI7CiB9OwogCisKKworLyoKKyAqIFRoZSBsNWNtIG9wYXF1ZSBidWZmZXIgcGFzc2VkIGluIGFkZCBuZXcgY29ubmVjdGlvbiByYW1yb2QgcGFzc2l2ZSBzaWRlCisgKi8KK3N0cnVjdCBsNWNtX2hhc2hfaW5wdXRfc3RyaW5nIHsKKwl1MzIgX19vcGFxdWUxOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiBfX29wYXF1ZTM7CisJdTE2IF9fb3BhcXVlMjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXUxNiBfX29wYXF1ZTI7CisJdTE2IF9fb3BhcXVlMzsKKyNlbmRpZgorCXN0cnVjdCBpcF92Nl9hZGRyIF9fb3BhcXVlNDsKKwlzdHJ1Y3QgaXBfdjZfYWRkciBfX29wYXF1ZTU7CisJdTMyIF9fb3BhcXVlNjsKKwl1MzIgX19vcGFxdWU3WzVdOworfTsKKworCisvKgorICogc3luIGNvb2tpZSBjb21wb25lbnQKKyAqLworc3RydWN0IGw1Y21fc3luX2Nvb2tpZV9jb21wIHsKKwl1MzIgX19vcGFxdWU7Cit9OworCisvKgorICogZGF0YSByZWxhdGVkIHRvIGxpc3RlbmVycyBvZiBhIFRDUCBwb3J0CisgKi8KK3N0cnVjdCBsNWNtX3BvcnRfbGlzdGVuZXJfZGF0YSB7CisJdTggcGFyYW1zOworI2RlZmluZSBMNUNNX1BPUlRfTElTVEVORVJfREFUQV9FTkFCTEUgKDB4MTw8MCkKKyNkZWZpbmUgTDVDTV9QT1JUX0xJU1RFTkVSX0RBVEFfRU5BQkxFX1NISUZUIDAKKyNkZWZpbmUgTDVDTV9QT1JUX0xJU1RFTkVSX0RBVEFfSVBfSU5ERVggKDB4Rjw8MSkKKyNkZWZpbmUgTDVDTV9QT1JUX0xJU1RFTkVSX0RBVEFfSVBfSU5ERVhfU0hJRlQgMQorI2RlZmluZSBMNUNNX1BPUlRfTElTVEVORVJfREFUQV9ORVRfRklMVEVSICgweDE8PDUpCisjZGVmaW5lIEw1Q01fUE9SVF9MSVNURU5FUl9EQVRBX05FVF9GSUxURVJfU0hJRlQgNQorI2RlZmluZSBMNUNNX1BPUlRfTElTVEVORVJfREFUQV9ERUZGRVJFRF9NT0RFICgweDE8PDYpCisjZGVmaW5lIEw1Q01fUE9SVF9MSVNURU5FUl9EQVRBX0RFRkZFUkVEX01PREVfU0hJRlQgNgorI2RlZmluZSBMNUNNX1BPUlRfTElTVEVORVJfREFUQV9NUEFfTU9ERSAoMHgxPDw3KQorI2RlZmluZSBMNUNNX1BPUlRfTElTVEVORVJfREFUQV9NUEFfTU9ERV9TSElGVCA3Cit9OworCisvKgorICogT3BhcXVlIHN0cnVjdHVyZSBwYXNzZWQgZnJvbSBVIHRvIFggd2hlbiBmaW5hbCBhY2sgYXJyaXZlcworICovCitzdHJ1Y3QgbDVjbV9vcGFxdWVfYnVmIHsKKwl1MzIgX19vcGFxdWUxOworCXUzMiBfX29wYXF1ZTI7CisJdTMyIF9fb3BhcXVlMzsKKwl1MzIgX19vcGFxdWU0OworCXN0cnVjdCBsNWNtX3N5bl9jb29raWVfY29tcCBfX29wYXF1ZTU7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IHJzcnYyOworCXU4IHJzcnY7CisJc3RydWN0IGw1Y21fcG9ydF9saXN0ZW5lcl9kYXRhIF9fb3BhcXVlNjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXN0cnVjdCBsNWNtX3BvcnRfbGlzdGVuZXJfZGF0YSBfX29wYXF1ZTY7CisJdTggcnNydjsKKwl1MTYgcnNydjI7CisjZW5kaWYKK307CisKKwogLyoKICAqIGw1Y20gc2xvdyBwYXRoIGVsZW1lbnQKICAqLwpAQCAtNDUwMSw2ICs1MjU2LDEwOSBAQAogCXUzMiByc3J2OwogfTsKIAorCisvKgorICogVGhlIGZpbmFsLWFjayB1bmlvbiBzdHJ1Y3R1cmUgaW4gUENTIGVudHJ5IGFmdGVyIGZpbmFsIGFjayBhcnJpdmVkCisgKi8KK3N0cnVjdCBsNWNtX3Bjc2VfYWNrIHsKKwlzdHJ1Y3QgbDVjbV94c3Rvcm1fY29ubl9idWZmZXIgdHhfc29ja2V0X3BhcmFtczsKKwlzdHJ1Y3QgbDVjbV9vcGFxdWVfYnVmIG9wYXF1ZV9idWY7CisJc3RydWN0IGw1Y21fdHN0b3JtX2Nvbm5fYnVmZmVyIHJ4X3NvY2tldF9wYXJhbXM7Cit9OworCisKKy8qCisgKiBUaGUgc3luIHVuaW9uIHN0cnVjdHVyZSBpbiBQQ1MgZW50cnkgYWZ0ZXIgc3luIGFycml2ZWQKKyAqLworc3RydWN0IGw1Y21fcGNzZV9zeW4geworCXN0cnVjdCBsNWNtX29wYXF1ZV9idWYgb3BhcXVlX2J1ZjsKKwl1MzIgcnNydlsxMl07Cit9OworCisKKy8qCisgKiBwY3MgZW50cnkgZGF0YSBmb3IgcGFzc2l2ZSBjb25uZWN0aW9ucworICovCitzdHJ1Y3QgbDVjbV9wY3NfYXR0cmlidXRlcyB7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IHBjc19pZDsKKwl1OCBzdGF0dXM7CisJdTggZmxhZ3M7CisjZGVmaW5lIEw1Q01fUENTX0FUVFJJQlVURVNfTkVUX0ZJTFRFUiAoMHgxPDwwKQorI2RlZmluZSBMNUNNX1BDU19BVFRSSUJVVEVTX05FVF9GSUxURVJfU0hJRlQgMAorI2RlZmluZSBMNUNNX1BDU19BVFRSSUJVVEVTX0NBTENVTEFURV9IQVNIICgweDE8PDEpCisjZGVmaW5lIEw1Q01fUENTX0FUVFJJQlVURVNfQ0FMQ1VMQVRFX0hBU0hfU0hJRlQgMQorI2RlZmluZSBMNUNNX1BDU19BVFRSSUJVVEVTX0NPTVBBUkVfSEFTSF9SRVNVTFQgKDB4MTw8MikKKyNkZWZpbmUgTDVDTV9QQ1NfQVRUUklCVVRFU19DT01QQVJFX0hBU0hfUkVTVUxUX1NISUZUIDIKKyNkZWZpbmUgTDVDTV9QQ1NfQVRUUklCVVRFU19RVUVSWV9VTFBfQUNDRVBUICgweDE8PDMpCisjZGVmaW5lIEw1Q01fUENTX0FUVFJJQlVURVNfUVVFUllfVUxQX0FDQ0VQVF9TSElGVCAzCisjZGVmaW5lIEw1Q01fUENTX0FUVFJJQlVURVNfRklORF9ERVNUX01BQyAoMHgxPDw0KQorI2RlZmluZSBMNUNNX1BDU19BVFRSSUJVVEVTX0ZJTkRfREVTVF9NQUNfU0hJRlQgNAorI2RlZmluZSBMNUNNX1BDU19BVFRSSUJVVEVTX0w0X09GRkxPQUQgKDB4MTw8NSkKKyNkZWZpbmUgTDVDTV9QQ1NfQVRUUklCVVRFU19MNF9PRkZMT0FEX1NISUZUIDUKKyNkZWZpbmUgTDVDTV9QQ1NfQVRUUklCVVRFU19GT1JXQVJEX1BBQ0tFVCAoMHgxPDw2KQorI2RlZmluZSBMNUNNX1BDU19BVFRSSUJVVEVTX0ZPUldBUkRfUEFDS0VUX1NISUZUIDYKKyNkZWZpbmUgTDVDTV9QQ1NfQVRUUklCVVRFU19SU1JWICgweDE8PDcpCisjZGVmaW5lIEw1Q01fUENTX0FUVFJJQlVURVNfUlNSVl9TSElGVCA3CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1OCBmbGFnczsKKyNkZWZpbmUgTDVDTV9QQ1NfQVRUUklCVVRFU19ORVRfRklMVEVSICgweDE8PDApCisjZGVmaW5lIEw1Q01fUENTX0FUVFJJQlVURVNfTkVUX0ZJTFRFUl9TSElGVCAwCisjZGVmaW5lIEw1Q01fUENTX0FUVFJJQlVURVNfQ0FMQ1VMQVRFX0hBU0ggKDB4MTw8MSkKKyNkZWZpbmUgTDVDTV9QQ1NfQVRUUklCVVRFU19DQUxDVUxBVEVfSEFTSF9TSElGVCAxCisjZGVmaW5lIEw1Q01fUENTX0FUVFJJQlVURVNfQ09NUEFSRV9IQVNIX1JFU1VMVCAoMHgxPDwyKQorI2RlZmluZSBMNUNNX1BDU19BVFRSSUJVVEVTX0NPTVBBUkVfSEFTSF9SRVNVTFRfU0hJRlQgMgorI2RlZmluZSBMNUNNX1BDU19BVFRSSUJVVEVTX1FVRVJZX1VMUF9BQ0NFUFQgKDB4MTw8MykKKyNkZWZpbmUgTDVDTV9QQ1NfQVRUUklCVVRFU19RVUVSWV9VTFBfQUNDRVBUX1NISUZUIDMKKyNkZWZpbmUgTDVDTV9QQ1NfQVRUUklCVVRFU19GSU5EX0RFU1RfTUFDICgweDE8PDQpCisjZGVmaW5lIEw1Q01fUENTX0FUVFJJQlVURVNfRklORF9ERVNUX01BQ19TSElGVCA0CisjZGVmaW5lIEw1Q01fUENTX0FUVFJJQlVURVNfTDRfT0ZGTE9BRCAoMHgxPDw1KQorI2RlZmluZSBMNUNNX1BDU19BVFRSSUJVVEVTX0w0X09GRkxPQURfU0hJRlQgNQorI2RlZmluZSBMNUNNX1BDU19BVFRSSUJVVEVTX0ZPUldBUkRfUEFDS0VUICgweDE8PDYpCisjZGVmaW5lIEw1Q01fUENTX0FUVFJJQlVURVNfRk9SV0FSRF9QQUNLRVRfU0hJRlQgNgorI2RlZmluZSBMNUNNX1BDU19BVFRSSUJVVEVTX1JTUlYgKDB4MTw8NykKKyNkZWZpbmUgTDVDTV9QQ1NfQVRUUklCVVRFU19SU1JWX1NISUZUIDcKKwl1OCBzdGF0dXM7CisJdTE2IHBjc19pZDsKKyNlbmRpZgorfTsKKworCit1bmlvbiBsNWNtX3NlZ19wYXJhbXMgeworCXN0cnVjdCBsNWNtX3Bjc2Vfc3luIHN5bl9zZWdfcGFyYW1zOworCXN0cnVjdCBsNWNtX3Bjc2VfYWNrIGFja19zZWdfcGFyYW1zOworfTsKKworLyoKKyAqIHBjcyBlbnRyeSBkYXRhIGZvciBwYXNzaXZlIGNvbm5lY3Rpb25zCisgKi8KK3N0cnVjdCBsNWNtX3Bjc19oZHIgeworCXN0cnVjdCBsNWNtX2hhc2hfaW5wdXRfc3RyaW5nIGhhc2hfaW5wdXRfc3RyaW5nOworCXN0cnVjdCBsNWNtX2Nvbm5fYWRkcl9wYXJhbXMgY29ubl9hZGRyX2J1ZjsKKwl1MzIgY2lkOworCXUzMiBoYXNoX3Jlc3VsdDsKKwl1bmlvbiBsNWNtX3NlZ19wYXJhbXMgc2VnX3BhcmFtczsKKwlzdHJ1Y3QgbDVjbV9wY3NfYXR0cmlidXRlcyBhdHQ7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2IHJzcnY7CisJdTE2IHJ4X3NlZ19zaXplOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJdTE2IHJ4X3NlZ19zaXplOworCXUxNiByc3J2OworI2VuZGlmCit9OworCisvKgorICogcGNzIGVudHJ5IGZvciBwYXNzaXZlIGNvbm5lY3Rpb25zCisgKi8KK3N0cnVjdCBsNWNtX3Bjc19lbnRyeSB7CisJc3RydWN0IGw1Y21fcGNzX2hkciBoZHI7CisJdTggcnhfc2VnbWVudFsxNTE2XTsKK307CisKKworCisKIC8qCiAgKiBsNWNtIGNvbm5lY3Rpb24gcGFyYW1ldGVycwogICovCkBAIC00NTM1LDYgKzUzOTMsMjkgQEAKIAl1bmlvbiBsNWNtX3NwZWNpZmljX2RhdGEgZGF0YTsKIH07CiAKKworCisKKy8qCisgKiBUZXJtaW5hdGlvbiB2YXJpYWJsZXMKKyAqLworc3RydWN0IGw1Y21fdGVybV92YXJzIHsKKwl1OCBCaXRNYXA7CisjZGVmaW5lIEw1Q01fVEVSTV9WQVJTX1RDUF9TVEFURSAoMHhGPDwwKQorI2RlZmluZSBMNUNNX1RFUk1fVkFSU19UQ1BfU1RBVEVfU0hJRlQgMAorI2RlZmluZSBMNUNNX1RFUk1fVkFSU19GSU5fUkVDRUlWRURfU0JJVCAoMHgxPDw0KQorI2RlZmluZSBMNUNNX1RFUk1fVkFSU19GSU5fUkVDRUlWRURfU0JJVF9TSElGVCA0CisjZGVmaW5lIEw1Q01fVEVSTV9WQVJTX0FDS19PTl9GSU5fUkVDRUlWRURfU0JJVCAoMHgxPDw1KQorI2RlZmluZSBMNUNNX1RFUk1fVkFSU19BQ0tfT05fRklOX1JFQ0VJVkVEX1NCSVRfU0hJRlQgNQorI2RlZmluZSBMNUNNX1RFUk1fVkFSU19URVJNX09OX0NISVAgKDB4MTw8NikKKyNkZWZpbmUgTDVDTV9URVJNX1ZBUlNfVEVSTV9PTl9DSElQX1NISUZUIDYKKyNkZWZpbmUgTDVDTV9URVJNX1ZBUlNfUlNSViAoMHgxPDw3KQorI2RlZmluZSBMNUNNX1RFUk1fVkFSU19SU1JWX1NISUZUIDcKK307CisKKworCisKIC8qCiAgKiBUc3Rvcm0gVGNwIGZsYWdzCiAgKi8KQEAgLTQ1NTAsNiArNTQzMSw3IEBACiAjZGVmaW5lIFRTVE9STV9MNUNNX1RDUF9GTEFHU19SU1JWMV9TSElGVCAxNAogfTsKIAorCiAvKgogICogWHN0b3JtIFRjcCBmbGFncwogICovCkBAIC00NTY1LDQgKzU0NDcsMzggQEAKICNkZWZpbmUgWFNUT1JNX0w1Q01fVENQX0ZMQUdTX1JTUlZfU0hJRlQgMwogfTsKIAotI2VuZGlmIC8qIENOSUNfREVGU19IICovCisKKworLyoKKyAqIE91dC1vZi1vcmRlciBzdGF0ZXMKKyAqLworZW51bSB0Y3Bfb29vX2V2ZW50IHsKKwlUQ1BfRVZFTlRfQUREX1BFTiA9IDAsCisJVENQX0VWRU5UX0FERF9ORVdfSVNMRSA9IDEsCisJVENQX0VWRU5UX0FERF9JU0xFX1JJR0hUID0gMiwKKwlUQ1BfRVZFTlRfQUREX0lTTEVfTEVGVCA9IDMsCisJVENQX0VWRU5UX0pPSU4gPSA0LAorCVRDUF9FVkVOVF9OT1AgPSA1LAorCU1BWF9UQ1BfT09PX0VWRU5UCit9OworCisKKy8qCisgKiBPT08gc3VwcG9ydCBtb2RlcworICovCitlbnVtIHRjcF90c3Rvcm1fb29vIHsKKwlUQ1BfVFNUT1JNX09PT19EUk9QX0FORF9QUk9DX0FDSyA9IDAsCisJVENQX1RTVE9STV9PT09fU0VORF9QVVJFX0FDSyA9IDEsCisJVENQX1RTVE9STV9PT09fU1VQUE9SVEVEID0gMiwKKwlNQVhfVENQX1RTVE9STV9PT08KK307CisKKworCisKKworCisKKworCisjZW5kaWYgLyogX181NzEwX0hTSV9DTklDX0xFX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NuaWNfaWYuaCBiL2RyaXZlcnMvbmV0L2NuaWNfaWYuaAppbmRleCBmZGQ4ZTQ2Li43OTQ0M2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jbmljX2lmLmgKKysrIGIvZHJpdmVycy9uZXQvY25pY19pZi5oCkBAIC0xMiw4ICsxMiw4IEBACiAjaWZuZGVmIENOSUNfSUZfSAogI2RlZmluZSBDTklDX0lGX0gKIAotI2RlZmluZSBDTklDX01PRFVMRV9WRVJTSU9OCSIyLjIuMTQiCi0jZGVmaW5lIENOSUNfTU9EVUxFX1JFTERBVEUJIk1hciAzMCwgMjAxMSIKKyNkZWZpbmUgQ05JQ19NT0RVTEVfVkVSU0lPTgkiMi41LjciCisjZGVmaW5lIENOSUNfTU9EVUxFX1JFTERBVEUJIkp1bHkgMjAsIDIwMTEiCiAKICNkZWZpbmUgQ05JQ19VTFBfUkRNQQkJMAogI2RlZmluZSBDTklDX1VMUF9JU0NTSQkJMQpAQCAtOTksNiArOTksOCBAQAogCiBzdHJ1Y3QgY25pY19jdGxfY29tcGxldGlvbiB7CiAJdTMyCWNpZDsKKwl1OAlvcGNvZGU7CisJdTgJZXJyb3I7CiB9OwogCiBzdHJ1Y3QgY25pY19jdGxfaW5mbyB7CkBAIC0xNjksNyArMTcxLDcgQEAKIAlzdHJ1Y3QgcGNpX2RldgkqcGRldjsKIAl2b2lkIF9faW9tZW0JKmlvX2Jhc2U7CiAJdm9pZCBfX2lvbWVtCSppb19iYXNlMjsKLQl2b2lkCQkqaXJvX2FycjsKKwljb25zdCB2b2lkCSppcm9fYXJyOwogCiAJdTMyCQljdHhfdGJsX29mZnNldDsKIAl1MzIJCWN0eF90YmxfbGVuOwpAQCAtMTc5LDYgKzE4MSwxMSBAQAogCXUzMgkJbWF4X2Zjb2VfY29ubjsKIAl1MzIJCW1heF9yZG1hX2Nvbm47CiAJdTMyCQlmY29lX2luaXRfY2lkOworCXUzMgkJZmNvZV93d25fcG9ydF9uYW1lX2hpOworCXUzMgkJZmNvZV93d25fcG9ydF9uYW1lX2xvOworCXUzMgkJZmNvZV93d25fbm9kZV9uYW1lX2hpOworCXUzMgkJZmNvZV93d25fbm9kZV9uYW1lX2xvOworCiAJdTE2CQlpc2NzaV9sMl9jbGllbnRfaWQ7CiAJdTE2CQlpc2NzaV9sMl9jaWQ7CiAJdTgJCWlzY3NpX21hY1tFVEhfQUxFTl07CkBAIC0zMTEsNyArMzE4LDcgQEAKIAl2b2lkICgqY25pY19zdG9wKSh2b2lkICp1bHBfY3R4KTsKIAl2b2lkICgqaW5kaWNhdGVfa2NxZXMpKHZvaWQgKnVscF9jdHgsIHN0cnVjdCBrY3FlICpjcWVzW10sCiAJCQkJdTMyIG51bV9jcWVzKTsKLQl2b2lkICgqaW5kaWNhdGVfbmV0ZXZlbnQpKHZvaWQgKnVscF9jdHgsIHVuc2lnbmVkIGxvbmcgZXZlbnQpOworCXZvaWQgKCppbmRpY2F0ZV9uZXRldmVudCkodm9pZCAqdWxwX2N0eCwgdW5zaWduZWQgbG9uZyBldmVudCwgdTE2IHZpZCk7CiAJdm9pZCAoKmNtX2Nvbm5lY3RfY29tcGxldGUpKHN0cnVjdCBjbmljX3NvY2sgKik7CiAJdm9pZCAoKmNtX2Nsb3NlX2NvbXBsZXRlKShzdHJ1Y3QgY25pY19zb2NrICopOwogCXZvaWQgKCpjbV9hYm9ydF9jb21wbGV0ZSkoc3RydWN0IGNuaWNfc29jayAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NwbWFjLmMgYi9kcml2ZXJzL25ldC9jcG1hYy5jCmluZGV4IGZlYzkzOWYuLjA4NmNlMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NwbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvY3BtYWMuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvYWRhcHRlci5oIGIvZHJpdmVycy9uZXQvY3hnYjMvYWRhcHRlci5oCmluZGV4IDczMDBkZTUuLjhiMzk1YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL2FkYXB0ZXIuaAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9hZGFwdGVyLmgKQEAgLTQ1LDcgKzQ1LDYgQEAKICNpbmNsdWRlICJ0M2NkZXYuaCIKICNpbmNsdWRlIDxhc20vaW8uaD4KIAotc3RydWN0IHZsYW5fZ3JvdXA7CiBzdHJ1Y3QgYWRhcHRlcjsKIHN0cnVjdCBzZ2VfcXNldDsKIHN0cnVjdCBwb3J0X2luZm87CkBAIC02Niw3ICs2NSw2IEBACiAKIHN0cnVjdCBwb3J0X2luZm8gewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyOwotCXN0cnVjdCB2bGFuX2dyb3VwICp2bGFuX2dycDsKIAlzdHJ1Y3Qgc2dlX3FzZXQgKnFzOwogCXU4IHBvcnRfaWQ7CiAJdTggbnFzZXRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvY29tbW9uLmggYi9kcml2ZXJzL25ldC9jeGdiMy9jb21tb24uaAppbmRleCAwNTZlZThjLi5kZjAxYjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9jb21tb24uaApAQCAtMzY3LDcgKzM2Nyw2IEBACiAKIHN0cnVjdCBwY2lfcGFyYW1zIHsKIAl1bnNpZ25lZCBpbnQgdnBkX2NhcF9hZGRyOwotCXVuc2lnbmVkIGludCBwY2llX2NhcF9hZGRyOwogCXVuc2lnbmVkIHNob3J0IHNwZWVkOwogCXVuc2lnbmVkIGNoYXIgd2lkdGg7CiAJdW5zaWduZWQgY2hhciB2YXJpYW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfbWFpbi5jIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfbWFpbi5jCmluZGV4IDkwODFjZTAuLjkzYjQxYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMKQEAgLTI1MzIsMjUgKzI1MzIsNTEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3N0YXRpYyB2b2lkIGN4Z2Jfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwaS0+YWRhcHRlcjsKIAotCXBpLT52bGFuX2dycCA9IGdycDsKLQlpZiAoYWRhcHRlci0+cGFyYW1zLnJldiA+IDApCi0JCXQzX3NldF92bGFuX2FjY2VsKGFkYXB0ZXIsIDEgPDwgcGktPnBvcnRfaWQsIGdycCAhPSBOVUxMKTsKLQllbHNlIHsKKwlpZiAoYWRhcHRlci0+cGFyYW1zLnJldiA+IDApIHsKKwkJdDNfc2V0X3ZsYW5fYWNjZWwoYWRhcHRlciwgMSA8PCBwaS0+cG9ydF9pZCwKKwkJCQkgIGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKTsKKwl9IGVsc2UgewogCQkvKiBzaW5nbGUgY29udHJvbCBmb3IgYWxsIHBvcnRzICovCi0JCXVuc2lnbmVkIGludCBpLCBoYXZlX3ZsYW5zID0gMDsKKwkJdW5zaWduZWQgaW50IGksIGhhdmVfdmxhbnMgPSBmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWDsKKwogCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCi0JCSAgICBoYXZlX3ZsYW5zIHw9IGFkYXAycGluZm8oYWRhcHRlciwgaSktPnZsYW5fZ3JwICE9IE5VTEw7CisJCQloYXZlX3ZsYW5zIHw9CisJCQkJYWRhcHRlci0+cG9ydFtpXS0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlg7CiAKIAkJdDNfc2V0X3ZsYW5fYWNjZWwoYWRhcHRlciwgMSwgaGF2ZV92bGFucyk7CiAJfQogCXQzX3N5bmNocm9uaXplX3J4KGFkYXB0ZXIsIHBpKTsKIH0KIAorc3RhdGljIHUzMiBjeGdiX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCit7CisJLyoKKwkgKiBTaW5jZSB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBzZXBhcmF0ZSByeC90eCB2bGFuIGFjY2VsCisJICogZW5hYmxlL2Rpc2FibGUgbWFrZSBzdXJlIHR4IGZsYWcgaXMgYWx3YXlzIGluIHNhbWUgc3RhdGUgYXMgcnguCisJICovCisJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQlmZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFg7CisJZWxzZQorCQlmZWF0dXJlcyAmPSB+TkVUSUZfRl9IV19WTEFOX1RYOworCisJcmV0dXJuIGZlYXR1cmVzOworfQorCitzdGF0aWMgaW50IGN4Z2Jfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3sKKwl1MzIgY2hhbmdlZCA9IGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKKworCWlmIChjaGFuZ2VkICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQljeGdiX3ZsYW5fbW9kZShkZXYsIGZlYXR1cmVzKTsKKworCXJldHVybiAwOworfQorCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIGN4Z2JfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMzEzMSw3ICszMTU3LDggQEAKIAkubmRvX2RvX2lvY3RsCQk9IGN4Z2JfaW9jdGwsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGN4Z2JfY2hhbmdlX210dSwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGN4Z2Jfc2V0X21hY19hZGRyLAotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IHZsYW5fcnhfcmVnaXN0ZXIsCisJLm5kb19maXhfZmVhdHVyZXMJPSBjeGdiX2ZpeF9mZWF0dXJlcywKKwkubmRvX3NldF9mZWF0dXJlcwk9IGN4Z2Jfc2V0X2ZlYXR1cmVzLAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBjeGdiX25ldHBvbGwsCiAjZW5kaWYKQEAgLTMyNjMsOSArMzI5MCw4IEBACiAJCW5ldGRldi0+bWVtX3N0YXJ0ID0gbW1pb19zdGFydDsKIAkJbmV0ZGV2LT5tZW1fZW5kID0gbW1pb19zdGFydCArIG1taW9fbGVuIC0gMTsKIAkJbmV0ZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU0gfAotCQkJTkVUSUZfRl9UU08gfCBORVRJRl9GX1JYQ1NVTTsKLQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBuZXRkZXYtPmh3X2ZlYXR1cmVzIHwKLQkJCU5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKKwkJCU5FVElGX0ZfVFNPIHwgTkVUSUZfRl9SWENTVU0gfCBORVRJRl9GX0hXX1ZMQU5fUlg7CisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gbmV0ZGV2LT5od19mZWF0dXJlcyB8IE5FVElGX0ZfSFdfVkxBTl9UWDsKIAkJaWYgKHBjaV91c2luZ19kYWMpCiAJCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKIApAQCAtMzMyOSw2ICszMzU1LDkgQEAKIAllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmFkYXB0ZXItPnBvcnRbMF0tPmRldi5rb2JqLAogCQkJCSAmY3hnYjNfYXR0cl9ncm91cCk7CiAKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCisJCWN4Z2Jfdmxhbl9tb2RlKGFkYXB0ZXItPnBvcnRbaV0sIGFkYXB0ZXItPnBvcnRbaV0tPmZlYXR1cmVzKTsKKwogCXByaW50X3BvcnRfaW5mbyhhZGFwdGVyLCBhaSk7CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYwppbmRleCA4NjI4MDRmLi4zMjYzNmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5jCkBAIC0xNzYsMTYgKzE3NiwxMyBAQAogCWludCBpOwogCiAJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7Ci0JCXN0cnVjdCB2bGFuX2dyb3VwICpncnA7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhZGFwdGVyLT5wb3J0W2ldOwotCQljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCQlpZiAoIW1lbWNtcChkZXYtPmRldl9hZGRyLCBtYWMsIEVUSF9BTEVOKSkgewogCQkJaWYgKHZsYW4gJiYgdmxhbiAhPSBWTEFOX1ZJRF9NQVNLKSB7Ci0JCQkJZ3JwID0gcC0+dmxhbl9ncnA7Ci0JCQkJZGV2ID0gTlVMTDsKLQkJCQlpZiAoZ3JwKQotCQkJCQlkZXYgPSB2bGFuX2dyb3VwX2dldF9kZXZpY2UoZ3JwLCB2bGFuKTsKKwkJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQkJZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXAoZGV2LCB2bGFuKTsKKwkJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCX0gZWxzZSBpZiAobmV0aWZfaXNfYm9uZF9zbGF2ZShkZXYpKSB7CiAJCQkJd2hpbGUgKGRldi0+bWFzdGVyKQogCQkJCQlkZXYgPSBkZXYtPm1hc3RlcjsKQEAgLTU2Nyw3ICs1NjQsNyBAQAogCXdoaWxlICh0ZC0+dGlkX3JlbGVhc2VfbGlzdCkgewogCQlzdHJ1Y3QgdDNjX3RpZF9lbnRyeSAqcCA9IHRkLT50aWRfcmVsZWFzZV9saXN0OwogCi0JCXRkLT50aWRfcmVsZWFzZV9saXN0ID0gKHN0cnVjdCB0M2NfdGlkX2VudHJ5ICopcC0+Y3R4OworCQl0ZC0+dGlkX3JlbGVhc2VfbGlzdCA9IHAtPmN0eDsKIAkJc3Bpbl91bmxvY2tfYmgoJnRkLT50aWRfcmVsZWFzZV9sb2NrKTsKIAogCQlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBjcGxfdGlkX3JlbGVhc2UpLApAQCAtOTcxLDcgKzk2OCw3IEBACiAJY2FzZSAoTkVURVZFTlRfUkVESVJFQ1QpOnsKIAkJc3RydWN0IG5ldGV2ZW50X3JlZGlyZWN0ICpuciA9IGN0eDsKIAkJY3hnYl9yZWRpcmVjdChuci0+b2xkLCBuci0+bmV3KTsKLQkJY3hnYl9uZWlnaF91cGRhdGUobnItPm5ldy0+bmVpZ2hib3VyKTsKKwkJY3hnYl9uZWlnaF91cGRhdGUoZHN0X2dldF9uZWlnaGJvdXIobnItPm5ldykpOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDoKQEAgLTExMTYsOCArMTExMyw4IEBACiAJc3RydWN0IGwydF9lbnRyeSAqZTsKIAlzdHJ1Y3QgdDNjX3RpZF9lbnRyeSAqdGU7CiAKLQlvbGRkZXYgPSBvbGQtPm5laWdoYm91ci0+ZGV2OwotCW5ld2RldiA9IG5ldy0+bmVpZ2hib3VyLT5kZXY7CisJb2xkZGV2ID0gZHN0X2dldF9uZWlnaGJvdXIob2xkKS0+ZGV2OworCW5ld2RldiA9IGRzdF9nZXRfbmVpZ2hib3VyKG5ldyktPmRldjsKIAlpZiAoIWlzX29mZmxvYWRpbmcob2xkZGV2KSkKIAkJcmV0dXJuOwogCWlmICghaXNfb2ZmbG9hZGluZyhuZXdkZXYpKSB7CkBAIC0xMTM0LDcgKzExMzEsNyBAQAogCX0KIAogCS8qIEFkZCBuZXcgTDJUIGVudHJ5ICovCi0JZSA9IHQzX2wydF9nZXQodGRldiwgbmV3LT5uZWlnaGJvdXIsIG5ld2Rldik7CisJZSA9IHQzX2wydF9nZXQodGRldiwgZHN0X2dldF9uZWlnaGJvdXIobmV3KSwgbmV3ZGV2KTsKIAlpZiAoIWUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3QgYWxsb2NhdGUgbmV3IGwydCBlbnRyeSFcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCmluZGV4IDNmNTYyYmEuLmQ2ZmExNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCkBAIC0yMDI2LDMwICsyMDI2LDEzIEBACiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfSBlbHNlCiAJCXNrYl9jaGVja3N1bV9ub25lX2Fzc2VydChza2IpOwotCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCBxcyAtICZhZGFwLT5zZ2UucXNbMF0pOworCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCBxcyAtICZhZGFwLT5zZ2UucXNbcGktPmZpcnN0X3FzZXRdKTsKIAotCWlmICh1bmxpa2VseShwLT52bGFuX3ZhbGlkKSkgewotCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwID0gcGktPnZsYW5fZ3JwOwotCisJaWYgKHAtPnZsYW5fdmFsaWQpIHsKIAkJcXMtPnBvcnRfc3RhdHNbU0dFX1BTVEFUX1ZMQU5FWF0rKzsKLQkJaWYgKGxpa2VseShncnApKQotCQkJaWYgKGxybykKLQkJCQl2bGFuX2dyb19yZWNlaXZlKCZxcy0+bmFwaSwgZ3JwLAotCQkJCQkJIG50b2hzKHAtPnZsYW4pLCBza2IpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKHVubGlrZWx5KHBpLT5pc2NzaWMuZmxhZ3MpKSB7Ci0JCQkJCXVuc2lnbmVkIHNob3J0IHZ0YWcgPSBudG9ocyhwLT52bGFuKSAmCi0JCQkJCQkJCVZMQU5fVklEX01BU0s7Ci0JCQkJCXNrYi0+ZGV2ID0gdmxhbl9ncm91cF9nZXRfZGV2aWNlKGdycCwKLQkJCQkJCQkJCSB2dGFnKTsKLQkJCQkJY3hnYjNfcHJvY2Vzc19pc2NzaV9wcm92X3BhY2socGksIHNrYik7Ci0JCQkJfQotCQkJCV9fdmxhbl9od2FjY2VsX3J4KHNrYiwgZ3JwLCBudG9ocyhwLT52bGFuKSwKLQkJCQkJICAJICBycS0+cG9sbGluZyk7Ci0JCQl9Ci0JCWVsc2UKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JfSBlbHNlIGlmIChycS0+cG9sbGluZykgeworCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgbnRvaHMocC0+dmxhbikpOworCX0KKwlpZiAocnEtPnBvbGxpbmcpIHsKIAkJaWYgKGxybykKIAkJCW5hcGlfZ3JvX3JlY2VpdmUoJnFzLT5uYXBpLCBza2IpOwogCQllbHNlIHsKQEAgLTIxNDUsMTYgKzIxMjgsMTAgQEAKIAlpZiAoIWNvbXBsZXRlKQogCQlyZXR1cm47CiAKLQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcXMgLSAmYWRhcC0+c2dlLnFzWzBdKTsKKwlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcXMgLSAmYWRhcC0+c2dlLnFzW3BpLT5maXJzdF9xc2V0XSk7CiAKLQlpZiAodW5saWtlbHkoY3BsLT52bGFuX3ZhbGlkKSkgewotCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwID0gcGktPnZsYW5fZ3JwOwotCi0JCWlmIChsaWtlbHkoZ3JwICE9IE5VTEwpKSB7Ci0JCQl2bGFuX2dyb19mcmFncygmcXMtPm5hcGksIGdycCwgbnRvaHMoY3BsLT52bGFuKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9CisJaWYgKGNwbC0+dmxhbl92YWxpZCkKKwkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIG50b2hzKGNwbC0+dmxhbikpOwogCW5hcGlfZ3JvX2ZyYWdzKCZxcy0+bmFwaSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3QzX2h3LmMgYi9kcml2ZXJzL25ldC9jeGdiMy90M19ody5jCmluZGV4IGM2ODg0MjEuLjQ0YWMyZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL3QzX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvdDNfaHcuYwpAQCAtMzI5MCwyMiArMzI5MCwyMCBAQAogCXVuc2lnbmVkIGludCBmc3RfdHJuX3J4LCBmc3RfdHJuX3R4LCBhY2tsYXQsIHJwbGxtdDsKIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFkYXAtPnBkZXYsCi0JCQkgICAgIGFkYXAtPnBhcmFtcy5wY2kucGNpZV9jYXBfYWRkciArIFBDSV9FWFBfREVWQ1RMLAorCQkJICAgICBhZGFwLT5wZGV2LT5wY2llX2NhcCArIFBDSV9FWFBfREVWQ1RMLAogCQkJICAgICAmdmFsKTsKIAlwbGRzaXplID0gKHZhbCAmIFBDSV9FWFBfREVWQ1RMX1BBWUxPQUQpID4+IDU7CiAKIAlwY2lfcmVhZF9jb25maWdfd29yZChhZGFwLT5wZGV2LCAweDIsICZkZXZpZCk7CiAJaWYgKGRldmlkID09IDB4MzcpIHsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFkYXAtPnBkZXYsCi0JCQkJICAgICAgYWRhcC0+cGFyYW1zLnBjaS5wY2llX2NhcF9hZGRyICsKLQkJCQkgICAgICBQQ0lfRVhQX0RFVkNUTCwKKwkJCQkgICAgICBhZGFwLT5wZGV2LT5wY2llX2NhcCArIFBDSV9FWFBfREVWQ1RMLAogCQkJCSAgICAgIHZhbCAmIH5QQ0lfRVhQX0RFVkNUTF9SRUFEUlEgJgogCQkJCSAgICAgIH5QQ0lfRVhQX0RFVkNUTF9QQVlMT0FEKTsKIAkJcGxkc2l6ZSA9IDA7CiAJfQogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoYWRhcC0+cGRldiwKLQkJCSAgICAgYWRhcC0+cGFyYW1zLnBjaS5wY2llX2NhcF9hZGRyICsgUENJX0VYUF9MTktDVEwsCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWRhcC0+cGRldiwgYWRhcC0+cGRldi0+cGNpZV9jYXAgKyBQQ0lfRVhQX0xOS0NUTCwKIAkJCSAgICAgJnZhbCk7CiAKIAlmc3RfdHJuX3R4ID0gR19OVU1GU1RUUk5TRVEodDNfcmVhZF9yZWcoYWRhcCwgQV9QQ0lFX1BFWF9DVFJMMCkpOwpAQCAtMzQyOSwxMiArMzQyNywxMSBAQAogCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzcGVlZF9tYXBbXSA9IHsgMzMsIDY2LCAxMDAsIDEzMyB9OwogCXUzMiBwY2lfbW9kZSwgcGNpZV9jYXA7CiAKLQlwY2llX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkoYWRhcHRlci0+cGRldiwgUENJX0NBUF9JRF9FWFApOworCXBjaWVfY2FwID0gcGNpX3BjaWVfY2FwKGFkYXB0ZXItPnBkZXYpOwogCWlmIChwY2llX2NhcCkgewogCQl1MTYgdmFsOwogCiAJCXAtPnZhcmlhbnQgPSBQQ0lfVkFSSUFOVF9QQ0lFOwotCQlwLT5wY2llX2NhcF9hZGRyID0gcGNpZV9jYXA7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFkYXB0ZXItPnBkZXYsIHBjaWVfY2FwICsgUENJX0VYUF9MTktTVEEsCiAJCQkJCSZ2YWwpOwogCQlwLT53aWR0aCA9ICh2YWwgPj4gNCkgJiAweDNmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjQvY3hnYjQuaCBiL2RyaXZlcnMvbmV0L2N4Z2I0L2N4Z2I0LmgKaW5kZXggYmM5OTgyYS4uMjIzYTdmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjQvY3hnYjQuaAorKysgYi9kcml2ZXJzL25ldC9jeGdiNC9jeGdiNC5oCkBAIC0yNzYsNyArMjc2LDYgQEAKIH07CiAKIHN0cnVjdCBhZGFwdGVyOwotc3RydWN0IHZsYW5fZ3JvdXA7CiBzdHJ1Y3Qgc2dlX3JzcHE7CiAKIHN0cnVjdCBwb3J0X2luZm8gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjQvY3hnYjRfbWFpbi5jIGIvZHJpdmVycy9uZXQvY3hnYjQvY3hnYjRfbWFpbi5jCmluZGV4IDdlM2NmYmUuLmM5OTU3YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2I0L2N4Z2I0X21haW4uYworKysgYi9kcml2ZXJzL25ldC9jeGdiNC9jeGdiNF9tYWluLmMKQEAgLTM3MDQsNyArMzcwNCw3IEBACiAJaWYgKGVycikgewogCQlkZXZfd2FybigmcGRldi0+ZGV2LCAib25seSAlZCBuZXQgZGV2aWNlcyByZWdpc3RlcmVkXG4iLCBpKTsKIAkJZXJyID0gMDsKLQl9OworCX0KIAogCWlmIChjeGdiNF9kZWJ1Z2ZzX3Jvb3QpIHsKIAkJYWRhcHRlci0+ZGVidWdmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKHBjaV9uYW1lKHBkZXYpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjR2Zi9hZGFwdGVyLmggYi9kcml2ZXJzL25ldC9jeGdiNHZmL2FkYXB0ZXIuaAppbmRleCA0ZmQ4MjFhLi41OTQzMzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiNHZmL2FkYXB0ZXIuaAorKysgYi9kcml2ZXJzL25ldC9jeGdiNHZmL2FkYXB0ZXIuaApAQCAtNDAsNiArNDAsNyBAQAogI2lmbmRlZiBfX0NYR0I0VkZfQURBUFRFUl9IX18KICNkZWZpbmUgX19DWEdCNFZGX0FEQVBURVJfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgpAQCAtOTEsNyArOTIsNiBAQAogICovCiBzdHJ1Y3QgcG9ydF9pbmZvIHsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsJLyogb3VyIGFkYXB0ZXIgKi8KLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncnA7CS8qIG91dCBWTEFOIGdyb3VwICovCiAJdTE2IHZpaWQ7CQkJLyogdmlydHVhbCBpbnRlcmZhY2UgSUQgKi8KIAlzMTYgeGFjdF9hZGRyX2ZpbHQ7CQkvKiBpbmRleCBvZiBvdXIgTUFDIGFkZHJlc3MgZmlsdGVyICovCiAJdTE2IHJzc19zaXplOwkJCS8qIHNpemUgb2YgVkkncyBSU1MgdGFibGUgc2xpY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2I0dmYvY3hnYjR2Zl9tYWluLmMgYi9kcml2ZXJzL25ldC9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jCmluZGV4IGU3MWMwOGUuLmVjNzk5MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2I0dmYvY3hnYjR2Zl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjR2Zi9jeGdiNHZmX21haW4uYwpAQCAtMzMsNyArMzMsNiBAQAogICogU09GVFdBUkUuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTIxMCwxOCArMjA5LDggQEAKICAqID09PT09PT09PT09PT09PT09PT09PT0KICAqLwogCi0vKgotICogUmVjb3JkIG91ciBuZXcgVkxBTiBHcm91cCBhbmQgZW5hYmxlL2Rpc2FibGUgaGFyZHdhcmUgVkxBTiBUYWcgZXh0cmFjdGlvbgotICogYmFzZWQgb24gd2hldGhlciB0aGUgc3BlY2lmaWVkIFZMQU4gR3JvdXAgcG9pbnRlciBpcyBOVUxMIG9yIG5vdC4KLSAqLwotc3RhdGljIHZvaWQgY3hnYjR2Zl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQotewotCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXBpLT52bGFuX2dycCA9IGdycDsKLQl0NHZmX3NldF9yeG1vZGUocGktPmFkYXB0ZXIsIHBpLT52aWlkLCAtMSwgLTEsIC0xLCAtMSwgZ3JwICE9IE5VTEwsIDApOwotfQorCiAKIC8qCiAgKiBQZXJmb3JtIHRoZSBNQUMgYW5kIFBIWSBhY3Rpb25zIG5lZWRlZCB0byBlbmFibGUgYSAicG9ydCIgKFZpcnR1YWwKQEAgLTIzNCw5ICsyMjMsOSBAQAogCiAJLyoKIAkgKiBXZSBkbyBub3Qgc2V0IGFkZHJlc3MgZmlsdGVycyBhbmQgcHJvbWlzY3VpdHkgaGVyZSwgdGhlIHN0YWNrIGRvZXMKLQkgKiB0aGF0IHN0ZXAgZXhwbGljaXRseS4KKwkgKiB0aGF0IHN0ZXAgZXhwbGljaXRseS4gRW5hYmxlIHZsYW4gYWNjZWwuCiAJICovCi0JcmV0ID0gdDR2Zl9zZXRfcnhtb2RlKHBpLT5hZGFwdGVyLCBwaS0+dmlpZCwgZGV2LT5tdHUsIC0xLCAtMSwgLTEsIC0xLAorCXJldCA9IHQ0dmZfc2V0X3J4bW9kZShwaS0+YWRhcHRlciwgcGktPnZpaWQsIGRldi0+bXR1LCAtMSwgLTEsIC0xLCAxLAogCQkJICAgICAgdHJ1ZSk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCXJldCA9IHQ0dmZfY2hhbmdlX21hYyhwaS0+YWRhcHRlciwgcGktPnZpaWQsCkBAIC0xMTAzLDYgKzEwOTIsMzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdTMyIGN4Z2I0dmZfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3sKKwkvKgorCSAqIFNpbmNlIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHJ4L3R4IHZsYW4gYWNjZWwKKwkgKiBlbmFibGUvZGlzYWJsZSBtYWtlIHN1cmUgdHggZmxhZyBpcyBhbHdheXMgaW4gc2FtZSBzdGF0ZSBhcyByeC4KKwkgKi8KKwlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpCisJCWZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWDsKKwllbHNlCisJCWZlYXR1cmVzICY9IH5ORVRJRl9GX0hXX1ZMQU5fVFg7CisKKwlyZXR1cm4gZmVhdHVyZXM7Cit9CisKK3N0YXRpYyBpbnQgY3hnYjR2Zl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgY2hhbmdlZCA9IGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKKworCWlmIChjaGFuZ2VkICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQl0NHZmX3NldF9yeG1vZGUocGktPmFkYXB0ZXIsIHBpLT52aWlkLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQlmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9UWCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIENoYW5nZSB0aGUgZGV2aWNlcyBNQUMgYWRkcmVzcy4KICAqLwpAQCAtMjQyMiw3ICsyNDM3LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0jaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjeGdiNHZmX25ldGRldl9vcHMJPSB7CiAJLm5kb19vcGVuCQk9IGN4Z2I0dmZfb3BlbiwKIAkubmRvX3N0b3AJCT0gY3hnYjR2Zl9zdG9wLApAQCAtMjQzMywxMiArMjQ0NywxMiBAQAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fZG9faW9jdGwJCT0gY3hnYjR2Zl9kb19pb2N0bCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gY3hnYjR2Zl9jaGFuZ2VfbXR1LAotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IGN4Z2I0dmZfdmxhbl9yeF9yZWdpc3RlciwKKwkubmRvX2ZpeF9mZWF0dXJlcwk9IGN4Z2I0dmZfZml4X2ZlYXR1cmVzLAorCS5uZG9fc2V0X2ZlYXR1cmVzCT0gY3hnYjR2Zl9zZXRfZmVhdHVyZXMsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlcgk9IGN4Z2I0dmZfcG9sbF9jb250cm9sbGVyLAogI2VuZGlmCiB9OwotI2VuZGlmCiAKIC8qCiAgKiAiUHJvYmUiIGEgZGV2aWNlOiBpbml0aWFsaXplIGEgZGV2aWNlIGFuZCBjb25zdHJ1Y3QgYWxsIGtlcm5lbCBhbmQgZHJpdmVyCkBAIC0yNjAzLDMxICsyNjE3LDE1IEBACiAKIAkJbmV0ZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBUU09fRkxBR1MgfAogCQkJTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0gfAotCQkJTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9SWENTVU07CisJCQlORVRJRl9GX0hXX1ZMQU5fUlggfCBORVRJRl9GX1JYQ1NVTTsKIAkJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8IFRTT19GTEFHUyB8CiAJCQlORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTSB8CiAJCQlORVRJRl9GX0hJR0hETUE7Ci0JCW5ldGRldi0+ZmVhdHVyZXMgPSBuZXRkZXYtPmh3X2ZlYXR1cmVzIHwKLQkJCU5FVElGX0ZfSFdfVkxBTl9SWDsKKwkJbmV0ZGV2LT5mZWF0dXJlcyA9IG5ldGRldi0+aHdfZmVhdHVyZXMgfCBORVRJRl9GX0hXX1ZMQU5fVFg7CiAJCWlmIChwY2lfdXNpbmdfZGFjKQogCQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAKLSNpZmRlZiBIQVZFX05FVF9ERVZJQ0VfT1BTCiAJCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZjeGdiNHZmX25ldGRldl9vcHM7Ci0jZWxzZQotCQluZXRkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBjeGdiNHZmX3ZsYW5fcnhfcmVnaXN0ZXI7Ci0JCW5ldGRldi0+b3BlbiA9IGN4Z2I0dmZfb3BlbjsKLQkJbmV0ZGV2LT5zdG9wID0gY3hnYjR2Zl9zdG9wOwotCQluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHQ0dmZfZXRoX3htaXQ7Ci0JCW5ldGRldi0+Z2V0X3N0YXRzID0gY3hnYjR2Zl9nZXRfc3RhdHM7Ci0JCW5ldGRldi0+c2V0X3J4X21vZGUgPSBjeGdiNHZmX3NldF9yeG1vZGU7Ci0JCW5ldGRldi0+ZG9faW9jdGwgPSBjeGdiNHZmX2RvX2lvY3RsOwotCQluZXRkZXYtPmNoYW5nZV9tdHUgPSBjeGdiNHZmX2NoYW5nZV9tdHU7Ci0JCW5ldGRldi0+c2V0X21hY19hZGRyZXNzID0gY3hnYjR2Zl9zZXRfbWFjX2FkZHI7Ci0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQkJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBjeGdiNHZmX3BvbGxfY29udHJvbGxlcjsKLSNlbmRpZgotI2VuZGlmCiAJCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZjeGdiNHZmX2V0aHRvb2xfb3BzKTsKIAogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjR2Zi9zZ2UuYyBiL2RyaXZlcnMvbmV0L2N4Z2I0dmYvc2dlLmMKaW5kZXggNWZkNzVmZC4uY2ZmYjMyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjR2Zi9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9jeGdiNHZmL3NnZS5jCkBAIC0xNDkxLDIwICsxNDkxLDEwIEBACiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcnhxLT5yc3BxLmlkeCk7CiAKLQlpZiAodW5saWtlbHkocGt0LT52bGFuX2V4KSkgewotCQlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KHJ4cS0+cnNwcS5uZXRkZXYpOwotCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwID0gcGktPnZsYW5fZ3JwOwotCi0JCXJ4cS0+c3RhdHMudmxhbl9leCsrOwotCQlpZiAobGlrZWx5KGdycCkpIHsKLQkJCXJldCA9IHZsYW5fZ3JvX2ZyYWdzKCZyeHEtPnJzcHEubmFwaSwgZ3JwLAotCQkJCQkgICAgIGJlMTZfdG9fY3B1KHBrdC0+dmxhbikpOwotCQkJZ290byBzdGF0czsKLQkJfQotCX0KKwlpZiAocGt0LT52bGFuX2V4KQorCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgYmUxNl90b19jcHUocGt0LT52bGFuKSk7CiAJcmV0ID0gbmFwaV9ncm9fZnJhZ3MoJnJ4cS0+cnNwcS5uYXBpKTsKIAotc3RhdHM6CiAJaWYgKHJldCA9PSBHUk9fSEVMRCkKIAkJcnhxLT5zdGF0cy5scm9fcGt0cysrOwogCWVsc2UgaWYgKHJldCA9PSBHUk9fTUVSR0VEIHx8IHJldCA9PSBHUk9fTUVSR0VEX0ZSRUUpCkBAIC0xNTI1LDcgKzE1MTUsNiBAQAogCQkgICAgICAgY29uc3Qgc3RydWN0IHBrdF9nbCAqZ2wpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKIAljb25zdCBzdHJ1Y3QgY3BsX3J4X3BrdCAqcGt0ID0gKHZvaWQgKikmcnNwWzFdOwogCWJvb2wgY3N1bV9vayA9IHBrdC0+Y3N1bV9jYWxjICYmICFwa3QtPmVycl92ZWM7CiAJc3RydWN0IHNnZV9ldGhfcnhxICpyeHEgPSBjb250YWluZXJfb2YocnNwcSwgc3RydWN0IHNnZV9ldGhfcnhxLCByc3BxKTsKQEAgLTE1NTMsNyArMTU0Miw2IEBACiAJX19za2JfcHVsbChza2IsIFBLVFNISUZUKTsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCByc3BxLT5uZXRkZXYpOwogCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCByc3BxLT5pZHgpOwotCXBpID0gbmV0ZGV2X3ByaXYoc2tiLT5kZXYpOwogCXJ4cS0+c3RhdHMucGt0cysrOwogCiAJaWYgKGNzdW1fb2sgJiYgKHJzcHEtPm5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkgJiYKQEAgLTE1NjksMjAgKzE1NTcsMTIgQEAKIAl9IGVsc2UKIAkJc2tiX2NoZWNrc3VtX25vbmVfYXNzZXJ0KHNrYik7CiAKLQkvKgotCSAqIERlbGl2ZXIgdGhlIHBhY2tldCB0byB0aGUgc3RhY2suCi0JICovCi0JaWYgKHVubGlrZWx5KHBrdC0+dmxhbl9leCkpIHsKLQkJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCA9IHBpLT52bGFuX2dycDsKLQorCWlmIChwa3QtPnZsYW5fZXgpIHsKIAkJcnhxLT5zdGF0cy52bGFuX2V4Kys7Ci0JCWlmIChsaWtlbHkoZ3JwKSkKLQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGdycCwKLQkJCQkJCSBiZTE2X3RvX2NwdShwa3QtPnZsYW4pKTsKLQkJZWxzZQotCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQl9IGVsc2UKLQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIGJlMTZfdG9fY3B1KHBrdC0+dmxhbikpOworCX0KKworCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2I0dmYvdDR2Zl9ody5jIGIvZHJpdmVycy9uZXQvY3hnYjR2Zi90NHZmX2h3LmMKaW5kZXggMTkyZGIyMi4uZmUzZmQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjR2Zi90NHZmX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjR2Zi90NHZmX2h3LmMKQEAgLTMzLDcgKzMzLDYgQEAKICAqIFNPRlRXQVJFLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlICJ0NHZmX2NvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGF2aW5jaV9jcGRtYS5jIGIvZHJpdmVycy9uZXQvZGF2aW5jaV9jcGRtYS5jCmluZGV4IGFlNDdmMjMuLmRjYTlkMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RhdmluY2lfY3BkbWEuYworKysgYi9kcml2ZXJzL25ldC9kYXZpbmNpX2NwZG1hLmMKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCX0gZWxzZSB7CiAJCXBvb2wtPmNwdW1hcCA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsICZwb29sLT5waHlzLAogCQkJCQkJICBHRlBfS0VSTkVMKTsKLQkJcG9vbC0+aW9tYXAgPSAodm9pZCBfX2ZvcmNlIF9faW9tZW0gKilwb29sLT5jcHVtYXA7CisJCXBvb2wtPmlvbWFwID0gcG9vbC0+Y3B1bWFwOwogCQlwb29sLT5od19hZGRyID0gcG9vbC0+cGh5czsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RhdmluY2lfZW1hYy5jIGIvZHJpdmVycy9uZXQvZGF2aW5jaV9lbWFjLmMKaW5kZXggZGNjNGExNy4uM2Y0NTFlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGF2aW5jaV9lbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZGF2aW5jaV9lbWFjLmMKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KQEAgLTEwODMsNiArMTA4Miw4IEBACiAJCWdvdG8gZmFpbF90eDsKIAl9CiAKKwlza2JfdHhfdGltZXN0YW1wKHNrYik7CisKIAlyZXRfY29kZSA9IGNwZG1hX2NoYW5fc3VibWl0KHByaXYtPnR4Y2hhbiwgc2tiLCBza2ItPmRhdGEsIHNrYi0+bGVuLAogCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KHJldF9jb2RlICE9IDApKSB7CkBAIC0xNDg5LDE0ICsxNDkwLDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgZW1hY19kZXZpb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGlmcmVxICppZnJxLCBpbnQgY21kKQogewotCWRldl93YXJuKCZuZGV2LT5kZXYsICJEYVZpbmNpIEVNQUM6IGlvY3RsIG5vdCBzdXBwb3J0ZWRcbiIpOworCXN0cnVjdCBlbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAogCWlmICghKG5ldGlmX3J1bm5pbmcobmRldikpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIFRPRE86IEFkZCBwaHkgcmVhZCBhbmQgd3JpdGUgYW5kIHByaXZhdGUgc3RhdGlzdGljcyBnZXQgZmVhdHVyZSAqLwogCi0JcmV0dXJuIC1FT1BOT1RTVVBQOworCXJldHVybiBwaHlfbWlpX2lvY3RsKHByaXYtPnBoeWRldiwgaWZycSwgY21kKTsKIH0KIAogc3RhdGljIGludCBtYXRjaF9maXJzdF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQpAQCAtMTgyMSw3ICsxODIyLDcgQEAKIAl9CiAKIAlwcml2LT5lbWFjX2Jhc2VfcGh5cyA9IHJlcy0+c3RhcnQgKyBwZGF0YS0+Y3RybF9yZWdfb2Zmc2V0OwotCXNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCXNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgc2l6ZSwgbmRldi0+bmFtZSkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHJlcXVlc3RfbWVtX3JlZ2lvbigpIGZvciByZWdzXG4iKTsKIAkJcmMgPSAtRU5YSU87CkBAIC0xOTI2LDcgKzE5MjcsNyBAQAogCWNwZG1hX2N0bHJfZGVzdHJveShwcml2LT5kbWEpOwogbm9fZG1hOgogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogCWlvdW5tYXAocHJpdi0+cmVtYXBfYWRkcik7CiAKIHByb2JlX3F1aXQ6CkBAIC0xOTYwLDcgKzE5NjEsNyBAQAogCQljcGRtYV9jaGFuX2Rlc3Ryb3kocHJpdi0+cnhjaGFuKTsKIAljcGRtYV9jdGxyX2Rlc3Ryb3kocHJpdi0+ZG1hKTsKIAotCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogCWlvdW5tYXAocHJpdi0+cmVtYXBfYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWNsYW5jZS5jIGIvZHJpdmVycy9uZXQvZGVjbGFuY2UuYwppbmRleCAyMTllYjVhLi5kNTU5OGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZWNsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2RlY2xhbmNlLmMKQEAgLTMyNiwxNSArMzI2LDE4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGNwX3RvX2J1Zihjb25zdCBpbnQgdHlwZSwgdm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBsZW4pCiB7Ci0JdW5zaWduZWQgc2hvcnQgKnRwLCAqZnAsIGNsZW47Ci0JdW5zaWduZWQgY2hhciAqcnRwLCAqcmZwOworCXVuc2lnbmVkIHNob3J0ICp0cDsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqZnA7CisJdW5zaWduZWQgc2hvcnQgY2xlbjsKKwl1bnNpZ25lZCBjaGFyICpydHA7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcmZwOwogCiAJaWYgKHR5cGUgPT0gUE1BRF9MQU5DRSkgewogCQltZW1jcHkodG8sIGZyb20sIGxlbik7CiAJfSBlbHNlIGlmICh0eXBlID09IFBNQVhfTEFOQ0UpIHsKIAkJY2xlbiA9IGxlbiA+PiAxOwotCQl0cCA9ICh1bnNpZ25lZCBzaG9ydCAqKSB0bzsKLQkJZnAgPSAodW5zaWduZWQgc2hvcnQgKikgZnJvbTsKKwkJdHAgPSB0bzsKKwkJZnAgPSBmcm9tOwogCiAJCXdoaWxlIChjbGVuLS0pIHsKIAkJCSp0cCsrID0gKmZwKys7CkBAIC0zNDIsOCArMzQ1LDggQEAKIAkJfQogCiAJCWNsZW4gPSBsZW4gJiAxOwotCQlydHAgPSAodW5zaWduZWQgY2hhciAqKSB0cDsKLQkJcmZwID0gKHVuc2lnbmVkIGNoYXIgKikgZnA7CisJCXJ0cCA9IHRwOworCQlyZnAgPSBmcDsKIAkJd2hpbGUgKGNsZW4tLSkgewogCQkJKnJ0cCsrID0gKnJmcCsrOwogCQl9CkBAIC0zNTIsOCArMzU1LDggQEAKIAkJICogY29weSAxNiBCeXRlIGNodW5rcwogCQkgKi8KIAkJY2xlbiA9IGxlbiA+PiA0OwotCQl0cCA9ICh1bnNpZ25lZCBzaG9ydCAqKSB0bzsKLQkJZnAgPSAodW5zaWduZWQgc2hvcnQgKikgZnJvbTsKKwkJdHAgPSB0bzsKKwkJZnAgPSBmcm9tOwogCQl3aGlsZSAoY2xlbi0tKSB7CiAJCQkqdHArKyA9ICpmcCsrOwogCQkJKnRwKysgPSAqZnArKzsKQEAgLTM4MiwxNSArMzg1LDE4IEBACiAKIHN0YXRpYyB2b2lkIGNwX2Zyb21fYnVmKGNvbnN0IGludCB0eXBlLCB2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbikKIHsKLQl1bnNpZ25lZCBzaG9ydCAqdHAsICpmcCwgY2xlbjsKLQl1bnNpZ25lZCBjaGFyICpydHAsICpyZnA7CisJdW5zaWduZWQgc2hvcnQgKnRwOworCWNvbnN0IHVuc2lnbmVkIHNob3J0ICpmcDsKKwl1bnNpZ25lZCBzaG9ydCBjbGVuOworCXVuc2lnbmVkIGNoYXIgKnJ0cDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpyZnA7CiAKIAlpZiAodHlwZSA9PSBQTUFEX0xBTkNFKSB7CiAJCW1lbWNweSh0bywgZnJvbSwgbGVuKTsKIAl9IGVsc2UgaWYgKHR5cGUgPT0gUE1BWF9MQU5DRSkgewogCQljbGVuID0gbGVuID4+IDE7Ci0JCXRwID0gKHVuc2lnbmVkIHNob3J0ICopIHRvOwotCQlmcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBmcm9tOworCQl0cCA9IHRvOworCQlmcCA9IGZyb207CiAJCXdoaWxlIChjbGVuLS0pIHsKIAkJCSp0cCsrID0gKmZwKys7CiAJCQlmcCsrOwpAQCAtMzk4LDggKzQwNCw4IEBACiAKIAkJY2xlbiA9IGxlbiAmIDE7CiAKLQkJcnRwID0gKHVuc2lnbmVkIGNoYXIgKikgdHA7Ci0JCXJmcCA9ICh1bnNpZ25lZCBjaGFyICopIGZwOworCQlydHAgPSB0cDsKKwkJcmZwID0gZnA7CiAKIAkJd2hpbGUgKGNsZW4tLSkgewogCQkJKnJ0cCsrID0gKnJmcCsrOwpAQCAtNDEwLDggKzQxNiw4IEBACiAJCSAqIGNvcHkgMTYgQnl0ZSBjaHVua3MKIAkJICovCiAJCWNsZW4gPSBsZW4gPj4gNDsKLQkJdHAgPSAodW5zaWduZWQgc2hvcnQgKikgdG87Ci0JCWZwID0gKHVuc2lnbmVkIHNob3J0ICopIGZyb207CisJCXRwID0gdG87CisJCWZwID0gZnJvbTsKIAkJd2hpbGUgKGNsZW4tLSkgewogCQkJKnRwKysgPSAqZnArKzsKIAkJCSp0cCsrID0gKmZwKys7CkBAIC05NDAsNyArOTQ2LDYgQEAKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvbGF0aWxlIHUxNiAqaWIgPSAodm9sYXRpbGUgdTE2ICopZGV2LT5tZW1fc3RhcnQ7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQljaGFyICphZGRyczsKIAl1MzIgY3JjOwogCiAJLyogc2V0IGFsbCBtdWx0aWNhc3QgYml0cyAqLwpAQCAtOTU5LDEzICs5NjQsNyBAQAogCiAJLyogQWRkIGFkZHJlc3NlcyAqLwogCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKLQkJYWRkcnMgPSBoYS0+YWRkcjsKLQotCQkvKiBtdWx0aWNhc3QgYWRkcmVzcz8gKi8KLQkJaWYgKCEoKmFkZHJzICYgMSkpCi0JCQljb250aW51ZTsKLQotCQljcmMgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIGFkZHJzKTsKKwkJY3JjID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBoYS0+YWRkcik7CiAJCWNyYyA9IGNyYyA+PiAyNjsKIAkJKmxpYl9wdHIoaWIsIGZpbHRlcltjcmMgPj4gNF0sIGxwLT50eXBlKSB8PSAxIDw8IChjcmMgJiAweGYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlcGNhLmMgYi9kcml2ZXJzL25ldC9kZXBjYS5jCmluZGV4IDhiMDA4NGQuLmYyMDE1YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlcGNhLmMKKysrIGIvZHJpdmVycy9uZXQvZGVwY2EuYwpAQCAtNzA4LDExICs3MDgsMTEgQEAKIAogCS8qIFR4ICYgUnggZGVzY3JpcHRvcnMgKGFsaWduZWQgdG8gYSBxdWFkd29yZCBib3VuZGFyeSkgKi8KIAlvZmZzZXQgPSAob2Zmc2V0ICsgREVQQ0FfQUxJR04pICYgfkRFUENBX0FMSUdOOwotCWxwLT5yeF9yaW5nID0gKHN0cnVjdCBkZXBjYV9yeF9kZXNjIF9faW9tZW0gKikgKGxwLT5zaF9tZW0gKyBvZmZzZXQpOworCWxwLT5yeF9yaW5nID0gbHAtPnNoX21lbSArIG9mZnNldDsKIAlscC0+cnhfcmluZ19vZmZzZXQgPSBvZmZzZXQ7CiAKIAlvZmZzZXQgKz0gKHNpemVvZihzdHJ1Y3QgZGVwY2FfcnhfZGVzYykgKiBOVU1fUlhfREVTQyk7Ci0JbHAtPnR4X3JpbmcgPSAoc3RydWN0IGRlcGNhX3R4X2Rlc2MgX19pb21lbSAqKSAobHAtPnNoX21lbSArIG9mZnNldCk7CisJbHAtPnR4X3JpbmcgPSBscC0+c2hfbWVtICsgb2Zmc2V0OwogCWxwLT50eF9yaW5nX29mZnNldCA9IG9mZnNldDsKIAogCW9mZnNldCArPSAoc2l6ZW9mKHN0cnVjdCBkZXBjYV90eF9kZXNjKSAqIE5VTV9UWF9ERVNDKTsKQEAgLTEwNzMsMTMgKzEwNzMsMTMgQEAKIAkJCQkJCQlpID0gREVQQ0FfUEtUX1NUQVRfU1o7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQkJaWYgKGJ1ZlswXSAmIDB4MDEpIHsJLyogTXVsdGljYXN0L0Jyb2FkY2FzdCAqLwotCQkJCQkJaWYgKCgqKHMxNiAqKSAmIGJ1ZlswXSA9PSAtMSkgJiYgKCooczE2ICopICYgYnVmWzJdID09IC0xKSAmJiAoKihzMTYgKikgJiBidWZbNF0gPT0gLTEpKSB7CisJCQkJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihidWYpKSB7CisJCQkJCQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoYnVmKSkgewogCQkJCQkJCWxwLT5wa3RTdGF0cy5icm9hZGNhc3QrKzsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJbHAtPnBrdFN0YXRzLm11bHRpY2FzdCsrOwogCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKCgqKHMxNiAqKSAmIGJ1ZlswXSA9PSAqKHMxNiAqKSAmIGRldi0+ZGV2X2FkZHJbMF0pICYmICgqKHMxNiAqKSAmIGJ1ZlsyXSA9PSAqKHMxNiAqKSAmIGRldi0+ZGV2X2FkZHJbMl0pICYmICgqKHMxNiAqKSAmIGJ1Zls0XSA9PSAqKHMxNiAqKSAmIGRldi0+ZGV2X2FkZHJbNF0pKSB7CisJCQkJCX0gZWxzZSBpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGJ1ZiwgZGV2LT5kZXZfYWRkcikgPT0gMCkgewogCQkJCQkJbHAtPnBrdFN0YXRzLnVuaWNhc3QrKzsKIAkJCQkJfQogCkBAIC0xMjcwLDcgKzEyNzAsNiBAQAogewogCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQljaGFyICphZGRyczsKIAlpbnQgaSwgaiwgYml0LCBieXRlOwogCXUxNiBoYXNoY29kZTsKIAl1MzIgY3JjOwpAQCAtMTI4NSwxOSArMTI4NCwxNSBAQAogCQl9CiAJCS8qIEFkZCBtdWx0aWNhc3QgYWRkcmVzc2VzICovCiAJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKLQkJCWFkZHJzID0gaGEtPmFkZHI7Ci0JCQlpZiAoKCphZGRycyAmIDB4MDEpID09IDEpIHsJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCi0JCQkJY3JjID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBhZGRycyk7Ci0JCQkJaGFzaGNvZGUgPSAoY3JjICYgMSk7CS8qIGhhc2hjb2RlIGlzIDYgTFNiIG9mIENSQyAuLi4gKi8KLQkJCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7CS8qIC4uLiBpbiByZXZlcnNlIG9yZGVyLiAqLwotCQkJCQloYXNoY29kZSA9IChoYXNoY29kZSA8PCAxKSB8ICgoY3JjID4+PSAxKSAmIDEpOwotCQkJCX0KLQotCi0JCQkJYnl0ZSA9IGhhc2hjb2RlID4+IDM7CS8qIGJpdFszLTVdIC0+IGJ5dGUgaW4gZmlsdGVyICovCi0JCQkJYml0ID0gMSA8PCAoaGFzaGNvZGUgJiAweDA3KTsJLyogYml0WzAtMl0gLT4gYml0IGluIGJ5dGUgKi8KLQkJCQlscC0+aW5pdF9ibG9jay5tY2FzdF90YWJsZVtieXRlXSB8PSBiaXQ7CisJCQljcmMgPSBldGhlcl9jcmMoRVRIX0FMRU4sIGhhLT5hZGRyKTsKKwkJCWhhc2hjb2RlID0gKGNyYyAmIDEpOwkvKiBoYXNoY29kZSBpcyA2IExTYiBvZiBDUkMgLi4uICovCisJCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7CS8qIC4uLiBpbiByZXZlcnNlIG9yZGVyLiAqLworCQkJCWhhc2hjb2RlID0gKGhhc2hjb2RlIDw8IDEpIHwgKChjcmMgPj49IDEpICYgMSk7CiAJCQl9CisKKwkJCWJ5dGUgPSBoYXNoY29kZSA+PiAzOwkvKiBiaXRbMy01XSAtPiBieXRlIGluIGZpbHRlciAqLworCQkJYml0ID0gMSA8PCAoaGFzaGNvZGUgJiAweDA3KTsJLyogYml0WzAtMl0gLT4gYml0IGluIGJ5dGUgKi8KKwkJCWxwLT5pbml0X2Jsb2NrLm1jYXN0X3RhYmxlW2J5dGVdIHw9IGJpdDsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RsMmsuYyBiL2RyaXZlcnMvbmV0L2RsMmsuYwppbmRleCBjNDQ1NDU3Li5lZDczZTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kbDJrLmMKKysrIGIvZHJpdmVycy9uZXQvZGwyay5jCkBAIC0yMjEsMTMgKzIyMSwxMyBAQAogCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudCAocGRldiwgVFhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKIAlpZiAoIXJpbmdfc3BhY2UpCiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwotCW5wLT50eF9yaW5nID0gKHN0cnVjdCBuZXRkZXZfZGVzYyAqKSByaW5nX3NwYWNlOworCW5wLT50eF9yaW5nID0gcmluZ19zcGFjZTsKIAlucC0+dHhfcmluZ19kbWEgPSByaW5nX2RtYTsKIAogCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudCAocGRldiwgUlhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKIAlpZiAoIXJpbmdfc3BhY2UpCiAJCWdvdG8gZXJyX291dF91bm1hcF90eDsKLQlucC0+cnhfcmluZyA9IChzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKikgcmluZ19zcGFjZTsKKwlucC0+cnhfcmluZyA9IHJpbmdfc3BhY2U7CiAJbnAtPnJ4X3JpbmdfZG1hID0gcmluZ19kbWE7CiAKIAkvKiBQYXJzZSBlZXByb20gZGF0YSAqLwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJaWYgKG5wLT5wZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ETElOSykgewkvKiBELUxpbmsgT25seSAqLwogCQkvKiBDaGVjayBDUkMgKi8KIAkJY3JjID0gfmV0aGVyX2NyY19sZSAoMjU2IC0gNCwgc3JvbWRhdGEpOwotCQlpZiAocHNyb20tPmNyYyAhPSBjcmMpIHsKKwkJaWYgKHBzcm9tLT5jcmMgIT0gY3B1X3RvX2xlMzIoY3JjKSkgewogCQkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IEVFUFJPTSBkYXRhIENSQyBlcnJvci5cbiIsCiAJCQkJCWRldi0+bmFtZSk7CiAJCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbTkwMDAuYyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCmluZGV4IGVlNTk3ZTYuLjhlZjMxZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RtOTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgpAQCAtNTM0LDIxICs1MzUsMzUgQEAKIAlib2FyZF9pbmZvX3QgKmRtID0gdG9fZG05MDAwX2JvYXJkKGRldik7CiAJaW50IG9mZnNldCA9IGVlLT5vZmZzZXQ7CiAJaW50IGxlbiA9IGVlLT5sZW47Ci0JaW50IGk7CisJaW50IGRvbmU7CiAKIAkvKiBFRVBST00gYWNjZXNzIGlzIGFsaWduZWQgdG8gdHdvIGJ5dGVzICovCiAKLQlpZiAoKGxlbiAmIDEpICE9IDAgfHwgKG9mZnNldCAmIDEpICE9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKGRtLT5mbGFncyAmIERNOTAwMF9QTEFURl9OT19FRVBST00pCiAJCXJldHVybiAtRU5PRU5UOwogCiAJaWYgKGVlLT5tYWdpYyAhPSBETV9FRVBST01fTUFHSUMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAyKQotCQlkbTkwMDBfd3JpdGVfZWVwcm9tKGRtLCAob2Zmc2V0ICsgaSkgLyAyLCBkYXRhICsgaSk7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaWYgKGxlbiAmIDEgfHwgb2Zmc2V0ICYgMSkgeworCQkJaW50IHdoaWNoID0gb2Zmc2V0ICYgMTsKKwkJCXU4IHRtcFsyXTsKKworCQkJZG05MDAwX3JlYWRfZWVwcm9tKGRtLCBvZmZzZXQgLyAyLCB0bXApOworCQkJdG1wW3doaWNoXSA9ICpkYXRhOworCQkJZG05MDAwX3dyaXRlX2VlcHJvbShkbSwgb2Zmc2V0IC8gMiwgdG1wKTsKKworCQkJZG9uZSA9IDE7CisJCX0gZWxzZSB7CisJCQlkbTkwMDBfd3JpdGVfZWVwcm9tKGRtLCBvZmZzZXQgLyAyLCBkYXRhKTsKKwkJCWRvbmUgPSAyOworCQl9CisKKwkJZGF0YSArPSBkb25lOworCQlvZmZzZXQgKz0gZG9uZTsKKwkJbGVuIC09IGRvbmU7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbmV0LmMgYi9kcml2ZXJzL25ldC9kbmV0LmMKaW5kZXggODMxOGVhMC4uYzEwNjNkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZG5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2RuZXQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CkBAIC01ODcsNiArNTg4LDggQEAKIAkJZG5ldF93cml0ZWwoYnAsIGlycV9lbmFibGUsIElOVFJfRU5CKTsKIAl9CiAKKwlza2JfdHhfdGltZXN0YW1wKHNrYik7CisKIAkvKiBmcmVlIHRoZSBidWZmZXIgKi8KIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAuYyBiL2RyaXZlcnMvbmV0L2UxMDAuYwppbmRleCBlMzM2Yzc5Li5jMTM1MmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMC5jCkBAIC0xNDksNiArMTQ5LDggQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaAppbmRleCA4Njc2ODk5Li4yNGY0MWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKQEAgLTIxNSw3ICsyMTUsNyBAQAogCXN0cnVjdCB0aW1lcl9saXN0IHR4X2ZpZm9fc3RhbGxfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QgcGh5X2luZm9fdGltZXI7Ci0Jc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3ZsYW5zW0JJVFNfVE9fTE9OR1MoVkxBTl9OX1ZJRCldOwogCXUxNiBtbmdfdmxhbl9pZDsKIAl1MzIgYmRfbnVtYmVyOwogCXUzMiByeF9idWZmZXJfbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCmluZGV4IGVjMGZhNDIuLmM1ZjBmMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKQEAgLTI5MCw2OSArMjkwLDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdTMyIGUxMDAwX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXJldHVybiBhZGFwdGVyLT5yeF9jc3VtOwotfQotCi1zdGF0aWMgaW50IGUxMDAwX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBkYXRhKQotewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlhZGFwdGVyLT5yeF9jc3VtID0gZGF0YTsKLQotCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCi0JCWUxMDAwX3JlaW5pdF9sb2NrZWQoYWRhcHRlcik7Ci0JZWxzZQotCQllMTAwMF9yZXNldChhZGFwdGVyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHUzMiBlMTAwMF9nZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXJldHVybiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfQ1NVTSkgIT0gMDsKLX0KLQotc3RhdGljIGludCBlMTAwMF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKLXsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQotCWlmIChody0+bWFjX3R5cGUgPCBlMTAwMF84MjU0MykgewotCQlpZiAoIWRhdGEpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGRhdGEpCi0JCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOwotCWVsc2UKLQkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9IV19DU1VNOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZTEwMDBfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKLXsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQotCWlmICgoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDQpIHx8Ci0JICAgIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKQotCQlyZXR1cm4gZGF0YSA/IC1FSU5WQUwgOiAwOwotCi0JaWYgKGRhdGEpCi0JCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087Ci0JZWxzZQotCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzsKLQotCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPNjsKLQotCWVfaW5mbyhwcm9iZSwgIlRTTyBpcyAlc1xuIiwgZGF0YSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotCWFkYXB0ZXItPnRzb19mb3JjZSA9IHRydWU7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB1MzIgZTEwMDBfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwpAQCAtMTkwNSwxMiArMTg0Miw2IEBACiAJLnNldF9yaW5ncGFyYW0gICAgICAgICAgPSBlMTAwMF9zZXRfcmluZ3BhcmFtLAogCS5nZXRfcGF1c2VwYXJhbSAgICAgICAgID0gZTEwMDBfZ2V0X3BhdXNlcGFyYW0sCiAJLnNldF9wYXVzZXBhcmFtICAgICAgICAgPSBlMTAwMF9zZXRfcGF1c2VwYXJhbSwKLQkuZ2V0X3J4X2NzdW0gICAgICAgICAgICA9IGUxMDAwX2dldF9yeF9jc3VtLAotCS5zZXRfcnhfY3N1bSAgICAgICAgICAgID0gZTEwMDBfc2V0X3J4X2NzdW0sCi0JLmdldF90eF9jc3VtICAgICAgICAgICAgPSBlMTAwMF9nZXRfdHhfY3N1bSwKLQkuc2V0X3R4X2NzdW0gICAgICAgICAgICA9IGUxMDAwX3NldF90eF9jc3VtLAotCS5zZXRfc2cgICAgICAgICAgICAgICAgID0gZXRodG9vbF9vcF9zZXRfc2csCi0JLnNldF90c28gICAgICAgICAgICAgICAgPSBlMTAwMF9zZXRfdHNvLAogCS5zZWxmX3Rlc3QgICAgICAgICAgICAgID0gZTEwMDBfZGlhZ190ZXN0LAogCS5nZXRfc3RyaW5ncyAgICAgICAgICAgID0gZTEwMDBfZ2V0X3N0cmluZ3MsCiAJLnNldF9waHlzX2lkICAgICAgICAgICAgPSBlMTAwMF9zZXRfcGh5c19pZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCmluZGV4IDc1MDFkOTcuLjE2OTg2MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwpAQCAtMzA4MCw3ICszMDgwLDYgQEAKIHsKIAl1MzIgY3RybCwgY3RybF9leHQ7CiAJdTMyIGxlZF9jdHJsOwotCXMzMiByZXRfdmFsOwogCiAJZV9kYmcoImUxMDAwX3BoeV9od19yZXNldCIpOwogCkBAIC0zMTI2LDExICszMTI1LDcgQEAKIAl9CiAKIAkvKiBXYWl0IGZvciBGVyB0byBmaW5pc2ggUEhZIGNvbmZpZ3VyYXRpb24uICovCi0JcmV0X3ZhbCA9IGUxMDAwX2dldF9waHlfY2ZnX2RvbmUoaHcpOwotCWlmIChyZXRfdmFsICE9IEUxMDAwX1NVQ0NFU1MpCi0JCXJldHVybiByZXRfdmFsOwotCi0JcmV0dXJuIHJldF92YWw7CisJcmV0dXJuIGUxMDAwX2dldF9waHlfY2ZnX2RvbmUoaHcpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwppbmRleCA3NmU4YWYwLi5mOTdhZmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAKIC8qIEludGVsIE1lZGlhIFNPQyBHYkUgTURJTyBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGNlNDEwMF9nYmVfbWRpb19iYXNlX3BoeTsKQEAgLTE2Niw3ICsxNjgsOCBAQAogc3RhdGljIGludCBlMTAwMF84MjU0N19maWZvX3dvcmthcm91bmQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAotc3RhdGljIHZvaWQgZTEwMDBfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKTsKK3N0YXRpYyBib29sIGUxMDAwX3ZsYW5fdXNlZChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBlMTAwMF92bGFuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKTsKIHN0YXRpYyB2b2lkIGUxMDAwX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKTsKIHN0YXRpYyB2b2lkIGUxMDAwX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCk7CiBzdGF0aWMgdm9pZCBlMTAwMF9yZXN0b3JlX3ZsYW4oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtMzMwLDIxICszMzMsMjQgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXUxNiB2aWQgPSBody0+bW5nX2Nvb2tpZS52bGFuX2lkOwogCXUxNiBvbGRfdmlkID0gYWRhcHRlci0+bW5nX3ZsYW5faWQ7Ci0JaWYgKGFkYXB0ZXItPnZsZ3JwKSB7Ci0JCWlmICghdmxhbl9ncm91cF9nZXRfZGV2aWNlKGFkYXB0ZXItPnZsZ3JwLCB2aWQpKSB7Ci0JCQlpZiAoaHctPm1uZ19jb29raWUuc3RhdHVzICYKLQkJCQlFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkgewotCQkJCWUxMDAwX3ZsYW5fcnhfYWRkX3ZpZChuZXRkZXYsIHZpZCk7Ci0JCQkJYWRhcHRlci0+bW5nX3ZsYW5faWQgPSB2aWQ7Ci0JCQl9IGVsc2UKLQkJCQlhZGFwdGVyLT5tbmdfdmxhbl9pZCA9IEUxMDAwX01OR19WTEFOX05PTkU7CiAKLQkJCWlmICgob2xkX3ZpZCAhPSAodTE2KUUxMDAwX01OR19WTEFOX05PTkUpICYmCi0JCQkJCSh2aWQgIT0gb2xkX3ZpZCkgJiYKLQkJCSAgICAhdmxhbl9ncm91cF9nZXRfZGV2aWNlKGFkYXB0ZXItPnZsZ3JwLCBvbGRfdmlkKSkKLQkJCQllMTAwMF92bGFuX3J4X2tpbGxfdmlkKG5ldGRldiwgb2xkX3ZpZCk7Ci0JCX0gZWxzZQorCWlmICghZTEwMDBfdmxhbl91c2VkKGFkYXB0ZXIpKQorCQlyZXR1cm47CisKKwlpZiAoIXRlc3RfYml0KHZpZCwgYWRhcHRlci0+YWN0aXZlX3ZsYW5zKSkgeworCQlpZiAoaHctPm1uZ19jb29raWUuc3RhdHVzICYKKwkJICAgIEUxMDAwX01OR19ESENQX0NPT0tJRV9TVEFUVVNfVkxBTl9TVVBQT1JUKSB7CisJCQllMTAwMF92bGFuX3J4X2FkZF92aWQobmV0ZGV2LCB2aWQpOwogCQkJYWRhcHRlci0+bW5nX3ZsYW5faWQgPSB2aWQ7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5tbmdfdmxhbl9pZCA9IEUxMDAwX01OR19WTEFOX05PTkU7CisJCX0KKwkJaWYgKChvbGRfdmlkICE9ICh1MTYpRTEwMDBfTU5HX1ZMQU5fTk9ORSkgJiYKKwkJICAgICh2aWQgIT0gb2xkX3ZpZCkgJiYKKwkJICAgICF0ZXN0X2JpdChvbGRfdmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpKQorCQkJZTEwMDBfdmxhbl9yeF9raWxsX3ZpZChuZXRkZXYsIG9sZF92aWQpOworCX0gZWxzZSB7CisJCWFkYXB0ZXItPm1uZ192bGFuX2lkID0gdmlkOwogCX0KIH0KIApAQCAtNzk3LDYgKzgwMyw0MSBAQAogCX0KIH0KIAorc3RhdGljIHUzMiBlMTAwMF9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQoreworCS8qCisJICogU2luY2UgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2VwYXJhdGUgcngvdHggdmxhbiBhY2NlbAorCSAqIGVuYWJsZS9kaXNhYmxlIG1ha2Ugc3VyZSB0eCBmbGFnIGlzIGFsd2F5cyBpbiBzYW1lIHN0YXRlIGFzIHJ4LgorCSAqLworCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYOworCWVsc2UKKwkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfSFdfVkxBTl9UWDsKKworCXJldHVybiBmZWF0dXJlczsKK30KKworc3RhdGljIGludCBlMTAwMF9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgY2hhbmdlZCA9IGZlYXR1cmVzIF4gbmV0ZGV2LT5mZWF0dXJlczsKKworCWlmIChjaGFuZ2VkICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQllMTAwMF92bGFuX21vZGUobmV0ZGV2LCBmZWF0dXJlcyk7CisKKwlpZiAoIShjaGFuZ2VkICYgTkVUSUZfRl9SWENTVU0pKQorCQlyZXR1cm4gMDsKKworCWFkYXB0ZXItPnJ4X2NzdW0gPSAhIShmZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWUxMDAwX3JlaW5pdF9sb2NrZWQoYWRhcHRlcik7CisJZWxzZQorCQllMTAwMF9yZXNldChhZGFwdGVyKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGUxMDAwX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCQk9IGUxMDAwX29wZW4sCiAJLm5kb19zdG9wCQk9IGUxMDAwX2Nsb3NlLApAQCAtODA0LDE3ICs4NDUsMTcgQEAKIAkubmRvX2dldF9zdGF0cwkJPSBlMTAwMF9nZXRfc3RhdHMsCiAJLm5kb19zZXRfcnhfbW9kZQk9IGUxMDAwX3NldF9yeF9tb2RlLAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZTEwMDBfc2V0X21hYywKLQkubmRvX3R4X3RpbWVvdXQgCT0gZTEwMDBfdHhfdGltZW91dCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gZTEwMDBfdHhfdGltZW91dCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZTEwMDBfY2hhbmdlX210dSwKIAkubmRvX2RvX2lvY3RsCQk9IGUxMDAwX2lvY3RsLAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAotCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gZTEwMDBfdmxhbl9yeF9yZWdpc3RlciwKIAkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IGUxMDAwX3ZsYW5fcnhfYWRkX3ZpZCwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSBlMTAwMF92bGFuX3J4X2tpbGxfdmlkLAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBlMTAwMF9uZXRwb2xsLAogI2VuZGlmCisJLm5kb19maXhfZmVhdHVyZXMJPSBlMTAwMF9maXhfZmVhdHVyZXMsCisJLm5kb19zZXRfZmVhdHVyZXMJPSBlMTAwMF9zZXRfZmVhdHVyZXMsCiB9OwogCiAvKioKQEAgLTEwMTYsMTYgKzEwNTcsMTkgQEAKIAl9CiAKIAlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7Ci0JCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwKKwkJbmV0ZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfAogCQkJCSAgIE5FVElGX0ZfSFdfQ1NVTSB8Ci0JCQkJICAgTkVUSUZfRl9IV19WTEFOX1RYIHwKLQkJCQkgICBORVRJRl9GX0hXX1ZMQU5fUlggfAorCQkJCSAgIE5FVElGX0ZfSFdfVkxBTl9SWDsKKwkJbmV0ZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfSFdfVkxBTl9UWCB8CiAJCQkJICAgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUjsKIAl9CiAKIAlpZiAoKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkgJiYKIAkgICAoaHctPm1hY190eXBlICE9IGUxMDAwXzgyNTQ3KSkKLQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKwkJbmV0ZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKworCW5ldGRldi0+ZmVhdHVyZXMgfD0gbmV0ZGV2LT5od19mZWF0dXJlczsKKwluZXRkZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfUlhDU1VNOwogCiAJaWYgKHBjaV91c2luZ19kYWMpIHsKIAkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CkBAIC0xMTc1LDYgKzEyMTksOCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3JlZ2lzdGVyOwogCisJZTEwMDBfdmxhbl9tb2RlKG5ldGRldiwgbmV0ZGV2LT5mZWF0dXJlcyk7CisKIAkvKiBwcmludCBidXMgdHlwZS9zcGVlZC93aWR0aCBpbmZvICovCiAJZV9pbmZvKHByb2JlLCAiKFBDSSVzOiVkTUh6OiVkLWJpdCkgJXBNXG4iLAogCSAgICAgICAoKGh3LT5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2l4KSA/ICItWCIgOiAiIiksCkBAIC0xNDE5LDggKzE0NjUsNyBAQAogCSAqIHRoZSBzYW1lIElEIGlzIHJlZ2lzdGVyZWQgb24gdGhlIGhvc3QgT1MgKGxldCA4MDIxcSBraWxsIGl0KSAqLwogCWlmICgoaHctPm1uZ19jb29raWUuc3RhdHVzICYKIAkJCSAgRTEwMDBfTU5HX0RIQ1BfQ09PS0lFX1NUQVRVU19WTEFOX1NVUFBPUlQpICYmCi0JICAgICAhKGFkYXB0ZXItPnZsZ3JwICYmCi0JICAgICAgIHZsYW5fZ3JvdXBfZ2V0X2RldmljZShhZGFwdGVyLT52bGdycCwgYWRhcHRlci0+bW5nX3ZsYW5faWQpKSkgeworCSAgICAgIXRlc3RfYml0KGFkYXB0ZXItPm1uZ192bGFuX2lkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpKSB7CiAJCWUxMDAwX3ZsYW5fcnhfa2lsbF92aWQobmV0ZGV2LCBhZGFwdGVyLT5tbmdfdmxhbl9pZCk7CiAJfQogCkBAIC0yMjExLDcgKzIyNTYsNyBAQAogCQllbHNlCiAJCQlyY3RsICY9IH5FMTAwMF9SQ1RMX01QRTsKIAkJLyogRW5hYmxlIFZMQU4gZmlsdGVyIGlmIHRoZXJlIGlzIGEgVkxBTiAqLwotCQlpZiAoYWRhcHRlci0+dmxncnApCisJCWlmIChlMTAwMF92bGFuX3VzZWQoYWRhcHRlcikpCiAJCQlyY3RsIHw9IEUxMDAwX1JDVExfVkZFOwogCX0KIApAQCAtMjM1NywxMyArMjQwMiwxNiBAQAogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJYm9vbCBsaW5rX2FjdGl2ZSA9IGZhbHNlOwogCi0JLyogZ2V0X2xpbmtfc3RhdHVzIGlzIHNldCBvbiBMU0MgKGxpbmsgc3RhdHVzKSBpbnRlcnJ1cHQgb3IKLQkgKiByeCBzZXF1ZW5jZSBlcnJvciBpbnRlcnJ1cHQuICBnZXRfbGlua19zdGF0dXMgd2lsbCBzdGF5Ci0JICogZmFsc2UgdW50aWwgdGhlIGUxMDAwX2NoZWNrX2Zvcl9saW5rIGVzdGFibGlzaGVzIGxpbmsKLQkgKiBmb3IgY29wcGVyIGFkYXB0ZXJzIE9OTFkKKwkvKiBnZXRfbGlua19zdGF0dXMgaXMgc2V0IG9uIExTQyAobGluayBzdGF0dXMpIGludGVycnVwdCBvciByeAorCSAqIHNlcXVlbmNlIGVycm9yIGludGVycnVwdCAoZXhjZXB0IG9uIGludGVsIGNlNDEwMCkuCisJICogZ2V0X2xpbmtfc3RhdHVzIHdpbGwgc3RheSBmYWxzZSB1bnRpbCB0aGUKKwkgKiBlMTAwMF9jaGVja19mb3JfbGluayBlc3RhYmxpc2hlcyBsaW5rIGZvciBjb3BwZXIgYWRhcHRlcnMKKwkgKiBPTkxZCiAJICovCiAJc3dpdGNoIChody0+bWVkaWFfdHlwZSkgewogCWNhc2UgZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXI6CisJCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfY2U0MTAwKQorCQkJaHctPmdldF9saW5rX3N0YXR1cyA9IDE7CiAJCWlmIChody0+Z2V0X2xpbmtfc3RhdHVzKSB7CiAJCQllMTAwMF9jaGVja19mb3JfbGluayhodyk7CiAJCQlsaW5rX2FjdGl2ZSA9ICFody0+Z2V0X2xpbmtfc3RhdHVzOwpAQCAtMzE1OCw3ICszMjA2LDcgQEAKIAkJfQogCX0KIAotCWlmICh1bmxpa2VseSh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpKSB7CisJaWYgKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgewogCQl0eF9mbGFncyB8PSBFMTAwMF9UWF9GTEFHU19WTEFOOwogCQl0eF9mbGFncyB8PSAodmxhbl90eF90YWdfZ2V0KHNrYikgPDwgRTEwMDBfVFhfRkxBR1NfVkxBTl9TSElGVCk7CiAJfQpAQCAtMzcxMywxMiArMzc2MSwxMiBAQAogewogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGFkYXB0ZXItPm5ldGRldik7CiAKLQlpZiAoKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwICYmIChzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9WUCkpKSkKLQkJdmxhbl9ncm9fcmVjZWl2ZSgmYWRhcHRlci0+bmFwaSwgYWRhcHRlci0+dmxncnAsCi0JCQkJIGxlMTZfdG9fY3B1KHZsYW4pICYgRTEwMDBfUlhEX1NQQ19WTEFOX01BU0ssCi0JCQkJIHNrYik7Ci0JZWxzZQotCQluYXBpX2dyb19yZWNlaXZlKCZhZGFwdGVyLT5uYXBpLCBza2IpOworCWlmIChzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9WUCkgeworCQl1MTYgdmlkID0gbGUxNl90b19jcHUodmxhbikgJiBFMTAwMF9SWERfU1BDX1ZMQU5fTUFTSzsKKworCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdmlkKTsKKwl9CisJbmFwaV9ncm9fcmVjZWl2ZSgmYWRhcHRlci0+bmFwaSwgc2tiKTsKIH0KIAogLyoqCkBAIC00NTAxLDUxICs0NTQ5LDY2IEBACiAJb3V0bCh2YWx1ZSwgcG9ydCk7CiB9CiAKLXN0YXRpYyB2b2lkIGUxMDAwX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQorc3RhdGljIGJvb2wgZTEwMDBfdmxhbl91c2VkKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MTYgdmlkOworCisJZm9yX2VhY2hfc2V0X2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucywgVkxBTl9OX1ZJRCkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBlMTAwMF92bGFuX2ZpbHRlcl9vbl9vZmYoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICBib29sIGZpbHRlcl9vbikKK3sKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXUzMiBjdHJsLCByY3RsOworCXUzMiByY3RsOwogCiAJaWYgKCF0ZXN0X2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5mbGFncykpCiAJCWUxMDAwX2lycV9kaXNhYmxlKGFkYXB0ZXIpOwotCWFkYXB0ZXItPnZsZ3JwID0gZ3JwOwogCi0JaWYgKGdycCkgewotCQkvKiBlbmFibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCi0JCWN0cmwgPSBlcjMyKENUUkwpOwotCQljdHJsIHw9IEUxMDAwX0NUUkxfVk1FOwotCQlldzMyKENUUkwsIGN0cmwpOwotCisJaWYgKGZpbHRlcl9vbikgewogCQkvKiBlbmFibGUgVkxBTiByZWNlaXZlIGZpbHRlcmluZyAqLwogCQlyY3RsID0gZXIzMihSQ1RMKTsKIAkJcmN0bCAmPSB+RTEwMDBfUkNUTF9DRklFTjsKLQkJaWYgKCEobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSkKKwkJaWYgKCEoYWRhcHRlci0+bmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSkKIAkJCXJjdGwgfD0gRTEwMDBfUkNUTF9WRkU7CiAJCWV3MzIoUkNUTCwgcmN0bCk7CiAJCWUxMDAwX3VwZGF0ZV9tbmdfdmxhbihhZGFwdGVyKTsKIAl9IGVsc2UgewotCQkvKiBkaXNhYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLwotCQljdHJsID0gZXIzMihDVFJMKTsKLQkJY3RybCAmPSB+RTEwMDBfQ1RSTF9WTUU7Ci0JCWV3MzIoQ1RSTCwgY3RybCk7Ci0KIAkJLyogZGlzYWJsZSBWTEFOIHJlY2VpdmUgZmlsdGVyaW5nICovCiAJCXJjdGwgPSBlcjMyKFJDVEwpOwogCQlyY3RsICY9IH5FMTAwMF9SQ1RMX1ZGRTsKIAkJZXczMihSQ1RMLCByY3RsKTsKLQotCQlpZiAoYWRhcHRlci0+bW5nX3ZsYW5faWQgIT0gKHUxNilFMTAwMF9NTkdfVkxBTl9OT05FKSB7Ci0JCQllMTAwMF92bGFuX3J4X2tpbGxfdmlkKG5ldGRldiwgYWRhcHRlci0+bW5nX3ZsYW5faWQpOwotCQkJYWRhcHRlci0+bW5nX3ZsYW5faWQgPSBFMTAwMF9NTkdfVkxBTl9OT05FOwotCQl9CiAJfQogCiAJaWYgKCF0ZXN0X2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5mbGFncykpCiAJCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CiB9CiAKK3N0YXRpYyB2b2lkIGUxMDAwX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTMyIGN0cmw7CisKKwlpZiAoIXRlc3RfYml0KF9fRTEwMDBfRE9XTiwgJmFkYXB0ZXItPmZsYWdzKSkKKwkJZTEwMDBfaXJxX2Rpc2FibGUoYWRhcHRlcik7CisKKwljdHJsID0gZXIzMihDVFJMKTsKKwlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpIHsKKwkJLyogZW5hYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLworCQljdHJsIHw9IEUxMDAwX0NUUkxfVk1FOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCWN0cmwgJj0gfkUxMDAwX0NUUkxfVk1FOworCX0KKwlldzMyKENUUkwsIGN0cmwpOworCisJaWYgKCF0ZXN0X2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5mbGFncykpCisJCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7Cit9CisKIHN0YXRpYyB2b2lkIGUxMDAwX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTQ1NTYsMTEgKzQ2MTksMTcgQEAKIAkgICAgIEUxMDAwX01OR19ESENQX0NPT0tJRV9TVEFUVVNfVkxBTl9TVVBQT1JUKSAmJgogCSAgICAodmlkID09IGFkYXB0ZXItPm1uZ192bGFuX2lkKSkKIAkJcmV0dXJuOworCisJaWYgKCFlMTAwMF92bGFuX3VzZWQoYWRhcHRlcikpCisJCWUxMDAwX3ZsYW5fZmlsdGVyX29uX29mZihhZGFwdGVyLCB0cnVlKTsKKwogCS8qIGFkZCBWSUQgdG8gZmlsdGVyIHRhYmxlICovCiAJaW5kZXggPSAodmlkID4+IDUpICYgMHg3RjsKIAl2ZnRhID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoaHcsIFZGVEEsIGluZGV4KTsKIAl2ZnRhIHw9ICgxIDw8ICh2aWQgJiAweDFGKSk7CiAJZTEwMDBfd3JpdGVfdmZ0YShodywgaW5kZXgsIHZmdGEpOworCisJc2V0X2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucyk7CiB9CiAKIHN0YXRpYyB2b2lkIGUxMDAwX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKQEAgLTQ1NzEsNyArNDY0MCw2IEBACiAKIAlpZiAoIXRlc3RfYml0KF9fRTEwMDBfRE9XTiwgJmFkYXB0ZXItPmZsYWdzKSkKIAkJZTEwMDBfaXJxX2Rpc2FibGUoYWRhcHRlcik7Ci0Jdmxhbl9ncm91cF9zZXRfZGV2aWNlKGFkYXB0ZXItPnZsZ3JwLCB2aWQsIE5VTEwpOwogCWlmICghdGVzdF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpKQogCQllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOwogCkBAIC00NTgwLDIwICs0NjQ4LDIzIEBACiAJdmZ0YSA9IEUxMDAwX1JFQURfUkVHX0FSUkFZKGh3LCBWRlRBLCBpbmRleCk7CiAJdmZ0YSAmPSB+KDEgPDwgKHZpZCAmIDB4MUYpKTsKIAllMTAwMF93cml0ZV92ZnRhKGh3LCBpbmRleCwgdmZ0YSk7CisKKwljbGVhcl9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOworCisJaWYgKCFlMTAwMF92bGFuX3VzZWQoYWRhcHRlcikpCisJCWUxMDAwX3ZsYW5fZmlsdGVyX29uX29mZihhZGFwdGVyLCBmYWxzZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGUxMDAwX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKIHsKLQllMTAwMF92bGFuX3J4X3JlZ2lzdGVyKGFkYXB0ZXItPm5ldGRldiwgYWRhcHRlci0+dmxncnApOworCXUxNiB2aWQ7CiAKLQlpZiAoYWRhcHRlci0+dmxncnApIHsKLQkJdTE2IHZpZDsKLQkJZm9yICh2aWQgPSAwOyB2aWQgPCBWTEFOX05fVklEOyB2aWQrKykgewotCQkJaWYgKCF2bGFuX2dyb3VwX2dldF9kZXZpY2UoYWRhcHRlci0+dmxncnAsIHZpZCkpCi0JCQkJY29udGludWU7Ci0JCQllMTAwMF92bGFuX3J4X2FkZF92aWQoYWRhcHRlci0+bmV0ZGV2LCB2aWQpOwotCQl9Ci0JfQorCWlmICghZTEwMDBfdmxhbl91c2VkKGFkYXB0ZXIpKQorCQlyZXR1cm47CisKKwllMTAwMF92bGFuX2ZpbHRlcl9vbl9vZmYoYWRhcHRlciwgdHJ1ZSk7CisJZm9yX2VhY2hfc2V0X2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucywgVkxBTl9OX1ZJRCkKKwkJZTEwMDBfdmxhbl9yeF9hZGRfdmlkKGFkYXB0ZXItPm5ldGRldiwgdmlkKTsKIH0KIAogaW50IGUxMDAwX3NldF9zcGRfZHBseChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwgdTMyIHNwZCwgdTggZHBseCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS84MjU3MS5jIGIvZHJpdmVycy9uZXQvZTEwMDBlLzgyNTcxLmMKaW5kZXggODI5NWYyMS4uNDgwZjI1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlLzgyNTcxLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlLzgyNTcxLmMKQEAgLTQzMSw4ICs0MzEsNiBAQAogCQkJYWRhcHRlci0+ZmxhZ3MgJj0gfkZMQUdfSEFTX1dPTDsKIAkJYnJlYWs7CiAJY2FzZSBlMTAwMF84MjU3MzoKLQljYXNlIGUxMDAwXzgyNTc0OgotCWNhc2UgZTEwMDBfODI1ODM6CiAJCWlmIChwZGV2LT5kZXZpY2UgPT0gRTEwMDBfREVWX0lEXzgyNTczTCkgewogCQkJYWRhcHRlci0+ZmxhZ3MgfD0gRkxBR19IQVNfSlVNQk9fRlJBTUVTOwogCQkJYWRhcHRlci0+bWF4X2h3X2ZyYW1lX3NpemUgPSBERUZBVUxUX0pVTUJPOwpAQCAtMjEwNCwxMCArMjEwMiwxMSBAQAogCQkJCSAgfCBGTEFHX1JYX0NTVU1fRU5BQkxFRAogCQkJCSAgfCBGTEFHX0hBU19TTUFSVF9QT1dFUl9ET1dOCiAJCQkJICB8IEZMQUdfSEFTX0FNVAorCQkJCSAgfCBGTEFHX0hBU19KVU1CT19GUkFNRVMKIAkJCQkgIHwgRkxBR19IQVNfQ1RSTEVYVF9PTl9MT0FELAogCS5mbGFnczIJCQk9IEZMQUcyX0RJU0FCTEVfQVNQTV9MMFMsCiAJLnBiYQkJCT0gMzIsCi0JLm1heF9od19mcmFtZV9zaXplCT0gRVRIX0ZSQU1FX0xFTiArIEVUSF9GQ1NfTEVOLAorCS5tYXhfaHdfZnJhbWVfc2l6ZQk9IERFRkFVTFRfSlVNQk8sCiAJLmdldF92YXJpYW50cwkJPSBlMTAwMF9nZXRfdmFyaWFudHNfODI1NzEsCiAJLm1hY19vcHMJCT0gJmU4MjU3MV9tYWNfb3BzLAogCS5waHlfb3BzCQk9ICZlODJfcGh5X29wc19ibSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9lMTAwMC5oIGIvZHJpdmVycy9uZXQvZTEwMDBlL2UxMDAwLmgKaW5kZXggOTU0OTg3OS4uNjM4ZDE3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2UxMDAwLmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2UxMDAwLmgKQEAgLTEwNCw2ICsxMDQsNyBAQAogCSAoKChyZWcpICYgfk1BWF9QSFlfUkVHX0FERFJFU1MpIDw8IChQSFlfVVBQRVJfU0hJRlQgLSBQSFlfUEFHRV9TSElGVCkpKQogCiAvKiBQSFkgV2FrZXVwIFJlZ2lzdGVycyBhbmQgZGVmaW5lcyAqLworI2RlZmluZSBCTV9QT1JUX0dFTl9DRkcgUEhZX1JFRyhCTV9QT1JUX0NUUkxfUEFHRSwgMTcpCiAjZGVmaW5lIEJNX1JDVEwgICAgICAgICBQSFlfUkVHKEJNX1dVQ19QQUdFLCAwKQogI2RlZmluZSBCTV9XVUMgICAgICAgICAgUEhZX1JFRyhCTV9XVUNfUEFHRSwgMSkKICNkZWZpbmUgQk1fV1VGQyAgICAgICAgIFBIWV9SRUcoQk1fV1VDX1BBR0UsIDIpCkBAIC0xMjIsMjAgKzEyMywyMSBAQAogI2RlZmluZSBCTV9SQ1RMX1BNQ0YgICAgICAgICAgMHgwMDQwICAgICAgICAgIC8qIFBhc3MgTUFDIENvbnRyb2wgRnJhbWVzICovCiAjZGVmaW5lIEJNX1JDVExfUkZDRSAgICAgICAgICAweDAwODAgICAgICAgICAgLyogUnggRmxvdyBDb250cm9sIEVuYWJsZSAqLwogCi0jZGVmaW5lIEhWX1NDQ19VUFBFUgkJUEhZX1JFRyg3NzgsIDE2KSAvKiBTaW5nbGUgQ29sbGlzaW9uIENvdW50ICovCi0jZGVmaW5lIEhWX1NDQ19MT1dFUgkJUEhZX1JFRyg3NzgsIDE3KQotI2RlZmluZSBIVl9FQ09MX1VQUEVSCQlQSFlfUkVHKDc3OCwgMTgpIC8qIEV4Y2Vzc2l2ZSBDb2xsaXNpb24gQ291bnQgKi8KLSNkZWZpbmUgSFZfRUNPTF9MT1dFUgkJUEhZX1JFRyg3NzgsIDE5KQotI2RlZmluZSBIVl9NQ0NfVVBQRVIJCVBIWV9SRUcoNzc4LCAyMCkgLyogTXVsdGlwbGUgQ29sbGlzaW9uIENvdW50ICovCi0jZGVmaW5lIEhWX01DQ19MT1dFUgkJUEhZX1JFRyg3NzgsIDIxKQotI2RlZmluZSBIVl9MQVRFQ09MX1VQUEVSCVBIWV9SRUcoNzc4LCAyMykgLyogTGF0ZSBDb2xsaXNpb24gQ291bnQgKi8KLSNkZWZpbmUgSFZfTEFURUNPTF9MT1dFUglQSFlfUkVHKDc3OCwgMjQpCi0jZGVmaW5lIEhWX0NPTENfVVBQRVIJCVBIWV9SRUcoNzc4LCAyNSkgLyogQ29sbGlzaW9uIENvdW50ICovCi0jZGVmaW5lIEhWX0NPTENfTE9XRVIJCVBIWV9SRUcoNzc4LCAyNikKLSNkZWZpbmUgSFZfRENfVVBQRVIJCVBIWV9SRUcoNzc4LCAyNykgLyogRGVmZXIgQ291bnQgKi8KLSNkZWZpbmUgSFZfRENfTE9XRVIJCVBIWV9SRUcoNzc4LCAyOCkKLSNkZWZpbmUgSFZfVE5DUlNfVVBQRVIJCVBIWV9SRUcoNzc4LCAyOSkgLyogVHJhbnNtaXQgd2l0aCBubyBDUlMgKi8KLSNkZWZpbmUgSFZfVE5DUlNfTE9XRVIJCVBIWV9SRUcoNzc4LCAzMCkKKyNkZWZpbmUgSFZfU1RBVFNfUEFHRQk3NzgKKyNkZWZpbmUgSFZfU0NDX1VQUEVSCVBIWV9SRUcoSFZfU1RBVFNfUEFHRSwgMTYpIC8qIFNpbmdsZSBDb2xsaXNpb24gQ291bnQgKi8KKyNkZWZpbmUgSFZfU0NDX0xPV0VSCVBIWV9SRUcoSFZfU1RBVFNfUEFHRSwgMTcpCisjZGVmaW5lIEhWX0VDT0xfVVBQRVIJUEhZX1JFRyhIVl9TVEFUU19QQUdFLCAxOCkgLyogRXhjZXNzaXZlIENvbGwuIENvdW50ICovCisjZGVmaW5lIEhWX0VDT0xfTE9XRVIJUEhZX1JFRyhIVl9TVEFUU19QQUdFLCAxOSkKKyNkZWZpbmUgSFZfTUNDX1VQUEVSCVBIWV9SRUcoSFZfU1RBVFNfUEFHRSwgMjApIC8qIE11bHRpcGxlIENvbGwuIENvdW50ICovCisjZGVmaW5lIEhWX01DQ19MT1dFUglQSFlfUkVHKEhWX1NUQVRTX1BBR0UsIDIxKQorI2RlZmluZSBIVl9MQVRFQ09MX1VQUEVSIFBIWV9SRUcoSFZfU1RBVFNfUEFHRSwgMjMpIC8qIExhdGUgQ29sbGlzaW9uIENvdW50ICovCisjZGVmaW5lIEhWX0xBVEVDT0xfTE9XRVIgUEhZX1JFRyhIVl9TVEFUU19QQUdFLCAyNCkKKyNkZWZpbmUgSFZfQ09MQ19VUFBFUglQSFlfUkVHKEhWX1NUQVRTX1BBR0UsIDI1KSAvKiBDb2xsaXNpb24gQ291bnQgKi8KKyNkZWZpbmUgSFZfQ09MQ19MT1dFUglQSFlfUkVHKEhWX1NUQVRTX1BBR0UsIDI2KQorI2RlZmluZSBIVl9EQ19VUFBFUglQSFlfUkVHKEhWX1NUQVRTX1BBR0UsIDI3KSAvKiBEZWZlciBDb3VudCAqLworI2RlZmluZSBIVl9EQ19MT1dFUglQSFlfUkVHKEhWX1NUQVRTX1BBR0UsIDI4KQorI2RlZmluZSBIVl9UTkNSU19VUFBFUglQSFlfUkVHKEhWX1NUQVRTX1BBR0UsIDI5KSAvKiBUcmFuc21pdCB3aXRoIG5vIENSUyAqLworI2RlZmluZSBIVl9UTkNSU19MT1dFUglQSFlfUkVHKEhWX1NUQVRTX1BBR0UsIDMwKQogCiAjZGVmaW5lIEUxMDAwX0ZDUlRWX1BDSCAgICAgMHgwNUY0MCAvKiBQQ0ggRmxvdyBDb250cm9sIFJlZnJlc2ggVGltZXIgVmFsdWUgKi8KIApAQCAtMTk3LDExICsxOTksNiBAQAogCWJvYXJkX3BjaDJsYW4sCiB9OwogCi1zdHJ1Y3QgZTEwMDBfcXVldWVfc3RhdHMgewotCXU2NCBwYWNrZXRzOwotCXU2NCBieXRlczsKLX07Ci0KIHN0cnVjdCBlMTAwMF9wc19wYWdlIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1NjQgZG1hOyAvKiBtdXN0IGJlIHU2NCAtIHdyaXR0ZW4gdG8gaHcgKi8KQEAgLTI1NSw4ICsyNTIsNiBAQAogCWludCBzZXRfaXRyOwogCiAJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYl90b3A7Ci0KLQlzdHJ1Y3QgZTEwMDBfcXVldWVfc3RhdHMgc3RhdHM7CiB9OwogCiAvKiBQSFkgcmVnaXN0ZXIgc25hcHNob3QgdmFsdWVzICovCkBAIC0zMzksNyArMzM0LDcgQEAKIAkJCSAgaW50ICp3b3JrX2RvbmUsIGludCB3b3JrX3RvX2RvKQogCQkJCQkJX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAl2b2lkICgqYWxsb2NfcnhfYnVmKSAoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgICBpbnQgY2xlYW5lZF9jb3VudCk7CisJCQkgICAgICBpbnQgY2xlYW5lZF9jb3VudCwgZ2ZwX3QgZ2ZwKTsKIAlzdHJ1Y3QgZTEwMDBfcmluZyAqcnhfcmluZzsKIAogCXUzMiByeF9pbnRfZGVsYXk7CkBAIC01MzMsNyArNTI4LDggQEAKIAkJCQkJCSBib29sIHN0YXRlKTsKIGV4dGVybiB2b2lkIGUxMDAwZV9pZ3AzX3BoeV9wb3dlcmRvd25fd29ya2Fyb3VuZF9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogZXh0ZXJuIHZvaWQgZTEwMDBlX2dpZ19kb3duc2hpZnRfd29ya2Fyb3VuZF9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwotZXh0ZXJuIHZvaWQgZTEwMDBlX2Rpc2FibGVfZ2lnX3dvbF9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOworZXh0ZXJuIHZvaWQgZTEwMDBfc3VzcGVuZF93b3JrYXJvdW5kc19pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOworZXh0ZXJuIHZvaWQgZTEwMDBfcmVzdW1lX3dvcmthcm91bmRzX3BjaGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGV4dGVybiBzMzIgZTEwMDBfY29uZmlndXJlX2sxX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodywgYm9vbCBrMV9lbmFibGUpOwogZXh0ZXJuIHMzMiBlMTAwMF9sdl9qdW1ib193b3JrYXJvdW5kX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodywgYm9vbCBlbmFibGUpOwogZXh0ZXJuIHZvaWQgZTEwMDBfY29weV9yeF9hZGRyc190b19waHlfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKQEAgLTU4NCw2ICs1ODAsNyBAQAogZXh0ZXJuIHMzMiBlMTAwMGVfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleF9pZ3Aoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBleHRlcm4gczMyIGUxMDAwZV9nZXRfY2FibGVfbGVuZ3RoX2lncF8yKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogZXh0ZXJuIHMzMiBlMTAwMGVfZ2V0X3BoeV9pbmZvX2lncChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2V4dGVybiBzMzIgZTEwMDBfc2V0X3BhZ2VfaWdwKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBwYWdlKTsKIGV4dGVybiBzMzIgZTEwMDBlX3JlYWRfcGh5X3JlZ19pZ3Aoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhKTsKIGV4dGVybiBzMzIgZTEwMDBlX3JlYWRfcGh5X3JlZ19pZ3BfbG9ja2VkKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgKmRhdGEpOwpAQCAtNjA0LDYgKzYwMSwxMCBAQAogZXh0ZXJuIHMzMiBlMTAwMGVfZGV0ZXJtaW5lX3BoeV9hZGRyZXNzKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogZXh0ZXJuIHMzMiBlMTAwMGVfd3JpdGVfcGh5X3JlZ19ibShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSk7CiBleHRlcm4gczMyIGUxMDAwZV9yZWFkX3BoeV9yZWdfYm0oc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhKTsKK2V4dGVybiBzMzIgZTEwMDBfZW5hYmxlX3BoeV93YWtldXBfcmVnX2FjY2Vzc19ibShzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorCQkJCQkJIHUxNiAqcGh5X3JlZyk7CitleHRlcm4gczMyIGUxMDAwX2Rpc2FibGVfcGh5X3dha2V1cF9yZWdfYWNjZXNzX2JtKHN0cnVjdCBlMTAwMF9odyAqaHcsCisJCQkJCQkgIHUxNiAqcGh5X3JlZyk7CiBleHRlcm4gczMyIGUxMDAwZV9yZWFkX3BoeV9yZWdfYm0yKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiAqZGF0YSk7CiBleHRlcm4gczMyIGUxMDAwZV93cml0ZV9waHlfcmVnX2JtMihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSk7CiBleHRlcm4gdm9pZCBlMTAwMGVfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleF9zZXR1cChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgKnBoeV9jdHJsKTsKQEAgLTYyNCw5ICs2MjUsMTMgQEAKIGV4dGVybiBzMzIgZTEwMDBfcmVhZF9waHlfcmVnX2h2KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiAqZGF0YSk7CiBleHRlcm4gczMyIGUxMDAwX3JlYWRfcGh5X3JlZ19odl9sb2NrZWQoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgKmRhdGEpOworZXh0ZXJuIHMzMiBlMTAwMF9yZWFkX3BoeV9yZWdfcGFnZV9odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LAorCQkJCSAgICAgIHUxNiAqZGF0YSk7CiBleHRlcm4gczMyIGUxMDAwX3dyaXRlX3BoeV9yZWdfaHYoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEpOwogZXh0ZXJuIHMzMiBlMTAwMF93cml0ZV9waHlfcmVnX2h2X2xvY2tlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgZGF0YSk7CitleHRlcm4gczMyIGUxMDAwX3dyaXRlX3BoeV9yZWdfcGFnZV9odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LAorCQkJCSAgICAgICB1MTYgZGF0YSk7CiBleHRlcm4gczMyIGUxMDAwX2xpbmtfc3RhbGxfd29ya2Fyb3VuZF9odihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGV4dGVybiBzMzIgZTEwMDBfY29wcGVyX2xpbmtfc2V0dXBfODI1Nzcoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBleHRlcm4gczMyIGUxMDAwX2NoZWNrX3BvbGFyaXR5XzgyNTc3KHN0cnVjdCBlMTAwMF9odyAqaHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2VzMmxhbi5jIGIvZHJpdmVycy9uZXQvZTEwMDBlL2VzMmxhbi5jCmluZGV4IGY0YmJlYjIuLmMwZWNiMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9lczJsYW4uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvZXMybGFuLmMKQEAgLTgzNiw2ICs4MzYsNyBAQAogCXN0cnVjdCBlMTAwMF9tYWNfaW5mbyAqbWFjID0gJmh3LT5tYWM7CiAJdTMyIHJlZ19kYXRhOwogCXMzMiByZXRfdmFsOworCXUxNiBrdW1fcmVnX2RhdGE7CiAJdTE2IGk7CiAKIAllMTAwMF9pbml0aWFsaXplX2h3X2JpdHNfODAwMDNlczJsYW4oaHcpOwpAQCAtODYxLDYgKzg2MiwxMyBAQAogCS8qIFNldHVwIGxpbmsgYW5kIGZsb3cgY29udHJvbCAqLwogCXJldF92YWwgPSBlMTAwMGVfc2V0dXBfbGluayhodyk7CiAKKwkvKiBEaXNhYmxlIElCSVNUIHNsYXZlIG1vZGUgKGZhci1lbmQgbG9vcGJhY2spICovCisJZTEwMDBfcmVhZF9rbXJuX3JlZ184MDAwM2VzMmxhbihodywgRTEwMDBfS01STkNUUkxTVEFfSU5CQU5EX1BBUkFNLAorCQkJCQkma3VtX3JlZ19kYXRhKTsKKwlrdW1fcmVnX2RhdGEgfD0gRTEwMDBfS01STkNUUkxTVEFfSUJJU1RfRElTQUJMRTsKKwllMTAwMF93cml0ZV9rbXJuX3JlZ184MDAwM2VzMmxhbihodywgRTEwMDBfS01STkNUUkxTVEFfSU5CQU5EX1BBUkFNLAorCQkJCQkga3VtX3JlZ19kYXRhKTsKKwogCS8qIFNldCB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciB3cml0ZS1iYWNrIHBvbGljeSAqLwogCXJlZ19kYXRhID0gZXIzMihUWERDVEwoMCkpOwogCXJlZ19kYXRhID0gKHJlZ19kYXRhICYgfkUxMDAwX1RYRENUTF9XVEhSRVNIKSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZTEwMDBlL2V0aHRvb2wuYwppbmRleCA4NTlkMGQzLi5jYjFhMzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9ldGh0b29sLmMKQEAgLTI4LDYgKzI4LDcgQEAKIAogLyogZXRodG9vbCBzdXBwb3J0IGZvciBlMTAwMCAqLwogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2h3LmggYi9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaAppbmRleCA2YzJmYTgzLi4yOTY3MDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaApAQCAtMjQ2LDYgKzI0Niw3IEBACiAjZGVmaW5lIEJNX1dVQ19FTkFCTEVfUkVHCQkxNwogI2RlZmluZSBCTV9XVUNfRU5BQkxFX0JJVAkJKDEgPDwgMikKICNkZWZpbmUgQk1fV1VDX0hPU1RfV1VfQklUCQkoMSA8PCA0KQorI2RlZmluZSBCTV9XVUNfTUVfV1VfQklUCQkoMSA8PCA1KQogCiAjZGVmaW5lIEJNX1dVQwlQSFlfUkVHKEJNX1dVQ19QQUdFLCAxKQogI2RlZmluZSBCTV9XVUZDIFBIWV9SRUcoQk1fV1VDX1BBR0UsIDIpCkBAIC0zMTIsNiArMzEzLDcgQEAKICNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfRElBR19PRkZTRVQJMHgzICAgIC8qIEt1bWVyYW4gRGlhZ25vc3RpYyAqLwogI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9USU1FT1VUUwkweDQgICAgLyogS3VtZXJhbiBUaW1lb3V0cyAqLwogI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9JTkJBTkRfUEFSQU0JMHg5ICAgIC8qIEt1bWVyYW4gSW5CYW5kIFBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfSUJJU1RfRElTQUJMRQkweDAyMDAgLyogS3VtZXJhbiBJQklTVCBEaXNhYmxlICovCiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX0RJQUdfTkVMUEJLCTB4MTAwMCAvKiBOZWFyZW5kIExvb3BiYWNrIG1vZGUgKi8KICNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfSzFfQ09ORklHCTB4NwogI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9LMV9FTkFCTEUJMHgwMDAyCkBAIC03NzcsNyArNzc5LDIxIEBACiAJczMyICAoKnJlYWRfbWFjX2FkZHIpKHN0cnVjdCBlMTAwMF9odyAqKTsKIH07CiAKLS8qIEZ1bmN0aW9uIHBvaW50ZXJzIGZvciB0aGUgUEhZLiAqLworLyoKKyAqIFdoZW4gdG8gdXNlIHZhcmlvdXMgUEhZIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnM6CisgKgorICogICAgICAgICAgICAgICAgIEZ1bmMgICBDYWxsZXIKKyAqICAgRnVuY3Rpb24gICAgICBEb2VzICAgRG9lcyAgICBXaGVuIHRvIHVzZQorICogICB+fn5+fn5+fn5+fn4gIH5+fn5+ICB+fn5+fn4gIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKiAgIFhfcmVnICAgICAgICAgTCxQLEEgIG4vYSAgICAgZm9yIHNpbXBsZSBQSFkgcmVnIGFjY2Vzc2VzCisgKiAgIFhfcmVnX2xvY2tlZCAgUCxBICAgIEwgICAgICAgZm9yIG11bHRpcGxlIGFjY2Vzc2VzIG9mIGRpZmZlcmVudCByZWdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gZGlmZmVyZW50IHBhZ2VzCisgKiAgIFhfcmVnX3BhZ2UgICAgQSAgICAgIEwsUCAgICAgZm9yIG11bHRpcGxlIGFjY2Vzc2VzIG9mIGRpZmZlcmVudCByZWdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHNhbWUgcGFnZQorICoKKyAqIFdoZXJlIFg9W3JlYWR8d3JpdGVdLCBMPWxvY2tpbmcsIFA9c2V0cyBwYWdlLCBBPXJlZ2lzdGVyIGFjY2VzcworICoKKyAqLwogc3RydWN0IGUxMDAwX3BoeV9vcGVyYXRpb25zIHsKIAlzMzIgICgqYWNxdWlyZSkoc3RydWN0IGUxMDAwX2h3ICopOwogCXMzMiAgKCpjZmdfb25fbGlua191cCkoc3RydWN0IGUxMDAwX2h3ICopOwpAQCAtNzg4LDE0ICs4MDQsMTcgQEAKIAlzMzIgICgqZ2V0X2NmZ19kb25lKShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIAlzMzIgICgqZ2V0X2NhYmxlX2xlbmd0aCkoc3RydWN0IGUxMDAwX2h3ICopOwogCXMzMiAgKCpnZXRfaW5mbykoc3RydWN0IGUxMDAwX2h3ICopOworCXMzMiAgKCpzZXRfcGFnZSkoc3RydWN0IGUxMDAwX2h3ICosIHUxNik7CiAJczMyICAoKnJlYWRfcmVnKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTMyLCB1MTYgKik7CiAJczMyICAoKnJlYWRfcmVnX2xvY2tlZCkoc3RydWN0IGUxMDAwX2h3ICosIHUzMiwgdTE2ICopOworCXMzMiAgKCpyZWFkX3JlZ19wYWdlKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTMyLCB1MTYgKik7CiAJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBlMTAwMF9odyAqKTsKIAlzMzIgICgqcmVzZXQpKHN0cnVjdCBlMTAwMF9odyAqKTsKIAlzMzIgICgqc2V0X2QwX2xwbHVfc3RhdGUpKHN0cnVjdCBlMTAwMF9odyAqLCBib29sKTsKIAlzMzIgICgqc2V0X2QzX2xwbHVfc3RhdGUpKHN0cnVjdCBlMTAwMF9odyAqLCBib29sKTsKIAlzMzIgICgqd3JpdGVfcmVnKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTMyLCB1MTYpOwogCXMzMiAgKCp3cml0ZV9yZWdfbG9ja2VkKShzdHJ1Y3QgZTEwMDBfaHcgKiwgdTMyLCB1MTYpOworCXMzMiAgKCp3cml0ZV9yZWdfcGFnZSkoc3RydWN0IGUxMDAwX2h3ICosIHUzMiwgdTE2KTsKIAl2b2lkICgqcG93ZXJfdXApKHN0cnVjdCBlMTAwMF9odyAqKTsKIAl2b2lkICgqcG93ZXJfZG93bikoc3RydWN0IGUxMDAwX2h3ICopOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvaWNoOGxhbi5jCmluZGV4IDMzNjlkMWYuLmMxNzUyMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYwpAQCAtMjc1LDYgKzI3NSwxOSBAQAogI2RlZmluZSBldzE2Zmxhc2gocmVnLHZhbCkJX19ldzE2Zmxhc2goaHcsIChyZWcpLCAodmFsKSkKICNkZWZpbmUgZXczMmZsYXNoKHJlZyx2YWwpCV9fZXczMmZsYXNoKGh3LCAocmVnKSwgKHZhbCkpCiAKK3N0YXRpYyB2b2lkIGUxMDAwX3RvZ2dsZV9sYW5waHlwY192YWx1ZV9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdTMyIGN0cmw7CisKKwljdHJsID0gZXIzMihDVFJMKTsKKwljdHJsIHw9IEUxMDAwX0NUUkxfTEFOUEhZUENfT1ZFUlJJREU7CisJY3RybCAmPSB+RTEwMDBfQ1RSTF9MQU5QSFlQQ19WQUxVRTsKKwlldzMyKENUUkwsIGN0cmwpOworCXVkZWxheSgxMCk7CisJY3RybCAmPSB+RTEwMDBfQ1RSTF9MQU5QSFlQQ19PVkVSUklERTsKKwlldzMyKENUUkwsIGN0cmwpOworfQorCiAvKioKICAqICBlMTAwMF9pbml0X3BoeV9wYXJhbXNfcGNobGFuIC0gSW5pdGlhbGl6ZSBQSFkgZnVuY3Rpb24gcG9pbnRlcnMKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQpAQCAtMjg0LDE4ICsyOTcsMjEgQEAKIHN0YXRpYyBzMzIgZTEwMDBfaW5pdF9waHlfcGFyYW1zX3BjaGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewogCXN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5ID0gJmh3LT5waHk7Ci0JdTMyIGN0cmwsIGZ3c207CisJdTMyIGZ3c207CiAJczMyIHJldF92YWwgPSAwOwogCiAJcGh5LT5hZGRyICAgICAgICAgICAgICAgICAgICAgPSAxOwogCXBoeS0+cmVzZXRfZGVsYXlfdXMgICAgICAgICAgID0gMTAwOwogCisJcGh5LT5vcHMuc2V0X3BhZ2UgICAgICAgICAgICAgPSBlMTAwMF9zZXRfcGFnZV9pZ3A7CiAJcGh5LT5vcHMucmVhZF9yZWcgICAgICAgICAgICAgPSBlMTAwMF9yZWFkX3BoeV9yZWdfaHY7CiAJcGh5LT5vcHMucmVhZF9yZWdfbG9ja2VkICAgICAgPSBlMTAwMF9yZWFkX3BoeV9yZWdfaHZfbG9ja2VkOworCXBoeS0+b3BzLnJlYWRfcmVnX3BhZ2UgICAgICAgID0gZTEwMDBfcmVhZF9waHlfcmVnX3BhZ2VfaHY7CiAJcGh5LT5vcHMuc2V0X2QwX2xwbHVfc3RhdGUgICAgPSBlMTAwMF9zZXRfbHBsdV9zdGF0ZV9wY2hsYW47CiAJcGh5LT5vcHMuc2V0X2QzX2xwbHVfc3RhdGUgICAgPSBlMTAwMF9zZXRfbHBsdV9zdGF0ZV9wY2hsYW47CiAJcGh5LT5vcHMud3JpdGVfcmVnICAgICAgICAgICAgPSBlMTAwMF93cml0ZV9waHlfcmVnX2h2OwogCXBoeS0+b3BzLndyaXRlX3JlZ19sb2NrZWQgICAgID0gZTEwMDBfd3JpdGVfcGh5X3JlZ19odl9sb2NrZWQ7CisJcGh5LT5vcHMud3JpdGVfcmVnX3BhZ2UgICAgICAgPSBlMTAwMF93cml0ZV9waHlfcmVnX3BhZ2VfaHY7CiAJcGh5LT5vcHMucG93ZXJfdXAgICAgICAgICAgICAgPSBlMTAwMF9wb3dlcl91cF9waHlfY29wcGVyOwogCXBoeS0+b3BzLnBvd2VyX2Rvd24gICAgICAgICAgID0gZTEwMDBfcG93ZXJfZG93bl9waHlfY29wcGVyX2ljaDhsYW47CiAJcGh5LT5hdXRvbmVnX21hc2sgICAgICAgICAgICAgPSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUOwpAQCAtMzA4LDEzICszMjQsNyBAQAogCSAqLwogCWZ3c20gPSBlcjMyKEZXU00pOwogCWlmICghKGZ3c20gJiBFMTAwMF9JQ0hfRldTTV9GV19WQUxJRCkgJiYgIWUxMDAwX2NoZWNrX3Jlc2V0X2Jsb2NrKGh3KSkgewotCQljdHJsID0gZXIzMihDVFJMKTsKLQkJY3RybCB8PSBFMTAwMF9DVFJMX0xBTlBIWVBDX09WRVJSSURFOwotCQljdHJsICY9IH5FMTAwMF9DVFJMX0xBTlBIWVBDX1ZBTFVFOwotCQlldzMyKENUUkwsIGN0cmwpOwotCQl1ZGVsYXkoMTApOwotCQljdHJsICY9IH5FMTAwMF9DVFJMX0xBTlBIWVBDX09WRVJSSURFOwotCQlldzMyKENUUkwsIGN0cmwpOworCQllMTAwMF90b2dnbGVfbGFucGh5cGNfdmFsdWVfaWNoOGxhbihodyk7CiAJCW1zbGVlcCg1MCk7CiAKIAkJLyoKQEAgLTg4Miw4ICs4OTIsMTMgQEAKIAl1MzIgZXh0Y25mX2N0cmw7CiAKIAlleHRjbmZfY3RybCA9IGVyMzIoRVhUQ05GX0NUUkwpOwotCWV4dGNuZl9jdHJsICY9IH5FMTAwMF9FWFRDTkZfQ1RSTF9TV0ZMQUc7Ci0JZXczMihFWFRDTkZfQ1RSTCwgZXh0Y25mX2N0cmwpOworCisJaWYgKGV4dGNuZl9jdHJsICYgRTEwMDBfRVhUQ05GX0NUUkxfU1dGTEFHKSB7CisJCWV4dGNuZl9jdHJsICY9IH5FMTAwMF9FWFRDTkZfQ1RSTF9TV0ZMQUc7CisJCWV3MzIoRVhUQ05GX0NUUkwsIGV4dGNuZl9jdHJsKTsKKwl9IGVsc2UgeworCQllX2RiZygiU2VtYXBob3JlIHVuZXhwZWN0ZWRseSByZWxlYXNlZCBieSBzdy9mdy9od1xuIik7CisJfQogCiAJbXV0ZXhfdW5sb2NrKCZzd2ZsYWdfbXV0ZXgpOwogfQpAQCAtMTM3NiwxNCArMTM5MSwxMSBAQAogCXJldF92YWwgPSBody0+cGh5Lm9wcy5hY3F1aXJlKGh3KTsKIAlpZiAocmV0X3ZhbCkKIAkJZ290byBvdXQ7Ci0JcmV0X3ZhbCA9IGh3LT5waHkub3BzLnJlYWRfcmVnX2xvY2tlZChodywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIWV9SRUcoQk1fUE9SVF9DVFJMX1BBR0UsIDE3KSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisJcmV0X3ZhbCA9IGh3LT5waHkub3BzLnJlYWRfcmVnX2xvY2tlZChodywgQk1fUE9SVF9HRU5fQ0ZHLCAmcGh5X2RhdGEpOwogCWlmIChyZXRfdmFsKQogCQlnb3RvIHJlbGVhc2U7Ci0JcmV0X3ZhbCA9IGh3LT5waHkub3BzLndyaXRlX3JlZ19sb2NrZWQoaHcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX1JFRyhCTV9QT1JUX0NUUkxfUEFHRSwgMTcpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhICYgMHgwMEZGKTsKKwlyZXRfdmFsID0gaHctPnBoeS5vcHMud3JpdGVfcmVnX2xvY2tlZChodywgQk1fUE9SVF9HRU5fQ0ZHLAorCQkJCQkgICAgICAgcGh5X2RhdGEgJiAweDAwRkYpOwogcmVsZWFzZToKIAlody0+cGh5Lm9wcy5yZWxlYXNlKGh3KTsKIG91dDoKQEAgLTEzOTcsMTcgKzE0MDksMzYgQEAKIHZvaWQgZTEwMDBfY29weV9yeF9hZGRyc190b19waHlfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewogCXUzMiBtYWNfcmVnOwotCXUxNiBpOworCXUxNiBpLCBwaHlfcmVnID0gMDsKKwlzMzIgcmV0X3ZhbDsKKworCXJldF92YWwgPSBody0+cGh5Lm9wcy5hY3F1aXJlKGh3KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuOworCXJldF92YWwgPSBlMTAwMF9lbmFibGVfcGh5X3dha2V1cF9yZWdfYWNjZXNzX2JtKGh3LCAmcGh5X3JlZyk7CisJaWYgKHJldF92YWwpCisJCWdvdG8gcmVsZWFzZTsKIAogCS8qIENvcHkgYm90aCBSQUwvSCAocmFyX2VudHJ5X2NvdW50KSBhbmQgU0hSQUwvSCAoKzQpIHRvIFBIWSAqLwogCWZvciAoaSA9IDA7IGkgPCAoaHctPm1hYy5yYXJfZW50cnlfY291bnQgKyA0KTsgaSsrKSB7CiAJCW1hY19yZWcgPSBlcjMyKFJBTChpKSk7Ci0JCWUxZV93cGh5KGh3LCBCTV9SQVJfTChpKSwgKHUxNikobWFjX3JlZyAmIDB4RkZGRikpOwotCQllMWVfd3BoeShodywgQk1fUkFSX00oaSksICh1MTYpKChtYWNfcmVnID4+IDE2KSAmIDB4RkZGRikpOworCQlody0+cGh5Lm9wcy53cml0ZV9yZWdfcGFnZShodywgQk1fUkFSX0woaSksCisJCQkJCSAgICh1MTYpKG1hY19yZWcgJiAweEZGRkYpKTsKKwkJaHctPnBoeS5vcHMud3JpdGVfcmVnX3BhZ2UoaHcsIEJNX1JBUl9NKGkpLAorCQkJCQkgICAodTE2KSgobWFjX3JlZyA+PiAxNikgJiAweEZGRkYpKTsKKwogCQltYWNfcmVnID0gZXIzMihSQUgoaSkpOwotCQllMWVfd3BoeShodywgQk1fUkFSX0goaSksICh1MTYpKG1hY19yZWcgJiAweEZGRkYpKTsKLQkJZTFlX3dwaHkoaHcsIEJNX1JBUl9DVFJMKGkpLCAodTE2KSgobWFjX3JlZyA+PiAxNikgJiAweDgwMDApKTsKKwkJaHctPnBoeS5vcHMud3JpdGVfcmVnX3BhZ2UoaHcsIEJNX1JBUl9IKGkpLAorCQkJCQkgICAodTE2KShtYWNfcmVnICYgMHhGRkZGKSk7CisJCWh3LT5waHkub3BzLndyaXRlX3JlZ19wYWdlKGh3LCBCTV9SQVJfQ1RSTChpKSwKKwkJCQkJICAgKHUxNikoKG1hY19yZWcgJiBFMTAwMF9SQUhfQVYpCisJCQkJCQkgPj4gMTYpKTsKIAl9CisKKwllMTAwMF9kaXNhYmxlX3BoeV93YWtldXBfcmVnX2FjY2Vzc19ibShodywgJnBoeV9yZWcpOworCityZWxlYXNlOgorCWh3LT5waHkub3BzLnJlbGVhc2UoaHcpOwogfQogCiAvKioKQEAgLTE3MjYsOSArMTc1NywxMiBAQAogCQlicmVhazsKIAl9CiAKLQkvKiBEdW1teSByZWFkIHRvIGNsZWFyIHRoZSBwaHkgd2FrZXVwIGJpdCBhZnRlciBsY2QgcmVzZXQgKi8KLQlpZiAoaHctPm1hYy50eXBlID49IGUxMDAwX3BjaGxhbikKLQkJZTFlX3JwaHkoaHcsIEJNX1dVQywgJnJlZyk7CisJLyogQ2xlYXIgdGhlIGhvc3Qgd2FrZXVwIGJpdCBhZnRlciBsY2QgcmVzZXQgKi8KKwlpZiAoaHctPm1hYy50eXBlID49IGUxMDAwX3BjaGxhbikgeworCQllMWVfcnBoeShodywgQk1fUE9SVF9HRU5fQ0ZHLCAmcmVnKTsKKwkJcmVnICY9IH5CTV9XVUNfSE9TVF9XVV9CSVQ7CisJCWUxZV93cGh5KGh3LCBCTV9QT1JUX0dFTl9DRkcsIHJlZyk7CisJfQogCiAJLyogQ29uZmlndXJlIHRoZSBMQ0Qgd2l0aCB0aGUgZXh0ZW5kZWQgY29uZmlndXJhdGlvbiByZWdpb24gaW4gTlZNICovCiAJcmV0X3ZhbCA9IGUxMDAwX3N3X2xjZF9jb25maWdfaWNoOGxhbihodyk7CkBAIC0zMDU5LDcgKzMwOTMsNyBAQAogCW1zbGVlcCgyMCk7CiAKIAlpZiAoIXJldF92YWwpCi0JCWUxMDAwX3JlbGVhc2Vfc3dmbGFnX2ljaDhsYW4oaHcpOworCQltdXRleF91bmxvY2soJnN3ZmxhZ19tdXRleCk7CiAKIAlpZiAoY3RybCAmIEUxMDAwX0NUUkxfUEhZX1JTVCkgewogCQlyZXRfdmFsID0gaHctPnBoeS5vcHMuZ2V0X2NmZ19kb25lKGh3KTsKQEAgLTMxMjcsMTEgKzMxNjEsMTMgQEAKIAogCS8qCiAJICogVGhlIDgyNTc4IFJ4IGJ1ZmZlciB3aWxsIHN0YWxsIGlmIHdha2V1cCBpcyBlbmFibGVkIGluIGhvc3QgYW5kCi0JICogdGhlIE1FLiAgUmVhZGluZyB0aGUgQk1fV1VDIHJlZ2lzdGVyIHdpbGwgY2xlYXIgdGhlIGhvc3Qgd2FrZXVwIGJpdC4KKwkgKiB0aGUgTUUuICBEaXNhYmxlIHdha2V1cCBieSBjbGVhcmluZyB0aGUgaG9zdCB3YWtldXAgYml0LgogCSAqIFJlc2V0IHRoZSBwaHkgYWZ0ZXIgZGlzYWJsaW5nIGhvc3Qgd2FrZXVwIHRvIHJlc2V0IHRoZSBSeCBidWZmZXIuCiAJICovCiAJaWYgKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfODI1NzgpIHsKLQkJZTFlX3JwaHkoaHcsIEJNX1dVQywgJmkpOworCQllMWVfcnBoeShodywgQk1fUE9SVF9HRU5fQ0ZHLCAmaSk7CisJCWkgJj0gfkJNX1dVQ19IT1NUX1dVX0JJVDsKKwkJZTFlX3dwaHkoaHcsIEJNX1BPUlRfR0VOX0NGRywgaSk7CiAJCXJldF92YWwgPSBlMTAwMF9waHlfaHdfcmVzZXRfaWNoOGxhbihodyk7CiAJCWlmIChyZXRfdmFsKQogCQkJcmV0dXJuIHJldF92YWw7CkBAIC0zNTg2LDE3ICszNjIyLDE2IEBACiB9CiAKIC8qKgotICogIGUxMDAwZV9kaXNhYmxlX2dpZ193b2xfaWNoOGxhbiAtIGRpc2FibGUgZ2lnIGR1cmluZyBXb0wKKyAqICBlMTAwMF9zdXNwZW5kX3dvcmthcm91bmRzX2ljaDhsYW4gLSB3b3JrYXJvdW5kcyBuZWVkZWQgZHVyaW5nIFMwLT5TeAogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKgogICogIER1cmluZyBTMCB0byBTeCB0cmFuc2l0aW9uLCBpdCBpcyBwb3NzaWJsZSB0aGUgbGluayByZW1haW5zIGF0IGdpZwogICogIGluc3RlYWQgb2YgbmVnb3RpYXRpbmcgdG8gYSBsb3dlciBzcGVlZC4gIEJlZm9yZSBnb2luZyB0byBTeCwgc2V0CiAgKiAgJ0xQTFUgRW5hYmxlZCcgYW5kICdHaWcgRGlzYWJsZScgdG8gZm9yY2UgbGluayBzcGVlZCBuZWdvdGlhdGlvbgotICogIHRvIGEgbG93ZXIgc3BlZWQuCi0gKgotICogIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgYXBwbGljYWJsZSBwYXJ0cy4KKyAqICB0byBhIGxvd2VyIHNwZWVkLiAgRm9yIFBDSCBhbmQgbmV3ZXIgcGFydHMsIHRoZSBPRU0gYml0cyBQSFkgcmVnaXN0ZXIKKyAqICAoTEVELCBHYkUgZGlzYWJsZSBhbmQgTFBMVSBjb25maWd1cmF0aW9ucykgYWxzbyBuZWVkcyB0byBiZSB3cml0dGVuLgogICoqLwotdm9pZCBlMTAwMGVfZGlzYWJsZV9naWdfd29sX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodykKK3ZvaWQgZTEwMDBfc3VzcGVuZF93b3JrYXJvdW5kc19pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CiAJdTMyIHBoeV9jdHJsOwogCXMzMiByZXRfdmFsOwpAQCAtMzYxNiw2ICszNjUxLDYwIEBACiB9CiAKIC8qKgorICogIGUxMDAwX3Jlc3VtZV93b3JrYXJvdW5kc19wY2hsYW4gLSB3b3JrYXJvdW5kcyBuZWVkZWQgZHVyaW5nIFN4LT5TMAorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKgorICogIER1cmluZyBTeCB0byBTMCB0cmFuc2l0aW9ucyBvbiBub24tbWFuYWdlZCBkZXZpY2VzIG9yIG1hbmFnZWQgZGV2aWNlcworICogIG9uIHdoaWNoIFBIWSByZXNldHMgYXJlIG5vdCBibG9ja2VkLCBpZiB0aGUgUEhZIHJlZ2lzdGVycyBjYW5ub3QgYmUKKyAqICBhY2Nlc3NlZCBwcm9wZXJseSBieSB0aGUgcy93IHRvZ2dsZSB0aGUgTEFOUEhZUEMgdmFsdWUgdG8gcG93ZXIgY3ljbGUKKyAqICB0aGUgUEhZLgorICoqLwordm9pZCBlMTAwMF9yZXN1bWVfd29ya2Fyb3VuZHNfcGNobGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdTMyIGZ3c207CisKKwlpZiAoaHctPm1hYy50eXBlICE9IGUxMDAwX3BjaDJsYW4pCisJCXJldHVybjsKKworCWZ3c20gPSBlcjMyKEZXU00pOworCWlmICghKGZ3c20gJiBFMTAwMF9JQ0hfRldTTV9GV19WQUxJRCkgfHwgIWUxMDAwX2NoZWNrX3Jlc2V0X2Jsb2NrKGh3KSkgeworCQl1MTYgcGh5X2lkMSwgcGh5X2lkMjsKKwkJczMyIHJldF92YWw7CisKKwkJcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmUoaHcpOworCQlpZiAocmV0X3ZhbCkgeworCQkJZV9kYmcoIkZhaWxlZCB0byBhY3F1aXJlIFBIWSBzZW1hcGhvcmUgaW4gcmVzdW1lXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIFRlc3QgYWNjZXNzIHRvIHRoZSBQSFkgcmVnaXN0ZXJzIGJ5IHJlYWRpbmcgdGhlIElEIHJlZ3MgKi8KKwkJcmV0X3ZhbCA9IGh3LT5waHkub3BzLnJlYWRfcmVnX2xvY2tlZChodywgUEhZX0lEMSwgJnBoeV9pZDEpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gcmVsZWFzZTsKKwkJcmV0X3ZhbCA9IGh3LT5waHkub3BzLnJlYWRfcmVnX2xvY2tlZChodywgUEhZX0lEMiwgJnBoeV9pZDIpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gcmVsZWFzZTsKKworCQlpZiAoaHctPnBoeS5pZCA9PSAoKHUzMikocGh5X2lkMSA8PCAxNikgfAorCQkJCSAgICh1MzIpKHBoeV9pZDIgJiBQSFlfUkVWSVNJT05fTUFTSykpKQorCQkJZ290byByZWxlYXNlOworCisJCWUxMDAwX3RvZ2dsZV9sYW5waHlwY192YWx1ZV9pY2g4bGFuKGh3KTsKKworCQlody0+cGh5Lm9wcy5yZWxlYXNlKGh3KTsKKwkJbXNsZWVwKDUwKTsKKwkJZTEwMDBfcGh5X2h3X3Jlc2V0KGh3KTsKKwkJbXNsZWVwKDUwKTsKKwkJcmV0dXJuOworCX0KKworcmVsZWFzZToKKwlody0+cGh5Lm9wcy5yZWxlYXNlKGh3KTsKKworCXJldHVybjsKK30KKworLyoqCiAgKiAgZTEwMDBfY2xlYW51cF9sZWRfaWNoOGxhbiAtIFJlc3RvcmUgdGhlIGRlZmF1bHQgTEVEIG9wZXJhdGlvbgogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKgpAQCAtMzgzMiw2ICszOTIxLDcgQEAKIHN0YXRpYyB2b2lkIGUxMDAwX2NsZWFyX2h3X2NudHJzX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodykKIHsKIAl1MTYgcGh5X2RhdGE7CisJczMyIHJldF92YWw7CiAKIAllMTAwMGVfY2xlYXJfaHdfY250cnNfYmFzZShodyk7CiAKQEAgLTM4NTMsMjAgKzM5NDMsMjkgQEAKIAlpZiAoKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfODI1NzgpIHx8CiAJICAgIChody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5XzgyNTc5KSB8fAogCSAgICAoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV84MjU3NykpIHsKLQkJZTFlX3JwaHkoaHcsIEhWX1NDQ19VUFBFUiwgJnBoeV9kYXRhKTsKLQkJZTFlX3JwaHkoaHcsIEhWX1NDQ19MT1dFUiwgJnBoeV9kYXRhKTsKLQkJZTFlX3JwaHkoaHcsIEhWX0VDT0xfVVBQRVIsICZwaHlfZGF0YSk7Ci0JCWUxZV9ycGh5KGh3LCBIVl9FQ09MX0xPV0VSLCAmcGh5X2RhdGEpOwotCQllMWVfcnBoeShodywgSFZfTUNDX1VQUEVSLCAmcGh5X2RhdGEpOwotCQllMWVfcnBoeShodywgSFZfTUNDX0xPV0VSLCAmcGh5X2RhdGEpOwotCQllMWVfcnBoeShodywgSFZfTEFURUNPTF9VUFBFUiwgJnBoeV9kYXRhKTsKLQkJZTFlX3JwaHkoaHcsIEhWX0xBVEVDT0xfTE9XRVIsICZwaHlfZGF0YSk7Ci0JCWUxZV9ycGh5KGh3LCBIVl9DT0xDX1VQUEVSLCAmcGh5X2RhdGEpOwotCQllMWVfcnBoeShodywgSFZfQ09MQ19MT1dFUiwgJnBoeV9kYXRhKTsKLQkJZTFlX3JwaHkoaHcsIEhWX0RDX1VQUEVSLCAmcGh5X2RhdGEpOwotCQllMWVfcnBoeShodywgSFZfRENfTE9XRVIsICZwaHlfZGF0YSk7Ci0JCWUxZV9ycGh5KGh3LCBIVl9UTkNSU19VUFBFUiwgJnBoeV9kYXRhKTsKLQkJZTFlX3JwaHkoaHcsIEhWX1ROQ1JTX0xPV0VSLCAmcGh5X2RhdGEpOworCQlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZShodyk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuOworCQlyZXRfdmFsID0gaHctPnBoeS5vcHMuc2V0X3BhZ2UoaHcsCisJCQkJCSAgICAgICBIVl9TVEFUU19QQUdFIDw8IElHUF9QQUdFX1NISUZUKTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIHJlbGVhc2U7CisJCWh3LT5waHkub3BzLnJlYWRfcmVnX3BhZ2UoaHcsIEhWX1NDQ19VUFBFUiwgJnBoeV9kYXRhKTsKKwkJaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfU0NDX0xPV0VSLCAmcGh5X2RhdGEpOworCQlody0+cGh5Lm9wcy5yZWFkX3JlZ19wYWdlKGh3LCBIVl9FQ09MX1VQUEVSLCAmcGh5X2RhdGEpOworCQlody0+cGh5Lm9wcy5yZWFkX3JlZ19wYWdlKGh3LCBIVl9FQ09MX0xPV0VSLCAmcGh5X2RhdGEpOworCQlody0+cGh5Lm9wcy5yZWFkX3JlZ19wYWdlKGh3LCBIVl9NQ0NfVVBQRVIsICZwaHlfZGF0YSk7CisJCWh3LT5waHkub3BzLnJlYWRfcmVnX3BhZ2UoaHcsIEhWX01DQ19MT1dFUiwgJnBoeV9kYXRhKTsKKwkJaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfTEFURUNPTF9VUFBFUiwgJnBoeV9kYXRhKTsKKwkJaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfTEFURUNPTF9MT1dFUiwgJnBoeV9kYXRhKTsKKwkJaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfQ09MQ19VUFBFUiwgJnBoeV9kYXRhKTsKKwkJaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfQ09MQ19MT1dFUiwgJnBoeV9kYXRhKTsKKwkJaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfRENfVVBQRVIsICZwaHlfZGF0YSk7CisJCWh3LT5waHkub3BzLnJlYWRfcmVnX3BhZ2UoaHcsIEhWX0RDX0xPV0VSLCAmcGh5X2RhdGEpOworCQlody0+cGh5Lm9wcy5yZWFkX3JlZ19wYWdlKGh3LCBIVl9UTkNSU19VUFBFUiwgJnBoeV9kYXRhKTsKKwkJaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfVE5DUlNfTE9XRVIsICZwaHlfZGF0YSk7CityZWxlYXNlOgorCQlody0+cGh5Lm9wcy5yZWxlYXNlKGh3KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9saWIuYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9saWIuYwppbmRleCBkZDhhYjA1Li42NTU4MGI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2xpYi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9saWIuYwpAQCAtNTYsNyArNTYsNyBAQAogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gaHctPmFkYXB0ZXI7CiAJdTE2IHBjaWVfbGlua19zdGF0dXMsIGNhcF9vZmZzZXQ7CiAKLQljYXBfb2Zmc2V0ID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShhZGFwdGVyLT5wZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJY2FwX29mZnNldCA9IGFkYXB0ZXItPnBkZXYtPnBjaWVfY2FwOwogCWlmICghY2FwX29mZnNldCkgewogCQlidXMtPndpZHRoID0gZTEwMDBfYnVzX3dpZHRoX3Vua25vd247CiAJfSBlbHNlIHsKQEAgLTIyMCw3ICsyMjAsNyBAQAogCX0KIAogCS8qIGlmIG11bHRpY2FzdCBiaXQgaXMgc2V0LCB0aGUgYWx0ZXJuYXRlIGFkZHJlc3Mgd2lsbCBub3QgYmUgdXNlZCAqLwotCWlmIChhbHRfbWFjX2FkZHJbMF0gJiAweDAxKSB7CisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGFsdF9tYWNfYWRkcikpIHsKIAkJZV9kYmcoIklnbm9yaW5nIEFsdGVybmF0ZSBNYWMgQWRkcmVzcyB3aXRoIE1DIGJpdCBzZXRcbiIpOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMKaW5kZXggMzMxMGMzZC4uNDM1M2FkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CkBAIC01Myw5ICs1NCw5IEBACiAKICNpbmNsdWRlICJlMTAwMC5oIgogCi0jZGVmaW5lIERSVl9FWFRSQVZFUlNJT04gIi1rMiIKKyNkZWZpbmUgRFJWX0VYVFJBVkVSU0lPTiAiLWsiCiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjEuMy4xMCIgRFJWX0VYVFJBVkVSU0lPTgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMS4zLjE2IiBEUlZfRVhUUkFWRVJTSU9OCiBjaGFyIGUxMDAwZV9kcml2ZXJfbmFtZVtdID0gImUxMDAwZSI7CiBjb25zdCBjaGFyIGUxMDAwZV9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiAKQEAgLTUyMiw3ICs1MjMsNyBAQAogICogQGFkYXB0ZXI6IGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqKi8KIHN0YXRpYyB2b2lkIGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgaW50IGNsZWFuZWRfY291bnQpCisJCQkJICAgaW50IGNsZWFuZWRfY291bnQsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKQEAgLTU0Myw3ICs1NDQsNyBAQAogCQkJZ290byBtYXBfc2tiOwogCQl9CiAKLQkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihuZXRkZXYsIGJ1ZnN6KTsKKwkJc2tiID0gX19uZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5ldGRldiwgYnVmc3osIGdmcCk7CiAJCWlmICghc2tiKSB7CiAJCQkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kICovCiAJCQlhZGFwdGVyLT5hbGxvY19yeF9idWZmX2ZhaWxlZCsrOwpAQCAtNTg4LDcgKzU4OSw3IEBACiAgKiBAYWRhcHRlcjogYWRkcmVzcyBvZiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQogICoqLwogc3RhdGljIHZvaWQgZTEwMDBfYWxsb2NfcnhfYnVmZmVyc19wcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICAgICBpbnQgY2xlYW5lZF9jb3VudCkKKwkJCQkgICAgICBpbnQgY2xlYW5lZF9jb3VudCwgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwpAQCAtNjE0LDcgKzYxNSw3IEBACiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlpZiAoIXBzX3BhZ2UtPnBhZ2UpIHsKLQkJCQlwc19wYWdlLT5wYWdlID0gYWxsb2NfcGFnZShHRlBfQVRPTUlDKTsKKwkJCQlwc19wYWdlLT5wYWdlID0gYWxsb2NfcGFnZShnZnApOwogCQkJCWlmICghcHNfcGFnZS0+cGFnZSkgewogCQkJCQlhZGFwdGVyLT5hbGxvY19yeF9idWZmX2ZhaWxlZCsrOwogCQkJCQlnb3RvIG5vX2J1ZmZlcnM7CkBAIC02NDAsOCArNjQxLDkgQEAKIAkJCSAgICBjcHVfdG9fbGU2NChwc19wYWdlLT5kbWEpOwogCQl9CiAKLQkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihuZXRkZXYsCi0JCQkJCQlhZGFwdGVyLT5yeF9wc19ic2l6ZTApOworCQlza2IgPSBfX25ldGRldl9hbGxvY19za2JfaXBfYWxpZ24obmV0ZGV2LAorCQkJCQkJICBhZGFwdGVyLT5yeF9wc19ic2l6ZTAsCisJCQkJCQkgIGdmcCk7CiAKIAkJaWYgKCFza2IpIHsKIAkJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZmZfZmFpbGVkKys7CkBAIC02OTEsNyArNjkzLDcgQEAKICAqKi8KIAogc3RhdGljIHZvaWQgZTEwMDBfYWxsb2NfanVtYm9fcnhfYnVmZmVycyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsZWFuZWRfY291bnQpCisJCQkJCSBpbnQgY2xlYW5lZF9jb3VudCwgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwpAQCAtNzEyLDcgKzcxNCw3IEBACiAJCQlnb3RvIGNoZWNrX3BhZ2U7CiAJCX0KIAotCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5ldGRldiwgYnVmc3opOworCQlza2IgPSBfX25ldGRldl9hbGxvY19za2JfaXBfYWxpZ24obmV0ZGV2LCBidWZzeiwgZ2ZwKTsKIAkJaWYgKHVubGlrZWx5KCFza2IpKSB7CiAJCQkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kICovCiAJCQlhZGFwdGVyLT5hbGxvY19yeF9idWZmX2ZhaWxlZCsrOwpAQCAtNzIzLDcgKzcyNSw3IEBACiBjaGVja19wYWdlOgogCQkvKiBhbGxvY2F0ZSBhIG5ldyBwYWdlIGlmIG5lY2Vzc2FyeSAqLwogCQlpZiAoIWJ1ZmZlcl9pbmZvLT5wYWdlKSB7Ci0JCQlidWZmZXJfaW5mby0+cGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyk7CisJCQlidWZmZXJfaW5mby0+cGFnZSA9IGFsbG9jX3BhZ2UoZ2ZwKTsKIAkJCWlmICh1bmxpa2VseSghYnVmZmVyX2luZm8tPnBhZ2UpKSB7CiAJCQkJYWRhcHRlci0+YWxsb2NfcnhfYnVmZl9mYWlsZWQrKzsKIAkJCQlicmVhazsKQEAgLTg4Nyw3ICs4ODksOCBAQAogCiAJCS8qIHJldHVybiBzb21lIGJ1ZmZlcnMgdG8gaGFyZHdhcmUsIG9uZSBhdCBhIHRpbWUgaXMgdG9vIHNsb3cgKi8KIAkJaWYgKGNsZWFuZWRfY291bnQgPj0gRTEwMDBfUlhfQlVGRkVSX1dSSVRFKSB7Ci0JCQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgY2xlYW5lZF9jb3VudCk7CisJCQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgY2xlYW5lZF9jb3VudCwKKwkJCQkJICAgICAgR0ZQX0FUT01JQyk7CiAJCQljbGVhbmVkX2NvdW50ID0gMDsKIAkJfQogCkBAIC04OTksNyArOTAyLDcgQEAKIAogCWNsZWFuZWRfY291bnQgPSBlMTAwMF9kZXNjX3VudXNlZChyeF9yaW5nKTsKIAlpZiAoY2xlYW5lZF9jb3VudCkKLQkJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIsIGNsZWFuZWRfY291bnQpOworCQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgY2xlYW5lZF9jb3VudCwgR0ZQX0FUT01JQyk7CiAKIAlhZGFwdGVyLT50b3RhbF9yeF9ieXRlcyArPSB0b3RhbF9yeF9ieXRlczsKIAlhZGFwdGVyLT50b3RhbF9yeF9wYWNrZXRzICs9IHRvdGFsX3J4X3BhY2tldHM7CkBAIC0xMjI5LDcgKzEyMzIsOCBAQAogCiAJCS8qIHJldHVybiBzb21lIGJ1ZmZlcnMgdG8gaGFyZHdhcmUsIG9uZSBhdCBhIHRpbWUgaXMgdG9vIHNsb3cgKi8KIAkJaWYgKGNsZWFuZWRfY291bnQgPj0gRTEwMDBfUlhfQlVGRkVSX1dSSVRFKSB7Ci0JCQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgY2xlYW5lZF9jb3VudCk7CisJCQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgY2xlYW5lZF9jb3VudCwKKwkJCQkJICAgICAgR0ZQX0FUT01JQyk7CiAJCQljbGVhbmVkX2NvdW50ID0gMDsKIAkJfQogCkBAIC0xMjQzLDcgKzEyNDcsNyBAQAogCiAJY2xlYW5lZF9jb3VudCA9IGUxMDAwX2Rlc2NfdW51c2VkKHJ4X3JpbmcpOwogCWlmIChjbGVhbmVkX2NvdW50KQotCQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgY2xlYW5lZF9jb3VudCk7CisJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZihhZGFwdGVyLCBjbGVhbmVkX2NvdW50LCBHRlBfQVRPTUlDKTsKIAogCWFkYXB0ZXItPnRvdGFsX3J4X2J5dGVzICs9IHRvdGFsX3J4X2J5dGVzOwogCWFkYXB0ZXItPnRvdGFsX3J4X3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKQEAgLTE0MTAsNyArMTQxNCw4IEBACiAKIAkJLyogcmV0dXJuIHNvbWUgYnVmZmVycyB0byBoYXJkd2FyZSwgb25lIGF0IGEgdGltZSBpcyB0b28gc2xvdyAqLwogCQlpZiAodW5saWtlbHkoY2xlYW5lZF9jb3VudCA+PSBFMTAwMF9SWF9CVUZGRVJfV1JJVEUpKSB7Ci0JCQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgY2xlYW5lZF9jb3VudCk7CisJCQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgY2xlYW5lZF9jb3VudCwKKwkJCQkJICAgICAgR0ZQX0FUT01JQyk7CiAJCQljbGVhbmVkX2NvdW50ID0gMDsKIAkJfQogCkBAIC0xNDIyLDcgKzE0MjcsNyBAQAogCiAJY2xlYW5lZF9jb3VudCA9IGUxMDAwX2Rlc2NfdW51c2VkKHJ4X3JpbmcpOwogCWlmIChjbGVhbmVkX2NvdW50KQotCQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgY2xlYW5lZF9jb3VudCk7CisJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZihhZGFwdGVyLCBjbGVhbmVkX2NvdW50LCBHRlBfQVRPTUlDKTsKIAogCWFkYXB0ZXItPnRvdGFsX3J4X2J5dGVzICs9IHRvdGFsX3J4X2J5dGVzOwogCWFkYXB0ZXItPnRvdGFsX3J4X3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKQEAgLTMxMDQsNyArMzEwOSw4IEBACiAJZTEwMDBfY29uZmlndXJlX3R4KGFkYXB0ZXIpOwogCWUxMDAwX3NldHVwX3JjdGwoYWRhcHRlcik7CiAJZTEwMDBfY29uZmlndXJlX3J4KGFkYXB0ZXIpOwotCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZihhZGFwdGVyLCBlMTAwMF9kZXNjX3VudXNlZChhZGFwdGVyLT5yeF9yaW5nKSk7CisJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIsIGUxMDAwX2Rlc2NfdW51c2VkKGFkYXB0ZXItPnJ4X3JpbmcpLAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CiB9CiAKIC8qKgpAQCAtMzM0Niw3ICszMzUyLDcgQEAKIAkJZTEwMDBfY29uZmlndXJlX21zaXgoYWRhcHRlcik7CiAJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKIAotCW5ldGlmX3dha2VfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOwogCiAJLyogZmlyZSBhIGxpbmsgY2hhbmdlIGludGVycnVwdCB0byBzdGFydCB0aGUgd2F0Y2hkb2cgKi8KIAlpZiAoYWRhcHRlci0+bXNpeF9lbnRyaWVzKQpAQCAtMzQxMywxNyArMzQxOSwxNiBAQAogCWUxMDAwZV91cGRhdGVfc3RhdHMoYWRhcHRlcik7CiAJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnN0YXRzNjRfbG9jayk7CiAKKwllMTAwMGVfZmx1c2hfZGVzY3JpcHRvcnMoYWRhcHRlcik7CisJZTEwMDBfY2xlYW5fdHhfcmluZyhhZGFwdGVyKTsKKwllMTAwMF9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIpOworCiAJYWRhcHRlci0+bGlua19zcGVlZCA9IDA7CiAJYWRhcHRlci0+bGlua19kdXBsZXggPSAwOwogCiAJaWYgKCFwY2lfY2hhbm5lbF9vZmZsaW5lKGFkYXB0ZXItPnBkZXYpKQogCQllMTAwMGVfcmVzZXQoYWRhcHRlcik7CiAKLQllMTAwMGVfZmx1c2hfZGVzY3JpcHRvcnMoYWRhcHRlcik7Ci0KLQllMTAwMF9jbGVhbl90eF9yaW5nKGFkYXB0ZXIpOwotCWUxMDAwX2NsZWFuX3J4X3JpbmcoYWRhcHRlcik7Ci0KIAkvKgogCSAqIFRPRE86IGZvciBwb3dlciBtYW5hZ2VtZW50LCB3ZSBjb3VsZCBkcm9wIHRoZSBsaW5rIGFuZAogCSAqIHBjaV9kaXNhYmxlX2RldmljZSBoZXJlLgpAQCAtMzgzMyw2ICszODM4LDggQEAKIC8qKgogICogZTEwMDBlX3VwZGF0ZV9waHlfc3RhdHMgLSBVcGRhdGUgdGhlIFBIWSBzdGF0aXN0aWNzIGNvdW50ZXJzCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZWFkL2NsZWFyIHRoZSB1cHBlciAxNi1iaXQgUEhZIHJlZ2lzdGVycyBhbmQgcmVhZC9hY2N1bXVsYXRlIGxvd2VyCiAgKiovCiBzdGF0aWMgdm9pZCBlMTAwMGVfdXBkYXRlX3BoeV9zdGF0cyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKIHsKQEAgLTM4NDQsODkgKzM4NTEsNjEgQEAKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuOwogCi0JaHctPnBoeS5hZGRyID0gMTsKLQotI2RlZmluZSBIVl9QSFlfU1RBVFNfUEFHRQk3NzgKIAkvKgogCSAqIEEgcGFnZSBzZXQgaXMgZXhwZW5zaXZlIHNvIGNoZWNrIGlmIGFscmVhZHkgb24gZGVzaXJlZCBwYWdlLgogCSAqIElmIG5vdCwgc2V0IHRvIHRoZSBwYWdlIHdpdGggdGhlIFBIWSBzdGF0dXMgcmVnaXN0ZXJzLgogCSAqLworCWh3LT5waHkuYWRkciA9IDE7CiAJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCiAJCQkJCSAgICZwaHlfZGF0YSk7CiAJaWYgKHJldF92YWwpCiAJCWdvdG8gcmVsZWFzZTsKLQlpZiAocGh5X2RhdGEgIT0gKEhWX1BIWV9TVEFUU19QQUdFIDw8IElHUF9QQUdFX1NISUZUKSkgewotCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywKLQkJCQkJCSAgICBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKLQkJCQkJCSAgICAoSFZfUEhZX1NUQVRTX1BBR0UgPDwKLQkJCQkJCSAgICAgSUdQX1BBR0VfU0hJRlQpKTsKKwlpZiAocGh5X2RhdGEgIT0gKEhWX1NUQVRTX1BBR0UgPDwgSUdQX1BBR0VfU0hJRlQpKSB7CisJCXJldF92YWwgPSBody0+cGh5Lm9wcy5zZXRfcGFnZShodywKKwkJCQkJICAgICAgIEhWX1NUQVRTX1BBR0UgPDwgSUdQX1BBR0VfU0hJRlQpOwogCQlpZiAocmV0X3ZhbCkKIAkJCWdvdG8gcmVsZWFzZTsKIAl9CiAKLQkvKiBSZWFkL2NsZWFyIHRoZSB1cHBlciAxNi1iaXQgcmVnaXN0ZXJzIGFuZCByZWFkL2FjY3VtdWxhdGUgbG93ZXIgKi8KLQogCS8qIFNpbmdsZSBDb2xsaXNpb24gQ291bnQgKi8KLQllMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIEhWX1NDQ19VUFBFUiAmIE1BWF9QSFlfUkVHX0FERFJFU1MsCi0JCQkJICZwaHlfZGF0YSk7Ci0JcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywKLQkJCQkJICAgSFZfU0NDX0xPV0VSICYgTUFYX1BIWV9SRUdfQUREUkVTUywKLQkJCQkJICAgJnBoeV9kYXRhKTsKKwlody0+cGh5Lm9wcy5yZWFkX3JlZ19wYWdlKGh3LCBIVl9TQ0NfVVBQRVIsICZwaHlfZGF0YSk7CisJcmV0X3ZhbCA9IGh3LT5waHkub3BzLnJlYWRfcmVnX3BhZ2UoaHcsIEhWX1NDQ19MT1dFUiwgJnBoeV9kYXRhKTsKIAlpZiAoIXJldF92YWwpCiAJCWFkYXB0ZXItPnN0YXRzLnNjYyArPSBwaHlfZGF0YTsKIAogCS8qIEV4Y2Vzc2l2ZSBDb2xsaXNpb24gQ291bnQgKi8KLQllMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIEhWX0VDT0xfVVBQRVIgJiBNQVhfUEhZX1JFR19BRERSRVNTLAotCQkJCSAmcGh5X2RhdGEpOwotCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsCi0JCQkJCSAgIEhWX0VDT0xfTE9XRVIgJiBNQVhfUEhZX1JFR19BRERSRVNTLAotCQkJCQkgICAmcGh5X2RhdGEpOworCWh3LT5waHkub3BzLnJlYWRfcmVnX3BhZ2UoaHcsIEhWX0VDT0xfVVBQRVIsICZwaHlfZGF0YSk7CisJcmV0X3ZhbCA9IGh3LT5waHkub3BzLnJlYWRfcmVnX3BhZ2UoaHcsIEhWX0VDT0xfTE9XRVIsICZwaHlfZGF0YSk7CiAJaWYgKCFyZXRfdmFsKQogCQlhZGFwdGVyLT5zdGF0cy5lY29sICs9IHBoeV9kYXRhOwogCiAJLyogTXVsdGlwbGUgQ29sbGlzaW9uIENvdW50ICovCi0JZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LCBIVl9NQ0NfVVBQRVIgJiBNQVhfUEhZX1JFR19BRERSRVNTLAotCQkJCSAmcGh5X2RhdGEpOwotCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsCi0JCQkJCSAgIEhWX01DQ19MT1dFUiAmIE1BWF9QSFlfUkVHX0FERFJFU1MsCi0JCQkJCSAgICZwaHlfZGF0YSk7CisJaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfTUNDX1VQUEVSLCAmcGh5X2RhdGEpOworCXJldF92YWwgPSBody0+cGh5Lm9wcy5yZWFkX3JlZ19wYWdlKGh3LCBIVl9NQ0NfTE9XRVIsICZwaHlfZGF0YSk7CiAJaWYgKCFyZXRfdmFsKQogCQlhZGFwdGVyLT5zdGF0cy5tY2MgKz0gcGh5X2RhdGE7CiAKIAkvKiBMYXRlIENvbGxpc2lvbiBDb3VudCAqLwotCWUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgSFZfTEFURUNPTF9VUFBFUiAmIE1BWF9QSFlfUkVHX0FERFJFU1MsCi0JCQkJICZwaHlfZGF0YSk7Ci0JcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywKLQkJCQkJICAgSFZfTEFURUNPTF9MT1dFUiAmCi0JCQkJCSAgIE1BWF9QSFlfUkVHX0FERFJFU1MsCi0JCQkJCSAgICZwaHlfZGF0YSk7CisJaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfTEFURUNPTF9VUFBFUiwgJnBoeV9kYXRhKTsKKwlyZXRfdmFsID0gaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfTEFURUNPTF9MT1dFUiwgJnBoeV9kYXRhKTsKIAlpZiAoIXJldF92YWwpCiAJCWFkYXB0ZXItPnN0YXRzLmxhdGVjb2wgKz0gcGh5X2RhdGE7CiAKIAkvKiBDb2xsaXNpb24gQ291bnQgLSBhbHNvIHVzZWQgZm9yIGFkYXB0aXZlIElGUyAqLwotCWUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgSFZfQ09MQ19VUFBFUiAmIE1BWF9QSFlfUkVHX0FERFJFU1MsCi0JCQkJICZwaHlfZGF0YSk7Ci0JcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywKLQkJCQkJICAgSFZfQ09MQ19MT1dFUiAmIE1BWF9QSFlfUkVHX0FERFJFU1MsCi0JCQkJCSAgICZwaHlfZGF0YSk7CisJaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfQ09MQ19VUFBFUiwgJnBoeV9kYXRhKTsKKwlyZXRfdmFsID0gaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfQ09MQ19MT1dFUiwgJnBoeV9kYXRhKTsKIAlpZiAoIXJldF92YWwpCiAJCWh3LT5tYWMuY29sbGlzaW9uX2RlbHRhID0gcGh5X2RhdGE7CiAKIAkvKiBEZWZlciBDb3VudCAqLwotCWUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgSFZfRENfVVBQRVIgJiBNQVhfUEhZX1JFR19BRERSRVNTLAotCQkJCSAmcGh5X2RhdGEpOwotCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsCi0JCQkJCSAgIEhWX0RDX0xPV0VSICYgTUFYX1BIWV9SRUdfQUREUkVTUywKLQkJCQkJICAgJnBoeV9kYXRhKTsKKwlody0+cGh5Lm9wcy5yZWFkX3JlZ19wYWdlKGh3LCBIVl9EQ19VUFBFUiwgJnBoeV9kYXRhKTsKKwlyZXRfdmFsID0gaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZShodywgSFZfRENfTE9XRVIsICZwaHlfZGF0YSk7CiAJaWYgKCFyZXRfdmFsKQogCQlhZGFwdGVyLT5zdGF0cy5kYyArPSBwaHlfZGF0YTsKIAogCS8qIFRyYW5zbWl0IHdpdGggbm8gQ1JTICovCi0JZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LCBIVl9UTkNSU19VUFBFUiAmIE1BWF9QSFlfUkVHX0FERFJFU1MsCi0JCQkJICZwaHlfZGF0YSk7Ci0JcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywKLQkJCQkJICAgSFZfVE5DUlNfTE9XRVIgJiBNQVhfUEhZX1JFR19BRERSRVNTLAotCQkJCQkgICAmcGh5X2RhdGEpOworCWh3LT5waHkub3BzLnJlYWRfcmVnX3BhZ2UoaHcsIEhWX1ROQ1JTX1VQUEVSLCAmcGh5X2RhdGEpOworCXJldF92YWwgPSBody0+cGh5Lm9wcy5yZWFkX3JlZ19wYWdlKGh3LCBIVl9UTkNSU19MT1dFUiwgJnBoeV9kYXRhKTsKIAlpZiAoIXJldF92YWwpCiAJCWFkYXB0ZXItPnN0YXRzLnRuY3JzICs9IHBoeV9kYXRhOwogCkBAIC01MTU0LDIxICs1MTMzLDM0IEBACiB7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1MzIgaSwgbWFjX3JlZzsKLQl1MTYgcGh5X3JlZzsKKwl1MTYgcGh5X3JlZywgd3VjX2VuYWJsZTsKIAlpbnQgcmV0dmFsID0gMDsKIAogCS8qIGNvcHkgTUFDIFJBUnMgdG8gUEhZIFJBUnMgKi8KIAllMTAwMF9jb3B5X3J4X2FkZHJzX3RvX3BoeV9pY2g4bGFuKGh3KTsKIAotCS8qIGNvcHkgTUFDIE1UQSB0byBQSFkgTVRBICovCisJcmV0dmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZShodyk7CisJaWYgKHJldHZhbCkgeworCQllX2VycigiQ291bGQgbm90IGFjcXVpcmUgUEhZXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKiBFbmFibGUgYWNjZXNzIHRvIHdha2V1cCByZWdpc3RlcnMgb24gYW5kIHNldCBwYWdlIHRvIEJNX1dVQ19QQUdFICovCisJcmV0dmFsID0gZTEwMDBfZW5hYmxlX3BoeV93YWtldXBfcmVnX2FjY2Vzc19ibShodywgJnd1Y19lbmFibGUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJLyogY29weSBNQUMgTVRBIHRvIFBIWSBNVEEgLSBvbmx5IG5lZWRlZCBmb3IgcGNobGFuICovCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPmh3Lm1hYy5tdGFfcmVnX2NvdW50OyBpKyspIHsKIAkJbWFjX3JlZyA9IEUxMDAwX1JFQURfUkVHX0FSUkFZKGh3LCBFMTAwMF9NVEEsIGkpOwotCQllMWVfd3BoeShodywgQk1fTVRBKGkpLCAodTE2KShtYWNfcmVnICYgMHhGRkZGKSk7Ci0JCWUxZV93cGh5KGh3LCBCTV9NVEEoaSkgKyAxLCAodTE2KSgobWFjX3JlZyA+PiAxNikgJiAweEZGRkYpKTsKKwkJaHctPnBoeS5vcHMud3JpdGVfcmVnX3BhZ2UoaHcsIEJNX01UQShpKSwKKwkJCQkJICAgKHUxNikobWFjX3JlZyAmIDB4RkZGRikpOworCQlody0+cGh5Lm9wcy53cml0ZV9yZWdfcGFnZShodywgQk1fTVRBKGkpICsgMSwKKwkJCQkJICAgKHUxNikoKG1hY19yZWcgPj4gMTYpICYgMHhGRkZGKSk7CiAJfQogCiAJLyogY29uZmlndXJlIFBIWSBSeCBDb250cm9sIHJlZ2lzdGVyICovCi0JZTFlX3JwaHkoJmFkYXB0ZXItPmh3LCBCTV9SQ1RMLCAmcGh5X3JlZyk7CisJaHctPnBoeS5vcHMucmVhZF9yZWdfcGFnZSgmYWRhcHRlci0+aHcsIEJNX1JDVEwsICZwaHlfcmVnKTsKIAltYWNfcmVnID0gZXIzMihSQ1RMKTsKIAlpZiAobWFjX3JlZyAmIEUxMDAwX1JDVExfVVBFKQogCQlwaHlfcmVnIHw9IEJNX1JDVExfVVBFOwpAQCAtNTE4NSwzMSArNTE3NywxOSBAQAogCW1hY19yZWcgPSBlcjMyKENUUkwpOwogCWlmIChtYWNfcmVnICYgRTEwMDBfQ1RSTF9SRkNFKQogCQlwaHlfcmVnIHw9IEJNX1JDVExfUkZDRTsKLQllMWVfd3BoeSgmYWRhcHRlci0+aHcsIEJNX1JDVEwsIHBoeV9yZWcpOworCWh3LT5waHkub3BzLndyaXRlX3JlZ19wYWdlKCZhZGFwdGVyLT5odywgQk1fUkNUTCwgcGh5X3JlZyk7CiAKIAkvKiBlbmFibGUgUEhZIHdha2V1cCBpbiBNQUMgcmVnaXN0ZXIgKi8KIAlldzMyKFdVRkMsIHd1ZmMpOwogCWV3MzIoV1VDLCBFMTAwMF9XVUNfUEhZX1dBS0UgfCBFMTAwMF9XVUNfUE1FX0VOKTsKIAogCS8qIGNvbmZpZ3VyZSBhbmQgZW5hYmxlIFBIWSB3YWtldXAgaW4gUEhZIHJlZ2lzdGVycyAqLwotCWUxZV93cGh5KCZhZGFwdGVyLT5odywgQk1fV1VGQywgd3VmYyk7Ci0JZTFlX3dwaHkoJmFkYXB0ZXItPmh3LCBCTV9XVUMsIEUxMDAwX1dVQ19QTUVfRU4pOworCWh3LT5waHkub3BzLndyaXRlX3JlZ19wYWdlKCZhZGFwdGVyLT5odywgQk1fV1VGQywgd3VmYyk7CisJaHctPnBoeS5vcHMud3JpdGVfcmVnX3BhZ2UoJmFkYXB0ZXItPmh3LCBCTV9XVUMsIEUxMDAwX1dVQ19QTUVfRU4pOwogCiAJLyogYWN0aXZhdGUgUEhZIHdha2V1cCAqLwotCXJldHZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmUoaHcpOwotCWlmIChyZXR2YWwpIHsKLQkJZV9lcnIoIkNvdWxkIG5vdCBhY3F1aXJlIFBIWVxuIik7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCWUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAotCSAgICAgICAgICAgICAgICAgICAgICAgICAoQk1fV1VDX0VOQUJMRV9QQUdFIDw8IElHUF9QQUdFX1NISUZUKSk7Ci0JcmV0dmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LCBCTV9XVUNfRU5BQkxFX1JFRywgJnBoeV9yZWcpOwotCWlmIChyZXR2YWwpIHsKLQkJZV9lcnIoIkNvdWxkIG5vdCByZWFkIFBIWSBwYWdlIDc2OVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQlwaHlfcmVnIHw9IEJNX1dVQ19FTkFCTEVfQklUIHwgQk1fV1VDX0hPU1RfV1VfQklUOwotCXJldHZhbCA9IGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIEJNX1dVQ19FTkFCTEVfUkVHLCBwaHlfcmVnKTsKKwl3dWNfZW5hYmxlIHw9IEJNX1dVQ19FTkFCTEVfQklUIHwgQk1fV1VDX0hPU1RfV1VfQklUOworCXJldHZhbCA9IGUxMDAwX2Rpc2FibGVfcGh5X3dha2V1cF9yZWdfYWNjZXNzX2JtKGh3LCAmd3VjX2VuYWJsZSk7CiAJaWYgKHJldHZhbCkKIAkJZV9lcnIoIkNvdWxkIG5vdCBzZXQgUEhZIEhvc3QgV2FrZXVwIGJpdFxuIik7CiBvdXQ6CkBAIC01Mjc3LDcgKzUyNTcsNyBAQAogCQl9CiAKIAkJaWYgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19JU19JQ0gpCi0JCQllMTAwMGVfZGlzYWJsZV9naWdfd29sX2ljaDhsYW4oJmFkYXB0ZXItPmh3KTsKKwkJCWUxMDAwX3N1c3BlbmRfd29ya2Fyb3VuZHNfaWNoOGxhbigmYWRhcHRlci0+aHcpOwogCiAJCS8qIEFsbG93IHRpbWUgZm9yIHBlbmRpbmcgbWFzdGVyIHJlcXVlc3RzIHRvIHJ1biAqLwogCQllMTAwMGVfZGlzYWJsZV9wY2llX21hc3RlcigmYWRhcHRlci0+aHcpOwpAQCAtNTM0Myw3ICs1MzIzLDcgQEAKIAkgKi8KIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0lTX1FVQURfUE9SVCkgewogCQlzdHJ1Y3QgcGNpX2RldiAqdXNfZGV2ID0gcGRldi0+YnVzLT5zZWxmOwotCQlpbnQgcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eSh1c19kZXYsIFBDSV9DQVBfSURfRVhQKTsKKwkJaW50IHBvcyA9IHBjaV9wY2llX2NhcCh1c19kZXYpOwogCQl1MTYgZGV2Y3RsOwogCiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHVzX2RldiwgcG9zICsgUENJX0VYUF9ERVZDVEwsICZkZXZjdGwpOwpAQCAtNTQyOCw2ICs1NDA4LDkgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCisJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2gybGFuKQorCQllMTAwMF9yZXN1bWVfd29ya2Fyb3VuZHNfcGNobGFuKCZhZGFwdGVyLT5odyk7CisKIAllMTAwMGVfcG93ZXJfdXBfcGh5KGFkYXB0ZXIpOwogCiAJLyogcmVwb3J0IHRoZSBzeXN0ZW0gd2FrZXVwIGNhdXNlIGZyb20gUzMvUzQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9waHkuYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9waHkuYwppbmRleCA0ODQ3NzRjLi4yYTZlZTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL3BoeS5jCkBAIC0zNiw3ICszNiw3IEBACiBzdGF0aWMgczMyIGUxMDAwX3dhaXRfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyB1MzIgZTEwMDBfZ2V0X3BoeV9hZGRyX2Zvcl9ibV9wYWdlKHUzMiBwYWdlLCB1MzIgcmVnKTsKIHN0YXRpYyBzMzIgZTEwMDBfYWNjZXNzX3BoeV93YWtldXBfcmVnX2JtKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsCi0JCQkJCSAgdTE2ICpkYXRhLCBib29sIHJlYWQpOworCQkJCQkgIHUxNiAqZGF0YSwgYm9vbCByZWFkLCBib29sIHBhZ2Vfc2V0KTsKIHN0YXRpYyB1MzIgZTEwMDBfZ2V0X3BoeV9hZGRyX2Zvcl9odl9wYWdlKHUzMiBwYWdlKTsKIHN0YXRpYyBzMzIgZTEwMDBfYWNjZXNzX3BoeV9kZWJ1Z19yZWdzX2h2KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgKmRhdGEsIGJvb2wgcmVhZCk7CkBAIC0zNDgsNiArMzQ4LDI0IEBACiB9CiAKIC8qKgorICogIGUxMDAwX3NldF9wYWdlX2lncCAtIFNldCBwYWdlIGFzIG9uIElHUC1saWtlIFBIWShzKQorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQHBhZ2U6IHBhZ2UgdG8gc2V0IChzaGlmdGVkIGxlZnQgd2hlbiBuZWNlc3NhcnkpCisgKgorICogIFNldHMgUEhZIHBhZ2UgcmVxdWlyZWQgZm9yIFBIWSByZWdpc3RlciBhY2Nlc3MuICBBc3N1bWVzIHNlbWFwaG9yZSBpcworICogIGFscmVhZHkgYWNxdWlyZWQuICBOb3RlLCB0aGlzIGZ1bmN0aW9uIHNldHMgcGh5LmFkZHIgdG8gMSBzbyB0aGUgY2FsbGVyCisgKiAgbXVzdCBzZXQgaXQgYXBwcm9wcmlhdGVseSAoaWYgbmVjZXNzYXJ5KSBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisgKiovCitzMzIgZTEwMDBfc2V0X3BhZ2VfaWdwKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBwYWdlKQoreworCWVfZGJnKCJTZXR0aW5nIHBhZ2UgMHgleFxuIiwgcGFnZSk7CisKKwlody0+cGh5LmFkZHIgPSAxOworCisJcmV0dXJuIGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULCBwYWdlKTsKK30KKworLyoqCiAgKiAgX19lMTAwMGVfcmVhZF9waHlfcmVnX2lncCAtIFJlYWQgaWdwIFBIWSByZWdpc3RlcgogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIGJlIHJlYWQKQEAgLTI0MTgsNyArMjQzNiw3IEBACiAJLyogUGFnZSA4MDAgd29ya3MgZGlmZmVyZW50bHkgdGhhbiB0aGUgcmVzdCBzbyBpdCBoYXMgaXRzIG93biBmdW5jICovCiAJaWYgKHBhZ2UgPT0gQk1fV1VDX1BBR0UpIHsKIAkJcmV0X3ZhbCA9IGUxMDAwX2FjY2Vzc19waHlfd2FrZXVwX3JlZ19ibShodywgb2Zmc2V0LCAmZGF0YSwKLQkJCQkJCQkgZmFsc2UpOworCQkJCQkJCSBmYWxzZSwgZmFsc2UpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTI0NzcsNyArMjQ5NSw3IEBACiAJLyogUGFnZSA4MDAgd29ya3MgZGlmZmVyZW50bHkgdGhhbiB0aGUgcmVzdCBzbyBpdCBoYXMgaXRzIG93biBmdW5jICovCiAJaWYgKHBhZ2UgPT0gQk1fV1VDX1BBR0UpIHsKIAkJcmV0X3ZhbCA9IGUxMDAwX2FjY2Vzc19waHlfd2FrZXVwX3JlZ19ibShodywgb2Zmc2V0LCBkYXRhLAotCQkJCQkJCSB0cnVlKTsKKwkJCQkJCQkgdHJ1ZSwgZmFsc2UpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTI1MzUsNyArMjU1Myw3IEBACiAJLyogUGFnZSA4MDAgd29ya3MgZGlmZmVyZW50bHkgdGhhbiB0aGUgcmVzdCBzbyBpdCBoYXMgaXRzIG93biBmdW5jICovCiAJaWYgKHBhZ2UgPT0gQk1fV1VDX1BBR0UpIHsKIAkJcmV0X3ZhbCA9IGUxMDAwX2FjY2Vzc19waHlfd2FrZXVwX3JlZ19ibShodywgb2Zmc2V0LCBkYXRhLAotCQkJCQkJCSB0cnVlKTsKKwkJCQkJCQkgdHJ1ZSwgZmFsc2UpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTI1NzksNyArMjU5Nyw3IEBACiAJLyogUGFnZSA4MDAgd29ya3MgZGlmZmVyZW50bHkgdGhhbiB0aGUgcmVzdCBzbyBpdCBoYXMgaXRzIG93biBmdW5jICovCiAJaWYgKHBhZ2UgPT0gQk1fV1VDX1BBR0UpIHsKIAkJcmV0X3ZhbCA9IGUxMDAwX2FjY2Vzc19waHlfd2FrZXVwX3JlZ19ibShodywgb2Zmc2V0LCAmZGF0YSwKLQkJCQkJCQkgZmFsc2UpOworCQkJCQkJCSBmYWxzZSwgZmFsc2UpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTI2MDMsMTA0ICsyNjIxLDE2MyBAQAogfQogCiAvKioKLSAqICBlMTAwMF9hY2Nlc3NfcGh5X3dha2V1cF9yZWdfYm0gLSBSZWFkIEJNIFBIWSB3YWtldXAgcmVnaXN0ZXIKKyAqICBlMTAwMF9lbmFibGVfcGh5X3dha2V1cF9yZWdfYWNjZXNzX2JtIC0gZW5hYmxlIGFjY2VzcyB0byBCTSB3YWtldXAgcmVnaXN0ZXJzCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAcGh5X3JlZzogcG9pbnRlciB0byBzdG9yZSBvcmlnaW5hbCBjb250ZW50cyBvZiBCTV9XVUNfRU5BQkxFX1JFRworICoKKyAqICBBc3N1bWVzIHNlbWFwaG9yZSBhbHJlYWR5IGFjcXVpcmVkIGFuZCBwaHlfcmVnIHBvaW50cyB0byBhIHZhbGlkIG1lbW9yeQorICogIGFkZHJlc3MgdG8gc3RvcmUgY29udGVudHMgb2YgdGhlIEJNX1dVQ19FTkFCTEVfUkVHIHJlZ2lzdGVyLgorICoqLworczMyIGUxMDAwX2VuYWJsZV9waHlfd2FrZXVwX3JlZ19hY2Nlc3NfYm0oc3RydWN0IGUxMDAwX2h3ICpodywgdTE2ICpwaHlfcmVnKQoreworCXMzMiByZXRfdmFsOworCXUxNiB0ZW1wOworCisJLyogQWxsIHBhZ2Ugc2VsZWN0LCBwb3J0IGN0cmwgYW5kIHdha2V1cCByZWdpc3RlcnMgdXNlIHBoeSBhZGRyZXNzIDEgKi8KKwlody0+cGh5LmFkZHIgPSAxOworCisJLyogU2VsZWN0IFBvcnQgQ29udHJvbCBSZWdpc3RlcnMgcGFnZSAqLworCXJldF92YWwgPSBlMTAwMF9zZXRfcGFnZV9pZ3AoaHcsIChCTV9QT1JUX0NUUkxfUEFHRSA8PCBJR1BfUEFHRV9TSElGVCkpOworCWlmIChyZXRfdmFsKSB7CisJCWVfZGJnKCJDb3VsZCBub3Qgc2V0IFBvcnQgQ29udHJvbCBwYWdlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgQk1fV1VDX0VOQUJMRV9SRUcsIHBoeV9yZWcpOworCWlmIChyZXRfdmFsKSB7CisJCWVfZGJnKCJDb3VsZCBub3QgcmVhZCBQSFkgcmVnaXN0ZXIgJWQuJWRcbiIsCisJCSAgICAgIEJNX1BPUlRfQ1RSTF9QQUdFLCBCTV9XVUNfRU5BQkxFX1JFRyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogRW5hYmxlIGJvdGggUEhZIHdha2V1cCBtb2RlIGFuZCBXYWtldXAgcmVnaXN0ZXIgcGFnZSB3cml0ZXMuCisJICogUHJldmVudCBhIHBvd2VyIHN0YXRlIGNoYW5nZSBieSBkaXNhYmxpbmcgTUUgYW5kIEhvc3QgUEhZIHdha2V1cC4KKwkgKi8KKwl0ZW1wID0gKnBoeV9yZWc7CisJdGVtcCB8PSBCTV9XVUNfRU5BQkxFX0JJVDsKKwl0ZW1wICY9IH4oQk1fV1VDX01FX1dVX0JJVCB8IEJNX1dVQ19IT1NUX1dVX0JJVCk7CisKKwlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgQk1fV1VDX0VOQUJMRV9SRUcsIHRlbXApOworCWlmIChyZXRfdmFsKSB7CisJCWVfZGJnKCJDb3VsZCBub3Qgd3JpdGUgUEhZIHJlZ2lzdGVyICVkLiVkXG4iLAorCQkgICAgICBCTV9QT1JUX0NUUkxfUEFHRSwgQk1fV1VDX0VOQUJMRV9SRUcpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTZWxlY3QgSG9zdCBXYWtldXAgUmVnaXN0ZXJzIHBhZ2UgKi8KKwlyZXRfdmFsID0gZTEwMDBfc2V0X3BhZ2VfaWdwKGh3LCAoQk1fV1VDX1BBR0UgPDwgSUdQX1BBR0VfU0hJRlQpKTsKKworCS8qIGNhbGxlciBub3cgYWJsZSB0byB3cml0ZSByZWdpc3RlcnMgb24gdGhlIFdha2V1cCByZWdpc3RlcnMgcGFnZSAqLworb3V0OgorCXJldHVybiByZXRfdmFsOworfQorCisvKioKKyAqICBlMTAwMF9kaXNhYmxlX3BoeV93YWtldXBfcmVnX2FjY2Vzc19ibSAtIGRpc2FibGUgYWNjZXNzIHRvIEJNIHdha2V1cCByZWdzCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAcGh5X3JlZzogcG9pbnRlciB0byBvcmlnaW5hbCBjb250ZW50cyBvZiBCTV9XVUNfRU5BQkxFX1JFRworICoKKyAqICBSZXN0b3JlIEJNX1dVQ19FTkFCTEVfUkVHIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZS4KKyAqCisgKiAgQXNzdW1lcyBzZW1hcGhvcmUgYWxyZWFkeSBhY3F1aXJlZCBhbmQgKnBoeV9yZWcgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZQorICogIEJNX1dVQ19FTkFCTEVfUkVHIGJlZm9yZSByZWdpc3RlcihzKSBvbiBCTV9XVUNfUEFHRSB3ZXJlIGFjY2Vzc2VkIGJ5CisgKiAgY2FsbGVyLgorICoqLworczMyIGUxMDAwX2Rpc2FibGVfcGh5X3dha2V1cF9yZWdfYWNjZXNzX2JtKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiAqcGh5X3JlZykKK3sKKwlzMzIgcmV0X3ZhbCA9IDA7CisKKwkvKiBTZWxlY3QgUG9ydCBDb250cm9sIFJlZ2lzdGVycyBwYWdlICovCisJcmV0X3ZhbCA9IGUxMDAwX3NldF9wYWdlX2lncChodywgKEJNX1BPUlRfQ1RSTF9QQUdFIDw8IElHUF9QQUdFX1NISUZUKSk7CisJaWYgKHJldF92YWwpIHsKKwkJZV9kYmcoIkNvdWxkIG5vdCBzZXQgUG9ydCBDb250cm9sIHBhZ2VcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBSZXN0b3JlIDc2OS4xNyB0byBpdHMgb3JpZ2luYWwgdmFsdWUgKi8KKwlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgQk1fV1VDX0VOQUJMRV9SRUcsICpwaHlfcmVnKTsKKwlpZiAocmV0X3ZhbCkKKwkJZV9kYmcoIkNvdWxkIG5vdCByZXN0b3JlIFBIWSByZWdpc3RlciAlZC4lZFxuIiwKKwkJICAgICAgQk1fUE9SVF9DVFJMX1BBR0UsIEJNX1dVQ19FTkFCTEVfUkVHKTsKK291dDoKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqCisgKiAgZTEwMDBfYWNjZXNzX3BoeV93YWtldXBfcmVnX2JtIC0gUmVhZC93cml0ZSBCTSBQSFkgd2FrZXVwIHJlZ2lzdGVyCiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqICBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQgdG8gYmUgcmVhZCBvciB3cml0dGVuCiAgKiAgQGRhdGE6IHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gcmVhZCBvciB3cml0ZQogICogIEByZWFkOiBkZXRlcm1pbmVzIGlmIG9wZXJhdGlvbiBpcyByZWFkIG9yIHdyaXRlCisgKiAgQHBhZ2Vfc2V0OiBCTV9XVUNfUEFHRSBhbHJlYWR5IHNldCBhbmQgYWNjZXNzIGVuYWJsZWQKICAqCi0gKiAgQWNxdWlyZXMgc2VtYXBob3JlLCBpZiBuZWNlc3NhcnksIHRoZW4gcmVhZHMgdGhlIFBIWSByZWdpc3RlciBhdCBvZmZzZXQKLSAqICBhbmQgc3RvcmluZyB0aGUgcmV0cmlldmVkIGluZm9ybWF0aW9uIGluIGRhdGEuICBSZWxlYXNlIGFueSBhY3F1aXJlZAotICogIHNlbWFwaG9yZXMgYmVmb3JlIGV4aXRpbmcuIE5vdGUgdGhhdCBwcm9jZWR1cmUgdG8gcmVhZCB0aGUgd2FrZXVwCi0gKiAgcmVnaXN0ZXJzIGFyZSBkaWZmZXJlbnQuIEl0IHdvcmtzIGFzIHN1Y2g6Ci0gKiAgMSkgU2V0IHBhZ2UgNzY5LCByZWdpc3RlciAxNywgYml0IDIgPSAxCisgKiAgUmVhZCB0aGUgUEhZIHJlZ2lzdGVyIGF0IG9mZnNldCBhbmQgc3RvcmUgdGhlIHJldHJpZXZlZCBpbmZvcm1hdGlvbiBpbgorICogIGRhdGEsIG9yIHdyaXRlIGRhdGEgdG8gUEhZIHJlZ2lzdGVyIGF0IG9mZnNldC4gIE5vdGUgdGhlIHByb2NlZHVyZSB0bworICogIGFjY2VzcyB0aGUgUEhZIHdha2V1cCByZWdpc3RlcnMgaXMgZGlmZmVyZW50IHRoYW4gcmVhZGluZyB0aGUgb3RoZXIgUEhZCisgKiAgcmVnaXN0ZXJzLiBJdCB3b3JrcyBhcyBzdWNoOgorICogIDEpIFNldCA3NjkuMTcuMiAocGFnZSA3NjksIHJlZ2lzdGVyIDE3LCBiaXQgMikgPSAxCiAgKiAgMikgU2V0IHBhZ2UgdG8gODAwIGZvciBob3N0ICg4MDEgaWYgd2Ugd2VyZSBtYW5hZ2VhYmlsaXR5KQogICogIDMpIFdyaXRlIHRoZSBhZGRyZXNzIHVzaW5nIHRoZSBhZGRyZXNzIG9wY29kZSAoMHgxMSkKICAqICA0KSBSZWFkIG9yIHdyaXRlIHRoZSBkYXRhIHVzaW5nIHRoZSBkYXRhIG9wY29kZSAoMHgxMikKLSAqICA1KSBSZXN0b3JlIDc2OV8xNy4yIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQorICogIDUpIFJlc3RvcmUgNzY5LjE3LjIgdG8gaXRzIG9yaWdpbmFsIHZhbHVlCiAgKgotICogIEFzc3VtZXMgc2VtYXBob3JlIGFscmVhZHkgYWNxdWlyZWQuCisgKiAgU3RlcHMgMSBhbmQgMiBhcmUgZG9uZSBieSBlMTAwMF9lbmFibGVfcGh5X3dha2V1cF9yZWdfYWNjZXNzX2JtKCkgYW5kCisgKiAgc3RlcCA1IGlzIGRvbmUgYnkgZTEwMDBfZGlzYWJsZV9waHlfd2FrZXVwX3JlZ19hY2Nlc3NfYm0oKS4KKyAqCisgKiAgQXNzdW1lcyBzZW1hcGhvcmUgaXMgYWxyZWFkeSBhY3F1aXJlZC4gIFdoZW4gcGFnZV9zZXQ9PXRydWUsIGFzc3VtZXMKKyAqICB0aGUgUEhZIHBhZ2UgaXMgc2V0IHRvIEJNX1dVQ19QQUdFIChpLmUuIGEgZnVuY3Rpb24gaW4gdGhlIGNhbGwgc3RhY2sKKyAqICBpcyByZXNwb25zaWJsZSBmb3IgY2FsbHMgdG8gZTEwMDBfW2VuYWJsZXxkaXNhYmxlXV9waHlfd2FrZXVwX3JlZ19ibSgpKS4KICAqKi8KIHN0YXRpYyBzMzIgZTEwMDBfYWNjZXNzX3BoeV93YWtldXBfcmVnX2JtKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsCi0JCQkJCSAgdTE2ICpkYXRhLCBib29sIHJlYWQpCisJCQkJCSAgdTE2ICpkYXRhLCBib29sIHJlYWQsIGJvb2wgcGFnZV9zZXQpCiB7CiAJczMyIHJldF92YWw7CiAJdTE2IHJlZyA9IEJNX1BIWV9SRUdfTlVNKG9mZnNldCk7CisJdTE2IHBhZ2UgPSBCTV9QSFlfUkVHX1BBR0Uob2Zmc2V0KTsKIAl1MTYgcGh5X3JlZyA9IDA7CiAKLQkvKiBHaWcgbXVzdCBiZSBkaXNhYmxlZCBmb3IgTURJTyBhY2Nlc3NlcyB0byBwYWdlIDgwMCAqLworCS8qIEdpZyBtdXN0IGJlIGRpc2FibGVkIGZvciBNRElPIGFjY2Vzc2VzIHRvIEhvc3QgV2FrZXVwIHJlZyBwYWdlICovCiAJaWYgKChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKSAmJgotCSAgICghKGVyMzIoUEhZX0NUUkwpICYgRTEwMDBfUEhZX0NUUkxfR0JFX0RJU0FCTEUpKSkKLQkJZV9kYmcoIkF0dGVtcHRpbmcgdG8gYWNjZXNzIHBhZ2UgODAwIHdoaWxlIGdpZyBlbmFibGVkLlxuIik7CisJICAgICghKGVyMzIoUEhZX0NUUkwpICYgRTEwMDBfUEhZX0NUUkxfR0JFX0RJU0FCTEUpKSkKKwkJZV9kYmcoIkF0dGVtcHRpbmcgdG8gYWNjZXNzIHBhZ2UgJWQgd2hpbGUgZ2lnIGVuYWJsZWQuXG4iLAorCQkgICAgICBwYWdlKTsKIAotCS8qIEFsbCBvcGVyYXRpb25zIGluIHRoaXMgZnVuY3Rpb24gYXJlIHBoeSBhZGRyZXNzIDEgKi8KLQlody0+cGh5LmFkZHIgPSAxOwotCi0JLyogU2V0IHBhZ2UgNzY5ICovCi0JZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAoQk1fV1VDX0VOQUJMRV9QQUdFIDw8IElHUF9QQUdFX1NISUZUKSk7Ci0KLQlyZXRfdmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LCBCTV9XVUNfRU5BQkxFX1JFRywgJnBoeV9yZWcpOwotCWlmIChyZXRfdmFsKSB7Ci0JCWVfZGJnKCJDb3VsZCBub3QgcmVhZCBQSFkgcGFnZSA3NjlcbiIpOwotCQlnb3RvIG91dDsKKwlpZiAoIXBhZ2Vfc2V0KSB7CisJCS8qIEVuYWJsZSBhY2Nlc3MgdG8gUEhZIHdha2V1cCByZWdpc3RlcnMgKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX2VuYWJsZV9waHlfd2FrZXVwX3JlZ19hY2Nlc3NfYm0oaHcsICZwaHlfcmVnKTsKKwkJaWYgKHJldF92YWwpIHsKKwkJCWVfZGJnKCJDb3VsZCBub3QgZW5hYmxlIFBIWSB3YWtldXAgcmVnIGFjY2Vzc1xuIik7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAotCS8qIEZpcnN0IGNsZWFyIGJpdCA0IHRvIGF2b2lkIGEgcG93ZXIgc3RhdGUgY2hhbmdlICovCi0JcGh5X3JlZyAmPSB+KEJNX1dVQ19IT1NUX1dVX0JJVCk7Ci0JcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIEJNX1dVQ19FTkFCTEVfUkVHLCBwaHlfcmVnKTsKLQlpZiAocmV0X3ZhbCkgewotCQllX2RiZygiQ291bGQgbm90IGNsZWFyIFBIWSBwYWdlIDc2OSBiaXQgNFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KKwllX2RiZygiQWNjZXNzaW5nIFBIWSBwYWdlICVkIHJlZyAweCV4XG4iLCBwYWdlLCByZWcpOwogCi0JLyogV3JpdGUgYml0IDIgPSAxLCBhbmQgY2xlYXIgYml0IDQgdG8gNzY5XzE3ICovCi0JcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIEJNX1dVQ19FTkFCTEVfUkVHLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9yZWcgfCBCTV9XVUNfRU5BQkxFX0JJVCk7Ci0JaWYgKHJldF92YWwpIHsKLQkJZV9kYmcoIkNvdWxkIG5vdCB3cml0ZSBQSFkgcGFnZSA3NjkgYml0IDJcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBTZWxlY3QgcGFnZSA4MDAgKi8KLQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJNX1dVQ19QQUdFIDw8IElHUF9QQUdFX1NISUZUKSk7Ci0KLQkvKiBXcml0ZSB0aGUgcGFnZSA4MDAgb2Zmc2V0IHZhbHVlIHVzaW5nIG9wY29kZSAweDExICovCisJLyogV3JpdGUgdGhlIFdha2V1cCByZWdpc3RlciBwYWdlIG9mZnNldCB2YWx1ZSB1c2luZyBvcGNvZGUgMHgxMSAqLwogCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LCBCTV9XVUNfQUREUkVTU19PUENPREUsIHJlZyk7CiAJaWYgKHJldF92YWwpIHsKLQkJZV9kYmcoIkNvdWxkIG5vdCB3cml0ZSBhZGRyZXNzIG9wY29kZSB0byBwYWdlIDgwMFxuIik7CisJCWVfZGJnKCJDb3VsZCBub3Qgd3JpdGUgYWRkcmVzcyBvcGNvZGUgdG8gcGFnZSAlZFxuIiwgcGFnZSk7CiAJCWdvdG8gb3V0OwogCX0KIAogCWlmIChyZWFkKSB7Ci0JICAgICAgICAvKiBSZWFkIHRoZSBwYWdlIDgwMCB2YWx1ZSB1c2luZyBvcGNvZGUgMHgxMiAqLworCQkvKiBSZWFkIHRoZSBXYWtldXAgcmVnaXN0ZXIgcGFnZSB2YWx1ZSB1c2luZyBvcGNvZGUgMHgxMiAqLwogCQlyZXRfdmFsID0gZTEwMDBlX3JlYWRfcGh5X3JlZ19tZGljKGh3LCBCTV9XVUNfREFUQV9PUENPREUsCiAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7CiAJfSBlbHNlIHsKLQkgICAgICAgIC8qIFdyaXRlIHRoZSBwYWdlIDgwMCB2YWx1ZSB1c2luZyBvcGNvZGUgMHgxMiAqLworCQkvKiBXcml0ZSB0aGUgV2FrZXVwIHJlZ2lzdGVyIHBhZ2UgdmFsdWUgdXNpbmcgb3Bjb2RlIDB4MTIgKi8KIAkJcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIEJNX1dVQ19EQVRBX09QQ09ERSwKIAkJCQkJCSAgICAqZGF0YSk7CiAJfQogCiAJaWYgKHJldF92YWwpIHsKLQkJZV9kYmcoIkNvdWxkIG5vdCBhY2Nlc3MgZGF0YSB2YWx1ZSBmcm9tIHBhZ2UgODAwXG4iKTsKKwkJZV9kYmcoIkNvdWxkIG5vdCBhY2Nlc3MgUEhZIHJlZyAlZC4lZFxuIiwgcGFnZSwgcmVnKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JLyoKLQkgKiBSZXN0b3JlIDc2OV8xNy4yIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQotCSAqIFNldCBwYWdlIDc2OQotCSAqLwotCWUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgKEJNX1dVQ19FTkFCTEVfUEFHRSA8PCBJR1BfUEFHRV9TSElGVCkpOwotCi0JLyogQ2xlYXIgNzY5XzE3LjIgKi8KLQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgQk1fV1VDX0VOQUJMRV9SRUcsIHBoeV9yZWcpOwotCWlmIChyZXRfdmFsKSB7Ci0JCWVfZGJnKCJDb3VsZCBub3QgY2xlYXIgUEhZIHBhZ2UgNzY5IGJpdCAyXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghcGFnZV9zZXQpCisJCXJldF92YWwgPSBlMTAwMF9kaXNhYmxlX3BoeV93YWtldXBfcmVnX2FjY2Vzc19ibShodywgJnBoeV9yZWcpOwogCiBvdXQ6CiAJcmV0dXJuIHJldF92YWw7CkBAIC0yNzkyLDExICsyODY5LDEyIEBACiAgKiAgc2VtYXBob3JlIGJlZm9yZSBleGl0aW5nLgogICoqLwogc3RhdGljIHMzMiBfX2UxMDAwX3JlYWRfcGh5X3JlZ19odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9ja2VkKQorCQkJCSAgIGJvb2wgbG9ja2VkLCBib29sIHBhZ2Vfc2V0KQogewogCXMzMiByZXRfdmFsOwogCXUxNiBwYWdlID0gQk1fUEhZX1JFR19QQUdFKG9mZnNldCk7CiAJdTE2IHJlZyA9IEJNX1BIWV9SRUdfTlVNKG9mZnNldCk7CisJdTMyIHBoeV9hZGRyID0gaHctPnBoeS5hZGRyID0gZTEwMDBfZ2V0X3BoeV9hZGRyX2Zvcl9odl9wYWdlKHBhZ2UpOwogCiAJaWYgKCFsb2NrZWQpIHsKIAkJcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmUoaHcpOwpAQCAtMjgwNiw4ICsyODg0LDggQEAKIAogCS8qIFBhZ2UgODAwIHdvcmtzIGRpZmZlcmVudGx5IHRoYW4gdGhlIHJlc3Qgc28gaXQgaGFzIGl0cyBvd24gZnVuYyAqLwogCWlmIChwYWdlID09IEJNX1dVQ19QQUdFKSB7Ci0JCXJldF92YWwgPSBlMTAwMF9hY2Nlc3NfcGh5X3dha2V1cF9yZWdfYm0oaHcsIG9mZnNldCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCB0cnVlKTsKKwkJcmV0X3ZhbCA9IGUxMDAwX2FjY2Vzc19waHlfd2FrZXVwX3JlZ19ibShodywgb2Zmc2V0LCBkYXRhLAorCQkJCQkJCSB0cnVlLCBwYWdlX3NldCk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjgxNywyNiArMjg5NSwyNSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlody0+cGh5LmFkZHIgPSBlMTAwMF9nZXRfcGh5X2FkZHJfZm9yX2h2X3BhZ2UocGFnZSk7CisJaWYgKCFwYWdlX3NldCkgeworCQlpZiAocGFnZSA9PSBIVl9JTlRDX0ZDX1BBR0VfU1RBUlQpCisJCQlwYWdlID0gMDsKIAotCWlmIChwYWdlID09IEhWX0lOVENfRkNfUEFHRV9TVEFSVCkKLQkJcGFnZSA9IDA7CisJCWlmIChyZWcgPiBNQVhfUEhZX01VTFRJX1BBR0VfUkVHKSB7CisJCQkvKiBQYWdlIGlzIHNoaWZ0ZWQgbGVmdCwgUEhZIGV4cGVjdHMgKHBhZ2UgeCAzMikgKi8KKwkJCXJldF92YWwgPSBlMTAwMF9zZXRfcGFnZV9pZ3AoaHcsCisJCQkJCQkgICAgIChwYWdlIDw8IElHUF9QQUdFX1NISUZUKSk7CiAKLQlpZiAocmVnID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykgewotCQl1MzIgcGh5X2FkZHIgPSBody0+cGh5LmFkZHI7CisJCQlody0+cGh5LmFkZHIgPSBwaHlfYWRkcjsKIAotCQlody0+cGh5LmFkZHIgPSAxOwotCi0JCS8qIFBhZ2UgaXMgc2hpZnRlZCBsZWZ0LCBQSFkgZXhwZWN0cyAocGFnZSB4IDMyKSAqLwotCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywKLQkJCQkJICAgICBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKLQkJCQkJICAgICAocGFnZSA8PCBJR1BfUEFHRV9TSElGVCkpOwotCQlody0+cGh5LmFkZHIgPSBwaHlfYWRkcjsKLQotCQlpZiAocmV0X3ZhbCkKLQkJCWdvdG8gb3V0OworCQkJaWYgKHJldF92YWwpCisJCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKKwllX2RiZygicmVhZGluZyBQSFkgcGFnZSAlZCAob3IgMHgleCBzaGlmdGVkKSByZWcgMHgleFxuIiwgcGFnZSwKKwkgICAgICBwYWdlIDw8IElHUF9QQUdFX1NISUZULCByZWcpOworCiAJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywgTUFYX1BIWV9SRUdfQUREUkVTUyAmIHJlZywKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7CiBvdXQ6CkBAIC0yODU4LDcgKzI5MzUsNyBAQAogICoqLwogczMyIGUxMDAwX3JlYWRfcGh5X3JlZ19odihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEpCiB7Ci0JcmV0dXJuIF9fZTEwMDBfcmVhZF9waHlfcmVnX2h2KGh3LCBvZmZzZXQsIGRhdGEsIGZhbHNlKTsKKwlyZXR1cm4gX19lMTAwMF9yZWFkX3BoeV9yZWdfaHYoaHcsIG9mZnNldCwgZGF0YSwgZmFsc2UsIGZhbHNlKTsKIH0KIAogLyoqCkBAIC0yODcyLDcgKzI5NDksMjEgQEAKICAqKi8KIHMzMiBlMTAwMF9yZWFkX3BoeV9yZWdfaHZfbG9ja2VkKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiAqZGF0YSkKIHsKLQlyZXR1cm4gX19lMTAwMF9yZWFkX3BoeV9yZWdfaHYoaHcsIG9mZnNldCwgZGF0YSwgdHJ1ZSk7CisJcmV0dXJuIF9fZTEwMDBfcmVhZF9waHlfcmVnX2h2KGh3LCBvZmZzZXQsIGRhdGEsIHRydWUsIGZhbHNlKTsKK30KKworLyoqCisgKiAgZTEwMDBfcmVhZF9waHlfcmVnX3BhZ2VfaHYgLSBSZWFkIEhWIFBIWSByZWdpc3RlcgorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIHdyaXRlIHRvCisgKiAgQGRhdGE6IGRhdGEgdG8gd3JpdGUgYXQgcmVnaXN0ZXIgb2Zmc2V0CisgKgorICogIFJlYWRzIHRoZSBQSFkgcmVnaXN0ZXIgYXQgb2Zmc2V0IGFuZCBzdG9yZXMgdGhlIHJldHJpZXZlZCBpbmZvcm1hdGlvbgorICogIGluIGRhdGEuICBBc3N1bWVzIHNlbWFwaG9yZSBhbHJlYWR5IGFjcXVpcmVkIGFuZCBwYWdlIGFscmVhZHkgc2V0LgorICoqLworczMyIGUxMDAwX3JlYWRfcGh5X3JlZ19wYWdlX2h2KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiAqZGF0YSkKK3sKKwlyZXR1cm4gX19lMTAwMF9yZWFkX3BoeV9yZWdfaHYoaHcsIG9mZnNldCwgZGF0YSwgdHJ1ZSwgdHJ1ZSk7CiB9CiAKIC8qKgpAQCAtMjg4NiwxMSArMjk3NywxMiBAQAogICogIGF0IHRoZSBvZmZzZXQuICBSZWxlYXNlIGFueSBhY3F1aXJlZCBzZW1hcGhvcmVzIGJlZm9yZSBleGl0aW5nLgogICoqLwogc3RhdGljIHMzMiBfX2UxMDAwX3dyaXRlX3BoeV9yZWdfaHYoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2tlZCkKKwkJCQkgICAgYm9vbCBsb2NrZWQsIGJvb2wgcGFnZV9zZXQpCiB7CiAJczMyIHJldF92YWw7CiAJdTE2IHBhZ2UgPSBCTV9QSFlfUkVHX1BBR0Uob2Zmc2V0KTsKIAl1MTYgcmVnID0gQk1fUEhZX1JFR19OVU0ob2Zmc2V0KTsKKwl1MzIgcGh5X2FkZHIgPSBody0+cGh5LmFkZHIgPSBlMTAwMF9nZXRfcGh5X2FkZHJfZm9yX2h2X3BhZ2UocGFnZSk7CiAKIAlpZiAoIWxvY2tlZCkgewogCQlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZShodyk7CkBAIC0yOTAwLDggKzI5OTIsOCBAQAogCiAJLyogUGFnZSA4MDAgd29ya3MgZGlmZmVyZW50bHkgdGhhbiB0aGUgcmVzdCBzbyBpdCBoYXMgaXRzIG93biBmdW5jICovCiAJaWYgKHBhZ2UgPT0gQk1fV1VDX1BBR0UpIHsKLQkJcmV0X3ZhbCA9IGUxMDAwX2FjY2Vzc19waHlfd2FrZXVwX3JlZ19ibShodywgb2Zmc2V0LAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLCBmYWxzZSk7CisJCXJldF92YWwgPSBlMTAwMF9hY2Nlc3NfcGh5X3dha2V1cF9yZWdfYm0oaHcsIG9mZnNldCwgJmRhdGEsCisJCQkJCQkJIGZhbHNlLCBwYWdlX3NldCk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjkxMSw0MSArMzAwMyw0MCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlody0+cGh5LmFkZHIgPSBlMTAwMF9nZXRfcGh5X2FkZHJfZm9yX2h2X3BhZ2UocGFnZSk7CisJaWYgKCFwYWdlX3NldCkgeworCQlpZiAocGFnZSA9PSBIVl9JTlRDX0ZDX1BBR0VfU1RBUlQpCisJCQlwYWdlID0gMDsKIAotCWlmIChwYWdlID09IEhWX0lOVENfRkNfUEFHRV9TVEFSVCkKLQkJcGFnZSA9IDA7CisJCS8qCisJCSAqIFdvcmthcm91bmQgTURJTyBhY2Nlc3NlcyBiZWluZyBkaXNhYmxlZCBhZnRlciBlbnRlcmluZyBJRUVFCisJCSAqIFBvd2VyIERvd24gKHdoZW4gYml0IDExIG9mIHRoZSBQSFkgQ29udHJvbCByZWdpc3RlciBpcyBzZXQpCisJCSAqLworCQlpZiAoKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfODI1NzgpICYmCisJCSAgICAoaHctPnBoeS5yZXZpc2lvbiA+PSAxKSAmJgorCQkgICAgKGh3LT5waHkuYWRkciA9PSAyKSAmJgorCQkgICAgKChNQVhfUEhZX1JFR19BRERSRVNTICYgcmVnKSA9PSAwKSAmJiAoZGF0YSAmICgxIDw8IDExKSkpIHsKKwkJCXUxNiBkYXRhMiA9IDB4N0VGRjsKKwkJCXJldF92YWwgPSBlMTAwMF9hY2Nlc3NfcGh5X2RlYnVnX3JlZ3NfaHYoaHcsCisJCQkJCQkJCSAoMSA8PCA2KSB8IDB4MywKKwkJCQkJCQkJICZkYXRhMiwgZmFsc2UpOworCQkJaWYgKHJldF92YWwpCisJCQkJZ290byBvdXQ7CisJCX0KIAotCS8qCi0JICogV29ya2Fyb3VuZCBNRElPIGFjY2Vzc2VzIGJlaW5nIGRpc2FibGVkIGFmdGVyIGVudGVyaW5nIElFRUUgUG93ZXIKLQkgKiBEb3duICh3aGVuZXZlciBiaXQgMTEgb2YgdGhlIFBIWSBDb250cm9sIHJlZ2lzdGVyIGlzIHNldCkKLQkgKi8KLQlpZiAoKGh3LT5waHkudHlwZSA9PSBlMTAwMF9waHlfODI1NzgpICYmCi0JICAgIChody0+cGh5LnJldmlzaW9uID49IDEpICYmCi0JICAgIChody0+cGh5LmFkZHIgPT0gMikgJiYKLQkgICAgKChNQVhfUEhZX1JFR19BRERSRVNTICYgcmVnKSA9PSAwKSAmJgotCSAgICAoZGF0YSAmICgxIDw8IDExKSkpIHsKLQkJdTE2IGRhdGEyID0gMHg3RUZGOwotCQlyZXRfdmFsID0gZTEwMDBfYWNjZXNzX3BoeV9kZWJ1Z19yZWdzX2h2KGh3LCAoMSA8PCA2KSB8IDB4MywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YTIsIGZhbHNlKTsKLQkJaWYgKHJldF92YWwpCi0JCQlnb3RvIG91dDsKKwkJaWYgKHJlZyA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpIHsKKwkJCS8qIFBhZ2UgaXMgc2hpZnRlZCBsZWZ0LCBQSFkgZXhwZWN0cyAocGFnZSB4IDMyKSAqLworCQkJcmV0X3ZhbCA9IGUxMDAwX3NldF9wYWdlX2lncChodywKKwkJCQkJCSAgICAgKHBhZ2UgPDwgSUdQX1BBR0VfU0hJRlQpKTsKKworCQkJaHctPnBoeS5hZGRyID0gcGh5X2FkZHI7CisKKwkJCWlmIChyZXRfdmFsKQorCQkJCWdvdG8gb3V0OworCQl9CiAJfQogCi0JaWYgKHJlZyA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpIHsKLQkJdTMyIHBoeV9hZGRyID0gaHctPnBoeS5hZGRyOwotCi0JCWh3LT5waHkuYWRkciA9IDE7Ci0KLQkJLyogUGFnZSBpcyBzaGlmdGVkIGxlZnQsIFBIWSBleHBlY3RzIChwYWdlIHggMzIpICovCi0JCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LAotCQkJCQkgICAgIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAotCQkJCQkgICAgIChwYWdlIDw8IElHUF9QQUdFX1NISUZUKSk7Ci0JCWh3LT5waHkuYWRkciA9IHBoeV9hZGRyOwotCi0JCWlmIChyZXRfdmFsKQotCQkJZ290byBvdXQ7Ci0JfQorCWVfZGJnKCJ3cml0aW5nIFBIWSBwYWdlICVkIChvciAweCV4IHNoaWZ0ZWQpIHJlZyAweCV4XG4iLCBwYWdlLAorCSAgICAgIHBhZ2UgPDwgSUdQX1BBR0VfU0hJRlQsIHJlZyk7CiAKIAlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgTUFYX1BIWV9SRUdfQUREUkVTUyAmIHJlZywKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7CkBAIC0yOTY4LDcgKzMwNTksNyBAQAogICoqLwogczMyIGUxMDAwX3dyaXRlX3BoeV9yZWdfaHYoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEpCiB7Ci0JcmV0dXJuIF9fZTEwMDBfd3JpdGVfcGh5X3JlZ19odihodywgb2Zmc2V0LCBkYXRhLCBmYWxzZSk7CisJcmV0dXJuIF9fZTEwMDBfd3JpdGVfcGh5X3JlZ19odihodywgb2Zmc2V0LCBkYXRhLCBmYWxzZSwgZmFsc2UpOwogfQogCiAvKioKQEAgLTI5ODIsNyArMzA3MywyMSBAQAogICoqLwogczMyIGUxMDAwX3dyaXRlX3BoeV9yZWdfaHZfbG9ja2VkKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiBkYXRhKQogewotCXJldHVybiBfX2UxMDAwX3dyaXRlX3BoeV9yZWdfaHYoaHcsIG9mZnNldCwgZGF0YSwgdHJ1ZSk7CisJcmV0dXJuIF9fZTEwMDBfd3JpdGVfcGh5X3JlZ19odihodywgb2Zmc2V0LCBkYXRhLCB0cnVlLCBmYWxzZSk7Cit9CisKKy8qKgorICogIGUxMDAwX3dyaXRlX3BoeV9yZWdfcGFnZV9odiAtIFdyaXRlIEhWIFBIWSByZWdpc3RlcgorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIHdyaXRlIHRvCisgKiAgQGRhdGE6IGRhdGEgdG8gd3JpdGUgYXQgcmVnaXN0ZXIgb2Zmc2V0CisgKgorICogIFdyaXRlcyB0aGUgZGF0YSB0byBQSFkgcmVnaXN0ZXIgYXQgdGhlIG9mZnNldC4gIEFzc3VtZXMgc2VtYXBob3JlCisgKiAgYWxyZWFkeSBhY3F1aXJlZCBhbmQgcGFnZSBhbHJlYWR5IHNldC4KKyAqKi8KK3MzMiBlMTAwMF93cml0ZV9waHlfcmVnX3BhZ2VfaHYoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEpCit7CisJcmV0dXJuIF9fZTEwMDBfd3JpdGVfcGh5X3JlZ19odihodywgb2Zmc2V0LCBkYXRhLCB0cnVlLCB0cnVlKTsKIH0KIAogLyoqCkBAIC0zMDA0LDExICszMTA5LDEyIEBACiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqICBAb2Zmc2V0OiByZWdpc3RlciBvZmZzZXQgdG8gYmUgcmVhZCBvciB3cml0dGVuCiAgKiAgQGRhdGE6IHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gYmUgcmVhZCBvciB3cml0dGVuCi0gKiAgQHJlYWQ6IGRldGVybWluZXMgaWYgb3BlcmF0aW9uIGlzIHJlYWQgb3Igd3JpdHRlbgorICogIEByZWFkOiBkZXRlcm1pbmVzIGlmIG9wZXJhdGlvbiBpcyByZWFkIG9yIHdyaXRlCiAgKgogICogIFJlYWRzIHRoZSBQSFkgcmVnaXN0ZXIgYXQgb2Zmc2V0IGFuZCBzdG9yZXMgdGhlIHJldHJlaXZlZCBpbmZvcm1hdGlvbgogICogIGluIGRhdGEuICBBc3N1bWVzIHNlbWFwaG9yZSBhbHJlYWR5IGFjcXVpcmVkLiAgTm90ZSB0aGF0IHRoZSBwcm9jZWR1cmUKLSAqICB0byByZWFkIHRoZXNlIHJlZ3MgdXNlcyB0aGUgYWRkcmVzcyBwb3J0IGFuZCBkYXRhIHBvcnQgdG8gcmVhZC93cml0ZS4KKyAqICB0byBhY2Nlc3MgdGhlc2UgcmVncyB1c2VzIHRoZSBhZGRyZXNzIHBvcnQgYW5kIGRhdGEgcG9ydCB0byByZWFkL3dyaXRlLgorICogIFRoZXNlIGFjY2Vzc2VzIGRvbmUgd2l0aCBQSFkgYWRkcmVzcyAyIGFuZCB3aXRob3V0IHVzaW5nIHBhZ2VzLgogICoqLwogc3RhdGljIHMzMiBlMTAwMF9hY2Nlc3NfcGh5X2RlYnVnX3JlZ3NfaHYoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAqZGF0YSwgYm9vbCByZWFkKQpAQCAtMzAyOCw3ICszMTM0LDcgQEAKIAkvKiBtYXNraW5nIHdpdGggMHgzRiB0byByZW1vdmUgdGhlIHBhZ2UgZnJvbSBvZmZzZXQgKi8KIAlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgYWRkcl9yZWcsICh1MTYpb2Zmc2V0ICYgMHgzRik7CiAJaWYgKHJldF92YWwpIHsKLQkJZV9kYmcoIkNvdWxkIG5vdCB3cml0ZSBQSFkgdGhlIEhWIGFkZHJlc3MgcmVnaXN0ZXJcbiIpOworCQllX2RiZygiQ291bGQgbm90IHdyaXRlIHRoZSBBZGRyZXNzIE9mZnNldCBwb3J0IHJlZ2lzdGVyXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0zMDM5LDcgKzMxNDUsNyBAQAogCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgZGF0YV9yZWcsICpkYXRhKTsKIAogCWlmIChyZXRfdmFsKSB7Ci0JCWVfZGJnKCJDb3VsZCBub3QgcmVhZCBkYXRhIHZhbHVlIGZyb20gSFYgZGF0YSByZWdpc3RlclxuIik7CisJCWVfZGJnKCJDb3VsZCBub3QgYWNjZXNzIHRoZSBEYXRhIHBvcnQgcmVnaXN0ZXJcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UyMTAwLmMgYi9kcml2ZXJzL25ldC9lMjEwMC5jCmluZGV4IDk0ZWM5NzMuLmQ1MGE5OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UyMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZTIxMDAuYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmMgYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5jCmluZGV4IDQ4ZWU1MWIuLmExOTIyODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmMKKysrIGIvZHJpdmVycy9uZXQvZWV4cHJlc3MuYwpAQCAtMzY1LDcgKzM2NSw3IEBACiAJCQlkZXYtPmlycSA9IG1jYV9pcnFtYXBbKHBvczE+PjQpJjB4N107CiAKIAkJCS8qCi0JCQkgKiBYWFg6IFRyYW5zY2lldmVyIHNlbGVjdGlvbiBpcyBkb25lCisJCQkgKiBYWFg6IFRyYW5zY2VpdmVyIHNlbGVjdGlvbiBpcyBkb25lCiAJCQkgKiBkaWZmZXJlbnRseSBvbiB0aGUgTUNBIHZlcnNpb24uCiAJCQkgKiBIb3cgdG8gZ2V0IGl0IHRvIHNlbGVjdCBzb21ldGhpbmcKIAkJCSAqIG90aGVyIHRoYW4gZXh0ZXJuYWwvQVVJIGlzIGN1cnJlbnRseQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhLmggYi9kcml2ZXJzL25ldC9laGVhL2VoZWEuaAppbmRleCA2YzcyNTdiLi43ZGQ1ZTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWEuaAorKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWEuaApAQCAtNDU3LDcgKzQ1Nyw2IEBACiAJc3RydWN0IGVoZWFfcG9ydF9yZXMgcG9ydF9yZXNbRUhFQV9NQVhfUE9SVF9SRVNdOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgIG9mZGV2OyAvKiBPcGVuIEZpcm13YXJlIERldmljZSAqLwogCXN0cnVjdCBlaGVhX21jX2xpc3QgKm1jX2xpc3Q7CSAvKiBNdWx0aWNhc3QgTUFDIGFkZHJlc3NlcyAqLwotCXN0cnVjdCB2bGFuX2dyb3VwICp2Z3JwOwogCXN0cnVjdCBlaGVhX2VxICpxcF9lcTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfdGFzazsKIAlzdHJ1Y3QgbXV0ZXggcG9ydF9sb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKaW5kZXggM2ZkNWEyNC4uYmUyY2I0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCkBAIC02ODMsMjQgKzY4MywxMyBAQAogc3RhdGljIHZvaWQgZWhlYV9wcm9jX3NrYihzdHJ1Y3QgZWhlYV9wb3J0X3JlcyAqcHIsIHN0cnVjdCBlaGVhX2NxZSAqY3FlLAogCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWludCB2bGFuX2V4dHJhY3RlZCA9ICgoY3FlLT5zdGF0dXMgJiBFSEVBX0NRRV9WTEFOX1RBR19YVFJBQ1QpICYmCi0JCQkgICAgICBwci0+cG9ydC0+dmdycCk7CisJaWYgKGNxZS0+c3RhdHVzICYgRUhFQV9DUUVfVkxBTl9UQUdfWFRSQUNUKQorCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgY3FlLT52bGFuX3RhZyk7CiAKLQlpZiAoc2tiLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pIHsKLQkJaWYgKHZsYW5fZXh0cmFjdGVkKQotCQkJbHJvX3ZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYigmcHItPmxyb19tZ3IsIHNrYiwKLQkJCQkJCSAgICAgcHItPnBvcnQtPnZncnAsCi0JCQkJCQkgICAgIGNxZS0+dmxhbl90YWcsCi0JCQkJCQkgICAgIGNxZSk7Ci0JCWVsc2UKLQkJCWxyb19yZWNlaXZlX3NrYigmcHItPmxyb19tZ3IsIHNrYiwgY3FlKTsKLQl9IGVsc2UgewotCQlpZiAodmxhbl9leHRyYWN0ZWQpCi0JCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBwci0+cG9ydC0+dmdycCwKLQkJCQkJCSBjcWUtPnZsYW5fdGFnKTsKLQkJZWxzZQotCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLQl9CisJaWYgKHNrYi0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKQorCQlscm9fcmVjZWl2ZV9za2IoJnByLT5scm9fbWdyLCBza2IsIGNxZSk7CisJZWxzZQorCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogfQogCiBzdGF0aWMgaW50IGVoZWFfcHJvY19yd3FlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMjMzOSwzMiArMjMyOCw2IEBACiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIAotc3RhdGljIHZvaWQgZWhlYV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQotewotCXN0cnVjdCBlaGVhX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOwotCXN0cnVjdCBoY3BfZWhlYV9wb3J0X2NiMSAqY2IxOwotCXU2NCBocmV0OwotCi0JcG9ydC0+dmdycCA9IGdycDsKLQotCWNiMSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghY2IxKSB7Ci0JCXByX2Vycigibm8gbWVtIGZvciBjYjFcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlocmV0ID0gZWhlYV9oX21vZGlmeV9laGVhX3BvcnQoYWRhcHRlci0+aGFuZGxlLCBwb3J0LT5sb2dpY2FsX3BvcnRfaWQsCi0JCQkJICAgICAgIEhfUE9SVF9DQjEsIEhfUE9SVF9DQjFfQUxMLCBjYjEpOwotCWlmIChocmV0ICE9IEhfU1VDQ0VTUykKLQkJcHJfZXJyKCJtb2RpZnlfZWhlYV9wb3J0IGZhaWxlZFxuIik7Ci0KLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY2IxKTsKLW91dDoKLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyB2b2lkIGVoZWFfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTI0MDYsOCArMjM2OSw2IEBACiAJaW50IGluZGV4OwogCXU2NCBocmV0OwogCi0Jdmxhbl9ncm91cF9zZXRfZGV2aWNlKHBvcnQtPnZncnAsIHZpZCwgTlVMTCk7Ci0KIAljYjEgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWNiMSkgewogCQlwcl9lcnIoIm5vIG1lbSBmb3IgY2IxXG4iKTsKQEAgLTMyMDIsNyArMzE2Myw2IEBACiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBlaGVhX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZWhlYV9jaGFuZ2VfbXR1LAotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IGVoZWFfdmxhbl9yeF9yZWdpc3RlciwKIAkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IGVoZWFfdmxhbl9yeF9hZGRfdmlkLAogCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IGVoZWFfdmxhbl9yeF9raWxsX3ZpZCwKIAkubmRvX3R4X3RpbWVvdXQJCT0gZWhlYV90eF93YXRjaGRvZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYwppbmRleCBjZDQ0YmI4Li45NWI5ZjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jCkBAIC0zMzEsNyArMzMxLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVxLT5zcGlubG9jaywgZmxhZ3MpOwotCWVxZSA9IChzdHJ1Y3QgZWhlYV9lcWUgKilod19lcWl0X2VxX2dldF9pbmNfdmFsaWQoJmVxLT5od19xdWV1ZSk7CisJZXFlID0gaHdfZXFpdF9lcV9nZXRfaW5jX3ZhbGlkKCZlcS0+aHdfcXVldWUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVxLT5zcGlubG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIGVxZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvZW5pYy5oIGIvZHJpdmVycy9uZXQvZW5pYy9lbmljLmgKaW5kZXggMzhiMzUxYy4uY2U3NmQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy9lbmljLmgKKysrIGIvZHJpdmVycy9uZXQvZW5pYy9lbmljLmgKQEAgLTMyLDcgKzMyLDcgQEAKIAogI2RlZmluZSBEUlZfTkFNRQkJImVuaWMiCiAjZGVmaW5lIERSVl9ERVNDUklQVElPTgkJIkNpc2NvIFZJQyBFdGhlcm5ldCBOSUMgRHJpdmVyIgotI2RlZmluZSBEUlZfVkVSU0lPTgkJIjIuMS4xLjEzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjIuMS4xLjI0IgogI2RlZmluZSBEUlZfQ09QWVJJR0hUCQkiQ29weXJpZ2h0IDIwMDgtMjAxMSBDaXNjbyBTeXN0ZW1zLCBJbmMiCiAKICNkZWZpbmUgRU5JQ19CQVJTX01BWAkJNgpAQCAtNzQsNiArNzQsNyBAQAogCXN0cnVjdCB2bmljX2RldiAqdmRldjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBub3RpZnlfdGltZXI7CiAJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0OworCXN0cnVjdCB3b3JrX3N0cnVjdCBjaGFuZ2VfbXR1X3dvcms7CiAJc3RydWN0IG1zaXhfZW50cnkgbXNpeF9lbnRyeVtFTklDX0lOVFJfTUFYXTsKIAlzdHJ1Y3QgZW5pY19tc2l4X2VudHJ5IG1zaXhbRU5JQ19JTlRSX01BWF07CiAJdTMyIG1zZ19lbmFibGU7CkBAIC05Myw3ICs5NCw2IEBACiAJX19fX2NhY2hlbGluZV9hbGlnbmVkIHN0cnVjdCB2bmljX3dxIHdxW0VOSUNfV1FfTUFYXTsKIAlzcGlubG9ja190IHdxX2xvY2tbRU5JQ19XUV9NQVhdOwogCXVuc2lnbmVkIGludCB3cV9jb3VudDsKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncm91cDsKIAl1MTYgbG9vcF9lbmFibGU7CiAJdTE2IGxvb3BfdGFnOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL2VuaWNfZGV2LmMgYi9kcml2ZXJzL25ldC9lbmljL2VuaWNfZGV2LmMKaW5kZXggOTA2ODdiMS4uZmQ2MjQ3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy9lbmljX2Rldi5jCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19kZXYuYwpAQCAtMTY2LDYgKzE2NiwxNyBAQAogCXJldHVybiBlcnI7CiB9CiAKK2ludCBlbmljX2Rldl9pbnRyX2NvYWxfdGltZXJfaW5mbyhzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisJZXJyID0gdm5pY19kZXZfaW50cl9jb2FsX3RpbWVyX2luZm8oZW5pYy0+dmRldik7CisJc3Bpbl91bmxvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKIGludCBlbmljX3ZuaWNfZGV2X2RlaW5pdChzdHJ1Y3QgZW5pYyAqZW5pYykKIHsKIAlpbnQgZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy9lbmljX2Rldi5oIGIvZHJpdmVycy9uZXQvZW5pYy9lbmljX2Rldi5oCmluZGV4IGQ1ZjY4MTMuLmZmOGU4N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19kZXYuaAorKysgYi9kcml2ZXJzL25ldC9lbmljL2VuaWNfZGV2LmgKQEAgLTM0LDYgKzM0LDcgQEAKIGludCBlbmljX2Rldl9zZXRfaWdfdmxhbl9yZXdyaXRlX21vZGUoc3RydWN0IGVuaWMgKmVuaWMpOwogaW50IGVuaWNfZGV2X2VuYWJsZShzdHJ1Y3QgZW5pYyAqZW5pYyk7CiBpbnQgZW5pY19kZXZfZGlzYWJsZShzdHJ1Y3QgZW5pYyAqZW5pYyk7CitpbnQgZW5pY19kZXZfaW50cl9jb2FsX3RpbWVyX2luZm8oc3RydWN0IGVuaWMgKmVuaWMpOwogaW50IGVuaWNfdm5pY19kZXZfZGVpbml0KHN0cnVjdCBlbmljICplbmljKTsKIGludCBlbmljX2Rldl9pbml0X3Byb3YyKHN0cnVjdCBlbmljICplbmljLCBzdHJ1Y3QgdmljX3Byb3ZpbmZvICp2cCk7CiBpbnQgZW5pY19kZXZfZGVpbml0X2RvbmUoc3RydWN0IGVuaWMgKmVuaWMsIGludCAqc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19tYWluLmMgYi9kcml2ZXJzL25ldC9lbmljL2VuaWNfbWFpbi5jCmluZGV4IDJmNDMzZmIuLjY3YTI3Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZW5pYy9lbmljX21haW4uYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CkBAIC0xNTIsMTIgKzE1MywxMiBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlbmljX21zaXhfcnFfaW50cihzdHJ1Y3QgZW5pYyAqZW5pYywgdW5zaWduZWQgaW50IHJxKQogewotCXJldHVybiBycTsKKwlyZXR1cm4gZW5pYy0+Y3FbZW5pY19jcV9ycShlbmljLCBycSldLmludGVycnVwdF9vZmZzZXQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGVuaWNfbXNpeF93cV9pbnRyKHN0cnVjdCBlbmljICplbmljLCB1bnNpZ25lZCBpbnQgd3EpCiB7Ci0JcmV0dXJuIGVuaWMtPnJxX2NvdW50ICsgd3E7CisJcmV0dXJuIGVuaWMtPmNxW2VuaWNfY3Ffd3EoZW5pYywgd3EpXS5pbnRlcnJ1cHRfb2Zmc2V0OwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlbmljX21zaXhfZXJyX2ludHIoc3RydWN0IGVuaWMgKmVuaWMpCkBAIC0yODMsMTIgKzI4NCwxMCBAQAogCXUzMiByeF9jb2FsZXNjZV91c2VjczsKIAl1bnNpZ25lZCBpbnQgaSwgaW50cjsKIAotCXR4X2NvYWxlc2NlX3VzZWNzID0gbWluX3QodTMyLAotCQlJTlRSX0NPQUxFU0NFX0hXX1RPX1VTRUMoVk5JQ19JTlRSX1RJTUVSX01BWCksCi0JCWVjbWQtPnR4X2NvYWxlc2NlX3VzZWNzKTsKLQlyeF9jb2FsZXNjZV91c2VjcyA9IG1pbl90KHUzMiwKLQkJSU5UUl9DT0FMRVNDRV9IV19UT19VU0VDKFZOSUNfSU5UUl9USU1FUl9NQVgpLAotCQllY21kLT5yeF9jb2FsZXNjZV91c2Vjcyk7CisJdHhfY29hbGVzY2VfdXNlY3MgPSBtaW5fdCh1MzIsIGVjbWQtPnR4X2NvYWxlc2NlX3VzZWNzLAorCQl2bmljX2Rldl9nZXRfaW50cl9jb2FsX3RpbWVyX21heChlbmljLT52ZGV2KSk7CisJcnhfY29hbGVzY2VfdXNlY3MgPSBtaW5fdCh1MzIsIGVjbWQtPnJ4X2NvYWxlc2NlX3VzZWNzLAorCQl2bmljX2Rldl9nZXRfaW50cl9jb2FsX3RpbWVyX21heChlbmljLT52ZGV2KSk7CiAKIAlzd2l0Y2ggKHZuaWNfZGV2X2dldF9pbnRyX21vZGUoZW5pYy0+dmRldikpIHsKIAljYXNlIFZOSUNfREVWX0lOVFJfTU9ERV9JTlRYOgpAQCAtMjk3LDI2ICsyOTYsMjYgQEAKIAogCQlpbnRyID0gZW5pY19sZWdhY3lfaW9faW50cigpOwogCQl2bmljX2ludHJfY29hbGVzY2luZ190aW1lcl9zZXQoJmVuaWMtPmludHJbaW50cl0sCi0JCQlJTlRSX0NPQUxFU0NFX1VTRUNfVE9fSFcodHhfY29hbGVzY2VfdXNlY3MpKTsKKwkJCXR4X2NvYWxlc2NlX3VzZWNzKTsKIAkJYnJlYWs7CiAJY2FzZSBWTklDX0RFVl9JTlRSX01PREVfTVNJOgogCQlpZiAodHhfY29hbGVzY2VfdXNlY3MgIT0gcnhfY29hbGVzY2VfdXNlY3MpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQl2bmljX2ludHJfY29hbGVzY2luZ190aW1lcl9zZXQoJmVuaWMtPmludHJbMF0sCi0JCQlJTlRSX0NPQUxFU0NFX1VTRUNfVE9fSFcodHhfY29hbGVzY2VfdXNlY3MpKTsKKwkJCXR4X2NvYWxlc2NlX3VzZWNzKTsKIAkJYnJlYWs7CiAJY2FzZSBWTklDX0RFVl9JTlRSX01PREVfTVNJWDoKIAkJZm9yIChpID0gMDsgaSA8IGVuaWMtPndxX2NvdW50OyBpKyspIHsKIAkJCWludHIgPSBlbmljX21zaXhfd3FfaW50cihlbmljLCBpKTsKIAkJCXZuaWNfaW50cl9jb2FsZXNjaW5nX3RpbWVyX3NldCgmZW5pYy0+aW50cltpbnRyXSwKLQkJCQlJTlRSX0NPQUxFU0NFX1VTRUNfVE9fSFcodHhfY29hbGVzY2VfdXNlY3MpKTsKKwkJCQl0eF9jb2FsZXNjZV91c2Vjcyk7CiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+cnFfY291bnQ7IGkrKykgewogCQkJaW50ciA9IGVuaWNfbXNpeF9ycV9pbnRyKGVuaWMsIGkpOwogCQkJdm5pY19pbnRyX2NvYWxlc2NpbmdfdGltZXJfc2V0KCZlbmljLT5pbnRyW2ludHJdLAotCQkJCUlOVFJfQ09BTEVTQ0VfVVNFQ19UT19IVyhyeF9jb2FsZXNjZV91c2VjcykpOworCQkJCXJ4X2NvYWxlc2NlX3VzZWNzKTsKIAkJfQogCiAJCWJyZWFrOwpAQCAtNDIzLDExICs0MjIsMTggQEAKIAogCWlmIChtdHUgJiYgbXR1ICE9IGVuaWMtPnBvcnRfbXR1KSB7CiAJCWVuaWMtPnBvcnRfbXR1ID0gbXR1OwotCQlpZiAobXR1IDwgbmV0ZGV2LT5tdHUpCi0JCQluZXRkZXZfd2FybihuZXRkZXYsCi0JCQkJImludGVyZmFjZSBNVFUgKCVkKSBzZXQgaGlnaGVyICIKLQkJCQkidGhhbiBzd2l0Y2ggcG9ydCBNVFUgKCVkKVxuIiwKLQkJCQluZXRkZXYtPm10dSwgbXR1KTsKKwkJaWYgKGVuaWNfaXNfZHluYW1pYyhlbmljKSkgeworCQkJbXR1ID0gbWF4X3QoaW50LCBFTklDX01JTl9NVFUsCisJCQkJbWluX3QoaW50LCBFTklDX01BWF9NVFUsIG10dSkpOworCQkJaWYgKG10dSAhPSBuZXRkZXYtPm10dSkKKwkJCQlzY2hlZHVsZV93b3JrKCZlbmljLT5jaGFuZ2VfbXR1X3dvcmspOworCQl9IGVsc2UgeworCQkJaWYgKG10dSA8IG5ldGRldi0+bXR1KQorCQkJCW5ldGRldl93YXJuKG5ldGRldiwKKwkJCQkJImludGVyZmFjZSBNVFUgKCVkKSBzZXQgaGlnaGVyICIKKwkJCQkJInRoYW4gc3dpdGNoIHBvcnQgTVRVICglZClcbiIsCisJCQkJCW5ldGRldi0+bXR1LCBtdHUpOworCQl9CiAJfQogfQogCkBAIC03OTMsMTAgKzc5OSwxMCBAQAogfQogCiAvKiBkZXZfYmFzZV9sb2NrIHJ3bG9jayBoZWxkLCBub21pbmFsbHkgcHJvY2VzcyBjb250ZXh0ICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVuaWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICplbmljX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCQkJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpuZXRfc3RhdHMpCiB7CiAJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfc3RhdHMgPSAmbmV0ZGV2LT5zdGF0czsKIAlzdHJ1Y3Qgdm5pY19zdGF0cyAqc3RhdHM7CiAKIAllbmljX2Rldl9zdGF0c19kdW1wKGVuaWMsICZzdGF0cyk7CkBAIC0xMDIzLDE0ICsxMDI5LDYgQEAKIAl9CiB9CiAKLS8qIHJ0bmwgbG9jayBpcyBoZWxkICovCi1zdGF0aWMgdm9pZCBlbmljX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncm91cCkKLXsKLQlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JZW5pYy0+dmxhbl9ncm91cCA9IHZsYW5fZ3JvdXA7Ci19Ci0KIC8qIG5ldGlmX3R4X2xvY2sgaGVsZCwgQkhzIGRpc2FibGVkICovCiBzdGF0aWMgdm9pZCBlbmljX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKQEAgLTEyNTgsMjQgKzEyNTYsMTMgQEAKIAogCQlza2ItPmRldiA9IG5ldGRldjsKIAotCQlpZiAoZW5pYy0+dmxhbl9ncm91cCAmJiB2bGFuX3N0cmlwcGVkICYmCi0JCQkodmxhbl90Y2kgJiBDUV9FTkVUX1JRX0RFU0NfVkxBTl9UQ0lfVkxBTl9NQVNLKSkgeworCQlpZiAodmxhbl9zdHJpcHBlZCkKKwkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGFuX3RjaSk7CiAKLQkJCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9HUk8pCi0JCQkJdmxhbl9ncm9fcmVjZWl2ZSgmZW5pYy0+bmFwaVtxX251bWJlcl0sCi0JCQkJCWVuaWMtPnZsYW5fZ3JvdXAsIHZsYW5fdGNpLCBza2IpOwotCQkJZWxzZQotCQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsCi0JCQkJCWVuaWMtPnZsYW5fZ3JvdXAsIHZsYW5fdGNpKTsKLQotCQl9IGVsc2UgewotCi0JCQlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfR1JPKQotCQkJCW5hcGlfZ3JvX3JlY2VpdmUoJmVuaWMtPm5hcGlbcV9udW1iZXJdLCBza2IpOwotCQkJZWxzZQotCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Ci0KLQkJfQorCQlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfR1JPKQorCQkJbmFwaV9ncm9fcmVjZWl2ZSgmZW5pYy0+bmFwaVtxX251bWJlcl0sIHNrYik7CisJCWVsc2UKKwkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAJfSBlbHNlIHsKIAogCQkvKiBCdWZmZXIgb3ZlcmZsb3cKQEAgLTE1NjAsNyArMTU0Nyw3IEBACiAJZGVmYXVsdDoKIAkJLyogVXNpbmcgaW50ciBmb3Igbm90aWZpY2F0aW9uIGZvciBJTlR4L01TSS1YICovCiAJCWJyZWFrOwotCX07CisJfQogfQogCiAvKiBydG5sIGxvY2sgaXMgaGVsZCwgcHJvY2VzcyBjb250ZXh0ICovCkBAIC0xNjg4LDYgKzE2NzUsOSBAQAogCWlmIChuZXdfbXR1IDwgRU5JQ19NSU5fTVRVIHx8IG5ld19tdHUgPiBFTklDX01BWF9NVFUpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKGVuaWNfaXNfZHluYW1pYyhlbmljKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJaWYgKHJ1bm5pbmcpCiAJCWVuaWNfc3RvcChuZXRkZXYpOwogCkBAIC0xNzA0LDYgKzE2OTQsNTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZW5pY19jaGFuZ2VfbXR1X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBlbmljICplbmljID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBlbmljLCBjaGFuZ2VfbXR1X3dvcmspOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBlbmljLT5uZXRkZXY7CisJaW50IG5ld19tdHUgPSB2bmljX2Rldl9tdHUoZW5pYy0+dmRldik7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCW5ld19tdHUgPSBtYXhfdChpbnQsIEVOSUNfTUlOX01UVSwgbWluX3QoaW50LCBFTklDX01BWF9NVFUsIG5ld19tdHUpKTsKKworCXJ0bmxfbG9jaygpOworCisJLyogU3RvcCBSUSAqLworCWRlbF90aW1lcl9zeW5jKCZlbmljLT5ub3RpZnlfdGltZXIpOworCisJZm9yIChpID0gMDsgaSA8IGVuaWMtPnJxX2NvdW50OyBpKyspCisJCW5hcGlfZGlzYWJsZSgmZW5pYy0+bmFwaVtpXSk7CisKKwl2bmljX2ludHJfbWFzaygmZW5pYy0+aW50clswXSk7CisJZW5pY19zeW5jaHJvbml6ZV9pcnFzKGVuaWMpOworCWVyciA9IHZuaWNfcnFfZGlzYWJsZSgmZW5pYy0+cnFbMF0pOworCWlmIChlcnIpIHsKKwkJbmV0ZGV2X2VycihuZXRkZXYsICJVbmFibGUgdG8gZGlzYWJsZSBSUS5cbiIpOworCQlyZXR1cm47CisJfQorCXZuaWNfcnFfY2xlYW4oJmVuaWMtPnJxWzBdLCBlbmljX2ZyZWVfcnFfYnVmKTsKKwl2bmljX2NxX2NsZWFuKCZlbmljLT5jcVswXSk7CisJdm5pY19pbnRyX2NsZWFuKCZlbmljLT5pbnRyWzBdKTsKKworCS8qIEZpbGwgUlEgd2l0aCBuZXdfbXR1LXNpemVkIGJ1ZmZlcnMgKi8KKwluZXRkZXYtPm10dSA9IG5ld19tdHU7CisJdm5pY19ycV9maWxsKCZlbmljLT5ycVswXSwgZW5pY19ycV9hbGxvY19idWYpOworCS8qIE5lZWQgYXQgbGVhc3Qgb25lIGJ1ZmZlciBvbiByaW5nIHRvIGdldCBnb2luZyAqLworCWlmICh2bmljX3JxX2Rlc2NfdXNlZCgmZW5pYy0+cnFbMF0pID09IDApIHsKKwkJbmV0ZGV2X2VycihuZXRkZXYsICJVbmFibGUgdG8gYWxsb2MgcmVjZWl2ZSBidWZmZXJzLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBTdGFydCBSUSAqLworCXZuaWNfcnFfZW5hYmxlKCZlbmljLT5ycVswXSk7CisJbmFwaV9lbmFibGUoJmVuaWMtPm5hcGlbMF0pOworCXZuaWNfaW50cl91bm1hc2soJmVuaWMtPmludHJbMF0pOworCWVuaWNfbm90aWZ5X3RpbWVyX3N0YXJ0KGVuaWMpOworCisJcnRubF91bmxvY2soKTsKKworCW5ldGRldl9pbmZvKG5ldGRldiwgImludGVyZmFjZSBNVFUgc2V0IGFzICVkXG4iLCBuZXRkZXYtPm10dSk7Cit9CisKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgZW5pY19wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKQEAgLTE3MTgsOCArMTc1NywxMiBAQAogCQkJZW5pY19pc3JfbXNpeF9ycShlbmljLT5tc2l4X2VudHJ5W2ludHJdLnZlY3RvciwKIAkJCQkmZW5pYy0+bmFwaVtpXSk7CiAJCX0KLQkJaW50ciA9IGVuaWNfbXNpeF93cV9pbnRyKGVuaWMsIGkpOwotCQllbmljX2lzcl9tc2l4X3dxKGVuaWMtPm1zaXhfZW50cnlbaW50cl0udmVjdG9yLCBlbmljKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+d3FfY291bnQ7IGkrKykgeworCQkJaW50ciA9IGVuaWNfbXNpeF93cV9pbnRyKGVuaWMsIGkpOworCQkJZW5pY19pc3JfbXNpeF93cShlbmljLT5tc2l4X2VudHJ5W2ludHJdLnZlY3RvciwgZW5pYyk7CisJCX0KKwogCQlicmVhazsKIAljYXNlIFZOSUNfREVWX0lOVFJfTU9ERV9NU0k6CiAJCWVuaWNfaXNyX21zaShlbmljLT5wZGV2LT5pcnEsIGVuaWMpOwpAQCAtMjA1NywxMyArMjEwMCwxMiBAQAogCS5uZG9fb3BlbgkJPSBlbmljX29wZW4sCiAJLm5kb19zdG9wCQk9IGVuaWNfc3RvcCwKIAkubmRvX3N0YXJ0X3htaXQJCT0gZW5pY19oYXJkX3N0YXJ0X3htaXQsCi0JLm5kb19nZXRfc3RhdHMJCT0gZW5pY19nZXRfc3RhdHMsCisJLm5kb19nZXRfc3RhdHM2NAk9IGVuaWNfZ2V0X3N0YXRzLAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X3J4X21vZGUJPSBlbmljX3NldF9yeF9tb2RlLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gZW5pY19zZXRfcnhfbW9kZSwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGVuaWNfc2V0X21hY19hZGRyZXNzX2R5bmFtaWMsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGVuaWNfY2hhbmdlX210dSwKLQkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSBlbmljX3ZsYW5fcnhfcmVnaXN0ZXIsCiAJLm5kb192bGFuX3J4X2FkZF92aWQJPSBlbmljX3ZsYW5fcnhfYWRkX3ZpZCwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSBlbmljX3ZsYW5fcnhfa2lsbF92aWQsCiAJLm5kb190eF90aW1lb3V0CQk9IGVuaWNfdHhfdGltZW91dCwKQEAgLTIwNzksMTMgKzIxMjEsMTIgQEAKIAkubmRvX29wZW4JCT0gZW5pY19vcGVuLAogCS5uZG9fc3RvcAkJPSBlbmljX3N0b3AsCiAJLm5kb19zdGFydF94bWl0CQk9IGVuaWNfaGFyZF9zdGFydF94bWl0LAotCS5uZG9fZ2V0X3N0YXRzCQk9IGVuaWNfZ2V0X3N0YXRzLAorCS5uZG9fZ2V0X3N0YXRzNjQJPSBlbmljX2dldF9zdGF0cywKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGVuaWNfc2V0X21hY19hZGRyZXNzLAogCS5uZG9fc2V0X3J4X21vZGUJPSBlbmljX3NldF9yeF9tb2RlLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gZW5pY19zZXRfcnhfbW9kZSwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZW5pY19jaGFuZ2VfbXR1LAotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IGVuaWNfdmxhbl9yeF9yZWdpc3RlciwKIAkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IGVuaWNfdmxhbl9yeF9hZGRfdmlkLAogCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IGVuaWNfdmxhbl9yeF9raWxsX3ZpZCwKIAkubmRvX3R4X3RpbWVvdXQJCT0gZW5pY190eF90aW1lb3V0LApAQCAtMjExMiw2ICsyMTUzLDE0IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGVycjsKIAorCS8qIEdldCBpbnRlcnJ1cHQgY29hbGVzY2UgdGltZXIgaW5mbyAqLworCWVyciA9IGVuaWNfZGV2X2ludHJfY29hbF90aW1lcl9pbmZvKGVuaWMpOworCWlmIChlcnIpIHsKKwkJZGV2X3dhcm4oZGV2LCAiVXNpbmcgZGVmYXVsdCBjb252ZXJzaW9uIGZhY3RvciBmb3IgIgorCQkJImludGVycnVwdCBjb2FsZXNjZSB0aW1lclxuIik7CisJCXZuaWNfZGV2X2ludHJfY29hbF90aW1lcl9pbmZvX2RlZmF1bHQoZW5pYy0+dmRldik7CisJfQorCiAJLyogR2V0IHZOSUMgY29uZmlndXJhdGlvbgogCSAqLwogCkBAIC0yMzQ1LDYgKzIzOTQsNyBAQAogCWVuaWMtPm5vdGlmeV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZW5pYzsKIAogCUlOSVRfV09SSygmZW5pYy0+cmVzZXQsIGVuaWNfcmVzZXQpOworCUlOSVRfV09SSygmZW5pYy0+Y2hhbmdlX210dV93b3JrLCBlbmljX2NoYW5nZV9tdHVfd29yayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+d3FfY291bnQ7IGkrKykKIAkJc3Bpbl9sb2NrX2luaXQoJmVuaWMtPndxX2xvY2tbaV0pOwpAQCAtMjQyNyw2ICsyNDc3LDcgQEAKIAkJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJCWNhbmNlbF93b3JrX3N5bmMoJmVuaWMtPnJlc2V0KTsKKwkJY2FuY2VsX3dvcmtfc3luYygmZW5pYy0+Y2hhbmdlX210dV93b3JrKTsKIAkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAkJZW5pY19kZXZfZGVpbml0KGVuaWMpOwogCQl2bmljX2Rldl9jbG9zZShlbmljLT52ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19yZXMuYyBiL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19yZXMuYwppbmRleCA2ZTVjNjM1Li40YTM1MzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lbmljL2VuaWNfcmVzLmMKKysrIGIvZHJpdmVycy9uZXQvZW5pYy9lbmljX3Jlcy5jCkBAIC05MCwxOCArOTAsMzAgQEAKIAkJbWF4X3QodTE2LCBFTklDX01JTl9NVFUsCiAJCWMtPm10dSkpOwogCi0JYy0+aW50cl90aW1lcl91c2VjID0gbWluX3QodTMyLAotCQlJTlRSX0NPQUxFU0NFX0hXX1RPX1VTRUMoVk5JQ19JTlRSX1RJTUVSX01BWCksCi0JCWMtPmludHJfdGltZXJfdXNlYyk7CisJYy0+aW50cl90aW1lcl91c2VjID0gbWluX3QodTMyLCBjLT5pbnRyX3RpbWVyX3VzZWMsCisJCXZuaWNfZGV2X2dldF9pbnRyX2NvYWxfdGltZXJfbWF4KGVuaWMtPnZkZXYpKTsKIAogCWRldl9pbmZvKGVuaWNfZ2V0X2RldihlbmljKSwKIAkJInZOSUMgTUFDIGFkZHIgJXBNIHdxL3JxICVkLyVkIG10dSAlZFxuIiwKIAkJZW5pYy0+bWFjX2FkZHIsIGMtPndxX2Rlc2NfY291bnQsIGMtPnJxX2Rlc2NfY291bnQsIGMtPm10dSk7Ci0JZGV2X2luZm8oZW5pY19nZXRfZGV2KGVuaWMpLCAidk5JQyBjc3VtIHR4L3J4ICVkLyVkICIKLQkJInRzbyAlZCBpbnRyIHRpbWVyICVkIHVzZWMgcnNzICVkXG4iLAotCQlFTklDX1NFVFRJTkcoZW5pYywgVFhDU1VNKSwgRU5JQ19TRVRUSU5HKGVuaWMsIFJYQ1NVTSksCi0JCUVOSUNfU0VUVElORyhlbmljLCBUU08pLAotCQljLT5pbnRyX3RpbWVyX3VzZWMsIEVOSUNfU0VUVElORyhlbmljLCBSU1MpKTsKKworCWRldl9pbmZvKGVuaWNfZ2V0X2RldihlbmljKSwgInZOSUMgY3N1bSB0eC9yeCAlcy8lcyAiCisJCSJ0c28vbHJvICVzLyVzIHJzcyAlcyBpbnRyIG1vZGUgJXMgdHlwZSAlcyB0aW1lciAlZCB1c2VjICIKKwkJImxvb3BiYWNrIHRhZyAweCUwNHhcbiIsCisJCUVOSUNfU0VUVElORyhlbmljLCBUWENTVU0pID8gInllcyIgOiAibm8iLAorCQlFTklDX1NFVFRJTkcoZW5pYywgUlhDU1VNKSA/ICJ5ZXMiIDogIm5vIiwKKwkJRU5JQ19TRVRUSU5HKGVuaWMsIFRTTykgPyAieWVzIiA6ICJubyIsCisJCUVOSUNfU0VUVElORyhlbmljLCBMUk8pID8gInllcyIgOiAibm8iLAorCQlFTklDX1NFVFRJTkcoZW5pYywgUlNTKSA/ICJ5ZXMiIDogIm5vIiwKKwkJYy0+aW50cl9tb2RlID09IFZFTkVUX0lOVFJfTU9ERV9JTlRYID8gIklOVHgiIDoKKwkJYy0+aW50cl9tb2RlID09IFZFTkVUX0lOVFJfTU9ERV9NU0kgPyAiTVNJIiA6CisJCWMtPmludHJfbW9kZSA9PSBWRU5FVF9JTlRSX01PREVfQU5ZID8gImFueSIgOgorCQkidW5rbm93biIsCisJCWMtPmludHJfdGltZXJfdHlwZSA9PSBWRU5FVF9JTlRSX1RZUEVfTUlOID8gIm1pbiIgOgorCQljLT5pbnRyX3RpbWVyX3R5cGUgPT0gVkVORVRfSU5UUl9UWVBFX0lETEUgPyAiaWRsZSIgOgorCQkidW5rbm93biIsCisJCWMtPmludHJfdGltZXJfdXNlYywKKwkJYy0+bG9vcF90YWcpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTAsNyArMzAyLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBlbmljLT5pbnRyX2NvdW50OyBpKyspIHsKIAkJdm5pY19pbnRyX2luaXQoJmVuaWMtPmludHJbaV0sCi0JCQlJTlRSX0NPQUxFU0NFX1VTRUNfVE9fSFcoZW5pYy0+Y29uZmlnLmludHJfdGltZXJfdXNlYyksCisJCQllbmljLT5jb25maWcuaW50cl90aW1lcl91c2VjLAogCQkJZW5pYy0+Y29uZmlnLmludHJfdGltZXJfdHlwZSwKIAkJCW1hc2tfb25fYXNzZXJ0aW9uKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfY3EuYyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5jCmluZGV4IGI4NmQ2ZWYuLjBkYWExYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5jCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5jCkBAIC03NCw2ICs3NCw4IEBACiAJaW93cml0ZTMyKGNxX21lc3NhZ2VfZW5hYmxlLCAmY3EtPmN0cmwtPmNxX21lc3NhZ2VfZW5hYmxlKTsKIAlpb3dyaXRlMzIoaW50ZXJydXB0X29mZnNldCwgJmNxLT5jdHJsLT5pbnRlcnJ1cHRfb2Zmc2V0KTsKIAl3cml0ZXEoY3FfbWVzc2FnZV9hZGRyLCAmY3EtPmN0cmwtPmNxX21lc3NhZ2VfYWRkcik7CisKKwljcS0+aW50ZXJydXB0X29mZnNldCA9IGludGVycnVwdF9vZmZzZXQ7CiB9CiAKIHZvaWQgdm5pY19jcV9jbGVhbihzdHJ1Y3Qgdm5pY19jcSAqY3EpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfY3EuaCBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5oCmluZGV4IDU1MmQzZGEuLjU3OTMxNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5oCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5oCkBAIC01Nyw2ICs1Nyw3IEBACiAJc3RydWN0IHZuaWNfZGV2X3JpbmcgcmluZzsKIAl1bnNpZ25lZCBpbnQgdG9fY2xlYW47CiAJdW5zaWduZWQgaW50IGxhc3RfY29sb3I7CisJdW5zaWduZWQgaW50IGludGVycnVwdF9vZmZzZXQ7CiB9OwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2bmljX2NxX3NlcnZpY2Uoc3RydWN0IHZuaWNfY3EgKmNxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2Rldi5jIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2Rldi5jCmluZGV4IDY4ZjI0YWUuLjhjNGM4Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19kZXYuYworKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2LmMKQEAgLTQwLDYgKzQwLDEyIEBACiAJdW5zaWduZWQgaW50IGNvdW50OwogfTsKIAorc3RydWN0IHZuaWNfaW50cl9jb2FsX3RpbWVyX2luZm8geworCXUzMiBtdWw7CisJdTMyIGRpdjsKKwl1MzIgbWF4X3VzZWM7Cit9OworCiBzdHJ1Y3Qgdm5pY19kZXYgewogCXZvaWQgKnByaXY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CkBAIC01OCw2ICs2NCw3IEBACiAJZW51bSB2bmljX3Byb3h5X3R5cGUgcHJveHk7CiAJdTMyIHByb3h5X2luZGV4OwogCXU2NCBhcmdzW1ZOSUNfREVWQ01EX05BUkdTXTsKKwlzdHJ1Y3Qgdm5pY19pbnRyX2NvYWxfdGltZXJfaW5mbyBpbnRyX2NvYWxfdGltZXJfaW5mbzsKIH07CiAKICNkZWZpbmUgVk5JQ19NQVhfUkVTX0hEUl9TSVpFIFwKQEAgLTc5NCw2ICs4MDEsNDIgQEAKIAlyZXR1cm4gdm5pY19kZXZfY21kKHZkZXYsIENNRF9ERUlOSVQsICZhMCwgJmExLCB3YWl0KTsKIH0KIAordm9pZCB2bmljX2Rldl9pbnRyX2NvYWxfdGltZXJfaW5mb19kZWZhdWx0KHN0cnVjdCB2bmljX2RldiAqdmRldikKK3sKKwkvKiBEZWZhdWx0OiBoYXJkd2FyZSBpbnRyIGNvYWwgdGltZXIgaXMgaW4gdW5pdHMgb2YgMS41IHVzZWNzICovCisJdmRldi0+aW50cl9jb2FsX3RpbWVyX2luZm8ubXVsID0gMjsKKwl2ZGV2LT5pbnRyX2NvYWxfdGltZXJfaW5mby5kaXYgPSAzOworCXZkZXYtPmludHJfY29hbF90aW1lcl9pbmZvLm1heF91c2VjID0KKwkJdm5pY19kZXZfaW50cl9jb2FsX3RpbWVyX2h3X3RvX3VzZWModmRldiwgMHhmZmZmKTsKK30KKworaW50IHZuaWNfZGV2X2ludHJfY29hbF90aW1lcl9pbmZvKHN0cnVjdCB2bmljX2RldiAqdmRldikKK3sKKwlpbnQgd2FpdCA9IDEwMDA7CisJaW50IGVycjsKKworCW1lbXNldCh2ZGV2LT5hcmdzLCAwLCBzaXplb2YodmRldi0+YXJncykpOworCisJZXJyID0gX3ZuaWNfZGV2X2NtZCh2ZGV2LCBDTURfSU5UUl9DT0FMX0NPTlZFUlQsIHdhaXQpOworCisJLyogVXNlIGRlZmF1bHRzIHdoZW4gZmlybXdhcmUgZG9lc24ndCBzdXBwb3J0IHRoZSBkZXZjbWQgYXQgYWxsIG9yCisJICogc3VwcG9ydHMgaXQgZm9yIG9ubHkgc3BlY2lmaWMgaGFyZHdhcmUKKwkgKi8KKwlpZiAoKGVyciA9PSBFUlJfRUNNRFVOS05PV04pIHx8CisJCSghZXJyICYmICEodmRldi0+YXJnc1swXSAmJiB2ZGV2LT5hcmdzWzFdICYmIHZkZXYtPmFyZ3NbMl0pKSkgeworCQlwcl93YXJuaW5nKCJVc2luZyBkZWZhdWx0IGNvbnZlcnNpb24gZmFjdG9yIGZvciAiCisJCQkiaW50ZXJydXB0IGNvYWxlc2NlIHRpbWVyXG4iKTsKKwkJdm5pY19kZXZfaW50cl9jb2FsX3RpbWVyX2luZm9fZGVmYXVsdCh2ZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJdmRldi0+aW50cl9jb2FsX3RpbWVyX2luZm8ubXVsID0gKHUzMikgdmRldi0+YXJnc1swXTsKKwl2ZGV2LT5pbnRyX2NvYWxfdGltZXJfaW5mby5kaXYgPSAodTMyKSB2ZGV2LT5hcmdzWzFdOworCXZkZXYtPmludHJfY29hbF90aW1lcl9pbmZvLm1heF91c2VjID0gKHUzMikgdmRldi0+YXJnc1syXTsKKworCXJldHVybiBlcnI7Cit9CisKIGludCB2bmljX2Rldl9saW5rX3N0YXR1cyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpCiB7CiAJaWYgKCF2bmljX2Rldl9ub3RpZnlfcmVhZHkodmRldikpCkBAIC04MzgsNiArODgxLDIzIEBACiAJcmV0dXJuIHZkZXYtPmludHJfbW9kZTsKIH0KIAordTMyIHZuaWNfZGV2X2ludHJfY29hbF90aW1lcl91c2VjX3RvX2h3KHN0cnVjdCB2bmljX2RldiAqdmRldiwgdTMyIHVzZWMpCit7CisJcmV0dXJuICh1c2VjICogdmRldi0+aW50cl9jb2FsX3RpbWVyX2luZm8ubXVsKSAvCisJCXZkZXYtPmludHJfY29hbF90aW1lcl9pbmZvLmRpdjsKK30KKwordTMyIHZuaWNfZGV2X2ludHJfY29hbF90aW1lcl9od190b191c2VjKHN0cnVjdCB2bmljX2RldiAqdmRldiwgdTMyIGh3X2N5Y2xlcykKK3sKKwlyZXR1cm4gKGh3X2N5Y2xlcyAqIHZkZXYtPmludHJfY29hbF90aW1lcl9pbmZvLmRpdikgLworCQl2ZGV2LT5pbnRyX2NvYWxfdGltZXJfaW5mby5tdWw7Cit9CisKK3UzMiB2bmljX2Rldl9nZXRfaW50cl9jb2FsX3RpbWVyX21heChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpCit7CisJcmV0dXJuIHZkZXYtPmludHJfY29hbF90aW1lcl9pbmZvLm1heF91c2VjOworfQorCiB2b2lkIHZuaWNfZGV2X3VucmVnaXN0ZXIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KQogewogCWlmICh2ZGV2KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2LmggYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2LmgKaW5kZXggY2Y0ODJhMi4uODUyYjY5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2Rldi5oCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19kZXYuaApAQCAtMTA5LDExICsxMDksMTYgQEAKIGludCB2bmljX2Rldl9vcGVuX2RvbmUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBpbnQgKmRvbmUpOwogaW50IHZuaWNfZGV2X2luaXQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBpbnQgYXJnKTsKIGludCB2bmljX2Rldl9kZWluaXQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKK3ZvaWQgdm5pY19kZXZfaW50cl9jb2FsX3RpbWVyX2luZm9fZGVmYXVsdChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOworaW50IHZuaWNfZGV2X2ludHJfY29hbF90aW1lcl9pbmZvKHN0cnVjdCB2bmljX2RldiAqdmRldik7CiBpbnQgdm5pY19kZXZfaGFuZ19yZXNldChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGludCBhcmcpOwogaW50IHZuaWNfZGV2X2hhbmdfcmVzZXRfZG9uZShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGludCAqZG9uZSk7CiB2b2lkIHZuaWNfZGV2X3NldF9pbnRyX21vZGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAogCWVudW0gdm5pY19kZXZfaW50cl9tb2RlIGludHJfbW9kZSk7CiBlbnVtIHZuaWNfZGV2X2ludHJfbW9kZSB2bmljX2Rldl9nZXRfaW50cl9tb2RlKHN0cnVjdCB2bmljX2RldiAqdmRldik7Cit1MzIgdm5pY19kZXZfaW50cl9jb2FsX3RpbWVyX3VzZWNfdG9faHcoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1MzIgdXNlYyk7Cit1MzIgdm5pY19kZXZfaW50cl9jb2FsX3RpbWVyX2h3X3RvX3VzZWMoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1MzIgaHdfY3ljbGVzKTsKK3UzMiB2bmljX2Rldl9nZXRfaW50cl9jb2FsX3RpbWVyX21heChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOwogdm9pZCB2bmljX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCB2bmljX2RldiAqdmRldik7CiBpbnQgdm5pY19kZXZfc2V0X2lnX3ZsYW5fcmV3cml0ZV9tb2RlKHN0cnVjdCB2bmljX2RldiAqdmRldiwKIAl1OCBpZ192bGFuX3Jld3JpdGVfbW9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2Y21kLmggYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2Y21kLmgKaW5kZXggYzU1NjliZi4uODAyNWU4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2RldmNtZC5oCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19kZXZjbWQuaApAQCAtMzE4LDYgKzMxOCwyNSBAQAogCSAqICAgICAgICAgICAgIEVSUl9FSU5QUk9HUkVTUyAtIGNvbW1hbmQgaW4gYTAgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MKIAkgKi8KIAlDTURfU1RBVFVTID0gX0NNREMoX0NNRF9ESVJfUlcsIF9DTURfVlRZUEVfQUxMLCA0OSksCisKKwkvKgorCSAqIFJldHVybnMgaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZXIgY29udmVyc2lvbiBmYWN0b3JzLgorCSAqIEFmdGVyIGNhbGxpbmcgdGhpcyBkZXZjbWQsIEVOSUMgZHJpdmVyIGNhbiBjb252ZXJ0CisJICogaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZXIgaW4gdXNlYyBpbnRvIENQVSBjeWNsZXMgYXMgZm9sbG93czoKKwkgKgorCSAqICAgaW50cl90aW1lcl9jeWNsZXMgPSBpbnRyX3RpbWVyX3VzZWMgKiBtdWx0aXBsaWVyIC8gZGl2aXNvcgorCSAqCisJICogSW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZXIgaW4gdXNlY3MgY2FuIGJlIG9idGFpbmVkIGZyb20KKwkgKiBDUFUgY3ljbGVzIGFzIGZvbGxvd3M6CisJICoKKwkgKiAgIGludHJfdGltZXJfdXNlYyA9IGludHJfdGltZXJfY3ljbGVzICogZGl2aXNvciAvIG11bHRpcGxpZXIKKwkgKgorCSAqIGluOiBub25lCisJICogb3V0OiAodTMyKWEwID0gbXVsdGlwbGllcgorCSAqICAgICAgKHUzMilhMSA9IGRpdmlzb3IKKwkgKiAgICAgICh1MzIpYTIgPSBtYXhpbXVtIHRpbWVyIHZhbHVlIGluIHVzZWMKKwkgKi8KKwlDTURfSU5UUl9DT0FMX0NPTlZFUlQgPSBfQ01EQyhfQ01EX0RJUl9SRUFELCBfQ01EX1ZUWVBFX0FMTCwgNTApLAogfTsKIAogLyogQ01EX0VOQUJMRTIgZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19lbmV0LmggYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZW5ldC5oCmluZGV4IGU4NzQwZTMuLjYwOTU0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19lbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2VuZXQuaApAQCAtMjAsMTAgKzIwLDYgQEAKICNpZm5kZWYgX1ZOSUNfRU5JQ19IXwogI2RlZmluZSBfVk5JQ19FTklDX0hfCiAKLS8qIEhhcmR3YXJlIGludHIgY29hbGVzY2UgdGltZXIgaXMgaW4gdW5pdHMgb2YgMS41dXMgKi8KLSNkZWZpbmUgSU5UUl9DT0FMRVNDRV9VU0VDX1RPX0hXKHVzZWMpICgodXNlYykgKiAyLzMpCi0jZGVmaW5lIElOVFJfQ09BTEVTQ0VfSFdfVE9fVVNFQyh1c2VjKSAoKHVzZWMpICogMy8yKQotCiAvKiBEZXZpY2Utc3BlY2lmaWMgcmVnaW9uOiBlbmV0IGNvbmZpZ3VyYXRpb24gKi8KIHN0cnVjdCB2bmljX2VuZXRfY29uZmlnIHsKIAl1MzIgZmxhZ3M7CkBAIC01MSw0ICs0NywxMSBAQAogI2RlZmluZSBWRU5FVEZfUlNTSEFTSF9UQ1BJUFY2X0VYIDB4NDAwCS8qIEhhc2ggb24gVENQICsgSVB2NiBleHQuIGZpZWxkcyAqLwogI2RlZmluZSBWRU5FVEZfTE9PUAkJMHg4MDAJLyogTG9vcGJhY2sgZW5hYmxlZCAqLwogCisjZGVmaW5lIFZFTkVUX0lOVFJfVFlQRV9NSU4JMAkvKiBUaW1lciBzcGVjcyBtaW4gaW50ZXJydXB0IHNwYWNpbmcgKi8KKyNkZWZpbmUgVkVORVRfSU5UUl9UWVBFX0lETEUJMQkvKiBUaW1lciBzcGVjcyBpZGxlIHRpbWUgYmVmb3JlIGlycSAqLworCisjZGVmaW5lIFZFTkVUX0lOVFJfTU9ERV9BTlkJMAkvKiBUcnkgTVNJLVgsIHRoZW4gTVNJLCB0aGVuIElOVHggKi8KKyNkZWZpbmUgVkVORVRfSU5UUl9NT0RFX01TSQkxCS8qIFRyeSBNU0kgdGhlbiBJTlR4ICovCisjZGVmaW5lIFZFTkVUX0lOVFJfTU9ERV9JTlRYCTIJLyogVHJ5IElOVHggb25seSAqLworCiAjZW5kaWYgLyogX1ZOSUNfRU5JQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2ludHIuYyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19pbnRyLmMKaW5kZXggMzg3Mzc3MS4uMGNhMTA3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2ludHIuYworKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfaW50ci5jCkBAIC00Niw3ICs0Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgdm5pY19pbnRyX2luaXQoc3RydWN0IHZuaWNfaW50ciAqaW50ciwgdW5zaWduZWQgaW50IGNvYWxlc2NpbmdfdGltZXIsCit2b2lkIHZuaWNfaW50cl9pbml0KHN0cnVjdCB2bmljX2ludHIgKmludHIsIHUzMiBjb2FsZXNjaW5nX3RpbWVyLAogCXVuc2lnbmVkIGludCBjb2FsZXNjaW5nX3R5cGUsIHVuc2lnbmVkIGludCBtYXNrX29uX2Fzc2VydGlvbikKIHsKIAl2bmljX2ludHJfY29hbGVzY2luZ190aW1lcl9zZXQoaW50ciwgY29hbGVzY2luZ190aW1lcik7CkBAIC01Niw5ICs1NiwxMCBAQAogfQogCiB2b2lkIHZuaWNfaW50cl9jb2FsZXNjaW5nX3RpbWVyX3NldChzdHJ1Y3Qgdm5pY19pbnRyICppbnRyLAotCXVuc2lnbmVkIGludCBjb2FsZXNjaW5nX3RpbWVyKQorCXUzMiBjb2FsZXNjaW5nX3RpbWVyKQogewotCWlvd3JpdGUzMihjb2FsZXNjaW5nX3RpbWVyLCAmaW50ci0+Y3RybC0+Y29hbGVzY2luZ190aW1lcik7CisJaW93cml0ZTMyKHZuaWNfZGV2X2ludHJfY29hbF90aW1lcl91c2VjX3RvX2h3KGludHItPnZkZXYsCisJCWNvYWxlc2NpbmdfdGltZXIpLCAmaW50ci0+Y3RybC0+Y29hbGVzY2luZ190aW1lcik7CiB9CiAKIHZvaWQgdm5pY19pbnRyX2NsZWFuKHN0cnVjdCB2bmljX2ludHIgKmludHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfaW50ci5oIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2ludHIuaAppbmRleCAwOWRjMGI3Li4yYjE2MzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfaW50ci5oCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19pbnRyLmgKQEAgLTI0LDggKzI0LDYgQEAKIAogI2luY2x1ZGUgInZuaWNfZGV2LmgiCiAKLSNkZWZpbmUgVk5JQ19JTlRSX1RJTUVSX01BWAkJMHhmZmZmCi0KICNkZWZpbmUgVk5JQ19JTlRSX1RJTUVSX1RZUEVfQUJTCTAKICNkZWZpbmUgVk5JQ19JTlRSX1RJTUVSX1RZUEVfUVVJRVQJMQogCkBAIC0xMDQsMTAgKzEwMiwxMCBAQAogdm9pZCB2bmljX2ludHJfZnJlZShzdHJ1Y3Qgdm5pY19pbnRyICppbnRyKTsKIGludCB2bmljX2ludHJfYWxsb2Moc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBzdHJ1Y3Qgdm5pY19pbnRyICppbnRyLAogCXVuc2lnbmVkIGludCBpbmRleCk7Ci12b2lkIHZuaWNfaW50cl9pbml0KHN0cnVjdCB2bmljX2ludHIgKmludHIsIHVuc2lnbmVkIGludCBjb2FsZXNjaW5nX3RpbWVyLAordm9pZCB2bmljX2ludHJfaW5pdChzdHJ1Y3Qgdm5pY19pbnRyICppbnRyLCB1MzIgY29hbGVzY2luZ190aW1lciwKIAl1bnNpZ25lZCBpbnQgY29hbGVzY2luZ190eXBlLCB1bnNpZ25lZCBpbnQgbWFza19vbl9hc3NlcnRpb24pOwogdm9pZCB2bmljX2ludHJfY29hbGVzY2luZ190aW1lcl9zZXQoc3RydWN0IHZuaWNfaW50ciAqaW50ciwKLQl1bnNpZ25lZCBpbnQgY29hbGVzY2luZ190aW1lcik7CisJdTMyIGNvYWxlc2NpbmdfdGltZXIpOwogdm9pZCB2bmljX2ludHJfY2xlYW4oc3RydWN0IHZuaWNfaW50ciAqaW50cik7CiAKICNlbmRpZiAvKiBfVk5JQ19JTlRSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lcGljMTAwLmMgYi9kcml2ZXJzL25ldC9lcGljMTAwLmMKaW5kZXggYzM1M2JmMy4uODE0YzE4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXBpYzEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwpAQCAtMzkxLDEzICszOTEsMTMgQEAKIAlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKIAlpZiAoIXJpbmdfc3BhY2UpCiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwotCWVwLT50eF9yaW5nID0gKHN0cnVjdCBlcGljX3R4X2Rlc2MgKilyaW5nX3NwYWNlOworCWVwLT50eF9yaW5nID0gcmluZ19zcGFjZTsKIAllcC0+dHhfcmluZ19kbWEgPSByaW5nX2RtYTsKIAogCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOwogCWlmICghcmluZ19zcGFjZSkKIAkJZ290byBlcnJfb3V0X3VubWFwX3R4OwotCWVwLT5yeF9yaW5nID0gKHN0cnVjdCBlcGljX3J4X2Rlc2MgKilyaW5nX3NwYWNlOworCWVwLT5yeF9yaW5nID0gcmluZ19zcGFjZTsKIAllcC0+cnhfcmluZ19kbWEgPSByaW5nX2RtYTsKIAogCWlmIChkZXYtPm1lbV9zdGFydCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXMzMjEwLmMgYi9kcml2ZXJzL25ldC9lczMyMTAuYwppbmRleCAwYmE1ZTdiLi43YTA5NTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lczMyMTAuYworKysgYi9kcml2ZXJzL25ldC9lczMyMTAuYwpAQCAtNTQsNiArNTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aG9jLmMgYi9kcml2ZXJzL25ldC9ldGhvYy5jCmluZGV4IGE4M2RkMzEuLjhhYmJlMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aG9jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRob2MuYwpAQCAtMTEsOCArMTEsMTAgQEAKICAqIFdyaXR0ZW4gYnkgVGhpZXJyeSBSZWRpbmcgPHRoaWVycnkucmVkaW5nQGF2aW9uaWMtZGVzaWduLmRlPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgpAQCAtODc0LDYgKzg3Niw3IEBACiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKKwlza2JfdHhfdGltZXN0YW1wKHNrYik7CiBvdXQ6CiAJZGV2X2tmcmVlX3NrYihza2IpOwogCXJldHVybiBORVRERVZfVFhfT0s7CkBAIC05NjUsNyArOTY4LDcgQEAKIAlwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlwcml2LT5uZXRkZXYgPSBuZXRkZXY7CiAJcHJpdi0+ZG1hX2FsbG9jID0gMDsKLQlwcml2LT5pb19yZWdpb25fc2l6ZSA9IG1taW8tPmVuZCAtIG1taW8tPnN0YXJ0ICsgMTsKKwlwcml2LT5pb19yZWdpb25fc2l6ZSA9IHJlc291cmNlX3NpemUobW1pbyk7CiAKIAlwcml2LT5pb2Jhc2UgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LCBuZXRkZXYtPmJhc2VfYWRkciwKIAkJCXJlc291cmNlX3NpemUobW1pbykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXdyazMuYyBiL2RyaXZlcnMvbmV0L2V3cmszLmMKaW5kZXggYjVmNjE3My4uMDVhNWY3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXdyazMuYworKysgYi9kcml2ZXJzL25ldC9ld3JrMy5jCkBAIC0xMDA4LDE1ICsxMDA4LDEzIEBACiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQkJcCA9IHNrYi0+ZGF0YTsJLyogTG9vayBhdCB0aGUgZGVzdCBhZGRyICovCi0JCQkJCQlpZiAocFswXSAmIDB4MDEpIHsJLyogTXVsdGljYXN0L0Jyb2FkY2FzdCAqLwotCQkJCQkJCWlmICgoKihzMTYgKikgJiBwWzBdID09IC0xKSAmJiAoKihzMTYgKikgJiBwWzJdID09IC0xKSAmJiAoKihzMTYgKikgJiBwWzRdID09IC0xKSkgeworCQkJCQkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHApKSB7CisJCQkJCQkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHApKSB7CiAJCQkJCQkJCWxwLT5wa3RTdGF0cy5icm9hZGNhc3QrKzsKIAkJCQkJCQl9IGVsc2UgewogCQkJCQkJCQlscC0+cGt0U3RhdHMubXVsdGljYXN0Kys7CiAJCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmICgoKihzMTYgKikgJiBwWzBdID09ICooczE2ICopICYgZGV2LT5kZXZfYWRkclswXSkgJiYKLQkJCQkJCQkgICAoKihzMTYgKikgJiBwWzJdID09ICooczE2ICopICYgZGV2LT5kZXZfYWRkclsyXSkgJiYKLQkJCQkJCQkgICAoKihzMTYgKikgJiBwWzRdID09ICooczE2ICopICYgZGV2LT5kZXZfYWRkcls0XSkpIHsKKwkJCQkJCX0gZWxzZSBpZiAoY29tcGFyZV9ldGhlcl9hZGRyKHAsIGRldi0+ZGV2X2FkZHIpID09IDApIHsKIAkJCQkJCQlscC0+cGt0U3RhdHMudW5pY2FzdCsrOwogCQkJCQkJfQogCQkJCQkJbHAtPnBrdFN0YXRzLmJpbnNbMF0rKzsJCS8qIER1cGxpY2F0ZXMgc3RhdHMucnhfcGFja2V0cyAqLwpAQCAtMTE3MSw3ICsxMTY5LDcgQEAKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwogCXVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKIAlpbnQgaTsKLQljaGFyICphZGRycywgYml0LCBieXRlOworCWNoYXIgYml0LCBieXRlOwogCXNob3J0IF9faW9tZW0gKnAgPSBscC0+bWN0Ymw7CiAJdTE2IGhhc2hjb2RlOwogCXUzMiBjcmM7CkBAIC0xMjEzLDI1ICsxMjExLDIyIEBACiAKIAkJLyogVXBkYXRlIHRhYmxlICovCiAJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKLQkJCWFkZHJzID0gaGEtPmFkZHI7Ci0JCQlpZiAoKCphZGRycyAmIDB4MDEpID09IDEpIHsJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCi0JCQkJY3JjID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBhZGRycyk7Ci0JCQkJaGFzaGNvZGUgPSBjcmMgJiAoKDEgPDwgOSkgLSAxKTsJLyogaGFzaGNvZGUgaXMgOSBMU2Igb2YgQ1JDICovCisJCQljcmMgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIGhhLT5hZGRyKTsKKwkJCWhhc2hjb2RlID0gY3JjICYgKCgxIDw8IDkpIC0gMSk7CS8qIGhhc2hjb2RlIGlzIDkgTFNiIG9mIENSQyAqLwogCi0JCQkJYnl0ZSA9IGhhc2hjb2RlID4+IDM7CS8qIGJpdFszLThdIC0+IGJ5dGUgaW4gZmlsdGVyICovCi0JCQkJYml0ID0gMSA8PCAoaGFzaGNvZGUgJiAweDA3KTsJLyogYml0WzAtMl0gLT4gYml0IGluIGJ5dGUgKi8KKwkJCWJ5dGUgPSBoYXNoY29kZSA+PiAzOwkvKiBiaXRbMy04XSAtPiBieXRlIGluIGZpbHRlciAqLworCQkJYml0ID0gMSA8PCAoaGFzaGNvZGUgJiAweDA3KTsJLyogYml0WzAtMl0gLT4gYml0IGluIGJ5dGUgKi8KIAotCQkJCWlmIChscC0+c2htZW1fbGVuZ3RoID09IElPX09OTFkpIHsKLQkJCQkJdV9jaGFyIHRtcDsKKwkJCWlmIChscC0+c2htZW1fbGVuZ3RoID09IElPX09OTFkpIHsKKwkJCQl1X2NoYXIgdG1wOwogCi0JCQkJCW91dHcoUEFHRTBfSFRFICsgYnl0ZSwgRVdSSzNfUElSMSk7Ci0JCQkJCXRtcCA9IGluYihFV1JLM19EQVRBKTsKLQkJCQkJdG1wIHw9IGJpdDsKLQkJCQkJb3V0dyhQQUdFMF9IVEUgKyBieXRlLCBFV1JLM19QSVIxKTsKLQkJCQkJb3V0Yih0bXAsIEVXUkszX0RBVEEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdyaXRlYihyZWFkYihscC0+bWN0YmwgKyBieXRlKSB8IGJpdCwgbHAtPm1jdGJsICsgYnl0ZSk7Ci0JCQkJfQorCQkJCW91dHcoUEFHRTBfSFRFICsgYnl0ZSwgRVdSSzNfUElSMSk7CisJCQkJdG1wID0gaW5iKEVXUkszX0RBVEEpOworCQkJCXRtcCB8PSBiaXQ7CisJCQkJb3V0dyhQQUdFMF9IVEUgKyBieXRlLCBFV1JLM19QSVIxKTsKKwkJCQlvdXRiKHRtcCwgRVdSSzNfREFUQSk7CisJCQl9IGVsc2UgeworCQkJCXdyaXRlYihyZWFkYihscC0+bWN0YmwgKyBieXRlKSB8IGJpdCwgbHAtPm1jdGJsICsgYnl0ZSk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWFsbnguYyBiL2RyaXZlcnMvbmV0L2ZlYWxueC5jCmluZGV4IGRkNTRhYmUuLmZhODY3N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlYWxueC5jCkBAIC01NjYsNyArNTY2LDcgQEAKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OwogCX0KLQlucC0+cnhfcmluZyA9IChzdHJ1Y3QgZmVhbG54X2Rlc2MgKilyaW5nX3NwYWNlOworCW5wLT5yeF9yaW5nID0gcmluZ19zcGFjZTsKIAlucC0+cnhfcmluZ19kbWEgPSByaW5nX2RtYTsKIAogCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOwpAQCAtNTc0LDcgKzU3NCw3IEBACiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dF9mcmVlX3J4OwogCX0KLQlucC0+dHhfcmluZyA9IChzdHJ1Y3QgZmVhbG54X2Rlc2MgKilyaW5nX3NwYWNlOworCW5wLT50eF9yaW5nID0gcmluZ19zcGFjZTsKIAlucC0+dHhfcmluZ19kbWEgPSByaW5nX2RtYTsKIAogCS8qIGZpbmQgdGhlIGNvbm5lY3RlZCBNSUkgeGN2cnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlYy5jIGIvZHJpdmVycy9uZXQvZmVjLmMKaW5kZXggODg1ZDhiYS4uNWI2MzFmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZmVjLmMKKysrIGIvZHJpdmVycy9uZXQvZmVjLmMKQEAgLTMyNCw2ICszMjQsOCBAQAogCiAJZmVwLT5jdXJfdHggPSBiZHA7CiAKKwlza2JfdHhfdGltZXN0YW1wKHNrYik7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPmh3X2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBORVRERVZfVFhfT0s7CkBAIC02NTAsNyArNjUyLDggQEAKIAkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuIC0gNCk7CS8qIE1ha2Ugcm9vbSAqLwogCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBkYXRhLCBwa3RfbGVuIC0gNCk7CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZGV2KTsKLQkJCW5ldGlmX3J4KHNrYik7CisJCQlpZiAoIXNrYl9kZWZlcl9yeF90aW1lc3RhbXAoc2tiKSkKKwkJCQluZXRpZl9yeChza2IpOwogCQl9CiAKIAkJYmRwLT5jYmRfYnVmYWRkciA9IGRtYV9tYXBfc2luZ2xlKCZmZXAtPnBkZXYtPmRldiwgZGF0YSwKQEAgLTEyMjQsMTAgKzEyMjcsNiBAQAogCXdyaXRlbCgwLCBmZXAtPmh3cCArIEZFQ19HUlBfSEFTSF9UQUJMRV9MT1cpOwogCiAJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIG5kZXYpIHsKLQkJLyogT25seSBzdXBwb3J0IGdyb3VwIG11bHRpY2FzdCBmb3Igbm93ICovCi0JCWlmICghKGhhLT5hZGRyWzBdICYgMSkpCi0JCQljb250aW51ZTsKLQogCQkvKiBjYWxjdWxhdGUgY3JjMzIgdmFsdWUgb2YgbWFjIGFkZHJlc3MgKi8KIAkJY3JjID0gMHhmZmZmZmZmZjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVjX21wYzUyeHguYyBiL2RyaXZlcnMvbmV0L2ZlY19tcGM1Mnh4LmMKaW5kZXggOWY4MWIxYS4uY2I0NDE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZmVjX21wYzUyeHguYworKysgYi9kcml2ZXJzL25ldC9mZWNfbXBjNTJ4eC5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0yMiw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0zMzUsNiArMzM3LDcgQEAKIAliZC0+c2tiX3BhID0gZG1hX21hcF9zaW5nbGUoZGV2LT5kZXYucGFyZW50LCBza2ItPmRhdGEsIHNrYi0+bGVuLAogCQkJCSAgICBETUFfVE9fREVWSUNFKTsKIAorCXNrYl90eF90aW1lc3RhbXAoc2tiKTsKIAliY29tX3N1Ym1pdF9uZXh0X2J1ZmZlcihwcml2LT50eF9kbWF0c2ssIHNrYik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCkBAIC00MzQsNyArNDM3LDggQEAKIAkJbGVuZ3RoID0gc3RhdHVzICYgQkNPTV9GRUNfUlhfQkRfTEVOX01BU0s7CiAJCXNrYl9wdXQocnNrYiwgbGVuZ3RoIC0gNCk7CS8qIGxlbmd0aCB3aXRob3V0IENSQzMyICovCiAJCXJza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocnNrYiwgZGV2KTsKLQkJbmV0aWZfcngocnNrYik7CisJCWlmICghc2tiX2RlZmVyX3J4X3RpbWVzdGFtcChza2IpKQorCQkJbmV0aWZfcngocnNrYik7CiAKIAkJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKIAl9CkBAIC04NjcsMTAgKzg3MSwxMSBAQAogCQkJCSJFcnJvciB3aGlsZSBwYXJzaW5nIGRldmljZSBub2RlIHJlc291cmNlXG4iICk7CiAJCWdvdG8gZXJyX25ldGRldjsKIAl9Ci0JaWYgKChtZW0uZW5kIC0gbWVtLnN0YXJ0ICsgMSkgPCBzaXplb2Yoc3RydWN0IG1wYzUyeHhfZmVjKSkgeworCWlmIChyZXNvdXJjZV9zaXplKCZtZW0pIDwgc2l6ZW9mKHN0cnVjdCBtcGM1Mnh4X2ZlYykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FCi0JCQkiIC0gaW52YWxpZCByZXNvdXJjZSBzaXplICglbHggPCAleCksIGNoZWNrIG1wYzUyeHhfZGV2aWNlcy5jXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpKG1lbS5lbmQgLSBtZW0uc3RhcnQgKyAxKSwgc2l6ZW9mKHN0cnVjdCBtcGM1Mnh4X2ZlYykpOworCQkgICAgICAgIiAtIGludmFsaWQgcmVzb3VyY2Ugc2l6ZSAoJWx4IDwgJXgpLCBjaGVjayBtcGM1Mnh4X2RldmljZXMuY1xuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlc291cmNlX3NpemUoJm1lbSksCisJCSAgICAgICBzaXplb2Yoc3RydWN0IG1wYzUyeHhfZmVjKSk7CiAJCXJ2ID0gLUVJTlZBTDsKIAkJZ290byBlcnJfbmV0ZGV2OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKaW5kZXggNTM3YjY5NS4uZTY0Y2Q5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTgyMCw5ICs4MjAsNiBAQAogCXN0cnVjdCBudl9za2JfbWFwICp0eF9lbmRfZmxpcDsKIAlpbnQgdHhfc3RvcDsKIAotCS8qIHZsYW4gZmllbGRzICovCi0Jc3RydWN0IHZsYW5fZ3JvdXAgKnZsYW5ncnA7Ci0KIAkvKiBtc2kvbXNpLXggZmllbGRzICovCiAJdTMyIG1zaV9mbGFnczsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSBtc2lfeF9lbnRyeVtOVl9NU0lfWF9NQVhfVkVDVE9SU107CkBAIC0yNzY2LDE3ICsyNzYzLDEzIEBACiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJcHJlZmV0Y2goc2tiLT5kYXRhKTsKIAotCQkJaWYgKGxpa2VseSghbnAtPnZsYW5ncnApKSB7Ci0JCQkJbmFwaV9ncm9fcmVjZWl2ZSgmbnAtPm5hcGksIHNrYik7Ci0JCQl9IGVsc2UgewotCQkJCXZsYW5mbGFncyA9IGxlMzJfdG9fY3B1KG5wLT5nZXRfcnguZXgtPmJ1Zmxvdyk7Ci0JCQkJaWYgKHZsYW5mbGFncyAmIE5WX1JYM19WTEFOX1RBR19QUkVTRU5UKSB7Ci0JCQkJCXZsYW5fZ3JvX3JlY2VpdmUoJm5wLT5uYXBpLCBucC0+dmxhbmdycCwKLQkJCQkJCQkgdmxhbmZsYWdzICYgTlZfUlgzX1ZMQU5fVEFHX01BU0ssIHNrYik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbmFwaV9ncm9fcmVjZWl2ZSgmbnAtPm5hcGksIHNrYik7Ci0JCQkJfQorCQkJdmxhbmZsYWdzID0gbGUzMl90b19jcHUobnAtPmdldF9yeC5leC0+YnVmbG93KTsKKwkJCWlmICh2bGFuZmxhZ3MgJiBOVl9SWDNfVkxBTl9UQUdfUFJFU0VOVCkgeworCQkJCXUxNiB2aWQgPSB2bGFuZmxhZ3MgJiBOVl9SWDNfVkxBTl9UQUdfTUFTSzsKKworCQkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2aWQpOwogCQkJfQorCQkJbmFwaV9ncm9fcmVjZWl2ZSgmbnAtPm5hcGksIHNrYik7CiAKIAkJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CkBAIC00NDg0LDYgKzQ0NzcsMjcgQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKK3N0YXRpYyB2b2lkIG52X3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCisJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQlucC0+dHhyeGN0bF9iaXRzIHw9IE5WUkVHX1RYUlhDVExfVkxBTlNUUklQOworCWVsc2UKKwkJbnAtPnR4cnhjdGxfYml0cyAmPSB+TlZSRUdfVFhSWENUTF9WTEFOU1RSSVA7CisKKwlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fVFgpCisJCW5wLT50eHJ4Y3RsX2JpdHMgfD0gTlZSRUdfVFhSWENUTF9WTEFOSU5TOworCWVsc2UKKwkJbnAtPnR4cnhjdGxfYml0cyAmPSB+TlZSRUdfVFhSWENUTF9WTEFOSU5TOworCisJd3JpdGVsKG5wLT50eHJ4Y3RsX2JpdHMsIGdldF9od2Jhc2UoZGV2KSArIE52UmVnVHhSeENvbnRyb2wpOworCisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7Cit9CisKIHN0YXRpYyBpbnQgbnZfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtNDUwNCw2ICs0NTE4LDkgQEAKIAkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CiAJfQogCisJaWYgKGNoYW5nZWQgJiAoTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYKSkKKwkJbnZfdmxhbl9tb2RlKGRldiwgZmVhdHVyZXMpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ4NzksMjkgKzQ4OTYsNiBAQAogCS5zZWxmX3Rlc3QgPSBudl9zZWxmX3Rlc3QsCiB9OwogCi1zdGF0aWMgdm9pZCBudl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOwotCi0Jc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOwotCi0JLyogc2F2ZSB2bGFuIGdyb3VwICovCi0JbnAtPnZsYW5ncnAgPSBncnA7Ci0KLQlpZiAoZ3JwKSB7Ci0JCS8qIGVuYWJsZSB2bGFuIG9uIE1BQyAqLwotCQlucC0+dHhyeGN0bF9iaXRzIHw9IE5WUkVHX1RYUlhDVExfVkxBTlNUUklQIHwgTlZSRUdfVFhSWENUTF9WTEFOSU5TOwotCX0gZWxzZSB7Ci0JCS8qIGRpc2FibGUgdmxhbiBvbiBNQUMgKi8KLQkJbnAtPnR4cnhjdGxfYml0cyAmPSB+TlZSRUdfVFhSWENUTF9WTEFOU1RSSVA7Ci0JCW5wLT50eHJ4Y3RsX2JpdHMgJj0gfk5WUkVHX1RYUlhDVExfVkxBTklOUzsKLQl9Ci0KLQl3cml0ZWwobnAtPnR4cnhjdGxfYml0cywgZ2V0X2h3YmFzZShkZXYpICsgTnZSZWdUeFJ4Q29udHJvbCk7Ci0KLQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKLX0KLQogLyogVGhlIG1nbXQgdW5pdCBhbmQgZHJpdmVyIHVzZSBhIHNlbWFwaG9yZSB0byBhY2Nlc3MgdGhlIHBoeSBkdXJpbmcgaW5pdCAqLwogc3RhdGljIGludCBudl9tZ210X2FjcXVpcmVfc2VtYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtNTIwOCw3ICs1MjAyLDYgQEAKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IG52X3NldF9tYWNfYWRkcmVzcywKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IG52X3NldF9tdWx0aWNhc3QsCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gbnZfdmxhbl9yeF9yZWdpc3RlciwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gbnZfcG9sbF9jb250cm9sbGVyLAogI2VuZGlmCkBAIC01MjI2LDcgKzUyMTksNiBAQAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gbnZfc2V0X21hY19hZGRyZXNzLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gbnZfc2V0X211bHRpY2FzdCwKLQkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSBudl92bGFuX3J4X3JlZ2lzdGVyLAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBudl9wb2xsX2NvbnRyb2xsZXIsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMgYi9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCmluZGV4IDIxYWJiNWMuLjMyOWVmMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYwpAQCAtNjk3LDYgKzY5Nyw4IEBACiAJCXNjIHw9IEJEX0VORVRfVFhfUEFEOwogCUNCRFNfU0MoYmRwLCBzYyk7CiAKKwlza2JfdHhfdGltZXN0YW1wKHNrYik7CisKIAkoKmZlcC0+b3BzLT50eF9raWNrc3RhcnQpKGRldik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPnR4X2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWFjLWZjYy5jIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9tYWMtZmNjLmMKaW5kZXggN2E4NGU0NS4uNzU4M2E5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZnNfZW5ldC9tYWMtZmNjLmMKKysrIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9tYWMtZmNjLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCQlnb3RvIG91dF9lcDsKIAogCWZlcC0+ZmNjLm1lbSA9ICh2b2lkIF9faW9tZW0gKiljcG0yX2ltbXI7Ci0JZnBpLT5kcHJhbV9vZmZzZXQgPSBjcG1fZHBhbGxvYygxMjgsIDgpOworCWZwaS0+ZHByYW1fb2Zmc2V0ID0gY3BtX2RwYWxsb2MoMTI4LCAzMik7CiAJaWYgKElTX0VSUl9WQUxVRShmcGktPmRwcmFtX29mZnNldCkpIHsKIAkJcmV0ID0gZnBpLT5kcHJhbV9vZmZzZXQ7CiAJCWdvdG8gb3V0X2ZjY2NwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZnNfZW5ldC9taWktYml0YmFuZy5jIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9taWktYml0YmFuZy5jCmluZGV4IGFkMjk3NTQuLmIwOTI3MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWlpLWJpdGJhbmcuYworKysgYi9kcml2ZXJzL25ldC9mc19lbmV0L21paS1iaXRiYW5nLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAocmVzLmVuZCAtIHJlcy5zdGFydCA8IDEzKQorCWlmIChyZXNvdXJjZV9zaXplKCZyZXMpIDw9IDEzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIFRoaXMgc2hvdWxkIHJlYWxseSBlbmNvZGUgdGhlIHBpbiBudW1iZXIgYXMgd2VsbCwgYnV0IGFsbApAQCAtMTM5LDcgKzEzOSw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCW1kY19waW4gPSAqZGF0YTsKIAotCWJpdGJhbmctPmRpciA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXMuZW5kIC0gcmVzLnN0YXJ0ICsgMSk7CisJYml0YmFuZy0+ZGlyID0gaW9yZW1hcChyZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJnJlcykpOwogCWlmICghYml0YmFuZy0+ZGlyKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZnNfZW5ldC9taWktZmVjLmMgYi9kcml2ZXJzL25ldC9mc19lbmV0L21paS1mZWMuYwppbmRleCA2YTJlMTUwLi5lMGU5ZDZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mc19lbmV0L21paS1mZWMuYworKysgYi9kcml2ZXJzL25ldC9mc19lbmV0L21paS1mZWMuYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAKIAlzbnByaW50ZihuZXdfYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXgiLCByZXMuc3RhcnQpOwogCi0JZmVjLT5mZWNwID0gaW9yZW1hcChyZXMuc3RhcnQsIHJlcy5lbmQgLSByZXMuc3RhcnQgKyAxKTsKKwlmZWMtPmZlY3AgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CiAJaWYgKCFmZWMtPmZlY3ApCiAJCWdvdG8gb3V0X2ZlYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZnRnbWFjMTAwLmMgYi9kcml2ZXJzL25ldC9mdGdtYWMxMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDcwOWFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZnRnbWFjMTAwLmMKQEAgLTAsMCArMSwxMzY1IEBACisvKgorICogRmFyYWRheSBGVEdNQUMxMDAgR2lnYWJpdCBFdGhlcm5ldAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOS0yMDExIEZhcmFkYXkgVGVjaG5vbG9neQorICogUG8tWXUgQ2h1YW5nIDxyYXRiZXJ0QGZhcmFkYXktdGVjaC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KQlLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworI2luY2x1ZGUgImZ0Z21hYzEwMC5oIgorCisjZGVmaW5lIERSVl9OQU1FCSJmdGdtYWMxMDAiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjciCisKKyNkZWZpbmUgUlhfUVVFVUVfRU5UUklFUwkyNTYJLyogbXVzdCBiZSBwb3dlciBvZiAyICovCisjZGVmaW5lIFRYX1FVRVVFX0VOVFJJRVMJNTEyCS8qIG11c3QgYmUgcG93ZXIgb2YgMiAqLworCisjZGVmaW5lIE1BWF9QS1RfU0laRQkJMTUxOAorI2RlZmluZSBSWF9CVUZfU0laRQkJUEFHRV9TSVpFCS8qIG11c3QgYmUgc21hbGxlciB0aGFuIDB4M2ZmZiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcml2YXRlIGRhdGEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBmdGdtYWMxMDBfZGVzY3MgeworCXN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgcnhkZXNbUlhfUVVFVUVfRU5UUklFU107CisJc3RydWN0IGZ0Z21hYzEwMF90eGRlcyB0eGRlc1tUWF9RVUVVRV9FTlRSSUVTXTsKK307CisKK3N0cnVjdCBmdGdtYWMxMDAgeworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgaXJxOworCisJc3RydWN0IGZ0Z21hYzEwMF9kZXNjcyAqZGVzY3M7CisJZG1hX2FkZHJfdCBkZXNjc19kbWFfYWRkcjsKKworCXVuc2lnbmVkIGludCByeF9wb2ludGVyOworCXVuc2lnbmVkIGludCB0eF9jbGVhbl9wb2ludGVyOworCXVuc2lnbmVkIGludCB0eF9wb2ludGVyOworCXVuc2lnbmVkIGludCB0eF9wZW5kaW5nOworCisJc3BpbmxvY2tfdCB0eF9sb2NrOworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CisKKwlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsKKwlpbnQgcGh5X2lycVtQSFlfTUFYX0FERFJdOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CisJaW50IG9sZF9zcGVlZDsKK307CisKK3N0YXRpYyBpbnQgZnRnbWFjMTAwX2FsbG9jX3J4X3BhZ2Uoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkgICBzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcywgZ2ZwX3QgZ2ZwKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW50ZXJuYWwgZnVuY3Rpb25zIChoYXJkd2FyZSByZWdpc3RlciBhY2Nlc3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElOVF9NQVNLX0FMTF9FTkFCTEVECShGVEdNQUMxMDBfSU5UX1JQS1RfTE9TVAl8IFwKKwkJCQkgRlRHTUFDMTAwX0lOVF9YUEtUX0VUSAkJfCBcCisJCQkJIEZUR01BQzEwMF9JTlRfWFBLVF9MT1NUCXwgXAorCQkJCSBGVEdNQUMxMDBfSU5UX0FIQl9FUlIJCXwgXAorCQkJCSBGVEdNQUMxMDBfSU5UX1BIWVNUU19DSEcJfCBcCisJCQkJIEZUR01BQzEwMF9JTlRfUlBLVF9CVUYJCXwgXAorCQkJCSBGVEdNQUMxMDBfSU5UX05PX1JYQlVGKQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfc2V0X3J4X3JpbmdfYmFzZShzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LCBkbWFfYWRkcl90IGFkZHIpCit7CisJaW93cml0ZTMyKGFkZHIsIHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX1JYUl9CQURSKTsKK30KKworc3RhdGljIHZvaWQgZnRnbWFjMTAwX3NldF9yeF9idWZmZXJfc2l6ZShzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LAorCQl1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzaXplID0gRlRHTUFDMTAwX1JCU1JfU0laRShzaXplKTsKKwlpb3dyaXRlMzIoc2l6ZSwgcHJpdi0+YmFzZSArIEZUR01BQzEwMF9PRkZTRVRfUkJTUik7Cit9CisKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF9zZXRfbm9ybWFsX3ByaW9fdHhfcmluZ19iYXNlKHN0cnVjdCBmdGdtYWMxMDAgKnByaXYsCisJCQkJCQkgICBkbWFfYWRkcl90IGFkZHIpCit7CisJaW93cml0ZTMyKGFkZHIsIHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX05QVFhSX0JBRFIpOworfQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkbWFfbm9ybWFsX3ByaW9fc3RhcnRfcG9sbGluZyhzdHJ1Y3QgZnRnbWFjMTAwICpwcml2KQoreworCWlvd3JpdGUzMigxLCBwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9OUFRYUEQpOworfQorCitzdGF0aWMgaW50IGZ0Z21hYzEwMF9yZXNldF9odyhzdHJ1Y3QgZnRnbWFjMTAwICpwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwcml2LT5uZXRkZXY7CisJaW50IGk7CisKKwkvKiBOT1RFOiByZXNldCBjbGVhcnMgYWxsIHJlZ2lzdGVycyAqLworCWlvd3JpdGUzMihGVEdNQUMxMDBfTUFDQ1JfU1dfUlNULCBwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9NQUNDUik7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgbWFjY3I7CisKKwkJbWFjY3IgPSBpb3JlYWQzMihwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9NQUNDUik7CisJCWlmICghKG1hY2NyICYgRlRHTUFDMTAwX01BQ0NSX1NXX1JTVCkpCisJCQlyZXR1cm4gMDsKKworCQl1ZGVsYXkoMTAwMCk7CisJfQorCisJbmV0ZGV2X2VycihuZXRkZXYsICJzb2Z0d2FyZSByZXNldCBmYWlsZWRcbiIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfc2V0X21hYyhzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LCBjb25zdCB1bnNpZ25lZCBjaGFyICptYWMpCit7CisJdW5zaWduZWQgaW50IG1hZGRyID0gbWFjWzBdIDw8IDggfCBtYWNbMV07CisJdW5zaWduZWQgaW50IGxhZGRyID0gbWFjWzJdIDw8IDI0IHwgbWFjWzNdIDw8IDE2IHwgbWFjWzRdIDw8IDggfCBtYWNbNV07CisKKwlpb3dyaXRlMzIobWFkZHIsIHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX01BQ19NQURSKTsKKwlpb3dyaXRlMzIobGFkZHIsIHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX01BQ19MQURSKTsKK30KKworc3RhdGljIHZvaWQgZnRnbWFjMTAwX2luaXRfaHcoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdikKK3sKKwkvKiBzZXR1cCByaW5nIGJ1ZmZlciBiYXNlIHJlZ2lzdGVycyAqLworCWZ0Z21hYzEwMF9zZXRfcnhfcmluZ19iYXNlKHByaXYsCisJCQkJICAgcHJpdi0+ZGVzY3NfZG1hX2FkZHIgKworCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBmdGdtYWMxMDBfZGVzY3MsIHJ4ZGVzKSk7CisJZnRnbWFjMTAwX3NldF9ub3JtYWxfcHJpb190eF9yaW5nX2Jhc2UocHJpdiwKKwkJCQkJICAgICAgIHByaXYtPmRlc2NzX2RtYV9hZGRyICsKKwkJCQkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBmdGdtYWMxMDBfZGVzY3MsIHR4ZGVzKSk7CisKKwlmdGdtYWMxMDBfc2V0X3J4X2J1ZmZlcl9zaXplKHByaXYsIFJYX0JVRl9TSVpFKTsKKworCWlvd3JpdGUzMihGVEdNQUMxMDBfQVBUQ19SWFBPTExfQ05UKDEpLCBwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9BUFRDKTsKKworCWZ0Z21hYzEwMF9zZXRfbWFjKHByaXYsIHByaXYtPm5ldGRldi0+ZGV2X2FkZHIpOworfQorCisjZGVmaW5lIE1BQ0NSX0VOQUJMRV9BTEwJKEZUR01BQzEwMF9NQUNDUl9UWERNQV9FTgl8IFwKKwkJCQkgRlRHTUFDMTAwX01BQ0NSX1JYRE1BX0VOCXwgXAorCQkJCSBGVEdNQUMxMDBfTUFDQ1JfVFhNQUNfRU4JfCBcCisJCQkJIEZUR01BQzEwMF9NQUNDUl9SWE1BQ19FTgl8IFwKKwkJCQkgRlRHTUFDMTAwX01BQ0NSX0ZVTExEVVAJfCBcCisJCQkJIEZUR01BQzEwMF9NQUNDUl9DUkNfQVBECXwgXAorCQkJCSBGVEdNQUMxMDBfTUFDQ1JfUlhfUlVOVAl8IFwKKwkJCQkgRlRHTUFDMTAwX01BQ0NSX1JYX0JST0FEUEtUKQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfc3RhcnRfaHcoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwgaW50IHNwZWVkKQoreworCWludCBtYWNjciA9IE1BQ0NSX0VOQUJMRV9BTEw7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJZGVmYXVsdDoKKwljYXNlIDEwOgorCQlicmVhazsKKworCWNhc2UgMTAwOgorCQltYWNjciB8PSBGVEdNQUMxMDBfTUFDQ1JfRkFTVF9NT0RFOworCQlicmVhazsKKworCWNhc2UgMTAwMDoKKwkJbWFjY3IgfD0gRlRHTUFDMTAwX01BQ0NSX0dJR0FfTU9ERTsKKwkJYnJlYWs7CisJfQorCisJaW93cml0ZTMyKG1hY2NyLCBwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9NQUNDUik7Cit9CisKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF9zdG9wX2h3KHN0cnVjdCBmdGdtYWMxMDAgKnByaXYpCit7CisJaW93cml0ZTMyKDAsIHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX01BQ0NSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW50ZXJuYWwgZnVuY3Rpb25zIChyZWNlaXZlIGRlc2NyaXB0b3IpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbCBmdGdtYWMxMDBfcnhkZXNfZmlyc3Rfc2VnbWVudChzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3sKKwlyZXR1cm4gcnhkZXMtPnJ4ZGVzMCAmIGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzBfRlJTKTsKK30KKworc3RhdGljIGJvb2wgZnRnbWFjMTAwX3J4ZGVzX2xhc3Rfc2VnbWVudChzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3sKKwlyZXR1cm4gcnhkZXMtPnJ4ZGVzMCAmIGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzBfTFJTKTsKK30KKworc3RhdGljIGJvb2wgZnRnbWFjMTAwX3J4ZGVzX3BhY2tldF9yZWFkeShzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3sKKwlyZXR1cm4gcnhkZXMtPnJ4ZGVzMCAmIGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzBfUlhQS1RfUkRZKTsKK30KKworc3RhdGljIHZvaWQgZnRnbWFjMTAwX3J4ZGVzX3NldF9kbWFfb3duKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQoreworCS8qIGNsZWFyIHN0YXR1cyBiaXRzICovCisJcnhkZXMtPnJ4ZGVzMCAmPSBjcHVfdG9fbGUzMihGVEdNQUMxMDBfUlhERVMwX0VET1JSKTsKK30KKworc3RhdGljIGJvb2wgZnRnbWFjMTAwX3J4ZGVzX3J4X2Vycm9yKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQoreworCXJldHVybiByeGRlcy0+cnhkZXMwICYgY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMF9SWF9FUlIpOworfQorCitzdGF0aWMgYm9vbCBmdGdtYWMxMDBfcnhkZXNfY3JjX2Vycm9yKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQoreworCXJldHVybiByeGRlcy0+cnhkZXMwICYgY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMF9DUkNfRVJSKTsKK30KKworc3RhdGljIGJvb2wgZnRnbWFjMTAwX3J4ZGVzX2ZyYW1lX3Rvb19sb25nKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQoreworCXJldHVybiByeGRlcy0+cnhkZXMwICYgY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMF9GVEwpOworfQorCitzdGF0aWMgYm9vbCBmdGdtYWMxMDBfcnhkZXNfcnVudChzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3sKKwlyZXR1cm4gcnhkZXMtPnJ4ZGVzMCAmIGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzBfUlVOVCk7Cit9CisKK3N0YXRpYyBib29sIGZ0Z21hYzEwMF9yeGRlc19vZGRfbmliYmxlKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQoreworCXJldHVybiByeGRlcy0+cnhkZXMwICYgY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMF9SWF9PRERfTkIpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGZ0Z21hYzEwMF9yeGRlc19kYXRhX2xlbmd0aChzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUocnhkZXMtPnJ4ZGVzMCkgJiBGVEdNQUMxMDBfUlhERVMwX1ZEQkM7Cit9CisKK3N0YXRpYyBib29sIGZ0Z21hYzEwMF9yeGRlc19tdWx0aWNhc3Qoc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMpCit7CisJcmV0dXJuIHJ4ZGVzLT5yeGRlczAgJiBjcHVfdG9fbGUzMihGVEdNQUMxMDBfUlhERVMwX01VTFRJQ0FTVCk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfZW5kX29mX3Jpbmcoc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMpCit7CisJcnhkZXMtPnJ4ZGVzMCB8PSBjcHVfdG9fbGUzMihGVEdNQUMxMDBfUlhERVMwX0VET1JSKTsKK30KKworc3RhdGljIHZvaWQgZnRnbWFjMTAwX3J4ZGVzX3NldF9kbWFfYWRkcihzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcywKKwkJCQkJIGRtYV9hZGRyX3QgYWRkcikKK3sKKwlyeGRlcy0+cnhkZXMzID0gY3B1X3RvX2xlMzIoYWRkcik7Cit9CisKK3N0YXRpYyBkbWFfYWRkcl90IGZ0Z21hYzEwMF9yeGRlc19nZXRfZG1hX2FkZHIoc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KHJ4ZGVzLT5yeGRlczMpOworfQorCitzdGF0aWMgYm9vbCBmdGdtYWMxMDBfcnhkZXNfaXNfdGNwKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQoreworCXJldHVybiAocnhkZXMtPnJ4ZGVzMSAmIGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzFfUFJPVF9NQVNLKSkgPT0KKwkgICAgICAgY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMV9QUk9UX1RDUElQKTsKK30KKworc3RhdGljIGJvb2wgZnRnbWFjMTAwX3J4ZGVzX2lzX3VkcChzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3sKKwlyZXR1cm4gKHJ4ZGVzLT5yeGRlczEgJiBjcHVfdG9fbGUzMihGVEdNQUMxMDBfUlhERVMxX1BST1RfTUFTSykpID09CisJICAgICAgIGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzFfUFJPVF9VRFBJUCk7Cit9CisKK3N0YXRpYyBib29sIGZ0Z21hYzEwMF9yeGRlc190Y3Bjc19lcnIoc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMpCit7CisJcmV0dXJuIHJ4ZGVzLT5yeGRlczEgJiBjcHVfdG9fbGUzMihGVEdNQUMxMDBfUlhERVMxX1RDUF9DSEtTVU1fRVJSKTsKK30KKworc3RhdGljIGJvb2wgZnRnbWFjMTAwX3J4ZGVzX3VkcGNzX2VycihzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3sKKwlyZXR1cm4gcnhkZXMtPnJ4ZGVzMSAmIGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzFfVURQX0NIS1NVTV9FUlIpOworfQorCitzdGF0aWMgYm9vbCBmdGdtYWMxMDBfcnhkZXNfaXBjc19lcnIoc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMpCit7CisJcmV0dXJuIHJ4ZGVzLT5yeGRlczEgJiBjcHVfdG9fbGUzMihGVEdNQUMxMDBfUlhERVMxX0lQX0NIS1NVTV9FUlIpOworfQorCisvKgorICogcnhkZXMyIGlzIG5vdCB1c2VkIGJ5IGhhcmR3YXJlLiBXZSB1c2UgaXQgdG8ga2VlcCB0cmFjayBvZiBwYWdlLgorICogU2luY2UgaGFyZHdhcmUgZG9lcyBub3QgdG91Y2ggaXQsIHdlIGNhbiBza2lwIGNwdV90b19sZTMyKCkvbGUzMl90b19jcHUoKS4KKyAqLworc3RhdGljIHZvaWQgZnRnbWFjMTAwX3J4ZGVzX3NldF9wYWdlKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyeGRlcy0+cnhkZXMyID0gKHVuc2lnbmVkIGludClwYWdlOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmZ0Z21hYzEwMF9yeGRlc19nZXRfcGFnZShzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3sKKwlyZXR1cm4gKHN0cnVjdCBwYWdlICopcnhkZXMtPnJ4ZGVzMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW50ZXJuYWwgZnVuY3Rpb25zIChyZWNlaXZlKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBmdGdtYWMxMDBfbmV4dF9yeF9wb2ludGVyKGludCBwb2ludGVyKQoreworCXJldHVybiAocG9pbnRlciArIDEpICYgKFJYX1FVRVVFX0VOVFJJRVMgLSAxKTsKK30KKworc3RhdGljIHZvaWQgZnRnbWFjMTAwX3J4X3BvaW50ZXJfYWR2YW5jZShzdHJ1Y3QgZnRnbWFjMTAwICpwcml2KQoreworCXByaXYtPnJ4X3BvaW50ZXIgPSBmdGdtYWMxMDBfbmV4dF9yeF9wb2ludGVyKHByaXYtPnJ4X3BvaW50ZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqZnRnbWFjMTAwX2N1cnJlbnRfcnhkZXMoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdikKK3sKKwlyZXR1cm4gJnByaXYtPmRlc2NzLT5yeGRlc1twcml2LT5yeF9wb2ludGVyXTsKK30KKworc3RhdGljIHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKgorZnRnbWFjMTAwX3J4X2xvY2F0ZV9maXJzdF9zZWdtZW50KHN0cnVjdCBmdGdtYWMxMDAgKnByaXYpCit7CisJc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMgPSBmdGdtYWMxMDBfY3VycmVudF9yeGRlcyhwcml2KTsKKworCXdoaWxlIChmdGdtYWMxMDBfcnhkZXNfcGFja2V0X3JlYWR5KHJ4ZGVzKSkgeworCQlpZiAoZnRnbWFjMTAwX3J4ZGVzX2ZpcnN0X3NlZ21lbnQocnhkZXMpKQorCQkJcmV0dXJuIHJ4ZGVzOworCisJCWZ0Z21hYzEwMF9yeGRlc19zZXRfZG1hX293bihyeGRlcyk7CisJCWZ0Z21hYzEwMF9yeF9wb2ludGVyX2FkdmFuY2UocHJpdik7CisJCXJ4ZGVzID0gZnRnbWFjMTAwX2N1cnJlbnRfcnhkZXMocHJpdik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sIGZ0Z21hYzEwMF9yeF9wYWNrZXRfZXJyb3Ioc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OworCWJvb2wgZXJyb3IgPSBmYWxzZTsKKworCWlmICh1bmxpa2VseShmdGdtYWMxMDBfcnhkZXNfcnhfZXJyb3IocnhkZXMpKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAicnggZXJyXG4iKTsKKworCQluZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQllcnJvciA9IHRydWU7CisJfQorCisJaWYgKHVubGlrZWx5KGZ0Z21hYzEwMF9yeGRlc19jcmNfZXJyb3IocnhkZXMpKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAicnggY3JjIGVyclxuIik7CisKKwkJbmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWVycm9yID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KGZ0Z21hYzEwMF9yeGRlc19pcGNzX2VycihyeGRlcykpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQluZXRkZXZfaW5mbyhuZXRkZXYsICJyeCBJUCBjaGVja3N1bSBlcnJcbiIpOworCisJCWVycm9yID0gdHJ1ZTsKKwl9CisKKwlpZiAodW5saWtlbHkoZnRnbWFjMTAwX3J4ZGVzX2ZyYW1lX3Rvb19sb25nKHJ4ZGVzKSkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCW5ldGRldl9pbmZvKG5ldGRldiwgInJ4IGZyYW1lIHRvbyBsb25nXG4iKTsKKworCQluZXRkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJZXJyb3IgPSB0cnVlOworCX0gZWxzZSBpZiAodW5saWtlbHkoZnRnbWFjMTAwX3J4ZGVzX3J1bnQocnhkZXMpKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAicnggcnVudFxuIik7CisKKwkJbmV0ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWVycm9yID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KGZ0Z21hYzEwMF9yeGRlc19vZGRfbmliYmxlKHJ4ZGVzKSkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCW5ldGRldl9pbmZvKG5ldGRldiwgInJ4IG9kZCBuaWJibGVcbiIpOworCisJCW5ldGRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQllcnJvciA9IHRydWU7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfcnhfZHJvcF9wYWNrZXQoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OworCXN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzID0gZnRnbWFjMTAwX2N1cnJlbnRfcnhkZXMocHJpdik7CisJYm9vbCBkb25lID0gZmFsc2U7CisKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQluZXRkZXZfZGJnKG5ldGRldiwgImRyb3AgcGFja2V0ICVwXG4iLCByeGRlcyk7CisKKwlkbyB7CisJCWlmIChmdGdtYWMxMDBfcnhkZXNfbGFzdF9zZWdtZW50KHJ4ZGVzKSkKKwkJCWRvbmUgPSB0cnVlOworCisJCWZ0Z21hYzEwMF9yeGRlc19zZXRfZG1hX293bihyeGRlcyk7CisJCWZ0Z21hYzEwMF9yeF9wb2ludGVyX2FkdmFuY2UocHJpdik7CisJCXJ4ZGVzID0gZnRnbWFjMTAwX2N1cnJlbnRfcnhkZXMocHJpdik7CisJfSB3aGlsZSAoIWRvbmUgJiYgZnRnbWFjMTAwX3J4ZGVzX3BhY2tldF9yZWFkeShyeGRlcykpOworCisJbmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7Cit9CisKK3N0YXRpYyBib29sIGZ0Z21hYzEwMF9yeF9wYWNrZXQoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwgaW50ICpwcm9jZXNzZWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKKwlzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWJvb2wgZG9uZSA9IGZhbHNlOworCisJcnhkZXMgPSBmdGdtYWMxMDBfcnhfbG9jYXRlX2ZpcnN0X3NlZ21lbnQocHJpdik7CisJaWYgKCFyeGRlcykKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHVubGlrZWx5KGZ0Z21hYzEwMF9yeF9wYWNrZXRfZXJyb3IocHJpdiwgcnhkZXMpKSkgeworCQlmdGdtYWMxMDBfcnhfZHJvcF9wYWNrZXQocHJpdik7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qIHN0YXJ0IHByb2Nlc3NpbmcgKi8KKwlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5ldGRldiwgMTI4KTsKKwlpZiAodW5saWtlbHkoIXNrYikpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCW5ldGRldl9lcnIobmV0ZGV2LCAicnggc2tiIGFsbG9jIGZhaWxlZFxuIik7CisKKwkJZnRnbWFjMTAwX3J4X2Ryb3BfcGFja2V0KHByaXYpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlpZiAodW5saWtlbHkoZnRnbWFjMTAwX3J4ZGVzX211bHRpY2FzdChyeGRlcykpKQorCQluZXRkZXYtPnN0YXRzLm11bHRpY2FzdCsrOworCisJLyoKKwkgKiBJdCBzZWVtcyB0aGF0IEhXIGRvZXMgY2hlY2tzdW0gaW5jb3JyZWN0bHkgd2l0aCBmcmFnbWVudGVkIHBhY2tldHMsCisJICogc28gd2UgYXJlIGNvbnNlcnZhdGl2ZSBoZXJlIC0gaWYgSFcgY2hlY2tzdW0gZXJyb3IsIGxldCBzb2Z0d2FyZSBkbworCSAqIHRoZSBjaGVja3N1bSBhZ2Fpbi4KKwkgKi8KKwlpZiAoKGZ0Z21hYzEwMF9yeGRlc19pc190Y3AocnhkZXMpICYmICFmdGdtYWMxMDBfcnhkZXNfdGNwY3NfZXJyKHJ4ZGVzKSkgfHwKKwkgICAgKGZ0Z21hYzEwMF9yeGRlc19pc191ZHAocnhkZXMpICYmICFmdGdtYWMxMDBfcnhkZXNfdWRwY3NfZXJyKHJ4ZGVzKSkpCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisKKwlkbyB7CisJCWRtYV9hZGRyX3QgbWFwID0gZnRnbWFjMTAwX3J4ZGVzX2dldF9kbWFfYWRkcihyeGRlcyk7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gZnRnbWFjMTAwX3J4ZGVzX2dldF9wYWdlKHJ4ZGVzKTsKKwkJdW5zaWduZWQgaW50IHNpemU7CisKKwkJZG1hX3VubWFwX3BhZ2UocHJpdi0+ZGV2LCBtYXAsIFJYX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCisJCXNpemUgPSBmdGdtYWMxMDBfcnhkZXNfZGF0YV9sZW5ndGgocnhkZXMpOworCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLCBwYWdlLCAwLCBzaXplKTsKKworCQlza2ItPmxlbiArPSBzaXplOworCQlza2ItPmRhdGFfbGVuICs9IHNpemU7CisJCXNrYi0+dHJ1ZXNpemUgKz0gc2l6ZTsKKworCQlpZiAoZnRnbWFjMTAwX3J4ZGVzX2xhc3Rfc2VnbWVudChyeGRlcykpCisJCQlkb25lID0gdHJ1ZTsKKworCQlmdGdtYWMxMDBfYWxsb2NfcnhfcGFnZShwcml2LCByeGRlcywgR0ZQX0FUT01JQyk7CisKKwkJZnRnbWFjMTAwX3J4X3BvaW50ZXJfYWR2YW5jZShwcml2KTsKKwkJcnhkZXMgPSBmdGdtYWMxMDBfY3VycmVudF9yeGRlcyhwcml2KTsKKwl9IHdoaWxlICghZG9uZSk7CisKKwlfX3Bza2JfcHVsbF90YWlsKHNrYiwgbWluKHNrYi0+bGVuLCA2NFUpKTsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOworCisJbmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qIHB1c2ggcGFja2V0IHRvIHByb3RvY29sIHN0YWNrICovCisJbmFwaV9ncm9fcmVjZWl2ZSgmcHJpdi0+bmFwaSwgc2tiKTsKKworCSgqcHJvY2Vzc2VkKSsrOworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbnRlcm5hbCBmdW5jdGlvbnMgKHRyYW5zbWl0IGRlc2NyaXB0b3IpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkZXNfcmVzZXQoc3RydWN0IGZ0Z21hYzEwMF90eGRlcyAqdHhkZXMpCit7CisJLyogY2xlYXIgYWxsIGV4Y2VwdCBlbmQgb2YgcmluZyBiaXQgKi8KKwl0eGRlcy0+dHhkZXMwICY9IGNwdV90b19sZTMyKEZUR01BQzEwMF9UWERFUzBfRURPVFIpOworCXR4ZGVzLT50eGRlczEgPSAwOworCXR4ZGVzLT50eGRlczIgPSAwOworCXR4ZGVzLT50eGRlczMgPSAwOworfQorCitzdGF0aWMgYm9vbCBmdGdtYWMxMDBfdHhkZXNfb3duZWRfYnlfZG1hKHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzKQoreworCXJldHVybiB0eGRlcy0+dHhkZXMwICYgY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1RYREVTMF9UWERNQV9PV04pOworfQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkZXNfc2V0X2RtYV9vd24oc3RydWN0IGZ0Z21hYzEwMF90eGRlcyAqdHhkZXMpCit7CisJLyoKKwkgKiBNYWtlIHN1cmUgZG1hIG93biBiaXQgd2lsbCBub3QgYmUgc2V0IGJlZm9yZSBhbnkgb3RoZXIKKwkgKiBkZXNjcmlwdG9yIGZpZWxkcy4KKwkgKi8KKwl3bWIoKTsKKwl0eGRlcy0+dHhkZXMwIHw9IGNwdV90b19sZTMyKEZUR01BQzEwMF9UWERFUzBfVFhETUFfT1dOKTsKK30KKworc3RhdGljIHZvaWQgZnRnbWFjMTAwX3R4ZGVzX3NldF9lbmRfb2ZfcmluZyhzdHJ1Y3QgZnRnbWFjMTAwX3R4ZGVzICp0eGRlcykKK3sKKwl0eGRlcy0+dHhkZXMwIHw9IGNwdV90b19sZTMyKEZUR01BQzEwMF9UWERFUzBfRURPVFIpOworfQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkZXNfc2V0X2ZpcnN0X3NlZ21lbnQoc3RydWN0IGZ0Z21hYzEwMF90eGRlcyAqdHhkZXMpCit7CisJdHhkZXMtPnR4ZGVzMCB8PSBjcHVfdG9fbGUzMihGVEdNQUMxMDBfVFhERVMwX0ZUUyk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF90eGRlc19zZXRfbGFzdF9zZWdtZW50KHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzKQoreworCXR4ZGVzLT50eGRlczAgfD0gY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1RYREVTMF9MVFMpOworfQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkZXNfc2V0X2J1ZmZlcl9zaXplKHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzLAorCQkJCQkgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwl0eGRlcy0+dHhkZXMwIHw9IGNwdV90b19sZTMyKEZUR01BQzEwMF9UWERFUzBfVFhCVUZfU0laRShsZW4pKTsKK30KKworc3RhdGljIHZvaWQgZnRnbWFjMTAwX3R4ZGVzX3NldF90eGludChzdHJ1Y3QgZnRnbWFjMTAwX3R4ZGVzICp0eGRlcykKK3sKKwl0eGRlcy0+dHhkZXMxIHw9IGNwdV90b19sZTMyKEZUR01BQzEwMF9UWERFUzFfVFhJQyk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF90eGRlc19zZXRfdGNwY3Moc3RydWN0IGZ0Z21hYzEwMF90eGRlcyAqdHhkZXMpCit7CisJdHhkZXMtPnR4ZGVzMSB8PSBjcHVfdG9fbGUzMihGVEdNQUMxMDBfVFhERVMxX1RDUF9DSEtTVU0pOworfQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkZXNfc2V0X3VkcGNzKHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzKQoreworCXR4ZGVzLT50eGRlczEgfD0gY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1RYREVTMV9VRFBfQ0hLU1VNKTsKK30KKworc3RhdGljIHZvaWQgZnRnbWFjMTAwX3R4ZGVzX3NldF9pcGNzKHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzKQoreworCXR4ZGVzLT50eGRlczEgfD0gY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1RYREVTMV9JUF9DSEtTVU0pOworfQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkZXNfc2V0X2RtYV9hZGRyKHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzLAorCQkJCQkgZG1hX2FkZHJfdCBhZGRyKQoreworCXR4ZGVzLT50eGRlczMgPSBjcHVfdG9fbGUzMihhZGRyKTsKK30KKworc3RhdGljIGRtYV9hZGRyX3QgZnRnbWFjMTAwX3R4ZGVzX2dldF9kbWFfYWRkcihzdHJ1Y3QgZnRnbWFjMTAwX3R4ZGVzICp0eGRlcykKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUodHhkZXMtPnR4ZGVzMyk7Cit9CisKKy8qCisgKiB0eGRlczIgaXMgbm90IHVzZWQgYnkgaGFyZHdhcmUuIFdlIHVzZSBpdCB0byBrZWVwIHRyYWNrIG9mIHNvY2tldCBidWZmZXIuCisgKiBTaW5jZSBoYXJkd2FyZSBkb2VzIG5vdCB0b3VjaCBpdCwgd2UgY2FuIHNraXAgY3B1X3RvX2xlMzIoKS9sZTMyX3RvX2NwdSgpLgorICovCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkZXNfc2V0X3NrYihzdHJ1Y3QgZnRnbWFjMTAwX3R4ZGVzICp0eGRlcywKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl0eGRlcy0+dHhkZXMyID0gKHVuc2lnbmVkIGludClza2I7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZnRnbWFjMTAwX3R4ZGVzX2dldF9za2Ioc3RydWN0IGZ0Z21hYzEwMF90eGRlcyAqdHhkZXMpCit7CisJcmV0dXJuIChzdHJ1Y3Qgc2tfYnVmZiAqKXR4ZGVzLT50eGRlczI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGludGVybmFsIGZ1bmN0aW9ucyAodHJhbnNtaXQpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGZ0Z21hYzEwMF9uZXh0X3R4X3BvaW50ZXIoaW50IHBvaW50ZXIpCit7CisJcmV0dXJuIChwb2ludGVyICsgMSkgJiAoVFhfUVVFVUVfRU5UUklFUyAtIDEpOworfQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhfcG9pbnRlcl9hZHZhbmNlKHN0cnVjdCBmdGdtYWMxMDAgKnByaXYpCit7CisJcHJpdi0+dHhfcG9pbnRlciA9IGZ0Z21hYzEwMF9uZXh0X3R4X3BvaW50ZXIocHJpdi0+dHhfcG9pbnRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF90eF9jbGVhbl9wb2ludGVyX2FkdmFuY2Uoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdikKK3sKKwlwcml2LT50eF9jbGVhbl9wb2ludGVyID0gZnRnbWFjMTAwX25leHRfdHhfcG9pbnRlcihwcml2LT50eF9jbGVhbl9wb2ludGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKmZ0Z21hYzEwMF9jdXJyZW50X3R4ZGVzKHN0cnVjdCBmdGdtYWMxMDAgKnByaXYpCit7CisJcmV0dXJuICZwcml2LT5kZXNjcy0+dHhkZXNbcHJpdi0+dHhfcG9pbnRlcl07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnRnbWFjMTAwX3R4ZGVzICoKK2Z0Z21hYzEwMF9jdXJyZW50X2NsZWFuX3R4ZGVzKHN0cnVjdCBmdGdtYWMxMDAgKnByaXYpCit7CisJcmV0dXJuICZwcml2LT5kZXNjcy0+dHhkZXNbcHJpdi0+dHhfY2xlYW5fcG9pbnRlcl07Cit9CisKK3N0YXRpYyBib29sIGZ0Z21hYzEwMF90eF9jb21wbGV0ZV9wYWNrZXQoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OworCXN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzOworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBtYXA7CisKKwlpZiAocHJpdi0+dHhfcGVuZGluZyA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwl0eGRlcyA9IGZ0Z21hYzEwMF9jdXJyZW50X2NsZWFuX3R4ZGVzKHByaXYpOworCisJaWYgKGZ0Z21hYzEwMF90eGRlc19vd25lZF9ieV9kbWEodHhkZXMpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlza2IgPSBmdGdtYWMxMDBfdHhkZXNfZ2V0X3NrYih0eGRlcyk7CisJbWFwID0gZnRnbWFjMTAwX3R4ZGVzX2dldF9kbWFfYWRkcih0eGRlcyk7CisKKwluZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwluZXRkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJZG1hX3VubWFwX3NpbmdsZShwcml2LT5kZXYsIG1hcCwgc2tiX2hlYWRsZW4oc2tiKSwgRE1BX1RPX0RFVklDRSk7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlmdGdtYWMxMDBfdHhkZXNfcmVzZXQodHhkZXMpOworCisJZnRnbWFjMTAwX3R4X2NsZWFuX3BvaW50ZXJfYWR2YW5jZShwcml2KTsKKworCXNwaW5fbG9jaygmcHJpdi0+dHhfbG9jayk7CisJcHJpdi0+dHhfcGVuZGluZy0tOworCXNwaW5fdW5sb2NrKCZwcml2LT50eF9sb2NrKTsKKwluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZnRnbWFjMTAwX3R4X2NvbXBsZXRlKHN0cnVjdCBmdGdtYWMxMDAgKnByaXYpCit7CisJd2hpbGUgKGZ0Z21hYzEwMF90eF9jb21wbGV0ZV9wYWNrZXQocHJpdikpCisJCTsKK30KKworc3RhdGljIGludCBmdGdtYWMxMDBfeG1pdChzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBkbWFfYWRkcl90IG1hcCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OworCXN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzOworCXVuc2lnbmVkIGludCBsZW4gPSAoc2tiLT5sZW4gPCBFVEhfWkxFTikgPyBFVEhfWkxFTiA6IHNrYi0+bGVuOworCisJdHhkZXMgPSBmdGdtYWMxMDBfY3VycmVudF90eGRlcyhwcml2KTsKKwlmdGdtYWMxMDBfdHhfcG9pbnRlcl9hZHZhbmNlKHByaXYpOworCisJLyogc2V0dXAgVFggZGVzY3JpcHRvciAqLworCWZ0Z21hYzEwMF90eGRlc19zZXRfc2tiKHR4ZGVzLCBza2IpOworCWZ0Z21hYzEwMF90eGRlc19zZXRfZG1hX2FkZHIodHhkZXMsIG1hcCk7CisJZnRnbWFjMTAwX3R4ZGVzX3NldF9idWZmZXJfc2l6ZSh0eGRlcywgbGVuKTsKKworCWZ0Z21hYzEwMF90eGRlc19zZXRfZmlyc3Rfc2VnbWVudCh0eGRlcyk7CisJZnRnbWFjMTAwX3R4ZGVzX3NldF9sYXN0X3NlZ21lbnQodHhkZXMpOworCWZ0Z21hYzEwMF90eGRlc19zZXRfdHhpbnQodHhkZXMpOworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CisJCV9fYmUxNiBwcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7CisKKwkJaWYgKHByb3RvY29sID09IGNwdV90b19iZTE2KEVUSF9QX0lQKSkgeworCQkJdTggaXBfcHJvdG8gPSBpcF9oZHIoc2tiKS0+cHJvdG9jb2w7CisKKwkJCWZ0Z21hYzEwMF90eGRlc19zZXRfaXBjcyh0eGRlcyk7CisJCQlpZiAoaXBfcHJvdG8gPT0gSVBQUk9UT19UQ1ApCisJCQkJZnRnbWFjMTAwX3R4ZGVzX3NldF90Y3Bjcyh0eGRlcyk7CisJCQllbHNlIGlmIChpcF9wcm90byA9PSBJUFBST1RPX1VEUCkKKwkJCQlmdGdtYWMxMDBfdHhkZXNfc2V0X3VkcGNzKHR4ZGVzKTsKKwkJfQorCX0KKworCXNwaW5fbG9jaygmcHJpdi0+dHhfbG9jayk7CisJcHJpdi0+dHhfcGVuZGluZysrOworCWlmIChwcml2LT50eF9wZW5kaW5nID09IFRYX1FVRVVFX0VOVFJJRVMpCisJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCS8qIHN0YXJ0IHRyYW5zbWl0ICovCisJZnRnbWFjMTAwX3R4ZGVzX3NldF9kbWFfb3duKHR4ZGVzKTsKKwlzcGluX3VubG9jaygmcHJpdi0+dHhfbG9jayk7CisKKwlmdGdtYWMxMDBfdHhkbWFfbm9ybWFsX3ByaW9fc3RhcnRfcG9sbGluZyhwcml2KTsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGludGVybmFsIGZ1bmN0aW9ucyAoYnVmZmVyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBmdGdtYWMxMDBfYWxsb2NfcnhfcGFnZShzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LAorCQkJCSAgIHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzLCBnZnBfdCBnZnApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlkbWFfYWRkcl90IG1hcDsKKworCXBhZ2UgPSBhbGxvY19wYWdlKGdmcCk7CisJaWYgKCFwYWdlKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQluZXRkZXZfZXJyKG5ldGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByeCBwYWdlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWFwID0gZG1hX21hcF9wYWdlKHByaXYtPmRldiwgcGFnZSwgMCwgUlhfQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHByaXYtPmRldiwgbWFwKSkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCW5ldGRldl9lcnIobmV0ZGV2LCAiZmFpbGVkIHRvIG1hcCByeCBwYWdlXG4iKTsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZ0Z21hYzEwMF9yeGRlc19zZXRfcGFnZShyeGRlcywgcGFnZSk7CisJZnRnbWFjMTAwX3J4ZGVzX3NldF9kbWFfYWRkcihyeGRlcywgbWFwKTsKKwlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24ocnhkZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfZnJlZV9idWZmZXJzKHN0cnVjdCBmdGdtYWMxMDAgKnByaXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfRU5UUklFUzsgaSsrKSB7CisJCXN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzID0gJnByaXYtPmRlc2NzLT5yeGRlc1tpXTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBmdGdtYWMxMDBfcnhkZXNfZ2V0X3BhZ2UocnhkZXMpOworCQlkbWFfYWRkcl90IG1hcCA9IGZ0Z21hYzEwMF9yeGRlc19nZXRfZG1hX2FkZHIocnhkZXMpOworCisJCWlmICghcGFnZSkKKwkJCWNvbnRpbnVlOworCisJCWRtYV91bm1hcF9wYWdlKHByaXYtPmRldiwgbWFwLCBSWF9CVUZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRYX1FVRVVFX0VOVFJJRVM7IGkrKykgeworCQlzdHJ1Y3QgZnRnbWFjMTAwX3R4ZGVzICp0eGRlcyA9ICZwcml2LT5kZXNjcy0+dHhkZXNbaV07CisJCXN0cnVjdCBza19idWZmICpza2IgPSBmdGdtYWMxMDBfdHhkZXNfZ2V0X3NrYih0eGRlcyk7CisJCWRtYV9hZGRyX3QgbWFwID0gZnRnbWFjMTAwX3R4ZGVzX2dldF9kbWFfYWRkcih0eGRlcyk7CisKKwkJaWYgKCFza2IpCisJCQljb250aW51ZTsKKworCQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmRldiwgbWFwLCBza2JfaGVhZGxlbihza2IpLCBETUFfVE9fREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKworCWRtYV9mcmVlX2NvaGVyZW50KHByaXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBmdGdtYWMxMDBfZGVzY3MpLAorCQkJICBwcml2LT5kZXNjcywgcHJpdi0+ZGVzY3NfZG1hX2FkZHIpOworfQorCitzdGF0aWMgaW50IGZ0Z21hYzEwMF9hbGxvY19idWZmZXJzKHN0cnVjdCBmdGdtYWMxMDAgKnByaXYpCit7CisJaW50IGk7CisKKwlwcml2LT5kZXNjcyA9IGRtYV9hbGxvY19jb2hlcmVudChwcml2LT5kZXYsCisJCQkJCSBzaXplb2Yoc3RydWN0IGZ0Z21hYzEwMF9kZXNjcyksCisJCQkJCSAmcHJpdi0+ZGVzY3NfZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+ZGVzY3MpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHByaXYtPmRlc2NzLCAwLCBzaXplb2Yoc3RydWN0IGZ0Z21hYzEwMF9kZXNjcykpOworCisJLyogaW5pdGlhbGl6ZSBSWCByaW5nICovCisJZnRnbWFjMTAwX3J4ZGVzX3NldF9lbmRfb2ZfcmluZygmcHJpdi0+ZGVzY3MtPnJ4ZGVzW1JYX1FVRVVFX0VOVFJJRVMgLSAxXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfRU5UUklFUzsgaSsrKSB7CisJCXN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzID0gJnByaXYtPmRlc2NzLT5yeGRlc1tpXTsKKworCQlpZiAoZnRnbWFjMTAwX2FsbG9jX3J4X3BhZ2UocHJpdiwgcnhkZXMsIEdGUF9LRVJORUwpKQorCQkJZ290byBlcnI7CisJfQorCisJLyogaW5pdGlhbGl6ZSBUWCByaW5nICovCisJZnRnbWFjMTAwX3R4ZGVzX3NldF9lbmRfb2ZfcmluZygmcHJpdi0+ZGVzY3MtPnR4ZGVzW1RYX1FVRVVFX0VOVFJJRVMgLSAxXSk7CisJcmV0dXJuIDA7CisKK2VycjoKKwlmdGdtYWMxMDBfZnJlZV9idWZmZXJzKHByaXYpOworCXJldHVybiAtRU5PTUVNOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbnRlcm5hbCBmdW5jdGlvbnMgKG1kaW8pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZnRnbWFjMTAwICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcHJpdi0+cGh5ZGV2OworCWludCBpZXI7CisKKwlpZiAocGh5ZGV2LT5zcGVlZCA9PSBwcml2LT5vbGRfc3BlZWQpCisJCXJldHVybjsKKworCXByaXYtPm9sZF9zcGVlZCA9IHBoeWRldi0+c3BlZWQ7CisKKwlpZXIgPSBpb3JlYWQzMihwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9JRVIpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMigwLCBwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9JRVIpOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCWZ0Z21hYzEwMF9zdG9wX2h3KHByaXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKwlmdGdtYWMxMDBfaW5pdF9odyhwcml2KTsKKwlmdGdtYWMxMDBfc3RhcnRfaHcocHJpdiwgcGh5ZGV2LT5zcGVlZCk7CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMihpZXIsIHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX0lFUik7Cit9CisKK3N0YXRpYyBpbnQgZnRnbWFjMTAwX21paV9wcm9iZShzdHJ1Y3QgZnRnbWFjMTAwICpwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwcml2LT5uZXRkZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IE5VTEw7CisJaW50IGk7CisKKwkvKiBzZWFyY2ggZm9yIGNvbm5lY3QgUEhZIGRldmljZSAqLworCWZvciAoaSA9IDA7IGkgPCBQSFlfTUFYX0FERFI7IGkrKykgeworCQlzdHJ1Y3QgcGh5X2RldmljZSAqdG1wID0gcHJpdi0+bWlpX2J1cy0+cGh5X21hcFtpXTsKKworCQlpZiAodG1wKSB7CisJCQlwaHlkZXYgPSB0bXA7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIG5vdyB3ZSBhcmUgc3VwcG9zZWQgdG8gaGF2ZSBhIHByb3BlciBwaHlkZXYsIHRvIGF0dGFjaCB0by4uLiAqLworCWlmICghcGh5ZGV2KSB7CisJCW5ldGRldl9pbmZvKG5ldGRldiwgIiVzOiBubyBQSFkgZm91bmRcbiIsIG5ldGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBoeWRldiA9IHBoeV9jb25uZWN0KG5ldGRldiwgZGV2X25hbWUoJnBoeWRldi0+ZGV2KSwKKwkJCSAgICAgJmZ0Z21hYzEwMF9hZGp1c3RfbGluaywgMCwKKwkJCSAgICAgUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUkpOworCisJaWYgKElTX0VSUihwaHlkZXYpKSB7CisJCW5ldGRldl9lcnIobmV0ZGV2LCAiJXM6IENvdWxkIG5vdCBhdHRhY2ggdG8gUEhZXG4iLCBuZXRkZXYtPm5hbWUpOworCQlyZXR1cm4gUFRSX0VSUihwaHlkZXYpOworCX0KKworCXByaXYtPnBoeWRldiA9IHBoeWRldjsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3RydWN0IG1paV9idXMgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGZ0Z21hYzEwMF9tZGlvYnVzX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeV9hZGRyLCBpbnQgcmVnbnVtKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBidXMtPnByaXY7CisJc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdW5zaWduZWQgaW50IHBoeWNyOworCWludCBpOworCisJcGh5Y3IgPSBpb3JlYWQzMihwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9QSFlDUik7CisKKwkvKiBwcmVzZXJ2ZSBNREMgY3ljbGUgdGhyZXNob2xkICovCisJcGh5Y3IgJj0gRlRHTUFDMTAwX1BIWUNSX01EQ19DWUNUSFJfTUFTSzsKKworCXBoeWNyIHw9IEZUR01BQzEwMF9QSFlDUl9QSFlBRChwaHlfYWRkcikgfAorCQkgRlRHTUFDMTAwX1BIWUNSX1JFR0FEKHJlZ251bSkgfAorCQkgRlRHTUFDMTAwX1BIWUNSX01JSVJEOworCisJaW93cml0ZTMyKHBoeWNyLCBwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9QSFlDUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlwaHljciA9IGlvcmVhZDMyKHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX1BIWUNSKTsKKworCQlpZiAoKHBoeWNyICYgRlRHTUFDMTAwX1BIWUNSX01JSVJEKSA9PSAwKSB7CisJCQlpbnQgZGF0YTsKKworCQkJZGF0YSA9IGlvcmVhZDMyKHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX1BIWURBVEEpOworCQkJcmV0dXJuIEZUR01BQzEwMF9QSFlEQVRBX01JSVJEQVRBKGRhdGEpOworCQl9CisKKwkJdWRlbGF5KDEwMCk7CisJfQorCisJbmV0ZGV2X2VycihuZXRkZXYsICJtZGlvIHJlYWQgdGltZWQgb3V0XG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBmdGdtYWMxMDBfbWRpb2J1c193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2FkZHIsCisJCQkJICAgaW50IHJlZ251bSwgdTE2IHZhbHVlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBidXMtPnByaXY7CisJc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdW5zaWduZWQgaW50IHBoeWNyOworCWludCBkYXRhOworCWludCBpOworCisJcGh5Y3IgPSBpb3JlYWQzMihwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9QSFlDUik7CisKKwkvKiBwcmVzZXJ2ZSBNREMgY3ljbGUgdGhyZXNob2xkICovCisJcGh5Y3IgJj0gRlRHTUFDMTAwX1BIWUNSX01EQ19DWUNUSFJfTUFTSzsKKworCXBoeWNyIHw9IEZUR01BQzEwMF9QSFlDUl9QSFlBRChwaHlfYWRkcikgfAorCQkgRlRHTUFDMTAwX1BIWUNSX1JFR0FEKHJlZ251bSkgfAorCQkgRlRHTUFDMTAwX1BIWUNSX01JSVdSOworCisJZGF0YSA9IEZUR01BQzEwMF9QSFlEQVRBX01JSVdEQVRBKHZhbHVlKTsKKworCWlvd3JpdGUzMihkYXRhLCBwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9QSFlEQVRBKTsKKwlpb3dyaXRlMzIocGh5Y3IsIHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX1BIWUNSKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXBoeWNyID0gaW9yZWFkMzIocHJpdi0+YmFzZSArIEZUR01BQzEwMF9PRkZTRVRfUEhZQ1IpOworCisJCWlmICgocGh5Y3IgJiBGVEdNQUMxMDBfUEhZQ1JfTUlJV1IpID09IDApCisJCQlyZXR1cm4gMDsKKworCQl1ZGVsYXkoMTAwKTsKKwl9CisKKwluZXRkZXZfZXJyKG5ldGRldiwgIm1kaW8gd3JpdGUgdGltZWQgb3V0XG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBmdGdtYWMxMDBfbWRpb2J1c19yZXNldChzdHJ1Y3QgbWlpX2J1cyAqYnVzKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzdHJ1Y3QgZXRodG9vbF9vcHMgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBkZXZfbmFtZSgmbmV0ZGV2LT5kZXYpKTsKK30KKworc3RhdGljIGludCBmdGdtYWMxMDBfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZnRnbWFjMTAwICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHByaXYtPnBoeWRldiwgY21kKTsKK30KKworc3RhdGljIGludCBmdGdtYWMxMDBfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZnRnbWFjMTAwICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHByaXYtPnBoeWRldiwgY21kKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBmdGdtYWMxMDBfZXRodG9vbF9vcHMgPSB7CisJLnNldF9zZXR0aW5ncwkJPSBmdGdtYWMxMDBfc2V0X3NldHRpbmdzLAorCS5nZXRfc2V0dGluZ3MJCT0gZnRnbWFjMTAwX2dldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JCT0gZnRnbWFjMTAwX2dldF9kcnZpbmZvLAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW50ZXJydXB0IGhhbmRsZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBmdGdtYWMxMDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2X2lkOworCXN0cnVjdCBmdGdtYWMxMDAgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKGxpa2VseShuZXRpZl9ydW5uaW5nKG5ldGRldikpKSB7CisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBmb3IgcG9sbGluZyAqLworCQlpb3dyaXRlMzIoMCwgcHJpdi0+YmFzZSArIEZUR01BQzEwMF9PRkZTRVRfSUVSKTsKKwkJbmFwaV9zY2hlZHVsZSgmcHJpdi0+bmFwaSk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzdHJ1Y3QgbmFwaV9zdHJ1Y3QgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGZ0Z21hYzEwMF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgZnRnbWFjMTAwICpwcml2ID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBmdGdtYWMxMDAsIG5hcGkpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwcml2LT5uZXRkZXY7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwlib29sIGNvbXBsZXRlZCA9IHRydWU7CisJaW50IHJ4ID0gMDsKKworCXN0YXR1cyA9IGlvcmVhZDMyKHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX0lTUik7CisJaW93cml0ZTMyKHN0YXR1cywgcHJpdi0+YmFzZSArIEZUR01BQzEwMF9PRkZTRVRfSVNSKTsKKworCWlmIChzdGF0dXMgJiAoRlRHTUFDMTAwX0lOVF9SUEtUX0JVRiB8IEZUR01BQzEwMF9JTlRfTk9fUlhCVUYpKSB7CisJCS8qCisJCSAqIEZUR01BQzEwMF9JTlRfUlBLVF9CVUY6CisJCSAqCVJYIERNQSBoYXMgcmVjZWl2ZWQgcGFja2V0cyBpbnRvIFJYIGJ1ZmZlciBzdWNjZXNzZnVsbHkKKwkJICoKKwkJICogRlRHTUFDMTAwX0lOVF9OT19SWEJVRjoKKwkJICoJUlggYnVmZmVyIHVuYXZhaWxhYmxlCisJCSAqLworCQlib29sIHJldHJ5OworCisJCWRvIHsKKwkJCXJldHJ5ID0gZnRnbWFjMTAwX3J4X3BhY2tldChwcml2LCAmcngpOworCQl9IHdoaWxlIChyZXRyeSAmJiByeCA8IGJ1ZGdldCk7CisKKwkJaWYgKHJldHJ5ICYmIHJ4ID09IGJ1ZGdldCkKKwkJCWNvbXBsZXRlZCA9IGZhbHNlOworCX0KKworCWlmIChzdGF0dXMgJiAoRlRHTUFDMTAwX0lOVF9YUEtUX0VUSCB8IEZUR01BQzEwMF9JTlRfWFBLVF9MT1NUKSkgeworCQkvKgorCQkgKiBGVEdNQUMxMDBfSU5UX1hQS1RfRVRIOgorCQkgKglwYWNrZXQgdHJhbnNtaXR0ZWQgdG8gZXRoZXJuZXQgc3VjY2Vzc2Z1bGx5CisJCSAqCisJCSAqIEZUR01BQzEwMF9JTlRfWFBLVF9MT1NUOgorCQkgKglwYWNrZXQgdHJhbnNtaXR0ZWQgdG8gZXRoZXJuZXQgbG9zdCBkdWUgdG8gbGF0ZQorCQkgKgljb2xsaXNpb24gb3IgZXhjZXNzaXZlIGNvbGxpc2lvbgorCQkgKi8KKwkJZnRnbWFjMTAwX3R4X2NvbXBsZXRlKHByaXYpOworCX0KKworCWlmIChzdGF0dXMgJiAoRlRHTUFDMTAwX0lOVF9OT19SWEJVRiB8IEZUR01BQzEwMF9JTlRfUlBLVF9MT1NUIHwKKwkJICAgICAgRlRHTUFDMTAwX0lOVF9BSEJfRVJSIHwgRlRHTUFDMTAwX0lOVF9QSFlTVFNfQ0hHKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiW0lTUl0gPSAweCV4OiAlcyVzJXMlc1xuIiwgc3RhdHVzLAorCQkJCSAgICBzdGF0dXMgJiBGVEdNQUMxMDBfSU5UX05PX1JYQlVGID8gIk5PX1JYQlVGICIgOiAiIiwKKwkJCQkgICAgc3RhdHVzICYgRlRHTUFDMTAwX0lOVF9SUEtUX0xPU1QgPyAiUlBLVF9MT1NUICIgOiAiIiwKKwkJCQkgICAgc3RhdHVzICYgRlRHTUFDMTAwX0lOVF9BSEJfRVJSID8gIkFIQl9FUlIgIiA6ICIiLAorCQkJCSAgICBzdGF0dXMgJiBGVEdNQUMxMDBfSU5UX1BIWVNUU19DSEcgPyAiUEhZU1RTX0NIRyIgOiAiIik7CisKKwkJaWYgKHN0YXR1cyAmIEZUR01BQzEwMF9JTlRfTk9fUlhCVUYpIHsKKwkJCS8qIFJYIGJ1ZmZlciB1bmF2YWlsYWJsZSAqLworCQkJbmV0ZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIEZUR01BQzEwMF9JTlRfUlBLVF9MT1NUKSB7CisJCQkvKiByZWNlaXZlZCBwYWNrZXQgbG9zdCBkdWUgdG8gUlggRklGTyBmdWxsICovCisJCQluZXRkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCX0KKwl9CisKKwlpZiAoY29tcGxldGVkKSB7CisJCW5hcGlfY29tcGxldGUobmFwaSk7CisKKwkJLyogZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCWlvd3JpdGUzMihJTlRfTUFTS19BTExfRU5BQkxFRCwgcHJpdi0+YmFzZSArIEZUR01BQzEwMF9PRkZTRVRfSUVSKTsKKwl9CisKKwlyZXR1cm4gcng7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN0cnVjdCBuZXRfZGV2aWNlX29wcyBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZnRnbWFjMTAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZnRnbWFjMTAwICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgZXJyOworCisJZXJyID0gZnRnbWFjMTAwX2FsbG9jX2J1ZmZlcnMocHJpdik7CisJaWYgKGVycikgeworCQluZXRkZXZfZXJyKG5ldGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXJzXG4iKTsKKwkJZ290byBlcnJfYWxsb2M7CisJfQorCisJZXJyID0gcmVxdWVzdF9pcnEocHJpdi0+aXJxLCBmdGdtYWMxMDBfaW50ZXJydXB0LCAwLCBuZXRkZXYtPm5hbWUsIG5ldGRldik7CisJaWYgKGVycikgeworCQluZXRkZXZfZXJyKG5ldGRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwgcHJpdi0+aXJxKTsKKwkJZ290byBlcnJfaXJxOworCX0KKworCXByaXYtPnJ4X3BvaW50ZXIgPSAwOworCXByaXYtPnR4X2NsZWFuX3BvaW50ZXIgPSAwOworCXByaXYtPnR4X3BvaW50ZXIgPSAwOworCXByaXYtPnR4X3BlbmRpbmcgPSAwOworCisJZXJyID0gZnRnbWFjMTAwX3Jlc2V0X2h3KHByaXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2h3OworCisJZnRnbWFjMTAwX2luaXRfaHcocHJpdik7CisJZnRnbWFjMTAwX3N0YXJ0X2h3KHByaXYsIDEwKTsKKworCXBoeV9zdGFydChwcml2LT5waHlkZXYpOworCisJbmFwaV9lbmFibGUoJnByaXYtPm5hcGkpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisKKwkvKiBlbmFibGUgYWxsIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoSU5UX01BU0tfQUxMX0VOQUJMRUQsIHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX0lFUik7CisJcmV0dXJuIDA7CisKK2Vycl9odzoKKwlmcmVlX2lycShwcml2LT5pcnEsIG5ldGRldik7CitlcnJfaXJxOgorCWZ0Z21hYzEwMF9mcmVlX2J1ZmZlcnMocHJpdik7CitlcnJfYWxsb2M6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmdGdtYWMxMDBfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBmdGdtYWMxMDAgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMigwLCBwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9JRVIpOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCW5hcGlfZGlzYWJsZSgmcHJpdi0+bmFwaSk7CisJcGh5X3N0b3AocHJpdi0+cGh5ZGV2KTsKKworCWZ0Z21hYzEwMF9zdG9wX2h3KHByaXYpOworCWZyZWVfaXJxKHByaXYtPmlycSwgbmV0ZGV2KTsKKwlmdGdtYWMxMDBfZnJlZV9idWZmZXJzKHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnRnbWFjMTAwX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZnRnbWFjMTAwICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlkbWFfYWRkcl90IG1hcDsKKworCWlmICh1bmxpa2VseShza2ItPmxlbiA+IE1BWF9QS1RfU0laRSkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCW5ldGRldl9kYmcobmV0ZGV2LCAidHggcGFja2V0IHRvbyBiaWdcbiIpOworCisJCW5ldGRldi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJbWFwID0gZG1hX21hcF9zaW5nbGUocHJpdi0+ZGV2LCBza2ItPmRhdGEsIHNrYl9oZWFkbGVuKHNrYiksIERNQV9UT19ERVZJQ0UpOworCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihwcml2LT5kZXYsIG1hcCkpKSB7CisJCS8qIGRyb3AgcGFja2V0ICovCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQluZXRkZXZfZXJyKG5ldGRldiwgIm1hcCBzb2NrZXQgYnVmZmVyIGZhaWxlZFxuIik7CisKKwkJbmV0ZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisKKwlyZXR1cm4gZnRnbWFjMTAwX3htaXQocHJpdiwgc2tiLCBtYXApOworfQorCisvKiBvcHRpb25hbCAqLworc3RhdGljIGludCBmdGdtYWMxMDBfZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlyZXR1cm4gcGh5X21paV9pb2N0bChwcml2LT5waHlkZXYsIGlmciwgY21kKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBmdGdtYWMxMDBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZnRnbWFjMTAwX29wZW4sCisJLm5kb19zdG9wCQk9IGZ0Z21hYzEwMF9zdG9wLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBmdGdtYWMxMDBfaGFyZF9zdGFydF94bWl0LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fZG9faW9jdGwJCT0gZnRnbWFjMTAwX2RvX2lvY3RsLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZnRnbWFjMTAwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGlycTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBmdGdtYWMxMDAgKnByaXY7CisJaW50IGVycjsKKwlpbnQgaTsKKworCWlmICghcGRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOWElPOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCS8qIHNldHVwIG5ldF9kZXZpY2UgKi8KKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnByaXYpKTsKKwlpZiAoIW5ldGRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19ldGhlcmRldjsKKwl9CisKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmZ0Z21hYzEwMF9ldGh0b29sX29wcyk7CisJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmZ0Z21hYzEwMF9uZXRkZXZfb3BzOworCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0dSTzsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7CisKKwkvKiBzZXR1cCBwcml2YXRlIGRhdGEgKi8KKwlwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlwcml2LT5uZXRkZXYgPSBuZXRkZXY7CisJcHJpdi0+ZGV2ID0gJnBkZXYtPmRldjsKKworCXNwaW5fbG9ja19pbml0KCZwcml2LT50eF9sb2NrKTsKKworCS8qIGluaXRpYWxpemUgTkFQSSAqLworCW5ldGlmX25hcGlfYWRkKG5ldGRldiwgJnByaXYtPm5hcGksIGZ0Z21hYzEwMF9wb2xsLCA2NCk7CisKKwkvKiBtYXAgaW8gbWVtb3J5ICovCisJcHJpdi0+cmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKKwkJCQkgICAgICAgZGV2X25hbWUoJnBkZXYtPmRldikpOworCWlmICghcHJpdi0+cmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCByZXNlcnZlIG1lbW9yeSByZWdpb25cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9yZXFfbWVtOworCX0KKworCXByaXYtPmJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFwcml2LT5iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIGV0aGVybmV0IHJlZ2lzdGVyc1xuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJcHJpdi0+aXJxID0gaXJxOworCisJLyogaW5pdGlhbGl6ZSBtZGlvIGJ1cyAqLworCXByaXYtPm1paV9idXMgPSBtZGlvYnVzX2FsbG9jKCk7CisJaWYgKCFwcml2LT5taWlfYnVzKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2FsbG9jX21kaW9idXM7CisJfQorCisJcHJpdi0+bWlpX2J1cy0+bmFtZSA9ICJmdGdtYWMxMDBfbWRpbyI7CisJc25wcmludGYocHJpdi0+bWlpX2J1cy0+aWQsIE1JSV9CVVNfSURfU0laRSwgImZ0Z21hYzEwMF9taWkiKTsKKworCXByaXYtPm1paV9idXMtPnByaXYgPSBuZXRkZXY7CisJcHJpdi0+bWlpX2J1cy0+cmVhZCA9IGZ0Z21hYzEwMF9tZGlvYnVzX3JlYWQ7CisJcHJpdi0+bWlpX2J1cy0+d3JpdGUgPSBmdGdtYWMxMDBfbWRpb2J1c193cml0ZTsKKwlwcml2LT5taWlfYnVzLT5yZXNldCA9IGZ0Z21hYzEwMF9tZGlvYnVzX3Jlc2V0OworCXByaXYtPm1paV9idXMtPmlycSA9IHByaXYtPnBoeV9pcnE7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEhZX01BWF9BRERSOyBpKyspCisJCXByaXYtPm1paV9idXMtPmlycVtpXSA9IFBIWV9QT0xMOworCisJZXJyID0gbWRpb2J1c19yZWdpc3Rlcihwcml2LT5taWlfYnVzKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCByZWdpc3RlciBNRElPIGJ1cyFcbiIpOworCQlnb3RvIGVycl9yZWdpc3Rlcl9tZGlvYnVzOworCX0KKworCWVyciA9IGZ0Z21hYzEwMF9taWlfcHJvYmUocHJpdik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNSUkgUHJvYmUgZmFpbGVkIVxuIik7CisJCWdvdG8gZXJyX21paV9wcm9iZTsKKwl9CisKKwkvKiByZWdpc3RlciBuZXR3b3JrIGRldmljZSAqLworCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIG5ldGRldlxuIik7CisJCWdvdG8gZXJyX3JlZ2lzdGVyX25ldGRldjsKKwl9CisKKwluZXRkZXZfaW5mbyhuZXRkZXYsICJpcnEgJWQsIG1hcHBlZCBhdCAlcFxuIiwgcHJpdi0+aXJxLCBwcml2LT5iYXNlKTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPmRldl9hZGRyKSkgeworCQlyYW5kb21fZXRoZXJfYWRkcihuZXRkZXYtPmRldl9hZGRyKTsKKwkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiZ2VuZXJhdGVkIHJhbmRvbSBNQUMgYWRkcmVzcyAlcE1cbiIsCisJCQkgICAgbmV0ZGV2LT5kZXZfYWRkcik7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9yZWdpc3Rlcl9uZXRkZXY6CisJcGh5X2Rpc2Nvbm5lY3QocHJpdi0+cGh5ZGV2KTsKK2Vycl9taWlfcHJvYmU6CisJbWRpb2J1c191bnJlZ2lzdGVyKHByaXYtPm1paV9idXMpOworZXJyX3JlZ2lzdGVyX21kaW9idXM6CisJbWRpb2J1c19mcmVlKHByaXYtPm1paV9idXMpOworZXJyX2FsbG9jX21kaW9idXM6CisJaW91bm1hcChwcml2LT5iYXNlKTsKK2Vycl9pb3JlbWFwOgorCXJlbGVhc2VfcmVzb3VyY2UocHJpdi0+cmVzKTsKK2Vycl9yZXFfbWVtOgorCW5ldGlmX25hcGlfZGVsKCZwcml2LT5uYXBpKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworZXJyX2FsbG9jX2V0aGVyZGV2OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGZ0Z21hYzEwMF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBmdGdtYWMxMDAgKnByaXY7CisKKwluZXRkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisKKwlwaHlfZGlzY29ubmVjdChwcml2LT5waHlkZXYpOworCW1kaW9idXNfdW5yZWdpc3Rlcihwcml2LT5taWlfYnVzKTsKKwltZGlvYnVzX2ZyZWUocHJpdi0+bWlpX2J1cyk7CisKKwlpb3VubWFwKHByaXYtPmJhc2UpOworCXJlbGVhc2VfcmVzb3VyY2UocHJpdi0+cmVzKTsKKworCW5ldGlmX25hcGlfZGVsKCZwcml2LT5uYXBpKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmdGdtYWMxMDBfZHJpdmVyID0geworCS5wcm9iZQkJPSBmdGdtYWMxMDBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcChmdGdtYWMxMDBfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBEUlZfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluaXRpYWxpemF0aW9uIC8gZmluYWxpemF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9faW5pdCBmdGdtYWMxMDBfaW5pdCh2b2lkKQoreworCXByX2luZm8oIkxvYWRpbmcgdmVyc2lvbiAiIERSVl9WRVJTSU9OICIgLi4uXG4iKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmdGdtYWMxMDBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZ0Z21hYzEwMF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZ0Z21hYzEwMF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChmdGdtYWMxMDBfaW5pdCk7Cittb2R1bGVfZXhpdChmdGdtYWMxMDBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlBvLVl1IENodWFuZyA8cmF0YmVydEBmYXJhZGF5LXRlY2guY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGVEdNQUMxMDAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mdGdtYWMxMDAuaCBiL2RyaXZlcnMvbmV0L2Z0Z21hYzEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDA4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9mdGdtYWMxMDAuaApAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIEZhcmFkYXkgRlRHTUFDMTAwIEdpZ2FiaXQgRXRoZXJuZXQKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDktMjAxMSBGYXJhZGF5IFRlY2hub2xvZ3kKKyAqIFBvLVl1IENodWFuZyA8cmF0YmVydEBmYXJhZGF5LXRlY2guY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19GVEdNQUMxMDBfSAorI2RlZmluZSBfX0ZUR01BQzEwMF9ICisKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9JU1IJCTB4MDAKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9JRVIJCTB4MDQKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9NQUNfTUFEUgkweDA4CisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfTUFDX0xBRFIJMHgwYworI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX01BSFQwCQkweDEwCisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfTUFIVDEJCTB4MTQKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9OUFRYUEQJCTB4MTgKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9SWFBECQkweDFjCisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfTlBUWFJfQkFEUgkweDIwCisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfUlhSX0JBRFIJMHgyNAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX0hQVFhQRAkJMHgyOAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX0hQVFhSX0JBRFIJMHgyYworI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX0lUQwkJMHgzMAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX0FQVEMJCTB4MzQKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9EQkxBQwkJMHgzOAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX0RNQUZJRk9TCTB4M2MKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9SRVZSCQkweDQwCisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfRkVBUgkJMHg0NAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1RQQUZDUgkJMHg0OAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1JCU1IJCTB4NGMKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9NQUNDUgkJMHg1MAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX01BQ1NSCQkweDU0CisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfVE0JCTB4NTgKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9QSFlDUgkJMHg2MAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1BIWURBVEEJMHg2NAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX0ZDUgkJMHg2OAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX0JQUgkJMHg2YworI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1dPTENSCQkweDcwCisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfV09MU1IJCTB4NzQKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9XRkNSQwkJMHg3OAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1dGQk0xCQkweDgwCisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfV0ZCTTIJCTB4ODQKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9XRkJNMwkJMHg4OAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1dGQk00CQkweDhjCisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfTlBUWFJfUFRSCTB4OTAKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9IUFRYUl9QVFIJMHg5NAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1JYUl9QVFIJMHg5OAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1RYCQkweGEwCisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfVFhfTUNPTF9TQ09MCTB4YTQKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9UWF9FQ09MX0ZBSUwJMHhhOAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1RYX0xDT0xfVU5ECTB4YWMKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9SWAkJMHhiMAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1JYX0JDCQkweGI0CisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfUlhfTUMJCTB4YjgKKyNkZWZpbmUgRlRHTUFDMTAwX09GRlNFVF9SWF9QRl9BRVAJMHhiYworI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1JYX1JVTlQJMHhjMAorI2RlZmluZSBGVEdNQUMxMDBfT0ZGU0VUX1JYX0NSQ0VSX0ZUTAkweGM0CisjZGVmaW5lIEZUR01BQzEwMF9PRkZTRVRfUlhfQ09MX0xPU1QJMHhjOAorCisvKgorICogSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAmIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBGVEdNQUMxMDBfSU5UX1JQS1RfQlVGCQkoMSA8PCAwKQorI2RlZmluZSBGVEdNQUMxMDBfSU5UX1JQS1RfRklGTwkJKDEgPDwgMSkKKyNkZWZpbmUgRlRHTUFDMTAwX0lOVF9OT19SWEJVRgkJKDEgPDwgMikKKyNkZWZpbmUgRlRHTUFDMTAwX0lOVF9SUEtUX0xPU1QJCSgxIDw8IDMpCisjZGVmaW5lIEZUR01BQzEwMF9JTlRfWFBLVF9FVEgJCSgxIDw8IDQpCisjZGVmaW5lIEZUR01BQzEwMF9JTlRfWFBLVF9GSUZPCQkoMSA8PCA1KQorI2RlZmluZSBGVEdNQUMxMDBfSU5UX05PX05QVFhCVUYJKDEgPDwgNikKKyNkZWZpbmUgRlRHTUFDMTAwX0lOVF9YUEtUX0xPU1QJCSgxIDw8IDcpCisjZGVmaW5lIEZUR01BQzEwMF9JTlRfQUhCX0VSUgkJKDEgPDwgOCkKKyNkZWZpbmUgRlRHTUFDMTAwX0lOVF9QSFlTVFNfQ0hHCSgxIDw8IDkpCisjZGVmaW5lIEZUR01BQzEwMF9JTlRfTk9fSFBUWEJVRgkoMSA8PCAxMCkKKworLyoKKyAqIEludGVycnVwdCB0aW1lciBjb250cm9sIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgRlRHTUFDMTAwX0lUQ19SWElOVF9DTlQoeCkJKCgoeCkgJiAweGYpIDw8IDApCisjZGVmaW5lIEZUR01BQzEwMF9JVENfUlhJTlRfVEhSKHgpCSgoKHgpICYgMHg3KSA8PCA0KQorI2RlZmluZSBGVEdNQUMxMDBfSVRDX1JYSU5UX1RJTUVfU0VMCSgxIDw8IDcpCisjZGVmaW5lIEZUR01BQzEwMF9JVENfVFhJTlRfQ05UKHgpCSgoKHgpICYgMHhmKSA8PCA4KQorI2RlZmluZSBGVEdNQUMxMDBfSVRDX1RYSU5UX1RIUih4KQkoKCh4KSAmIDB4NykgPDwgMTIpCisjZGVmaW5lIEZUR01BQzEwMF9JVENfVFhJTlRfVElNRV9TRUwJKDEgPDwgMTUpCisKKy8qCisgKiBBdXRvbWF0aWMgcG9sbGluZyB0aW1lciBjb250cm9sIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgRlRHTUFDMTAwX0FQVENfUlhQT0xMX0NOVCh4KQkoKCh4KSAmIDB4ZikgPDwgMCkKKyNkZWZpbmUgRlRHTUFDMTAwX0FQVENfUlhQT0xMX1RJTUVfU0VMCSgxIDw8IDQpCisjZGVmaW5lIEZUR01BQzEwMF9BUFRDX1RYUE9MTF9DTlQoeCkJKCgoeCkgJiAweGYpIDw8IDgpCisjZGVmaW5lIEZUR01BQzEwMF9BUFRDX1RYUE9MTF9USU1FX1NFTAkoMSA8PCAxMikKKworLyoKKyAqIERNQSBidXJzdCBsZW5ndGggYW5kIGFyYml0cmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBGVEdNQUMxMDBfREJMQUNfUlhGSUZPX0xUSFIoeCkJKCgoeCkgJiAweDcpIDw8IDApCisjZGVmaW5lIEZUR01BQzEwMF9EQkxBQ19SWEZJRk9fSFRIUih4KQkoKCh4KSAmIDB4NykgPDwgMykKKyNkZWZpbmUgRlRHTUFDMTAwX0RCTEFDX1JYX1RIUl9FTgkoMSA8PCA2KQorI2RlZmluZSBGVEdNQUMxMDBfREJMQUNfUlhCVVJTVF9TSVpFKHgpCSgoKHgpICYgMHgzKSA8PCA4KQorI2RlZmluZSBGVEdNQUMxMDBfREJMQUNfVFhCVVJTVF9TSVpFKHgpCSgoKHgpICYgMHgzKSA8PCAxMCkKKyNkZWZpbmUgRlRHTUFDMTAwX0RCTEFDX1JYREVTX1NJWkUoeCkJKCgoeCkgJiAweGYpIDw8IDEyKQorI2RlZmluZSBGVEdNQUMxMDBfREJMQUNfVFhERVNfU0laRSh4KQkoKCh4KSAmIDB4ZikgPDwgMTYpCisjZGVmaW5lIEZUR01BQzEwMF9EQkxBQ19JRkdfQ05UKHgpCSgoKHgpICYgMHg3KSA8PCAyMCkKKyNkZWZpbmUgRlRHTUFDMTAwX0RCTEFDX0lGR19JTkMJCSgxIDw8IDIzKQorCisvKgorICogRE1BIEZJRk8gc3RhdHVzIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgRlRHTUFDMTAwX0RNQUZJRk9TX1JYRE1BMV9TTShkbWFmaWZvcykJKChkbWFmaWZvcykgJiAweGYpCisjZGVmaW5lIEZUR01BQzEwMF9ETUFGSUZPU19SWERNQTJfU00oZG1hZmlmb3MpCSgoKGRtYWZpZm9zKSA+PiA0KSAmIDB4ZikKKyNkZWZpbmUgRlRHTUFDMTAwX0RNQUZJRk9TX1JYRE1BM19TTShkbWFmaWZvcykJKCgoZG1hZmlmb3MpID4+IDgpICYgMHg3KQorI2RlZmluZSBGVEdNQUMxMDBfRE1BRklGT1NfVFhETUExX1NNKGRtYWZpZm9zKQkoKChkbWFmaWZvcykgPj4gMTIpICYgMHhmKQorI2RlZmluZSBGVEdNQUMxMDBfRE1BRklGT1NfVFhETUEyX1NNKGRtYWZpZm9zKQkoKChkbWFmaWZvcykgPj4gMTYpICYgMHgzKQorI2RlZmluZSBGVEdNQUMxMDBfRE1BRklGT1NfVFhETUEzX1NNKGRtYWZpZm9zKQkoKChkbWFmaWZvcykgPj4gMTgpICYgMHhmKQorI2RlZmluZSBGVEdNQUMxMDBfRE1BRklGT1NfUlhGSUZPX0VNUFRZCQkoMSA8PCAyNikKKyNkZWZpbmUgRlRHTUFDMTAwX0RNQUZJRk9TX1RYRklGT19FTVBUWQkJKDEgPDwgMjcpCisjZGVmaW5lIEZUR01BQzEwMF9ETUFGSUZPU19SWERNQV9HUkFOVAkJKDEgPDwgMjgpCisjZGVmaW5lIEZUR01BQzEwMF9ETUFGSUZPU19UWERNQV9HUkFOVAkJKDEgPDwgMjkpCisjZGVmaW5lIEZUR01BQzEwMF9ETUFGSUZPU19SWERNQV9SRVEJCSgxIDw8IDMwKQorI2RlZmluZSBGVEdNQUMxMDBfRE1BRklGT1NfVFhETUFfUkVRCQkoMSA8PCAzMSkKKworLyoKKyAqIFJlY2VpdmUgYnVmZmVyIHNpemUgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBGVEdNQUMxMDBfUkJTUl9TSVpFKHgpCQkoKHgpICYgMHgzZmZmKQorCisvKgorICogTUFDIGNvbnRyb2wgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfVFhETUFfRU4JKDEgPDwgMCkKKyNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX1JYRE1BX0VOCSgxIDw8IDEpCisjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9UWE1BQ19FTgkoMSA8PCAyKQorI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfUlhNQUNfRU4JKDEgPDwgMykKKyNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX1JNX1ZMQU4JCSgxIDw8IDQpCisjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9IUFRYUl9FTgkoMSA8PCA1KQorI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfTE9PUF9FTgkJKDEgPDwgNikKKyNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX0VOUlhfSU5fSEFMRlRYCSgxIDw8IDcpCisjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9GVUxMRFVQCQkoMSA8PCA4KQorI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfR0lHQV9NT0RFCSgxIDw8IDkpCisjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9DUkNfQVBECQkoMSA8PCAxMCkKKyNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX1JYX1JVTlQJCSgxIDw8IDEyKQorI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfSlVNQk9fTEYJKDEgPDwgMTMpCisjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9SWF9BTEwJCSgxIDw8IDE0KQorI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfSFRfTVVMVElfRU4JKDEgPDwgMTUpCisjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9SWF9NVUxUSVBLVAkoMSA8PCAxNikKKyNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX1JYX0JST0FEUEtUCSgxIDw8IDE3KQorI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfRElTQ0FSRF9DUkNFUlIJKDEgPDwgMTgpCisjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9GQVNUX01PREUJKDEgPDwgMTkpCisjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9TV19SU1QJCSgxIDw8IDMxKQorCisvKgorICogUEhZIGNvbnRyb2wgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBGVEdNQUMxMDBfUEhZQ1JfTURDX0NZQ1RIUl9NQVNLCTB4M2YKKyNkZWZpbmUgRlRHTUFDMTAwX1BIWUNSX01EQ19DWUNUSFIoeCkJKCh4KSAmIDB4M2YpCisjZGVmaW5lIEZUR01BQzEwMF9QSFlDUl9QSFlBRCh4KQkoKCh4KSAmIDB4MWYpIDw8IDE2KQorI2RlZmluZSBGVEdNQUMxMDBfUEhZQ1JfUkVHQUQoeCkJKCgoeCkgJiAweDFmKSA8PCAyMSkKKyNkZWZpbmUgRlRHTUFDMTAwX1BIWUNSX01JSVJECQkoMSA8PCAyNikKKyNkZWZpbmUgRlRHTUFDMTAwX1BIWUNSX01JSVdSCQkoMSA8PCAyNykKKworLyoKKyAqIFBIWSBkYXRhIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgRlRHTUFDMTAwX1BIWURBVEFfTUlJV0RBVEEoeCkJCSgoeCkgJiAweGZmZmYpCisjZGVmaW5lIEZUR01BQzEwMF9QSFlEQVRBX01JSVJEQVRBKHBoeWRhdGEpCSgoKHBoeWRhdGEpID4+IDE2KSAmIDB4ZmZmZikKKworLyoKKyAqIFRyYW5zbWl0IGRlc2NyaXB0b3IsIGFsaWduZWQgdG8gMTYgYnl0ZXMKKyAqLworc3RydWN0IGZ0Z21hYzEwMF90eGRlcyB7CisJdW5zaWduZWQgaW50CXR4ZGVzMDsKKwl1bnNpZ25lZCBpbnQJdHhkZXMxOworCXVuc2lnbmVkIGludAl0eGRlczI7CS8qIG5vdCB1c2VkIGJ5IEhXICovCisJdW5zaWduZWQgaW50CXR4ZGVzMzsJLyogVFhCVUZfQkFEUiAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKKworI2RlZmluZSBGVEdNQUMxMDBfVFhERVMwX1RYQlVGX1NJWkUoeCkJKCh4KSAmIDB4M2ZmZikKKyNkZWZpbmUgRlRHTUFDMTAwX1RYREVTMF9FRE9UUgkJKDEgPDwgMTUpCisjZGVmaW5lIEZUR01BQzEwMF9UWERFUzBfQ1JDX0VSUgkoMSA8PCAxOSkKKyNkZWZpbmUgRlRHTUFDMTAwX1RYREVTMF9MVFMJCSgxIDw8IDI4KQorI2RlZmluZSBGVEdNQUMxMDBfVFhERVMwX0ZUUwkJKDEgPDwgMjkpCisjZGVmaW5lIEZUR01BQzEwMF9UWERFUzBfVFhETUFfT1dOCSgxIDw8IDMxKQorCisjZGVmaW5lIEZUR01BQzEwMF9UWERFUzFfVkxBTlRBR19DSSh4KQkoKHgpICYgMHhmZmZmKQorI2RlZmluZSBGVEdNQUMxMDBfVFhERVMxX0lOU19WTEFOVEFHCSgxIDw8IDE2KQorI2RlZmluZSBGVEdNQUMxMDBfVFhERVMxX1RDUF9DSEtTVU0JKDEgPDwgMTcpCisjZGVmaW5lIEZUR01BQzEwMF9UWERFUzFfVURQX0NIS1NVTQkoMSA8PCAxOCkKKyNkZWZpbmUgRlRHTUFDMTAwX1RYREVTMV9JUF9DSEtTVU0JKDEgPDwgMTkpCisjZGVmaW5lIEZUR01BQzEwMF9UWERFUzFfTExDCQkoMSA8PCAyMikKKyNkZWZpbmUgRlRHTUFDMTAwX1RYREVTMV9UWDJGSUMJCSgxIDw8IDMwKQorI2RlZmluZSBGVEdNQUMxMDBfVFhERVMxX1RYSUMJCSgxIDw8IDMxKQorCisvKgorICogUmVjZWl2ZSBkZXNjcmlwdG9yLCBhbGlnbmVkIHRvIDE2IGJ5dGVzCisgKi8KK3N0cnVjdCBmdGdtYWMxMDBfcnhkZXMgeworCXVuc2lnbmVkIGludAlyeGRlczA7CisJdW5zaWduZWQgaW50CXJ4ZGVzMTsKKwl1bnNpZ25lZCBpbnQJcnhkZXMyOwkvKiBub3QgdXNlZCBieSBIVyAqLworCXVuc2lnbmVkIGludAlyeGRlczM7CS8qIFJYQlVGX0JBRFIgKi8KK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CisKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9WREJDCQkweDNmZmYKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9FRE9SUgkJKDEgPDwgMTUpCisjZGVmaW5lIEZUR01BQzEwMF9SWERFUzBfTVVMVElDQVNUCSgxIDw8IDE2KQorI2RlZmluZSBGVEdNQUMxMDBfUlhERVMwX0JST0FEQ0FTVAkoMSA8PCAxNykKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9SWF9FUlIJCSgxIDw8IDE4KQorI2RlZmluZSBGVEdNQUMxMDBfUlhERVMwX0NSQ19FUlIJKDEgPDwgMTkpCisjZGVmaW5lIEZUR01BQzEwMF9SWERFUzBfRlRMCQkoMSA8PCAyMCkKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9SVU5UCQkoMSA8PCAyMSkKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9SWF9PRERfTkIJKDEgPDwgMjIpCisjZGVmaW5lIEZUR01BQzEwMF9SWERFUzBfRklGT19GVUxMCSgxIDw8IDIzKQorI2RlZmluZSBGVEdNQUMxMDBfUlhERVMwX1BBVVNFX09QQ09ERQkoMSA8PCAyNCkKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9QQVVTRV9GUkFNRQkoMSA8PCAyNSkKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9MUlMJCSgxIDw8IDI4KQorI2RlZmluZSBGVEdNQUMxMDBfUlhERVMwX0ZSUwkJKDEgPDwgMjkpCisjZGVmaW5lIEZUR01BQzEwMF9SWERFUzBfUlhQS1RfUkRZCSgxIDw8IDMxKQorCisjZGVmaW5lIEZUR01BQzEwMF9SWERFUzFfVkxBTlRBR19DSQkweGZmZmYKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMV9QUk9UX01BU0sJKDB4MyA8PCAyMCkKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMV9QUk9UX05PTklQCSgweDAgPDwgMjApCisjZGVmaW5lIEZUR01BQzEwMF9SWERFUzFfUFJPVF9JUAkoMHgxIDw8IDIwKQorI2RlZmluZSBGVEdNQUMxMDBfUlhERVMxX1BST1RfVENQSVAJKDB4MiA8PCAyMCkKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMV9QUk9UX1VEUElQCSgweDMgPDwgMjApCisjZGVmaW5lIEZUR01BQzEwMF9SWERFUzFfTExDCQkoMSA8PCAyMikKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMV9ERgkJKDEgPDwgMjMpCisjZGVmaW5lIEZUR01BQzEwMF9SWERFUzFfVkxBTlRBR19BVkFJTAkoMSA8PCAyNCkKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMV9UQ1BfQ0hLU1VNX0VSUgkoMSA8PCAyNSkKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMV9VRFBfQ0hLU1VNX0VSUgkoMSA8PCAyNikKKyNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMV9JUF9DSEtTVU1fRVJSCSgxIDw8IDI3KQorCisjZW5kaWYgLyogX19GVEdNQUMxMDBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCmluZGV4IGZmNjBiMjMuLjgzNWNkMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYworKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEKICAqIE1vZGlmaWVyOiBTYW5kZWVwIEdvcGFscGV0IDxzYW5kZWVwLmt1bWFyQGZyZWVzY2FsZS5jb20+CiAgKgotICogQ29weXJpZ2h0IDIwMDItMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMDItMjAwOSwgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgogICogQ29weXJpZ2h0IDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNjIsNiArNjIsOSBAQAogICogIFRoZSBkcml2ZXIgdGhlbiBjbGVhbnMgdXAgdGhlIGJ1ZmZlci4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisjZGVmaW5lIERFQlVHCisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpAQCAtMTM3LDggKzE0MCw2IEBACiBzdGF0aWMgaW50IGdmYXJfY2xlYW5fdHhfcmluZyhzdHJ1Y3QgZ2Zhcl9wcml2X3R4X3EgKnR4X3F1ZXVlKTsKIHN0YXRpYyBpbnQgZ2Zhcl9wcm9jZXNzX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICBpbnQgYW1vdW50X3B1bGwpOwotc3RhdGljIHZvaWQgZ2Zhcl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCSAgICAgICAgICAgICAgICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKTsKIHZvaWQgZ2Zhcl9oYWx0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgZ2Zhcl9oYWx0X25vZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgZ2Zhcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTIxMyw4ICsyMTQsNyBAQAogCQkJfSBlbHNlIHsKIAkJCQlza2IgPSBnZmFyX25ld19za2IobmRldik7CiAJCQkJaWYgKCFza2IpIHsKLQkJCQkJcHJfZXJyKCIlczogQ2FuJ3QgYWxsb2NhdGUgUlggYnVmZmVyc1xuIiwKLQkJCQkJCQluZGV2LT5uYW1lKTsKKwkJCQkJbmV0ZGV2X2VycihuZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgUlggYnVmZmVyc1xuIik7CiAJCQkJCWdvdG8gZXJyX3J4YWxsb2NfZmFpbDsKIAkJCQl9CiAJCQkJcnhfcXVldWUtPnJ4X3NrYnVmZltqXSA9IHNrYjsKQEAgLTI1OCwxNSArMjU4LDE0IEBACiAJCQlzaXplb2Yoc3RydWN0IHJ4YmQ4KSAqIHByaXYtPnRvdGFsX3J4X3Jpbmdfc2l6ZSwKIAkJCSZhZGRyLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZhZGRyKSB7Ci0JCWlmIChuZXRpZl9tc2dfaWZ1cChwcml2KSkKLQkJCXByX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnMhXG4iLAotCQkJICAgICAgIG5kZXYtPm5hbWUpOworCQluZXRpZl9lcnIocHJpdiwgaWZ1cCwgbmRldiwKKwkJCSAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnMhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHByaXYtPm51bV90eF9xdWV1ZXM7IGkrKykgewogCQl0eF9xdWV1ZSA9IHByaXYtPnR4X3F1ZXVlW2ldOwotCQl0eF9xdWV1ZS0+dHhfYmRfYmFzZSA9IChzdHJ1Y3QgdHhiZDggKikgdmFkZHI7CisJCXR4X3F1ZXVlLT50eF9iZF9iYXNlID0gdmFkZHI7CiAJCXR4X3F1ZXVlLT50eF9iZF9kbWFfYmFzZSA9IGFkZHI7CiAJCXR4X3F1ZXVlLT5kZXYgPSBuZGV2OwogCQkvKiBlbmV0IERNQSBvbmx5IHVuZGVyc3RhbmRzIHBoeXNpY2FsIGFkZHJlc3NlcyAqLwpAQCAtMjc3LDcgKzI3Niw3IEBACiAJLyogU3RhcnQgdGhlIHJ4IGRlc2NyaXB0b3IgcmluZyB3aGVyZSB0aGUgdHggcmluZyBsZWF2ZXMgb2ZmICovCiAJZm9yIChpID0gMDsgaSA8IHByaXYtPm51bV9yeF9xdWV1ZXM7IGkrKykgewogCQlyeF9xdWV1ZSA9IHByaXYtPnJ4X3F1ZXVlW2ldOwotCQlyeF9xdWV1ZS0+cnhfYmRfYmFzZSA9IChzdHJ1Y3QgcnhiZDggKikgdmFkZHI7CisJCXJ4X3F1ZXVlLT5yeF9iZF9iYXNlID0gdmFkZHI7CiAJCXJ4X3F1ZXVlLT5yeF9iZF9kbWFfYmFzZSA9IGFkZHI7CiAJCXJ4X3F1ZXVlLT5kZXYgPSBuZGV2OwogCQlhZGRyICAgICs9IHNpemVvZiAoc3RydWN0IHJ4YmQ4KSAqIHJ4X3F1ZXVlLT5yeF9yaW5nX3NpemU7CkBAIC0yOTAsOSArMjg5LDggQEAKIAkJdHhfcXVldWUtPnR4X3NrYnVmZiA9IGttYWxsb2Moc2l6ZW9mKCp0eF9xdWV1ZS0+dHhfc2tidWZmKSAqCiAJCQkJICB0eF9xdWV1ZS0+dHhfcmluZ19zaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF0eF9xdWV1ZS0+dHhfc2tidWZmKSB7Ci0JCQlpZiAobmV0aWZfbXNnX2lmdXAocHJpdikpCi0JCQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIHR4X3NrYnVmZlxuIiwKLQkJCQkJCW5kZXYtPm5hbWUpOworCQkJbmV0aWZfZXJyKHByaXYsIGlmdXAsIG5kZXYsCisJCQkJICAiQ291bGQgbm90IGFsbG9jYXRlIHR4X3NrYnVmZlxuIik7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIApAQCAtMzA2LDkgKzMwNCw4IEBACiAJCQkJICByeF9xdWV1ZS0+cnhfcmluZ19zaXplLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAoIXJ4X3F1ZXVlLT5yeF9za2J1ZmYpIHsKLQkJCWlmIChuZXRpZl9tc2dfaWZ1cChwcml2KSkKLQkJCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcnhfc2tidWZmXG4iLAotCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCW5ldGlmX2Vycihwcml2LCBpZnVwLCBuZGV2LAorCQkJCSAgIkNvdWxkIG5vdCBhbGxvY2F0ZSByeF9za2J1ZmZcbiIpOwogCQkJZ290byBjbGVhbnVwOwogCQl9CiAKQEAgLTM5MiwxMCArMzg5LDExIEBACiAJCXJjdHJsIHw9IFJDVFJMX1BSU0RFUF9JTklUIHwgUkNUUkxfVFNfRU5BQkxFOwogCiAJLyoga2VlcCB2bGFuIHJlbGF0ZWQgYml0cyBpZiBpdCdzIGVuYWJsZWQgKi8KLQlpZiAocHJpdi0+dmxncnApIHsKKwlpZiAobmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fVFgpCiAJCXJjdHJsIHw9IFJDVFJMX1ZMRVggfCBSQ1RSTF9QUlNERVBfSU5JVDsKKworCWlmIChuZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKIAkJdGN0cmwgfD0gVENUUkxfVkxJTlM7Ci0JfQogCiAJLyogSW5pdCByY3RybCBiYXNlZCBvbiBvdXIgc2V0dGluZ3MgKi8KIAlnZmFyX3dyaXRlKCZyZWdzLT5yY3RybCwgcmN0cmwpOwpAQCAtNDY4LDcgKzQ2Niw2IEBACiAJLm5kb190eF90aW1lb3V0ID0gZ2Zhcl90aW1lb3V0LAogCS5uZG9fZG9faW9jdGwgPSBnZmFyX2lvY3RsLAogCS5uZG9fZ2V0X3N0YXRzID0gZ2Zhcl9nZXRfc3RhdHMsCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyID0gZ2Zhcl92bGFuX3J4X3JlZ2lzdGVyLAogCS5uZG9fc2V0X21hY19hZGRyZXNzID0gZXRoX21hY19hZGRyLAogCS5uZG9fdmFsaWRhdGVfYWRkciA9IGV0aF92YWxpZGF0ZV9hZGRyLAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCkBAIC00NzYsOSArNDczLDYgQEAKICNlbmRpZgogfTsKIAotdW5zaWduZWQgaW50IGZ0cF9ycWZwcltNQVhfRklMRVJfSURYICsgMV07Ci11bnNpZ25lZCBpbnQgZnRwX3JxZmNyW01BWF9GSUxFUl9JRFggKyAxXTsKLQogdm9pZCBsb2NrX3J4X3FzKHN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYpCiB7CiAJaW50IGkgPSAweDA7CkBAIC01MTEsMTAgKzUwNSwxNyBAQAogCQlzcGluX3VubG9jaygmcHJpdi0+dHhfcXVldWVbaV0tPnR4bG9jayk7CiB9CiAKK3N0YXRpYyBib29sIGdmYXJfaXNfdmxhbl9vbihzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KQoreworCXJldHVybiAocHJpdi0+bmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpIHx8CisJICAgICAgIChwcml2LT5uZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9UWCk7Cit9CisKIC8qIFJldHVybnMgMSBpZiBpbmNvbWluZyBmcmFtZXMgdXNlIGFuIEZDQiAqLwogc3RhdGljIGlubGluZSBpbnQgZ2Zhcl91c2VzX2ZjYihzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KQogewotCXJldHVybiBwcml2LT52bGdycCB8fCAocHJpdi0+bmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkgfHwKKwlyZXR1cm4gZ2Zhcl9pc192bGFuX29uKHByaXYpIHx8CisJCShwcml2LT5uZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKSB8fAogCQkocHJpdi0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19USU1FUik7CiB9CiAKQEAgLTYyOCw5ICs2MjksOSBAQAogCW51bV90eF9xcyA9IHR4X3F1ZXVlcyA/ICp0eF9xdWV1ZXMgOiAxOwogCiAJaWYgKG51bV90eF9xcyA+IE1BWF9UWF9RUykgewotCQlwcmludGsoS0VSTl9FUlIgIm51bV90eF9xcyg9JWQpIGdyZWF0ZXIgdGhhbiBNQVhfVFhfUVMoPSVkKVxuIiwKLQkJCQludW1fdHhfcXMsIE1BWF9UWF9RUyk7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGRvIGFsbG9jX2V0aGVyZGV2LCBhYm9ydGluZ1xuIik7CisJCXByX2VycigibnVtX3R4X3FzKD0lZCkgZ3JlYXRlciB0aGFuIE1BWF9UWF9RUyg9JWQpXG4iLAorCQkgICAgICAgbnVtX3R4X3FzLCBNQVhfVFhfUVMpOworCQlwcl9lcnIoIkNhbm5vdCBkbyBhbGxvY19ldGhlcmRldiwgYWJvcnRpbmdcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTYzOCw5ICs2MzksOSBAQAogCW51bV9yeF9xcyA9IHJ4X3F1ZXVlcyA/ICpyeF9xdWV1ZXMgOiAxOwogCiAJaWYgKG51bV9yeF9xcyA+IE1BWF9SWF9RUykgewotCQlwcmludGsoS0VSTl9FUlIgIm51bV9yeF9xcyg9JWQpIGdyZWF0ZXIgdGhhbiBNQVhfUlhfUVMoPSVkKVxuIiwKLQkJCQludW1fdHhfcXMsIE1BWF9UWF9RUyk7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGRvIGFsbG9jX2V0aGVyZGV2LCBhYm9ydGluZ1xuIik7CisJCXByX2VycigibnVtX3J4X3FzKD0lZCkgZ3JlYXRlciB0aGFuIE1BWF9SWF9RUyg9JWQpXG4iLAorCQkgICAgICAgbnVtX3J4X3FzLCBNQVhfUlhfUVMpOworCQlwcl9lcnIoIkNhbm5vdCBkbyBhbGxvY19ldGhlcmRldiwgYWJvcnRpbmdcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTY1OCw2ICs2NTksMTEgQEAKIAlwcml2LT5udW1fcnhfcXVldWVzID0gbnVtX3J4X3FzOwogCXByaXYtPm51bV9ncnBzID0gMHgwOwogCisJLyogSW5pdCBSeCBxdWV1ZSBmaWxlciBydWxlIHNldCBsaW5rZWQgbGlzdCovCisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnJ4X2xpc3QubGlzdCk7CisJcHJpdi0+cnhfbGlzdC5jb3VudCA9IDA7CisJbXV0ZXhfaW5pdCgmcHJpdi0+cnhfcXVldWVfYWNjZXNzKTsKKwogCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZWwiLCBOVUxMKTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhHUk9VUFM7IGkrKykKQEAgLTg2OCwyOCArODc0LDI4IEBACiAKIAlycWZhci0tOwogCXJxZmNyID0gUlFGQ1JfQ0xFIHwgUlFGQ1JfUElEX01BU0sgfCBSUUZDUl9DTVBfRVhBQ1Q7Ci0JZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOwotCWZ0cF9ycWZjcltycWZhcl0gPSBycWZjcjsKKwlwcml2LT5mdHBfcnFmcHJbcnFmYXJdID0gcnFmcHI7CisJcHJpdi0+ZnRwX3JxZmNyW3JxZmFyXSA9IHJxZmNyOwogCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcnFmYXIsIHJxZmNyLCBycWZwcik7CiAKIAlycWZhci0tOwogCXJxZmNyID0gUlFGQ1JfQ01QX05PTUFUQ0g7Ci0JZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOwotCWZ0cF9ycWZjcltycWZhcl0gPSBycWZjcjsKKwlwcml2LT5mdHBfcnFmcHJbcnFmYXJdID0gcnFmcHI7CisJcHJpdi0+ZnRwX3JxZmNyW3JxZmFyXSA9IHJxZmNyOwogCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcnFmYXIsIHJxZmNyLCBycWZwcik7CiAKIAlycWZhci0tOwogCXJxZmNyID0gUlFGQ1JfQ01QX0VYQUNUIHwgUlFGQ1JfUElEX1BBUlNFIHwgUlFGQ1JfQ0xFIHwgUlFGQ1JfQU5EOwogCXJxZnByID0gY2xhc3M7Ci0JZnRwX3JxZmNyW3JxZmFyXSA9IHJxZmNyOwotCWZ0cF9ycWZwcltycWZhcl0gPSBycWZwcjsKKwlwcml2LT5mdHBfcnFmY3JbcnFmYXJdID0gcnFmY3I7CisJcHJpdi0+ZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOwogCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcnFmYXIsIHJxZmNyLCBycWZwcik7CiAKIAlycWZhci0tOwogCXJxZmNyID0gUlFGQ1JfQ01QX0VYQUNUIHwgUlFGQ1JfUElEX01BU0sgfCBSUUZDUl9BTkQ7CiAJcnFmcHIgPSBjbGFzczsKLQlmdHBfcnFmY3JbcnFmYXJdID0gcnFmY3I7Ci0JZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOworCXByaXYtPmZ0cF9ycWZjcltycWZhcl0gPSBycWZjcjsKKwlwcml2LT5mdHBfcnFmcHJbcnFmYXJdID0gcnFmcHI7CiAJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBycWZhciwgcnFmY3IsIHJxZnByKTsKIAogCXJldHVybiBycWZhcjsKQEAgLTkwNCw4ICs5MTAsOCBAQAogCiAJLyogRGVmYXVsdCBydWxlICovCiAJcnFmY3IgPSBSUUZDUl9DTVBfTUFUQ0g7Ci0JZnRwX3JxZmNyW3JxZmFyXSA9IHJxZmNyOwotCWZ0cF9ycWZwcltycWZhcl0gPSBycWZwcjsKKwlwcml2LT5mdHBfcnFmY3JbcnFmYXJdID0gcnFmY3I7CisJcHJpdi0+ZnRwX3JxZnByW3JxZmFyXSA9IHJxZnByOwogCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcnFmYXIsIHJxZmNyLCBycWZwcik7CiAKIAlycWZhciA9IGNsdXN0ZXJfZW50cnlfcGVyX2NsYXNzKHByaXYsIHJxZmFyLCBSUUZQUl9JUFY2KTsKQEAgLTkyMSw4ICs5MjcsOCBAQAogCS8qIFJlc3QgYXJlIG1hc2tlZCBydWxlcyAqLwogCXJxZmNyID0gUlFGQ1JfQ01QX05PTUFUQ0g7CiAJZm9yIChpID0gMDsgaSA8IHJxZmFyOyBpKyspIHsKLQkJZnRwX3JxZmNyW2ldID0gcnFmY3I7Ci0JCWZ0cF9ycWZwcltpXSA9IHJxZnByOworCQlwcml2LT5mdHBfcnFmY3JbaV0gPSBycWZjcjsKKwkJcHJpdi0+ZnRwX3JxZnByW2ldID0gcnFmcHI7CiAJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgaSwgcnFmY3IsIHJxZnByKTsKIAl9CiB9CkBAIC0xMDM3LDEwICsxMDQzLDEwIEBACiAJCQlORVRJRl9GX1JYQ1NVTSB8IE5FVElGX0ZfSElHSERNQTsKIAl9CiAKLQlwcml2LT52bGdycCA9IE5VTEw7Ci0KLQlpZiAocHJpdi0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19WTEFOKQorCWlmIChwcml2LT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX1ZMQU4pIHsKKwkJZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7CiAJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOworCX0KIAogCWlmIChwcml2LT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX0VYVEVOREVEX0hBU0gpIHsKIAkJcHJpdi0+ZXh0ZW5kZWRfaGFzaCA9IDE7CkBAIC0xMTUxLDkgKzExNTcsOCBAQAogCQlwcml2LT5yeF9xdWV1ZVtpXS0+cnhpYyA9IERFRkFVTFRfUlhJQzsKIAl9CiAKLQkvKiBlbmFibGUgZmlsZXIgaWYgdXNpbmcgbXVsdGlwbGUgUlggcXVldWVzKi8KLQlpZihwcml2LT5udW1fcnhfcXVldWVzID4gMSkKLQkJcHJpdi0+cnhfZmlsZXJfZW5hYmxlID0gMTsKKwkvKiBhbHdheXMgZW5hYmxlIHJ4IGZpbGVyKi8KKwlwcml2LT5yeF9maWxlcl9lbmFibGUgPSAxOwogCS8qIEVuYWJsZSBtb3N0IG1lc3NhZ2VzIGJ5IGRlZmF1bHQgKi8KIAlwcml2LT5tc2dfZW5hYmxlID0gKE5FVElGX01TR19JRlVQIDw8IDEgKSAtIDE7CiAKQEAgLTExNjMsOCArMTE2OCw3IEBACiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZy5cbiIsCi0JCQkJZGV2LT5uYW1lKTsKKwkJcHJfZXJyKCIlczogQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsIGFib3J0aW5nXG4iLCBkZXYtPm5hbWUpOwogCQlnb3RvIHJlZ2lzdGVyX2ZhaWw7CiAJfQogCkBAIC0xMjE1LDE3ICsxMjE5LDE3IEBACiAJZ2Zhcl9pbml0X3N5c2ZzKGRldik7CiAKIAkvKiBQcmludCBvdXQgdGhlIGRldmljZSBpbmZvICovCi0JcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiJXBNXG4iLCBkZXYtPm5hbWUsIGRldi0+ZGV2X2FkZHIpOworCW5ldGRldl9pbmZvKGRldiwgIm1hYzogJXBNXG4iLCBkZXYtPmRldl9hZGRyKTsKIAogCS8qIEV2ZW4gbW9yZSBkZXZpY2UgaW5mbyBoZWxwcyB3aGVuIGRldGVybWluaW5nIHdoaWNoIGtlcm5lbCAqLwogCS8qIHByb3ZpZGVkIHdoaWNoIHNldCBvZiBiZW5jaG1hcmtzLiAqLwotCXByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIHdpdGggTkFQSSBlbmFibGVkXG4iLCBkZXYtPm5hbWUpOworCW5ldGRldl9pbmZvKGRldiwgIlJ1bm5pbmcgd2l0aCBOQVBJIGVuYWJsZWRcbiIpOwogCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1fcnhfcXVldWVzOyBpKyspCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBSWCBCRCByaW5nIHNpemUgZm9yIFFbJWRdOiAlZFxuIiwKLQkJCWRldi0+bmFtZSwgaSwgcHJpdi0+cnhfcXVldWVbaV0tPnJ4X3Jpbmdfc2l6ZSk7CisJCW5ldGRldl9pbmZvKGRldiwgIlJYIEJEIHJpbmcgc2l6ZSBmb3IgUVslZF06ICVkXG4iLAorCQkJICAgIGksIHByaXYtPnJ4X3F1ZXVlW2ldLT5yeF9yaW5nX3NpemUpOwogCWZvcihpID0gMDsgaSA8IHByaXYtPm51bV90eF9xdWV1ZXM7IGkrKykKLQkJIHByaW50ayhLRVJOX0lORk8gIiVzOiBUWCBCRCByaW5nIHNpemUgZm9yIFFbJWRdOiAlZFxuIiwKLQkJCWRldi0+bmFtZSwgaSwgcHJpdi0+dHhfcXVldWVbaV0tPnR4X3Jpbmdfc2l6ZSk7CisJCW5ldGRldl9pbmZvKGRldiwgIlRYIEJEIHJpbmcgc2l6ZSBmb3IgUVslZF06ICVkXG4iLAorCQkJICAgIGksIHByaXYtPnR4X3F1ZXVlW2ldLT50eF9yaW5nX3NpemUpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTE4NTgsMzQgKzE4NjIsMzAgQEAKIAkJICogVHJhbnNtaXQsIGFuZCBSZWNlaXZlICovCiAJCWlmICgoZXJyID0gcmVxdWVzdF9pcnEoZ3JwLT5pbnRlcnJ1cHRFcnJvciwgZ2Zhcl9lcnJvciwgMCwKIAkJCQlncnAtPmludF9uYW1lX2VyLGdycCkpIDwgMCkgewotCQkJaWYgKG5ldGlmX21zZ19pbnRyKHByaXYpKQotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWRcbiIsCi0JCQkJCWRldi0+bmFtZSwgZ3JwLT5pbnRlcnJ1cHRFcnJvcik7CisJCQluZXRpZl9lcnIocHJpdiwgaW50ciwgZGV2LCAiQ2FuJ3QgZ2V0IElSUSAlZFxuIiwKKwkJCQkgIGdycC0+aW50ZXJydXB0RXJyb3IpOwogCiAJCQlnb3RvIGVycl9pcnFfZmFpbDsKIAkJfQogCiAJCWlmICgoZXJyID0gcmVxdWVzdF9pcnEoZ3JwLT5pbnRlcnJ1cHRUcmFuc21pdCwgZ2Zhcl90cmFuc21pdCwKIAkJCQkwLCBncnAtPmludF9uYW1lX3R4LCBncnApKSA8IDApIHsKLQkJCWlmIChuZXRpZl9tc2dfaW50cihwcml2KSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkXG4iLAotCQkJCQlkZXYtPm5hbWUsIGdycC0+aW50ZXJydXB0VHJhbnNtaXQpOworCQkJbmV0aWZfZXJyKHByaXYsIGludHIsIGRldiwgIkNhbid0IGdldCBJUlEgJWRcbiIsCisJCQkJICBncnAtPmludGVycnVwdFRyYW5zbWl0KTsKIAkJCWdvdG8gdHhfaXJxX2ZhaWw7CiAJCX0KIAogCQlpZiAoKGVyciA9IHJlcXVlc3RfaXJxKGdycC0+aW50ZXJydXB0UmVjZWl2ZSwgZ2Zhcl9yZWNlaXZlLCAwLAogCQkJCWdycC0+aW50X25hbWVfcngsIGdycCkpIDwgMCkgewotCQkJaWYgKG5ldGlmX21zZ19pbnRyKHByaXYpKQotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWRcbiIsCi0JCQkJCWRldi0+bmFtZSwgZ3JwLT5pbnRlcnJ1cHRSZWNlaXZlKTsKKwkJCW5ldGlmX2Vycihwcml2LCBpbnRyLCBkZXYsICJDYW4ndCBnZXQgSVJRICVkXG4iLAorCQkJCSAgZ3JwLT5pbnRlcnJ1cHRSZWNlaXZlKTsKIAkJCWdvdG8gcnhfaXJxX2ZhaWw7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoKGVyciA9IHJlcXVlc3RfaXJxKGdycC0+aW50ZXJydXB0VHJhbnNtaXQsIGdmYXJfaW50ZXJydXB0LCAwLAogCQkJCWdycC0+aW50X25hbWVfdHgsIGdycCkpIDwgMCkgewotCQkJaWYgKG5ldGlmX21zZ19pbnRyKHByaXYpKQotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWRcbiIsCi0JCQkJCWRldi0+bmFtZSwgZ3JwLT5pbnRlcnJ1cHRUcmFuc21pdCk7CisJCQluZXRpZl9lcnIocHJpdiwgaW50ciwgZGV2LCAiQ2FuJ3QgZ2V0IElSUSAlZFxuIiwKKwkJCQkgIGdycC0+aW50ZXJydXB0VHJhbnNtaXQpOwogCQkJZ290byBlcnJfaXJxX2ZhaWw7CiAJCX0KIAl9CkBAIC0yMjkyLDEwICsyMjkyLDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIENoZWNrIGlmIHJ4IHBhcnNlciBzaG91bGQgYmUgYWN0aXZhdGVkICovCit2b2lkIGdmYXJfY2hlY2tfcnhfcGFyc2VyX21vZGUoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgZ2ZhciBfX2lvbWVtICpyZWdzOworCXUzMiB0ZW1wdmFsOworCisJcmVncyA9IHByaXYtPmdmYXJncnBbMF0ucmVnczsKKworCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPnJjdHJsKTsKKwkvKiBJZiBwYXJzZSBpcyBubyBsb25nZXIgcmVxdWlyZWQsIHRoZW4gZGlzYWJsZSBwYXJzZXIgKi8KKwlpZiAodGVtcHZhbCAmIFJDVFJMX1JFUV9QQVJTRVIpCisJCXRlbXB2YWwgfD0gUkNUUkxfUFJTREVQX0lOSVQ7CisJZWxzZQorCQl0ZW1wdmFsICY9IH5SQ1RSTF9QUlNERVBfSU5JVDsKKwlnZmFyX3dyaXRlKCZyZWdzLT5yY3RybCwgdGVtcHZhbCk7Cit9CiAKIC8qIEVuYWJsZXMgYW5kIGRpc2FibGVzIFZMQU4gaW5zZXJ0aW9uL2V4dHJhY3Rpb24gKi8KLXN0YXRpYyB2b2lkIGdmYXJfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQordm9pZCBnZmFyX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCiB7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGdmYXIgX19pb21lbSAqcmVncyA9IE5VTEw7CkBAIC0yMzA2LDM0ICsyMzIxLDMwIEBACiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWxvY2tfcnhfcXMocHJpdik7CiAKLQlwcml2LT52bGdycCA9IGdycDsKLQotCWlmIChncnApIHsKKwlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fVFgpIHsKIAkJLyogRW5hYmxlIFZMQU4gdGFnIGluc2VydGlvbiAqLwogCQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT50Y3RybCk7CiAJCXRlbXB2YWwgfD0gVENUUkxfVkxJTlM7Ci0KIAkJZ2Zhcl93cml0ZSgmcmVncy0+dGN0cmwsIHRlbXB2YWwpOwotCi0JCS8qIEVuYWJsZSBWTEFOIHRhZyBleHRyYWN0aW9uICovCi0JCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPnJjdHJsKTsKLQkJdGVtcHZhbCB8PSAoUkNUUkxfVkxFWCB8IFJDVFJMX1BSU0RFUF9JTklUKTsKLQkJZ2Zhcl93cml0ZSgmcmVncy0+cmN0cmwsIHRlbXB2YWwpOwogCX0gZWxzZSB7CiAJCS8qIERpc2FibGUgVkxBTiB0YWcgaW5zZXJ0aW9uICovCiAJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPnRjdHJsKTsKIAkJdGVtcHZhbCAmPSB+VENUUkxfVkxJTlM7CiAJCWdmYXJfd3JpdGUoJnJlZ3MtPnRjdHJsLCB0ZW1wdmFsKTsKKwl9CiAKKwlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpIHsKKwkJLyogRW5hYmxlIFZMQU4gdGFnIGV4dHJhY3Rpb24gKi8KKwkJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcmVncy0+cmN0cmwpOworCQl0ZW1wdmFsIHw9IChSQ1RSTF9WTEVYIHwgUkNUUkxfUFJTREVQX0lOSVQpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5yY3RybCwgdGVtcHZhbCk7CisJfSBlbHNlIHsKIAkJLyogRGlzYWJsZSBWTEFOIHRhZyBleHRyYWN0aW9uICovCiAJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPnJjdHJsKTsKIAkJdGVtcHZhbCAmPSB+UkNUUkxfVkxFWDsKLQkJLyogSWYgcGFyc2UgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLCB0aGVuIGRpc2FibGUgcGFyc2VyICovCi0JCWlmICh0ZW1wdmFsICYgUkNUUkxfUkVRX1BBUlNFUikKLQkJCXRlbXB2YWwgfD0gUkNUUkxfUFJTREVQX0lOSVQ7Ci0JCWVsc2UKLQkJCXRlbXB2YWwgJj0gflJDVFJMX1BSU0RFUF9JTklUOwogCQlnZmFyX3dyaXRlKCZyZWdzLT5yY3RybCwgdGVtcHZhbCk7CisKKwkJZ2Zhcl9jaGVja19yeF9wYXJzZXJfbW9kZShwcml2KTsKIAl9CiAKIAlnZmFyX2NoYW5nZV9tdHUoZGV2LCBkZXYtPm10dSk7CkBAIC0yMzUwLDEzICsyMzYxLDExIEBACiAJaW50IG9sZHNpemUgPSBwcml2LT5yeF9idWZmZXJfc2l6ZTsKIAlpbnQgZnJhbWVfc2l6ZSA9IG5ld19tdHUgKyBFVEhfSExFTjsKIAotCWlmIChwcml2LT52bGdycCkKKwlpZiAoZ2Zhcl9pc192bGFuX29uKHByaXYpKQogCQlmcmFtZV9zaXplICs9IFZMQU5fSExFTjsKIAogCWlmICgoZnJhbWVfc2l6ZSA8IDY0KSB8fCAoZnJhbWVfc2l6ZSA+IEpVTUJPX0ZSQU1FX1NJWkUpKSB7Ci0JCWlmIChuZXRpZl9tc2dfZHJ2KHByaXYpKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBNVFUgc2V0dGluZ1xuIiwKLQkJCQkJZGV2LT5uYW1lKTsKKwkJbmV0aWZfZXJyKHByaXYsIGRydiwgZGV2LCAiSW52YWxpZCBNVFUgc2V0dGluZ1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjcwNSwxMSArMjcxNCwxMiBAQAogCS8qIFRlbGwgdGhlIHNrYiB3aGF0IGtpbmQgb2YgcGFja2V0IHRoaXMgaXMgKi8KIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCisJLyogU2V0IHZsYW4gdGFnICovCisJaWYgKGZjYi0+ZmxhZ3MgJiBSWEZDQl9WTE4pCisJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCBmY2ItPnZsY3RsKTsKKwogCS8qIFNlbmQgdGhlIHBhY2tldCB1cCB0aGUgc3RhY2sgKi8KLQlpZiAodW5saWtlbHkocHJpdi0+dmxncnAgJiYgKGZjYi0+ZmxhZ3MgJiBSWEZDQl9WTE4pKSkKLQkJcmV0ID0gdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgcHJpdi0+dmxncnAsIGZjYi0+dmxjdGwpOwotCWVsc2UKLQkJcmV0ID0gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwlyZXQgPSBuZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCiAJaWYgKE5FVF9SWF9EUk9QID09IHJldCkKIAkJcHJpdi0+ZXh0cmFfc3RhdHMua2VybmVsX2Ryb3BwZWQrKzsKQEAgLTI3NzYsOSArMjc4Niw3IEBACiAJCQkJZ2Zhcl9wcm9jZXNzX2ZyYW1lKGRldiwgc2tiLCBhbW91bnRfcHVsbCk7CiAKIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKG5ldGlmX21zZ19yeF9lcnIocHJpdikpCi0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkJICAgICAgICIlczogTWlzc2luZyBza2IhXG4iLCBkZXYtPm5hbWUpOworCQkJCW5ldGlmX3dhcm4ocHJpdiwgcnhfZXJyLCBkZXYsICJNaXNzaW5nIHNrYiFcbiIpOwogCQkJCXJ4X3F1ZXVlLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQkJcHJpdi0+ZXh0cmFfc3RhdHMucnhfc2tibWlzc2luZysrOwogCQkJfQpAQCAtMjk4MSwxMCArMjk4OSw5IEBACiAJCQkJCWVjbnRybCAmPSB+KEVDTlRSTF9SMTAwKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJaWYgKG5ldGlmX21zZ19saW5rKHByaXYpKQotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJCQkiJXM6IEFjayEgIFNwZWVkICglZCkgaXMgbm90IDEwLzEwMC8xMDAwIVxuIiwKLQkJCQkJCWRldi0+bmFtZSwgcGh5ZGV2LT5zcGVlZCk7CisJCQkJbmV0aWZfd2Fybihwcml2LCBsaW5rLCBkZXYsCisJCQkJCSAgICJBY2shICBTcGVlZCAoJWQpIGlzIG5vdCAxMC8xMDAvMTAwMCFcbiIsCisJCQkJCSAgIHBoeWRldi0+c3BlZWQpOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC0zMTg5LDggKzMxOTYsOCBAQAogCiAJLyogSG1tLi4uICovCiAJaWYgKG5ldGlmX21zZ19yeF9lcnIocHJpdikgfHwgbmV0aWZfbXNnX3R4X2Vycihwcml2KSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlcnJvciBpbnRlcnJ1cHQgKGlldmVudD0weCUwOHggaW1hc2s9MHglMDh4KVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgZXZlbnRzLCBnZmFyX3JlYWQoJnJlZ3MtPmltYXNrKSk7CisJCW5ldGRldl9kYmcoZGV2LCAiZXJyb3IgaW50ZXJydXB0IChpZXZlbnQ9MHglMDh4IGltYXNrPTB4JTA4eClcbiIsCisJCQkgICBldmVudHMsIGdmYXJfcmVhZCgmcmVncy0+aW1hc2spKTsKIAogCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRlcnMgKi8KIAlpZiAoZXZlbnRzICYgSUVWRU5UX1RYRSkgewpAQCAtMzIwMyw5ICszMjEwLDggQEAKIAkJaWYgKGV2ZW50cyAmIElFVkVOVF9YRlVOKSB7CiAJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCQlpZiAobmV0aWZfbXNnX3R4X2Vycihwcml2KSkKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRYIEZJRk8gdW5kZXJydW4sICIKLQkJCQkgICAgICAgInBhY2tldCBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJCW5ldGlmX2RiZyhwcml2LCB0eF9lcnIsIGRldiwKKwkJCQkgICJUWCBGSUZPIHVuZGVycnVuLCBwYWNrZXQgZHJvcHBlZFxuIik7CiAJCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJCXByaXYtPmV4dHJhX3N0YXRzLnR4X3VuZGVycnVuKys7CiAKQEAgLTMyMTgsOCArMzIyNCw3IEBACiAJCQl1bmxvY2tfdHhfcXMocHJpdik7CiAJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCX0KLQkJaWYgKG5ldGlmX21zZ190eF9lcnIocHJpdikpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0IEVycm9yXG4iLCBkZXYtPm5hbWUpOworCQluZXRpZl9kYmcocHJpdiwgdHhfZXJyLCBkZXYsICJUcmFuc21pdCBFcnJvclxuIik7CiAJfQogCWlmIChldmVudHMgJiBJRVZFTlRfQlNZKSB7CiAJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CkBAIC0zMjI3LDI5ICszMjMyLDI1IEBACiAKIAkJZ2Zhcl9yZWNlaXZlKGlycSwgZ3JwX2lkKTsKIAotCQlpZiAobmV0aWZfbXNnX3J4X2Vycihwcml2KSkKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYnVzeSBlcnJvciAocnN0YXQ6ICV4KVxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIGdmYXJfcmVhZCgmcmVncy0+cnN0YXQpKTsKKwkJbmV0aWZfZGJnKHByaXYsIHJ4X2VyciwgZGV2LCAiYnVzeSBlcnJvciAocnN0YXQ6ICV4KVxuIiwKKwkJCSAgZ2Zhcl9yZWFkKCZyZWdzLT5yc3RhdCkpOwogCX0KIAlpZiAoZXZlbnRzICYgSUVWRU5UX0JBQlIpIHsKIAkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJcHJpdi0+ZXh0cmFfc3RhdHMucnhfYmFicisrOwogCi0JCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiYWJibGluZyBSWCBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfZGJnKHByaXYsIHJ4X2VyciwgZGV2LCAiYmFiYmxpbmcgUlggZXJyb3JcbiIpOwogCX0KIAlpZiAoZXZlbnRzICYgSUVWRU5UX0VCRVJSKSB7CiAJCXByaXYtPmV4dHJhX3N0YXRzLmViZXJyKys7Ci0JCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidXMgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCW5ldGlmX2RiZyhwcml2LCByeF9lcnIsIGRldiwgImJ1cyBlcnJvclxuIik7CiAJfQotCWlmICgoZXZlbnRzICYgSUVWRU5UX1JYQykgJiYgbmV0aWZfbXNnX3J4X3N0YXR1cyhwcml2KSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjb250cm9sIGZyYW1lXG4iLCBkZXYtPm5hbWUpOworCWlmIChldmVudHMgJiBJRVZFTlRfUlhDKQorCQluZXRpZl9kYmcocHJpdiwgcnhfc3RhdHVzLCBkZXYsICJjb250cm9sIGZyYW1lXG4iKTsKIAogCWlmIChldmVudHMgJiBJRVZFTlRfQkFCVCkgewogCQlwcml2LT5leHRyYV9zdGF0cy50eF9iYWJ0Kys7Ci0JCWlmIChuZXRpZl9tc2dfdHhfZXJyKHByaXYpKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiYWJibGluZyBUWCBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfZGJnKHByaXYsIHR4X2VyciwgZGV2LCAiYmFiYmxpbmcgVFggZXJyb3JcbiIpOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyLmggYi9kcml2ZXJzL25ldC9naWFuZmFyLmgKaW5kZXggZmM4NmY1MS4uOWFhNDM3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhci5oCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuaApAQCAtOSw3ICs5LDcgQEAKICAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEKICAqIE1vZGlmaWVyOiBTYW5kZWVwIEdvcGFscGV0IDxzYW5kZWVwLmt1bWFyQGZyZWVzY2FsZS5jb20+CiAgKgotICogQ29weXJpZ2h0IDIwMDItMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMDItMjAwOSwgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC00Nyw2ICs0NywxNiBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KIAorc3RydWN0IGV0aHRvb2xfZmxvd19zcGVjX2NvbnRhaW5lciB7CisJc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjIGZzOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBldGh0b29sX3J4X2xpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7Cit9OworCiAvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0byBiZSBoYW5kbGVkIGluIG9uZSBjYWxsIG9mIGdmYXJfcG9sbCAqLwogI2RlZmluZSBHRkFSX0RFVl9XRUlHSFQgNjQKIApAQCAtMTY4LDYgKzE3OCw3IEBACiAjZGVmaW5lIE1BQ0NGRzJfTEVOR1RIQ0hFQ0sJMHgwMDAwMDAxMAogI2RlZmluZSBNQUNDRkcyX01QRU4JCTB4MDAwMDAwMDgKIAorI2RlZmluZSBFQ05UUkxfRklGTQkJMHgwMDAwODAwMAogI2RlZmluZSBFQ05UUkxfSU5JVF9TRVRUSU5HUwkweDAwMDAxMDAwCiAjZGVmaW5lIEVDTlRSTF9UQklfTU9ERSAgICAgICAgIDB4MDAwMDAwMjAKICNkZWZpbmUgRUNOVFJMX1JFRFVDRURfTU9ERQkweDAwMDAwMDEwCkBAIC0yNzEsMTAgKzI4MiwxMSBAQAogI2RlZmluZSBSQ1RSTF9UVUNTRU4JCTB4MDAwMDAxMDAKICNkZWZpbmUgUkNUUkxfUFJTREVQX01BU0sJMHgwMDAwMDBjMAogI2RlZmluZSBSQ1RSTF9QUlNERVBfSU5JVAkweDAwMDAwMGMwCisjZGVmaW5lIFJDVFJMX1BSU0ZNCQkweDAwMDAwMDIwCiAjZGVmaW5lIFJDVFJMX1BST00JCTB4MDAwMDAwMDgKICNkZWZpbmUgUkNUUkxfRU1FTgkJMHgwMDAwMDAwMgogI2RlZmluZSBSQ1RSTF9SRVFfUEFSU0VSCShSQ1RSTF9WTEVYIHwgUkNUUkxfSVBDU0VOIHwgXAotCQkJCSBSQ1RSTF9UVUNTRU4pCisJCQkJIFJDVFJMX1RVQ1NFTiB8IFJDVFJMX0ZJTFJFTikKICNkZWZpbmUgUkNUUkxfQ0hFQ0tTVU1NSU5HCShSQ1RSTF9JUENTRU4gfCBSQ1RSTF9UVUNTRU4gfCBcCiAJCQkJUkNUUkxfUFJTREVQX0lOSVQpCiAjZGVmaW5lIFJDVFJMX0VYVEhBU0gJCShSQ1RSTF9HSFRYKQpAQCAtMzk3LDYgKzQwOSw3IEBACiAjZGVmaW5lIFJRRkNSX0hBU0hUQkxfMgkJMHgwMDA2MDAwMAogI2RlZmluZSBSUUZDUl9IQVNIVEJMXzMJCTB4MDAwODAwMDAKICNkZWZpbmUgUlFGQ1JfSEFTSAkJMHgwMDAxMDAwMAorI2RlZmluZSBSUUZDUl9RVUVVRQkJMHgwMDAwRkMwMAogI2RlZmluZSBSUUZDUl9DTEUJCTB4MDAwMDAyMDAKICNkZWZpbmUgUlFGQ1JfUkpFCQkweDAwMDAwMTAwCiAjZGVmaW5lIFJRRkNSX0FORAkJMHgwMDAwMDA4MApAQCAtMTA2NCw4ICsxMDc3LDkgQEAKIAogCXN0cnVjdCBza19idWZmX2hlYWQgcnhfcmVjeWNsZTsKIAotCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKLQorCS8qIFJYIHF1ZXVlIGZpbGVyIHJ1bGUgc2V0Ki8KKwlzdHJ1Y3QgZXRodG9vbF9yeF9saXN0IHJ4X2xpc3Q7CisJc3RydWN0IG11dGV4IHJ4X3F1ZXVlX2FjY2VzczsKIAogCS8qIEhhc2ggcmVnaXN0ZXJzIGFuZCB0aGVpciB3aWR0aCAqLwogCXUzMiBfX2lvbWVtICpoYXNoX3JlZ3NbMTZdOwpAQCAtMTEwNywxMCArMTEyMSwxMiBAQAogCS8qIEhXIHRpbWUgc3RhbXBpbmcgZW5hYmxlZCBmbGFnICovCiAJaW50IGh3dHNfcnhfZW47CiAJaW50IGh3dHNfdHhfZW47CisKKwkvKkZpbGVyIHRhYmxlKi8KKwl1bnNpZ25lZCBpbnQgZnRwX3JxZnByW01BWF9GSUxFUl9JRFggKyAxXTsKKwl1bnNpZ25lZCBpbnQgZnRwX3JxZmNyW01BWF9GSUxFUl9JRFggKyAxXTsKIH07CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgZnRwX3JxZnByW01BWF9GSUxFUl9JRFggKyAxXTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgZnRwX3JxZmNyW01BWF9GSUxFUl9JRFggKyAxXTsKIAogc3RhdGljIGlubGluZSBpbnQgZ2Zhcl9oYXNfZXJyYXRhKHN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYsCiAJCQkJICBlbnVtIGdmYXJfZXJyYXRhIGVycikKQEAgLTExNDAsNiArMTE1NiwxNiBAQAogCWdmYXJfd3JpdGUoJnJlZ3MtPnJxZnByLCBmcHIpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZ2Zhcl9yZWFkX2ZpbGVyKHN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYsCisJCXVuc2lnbmVkIGludCBmYXIsIHVuc2lnbmVkIGludCAqZmNyLCB1bnNpZ25lZCBpbnQgKmZwcikKK3sKKwlzdHJ1Y3QgZ2ZhciBfX2lvbWVtICpyZWdzID0gcHJpdi0+Z2ZhcmdycFswXS5yZWdzOworCisJZ2Zhcl93cml0ZSgmcmVncy0+cnFmYXIsIGZhcik7CisJKmZjciA9IGdmYXJfcmVhZCgmcmVncy0+cnFmY3IpOworCSpmcHIgPSBnZmFyX3JlYWQoJnJlZ3MtPnJxZnByKTsKK30KKwogZXh0ZXJuIHZvaWQgbG9ja19yeF9xcyhzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KTsKIGV4dGVybiB2b2lkIGxvY2tfdHhfcXMoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdik7CiBleHRlcm4gdm9pZCB1bmxvY2tfcnhfcXMoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdik7CkBAIC0xMTU0LDcgKzExODAsMzcgQEAKIAkJdW5zaWduZWQgbG9uZyB0eF9tYXNrLCB1bnNpZ25lZCBsb25nIHJ4X21hc2spOwogdm9pZCBnZmFyX2luaXRfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBpbnQgZ2Zhcl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKTsKK2V4dGVybiB2b2lkIGdmYXJfY2hlY2tfcnhfcGFyc2VyX21vZGUoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdik7CitleHRlcm4gdm9pZCBnZmFyX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpOwogCiBleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGdmYXJfZXRodG9vbF9vcHM7CiAKKyNkZWZpbmUgTUFYX0ZJTEVSX0NBQ0hFX0lEWCAoMiooTUFYX0ZJTEVSX0lEWCkpCisKKyNkZWZpbmUgUlFGQ1JfUElEX1BSSV9NQVNLIDB4RkZGRkZGRjgKKyNkZWZpbmUgUlFGQ1JfUElEX0w0UF9NQVNLIDB4RkZGRkZGMDAKKyNkZWZpbmUgUlFGQ1JfUElEX1ZJRF9NQVNLIDB4RkZGRkYwMDAKKyNkZWZpbmUgUlFGQ1JfUElEX1BPUlRfTUFTSyAweEZGRkYwMDAwCisjZGVmaW5lIFJRRkNSX1BJRF9NQUNfTUFTSyAweEZGMDAwMDAwCisKK3N0cnVjdCBnZmFyX21hc2tfZW50cnkgeworCXVuc2lnbmVkIGludCBtYXNrOyAvKiBUaGUgbWFzayB2YWx1ZSB3aGljaCBpcyB2YWxpZCBmb3JtIHN0YXJ0IHRvIGVuZCAqLworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgZW5kOworCXVuc2lnbmVkIGludCBibG9jazsgLyogU2FtZSBibG9jayB2YWx1ZXMgaW5kaWNhdGUgZGVwZW5kZWQgZW50cmllcyAqLworfTsKKworLyogUmVwcmVzZW50cyBhIHJlY2VpdmUgZmlsZXIgdGFibGUgZW50cnkgKi8KK3N0cnVjdCBnZmFyX2ZpbGVyX2VudHJ5IHsKKwl1MzIgY3RybDsKKwl1MzIgcHJvcDsKK307CisKKworLyogVGhlIDIwIGFkZGl0aW9uYWwgZW50cmllcyBhcmUgYSBzaGFkb3cgZm9yIG9uZSBleHRyYSBlbGVtZW50ICovCitzdHJ1Y3QgZmlsZXJfdGFibGUgeworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgZ2Zhcl9maWxlcl9lbnRyeSBmZVtNQVhfRklMRVJfQ0FDSEVfSURYICsgMjBdOworfTsKKwogI2VuZGlmIC8qIF9fR0lBTkZBUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfZXRodG9vbC5jCmluZGV4IDQ5M2Q3NDMuLjZlMzUwNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfZXRodG9vbC5jCkBAIC05LDEzICs5LDE1IEBACiAgKiAgTWFpbnRhaW5lcjogS3VtYXIgR2FsYQogICogIE1vZGlmaWVyOiBTYW5kZWVwIEdvcGFscGV0IDxzYW5kZWVwLmt1bWFyQGZyZWVzY2FsZS5jb20+CiAgKgotICogIENvcHlyaWdodCAyMDAzLTIwMDYsIDIwMDgtMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogIENvcHlyaWdodCAyMDAzLTIwMDYsIDIwMDgtMjAwOSwgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgogICoKICAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8KICAqICB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBpbmNvcnBvcmF0ZWQgaGVyZWluCiAgKiAgYnkgcmVmZXJlbmNlLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC0zNyw2ICszOSw4IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAKICNpbmNsdWRlICJnaWFuZmFyLmgiCiAKQEAgLTM3NSwxMyArMzc5LDEzIEBACiAJLyogQ2hlY2sgdGhlIGJvdW5kcyBvZiB0aGUgdmFsdWVzICovCiAJaWYgKGN2YWxzLT5yeF9jb2FsZXNjZV91c2VjcyA+IEdGQVJfTUFYX0NPQUxfVVNFQ1MpIHsKIAkJcHJfaW5mbygiQ29hbGVzY2luZyBpcyBsaW1pdGVkIHRvICVkIG1pY3Jvc2Vjb25kc1xuIiwKLQkJCQlHRkFSX01BWF9DT0FMX1VTRUNTKTsKKwkJCUdGQVJfTUFYX0NPQUxfVVNFQ1MpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoY3ZhbHMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID4gR0ZBUl9NQVhfQ09BTF9GUkFNRVMpIHsKIAkJcHJfaW5mbygiQ29hbGVzY2luZyBpcyBsaW1pdGVkIHRvICVkIGZyYW1lc1xuIiwKLQkJCQlHRkFSX01BWF9DT0FMX0ZSQU1FUyk7CisJCQlHRkFSX01BWF9DT0FMX0ZSQU1FUyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDA0LDEzICs0MDgsMTMgQEAKIAkvKiBDaGVjayB0aGUgYm91bmRzIG9mIHRoZSB2YWx1ZXMgKi8KIAlpZiAoY3ZhbHMtPnR4X2NvYWxlc2NlX3VzZWNzID4gR0ZBUl9NQVhfQ09BTF9VU0VDUykgewogCQlwcl9pbmZvKCJDb2FsZXNjaW5nIGlzIGxpbWl0ZWQgdG8gJWQgbWljcm9zZWNvbmRzXG4iLAotCQkJCUdGQVJfTUFYX0NPQUxfVVNFQ1MpOworCQkJR0ZBUl9NQVhfQ09BTF9VU0VDUyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChjdmFscy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPiBHRkFSX01BWF9DT0FMX0ZSQU1FUykgewogCQlwcl9pbmZvKCJDb2FsZXNjaW5nIGlzIGxpbWl0ZWQgdG8gJWQgZnJhbWVzXG4iLAotCQkJCUdGQVJfTUFYX0NPQUxfRlJBTUVTKTsKKwkJCUdGQVJfTUFYX0NPQUxfRlJBTUVTKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00NjQsOCArNDY4LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIWlzX3Bvd2VyX29mXzIocnZhbHMtPnJ4X3BlbmRpbmcpKSB7Ci0JCXByaW50aygiJXM6IFJpbmcgc2l6ZXMgbXVzdCBiZSBhIHBvd2VyIG9mIDJcbiIsCi0JCQkJZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihkZXYsICJSaW5nIHNpemVzIG11c3QgYmUgYSBwb3dlciBvZiAyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00NzMsOCArNDc2LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIWlzX3Bvd2VyX29mXzIocnZhbHMtPnR4X3BlbmRpbmcpKSB7Ci0JCXByaW50aygiJXM6IFJpbmcgc2l6ZXMgbXVzdCBiZSBhIHBvd2VyIG9mIDJcbiIsCi0JCQkJZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihkZXYsICJSaW5nIHNpemVzIG11c3QgYmUgYSBwb3dlciBvZiAyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01MjQsNiArNTI2LDkgQEAKIAlpbnQgZXJyID0gMCwgaSA9IDA7CiAJdTMyIGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CiAKKwlpZiAoY2hhbmdlZCAmIChORVRJRl9GX0hXX1ZMQU5fVFh8TkVUSUZfRl9IV19WTEFOX1JYKSkKKwkJZ2Zhcl92bGFuX21vZGUoZGV2LCBmZWF0dXJlcyk7CisKIAlpZiAoIShjaGFuZ2VkICYgTkVUSUZfRl9SWENTVU0pKQogCQlyZXR1cm4gMDsKIApAQCAtNjA5LDE1ICs2MTQsMTUgQEAKIAlpZiAoZXRoZmxvdyAmIFJYSF9MMkRBKSB7CiAJCWZjciA9IFJRRkNSX1BJRF9EQUggfFJRRkNSX0NNUF9OT01BVENIIHwKIAkJCVJRRkNSX0hBU0ggfCBSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7Ci0JCWZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKLQkJZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOworCQlwcml2LT5mdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7CisJCXByaXYtPmZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKIAkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBwcml2LT5jdXJfZmlsZXJfaWR4LCBmY3IsIGZwcik7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAogCQlmY3IgPSBSUUZDUl9QSURfREFMIHwgUlFGQ1JfQU5EIHwgUlFGQ1JfQ01QX05PTUFUQ0ggfAogCQkJCVJRRkNSX0hBU0ggfCBSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7Ci0JCWZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKLQkJZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOworCQlwcml2LT5mdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7CisJCXByaXYtPmZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKIAkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBwcml2LT5jdXJfZmlsZXJfaWR4LCBmY3IsIGZwcik7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAl9CkBAIC02MjYsMTYgKzYzMSwxNiBAQAogCQlmY3IgPSBSUUZDUl9QSURfVklEIHwgUlFGQ1JfQ01QX05PTUFUQ0ggfCBSUUZDUl9IQVNIIHwKIAkJCQlSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7CiAJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcHJpdi0+Y3VyX2ZpbGVyX2lkeCwgZmNyLCBmcHIpOwotCQlmdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7Ci0JCWZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKKwkJcHJpdi0+ZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOworCQlwcml2LT5mdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAl9CiAKIAlpZiAoZXRoZmxvdyAmIFJYSF9JUF9TUkMpIHsKIAkJZmNyID0gUlFGQ1JfUElEX1NJQSB8IFJRRkNSX0NNUF9OT01BVENIIHwgUlFGQ1JfSEFTSCB8CiAJCQlSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7Ci0JCWZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKLQkJZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOworCQlwcml2LT5mdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7CisJCXByaXYtPmZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKIAkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBwcml2LT5jdXJfZmlsZXJfaWR4LCBmY3IsIGZwcik7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAl9CkBAIC02NDMsOCArNjQ4LDggQEAKIAlpZiAoZXRoZmxvdyAmIChSWEhfSVBfRFNUKSkgewogCQlmY3IgPSBSUUZDUl9QSURfRElBIHwgUlFGQ1JfQ01QX05PTUFUQ0ggfCBSUUZDUl9IQVNIIHwKIAkJCVJRRkNSX0FORCB8IFJRRkNSX0hBU0hUQkxfMDsKLQkJZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOwotCQlmdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CisJCXByaXYtPmZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKKwkJcHJpdi0+ZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOwogCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIHByaXYtPmN1cl9maWxlcl9pZHgsIGZjciwgZnByKTsKIAkJcHJpdi0+Y3VyX2ZpbGVyX2lkeCA9IHByaXYtPmN1cl9maWxlcl9pZHggLSAxOwogCX0KQEAgLTY1Miw4ICs2NTcsOCBAQAogCWlmIChldGhmbG93ICYgUlhIX0wzX1BST1RPKSB7CiAJCWZjciA9IFJRRkNSX1BJRF9MNFAgfCBSUUZDUl9DTVBfTk9NQVRDSCB8IFJRRkNSX0hBU0ggfAogCQkJUlFGQ1JfQU5EIHwgUlFGQ1JfSEFTSFRCTF8wOwotCQlmdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7Ci0JCWZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKKwkJcHJpdi0+ZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOworCQlwcml2LT5mdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CiAJCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgcHJpdi0+Y3VyX2ZpbGVyX2lkeCwgZmNyLCBmcHIpOwogCQlwcml2LT5jdXJfZmlsZXJfaWR4ID0gcHJpdi0+Y3VyX2ZpbGVyX2lkeCAtIDE7CiAJfQpAQCAtNjYxLDggKzY2Niw4IEBACiAJaWYgKGV0aGZsb3cgJiBSWEhfTDRfQl8wXzEpIHsKIAkJZmNyID0gUlFGQ1JfUElEX1NQVCB8IFJRRkNSX0NNUF9OT01BVENIIHwgUlFGQ1JfSEFTSCB8CiAJCQlSUUZDUl9BTkQgfCBSUUZDUl9IQVNIVEJMXzA7Ci0JCWZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKLQkJZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOworCQlwcml2LT5mdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmcHI7CisJCXByaXYtPmZ0cF9ycWZjcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZjcjsKIAkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBwcml2LT5jdXJfZmlsZXJfaWR4LCBmY3IsIGZwcik7CiAJCXByaXYtPmN1cl9maWxlcl9pZHggPSBwcml2LT5jdXJfZmlsZXJfaWR4IC0gMTsKIAl9CkBAIC02NzAsOCArNjc1LDggQEAKIAlpZiAoZXRoZmxvdyAmIFJYSF9MNF9CXzJfMykgewogCQlmY3IgPSBSUUZDUl9QSURfRFBUIHwgUlFGQ1JfQ01QX05PTUFUQ0ggfCBSUUZDUl9IQVNIIHwKIAkJCVJRRkNSX0FORCB8IFJRRkNSX0hBU0hUQkxfMDsKLQkJZnRwX3JxZnByW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZnByOwotCQlmdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBmY3I7CisJCXByaXYtPmZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGZwcjsKKwkJcHJpdi0+ZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gZmNyOwogCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIHByaXYtPmN1cl9maWxlcl9pZHgsIGZjciwgZnByKTsKIAkJcHJpdi0+Y3VyX2ZpbGVyX2lkeCA9IHByaXYtPmN1cl9maWxlcl9pZHggLSAxOwogCX0KQEAgLTcwMCwyMyArNzA1LDIyIEBACiAJCWNtcF9ycWZwciA9IFJRRlBSX0lQVjYgfFJRRlBSX1VEUDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJSaWdodCBub3cgdGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcHJfZXJyKCJSaWdodCBub3cgdGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9GSUxFUl9JRFggKyAxOyBpKyspIHsKLQkJbG9jYWxfcnFmcHJbal0gPSBmdHBfcnFmcHJbaV07Ci0JCWxvY2FsX3JxZmNyW2pdID0gZnRwX3JxZmNyW2ldOworCQlsb2NhbF9ycWZwcltqXSA9IHByaXYtPmZ0cF9ycWZwcltpXTsKKwkJbG9jYWxfcnFmY3Jbal0gPSBwcml2LT5mdHBfcnFmY3JbaV07CiAJCWotLTsKLQkJaWYgKChmdHBfcnFmY3JbaV0gPT0gKFJRRkNSX1BJRF9QQVJTRSB8CisJCWlmICgocHJpdi0+ZnRwX3JxZmNyW2ldID09IChSUUZDUl9QSURfUEFSU0UgfAogCQkJUlFGQ1JfQ0xFIHxSUUZDUl9BTkQpKSAmJgotCQkJKGZ0cF9ycWZwcltpXSA9PSBjbXBfcnFmcHIpKQorCQkJKHByaXYtPmZ0cF9ycWZwcltpXSA9PSBjbXBfcnFmcHIpKQogCQkJYnJlYWs7CiAJfQogCiAJaWYgKGkgPT0gTUFYX0ZJTEVSX0lEWCArIDEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJObyBwYXJzZSBydWxlIGZvdW5kLCAiKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBjcmVhdGUgaGFzaCBydWxlc1xuIik7CisJCXByX2VycigiTm8gcGFyc2UgcnVsZSBmb3VuZCwgY2FuJ3QgY3JlYXRlIGhhc2ggcnVsZXNcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTcyNCwyMCArNzI4LDIyIEBACiAJICogaWYgaXQgd2FzIGFscmVhZHkgcHJvZ3JhbW1lZCwgd2UgbmVlZCB0byBvdmVyd3JpdGUgdGhlc2UgcnVsZXMKIAkgKi8KIAlmb3IgKGwgPSBpKzE7IGwgPCBNQVhfRklMRVJfSURYOyBsKyspIHsKLQkJaWYgKChmdHBfcnFmY3JbbF0gJiBSUUZDUl9DTEUpICYmCi0JCQkhKGZ0cF9ycWZjcltsXSAmIFJRRkNSX0FORCkpIHsKLQkJCWZ0cF9ycWZjcltsXSA9IFJRRkNSX0NMRSB8IFJRRkNSX0NNUF9FWEFDVCB8CisJCWlmICgocHJpdi0+ZnRwX3JxZmNyW2xdICYgUlFGQ1JfQ0xFKSAmJgorCQkJIShwcml2LT5mdHBfcnFmY3JbbF0gJiBSUUZDUl9BTkQpKSB7CisJCQlwcml2LT5mdHBfcnFmY3JbbF0gPSBSUUZDUl9DTEUgfCBSUUZDUl9DTVBfRVhBQ1QgfAogCQkJCVJRRkNSX0hBU0hUQkxfMCB8IFJRRkNSX1BJRF9NQVNLOwotCQkJZnRwX3JxZnByW2xdID0gRlBSX0ZJTEVSX01BU0s7Ci0JCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIGwsIGZ0cF9ycWZjcltsXSwgZnRwX3JxZnByW2xdKTsKKwkJCXByaXYtPmZ0cF9ycWZwcltsXSA9IEZQUl9GSUxFUl9NQVNLOworCQkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBsLCBwcml2LT5mdHBfcnFmY3JbbF0sCisJCQkJcHJpdi0+ZnRwX3JxZnByW2xdKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKCEoZnRwX3JxZmNyW2xdICYgUlFGQ1JfQ0xFKSAmJiAoZnRwX3JxZmNyW2xdICYgUlFGQ1JfQU5EKSkKKwkJaWYgKCEocHJpdi0+ZnRwX3JxZmNyW2xdICYgUlFGQ1JfQ0xFKSAmJgorCQkJKHByaXYtPmZ0cF9ycWZjcltsXSAmIFJRRkNSX0FORCkpCiAJCQljb250aW51ZTsKIAkJZWxzZSB7Ci0JCQlsb2NhbF9ycWZwcltqXSA9IGZ0cF9ycWZwcltsXTsKLQkJCWxvY2FsX3JxZmNyW2pdID0gZnRwX3JxZmNyW2xdOworCQkJbG9jYWxfcnFmcHJbal0gPSBwcml2LT5mdHBfcnFmcHJbbF07CisJCQlsb2NhbF9ycWZjcltqXSA9IHByaXYtPmZ0cF9ycWZjcltsXTsKIAkJCWotLTsKIAkJfQogCX0KQEAgLTc1MCw4ICs3NTYsOCBAQAogCiAJLyogV3JpdGUgYmFjayB0aGUgcG9wcGVkIG91dCBydWxlcyBhZ2FpbiAqLwogCWZvciAoayA9IGorMTsgayA8IE1BWF9GSUxFUl9JRFg7IGsrKykgewotCQlmdHBfcnFmcHJbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBsb2NhbF9ycWZwcltrXTsKLQkJZnRwX3JxZmNyW3ByaXYtPmN1cl9maWxlcl9pZHhdID0gbG9jYWxfcnFmY3Jba107CisJCXByaXYtPmZ0cF9ycWZwcltwcml2LT5jdXJfZmlsZXJfaWR4XSA9IGxvY2FsX3JxZnByW2tdOworCQlwcml2LT5mdHBfcnFmY3JbcHJpdi0+Y3VyX2ZpbGVyX2lkeF0gPSBsb2NhbF9ycWZjcltrXTsKIAkJZ2Zhcl93cml0ZV9maWxlcihwcml2LCBwcml2LT5jdXJfZmlsZXJfaWR4LAogCQkJCWxvY2FsX3JxZmNyW2tdLCBsb2NhbF9ycWZwcltrXSk7CiAJCWlmICghcHJpdi0+Y3VyX2ZpbGVyX2lkeCkKQEAgLTc3MSwxOSArNzc3LDk0OCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGdmYXJfY2hlY2tfZmlsZXJfaGFyZHdhcmUoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgZ2ZhciBfX2lvbWVtICpyZWdzID0gTlVMTDsKKwl1MzIgaTsKKworCXJlZ3MgPSBwcml2LT5nZmFyZ3JwWzBdLnJlZ3M7CisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgaW4gRklGTyBtb2RlICovCisJaSA9IGdmYXJfcmVhZCgmcmVncy0+ZWNudHJsKTsKKwlpICY9IEVDTlRSTF9GSUZNOworCWlmIChpID09IEVDTlRSTF9GSUZNKSB7CisJCW5ldGRldl9ub3RpY2UocHJpdi0+bmRldiwgIkludGVyZmFjZSBpbiBGSUZPIG1vZGVcbiIpOworCQlpID0gZ2Zhcl9yZWFkKCZyZWdzLT5yY3RybCk7CisJCWkgJj0gUkNUUkxfUFJTREVQX01BU0sgfCBSQ1RSTF9QUlNGTTsKKwkJaWYgKGkgPT0gKFJDVFJMX1BSU0RFUF9NQVNLIHwgUkNUUkxfUFJTRk0pKSB7CisJCQluZXRkZXZfaW5mbyhwcml2LT5uZGV2LAorCQkJCQkiUmVjZWl2ZSBRdWV1ZSBGaWx0ZXJpbmcgZW5hYmxlZFxuIik7CisJCX0gZWxzZSB7CisJCQluZXRkZXZfd2Fybihwcml2LT5uZGV2LAorCQkJCQkiUmVjZWl2ZSBRdWV1ZSBGaWx0ZXJpbmcgZGlzYWJsZWRcbiIpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJfQorCS8qIE9yIGluIHN0YW5kYXJkIG1vZGUgKi8KKwllbHNlIHsKKwkJaSA9IGdmYXJfcmVhZCgmcmVncy0+cmN0cmwpOworCQlpICY9IFJDVFJMX1BSU0RFUF9NQVNLOworCQlpZiAoaSA9PSBSQ1RSTF9QUlNERVBfTUFTSykgeworCQkJbmV0ZGV2X2luZm8ocHJpdi0+bmRldiwKKwkJCQkJIlJlY2VpdmUgUXVldWUgRmlsdGVyaW5nIGVuYWJsZWRcbiIpOworCQl9IGVsc2UgeworCQkJbmV0ZGV2X3dhcm4ocHJpdi0+bmRldiwKKwkJCQkJIlJlY2VpdmUgUXVldWUgRmlsdGVyaW5nIGRpc2FibGVkXG4iKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCX0KKworCS8qIFNldHMgdGhlIHByb3BlcnRpZXMgZm9yIGFyYml0cmFyeSBmaWxlciBydWxlCisJICogdG8gdGhlIGZpcnN0IDQgTGF5ZXIgNCBCeXRlcyAqLworCXJlZ3MtPnJiaWZ4ID0gMHhDMEMxQzJDMzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZmFyX2NvbXBfYXNjKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuIG1lbWNtcChhLCBiLCA0KTsKK30KKworc3RhdGljIGludCBnZmFyX2NvbXBfZGVzYyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCXJldHVybiAtbWVtY21wKGEsIGIsIDQpOworfQorCitzdGF0aWMgdm9pZCBnZmFyX3N3YXAodm9pZCAqYSwgdm9pZCAqYiwgaW50IHNpemUpCit7CisJdTMyICpfYSA9IGE7CisJdTMyICpfYiA9IGI7CisKKwlzd2FwKF9hWzBdLCBfYlswXSk7CisJc3dhcChfYVsxXSwgX2JbMV0pOworCXN3YXAoX2FbMl0sIF9iWzJdKTsKKwlzd2FwKF9hWzNdLCBfYlszXSk7Cit9CisKKy8qIFdyaXRlIGEgbWFzayB0byBmaWxlciBjYWNoZSAqLworc3RhdGljIHZvaWQgZ2Zhcl9zZXRfbWFzayh1MzIgbWFzaywgc3RydWN0IGZpbGVyX3RhYmxlICp0YWIpCit7CisJdGFiLT5mZVt0YWItPmluZGV4XS5jdHJsID0gUlFGQ1JfQU5EIHwgUlFGQ1JfUElEX01BU0sgfCBSUUZDUl9DTVBfRVhBQ1Q7CisJdGFiLT5mZVt0YWItPmluZGV4XS5wcm9wID0gbWFzazsKKwl0YWItPmluZGV4Kys7Cit9CisKKy8qIFNldHMgcGFyc2UgYml0cyAoZS5nLiBJUCBvciBUQ1ApICovCitzdGF0aWMgdm9pZCBnZmFyX3NldF9wYXJzZV9iaXRzKHUzMiB2YWx1ZSwgdTMyIG1hc2ssIHN0cnVjdCBmaWxlcl90YWJsZSAqdGFiKQoreworCWdmYXJfc2V0X21hc2sobWFzaywgdGFiKTsKKwl0YWItPmZlW3RhYi0+aW5kZXhdLmN0cmwgPSBSUUZDUl9DTVBfRVhBQ1QgfCBSUUZDUl9QSURfUEFSU0UKKwkJCXwgUlFGQ1JfQU5EOworCXRhYi0+ZmVbdGFiLT5pbmRleF0ucHJvcCA9IHZhbHVlOworCXRhYi0+aW5kZXgrKzsKK30KKworc3RhdGljIHZvaWQgZ2Zhcl9zZXRfZ2VuZXJhbF9hdHRyaWJ1dGUodTMyIHZhbHVlLCB1MzIgbWFzaywgdTMyIGZsYWcsCisJCXN0cnVjdCBmaWxlcl90YWJsZSAqdGFiKQoreworCWdmYXJfc2V0X21hc2sobWFzaywgdGFiKTsKKwl0YWItPmZlW3RhYi0+aW5kZXhdLmN0cmwgPSBSUUZDUl9DTVBfRVhBQ1QgfCBSUUZDUl9BTkQgfCBmbGFnOworCXRhYi0+ZmVbdGFiLT5pbmRleF0ucHJvcCA9IHZhbHVlOworCXRhYi0+aW5kZXgrKzsKK30KKworLyoKKyAqIEZvciBzZXR0aW5nIGEgdHVwbGUgb2YgdmFsdWUgYW5kIG1hc2sgb2YgdHlwZSBmbGFnCisgKiBFeGFtcGxlOgorICogSVAtU3JjID0gMTAuMC4wLjAvMjU1LjAuMC4wCisgKiB2YWx1ZTogMHgwQTAwMDAwMCBtYXNrOiBGRjAwMDAwMCBmbGFnOiBSUUZQUl9JUFY0CisgKgorICogRXRodG9vbCBnaXZlcyB1cyBhIHZhbHVlPTAgYW5kIG1hc2s9fjAgZm9yIGRvbid0IGNhcmUgYSB0dXBsZQorICogRm9yIGEgZG9uJ3QgY2FyZSBtYXNrIGl0IGdpdmVzIHVzIGEgMAorICoKKyAqIFRoZSBjaGVjayBpZiBkb24ndCBjYXJlIGFuZCB0aGUgbWFzayBhZGp1c3RtZW50IGlmIG1hc2s9MCBpcyBkb25lIGZvciBWTEFOCisgKiBhbmQgTUFDIHN0dWZmIG9uIGFuIHVwcGVyIGxldmVsIChkdWUgdG8gbWlzc2luZyBpbmZvcm1hdGlvbiBvbiB0aGlzIGxldmVsKS4KKyAqIEZvciB0aGVzZSBndXlzIHdlIGNhbiBkaXNjYXJkIHRoZW0gaWYgdGhleSBhcmUgdmFsdWU9MCBhbmQgbWFzaz0wLgorICoKKyAqIEZ1cnRoZXIgdGhlIGFsbCBtYXNrcyBhcmUgb25lLXBhZGRlZCBmb3IgYmV0dGVyIGhhcmR3YXJlIGVmZmljaWVuY3kuCisgKi8KK3N0YXRpYyB2b2lkIGdmYXJfc2V0X2F0dHJpYnV0ZSh1MzIgdmFsdWUsIHUzMiBtYXNrLCB1MzIgZmxhZywKKwkJc3RydWN0IGZpbGVyX3RhYmxlICp0YWIpCit7CisJc3dpdGNoIChmbGFnKSB7CisJCS8qIDNiaXQgKi8KKwljYXNlIFJRRkNSX1BJRF9QUkk6CisJCWlmICghKHZhbHVlIHwgbWFzaykpCisJCQlyZXR1cm47CisJCW1hc2sgfD0gUlFGQ1JfUElEX1BSSV9NQVNLOworCQlicmVhazsKKwkJLyogOGJpdCAqLworCWNhc2UgUlFGQ1JfUElEX0w0UDoKKwljYXNlIFJRRkNSX1BJRF9UT1M6CisJCWlmICghfihtYXNrIHwgUlFGQ1JfUElEX0w0UF9NQVNLKSkKKwkJCXJldHVybjsKKwkJaWYgKCFtYXNrKQorCQkJbWFzayA9IH4wOworCQllbHNlCisJCQltYXNrIHw9IFJRRkNSX1BJRF9MNFBfTUFTSzsKKwkJYnJlYWs7CisJCS8qIDEyYml0ICovCisJY2FzZSBSUUZDUl9QSURfVklEOgorCQlpZiAoISh2YWx1ZSB8IG1hc2spKQorCQkJcmV0dXJuOworCQltYXNrIHw9IFJRRkNSX1BJRF9WSURfTUFTSzsKKwkJYnJlYWs7CisJCS8qIDE2Yml0ICovCisJY2FzZSBSUUZDUl9QSURfRFBUOgorCWNhc2UgUlFGQ1JfUElEX1NQVDoKKwljYXNlIFJRRkNSX1BJRF9FVFk6CisJCWlmICghfihtYXNrIHwgUlFGQ1JfUElEX1BPUlRfTUFTSykpCisJCQlyZXR1cm47CisJCWlmICghbWFzaykKKwkJCW1hc2sgPSB+MDsKKwkJZWxzZQorCQkJbWFzayB8PSBSUUZDUl9QSURfUE9SVF9NQVNLOworCQlicmVhazsKKwkJLyogMjRiaXQgKi8KKwljYXNlIFJRRkNSX1BJRF9EQUg6CisJY2FzZSBSUUZDUl9QSURfREFMOgorCWNhc2UgUlFGQ1JfUElEX1NBSDoKKwljYXNlIFJRRkNSX1BJRF9TQUw6CisJCWlmICghKHZhbHVlIHwgbWFzaykpCisJCQlyZXR1cm47CisJCW1hc2sgfD0gUlFGQ1JfUElEX01BQ19NQVNLOworCQlicmVhazsKKwkJLyogZm9yIGFsbCByZWFsIDMyYml0IG1hc2tzICovCisJZGVmYXVsdDoKKwkJaWYgKCF+bWFzaykKKwkJCXJldHVybjsKKwkJaWYgKCFtYXNrKQorCQkJbWFzayA9IH4wOworCQlicmVhazsKKwl9CisJZ2Zhcl9zZXRfZ2VuZXJhbF9hdHRyaWJ1dGUodmFsdWUsIG1hc2ssIGZsYWcsIHRhYik7Cit9CisKKy8qIFRyYW5zbGF0ZXMgdmFsdWUgYW5kIG1hc2sgZm9yIFVEUCwgVENQIG9yIFNDVFAgKi8KK3N0YXRpYyB2b2lkIGdmYXJfc2V0X2Jhc2ljX2lwKHN0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjICp2YWx1ZSwKKwkJc3RydWN0IGV0aHRvb2xfdGNwaXA0X3NwZWMgKm1hc2ssIHN0cnVjdCBmaWxlcl90YWJsZSAqdGFiKQoreworCWdmYXJfc2V0X2F0dHJpYnV0ZSh2YWx1ZS0+aXA0c3JjLCBtYXNrLT5pcDRzcmMsIFJRRkNSX1BJRF9TSUEsIHRhYik7CisJZ2Zhcl9zZXRfYXR0cmlidXRlKHZhbHVlLT5pcDRkc3QsIG1hc2stPmlwNGRzdCwgUlFGQ1JfUElEX0RJQSwgdGFiKTsKKwlnZmFyX3NldF9hdHRyaWJ1dGUodmFsdWUtPnBkc3QsIG1hc2stPnBkc3QsIFJRRkNSX1BJRF9EUFQsIHRhYik7CisJZ2Zhcl9zZXRfYXR0cmlidXRlKHZhbHVlLT5wc3JjLCBtYXNrLT5wc3JjLCBSUUZDUl9QSURfU1BULCB0YWIpOworCWdmYXJfc2V0X2F0dHJpYnV0ZSh2YWx1ZS0+dG9zLCBtYXNrLT50b3MsIFJRRkNSX1BJRF9UT1MsIHRhYik7Cit9CisKKy8qIFRyYW5zbGF0ZXMgdmFsdWUgYW5kIG1hc2sgZm9yIFJBVy1JUDQgKi8KK3N0YXRpYyB2b2lkIGdmYXJfc2V0X3VzZXJfaXAoc3RydWN0IGV0aHRvb2xfdXNyaXA0X3NwZWMgKnZhbHVlLAorCQlzdHJ1Y3QgZXRodG9vbF91c3JpcDRfc3BlYyAqbWFzaywgc3RydWN0IGZpbGVyX3RhYmxlICp0YWIpCit7CisJZ2Zhcl9zZXRfYXR0cmlidXRlKHZhbHVlLT5pcDRzcmMsIG1hc2stPmlwNHNyYywgUlFGQ1JfUElEX1NJQSwgdGFiKTsKKwlnZmFyX3NldF9hdHRyaWJ1dGUodmFsdWUtPmlwNGRzdCwgbWFzay0+aXA0ZHN0LCBSUUZDUl9QSURfRElBLCB0YWIpOworCWdmYXJfc2V0X2F0dHJpYnV0ZSh2YWx1ZS0+dG9zLCBtYXNrLT50b3MsIFJRRkNSX1BJRF9UT1MsIHRhYik7CisJZ2Zhcl9zZXRfYXR0cmlidXRlKHZhbHVlLT5wcm90bywgbWFzay0+cHJvdG8sIFJRRkNSX1BJRF9MNFAsIHRhYik7CisJZ2Zhcl9zZXRfYXR0cmlidXRlKHZhbHVlLT5sNF80X2J5dGVzLCBtYXNrLT5sNF80X2J5dGVzLCBSUUZDUl9QSURfQVJCLAorCQkJdGFiKTsKKworfQorCisvKiBUcmFuc2xhdGVzIHZhbHVlIGFuZCBtYXNrIGZvciBFVEhFUiBzcGVjICovCitzdGF0aWMgdm9pZCBnZmFyX3NldF9ldGhlcihzdHJ1Y3QgZXRoaGRyICp2YWx1ZSwgc3RydWN0IGV0aGhkciAqbWFzaywKKwkJc3RydWN0IGZpbGVyX3RhYmxlICp0YWIpCit7CisJdTMyIHVwcGVyX3RlbXBfbWFzayA9IDA7CisJdTMyIGxvd2VyX3RlbXBfbWFzayA9IDA7CisJLyogU291cmNlIGFkZHJlc3MgKi8KKwlpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1hc2stPmhfc291cmNlKSkgeworCisJCWlmIChpc196ZXJvX2V0aGVyX2FkZHIobWFzay0+aF9zb3VyY2UpKSB7CisJCQl1cHBlcl90ZW1wX21hc2sgPSAweEZGRkZGRkZGOworCQkJbG93ZXJfdGVtcF9tYXNrID0gMHhGRkZGRkZGRjsKKwkJfSBlbHNlIHsKKwkJCXVwcGVyX3RlbXBfbWFzayA9IG1hc2stPmhfc291cmNlWzBdIDw8IDE2CisJCQkJCXwgbWFzay0+aF9zb3VyY2VbMV0gPDwgOAorCQkJCQl8IG1hc2stPmhfc291cmNlWzJdOworCQkJbG93ZXJfdGVtcF9tYXNrID0gbWFzay0+aF9zb3VyY2VbM10gPDwgMTYKKwkJCQkJfCBtYXNrLT5oX3NvdXJjZVs0XSA8PCA4CisJCQkJCXwgbWFzay0+aF9zb3VyY2VbNV07CisJCX0KKwkJLyogVXBwZXIgMjRiaXQgKi8KKwkJZ2Zhcl9zZXRfYXR0cmlidXRlKAorCQkJCXZhbHVlLT5oX3NvdXJjZVswXSA8PCAxNiB8IHZhbHVlLT5oX3NvdXJjZVsxXQorCQkJCQkJPDwgOCB8IHZhbHVlLT5oX3NvdXJjZVsyXSwKKwkJCQl1cHBlcl90ZW1wX21hc2ssIFJRRkNSX1BJRF9TQUgsIHRhYik7CisJCS8qIEFuZCB0aGUgc2FtZSBmb3IgdGhlIGxvd2VyIHBhcnQgKi8KKwkJZ2Zhcl9zZXRfYXR0cmlidXRlKAorCQkJCXZhbHVlLT5oX3NvdXJjZVszXSA8PCAxNiB8IHZhbHVlLT5oX3NvdXJjZVs0XQorCQkJCQkJPDwgOCB8IHZhbHVlLT5oX3NvdXJjZVs1XSwKKwkJCQlsb3dlcl90ZW1wX21hc2ssIFJRRkNSX1BJRF9TQUwsIHRhYik7CisJfQorCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1hc2stPmhfZGVzdCkpIHsKKworCQkvKiBTcGVjaWFsIGZvciBkZXN0aW5hdGlvbiBpcyBsaW1pdGVkIGJyb2FkY2FzdCAqLworCQlpZiAoKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHZhbHVlLT5oX2Rlc3QpCisJCQkJJiYgaXNfemVyb19ldGhlcl9hZGRyKG1hc2stPmhfZGVzdCkpKSB7CisJCQlnZmFyX3NldF9wYXJzZV9iaXRzKFJRRlBSX0VCQywgUlFGUFJfRUJDLCB0YWIpOworCQl9IGVsc2UgeworCisJCQlpZiAoaXNfemVyb19ldGhlcl9hZGRyKG1hc2stPmhfZGVzdCkpIHsKKwkJCQl1cHBlcl90ZW1wX21hc2sgPSAweEZGRkZGRkZGOworCQkJCWxvd2VyX3RlbXBfbWFzayA9IDB4RkZGRkZGRkY7CisJCQl9IGVsc2UgeworCQkJCXVwcGVyX3RlbXBfbWFzayA9IG1hc2stPmhfZGVzdFswXSA8PCAxNgorCQkJCQkJfCBtYXNrLT5oX2Rlc3RbMV0gPDwgOAorCQkJCQkJfCBtYXNrLT5oX2Rlc3RbMl07CisJCQkJbG93ZXJfdGVtcF9tYXNrID0gbWFzay0+aF9kZXN0WzNdIDw8IDE2CisJCQkJCQl8IG1hc2stPmhfZGVzdFs0XSA8PCA4CisJCQkJCQl8IG1hc2stPmhfZGVzdFs1XTsKKwkJCX0KKworCQkJLyogVXBwZXIgMjRiaXQgKi8KKwkJCWdmYXJfc2V0X2F0dHJpYnV0ZSgKKwkJCQkJdmFsdWUtPmhfZGVzdFswXSA8PCAxNgorCQkJCQkJCXwgdmFsdWUtPmhfZGVzdFsxXSA8PCA4CisJCQkJCQkJfCB2YWx1ZS0+aF9kZXN0WzJdLAorCQkJCQl1cHBlcl90ZW1wX21hc2ssIFJRRkNSX1BJRF9EQUgsIHRhYik7CisJCQkvKiBBbmQgdGhlIHNhbWUgZm9yIHRoZSBsb3dlciBwYXJ0ICovCisJCQlnZmFyX3NldF9hdHRyaWJ1dGUoCisJCQkJCXZhbHVlLT5oX2Rlc3RbM10gPDwgMTYKKwkJCQkJCQl8IHZhbHVlLT5oX2Rlc3RbNF0gPDwgOAorCQkJCQkJCXwgdmFsdWUtPmhfZGVzdFs1XSwKKwkJCQkJbG93ZXJfdGVtcF9tYXNrLCBSUUZDUl9QSURfREFMLCB0YWIpOworCQl9CisJfQorCisJZ2Zhcl9zZXRfYXR0cmlidXRlKHZhbHVlLT5oX3Byb3RvLCBtYXNrLT5oX3Byb3RvLCBSUUZDUl9QSURfRVRZLCB0YWIpOworCit9CisKKy8qIENvbnZlcnQgYSBydWxlIHRvIGJpbmFyeSBmaWx0ZXIgZm9ybWF0IG9mIGdpYW5mYXIgKi8KK3N0YXRpYyBpbnQgZ2Zhcl9jb252ZXJ0X3RvX2ZpbGVyKHN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYyAqcnVsZSwKKwkJc3RydWN0IGZpbGVyX3RhYmxlICp0YWIpCit7CisJdTMyIHZsYW4gPSAwLCB2bGFuX21hc2sgPSAwOworCXUzMiBpZCA9IDAsIGlkX21hc2sgPSAwOworCXUzMiBjZmkgPSAwLCBjZmlfbWFzayA9IDA7CisJdTMyIHByaW8gPSAwLCBwcmlvX21hc2sgPSAwOworCisJdTMyIG9sZF9pbmRleCA9IHRhYi0+aW5kZXg7CisKKwkvKiBDaGVjayBpZiB2bGFuIGlzIHdhbnRlZCAqLworCWlmICgocnVsZS0+Zmxvd190eXBlICYgRkxPV19FWFQpICYmIChydWxlLT5tX2V4dC52bGFuX3RjaSAhPSAweEZGRkYpKSB7CisJCWlmICghcnVsZS0+bV9leHQudmxhbl90Y2kpCisJCQlydWxlLT5tX2V4dC52bGFuX3RjaSA9IDB4RkZGRjsKKworCQl2bGFuID0gUlFGUFJfVkxOOworCQl2bGFuX21hc2sgPSBSUUZQUl9WTE47CisKKwkJLyogU2VwYXJhdGUgdGhlIGZpZWxkcyAqLworCQlpZCA9IHJ1bGUtPmhfZXh0LnZsYW5fdGNpICYgVkxBTl9WSURfTUFTSzsKKwkJaWRfbWFzayA9IHJ1bGUtPm1fZXh0LnZsYW5fdGNpICYgVkxBTl9WSURfTUFTSzsKKwkJY2ZpID0gcnVsZS0+aF9leHQudmxhbl90Y2kgJiBWTEFOX0NGSV9NQVNLOworCQljZmlfbWFzayA9IHJ1bGUtPm1fZXh0LnZsYW5fdGNpICYgVkxBTl9DRklfTUFTSzsKKwkJcHJpbyA9IChydWxlLT5oX2V4dC52bGFuX3RjaSAmIFZMQU5fUFJJT19NQVNLKSA+PiBWTEFOX1BSSU9fU0hJRlQ7CisJCXByaW9fbWFzayA9IChydWxlLT5tX2V4dC52bGFuX3RjaSAmIFZMQU5fUFJJT19NQVNLKSA+PiBWTEFOX1BSSU9fU0hJRlQ7CisKKwkJaWYgKGNmaSA9PSBWTEFOX1RBR19QUkVTRU5UICYmIGNmaV9tYXNrID09IFZMQU5fVEFHX1BSRVNFTlQpIHsKKwkJCXZsYW4gfD0gUlFGUFJfQ0ZJOworCQkJdmxhbl9tYXNrIHw9IFJRRlBSX0NGSTsKKwkJfSBlbHNlIGlmIChjZmkgIT0gVkxBTl9UQUdfUFJFU0VOVCAmJiBjZmlfbWFzayA9PSBWTEFOX1RBR19QUkVTRU5UKSB7CisJCQl2bGFuX21hc2sgfD0gUlFGUFJfQ0ZJOworCQl9CisJfQorCisJc3dpdGNoIChydWxlLT5mbG93X3R5cGUgJiB+RkxPV19FWFQpIHsKKwljYXNlIFRDUF9WNF9GTE9XOgorCQlnZmFyX3NldF9wYXJzZV9iaXRzKFJRRlBSX0lQVjQgfCBSUUZQUl9UQ1AgfCB2bGFuLAorCQkJCVJRRlBSX0lQVjQgfCBSUUZQUl9UQ1AgfCB2bGFuX21hc2ssIHRhYik7CisJCWdmYXJfc2V0X2Jhc2ljX2lwKCZydWxlLT5oX3UudGNwX2lwNF9zcGVjLAorCQkJCSZydWxlLT5tX3UudGNwX2lwNF9zcGVjLCB0YWIpOworCQlicmVhazsKKwljYXNlIFVEUF9WNF9GTE9XOgorCQlnZmFyX3NldF9wYXJzZV9iaXRzKFJRRlBSX0lQVjQgfCBSUUZQUl9VRFAgfCB2bGFuLAorCQkJCVJRRlBSX0lQVjQgfCBSUUZQUl9VRFAgfCB2bGFuX21hc2ssIHRhYik7CisJCWdmYXJfc2V0X2Jhc2ljX2lwKCZydWxlLT5oX3UudWRwX2lwNF9zcGVjLAorCQkJCSZydWxlLT5tX3UudWRwX2lwNF9zcGVjLCB0YWIpOworCQlicmVhazsKKwljYXNlIFNDVFBfVjRfRkxPVzoKKwkJZ2Zhcl9zZXRfcGFyc2VfYml0cyhSUUZQUl9JUFY0IHwgdmxhbiwgUlFGUFJfSVBWNCB8IHZsYW5fbWFzaywKKwkJCQl0YWIpOworCQlnZmFyX3NldF9hdHRyaWJ1dGUoMTMyLCAwLCBSUUZDUl9QSURfTDRQLCB0YWIpOworCQlnZmFyX3NldF9iYXNpY19pcCgoc3RydWN0IGV0aHRvb2xfdGNwaXA0X3NwZWMgKikgJnJ1bGUtPmhfdSwKKwkJCQkoc3RydWN0IGV0aHRvb2xfdGNwaXA0X3NwZWMgKikgJnJ1bGUtPm1fdSwgdGFiKTsKKwkJYnJlYWs7CisJY2FzZSBJUF9VU0VSX0ZMT1c6CisJCWdmYXJfc2V0X3BhcnNlX2JpdHMoUlFGUFJfSVBWNCB8IHZsYW4sIFJRRlBSX0lQVjQgfCB2bGFuX21hc2ssCisJCQkJdGFiKTsKKwkJZ2Zhcl9zZXRfdXNlcl9pcCgoc3RydWN0IGV0aHRvb2xfdXNyaXA0X3NwZWMgKikgJnJ1bGUtPmhfdSwKKwkJCQkoc3RydWN0IGV0aHRvb2xfdXNyaXA0X3NwZWMgKikgJnJ1bGUtPm1fdSwgdGFiKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhFUl9GTE9XOgorCQlpZiAodmxhbikKKwkJCWdmYXJfc2V0X3BhcnNlX2JpdHModmxhbiwgdmxhbl9tYXNrLCB0YWIpOworCQlnZmFyX3NldF9ldGhlcigoc3RydWN0IGV0aGhkciAqKSAmcnVsZS0+aF91LAorCQkJCShzdHJ1Y3QgZXRoaGRyICopICZydWxlLT5tX3UsIHRhYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBTZXQgdGhlIHZsYW4gYXR0cmlidXRlcyBpbiB0aGUgZW5kICovCisJaWYgKHZsYW4pIHsKKwkJZ2Zhcl9zZXRfYXR0cmlidXRlKGlkLCBpZF9tYXNrLCBSUUZDUl9QSURfVklELCB0YWIpOworCQlnZmFyX3NldF9hdHRyaWJ1dGUocHJpbywgcHJpb19tYXNrLCBSUUZDUl9QSURfUFJJLCB0YWIpOworCX0KKworCS8qIElmIHRoZXJlIGhhcyBiZWVuIG5vdGhpbmcgd3JpdHRlbiB0aWxsIG5vdywgaXQgbXVzdCBiZSBhIGRlZmF1bHQgKi8KKwlpZiAodGFiLT5pbmRleCA9PSBvbGRfaW5kZXgpIHsKKwkJZ2Zhcl9zZXRfbWFzaygweEZGRkZGRkZGLCB0YWIpOworCQl0YWItPmZlW3RhYi0+aW5kZXhdLmN0cmwgPSAweDIwOworCQl0YWItPmZlW3RhYi0+aW5kZXhdLnByb3AgPSAweDA7CisJCXRhYi0+aW5kZXgrKzsKKwl9CisKKwkvKiBSZW1vdmUgbGFzdCBBTkQgKi8KKwl0YWItPmZlW3RhYi0+aW5kZXggLSAxXS5jdHJsICY9ICh+UlFGQ1JfQU5EKTsKKworCS8qIFNwZWNpZnkgd2hpY2ggcXVldWUgdG8gdXNlIG9yIHRvIGRyb3AgKi8KKwlpZiAocnVsZS0+cmluZ19jb29raWUgPT0gUlhfQ0xTX0ZMT1dfRElTQykKKwkJdGFiLT5mZVt0YWItPmluZGV4IC0gMV0uY3RybCB8PSBSUUZDUl9SSkU7CisJZWxzZQorCQl0YWItPmZlW3RhYi0+aW5kZXggLSAxXS5jdHJsIHw9IChydWxlLT5yaW5nX2Nvb2tpZSA8PCAxMCk7CisKKwkvKiBPbmx5IGJpZyBlbm91Z2ggZW50cmllcyBjYW4gYmUgY2x1c3RlcmVkICovCisJaWYgKHRhYi0+aW5kZXggPiAob2xkX2luZGV4ICsgMikpIHsKKwkJdGFiLT5mZVtvbGRfaW5kZXggKyAxXS5jdHJsIHw9IFJRRkNSX0NMRTsKKwkJdGFiLT5mZVt0YWItPmluZGV4IC0gMV0uY3RybCB8PSBSUUZDUl9DTEU7CisJfQorCisJLyogSW4gcmFyZSBjYXNlcyB0aGUgY2FjaGUgY2FuIGJlIGZ1bGwgd2hpbGUgdGhlcmUgaXMgZnJlZSBzcGFjZSBpbiBodyAqLworCWlmICh0YWItPmluZGV4ID4gTUFYX0ZJTEVSX0NBQ0hFX0lEWCAtIDEpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ29weSBzaXplIGZpbGVyIGVudHJpZXMgKi8KK3N0YXRpYyB2b2lkIGdmYXJfY29weV9maWxlcl9lbnRyaWVzKHN0cnVjdCBnZmFyX2ZpbGVyX2VudHJ5IGRzdFswXSwKKwkJc3RydWN0IGdmYXJfZmlsZXJfZW50cnkgc3JjWzBdLCBzMzIgc2l6ZSkKK3sKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJc2l6ZS0tOworCQlkc3Rbc2l6ZV0uY3RybCA9IHNyY1tzaXplXS5jdHJsOworCQlkc3Rbc2l6ZV0ucHJvcCA9IHNyY1tzaXplXS5wcm9wOworCX0KK30KKworLyogRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZXItdGFibGUgYmV0d2VlbiBzdGFydCBhbmQgZW5kCisgKiBhbmQgY29sbGFwc2UgdGhlbSAqLworc3RhdGljIGludCBnZmFyX3RyaW1fZmlsZXJfZW50cmllcyh1MzIgYmVnaW4sIHUzMiBlbmQsIHN0cnVjdCBmaWxlcl90YWJsZSAqdGFiKQoreworCWludCBsZW5ndGg7CisJaWYgKGVuZCA+IE1BWF9GSUxFUl9DQUNIRV9JRFggfHwgZW5kIDwgYmVnaW4pCisJCXJldHVybiAtRUlOVkFMOworCisJZW5kKys7CisJbGVuZ3RoID0gZW5kIC0gYmVnaW47CisKKwkvKiBDb3B5ICovCisJd2hpbGUgKGVuZCA8IHRhYi0+aW5kZXgpIHsKKwkJdGFiLT5mZVtiZWdpbl0uY3RybCA9IHRhYi0+ZmVbZW5kXS5jdHJsOworCQl0YWItPmZlW2JlZ2luKytdLnByb3AgPSB0YWItPmZlW2VuZCsrXS5wcm9wOworCisJfQorCS8qIEZpbGwgdXAgd2l0aCBkb24ndCBjYXJlcyAqLworCXdoaWxlIChiZWdpbiA8IHRhYi0+aW5kZXgpIHsKKwkJdGFiLT5mZVtiZWdpbl0uY3RybCA9IDB4NjA7CisJCXRhYi0+ZmVbYmVnaW5dLnByb3AgPSAweEZGRkZGRkZGOworCQliZWdpbisrOworCX0KKworCXRhYi0+aW5kZXggLT0gbGVuZ3RoOworCXJldHVybiAwOworfQorCisvKiBNYWtlIHNwYWNlIG9uIHRoZSB3YW50ZWQgbG9jYXRpb24gKi8KK3N0YXRpYyBpbnQgZ2Zhcl9leHBhbmRfZmlsZXJfZW50cmllcyh1MzIgYmVnaW4sIHUzMiBsZW5ndGgsCisJCXN0cnVjdCBmaWxlcl90YWJsZSAqdGFiKQoreworCWlmIChsZW5ndGggPT0gMCB8fCBsZW5ndGggKyB0YWItPmluZGV4ID4gTUFYX0ZJTEVSX0NBQ0hFX0lEWCB8fCBiZWdpbgorCQkJPiBNQVhfRklMRVJfQ0FDSEVfSURYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdmYXJfY29weV9maWxlcl9lbnRyaWVzKCYodGFiLT5mZVtiZWdpbiArIGxlbmd0aF0pLCAmKHRhYi0+ZmVbYmVnaW5dKSwKKwkJCXRhYi0+aW5kZXggLSBsZW5ndGggKyAxKTsKKworCXRhYi0+aW5kZXggKz0gbGVuZ3RoOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdmYXJfZ2V0X25leHRfY2x1c3Rlcl9zdGFydChpbnQgc3RhcnQsIHN0cnVjdCBmaWxlcl90YWJsZSAqdGFiKQoreworCWZvciAoOyAoc3RhcnQgPCB0YWItPmluZGV4KSAmJiAoc3RhcnQgPCBNQVhfRklMRVJfQ0FDSEVfSURYIC0gMSk7IHN0YXJ0KyspIHsKKwkJaWYgKCh0YWItPmZlW3N0YXJ0XS5jdHJsICYgKFJRRkNSX0FORCB8IFJRRkNSX0NMRSkpCisJCQkJPT0gKFJRRkNSX0FORCB8IFJRRkNSX0NMRSkpCisJCQlyZXR1cm4gc3RhcnQ7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBnZmFyX2dldF9uZXh0X2NsdXN0ZXJfZW5kKGludCBzdGFydCwgc3RydWN0IGZpbGVyX3RhYmxlICp0YWIpCit7CisJZm9yICg7IChzdGFydCA8IHRhYi0+aW5kZXgpICYmIChzdGFydCA8IE1BWF9GSUxFUl9DQUNIRV9JRFggLSAxKTsgc3RhcnQrKykgeworCQlpZiAoKHRhYi0+ZmVbc3RhcnRdLmN0cmwgJiAoUlFGQ1JfQU5EIHwgUlFGQ1JfQ0xFKSkKKwkJCQk9PSAoUlFGQ1JfQ0xFKSkKKwkJCXJldHVybiBzdGFydDsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICogVXNlcyBoYXJkd2FyZXMgY2x1c3RlcmluZyBvcHRpb24gdG8gcmVkdWNlCisgKiB0aGUgbnVtYmVyIG9mIGZpbGVyIHRhYmxlIGVudHJpZXMKKyAqLworc3RhdGljIHZvaWQgZ2Zhcl9jbHVzdGVyX2ZpbGVyKHN0cnVjdCBmaWxlcl90YWJsZSAqdGFiKQoreworCXMzMiBpID0gLTEsIGosIGllbmQsIGplbmQ7CisKKwl3aGlsZSAoKGkgPSBnZmFyX2dldF9uZXh0X2NsdXN0ZXJfc3RhcnQoKytpLCB0YWIpKSAhPSAtMSkgeworCQlqID0gaTsKKwkJd2hpbGUgKChqID0gZ2Zhcl9nZXRfbmV4dF9jbHVzdGVyX3N0YXJ0KCsraiwgdGFiKSkgIT0gLTEpIHsKKwkJCS8qCisJCQkgKiBUaGUgY2x1c3RlciBlbnRyaWVzIHNlbGYgYW5kIHRoZSBwcmV2aW91cyBvbmUKKwkJCSAqIChhIG1hc2spIG11c3QgYmUgaWRlbnRpY2FsIQorCQkJICovCisJCQlpZiAodGFiLT5mZVtpXS5jdHJsICE9IHRhYi0+ZmVbal0uY3RybCkKKwkJCQlicmVhazsKKwkJCWlmICh0YWItPmZlW2ldLnByb3AgIT0gdGFiLT5mZVtqXS5wcm9wKQorCQkJCWJyZWFrOworCQkJaWYgKHRhYi0+ZmVbaSAtIDFdLmN0cmwgIT0gdGFiLT5mZVtqIC0gMV0uY3RybCkKKwkJCQlicmVhazsKKwkJCWlmICh0YWItPmZlW2kgLSAxXS5wcm9wICE9IHRhYi0+ZmVbaiAtIDFdLnByb3ApCisJCQkJYnJlYWs7CisJCQlpZW5kID0gZ2Zhcl9nZXRfbmV4dF9jbHVzdGVyX2VuZChpLCB0YWIpOworCQkJamVuZCA9IGdmYXJfZ2V0X25leHRfY2x1c3Rlcl9lbmQoaiwgdGFiKTsKKwkJCWlmIChqZW5kID09IC0xIHx8IGllbmQgPT0gLTEpCisJCQkJYnJlYWs7CisJCQkvKgorCQkJICogRmlyc3Qgd2UgbWFrZSBzb21lIGZyZWUgc3BhY2UsIHdoZXJlIG91ciBjbHVzdGVyCisJCQkgKiBlbGVtZW50IHNob3VsZCBiZS4gVGhlbiB3ZSBjb3B5IGl0IHRoZXJlIGFuZCBmaW5hbGx5CisJCQkgKiBkZWxldGUgaW4gZnJvbSBpdHMgb2xkIGxvY2F0aW9uLgorCQkJICovCisKKwkJCWlmIChnZmFyX2V4cGFuZF9maWxlcl9lbnRyaWVzKGllbmQsIChqZW5kIC0gaiksIHRhYikKKwkJCQkJPT0gLUVJTlZBTCkKKwkJCQlicmVhazsKKworCQkJZ2Zhcl9jb3B5X2ZpbGVyX2VudHJpZXMoJih0YWItPmZlW2llbmQgKyAxXSksCisJCQkJCSYodGFiLT5mZVtqZW5kICsgMV0pLCBqZW5kIC0gaik7CisKKwkJCWlmIChnZmFyX3RyaW1fZmlsZXJfZW50cmllcyhqZW5kIC0gMSwKKwkJCQkJamVuZCArIChqZW5kIC0gaiksIHRhYikgPT0gLUVJTlZBTCkKKwkJCQlyZXR1cm47CisKKwkJCS8qIE1hc2sgb3V0IGNsdXN0ZXIgYml0ICovCisJCQl0YWItPmZlW2llbmRdLmN0cmwgJj0gfihSUUZDUl9DTEUpOworCQl9CisJfQorfQorCisvKiBTd2FwcyB0aGUgbWFza2VkIGJpdHMgb2YgYTE8PmEyIGFuZCBiMTw+YjIgKi8KK3N0YXRpYyB2b2lkIGdmYXJfc3dhcF9iaXRzKHN0cnVjdCBnZmFyX2ZpbGVyX2VudHJ5ICphMSwKKwkJc3RydWN0IGdmYXJfZmlsZXJfZW50cnkgKmEyLCBzdHJ1Y3QgZ2Zhcl9maWxlcl9lbnRyeSAqYjEsCisJCXN0cnVjdCBnZmFyX2ZpbGVyX2VudHJ5ICpiMiwgdTMyIG1hc2spCit7CisJdTMyIHRlbXBbNF07CisJdGVtcFswXSA9IGExLT5jdHJsICYgbWFzazsKKwl0ZW1wWzFdID0gYTItPmN0cmwgJiBtYXNrOworCXRlbXBbMl0gPSBiMS0+Y3RybCAmIG1hc2s7CisJdGVtcFszXSA9IGIyLT5jdHJsICYgbWFzazsKKworCWExLT5jdHJsICY9IH5tYXNrOworCWEyLT5jdHJsICY9IH5tYXNrOworCWIxLT5jdHJsICY9IH5tYXNrOworCWIyLT5jdHJsICY9IH5tYXNrOworCisJYTEtPmN0cmwgfD0gdGVtcFsxXTsKKwlhMi0+Y3RybCB8PSB0ZW1wWzBdOworCWIxLT5jdHJsIHw9IHRlbXBbM107CisJYjItPmN0cmwgfD0gdGVtcFsyXTsKK30KKworLyoKKyAqIEdlbmVyYXRlIGEgbGlzdCBjb25zaXN0aW5nIG9mIG1hc2tzIHZhbHVlcyB3aXRoIHRoZWlyIHN0YXJ0IGFuZAorICogZW5kIG9mIHZhbGlkaXR5IGFuZCBibG9jayBhcyBpbmRpY2F0b3IgZm9yIHBhcnRzIGJlbG9uZ2luZworICogdG9nZXRoZXIgKGdsdWVkIGJ5IEFORHMpIGluIG1hc2tfdGFibGUKKyAqLworc3RhdGljIHUzMiBnZmFyX2dlbmVyYXRlX21hc2tfdGFibGUoc3RydWN0IGdmYXJfbWFza19lbnRyeSAqbWFza190YWJsZSwKKwkJc3RydWN0IGZpbGVyX3RhYmxlICp0YWIpCit7CisJdTMyIGksIGFuZF9pbmRleCA9IDAsIGJsb2NrX2luZGV4ID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCB0YWItPmluZGV4OyBpKyspIHsKKworCQkvKiBMU0J5dGUgb2YgY29udHJvbCA9IDAgc2V0cyBhIG1hc2sgKi8KKwkJaWYgKCEodGFiLT5mZVtpXS5jdHJsICYgMHhGKSkgeworCQkJbWFza190YWJsZVthbmRfaW5kZXhdLm1hc2sgPSB0YWItPmZlW2ldLnByb3A7CisJCQltYXNrX3RhYmxlW2FuZF9pbmRleF0uc3RhcnQgPSBpOworCQkJbWFza190YWJsZVthbmRfaW5kZXhdLmJsb2NrID0gYmxvY2tfaW5kZXg7CisJCQlpZiAoYW5kX2luZGV4ID49IDEpCisJCQkJbWFza190YWJsZVthbmRfaW5kZXggLSAxXS5lbmQgPSBpIC0gMTsKKwkJCWFuZF9pbmRleCsrOworCQl9CisJCS8qIGNsdXN0ZXIgc3RhcnRzIGFuZCBlbmRzIHdpbGwgYmUgc2VwYXJhdGVkIGJlY2F1c2UgdGhleSBzaG91bGQKKwkJICogaG9sZCB0aGVpciBwb3NpdGlvbiAqLworCQlpZiAodGFiLT5mZVtpXS5jdHJsICYgUlFGQ1JfQ0xFKQorCQkJYmxvY2tfaW5kZXgrKzsKKwkJLyogQSBub3Qgc2V0IEFORCBpbmRpY2F0ZXMgdGhlIGVuZCBvZiBhIGRlcGVuZGVkIGJsb2NrICovCisJCWlmICghKHRhYi0+ZmVbaV0uY3RybCAmIFJRRkNSX0FORCkpCisJCQlibG9ja19pbmRleCsrOworCisJfQorCisJbWFza190YWJsZVthbmRfaW5kZXggLSAxXS5lbmQgPSBpIC0gMTsKKworCXJldHVybiBhbmRfaW5kZXg7Cit9CisKKy8qCisgKiBTb3J0cyB0aGUgZW50cmllcyBvZiBtYXNrX3RhYmxlIGJ5IHRoZSB2YWx1ZXMgb2YgdGhlIG1hc2tzLgorICogSW1wb3J0YW50OiBUaGUgMHhGRjgwIGZsYWdzIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBlbnRyeSBvZiBhCisgKiBibG9jayBtdXN0IGhvbGQgdGhlaXIgcG9zaXRpb24gKHdoaWNoIHF1ZXVlLCBDTHVzdGVyRW5hYmxlLCBSZUpFY3QsCisgKiBBTkQpCisgKi8KK3N0YXRpYyB2b2lkIGdmYXJfc29ydF9tYXNrX3RhYmxlKHN0cnVjdCBnZmFyX21hc2tfZW50cnkgKm1hc2tfdGFibGUsCisJCXN0cnVjdCBmaWxlcl90YWJsZSAqdGVtcF90YWJsZSwgdTMyIGFuZF9pbmRleCkKK3sKKwkvKiBQb2ludGVyIHRvIGNvbXBhcmUgZnVuY3Rpb24gKF9hc2Mgb3IgX2Rlc2MpICovCisJaW50ICgqZ2Zhcl9jb21wKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CisKKwl1MzIgaSwgc2l6ZSA9IDAsIHN0YXJ0ID0gMCwgcHJldiA9IDE7CisJdTMyIG9sZF9maXJzdCwgb2xkX2xhc3QsIG5ld19maXJzdCwgbmV3X2xhc3Q7CisKKwlnZmFyX2NvbXAgPSAmZ2Zhcl9jb21wX2Rlc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgYW5kX2luZGV4OyBpKyspIHsKKworCQlpZiAocHJldiAhPSBtYXNrX3RhYmxlW2ldLmJsb2NrKSB7CisJCQlvbGRfZmlyc3QgPSBtYXNrX3RhYmxlW3N0YXJ0XS5zdGFydCArIDE7CisJCQlvbGRfbGFzdCA9IG1hc2tfdGFibGVbaSAtIDFdLmVuZDsKKwkJCXNvcnQobWFza190YWJsZSArIHN0YXJ0LCBzaXplLAorCQkJCQlzaXplb2Yoc3RydWN0IGdmYXJfbWFza19lbnRyeSksCisJCQkJCWdmYXJfY29tcCwgJmdmYXJfc3dhcCk7CisKKwkJCS8qIFRvZ2dsZSBvcmRlciBmb3IgZXZlcnkgYmxvY2suIFRoaXMgbWFrZXMgdGhlCisJCQkgKiB0aGluZyBtb3JlIGVmZmljaWVudCEgKi8KKwkJCWlmIChnZmFyX2NvbXAgPT0gZ2Zhcl9jb21wX2Rlc2MpCisJCQkJZ2Zhcl9jb21wID0gJmdmYXJfY29tcF9hc2M7CisJCQllbHNlCisJCQkJZ2Zhcl9jb21wID0gJmdmYXJfY29tcF9kZXNjOworCisJCQluZXdfZmlyc3QgPSBtYXNrX3RhYmxlW3N0YXJ0XS5zdGFydCArIDE7CisJCQluZXdfbGFzdCA9IG1hc2tfdGFibGVbaSAtIDFdLmVuZDsKKworCQkJZ2Zhcl9zd2FwX2JpdHMoJnRlbXBfdGFibGUtPmZlW25ld19maXJzdF0sCisJCQkJCSZ0ZW1wX3RhYmxlLT5mZVtvbGRfZmlyc3RdLAorCQkJCQkmdGVtcF90YWJsZS0+ZmVbbmV3X2xhc3RdLAorCQkJCQkmdGVtcF90YWJsZS0+ZmVbb2xkX2xhc3RdLAorCQkJCQlSUUZDUl9RVUVVRSB8IFJRRkNSX0NMRSB8CisJCQkJCQlSUUZDUl9SSkUgfCBSUUZDUl9BTkQKKwkJCQkJKTsKKworCQkJc3RhcnQgPSBpOworCQkJc2l6ZSA9IDA7CisJCX0KKwkJc2l6ZSsrOworCQlwcmV2ID0gbWFza190YWJsZVtpXS5ibG9jazsKKwl9CisKK30KKworLyoKKyAqIFJlZHVjZXMgdGhlIG51bWJlciBvZiBtYXNrcyBuZWVkZWQgaW4gdGhlIGZpbGVyIHRhYmxlIHRvIHNhdmUgZW50cmllcworICogVGhpcyBpcyBkb25lIGJ5IHNvcnRpbmcgdGhlIG1hc2tzIG9mIGEgZGVwZW5kZWQgYmxvY2suIEEgZGVwZW5kZWQgYmxvY2sgaXMKKyAqIGlkZW50aWZpZWQgYnkgZ2x1aW5nIEFORHMgb3IgQ0xFLiBUaGUgc29ydGluZyBvcmRlciB0b2dnbGVzIGFmdGVyIGV2ZXJ5CisgKiBibG9jay4gT2YgY291cnNlIGVudHJpZXMgaW4gc2NvcGUgb2YgYSBtYXNrIG11c3QgY2hhbmdlIHRoZWlyIGxvY2F0aW9uIHdpdGgKKyAqIGl0LgorICovCitzdGF0aWMgaW50IGdmYXJfb3B0aW1pemVfZmlsZXJfbWFza3Moc3RydWN0IGZpbGVyX3RhYmxlICp0YWIpCit7CisJc3RydWN0IGZpbGVyX3RhYmxlICp0ZW1wX3RhYmxlOworCXN0cnVjdCBnZmFyX21hc2tfZW50cnkgKm1hc2tfdGFibGU7CisKKwl1MzIgYW5kX2luZGV4ID0gMCwgcHJldmlvdXNfbWFzayA9IDAsIGkgPSAwLCBqID0gMCwgc2l6ZSA9IDA7CisJczMyIHJldCA9IDA7CisKKwkvKiBXZSBuZWVkIGEgY29weSBvZiB0aGUgZmlsZXIgdGFibGUgYmVjYXVzZQorCSAqIHdlIHdhbnQgdG8gY2hhbmdlIGl0cyBvcmRlciAqLworCXRlbXBfdGFibGUgPSBrbWFsbG9jKHNpemVvZigqdGVtcF90YWJsZSksIEdGUF9LRVJORUwpOworCWlmICh0ZW1wX3RhYmxlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweSh0ZW1wX3RhYmxlLCB0YWIsIHNpemVvZigqdGVtcF90YWJsZSkpOworCisJbWFza190YWJsZSA9IGtjYWxsb2MoTUFYX0ZJTEVSX0NBQ0hFX0lEWCAvIDIgKyAxLAorCQkJc2l6ZW9mKHN0cnVjdCBnZmFyX21hc2tfZW50cnkpLCBHRlBfS0VSTkVMKTsKKworCWlmIChtYXNrX3RhYmxlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlbmQ7CisJfQorCisJYW5kX2luZGV4ID0gZ2Zhcl9nZW5lcmF0ZV9tYXNrX3RhYmxlKG1hc2tfdGFibGUsIHRhYik7CisKKwlnZmFyX3NvcnRfbWFza190YWJsZShtYXNrX3RhYmxlLCB0ZW1wX3RhYmxlLCBhbmRfaW5kZXgpOworCisJLyogTm93IHdlIGNhbiBjb3B5IHRoZSBkYXRhIGZyb20gb3VyIGR1cGxpY2F0ZWQgZmlsZXIgdGFibGUgdG8KKwkgKiB0aGUgcmVhbCBvbmUgaW4gdGhlIG9yZGVyIHRoZSBtYXNrIHRhYmxlIHNheXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYW5kX2luZGV4OyBpKyspIHsKKwkJc2l6ZSA9IG1hc2tfdGFibGVbaV0uZW5kIC0gbWFza190YWJsZVtpXS5zdGFydCArIDE7CisJCWdmYXJfY29weV9maWxlcl9lbnRyaWVzKCYodGFiLT5mZVtqXSksCisJCQkJJih0ZW1wX3RhYmxlLT5mZVttYXNrX3RhYmxlW2ldLnN0YXJ0XSksIHNpemUpOworCQlqICs9IHNpemU7CisJfQorCisJLyogQW5kIGZpbmFsbHkgd2UganVzdCBoYXZlIHRvIGNoZWNrIGZvciBkdXBsaWNhdGVkIG1hc2tzIGFuZCBkcm9wIHRoZQorCSAqIHNlY29uZCBvbmVzICovCisJZm9yIChpID0gMDsgaSA8IHRhYi0+aW5kZXggJiYgaSA8IE1BWF9GSUxFUl9DQUNIRV9JRFg7IGkrKykgeworCQlpZiAodGFiLT5mZVtpXS5jdHJsID09IDB4ODApIHsKKwkJCXByZXZpb3VzX21hc2sgPSBpKys7CisJCQlicmVhazsKKwkJfQorCX0KKwlmb3IgKDsgaSA8IHRhYi0+aW5kZXggJiYgaSA8IE1BWF9GSUxFUl9DQUNIRV9JRFg7IGkrKykgeworCQlpZiAodGFiLT5mZVtpXS5jdHJsID09IDB4ODApIHsKKwkJCWlmICh0YWItPmZlW2ldLnByb3AgPT0gdGFiLT5mZVtwcmV2aW91c19tYXNrXS5wcm9wKSB7CisJCQkJLyogVHdvIGlkZW50aWNhbCBvbmVzIGZvdW5kIQorCQkJCSAqIFNvIGRyb3AgdGhlIHNlY29uZCBvbmUhICovCisJCQkJZ2Zhcl90cmltX2ZpbGVyX2VudHJpZXMoaSwgaSwgdGFiKTsKKwkJCX0gZWxzZQorCQkJCS8qIE5vdCBpZGVudGljYWwhICovCisJCQkJcHJldmlvdXNfbWFzayA9IGk7CisJCX0KKwl9CisKKwlrZnJlZShtYXNrX3RhYmxlKTsKK2VuZDoJa2ZyZWUodGVtcF90YWJsZSk7CisJcmV0dXJuIHJldDsKK30KKworLyogV3JpdGUgdGhlIGJpdC1wYXR0ZXJuIGZyb20gc29mdHdhcmUncyBidWZmZXIgdG8gaGFyZHdhcmUgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IGdmYXJfd3JpdGVfZmlsZXJfdGFibGUoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiwKKwkJc3RydWN0IGZpbGVyX3RhYmxlICp0YWIpCit7CisJdTMyIGkgPSAwOworCWlmICh0YWItPmluZGV4ID4gTUFYX0ZJTEVSX0lEWCAtIDEpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBBdm9pZCBpbmNvbnNpc3RlbnQgZmlsZXIgdGFibGUgdG8gYmUgcHJvY2Vzc2VkICovCisJbG9ja19yeF9xcyhwcml2KTsKKworCS8qIEZpbGwgcmVndWxhciBlbnRyaWVzICovCisJZm9yICg7IGkgPCBNQVhfRklMRVJfSURYIC0gMSAmJiAodGFiLT5mZVtpXS5jdHJsIHwgdGFiLT5mZVtpXS5jdHJsKTsgaSsrKQorCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIGksIHRhYi0+ZmVbaV0uY3RybCwgdGFiLT5mZVtpXS5wcm9wKTsKKwkvKiBGaWxsIHRoZSByZXN0IHdpdGggZmFsbC10cm91Z2hzICovCisJZm9yICg7IGkgPCBNQVhfRklMRVJfSURYIC0gMTsgaSsrKQorCQlnZmFyX3dyaXRlX2ZpbGVyKHByaXYsIGksIDB4NjAsIDB4RkZGRkZGRkYpOworCS8qIExhc3QgZW50cnkgbXVzdCBiZSBkZWZhdWx0IGFjY2VwdAorCSAqIGJlY2F1c2UgdGhhdCdzIHdoYXQgcGVvcGxlIGV4cGVjdCAqLworCWdmYXJfd3JpdGVfZmlsZXIocHJpdiwgaSwgMHgyMCwgMHgwKTsKKworCXVubG9ja19yeF9xcyhwcml2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdmYXJfY2hlY2tfY2FwYWJpbGl0eShzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKmZsb3csCisJCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYpCit7CisKKwlpZiAoZmxvdy0+Zmxvd190eXBlICYgRkxPV19FWFQpCXsKKwkJaWYgKH5mbG93LT5tX2V4dC5kYXRhWzBdIHx8IH5mbG93LT5tX2V4dC5kYXRhWzFdKQorCQkJbmV0ZGV2X3dhcm4ocHJpdi0+bmRldiwKKwkJCQkJIlVzZXItc3BlY2lmaWMgZGF0YSBub3Qgc3VwcG9ydGVkIVxuIik7CisJCWlmICh+Zmxvdy0+bV9leHQudmxhbl9ldHlwZSkKKwkJCW5ldGRldl93YXJuKHByaXYtPm5kZXYsCisJCQkJCSJWTEFOLWV0eXBlIG5vdCBzdXBwb3J0ZWQhXG4iKTsKKwl9CisJaWYgKGZsb3ctPmZsb3dfdHlwZSA9PSBJUF9VU0VSX0ZMT1cpCisJCWlmIChmbG93LT5oX3UudXNyX2lwNF9zcGVjLmlwX3ZlciAhPSBFVEhfUlhfTkZDX0lQNCkKKwkJCW5ldGRldl93YXJuKHByaXYtPm5kZXYsCisJCQkJCSJJUC1WZXJzaW9uIGRpZmZlcmluZyBmcm9tIElQdjQgbm90IHN1cHBvcnRlZCFcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Zhcl9wcm9jZXNzX2ZpbGVyX2NoYW5nZXMoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgZXRodG9vbF9mbG93X3NwZWNfY29udGFpbmVyICpqOworCXN0cnVjdCBmaWxlcl90YWJsZSAqdGFiOworCXMzMiBpID0gMDsKKwlzMzIgcmV0ID0gMDsKKworCS8qIFNvIGluZGV4IGlzIHNldCB0byB6ZXJvLCB0b28hICovCisJdGFiID0ga3phbGxvYyhzaXplb2YoKnRhYiksIEdGUF9LRVJORUwpOworCWlmICh0YWIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBOb3cgY29udmVydCB0aGUgZXhpc3RpbmcgZmlsZXIgZGF0YSBmcm9tIGZsb3dfc3BlYyBpbnRvCisJICogZmlsZXIgdGFibGVzIGJpbmFyeSBmb3JtYXQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGosICZwcml2LT5yeF9saXN0Lmxpc3QsIGxpc3QpIHsKKwkJcmV0ID0gZ2Zhcl9jb252ZXJ0X3RvX2ZpbGVyKCZqLT5mcywgdGFiKTsKKwkJaWYgKHJldCA9PSAtRUJVU1kpIHsKKwkJCW5ldGRldl9lcnIocHJpdi0+bmRldiwgIlJ1bGUgbm90IGFkZGVkOiBObyBmcmVlIHNwYWNlIVxuIik7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlpZiAocmV0ID09IC0xKSB7CisJCQluZXRkZXZfZXJyKHByaXYtPm5kZXYsICJSdWxlIG5vdCBhZGRlZDogVW5zdXBwb3J0ZWQgRmxvdy10eXBlIVxuIik7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKworCWkgPSB0YWItPmluZGV4OworCisJLyogT3B0aW1pemF0aW9ucyB0byBzYXZlIGVudHJpZXMgKi8KKwlnZmFyX2NsdXN0ZXJfZmlsZXIodGFiKTsKKwlnZmFyX29wdGltaXplX2ZpbGVyX21hc2tzKHRhYik7CisKKwlwcl9kZWJ1ZygiXG5cdFN1bW1hcnk6XG4iCisJCSJcdERhdGEgb24gaGFyZHdhcmU6ICVkXG4iCisJCSJcdENvbXByZXNzaW9uIHJhdGU6ICVkJSVcbiIsCisJCXRhYi0+aW5kZXgsIDEwMCAtICgxMDAgKiB0YWItPmluZGV4KSAvIGkpOworCisJLyogV3JpdGUgZXZlcnl0aGluZyB0byBoYXJkd2FyZSAqLworCXJldCA9IGdmYXJfd3JpdGVfZmlsZXJfdGFibGUocHJpdiwgdGFiKTsKKwlpZiAocmV0ID09IC1FQlVTWSkgeworCQluZXRkZXZfZXJyKHByaXYtPm5kZXYsICJSdWxlIG5vdCBhZGRlZDogTm8gZnJlZSBzcGFjZSFcbiIpOworCQlnb3RvIGVuZDsKKwl9CisKK2VuZDoJa2ZyZWUodGFiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnZmFyX2ludmVydF9tYXNrcyhzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKmZsb3cpCit7CisJdTMyIGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihmbG93LT5tX3UpOyBpKyspCisJCWZsb3ctPm1fdS5oZGF0YVtpXSBePSAweEZGOworCisJZmxvdy0+bV9leHQudmxhbl9ldHlwZSBePSAweEZGRkY7CisJZmxvdy0+bV9leHQudmxhbl90Y2kgXj0gMHhGRkZGOworCWZsb3ctPm1fZXh0LmRhdGFbMF0gXj0gfjA7CisJZmxvdy0+bV9leHQuZGF0YVsxXSBePSB+MDsKK30KKworc3RhdGljIGludCBnZmFyX2FkZF9jbHMoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiwKKwkJc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICpmbG93KQoreworCXN0cnVjdCBldGh0b29sX2Zsb3dfc3BlY19jb250YWluZXIgKnRlbXAsICpjb21wOworCWludCByZXQgPSAwOworCisJdGVtcCA9IGttYWxsb2Moc2l6ZW9mKCp0ZW1wKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRlbXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtY3B5KCZ0ZW1wLT5mcywgZmxvdywgc2l6ZW9mKHRlbXAtPmZzKSk7CisKKwlnZmFyX2ludmVydF9tYXNrcygmdGVtcC0+ZnMpOworCXJldCA9IGdmYXJfY2hlY2tfY2FwYWJpbGl0eSgmdGVtcC0+ZnMsIHByaXYpOworCWlmIChyZXQpCisJCWdvdG8gY2xlYW5fbWVtOworCS8qIExpbmsgaW4gdGhlIG5ldyBlbGVtZW50IGF0IHRoZSByaWdodCBAbG9jYXRpb24gKi8KKwlpZiAobGlzdF9lbXB0eSgmcHJpdi0+cnhfbGlzdC5saXN0KSkgeworCQlyZXQgPSBnZmFyX2NoZWNrX2ZpbGVyX2hhcmR3YXJlKHByaXYpOworCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIGNsZWFuX21lbTsKKwkJbGlzdF9hZGQoJnRlbXAtPmxpc3QsICZwcml2LT5yeF9saXN0Lmxpc3QpOworCQlnb3RvIHByb2Nlc3M7CisJfSBlbHNlIHsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbXAsICZwcml2LT5yeF9saXN0Lmxpc3QsIGxpc3QpIHsKKwkJCWlmIChjb21wLT5mcy5sb2NhdGlvbiA+IGZsb3ctPmxvY2F0aW9uKSB7CisJCQkJbGlzdF9hZGRfdGFpbCgmdGVtcC0+bGlzdCwgJmNvbXAtPmxpc3QpOworCQkJCWdvdG8gcHJvY2VzczsKKwkJCX0KKwkJCWlmIChjb21wLT5mcy5sb2NhdGlvbiA9PSBmbG93LT5sb2NhdGlvbikgeworCQkJCW5ldGRldl9lcnIocHJpdi0+bmRldiwKKwkJCQkJCSJSdWxlIG5vdCBhZGRlZDogSUQgJWQgbm90IGZyZWUhXG4iLAorCQkJCQlmbG93LT5sb2NhdGlvbik7CisJCQkJcmV0ID0gLUVCVVNZOworCQkJCWdvdG8gY2xlYW5fbWVtOworCQkJfQorCQl9CisJCWxpc3RfYWRkX3RhaWwoJnRlbXAtPmxpc3QsICZwcml2LT5yeF9saXN0Lmxpc3QpOworCX0KKworcHJvY2VzczoKKwlyZXQgPSBnZmFyX3Byb2Nlc3NfZmlsZXJfY2hhbmdlcyhwcml2KTsKKwlpZiAocmV0KQorCQlnb3RvIGNsZWFuX2xpc3Q7CisJcHJpdi0+cnhfbGlzdC5jb3VudCsrOworCXJldHVybiByZXQ7CisKK2NsZWFuX2xpc3Q6CisJbGlzdF9kZWwoJnRlbXAtPmxpc3QpOworY2xlYW5fbWVtOgorCWtmcmVlKHRlbXApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2Zhcl9kZWxfY2xzKHN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYsIHUzMiBsb2MpCit7CisJc3RydWN0IGV0aHRvb2xfZmxvd19zcGVjX2NvbnRhaW5lciAqY29tcDsKKwl1MzIgcmV0ID0gLUVJTlZBTDsKKworCWlmIChsaXN0X2VtcHR5KCZwcml2LT5yeF9saXN0Lmxpc3QpKQorCQlyZXR1cm4gcmV0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb21wLCAmcHJpdi0+cnhfbGlzdC5saXN0LCBsaXN0KSB7CisJCWlmIChjb21wLT5mcy5sb2NhdGlvbiA9PSBsb2MpIHsKKwkJCWxpc3RfZGVsKCZjb21wLT5saXN0KTsKKwkJCWtmcmVlKGNvbXApOworCQkJcHJpdi0+cnhfbGlzdC5jb3VudC0tOworCQkJZ2Zhcl9wcm9jZXNzX2ZpbGVyX2NoYW5nZXMocHJpdik7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBpbnQgZ2Zhcl9nZXRfY2xzKHN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCit7CisJc3RydWN0IGV0aHRvb2xfZmxvd19zcGVjX2NvbnRhaW5lciAqY29tcDsKKwl1MzIgcmV0ID0gLUVJTlZBTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tcCwgJnByaXYtPnJ4X2xpc3QubGlzdCwgbGlzdCkgeworCQlpZiAoY29tcC0+ZnMubG9jYXRpb24gPT0gY21kLT5mcy5sb2NhdGlvbikgeworCQkJbWVtY3B5KCZjbWQtPmZzLCAmY29tcC0+ZnMsIHNpemVvZihjbWQtPmZzKSk7CisJCQlnZmFyX2ludmVydF9tYXNrcygmY21kLT5mcyk7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdmYXJfZ2V0X2Nsc19hbGwoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiwKKwkJc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCwgdTMyICpydWxlX2xvY3MpCit7CisJc3RydWN0IGV0aHRvb2xfZmxvd19zcGVjX2NvbnRhaW5lciAqY29tcDsKKwl1MzIgaSA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbXAsICZwcml2LT5yeF9saXN0Lmxpc3QsIGxpc3QpIHsKKwkJaWYgKGkgPD0gY21kLT5ydWxlX2NudCkgeworCQkJcnVsZV9sb2NzW2ldID0gY29tcC0+ZnMubG9jYXRpb247CisJCQlpKys7CisJCX0KKwl9CisKKwljbWQtPmRhdGEgPSBNQVhfRklMRVJfSURYOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZ2Zhcl9zZXRfbmZjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCiB7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJldCA9IDA7CiAKLQlzd2l0Y2goY21kLT5jbWQpIHsKKwltdXRleF9sb2NrKCZwcml2LT5yeF9xdWV1ZV9hY2Nlc3MpOworCisJc3dpdGNoIChjbWQtPmNtZCkgewogCWNhc2UgRVRIVE9PTF9TUlhGSDoKIAkJcmV0ID0gZ2Zhcl9zZXRfaGFzaF9vcHRzKHByaXYsIGNtZCk7CiAJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9TUlhDTFNSTElOUzoKKwkJaWYgKGNtZC0+ZnMucmluZ19jb29raWUgIT0gUlhfQ0xTX0ZMT1dfRElTQyAmJgorCQkJY21kLT5mcy5yaW5nX2Nvb2tpZSA+PSBwcml2LT5udW1fcnhfcXVldWVzKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gZ2Zhcl9hZGRfY2xzKHByaXYsICZjbWQtPmZzKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX1NSWENMU1JMREVMOgorCQlyZXQgPSBnZmFyX2RlbF9jbHMocHJpdiwgY21kLT5mcy5sb2NhdGlvbik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FSU5WQUw7CiAJfQogCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5yeF9xdWV1ZV9hY2Nlc3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZmFyX2dldF9uZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCwKKwkJdm9pZCAqcnVsZV9sb2NzKQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQtPmNtZCkgeworCWNhc2UgRVRIVE9PTF9HUlhSSU5HUzoKKwkJY21kLT5kYXRhID0gcHJpdi0+bnVtX3J4X3F1ZXVlczsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dSWENMU1JMQ05UOgorCQljbWQtPnJ1bGVfY250ID0gcHJpdi0+cnhfbGlzdC5jb3VudDsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dSWENMU1JVTEU6CisJCXJldCA9IGdmYXJfZ2V0X2Nscyhwcml2LCBjbWQpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUkxBTEw6CisJCXJldCA9IGdmYXJfZ2V0X2Nsc19hbGwocHJpdiwgY21kLCAodTMyICopIHJ1bGVfbG9jcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTgwOCw0ICsxNzQzLDUgQEAKIAkuc2V0X3dvbCA9IGdmYXJfc2V0X3dvbCwKICNlbmRpZgogCS5zZXRfcnhuZmMgPSBnZmFyX3NldF9uZmMsCisJLmdldF9yeG5mYyA9IGdmYXJfZ2V0X25mYywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX3B0cC5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9wdHAuYwppbmRleCBkOGUxNzUzLi4xYzk3ODYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyX3B0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfcHRwLmMKQEAgLTQ5MSw3ICs0OTEsNyBAQAogCXNwaW5fbG9ja19pbml0KCZldHNlY3RzLT5sb2NrKTsKIAogCWV0c2VjdHMtPnJlZ3MgPSBpb3JlbWFwKGV0c2VjdHMtPnJzcmMtPnN0YXJ0LAotCQkJCTEgKyBldHNlY3RzLT5yc3JjLT5lbmQgLSBldHNlY3RzLT5yc3JjLT5zdGFydCk7CisJCQkJcmVzb3VyY2Vfc2l6ZShldHNlY3RzLT5yc3JjKSk7CiAJaWYgKCFldHNlY3RzLT5yZWdzKSB7CiAJCXByX2VycigiaW9yZW1hcCBwdHAgcmVnaXN0ZXJzIGZhaWxlZFxuIik7CiAJCWdvdG8gbm9faW9yZW1hcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dyZXRoLmMgYi9kcml2ZXJzL25ldC9ncmV0aC5jCmluZGV4IGYxODEzMDQuLjE2Y2U0NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dyZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZ3JldGguYwpAQCAtMjIsOSArMjIsMTEgQEAKICAqICAgICAgICAgICAgICAgTWFya28gSXNvbWFraQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CkBAIC0xMDE1LDExICsxMDE3LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCUdSRVRIX1JFR1NBVkUocmVncy0+ZXNhX21zYiwgZGV2LT5kZXZfYWRkclswXSA8PCA4IHwgZGV2LT5kZXZfYWRkclsxXSk7CisJR1JFVEhfUkVHU0FWRShyZWdzLT5lc2FfbHNiLCBkZXYtPmRldl9hZGRyWzJdIDw8IDI0IHwgZGV2LT5kZXZfYWRkclszXSA8PCAxNiB8CisJCSAgICAgIGRldi0+ZGV2X2FkZHJbNF0gPDwgOCB8IGRldi0+ZGV2X2FkZHJbNV0pOwogCi0JR1JFVEhfUkVHU0FWRShyZWdzLT5lc2FfbXNiLCBhZGRyLT5zYV9kYXRhWzBdIDw8IDggfCBhZGRyLT5zYV9kYXRhWzFdKTsKLQlHUkVUSF9SRUdTQVZFKHJlZ3MtPmVzYV9sc2IsCi0JCSAgICAgIGFkZHItPnNhX2RhdGFbMl0gPDwgMjQgfCBhZGRyLT4KLQkJICAgICAgc2FfZGF0YVszXSA8PCAxNiB8IGFkZHItPnNhX2RhdGFbNF0gPDwgOCB8IGFkZHItPnNhX2RhdGFbNV0pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1hY2hpLmMgYi9kcml2ZXJzL25ldC9oYW1hY2hpLmMKaW5kZXggYTA5MDQxYS4uYzI3NGIzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtYWNoaS5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbWFjaGkuYwpAQCAtNjQ4LDEzICs2NDgsMTMgQEAKIAlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKIAlpZiAoIXJpbmdfc3BhY2UpCiAJCWdvdG8gZXJyX291dF9jbGVhcmRldjsKLQlobXAtPnR4X3JpbmcgPSAoc3RydWN0IGhhbWFjaGlfZGVzYyAqKXJpbmdfc3BhY2U7CisJaG1wLT50eF9yaW5nID0gcmluZ19zcGFjZTsKIAlobXAtPnR4X3JpbmdfZG1hID0gcmluZ19kbWE7CiAKIAlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKIAlpZiAoIXJpbmdfc3BhY2UpCiAJCWdvdG8gZXJyX291dF91bm1hcF90eDsKLQlobXAtPnJ4X3JpbmcgPSAoc3RydWN0IGhhbWFjaGlfZGVzYyAqKXJpbmdfc3BhY2U7CisJaG1wLT5yeF9yaW5nID0gcmluZ19zcGFjZTsKIAlobXAtPnJ4X3JpbmdfZG1hID0gcmluZ19kbWE7CiAKIAkvKiBDaGVjayBmb3Igb3B0aW9ucyBiZWluZyBwYXNzZWQgaW4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCmluZGV4IDNlNWQwYjYuLjBkMjgzNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYwpAQCAtNjkyLDEwICs2OTIsMTAgQEAKIHsKIAlzdHJ1Y3Qgc2l4cGFjayAqc3A7CiAKLQl3cml0ZV9sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJd3JpdGVfbG9ja19iaCgmZGlzY19kYXRhX2xvY2spOwogCXNwID0gdHR5LT5kaXNjX2RhdGE7CiAJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOwotCXdyaXRlX3VubG9jaygmZGlzY19kYXRhX2xvY2spOworCXdyaXRlX3VubG9ja19iaCgmZGlzY19kYXRhX2xvY2spOwogCWlmICghc3ApCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9mZHguYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfZmR4LmMKaW5kZXggOTljZGNlMy4uYTk3NDcyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9mZHguYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2ZkeC5jCkBAIC03Niw2ICs3Niw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hkbGNkcnYuaD4KICNpbmNsdWRlIDxsaW51eC9iYXljb20uaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2hkeC5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9oZHguYwppbmRleCBkOTJmZTZjLi5lMzQ5ZDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2hkeC5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfaGR4LmMKQEAgLTY2LDYgKzY2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9oZGxjZHJ2Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYwppbmRleCA0YzYyODM5Li5iYzAyOTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKQEAgLTgxMywxMCArODEzLDEwIEBACiB7CiAJc3RydWN0IG1raXNzICpheDsKIAotCXdyaXRlX2xvY2soJmRpc2NfZGF0YV9sb2NrKTsKKwl3cml0ZV9sb2NrX2JoKCZkaXNjX2RhdGFfbG9jayk7CiAJYXggPSB0dHktPmRpc2NfZGF0YTsKIAl0dHktPmRpc2NfZGF0YSA9IE5VTEw7Ci0Jd3JpdGVfdW5sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJd3JpdGVfdW5sb2NrX2JoKCZkaXNjX2RhdGFfbG9jayk7CiAKIAlpZiAoIWF4KQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocC1wbHVzLmMgYi9kcml2ZXJzL25ldC9ocC1wbHVzLmMKaW5kZXggODJiZmZjMy4uMjk5MTczNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAtcGx1cy5jCisrKyBiL2RyaXZlcnMvbmV0L2hwLXBsdXMuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocC5jIGIvZHJpdmVycy9uZXQvaHAuYwppbmRleCBlZjIwMTQzLi4xODU2NGQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ocC5jCisrKyBiL2RyaXZlcnMvbmV0L2hwLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAxMDAuYyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKaW5kZXggOGUxMGQyZi4uYjY1MTljMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAxMDAuYworKysgYi9kcml2ZXJzL25ldC9ocDEwMC5jCkBAIC0xNTgwLDEyICsxNTgwLDEyIEBACiAJaHAxMDBfb3V0bChyaW5ncHRyLT5wZGxfcGFkZHIsIFRYX1BEQV9MKTsJLyogTG93IFByaW8uIFF1ZXVlICovCiAKIAlscC0+dHhyY29tbWl0Kys7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKIAotCS8qIFVwZGF0ZSBzdGF0aXN0aWNzICovCiAJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogCiBkcm9wOgpAQCAtMjEwMywyMCArMjEwMywxOCBAQAogI2VuZGlmCiAJCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CiAJCQkJYWRkcnMgPSBoYS0+YWRkcjsKLQkJCQlpZiAoKCphZGRycyAmIDB4MDEpID09IDB4MDEpIHsJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCiAjaWZkZWYgSFAxMDBfREVCVUcKLQkJCQkJcHJpbnRrKCJocDEwMDogJXM6IG11bHRpY2FzdCA9ICVwTSwgIiwKLQkJCQkJCSAgICAgZGV2LT5uYW1lLCBhZGRycyk7CisJCQkJcHJpbnRrKCJocDEwMDogJXM6IG11bHRpY2FzdCA9ICVwTSwgIiwKKwkJCQkJICAgICBkZXYtPm5hbWUsIGFkZHJzKTsKICNlbmRpZgotCQkJCQlmb3IgKGkgPSBpZHggPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCQkJCQlpZHggXj0gKmFkZHJzKysgJiAweDNmOwotCQkJCQkJcHJpbnRrKCI6JTAyeDoiLCBpZHgpOwotCQkJCQl9Ci0jaWZkZWYgSFAxMDBfREVCVUcKLQkJCQkJcHJpbnRrKCJpZHggPSAlaVxuIiwgaWR4KTsKLSNlbmRpZgotCQkJCQlscC0+aGFzaF9ieXRlc1tpZHggPj4gM10gfD0gKDEgPDwgKGlkeCAmIDcpKTsKKwkJCQlmb3IgKGkgPSBpZHggPSAwOyBpIDwgNjsgaSsrKSB7CisJCQkJCWlkeCBePSAqYWRkcnMrKyAmIDB4M2Y7CisJCQkJCXByaW50aygiOiUwMng6IiwgaWR4KTsKIAkJCQl9CisjaWZkZWYgSFAxMDBfREVCVUcKKwkJCQlwcmludGsoImlkeCA9ICVpXG4iLCBpZHgpOworI2VuZGlmCisJCQkJbHAtPmhhc2hfYnl0ZXNbaWR4ID4+IDNdIHw9ICgxIDw8IChpZHggJiA3KSk7CiAJCQl9CiAJCX0KICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocGxhbmNlLmMgYi9kcml2ZXJzL25ldC9ocGxhbmNlLmMKaW5kZXggYjYwNjBmNy4uYTkwMGQ1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHBsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2hwbGFuY2UuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiB9CiAKIC8qIEluaXRpYWxpc2UgYSBzaW5nbGUgbGFuY2UgYm9hcmQgYXQgdGhlIGdpdmVuIERJTyBkZXZpY2UgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBocGxhbmNlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRpb19kZXYgKmQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaHBsYW5jZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkaW9fZGV2ICpkKQogewogICAgICAgICB1bnNpZ25lZCBsb25nIHZhID0gKGQtPnJlc291cmNlLnN0YXJ0ICsgRElPX1ZJUkFERFJCQVNFKTsKICAgICAgICAgc3RydWN0IGhwbGFuY2VfcHJpdmF0ZSAqbHA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmMgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmMKaW5kZXggMDc5NDUwZi4uNzI1Mzk5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuYwpAQCAtMjc3MCw3ICsyNzcwLDcgQEAKIAl9CiAJLy8gVE9ETyA6IHJlcXVlc3RfbWVtX3JlZ2lvbgogCWRldi0+ZW1hY3AgPSBpb3JlbWFwKGRldi0+cnNyY19yZWdzLnN0YXJ0LAotCQkJICAgICBkZXYtPnJzcmNfcmVncy5lbmQgLSBkZXYtPnJzcmNfcmVncy5zdGFydCArIDEpOworCQkJICAgICByZXNvdXJjZV9zaXplKCZkZXYtPnJzcmNfcmVncykpOwogCWlmIChkZXYtPmVtYWNwID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgbWFwIGRldmljZSByZWdpc3RlcnMhXG4iLAogCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm12ZXRoLmMgYi9kcml2ZXJzL25ldC9pYm12ZXRoLmMKaW5kZXggYjM4OGQ3OC4uODM4YzViNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtdmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2libXZldGguYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZmIuYyBiL2RyaXZlcnMvbmV0L2lmYi5jCmluZGV4IDRmZWNhZWQuLjZlODJkZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lmYi5jCisrKyBiL2RyaXZlcnMvbmV0L2lmYi5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KQEAgLTQwLDggKzQxLDE2IEBACiBzdHJ1Y3QgaWZiX3ByaXZhdGUgewogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgIGlmYl90YXNrbGV0OwogCWludCAgICAgdGFza2xldF9wZW5kaW5nOworCisJc3RydWN0IHU2NF9zdGF0c19zeW5jCXJzeW5jOwogCXN0cnVjdCBza19idWZmX2hlYWQgICAgIHJxOworCXU2NCByeF9wYWNrZXRzOworCXU2NCByeF9ieXRlczsKKworCXN0cnVjdCB1NjRfc3RhdHNfc3luYwl0c3luYzsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICAgICB0cTsKKwl1NjQgdHhfcGFja2V0czsKKwl1NjQgdHhfYnl0ZXM7CiB9OwogCiBzdGF0aWMgaW50IG51bWlmYnMgPSAyOwpAQCAtNTMsMTAgKzYyLDggQEAKIAogc3RhdGljIHZvaWQgcmlfdGFza2xldCh1bnNpZ25lZCBsb25nIGRldikKIHsKLQogCXN0cnVjdCBuZXRfZGV2aWNlICpfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OwogCXN0cnVjdCBpZmJfcHJpdmF0ZSAqZHAgPSBuZXRkZXZfcHJpdihfZGV2KTsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmX2Rldi0+c3RhdHM7CiAJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTc2LDE1ICs4MywxOCBAQAogCiAJCXNrYi0+dGNfdmVyZCA9IDA7CiAJCXNrYi0+dGNfdmVyZCA9IFNFVF9UQ19OQ0xTKHNrYi0+dGNfdmVyZCk7Ci0JCXN0YXRzLT50eF9wYWNrZXRzKys7Ci0JCXN0YXRzLT50eF9ieXRlcyArPXNrYi0+bGVuOworCisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmRwLT50c3luYyk7CisJCWRwLT50eF9wYWNrZXRzKys7CisJCWRwLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmRwLT50c3luYyk7CiAKIAkJcmN1X3JlYWRfbG9jaygpOwogCQlza2ItPmRldiA9IGRldl9nZXRfYnlfaW5kZXhfcmN1KCZpbml0X25ldCwgc2tiLT5za2JfaWlmKTsKIAkJaWYgKCFza2ItPmRldikgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQkJX2Rldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQkJaWYgKHNrYl9xdWV1ZV9sZW4oJmRwLT50cSkgIT0gMCkKIAkJCQlnb3RvIHJlc2NoZWQ7CiAJCQlicmVhazsKQEAgLTExOSw5ICsxMjksMzcgQEAKIAogfQogCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICppZmJfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCit7CisJc3RydWN0IGlmYl9wcml2YXRlICpkcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCisJZG8geworCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9iaCgmZHAtPnJzeW5jKTsKKwkJc3RhdHMtPnJ4X3BhY2tldHMgPSBkcC0+cnhfcGFja2V0czsKKwkJc3RhdHMtPnJ4X2J5dGVzID0gZHAtPnJ4X2J5dGVzOworCX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeV9iaCgmZHAtPnJzeW5jLCBzdGFydCkpOworCisJZG8geworCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9iaCgmZHAtPnRzeW5jKTsKKworCQlzdGF0cy0+dHhfcGFja2V0cyA9IGRwLT50eF9wYWNrZXRzOworCQlzdGF0cy0+dHhfYnl0ZXMgPSBkcC0+dHhfYnl0ZXM7CisKKwl9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnlfYmgoJmRwLT50c3luYywgc3RhcnQpKTsKKworCXN0YXRzLT5yeF9kcm9wcGVkID0gZGV2LT5zdGF0cy5yeF9kcm9wcGVkOworCXN0YXRzLT50eF9kcm9wcGVkID0gZGV2LT5zdGF0cy50eF9kcm9wcGVkOworCisJcmV0dXJuIHN0YXRzOworfQorCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaWZiX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCT0gaWZiX29wZW4sCiAJLm5kb19zdG9wCT0gaWZiX2Nsb3NlLAorCS5uZG9fZ2V0X3N0YXRzNjQgPSBpZmJfc3RhdHM2NCwKIAkubmRvX3N0YXJ0X3htaXQJPSBpZmJfeG1pdCwKIAkubmRvX3ZhbGlkYXRlX2FkZHIgPSBldGhfdmFsaWRhdGVfYWRkciwKIH07CkBAIC0xNTIsMTUgKzE5MCwxNiBAQAogc3RhdGljIG5ldGRldl90eF90IGlmYl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGlmYl9wcml2YXRlICpkcCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CiAJdTMyIGZyb20gPSBHX1RDX0ZST00oc2tiLT50Y192ZXJkKTsKIAotCXN0YXRzLT5yeF9wYWNrZXRzKys7Ci0Jc3RhdHMtPnJ4X2J5dGVzKz1za2ItPmxlbjsKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZkcC0+cnN5bmMpOworCWRwLT5yeF9wYWNrZXRzKys7CisJZHAtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZkcC0+cnN5bmMpOwogCiAJaWYgKCEoZnJvbSAmIChBVF9JTkdSRVNTfEFUX0VHUkVTUykpIHx8ICFza2ItPnNrYl9paWYpIHsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwotCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2lnYi9NYWtlZmlsZQppbmRleCA4MzcyY2I5Li5jNmU0NjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvaWdiL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMKICMgSW50ZWwgODI1NzUgUENJLUV4cHJlc3MgRXRoZXJuZXQgTGludXggZHJpdmVyCi0jIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyMgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLgogIwogIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogIyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwXzgyNTc1LmMgYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfODI1NzUuYwppbmRleCAwZjU2M2M4Li5jMDg1N2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfODI1NzUuYworKysgYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfODI1NzUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDIwMDctMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDIwMDctMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMTE1NiwxMCArMTE1NiwxMyBAQAogewogCXUzMiBjdHJsX2V4dCwgY3RybF9yZWcsIHJlZzsKIAlib29sIHBjc19hdXRvbmVnOworCXMzMiByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKKwl1MTYgZGF0YTsKIAogCWlmICgoaHctPnBoeS5tZWRpYV90eXBlICE9IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgogCSAgICAhaWdiX3NnbWlpX2FjdGl2ZV84MjU3NShodykpCi0JCXJldHVybiAwOworCQlyZXR1cm4gcmV0X3ZhbDsKKwogCiAJLyoKIAkgKiBPbiB0aGUgODI1NzUsIFNlckRlcyBsb29wYmFjayBtb2RlIHBlcnNpc3RzIHVudGlsIGl0IGlzCkBAIC0xMjAzLDYgKzEyMDYsMTggQEAKIAkJLyogZGlzYWJsZSBQQ1MgYXV0b25lZyBhbmQgc3VwcG9ydCBwYXJhbGxlbCBkZXRlY3Qgb25seSAqLwogCQlwY3NfYXV0b25lZyA9IGZhbHNlOwogCWRlZmF1bHQ6CisJCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzUgfHwKKwkJICAgIGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3NikgeworCQkJcmV0X3ZhbCA9IGh3LT5udm0ub3BzLnJlYWQoaHcsIE5WTV9DT01QQVQsIDEsICZkYXRhKTsKKwkJCWlmIChyZXRfdmFsKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIk5WTSBSZWFkIEVycm9yXG5cbiIpOworCQkJCXJldHVybiByZXRfdmFsOworCQkJfQorCisJCQlpZiAoZGF0YSAmIEUxMDAwX0VFUFJPTV9QQ1NfQVVUT05FR19ESVNBQkxFX0JJVCkKKwkJCQlwY3NfYXV0b25lZyA9IGZhbHNlOworCQl9CisKIAkJLyoKIAkJICogbm9uLVNHTUlJIG1vZGVzIG9ubHkgc3VwcG9ydHMgYSBzcGVlZCBvZiAxMDAwL0Z1bGwgZm9yIHRoZQogCQkgKiBsaW5rIHNvIGl0IGlzIGJlc3QgdG8ganVzdCBmb3JjZSB0aGUgTUFDIGFuZCBsZXQgdGhlIHBjcwpAQCAtMTI1MCw3ICsxMjY1LDcgQEAKIAlpZiAoIWlnYl9zZ21paV9hY3RpdmVfODI1NzUoaHcpKQogCQlpZ2JfZm9yY2VfbWFjX2ZjKGh3KTsKIAotCXJldHVybiAwOworCXJldHVybiByZXRfdmFsOwogfQogCiAvKioKQEAgLTE3MzUsNiArMTc1MCw3IEBACiAJCWN0cmwgfD0gRTEwMDBfQ1RSTF9SU1Q7CiAKIAl3cjMyKEUxMDAwX0NUUkwsIGN0cmwpOworCXdyZmwoKTsKIAogCS8qIEFkZCBkZWxheSB0byBpbnN1cmUgREVWX1JTVCBoYXMgdGltZSB0byBjb21wbGV0ZSAqLwogCWlmIChnbG9iYWxfZGV2aWNlX3Jlc2V0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwXzgyNTc1LmggYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfODI1NzUuaAppbmRleCBkZDZkZjM0Li43ODZlMTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfODI1NzUuaAorKysgYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfODI1NzUuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDIwMDctMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDIwMDctMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMjQzLDYgKzI0Myw4IEBACiAjZGVmaW5lIEUxMDAwX0RUWENUTF9NRFBfRU4gICAgIDB4MDAyMAogI2RlZmluZSBFMTAwMF9EVFhDVExfU1BPT0ZfSU5UICAweDAwNDAKIAorI2RlZmluZSBFMTAwMF9FRVBST01fUENTX0FVVE9ORUdfRElTQUJMRV9CSVQJKDEgPDwgMTQpCisKICNkZWZpbmUgQUxMX1FVRVVFUyAgIDB4RkZGRgogCiAvKiBSWCBwYWNrZXQgYnVmZmVyIHNpemUgZGVmaW5lcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX2RlZmluZXMuaCBiL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9kZWZpbmVzLmgKaW5kZXggNmI4MGQ0MC4uN2I4ZGRkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX2RlZmluZXMuaAorKysgYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfZGVmaW5lcy5oCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDA5IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMjAwNy0yMDExIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC00MzcsNiArNDM3LDcgQEAKICNkZWZpbmUgRTEwMDBfUkFIX1BPT0xfMSAweDAwMDQwMDAwCiAKIC8qIEVycm9yIENvZGVzICovCisjZGVmaW5lIEUxMDAwX1NVQ0NFU1MgICAgICAwCiAjZGVmaW5lIEUxMDAwX0VSUl9OVk0gICAgICAxCiAjZGVmaW5lIEUxMDAwX0VSUl9QSFkgICAgICAyCiAjZGVmaW5lIEUxMDAwX0VSUl9DT05GSUcgICAzCkBAIC01MTEsNiArNTEyLDE2IEBACiAjZGVmaW5lIEUxMDAwX0dDUl9DTVBMX1RNT1VUX1JFU0VORCAgICAgMHgwMDAxMDAwMAogI2RlZmluZSBFMTAwMF9HQ1JfQ0FQX1ZFUjIgICAgICAgICAgICAgIDB4MDAwNDAwMDAKIAorLyogbVBIWSBBZGRyZXNzIENvbnRyb2wgYW5kIERhdGEgUmVnaXN0ZXJzICovCisjZGVmaW5lIEUxMDAwX01QSFlfQUREUl9DVEwgICAgICAgICAgMHgwMDI0IC8qIG1QSFkgQWRkcmVzcyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX01QSFlfQUREUl9DVExfT0ZGU0VUX01BU0sgMHhGRkZGMDAwMAorI2RlZmluZSBFMTAwMF9NUEhZX0RBVEEgICAgICAgICAgICAgICAgIDB4MEUxMCAvKiBtUEhZIERhdGEgUmVnaXN0ZXIgKi8KKworLyogbVBIWSBQQ1MgQ0xLIFJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX01QSFlfUENTX0NMS19SRUdfT0ZGU0VUICAweDAwMDQgLyogbVBIWSBQQ1MgQ0xLIEFGRSBDU1IgT2Zmc2V0ICovCisvKiBtUEhZIE5lYXIgRW5kIERpZ2l0YWwgTG9vcGJhY2sgT3ZlcnJpZGUgQml0ICovCisjZGVmaW5lIEUxMDAwX01QSFlfUENTX0NMS19SRUdfRElHSU5FTEJFTiAweDEwCisKIC8qIFBIWSBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIE1JSV9DUl9GVUxMX0RVUExFWCAgICAgIDB4MDEwMCAgLyogRkRYID0xLCBoYWxmIGR1cGxleCA9MCAqLwogI2RlZmluZSBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyAweDAyMDAgIC8qIFJlc3RhcnQgYXV0byBuZWdvdGlhdGlvbiAqLwpAQCAtNTg3LDggKzU5OCw4IEBACiAjZGVmaW5lIEUxMDAwX05WTV9QT0xMX1JFQUQgICAgIDAgICAgLyogRmxhZyBmb3IgcG9sbGluZyBmb3IgcmVhZCBjb21wbGV0ZSAqLwogCiAvKiBOVk0gV29yZCBPZmZzZXRzICovCi0jZGVmaW5lIE5WTV9JRF9MRURfU0VUVElOR1MgICAgICAgIDB4MDAwNAotLyogRm9yIFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIGFkanVzdG1lbnQuICovCisjZGVmaW5lIE5WTV9DT01QQVQgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBOVk1fSURfTEVEX1NFVFRJTkdTICAgICAgICAweDAwMDQgLyogU0VSREVTIG91dHB1dCBhbXBsaXR1ZGUgKi8KICNkZWZpbmUgTlZNX0lOSVRfQ09OVFJPTDJfUkVHICAgICAgMHgwMDBGCiAjZGVmaW5lIE5WTV9JTklUX0NPTlRST0wzX1BPUlRfQiAgIDB4MDAxNAogI2RlZmluZSBOVk1fSU5JVF9DT05UUk9MM19QT1JUX0EgICAweDAwMjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9ody5oIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwX2h3LmgKaW5kZXggMjcxNTNlOC4uNDUxOWExMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX2h3LmgKKysrIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwX2h3LmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAyMDA3LTIwMDkgSW50ZWwgQ29ycG9yYXRpb24uCisgIENvcHlyaWdodChjKSAyMDA3LTIwMTEgSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9tYWMuYyBiL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9tYWMuYwppbmRleCBjZTgyNTVmLi4yYjVlZjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwX21hYy5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDA5IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMjAwNy0yMDExIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogCiAjaW5jbHVkZSAiZTEwMDBfbWFjLmgiCiAKQEAgLTIxNyw3ICsyMTgsNyBAQAogCX0KIAogCS8qIGlmIG11bHRpY2FzdCBiaXQgaXMgc2V0LCB0aGUgYWx0ZXJuYXRlIGFkZHJlc3Mgd2lsbCBub3QgYmUgdXNlZCAqLwotCWlmIChhbHRfbWFjX2FkZHJbMF0gJiAweDAxKSB7CisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGFsdF9tYWNfYWRkcikpIHsKIAkJaHdfZGJnKCJJZ25vcmluZyBBbHRlcm5hdGUgTWFjIEFkZHJlc3Mgd2l0aCBNQyBiaXQgc2V0XG4iKTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX21hYy5oIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwX21hYy5oCmluZGV4IDYwMWJlOTkuLjQ5MjdmNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9tYWMuaAorKysgYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfbWFjLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAyMDA3LTIwMDkgSW50ZWwgQ29ycG9yYXRpb24uCisgIENvcHlyaWdodChjKSAyMDA3LTIwMTEgSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9tYnguYyBiL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9tYnguYwppbmRleCA3OGQ0OGM3Li43NGYyZjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfbWJ4LmMKKysrIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwX21ieC5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDA5IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMjAwNy0yMDExIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfbWJ4LmggYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfbWJ4LmgKaW5kZXggYmIxMTJmYi4uZWRkYjBmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX21ieC5oCisrKyBiL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9tYnguaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDIwMDctMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDIwMDctMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX252bS5jIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwX252bS5jCmluZGV4IDc1YmYzNmEuLjdkY2Q2NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9udm0uYworKysgYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfbnZtLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAyMDA3LTIwMDkgSW50ZWwgQ29ycG9yYXRpb24uCisgIENvcHlyaWdodChjKSAyMDA3LTIwMTEgSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9udm0uaCBiL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9udm0uaAppbmRleCA3ZjQzNTY0Li5hMmE3Y2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfbnZtLmgKKysrIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwX252bS5oCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9waHkuYyBiL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9waHkuYwppbmRleCBkNjM5NzA2Li5lNjYyNTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwX3BoeS5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDA5IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMjAwNy0yMDExIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfcGh5LmggYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfcGh5LmgKaW5kZXggMmNjMTE3Ny4uODUxMDc5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9waHkuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDIwMDctMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDIwMDctMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX3JlZ3MuaCBiL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9yZWdzLmgKaW5kZXggOTU4Y2EzYi4uMDk5MGY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX3JlZ3MuaAorKysgYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfcmVncy5oCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDA5IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMjAwNy0yMDExIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZ2IvaWdiLmggYi9kcml2ZXJzL25ldC9pZ2IvaWdiLmgKaW5kZXggZjRmYTRiMS4uMjY1ZTE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2lnYi5oCisrKyBiL2RyaXZlcnMvbmV0L2lnYi9pZ2IuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDIwMDctMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDIwMDctMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMzcsNiArMzcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZWNvbXBhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRfdHN0YW1wLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogCiBzdHJ1Y3QgaWdiX2FkYXB0ZXI7CiAKQEAgLTI1Miw3ICsyNTQsNyBAQAogc3RydWN0IGlnYl9hZGFwdGVyIHsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZ190aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBwaHlfaW5mb190aW1lcjsKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CisJdW5zaWduZWQgbG9uZyBhY3RpdmVfdmxhbnNbQklUU19UT19MT05HUyhWTEFOX05fVklEKV07CiAJdTE2IG1uZ192bGFuX2lkOwogCXUzMiBiZF9udW1iZXI7CiAJdTMyIHdvbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9pZ2JfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvaWdiL2lnYl9ldGh0b29sLmMKaW5kZXggZmRjODk1ZS4uZmYyNDRjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2lnYl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvaWdiL2lnYl9ldGh0b29sLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIEludGVsKFIpIEdpZ2FiaXQgRXRoZXJuZXQgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAyMDA3LTIwMDkgSW50ZWwgQ29ycG9yYXRpb24uCisgIENvcHlyaWdodChjKSAyMDA3LTIwMTEgSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTMxOCw2NSArMzE4LDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdTMyIGlnYl9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICEhKGFkYXB0ZXItPnJ4X3JpbmdbMF0tPmZsYWdzICYgSUdCX1JJTkdfRkxBR19SWF9DU1VNKTsKLX0KLQotc3RhdGljIGludCBpZ2Jfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGRhdGEpCi17Ci0Jc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspIHsKLQkJaWYgKGRhdGEpCi0JCQlhZGFwdGVyLT5yeF9yaW5nW2ldLT5mbGFncyB8PSBJR0JfUklOR19GTEFHX1JYX0NTVU07Ci0JCWVsc2UKLQkJCWFkYXB0ZXItPnJ4X3JpbmdbaV0tPmZsYWdzICY9IH5JR0JfUklOR19GTEFHX1JYX0NTVU07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1MzIgaWdiX2dldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0JcmV0dXJuIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKSAhPSAwOwotfQotCi1zdGF0aWMgaW50IGlnYl9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKLXsKLQlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JaWYgKGRhdGEpIHsKLQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0pOwotCQlpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPj0gZTEwMDBfODI1NzYpCi0JCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0NUUF9DU1VNOwotCX0gZWxzZSB7Ci0JCW5ldGRldi0+ZmVhdHVyZXMgJj0gfihORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTSB8Ci0JCSAgICAgICAgICAgICAgICAgICAgICBORVRJRl9GX1NDVFBfQ1NVTSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaWdiX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGRhdGEpCi17Ci0Jc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWlmIChkYXRhKSB7Ci0JCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087Ci0JCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OwotCX0gZWxzZSB7Ci0JCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPOwotCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzY7Ci0JfQotCi0JZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIlRTTyBpcyAlc1xuIiwKLQkJIGRhdGEgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHUzMiBpZ2JfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTE1MjAsNiArMTQ2MSwyMiBAQAogCiAJLyogdXNlIENUUkxfRVhUIHRvIGlkZW50aWZ5IGxpbmsgdHlwZSBhcyBTR01JSSBjYW4gYXBwZWFyIGFzIGNvcHBlciAqLwogCWlmIChyZWcgJiBFMTAwMF9DVFJMX0VYVF9MSU5LX01PREVfTUFTSykgeworCQlpZiAoKGh3LT5kZXZpY2VfaWQgPT0gRTEwMDBfREVWX0lEX0RIODlYWENDX1NHTUlJKSB8fAorCQkoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfREg4OVhYQ0NfU0VSREVTKSB8fAorCQkoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfREg4OVhYQ0NfQkFDS1BMQU5FKSB8fAorCQkoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfREg4OVhYQ0NfU0ZQKSkgeworCisJCQkvKiBFbmFibGUgREg4OXh4Q0MgTVBIWSBmb3IgbmVhciBlbmQgbG9vcGJhY2sgKi8KKwkJCXJlZyA9IHJkMzIoRTEwMDBfTVBIWV9BRERSX0NUTCk7CisJCQlyZWcgPSAocmVnICYgRTEwMDBfTVBIWV9BRERSX0NUTF9PRkZTRVRfTUFTSykgfAorCQkJRTEwMDBfTVBIWV9QQ1NfQ0xLX1JFR19PRkZTRVQ7CisJCQl3cjMyKEUxMDAwX01QSFlfQUREUl9DVEwsIHJlZyk7CisKKwkJCXJlZyA9IHJkMzIoRTEwMDBfTVBIWV9EQVRBKTsKKwkJCXJlZyB8PSBFMTAwMF9NUEhZX1BDU19DTEtfUkVHX0RJR0lORUxCRU47CisJCQl3cjMyKEUxMDAwX01QSFlfREFUQSwgcmVnKTsKKwkJfQorCiAJCXJlZyA9IHJkMzIoRTEwMDBfUkNUTCk7CiAJCXJlZyB8PSBFMTAwMF9SQ1RMX0xCTV9UQ1ZSOwogCQl3cjMyKEUxMDAwX1JDVEwsIHJlZyk7CkBAIC0xNTYxLDYgKzE1MTgsMjMgQEAKIAl1MzIgcmN0bDsKIAl1MTYgcGh5X3JlZzsKIAorCWlmICgoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfREg4OVhYQ0NfU0dNSUkpIHx8CisJKGh3LT5kZXZpY2VfaWQgPT0gRTEwMDBfREVWX0lEX0RIODlYWENDX1NFUkRFUykgfHwKKwkoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfREg4OVhYQ0NfQkFDS1BMQU5FKSB8fAorCShody0+ZGV2aWNlX2lkID09IEUxMDAwX0RFVl9JRF9ESDg5WFhDQ19TRlApKSB7CisJCXUzMiByZWc7CisKKwkJLyogRGlzYWJsZSBuZWFyIGVuZCBsb29wYmFjayBvbiBESDg5eHhDQyAqLworCQlyZWcgPSByZDMyKEUxMDAwX01QSFlfQUREUl9DVEwpOworCQlyZWcgPSAocmVnICYgRTEwMDBfTVBIWV9BRERSX0NUTF9PRkZTRVRfTUFTSykgfAorCQlFMTAwMF9NUEhZX1BDU19DTEtfUkVHX09GRlNFVDsKKwkJd3IzMihFMTAwMF9NUEhZX0FERFJfQ1RMLCByZWcpOworCisJCXJlZyA9IHJkMzIoRTEwMDBfTVBIWV9EQVRBKTsKKwkJcmVnICY9IH5FMTAwMF9NUEhZX1BDU19DTEtfUkVHX0RJR0lORUxCRU47CisJCXdyMzIoRTEwMDBfTVBIWV9EQVRBLCByZWcpOworCX0KKwogCXJjdGwgPSByZDMyKEUxMDAwX1JDVEwpOwogCXJjdGwgJj0gfihFMTAwMF9SQ1RMX0xCTV9UQ1ZSIHwgRTEwMDBfUkNUTF9MQk1fTUFDKTsKIAl3cjMyKEUxMDAwX1JDVEwsIHJjdGwpOwpAQCAtMjIwNywxNCArMjE4MSw2IEBACiAJLnNldF9yaW5ncGFyYW0gICAgICAgICAgPSBpZ2Jfc2V0X3JpbmdwYXJhbSwKIAkuZ2V0X3BhdXNlcGFyYW0gICAgICAgICA9IGlnYl9nZXRfcGF1c2VwYXJhbSwKIAkuc2V0X3BhdXNlcGFyYW0gICAgICAgICA9IGlnYl9zZXRfcGF1c2VwYXJhbSwKLQkuZ2V0X3J4X2NzdW0gICAgICAgICAgICA9IGlnYl9nZXRfcnhfY3N1bSwKLQkuc2V0X3J4X2NzdW0gICAgICAgICAgICA9IGlnYl9zZXRfcnhfY3N1bSwKLQkuZ2V0X3R4X2NzdW0gICAgICAgICAgICA9IGlnYl9nZXRfdHhfY3N1bSwKLQkuc2V0X3R4X2NzdW0gICAgICAgICAgICA9IGlnYl9zZXRfdHhfY3N1bSwKLQkuZ2V0X3NnICAgICAgICAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X3NnLAotCS5zZXRfc2cgICAgICAgICAgICAgICAgID0gZXRodG9vbF9vcF9zZXRfc2csCi0JLmdldF90c28gICAgICAgICAgICAgICAgPSBldGh0b29sX29wX2dldF90c28sCi0JLnNldF90c28gICAgICAgICAgICAgICAgPSBpZ2Jfc2V0X3RzbywKIAkuc2VsZl90ZXN0ICAgICAgICAgICAgICA9IGlnYl9kaWFnX3Rlc3QsCiAJLmdldF9zdHJpbmdzICAgICAgICAgICAgPSBpZ2JfZ2V0X3N0cmluZ3MsCiAJLnNldF9waHlzX2lkICAgICAgICAgICAgPSBpZ2Jfc2V0X3BoeXNfaWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYyBiL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jCmluZGV4IDE4ZmNjZjkuLmRjNTk5MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMjAwNy0yMDA5IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMjAwNy0yMDExIEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KQEAgLTU0LDkgKzU1LDggQEAKICNkZWZpbmUgTUFKIDMKICNkZWZpbmUgTUlOIDAKICNkZWZpbmUgQlVJTEQgNgotI2RlZmluZSBLRklYIDIKICNkZWZpbmUgRFJWX1ZFUlNJT04gX19zdHJpbmdpZnkoTUFKKSAiLiIgX19zdHJpbmdpZnkoTUlOKSAiLiIgXAotX19zdHJpbmdpZnkoQlVJTEQpICItayIgX19zdHJpbmdpZnkoS0ZJWCkKK19fc3RyaW5naWZ5KEJVSUxEKSAiLWsiCiBjaGFyIGlnYl9kcml2ZXJfbmFtZVtdID0gImlnYiI7CiBjaGFyIGlnYl9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiBzdGF0aWMgY29uc3QgY2hhciBpZ2JfZHJpdmVyX3N0cmluZ1tdID0KQEAgLTE0MSw3ICsxNDEsNyBAQAogc3RhdGljIGludCBpZ2JfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCBjbWQpOwogc3RhdGljIHZvaWQgaWdiX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBzdGF0aWMgdm9pZCBpZ2JfcmVzZXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7Ci1zdGF0aWMgdm9pZCBpZ2Jfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqKTsKK3N0YXRpYyB2b2lkIGlnYl92bGFuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKTsKIHN0YXRpYyB2b2lkIGlnYl92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2KTsKIHN0YXRpYyB2b2lkIGlnYl92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNik7CiBzdGF0aWMgdm9pZCBpZ2JfcmVzdG9yZV92bGFuKHN0cnVjdCBpZ2JfYWRhcHRlciAqKTsKQEAgLTEzNjMsNyArMTM2Myw3IEBACiAKIAlpZiAoKG9sZF92aWQgIT0gKHUxNilJR0JfTU5HX1ZMQU5fTk9ORSkgJiYKIAkgICAgKHZpZCAhPSBvbGRfdmlkKSAmJgotCSAgICAhdmxhbl9ncm91cF9nZXRfZGV2aWNlKGFkYXB0ZXItPnZsZ3JwLCBvbGRfdmlkKSkgeworCSAgICAhdGVzdF9iaXQob2xkX3ZpZCwgYWRhcHRlci0+YWN0aXZlX3ZsYW5zKSkgewogCQkvKiByZW1vdmUgVklEIGZyb20gZmlsdGVyIHRhYmxlICovCiAJCWlnYl92ZnRhX3NldChodywgb2xkX3ZpZCwgZmFsc2UpOwogCX0KQEAgLTE3NDksNiArMTc0OSwzOSBAQAogCWlnYl9nZXRfcGh5X2luZm8oaHcpOwogfQogCitzdGF0aWMgdTMyIGlnYl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQoreworCS8qCisJICogU2luY2UgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2VwYXJhdGUgcngvdHggdmxhbiBhY2NlbAorCSAqIGVuYWJsZS9kaXNhYmxlIG1ha2Ugc3VyZSB0eCBmbGFnIGlzIGFsd2F5cyBpbiBzYW1lIHN0YXRlIGFzIHJ4LgorCSAqLworCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYOworCWVsc2UKKwkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfSFdfVkxBTl9UWDsKKworCXJldHVybiBmZWF0dXJlczsKK30KKworc3RhdGljIGludCBpZ2Jfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3sKKwlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBpOworCXUzMiBjaGFuZ2VkID0gbmV0ZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykgeworCQlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkKKwkJCWFkYXB0ZXItPnJ4X3JpbmdbaV0tPmZsYWdzIHw9IElHQl9SSU5HX0ZMQUdfUlhfQ1NVTTsKKwkJZWxzZQorCQkJYWRhcHRlci0+cnhfcmluZ1tpXS0+ZmxhZ3MgJj0gfklHQl9SSU5HX0ZMQUdfUlhfQ1NVTTsKKwl9CisKKwlpZiAoY2hhbmdlZCAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJaWdiX3ZsYW5fbW9kZShuZXRkZXYsIGZlYXR1cmVzKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGlnYl9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbgkJPSBpZ2Jfb3BlbiwKIAkubmRvX3N0b3AJCT0gaWdiX2Nsb3NlLApAQCAtMTc2MSw3ICsxNzk0LDYgQEAKIAkubmRvX2RvX2lvY3RsCQk9IGlnYl9pb2N0bCwKIAkubmRvX3R4X3RpbWVvdXQJCT0gaWdiX3R4X3RpbWVvdXQsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gaWdiX3ZsYW5fcnhfcmVnaXN0ZXIsCiAJLm5kb192bGFuX3J4X2FkZF92aWQJPSBpZ2Jfdmxhbl9yeF9hZGRfdmlkLAogCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IGlnYl92bGFuX3J4X2tpbGxfdmlkLAogCS5uZG9fc2V0X3ZmX21hYwkJPSBpZ2JfbmRvX3NldF92Zl9tYWMsCkBAIC0xNzcxLDYgKzE4MDMsOCBAQAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBpZ2JfbmV0cG9sbCwKICNlbmRpZgorCS5uZG9fZml4X2ZlYXR1cmVzCT0gaWdiX2ZpeF9mZWF0dXJlcywKKwkubmRvX3NldF9mZWF0dXJlcwk9IGlnYl9zZXRfZmVhdHVyZXMsCiB9OwogCiAvKioKQEAgLTE5MTAsMTYgKzE5NDQsMTcgQEAKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwKIAkJCSJQSFkgcmVzZXQgaXMgYmxvY2tlZCBkdWUgdG8gU09ML0lERVIgc2Vzc2lvbi5cbiIpOwogCi0JbmV0ZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfAorCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwKIAkJCSAgIE5FVElGX0ZfSVBfQ1NVTSB8Ci0JCQkgICBORVRJRl9GX0hXX1ZMQU5fVFggfAotCQkJICAgTkVUSUZfRl9IV19WTEFOX1JYIHwKLQkJCSAgIE5FVElGX0ZfSFdfVkxBTl9GSUxURVI7CisJCQkgICBORVRJRl9GX0lQVjZfQ1NVTSB8CisJCQkgICBORVRJRl9GX1RTTyB8CisJCQkgICBORVRJRl9GX1RTTzYgfAorCQkJICAgTkVUSUZfRl9SWENTVU0gfAorCQkJICAgTkVUSUZfRl9IV19WTEFOX1JYOwogCi0JbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQVjZfQ1NVTTsKLQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwotCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OwotCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9HUk87CisJbmV0ZGV2LT5mZWF0dXJlcyA9IG5ldGRldi0+aHdfZmVhdHVyZXMgfAorCQkJICAgTkVUSUZfRl9IV19WTEFOX1RYIHwKKwkJCSAgIE5FVElGX0ZfSFdfVkxBTl9GSUxURVI7CiAKIAluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CiAJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKQEAgLTE5MzIsOCArMTk2NywxMCBAQAogCQluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwogCX0KIAotCWlmIChody0+bWFjLnR5cGUgPj0gZTEwMDBfODI1NzYpCisJaWYgKGh3LT5tYWMudHlwZSA+PSBlMTAwMF84MjU3NikgeworCQluZXRkZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfU0NUUF9DU1VNOwogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0NUUF9DU1VNOworCX0KIAogCWFkYXB0ZXItPmVuX21uZ19wdCA9IGlnYl9lbmFibGVfbW5nX3Bhc3NfdGhydShodyk7CiAKQEAgLTIwMzksNiArMjA3Niw4IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfcmVnaXN0ZXI7CiAKKwlpZ2Jfdmxhbl9tb2RlKG5ldGRldiwgbmV0ZGV2LT5mZWF0dXJlcyk7CisKIAkvKiBjYXJyaWVyIG9mZiByZXBvcnRpbmcgaXMgaW1wb3J0YW50IHRvIGV0aHRvb2wgZXZlbiBCRUZPUkUgb3BlbiAqLwogCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CiAKQEAgLTIzNzMsNiArMjQxMiw5IEBACiAJfQogI2VuZGlmIC8qIENPTkZJR19QQ0lfSU9WICovCiAJYWRhcHRlci0+cnNzX3F1ZXVlcyA9IG1pbl90KHUzMiwgSUdCX01BWF9SWF9RVUVVRVMsIG51bV9vbmxpbmVfY3B1cygpKTsKKwkvKiBpMzUwIGNhbm5vdCBkbyBSU1MgYW5kIFNSLUlPViBhdCB0aGUgc2FtZSB0aW1lICovCisJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9pMzUwICYmIGFkYXB0ZXItPnZmc19hbGxvY2F0ZWRfY291bnQpCisJCWFkYXB0ZXItPnJzc19xdWV1ZXMgPSAxOwogCiAJLyoKIAkgKiBpZiByc3NfcXVldWVzID4gNCBvciB2ZnMgYXJlIGdvaW5nIHRvIGJlIGFsbG9jYXRlZCB3aXRoIHJzc19xdWV1ZXMKQEAgLTI5MTgsMTIgKzI5NjAsMTEgQEAKICAqKi8KIHN0YXRpYyB2b2lkIGlnYl9ybHBtbF9zZXQoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyKQogewotCXUzMiBtYXhfZnJhbWVfc2l6ZSA9IGFkYXB0ZXItPm1heF9mcmFtZV9zaXplOworCXUzMiBtYXhfZnJhbWVfc2l6ZTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUxNiBwZl9pZCA9IGFkYXB0ZXItPnZmc19hbGxvY2F0ZWRfY291bnQ7CiAKLQlpZiAoYWRhcHRlci0+dmxncnApCi0JCW1heF9mcmFtZV9zaXplICs9IFZMQU5fVEFHX1NJWkU7CisJbWF4X2ZyYW1lX3NpemUgPSBhZGFwdGVyLT5tYXhfZnJhbWVfc2l6ZSArIFZMQU5fVEFHX1NJWkU7CiAKIAkvKiBpZiB2ZnMgYXJlIGVuYWJsZWQgd2Ugc2V0IFJMUE1MIHRvIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHJlcXVlc3QKIAkgKiBzaXplIGFuZCBzZXQgdGhlIFZNT0xSIFJMUE1MIHRvIHRoZSBzaXplIHdlIG5lZWQgKi8KQEAgLTU2NzIsMjUgKzU3MTMsNiBAQAogCXJldHVybiBjb3VudCA8IHR4X3JpbmctPmNvdW50OwogfQogCi0vKioKLSAqIGlnYl9yZWNlaXZlX3NrYiAtIGhlbHBlciBmdW5jdGlvbiB0byBoYW5kbGUgcnggaW5kaWNhdGlvbnMKLSAqIEBxX3ZlY3Rvcjogc3RydWN0dXJlIGNvbnRhaW5pbmcgaW50ZXJydXB0IGFuZCByaW5nIGluZm9ybWF0aW9uCi0gKiBAc2tiOiBwYWNrZXQgdG8gc2VuZCB1cAotICogQHZsYW5fdGFnOiB2bGFuIHRhZyBmb3IgcGFja2V0Ci0gKiovCi1zdGF0aWMgdm9pZCBpZ2JfcmVjZWl2ZV9za2Ioc3RydWN0IGlnYl9xX3ZlY3RvciAqcV92ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgdmxhbl90YWcpCi17Ci0Jc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gcV92ZWN0b3ItPmFkYXB0ZXI7Ci0KLQlpZiAodmxhbl90YWcgJiYgYWRhcHRlci0+dmxncnApCi0JCXZsYW5fZ3JvX3JlY2VpdmUoJnFfdmVjdG9yLT5uYXBpLCBhZGFwdGVyLT52bGdycCwKLQkJICAgICAgICAgICAgICAgICB2bGFuX3RhZywgc2tiKTsKLQllbHNlCi0JCW5hcGlfZ3JvX3JlY2VpdmUoJnFfdmVjdG9yLT5uYXBpLCBza2IpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgaWdiX3J4X2NoZWNrc3VtX2FkdihzdHJ1Y3QgaWdiX3JpbmcgKnJpbmcsCiAJCQkJICAgICAgIHUzMiBzdGF0dXNfZXJyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNTc4OCw3ICs1ODEwLDYgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgc3RhdGVycjsKIAl1MTYgbGVuZ3RoOwotCXUxNiB2bGFuX3RhZzsKIAogCWkgPSByeF9yaW5nLT5uZXh0X3RvX2NsZWFuOwogCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwpAQCAtNTg3MywxMCArNTg5NCwxMiBAQAogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOwogCQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcnhfcmluZy0+cXVldWVfaW5kZXgpOwogCi0JCXZsYW5fdGFnID0gKChzdGF0ZXJyICYgRTEwMDBfUlhEX1NUQVRfVlApID8KLQkJICAgICAgICAgICAgbGUxNl90b19jcHUocnhfZGVzYy0+d2IudXBwZXIudmxhbikgOiAwKTsKKwkJaWYgKHN0YXRlcnIgJiBFMTAwMF9SWERfU1RBVF9WUCkgeworCQkJdTE2IHZpZCA9IGxlMTZfdG9fY3B1KHJ4X2Rlc2MtPndiLnVwcGVyLnZsYW4pOwogCi0JCWlnYl9yZWNlaXZlX3NrYihxX3ZlY3Rvciwgc2tiLCB2bGFuX3RhZyk7CisJCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdmlkKTsKKwkJfQorCQluYXBpX2dyb19yZWNlaXZlKCZxX3ZlY3Rvci0+bmFwaSwgc2tiKTsKIAogbmV4dF9kZXNjOgogCQlyeF9kZXNjLT53Yi51cHBlci5zdGF0dXNfZXJyb3IgPSAwOwpAQCAtNjI0Niw3ICs2MjY5LDcgQEAKIAlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBody0+YmFjazsKIAl1MTYgY2FwX29mZnNldDsKIAotCWNhcF9vZmZzZXQgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGFkYXB0ZXItPnBkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwljYXBfb2Zmc2V0ID0gYWRhcHRlci0+cGRldi0+cGNpZV9jYXA7CiAJaWYgKCFjYXBfb2Zmc2V0KQogCQlyZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CiAKQEAgLTYyNjAsNyArNjI4Myw3IEBACiAJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gaHctPmJhY2s7CiAJdTE2IGNhcF9vZmZzZXQ7CiAKLQljYXBfb2Zmc2V0ID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShhZGFwdGVyLT5wZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJY2FwX29mZnNldCA9IGFkYXB0ZXItPnBkZXYtPnBjaWVfY2FwOwogCWlmICghY2FwX29mZnNldCkKIAkJcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOwogCkBAIC02MjY5LDE3ICs2MjkyLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGlnYl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCitzdGF0aWMgdm9pZCBpZ2Jfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJdTMyIGN0cmwsIHJjdGw7CiAKIAlpZ2JfaXJxX2Rpc2FibGUoYWRhcHRlcik7Ci0JYWRhcHRlci0+dmxncnAgPSBncnA7CiAKLQlpZiAoZ3JwKSB7CisJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKSB7CiAJCS8qIGVuYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KIAkJY3RybCA9IHJkMzIoRTEwMDBfQ1RSTCk7CiAJCWN0cmwgfD0gRTEwMDBfQ1RSTF9WTUU7CkBAIC02MzEzLDYgKzYzMzQsOCBAQAogCiAJLyogYWRkIHRoZSBmaWx0ZXIgc2luY2UgUEYgY2FuIHJlY2VpdmUgdmxhbnMgdy9vIGVudHJ5IGluIHZsdmYgKi8KIAlpZ2JfdmZ0YV9zZXQoaHcsIHZpZCwgdHJ1ZSk7CisKKwlzZXRfYml0KHZpZCwgYWRhcHRlci0+YWN0aXZlX3ZsYW5zKTsKIH0KIAogc3RhdGljIHZvaWQgaWdiX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKQEAgLTYzMjMsNyArNjM0Niw2IEBACiAJczMyIGVycjsKIAogCWlnYl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKLQl2bGFuX2dyb3VwX3NldF9kZXZpY2UoYWRhcHRlci0+dmxncnAsIHZpZCwgTlVMTCk7CiAKIAlpZiAoIXRlc3RfYml0KF9fSUdCX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpCiAJCWlnYl9pcnFfZW5hYmxlKGFkYXB0ZXIpOwpAQCAtNjMzNCwyMCArNjM1NiwxNiBAQAogCS8qIGlmIHZpZCB3YXMgbm90IHByZXNlbnQgaW4gVkxWRiBqdXN0IHJlbW92ZSBpdCBmcm9tIHRhYmxlICovCiAJaWYgKGVycikKIAkJaWdiX3ZmdGFfc2V0KGh3LCB2aWQsIGZhbHNlKTsKKworCWNsZWFyX2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucyk7CiB9CiAKIHN0YXRpYyB2b2lkIGlnYl9yZXN0b3JlX3ZsYW4oc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyKQogewotCWlnYl92bGFuX3J4X3JlZ2lzdGVyKGFkYXB0ZXItPm5ldGRldiwgYWRhcHRlci0+dmxncnApOworCXUxNiB2aWQ7CiAKLQlpZiAoYWRhcHRlci0+dmxncnApIHsKLQkJdTE2IHZpZDsKLQkJZm9yICh2aWQgPSAwOyB2aWQgPCBWTEFOX05fVklEOyB2aWQrKykgewotCQkJaWYgKCF2bGFuX2dyb3VwX2dldF9kZXZpY2UoYWRhcHRlci0+dmxncnAsIHZpZCkpCi0JCQkJY29udGludWU7Ci0JCQlpZ2Jfdmxhbl9yeF9hZGRfdmlkKGFkYXB0ZXItPm5ldGRldiwgdmlkKTsKLQkJfQotCX0KKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgYWRhcHRlci0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKQorCQlpZ2Jfdmxhbl9yeF9hZGRfdmlkKGFkYXB0ZXItPm5ldGRldiwgdmlkKTsKIH0KIAogaW50IGlnYl9zZXRfc3BkX2RwbHgoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLCB1MzIgc3BkLCB1OCBkcGx4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdidmYvaWdidmYuaCBiL2RyaXZlcnMvbmV0L2lnYnZmL2lnYnZmLmgKaW5kZXggZDVkYWQ1ZC4uZmQ0YTdiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdidmYvaWdidmYuaAorKysgYi9kcml2ZXJzL25ldC9pZ2J2Zi9pZ2J2Zi5oCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotCisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogCiAjaW5jbHVkZSAidmYuaCIKIApAQCAtMTczLDcgKzE3Myw3IEBACiAKIAljb25zdCBzdHJ1Y3QgaWdidmZfaW5mbyAqZWk7CiAKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CisJdW5zaWduZWQgbG9uZyBhY3RpdmVfdmxhbnNbQklUU19UT19MT05HUyhWTEFOX05fVklEKV07CiAJdTMyIGJkX251bWJlcjsKIAl1MzIgcnhfYnVmZmVyX2xlbjsKIAl1MzIgcG9sbGluZ19pbnRlcnZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYnZmL25ldGRldi5jIGIvZHJpdmVycy9uZXQvaWdidmYvbmV0ZGV2LmMKaW5kZXggMWM3N2ZiMy4uMTMzMGM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdidmYvbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvaWdidmYvbmV0ZGV2LmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogI2luY2x1ZGUgImlnYnZmLmgiCiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjEuMC44LWswIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMi4wLjAtayIKIGNoYXIgaWdidmZfZHJpdmVyX25hbWVbXSA9ICJpZ2J2ZiI7CiBjb25zdCBjaGFyIGlnYnZmX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKIHN0YXRpYyBjb25zdCBjaGFyIGlnYnZmX2RyaXZlcl9zdHJpbmdbXSA9CkBAIC0xMDAsMTIgKzEwMCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBzdGF0dXMsIHUxNiB2bGFuKQogewotCWlmIChhZGFwdGVyLT52bGdycCAmJiAoc3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfVlApKQotCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBhZGFwdGVyLT52bGdycCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIGxlMTZfdG9fY3B1KHZsYW4pICYKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX1JYRF9TUENfVkxBTl9NQVNLKTsKLQllbHNlCi0JCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJaWYgKHN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX1ZQKSB7CisJCXUxNiB2aWQgPSBsZTE2X3RvX2NwdSh2bGFuKSAmIEUxMDAwX1JYRF9TUENfVkxBTl9NQVNLOworCisJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2aWQpOworCX0KKwluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaWdidmZfcnhfY2hlY2tzdW1fYWR2KHN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyLApAQCAtMTE2NywxMiArMTE2NywxMCBAQAogICovCiBzdGF0aWMgdm9pZCBpZ2J2Zl9zZXRfcmxwbWwoc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaW50IG1heF9mcmFtZV9zaXplID0gYWRhcHRlci0+bWF4X2ZyYW1lX3NpemU7CisJaW50IG1heF9mcmFtZV9zaXplOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKLQlpZiAoYWRhcHRlci0+dmxncnApCi0JCW1heF9mcmFtZV9zaXplICs9IFZMQU5fVEFHX1NJWkU7Ci0KKwltYXhfZnJhbWVfc2l6ZSA9IGFkYXB0ZXItPm1heF9mcmFtZV9zaXplICsgVkxBTl9UQUdfU0laRTsKIAllMTAwMF9ybHBtbF9zZXRfdmYoaHcsIG1heF9mcmFtZV9zaXplKTsKIH0KIApAQCAtMTE4Myw2ICsxMTgxLDggQEAKIAogCWlmIChody0+bWFjLm9wcy5zZXRfdmZ0YShodywgdmlkLCB0cnVlKSkKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFkZCB2bGFuIGlkICVkXG4iLCB2aWQpOworCWVsc2UKKwkJc2V0X2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucyk7CiB9CiAKIHN0YXRpYyB2b2lkIGlnYnZmX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKQEAgLTExOTEsNyArMTE5MSw2IEBACiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAogCWlnYnZmX2lycV9kaXNhYmxlKGFkYXB0ZXIpOwotCXZsYW5fZ3JvdXBfc2V0X2RldmljZShhZGFwdGVyLT52bGdycCwgdmlkLCBOVUxMKTsKIAogCWlmICghdGVzdF9iaXQoX19JR0JWRl9ET1dOLCAmYWRhcHRlci0+c3RhdGUpKQogCQlpZ2J2Zl9pcnFfZW5hYmxlKGFkYXB0ZXIpOwpAQCAtMTE5OSwzMCArMTE5OCwxNiBAQAogCWlmIChody0+bWFjLm9wcy5zZXRfdmZ0YShodywgdmlkLCBmYWxzZSkpCiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJICAgICAgICAiRmFpbGVkIHRvIHJlbW92ZSB2bGFuIGlkICVkXG4iLCB2aWQpOwotfQotCi1zdGF0aWMgdm9pZCBpZ2J2Zl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYWRhcHRlci0+dmxncnAgPSBncnA7CisJZWxzZQorCQljbGVhcl9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOwogfQogCiBzdGF0aWMgdm9pZCBpZ2J2Zl9yZXN0b3JlX3ZsYW4oc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdTE2IHZpZDsKIAotCWlmICghYWRhcHRlci0+dmxncnApCi0JCXJldHVybjsKLQotCWZvciAodmlkID0gMDsgdmlkIDwgVkxBTl9OX1ZJRDsgdmlkKyspIHsKLQkJaWYgKCF2bGFuX2dyb3VwX2dldF9kZXZpY2UoYWRhcHRlci0+dmxncnAsIHZpZCkpCi0JCQljb250aW51ZTsKKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgYWRhcHRlci0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKQogCQlpZ2J2Zl92bGFuX3J4X2FkZF92aWQoYWRhcHRlci0+bmV0ZGV2LCB2aWQpOwotCX0KLQotCWlnYnZmX3NldF9ybHBtbChhZGFwdGVyKTsKIH0KIAogLyoqCkBAIC0yMjAzLDcgKzIxODgsNyBAQAogCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAJfQogCi0JaWYgKGFkYXB0ZXItPnZsZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCWlmICh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKIAkJdHhfZmxhZ3MgfD0gSUdCVkZfVFhfRkxBR1NfVkxBTjsKIAkJdHhfZmxhZ3MgfD0gKHZsYW5fdHhfdGFnX2dldChza2IpIDw8IElHQlZGX1RYX0ZMQUdTX1ZMQU5fU0hJRlQpOwogCX0KQEAgLTI1NTYsNyArMjU0MSw2IEBACiAJLm5kb19jaGFuZ2VfbXR1ICAgICAgICAgICAgICAgICA9IGlnYnZmX2NoYW5nZV9tdHUsCiAJLm5kb19kb19pb2N0bCAgICAgICAgICAgICAgICAgICA9IGlnYnZmX2lvY3RsLAogCS5uZG9fdHhfdGltZW91dCAgICAgICAgICAgICAgICAgPSBpZ2J2Zl90eF90aW1lb3V0LAotCS5uZG9fdmxhbl9yeF9yZWdpc3RlciAgICAgICAgICAgPSBpZ2J2Zl92bGFuX3J4X3JlZ2lzdGVyLAogCS5uZG9fdmxhbl9yeF9hZGRfdmlkICAgICAgICAgICAgPSBpZ2J2Zl92bGFuX3J4X2FkZF92aWQsCiAJLm5kb192bGFuX3J4X2tpbGxfdmlkICAgICAgICAgICA9IGlnYnZmX3ZsYW5fcnhfa2lsbF92aWQsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMgYi9kcml2ZXJzL25ldC9pb2MzLWV0aC5jCmluZGV4IDMyZjA3ZjguLmEyMzRlNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvaW9jMy1ldGguYwpAQCAtNTMyLDcgKzUzMiw3IEBACiAJCXJldHVybjsKIAogCWloID0gKHN0cnVjdCBpcGhkciAqKSAoKGNoYXIgKillaCArIEVUSF9ITEVOKTsKLQlpZiAoaWgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKQorCWlmIChpcF9pc19mcmFnbWVudChpaCkpCiAJCXJldHVybjsKIAogCXByb3RvID0gaWgtPnByb3RvY29sOwpAQCAtMTY2NCwxMiArMTY2NCw3IEBACiAJCQlpcC0+ZWhhcl9sID0gMHhmZmZmZmZmZjsKIAkJfSBlbHNlIHsKIAkJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKLQkJCQljaGFyICphZGRyID0gaGEtPmFkZHI7Ci0KLQkJCQlpZiAoISgqYWRkciAmIDEpKQotCQkJCQljb250aW51ZTsKLQotCQkJCWVoYXIgfD0gKDFVTCA8PCBpb2MzX2hhc2goYWRkcikpOworCQkJCWVoYXIgfD0gKDFVTCA8PCBpb2MzX2hhc2goaGEtPmFkZHIpKTsKIAkJCX0KIAkJCWlwLT5laGFyX2ggPSBlaGFyID4+IDMyOwogCQkJaXAtPmVoYXJfbCA9IGVoYXIgJiAweGZmZmZmZmZmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXBnLmMgYi9kcml2ZXJzL25ldC9pcGcuYwppbmRleCA1OGNkMzIwLi5kNGFhNDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcGcuYworKysgYi9kcml2ZXJzL25ldC9pcGcuYwpAQCAtMjIsNiArMjIsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYwppbmRleCBkNTMyZGRlLi45NjMwNjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMKaW5kZXggMTc0Y2FmYS4uYjQ1YjJjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuYwpAQCAtMTUyLDYgKzE1Miw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmMgYi9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmMKaW5kZXggN2E5NjNkNC4uYjU2NjM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYwpAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCmluZGV4IDAwMWVkMGEuLmQwODUxZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCkBAIC0xMiw2ICsxMiw4IEBACiAgKiBJbmZyYS1yZWQgZHJpdmVyIChTSVIvRklSKSBmb3IgdGhlIFBYQTJ4eCBlbWJlZGRlZCBtaWNyb3Byb2Nlc3NvcgogICoKICAqLworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2Rldi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMKaW5kZXggZWZlMDViYi4uNTAzOWYwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMKQEAgLTExLDYgKzExLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAogCisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKaW5kZXggODgwMGUxZi4uOTU0ZjZlOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CkBAIC01MTUsNyArNTE2LDcgQEAKICAqICAgIFRyeSB0byBvcGVuIGRyaXZlciBpbnN0YW5jZQogICoKICAqLwotc3RhdGljIGludCBfX2luaXQgc21zY19pcmNjX29wZW4odW5zaWduZWQgaW50IGZpcl9iYXNlLCB1bnNpZ25lZCBpbnQgc2lyX2Jhc2UsIHU4IGRtYSwgdTggaXJxKQorc3RhdGljIGludCBfX2RldmluaXQgc21zY19pcmNjX29wZW4odW5zaWduZWQgaW50IGZpcl9iYXNlLCB1bnNpZ25lZCBpbnQgc2lyX2Jhc2UsIHU4IGRtYSwgdTggaXJxKQogewogCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdG9pbTMyMzItc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3RvaW0zMjMyLXNpci5jCmluZGV4IDk5ZTFlYzAuLjE5YWQ0NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdG9pbTMyMzItc2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS90b2ltMzIzMi1zaXIuYwpAQCAtNzgsNyArNzgsNyBAQAogICogVGFyZ2V0IGhhcmR3YXJlOiBJUldhdmUgSVIzMjBTVC0yCiAgKgogICogCVRoZSBJUldhdmUgSVIzMjBTVC0yIGlzIGEgc2ltcGxlIGRvbmdsZSBiYXNlZCBvbiB0aGUgVmlzaGF5L1RlbWljCi0gKiAJVE9JTTMyMzIgU0lSIEVuZGVjIGFuZCB0aGUgVmlzaGF5L1RlbWljIFRGRFM0NTAwIFNJUiBJUkRBIHRyYW5zY2lldmVyLgorICogCVRPSU0zMjMyIFNJUiBFbmRlYyBhbmQgdGhlIFZpc2hheS9UZW1pYyBURkRTNDUwMCBTSVIgSVJEQSB0cmFuc2NlaXZlci4KICAqIAlJdCB1c2VzIGEgaGV4IGludmVydGVyIGFuZCBzb21lIGRpc2NyZXRlIGNvbXBvbmVudHMgdG8gYnVmZmVyIGFuZAogICogCWxpbmUgY29udmVydCB0aGUgUlMyMzIgZG93biB0byA1Vi4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmMgYi9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmMKaW5kZXggZjUwNGIyNi4uNmQ2NDc5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmggYi9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmgKaW5kZXggYzZmNTg0OC4uZjkwM2E2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuaApAQCAtMjEwLDcgKzIxMCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwotCX07CQkJLy9Td2l0Y2gKKwl9CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFJlYWRMUENSZWcoaW50IGlSZWdOdW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCmluZGV4IGMzZDA3MzguLjkwMjFkMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCkBAIC0zNiw2ICszNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jCmluZGV4IDFmOWMzZjA4Li5jNDM2NjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKaW5kZXggOWVjZTFmZC4uNTNkZDM5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKQEAgLTUzOCw3ICs1MzgsNyBAQAogCWRlZmF1bHQ6CiAJCXZldGhfZXJyb3IoIlVua25vd24gYWNrIHR5cGUgJWQgZnJvbSBMUEFSICVkLlxuIiwKIAkJCQlldmVudC0+YmFzZV9ldmVudC54U3VidHlwZSwgcmxwKTsKLQl9OworCX0KIH0KIAogc3RhdGljIHZvaWQgdmV0aF9oYW5kbGVfaW50KHN0cnVjdCB2ZXRoX2xwZXZlbnQgKmV2ZW50KQpAQCAtNTg0LDcgKzU4NCw3IEBACiAJZGVmYXVsdDoKIAkJdmV0aF9lcnJvcigiVW5rbm93biBpbnRlcnJ1cHQgdHlwZSAlZCBmcm9tIExQQVIgJWQuXG4iLAogCQkJCWV2ZW50LT5iYXNlX2V2ZW50LnhTdWJ0eXBlLCBybHApOwotCX07CisJfQogfQogCiBzdGF0aWMgdm9pZCB2ZXRoX2hhbmRsZV9ldmVudChzdHJ1Y3QgSHZMcEV2ZW50ICpldmVudCkKQEAgLTk2NCwxMSArOTY0LDkgQEAKIAkJCXU4ICphZGRyID0gaGEtPmFkZHI7CiAJCQl1NjQgeGFkZHIgPSAwOwogCi0JCQlpZiAoYWRkclswXSAmIDB4MDEpIHsvKiBtdWx0aWNhc3QgYWRkcmVzcz8gKi8KLQkJCQltZW1jcHkoJnhhZGRyLCBhZGRyLCBFVEhfQUxFTik7Ci0JCQkJcG9ydC0+bWNhc3RfYWRkcltwb3J0LT5udW1fbWNhc3RdID0geGFkZHI7Ci0JCQkJcG9ydC0+bnVtX21jYXN0Kys7Ci0JCQl9CisJCQltZW1jcHkoJnhhZGRyLCBhZGRyLCBFVEhfQUxFTik7CisJCQlwb3J0LT5tY2FzdF9hZGRyW3BvcnQtPm51bV9tY2FzdF0gPSB4YWRkcjsKKwkJCXBvcnQtPm51bV9tY2FzdCsrOwogCQl9CiAJfQogCkBAIC0xMTg0LDcgKzExODIsNyBAQAogCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCUh2THBJbmRleE1hcCBscG1hc2s7CiAKLQlpZiAoISAoZnJhbWVbMF0gJiAweDAxKSkgeworCWlmIChpc191bmljYXN0X2V0aGVyX2FkZHIoZnJhbWUpKSB7CiAJCS8qIHVuaWNhc3QgcGFja2V0ICovCiAJCUh2THBJbmRleCBybHAgPSBmcmFtZVs1XTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmUuaCBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlLmgKaW5kZXggZTQ2N2IyMC4uZTA0YThlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmUuaAorKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZS5oCkBAIC0xMzEsNiArMTMxLDEzIEBACiAJdTggdmZfbWFjdmxhbltFVEhfQUxFTl07CiB9OwogCisjZGVmaW5lIElYR0JFX01BWF9UWERfUFdSCTE0CisjZGVmaW5lIElYR0JFX01BWF9EQVRBX1BFUl9UWEQJKDEgPDwgSVhHQkVfTUFYX1RYRF9QV1IpCisKKy8qIFR4IERlc2NyaXB0b3JzIG5lZWRlZCwgd29yc3QgY2FzZSAqLworI2RlZmluZSBUWERfVVNFX0NPVU5UKFMpIERJVl9ST1VORF9VUCgoUyksIElYR0JFX01BWF9EQVRBX1BFUl9UWEQpCisjZGVmaW5lIERFU0NfTkVFREVEICgoTUFYX1NLQl9GUkFHUyAqIFRYRF9VU0VfQ09VTlQoUEFHRV9TSVpFKSkgKyA0KQorCiAvKiB3cmFwcGVyIGFyb3VuZCBhIHBvaW50ZXIgdG8gYSBzb2NrZXQgYnVmZmVyLAogICogc28gYSBETUEgaGFuZGxlIGNhbiBiZSBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgYnVmZmVyICovCiBzdHJ1Y3QgaXhnYmVfdHhfYnVmZmVyIHsKQEAgLTIwNywxMiArMjE0LDEwIEBACiAJCXN0cnVjdCBpeGdiZV9yeF9idWZmZXIgKnJ4X2J1ZmZlcl9pbmZvOwogCX07CiAJdW5zaWduZWQgbG9uZyBzdGF0ZTsKLQl1OCBhdHJfc2FtcGxlX3JhdGU7Ci0JdTggYXRyX2NvdW50OworCXU4IF9faW9tZW0gKnRhaWw7CisKIAl1MTYgY291bnQ7CQkJLyogYW1vdW50IG9mIGRlc2NyaXB0b3JzICovCiAJdTE2IHJ4X2J1Zl9sZW47Ci0JdTE2IG5leHRfdG9fdXNlOwotCXUxNiBuZXh0X3RvX2NsZWFuOwogCiAJdTggcXVldWVfaW5kZXg7IC8qIG5lZWRlZCBmb3IgbXVsdGlxdWV1ZSBxdWV1ZSBtYW5hZ2VtZW50ICovCiAJdTggcmVnX2lkeDsJCQkvKiBob2xkcyB0aGUgc3BlY2lhbCB2YWx1ZSB0aGF0IGdldHMKQEAgLTIyMCwxNSArMjI1LDEzIEBACiAJCQkJCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpbmcsIHdoaWNoIGlzCiAJCQkJCSAqIGRpZmZlcmVudCBmb3IgRENCIGFuZCBSU1MgbW9kZXMKIAkJCQkJICovCisJdTggYXRyX3NhbXBsZV9yYXRlOworCXU4IGF0cl9jb3VudDsKKworCXUxNiBuZXh0X3RvX3VzZTsKKwl1MTYgbmV4dF90b19jbGVhbjsKKwogCXU4IGRjYl90YzsKLQotCXUxNiB3b3JrX2xpbWl0OwkJCS8qIG1heCB3b3JrIHBlciBpbnRlcnJ1cHQgKi8KLQotCXU4IF9faW9tZW0gKnRhaWw7Ci0KLQl1bnNpZ25lZCBpbnQgdG90YWxfYnl0ZXM7Ci0JdW5zaWduZWQgaW50IHRvdGFsX3BhY2tldHM7Ci0KIAlzdHJ1Y3QgaXhnYmVfcXVldWVfc3RhdHMgc3RhdHM7CiAJc3RydWN0IHU2NF9zdGF0c19zeW5jIHN5bmNwOwogCXVuaW9uIHsKQEAgLTI0NCw3ICsyNDcsNiBAQAogCiBlbnVtIGl4Z2JlX3JpbmdfZl9lbnVtIHsKIAlSSU5HX0ZfTk9ORSA9IDAsCi0JUklOR19GX0RDQiwKIAlSSU5HX0ZfVk1EUSwgIC8qIFNSLUlPViB1c2VzIHRoZSBzYW1lIHJpbmcgZmVhdHVyZSAqLwogCVJJTkdfRl9SU1MsCiAJUklOR19GX0ZESVIsCkBAIC0yNTUsNyArMjU3LDYgQEAKIAlSSU5HX0ZfQVJSQVlfU0laRSAgICAgIC8qIG11c3QgYmUgbGFzdCBpbiBlbnVtIHNldCAqLwogfTsKIAotI2RlZmluZSBJWEdCRV9NQVhfRENCX0lORElDRVMgIDY0CiAjZGVmaW5lIElYR0JFX01BWF9SU1NfSU5ESUNFUyAgMTYKICNkZWZpbmUgSVhHQkVfTUFYX1ZNRFFfSU5ESUNFUyA2NAogI2RlZmluZSBJWEdCRV9NQVhfRkRJUl9JTkRJQ0VTIDY0CkBAIC0yNzIsNiArMjczLDE4IEBACiAJaW50IG1hc2s7CiB9IF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXA7CiAKK3N0cnVjdCBpeGdiZV9yaW5nX2NvbnRhaW5lciB7CisjaWYgTUFYX1JYX1FVRVVFUyA+IE1BWF9UWF9RVUVVRVMKKwlERUNMQVJFX0JJVE1BUChpZHgsIE1BWF9SWF9RVUVVRVMpOworI2Vsc2UKKwlERUNMQVJFX0JJVE1BUChpZHgsIE1BWF9UWF9RVUVVRVMpOworI2VuZGlmCisJdW5zaWduZWQgaW50IHRvdGFsX2J5dGVzOwkvKiB0b3RhbCBieXRlcyBwcm9jZXNzZWQgdGhpcyBpbnQgKi8KKwl1bnNpZ25lZCBpbnQgdG90YWxfcGFja2V0czsJLyogdG90YWwgcGFja2V0cyBwcm9jZXNzZWQgdGhpcyBpbnQgKi8KKwl1MTYgd29ya19saW1pdDsJCQkvKiB0b3RhbCB3b3JrIGFsbG93ZWQgcGVyIGludGVycnVwdCAqLworCXU4IGNvdW50OwkJCS8qIHRvdGFsIG51bWJlciBvZiByaW5ncyBpbiB2ZWN0b3IgKi8KKwl1OCBpdHI7CQkJCS8qIGN1cnJlbnQgSVRSIHNldHRpbmcgZm9yIHJpbmcgKi8KK307CiAKICNkZWZpbmUgTUFYX1JYX1BBQ0tFVF9CVUZGRVJTICgoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0RDQl9FTkFCTEVEKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDggOiAxKQpAQCAtMjg5LDEyICszMDIsNyBAQAogCWludCBjcHU7CSAgICAvKiBDUFUgZm9yIERDQSAqLwogI2VuZGlmCiAJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7Ci0JREVDTEFSRV9CSVRNQVAocnhyX2lkeCwgTUFYX1JYX1FVRVVFUyk7IC8qIFJ4IHJpbmcgaW5kaWNlcyAqLwotCURFQ0xBUkVfQklUTUFQKHR4cl9pZHgsIE1BWF9UWF9RVUVVRVMpOyAvKiBUeCByaW5nIGluZGljZXMgKi8KLQl1OCByeHJfY291bnQ7ICAgICAvKiBSeCByaW5nIGNvdW50IGFzc2lnbmVkIHRvIHRoaXMgdmVjdG9yICovCi0JdTggdHhyX2NvdW50OyAgICAgLyogVHggcmluZyBjb3VudCBhc3NpZ25lZCB0byB0aGlzIHZlY3RvciAqLwotCXU4IHR4X2l0cjsKLQl1OCByeF9pdHI7CisJc3RydWN0IGl4Z2JlX3JpbmdfY29udGFpbmVyIHJ4LCB0eDsKIAl1MzIgZWl0cjsKIAljcHVtYXNrX3Zhcl90IGFmZmluaXR5X21hc2s7CiAJY2hhciBuYW1lW0lGTkFNU0laICsgOV07CkBAIC0zMDgsOSArMzE2LDEzIEBACiAJKChfZWl0cikgPyAoMTAwMDAwMDAwMCAvICgoX2VpdHIpICogMjU2KSkgOiA4KQogI2RlZmluZSBFSVRSX1JFR19UT19JTlRTX1BFUl9TRUMgRUlUUl9JTlRTX1BFUl9TRUNfVE9fUkVHCiAKLSNkZWZpbmUgSVhHQkVfREVTQ19VTlVTRUQoUikgXAotCSgoKChSKS0+bmV4dF90b19jbGVhbiA+IChSKS0+bmV4dF90b191c2UpID8gMCA6IChSKS0+Y291bnQpICsgXAotCShSKS0+bmV4dF90b19jbGVhbiAtIChSKS0+bmV4dF90b191c2UgLSAxKQorc3RhdGljIGlubGluZSB1MTYgaXhnYmVfZGVzY191bnVzZWQoc3RydWN0IGl4Z2JlX3JpbmcgKnJpbmcpCit7CisJdTE2IG50YyA9IHJpbmctPm5leHRfdG9fY2xlYW47CisJdTE2IG50dSA9IHJpbmctPm5leHRfdG9fdXNlOworCisJcmV0dXJuICgobnRjID4gbnR1KSA/IDAgOiByaW5nLT5jb3VudCkgKyBudGMgLSBudHUgLSAxOworfQogCiAjZGVmaW5lIElYR0JFX1JYX0RFU0NfQURWKFIsIGkpCSAgICBcCiAJKCYoKCh1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqKSgoUiktPmRlc2MpKVtpXSkpCkBAIC00MDQsNiArNDE2LDkgQEAKIAl1MTYgZWl0cl9sb3c7CiAJdTE2IGVpdHJfaGlnaDsKIAorCS8qIFdvcmsgbGltaXRzICovCisJdTE2IHR4X3dvcmtfbGltaXQ7CisKIAkvKiBUWCAqLwogCXN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nW01BWF9UWF9RVUVVRVNdIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiAJaW50IG51bV90eF9xdWV1ZXM7CkBAIC00ODQsNiArNDk5LDE3IEBACiAJc3RydWN0IHZmX21hY3ZsYW5zIHZmX212czsKIAlzdHJ1Y3QgdmZfbWFjdmxhbnMgKm12X2xpc3Q7CiAJYm9vbCBhbnRpc3Bvb2ZpbmdfZW5hYmxlZDsKKworCXN0cnVjdCBobGlzdF9oZWFkIGZkaXJfZmlsdGVyX2xpc3Q7CisJdW5pb24gaXhnYmVfYXRyX2lucHV0IGZkaXJfbWFzazsKKwlpbnQgZmRpcl9maWx0ZXJfY291bnQ7Cit9OworCitzdHJ1Y3QgaXhnYmVfZmRpcl9maWx0ZXIgeworCXN0cnVjdCBobGlzdF9ub2RlIGZkaXJfbm9kZTsKKwl1bmlvbiBpeGdiZV9hdHJfaW5wdXQgZmlsdGVyOworCXUxNiBzd19pZHg7CisJdTE2IGFjdGlvbjsKIH07CiAKIGVudW0gaXhiZ2Vfc3RhdGVfdCB7CkBAIC01NDUsMzEgKzU3MSwzNSBAQAogZXh0ZXJuIHZvaWQgaXhnYmVfd3JpdGVfZWl0cihzdHJ1Y3QgaXhnYmVfcV92ZWN0b3IgKik7CiBleHRlcm4gaW50IGV0aHRvb2xfaW9jdGwoc3RydWN0IGlmcmVxICppZnIpOwogZXh0ZXJuIHMzMiBpeGdiZV9yZWluaXRfZmRpcl90YWJsZXNfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodyk7Ci1leHRlcm4gczMyIGl4Z2JlX2luaXRfZmRpcl9zaWduYXR1cmVfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHBiYWxsb2MpOwotZXh0ZXJuIHMzMiBpeGdiZV9pbml0X2ZkaXJfcGVyZmVjdF84MjU5OShzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcGJhbGxvYyk7CitleHRlcm4gczMyIGl4Z2JlX2luaXRfZmRpcl9zaWduYXR1cmVfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGZkaXJjdHJsKTsKK2V4dGVybiBzMzIgaXhnYmVfaW5pdF9mZGlyX3BlcmZlY3RfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGZkaXJjdHJsKTsKIGV4dGVybiBzMzIgaXhnYmVfZmRpcl9hZGRfc2lnbmF0dXJlX2ZpbHRlcl84MjU5OShzdHJ1Y3QgaXhnYmVfaHcgKmh3LAogCQkJCQkJIHVuaW9uIGl4Z2JlX2F0cl9oYXNoX2R3b3JkIGlucHV0LAogCQkJCQkJIHVuaW9uIGl4Z2JlX2F0cl9oYXNoX2R3b3JkIGNvbW1vbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBxdWV1ZSk7Ci1leHRlcm4gczMyIGl4Z2JlX2ZkaXJfYWRkX3BlcmZlY3RfZmlsdGVyXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl4Z2JlX2F0cl9pbnB1dCAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9hdHJfaW5wdXRfbWFza3MgKmlucHV0X21hc2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgc29mdF9pZCwgdTggcXVldWUpOwotZXh0ZXJuIHZvaWQgaXhnYmVfY29uZmlndXJlX3JzY2N0bChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl4Z2JlX3JpbmcgKnJpbmcpOwotZXh0ZXJuIHZvaWQgaXhnYmVfY2xlYXJfcnNjY3RsKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICpyaW5nKTsKK2V4dGVybiBzMzIgaXhnYmVfZmRpcl9zZXRfaW5wdXRfbWFza184MjU5OShzdHJ1Y3QgaXhnYmVfaHcgKmh3LAorCQkJCQkgICB1bmlvbiBpeGdiZV9hdHJfaW5wdXQgKmlucHV0X21hc2spOworZXh0ZXJuIHMzMiBpeGdiZV9mZGlyX3dyaXRlX3BlcmZlY3RfZmlsdGVyXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsCisJCQkJCQkgdW5pb24gaXhnYmVfYXRyX2lucHV0ICppbnB1dCwKKwkJCQkJCSB1MTYgc29mdF9pZCwgdTggcXVldWUpOworZXh0ZXJuIHMzMiBpeGdiZV9mZGlyX2VyYXNlX3BlcmZlY3RfZmlsdGVyXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsCisJCQkJCQkgdW5pb24gaXhnYmVfYXRyX2lucHV0ICppbnB1dCwKKwkJCQkJCSB1MTYgc29mdF9pZCk7CitleHRlcm4gdm9pZCBpeGdiZV9hdHJfY29tcHV0ZV9wZXJmZWN0X2hhc2hfODI1OTkodW5pb24gaXhnYmVfYXRyX2lucHV0ICppbnB1dCwKKwkJCQkJCSB1bmlvbiBpeGdiZV9hdHJfaW5wdXQgKm1hc2spOwogZXh0ZXJuIHZvaWQgaXhnYmVfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBleHRlcm4gaW50IGl4Z2JlX3NldHVwX3RjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHRjKTsKK2V4dGVybiB2b2lkIGl4Z2JlX3R4X2N0eHRkZXNjKHN0cnVjdCBpeGdiZV9yaW5nICosIHUzMiwgdTMyLCB1MzIsIHUzMik7CitleHRlcm4gdm9pZCBpeGdiZV9kb19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKICNpZmRlZiBJWEdCRV9GQ09FCiBleHRlcm4gdm9pZCBpeGdiZV9jb25maWd1cmVfZmNvZShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcik7Ci1leHRlcm4gaW50IGl4Z2JlX2ZzbyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorZXh0ZXJuIGludCBpeGdiZV9mc28oc3RydWN0IGl4Z2JlX3JpbmcgKnR4X3JpbmcsIHN0cnVjdCBza19idWZmICpza2IsCiAgICAgICAgICAgICAgICAgICAgICB1MzIgdHhfZmxhZ3MsIHU4ICpoZHJfbGVuKTsKIGV4dGVybiB2b2lkIGl4Z2JlX2NsZWFudXBfZmNvZShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcik7CiBleHRlcm4gaW50IGl4Z2JlX2Zjb2VfZGRwKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqcnhfZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJCQkgIHVuaW9uIGl4Z2JlX2Fkdl9yeF9kZXNjICpyeF9kZXNjLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICB1MzIgc3RhdGVycik7CiBleHRlcm4gaW50IGl4Z2JlX2Zjb2VfZGRwX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgeGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBzZ2MpOwogZXh0ZXJuIGludCBpeGdiZV9mY29lX2RkcF90YXJnZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHhpZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk4LmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV84MjU5OC5jCmluZGV4IDgxNzllNTAuLjBkNGUzODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk4LmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTguYwpAQCAtMTI0Miw2ICsxMjQyLDQ3IEBACiAJfQogfQogCisvKioKKyAqIGl4Z2JlX3NldF9yeHBiYV84MjU5OCAtIENvbmZpZ3VyZSBwYWNrZXQgYnVmZmVycworICogQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICogQGRjYl9jb25maWc6IHBvaW50ZXIgdG8gaXhnYmVfZGNiX2NvbmZpZyBzdHJ1Y3R1cmUKKyAqCisgKiBDb25maWd1cmUgcGFja2V0IGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGl4Z2JlX3NldF9yeHBiYV84MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCBpbnQgbnVtX3BiLCB1MzIgaGVhZHJvb20sCisJCQkJICBpbnQgc3RyYXRlZ3kpCit7CisJdTMyIHJ4cGt0c2l6ZSA9IElYR0JFX1JYUEJTSVpFXzY0S0I7CisJdTggIGkgPSAwOworCisJaWYgKCFudW1fcGIpCisJCXJldHVybjsKKworCS8qIFNldHVwIFJ4IHBhY2tldCBidWZmZXIgc2l6ZXMgKi8KKwlzd2l0Y2ggKHN0cmF0ZWd5KSB7CisJY2FzZSBQQkFfU1RSQVRFR1lfV0VJR0hURUQ6CisJCS8qIFNldHVwIHRoZSBmaXJzdCBmb3VyIGF0IDgwS0IgKi8KKwkJcnhwa3RzaXplID0gSVhHQkVfUlhQQlNJWkVfODBLQjsKKwkJZm9yICg7IGkgPCA0OyBpKyspCisJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYUEJTSVpFKGkpLCByeHBrdHNpemUpOworCQkvKiBTZXR1cCB0aGUgbGFzdCBmb3VyIGF0IDQ4S0IuLi5kb24ndCByZS1pbml0IGkgKi8KKwkJcnhwa3RzaXplID0gSVhHQkVfUlhQQlNJWkVfNDhLQjsKKwkJLyogRmFsbCBUaHJvdWdoICovCisJY2FzZSBQQkFfU1RSQVRFR1lfRVFVQUw6CisJZGVmYXVsdDoKKwkJLyogRGl2aWRlIHRoZSByZW1haW5pbmcgUnggcGFja2V0IGJ1ZmZlciBldmVubHkgYW1vbmcgdGhlIFRDcyAqLworCQlmb3IgKDsgaSA8IElYR0JFX01BWF9QQUNLRVRfQlVGRkVSUzsgaSsrKQorCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SWFBCU0laRShpKSwgcnhwa3RzaXplKTsKKwkJYnJlYWs7CisJfQorCisJLyogU2V0dXAgVHggcGFja2V0IGJ1ZmZlciBzaXplcyAqLworCWZvciAoaSA9IDA7IGkgPCBJWEdCRV9NQVhfUEFDS0VUX0JVRkZFUlM7IGkrKykKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9UWFBCU0laRShpKSwgSVhHQkVfVFhQQlNJWkVfNDBLQik7CisKKwlyZXR1cm47Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaXhnYmVfbWFjX29wZXJhdGlvbnMgbWFjX29wc184MjU5OCA9IHsKIAkuaW5pdF9odwkJPSAmaXhnYmVfaW5pdF9od19nZW5lcmljLAogCS5yZXNldF9odwkJPSAmaXhnYmVfcmVzZXRfaHdfODI1OTgsCkBAIC0xMjU3LDYgKzEyOTgsNyBAQAogCS5yZWFkX2FuYWxvZ19yZWc4CT0gJml4Z2JlX3JlYWRfYW5hbG9nX3JlZzhfODI1OTgsCiAJLndyaXRlX2FuYWxvZ19yZWc4CT0gJml4Z2JlX3dyaXRlX2FuYWxvZ19yZWc4XzgyNTk4LAogCS5zZXR1cF9saW5rCQk9ICZpeGdiZV9zZXR1cF9tYWNfbGlua184MjU5OCwKKwkuc2V0X3J4cGJhCQk9ICZpeGdiZV9zZXRfcnhwYmFfODI1OTgsCiAJLmNoZWNrX2xpbmsJCT0gJml4Z2JlX2NoZWNrX21hY19saW5rXzgyNTk4LAogCS5nZXRfbGlua19jYXBhYmlsaXRpZXMJPSAmaXhnYmVfZ2V0X2xpbmtfY2FwYWJpbGl0aWVzXzgyNTk4LAogCS5sZWRfb24JCQk9ICZpeGdiZV9sZWRfb25fZ2VuZXJpYywKQEAgLTEyNzQsNiArMTMxNiw3IEBACiAJLmNsZWFyX3ZmdGEJCT0gJml4Z2JlX2NsZWFyX3ZmdGFfODI1OTgsCiAJLnNldF92ZnRhCQk9ICZpeGdiZV9zZXRfdmZ0YV84MjU5OCwKIAkuZmNfZW5hYmxlCQk9ICZpeGdiZV9mY19lbmFibGVfODI1OTgsCisJLnNldF9md19kcnZfdmVyICAgICAgICAgPSBOVUxMLAogCS5hY3F1aXJlX3N3Zndfc3luYyAgICAgID0gJml4Z2JlX2FjcXVpcmVfc3dmd19zeW5jLAogCS5yZWxlYXNlX3N3Zndfc3luYyAgICAgID0gJml4Z2JlX3JlbGVhc2Vfc3dmd19zeW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk5LmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV84MjU5OS5jCmluZGV4IDhlZTY2MTIuLjNiM2RkNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk5LmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTkuYwpAQCAtMTEwNyw2MSArMTEwNyw4NiBAQAogfQogCiAvKioKLSAqICBpeGdiZV9pbml0X2ZkaXJfc2lnbmF0dXJlXzgyNTk5IC0gSW5pdGlhbGl6ZSBGbG93IERpcmVjdG9yIHNpZ25hdHVyZSBmaWx0ZXJzCisgKiAgaXhnYmVfc2V0X2ZkaXJfcnhwYmFfODI1OTkgLSBJbml0aWFsaXplIEZsb3cgRGlyZWN0b3IgUnggcGFja2V0IGJ1ZmZlcgogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqICBAcGJhbGxvYzogd2hpY2ggbW9kZSB0byBhbGxvY2F0ZSBmaWx0ZXJzIHdpdGgKICAqKi8KLXMzMiBpeGdiZV9pbml0X2ZkaXJfc2lnbmF0dXJlXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBwYmFsbG9jKQorc3RhdGljIHMzMiBpeGdiZV9zZXRfZmRpcl9yeHBiYV84MjU5OShzdHJ1Y3QgaXhnYmVfaHcgKmh3LCBjb25zdCB1MzIgcGJhbGxvYykKIHsKLQl1MzIgZmRpcmN0cmwgPSAwOwotCXUzMiBwYnNpemU7CisJdTMyIGZkaXJfcGJzaXplID0gaHctPm1hYy5yeF9wYl9zaXplIDw8IElYR0JFX1JYUEJTSVpFX1NISUZUOworCXUzMiBjdXJyZW50X3J4cGJzaXplID0gMDsKIAlpbnQgaTsKIAotCS8qCi0JICogQmVmb3JlIGVuYWJsaW5nIEZsb3cgRGlyZWN0b3IsIHRoZSBSeCBQYWNrZXQgQnVmZmVyIHNpemUKLQkgKiBtdXN0IGJlIHJlZHVjZWQuICBUaGUgbmV3IHZhbHVlIGlzIHRoZSBjdXJyZW50IHNpemUgbWludXMKLQkgKiBmbG93IGRpcmVjdG9yIG1lbW9yeSB1c2FnZSBzaXplLgotCSAqLwotCXBic2l6ZSA9ICgxIDw8IChJWEdCRV9GRElSX1BCQUxMT0NfU0laRV9TSElGVCArIHBiYWxsb2MpKTsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYUEJTSVpFKDApLAotCSAgICAoSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JYUEJTSVpFKDApKSAtIHBic2l6ZSkpOwotCi0JLyoKLQkgKiBUaGUgZGVmYXVsdHMgaW4gdGhlIEhXIGZvciBSWCBQQiAxLTcgYXJlIG5vdCB6ZXJvIGFuZCBzbyBzaG91bGQgYmUKLQkgKiBpbml0aWFsaXplZCB0byB6ZXJvIGZvciBub24gRENCIG1vZGUgb3RoZXJ3aXNlIGFjdHVhbCB0b3RhbCBSWCBQQgotCSAqIHdvdWxkIGJlIGJpZ2dlciB0aGFuIHByb2dyYW1tZWQgYW5kIGZpbHRlciBzcGFjZSB3b3VsZCBydW4gaW50bwotCSAqIHRoZSBQQiAwIHJlZ2lvbi4KLQkgKi8KLQlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQotCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYUEJTSVpFKGkpLCAwKTsKLQotCS8qIFNlbmQgaW50ZXJydXB0IHdoZW4gNjQgZmlsdGVycyBhcmUgbGVmdCAqLwotCWZkaXJjdHJsIHw9IDQgPDwgSVhHQkVfRkRJUkNUUkxfRlVMTF9USFJFU0hfU0hJRlQ7Ci0KLQkvKiBTZXQgdGhlIG1heGltdW0gbGVuZ3RoIHBlciBoYXNoIGJ1Y2tldCB0byAweEEgZmlsdGVycyAqLwotCWZkaXJjdHJsIHw9IDB4QSA8PCBJWEdCRV9GRElSQ1RSTF9NQVhfTEVOR1RIX1NISUZUOwotCisJLyogcmVzZXJ2ZSBzcGFjZSBmb3IgRmxvdyBEaXJlY3RvciBmaWx0ZXJzICovCiAJc3dpdGNoIChwYmFsbG9jKSB7Ci0JY2FzZSBJWEdCRV9GRElSX1BCQUxMT0NfNjRLOgotCQkvKiA4ayAtIDEgc2lnbmF0dXJlIGZpbHRlcnMgKi8KLQkJZmRpcmN0cmwgfD0gSVhHQkVfRkRJUkNUUkxfUEJBTExPQ182NEs7CisJY2FzZSBJWEdCRV9GRElSX1BCQUxMT0NfMjU2SzoKKwkJZmRpcl9wYnNpemUgLT0gMjU2IDw8IElYR0JFX1JYUEJTSVpFX1NISUZUOwogCQlicmVhazsKIAljYXNlIElYR0JFX0ZESVJfUEJBTExPQ18xMjhLOgotCQkvKiAxNmsgLSAxIHNpZ25hdHVyZSBmaWx0ZXJzICovCi0JCWZkaXJjdHJsIHw9IElYR0JFX0ZESVJDVFJMX1BCQUxMT0NfMTI4SzsKKwkJZmRpcl9wYnNpemUgLT0gMTI4IDw8IElYR0JFX1JYUEJTSVpFX1NISUZUOwogCQlicmVhazsKLQljYXNlIElYR0JFX0ZESVJfUEJBTExPQ18yNTZLOgotCQkvKiAzMmsgLSAxIHNpZ25hdHVyZSBmaWx0ZXJzICovCi0JCWZkaXJjdHJsIHw9IElYR0JFX0ZESVJDVFJMX1BCQUxMT0NfMjU2SzsKKwljYXNlIElYR0JFX0ZESVJfUEJBTExPQ182NEs6CisJCWZkaXJfcGJzaXplIC09IDY0IDw8IElYR0JFX1JYUEJTSVpFX1NISUZUOwogCQlicmVhazsKKwljYXNlIElYR0JFX0ZESVJfUEJBTExPQ19OT05FOgogCWRlZmF1bHQ6Ci0JCS8qIGJhZCB2YWx1ZSAqLwotCQlyZXR1cm4gSVhHQkVfRVJSX0NPTkZJRzsKLQl9OworCQlyZXR1cm4gSVhHQkVfRVJSX1BBUkFNOworCX0KIAotCS8qIE1vdmUgdGhlIGZsZXhpYmxlIGJ5dGVzIHRvIHVzZSB0aGUgZXRoZXJ0eXBlIC0gc2hpZnQgNiB3b3JkcyAqLwotCWZkaXJjdHJsIHw9ICgweDYgPDwgSVhHQkVfRkRJUkNUUkxfRkxFWF9TSElGVCk7CisJLyogZGV0ZXJtaW5lIGN1cnJlbnQgUlggcGFja2V0IGJ1ZmZlciBzaXplICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJY3VycmVudF9yeHBic2l6ZSArPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUlhQQlNJWkUoaSkpOwogCisJLyogaWYgdGhlcmUgaXMgYWxyZWFkeSByb29tIGZvciB0aGUgZmlsdGVycyBkbyBub3RoaW5nICovCisJaWYgKGN1cnJlbnRfcnhwYnNpemUgPD0gZmRpcl9wYnNpemUpCisJCXJldHVybiAwOworCisJaWYgKGN1cnJlbnRfcnhwYnNpemUgPiBody0+bWFjLnJ4X3BiX3NpemUpIHsKKwkJLyoKKwkJICogaWYgcnhwYnNpemUgaXMgZ3JlYXRlciB0aGFuIG1heCB0aGVuIEhXIG1heCB0aGUgUnggYnVmZmVyCisJCSAqIHNpemVzIGFyZSB1bmNvbmZpZ3VyZWQgb3IgbWlzY29uZmlndXJlZCBzaW5jZSBIVyBkZWZhdWx0IGlzCisJCSAqIHRvIGdpdmUgdGhlIGZ1bGwgYnVmZmVyIHRvIGVhY2ggdHJhZmZpYyBjbGFzcyByZXN1bHRpbmcgaW4KKwkJICogdGhlIHRvdGFsIHNpemUgYmVpbmcgYnVmZmVyIHNpemUgOHggYWN0dWFsIHNpemUKKwkJICoKKwkJICogVGhpcyBhc3N1bWVzIG5vIERDQiBzaW5jZSB0aGUgUlhQQlNJWkUgcmVnaXN0ZXJzIGFwcGVhciB0bworCQkgKiBiZSB1bmNvbmZpZ3VyZWQuCisJCSAqLworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYUEJTSVpFKDApLCBmZGlyX3Bic2l6ZSk7CisJCWZvciAoaSA9IDE7IGkgPCA4OyBpKyspCisJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYUEJTSVpFKGkpLCAwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTaW5jZSB0aGUgUnggcGFja2V0IGJ1ZmZlciBhcHBlYXJzIHRvIGhhdmUgYWxyZWFkeSBiZWVuCisJCSAqIGNvbmZpZ3VyZWQgd2UgbmVlZCB0byBzaHJpbmsgZWFjaCBwYWNrZXQgYnVmZmVyIGJ5IGVub3VnaAorCQkgKiB0byBtYWtlIHJvb20gZm9yIHRoZSBmaWx0ZXJzLiAgQXMgc3VjaCB3ZSB0YWtlIGVhY2ggcnhwYnNpemUKKwkJICogdmFsdWUgYW5kIG11bHRpcGx5IGl0IGJ5IGEgZnJhY3Rpb24gcmVwcmVzZW50aW5nIHRoZSBzaXplCisJCSAqIG5lZWRlZCBvdmVyIHRoZSBzaXplIHdlIGN1cnJlbnRseSBoYXZlLgorCQkgKgorCQkgKiBXZSBuZWVkIHRvIHJlZHVjZSBmZGlyX3Bic2l6ZSBhbmQgY3VycmVudF9yeHBic2l6ZSB0bworCQkgKiAxLzEwMjQgb2YgdGhlaXIgb3JpZ2luYWwgdmFsdWVzIGluIG9yZGVyIHRvIGF2b2lkCisJCSAqIG92ZXJmbG93aW5nIHRoZSB1MzIgYmVpbmcgdXNlZCB0byBzdG9yZSByeHBic2l6ZS4KKwkJICovCisJCWZkaXJfcGJzaXplID4+PSBJWEdCRV9SWFBCU0laRV9TSElGVDsKKwkJY3VycmVudF9yeHBic2l6ZSA+Pj0gSVhHQkVfUlhQQlNJWkVfU0hJRlQ7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXUzMiByeHBic2l6ZSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SWFBCU0laRShpKSk7CisJCQlyeHBic2l6ZSAqPSBmZGlyX3Bic2l6ZTsKKwkJCXJ4cGJzaXplIC89IGN1cnJlbnRfcnhwYnNpemU7CisJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYUEJTSVpFKGkpLCByeHBic2l6ZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgaXhnYmVfZmRpcl9lbmFibGVfODI1OTkgLSBJbml0aWFsaXplIEZsb3cgRGlyZWN0b3IgY29udHJvbCByZWdpc3RlcnMKKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQGZkaXJjdHJsOiB2YWx1ZSB0byB3cml0ZSB0byBmbG93IGRpcmVjdG9yIGNvbnRyb2wgcmVnaXN0ZXIKKyAqKi8KK3N0YXRpYyB2b2lkIGl4Z2JlX2ZkaXJfZW5hYmxlXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBmZGlyY3RybCkKK3sKKwlpbnQgaTsKIAogCS8qIFByaW1lIHRoZSBrZXlzIGZvciBoYXNoaW5nICovCiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GRElSSEtFWSwgSVhHQkVfQVRSX0JVQ0tFVF9IQVNIX0tFWSk7CkBAIC0xMTg4LDggKzEyMTMsMzggQEAKIAkJCWJyZWFrOwogCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CiAJfQorCiAJaWYgKGkgPj0gSVhHQkVfRkRJUl9JTklUX0RPTkVfUE9MTCkKLQkJaHdfZGJnKGh3LCAiRmxvdyBEaXJlY3RvciBTaWduYXR1cmUgcG9sbCB0aW1lIGV4Y2VlZGVkIVxuIik7CisJCWh3X2RiZyhodywgIkZsb3cgRGlyZWN0b3IgcG9sbCB0aW1lIGV4Y2VlZGVkIVxuIik7Cit9CisKKy8qKgorICogIGl4Z2JlX2luaXRfZmRpcl9zaWduYXR1cmVfODI1OTkgLSBJbml0aWFsaXplIEZsb3cgRGlyZWN0b3Igc2lnbmF0dXJlIGZpbHRlcnMKKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQGZkaXJjdHJsOiB2YWx1ZSB0byB3cml0ZSB0byBmbG93IGRpcmVjdG9yIGNvbnRyb2wgcmVnaXN0ZXIsIGluaXRpYWxseQorICogICAgICAgICAgICAgY29udGFpbnMganVzdCB0aGUgdmFsdWUgb2YgdGhlIFJ4IHBhY2tldCBidWZmZXIgYWxsb2NhdGlvbgorICoqLworczMyIGl4Z2JlX2luaXRfZmRpcl9zaWduYXR1cmVfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGZkaXJjdHJsKQoreworCXMzMiBlcnI7CisKKwkvKiBCZWZvcmUgZW5hYmxpbmcgRmxvdyBEaXJlY3RvciwgdmVyaWZ5IHRoZSBSeCBQYWNrZXQgQnVmZmVyIHNpemUgKi8KKwllcnIgPSBpeGdiZV9zZXRfZmRpcl9yeHBiYV84MjU5OShodywgZmRpcmN0cmwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIENvbnRpbnVlIHNldHVwIG9mIGZkaXJjdHJsIHJlZ2lzdGVyIGJpdHM6CisJICogIE1vdmUgdGhlIGZsZXhpYmxlIGJ5dGVzIHRvIHVzZSB0aGUgZXRoZXJ0eXBlIC0gc2hpZnQgNiB3b3JkcworCSAqICBTZXQgdGhlIG1heGltdW0gbGVuZ3RoIHBlciBoYXNoIGJ1Y2tldCB0byAweEEgZmlsdGVycworCSAqICBTZW5kIGludGVycnVwdCB3aGVuIDY0IGZpbHRlcnMgYXJlIGxlZnQKKwkgKi8KKwlmZGlyY3RybCB8PSAoMHg2IDw8IElYR0JFX0ZESVJDVFJMX0ZMRVhfU0hJRlQpIHwKKwkJICAgICgweEEgPDwgSVhHQkVfRkRJUkNUUkxfTUFYX0xFTkdUSF9TSElGVCkgfAorCQkgICAgKDQgPDwgSVhHQkVfRkRJUkNUUkxfRlVMTF9USFJFU0hfU0hJRlQpOworCisJLyogd3JpdGUgaGFzaGVzIGFuZCBmZGlyY3RybCByZWdpc3RlciwgcG9sbCBmb3IgY29tcGxldGlvbiAqLworCWl4Z2JlX2ZkaXJfZW5hYmxlXzgyNTk5KGh3LCBmZGlyY3RybCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExOTcsMTg5ICsxMjUyLDQwIEBACiAvKioKICAqICBpeGdiZV9pbml0X2ZkaXJfcGVyZmVjdF84MjU5OSAtIEluaXRpYWxpemUgRmxvdyBEaXJlY3RvciBwZXJmZWN0IGZpbHRlcnMKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCi0gKiAgQHBiYWxsb2M6IHdoaWNoIG1vZGUgdG8gYWxsb2NhdGUgZmlsdGVycyB3aXRoCisgKiAgQGZkaXJjdHJsOiB2YWx1ZSB0byB3cml0ZSB0byBmbG93IGRpcmVjdG9yIGNvbnRyb2wgcmVnaXN0ZXIsIGluaXRpYWxseQorICogICAgICAgICAgICAgY29udGFpbnMganVzdCB0aGUgdmFsdWUgb2YgdGhlIFJ4IHBhY2tldCBidWZmZXIgYWxsb2NhdGlvbgogICoqLwotczMyIGl4Z2JlX2luaXRfZmRpcl9wZXJmZWN0XzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBwYmFsbG9jKQorczMyIGl4Z2JlX2luaXRfZmRpcl9wZXJmZWN0XzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBmZGlyY3RybCkKIHsKLQl1MzIgZmRpcmN0cmwgPSAwOwotCXUzMiBwYnNpemU7Ci0JaW50IGk7CisJczMyIGVycjsKKworCS8qIEJlZm9yZSBlbmFibGluZyBGbG93IERpcmVjdG9yLCB2ZXJpZnkgdGhlIFJ4IFBhY2tldCBCdWZmZXIgc2l6ZSAqLworCWVyciA9IGl4Z2JlX3NldF9mZGlyX3J4cGJhXzgyNTk5KGh3LCBmZGlyY3RybCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qCi0JICogQmVmb3JlIGVuYWJsaW5nIEZsb3cgRGlyZWN0b3IsIHRoZSBSeCBQYWNrZXQgQnVmZmVyIHNpemUKLQkgKiBtdXN0IGJlIHJlZHVjZWQuICBUaGUgbmV3IHZhbHVlIGlzIHRoZSBjdXJyZW50IHNpemUgbWludXMKLQkgKiBmbG93IGRpcmVjdG9yIG1lbW9yeSB1c2FnZSBzaXplLgorCSAqIENvbnRpbnVlIHNldHVwIG9mIGZkaXJjdHJsIHJlZ2lzdGVyIGJpdHM6CisJICogIFR1cm4gcGVyZmVjdCBtYXRjaCBmaWx0ZXJpbmcgb24KKwkgKiAgUmVwb3J0IGhhc2ggaW4gUlNTIGZpZWxkIG9mIFJ4IHdiIGRlc2NyaXB0b3IKKwkgKiAgSW5pdGlhbGl6ZSB0aGUgZHJvcCBxdWV1ZQorCSAqICBNb3ZlIHRoZSBmbGV4aWJsZSBieXRlcyB0byB1c2UgdGhlIGV0aGVydHlwZSAtIHNoaWZ0IDYgd29yZHMKKwkgKiAgU2V0IHRoZSBtYXhpbXVtIGxlbmd0aCBwZXIgaGFzaCBidWNrZXQgdG8gMHhBIGZpbHRlcnMKKwkgKiAgU2VuZCBpbnRlcnJ1cHQgd2hlbiA2NCAoMHg0ICogMTYpIGZpbHRlcnMgYXJlIGxlZnQKIAkgKi8KLQlwYnNpemUgPSAoMSA8PCAoSVhHQkVfRkRJUl9QQkFMTE9DX1NJWkVfU0hJRlQgKyBwYmFsbG9jKSk7Ci0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SWFBCU0laRSgwKSwKLQkgICAgKElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SWFBCU0laRSgwKSkgLSBwYnNpemUpKTsKKwlmZGlyY3RybCB8PSBJWEdCRV9GRElSQ1RSTF9QRVJGRUNUX01BVENIIHwKKwkJICAgIElYR0JFX0ZESVJDVFJMX1JFUE9SVF9TVEFUVVMgfAorCQkgICAgKElYR0JFX0ZESVJfRFJPUF9RVUVVRSA8PCBJWEdCRV9GRElSQ1RSTF9EUk9QX1FfU0hJRlQpIHwKKwkJICAgICgweDYgPDwgSVhHQkVfRkRJUkNUUkxfRkxFWF9TSElGVCkgfAorCQkgICAgKDB4QSA8PCBJWEdCRV9GRElSQ1RSTF9NQVhfTEVOR1RIX1NISUZUKSB8CisJCSAgICAoNCA8PCBJWEdCRV9GRElSQ1RSTF9GVUxMX1RIUkVTSF9TSElGVCk7CiAKLQkvKgotCSAqIFRoZSBkZWZhdWx0cyBpbiB0aGUgSFcgZm9yIFJYIFBCIDEtNyBhcmUgbm90IHplcm8gYW5kIHNvIHNob3VsZCBiZQotCSAqIGluaXRpYWxpemVkIHRvIHplcm8gZm9yIG5vbiBEQ0IgbW9kZSBvdGhlcndpc2UgYWN0dWFsIHRvdGFsIFJYIFBCCi0JICogd291bGQgYmUgYmlnZ2VyIHRoYW4gcHJvZ3JhbW1lZCBhbmQgZmlsdGVyIHNwYWNlIHdvdWxkIHJ1biBpbnRvCi0JICogdGhlIFBCIDAgcmVnaW9uLgotCSAqLwotCWZvciAoaSA9IDE7IGkgPCA4OyBpKyspCi0JCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlhQQlNJWkUoaSksIDApOwotCi0JLyogU2VuZCBpbnRlcnJ1cHQgd2hlbiA2NCBmaWx0ZXJzIGFyZSBsZWZ0ICovCi0JZmRpcmN0cmwgfD0gNCA8PCBJWEdCRV9GRElSQ1RSTF9GVUxMX1RIUkVTSF9TSElGVDsKLQotCS8qIEluaXRpYWxpemUgdGhlIGRyb3AgcXVldWUgdG8gUnggcXVldWUgMTI3ICovCi0JZmRpcmN0cmwgfD0gKDEyNyA8PCBJWEdCRV9GRElSQ1RSTF9EUk9QX1FfU0hJRlQpOwotCi0Jc3dpdGNoIChwYmFsbG9jKSB7Ci0JY2FzZSBJWEdCRV9GRElSX1BCQUxMT0NfNjRLOgotCQkvKiAyayAtIDEgcGVyZmVjdCBmaWx0ZXJzICovCi0JCWZkaXJjdHJsIHw9IElYR0JFX0ZESVJDVFJMX1BCQUxMT0NfNjRLOwotCQlicmVhazsKLQljYXNlIElYR0JFX0ZESVJfUEJBTExPQ18xMjhLOgotCQkvKiA0ayAtIDEgcGVyZmVjdCBmaWx0ZXJzICovCi0JCWZkaXJjdHJsIHw9IElYR0JFX0ZESVJDVFJMX1BCQUxMT0NfMTI4SzsKLQkJYnJlYWs7Ci0JY2FzZSBJWEdCRV9GRElSX1BCQUxMT0NfMjU2SzoKLQkJLyogOGsgLSAxIHBlcmZlY3QgZmlsdGVycyAqLwotCQlmZGlyY3RybCB8PSBJWEdCRV9GRElSQ1RSTF9QQkFMTE9DXzI1Nks7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGJhZCB2YWx1ZSAqLwotCQlyZXR1cm4gSVhHQkVfRVJSX0NPTkZJRzsKLQl9OwotCi0JLyogVHVybiBwZXJmZWN0IG1hdGNoIGZpbHRlcmluZyBvbiAqLwotCWZkaXJjdHJsIHw9IElYR0JFX0ZESVJDVFJMX1BFUkZFQ1RfTUFUQ0g7Ci0JZmRpcmN0cmwgfD0gSVhHQkVfRkRJUkNUUkxfUkVQT1JUX1NUQVRVUzsKLQotCS8qIE1vdmUgdGhlIGZsZXhpYmxlIGJ5dGVzIHRvIHVzZSB0aGUgZXRoZXJ0eXBlIC0gc2hpZnQgNiB3b3JkcyAqLwotCWZkaXJjdHJsIHw9ICgweDYgPDwgSVhHQkVfRkRJUkNUUkxfRkxFWF9TSElGVCk7Ci0KLQkvKiBQcmltZSB0aGUga2V5cyBmb3IgaGFzaGluZyAqLwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkRJUkhLRVksIElYR0JFX0FUUl9CVUNLRVRfSEFTSF9LRVkpOwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkRJUlNLRVksIElYR0JFX0FUUl9TSUdOQVRVUkVfSEFTSF9LRVkpOwotCi0JLyoKLQkgKiBQb2xsIGluaXQtZG9uZSBhZnRlciB3ZSB3cml0ZSB0aGUgcmVnaXN0ZXIuICBFc3RpbWF0ZWQgdGltZXM6Ci0JICogICAgICAxMEc6IFBCQUxMT0MgPSAxMWIsIHRpbWluZyBpcyA2MHVzCi0JICogICAgICAgMUc6IFBCQUxMT0MgPSAxMWIsIHRpbWluZyBpcyA2MDB1cwotCSAqICAgICAxMDBNOiBQQkFMTE9DID0gMTFiLCB0aW1pbmcgaXMgNm1zCi0JICoKLQkgKiAgICAgTXVsdGlwbGUgdGhlc2UgdGltaW5ncyBieSA0IGlmIHVuZGVyIGZ1bGwgUnggbG9hZAotCSAqCi0JICogU28gd2UnbGwgcG9sbCBmb3IgSVhHQkVfRkRJUl9JTklUX0RPTkVfUE9MTCB0aW1lcywgc2xlZXBpbmcgZm9yCi0JICogMSBtc2VjIHBlciBwb2xsIHRpbWUuICBJZiB3ZSdyZSBhdCBsaW5lIHJhdGUgYW5kIGRyb3AgdG8gMTAwTSwgdGhlbgotCSAqIHRoaXMgbWlnaHQgbm90IGZpbmlzaCBpbiBvdXIgcG9sbCB0aW1lLCBidXQgd2UgY2FuIGxpdmUgd2l0aCB0aGF0Ci0JICogZm9yIG5vdy4KLQkgKi8KLQotCS8qIFNldCB0aGUgbWF4aW11bSBsZW5ndGggcGVyIGhhc2ggYnVja2V0IHRvIDB4QSBmaWx0ZXJzICovCi0JZmRpcmN0cmwgfD0gKDB4QSA8PCBJWEdCRV9GRElSQ1RSTF9NQVhfTEVOR1RIX1NISUZUKTsKLQotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkRJUkNUUkwsIGZkaXJjdHJsKTsKLQlJWEdCRV9XUklURV9GTFVTSChodyk7Ci0JZm9yIChpID0gMDsgaSA8IElYR0JFX0ZESVJfSU5JVF9ET05FX1BPTEw7IGkrKykgewotCQlpZiAoSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0ZESVJDVFJMKSAmCi0JCSAgICAgICAgICAgICAgICAgICBJWEdCRV9GRElSQ1RSTF9JTklUX0RPTkUpCi0JCQlicmVhazsKLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwotCX0KLQlpZiAoaSA+PSBJWEdCRV9GRElSX0lOSVRfRE9ORV9QT0xMKQotCQlod19kYmcoaHcsICJGbG93IERpcmVjdG9yIFBlcmZlY3QgcG9sbCB0aW1lIGV4Y2VlZGVkIVxuIik7CisJLyogd3JpdGUgaGFzaGVzIGFuZCBmZGlyY3RybCByZWdpc3RlciwgcG9sbCBmb3IgY29tcGxldGlvbiAqLworCWl4Z2JlX2ZkaXJfZW5hYmxlXzgyNTk5KGh3LCBmZGlyY3RybCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotCi0vKioKLSAqICBpeGdiZV9hdHJfY29tcHV0ZV9oYXNoXzgyNTk5IC0gQ29tcHV0ZSB0aGUgaGFzaGVzIGZvciBTVyBBVFIKLSAqICBAc3RyZWFtOiBpbnB1dCBiaXRzdHJlYW0gdG8gY29tcHV0ZSB0aGUgaGFzaCBvbgotICogIEBrZXk6IDMyLWJpdCBoYXNoIGtleQotICoqLwotc3RhdGljIHUzMiBpeGdiZV9hdHJfY29tcHV0ZV9oYXNoXzgyNTk5KHVuaW9uIGl4Z2JlX2F0cl9pbnB1dCAqYXRyX2lucHV0LAotCQkJCQl1MzIga2V5KQotewotCS8qCi0JICogVGhlIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzOgotCSAqICAgIEhhc2hbMTU6MF0gPSBTdW0geyBTW25dIHggS1tuKzE2XSB9LCBuID0gMC4uLjM1MAotCSAqICAgIHdoZXJlIFN1bSB7QVtuXX0sIG4gPSAwLi4ubiBpcyBiaXR3aXNlIFhPUiBvZiBBWzBdLCBBWzFdLi4uQVtuXQotCSAqICAgIGFuZCBBW25dIHggQltuXSBpcyBiaXR3aXNlIEFORCBiZXR3ZWVuIHNhbWUgbGVuZ3RoIHN0cmluZ3MKLQkgKgotCSAqICAgIEtbbl0gaXMgMTYgYml0cywgZGVmaW5lZCBhczoKLQkgKiAgICAgICBmb3IgbiBtb2R1bG8gMzIgPj0gMTUsIEtbbl0gPSBLW24gJSAzMiA6IChuICUgMzIpIC0gMTVdCi0JICogICAgICAgZm9yIG4gbW9kdWxvIDMyIDwgMTUsIEtbbl0gPQotCSAqICAgICAgICAgICAgIEtbKG4gJSAzMjowKSB8ICgzMTozMSAtICgxNCAtIChuICUgMzIpKSldCi0JICoKLQkgKiAgICBTW25dIGlzIDE2IGJpdHMsIGRlZmluZWQgYXM6Ci0JICogICAgICAgZm9yIG4gPj0gMTUsIFNbbl0gPSBTW246biAtIDE1XQotCSAqICAgICAgIGZvciBuIDwgMTUsIFNbbl0gPSBTWyhuOjApIHwgKDM1MDozNTAgLSAoMTQgLSBuKSldCi0JICoKLQkgKiAgICBUbyBzaW1wbGlmeSBmb3IgcHJvZ3JhbW1pbmcsIHRoZSBhbGdvcml0aG0gaXMgaW1wbGVtZW50ZWQKLQkgKiAgICBpbiBzb2Z0d2FyZSB0aGlzIHdheToKLQkgKgotCSAqICAgIGtleVszMTowXSwgaGlfaGFzaF9kd29yZFszMTowXSwgbG9faGFzaF9kd29yZFszMTowXSwgaGFzaFsxNTowXQotCSAqCi0JICogICAgZm9yIChpID0gMDsgaSA8IDM1MjsgaSs9MzIpCi0JICogICAgICAgIGhpX2hhc2hfZHdvcmRbMzE6MF0gXj0gU3RyZWFtWyhpKzMxKTppXTsKLQkgKgotCSAqICAgIGxvX2hhc2hfZHdvcmRbMTU6MF0gIF49IFN0cmVhbVsxNTowXTsKLQkgKiAgICBsb19oYXNoX2R3b3JkWzE1OjBdICBePSBoaV9oYXNoX2R3b3JkWzMxOjE2XTsKLQkgKiAgICBsb19oYXNoX2R3b3JkWzMxOjE2XSBePSBoaV9oYXNoX2R3b3JkWzE1OjBdOwotCSAqCi0JICogICAgaGlfaGFzaF9kd29yZFszMTowXSAgXj0gU3RyZWFtWzM1MTozMjBdOwotCSAqCi0JICogICAgaWYoa2V5WzBdKQotCSAqICAgICAgICBoYXNoWzE1OjBdIF49IFN0cmVhbVsxNTowXTsKLQkgKgotCSAqICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JICogICAgICAgIGlmIChrZXlbaV0pCi0JICogICAgICAgICAgICBoYXNoWzE1OjBdIF49IGxvX2hhc2hfZHdvcmRbKGkrMTUpOmldOwotCSAqICAgICAgICBpZiAoa2V5W2kgKyAxNl0pCi0JICogICAgICAgICAgICBoYXNoWzE1OjBdIF49IGhpX2hhc2hfZHdvcmRbKGkrMTUpOmldOwotCSAqICAgIH0KLQkgKgotCSAqLwotCV9fYmUzMiBjb21tb25faGFzaF9kd29yZCA9IDA7Ci0JdTMyIGhpX2hhc2hfZHdvcmQsIGxvX2hhc2hfZHdvcmQsIGZsb3dfdm1fdmxhbjsKLQl1MzIgaGFzaF9yZXN1bHQgPSAwOwotCXU4IGk7Ci0KLQkvKiByZWNvcmQgdGhlIGZsb3dfdm1fdmxhbiBiaXRzIGFzIHRoZXkgYXJlIGEga2V5IHBhcnQgdG8gdGhlIGhhc2ggKi8KLQlmbG93X3ZtX3ZsYW4gPSBudG9obChhdHJfaW5wdXQtPmR3b3JkX3N0cmVhbVswXSk7Ci0KLQkvKiBnZW5lcmF0ZSBjb21tb24gaGFzaCBkd29yZCAqLwotCWZvciAoaSA9IDEwOyBpOyBpIC09IDIpCi0JCWNvbW1vbl9oYXNoX2R3b3JkIF49IGF0cl9pbnB1dC0+ZHdvcmRfc3RyZWFtW2ldIF4KLQkJCQkgICAgIGF0cl9pbnB1dC0+ZHdvcmRfc3RyZWFtW2kgLSAxXTsKLQotCWhpX2hhc2hfZHdvcmQgPSBudG9obChjb21tb25faGFzaF9kd29yZCk7Ci0KLQkvKiBsb3cgZHdvcmQgaXMgd29yZCBzd2FwcGVkIHZlcnNpb24gb2YgY29tbW9uICovCi0JbG9faGFzaF9kd29yZCA9IChoaV9oYXNoX2R3b3JkID4+IDE2KSB8IChoaV9oYXNoX2R3b3JkIDw8IDE2KTsKLQotCS8qIGFwcGx5IGZsb3cgSUQvVk0gcG9vbC9WTEFOIElEIGJpdHMgdG8gaGFzaCB3b3JkcyAqLwotCWhpX2hhc2hfZHdvcmQgXj0gZmxvd192bV92bGFuIF4gKGZsb3dfdm1fdmxhbiA+PiAxNik7Ci0KLQkvKiBQcm9jZXNzIGJpdHMgMCBhbmQgMTYgKi8KLQlpZiAoa2V5ICYgMHgwMDAxKSBoYXNoX3Jlc3VsdCBePSBsb19oYXNoX2R3b3JkOwotCWlmIChrZXkgJiAweDAwMDEwMDAwKSBoYXNoX3Jlc3VsdCBePSBoaV9oYXNoX2R3b3JkOwotCi0JLyoKLQkgKiBhcHBseSBmbG93IElEL1ZNIHBvb2wvVkxBTiBJRCBiaXRzIHRvIGxvIGhhc2ggZHdvcmQsIHdlIGhhZCB0bwotCSAqIGRlbGF5IHRoaXMgYmVjYXVzZSBiaXQgMCBvZiB0aGUgc3RyZWFtIHNob3VsZCBub3QgYmUgcHJvY2Vzc2VkCi0JICogc28gd2UgZG8gbm90IGFkZCB0aGUgdmxhbiB1bnRpbCBhZnRlciBiaXQgMCB3YXMgcHJvY2Vzc2VkCi0JICovCi0JbG9faGFzaF9kd29yZCBePSBmbG93X3ZtX3ZsYW4gXiAoZmxvd192bV92bGFuIDw8IDE2KTsKLQotCi0JLyogcHJvY2VzcyB0aGUgcmVtYWluaW5nIDMwIGJpdHMgaW4gdGhlIGtleSAyIGJpdHMgYXQgYSB0aW1lICovCi0JZm9yIChpID0gMTU7IGk7IGktLSApIHsKLQkJaWYgKGtleSAmICgweDAwMDEgPDwgaSkpIGhhc2hfcmVzdWx0IF49IGxvX2hhc2hfZHdvcmQgPj4gaTsKLQkJaWYgKGtleSAmICgweDAwMDEwMDAwIDw8IGkpKSBoYXNoX3Jlc3VsdCBePSBoaV9oYXNoX2R3b3JkID4+IGk7Ci0JfQotCi0JcmV0dXJuIGhhc2hfcmVzdWx0ICYgSVhHQkVfQVRSX0hBU0hfTUFTSzsKLX0KLQogLyoKICAqIFRoZXNlIGRlZmluZXMgYWxsb3cgdXMgdG8gcXVpY2tseSBnZW5lcmF0ZSBhbGwgb2YgdGhlIG5lY2Vzc2FyeSBpbnN0cnVjdGlvbnMKICAqIGluIHRoZSBmdW5jdGlvbiBiZWxvdyBieSBzaW1wbHkgY2FsbGluZyBvdXQgSVhHQkVfQ09NUFVURV9TSUdfSEFTSF9JVEVSQVRJT04KQEAgLTE1MTQsNyArMTQyMCw2IEBACiAJICovCiAJZmRpcmhhc2hjbWQgPSAodTY0KWZkaXJjbWQgPDwgMzI7CiAJZmRpcmhhc2hjbWQgfD0gaXhnYmVfYXRyX2NvbXB1dGVfc2lnX2hhc2hfODI1OTkoaW5wdXQsIGNvbW1vbik7Ci0KIAlJWEdCRV9XUklURV9SRUc2NChodywgSVhHQkVfRkRJUkhBU0gsIGZkaXJoYXNoY21kKTsKIAogCWh3X2RiZyhodywgIlR4IFF1ZXVlPSV4IGhhc2g9JXhcbiIsIHF1ZXVlLCAodTMyKWZkaXJoYXNoY21kKTsKQEAgLTE1MjIsNiArMTQyNywxMDEgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBJWEdCRV9DT01QVVRFX0JLVF9IQVNIX0lURVJBVElPTihfbikgXAorZG8geyBcCisJdTMyIG4gPSAoX24pOyBcCisJaWYgKElYR0JFX0FUUl9CVUNLRVRfSEFTSF9LRVkgJiAoMHgwMSA8PCBuKSkgXAorCQlidWNrZXRfaGFzaCBePSBsb19oYXNoX2R3b3JkID4+IG47IFwKKwlpZiAoSVhHQkVfQVRSX0JVQ0tFVF9IQVNIX0tFWSAmICgweDAxIDw8IChuICsgMTYpKSkgXAorCQlidWNrZXRfaGFzaCBePSBoaV9oYXNoX2R3b3JkID4+IG47IFwKK30gd2hpbGUgKDApOworCisvKioKKyAqICBpeGdiZV9hdHJfY29tcHV0ZV9wZXJmZWN0X2hhc2hfODI1OTkgLSBDb21wdXRlIHRoZSBwZXJmZWN0IGZpbHRlciBoYXNoCisgKiAgQGF0cl9pbnB1dDogaW5wdXQgYml0c3RyZWFtIHRvIGNvbXB1dGUgdGhlIGhhc2ggb24KKyAqICBAaW5wdXRfbWFzazogbWFzayBmb3IgdGhlIGlucHV0IGJpdHN0cmVhbQorICoKKyAqICBUaGlzIGZ1bmN0aW9uIHNlcnZlcyB0d28gbWFpbiBwdXJwb3Nlcy4gIEZpcnN0IGl0IGFwcGx5cyB0aGUgaW5wdXRfbWFzaworICogIHRvIHRoZSBhdHJfaW5wdXQgcmVzdWx0aW5nIGluIGEgY2xlYW5lZCB1cCBhdHJfaW5wdXQgZGF0YSBzdHJlYW0uCisgKiAgU2Vjb25kbHkgaXQgY29tcHV0ZXMgdGhlIGhhc2ggYW5kIHN0b3JlcyBpdCBpbiB0aGUgYmt0X2hhc2ggZmllbGQgYXQKKyAqICB0aGUgZW5kIG9mIHRoZSBpbnB1dCBieXRlIHN0cmVhbS4gIFRoaXMgd2F5IGl0IHdpbGwgYmUgYXZhaWxhYmxlIGZvcgorICogIGZ1dHVyZSB1c2Ugd2l0aG91dCBuZWVkaW5nIHRvIHJlY29tcHV0ZSB0aGUgaGFzaC4KKyAqKi8KK3ZvaWQgaXhnYmVfYXRyX2NvbXB1dGVfcGVyZmVjdF9oYXNoXzgyNTk5KHVuaW9uIGl4Z2JlX2F0cl9pbnB1dCAqaW5wdXQsCisJCQkJCSAgdW5pb24gaXhnYmVfYXRyX2lucHV0ICppbnB1dF9tYXNrKQoreworCisJdTMyIGhpX2hhc2hfZHdvcmQsIGxvX2hhc2hfZHdvcmQsIGZsb3dfdm1fdmxhbjsKKwl1MzIgYnVja2V0X2hhc2ggPSAwOworCisJLyogQXBwbHkgbWFza3MgdG8gaW5wdXQgZGF0YSAqLworCWlucHV0LT5kd29yZF9zdHJlYW1bMF0gICY9IGlucHV0X21hc2stPmR3b3JkX3N0cmVhbVswXTsKKwlpbnB1dC0+ZHdvcmRfc3RyZWFtWzFdICAmPSBpbnB1dF9tYXNrLT5kd29yZF9zdHJlYW1bMV07CisJaW5wdXQtPmR3b3JkX3N0cmVhbVsyXSAgJj0gaW5wdXRfbWFzay0+ZHdvcmRfc3RyZWFtWzJdOworCWlucHV0LT5kd29yZF9zdHJlYW1bM10gICY9IGlucHV0X21hc2stPmR3b3JkX3N0cmVhbVszXTsKKwlpbnB1dC0+ZHdvcmRfc3RyZWFtWzRdICAmPSBpbnB1dF9tYXNrLT5kd29yZF9zdHJlYW1bNF07CisJaW5wdXQtPmR3b3JkX3N0cmVhbVs1XSAgJj0gaW5wdXRfbWFzay0+ZHdvcmRfc3RyZWFtWzVdOworCWlucHV0LT5kd29yZF9zdHJlYW1bNl0gICY9IGlucHV0X21hc2stPmR3b3JkX3N0cmVhbVs2XTsKKwlpbnB1dC0+ZHdvcmRfc3RyZWFtWzddICAmPSBpbnB1dF9tYXNrLT5kd29yZF9zdHJlYW1bN107CisJaW5wdXQtPmR3b3JkX3N0cmVhbVs4XSAgJj0gaW5wdXRfbWFzay0+ZHdvcmRfc3RyZWFtWzhdOworCWlucHV0LT5kd29yZF9zdHJlYW1bOV0gICY9IGlucHV0X21hc2stPmR3b3JkX3N0cmVhbVs5XTsKKwlpbnB1dC0+ZHdvcmRfc3RyZWFtWzEwXSAmPSBpbnB1dF9tYXNrLT5kd29yZF9zdHJlYW1bMTBdOworCisJLyogcmVjb3JkIHRoZSBmbG93X3ZtX3ZsYW4gYml0cyBhcyB0aGV5IGFyZSBhIGtleSBwYXJ0IHRvIHRoZSBoYXNoICovCisJZmxvd192bV92bGFuID0gbnRvaGwoaW5wdXQtPmR3b3JkX3N0cmVhbVswXSk7CisKKwkvKiBnZW5lcmF0ZSBjb21tb24gaGFzaCBkd29yZCAqLworCWhpX2hhc2hfZHdvcmQgPSBudG9obChpbnB1dC0+ZHdvcmRfc3RyZWFtWzFdIF4KKwkJCQkgICAgaW5wdXQtPmR3b3JkX3N0cmVhbVsyXSBeCisJCQkJICAgIGlucHV0LT5kd29yZF9zdHJlYW1bM10gXgorCQkJCSAgICBpbnB1dC0+ZHdvcmRfc3RyZWFtWzRdIF4KKwkJCQkgICAgaW5wdXQtPmR3b3JkX3N0cmVhbVs1XSBeCisJCQkJICAgIGlucHV0LT5kd29yZF9zdHJlYW1bNl0gXgorCQkJCSAgICBpbnB1dC0+ZHdvcmRfc3RyZWFtWzddIF4KKwkJCQkgICAgaW5wdXQtPmR3b3JkX3N0cmVhbVs4XSBeCisJCQkJICAgIGlucHV0LT5kd29yZF9zdHJlYW1bOV0gXgorCQkJCSAgICBpbnB1dC0+ZHdvcmRfc3RyZWFtWzEwXSk7CisKKwkvKiBsb3cgZHdvcmQgaXMgd29yZCBzd2FwcGVkIHZlcnNpb24gb2YgY29tbW9uICovCisJbG9faGFzaF9kd29yZCA9IChoaV9oYXNoX2R3b3JkID4+IDE2KSB8IChoaV9oYXNoX2R3b3JkIDw8IDE2KTsKKworCS8qIGFwcGx5IGZsb3cgSUQvVk0gcG9vbC9WTEFOIElEIGJpdHMgdG8gaGFzaCB3b3JkcyAqLworCWhpX2hhc2hfZHdvcmQgXj0gZmxvd192bV92bGFuIF4gKGZsb3dfdm1fdmxhbiA+PiAxNik7CisKKwkvKiBQcm9jZXNzIGJpdHMgMCBhbmQgMTYgKi8KKwlJWEdCRV9DT01QVVRFX0JLVF9IQVNIX0lURVJBVElPTigwKTsKKworCS8qCisJICogYXBwbHkgZmxvdyBJRC9WTSBwb29sL1ZMQU4gSUQgYml0cyB0byBsbyBoYXNoIGR3b3JkLCB3ZSBoYWQgdG8KKwkgKiBkZWxheSB0aGlzIGJlY2F1c2UgYml0IDAgb2YgdGhlIHN0cmVhbSBzaG91bGQgbm90IGJlIHByb2Nlc3NlZAorCSAqIHNvIHdlIGRvIG5vdCBhZGQgdGhlIHZsYW4gdW50aWwgYWZ0ZXIgYml0IDAgd2FzIHByb2Nlc3NlZAorCSAqLworCWxvX2hhc2hfZHdvcmQgXj0gZmxvd192bV92bGFuIF4gKGZsb3dfdm1fdmxhbiA8PCAxNik7CisKKwkvKiBQcm9jZXNzIHJlbWFpbmluZyAzMCBiaXQgb2YgdGhlIGtleSAqLworCUlYR0JFX0NPTVBVVEVfQktUX0hBU0hfSVRFUkFUSU9OKDEpOworCUlYR0JFX0NPTVBVVEVfQktUX0hBU0hfSVRFUkFUSU9OKDIpOworCUlYR0JFX0NPTVBVVEVfQktUX0hBU0hfSVRFUkFUSU9OKDMpOworCUlYR0JFX0NPTVBVVEVfQktUX0hBU0hfSVRFUkFUSU9OKDQpOworCUlYR0JFX0NPTVBVVEVfQktUX0hBU0hfSVRFUkFUSU9OKDUpOworCUlYR0JFX0NPTVBVVEVfQktUX0hBU0hfSVRFUkFUSU9OKDYpOworCUlYR0JFX0NPTVBVVEVfQktUX0hBU0hfSVRFUkFUSU9OKDcpOworCUlYR0JFX0NPTVBVVEVfQktUX0hBU0hfSVRFUkFUSU9OKDgpOworCUlYR0JFX0NPTVBVVEVfQktUX0hBU0hfSVRFUkFUSU9OKDkpOworCUlYR0JFX0NPTVBVVEVfQktUX0hBU0hfSVRFUkFUSU9OKDEwKTsKKwlJWEdCRV9DT01QVVRFX0JLVF9IQVNIX0lURVJBVElPTigxMSk7CisJSVhHQkVfQ09NUFVURV9CS1RfSEFTSF9JVEVSQVRJT04oMTIpOworCUlYR0JFX0NPTVBVVEVfQktUX0hBU0hfSVRFUkFUSU9OKDEzKTsKKwlJWEdCRV9DT01QVVRFX0JLVF9IQVNIX0lURVJBVElPTigxNCk7CisJSVhHQkVfQ09NUFVURV9CS1RfSEFTSF9JVEVSQVRJT04oMTUpOworCisJLyoKKwkgKiBMaW1pdCBoYXNoIHRvIDEzIGJpdHMgc2luY2UgbWF4IGJ1Y2tldCBjb3VudCBpcyA4Sy4KKwkgKiBTdG9yZSByZXN1bHQgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyZWFtLgorCSAqLworCWlucHV0LT5mb3JtYXR0ZWQuYmt0X2hhc2ggPSBidWNrZXRfaGFzaCAmIDB4MUZGRjsKK30KKwogLyoqCiAgKiAgaXhnYmVfZ2V0X2ZkaXJ0Y3BtXzgyNTk5IC0gZ2VuZXJhdGUgYSB0Y3AgcG9ydCBmcm9tIGF0cl9pbnB1dF9tYXNrcwogICogIEBpbnB1dF9tYXNrOiBtYXNrIHRvIGJlIGJpdCBzd2FwcGVkCkBAIC0xNTMxLDExICsxNTMxLDExIEBACiAgKiAgZ2VuZXJhdGUgYSBjb3JyZWN0bHkgc3dhcHBlZCB2YWx1ZSB3ZSBuZWVkIHRvIGJpdCBzd2FwIHRoZSBtYXNrIGFuZCB0aGF0CiAgKiAgaXMgd2hhdCBpcyBhY2NvbXBsaXNoZWQgYnkgdGhpcyBmdW5jdGlvbi4KICAqKi8KLXN0YXRpYyB1MzIgaXhnYmVfZ2V0X2ZkaXJ0Y3BtXzgyNTk5KHN0cnVjdCBpeGdiZV9hdHJfaW5wdXRfbWFza3MgKmlucHV0X21hc2tzKQorc3RhdGljIHUzMiBpeGdiZV9nZXRfZmRpcnRjcG1fODI1OTkodW5pb24gaXhnYmVfYXRyX2lucHV0ICppbnB1dF9tYXNrKQogewotCXUzMiBtYXNrID0gbnRvaHMoaW5wdXRfbWFza3MtPmRzdF9wb3J0X21hc2spOworCXUzMiBtYXNrID0gbnRvaHMoaW5wdXRfbWFzay0+Zm9ybWF0dGVkLmRzdF9wb3J0KTsKIAltYXNrIDw8PSBJWEdCRV9GRElSVENQTV9EUE9SVE1fU0hJRlQ7Ci0JbWFzayB8PSBudG9ocyhpbnB1dF9tYXNrcy0+c3JjX3BvcnRfbWFzayk7CisJbWFzayB8PSBudG9ocyhpbnB1dF9tYXNrLT5mb3JtYXR0ZWQuc3JjX3BvcnQpOwogCW1hc2sgPSAoKG1hc2sgJiAweDU1NTU1NTU1KSA8PCAxKSB8ICgobWFzayAmIDB4QUFBQUFBQUEpID4+IDEpOwogCW1hc2sgPSAoKG1hc2sgJiAweDMzMzMzMzMzKSA8PCAyKSB8ICgobWFzayAmIDB4Q0NDQ0NDQ0MpID4+IDIpOwogCW1hc2sgPSAoKG1hc2sgJiAweDBGMEYwRjBGKSA8PCA0KSB8ICgobWFzayAmIDB4RjBGMEYwRjApID4+IDQpOwpAQCAtMTU1Nyw1MiArMTU1NywxNCBAQAogCUlYR0JFX1dSSVRFX1JFRygoYSksIChyZWcpLCBJWEdCRV9TVE9SRV9BU19CRTMyKG50b2hsKHZhbHVlKSkpCiAKICNkZWZpbmUgSVhHQkVfU1RPUkVfQVNfQkUxNihfdmFsdWUpIFwKLQkoKCh1MTYpKF92YWx1ZSkgPj4gOCkgfCAoKHUxNikoX3ZhbHVlKSA8PCA4KSkKKwludG9ocygoKHUxNikoX3ZhbHVlKSA+PiA4KSB8ICgodTE2KShfdmFsdWUpIDw8IDgpKQogCi0vKioKLSAqICBpeGdiZV9mZGlyX2FkZF9wZXJmZWN0X2ZpbHRlcl84MjU5OSAtIEFkZHMgYSBwZXJmZWN0IGZpbHRlcgotICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKLSAqICBAaW5wdXQ6IGlucHV0IGJpdHN0cmVhbQotICogIEBpbnB1dF9tYXNrczogYml0d2lzZSBtYXNrcyBmb3IgcmVsZXZhbnQgZmllbGRzCi0gKiAgQHNvZnRfaWQ6IHNvZnR3YXJlIGluZGV4IGludG8gdGhlIHNpbGljb24gaGFzaCB0YWJsZXMgZm9yIGZpbHRlciBzdG9yYWdlCi0gKiAgQHF1ZXVlOiBxdWV1ZSBpbmRleCB0byBkaXJlY3QgdHJhZmZpYyB0bwotICoKLSAqICBOb3RlIHRoYXQgdGhlIGNhbGxlciB0byB0aGlzIGZ1bmN0aW9uIG11c3QgbG9jayBiZWZvcmUgY2FsbGluZywgc2luY2UgdGhlCi0gKiAgaGFyZHdhcmUgd3JpdGVzIG11c3QgYmUgcHJvdGVjdGVkIGZyb20gb25lIGFub3RoZXIuCi0gKiovCi1zMzIgaXhnYmVfZmRpcl9hZGRfcGVyZmVjdF9maWx0ZXJfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXhnYmVfYXRyX2lucHV0ICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl4Z2JlX2F0cl9pbnB1dF9tYXNrcyAqaW5wdXRfbWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBzb2Z0X2lkLCB1OCBxdWV1ZSkKK3MzMiBpeGdiZV9mZGlyX3NldF9pbnB1dF9tYXNrXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsCisJCQkJICAgIHVuaW9uIGl4Z2JlX2F0cl9pbnB1dCAqaW5wdXRfbWFzaykKIHsKLQl1MzIgZmRpcmhhc2g7Ci0JdTMyIGZkaXJjbWQ7Ci0JdTMyIGZkaXJwb3J0LCBmZGlydGNwbTsKLQl1MzIgZmRpcnZsYW47Ci0JLyogc3RhcnQgd2l0aCBWTEFOLCBmbGV4IGJ5dGVzLCBWTSBwb29sLCBhbmQgSVB2NiBkZXN0aW5hdGlvbiBtYXNrZWQgKi8KLQl1MzIgZmRpcm0gPSBJWEdCRV9GRElSTV9WTEFOSUQgfCBJWEdCRV9GRElSTV9WTEFOUCB8IElYR0JFX0ZESVJNX0ZMRVggfAotCQkgICAgSVhHQkVfRkRJUk1fUE9PTCB8IElYR0JFX0ZESVJNX0RJUHY2OwotCi0JLyoKLQkgKiBDaGVjayBmbG93X3R5cGUgZm9ybWF0dGluZywgYW5kIGJhaWwgb3V0IGJlZm9yZSB3ZSB0b3VjaCB0aGUgaGFyZHdhcmUKLQkgKiBpZiB0aGVyZSdzIGEgY29uZmlndXJhdGlvbiBpc3N1ZQotCSAqLwotCXN3aXRjaCAoaW5wdXQtPmZvcm1hdHRlZC5mbG93X3R5cGUpIHsKLQljYXNlIElYR0JFX0FUUl9GTE9XX1RZUEVfSVBWNDoKLQkJLyogdXNlIHRoZSBMNCBwcm90b2NvbCBtYXNrIGZvciByYXcgSVB2NC9JUHY2IHRyYWZmaWMgKi8KLQkJZmRpcm0gfD0gSVhHQkVfRkRJUk1fTDRQOwotCWNhc2UgSVhHQkVfQVRSX0ZMT1dfVFlQRV9TQ1RQVjQ6Ci0JCWlmIChpbnB1dF9tYXNrcy0+ZHN0X3BvcnRfbWFzayB8fCBpbnB1dF9tYXNrcy0+c3JjX3BvcnRfbWFzaykgewotCQkJaHdfZGJnKGh3LCAiIEVycm9yIG9uIHNyYy9kc3QgcG9ydCBtYXNrXG4iKTsKLQkJCXJldHVybiBJWEdCRV9FUlJfQ09ORklHOwotCQl9Ci0JY2FzZSBJWEdCRV9BVFJfRkxPV19UWVBFX1RDUFY0OgotCWNhc2UgSVhHQkVfQVRSX0ZMT1dfVFlQRV9VRFBWNDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaHdfZGJnKGh3LCAiIEVycm9yIG9uIGZsb3cgdHlwZSBpbnB1dFxuIik7Ci0JCXJldHVybiBJWEdCRV9FUlJfQ09ORklHOwotCX0KKwkvKiBtYXNrIElQdjYgc2luY2UgaXQgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgKi8KKwl1MzIgZmRpcm0gPSBJWEdCRV9GRElSTV9ESVB2NjsKKwl1MzIgZmRpcnRjcG07CiAKIAkvKgogCSAqIFByb2dyYW0gdGhlIHJlbGV2YW50IG1hc2sgcmVnaXN0ZXJzLiAgSWYgc3JjL2RzdF9wb3J0IG9yIHNyYy9kc3RfYWRkcgpAQCAtMTYxNCw0MSArMTU3Niw3MSBAQAogCSAqIHBvaW50IGluIHRpbWUuCiAJICovCiAKLQkvKiBQcm9ncmFtIEZESVJNICovCi0Jc3dpdGNoIChudG9ocyhpbnB1dF9tYXNrcy0+dmxhbl9pZF9tYXNrKSAmIDB4RUZGRikgewotCWNhc2UgMHhFRkZGOgotCQkvKiBVbm1hc2sgVkxBTiBJRCAtIGJpdCAwIGFuZCBmYWxsIHRocm91Z2ggdG8gdW5tYXNrIHByaW8gKi8KLQkJZmRpcm0gJj0gfklYR0JFX0ZESVJNX1ZMQU5JRDsKLQljYXNlIDB4RTAwMDoKLQkJLyogVW5tYXNrIFZMQU4gcHJpbyAtIGJpdCAxICovCi0JCWZkaXJtICY9IH5JWEdCRV9GRElSTV9WTEFOUDsKKwkvKiB2ZXJpZnkgYnVja2V0IGhhc2ggaXMgY2xlYXJlZCBvbiBoYXNoIGdlbmVyYXRpb24gKi8KKwlpZiAoaW5wdXRfbWFzay0+Zm9ybWF0dGVkLmJrdF9oYXNoKQorCQlod19kYmcoaHcsICIgYnVja2V0IGhhc2ggc2hvdWxkIGFsd2F5cyBiZSAwIGluIG1hc2tcbiIpOworCisJLyogUHJvZ3JhbSBGRElSTSBhbmQgdmVyaWZ5IHBhcnRpYWwgbWFza3MgKi8KKwlzd2l0Y2ggKGlucHV0X21hc2stPmZvcm1hdHRlZC52bV9wb29sICYgMHg3RikgeworCWNhc2UgMHgwOgorCQlmZGlybSB8PSBJWEdCRV9GRElSTV9QT09MOworCWNhc2UgMHg3RjoKIAkJYnJlYWs7Ci0JY2FzZSAweDBGRkY6Ci0JCS8qIFVubWFzayBWTEFOIElEIC0gYml0IDAgKi8KLQkJZmRpcm0gJj0gfklYR0JFX0ZESVJNX1ZMQU5JRDsKKwlkZWZhdWx0OgorCQlod19kYmcoaHcsICIgRXJyb3Igb24gdm0gcG9vbCBtYXNrXG4iKTsKKwkJcmV0dXJuIElYR0JFX0VSUl9DT05GSUc7CisJfQorCisJc3dpdGNoIChpbnB1dF9tYXNrLT5mb3JtYXR0ZWQuZmxvd190eXBlICYgSVhHQkVfQVRSX0w0VFlQRV9NQVNLKSB7CisJY2FzZSAweDA6CisJCWZkaXJtIHw9IElYR0JFX0ZESVJNX0w0UDsKKwkJaWYgKGlucHV0X21hc2stPmZvcm1hdHRlZC5kc3RfcG9ydCB8fAorCQkgICAgaW5wdXRfbWFzay0+Zm9ybWF0dGVkLnNyY19wb3J0KSB7CisJCQlod19kYmcoaHcsICIgRXJyb3Igb24gc3JjL2RzdCBwb3J0IG1hc2tcbiIpOworCQkJcmV0dXJuIElYR0JFX0VSUl9DT05GSUc7CisJCX0KKwljYXNlIElYR0JFX0FUUl9MNFRZUEVfTUFTSzoKIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaHdfZGJnKGh3LCAiIEVycm9yIG9uIGZsb3cgdHlwZSBtYXNrXG4iKTsKKwkJcmV0dXJuIElYR0JFX0VSUl9DT05GSUc7CisJfQorCisJc3dpdGNoIChudG9ocyhpbnB1dF9tYXNrLT5mb3JtYXR0ZWQudmxhbl9pZCkgJiAweEVGRkYpIHsKIAljYXNlIDB4MDAwMDoKLQkJLyogZG8gbm90aGluZywgdmxhbnMgYWxyZWFkeSBtYXNrZWQgKi8KKwkJLyogbWFzayBWTEFOIElELCBmYWxsIHRocm91Z2ggdG8gbWFzayBWTEFOIHByaW9yaXR5ICovCisJCWZkaXJtIHw9IElYR0JFX0ZESVJNX1ZMQU5JRDsKKwljYXNlIDB4MEZGRjoKKwkJLyogbWFzayBWTEFOIHByaW9yaXR5ICovCisJCWZkaXJtIHw9IElYR0JFX0ZESVJNX1ZMQU5QOworCQlicmVhazsKKwljYXNlIDB4RTAwMDoKKwkJLyogbWFzayBWTEFOIElEIG9ubHksIGZhbGwgdGhyb3VnaCAqLworCQlmZGlybSB8PSBJWEdCRV9GRElSTV9WTEFOSUQ7CisJY2FzZSAweEVGRkY6CisJCS8qIG5vIFZMQU4gZmllbGRzIG1hc2tlZCAqLwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlod19kYmcoaHcsICIgRXJyb3Igb24gVkxBTiBtYXNrXG4iKTsKIAkJcmV0dXJuIElYR0JFX0VSUl9DT05GSUc7CiAJfQogCi0JaWYgKGlucHV0X21hc2tzLT5mbGV4X21hc2sgJiAweEZGRkYpIHsKLQkJaWYgKChpbnB1dF9tYXNrcy0+ZmxleF9tYXNrICYgMHhGRkZGKSAhPSAweEZGRkYpIHsKLQkJCWh3X2RiZyhodywgIiBFcnJvciBvbiBmbGV4aWJsZSBieXRlIG1hc2tcbiIpOwotCQkJcmV0dXJuIElYR0JFX0VSUl9DT05GSUc7Ci0JCX0KLQkJLyogVW5tYXNrIEZsZXggQnl0ZXMgLSBiaXQgNCAqLwotCQlmZGlybSAmPSB+SVhHQkVfRkRJUk1fRkxFWDsKKwlzd2l0Y2ggKGlucHV0X21hc2stPmZvcm1hdHRlZC5mbGV4X2J5dGVzICYgMHhGRkZGKSB7CisJY2FzZSAweDAwMDA6CisJCS8qIE1hc2sgRmxleCBCeXRlcywgZmFsbCB0aHJvdWdoICovCisJCWZkaXJtIHw9IElYR0JFX0ZESVJNX0ZMRVg7CisJY2FzZSAweEZGRkY6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWh3X2RiZyhodywgIiBFcnJvciBvbiBmbGV4aWJsZSBieXRlIG1hc2tcbiIpOworCQlyZXR1cm4gSVhHQkVfRVJSX0NPTkZJRzsKIAl9CiAKIAkvKiBOb3cgbWFzayBWTSBwb29sIGFuZCBkZXN0aW5hdGlvbiBJUHY2IC0gYml0cyA1IGFuZCAyICovCiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GRElSTSwgZmRpcm0pOwogCiAJLyogc3RvcmUgdGhlIFRDUC9VRFAgcG9ydCBtYXNrcywgYml0IHJldmVyc2VkIGZyb20gcG9ydCBsYXlvdXQgKi8KLQlmZGlydGNwbSA9IGl4Z2JlX2dldF9mZGlydGNwbV84MjU5OShpbnB1dF9tYXNrcyk7CisJZmRpcnRjcG0gPSBpeGdiZV9nZXRfZmRpcnRjcG1fODI1OTkoaW5wdXRfbWFzayk7CiAKIAkvKiB3cml0ZSBib3RoIHRoZSBzYW1lIHNvIHRoYXQgVURQIGFuZCBUQ1AgdXNlIHRoZSBzYW1lIG1hc2sgKi8KIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZESVJUQ1BNLCB+ZmRpcnRjcG0pOwpAQCAtMTY1NiwyNCArMTY0OCwzMiBAQAogCiAJLyogc3RvcmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBJUCBtYXNrcyAoYmlnLWVuaWFuKSAqLwogCUlYR0JFX1dSSVRFX1JFR19CRTMyKGh3LCBJWEdCRV9GRElSU0lQNE0sCi0JCQkgICAgIH5pbnB1dF9tYXNrcy0+c3JjX2lwX21hc2tbMF0pOworCQkJICAgICB+aW5wdXRfbWFzay0+Zm9ybWF0dGVkLnNyY19pcFswXSk7CiAJSVhHQkVfV1JJVEVfUkVHX0JFMzIoaHcsIElYR0JFX0ZESVJESVA0TSwKLQkJCSAgICAgfmlucHV0X21hc2tzLT5kc3RfaXBfbWFza1swXSk7CisJCQkgICAgIH5pbnB1dF9tYXNrLT5mb3JtYXR0ZWQuZHN0X2lwWzBdKTsKIAotCS8qIEFwcGx5IG1hc2tzIHRvIGlucHV0IGRhdGEgKi8KLQlpbnB1dC0+Zm9ybWF0dGVkLnZsYW5faWQgJj0gaW5wdXRfbWFza3MtPnZsYW5faWRfbWFzazsKLQlpbnB1dC0+Zm9ybWF0dGVkLmZsZXhfYnl0ZXMgJj0gaW5wdXRfbWFza3MtPmZsZXhfbWFzazsKLQlpbnB1dC0+Zm9ybWF0dGVkLnNyY19wb3J0ICY9IGlucHV0X21hc2tzLT5zcmNfcG9ydF9tYXNrOwotCWlucHV0LT5mb3JtYXR0ZWQuZHN0X3BvcnQgJj0gaW5wdXRfbWFza3MtPmRzdF9wb3J0X21hc2s7Ci0JaW5wdXQtPmZvcm1hdHRlZC5zcmNfaXBbMF0gJj0gaW5wdXRfbWFza3MtPnNyY19pcF9tYXNrWzBdOwotCWlucHV0LT5mb3JtYXR0ZWQuZHN0X2lwWzBdICY9IGlucHV0X21hc2tzLT5kc3RfaXBfbWFza1swXTsKKwlyZXR1cm4gMDsKK30KIAotCS8qIHJlY29yZCB2bGFuIChsaXR0bGUtZW5kaWFuKSBhbmQgZmxleF9ieXRlcyhiaWctZW5kaWFuKSAqLwotCWZkaXJ2bGFuID0KLQkJSVhHQkVfU1RPUkVfQVNfQkUxNihudG9ocyhpbnB1dC0+Zm9ybWF0dGVkLmZsZXhfYnl0ZXMpKTsKLQlmZGlydmxhbiA8PD0gSVhHQkVfRkRJUlZMQU5fRkxFWF9TSElGVDsKLQlmZGlydmxhbiB8PSBudG9ocyhpbnB1dC0+Zm9ybWF0dGVkLnZsYW5faWQpOwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkRJUlZMQU4sIGZkaXJ2bGFuKTsKK3MzMiBpeGdiZV9mZGlyX3dyaXRlX3BlcmZlY3RfZmlsdGVyXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsCisJCQkJCSAgdW5pb24gaXhnYmVfYXRyX2lucHV0ICppbnB1dCwKKwkJCQkJICB1MTYgc29mdF9pZCwgdTggcXVldWUpCit7CisJdTMyIGZkaXJwb3J0LCBmZGlydmxhbiwgZmRpcmhhc2gsIGZkaXJjbWQ7CisKKwkvKiBjdXJyZW50bHkgSVB2NiBpcyBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIHByb2dyYW1tZWQgd2l0aCAwICovCisJSVhHQkVfV1JJVEVfUkVHX0JFMzIoaHcsIElYR0JFX0ZESVJTSVB2NigwKSwKKwkJCSAgICAgaW5wdXQtPmZvcm1hdHRlZC5zcmNfaXBbMF0pOworCUlYR0JFX1dSSVRFX1JFR19CRTMyKGh3LCBJWEdCRV9GRElSU0lQdjYoMSksCisJCQkgICAgIGlucHV0LT5mb3JtYXR0ZWQuc3JjX2lwWzFdKTsKKwlJWEdCRV9XUklURV9SRUdfQkUzMihodywgSVhHQkVfRkRJUlNJUHY2KDIpLAorCQkJICAgICBpbnB1dC0+Zm9ybWF0dGVkLnNyY19pcFsyXSk7CisKKwkvKiByZWNvcmQgdGhlIHNvdXJjZSBhZGRyZXNzIChiaWctZW5kaWFuKSAqLworCUlYR0JFX1dSSVRFX1JFR19CRTMyKGh3LCBJWEdCRV9GRElSSVBTQSwgaW5wdXQtPmZvcm1hdHRlZC5zcmNfaXBbMF0pOworCisJLyogcmVjb3JkIHRoZSBmaXJzdCAzMiBiaXRzIG9mIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIChiaWctZW5kaWFuKSAqLworCUlYR0JFX1dSSVRFX1JFR19CRTMyKGh3LCBJWEdCRV9GRElSSVBEQSwgaW5wdXQtPmZvcm1hdHRlZC5kc3RfaXBbMF0pOwogCiAJLyogcmVjb3JkIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9ydCAobGl0dGxlLWVuZGlhbikqLwogCWZkaXJwb3J0ID0gbnRvaHMoaW5wdXQtPmZvcm1hdHRlZC5kc3RfcG9ydCk7CkBAIC0xNjgxLDI5ICsxNjgxLDgwIEBACiAJZmRpcnBvcnQgfD0gbnRvaHMoaW5wdXQtPmZvcm1hdHRlZC5zcmNfcG9ydCk7CiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GRElSUE9SVCwgZmRpcnBvcnQpOwogCi0JLyogcmVjb3JkIHRoZSBmaXJzdCAzMiBiaXRzIG9mIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIChiaWctZW5kaWFuKSAqLwotCUlYR0JFX1dSSVRFX1JFR19CRTMyKGh3LCBJWEdCRV9GRElSSVBEQSwgaW5wdXQtPmZvcm1hdHRlZC5kc3RfaXBbMF0pOworCS8qIHJlY29yZCB2bGFuIChsaXR0bGUtZW5kaWFuKSBhbmQgZmxleF9ieXRlcyhiaWctZW5kaWFuKSAqLworCWZkaXJ2bGFuID0gSVhHQkVfU1RPUkVfQVNfQkUxNihpbnB1dC0+Zm9ybWF0dGVkLmZsZXhfYnl0ZXMpOworCWZkaXJ2bGFuIDw8PSBJWEdCRV9GRElSVkxBTl9GTEVYX1NISUZUOworCWZkaXJ2bGFuIHw9IG50b2hzKGlucHV0LT5mb3JtYXR0ZWQudmxhbl9pZCk7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GRElSVkxBTiwgZmRpcnZsYW4pOwogCi0JLyogcmVjb3JkIHRoZSBzb3VyY2UgYWRkcmVzcyAoYmlnLWVuZGlhbikgKi8KLQlJWEdCRV9XUklURV9SRUdfQkUzMihodywgSVhHQkVfRkRJUklQU0EsIGlucHV0LT5mb3JtYXR0ZWQuc3JjX2lwWzBdKTsKKwkvKiBjb25maWd1cmUgRkRJUkhBU0ggcmVnaXN0ZXIgKi8KKwlmZGlyaGFzaCA9IGlucHV0LT5mb3JtYXR0ZWQuYmt0X2hhc2g7CisJZmRpcmhhc2ggfD0gc29mdF9pZCA8PCBJWEdCRV9GRElSSEFTSF9TSUdfU1dfSU5ERVhfU0hJRlQ7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GRElSSEFTSCwgZmRpcmhhc2gpOworCisJLyoKKwkgKiBmbHVzaCBhbGwgcHJldmlvdXMgd3JpdGVzIHRvIG1ha2UgY2VydGFpbiByZWdpc3RlcnMgYXJlCisJICogcHJvZ3JhbW1lZCBwcmlvciB0byBpc3N1aW5nIHRoZSBjb21tYW5kCisJICovCisJSVhHQkVfV1JJVEVfRkxVU0goaHcpOwogCiAJLyogY29uZmlndXJlIEZESVJDTUQgcmVnaXN0ZXIgKi8KIAlmZGlyY21kID0gSVhHQkVfRkRJUkNNRF9DTURfQUREX0ZMT1cgfCBJWEdCRV9GRElSQ01EX0ZJTFRFUl9VUERBVEUgfAogCQkgIElYR0JFX0ZESVJDTURfTEFTVCB8IElYR0JFX0ZESVJDTURfUVVFVUVfRU47CisJaWYgKHF1ZXVlID09IElYR0JFX0ZESVJfRFJPUF9RVUVVRSkKKwkJZmRpcmNtZCB8PSBJWEdCRV9GRElSQ01EX0RST1A7CiAJZmRpcmNtZCB8PSBpbnB1dC0+Zm9ybWF0dGVkLmZsb3dfdHlwZSA8PCBJWEdCRV9GRElSQ01EX0ZMT1dfVFlQRV9TSElGVDsKIAlmZGlyY21kIHw9ICh1MzIpcXVldWUgPDwgSVhHQkVfRkRJUkNNRF9SWF9RVUVVRV9TSElGVDsKKwlmZGlyY21kIHw9ICh1MzIpaW5wdXQtPmZvcm1hdHRlZC52bV9wb29sIDw8IElYR0JFX0ZESVJDTURfVlRfUE9PTF9TSElGVDsKIAotCS8qIHdlIG9ubHkgd2FudCB0aGUgYnVja2V0IGhhc2ggc28gZHJvcCB0aGUgdXBwZXIgMTYgYml0cyAqLwotCWZkaXJoYXNoID0gaXhnYmVfYXRyX2NvbXB1dGVfaGFzaF84MjU5OShpbnB1dCwKLQkJCQkJCUlYR0JFX0FUUl9CVUNLRVRfSEFTSF9LRVkpOwotCWZkaXJoYXNoIHw9IHNvZnRfaWQgPDwgSVhHQkVfRkRJUkhBU0hfU0lHX1NXX0lOREVYX1NISUZUOwotCi0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GRElSSEFTSCwgZmRpcmhhc2gpOwogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkRJUkNNRCwgZmRpcmNtZCk7CiAKIAlyZXR1cm4gMDsKIH0KIAorczMyIGl4Z2JlX2ZkaXJfZXJhc2VfcGVyZmVjdF9maWx0ZXJfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodywKKwkJCQkJICB1bmlvbiBpeGdiZV9hdHJfaW5wdXQgKmlucHV0LAorCQkJCQkgIHUxNiBzb2Z0X2lkKQoreworCXUzMiBmZGlyaGFzaDsKKwl1MzIgZmRpcmNtZCA9IDA7CisJdTMyIHJldHJ5X2NvdW50OworCXMzMiBlcnIgPSAwOworCisJLyogY29uZmlndXJlIEZESVJIQVNIIHJlZ2lzdGVyICovCisJZmRpcmhhc2ggPSBpbnB1dC0+Zm9ybWF0dGVkLmJrdF9oYXNoOworCWZkaXJoYXNoIHw9IHNvZnRfaWQgPDwgSVhHQkVfRkRJUkhBU0hfU0lHX1NXX0lOREVYX1NISUZUOworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkRJUkhBU0gsIGZkaXJoYXNoKTsKKworCS8qIGZsdXNoIGhhc2ggdG8gSFcgKi8KKwlJWEdCRV9XUklURV9GTFVTSChodyk7CisKKwkvKiBRdWVyeSBpZiBmaWx0ZXIgaXMgcHJlc2VudCAqLworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkRJUkNNRCwgSVhHQkVfRkRJUkNNRF9DTURfUVVFUllfUkVNX0ZJTFQpOworCisJZm9yIChyZXRyeV9jb3VudCA9IDEwOyByZXRyeV9jb3VudDsgcmV0cnlfY291bnQtLSkgeworCQkvKiBhbGxvdyAxMHVzIGZvciBxdWVyeSB0byBwcm9jZXNzICovCisJCXVkZWxheSgxMCk7CisJCS8qIHZlcmlmeSBxdWVyeSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisJCWZkaXJjbWQgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRkRJUkNNRCk7CisJCWlmICghKGZkaXJjbWQgJiBJWEdCRV9GRElSQ01EX0NNRF9NQVNLKSkKKwkJCWJyZWFrOworCX0KKworCWlmICghcmV0cnlfY291bnQpCisJCWVyciA9IElYR0JFX0VSUl9GRElSX1JFSU5JVF9GQUlMRUQ7CisKKwkvKiBpZiBmaWx0ZXIgZXhpc3RzIGluIGhhcmR3YXJlIHRoZW4gcmVtb3ZlIGl0ICovCisJaWYgKGZkaXJjbWQgJiBJWEdCRV9GRElSQ01EX0ZJTFRFUl9WQUxJRCkgeworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZESVJIQVNILCBmZGlyaGFzaCk7CisJCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GRElSQ01ELAorCQkJCUlYR0JFX0ZESVJDTURfQ01EX1JFTU9WRV9GTE9XKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCiAvKioKICAqICBpeGdiZV9yZWFkX2FuYWxvZ19yZWc4XzgyNTk5IC0gUmVhZHMgOCBiaXQgT21lciBhbmFsb2cgcmVnaXN0ZXIKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCkBAIC0yMTQ2LDYgKzIxOTcsNyBAQAogCS5yZWFkX2FuYWxvZ19yZWc4ICAgICAgID0gJml4Z2JlX3JlYWRfYW5hbG9nX3JlZzhfODI1OTksCiAJLndyaXRlX2FuYWxvZ19yZWc4ICAgICAgPSAmaXhnYmVfd3JpdGVfYW5hbG9nX3JlZzhfODI1OTksCiAJLnNldHVwX2xpbmsgICAgICAgICAgICAgPSAmaXhnYmVfc2V0dXBfbWFjX2xpbmtfODI1OTksCisJLnNldF9yeHBiYQkJPSAmaXhnYmVfc2V0X3J4cGJhX2dlbmVyaWMsCiAJLmNoZWNrX2xpbmsgICAgICAgICAgICAgPSAmaXhnYmVfY2hlY2tfbWFjX2xpbmtfZ2VuZXJpYywKIAkuZ2V0X2xpbmtfY2FwYWJpbGl0aWVzICA9ICZpeGdiZV9nZXRfbGlua19jYXBhYmlsaXRpZXNfODI1OTksCiAJLmxlZF9vbiAgICAgICAgICAgICAgICAgPSAmaXhnYmVfbGVkX29uX2dlbmVyaWMsCkBAIC0yMTYzLDYgKzIyMTUsNyBAQAogCS5jbGVhcl92ZnRhICAgICAgICAgICAgID0gJml4Z2JlX2NsZWFyX3ZmdGFfZ2VuZXJpYywKIAkuc2V0X3ZmdGEgICAgICAgICAgICAgICA9ICZpeGdiZV9zZXRfdmZ0YV9nZW5lcmljLAogCS5mY19lbmFibGUgICAgICAgICAgICAgID0gJml4Z2JlX2ZjX2VuYWJsZV9nZW5lcmljLAorCS5zZXRfZndfZHJ2X3ZlciAgICAgICAgID0gJml4Z2JlX3NldF9md19kcnZfdmVyX2dlbmVyaWMsCiAJLmluaXRfdXRhX3RhYmxlcyAgICAgICAgPSAmaXhnYmVfaW5pdF91dGFfdGFibGVzX2dlbmVyaWMsCiAJLnNldHVwX3NmcCAgICAgICAgICAgICAgPSAmaXhnYmVfc2V0dXBfc2ZwX21vZHVsZXNfODI1OTksCiAJLnNldF9tYWNfYW50aV9zcG9vZmluZyAgPSAmaXhnYmVfc2V0X21hY19hbnRpX3Nwb29maW5nLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uYwppbmRleCBiODk0YjQyLi43NzcwNTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uYwpAQCAtMTI5Miw3ICsxMjkyLDcgQEAKIAogCQl1ZGVsYXkoNSk7CiAJCWl4Z2JlX3N0YW5kYnlfZWVwcm9tKGh3KTsKLQl9OworCX0KIAogCS8qCiAJICogT24gc29tZSBwYXJ0cywgU1BJIHdyaXRlIHRpbWUgY291bGQgdmFyeSBmcm9tIDAtMjBtU2VjIG9uIDMuM1YKQEAgLTEzNzQsNyArMTM3NCw3IEBACiAJCSAqIEVFUFJPTQogCQkgKi8KIAkJbWFzayA9IG1hc2sgPj4gMTsKLQl9OworCX0KIAogCS8qIFdlIGxlYXZlIHRoZSAiREkiIGJpdCBzZXQgdG8gIjAiIHdoZW4gd2UgbGVhdmUgdGhpcyByb3V0aW5lLiAqLwogCWVlYyAmPSB+SVhHQkVfRUVDX0RJOwpAQCAtMzI2NywzICszMjY3LDI0MyBAQAogCiAJcmV0dXJuIDA7CiB9CisKKy8qKgorICogaXhnYmVfc2V0X3J4cGJhX2dlbmVyaWMgLSBJbml0aWFsaXplIFJYIHBhY2tldCBidWZmZXIKKyAqIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKKyAqIEBudW1fcGI6IG51bWJlciBvZiBwYWNrZXQgYnVmZmVycyB0byBhbGxvY2F0ZQorICogQGhlYWRyb29tOiByZXNlcnZlIG4gS0Igb2YgaGVhZHJvb20KKyAqIEBzdHJhdGVneTogcGFja2V0IGJ1ZmZlciBhbGxvY2F0aW9uIHN0cmF0ZWd5CisgKiovCit2b2lkIGl4Z2JlX3NldF9yeHBiYV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsCisJCQkgICAgIGludCBudW1fcGIsCisJCQkgICAgIHUzMiBoZWFkcm9vbSwKKwkJCSAgICAgaW50IHN0cmF0ZWd5KQoreworCXUzMiBwYnNpemUgPSBody0+bWFjLnJ4X3BiX3NpemU7CisJaW50IGkgPSAwOworCXUzMiByeHBrdHNpemUsIHR4cGt0c2l6ZSwgdHhwYnRocmVzaDsKKworCS8qIFJlc2VydmUgaGVhZHJvb20gKi8KKwlwYnNpemUgLT0gaGVhZHJvb207CisKKwlpZiAoIW51bV9wYikKKwkJbnVtX3BiID0gMTsKKworCS8qIERpdmlkZSByZW1haW5pbmcgcGFja2V0IGJ1ZmZlciBzcGFjZSBhbW9uZ3N0IHRoZSBudW1iZXIKKwkgKiBvZiBwYWNrZXQgYnVmZmVycyByZXF1ZXN0ZWQgdXNpbmcgc3VwcGxpZWQgc3RyYXRlZ3kuCisJICovCisJc3dpdGNoIChzdHJhdGVneSkgeworCWNhc2UgKFBCQV9TVFJBVEVHWV9XRUlHSFRFRCk6CisJCS8qIHBiYV84MF80OCBzdHJhdGVneSB3ZWlnaHQgZmlyc3QgaGFsZiBvZiBwYWNrZXQgYnVmZmVyIHdpdGgKKwkJICogNS84IG9mIHRoZSBwYWNrZXQgYnVmZmVyIHNwYWNlLgorCQkgKi8KKwkJcnhwa3RzaXplID0gKChwYnNpemUgKiA1ICogMikgLyAobnVtX3BiICogOCkpOworCQlwYnNpemUgLT0gcnhwa3RzaXplICogKG51bV9wYiAvIDIpOworCQlyeHBrdHNpemUgPDw9IElYR0JFX1JYUEJTSVpFX1NISUZUOworCQlmb3IgKDsgaSA8IChudW1fcGIgLyAyKTsgaSsrKQorCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SWFBCU0laRShpKSwgcnhwa3RzaXplKTsKKwkJLyogRmFsbCB0aHJvdWdoIHRvIGNvbmZpZ3VyZSByZW1haW5pbmcgcGFja2V0IGJ1ZmZlcnMgKi8KKwljYXNlIChQQkFfU1RSQVRFR1lfRVFVQUwpOgorCQkvKiBEaXZpZGUgdGhlIHJlbWFpbmluZyBSeCBwYWNrZXQgYnVmZmVyIGV2ZW5seSBhbW9uZyB0aGUgVENzICovCisJCXJ4cGt0c2l6ZSA9IChwYnNpemUgLyAobnVtX3BiIC0gaSkpIDw8IElYR0JFX1JYUEJTSVpFX1NISUZUOworCQlmb3IgKDsgaSA8IG51bV9wYjsgaSsrKQorCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SWFBCU0laRShpKSwgcnhwa3RzaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBTZXR1cCBUeCBwYWNrZXQgYnVmZmVyIGFuZCB0aHJlc2hvbGQgZXF1YWxseSBmb3IgYWxsIFRDcworCSAqIFRYUEJUSFJFU0ggcmVnaXN0ZXIgaXMgc2V0IGluIEsgc28gZGl2aWRlIGJ5IDEwMjQgYW5kIHN1YnRyYWN0CisJICogMTAgc2luY2UgdGhlIGxhcmdlc3QgcGFja2V0IHdlIHN1cHBvcnQgaXMganVzdCBvdmVyIDlLLgorCSAqLworCXR4cGt0c2l6ZSA9IElYR0JFX1RYUEJTSVpFX01BWCAvIG51bV9wYjsKKwl0eHBidGhyZXNoID0gKHR4cGt0c2l6ZSAvIDEwMjQpIC0gSVhHQkVfVFhQS1RfU0laRV9NQVg7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYjsgaSsrKSB7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVFhQQlNJWkUoaSksIHR4cGt0c2l6ZSk7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVFhQQlRIUkVTSChpKSwgdHhwYnRocmVzaCk7CisJfQorCisJLyogQ2xlYXIgdW51c2VkIFRDcywgaWYgYW55LCB0byB6ZXJvIGJ1ZmZlciBzaXplKi8KKwlmb3IgKDsgaSA8IElYR0JFX01BWF9QQjsgaSsrKSB7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlhQQlNJWkUoaSksIDApOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1RYUEJTSVpFKGkpLCAwKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9UWFBCVEhSRVNIKGkpLCAwKTsKKwl9Cit9CisKKy8qKgorICogIGl4Z2JlX2NhbGN1bGF0ZV9jaGVja3N1bSAtIENhbGN1bGF0ZSBjaGVja3N1bSBmb3IgYnVmZmVyCisgKiAgQGJ1ZmZlcjogcG9pbnRlciB0byBFRVBST00KKyAqICBAbGVuZ3RoOiBzaXplIG9mIEVFUFJPTSB0byBjYWxjdWxhdGUgYSBjaGVja3N1bSBmb3IKKyAqICBDYWxjdWxhdGVzIHRoZSBjaGVja3N1bSBmb3Igc29tZSBidWZmZXIgb24gYSBzcGVjaWZpZWQgbGVuZ3RoLiAgVGhlCisgKiAgY2hlY2tzdW0gY2FsY3VsYXRlZCBpcyByZXR1cm5lZC4KKyAqKi8KK3N0YXRpYyB1OCBpeGdiZV9jYWxjdWxhdGVfY2hlY2tzdW0odTggKmJ1ZmZlciwgdTMyIGxlbmd0aCkKK3sKKwl1MzIgaTsKKwl1OCBzdW0gPSAwOworCisJaWYgKCFidWZmZXIpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQlzdW0gKz0gYnVmZmVyW2ldOworCisJcmV0dXJuICh1OCkgKDAgLSBzdW0pOworfQorCisvKioKKyAqICBpeGdiZV9ob3N0X2ludGVyZmFjZV9jb21tYW5kIC0gSXNzdWUgY29tbWFuZCB0byBtYW5hZ2VhYmlsaXR5IGJsb2NrCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAYnVmZmVyOiBjb250YWlucyB0aGUgY29tbWFuZCB0byB3cml0ZSBhbmQgd2hlcmUgdGhlIHJldHVybiBzdGF0dXMgd2lsbAorICogICAgICAgICAgIGJlIHBsYWNlZAorICogIEBsZW5naHQ6IGxlbmdodCBvZiBidWZmZXIsIG11c3QgYmUgbXVsdGlwbGUgb2YgNCBieXRlcworICoKKyAqICBDb21tdW5pY2F0ZXMgd2l0aCB0aGUgbWFuYWdlYWJpbGl0eSBibG9jay4gIE9uIHN1Y2Nlc3MgcmV0dXJuIDAKKyAqICBlbHNlIHJldHVybiBJWEdCRV9FUlJfSE9TVF9JTlRFUkZBQ0VfQ09NTUFORC4KKyAqKi8KK3N0YXRpYyBzMzIgaXhnYmVfaG9zdF9pbnRlcmZhY2VfY29tbWFuZChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqYnVmZmVyLAorCQkJCQl1MzIgbGVuZ3RoKQoreworCXUzMiBoaWNyLCBpOworCXUzMiBoZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXhnYmVfaGljX2hkcik7CisJdTggYnVmX2xlbiwgZHdvcmRfbGVuOworCisJczMyIHJldF92YWwgPSAwOworCisJaWYgKGxlbmd0aCA9PSAwIHx8IGxlbmd0aCAmIDB4MyB8fAorCSAgICBsZW5ndGggPiBJWEdCRV9ISV9NQVhfQkxPQ0tfQllURV9MRU5HVEgpIHsKKwkJaHdfZGJnKGh3LCAiQnVmZmVyIGxlbmd0aCBmYWlsdXJlLlxuIik7CisJCXJldF92YWwgPSBJWEdCRV9FUlJfSE9TVF9JTlRFUkZBQ0VfQ09NTUFORDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2hlY2sgdGhhdCB0aGUgaG9zdCBpbnRlcmZhY2UgaXMgZW5hYmxlZC4gKi8KKwloaWNyID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0hJQ1IpOworCWlmICgoaGljciAmIElYR0JFX0hJQ1JfRU4pID09IDApIHsKKwkJaHdfZGJnKGh3LCAiSVhHQkVfSE9TVF9FTiBiaXQgZGlzYWJsZWQuXG4iKTsKKwkJcmV0X3ZhbCA9IElYR0JFX0VSUl9IT1NUX0lOVEVSRkFDRV9DT01NQU5EOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgbGVuZ3RoIGluIERXT1JEcyAqLworCWR3b3JkX2xlbiA9IGxlbmd0aCA+PiAyOworCisJLyoKKwkgKiBUaGUgZGV2aWNlIGRyaXZlciB3cml0ZXMgdGhlIHJlbGV2YW50IGNvbW1hbmQgYmxvY2sKKwkgKiBpbnRvIHRoZSByYW0gYXJlYS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZHdvcmRfbGVuOyBpKyspCisJCUlYR0JFX1dSSVRFX1JFR19BUlJBWShodywgSVhHQkVfRkxFWF9NTkcsCisJCQkJICAgICAgaSwgKigodTMyICopYnVmZmVyICsgaSkpOworCisJLyogU2V0dGluZyB0aGlzIGJpdCB0ZWxscyB0aGUgQVJDIHRoYXQgYSBuZXcgY29tbWFuZCBpcyBwZW5kaW5nLiAqLworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfSElDUiwgaGljciB8IElYR0JFX0hJQ1JfQyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVhHQkVfSElfQ09NTUFORF9USU1FT1VUOyBpKyspIHsKKwkJaGljciA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9ISUNSKTsKKwkJaWYgKCEoaGljciAmIElYR0JFX0hJQ1JfQykpCisJCQlicmVhazsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0KKworCS8qIENoZWNrIGNvbW1hbmQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLiAqLworCWlmIChpID09IElYR0JFX0hJX0NPTU1BTkRfVElNRU9VVCB8fAorCSAgICAoIShJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfSElDUikgJiBJWEdCRV9ISUNSX1NWKSkpIHsKKwkJaHdfZGJnKGh3LCAiQ29tbWFuZCBoYXMgZmFpbGVkIHdpdGggbm8gc3RhdHVzIHZhbGlkLlxuIik7CisJCXJldF92YWwgPSBJWEdCRV9FUlJfSE9TVF9JTlRFUkZBQ0VfQ09NTUFORDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2FsY3VsYXRlIGxlbmd0aCBpbiBEV09SRHMgKi8KKwlkd29yZF9sZW4gPSBoZHJfc2l6ZSA+PiAyOworCisJLyogZmlyc3QgcHVsbCBpbiB0aGUgaGVhZGVyIHNvIHdlIGtub3cgdGhlIGJ1ZmZlciBsZW5ndGggKi8KKwlmb3IgKGkgPSAwOyBpIDwgZHdvcmRfbGVuOyBpKyspCisJCSooKHUzMiAqKWJ1ZmZlciArIGkpID0KKwkJCUlYR0JFX1JFQURfUkVHX0FSUkFZKGh3LCBJWEdCRV9GTEVYX01ORywgaSk7CisKKwkvKiBJZiB0aGVyZSBpcyBhbnkgdGhpbmcgaW4gZGF0YSBwb3NpdGlvbiBwdWxsIGl0IGluICovCisJYnVmX2xlbiA9ICgoc3RydWN0IGl4Z2JlX2hpY19oZHIgKilidWZmZXIpLT5idWZfbGVuOworCWlmIChidWZfbGVuID09IDApCisJCWdvdG8gb3V0OworCisJaWYgKGxlbmd0aCA8IChidWZfbGVuICsgaGRyX3NpemUpKSB7CisJCWh3X2RiZyhodywgIkJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoIGZvciByZXBseSBtZXNzYWdlLlxuIik7CisJCXJldF92YWwgPSBJWEdCRV9FUlJfSE9TVF9JTlRFUkZBQ0VfQ09NTUFORDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2FsY3VsYXRlIGxlbmd0aCBpbiBEV09SRHMsIGFkZCBvbmUgZm9yIG9kZCBsZW5ndGhzICovCisJZHdvcmRfbGVuID0gKGJ1Zl9sZW4gKyAxKSA+PiAyOworCisJLyogUHVsbCBpbiB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyIChpIGlzIHdoZXJlIHdlIGxlZnQgb2ZmKSovCisJZm9yICg7IGkgPCBidWZfbGVuOyBpKyspCisJCSooKHUzMiAqKWJ1ZmZlciArIGkpID0KKwkJCUlYR0JFX1JFQURfUkVHX0FSUkFZKGh3LCBJWEdCRV9GTEVYX01ORywgaSk7CisKK291dDoKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqCisgKiAgaXhnYmVfc2V0X2Z3X2Rydl92ZXJfZ2VuZXJpYyAtIFNlbmRzIGRyaXZlciB2ZXJzaW9uIHRvIGZpcm13YXJlCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqICBAbWFqOiBkcml2ZXIgdmVyc2lvbiBtYWpvciBudW1iZXIKKyAqICBAbWluOiBkcml2ZXIgdmVyc2lvbiBtaW5vciBudW1iZXIKKyAqICBAYnVpbGQ6IGRyaXZlciB2ZXJzaW9uIGJ1aWxkIG51bWJlcgorICogIEBzdWI6IGRyaXZlciB2ZXJzaW9uIHN1YiBidWlsZCBudW1iZXIKKyAqCisgKiAgU2VuZHMgZHJpdmVyIHZlcnNpb24gbnVtYmVyIHRvIGZpcm13YXJlIHRocm91Z2ggdGhlIG1hbmFnZWFiaWxpdHkKKyAqICBibG9jay4gIE9uIHN1Y2Nlc3MgcmV0dXJuIDAKKyAqICBlbHNlIHJldHVybnMgSVhHQkVfRVJSX1NXRldfU1lOQyB3aGVuIGVuY291bnRlcmluZyBhbiBlcnJvciBhY3F1aXJpbmcKKyAqICBzZW1hcGhvcmUgb3IgSVhHQkVfRVJSX0hPU1RfSU5URVJGQUNFX0NPTU1BTkQgd2hlbiBjb21tYW5kIGZhaWxzLgorICoqLworczMyIGl4Z2JlX3NldF9md19kcnZfdmVyX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggbWFqLCB1OCBtaW4sCisJCQkJIHU4IGJ1aWxkLCB1OCBzdWIpCit7CisJc3RydWN0IGl4Z2JlX2hpY19kcnZfaW5mbyBmd19jbWQ7CisJaW50IGk7CisJczMyIHJldF92YWwgPSAwOworCisJaWYgKGh3LT5tYWMub3BzLmFjcXVpcmVfc3dmd19zeW5jKGh3LCBJWEdCRV9HU1NSX1NXX01OR19TTSkgIT0gMCkgeworCQlyZXRfdmFsID0gSVhHQkVfRVJSX1NXRldfU1lOQzsKKwkJZ290byBvdXQ7CisJfQorCisJZndfY21kLmhkci5jbWQgPSBGV19DRU1fQ01EX0RSSVZFUl9JTkZPOworCWZ3X2NtZC5oZHIuYnVmX2xlbiA9IEZXX0NFTV9DTURfRFJJVkVSX0lORk9fTEVOOworCWZ3X2NtZC5oZHIuY21kX29yX3Jlc3AuY21kX3Jlc3YgPSBGV19DRU1fQ01EX1JFU0VSVkVEOworCWZ3X2NtZC5wb3J0X251bSA9ICh1OClody0+YnVzLmZ1bmM7CisJZndfY21kLnZlcl9tYWogPSBtYWo7CisJZndfY21kLnZlcl9taW4gPSBtaW47CisJZndfY21kLnZlcl9idWlsZCA9IGJ1aWxkOworCWZ3X2NtZC52ZXJfc3ViID0gc3ViOworCWZ3X2NtZC5oZHIuY2hlY2tzdW0gPSAwOworCWZ3X2NtZC5oZHIuY2hlY2tzdW0gPSBpeGdiZV9jYWxjdWxhdGVfY2hlY2tzdW0oKHU4ICopJmZ3X2NtZCwKKwkJCQkoRldfQ0VNX0hEUl9MRU4gKyBmd19jbWQuaGRyLmJ1Zl9sZW4pKTsKKwlmd19jbWQucGFkID0gMDsKKwlmd19jbWQucGFkMiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDw9IEZXX0NFTV9NQVhfUkVUUklFUzsgaSsrKSB7CisJCXJldF92YWwgPSBpeGdiZV9ob3N0X2ludGVyZmFjZV9jb21tYW5kKGh3LCAodTggKikmZndfY21kLAorCQkJCQkJICAgICAgIHNpemVvZihmd19jbWQpKTsKKwkJaWYgKHJldF92YWwgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChmd19jbWQuaGRyLmNtZF9vcl9yZXNwLnJldF9zdGF0dXMgPT0KKwkJICAgIEZXX0NFTV9SRVNQX1NUQVRVU19TVUNDRVNTKQorCQkJcmV0X3ZhbCA9IDA7CisJCWVsc2UKKwkJCXJldF92YWwgPSBJWEdCRV9FUlJfSE9TVF9JTlRFUkZBQ0VfQ09NTUFORDsKKworCQlicmVhazsKKwl9CisKKwlody0+bWFjLm9wcy5yZWxlYXNlX3N3Zndfc3luYyhodywgSVhHQkVfR1NTUl9TV19NTkdfU00pOworb3V0OgorCXJldHVybiByZXRfdmFsOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfY29tbW9uLmggYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uaAppbmRleCA0NmJlODNjLi5mMjRmZDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uaApAQCAtOTksNiArOTksMTEgQEAKIHZvaWQgaXhnYmVfc2V0X21hY19hbnRpX3Nwb29maW5nKHN0cnVjdCBpeGdiZV9odyAqaHcsIGJvb2wgZW5hYmxlLCBpbnQgcGYpOwogdm9pZCBpeGdiZV9zZXRfdmxhbl9hbnRpX3Nwb29maW5nKHN0cnVjdCBpeGdiZV9odyAqaHcsIGJvb2wgZW5hYmxlLCBpbnQgdmYpOwogczMyIGl4Z2JlX2dldF9kZXZpY2VfY2Fwc19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUxNiAqZGV2aWNlX2NhcHMpOworczMyIGl4Z2JlX3NldF9md19kcnZfdmVyX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggbWFqLCB1OCBtaW4sCisJCQkJIHU4IGJ1aWxkLCB1OCB2ZXIpOworCit2b2lkIGl4Z2JlX3NldF9yeHBiYV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIGludCBudW1fcGIsCisJCQkgICAgIHUzMiBoZWFkcm9vbSwgaW50IHN0cmF0ZWd5KTsKIAogI2RlZmluZSBJWEdCRV9XUklURV9SRUcoYSwgcmVnLCB2YWx1ZSkgd3JpdGVsKCh2YWx1ZSksICgoYSktPmh3X2FkZHIgKyAocmVnKSkpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYi5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiLmMKaW5kZXggNjg2YTE3YS4uOWQ4OGMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiLmMKQEAgLTI1OCwxNSArMjU4LDEzIEBACiAKIAlzd2l0Y2ggKGh3LT5tYWMudHlwZSkgewogCWNhc2UgaXhnYmVfbWFjXzgyNTk4RUI6Ci0JCXJldCA9IGl4Z2JlX2RjYl9od19jb25maWdfODI1OTgoaHcsIGRjYl9jb25maWctPnJ4X3BiYV9jZmcsCi0JCQkJCQlwZmNfZW4sIHJlZmlsbCwgbWF4LCBid2dpZCwKLQkJCQkJCXB0eXBlKTsKKwkJcmV0ID0gaXhnYmVfZGNiX2h3X2NvbmZpZ184MjU5OChodywgcGZjX2VuLCByZWZpbGwsIG1heCwKKwkJCQkJCWJ3Z2lkLCBwdHlwZSk7CiAJCWJyZWFrOwogCWNhc2UgaXhnYmVfbWFjXzgyNTk5RUI6CiAJY2FzZSBpeGdiZV9tYWNfWDU0MDoKLQkJcmV0ID0gaXhnYmVfZGNiX2h3X2NvbmZpZ184MjU5OShodywgZGNiX2NvbmZpZy0+cnhfcGJhX2NmZywKLQkJCQkJCXBmY19lbiwgcmVmaWxsLCBtYXgsIGJ3Z2lkLAotCQkJCQkJcHR5cGUsIHByaW9fdGMpOworCQlyZXQgPSBpeGdiZV9kY2JfaHdfY29uZmlnXzgyNTk5KGh3LCBwZmNfZW4sIHJlZmlsbCwgbWF4LAorCQkJCQkJYndnaWQsIHB0eXBlLCBwcmlvX3RjKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9kY2IuaCBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYi5oCmluZGV4IDk0NDgzOGYuLmU4NTgyNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYi5oCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYi5oCkBAIC0xMjMsMTEgKzEyMyw2IEBACiAJdTggdGM7IC8qIFRyYWZmaWMgY2xhc3MgKFRDKSAqLwogfTsKIAotZW51bSBkY2JfcnhfcGJhX2NmZyB7Ci0JcGJhX2VxdWFsLCAgICAgLyogUEJBWzAtN10gZWFjaCB1c2UgNjRLQiBGSUZPICovCi0JcGJhXzgwXzQ4ICAgICAgLyogUEJBWzAtM10gZWFjaCB1c2UgODBLQiwgUEJBWzQtN10gZWFjaCB1c2UgNDhLQiAqLwotfTsKLQogc3RydWN0IGRjYl9udW1fdGNzIHsKIAl1OCBwZ190Y3M7CiAJdTggcGZjX3RjczsKQEAgLTE0MCw4ICsxMzUsNiBAQAogCXU4ICAgICBid19wZXJjZW50YWdlWzJdW01BWF9CV19HUk9VUF07IC8qIE9uZSBlYWNoIGZvciBUeC9SeCAqLwogCWJvb2wgICBwZmNfbW9kZV9lbmFibGU7CiAKLQllbnVtIGRjYl9yeF9wYmFfY2ZnIHJ4X3BiYV9jZmc7Ci0KIAl1MzIgIGRjYl9jZmdfdmVyc2lvbjsgLyogTm90IHVzZWQuLi5PUy1zcGVjaWZpYz8gKi8KIAl1MzIgIGxpbmtfc3BlZWQ7IC8qIEZvciBiYW5kd2lkdGggYWxsb2NhdGlvbiB2YWxpZGF0aW9uIHB1cnBvc2UgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9kY2JfODI1OTguYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYl84MjU5OC5jCmluZGV4IDc3MWQwMWEuLjIyODhjM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYl84MjU5OC5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYl84MjU5OC5jCkBAIC0zMiw0NSArMzIsNiBAQAogI2luY2x1ZGUgIml4Z2JlX2RjYl84MjU5OC5oIgogCiAvKioKLSAqIGl4Z2JlX2RjYl9jb25maWdfcGFja2V0X2J1ZmZlcnNfODI1OTggLSBDb25maWd1cmUgcGFja2V0IGJ1ZmZlcnMKLSAqIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKLSAqIEBkY2JfY29uZmlnOiBwb2ludGVyIHRvIGl4Z2JlX2RjYl9jb25maWcgc3RydWN0dXJlCi0gKgotICogQ29uZmlndXJlIHBhY2tldCBidWZmZXJzIGZvciBEQ0IgbW9kZS4KLSAqLwotc3RhdGljIHMzMiBpeGdiZV9kY2JfY29uZmlnX3BhY2tldF9idWZmZXJzXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4IHJ4X3BiYSkKLXsKLQlzMzIgcmV0X3ZhbCA9IDA7Ci0JdTMyIHZhbHVlID0gSVhHQkVfUlhQQlNJWkVfNjRLQjsKLQl1OCAgaSA9IDA7Ci0KLQkvKiBTZXR1cCBSeCBwYWNrZXQgYnVmZmVyIHNpemVzICovCi0Jc3dpdGNoIChyeF9wYmEpIHsKLQljYXNlIHBiYV84MF80ODoKLQkJLyogU2V0dXAgdGhlIGZpcnN0IGZvdXIgYXQgODBLQiAqLwotCQl2YWx1ZSA9IElYR0JFX1JYUEJTSVpFXzgwS0I7Ci0JCWZvciAoOyBpIDwgNDsgaSsrKQotCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SWFBCU0laRShpKSwgdmFsdWUpOwotCQkvKiBTZXR1cCB0aGUgbGFzdCBmb3VyIGF0IDQ4S0IuLi5kb24ndCByZS1pbml0IGkgKi8KLQkJdmFsdWUgPSBJWEdCRV9SWFBCU0laRV80OEtCOwotCQkvKiBGYWxsIFRocm91Z2ggKi8KLQljYXNlIHBiYV9lcXVhbDoKLQlkZWZhdWx0OgotCQlmb3IgKDsgaSA8IElYR0JFX01BWF9QQUNLRVRfQlVGRkVSUzsgaSsrKQotCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SWFBCU0laRShpKSwgdmFsdWUpOwotCi0JCS8qIFNldHVwIFR4IHBhY2tldCBidWZmZXIgc2l6ZXMgKi8KLQkJZm9yIChpID0gMDsgaSA8IElYR0JFX01BWF9QQUNLRVRfQlVGRkVSUzsgaSsrKSB7Ci0JCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1RYUEJTSVpFKGkpLAotCQkJCQlJWEdCRV9UWFBCU0laRV80MEtCKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyoqCiAgKiBpeGdiZV9kY2JfY29uZmlnX3J4X2FyYml0ZXJfODI1OTggLSBDb25maWcgUnggZGF0YSBhcmJpdGVyCiAgKiBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCiAgKiBAZGNiX2NvbmZpZzogcG9pbnRlciB0byBpeGdiZV9kY2JfY29uZmlnIHN0cnVjdHVyZQpAQCAtMzIxLDExICsyODIsOSBAQAogICoKICAqIENvbmZpZ3VyZSBkY2Igc2V0dGluZ3MgYW5kIGVuYWJsZSBkY2IgbW9kZS4KICAqLwotczMyIGl4Z2JlX2RjYl9od19jb25maWdfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywKLQkJCSAgICAgIHU4IHJ4X3BiYSwgdTggcGZjX2VuLCB1MTYgKnJlZmlsbCwKK3MzMiBpeGdiZV9kY2JfaHdfY29uZmlnXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4IHBmY19lbiwgdTE2ICpyZWZpbGwsCiAJCQkgICAgICB1MTYgKm1heCwgdTggKmJ3Z19pZCwgdTggKnByaW9fdHlwZSkKIHsKLQlpeGdiZV9kY2JfY29uZmlnX3BhY2tldF9idWZmZXJzXzgyNTk4KGh3LCByeF9wYmEpOwogCWl4Z2JlX2RjYl9jb25maWdfcnhfYXJiaXRlcl84MjU5OChodywgcmVmaWxsLCBtYXgsIHByaW9fdHlwZSk7CiAJaXhnYmVfZGNiX2NvbmZpZ190eF9kZXNjX2FyYml0ZXJfODI1OTgoaHcsIHJlZmlsbCwgbWF4LAogCQkJCQkgICAgICAgYndnX2lkLCBwcmlvX3R5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiXzgyNTk4LmggYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9kY2JfODI1OTguaAppbmRleCAxZTk3NTBjLi4yZjMxODkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9kY2JfODI1OTguaAorKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9kY2JfODI1OTguaApAQCAtOTEsOCArOTEsNyBAQAogCQkJCQkJdTggKmJ3Z19pZCwKIAkJCQkJCXU4ICpwcmlvX3R5cGUpOwogCi1zMzIgaXhnYmVfZGNiX2h3X2NvbmZpZ184MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LAotCQkJICAgICAgdTggcnhfcGJhLCB1OCBwZmNfZW4sIHUxNiAqcmVmaWxsLAorczMyIGl4Z2JlX2RjYl9od19jb25maWdfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggcGZjX2VuLCB1MTYgKnJlZmlsbCwKIAkJCSAgICAgIHUxNiAqbWF4LCB1OCAqYndnX2lkLCB1OCAqcHJpb190eXBlKTsKIAogI2VuZGlmIC8qIF9EQ0JfODI1OThfQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYl84MjU5OS5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiXzgyNTk5LmMKaW5kZXggZDUwY2Y3OC4uYWRlOTgyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiXzgyNTk5LmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiXzgyNTk5LmMKQEAgLTMxLDYzICszMSw2IEBACiAjaW5jbHVkZSAiaXhnYmVfZGNiXzgyNTk5LmgiCiAKIC8qKgotICogaXhnYmVfZGNiX2NvbmZpZ19wYWNrZXRfYnVmZmVyc184MjU5OSAtIENvbmZpZ3VyZSBEQ0IgcGFja2V0IGJ1ZmZlcnMKLSAqIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKLSAqIEByeF9wYmE6IG1ldGhvZCB0byBkaXN0cmlidXRlIHBhY2tldCBidWZmZXIKLSAqCi0gKiBDb25maWd1cmUgcGFja2V0IGJ1ZmZlcnMgZm9yIERDQiBtb2RlLgotICovCi1zdGF0aWMgczMyIGl4Z2JlX2RjYl9jb25maWdfcGFja2V0X2J1ZmZlcnNfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggcnhfcGJhKQotewotCWludCBudW1fdGNzID0gSVhHQkVfTUFYX1BBQ0tFVF9CVUZGRVJTOwotCXUzMiByeF9wYl9zaXplID0gaHctPm1hYy5yeF9wYl9zaXplIDw8IElYR0JFX1JYUEJTSVpFX1NISUZUOwotCXUzMiByeHBrdHNpemU7Ci0JdTMyIHR4cGt0c2l6ZTsKLQl1MzIgdHhwYnRocmVzaDsKLQl1OCAgaSA9IDA7Ci0KLQkvKgotCSAqIFRoaXMgcmVhbGx5IG1lYW5zIGNvbmZpZ3VyZSB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgVENzCi0JICogKFRyYWZmaWMgQ2xhc3NlcykgdG8gdXNlIDUvOCBvZiB0aGUgUnggcGFja2V0IGJ1ZmZlcgotCSAqIHNwYWNlLiAgVG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgZm9yIGVhY2ggVEMsCi0JICogd2UgYXJlIG11bHRpcGx5aW5nIHRoZSBhdmVyYWdlIHNpemUgYnkgNS80IGFuZCBhcHBseWluZwotCSAqIGl0IHRvIGhhbGYgb2YgdGhlIHRyYWZmaWMgY2xhc3Nlcy4KLQkgKi8KLQlpZiAocnhfcGJhID09IHBiYV84MF80OCkgewotCQlyeHBrdHNpemUgPSAocnhfcGJfc2l6ZSAqIDUpIC8gKG51bV90Y3MgKiA0KTsKLQkJcnhfcGJfc2l6ZSAtPSByeHBrdHNpemUgKiAobnVtX3RjcyAvIDIpOwotCQlmb3IgKDsgaSA8IChudW1fdGNzIC8gMik7IGkrKykKLQkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlhQQlNJWkUoaSksIHJ4cGt0c2l6ZSk7Ci0JfQotCi0JLyogRGl2aWRlIHRoZSByZW1haW5pbmcgUnggcGFja2V0IGJ1ZmZlciBldmVubHkgYW1vbmcgdGhlIFRDcyAqLwotCXJ4cGt0c2l6ZSA9IHJ4X3BiX3NpemUgLyAobnVtX3RjcyAtIGkpOwotCWZvciAoOyBpIDwgbnVtX3RjczsgaSsrKQotCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYUEJTSVpFKGkpLCByeHBrdHNpemUpOwotCi0JLyoKLQkgKiBTZXR1cCBUeCBwYWNrZXQgYnVmZmVyIGFuZCB0aHJlc2hvbGQgZXF1YWxseSBmb3IgYWxsIFRDcwotCSAqIFRYUEJUSFJFU0ggcmVnaXN0ZXIgaXMgc2V0IGluIEsgc28gZGl2aWRlIGJ5IDEwMjQgYW5kIHN1YnRyYWN0Ci0JICogMTAgc2luY2UgdGhlIGxhcmdlc3QgcGFja2V0IHdlIHN1cHBvcnQgaXMganVzdCBvdmVyIDlLLgotCSAqLwotCXR4cGt0c2l6ZSA9IElYR0JFX1RYUEJTSVpFX01BWCAvIG51bV90Y3M7Ci0JdHhwYnRocmVzaCA9ICh0eHBrdHNpemUgLyAxMDI0KSAtIElYR0JFX1RYUEtUX1NJWkVfTUFYOwotCWZvciAoaSA9IDA7IGkgPCBudW1fdGNzOyBpKyspIHsKLQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9UWFBCU0laRShpKSwgdHhwa3RzaXplKTsKLQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9UWFBCVEhSRVNIKGkpLCB0eHBidGhyZXNoKTsKLQl9Ci0KLQkvKiBDbGVhciB1bnVzZWQgVENzLCBpZiBhbnksIHRvIHplcm8gYnVmZmVyIHNpemUqLwotCWZvciAoOyBpIDwgTUFYX1RSQUZGSUNfQ0xBU1M7IGkrKykgewotCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYUEJTSVpFKGkpLCAwKTsKLQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9UWFBCU0laRShpKSwgMCk7Ci0JCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVFhQQlRIUkVTSChpKSwgMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgogICogaXhnYmVfZGNiX2NvbmZpZ19yeF9hcmJpdGVyXzgyNTk5IC0gQ29uZmlnIFJ4IERhdGEgYXJiaXRlcgogICogQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICogQHJlZmlsbDogcmVmaWxsIGNyZWRpdHMgaW5kZXggYnkgdHJhZmZpYyBjbGFzcwpAQCAtMzc2LDY1ICszMTksOCBAQAogfQogCiAvKioKLSAqIGl4Z2JlX2RjYl9jb25maWdfODI1OTkgLSBDb25maWd1cmUgZ2VuZXJhbCBEQ0IgcGFyYW1ldGVycwotICogQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQotICoKLSAqIENvbmZpZ3VyZSBnZW5lcmFsIERDQiBwYXJhbWV0ZXJzLgotICovCi1zdGF0aWMgczMyIGl4Z2JlX2RjYl9jb25maWdfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodykKLXsKLQl1MzIgcmVnOwotCXUzMiBxOwotCi0JLyogRGlzYWJsZSB0aGUgVHggZGVzYyBhcmJpdGVyIHNvIHRoYXQgTVRRQyBjYW4gYmUgY2hhbmdlZCAqLwotCXJlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SVFREQ1MpOwotCXJlZyB8PSBJWEdCRV9SVFREQ1NfQVJCRElTOwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlRURENTLCByZWcpOwotCi0JLyogRW5hYmxlIERDQiBmb3IgUnggd2l0aCA4IFRDcyAqLwotCXJlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9NUlFDKTsKLQlzd2l0Y2ggKHJlZyAmIElYR0JFX01SUUNfTVJRRV9NQVNLKSB7Ci0JY2FzZSAwOgotCWNhc2UgSVhHQkVfTVJRQ19SVDRUQ0VOOgotCQkvKiBSU1MgZGlzYWJsZWQgY2FzZXMgKi8KLQkJcmVnID0gKHJlZyAmIH5JWEdCRV9NUlFDX01SUUVfTUFTSykgfCBJWEdCRV9NUlFDX1JUOFRDRU47Ci0JCWJyZWFrOwotCWNhc2UgSVhHQkVfTVJRQ19SU1NFTjoKLQljYXNlIElYR0JFX01SUUNfUlRSU1M0VENFTjoKLQkJLyogUlNTIGVuYWJsZWQgY2FzZXMgKi8KLQkJcmVnID0gKHJlZyAmIH5JWEdCRV9NUlFDX01SUUVfTUFTSykgfCBJWEdCRV9NUlFDX1JUUlNTOFRDRU47Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIFVuc3VwcG9ydGVkIHZhbHVlLCBhc3N1bWUgc3RhbGUgZGF0YSwgb3ZlcndyaXRlIG5vIFJTUyAqLwotCQlyZWcgPSAocmVnICYgfklYR0JFX01SUUNfTVJRRV9NQVNLKSB8IElYR0JFX01SUUNfUlQ4VENFTjsKLQl9Ci0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9NUlFDLCByZWcpOwotCi0JLyogRW5hYmxlIERDQiBmb3IgVHggd2l0aCA4IFRDcyAqLwotCXJlZyA9IElYR0JFX01UUUNfUlRfRU5BIHwgSVhHQkVfTVRRQ184VENfOFRROwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfTVRRQywgcmVnKTsKLQotCS8qIERpc2FibGUgZHJvcCBmb3IgYWxsIHF1ZXVlcyAqLwotCWZvciAocSA9IDA7IHEgPCAxMjg7IHErKykKLQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9RREUsIHEgPDwgSVhHQkVfUURFX0lEWF9TSElGVCk7Ci0KLQkvKiBFbmFibGUgdGhlIFR4IGRlc2MgYXJiaXRlciAqLwotCXJlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SVFREQ1MpOwotCXJlZyAmPSB+SVhHQkVfUlRURENTX0FSQkRJUzsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JUVERDUywgcmVnKTsKLQotCS8qIEVuYWJsZSBTZWN1cml0eSBUWCBCdWZmZXIgSUZHIGZvciBEQ0IgKi8KLQlyZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfU0VDVFhNSU5JRkcpOwotCXJlZyB8PSBJWEdCRV9TRUNUWF9EQ0I7Ci0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9TRUNUWE1JTklGRywgcmVnKTsKLQotCXJldHVybiAwOwotfQotCi0vKioKICAqIGl4Z2JlX2RjYl9od19jb25maWdfODI1OTkgLSBDb25maWd1cmUgYW5kIGVuYWJsZSBEQ0IKICAqIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKLSAqIEByeF9wYmE6IG1ldGhvZCB0byBkaXN0cmlidXRlIHBhY2tldCBidWZmZXIKICAqIEByZWZpbGw6IHJlZmlsbCBjcmVkaXRzIGluZGV4IGJ5IHRyYWZmaWMgY2xhc3MKICAqIEBtYXg6IG1heCBjcmVkaXRzIGluZGV4IGJ5IHRyYWZmaWMgY2xhc3MKICAqIEBid2dfaWQ6IGJhbmR3aWR0aCBncm91cGluZyBpbmRleGVkIGJ5IHRyYWZmaWMgY2xhc3MKQEAgLTQ0MywxMiArMzI5LDkgQEAKICAqCiAgKiBDb25maWd1cmUgZGNiIHNldHRpbmdzIGFuZCBlbmFibGUgZGNiIG1vZGUuCiAgKi8KLXMzMiBpeGdiZV9kY2JfaHdfY29uZmlnXzgyNTk5KHN0cnVjdCBpeGdiZV9odyAqaHcsCi0JCQkgICAgICB1OCByeF9wYmEsIHU4IHBmY19lbiwgdTE2ICpyZWZpbGwsCitzMzIgaXhnYmVfZGNiX2h3X2NvbmZpZ184MjU5OShzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCBwZmNfZW4sIHUxNiAqcmVmaWxsLAogCQkJICAgICAgdTE2ICptYXgsIHU4ICpid2dfaWQsIHU4ICpwcmlvX3R5cGUsIHU4ICpwcmlvX3RjKQogewotCWl4Z2JlX2RjYl9jb25maWdfcGFja2V0X2J1ZmZlcnNfODI1OTkoaHcsIHJ4X3BiYSk7Ci0JaXhnYmVfZGNiX2NvbmZpZ184MjU5OShodyk7CiAJaXhnYmVfZGNiX2NvbmZpZ19yeF9hcmJpdGVyXzgyNTk5KGh3LCByZWZpbGwsIG1heCwgYndnX2lkLAogCQkJCQkgIHByaW9fdHlwZSwgcHJpb190Yyk7CiAJaXhnYmVfZGNiX2NvbmZpZ190eF9kZXNjX2FyYml0ZXJfODI1OTkoaHcsIHJlZmlsbCwgbWF4LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZGNiXzgyNTk5LmggYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9kY2JfODI1OTkuaAppbmRleCAyZGU3MWE1Li4wOGQxNzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9kY2JfODI1OTkuaAorKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9kY2JfODI1OTkuaApAQCAtODYsMTcgKzg2LDYgQEAKICNkZWZpbmUgSVhHQkVfUlRUUENTX0FSQkRfU0hJRlQgMjIKICNkZWZpbmUgSVhHQkVfUlRUUENTX0FSQkRfRENCICAgMHg0ICAgICAgICAvKiBBcmJpdHJhdGlvbiBkZWxheSBpbiBEQ0IgbW9kZSAqLwogCi0jZGVmaW5lIElYR0JFX1RYUEJTSVpFXzIwS0IgICAgIDB4MDAwMDUwMDAgLyogMjBLQiBQYWNrZXQgQnVmZmVyICovCi0jZGVmaW5lIElYR0JFX1RYUEJTSVpFXzQwS0IgICAgIDB4MDAwMEEwMDAgLyogNDBLQiBQYWNrZXQgQnVmZmVyICovCi0jZGVmaW5lIElYR0JFX1JYUEJTSVpFXzQ4S0IgICAgIDB4MDAwMEMwMDAgLyogNDhLQiBQYWNrZXQgQnVmZmVyICovCi0jZGVmaW5lIElYR0JFX1JYUEJTSVpFXzY0S0IgICAgIDB4MDAwMTAwMDAgLyogNjRLQiBQYWNrZXQgQnVmZmVyICovCi0jZGVmaW5lIElYR0JFX1JYUEJTSVpFXzgwS0IgICAgIDB4MDAwMTQwMDAgLyogODBLQiBQYWNrZXQgQnVmZmVyICovCi0jZGVmaW5lIElYR0JFX1JYUEJTSVpFXzEyOEtCICAgIDB4MDAwMjAwMDAgLyogMTI4S0IgUGFja2V0IEJ1ZmZlciAqLwotI2RlZmluZSBJWEdCRV9UWFBCU0laRV9NQVgJMHgwMDAyODAwMCAvKiAxNjBLQiBQYWNrZXQgQnVmZmVyKi8KLQotI2RlZmluZSBJWEdCRV9UWFBCVEhSRVNIX0RDQiAgICAweEEgICAgICAgIC8qIFRIUkVTSCB2YWx1ZSBmb3IgRENCIG1vZGUgKi8KLSNkZWZpbmUgSVhHQkVfVFhQS1RfU0laRV9NQVggICAgMHhBICAgICAgICAvKiBNYXggVHggUGFja2V0IHNpemUgICovCi0KIC8qIFNFQ1RYTUlOSUZHIERDQiAqLwogI2RlZmluZSBJWEdCRV9TRUNUWF9EQ0IJCTB4MDAwMDFGMDAgLyogRENCIFRYIEJ1ZmZlciBJRkcgKi8KIApAQCAtMTI3LDggKzExNiw3IEBACiAJCQkJCQl1OCAqcHJpb190eXBlLAogCQkJCQkJdTggKnByaW9fdGMpOwogCi1zMzIgaXhnYmVfZGNiX2h3X2NvbmZpZ184MjU5OShzdHJ1Y3QgaXhnYmVfaHcgKmh3LAotCQkJICAgICAgdTggcnhfcGJhLCB1OCBwZmNfZW4sIHUxNiAqcmVmaWxsLAorczMyIGl4Z2JlX2RjYl9od19jb25maWdfODI1OTkoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggcGZjX2VuLCB1MTYgKnJlZmlsbCwKIAkJCSAgICAgIHUxNiAqbWF4LCB1OCAqYndnX2lkLCB1OCAqcHJpb190eXBlLAogCQkJICAgICAgdTggKnByaW9fdGMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9kY2JfbmwuYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYl9ubC5jCmluZGV4IDVlN2VkMjIuLjBhY2U2Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYl9ubC5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2RjYl9ubC5jCkBAIC0xMTQsMjAgKzExNCwxOSBAQAogCXU4IGVyciA9IDA7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCisJLyogdmVyaWZ5IHRoZXJlIGlzIHNvbWV0aGluZyB0byBkbywgaWYgbm90IHRoZW4gZXhpdCAqLworCWlmICghIXN0YXRlICE9ICEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0RDQl9FTkFCTEVEKSkKKwkJcmV0dXJuIGVycjsKKwogCWlmIChzdGF0ZSA+IDApIHsKIAkJLyogVHVybiBvbiBEQ0IgKi8KLQkJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19EQ0JfRU5BQkxFRCkKLQkJCWdvdG8gb3V0OwotCiAJCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19NU0lYX0VOQUJMRUQpKSB7CiAJCQllX2VycihkcnYsICJFbmFibGUgZmFpbGVkLCBuZWVkcyBNU0ktWFxuIik7CiAJCQllcnIgPSAxOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQotCQkJbmV0ZGV2LT5uZXRkZXZfb3BzLT5uZG9fc3RvcChuZXRkZXYpOwotCQlpeGdiZV9jbGVhcl9pbnRlcnJ1cHRfc2NoZW1lKGFkYXB0ZXIpOworCQlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX0RDQl9FTkFCTEVEOwogCiAJCXN3aXRjaCAoYWRhcHRlci0+aHcubWFjLnR5cGUpIHsKIAkJY2FzZSBpeGdiZV9tYWNfODI1OThFQjoKQEAgLTEzNyw0NiArMTM2LDMwIEBACiAJCWNhc2UgaXhnYmVfbWFjXzgyNTk5RUI6CiAJCWNhc2UgaXhnYmVfbWFjX1g1NDA6CiAJCQlhZGFwdGVyLT5mbGFncyAmPSB+SVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRTsKLQkJCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX0ZESVJfUEVSRkVDVF9DQVBBQkxFOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQogCi0JCWFkYXB0ZXItPmZsYWdzIHw9IElYR0JFX0ZMQUdfRENCX0VOQUJMRUQ7Ci0JCWlmICghbmV0ZGV2X2dldF9udW1fdGMobmV0ZGV2KSkKLQkJCWl4Z2JlX3NldHVwX3RjKG5ldGRldiwgTUFYX1RSQUZGSUNfQ0xBU1MpOwotCi0JCWl4Z2JlX2luaXRfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKTsKLQkJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJCW5ldGRldi0+bmV0ZGV2X29wcy0+bmRvX29wZW4obmV0ZGV2KTsKKwkJaXhnYmVfc2V0dXBfdGMobmV0ZGV2LCBNQVhfVFJBRkZJQ19DTEFTUyk7CiAJfSBlbHNlIHsKIAkJLyogVHVybiBvZmYgRENCICovCi0JCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRENCX0VOQUJMRUQpIHsKLQkJCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCi0JCQkJbmV0ZGV2LT5uZXRkZXZfb3BzLT5uZG9fc3RvcChuZXRkZXYpOwotCQkJaXhnYmVfY2xlYXJfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKTsKLQotCQkJYWRhcHRlci0+aHcuZmMucmVxdWVzdGVkX21vZGUgPSBhZGFwdGVyLT5sYXN0X2xmY19tb2RlOwotCQkJYWRhcHRlci0+dGVtcF9kY2JfY2ZnLnBmY19tb2RlX2VuYWJsZSA9IGZhbHNlOwotCQkJYWRhcHRlci0+ZGNiX2NmZy5wZmNfbW9kZV9lbmFibGUgPSBmYWxzZTsKLQkJCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX0RDQl9FTkFCTEVEOwotCQkJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewotCQkJY2FzZSBpeGdiZV9tYWNfODI1OTlFQjoKLQkJCWNhc2UgaXhnYmVfbWFjX1g1NDA6CisJCWFkYXB0ZXItPmh3LmZjLnJlcXVlc3RlZF9tb2RlID0gYWRhcHRlci0+bGFzdF9sZmNfbW9kZTsKKwkJYWRhcHRlci0+dGVtcF9kY2JfY2ZnLnBmY19tb2RlX2VuYWJsZSA9IGZhbHNlOworCQlhZGFwdGVyLT5kY2JfY2ZnLnBmY19tb2RlX2VuYWJsZSA9IGZhbHNlOworCQlhZGFwdGVyLT5mbGFncyAmPSB+SVhHQkVfRkxBR19EQ0JfRU5BQkxFRDsKKwkJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgeworCQljYXNlIGl4Z2JlX21hY184MjU5OUVCOgorCQljYXNlIGl4Z2JlX21hY19YNTQwOgorCQkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfUEVSRkVDVF9DQVBBQkxFKSkKIAkJCQlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX0ZESVJfSEFTSF9DQVBBQkxFOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaXhnYmVfc2V0dXBfdGMobmV0ZGV2LCAwKTsKLQotCQkJaXhnYmVfaW5pdF9pbnRlcnJ1cHRfc2NoZW1lKGFkYXB0ZXIpOwotCQkJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJCQluZXRkZXYtPm5ldGRldl9vcHMtPm5kb19vcGVuKG5ldGRldik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9CisJCWl4Z2JlX3NldHVwX3RjKG5ldGRldiwgMCk7CiAJfQorCiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTM0NywyNCArMzMwLDIwIEBACiBzdGF0aWMgdTggaXhnYmVfZGNibmxfc2V0X2FsbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmV0OworI2lmZGVmIElYR0JFX0ZDT0UKIAlzdHJ1Y3QgZGNiX2FwcCBhcHAgPSB7CiAJCQkgICAgICAuc2VsZWN0b3IgPSBEQ0JfQVBQX0lEVFlQRV9FVEhUWVBFLAogCQkJICAgICAgLnByb3RvY29sID0gRVRIX1BfRkNPRSwKIAkJCSAgICAgfTsKIAl1OCB1cCA9IGRjYl9nZXRhcHAobmV0ZGV2LCAmYXBwKTsKLQlpbnQgcmV0OworI2VuZGlmCiAKIAlyZXQgPSBpeGdiZV9jb3B5X2RjYl9jZmcoJmFkYXB0ZXItPnRlbXBfZGNiX2NmZywgJmFkYXB0ZXItPmRjYl9jZmcsCiAJCQkJIE1BWF9UUkFGRklDX0NMQVNTKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gRENCX05PX0hXX0NIRzsKIAotCS8qIEluIElFRUUgbW9kZSBhcHAgZGF0YSBtdXN0IGJlIHBhcnNlZCBpbnRvIERDQlggZm9ybWF0IGZvcgotCSAqIGhhcmR3YXJlIHJvdXRpbmVzLgotCSAqLwotCWlmIChhZGFwdGVyLT5kY2J4X2NhcCAmIERDQl9DQVBfRENCWF9WRVJfSUVFRSkKLQkJdXAgPSAoMSA8PCB1cCk7Ci0KICNpZmRlZiBJWEdCRV9GQ09FCiAJaWYgKHVwICYmICh1cCAhPSAoMSA8PCBhZGFwdGVyLT5mY29lLnVwKSkpCiAJCWFkYXB0ZXItPmRjYl9zZXRfYml0bWFwIHw9IEJJVF9BUFBfVVBDSEc7CkBAIC0zNzgsNyArMzU3LDcgQEAKIAkJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoX19JWEdCRV9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSkpCiAJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CiAKLQkJaXhnYmVfZmNvZV9zZXRhcHAoYWRhcHRlciwgdXApOworCQlhZGFwdGVyLT5mY29lLnVwID0gZmZzKHVwKSAtIDE7CiAKIAkJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJCW5ldGRldi0+bmV0ZGV2X29wcy0+bmRvX3N0b3AobmV0ZGV2KTsKQEAgLTY5MSwyMiArNjcwLDczIEBACiAJcmV0dXJuIGVycjsKIH0KIAorI2lmZGVmIElYR0JFX0ZDT0UKK3N0YXRpYyB2b2lkIGl4Z2JlX2RjYm5sX2RldnJlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJZGV2LT5uZXRkZXZfb3BzLT5uZG9fc3RvcChkZXYpOworCisJaXhnYmVfY2xlYXJfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKTsKKwlpeGdiZV9pbml0X2ludGVycnVwdF9zY2hlbWUoYWRhcHRlcik7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlkZXYtPm5ldGRldl9vcHMtPm5kb19vcGVuKGRldik7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBpeGdiZV9kY2JubF9pZWVlX3NldGFwcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBkY2JfYXBwICphcHApCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAtRUlOVkFMOworCisJaWYgKCEoYWRhcHRlci0+ZGNieF9jYXAgJiBEQ0JfQ0FQX0RDQlhfVkVSX0lFRUUpKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gZGNiX2llZWVfc2V0YXBwKGRldiwgYXBwKTsKKworI2lmZGVmIElYR0JFX0ZDT0UKKwlpZiAoIWVyciAmJiBhcHAtPnNlbGVjdG9yID09IElFRUVfODAyMVFBWl9BUFBfU0VMX0VUSEVSVFlQRSAmJgorCSAgICBhcHAtPnByb3RvY29sID09IEVUSF9QX0ZDT0UpIHsKKwkJdTggYXBwX21hc2sgPSBkY2JfaWVlZV9nZXRhcHBfbWFzayhkZXYsIGFwcCk7CisKKwkJaWYgKGFwcF9tYXNrICYgKDEgPDwgYWRhcHRlci0+ZmNvZS51cCkpCisJCQlyZXR1cm4gZXJyOworCisJCWFkYXB0ZXItPmZjb2UudXAgPSBhcHAtPnByaW9yaXR5OworCQlpeGdiZV9kY2JubF9kZXZyZXNldChkZXYpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl4Z2JlX2RjYm5sX2llZWVfZGVsYXBwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRjYl9hcHAgKmFwcCkKK3sKKwlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKIAogCWlmICghKGFkYXB0ZXItPmRjYnhfY2FwICYgRENCX0NBUF9EQ0JYX1ZFUl9JRUVFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlkY2Jfc2V0YXBwKGRldiwgYXBwKTsKKwllcnIgPSBkY2JfaWVlZV9kZWxhcHAoZGV2LCBhcHApOwogCiAjaWZkZWYgSVhHQkVfRkNPRQotCWlmIChhcHAtPnNlbGVjdG9yID09IDEgJiYgYXBwLT5wcm90b2NvbCA9PSBFVEhfUF9GQ09FICYmCi0JICAgIGFkYXB0ZXItPmZjb2UudGMgPT0gYXBwLT5wcmlvcml0eSkKLQkJaXhnYmVfZGNibmxfc2V0X2FsbChkZXYpOworCWlmICghZXJyICYmIGFwcC0+c2VsZWN0b3IgPT0gSUVFRV84MDIxUUFaX0FQUF9TRUxfRVRIRVJUWVBFICYmCisJICAgIGFwcC0+cHJvdG9jb2wgPT0gRVRIX1BfRkNPRSkgeworCQl1OCBhcHBfbWFzayA9IGRjYl9pZWVlX2dldGFwcF9tYXNrKGRldiwgYXBwKTsKKworCQlpZiAoYXBwX21hc2sgJiAoMSA8PCBhZGFwdGVyLT5mY29lLnVwKSkKKwkJCXJldHVybiBlcnI7CisKKwkJYWRhcHRlci0+ZmNvZS51cCA9IGFwcF9tYXNrID8KKwkJCQkgICBmZnMoYXBwX21hc2spIC0gMSA6IElYR0JFX0ZDT0VfREVGVEM7CisJCWl4Z2JlX2RjYm5sX2RldnJlc2V0KGRldik7CisJfQogI2VuZGlmCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHU4IGl4Z2JlX2RjYm5sX2dldGRjYngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTc2MCw2ICs3OTAsNyBAQAogCS5pZWVlX2dldHBmYwk9IGl4Z2JlX2RjYm5sX2llZWVfZ2V0cGZjLAogCS5pZWVlX3NldHBmYwk9IGl4Z2JlX2RjYm5sX2llZWVfc2V0cGZjLAogCS5pZWVlX3NldGFwcAk9IGl4Z2JlX2RjYm5sX2llZWVfc2V0YXBwLAorCS5pZWVlX2RlbGFwcAk9IGl4Z2JlX2RjYm5sX2llZWVfZGVsYXBwLAogCS5nZXRzdGF0ZQk9IGl4Z2JlX2RjYm5sX2dldF9zdGF0ZSwKIAkuc2V0c3RhdGUJPSBpeGdiZV9kY2JubF9zZXRfc3RhdGUsCiAJLmdldHBlcm1od2FkZHIJPSBpeGdiZV9kY2JubF9nZXRfcGVybV9od19hZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZXRodG9vbC5jCmluZGV4IGNiMTU1NWIuLmRjNjQ5NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9ldGh0b29sLmMKQEAgLTI3LDYgKzI3LDcgQEAKIAogLyogZXRodG9vbCBzdXBwb3J0IGZvciBpeGdiZSAqLwogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC00NDEsNjIgKzQ0Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgaXhnYmVfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuIGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SWF9DU1VNX0VOQUJMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgaXhnYmVfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGRhdGEpCi17Ci0Jc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWlmIChkYXRhKQotCQlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX1JYX0NTVU1fRU5BQkxFRDsKLQllbHNlCi0JCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX1JYX0NTVU1fRU5BQkxFRDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTMyIGl4Z2JlX2dldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0JcmV0dXJuIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKSAhPSAwOwotfQotCi1zdGF0aWMgaW50IGl4Z2JlX3NldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBkYXRhKQotewotCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1MzIgZmVhdHVyZV9saXN0OwotCi0JZmVhdHVyZV9saXN0ID0gKE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNKTsKLQlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hYy50eXBlKSB7Ci0JY2FzZSBpeGdiZV9tYWNfODI1OTlFQjoKLQljYXNlIGl4Z2JlX21hY19YNTQwOgotCQlmZWF0dXJlX2xpc3QgfD0gTkVUSUZfRl9TQ1RQX0NTVU07Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlpZiAoZGF0YSkKLQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBmZWF0dXJlX2xpc3Q7Ci0JZWxzZQotCQluZXRkZXYtPmZlYXR1cmVzICY9IH5mZWF0dXJlX2xpc3Q7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpeGdiZV9zZXRfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBkYXRhKQotewotCWlmIChkYXRhKSB7Ci0JCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087Ci0JCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OwotCX0gZWxzZSB7Ci0JCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPOwotCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzY7Ci0JfQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdTMyIGl4Z2JlX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTIwNTUsNyArMjAwMCw3IEBACiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0JZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA9IGFkYXB0ZXItPnR4X3JpbmdbMF0tPndvcmtfbGltaXQ7CisJZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA9IGFkYXB0ZXItPnR4X3dvcmtfbGltaXQ7CiAKIAkvKiBvbmx5IHZhbGlkIGlmIGluIGNvbnN0YW50IElUUiBtb2RlICovCiAJc3dpdGNoIChhZGFwdGVyLT5yeF9pdHJfc2V0dGluZykgewpAQCAtMjA3NCw3ICsyMDE5LDcgQEAKIAl9CiAKIAkvKiBpZiBpbiBtaXhlZCB0eC9yeCBxdWV1ZXMgcGVyIHZlY3RvciBtb2RlLCByZXBvcnQgb25seSByeCBzZXR0aW5ncyAqLwotCWlmIChhZGFwdGVyLT5xX3ZlY3RvclswXS0+dHhyX2NvdW50ICYmIGFkYXB0ZXItPnFfdmVjdG9yWzBdLT5yeHJfY291bnQpCisJaWYgKGFkYXB0ZXItPnFfdmVjdG9yWzBdLT50eC5jb3VudCAmJiBhZGFwdGVyLT5xX3ZlY3RvclswXS0+cnguY291bnQpCiAJCXJldHVybiAwOwogCiAJLyogb25seSB2YWxpZCBpZiBpbiBjb25zdGFudCBJVFIgbW9kZSAqLwpAQCAtMjEzOSwxMiArMjA4NCwxMiBAQAogCWJvb2wgbmVlZF9yZXNldCA9IGZhbHNlOwogCiAJLyogZG9uJ3QgYWNjZXB0IHR4IHNwZWNpZmljIGNoYW5nZXMgaWYgd2UndmUgZ290IG1peGVkIFJ4VHggdmVjdG9ycyAqLwotCWlmIChhZGFwdGVyLT5xX3ZlY3RvclswXS0+dHhyX2NvdW50ICYmIGFkYXB0ZXItPnFfdmVjdG9yWzBdLT5yeHJfY291bnQKKwlpZiAoYWRhcHRlci0+cV92ZWN0b3JbMF0tPnR4LmNvdW50ICYmIGFkYXB0ZXItPnFfdmVjdG9yWzBdLT5yeC5jb3VudAogCSAgICYmIGVjLT50eF9jb2FsZXNjZV91c2VjcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSkKLQkJYWRhcHRlci0+dHhfcmluZ1swXS0+d29ya19saW1pdCA9IGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnE7CisJCWFkYXB0ZXItPnR4X3dvcmtfbGltaXQgPSBlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxOwogCiAJaWYgKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA+IDEpIHsKIAkJLyogY2hlY2sgdGhlIGxpbWl0cyAqLwpAQCAtMjIxMywxOCArMjE1OCwyMCBAQAogCQlpbnQgbnVtX3ZlY3RvcnMgPSBhZGFwdGVyLT5udW1fbXNpeF92ZWN0b3JzIC0gTk9OX1FfVkVDVE9SUzsKIAkJZm9yIChpID0gMDsgaSA8IG51bV92ZWN0b3JzOyBpKyspIHsKIAkJCXFfdmVjdG9yID0gYWRhcHRlci0+cV92ZWN0b3JbaV07Ci0JCQlpZiAocV92ZWN0b3ItPnR4cl9jb3VudCAmJiAhcV92ZWN0b3ItPnJ4cl9jb3VudCkKKwkJCWlmIChxX3ZlY3Rvci0+dHguY291bnQgJiYgIXFfdmVjdG9yLT5yeC5jb3VudCkKIAkJCQkvKiB0eCBvbmx5ICovCiAJCQkJcV92ZWN0b3ItPmVpdHIgPSBhZGFwdGVyLT50eF9laXRyX3BhcmFtOwogCQkJZWxzZQogCQkJCS8qIHJ4IG9ubHkgb3IgbWl4ZWQgKi8KIAkJCQlxX3ZlY3Rvci0+ZWl0ciA9IGFkYXB0ZXItPnJ4X2VpdHJfcGFyYW07CisJCQlxX3ZlY3Rvci0+dHgud29ya19saW1pdCA9IGFkYXB0ZXItPnR4X3dvcmtfbGltaXQ7CiAJCQlpeGdiZV93cml0ZV9laXRyKHFfdmVjdG9yKTsKIAkJfQogCS8qIExlZ2FjeSBJbnRlcnJ1cHQgTW9kZSAqLwogCX0gZWxzZSB7CiAJCXFfdmVjdG9yID0gYWRhcHRlci0+cV92ZWN0b3JbMF07CiAJCXFfdmVjdG9yLT5laXRyID0gYWRhcHRlci0+cnhfZWl0cl9wYXJhbTsKKwkJcV92ZWN0b3ItPnR4LndvcmtfbGltaXQgPSBhZGFwdGVyLT50eF93b3JrX2xpbWl0OwogCQlpeGdiZV93cml0ZV9laXRyKHFfdmVjdG9yKTsKIAl9CiAKQEAgLTIyMzMsMjQxICsyMTgwLDM3NiBAQAogCSAqIGNvcnJlY3RseSB3LnIudCBzdG9wcGluZyB0eCwgYW5kIGNoYW5naW5nIFRYRENUTC5XVEhSRVNIIHNldHRpbmdzCiAJICogYWxzbyBsb2NrcyBpbiBSU0MgZW5hYmxlL2Rpc2FibGUgd2hpY2ggcmVxdWlyZXMgcmVzZXQKIAkgKi8KLQlpZiAobmVlZF9yZXNldCkgewotCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQotCQkJaXhnYmVfcmVpbml0X2xvY2tlZChhZGFwdGVyKTsKLQkJZWxzZQotCQkJaXhnYmVfcmVzZXQoYWRhcHRlcik7CisJaWYgKG5lZWRfcmVzZXQpCisJCWl4Z2JlX2RvX3Jlc2V0KG5ldGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpeGdiZV9nZXRfZXRodG9vbF9mZGlyX2VudHJ5KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAorCQkJCQlzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kKQoreworCXVuaW9uIGl4Z2JlX2F0cl9pbnB1dCAqbWFzayA9ICZhZGFwdGVyLT5mZGlyX21hc2s7CisJc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICpmc3AgPQorCQkoc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICopJmNtZC0+ZnM7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpub2RlMjsKKwlzdHJ1Y3QgaXhnYmVfZmRpcl9maWx0ZXIgKnJ1bGUgPSBOVUxMOworCisJLyogcmVwb3J0IHRvdGFsIHJ1bGUgY291bnQgKi8KKwljbWQtPmRhdGEgPSAoMTAyNCA8PCBhZGFwdGVyLT5mZGlyX3BiYWxsb2MpIC0gMjsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnVsZSwgbm9kZSwgbm9kZTIsCisJCQkJICAmYWRhcHRlci0+ZmRpcl9maWx0ZXJfbGlzdCwgZmRpcl9ub2RlKSB7CisJCWlmIChmc3AtPmxvY2F0aW9uIDw9IHJ1bGUtPnN3X2lkeCkKKwkJCWJyZWFrOworCX0KKworCWlmICghcnVsZSB8fCBmc3AtPmxvY2F0aW9uICE9IHJ1bGUtPnN3X2lkeCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBmaWxsIG91dCB0aGUgZmxvdyBzcGVjIGVudHJ5ICovCisKKwkvKiBzZXQgZmxvdyB0eXBlIGZpZWxkICovCisJc3dpdGNoIChydWxlLT5maWx0ZXIuZm9ybWF0dGVkLmZsb3dfdHlwZSkgeworCWNhc2UgSVhHQkVfQVRSX0ZMT1dfVFlQRV9UQ1BWNDoKKwkJZnNwLT5mbG93X3R5cGUgPSBUQ1BfVjRfRkxPVzsKKwkJYnJlYWs7CisJY2FzZSBJWEdCRV9BVFJfRkxPV19UWVBFX1VEUFY0OgorCQlmc3AtPmZsb3dfdHlwZSA9IFVEUF9WNF9GTE9XOworCQlicmVhazsKKwljYXNlIElYR0JFX0FUUl9GTE9XX1RZUEVfU0NUUFY0OgorCQlmc3AtPmZsb3dfdHlwZSA9IFNDVFBfVjRfRkxPVzsKKwkJYnJlYWs7CisJY2FzZSBJWEdCRV9BVFJfRkxPV19UWVBFX0lQVjQ6CisJCWZzcC0+Zmxvd190eXBlID0gSVBfVVNFUl9GTE9XOworCQlmc3AtPmhfdS51c3JfaXA0X3NwZWMuaXBfdmVyID0gRVRIX1JYX05GQ19JUDQ7CisJCWZzcC0+aF91LnVzcl9pcDRfc3BlYy5wcm90byA9IDA7CisJCWZzcC0+bV91LnVzcl9pcDRfc3BlYy5wcm90byA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZzcC0+aF91LnRjcF9pcDRfc3BlYy5wc3JjID0gcnVsZS0+ZmlsdGVyLmZvcm1hdHRlZC5zcmNfcG9ydDsKKwlmc3AtPm1fdS50Y3BfaXA0X3NwZWMucHNyYyA9IG1hc2stPmZvcm1hdHRlZC5zcmNfcG9ydDsKKwlmc3AtPmhfdS50Y3BfaXA0X3NwZWMucGRzdCA9IHJ1bGUtPmZpbHRlci5mb3JtYXR0ZWQuZHN0X3BvcnQ7CisJZnNwLT5tX3UudGNwX2lwNF9zcGVjLnBkc3QgPSBtYXNrLT5mb3JtYXR0ZWQuZHN0X3BvcnQ7CisJZnNwLT5oX3UudGNwX2lwNF9zcGVjLmlwNHNyYyA9IHJ1bGUtPmZpbHRlci5mb3JtYXR0ZWQuc3JjX2lwWzBdOworCWZzcC0+bV91LnRjcF9pcDRfc3BlYy5pcDRzcmMgPSBtYXNrLT5mb3JtYXR0ZWQuc3JjX2lwWzBdOworCWZzcC0+aF91LnRjcF9pcDRfc3BlYy5pcDRkc3QgPSBydWxlLT5maWx0ZXIuZm9ybWF0dGVkLmRzdF9pcFswXTsKKwlmc3AtPm1fdS50Y3BfaXA0X3NwZWMuaXA0ZHN0ID0gbWFzay0+Zm9ybWF0dGVkLmRzdF9pcFswXTsKKwlmc3AtPmhfZXh0LnZsYW5fdGNpID0gcnVsZS0+ZmlsdGVyLmZvcm1hdHRlZC52bGFuX2lkOworCWZzcC0+bV9leHQudmxhbl90Y2kgPSBtYXNrLT5mb3JtYXR0ZWQudmxhbl9pZDsKKwlmc3AtPmhfZXh0LnZsYW5fZXR5cGUgPSBydWxlLT5maWx0ZXIuZm9ybWF0dGVkLmZsZXhfYnl0ZXM7CisJZnNwLT5tX2V4dC52bGFuX2V0eXBlID0gbWFzay0+Zm9ybWF0dGVkLmZsZXhfYnl0ZXM7CisJZnNwLT5oX2V4dC5kYXRhWzFdID0gaHRvbmwocnVsZS0+ZmlsdGVyLmZvcm1hdHRlZC52bV9wb29sKTsKKwlmc3AtPm1fZXh0LmRhdGFbMV0gPSBodG9ubChtYXNrLT5mb3JtYXR0ZWQudm1fcG9vbCk7CisJZnNwLT5mbG93X3R5cGUgfD0gRkxPV19FWFQ7CisKKwkvKiByZWNvcmQgYWN0aW9uICovCisJaWYgKHJ1bGUtPmFjdGlvbiA9PSBJWEdCRV9GRElSX0RST1BfUVVFVUUpCisJCWZzcC0+cmluZ19jb29raWUgPSBSWF9DTFNfRkxPV19ESVNDOworCWVsc2UKKwkJZnNwLT5yaW5nX2Nvb2tpZSA9IHJ1bGUtPmFjdGlvbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl4Z2JlX2dldF9ldGh0b29sX2ZkaXJfYWxsKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICAgIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQsCisJCQkJICAgICAgdTMyICpydWxlX2xvY3MpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpub2RlMjsKKwlzdHJ1Y3QgaXhnYmVfZmRpcl9maWx0ZXIgKnJ1bGU7CisJaW50IGNudCA9IDA7CisKKwkvKiByZXBvcnQgdG90YWwgcnVsZSBjb3VudCAqLworCWNtZC0+ZGF0YSA9ICgxMDI0IDw8IGFkYXB0ZXItPmZkaXJfcGJhbGxvYykgLSAyOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShydWxlLCBub2RlLCBub2RlMiwKKwkJCQkgICZhZGFwdGVyLT5mZGlyX2ZpbHRlcl9saXN0LCBmZGlyX25vZGUpIHsKKwkJaWYgKGNudCA9PSBjbWQtPnJ1bGVfY250KQorCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJcnVsZV9sb2NzW2NudF0gPSBydWxlLT5zd19pZHg7CisJCWNudCsrOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGl4Z2JlX3NldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKK3N0YXRpYyBpbnQgaXhnYmVfZ2V0X3J4bmZjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQsCisJCQkgICB2b2lkICpydWxlX2xvY3MpCiB7Ci0Jc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWJvb2wgbmVlZF9yZXNldCA9IGZhbHNlOwotCWludCByYzsKKwlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldCA9IC1FT1BOT1RTVVBQOwogCi0jaWZkZWYgQ09ORklHX0lYR0JFX0RDQgotCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0RDQl9FTkFCTEVEKSAmJgotCSAgICAhKGRhdGEgJiBFVEhfRkxBR19SWFZMQU4pKQotCQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgorCXN3aXRjaCAoY21kLT5jbWQpIHsKKwljYXNlIEVUSFRPT0xfR1JYUklOR1M6CisJCWNtZC0+ZGF0YSA9IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7CisJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HUlhDTFNSTENOVDoKKwkJY21kLT5ydWxlX2NudCA9IGFkYXB0ZXItPmZkaXJfZmlsdGVyX2NvdW50OworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUlVMRToKKwkJcmV0ID0gaXhnYmVfZ2V0X2V0aHRvb2xfZmRpcl9lbnRyeShhZGFwdGVyLCBjbWQpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUkxBTEw6CisJCXJldCA9IGl4Z2JlX2dldF9ldGh0b29sX2ZkaXJfYWxsKGFkYXB0ZXIsIGNtZCwKKwkJCQkJCSAodTMyICopcnVsZV9sb2NzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCi0JbmVlZF9yZXNldCA9IChkYXRhICYgRVRIX0ZMQUdfUlhWTEFOKSAhPQotCQkgICAgIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKTsKKwlyZXR1cm4gcmV0OworfQogCi0JaWYgKChkYXRhICYgRVRIX0ZMQUdfUlhIQVNIKSAmJgotCSAgICAhKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SU1NfRU5BQkxFRCkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKK3N0YXRpYyBpbnQgaXhnYmVfdXBkYXRlX2V0aHRvb2xfZmRpcl9lbnRyeShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJICAgc3RydWN0IGl4Z2JlX2ZkaXJfZmlsdGVyICppbnB1dCwKKwkJCQkJICAgdTE2IHN3X2lkeCkKK3sKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbm9kZTIsICpwYXJlbnQ7CisJc3RydWN0IGl4Z2JlX2ZkaXJfZmlsdGVyICpydWxlOworCWludCBlcnIgPSAtRUlOVkFMOwogCi0JcmMgPSBldGh0b29sX29wX3NldF9mbGFncyhuZXRkZXYsIGRhdGEsIEVUSF9GTEFHX0xSTyB8IEVUSF9GTEFHX05UVVBMRSB8Ci0JCQkJICBFVEhfRkxBR19SWFZMQU4gfCBFVEhfRkxBR19UWFZMQU4gfAotCQkJCSAgRVRIX0ZMQUdfUlhIQVNIKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKKwlwYXJlbnQgPSBOVUxMOworCXJ1bGUgPSBOVUxMOwogCi0JLyogaWYgc3RhdGUgY2hhbmdlcyB3ZSBuZWVkIHRvIHVwZGF0ZSBhZGFwdGVyLT5mbGFncyBhbmQgcmVzZXQgKi8KLQlpZiAoKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1JTQ19DQVBBQkxFKSAmJgotCSAgICAoISEoZGF0YSAmIEVUSF9GTEFHX0xSTykgIT0KLQkgICAgICEhKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1JTQ19FTkFCTEVEKSkpIHsKLQkJaWYgKChkYXRhICYgRVRIX0ZMQUdfTFJPKSAmJgotCQkgICAgKCFhZGFwdGVyLT5yeF9pdHJfc2V0dGluZyB8fAotCQkgICAgIChhZGFwdGVyLT5yeF9pdHJfc2V0dGluZyA+IElYR0JFX01BWF9SU0NfSU5UX1JBVEUpKSkgewotCQkJZV9pbmZvKHByb2JlLCAicngtdXNlY3Mgc2V0IHRvbyBsb3csICIKLQkJCQkgICAgICAibm90IGVuYWJsaW5nIFJTQy5cbiIpOwotCQl9IGVsc2UgewotCQkJYWRhcHRlci0+ZmxhZ3MyIF49IElYR0JFX0ZMQUcyX1JTQ19FTkFCTEVEOwotCQkJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewotCQkJY2FzZSBpeGdiZV9tYWNfODI1OTlFQjoKLQkJCQluZWVkX3Jlc2V0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgaXhnYmVfbWFjX1g1NDA6IHsKLQkJCQlpbnQgaTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgaSsrKSB7Ci0JCQkJCXN0cnVjdCBpeGdiZV9yaW5nICpyaW5nID0KLQkJCQkJICAgICAgICAgICAgICAgICAgYWRhcHRlci0+cnhfcmluZ1tpXTsKLQkJCQkJaWYgKGFkYXB0ZXItPmZsYWdzMiAmCi0JCQkJCSAgICBJWEdCRV9GTEFHMl9SU0NfRU5BQkxFRCkgewotCQkJCQkJaXhnYmVfY29uZmlndXJlX3JzY2N0bChhZGFwdGVyLAotCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICByaW5nKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWl4Z2JlX2NsZWFyX3JzY2N0bChhZGFwdGVyLAotCQkJCQkJICAgICAgICAgICAgICAgICAgIHJpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ1bGUsIG5vZGUsIG5vZGUyLAorCQkJCSAgJmFkYXB0ZXItPmZkaXJfZmlsdGVyX2xpc3QsIGZkaXJfbm9kZSkgeworCQkvKiBoYXNoIGZvdW5kLCBvciBubyBtYXRjaGluZyBlbnRyeSAqLworCQlpZiAocnVsZS0+c3dfaWR4ID49IHN3X2lkeCkKKwkJCWJyZWFrOworCQlwYXJlbnQgPSBub2RlOworCX0KKworCS8qIGlmIHRoZXJlIGlzIGFuIG9sZCBydWxlIG9jY3VweWluZyBvdXIgcGxhY2UgcmVtb3ZlIGl0ICovCisJaWYgKHJ1bGUgJiYgKHJ1bGUtPnN3X2lkeCA9PSBzd19pZHgpKSB7CisJCWlmICghaW5wdXQgfHwgKHJ1bGUtPmZpbHRlci5mb3JtYXR0ZWQuYmt0X2hhc2ggIT0KKwkJCSAgICAgICBpbnB1dC0+ZmlsdGVyLmZvcm1hdHRlZC5ia3RfaGFzaCkpIHsKKwkJCWVyciA9IGl4Z2JlX2ZkaXJfZXJhc2VfcGVyZmVjdF9maWx0ZXJfODI1OTkoaHcsCisJCQkJCQkJCSZydWxlLT5maWx0ZXIsCisJCQkJCQkJCXN3X2lkeCk7CiAJCX0KKworCQlobGlzdF9kZWwoJnJ1bGUtPmZkaXJfbm9kZSk7CisJCWtmcmVlKHJ1bGUpOworCQlhZGFwdGVyLT5mZGlyX2ZpbHRlcl9jb3VudC0tOwogCX0KIAogCS8qCi0JICogQ2hlY2sgaWYgRmxvdyBEaXJlY3RvciBuLXR1cGxlIHN1cHBvcnQgd2FzIGVuYWJsZWQgb3IgZGlzYWJsZWQuICBJZgotCSAqIHRoZSBzdGF0ZSBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHJlc2V0LgorCSAqIElmIG5vIGlucHV0IHRoaXMgd2FzIGEgZGVsZXRlLCBlcnIgc2hvdWxkIGJlIDAgaWYgYSBydWxlIHdhcworCSAqIHN1Y2Nlc3NmdWxseSBmb3VuZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGVsc2UgLUVJTlZBTAogCSAqLwotCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfUEVSRkVDVF9DQVBBQkxFKSAmJgotCSAgICAoIShkYXRhICYgRVRIX0ZMQUdfTlRVUExFKSkpIHsKLQkJLyogdHVybiBvZmYgRmxvdyBEaXJlY3RvciBwZXJmZWN0LCBzZXQgaGFzaCBhbmQgcmVzZXQgKi8KLQkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfRkRJUl9QRVJGRUNUX0NBUEFCTEU7Ci0JCWFkYXB0ZXItPmZsYWdzIHw9IElYR0JFX0ZMQUdfRkRJUl9IQVNIX0NBUEFCTEU7Ci0JCW5lZWRfcmVzZXQgPSB0cnVlOwotCX0gZWxzZSBpZiAoKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfUEVSRkVDVF9DQVBBQkxFKSkgJiYKLQkgICAgICAgICAgIChkYXRhICYgRVRIX0ZMQUdfTlRVUExFKSkgewotCQkvKiB0dXJuIG9mZiBGbG93IERpcmVjdG9yIGhhc2gsIGVuYWJsZSBwZXJmZWN0IGFuZCByZXNldCAqLwotCQlhZGFwdGVyLT5mbGFncyAmPSB+SVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRTsKLQkJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19GRElSX1BFUkZFQ1RfQ0FQQUJMRTsKLQkJbmVlZF9yZXNldCA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJLyogbm8gc3RhdGUgY2hhbmdlICovCi0JfQorCWlmICghaW5wdXQpCisJCXJldHVybiBlcnI7CiAKLQlpZiAobmVlZF9yZXNldCkgewotCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQotCQkJaXhnYmVfcmVpbml0X2xvY2tlZChhZGFwdGVyKTsKLQkJZWxzZQotCQkJaXhnYmVfcmVzZXQoYWRhcHRlcik7Ci0JfQorCS8qIGluaXRpYWxpemUgbm9kZSBhbmQgc2V0IHNvZnR3YXJlIGluZGV4ICovCisJSU5JVF9ITElTVF9OT0RFKCZpbnB1dC0+ZmRpcl9ub2RlKTsKKworCS8qIGFkZCBmaWx0ZXIgdG8gdGhlIGxpc3QgKi8KKwlpZiAocGFyZW50KQorCQlobGlzdF9hZGRfYWZ0ZXIocGFyZW50LCAmaW5wdXQtPmZkaXJfbm9kZSk7CisJZWxzZQorCQlobGlzdF9hZGRfaGVhZCgmaW5wdXQtPmZkaXJfbm9kZSwKKwkJCSAgICAgICAmYWRhcHRlci0+ZmRpcl9maWx0ZXJfbGlzdCk7CisKKwkvKiB1cGRhdGUgY291bnRzICovCisJYWRhcHRlci0+ZmRpcl9maWx0ZXJfY291bnQrKzsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGl4Z2JlX3NldF9yeF9udHVwbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGUgKmNtZCkKK3N0YXRpYyBpbnQgaXhnYmVfZmxvd3NwZWNfdG9fZmxvd190eXBlKHN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYyAqZnNwLAorCQkJCSAgICAgICB1OCAqZmxvd190eXBlKQogewotCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGVfZmxvd19zcGVjICpmcyA9ICZjbWQtPmZzOwotCXVuaW9uIGl4Z2JlX2F0cl9pbnB1dCBpbnB1dF9zdHJ1Y3Q7Ci0Jc3RydWN0IGl4Z2JlX2F0cl9pbnB1dF9tYXNrcyBpbnB1dF9tYXNrczsKLQlpbnQgdGFyZ2V0X3F1ZXVlOworCXN3aXRjaCAoZnNwLT5mbG93X3R5cGUgJiB+RkxPV19FWFQpIHsKKwljYXNlIFRDUF9WNF9GTE9XOgorCQkqZmxvd190eXBlID0gSVhHQkVfQVRSX0ZMT1dfVFlQRV9UQ1BWNDsKKwkJYnJlYWs7CisJY2FzZSBVRFBfVjRfRkxPVzoKKwkJKmZsb3dfdHlwZSA9IElYR0JFX0FUUl9GTE9XX1RZUEVfVURQVjQ7CisJCWJyZWFrOworCWNhc2UgU0NUUF9WNF9GTE9XOgorCQkqZmxvd190eXBlID0gSVhHQkVfQVRSX0ZMT1dfVFlQRV9TQ1RQVjQ7CisJCWJyZWFrOworCWNhc2UgSVBfVVNFUl9GTE9XOgorCQlzd2l0Y2ggKGZzcC0+aF91LnVzcl9pcDRfc3BlYy5wcm90bykgeworCQljYXNlIElQUFJPVE9fVENQOgorCQkJKmZsb3dfdHlwZSA9IElYR0JFX0FUUl9GTE9XX1RZUEVfVENQVjQ7CisJCQlicmVhazsKKwkJY2FzZSBJUFBST1RPX1VEUDoKKwkJCSpmbG93X3R5cGUgPSBJWEdCRV9BVFJfRkxPV19UWVBFX1VEUFY0OworCQkJYnJlYWs7CisJCWNhc2UgSVBQUk9UT19TQ1RQOgorCQkJKmZsb3dfdHlwZSA9IElYR0JFX0FUUl9GTE9XX1RZUEVfU0NUUFY0OworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCWlmICghZnNwLT5tX3UudXNyX2lwNF9zcGVjLnByb3RvKSB7CisJCQkJKmZsb3dfdHlwZSA9IElYR0JFX0FUUl9GTE9XX1RZUEVfSVBWNDsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGl4Z2JlX2FkZF9ldGh0b29sX2ZkaXJfZW50cnkoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCXN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCit7CisJc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICpmc3AgPQorCQkoc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICopJmNtZC0+ZnM7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgaXhnYmVfZmRpcl9maWx0ZXIgKmlucHV0OworCXVuaW9uIGl4Z2JlX2F0cl9pbnB1dCBtYXNrOwogCWludCBlcnI7CiAKLQlpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gaXhnYmVfbWFjXzgyNTk4RUIpCisJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfUEVSRkVDVF9DQVBBQkxFKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJLyoKIAkgKiBEb24ndCBhbGxvdyBwcm9ncmFtbWluZyBpZiB0aGUgYWN0aW9uIGlzIGEgcXVldWUgZ3JlYXRlciB0aGFuCi0JICogdGhlIG51bWJlciBvZiBvbmxpbmUgVHggcXVldWVzLgorCSAqIHRoZSBudW1iZXIgb2Ygb25saW5lIFJ4IHF1ZXVlcy4KIAkgKi8KLQlpZiAoKGZzLT5hY3Rpb24gPj0gYWRhcHRlci0+bnVtX3R4X3F1ZXVlcykgfHwKLQkgICAgKGZzLT5hY3Rpb24gPCBFVEhUT09MX1JYTlRVUExFX0FDVElPTl9EUk9QKSkKKwlpZiAoKGZzcC0+cmluZ19jb29raWUgIT0gUlhfQ0xTX0ZMT1dfRElTQykgJiYKKwkgICAgKGZzcC0+cmluZ19jb29raWUgPj0gYWRhcHRlci0+bnVtX3J4X3F1ZXVlcykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtc2V0KCZpbnB1dF9zdHJ1Y3QsIDAsIHNpemVvZih1bmlvbiBpeGdiZV9hdHJfaW5wdXQpKTsKLQltZW1zZXQoJmlucHV0X21hc2tzLCAwLCBzaXplb2Yoc3RydWN0IGl4Z2JlX2F0cl9pbnB1dF9tYXNrcykpOworCS8qIERvbid0IGFsbG93IGluZGV4ZXMgdG8gZXhpc3Qgb3V0c2lkZSBvZiBhdmFpbGFibGUgc3BhY2UgKi8KKwlpZiAoZnNwLT5sb2NhdGlvbiA+PSAoKDEwMjQgPDwgYWRhcHRlci0+ZmRpcl9wYmFsbG9jKSAtIDIpKSB7CisJCWVfZXJyKGRydiwgIkxvY2F0aW9uIG91dCBvZiByYW5nZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlucHV0ID0ga3phbGxvYyhzaXplb2YoKmlucHV0KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFpbnB1dCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoJm1hc2ssIDAsIHNpemVvZih1bmlvbiBpeGdiZV9hdHJfaW5wdXQpKTsKKworCS8qIHNldCBTVyBpbmRleCAqLworCWlucHV0LT5zd19pZHggPSBmc3AtPmxvY2F0aW9uOwogCiAJLyogcmVjb3JkIGZsb3cgdHlwZSAqLwotCXN3aXRjaCAoZnMtPmZsb3dfdHlwZSkgewotCWNhc2UgSVBWNF9GTE9XOgotCQlpbnB1dF9zdHJ1Y3QuZm9ybWF0dGVkLmZsb3dfdHlwZSA9IElYR0JFX0FUUl9GTE9XX1RZUEVfSVBWNDsKLQkJYnJlYWs7Ci0JY2FzZSBUQ1BfVjRfRkxPVzoKLQkJaW5wdXRfc3RydWN0LmZvcm1hdHRlZC5mbG93X3R5cGUgPSBJWEdCRV9BVFJfRkxPV19UWVBFX1RDUFY0OwotCQlicmVhazsKLQljYXNlIFVEUF9WNF9GTE9XOgotCQlpbnB1dF9zdHJ1Y3QuZm9ybWF0dGVkLmZsb3dfdHlwZSA9IElYR0JFX0FUUl9GTE9XX1RZUEVfVURQVjQ7Ci0JCWJyZWFrOwotCWNhc2UgU0NUUF9WNF9GTE9XOgotCQlpbnB1dF9zdHJ1Y3QuZm9ybWF0dGVkLmZsb3dfdHlwZSA9IElYR0JFX0FUUl9GTE9XX1RZUEVfU0NUUFY0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLTE7CisJaWYgKCFpeGdiZV9mbG93c3BlY190b19mbG93X3R5cGUoZnNwLAorCQkJCQkgJmlucHV0LT5maWx0ZXIuZm9ybWF0dGVkLmZsb3dfdHlwZSkpIHsKKwkJZV9lcnIoZHJ2LCAiVW5yZWNvZ25pemVkIGZsb3cgdHlwZVxuIik7CisJCWdvdG8gZXJyX291dDsKIAl9CiAKLQkvKiBjb3B5IHZsYW4gdGFnIG1pbnVzIHRoZSBDRkkgYml0ICovCi0JaWYgKChmcy0+dmxhbl90YWcgJiAweEVGRkYpIHx8ICh+ZnMtPnZsYW5fdGFnX21hc2sgJiAweEVGRkYpKSB7Ci0JCWlucHV0X3N0cnVjdC5mb3JtYXR0ZWQudmxhbl9pZCA9IGh0b25zKGZzLT52bGFuX3RhZyAmIDB4RUZGRik7Ci0JCWlmICghZnMtPnZsYW5fdGFnX21hc2spIHsKLQkJCWlucHV0X21hc2tzLnZsYW5faWRfbWFzayA9IGh0b25zKDB4RUZGRik7Ci0JCX0gZWxzZSB7Ci0JCQlzd2l0Y2ggKH5mcy0+dmxhbl90YWdfbWFzayAmIDB4RUZGRikgewotCQkJLyogYWxsIG9mIHRoZXNlIGFyZSB2YWxpZCB2bGFuLW1hc2sgdmFsdWVzICovCi0JCQljYXNlIDB4RUZGRjoKLQkJCWNhc2UgMHhFMDAwOgotCQkJY2FzZSAweDBGRkY6Ci0JCQljYXNlIDB4MDAwMDoKLQkJCQlpbnB1dF9tYXNrcy52bGFuX2lkX21hc2sgPQotCQkJCQlodG9ucyh+ZnMtPnZsYW5fdGFnX21hc2spOwotCQkJCWJyZWFrOwotCQkJLyogZXhpdCB3aXRoIGVycm9yIGlmIHZsYW4tbWFzayBpcyBpbnZhbGlkICovCi0JCQlkZWZhdWx0OgotCQkJCWVfZXJyKGRydiwgIlBhcnRpYWwgVkxBTiBJRCBvciAiCi0JCQkJICAgICAgInByaW9yaXR5IG1hc2sgaW4gdmxhbi1tYXNrIGlzIG5vdCAiCi0JCQkJICAgICAgInN1cHBvcnRlZCBieSBoYXJkd2FyZVxuIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQorCW1hc2suZm9ybWF0dGVkLmZsb3dfdHlwZSA9IElYR0JFX0FUUl9MNFRZUEVfSVBWNl9NQVNLIHwKKwkJCQkgICBJWEdCRV9BVFJfTDRUWVBFX01BU0s7CiAKLQkvKiBtYWtlIHN1cmUgd2Ugb25seSB1c2UgdGhlIGZpcnN0IDIgYnl0ZXMgb2YgdXNlciBkYXRhICovCi0JaWYgKChmcy0+ZGF0YSAmIDB4RkZGRikgfHwgKH5mcy0+ZGF0YV9tYXNrICYgMHhGRkZGKSkgewotCQlpbnB1dF9zdHJ1Y3QuZm9ybWF0dGVkLmZsZXhfYnl0ZXMgPSBodG9ucyhmcy0+ZGF0YSAmIDB4RkZGRik7Ci0JCWlmICghKGZzLT5kYXRhX21hc2sgJiAweEZGRkYpKSB7Ci0JCQlpbnB1dF9tYXNrcy5mbGV4X21hc2sgPSAweEZGRkY7Ci0JCX0gZWxzZSBpZiAofmZzLT5kYXRhX21hc2sgJiAweEZGRkYpIHsKLQkJCWVfZXJyKGRydiwgIlBhcnRpYWwgdXNlci1kZWYtbWFzayBpcyBub3QgIgotCQkJICAgICAgInN1cHBvcnRlZCBieSBoYXJkd2FyZVxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisJaWYgKGlucHV0LT5maWx0ZXIuZm9ybWF0dGVkLmZsb3dfdHlwZSA9PSBJWEdCRV9BVFJfRkxPV19UWVBFX0lQVjQpCisJCW1hc2suZm9ybWF0dGVkLmZsb3dfdHlwZSAmPSBJWEdCRV9BVFJfTDRUWVBFX0lQVjZfTUFTSzsKIAotCS8qCi0JICogQ29weSBpbnB1dCBpbnRvIGZvcm1hdHRlZCBzdHJ1Y3R1cmVzCi0JICoKLQkgKiBUaGVzZSBhc3NpZ25tZW50cyBhcmUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBsb2dpYwotCSAqIElmIG5laXRoZXIgaW5wdXQgb3IgbWFzayBhcmUgc2V0IGFzc3VtZSB2YWx1ZSBpcyBtYXNrZWQgb3V0LgotCSAqIElmIGlucHV0IGlzIHNldCwgYnV0IG1hc2sgaXMgbm90IG1hc2sgc2hvdWxkIGRlZmF1bHQgdG8gYWNjZXB0IGFsbC4KLQkgKiBJZiBpbnB1dCBpcyBub3Qgc2V0LCBidXQgbWFzayBpcyBzZXQgdGhlbiBtYXNrIGxpa2VseSByZXN1bHRzIGluIDAuCi0JICogSWYgaW5wdXQgaXMgc2V0IGFuZCBtYXNrIGlzIHNldCB0aGVuIGFzc2lnbiBib3RoLgotCSAqLwotCWlmIChmcy0+aF91LnRjcF9pcDRfc3BlYy5pcDRzcmMgfHwgfmZzLT5tX3UudGNwX2lwNF9zcGVjLmlwNHNyYykgewotCQlpbnB1dF9zdHJ1Y3QuZm9ybWF0dGVkLnNyY19pcFswXSA9IGZzLT5oX3UudGNwX2lwNF9zcGVjLmlwNHNyYzsKLQkJaWYgKCFmcy0+bV91LnRjcF9pcDRfc3BlYy5pcDRzcmMpCi0JCQlpbnB1dF9tYXNrcy5zcmNfaXBfbWFza1swXSA9IDB4RkZGRkZGRkY7Ci0JCWVsc2UKLQkJCWlucHV0X21hc2tzLnNyY19pcF9tYXNrWzBdID0KLQkJCQl+ZnMtPm1fdS50Y3BfaXA0X3NwZWMuaXA0c3JjOwotCX0KLQlpZiAoZnMtPmhfdS50Y3BfaXA0X3NwZWMuaXA0ZHN0IHx8IH5mcy0+bV91LnRjcF9pcDRfc3BlYy5pcDRkc3QpIHsKLQkJaW5wdXRfc3RydWN0LmZvcm1hdHRlZC5kc3RfaXBbMF0gPSBmcy0+aF91LnRjcF9pcDRfc3BlYy5pcDRkc3Q7Ci0JCWlmICghZnMtPm1fdS50Y3BfaXA0X3NwZWMuaXA0ZHN0KQotCQkJaW5wdXRfbWFza3MuZHN0X2lwX21hc2tbMF0gPSAweEZGRkZGRkZGOwotCQllbHNlCi0JCQlpbnB1dF9tYXNrcy5kc3RfaXBfbWFza1swXSA9Ci0JCQkJfmZzLT5tX3UudGNwX2lwNF9zcGVjLmlwNGRzdDsKLQl9Ci0JaWYgKGZzLT5oX3UudGNwX2lwNF9zcGVjLnBzcmMgfHwgfmZzLT5tX3UudGNwX2lwNF9zcGVjLnBzcmMpIHsKLQkJaW5wdXRfc3RydWN0LmZvcm1hdHRlZC5zcmNfcG9ydCA9IGZzLT5oX3UudGNwX2lwNF9zcGVjLnBzcmM7Ci0JCWlmICghZnMtPm1fdS50Y3BfaXA0X3NwZWMucHNyYykKLQkJCWlucHV0X21hc2tzLnNyY19wb3J0X21hc2sgPSAweEZGRkY7Ci0JCWVsc2UKLQkJCWlucHV0X21hc2tzLnNyY19wb3J0X21hc2sgPSB+ZnMtPm1fdS50Y3BfaXA0X3NwZWMucHNyYzsKLQl9Ci0JaWYgKGZzLT5oX3UudGNwX2lwNF9zcGVjLnBkc3QgfHwgfmZzLT5tX3UudGNwX2lwNF9zcGVjLnBkc3QpIHsKLQkJaW5wdXRfc3RydWN0LmZvcm1hdHRlZC5kc3RfcG9ydCA9IGZzLT5oX3UudGNwX2lwNF9zcGVjLnBkc3Q7Ci0JCWlmICghZnMtPm1fdS50Y3BfaXA0X3NwZWMucGRzdCkKLQkJCWlucHV0X21hc2tzLmRzdF9wb3J0X21hc2sgPSAweEZGRkY7Ci0JCWVsc2UKLQkJCWlucHV0X21hc2tzLmRzdF9wb3J0X21hc2sgPSB+ZnMtPm1fdS50Y3BfaXA0X3NwZWMucGRzdDsKKwkvKiBDb3B5IGlucHV0IGludG8gZm9ybWF0dGVkIHN0cnVjdHVyZXMgKi8KKwlpbnB1dC0+ZmlsdGVyLmZvcm1hdHRlZC5zcmNfaXBbMF0gPSBmc3AtPmhfdS50Y3BfaXA0X3NwZWMuaXA0c3JjOworCW1hc2suZm9ybWF0dGVkLnNyY19pcFswXSA9IGZzcC0+bV91LnRjcF9pcDRfc3BlYy5pcDRzcmM7CisJaW5wdXQtPmZpbHRlci5mb3JtYXR0ZWQuZHN0X2lwWzBdID0gZnNwLT5oX3UudGNwX2lwNF9zcGVjLmlwNGRzdDsKKwltYXNrLmZvcm1hdHRlZC5kc3RfaXBbMF0gPSBmc3AtPm1fdS50Y3BfaXA0X3NwZWMuaXA0ZHN0OworCWlucHV0LT5maWx0ZXIuZm9ybWF0dGVkLnNyY19wb3J0ID0gZnNwLT5oX3UudGNwX2lwNF9zcGVjLnBzcmM7CisJbWFzay5mb3JtYXR0ZWQuc3JjX3BvcnQgPSBmc3AtPm1fdS50Y3BfaXA0X3NwZWMucHNyYzsKKwlpbnB1dC0+ZmlsdGVyLmZvcm1hdHRlZC5kc3RfcG9ydCA9IGZzcC0+aF91LnRjcF9pcDRfc3BlYy5wZHN0OworCW1hc2suZm9ybWF0dGVkLmRzdF9wb3J0ID0gZnNwLT5tX3UudGNwX2lwNF9zcGVjLnBkc3Q7CisKKwlpZiAoZnNwLT5mbG93X3R5cGUgJiBGTE9XX0VYVCkgeworCQlpbnB1dC0+ZmlsdGVyLmZvcm1hdHRlZC52bV9wb29sID0KKwkJCQkodW5zaWduZWQgY2hhciludG9obChmc3AtPmhfZXh0LmRhdGFbMV0pOworCQltYXNrLmZvcm1hdHRlZC52bV9wb29sID0KKwkJCQkodW5zaWduZWQgY2hhciludG9obChmc3AtPm1fZXh0LmRhdGFbMV0pOworCQlpbnB1dC0+ZmlsdGVyLmZvcm1hdHRlZC52bGFuX2lkID0gZnNwLT5oX2V4dC52bGFuX3RjaTsKKwkJbWFzay5mb3JtYXR0ZWQudmxhbl9pZCA9IGZzcC0+bV9leHQudmxhbl90Y2k7CisJCWlucHV0LT5maWx0ZXIuZm9ybWF0dGVkLmZsZXhfYnl0ZXMgPQorCQkJCQkJZnNwLT5oX2V4dC52bGFuX2V0eXBlOworCQltYXNrLmZvcm1hdHRlZC5mbGV4X2J5dGVzID0gZnNwLT5tX2V4dC52bGFuX2V0eXBlOwogCX0KIAogCS8qIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGRyb3Agb3Igcm91dGUgdGhlIHBhY2tldCAqLwotCWlmIChmcy0+YWN0aW9uID09IEVUSFRPT0xfUlhOVFVQTEVfQUNUSU9OX0RST1ApCi0JCXRhcmdldF9xdWV1ZSA9IE1BWF9SWF9RVUVVRVMgLSAxOworCWlmIChmc3AtPnJpbmdfY29va2llID09IFJYX0NMU19GTE9XX0RJU0MpCisJCWlucHV0LT5hY3Rpb24gPSBJWEdCRV9GRElSX0RST1BfUVVFVUU7CiAJZWxzZQotCQl0YXJnZXRfcXVldWUgPSBmcy0+YWN0aW9uOworCQlpbnB1dC0+YWN0aW9uID0gZnNwLT5yaW5nX2Nvb2tpZTsKIAogCXNwaW5fbG9jaygmYWRhcHRlci0+ZmRpcl9wZXJmZWN0X2xvY2spOwotCWVyciA9IGl4Z2JlX2ZkaXJfYWRkX3BlcmZlY3RfZmlsdGVyXzgyNTk5KCZhZGFwdGVyLT5odywKLQkJCQkJCSAgJmlucHV0X3N0cnVjdCwKLQkJCQkJCSAgJmlucHV0X21hc2tzLCAwLAotCQkJCQkJICB0YXJnZXRfcXVldWUpOworCisJaWYgKGhsaXN0X2VtcHR5KCZhZGFwdGVyLT5mZGlyX2ZpbHRlcl9saXN0KSkgeworCQkvKiBzYXZlIG1hc2sgYW5kIHByb2dyYW0gaW5wdXQgbWFzayBpbnRvIEhXICovCisJCW1lbWNweSgmYWRhcHRlci0+ZmRpcl9tYXNrLCAmbWFzaywgc2l6ZW9mKG1hc2spKTsKKwkJZXJyID0gaXhnYmVfZmRpcl9zZXRfaW5wdXRfbWFza184MjU5OShodywgJm1hc2spOworCQlpZiAoZXJyKSB7CisJCQllX2VycihkcnYsICJFcnJvciB3cml0aW5nIG1hc2tcbiIpOworCQkJZ290byBlcnJfb3V0X3dfbG9jazsKKwkJfQorCX0gZWxzZSBpZiAobWVtY21wKCZhZGFwdGVyLT5mZGlyX21hc2ssICZtYXNrLCBzaXplb2YobWFzaykpKSB7CisJCWVfZXJyKGRydiwgIk9ubHkgb25lIG1hc2sgc3VwcG9ydGVkIHBlciBwb3J0XG4iKTsKKwkJZ290byBlcnJfb3V0X3dfbG9jazsKKwl9CisKKwkvKiBhcHBseSBtYXNrIGFuZCBjb21wdXRlL3N0b3JlIGhhc2ggKi8KKwlpeGdiZV9hdHJfY29tcHV0ZV9wZXJmZWN0X2hhc2hfODI1OTkoJmlucHV0LT5maWx0ZXIsICZtYXNrKTsKKworCS8qIHByb2dyYW0gZmlsdGVycyB0byBmaWx0ZXIgbWVtb3J5ICovCisJZXJyID0gaXhnYmVfZmRpcl93cml0ZV9wZXJmZWN0X2ZpbHRlcl84MjU5OShodywKKwkJCQkmaW5wdXQtPmZpbHRlciwgaW5wdXQtPnN3X2lkeCwKKwkJCQkoaW5wdXQtPmFjdGlvbiA9PSBJWEdCRV9GRElSX0RST1BfUVVFVUUpID8KKwkJCQlJWEdCRV9GRElSX0RST1BfUVVFVUUgOgorCQkJCWFkYXB0ZXItPnJ4X3JpbmdbaW5wdXQtPmFjdGlvbl0tPnJlZ19pZHgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF93X2xvY2s7CisKKwlpeGdiZV91cGRhdGVfZXRodG9vbF9mZGlyX2VudHJ5KGFkYXB0ZXIsIGlucHV0LCBpbnB1dC0+c3dfaWR4KTsKKwogCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5mZGlyX3BlcmZlY3RfbG9jayk7CiAKLQlyZXR1cm4gZXJyID8gLTEgOiAwOworCXJldHVybiBlcnI7CitlcnJfb3V0X3dfbG9jazoKKwlzcGluX3VubG9jaygmYWRhcHRlci0+ZmRpcl9wZXJmZWN0X2xvY2spOworZXJyX291dDoKKwlrZnJlZShpbnB1dCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgaXhnYmVfZGVsX2V0aHRvb2xfZmRpcl9lbnRyeShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKK3sKKwlzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKmZzcCA9CisJCShzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKikmY21kLT5mczsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5mZGlyX3BlcmZlY3RfbG9jayk7CisJZXJyID0gaXhnYmVfdXBkYXRlX2V0aHRvb2xfZmRpcl9lbnRyeShhZGFwdGVyLCBOVUxMLCBmc3AtPmxvY2F0aW9uKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+ZmRpcl9wZXJmZWN0X2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpeGdiZV9zZXRfcnhuZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKK3sKKwlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCisJc3dpdGNoIChjbWQtPmNtZCkgeworCWNhc2UgRVRIVE9PTF9TUlhDTFNSTElOUzoKKwkJcmV0ID0gaXhnYmVfYWRkX2V0aHRvb2xfZmRpcl9lbnRyeShhZGFwdGVyLCBjbWQpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfU1JYQ0xTUkxERUw6CisJCXJldCA9IGl4Z2JlX2RlbF9ldGh0b29sX2ZkaXJfZW50cnkoYWRhcHRlciwgY21kKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBpeGdiZV9ldGh0b29sX29wcyA9IHsKQEAgLTI0ODYsMTYgKzI1NjgsOCBAQAogCS5zZXRfcmluZ3BhcmFtICAgICAgICAgID0gaXhnYmVfc2V0X3JpbmdwYXJhbSwKIAkuZ2V0X3BhdXNlcGFyYW0gICAgICAgICA9IGl4Z2JlX2dldF9wYXVzZXBhcmFtLAogCS5zZXRfcGF1c2VwYXJhbSAgICAgICAgID0gaXhnYmVfc2V0X3BhdXNlcGFyYW0sCi0JLmdldF9yeF9jc3VtICAgICAgICAgICAgPSBpeGdiZV9nZXRfcnhfY3N1bSwKLQkuc2V0X3J4X2NzdW0gICAgICAgICAgICA9IGl4Z2JlX3NldF9yeF9jc3VtLAotCS5nZXRfdHhfY3N1bSAgICAgICAgICAgID0gaXhnYmVfZ2V0X3R4X2NzdW0sCi0JLnNldF90eF9jc3VtICAgICAgICAgICAgPSBpeGdiZV9zZXRfdHhfY3N1bSwKLQkuZ2V0X3NnICAgICAgICAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X3NnLAotCS5zZXRfc2cgICAgICAgICAgICAgICAgID0gZXRodG9vbF9vcF9zZXRfc2csCiAJLmdldF9tc2dsZXZlbCAgICAgICAgICAgPSBpeGdiZV9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbCAgICAgICAgICAgPSBpeGdiZV9zZXRfbXNnbGV2ZWwsCi0JLmdldF90c28gICAgICAgICAgICAgICAgPSBldGh0b29sX29wX2dldF90c28sCi0JLnNldF90c28gICAgICAgICAgICAgICAgPSBpeGdiZV9zZXRfdHNvLAogCS5zZWxmX3Rlc3QgICAgICAgICAgICAgID0gaXhnYmVfZGlhZ190ZXN0LAogCS5nZXRfc3RyaW5ncyAgICAgICAgICAgID0gaXhnYmVfZ2V0X3N0cmluZ3MsCiAJLnNldF9waHlzX2lkICAgICAgICAgICAgPSBpeGdiZV9zZXRfcGh5c19pZCwKQEAgLTI1MDMsOSArMjU3Nyw4IEBACiAJLmdldF9ldGh0b29sX3N0YXRzICAgICAgPSBpeGdiZV9nZXRfZXRodG9vbF9zdGF0cywKIAkuZ2V0X2NvYWxlc2NlICAgICAgICAgICA9IGl4Z2JlX2dldF9jb2FsZXNjZSwKIAkuc2V0X2NvYWxlc2NlICAgICAgICAgICA9IGl4Z2JlX3NldF9jb2FsZXNjZSwKLQkuZ2V0X2ZsYWdzICAgICAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X2ZsYWdzLAotCS5zZXRfZmxhZ3MgICAgICAgICAgICAgID0gaXhnYmVfc2V0X2ZsYWdzLAotCS5zZXRfcnhfbnR1cGxlICAgICAgICAgID0gaXhnYmVfc2V0X3J4X250dXBsZSwKKwkuZ2V0X3J4bmZjCQk9IGl4Z2JlX2dldF9yeG5mYywKKwkuc2V0X3J4bmZjCQk9IGl4Z2JlX3NldF9yeG5mYywKIH07CiAKIHZvaWQgaXhnYmVfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9mY29lLmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9mY29lLmMKaW5kZXggMDU5MjA3Mi4uODI0ZWRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZmNvZS5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2Zjb2UuYwpAQCAtMjYsOSArMjYsNiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgIml4Z2JlLmgiCi0jaWZkZWYgQ09ORklHX0lYR0JFX0RDQgotI2luY2x1ZGUgIml4Z2JlX2RjYl84MjU5OS5oIgotI2VuZGlmIC8qIENPTkZJR19JWEdCRV9EQ0IgKi8KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KQEAgLTQwLDI1ICszNyw2IEBACiAjaW5jbHVkZSA8c2NzaS9saWJmY29lLmg+CiAKIC8qKgotICogaXhnYmVfcnhfaXNfZmNvZSAtIGNoZWNrIHRoZSByeCBkZXNjIGZvciBpbmNvbWluZyBwa3QgdHlwZQotICogQHJ4X2Rlc2M6IGFkdmFuY2VkIHJ4IGRlc2NyaXB0b3IKLSAqCi0gKiBSZXR1cm5zIDogdHJ1ZSBpZiBpdCBpcyBGQ29FIHBrdAotICovCi1zdGF0aWMgaW5saW5lIGJvb2wgaXhnYmVfcnhfaXNfZmNvZSh1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqcnhfZGVzYykKLXsKLQl1MTYgcDsKLQotCXAgPSBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5sb3dlci5sb19kd29yZC5oc19yc3MucGt0X2luZm8pOwotCWlmIChwICYgSVhHQkVfUlhEQURWX1BLVFRZUEVfRVRRRikgewotCQlwICY9IElYR0JFX1JYREFEVl9QS1RUWVBFX0VUUUZfTUFTSzsKLQkJcCA+Pj0gSVhHQkVfUlhEQURWX1BLVFRZUEVfRVRRRl9TSElGVDsKLQkJcmV0dXJuIHAgPT0gSVhHQkVfRVRRRl9GSUxURVJfRkNPRTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKICAqIGl4Z2JlX2Zjb2VfY2xlYXJfZGRwIC0gY2xlYXIgdGhlIGdpdmVuIGRkcCBjb250ZXh0CiAgKiBAZGRwIC0gcHRyIHRvIHRoZSBpeGdiZV9mY29lX2RkcAogICoKQEAgLTEyOCwxNCArMTA2LDE3IEBACiAJaWYgKGRkcC0+c2dsKQogCQlwY2lfdW5tYXBfc2coYWRhcHRlci0+cGRldiwgZGRwLT5zZ2wsIGRkcC0+c2djLAogCQkJICAgICBETUFfRlJPTV9ERVZJQ0UpOwotCXBjaV9wb29sX2ZyZWUoZmNvZS0+cG9vbCwgZGRwLT51ZGwsIGRkcC0+dWRwKTsKKwlpZiAoZGRwLT5wb29sKSB7CisJCXBjaV9wb29sX2ZyZWUoZGRwLT5wb29sLCBkZHAtPnVkbCwgZGRwLT51ZHApOworCQlkZHAtPnBvb2wgPSBOVUxMOworCX0KKwogCWl4Z2JlX2Zjb2VfY2xlYXJfZGRwKGRkcCk7CiAKIG91dF9kZHBfcHV0OgogCXJldHVybiBsZW47CiB9CiAKLQogLyoqCiAgKiBpeGdiZV9mY29lX2RkcF9zZXR1cCAtIGNhbGxlZCB0byBzZXQgdXAgZGRwIGNvbnRleHQKICAqIEBuZXRkZXY6IHRoZSBjb3JyZXNwb25kaW5nIG5ldF9kZXZpY2UKQEAgLTE2Myw2ICsxNDQsNyBAQAogCXVuc2lnbmVkIGludCB0aGlzbGVuID0gMDsKIAl1MzIgZmNidWZmLCBmY2RtYXJ3LCBmY2ZsdHJ3LCBmY3J4Y3RsOwogCWRtYV9hZGRyX3QgYWRkciA9IDA7CisJc3RydWN0IHBjaV9wb29sICpwb29sOwogCiAJaWYgKCFuZXRkZXYgfHwgIXNnbCkKIAkJcmV0dXJuIDA7CkBAIC0xOTksMTIgKzE4MSwxNCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBhbGxvYyB0aGUgdWRsIGZyb20gb3VyIGRkcCBwb29sICovCi0JZGRwLT51ZGwgPSBwY2lfcG9vbF9hbGxvYyhmY29lLT5wb29sLCBHRlBfQVRPTUlDLCAmZGRwLT51ZHApOworCS8qIGFsbG9jIHRoZSB1ZGwgZnJvbSBwZXIgY3B1IGRkcCBwb29sICovCisJcG9vbCA9ICpwZXJfY3B1X3B0cihmY29lLT5wb29sLCBnZXRfY3B1KCkpOworCWRkcC0+dWRsID0gcGNpX3Bvb2xfYWxsb2MocG9vbCwgR0ZQX0FUT01JQywgJmRkcC0+dWRwKTsKIAlpZiAoIWRkcC0+dWRsKSB7CiAJCWVfZXJyKGRydiwgImZhaWxlZCBhbGxvY2F0ZWQgZGRwIGNvbnRleHRcbiIpOwogCQlnb3RvIG91dF9ub2RkcF91bm1hcDsKIAl9CisJZGRwLT5wb29sID0gcG9vbDsKIAlkZHAtPnNnbCA9IHNnbDsKIAlkZHAtPnNnYyA9IHNnYzsKIApAQCAtMjY4LDYgKzI1Miw3IEBACiAJCWorKzsKIAkJbGFzdHNpemUgPSAxOwogCX0KKwlwdXRfY3B1KCk7CiAKIAlmY2J1ZmYgPSAoSVhHQkVfRkNCVUZGXzRLQiA8PCBJWEdCRV9GQ0JVRkZfQlVGRlNJWkVfU0hJRlQpOwogCWZjYnVmZiB8PSAoKGogJiAweGZmKSA8PCBJWEdCRV9GQ0JVRkZfQlVGRkNOVF9TSElGVCk7CkBAIC0zMTEsMTEgKzI5NiwxMiBAQAogCXJldHVybiAxOwogCiBvdXRfbm9kZHBfZnJlZToKLQlwY2lfcG9vbF9mcmVlKGZjb2UtPnBvb2wsIGRkcC0+dWRsLCBkZHAtPnVkcCk7CisJcGNpX3Bvb2xfZnJlZShwb29sLCBkZHAtPnVkbCwgZGRwLT51ZHApOwogCWl4Z2JlX2Zjb2VfY2xlYXJfZGRwKGRkcCk7CiAKIG91dF9ub2RkcF91bm1hcDoKIAlwY2lfdW5tYXBfc2coYWRhcHRlci0+cGRldiwgc2dsLCBzZ2MsIERNQV9GUk9NX0RFVklDRSk7CisJcHV0X2NwdSgpOwogCXJldHVybiAwOwogfQogCkBAIC0zNzQsMjMgKzM2MCwyMCBAQAogICovCiBpbnQgaXhnYmVfZmNvZV9kZHAoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCSAgIHVuaW9uIGl4Z2JlX2Fkdl9yeF9kZXNjICpyeF9kZXNjLAotCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICB1MzIgc3RhdGVycikKIHsKIAl1MTYgeGlkOwogCXUzMiBmY3RsOwotCXUzMiBzdGVyciwgZmNlb2ZlLCBmY2VyciwgZmNzdGF0OworCXUzMiBmY2VvZmUsIGZjZXJyLCBmY3N0YXQ7CiAJaW50IHJjID0gLUVJTlZBTDsKIAlzdHJ1Y3QgaXhnYmVfZmNvZSAqZmNvZTsKIAlzdHJ1Y3QgaXhnYmVfZmNvZV9kZHAgKmRkcDsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKIAlzdHJ1Y3QgZmNvZV9jcmNfZW9mICpjcmM7CiAKLQlpZiAoIWl4Z2JlX3J4X2lzX2Zjb2UocnhfZGVzYykpCi0JCWdvdG8gZGRwX291dDsKLQotCXN0ZXJyID0gbGUzMl90b19jcHUocnhfZGVzYy0+d2IudXBwZXIuc3RhdHVzX2Vycm9yKTsKLQlmY2VyciA9IChzdGVyciAmIElYR0JFX1JYREFEVl9FUlJfRkNFUlIpOwotCWZjZW9mZSA9IChzdGVyciAmIElYR0JFX1JYREFEVl9FUlJfRkNFT0ZFKTsKKwlmY2VyciA9IChzdGF0ZXJyICYgSVhHQkVfUlhEQURWX0VSUl9GQ0VSUik7CisJZmNlb2ZlID0gKHN0YXRlcnIgJiBJWEdCRV9SWERBRFZfRVJSX0ZDRU9GRSk7CiAJaWYgKGZjZXJyID09IElYR0JFX0ZDRVJSX0JBRENSQykKIAkJc2tiX2NoZWNrc3VtX25vbmVfYXNzZXJ0KHNrYik7CiAJZWxzZQpAQCAtNDE5LDcgKzQwMiw3IEBACiAJaWYgKGZjZXJyIHwgZmNlb2ZlKQogCQlnb3RvIGRkcF9vdXQ7CiAKLQlmY3N0YXQgPSAoc3RlcnIgJiBJWEdCRV9SWERBRFZfU1RBVF9GQ1NUQVQpOworCWZjc3RhdCA9IChzdGF0ZXJyICYgSVhHQkVfUlhEQURWX1NUQVRfRkNTVEFUKTsKIAlpZiAoZmNzdGF0KSB7CiAJCS8qIHVwZGF0ZSBsZW5ndGggb2YgRERQZWQgZGF0YSAqLwogCQlkZHAtPmxlbiA9IGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPndiLmxvd2VyLmhpX2R3b3JkLnJzcyk7CkBAIC00NjUsMjQgKzQ0OCwxOCBAQAogICoKICAqIFJldHVybnMgOiAwIGluZGljYXRlcyBubyBGU08sID4gMCBmb3IgRlNPLCA8IDAgZm9yIGVycm9yCiAgKi8KLWludCBpeGdiZV9mc28oc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0gICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IGl4Z2JlX2ZzbyhzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKICAgICAgICAgICAgICAgdTMyIHR4X2ZsYWdzLCB1OCAqaGRyX2xlbikKIHsKLQl1OCBzb2YsIGVvZjsKLQl1MzIgdmxhbl9tYWNpcF9sZW5zOwotCXUzMiBmY29lX3NvZl9lb2Y7Ci0JdTMyIHR5cGVfdHVjbWQ7Ci0JdTMyIG1zc19sNGxlbl9pZHg7Ci0JaW50IG1zcyA9IDA7Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IGl4Z2JlX3R4X2J1ZmZlciAqdHhfYnVmZmVyX2luZm87Ci0Jc3RydWN0IGl4Z2JlX2Fkdl90eF9jb250ZXh0X2Rlc2MgKmNvbnRleHRfZGVzYzsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKKwl1MzIgdmxhbl9tYWNpcF9sZW5zOworCXUzMiBmY29lX3NvZl9lb2YgPSAwOworCXUzMiBtc3NfbDRsZW5faWR4OworCXU4IHNvZiwgZW9mOwogCiAJaWYgKHNrYl9pc19nc28oc2tiKSAmJiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAhPSBTS0JfR1NPX0ZDT0UpKSB7Ci0JCWVfZXJyKGRydiwgIldyb25nIGdzbyB0eXBlICVkOmV4cGVjdGluZyBTS0JfR1NPX0ZDT0VcbiIsCi0JCSAgICAgIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUpOworCQlkZXZfZXJyKHR4X3JpbmctPmRldiwgIldyb25nIGdzbyB0eXBlICVkOmV4cGVjdGluZyBTS0JfR1NPX0ZDT0VcbiIsCisJCQlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00OTIsMjMgKzQ2OSwyMiBAQAogCQkJCSBzaXplb2Yoc3RydWN0IGZjb2VfaGRyKSk7CiAKIAkvKiBzZXRzIHVwIFNPRiBhbmQgT1JJUyAqLwotCWZjb2Vfc29mX2VvZiA9IDA7CiAJc29mID0gKChzdHJ1Y3QgZmNvZV9oZHIgKilza2JfbmV0d29ya19oZWFkZXIoc2tiKSktPmZjb2Vfc29mOwogCXN3aXRjaCAoc29mKSB7CiAJY2FzZSBGQ19TT0ZfSTI6Ci0JCWZjb2Vfc29mX2VvZiB8PSBJWEdCRV9BRFZUWERfRkNPRUZfT1JJUzsKKwkJZmNvZV9zb2ZfZW9mID0gSVhHQkVfQURWVFhEX0ZDT0VGX09SSVM7CiAJCWJyZWFrOwogCWNhc2UgRkNfU09GX0kzOgotCQlmY29lX3NvZl9lb2YgfD0gSVhHQkVfQURWVFhEX0ZDT0VGX1NPRjsKLQkJZmNvZV9zb2ZfZW9mIHw9IElYR0JFX0FEVlRYRF9GQ09FRl9PUklTOworCQlmY29lX3NvZl9lb2YgPSBJWEdCRV9BRFZUWERfRkNPRUZfU09GIHwKKwkJCSAgICAgICBJWEdCRV9BRFZUWERfRkNPRUZfT1JJUzsKIAkJYnJlYWs7CiAJY2FzZSBGQ19TT0ZfTjI6CiAJCWJyZWFrOwogCWNhc2UgRkNfU09GX04zOgotCQlmY29lX3NvZl9lb2YgfD0gSVhHQkVfQURWVFhEX0ZDT0VGX1NPRjsKKwkJZmNvZV9zb2ZfZW9mID0gSVhHQkVfQURWVFhEX0ZDT0VGX1NPRjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZV93YXJuKGRydiwgInVua25vd24gc29mID0gMHgleFxuIiwgc29mKTsKKwkJZGV2X3dhcm4odHhfcmluZy0+ZGV2LCAidW5rbm93biBzb2YgPSAweCV4XG4iLCBzb2YpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTUyMSwxMiArNDk3LDExIEBACiAJCWJyZWFrOwogCWNhc2UgRkNfRU9GX1Q6CiAJCS8qIGxzbyBuZWVkcyBPUklFICovCi0JCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKLQkJCWZjb2Vfc29mX2VvZiB8PSBJWEdCRV9BRFZUWERfRkNPRUZfRU9GX047Ci0JCQlmY29lX3NvZl9lb2YgfD0gSVhHQkVfQURWVFhEX0ZDT0VGX09SSUU7Ci0JCX0gZWxzZSB7CisJCWlmIChza2JfaXNfZ3NvKHNrYikpCisJCQlmY29lX3NvZl9lb2YgfD0gSVhHQkVfQURWVFhEX0ZDT0VGX0VPRl9OIHwKKwkJCQkJSVhHQkVfQURWVFhEX0ZDT0VGX09SSUU7CisJCWVsc2UKIAkJCWZjb2Vfc29mX2VvZiB8PSBJWEdCRV9BRFZUWERfRkNPRUZfRU9GX1Q7Ci0JCX0KIAkJYnJlYWs7CiAJY2FzZSBGQ19FT0ZfTkk6CiAJCWZjb2Vfc29mX2VvZiB8PSBJWEdCRV9BRFZUWERfRkNPRUZfRU9GX05JOwpAQCAtNTM1LDcgKzUxMCw3IEBACiAJCWZjb2Vfc29mX2VvZiB8PSBJWEdCRV9BRFZUWERfRkNPRUZfRU9GX0E7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWVfd2FybihkcnYsICJ1bmtub3duIGVvZiA9IDB4JXhcbiIsIGVvZik7CisJCWRldl93YXJuKHR4X3JpbmctPmRldiwgInVua25vd24gZW9mID0gMHgleFxuIiwgZW9mKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01NDQsNDcgKzUxOSw3MiBAQAogCWlmIChmaC0+ZmhfZl9jdGxbMl0gJiBGQ19GQ19SRUxfT0ZGKQogCQlmY29lX3NvZl9lb2YgfD0gSVhHQkVfQURWVFhEX0ZDT0VGX1BBUklOQzsKIAotCS8qIGhkcl9sZW4gaW5jbHVkZXMgZmNfaGRyIGlmIEZDb0UgbHNvIGlzIGVuYWJsZWQgKi8KKwkvKiBpbmNsdWRlIHRyYWlsZXIgaW4gaGVhZGxlbiBhcyBpdCBpcyByZXBsaWNhdGVkIHBlciBmcmFtZSAqLwogCSpoZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBmY29lX2NyY19lb2YpOworCisJLyogaGRyX2xlbiBpbmNsdWRlcyBmY19oZHIgaWYgRkNvRSBMU08gaXMgZW5hYmxlZCAqLwogCWlmIChza2JfaXNfZ3NvKHNrYikpCiAJCSpoZHJfbGVuICs9IChza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsKIAkJCSAgICAgc2l6ZW9mKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIpKTsKLQkvKiB2bGFuX21hY2lwX2xlbnM6IEhFQURMRU4sIE1BQ0xFTiwgVkxBTiB0YWcgKi8KLQl2bGFuX21hY2lwX2xlbnMgPSAoc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArCi0JCQkgIHNpemVvZihzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyKSk7Ci0Jdmxhbl9tYWNpcF9sZW5zIHw9ICgoc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSAtIDQpCi0JCQkgICA8PCBJWEdCRV9BRFZUWERfTUFDTEVOX1NISUZUKTsKLQl2bGFuX21hY2lwX2xlbnMgfD0gKHR4X2ZsYWdzICYgSVhHQkVfVFhfRkxBR1NfVkxBTl9NQVNLKTsKIAotCS8qIHR5cGVfdHljbWQgYW5kIG1zczogc2V0IFRVQ01ELkZDb0UgdG8gZW5hYmxlIG9mZmxvYWQgKi8KLQl0eXBlX3R1Y21kID0gSVhHQkVfVFhEX0NNRF9ERVhUIHwgSVhHQkVfQURWVFhEX0RUWVBfQ1RYVCB8Ci0JCSAgICAgSVhHQkVfQURWVFhUX1RVQ01EX0ZDT0U7Ci0JaWYgKHNrYl9pc19nc28oc2tiKSkKLQkJbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIAkvKiBtc3NfbDRsZW5faWQ6IHVzZSAxIGZvciBGU08gYXMgVFNPLCBubyBuZWVkIGZvciBMNExFTiAqLwotCW1zc19sNGxlbl9pZHggPSAobXNzIDw8IElYR0JFX0FEVlRYRF9NU1NfU0hJRlQpIHwKLQkJCSgxIDw8IElYR0JFX0FEVlRYRF9JRFhfU0hJRlQpOworCW1zc19sNGxlbl9pZHggPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplIDw8IElYR0JFX0FEVlRYRF9NU1NfU0hJRlQ7CisJbXNzX2w0bGVuX2lkeCB8PSAxIDw8IElYR0JFX0FEVlRYRF9JRFhfU0hJRlQ7CisKKwkvKiB2bGFuX21hY2lwX2xlbnM6IEhFQURMRU4sIE1BQ0xFTiwgVkxBTiB0YWcgKi8KKwl2bGFuX21hY2lwX2xlbnMgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsKKwkJCSAgc2l6ZW9mKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIpOworCXZsYW5fbWFjaXBfbGVucyB8PSAoc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSAtIDQpCisJCQkgICA8PCBJWEdCRV9BRFZUWERfTUFDTEVOX1NISUZUOworCXZsYW5fbWFjaXBfbGVucyB8PSB0eF9mbGFncyAmIElYR0JFX1RYX0ZMQUdTX1ZMQU5fTUFTSzsKIAogCS8qIHdyaXRlIGNvbnRleHQgZGVzYyAqLwotCWkgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKLQljb250ZXh0X2Rlc2MgPSBJWEdCRV9UWF9DVFhUREVTQ19BRFYodHhfcmluZywgaSk7Ci0JY29udGV4dF9kZXNjLT52bGFuX21hY2lwX2xlbnMJPSBjcHVfdG9fbGUzMih2bGFuX21hY2lwX2xlbnMpOwotCWNvbnRleHRfZGVzYy0+c2VxbnVtX3NlZWQJPSBjcHVfdG9fbGUzMihmY29lX3NvZl9lb2YpOwotCWNvbnRleHRfZGVzYy0+dHlwZV90dWNtZF9tbGhsCT0gY3B1X3RvX2xlMzIodHlwZV90dWNtZCk7Ci0JY29udGV4dF9kZXNjLT5tc3NfbDRsZW5faWR4CT0gY3B1X3RvX2xlMzIobXNzX2w0bGVuX2lkeCk7Ci0KLQl0eF9idWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT50eF9idWZmZXJfaW5mb1tpXTsKLQl0eF9idWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7Ci0JdHhfYnVmZmVyX2luZm8tPm5leHRfdG9fd2F0Y2ggPSBpOwotCi0JaSsrOwotCWlmIChpID09IHR4X3JpbmctPmNvdW50KQotCQlpID0gMDsKLQl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IGk7CisJaXhnYmVfdHhfY3R4dGRlc2ModHhfcmluZywgdmxhbl9tYWNpcF9sZW5zLCBmY29lX3NvZl9lb2YsCisJCQkgIElYR0JFX0FEVlRYVF9UVUNNRF9GQ09FLCBtc3NfbDRsZW5faWR4KTsKIAogCXJldHVybiBza2JfaXNfZ3NvKHNrYik7CiB9CiAKK3N0YXRpYyB2b2lkIGl4Z2JlX2Zjb2VfZGRwX3Bvb2xzX2ZyZWUoc3RydWN0IGl4Z2JlX2Zjb2UgKmZjb2UpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwlzdHJ1Y3QgcGNpX3Bvb2wgKipwb29sOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlwb29sID0gcGVyX2NwdV9wdHIoZmNvZS0+cG9vbCwgY3B1KTsKKwkJaWYgKCpwb29sKQorCQkJcGNpX3Bvb2xfZGVzdHJveSgqcG9vbCk7CisJfQorCWZyZWVfcGVyY3B1KGZjb2UtPnBvb2wpOworCWZjb2UtPnBvb2wgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpeGdiZV9mY29lX2RkcF9wb29sc19hbGxvYyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXhnYmVfZmNvZSAqZmNvZSA9ICZhZGFwdGVyLT5mY29lOworCXVuc2lnbmVkIGludCBjcHU7CisJc3RydWN0IHBjaV9wb29sICoqcG9vbDsKKwljaGFyIHBvb2xfbmFtZVszMl07CisKKwlmY29lLT5wb29sID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBwY2lfcG9vbCAqKTsKKwlpZiAoIWZjb2UtPnBvb2wpCisJCXJldHVybjsKKworCS8qIGFsbG9jYXRlIHBjaSBwb29sIGZvciBlYWNoIGNwdSAqLworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc25wcmludGYocG9vbF9uYW1lLCAzMiwgIml4Z2JlX2Zjb2VfZGRwXyVkIiwgY3B1KTsKKwkJcG9vbCA9IHBlcl9jcHVfcHRyKGZjb2UtPnBvb2wsIGNwdSk7CisJCSpwb29sID0gcGNpX3Bvb2xfY3JlYXRlKHBvb2xfbmFtZSwKKwkJCQkJYWRhcHRlci0+cGRldiwgSVhHQkVfRkNQVFJfTUFYLAorCQkJCQlJWEdCRV9GQ1BUUl9BTElHTiwgUEFHRV9TSVpFKTsKKwkJaWYgKCEqcG9vbCkgeworCQkJZV9lcnIoZHJ2LCAiZmFpbGVkIHRvIGFsbG9jIEREUCBwb29sIG9uIGNwdTolZFxuIiwgY3B1KTsKKwkJCWl4Z2JlX2Zjb2VfZGRwX3Bvb2xzX2ZyZWUoZmNvZSk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKIC8qKgogICogaXhnYmVfY29uZmlndXJlX2Zjb2UgLSBjb25maWd1cmVzIHJlZ2lzdGVycyBmb3IgZmNvZSBhdCBzdGFydAogICogQGFkYXB0ZXI6IHB0ciB0byBpeGdiZSBhZGFwdGVyCkBAIC01OTksMjcgKzU5OSwyMSBAQAogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJc3RydWN0IGl4Z2JlX2Zjb2UgKmZjb2UgPSAmYWRhcHRlci0+ZmNvZTsKIAlzdHJ1Y3QgaXhnYmVfcmluZ19mZWF0dXJlICpmID0gJmFkYXB0ZXItPnJpbmdfZmVhdHVyZVtSSU5HX0ZfRkNPRV07Ci0jaWZkZWYgQ09ORklHX0lYR0JFX0RDQgotCXU4IHRjOwotCXUzMiB1cDJ0YzsKLSNlbmRpZgogCi0JLyogY3JlYXRlIHRoZSBwb29sIGZvciBkZHAgaWYgbm90IGNyZWF0ZWQgeWV0ICovCiAJaWYgKCFmY29lLT5wb29sKSB7Ci0JCS8qIGFsbG9jYXRlIGRkcCBwb29sICovCi0JCWZjb2UtPnBvb2wgPSBwY2lfcG9vbF9jcmVhdGUoIml4Z2JlX2Zjb2VfZGRwIiwKLQkJCQkJICAgICBhZGFwdGVyLT5wZGV2LCBJWEdCRV9GQ1BUUl9NQVgsCi0JCQkJCSAgICAgSVhHQkVfRkNQVFJfQUxJR04sIFBBR0VfU0laRSk7Ci0JCWlmICghZmNvZS0+cG9vbCkKLQkJCWVfZXJyKGRydiwgImZhaWxlZCB0byBhbGxvY2F0ZWQgRkNvRSBERFAgcG9vbFxuIik7Ci0KIAkJc3Bpbl9sb2NrX2luaXQoJmZjb2UtPmxvY2spOwogCisJCWl4Z2JlX2Zjb2VfZGRwX3Bvb2xzX2FsbG9jKGFkYXB0ZXIpOworCQlpZiAoIWZjb2UtPnBvb2wpIHsKKwkJCWVfZXJyKGRydiwgImZhaWxlZCB0byBhbGxvYyBwZXJjcHUgZmNvZSBERFAgcG9vbHNcbiIpOworCQkJcmV0dXJuOworCQl9CisKIAkJLyogRXh0cmEgYnVmZmVyIHRvIGJlIHNoYXJlZCBieSBhbGwgRERQcyBmb3IgSFcgd29yayBhcm91bmQgKi8KIAkJZmNvZS0+ZXh0cmFfZGRwX2J1ZmZlciA9IGttYWxsb2MoSVhHQkVfRkNCVUZGX01JTiwgR0ZQX0FUT01JQyk7CiAJCWlmIChmY29lLT5leHRyYV9kZHBfYnVmZmVyID09IE5VTEwpIHsKIAkJCWVfZXJyKGRydiwgImZhaWxlZCB0byBhbGxvY2F0ZWQgZXh0cmEgRERQIGJ1ZmZlclxuIik7Ci0JCQlnb3RvIG91dF9leHRyYV9kZHBfYnVmZmVyX2FsbG9jOworCQkJZ290byBvdXRfZGRwX3Bvb2xzOwogCQl9CiAKIAkJZmNvZS0+ZXh0cmFfZGRwX2J1ZmZlcl9kbWEgPQpAQCAtNjMwLDcgKzYyNCw3IEBACiAJCWlmIChkbWFfbWFwcGluZ19lcnJvcigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJCSAgICAgIGZjb2UtPmV4dHJhX2RkcF9idWZmZXJfZG1hKSkgewogCQkJZV9lcnIoZHJ2LCAiZmFpbGVkIHRvIG1hcCBleHRyYSBERFAgYnVmZmVyXG4iKTsKLQkJCWdvdG8gb3V0X2V4dHJhX2RkcF9idWZmZXJfZG1hOworCQkJZ290byBvdXRfZXh0cmFfZGRwX2J1ZmZlcjsKIAkJfQogCX0KIApAQCAtNjcwLDI1ICs2NjQsMTIgQEAKIAkJCUlYR0JFX0ZDUlhDVFJMX0ZDT0VMTEkgfAogCQkJSVhHQkVfRkNSWENUUkxfRkNDUkNCTyB8CiAJCQkoRkNfRkNPRV9WRVIgPDwgSVhHQkVfRkNSWENUUkxfRkNPRVZFUl9TSElGVCkpOwotI2lmZGVmIENPTkZJR19JWEdCRV9EQ0IKLQl1cDJ0YyA9IElYR0JFX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfUlRUVVAyVEMpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfVVNFUl9QUklPUklUWTsgaSsrKSB7Ci0JCXRjID0gKHU4KSh1cDJ0YyA+PiAoaSAqIElYR0JFX1JUVFVQMlRDX1VQX1NISUZUKSk7Ci0JCXRjICY9IChNQVhfVFJBRkZJQ19DTEFTUyAtIDEpOwotCQlpZiAoZmNvZS0+dGMgPT0gdGMpIHsKLQkJCWZjb2UtPnVwID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotI2VuZGlmCi0KIAlyZXR1cm47CiAKLW91dF9leHRyYV9kZHBfYnVmZmVyX2RtYToKK291dF9leHRyYV9kZHBfYnVmZmVyOgogCWtmcmVlKGZjb2UtPmV4dHJhX2RkcF9idWZmZXIpOwotb3V0X2V4dHJhX2RkcF9idWZmZXJfYWxsb2M6Ci0JcGNpX3Bvb2xfZGVzdHJveShmY29lLT5wb29sKTsKLQlmY29lLT5wb29sID0gTlVMTDsKK291dF9kZHBfcG9vbHM6CisJaXhnYmVfZmNvZV9kZHBfcG9vbHNfZnJlZShmY29lKTsKIH0KIAogLyoqCkBAIC03MDQsMTggKzY4NSwxNyBAQAogCWludCBpOwogCXN0cnVjdCBpeGdiZV9mY29lICpmY29lID0gJmFkYXB0ZXItPmZjb2U7CiAKLQkvKiByZWxlYXNlIGRkcCByZXNvdXJjZSAqLwotCWlmIChmY29lLT5wb29sKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBJWEdCRV9GQ09FX0REUF9NQVg7IGkrKykKLQkJCWl4Z2JlX2Zjb2VfZGRwX3B1dChhZGFwdGVyLT5uZXRkZXYsIGkpOwotCQlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJIGZjb2UtPmV4dHJhX2RkcF9idWZmZXJfZG1hLAotCQkJCSBJWEdCRV9GQ0JVRkZfTUlOLAotCQkJCSBETUFfRlJPTV9ERVZJQ0UpOwotCQlrZnJlZShmY29lLT5leHRyYV9kZHBfYnVmZmVyKTsKLQkJcGNpX3Bvb2xfZGVzdHJveShmY29lLT5wb29sKTsKLQkJZmNvZS0+cG9vbCA9IE5VTEw7Ci0JfQorCWlmICghZmNvZS0+cG9vbCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IElYR0JFX0ZDT0VfRERQX01BWDsgaSsrKQorCQlpeGdiZV9mY29lX2RkcF9wdXQoYWRhcHRlci0+bmV0ZGV2LCBpKTsKKwlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkgZmNvZS0+ZXh0cmFfZGRwX2J1ZmZlcl9kbWEsCisJCQkgSVhHQkVfRkNCVUZGX01JTiwKKwkJCSBETUFfRlJPTV9ERVZJQ0UpOworCWtmcmVlKGZjb2UtPmV4dHJhX2RkcF9idWZmZXIpOworCWl4Z2JlX2Zjb2VfZGRwX3Bvb2xzX2ZyZWUoZmNvZSk7CiB9CiAKIC8qKgpAQCAtODExLDQxICs3OTEsNiBAQAogCXJldHVybiByYzsKIH0KIAotI2lmZGVmIENPTkZJR19JWEdCRV9EQ0IKLS8qKgotICogaXhnYmVfZmNvZV9zZXRhcHAgLSBzZXRzIHRoZSB1c2VyIHByaW9yaXR5IGJpdG1hcCBmb3IgRkNvRQotICogQGFkYXB0ZXIgOiBpeGdiZSBhZGFwdGVyCi0gKiBAdXAgOiA4MDIuMXAgdXNlciBwcmlvcml0eSBiaXRtYXAKLSAqCi0gKiBGaW5kcyBvdXQgdGhlIHRyYWZmaWMgY2xhc3MgZnJvbSB0aGUgaW5wdXQgdXNlciBwcmlvcml0eQotICogYml0bWFwIGZvciBGQ29FLgotICoKLSAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIHJldHVybnMgMSBvbiBlcnJvcgotICovCi11OCBpeGdiZV9mY29lX3NldGFwcChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwgdTggdXApCi17Ci0JaW50IGk7Ci0JdTMyIHVwMnRjOwotCi0JLyogdmFsaWQgdXNlciBwcmlvcml0eSBiaXRtYXAgbXVzdCBub3QgYmUgMCAqLwotCWlmICh1cCkgewotCQkvKiBmcm9tIHVzZXIgcHJpb3JpdHkgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdHJhZmZpYyBjbGFzcyAqLwotCQl1cDJ0YyA9IElYR0JFX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfUlRUVVAyVEMpOwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1VTRVJfUFJJT1JJVFk7IGkrKykgewotCQkJaWYgKHVwICYgKDEgPDwgaSkpIHsKLQkJCQl1cDJ0YyA+Pj0gKGkgKiBJWEdCRV9SVFRVUDJUQ19VUF9TSElGVCk7Ci0JCQkJdXAydGMgJj0gKE1BWF9UUkFGRklDX0NMQVNTIC0gMSk7Ci0JCQkJYWRhcHRlci0+ZmNvZS50YyA9ICh1OCl1cDJ0YzsKLQkJCQlhZGFwdGVyLT5mY29lLnVwID0gaTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiAxOwotfQotI2VuZGlmIC8qIENPTkZJR19JWEdCRV9EQ0IgKi8KLQogLyoqCiAgKiBpeGdiZV9mY29lX2dldF93d24gLSBnZXQgd29ybGQgd2lkZSBuYW1lIGZvciB0aGUgbm9kZSBvciB0aGUgcG9ydAogICogQG5ldGRldiA6IGl4Z2JlIGFkYXB0ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2Zjb2UuaCBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2Zjb2UuaAppbmRleCA1YTY1MGE0Li45OWRlMTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9mY29lLmgKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZmNvZS5oCkBAIC02MiwyMCArNjIsMjAgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbDsKIAlkbWFfYWRkcl90IHVkcDsKIAl1NjQgKnVkbDsKKwlzdHJ1Y3QgcGNpX3Bvb2wgKnBvb2w7CiB9OwogCiBzdHJ1Y3QgaXhnYmVfZmNvZSB7Ci0jaWZkZWYgQ09ORklHX0lYR0JFX0RDQgotCXU4IHRjOwotCXU4IHVwOwotI2VuZGlmCi0JdW5zaWduZWQgbG9uZyBtb2RlOworCXN0cnVjdCBwY2lfcG9vbCAqKnBvb2w7CiAJYXRvbWljX3QgcmVmY250OwogCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgcGNpX3Bvb2wgKnBvb2w7CiAJc3RydWN0IGl4Z2JlX2Zjb2VfZGRwIGRkcFtJWEdCRV9GQ09FX0REUF9NQVhdOwogCXVuc2lnbmVkIGNoYXIgKmV4dHJhX2RkcF9idWZmZXI7CiAJZG1hX2FkZHJfdCBleHRyYV9kZHBfYnVmZmVyX2RtYTsKKwl1bnNpZ25lZCBsb25nIG1vZGU7CisjaWZkZWYgQ09ORklHX0lYR0JFX0RDQgorCXU4IHVwOworI2VuZGlmCiB9OwogCiAjZW5kaWYgLyogX0lYR0JFX0ZDT0VfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfbWFpbi5jCmluZGV4IDA4ZThlMjUuLjFiZTYxNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9tYWluLmMKQEAgLTMyLDggKzMyLDEwIEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9zY3RwLmg+CiAjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTUzLDExICs1NSwxMCBAQAogc3RhdGljIGNvbnN0IGNoYXIgaXhnYmVfZHJpdmVyX3N0cmluZ1tdID0KIAkJCSAgICAgICJJbnRlbChSKSAxMCBHaWdhYml0IFBDSSBFeHByZXNzIE5ldHdvcmsgRHJpdmVyIjsKICNkZWZpbmUgTUFKIDMKLSNkZWZpbmUgTUlOIDMKKyNkZWZpbmUgTUlOIDQKICNkZWZpbmUgQlVJTEQgOAotI2RlZmluZSBLRklYIDIKICNkZWZpbmUgRFJWX1ZFUlNJT04gX19zdHJpbmdpZnkoTUFKKSAiLiIgX19zdHJpbmdpZnkoTUlOKSAiLiIgXAotCV9fc3RyaW5naWZ5KEJVSUxEKSAiLWsiIF9fc3RyaW5naWZ5KEtGSVgpCisJX19zdHJpbmdpZnkoQlVJTEQpICItayIKIGNvbnN0IGNoYXIgaXhnYmVfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwogc3RhdGljIGNvbnN0IGNoYXIgaXhnYmVfY29weXJpZ2h0W10gPQogCQkJCSJDb3B5cmlnaHQgKGMpIDE5OTktMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4iOwpAQCAtNjY0LDYyICs2NjUsNiBAQAogCS8qIHR4X2J1ZmZlcl9pbmZvIG11c3QgYmUgY29tcGxldGVseSBzZXQgdXAgaW4gdGhlIHRyYW5zbWl0IHBhdGggKi8KIH0KIAotLyoqCi0gKiBpeGdiZV9kY2JfdHhxX3RvX3RjIC0gY29udmVydCBhIHJlZyBpbmRleCB0byBhIHRyYWZmaWMgY2xhc3MKLSAqIEBhZGFwdGVyOiBkcml2ZXIgcHJpdmF0ZSBzdHJ1Y3QKLSAqIEBpbmRleDogcmVnIGlkeCBvZiBxdWV1ZSB0byBxdWVyeSAoMC0xMjcpCi0gKgotICogSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgdHJhZmZpYyBpbmRleCBmb3IgYSBwYXJ0aWN1bGFyCi0gKiByZWdpc3RlciBpbmRleC4KLSAqCi0gKiBSZXR1cm5zIDogYSB0YyBpbmRleCBmb3IgdXNlIGluIHJhbmdlIDAtNywgb3IgMC0zCi0gKi8KLXN0YXRpYyB1OCBpeGdiZV9kY2JfdHhxX3RvX3RjKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLCB1OCByZWdfaWR4KQotewotCWludCB0YyA9IC0xOwotCWludCBkY2JfaSA9IG5ldGRldl9nZXRfbnVtX3RjKGFkYXB0ZXItPm5ldGRldik7Ci0KLQkvKiBpZiBEQ0IgaXMgbm90IGVuYWJsZWQgdGhlIHF1ZXVlcyBoYXZlIG5vIFRDICovCi0JaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0RDQl9FTkFCTEVEKSkKLQkJcmV0dXJuIHRjOwotCi0JLyogY2hlY2sgdmFsaWQgcmFuZ2UgKi8KLQlpZiAocmVnX2lkeCA+PSBhZGFwdGVyLT5ody5tYWMubWF4X3R4X3F1ZXVlcykKLQkJcmV0dXJuIHRjOwotCi0Jc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewotCWNhc2UgaXhnYmVfbWFjXzgyNTk4RUI6Ci0JCXRjID0gcmVnX2lkeCA+PiAyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpZiAoZGNiX2kgIT0gNCAmJiBkY2JfaSAhPSA4KQotCQkJYnJlYWs7Ci0KLQkJLyogaWYgVk1EcSBpcyBlbmFibGVkIHRoZSBsb3dlc3Qgb3JkZXIgYml0cyBkZXRlcm1pbmUgVEMgKi8KLQkJaWYgKGFkYXB0ZXItPmZsYWdzICYgKElYR0JFX0ZMQUdfU1JJT1ZfRU5BQkxFRCB8Ci0JCQkJICAgICAgSVhHQkVfRkxBR19WTURRX0VOQUJMRUQpKSB7Ci0JCQl0YyA9IHJlZ19pZHggJiAoZGNiX2kgLSAxKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogQ29udmVydCB0aGUgcmVnX2lkeCBpbnRvIHRoZSBjb3JyZWN0IFRDLiBUaGlzIGJpdG1hc2sKLQkJICogdGFyZ2V0cyB0aGUgbGFzdCBmdWxsIDMyIHJpbmcgdHJhZmZpYyBjbGFzcyBhbmQgYXNzaWducwotCQkgKiBpdCBhIHZhbHVlIG9mIDEuIEZyb20gdGhlcmUgdGhlIHJlc3Qgb2YgdGhlIHJpbmdzIGFyZQotCQkgKiBiYXNlZCBvbiBzaGlmdGluZyB0aGUgbWFzayBmdXJ0aGVyIHVwIHRvIGluY2x1ZGUgdGhlCi0JCSAqIHJlZ19pZHggLyAxNiBhbmQgdGhlbiByZWdfaWR4IC8gOC4gSXQgYXNzdW1lcyBkY0JfaQotCQkgKiB3aWxsIG9ubHkgZXZlciBiZSA4IG9yIDQgYW5kIHRoYXQgcmVnX2lkeCB3aWxsIG5ldmVyCi0JCSAqIGJlIGdyZWF0ZXIgdGhlbiAxMjguIFRoZSBjb2RlIHdpdGhvdXQgdGhlIHBvd2VyIG9mIDIKLQkJICogb3B0aW1pemF0aW9ucyB3b3VsZCBiZToKLQkJICogKCgocmVnX2lkeCAlIDMyKSArIDMyKSAqIGRjYl9pKSA+PiAoOSAtIHJlZ19pZHggLyAzMikKLQkJICovCi0JCXRjID0gKChyZWdfaWR4ICYgMFgxRikgKyAweDIwKSAqIGRjYl9pOwotCQl0YyA+Pj0gOSAtIChyZWdfaWR4ID4+IDUpOwotCX0KLQotCXJldHVybiB0YzsKLX0KLQogc3RhdGljIHZvaWQgaXhnYmVfdXBkYXRlX3hvZmZfcmVjZWl2ZWQoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKQEAgLTc2NSw3ICs3MTAsNyBAQAogCS8qIGRpc2FybSB0eCBxdWV1ZXMgdGhhdCBoYXZlIHJlY2VpdmVkIHhvZmYgZnJhbWVzICovCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykgewogCQlzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZyA9IGFkYXB0ZXItPnR4X3JpbmdbaV07Ci0JCXUzMiB0YyA9IGl4Z2JlX2RjYl90eHFfdG9fdGMoYWRhcHRlciwgdHhfcmluZy0+cmVnX2lkeCk7CisJCXU4IHRjID0gdHhfcmluZy0+ZGNiX3RjOwogCiAJCWlmICh4b2ZmW3RjXSkKIAkJCWNsZWFyX2JpdChfX0lYR0JFX0hBTkdfQ0hFQ0tfQVJNRUQsICZ0eF9yaW5nLT5zdGF0ZSk7CkBAIC04MjcsMTUgKzc3Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2RlZmluZSBJWEdCRV9NQVhfVFhEX1BXUiAgICAgICAxNAotI2RlZmluZSBJWEdCRV9NQVhfREFUQV9QRVJfVFhEICAoMSA8PCBJWEdCRV9NQVhfVFhEX1BXUikKLQotLyogVHggRGVzY3JpcHRvcnMgbmVlZGVkLCB3b3JzdCBjYXNlICovCi0jZGVmaW5lIFRYRF9VU0VfQ09VTlQoUykgKCgoUykgPj4gSVhHQkVfTUFYX1RYRF9QV1IpICsgXAotCQkJICgoKFMpICYgKElYR0JFX01BWF9EQVRBX1BFUl9UWEQgLSAxKSkgPyAxIDogMCkpCi0jZGVmaW5lIERFU0NfTkVFREVEIChUWERfVVNFX0NPVU5UKElYR0JFX01BWF9EQVRBX1BFUl9UWEQpIC8qIHNrYi0+ZGF0YSAqLyArIFwKLQlNQVhfU0tCX0ZSQUdTICogVFhEX1VTRV9DT1VOVChQQUdFX1NJWkUpICsgMSkgLyogZm9yIGNvbnRleHQgKi8KLQogLyoqCiAgKiBpeGdiZV90eF90aW1lb3V0X3Jlc2V0IC0gaW5pdGlhdGUgcmVzZXQgZHVlIHRvIFR4IHRpbWVvdXQKICAqIEBhZGFwdGVyOiBkcml2ZXIgcHJpdmF0ZSBzdHJ1Y3QKQEAgLTg2OSw3ICs4MDUsNyBAQAogCWVvcF9kZXNjID0gSVhHQkVfVFhfREVTQ19BRFYodHhfcmluZywgZW9wKTsKIAogCXdoaWxlICgoZW9wX2Rlc2MtPndiLnN0YXR1cyAmIGNwdV90b19sZTMyKElYR0JFX1RYRF9TVEFUX0REKSkgJiYKLQkgICAgICAgKGNvdW50IDwgdHhfcmluZy0+d29ya19saW1pdCkpIHsKKwkgICAgICAgKGNvdW50IDwgcV92ZWN0b3ItPnR4LndvcmtfbGltaXQpKSB7CiAJCWJvb2wgY2xlYW5lZCA9IGZhbHNlOwogCQlybWIoKTsgLyogcmVhZCBidWZmZXJfaW5mbyBhZnRlciBlb3BfZGVzYyAqLwogCQlmb3IgKCA7ICFjbGVhbmVkOyBjb3VudCsrKSB7CkBAIC04OTgsMTEgKzgzNCwxMSBAQAogCX0KIAogCXR4X3JpbmctPm5leHRfdG9fY2xlYW4gPSBpOwotCXR4X3JpbmctPnRvdGFsX2J5dGVzICs9IHRvdGFsX2J5dGVzOwotCXR4X3JpbmctPnRvdGFsX3BhY2tldHMgKz0gdG90YWxfcGFja2V0czsKLQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7Ci0JdHhfcmluZy0+c3RhdHMucGFja2V0cyArPSB0b3RhbF9wYWNrZXRzOwogCXR4X3JpbmctPnN0YXRzLmJ5dGVzICs9IHRvdGFsX2J5dGVzOworCXR4X3JpbmctPnN0YXRzLnBhY2tldHMgKz0gdG90YWxfcGFja2V0czsKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJcV92ZWN0b3ItPnR4LnRvdGFsX2J5dGVzICs9IHRvdGFsX2J5dGVzOworCXFfdmVjdG9yLT50eC50b3RhbF9wYWNrZXRzICs9IHRvdGFsX3BhY2tldHM7CiAJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKIAogCWlmIChjaGVja19mb3JfdHhfaGFuZyh0eF9yaW5nKSAmJiBpeGdiZV9jaGVja190eF9oYW5nKHR4X3JpbmcpKSB7CkBAIC05MzgsNyArODc0LDcgQEAKIAogI2RlZmluZSBUWF9XQUtFX1RIUkVTSE9MRCAoREVTQ19ORUVERUQgKiAyKQogCWlmICh1bmxpa2VseShjb3VudCAmJiBuZXRpZl9jYXJyaWVyX29rKHR4X3JpbmctPm5ldGRldikgJiYKLQkJICAgICAoSVhHQkVfREVTQ19VTlVTRUQodHhfcmluZykgPj0gVFhfV0FLRV9USFJFU0hPTEQpKSkgeworCQkgICAgIChpeGdiZV9kZXNjX3VudXNlZCh0eF9yaW5nKSA+PSBUWF9XQUtFX1RIUkVTSE9MRCkpKSB7CiAJCS8qIE1ha2Ugc3VyZSB0aGF0IGFueWJvZHkgc3RvcHBpbmcgdGhlIHF1ZXVlIGFmdGVyIHRoaXMKIAkJICogc2VlcyB0aGUgbmV3IG5leHRfdG9fY2xlYW4uCiAJCSAqLwpAQCAtOTUwLDcgKzg4Niw3IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gY291bnQgPCB0eF9yaW5nLT53b3JrX2xpbWl0OworCXJldHVybiBjb3VudCA8IHFfdmVjdG9yLT50eC53b3JrX2xpbWl0OwogfQogCiAjaWZkZWYgQ09ORklHX0lYR0JFX0RDQQpAQCAtMTAyMywxNyArOTU5LDE3IEBACiAJaWYgKHFfdmVjdG9yLT5jcHUgPT0gY3B1KQogCQlnb3RvIG91dF9ub191cGRhdGU7CiAKLQlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT50eHJfaWR4LCBhZGFwdGVyLT5udW1fdHhfcXVldWVzKTsKLQlmb3IgKGkgPSAwOyBpIDwgcV92ZWN0b3ItPnR4cl9jb3VudDsgaSsrKSB7CisJcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+dHguaWR4LCBhZGFwdGVyLT5udW1fdHhfcXVldWVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgcV92ZWN0b3ItPnR4LmNvdW50OyBpKyspIHsKIAkJaXhnYmVfdXBkYXRlX3R4X2RjYShhZGFwdGVyLCBhZGFwdGVyLT50eF9yaW5nW3JfaWR4XSwgY3B1KTsKLQkJcl9pZHggPSBmaW5kX25leHRfYml0KHFfdmVjdG9yLT50eHJfaWR4LCBhZGFwdGVyLT5udW1fdHhfcXVldWVzLAorCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnR4LmlkeCwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcywKIAkJCQkgICAgICByX2lkeCArIDEpOwogCX0KIAotCXJfaWR4ID0gZmluZF9maXJzdF9iaXQocV92ZWN0b3ItPnJ4cl9pZHgsIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMpOwotCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3Rvci0+cnhyX2NvdW50OyBpKyspIHsKKwlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT5yeC5pZHgsIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMpOworCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3Rvci0+cnguY291bnQ7IGkrKykgewogCQlpeGdiZV91cGRhdGVfcnhfZGNhKGFkYXB0ZXIsIGFkYXB0ZXItPnJ4X3Jpbmdbcl9pZHhdLCBjcHUpOwotCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnJ4cl9pZHgsIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMsCisJCXJfaWR4ID0gZmluZF9uZXh0X2JpdChxX3ZlY3Rvci0+cnguaWR4LCBhZGFwdGVyLT5udW1fcnhfcXVldWVzLAogCQkJCSAgICAgIHJfaWR4ICsgMSk7CiAJfQogCkBAIC0xMTAzLDYgKzEwMzksMjQgQEAKIH0KIAogLyoqCisgKiBpeGdiZV9yeF9pc19mY29lIC0gY2hlY2sgdGhlIHJ4IGRlc2MgZm9yIGluY29taW5nIHBrdCB0eXBlCisgKiBAYWRhcHRlcjogYWRkcmVzcyBvZiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICogQHJ4X2Rlc2M6IGFkdmFuY2VkIHJ4IGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm5zIDogdHJ1ZSBpZiBpdCBpcyBGQ29FIHBrdAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXhnYmVfcnhfaXNfZmNvZShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgdW5pb24gaXhnYmVfYWR2X3J4X2Rlc2MgKnJ4X2Rlc2MpCit7CisJX19sZTE2IHBrdF9pbmZvID0gcnhfZGVzYy0+d2IubG93ZXIubG9fZHdvcmQuaHNfcnNzLnBrdF9pbmZvOworCisJcmV0dXJuIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkNPRV9FTkFCTEVEKSAmJgorCSAgICAgICAoKHBrdF9pbmZvICYgY3B1X3RvX2xlMTYoSVhHQkVfUlhEQURWX1BLVFRZUEVfRVRRRl9NQVNLKSkgPT0KKwkJKGNwdV90b19sZTE2KElYR0JFX0VUUUZfRklMVEVSX0ZDT0UgPDwKKwkJCSAgICAgSVhHQkVfUlhEQURWX1BLVFRZUEVfRVRRRl9TSElGVCkpKTsKK30KKworLyoqCiAgKiBpeGdiZV9yZWNlaXZlX3NrYiAtIFNlbmQgYSBjb21wbGV0ZWQgcGFja2V0IHVwIHRoZSBzdGFjawogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKiBAc2tiOiBwYWNrZXQgdG8gc2VuZCB1cApAQCAtMTEzNCwxNCArMTA4OCwxNCBAQAogICogQGFkYXB0ZXI6IGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqIEBzdGF0dXNfZXJyOiBoYXJkd2FyZSBpbmRpY2F0aW9uIG9mIHN0YXR1cyBvZiByZWNlaXZlCiAgKiBAc2tiOiBza2IgY3VycmVudGx5IGJlaW5nIHJlY2VpdmVkIGFuZCBtb2RpZmllZAorICogQHN0YXR1c19lcnI6IHN0YXR1cyBlcnJvciB2YWx1ZSBvZiBsYXN0IGRlc2NyaXB0b3IgaW4gcGFja2V0CiAgKiovCiBzdGF0aWMgaW5saW5lIHZvaWQgaXhnYmVfcnhfY2hlY2tzdW0oc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkJICAgICB1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqcnhfZGVzYywKLQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgdTMyIHN0YXR1c19lcnIpCiB7Ci0JdTMyIHN0YXR1c19lcnIgPSBsZTMyX3RvX2NwdShyeF9kZXNjLT53Yi51cHBlci5zdGF0dXNfZXJyb3IpOwotCi0Jc2tiX2NoZWNrc3VtX25vbmVfYXNzZXJ0KHNrYik7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCiAJLyogUnggY3N1bSBkaXNhYmxlZCAqLwogCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SWF9DU1VNX0VOQUJMRUQpKQpAQCAtMTQ4NSwxNCArMTQzOSwxMiBAQAogCQl9CiAKIAkJLyogRVJSX01BU0sgd2lsbCBvbmx5IGhhdmUgdmFsaWQgYml0cyBpZiBFT1Agc2V0ICovCi0JCWlmIChzdGF0ZXJyICYgSVhHQkVfUlhEQURWX0VSUl9GUkFNRV9FUlJfTUFTSykgewotCQkJLyogdHJpbSBwYWNrZXQgYmFjayB0byBzaXplIDAgYW5kIHJlY3ljbGUgaXQgKi8KLQkJCV9fcHNrYl90cmltKHNrYiwgMCk7Ci0JCQlyeF9idWZmZXJfaW5mby0+c2tiID0gc2tiOworCQlpZiAodW5saWtlbHkoc3RhdGVyciAmIElYR0JFX1JYREFEVl9FUlJfRlJBTUVfRVJSX01BU0spKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJZ290byBuZXh0X2Rlc2M7CiAJCX0KIAotCQlpeGdiZV9yeF9jaGVja3N1bShhZGFwdGVyLCByeF9kZXNjLCBza2IpOworCQlpeGdiZV9yeF9jaGVja3N1bShhZGFwdGVyLCByeF9kZXNjLCBza2IsIHN0YXRlcnIpOwogCQlpZiAoYWRhcHRlci0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhIQVNIKQogCQkJaXhnYmVfcnhfaGFzaChyeF9kZXNjLCBza2IpOwogCkBAIC0xNTAzLDggKzE0NTUsOSBAQAogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCByeF9yaW5nLT5uZXRkZXYpOwogI2lmZGVmIElYR0JFX0ZDT0UKIAkJLyogaWYgZGRwLCBub3QgcGFzc2luZyB0byBVTEQgdW5sZXNzIGZvciBGQ1BfUlNQIG9yIGVycm9yICovCi0JCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkNPRV9FTkFCTEVEKSB7Ci0JCQlkZHBfYnl0ZXMgPSBpeGdiZV9mY29lX2RkcChhZGFwdGVyLCByeF9kZXNjLCBza2IpOworCQlpZiAoaXhnYmVfcnhfaXNfZmNvZShhZGFwdGVyLCByeF9kZXNjKSkgeworCQkJZGRwX2J5dGVzID0gaXhnYmVfZmNvZV9kZHAoYWRhcHRlciwgcnhfZGVzYywgc2tiLAorCQkJCQkJICAgc3RhdGVycik7CiAJCQlpZiAoIWRkcF9ieXRlcykKIAkJCQlnb3RvIG5leHRfZGVzYzsKIAkJfQpAQCAtMTUzMCw3ICsxNDgzLDcgQEAKIAl9CiAKIAlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gaTsKLQljbGVhbmVkX2NvdW50ID0gSVhHQkVfREVTQ19VTlVTRUQocnhfcmluZyk7CisJY2xlYW5lZF9jb3VudCA9IGl4Z2JlX2Rlc2NfdW51c2VkKHJ4X3JpbmcpOwogCiAJaWYgKGNsZWFuZWRfY291bnQpCiAJCWl4Z2JlX2FsbG9jX3J4X2J1ZmZlcnMocnhfcmluZywgY2xlYW5lZF9jb3VudCk7CkBAIC0xNTUwLDEyICsxNTAzLDEyIEBACiAJfQogI2VuZGlmIC8qIElYR0JFX0ZDT0UgKi8KIAotCXJ4X3JpbmctPnRvdGFsX3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKLQlyeF9yaW5nLT50b3RhbF9ieXRlcyArPSB0b3RhbF9yeF9ieXRlczsKIAl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CiAJcnhfcmluZy0+c3RhdHMucGFja2V0cyArPSB0b3RhbF9yeF9wYWNrZXRzOwogCXJ4X3JpbmctPnN0YXRzLmJ5dGVzICs9IHRvdGFsX3J4X2J5dGVzOwogCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisJcV92ZWN0b3ItPnJ4LnRvdGFsX3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKKwlxX3ZlY3Rvci0+cngudG90YWxfYnl0ZXMgKz0gdG90YWxfcnhfYnl0ZXM7CiB9CiAKIHN0YXRpYyBpbnQgaXhnYmVfY2xlYW5fcnhvbmx5KHN0cnVjdCBuYXBpX3N0cnVjdCAqLCBpbnQpOwpAQCAtMTU4MSwzOCArMTUzNCwzNyBAQAogCWZvciAodl9pZHggPSAwOyB2X2lkeCA8IHFfdmVjdG9yczsgdl9pZHgrKykgewogCQlxX3ZlY3RvciA9IGFkYXB0ZXItPnFfdmVjdG9yW3ZfaWR4XTsKIAkJLyogWFhYIGZvcl9lYWNoX3NldF9iaXQoLi4uKSAqLwotCQlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT5yeHJfaWR4LAorCQlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT5yeC5pZHgsCiAJCQkJICAgICAgIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3Rvci0+cnhyX2NvdW50OyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yLT5yeC5jb3VudDsgaSsrKSB7CiAJCQl1OCByZWdfaWR4ID0gYWRhcHRlci0+cnhfcmluZ1tyX2lkeF0tPnJlZ19pZHg7CiAJCQlpeGdiZV9zZXRfaXZhcihhZGFwdGVyLCAwLCByZWdfaWR4LCB2X2lkeCk7Ci0JCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnJ4cl9pZHgsCisJCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnJ4LmlkeCwKIAkJCQkJICAgICAgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcywKIAkJCQkJICAgICAgcl9pZHggKyAxKTsKIAkJfQotCQlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT50eHJfaWR4LAorCQlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT50eC5pZHgsCiAJCQkJICAgICAgIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3Rvci0+dHhyX2NvdW50OyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yLT50eC5jb3VudDsgaSsrKSB7CiAJCQl1OCByZWdfaWR4ID0gYWRhcHRlci0+dHhfcmluZ1tyX2lkeF0tPnJlZ19pZHg7CiAJCQlpeGdiZV9zZXRfaXZhcihhZGFwdGVyLCAxLCByZWdfaWR4LCB2X2lkeCk7Ci0JCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnR4cl9pZHgsCisJCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnR4LmlkeCwKIAkJCQkJICAgICAgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcywKIAkJCQkJICAgICAgcl9pZHggKyAxKTsKIAkJfQogCi0JCWlmIChxX3ZlY3Rvci0+dHhyX2NvdW50ICYmICFxX3ZlY3Rvci0+cnhyX2NvdW50KQorCQlpZiAocV92ZWN0b3ItPnR4LmNvdW50ICYmICFxX3ZlY3Rvci0+cnguY291bnQpCiAJCQkvKiB0eCBvbmx5ICovCiAJCQlxX3ZlY3Rvci0+ZWl0ciA9IGFkYXB0ZXItPnR4X2VpdHJfcGFyYW07Ci0JCWVsc2UgaWYgKHFfdmVjdG9yLT5yeHJfY291bnQpCisJCWVsc2UgaWYgKHFfdmVjdG9yLT5yeC5jb3VudCkKIAkJCS8qIHJ4IG9yIG1peGVkICovCiAJCQlxX3ZlY3Rvci0+ZWl0ciA9IGFkYXB0ZXItPnJ4X2VpdHJfcGFyYW07CiAKIAkJaXhnYmVfd3JpdGVfZWl0cihxX3ZlY3Rvcik7Ci0JCS8qIElmIEZsb3cgRGlyZWN0b3IgaXMgZW5hYmxlZCwgc2V0IGludGVycnVwdCBhZmZpbml0eSAqLwotCQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRSkgfHwKLQkJICAgIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkRJUl9QRVJGRUNUX0NBUEFCTEUpKSB7CisJCS8qIElmIEFUUiBpcyBlbmFibGVkLCBzZXQgaW50ZXJydXB0IGFmZmluaXR5ICovCisJCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkRJUl9IQVNIX0NBUEFCTEUpIHsKIAkJCS8qCiAJCQkgKiBBbGxvY2F0ZSB0aGUgYWZmaW5pdHlfaGludCBjcHVtYXNrLCBhc3NpZ24gdGhlIG1hc2sKIAkJCSAqIGZvciB0aGlzIHZlY3RvciwgYW5kIHNldCBvdXIgYWZmaW5pdHlfaGludCBmb3IKQEAgLTE2NjIsMTEgKzE2MTQsOCBAQAogCiAvKioKICAqIGl4Z2JlX3VwZGF0ZV9pdHIgLSB1cGRhdGUgdGhlIGR5bmFtaWMgSVRSIHZhbHVlIGJhc2VkIG9uIHN0YXRpc3RpY3MKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIGFkYXB0ZXIKLSAqIEBlaXRyOiBlaXRyIHNldHRpbmcgKGludHMgcGVyIHNlYykgdG8gZ2l2ZSBsYXN0IHRpbWVzbGljZQotICogQGl0cl9zZXR0aW5nOiBjdXJyZW50IHRocm90dGxlIHJhdGUgaW4gaW50cy9zZWNvbmQKLSAqIEBwYWNrZXRzOiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgZHVyaW5nIHRoaXMgbWVhc3VyZW1lbnQgaW50ZXJ2YWwKLSAqIEBieXRlczogdGhlIG51bWJlciBvZiBieXRlcyBkdXJpbmcgdGhpcyBtZWFzdXJlbWVudCBpbnRlcnZhbAorICogQHFfdmVjdG9yOiBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbnRlcnJ1cHQgYW5kIHJpbmcgaW5mb3JtYXRpb24KKyAqIEByaW5nX2NvbnRhaW5lcjogc3RydWN0dXJlIGNvbnRhaW5pbmcgcmluZyBwZXJmb3JtYW5jZSBkYXRhCiAgKgogICogICAgICBTdG9yZXMgYSBuZXcgSVRSIHZhbHVlIGJhc2VkIG9uIHBhY2tldHMgYW5kIGJ5dGUKICAqICAgICAgY291bnRzIGR1cmluZyB0aGUgbGFzdCBpbnRlcnJ1cHQuICBUaGUgYWR2YW50YWdlIG9mIHBlciBpbnRlcnJ1cHQKQEAgLTE2NzgsMTcgKzE2MjcsMTggQEAKICAqICAgICAgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGNvbnRyb2xsZWQgYnkgdGhlIEludGVycnVwdFRocm90dGxlUmF0ZSBtb2R1bGUKICAqICAgICAgcGFyYW1ldGVyIChzZWUgaXhnYmVfcGFyYW0uYykKICAqKi8KLXN0YXRpYyB1OCBpeGdiZV91cGRhdGVfaXRyKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJICAgdTMyIGVpdHIsIHU4IGl0cl9zZXR0aW5nLAotCQkJICAgaW50IHBhY2tldHMsIGludCBieXRlcykKK3N0YXRpYyB2b2lkIGl4Z2JlX3VwZGF0ZV9pdHIoc3RydWN0IGl4Z2JlX3FfdmVjdG9yICpxX3ZlY3RvciwKKwkJCSAgICAgc3RydWN0IGl4Z2JlX3JpbmdfY29udGFpbmVyICpyaW5nX2NvbnRhaW5lcikKIHsKLQl1bnNpZ25lZCBpbnQgcmV0dmFsID0gaXRyX3NldHRpbmc7Ci0JdTMyIHRpbWVwYXNzZWRfdXM7CiAJdTY0IGJ5dGVzX3BlcmludDsKKwlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IHFfdmVjdG9yLT5hZGFwdGVyOworCWludCBieXRlcyA9IHJpbmdfY29udGFpbmVyLT50b3RhbF9ieXRlczsKKwlpbnQgcGFja2V0cyA9IHJpbmdfY29udGFpbmVyLT50b3RhbF9wYWNrZXRzOworCXUzMiB0aW1lcGFzc2VkX3VzOworCXU4IGl0cl9zZXR0aW5nID0gcmluZ19jb250YWluZXItPml0cjsKIAogCWlmIChwYWNrZXRzID09IDApCi0JCWdvdG8gdXBkYXRlX2l0cl9kb25lOwotCisJCXJldHVybjsKIAogCS8qIHNpbXBsZSB0aHJvdHRsZXJhdGUgbWFuYWdlbWVudAogCSAqICAgIDAtMjBNQi9zIGxvd2VzdCAoMTAwMDAwIGludHMvcykKQEAgLTE2OTYsMjggKzE2NDYsMzIgQEAKIAkgKiAgMTAwLTEyNDlNQi9zIGJ1bGsgKDgwMDAgaW50cy9zKQogCSAqLwogCS8qIHdoYXQgd2FzIGxhc3QgaW50ZXJydXB0IHRpbWVzbGljZT8gKi8KLQl0aW1lcGFzc2VkX3VzID0gMTAwMDAwMC9laXRyOworCXRpbWVwYXNzZWRfdXMgPSAxMDAwMDAwL3FfdmVjdG9yLT5laXRyOwogCWJ5dGVzX3BlcmludCA9IGJ5dGVzIC8gdGltZXBhc3NlZF91czsgLyogYnl0ZXMvdXNlYyAqLwogCiAJc3dpdGNoIChpdHJfc2V0dGluZykgewogCWNhc2UgbG93ZXN0X2xhdGVuY3k6CiAJCWlmIChieXRlc19wZXJpbnQgPiBhZGFwdGVyLT5laXRyX2xvdykKLQkJCXJldHZhbCA9IGxvd19sYXRlbmN5OworCQkJaXRyX3NldHRpbmcgPSBsb3dfbGF0ZW5jeTsKIAkJYnJlYWs7CiAJY2FzZSBsb3dfbGF0ZW5jeToKIAkJaWYgKGJ5dGVzX3BlcmludCA+IGFkYXB0ZXItPmVpdHJfaGlnaCkKLQkJCXJldHZhbCA9IGJ1bGtfbGF0ZW5jeTsKKwkJCWl0cl9zZXR0aW5nID0gYnVsa19sYXRlbmN5OwogCQllbHNlIGlmIChieXRlc19wZXJpbnQgPD0gYWRhcHRlci0+ZWl0cl9sb3cpCi0JCQlyZXR2YWwgPSBsb3dlc3RfbGF0ZW5jeTsKKwkJCWl0cl9zZXR0aW5nID0gbG93ZXN0X2xhdGVuY3k7CiAJCWJyZWFrOwogCWNhc2UgYnVsa19sYXRlbmN5OgogCQlpZiAoYnl0ZXNfcGVyaW50IDw9IGFkYXB0ZXItPmVpdHJfaGlnaCkKLQkJCXJldHZhbCA9IGxvd19sYXRlbmN5OworCQkJaXRyX3NldHRpbmcgPSBsb3dfbGF0ZW5jeTsKIAkJYnJlYWs7CiAJfQogCi11cGRhdGVfaXRyX2RvbmU6Ci0JcmV0dXJuIHJldHZhbDsKKwkvKiBjbGVhciB3b3JrIGNvdW50ZXJzIHNpbmNlIHdlIGhhdmUgdGhlIHZhbHVlcyB3ZSBuZWVkICovCisJcmluZ19jb250YWluZXItPnRvdGFsX2J5dGVzID0gMDsKKwlyaW5nX2NvbnRhaW5lci0+dG90YWxfcGFja2V0cyA9IDA7CisKKwkvKiB3cml0ZSB1cGRhdGVkIGl0ciB0byByaW5nIGNvbnRhaW5lciAqLworCXJpbmdfY29udGFpbmVyLT5pdHIgPSBpdHJfc2V0dGluZzsKIH0KIAogLyoqCkBAIC0xNzYzLDQ0ICsxNzE3LDE1IEBACiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9FSVRSKHZfaWR4KSwgaXRyX3JlZyk7CiB9CiAKLXN0YXRpYyB2b2lkIGl4Z2JlX3NldF9pdHJfbXNpeChzdHJ1Y3QgaXhnYmVfcV92ZWN0b3IgKnFfdmVjdG9yKQorc3RhdGljIHZvaWQgaXhnYmVfc2V0X2l0cihzdHJ1Y3QgaXhnYmVfcV92ZWN0b3IgKnFfdmVjdG9yKQogewotCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gcV92ZWN0b3ItPmFkYXB0ZXI7Ci0JaW50IGksIHJfaWR4OwotCXUzMiBuZXdfaXRyOwotCXU4IGN1cnJlbnRfaXRyLCByZXRfaXRyOworCXUzMiBuZXdfaXRyID0gcV92ZWN0b3ItPmVpdHI7CisJdTggY3VycmVudF9pdHI7CiAKLQlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT50eHJfaWR4LCBhZGFwdGVyLT5udW1fdHhfcXVldWVzKTsKLQlmb3IgKGkgPSAwOyBpIDwgcV92ZWN0b3ItPnR4cl9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nID0gYWRhcHRlci0+dHhfcmluZ1tyX2lkeF07Ci0JCXJldF9pdHIgPSBpeGdiZV91cGRhdGVfaXRyKGFkYXB0ZXIsIHFfdmVjdG9yLT5laXRyLAotCQkJCQkgICBxX3ZlY3Rvci0+dHhfaXRyLAotCQkJCQkgICB0eF9yaW5nLT50b3RhbF9wYWNrZXRzLAotCQkJCQkgICB0eF9yaW5nLT50b3RhbF9ieXRlcyk7Ci0JCS8qIGlmIHRoZSByZXN1bHQgZm9yIHRoaXMgcXVldWUgd291bGQgZGVjcmVhc2UgaW50ZXJydXB0Ci0JCSAqIHJhdGUgZm9yIHRoaXMgdmVjdG9yIHRoZW4gdXNlIHRoYXQgcmVzdWx0ICovCi0JCXFfdmVjdG9yLT50eF9pdHIgPSAoKHFfdmVjdG9yLT50eF9pdHIgPiByZXRfaXRyKSA/Ci0JCQkJICAgIHFfdmVjdG9yLT50eF9pdHIgLSAxIDogcmV0X2l0cik7Ci0JCXJfaWR4ID0gZmluZF9uZXh0X2JpdChxX3ZlY3Rvci0+dHhyX2lkeCwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcywKLQkJCQkgICAgICByX2lkeCArIDEpOwotCX0KKwlpeGdiZV91cGRhdGVfaXRyKHFfdmVjdG9yLCAmcV92ZWN0b3ItPnR4KTsKKwlpeGdiZV91cGRhdGVfaXRyKHFfdmVjdG9yLCAmcV92ZWN0b3ItPnJ4KTsKIAotCXJfaWR4ID0gZmluZF9maXJzdF9iaXQocV92ZWN0b3ItPnJ4cl9pZHgsIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMpOwotCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3Rvci0+cnhyX2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGl4Z2JlX3JpbmcgKnJ4X3JpbmcgPSBhZGFwdGVyLT5yeF9yaW5nW3JfaWR4XTsKLQkJcmV0X2l0ciA9IGl4Z2JlX3VwZGF0ZV9pdHIoYWRhcHRlciwgcV92ZWN0b3ItPmVpdHIsCi0JCQkJCSAgIHFfdmVjdG9yLT5yeF9pdHIsCi0JCQkJCSAgIHJ4X3JpbmctPnRvdGFsX3BhY2tldHMsCi0JCQkJCSAgIHJ4X3JpbmctPnRvdGFsX2J5dGVzKTsKLQkJLyogaWYgdGhlIHJlc3VsdCBmb3IgdGhpcyBxdWV1ZSB3b3VsZCBkZWNyZWFzZSBpbnRlcnJ1cHQKLQkJICogcmF0ZSBmb3IgdGhpcyB2ZWN0b3IgdGhlbiB1c2UgdGhhdCByZXN1bHQgKi8KLQkJcV92ZWN0b3ItPnJ4X2l0ciA9ICgocV92ZWN0b3ItPnJ4X2l0ciA+IHJldF9pdHIpID8KLQkJCQkgICAgcV92ZWN0b3ItPnJ4X2l0ciAtIDEgOiByZXRfaXRyKTsKLQkJcl9pZHggPSBmaW5kX25leHRfYml0KHFfdmVjdG9yLT5yeHJfaWR4LCBhZGFwdGVyLT5udW1fcnhfcXVldWVzLAotCQkJCSAgICAgIHJfaWR4ICsgMSk7Ci0JfQotCi0JY3VycmVudF9pdHIgPSBtYXgocV92ZWN0b3ItPnJ4X2l0ciwgcV92ZWN0b3ItPnR4X2l0cik7CisJY3VycmVudF9pdHIgPSBtYXgocV92ZWN0b3ItPnJ4Lml0ciwgcV92ZWN0b3ItPnR4Lml0cik7CiAKIAlzd2l0Y2ggKGN1cnJlbnRfaXRyKSB7CiAJLyogY291bnRzIGFuZCBwYWNrZXRzIGluIHVwZGF0ZV9pdHIgYXJlIGRlcGVuZGVudCBvbiB0aGVzZSBudW1iZXJzICovCkBAIC0xODExLDE2ICsxNzM2LDE3IEBACiAJCW5ld19pdHIgPSAyMDAwMDsgLyogYWthIGh3aXRyID0gfjIwMCAqLwogCQlicmVhazsKIAljYXNlIGJ1bGtfbGF0ZW5jeToKLQlkZWZhdWx0OgogCQluZXdfaXRyID0gODAwMDsKIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCiAJaWYgKG5ld19pdHIgIT0gcV92ZWN0b3ItPmVpdHIpIHsKIAkJLyogZG8gYW4gZXhwb25lbnRpYWwgc21vb3RoaW5nICovCiAJCW5ld19pdHIgPSAoKHFfdmVjdG9yLT5laXRyICogOSkgKyBuZXdfaXRyKS8xMDsKIAotCQkvKiBzYXZlIHRoZSBhbGdvcml0aG0gdmFsdWUgaGVyZSwgbm90IHRoZSBzbW9vdGhlZCBvbmUgKi8KKwkJLyogc2F2ZSB0aGUgYWxnb3JpdGhtIHZhbHVlIGhlcmUgKi8KIAkJcV92ZWN0b3ItPmVpdHIgPSBuZXdfaXRyOwogCiAJCWl4Z2JlX3dyaXRlX2VpdHIocV92ZWN0b3IpOwpAQCAtMTkzNyw4ICsxODYzLDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IGl4Z2JlX21zaXhfbHNjKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRhdGE7Ci0Jc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gZGF0YTsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiBlaWNyOwogCkBAIC0yMDYxLDE1ICsxOTg2LDEzIEBACiAJc3RydWN0IGl4Z2JlX3JpbmcgICAgICp0eF9yaW5nOwogCWludCBpLCByX2lkeDsKIAotCWlmICghcV92ZWN0b3ItPnR4cl9jb3VudCkKKwlpZiAoIXFfdmVjdG9yLT50eC5jb3VudCkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCi0Jcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+dHhyX2lkeCwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyk7Ci0JZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yLT50eHJfY291bnQ7IGkrKykgeworCXJfaWR4ID0gZmluZF9maXJzdF9iaXQocV92ZWN0b3ItPnR4LmlkeCwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyk7CisJZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yLT50eC5jb3VudDsgaSsrKSB7CiAJCXR4X3JpbmcgPSBhZGFwdGVyLT50eF9yaW5nW3JfaWR4XTsKLQkJdHhfcmluZy0+dG90YWxfYnl0ZXMgPSAwOwotCQl0eF9yaW5nLT50b3RhbF9wYWNrZXRzID0gMDsKLQkJcl9pZHggPSBmaW5kX25leHRfYml0KHFfdmVjdG9yLT50eHJfaWR4LCBhZGFwdGVyLT5udW1fdHhfcXVldWVzLAorCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnR4LmlkeCwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcywKIAkJCQkgICAgICByX2lkeCArIDEpOwogCX0KIApAQCAtMjA5NywxNiArMjAyMCwxNCBAQAogCQlpeGdiZV91cGRhdGVfZGNhKHFfdmVjdG9yKTsKICNlbmRpZgogCi0Jcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+cnhyX2lkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7Ci0JZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yLT5yeHJfY291bnQ7IGkrKykgeworCXJfaWR4ID0gZmluZF9maXJzdF9iaXQocV92ZWN0b3ItPnJ4LmlkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7CisJZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yLT5yeC5jb3VudDsgaSsrKSB7CiAJCXJ4X3JpbmcgPSBhZGFwdGVyLT5yeF9yaW5nW3JfaWR4XTsKLQkJcnhfcmluZy0+dG90YWxfYnl0ZXMgPSAwOwotCQlyeF9yaW5nLT50b3RhbF9wYWNrZXRzID0gMDsKLQkJcl9pZHggPSBmaW5kX25leHRfYml0KHFfdmVjdG9yLT5yeHJfaWR4LCBhZGFwdGVyLT5udW1fcnhfcXVldWVzLAorCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnJ4LmlkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcywKIAkJCQkgICAgICByX2lkeCArIDEpOwogCX0KIAotCWlmICghcV92ZWN0b3ItPnJ4cl9jb3VudCkKKwlpZiAoIXFfdmVjdG9yLT5yeC5jb3VudCkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCiAJLyogRUlBTSBkaXNhYmxlZCBpbnRlcnJ1cHRzIChvbiB0aGlzIHZlY3RvcikgZm9yIHVzICovCkBAIC0yMTIzLDI0ICsyMDQ0LDIwIEBACiAJaW50IHJfaWR4OwogCWludCBpOwogCi0JaWYgKCFxX3ZlY3Rvci0+dHhyX2NvdW50ICYmICFxX3ZlY3Rvci0+cnhyX2NvdW50KQorCWlmICghcV92ZWN0b3ItPnR4LmNvdW50ICYmICFxX3ZlY3Rvci0+cnguY291bnQpCiAJCXJldHVybiBJUlFfSEFORExFRDsKIAotCXJfaWR4ID0gZmluZF9maXJzdF9iaXQocV92ZWN0b3ItPnR4cl9pZHgsIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMpOwotCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3Rvci0+dHhyX2NvdW50OyBpKyspIHsKKwlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT50eC5pZHgsIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMpOworCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3Rvci0+dHguY291bnQ7IGkrKykgewogCQlyaW5nID0gYWRhcHRlci0+dHhfcmluZ1tyX2lkeF07Ci0JCXJpbmctPnRvdGFsX2J5dGVzID0gMDsKLQkJcmluZy0+dG90YWxfcGFja2V0cyA9IDA7Ci0JCXJfaWR4ID0gZmluZF9uZXh0X2JpdChxX3ZlY3Rvci0+dHhyX2lkeCwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcywKKwkJcl9pZHggPSBmaW5kX25leHRfYml0KHFfdmVjdG9yLT50eC5pZHgsIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMsCiAJCQkJICAgICAgcl9pZHggKyAxKTsKIAl9CiAKLQlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT5yeHJfaWR4LCBhZGFwdGVyLT5udW1fcnhfcXVldWVzKTsKLQlmb3IgKGkgPSAwOyBpIDwgcV92ZWN0b3ItPnJ4cl9jb3VudDsgaSsrKSB7CisJcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+cnguaWR4LCBhZGFwdGVyLT5udW1fcnhfcXVldWVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgcV92ZWN0b3ItPnJ4LmNvdW50OyBpKyspIHsKIAkJcmluZyA9IGFkYXB0ZXItPnJ4X3Jpbmdbcl9pZHhdOwotCQlyaW5nLT50b3RhbF9ieXRlcyA9IDA7Ci0JCXJpbmctPnRvdGFsX3BhY2tldHMgPSAwOwotCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnJ4cl9pZHgsIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMsCisJCXJfaWR4ID0gZmluZF9uZXh0X2JpdChxX3ZlY3Rvci0+cnguaWR4LCBhZGFwdGVyLT5udW1fcnhfcXVldWVzLAogCQkJCSAgICAgIHJfaWR4ICsgMSk7CiAJfQogCkBAIC0yMTcyLDcgKzIwODksNyBAQAogCQlpeGdiZV91cGRhdGVfZGNhKHFfdmVjdG9yKTsKICNlbmRpZgogCi0Jcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+cnhyX2lkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7CisJcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+cnguaWR4LCBhZGFwdGVyLT5udW1fcnhfcXVldWVzKTsKIAlyeF9yaW5nID0gYWRhcHRlci0+cnhfcmluZ1tyX2lkeF07CiAKIAlpeGdiZV9jbGVhbl9yeF9pcnEocV92ZWN0b3IsIHJ4X3JpbmcsICZ3b3JrX2RvbmUsIGJ1ZGdldCk7CkBAIC0yMTgxLDcgKzIwOTgsNyBAQAogCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKIAkJaWYgKGFkYXB0ZXItPnJ4X2l0cl9zZXR0aW5nICYgMSkKLQkJCWl4Z2JlX3NldF9pdHJfbXNpeChxX3ZlY3Rvcik7CisJCQlpeGdiZV9zZXRfaXRyKHFfdmVjdG9yKTsKIAkJaWYgKCF0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpCiAJCQlpeGdiZV9pcnFfZW5hYmxlX3F1ZXVlcyhhZGFwdGVyLAogCQkJCQkJKCh1NjQpMSA8PCBxX3ZlY3Rvci0+dl9pZHgpKTsKQEAgLTIyMTMsMzMgKzIxMzAsMzMgQEAKIAkJaXhnYmVfdXBkYXRlX2RjYShxX3ZlY3Rvcik7CiAjZW5kaWYKIAotCXJfaWR4ID0gZmluZF9maXJzdF9iaXQocV92ZWN0b3ItPnR4cl9pZHgsIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMpOwotCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3Rvci0+dHhyX2NvdW50OyBpKyspIHsKKwlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT50eC5pZHgsIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMpOworCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3Rvci0+dHguY291bnQ7IGkrKykgewogCQlyaW5nID0gYWRhcHRlci0+dHhfcmluZ1tyX2lkeF07CiAJCXR4X2NsZWFuX2NvbXBsZXRlICY9IGl4Z2JlX2NsZWFuX3R4X2lycShxX3ZlY3RvciwgcmluZyk7Ci0JCXJfaWR4ID0gZmluZF9uZXh0X2JpdChxX3ZlY3Rvci0+dHhyX2lkeCwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcywKKwkJcl9pZHggPSBmaW5kX25leHRfYml0KHFfdmVjdG9yLT50eC5pZHgsIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMsCiAJCQkJICAgICAgcl9pZHggKyAxKTsKIAl9CiAKIAkvKiBhdHRlbXB0IHRvIGRpc3RyaWJ1dGUgYnVkZ2V0IHRvIGVhY2ggcXVldWUgZmFpcmx5LCBidXQgZG9uJ3QgYWxsb3cKIAkgKiB0aGUgYnVkZ2V0IHRvIGdvIGJlbG93IDEgYmVjYXVzZSB3ZSdsbCBleGl0IHBvbGxpbmcgKi8KLQlidWRnZXQgLz0gKHFfdmVjdG9yLT5yeHJfY291bnQgPzogMSk7CisJYnVkZ2V0IC89IChxX3ZlY3Rvci0+cnguY291bnQgPzogMSk7CiAJYnVkZ2V0ID0gbWF4KGJ1ZGdldCwgMSk7Ci0Jcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+cnhyX2lkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7Ci0JZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yLT5yeHJfY291bnQ7IGkrKykgeworCXJfaWR4ID0gZmluZF9maXJzdF9iaXQocV92ZWN0b3ItPnJ4LmlkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7CisJZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yLT5yeC5jb3VudDsgaSsrKSB7CiAJCXJpbmcgPSBhZGFwdGVyLT5yeF9yaW5nW3JfaWR4XTsKIAkJaXhnYmVfY2xlYW5fcnhfaXJxKHFfdmVjdG9yLCByaW5nLCAmd29ya19kb25lLCBidWRnZXQpOwotCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnJ4cl9pZHgsIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMsCisJCXJfaWR4ID0gZmluZF9uZXh0X2JpdChxX3ZlY3Rvci0+cnguaWR4LCBhZGFwdGVyLT5udW1fcnhfcXVldWVzLAogCQkJCSAgICAgIHJfaWR4ICsgMSk7CiAJfQogCi0Jcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+cnhyX2lkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7CisJcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+cnguaWR4LCBhZGFwdGVyLT5udW1fcnhfcXVldWVzKTsKIAlyaW5nID0gYWRhcHRlci0+cnhfcmluZ1tyX2lkeF07CiAJLyogSWYgYWxsIFJ4IHdvcmsgZG9uZSwgZXhpdCB0aGUgcG9sbGluZyBtb2RlICovCiAJaWYgKHdvcmtfZG9uZSA8IGJ1ZGdldCkgewogCQluYXBpX2NvbXBsZXRlKG5hcGkpOwogCQlpZiAoYWRhcHRlci0+cnhfaXRyX3NldHRpbmcgJiAxKQotCQkJaXhnYmVfc2V0X2l0cl9tc2l4KHFfdmVjdG9yKTsKKwkJCWl4Z2JlX3NldF9pdHIocV92ZWN0b3IpOwogCQlpZiAoIXRlc3RfYml0KF9fSVhHQkVfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJCWl4Z2JlX2lycV9lbmFibGVfcXVldWVzKGFkYXB0ZXIsCiAJCQkJCQkoKHU2NCkxIDw8IHFfdmVjdG9yLT52X2lkeCkpOwpAQCAtMjI3MSw3ICsyMTg4LDcgQEAKIAkJaXhnYmVfdXBkYXRlX2RjYShxX3ZlY3Rvcik7CiAjZW5kaWYKIAotCXJfaWR4ID0gZmluZF9maXJzdF9iaXQocV92ZWN0b3ItPnR4cl9pZHgsIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMpOworCXJfaWR4ID0gZmluZF9maXJzdF9iaXQocV92ZWN0b3ItPnR4LmlkeCwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyk7CiAJdHhfcmluZyA9IGFkYXB0ZXItPnR4X3Jpbmdbcl9pZHhdOwogCiAJaWYgKCFpeGdiZV9jbGVhbl90eF9pcnEocV92ZWN0b3IsIHR4X3JpbmcpKQpAQCAtMjI4MSw3ICsyMTk4LDcgQEAKIAlpZiAod29ya19kb25lIDwgYnVkZ2V0KSB7CiAJCW5hcGlfY29tcGxldGUobmFwaSk7CiAJCWlmIChhZGFwdGVyLT50eF9pdHJfc2V0dGluZyAmIDEpCi0JCQlpeGdiZV9zZXRfaXRyX21zaXgocV92ZWN0b3IpOworCQkJaXhnYmVfc2V0X2l0cihxX3ZlY3Rvcik7CiAJCWlmICghdGVzdF9iaXQoX19JWEdCRV9ET1dOLCAmYWRhcHRlci0+c3RhdGUpKQogCQkJaXhnYmVfaXJxX2VuYWJsZV9xdWV1ZXMoYWRhcHRlciwKIAkJCQkJCSgodTY0KTEgPDwgcV92ZWN0b3ItPnZfaWR4KSk7CkBAIC0yMjk2LDggKzIyMTMsOCBAQAogCXN0cnVjdCBpeGdiZV9xX3ZlY3RvciAqcV92ZWN0b3IgPSBhLT5xX3ZlY3Rvclt2X2lkeF07CiAJc3RydWN0IGl4Z2JlX3JpbmcgKnJ4X3JpbmcgPSBhLT5yeF9yaW5nW3JfaWR4XTsKIAotCXNldF9iaXQocl9pZHgsIHFfdmVjdG9yLT5yeHJfaWR4KTsKLQlxX3ZlY3Rvci0+cnhyX2NvdW50Kys7CisJc2V0X2JpdChyX2lkeCwgcV92ZWN0b3ItPnJ4LmlkeCk7CisJcV92ZWN0b3ItPnJ4LmNvdW50Kys7CiAJcnhfcmluZy0+cV92ZWN0b3IgPSBxX3ZlY3RvcjsKIH0KIApAQCAtMjMwNyw5ICsyMjI0LDEwIEBACiAJc3RydWN0IGl4Z2JlX3FfdmVjdG9yICpxX3ZlY3RvciA9IGEtPnFfdmVjdG9yW3ZfaWR4XTsKIAlzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZyA9IGEtPnR4X3JpbmdbdF9pZHhdOwogCi0Jc2V0X2JpdCh0X2lkeCwgcV92ZWN0b3ItPnR4cl9pZHgpOwotCXFfdmVjdG9yLT50eHJfY291bnQrKzsKKwlzZXRfYml0KHRfaWR4LCBxX3ZlY3Rvci0+dHguaWR4KTsKKwlxX3ZlY3Rvci0+dHguY291bnQrKzsKIAl0eF9yaW5nLT5xX3ZlY3RvciA9IHFfdmVjdG9yOworCXFfdmVjdG9yLT50eC53b3JrX2xpbWl0ID0gYS0+dHhfd29ya19saW1pdDsKIH0KIAogLyoqCkBAIC0yMzk4LDEwICsyMzE2LDEwIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotI2RlZmluZSBTRVRfSEFORExFUihfdikgKCgoX3YpLT5yeHJfY291bnQgJiYgKF92KS0+dHhyX2NvdW50KSAgICAgICAgXAorI2RlZmluZSBTRVRfSEFORExFUihfdikgKCgoX3YpLT5yeC5jb3VudCAmJiAoX3YpLT50eC5jb3VudCkgICAgICAgIFwKIAkJCQkJICA/ICZpeGdiZV9tc2l4X2NsZWFuX21hbnkgOiBcCi0JCQkgIChfdiktPnJ4cl9jb3VudCA/ICZpeGdiZV9tc2l4X2NsZWFuX3J4ICAgOiBcCi0JCQkgIChfdiktPnR4cl9jb3VudCA/ICZpeGdiZV9tc2l4X2NsZWFuX3R4ICAgOiBcCisJCQkgIChfdiktPnJ4LmNvdW50ID8gJml4Z2JlX21zaXhfY2xlYW5fcnggICA6IFwKKwkJCSAgKF92KS0+dHguY291bnQgPyAmaXhnYmVfbXNpeF9jbGVhbl90eCAgIDogXAogCQkJICBOVUxMKQogCWZvciAodmVjdG9yID0gMDsgdmVjdG9yIDwgcV92ZWN0b3JzOyB2ZWN0b3IrKykgewogCQlzdHJ1Y3QgaXhnYmVfcV92ZWN0b3IgKnFfdmVjdG9yID0gYWRhcHRlci0+cV92ZWN0b3JbdmVjdG9yXTsKQEAgLTI0MzMsNyArMjM1MSw3IEBACiAKIAlzcHJpbnRmKGFkYXB0ZXItPmxzY19pbnRfbmFtZSwgIiVzOmxzYyIsIG5ldGRldi0+bmFtZSk7CiAJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+bXNpeF9lbnRyaWVzW3ZlY3Rvcl0udmVjdG9yLAotCQkJICBpeGdiZV9tc2l4X2xzYywgMCwgYWRhcHRlci0+bHNjX2ludF9uYW1lLCBuZXRkZXYpOworCQkJICBpeGdiZV9tc2l4X2xzYywgMCwgYWRhcHRlci0+bHNjX2ludF9uYW1lLCBhZGFwdGVyKTsKIAlpZiAoZXJyKSB7CiAJCWVfZXJyKHByb2JlLCAicmVxdWVzdF9pcnEgZm9yIG1zaXhfbHNjIGZhaWxlZDogJWRcbiIsIGVycik7CiAJCWdvdG8gZnJlZV9xdWV1ZV9pcnFzOwpAQCAtMjQ1Miw1MSArMjM3MCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgaXhnYmVfc2V0X2l0cihzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaXhnYmVfcV92ZWN0b3IgKnFfdmVjdG9yID0gYWRhcHRlci0+cV92ZWN0b3JbMF07Ci0Jc3RydWN0IGl4Z2JlX3JpbmcgKnJ4X3JpbmcgPSBhZGFwdGVyLT5yeF9yaW5nWzBdOwotCXN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nID0gYWRhcHRlci0+dHhfcmluZ1swXTsKLQl1MzIgbmV3X2l0ciA9IHFfdmVjdG9yLT5laXRyOwotCXU4IGN1cnJlbnRfaXRyOwotCi0JcV92ZWN0b3ItPnR4X2l0ciA9IGl4Z2JlX3VwZGF0ZV9pdHIoYWRhcHRlciwgbmV3X2l0ciwKLQkJCQkJICAgIHFfdmVjdG9yLT50eF9pdHIsCi0JCQkJCSAgICB0eF9yaW5nLT50b3RhbF9wYWNrZXRzLAotCQkJCQkgICAgdHhfcmluZy0+dG90YWxfYnl0ZXMpOwotCXFfdmVjdG9yLT5yeF9pdHIgPSBpeGdiZV91cGRhdGVfaXRyKGFkYXB0ZXIsIG5ld19pdHIsCi0JCQkJCSAgICBxX3ZlY3Rvci0+cnhfaXRyLAotCQkJCQkgICAgcnhfcmluZy0+dG90YWxfcGFja2V0cywKLQkJCQkJICAgIHJ4X3JpbmctPnRvdGFsX2J5dGVzKTsKLQotCWN1cnJlbnRfaXRyID0gbWF4KHFfdmVjdG9yLT5yeF9pdHIsIHFfdmVjdG9yLT50eF9pdHIpOwotCi0Jc3dpdGNoIChjdXJyZW50X2l0cikgewotCS8qIGNvdW50cyBhbmQgcGFja2V0cyBpbiB1cGRhdGVfaXRyIGFyZSBkZXBlbmRlbnQgb24gdGhlc2UgbnVtYmVycyAqLwotCWNhc2UgbG93ZXN0X2xhdGVuY3k6Ci0JCW5ld19pdHIgPSAxMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgbG93X2xhdGVuY3k6Ci0JCW5ld19pdHIgPSAyMDAwMDsgLyogYWthIGh3aXRyID0gfjIwMCAqLwotCQlicmVhazsKLQljYXNlIGJ1bGtfbGF0ZW5jeToKLQkJbmV3X2l0ciA9IDgwMDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmIChuZXdfaXRyICE9IHFfdmVjdG9yLT5laXRyKSB7Ci0JCS8qIGRvIGFuIGV4cG9uZW50aWFsIHNtb290aGluZyAqLwotCQluZXdfaXRyID0gKChxX3ZlY3Rvci0+ZWl0ciAqIDkpICsgbmV3X2l0cikvMTA7Ci0KLQkJLyogc2F2ZSB0aGUgYWxnb3JpdGhtIHZhbHVlIGhlcmUgKi8KLQkJcV92ZWN0b3ItPmVpdHIgPSBuZXdfaXRyOwotCi0JCWl4Z2JlX3dyaXRlX2VpdHIocV92ZWN0b3IpOwotCX0KLX0KLQogLyoqCiAgKiBpeGdiZV9pcnFfZW5hYmxlIC0gRW5hYmxlIGRlZmF1bHQgaW50ZXJydXB0IGdlbmVyYXRpb24gc2V0dGluZ3MKICAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQpAQCAtMjUyMyw4ICsyMzk2LDcgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0JaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRSB8fAotCSAgICBhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkRJUl9QRVJGRUNUX0NBUEFCTEUpCisJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRSkKIAkJbWFzayB8PSBJWEdCRV9FSU1TX0ZMT1dfRElSOwogCiAJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRUlNUywgbWFzayk7CkBAIC0yNTQ2LDggKzI0MTgsNyBAQAogICoqLwogc3RhdGljIGlycXJldHVybl90IGl4Z2JlX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkYXRhOwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJc3RydWN0IGl4Z2JlX3FfdmVjdG9yICpxX3ZlY3RvciA9IGFkYXB0ZXItPnFfdmVjdG9yWzBdOwogCXUzMiBlaWNyOwpAQCAtMjU5NiwxMCArMjQ2Nyw2IEBACiAJaXhnYmVfY2hlY2tfZmFuX2ZhaWx1cmUoYWRhcHRlciwgZWljcik7CiAKIAlpZiAobmFwaV9zY2hlZHVsZV9wcmVwKCYocV92ZWN0b3ItPm5hcGkpKSkgewotCQlhZGFwdGVyLT50eF9yaW5nWzBdLT50b3RhbF9wYWNrZXRzID0gMDsKLQkJYWRhcHRlci0+dHhfcmluZ1swXS0+dG90YWxfYnl0ZXMgPSAwOwotCQlhZGFwdGVyLT5yeF9yaW5nWzBdLT50b3RhbF9wYWNrZXRzID0gMDsKLQkJYWRhcHRlci0+cnhfcmluZ1swXS0+dG90YWxfYnl0ZXMgPSAwOwogCQkvKiB3b3VsZCBkaXNhYmxlIGludGVycnVwdHMgaGVyZSBidXQgRUlBTSBkaXNhYmxlZCBpdCAqLwogCQlfX25hcGlfc2NoZWR1bGUoJihxX3ZlY3Rvci0+bmFwaSkpOwogCX0KQEAgLTI2MjEsMTAgKzI0ODgsMTAgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3RvcnM7IGkrKykgewogCQlzdHJ1Y3QgaXhnYmVfcV92ZWN0b3IgKnFfdmVjdG9yID0gYWRhcHRlci0+cV92ZWN0b3JbaV07Ci0JCWJpdG1hcF96ZXJvKHFfdmVjdG9yLT5yeHJfaWR4LCBNQVhfUlhfUVVFVUVTKTsKLQkJYml0bWFwX3plcm8ocV92ZWN0b3ItPnR4cl9pZHgsIE1BWF9UWF9RVUVVRVMpOwotCQlxX3ZlY3Rvci0+cnhyX2NvdW50ID0gMDsKLQkJcV92ZWN0b3ItPnR4cl9jb3VudCA9IDA7CisJCWJpdG1hcF96ZXJvKHFfdmVjdG9yLT5yeC5pZHgsIE1BWF9SWF9RVUVVRVMpOworCQliaXRtYXBfemVybyhxX3ZlY3Rvci0+dHguaWR4LCBNQVhfVFhfUVVFVUVTKTsKKwkJcV92ZWN0b3ItPnJ4LmNvdW50ID0gMDsKKwkJcV92ZWN0b3ItPnR4LmNvdW50ID0gMDsKIAl9CiB9CiAKQEAgLTI2NDQsMTAgKzI1MTEsMTAgQEAKIAkJZXJyID0gaXhnYmVfcmVxdWVzdF9tc2l4X2lycXMoYWRhcHRlcik7CiAJfSBlbHNlIGlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfTVNJX0VOQUJMRUQpIHsKIAkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCBpeGdiZV9pbnRyLCAwLAotCQkJCSAgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCQkJCSAgbmV0ZGV2LT5uYW1lLCBhZGFwdGVyKTsKIAl9IGVsc2UgewogCQllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIGl4Z2JlX2ludHIsIElSUUZfU0hBUkVELAotCQkJCSAgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCQkJCSAgbmV0ZGV2LT5uYW1lLCBhZGFwdGVyKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtMjY1OCwyMSArMjUyNSwxOSBAQAogCiBzdGF0aWMgdm9pZCBpeGdiZV9mcmVlX2lycShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19NU0lYX0VOQUJMRUQpIHsKIAkJaW50IGksIHFfdmVjdG9yczsKIAogCQlxX3ZlY3RvcnMgPSBhZGFwdGVyLT5udW1fbXNpeF92ZWN0b3JzOwogCiAJCWkgPSBxX3ZlY3RvcnMgLSAxOwotCQlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yLCBuZXRkZXYpOworCQlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yLCBhZGFwdGVyKTsKIAogCQlpLS07CiAJCWZvciAoOyBpID49IDA7IGktLSkgewogCQkJLyogZnJlZSBvbmx5IHRoZSBpcnFzIHRoYXQgd2VyZSBhY3R1YWxseSByZXF1ZXN0ZWQgKi8KLQkJCWlmICghYWRhcHRlci0+cV92ZWN0b3JbaV0tPnJ4cl9jb3VudCAmJgotCQkJICAgICFhZGFwdGVyLT5xX3ZlY3RvcltpXS0+dHhyX2NvdW50KQorCQkJaWYgKCFhZGFwdGVyLT5xX3ZlY3RvcltpXS0+cnguY291bnQgJiYKKwkJCSAgICAhYWRhcHRlci0+cV92ZWN0b3JbaV0tPnR4LmNvdW50KQogCQkJCWNvbnRpbnVlOwogCiAJCQlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yLApAQCAtMjY4MSw3ICsyNTQ2LDcgQEAKIAogCQlpeGdiZV9yZXNldF9xX3ZlY3RvcnMoYWRhcHRlcik7CiAJfSBlbHNlIHsKLQkJZnJlZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCBuZXRkZXYpOworCQlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIGFkYXB0ZXIpOwogCX0KIH0KIApAQCAtMjgxNCw3ICsyNjc5LDggQEAKIHsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiBydHRkY3M7Ci0JdTMyIG1hc2s7CisJdTMyIHJlZzsKKwl1OCB0Y3MgPSBuZXRkZXZfZ2V0X251bV90YyhhZGFwdGVyLT5uZXRkZXYpOwogCiAJaWYgKGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfODI1OThFQikKIAkJcmV0dXJuOwpAQCAtMjgyNSwyMiArMjY5MSwyNyBAQAogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlRURENTLCBydHRkY3MpOwogCiAJLyogc2V0IHRyYW5zbWl0IHBvb2wgbGF5b3V0ICovCi0JbWFzayA9IChJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQgfCBJWEdCRV9GTEFHX0RDQl9FTkFCTEVEKTsKLQlzd2l0Y2ggKGFkYXB0ZXItPmZsYWdzICYgbWFzaykgewotCisJc3dpdGNoIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfU1JJT1ZfRU5BQkxFRCkgewogCWNhc2UgKElYR0JFX0ZMQUdfU1JJT1ZfRU5BQkxFRCk6CiAJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfTVRRQywKIAkJCQkoSVhHQkVfTVRRQ19WVF9FTkEgfCBJWEdCRV9NVFFDXzY0VkYpKTsKIAkJYnJlYWs7Ci0KLQljYXNlIChJWEdCRV9GTEFHX0RDQl9FTkFCTEVEKToKLQkJLyogV2UgZW5hYmxlIDggdHJhZmZpYyBjbGFzc2VzLCBEQ0Igb25seSAqLwotCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX01UUUMsCi0JCQkgICAgICAoSVhHQkVfTVRRQ19SVF9FTkEgfCBJWEdCRV9NVFFDXzhUQ184VFEpKTsKLQkJYnJlYWs7Ci0KIAlkZWZhdWx0OgotCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX01UUUMsIElYR0JFX01UUUNfNjRRXzFQQik7CisJCWlmICghdGNzKQorCQkJcmVnID0gSVhHQkVfTVRRQ182NFFfMVBCOworCQllbHNlIGlmICh0Y3MgPD0gNCkKKwkJCXJlZyA9IElYR0JFX01UUUNfUlRfRU5BIHwgSVhHQkVfTVRRQ180VENfNFRROworCQllbHNlCisJCQlyZWcgPSBJWEdCRV9NVFFDX1JUX0VOQSB8IElYR0JFX01UUUNfOFRDXzhUUTsKKworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX01UUUMsIHJlZyk7CisKKwkJLyogRW5hYmxlIFNlY3VyaXR5IFRYIEJ1ZmZlciBJRkcgZm9yIG11bHRpcGxlIHBiICovCisJCWlmICh0Y3MpIHsKKwkJCXJlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9TRUNUWE1JTklGRyk7CisJCQlyZWcgfD0gSVhHQkVfU0VDVFhfRENCOworCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9TRUNUWE1JTklGRywgcmVnKTsKKwkJfQogCQlicmVhazsKIAl9CiAKQEAgLTI5MzEsNyArMjgwMiwxMSBAQAogCXUzMiBtcnFjID0gMCwgcmV0YSA9IDA7CiAJdTMyIHJ4Y3N1bTsKIAlpbnQgaSwgajsKLQlpbnQgbWFzazsKKwl1OCB0Y3MgPSBuZXRkZXZfZ2V0X251bV90YyhhZGFwdGVyLT5uZXRkZXYpOworCWludCBtYXhxID0gYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLmluZGljZXM7CisKKwlpZiAodGNzKQorCQltYXhxID0gbWluKG1heHEsIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMgLyB0Y3MpOwogCiAJLyogRmlsbCBvdXQgaGFzaCBmdW5jdGlvbiBzZWVkcyAqLwogCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQpAQCAtMjkzOSw3ICsyODE0LDcgQEAKIAogCS8qIEZpbGwgb3V0IHJlZGlyZWN0aW9uIHRhYmxlICovCiAJZm9yIChpID0gMCwgaiA9IDA7IGkgPCAxMjg7IGkrKywgaisrKSB7Ci0JCWlmIChqID09IGFkYXB0ZXItPnJpbmdfZmVhdHVyZVtSSU5HX0ZfUlNTXS5pbmRpY2VzKQorCQlpZiAoaiA9PSBtYXhxKQogCQkJaiA9IDA7CiAJCS8qIHJldGEgPSA0LWJ5dGUgc2xpZGluZyB3aW5kb3cgb2YKIAkJICogMHgwMC4uKGluZGljZXMtMSkoaW5kaWNlcy0xKTAwLi5ldGMuICovCkBAIC0yOTUzLDMzICsyODI4LDI4IEBACiAJcnhjc3VtIHw9IElYR0JFX1JYQ1NVTV9QQ1NEOwogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlhDU1VNLCByeGNzdW0pOwogCi0JaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID09IGl4Z2JlX21hY184MjU5OEVCKQotCQltYXNrID0gYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1JTU19FTkFCTEVEOwotCWVsc2UKLQkJbWFzayA9IGFkYXB0ZXItPmZsYWdzICYgKElYR0JFX0ZMQUdfUlNTX0VOQUJMRUQKLSNpZmRlZiBDT05GSUdfSVhHQkVfRENCCi0JCQkJCSB8IElYR0JFX0ZMQUdfRENCX0VOQUJMRUQKLSNlbmRpZgotCQkJCQkgfCBJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQKLQkJCQkJKTsKLQotCXN3aXRjaCAobWFzaykgewotI2lmZGVmIENPTkZJR19JWEdCRV9EQ0IKLQljYXNlIChJWEdCRV9GTEFHX0RDQl9FTkFCTEVEIHwgSVhHQkVfRkxBR19SU1NfRU5BQkxFRCk6Ci0JCW1ycWMgPSBJWEdCRV9NUlFDX1JUUlNTOFRDRU47Ci0JCWJyZWFrOwotCWNhc2UgKElYR0JFX0ZMQUdfRENCX0VOQUJMRUQpOgotCQltcnFjID0gSVhHQkVfTVJRQ19SVDhUQ0VOOwotCQlicmVhazsKLSNlbmRpZiAvKiBDT05GSUdfSVhHQkVfRENCICovCi0JY2FzZSAoSVhHQkVfRkxBR19SU1NfRU5BQkxFRCk6CisJaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID09IGl4Z2JlX21hY184MjU5OEVCICYmCisJICAgIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfUlNTX0VOQUJMRUQpKSB7CiAJCW1ycWMgPSBJWEdCRV9NUlFDX1JTU0VOOwotCQlicmVhazsKLQljYXNlIChJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQpOgotCQltcnFjID0gSVhHQkVfTVJRQ19WTURRRU47Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOworCX0gZWxzZSB7CisJCWludCBtYXNrID0gYWRhcHRlci0+ZmxhZ3MgJiAoSVhHQkVfRkxBR19SU1NfRU5BQkxFRAorCQkJCQkgICAgIHwgSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEKTsKKworCQlzd2l0Y2ggKG1hc2spIHsKKwkJY2FzZSAoSVhHQkVfRkxBR19SU1NfRU5BQkxFRCk6CisJCQlpZiAoIXRjcykKKwkJCQltcnFjID0gSVhHQkVfTVJRQ19SU1NFTjsKKwkJCWVsc2UgaWYgKHRjcyA8PSA0KQorCQkJCW1ycWMgPSBJWEdCRV9NUlFDX1JUUlNTNFRDRU47CisJCQllbHNlCisJCQkJbXJxYyA9IElYR0JFX01SUUNfUlRSU1M4VENFTjsKKwkJCWJyZWFrOworCQljYXNlIChJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQpOgorCQkJbXJxYyA9IElYR0JFX01SUUNfVk1EUUVOOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCX0KIAogCS8qIFBlcmZvcm0gaGFzaCBvbiB0aGVzZSBwYWNrZXQgdHlwZXMgKi8KQEAgLTI5OTIsMjggKzI4NjIsMTEgQEAKIH0KIAogLyoqCi0gKiBpeGdiZV9jbGVhcl9yc2NjdGwgLSBkaXNhYmxlIFJTQyBmb3IgdGhlIGluZGljYXRlZCByaW5nCi0gKiBAYWRhcHRlcjogYWRkcmVzcyBvZiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQotICogQHJpbmc6IHN0cnVjdHVyZSBjb250YWluaW5nIHJpbmcgc3BlY2lmaWMgZGF0YQotICoqLwotdm9pZCBpeGdiZV9jbGVhcl9yc2NjdGwoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqcmluZykKLXsKLQlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXUzMiByc2NjdHJsOwotCXU4IHJlZ19pZHggPSByaW5nLT5yZWdfaWR4OwotCi0JcnNjY3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SU0NDVEwocmVnX2lkeCkpOwotCXJzY2N0cmwgJj0gfklYR0JFX1JTQ0NUTF9SU0NFTjsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JTQ0NUTChyZWdfaWR4KSwgcnNjY3RybCk7Ci19Ci0KLS8qKgogICogaXhnYmVfY29uZmlndXJlX3JzY2N0bCAtIGVuYWJsZSBSU0MgZm9yIHRoZSBpbmRpY2F0ZWQgcmluZwogICogQGFkYXB0ZXI6ICAgIGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqIEBpbmRleDogICAgICBpbmRleCBvZiByaW5nIHRvIHNldAogICoqLwotdm9pZCBpeGdiZV9jb25maWd1cmVfcnNjY3RsKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAorc3RhdGljIHZvaWQgaXhnYmVfY29uZmlndXJlX3JzY2N0bChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKIAkJCQkgICBzdHJ1Y3QgaXhnYmVfcmluZyAqcmluZykKIHsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtMzE4Myw3ICszMDM2LDcgQEAKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYRENUTChyZWdfaWR4KSwgcnhkY3RsKTsKIAogCWl4Z2JlX3J4X2Rlc2NfcXVldWVfZW5hYmxlKGFkYXB0ZXIsIHJpbmcpOwotCWl4Z2JlX2FsbG9jX3J4X2J1ZmZlcnMocmluZywgSVhHQkVfREVTQ19VTlVTRUQocmluZykpOworCWl4Z2JlX2FsbG9jX3J4X2J1ZmZlcnMocmluZywgaXhnYmVfZGVzY191bnVzZWQocmluZykpOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9zZXR1cF9wc3J0eXBlKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQpAQCAtMzY4MSwxMCArMzUzNCwxMCBAQAogCQlxX3ZlY3RvciA9IGFkYXB0ZXItPnFfdmVjdG9yW3FfaWR4XTsKIAkJbmFwaSA9ICZxX3ZlY3Rvci0+bmFwaTsKIAkJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19NU0lYX0VOQUJMRUQpIHsKLQkJCWlmICghcV92ZWN0b3ItPnJ4cl9jb3VudCB8fCAhcV92ZWN0b3ItPnR4cl9jb3VudCkgewotCQkJCWlmIChxX3ZlY3Rvci0+dHhyX2NvdW50ID09IDEpCisJCQlpZiAoIXFfdmVjdG9yLT5yeC5jb3VudCB8fCAhcV92ZWN0b3ItPnR4LmNvdW50KSB7CisJCQkJaWYgKHFfdmVjdG9yLT50eC5jb3VudCA9PSAxKQogCQkJCQluYXBpLT5wb2xsID0gJml4Z2JlX2NsZWFuX3R4b25seTsKLQkJCQllbHNlIGlmIChxX3ZlY3Rvci0+cnhyX2NvdW50ID09IDEpCisJCQkJZWxzZSBpZiAocV92ZWN0b3ItPnJ4LmNvdW50ID09IDEpCiAJCQkJCW5hcGktPnBvbGwgPSAmaXhnYmVfY2xlYW5fcnhvbmx5OwogCQkJfQogCQl9CkBAIC0zNzM5LDcgKzM1OTIsNyBAQAogCWh3LT5tYWMub3BzLnNldF92ZnRhKCZhZGFwdGVyLT5odywgMCwgMCwgdHJ1ZSk7CiAKIAkvKiByZWNvbmZpZ3VyZSB0aGUgaGFyZHdhcmUgKi8KLQlpZiAoYWRhcHRlci0+ZGNieF9jYXAgJiAoRENCX0NBUF9EQ0JYX0hPU1QgfCBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkpIHsKKwlpZiAoYWRhcHRlci0+ZGNieF9jYXAgJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkgewogI2lmZGVmIENPTkZJR19GQ09FCiAJCWlmIChhZGFwdGVyLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9GQ09FX01UVSkKIAkJCW1heF9mcmFtZSA9IG1heChtYXhfZnJhbWUsIElYR0JFX0ZDT0VfSlVNQk9fRlJBTUVfU0laRSk7CkBAIC0zNzc5LDEyICszNjMyLDUxIEBACiB9CiAKICNlbmRpZgorCitzdGF0aWMgdm9pZCBpeGdiZV9jb25maWd1cmVfcGIoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGhkcm0gPSAwOworCWludCBudW1fdGMgPSBuZXRkZXZfZ2V0X251bV90YyhhZGFwdGVyLT5uZXRkZXYpOworCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfSEFTSF9DQVBBQkxFIHx8CisJICAgIGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GRElSX1BFUkZFQ1RfQ0FQQUJMRSkKKwkJaGRybSA9IDY0IDw8IGFkYXB0ZXItPmZkaXJfcGJhbGxvYzsKKworCWh3LT5tYWMub3BzLnNldF9yeHBiYSgmYWRhcHRlci0+aHcsIG51bV90YywgaGRybSwgUEJBX1NUUkFURUdZX0VRVUFMKTsKK30KKworc3RhdGljIHZvaWQgaXhnYmVfZmRpcl9maWx0ZXJfcmVzdG9yZShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbm9kZTI7CisJc3RydWN0IGl4Z2JlX2ZkaXJfZmlsdGVyICpmaWx0ZXI7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPmZkaXJfcGVyZmVjdF9sb2NrKTsKKworCWlmICghaGxpc3RfZW1wdHkoJmFkYXB0ZXItPmZkaXJfZmlsdGVyX2xpc3QpKQorCQlpeGdiZV9mZGlyX3NldF9pbnB1dF9tYXNrXzgyNTk5KGh3LCAmYWRhcHRlci0+ZmRpcl9tYXNrKTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmlsdGVyLCBub2RlLCBub2RlMiwKKwkJCQkgICZhZGFwdGVyLT5mZGlyX2ZpbHRlcl9saXN0LCBmZGlyX25vZGUpIHsKKwkJaXhnYmVfZmRpcl93cml0ZV9wZXJmZWN0X2ZpbHRlcl84MjU5OShodywKKwkJCQkmZmlsdGVyLT5maWx0ZXIsCisJCQkJZmlsdGVyLT5zd19pZHgsCisJCQkJKGZpbHRlci0+YWN0aW9uID09IElYR0JFX0ZESVJfRFJPUF9RVUVVRSkgPworCQkJCUlYR0JFX0ZESVJfRFJPUF9RVUVVRSA6CisJCQkJYWRhcHRlci0+cnhfcmluZ1tmaWx0ZXItPmFjdGlvbl0tPnJlZ19pZHgpOworCX0KKworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5mZGlyX3BlcmZlY3RfbG9jayk7Cit9CisKIHN0YXRpYyB2b2lkIGl4Z2JlX2NvbmZpZ3VyZShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJaW50IGk7CiAKKwlpeGdiZV9jb25maWd1cmVfcGIoYWRhcHRlcik7CiAjaWZkZWYgQ09ORklHX0lYR0JFX0RDQgogCWl4Z2JlX2NvbmZpZ3VyZV9kY2IoYWRhcHRlcik7CiAjZW5kaWYKQEAgLTM4MDMsNyArMzY5NSw5IEBACiAJCQkJCQkgICAgICAgYWRhcHRlci0+YXRyX3NhbXBsZV9yYXRlOwogCQlpeGdiZV9pbml0X2ZkaXJfc2lnbmF0dXJlXzgyNTk5KGh3LCBhZGFwdGVyLT5mZGlyX3BiYWxsb2MpOwogCX0gZWxzZSBpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfUEVSRkVDVF9DQVBBQkxFKSB7Ci0JCWl4Z2JlX2luaXRfZmRpcl9wZXJmZWN0XzgyNTk5KGh3LCBhZGFwdGVyLT5mZGlyX3BiYWxsb2MpOworCQlpeGdiZV9pbml0X2ZkaXJfcGVyZmVjdF84MjU5OSgmYWRhcHRlci0+aHcsCisJCQkJCSAgICAgIGFkYXB0ZXItPmZkaXJfcGJhbGxvYyk7CisJCWl4Z2JlX2ZkaXJfZmlsdGVyX3Jlc3RvcmUoYWRhcHRlcik7CiAJfQogCWl4Z2JlX2NvbmZpZ3VyZV92aXJ0dWFsaXphdGlvbihhZGFwdGVyKTsKIApAQCAtNDE4MCw2ICs0MDc0LDIzIEBACiAJCWl4Z2JlX2NsZWFuX3R4X3JpbmcoYWRhcHRlci0+dHhfcmluZ1tpXSk7CiB9CiAKK3N0YXRpYyB2b2lkIGl4Z2JlX2ZkaXJfZmlsdGVyX2V4aXQoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpub2RlMjsKKwlzdHJ1Y3QgaXhnYmVfZmRpcl9maWx0ZXIgKmZpbHRlcjsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+ZmRpcl9wZXJmZWN0X2xvY2spOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmaWx0ZXIsIG5vZGUsIG5vZGUyLAorCQkJCSAgJmFkYXB0ZXItPmZkaXJfZmlsdGVyX2xpc3QsIGZkaXJfbm9kZSkgeworCQlobGlzdF9kZWwoJmZpbHRlci0+ZmRpcl9ub2RlKTsKKwkJa2ZyZWUoZmlsdGVyKTsKKwl9CisJYWRhcHRlci0+ZmRpcl9maWx0ZXJfY291bnQgPSAwOworCisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPmZkaXJfcGVyZmVjdF9sb2NrKTsKK30KKwogdm9pZCBpeGdiZV9kb3duKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CkBAIC00MzA2LDcgKzQyMTcsNyBAQAogCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKIAkJaWYgKGFkYXB0ZXItPnJ4X2l0cl9zZXR0aW5nICYgMSkKLQkJCWl4Z2JlX3NldF9pdHIoYWRhcHRlcik7CisJCQlpeGdiZV9zZXRfaXRyKHFfdmVjdG9yKTsKIAkJaWYgKCF0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpCiAJCQlpeGdiZV9pcnFfZW5hYmxlX3F1ZXVlcyhhZGFwdGVyLCBJWEdCRV9FSU1TX1JUWF9RVUVVRSk7CiAJfQpAQCAtNDM2OSwxNSArNDI4MCwxMyBAQAogCWZfZmRpci0+bWFzayA9IDA7CiAKIAkvKiBGbG93IERpcmVjdG9yIG11c3QgaGF2ZSBSU1MgZW5hYmxlZCAqLwotCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfUlNTX0VOQUJMRUQgJiYKLQkgICAgKChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkRJUl9IQVNIX0NBUEFCTEUgfHwKLQkgICAgIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkRJUl9QRVJGRUNUX0NBUEFCTEUpKSkpIHsKKwlpZiAoKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SU1NfRU5BQkxFRCkgJiYKKwkgICAgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRSkpIHsKIAkJYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyA9IGZfZmRpci0+aW5kaWNlczsKIAkJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA9IGZfZmRpci0+aW5kaWNlczsKIAkJcmV0ID0gdHJ1ZTsKIAl9IGVsc2UgewogCQlhZGFwdGVyLT5mbGFncyAmPSB+SVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRTsKLQkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfRkRJUl9QRVJGRUNUX0NBUEFCTEU7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC00NDAwLDY5ICs0MzA5LDcyIEBACiAJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZDT0VfRU5BQkxFRCkpCiAJCXJldHVybiBmYWxzZTsKIAotCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRENCX0VOQUJMRUQpIHsKLSNpZmRlZiBDT05GSUdfSVhHQkVfRENCCi0JCWludCB0YzsKLQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlmLT5pbmRpY2VzID0gbWluKChpbnQpbnVtX29ubGluZV9jcHVzKCksIGYtPmluZGljZXMpOwogCi0JCXRjID0gbmV0ZGV2X2dldF9wcmlvX3RjX21hcChkZXYsIGFkYXB0ZXItPmZjb2UudXApOwotCQlmLT5pbmRpY2VzID0gZGV2LT50Y190b190eHFbdGNdLmNvdW50OwotCQlmLT5tYXNrID0gZGV2LT50Y190b190eHFbdGNdLm9mZnNldDsKLSNlbmRpZgotCX0gZWxzZSB7Ci0JCWYtPmluZGljZXMgPSBtaW4oKGludCludW1fb25saW5lX2NwdXMoKSwgZi0+aW5kaWNlcyk7CisJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA9IDE7CisJYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyA9IDE7CiAKLQkJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA9IDE7Ci0JCWFkYXB0ZXItPm51bV90eF9xdWV1ZXMgPSAxOwotCi0JCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfUlNTX0VOQUJMRUQpIHsKLQkJCWVfaW5mbyhwcm9iZSwgIkZDb0UgZW5hYmxlZCB3aXRoIFJTU1xuIik7Ci0JCQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRSkgfHwKLQkJCSAgICAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfUEVSRkVDVF9DQVBBQkxFKSkKLQkJCQlpeGdiZV9zZXRfZmRpcl9xdWV1ZXMoYWRhcHRlcik7Ci0JCQllbHNlCi0JCQkJaXhnYmVfc2V0X3Jzc19xdWV1ZXMoYWRhcHRlcik7Ci0JCX0KLQkJLyogYWRkaW5nIEZDb0UgcnggcmluZ3MgdG8gdGhlIGVuZCAqLwotCQlmLT5tYXNrID0gYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsKLQkJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyArPSBmLT5pbmRpY2VzOwotCQlhZGFwdGVyLT5udW1fdHhfcXVldWVzICs9IGYtPmluZGljZXM7CisJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SU1NfRU5BQkxFRCkgeworCQllX2luZm8ocHJvYmUsICJGQ29FIGVuYWJsZWQgd2l0aCBSU1NcbiIpOworCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfSEFTSF9DQVBBQkxFKQorCQkJaXhnYmVfc2V0X2ZkaXJfcXVldWVzKGFkYXB0ZXIpOworCQllbHNlCisJCQlpeGdiZV9zZXRfcnNzX3F1ZXVlcyhhZGFwdGVyKTsKIAl9CiAKKwkvKiBhZGRpbmcgRkNvRSByeCByaW5ncyB0byB0aGUgZW5kICovCisJZi0+bWFzayA9IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7CisJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyArPSBmLT5pbmRpY2VzOworCWFkYXB0ZXItPm51bV90eF9xdWV1ZXMgKz0gZi0+aW5kaWNlczsKKwogCXJldHVybiB0cnVlOwogfQogI2VuZGlmIC8qIElYR0JFX0ZDT0UgKi8KIAorLyogQXJ0aWZpY2lhbCBtYXggcXVldWUgY2FwIHBlciB0cmFmZmljIGNsYXNzIGluIERDQiBtb2RlICovCisjZGVmaW5lIERDQl9RVUVVRV9DQVAgOAorCiAjaWZkZWYgQ09ORklHX0lYR0JFX0RDQgogc3RhdGljIGlubGluZSBib29sIGl4Z2JlX3NldF9kY2JfcXVldWVzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewotCWJvb2wgcmV0ID0gZmFsc2U7Ci0Jc3RydWN0IGl4Z2JlX3JpbmdfZmVhdHVyZSAqZiA9ICZhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX0RDQl07Ci0JaW50IGksIHE7CisJaW50IHBlcl90Y19xLCBxLCBpLCBvZmZzZXQgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJaW50IHRjcyA9IG5ldGRldl9nZXRfbnVtX3RjKGRldik7CiAKLQlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRENCX0VOQUJMRUQpKQotCQlyZXR1cm4gcmV0OworCWlmICghdGNzKQorCQlyZXR1cm4gZmFsc2U7CiAKLQlmLT5pbmRpY2VzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RSQUZGSUNfQ0xBU1M7IGkrKykgewotCQlxID0gbWluKChpbnQpbnVtX29ubGluZV9jcHVzKCksIE1BWF9UUkFGRklDX0NMQVNTKTsKLQkJZi0+aW5kaWNlcyArPSBxOworCS8qIE1hcCBxdWV1ZSBvZmZzZXQgYW5kIGNvdW50cyBvbnRvIGFsbG9jYXRlZCB0eCBxdWV1ZXMgKi8KKwlwZXJfdGNfcSA9IG1pbihkZXYtPm51bV90eF9xdWV1ZXMgLyB0Y3MsICh1bnNpZ25lZCBpbnQpRENCX1FVRVVFX0NBUCk7CisJcSA9IG1pbigoaW50KW51bV9vbmxpbmVfY3B1cygpLCBwZXJfdGNfcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGNzOyBpKyspIHsKKwkJbmV0ZGV2X3NldF9wcmlvX3RjX21hcChkZXYsIGksIGkpOworCQluZXRkZXZfc2V0X3RjX3F1ZXVlKGRldiwgaSwgcSwgb2Zmc2V0KTsKKwkJb2Zmc2V0ICs9IHE7CiAJfQogCi0JZi0+bWFzayA9IDB4NyA8PCAzOwotCWFkYXB0ZXItPm51bV9yeF9xdWV1ZXMgPSBmLT5pbmRpY2VzOwotCWFkYXB0ZXItPm51bV90eF9xdWV1ZXMgPSBmLT5pbmRpY2VzOwotCXJldCA9IHRydWU7CisJYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyA9IHEgKiB0Y3M7CisJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA9IHEgKiB0Y3M7CiAKICNpZmRlZiBJWEdCRV9GQ09FCi0JLyogRkNvRSBlbmFibGVkIHF1ZXVlcyByZXF1aXJlIHNwZWNpYWwgY29uZmlndXJhdGlvbiBkb25lIHRocm91Z2gKLQkgKiBjb25maWd1cmVfZmNvZSgpIGFuZCBvdGhlcnMuIEhlcmUgd2UgbWFwIEZDb0UgaW5kaWNlcyBvbnRvIHRoZQotCSAqIERDQiBxdWV1ZSBwYWlycyBhbGxvd2luZyBGQ29FIHRvIG93biBjb25maWd1cmF0aW9uIGxhdGVyLgorCS8qIEZDb0UgZW5hYmxlZCBxdWV1ZXMgcmVxdWlyZSBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gaW5kZXhlZAorCSAqIGJ5IGZlYXR1cmUgc3BlY2lmaWMgaW5kaWNlcyBhbmQgbWFzay4gSGVyZSB3ZSBtYXAgRkNvRQorCSAqIGluZGljZXMgb250byB0aGUgRENCIHF1ZXVlIHBhaXJzIGFsbG93aW5nIEZDb0UgdG8gb3duCisJICogY29uZmlndXJhdGlvbiBsYXRlci4KIAkgKi8KLQlpeGdiZV9zZXRfZmNvZV9xdWV1ZXMoYWRhcHRlcik7CisJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GQ09FX0VOQUJMRUQpIHsKKwkJaW50IHRjOworCQlzdHJ1Y3QgaXhnYmVfcmluZ19mZWF0dXJlICpmID0KKwkJCQkJJmFkYXB0ZXItPnJpbmdfZmVhdHVyZVtSSU5HX0ZfRkNPRV07CisKKwkJdGMgPSBuZXRkZXZfZ2V0X3ByaW9fdGNfbWFwKGRldiwgYWRhcHRlci0+ZmNvZS51cCk7CisJCWYtPmluZGljZXMgPSBkZXYtPnRjX3RvX3R4cVt0Y10uY291bnQ7CisJCWYtPm1hc2sgPSBkZXYtPnRjX3RvX3R4cVt0Y10ub2Zmc2V0OworCX0KICNlbmRpZgogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdHJ1ZTsKIH0KICNlbmRpZgogCkBAIC00NjE2LDggKzQ1MjgsOCBAQAogCiAJc3dpdGNoIChody0+bWFjLnR5cGUpIHsKIAljYXNlIGl4Z2JlX21hY184MjU5OEVCOgotCQkqdHggPSB0YyA8PCAzOwotCQkqcnggPSB0YyA8PCAyOworCQkqdHggPSB0YyA8PCAyOworCQkqcnggPSB0YyA8PCAzOwogCQlicmVhazsKIAljYXNlIGl4Z2JlX21hY184MjU5OUVCOgogCWNhc2UgaXhnYmVfbWFjX1g1NDA6CkBAIC00NjU3LDU1ICs0NTY5LDYgQEAKIAl9CiB9CiAKLSNkZWZpbmUgSVhHQkVfTUFYX1FfUEVSX1RDCShJWEdCRV9NQVhfRENCX0lORElDRVMgLyBNQVhfVFJBRkZJQ19DTEFTUykKLQotLyogaXhnYmVfc2V0dXBfdGMgLSByb3V0aW5lIHRvIGNvbmZpZ3VyZSBuZXRfZGV2aWNlIGZvciBtdWx0aXBsZSB0cmFmZmljCi0gKiBjbGFzc2VzLgotICoKLSAqIEBuZXRkZXY6IG5ldCBkZXZpY2UgdG8gY29uZmlndXJlCi0gKiBAdGM6IG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgdG8gZW5hYmxlCi0gKi8KLWludCBpeGdiZV9zZXR1cF90YyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCB0YykKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgcSwgb2Zmc2V0ID0gMDsKLQotCWlmICghdGMpIHsKLQkJbmV0ZGV2X3Jlc2V0X3RjKGRldik7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JCS8qIEhhcmR3YXJlIHN1cHBvcnRzIHVwIHRvIDggdHJhZmZpYyBjbGFzc2VzICovCi0JCWlmICh0YyA+IE1BWF9UUkFGRklDX0NMQVNTIHx8IG5ldGRldl9zZXRfbnVtX3RjKGRldiwgdGMpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJLyogUGFydGl0aW9uIFR4IHF1ZXVlcyBldmVubHkgYW1vbmdzdCB0cmFmZmljIGNsYXNzZXMgKi8KLQkJZm9yIChpID0gMDsgaSA8IHRjOyBpKyspIHsKLQkJCXEgPSBtaW4oKGludCludW1fb25saW5lX2NwdXMoKSwgSVhHQkVfTUFYX1FfUEVSX1RDKTsKLQkJCW5ldGRldl9zZXRfcHJpb190Y19tYXAoZGV2LCBpLCBpKTsKLQkJCW5ldGRldl9zZXRfdGNfcXVldWUoZGV2LCBpLCBxLCBvZmZzZXQpOwotCQkJb2Zmc2V0ICs9IHE7Ci0JCX0KLQotCQkvKiBUaGlzIGVuYWJsZXMgbXVsdGlwbGUgdHJhZmZpYyBjbGFzcyBzdXBwb3J0IGluIHRoZSBoYXJkd2FyZQotCQkgKiB3aGljaCBkZWZhdWx0cyB0byBzdHJpY3QgcHJpb3JpdHkgdHJhbnNtaXNzaW9uIGJ5IGRlZmF1bHQuCi0JCSAqIElmIHRyYWZmaWMgY2xhc3NlcyBhcmUgYWxyZWFkeSBlbmFibGVkIHBlcmhhcHMgdGhyb3VnaCBEQ0IKLQkJICogY29kZSBwYXRoIHRoZW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbiB3aWxsIGJlIHVzZWQuCi0JCSAqLwotCQlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRENCX0VOQUJMRUQpICYmCi0JCSAgICBkZXYtPmRjYm5sX29wcyAmJiBkZXYtPmRjYm5sX29wcy0+c2V0ZGNieCkgewotCQkJc3RydWN0IGllZWVfZXRzIGV0cyA9IHsKLQkJCQkJLnByaW9fdGMgPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgN30sCi0JCQkJCSAgICAgIH07Ci0JCQl1OCBtb2RlID0gRENCX0NBUF9EQ0JYX0hPU1QgfCBEQ0JfQ0FQX0RDQlhfVkVSX0lFRUU7Ci0KLQkJCWRldi0+ZGNibmxfb3BzLT5zZXRkY2J4KGRldiwgbW9kZSk7Ci0JCQlkZXYtPmRjYm5sX29wcy0+aWVlZV9zZXRldHMoZGV2LCAmZXRzKTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQogLyoqCiAgKiBpeGdiZV9jYWNoZV9yaW5nX2RjYiAtIERlc2NyaXB0b3IgcmluZyB0byByZWdpc3RlciBtYXBwaW5nIGZvciBEQ0IKICAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZSB0byBpbml0aWFsaXplCkBAIC00NzE5LDcgKzQ1ODIsNyBAQAogCWludCBpLCBqLCBrOwogCXU4IG51bV90Y3MgPSBuZXRkZXZfZ2V0X251bV90YyhkZXYpOwogCi0JaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0RDQl9FTkFCTEVEKSkKKwlpZiAoIW51bV90Y3MpCiAJCXJldHVybiBmYWxzZTsKIAogCWZvciAoaSA9IDAsIGsgPSAwOyBpIDwgbnVtX3RjczsgaSsrKSB7CkBAIC00NzUxLDkgKzQ2MTQsOCBAQAogCWludCBpOwogCWJvb2wgcmV0ID0gZmFsc2U7CiAKLQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1JTU19FTkFCTEVEICYmCi0JICAgICgoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfSEFTSF9DQVBBQkxFKSB8fAotCSAgICAgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GRElSX1BFUkZFQ1RfQ0FQQUJMRSkpKSB7CisJaWYgKChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfUlNTX0VOQUJMRUQpICYmCisJICAgIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkRJUl9IQVNIX0NBUEFCTEUpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspCiAJCQlhZGFwdGVyLT5yeF9yaW5nW2ldLT5yZWdfaWR4ID0gaTsKIAkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykKQEAgLTQ3ODIsOCArNDY0NCw3IEBACiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfUlNTX0VOQUJMRUQpIHsKLQkJaWYgKChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkRJUl9IQVNIX0NBUEFCTEUpIHx8Ci0JCSAgICAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfUEVSRkVDVF9DQVBBQkxFKSkKKwkJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRSkKIAkJCWl4Z2JlX2NhY2hlX3JpbmdfZmRpcihhZGFwdGVyKTsKIAkJZWxzZQogCQkJaXhnYmVfY2FjaGVfcmluZ19yc3MoYWRhcHRlcik7CkBAIC00OTYzLDE0ICs0ODI0LDEyIEBACiAKIAlhZGFwdGVyLT5mbGFncyAmPSB+SVhHQkVfRkxBR19EQ0JfRU5BQkxFRDsKIAlhZGFwdGVyLT5mbGFncyAmPSB+SVhHQkVfRkxBR19SU1NfRU5BQkxFRDsKLQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiAoSVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRSB8Ci0JCQkgICAgICBJWEdCRV9GTEFHX0ZESVJfUEVSRkVDVF9DQVBBQkxFKSkgeworCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRkRJUl9IQVNIX0NBUEFCTEUpIHsKIAkJZV9lcnIocHJvYmUsCi0JCSAgICAgICJGbG93IERpcmVjdG9yIGlzIG5vdCBzdXBwb3J0ZWQgd2hpbGUgbXVsdGlwbGUgIgorCQkgICAgICAiQVRSIGlzIG5vdCBzdXBwb3J0ZWQgd2hpbGUgbXVsdGlwbGUgIgogCQkgICAgICAicXVldWVzIGFyZSBkaXNhYmxlZC4gIERpc2FibGluZyBGbG93IERpcmVjdG9yXG4iKTsKIAl9CiAJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfRkRJUl9IQVNIX0NBUEFCTEU7Ci0JYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfRkRJUl9QRVJGRUNUX0NBUEFCTEU7CiAJYWRhcHRlci0+YXRyX3NhbXBsZV9yYXRlID0gMDsKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQpCiAJCWl4Z2JlX2Rpc2FibGVfc3Jpb3YoYWRhcHRlcik7CkBAIC01MDI0LDcgKzQ4ODMsNyBAQAogCQlpZiAoIXFfdmVjdG9yKQogCQkJZ290byBlcnJfb3V0OwogCQlxX3ZlY3Rvci0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JCWlmIChxX3ZlY3Rvci0+dHhyX2NvdW50ICYmICFxX3ZlY3Rvci0+cnhyX2NvdW50KQorCQlpZiAocV92ZWN0b3ItPnR4LmNvdW50ICYmICFxX3ZlY3Rvci0+cnguY291bnQpCiAJCQlxX3ZlY3Rvci0+ZWl0ciA9IGFkYXB0ZXItPnR4X2VpdHJfcGFyYW07CiAJCWVsc2UKIAkJCXFfdmVjdG9yLT5laXRyID0gYWRhcHRlci0+cnhfZWl0cl9wYXJhbTsKQEAgLTUyMDEsNyArNTA2MCw2IEBACiAJcnNzID0gbWluKElYR0JFX01BWF9SU1NfSU5ESUNFUywgKGludCludW1fb25saW5lX2NwdXMoKSk7CiAJYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLmluZGljZXMgPSByc3M7CiAJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19SU1NfRU5BQkxFRDsKLQlhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX0RDQl0uaW5kaWNlcyA9IElYR0JFX01BWF9EQ0JfSU5ESUNFUzsKIAlzd2l0Y2ggKGh3LT5tYWMudHlwZSkgewogCWNhc2UgaXhnYmVfbWFjXzgyNTk4RUI6CiAJCWlmIChody0+ZGV2aWNlX2lkID09IElYR0JFX0RFVl9JRF84MjU5OEFUKQpAQCAtNTIxNSwyMSArNTA3MywxOCBAQAogCQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfUlNDX0VOQUJMRUQ7CiAJCWlmIChody0+ZGV2aWNlX2lkID09IElYR0JFX0RFVl9JRF84MjU5OV9UM19MT00pCiAJCQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfVEVNUF9TRU5TT1JfQ0FQQUJMRTsKLQkJLyogbi10dXBsZSBzdXBwb3J0IGV4aXN0cywgYWx3YXlzIGluaXQgb3VyIHNwaW5sb2NrICovCi0JCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5mZGlyX3BlcmZlY3RfbG9jayk7CiAJCS8qIEZsb3cgRGlyZWN0b3IgaGFzaCBmaWx0ZXJzIGVuYWJsZWQgKi8KIAkJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19GRElSX0hBU0hfQ0FQQUJMRTsKIAkJYWRhcHRlci0+YXRyX3NhbXBsZV9yYXRlID0gMjA7CiAJCWFkYXB0ZXItPnJpbmdfZmVhdHVyZVtSSU5HX0ZfRkRJUl0uaW5kaWNlcyA9CiAJCQkJCQkJIElYR0JFX01BWF9GRElSX0lORElDRVM7Ci0JCWFkYXB0ZXItPmZkaXJfcGJhbGxvYyA9IDA7CisJCWFkYXB0ZXItPmZkaXJfcGJhbGxvYyA9IElYR0JFX0ZESVJfUEJBTExPQ182NEs7CiAjaWZkZWYgSVhHQkVfRkNPRQogCQlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX0ZDT0VfQ0FQQUJMRTsKIAkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfRkNPRV9FTkFCTEVEOwogCQlhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX0ZDT0VdLmluZGljZXMgPSAwOwogI2lmZGVmIENPTkZJR19JWEdCRV9EQ0IKIAkJLyogRGVmYXVsdCB0cmFmZmljIGNsYXNzIHRvIHVzZSBmb3IgRkNvRSAqLwotCQlhZGFwdGVyLT5mY29lLnRjID0gSVhHQkVfRkNPRV9ERUZUQzsKIAkJYWRhcHRlci0+ZmNvZS51cCA9IElYR0JFX0ZDT0VfREVGVEM7CiAjZW5kaWYKICNlbmRpZiAvKiBJWEdCRV9GQ09FICovCkBAIC01MjM4LDYgKzUwOTMsOSBAQAogCQlicmVhazsKIAl9CiAKKwkvKiBuLXR1cGxlIHN1cHBvcnQgZXhpc3RzLCBhbHdheXMgaW5pdCBvdXIgc3BpbmxvY2sgKi8KKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+ZmRpcl9wZXJmZWN0X2xvY2spOworCiAjaWZkZWYgQ09ORklHX0lYR0JFX0RDQgogCS8qIENvbmZpZ3VyZSBEQ0IgdHJhZmZpYyBjbGFzc2VzICovCiAJZm9yIChqID0gMDsgaiA8IE1BWF9UUkFGRklDX0NMQVNTOyBqKyspIHsKQEAgLTUyNTAsNyArNTEwOCw2IEBACiAJfQogCWFkYXB0ZXItPmRjYl9jZmcuYndfcGVyY2VudGFnZVtEQ0JfVFhfQ09ORklHXVswXSA9IDEwMDsKIAlhZGFwdGVyLT5kY2JfY2ZnLmJ3X3BlcmNlbnRhZ2VbRENCX1JYX0NPTkZJR11bMF0gPSAxMDA7Ci0JYWRhcHRlci0+ZGNiX2NmZy5yeF9wYmFfY2ZnID0gcGJhX2VxdWFsOwogCWFkYXB0ZXItPmRjYl9jZmcucGZjX21vZGVfZW5hYmxlID0gZmFsc2U7CiAJYWRhcHRlci0+ZGNiX3NldF9iaXRtYXAgPSAweDAwOwogCWFkYXB0ZXItPmRjYnhfY2FwID0gRENCX0NBUF9EQ0JYX0hPU1QgfCBEQ0JfQ0FQX0RDQlhfVkVSX0NFRTsKQEAgLTUyODUsNiArNTE0Miw5IEBACiAJYWRhcHRlci0+dHhfcmluZ19jb3VudCA9IElYR0JFX0RFRkFVTFRfVFhEOwogCWFkYXB0ZXItPnJ4X3JpbmdfY291bnQgPSBJWEdCRV9ERUZBVUxUX1JYRDsKIAorCS8qIHNldCBkZWZhdWx0IHdvcmsgbGltaXRzICovCisJYWRhcHRlci0+dHhfd29ya19saW1pdCA9IGFkYXB0ZXItPnR4X3JpbmdfY291bnQ7CisKIAkvKiBpbml0aWFsaXplIGVlcHJvbSBwYXJhbWV0ZXJzICovCiAJaWYgKGl4Z2JlX2luaXRfZWVwcm9tX3BhcmFtc19nZW5lcmljKGh3KSkgewogCQllX2Rldl9lcnIoIkVFUFJPTSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwpAQCAtNTMzMSw3ICs1MTkxLDYgQEAKIAogCXR4X3JpbmctPm5leHRfdG9fdXNlID0gMDsKIAl0eF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKLQl0eF9yaW5nLT53b3JrX2xpbWl0ID0gdHhfcmluZy0+Y291bnQ7CiAJcmV0dXJuIDA7CiAKIGVycjoKQEAgLTU2MjAsNiArNTQ3OSw4IEBACiAJaXhnYmVfZG93bihhZGFwdGVyKTsKIAlpeGdiZV9mcmVlX2lycShhZGFwdGVyKTsKIAorCWl4Z2JlX2ZkaXJfZmlsdGVyX2V4aXQoYWRhcHRlcik7CisKIAlpeGdiZV9mcmVlX2FsbF90eF9yZXNvdXJjZXMoYWRhcHRlcik7CiAJaXhnYmVfZnJlZV9hbGxfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCkBAIC02MDM4LDcgKzU4OTksNyBAQAogCQkvKiBnZXQgb25lIGJpdCBmb3IgZXZlcnkgYWN0aXZlIHR4L3J4IGludGVycnVwdCB2ZWN0b3IgKi8KIAkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9tc2l4X3ZlY3RvcnMgLSBOT05fUV9WRUNUT1JTOyBpKyspIHsKIAkJCXN0cnVjdCBpeGdiZV9xX3ZlY3RvciAqcXYgPSBhZGFwdGVyLT5xX3ZlY3RvcltpXTsKLQkJCWlmIChxdi0+cnhyX2NvdW50IHx8IHF2LT50eHJfY291bnQpCisJCQlpZiAocXYtPnJ4LmNvdW50IHx8IHF2LT50eC5jb3VudCkKIAkJCQllaWNzIHw9ICgodTY0KTEgPDwgaSk7CiAJCX0KIAl9CkBAIC02MTQzLDkgKzYwMDQsNyBAQAogCSAgICAgICAoZmxvd190eCA/ICJUWCIgOiAiTm9uZSIpKSkpOwogCiAJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOwotI2lmZGVmIEhBVkVfSVBMSU5LX1ZGX0NPTkZJRwogCWl4Z2JlX2NoZWNrX3ZmX3JhdGVfbGltaXQoYWRhcHRlcik7Ci0jZW5kaWYgLyogSEFWRV9JUExJTktfVkZfQ09ORklHICovCiB9CiAKIC8qKgpAQCAtNjQwNCwxNzkgKzYyNjMsMTQ1IEBACiAJaXhnYmVfc2VydmljZV9ldmVudF9jb21wbGV0ZShhZGFwdGVyKTsKIH0KIAotc3RhdGljIGludCBpeGdiZV90c28oc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgICAgc3RydWN0IGl4Z2JlX3JpbmcgKnR4X3JpbmcsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgdTMyIHR4X2ZsYWdzLCB1OCAqaGRyX2xlbiwgX19iZTE2IHByb3RvY29sKQordm9pZCBpeGdiZV90eF9jdHh0ZGVzYyhzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZywgdTMyIHZsYW5fbWFjaXBfbGVucywKKwkJICAgICAgIHUzMiBmY29lX3NvZl9lb2YsIHUzMiB0eXBlX3R1Y21kLCB1MzIgbXNzX2w0bGVuX2lkeCkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWR2X3R4X2NvbnRleHRfZGVzYyAqY29udGV4dF9kZXNjOwotCXVuc2lnbmVkIGludCBpOworCXUxNiBpID0gdHhfcmluZy0+bmV4dF90b191c2U7CisKKwljb250ZXh0X2Rlc2MgPSBJWEdCRV9UWF9DVFhUREVTQ19BRFYodHhfcmluZywgaSk7CisKKwlpKys7CisJdHhfcmluZy0+bmV4dF90b191c2UgPSAoaSA8IHR4X3JpbmctPmNvdW50KSA/IGkgOiAwOworCisJLyogc2V0IGJpdHMgdG8gaWRlbnRpZnkgdGhpcyBhcyBhbiBhZHZhbmNlZCBjb250ZXh0IGRlc2NyaXB0b3IgKi8KKwl0eXBlX3R1Y21kIHw9IElYR0JFX1RYRF9DTURfREVYVCB8IElYR0JFX0FEVlRYRF9EVFlQX0NUWFQ7CisKKwljb250ZXh0X2Rlc2MtPnZsYW5fbWFjaXBfbGVucwk9IGNwdV90b19sZTMyKHZsYW5fbWFjaXBfbGVucyk7CisJY29udGV4dF9kZXNjLT5zZXFudW1fc2VlZAk9IGNwdV90b19sZTMyKGZjb2Vfc29mX2VvZik7CisJY29udGV4dF9kZXNjLT50eXBlX3R1Y21kX21saGwJPSBjcHVfdG9fbGUzMih0eXBlX3R1Y21kKTsKKwljb250ZXh0X2Rlc2MtPm1zc19sNGxlbl9pZHgJPSBjcHVfdG9fbGUzMihtc3NfbDRsZW5faWR4KTsKK30KKworc3RhdGljIGludCBpeGdiZV90c28oc3RydWN0IGl4Z2JlX3JpbmcgKnR4X3JpbmcsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgdTMyIHR4X2ZsYWdzLCBfX2JlMTYgcHJvdG9jb2wsIHU4ICpoZHJfbGVuKQorewogCWludCBlcnI7Ci0Jc3RydWN0IGl4Z2JlX3R4X2J1ZmZlciAqdHhfYnVmZmVyX2luZm87Ci0JdTMyIHZsYW5fbWFjaXBfbGVucyA9IDAsIHR5cGVfdHVjbWRfbWxobDsKKwl1MzIgdmxhbl9tYWNpcF9sZW5zLCB0eXBlX3R1Y21kOwogCXUzMiBtc3NfbDRsZW5faWR4LCBsNGxlbjsKIAotCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKLQkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikpIHsKLQkJCWVyciA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKTsKLQkJCWlmIChlcnIpCi0JCQkJcmV0dXJuIGVycjsKLQkJfQotCQlsNGxlbiA9IHRjcF9oZHJsZW4oc2tiKTsKLQkJKmhkcl9sZW4gKz0gbDRsZW47CisJaWYgKCFza2JfaXNfZ3NvKHNrYikpCisJCXJldHVybiAwOwogCi0JCWlmIChwcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKLQkJCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7Ci0JCQlpcGgtPnRvdF9sZW4gPSAwOwotCQkJaXBoLT5jaGVjayA9IDA7Ci0JCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsCi0JCQkJCQkJCSBpcGgtPmRhZGRyLCAwLAotCQkJCQkJCQkgSVBQUk9UT19UQ1AsCi0JCQkJCQkJCSAwKTsKLQkJfSBlbHNlIGlmIChza2JfaXNfZ3NvX3Y2KHNrYikpIHsKLQkJCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gMDsKLQkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPQotCQkJICAgIH5jc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLAotCQkJCQkgICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwKLQkJCQkJICAgICAwLCBJUFBST1RPX1RDUCwgMCk7Ci0JCX0KLQotCQlpID0gdHhfcmluZy0+bmV4dF90b191c2U7Ci0KLQkJdHhfYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+dHhfYnVmZmVyX2luZm9baV07Ci0JCWNvbnRleHRfZGVzYyA9IElYR0JFX1RYX0NUWFRERVNDX0FEVih0eF9yaW5nLCBpKTsKLQotCQkvKiBWTEFOIE1BQ0xFTiBJUExFTiAqLwotCQlpZiAodHhfZmxhZ3MgJiBJWEdCRV9UWF9GTEFHU19WTEFOKQotCQkJdmxhbl9tYWNpcF9sZW5zIHw9Ci0JCQkgICAgKHR4X2ZsYWdzICYgSVhHQkVfVFhfRkxBR1NfVkxBTl9NQVNLKTsKLQkJdmxhbl9tYWNpcF9sZW5zIHw9ICgoc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpIDw8Ci0JCQkJICAgIElYR0JFX0FEVlRYRF9NQUNMRU5fU0hJRlQpOwotCQkqaGRyX2xlbiArPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKLQkJdmxhbl9tYWNpcF9sZW5zIHw9Ci0JCSAgICAoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKLQkJKmhkcl9sZW4gKz0KLQkJICAgIChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOwotCQljb250ZXh0X2Rlc2MtPnZsYW5fbWFjaXBfbGVucyA9IGNwdV90b19sZTMyKHZsYW5fbWFjaXBfbGVucyk7Ci0JCWNvbnRleHRfZGVzYy0+c2VxbnVtX3NlZWQgPSAwOwotCi0JCS8qIEFEViBEVFlQIFRVQ01EIE1LUkxPQy9JU0NTSUhFRExFTiAqLwotCQl0eXBlX3R1Y21kX21saGwgPSAoSVhHQkVfVFhEX0NNRF9ERVhUIHwKLQkJCQkgICBJWEdCRV9BRFZUWERfRFRZUF9DVFhUKTsKLQotCQlpZiAocHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQotCQkJdHlwZV90dWNtZF9tbGhsIHw9IElYR0JFX0FEVlRYRF9UVUNNRF9JUFY0OwotCQl0eXBlX3R1Y21kX21saGwgfD0gSVhHQkVfQURWVFhEX1RVQ01EX0w0VF9UQ1A7Ci0JCWNvbnRleHRfZGVzYy0+dHlwZV90dWNtZF9tbGhsID0gY3B1X3RvX2xlMzIodHlwZV90dWNtZF9tbGhsKTsKLQotCQkvKiBNU1MgTDRMRU4gSURYICovCi0JCW1zc19sNGxlbl9pZHggPQotCQkgICAgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPDwgSVhHQkVfQURWVFhEX01TU19TSElGVCk7Ci0JCW1zc19sNGxlbl9pZHggfD0gKGw0bGVuIDw8IElYR0JFX0FEVlRYRF9MNExFTl9TSElGVCk7Ci0JCS8qIHVzZSBpbmRleCAxIGZvciBUU08gKi8KLQkJbXNzX2w0bGVuX2lkeCB8PSAoMSA8PCBJWEdCRV9BRFZUWERfSURYX1NISUZUKTsKLQkJY29udGV4dF9kZXNjLT5tc3NfbDRsZW5faWR4ID0gY3B1X3RvX2xlMzIobXNzX2w0bGVuX2lkeCk7Ci0KLQkJdHhfYnVmZmVyX2luZm8tPnRpbWVfc3RhbXAgPSBqaWZmaWVzOwotCQl0eF9idWZmZXJfaW5mby0+bmV4dF90b193YXRjaCA9IGk7Ci0KLQkJaSsrOwotCQlpZiAoaSA9PSB0eF9yaW5nLT5jb3VudCkKLQkJCWkgPSAwOwotCQl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IGk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHUzMiBpeGdiZV9wc3VtKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBfX2JlMTYgcHJvdG9jb2wpCi17Ci0JdTMyIHJ0biA9IDA7Ci0KLQlzd2l0Y2ggKHByb3RvY29sKSB7Ci0JY2FzZSBjcHVfdG9fYmUxNihFVEhfUF9JUCk6Ci0JCXJ0biB8PSBJWEdCRV9BRFZUWERfVFVDTURfSVBWNDsKLQkJc3dpdGNoIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wpIHsKLQkJY2FzZSBJUFBST1RPX1RDUDoKLQkJCXJ0biB8PSBJWEdCRV9BRFZUWERfVFVDTURfTDRUX1RDUDsKLQkJCWJyZWFrOwotCQljYXNlIElQUFJPVE9fU0NUUDoKLQkJCXJ0biB8PSBJWEdCRV9BRFZUWERfVFVDTURfTDRUX1NDVFA7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIGNwdV90b19iZTE2KEVUSF9QX0lQVjYpOgotCQkvKiBYWFggd2hhdCBhYm91dCBvdGhlciBWNiBoZWFkZXJzPz8gKi8KLQkJc3dpdGNoIChpcHY2X2hkcihza2IpLT5uZXh0aGRyKSB7Ci0JCWNhc2UgSVBQUk9UT19UQ1A6Ci0JCQlydG4gfD0gSVhHQkVfQURWVFhEX1RVQ01EX0w0VF9UQ1A7Ci0JCQlicmVhazsKLQkJY2FzZSBJUFBST1RPX1NDVFA6Ci0JCQlydG4gfD0gSVhHQkVfQURWVFhEX1RVQ01EX0w0VF9TQ1RQOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaWYgKHVubGlrZWx5KG5ldF9yYXRlbGltaXQoKSkpCi0JCQllX3dhcm4ocHJvYmUsICJwYXJ0aWFsIGNoZWNrc3VtIGJ1dCBwcm90bz0leCFcbiIsCi0JCQkgICAgICAgcHJvdG9jb2wpOwotCQlicmVhazsKKwlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSkgeworCQllcnIgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAotCXJldHVybiBydG47CisJLyogQURWIERUWVAgVFVDTUQgTUtSTE9DL0lTQ1NJSEVETEVOICovCisJdHlwZV90dWNtZCA9IElYR0JFX0FEVlRYRF9UVUNNRF9MNFRfVENQOworCisJaWYgKHByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApKSB7CisJCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisJCWlwaC0+dG90X2xlbiA9IDA7CisJCWlwaC0+Y2hlY2sgPSAwOworCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsCisJCQkJCQkJIGlwaC0+ZGFkZHIsIDAsCisJCQkJCQkJIElQUFJPVE9fVENQLAorCQkJCQkJCSAwKTsKKwkJdHlwZV90dWNtZCB8PSBJWEdCRV9BRFZUWERfVFVDTURfSVBWNDsKKwl9IGVsc2UgaWYgKHNrYl9pc19nc29fdjYoc2tiKSkgeworCQlpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbiA9IDA7CisJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPQorCQkgICAgfmNzdW1faXB2Nl9tYWdpYygmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCisJCQkJICAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJICAgICAwLCBJUFBST1RPX1RDUCwgMCk7CisJfQorCisJbDRsZW4gPSB0Y3BfaGRybGVuKHNrYik7CisJKmhkcl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgbDRsZW47CisKKwkvKiBtc3NfbDRsZW5faWQ6IHVzZSAxIGFzIGluZGV4IGZvciBUU08gKi8KKwltc3NfbDRsZW5faWR4ID0gbDRsZW4gPDwgSVhHQkVfQURWVFhEX0w0TEVOX1NISUZUOworCW1zc19sNGxlbl9pZHggfD0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA8PCBJWEdCRV9BRFZUWERfTVNTX1NISUZUOworCW1zc19sNGxlbl9pZHggfD0gMSA8PCBJWEdCRV9BRFZUWERfSURYX1NISUZUOworCisJLyogdmxhbl9tYWNpcF9sZW5zOiBIRUFETEVOLCBNQUNMRU4sIFZMQU4gdGFnICovCisJdmxhbl9tYWNpcF9sZW5zID0gc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpOworCXZsYW5fbWFjaXBfbGVucyB8PSBza2JfbmV0d29ya19vZmZzZXQoc2tiKSA8PCBJWEdCRV9BRFZUWERfTUFDTEVOX1NISUZUOworCXZsYW5fbWFjaXBfbGVucyB8PSB0eF9mbGFncyAmIElYR0JFX1RYX0ZMQUdTX1ZMQU5fTUFTSzsKKworCWl4Z2JlX3R4X2N0eHRkZXNjKHR4X3JpbmcsIHZsYW5fbWFjaXBfbGVucywgMCwgdHlwZV90dWNtZCwKKwkgICAgICAgICAgICAgICAgICBtc3NfbDRsZW5faWR4KTsKKworCXJldHVybiAxOwogfQogCi1zdGF0aWMgYm9vbCBpeGdiZV90eF9jc3VtKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJICBzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZywKK3N0YXRpYyBib29sIGl4Z2JlX3R4X2NzdW0oc3RydWN0IGl4Z2JlX3JpbmcgKnR4X3JpbmcsCiAJCQkgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiB0eF9mbGFncywKIAkJCSAgX19iZTE2IHByb3RvY29sKQogewotCXN0cnVjdCBpeGdiZV9hZHZfdHhfY29udGV4dF9kZXNjICpjb250ZXh0X2Rlc2M7Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IGl4Z2JlX3R4X2J1ZmZlciAqdHhfYnVmZmVyX2luZm87Ci0JdTMyIHZsYW5fbWFjaXBfbGVucyA9IDAsIHR5cGVfdHVjbWRfbWxobCA9IDA7CisJdTMyIHZsYW5fbWFjaXBfbGVucyA9IDA7CisJdTMyIG1zc19sNGxlbl9pZHggPSAwOworCXUzMiB0eXBlX3R1Y21kID0gMDsKIAotCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMIHx8Ci0JICAgICh0eF9mbGFncyAmIElYR0JFX1RYX0ZMQUdTX1ZMQU4pKSB7Ci0JCWkgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKLQkJdHhfYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+dHhfYnVmZmVyX2luZm9baV07Ci0JCWNvbnRleHRfZGVzYyA9IElYR0JFX1RYX0NUWFRERVNDX0FEVih0eF9yaW5nLCBpKTsKKwlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgeworCSAgICBpZiAoISh0eF9mbGFncyAmIElYR0JFX1RYX0ZMQUdTX1ZMQU4pKQorCQkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCXU4IGw0X2hkciA9IDA7CisJCXN3aXRjaCAocHJvdG9jb2wpIHsKKwkJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKwkJCXZsYW5fbWFjaXBfbGVucyB8PSBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYik7CisJCQl0eXBlX3R1Y21kIHw9IElYR0JFX0FEVlRYRF9UVUNNRF9JUFY0OworCQkJbDRfaGRyID0gaXBfaGRyKHNrYiktPnByb3RvY29sOworCQkJYnJlYWs7CisJCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KToKKwkJCXZsYW5fbWFjaXBfbGVucyB8PSBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYik7CisJCQlsNF9oZHIgPSBpcHY2X2hkcihza2IpLT5uZXh0aGRyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAodW5saWtlbHkobmV0X3JhdGVsaW1pdCgpKSkgeworCQkJCWRldl93YXJuKHR4X3JpbmctPmRldiwKKwkJCQkgInBhcnRpYWwgY2hlY2tzdW0gYnV0IHByb3RvPSV4IVxuIiwKKwkJCQkgc2tiLT5wcm90b2NvbCk7CisJCQl9CisJCQlicmVhazsKKwkJfQogCi0JCWlmICh0eF9mbGFncyAmIElYR0JFX1RYX0ZMQUdTX1ZMQU4pCi0JCQl2bGFuX21hY2lwX2xlbnMgfD0KLQkJCSAgICAodHhfZmxhZ3MgJiBJWEdCRV9UWF9GTEFHU19WTEFOX01BU0spOwotCQl2bGFuX21hY2lwX2xlbnMgfD0gKHNrYl9uZXR3b3JrX29mZnNldChza2IpIDw8Ci0JCQkJICAgIElYR0JFX0FEVlRYRF9NQUNMRU5fU0hJRlQpOwotCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKLQkJCXZsYW5fbWFjaXBfbGVucyB8PSAoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtCi0JCQkJCSAgICBza2JfbmV0d29ya19oZWFkZXIoc2tiKSk7Ci0KLQkJY29udGV4dF9kZXNjLT52bGFuX21hY2lwX2xlbnMgPSBjcHVfdG9fbGUzMih2bGFuX21hY2lwX2xlbnMpOwotCQljb250ZXh0X2Rlc2MtPnNlcW51bV9zZWVkID0gMDsKLQotCQl0eXBlX3R1Y21kX21saGwgfD0gKElYR0JFX1RYRF9DTURfREVYVCB8Ci0JCQkJICAgIElYR0JFX0FEVlRYRF9EVFlQX0NUWFQpOwotCi0JCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQotCQkJdHlwZV90dWNtZF9tbGhsIHw9IGl4Z2JlX3BzdW0oYWRhcHRlciwgc2tiLCBwcm90b2NvbCk7Ci0KLQkJY29udGV4dF9kZXNjLT50eXBlX3R1Y21kX21saGwgPSBjcHVfdG9fbGUzMih0eXBlX3R1Y21kX21saGwpOwotCQkvKiB1c2UgaW5kZXggemVybyBmb3IgdHggY2hlY2tzdW0gb2ZmbG9hZCAqLwotCQljb250ZXh0X2Rlc2MtPm1zc19sNGxlbl9pZHggPSAwOwotCi0JCXR4X2J1ZmZlcl9pbmZvLT50aW1lX3N0YW1wID0gamlmZmllczsKLQkJdHhfYnVmZmVyX2luZm8tPm5leHRfdG9fd2F0Y2ggPSBpOwotCi0JCWkrKzsKLQkJaWYgKGkgPT0gdHhfcmluZy0+Y291bnQpCi0JCQlpID0gMDsKLQkJdHhfcmluZy0+bmV4dF90b191c2UgPSBpOwotCi0JCXJldHVybiB0cnVlOworCQlzd2l0Y2ggKGw0X2hkcikgeworCQljYXNlIElQUFJPVE9fVENQOgorCQkJdHlwZV90dWNtZCB8PSBJWEdCRV9BRFZUWERfVFVDTURfTDRUX1RDUDsKKwkJCW1zc19sNGxlbl9pZHggPSB0Y3BfaGRybGVuKHNrYikgPDwKKwkJCQkJSVhHQkVfQURWVFhEX0w0TEVOX1NISUZUOworCQkJYnJlYWs7CisJCWNhc2UgSVBQUk9UT19TQ1RQOgorCQkJdHlwZV90dWNtZCB8PSBJWEdCRV9BRFZUWERfVFVDTURfTDRUX1NDVFA7CisJCQltc3NfbDRsZW5faWR4ID0gc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSA8PAorCQkJCQlJWEdCRV9BRFZUWERfTDRMRU5fU0hJRlQ7CisJCQlicmVhazsKKwkJY2FzZSBJUFBST1RPX1VEUDoKKwkJCW1zc19sNGxlbl9pZHggPSBzaXplb2Yoc3RydWN0IHVkcGhkcikgPDwKKwkJCQkJSVhHQkVfQURWVFhEX0w0TEVOX1NISUZUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAodW5saWtlbHkobmV0X3JhdGVsaW1pdCgpKSkgeworCQkJCWRldl93YXJuKHR4X3JpbmctPmRldiwKKwkJCQkgInBhcnRpYWwgY2hlY2tzdW0gYnV0IGw0IHByb3RvPSV4IVxuIiwKKwkJCQkgc2tiLT5wcm90b2NvbCk7CisJCQl9CisJCQlicmVhazsKKwkJfQogCX0KIAotCXJldHVybiBmYWxzZTsKKwl2bGFuX21hY2lwX2xlbnMgfD0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgPDwgSVhHQkVfQURWVFhEX01BQ0xFTl9TSElGVDsKKwl2bGFuX21hY2lwX2xlbnMgfD0gdHhfZmxhZ3MgJiBJWEdCRV9UWF9GTEFHU19WTEFOX01BU0s7CisKKwlpeGdiZV90eF9jdHh0ZGVzYyh0eF9yaW5nLCB2bGFuX21hY2lwX2xlbnMsIDAsCisJCQkgIHR5cGVfdHVjbWQsIG1zc19sNGxlbl9pZHgpOworCisJcmV0dXJuIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKTsKIH0KIAogc3RhdGljIGludCBpeGdiZV90eF9tYXAoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCkBAIC02NTg4LDExICs2NDEzLDEyIEBACiAJc3RydWN0IGl4Z2JlX3R4X2J1ZmZlciAqdHhfYnVmZmVyX2luZm87CiAJdW5zaWduZWQgaW50IGxlbjsKIAl1bnNpZ25lZCBpbnQgdG90YWwgPSBza2ItPmxlbjsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMCwgc2l6ZSwgY291bnQgPSAwLCBpOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwLCBzaXplLCBjb3VudCA9IDA7CiAJdW5zaWduZWQgaW50IG5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKIAl1bnNpZ25lZCBpbnQgZjsKIAl1bnNpZ25lZCBpbnQgYnl0ZWNvdW50ID0gc2tiLT5sZW47CiAJdTE2IGdzb19zZWdzID0gMTsKKwl1MTYgaTsKIAogCWkgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKIApAQCAtNjg1OCw3ICs2Njg0LDcgQEAKIAkJCQkJICAgICAgaW5wdXQsIGNvbW1vbiwgcmluZy0+cXVldWVfaW5kZXgpOwogfQogCi1zdGF0aWMgaW50IF9faXhnYmVfbWF5YmVfc3RvcF90eChzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZywgaW50IHNpemUpCitzdGF0aWMgaW50IF9faXhnYmVfbWF5YmVfc3RvcF90eChzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZywgdTE2IHNpemUpCiB7CiAJbmV0aWZfc3RvcF9zdWJxdWV1ZSh0eF9yaW5nLT5uZXRkZXYsIHR4X3JpbmctPnF1ZXVlX2luZGV4KTsKIAkvKiBIZXJiZXJ0J3Mgb3JpZ2luYWwgcGF0Y2ggaGFkOgpAQCAtNjg2OCw3ICs2Njk0LDcgQEAKIAogCS8qIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4gaW4gYSBjYXNlIGFub3RoZXIgQ1BVIGhhcyBqdXN0CiAJICogbWFkZSByb29tIGF2YWlsYWJsZS4gKi8KLQlpZiAobGlrZWx5KElYR0JFX0RFU0NfVU5VU0VEKHR4X3JpbmcpIDwgc2l6ZSkpCisJaWYgKGxpa2VseShpeGdiZV9kZXNjX3VudXNlZCh0eF9yaW5nKSA8IHNpemUpKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJLyogQSByZXByaWV2ZSEgLSB1c2Ugc3RhcnRfcXVldWUgYmVjYXVzZSBpdCBkb2Vzbid0IGNhbGwgc2NoZWR1bGUgKi8KQEAgLTY4NzcsOSArNjcwMyw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaXhnYmVfbWF5YmVfc3RvcF90eChzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZywgaW50IHNpemUpCitzdGF0aWMgaW5saW5lIGludCBpeGdiZV9tYXliZV9zdG9wX3R4KHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLCB1MTYgc2l6ZSkKIHsKLQlpZiAobGlrZWx5KElYR0JFX0RFU0NfVU5VU0VEKHR4X3JpbmcpID49IHNpemUpKQorCWlmIChsaWtlbHkoaXhnYmVfZGVzY191bnVzZWQodHhfcmluZykgPj0gc2l6ZSkpCiAJCXJldHVybiAwOwogCXJldHVybiBfX2l4Z2JlX21heWJlX3N0b3BfdHgodHhfcmluZywgc2l6ZSk7CiB9CkBAIC02ODg3LDExICs2NzEzLDEwIEBACiBzdGF0aWMgdTE2IGl4Z2JlX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgdHhxID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWludCB0eHEgPSBza2JfcnhfcXVldWVfcmVjb3JkZWQoc2tiKSA/IHNrYl9nZXRfcnhfcXVldWUoc2tiKSA6CisJCQkJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCk7CiAjaWZkZWYgSVhHQkVfRkNPRQotCV9fYmUxNiBwcm90b2NvbDsKLQotCXByb3RvY29sID0gdmxhbl9nZXRfcHJvdG9jb2woc2tiKTsKKwlfX2JlMTYgcHJvdG9jb2wgPSB2bGFuX2dldF9wcm90b2NvbChza2IpOwogCiAJaWYgKCgocHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfRkNPRSkpIHx8CiAJICAgIChwcm90b2NvbCA9PSBodG9ucyhFVEhfUF9GSVApKSkgJiYKQEAgLTY5MTUsMTMgKzY3NDAsMzMgQEAKIAkJCSAgc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nKQogewotCXVuc2lnbmVkIGludCBmaXJzdDsKLQl1bnNpZ25lZCBpbnQgdHhfZmxhZ3MgPSAwOwotCXU4IGhkcl9sZW4gPSAwOwogCWludCB0c287Ci0JaW50IGNvdW50ID0gMDsKLQl1bnNpZ25lZCBpbnQgZjsKKwl1MzIgIHR4X2ZsYWdzID0gMDsKKyNpZiBQQUdFX1NJWkUgPiBJWEdCRV9NQVhfREFUQV9QRVJfVFhECisJdW5zaWduZWQgc2hvcnQgZjsKKyNlbmRpZgorCXUxNiBmaXJzdDsKKwl1MTYgY291bnQgPSBUWERfVVNFX0NPVU5UKHNrYl9oZWFkbGVuKHNrYikpOwogCV9fYmUxNiBwcm90b2NvbDsKKwl1OCBoZHJfbGVuID0gMDsKKworCS8qCisJICogbmVlZDogMSBkZXNjcmlwdG9yIHBlciBwYWdlICogUEFHRV9TSVpFL0lYR0JFX01BWF9EQVRBX1BFUl9UWEQsCisJICogICAgICAgKyAxIGRlc2MgZm9yIHNrYl9oZWFkX2xlbi9JWEdCRV9NQVhfREFUQV9QRVJfVFhELAorCSAqICAgICAgICsgMiBkZXNjIGdhcCB0byBrZWVwIHRhaWwgZnJvbSB0b3VjaGluZyBoZWFkLAorCSAqICAgICAgICsgMSBkZXNjIGZvciBjb250ZXh0IGRlc2NyaXB0b3IsCisJICogb3RoZXJ3aXNlIHRyeSBuZXh0IHRpbWUKKwkgKi8KKyNpZiBQQUdFX1NJWkUgPiBJWEdCRV9NQVhfREFUQV9QRVJfVFhECisJZm9yIChmID0gMDsgZiA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGYrKykKKwkJY291bnQgKz0gVFhEX1VTRV9DT1VOVChza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZdLnNpemUpOworI2Vsc2UKKwljb3VudCArPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworI2VuZGlmCisJaWYgKGl4Z2JlX21heWJlX3N0b3BfdHgodHhfcmluZywgY291bnQgKyAzKSkgeworCQl0eF9yaW5nLT50eF9zdGF0cy50eF9idXN5Kys7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CiAKIAlwcm90b2NvbCA9IHZsYW5fZ2V0X3Byb3RvY29sKHNrYik7CiAKQEAgLTY5NDYsNTEgKzY3OTEsMjkgQEAKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZDT0VfRU5BQkxFRCAmJgogCSAgICAocHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfRkNPRSkpKQogCQl0eF9mbGFncyB8PSBJWEdCRV9UWF9GTEFHU19GQ09FOworCiAjZW5kaWYKLQotCS8qIGZvdXIgdGhpbmdzIGNhbiBjYXVzZSB1cyB0byBuZWVkIGEgY29udGV4dCBkZXNjcmlwdG9yICovCi0JaWYgKHNrYl9pc19nc28oc2tiKSB8fAotCSAgICAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgfHwKLQkgICAgKHR4X2ZsYWdzICYgSVhHQkVfVFhfRkxBR1NfVkxBTikgfHwKLQkgICAgKHR4X2ZsYWdzICYgSVhHQkVfVFhfRkxBR1NfRkNPRSkpCi0JCWNvdW50Kys7Ci0KLQljb3VudCArPSBUWERfVVNFX0NPVU5UKHNrYl9oZWFkbGVuKHNrYikpOwotCWZvciAoZiA9IDA7IGYgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmKyspCi0JCWNvdW50ICs9IFRYRF9VU0VfQ09VTlQoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXS5zaXplKTsKLQotCWlmIChpeGdiZV9tYXliZV9zdG9wX3R4KHR4X3JpbmcsIGNvdW50KSkgewotCQl0eF9yaW5nLT50eF9zdGF0cy50eF9idXN5Kys7Ci0JCXJldHVybiBORVRERVZfVFhfQlVTWTsKLQl9Ci0KKwkvKiByZWNvcmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGZvciB0aGlzIHBhY2tldCAqLwogCWZpcnN0ID0gdHhfcmluZy0+bmV4dF90b191c2U7CisKIAlpZiAodHhfZmxhZ3MgJiBJWEdCRV9UWF9GTEFHU19GQ09FKSB7CiAjaWZkZWYgSVhHQkVfRkNPRQogCQkvKiBzZXR1cCB0eCBvZmZsb2FkIGZvciBGQ29FICovCi0JCXRzbyA9IGl4Z2JlX2ZzbyhhZGFwdGVyLCB0eF9yaW5nLCBza2IsIHR4X2ZsYWdzLCAmaGRyX2xlbik7Ci0JCWlmICh0c28gPCAwKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKLQkJfQotCQlpZiAodHNvKQorCQl0c28gPSBpeGdiZV9mc28odHhfcmluZywgc2tiLCB0eF9mbGFncywgJmhkcl9sZW4pOworCQlpZiAodHNvIDwgMCkKKwkJCWdvdG8gb3V0X2Ryb3A7CisJCWVsc2UgaWYgKHRzbykKIAkJCXR4X2ZsYWdzIHw9IElYR0JFX1RYX0ZMQUdTX0ZTTzsKICNlbmRpZiAvKiBJWEdCRV9GQ09FICovCiAJfSBlbHNlIHsKIAkJaWYgKHByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKIAkJCXR4X2ZsYWdzIHw9IElYR0JFX1RYX0ZMQUdTX0lQVjQ7Ci0JCXRzbyA9IGl4Z2JlX3RzbyhhZGFwdGVyLCB0eF9yaW5nLCBza2IsIHR4X2ZsYWdzLCAmaGRyX2xlbiwKLQkJCQlwcm90b2NvbCk7Ci0JCWlmICh0c28gPCAwKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKLQkJfQotCi0JCWlmICh0c28pCisJCXRzbyA9IGl4Z2JlX3Rzbyh0eF9yaW5nLCBza2IsIHR4X2ZsYWdzLCBwcm90b2NvbCwgJmhkcl9sZW4pOworCQlpZiAodHNvIDwgMCkKKwkJCWdvdG8gb3V0X2Ryb3A7CisJCWVsc2UgaWYgKHRzbykKIAkJCXR4X2ZsYWdzIHw9IElYR0JFX1RYX0ZMQUdTX1RTTzsKLQkJZWxzZSBpZiAoaXhnYmVfdHhfY3N1bShhZGFwdGVyLCB0eF9yaW5nLCBza2IsIHR4X2ZsYWdzLAotCQkJCSAgICAgICBwcm90b2NvbCkgJiYKLQkJCSAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpCisJCWVsc2UgaWYgKGl4Z2JlX3R4X2NzdW0odHhfcmluZywgc2tiLCB0eF9mbGFncywgcHJvdG9jb2wpKQogCQkJdHhfZmxhZ3MgfD0gSVhHQkVfVFhfRkxBR1NfQ1NVTTsKIAl9CiAKQEAgLTcwMDMsMTIgKzY4MjYsMTYgQEAKIAkJaXhnYmVfbWF5YmVfc3RvcF90eCh0eF9yaW5nLCBERVNDX05FRURFRCk7CiAKIAl9IGVsc2UgewotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQl0eF9yaW5nLT50eF9idWZmZXJfaW5mb1tmaXJzdF0udGltZV9zdGFtcCA9IDA7CiAJCXR4X3JpbmctPm5leHRfdG9fdXNlID0gZmlyc3Q7CisJCWdvdG8gb3V0X2Ryb3A7CiAJfQogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworb3V0X2Ryb3A6CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCiBzdGF0aWMgbmV0ZGV2X3R4X3QgaXhnYmVfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpAQCAtNzE5OCw2ICs3MDI1LDE3NyBAQAogCXJldHVybiBzdGF0czsKIH0KIAorLyogaXhnYmVfdmFsaWRhdGVfcnRyIC0gdmVyaWZ5IDgwMi4xUXAgdG8gUnggcGFja2V0IGJ1ZmZlciBtYXBwaW5nIGlzIHZhbGlkLgorICogI2FkYXB0ZXI6IHBvaW50ZXIgdG8gaXhnYmVfYWRhcHRlcgorICogQHRjOiBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzIGN1cnJlbnRseSBlbmFibGVkCisgKgorICogQ29uZmlndXJlIGEgdmFsaWQgODAyLjFRcCB0byBSeCBwYWNrZXQgYnVmZmVyIG1hcHBpbmcgaWUgY29uZmlybQorICogODAyLjFRIHByaW9yaXR5IG1hcHMgdG8gYSBwYWNrZXQgYnVmZmVyIHRoYXQgZXhpc3RzLgorICovCitzdGF0aWMgdm9pZCBpeGdiZV92YWxpZGF0ZV9ydHIoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IHRjKQoreworCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTMyIHJlZywgcnNhdmU7CisJaW50IGk7CisKKwkvKiA4MjU5OCBoYXZlIGEgc3RhdGljIHByaW9yaXR5IHRvIFRDIG1hcHBpbmcgdGhhdCBjYW4gbm90CisJICogYmUgY2hhbmdlZCBzbyBubyB2YWxpZGF0aW9uIGlzIG5lZWRlZC4KKwkgKi8KKwlpZiAoaHctPm1hYy50eXBlID09IGl4Z2JlX21hY184MjU5OEVCKQorCQlyZXR1cm47CisKKwlyZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUlRSVVAyVEMpOworCXJzYXZlID0gcmVnOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9UUkFGRklDX0NMQVNTOyBpKyspIHsKKwkJdTggdXAydGMgPSByZWcgPj4gKGkgKiBJWEdCRV9SVFJVUDJUQ19VUF9TSElGVCk7CisKKwkJLyogSWYgdXAydGMgaXMgb3V0IG9mIGJvdW5kcyBkZWZhdWx0IHRvIHplcm8gKi8KKwkJaWYgKHVwMnRjID4gdGMpCisJCQlyZWcgJj0gfigweDcgPDwgSVhHQkVfUlRSVVAyVENfVVBfU0hJRlQpOworCX0KKworCWlmIChyZWcgIT0gcnNhdmUpCisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlRSVVAyVEMsIHJlZyk7CisKKwlyZXR1cm47Cit9CisKKworLyogaXhnYmVfc2V0dXBfdGMgLSByb3V0aW5lIHRvIGNvbmZpZ3VyZSBuZXRfZGV2aWNlIGZvciBtdWx0aXBsZSB0cmFmZmljCisgKiBjbGFzc2VzLgorICoKKyAqIEBuZXRkZXY6IG5ldCBkZXZpY2UgdG8gY29uZmlndXJlCisgKiBAdGM6IG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgdG8gZW5hYmxlCisgKi8KK2ludCBpeGdiZV9zZXR1cF90YyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCB0YykKK3sKKwlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKworCS8qIElmIERDQiBpcyBhbmFibGVkIGRvIG5vdCByZW1vdmUgdHJhZmZpYyBjbGFzc2VzLCBtdWx0aXBsZQorCSAqIHRyYWZmaWMgY2xhc3NlcyBhcmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50IERDQgorCSAqLworCWlmICghdGMgJiYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19EQ0JfRU5BQkxFRCkpCisJCXJldHVybiAwOworCisJLyogSGFyZHdhcmUgc3VwcG9ydHMgdXAgdG8gOCB0cmFmZmljIGNsYXNzZXMgKi8KKwlpZiAodGMgPiBNQVhfVFJBRkZJQ19DTEFTUyB8fAorCSAgICAoaHctPm1hYy50eXBlID09IGl4Z2JlX21hY184MjU5OEVCICYmIHRjIDwgTUFYX1RSQUZGSUNfQ0xBU1MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEhhcmR3YXJlIGhhcyB0byByZWluaXRpYWxpemUgcXVldWVzIGFuZCBpbnRlcnJ1cHRzIHRvCisJICogbWF0Y2ggcGFja2V0IGJ1ZmZlciBhbGlnbm1lbnQuIFVuZm9ydHVuYW50bHksIHRoZQorCSAqIGhhcmR3YXJlIGlzIG5vdCBmbGV4aWJsZSBlbm91Z2ggdG8gZG8gdGhpcyBkeW5hbWljYWxseS4KKwkgKi8KKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlpeGdiZV9jbG9zZShkZXYpOworCWl4Z2JlX2NsZWFyX2ludGVycnVwdF9zY2hlbWUoYWRhcHRlcik7CisKKwlpZiAodGMpCisJCW5ldGRldl9zZXRfbnVtX3RjKGRldiwgdGMpOworCWVsc2UKKwkJbmV0ZGV2X3Jlc2V0X3RjKGRldik7CisKKwlpeGdiZV9pbml0X2ludGVycnVwdF9zY2hlbWUoYWRhcHRlcik7CisJaXhnYmVfdmFsaWRhdGVfcnRyKGFkYXB0ZXIsIHRjKTsKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlpeGdiZV9vcGVuKGRldik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpeGdiZV9kb19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWl4Z2JlX3JlaW5pdF9sb2NrZWQoYWRhcHRlcik7CisJZWxzZQorCQlpeGdiZV9yZXNldChhZGFwdGVyKTsKK30KKworc3RhdGljIHUzMiBpeGdiZV9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGRhdGEpCit7CisJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisjaWZkZWYgQ09ORklHX0RDQgorCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRENCX0VOQUJMRUQpCisJCWRhdGEgJj0gfk5FVElGX0ZfSFdfVkxBTl9SWDsKKyNlbmRpZgorCisJLyogcmV0dXJuIGVycm9yIGlmIFJYSEFTSCBpcyBiZWluZyBlbmFibGVkIHdoZW4gUlNTIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfUlNTX0VOQUJMRUQpKQorCQlkYXRhICY9IH5ORVRJRl9GX1JYSEFTSDsKKworCS8qIElmIFJ4IGNoZWNrc3VtIGlzIGRpc2FibGVkLCB0aGVuIFJTQy9MUk8gc2hvdWxkIGFsc28gYmUgZGlzYWJsZWQgKi8KKwlpZiAoIShkYXRhICYgTkVUSUZfRl9SWENTVU0pKQorCQlkYXRhICY9IH5ORVRJRl9GX0xSTzsKKworCS8qIFR1cm4gb2ZmIExSTyBpZiBub3QgUlNDIGNhcGFibGUgb3IgaW52YWxpZCBJVFIgc2V0dGluZ3MgKi8KKwlpZiAoIShhZGFwdGVyLT5mbGFnczIgJiBJWEdCRV9GTEFHMl9SU0NfQ0FQQUJMRSkpIHsKKwkJZGF0YSAmPSB+TkVUSUZfRl9MUk87CisJfSBlbHNlIGlmICghKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1JTQ19FTkFCTEVEKSAmJgorCQkgICAoYWRhcHRlci0+cnhfaXRyX3NldHRpbmcgIT0gMSAmJgorCQkgICAgYWRhcHRlci0+cnhfaXRyX3NldHRpbmcgPiBJWEdCRV9NQVhfUlNDX0lOVF9SQVRFKSkgeworCQlkYXRhICY9IH5ORVRJRl9GX0xSTzsKKwkJZV9pbmZvKHByb2JlLCAicngtdXNlY3Mgc2V0IHRvbyBsb3csIG5vdCBlbmFibGluZyBSU0NcbiIpOworCX0KKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IGl4Z2JlX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYm9vbCBuZWVkX3Jlc2V0ID0gZmFsc2U7CisKKwkvKiBJZiBSeCBjaGVja3N1bSBpcyBkaXNhYmxlZCwgdGhlbiBSU0MvTFJPIHNob3VsZCBhbHNvIGJlIGRpc2FibGVkICovCisJaWYgKCEoZGF0YSAmIE5FVElGX0ZfUlhDU1VNKSkKKwkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfUlhfQ1NVTV9FTkFCTEVEOworCWVsc2UKKwkJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19SWF9DU1VNX0VOQUJMRUQ7CisKKwkvKiBNYWtlIHN1cmUgUlNDIG1hdGNoZXMgTFJPLCByZXNldCBpZiBjaGFuZ2UgKi8KKwlpZiAoISEoZGF0YSAmIE5FVElGX0ZfTFJPKSAhPQorCSAgICAgISEoYWRhcHRlci0+ZmxhZ3MyICYgSVhHQkVfRkxBRzJfUlNDX0VOQUJMRUQpKSB7CisJCWFkYXB0ZXItPmZsYWdzMiBePSBJWEdCRV9GTEFHMl9SU0NfRU5BQkxFRDsKKwkJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgeworCQljYXNlIGl4Z2JlX21hY19YNTQwOgorCQljYXNlIGl4Z2JlX21hY184MjU5OUVCOgorCQkJbmVlZF9yZXNldCA9IHRydWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiBGbG93IERpcmVjdG9yIG4tdHVwbGUgc3VwcG9ydCB3YXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gIElmCisJICogdGhlIHN0YXRlIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmVzZXQuCisJICovCisJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0ZESVJfUEVSRkVDVF9DQVBBQkxFKSkgeworCQkvKiB0dXJuIG9mZiBBVFIsIGVuYWJsZSBwZXJmZWN0IGZpbHRlcnMgYW5kIHJlc2V0ICovCisJCWlmIChkYXRhICYgTkVUSUZfRl9OVFVQTEUpIHsKKwkJCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX0ZESVJfSEFTSF9DQVBBQkxFOworCQkJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19GRElSX1BFUkZFQ1RfQ0FQQUJMRTsKKwkJCW5lZWRfcmVzZXQgPSB0cnVlOworCQl9CisJfSBlbHNlIGlmICghKGRhdGEgJiBORVRJRl9GX05UVVBMRSkpIHsKKwkJLyogdHVybiBvZmYgRmxvdyBEaXJlY3Rvciwgc2V0IEFUUiBhbmQgcmVzZXQgKi8KKwkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfRkRJUl9QRVJGRUNUX0NBUEFCTEU7CisJCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiAgSVhHQkVfRkxBR19SU1NfRU5BQkxFRCkgJiYKKwkJICAgICEoYWRhcHRlci0+ZmxhZ3MgJiAgSVhHQkVfRkxBR19EQ0JfRU5BQkxFRCkpCisJCQlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX0ZESVJfSEFTSF9DQVBBQkxFOworCQluZWVkX3Jlc2V0ID0gdHJ1ZTsKKwl9CisKKwlpZiAobmVlZF9yZXNldCkKKwkJaXhnYmVfZG9fcmVzZXQobmV0ZGV2KTsKKworCXJldHVybiAwOworCit9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaXhnYmVfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gaXhnYmVfb3BlbiwKQEAgLTcyMTgsOSArNzIxNiw3IEBACiAJLm5kb19zZXRfdmZfdHhfcmF0ZQk9IGl4Z2JlX25kb19zZXRfdmZfYncsCiAJLm5kb19nZXRfdmZfY29uZmlnCT0gaXhnYmVfbmRvX2dldF92Zl9jb25maWcsCiAJLm5kb19nZXRfc3RhdHM2NAk9IGl4Z2JlX2dldF9zdGF0czY0LAotI2lmZGVmIENPTkZJR19JWEdCRV9EQ0IKIAkubmRvX3NldHVwX3RjCQk9IGl4Z2JlX3NldHVwX3RjLAotI2VuZGlmCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlcgk9IGl4Z2JlX25ldHBvbGwsCiAjZW5kaWYKQEAgLTcyMzIsNiArNzIyOCw4IEBACiAJLm5kb19mY29lX2Rpc2FibGUgPSBpeGdiZV9mY29lX2Rpc2FibGUsCiAJLm5kb19mY29lX2dldF93d24gPSBpeGdiZV9mY29lX2dldF93d24sCiAjZW5kaWYgLyogSVhHQkVfRkNPRSAqLworCS5uZG9fc2V0X2ZlYXR1cmVzID0gaXhnYmVfc2V0X2ZlYXR1cmVzLAorCS5uZG9fZml4X2ZlYXR1cmVzID0gaXhnYmVfZml4X2ZlYXR1cmVzLAogfTsKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGl4Z2JlX3Byb2JlX3ZmKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLApAQCAtNzM3OSwxNCArNzM3NywxNiBAQAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCisjaWZkZWYgQ09ORklHX0lYR0JFX0RDQgorCWluZGljZXMgKj0gTUFYX1RSQUZGSUNfQ0xBU1M7CisjZW5kaWYKKwogCWlmIChpaS0+bWFjID09IGl4Z2JlX21hY184MjU5OEVCKQogCQlpbmRpY2VzID0gbWluX3QodW5zaWduZWQgaW50LCBpbmRpY2VzLCBJWEdCRV9NQVhfUlNTX0lORElDRVMpOwogCWVsc2UKIAkJaW5kaWNlcyA9IG1pbl90KHVuc2lnbmVkIGludCwgaW5kaWNlcywgSVhHQkVfTUFYX0ZESVJfSU5ESUNFUyk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EQ0IpCi0JaW5kaWNlcyA9IG1heF90KHVuc2lnbmVkIGludCwgaW5kaWNlcywgSVhHQkVfTUFYX0RDQl9JTkRJQ0VTKTsKLSNlbGlmIGRlZmluZWQoSVhHQkVfRkNPRSkKKyNpZmRlZiBJWEdCRV9GQ09FCiAJaW5kaWNlcyArPSBtaW5fdCh1bnNpZ25lZCBpbnQsIG51bV9wb3NzaWJsZV9jcHVzKCksCiAJCQkgSVhHQkVfTUFYX0ZDT0VfSU5ESUNFUyk7CiAjZW5kaWYKQEAgLTc0OTcsMjAgKzc0OTcsMjQgQEAKIAogCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwKIAkJCSAgIE5FVElGX0ZfSVBfQ1NVTSB8CisJCQkgICBORVRJRl9GX0lQVjZfQ1NVTSB8CiAJCQkgICBORVRJRl9GX0hXX1ZMQU5fVFggfAogCQkJICAgTkVUSUZfRl9IV19WTEFOX1JYIHwKLQkJCSAgIE5FVElGX0ZfSFdfVkxBTl9GSUxURVI7CisJCQkgICBORVRJRl9GX0hXX1ZMQU5fRklMVEVSIHwKKwkJCSAgIE5FVElGX0ZfVFNPIHwKKwkJCSAgIE5FVElGX0ZfVFNPNiB8CisJCQkgICBORVRJRl9GX0dSTyB8CisJCQkgICBORVRJRl9GX1JYSEFTSCB8CisJCQkgICBORVRJRl9GX1JYQ1NVTTsKIAotCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUFY2X0NTVU07Ci0JbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKLQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKLQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfR1JPOwotCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9SWEhBU0g7CisJbmV0ZGV2LT5od19mZWF0dXJlcyA9IG5ldGRldi0+ZmVhdHVyZXM7CiAKIAlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hYy50eXBlKSB7CiAJY2FzZSBpeGdiZV9tYWNfODI1OTlFQjoKIAljYXNlIGl4Z2JlX21hY19YNTQwOgogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0NUUF9DU1VNOworCQluZXRkZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfU0NUUF9DU1VNIHwKKwkJCQkgICAgICAgTkVUSUZfRl9OVFVQTEU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtNzU0OSw2ICs3NTUzLDggQEAKIAkJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKIAl9CiAKKwlpZiAoYWRhcHRlci0+ZmxhZ3MyICYgSVhHQkVfRkxBRzJfUlNDX0NBUEFCTEUpCisJCW5ldGRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9MUk87CiAJaWYgKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1JTQ19FTkFCTEVEKQogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTFJPOwogCkBAIC03NTg1LDI1ICs3NTkxLDI0IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfc3dfaW5pdDsKIAotCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SU1NfRU5BQkxFRCkpCisJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1JTU19FTkFCTEVEKSkgeworCQluZXRkZXYtPmh3X2ZlYXR1cmVzICY9IH5ORVRJRl9GX1JYSEFTSDsKIAkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9SWEhBU0g7CisJfQogCiAJc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKIAljYXNlIElYR0JFX0RFVl9JRF84MjU5OV9TRlA6CiAJCS8qIE9ubHkgdGhpcyBzdWJkZXZpY2Ugc3VwcG9ydHMgV09MICovCiAJCWlmIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IElYR0JFX1NVQkRFVl9JRF84MjU5OV9TRlApCi0JCQlhZGFwdGVyLT53b2wgPSAoSVhHQkVfV1VGQ19NQUcgfCBJWEdCRV9XVUZDX0VYIHwKLQkJCSAgICAgICAgICAgICAgICBJWEdCRV9XVUZDX01DIHwgSVhHQkVfV1VGQ19CQyk7CisJCQlhZGFwdGVyLT53b2wgPSBJWEdCRV9XVUZDX01BRzsKIAkJYnJlYWs7CiAJY2FzZSBJWEdCRV9ERVZfSURfODI1OTlfQ09NQk9fQkFDS1BMQU5FOgogCQkvKiBBbGwgZXhjZXB0IHRoaXMgc3ViZGV2aWNlIHN1cHBvcnQgV09MICovCiAJCWlmIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICE9IElYR0JFX1NVQkRFVl9JRF84MjU5OV9LWDRfS1JfTUVaWikKLQkJCWFkYXB0ZXItPndvbCA9IChJWEdCRV9XVUZDX01BRyB8IElYR0JFX1dVRkNfRVggfAotCQkJICAgICAgICAgICAgICAgIElYR0JFX1dVRkNfTUMgfCBJWEdCRV9XVUZDX0JDKTsKKwkJCWFkYXB0ZXItPndvbCA9IElYR0JFX1dVRkNfTUFHOwogCQlicmVhazsKIAljYXNlIElYR0JFX0RFVl9JRF84MjU5OV9LWDQ6Ci0JCWFkYXB0ZXItPndvbCA9IChJWEdCRV9XVUZDX01BRyB8IElYR0JFX1dVRkNfRVggfAotCQkJCUlYR0JFX1dVRkNfTUMgfCBJWEdCRV9XVUZDX0JDKTsKKwkJYWRhcHRlci0+d29sID0gSVhHQkVfV1VGQ19NQUc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWFkYXB0ZXItPndvbCA9IDA7CkBAIC03Njc4LDYgKzc2ODMsMTEgQEAKIAkJCWl4Z2JlX3ZmX2NvbmZpZ3VyYXRpb24ocGRldiwgKGkgfCAweDEwMDAwMDAwKSk7CiAJfQogCisJLyogSW5mb3JtIGZpcm13YXJlIG9mIGRyaXZlciB2ZXJzaW9uICovCisJaWYgKGh3LT5tYWMub3BzLnNldF9md19kcnZfdmVyKQorCQlody0+bWFjLm9wcy5zZXRfZndfZHJ2X3ZlcihodywgTUFKLCBNSU4sIEJVSUxELAorCQkJCQkgICBGV19DRU1fVU5VU0VEX1ZFUik7CisKIAkvKiBhZGQgc2FuIG1hYyBhZGRyIHRvIG5ldGRldiAqLwogCWl4Z2JlX2FkZF9zYW5tYWNfbmV0ZGV2KG5ldGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3NyaW92LmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9zcmlvdi5jCmluZGV4IGFjOTliMDQuLmQ5OWQwMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3NyaW92LmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfc3Jpb3YuYwpAQCAtNjA1LDYgKzYwNSwyMiBAQAogCX0KIAogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlRURFFTRUwsIDIqdmYpOyAvKiB2ZiBZIHVzZXMgcXVldWUgMipZICovCisJLyoKKwkgKiBTZXQgZ2xvYmFsIHRyYW5zbWl0IGNvbXBlbnNhdGlvbiB0aW1lIHRvIHRoZSBNTVdfU0laRSBpbiBSVFRCQ05STQorCSAqIHJlZ2lzdGVyLiBUeXBpY2FsbHkgTU1XX1NJWkU9MHgwMTQgaWYgOTcyOC1ieXRlIGp1bWJvIGlzIHN1cHBvcnRlZAorCSAqIGFuZCAweDAwNCBvdGhlcndpc2UuCisJICovCisJc3dpdGNoIChody0+bWFjLnR5cGUpIHsKKwljYXNlIGl4Z2JlX21hY184MjU5OUVCOgorCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JUVEJDTlJNLCAweDQpOworCQlicmVhazsKKwljYXNlIGl4Z2JlX21hY19YNTQwOgorCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JUVEJDTlJNLCAweDE0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SVFRCQ05SQywgYmNucmNfdmFsKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfdHlwZS5oIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfdHlwZS5oCmluZGV4IGZhNDNmMjUuLmUwZDk3MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3R5cGUuaAorKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV90eXBlLmgKQEAgLTUzNCw3ICs1MzQsNyBAQAogI2RlZmluZSBJWEdCRV9SVFRCQ05SQ19SRl9JTlRfU0hJRlQJMTQKICNkZWZpbmUgSVhHQkVfUlRUQkNOUkNfUkZfSU5UX01BU0sJXAogCShJWEdCRV9SVFRCQ05SQ19SRl9ERUNfTUFTSyA8PCBJWEdCRV9SVFRCQ05SQ19SRl9JTlRfU0hJRlQpCi0KKyNkZWZpbmUgSVhHQkVfUlRUQkNOUk0gICAgMHgwNDk4MAogCiAvKiBGQ29FIERNQSBDb250ZXh0IFJlZ2lzdGVycyAqLwogI2RlZmluZSBJWEdCRV9GQ1BUUkwgICAgMHgwMjQxMCAvKiBGQyBVc2VyIERlc2MuIFBUUiBMb3cgKi8KQEAgLTcwNyw2ICs3MDcsMTMgQEAKICNkZWZpbmUgSVhHQkVfSEZEUiAgICAgIDB4MTVGRTgKICNkZWZpbmUgSVhHQkVfRkxFWF9NTkcgIDB4MTU4MDAgLyogMHgxNTgwMCAtIDB4MTVFRkMgKi8KIAorI2RlZmluZSBJWEdCRV9ISUNSX0VOICAgICAgICAgICAgICAweDAxICAvKiBFbmFibGUgYml0IC0gUk8gKi8KKy8qIERyaXZlciBzZXRzIHRoaXMgYml0IHdoZW4gZG9uZSB0byBwdXQgY29tbWFuZCBpbiBSQU0gKi8KKyNkZWZpbmUgSVhHQkVfSElDUl9DICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBJWEdCRV9ISUNSX1NWICAgICAgICAgICAgICAweDA0ICAvKiBTdGF0dXMgVmFsaWRpdHkgKi8KKyNkZWZpbmUgSVhHQkVfSElDUl9GV19SRVNFVF9FTkFCTEUgMHg0MAorI2RlZmluZSBJWEdCRV9ISUNSX0ZXX1JFU0VUICAgICAgICAweDgwCisKIC8qIFBDSS1FIHJlZ2lzdGVycyAqLwogI2RlZmluZSBJWEdCRV9HQ1IgICAgICAgMHgxMTAwMAogI2RlZmluZSBJWEdCRV9HVFYgICAgICAgMHgxMTAwNApAQCAtMTExOCw2ICsxMTI1LDI3IEBACiAjZGVmaW5lIElYR0JFX0dQSUVfVlRNT0RFXzMyICAgICAweDAwMDA4MDAwIC8qIDMyIFZGcyA0IHF1ZXVlcyBwZXIgVkYgKi8KICNkZWZpbmUgSVhHQkVfR1BJRV9WVE1PREVfNjQgICAgIDB4MDAwMEMwMDAgLyogNjQgVkZzIDIgcXVldWVzIHBlciBWRiAqLwogCisvKiBQYWNrZXQgQnVmZmVyIEluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIElYR0JFX1RYUEJTSVpFXzIwS0IgICAgIDB4MDAwMDUwMDAgLyogMjBLQiBQYWNrZXQgQnVmZmVyICovCisjZGVmaW5lIElYR0JFX1RYUEJTSVpFXzQwS0IgICAgIDB4MDAwMEEwMDAgLyogNDBLQiBQYWNrZXQgQnVmZmVyICovCisjZGVmaW5lIElYR0JFX1JYUEJTSVpFXzQ4S0IgICAgIDB4MDAwMEMwMDAgLyogNDhLQiBQYWNrZXQgQnVmZmVyICovCisjZGVmaW5lIElYR0JFX1JYUEJTSVpFXzY0S0IgICAgIDB4MDAwMTAwMDAgLyogNjRLQiBQYWNrZXQgQnVmZmVyICovCisjZGVmaW5lIElYR0JFX1JYUEJTSVpFXzgwS0IgICAgIDB4MDAwMTQwMDAgLyogODBLQiBQYWNrZXQgQnVmZmVyICovCisjZGVmaW5lIElYR0JFX1JYUEJTSVpFXzEyOEtCICAgIDB4MDAwMjAwMDAgLyogMTI4S0IgUGFja2V0IEJ1ZmZlciAqLworI2RlZmluZSBJWEdCRV9SWFBCU0laRV9NQVggICAgICAweDAwMDgwMDAwIC8qIDUxMktCIFBhY2tldCBCdWZmZXIqLworI2RlZmluZSBJWEdCRV9UWFBCU0laRV9NQVggICAgICAweDAwMDI4MDAwIC8qIDE2MEtCIFBhY2tldCBCdWZmZXIqLworCisjZGVmaW5lIElYR0JFX1RYUEtUX1NJWkVfTUFYICAgIDB4QSAgICAgICAgLyogTWF4IFR4IFBhY2tldCBzaXplICAqLworI2RlZmluZSBJWEdCRV9NQVhfUEIJCTgKKworLyogUGFja2V0IGJ1ZmZlciBhbGxvY2F0aW9uIHN0cmF0ZWdpZXMgKi8KK2VudW0geworCVBCQV9TVFJBVEVHWV9FUVVBTAk9IDAsCS8qIERpc3RyaWJ1dGUgUEIgc3BhY2UgZXF1YWxseSAqLworI2RlZmluZSBQQkFfU1RSQVRFR1lfRVFVQUwJUEJBX1NUUkFURUdZX0VRVUFMCisJUEJBX1NUUkFURUdZX1dFSUdIVEVECT0gMSwJLyogV2VpZ2h0IGZyb250IGhhbGYgb2YgVENzICovCisjZGVmaW5lIFBCQV9TVFJBVEVHWV9XRUlHSFRFRAlQQkFfU1RSQVRFR1lfV0VJR0hURUQKK307CisKIC8qIFRyYW5zbWl0IEZsb3cgQ29udHJvbCBzdGF0dXMgKi8KICNkZWZpbmUgSVhHQkVfVEZDU19UWE9GRiAgICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgSVhHQkVfVEZDU19UWE9GRjAgICAgICAgIDB4MDAwMDAxMDAKQEAgLTE4NjAsNiArMTg4OCw3IEBACiAjZGVmaW5lIElYR0JFX01UUUNfMzJWRiAgICAgICAgIDB4OCAvKiA0IFRYIFF1ZXVlcyBwZXIgcG9vbCB3LzMyVkYncyAqLwogI2RlZmluZSBJWEdCRV9NVFFDXzY0VkYgICAgICAgICAweDQgLyogMiBUWCBRdWV1ZXMgcGVyIHBvb2wgdy82NFZGJ3MgKi8KICNkZWZpbmUgSVhHQkVfTVRRQ184VENfOFRRICAgICAgMHhDIC8qIDggVEMgaWYgUlRfRU5BIG9yIDggVFEgaWYgVlRfRU5BICovCisjZGVmaW5lIElYR0JFX01UUUNfNFRDXzRUUQkweDggLyogNCBUQyBpZiBSVF9FTkEgb3IgNCBUUSBpZiBWVF9FTkEgKi8KIAogLyogUmVjZWl2ZSBEZXNjcmlwdG9yIGJpdCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBJWEdCRV9SWERfU1RBVF9ERCAgICAgICAweDAxICAgIC8qIERlc2NyaXB0b3IgRG9uZSAqLwpAQCAtMjAyNyw5ICsyMDU2LDEwIEBACiAjZGVmaW5lIElYR0JFX1ZGTFJFQyhfaSkgICAgICAgICAgICAgICAgICgweDAwNzAwICsgKF9pICogNCkpCiAKIGVudW0gaXhnYmVfZmRpcl9wYmFsbG9jX3R5cGUgewotCUlYR0JFX0ZESVJfUEJBTExPQ182NEsgPSAwLAotCUlYR0JFX0ZESVJfUEJBTExPQ18xMjhLLAotCUlYR0JFX0ZESVJfUEJBTExPQ18yNTZLLAorCUlYR0JFX0ZESVJfUEJBTExPQ19OT05FID0gMCwKKwlJWEdCRV9GRElSX1BCQUxMT0NfNjRLICA9IDEsCisJSVhHQkVfRkRJUl9QQkFMTE9DXzEyOEsgPSAyLAorCUlYR0JFX0ZESVJfUEJBTExPQ18yNTZLID0gMywKIH07CiAjZGVmaW5lIElYR0JFX0ZESVJfUEJBTExPQ19TSVpFX1NISUZUICAgICAgICAgICAxNgogCkBAIC0yMDgzLDcgKzIxMTMsNyBAQAogI2RlZmluZSBJWEdCRV9GRElSQ01EX0NNRF9BRERfRkxPVyAgICAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBJWEdCRV9GRElSQ01EX0NNRF9SRU1PVkVfRkxPVyAgICAgICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBJWEdCRV9GRElSQ01EX0NNRF9RVUVSWV9SRU1fRklMVCAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBJWEdCRV9GRElSQ01EX0NNRF9RVUVSWV9SRU1fSEFTSCAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBJWEdCRV9GRElSQ01EX0ZJTFRFUl9WQUxJRCAgICAgICAgICAgICAgMHgwMDAwMDAwNAogI2RlZmluZSBJWEdCRV9GRElSQ01EX0ZJTFRFUl9VUERBVEUgICAgICAgICAgICAgMHgwMDAwMDAwOAogI2RlZmluZSBJWEdCRV9GRElSQ01EX0lQdjZETUFUQ0ggICAgICAgICAgICAgICAgMHgwMDAwMDAxMAogI2RlZmluZSBJWEdCRV9GRElSQ01EX0w0VFlQRV9VRFAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMApAQCAtMjEwMiw2ICsyMTMyLDQ0IEBACiAjZGVmaW5lIElYR0JFX0ZESVJfSU5JVF9ET05FX1BPTEwgICAgICAgICAgICAgICAxMAogI2RlZmluZSBJWEdCRV9GRElSQ01EX0NNRF9QT0xMICAgICAgICAgICAgICAgICAgMTAKIAorI2RlZmluZSBJWEdCRV9GRElSX0RST1BfUVVFVUUgICAgICAgICAgICAgICAgICAgMTI3CisKKy8qIE1hbmFnZWFibGlsaXR5IEhvc3QgSW50ZXJmYWNlIGRlZmluZXMgKi8KKyNkZWZpbmUgSVhHQkVfSElfTUFYX0JMT0NLX0JZVEVfTEVOR1RIICAgICAgIDE3OTIgLyogTnVtIG9mIGJ5dGVzIGluIHJhbmdlICovCisjZGVmaW5lIElYR0JFX0hJX01BWF9CTE9DS19EV09SRF9MRU5HVEggICAgICA0NDggLyogTnVtIG9mIGR3b3JkcyBpbiByYW5nZSAqLworI2RlZmluZSBJWEdCRV9ISV9DT01NQU5EX1RJTUVPVVQgICAgICAgICAgICAgNTAwIC8qIFByb2Nlc3MgSEkgY29tbWFuZCBsaW1pdCAqLworCisvKiBDRU0gU3VwcG9ydCAqLworI2RlZmluZSBGV19DRU1fSERSX0xFTiAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgRldfQ0VNX0NNRF9EUklWRVJfSU5GTyAgICAgICAgMHhERAorI2RlZmluZSBGV19DRU1fQ01EX0RSSVZFUl9JTkZPX0xFTiAgICAweDUKKyNkZWZpbmUgRldfQ0VNX0NNRF9SRVNFUlZFRCAgICAgICAgICAgMHgwCisjZGVmaW5lIEZXX0NFTV9VTlVTRURfVkVSICAgICAgICAgICAgIDB4MAorI2RlZmluZSBGV19DRU1fTUFYX1JFVFJJRVMgICAgICAgICAgICAzCisjZGVmaW5lIEZXX0NFTV9SRVNQX1NUQVRVU19TVUNDRVNTICAgIDB4MQorCisvKiBIb3N0IEludGVyZmFjZSBDb21tYW5kIFN0cnVjdHVyZXMgKi8KK3N0cnVjdCBpeGdiZV9oaWNfaGRyIHsKKwl1OCBjbWQ7CisJdTggYnVmX2xlbjsKKwl1bmlvbiB7CisJCXU4IGNtZF9yZXN2OworCQl1OCByZXRfc3RhdHVzOworCX0gY21kX29yX3Jlc3A7CisJdTggY2hlY2tzdW07Cit9OworCitzdHJ1Y3QgaXhnYmVfaGljX2Rydl9pbmZvIHsKKwlzdHJ1Y3QgaXhnYmVfaGljX2hkciBoZHI7CisJdTggcG9ydF9udW07CisJdTggdmVyX3N1YjsKKwl1OCB2ZXJfYnVpbGQ7CisJdTggdmVyX21pbjsKKwl1OCB2ZXJfbWFqOworCXU4IHBhZDsgLyogZW5kIHNwYWNpbmcgdG8gZW5zdXJlIGxlbmd0aCBpcyBtdWx0LiBvZiBkd29yZCAqLworCXUxNiBwYWQyOyAvKiBlbmQgc3BhY2luZyB0byBlbnN1cmUgbGVuZ3RoIGlzIG11bHQuIG9mIGR3b3JkMiAqLworfTsKKwogLyogVHJhbnNtaXQgRGVzY3JpcHRvciAtIEFkdmFuY2VkICovCiB1bmlvbiBpeGdiZV9hZHZfdHhfZGVzYyB7CiAJc3RydWN0IHsKQEAgLTIyODYsNyArMjM1NCw3IEBACiAJICogc3JjX3BvcnQgICAtIDIgYnl0ZXMKIAkgKiBkc3RfcG9ydCAgIC0gMiBieXRlcwogCSAqIGZsZXhfYnl0ZXMgLSAyIGJ5dGVzCi0JICogcnN2ZDAgICAgICAtIDIgYnl0ZXMgLSBzcGFjZSByZXNlcnZlZCBtdXN0IGJlIDAuCisJICogYmt0X2hhc2ggICAtIDIgYnl0ZXMKIAkgKi8KIAlzdHJ1Y3QgewogCQl1OCAgICAgdm1fcG9vbDsKQEAgLTIyOTcsNyArMjM2NSw3IEBACiAJCV9fYmUxNiBzcmNfcG9ydDsKIAkJX19iZTE2IGRzdF9wb3J0OwogCQlfX2JlMTYgZmxleF9ieXRlczsKLQkJX19iZTE2IHJzdmQwOworCQlfX2JlMTYgYmt0X2hhc2g7CiAJfSBmb3JtYXR0ZWQ7CiAJX19iZTMyIGR3b3JkX3N0cmVhbVsxMV07CiB9OwpAQCAtMjMxOCwxNiArMjM4Niw2IEBACiAJX19iZTMyIGR3b3JkOwogfTsKIAotc3RydWN0IGl4Z2JlX2F0cl9pbnB1dF9tYXNrcyB7Ci0JX19iZTE2IHJzdmQwOwotCV9fYmUxNiB2bGFuX2lkX21hc2s7Ci0JX19iZTMyIGRzdF9pcF9tYXNrWzRdOwotCV9fYmUzMiBzcmNfaXBfbWFza1s0XTsKLQlfX2JlMTYgc3JjX3BvcnRfbWFzazsKLQlfX2JlMTYgZHN0X3BvcnRfbWFzazsKLQlfX2JlMTYgZmxleF9tYXNrOwotfTsKLQogZW51bSBpeGdiZV9lZXByb21fdHlwZSB7CiAJaXhnYmVfZWVwcm9tX3VuaW5pdGlhbGl6ZWQgPSAwLAogCWl4Z2JlX2VlcHJvbV9zcGksCkBAIC0yNjE1LDYgKzI2NzMsOSBAQAogCXMzMiAoKmdldF9saW5rX2NhcGFiaWxpdGllcykoc3RydWN0IGl4Z2JlX2h3ICosIGl4Z2JlX2xpbmtfc3BlZWQgKiwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKik7CiAKKwkvKiBQYWNrZXQgQnVmZmVyIE1hbmlwdWxhdGlvbiAqLworCXZvaWQgKCpzZXRfcnhwYmEpKHN0cnVjdCBpeGdiZV9odyAqLCBpbnQsIHUzMiwgaW50KTsKKwogCS8qIExFRCAqLwogCXMzMiAoKmxlZF9vbikoc3RydWN0IGl4Z2JlX2h3ICosIHUzMik7CiAJczMyICgqbGVkX29mZikoc3RydWN0IGl4Z2JlX2h3ICosIHUzMik7CkBAIC0yNjM4LDYgKzI2OTksOSBAQAogCiAJLyogRmxvdyBDb250cm9sICovCiAJczMyICgqZmNfZW5hYmxlKShzdHJ1Y3QgaXhnYmVfaHcgKiwgczMyKTsKKworCS8qIE1hbmFnZWFiaWxpdHkgaW50ZXJmYWNlICovCisJczMyICgqc2V0X2Z3X2Rydl92ZXIpKHN0cnVjdCBpeGdiZV9odyAqLCB1OCwgdTgsIHU4LCB1OCk7CiB9OwogCiBzdHJ1Y3QgaXhnYmVfcGh5X29wZXJhdGlvbnMgewpAQCAtMjgwNyw2ICsyODcxLDcgQEAKICNkZWZpbmUgSVhHQkVfRVJSX1NGUF9TRVRVUF9OT1RfQ09NUExFVEUgICAgICAgIC0zMAogI2RlZmluZSBJWEdCRV9FUlJfUEJBX1NFQ1RJT04gICAgICAgICAgICAgICAgICAgLTMxCiAjZGVmaW5lIElYR0JFX0VSUl9JTlZBTElEX0FSR1VNRU5UICAgICAgICAgICAgICAtMzIKKyNkZWZpbmUgSVhHQkVfRVJSX0hPU1RfSU5URVJGQUNFX0NPTU1BTkQgICAgICAgIC0zMwogI2RlZmluZSBJWEdCRV9OT1RfSU1QTEVNRU5URUQgICAgICAgICAgICAgICAgICAgMHg3RkZGRkZGRgogCiAjZW5kaWYgLyogX0lYR0JFX1RZUEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3g1NDAuYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3g1NDAuYwppbmRleCA0ZWQ2ODdiLi5iZWMzMGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV94NTQwLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfeDU0MC5jCkBAIC04NzYsNiArODc2LDcgQEAKIAkucmVhZF9hbmFsb2dfcmVnOCAgICAgICA9IE5VTEwsCiAJLndyaXRlX2FuYWxvZ19yZWc4ICAgICAgPSBOVUxMLAogCS5zZXR1cF9saW5rICAgICAgICAgICAgID0gJml4Z2JlX3NldHVwX21hY19saW5rX1g1NDAsCisJLnNldF9yeHBiYQkJPSAmaXhnYmVfc2V0X3J4cGJhX2dlbmVyaWMsCiAJLmNoZWNrX2xpbmsgICAgICAgICAgICAgPSAmaXhnYmVfY2hlY2tfbWFjX2xpbmtfZ2VuZXJpYywKIAkuZ2V0X2xpbmtfY2FwYWJpbGl0aWVzICA9ICZpeGdiZV9nZXRfY29wcGVyX2xpbmtfY2FwYWJpbGl0aWVzX2dlbmVyaWMsCiAJLmxlZF9vbiAgICAgICAgICAgICAgICAgPSAmaXhnYmVfbGVkX29uX2dlbmVyaWMsCkBAIC04OTMsNiArODk0LDcgQEAKIAkuY2xlYXJfdmZ0YSAgICAgICAgICAgICA9ICZpeGdiZV9jbGVhcl92ZnRhX2dlbmVyaWMsCiAJLnNldF92ZnRhICAgICAgICAgICAgICAgPSAmaXhnYmVfc2V0X3ZmdGFfZ2VuZXJpYywKIAkuZmNfZW5hYmxlICAgICAgICAgICAgICA9ICZpeGdiZV9mY19lbmFibGVfZ2VuZXJpYywKKwkuc2V0X2Z3X2Rydl92ZXIgICAgICAgICA9ICZpeGdiZV9zZXRfZndfZHJ2X3Zlcl9nZW5lcmljLAogCS5pbml0X3V0YV90YWJsZXMgICAgICAgID0gJml4Z2JlX2luaXRfdXRhX3RhYmxlc19nZW5lcmljLAogCS5zZXR1cF9zZnAgICAgICAgICAgICAgID0gTlVMTCwKIAkuc2V0X21hY19hbnRpX3Nwb29maW5nICA9ICZpeGdiZV9zZXRfbWFjX2FudGlfc3Bvb2ZpbmcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZXZmL2l4Z2JldmYuaCBiL2RyaXZlcnMvbmV0L2l4Z2JldmYvaXhnYmV2Zi5oCmluZGV4IGI3MDNmNjAuLjg4NTdkZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JldmYvaXhnYmV2Zi5oCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JldmYvaXhnYmV2Zi5oCkBAIC0yOSw5ICsyOSwxMSBAQAogI2RlZmluZSBfSVhHQkVWRl9IXwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogCiAjaW5jbHVkZSAidmYuaCIKIApAQCAtMTg1LDkgKzE4Nyw3IEBACiAvKiBib2FyZCBzcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCiBzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyIHsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZ190aW1lcjsKLSNpZmRlZiBORVRJRl9GX0hXX1ZMQU5fVFgKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7Ci0jZW5kaWYKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV92bGFuc1tCSVRTX1RPX0xPTkdTKFZMQU5fTl9WSUQpXTsKIAl1MTYgYmRfbnVtYmVyOwogCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF90YXNrOwogCXN0cnVjdCBpeGdiZXZmX3FfdmVjdG9yICpxX3ZlY3RvcltNQVhfTVNJWF9RX1ZFQ1RPUlNdOwpAQCAtMjc5LDcgKzI3OSw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgaXhnYmV2Zl9pbmZvIGl4Z2JldmZfODI1OTlfdmZfaW5mbzsKIGV4dGVybiBzdHJ1Y3QgaXhnYmV2Zl9pbmZvIGl4Z2JldmZfWDU0MF92Zl9pbmZvOwotZXh0ZXJuIHN0cnVjdCBpeGdiZV9tYWNfb3BlcmF0aW9ucyBpeGdiZXZmX21ieF9vcHM7CitleHRlcm4gc3RydWN0IGl4Z2JlX21ieF9vcGVyYXRpb25zIGl4Z2JldmZfbWJ4X29wczsKIAogLyogbmVlZGVkIGJ5IGV0aHRvb2wuYyAqLwogZXh0ZXJuIGNoYXIgaXhnYmV2Zl9kcml2ZXJfbmFtZVtdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmV2Zi9peGdiZXZmX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMKaW5kZXggMjhkM2NiMi4uM2I4ODBhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmV2Zi9peGdiZXZmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jCkBAIC0zMCw2ICszMCw3IEBACiAgQ29weXJpZ2h0IChjKTIwMDYgLSAyMDA3IE15cmljb20sIEluYy4gZm9yIHNvbWUgTFJPIHNwZWNpZmljIGNvZGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpAQCAtNTIsNyArNTMsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgaXhnYmV2Zl9kcml2ZXJfc3RyaW5nW10gPQogCSJJbnRlbChSKSAxMCBHaWdhYml0IFBDSSBFeHByZXNzIFZpcnR1YWwgRnVuY3Rpb24gTmV0d29yayBEcml2ZXIiOwogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuMC1rMiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjIuMS4wLWsiCiBjb25zdCBjaGFyIGl4Z2JldmZfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwogc3RhdGljIGNoYXIgaXhnYmV2Zl9jb3B5cmlnaHRbXSA9CiAJIkNvcHlyaWdodCAoYykgMjAwOSAtIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uIjsKQEAgLTI4OCwyMSArMjg5LDE3IEBACiB7CiAJc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlciA9IHFfdmVjdG9yLT5hZGFwdGVyOwogCWJvb2wgaXNfdmxhbiA9IChzdGF0dXMgJiBJWEdCRV9SWERfU1RBVF9WUCk7Ci0JdTE2IHRhZyA9IGxlMTZfdG9fY3B1KHJ4X2Rlc2MtPndiLnVwcGVyLnZsYW4pOwogCi0JaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0lOX05FVFBPTEwpKSB7Ci0JCWlmIChhZGFwdGVyLT52bGdycCAmJiBpc192bGFuKQotCQkJdmxhbl9ncm9fcmVjZWl2ZSgmcV92ZWN0b3ItPm5hcGksCi0JCQkJCSBhZGFwdGVyLT52bGdycCwKLQkJCQkJIHRhZywgc2tiKTsKLQkJZWxzZQotCQkJbmFwaV9ncm9fcmVjZWl2ZSgmcV92ZWN0b3ItPm5hcGksIHNrYik7Ci0JfSBlbHNlIHsKLQkJaWYgKGFkYXB0ZXItPnZsZ3JwICYmIGlzX3ZsYW4pCi0JCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBhZGFwdGVyLT52bGdycCwgdGFnKTsKLQkJZWxzZQotCQkJbmV0aWZfcngoc2tiKTsKKwlpZiAoaXNfdmxhbikgeworCQl1MTYgdGFnID0gbGUxNl90b19jcHUocnhfZGVzYy0+d2IudXBwZXIudmxhbik7CisKKwkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIHRhZyk7CiAJfQorCisJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0lOX05FVFBPTEwpKQorCQkJbmFwaV9ncm9fcmVjZWl2ZSgmcV92ZWN0b3ItPm5hcGksIHNrYik7CisJZWxzZQorCQkJbmV0aWZfcngoc2tiKTsKIH0KIAogLyoqCkBAIC0xNDAxLDI0ICsxMzk4LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGl4Z2JldmZfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKLXsKLQlzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCWludCBpLCBqOwotCXUzMiBjdHJsOwotCi0JYWRhcHRlci0+dmxncnAgPSBncnA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgaSsrKSB7Ci0JCWogPSBhZGFwdGVyLT5yeF9yaW5nW2ldLnJlZ19pZHg7Ci0JCWN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkZSWERDVEwoaikpOwotCQljdHJsIHw9IElYR0JFX1JYRENUTF9WTUU7Ci0JCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVkZSWERDVEwoaiksIGN0cmwpOwotCX0KLX0KLQogc3RhdGljIHZvaWQgaXhnYmV2Zl92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTE0MjcsNiArMTQwNiw3IEBACiAJLyogYWRkIFZJRCB0byBmaWx0ZXIgdGFibGUgKi8KIAlpZiAoaHctPm1hYy5vcHMuc2V0X3ZmdGEpCiAJCWh3LT5tYWMub3BzLnNldF92ZnRhKGh3LCB2aWQsIDAsIHRydWUpOworCXNldF9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZXZmX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKQEAgLTE0MzQsMzEgKzE0MTQsMTggQEAKIAlzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCi0JaWYgKCF0ZXN0X2JpdChfX0lYR0JFVkZfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKSkKLQkJaXhnYmV2Zl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKLQotCXZsYW5fZ3JvdXBfc2V0X2RldmljZShhZGFwdGVyLT52bGdycCwgdmlkLCBOVUxMKTsKLQotCWlmICghdGVzdF9iaXQoX19JWEdCRVZGX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpCi0JCWl4Z2JldmZfaXJxX2VuYWJsZShhZGFwdGVyLCB0cnVlLCB0cnVlKTsKLQogCS8qIHJlbW92ZSBWSUQgZnJvbSBmaWx0ZXIgdGFibGUgKi8KIAlpZiAoaHctPm1hYy5vcHMuc2V0X3ZmdGEpCiAJCWh3LT5tYWMub3BzLnNldF92ZnRhKGh3LCB2aWQsIDAsIGZhbHNlKTsKKwljbGVhcl9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZXZmX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyKQogewotCWl4Z2JldmZfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKKwl1MTYgdmlkOwogCi0JaWYgKGFkYXB0ZXItPnZsZ3JwKSB7Ci0JCXUxNiB2aWQ7Ci0JCWZvciAodmlkID0gMDsgdmlkIDwgVkxBTl9OX1ZJRDsgdmlkKyspIHsKLQkJCWlmICghdmxhbl9ncm91cF9nZXRfZGV2aWNlKGFkYXB0ZXItPnZsZ3JwLCB2aWQpKQotCQkJCWNvbnRpbnVlOwotCQkJaXhnYmV2Zl92bGFuX3J4X2FkZF92aWQoYWRhcHRlci0+bmV0ZGV2LCB2aWQpOwotCQl9Ci0JfQorCWZvcl9lYWNoX3NldF9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMsIFZMQU5fTl9WSUQpCisJCWl4Z2JldmZfdmxhbl9yeF9hZGRfdmlkKGFkYXB0ZXItPm5ldGRldiwgdmlkKTsKIH0KIAogc3RhdGljIGludCBpeGdiZXZmX3dyaXRlX3VjX2FkZHJfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpAQCAtMTY0OCw3ICsxNjE1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3J4X3JpbmdzOyBpKyspIHsKIAkJaiA9IGFkYXB0ZXItPnJ4X3JpbmdbaV0ucmVnX2lkeDsKIAkJcnhkY3RsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZGUlhEQ1RMKGopKTsKLQkJcnhkY3RsIHw9IElYR0JFX1JYRENUTF9FTkFCTEU7CisJCXJ4ZGN0bCB8PSBJWEdCRV9SWERDVExfRU5BQkxFIHwgSVhHQkVfUlhEQ1RMX1ZNRTsKIAkJaWYgKGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfWDU0MF92ZikgewogCQkJcnhkY3RsICY9IH5JWEdCRV9SWERDVExfUkxQTUxNQVNLOwogCQkJcnhkY3RsIHw9ICgobmV0ZGV2LT5tdHUgKyBFVEhfSExFTiArIEVUSF9GQ1NfTEVOKSB8CkBAIC0zMjQ5LDE4ICszMjE2LDE3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaXhnYmVfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4JCT0gJml4Z2JldmZfb3BlbiwKLQkubmRvX3N0b3AJCT0gJml4Z2JldmZfY2xvc2UsCi0JLm5kb19zdGFydF94bWl0CQk9ICZpeGdiZXZmX3htaXRfZnJhbWUsCi0JLm5kb19zZXRfcnhfbW9kZQk9ICZpeGdiZXZmX3NldF9yeF9tb2RlLAotCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gJml4Z2JldmZfc2V0X3J4X21vZGUsCisJLm5kb19vcGVuCQk9IGl4Z2JldmZfb3BlbiwKKwkubmRvX3N0b3AJCT0gaXhnYmV2Zl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gaXhnYmV2Zl94bWl0X2ZyYW1lLAorCS5uZG9fc2V0X3J4X21vZGUJPSBpeGdiZXZmX3NldF9yeF9tb2RlLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gaXhnYmV2Zl9zZXRfcnhfbW9kZSwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLQkubmRvX3NldF9tYWNfYWRkcmVzcwk9ICZpeGdiZXZmX3NldF9tYWMsCi0JLm5kb19jaGFuZ2VfbXR1CQk9ICZpeGdiZXZmX2NoYW5nZV9tdHUsCi0JLm5kb190eF90aW1lb3V0CQk9ICZpeGdiZXZmX3R4X3RpbWVvdXQsCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gJml4Z2JldmZfdmxhbl9yeF9yZWdpc3RlciwKLQkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9ICZpeGdiZXZmX3ZsYW5fcnhfYWRkX3ZpZCwKLQkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSAmaXhnYmV2Zl92bGFuX3J4X2tpbGxfdmlkLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gaXhnYmV2Zl9zZXRfbWFjLAorCS5uZG9fY2hhbmdlX210dQkJPSBpeGdiZXZmX2NoYW5nZV9tdHUsCisJLm5kb190eF90aW1lb3V0CQk9IGl4Z2JldmZfdHhfdGltZW91dCwKKwkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IGl4Z2JldmZfdmxhbl9yeF9hZGRfdmlkLAorCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IGl4Z2JldmZfdmxhbl9yeF9raWxsX3ZpZCwKIH07CiAKIHN0YXRpYyB2b2lkIGl4Z2JldmZfYXNzaWduX25ldGRldl9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTMzNjQsNyArMzMzMCw3IEBACiAJaHctPm1hYy50eXBlICA9IGlpLT5tYWM7CiAKIAltZW1jcHkoJmh3LT5tYngub3BzLCAmaXhnYmV2Zl9tYnhfb3BzLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGl4Z2JlX21hY19vcGVyYXRpb25zKSk7CisJICAgICAgIHNpemVvZihzdHJ1Y3QgaXhnYmVfbWJ4X29wZXJhdGlvbnMpKTsKIAogCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX1JYX1BTX0NBUEFCTEU7CiAJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfUlhfUFNfRU5BQkxFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4cDIwMDAvaXhwZGV2LmMgYi9kcml2ZXJzL25ldC9peHAyMDAwL2l4cGRldi5jCmluZGV4IDc4ZGRkOGIuLmUxMjI0OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4cDIwMDAvaXhwZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvaXhwMjAwMC9peHBkZXYuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3VlbmdpbmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ptZS5jIGIvZHJpdmVycy9uZXQvam1lLmMKaW5kZXggYjViMTc0YS4uM2FjMjYyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvam1lLmMKKysrIGIvZHJpdmVycy9uZXQvam1lLmMKQEAgLTI3MSw5ICsyNzEsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBqbWVfY2xlYXJfcG0oc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCiB7Ci0JandyaXRlMzIoam1lLCBKTUVfUE1DUywgMHhGRkZGMDAwMCB8IGptZS0+cmVnX3BtY3MpOwotCXBjaV9zZXRfcG93ZXJfc3RhdGUoam1lLT5wZGV2LCBQQ0lfRDApOwotCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSgmam1lLT5wZGV2LT5kZXYsIGZhbHNlKTsKKwlqd3JpdGUzMihqbWUsIEpNRV9QTUNTLCBQTUNTX1NUTUFTSyB8IGptZS0+cmVnX3BtY3MpOwogfQogCiBzdGF0aWMgaW50CkBAIC03NTMsMjAgKzc1MSwyOCBAQAogCXN0cnVjdCBqbWVfcmluZyAqcnhyaW5nID0gJihqbWUtPnJ4cmluZ1swXSk7CiAJc3RydWN0IGptZV9idWZmZXJfaW5mbyAqcnhiaSA9IHJ4cmluZy0+YnVmaW5mICsgaTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWRtYV9hZGRyX3QgbWFwcGluZzsKIAogCXNrYiA9IG5ldGRldl9hbGxvY19za2Ioam1lLT5kZXYsCiAJCWptZS0+ZGV2LT5tdHUgKyBSWF9FWFRSQV9MRU4pOwogCWlmICh1bmxpa2VseSghc2tiKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwltYXBwaW5nID0gcGNpX21hcF9wYWdlKGptZS0+cGRldiwgdmlydF90b19wYWdlKHNrYi0+ZGF0YSksCisJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwgc2tiX3RhaWxyb29tKHNrYiksCisJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlpZiAodW5saWtlbHkocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGptZS0+cGRldiwgbWFwcGluZykpKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGxpa2VseShyeGJpLT5tYXBwaW5nKSkKKwkJcGNpX3VubWFwX3BhZ2Uoam1lLT5wZGV2LCByeGJpLT5tYXBwaW5nLAorCQkJICAgICAgIHJ4YmktPmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwogCXJ4YmktPnNrYiA9IHNrYjsKIAlyeGJpLT5sZW4gPSBza2JfdGFpbHJvb20oc2tiKTsKLQlyeGJpLT5tYXBwaW5nID0gcGNpX21hcF9wYWdlKGptZS0+cGRldiwKLQkJCQkJdmlydF90b19wYWdlKHNrYi0+ZGF0YSksCi0JCQkJCW9mZnNldF9pbl9wYWdlKHNrYi0+ZGF0YSksCi0JCQkJCXJ4YmktPmxlbiwKLQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQorCXJ4YmktPm1hcHBpbmcgPSBtYXBwaW5nOwogCXJldHVybiAwOwogfQogCkBAIC0xMDUwLDE2ICsxMDU2LDEyIEBACiAJCQlza2JfY2hlY2tzdW1fbm9uZV9hc3NlcnQoc2tiKTsKIAogCQlpZiAocnhkZXNjLT5kZXNjd2IuZmxhZ3MgJiBjcHVfdG9fbGUxNihSWFdCRkxBR19UQUdPTikpIHsKLQkJCWlmIChqbWUtPnZsZ3JwKSB7Ci0JCQkJam1lLT5qbWVfdmxhbl9yeChza2IsIGptZS0+dmxncnAsCi0JCQkJCWxlMTZfdG9fY3B1KHJ4ZGVzYy0+ZGVzY3diLnZsYW4pKTsKLQkJCQlORVRfU1RBVChqbWUpLnJ4X2J5dGVzICs9IDQ7Ci0JCQl9IGVsc2UgewotCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWptZS0+am1lX3J4KHNrYik7CisJCQl1MTYgdmlkID0gbGUxNl90b19jcHUocnhkZXNjLT5kZXNjd2Iudmxhbik7CisKKwkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2aWQpOworCQkJTkVUX1NUQVQoam1lKS5yeF9ieXRlcyArPSA0OwogCQl9CisJCWptZS0+am1lX3J4KHNrYik7CiAKIAkJaWYgKChyeGRlc2MtPmRlc2N3Yi5mbGFncyAmIGNwdV90b19sZTE2KFJYV0JGTEFHX0RFU1QpKSA9PQogCQkgICAgY3B1X3RvX2xlMTYoUlhXQkZMQUdfREVTVF9NVUwpKQpAQCAtMTgxNywxMSArMTgxOSw5IEBACiB7CiAJaWYgKGptZS0+cmVnX3BtY3MpIHsKIAkJam1lX3NldF8xMDBtX2hhbGYoam1lKTsKLQogCQlpZiAoam1lLT5yZWdfcG1jcyAmIChQTUNTX0xGRU4gfCBQTUNTX0xSRU4pKQogCQkJam1lX3dhaXRfbGluayhqbWUpOwotCi0JCWp3cml0ZTMyKGptZSwgSk1FX1BNQ1MsIGptZS0+cmVnX3BtY3MpOworCQlqbWVfY2xlYXJfcG0oam1lKTsKIAl9IGVsc2UgewogCQlqbWVfcGh5X29mZihqbWUpOwogCX0KQEAgLTIyODYsMTYgKzIyODYsNiBAQAogfQogCiBzdGF0aWMgdm9pZAotam1lX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKLXsKLQlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlqbWVfcGF1c2Vfcngoam1lKTsKLQlqbWUtPnZsZ3JwID0gZ3JwOwotCWptZV9yZXN1bWVfcngoam1lKTsKLX0KLQotc3RhdGljIHZvaWQKIGptZV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CkBAIC0yNDA1LDcgKzIzOTUsNiBAQAogCSAgICB0ZXN0X2JpdChKTUVfRkxBR19QT0xMLCAmam1lLT5mbGFncykpIHsKIAkJY2xlYXJfYml0KEpNRV9GTEFHX1BPTEwsICZqbWUtPmZsYWdzKTsKIAkJam1lLT5qbWVfcnggPSBuZXRpZl9yeDsKLQkJam1lLT5qbWVfdmxhbl9yeCA9IHZsYW5faHdhY2NlbF9yeDsKIAkJZHBpLT5jdXIJCT0gUENDX1AxOwogCQlkcGktPmF0dGVtcHQJCT0gUENDX1AxOwogCQlkcGktPmNudAkJPSAwOwpAQCAtMjQxNSw3ICsyNDA0LDYgQEAKIAkJICAgISh0ZXN0X2JpdChKTUVfRkxBR19QT0xMLCAmam1lLT5mbGFncykpKSB7CiAJCXNldF9iaXQoSk1FX0ZMQUdfUE9MTCwgJmptZS0+ZmxhZ3MpOwogCQlqbWUtPmptZV9yeCA9IG5ldGlmX3JlY2VpdmVfc2tiOwotCQlqbWUtPmptZV92bGFuX3J4ID0gdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiOwogCQlqbWVfaW50ZXJydXB0X21vZGUoam1lKTsKIAl9CiAKQEAgLTI1MjksOCArMjUxNyw3IEBACiAJCWptZS0+cmVnX3BtY3MgfD0gUE1DU19NRkVOOwogCiAJandyaXRlMzIoam1lLCBKTUVfUE1DUywgam1lLT5yZWdfcG1jcyk7Ci0KLQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJmptZS0+cGRldi0+ZGV2LCBqbWUtPnJlZ19wbWNzKTsKKwlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJmptZS0+cGRldi0+ZGV2LCAhIShqbWUtPnJlZ19wbWNzKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI4NTUsNyArMjg0Miw2IEBACiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBqbWVfc2V0X211bHRpLAogCS5uZG9fY2hhbmdlX210dQkJPSBqbWVfY2hhbmdlX210dSwKIAkubmRvX3R4X3RpbWVvdXQJCT0gam1lX3R4X3RpbWVvdXQsCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gam1lX3ZsYW5fcnhfcmVnaXN0ZXIsCiAJLm5kb19maXhfZmVhdHVyZXMgICAgICAgPSBqbWVfZml4X2ZlYXR1cmVzLAogCS5uZG9fc2V0X2ZlYXR1cmVzICAgICAgID0gam1lX3NldF9mZWF0dXJlcywKIH07CkBAIC0yOTM4LDcgKzI5MjQsNiBAQAogCWptZS0+cGRldiA9IHBkZXY7CiAJam1lLT5kZXYgPSBuZXRkZXY7CiAJam1lLT5qbWVfcnggPSBuZXRpZl9yeDsKLQlqbWUtPmptZV92bGFuX3J4ID0gdmxhbl9od2FjY2VsX3J4OwogCWptZS0+b2xkX210dSA9IG5ldGRldi0+bXR1ID0gMTUwMDsKIAlqbWUtPnBoeWxpbmsgPSAwOwogCWptZS0+dHhfcmluZ19zaXplID0gMSA8PCAxMDsKQEAgLTMwNTgsNiArMzA0Myw5IEBACiAJam1lLT5taWlfaWYubWRpb193cml0ZSA9IGptZV9tZGlvX3dyaXRlOwogCiAJam1lX2NsZWFyX3BtKGptZSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShqbWUtPnBkZXYsIFBDSV9EMCk7CisJZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKCZwZGV2LT5kZXYsIHRydWUpOworCiAJam1lX3NldF9waHlmaWZvXzVsZXZlbChqbWUpOwogCWptZS0+cGNpcmV2ID0gcGRldi0+cmV2aXNpb247CiAJaWYgKCFqbWUtPmZwZ2F2ZXIpCkBAIC0zMTM1LDggKzMxMjMsOSBAQAogCXBjaV9wbWVfYWN0aXZlKHBkZXYsIHRydWUpOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGptZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQKK2ptZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtMzE3NSwxNCArMzE2NCwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGptZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludAoram1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQlqd3JpdGUzMihqbWUsIEpNRV9QTUNTLCAweEZGRkYwMDAwIHwgam1lLT5yZWdfcG1jcyk7Ci0KKwlqbWVfY2xlYXJfcG0oam1lKTsKIAlqbWVfcGh5X29uKGptZSk7CiAJaWYgKHRlc3RfYml0KEpNRV9GTEFHX1NTRVQsICZqbWUtPmZsYWdzKSkKIAkJam1lX3NldF9zZXR0aW5ncyhuZXRkZXYsICZqbWUtPm9sZF9lY21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ptZS5oIGIvZHJpdmVycy9uZXQvam1lLmgKaW5kZXggZTlhYWVjYS4uYzFmOGI4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvam1lLmgKKysrIGIvZHJpdmVycy9uZXQvam1lLmgKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2lmbmRlZiBfX0pNRV9IX0lOQ0xVREVEX18KICNkZWZpbmUgX19KTUVfSF9JTkNMVURFRF9fCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNkZWZpbmUgRFJWX05BTUUJImptZSIKICNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMC44IgpAQCAtNDUwLDcgKzQ1MSw2IEBACiAJdTMyCQkJbXNnX2VuYWJsZTsKIAlzdHJ1Y3QgZXRodG9vbF9jbWQJb2xkX2VjbWQ7CiAJdW5zaWduZWQgaW50CQlvbGRfbXR1OwotCXN0cnVjdCB2bGFuX2dyb3VwCSp2bGdycDsKIAlzdHJ1Y3QgZHlucGNjX2luZm8JZHBpOwogCWF0b21pY190CQlpbnRyX3NlbTsKIAlhdG9taWNfdAkJbGlua19jaGFuZ2luZzsKQEAgLTQ1OCw5ICs0NTgsNiBAQAogCWF0b21pY190CQlyeF9jbGVhbmluZzsKIAlhdG9taWNfdAkJcnhfZW1wdHk7CiAJaW50CQkJKCpqbWVfcngpKHN0cnVjdCBza19idWZmICpza2IpOwotCWludAkJCSgqam1lX3ZsYW5fcngpKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKLQkJCQkJICB1bnNpZ25lZCBzaG9ydCB2bGFuX3RhZyk7CiAJREVDTEFSRV9OQVBJX1NUUlVDVAogCURFQ0xBUkVfTkVUX0RFVklDRV9TVEFUUwogfTsKQEAgLTg1MSw2ICs4NDgsNyBAQAogICogUG93ZXIgbWFuYWdlbWVudCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIKICAqLwogZW51bSBqbWVfcG1jc19iaXRfbWFza3MgeworCVBNQ1NfU1RNQVNLCT0gMHhGRkZGMDAwMCwKIAlQTUNTX1dGN0RFVAk9IDB4ODAwMDAwMDAsCiAJUE1DU19XRjZERVQJPSAweDQwMDAwMDAwLAogCVBNQ1NfV0Y1REVUCT0gMHgyMDAwMDAwMCwKQEAgLTg2Miw2ICs4NjAsNyBAQAogCVBNQ1NfTEZERVQJPSAweDAwMDQwMDAwLAogCVBNQ1NfTFJERVQJPSAweDAwMDIwMDAwLAogCVBNQ1NfTUZERVQJPSAweDAwMDEwMDAwLAorCVBNQ1NfRU5NQVNLCT0gMHgwMDAwRkZGRiwKIAlQTUNTX1dGN0VOCT0gMHgwMDAwODAwMCwKIAlQTUNTX1dGNkVOCT0gMHgwMDAwNDAwMCwKIAlQTUNTX1dGNUVOCT0gMHgwMDAwMjAwMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2tvcmluYS5jIGIvZHJpdmVycy9uZXQva29yaW5hLmMKaW5kZXggYzdhOWJlZi4uNzYzODQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQva29yaW5hLmMKKysrIGIvZHJpdmVycy9uZXQva29yaW5hLmMKQEAgLTUwNCwxMiArNTA0LDcgQEAKIAkJCWhhc2hfdGFibGVbaV0gPSAwOwogCiAJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKLQkJCWNoYXIgKmFkZHJzID0gaGEtPmFkZHI7Ci0KLQkJCWlmICghKCphZGRycyAmIDEpKQotCQkJCWNvbnRpbnVlOwotCi0JCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGhhLT5hZGRyKTsKIAkJCWNyYyA+Pj0gMjY7CiAJCQloYXNoX3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8ICgxNSAtIChjcmMgJiAweGYpKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQva3M4ODQyLmMgYi9kcml2ZXJzL25ldC9rczg4NDIuYwppbmRleCBmYzEyYWMwLi40YTZhZTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9rczg4NDIuYworKysgYi9kcml2ZXJzL25ldC9rczg4NDIuYwpAQCAtMjMsNiArMjMsNyBAQAogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2tzODg1MS5jIGIvZHJpdmVycy9uZXQva3M4ODUxLmMKaW5kZXggYmNkOWJhNi4uZjU2NzQzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQva3M4ODUxLmMKKysrIGIvZHJpdmVycy9uZXQva3M4ODUxLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2RlZmluZSBERUJVRwogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9rczg4NTFfbWxsLmMgYi9kcml2ZXJzL25ldC9rczg4NTFfbWxsLmMKaW5kZXggNjE2MzFjYS4uZDE5Yzg0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQva3M4ODUxX21sbC5jCisrKyBiL2RyaXZlcnMvbmV0L2tzODg1MV9tbGwuYwpAQCAtMjMsNiArMjMsNyBAQAogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KQEAgLTM0LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZQlEUlZfTkFNRQkia3M4ODUxX21sbCIKIApAQCAtMTE4OCw4ICsxMTkwLDYgQEAKIAkJCWludCBpID0gMDsKIAogCQkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIG5ldGRldikgewotCQkJCWlmICghKCpoYS0+YWRkciAmIDEpKQotCQkJCQljb250aW51ZTsKIAkJCQlpZiAoaSA+PSBNQVhfTUNBU1RfTFNUKQogCQkJCQlicmVhazsKIAkJCQltZW1jcHkoa3MtPm1jYXN0X2xzdFtpKytdLCBoYS0+YWRkciwgRVRIX0FMRU4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQva3N6ODg0eC5jIGIvZHJpdmVycy9uZXQva3N6ODg0eC5jCmluZGV4IDQxZWE1OTIuLjI3NDE4ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2tzejg4NHguYworKysgYi9kcml2ZXJzL25ldC9rc3o4ODR4LmMKQEAgLTE3LDYgKzE3LDcgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KQEAgLTU3ODQsOCArNTc4NSw2IEBACiAJCX0KIAogCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7Ci0JCQlpZiAoISgqaGEtPmFkZHIgJiAxKSkKLQkJCQljb250aW51ZTsKIAkJCWlmIChpID49IE1BWF9NVUxUSUNBU1RfTElTVCkKIAkJCQlicmVhazsKIAkJCW1lbWNweShody0+bXVsdGlfbGlzdFtpKytdLCBoYS0+YWRkciwgTUFDX0FERFJfTEVOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xpYjgzOTAuYyBiL2RyaXZlcnMvbmV0L2xpYjgzOTAuYwppbmRleCAxN2I3NWU1Li4wNWFlMjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9saWI4MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvbGliODM5MC5jCkBAIC0zNiw3ICszNiw3IEBACiAgIFBhdWwgR29ydG1ha2VyCTogdHdlYWsgQU5LJ3MgYWJvdmUgbXVsdGljYXN0IGNoYW5nZXMgYSBiaXQuCiAgIFBhdWwgR29ydG1ha2VyCTogdXBkYXRlIHBhY2tldCBzdGF0aXN0aWNzIGZvciB2Mi4xLngKICAgQWxhbiBDb3gJCTogc3VwcG9ydCBhcmJpdHJhcnkgc3R1cGlkIHBvcnQgbWFwcGluZ3Mgb24gdGhlCi0gIAkJCSAgNjhLIE1hY2ludG9zaC4gU3VwcG9ydCA+MTZiaXQgSS9PIHNwYWNlcworCQkJICA2OEsgTWFjaW50b3NoLiBTdXBwb3J0ID4xNmJpdCBJL08gc3BhY2VzCiAgIFBhdWwgR29ydG1ha2VyCTogYWRkIGttb2Qgc3VwcG9ydCBmb3IgYXV0by1sb2FkaW5nIG9mIHRoZSA4MzkwCiAJCQkgIG1vZHVsZSBieSBhbGwgZHJpdmVycyB0aGF0IHJlcXVpcmUgaXQuCiAgIEFsYW4gQ294CQk6IFNwaW5sb2NraW5nIHdvcmssIGFkZGVkICdCVUdfODNDNjkwJwpAQCAtNTgsOCArNTgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC0xMDgsNyArMTA4LDYgQEAKIC8qIEluZGV4IHRvIGZ1bmN0aW9ucy4gKi8KIHN0YXRpYyB2b2lkIGVpX3R4X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBlaV90eF9lcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIGVpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBlaV9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgZWlfcnhfb3ZlcnJ1bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIApAQCAtMjA2LDE5ICsyMDUsMTkgQEAKIAlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAoZGV2LT53YXRjaGRvZ190aW1lbyA8PSAwKQotCQkgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisJCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCiAJLyoKIAkgKglHcmFiIHRoZSBwYWdlIGxvY2sgc28gd2Ugb3duIHRoZSByZWdpc3RlciBzZXQsIHRoZW4gY2FsbAogCSAqCXRoZSBpbml0IGZ1bmN0aW9uLgogCSAqLwogCi0gICAgICAJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOwogCV9fTlM4MzkwX2luaXQoZGV2LCAxKTsKIAkvKiBTZXQgdGhlIGZsYWcgYmVmb3JlIHdlIGRyb3AgdGhlIGxvY2ssIFRoYXQgd2F5IHRoZSBJUlEgYXJyaXZlcwogCSAgIGFmdGVyIGl0cyBzZXQgYW5kIHdlIGdldCBubyBzaWxseSB3YXJuaW5ncyAqLwogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0gICAgICAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKIAllaV9sb2NhbC0+aXJxbG9jayA9IDA7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMzgsOSArMjM3LDkgQEAKIAkgKglIb2xkIHRoZSBwYWdlIGxvY2sgZHVyaW5nIGNsb3NlCiAJICovCiAKLSAgICAgIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CiAJX19OUzgzOTBfaW5pdChkZXYsIDApOwotICAgICAgCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCXJldHVybiAwOwogfQpAQCAtMjY3LDEyICsyNjYsMTIgQEAKIAlpc3IgPSBlaV9pbmIoZTgzOTBfYmFzZStFTjBfSVNSKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4IHRpbWVkIG91dCwgJXMgVFNSPSUjMngsIElTUj0lIzJ4LCB0PSVkLlxuIiwKLQkJZGV2LT5uYW1lLCAodHhzciAmIEVOVFNSX0FCVCkgPyAiZXhjZXNzIGNvbGxpc2lvbnMuIiA6Ci0JCShpc3IpID8gImxvc3QgaW50ZXJydXB0PyIgOiAiY2FibGUgcHJvYmxlbT8iLCB0eHNyLCBpc3IsIHRpY2tzc29mYXIpOworCW5ldGRldl9kYmcoZGV2LCAiVHggdGltZWQgb3V0LCAlcyBUU1I9JSMyeCwgSVNSPSUjMngsIHQ9JWRcbiIsCisJCSAgICh0eHNyICYgRU5UU1JfQUJUKSA/ICJleGNlc3MgY29sbGlzaW9ucy4iIDoKKwkJICAgKGlzcikgPyAibG9zdCBpbnRlcnJ1cHQ/IiA6ICJjYWJsZSBwcm9ibGVtPyIsCisJCSAgIHR4c3IsIGlzciwgdGlja3Nzb2Zhcik7CiAKLQlpZiAoIWlzciAmJiAhZGV2LT5zdGF0cy50eF9wYWNrZXRzKQotCXsKKwlpZiAoIWlzciAmJiAhZGV2LT5zdGF0cy50eF9wYWNrZXRzKSB7CiAJCS8qIFRoZSA4MzkwIHByb2JhYmx5IGhhc24ndCBnb3R0ZW4gb24gdGhlIGNhYmxlIHlldC4gKi8KIAkJZWlfbG9jYWwtPmludGVyZmFjZV9udW0gXj0gMTsgICAvKiBUcnkgYSBkaWZmZXJlbnQgeGN2ci4gICovCiAJfQpAQCAtMzQ0LDI3ICszNDMsMjIgQEAKIAkgKiBjYXJkLCBsZWF2aW5nIGEgc3Vic3RhbnRpYWwgZ2FwIGJldHdlZW4gZWFjaCB0cmFuc21pdHRlZCBwYWNrZXQuCiAJICovCiAKLQlpZiAoZWlfbG9jYWwtPnR4MSA9PSAwKQotCXsKKwlpZiAoZWlfbG9jYWwtPnR4MSA9PSAwKSB7CiAJCW91dHB1dF9wYWdlID0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2U7CiAJCWVpX2xvY2FsLT50eDEgPSBzZW5kX2xlbmd0aDsKIAkJaWYgKGVpX2RlYnVnICAmJiAgZWlfbG9jYWwtPnR4MiA+IDApCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlkbGUgdHJhbnNtaXR0ZXIgdHgyPSVkLCBsYXN0dHg9JWQsIHR4aW5nPSVkLlxuIiwKLQkJCQlkZXYtPm5hbWUsIGVpX2xvY2FsLT50eDIsIGVpX2xvY2FsLT5sYXN0dHgsIGVpX2xvY2FsLT50eGluZyk7Ci0JfQotCWVsc2UgaWYgKGVpX2xvY2FsLT50eDIgPT0gMCkKLQl7CisJCQluZXRkZXZfZGJnKGRldiwgImlkbGUgdHJhbnNtaXR0ZXIgdHgyPSVkLCBsYXN0dHg9JWQsIHR4aW5nPSVkXG4iLAorCQkJCSAgIGVpX2xvY2FsLT50eDIsIGVpX2xvY2FsLT5sYXN0dHgsIGVpX2xvY2FsLT50eGluZyk7CisJfSBlbHNlIGlmIChlaV9sb2NhbC0+dHgyID09IDApIHsKIAkJb3V0cHV0X3BhZ2UgPSBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSArIFRYX1BBR0VTLzI7CiAJCWVpX2xvY2FsLT50eDIgPSBzZW5kX2xlbmd0aDsKIAkJaWYgKGVpX2RlYnVnICAmJiAgZWlfbG9jYWwtPnR4MSA+IDApCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlkbGUgdHJhbnNtaXR0ZXIsIHR4MT0lZCwgbGFzdHR4PSVkLCB0eGluZz0lZC5cbiIsCi0JCQkJZGV2LT5uYW1lLCBlaV9sb2NhbC0+dHgxLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHhpbmcpOwotCX0KLQllbHNlCi0JewkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuICovCisJCQluZXRkZXZfZGJnKGRldiwgImlkbGUgdHJhbnNtaXR0ZXIsIHR4MT0lZCwgbGFzdHR4PSVkLCB0eGluZz0lZFxuIiwKKwkJCQkgICBlaV9sb2NhbC0+dHgxLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHhpbmcpOworCX0gZWxzZSB7CQkJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLwogCQlpZiAoZWlfZGVidWcpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vIFR4IGJ1ZmZlcnMgZnJlZSEgdHgxPSVkIHR4Mj0lZCBsYXN0PSVkXG4iLAotCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPmxhc3R0eCk7CisJCQluZXRkZXZfZGJnKGRldiwgIk5vIFR4IGJ1ZmZlcnMgZnJlZSEgdHgxPSVkIHR4Mj0lZCBsYXN0PSVkXG4iLAorCQkJCSAgIGVpX2xvY2FsLT50eDEsIGVpX2xvY2FsLT50eDIsIGVpX2xvY2FsLT5sYXN0dHgpOwogCQllaV9sb2NhbC0+aXJxbG9jayA9IDA7CiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAkJZWlfb3V0Yl9wKEVOSVNSX0FMTCwgZTgzOTBfYmFzZSArIEVOMF9JTVIpOwpAQCAtMzgyLDIyICszNzYsMTggQEAKIAogCWVpX2Jsb2NrX291dHB1dChkZXYsIHNlbmRfbGVuZ3RoLCBkYXRhLCBvdXRwdXRfcGFnZSk7CiAKLQlpZiAoISBlaV9sb2NhbC0+dHhpbmcpCi0JeworCWlmICghZWlfbG9jYWwtPnR4aW5nKSB7CiAJCWVpX2xvY2FsLT50eGluZyA9IDE7CiAJCU5TODM5MF90cmlnZ2VyX3NlbmQoZGV2LCBzZW5kX2xlbmd0aCwgb3V0cHV0X3BhZ2UpOwotCQlpZiAob3V0cHV0X3BhZ2UgPT0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UpCi0JCXsKKwkJaWYgKG91dHB1dF9wYWdlID09IGVpX2xvY2FsLT50eF9zdGFydF9wYWdlKSB7CiAJCQllaV9sb2NhbC0+dHgxID0gLTE7CiAJCQllaV9sb2NhbC0+bGFzdHR4ID0gLTE7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQllaV9sb2NhbC0+dHgyID0gLTE7CiAJCQllaV9sb2NhbC0+bGFzdHR4ID0gLTI7CiAJCX0KLQl9Ci0JZWxzZSBlaV9sb2NhbC0+dHhxdWV1ZSsrOworCX0gZWxzZQorCQllaV9sb2NhbC0+dHhxdWV1ZSsrOwogCiAJaWYgKGVpX2xvY2FsLT50eDEgICYmICBlaV9sb2NhbC0+dHgyKQogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CkBAIC00MTAsOCArNDAwLDggQEAKIAogCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKIAllbmFibGVfaXJxX2xvY2tkZXBfaXJxcmVzdG9yZShkZXYtPmlycSwgJmZsYWdzKTsKLQotCWRldl9rZnJlZV9za2IgKHNrYik7CisJc2tiX3R4X3RpbWVzdGFtcChza2IpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKIAlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbmRfbGVuZ3RoOwogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKQEAgLTQ0MiwxNSArNDMyLDEzIEBACiAKIAlzcGluX2xvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOwogCi0JaWYgKGVpX2xvY2FsLT5pcnFsb2NrKQotCXsKKwlpZiAoZWlfbG9jYWwtPmlycWxvY2spIHsKIAkJLyoKIAkJICogVGhpcyBtaWdodCBqdXN0IGJlIGFuIGludGVycnVwdCBmb3IgYSBQQ0kgZGV2aWNlIHNoYXJpbmcKIAkJICogdGhpcyBsaW5lCiAJCSAqLwotCQlwcmludGsoIiVzOiBJbnRlcnJ1cHRlZCB3aGlsZSBpbnRlcnJ1cHRzIGFyZSBtYXNrZWQhIgotCQkJICAgIiBpc3I9JSMyeCBpbXI9JSMyeC5cbiIsCi0JCQkgICBkZXYtPm5hbWUsIGVpX2luYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSwKKwkJbmV0ZGV2X2VycihkZXYsICJJbnRlcnJ1cHRlZCB3aGlsZSBpbnRlcnJ1cHRzIGFyZSBtYXNrZWQhIGlzcj0lIzJ4IGltcj0lIzJ4XG4iLAorCQkJICAgZWlfaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpLAogCQkJICAgZWlfaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JTVIpKTsKIAkJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOwogCQlyZXR1cm4gSVJRX05PTkU7CkBAIC00NTksMTUgKzQ0NywxNCBAQAogCS8qIENoYW5nZSB0byBwYWdlIDAgYW5kIHJlYWQgdGhlIGludHIgc3RhdHVzIHJlZy4gKi8KIAllaV9vdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTAsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOwogCWlmIChlaV9kZWJ1ZyA+IDMpCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0KGlzcj0lIzIuMngpLlxuIiwgZGV2LT5uYW1lLAorCQluZXRkZXZfZGJnKGRldiwgImludGVycnVwdChpc3I9JSMyLjJ4KVxuIiwKIAkJCSAgIGVpX2luYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSk7CiAKIAkvKiAhIUFzc3VtcHRpb24hISAtLSB3ZSBzdGF5IGluIHBhZ2UgMC4JIERvbid0IGJyZWFrIHRoaXMuICovCiAJd2hpbGUgKChpbnRlcnJ1cHRzID0gZWlfaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpKSAhPSAwICYmCi0JICAgICAgICsrbnJfc2VydmljZWQgPCBNQVhfU0VSVklDRSkKLQl7CisJICAgICAgICsrbnJfc2VydmljZWQgPCBNQVhfU0VSVklDRSkgewogCQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludGVycnVwdCBmcm9tIHN0b3BwZWQgY2FyZFxuIiwgZGV2LT5uYW1lKTsKKwkJCW5ldGRldl93YXJuKGRldiwgImludGVycnVwdCBmcm9tIHN0b3BwZWQgY2FyZFxuIik7CiAJCQkvKiBybWsgLSBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0cyAqLwogCQkJZWlfb3V0Yl9wKGludGVycnVwdHMsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKIAkJCWludGVycnVwdHMgPSAwOwpAQCAtNDc1LDggKzQ2Miw3IEBACiAJCX0KIAkJaWYgKGludGVycnVwdHMgJiBFTklTUl9PVkVSKQogCQkJZWlfcnhfb3ZlcnJ1bihkZXYpOwotCQllbHNlIGlmIChpbnRlcnJ1cHRzICYgKEVOSVNSX1JYK0VOSVNSX1JYX0VSUikpCi0JCXsKKwkJZWxzZSBpZiAoaW50ZXJydXB0cyAmIChFTklTUl9SWCtFTklTUl9SWF9FUlIpKSB7CiAJCQkvKiBHb3QgYSBnb29kICg/KSBwYWNrZXQuICovCiAJCQllaV9yZWNlaXZlKGRldik7CiAJCX0KQEAgLTQ4NiwzNSArNDcyLDMwIEBACiAJCWVsc2UgaWYgKGludGVycnVwdHMgJiBFTklTUl9UWF9FUlIpCiAJCQllaV90eF9lcnIoZGV2KTsKIAotCQlpZiAoaW50ZXJydXB0cyAmIEVOSVNSX0NPVU5URVJTKQotCQl7CisJCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfQ09VTlRFUlMpIHsKIAkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGVpX2luYl9wKGU4MzkwX2Jhc2UgKyBFTjBfQ09VTlRFUjApOwogCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzICAgKz0gZWlfaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMSk7Ci0JCQlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrPSBlaV9pbmJfcChlODM5MF9iYXNlICsgRU4wX0NPVU5URVIyKTsKKwkJCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBlaV9pbmJfcChlODM5MF9iYXNlICsgRU4wX0NPVU5URVIyKTsKIAkJCWVpX291dGJfcChFTklTUl9DT1VOVEVSUywgZTgzOTBfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2sgaW50ci4gKi8KIAkJfQogCiAJCS8qIElnbm9yZSBhbnkgUkRDIGludGVycnVwdHMgdGhhdCBtYWtlIGl0IGJhY2sgdG8gaGVyZS4gKi8KIAkJaWYgKGludGVycnVwdHMgJiBFTklTUl9SREMpCi0JCXsKIAkJCWVpX291dGJfcChFTklTUl9SREMsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKLQkJfQogCiAJCWVpX291dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7CiAJfQogCi0JaWYgKGludGVycnVwdHMgJiYgZWlfZGVidWcpCi0JeworCWlmIChpbnRlcnJ1cHRzICYmIGVpX2RlYnVnKSB7CiAJCWVpX291dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7Ci0JCWlmIChucl9zZXJ2aWNlZCA+PSBNQVhfU0VSVklDRSkKLQkJeworCQlpZiAobnJfc2VydmljZWQgPj0gTUFYX1NFUlZJQ0UpIHsKIAkJCS8qIDB4RkYgaXMgdmFsaWQgZm9yIGEgY2FyZCByZW1vdmFsICovCi0JCQlpZihpbnRlcnJ1cHRzIT0weEZGKQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgc3RhdHVzICUjMi4yeFxuIiwKLQkJCQkgICBkZXYtPm5hbWUsIGludGVycnVwdHMpOworCQkJaWYgKGludGVycnVwdHMgIT0gMHhGRikKKwkJCQluZXRkZXZfd2FybihkZXYsICJUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgc3RhdHVzICUjMi4yeFxuIiwKKwkJCQkJICAgIGludGVycnVwdHMpOwogCQkJZWlfb3V0Yl9wKEVOSVNSX0FMTCwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2suIG1vc3QgaW50cnMuICovCiAJCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5rbm93biBpbnRlcnJ1cHQgJSMyeFxuIiwgZGV2LT5uYW1lLCBpbnRlcnJ1cHRzKTsKKwkJCW5ldGRldl93YXJuKGRldiwgInVua25vd24gaW50ZXJydXB0ICUjMnhcbiIsIGludGVycnVwdHMpOwogCQkJZWlfb3V0Yl9wKDB4ZmYsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrLiBhbGwgaW50cnMuICovCiAJCX0KIAl9CkBAIC01NTQsMzAgKzUzNSwzMiBAQAogCXVuc2lnbmVkIGNoYXIgdHhfd2FzX2Fib3J0ZWQgPSB0eHNyICYgKEVOVFNSX0FCVCtFTlRTUl9GVSk7CiAKICNpZmRlZiBWRVJCT1NFX0VSUk9SX0RVTVAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0dGVyIGVycm9yICglIzJ4KTogIiwgZGV2LT5uYW1lLCB0eHNyKTsKKwluZXRkZXZfZGJnKGRldiwgInRyYW5zbWl0dGVyIGVycm9yICglIzJ4KToiLCB0eHNyKTsKIAlpZiAodHhzciAmIEVOVFNSX0FCVCkKLQkJcHJpbnRrKCJleGNlc3MtY29sbGlzaW9ucyAiKTsKKwkJcHJfY29udCgiIGV4Y2Vzcy1jb2xsaXNpb25zICIpOwogCWlmICh0eHNyICYgRU5UU1JfTkQpCi0JCXByaW50aygibm9uLWRlZmVycmFsICIpOworCQlwcl9jb250KCIgbm9uLWRlZmVycmFsICIpOwogCWlmICh0eHNyICYgRU5UU1JfQ1JTKQotCQlwcmludGsoImxvc3QtY2FycmllciAiKTsKKwkJcHJfY29udCgiIGxvc3QtY2FycmllciAiKTsKIAlpZiAodHhzciAmIEVOVFNSX0ZVKQotCQlwcmludGsoIkZJRk8tdW5kZXJydW4gIik7CisJCXByX2NvbnQoIiBGSUZPLXVuZGVycnVuICIpOwogCWlmICh0eHNyICYgRU5UU1JfQ0RIKQotCQlwcmludGsoImxvc3QtaGVhcnRiZWF0ICIpOwotCXByaW50aygiXG4iKTsKKwkJcHJfY29udCgiIGxvc3QtaGVhcnRiZWF0ICIpOworCXByX2NvbnQoIlxuIik7CiAjZW5kaWYKIAogCWVpX291dGJfcChFTklTUl9UWF9FUlIsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCiAKIAlpZiAodHhfd2FzX2Fib3J0ZWQpCiAJCWVpX3R4X2ludHIoZGV2KTsKLQllbHNlCi0JeworCWVsc2UgewogCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwotCQlpZiAodHhzciAmIEVOVFNSX0NSUykgZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwotCQlpZiAodHhzciAmIEVOVFNSX0NESCkgZGV2LT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7Ci0JCWlmICh0eHNyICYgRU5UU1JfT1dDKSBkZXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJaWYgKHR4c3IgJiBFTlRTUl9DUlMpCisJCQlkZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCWlmICh0eHNyICYgRU5UU1JfQ0RIKQorCQkJZGV2LT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCWlmICh0eHNyICYgRU5UU1JfT1dDKQorCQkJZGV2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CiAJfQogfQogCkBAIC02MDMsNTIgKzU4Niw0NSBAQAogCSAqLwogCWVpX2xvY2FsLT50eHF1ZXVlLS07CiAKLQlpZiAoZWlfbG9jYWwtPnR4MSA8IDApCi0JeworCWlmIChlaV9sb2NhbC0+dHgxIDwgMCkgewogCQlpZiAoZWlfbG9jYWwtPmxhc3R0eCAhPSAxICYmIGVpX2xvY2FsLT5sYXN0dHggIT0gLTEpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib2d1cyBsYXN0X3R4X2J1ZmZlciAlZCwgdHgxPSVkLlxuIiwKLQkJCQllaV9sb2NhbC0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4MSk7CisJCQlwcl9lcnIoIiVzOiBib2d1cyBsYXN0X3R4X2J1ZmZlciAlZCwgdHgxPSVkXG4iLAorCQkJICAgICAgIGVpX2xvY2FsLT5uYW1lLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHgxKTsKIAkJZWlfbG9jYWwtPnR4MSA9IDA7Ci0JCWlmIChlaV9sb2NhbC0+dHgyID4gMCkKLQkJeworCQlpZiAoZWlfbG9jYWwtPnR4MiA+IDApIHsKIAkJCWVpX2xvY2FsLT50eGluZyA9IDE7CiAJCQlOUzgzOTBfdHJpZ2dlcl9zZW5kKGRldiwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UgKyA2KTsKIAkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCQkJZWlfbG9jYWwtPnR4MiA9IC0xLAogCQkJZWlfbG9jYWwtPmxhc3R0eCA9IDI7Ci0JCX0KLQkJZWxzZSBlaV9sb2NhbC0+bGFzdHR4ID0gMjAsIGVpX2xvY2FsLT50eGluZyA9IDA7Ci0JfQotCWVsc2UgaWYgKGVpX2xvY2FsLT50eDIgPCAwKQotCXsKKwkJfSBlbHNlCisJCQllaV9sb2NhbC0+bGFzdHR4ID0gMjAsIGVpX2xvY2FsLT50eGluZyA9IDA7CisJfSBlbHNlIGlmIChlaV9sb2NhbC0+dHgyIDwgMCkgewogCQlpZiAoZWlfbG9jYWwtPmxhc3R0eCAhPSAyICAmJiAgZWlfbG9jYWwtPmxhc3R0eCAhPSAtMikKLQkJCXByaW50aygiJXM6IGJvZ3VzIGxhc3RfdHhfYnVmZmVyICVkLCB0eDI9JWQuXG4iLAotCQkJCWVpX2xvY2FsLT5uYW1lLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHgyKTsKKwkJCXByX2VycigiJXM6IGJvZ3VzIGxhc3RfdHhfYnVmZmVyICVkLCB0eDI9JWRcbiIsCisJCQkgICAgICAgZWlfbG9jYWwtPm5hbWUsIGVpX2xvY2FsLT5sYXN0dHgsIGVpX2xvY2FsLT50eDIpOwogCQllaV9sb2NhbC0+dHgyID0gMDsKLQkJaWYgKGVpX2xvY2FsLT50eDEgPiAwKQotCQl7CisJCWlmIChlaV9sb2NhbC0+dHgxID4gMCkgewogCQkJZWlfbG9jYWwtPnR4aW5nID0gMTsKIAkJCU5TODM5MF90cmlnZ2VyX3NlbmQoZGV2LCBlaV9sb2NhbC0+dHgxLCBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSk7CiAJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAkJCWVpX2xvY2FsLT50eDEgPSAtMTsKIAkJCWVpX2xvY2FsLT5sYXN0dHggPSAxOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQllaV9sb2NhbC0+bGFzdHR4ID0gMTAsIGVpX2xvY2FsLT50eGluZyA9IDA7Ci0JfQotLy8JZWxzZSBwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5leHBlY3RlZCBUWC1kb25lIGludGVycnVwdCwgbGFzdHR4PSVkLlxuIiwKLS8vCQkJZGV2LT5uYW1lLCBlaV9sb2NhbC0+bGFzdHR4KTsKKwl9IC8qIGVsc2UKKwkJbmV0ZGV2X3dhcm4oZGV2LCAidW5leHBlY3RlZCBUWC1kb25lIGludGVycnVwdCwgbGFzdHR4PSVkXG4iLAorCQkJICAgIGVpX2xvY2FsLT5sYXN0dHgpOworKi8KIAogCS8qIE1pbmltaXplIFR4IGxhdGVuY3k6IHVwZGF0ZSB0aGUgc3RhdGlzdGljcyBhZnRlciB3ZSByZXN0YXJ0IFRYaW5nLiAqLwogCWlmIChzdGF0dXMgJiBFTlRTUl9DT0wpCiAJCWRldi0+c3RhdHMuY29sbGlzaW9ucysrOwogCWlmIChzdGF0dXMgJiBFTlRTUl9QVFgpCiAJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwotCWVsc2UKLQl7CisJZWxzZSB7CiAJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCWlmIChzdGF0dXMgJiBFTlRTUl9BQlQpCi0JCXsKKwkJaWYgKHN0YXR1cyAmIEVOVFNSX0FCVCkgewogCQkJZGV2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOwogCQkJZGV2LT5zdGF0cy5jb2xsaXNpb25zICs9IDE2OwogCQl9CkBAIC02ODIsOCArNjU4LDcgQEAKIAlzdHJ1Y3QgZTgzOTBfcGt0X2hkciByeF9mcmFtZTsKIAlpbnQgbnVtX3J4X3BhZ2VzID0gZWlfbG9jYWwtPnN0b3BfcGFnZS1laV9sb2NhbC0+cnhfc3RhcnRfcGFnZTsKIAotCXdoaWxlICgrK3J4X3BrdF9jb3VudCA8IDEwKQotCXsKKwl3aGlsZSAoKytyeF9wa3RfY291bnQgPCAxMCkgewogCQlpbnQgcGt0X2xlbiwgcGt0X3N0YXQ7CiAKIAkJLyogR2V0IHRoZSByeCBwYWdlIChpbmNvbWluZyBwYWNrZXQgcG9pbnRlcikuICovCkBAIC03MDIsOSArNjc3LDExIEBACiAJCSAgIEtlZXAgcXVpZXQgaWYgaXQgbG9va3MgbGlrZSBhIGNhcmQgcmVtb3ZhbC4gT25lIHByb2JsZW0gaGVyZQogCQkgICBpcyB0aGF0IHNvbWUgY2xvbmVzIGNyYXNoIGluIHJvdWdobHkgdGhlIHNhbWUgd2F5LgogCQkgKi8KLQkJaWYgKGVpX2RlYnVnID4gMCAgJiYgIHRoaXNfZnJhbWUgIT0gZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSAmJiAodGhpc19mcmFtZSE9MHgwIHx8IHJ4aW5nX3BhZ2UhPTB4RkYpKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWlzbWF0Y2hlZCByZWFkIHBhZ2UgcG9pbnRlcnMgJTJ4IHZzICUyeC5cbiIsCi0JCQkJICAgZGV2LT5uYW1lLCB0aGlzX2ZyYW1lLCBlaV9sb2NhbC0+Y3VycmVudF9wYWdlKTsKKwkJaWYgKGVpX2RlYnVnID4gMCAmJgorCQkgICAgdGhpc19mcmFtZSAhPSBlaV9sb2NhbC0+Y3VycmVudF9wYWdlICYmCisJCSAgICAodGhpc19mcmFtZSAhPSAweDAgfHwgcnhpbmdfcGFnZSAhPSAweEZGKSkKKwkJCW5ldGRldl9lcnIoZGV2LCAibWlzbWF0Y2hlZCByZWFkIHBhZ2UgcG9pbnRlcnMgJTJ4IHZzICUyeFxuIiwKKwkJCQkgICB0aGlzX2ZyYW1lLCBlaV9sb2NhbC0+Y3VycmVudF9wYWdlKTsKIAogCQlpZiAodGhpc19mcmFtZSA9PSByeGluZ19wYWdlKQkvKiBSZWFkIGFsbCB0aGUgZnJhbWVzPyAqLwogCQkJYnJlYWs7CQkJCS8qIERvbmUgZm9yIG5vdyAqLwpAQCAtNzMwLDQ2ICs3MDcsMzkgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKHBrdF9sZW4gPCA2MCAgfHwgIHBrdF9sZW4gPiAxNTE4KQotCQl7CisJCWlmIChwa3RfbGVuIDwgNjAgIHx8ICBwa3RfbGVuID4gMTUxOCkgewogCQkJaWYgKGVpX2RlYnVnKQotCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0IHNpemU6ICVkLCBzdGF0dXM9JSMyeCBueHBnPSUjMnguXG4iLAotCQkJCQkgICBkZXYtPm5hbWUsIHJ4X2ZyYW1lLmNvdW50LCByeF9mcmFtZS5zdGF0dXMsCisJCQkJbmV0ZGV2X2RiZyhkZXYsICJib2d1cyBwYWNrZXQgc2l6ZTogJWQsIHN0YXR1cz0lIzJ4IG54cGc9JSMyeFxuIiwKKwkJCQkJICAgcnhfZnJhbWUuY291bnQsIHJ4X2ZyYW1lLnN0YXR1cywKIAkJCQkJICAgcnhfZnJhbWUubmV4dCk7CiAJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7Ci0JCX0KLQkJIGVsc2UgaWYgKChwa3Rfc3RhdCAmIDB4MEYpID09IEVOUlNSX1JYT0spCi0JCXsKKwkJfSBlbHNlIGlmICgocGt0X3N0YXQgJiAweDBGKSA9PSBFTlJTUl9SWE9LKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7Ci0JCQlpZiAoc2tiID09IE5VTEwpCi0JCQl7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKIAkJCQlpZiAoZWlfZGVidWcgPiAxKQotCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENvdWxkbid0IGFsbG9jYXRlIGEgc2tfYnVmZiBvZiBzaXplICVkLlxuIiwKLQkJCQkJCSAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJCW5ldGRldl9kYmcoZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgYSBza19idWZmIG9mIHNpemUgJWRcbiIsCisJCQkJCQkgICBwa3RfbGVuKTsKIAkJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlza2JfcmVzZXJ2ZShza2IsMik7CS8qIElQIGhlYWRlcnMgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQl9IGVsc2UgeworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIElQIGhlYWRlcnMgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KIAkJCQllaV9ibG9ja19pbnB1dChkZXYsIHBrdF9sZW4sIHNrYiwgY3VycmVudF9vZmZzZXQgKyBzaXplb2YocnhfZnJhbWUpKTsKLQkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwotCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQlpZiAoIXNrYl9kZWZlcl9yeF90aW1lc3RhbXAoc2tiKSkKKwkJCQkJbmV0aWZfcngoc2tiKTsKIAkJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CiAJCQkJaWYgKHBrdF9zdGF0ICYgRU5SU1JfUEhZKQogCQkJCQlkZXYtPnN0YXRzLm11bHRpY2FzdCsrOwogCQkJfQotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJaWYgKGVpX2RlYnVnKQotCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0OiBzdGF0dXM9JSMyeCBueHBnPSUjMnggc2l6ZT0lZFxuIiwKLQkJCQkJICAgZGV2LT5uYW1lLCByeF9mcmFtZS5zdGF0dXMsIHJ4X2ZyYW1lLm5leHQsCisJCQkJbmV0ZGV2X2RiZyhkZXYsICJib2d1cyBwYWNrZXQ6IHN0YXR1cz0lIzJ4IG54cGc9JSMyeCBzaXplPSVkXG4iLAorCQkJCQkgICByeF9mcmFtZS5zdGF0dXMsIHJ4X2ZyYW1lLm5leHQsCiAJCQkJCSAgIHJ4X2ZyYW1lLmNvdW50KTsKIAkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkvKiBOQjogVGhlIE5JQyBjb3VudHMgQ1JDLCBmcmFtZSBhbmQgbWlzc2VkIGVycm9ycy4gKi8KQEAgLTc4MCw4ICs3NTAsOCBAQAogCiAJCS8qIFRoaXMgX3Nob3VsZF8gbmV2ZXIgaGFwcGVuOiBpdCdzIGhlcmUgZm9yIGF2b2lkaW5nIGJhZCBjbG9uZXMuICovCiAJCWlmIChuZXh0X2ZyYW1lID49IGVpX2xvY2FsLT5zdG9wX3BhZ2UpIHsKLQkJCXByaW50aygiJXM6IG5leHQgZnJhbWUgaW5jb25zaXN0ZW5jeSwgJSMyeFxuIiwgZGV2LT5uYW1lLAotCQkJCSAgIG5leHRfZnJhbWUpOworCQkJbmV0ZGV2X25vdGljZShkZXYsICJuZXh0IGZyYW1lIGluY29uc2lzdGVuY3ksICUjMnhcbiIsCisJCQkJICAgICAgbmV4dF9mcmFtZSk7CiAJCQluZXh0X2ZyYW1lID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7CiAJCX0KIAkJZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSA9IG5leHRfZnJhbWU7CkBAIC04MjEsNyArNzkxLDcgQEAKIAllaV9vdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOwogCiAJaWYgKGVpX2RlYnVnID4gMSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlciBvdmVycnVuLlxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2RiZyhkZXYsICJSZWNlaXZlciBvdmVycnVuXG4iKTsKIAlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CiAKIAkvKgpAQCAtODQ0LDggKzgxNCw3IEBACiAJICogc3RlcCBpcyB2aXRhbCwgYW5kIHNraXBwaW5nIGl0IHdpbGwgY2F1c2Ugbm8gZW5kIG9mIGhhdm9jLgogCSAqLwogCi0JaWYgKHdhc190eGluZykKLQl7CisJaWYgKHdhc190eGluZykgewogCQl1bnNpZ25lZCBjaGFyIHR4X2NvbXBsZXRlZCA9IGVpX2luYl9wKGU4MzkwX2Jhc2UrRU4wX0lTUikgJiAoRU5JU1JfVFgrRU5JU1JfVFhfRVJSKTsKIAkJaWYgKCF0eF9jb21wbGV0ZWQpCiAJCQltdXN0X3Jlc2VuZCA9IDE7CkBAIC04NjksNyArODM4LDcgQEAKIAkgKi8KIAllaV9vdXRiX3AoRTgzOTBfVFhDT05GSUcsIGU4MzkwX2Jhc2UgKyBFTjBfVFhDUik7CiAJaWYgKG11c3RfcmVzZW5kKQotICAgIAkJZWlfb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAgKyBFODM5MF9TVEFSVCArIEU4MzkwX1RSQU5TLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKKwkJZWlfb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAgKyBFODM5MF9TVEFSVCArIEU4MzkwX1RSQU5TLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKIH0KIAogLyoKQEAgLTg4NiwxMSArODU1LDExIEBACiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAmZGV2LT5zdGF0czsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOwogCS8qIFJlYWQgdGhlIGNvdW50ZXIgcmVnaXN0ZXJzLCBhc3N1bWluZyB3ZSBhcmUgaW4gcGFnZSAwLiAqLwotCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGVpX2luYl9wKGlvYWRkciArIEVOMF9DT1VOVEVSMCk7Ci0JZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzICAgKz0gZWlfaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIxKTsKLQlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrPSBlaV9pbmJfcChpb2FkZHIgKyBFTjBfQ09VTlRFUjIpOworCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICArPSBlaV9pbmJfcChpb2FkZHIgKyBFTjBfQ09VTlRFUjApOworCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyAgICArPSBlaV9pbmJfcChpb2FkZHIgKyBFTjBfQ09VTlRFUjEpOworCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBlaV9pbmJfcChpb2FkZHIgKyBFTjBfQ09VTlRFUjIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAmZGV2LT5zdGF0czsKQEAgLTkyOSwxMyArODk4LDExIEBACiAJaW50IGk7CiAJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JaWYgKCEoZGV2LT5mbGFncyYoSUZGX1BST01JU0N8SUZGX0FMTE1VTFRJKSkpCi0JeworCWlmICghKGRldi0+ZmxhZ3MmKElGRl9QUk9NSVNDfElGRl9BTExNVUxUSSkpKSB7CiAJCW1lbXNldChlaV9sb2NhbC0+bWNmaWx0ZXIsIDAsIDgpOwogCQlpZiAoIW5ldGRldl9tY19lbXB0eShkZXYpKQogCQkJbWFrZV9tY19iaXRzKGVpX2xvY2FsLT5tY2ZpbHRlciwgZGV2KTsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQltZW1zZXQoZWlfbG9jYWwtPm1jZmlsdGVyLCAweEZGLCA4KTsJLyogbWNhc3Qgc2V0IHRvIGFjY2VwdC1hbGwgKi8KIAogCS8qCkBAIC05NTQsMjMgKzkyMSwyMyBAQAogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCiAJCWVpX291dGJfcChFODM5MF9SWENPTkZJRywgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsKIAllaV9vdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7Ci0JZm9yKGkgPSAwOyBpIDwgODsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCWVpX291dGJfcChlaV9sb2NhbC0+bWNmaWx0ZXJbaV0sIGU4MzkwX2Jhc2UgKyBFTjFfTVVMVF9TSElGVChpKSk7CiAjaWZuZGVmIEJVR184M0M2OTAKLQkJaWYoZWlfaW5iX3AoZTgzOTBfYmFzZSArIEVOMV9NVUxUX1NISUZUKGkpKSE9ZWlfbG9jYWwtPm1jZmlsdGVyW2ldKQotCQkJcHJpbnRrKEtFUk5fRVJSICJNdWx0aWNhc3QgZmlsdGVyIHJlYWQvd3JpdGUgbWlzbWFwICVkXG4iLGkpOworCQlpZiAoZWlfaW5iX3AoZTgzOTBfYmFzZSArIEVOMV9NVUxUX1NISUZUKGkpKSAhPSBlaV9sb2NhbC0+bWNmaWx0ZXJbaV0pCisJCQluZXRkZXZfZXJyKGRldiwgIk11bHRpY2FzdCBmaWx0ZXIgcmVhZC93cml0ZSBtaXNtYXAgJWRcbiIsCisJCQkJICAgaSk7CiAjZW5kaWYKIAl9CiAJZWlfb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOwogCi0gIAlpZihkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQotICAJCWVpX291dGJfcChFODM5MF9SWENPTkZJRyB8IDB4MTgsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7CisJaWYgKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MpCisJCWVpX291dGJfcChFODM5MF9SWENPTkZJRyB8IDB4MTgsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7CiAJZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSB8fCAhbmV0ZGV2X21jX2VtcHR5KGRldikpCi0gIAkJZWlfb3V0Yl9wKEU4MzkwX1JYQ09ORklHIHwgMHgwOCwgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsKLSAgCWVsc2UKLSAgCQllaV9vdXRiX3AoRTgzOTBfUlhDT05GSUcsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7Ci0gfQorCQllaV9vdXRiX3AoRTgzOTBfUlhDT05GSUcgfCAweDA4LCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOworCWVsc2UKKwkJZWlfb3V0Yl9wKEU4MzkwX1JYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOworfQogCiAvKgogICoJQ2FsbGVkIHdpdGhvdXQgbG9jayBoZWxkLiBUaGlzIGlzIGludm9rZWQgZnJvbSB1c2VyIGNvbnRleHQgYW5kIG1heQpAQCAtMTA0Miw4ICsxMDA5LDggQEAKIAkgICAgPyAoMHg0OCB8IEVORENGR19XVFMgfCAoZWlfbG9jYWwtPmJpZ2VuZGlhbiA/IEVORENGR19CT1MgOiAwKSkKIAkgICAgOiAweDQ4OwogCi0JaWYoc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSE9NCkKLSAgICAJCXBhbmljKCI4MzkwLmM6IGhlYWRlciBzdHJ1Y3QgbWlzcGFja2VkXG4iKTsKKwlpZiAoc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSAhPSA0KQorCQlwYW5pYygiODM5MC5jOiBoZWFkZXIgc3RydWN0IG1pc3BhY2tlZFxuIik7CiAJLyogRm9sbG93IE5hdGlvbmFsIFNlbWkncyByZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpbmcgdGhlIERQODM5MDIuICovCiAJZWlfb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsgLyogMHgyMSAqLwogCWVpX291dGJfcChlbmRjZmcsIGU4MzkwX2Jhc2UgKyBFTjBfRENGRyk7CS8qIDB4NDggb3IgMHg0OSAqLwpAQCAtMTA2NywxMSArMTAzNCwxMSBAQAogCS8qIENvcHkgdGhlIHN0YXRpb24gYWRkcmVzcyBpbnRvIHRoZSBEUzgzOTAgcmVnaXN0ZXJzLiAqLwogCiAJZWlfb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTEgKyBFODM5MF9TVE9QLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7IC8qIDB4NjEgKi8KLQlmb3IoaSA9IDA7IGkgPCA2OyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKIAkJZWlfb3V0Yl9wKGRldi0+ZGV2X2FkZHJbaV0sIGU4MzkwX2Jhc2UgKyBFTjFfUEhZU19TSElGVChpKSk7Ci0JCWlmIChlaV9kZWJ1ZyA+IDEgJiYgZWlfaW5iX3AoZTgzOTBfYmFzZSArIEVOMV9QSFlTX1NISUZUKGkpKSE9ZGV2LT5kZXZfYWRkcltpXSkKLQkJCXByaW50ayhLRVJOX0VSUiAiSHcuIGFkZHJlc3MgcmVhZC93cml0ZSBtaXNtYXAgJWRcbiIsaSk7CisJCWlmIChlaV9kZWJ1ZyA+IDEgJiYKKwkJICAgIGVpX2luYl9wKGU4MzkwX2Jhc2UgKyBFTjFfUEhZU19TSElGVChpKSkgIT0gZGV2LT5kZXZfYWRkcltpXSkKKwkJCW5ldGRldl9lcnIoZGV2LCAiSHcuIGFkZHJlc3MgcmVhZC93cml0ZSBtaXNtYXAgJWRcbiIsIGkpOwogCX0KIAogCWVpX291dGJfcChlaV9sb2NhbC0+cnhfc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMV9DVVJQQUcpOwpAQCAtMTA4MCw4ICsxMDQ3LDcgQEAKIAllaV9sb2NhbC0+dHgxID0gZWlfbG9jYWwtPnR4MiA9IDA7CiAJZWlfbG9jYWwtPnR4aW5nID0gMDsKIAotCWlmIChzdGFydHApCi0JeworCWlmIChzdGFydHApIHsKIAkJZWlfb3V0Yl9wKDB4ZmYsICBlODM5MF9iYXNlICsgRU4wX0lTUik7CiAJCWVpX291dGJfcChFTklTUl9BTEwsICBlODM5MF9iYXNlICsgRU4wX0lNUik7CiAJCWVpX291dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOwpAQCAtMTA5OSwxNCArMTA2NSwxMiBAQAogCQkJCQkJCQlpbnQgc3RhcnRfcGFnZSkKIHsKIAl1bnNpZ25lZCBsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKLSAJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgX19hdHRyaWJ1dGUoKHVudXNlZCkpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJZWlfb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7CiAKLQlpZiAoZWlfaW5iX3AoZTgzOTBfYmFzZSArIEU4MzkwX0NNRCkgJiBFODM5MF9UUkFOUykKLQl7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmlnZ2VyX3NlbmQoKSBjYWxsZWQgd2l0aCB0aGUgdHJhbnNtaXR0ZXIgYnVzeS5cbiIsCi0JCQlkZXYtPm5hbWUpOworCWlmIChlaV9pbmJfcChlODM5MF9iYXNlICsgRTgzOTBfQ01EKSAmIEU4MzkwX1RSQU5TKSB7CisJCW5ldGRldl93YXJuKGRldiwgInRyaWdnZXJfc2VuZCgpIGNhbGxlZCB3aXRoIHRoZSB0cmFuc21pdHRlciBidXN5XG4iKTsKIAkJcmV0dXJuOwogCX0KIAllaV9vdXRiX3AobGVuZ3RoICYgMHhmZiwgZTgzOTBfYmFzZSArIEVOMF9UQ05UTE8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbGxfdGVtYWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvbGxfdGVtYWNfbWFpbi5jCmluZGV4IGI3OTQ4Y2MuLjcyOGZlNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2xsX3RlbWFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9sbF90ZW1hY19tYWluLmMKQEAgLTQ4LDYgKzQ4LDggQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlICJsbF90ZW1hYy5oIgogCkBAIC03MjcsNiArNzI5LDggQEAKIAlpZiAobHAtPnR4X2JkX3RhaWwgPj0gVFhfQkRfTlVNKQogCQlscC0+dHhfYmRfdGFpbCA9IDA7CiAKKwlza2JfdHhfdGltZXN0YW1wKHNrYik7CisKIAkvKiBLaWNrIG9mZiB0aGUgdHJhbnNmZXIgKi8KIAlscC0+ZG1hX291dChscCwgVFhfVEFJTERFU0NfUFRSLCB0YWlsX3ApOyAvKiBETUEgc3RhcnQgKi8KIApAQCAtNzcyLDcgKzc3Niw4IEBACiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOwogCQl9CiAKLQkJbmV0aWZfcngoc2tiKTsKKwkJaWYgKCFza2JfZGVmZXJfcnhfdGltZXN0YW1wKHNrYikpCisJCQluZXRpZl9yeChza2IpOwogCiAJCW5kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJbmRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbG5lMzkwLmMgYi9kcml2ZXJzL25ldC9sbmUzOTAuYwppbmRleCA4YTEwOTdjLi5mOTg4OGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sbmUzOTAuYworKysgYi9kcml2ZXJzL25ldC9sbmUzOTAuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2IuYyBiL2RyaXZlcnMvbmV0L21hY2IuYwppbmRleCA2YzZhMDI4Li4wZmNkYzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNiLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjYi5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KQEAgLTY2OSw2ICs2NzAsOCBAQAogCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CiAJYnAtPnR4X2hlYWQgPSBlbnRyeTsKIAorCXNrYl90eF90aW1lc3RhbXAoc2tiKTsKKwogCW1hY2Jfd3JpdGVsKGJwLCBOQ1IsIG1hY2JfcmVhZGwoYnAsIE5DUikgfCBNQUNCX0JJVChUU1RBUlQpKTsKIAogCWlmIChUWF9CVUZGU19BVkFJTChicCkgPCAxKQpAQCAtMTE2OSw3ICsxMTcyLDcgQEAKIAljbGtfZW5hYmxlKGJwLT5oY2xrKTsKICNlbmRpZgogCi0JYnAtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCWJwLT5yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZWdzKSk7CiAJaWYgKCFicC0+cmVncykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIHJlZ2lzdGVycywgYWJvcnRpbmcuXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2UuYyBiL2RyaXZlcnMvbmV0L21hY2UuYwppbmRleCAxYzUyMjFmLi4yMDc0ZTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNlLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjbWFjZS5jIGIvZHJpdmVycy9uZXQvbWFjbWFjZS5jCmluZGV4IGM2ODVhNDYuLjQyODZlNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY21hY2UuYworKysgYi9kcml2ZXJzL25ldC9tYWNtYWNlLmMKQEAgLTIyMSw3ICsyMjEsNyBAQAogCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CiAKIAlkZXYtPmJhc2VfYWRkciA9ICh1MzIpTUFDRV9CQVNFOwotCW1wLT5tYWNlID0gKHZvbGF0aWxlIHN0cnVjdCBtYWNlICopIE1BQ0VfQkFTRTsKKwltcC0+bWFjZSA9IE1BQ0VfQkFTRTsKIAogCWRldi0+aXJxID0gSVJRX01BQ19NQUNFOwogCW1wLT5kbWFfaW50ciA9IElSUV9NQUNfTUFDRV9ETUE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWN2bGFuLmMgYi9kcml2ZXJzL25ldC9tYWN2bGFuLmMKaW5kZXggZDZhZWFhNS4uYmE2MzFmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjdmxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L21hY3ZsYW4uYwpAQCAtNDE0LDcgKzQxNCw4IEBACiAjZGVmaW5lIE1BQ1ZMQU5fRkVBVFVSRVMgXAogCShORVRJRl9GX1NHIHwgTkVUSUZfRl9BTExfQ1NVTSB8IE5FVElGX0ZfSElHSERNQSB8IE5FVElGX0ZfRlJBR0xJU1QgfCBcCiAJIE5FVElGX0ZfR1NPIHwgTkVUSUZfRl9UU08gfCBORVRJRl9GX1VGTyB8IE5FVElGX0ZfR1NPX1JPQlVTVCB8IFwKLQkgTkVUSUZfRl9UU09fRUNOIHwgTkVUSUZfRl9UU082IHwgTkVUSUZfRl9HUk8gfCBORVRJRl9GX1JYQ1NVTSkKKwkgTkVUSUZfRl9UU09fRUNOIHwgTkVUSUZfRl9UU082IHwgTkVUSUZfRl9HUk8gfCBORVRJRl9GX1JYQ1NVTSB8IFwKKwkgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUikKIAogI2RlZmluZSBNQUNWTEFOX1NUQVRFX01BU0sgXAogCSgoMTw8X19MSU5LX1NUQVRFX05PQ0FSUklFUikgfCAoMTw8X19MSU5LX1NUQVRFX0RPUk1BTlQpKQpAQCAtNTA5LDYgKzUxMCwyOCBAQAogCXJldHVybiBzdGF0czsKIH0KIAorc3RhdGljIHZvaWQgbWFjdmxhbl92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgdmlkKQoreworCXN0cnVjdCBtYWN2bGFuX2RldiAqdmxhbiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmxvd2VyZGV2ID0gdmxhbi0+bG93ZXJkZXY7CisJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSBsb3dlcmRldi0+bmV0ZGV2X29wczsKKworCWlmIChvcHMtPm5kb192bGFuX3J4X2FkZF92aWQpCisJCW9wcy0+bmRvX3ZsYW5fcnhfYWRkX3ZpZChsb3dlcmRldiwgdmlkKTsKK30KKworc3RhdGljIHZvaWQgbWFjdmxhbl92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBzaG9ydCB2aWQpCit7CisJc3RydWN0IG1hY3ZsYW5fZGV2ICp2bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbG93ZXJkZXYgPSB2bGFuLT5sb3dlcmRldjsKKwljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IGxvd2VyZGV2LT5uZXRkZXZfb3BzOworCisJaWYgKG9wcy0+bmRvX3ZsYW5fcnhfa2lsbF92aWQpCisJCW9wcy0+bmRvX3ZsYW5fcnhfa2lsbF92aWQobG93ZXJkZXYsIHZpZCk7Cit9CisKIHN0YXRpYyB2b2lkIG1hY3ZsYW5fZXRodG9vbF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQogewpAQCAtNTQxLDYgKzU2NCw4IEBACiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBtYWN2bGFuX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX2dldF9zdGF0czY0CT0gbWFjdmxhbl9kZXZfZ2V0X3N0YXRzNjQsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb192bGFuX3J4X2FkZF92aWQJPSBtYWN2bGFuX3ZsYW5fcnhfYWRkX3ZpZCwKKwkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSBtYWN2bGFuX3ZsYW5fcnhfa2lsbF92aWQsCiB9OwogCiB2b2lkIG1hY3ZsYW5fY29tbW9uX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWN2dGFwLmMgYi9kcml2ZXJzL25ldC9tYWN2dGFwLmMKaW5kZXggNjY5NmU1Ni4uYWI5NmMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjdnRhcC5jCisrKyBiL2RyaXZlcnMvbmV0L21hY3Z0YXAuYwpAQCAtNjAsNiArNjAsNyBAQAogICovCiBzdGF0aWMgZGV2X3QgbWFjdnRhcF9tYWpvcjsKICNkZWZpbmUgTUFDVlRBUF9OVU1fREVWUyA2NTUzNgorI2RlZmluZSBHT09EQ09QWV9MRU4gMTI4CiBzdGF0aWMgc3RydWN0IGNsYXNzICptYWN2dGFwX2NsYXNzOwogc3RhdGljIHN0cnVjdCBjZGV2IG1hY3Z0YXBfY2RldjsKIApAQCAtMzQwLDYgKzM0MSw3IEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gY3VycmVudC0+bnNwcm94eS0+bmV0X25zOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaW1pbm9yKGlub2RlKSk7CisJc3RydWN0IG1hY3ZsYW5fZGV2ICp2bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWFjdnRhcF9xdWV1ZSAqcTsKIAlpbnQgZXJyOwogCkBAIC0zNjksNiArMzcxLDE2IEBACiAJcS0+ZmxhZ3MgPSBJRkZfVk5FVF9IRFIgfCBJRkZfTk9fUEkgfCBJRkZfVEFQOwogCXEtPnZuZXRfaGRyX3N6ID0gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcik7CiAKKwkvKgorCSAqIHNvIGZhciBvbmx5IEtWTSB2aXJ0aW9fbmV0IHVzZXMgbWFjdnRhcCwgZW5hYmxlIHplcm8gY29weSBiZXR3ZWVuCisJICogZ3Vlc3Qga2VybmVsIGFuZCBob3N0IGtlcm5lbCB3aGVuIGxvd2VyIGRldmljZSBzdXBwb3J0cyB6ZXJvY29weQorCSAqLworCWlmICh2bGFuKSB7CisJCWlmICgodmxhbi0+bG93ZXJkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9ISUdIRE1BKSAmJgorCQkgICAgKHZsYW4tPmxvd2VyZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfU0cpKQorCQkJc29ja19zZXRfZmxhZygmcS0+c2ssIFNPQ0tfWkVST0NPUFkpOworCX0KKwogCWVyciA9IG1hY3Z0YXBfc2V0X3F1ZXVlKGRldiwgZmlsZSwgcSk7CiAJaWYgKGVycikKIAkJc29ja19wdXQoJnEtPnNrKTsKQEAgLTQzMyw2ICs0NDUsODAgQEAKIAlyZXR1cm4gc2tiOwogfQogCisvKiBzZXQgc2tiIGZyYWdzIGZyb20gaW92ZWMsIHRoaXMgY2FuIG1vdmUgdG8gY29yZSBuZXR3b3JrIGNvZGUgZm9yIHJldXNlICovCitzdGF0aWMgaW50IHplcm9jb3B5X3NnX2Zyb21faW92ZWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGlvdmVjICpmcm9tLAorCQkJCSAgaW50IG9mZnNldCwgc2l6ZV90IGNvdW50KQoreworCWludCBsZW4gPSBpb3ZfbGVuZ3RoKGZyb20sIGNvdW50KSAtIG9mZnNldDsKKwlpbnQgY29weSA9IHNrYl9oZWFkbGVuKHNrYik7CisJaW50IHNpemUsIG9mZnNldDEgPSAwOworCWludCBpID0gMDsKKwlza2JfZnJhZ190ICpmOworCisJLyogU2tpcCBvdmVyIGZyb20gb2Zmc2V0ICovCisJd2hpbGUgKGNvdW50ICYmIChvZmZzZXQgPj0gZnJvbS0+aW92X2xlbikpIHsKKwkJb2Zmc2V0IC09IGZyb20tPmlvdl9sZW47CisJCSsrZnJvbTsKKwkJLS1jb3VudDsKKwl9CisKKwkvKiBjb3B5IHVwIHRvIHNrYiBoZWFkbGVuICovCisJd2hpbGUgKGNvdW50ICYmIChjb3B5ID4gMCkpIHsKKwkJc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgY29weSwgZnJvbS0+aW92X2xlbiAtIG9mZnNldCk7CisJCWlmIChjb3B5X2Zyb21fdXNlcihza2ItPmRhdGEgKyBvZmZzZXQxLCBmcm9tLT5pb3ZfYmFzZSArIG9mZnNldCwKKwkJCQkgICBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weSA+IHNpemUpIHsKKwkJCSsrZnJvbTsKKwkJCS0tY291bnQ7CisJCX0KKwkJY29weSAtPSBzaXplOworCQlvZmZzZXQxICs9IHNpemU7CisJCW9mZnNldCA9IDA7CisJfQorCisJaWYgKGxlbiA9PSBvZmZzZXQxKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlW01BWF9TS0JfRlJBR1NdOworCQlpbnQgbnVtX3BhZ2VzOworCQl1bnNpZ25lZCBsb25nIGJhc2U7CisKKwkJbGVuID0gZnJvbS0+aW92X2xlbiAtIG9mZnNldDE7CisJCWlmICghbGVuKSB7CisJCQlvZmZzZXQxID0gMDsKKwkJCSsrZnJvbTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJhc2UgPSAodW5zaWduZWQgbG9uZylmcm9tLT5pb3ZfYmFzZSArIG9mZnNldDE7CisJCXNpemUgPSAoKGJhc2UgJiB+UEFHRV9NQVNLKSArIGxlbiArIH5QQUdFX01BU0spID4+IFBBR0VfU0hJRlQ7CisJCW51bV9wYWdlcyA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYmFzZSwgc2l6ZSwgMCwgJnBhZ2VbaV0pOworCQlpZiAoKG51bV9wYWdlcyAhPSBzaXplKSB8fAorCQkgICAgKG51bV9wYWdlcyA+IE1BWF9TS0JfRlJBR1MgLSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSkKKwkJCS8qIHB1dF9wYWdlIGlzIGluIHNrYiBmcmVlICovCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2tiLT5kYXRhX2xlbiArPSBsZW47CisJCXNrYi0+bGVuICs9IGxlbjsKKwkJc2tiLT50cnVlc2l6ZSArPSBsZW47CisJCWF0b21pY19hZGQobGVuLCAmc2tiLT5zay0+c2tfd21lbV9hbGxvYyk7CisJCXdoaWxlIChsZW4pIHsKKwkJCWYgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJCWYtPnBhZ2UgPSBwYWdlW2ldOworCQkJZi0+cGFnZV9vZmZzZXQgPSBiYXNlICYgflBBR0VfTUFTSzsKKwkJCWYtPnNpemUgPSBtaW5fdChpbnQsIGxlbiwgUEFHRV9TSVpFIC0gZi0+cGFnZV9vZmZzZXQpOworCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncysrOworCQkJLyogaW5jcmVhc2Ugc2tfd21lbV9hbGxvYyAqLworCQkJYmFzZSArPSBmLT5zaXplOworCQkJbGVuIC09IGYtPnNpemU7CisJCQlpKys7CisJCX0KKwkJb2Zmc2V0MSA9IDA7CisJCSsrZnJvbTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBtYWN2dGFwX3NrYl9mcm9tX3ZuZXRfaGRyIGFuZCBtYWN2dGFwX3NrYl90b192bmV0X2hkciBzaG91bGQKICAqIGJlIHNoYXJlZCB3aXRoIHRoZSB0dW4vdGFwIGRyaXZlci4KQEAgLTUwOCw2ICs1OTQsOCBAQAogCQl2bmV0X2hkci0+ZmxhZ3MgPSBWSVJUSU9fTkVUX0hEUl9GX05FRURTX0NTVU07CiAJCXZuZXRfaGRyLT5jc3VtX3N0YXJ0ID0gc2tiX2NoZWNrc3VtX3N0YXJ0X29mZnNldChza2IpOwogCQl2bmV0X2hkci0+Y3N1bV9vZmZzZXQgPSBza2ItPmNzdW1fb2Zmc2V0OworCX0gZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpIHsKKwkJdm5ldF9oZHItPmZsYWdzID0gVklSVElPX05FVF9IRFJfRl9EQVRBX1ZBTElEOwogCX0gLyogZWxzZSBldmVyeXRoaW5nIGlzIHplcm8gKi8KIAogCXJldHVybiAwOwpAQCAtNTE1LDE2ICs2MDMsMTggQEAKIAogCiAvKiBHZXQgcGFja2V0IGZyb20gdXNlciBzcGFjZSBidWZmZXIgKi8KLXN0YXRpYyBzc2l6ZV90IG1hY3Z0YXBfZ2V0X3VzZXIoc3RydWN0IG1hY3Z0YXBfcXVldWUgKnEsCi0JCQkJY29uc3Qgc3RydWN0IGlvdmVjICppdiwgc2l6ZV90IGNvdW50LAotCQkJCWludCBub2Jsb2NrKQorc3RhdGljIHNzaXplX3QgbWFjdnRhcF9nZXRfdXNlcihzdHJ1Y3QgbWFjdnRhcF9xdWV1ZSAqcSwgc3RydWN0IG1zZ2hkciAqbSwKKwkJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKml2LCB1bnNpZ25lZCBsb25nIHRvdGFsX2xlbiwKKwkJCQlzaXplX3QgY291bnQsIGludCBub2Jsb2NrKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG1hY3ZsYW5fZGV2ICp2bGFuOwotCXNpemVfdCBsZW4gPSBjb3VudDsKKwl1bnNpZ25lZCBsb25nIGxlbiA9IHRvdGFsX2xlbjsKIAlpbnQgZXJyOwogCXN0cnVjdCB2aXJ0aW9fbmV0X2hkciB2bmV0X2hkciA9IHsgMCB9OwogCWludCB2bmV0X2hkcl9sZW4gPSAwOworCWludCBjb3B5bGVuOworCWJvb2wgemVyb2NvcHkgPSBmYWxzZTsKIAogCWlmIChxLT5mbGFncyAmIElGRl9WTkVUX0hEUikgewogCQl2bmV0X2hkcl9sZW4gPSBxLT52bmV0X2hkcl9zejsKQEAgLTU1MiwxMiArNjQyLDMxIEBACiAJaWYgKHVubGlrZWx5KGxlbiA8IEVUSF9ITEVOKSkKIAkJZ290byBlcnI7CiAKLQlza2IgPSBtYWN2dGFwX2FsbG9jX3NrYigmcS0+c2ssIE5FVF9JUF9BTElHTiwgbGVuLCB2bmV0X2hkci5oZHJfbGVuLAotCQkJCW5vYmxvY2ssICZlcnIpOworCWlmIChtICYmIG0tPm1zZ19jb250cm9sICYmIHNvY2tfZmxhZygmcS0+c2ssIFNPQ0tfWkVST0NPUFkpKQorCQl6ZXJvY29weSA9IHRydWU7CisKKwlpZiAoemVyb2NvcHkpIHsKKwkJLyogVGhlcmUgYXJlIDI1NiBieXRlcyB0byBiZSBjb3BpZWQgaW4gc2tiLCBzbyB0aGVyZSBpcyBlbm91Z2gKKwkJICogcm9vbSBmb3Igc2tiIGV4cGFuZCBoZWFkIGluIGNhc2UgaXQgaXMgdXNlZC4KKwkJICogVGhlIHJlc3QgYnVmZmVyIGlzIG1hcHBlZCBmcm9tIHVzZXJzcGFjZS4KKwkJICovCisJCWNvcHlsZW4gPSB2bmV0X2hkci5oZHJfbGVuOworCQlpZiAoIWNvcHlsZW4pCisJCQljb3B5bGVuID0gR09PRENPUFlfTEVOOworCX0gZWxzZQorCQljb3B5bGVuID0gbGVuOworCisJc2tiID0gbWFjdnRhcF9hbGxvY19za2IoJnEtPnNrLCBORVRfSVBfQUxJR04sIGNvcHlsZW4sCisJCQkJdm5ldF9oZHIuaGRyX2xlbiwgbm9ibG9jaywgJmVycik7CiAJaWYgKCFza2IpCiAJCWdvdG8gZXJyOwogCi0JZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1fZnJvbV9pb3ZlYyhza2IsIDAsIGl2LCB2bmV0X2hkcl9sZW4sIGxlbik7CisJaWYgKHplcm9jb3B5KSB7CisJCWVyciA9IHplcm9jb3B5X3NnX2Zyb21faW92ZWMoc2tiLCBpdiwgdm5ldF9oZHJfbGVuLCBjb3VudCk7CisJCXNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgfD0gU0tCVFhfREVWX1pFUk9DT1BZOworCX0gZWxzZQorCQllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9mcm9tX2lvdmVjKHNrYiwgMCwgaXYsIHZuZXRfaGRyX2xlbiwKKwkJCQkJCSAgIGxlbik7CiAJaWYgKGVycikKIAkJZ290byBlcnJfa2ZyZWU7CiAKQEAgLTU3MywxMyArNjgyLDE2IEBACiAKIAlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJdmxhbiA9IHJjdV9kZXJlZmVyZW5jZV9iaChxLT52bGFuKTsKKwkvKiBjb3B5IHNrYl91YnVmX2luZm8gZm9yIGNhbGxiYWNrIHdoZW4gc2tiIGhhcyBubyBlcnJvciAqLworCWlmICh6ZXJvY29weSkKKwkJc2tiX3NoaW5mbyhza2IpLT5kZXN0cnVjdG9yX2FyZyA9IG0tPm1zZ19jb250cm9sOwogCWlmICh2bGFuKQogCQltYWN2bGFuX3N0YXJ0X3htaXQoc2tiLCB2bGFuLT5kZXYpOwogCWVsc2UKIAkJa2ZyZWVfc2tiKHNrYik7CiAJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CiAKLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIHRvdGFsX2xlbjsKIAogZXJyX2tmcmVlOgogCWtmcmVlX3NrYihza2IpOwpAQCAtNjAxLDggKzcxMyw4IEBACiAJc3NpemVfdCByZXN1bHQgPSAtRU5PTElOSzsKIAlzdHJ1Y3QgbWFjdnRhcF9xdWV1ZSAqcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCXJlc3VsdCA9IG1hY3Z0YXBfZ2V0X3VzZXIocSwgaXYsIGlvdl9sZW5ndGgoaXYsIGNvdW50KSwKLQkJCSAgICAgIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlyZXN1bHQgPSBtYWN2dGFwX2dldF91c2VyKHEsIE5VTEwsIGl2LCBpb3ZfbGVuZ3RoKGl2LCBjb3VudCksIGNvdW50LAorCQkJCSAgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTgxNSw3ICs5MjcsNyBAQAogCQkJICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbikKIHsKIAlzdHJ1Y3QgbWFjdnRhcF9xdWV1ZSAqcSA9IGNvbnRhaW5lcl9vZihzb2NrLCBzdHJ1Y3QgbWFjdnRhcF9xdWV1ZSwgc29jayk7Ci0JcmV0dXJuIG1hY3Z0YXBfZ2V0X3VzZXIocSwgbS0+bXNnX2lvdiwgdG90YWxfbGVuLAorCXJldHVybiBtYWN2dGFwX2dldF91c2VyKHEsIG0sIG0tPm1zZ19pb3YsIHRvdGFsX2xlbiwgbS0+bXNnX2lvdmxlbiwKIAkJCSAgICBtLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9taXBzbmV0LmMgYi9kcml2ZXJzL25ldC9taXBzbmV0LmMKaW5kZXggODY5ZjBlYS4uMDA0ZTY0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWlwc25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L21pcHNuZXQuYwpAQCAtNSw2ICs1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L21seDQvZW5fZXRodG9vbC5jCmluZGV4IDJlODU4ZTQuLmViMDk2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvZW5fZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fZXRodG9vbC5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAlpbnQgZXJyID0gMDsKIAl1NjQgY29uZmlnID0gMDsKIAotCWlmICghcHJpdi0+bWRldi0+ZGV2LT5jYXBzLndvbCkgeworCWlmICghKHByaXYtPm1kZXYtPmRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1dPTCkpIHsKIAkJd29sLT5zdXBwb3J0ZWQgPSAwOwogCQl3b2wtPndvbG9wdHMgPSAwOwogCQlyZXR1cm47CkBAIC0xMzQsNyArMTM0LDcgQEAKIAl1NjQgY29uZmlnID0gMDsKIAlpbnQgZXJyID0gMDsKIAotCWlmICghcHJpdi0+bWRldi0+ZGV2LT5jYXBzLndvbCkKKwlpZiAoIShwcml2LT5tZGV2LT5kZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19XT0wpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAod29sLT5zdXBwb3J0ZWQgJiB+V0FLRV9NQUdJQykKQEAgLTE3MCw3ICsxNzAsOCBAQAogCQlyZXR1cm4gTlVNX0FMTF9TVEFUUyArCiAJCQkocHJpdi0+dHhfcmluZ19udW0gKyBwcml2LT5yeF9yaW5nX251bSkgKiAyOwogCWNhc2UgRVRIX1NTX1RFU1Q6Ci0JCXJldHVybiBNTFg0X0VOX05VTV9TRUxGX1RFU1QgLSAhKHByaXYtPm1kZXYtPmRldi0+Y2Fwcy5sb29wYmFja19zdXBwb3J0KSAqIDI7CisJCXJldHVybiBNTFg0X0VOX05VTV9TRUxGX1RFU1QgLSAhKHByaXYtPm1kZXYtPmRldi0+Y2Fwcy5mbGFncworCQkJCQkmIE1MWDRfREVWX0NBUF9GTEFHX1VDX0xPT1BCQUNLKSAqIDI7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KQEAgLTIyMCw3ICsyMjEsNyBAQAogCWNhc2UgRVRIX1NTX1RFU1Q6CiAJCWZvciAoaSA9IDA7IGkgPCBNTFg0X0VOX05VTV9TRUxGX1RFU1QgLSAyOyBpKyspCiAJCQlzdHJjcHkoZGF0YSArIGkgKiBFVEhfR1NUUklOR19MRU4sIG1seDRfZW5fdGVzdF9uYW1lc1tpXSk7Ci0JCWlmIChwcml2LT5tZGV2LT5kZXYtPmNhcHMubG9vcGJhY2tfc3VwcG9ydCkKKwkJaWYgKHByaXYtPm1kZXYtPmRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1VDX0xPT1BCQUNLKQogCQkJZm9yICg7IGkgPCBNTFg0X0VOX05VTV9TRUxGX1RFU1Q7IGkrKykKIAkJCQlzdHJjcHkoZGF0YSArIGkgKiBFVEhfR1NUUklOR19MRU4sIG1seDRfZW5fdGVzdF9uYW1lc1tpXSk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9lbl9tYWluLmMgYi9kcml2ZXJzL25ldC9tbHg0L2VuX21haW4uYwppbmRleCA5Mjc2YjFiMi4uNmJmZWEyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9lbl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9tYWluLmMKQEAgLTEwNiw3ICsxMDYsOCBAQAogCiAJcGFyYW1zLT50Y3BfcnNzID0gdGNwX3JzczsKIAlwYXJhbXMtPnVkcF9yc3MgPSB1ZHBfcnNzOwotCWlmIChwYXJhbXMtPnVkcF9yc3MgJiYgIW1kZXYtPmRldi0+Y2Fwcy51ZHBfcnNzKSB7CisJaWYgKHBhcmFtcy0+dWRwX3JzcyAmJiAhKG1kZXYtPmRldi0+Y2Fwcy5mbGFncworCQkJCQkmIE1MWDRfREVWX0NBUF9GTEFHX1VEUF9SU1MpKSB7CiAJCW1seDRfd2FybihtZGV2LCAiVURQIFJTUyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLlxuIik7CiAJCXBhcmFtcy0+dWRwX3JzcyA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9lbl9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L21seDQvZW5fbmV0ZGV2LmMKaW5kZXggNjE4NTBhZC4uNGIwZjMyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9lbl9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9tbHg0L2VuX25ldGRldi5jCkBAIC00NSwyNSArNDUsNiBAQAogI2luY2x1ZGUgIm1seDRfZW4uaCIKICNpbmNsdWRlICJlbl9wb3J0LmgiCiAKLQotc3RhdGljIHZvaWQgbWx4NF9lbl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1seDRfZW5fZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKLQlpbnQgZXJyOwotCi0JZW5fZGJnKEhXLCBwcml2LCAiUmVnaXN0ZXJpbmcgVkxBTiBncm91cDolcFxuIiwgZ3JwKTsKLQlwcml2LT52bGdycCA9IGdycDsKLQotCW11dGV4X2xvY2soJm1kZXYtPnN0YXRlX2xvY2spOwotCWlmIChtZGV2LT5kZXZpY2VfdXAgJiYgcHJpdi0+cG9ydF91cCkgewotCQllcnIgPSBtbHg0X1NFVF9WTEFOX0ZMVFIobWRldi0+ZGV2LCBwcml2LT5wb3J0LCBncnApOwotCQlpZiAoZXJyKQotCQkJZW5fZXJyKHByaXYsICJGYWlsZWQgY29uZmlndXJpbmcgVkxBTiBmaWx0ZXJcbiIpOwotCX0KLQltdXRleF91bmxvY2soJm1kZXYtPnN0YXRlX2xvY2spOwotfQotCiBzdGF0aWMgdm9pZCBtbHg0X2VuX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CkBAIC03MSwxNiArNTIsMTQgQEAKIAlpbnQgZXJyOwogCWludCBpZHg7CiAKLQlpZiAoIXByaXYtPnZsZ3JwKQotCQlyZXR1cm47CisJZW5fZGJnKEhXLCBwcml2LCAiYWRkaW5nIFZMQU46JWRcbiIsIHZpZCk7CiAKLQllbl9kYmcoSFcsIHByaXYsICJhZGRpbmcgVkxBTjolZCAodmxncnAgZW50cnk6JXApXG4iLAotCSAgICAgICB2aWQsIHZsYW5fZ3JvdXBfZ2V0X2RldmljZShwcml2LT52bGdycCwgdmlkKSk7CisJc2V0X2JpdCh2aWQsIHByaXYtPmFjdGl2ZV92bGFucyk7CiAKIAkvKiBBZGQgVklEIHRvIHBvcnQgVkxBTiBmaWx0ZXIgKi8KIAltdXRleF9sb2NrKCZtZGV2LT5zdGF0ZV9sb2NrKTsKIAlpZiAobWRldi0+ZGV2aWNlX3VwICYmIHByaXYtPnBvcnRfdXApIHsKLQkJZXJyID0gbWx4NF9TRVRfVkxBTl9GTFRSKG1kZXYtPmRldiwgcHJpdi0+cG9ydCwgcHJpdi0+dmxncnApOworCQllcnIgPSBtbHg0X1NFVF9WTEFOX0ZMVFIobWRldi0+ZGV2LCBwcml2KTsKIAkJaWYgKGVycikKIAkJCWVuX2Vycihwcml2LCAiRmFpbGVkIGNvbmZpZ3VyaW5nIFZMQU4gZmlsdGVyXG4iKTsKIAl9CkBAIC05NywxMiArNzYsOSBAQAogCWludCBlcnI7CiAJaW50IGlkeDsKIAotCWlmICghcHJpdi0+dmxncnApCi0JCXJldHVybjsKKwllbl9kYmcoSFcsIHByaXYsICJLaWxsaW5nIFZJRDolZFxuIiwgdmlkKTsKIAotCWVuX2RiZyhIVywgcHJpdiwgIktpbGxpbmcgVklEOiVkICh2bGdycDolcCB2bGdycCBlbnRyeTolcClcbiIsCi0JICAgICAgIHZpZCwgcHJpdi0+dmxncnAsIHZsYW5fZ3JvdXBfZ2V0X2RldmljZShwcml2LT52bGdycCwgdmlkKSk7Ci0Jdmxhbl9ncm91cF9zZXRfZGV2aWNlKHByaXYtPnZsZ3JwLCB2aWQsIE5VTEwpOworCWNsZWFyX2JpdCh2aWQsIHByaXYtPmFjdGl2ZV92bGFucyk7CiAKIAkvKiBSZW1vdmUgVklEIGZyb20gcG9ydCBWTEFOIGZpbHRlciAqLwogCW11dGV4X2xvY2soJm1kZXYtPnN0YXRlX2xvY2spOwpAQCAtMTEyLDcgKzg4LDcgQEAKIAkJZW5fZXJyKHByaXYsICJjb3VsZCBub3QgZmluZCB2aWQgJWQgaW4gY2FjaGVcbiIsIHZpZCk7CiAKIAlpZiAobWRldi0+ZGV2aWNlX3VwICYmIHByaXYtPnBvcnRfdXApIHsKLQkJZXJyID0gbWx4NF9TRVRfVkxBTl9GTFRSKG1kZXYtPmRldiwgcHJpdi0+cG9ydCwgcHJpdi0+dmxncnApOworCQllcnIgPSBtbHg0X1NFVF9WTEFOX0ZMVFIobWRldi0+ZGV2LCBwcml2KTsKIAkJaWYgKGVycikKIAkJCWVuX2Vycihwcml2LCAiRmFpbGVkIGNvbmZpZ3VyaW5nIFZMQU4gZmlsdGVyXG4iKTsKIAl9CkBAIC0yMzksNyArMjE1LDggQEAKIAkJCXByaXYtPmZsYWdzIHw9IE1MWDRfRU5fRkxBR19QUk9NSVNDOwogCiAJCQkvKiBFbmFibGUgcHJvbWlzY291b3MgbW9kZSAqLwotCQkJaWYgKCFtZGV2LT5kZXYtPmNhcHMudmVwX3VjX3N0ZWVyaW5nKQorCQkJaWYgKCEobWRldi0+ZGV2LT5jYXBzLmZsYWdzICYKKwkJCQkJCU1MWDRfREVWX0NBUF9GTEFHX1ZFUF9VQ19TVEVFUikpCiAJCQkJZXJyID0gbWx4NF9TRVRfUE9SVF9xcG5fY2FsYyhtZGV2LT5kZXYsIHByaXYtPnBvcnQsCiAJCQkJCQkJICAgICBwcml2LT5iYXNlX3FwbiwgMSk7CiAJCQllbHNlCkBAIC0yNjUsMTIgKzI0MiwxMCBAQAogCQkJCXByaXYtPmZsYWdzIHw9IE1MWDRfRU5fRkxBR19NQ19QUk9NSVNDOwogCQkJfQogCi0JCQlpZiAocHJpdi0+dmxncnApIHsKLQkJCQkvKiBEaXNhYmxlIHBvcnQgVkxBTiBmaWx0ZXIgKi8KLQkJCQllcnIgPSBtbHg0X1NFVF9WTEFOX0ZMVFIobWRldi0+ZGV2LCBwcml2LT5wb3J0LCBOVUxMKTsKLQkJCQlpZiAoZXJyKQotCQkJCQllbl9lcnIocHJpdiwgIkZhaWxlZCBkaXNhYmxpbmcgVkxBTiBmaWx0ZXJcbiIpOwotCQkJfQorCQkJLyogRGlzYWJsZSBwb3J0IFZMQU4gZmlsdGVyICovCisJCQllcnIgPSBtbHg0X1NFVF9WTEFOX0ZMVFIobWRldi0+ZGV2LCBwcml2KTsKKwkJCWlmIChlcnIpCisJCQkJZW5fZXJyKHByaXYsICJGYWlsZWQgZGlzYWJsaW5nIFZMQU4gZmlsdGVyXG4iKTsKIAkJfQogCQlnb3RvIG91dDsKIAl9CkBAIC0yODUsNyArMjYwLDcgQEAKIAkJcHJpdi0+ZmxhZ3MgJj0gfk1MWDRfRU5fRkxBR19QUk9NSVNDOwogCiAJCS8qIERpc2FibGUgcHJvbWlzY291b3MgbW9kZSAqLwotCQlpZiAoIW1kZXYtPmRldi0+Y2Fwcy52ZXBfdWNfc3RlZXJpbmcpCisJCWlmICghKG1kZXYtPmRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9VQ19TVEVFUikpCiAJCQllcnIgPSBtbHg0X1NFVF9QT1JUX3Fwbl9jYWxjKG1kZXYtPmRldiwgcHJpdi0+cG9ydCwKIAkJCQkJCSAgICAgcHJpdi0+YmFzZV9xcG4sIDApOwogCQllbHNlCkBAIC0zMDQsNyArMjc5LDcgQEAKIAkJfQogCiAJCS8qIEVuYWJsZSBwb3J0IFZMQU4gZmlsdGVyICovCi0JCWVyciA9IG1seDRfU0VUX1ZMQU5fRkxUUihtZGV2LT5kZXYsIHByaXYtPnBvcnQsIHByaXYtPnZsZ3JwKTsKKwkJZXJyID0gbWx4NF9TRVRfVkxBTl9GTFRSKG1kZXYtPmRldiwgcHJpdik7CiAJCWlmIChlcnIpCiAJCQllbl9lcnIocHJpdiwgIkZhaWxlZCBlbmFibGluZyBWTEFOIGZpbHRlclxuIik7CiAJfQpAQCAtMTA0Niw3ICsxMDIxLDYgQEAKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKIAkubmRvX2NoYW5nZV9tdHUJCT0gbWx4NF9lbl9jaGFuZ2VfbXR1LAogCS5uZG9fdHhfdGltZW91dAkJPSBtbHg0X2VuX3R4X3RpbWVvdXQsCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gbWx4NF9lbl92bGFuX3J4X3JlZ2lzdGVyLAogCS5uZG9fdmxhbl9yeF9hZGRfdmlkCT0gbWx4NF9lbl92bGFuX3J4X2FkZF92aWQsCiAJLm5kb192bGFuX3J4X2tpbGxfdmlkCT0gbWx4NF9lbl92bGFuX3J4X2tpbGxfdmlkLAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX3BvcnQuYyBiL2RyaXZlcnMvbmV0L21seDQvZW5fcG9ydC5jCmluZGV4IGYyYTRmNWQuLjVlNzEwOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvZW5fcG9ydC5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fcG9ydC5jCkBAIC00OCw3ICs0OCw3IEBACiAJCQlNTFg0X0NNRF9TRVRfTUNBU1RfRkxUUiwgTUxYNF9DTURfVElNRV9DTEFTU19CKTsKIH0KIAotaW50IG1seDRfU0VUX1ZMQU5fRkxUUihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK2ludCBtbHg0X1NFVF9WTEFOX0ZMVFIoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7CiAJc3RydWN0IG1seDRfc2V0X3ZsYW5fZmx0cl9tYm94ICpmaWx0ZXI7CkBAIC02MywyMCArNjMsMTUgQEAKIAkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CiAKIAlmaWx0ZXIgPSBtYWlsYm94LT5idWY7Ci0JaWYgKGdycCkgewotCQltZW1zZXQoZmlsdGVyLCAwLCBzaXplb2YgKmZpbHRlcik7Ci0JCWZvciAoaSA9IFZMQU5fRkxUUl9TSVpFIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWVudHJ5ID0gMDsKLQkJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKQotCQkJCWlmICh2bGFuX2dyb3VwX2dldF9kZXZpY2UoZ3JwLCBpbmRleCsrKSkKLQkJCQkJZW50cnkgfD0gMSA8PCBqOwotCQkJZmlsdGVyLT5lbnRyeVtpXSA9IGNwdV90b19iZTMyKGVudHJ5KTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFdoZW4gbm8gdmxhbnMgYXJlIGNvbmZpZ3VyZWQgd2UgYmxvY2sgYWxsIHZsYW5zICovCi0JCW1lbXNldChmaWx0ZXIsIDAsIHNpemVvZigqZmlsdGVyKSk7CisJbWVtc2V0KGZpbHRlciwgMCwgc2l6ZW9mKCpmaWx0ZXIpKTsKKwlmb3IgKGkgPSBWTEFOX0ZMVFJfU0laRSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWVudHJ5ID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspCisJCQlpZiAodGVzdF9iaXQoaW5kZXgrKywgcHJpdi0+YWN0aXZlX3ZsYW5zKSkKKwkJCQllbnRyeSB8PSAxIDw8IGo7CisJCWZpbHRlci0+ZW50cnlbaV0gPSBjcHVfdG9fYmUzMihlbnRyeSk7CiAJfQotCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBwb3J0LCAwLCBNTFg0X0NNRF9TRVRfVkxBTl9GTFRSLAorCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBwcml2LT5wb3J0LCAwLCBNTFg0X0NNRF9TRVRfVkxBTl9GTFRSLAogCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19CKTsKIAltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwpAQCAtMTE5LDkgKzExNCwxMSBAQAogCXN0cnVjdCBtbHg0X3NldF9wb3J0X3JxcF9jYWxjX2NvbnRleHQgKmNvbnRleHQ7CiAJaW50IGVycjsKIAl1MzIgaW5fbW9kOwotCXUzMiBtX3Byb21pc2MgPSAoZGV2LT5jYXBzLnZlcF9tY19zdGVlcmluZykgPyBNQ0FTVF9ESVJFQ1QgOiBNQ0FTVF9ERUZBVUxUOworCXUzMiBtX3Byb21pc2MgPSAoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX01DX1NURUVSKSA/CisJCQkJCQlNQ0FTVF9ESVJFQ1QgOiBNQ0FTVF9ERUZBVUxUOwogCi0JaWYgKGRldi0+Y2Fwcy52ZXBfbWNfc3RlZXJpbmcgJiYgZGV2LT5jYXBzLnZlcF91Y19zdGVlcmluZykKKwlpZiAoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX01DX1NURUVSICAmJgorCQkJZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX1VDX1NURUVSKQogCQlyZXR1cm4gMDsKIAogCW1haWxib3ggPSBtbHg0X2FsbG9jX2NtZF9tYWlsYm94KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX3J4LmMgYi9kcml2ZXJzL25ldC9tbHg0L2VuX3J4LmMKaW5kZXggMjc3MjE1Zi4uMzdjYzllNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9lbl9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fcnguYwpAQCAtNjExLDExICs2MTEsMTQgQEAKIAkJCQkJZ3JvX3NrYi0+dHJ1ZXNpemUgKz0gbGVuZ3RoOwogCQkJCQlncm9fc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAotCQkJCQlpZiAocHJpdi0+dmxncnAgJiYgKGNxZS0+dmxhbl9teV9xcG4gJgotCQkJCQkJCSAgICBjcHVfdG9fYmUzMihNTFg0X0NRRV9WTEFOX1BSRVNFTlRfTUFTSykpKQotCQkJCQkJdmxhbl9ncm9fZnJhZ3MoJmNxLT5uYXBpLCBwcml2LT52bGdycCwgYmUxNl90b19jcHUoY3FlLT5zbF92aWQpKTsKLQkJCQkJZWxzZQotCQkJCQkJbmFwaV9ncm9fZnJhZ3MoJmNxLT5uYXBpKTsKKwkJCQkJaWYgKGNxZS0+dmxhbl9teV9xcG4gJgorCQkJCQkgICAgY3B1X3RvX2JlMzIoTUxYNF9DUUVfVkxBTl9QUkVTRU5UX01BU0spKSB7CisJCQkJCQl1MTYgdmlkID0gYmUxNl90b19jcHUoY3FlLT5zbF92aWQpOworCisJCQkJCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKGdyb19za2IsIHZpZCk7CisJCQkJCX0KKworCQkJCQluYXBpX2dyb19mcmFncygmY3EtPm5hcGkpOwogCiAJCQkJCWdvdG8gbmV4dDsKIAkJCQl9CkBAIC02NDcsMTMgKzY1MCwxMiBAQAogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgY3EtPnJpbmcpOwogCisJCWlmIChiZTMyX3RvX2NwdShjcWUtPnZsYW5fbXlfcXBuKSAmCisJCSAgICBNTFg0X0NRRV9WTEFOX1BSRVNFTlRfTUFTSykKKwkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCBiZTE2X3RvX2NwdShjcWUtPnNsX3ZpZCkpOworCiAJCS8qIFB1c2ggaXQgdXAgdGhlIHN0YWNrICovCi0JCWlmIChwcml2LT52bGdycCAmJiAoYmUzMl90b19jcHUoY3FlLT52bGFuX215X3FwbikgJgotCQkJCSAgICBNTFg0X0NRRV9WTEFOX1BSRVNFTlRfTUFTSykpIHsKLQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIHByaXYtPnZsZ3JwLAotCQkJCQkJYmUxNl90b19jcHUoY3FlLT5zbF92aWQpKTsKLQkJfSBlbHNlCi0JCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCiBuZXh0OgogCQkrK2NxLT5tY3EuY29uc19pbmRleDsKQEAgLTg1OSw3ICs4NjEsNyBAQAogCQkJCXByaXYtPnJ4X3JpbmdbMF0uY3FuLCAmY29udGV4dCk7CiAKIAlwdHIgPSAoKHZvaWQgKikgJmNvbnRleHQpICsgMHgzYzsKLQlyc3NfY29udGV4dCA9IChzdHJ1Y3QgbWx4NF9lbl9yc3NfY29udGV4dCAqKSBwdHI7CisJcnNzX2NvbnRleHQgPSBwdHI7CiAJcnNzX2NvbnRleHQtPmJhc2VfcXBuID0gY3B1X3RvX2JlMzIoaWxvZzIocHJpdi0+cnhfcmluZ19udW0pIDw8IDI0IHwKIAkJCQkJICAgIChyc3NfbWFwLT5iYXNlX3FwbikpOwogCXJzc19jb250ZXh0LT5kZWZhdWx0X3FwbiA9IGNwdV90b19iZTMyKHJzc19tYXAtPmJhc2VfcXBuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvZW5fc2VsZnRlc3QuYyBiL2RyaXZlcnMvbmV0L21seDQvZW5fc2VsZnRlc3QuYwppbmRleCAxOTFhOGRjLi45ZmRiY2VjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2VuX3NlbGZ0ZXN0LmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9zZWxmdGVzdC5jCkBAIC0xNTksNyArMTU5LDggQEAKIAkJCQlnb3RvIHJldHJ5X3R4OwogCQl9CiAKLQkJaWYgKHByaXYtPm1kZXYtPmRldi0+Y2Fwcy5sb29wYmFja19zdXBwb3J0KXsKKwkJaWYgKHByaXYtPm1kZXYtPmRldi0+Y2Fwcy5mbGFncyAmCisJCQkJCU1MWDRfREVWX0NBUF9GTEFHX1VDX0xPT1BCQUNLKSB7CiAJCQlidWZbM10gPSBtbHg0X2VuX3Rlc3RfcmVnaXN0ZXJzKHByaXYpOwogCQkJYnVmWzRdID0gbWx4NF9lbl90ZXN0X2xvb3BiYWNrKHByaXYpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX3R4LmMgYi9kcml2ZXJzL25ldC9tbHg0L2VuX3R4LmMKaW5kZXggYjIyOWFjZi4uNmUwM2RlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9lbl90eC5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fdHguYwpAQCAtMjM4LDggKzIzOCw3IEBACiAJfSBlbHNlIHsKIAkJaWYgKCF0eF9pbmZvLT5pbmwpIHsKIAkJCWlmICgodm9pZCAqKSBkYXRhID49IGVuZCkgewotCQkJCWRhdGEgPSAoc3RydWN0IG1seDRfd3FlX2RhdGFfc2VnICopCi0JCQkJCQkocmluZy0+YnVmICsgKCh2b2lkICopIGRhdGEgLSBlbmQpKTsKKwkJCQlkYXRhID0gcmluZy0+YnVmICsgKCh2b2lkICopZGF0YSAtIGVuZCk7CiAJCQl9CiAKIAkJCWlmICh0eF9pbmZvLT5saW5lYXIpIHsKQEAgLTI1Myw3ICsyNTIsNyBAQAogCQkJZm9yIChpID0gMDsgaSA8IGZyYWdzOyBpKyspIHsKIAkJCQkvKiBDaGVjayBmb3Igd3JhcGFyb3VuZCBiZWZvcmUgdW5tYXBwaW5nICovCiAJCQkJaWYgKCh2b2lkICopIGRhdGEgPj0gZW5kKQotCQkJCQlkYXRhID0gKHN0cnVjdCBtbHg0X3dxZV9kYXRhX3NlZyAqKSByaW5nLT5idWY7CisJCQkJCWRhdGEgPSByaW5nLT5idWY7CiAJCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwogCQkJCXBjaV91bm1hcF9wYWdlKG1kZXYtPnBkZXYsCiAJCQkJCShkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhLT5hZGRyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvZncuYyBiL2RyaXZlcnMvbmV0L21seDQvZncuYwppbmRleCA2N2EyMDliLi43ZWI4YmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9mdy5jCkBAIC03NSw3ICs3NSw3IEBACiAJCX0JCQkJCQkgICAgICBcCiAJfSB3aGlsZSAoMCkKIAotc3RhdGljIHZvaWQgZHVtcF9kZXZfY2FwX2ZsYWdzKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgZmxhZ3MpCitzdGF0aWMgdm9pZCBkdW1wX2Rldl9jYXBfZmxhZ3Moc3RydWN0IG1seDRfZGV2ICpkZXYsIHU2NCBmbGFncykKIHsKIAlzdGF0aWMgY29uc3QgY2hhciAqZm5hbWVbXSA9IHsKIAkJWyAwXSA9ICJSQyB0cmFuc3BvcnQiLApAQCAtOTksMTMgKzk5LDE5IEBACiAJCVsyMV0gPSAiVUQgbXVsdGljYXN0IHN1cHBvcnQiLAogCQlbMjRdID0gIkRlbWFuZCBwYWdpbmcgc3VwcG9ydCIsCiAJCVsyNV0gPSAiUm91dGVyIHN1cHBvcnQiLAotCQlbMzBdID0gIklCb0Ugc3VwcG9ydCIKKwkJWzMwXSA9ICJJQm9FIHN1cHBvcnQiLAorCQlbMzJdID0gIlVuaWNhc3QgbG9vcGJhY2sgc3VwcG9ydCIsCisJCVszOF0gPSAiV2FrZSBPbiBMQU4gc3VwcG9ydCIsCisJCVs0MF0gPSAiVURQIFJTUyBzdXBwb3J0IiwKKwkJWzQxXSA9ICJVbmljYXN0IFZFUCBzdGVlcmluZyBzdXBwb3J0IiwKKwkJWzQyXSA9ICJNdWx0aWNhc3QgVkVQIHN0ZWVyaW5nIHN1cHBvcnQiLAorCQlbNDhdID0gIkNvdW50ZXJzIHN1cHBvcnQiLAogCX07CiAJaW50IGk7CiAKIAltbHg0X2RiZyhkZXYsICJERVZfQ0FQIGZsYWdzOlxuIik7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZm5hbWUpOyArK2kpCi0JCWlmIChmbmFtZVtpXSAmJiAoZmxhZ3MgJiAoMSA8PCBpKSkpCisJCWlmIChmbmFtZVtpXSAmJiAoZmxhZ3MgJiAoMUxMIDw8IGkpKSkKIAkJCW1seDRfZGJnKGRldiwgIiAgICAlc1xuIiwgZm5hbWVbaV0pOwogfQogCkBAIC0xNDIsNyArMTQ4LDcgQEAKIAlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveDsKIAl1MzIgKm91dGJveDsKIAl1OCBmaWVsZDsKLQl1MzIgZmllbGQzMjsKKwl1MzIgZmllbGQzMiwgZmxhZ3MsIGV4dF9mbGFnczsKIAl1MTYgc2l6ZTsKIAl1MTYgc3RhdF9yYXRlOwogCWludCBlcnI7CkBAIC0xODAsOCArMTg2LDcgQEAKICNkZWZpbmUgUVVFUllfREVWX0NBUF9NQVhfR0lEX09GRlNFVAkJMHgzYgogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX1JBVEVfU1VQUE9SVF9PRkZTRVQJMHgzYwogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX01BWF9QS0VZX09GRlNFVAkJMHgzZgotI2RlZmluZSBRVUVSWV9ERVZfQ0FQX1VEUF9SU1NfT0ZGU0VUCQkweDQyCi0jZGVmaW5lIFFVRVJZX0RFVl9DQVBfRVRIX1VDX0xPT1BCQUNLX09GRlNFVAkweDQzCisjZGVmaW5lIFFVRVJZX0RFVl9DQVBfRVhUX0ZMQUdTX09GRlNFVAkJMHg0MAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX0ZMQUdTX09GRlNFVAkJMHg0NAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX1JTVkRfVUFSX09GRlNFVAkJMHg0OAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX1VBUl9TWl9PRkZTRVQJCTB4NDkKQEAgLTE5OSw2ICsyMDQsNyBAQAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX01BWF9NQ0dfT0ZGU0VUCQkweDYzCiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUlNWRF9QRF9PRkZTRVQJCTB4NjQKICNkZWZpbmUgUVVFUllfREVWX0NBUF9NQVhfUERfT0ZGU0VUCQkweDY1CisjZGVmaW5lIFFVRVJZX0RFVl9DQVBfTUFYX0NPVU5URVJTX09GRlNFVAkweDY4CiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUkRNQVJDX0VOVFJZX1NaX09GRlNFVAkweDgwCiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUVBDX0VOVFJZX1NaX09GRlNFVAkweDgyCiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfQVVYX0VOVFJZX1NaX09GRlNFVAkweDg0CkBAIC0yNzIsMTQgKzI3OCw5IEBACiAJZGV2X2NhcC0+bWF4X21zZ19zeiA9IDEgPDwgKGZpZWxkICYgMHgxZik7CiAJTUxYNF9HRVQoc3RhdF9yYXRlLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfUkFURV9TVVBQT1JUX09GRlNFVCk7CiAJZGV2X2NhcC0+c3RhdF9yYXRlX3N1cHBvcnQgPSBzdGF0X3JhdGU7Ci0JTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9VRFBfUlNTX09GRlNFVCk7Ci0JZGV2X2NhcC0+dWRwX3JzcyA9IGZpZWxkICYgMHgxOwotCWRldl9jYXAtPnZlcF91Y19zdGVlcmluZyA9IGZpZWxkICYgMHgyOwotCWRldl9jYXAtPnZlcF9tY19zdGVlcmluZyA9IGZpZWxkICYgMHg0OwotCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfRVRIX1VDX0xPT1BCQUNLX09GRlNFVCk7Ci0JZGV2X2NhcC0+bG9vcGJhY2tfc3VwcG9ydCA9IGZpZWxkICYgMHgxOwotCWRldl9jYXAtPndvbCA9IGZpZWxkICYgMHg0MDsKLQlNTFg0X0dFVChkZXZfY2FwLT5mbGFncywgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX0ZMQUdTX09GRlNFVCk7CisJTUxYNF9HRVQoZXh0X2ZsYWdzLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfRVhUX0ZMQUdTX09GRlNFVCk7CisJTUxYNF9HRVQoZmxhZ3MsIG91dGJveCwgUVVFUllfREVWX0NBUF9GTEFHU19PRkZTRVQpOworCWRldl9jYXAtPmZsYWdzID0gZmxhZ3MgfCAodTY0KWV4dF9mbGFncyA8PCAzMjsKIAlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX1JTVkRfVUFSX09GRlNFVCk7CiAJZGV2X2NhcC0+cmVzZXJ2ZWRfdWFycyA9IGZpZWxkID4+IDQ7CiAJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9VQVJfU1pfT0ZGU0VUKTsKQEAgLTM1Niw2ICszNTcsOSBAQAogCQkgUVVFUllfREVWX0NBUF9SU1ZEX0xLRVlfT0ZGU0VUKTsKIAlNTFg0X0dFVChkZXZfY2FwLT5tYXhfaWNtX3N6LCBvdXRib3gsCiAJCSBRVUVSWV9ERVZfQ0FQX01BWF9JQ01fU1pfT0ZGU0VUKTsKKwlpZiAoZGV2X2NhcC0+ZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19DT1VOVEVSUykKKwkJTUxYNF9HRVQoZGV2X2NhcC0+bWF4X2NvdW50ZXJzLCBvdXRib3gsCisJCQkgUVVFUllfREVWX0NBUF9NQVhfQ09VTlRFUlNfT0ZGU0VUKTsKIAogCWlmIChkZXYtPmZsYWdzICYgTUxYNF9GTEFHX09MRF9QT1JUX0NNRFMpIHsKIAkJZm9yIChpID0gMTsgaSA8PSBkZXZfY2FwLT5udW1fcG9ydHM7ICsraSkgewpAQCAtNDQ5LDYgKzQ1Myw3IEBACiAJbWx4NF9kYmcoZGV2LCAiTWF4IFJRIGRlc2Mgc2l6ZTogJWQsIG1heCBSUSBTL0c6ICVkXG4iLAogCQkgZGV2X2NhcC0+bWF4X3JxX2Rlc2Nfc3osIGRldl9jYXAtPm1heF9ycV9zZyk7CiAJbWx4NF9kYmcoZGV2LCAiTWF4IEdTTyBzaXplOiAlZFxuIiwgZGV2X2NhcC0+bWF4X2dzb19zeik7CisJbWx4NF9kYmcoZGV2LCAiTWF4IGNvdW50ZXJzOiAlZFxuIiwgZGV2X2NhcC0+bWF4X2NvdW50ZXJzKTsKIAogCWR1bXBfZGV2X2NhcF9mbGFncyhkZXYsIGRldl9jYXAtPmZsYWdzKTsKIApAQCAtNzgxLDYgKzc4NiwxMCBAQAogCWlmIChlbmFibGVfcW9zKQogCQkqKGluYm94ICsgSU5JVF9IQ0FfRkxBR1NfT0ZGU0VUIC8gNCkgfD0gY3B1X3RvX2JlMzIoMSA8PCAyKTsKIAorCS8qIGVuYWJsZSBjb3VudGVycyAqLworCWlmIChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19DT1VOVEVSUykKKwkJKihpbmJveCArIElOSVRfSENBX0ZMQUdTX09GRlNFVCAvIDQpIHw9IGNwdV90b19iZTMyKDEgPDwgNCk7CisKIAkvKiBRUEMvRUVDL0NRQy9FUUMvUkRNQVJDIGF0dHJpYnV0ZXMgKi8KIAogCU1MWDRfUFVUKGluYm94LCBwYXJhbS0+cXBjX2Jhc2UsICAgICAgSU5JVF9IQ0FfUVBDX0JBU0VfT0ZGU0VUKTsKQEAgLTgwMSw3ICs4MTAsNyBAQAogCU1MWDRfUFVUKGluYm94LCBwYXJhbS0+bWNfYmFzZSwJCUlOSVRfSENBX01DX0JBU0VfT0ZGU0VUKTsKIAlNTFg0X1BVVChpbmJveCwgcGFyYW0tPmxvZ19tY19lbnRyeV9zeiwgSU5JVF9IQ0FfTE9HX01DX0VOVFJZX1NaX09GRlNFVCk7CiAJTUxYNF9QVVQoaW5ib3gsIHBhcmFtLT5sb2dfbWNfaGFzaF9zeiwgIElOSVRfSENBX0xPR19NQ19IQVNIX1NaX09GRlNFVCk7Ci0JaWYgKGRldi0+Y2Fwcy52ZXBfbWNfc3RlZXJpbmcpCisJaWYgKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9NQ19TVEVFUikKIAkJTUxYNF9QVVQoaW5ib3gsICh1OCkgKDEgPDwgMyksCUlOSVRfSENBX1VDX1NURUVSSU5HX09GRlNFVCk7CiAJTUxYNF9QVVQoaW5ib3gsIHBhcmFtLT5sb2dfbWNfdGFibGVfc3osIElOSVRfSENBX0xPR19NQ19UQUJMRV9TWl9PRkZTRVQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2Z3LmggYi9kcml2ZXJzL25ldC9tbHg0L2Z3LmgKaW5kZXggODgwMDNlYi4uMWU4ZWNjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9mdy5oCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZncuaApAQCAtNzgsMTIgKzc4LDcgQEAKIAl1MTYgd2F2ZWxlbmd0aFtNTFg0X01BWF9QT1JUUyArIDFdOwogCXU2NCB0cmFuc19jb2RlW01MWDRfTUFYX1BPUlRTICsgMV07CiAJdTE2IHN0YXRfcmF0ZV9zdXBwb3J0OwotCWludCB1ZHBfcnNzOwotCWludCBsb29wYmFja19zdXBwb3J0OwotCWludCB2ZXBfdWNfc3RlZXJpbmc7Ci0JaW50IHZlcF9tY19zdGVlcmluZzsKLQlpbnQgd29sOwotCXUzMiBmbGFnczsKKwl1NjQgZmxhZ3M7CiAJaW50IHJlc2VydmVkX3VhcnM7CiAJaW50IHVhcl9zaXplOwogCWludCBtaW5fcGFnZV9zejsKQEAgLTExNiw2ICsxMTEsNyBAQAogCXU4ICBzdXBwb3J0ZWRfcG9ydF90eXBlc1tNTFg0X01BWF9QT1JUUyArIDFdOwogCXU4ICBsb2dfbWF4X21hY3NbTUxYNF9NQVhfUE9SVFMgKyAxXTsKIAl1OCAgbG9nX21heF92bGFuc1tNTFg0X01BWF9QT1JUUyArIDFdOworCXUzMiBtYXhfY291bnRlcnM7CiB9OwogCiBzdHJ1Y3QgbWx4NF9hZGFwdGVyIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvbWFpbi5jIGIvZHJpdmVycy9uZXQvbWx4NC9tYWluLmMKaW5kZXggMzgxNGZjOS4uYzk0YjM0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9tYWluLmMKQEAgLTE0Myw2ICsxNDMsNyBAQAogCQlpZiAoZGV2LT5jYXBzLnBvcnRfdHlwZVtpXSA9PSBNTFg0X1BPUlRfVFlQRV9JQikKIAkJCWRldi0+Y2Fwcy5wb3J0X21hc2sgfD0gMSA8PCAoaSAtIDEpOwogfQorCiBzdGF0aWMgaW50IG1seDRfZGV2X2NhcChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfZGV2X2NhcCAqZGV2X2NhcCkKIHsKIAlpbnQgZXJyOwpAQCAtMjI2LDExICsyMjcsNiBAQAogCWRldi0+Y2Fwcy5ibW1lX2ZsYWdzCSAgICAgPSBkZXZfY2FwLT5ibW1lX2ZsYWdzOwogCWRldi0+Y2Fwcy5yZXNlcnZlZF9sa2V5CSAgICAgPSBkZXZfY2FwLT5yZXNlcnZlZF9sa2V5OwogCWRldi0+Y2Fwcy5zdGF0X3JhdGVfc3VwcG9ydCAgPSBkZXZfY2FwLT5zdGF0X3JhdGVfc3VwcG9ydDsKLQlkZXYtPmNhcHMudWRwX3JzcwkgICAgID0gZGV2X2NhcC0+dWRwX3JzczsKLQlkZXYtPmNhcHMubG9vcGJhY2tfc3VwcG9ydCAgID0gZGV2X2NhcC0+bG9vcGJhY2tfc3VwcG9ydDsKLQlkZXYtPmNhcHMudmVwX3VjX3N0ZWVyaW5nICAgID0gZGV2X2NhcC0+dmVwX3VjX3N0ZWVyaW5nOwotCWRldi0+Y2Fwcy52ZXBfbWNfc3RlZXJpbmcgICAgPSBkZXZfY2FwLT52ZXBfbWNfc3RlZXJpbmc7Ci0JZGV2LT5jYXBzLndvbAkJICAgICA9IGRldl9jYXAtPndvbDsKIAlkZXYtPmNhcHMubWF4X2dzb19zegkgICAgID0gZGV2X2NhcC0+bWF4X2dzb19zejsKIAogCWRldi0+Y2Fwcy5sb2dfbnVtX21hY3MgID0gbG9nX251bV9tYWM7CkBAIC0yNjIsNiArMjU4LDggQEAKIAogCW1seDRfc2V0X3BvcnRfbWFzayhkZXYpOwogCisJZGV2LT5jYXBzLm1heF9jb3VudGVycyA9IDEgPDwgaWxvZzIoZGV2X2NhcC0+bWF4X2NvdW50ZXJzKTsKKwogCWRldi0+Y2Fwcy5yZXNlcnZlZF9xcHNfY250W01MWDRfUVBfUkVHSU9OX0ZXXSA9IGRldl9jYXAtPnJlc2VydmVkX3FwczsKIAlkZXYtPmNhcHMucmVzZXJ2ZWRfcXBzX2NudFtNTFg0X1FQX1JFR0lPTl9FVEhfQUREUl0gPQogCQlkZXYtPmNhcHMucmVzZXJ2ZWRfcXBzX2NudFtNTFg0X1FQX1JFR0lPTl9GQ19BRERSXSA9CkBAIC04MzksNiArODM3LDQ1IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBtbHg0X2luaXRfY291bnRlcnNfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCWludCBuZW50OworCisJaWYgKCEoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfQ09VTlRFUlMpKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW5lbnQgPSBkZXYtPmNhcHMubWF4X2NvdW50ZXJzOworCXJldHVybiBtbHg0X2JpdG1hcF9pbml0KCZwcml2LT5jb3VudGVyc19iaXRtYXAsIG5lbnQsIG5lbnQgLSAxLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgbWx4NF9jbGVhbnVwX2NvdW50ZXJzX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KQoreworCW1seDRfYml0bWFwX2NsZWFudXAoJm1seDRfcHJpdihkZXYpLT5jb3VudGVyc19iaXRtYXApOworfQorCitpbnQgbWx4NF9jb3VudGVyX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgKmlkeCkKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisKKwlpZiAoIShkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19DT1VOVEVSUykpCisJCXJldHVybiAtRU5PRU5UOworCisJKmlkeCA9IG1seDRfYml0bWFwX2FsbG9jKCZwcml2LT5jb3VudGVyc19iaXRtYXApOworCWlmICgqaWR4ID09IC0xKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9jb3VudGVyX2FsbG9jKTsKKwordm9pZCBtbHg0X2NvdW50ZXJfZnJlZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIGlkeCkKK3sKKwltbHg0X2JpdG1hcF9mcmVlKCZtbHg0X3ByaXYoZGV2KS0+Y291bnRlcnNfYml0bWFwLCBpZHgpOworCXJldHVybjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1seDRfY291bnRlcl9mcmVlKTsKKwogc3RhdGljIGludCBtbHg0X3NldHVwX2hjYShzdHJ1Y3QgbWx4NF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CkBAIC05NDMsNiArOTgwLDEyIEBACiAJCWdvdG8gZXJyX3FwX3RhYmxlX2ZyZWU7CiAJfQogCisJZXJyID0gbWx4NF9pbml0X2NvdW50ZXJzX3RhYmxlKGRldik7CisJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0VOVCkgeworCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb3VudGVycyB0YWJsZSwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfY291bnRlcnNfdGFibGVfZnJlZTsKKwl9CisKIAlmb3IgKHBvcnQgPSAxOyBwb3J0IDw9IGRldi0+Y2Fwcy5udW1fcG9ydHM7IHBvcnQrKykgewogCQllbnVtIG1seDRfcG9ydF90eXBlIHBvcnRfdHlwZSA9IDA7CiAJCW1seDRfU0VOU0VfUE9SVChkZXYsIHBvcnQsICZwb3J0X3R5cGUpOwpAQCAtOTY5LDYgKzEwMTIsOSBAQAogZXJyX21jZ190YWJsZV9mcmVlOgogCW1seDRfY2xlYW51cF9tY2dfdGFibGUoZGV2KTsKIAorZXJyX2NvdW50ZXJzX3RhYmxlX2ZyZWU6CisJbWx4NF9jbGVhbnVwX2NvdW50ZXJzX3RhYmxlKGRldik7CisKIGVycl9xcF90YWJsZV9mcmVlOgogCW1seDRfY2xlYW51cF9xcF90YWJsZShkZXYpOwogCkBAIC0xMjMwLDExICsxMjc2LDExIEBACiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnBnZGlyX2xpc3QpOwogCW11dGV4X2luaXQoJnByaXYtPnBnZGlyX211dGV4KTsKIAotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmRldi0+cmV2X2lkKTsKLQogCUlOSVRfTElTVF9IRUFEKCZwcml2LT5iZl9saXN0KTsKIAltdXRleF9pbml0KCZwcml2LT5iZl9tdXRleCk7CiAKKwlkZXYtPnJldl9pZCA9IHBkZXYtPnJldmlzaW9uOworCiAJLyoKIAkgKiBOb3cgcmVzZXQgdGhlIEhDQSBiZWZvcmUgd2UgdG91Y2ggdGhlIFBDSSBjYXBhYmlsaXRpZXMgb3IKIAkgKiBhdHRlbXB0IGEgZmlybXdhcmUgY29tbWFuZCwgc2luY2UgYSBib290IFJPTSBtYXkgaGF2ZSBsZWZ0CkBAIC0xMjk5LDYgKzEzNDUsNyBAQAogCWZvciAoLS1wb3J0OyBwb3J0ID49IDE7IC0tcG9ydCkKIAkJbWx4NF9jbGVhbnVwX3BvcnRfaW5mbygmcHJpdi0+cG9ydFtwb3J0XSk7CiAKKwltbHg0X2NsZWFudXBfY291bnRlcnNfdGFibGUoZGV2KTsKIAltbHg0X2NsZWFudXBfbWNnX3RhYmxlKGRldik7CiAJbWx4NF9jbGVhbnVwX3FwX3RhYmxlKGRldik7CiAJbWx4NF9jbGVhbnVwX3NycV90YWJsZShkZXYpOwpAQCAtMTM1OSw2ICsxNDA2LDcgQEAKIAkJCW1seDRfQ0xPU0VfUE9SVChkZXYsIHApOwogCQl9CiAKKwkJbWx4NF9jbGVhbnVwX2NvdW50ZXJzX3RhYmxlKGRldik7CiAJCW1seDRfY2xlYW51cF9tY2dfdGFibGUoZGV2KTsKIAkJbWx4NF9jbGVhbnVwX3FwX3RhYmxlKGRldik7CiAJCW1seDRfY2xlYW51cF9zcnFfdGFibGUoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvbWNnLmMgYi9kcml2ZXJzL25ldC9tbHg0L21jZy5jCmluZGV4IGU2M2MzN2QuLmNkMTc4NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvbWNnLmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9tY2cuYwpAQCAtNTU5LDcgKzU1OSw4IEBACiAJc3RydWN0IG1seDRfbWdtICptZ20gPSBtZ21fbWFpbGJveC0+YnVmOwogCXU4ICptZ2lkOwogCWludCBlcnI7Ci0JdTggb3BfbW9kID0gKHByb3QgPT0gTUxYNF9QUk9UX0VUSCkgPyAhIShkZXYtPmNhcHMudmVwX21jX3N0ZWVyaW5nKSA6IDA7CisJdTggb3BfbW9kID0gKHByb3QgPT0gTUxYNF9QUk9UX0VUSCkgPworCQkhIShkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19WRVBfTUNfU1RFRVIpIDogMDsKIAogCW1haWxib3ggPSBtbHg0X2FsbG9jX2NtZF9tYWlsYm94KGRldik7CiAJaWYgKElTX0VSUihtYWlsYm94KSkKQEAgLTgzNCw3ICs4MzUsOCBAQAogCiAJc3RlZXIgPSAoaXNfdmFsaWRfZXRoZXJfYWRkcigmZ2lkWzEwXSkpID8gTUxYNF9VQ19TVEVFUiA6IE1MWDRfTUNfU1RFRVI7CiAKLQlpZiAocHJvdCA9PSBNTFg0X1BST1RfRVRIICYmICFkZXYtPmNhcHMudmVwX21jX3N0ZWVyaW5nKQorCWlmIChwcm90ID09IE1MWDRfUFJPVF9FVEggJiYKKwkJCSEoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX01DX1NURUVSKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAocHJvdCA9PSBNTFg0X1BST1RfRVRIKQpAQCAtODUzLDcgKzg1NSw4IEBACiAKIAlzdGVlciA9IChpc192YWxpZF9ldGhlcl9hZGRyKCZnaWRbMTBdKSkgPyBNTFg0X1VDX1NURUVSIDogTUxYNF9NQ19TVEVFUjsKIAotCWlmIChwcm90ID09IE1MWDRfUFJPVF9FVEggJiYgIWRldi0+Y2Fwcy52ZXBfbWNfc3RlZXJpbmcpCisJaWYgKHByb3QgPT0gTUxYNF9QUk9UX0VUSCAmJgorCQkJIShkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19WRVBfTUNfU1RFRVIpKQogCQlyZXR1cm4gMDsKIAogCWlmIChwcm90ID09IE1MWDRfUFJPVF9FVEgpIHsKQEAgLTg2Nyw3ICs4NzAsNyBAQAogCiBpbnQgbWx4NF9tdWx0aWNhc3RfcHJvbWlzY19hZGQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiBxcG4sIHU4IHBvcnQpCiB7Ci0JaWYgKCFkZXYtPmNhcHMudmVwX21jX3N0ZWVyaW5nKQorCWlmICghKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9NQ19TVEVFUikpCiAJCXJldHVybiAwOwogCiAKQEAgLTg3Nyw3ICs4ODAsNyBAQAogCiBpbnQgbWx4NF9tdWx0aWNhc3RfcHJvbWlzY19yZW1vdmUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiBxcG4sIHU4IHBvcnQpCiB7Ci0JaWYgKCFkZXYtPmNhcHMudmVwX21jX3N0ZWVyaW5nKQorCWlmICghKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9NQ19TVEVFUikpCiAJCXJldHVybiAwOwogCiAKQEAgLTg4Nyw3ICs4OTAsNyBAQAogCiBpbnQgbWx4NF91bmljYXN0X3Byb21pc2NfYWRkKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgcXBuLCB1OCBwb3J0KQogewotCWlmICghZGV2LT5jYXBzLnZlcF9tY19zdGVlcmluZykKKwlpZiAoIShkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19WRVBfTUNfU1RFRVIpKQogCQlyZXR1cm4gMDsKIAogCkBAIC04OTcsNyArOTAwLDcgQEAKIAogaW50IG1seDRfdW5pY2FzdF9wcm9taXNjX3JlbW92ZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIHFwbiwgdTggcG9ydCkKIHsKLQlpZiAoIWRldi0+Y2Fwcy52ZXBfbWNfc3RlZXJpbmcpCisJaWYgKCEoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX01DX1NURUVSKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gcmVtb3ZlX3Byb21pc2NfcXAoZGV2LCAwLCBwb3J0LCBNTFg0X1VDX1NURUVSLCBxcG4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9tbHg0LmggYi9kcml2ZXJzL25ldC9tbHg0L21seDQuaAppbmRleCBkZDdkNzQ1Li5hMmZjZDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L21seDQuaAorKysgYi9kcml2ZXJzL25ldC9tbHg0L21seDQuaApAQCAtNDgsOCArNDgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21seDQvZG9vcmJlbGwuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkibWx4NF9jb3JlIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4wMSIKLSNkZWZpbmUgRFJWX1JFTERBVEUJIk1heSAxLCAyMDA3IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wIgorI2RlZmluZSBEUlZfUkVMREFURQkiSnVseSAxNCwgMjAxMSIKIAogZW51bSB7CiAJTUxYNF9IQ1JfQkFTRQkJPSAweDgwNjgwLApAQCAtMzQyLDYgKzM0Miw3IEBACiAJc3RydWN0IG1seDRfc3JxX3RhYmxlCXNycV90YWJsZTsKIAlzdHJ1Y3QgbWx4NF9xcF90YWJsZQlxcF90YWJsZTsKIAlzdHJ1Y3QgbWx4NF9tY2dfdGFibGUJbWNnX3RhYmxlOworCXN0cnVjdCBtbHg0X2JpdG1hcAljb3VudGVyc19iaXRtYXA7CiAKIAlzdHJ1Y3QgbWx4NF9jYXRhc19lcnIJY2F0YXNfZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L21seDRfZW4uaCBiL2RyaXZlcnMvbmV0L21seDQvbWx4NF9lbi5oCmluZGV4IDBiNTE1MGQuLmVkODQ4MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvbWx4NF9lbi5oCisrKyBiL2RyaXZlcnMvbmV0L21seDQvbWx4NF9lbi5oCkBAIC0zNCwxMCArMzQsMTIgQEAKICNpZm5kZWYgX01MWDRfRU5fSF8KICNkZWZpbmUgX01MWDRfRU5fSF8KIAorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogCiAjaW5jbHVkZSA8bGludXgvbWx4NC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tbHg0L3FwLmg+CkBAIC00MTgsNyArNDIwLDcgQEAKIAlzdHJ1Y3QgbWx4NF9lbl9kZXYgKm1kZXY7CiAJc3RydWN0IG1seDRfZW5fcG9ydF9wcm9maWxlICpwcm9mOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3ZsYW5zW0JJVFNfVE9fTE9OR1MoVkxBTl9OX1ZJRCldOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHJldF9zdGF0czsKIAlzdHJ1Y3QgbWx4NF9lbl9wb3J0X3N0YXRlIHBvcnRfc3RhdGU7CkBAIC01NTMsNyArNTU1LDcgQEAKIHZvaWQgbWx4NF9lbl9yeF9pcnEoc3RydWN0IG1seDRfY3EgKm1jcSk7CiAKIGludCBtbHg0X1NFVF9NQ0FTVF9GTFRSKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1NjQgbWFjLCB1NjQgY2xlYXIsIHU4IG1vZGUpOwotaW50IG1seDRfU0VUX1ZMQU5fRkxUUihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCk7CitpbnQgbWx4NF9TRVRfVkxBTl9GTFRSKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2KTsKIGludCBtbHg0X1NFVF9QT1JUX2dlbmVyYWwoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCBtdHUsCiAJCQkgIHU4IHBwdHgsIHU4IHBmY3R4LCB1OCBwcHJ4LCB1OCBwZmNyeCk7CiBpbnQgbWx4NF9TRVRfUE9SVF9xcG5fY2FsYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTMyIGJhc2VfcXBuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9wb3J0LmMgYi9kcml2ZXJzL25ldC9tbHg0L3BvcnQuYwppbmRleCA4ODU2NjU5Li4xZjk1YWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L3BvcnQuYworKysgYi9kcml2ZXJzL25ldC9tbHg0L3BvcnQuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJaW50IGksIGVyciA9IDA7CiAJaW50IGZyZWUgPSAtMTsKIAotCWlmIChkZXYtPmNhcHMudmVwX3VjX3N0ZWVyaW5nKSB7CisJaWYgKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9VQ19TVEVFUikgewogCQllcnIgPSBtbHg0X3VjX3N0ZWVyX2FkZChkZXYsIHBvcnQsIG1hYywgcXBuLCAxKTsKIAkJaWYgKCFlcnIpIHsKIAkJCWVudHJ5ID0ga21hbGxvYyhzaXplb2YgKmVudHJ5LCBHRlBfS0VSTkVMKTsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoIWRldi0+Y2Fwcy52ZXBfdWNfc3RlZXJpbmcpCisJaWYgKCEoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX1VDX1NURUVSKSkKIAkJKnFwbiA9IGluZm8tPmJhc2VfcXBuICsgZnJlZTsKIAkrK3RhYmxlLT50b3RhbDsKIG91dDoKQEAgLTI0Myw3ICsyNDMsNyBAQAogCWludCBpbmRleCA9IHFwbiAtIGluZm8tPmJhc2VfcXBuOwogCXN0cnVjdCBtbHg0X21hY19lbnRyeSAqZW50cnk7CiAKLQlpZiAoZGV2LT5jYXBzLnZlcF91Y19zdGVlcmluZykgeworCWlmIChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19WRVBfVUNfU1RFRVIpIHsKIAkJZW50cnkgPSByYWRpeF90cmVlX2xvb2t1cCgmaW5mby0+bWFjX3RyZWUsIHFwbik7CiAJCWlmIChlbnRyeSkgewogCQkJbWx4NF91Y19zdGVlcl9yZWxlYXNlKGRldiwgcG9ydCwgZW50cnktPm1hYywgcXBuLCAxKTsKQEAgLTI3NCw3ICsyNzQsNyBAQAogCXN0cnVjdCBtbHg0X21hY19lbnRyeSAqZW50cnk7CiAJaW50IGVycjsKIAotCWlmIChkZXYtPmNhcHMudmVwX3VjX3N0ZWVyaW5nKSB7CisJaWYgKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9VQ19TVEVFUikgewogCQllbnRyeSA9IHJhZGl4X3RyZWVfbG9va3VwKCZpbmZvLT5tYWNfdHJlZSwgcXBuKTsKIAkJaWYgKCFlbnRyeSkKIAkJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9yZXNldC5jIGIvZHJpdmVycy9uZXQvbWx4NC9yZXNldC5jCmluZGV4IGU1NzQxZGEuLjExZTdjMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvcmVzZXQuYworKysgYi9kcml2ZXJzL25ldC9tbHg0L3Jlc2V0LmMKQEAgLTc3LDcgKzc3LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcGNpZV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldi0+cGRldiwgUENJX0NBUF9JRF9FWFApOworCXBjaWVfY2FwID0gcGNpX3BjaWVfY2FwKGRldi0+cGRldik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNjQ7ICsraSkgewogCQlpZiAoaSA9PSAyMiB8fCBpID09IDIzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYyBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKaW5kZXggYTVkOWIxYy4uMjU5Njk5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYworKysgYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCkBAIC04NDAsNiArODQwLDggQEAKIAogCV9fc2tiX3F1ZXVlX3RhaWwoJnR4cS0+dHhfc2tiLCBza2IpOwogCisJc2tiX3R4X3RpbWVzdGFtcChza2IpOworCiAJLyogZW5zdXJlIGFsbCBvdGhlciBkZXNjcmlwdG9ycyBhcmUgd3JpdHRlbiBiZWZvcmUgZmlyc3QgY21kX3N0cyAqLwogCXdtYigpOwogCWRlc2MtPmNtZF9zdHMgPSBjbWRfc3RzOwpAQCAtODU5LDcgKzg2MSw3IEBACiBzdGF0aWMgbmV0ZGV2X3R4X3QgbXY2NDN4eF9ldGhfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHF1ZXVlOworCWludCBsZW5ndGgsIHF1ZXVlOwogCXN0cnVjdCB0eF9xdWV1ZSAqdHhxOwogCXN0cnVjdCBuZXRkZXZfcXVldWUgKm5xOwogCkBAIC04ODEsMTAgKzg4MywxMiBAQAogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIAorCWxlbmd0aCA9IHNrYi0+bGVuOworCiAJaWYgKCF0eHFfc3VibWl0X3NrYih0eHEsIHNrYikpIHsKIAkJaW50IGVudHJpZXNfbGVmdDsKIAotCQl0eHEtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQl0eHEtPnR4X2J5dGVzICs9IGxlbmd0aDsKIAkJdHhxLT50eF9wYWNrZXRzKys7CiAKIAkJZW50cmllc19sZWZ0ID0gdHhxLT50eF9yaW5nX3NpemUgLSB0eHEtPnR4X2Rlc2NfY291bnQ7CkBAIC0yNTkzLDcgKzI1OTcsNyBAQAogCWlmIChtc3AgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKLQltc3AtPmJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCW1zcC0+YmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAobXNwLT5iYXNlID09IE5VTEwpCiAJCWdvdG8gb3V0X2ZyZWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCmluZGV4IGJmODQ4NDkuLjFkMjI0NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKKysrIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBteXJpMTBnZS5jOiBNeXJpY29tIE15cmktMTBHIEV0aGVybmV0IGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA5IE15cmljb20sIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMTEgTXlyaWNvbSwgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTc5LDcgKzc5LDcgQEAKICNpbmNsdWRlICJteXJpMTBnZV9tY3AuaCIKICNpbmNsdWRlICJteXJpMTBnZV9tY3BfZ2VuX2hlYWRlci5oIgogCi0jZGVmaW5lIE1ZUkkxMEdFX1ZFUlNJT05fU1RSICIxLjUuMi0xLjQ1OSIKKyNkZWZpbmUgTVlSSTEwR0VfVkVSU0lPTl9TVFIgIjEuNS4zLTEuNTM0IgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk15cmljb20gMTBHIGRyaXZlciAoMTBHYkUpIik7CiBNT0RVTEVfQVVUSE9SKCJNYWludGFpbmVyOiBoZWxwQG15cmkuY29tIik7CkBAIC0xOTMsNiArMTkzLDcgQEAKIAlpbnQgd2F0Y2hkb2dfdHhfZG9uZTsKIAlpbnQgd2F0Y2hkb2dfdHhfcmVxOwogCWludCB3YXRjaGRvZ19yeF9kb25lOworCWludCBzdHVjazsKICNpZmRlZiBDT05GSUdfTVlSSTEwR0VfRENBCiAJaW50IGNhY2hlZF9kY2FfdGFnOwogCWludCBjcHU7CkBAIC0yMTAsNyArMjExLDYgQEAKIAlpbnQgYmlnX2J5dGVzOwogCWludCBtYXhfaW50cl9zbG90czsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXNwaW5sb2NrX3Qgc3RhdHNfbG9jazsKIAl1OCBfX2lvbWVtICpzcmFtOwogCWludCBzcmFtX3NpemU7CiAJdW5zaWduZWQgbG9uZyBib2FyZF9zcGFuOwpAQCAtMzc3LDcgKzM3Nyw4IEBACiAJX19yYXdfd3JpdGVsKChfX2ZvcmNlIF9fdTMyKSB2YWwsIChfX2ZvcmNlIHZvaWQgX19pb21lbSAqKXApOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm15cmkxMGdlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKm15cmkxMGdlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpOwogCiBzdGF0aWMgdm9pZCBzZXRfZndfbmFtZShzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwLCBjaGFyICpuYW1lLCBib29sIGFsbG9jYXRlZCkKIHsKQEAgLTEwMTMsNyArMTAxNCw3IEBACiAJCWNtZC5kYXRhMiA9IGk7CiAJCXN0YXR1cyB8PSBteXJpMTBnZV9zZW5kX2NtZChtZ3AsIE1YR0VGV19DTURfU0VUX0lOVFJRX0RNQSwKIAkJCQkJICAgICZjbWQsIDApOwotCX07CisJfQogCiAJc3RhdHVzIHw9CiAJICAgIG15cmkxMGdlX3NlbmRfY21kKG1ncCwgTVhHRUZXX0NNRF9HRVRfSVJRX0FDS19PRkZTRVQsICZjbWQsIDApOwpAQCAtMTA4MCwxMSArMTA4MSwxNCBAQAogCWludCByZXQsIGNhcCwgZXJyOwogCXUxNiBjdGw7CiAKLQljYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwljYXAgPSBwY2lfcGNpZV9jYXAocGRldik7CiAJaWYgKCFjYXApCiAJCXJldHVybiAwOwogCiAJZXJyID0gcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgY2FwICsgUENJX0VYUF9ERVZDVEwsICZjdGwpOworCWlmIChlcnIpCisJCXJldHVybiAwOworCiAJcmV0ID0gKGN0bCAmIFBDSV9FWFBfREVWQ1RMX1JFTEFYX0VOKSA+PiA0OwogCWlmIChyZXQgIT0gb24pIHsKIAkJY3RsICY9IH5QQ0lfRVhQX0RFVkNUTF9SRUxBWF9FTjsKQEAgLTExMzksMjAgKzExNDMsMTkgQEAKIAkJbWdwLT5zc1tpXS5jcHUgPSAtMTsKIAkJbWdwLT5zc1tpXS5jYWNoZWRfZGNhX3RhZyA9IC0xOwogCQlteXJpMTBnZV91cGRhdGVfZGNhKCZtZ3AtPnNzW2ldKTsKLQkgfQorCX0KIH0KIAogc3RhdGljIHZvaWQgbXlyaTEwZ2VfdGVhcmRvd25fZGNhKHN0cnVjdCBteXJpMTBnZV9wcml2ICptZ3ApCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBtZ3AtPnBkZXY7Ci0JaW50IGVycjsKIAogCWlmICghbWdwLT5kY2FfZW5hYmxlZCkKIAkJcmV0dXJuOwogCW1ncC0+ZGNhX2VuYWJsZWQgPSAwOwogCWlmIChtZ3AtPnJlbGF4ZWRfb3JkZXIpCiAJCW15cmkxMGdlX3RvZ2dsZV9yZWxheGVkKHBkZXYsIDEpOwotCWVyciA9IGRjYV9yZW1vdmVfcmVxdWVzdGVyKCZwZGV2LT5kZXYpOworCWRjYV9yZW1vdmVfcmVxdWVzdGVyKCZwZGV2LT5kZXYpOwogfQogCiBzdGF0aWMgaW50IG15cmkxMGdlX25vdGlmeV9kY2FfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKQEAgLTEzMTMsNyArMTMxNiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBteXJpMTBnZV9yeF9kb25lKHN0cnVjdCBteXJpMTBnZV9zbGljZV9zdGF0ZSAqc3MsIGludCBsZW4sIF9fd3N1bSBjc3VtLAotCQkgaW50IGxyb19lbmFibGVkKQorCQkgYm9vbCBscm9fZW5hYmxlZCkKIHsKIAlzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwID0gc3MtPm1ncDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTQ2MSw3ICsxNDY0LDggQEAKIAogCS8qIHN0YXJ0IHRoZSBxdWV1ZSBpZiB3ZSd2ZSBzdG9wcGVkIGl0ICovCiAJaWYgKG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQoZGV2X3F1ZXVlKSAmJgotCSAgICB0eC0+cmVxIC0gdHgtPmRvbmUgPCAodHgtPm1hc2sgPj4gMSkpIHsKKwkgICAgdHgtPnJlcSAtIHR4LT5kb25lIDwgKHR4LT5tYXNrID4+IDEpICYmCisJICAgIHNzLT5tZ3AtPnJ1bm5pbmcgPT0gTVlSSTEwR0VfRVRIX1JVTk5JTkcpIHsKIAkJdHgtPndha2VfcXVldWUrKzsKIAkJbmV0aWZfdHhfd2FrZV9xdWV1ZShkZXZfcXVldWUpOwogCX0KQEAgLTE0NzIsMTEgKzE0NzYsOSBAQAogewogCXN0cnVjdCBteXJpMTBnZV9yeF9kb25lICpyeF9kb25lID0gJnNzLT5yeF9kb25lOwogCXN0cnVjdCBteXJpMTBnZV9wcml2ICptZ3AgPSBzcy0+bWdwOwotCiAJdW5zaWduZWQgbG9uZyByeF9ieXRlcyA9IDA7CiAJdW5zaWduZWQgbG9uZyByeF9wYWNrZXRzID0gMDsKIAl1bnNpZ25lZCBsb25nIHJ4X29rOwotCiAJaW50IGlkeCA9IHJ4X2RvbmUtPmlkeDsKIAlpbnQgY250ID0gcnhfZG9uZS0+Y250OwogCWludCB3b3JrX2RvbmUgPSAwOwpAQCAtMTUyOSwxNiArMTUzMSwxNCBAQAogCQkJbWdwLT5saW5rX3N0YXRlID0gbGlua191cDsKIAogCQkJaWYgKG1ncC0+bGlua19zdGF0ZSA9PSBNWEdFRldfTElOS19VUCkgewotCQkJCWlmIChuZXRpZl9tc2dfbGluayhtZ3ApKQotCQkJCQluZXRkZXZfaW5mbyhtZ3AtPmRldiwgImxpbmsgdXBcbiIpOworCQkJCW5ldGlmX2luZm8obWdwLCBsaW5rLCBtZ3AtPmRldiwgImxpbmsgdXBcbiIpOwogCQkJCW5ldGlmX2NhcnJpZXJfb24obWdwLT5kZXYpOwogCQkJCW1ncC0+bGlua19jaGFuZ2VzKys7CiAJCQl9IGVsc2UgewotCQkJCWlmIChuZXRpZl9tc2dfbGluayhtZ3ApKQotCQkJCQluZXRkZXZfaW5mbyhtZ3AtPmRldiwgImxpbmsgJXNcbiIsCi0JCQkJCSAgICBsaW5rX3VwID09IE1YR0VGV19MSU5LX01ZUklORVQgPworCQkJCW5ldGlmX2luZm8obWdwLCBsaW5rLCBtZ3AtPmRldiwgImxpbmsgJXNcbiIsCisJCQkJCSAgIChsaW5rX3VwID09IE1YR0VGV19MSU5LX01ZUklORVQgPwogCQkJCQkgICAgIm1pc21hdGNoIChNeXJpbmV0IGRldGVjdGVkKSIgOgotCQkJCQkgICAgImRvd24iKTsKKwkJCQkJICAgICJkb3duIikpOwogCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKG1ncC0+ZGV2KTsKIAkJCQltZ3AtPmxpbmtfY2hhbmdlcysrOwogCQkJfQpAQCAtMTYxOSw3ICsxNjE5LDcgQEAKIAkJaWYgKHNlbmRfZG9uZV9jb3VudCAhPSB0eC0+cGt0X2RvbmUpCiAJCQlteXJpMTBnZV90eF9kb25lKHNzLCAoaW50KXNlbmRfZG9uZV9jb3VudCk7CiAJCWlmICh1bmxpa2VseShpID4gbXlyaTEwZ2VfbWF4X2lycV9sb29wcykpIHsKLQkJCW5ldGRldl9lcnIobWdwLT5kZXYsICJpcnEgc3R1Y2s/XG4iKTsKKwkJCW5ldGRldl93YXJuKG1ncC0+ZGV2LCAiaXJxIHN0dWNrP1xuIik7CiAJCQlzdGF0cy0+dmFsaWQgPSAwOwogCQkJc2NoZWR1bGVfd29yaygmbWdwLT53YXRjaGRvZ193b3JrKTsKIAkJfQpAQCAtMTc4Myw5ICsxNzgzLDggQEAKIAkiLS0tLS0tLS0tLS0gc2xpY2UgLS0tLS0tLS0tIiwKIAkidHhfcGt0X3N0YXJ0IiwgInR4X3BrdF9kb25lIiwgInR4X3JlcSIsICJ0eF9kb25lIiwKIAkicnhfc21hbGxfY250IiwgInJ4X2JpZ19jbnQiLAotCSJ3YWtlX3F1ZXVlIiwgInN0b3BfcXVldWUiLCAidHhfbGluZWFyaXplZCIsICJMUk8gYWdncmVnYXRlZCIsCi0JICAgICJMUk8gZmx1c2hlZCIsCi0JIkxSTyBhdmcgYWdnciIsICJMUk8gbm9fZGVzYyIKKwkid2FrZV9xdWV1ZSIsICJzdG9wX3F1ZXVlIiwgInR4X2xpbmVhcml6ZWQiLAorCSJMUk8gYWdncmVnYXRlZCIsICJMUk8gZmx1c2hlZCIsICJMUk8gYXZnIGFnZ3IiLCAiTFJPIG5vX2Rlc2MiLAogfTsKIAogI2RlZmluZSBNWVJJMTBHRV9ORVRfU1RBVFNfTEVOICAgICAgMjEKQEAgLTE4MzEsMTMgKzE4MzAsMTUgQEAKIHsKIAlzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgbXlyaTEwZ2Vfc2xpY2Vfc3RhdGUgKnNzOworCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCBsaW5rX3N0YXRzOwogCWludCBzbGljZTsKIAlpbnQgaTsKIAogCS8qIGZvcmNlIHN0YXRzIHVwZGF0ZSAqLwotCSh2b2lkKW15cmkxMGdlX2dldF9zdGF0cyhuZXRkZXYpOworCW1lbXNldCgmbGlua19zdGF0cywgMCwgc2l6ZW9mKGxpbmtfc3RhdHMpKTsKKwkodm9pZClteXJpMTBnZV9nZXRfc3RhdHMobmV0ZGV2LCAmbGlua19zdGF0cyk7CiAJZm9yIChpID0gMDsgaSA8IE1ZUkkxMEdFX05FVF9TVEFUU19MRU47IGkrKykKLQkJZGF0YVtpXSA9ICgodW5zaWduZWQgbG9uZyAqKSZuZXRkZXYtPnN0YXRzKVtpXTsKKwkJZGF0YVtpXSA9ICgodTY0ICopJmxpbmtfc3RhdHMpW2ldOwogCiAJZGF0YVtpKytdID0gKHVuc2lnbmVkIGludCltZ3AtPnR4X2JvdW5kYXJ5OwogCWRhdGFbaSsrXSA9ICh1bnNpZ25lZCBpbnQpbWdwLT53Y19lbmFibGVkOwpAQCAtMTkwNyw2ICsxOTA4LDYwIEBACiAJcmV0dXJuIG1ncC0+bXNnX2VuYWJsZTsKIH0KIAorLyoKKyAqIFVzZSBhIGxvdy1sZXZlbCBjb21tYW5kIHRvIGNoYW5nZSB0aGUgTEVEIGJlaGF2aW9yLiBSYXRoZXIgdGhhbgorICogYmxpbmtpbmcgKHdoaWNoIGlzIHRoZSBub3JtYWwgY2FzZSksIHdoZW4gaWRlbnRpZnkgaXMgdXNlZCwgdGhlCisgKiB5ZWxsb3cgTEVEIHR1cm5zIHNvbGlkLgorICovCitzdGF0aWMgaW50IG15cmkxMGdlX2xlZChzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwLCBpbnQgb24pCit7CisJc3RydWN0IG1jcF9nZW5faGVhZGVyICpoZHI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm1ncC0+cGRldi0+ZGV2OworCXNpemVfdCBoZHJfb2ZmLCBwYXR0ZXJuX29mZiwgaGRyX2xlbjsKKwl1MzIgcGF0dGVybiA9IDB4ZmZmZmZmZmU7CisKKwkvKiBmaW5kIHJ1bm5pbmcgZmlybXdhcmUgaGVhZGVyICovCisJaGRyX29mZiA9IHN3YWIzMihyZWFkbChtZ3AtPnNyYW0gKyBNQ1BfSEVBREVSX1BUUl9PRkZTRVQpKTsKKwlpZiAoKGhkcl9vZmYgJiAzKSB8fCBoZHJfb2ZmICsgc2l6ZW9mKCpoZHIpID4gbWdwLT5zcmFtX3NpemUpIHsKKwkJZGV2X2VycihkZXYsICJSdW5uaW5nIGZpcm13YXJlIGhhcyBiYWQgaGVhZGVyIG9mZnNldCAoJWQpXG4iLAorCQkJKGludCloZHJfb2ZmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWhkcl9sZW4gPSBzd2FiMzIocmVhZGwobWdwLT5zcmFtICsgaGRyX29mZiArCisJCQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IG1jcF9nZW5faGVhZGVyLCBoZWFkZXJfbGVuZ3RoKSkpOworCXBhdHRlcm5fb2ZmID0gaGRyX29mZiArIG9mZnNldG9mKHN0cnVjdCBtY3BfZ2VuX2hlYWRlciwgbGVkX3BhdHRlcm4pOworCWlmIChwYXR0ZXJuX29mZiA+PSAoaGRyX2xlbiArIGhkcl9vZmYpKSB7CisJCWRldl9pbmZvKGRldiwgIkZpcm13YXJlIGRvZXMgbm90IHN1cHBvcnQgTEVEIGlkZW50aWZpY2F0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghb24pCisJCXBhdHRlcm4gPSBzd2FiMzIocmVhZGwobWdwLT5zcmFtICsgcGF0dGVybl9vZmYgKyA0KSk7CisJd3JpdGVsKGh0b25sKHBhdHRlcm4pLCBtZ3AtPnNyYW0gKyBwYXR0ZXJuX29mZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK215cmkxMGdlX3BoeXNfaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgZW51bSBldGh0b29sX3BoeXNfaWRfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IG15cmkxMGdlX3ByaXYgKm1ncCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJjOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgRVRIVE9PTF9JRF9BQ1RJVkU6CisJCXJjID0gbXlyaTEwZ2VfbGVkKG1ncCwgMSk7CisJCWJyZWFrOworCisJY2FzZSBFVEhUT09MX0lEX0lOQUNUSVZFOgorCQlyYyA9ICBteXJpMTBnZV9sZWQobWdwLCAwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYyA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG15cmkxMGdlX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MgPSBteXJpMTBnZV9nZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvID0gbXlyaTEwZ2VfZ2V0X2RydmluZm8sCkBAIC0xOTIxLDYgKzE5NzYsNyBAQAogCS5nZXRfZXRodG9vbF9zdGF0cyA9IG15cmkxMGdlX2dldF9ldGh0b29sX3N0YXRzLAogCS5zZXRfbXNnbGV2ZWwgPSBteXJpMTBnZV9zZXRfbXNnbGV2ZWwsCiAJLmdldF9tc2dsZXZlbCA9IG15cmkxMGdlX2dldF9tc2dsZXZlbCwKKwkuc2V0X3BoeXNfaWQgPSBteXJpMTBnZV9waHlzX2lkLAogfTsKIAogc3RhdGljIGludCBteXJpMTBnZV9hbGxvY2F0ZV9yaW5ncyhzdHJ1Y3QgbXlyaTEwZ2Vfc2xpY2Vfc3RhdGUgKnNzKQpAQCAtMjAwMCw4ICsyMDU2LDEyIEBACiAJc3MtPnJ4X2JpZy5wYWdlX29mZnNldCA9IE1ZUkkxMEdFX0FMTE9DX1NJWkU7CiAJc3MtPnJ4X3NtYWxsLndhdGNoZG9nX25lZWRlZCA9IDA7CiAJc3MtPnJ4X2JpZy53YXRjaGRvZ19uZWVkZWQgPSAwOwotCW15cmkxMGdlX2FsbG9jX3J4X3BhZ2VzKG1ncCwgJnNzLT5yeF9zbWFsbCwKLQkJCQltZ3AtPnNtYWxsX2J5dGVzICsgTVhHRUZXX1BBRCwgMCk7CisJaWYgKG1ncC0+c21hbGxfYnl0ZXMgPT0gMCkgeworCQlzcy0+cnhfc21hbGwuZmlsbF9jbnQgPSBzcy0+cnhfc21hbGwubWFzayArIDE7CisJfSBlbHNlIHsKKwkJbXlyaTEwZ2VfYWxsb2NfcnhfcGFnZXMobWdwLCAmc3MtPnJ4X3NtYWxsLAorCQkJCQltZ3AtPnNtYWxsX2J5dGVzICsgTVhHRUZXX1BBRCwgMCk7CisJfQogCiAJaWYgKHNzLT5yeF9zbWFsbC5maWxsX2NudCA8IHNzLT5yeF9zbWFsbC5tYXNrICsgMSkgewogCQluZXRkZXZfZXJyKGRldiwgInNsaWNlLSVkOiBhbGxvY2VkIG9ubHkgJWQgc21hbGwgYnVmc1xuIiwKQEAgLTIwMjcsNiArMjA4Nyw4IEBACiAJfQogCiBhYm9ydF93aXRoX3J4X3NtYWxsX3Jpbmc6CisJaWYgKG1ncC0+c21hbGxfYnl0ZXMgPT0gMCkKKwkJc3MtPnJ4X3NtYWxsLmZpbGxfY250ID0gc3MtPnJ4X3NtYWxsLmNudDsKIAlmb3IgKGkgPSBzcy0+cnhfc21hbGwuY250OyBpIDwgc3MtPnJ4X3NtYWxsLmZpbGxfY250OyBpKyspIHsKIAkJaW50IGlkeCA9IGkgJiBzcy0+cnhfc21hbGwubWFzazsKIAkJbXlyaTEwZ2VfdW5tYXBfcnhfcGFnZShtZ3AtPnBkZXYsICZzcy0+cnhfc21hbGwuaW5mb1tpZHhdLApAQCAtMjA3Nyw2ICsyMTM5LDggQEAKIAkJcHV0X3BhZ2Uoc3MtPnJ4X2JpZy5pbmZvW2lkeF0ucGFnZSk7CiAJfQogCisJaWYgKG1ncC0+c21hbGxfYnl0ZXMgPT0gMCkKKwkJc3MtPnJ4X3NtYWxsLmZpbGxfY250ID0gc3MtPnJ4X3NtYWxsLmNudDsKIAlmb3IgKGkgPSBzcy0+cnhfc21hbGwuY250OyBpIDwgc3MtPnJ4X3NtYWxsLmZpbGxfY250OyBpKyspIHsKIAkJaWR4ID0gaSAmIHNzLT5yeF9zbWFsbC5tYXNrOwogCQlpZiAoaSA9PSBzcy0+cnhfc21hbGwuZmlsbF9jbnQgLSAxKQpAQCAtMjI1NSw3ICsyMzE5LDcgQEAKIAkqaXBfaGRyID0gaXBoOwogCWlmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQKQogCQlyZXR1cm4gLTE7Ci0JaWYgKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpCisJaWYgKGlwX2lzX2ZyYWdtZW50KGlwaCkpCiAJCXJldHVybiAtMTsKIAkqaGRyX2ZsYWdzIHw9IExST19UQ1A7CiAJKnRjcHVkcF9oZHIgPSAodTggKikgKCppcF9oZHIpICsgKGlwaC0+aWhsIDw8IDIpOwpAQCAtMjQxNCw3ICsyNDc4LDcgQEAKIAkJbWdwLT5zbWFsbF9ieXRlcyA9IFZMQU5fRVRIX0ZSQU1FX0xFTjsKIAogCS8qIE92ZXJyaWRlIHRoZSBzbWFsbCBidWZmZXIgc2l6ZT8gKi8KLQlpZiAobXlyaTEwZ2Vfc21hbGxfYnl0ZXMgPiAwKQorCWlmIChteXJpMTBnZV9zbWFsbF9ieXRlcyA+PSAwKQogCQltZ3AtPnNtYWxsX2J5dGVzID0gbXlyaTEwZ2Vfc21hbGxfYnl0ZXM7CiAKIAkvKiBGaXJtd2FyZSBuZWVkcyB0aGUgYmlnIGJ1ZmYgc2l6ZSBhcyBhIHBvd2VyIG9mIDIuICBMaWUgYW5kCkBAIC0yOTc2LDE1ICszMDQwLDEzIEBACiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpteXJpMTBnZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKm15cmkxMGdlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCiB7Ci0Jc3RydWN0IG15cmkxMGdlX3ByaXYgKm1ncCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG15cmkxMGdlX3NsaWNlX25ldHN0YXRzICpzbGljZV9zdGF0czsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKKwljb25zdCBzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljb25zdCBzdHJ1Y3QgbXlyaTEwZ2Vfc2xpY2VfbmV0c3RhdHMgKnNsaWNlX3N0YXRzOwogCWludCBpOwogCi0Jc3Bpbl9sb2NrKCZtZ3AtPnN0YXRzX2xvY2spOwotCW1lbXNldChzdGF0cywgMCwgc2l6ZW9mKCpzdGF0cykpOwogCWZvciAoaSA9IDA7IGkgPCBtZ3AtPm51bV9zbGljZXM7IGkrKykgewogCQlzbGljZV9zdGF0cyA9ICZtZ3AtPnNzW2ldLnN0YXRzOwogCQlzdGF0cy0+cnhfcGFja2V0cyArPSBzbGljZV9zdGF0cy0+cnhfcGFja2V0czsKQEAgLTI5OTQsNyArMzA1Niw2IEBACiAJCXN0YXRzLT5yeF9kcm9wcGVkICs9IHNsaWNlX3N0YXRzLT5yeF9kcm9wcGVkOwogCQlzdGF0cy0+dHhfZHJvcHBlZCArPSBzbGljZV9zdGF0cy0+dHhfZHJvcHBlZDsKIAl9Ci0Jc3Bpbl91bmxvY2soJm1ncC0+c3RhdHNfbG9jayk7CiAJcmV0dXJuIHN0YXRzOwogfQogCkBAIC0zMTI3LDcgKzMxODgsNyBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBtZ3AtPnBkZXYtPmJ1cy0+c2VsZjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbWdwLT5wZGV2LT5kZXY7Ci0JdW5zaWduZWQgY2FwOworCWludCBjYXA7CiAJdW5zaWduZWQgZXJyX2NhcDsKIAl1MTYgdmFsOwogCXU4IGV4dF90eXBlOwpAQCAtMzEzNyw3ICszMTk4LDcgQEAKIAkJcmV0dXJuOwogCiAJLyogY2hlY2sgdGhhdCB0aGUgYnJpZGdlIGlzIGEgcm9vdCBwb3J0ICovCi0JY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShicmlkZ2UsIFBDSV9DQVBfSURfRVhQKTsKKwljYXAgPSBwY2lfcGNpZV9jYXAoYnJpZGdlKTsKIAlwY2lfcmVhZF9jb25maWdfd29yZChicmlkZ2UsIGNhcCArIFBDSV9DQVBfRkxBR1MsICZ2YWwpOwogCWV4dF90eXBlID0gKHZhbCAmIFBDSV9FWFBfRkxBR1NfVFlQRSkgPj4gNDsKIAlpZiAoZXh0X3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkgewpAQCAtMzE1NSw4ICszMjE2LDcgQEAKIAkJCQkJCSIgdG8gZm9yY2UgRUNSQ1xuIik7CiAJCQkJCXJldHVybjsKIAkJCQl9Ci0JCQkJY2FwID0KLQkJCQkgICAgcGNpX2ZpbmRfY2FwYWJpbGl0eShicmlkZ2UsIFBDSV9DQVBfSURfRVhQKTsKKwkJCQljYXAgPSBwY2lfcGNpZV9jYXAoYnJpZGdlKTsKIAkJCQlwY2lfcmVhZF9jb25maWdfd29yZChicmlkZ2UsCiAJCQkJCQkgICAgIGNhcCArIFBDSV9DQVBfRkxBR1MsICZ2YWwpOwogCQkJCWV4dF90eXBlID0gKHZhbCAmIFBDSV9FWFBfRkxBR1NfVFlQRSkgPj4gNDsKQEAgLTMyNjYsNyArMzMyNiw2IEBACiAJLyogZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSB1bmFsaWduZWQgZmlybXdhcmUgKi8KIAltZ3AtPnR4X2JvdW5kYXJ5ID0gMjA0ODsKIAlzZXRfZndfbmFtZShtZ3AsIG15cmkxMGdlX2Z3X3VuYWxpZ25lZCwgZmFsc2UpOwotCiB9CiAKIHN0YXRpYyB2b2lkIG15cmkxMGdlX3NlbGVjdF9maXJtd2FyZShzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwKQpAQCAtMzI3Nyw3ICszMzM2LDcgQEAKIAkJaW50IGxpbmtfd2lkdGgsIGV4cF9jYXA7CiAJCXUxNiBsbms7CiAKLQkJZXhwX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkobWdwLT5wZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJCWV4cF9jYXAgPSBwY2lfcGNpZV9jYXAobWdwLT5wZGV2KTsKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQobWdwLT5wZGV2LCBleHBfY2FwICsgUENJX0VYUF9MTktTVEEsICZsbmspOwogCQlsaW5rX3dpZHRoID0gKGxuayA+PiA0KSAmIDB4M2Y7CiAKQEAgLTMzMjcsNiArMzM4NiwyNiBAQAogCQkJIG1ncC0+ZndfbmFtZSk7CiB9CiAKK3N0YXRpYyB2b2lkIG15cmkxMGdlX21hc2tfc3VycHJpc2VfZG93bihzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlID0gcGRldi0+YnVzLT5zZWxmOworCWludCBjYXA7CisJdTMyIG1hc2s7CisKKwlpZiAoYnJpZGdlID09IE5VTEwpCisJCXJldHVybjsKKworCWNhcCA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGJyaWRnZSwgUENJX0VYVF9DQVBfSURfRVJSKTsKKwlpZiAoY2FwKSB7CisJCS8qIGEgc3JhbSBwYXJpdHkgZXJyb3IgY2FuIGNhdXNlIGEgc3VycHJpc2UgbGluaworCQkgKiBkb3duOyBzaW5jZSB3ZSBleHBlY3QgYW5kIGNhbiByZWNvdmVyIGZyb20gc3JhbQorCQkgKiBwYXJpdHkgZXJyb3JzLCBtYXNrIHN1cnByaXNlIGxpbmsgZG93biBldmVudHMgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyaWRnZSwgY2FwICsgUENJX0VSUl9VTkNPUl9NQVNLLCAmbWFzayk7CisJCW1hc2sgfD0gMHgyMDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIGNhcCArIFBDSV9FUlJfVU5DT1JfTUFTSywgbWFzayk7CisJfQorfQorCiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IG15cmkxMGdlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKQEAgLTM0MjIsNiArMzUwMSw0MiBAQAogCXJldHVybiByZWJvb3Q7CiB9CiAKK3N0YXRpYyB2b2lkCitteXJpMTBnZV9jaGVja19zbGljZShzdHJ1Y3QgbXlyaTEwZ2Vfc2xpY2Vfc3RhdGUgKnNzLCBpbnQgKnJlc2V0X25lZWRlZCwKKwkJICAgICBpbnQgKmJ1c3lfc2xpY2VfY250LCB1MzIgcnhfcGF1c2VfY250KQoreworCXN0cnVjdCBteXJpMTBnZV9wcml2ICptZ3AgPSBzcy0+bWdwOworCWludCBzbGljZSA9IHNzIC0gbWdwLT5zczsKKworCWlmIChzcy0+dHgucmVxICE9IHNzLT50eC5kb25lICYmCisJICAgIHNzLT50eC5kb25lID09IHNzLT53YXRjaGRvZ190eF9kb25lICYmCisJICAgIHNzLT53YXRjaGRvZ190eF9yZXEgIT0gc3MtPndhdGNoZG9nX3R4X2RvbmUpIHsKKwkJLyogbmljIHNlZW1zIGxpa2UgaXQgbWlnaHQgYmUgc3R1Y2suLiAqLworCQlpZiAocnhfcGF1c2VfY250ICE9IG1ncC0+d2F0Y2hkb2dfcGF1c2UpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJbmV0ZGV2X3dhcm4obWdwLT5kZXYsICJzbGljZSAlZDogVFggcGF1c2VkLCAiCisJCQkJCSAgICAiY2hlY2sgbGluayBwYXJ0bmVyXG4iLCBzbGljZSk7CisJCX0gZWxzZSB7CisJCQluZXRkZXZfd2FybihtZ3AtPmRldiwKKwkJCQkgICAgInNsaWNlICVkOiBUWCBzdHVjayAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJCQkgICAgc2xpY2UsIHNzLT50eC5xdWV1ZV9hY3RpdmUsIHNzLT50eC5yZXEsCisJCQkJICAgIHNzLT50eC5kb25lLCBzcy0+dHgucGt0X3N0YXJ0LAorCQkJCSAgICBzcy0+dHgucGt0X2RvbmUsCisJCQkJICAgIChpbnQpbnRvaGwobWdwLT5zc1tzbGljZV0uZndfc3RhdHMtPgorCQkJCQkgICAgICAgc2VuZF9kb25lX2NvdW50KSk7CisJCQkqcmVzZXRfbmVlZGVkID0gMTsKKwkJCXNzLT5zdHVjayA9IDE7CisJCX0KKwl9CisJaWYgKHNzLT53YXRjaGRvZ190eF9kb25lICE9IHNzLT50eC5kb25lIHx8CisJICAgIHNzLT53YXRjaGRvZ19yeF9kb25lICE9IHNzLT5yeF9kb25lLmNudCkgeworCQkqYnVzeV9zbGljZV9jbnQgKz0gMTsKKwl9CisJc3MtPndhdGNoZG9nX3R4X2RvbmUgPSBzcy0+dHguZG9uZTsKKwlzcy0+d2F0Y2hkb2dfdHhfcmVxID0gc3MtPnR4LnJlcTsKKwlzcy0+d2F0Y2hkb2dfcnhfZG9uZSA9IHNzLT5yeF9kb25lLmNudDsKK30KKwogLyoKICAqIFRoaXMgd2F0Y2hkb2cgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBib2FyZCBoYXMgc3VmZmVyZWQKICAqIGZyb20gYSBwYXJpdHkgZXJyb3IgYW5kIG5lZWRzIHRvIGJlIHJlY292ZXJlZC4KQEAgLTM0MzAsMTAgKzM1NDUsMTIgQEAKIHsKIAlzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwID0KIAkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBteXJpMTBnZV9wcml2LCB3YXRjaGRvZ193b3JrKTsKLQlzdHJ1Y3QgbXlyaTEwZ2VfdHhfYnVmICp0eDsKLQl1MzIgcmVib290OworCXN0cnVjdCBteXJpMTBnZV9zbGljZV9zdGF0ZSAqc3M7CisJdTMyIHJlYm9vdCwgcnhfcGF1c2VfY250OwogCWludCBzdGF0dXMsIHJlYm9vdGVkOwogCWludCBpOworCWludCByZXNldF9uZWVkZWQgPSAwOworCWludCBidXN5X3NsaWNlX2NudCA9IDA7CiAJdTE2IGNtZCwgdmVuZG9yOwogCiAJbWdwLT53YXRjaGRvZ19yZXNldHMrKzsKQEAgLTM0NDUsOCArMzU2Miw3IEBACiAJCSAqIEZvciBub3csIGp1c3QgcmVwb3J0IGl0ICovCiAJCXJlYm9vdCA9IG15cmkxMGdlX3JlYWRfcmVib290KG1ncCk7CiAJCW5ldGRldl9lcnIobWdwLT5kZXYsICJOSUMgcmVib290ZWQgKDB4JXgpLCVzIHJlc2V0dGluZ1xuIiwKLQkJCSAgIHJlYm9vdCwKLQkJCSAgIG15cmkxMGdlX3Jlc2V0X3JlY292ZXIgPyAiIiA6ICIgbm90Iik7CisJCQkgICByZWJvb3QsIG15cmkxMGdlX3Jlc2V0X3JlY292ZXIgPyAiIiA6ICIgbm90Iik7CiAJCWlmIChteXJpMTBnZV9yZXNldF9yZWNvdmVyID09IDApCiAJCQlyZXR1cm47CiAJCXJ0bmxfbG9jaygpOwpAQCAtMzQ3OCwyMyArMzU5NCwyNCBAQAogCQkJCXJldHVybjsKIAkJCX0KIAkJfQotCQkvKiBQZXJoYXBzIGl0IGlzIGEgc29mdHdhcmUgZXJyb3IuICBUcnkgdG8gcmVzZXQgKi8KKwkJLyogUGVyaGFwcyBpdCBpcyBhIHNvZnR3YXJlIGVycm9yLiBTZWUgaWYgc3R1Y2sgc2xpY2UKKwkJICogaGFzIHJlY292ZXJlZCwgcmVzZXQgaWYgbm90ICovCisJCXJ4X3BhdXNlX2NudCA9IG50b2hsKG1ncC0+c3NbMF0uZndfc3RhdHMtPmRyb3BwZWRfcGF1c2UpOworCQlmb3IgKGkgPSAwOyBpIDwgbWdwLT5udW1fc2xpY2VzOyBpKyspIHsKKwkJCXNzID0gbWdwLT5zczsKKwkJCWlmIChzcy0+c3R1Y2spIHsKKwkJCQlteXJpMTBnZV9jaGVja19zbGljZShzcywgJnJlc2V0X25lZWRlZCwKKwkJCQkJCSAgICAgJmJ1c3lfc2xpY2VfY250LAorCQkJCQkJICAgICByeF9wYXVzZV9jbnQpOworCQkJCXNzLT5zdHVjayA9IDA7CisJCQl9CisJCX0KKwkJaWYgKCFyZXNldF9uZWVkZWQpIHsKKwkJCW5ldGRldl9kYmcobWdwLT5kZXYsICJub3QgcmVzZXR0aW5nXG4iKTsKKwkJCXJldHVybjsKKwkJfQogCiAJCW5ldGRldl9lcnIobWdwLT5kZXYsICJkZXZpY2UgdGltZW91dCwgcmVzZXR0aW5nXG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IG1ncC0+bnVtX3NsaWNlczsgaSsrKSB7Ci0JCQl0eCA9ICZtZ3AtPnNzW2ldLnR4OwotCQkJbmV0ZGV2X2VycihtZ3AtPmRldiwgIiglZCk6ICVkICVkICVkICVkICVkICVkXG4iLAotCQkJCSAgIGksIHR4LT5xdWV1ZV9hY3RpdmUsIHR4LT5yZXEsCi0JCQkJICAgdHgtPmRvbmUsIHR4LT5wa3Rfc3RhcnQsIHR4LT5wa3RfZG9uZSwKLQkJCQkgICAoaW50KW50b2hsKG1ncC0+c3NbaV0uZndfc3RhdHMtPgotCQkJCQkgICAgICBzZW5kX2RvbmVfY291bnQpKTsKLQkJCW1zbGVlcCgyMDAwKTsKLQkJCW5ldGRldl9pbmZvKG1ncC0+ZGV2LCAiKCVkKTogJWQgJWQgJWQgJWQgJWQgJWRcbiIsCi0JCQkJICAgIGksIHR4LT5xdWV1ZV9hY3RpdmUsIHR4LT5yZXEsCi0JCQkJICAgIHR4LT5kb25lLCB0eC0+cGt0X3N0YXJ0LCB0eC0+cGt0X2RvbmUsCi0JCQkJICAgIChpbnQpbnRvaGwobWdwLT5zc1tpXS5md19zdGF0cy0+Ci0JCQkJCSAgICAgICBzZW5kX2RvbmVfY291bnQpKTsKLQkJfQogCX0KIAogCWlmICghcmVib290ZWQpIHsKQEAgLTM1NDcsMjcgKzM2NjQsOCBAQAogCQkJICAgIG15cmkxMGdlX2ZpbGxfdGhyZXNoKQogCQkJCXNzLT5yeF9iaWcud2F0Y2hkb2dfbmVlZGVkID0gMDsKIAkJfQotCi0JCWlmIChzcy0+dHgucmVxICE9IHNzLT50eC5kb25lICYmCi0JCSAgICBzcy0+dHguZG9uZSA9PSBzcy0+d2F0Y2hkb2dfdHhfZG9uZSAmJgotCQkgICAgc3MtPndhdGNoZG9nX3R4X3JlcSAhPSBzcy0+d2F0Y2hkb2dfdHhfZG9uZSkgewotCQkJLyogbmljIHNlZW1zIGxpa2UgaXQgbWlnaHQgYmUgc3R1Y2suLiAqLwotCQkJaWYgKHJ4X3BhdXNlX2NudCAhPSBtZ3AtPndhdGNoZG9nX3BhdXNlKSB7Ci0JCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQkJbmV0ZGV2X2VycihtZ3AtPmRldiwgInNsaWNlICVkOiBUWCBwYXVzZWQsIGNoZWNrIGxpbmsgcGFydG5lclxuIiwKLQkJCQkJCSAgIGkpOwotCQkJfSBlbHNlIHsKLQkJCQluZXRkZXZfd2FybihtZ3AtPmRldiwgInNsaWNlICVkIHN0dWNrOiIsIGkpOwotCQkJCXJlc2V0X25lZWRlZCA9IDE7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNzLT53YXRjaGRvZ190eF9kb25lICE9IHNzLT50eC5kb25lIHx8Ci0JCSAgICBzcy0+d2F0Y2hkb2dfcnhfZG9uZSAhPSBzcy0+cnhfZG9uZS5jbnQpIHsKLQkJCWJ1c3lfc2xpY2VfY250Kys7Ci0JCX0KLQkJc3MtPndhdGNoZG9nX3R4X2RvbmUgPSBzcy0+dHguZG9uZTsKLQkJc3MtPndhdGNoZG9nX3R4X3JlcSA9IHNzLT50eC5yZXE7Ci0JCXNzLT53YXRjaGRvZ19yeF9kb25lID0gc3MtPnJ4X2RvbmUuY250OworCQlteXJpMTBnZV9jaGVja19zbGljZShzcywgJnJlc2V0X25lZWRlZCwgJmJ1c3lfc2xpY2VfY250LAorCQkJCSAgICAgcnhfcGF1c2VfY250KTsKIAl9CiAJLyogaWYgd2UndmUgc2VudCBvciByZWNlaXZlZCBubyB0cmFmZmljLCBwb2xsIHRoZSBOSUMgdG8KIAkgKiBlbnN1cmUgaXQgaXMgc3RpbGwgdGhlcmUuICBPdGhlcndpc2UsIHdlIHJpc2sgbm90IG5vdGljaW5nCkBAIC0zNjEzLDggKzM3MTEsOCBAQAogCQkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgYnl0ZXMsCiAJCQkJCSAgc3MtPmZ3X3N0YXRzLCBzcy0+Zndfc3RhdHNfYnVzKTsKIAkJCXNzLT5md19zdGF0cyA9IE5VTEw7Ci0JCQluZXRpZl9uYXBpX2RlbCgmc3MtPm5hcGkpOwogCQl9CisJCW5ldGlmX25hcGlfZGVsKCZzcy0+bmFwaSk7CiAJfQogCWtmcmVlKG1ncC0+c3MpOwogCW1ncC0+c3MgPSBOVUxMOwpAQCAtMzc5MCw3ICszODg4LDcgQEAKIAkubmRvX29wZW4JCT0gbXlyaTEwZ2Vfb3BlbiwKIAkubmRvX3N0b3AJCT0gbXlyaTEwZ2VfY2xvc2UsCiAJLm5kb19zdGFydF94bWl0CQk9IG15cmkxMGdlX3htaXQsCi0JLm5kb19nZXRfc3RhdHMJCT0gbXlyaTEwZ2VfZ2V0X3N0YXRzLAorCS5uZG9fZ2V0X3N0YXRzNjQJPSBteXJpMTBnZV9nZXRfc3RhdHMsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IG15cmkxMGdlX2NoYW5nZV9tdHUsCiAJLm5kb19maXhfZmVhdHVyZXMJPSBteXJpMTBnZV9maXhfZmVhdHVyZXMsCkBAIC0zODQ1LDYgKzM5NDMsNyBAQAogCQlnb3RvIGFib3J0X3dpdGhfZW5hYmxlZDsKIAl9CiAKKwlteXJpMTBnZV9tYXNrX3N1cnByaXNlX2Rvd24ocGRldik7CiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAJZGFjX2VuYWJsZWQgPSAxOwogCXN0YXR1cyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CkBAIC0zOTY0LDcgKzQwNjMsNiBAQAogCXNldHVwX3RpbWVyKCZtZ3AtPndhdGNoZG9nX3RpbWVyLCBteXJpMTBnZV93YXRjaGRvZ190aW1lciwKIAkJICAgICh1bnNpZ25lZCBsb25nKW1ncCk7CiAKLQlzcGluX2xvY2tfaW5pdCgmbWdwLT5zdGF0c19sb2NrKTsKIAlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmbXlyaTEwZ2VfZXRodG9vbF9vcHMpOwogCUlOSVRfV09SSygmbWdwLT53YXRjaGRvZ193b3JrLCBteXJpMTBnZV93YXRjaGRvZyk7CiAJc3RhdHVzID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZV9tY3BfZ2VuX2hlYWRlci5oIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2VfbWNwX2dlbl9oZWFkZXIuaAppbmRleCA2MmExY2JhLi43ZWM0Yjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZV9tY3BfZ2VuX2hlYWRlci5oCisrKyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlX21jcF9nZW5faGVhZGVyLmgKQEAgLTQ1LDYgKzQ1LDggQEAKIAl1bnNpZ25lZCBic3NfYWRkcjsJLyogc3RhcnQgb2YgYnNzICovCiAJdW5zaWduZWQgZmVhdHVyZXM7CiAJdW5zaWduZWQgZWVfaGRyX2FkZHI7CisJdW5zaWduZWQgbGVkX3BhdHRlcm47CisJdW5zaWduZWQgbGVkX3BhdHRlcm5fZGZsdDsKIAkvKiA4ICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpX3NidXMuYyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2FlZWE0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4NyArMCwwIEBACi0vKiBteXJpX3NidXMuYzogTXlyaUNPTSBNeXJpTkVUIFNCVVMgY2FyZCBkcml2ZXIuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5LCAyMDA2LCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKLSAqLwotCi1zdGF0aWMgY2hhciB2ZXJzaW9uW10gPQotICAgICAgICAibXlyaV9zYnVzLmM6djIuMCBKdW5lIDIzLCAyMDA2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldClcbiI7Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0KLSNpbmNsdWRlIDxuZXQvZHN0Lmg+Ci0jaW5jbHVkZSA8bmV0L2FycC5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8bmV0L2lwdjYuaD4KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KLSNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vYXV4aW8uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotI2luY2x1ZGUgIm15cmlfc2J1cy5oIgotCi0vKiAjZGVmaW5lIERFQlVHX0RFVEVDVCAqLwotLyogI2RlZmluZSBERUJVR19JUlEgKi8KLS8qICNkZWZpbmUgREVCVUdfVFJBTlNNSVQgKi8KLS8qICNkZWZpbmUgREVCVUdfUkVDRUlWRSAqLwotLyogI2RlZmluZSBERUJVR19IRUFERVIgKi8KLQotI2lmZGVmIERFQlVHX0RFVEVDVAotI2RlZmluZSBERVQoeCkgICBwcmludGsgeAotI2Vsc2UKLSNkZWZpbmUgREVUKHgpCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX0lSUQotI2RlZmluZSBESVJRKHgpICBwcmludGsgeAotI2Vsc2UKLSNkZWZpbmUgRElSUSh4KQotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19UUkFOU01JVAotI2RlZmluZSBEVFgoeCkgIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBEVFgoeCkKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUkVDRUlWRQotI2RlZmluZSBEUlgoeCkgIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBEUlgoeCkKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfSEVBREVSCi0jZGVmaW5lIERIRFIoeCkgcHJpbnRrIHgKLSNlbHNlCi0jZGVmaW5lIERIRFIoeCkKLSNlbmRpZgotCi0vKiBGaXJtd2FyZSBuYW1lICovCi0jZGVmaW5lIEZXTkFNRQkJIm15cmljb20vbGFuYWkuYmluIgotCi1zdGF0aWMgdm9pZCBteXJpX3Jlc2V0X29mZih2b2lkIF9faW9tZW0gKmxwLCB2b2lkIF9faW9tZW0gKmNyZWdzKQotewotCS8qIENsZWFyIElSUSBtYXNrLiAqLwotCXNidXNfd3JpdGVsKDAsIGxwICsgTEFOQUlfRUlNQVNLKTsKLQotCS8qIFR1cm4gUkVTRVQgZnVuY3Rpb24gb2ZmLiAqLwotCXNidXNfd3JpdGVsKENPTlRST0xfUk9GRiwgY3JlZ3MgKyBNWVJJQ1RSTF9DVFJMKTsKLX0KLQotc3RhdGljIHZvaWQgbXlyaV9yZXNldF9vbih2b2lkIF9faW9tZW0gKmNyZWdzKQotewotCS8qIEVuYWJsZSBSRVNFVCBmdW5jdGlvbi4gKi8KLQlzYnVzX3dyaXRlbChDT05UUk9MX1JPTiwgY3JlZ3MgKyBNWVJJQ1RSTF9DVFJMKTsKLQotCS8qIERpc2FibGUgSVJRJ3MuICovCi0Jc2J1c193cml0ZWwoQ09OVFJPTF9ESVJRLCBjcmVncyArIE1ZUklDVFJMX0NUUkwpOwotfQotCi1zdGF0aWMgdm9pZCBteXJpX2Rpc2FibGVfaXJxKHZvaWQgX19pb21lbSAqbHAsIHZvaWQgX19pb21lbSAqY3JlZ3MpCi17Ci0Jc2J1c193cml0ZWwoQ09OVFJPTF9ESVJRLCBjcmVncyArIE1ZUklDVFJMX0NUUkwpOwotCXNidXNfd3JpdGVsKDAsIGxwICsgTEFOQUlfRUlNQVNLKTsKLQlzYnVzX3dyaXRlbChJU1RBVF9IT1NULCBscCArIExBTkFJX0lTVEFUKTsKLX0KLQotc3RhdGljIHZvaWQgbXlyaV9lbmFibGVfaXJxKHZvaWQgX19pb21lbSAqbHAsIHZvaWQgX19pb21lbSAqY3JlZ3MpCi17Ci0Jc2J1c193cml0ZWwoQ09OVFJPTF9FSVJRLCBjcmVncyArIE1ZUklDVFJMX0NUUkwpOwotCXNidXNfd3JpdGVsKElTVEFUX0hPU1QsIGxwICsgTEFOQUlfRUlNQVNLKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJhbmdfdGhlX2NoaXAoc3RydWN0IG15cmlfZXRoICptcCkKLXsKLQlzdHJ1Y3QgbXlyaV9zaG1lbSBfX2lvbWVtICpzaG1lbSA9IG1wLT5zaG1lbTsKLQl2b2lkIF9faW9tZW0gKmNyZWdzCQk9IG1wLT5jcmVnczsKLQotCXNidXNfd3JpdGVsKDEsICZzaG1lbS0+c2VuZCk7Ci0Jc2J1c193cml0ZWwoQ09OVFJPTF9XT04sIGNyZWdzICsgTVlSSUNUUkxfQ1RSTCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXlyaV9kb19oYW5kc2hha2Uoc3RydWN0IG15cmlfZXRoICptcCkKLXsKLQlzdHJ1Y3QgbXlyaV9zaG1lbSBfX2lvbWVtICpzaG1lbSA9IG1wLT5zaG1lbTsKLQl2b2lkIF9faW9tZW0gKmNyZWdzID0gbXAtPmNyZWdzOwotCXN0cnVjdCBteXJpX2NoYW5uZWwgX19pb21lbSAqY2hhbiA9ICZzaG1lbS0+Y2hhbm5lbDsKLQlpbnQgdGljayAJCQk9IDA7Ci0KLQlERVQoKCJteXJpX2RvX2hhbmRzaGFrZTogIikpOwotCWlmIChzYnVzX3JlYWRsKCZjaGFuLT5zdGF0ZSkgPT0gU1RBVEVfUkVBRFkpIHsKLQkJREVUKCgiQWxyZWFkeSBTVEFURV9SRUFEWSwgZmFpbGVkLlxuIikpOwotCQlyZXR1cm4gLTE7CS8qIFdlJ3JlIGhvc2VkLi4uICovCi0JfQotCi0JbXlyaV9kaXNhYmxlX2lycShtcC0+bHJlZ3MsIGNyZWdzKTsKLQotCXdoaWxlICh0aWNrKysgPCAyNSkgewotCQl1MzIgc29mdHN0YXRlOwotCi0JCS8qIFdha2UgaXQgdXAuICovCi0JCURFVCgoInNoYWtlZG93biwgQ09OVFJPTF9XT04sICIpKTsKLQkJc2J1c193cml0ZWwoMSwgJnNobWVtLT5zaGFrZWRvd24pOwotCQlzYnVzX3dyaXRlbChDT05UUk9MX1dPTiwgY3JlZ3MgKyBNWVJJQ1RSTF9DVFJMKTsKLQotCQlzb2Z0c3RhdGUgPSBzYnVzX3JlYWRsKCZjaGFuLT5zdGF0ZSk7Ci0JCURFVCgoImNoYW5zdGF0ZVslMDh4XSAiLCBzb2Z0c3RhdGUpKTsKLQkJaWYgKHNvZnRzdGF0ZSA9PSBTVEFURV9SRUFEWSkgewotCQkJREVUKCgid2FrZXVwIHN1Y2Nlc3NmdWwsICIpKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHNvZnRzdGF0ZSAhPSBTVEFURV9XRk4pIHsKLQkJCURFVCgoIm5vdCBXRk4gc2V0dGluZyB0aGF0LCAiKSk7Ci0JCQlzYnVzX3dyaXRlbChTVEFURV9XRk4sICZjaGFuLT5zdGF0ZSk7Ci0JCX0KLQotCQl1ZGVsYXkoMjApOwotCX0KLQotCW15cmlfZW5hYmxlX2lycShtcC0+bHJlZ3MsIGNyZWdzKTsKLQotCWlmICh0aWNrID4gMjUpIHsKLQkJREVUKCgiMjUgdGlja3Mgd2UgbG9zZSwgZmFpbHVyZS5cbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlERVQoKCJzdWNjZXNzXG4iKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IG15cmlfbG9hZF9sYW5haShzdHJ1Y3QgbXlyaV9ldGggKm1wKQotewotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZQkqZnc7Ci0Jc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IG1wLT5kZXY7Ci0Jc3RydWN0IG15cmlfc2htZW0gX19pb21lbSAqc2htZW0gPSBtcC0+c2htZW07Ci0Jdm9pZCBfX2lvbWVtCQkqcnB0cjsKLQlpbnQgCQkJaSwgbGFuYWk0X2RhdGFfc2l6ZTsKLQotCW15cmlfZGlzYWJsZV9pcnEobXAtPmxyZWdzLCBtcC0+Y3JlZ3MpOwotCW15cmlfcmVzZXRfb24obXAtPmNyZWdzKTsKLQotCXJwdHIgPSBtcC0+bGFuYWk7Ci0JZm9yIChpID0gMDsgaSA8IG1wLT5lZXByb20ucmFtc3o7IGkrKykKLQkJc2J1c193cml0ZWIoMCwgcnB0ciArIGkpOwotCi0JaWYgKG1wLT5lZXByb20uY3B1dmVycyA+PSBDUFVWRVJTXzNfMCkKLQkJc2J1c193cml0ZWwobXAtPmVlcHJvbS5jdmFsLCBtcC0+bHJlZ3MgKyBMQU5BSV9DVkFMKTsKLQotCWkgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgRldOQU1FLCAmbXAtPm15cmlfb3AtPmRldik7Ci0JaWYgKGkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbG9hZCBpbWFnZSBcIiVzXCIgZXJyICVkXG4iLAotCQkgICAgICAgRldOQU1FLCBpKTsKLQkJcmV0dXJuIGk7Ci0JfQotCWlmIChmdy0+c2l6ZSA8IDIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJCb2d1cyBsZW5ndGggJXp1IGluIGltYWdlIFwiJXNcIlxuIiwKLQkJICAgICAgIGZ3LT5zaXplLCBGV05BTUUpOwotCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWxhbmFpNF9kYXRhX3NpemUgPSBmdy0+ZGF0YVswXSA8PCA4IHwgZnctPmRhdGFbMV07Ci0KLQkvKiBMb2FkIGV4ZWN1dGFibGUgY29kZS4gKi8KLQlmb3IgKGkgPSAyOyBpIDwgZnctPnNpemU7IGkrKykKLQkJc2J1c193cml0ZWIoZnctPmRhdGFbaV0sIHJwdHIrKyk7Ci0KLQkvKiBMb2FkIGRhdGEgc2VnbWVudC4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbGFuYWk0X2RhdGFfc2l6ZTsgaSsrKQotCQlzYnVzX3dyaXRlYigwLCBycHRyKyspOwotCi0JLyogU2V0IGRldmljZSBhZGRyZXNzLiAqLwotCXNidXNfd3JpdGViKDAsICZzaG1lbS0+YWRkclswXSk7Ci0Jc2J1c193cml0ZWIoMCwgJnNobWVtLT5hZGRyWzFdKTsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQlzYnVzX3dyaXRlYihkZXYtPmRldl9hZGRyW2ldLAotCQkJICAgICZzaG1lbS0+YWRkcltpICsgMl0pOwotCi0JLyogU2V0IFNCVVMgYnVyc3RzIGFuZCBpbnRlcnJ1cHQgbWFzay4gKi8KLQlzYnVzX3dyaXRlbCgoKG1wLT5teXJpX2J1cnN0cyAmIDB4ZjgpID4+IDMpLCAmc2htZW0tPmJ1cnN0KTsKLQlzYnVzX3dyaXRlbChTSE1FTV9JTUFTS19SWCwgJnNobWVtLT5pbWFzayk7Ci0KLQkvKiBSZWxlYXNlIHRoZSBMQU5BSS4gKi8KLQlteXJpX2Rpc2FibGVfaXJxKG1wLT5scmVncywgbXAtPmNyZWdzKTsKLQlteXJpX3Jlc2V0X29mZihtcC0+bHJlZ3MsIG1wLT5jcmVncyk7Ci0JbXlyaV9kaXNhYmxlX2lycShtcC0+bHJlZ3MsIG1wLT5jcmVncyk7Ci0KLQkvKiBXYWl0IGZvciB0aGUgcmVzZXQgdG8gY29tcGxldGUuICovCi0JZm9yIChpID0gMDsgaSA8IDUwMDA7IGkrKykgewotCQlpZiAoc2J1c19yZWFkbCgmc2htZW0tPmNoYW5uZWwuc3RhdGUpICE9IFNUQVRFX1JFQURZKQotCQkJYnJlYWs7Ci0JCWVsc2UKLQkJCXVkZWxheSgxMCk7Ci0JfQotCi0JaWYgKGkgPT0gNTAwMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJteXJpY29tOiBDaGlwIHdvdWxkIG5vdCByZXNldCBhZnRlciBmaXJtd2FyZSBsb2FkLlxuIik7Ci0KLQlpID0gbXlyaV9kb19oYW5kc2hha2UobXApOwotCWlmIChpKQotCQlwcmludGsoS0VSTl9FUlIgIm15cmljb206IEhhbmRzaGFrZSB3aXRoIExBTkFJIGZhaWxlZC5cbiIpOwotCi0JaWYgKG1wLT5lZXByb20uY3B1dmVycyA9PSBDUFVWRVJTXzRfMCkKLQkJc2J1c193cml0ZWwoMCwgbXAtPmxyZWdzICsgTEFOQUlfVkVSUyk7Ci0KLQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQlyZXR1cm4gaTsKLX0KLQotc3RhdGljIHZvaWQgbXlyaV9jbGVhbl9yaW5ncyhzdHJ1Y3QgbXlyaV9ldGggKm1wKQotewotCXN0cnVjdCBzZW5kcSBfX2lvbWVtICpzcSA9IG1wLT5zcTsKLQlzdHJ1Y3QgcmVjdnEgX19pb21lbSAqcnEgPSBtcC0+cnE7Ci0JaW50IGk7Ci0KLQlzYnVzX3dyaXRlbCgwLCAmcnEtPnRhaWwpOwotCXNidXNfd3JpdGVsKDAsICZycS0+aGVhZCk7Ci0JZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUrMSk7IGkrKykgewotCQlpZiAobXAtPnJ4X3NrYnNbaV0gIT0gTlVMTCkgewotCQkJc3RydWN0IG15cmlfcnhkIF9faW9tZW0gKnJ4ZCA9ICZycS0+bXlyaV9yeGRbaV07Ci0JCQl1MzIgZG1hX2FkZHI7Ci0KLQkJCWRtYV9hZGRyID0gc2J1c19yZWFkbCgmcnhkLT5teXJpX3NjYXR0ZXJzWzBdLmFkZHIpOwotCQkJZG1hX3VubWFwX3NpbmdsZSgmbXAtPm15cmlfb3AtPmRldiwgZG1hX2FkZHIsCi0JCQkJCSBSWF9BTExPQ19TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwotCQkJZGV2X2tmcmVlX3NrYihtcC0+cnhfc2tic1tpXSk7Ci0JCQltcC0+cnhfc2tic1tpXSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQltcC0+dHhfb2xkID0gMDsKLQlzYnVzX3dyaXRlbCgwLCAmc3EtPnRhaWwpOwotCXNidXNfd3JpdGVsKDAsICZzcS0+aGVhZCk7Ci0JZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7Ci0JCWlmIChtcC0+dHhfc2tic1tpXSAhPSBOVUxMKSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbXAtPnR4X3NrYnNbaV07Ci0JCQlzdHJ1Y3QgbXlyaV90eGQgX19pb21lbSAqdHhkID0gJnNxLT5teXJpX3R4ZFtpXTsKLQkJCXUzMiBkbWFfYWRkcjsKLQotCQkJZG1hX2FkZHIgPSBzYnVzX3JlYWRsKCZ0eGQtPm15cmlfZ2F0aGVyc1swXS5hZGRyKTsKLQkJCWRtYV91bm1hcF9zaW5nbGUoJm1wLT5teXJpX29wLT5kZXYsIGRtYV9hZGRyLAotCQkJCQkgKHNrYi0+bGVuICsgMykgJiB+MywKLQkJCQkJIERNQV9UT19ERVZJQ0UpOwotCQkJZGV2X2tmcmVlX3NrYihtcC0+dHhfc2tic1tpXSk7Ci0JCQltcC0+dHhfc2tic1tpXSA9IE5VTEw7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG15cmlfaW5pdF9yaW5ncyhzdHJ1Y3QgbXlyaV9ldGggKm1wLCBpbnQgZnJvbV9pcnEpCi17Ci0Jc3RydWN0IHJlY3ZxIF9faW9tZW0gKnJxID0gbXAtPnJxOwotCXN0cnVjdCBteXJpX3J4ZCBfX2lvbWVtICpyeGQgPSAmcnEtPm15cmlfcnhkWzBdOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtcC0+ZGV2OwotCWdmcF90IGdmcF9mbGFncyA9IEdGUF9LRVJORUw7Ci0JaW50IGk7Ci0KLQlpZiAoZnJvbV9pcnEgfHwgaW5faW50ZXJydXB0KCkpCi0JCWdmcF9mbGFncyA9IEdGUF9BVE9NSUM7Ci0KLQlteXJpX2NsZWFuX3JpbmdzKG1wKTsKLQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IG15cmlfYWxsb2Nfc2tiKFJYX0FMTE9DX1NJWkUsIGdmcF9mbGFncyk7Ci0JCXUzMiBkbWFfYWRkcjsKLQotCQlpZiAoIXNrYikKLQkJCWNvbnRpbnVlOwotCQltcC0+cnhfc2tic1tpXSA9IHNrYjsKLQkJc2tiLT5kZXYgPSBkZXY7Ci0JCXNrYl9wdXQoc2tiLCBSWF9BTExPQ19TSVpFKTsKLQotCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKCZtcC0+bXlyaV9vcC0+ZGV2LAotCQkJCQkgIHNrYi0+ZGF0YSwgUlhfQUxMT0NfU0laRSwKLQkJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwotCQlzYnVzX3dyaXRlbChkbWFfYWRkciwgJnJ4ZFtpXS5teXJpX3NjYXR0ZXJzWzBdLmFkZHIpOwotCQlzYnVzX3dyaXRlbChSWF9BTExPQ19TSVpFLCAmcnhkW2ldLm15cmlfc2NhdHRlcnNbMF0ubGVuKTsKLQkJc2J1c193cml0ZWwoaSwgJnJ4ZFtpXS5jdHgpOwotCQlzYnVzX3dyaXRlbCgxLCAmcnhkW2ldLm51bV9zZyk7Ci0JfQotCXNidXNfd3JpdGVsKDAsICZycS0+aGVhZCk7Ci0Jc2J1c193cml0ZWwoUlhfUklOR19TSVpFLCAmcnEtPnRhaWwpOwotfQotCi1zdGF0aWMgaW50IG15cmlfaW5pdChzdHJ1Y3QgbXlyaV9ldGggKm1wLCBpbnQgZnJvbV9pcnEpCi17Ci0JbXlyaV9pbml0X3JpbmdzKG1wLCBmcm9tX2lycSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG15cmlfaXNfbm90X3NvX2hhcHB5KHN0cnVjdCBteXJpX2V0aCAqbXApCi17Ci19Ci0KLSNpZmRlZiBERUJVR19IRUFERVIKLXN0YXRpYyB2b2lkIGR1bXBfZWhkcihzdHJ1Y3QgZXRoaGRyICplaGRyKQotewotCXByaW50aygiZWhkcltoX2RzdCglcE0pIgotCSAgICAgICAiaF9zb3VyY2UoJXBNKSIKLQkgICAgICAgImhfcHJvdG8oJTA0eCldXG4iLAotCSAgICAgICBlaGRyLT5oX2Rlc3QsIGVoZHItPmhfc291cmNlLCBlaGRyLT5oX3Byb3RvKTsKLX0KLQotc3RhdGljIHZvaWQgZHVtcF9laGRyX2FuZF9teXJpcGFkKHVuc2lnbmVkIGNoYXIgKnN0dWZmKQotewotCXN0cnVjdCBldGhoZHIgKmVoZHIgPSAoc3RydWN0IGV0aGhkciAqKSAoc3R1ZmYgKyAyKTsKLQotCXByaW50aygicGFkWyUwMng6JTAyeF0iLCBzdHVmZlswXSwgc3R1ZmZbMV0pOwotCWR1bXBfZWhkcihlaGRyKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBteXJpX3R4KHN0cnVjdCBteXJpX2V0aCAqbXAsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNlbmRxIF9faW9tZW0gKnNxPSBtcC0+c3E7Ci0JaW50IGVudHJ5CQk9IG1wLT50eF9vbGQ7Ci0JaW50IGxpbWl0CQk9IHNidXNfcmVhZGwoJnNxLT5oZWFkKTsKLQotCURUWCgoImVudHJ5WyVkXSBsaW1pdFslZF0gIiwgZW50cnksIGxpbWl0KSk7Ci0JaWYgKGVudHJ5ID09IGxpbWl0KQotCQlyZXR1cm47Ci0Jd2hpbGUgKGVudHJ5ICE9IGxpbWl0KSB7Ci0JCXN0cnVjdCBza19idWZmICpza2IgPSBtcC0+dHhfc2tic1tlbnRyeV07Ci0JCXUzMiBkbWFfYWRkcjsKLQotCQlEVFgoKCJTS0JbJWRdICIsIGVudHJ5KSk7Ci0JCWRtYV9hZGRyID0gc2J1c19yZWFkbCgmc3EtPm15cmlfdHhkW2VudHJ5XS5teXJpX2dhdGhlcnNbMF0uYWRkcik7Ci0JCWRtYV91bm1hcF9zaW5nbGUoJm1wLT5teXJpX29wLT5kZXYsIGRtYV9hZGRyLAotCQkJCSBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJbXAtPnR4X3NrYnNbZW50cnldID0gTlVMTDsKLQkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7Ci0JfQotCW1wLT50eF9vbGQgPSBlbnRyeTsKLX0KLQotLyogRGV0ZXJtaW5lIHRoZSBwYWNrZXQncyBwcm90b2NvbCBJRC4gVGhlIHJ1bGUgaGVyZSBpcyB0aGF0IHdlCi0gKiBhc3N1bWUgODAyLjMgaWYgdGhlIHR5cGUgZmllbGQgaXMgc2hvcnQgZW5vdWdoIHRvIGJlIGEgbGVuZ3RoLgotICogVGhpcyBpcyBub3JtYWwgcHJhY3RpY2UgYW5kIHdvcmtzIGZvciBhbnkgJ25vdyBpbiB1c2UnIHByb3RvY29sLgotICovCi1zdGF0aWMgX19iZTE2IG15cmlfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBldGhoZHIgKmV0aDsKLQl1bnNpZ25lZCBjaGFyICpyYXdwOwotCi0Jc2tiX3NldF9tYWNfaGVhZGVyKHNrYiwgTVlSSV9QQURfTEVOKTsKLQlza2JfcHVsbChza2IsIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKLQlldGggPSBldGhfaGRyKHNrYik7Ci0KLSNpZmRlZiBERUJVR19IRUFERVIKLQlESERSKCgibXlyaV90eXBlX3RyYW5zOiAiKSk7Ci0JZHVtcF9laGRyKGV0aCk7Ci0jZW5kaWYKLQlpZiAoKmV0aC0+aF9kZXN0ICYgMSkgewotCQlpZiAobWVtY21wKGV0aC0+aF9kZXN0LCBkZXYtPmJyb2FkY2FzdCwgRVRIX0FMRU4pPT0wKQotCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9CUk9BRENBU1Q7Ci0JCWVsc2UKLQkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfTVVMVElDQVNUOwotCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIChJRkZfUFJPTUlTQ3xJRkZfQUxMTVVMVEkpKSB7Ci0JCWlmIChtZW1jbXAoZXRoLT5oX2Rlc3QsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkKLQkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwotCX0KLQotCWlmIChudG9ocyhldGgtPmhfcHJvdG8pID49IDE1MzYpCi0JCXJldHVybiBldGgtPmhfcHJvdG87Ci0KLQlyYXdwID0gc2tiLT5kYXRhOwotCi0JLyogVGhpcyBpcyBhIG1hZ2ljIGhhY2sgdG8gc3BvdCBJUFggcGFja2V0cy4gT2xkZXIgTm92ZWxsIGJyZWFrcwotCSAqIHRoZSBwcm90b2NvbCBkZXNpZ24gYW5kIHJ1bnMgSVBYIG92ZXIgODAyLjMgd2l0aG91dCBhbiA4MDIuMiBMTEMKLQkgKiBsYXllci4gV2UgbG9vayBmb3IgRkZGRiB3aGljaCBpc24ndCBhIHVzZWQgODAyLjIgU1NBUC9EU0FQLiBUaGlzCi0JICogd29uJ3Qgd29yayBmb3IgZmF1bHQgdG9sZXJhbnQgbmV0d2FyZSBidXQgZG9lcyBmb3IgdGhlIHJlc3QuCi0JICovCi0JaWYgKCoodW5zaWduZWQgc2hvcnQgKilyYXdwID09IDB4RkZGRikKLQkJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8zKTsKLQotCS8qIFJlYWwgODAyLjIgTExDICovCi0JcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8yKTsKLX0KLQotc3RhdGljIHZvaWQgbXlyaV9yeChzdHJ1Y3QgbXlyaV9ldGggKm1wLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCByZWN2cSBfX2lvbWVtICpycSA9IG1wLT5ycTsKLQlzdHJ1Y3QgcmVjdnEgX19pb21lbSAqcnFhID0gbXAtPnJxYWNrOwotCWludCBlbnRyeQkJPSBzYnVzX3JlYWRsKCZycWEtPmhlYWQpOwotCWludCBsaW1pdAkJPSBzYnVzX3JlYWRsKCZycWEtPnRhaWwpOwotCWludCBkcm9wczsKLQotCURSWCgoImVudHJ5WyVkXSBsaW1pdFslZF0gIiwgZW50cnksIGxpbWl0KSk7Ci0JaWYgKGVudHJ5ID09IGxpbWl0KQotCQlyZXR1cm47Ci0JZHJvcHMgPSAwOwotCURSWCgoIlxuIikpOwotCXdoaWxlIChlbnRyeSAhPSBsaW1pdCkgewotCQlzdHJ1Y3QgbXlyaV9yeGQgX19pb21lbSAqcnhkYWNrID0gJnJxYS0+bXlyaV9yeGRbZW50cnldOwotCQl1MzIgY3N1bQkJPSBzYnVzX3JlYWRsKCZyeGRhY2stPmNzdW0pOwotCQlpbnQgbGVuCQkJPSBzYnVzX3JlYWRsKCZyeGRhY2stPm15cmlfc2NhdHRlcnNbMF0ubGVuKTsKLQkJaW50IGluZGV4CQk9IHNidXNfcmVhZGwoJnJ4ZGFjay0+Y3R4KTsKLQkJc3RydWN0IG15cmlfcnhkIF9faW9tZW0gKnJ4ZCA9ICZycS0+bXlyaV9yeGRbc2J1c19yZWFkbCgmcnEtPnRhaWwpXTsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYgk9IG1wLT5yeF9za2JzW2luZGV4XTsKLQotCQkvKiBBY2sgaXQuICovCi0JCXNidXNfd3JpdGVsKE5FWFRfUlgoZW50cnkpLCAmcnFhLT5oZWFkKTsKLQotCQkvKiBDaGVjayBmb3IgZXJyb3JzLiAqLwotCQlEUlgoKCJyeGRbJWRdOiAlcCBsZW5bJWRdIGNzdW1bJTA4eF0gIiwgZW50cnksIHJ4ZCwgbGVuLCBjc3VtKSk7Ci0JCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCZtcC0+bXlyaV9vcC0+ZGV2LAotCQkJCQlzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkciksCi0JCQkJCVJYX0FMTE9DX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7Ci0JCWlmIChsZW4gPCAoRVRIX0hMRU4gKyBNWVJJX1BBRF9MRU4pIHx8IChza2ItPmRhdGFbMF0gIT0gTVlSSV9QQURfTEVOKSkgewotCQkJRFJYKCgiRVJST1JbIikpOwotCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCWlmIChsZW4gPCAoRVRIX0hMRU4gKyBNWVJJX1BBRF9MRU4pKSB7Ci0JCQkJRFJYKCgiQkFEX0xFTkdUSF0gIikpOwotCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwotCQkJfSBlbHNlIHsKLQkJCQlEUlgoKCJOT19QQURESU5HXSAiKSk7Ci0JCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKLQkJCX0KLQotCQkJLyogUmV0dXJuIGl0IHRvIHRoZSBMQU5BSS4gKi8KLQlkcm9wX2l0OgotCQkJZHJvcHMrKzsKLQkJCURSWCgoIkRST1AgIikpOwotCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0JCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgmbXAtPm15cmlfb3AtPmRldiwKLQkJCQkJCSAgIHNidXNfcmVhZGwoJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5hZGRyKSwKLQkJCQkJCSAgIFJYX0FMTE9DX1NJWkUsCi0JCQkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwotCQkJc2J1c193cml0ZWwoUlhfQUxMT0NfU0laRSwgJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5sZW4pOwotCQkJc2J1c193cml0ZWwoaW5kZXgsICZyeGQtPmN0eCk7Ci0JCQlzYnVzX3dyaXRlbCgxLCAmcnhkLT5udW1fc2cpOwotCQkJc2J1c193cml0ZWwoTkVYVF9SWChzYnVzX3JlYWRsKCZycS0+dGFpbCkpLCAmcnEtPnRhaWwpOwotCQkJZ290byBuZXh0OwotCQl9Ci0KLQkJRFJYKCgibGVuWyVkXSAiLCBsZW4pKTsKLQkJaWYgKGxlbiA+IFJYX0NPUFlfVEhSRVNIT0xEKSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKLQkJCXUzMiBkbWFfYWRkcjsKLQotCQkJRFJYKCgiQklHQlVGRiAiKSk7Ci0JCQluZXdfc2tiID0gbXlyaV9hbGxvY19za2IoUlhfQUxMT0NfU0laRSwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAobmV3X3NrYiA9PSBOVUxMKSB7Ci0JCQkJRFJYKCgic2tiX2FsbG9jKEZBSUxFRCkgIikpOwotCQkJCWdvdG8gZHJvcF9pdDsKLQkJCX0KLQkJCWRtYV91bm1hcF9zaW5nbGUoJm1wLT5teXJpX29wLT5kZXYsCi0JCQkJCSBzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkciksCi0JCQkJCSBSWF9BTExPQ19TSVpFLAotCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKLQkJCW1wLT5yeF9za2JzW2luZGV4XSA9IG5ld19za2I7Ci0JCQluZXdfc2tiLT5kZXYgPSBkZXY7Ci0JCQlza2JfcHV0KG5ld19za2IsIFJYX0FMTE9DX1NJWkUpOwotCQkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSgmbXAtPm15cmlfb3AtPmRldiwKLQkJCQkJCSAgbmV3X3NrYi0+ZGF0YSwKLQkJCQkJCSAgUlhfQUxMT0NfU0laRSwKLQkJCQkJCSAgRE1BX0ZST01fREVWSUNFKTsKLQkJCXNidXNfd3JpdGVsKGRtYV9hZGRyLCAmcnhkLT5teXJpX3NjYXR0ZXJzWzBdLmFkZHIpOwotCQkJc2J1c193cml0ZWwoUlhfQUxMT0NfU0laRSwgJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5sZW4pOwotCQkJc2J1c193cml0ZWwoaW5kZXgsICZyeGQtPmN0eCk7Ci0JCQlzYnVzX3dyaXRlbCgxLCAmcnhkLT5udW1fc2cpOwotCQkJc2J1c193cml0ZWwoTkVYVF9SWChzYnVzX3JlYWRsKCZycS0+dGFpbCkpLCAmcnEtPnRhaWwpOwotCi0JCQkvKiBUcmltIHRoZSBvcmlnaW5hbCBza2IgZm9yIHRoZSBuZXRpZi4gKi8KLQkJCURSWCgoInRyaW0oJWQpICIsIGxlbikpOwotCQkJc2tiX3RyaW0oc2tiLCBsZW4pOwotCQl9IGVsc2UgewotCQkJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOwotCi0JCQlEUlgoKCJTTUFMTEJVRkYgIikpOwotCQkJaWYgKGNvcHlfc2tiID09IE5VTEwpIHsKLQkJCQlEUlgoKCJkZXZfYWxsb2Nfc2tiKEZBSUxFRCkgIikpOwotCQkJCWdvdG8gZHJvcF9pdDsKLQkJCX0KLQkJCS8qIERNQSBzeW5jIGFscmVhZHkgZG9uZSBhYm92ZS4gKi8KLQkJCWNvcHlfc2tiLT5kZXYgPSBkZXY7Ci0JCQlEUlgoKCJyZXN2X2FuZF9wdXQgIikpOwotCQkJc2tiX3B1dChjb3B5X3NrYiwgbGVuKTsKLQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBjb3B5X3NrYi0+ZGF0YSwgbGVuKTsKLQotCQkJLyogUmV1c2Ugb3JpZ2luYWwgcmluZyBidWZmZXIuICovCi0JCQlEUlgoKCJyZXVzZSAiKSk7Ci0JCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgmbXAtPm15cmlfb3AtPmRldiwKLQkJCQkJCSAgIHNidXNfcmVhZGwoJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5hZGRyKSwKLQkJCQkJCSAgIFJYX0FMTE9DX1NJWkUsCi0JCQkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwotCQkJc2J1c193cml0ZWwoUlhfQUxMT0NfU0laRSwgJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5sZW4pOwotCQkJc2J1c193cml0ZWwoaW5kZXgsICZyeGQtPmN0eCk7Ci0JCQlzYnVzX3dyaXRlbCgxLCAmcnhkLT5udW1fc2cpOwotCQkJc2J1c193cml0ZWwoTkVYVF9SWChzYnVzX3JlYWRsKCZycS0+dGFpbCkpLCAmcnEtPnRhaWwpOwotCi0JCQlza2IgPSBjb3B5X3NrYjsKLQkJfQotCi0JCS8qIEp1c3QgbGlrZSB0aGUgaGFwcHkgbWVhbCB3ZSBnZXQgY2hlY2tzdW1zIGZyb20gdGhpcyBjYXJkLiAqLwotCQlza2ItPmNzdW0gPSBjc3VtOwotCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOyAvKiBYWFggKi8KLQotCQlza2ItPnByb3RvY29sID0gbXlyaV90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLQkJRFJYKCgicHJvdFslMDR4XSBuZXRpZl9yeCAiLCBza2ItPnByb3RvY29sKSk7Ci0JCW5ldGlmX3J4KHNrYik7Ci0KLQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwotCW5leHQ6Ci0JCURSWCgoIk5FWFRcbiIpKTsKLQkJZW50cnkgPSBORVhUX1JYKGVudHJ5KTsKLQl9Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBteXJpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldgkJPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOwotCXN0cnVjdCBteXJpX2V0aCAqbXAJCT0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl2b2lkIF9faW9tZW0gKmxyZWdzCQk9IG1wLT5scmVnczsKLQlzdHJ1Y3QgbXlyaV9jaGFubmVsIF9faW9tZW0gKmNoYW4gPSAmbXAtPnNobWVtLT5jaGFubmVsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHN0YXR1czsKLQlpbnQgaGFuZGxlZCA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmlycV9sb2NrLCBmbGFncyk7Ci0KLQlzdGF0dXMgPSBzYnVzX3JlYWRsKGxyZWdzICsgTEFOQUlfSVNUQVQpOwotCURJUlEoKCJteXJpX2ludGVycnVwdDogc3RhdHVzWyUwOHhdICIsIHN0YXR1cykpOwotCWlmIChzdGF0dXMgJiBJU1RBVF9IT1NUKSB7Ci0JCXUzMiBzb2Z0c3RhdGU7Ci0KLQkJaGFuZGxlZCA9IDE7Ci0JCURJUlEoKCJJUlFfRElTQUIgIikpOwotCQlteXJpX2Rpc2FibGVfaXJxKGxyZWdzLCBtcC0+Y3JlZ3MpOwotCQlzb2Z0c3RhdGUgPSBzYnVzX3JlYWRsKCZjaGFuLT5zdGF0ZSk7Ci0JCURJUlEoKCJzdGF0ZVslMDh4XSAiLCBzb2Z0c3RhdGUpKTsKLQkJaWYgKHNvZnRzdGF0ZSAhPSBTVEFURV9SRUFEWSkgewotCQkJRElSUSgoIm15cmlfbm90X3NvX2hhcHB5ICIpKTsKLQkJCW15cmlfaXNfbm90X3NvX2hhcHB5KG1wKTsKLQkJfQotCQlESVJRKCgiXG5teXJpX3J4OiAiKSk7Ci0JCW15cmlfcngobXAsIGRldik7Ci0JCURJUlEoKCJcbmlzdGF0PUlTVEFUX0hPU1QgIikpOwotCQlzYnVzX3dyaXRlbChJU1RBVF9IT1NULCBscmVncyArIExBTkFJX0lTVEFUKTsKLQkJRElSUSgoIklSUV9FTkFCICIpKTsKLQkJbXlyaV9lbmFibGVfaXJxKGxyZWdzLCBtcC0+Y3JlZ3MpOwotCX0KLQlESVJRKCgiXG4iKSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+aXJxX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwotfQotCi1zdGF0aWMgaW50IG15cmlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBteXJpX2V0aCAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JcmV0dXJuIG15cmlfaW5pdChtcCwgaW5faW50ZXJydXB0KCkpOwotfQotCi1zdGF0aWMgaW50IG15cmlfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbXlyaV9ldGggKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCW15cmlfY2xlYW5fcmluZ3MobXApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBteXJpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbXlyaV9ldGggKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgcmVzZXR0aW5nXG4iLCBkZXYtPm5hbWUpOwotCi0JZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKLQlteXJpX2luaXQobXAsIDApOwotCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLX0KLQotc3RhdGljIGludCBteXJpX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbXlyaV9ldGggKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgc2VuZHEgX19pb21lbSAqc3EgPSBtcC0+c3E7Ci0Jc3RydWN0IG15cmlfdHhkIF9faW9tZW0gKnR4ZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBoZWFkLCB0YWlsOwotCWludCBsZW4sIGVudHJ5OwotCXUzMiBkbWFfYWRkcjsKLQotCURUWCgoIm15cmlfc3RhcnRfeG1pdDogIikpOwotCi0JbXlyaV90eChtcCwgZGV2KTsKLQotCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQotCS8qIFRoaXMgaXMganVzdCB0byBwcmV2ZW50IG11bHRpcGxlIFBJTyByZWFkcyBmb3IgVFhfQlVGRlNfQVZBSUwuICovCi0JaGVhZCA9IHNidXNfcmVhZGwoJnNxLT5oZWFkKTsKLQl0YWlsID0gc2J1c19yZWFkbCgmc3EtPnRhaWwpOwotCi0JaWYgKCFUWF9CVUZGU19BVkFJTChoZWFkLCB0YWlsKSkgewotCQlEVFgoKCJubyBidWZmcyBhdmFpbGFibGUsIHJldHVybmluZyAxXG4iKSk7Ci0JCXJldHVybiBORVRERVZfVFhfQlVTWTsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmlycV9sb2NrLCBmbGFncyk7Ci0KLQlESERSKCgieG1pdFtza2JkYXRhKCVwKV1cbiIsIHNrYi0+ZGF0YSkpOwotI2lmZGVmIERFQlVHX0hFQURFUgotCWR1bXBfZWhkcl9hbmRfbXlyaXBhZCgoKHVuc2lnbmVkIGNoYXIgKikgc2tiLT5kYXRhKSk7Ci0jZW5kaWYKLQotCS8qIFhYWCBNYXliZSB0aGlzIGNhbiBnbyBhcyB3ZWxsLiAqLwotCWxlbiA9IHNrYi0+bGVuOwotCWlmIChsZW4gJiAzKSB7Ci0JCURUWCgoImxlbiYzICIpKTsKLQkJbGVuID0gKGxlbiArIDQpICYgKH4zKTsKLQl9Ci0KLQllbnRyeSA9IHNidXNfcmVhZGwoJnNxLT50YWlsKTsKLQotCXR4ZCA9ICZzcS0+bXlyaV90eGRbZW50cnldOwotCW1wLT50eF9za2JzW2VudHJ5XSA9IHNrYjsKLQotCS8qIE11c3QgZG8gdGhpcyBiZWZvcmUgd2Ugc2J1cyBtYXAgaXQuICovCi0JaWYgKHNrYi0+ZGF0YVtNWVJJX1BBRF9MRU5dICYgMHgxKSB7Ci0JCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclswXSk7Ci0JCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclsxXSk7Ci0JCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclsyXSk7Ci0JCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclszXSk7Ci0JfSBlbHNlIHsKLQkJc2J1c193cml0ZXcoMHhmZmZmLCAmdHhkLT5hZGRyWzBdKTsKLQkJc2J1c193cml0ZXcoKHNrYi0+ZGF0YVswXSA8PCA4KSB8IHNrYi0+ZGF0YVsxXSwgJnR4ZC0+YWRkclsxXSk7Ci0JCXNidXNfd3JpdGV3KChza2ItPmRhdGFbMl0gPDwgOCkgfCBza2ItPmRhdGFbM10sICZ0eGQtPmFkZHJbMl0pOwotCQlzYnVzX3dyaXRldygoc2tiLT5kYXRhWzRdIDw8IDgpIHwgc2tiLT5kYXRhWzVdLCAmdHhkLT5hZGRyWzNdKTsKLQl9Ci0KLQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKCZtcC0+bXlyaV9vcC0+ZGV2LCBza2ItPmRhdGEsCi0JCQkJICBsZW4sIERNQV9UT19ERVZJQ0UpOwotCXNidXNfd3JpdGVsKGRtYV9hZGRyLCAmdHhkLT5teXJpX2dhdGhlcnNbMF0uYWRkcik7Ci0Jc2J1c193cml0ZWwobGVuLCAmdHhkLT5teXJpX2dhdGhlcnNbMF0ubGVuKTsKLQlzYnVzX3dyaXRlbCgxLCAmdHhkLT5udW1fc2cpOwotCXNidXNfd3JpdGVsKEtFUk5FTF9DSEFOTkVMLCAmdHhkLT5jaGFuKTsKLQlzYnVzX3dyaXRlbChsZW4sICZ0eGQtPmxlbik7Ci0Jc2J1c193cml0ZWwoKHUzMiktMSwgJnR4ZC0+Y3N1bV9vZmYpOwotCXNidXNfd3JpdGVsKDAsICZ0eGQtPmNzdW1fZmllbGQpOwotCi0Jc2J1c193cml0ZWwoTkVYVF9UWChlbnRyeSksICZzcS0+dGFpbCk7Ci0JRFRYKCgiQmFuZ1RoZUNoaXAgIikpOwotCWJhbmdfdGhlX2NoaXAobXApOwotCi0JRFRYKCgidGJ1c3k9MCwgcmV0dXJuaW5nIDBcbiIpKTsKLQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5pcnFfbG9jaywgZmxhZ3MpOwotCXJldHVybiBORVRERVZfVFhfT0s7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgTXlyaU5ldCBNQUMgaGVhZGVyIGZvciBhbiBhcmJpdHJhcnkgcHJvdG9jb2wgbGF5ZXIKLSAqCi0gKiBzYWRkcj1OVUxMCW1lYW5zIHVzZSBkZXZpY2Ugc291cmNlIGFkZHJlc3MKLSAqIGRhZGRyPU5VTEwJbWVhbnMgbGVhdmUgZGVzdGluYXRpb24gYWRkcmVzcyAoZWcgdW5yZXNvbHZlZCBhcnApCi0gKi8KLXN0YXRpYyBpbnQgbXlyaV9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIGNvbnN0IHZvaWQgKmRhZGRyLAotCQkgICAgICAgY29uc3Qgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgZXRoaGRyICpldGggPSAoc3RydWN0IGV0aGhkciAqKSBza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKLQl1bnNpZ25lZCBjaGFyICpwYWQgPSAodW5zaWduZWQgY2hhciAqKSBza2JfcHVzaChza2IsIE1ZUklfUEFEX0xFTik7Ci0KLSNpZmRlZiBERUJVR19IRUFERVIKLQlESERSKCgibXlyaV9oZWFkZXI6IHBhZFslMDJ4LCUwMnhdICIsIHBhZFswXSwgcGFkWzFdKSk7Ci0JZHVtcF9laGRyKGV0aCk7Ci0jZW5kaWYKLQotCS8qIFNldCB0aGUgTXlyaU5FVCBwYWRkaW5nIGlkZW50aWZpZXIuICovCi0JcGFkWzBdID0gTVlSSV9QQURfTEVOOwotCXBhZFsxXSA9IDB4YWI7Ci0KLQkvKiBTZXQgdGhlIHByb3RvY29sIHR5cGUuIEZvciBhIHBhY2tldCBvZiB0eXBlIEVUSF9QXzgwMl8zLzIgd2UgcHV0IHRoZQotCSAqIGxlbmd0aCBpbiBoZXJlIGluc3RlYWQuCi0JICovCi0JaWYgKHR5cGUgIT0gRVRIX1BfODAyXzMgJiYgdHlwZSAhPSBFVEhfUF84MDJfMikKLQkJZXRoLT5oX3Byb3RvID0gaHRvbnModHlwZSk7Ci0JZWxzZQotCQlldGgtPmhfcHJvdG8gPSBodG9ucyhsZW4pOwotCi0JLyogU2V0IHRoZSBzb3VyY2UgaGFyZHdhcmUgYWRkcmVzcy4gKi8KLQlpZiAoc2FkZHIpCi0JCW1lbWNweShldGgtPmhfc291cmNlLCBzYWRkciwgZGV2LT5hZGRyX2xlbik7Ci0JZWxzZQotCQltZW1jcHkoZXRoLT5oX3NvdXJjZSwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7Ci0KLQkvKiBBbnl3YXksIHRoZSBsb29wYmFjay1kZXZpY2Ugc2hvdWxkIG5ldmVyIHVzZSB0aGlzIGZ1bmN0aW9uLi4uICovCi0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBkZXYtPmFkZHJfbGVuOyBpKyspCi0JCQlldGgtPmhfZGVzdFtpXSA9IDA7Ci0JCXJldHVybiBkZXYtPmhhcmRfaGVhZGVyX2xlbjsKLQl9Ci0KLQlpZiAoZGFkZHIpIHsKLQkJbWVtY3B5KGV0aC0+aF9kZXN0LCBkYWRkciwgZGV2LT5hZGRyX2xlbik7Ci0JCXJldHVybiBkZXYtPmhhcmRfaGVhZGVyX2xlbjsKLQl9Ci0JcmV0dXJuIC1kZXYtPmhhcmRfaGVhZGVyX2xlbjsKLX0KLQotLyogUmVidWlsZCB0aGUgTXlyaU5ldCBNQUMgaGVhZGVyLiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbiBBUlAKLSAqIChvciBpbiBmdXR1cmUgb3RoZXIgYWRkcmVzcyByZXNvbHV0aW9uKSBoYXMgY29tcGxldGVkIG9uIHRoaXMKLSAqIHNrX2J1ZmYuIFdlIG5vdyBsZXQgQVJQIGZpbGwgaW4gdGhlIG90aGVyIGZpZWxkcy4KLSAqLwotc3RhdGljIGludCBteXJpX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JdW5zaWduZWQgY2hhciAqcGFkID0gKHVuc2lnbmVkIGNoYXIgKikgc2tiLT5kYXRhOwotCXN0cnVjdCBldGhoZHIgKmV0aCA9IChzdHJ1Y3QgZXRoaGRyICopIChwYWQgKyBNWVJJX1BBRF9MRU4pOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKLQotI2lmZGVmIERFQlVHX0hFQURFUgotCURIRFIoKCJteXJpX3JlYnVpbGRfaGVhZGVyOiBwYWRbJTAyeCwlMDJ4XSAiLCBwYWRbMF0sIHBhZFsxXSkpOwotCWR1bXBfZWhkcihldGgpOwotI2VuZGlmCi0KLQkvKiBSZWZpbGwgTXlyaU5ldCBwYWRkaW5nIGlkZW50aWZpZXJzLCB0aGlzIGlzIGp1c3QgYmVpbmcgYW5hbC4gKi8KLQlwYWRbMF0gPSBNWVJJX1BBRF9MRU47Ci0JcGFkWzFdID0gMHhhYjsKLQotCXN3aXRjaCAoZXRoLT5oX3Byb3RvKQotCXsKLSNpZmRlZiBDT05GSUdfSU5FVAotCWNhc2UgY3B1X3RvX2JlMTYoRVRIX1BfSVApOgotIAkJcmV0dXJuIGFycF9maW5kKGV0aC0+aF9kZXN0LCBza2IpOwotI2VuZGlmCi0KLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRwotCQkgICAgICAgIiVzOiB1bmFibGUgdG8gcmVzb2x2ZSB0eXBlICVYIGFkZHJlc3Nlcy5cbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIChpbnQpZXRoLT5oX3Byb3RvKTsKLQotCQltZW1jcHkoZXRoLT5oX3NvdXJjZSwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7Ci0JCXJldHVybiAwOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBteXJpX2hlYWRlcl9jYWNoZShjb25zdCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IGhoX2NhY2hlICpoaCkKLXsKLQl1bnNpZ25lZCBzaG9ydCB0eXBlID0gaGgtPmhoX3R5cGU7Ci0JdW5zaWduZWQgY2hhciAqcGFkOwotCXN0cnVjdCBldGhoZHIgKmV0aDsKLQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKLQotCXBhZCA9ICgodW5zaWduZWQgY2hhciAqKSBoaC0+aGhfZGF0YSkgKwotCQlISF9EQVRBX09GRihzaXplb2YoKmV0aCkgKyBNWVJJX1BBRF9MRU4pOwotCWV0aCA9IChzdHJ1Y3QgZXRoaGRyICopIChwYWQgKyBNWVJJX1BBRF9MRU4pOwotCi0JaWYgKHR5cGUgPT0gaHRvbnMoRVRIX1BfODAyXzMpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBSZWZpbGwgTXlyaU5ldCBwYWRkaW5nIGlkZW50aWZpZXJzLCB0aGlzIGlzIGp1c3QgYmVpbmcgYW5hbC4gKi8KLQlwYWRbMF0gPSBNWVJJX1BBRF9MRU47Ci0JcGFkWzFdID0gMHhhYjsKLQotCWV0aC0+aF9wcm90byA9IHR5cGU7Ci0JbWVtY3B5KGV0aC0+aF9zb3VyY2UsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOwotCW1lbWNweShldGgtPmhfZGVzdCwgbmVpZ2gtPmhhLCBkZXYtPmFkZHJfbGVuKTsKLQloaC0+aGhfbGVuID0gMTY7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyogQ2FsbGVkIGJ5IEFkZHJlc3MgUmVzb2x1dGlvbiBtb2R1bGUgdG8gbm90aWZ5IGNoYW5nZXMgaW4gYWRkcmVzcy4gKi8KLXZvaWQgbXlyaV9oZWFkZXJfY2FjaGVfdXBkYXRlKHN0cnVjdCBoaF9jYWNoZSAqaGgsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqIGhhZGRyKQotewotCW1lbWNweSgoKHU4KiloaC0+aGhfZGF0YSkgKyBISF9EQVRBX09GRihzaXplb2Yoc3RydWN0IGV0aGhkcikpLAotCSAgICAgICBoYWRkciwgZGV2LT5hZGRyX2xlbik7Ci19Ci0KLXN0YXRpYyBpbnQgbXlyaV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQotewotCWlmICgobmV3X210dSA8IChFVEhfSExFTiArIE1ZUklfUEFEX0xFTikpIHx8IChuZXdfbXR1ID4gTVlSSU5FVF9NVFUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlkZXYtPm10dSA9IG5ld19tdHU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG15cmlfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCS8qIERvIG5vdGhpbmcsIGFsbCBNeXJpQ09NIG5vZGVzIHRyYW5zbWl0IG11bHRpY2FzdCBmcmFtZXMKLQkgKiBhcyBicm9hZGNhc3QgcGFja2V0cy4uLgotCSAqLwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JvYXJkaWRfZnJvbV9pZHByb20oc3RydWN0IG15cmlfZXRoICptcCwgaW50IG51bSkKLXsKLQltcC0+ZWVwcm9tLmlkWzBdID0gMDsKLQltcC0+ZWVwcm9tLmlkWzFdID0gaWRwcm9tLT5pZF9tYWNodHlwZTsKLQltcC0+ZWVwcm9tLmlkWzJdID0gKGlkcHJvbS0+aWRfc2VybnVtID4+IDE2KSAmIDB4ZmY7Ci0JbXAtPmVlcHJvbS5pZFszXSA9IChpZHByb20tPmlkX3Nlcm51bSA+PiA4KSAmIDB4ZmY7Ci0JbXAtPmVlcHJvbS5pZFs0XSA9IChpZHByb20tPmlkX3Nlcm51bSA+PiAwKSAmIDB4ZmY7Ci0JbXAtPmVlcHJvbS5pZFs1XSA9IG51bTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRldGVybWluZV9yZWdfc3BhY2Vfc2l6ZShzdHJ1Y3QgbXlyaV9ldGggKm1wKQotewotCXN3aXRjaChtcC0+ZWVwcm9tLmNwdXZlcnMpIHsKLQljYXNlIENQVVZFUlNfMl8zOgotCWNhc2UgQ1BVVkVSU18zXzA6Ci0JY2FzZSBDUFVWRVJTXzNfMToKLQljYXNlIENQVVZFUlNfM18yOgotCQltcC0+cmVnX3NpemUgPSAoMyAqIDEyOCAqIDEwMjQpICsgNDA5NjsKLQkJYnJlYWs7Ci0KLQljYXNlIENQVVZFUlNfNF8wOgotCWNhc2UgQ1BVVkVSU180XzE6Ci0JCW1wLT5yZWdfc2l6ZSA9ICgoNDA5Njw8MSkgKyBtcC0+ZWVwcm9tLnJhbXN6KTsKLQkJYnJlYWs7Ci0KLQljYXNlIENQVVZFUlNfNF8yOgotCWNhc2UgQ1BVVkVSU181XzA6Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKCJteXJpY29tOiBBSUVFRSB3ZWlyZCBjcHUgdmVyc2lvbiAlMDR4IGFzc3VtaW5nIHByZTQuMFxuIiwKLQkJICAgICAgIG1wLT5lZXByb20uY3B1dmVycyk7Ci0JCW1wLT5yZWdfc2l6ZSA9ICgzICogMTI4ICogMTAyNCkgKyA0MDk2OwotCX0KLX0KLQotI2lmZGVmIERFQlVHX0RFVEVDVAotc3RhdGljIHZvaWQgZHVtcF9lZXByb20oc3RydWN0IG15cmlfZXRoICptcCkKLXsKLQlwcmludGsoIkVFUFJPTTogY2xvY2t2YWxbJTA4eF0gY3B1dmVyc1slMDR4XSAiCi0JICAgICAgICJpZFslMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeF1cbiIsCi0JICAgICAgIG1wLT5lZXByb20uY3ZhbCwgbXAtPmVlcHJvbS5jcHV2ZXJzLAotCSAgICAgICBtcC0+ZWVwcm9tLmlkWzBdLCBtcC0+ZWVwcm9tLmlkWzFdLCBtcC0+ZWVwcm9tLmlkWzJdLAotCSAgICAgICBtcC0+ZWVwcm9tLmlkWzNdLCBtcC0+ZWVwcm9tLmlkWzRdLCBtcC0+ZWVwcm9tLmlkWzVdKTsKLQlwcmludGsoIkVFUFJPTTogcmFtc3pbJTA4eF1cbiIsIG1wLT5lZXByb20ucmFtc3opOwotCXByaW50aygiRUVQUk9NOiBmdmVyc1slMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMnhcbiIsCi0JICAgICAgIG1wLT5lZXByb20uZnZlcnNbMF0sIG1wLT5lZXByb20uZnZlcnNbMV0sIG1wLT5lZXByb20uZnZlcnNbMl0sCi0JICAgICAgIG1wLT5lZXByb20uZnZlcnNbM10sIG1wLT5lZXByb20uZnZlcnNbNF0sIG1wLT5lZXByb20uZnZlcnNbNV0sCi0JICAgICAgIG1wLT5lZXByb20uZnZlcnNbNl0sIG1wLT5lZXByb20uZnZlcnNbN10pOwotCXByaW50aygiRUVQUk9NOiAgICAgICAlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMnhcbiIsCi0JICAgICAgIG1wLT5lZXByb20uZnZlcnNbOF0sIG1wLT5lZXByb20uZnZlcnNbOV0sIG1wLT5lZXByb20uZnZlcnNbMTBdLAotCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzExXSwgbXAtPmVlcHJvbS5mdmVyc1sxMl0sIG1wLT5lZXByb20uZnZlcnNbMTNdLAotCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzE0XSwgbXAtPmVlcHJvbS5mdmVyc1sxNV0pOwotCXByaW50aygiRUVQUk9NOiAgICAgICAlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMnhcbiIsCi0JICAgICAgIG1wLT5lZXByb20uZnZlcnNbMTZdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzE3XSwgbXAtPmVlcHJvbS5mdmVyc1sxOF0sCi0JICAgICAgIG1wLT5lZXByb20uZnZlcnNbMTldLCBtcC0+ZWVwcm9tLmZ2ZXJzWzIwXSwgbXAtPmVlcHJvbS5mdmVyc1syMV0sCi0JICAgICAgIG1wLT5lZXByb20uZnZlcnNbMjJdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzIzXSk7Ci0JcHJpbnRrKCJFRVBST006ICAgICAgICUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeF1cbiIsCi0JICAgICAgIG1wLT5lZXByb20uZnZlcnNbMjRdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzI1XSwgbXAtPmVlcHJvbS5mdmVyc1syNl0sCi0JICAgICAgIG1wLT5lZXByb20uZnZlcnNbMjddLCBtcC0+ZWVwcm9tLmZ2ZXJzWzI4XSwgbXAtPmVlcHJvbS5mdmVyc1syOV0sCi0JICAgICAgIG1wLT5lZXByb20uZnZlcnNbMzBdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzMxXSk7Ci0JcHJpbnRrKCJFRVBST006IG12ZXJzWyUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeFxuIiwKLQkgICAgICAgbXAtPmVlcHJvbS5tdmVyc1swXSwgbXAtPmVlcHJvbS5tdmVyc1sxXSwgbXAtPmVlcHJvbS5tdmVyc1syXSwKLQkgICAgICAgbXAtPmVlcHJvbS5tdmVyc1szXSwgbXAtPmVlcHJvbS5tdmVyc1s0XSwgbXAtPmVlcHJvbS5tdmVyc1s1XSwKLQkgICAgICAgbXAtPmVlcHJvbS5tdmVyc1s2XSwgbXAtPmVlcHJvbS5tdmVyc1s3XSk7Ci0JcHJpbnRrKCJFRVBST006ICAgICAgICUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeF1cbiIsCi0JICAgICAgIG1wLT5lZXByb20ubXZlcnNbOF0sIG1wLT5lZXByb20ubXZlcnNbOV0sIG1wLT5lZXByb20ubXZlcnNbMTBdLAotCSAgICAgICBtcC0+ZWVwcm9tLm12ZXJzWzExXSwgbXAtPmVlcHJvbS5tdmVyc1sxMl0sIG1wLT5lZXByb20ubXZlcnNbMTNdLAotCSAgICAgICBtcC0+ZWVwcm9tLm12ZXJzWzE0XSwgbXAtPmVlcHJvbS5tdmVyc1sxNV0pOwotCXByaW50aygiRUVQUk9NOiBkbHZhbFslMDR4XSBicmRfdHlwZVslMDR4XSBidXNfdHlwZVslMDR4XSBwcm9kX2NvZGVbJTA0eF1cbiIsCi0JICAgICAgIG1wLT5lZXByb20uZGx2YWwsIG1wLT5lZXByb20uYnJkX3R5cGUsIG1wLT5lZXByb20uYnVzX3R5cGUsCi0JICAgICAgIG1wLT5lZXByb20ucHJvZF9jb2RlKTsKLQlwcmludGsoIkVFUFJPTTogc2VyaWFsX251bVslMDh4XVxuIiwgbXAtPmVlcHJvbS5zZXJpYWxfbnVtKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhlYWRlcl9vcHMgbXlyaV9oZWFkZXJfb3BzID0gewotCS5jcmVhdGUJCT0gbXlyaV9oZWFkZXIsCi0JLnJlYnVpbGQJPSBteXJpX3JlYnVpbGRfaGVhZGVyLAotCS5jYWNoZQkgCT0gbXlyaV9oZWFkZXJfY2FjaGUsCi0JLmNhY2hlX3VwZGF0ZQk9IG15cmlfaGVhZGVyX2NhY2hlX3VwZGF0ZSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbXlyaV9vcHMgPSB7Ci0JLm5kb19vcGVuCQk9IG15cmlfb3BlbiwKLQkubmRvX3N0b3AJCT0gbXlyaV9jbG9zZSwKLQkubmRvX3N0YXJ0X3htaXQJCT0gbXlyaV9zdGFydF94bWl0LAotCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gbXlyaV9zZXRfbXVsdGljYXN0LAotCS5uZG9fdHhfdGltZW91dAkJPSBteXJpX3R4X3RpbWVvdXQsCi0JLm5kb19jaGFuZ2VfbXR1CQk9IG15cmlfY2hhbmdlX210dSwKLQkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKLQkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IG15cmlfc2J1c19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb3AtPmRldi5vZl9ub2RlOwotCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbXlyaV9ldGggKm1wOwotCWNvbnN0IHZvaWQgKnByb3A7Ci0Jc3RhdGljIGludCBudW07Ci0JaW50IGksIGxlbjsKLQotCURFVCgoIm15cmlfZXRoZXJfaW5pdCglcCwlZCk6XG4iLCBvcCwgbnVtKSk7Ci0JZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBteXJpX2V0aCkpOwotCWlmICghZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQotCQlwcmludGsodmVyc2lvbik7Ci0KLQlTRVRfTkVUREVWX0RFVihkZXYsICZvcC0+ZGV2KTsKLQotCW1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzcGluX2xvY2tfaW5pdCgmbXAtPmlycV9sb2NrKTsKLQltcC0+bXlyaV9vcCA9IG9wOwotCi0JLyogQ2xlYW4gb3V0IHNrYiBhcnJheXMuICovCi0JZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUgKyAxKTsgaSsrKQotCQltcC0+cnhfc2tic1tpXSA9IE5VTEw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCi0JCW1wLT50eF9za2JzW2ldID0gTlVMTDsKLQotCS8qIEZpcnN0IGNoZWNrIGZvciBFRVBST00gaW5mb3JtYXRpb24uICovCi0JcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgIm15cmluZXQtZWVwcm9tLWluZm8iLCAmbGVuKTsKLQotCWlmIChwcm9wKQotCQltZW1jcHkoJm1wLT5lZXByb20sIHByb3AsIHNpemVvZihzdHJ1Y3QgbXlyaV9lZXByb20pKTsKLQlpZiAoIXByb3ApIHsKLQkJLyogTm8gZWVwcm9tIHByb3BlcnR5LCBtdXN0IGNvb2sgdXAgdGhlIHZhbHVlcyBvdXJzZWx2ZXMuICovCi0JCURFVCgoIk5vIEVFUFJPTTogIikpOwotCQltcC0+ZWVwcm9tLmJ1c190eXBlID0gQlVTX1RZUEVfU0JVUzsKLQkJbXAtPmVlcHJvbS5jcHV2ZXJzID0KLQkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImNwdV92ZXJzaW9uIiwgMCk7Ci0JCW1wLT5lZXByb20uY3ZhbCA9Ci0JCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJjbG9ja192YWx1ZSIsIDApOwotCQltcC0+ZWVwcm9tLnJhbXN6ID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAic3JhbV9zaXplIiwgMCk7Ci0JCWlmICghbXAtPmVlcHJvbS5jcHV2ZXJzKQotCQkJbXAtPmVlcHJvbS5jcHV2ZXJzID0gQ1BVVkVSU18yXzM7Ci0JCWlmIChtcC0+ZWVwcm9tLmNwdXZlcnMgPCBDUFVWRVJTXzNfMCkKLQkJCW1wLT5lZXByb20uY3ZhbCA9IDA7Ci0JCWlmICghbXAtPmVlcHJvbS5yYW1zeikKLQkJCW1wLT5lZXByb20ucmFtc3ogPSAoMTI4ICogMTAyNCk7Ci0KLQkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgIm15cmluZXQtYm9hcmQtaWQiLCAmbGVuKTsKLQkJaWYgKHByb3ApCi0JCQltZW1jcHkoJm1wLT5lZXByb20uaWRbMF0sIHByb3AsIDYpOwotCQllbHNlCi0JCQlzZXRfYm9hcmRpZF9mcm9tX2lkcHJvbShtcCwgbnVtKTsKLQotCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiZnBnYV92ZXJzaW9uIiwgJmxlbik7Ci0JCWlmIChwcm9wKQotCQkJbWVtY3B5KCZtcC0+ZWVwcm9tLmZ2ZXJzWzBdLCBwcm9wLCAzMik7Ci0JCWVsc2UKLQkJCW1lbXNldCgmbXAtPmVlcHJvbS5mdmVyc1swXSwgMCwgMzIpOwotCi0JCWlmIChtcC0+ZWVwcm9tLmNwdXZlcnMgPT0gQ1BVVkVSU180XzEpIHsKLQkJCWlmIChtcC0+ZWVwcm9tLnJhbXN6ID09ICgxMjggKiAxMDI0KSkKLQkJCQltcC0+ZWVwcm9tLnJhbXN6ID0gKDI1NiAqIDEwMjQpOwotCQkJaWYgKChtcC0+ZWVwcm9tLmN2YWwgPT0gMHg0MDQxNDA0MSkgfHwKLQkJCSAgICAobXAtPmVlcHJvbS5jdmFsID09IDB4OTA0NDkwNDQpKQotCQkJCW1wLT5lZXByb20uY3ZhbCA9IDB4NTBlNDUwZTQ7Ci0JCX0KLQl9Ci0jaWZkZWYgREVCVUdfREVURUNUCi0JZHVtcF9lZXByb20obXApOwotI2VuZGlmCi0KLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQlkZXYtPmRldl9hZGRyW2ldID0gbXAtPmVlcHJvbS5pZFtpXTsKLQotCWRldGVybWluZV9yZWdfc3BhY2Vfc2l6ZShtcCk7Ci0KLQkvKiBNYXAgaW4gdGhlIE15cmlDT00gcmVnaXN0ZXIvbG9jYWxyYW0gc2V0LiAqLwotCWlmIChtcC0+ZWVwcm9tLmNwdXZlcnMgPCBDUFVWRVJTXzRfMCkgewotCQkvKiBYWFggTWFrZXMgbm8gc2Vuc2UsIGlmIGNvbnRyb2wgcmVnIGlzIG5vbi1leGlzdGVudCB0aGlzCi0JCSAqIFhYWCBkcml2ZXIgY2Fubm90IGZ1bmN0aW9uIGF0IGFsbC4uLiBtYXliZSBwcmUtNC4wIGlzCi0JCSAqIFhYWCBvbmx5IGEgdmFsaWQgdmVyc2lvbiBmb3IgUENJIGNhcmRzPyAgQXNrIGZlbGR5Li4uCi0JCSAqLwotCQlERVQoKCJNYXBwaW5nIHJlZ3MgZm9yIGNwdXZlcnMgPCBDUFVWRVJTXzRfMFxuIikpOwotCQltcC0+cmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKLQkJCQkgICAgICBtcC0+cmVnX3NpemUsICJNeXJpQ09NIFJlZ3MiKTsKLQkJaWYgKCFtcC0+cmVncykgewotCQkJcHJpbnRrKCJNeXJpQ09NOiBDYW5ub3QgbWFwIE15cmlDT00gcmVnaXN0ZXJzLlxuIik7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQltcC0+bGFuYWkgPSBtcC0+cmVncyArICgyNTYgKiAxMDI0KTsKLQkJbXAtPmxyZWdzID0gbXAtPmxhbmFpICsgKDB4MTAwMDAgKiAyKTsKLQl9IGVsc2UgewotCQlERVQoKCJNYXBwaW5nIHJlZ3MgZm9yIGNwdXZlcnMgPj0gQ1BVVkVSU180XzBcbiIpKTsKLQkJbXAtPmNyZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLAotCQkJCSAgICAgICBQQUdFX1NJWkUsICJNeXJpQ09NIENvbnRyb2wgUmVncyIpOwotCQltcC0+bHJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sICgyNTYgKiAxMDI0KSwKLQkJCQkJIFBBR0VfU0laRSwgIk15cmlDT00gTEFOQUkgUmVncyIpOwotCQltcC0+bGFuYWkgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sICg1MTIgKiAxMDI0KSwKLQkJCQkgICAgICAgbXAtPmVlcHJvbS5yYW1zeiwgIk15cmlDT00gU1JBTSIpOwotCX0KLQlERVQoKCJSZWdpc3RlcnMgbWFwcGVkOiBjcmVnc1slcF0gbHJlZ3NbJXBdIGxhbmFpWyVwXVxuIiwKLQkgICAgIG1wLT5jcmVncywgbXAtPmxyZWdzLCBtcC0+bGFuYWkpKTsKLQotCWlmIChtcC0+ZWVwcm9tLmNwdXZlcnMgPj0gQ1BVVkVSU180XzApCi0JCW1wLT5zaG1lbV9iYXNlID0gMHhmMDAwOwotCWVsc2UKLQkJbXAtPnNobWVtX2Jhc2UgPSAweDgwMDA7Ci0KLQlERVQoKCJTaGFyZWQgbWVtb3J5IGJhc2UgaXMgJTA0eCwgIiwgbXAtPnNobWVtX2Jhc2UpKTsKLQotCW1wLT5zaG1lbSA9IChzdHJ1Y3QgbXlyaV9zaG1lbSBfX2lvbWVtICopCi0JCShtcC0+bGFuYWkgKyAobXAtPnNobWVtX2Jhc2UgKiAyKSk7Ci0JREVUKCgic2htZW0gbWFwcGVkIGF0ICVwXG4iLCBtcC0+c2htZW0pKTsKLQotCW1wLT5ycWFjawk9ICZtcC0+c2htZW0tPmNoYW5uZWwucmVjdnFhOwotCW1wLT5ycQkJPSAmbXAtPnNobWVtLT5jaGFubmVsLnJlY3ZxOwotCW1wLT5zcQkJPSAmbXAtPnNobWVtLT5jaGFubmVsLnNlbmRxOwotCi0JLyogUmVzZXQgdGhlIGJvYXJkLiAqLwotCURFVCgoIlJlc2V0dGluZyBMQU5BSVxuIikpOwotCW15cmlfcmVzZXRfb2ZmKG1wLT5scmVncywgbXAtPmNyZWdzKTsKLQlteXJpX3Jlc2V0X29uKG1wLT5jcmVncyk7Ci0KLQkvKiBUdXJuIElSUSdzIG9mZi4gKi8KLQlteXJpX2Rpc2FibGVfaXJxKG1wLT5scmVncywgbXAtPmNyZWdzKTsKLQotCS8qIFJlc2V0IG9uY2UgbW9yZS4gKi8KLQlteXJpX3Jlc2V0X29uKG1wLT5jcmVncyk7Ci0KLQkvKiBHZXQgdGhlIHN1cHBvcnRlZCBEVk1BIGJ1cnN0IHNpemVzIGZyb20gb3VyIFNCVVMuICovCi0JbXAtPm15cmlfYnVyc3RzID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLT5wYXJlbnQsCi0JCQkJCQkiYnVyc3Qtc2l6ZXMiLCAweDAwKTsKLQlpZiAoIXNidXNfY2FuX2J1cnN0NjQoKSkKLQkJbXAtPm15cmlfYnVyc3RzICY9IH4oRE1BX0JVUlNUNjQpOwotCi0JREVUKCgiTVlSSSBidXJzdHMgJTAyeFxuIiwgbXAtPm15cmlfYnVyc3RzKSk7Ci0KLQkvKiBFbmNvZGUgU0JVUyBpbnRlcnJ1cHQgbGV2ZWwgaW4gc2Vjb25kIGNvbnRyb2wgcmVnaXN0ZXIuICovCi0JaSA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImludGVycnVwdHMiLCAwKTsKLQlpZiAoaSA9PSAwKQotCQlpID0gNDsKLQlERVQoKCJwcm9tX2dldGludChpbnRlcnJ1cHRzKT09JWQsIGlycWx2bCBzZXQgdG8gJTA0eFxuIiwKLQkgICAgIGksICgxIDw8IGkpKSk7Ci0KLQlzYnVzX3dyaXRlbCgoMSA8PCBpKSwgbXAtPmNyZWdzICsgTVlSSUNUUkxfSVJRTFZMKTsKLQotCW1wLT5kZXYgPSBkZXY7Ci0JZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7Ci0JZGV2LT5pcnEgPSBvcC0+YXJjaGRhdGEuaXJxc1swXTsKLQlkZXYtPm5ldGRldl9vcHMgPSAmbXlyaV9vcHM7Ci0KLQkvKiBSZWdpc3RlciBpbnRlcnJ1cHQgaGFuZGxlciBub3cuICovCi0JREVUKCgiUmVxdWVzdGluZyBNWVJJY29tIElSUSBsaW5lLlxuIikpOwotCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgbXlyaV9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCwgIk15cmlDT00gRXRoZXJuZXQiLCAodm9pZCAqKSBkZXYpKSB7Ci0JCXByaW50aygiTXlyaUNPTTogQ2Fubm90IHJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyLlxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWRldi0+bXR1CQk9IE1ZUklORVRfTVRVOwotCWRldi0+aGVhZGVyX29wcwkJPSAmbXlyaV9oZWFkZXJfb3BzOwotCi0JZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSAoRVRIX0hMRU4gKyBNWVJJX1BBRF9MRU4pOwotCi0JLyogTG9hZCBjb2RlIG9udG8gdGhlIExBTmFpLiAqLwotCURFVCgoIkxvYWRpbmcgTEFOQUkgZmlybXdhcmVcbiIpKTsKLQlpZiAobXlyaV9sb2FkX2xhbmFpKG1wKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk15cmlDT006IENhbm5vdCBMb2FkIExBTkFJIGZpcm13YXJlLlxuIik7Ci0JCWdvdG8gZXJyX2ZyZWVfaXJxOwotCX0KLQotCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgewotCQlwcmludGsoIk15cmlDT006IENhbm5vdCByZWdpc3RlciBkZXZpY2UuXG4iKTsKLQkJZ290byBlcnJfZnJlZV9pcnE7Ci0JfQotCi0JZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBtcCk7Ci0KLQludW0rKzsKLQotCXByaW50aygiJXM6IE15cmlDT00gTXlyaU5FVCBFdGhlcm5ldCAlcE1cbiIsCi0JICAgICAgIGRldi0+bmFtZSwgZGV2LT5kZXZfYWRkcik7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2ZyZWVfaXJxOgotCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotZXJyOgotCS8qIFRoaXMgd2lsbCBhbHNvIGZyZWUgdGhlIGNvLWFsbG9jYXRlZCBwcml2YXRlIGRhdGEqLwotCWZyZWVfbmV0ZGV2KGRldik7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IG15cmlfc2J1c19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApCi17Ci0Jc3RydWN0IG15cmlfZXRoICptcCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBtcC0+ZGV2OwotCi0JdW5yZWdpc3Rlcl9uZXRkZXYobmV0X2Rldik7Ci0KLQlmcmVlX2lycShuZXRfZGV2LT5pcnEsIG5ldF9kZXYpOwotCi0JaWYgKG1wLT5lZXByb20uY3B1dmVycyA8IENQVVZFUlNfNF8wKSB7Ci0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgbXAtPnJlZ3MsIG1wLT5yZWdfc2l6ZSk7Ci0JfSBlbHNlIHsKLQkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBtcC0+Y3JlZ3MsIFBBR0VfU0laRSk7Ci0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgbXAtPmxyZWdzLCAoMjU2ICogMTAyNCkpOwotCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIG1wLT5sYW5haSwgKDUxMiAqIDEwMjQpKTsKLQl9Ci0KLQlmcmVlX25ldGRldihuZXRfZGV2KTsKLQotCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXlyaV9zYnVzX21hdGNoW10gPSB7Ci0JewotCQkubmFtZSA9ICJNWVJJQ09NLG1sYW5haSIsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIm15cmkiLAotCX0sCi0Je30sCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBteXJpX3NidXNfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBteXJpX3NidXNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm15cmkiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXlyaV9zYnVzX21hdGNoLAotCX0sCi0JLnByb2JlCQk9IG15cmlfc2J1c19wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG15cmlfc2J1c19yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXlyaV9zYnVzX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZteXJpX3NidXNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG15cmlfc2J1c19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm15cmlfc2J1c19kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChteXJpX3NidXNfaW5pdCk7Ci1tb2R1bGVfZXhpdChteXJpX3NidXNfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9GSVJNV0FSRShGV05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmggYi9kcml2ZXJzL25ldC9teXJpX3NidXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhMmZhNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9teXJpX3NidXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKiBteXJpX3NidXMuaDogRGVmaW5lcyBmb3IgTXlyaUNPTSBNeXJpTkVUIFNCVVMgY2FyZCBkcml2ZXIuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSAqLwotCi0jaWZuZGVmIF9NWVJJX1NCVVNfSAotI2RlZmluZSBfTVlSSV9TQlVTX0gKLQotLyogTEFOQUkgUmVnaXN0ZXJzICovCi0jZGVmaW5lIExBTkFJX0lQRjAJMHgwMFVMCQkvKiBDb250ZXh0IHplcm8gc3RhdGUgcmVnaXN0ZXJzLiovCi0jZGVmaW5lIExBTkFJX0NVUjAJMHgwNFVMCi0jZGVmaW5lIExBTkFJX1BSRVYwCTB4MDhVTAotI2RlZmluZSBMQU5BSV9EQVRBMAkweDBjVUwKLSNkZWZpbmUgTEFOQUlfRFBGMAkweDEwVUwKLSNkZWZpbmUgTEFOQUlfSVBGMQkweDE0VUwJCS8qIENvbnRleHQgb25lIHN0YXRlIHJlZ2lzdGVycy4JKi8KLSNkZWZpbmUgTEFOQUlfQ1VSMQkweDE4VUwKLSNkZWZpbmUgTEFOQUlfUFJFVjEJMHgxY1VMCi0jZGVmaW5lIExBTkFJX0RBVEExCTB4MjBVTAotI2RlZmluZSBMQU5BSV9EUEYxCTB4MjRVTAotI2RlZmluZSBMQU5BSV9JU1RBVAkweDI4VUwJCS8qIEludGVycnVwdCBzdGF0dXMuCQkqLwotI2RlZmluZSBMQU5BSV9FSU1BU0sJMHgyY1VMCQkvKiBFeHRlcm5hbCBJUlEgbWFzay4JCSovCi0jZGVmaW5lIExBTkFJX0lUSU1FUgkweDMwVUwJCS8qIElSUSB0aW1lci4JCQkqLwotI2RlZmluZSBMQU5BSV9SVEMJMHgzNFVMCQkvKiBSZWFsIFRpbWUgQ2xvY2sJCSovCi0jZGVmaW5lIExBTkFJX0NTVU0JMHgzOFVMCQkvKiBDaGVja3N1bS4JCQkqLwotI2RlZmluZSBMQU5BSV9ETUFYQUREUgkweDNjVUwJCS8qIFNCVVMgRE1BIGV4dGVybmFsIGFkZHJlc3MuCSovCi0jZGVmaW5lIExBTkFJX0RNQUxBRERSCTB4NDBVTAkJLyogU0JVUyBETUEgbG9jYWwgYWRkcmVzcy4JKi8KLSNkZWZpbmUgTEFOQUlfRE1BQ1RSCTB4NDRVTAkJLyogU0JVUyBETUEgY291bnRlci4JCSovCi0jZGVmaW5lIExBTkFJX1JYRE1BUFRSCTB4NDhVTAkJLyogUmVjZWl2ZSBETUEgcG9pbnRlci4JCSovCi0jZGVmaW5lIExBTkFJX1JYRE1BTElNCTB4NGNVTAkJLyogUmVjZWl2ZSBETUEgbGltaXQuCQkqLwotI2RlZmluZSBMQU5BSV9UWERNQVBUUgkweDUwVUwJCS8qIFRyYW5zbWl0IERNQSBwb2ludGVyLgkqLwotI2RlZmluZSBMQU5BSV9UWERNQUxJTQkweDU0VUwJCS8qIFRyYW5zbWl0IERNQSBsaW1pdC4JCSovCi0jZGVmaW5lIExBTkFJX1RYRE1BTElNVAkweDU4VUwJCS8qIFRyYW5zbWl0IERNQSBsaW1pdCB3L3RhaWwuCSovCi0JLyogMHg1Y1VMLCByZXNlcnZlZCAqLwotI2RlZmluZSBMQU5BSV9SQllURQkweDYwVUwJCS8qIFJlY2VpdmUgYnl0ZS4JCSovCi0JLyogMHg2NC0tPjB4NmMsIHJlc2VydmVkICovCi0jZGVmaW5lIExBTkFJX1JIQUxGCTB4NzBVTAkJLyogUmVjZWl2ZSBoYWxmLXdvcmQuCQkqLwotCS8qIDB4NzJVTCwgcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgTEFOQUlfUldPUkQJMHg3NFVMCQkvKiBSZWNlaXZlIHdvcmQuCQkqLwotI2RlZmluZSBMQU5BSV9TQUxJR04JMHg3OFVMCQkvKiBTZW5kIGFsaWduLgkJCSovCi0jZGVmaW5lIExBTkFJX1NCWVRFCTB4N2NVTAkJLyogU2luZ2xlU2VuZCBzZW5kLWJ5dGUuCSovCi0jZGVmaW5lIExBTkFJX1NIQUxGCTB4ODBVTAkJLyogU2luZ2xlU2VuZCBzZW5kLWhhbGZ3b3JkLgkqLwotI2RlZmluZSBMQU5BSV9TV09SRAkweDg0VUwJCS8qIFNpbmdsZVNlbmQgc2VuZC13b3JkLgkqLwotI2RlZmluZSBMQU5BSV9TU0VORFQJMHg4OFVMCQkvKiBTaW5nbGVTZW5kIHNwZWNpYWwuCQkqLwotI2RlZmluZSBMQU5BSV9ETUFESVIJMHg4Y1VMCQkvKiBETUEgZGlyZWN0aW9uLgkJKi8KLSNkZWZpbmUgTEFOQUlfRE1BU1RBVAkweDkwVUwJCS8qIERNQSBzdGF0dXMuCQkJKi8KLSNkZWZpbmUgTEFOQUlfVElNRU8JMHg5NFVMCQkvKiBUaW1lb3V0IHJlZ2lzdGVyLgkJKi8KLSNkZWZpbmUgTEFOQUlfTVlSSU5FVAkweDk4VUwJCS8qIFhYWCBNQUdJQyBteXJpY29tIHRoaW5nCSovCi0jZGVmaW5lIExBTkFJX0hXREVCVUcJMHg5Y1VMCQkvKiBIYXJkd2FyZSBkZWJ1Z2dpbmcgcmVnLgkqLwotI2RlZmluZSBMQU5BSV9MRURTCTB4YTBVTAkJLyogTEVEIGNvbnRyb2wuCQkJKi8KLSNkZWZpbmUgTEFOQUlfVkVSUwkweGE0VUwJCS8qIFZlcnNpb24gcmVnaXN0ZXIuCQkqLwotI2RlZmluZSBMQU5BSV9MSU5LT04JMHhhOFVMCQkvKiBMaW5rIGFjdGl2YXRpb24gcmVnLgkJKi8KLQkvKiAweGFjLS0+MHgxMDQsIHJlc2VydmVkICovCi0jZGVmaW5lIExBTkFJX0NWQUwJMHgxMDhVTAkJLyogQ2xvY2sgdmFsdWUgcmVnaXN0ZXIuCSovCi0jZGVmaW5lIExBTkFJX1JFR19TSVpFCTB4MTBjVUwKLQotLyogSW50ZXJydXB0IHN0YXR1cyBiaXRzLiAqLwotI2RlZmluZSBJU1RBVF9ERUJVRwkweDgwMDAwMDAwCi0jZGVmaW5lIElTVEFUX0hPU1QJMHg0MDAwMDAwMAotI2RlZmluZSBJU1RBVF9MQU43CTB4MDA4MDAwMDAKLSNkZWZpbmUgSVNUQVRfTEFONgkweDAwNDAwMDAwCi0jZGVmaW5lIElTVEFUX0xBTjUJMHgwMDIwMDAwMAotI2RlZmluZSBJU1RBVF9MQU40CTB4MDAxMDAwMDAKLSNkZWZpbmUgSVNUQVRfTEFOMwkweDAwMDgwMDAwCi0jZGVmaW5lIElTVEFUX0xBTjIJMHgwMDA0MDAwMAotI2RlZmluZSBJU1RBVF9MQU4xCTB4MDAwMjAwMDAKLSNkZWZpbmUgSVNUQVRfTEFOMAkweDAwMDEwMDAwCi0jZGVmaW5lIElTVEFUX1dSRFkJMHgwMDAwODAwMAotI2RlZmluZSBJU1RBVF9IUkRZCTB4MDAwMDQwMDAKLSNkZWZpbmUgSVNUQVRfU1JEWQkweDAwMDAyMDAwCi0jZGVmaW5lIElTVEFUX0xJTksJMHgwMDAwMTAwMAotI2RlZmluZSBJU1RBVF9GUkVTCTB4MDAwMDA4MDAKLSNkZWZpbmUgSVNUQVRfTlJFUwkweDAwMDAwODAwCi0jZGVmaW5lIElTVEFUX1dBS0UJMHgwMDAwMDQwMAotI2RlZmluZSBJU1RBVF9PQjIJMHgwMDAwMDIwMAotI2RlZmluZSBJU1RBVF9PQjEJMHgwMDAwMDEwMAotI2RlZmluZSBJU1RBVF9UQUlMCTB4MDAwMDAwODAKLSNkZWZpbmUgSVNUQVRfV0RPRwkweDAwMDAwMDQwCi0jZGVmaW5lIElTVEFUX1RJTUUJMHgwMDAwMDAyMAotI2RlZmluZSBJU1RBVF9ETUEJMHgwMDAwMDAxMAotI2RlZmluZSBJU1RBVF9TRU5ECTB4MDAwMDAwMDgKLSNkZWZpbmUgSVNUQVRfQlVGCTB4MDAwMDAwMDQKLSNkZWZpbmUgSVNUQVRfUkVDVgkweDAwMDAwMDAyCi0jZGVmaW5lIElTVEFUX0JSRFkJMHgwMDAwMDAwMQotCi0vKiBNWVJJIFJlZ2lzdGVycyAqLwotI2RlZmluZSBNWVJJX1JFU0VUT0ZGCTB4MDBVTAotI2RlZmluZSBNWVJJX1JFU0VUT04JMHgwNFVMCi0jZGVmaW5lIE1ZUklfSVJRT0ZGCTB4MDhVTAotI2RlZmluZSBNWVJJX0lSUU9OCTB4MGNVTAotI2RlZmluZSBNWVJJX1dBS0VVUE9GRgkweDEwVUwKLSNkZWZpbmUgTVlSSV9XQUtFVVBPTgkweDE0VUwKLSNkZWZpbmUgTVlSSV9JUlFSRUFECTB4MThVTAotCS8qIDB4MWMtLT4weDNmZmMsIHJlc2VydmVkICovCi0jZGVmaW5lIE1ZUklfTE9DQUxNRU0JMHg0MDAwVUwKLSNkZWZpbmUgTVlSSV9SRUdfU0laRQkweDI1MDAwVUwKLQotLyogU2hhcmVkIG1lbW9yeSBpbnRlcnJ1cHQgbWFzay4gKi8KLSNkZWZpbmUgU0hNRU1fSU1BU0tfUlgJCTB4MDAwMDAwMDIKLSNkZWZpbmUgU0hNRU1fSU1BU0tfVFgJCTB4MDAwMDAwMDEKLQotLyogSnVzdCB0byBtYWtlIHRoaW5ncyByZWFkYWJsZS4gKi8KLSNkZWZpbmUgS0VSTkVMX0NIQU5ORUwJCTAKLQotLyogVGhlIHNpemUgb2YgdGhpcyBtdXN0IGJlID49IDEyOSBieXRlcy4gKi8KLXN0cnVjdCBteXJpX2VlcHJvbSB7Ci0JdW5zaWduZWQgaW50CQljdmFsOwotCXVuc2lnbmVkIHNob3J0CQljcHV2ZXJzOwotCXVuc2lnbmVkIGNoYXIJCWlkWzZdOwotCXVuc2lnbmVkIGludAkJcmFtc3o7Ci0JdW5zaWduZWQgY2hhcgkJZnZlcnNbMzJdOwotCXVuc2lnbmVkIGNoYXIJCW12ZXJzWzE2XTsKLQl1bnNpZ25lZCBzaG9ydAkJZGx2YWw7Ci0JdW5zaWduZWQgc2hvcnQJCWJyZF90eXBlOwotCXVuc2lnbmVkIHNob3J0CQlidXNfdHlwZTsKLQl1bnNpZ25lZCBzaG9ydAkJcHJvZF9jb2RlOwotCXVuc2lnbmVkIGludAkJc2VyaWFsX251bTsKLQl1bnNpZ25lZCBzaG9ydAkJX3Jlc2VydmVkWzI0XTsKLQl1bnNpZ25lZCBpbnQJCV91bnVzZWRbMl07Ci19OwotCi0vKiBFRVBST00gYnVzIHR5cGVzLCBvbmx5IFNCVVMgaXMgdmFsaWQgaW4gdGhpcyBkcml2ZXIuICovCi0jZGVmaW5lIEJVU19UWVBFX1NCVVMJCTEKLQotLyogRUVQUk9NIENQVSByZXZpc2lvbnMuICovCi0jZGVmaW5lIENQVVZFUlNfMl8zCQkweDAyMDMKLSNkZWZpbmUgQ1BVVkVSU18zXzAJCTB4MDMwMAotI2RlZmluZSBDUFVWRVJTXzNfMQkJMHgwMzAxCi0jZGVmaW5lIENQVVZFUlNfM18yCQkweDAzMDIKLSNkZWZpbmUgQ1BVVkVSU180XzAJCTB4MDQwMAotI2RlZmluZSBDUFVWRVJTXzRfMQkJMHgwNDAxCi0jZGVmaW5lIENQVVZFUlNfNF8yCQkweDA0MDIKLSNkZWZpbmUgQ1BVVkVSU181XzAJCTB4MDUwMAotCi0vKiBNWVJJIENvbnRyb2wgUmVnaXN0ZXJzICovCi0jZGVmaW5lIE1ZUklDVFJMX0NUUkwJCTB4MDBVTAotI2RlZmluZSBNWVJJQ1RSTF9JUlFMVkwJCTB4MDJVTAotI2RlZmluZSBNWVJJQ1RSTF9SRUdfU0laRQkweDA0VUwKLQotLyogR2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXIgZGVmaW5lcy4gKi8KLSNkZWZpbmUgQ09OVFJPTF9ST0ZGCQkweDgwMDAJLyogUmVzZXQgT0ZGLgkJKi8KLSNkZWZpbmUgQ09OVFJPTF9ST04JCTB4NDAwMAkvKiBSZXNldCBPTi4JCSovCi0jZGVmaW5lIENPTlRST0xfRUlSUQkJMHgyMDAwCS8qIEVuYWJsZSBJUlEncy4JKi8KLSNkZWZpbmUgQ09OVFJPTF9ESVJRCQkweDEwMDAJLyogRGlzYWJsZSBJUlEncy4JKi8KLSNkZWZpbmUgQ09OVFJPTF9XT04JCTB4MDgwMAkvKiBXYWtlLXVwIE9OLgkJKi8KLQotI2RlZmluZSBNWVJJX1NDQVRURVJfRU5UUklFUwk4Ci0jZGVmaW5lIE1ZUklfR0FUSEVSX0VOVFJJRVMJMTYKLQotc3RydWN0IG15cmlfc2dsaXN0IHsKLQl1MzIgYWRkcjsKLQl1MzIgbGVuOwotfTsKLQotc3RydWN0IG15cmlfcnhkIHsKLQlzdHJ1Y3QgbXlyaV9zZ2xpc3QgbXlyaV9zY2F0dGVyc1tNWVJJX1NDQVRURVJfRU5UUklFU107CS8qIERNQSBzY2F0dGVyIGxpc3QuKi8KLQl1MzIgY3N1bTsJLyogSFcgY29tcHV0ZWQgY2hlY2tzdW0uICAgICovCi0JdTMyIGN0eDsKLQl1MzIgbnVtX3NnOwkvKiBUb3RhbCBzY2F0dGVyIGVudHJpZXMuICAgKi8KLX07Ci0KLXN0cnVjdCBteXJpX3R4ZCB7Ci0Jc3RydWN0IG15cmlfc2dsaXN0IG15cmlfZ2F0aGVyc1tNWVJJX0dBVEhFUl9FTlRSSUVTXTsgLyogRE1BIHNjYXR0ZXIgbGlzdC4gICovCi0JdTMyIG51bV9zZzsJLyogVG90YWwgc2NhdHRlciBlbnRyaWVzLiAgICovCi0JdTE2IGFkZHJbNF07CS8qIFhYWCBhZGRyZXNzICAgICAgICAgICAgICAqLwotCXUzMiBjaGFuOwotCXUzMiBsZW47CS8qIFRvdGFsIGxlbmd0aCBvZiBwYWNrZXQuICAqLwotCXUzMiBjc3VtX29mZjsJLyogV2hlcmUgZGF0YSB0byBjc3VtIGlzLiAgICovCi0JdTMyIGNzdW1fZmllbGQ7CS8qIFdoZXJlIGNzdW0gZ29lcyBpbiBwa3QuICAqLwotfTsKLQotI2RlZmluZSBNWVJJTkVUX01UVSAgICAgICAgODQzMgotI2RlZmluZSBSWF9BTExPQ19TSVpFICAgICAgODQ0OAotI2RlZmluZSBNWVJJX1BBRF9MRU4gICAgICAgMgotI2RlZmluZSBSWF9DT1BZX1RIUkVTSE9MRCAgMjU2Ci0KLS8qIFRoZXNlIG51bWJlcnMgYXJlIGNhc3QgaW4gc3RvbmUsIG5ldyBmaXJtd2FyZSBpcyBuZWVkZWQgaWYKLSAqIHlvdSB3YW50IHRvIGNoYW5nZSB0aGVtLgotICovCi0jZGVmaW5lIFRYX1JJTkdfTUFYU0laRSAgICAxNgotI2RlZmluZSBSWF9SSU5HX01BWFNJWkUgICAgMTYKLQotI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgMTYKLSNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgIDE2Ci0KLS8qIEdSUlIuLi4gKi8KLXN0YXRpYyBfX2lubGluZV9fIGludCBORVhUX1JYKGludCBudW0pCi17Ci0JLyogWFhYID49Pz8/ICovCi0JaWYoKytudW0gPiBSWF9SSU5HX1NJWkUpCi0JCW51bSA9IDA7Ci0JcmV0dXJuIG51bTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IFBSRVZfUlgoaW50IG51bSkKLXsKLQlpZigtLW51bSA8IDApCi0JCW51bSA9IFJYX1JJTkdfU0laRTsKLQlyZXR1cm4gbnVtOwotfQotCi0jZGVmaW5lIE5FWFRfVFgobnVtKQkoKChudW0pICsgMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCi0jZGVmaW5lIFBSRVZfVFgobnVtKQkoKChudW0pIC0gMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCi0KLSNkZWZpbmUgVFhfQlVGRlNfQVZBSUwoaGVhZCwgdGFpbCkJCVwKLQkoKGhlYWQpIDw9ICh0YWlsKSA/CQkJXAotCSAoaGVhZCkgKyAoVFhfUklOR19TSVpFIC0gMSkgLSAodGFpbCkgOglcCi0JIChoZWFkKSAtICh0YWlsKSAtIDEpCi0KLXN0cnVjdCBzZW5kcSB7Ci0JdTMyCXRhaWw7Ci0JdTMyCWhlYWQ7Ci0JdTMyCWhkZWJ1ZzsKLQl1MzIJbWRlYnVnOwotCXN0cnVjdCBteXJpX3R4ZAlteXJpX3R4ZFtUWF9SSU5HX01BWFNJWkVdOwotfTsKLQotc3RydWN0IHJlY3ZxIHsKLQl1MzIJaGVhZDsKLQl1MzIJdGFpbDsKLQl1MzIJaGRlYnVnOwotCXUzMgltZGVidWc7Ci0Jc3RydWN0IG15cmlfcnhkCW15cmlfcnhkW1JYX1JJTkdfTUFYU0laRSArIDFdOwotfTsKLQotI2RlZmluZSBNWVJJX01MSVNUX1NJWkUgOAotCi1zdHJ1Y3QgbWNsaXN0IHsKLQl1MzIgbWF4bGVuOwotCXUzMiBsZW47Ci0JdTMyIGNhY2hlOwotCXN0cnVjdCBwYWlyIHsKLQkJdTggYWRkcls4XTsKLQkJdTMyIHZhbDsKLQl9IG1jX3BhaXJzW01ZUklfTUxJU1RfU0laRV07Ci0JdTggYmNhc3RfYWRkcls4XTsKLX07Ci0KLXN0cnVjdCBteXJpX2NoYW5uZWwgewotCXUzMgkJc3RhdGU7CQkvKiBTdGF0ZSBvZiB0aGUgY2hhbm5lbC4JKi8KLQl1MzIJCWJ1c3k7CQkvKiBDaGFubmVsIGlzIGJ1c3kuCQkqLwotCXN0cnVjdCBzZW5kcQlzZW5kcTsJCS8qIERldmljZSB0eCBxdWV1ZS4JCSovCi0Jc3RydWN0IHJlY3ZxCXJlY3ZxOwkJLyogRGV2aWNlIHJ4IHF1ZXVlLgkJKi8KLQlzdHJ1Y3QgcmVjdnEJcmVjdnFhOwkJLyogRGV2aWNlIHJ4IHF1ZXVlIGFja2VkLgkqLwotCXUzMgkJcmJ5dGVzOwkJLyogUmVjZWl2ZSBieXRlcy4JCSovCi0JdTMyCQlzYnl0ZXM7CQkvKiBTZW5kIGJ5dGVzLgkJCSovCi0JdTMyCQlybXNnczsJCS8qIFJlY2VpdmUgbWVzc2FnZXMuCQkqLwotCXUzMgkJc21zZ3M7CQkvKiBTZW5kIG1lc3NhZ2VzLgkJKi8KLQlzdHJ1Y3QgbWNsaXN0CW1jbGlzdDsJCS8qIERldmljZSBtdWx0aWNhc3QgbGlzdC4JKi8KLX07Ci0KLS8qIFZhbHVlcyBmb3IgcGVyLWNoYW5uZWwgc3RhdGUuICovCi0jZGVmaW5lIFNUQVRFX1dGSAkwCQkvKiBXYWl0aW5nIGZvciBIT1NULgkJKi8KLSNkZWZpbmUgU1RBVEVfV0ZOCTEJCS8qIFdhaXRpbmcgZm9yIE5FVC4JCSovCi0jZGVmaW5lIFNUQVRFX1JFQURZCTIJCS8qIFJlYWR5LgkJCSovCi0KLXN0cnVjdCBteXJpX3NobWVtIHsKLQl1OAlhZGRyWzhdOwkJLyogQm9hcmQncyBhZGRyZXNzLgkJKi8KLQl1MzIJbmNoYW47CQkJLyogTnVtYmVyIG9mIGNoYW5uZWxzLgkJKi8KLQl1MzIJYnVyc3Q7CQkJLyogU0JVUyBkbWEgYnVyc3QgZW5hYmxlLgkqLwotCXUzMglzaGFrZWRvd247CQkvKiBEYXJra2trU3RhcnJyIENyYXNoZXNzcy4uLgkqLwotCXUzMglzZW5kOwkJCS8qIFNlbmQgd2FudGVkLgkJCSovCi0JdTMyCWltYXNrOwkJCS8qIEludGVycnVwdCBlbmFibGUgbWFzay4JKi8KLQl1MzIJbWxldmVsOwkJCS8qIE1hcCBsZXZlbC4JCQkqLwotCXUzMglkZWJ1Z1s0XTsJCS8qIE1pc2MuIGRlYnVnIGFyZWFzLgkJKi8KLQlzdHJ1Y3QgbXlyaV9jaGFubmVsIGNoYW5uZWw7CS8qIE9ubHkgb25lIGNoYW5uZWwgb24gYSBob3N0LgkqLwotfTsKLQotc3RydWN0IG15cmlfZXRoIHsKLQkvKiBUaGVzZSBhcmUgZnJlcXVlbnRseSBhY2Nlc3NlZCwga2VlcCB0b2dldGhlcgotCSAqIHRvIG9idGFpbiBnb29kIGNhY2hlIGhpdCByYXRlcy4KLQkgKi8KLQlzcGlubG9ja190CQkJaXJxX2xvY2s7Ci0Jc3RydWN0IG15cmlfc2htZW0gX19pb21lbQkqc2htZW07CQkvKiBTaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzLiAgICAqLwotCXZvaWQgX19pb21lbQkJCSpjcmVnczsJCS8qIENvbnRyb2wgcmVnaXN0ZXIgc3BhY2UuICAgICovCi0Jc3RydWN0IHJlY3ZxIF9faW9tZW0JCSpycWFjazsJCS8qIFdoZXJlIHdlIGFjayByeCdzLiAgICAgICAgICovCi0Jc3RydWN0IHJlY3ZxIF9faW9tZW0JCSpycTsJCS8qIFdoZXJlIHdlIHB1dCBidWZmZXJzLiAgICAgICovCi0Jc3RydWN0IHNlbmRxIF9faW9tZW0JCSpzcTsJCS8qIFdoZXJlIHdlIHN0dWZmIHR4J3MuICAgICAgICovCi0Jc3RydWN0IG5ldF9kZXZpY2UJCSpkZXY7CQkvKiBMaW51eC9ORVQgZGV2IHN0cnVjdC4gICAgICAqLwotCWludAkJCQl0eF9vbGQ7CQkvKiBUbyBzcGVlZCB1cCB0eCBjbGVhbmluZy4gICAqLwotCXZvaWQgX19pb21lbQkJCSpscmVnczsJCS8qIFF1aWNrIHB0ciB0byBMQU5BSSByZWdzLiAgICovCi0Jc3RydWN0IHNrX2J1ZmYJICAgICAgICpyeF9za2JzW1JYX1JJTkdfU0laRSsxXTsvKiBSWCBza2IncyAgICAgICAgICAgICAgICAgICAqLwotCXN0cnVjdCBza19idWZmCSAgICAgICAqdHhfc2tic1tUWF9SSU5HX1NJWkVdOyAgLyogVFggc2tiJ3MgICAgICAgICAgICAgICAgICAgKi8KLQotCS8qIFRoZXNlIGFyZSBsZXNzIGZyZXF1ZW50bHkgYWNjZXNzZWQuICovCi0Jdm9pZCBfX2lvbWVtCQkJKnJlZ3M7ICAgICAgICAgIC8qIE15cmlDT00gcmVnaXN0ZXIgc3BhY2UuICAgICovCi0Jdm9pZCBfX2lvbWVtCQkJKmxhbmFpOwkJLyogVmlldyAyIG9mIHJlZ2lzdGVyIHNwYWNlLiAgKi8KLQl1bnNpZ25lZCBpbnQJCQlteXJpX2J1cnN0czsJLyogU0JVUyBidXJzdHMuICAgICAgICAgICAgICAgKi8KLQlzdHJ1Y3QgbXlyaV9lZXByb20JCWVlcHJvbTsJCS8qIExvY2FsIGNvcHkgb2YgRUVQUk9NLiAgICAgICovCi0JdW5zaWduZWQgaW50CQkJcmVnX3NpemU7CS8qIFNpemUgb2YgcmVnaXN0ZXIgc3BhY2UuICAgICovCi0JdW5zaWduZWQgaW50CQkJc2htZW1fYmFzZTsJLyogT2Zmc2V0IHRvIHNoYXJlZCByYW0uICAgICAgKi8KLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQkqbXlyaV9vcDsJLyogT3VyIE9GIGRldmljZSBzdHJ1Y3QuICAgICovCi19OwotCi0vKiBXZSB1c2UgdGhpcyB0byBhY3F1aXJlIHJlY2VpdmUgc2tiJ3MgdGhhdCB3ZSBjYW4gRE1BIGRpcmVjdGx5IGludG8uICovCi0jZGVmaW5lIEFMSUdORURfUlhfU0tCX0FERFIoYWRkcikgXAotICAgICAgICAoKCgodW5zaWduZWQgbG9uZykoYWRkcikgKyAoNjQgLSAxKSkgJiB+KDY0IC0gMSkpIC0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqbXlyaV9hbGxvY19za2IodW5zaWduZWQgaW50IGxlbmd0aCwgZ2ZwX3QgZ2ZwX2ZsYWdzKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlza2IgPSBhbGxvY19za2IobGVuZ3RoICsgNjQsIGdmcF9mbGFncyk7Ci0JaWYoc2tiKSB7Ci0JCWludCBvZmZzZXQgPSBBTElHTkVEX1JYX1NLQl9BRERSKHNrYi0+ZGF0YSk7Ci0KLQkJaWYob2Zmc2V0KQotCQkJc2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpOwotCX0KLQlyZXR1cm4gc2tiOwotfQotCi0jZW5kaWYgLyogIShfTVlSSV9TQlVTX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMgYi9kcml2ZXJzL25ldC9uYXRzZW1pLmMKaW5kZXggYjc4YmUwOC4uMjk2MmNjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmF0c2VtaS5jCisrKyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiBtb2R1bGVfcGFyYW0obXR1LCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShkc3BjZmdfd29ya2Fyb3VuZCwgaW50LCAxKTsKK21vZHVsZV9wYXJhbShkc3BjZmdfd29ya2Fyb3VuZCwgaW50LCAwKTsKIG1vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOwogbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOwogTU9EVUxFX1BBUk1fREVTQyhtdHUsICJEUDgzODF4IE1UVSAoYWxsIGJvYXJkcykiKTsKQEAgLTEzODIsNyArMTM4Miw3IEBACiAvKiBXQ1NSIGJpdHMgWzA6NF0gWzk6MTBdICovCiAjZGVmaW5lIFdDU1JfUkVTRVRfU0FWRSAweDYxZgogLyogUkZDUiBiaXRzIFsyMF0gWzIyXSBbMjc6MzFdICovCi0jZGVmaW5lIFJGQ1JfUkVTRVRfU0FWRSAweGY4NTAwMDAwOworI2RlZmluZSBSRkNSX1JFU0VUX1NBVkUgMHhmODUwMDAwMAogCiBzdGF0aWMgdm9pZCBuYXRzZW1pX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0yMDI4LDggKzIwMjgsOCBAQAogCQlucC0+cnhfcmluZ1tpXS5jbWRfc3RhdHVzID0gMDsKIAkJbnAtPnJ4X3JpbmdbaV0uYWRkciA9IGNwdV90b19sZTMyKDB4QkFERjAwRDApOyAvKiBBbiBpbnZhbGlkIGFkZHJlc3MuICovCiAJCWlmIChucC0+cnhfc2tidWZmW2ldKSB7Ci0JCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAotCQkJCW5wLT5yeF9kbWFbaV0sIGJ1ZmxlbiwKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT5yeF9kbWFbaV0sCisJCQkJYnVmbGVuICsgTkFUU0VNSV9QQURESU5HLAogCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlkZXZfa2ZyZWVfc2tiKG5wLT5yeF9za2J1ZmZbaV0pOwogCQl9CkBAIC0yMzYwLDcgKzIzNjAsOCBAQAogCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJfSBlbHNlIHsKIAkJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+cnhfZG1hW2VudHJ5XSwKLQkJCQkJYnVmbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCQkJIGJ1ZmxlbiArIE5BVFNFTUlfUEFERElORywKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJCXNrYl9wdXQoc2tiID0gbnAtPnJ4X3NrYnVmZltlbnRyeV0sIHBrdF9sZW4pOwogCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKIAkJCX0KQEAgLTI5MTksNyArMjkyMCw3IEBACiAKIAkvKgogCSAqIElmIHdlJ3JlIGlnbm9yaW5nIHRoZSBQSFkgdGhlbiBhdXRvbmVnIGFuZCB0aGUgaW50ZXJuYWwKLQkgKiB0cmFuc2NpZXZlciBhcmUgcmVhbGx5IG5vdCBnb2luZyB0byB3b3JrIHNvIGRvbid0IGxldCB0aGUKKwkgKiB0cmFuc2NlaXZlciBhcmUgcmVhbGx5IG5vdCBnb2luZyB0byB3b3JrIHNvIGRvbid0IGxldCB0aGUKIAkgKiB1c2VyIHNlbGVjdCB0aGVtLgogCSAqLwogCWlmIChucC0+aWdub3JlX3BoeSAmJiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSB8fApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eC1ldGguYyBiL2RyaXZlcnMvbmV0L25ldHgtZXRoLmMKaW5kZXggMmU0YjQyMS4uMmRmZWU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eC1ldGguYworKysgYi9kcml2ZXJzL25ldC9uZXR4LWV0aC5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaCBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljLmgKaW5kZXggNzcyMjA2OC4uZjc0NGQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaAorKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pYy5oCkBAIC01Myw4ICs1Myw4IEBACiAKICNkZWZpbmUgX05FVFhFTl9OSUNfTElOVVhfTUFKT1IgNAogI2RlZmluZSBfTkVUWEVOX05JQ19MSU5VWF9NSU5PUiAwCi0jZGVmaW5lIF9ORVRYRU5fTklDX0xJTlVYX1NVQlZFUlNJT04gNzUKLSNkZWZpbmUgTkVUWEVOX05JQ19MSU5VWF9WRVJTSU9OSUQgICI0LjAuNzUiCisjZGVmaW5lIF9ORVRYRU5fTklDX0xJTlVYX1NVQlZFUlNJT04gNzYKKyNkZWZpbmUgTkVUWEVOX05JQ19MSU5VWF9WRVJTSU9OSUQgICI0LjAuNzYiCiAKICNkZWZpbmUgTkVUWEVOX1ZFUlNJT05fQ09ERShhLCBiLCBjKQkoKChhKSA8PCAyNCkgKyAoKGIpIDw8IDE2KSArIChjKSkKICNkZWZpbmUgX21ham9yKHYpCSgoKHYpID4+IDI0KSAmIDB4ZmYpCkBAIC0xMzAyLDYgKzEzMDIsNyBAQAogaW50IG5ldHhlbl9pbml0X2R1bW15X2RtYShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBuZXR4ZW5fZnJlZV9kdW1teV9kbWEoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKIAoraW50IG5ldHhlbl9jaGVja19mbGFzaF9md19jb21wYXRpYmlsaXR5KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgbmV0eGVuX3BoYW50b21faW5pdChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwZWd0dW5lX3ZhbCk7CiBpbnQgbmV0eGVuX2xvYWRfZmlybXdhcmUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKIGludCBuZXR4ZW5fbmVlZF9md19yZXNldChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfY3R4LmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19jdHguYwppbmRleCBmMTY5NjZhLi5hOTI1MzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19jdHguYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19jdHguYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJCQkJcnFfc2l6ZSwgJmhvc3RycV9waHlzX2FkZHIpOwogCWlmIChhZGRyID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCXBycSA9IChueF9ob3N0cnFfcnhfY3R4X3QgKilhZGRyOworCXBycSA9IGFkZHI7CiAKIAlhZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKIAkJCXJzcF9zaXplLCAmY2FyZHJzcF9waHlzX2FkZHIpOwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2ZyZWVfcnE7CiAJfQotCXByc3AgPSAobnhfY2FyZHJzcF9yeF9jdHhfdCAqKWFkZHI7CisJcHJzcCA9IGFkZHI7CiAKIAlwcnEtPmhvc3RfcnNwX2RtYV9hZGRyID0gY3B1X3RvX2xlNjQoY2FyZHJzcF9waHlzX2FkZHIpOwogCkBAIC0zMTgsMTAgKzMxOCwxMCBAQAogCX0KIAogCW1lbXNldChycV9hZGRyLCAwLCBycV9zaXplKTsKLQlwcnEgPSAobnhfaG9zdHJxX3R4X2N0eF90ICopcnFfYWRkcjsKKwlwcnEgPSBycV9hZGRyOwogCiAJbWVtc2V0KHJzcF9hZGRyLCAwLCByc3Bfc2l6ZSk7Ci0JcHJzcCA9IChueF9jYXJkcnNwX3R4X2N0eF90ICopcnNwX2FkZHI7CisJcHJzcCA9IHJzcF9hZGRyOwogCiAJcHJxLT5ob3N0X3JzcF9kbWFfYWRkciA9IGNwdV90b19sZTY0KHJzcF9waHlzX2FkZHIpOwogCkBAIC02MjksNyArNjI5LDcgQEAKIAl9CiAKIAltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fcmluZ19jdHgpKTsKLQlyZWN2X2N0eC0+aHdjdHggPSAoc3RydWN0IG5ldHhlbl9yaW5nX2N0eCAqKWFkZHI7CisJcmVjdl9jdHgtPmh3Y3R4ID0gYWRkcjsKIAlyZWN2X2N0eC0+aHdjdHgtPmN0eF9pZCA9IGNwdV90b19sZTMyKHBvcnQpOwogCXJlY3ZfY3R4LT5od2N0eC0+Y21kX2NvbnN1bWVyX29mZnNldCA9CiAJCWNwdV90b19sZTY0KHJlY3ZfY3R4LT5waHlzX2FkZHIgKwpAQCAtNjQ4LDcgKzY0OCw3IEBACiAJCWdvdG8gZXJyX291dF9mcmVlOwogCX0KIAotCXR4X3JpbmctPmRlc2NfaGVhZCA9IChzdHJ1Y3QgY21kX2Rlc2NfdHlwZTAgKilhZGRyOworCXR4X3JpbmctPmRlc2NfaGVhZCA9IGFkZHI7CiAKIAlmb3IgKHJpbmcgPSAwOyByaW5nIDwgYWRhcHRlci0+bWF4X3Jkc19yaW5nczsgcmluZysrKSB7CiAJCXJkc19yaW5nID0gJnJlY3ZfY3R4LT5yZHNfcmluZ3NbcmluZ107CkBAIC02NjIsNyArNjYyLDcgQEAKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGVycl9vdXRfZnJlZTsKIAkJfQotCQlyZHNfcmluZy0+ZGVzY19oZWFkID0gKHN0cnVjdCByY3ZfZGVzYyAqKWFkZHI7CisJCXJkc19yaW5nLT5kZXNjX2hlYWQgPSBhZGRyOwogCiAJCWlmIChOWF9JU19SRVZJU0lPTl9QMihhZGFwdGVyLT5haHcucmV2aXNpb25faWQpKQogCQkJcmRzX3JpbmctPmNyYl9yY3ZfcHJvZHVjZXIgPQpAQCAtNjgzLDcgKzY4Myw3IEBACiAJCQllcnIgPSAtRU5PTUVNOwogCQkJZ290byBlcnJfb3V0X2ZyZWU7CiAJCX0KLQkJc2RzX3JpbmctPmRlc2NfaGVhZCA9IChzdHJ1Y3Qgc3RhdHVzX2Rlc2MgKilhZGRyOworCQlzZHNfcmluZy0+ZGVzY19oZWFkID0gYWRkcjsKIAogCQlpZiAoTlhfSVNfUkVWSVNJT05fUDIoYWRhcHRlci0+YWh3LnJldmlzaW9uX2lkKSkgewogCQkJc2RzX3JpbmctPmNyYl9zdHNfY29uc3VtZXIgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmMKaW5kZXggNWNlZjcxOC4uM2Y4OWU1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5jCkBAIC04MDksNiArODA5LDkgQEAKIAl1NjQgd29yZDsKIAlpbnQgcnYgPSAwOwogCisJaWYgKCF0ZXN0X2JpdChfX05YX0ZXX0FUVEFDSEVELCAmYWRhcHRlci0+c3RhdGUpKQorCQlyZXR1cm4gMDsKKwogCW1lbXNldCgmcmVxLCAwLCBzaXplb2YobnhfbmljX3JlcV90KSk7CiAKIAlyZXEucWhkciA9IGNwdV90b19sZTY0KE5YX0hPU1RfUkVRVUVTVCA8PCAyMyk7CkBAIC05NTksNiArOTYyLDkgQEAKIAl1NjQgd29yZDsKIAlpbnQgcnY7CiAKKwlpZiAoIXRlc3RfYml0KF9fTlhfRldfQVRUQUNIRUQsICZhZGFwdGVyLT5zdGF0ZSkpCisJCXJldHVybiAwOworCiAJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihueF9uaWNfcmVxX3QpKTsKIAlyZXEucWhkciA9IGNwdV90b19sZTY0KE5YX0hPU1RfUkVRVUVTVCA8PCAyMyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYwppbmRleCA3Zjk5OTY3Li5lODk5M2E3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW5pdC5jCkBAIC05NjQsNiArOTY0LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgTkVUWEVOX01JTl9QM19GV19TVVBQCU5FVFhFTl9WRVJTSU9OX0NPREUoNCwgMCwgNTA1KQorCitpbnQKK25ldHhlbl9jaGVja19mbGFzaF9md19jb21wYXRpYmlsaXR5KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgZmxhc2hfZndfdmVyLCBtaW5fZndfdmVyOworCisJaWYgKE5YX0lTX1JFVklTSU9OX1AyKGFkYXB0ZXItPmFody5yZXZpc2lvbl9pZCkpCisJCXJldHVybiAwOworCisJaWYgKG5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsCisJCQlOWF9GV19WRVJTSU9OX09GRlNFVCwgKGludCAqKSZmbGFzaF9md192ZXIpKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIlVuYWJsZSB0byByZWFkIGZsYXNoIGZ3IgorCQkJInZlcnNpb25cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmbGFzaF9md192ZXIgPSBORVRYRU5fREVDT0RFX1ZFUlNJT04oZmxhc2hfZndfdmVyKTsKKwltaW5fZndfdmVyID0gTkVUWEVOX01JTl9QM19GV19TVVBQOworCWlmIChmbGFzaF9md192ZXIgPj0gbWluX2Z3X3ZlcikKKwkJcmV0dXJuIDA7CisKKwlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiRmxhc2ggZndbJWQuJWQuJWRdIGlzIDwgbWluIGZ3IHN1cHBvcnRlZCIKKwkJIls0LjAuNTA1XS4gUGxlYXNlIHVwZGF0ZSBmaXJtd2FyZSBvbiBmbGFzaFxuIiwKKwkJX21ham9yKGZsYXNoX2Z3X3ZlciksIF9taW5vcihmbGFzaF9md192ZXIpLAorCQlfYnVpbGQoZmxhc2hfZndfdmVyKSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKIHN0YXRpYyBjaGFyICpmd19uYW1lW10gPSB7CiAJTlhfUDJfTU5fUk9NSU1BR0VfTkFNRSwKIAlOWF9QM19DVF9ST01JTUFHRV9OQU1FLApAQCAtMTA3MSwxMCArMTEwMCwxMiBAQAogbmV0eGVuX3ZhbGlkYXRlX2Zpcm13YXJlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKIHsKIAlfX2xlMzIgdmFsOwotCXUzMiB2ZXIsIG1pbl92ZXIsIGJpb3M7CisJX19sZTMyIGZsYXNoX2Z3X3ZlcjsKKwl1MzIgZmlsZV9md192ZXIsIG1pbl92ZXIsIGJpb3M7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBhZGFwdGVyLT5mdzsKIAl1OCBmd190eXBlID0gYWRhcHRlci0+ZndfdHlwZTsKKwl1MzIgY3JiaW5pdF9maXhfZnc7CiAKIAlpZiAoZndfdHlwZSA9PSBOWF9VTklGSUVEX1JPTUlNQUdFKSB7CiAJCWlmIChuZXR4ZW5fbmljX3ZhbGlkYXRlX3VuaWZpZWRfcm9taW1hZ2UoYWRhcHRlcikpCkBAIC0xMDkxLDE2ICsxMTIyLDE4IEBACiAJdmFsID0gbnhfZ2V0X2Z3X3ZlcnNpb24oYWRhcHRlcik7CiAKIAlpZiAoTlhfSVNfUkVWSVNJT05fUDMoYWRhcHRlci0+YWh3LnJldmlzaW9uX2lkKSkKLQkJbWluX3ZlciA9IE5FVFhFTl9WRVJTSU9OX0NPREUoNCwgMCwgMjE2KTsKKwkJbWluX3ZlciA9IE5FVFhFTl9NSU5fUDNfRldfU1VQUDsKIAllbHNlCiAJCW1pbl92ZXIgPSBORVRYRU5fVkVSU0lPTl9DT0RFKDMsIDQsIDIxNik7CiAKLQl2ZXIgPSBORVRYRU5fREVDT0RFX1ZFUlNJT04odmFsKTsKKwlmaWxlX2Z3X3ZlciA9IE5FVFhFTl9ERUNPREVfVkVSU0lPTih2YWwpOwogCi0JaWYgKChfbWFqb3IodmVyKSA+IF9ORVRYRU5fTklDX0xJTlVYX01BSk9SKSB8fCAodmVyIDwgbWluX3ZlcikpIHsKKwlpZiAoKF9tYWpvcihmaWxlX2Z3X3ZlcikgPiBfTkVUWEVOX05JQ19MSU5VWF9NQUpPUikgfHwKKwkgICAgKGZpbGVfZndfdmVyIDwgbWluX3ZlcikpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSIlczogZmlybXdhcmUgdmVyc2lvbiAlZC4lZC4lZCB1bnN1cHBvcnRlZFxuIiwKLQkJZndfbmFtZVtmd190eXBlXSwgX21ham9yKHZlciksIF9taW5vcih2ZXIpLCBfYnVpbGQodmVyKSk7CisJCWZ3X25hbWVbZndfdHlwZV0sIF9tYWpvcihmaWxlX2Z3X3ZlciksIF9taW5vcihmaWxlX2Z3X3ZlciksCisJCSBfYnVpbGQoZmlsZV9md192ZXIpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMTEyLDE3ICsxMTQ1LDM0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIGNoZWNrIGlmIGZsYXNoZWQgZmlybXdhcmUgaXMgbmV3ZXIgKi8KIAlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwKLQkJCU5YX0ZXX1ZFUlNJT05fT0ZGU0VULCAoaW50ICopJnZhbCkpCisJCQlOWF9GV19WRVJTSU9OX09GRlNFVCwgKGludCAqKSZmbGFzaF9md192ZXIpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byByZWFkIGZsYXNoIGZ3IHZlcnNpb25cbiIpOwogCQlyZXR1cm4gLUVJTzsKLQl2YWwgPSBORVRYRU5fREVDT0RFX1ZFUlNJT04odmFsKTsKLQlpZiAodmFsID4gdmVyKSB7Ci0JCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlczogZmlybXdhcmUgaXMgb2xkZXIgdGhhbiBmbGFzaFxuIiwKLQkJCQlmd19uYW1lW2Z3X3R5cGVdKTsKKwl9CisJZmxhc2hfZndfdmVyID0gTkVUWEVOX0RFQ09ERV9WRVJTSU9OKGZsYXNoX2Z3X3Zlcik7CisKKwkvKiBOZXcgZncgZnJvbSBmaWxlIGlzIG5vdCBhbGxvd2VkLCBpZiBmdyBvbiBmbGFzaCBpcyA8IDQuMC41NTQgKi8KKwljcmJpbml0X2ZpeF9mdyA9IE5FVFhFTl9WRVJTSU9OX0NPREUoNCwgMCwgNTU0KTsKKwlpZiAoZmlsZV9md192ZXIgPj0gY3JiaW5pdF9maXhfZncgJiYgZmxhc2hfZndfdmVyIDwgY3JiaW5pdF9maXhfZncgJiYKKwkgICAgTlhfSVNfUkVWSVNJT05fUDMoYWRhcHRlci0+YWh3LnJldmlzaW9uX2lkKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJbmNvbXBhdGliaWxpdHkgZGV0ZWN0ZWQgYmV0d2VlbiBkcml2ZXIgIgorCQkJImFuZCBmaXJtd2FyZSB2ZXJzaW9uIG9uIGZsYXNoLiBUaGlzIGNvbmZpZ3VyYXRpb24gIgorCQkJImlzIG5vdCByZWNvbW1lbmRlZC4gUGxlYXNlIHVwZGF0ZSB0aGUgZmlybXdhcmUgb24gIgorCQkJImZsYXNoIGltbWVkaWF0ZWx5XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogY2hlY2sgaWYgZmxhc2hlZCBmaXJtd2FyZSBpcyBuZXdlciBvbmx5IGZvciBuby1tbiBhbmQgUDIgY2FzZSovCisJaWYgKCFuZXR4ZW5fcDNfaGFzX21uKGFkYXB0ZXIpIHx8CisJICAgIE5YX0lTX1JFVklTSU9OX1AyKGFkYXB0ZXItPmFody5yZXZpc2lvbl9pZCkpIHsKKwkJaWYgKGZsYXNoX2Z3X3ZlciA+IGZpbGVfZndfdmVyKSB7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXM6IGZpcm13YXJlIGlzIG9sZGVyIHRoYW4gZmxhc2hcbiIsCisJCQkJZndfbmFtZVtmd190eXBlXSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwogCU5YV1IzMihhZGFwdGVyLCBORVRYRU5fQ0FNX1JBTSgweDFmYyksIE5FVFhFTl9CRElORk9fTUFHSUMpOwogCXJldHVybiAwOwogfQpAQCAtMTI3OSw3ICsxMzI5LDcgQEAKIAogCQkJaWYgKC0taSA9PSAwKQogCQkJCWJyZWFrOwotCQl9OworCQl9CiAJfQogCiAJaWYgKGkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwppbmRleCBiNjQ0MzgzLi5mNTc0ZWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCkBAIC05Miw3ICs5Miw4IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgbmV0eGVuX21zaXhfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhKTsKIAogc3RhdGljIHZvaWQgbmV0eGVuX2NvbmZpZ19pbmRldl9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXR4ZW5fbmljX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKm5ldHhlbl9uaWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkgICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKTsKIHN0YXRpYyBpbnQgbmV0eGVuX25pY19zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApOwogCiAvKiAgUENJIERldmljZSBJRCBUYWJsZSAgKi8KQEAgLTUyMCw3ICs1MjEsNyBAQAogCS5uZG9fb3BlbgkgICA9IG5ldHhlbl9uaWNfb3BlbiwKIAkubmRvX3N0b3AJICAgPSBuZXR4ZW5fbmljX2Nsb3NlLAogCS5uZG9fc3RhcnRfeG1pdCAgICA9IG5ldHhlbl9uaWNfeG1pdF9mcmFtZSwKLQkubmRvX2dldF9zdGF0cwkgICA9IG5ldHhlbl9uaWNfZ2V0X3N0YXRzLAorCS5uZG9fZ2V0X3N0YXRzNjQgICA9IG5ldHhlbl9uaWNfZ2V0X3N0YXRzLAogCS5uZG9fdmFsaWRhdGVfYWRkciA9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gbmV0eGVuX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX3NldF9tYWNfYWRkcmVzcyAgICA9IG5ldHhlbl9uaWNfc2V0X21hYywKQEAgLTEzODcsNiArMTM4OCwxMCBAQAogCQlicmVhazsKIAl9CiAKKwllcnIgPSBuZXR4ZW5fY2hlY2tfZmxhc2hfZndfY29tcGF0aWJpbGl0eShhZGFwdGVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwogCWlmIChhZGFwdGVyLT5wb3J0bnVtID09IDApIHsKIAkJdmFsID0gTlhSRDMyKGFkYXB0ZXIsIE5YX0NSQl9ERVZfUkVGX0NPVU5UKTsKIAkJaWYgKHZhbCAhPSAweGZmZmZmZmZmICYmIHZhbCAhPSAwKSB7CkBAIC0xOTY1LDExICsxOTcwLDExIEBACiAKIAluZXR4ZW5fdHNvX2NoZWNrKG5ldGRldiwgdHhfcmluZywgZmlyc3RfZGVzYywgc2tiKTsKIAotCW5ldHhlbl9uaWNfdXBkYXRlX2NtZF9wcm9kdWNlcihhZGFwdGVyLCB0eF9yaW5nKTsKLQogCWFkYXB0ZXItPnN0YXRzLnR4Ynl0ZXMgKz0gc2tiLT5sZW47CiAJYWRhcHRlci0+c3RhdHMueG1pdGNhbGxlZCsrOwogCisJbmV0eGVuX25pY191cGRhdGVfY21kX3Byb2R1Y2VyKGFkYXB0ZXIsIHR4X3JpbmcpOworCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogZHJvcF9wYWNrZXQ6CkBAIC0yMTEwLDEwICsyMTE1LDEwIEBACiAJY2xlYXJfYml0KF9fTlhfUkVTRVRUSU5HLCAmYWRhcHRlci0+c3RhdGUpOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHhlbl9uaWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpuZXR4ZW5fbmljX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCQkJICAgICAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKIHsKIAlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZuZXRkZXYtPnN0YXRzOwogCiAJc3RhdHMtPnJ4X3BhY2tldHMgPSBhZGFwdGVyLT5zdGF0cy5yeF9wa3RzICsgYWRhcHRlci0+c3RhdHMubHJvX3BrdHM7CiAJc3RhdHMtPnR4X3BhY2tldHMgPSBhZGFwdGVyLT5zdGF0cy54bWl0ZmluaXNoZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaXUuYyBiL2RyaXZlcnMvbmV0L25pdS5jCmluZGV4IGNjMjViZmYwLi5jZDZjMjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uaXUuYworKysgYi9kcml2ZXJzL25ldC9uaXUuYwpAQCAtNyw2ICs3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpAQCAtNjI0OCw5ICs2MjQ5LDEwIEBACiAJCW5pdV9zeW5jX2JtYWNfc3RhdHMobnApOwogfQogCi1zdGF0aWMgdm9pZCBuaXVfZ2V0X3J4X3N0YXRzKHN0cnVjdCBuaXUgKm5wKQorc3RhdGljIHZvaWQgbml1X2dldF9yeF9zdGF0cyhzdHJ1Y3Qgbml1ICpucCwKKwkJCSAgICAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKIHsKLQl1bnNpZ25lZCBsb25nIHBrdHMsIGRyb3BwZWQsIGVycm9ycywgYnl0ZXM7CisJdTY0IHBrdHMsIGRyb3BwZWQsIGVycm9ycywgYnl0ZXM7CiAJc3RydWN0IHJ4X3JpbmdfaW5mbyAqcnhfcmluZ3M7CiAJaW50IGk7CiAKQEAgLTYyNzIsMTUgKzYyNzQsMTYgQEAKIAl9CiAKIG5vX3JpbmdzOgotCW5wLT5kZXYtPnN0YXRzLnJ4X3BhY2tldHMgPSBwa3RzOwotCW5wLT5kZXYtPnN0YXRzLnJ4X2J5dGVzID0gYnl0ZXM7Ci0JbnAtPmRldi0+c3RhdHMucnhfZHJvcHBlZCA9IGRyb3BwZWQ7Ci0JbnAtPmRldi0+c3RhdHMucnhfZXJyb3JzID0gZXJyb3JzOworCXN0YXRzLT5yeF9wYWNrZXRzID0gcGt0czsKKwlzdGF0cy0+cnhfYnl0ZXMgPSBieXRlczsKKwlzdGF0cy0+cnhfZHJvcHBlZCA9IGRyb3BwZWQ7CisJc3RhdHMtPnJ4X2Vycm9ycyA9IGVycm9yczsKIH0KIAotc3RhdGljIHZvaWQgbml1X2dldF90eF9zdGF0cyhzdHJ1Y3Qgbml1ICpucCkKK3N0YXRpYyB2b2lkIG5pdV9nZXRfdHhfc3RhdHMoc3RydWN0IG5pdSAqbnAsCisJCQkgICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCiB7Ci0JdW5zaWduZWQgbG9uZyBwa3RzLCBlcnJvcnMsIGJ5dGVzOworCXU2NCBwa3RzLCBlcnJvcnMsIGJ5dGVzOwogCXN0cnVjdCB0eF9yaW5nX2luZm8gKnR4X3JpbmdzOwogCWludCBpOwogCkBAIC02Mjk5LDIwICs2MzAyLDIyIEBACiAJfQogCiBub19yaW5nczoKLQlucC0+ZGV2LT5zdGF0cy50eF9wYWNrZXRzID0gcGt0czsKLQlucC0+ZGV2LT5zdGF0cy50eF9ieXRlcyA9IGJ5dGVzOwotCW5wLT5kZXYtPnN0YXRzLnR4X2Vycm9ycyA9IGVycm9yczsKKwlzdGF0cy0+dHhfcGFja2V0cyA9IHBrdHM7CisJc3RhdHMtPnR4X2J5dGVzID0gYnl0ZXM7CisJc3RhdHMtPnR4X2Vycm9ycyA9IGVycm9yczsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuaXVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpuaXVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQogewogCXN0cnVjdCBuaXUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJbml1X2dldF9yeF9zdGF0cyhucCk7Ci0JCW5pdV9nZXRfdHhfc3RhdHMobnApOworCQluaXVfZ2V0X3J4X3N0YXRzKG5wLCBzdGF0cyk7CisJCW5pdV9nZXRfdHhfc3RhdHMobnAsIHN0YXRzKTsKIAl9Ci0JcmV0dXJuICZkZXYtPnN0YXRzOworCisJcmV0dXJuIHN0YXRzOwogfQogCiBzdGF0aWMgdm9pZCBuaXVfbG9hZF9oYXNoX3htYWMoc3RydWN0IG5pdSAqbnAsIHUxNiAqaGFzaCkKQEAgLTk3MTAsNyArOTcxNSw3IEBACiAJLm5kb19vcGVuCQk9IG5pdV9vcGVuLAogCS5uZG9fc3RvcAkJPSBuaXVfY2xvc2UsCiAJLm5kb19zdGFydF94bWl0CQk9IG5pdV9zdGFydF94bWl0LAotCS5uZG9fZ2V0X3N0YXRzCQk9IG5pdV9nZXRfc3RhdHMsCisJLm5kb19nZXRfc3RhdHM2NAk9IG5pdV9nZXRfc3RhdHMsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBuaXVfc2V0X3J4X21vZGUsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBuaXVfc2V0X21hY19hZGRyLApAQCAtOTc5Miw3ICs5Nzk3LDcgQEAKIAkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKIAl9CiAKLQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAocGRldik7CiAJaWYgKHBvcyA8PSAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBmaW5kIFBDSSBFeHByZXNzIGNhcGFiaWxpdHksIGFib3J0aW5nXG4iKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbnM4MzgyMC5jIGIvZHJpdmVycy9uZXQvbnM4MzgyMC5jCmluZGV4IDNlNDA0MGYuLmU3MzZhZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25zODM4MjAuYworKysgYi9kcml2ZXJzL25ldC9uczgzODIwLmMKQEAgLTEwNiw2ICsxMDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CS8qIGZvciBpcGggKi8KICNpbmNsdWRlIDxsaW51eC9pbi5oPgkvKiBmb3IgSVBQUk9UT18uLi4gKi8KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpAQCAtNDI5LDEwICs0MzAsNiBAQAogCXN0cnVjdCBwY2lfZGV2CQkqcGNpX2RldjsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmRldjsKIAotI2lmZGVmIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUCi0Jc3RydWN0IHZsYW5fZ3JvdXAJKnZsZ3JwOwotI2VuZGlmCi0KIAlzdHJ1Y3QgcnhfaW5mbwkJcnhfaW5mbzsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcnhfdGFza2xldDsKIApAQCAtNDkzLDIyICs0OTAsNiBAQAogI2RlZmluZSBzdGFydF90eF9va2F5KGRldikJXAogCSgoKE5SX1RYX0RFU0MtMiArIGRldi0+dHhfZG9uZV9pZHggLSBkZXYtPnR4X2ZyZWVfaWR4KSAlIE5SX1RYX0RFU0MpID4gTUlOX1RYX0RFU0NfRlJFRSkKIAotCi0jaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKLXN0YXRpYyB2b2lkIG5zODM4MjBfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKLXsKLQlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKLQotCXNwaW5fbG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKLQlzcGluX2xvY2soJmRldi0+dHhfbG9jayk7Ci0KLQlkZXYtPnZsZ3JwID0gZ3JwOwotCi0Jc3Bpbl91bmxvY2soJmRldi0+dHhfbG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZkZXYtPm1pc2NfbG9jayk7Ci19Ci0jZW5kaWYKLQogLyogUGFja2V0IFJlY2VpdmVyCiAgKgogICogVGhlIGhhcmR3YXJlIHN1cHBvcnRzIGxpbmtlZCBsaXN0cyBvZiByZWNlaXZlIGRlc2NyaXB0b3JzIGZvcgpAQCAtOTI5LDE0ICs5MTAsMTIgQEAKICNpZmRlZiBOUzgzODIwX1ZMQU5fQUNDRUxfU1VQUE9SVAogCQkJaWYoZXh0c3RzICYgRVhUU1RTX1ZQS1QpIHsKIAkJCQl1bnNpZ25lZCBzaG9ydCB0YWc7CisKIAkJCQl0YWcgPSBudG9ocyhleHRzdHMgJiBFWFRTVFNfVlRHX01BU0spOwotCQkJCXJ4X3JjID0gdmxhbl9od2FjY2VsX3J4KHNrYixkZXYtPnZsZ3JwLHRhZyk7Ci0JCQl9IGVsc2UgewotCQkJCXJ4X3JjID0gbmV0aWZfcngoc2tiKTsKKwkJCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdGFnKTsKIAkJCX0KLSNlbHNlCi0JCQlyeF9yYyA9IG5ldGlmX3J4KHNrYik7CiAjZW5kaWYKKwkJCXJ4X3JjID0gbmV0aWZfcngoc2tiKTsKIAkJCWlmIChORVRfUlhfRFJPUCA9PSByeF9yYykgewogbmV0ZGV2X21hbmdsZV9tZV9oYXJkZXJfZmFpbGVkOgogCQkJCW5kZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKQEAgLTE5NjAsMTEgKzE5MzksOCBAQAogCS5uZG9fY2hhbmdlX210dQkJPSBuczgzODIwX2NoYW5nZV9tdHUsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBuczgzODIwX3NldF9tdWx0aWNhc3QsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAogCS5uZG9fdHhfdGltZW91dAkJPSBuczgzODIwX3R4X3RpbWVvdXQsCi0jaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKLQkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSBuczgzODIwX3ZsYW5fcnhfcmVnaXN0ZXIsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IG5zODM4MjBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9vY3Rlb24vb2N0ZW9uX21nbXQuYyBiL2RyaXZlcnMvbmV0L29jdGVvbi9vY3Rlb25fbWdtdC5jCmluZGV4IGIyNjRmMGYuLjQyOWUwOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L29jdGVvbi9vY3Rlb25fbWdtdC5jCisrKyBiL2RyaXZlcnMvbmV0L29jdGVvbi9vY3Rlb25fbWdtdC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNuZXQzMi5jIGIvZHJpdmVycy9uZXQvcGNuZXQzMi5jCmluZGV4IGI0OGFiYTkuLjhiMzA5MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbmV0MzIuYworKysgYi9kcml2ZXJzL25ldC9wY25ldDMyLmMKQEAgLTI1NzAsNyArMjU3MCw2IEBACiAJdm9sYXRpbGUgX19sZTE2ICptY2FzdF90YWJsZSA9IChfX2xlMTYgKilpYi0+ZmlsdGVyOwogCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKLQljaGFyICphZGRyczsKIAlpbnQgaTsKIAl1MzIgY3JjOwogCkBAIC0yNTkwLDEzICsyNTg5LDcgQEAKIAogCS8qIEFkZCBhZGRyZXNzZXMgKi8KIAluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7Ci0JCWFkZHJzID0gaGEtPmFkZHI7Ci0KLQkJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCi0JCWlmICghKCphZGRycyAmIDEpKQotCQkJY29udGludWU7Ci0KLQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGhhLT5hZGRyKTsKIAkJY3JjID0gY3JjID4+IDI2OwogCQltY2FzdF90YWJsZVtjcmMgPj4gNF0gfD0gY3B1X3RvX2xlMTYoMSA8PCAoY3JjICYgMHhmKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L0tjb25maWcgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwppbmRleCAzOTJhNmM0Li5hNzAyNDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwpAQCAtNTgsNiArNTgsNyBAQAogCiBjb25maWcgQkNNNjNYWF9QSFkKIAl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgQnJvYWRjb20gNjN4eCBTT0NzIGludGVybmFsIFBIWSIKKwlkZXBlbmRzIG9uIEJDTTYzWFgKIAktLS1oZWxwLS0tCiAJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIDYzNDggYW5kIDYzNTggUEhZcy4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L2RwODM2NDAuYyBiL2RyaXZlcnMvbmV0L3BoeS9kcDgzNjQwLmMKaW5kZXggYjBjOTUyMi4uMmNkOGRjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L2RwODM2NDAuYworKysgYi9kcml2ZXJzL25ldC9waHkvZHA4MzY0MC5jCkBAIC01NDMsMTEgKzU0MywyMCBAQAogCiAvKiB0aW1lIHN0YW1waW5nIG1ldGhvZHMgKi8KIAotc3RhdGljIHZvaWQgZGVjb2RlX2V2bnQoc3RydWN0IGRwODM2NDBfcHJpdmF0ZSAqZHA4MzY0MCwKLQkJCXN0cnVjdCBwaHlfdHh0cyAqcGh5X3R4dHMsIHUxNiBlc3RzKQorc3RhdGljIGludCBkZWNvZGVfZXZudChzdHJ1Y3QgZHA4MzY0MF9wcml2YXRlICpkcDgzNjQwLAorCQkgICAgICAgdm9pZCAqZGF0YSwgdTE2IGVzdHMpCiB7CisJc3RydWN0IHBoeV90eHRzICpwaHlfdHh0czsKIAlzdHJ1Y3QgcHRwX2Nsb2NrX2V2ZW50IGV2ZW50OwogCWludCB3b3JkcyA9IChlc3RzID4+IEVWTlRfVFNfTEVOX1NISUZUKSAmIEVWTlRfVFNfTEVOX01BU0s7CisJdTE2IGV4dF9zdGF0dXMgPSAwOworCisJaWYgKGVzdHMgJiBNVUxUX0VWTlQpIHsKKwkJZXh0X3N0YXR1cyA9ICoodTE2ICopIGRhdGE7CisJCWRhdGEgKz0gc2l6ZW9mKGV4dF9zdGF0dXMpOworCX0KKworCXBoeV90eHRzID0gZGF0YTsKIAogCXN3aXRjaCAod29yZHMpIHsgLyogZmFsbCB0aHJvdWdoIGluIGV2ZXJ5IGNhc2UgKi8KIAljYXNlIDM6CkBAIC01NjUsNiArNTc0LDkgQEAKIAlldmVudC50aW1lc3RhbXAgPSBwaHkydHh0cygmZHA4MzY0MC0+ZWRhdGEpOwogCiAJcHRwX2Nsb2NrX2V2ZW50KGRwODM2NDAtPmNsb2NrLT5wdHBfY2xvY2ssICZldmVudCk7CisKKwl3b3JkcyA9IGV4dF9zdGF0dXMgPyB3b3JkcyArIDIgOiB3b3JkcyArIDE7CisJcmV0dXJuIHdvcmRzICogc2l6ZW9mKHUxNik7CiB9CiAKIHN0YXRpYyB2b2lkIGRlY29kZV9yeHRzKHN0cnVjdCBkcDgzNjQwX3ByaXZhdGUgKmRwODM2NDAsCkBAIC02NDMsOSArNjU1LDcgQEAKIAogCQl9IGVsc2UgaWYgKFBTRl9FVk5UID09IHR5cGUgJiYgbGVuID49IHNpemVvZigqcGh5X3R4dHMpKSB7CiAKLQkJCXBoeV90eHRzID0gKHN0cnVjdCBwaHlfdHh0cyAqKSBwdHI7Ci0JCQlkZWNvZGVfZXZudChkcDgzNjQwLCBwaHlfdHh0cywgZXN0cyk7Ci0JCQlzaXplID0gc2l6ZW9mKCpwaHlfdHh0cyk7CisJCQlzaXplID0gZGVjb2RlX2V2bnQoZHA4MzY0MCwgcHRyLCBlc3RzKTsKIAogCQl9IGVsc2UgewogCQkJc2l6ZSA9IDA7CkBAIC0xMDM0LDggKzEwNDQsOCBAQAogCiAJaWYgKGlzX3N0YXR1c19mcmFtZShza2IsIHR5cGUpKSB7CiAJCWRlY29kZV9zdGF0dXNfZnJhbWUoZHA4MzY0MCwgc2tiKTsKLQkJLyogTGV0IHRoZSBzdGFjayBkcm9wIHRoaXMgZnJhbWUuICovCi0JCXJldHVybiBmYWxzZTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiB0cnVlOwogCX0KIAogCVNLQl9QVFBfVFlQRShza2IpID0gdHlwZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9pY3BsdXMuYyBiL2RyaXZlcnMvbmV0L3BoeS9pY3BsdXMuYwppbmRleCA5YTA5ZTI0Li5kNGNiYzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvaWNwbHVzLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L2ljcGx1cy5jCkBAIC0xMDksMTEgKzEwOSw3IEBACiAJdmFsdWUgPSBwaHlfcmVhZChwaHlkZXYsIDE2KTsKIAl2YWx1ZSB8PSAweDM7CiAKLQllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCAxNiwgdmFsdWUpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gcGh5X3dyaXRlKHBoeWRldiwgMTYsIHZhbHVlKTsKIH0KIAogc3RhdGljIGludCBpcDE3NWNfcmVhZF9zdGF0dXMoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BsaXAuYyBiL2RyaXZlcnMvbmV0L3BsaXAuYwppbmRleCBjYTRkZjdmLi5hOWU5Y2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wbGlwLmMKKysrIGIvZHJpdmVycy9uZXQvcGxpcC5jCkBAIC0xNTIsNyArMTUyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCBjb25zdCB2b2lkICpkYWRkciwKIAkJCSAgICBjb25zdCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKTsKIHN0YXRpYyBpbnQgcGxpcF9oYXJkX2hlYWRlcl9jYWNoZShjb25zdCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGhfY2FjaGUgKmhoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGhfY2FjaGUgKmhoLCBfX2JlMTYgdHlwZSk7CiBzdGF0aWMgaW50IHBsaXBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgcGxpcF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgcGxpcF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CkBAIC0xMDI2LDExICsxMDI2LDExIEBACiB9CiAKIHN0YXRpYyBpbnQgcGxpcF9oYXJkX2hlYWRlcl9jYWNoZShjb25zdCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKLQkJCQkgIHN0cnVjdCBoaF9jYWNoZSAqaGgpCisJCQkJICBzdHJ1Y3QgaGhfY2FjaGUgKmhoLCBfX2JlMTYgdHlwZSkKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZXRoX2hlYWRlcl9jYWNoZShuZWlnaCwgaGgpOworCXJldCA9IGV0aF9oZWFkZXJfY2FjaGUobmVpZ2gsIGhoLCB0eXBlKTsKIAlpZiAocmV0ID09IDApIHsKIAkJc3RydWN0IGV0aGhkciAqZXRoOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYyBiL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jCmluZGV4IGExYjgyYzkuLmM2YmE2NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9hc3luYy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcHBwX2NoYW5uZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KQEAgLTUyMyw3ICs1MjQsNyBAQAogI2RlZmluZSBQVVRfQllURShhcCwgYnVmLCBjLCBpc2xjcCkJZG8gewkJXAogCWlmICgoaXNsY3AgJiYgYyA8IDB4MjApIHx8IChhcC0+eGFjY21bYyA+PiA1XSAmICgxIDw8IChjICYgMHgxZikpKSkge1wKIAkJKmJ1ZisrID0gUFBQX0VTQ0FQRTsJCQlcCi0JCSpidWYrKyA9IGMgXiAweDIwOwkJCVwKKwkJKmJ1ZisrID0gYyBeIFBQUF9UUkFOUzsJCQlcCiAJfSBlbHNlCQkJCQkJXAogCQkqYnVmKysgPSBjOwkJCQlcCiB9IHdoaWxlICgwKQpAQCAtODk2LDcgKzg5Nyw3IEBACiAJCQkJc3AgPSBza2JfcHV0KHNrYiwgbik7CiAJCQkJbWVtY3B5KHNwLCBidWYsIG4pOwogCQkJCWlmIChhcC0+c3RhdGUgJiBTQ19FU0NBUEUpIHsKLQkJCQkJc3BbMF0gXj0gMHgyMDsKKwkJCQkJc3BbMF0gXj0gUFBQX1RSQU5TOwogCQkJCQlhcC0+c3RhdGUgJj0gflNDX0VTQ0FQRTsKIAkJCQl9CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfZGVmbGF0ZS5jIGIvZHJpdmVycy9uZXQvcHBwX2RlZmxhdGUuYwppbmRleCAzMWU5NDA3Li4xZGJkZjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfZGVmbGF0ZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9kZWZsYXRlLmMKQEAgLTMwNSw3ICszMDUsNyBAQAogCiAJaWYgKHN0YXRlKSB7CiAJCXpsaWJfaW5mbGF0ZUVuZCgmc3RhdGUtPnN0cm0pOwotCQlrZnJlZShzdGF0ZS0+c3RybS53b3Jrc3BhY2UpOworCQl2ZnJlZShzdGF0ZS0+c3RybS53b3Jrc3BhY2UpOwogCQlrZnJlZShzdGF0ZSk7CiAJfQogfQpAQCAtMzQ1LDggKzM0NSw3IEBACiAKIAlzdGF0ZS0+d19zaXplICAgICAgICAgPSB3X3NpemU7CiAJc3RhdGUtPnN0cm0ubmV4dF9vdXQgID0gTlVMTDsKLQlzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPSBrbWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCksCi0JCQkJCUdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKKwlzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkpOwogCWlmIChzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPT0gTlVMTCkKIAkJZ290byBvdXRfZnJlZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKaW5kZXggMjU3M2Y1Mi4uNzM2YTM5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYworKysgYi9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcG9lLmMgYi9kcml2ZXJzL25ldC9wcHBvZS5jCmluZGV4IDcxODg3OWIuLmJjOWE0YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcG9lLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwb2UuYwpAQCAtMzQ4LDggKzM0OCw5IEBACiAKIAkvKiBPbmx5IGxvb2sgYXQgc29ja2V0cyB0aGF0IGFyZSB1c2luZyB0aGlzIHNwZWNpZmljIGRldmljZS4gKi8KIAlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfQ0hBTkdFQUREUjoKIAljYXNlIE5FVERFVl9DSEFOR0VNVFU6Ci0JCS8qIEEgY2hhbmdlIGluIG10dSBpcyBhIGJhZCB0aGluZywgcmVxdWlyaW5nCisJCS8qIEEgY2hhbmdlIGluIG10dSBvciBhZGRyZXNzIGlzIGEgYmFkIHRoaW5nLCByZXF1aXJpbmcKIAkJICogTENQIHJlLW5lZ290aWF0aW9uLgogCQkgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHB0cC5jIGIvZHJpdmVycy9uZXQvcHB0cC5jCmluZGV4IDEyODZmZTIuLmVhZTU0MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwdHAuYworKysgYi9kcml2ZXJzL25ldC9wcHRwLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHMzX2dlbGljX25ldC5jIGIvZHJpdmVycy9uZXQvcHMzX2dlbGljX25ldC5jCmluZGV4IGIxZjI1MWQuLmQ4MmE4MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BzM19nZWxpY19uZXQuYworKysgYi9kcml2ZXJzL25ldC9wczNfZ2VsaWNfbmV0LmMKQEAgLTI4LDYgKzI4LDcgQEAKIAogI3VuZGVmIERFQlVHCiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC04MzcsOSArODM4LDExIEBACiAJCWNhcmQtPnR4X2RtYV9wcm9ncmVzcyA9IDE7CiAJCXN0YXR1cyA9IGx2MV9uZXRfc3RhcnRfdHhfZG1hKGJ1c19pZChjYXJkKSwgZGV2X2lkKGNhcmQpLAogCQkJCQkgICAgICBkZXNjci0+YnVzX2FkZHIsIDApOwotCQlpZiAoc3RhdHVzKQorCQlpZiAoc3RhdHVzKSB7CisJCQljYXJkLT50eF9kbWFfcHJvZ3Jlc3MgPSAwOwogCQkJZGV2X2luZm8oY3RvZGV2KGNhcmQpLCAibHYxX25ldF9zdGFydF90eGRtYSBmYWlsZWQsIiBcCiAJCQkJICJzdGF0dXM9JWRcbiIsIHN0YXR1cyk7CisJCX0KIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTg3NSw3ICs4NzgsNyBAQAogCXJlc3VsdCA9IGdlbGljX2Rlc2NyX3ByZXBhcmVfdHgoY2FyZCwgZGVzY3IsIHNrYik7CiAJaWYgKHJlc3VsdCkgewogCQkvKgotCQkgKiBETUEgbWFwIGZhaWxlZC4gIEFzIGNoYW5zZXMgYXJlIHRoYXQgZmFpbHVyZQorCQkgKiBETUEgbWFwIGZhaWxlZC4gIEFzIGNoYW5jZXMgYXJlIHRoYXQgZmFpbHVyZQogCQkgKiB3b3VsZCBjb250aW51ZSwganVzdCByZWxlYXNlIHNrYiBhbmQgcmV0dXJuCiAJCSAqLwogCQluZXRkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKQEAgLTg5NiwxMiArODk5LDE2IEBACiAJaWYgKGdlbGljX2NhcmRfa2lja190eGRtYShjYXJkLCBkZXNjcikpIHsKIAkJLyoKIAkJICoga2ljayBmYWlsZWQuCi0JCSAqIHJlbGVhc2UgZGVzY3JpcHRvcnMgd2hpY2ggd2VyZSBqdXN0IHByZXBhcmVkCisJCSAqIHJlbGVhc2UgZGVzY3JpcHRvciB3aGljaCB3YXMganVzdCBwcmVwYXJlZAogCQkgKi8KIAkJbmV0ZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCS8qIGRvbid0IHRyaWdnZXIgQlVHX09OKCkgaW4gZ2VsaWNfZGVzY3JfcmVsZWFzZV90eCAqLworCQlkZXNjci0+ZGF0YV9zdGF0dXMgPSBjcHVfdG9fYmUzMihHRUxJQ19ERVNDUl9UWF9UQUlMKTsKIAkJZ2VsaWNfZGVzY3JfcmVsZWFzZV90eChjYXJkLCBkZXNjcik7Ci0JCWdlbGljX2Rlc2NyX3JlbGVhc2VfdHgoY2FyZCwgZGVzY3ItPm5leHQpOwotCQljYXJkLT50eF9jaGFpbi50YWlsID0gZGVzY3ItPm5leHQtPm5leHQ7CisJCS8qIHJlc2V0IGhlYWQgKi8KKwkJY2FyZC0+dHhfY2hhaW4uaGVhZCA9IGRlc2NyOworCQkvKiByZXNldCBodyB0ZXJtaW5hdGlvbiAqLworCQlkZXNjci0+cHJldi0+bmV4dF9kZXNjcl9hZGRyID0gMDsKIAkJZGV2X2luZm8oY3RvZGV2KGNhcmQpLCAiJXM6IGtpY2sgZmFpbHVyZVxuIiwgX19mdW5jX18pOwogCX0KIApAQCAtOTg2LDEwICs5OTMsNiBAQAogCWludCBkbWFjX2NoYWluX2VuZGVkOwogCiAJc3RhdHVzID0gZ2VsaWNfZGVzY3JfZ2V0X3N0YXR1cyhkZXNjcik7Ci0JLyogaXMgdGhpcyBkZXNjcmlwdG9yIHRlcm1pbmF0ZWQgd2l0aCBuZXh0X2Rlc2NyID09IE5VTEw/ICovCi0JZG1hY19jaGFpbl9lbmRlZCA9Ci0JCWJlMzJfdG9fY3B1KGRlc2NyLT5kbWFjX2NtZF9zdGF0dXMpICYKLQkJR0VMSUNfREVTQ1JfUlhfRE1BX0NIQUlOX0VORDsKIAogCWlmIChzdGF0dXMgPT0gR0VMSUNfREVTQ1JfRE1BX0NBUkRPV05FRCkKIAkJcmV0dXJuIDA7CkBAIC0xMDA5LDcgKzEwMTIsNyBAQAogCQkJCW5ldGRldiA9IGNhcmQtPm5ldGRldltpXTsKIAkJCQlicmVhazsKIAkJCX0KLQkJfTsKKwkJfQogCQlpZiAoR0VMSUNfUE9SVF9NQVggPD0gaSkgewogCQkJcHJfaW5mbygiJXM6IHVua25vd24gcGFja2V0IHZpZD0leFxuIiwgX19mdW5jX18sIHZpZCk7CiAJCQlnb3RvIHJlZmlsbDsKQEAgLTEwNDAsNyArMTA0Myw3IEBACiAJCWdvdG8gcmVmaWxsOwogCX0KIAkvKgotCSAqIGRlc2NyaXB0b2VycyBhbnkgb3RoZXIgdGhhbiBGUkFNRV9FTkQgaGVyZSBzaG91bGQKKwkgKiBkZXNjcmlwdG9ycyBhbnkgb3RoZXIgdGhhbiBGUkFNRV9FTkQgaGVyZSBzaG91bGQKIAkgKiBiZSB0cmVhdGVkIGFzIGVycm9yLgogCSAqLwogCWlmIChzdGF0dXMgIT0gR0VMSUNfREVTQ1JfRE1BX0ZSQU1FX0VORCkgewpAQCAtMTA1Miw2ICsxMDU1LDExIEBACiAJLyogb2ssIHdlJ3ZlIGdvdCBhIHBhY2tldCBpbiBkZXNjciAqLwogCWdlbGljX25ldF9wYXNzX3NrYl91cChkZXNjciwgY2FyZCwgbmV0ZGV2KTsKIHJlZmlsbDoKKworCS8qIGlzIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgdGVybWluYXRlZCB3aXRoIG5leHRfZGVzY3IgPT0gTlVMTD8gKi8KKwlkbWFjX2NoYWluX2VuZGVkID0KKwkJYmUzMl90b19jcHUoZGVzY3ItPmRtYWNfY21kX3N0YXR1cykgJgorCQlHRUxJQ19ERVNDUl9SWF9ETUFfQ0hBSU5fRU5EOwogCS8qCiAJICogU28gdGhhdCBhbHdheXMgRE1BQyBjYW4gc2VlIHRoZSBlbmQKIAkgKiBvZiB0aGUgZGVzY3JpcHRvciBjaGFpbiB0byBhdm9pZApAQCAtMTA4MCwxMCArMTA4OCw5IEBACiAJICogSWYgZG1hYyBjaGFpbiB3YXMgbWV0LCBETUFDIHN0b3BwZWQuCiAJICogdGh1cyByZS1lbmFibGUgaXQKIAkgKi8KLQlpZiAoZG1hY19jaGFpbl9lbmRlZCkgewotCQljYXJkLT5yeF9kbWFfcmVzdGFydF9yZXF1aXJlZCA9IDE7Ci0JCWRldl9kYmcoY3RvZGV2KGNhcmQpLCAicmVlbmFibGUgcnggZG1hIHNjaGVkdWxlZFxuIik7Ci0JfQorCisJaWYgKGRtYWNfY2hhaW5fZW5kZWQpCisJCWdlbGljX2NhcmRfZW5hYmxlX3J4ZG1hYyhjYXJkKTsKIAogCXJldHVybiAxOwogfQpAQCAtMTE0OSwxMSArMTE1Niw2IEBACiAKIAlzdGF0dXMgJj0gY2FyZC0+aXJxX21hc2s7CiAKLQlpZiAoY2FyZC0+cnhfZG1hX3Jlc3RhcnRfcmVxdWlyZWQpIHsKLQkJY2FyZC0+cnhfZG1hX3Jlc3RhcnRfcmVxdWlyZWQgPSAwOwotCQlnZWxpY19jYXJkX2VuYWJsZV9yeGRtYWMoY2FyZCk7Ci0JfQotCiAJaWYgKHN0YXR1cyAmIEdFTElDX0NBUkRfUlhJTlQpIHsKIAkJZ2VsaWNfY2FyZF9yeF9pcnFfb2ZmKGNhcmQpOwogCQluYXBpX3NjaGVkdWxlKCZjYXJkLT5uYXBpKTsKQEAgLTExOTksNyArMTIwMSw3IEBACiAjZW5kaWYgLyogQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgKi8KIAogLyoqCi0gKiBnZWxpY19uZXRfb3BlbiAtIGNhbGxlZCB1cG9uIGlmb25maWcgdXAKKyAqIGdlbGljX25ldF9vcGVuIC0gY2FsbGVkIHVwb24gaWZjb25maWcgdXAKICAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCiAgKgogICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BzM19nZWxpY19uZXQuaCBiL2RyaXZlcnMvbmV0L3BzM19nZWxpY19uZXQuaAppbmRleCBkOWE1NWI5Li5kM2ZhZGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wczNfZ2VsaWNfbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvcHMzX2dlbGljX25ldC5oCkBAIC0yODksNyArMjg5LDYgQEAKIAogCXN0cnVjdCBnZWxpY19kZXNjcl9jaGFpbiB0eF9jaGFpbjsKIAlzdHJ1Y3QgZ2VsaWNfZGVzY3JfY2hhaW4gcnhfY2hhaW47Ci0JaW50IHJ4X2RtYV9yZXN0YXJ0X3JlcXVpcmVkOwogCS8qCiAJICogdHhfbG9jayBndWFyZHMgdHggZGVzY3JpcHRvciBsaXN0IGFuZAogCSAqIHR4X2RtYV9wcm9ncmVzcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3B4YTE2OF9ldGguYyBiL2RyaXZlcnMvbmV0L3B4YTE2OF9ldGguYwppbmRleCA4OWY3NTQwLi4xYTMwMzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9weGExNjhfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvcHhhMTY4X2V0aC5jCkBAIC01MDIsNyArNTAyLDcgQEAKIAkgKiBQaWNrIHRoZSBhcHByb3ByaWF0ZSB0YWJsZSwgc3RhcnQgc2Nhbm5pbmcgZm9yIGZyZWUvcmV1c2FibGUKIAkgKiBlbnRyaWVzIGF0IHRoZSBpbmRleCBvYnRhaW5lZCBieSBoYXNoaW5nIHRoZSBzcGVjaWZpZWQgTUFDIGFkZHJlc3MKIAkgKi8KLQlzdGFydCA9IChzdHJ1Y3QgYWRkcl90YWJsZV9lbnRyeSAqKShwZXAtPmh0cHIpOworCXN0YXJ0ID0gcGVwLT5odHByOwogCWVudHJ5ID0gc3RhcnQgKyBoYXNoX2Z1bmN0aW9uKG1hY19hZGRyKTsKIAlmb3IgKGkgPSAwOyBpIDwgSE9QX05VTUJFUjsgaSsrKSB7CiAJCWlmICghKGxlMzJfdG9fY3B1KGVudHJ5LT5sbykgJiBIQVNIX0VOVFJZX1ZBTElEKSkgewpAQCAtMTI2NywxMyArMTI2NywxNiBAQAogCXBlcC0+dHhfc2tiW3R4X2luZGV4XSA9IHNrYjsKIAlkZXNjLT5ieXRlX2NudCA9IGxlbmd0aDsKIAlkZXNjLT5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLCBsZW5ndGgsIERNQV9UT19ERVZJQ0UpOworCisJc2tiX3R4X3RpbWVzdGFtcChza2IpOworCiAJd21iKCk7CiAJZGVzYy0+Y21kX3N0cyA9IEJVRl9PV05FRF9CWV9ETUEgfCBUWF9HRU5fQ1JDIHwgVFhfRklSU1RfREVTQyB8CiAJCQlUWF9aRVJPX1BBRERJTkcgfCBUWF9MQVNUX0RFU0MgfCBUWF9FTl9JTlQ7CiAJd21iKCk7CiAJd3JsKHBlcCwgU0RNQV9DTUQsIFNETUFfQ01EX1RYREggfCBTRE1BX0NNRF9FUkQpOwogCi0Jc3RhdHMtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCXN0YXRzLT50eF9ieXRlcyArPSBsZW5ndGg7CiAJc3RhdHMtPnR4X3BhY2tldHMrKzsKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAlpZiAocGVwLT50eF9yaW5nX3NpemUgLSBwZXAtPnR4X2Rlc2NfY291bnQgPD0gMSkgewpAQCAtMTUwMiw3ICsxNTA1LDcgQEAKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJfbmV0ZGV2OwogCX0KLQlwZXAtPmJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCXBlcC0+YmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAocGVwLT5iYXNlID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfbmV0ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxhM3h4eC5jIGIvZHJpdmVycy9uZXQvcWxhM3h4eC5jCmluZGV4IDc3MWJiNjEuLjJmNjkxNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsYTN4eHguYworKysgYi9kcml2ZXJzL25ldC9xbGEzeHh4LmMKQEAgLTI4NzMsNyArMjg3Myw3IEBACiAJCQkJICAgICBQQUdFX1NJWkUsICZxZGV2LT5zaGFkb3dfcmVnX3BoeV9hZGRyKTsKIAogCWlmIChxZGV2LT5zaGFkb3dfcmVnX3ZpcnRfYWRkciAhPSBOVUxMKSB7Ci0JCXFkZXYtPnByZXFfY29uc3VtZXJfaW5kZXggPSAodTE2ICopIHFkZXYtPnNoYWRvd19yZWdfdmlydF9hZGRyOworCQlxZGV2LT5wcmVxX2NvbnN1bWVyX2luZGV4ID0gcWRldi0+c2hhZG93X3JlZ192aXJ0X2FkZHI7CiAJCXFkZXYtPnJlcV9jb25zdW1lcl9pbmRleF9waHlfYWRkcl9oaWdoID0KIAkJCU1TXzY0QklUUyhxZGV2LT5zaGFkb3dfcmVnX3BoeV9hZGRyKTsKIAkJcWRldi0+cmVxX2NvbnN1bWVyX2luZGV4X3BoeV9hZGRyX2xvdyA9CkBAIC0zMTE0LDggKzMxMTQsNyBAQAogCXFkZXYtPnNtYWxsX2J1Zl9yZWxlYXNlX2NudCA9IDg7CiAJcWRldi0+bHJnX2J1Zl9xX3Byb2R1Y2VyX2luZGV4ID0gcWRldi0+bnVtX2xidWZxX2VudHJpZXMgLSAxOwogCXFkZXYtPmxyZ19idWZfcmVsZWFzZV9jbnQgPSA4OwotCXFkZXYtPmxyZ19idWZfbmV4dF9mcmVlID0KLQkgICAgKHN0cnVjdCBidWZxX2FkZHJfZWxlbWVudCAqKXFkZXYtPmxyZ19idWZfcV92aXJ0X2FkZHI7CisJcWRldi0+bHJnX2J1Zl9uZXh0X2ZyZWUgPSBxZGV2LT5scmdfYnVmX3FfdmlydF9hZGRyOwogCXFkZXYtPnNtYWxsX2J1Zl9pbmRleCA9IDA7CiAJcWRldi0+bHJnX2J1Zl9pbmRleCA9IDA7CiAJcWRldi0+bHJnX2J1Zl9mcmVlX2NvdW50ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWMuaCBiL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWMuaAppbmRleCA0ODBlZjVjLi5iYWY2NDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljLmgKKysrIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pYy5oCkBAIC0zNiw4ICszNiw4IEBACiAKICNkZWZpbmUgX1FMQ05JQ19MSU5VWF9NQUpPUiA1CiAjZGVmaW5lIF9RTENOSUNfTElOVVhfTUlOT1IgMAotI2RlZmluZSBfUUxDTklDX0xJTlVYX1NVQlZFUlNJT04gMTgKLSNkZWZpbmUgUUxDTklDX0xJTlVYX1ZFUlNJT05JRCAgIjUuMC4xOCIKKyNkZWZpbmUgX1FMQ05JQ19MSU5VWF9TVUJWRVJTSU9OIDIxCisjZGVmaW5lIFFMQ05JQ19MSU5VWF9WRVJTSU9OSUQgICI1LjAuMjEiCiAjZGVmaW5lIFFMQ05JQ19EUlZfSURDX1ZFUiAgMHgwMQogI2RlZmluZSBRTENOSUNfRFJJVkVSX1ZFUlNJT04gICgoX1FMQ05JQ19MSU5VWF9NQUpPUiA8PCAxNikgfFwKIAkJIChfUUxDTklDX0xJTlVYX01JTk9SIDw8IDgpIHwgKF9RTENOSUNfTElOVVhfU1VCVkVSU0lPTikpCkBAIC00MjksNiArNDI5LDcgQEAKIAogc3RydWN0IHFsY25pY19md19kdW1wIHsKIAl1OAljbHI7CS8qIGZsYWcgdG8gaW5kaWNhdGUgaWYgZHVtcCBpcyBjbGVhcmVkICovCisJdTgJZW5hYmxlOyAvKiBlbmFibGUvZGlzYWJsZSBkdW1wICovCiAJdTMyCXNpemU7CS8qIHRvdGFsIHNpemUgb2YgdGhlIGR1bXAgKi8KIAl2b2lkCSpkYXRhOwkvKiBkdW1wIGRhdGEgYXJlYSAqLwogCXN0cnVjdAlxbGNuaWNfZHVtcF90ZW1wbGF0ZV9oZHIgKnRtcGxfaGRyOwpAQCAtNDUwLDYgKzQ1MSw3IEBACiAJdTggcmV2aXNpb25faWQ7CiAJdTggcGNpX2Z1bmM7CiAJdTggbGlua3VwOworCXU4IGxvb3BiYWNrX3N0YXRlOwogCXUxNiBwb3J0X3R5cGU7CiAJdTE2IGJvYXJkX3R5cGU7CiAKQEAgLTc3OSw2ICs3ODEsMTQgQEAKICNkZWZpbmUgUUxDTklDX0lQX1VQCQkyCiAjZGVmaW5lIFFMQ05JQ19JUF9ET1dOCQkzCiAKKyNkZWZpbmUgUUxDTklDX0lMQl9NT0RFCQkweDEKKyNkZWZpbmUgUUxDTklDX0VMQl9NT0RFCQkweDIKKworI2RlZmluZSBRTENOSUNfTElOS0VWRU5UCTB4MQorI2RlZmluZSBRTENOSUNfTEJfUkVTUE9OU0UJMHgyCisjZGVmaW5lIFFMQ05JQ19JU19MQl9DT05GSUdVUkVEKFZBTCkJXAorCQkoVkFMID09IChRTENOSUNfTElOS0VWRU5UIHwgUUxDTklDX0xCX1JFU1BPTlNFKSkKKwogLyoKICAqIERyaXZlciAtLT4gRmlybXdhcmUKICAqLwpAQCAtNzg4LDEzICs3OTgsMTcgQEAKICNkZWZpbmUgUUxDTklDX0gyQ19PUENPREVfTFJPX1JFUVVFU1QJCQkweDcKICNkZWZpbmUgUUxDTklDX0gyQ19PUENPREVfU0VUX01BQ19SRUNFSVZFX01PREUJCTB4YwogI2RlZmluZSBRTENOSUNfSDJDX09QQ09ERV9DT05GSUdfSVBBRERSCQkweDEyCisKICNkZWZpbmUgUUxDTklDX0gyQ19PUENPREVfR0VUX0xJTktFVkVOVAkJMHgxNQogI2RlZmluZSBRTENOSUNfSDJDX09QQ09ERV9DT05GSUdfQlJJREdJTkcJCTB4MTcKICNkZWZpbmUgUUxDTklDX0gyQ19PUENPREVfQ09ORklHX0hXX0xSTwkJMHgxOAorI2RlZmluZSBRTENOSUNfSDJDX09QQ09ERV9DT05GSUdfTE9PUEJBQ0sJCTB4MTMKKwogLyoKICAqIEZpcm13YXJlIC0tPiBEcml2ZXIKICAqLwogCisjZGVmaW5lIFFMQ05JQ19DMkhfT1BDT0RFX0NPTkZJR19MT09QQkFDSwkJMHg4ZgogI2RlZmluZSBRTENOSUNfQzJIX09QQ09ERV9HRVRfTElOS0VWRU5UX1JFU1BPTlNFCTE0MQogCiAjZGVmaW5lIFZQT1JUX01JU1NfTU9ERV9EUk9QCQkwIC8qIGRyb3AgYWxsIHVubWF0Y2hlZCAqLwpAQCAtODA4LDYgKzgyMiw3IEBACiAjZGVmaW5lIFFMQ05JQ19GV19DQVBBQklMSVRZX0JERwkJQklUXzgKICNkZWZpbmUgUUxDTklDX0ZXX0NBUEFCSUxJVFlfRlZMQU5UWAkJQklUXzkKICNkZWZpbmUgUUxDTklDX0ZXX0NBUEFCSUxJVFlfSFdfTFJPCQlCSVRfMTAKKyNkZWZpbmUgUUxDTklDX0ZXX0NBUEFCSUxJVFlfTVVMVElfTE9PUEJBQ0sJQklUXzI3CiAKIC8qIG1vZHVsZSB0eXBlcyAqLwogI2RlZmluZSBMSU5LRVZFTlRfTU9EVUxFX05PVF9QUkVTRU5UCQkJMQpAQCAtODk1LDExICs5MTAsMTEgQEAKICNkZWZpbmUgUUxDTklDX01BQ19PVkVSUklERV9ESVNBQkxFRAkweDQwMAogI2RlZmluZSBRTENOSUNfUFJPTUlTQ19ESVNBQkxFRAkJMHg4MDAKICNkZWZpbmUgUUxDTklDX05FRURfRkxSCQkJMHgxMDAwCisjZGVmaW5lIFFMQ05JQ19GV19SRVNFVF9PV05FUgkJMHgyMDAwCiAjZGVmaW5lIFFMQ05JQ19JU19NU0lfRkFNSUxZKGFkYXB0ZXIpIFwKIAkoKGFkYXB0ZXIpLT5mbGFncyAmIChRTENOSUNfTVNJX0VOQUJMRUQgfCBRTENOSUNfTVNJWF9FTkFCTEVEKSkKIAogI2RlZmluZSBRTENOSUNfREVGX05VTV9TVFNfREVTQ19SSU5HUwk0Ci0jZGVmaW5lIFFMQ05JQ19NSU5fTlVNX1JTU19SSU5HUwkyCiAjZGVmaW5lIFFMQ05JQ19NU0lYX1RCTF9TUEFDRQkJODE5MgogI2RlZmluZSBRTENOSUNfUENJX1JFR19NU0lYX1RCTCAJMHg0NAogI2RlZmluZSBRTENOSUNfTVNJWF9UQkxfUEdTSVpFCQk0MDk2CkBAIC05MjIsNiArOTM3LDEyIEBACiAjZGVmaW5lIFFMQ05JQ19SRUFERF9BR0UJMjAKICNkZWZpbmUgUUxDTklDX0xCX01BWF9GSUxURVJTCTY0CiAKKy8qIFFMQ05JQyBEcml2ZXIgRXJyb3IgQ29kZSAqLworI2RlZmluZSBRTENOSUNfRldfTk9UX1JFU1BPTkQJCTUxCisjZGVmaW5lIFFMQ05JQ19URVNUX0lOX1BST0dSRVNTCQk1MgorI2RlZmluZSBRTENOSUNfVU5ERUZJTkVEX0VSUk9SCQk1MworI2RlZmluZSBRTENOSUNfTEJfQ0FCTEVfTk9UX0NPTk4JNTQKKwogc3RydWN0IHFsY25pY19maWx0ZXIgewogCXN0cnVjdCBobGlzdF9ub2RlIGZub2RlOwogCXU4IGZhZGRyW0VUSF9BTEVOXTsKQEAgLTk5Myw3ICsxMDE0LDcgQEAKIAl1OCBtYXhfbWFjX2ZpbHRlcnM7CiAJdTggZGV2X3N0YXRlOwogCXU4IGRpYWdfdGVzdDsKLQl1OCBkaWFnX2NudDsKKwljaGFyIGRpYWdfY250OwogCXU4IHJlc2V0X2Fja190aW1lbzsKIAl1OCBkZXZfaW5pdF90aW1lbzsKIAl1MTYgbXNnX2VuYWJsZTsKQEAgLTEwMDEsNiArMTAyMiw3IEBACiAJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwogCiAJdTY0IGRldl9yc3RfdGltZTsKKwl1OCBtYWNfbGVhcm47CiAJdW5zaWduZWQgbG9uZyB2bGFuc1tCSVRTX1RPX0xPTkdTKFZMQU5fTl9WSUQpXTsKIAogCXN0cnVjdCBxbGNuaWNfbnBhcl9pbmZvICpucGFyczsKQEAgLTEyMTksOCArMTI0MSw3IEBACiAKIHN0cnVjdCBfX2NhY2hlIHsKIAlfX2xlMzIJYWRkcjsKLQl1OAlzdHJpZGU7Ci0JdTgJcnN2ZDsKKwlfX2xlMTYJc3RyaWRlOwogCV9fbGUxNglpbml0X3RhZ192YWw7CiAJX19sZTMyCXNpemU7CiAJX19sZTMyCW5vX29wczsKQEAgLTEzMTgsOSArMTMzOSwxMSBAQAogI2RlZmluZSBRTENOSUNfRFVNUF9TS0lQCUJJVF83CiAKICNkZWZpbmUgUUxDTklDX0RVTVBfTUFTS19NSU4JCTMKLSNkZWZpbmUgUUxDTklDX0RVTVBfTUFTS19ERUYJCTB4MGYKKyNkZWZpbmUgUUxDTklDX0RVTVBfTUFTS19ERUYJCTB4MWYKICNkZWZpbmUgUUxDTklDX0RVTVBfTUFTS19NQVgJCTB4ZmYKICNkZWZpbmUgUUxDTklDX0ZPUkNFX0ZXX0RVTVBfS0VZCTB4ZGVhZGZlZWQKKyNkZWZpbmUgUUxDTklDX0VOQUJMRV9GV19EVU1QCQkweGFkZGZlZWQKKyNkZWZpbmUgUUxDTklDX0RJU0FCTEVfRldfRFVNUAkJMHhiYWRmZWVkCiAKIHN0cnVjdCBxbGNuaWNfZHVtcF9vcGVyYXRpb25zIHsKIAllbnVtIG9wX2NvZGVzIG9wY29kZTsKQEAgLTE0MjgsNiArMTQ1MSwxMiBAQAogdm9pZCBxbGNuaWNfdXBkYXRlX2NtZF9wcm9kdWNlcihzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCXN0cnVjdCBxbGNuaWNfaG9zdF90eF9yaW5nICp0eF9yaW5nKTsKIHZvaWQgcWxjbmljX2ZldGNoX21hYyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKiwgdTMyLCB1MzIsIHU4LCB1OCAqKTsKK3ZvaWQgcWxjbmljX3Byb2Nlc3NfcmN2X3JpbmdfZGlhZyhzdHJ1Y3QgcWxjbmljX2hvc3Rfc2RzX3JpbmcgKnNkc19yaW5nKTsKK3ZvaWQgcWxjbmljX2NsZWFyX2xiX21vZGUoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKTsKK2ludCBxbGNuaWNfc2V0X2xiX21vZGUoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1OCBtb2RlKTsKKworLyogRnVuY3Rpb25zIGZyb20gcWxjbmljX2V0aHRvb2wuYyAqLworaW50IHFsY25pY19jaGVja19sb29wYmFja19idWZmKHVuc2lnbmVkIGNoYXIgKmRhdGEsIHU4IG1hY1tdKTsKIAogLyogRnVuY3Rpb25zIGZyb20gcWxjbmljX21haW4uYyAqLwogaW50IHFsY25pY19yZXNldF9jb250ZXh0KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKQEAgLTE0MzksNiArMTQ2OCw3IEBACiBpbnQgcWxjbmljX3ZhbGlkYXRlX21heF9yc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTggbWF4X2h3LCB1OCB2YWwpOwogaW50IHFsY25pY19zZXRfbWF4X3JzcyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGRhdGEpOwogdm9pZCBxbGNuaWNfZGV2X3JlcXVlc3RfcmVzZXQoc3RydWN0IHFsY25pY19hZGFwdGVyICopOwordm9pZCBxbGNuaWNfYWxsb2NfbGJfZmlsdGVyc19tZW0oc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKTsKIAogLyogTWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KIGludCBxbGNuaWNfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLCB1OCopOwpAQCAtMTQ4OSw2ICsxNTE5LDggQEAKIAkJIk5DNTIzU0ZQIDEwR2IgMi1wb3J0IFNlcnZlciBBZGFwdGVyIn0sCiAJezB4MTA3NywgMHg4MDIwLCAweDEwM2MsIDB4MzM0NiwKIAkJIkNOMTAwMFEgRHVhbCBQb3J0IENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIifSwKKwl7MHgxMDc3LCAweDgwMjAsIDB4MTA3NywgMHgyMTAsCisJCSJRTUU4MjQyLWsgMTBHYkUgRHVhbCBQb3J0IE1lenphbmluZSBDYXJkIn0sCiAJezB4MTA3NywgMHg4MDIwLCAweDAsIDB4MCwgImNMT004MjE0IDEvMTBHYkUgQ29udHJvbGxlciJ9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19jdHguYyBiL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfY3R4LmMKaW5kZXggYmFiMDQxYS4uYjBkMzJkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19jdHguYworKysgYi9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2N0eC5jCkBAIC05NSw4ICs5NSw4IEBACiAJCQlRTENOSUNfQ0RSUF9DTURfVEVNUF9TSVpFKTsKIAlpZiAoZXJyICE9IFFMQ05JQ19SQ09ERV9TVUNDRVNTKSB7CiAJCWVyciA9IFFMQ1JEMzIoYWRhcHRlciwgUUxDTklDX0FSRzFfQ1JCX09GRlNFVCk7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCSJGYWlsZWQgdG8gZ2V0IHRlbXBsYXRlIHNpemUgJWRcbiIsIGVycik7CisJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiQ2FuJ3QgZ2V0IHRlbXBsYXRlIHNpemUgJWRcbiIsIGVycik7CiAJCWVyciA9IC1FSU87CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMTI2LDcgKzEyNiw3IEBACiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyb3I7CiAJfQotCXRtcF90bXBsID0gKHN0cnVjdCBxbGNuaWNfZHVtcF90ZW1wbGF0ZV9oZHIgKikgdG1wX2FkZHI7CisJdG1wX3RtcGwgPSB0bXBfYWRkcjsKIAljc3VtID0gcWxjbmljX3RlbXBfY2hlY2tzdW0oKHVpbnQzMl90ICopIHRtcF9hZGRyLCB0ZW1wX3NpemUpOwogCWlmIChjc3VtKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKQEAgLTEzOSwxNyArMTM5LDE0IEBACiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyb3I7CiAJfQotCXRtcF9idWYgPSAodTMyICopIHRtcF9hZGRyOworCXRtcF9idWYgPSB0bXBfYWRkcjsKIAl0ZW1wbGF0ZSA9ICh1MzIgKikgYWh3LT5md19kdW1wLnRtcGxfaGRyOwogCWZvciAoaSA9IDA7IGkgPCB0ZW1wX3NpemUvc2l6ZW9mKHUzMik7IGkrKykKIAkJKnRlbXBsYXRlKysgPSBfX2xlMzJfdG9fY3B1KCp0bXBfYnVmKyspOwogCiAJdG1wbF9oZHIgPSBhaHctPmZ3X2R1bXAudG1wbF9oZHI7Ci0JaWYgKHRtcGxfaGRyLT5jYXBfbWFzayA+IFFMQ05JQ19EVU1QX01BU0tfREVGICYmCi0JCXRtcGxfaGRyLT5jYXBfbWFzayA8PSBRTENOSUNfRFVNUF9NQVNLX01BWCkKLQkJdG1wbF9oZHItPmRydl9jYXBfbWFzayA9IHRtcGxfaGRyLT5jYXBfbWFzazsKLQllbHNlCi0JCXRtcGxfaGRyLT5kcnZfY2FwX21hc2sgPSBRTENOSUNfRFVNUF9NQVNLX0RFRjsKKwl0bXBsX2hkci0+ZHJ2X2NhcF9tYXNrID0gUUxDTklDX0RVTVBfTUFTS19ERUY7CisJYWh3LT5md19kdW1wLmVuYWJsZSA9IDE7CiBlcnJvcjoKIAlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCB0ZW1wX3NpemUsIHRtcF9hZGRyLCB0bXBfYWRkcl90KTsKIAlyZXR1cm4gZXJyOwpAQCAtMjE0LDcgKzIxMSw3IEBACiAJCQkmaG9zdHJxX3BoeXNfYWRkciwgR0ZQX0tFUk5FTCk7CiAJaWYgKGFkZHIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcHJxID0gKHN0cnVjdCBxbGNuaWNfaG9zdHJxX3J4X2N0eCAqKWFkZHI7CisJcHJxID0gYWRkcjsKIAogCWFkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwgcnNwX3NpemUsCiAJCQkmY2FyZHJzcF9waHlzX2FkZHIsIEdGUF9LRVJORUwpOwpAQCAtMjIyLDcgKzIxOSw3IEBACiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2ZyZWVfcnE7CiAJfQotCXByc3AgPSAoc3RydWN0IHFsY25pY19jYXJkcnNwX3J4X2N0eCAqKWFkZHI7CisJcHJzcCA9IGFkZHI7CiAKIAlwcnEtPmhvc3RfcnNwX2RtYV9hZGRyID0gY3B1X3RvX2xlNjQoY2FyZHJzcF9waHlzX2FkZHIpOwogCkBAIC0zODAsMTAgKzM3NywxMCBAQAogCX0KIAogCW1lbXNldChycV9hZGRyLCAwLCBycV9zaXplKTsKLQlwcnEgPSAoc3RydWN0IHFsY25pY19ob3N0cnFfdHhfY3R4ICopcnFfYWRkcjsKKwlwcnEgPSBycV9hZGRyOwogCiAJbWVtc2V0KHJzcF9hZGRyLCAwLCByc3Bfc2l6ZSk7Ci0JcHJzcCA9IChzdHJ1Y3QgcWxjbmljX2NhcmRyc3BfdHhfY3R4ICopcnNwX2FkZHI7CisJcHJzcCA9IHJzcF9hZGRyOwogCiAJcHJxLT5ob3N0X3JzcF9kbWFfYWRkciA9IGNwdV90b19sZTY0KHJzcF9waHlzX2FkZHIpOwogCkBAIC00OTMsNyArNDkwLDcgQEAKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAJfQogCi0JdHhfcmluZy0+ZGVzY19oZWFkID0gKHN0cnVjdCBjbWRfZGVzY190eXBlMCAqKWFkZHI7CisJdHhfcmluZy0+ZGVzY19oZWFkID0gYWRkcjsKIAogCWZvciAocmluZyA9IDA7IHJpbmcgPCBhZGFwdGVyLT5tYXhfcmRzX3JpbmdzOyByaW5nKyspIHsKIAkJcmRzX3JpbmcgPSAmcmVjdl9jdHgtPnJkc19yaW5nc1tyaW5nXTsKQEAgLTUwNiw3ICs1MDMsNyBAQAogCQkJZXJyID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyX291dF9mcmVlOwogCQl9Ci0JCXJkc19yaW5nLT5kZXNjX2hlYWQgPSAoc3RydWN0IHJjdl9kZXNjICopYWRkcjsKKwkJcmRzX3JpbmctPmRlc2NfaGVhZCA9IGFkZHI7CiAKIAl9CiAKQEAgLTUyMiw3ICs1MTksNyBAQAogCQkJZXJyID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyX291dF9mcmVlOwogCQl9Ci0JCXNkc19yaW5nLT5kZXNjX2hlYWQgPSAoc3RydWN0IHN0YXR1c19kZXNjICopYWRkcjsKKwkJc2RzX3JpbmctPmRlc2NfaGVhZCA9IGFkZHI7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC02NjIsNyArNjU5LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KG5pY19pbmZvX2FkZHIsIDAsIG5pY19zaXplKTsKIAotCW5pY19pbmZvID0gKHN0cnVjdCBxbGNuaWNfaW5mbyAqKSBuaWNfaW5mb19hZGRyOworCW5pY19pbmZvID0gbmljX2luZm9fYWRkcjsKIAllcnIgPSBxbGNuaWNfaXNzdWVfY21kKGFkYXB0ZXIsCiAJCQlhZGFwdGVyLT5haHctPnBjaV9mdW5jLAogCQkJYWRhcHRlci0+ZndfaGFsX3ZlcnNpb24sCkBAIC03MjAsNyArNzE3LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAltZW1zZXQobmljX2luZm9fYWRkciwgMCwgbmljX3NpemUpOwotCW5pY19pbmZvID0gKHN0cnVjdCBxbGNuaWNfaW5mbyAqKW5pY19pbmZvX2FkZHI7CisJbmljX2luZm8gPSBuaWNfaW5mb19hZGRyOwogCiAJbmljX2luZm8tPnBjaV9mdW5jID0gY3B1X3RvX2xlMTYobmljLT5wY2lfZnVuYyk7CiAJbmljX2luZm8tPm9wX21vZGUgPSBjcHVfdG9fbGUxNihuaWMtPm9wX21vZGUpOwpAQCAtNzY5LDcgKzc2Niw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCW1lbXNldChwY2lfaW5mb19hZGRyLCAwLCBwY2lfc2l6ZSk7CiAKLQlucGFyID0gKHN0cnVjdCBxbGNuaWNfcGNpX2luZm8gKikgcGNpX2luZm9fYWRkcjsKKwlucGFyID0gcGNpX2luZm9fYWRkcjsKIAllcnIgPSBxbGNuaWNfaXNzdWVfY21kKGFkYXB0ZXIsCiAJCQlhZGFwdGVyLT5haHctPnBjaV9mdW5jLAogCQkJYWRhcHRlci0+ZndfaGFsX3ZlcnNpb24sCkBAIC04NzcsNyArODc0LDcgQEAKIAkJCVFMQ05JQ19DRFJQX0NNRF9HRVRfRVNXSVRDSF9TVEFUUyk7CiAKIAlpZiAoIWVycikgewotCQlzdGF0cyA9IChzdHJ1Y3QgX19xbGNuaWNfZXN3X3N0YXRpc3RpY3MgKilzdGF0c19hZGRyOworCQlzdGF0cyA9IHN0YXRzX2FkZHI7CiAJCWVzd19zdGF0cy0+Y29udGV4dF9pZCA9IGxlMTZfdG9fY3B1KHN0YXRzLT5jb250ZXh0X2lkKTsKIAkJZXN3X3N0YXRzLT52ZXJzaW9uID0gbGUxNl90b19jcHUoc3RhdHMtPnZlcnNpb24pOwogCQllc3dfc3RhdHMtPnNpemUgPSBsZTE2X3RvX2NwdShzdGF0cy0+c2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfZXRodG9vbC5jCmluZGV4IDllZmM2OTAuLjcyYTcyM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfZXRodG9vbC5jCkBAIC04NCw3ICs4NCw5IEBACiBzdGF0aWMgY29uc3QgY2hhciBxbGNuaWNfZ3N0cmluZ3NfdGVzdFtdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CiAJIlJlZ2lzdGVyX1Rlc3Rfb25fb2ZmbGluZSIsCiAJIkxpbmtfVGVzdF9vbl9vZmZsaW5lIiwKLQkiSW50ZXJydXB0X1Rlc3Rfb2ZmbGluZSIKKwkiSW50ZXJydXB0X1Rlc3Rfb2ZmbGluZSIsCisJIkludGVybmFsX0xvb3BiYWNrX29mZmxpbmUiLAorCSJFeHRlcm5hbF9Mb29wYmFja19vZmZsaW5lIgogfTsKIAogI2RlZmluZSBRTENOSUNfVEVTVF9MRU4JQVJSQVlfU0laRShxbGNuaWNfZ3N0cmluZ3NfdGVzdCkKQEAgLTY4NSw2ICs2ODcsMTI5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2RlZmluZSBRTENOSUNfSUxCX1BLVF9TSVpFIDY0CisjZGVmaW5lIFFMQ05JQ19OVU1fSUxCX1BLVAkxNgorI2RlZmluZSBRTENOSUNfSUxCX01BWF9SQ1ZfTE9PUCAxMAorCitzdGF0aWMgdm9pZCBxbGNuaWNfY3JlYXRlX2xvb3BiYWNrX2J1ZmYodW5zaWduZWQgY2hhciAqZGF0YSwgdTggbWFjW10pCit7CisJdW5zaWduZWQgY2hhciByYW5kb21fZGF0YVtdID0gezB4YTgsIDB4MDYsIDB4NDUsIDB4MDB9OworCisJbWVtc2V0KGRhdGEsIDB4NGUsIFFMQ05JQ19JTEJfUEtUX1NJWkUpOworCisJbWVtY3B5KGRhdGEsIG1hYywgRVRIX0FMRU4pOworCW1lbWNweShkYXRhICsgRVRIX0FMRU4sIG1hYywgRVRIX0FMRU4pOworCisJbWVtY3B5KGRhdGEgKyAyICogRVRIX0FMRU4sIHJhbmRvbV9kYXRhLCBzaXplb2YocmFuZG9tX2RhdGEpKTsKK30KKworaW50IHFsY25pY19jaGVja19sb29wYmFja19idWZmKHVuc2lnbmVkIGNoYXIgKmRhdGEsIHU4IG1hY1tdKQoreworCXVuc2lnbmVkIGNoYXIgYnVmZltRTENOSUNfSUxCX1BLVF9TSVpFXTsKKwlxbGNuaWNfY3JlYXRlX2xvb3BiYWNrX2J1ZmYoYnVmZiwgbWFjKTsKKwlyZXR1cm4gbWVtY21wKGRhdGEsIGJ1ZmYsIFFMQ05JQ19JTEJfUEtUX1NJWkUpOworfQorCitzdGF0aWMgaW50IHFsY25pY19kb19sYl90ZXN0KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcWxjbmljX3JlY3ZfY29udGV4dCAqcmVjdl9jdHggPSBhZGFwdGVyLT5yZWN2X2N0eDsKKwlzdHJ1Y3QgcWxjbmljX2hvc3Rfc2RzX3JpbmcgKnNkc19yaW5nID0gJnJlY3ZfY3R4LT5zZHNfcmluZ3NbMF07CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaSwgbG9vcCwgY250ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBRTENOSUNfTlVNX0lMQl9QS1Q7IGkrKykgeworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKFFMQ05JQ19JTEJfUEtUX1NJWkUpOworCQlxbGNuaWNfY3JlYXRlX2xvb3BiYWNrX2J1ZmYoc2tiLT5kYXRhLCBhZGFwdGVyLT5tYWNfYWRkcik7CisJCXNrYl9wdXQoc2tiLCBRTENOSUNfSUxCX1BLVF9TSVpFKTsKKworCQlhZGFwdGVyLT5kaWFnX2NudCA9IDA7CisJCXFsY25pY194bWl0X2ZyYW1lKHNrYiwgYWRhcHRlci0+bmV0ZGV2KTsKKworCQlsb29wID0gMDsKKwkJZG8geworCQkJbXNsZWVwKDEpOworCQkJcWxjbmljX3Byb2Nlc3NfcmN2X3JpbmdfZGlhZyhzZHNfcmluZyk7CisJCQlpZiAobG9vcCsrID4gUUxDTklDX0lMQl9NQVhfUkNWX0xPT1ApCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKCFhZGFwdGVyLT5kaWFnX2NudCk7CisKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCQlpZiAoIWFkYXB0ZXItPmRpYWdfY250KQorCQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgIkxCIFRlc3Q6ICVkdGggcGFja2V0IgorCQkJCSIgbm90IHJlY2V2aWVkXG4iLCBpICsgMSk7CisJCWVsc2UKKwkJCWNudCsrOworCX0KKwlpZiAoY250ICE9IGkpIHsKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgIkxCIFRlc3QgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxbGNuaWNfbG9vcGJhY2tfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1OCBtb2RlKQoreworCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IG1heF9zZHNfcmluZ3MgPSBhZGFwdGVyLT5tYXhfc2RzX3JpbmdzOworCXN0cnVjdCBxbGNuaWNfaG9zdF9zZHNfcmluZyAqc2RzX3Jpbmc7CisJaW50IGxvb3AgPSAwOworCWludCByZXQ7CisKKwlpZiAoIShhZGFwdGVyLT5jYXBhYmlsaXRpZXMgJiBRTENOSUNfRldfQ0FQQUJJTElUWV9NVUxUSV9MT09QQkFDSykpIHsKKwkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiRmlybXdhcmUgaXMgbm90IGxvb3BiYWNrIHRlc3QgY2FwYWJsZVxuIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwluZXRkZXZfaW5mbyhuZXRkZXYsICIlcyBsb29wYmFjayB0ZXN0IGluIHByb2dyZXNzXG4iLAorCQkgICBtb2RlID09IFFMQ05JQ19JTEJfTU9ERSA/ICJpbnRlcm5hbCIgOiAiZXh0ZXJuYWwiKTsKKwlpZiAoYWRhcHRlci0+b3BfbW9kZSA9PSBRTENOSUNfTk9OX1BSSVZfRlVOQykgeworCQluZXRkZXZfd2FybihuZXRkZXYsICJMb29wYmFjayB0ZXN0IG5vdCBzdXBwb3J0ZWQgZm9yIG5vbiAiCisJCQkJInByaXZpbGVnZSBmdW5jdGlvblxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KF9fUUxDTklDX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldCA9IHFsY25pY19kaWFnX2FsbG9jX3JlcyhuZXRkZXYsIFFMQ05JQ19MT09QQkFDS19URVNUKTsKKwlpZiAocmV0KQorCQlnb3RvIGNsZWFyX2l0OworCisJc2RzX3JpbmcgPSAmYWRhcHRlci0+cmVjdl9jdHgtPnNkc19yaW5nc1swXTsKKworCXJldCA9IHFsY25pY19zZXRfbGJfbW9kZShhZGFwdGVyLCBtb2RlKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfcmVzOworCisJYWRhcHRlci0+ZGlhZ19jbnQgPSAwOworCWRvIHsKKwkJbXNsZWVwKDUwMCk7CisJCXFsY25pY19wcm9jZXNzX3Jjdl9yaW5nX2RpYWcoc2RzX3JpbmcpOworCQlpZiAobG9vcCsrID4gUUxDTklDX0lMQl9NQVhfUkNWX0xPT1ApIHsKKwkJCW5ldGRldl9pbmZvKG5ldGRldiwgImZpcm13YXJlIGRpZG50IHJlc3BvbmQgdG8gbG9vcGJhY2siCisJCQkJIiBjb25maWd1cmUgcmVxdWVzdFxuIik7CisJCQlyZXQgPSAtUUxDTklDX0ZXX05PVF9SRVNQT05EOworCQkJZ290byBmcmVlX3JlczsKKwkJfSBlbHNlIGlmIChhZGFwdGVyLT5kaWFnX2NudCkgeworCQkJcmV0ID0gYWRhcHRlci0+ZGlhZ19jbnQ7CisJCQlnb3RvIGZyZWVfcmVzOworCQl9CisJfSB3aGlsZSAoIVFMQ05JQ19JU19MQl9DT05GSUdVUkVEKGFkYXB0ZXItPmFody0+bG9vcGJhY2tfc3RhdGUpKTsKKworCXJldCA9IHFsY25pY19kb19sYl90ZXN0KGFkYXB0ZXIpOworCisJcWxjbmljX2NsZWFyX2xiX21vZGUoYWRhcHRlcik7CisKKyBmcmVlX3JlczoKKwlxbGNuaWNfZGlhZ19mcmVlX3JlcyhuZXRkZXYsIG1heF9zZHNfcmluZ3MpOworCisgY2xlYXJfaXQ6CisJYWRhcHRlci0+bWF4X3Nkc19yaW5ncyA9IG1heF9zZHNfcmluZ3M7CisJY2xlYXJfYml0KF9fUUxDTklDX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZAogcWxjbmljX2RpYWdfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF90ZXN0ICpldGhfdGVzdCwKIAkJICAgICB1NjQgKmRhdGEpCkBAIC03MDQsNyArODI5LDE2IEBACiAJCWlmIChkYXRhWzJdKQogCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKIAorCQlkYXRhWzNdID0gcWxjbmljX2xvb3BiYWNrX3Rlc3QoZGV2LCBRTENOSUNfSUxCX01PREUpOworCQlpZiAoZGF0YVszXSkKKwkJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CiAKKwkJaWYgKGV0aF90ZXN0LT5mbGFncyAmIEVUSF9URVNUX0ZMX0VYVEVSTkFMX0xCKSB7CisJCQlkYXRhWzRdID0gcWxjbmljX2xvb3BiYWNrX3Rlc3QoZGV2LCBRTENOSUNfRUxCX01PREUpOworCQkJaWYgKGRhdGFbNF0pCisJCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKwkJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9FWFRFUk5BTF9MQl9ET05FOworCQl9CiAJfQogfQogCkBAIC05ODYsOCArMTEyMCw2IEBACiAJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgcWxjbmljX2Z3X2R1bXAgKmZ3X2R1bXAgPSAmYWRhcHRlci0+YWh3LT5md19kdW1wOwogCi0JaWYgKHFsY25pY19hcGlfbG9jayhhZGFwdGVyKSkKLQkJcmV0dXJuIC1FSU87CiAJaWYgKCFmd19kdW1wLT5jbHIpIHsKIAkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiRHVtcCBub3QgYXZhaWxhYmxlXG4iKTsKIAkJcWxjbmljX2FwaV91bmxvY2soYWRhcHRlcik7CkBAIC05OTYsNyArMTEyOCw3IEBACiAJLyogQ29weSB0ZW1wbGF0ZSBoZWFkZXIgZmlyc3QgKi8KIAljb3B5X3N6ID0gZndfZHVtcC0+dG1wbF9oZHItPnNpemU7CiAJaGRyX3B0ciA9ICh1MzIgKikgZndfZHVtcC0+dG1wbF9oZHI7Ci0JZGF0YSA9ICh1MzIgKikgYnVmZmVyOworCWRhdGEgPSBidWZmZXI7CiAJZm9yIChpID0gMDsgaSA8IGNvcHlfc3ovc2l6ZW9mKHUzMik7IGkrKykKIAkJKmRhdGErKyA9IGNwdV90b19sZTMyKCpoZHJfcHRyKyspOwogCkBAIC0xMDA5LDcgKzExNDEsNiBAQAogCXZmcmVlKGZ3X2R1bXAtPmRhdGEpOwogCWZ3X2R1bXAtPmRhdGEgPSBOVUxMOwogCWZ3X2R1bXAtPmNsciA9IDA7Ci0JcWxjbmljX2FwaV91bmxvY2soYWRhcHRlcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMjIsOCArMTE1MywyNyBAQAogCXN0cnVjdCBxbGNuaWNfZndfZHVtcCAqZndfZHVtcCA9ICZhZGFwdGVyLT5haHctPmZ3X2R1bXA7CiAKIAlpZiAodmFsLT5mbGFnID09IFFMQ05JQ19GT1JDRV9GV19EVU1QX0tFWSkgeworCQlpZiAoIWZ3X2R1bXAtPmVuYWJsZSkgeworCQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiRlcgZHVtcCBub3QgZW5hYmxlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWlmIChmd19kdW1wLT5jbHIpIHsKKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiUHJldmlvdXMgZHVtcCBub3QgY2xlYXJlZCwgbm90IGZvcmNpbmcgZHVtcFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJCW5ldGRldl9pbmZvKG5ldGRldiwgIkZvcmNpbmcgYSBGVyBkdW1wXG4iKTsKIAkJcWxjbmljX2Rldl9yZXF1ZXN0X3Jlc2V0KGFkYXB0ZXIpOworCX0gZWxzZSBpZiAodmFsLT5mbGFnID09IFFMQ05JQ19ESVNBQkxFX0ZXX0RVTVApIHsKKwkJaWYgKGZ3X2R1bXAtPmVuYWJsZSkgeworCQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiRGlzYWJsaW5nIEZXIGR1bXBcbiIpOworCQkJZndfZHVtcC0+ZW5hYmxlID0gMDsKKwkJfQorCX0gZWxzZSBpZiAodmFsLT5mbGFnID09IFFMQ05JQ19FTkFCTEVfRldfRFVNUCkgeworCQlpZiAoIWZ3X2R1bXAtPmVuYWJsZSAmJiBmd19kdW1wLT50bXBsX2hkcikgeworCQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiRW5hYmxpbmcgRlcgZHVtcFxuIik7CisJCQlmd19kdW1wLT5lbmFibGUgPSAxOworCQl9CiAJfSBlbHNlIHsKIAkJaWYgKHZhbC0+ZmxhZyA+IFFMQ05JQ19EVU1QX01BU0tfTUFYIHx8CiAJCQl2YWwtPmZsYWcgPCBRTENOSUNfRFVNUF9NQVNLX01JTikgewpAQCAtMTAzMiwxMCArMTE4Miw3IEBACiAJCQkJcmV0ID0gLUVJTlZBTDsKIAkJCQlnb3RvIG91dDsKIAkJfQotCQlpZiAocWxjbmljX2FwaV9sb2NrKGFkYXB0ZXIpKQotCQkJcmV0dXJuIC1FSU87CiAJCWZ3X2R1bXAtPnRtcGxfaGRyLT5kcnZfY2FwX21hc2sgPSB2YWwtPmZsYWcgJiAweGZmOwotCQlxbGNuaWNfYXBpX3VubG9jayhhZGFwdGVyKTsKIAkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiRHJpdmVyIG1hc2sgY2hhbmdlZCB0bzogMHgleFxuIiwKIAkJCWZ3X2R1bXAtPnRtcGxfaGRyLT5kcnZfY2FwX21hc2spOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfaHcuYyBiL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfaHcuYwppbmRleCBlOTY1NjYxLi40MDU1YzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19ody5jCkBAIC00NDYsNiArNDQ2LDEzIEBACiAJfQogCiBzZW5kX2Z3X2NtZDoKKwlpZiAobW9kZSA9PSBWUE9SVF9NSVNTX01PREVfQUNDRVBUX0FMTCkgeworCQlxbGNuaWNfYWxsb2NfbGJfZmlsdGVyc19tZW0oYWRhcHRlcik7CisJCWFkYXB0ZXItPm1hY19sZWFybiA9IDE7CisJfSBlbHNlIHsKKwkJYWRhcHRlci0+bWFjX2xlYXJuID0gMDsKKwl9CisKIAlxbGNuaWNfbmljX3NldF9wcm9taXNjKGFkYXB0ZXIsIG1vZGUpOwogfQogCkBAIC01MzMsNiArNTQwLDU2IEBACiAJfQogfQogCitpbnQgcWxjbmljX3NldF9md19sb29wYmFjayhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGZsYWcpCit7CisJc3RydWN0IHFsY25pY19uaWNfcmVxIHJlcTsKKwlpbnQgcnY7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHN0cnVjdCBxbGNuaWNfbmljX3JlcSkpOworCisJcmVxLnFoZHIgPSBjcHVfdG9fbGU2NChRTENOSUNfSE9TVF9SRVFVRVNUIDw8IDIzKTsKKwlyZXEucmVxX2hkciA9IGNwdV90b19sZTY0KFFMQ05JQ19IMkNfT1BDT0RFX0NPTkZJR19MT09QQkFDSyB8CisJCSgodTY0KSBhZGFwdGVyLT5wb3J0bnVtIDw8IDE2KSB8ICgodTY0KSAweDEgPDwgMzIpKTsKKworCXJlcS53b3Jkc1swXSA9IGNwdV90b19sZTY0KGZsYWcpOworCisJcnYgPSBxbGNuaWNfc2VuZF9jbWRfZGVzY3MoYWRhcHRlciwgKHN0cnVjdCBjbWRfZGVzY190eXBlMCAqKSZyZXEsIDEpOworCWlmIChydiAhPSAwKQorCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlc3RpbmcgbG9vcGJhY2sgbW9kZSBmYWlsZWRcbiIsCisJCQkJZmxhZyA/ICJTZXQiIDogIlJlc2V0Iik7CisJcmV0dXJuIHJ2OworfQorCitpbnQgcWxjbmljX3NldF9sYl9tb2RlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgdTggbW9kZSkKK3sKKwlpZiAocWxjbmljX3NldF9md19sb29wYmFjayhhZGFwdGVyLCBtb2RlKSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAocWxjbmljX25pY19zZXRfcHJvbWlzYyhhZGFwdGVyLCBWUE9SVF9NSVNTX01PREVfQUNDRVBUX0FMTCkpIHsKKwkJcWxjbmljX3NldF9md19sb29wYmFjayhhZGFwdGVyLCBtb2RlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbXNsZWVwKDEwMDApOworCXJldHVybiAwOworfQorCit2b2lkIHFsY25pY19jbGVhcl9sYl9tb2RlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgbW9kZSA9IFZQT1JUX01JU1NfTU9ERV9EUk9QOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwlxbGNuaWNfc2V0X2Z3X2xvb3BiYWNrKGFkYXB0ZXIsIDApOworCisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJbW9kZSA9IFZQT1JUX01JU1NfTU9ERV9BQ0NFUFRfQUxMOworCWVsc2UgaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCW1vZGUgPSBWUE9SVF9NSVNTX01PREVfQUNDRVBUX01VTFRJOworCisJcWxjbmljX25pY19zZXRfcHJvbWlzYyhhZGFwdGVyLCBtb2RlKTsKKwltc2xlZXAoMTAwMCk7Cit9CisKIC8qCiAgKiBTZW5kIHRoZSBpbnRlcnJ1cHQgY29hbGVzY2luZyBwYXJhbWV0ZXIgc2V0IGJ5IGV0aHRvb2wgdG8gdGhlIGNhcmQuCiAgKi8KQEAgLTE0MDYsNiArMTQ2Myw3IEBACiAKIAlmb3IgKGxvb3AgPSAwOyBsb29wIDwgcXVlLT5ub19vcHM7IGxvb3ArKykgewogCQlRTENOSUNfV1JfRFVNUF9SRUcocXVlLT5zZWxfYWRkciwgYmFzZSwgcXVlX2lkKTsKKwkJYWRkciA9IHF1ZS0+cmVhZF9hZGRyOwogCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKIAkJCVFMQ05JQ19SRF9EVU1QX1JFRyhhZGRyLCBiYXNlLCAmZGF0YSk7CiAJCQkqYnVmZmVyKysgPSBjcHVfdG9fbGUzMihkYXRhKTsKQEAgLTE1MDgsMTggKzE1NjYsMjYgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBsMi0+bm9fb3BzOyBpKyspIHsKIAkJUUxDTklDX1dSX0RVTVBfUkVHKGwyLT5hZGRyLCBiYXNlLCB2YWwpOwotCQlkbyB7CisJCWlmIChMU1cobDItPmN0cmxfdmFsKSkKIAkJCVFMQ05JQ19XUl9EVU1QX1JFRyhsMi0+Y3RybF9hZGRyLCBiYXNlLAogCQkJCUxTVyhsMi0+Y3RybF92YWwpKTsKKwkJaWYgKCFwb2xsX21hc2spCisJCQlnb3RvIHNraXBfcG9sbDsKKwkJZG8gewogCQkJUUxDTklDX1JEX0RVTVBfUkVHKGwyLT5jdHJsX2FkZHIsIGJhc2UsICZkYXRhKTsKIAkJCWlmICghKGRhdGEgJiBwb2xsX21hc2spKQogCQkJCWJyZWFrOwogCQkJbXNsZWVwKDEpOwogCQkJdGltZV9vdXQrKzsKIAkJfSB3aGlsZSAodGltZV9vdXQgPD0gcG9sbF90byk7Ci0JCWlmICh0aW1lX291dCA+IHBvbGxfdG8pCi0JCQlyZXR1cm4gLUVJTlZBTDsKIAorCQlpZiAodGltZV9vdXQgPiBwb2xsX3RvKSB7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJIlRpbWVvdXQgZXhjZWVkZWQgaW4gJXMsIGFib3J0aW5nIGR1bXBcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KK3NraXBfcG9sbDoKIAkJYWRkciA9IGwyLT5yZWFkX2FkZHI7CiAJCWNudCA9IGwyLT5yZWFkX2FkZHJfbnVtOwogCQl3aGlsZSAoY250KSB7CkBAIC0xNjcyLDggKzE3MzgsNyBAQAogCXRtcGxfaGRyLT5zeXNfaW5mb1sxXSA9IGFkYXB0ZXItPmZ3X3ZlcnNpb247CiAKIAlmb3IgKGkgPSAwOyBpIDwgbm9fZW50cmllczsgaSsrKSB7Ci0JCWVudHJ5ID0gKHN0cnVjdCBxbGNuaWNfZHVtcF9lbnRyeSAqKSAoKHZvaWQgKikgdG1wbF9oZHIgKwotCQkJZW50cnlfb2Zmc2V0KTsKKwkJZW50cnkgPSAodm9pZCAqKXRtcGxfaGRyICsgZW50cnlfb2Zmc2V0OwogCQlpZiAoIShlbnRyeS0+aGRyLm1hc2sgJiB0bXBsX2hkci0+ZHJ2X2NhcF9tYXNrKSkgewogCQkJZW50cnktPmhkci5mbGFncyB8PSBRTENOSUNfRFVNUF9TS0lQOwogCQkJZW50cnlfb2Zmc2V0ICs9IGVudHJ5LT5oZHIub2Zmc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxjbmljL3FsY25pY19pbml0LmMgYi9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2luaXQuYwppbmRleCA1YjhiYmNmLi5lZThhMzk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2luaXQuYworKysgYi9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX2luaXQuYwpAQCAtMTI4MSw2ICsxMjgxLDcgQEAKIAl1MTYgY2FibGVfbGVuOwogCXUxNiBsaW5rX3NwZWVkOwogCXU4ICBsaW5rX3N0YXR1cywgbW9kdWxlLCBkdXBsZXgsIGF1dG9uZWc7CisJdTggbGJfc3RhdHVzID0gMDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCiAJYWRhcHRlci0+aGFzX2xpbmtfZXZlbnRzID0gMTsKQEAgLTEyOTIsNiArMTI5Myw3IEBACiAJbGlua19zdGF0dXMgPSBtc2ctPmJvZHlbMl0gJiAweGZmOwogCWR1cGxleCA9IChtc2ctPmJvZHlbMl0gPj4gMTYpICYgMHhmZjsKIAlhdXRvbmVnID0gKG1zZy0+Ym9keVsyXSA+PiAyNCkgJiAweGZmOworCWxiX3N0YXR1cyA9IChtc2ctPmJvZHlbMl0gPj4gMzIpICYgMHgzOwogCiAJbW9kdWxlID0gKG1zZy0+Ym9keVsyXSA+PiA4KSAmIDB4ZmY7CiAJaWYgKG1vZHVsZSA9PSBMSU5LRVZFTlRfTU9EVUxFX1RXSU5BWF9VTlNVUFBPUlRFRF9DQUJMRSkKQEAgLTEzMDEsNiArMTMwMywxMCBAQAogCQlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJ1bnN1cHBvcnRlZCBjYWJsZSBsZW5ndGggJWRcbiIsCiAJCQkJY2FibGVfbGVuKTsKIAorCWlmICghbGlua19zdGF0dXMgJiYgKGxiX3N0YXR1cyA9PSBRTENOSUNfSUxCX01PREUgfHwKKwkgICAgbGJfc3RhdHVzID09IFFMQ05JQ19FTEJfTU9ERSkpCisJCWFkYXB0ZXItPmFody0+bG9vcGJhY2tfc3RhdGUgfD0gUUxDTklDX0xJTktFVkVOVDsKKwogCXFsY25pY19hZHZlcnRfbGlua19jaGFuZ2UoYWRhcHRlciwgbGlua19zdGF0dXMpOwogCiAJaWYgKGR1cGxleCA9PSBMSU5LRVZFTlRfRlVMTF9EVVBMRVgpCkBAIC0xMzE5LDcgKzEzMjUsOSBAQAogewogCXN0cnVjdCBxbGNuaWNfZndfbXNnIG1zZzsKIAlzdHJ1Y3Qgc3RhdHVzX2Rlc2MgKmRlc2M7Ci0JaW50IGkgPSAwLCBvcGNvZGU7CisJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgaSA9IDAsIG9wY29kZSwgcmV0OwogCiAJd2hpbGUgKGRlc2NfY250ID4gMCAmJiBpIDwgOCkgewogCQlkZXNjID0gJnNkc19yaW5nLT5kZXNjX2hlYWRbaW5kZXhdOwpAQCAtMTMzMCwxMCArMTMzOCwzNCBAQAogCQlkZXNjX2NudC0tOwogCX0KIAorCWFkYXB0ZXIgPSBzZHNfcmluZy0+YWRhcHRlcjsKKwlkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwogCW9wY29kZSA9IHFsY25pY19nZXRfbmljX21zZ19vcGNvZGUobXNnLmJvZHlbMF0pOworCiAJc3dpdGNoIChvcGNvZGUpIHsKIAljYXNlIFFMQ05JQ19DMkhfT1BDT0RFX0dFVF9MSU5LRVZFTlRfUkVTUE9OU0U6Ci0JCXFsY25pY19oYW5kbGVfbGlua2V2ZW50KHNkc19yaW5nLT5hZGFwdGVyLCAmbXNnKTsKKwkJcWxjbmljX2hhbmRsZV9saW5rZXZlbnQoYWRhcHRlciwgJm1zZyk7CisJCWJyZWFrOworCWNhc2UgUUxDTklDX0MySF9PUENPREVfQ09ORklHX0xPT1BCQUNLOgorCQlyZXQgPSAodTMyKShtc2cuYm9keVsxXSk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJCWFkYXB0ZXItPmFody0+bG9vcGJhY2tfc3RhdGUgfD0gUUxDTklDX0xCX1JFU1BPTlNFOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWRldl9pbmZvKGRldiwgImxvb3BiYWNrIGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiIpOworCQkJYWRhcHRlci0+ZGlhZ19jbnQgPSAtUUxDTklDX1RFU1RfSU5fUFJPR1JFU1M7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZGV2X2luZm8oZGV2LCAibG9vcGJhY2sgY2FibGUgaXMgbm90IGNvbm5lY3RlZFxuIik7CisJCQlhZGFwdGVyLT5kaWFnX2NudCA9IC1RTENOSUNfTEJfQ0FCTEVfTk9UX0NPTk47CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9pbmZvKGRldiwgImxvb3BiYWNrIGNvbmZpZ3VyZSByZXF1ZXN0IGZhaWxlZCwiCisJCQkJCSIgcmV0ICV4XG4iLCByZXQpOworCQkJYWRhcHRlci0+ZGlhZ19jbnQgPSAtUUxDTklDX1VOREVGSU5FRF9FUlJPUjsKKwkJCWJyZWFrOworCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMTc0Niw2ICsxNzc4LDEwMyBAQAogCXNwaW5fdW5sb2NrKCZyZHNfcmluZy0+bG9jayk7CiB9CiAKK3N0YXRpYyB2b2lkIGR1bXBfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IHNrYi0+ZGF0YTsKKworCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJZm9yIChpID0gMDsgaSA8IHNrYi0+bGVuOyBpKyspIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJTAyeCAiLCBkYXRhW2ldKTsKKwkJaWYgKChpICYgMHgwZikgPT0gOCkKKwkJCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJfQorfQorCit2b2lkIHFsY25pY19wcm9jZXNzX3Jjdl9kaWFnKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwKKwkJc3RydWN0IHFsY25pY19ob3N0X3Nkc19yaW5nICpzZHNfcmluZywKKwkJaW50IHJpbmcsIHU2NCBzdHNfZGF0YTApCit7CisJc3RydWN0IHFsY25pY19yZWN2X2NvbnRleHQgKnJlY3ZfY3R4ID0gYWRhcHRlci0+cmVjdl9jdHg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcWxjbmljX2hvc3RfcmRzX3JpbmcgKnJkc19yaW5nOworCWludCBpbmRleCwgbGVuZ3RoLCBja3N1bSwgcGt0X29mZnNldDsKKworCWlmICh1bmxpa2VseShyaW5nID49IGFkYXB0ZXItPm1heF9yZHNfcmluZ3MpKQorCQlyZXR1cm47CisKKwlyZHNfcmluZyA9ICZyZWN2X2N0eC0+cmRzX3JpbmdzW3JpbmddOworCisJaW5kZXggPSBxbGNuaWNfZ2V0X3N0c19yZWZoYW5kbGUoc3RzX2RhdGEwKTsKKwlsZW5ndGggPSBxbGNuaWNfZ2V0X3N0c190b3RhbGxlbmd0aChzdHNfZGF0YTApOworCWlmICh1bmxpa2VseShpbmRleCA+PSByZHNfcmluZy0+bnVtX2Rlc2MpKQorCQlyZXR1cm47CisKKwlja3N1bSAgPSBxbGNuaWNfZ2V0X3N0c19zdGF0dXMoc3RzX2RhdGEwKTsKKwlwa3Rfb2Zmc2V0ID0gcWxjbmljX2dldF9zdHNfcGt0X29mZnNldChzdHNfZGF0YTApOworCisJc2tiID0gcWxjbmljX3Byb2Nlc3NfcnhidWYoYWRhcHRlciwgcmRzX3JpbmcsIGluZGV4LCBja3N1bSk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKworCWlmIChsZW5ndGggPiByZHNfcmluZy0+c2tiX3NpemUpCisJCXNrYl9wdXQoc2tiLCByZHNfcmluZy0+c2tiX3NpemUpOworCWVsc2UKKwkJc2tiX3B1dChza2IsIGxlbmd0aCk7CisKKwlpZiAocGt0X29mZnNldCkKKwkJc2tiX3B1bGwoc2tiLCBwa3Rfb2Zmc2V0KTsKKworCWlmICghcWxjbmljX2NoZWNrX2xvb3BiYWNrX2J1ZmYoc2tiLT5kYXRhLCBhZGFwdGVyLT5tYWNfYWRkcikpCisJCWFkYXB0ZXItPmRpYWdfY250Kys7CisJZWxzZQorCQlkdW1wX3NrYihza2IpOworCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlhZGFwdGVyLT5zdGF0cy5yeF9wa3RzKys7CisJYWRhcHRlci0+c3RhdHMucnhieXRlcyArPSBsZW5ndGg7CisKKwlyZXR1cm47Cit9CisKK3ZvaWQKK3FsY25pY19wcm9jZXNzX3Jjdl9yaW5nX2RpYWcoc3RydWN0IHFsY25pY19ob3N0X3Nkc19yaW5nICpzZHNfcmluZykKK3sKKwlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBzZHNfcmluZy0+YWRhcHRlcjsKKwlzdHJ1Y3Qgc3RhdHVzX2Rlc2MgKmRlc2M7CisJdTY0IHN0c19kYXRhMDsKKwlpbnQgcmluZywgb3Bjb2RlLCBkZXNjX2NudDsKKworCXUzMiBjb25zdW1lciA9IHNkc19yaW5nLT5jb25zdW1lcjsKKworCWRlc2MgPSAmc2RzX3JpbmctPmRlc2NfaGVhZFtjb25zdW1lcl07CisJc3RzX2RhdGEwID0gbGU2NF90b19jcHUoZGVzYy0+c3RhdHVzX2Rlc2NfZGF0YVswXSk7CisKKwlpZiAoIShzdHNfZGF0YTAgJiBTVEFUVVNfT1dORVJfSE9TVCkpCisJCXJldHVybjsKKworCWRlc2NfY250ID0gcWxjbmljX2dldF9zdHNfZGVzY19jbnQoc3RzX2RhdGEwKTsKKwlvcGNvZGUgPSBxbGNuaWNfZ2V0X3N0c19vcGNvZGUoc3RzX2RhdGEwKTsKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgUUxDTklDX1JFU1BPTlNFX0RFU0M6CisJCXFsY25pY19oYW5kbGVfZndfbWVzc2FnZShkZXNjX2NudCwgY29uc3VtZXIsIHNkc19yaW5nKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmluZyA9IHFsY25pY19nZXRfc3RzX3R5cGUoc3RzX2RhdGEwKTsKKwkJcWxjbmljX3Byb2Nlc3NfcmN2X2RpYWcoYWRhcHRlciwgc2RzX3JpbmcsIHJpbmcsIHN0c19kYXRhMCk7CisJCWJyZWFrOworCX0KKworCWZvciAoOyBkZXNjX2NudCA+IDA7IGRlc2NfY250LS0pIHsKKwkJZGVzYyA9ICZzZHNfcmluZy0+ZGVzY19oZWFkW2NvbnN1bWVyXTsKKwkJZGVzYy0+c3RhdHVzX2Rlc2NfZGF0YVswXSA9IGNwdV90b19sZTY0KFNUQVRVU19PV05FUl9QSEFOVE9NKTsKKwkJY29uc3VtZXIgPSBnZXRfbmV4dF9pbmRleChjb25zdW1lciwgc2RzX3JpbmctPm51bV9kZXNjKTsKKwl9CisKKwlzZHNfcmluZy0+Y29uc3VtZXIgPSBjb25zdW1lcjsKKwl3cml0ZWwoY29uc3VtZXIsIHNkc19yaW5nLT5jcmJfc3RzX2NvbnN1bWVyKTsKK30KKwogdm9pZAogcWxjbmljX2ZldGNoX21hYyhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBvZmYxLCB1MzIgb2ZmMiwKIAkJCXU4IGFsdF9tYWMsIHU4ICptYWMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGNuaWMvcWxjbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfbWFpbi5jCmluZGV4IDNhYjdkMmMuLjVjYTFiNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3FsY25pYy9xbGNuaWNfbWFpbi5jCkBAIC05MCw3ICs5MCw2IEBACiBzdGF0aWMgdm9pZCBxbGNuaWNfcmVzdG9yZV9pbmRldl9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcpOwogc3RhdGljIGludCBxbGNuaWNfc3RhcnRfZmlybXdhcmUoc3RydWN0IHFsY25pY19hZGFwdGVyICopOwogCi1zdGF0aWMgdm9pZCBxbGNuaWNfYWxsb2NfbGJfZmlsdGVyc19tZW0oc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKTsKIHN0YXRpYyB2b2lkIHFsY25pY19mcmVlX2xiX2ZpbHRlcnNfbWVtKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcik7CiBzdGF0aWMgdm9pZCBxbGNuaWNfZGV2X3NldF9ucGFyX3JlYWR5KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKIHN0YXRpYyBpbnQgcWxjbmljdmZfY29uZmlnX2xlZChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKiwgdTMyLCB1MzIpOwpAQCAtNDE4LDEwICs0MTcsOCBAQAogCWludCBudW1fbXNpeDsKIAogCWlmIChhZGFwdGVyLT5tc2l4X3N1cHBvcnRlZCkgewotCQludW1fbXNpeCA9IChudW1fb25saW5lX2NwdXMoKSA+PQotCQkJUUxDTklDX0RFRl9OVU1fU1RTX0RFU0NfUklOR1MpID8KLQkJCVFMQ05JQ19ERUZfTlVNX1NUU19ERVNDX1JJTkdTIDoKLQkJCVFMQ05JQ19NSU5fTlVNX1JTU19SSU5HUzsKKwkJbnVtX21zaXggPSByb3VuZGRvd25fcG93X29mX3R3byhtaW5fdChpbnQsIG51bV9vbmxpbmVfY3B1cygpLAorCQkJCVFMQ05JQ19ERUZfTlVNX1NUU19ERVNDX1JJTkdTKSk7CiAJfSBlbHNlCiAJCW51bV9tc2l4ID0gMTsKIApAQCAtMTM5Myw2ICsxMzkwLDEyIEBACiAJCQlxbGNuaWNfZW5hYmxlX2ludChzZHNfcmluZyk7CiAJCX0KIAl9CisKKwlpZiAoYWRhcHRlci0+ZGlhZ190ZXN0ID09IFFMQ05JQ19MT09QQkFDS19URVNUKSB7CisJCWFkYXB0ZXItPmFody0+bG9vcGJhY2tfc3RhdGUgPSAwOworCQlxbGNuaWNfbGlua2V2ZW50X3JlcXVlc3QoYWRhcHRlciwgMSk7CisJfQorCiAJc2V0X2JpdChfX1FMQ05JQ19ERVZfVVAsICZhZGFwdGVyLT5zdGF0ZSk7CiAKIAlyZXR1cm4gMDsKQEAgLTE0ODcsOCArMTQ5MCw2IEBACiAKIAluZXRkZXYtPmlycSA9IGFkYXB0ZXItPm1zaXhfZW50cmllc1swXS52ZWN0b3I7CiAKLQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwotCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgbmV0IGRldmljZVxuIik7CkBAIC0xNTc2LDYgKzE1NzcsNyBAQAogCWFkYXB0ZXItPmRldl9yc3RfdGltZSA9IGppZmZpZXM7CiAJcmV2aXNpb25faWQgPSBwZGV2LT5yZXZpc2lvbjsKIAlhZGFwdGVyLT5haHctPnJldmlzaW9uX2lkID0gcmV2aXNpb25faWQ7CisJYWRhcHRlci0+bWFjX2xlYXJuID0gcWxjbmljX21hY19sZWFybjsKIAogCXJ3bG9ja19pbml0KCZhZGFwdGVyLT5haHctPmNyYl9sb2NrKTsKIAltdXRleF9pbml0KCZhZGFwdGVyLT5haHctPm1lbV9sb2NrKTsKQEAgLTE1OTAsMTAgKzE1OTIsNiBAQAogCS8qIFRoaXMgd2lsbCBiZSByZXNldCBmb3IgbWV6eiBjYXJkcyAgKi8KIAlhZGFwdGVyLT5wb3J0bnVtID0gYWRhcHRlci0+YWh3LT5wY2lfZnVuYzsKIAotCS8qIEdldCBGVyBkdW1wIHRlbXBsYXRlIGFuZCBzdG9yZSBpdCAqLwotCWlmIChhZGFwdGVyLT5vcF9tb2RlICE9IFFMQ05JQ19OT05fUFJJVl9GVU5DKQotCQlxbGNuaWNfZndfY21kX2dldF9taW5pZHVtcF90ZW1wKGFkYXB0ZXIpOwotCiAJZXJyID0gcWxjbmljX2dldF9ib2FyZF9pbmZvKGFkYXB0ZXIpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgZ2V0dGluZyBib2FyZCBjb25maWcgaW5mby5cbiIpOwpAQCAtMTYxMiw2ICsxNjEwLDEyIEBACiAJCWdvdG8gZXJyX291dF9kZWNyX3JlZjsKIAl9CiAKKwkvKiBHZXQgRlcgZHVtcCB0ZW1wbGF0ZSBhbmQgc3RvcmUgaXQgKi8KKwlpZiAoYWRhcHRlci0+b3BfbW9kZSAhPSBRTENOSUNfTk9OX1BSSVZfRlVOQykKKwkJaWYgKCFxbGNuaWNfZndfY21kX2dldF9taW5pZHVtcF90ZW1wKGFkYXB0ZXIpKQorCQkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCQkiU3VwcG9ydHMgRlcgZHVtcCBjYXBhYmlsaXR5XG4iKTsKKwogCWlmIChxbGNuaWNfcmVhZF9tYWNfYWRkcihhZGFwdGVyKSkKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWFkIG1hYyBhZGRyXG4iKTsKIApAQCAtMTY1MCw3ICsxNjU0LDkgQEAKIAkJYnJlYWs7CiAJfQogCi0JcWxjbmljX2FsbG9jX2xiX2ZpbHRlcnNfbWVtKGFkYXB0ZXIpOworCWlmIChhZGFwdGVyLT5tYWNfbGVhcm4pCisJCXFsY25pY19hbGxvY19sYl9maWx0ZXJzX21lbShhZGFwdGVyKTsKKwogCXFsY25pY19jcmVhdGVfZGlhZ19lbnRyaWVzKGFkYXB0ZXIpOwogCiAJcmV0dXJuIDA7CkBAIC0xODE2LDYgKzE4MjIsOCBAQAogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IGVycjsKIAorCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisKIAllcnIgPSBxbGNuaWNfYXR0YWNoKGFkYXB0ZXIpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC0xODQ0LDEzICsxODUyLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1xbGNuaWNfYWxsb2NfbGJfZmlsdGVyc19tZW0oc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQordm9pZCBxbGNuaWNfYWxsb2NfbGJfZmlsdGVyc19tZW0oc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQogewogCXZvaWQgKmhlYWQ7CiAJaW50IGk7CiAKLQlpZiAoIXFsY25pY19tYWNfbGVhcm4pCisJaWYgKGFkYXB0ZXItPmZoYXNoLmZtYXggJiYgYWRhcHRlci0+Zmhhc2guZmhlYWQpCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5tYWNfbGVhcm5fbG9jayk7CkBAIC0xODYxLDcgKzE4NjgsNyBAQAogCQlyZXR1cm47CiAKIAlhZGFwdGVyLT5maGFzaC5mbWF4ID0gUUxDTklDX0xCX01BWF9GSUxURVJTOwotCWFkYXB0ZXItPmZoYXNoLmZoZWFkID0gKHN0cnVjdCBobGlzdF9oZWFkICopaGVhZDsKKwlhZGFwdGVyLT5maGFzaC5maGVhZCA9IGhlYWQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+Zmhhc2guZm1heDsgaSsrKQogCQlJTklUX0hMSVNUX0hFQUQoJmFkYXB0ZXItPmZoYXNoLmZoZWFkW2ldKTsKQEAgLTIxNTksNiArMjE2Niw3IEBACiAKIAluZiA9ICZwYnVmLT5mcmFnX2FycmF5WzBdOwogCXBjaV91bm1hcF9zaW5nbGUocGRldiwgbmYtPmRtYSwgc2tiX2hlYWRsZW4oc2tiKSwgUENJX0RNQV9UT0RFVklDRSk7CisJcGJ1Zi0+c2tiID0gTlVMTDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0yMjc5LDE0ICsyMjg3LDE0IEBACiAJaWYgKHVubGlrZWx5KHFsY25pY190eF9wa3QoYWRhcHRlciwgZmlyc3RfZGVzYywgc2tiKSkpCiAJCWdvdG8gdW53aW5kX2J1ZmY7CiAKLQlpZiAocWxjbmljX21hY19sZWFybikKKwlpZiAoYWRhcHRlci0+bWFjX2xlYXJuKQogCQlxbGNuaWNfc2VuZF9maWx0ZXIoYWRhcHRlciwgdHhfcmluZywgZmlyc3RfZGVzYywgc2tiKTsKIAotCXFsY25pY191cGRhdGVfY21kX3Byb2R1Y2VyKGFkYXB0ZXIsIHR4X3JpbmcpOwotCiAJYWRhcHRlci0+c3RhdHMudHhieXRlcyArPSBza2ItPmxlbjsKIAlhZGFwdGVyLT5zdGF0cy54bWl0Y2FsbGVkKys7CiAKKwlxbGNuaWNfdXBkYXRlX2NtZF9wcm9kdWNlcihhZGFwdGVyLCB0eF9yaW5nKTsKKwogCXJldHVybiBORVRERVZfVFhfT0s7CiAKIHVud2luZF9idWZmOgpAQCAtMjY4MiwxMSArMjY5MCwxNiBAQAogc3RhdGljIGludAogcWxjbmljX2NoZWNrX2Rydl9zdGF0ZShzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaW50IGFjdCwgc3RhdGU7CisJaW50IGFjdCwgc3RhdGUsIGFjdGl2ZV9tYXNrOwogCiAJc3RhdGUgPSBRTENSRDMyKGFkYXB0ZXIsIFFMQ05JQ19DUkJfRFJWX1NUQVRFKTsKIAlhY3QgPSBRTENSRDMyKGFkYXB0ZXIsIFFMQ05JQ19DUkJfRFJWX0FDVElWRSk7CiAKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBRTENOSUNfRldfUkVTRVRfT1dORVIpIHsKKwkJYWN0aXZlX21hc2sgPSAofigxIDw8IChhZGFwdGVyLT5haHctPnBjaV9mdW5jICogNCkpKTsKKwkJYWN0ID0gYWN0ICYgYWN0aXZlX21hc2s7CisJfQorCiAJaWYgKCgoc3RhdGUgJiAweDExMTExMTExKSA9PSAoYWN0ICYgMHgxMTExMTExMSkpIHx8CiAJCQkoKGFjdCAmIDB4MTExMTExMTEpID09ICgoc3RhdGUgPj4gMSkgJiAweDExMTExMTExKSkpCiAJCXJldHVybiAwOwpAQCAtMjc5OSw2ICsyODEyLDcgQEAKIAlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywKIAkJCXN0cnVjdCBxbGNuaWNfYWRhcHRlciwgZndfd29yay53b3JrKTsKIAl1MzIgZGV2X3N0YXRlID0gMHhmOworCXUzMiB2YWw7CiAKIAlpZiAocWxjbmljX2FwaV9sb2NrKGFkYXB0ZXIpKQogCQlnb3RvIGVycl9yZXQ7CkBAIC0yODMzLDEyICsyODQ3LDIyIEBACiAJCQlzZXRfYml0KF9fUUxDTklDX1NUQVJUX0ZXLCAmYWRhcHRlci0+c3RhdGUpOwogCQkJUUxDREIoYWRhcHRlciwgRFJWLCAiUmVzdGFydGluZyBmd1xuIik7CiAJCQlxbGNuaWNfaWRjX2RlYnVnX2luZm8oYWRhcHRlciwgMCk7Ci0JCQlRTENEQihhZGFwdGVyLCBEUlYsICJUYWtlIEZXIGR1bXBcbiIpOwotCQkJcWxjbmljX2R1bXBfZncoYWRhcHRlcik7CisJCQl2YWwgPSBRTENSRDMyKGFkYXB0ZXIsIFFMQ05JQ19DUkJfRFJWX1NUQVRFKTsKKwkJCVFMQ19ERVZfU0VUX1JTVF9SRFkodmFsLCBhZGFwdGVyLT5wb3J0bnVtKTsKKwkJCVFMQ1dSMzIoYWRhcHRlciwgUUxDTklDX0NSQl9EUlZfU1RBVEUsIHZhbCk7CiAJCX0KIAogCQlxbGNuaWNfYXBpX3VubG9jayhhZGFwdGVyKTsKIAorCQlydG5sX2xvY2soKTsKKwkJaWYgKGFkYXB0ZXItPmFody0+ZndfZHVtcC5lbmFibGUgJiYKKwkJICAgIChhZGFwdGVyLT5mbGFncyAmIFFMQ05JQ19GV19SRVNFVF9PV05FUikpIHsKKwkJCVFMQ0RCKGFkYXB0ZXIsIERSViwgIlRha2UgRlcgZHVtcFxuIik7CisJCQlxbGNuaWNfZHVtcF9mdyhhZGFwdGVyKTsKKwkJfQorCQlydG5sX3VubG9jaygpOworCisJCWFkYXB0ZXItPmZsYWdzICY9IH5RTENOSUNfRldfUkVTRVRfT1dORVI7CiAJCWlmICghYWRhcHRlci0+bmljX29wcy0+c3RhcnRfZmlybXdhcmUoYWRhcHRlcikpIHsKIAkJCXFsY25pY19zY2hlZHVsZV93b3JrKGFkYXB0ZXIsIHFsY25pY19hdHRhY2hfd29yaywgMCk7CiAJCQlhZGFwdGVyLT5md193YWl0X2NudCA9IDA7CkBAIC0yODk5LDkgKzI5MjMsMTEgQEAKIAogCWlmIChhZGFwdGVyLT50ZW1wID09IFFMQ05JQ19URU1QX1BBTklDKQogCQlnb3RvIGVycl9yZXQ7Ci0KLQlpZiAocWxjbmljX3NldF9kcnZfc3RhdGUoYWRhcHRlciwgYWRhcHRlci0+ZGV2X3N0YXRlKSkKLQkJZ290byBlcnJfcmV0OworCS8qIERvbnQgYWNrIGlmIHRoaXMgaW5zdGFuY2UgaXMgdGhlIHJlc2V0IG93bmVyICovCisJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBRTENOSUNfRldfUkVTRVRfT1dORVIpKSB7CisJCWlmIChxbGNuaWNfc2V0X2Rydl9zdGF0ZShhZGFwdGVyLCBhZGFwdGVyLT5kZXZfc3RhdGUpKQorCQkJZ290byBlcnJfcmV0OworCX0KIAogCWFkYXB0ZXItPmZ3X3dhaXRfY250ID0gMDsKIApAQCAtMjk0Niw2ICsyOTcyLDcgQEAKIAogCWlmIChzdGF0ZSA9PSBRTENOSUNfREVWX1JFQURZKSB7CiAJCVFMQ1dSMzIoYWRhcHRlciwgUUxDTklDX0NSQl9ERVZfU1RBVEUsIFFMQ05JQ19ERVZfTkVFRF9SRVNFVCk7CisJCWFkYXB0ZXItPmZsYWdzIHw9IFFMQ05JQ19GV19SRVNFVF9PV05FUjsKIAkJUUxDREIoYWRhcHRlciwgRFJWLCAiTkVFRF9SRVNFVCBzdGF0ZSBzZXRcbiIpOwogCQlxbGNuaWNfaWRjX2RlYnVnX2luZm8oYWRhcHRlciwgMCk7CiAJfQpAQCAtNDE3Nyw3ICs0MjA0LDcgQEAKIAlxbGNuaWNfY29uZmlnX2luZGV2X2FkZHIoYWRhcHRlciwgbmV0ZGV2LCBldmVudCk7CiAKIAlmb3JfZWFjaF9zZXRfYml0KHZpZCwgYWRhcHRlci0+dmxhbnMsIFZMQU5fTl9WSUQpIHsKLQkJZGV2ID0gdmxhbl9maW5kX2RldihuZXRkZXYsIHZpZCk7CisJCWRldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwKG5ldGRldiwgdmlkKTsKIAkJaWYgKCFkZXYpCiAJCQljb250aW51ZTsKIAkJcWxjbmljX2NvbmZpZ19pbmRldl9hZGRyKGFkYXB0ZXIsIGRldiwgZXZlbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmggYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaAppbmRleCBkMzI4NTA3Li44NzMxZjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaAorKysgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaApAQCAtNywxNiArNywxOCBAQAogI2lmbmRlZiBfUUxHRV9IXwogI2RlZmluZSBfUUxHRV9IXwogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogCiAvKgogICogR2VuZXJhbCBkZWZpbml0aW9ucy4uLgogICovCiAjZGVmaW5lIERSVl9OQU1FICAJInFsZ2UiCiAjZGVmaW5lIERSVl9TVFJJTkcgCSJRTG9naWMgMTAgR2lnYWJpdCBQQ0ktRSBFdGhlcm5ldCBEcml2ZXIgIgotI2RlZmluZSBEUlZfVkVSU0lPTgkidjEuMDAuMDAuMjcuMDAuMDAtMDEiCisjZGVmaW5lIERSVl9WRVJTSU9OCSJ2MS4wMC4wMC4yOS4wMC4wMC0wMSIKIAogI2RlZmluZSBXUV9BRERSX0FMSUdOCTB4MwkvKiA0IGJ5dGUgYWxpZ25tZW50ICovCiAKQEAgLTE5OTYsNiArMTk5OCw3IEBACiAJUUxfTEJfTElOS19VUCA9IDEwLAogCVFMX0ZSQ19DT1JFRFVNUCA9IDExLAogCVFMX0VFSF9GQVRBTCA9IDEyLAorCVFMX0FTSUNfUkVDT1ZFUlkgPSAxNCwgLyogV2UgYXJlIGluIGFzY2ljIHJlY292ZXJ5LiAqLwogfTsKIAogLyogbGlua19zdGF0dXMgYml0IGRlZmluaXRpb25zICovCkBAIC0yMDUwLDcgKzIwNTMsNyBAQAogCiAJc3RydWN0IG5pY19zdGF0cyBuaWNfc3RhdHM7CiAKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CisJdW5zaWduZWQgbG9uZyBhY3RpdmVfdmxhbnNbQklUU19UT19MT05HUyhWTEFOX05fVklEKV07CiAKIAkvKiBQQ0kgQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBkZXZpY2UgKi8KIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZXRodG9vbC5jCmluZGV4IDE5YjAwZmEuLjliNjdiZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX2V0aHRvb2wuYwpAQCAtNjUwLDggKzY1MCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3RhdHVzID0gcWxfbWJfc2V0X3BvcnRfY2ZnKHFkZXYpOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMKaW5kZXggOTMwYWU0NS4uZjA3ZTk2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jCkBAIC03LDYgKzcsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpAQCAtMzMsOCArMzQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgpAQCAtNDE1LDcgKzQxNiw3IEBACiAJCQkJICAgICAgKHFkZXYtPgogCQkJCSAgICAgICBmdW5jIDw8IENBTV9PVVRfRlVOQ19TSElGVCkgfAogCQkJCQkoMCA8PCBDQU1fT1VUX0NRX0lEX1NISUZUKSk7Ci0JCQlpZiAocWRldi0+dmxncnApCisJCQlpZiAocWRldi0+bmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpCiAJCQkJY2FtX291dHB1dCB8PSBDQU1fT1VUX1JWOwogCQkJLyogcm91dGUgdG8gTklDIGNvcmUgKi8KIAkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfREFUQSwgY2FtX291dHB1dCk7CkBAIC0xNTA3LDEwICsxNTA4LDkgQEAKIAlyeF9yaW5nLT5yeF9ieXRlcyArPSBsZW5ndGg7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcnhfcmluZy0+Y3FfaWQpOwotCWlmIChxZGV2LT52bGdycCAmJiAodmxhbl9pZCAhPSAweGZmZmYpKQotCQl2bGFuX2dyb19mcmFncygmcnhfcmluZy0+bmFwaSwgcWRldi0+dmxncnAsIHZsYW5faWQpOwotCWVsc2UKLQkJbmFwaV9ncm9fZnJhZ3MobmFwaSk7CisJaWYgKHZsYW5faWQgIT0gMHhmZmZmKQorCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdmxhbl9pZCk7CisJbmFwaV9ncm9fZnJhZ3MobmFwaSk7CiB9CiAKIC8qIFByb2Nlc3MgYW4gaW5ib3VuZCBjb21wbGV0aW9uIGZyb20gYW4gcnggcmluZy4gKi8KQEAgLTE1OTQsMTcgKzE1OTQsMTIgQEAKIAl9CiAKIAlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcnhfcmluZy0+Y3FfaWQpOwotCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgewotCQlpZiAocWRldi0+dmxncnAgJiYgKHZsYW5faWQgIT0gMHhmZmZmKSkKLQkJCXZsYW5fZ3JvX3JlY2VpdmUobmFwaSwgcWRldi0+dmxncnAsIHZsYW5faWQsIHNrYik7Ci0JCWVsc2UKLQkJCW5hcGlfZ3JvX3JlY2VpdmUobmFwaSwgc2tiKTsKLQl9IGVsc2UgewotCQlpZiAocWRldi0+dmxncnAgJiYgKHZsYW5faWQgIT0gMHhmZmZmKSkKLQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIHFkZXYtPnZsZ3JwLCB2bGFuX2lkKTsKLQkJZWxzZQotCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLQl9CisJaWYgKHZsYW5faWQgIT0gMHhmZmZmKQorCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdmxhbl9pZCk7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKQorCQluYXBpX2dyb19yZWNlaXZlKG5hcGksIHNrYik7CisJZWxzZQorCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCXJldHVybjsKIGVycl9vdXQ6CiAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKQEAgLTE3MDcsMTggKzE3MDIsMTIgQEAKIAl9CiAKIAlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcnhfcmluZy0+Y3FfaWQpOwotCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgewotCQlpZiAocWRldi0+dmxncnAgJiYgKHZsYW5faWQgIT0gMHhmZmZmKSkKLQkJCXZsYW5fZ3JvX3JlY2VpdmUoJnJ4X3JpbmctPm5hcGksIHFkZXYtPnZsZ3JwLAotCQkJCQkJdmxhbl9pZCwgc2tiKTsKLQkJZWxzZQotCQkJbmFwaV9ncm9fcmVjZWl2ZSgmcnhfcmluZy0+bmFwaSwgc2tiKTsKLQl9IGVsc2UgewotCQlpZiAocWRldi0+dmxncnAgJiYgKHZsYW5faWQgIT0gMHhmZmZmKSkKLQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIHFkZXYtPnZsZ3JwLCB2bGFuX2lkKTsKLQkJZWxzZQotCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLQl9CisJaWYgKHZsYW5faWQgIT0gMHhmZmZmKQorCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdmxhbl9pZCk7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKQorCQluYXBpX2dyb19yZWNlaXZlKCZyeF9yaW5nLT5uYXBpLCBza2IpOworCWVsc2UKKwkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIH0KIAogc3RhdGljIHZvaWQgcWxfcmVhbGlnbl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbikKQEAgLTIwMjgsMjIgKzIwMTcsMTIgQEAKIAlyeF9yaW5nLT5yeF9wYWNrZXRzKys7CiAJcnhfcmluZy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJc2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHJ4X3JpbmctPmNxX2lkKTsKLQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpIHsKLQkJaWYgKHFkZXYtPnZsZ3JwICYmCi0JCQkoaWJfbWFjX3JzcC0+ZmxhZ3MyICYgSUJfTUFDX0lPQ0JfUlNQX1YpICYmCi0JCQkodmxhbl9pZCAhPSAwKSkKLQkJCXZsYW5fZ3JvX3JlY2VpdmUoJnJ4X3JpbmctPm5hcGksIHFkZXYtPnZsZ3JwLAotCQkJCXZsYW5faWQsIHNrYik7Ci0JCWVsc2UKLQkJCW5hcGlfZ3JvX3JlY2VpdmUoJnJ4X3JpbmctPm5hcGksIHNrYik7Ci0JfSBlbHNlIHsKLQkJaWYgKHFkZXYtPnZsZ3JwICYmCi0JCQkoaWJfbWFjX3JzcC0+ZmxhZ3MyICYgSUJfTUFDX0lPQ0JfUlNQX1YpICYmCi0JCQkodmxhbl9pZCAhPSAwKSkKLQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIHFkZXYtPnZsZ3JwLCB2bGFuX2lkKTsKLQkJZWxzZQotCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLQl9CisJaWYgKChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfVikgJiYgKHZsYW5faWQgIT0gMCkpCisJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGFuX2lkKTsKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCisJCW5hcGlfZ3JvX3JlY2VpdmUoJnJ4X3JpbmctPm5hcGksIHNrYik7CisJZWxzZQorCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogfQogCiAvKiBQcm9jZXNzIGFuIGluYm91bmQgY29tcGxldGlvbiBmcm9tIGFuIHJ4IHJpbmcuICovCkBAIC0yMTUyLDYgKzIxMzEsMTAgQEAKIAkgKiB0aHJlYWQKIAkgKi8KIAljbGVhcl9iaXQoUUxfQURBUFRFUl9VUCwgJnFkZXYtPmZsYWdzKTsKKwkvKiBTZXQgYXNpYyByZWNvdmVyeSBiaXQgdG8gaW5kaWNhdGUgcmVzZXQgcHJvY2VzcyB0aGF0IHdlIGFyZQorCSAqIGluIGZhdGFsIGVycm9yIHJlY292ZXJ5IHByb2Nlc3MgcmF0aGVyIHRoYW4gbm9ybWFsIGNsb3NlCisJICovCisJc2V0X2JpdChRTF9BU0lDX1JFQ09WRVJZLCAmcWRldi0+ZmxhZ3MpOwogCXF1ZXVlX2RlbGF5ZWRfd29yayhxZGV2LT53b3JrcXVldWUsICZxZGV2LT5hc2ljX3Jlc2V0X3dvcmssIDApOwogfQogCkBAIC0yMTY2LDIzICsyMTQ5LDIwIEBACiAJCXJldHVybjsKIAogCWNhc2UgQ0FNX0xPT0tVUF9FUlJfRVZFTlQ6Ci0JCW5ldGlmX2VycihxZGV2LCBsaW5rLCBxZGV2LT5uZGV2LAotCQkJICAiTXVsdGlwbGUgQ0FNIGhpdHMgbG9va3VwIG9jY3VycmVkLlxuIik7Ci0JCW5ldGlmX2VycihxZGV2LCBkcnYsIHFkZXYtPm5kZXYsCi0JCQkgICJUaGlzIGV2ZW50IHNob3VsZG4ndCBvY2N1ci5cbiIpOworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJNdWx0aXBsZSBDQU0gaGl0cyBsb29rdXAgb2NjdXJyZWQuXG4iKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAiVGhpcyBldmVudCBzaG91bGRuJ3Qgb2NjdXIuXG4iKTsKIAkJcWxfcXVldWVfYXNpY19lcnJvcihxZGV2KTsKIAkJcmV0dXJuOwogCiAJY2FzZSBTT0ZUX0VDQ19FUlJPUl9FVkVOVDoKLQkJbmV0aWZfZXJyKHFkZXYsIHJ4X2VyciwgcWRldi0+bmRldiwKLQkJCSAgIlNvZnQgRUNDIGVycm9yIGRldGVjdGVkLlxuIik7CisJCW5ldGRldl9lcnIocWRldi0+bmRldiwgIlNvZnQgRUNDIGVycm9yIGRldGVjdGVkLlxuIik7CiAJCXFsX3F1ZXVlX2FzaWNfZXJyb3IocWRldik7CiAJCWJyZWFrOwogCiAJY2FzZSBQQ0lfRVJSX0FOT05fQlVGX1JEOgotCQluZXRpZl9lcnIocWRldiwgcnhfZXJyLCBxZGV2LT5uZGV2LAotCQkJICAiUENJIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhbm9ueW1vdXMgYnVmZmVycyBmcm9tIHJ4X3JpbmcgJWQuXG4iLAotCQkJICBpYl9hZV9yc3AtPnFfaWQpOworCQluZXRkZXZfZXJyKHFkZXYtPm5kZXYsICJQQ0kgZXJyb3Igb2NjdXJyZWQgd2hlbiByZWFkaW5nICIKKwkJCQkJImFub255bW91cyBidWZmZXJzIGZyb20gcnhfcmluZyAlZC5cbiIsCisJCQkJCWliX2FlX3JzcC0+cV9pZCk7CiAJCXFsX3F1ZXVlX2FzaWNfZXJyb3IocWRldik7CiAJCWJyZWFrOwogCkBAIC0yMzMzLDcxICsyMzEzLDExMSBAQAogCXJldHVybiB3b3JrX2RvbmU7CiB9CiAKLXN0YXRpYyB2b2lkIHFsZ2Vfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3N0YXRpYyB2b2lkIHFsZ2Vfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MzIgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAotCXFkZXYtPnZsZ3JwID0gZ3JwOwotCWlmIChncnApIHsKLQkJbmV0aWZfcHJpbnRrKHFkZXYsIGlmdXAsIEtFUk5fREVCVUcsIHFkZXYtPm5kZXYsCisJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKSB7CisJCW5ldGlmX3ByaW50ayhxZGV2LCBpZnVwLCBLRVJOX0RFQlVHLCBuZGV2LAogCQkJICAgICAiVHVybmluZyBvbiBWTEFOIGluIE5JQ19SQ1ZfQ0ZHLlxuIik7CiAJCXFsX3dyaXRlMzIocWRldiwgTklDX1JDVl9DRkcsIE5JQ19SQ1ZfQ0ZHX1ZMQU5fTUFTSyB8Ci0JCQkgICBOSUNfUkNWX0NGR19WTEFOX01BVENIX0FORF9OT04pOworCQkJCSBOSUNfUkNWX0NGR19WTEFOX01BVENIX0FORF9OT04pOwogCX0gZWxzZSB7Ci0JCW5ldGlmX3ByaW50ayhxZGV2LCBpZnVwLCBLRVJOX0RFQlVHLCBxZGV2LT5uZGV2LAorCQluZXRpZl9wcmludGsocWRldiwgaWZ1cCwgS0VSTl9ERUJVRywgbmRldiwKIAkJCSAgICAgIlR1cm5pbmcgb2ZmIFZMQU4gaW4gTklDX1JDVl9DRkcuXG4iKTsKIAkJcWxfd3JpdGUzMihxZGV2LCBOSUNfUkNWX0NGRywgTklDX1JDVl9DRkdfVkxBTl9NQVNLKTsKIAl9CiB9CiAKK3N0YXRpYyB1MzIgcWxnZV9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUzMiBmZWF0dXJlcykKK3sKKwkvKgorCSAqIFNpbmNlIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHJ4L3R4IHZsYW4gYWNjZWwKKwkgKiBlbmFibGUvZGlzYWJsZSBtYWtlIHN1cmUgdHggZmxhZyBpcyBhbHdheXMgaW4gc2FtZSBzdGF0ZSBhcyByeC4KKwkgKi8KKwlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpCisJCWZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWDsKKwllbHNlCisJCWZlYXR1cmVzICY9IH5ORVRJRl9GX0hXX1ZMQU5fVFg7CisKKwlyZXR1cm4gZmVhdHVyZXM7Cit9CisKK3N0YXRpYyBpbnQgcWxnZV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUzMiBmZWF0dXJlcykKK3sKKwl1MzIgY2hhbmdlZCA9IG5kZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisKKwlpZiAoY2hhbmdlZCAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJcWxnZV92bGFuX21vZGUobmRldiwgZmVhdHVyZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fcWxnZV92bGFuX3J4X2FkZF92aWQoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUxNiB2aWQpCit7CisJdTMyIGVuYWJsZV9iaXQgPSBNQUNfQUREUl9FOworCisJaWYgKHFsX3NldF9tYWNfYWRkcl9yZWcKKwkgICAgKHFkZXYsICh1OCAqKSAmZW5hYmxlX2JpdCwgTUFDX0FERFJfVFlQRV9WTEFOLCB2aWQpKSB7CisJCW5ldGlmX2VycihxZGV2LCBpZnVwLCBxZGV2LT5uZGV2LAorCQkJICAiRmFpbGVkIHRvIGluaXQgdmxhbiBhZGRyZXNzLlxuIik7CisJfQorfQorCiBzdGF0aWMgdm9pZCBxbGdlX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXUzMiBlbmFibGVfYml0ID0gTUFDX0FERFJfRTsKIAlpbnQgc3RhdHVzOwogCiAJc3RhdHVzID0gcWxfc2VtX3NwaW5sb2NrKHFkZXYsIFNFTV9NQUNfQUREUl9NQVNLKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm47Ci0JaWYgKHFsX3NldF9tYWNfYWRkcl9yZWcKLQkgICAgKHFkZXYsICh1OCAqKSAmZW5hYmxlX2JpdCwgTUFDX0FERFJfVFlQRV9WTEFOLCB2aWQpKSB7Ci0JCW5ldGlmX2VycihxZGV2LCBpZnVwLCBxZGV2LT5uZGV2LAotCQkJICAiRmFpbGVkIHRvIGluaXQgdmxhbiBhZGRyZXNzLlxuIik7Ci0JfQorCisJX19xbGdlX3ZsYW5fcnhfYWRkX3ZpZChxZGV2LCB2aWQpOworCXNldF9iaXQodmlkLCBxZGV2LT5hY3RpdmVfdmxhbnMpOworCiAJcWxfc2VtX3VubG9jayhxZGV2LCBTRU1fTUFDX0FERFJfTUFTSyk7CiB9CiAKLXN0YXRpYyB2b2lkIHFsZ2Vfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTE2IHZpZCkKK3N0YXRpYyB2b2lkIF9fcWxnZV92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MTYgdmlkKQogewotCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJdTMyIGVuYWJsZV9iaXQgPSAwOwotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBxbF9zZW1fc3BpbmxvY2socWRldiwgU0VNX01BQ19BRERSX01BU0spOwotCWlmIChzdGF0dXMpCi0JCXJldHVybjsKIAogCWlmIChxbF9zZXRfbWFjX2FkZHJfcmVnCiAJICAgIChxZGV2LCAodTggKikgJmVuYWJsZV9iaXQsIE1BQ19BRERSX1RZUEVfVkxBTiwgdmlkKSkgewogCQluZXRpZl9lcnIocWRldiwgaWZ1cCwgcWRldi0+bmRldiwKIAkJCSAgIkZhaWxlZCB0byBjbGVhciB2bGFuIGFkZHJlc3MuXG4iKTsKIAl9Ci0JcWxfc2VtX3VubG9jayhxZGV2LCBTRU1fTUFDX0FERFJfTUFTSyk7Cit9CiAKK3N0YXRpYyB2b2lkIHFsZ2Vfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTE2IHZpZCkKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBxbF9zZW1fc3BpbmxvY2socWRldiwgU0VNX01BQ19BRERSX01BU0spOworCWlmIChzdGF0dXMpCisJCXJldHVybjsKKworCV9fcWxnZV92bGFuX3J4X2tpbGxfdmlkKHFkZXYsIHZpZCk7CisJY2xlYXJfYml0KHZpZCwgcWRldi0+YWN0aXZlX3ZsYW5zKTsKKworCXFsX3NlbV91bmxvY2socWRldiwgU0VNX01BQ19BRERSX01BU0spOwogfQogCiBzdGF0aWMgdm9pZCBxbGdlX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKIHsKLQlxbGdlX3ZsYW5fcnhfcmVnaXN0ZXIocWRldi0+bmRldiwgcWRldi0+dmxncnApOworCWludCBzdGF0dXM7CisJdTE2IHZpZDsKIAotCWlmIChxZGV2LT52bGdycCkgewotCQl1MTYgdmlkOwotCQlmb3IgKHZpZCA9IDA7IHZpZCA8IFZMQU5fTl9WSUQ7IHZpZCsrKSB7Ci0JCQlpZiAoIXZsYW5fZ3JvdXBfZ2V0X2RldmljZShxZGV2LT52bGdycCwgdmlkKSkKLQkJCQljb250aW51ZTsKLQkJCXFsZ2Vfdmxhbl9yeF9hZGRfdmlkKHFkZXYtPm5kZXYsIHZpZCk7Ci0JCX0KLQl9CisJc3RhdHVzID0gcWxfc2VtX3NwaW5sb2NrKHFkZXYsIFNFTV9NQUNfQUREUl9NQVNLKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm47CisKKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgcWRldi0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKQorCQlfX3FsZ2Vfdmxhbl9yeF9hZGRfdmlkKHFkZXYsIHZpZCk7CisKKwlxbF9zZW1fdW5sb2NrKHFkZXYsIFNFTV9NQUNfQUREUl9NQVNLKTsKIH0KIAogLyogTVNJLVggTXVsdGlwbGUgVmVjdG9yIEludGVycnVwdCBIYW5kbGVyIGZvciBpbmJvdW5kIGNvbXBsZXRpb25zLiAqLwpAQCAtMjQzNywxMSArMjQ1NywxMCBAQAogCSAqLwogCWlmICh2YXIgJiBTVFNfRkUpIHsKIAkJcWxfcXVldWVfYXNpY19lcnJvcihxZGV2KTsKLQkJbmV0aWZfZXJyKHFkZXYsIGludHIsIHFkZXYtPm5kZXYsCi0JCQkgICJHb3QgZmF0YWwgZXJyb3IsIFNUUyA9ICV4LlxuIiwgdmFyKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAiR290IGZhdGFsIGVycm9yLCBTVFMgPSAleC5cbiIsIHZhcik7CiAJCXZhciA9IHFsX3JlYWQzMihxZGV2LCBFUlJfU1RTKTsKLQkJbmV0aWZfZXJyKHFkZXYsIGludHIsIHFkZXYtPm5kZXYsCi0JCQkgICJSZXNldHRpbmcgY2hpcC4gRXJyb3IgU3RhdHVzIFJlZ2lzdGVyID0gMHgleFxuIiwgdmFyKTsKKwkJbmV0ZGV2X2VycihxZGV2LT5uZGV2LCAiUmVzZXR0aW5nIGNoaXAuICIKKwkJCQkJIkVycm9yIFN0YXR1cyBSZWdpc3RlciA9IDB4JXhcbiIsIHZhcik7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKQEAgLTMwOTYsNyArMzExNSw3IEBACiAJaWYgKHJ4X3JpbmctPmxicV9sZW4pIHsKIAkJY3FpY2ItPmZsYWdzIHw9IEZMQUdTX0xMOwkvKiBMb2FkIGxicSB2YWx1ZXMgKi8KIAkJdG1wID0gKHU2NClyeF9yaW5nLT5sYnFfYmFzZV9kbWE7Ci0JCWJhc2VfaW5kaXJlY3RfcHRyID0gKF9fbGU2NCAqKSByeF9yaW5nLT5sYnFfYmFzZV9pbmRpcmVjdDsKKwkJYmFzZV9pbmRpcmVjdF9wdHIgPSByeF9yaW5nLT5sYnFfYmFzZV9pbmRpcmVjdDsKIAkJcGFnZV9lbnRyaWVzID0gMDsKIAkJZG8gewogCQkJKmJhc2VfaW5kaXJlY3RfcHRyID0gY3B1X3RvX2xlNjQodG1wKTsKQEAgLTMxMjAsNyArMzEzOSw3IEBACiAJaWYgKHJ4X3JpbmctPnNicV9sZW4pIHsKIAkJY3FpY2ItPmZsYWdzIHw9IEZMQUdTX0xTOwkvKiBMb2FkIHNicSB2YWx1ZXMgKi8KIAkJdG1wID0gKHU2NClyeF9yaW5nLT5zYnFfYmFzZV9kbWE7Ci0JCWJhc2VfaW5kaXJlY3RfcHRyID0gKF9fbGU2NCAqKSByeF9yaW5nLT5zYnFfYmFzZV9pbmRpcmVjdDsKKwkJYmFzZV9pbmRpcmVjdF9wdHIgPSByeF9yaW5nLT5zYnFfYmFzZV9pbmRpcmVjdDsKIAkJcGFnZV9lbnRyaWVzID0gMDsKIAkJZG8gewogCQkJKmJhc2VfaW5kaXJlY3RfcHRyID0gY3B1X3RvX2xlNjQodG1wKTsKQEAgLTM4MTgsMTEgKzM4MzcsMTcgQEAKIAllbmRfamlmZmllcyA9IGppZmZpZXMgKwogCQltYXgoKHVuc2lnbmVkIGxvbmcpMSwgdXNlY3NfdG9famlmZmllcygzMCkpOwogCi0JLyogU3RvcCBtYW5hZ2VtZW50IHRyYWZmaWMuICovCi0JcWxfbWJfc2V0X21nbW50X3RyYWZmaWNfY3RsKHFkZXYsIE1CX1NFVF9NUElfVEZLX1NUT1ApOworCS8qIENoZWNrIGlmIGJpdCBpcyBzZXQgdGhlbiBza2lwIHRoZSBtYWlsYm94IGNvbW1hbmQgYW5kCisJICogY2xlYXIgdGhlIGJpdCwgZWxzZSB3ZSBhcmUgaW4gbm9ybWFsIHJlc2V0IHByb2Nlc3MuCisJICovCisJaWYgKCF0ZXN0X2JpdChRTF9BU0lDX1JFQ09WRVJZLCAmcWRldi0+ZmxhZ3MpKSB7CisJCS8qIFN0b3AgbWFuYWdlbWVudCB0cmFmZmljLiAqLworCQlxbF9tYl9zZXRfbWdtbnRfdHJhZmZpY19jdGwocWRldiwgTUJfU0VUX01QSV9URktfU1RPUCk7CiAKLQkvKiBXYWl0IGZvciB0aGUgTklDIGFuZCBNR01OVCBGSUZPcyB0byBlbXB0eS4gKi8KLQlxbF93YWl0X2ZpZm9fZW1wdHkocWRldik7CisJCS8qIFdhaXQgZm9yIHRoZSBOSUMgYW5kIE1HTU5UIEZJRk9zIHRvIGVtcHR5LiAqLworCQlxbF93YWl0X2ZpZm9fZW1wdHkocWRldik7CisJfSBlbHNlCisJCWNsZWFyX2JpdChRTF9BU0lDX1JFQ09WRVJZLCAmcWRldi0+ZmxhZ3MpOwogCiAJcWxfd3JpdGUzMihxZGV2LCBSU1RfRk8sIChSU1RfRk9fRlIgPDwgMTYpIHwgUlNUX0ZPX0ZSKTsKIApAQCAtNDY1NSw3ICs0NjgwLDggQEAKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IHFsZ2Vfc2V0X21hY19hZGRyZXNzLAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fdHhfdGltZW91dAkJPSBxbGdlX3R4X3RpbWVvdXQsCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gcWxnZV92bGFuX3J4X3JlZ2lzdGVyLAorCS5uZG9fZml4X2ZlYXR1cmVzCT0gcWxnZV9maXhfZmVhdHVyZXMsCisJLm5kb19zZXRfZmVhdHVyZXMJPSBxbGdlX3NldF9mZWF0dXJlcywKIAkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IHFsZ2Vfdmxhbl9yeF9hZGRfdmlkLAogCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IHFsZ2Vfdmxhbl9yeF9raWxsX3ZpZCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9yNjA0MC5jIGIvZHJpdmVycy9uZXQvcjYwNDAuYwppbmRleCAyMDBhMzYzLi5iNjRmY2VlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yNjA0MC5jCisrKyBiL2RyaXZlcnMvbmV0L3I2MDQwLmMKQEAgLTY3Nyw5ICs2NzcsMTEgQEAKIAkJaWYgKHN0YXR1cyAmIFJYX0ZJRk9fRlVMTCkKIAkJCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAotCQkvKiBNYXNrIG9mZiBSWCBpbnRlcnJ1cHQgKi8KLQkJbWlzciAmPSB+UlhfSU5UUzsKLQkJbmFwaV9zY2hlZHVsZSgmbHAtPm5hcGkpOworCQlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmbHAtPm5hcGkpKSkgeworCQkJLyogTWFzayBvZmYgUlggaW50ZXJydXB0ICovCisJCQltaXNyICY9IH5SWF9JTlRTOworCQkJX19uYXBpX3NjaGVkdWxlKCZscC0+bmFwaSk7CisJCX0KIAl9CiAKIAkvKiBUWCBpbnRlcnJ1cHQgcmVxdWVzdCAqLwpAQCAtODM2LDYgKzgzOCw5IEBACiAJZGVzY3B0ci0+YnVmID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUobHAtPnBkZXYsCiAJCXNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpKTsKIAlkZXNjcHRyLT5zdGF0dXMgPSBEU0NfT1dORVJfTUFDOworCisJc2tiX3R4X3RpbWVzdGFtcChza2IpOworCiAJLyogVHJpZ2dlciB0aGUgTUFDIHRvIGNoZWNrIHRoZSBUWCBkZXNjcmlwdG9yICovCiAJaW93cml0ZTE2KDB4MDEsIGlvYWRkciArIE1UUFIpOwogCWxwLT50eF9pbnNlcnRfcHRyID0gZGVzY3B0ci0+dm5kZXNjcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3I4MTY5LmMgYi9kcml2ZXJzL25ldC9yODE2OS5jCmluZGV4IGVmMWNlMmUuLjdkOWM2NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3I4MTY5LmMKKysrIGIvZHJpdmVycy9uZXQvcjgxNjkuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CkBAIC00MCw2ICs0MSw3IEBACiAjZGVmaW5lIEZJUk1XQVJFXzgxNjhEXzIJInJ0bF9uaWMvcnRsODE2OGQtMi5mdyIKICNkZWZpbmUgRklSTVdBUkVfODE2OEVfMQkicnRsX25pYy9ydGw4MTY4ZS0xLmZ3IgogI2RlZmluZSBGSVJNV0FSRV84MTY4RV8yCSJydGxfbmljL3J0bDgxNjhlLTIuZnciCisjZGVmaW5lIEZJUk1XQVJFXzgxNjhFXzMJInJ0bF9uaWMvcnRsODE2OGUtMy5mdyIKICNkZWZpbmUgRklSTVdBUkVfODEwNUVfMQkicnRsX25pYy9ydGw4MTA1ZS0xLmZ3IgogCiAjaWZkZWYgUlRMODE2OV9ERUJVRwpAQCAtNjksOCArNzEsNiBAQAogI2RlZmluZSBNQUNfQUREUl9MRU4JNgogCiAjZGVmaW5lIE1BWF9SRUFEX1JFUVVFU1RfU0hJRlQJMTIKLSNkZWZpbmUgUlhfRklGT19USFJFU0gJNwkvKiA3IG1lYW5zIE5PIHRocmVzaG9sZCwgUnggYnVmZmVyIGxldmVsIGJlZm9yZSBmaXJzdCBQQ0kgeGZlci4gKi8KLSNkZWZpbmUgUlhfRE1BX0JVUlNUCTYJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc2JyBpcyAxMDI0ICovCiAjZGVmaW5lIFRYX0RNQV9CVVJTVAk2CS8qIE1heGltdW0gUENJIGJ1cnN0LCAnNicgaXMgMTAyNCAqLwogI2RlZmluZSBTYWZlTXR1CQkweDFjMjAJLyogLi4uIGFjdHVhbGx5IGxpZmUgc3Vja3MgYmV5b25kIH43ayAqLwogI2RlZmluZSBJbnRlckZyYW1lR2FwCTB4MDMJLyogMyBtZWFucyBJbnRlckZyYW1lR2FwID0gdGhlIHNob3J0ZXN0IG9uZSAqLwpAQCAtMTMyLDYgKzEzMiw3IEBACiAJUlRMX0dJR0FfTUFDX1ZFUl8zMSwKIAlSVExfR0lHQV9NQUNfVkVSXzMyLAogCVJUTF9HSUdBX01BQ19WRVJfMzMsCisJUlRMX0dJR0FfTUFDX1ZFUl8zNCwKIAlSVExfR0lHQV9NQUNfTk9ORSAgID0gMHhmZiwKIH07CiAKQEAgLTIxNSw3ICsyMTYsOSBAQAogCVtSVExfR0lHQV9NQUNfVkVSXzMyXSA9CiAJCV9SKCJSVEw4MTY4ZS84MTExZSIsCVJUTF9URF8xLCBGSVJNV0FSRV84MTY4RV8xKSwKIAlbUlRMX0dJR0FfTUFDX1ZFUl8zM10gPQotCQlfUigiUlRMODE2OGUvODExMWUiLAlSVExfVERfMSwgRklSTVdBUkVfODE2OEVfMikKKwkJX1IoIlJUTDgxNjhlLzgxMTFlIiwJUlRMX1REXzEsIEZJUk1XQVJFXzgxNjhFXzIpLAorCVtSVExfR0lHQV9NQUNfVkVSXzM0XSA9CisJCV9SKCJSVEw4MTY4ZXZsLzgxMTFldmwiLFJUTF9URF8xLCBGSVJNV0FSRV84MTY4RV8zKQogfTsKICN1bmRlZiBfUgogCkBAIC0yNjksMTAgKzI3MiwyMCBAQAogCVR4UG9sbAkJPSAweDM4LAogCUludHJNYXNrCT0gMHgzYywKIAlJbnRyU3RhdHVzCT0gMHgzZSwKLQlUeENvbmZpZwk9IDB4NDAsCi0JUnhDb25maWcJPSAweDQ0LAogCi0jZGVmaW5lIFJUTF9SWF9DT05GSUdfTUFTSwkJMHhmZjdlMTg4MHUKKwlUeENvbmZpZwk9IDB4NDAsCisjZGVmaW5lCVRYQ0ZHX0FVVE9fRklGTwkJCSgxIDw8IDcpCS8qIDgxMTFlLXZsICovCisjZGVmaW5lCVRYQ0ZHX0VNUFRZCQkJKDEgPDwgMTEpCS8qIDgxMTFlLXZsICovCisKKwlSeENvbmZpZwk9IDB4NDQsCisjZGVmaW5lCVJYMTI4X0lOVF9FTgkJCSgxIDw8IDE1KQkvKiA4MTExYyBhbmQgbGF0ZXIgKi8KKyNkZWZpbmUJUlhfTVVMVElfRU4JCQkoMSA8PCAxNCkJLyogODExMWMgb25seSAqLworI2RlZmluZQlSWENGR19GSUZPX1NISUZUCQkxMworCQkJCQkvKiBObyB0aHJlc2hvbGQgYmVmb3JlIGZpcnN0IFBDSSB4ZmVyICovCisjZGVmaW5lCVJYX0ZJRk9fVEhSRVNICQkJKDcgPDwgUlhDRkdfRklGT19TSElGVCkKKyNkZWZpbmUJUlhDRkdfRE1BX1NISUZUCQkJOAorCQkJCQkvKiBVbmxpbWl0ZWQgbWF4aW11bSBQQ0kgYnVyc3QuICovCisjZGVmaW5lCVJYX0RNQV9CVVJTVAkJCSg3IDw8IFJYQ0ZHX0RNQV9TSElGVCkKIAogCVJ4TWlzc2VkCT0gMHg0YywKIAlDZmc5MzQ2CQk9IDB4NTAsCkBAIC0zMjYsMTIgKzMzOSwxMyBAQAogI2RlZmluZQlFUEhZQVJfUkVHX1NISUZUCQkxNgogI2RlZmluZQlFUEhZQVJfREFUQV9NQVNLCQkweGZmZmYKIAlETExQUgkJCT0gMHhkMCwKLSNkZWZpbmUJUE1fU1dJVENICQkJKDEgPDwgNikKKyNkZWZpbmUJUEZNX0VOCQkJCSgxIDw8IDYpCiAJREJHX1JFRwkJCT0gMHhkMSwKICNkZWZpbmUJRklYX05BS18xCQkJKDEgPDwgNCkKICNkZWZpbmUJRklYX05BS18yCQkJKDEgPDwgMykKIAlUV1NJCQkJPSAweGQyLAogCU1DVQkJCT0gMHhkMywKKyNkZWZpbmUJTk9XX0lTX09PQgkJCSgxIDw8IDcpCiAjZGVmaW5lCUVOX05EUAkJCQkoMSA8PCAzKQogI2RlZmluZQlFTl9PT0JfUkVTRVQJCQkoMSA8PCAyKQogCUVGVVNFQVIJCQk9IDB4ZGMsCkBAIC0zNDQsMTggKzM1OCwyMiBAQAogfTsKIAogZW51bSBydGw4MTY4X3JlZ2lzdGVycyB7CisJTEVEX0ZSRVEJCT0gMHgxYSwKKwlFRUVfTEVECQkJPSAweDFiLAogCUVSSURSCQkJPSAweDcwLAogCUVSSUFSCQkJPSAweDc0LAogI2RlZmluZSBFUklBUl9GTEFHCQkJMHg4MDAwMDAwMAogI2RlZmluZSBFUklBUl9XUklURV9DTUQJCQkweDgwMDAwMDAwCiAjZGVmaW5lIEVSSUFSX1JFQURfQ01ECQkJMHgwMDAwMDAwMAogI2RlZmluZSBFUklBUl9BRERSX0JZVEVfQUxJR04JCTQKLSNkZWZpbmUgRVJJQVJfRVhHTUFDCQkJMAotI2RlZmluZSBFUklBUl9NU0lYCQkJMQotI2RlZmluZSBFUklBUl9BU0YJCQkyCiAjZGVmaW5lIEVSSUFSX1RZUEVfU0hJRlQJCTE2Ci0jZGVmaW5lIEVSSUFSX0JZVEVFTgkJCTB4MGYKLSNkZWZpbmUgRVJJQVJfQllURUVOX1NISUZUCQkxMgorI2RlZmluZSBFUklBUl9FWEdNQUMJCQkoMHgwMCA8PCBFUklBUl9UWVBFX1NISUZUKQorI2RlZmluZSBFUklBUl9NU0lYCQkJKDB4MDEgPDwgRVJJQVJfVFlQRV9TSElGVCkKKyNkZWZpbmUgRVJJQVJfQVNGCQkJKDB4MDIgPDwgRVJJQVJfVFlQRV9TSElGVCkKKyNkZWZpbmUgRVJJQVJfTUFTS19TSElGVAkJMTIKKyNkZWZpbmUgRVJJQVJfTUFTS18wMDAxCQkJKDB4MSA8PCBFUklBUl9NQVNLX1NISUZUKQorI2RlZmluZSBFUklBUl9NQVNLXzAwMTEJCQkoMHgzIDw8IEVSSUFSX01BU0tfU0hJRlQpCisjZGVmaW5lIEVSSUFSX01BU0tfMTExMQkJCSgweGYgPDwgRVJJQVJfTUFTS19TSElGVCkKIAlFUEhZX1JYRVJfTlVNCQk9IDB4N2MsCiAJT0NQRFIJCQk9IDB4YjAsCS8qIE9DUCBHUEhZIGFjY2VzcyAqLwogI2RlZmluZSBPQ1BEUl9XUklURV9DTUQJCQkweDgwMDAwMDAwCkBAIC0zNzAsNiArMzg4LDcgQEAKIAlSRFNBUjEJCQk9IDB4ZDAsCS8qIDgxNjhjIG9ubHkuIFVuZG9jdW1lbnRlZCBvbiA4MTY4ZHAgKi8KIAlNSVNDCQkJPSAweGYwLAkvKiA4MTY4ZSBvbmx5LiAqLwogI2RlZmluZSBUWFBMQV9SU1QJCQkoMSA8PCAyOSkKKyNkZWZpbmUgUFdNX0VOCQkJCSgxIDw8IDIyKQogfTsKIAogZW51bSBydGxfcmVnaXN0ZXJfY29udGVudCB7CkBAIC0zOTQsNiArNDEzLDcgQEAKIAlSeENSQwk9ICgxIDw8IDE5KSwKIAogCS8qIENoaXBDbWRCaXRzICovCisJU3RvcFJlcQkJPSAweDgwLAogCUNtZFJlc2V0CT0gMHgxMCwKIAlDbWRSeEVuYgk9IDB4MDgsCiAJQ21kVHhFbmIJPSAweDA0LApAQCAtNDE1LDEwICs0MzUsNyBAQAogCUFjY2VwdE11bHRpY2FzdAk9IDB4MDQsCiAJQWNjZXB0TXlQaHlzCT0gMHgwMiwKIAlBY2NlcHRBbGxQaHlzCT0gMHgwMSwKLQotCS8qIFJ4Q29uZmlnQml0cyAqLwotCVJ4Q2ZnRklGT1NoaWZ0CT0gMTMsCi0JUnhDZmdETUFTaGlmdAk9ICA4LAorI2RlZmluZSBSWF9DT05GSUdfQUNDRVBUX01BU0sJCTB4M2YKIAogCS8qIFR4Q29uZmlnQml0cyAqLwogCVR4SW50ZXJGcmFtZUdhcFNoaWZ0ID0gMjQsCkBAIC02NTgsNyArNjc1LDYgQEAKIAl1bnNpZ25lZCBpbnQgKCpwaHlfcmVzZXRfcGVuZGluZykoc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHApOwogCXVuc2lnbmVkIGludCAoKmxpbmtfb2spKHZvaWQgX19pb21lbSAqKTsKIAlpbnQgKCpkb19pb2N0bCkoc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsIHN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSwgaW50IGNtZCk7Ci0JaW50IHBjaWVfY2FwOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgdGFzazsKIAl1bnNpZ25lZCBmZWF0dXJlczsKIApAQCAtNjY2LDggKzY4MiwxOSBAQAogCXN0cnVjdCBydGw4MTY5X2NvdW50ZXJzIGNvdW50ZXJzOwogCXUzMiBzYXZlZF93b2xvcHRzOwogCi0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLSNkZWZpbmUgUlRMX0ZJUk1XQVJFX1VOS05PV04JRVJSX1BUUigtRUFHQUlOKTsKKwlzdHJ1Y3QgcnRsX2Z3IHsKKwkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKworI2RlZmluZSBSVExfVkVSX1NJWkUJCTMyCisKKwkJY2hhciB2ZXJzaW9uW1JUTF9WRVJfU0laRV07CisKKwkJc3RydWN0IHJ0bF9md19waHlfYWN0aW9uIHsKKwkJCV9fbGUzMiAqY29kZTsKKwkJCXNpemVfdCBzaXplOworCQl9IHBoeV9hY3Rpb247CisJfSAqcnRsX2Z3OworI2RlZmluZSBSVExfRklSTVdBUkVfVU5LTk9XTglFUlJfUFRSKC1FQUdBSU4pCiB9OwogCiBNT0RVTEVfQVVUSE9SKCJSZWFsdGVrIGFuZCB0aGUgTGludXggcjgxNjkgY3JldyA8bmV0ZGV2QHZnZXIua2VybmVsLm9yZz4iKTsKQEAgLTcwMSw5ICs3MjgsNiBAQAogc3RhdGljIHZvaWQgcnRsODE2OV9yeF9jbGVhcihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCk7CiBzdGF0aWMgaW50IHJ0bDgxNjlfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpOwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ0bDgxNjlfcnhfY29uZmlnID0KLQkoUlhfRklGT19USFJFU0ggPDwgUnhDZmdGSUZPU2hpZnQpIHwgKFJYX0RNQV9CVVJTVCA8PCBSeENmZ0RNQVNoaWZ0KTsKLQogc3RhdGljIHUzMiBvY3BfcmVhZChzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwgdTggbWFzaywgdTE2IHJlZykKIHsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CkBAIC03NDIsNyArNzY2LDcgQEAKIAltc2xlZXAoMik7CiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewogCQl1ZGVsYXkoMTAwKTsKLQkJaWYgKCEoUlRMX1IzMihFUklEUikgJiBFUklBUl9GTEFHKSkKKwkJaWYgKCEoUlRMX1IzMihFUklBUikgJiBFUklBUl9GTEFHKSkKIAkJCWJyZWFrOwogCX0KIApAQCAtMTAyNCw2ICsxMDQ4LDQ5IEBACiAJcmV0dXJuIHZhbHVlOwogfQogCitzdGF0aWMKK3ZvaWQgcnRsX2VyaV93cml0ZSh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGFkZHIsIHUzMiBtYXNrLCB1MzIgdmFsLCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCUJVR19PTigoYWRkciAmIDMpIHx8IChtYXNrID09IDApKTsKKwlSVExfVzMyKEVSSURSLCB2YWwpOworCVJUTF9XMzIoRVJJQVIsIEVSSUFSX1dSSVRFX0NNRCB8IHR5cGUgfCBtYXNrIHwgYWRkcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJaWYgKCEoUlRMX1IzMihFUklBUikgJiBFUklBUl9GTEFHKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTAwKTsKKwl9Cit9CisKK3N0YXRpYyB1MzIgcnRsX2VyaV9yZWFkKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgYWRkciwgaW50IHR5cGUpCit7CisJdTMyIHZhbHVlID0gfjB4MDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlSVExfVzMyKEVSSUFSLCBFUklBUl9SRUFEX0NNRCB8IHR5cGUgfCBFUklBUl9NQVNLXzExMTEgfCBhZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoUlRMX1IzMihFUklBUikgJiBFUklBUl9GTEFHKSB7CisJCQl2YWx1ZSA9IFJUTF9SMzIoRVJJRFIpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMCk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZAorcnRsX3cxdzBfZXJpKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgYWRkciwgdTMyIG1hc2ssIHUzMiBwLCB1MzIgbSwgaW50IHR5cGUpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJ0bF9lcmlfcmVhZChpb2FkZHIsIGFkZHIsIHR5cGUpOworCXJ0bF9lcmlfd3JpdGUoaW9hZGRyLCBhZGRyLCBtYXNrLCAodmFsICYgfm0pIHwgcCwgdHlwZSk7Cit9CisKIHN0YXRpYyB1OCBydGw4MTY4ZF9lZnVzZV9yZWFkKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgcmVnX2FkZHIpCiB7CiAJdTggdmFsdWUgPSAweGZmOwpAQCAtMTA0OSwxMyArMTExNiw2IEBACiAJUlRMX1cxNihJbnRyU3RhdHVzLCAweGZmZmYpOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MTY5X2FzaWNfZG93bih2b2lkIF9faW9tZW0gKmlvYWRkcikKLXsKLQlSVExfVzgoQ2hpcENtZCwgMHgwMCk7Ci0JcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKGlvYWRkcik7Ci0JUlRMX1IxNihDUGx1c0NtZCk7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgcnRsODE2OV90YmlfcmVzZXRfcGVuZGluZyhzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKIHsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CkBAIC0xMDkzLDYgKzExNTMsMzkgQEAKIAlydGxfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCB2YWwgJiAweGZmZmYpOwogfQogCitzdGF0aWMgdm9pZCBydGxfbGlua19jaGdfcGF0Y2goc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHApCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0cC0+ZGV2OworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybjsKKworCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8zNCkgeworCQlpZiAoUlRMX1I4KFBIWXN0YXR1cykgJiBfMTAwMGJwc0YpIHsKKwkJCXJ0bF9lcmlfd3JpdGUoaW9hZGRyLCAweDFiYywgRVJJQVJfTUFTS18xMTExLAorCQkJCSAgICAgIDB4MDAwMDAwMTEsIEVSSUFSX0VYR01BQyk7CisJCQlydGxfZXJpX3dyaXRlKGlvYWRkciwgMHgxZGMsIEVSSUFSX01BU0tfMTExMSwKKwkJCQkgICAgICAweDAwMDAwMDA1LCBFUklBUl9FWEdNQUMpOworCQl9IGVsc2UgaWYgKFJUTF9SOChQSFlzdGF0dXMpICYgXzEwMGJwcykgeworCQkJcnRsX2VyaV93cml0ZShpb2FkZHIsIDB4MWJjLCBFUklBUl9NQVNLXzExMTEsCisJCQkJICAgICAgMHgwMDAwMDAxZiwgRVJJQVJfRVhHTUFDKTsKKwkJCXJ0bF9lcmlfd3JpdGUoaW9hZGRyLCAweDFkYywgRVJJQVJfTUFTS18xMTExLAorCQkJCSAgICAgIDB4MDAwMDAwMDUsIEVSSUFSX0VYR01BQyk7CisJCX0gZWxzZSB7CisJCQlydGxfZXJpX3dyaXRlKGlvYWRkciwgMHgxYmMsIEVSSUFSX01BU0tfMTExMSwKKwkJCQkgICAgICAweDAwMDAwMDFmLCBFUklBUl9FWEdNQUMpOworCQkJcnRsX2VyaV93cml0ZShpb2FkZHIsIDB4MWRjLCBFUklBUl9NQVNLXzExMTEsCisJCQkJICAgICAgMHgwMDAwMDAzZiwgRVJJQVJfRVhHTUFDKTsKKwkJfQorCQkvKiBSZXNldCBwYWNrZXQgZmlsdGVyICovCisJCXJ0bF93MXcwX2VyaShpb2FkZHIsIDB4ZGMsIEVSSUFSX01BU0tfMDAwMSwgMHgwMCwgMHgwMSwKKwkJCSAgICAgRVJJQVJfRVhHTUFDKTsKKwkJcnRsX3cxdzBfZXJpKGlvYWRkciwgMHhkYywgRVJJQVJfTUFTS18wMDAxLCAweDAxLCAweDAwLAorCQkJICAgICBFUklBUl9FWEdNQUMpOworCX0KK30KKwogc3RhdGljIHZvaWQgX19ydGw4MTY5X2NoZWNrX2xpbmtfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLAogCQkJCQl2b2lkIF9faW9tZW0gKmlvYWRkciwgYm9vbCBwbSkKQEAgLTExMDEsNiArMTE5NCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKIAlpZiAodHAtPmxpbmtfb2soaW9hZGRyKSkgeworCQlydGxfbGlua19jaGdfcGF0Y2godHApOwogCQkvKiBUaGlzIGlzIHRvIGNhbmNlbCBhIHNjaGVkdWxlZCBzdXNwZW5kIGlmIHRoZXJlJ3Mgb25lLiAqLwogCQlpZiAocG0pCiAJCQlwbV9yZXF1ZXN0X3Jlc3VtZSgmdHAtPnBjaV9kZXYtPmRldik7CkBAIC0xMjIxLDEyICsxMzE1LDE0IEBACiAJCQkJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHJ0bF9mdyAqcnRsX2Z3ID0gdHAtPnJ0bF9mdzsKIAogCXN0cmNweShpbmZvLT5kcml2ZXIsIE1PRFVMRU5BTUUpOwogCXN0cmNweShpbmZvLT52ZXJzaW9uLCBSVEw4MTY5X1ZFUlNJT04pOwogCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUodHAtPnBjaV9kZXYpKTsKLQlzdHJuY3B5KGluZm8tPmZ3X3ZlcnNpb24sIElTX0VSUl9PUl9OVUxMKHRwLT5mdykgPyAiTi9BIiA6Ci0JCXJ0bF9sb29rdXBfZmlybXdhcmVfbmFtZSh0cCksIHNpemVvZihpbmZvLT5md192ZXJzaW9uKSAtIDEpOworCUJVSUxEX0JVR19PTihzaXplb2YoaW5mby0+ZndfdmVyc2lvbikgPCBzaXplb2YocnRsX2Z3LT52ZXJzaW9uKSk7CisJc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sIElTX0VSUl9PUl9OVUxMKHJ0bF9mdykgPyAiTi9BIiA6CisJICAgICAgIHJ0bF9mdy0+dmVyc2lvbik7CiB9CiAKIHN0YXRpYyBpbnQgcnRsODE2OV9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTE2MjEsMTIgKzE3MTcsMTMgQEAKIAkgKgogCSAqIChSVExfUjMyKFR4Q29uZmlnKSAmIDB4NzAwMDAwKSA9PSAweDIwMDAwMCA/IDgxMDFFYiA6IDgxMDFFYwogCSAqLwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX21hY19pbmZvIHsKIAkJdTMyIG1hc2s7CiAJCXUzMiB2YWw7CiAJCWludCBtYWNfdmVyc2lvbjsKIAl9IG1hY19pbmZvW10gPSB7CiAJCS8qIDgxNjhFIGZhbWlseS4gKi8KKwkJeyAweDdjODAwMDAwLCAweDJjODAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzM0IH0sCiAJCXsgMHg3Y2YwMDAwMCwgMHgyYzIwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8zMyB9LAogCQl7IDB4N2NmMDAwMDAsIDB4MmMxMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMzIgfSwKIAkJeyAweDdjODAwMDAwLCAweDJjMDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzMzIH0sCkBAIC0xNjg5LDcgKzE3ODYsOCBAQAogCiAJCS8qIENhdGNoLWFsbCAqLwogCQl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCVJUTF9HSUdBX01BQ19OT05FICAgfQotCX0sICpwID0gbWFjX2luZm87CisJfTsKKwljb25zdCBzdHJ1Y3QgcnRsX21hY19pbmZvICpwID0gbWFjX2luZm87CiAJdTMyIHJlZzsKIAogCXJlZyA9IFJUTF9SMzIoVHhDb25maWcpOwpAQCAtMTc0MCwyMSArMTgzOCw3NSBAQAogI2RlZmluZSBQSFlfREVMQVlfTVMJCTB4ZTAwMDAwMDAKICNkZWZpbmUgUEhZX1dSSVRFX0VSSV9XT1JECTB4ZjAwMDAwMDAKIAotc3RhdGljIHZvaWQKLXJ0bF9waHlfd3JpdGVfZncoc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCitzdHJ1Y3QgZndfaW5mbyB7CisJdTMyCW1hZ2ljOworCWNoYXIJdmVyc2lvbltSVExfVkVSX1NJWkVdOworCV9fbGUzMglmd19zdGFydDsKKwlfX2xlMzIJZndfbGVuOworCXU4CWNoa3N1bTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgRldfT1BDT0RFX1NJWkUJc2l6ZW9mKHR5cGVvZigqKChzdHJ1Y3QgcnRsX2Z3X3BoeV9hY3Rpb24gKikwKS0+Y29kZSkpCisKK3N0YXRpYyBib29sIHJ0bF9md19mb3JtYXRfb2soc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsIHN0cnVjdCBydGxfZncgKnJ0bF9mdykKIHsKLQlfX2xlMzIgKnBoeXRhYmxlID0gKF9fbGUzMiAqKWZ3LT5kYXRhOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0cC0+ZGV2OwotCXNpemVfdCBpbmRleCwgZndfc2l6ZSA9IGZ3LT5zaXplIC8gc2l6ZW9mKCpwaHl0YWJsZSk7Ci0JdTMyIHByZWRhdGEsIGNvdW50OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBydGxfZnctPmZ3OworCXN0cnVjdCBmd19pbmZvICpmd19pbmZvID0gKHN0cnVjdCBmd19pbmZvICopZnctPmRhdGE7CisJc3RydWN0IHJ0bF9md19waHlfYWN0aW9uICpwYSA9ICZydGxfZnctPnBoeV9hY3Rpb247CisJY2hhciAqdmVyc2lvbiA9IHJ0bF9mdy0+dmVyc2lvbjsKKwlib29sIHJjID0gZmFsc2U7CiAKLQlpZiAoZnctPnNpemUgJSBzaXplb2YoKnBoeXRhYmxlKSkgewotCQluZXRpZl9lcnIodHAsIHByb2JlLCBkZXYsICJvZGQgc2l6ZWQgZmlybXdhcmUgJXpkXG4iLCBmdy0+c2l6ZSk7Ci0JCXJldHVybjsKKwlpZiAoZnctPnNpemUgPCBGV19PUENPREVfU0laRSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWZ3X2luZm8tPm1hZ2ljKSB7CisJCXNpemVfdCBpLCBzaXplLCBzdGFydDsKKwkJdTggY2hlY2tzdW0gPSAwOworCisJCWlmIChmdy0+c2l6ZSA8IHNpemVvZigqZndfaW5mbykpCisJCQlnb3RvIG91dDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZnctPnNpemU7IGkrKykKKwkJCWNoZWNrc3VtICs9IGZ3LT5kYXRhW2ldOworCQlpZiAoY2hlY2tzdW0gIT0gMCkKKwkJCWdvdG8gb3V0OworCisJCXN0YXJ0ID0gbGUzMl90b19jcHUoZndfaW5mby0+Zndfc3RhcnQpOworCQlpZiAoc3RhcnQgPiBmdy0+c2l6ZSkKKwkJCWdvdG8gb3V0OworCisJCXNpemUgPSBsZTMyX3RvX2NwdShmd19pbmZvLT5md19sZW4pOworCQlpZiAoc2l6ZSA+IChmdy0+c2l6ZSAtIHN0YXJ0KSAvIEZXX09QQ09ERV9TSVpFKQorCQkJZ290byBvdXQ7CisKKwkJbWVtY3B5KHZlcnNpb24sIGZ3X2luZm8tPnZlcnNpb24sIFJUTF9WRVJfU0laRSk7CisKKwkJcGEtPmNvZGUgPSAoX19sZTMyICopKGZ3LT5kYXRhICsgc3RhcnQpOworCQlwYS0+c2l6ZSA9IHNpemU7CisJfSBlbHNlIHsKKwkJaWYgKGZ3LT5zaXplICUgRldfT1BDT0RFX1NJWkUpCisJCQlnb3RvIG91dDsKKworCQlzdHJsY3B5KHZlcnNpb24sIHJ0bF9sb29rdXBfZmlybXdhcmVfbmFtZSh0cCksIFJUTF9WRVJfU0laRSk7CisKKwkJcGEtPmNvZGUgPSAoX19sZTMyICopZnctPmRhdGE7CisJCXBhLT5zaXplID0gZnctPnNpemUgLyBGV19PUENPREVfU0laRTsKIAl9CisJdmVyc2lvbltSVExfVkVSX1NJWkUgLSAxXSA9IDA7CiAKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBmd19zaXplOyBpbmRleCsrKSB7Ci0JCXUzMiBhY3Rpb24gPSBsZTMyX3RvX2NwdShwaHl0YWJsZVtpbmRleF0pOworCXJjID0gdHJ1ZTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBib29sIHJ0bF9md19kYXRhX29rKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IHJ0bF9md19waHlfYWN0aW9uICpwYSkKK3sKKwlib29sIHJjID0gZmFsc2U7CisJc2l6ZV90IGluZGV4OworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGEtPnNpemU7IGluZGV4KyspIHsKKwkJdTMyIGFjdGlvbiA9IGxlMzJfdG9fY3B1KHBhLT5jb2RlW2luZGV4XSk7CiAJCXUzMiByZWdubyA9IChhY3Rpb24gJiAweDBmZmYwMDAwKSA+PiAxNjsKIAogCQlzd2l0Y2goYWN0aW9uICYgMHhmMDAwMDAwMCkgewpAQCAtMTc3MCwyNSArMTkyMiwyNSBAQAogCiAJCWNhc2UgUEhZX0JKTVBOOgogCQkJaWYgKHJlZ25vID4gaW5kZXgpIHsKLQkJCQluZXRpZl9lcnIodHAsIHByb2JlLCB0cC0+ZGV2LAorCQkJCW5ldGlmX2Vycih0cCwgaWZ1cCwgdHAtPmRldiwKIAkJCQkJICAiT3V0IG9mIHJhbmdlIG9mIGZpcm13YXJlXG4iKTsKLQkJCQlyZXR1cm47CisJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQSFlfUkVBRENPVU5UX0VRX1NLSVA6Ci0JCQlpZiAoaW5kZXggKyAyID49IGZ3X3NpemUpIHsKLQkJCQluZXRpZl9lcnIodHAsIHByb2JlLCB0cC0+ZGV2LAorCQkJaWYgKGluZGV4ICsgMiA+PSBwYS0+c2l6ZSkgeworCQkJCW5ldGlmX2Vycih0cCwgaWZ1cCwgdHAtPmRldiwKIAkJCQkJICAiT3V0IG9mIHJhbmdlIG9mIGZpcm13YXJlXG4iKTsKLQkJCQlyZXR1cm47CisJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQSFlfQ09NUF9FUV9TS0lQTjoKIAkJY2FzZSBQSFlfQ09NUF9ORVFfU0tJUE46CiAJCWNhc2UgUEhZX1NLSVBOOgotCQkJaWYgKGluZGV4ICsgMSArIHJlZ25vID49IGZ3X3NpemUpIHsKLQkJCQluZXRpZl9lcnIodHAsIHByb2JlLCB0cC0+ZGV2LAorCQkJaWYgKGluZGV4ICsgMSArIHJlZ25vID49IHBhLT5zaXplKSB7CisJCQkJbmV0aWZfZXJyKHRwLCBpZnVwLCB0cC0+ZGV2LAogCQkJCQkgICJPdXQgb2YgcmFuZ2Ugb2YgZmlybXdhcmVcbiIpOwotCQkJCXJldHVybjsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWJyZWFrOwogCkBAIC0xNzk2LDE3ICsxOTQ4LDQyIEBACiAJCWNhc2UgUEhZX1dSSVRFX01BQ19CWVRFOgogCQljYXNlIFBIWV9XUklURV9FUklfV09SRDoKIAkJZGVmYXVsdDoKLQkJCW5ldGlmX2Vycih0cCwgcHJvYmUsIHRwLT5kZXYsCisJCQluZXRpZl9lcnIodHAsIGlmdXAsIHRwLT5kZXYsCiAJCQkJICAiSW52YWxpZCBhY3Rpb24gMHglMDh4XG4iLCBhY3Rpb24pOwotCQkJcmV0dXJuOworCQkJZ290byBvdXQ7CiAJCX0KIAl9CisJcmMgPSB0cnVlOworb3V0OgorCXJldHVybiByYzsKK30KIAotCXByZWRhdGEgPSAwOwotCWNvdW50ID0gMDsKK3N0YXRpYyBpbnQgcnRsX2NoZWNrX2Zpcm13YXJlKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCBzdHJ1Y3QgcnRsX2Z3ICpydGxfZncpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5kZXY7CisJaW50IHJjID0gLUVJTlZBTDsKIAotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGZ3X3NpemU7ICkgewotCQl1MzIgYWN0aW9uID0gbGUzMl90b19jcHUocGh5dGFibGVbaW5kZXhdKTsKKwlpZiAoIXJ0bF9md19mb3JtYXRfb2sodHAsIHJ0bF9mdykpIHsKKwkJbmV0aWZfZXJyKHRwLCBpZnVwLCBkZXYsICJpbnZhbGlkIGZpcndtYXJlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHJ0bF9md19kYXRhX29rKHRwLCBkZXYsICZydGxfZnctPnBoeV9hY3Rpb24pKQorCQlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBydGxfcGh5X3dyaXRlX2Z3KHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCBzdHJ1Y3QgcnRsX2Z3ICpydGxfZncpCit7CisJc3RydWN0IHJ0bF9md19waHlfYWN0aW9uICpwYSA9ICZydGxfZnctPnBoeV9hY3Rpb247CisJdTMyIHByZWRhdGEsIGNvdW50OworCXNpemVfdCBpbmRleDsKKworCXByZWRhdGEgPSBjb3VudCA9IDA7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYS0+c2l6ZTsgKSB7CisJCXUzMiBhY3Rpb24gPSBsZTMyX3RvX2NwdShwYS0+Y29kZVtpbmRleF0pOwogCQl1MzIgZGF0YSA9IGFjdGlvbiAmIDB4MDAwMGZmZmY7CiAJCXUzMiByZWdubyA9IChhY3Rpb24gJiAweDBmZmYwMDAwKSA+PiAxNjsKIApAQCAtMTg3OCwxOCArMjA1NSwyMCBAQAogCiBzdGF0aWMgdm9pZCBydGxfcmVsZWFzZV9maXJtd2FyZShzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKIHsKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKHRwLT5mdykpCi0JCXJlbGVhc2VfZmlybXdhcmUodHAtPmZ3KTsKLQl0cC0+ZncgPSBSVExfRklSTVdBUkVfVU5LTk9XTjsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHRwLT5ydGxfZncpKSB7CisJCXJlbGVhc2VfZmlybXdhcmUodHAtPnJ0bF9mdy0+ZncpOworCQlrZnJlZSh0cC0+cnRsX2Z3KTsKKwl9CisJdHAtPnJ0bF9mdyA9IFJUTF9GSVJNV0FSRV9VTktOT1dOOwogfQogCiBzdGF0aWMgdm9pZCBydGxfYXBwbHlfZmlybXdhcmUoc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHApCiB7Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9IHRwLT5mdzsKKwlzdHJ1Y3QgcnRsX2Z3ICpydGxfZncgPSB0cC0+cnRsX2Z3OwogCiAJLyogVE9ETzogcmVsZWFzZSBmaXJtd2FyZSBvbmNlIHJ0bF9waHlfd3JpdGVfZncgc2lnbmFscyBmYWlsdXJlcy4gKi8KLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGZ3KSkKLQkJcnRsX3BoeV93cml0ZV9mdyh0cCwgZncpOworCWlmICghSVNfRVJSX09SX05VTEwocnRsX2Z3KSkKKwkJcnRsX3BoeV93cml0ZV9mdyh0cCwgcnRsX2Z3KTsKIH0KIAogc3RhdGljIHZvaWQgcnRsX2FwcGx5X2Zpcm13YXJlX2NvbmQoc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsIHU4IHJlZywgdTE2IHZhbCkKQEAgLTE5ODEsMTIgKzIxNjAsOSBAQAogc3RhdGljIHZvaWQgcnRsODE2OXNjZF9od19waHlfY29uZmlnX3F1aXJrKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBjaV9kZXY7Ci0JdTE2IHZlbmRvcl9pZCwgZGV2aWNlX2lkOwogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZ2ZW5kb3JfaWQpOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZkZXZpY2VfaWQpOwotCi0JaWYgKCh2ZW5kb3JfaWQgIT0gUENJX1ZFTkRPUl9JRF9HSUdBQllURSkgfHwgKGRldmljZV9pZCAhPSAweGUwMDApKQorCWlmICgocGRldi0+c3Vic3lzdGVtX3ZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0dJR0FCWVRFKSB8fAorCSAgICAocGRldi0+c3Vic3lzdGVtX2RldmljZSAhPSAweGUwMDApKQogCQlyZXR1cm47CiAKIAlydGxfd3JpdGVwaHkodHAsIDB4MWYsIDB4MDAwMSk7CkBAIC0yNTIyLDcgKzI2OTgsNyBAQAogCXJ0bF9wYXRjaHBoeSh0cCwgMHgwZCwgMSA8PCA1KTsKIH0KIAotc3RhdGljIHZvaWQgcnRsODE2OGVfaHdfcGh5X2NvbmZpZyhzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3N0YXRpYyB2b2lkIHJ0bDgxNjhlXzFfaHdfcGh5X2NvbmZpZyhzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKIHsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9yZWcgcGh5X3JlZ19pbml0W10gPSB7CiAJCS8qIEVuYWJsZSBEZWxheSBjYXAgKi8KQEAgLTI1OTUsNiArMjc3MSw5MSBAQAogCXJ0bF93cml0ZXBoeSh0cCwgMHgwZCwgMHgwMDAwKTsKIH0KIAorc3RhdGljIHZvaWQgcnRsODE2OGVfMl9od19waHlfY29uZmlnKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRbXSA9IHsKKwkJLyogRW5hYmxlIERlbGF5IGNhcCAqLworCQl7IDB4MWYsIDB4MDAwNCB9LAorCQl7IDB4MWYsIDB4MDAwNyB9LAorCQl7IDB4MWUsIDB4MDBhYyB9LAorCQl7IDB4MTgsIDB4MDAwNiB9LAorCQl7IDB4MWYsIDB4MDAwMiB9LAorCQl7IDB4MWYsIDB4MDAwMCB9LAorCQl7IDB4MWYsIDB4MDAwMCB9LAorCisJCS8qIENoYW5uZWwgZXN0aW1hdGlvbiBmaW5lIHR1bmUgKi8KKwkJeyAweDFmLCAweDAwMDMgfSwKKwkJeyAweDA5LCAweGEyMGYgfSwKKwkJeyAweDFmLCAweDAwMDAgfSwKKwkJeyAweDFmLCAweDAwMDAgfSwKKworCQkvKiBHcmVlbiBTZXR0aW5nICovCisJCXsgMHgxZiwgMHgwMDA1IH0sCisJCXsgMHgwNSwgMHg4YjViIH0sCisJCXsgMHgwNiwgMHg5MjIyIH0sCisJCXsgMHgwNSwgMHg4YjZkIH0sCisJCXsgMHgwNiwgMHg4MDAwIH0sCisJCXsgMHgwNSwgMHg4Yjc2IH0sCisJCXsgMHgwNiwgMHg4MDAwIH0sCisJCXsgMHgxZiwgMHgwMDAwIH0KKwl9OworCisJcnRsX2FwcGx5X2Zpcm13YXJlKHRwKTsKKworCXJ0bF93cml0ZXBoeV9iYXRjaCh0cCwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworCisJLyogRm9yIDQtY29ybmVyIHBlcmZvcm1hbmNlIGltcHJvdmUgKi8KKwlydGxfd3JpdGVwaHkodHAsIDB4MWYsIDB4MDAwNSk7CisJcnRsX3dyaXRlcGh5KHRwLCAweDA1LCAweDhiODApOworCXJ0bF93MXcwX3BoeSh0cCwgMHgxNywgMHgwMDA2LCAweDAwMDApOworCXJ0bF93cml0ZXBoeSh0cCwgMHgxZiwgMHgwMDAwKTsKKworCS8qIFBIWSBhdXRvIHNwZWVkIGRvd24gKi8KKwlydGxfd3JpdGVwaHkodHAsIDB4MWYsIDB4MDAwNCk7CisJcnRsX3dyaXRlcGh5KHRwLCAweDFmLCAweDAwMDcpOworCXJ0bF93cml0ZXBoeSh0cCwgMHgxZSwgMHgwMDJkKTsKKwlydGxfdzF3MF9waHkodHAsIDB4MTgsIDB4MDAxMCwgMHgwMDAwKTsKKwlydGxfd3JpdGVwaHkodHAsIDB4MWYsIDB4MDAwMik7CisJcnRsX3dyaXRlcGh5KHRwLCAweDFmLCAweDAwMDApOworCXJ0bF93MXcwX3BoeSh0cCwgMHgxNCwgMHg4MDAwLCAweDAwMDApOworCisJLyogaW1wcm92ZSAxME0gRUVFIHdhdmVmb3JtICovCisJcnRsX3dyaXRlcGh5KHRwLCAweDFmLCAweDAwMDUpOworCXJ0bF93cml0ZXBoeSh0cCwgMHgwNSwgMHg4Yjg2KTsKKwlydGxfdzF3MF9waHkodHAsIDB4MDYsIDB4MDAwMSwgMHgwMDAwKTsKKwlydGxfd3JpdGVwaHkodHAsIDB4MWYsIDB4MDAwMCk7CisKKwkvKiBJbXByb3ZlIDItcGFpciBkZXRlY3Rpb24gcGVyZm9ybWFuY2UgKi8KKwlydGxfd3JpdGVwaHkodHAsIDB4MWYsIDB4MDAwNSk7CisJcnRsX3dyaXRlcGh5KHRwLCAweDA1LCAweDhiODUpOworCXJ0bF93MXcwX3BoeSh0cCwgMHgwNiwgMHg0MDAwLCAweDAwMDApOworCXJ0bF93cml0ZXBoeSh0cCwgMHgxZiwgMHgwMDAwKTsKKworCS8qIEVFRSBzZXR0aW5nICovCisJcnRsX3cxdzBfZXJpKHRwLT5tbWlvX2FkZHIsIDB4MWIwLCBFUklBUl9NQVNLXzExMTEsIDB4MDAwMCwgMHgwMDAzLAorCQkgICAgIEVSSUFSX0VYR01BQyk7CisJcnRsX3dyaXRlcGh5KHRwLCAweDFmLCAweDAwMDUpOworCXJ0bF93cml0ZXBoeSh0cCwgMHgwNSwgMHg4Yjg1KTsKKwlydGxfdzF3MF9waHkodHAsIDB4MDYsIDB4MDAwMCwgMHgyMDAwKTsKKwlydGxfd3JpdGVwaHkodHAsIDB4MWYsIDB4MDAwNCk7CisJcnRsX3dyaXRlcGh5KHRwLCAweDFmLCAweDAwMDcpOworCXJ0bF93cml0ZXBoeSh0cCwgMHgxZSwgMHgwMDIwKTsKKwlydGxfdzF3MF9waHkodHAsIDB4MDYsIDB4MDAwMCwgMHgwMTAwKTsKKwlydGxfd3JpdGVwaHkodHAsIDB4MWYsIDB4MDAwMik7CisJcnRsX3dyaXRlcGh5KHRwLCAweDFmLCAweDAwMDApOworCXJ0bF93cml0ZXBoeSh0cCwgMHgwZCwgMHgwMDA3KTsKKwlydGxfd3JpdGVwaHkodHAsIDB4MGUsIDB4MDAzYyk7CisJcnRsX3dyaXRlcGh5KHRwLCAweDBkLCAweDQwMDcpOworCXJ0bF93cml0ZXBoeSh0cCwgMHgwZSwgMHgwMDAwKTsKKwlydGxfd3JpdGVwaHkodHAsIDB4MGQsIDB4MDAwMCk7CisKKwkvKiBHcmVlbiBmZWF0dXJlICovCisJcnRsX3dyaXRlcGh5KHRwLCAweDFmLCAweDAwMDMpOworCXJ0bF93MXcwX3BoeSh0cCwgMHgxOSwgMHgwMDAwLCAweDAwMDEpOworCXJ0bF93MXcwX3BoeSh0cCwgMHgxMCwgMHgwMDAwLCAweDA0MDApOworCXJ0bF93cml0ZXBoeSh0cCwgMHgxZiwgMHgwMDAwKTsKK30KKwogc3RhdGljIHZvaWQgcnRsODEwMmVfaHdfcGh5X2NvbmZpZyhzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKIHsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9yZWcgcGh5X3JlZ19pbml0W10gPSB7CkBAIC0yNzE0LDcgKzI5NzUsMTAgQEAKIAkJYnJlYWs7CiAJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzMyOgogCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8zMzoKLQkJcnRsODE2OGVfaHdfcGh5X2NvbmZpZyh0cCk7CisJCXJ0bDgxNjhlXzFfaHdfcGh5X2NvbmZpZyh0cCk7CisJCWJyZWFrOworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8zNDoKKwkJcnRsODE2OGVfMl9od19waHlfY29uZmlnKHRwKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzEyNCw4ICszMzg4LDEwIEBACiAJCXJ0bF93cml0ZXBoeSh0cCwgMHgxZiwgMHgwMDAwKTsKIAkJcnRsX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwgMHgwMDAwKTsKIAotCQlSVExfVzMyKFJ4Q29uZmlnLCBSVExfUjMyKFJ4Q29uZmlnKSB8Ci0JCQlBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXMpOworCQlpZiAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMzIgfHwKKwkJICAgIHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzMzKQorCQkJUlRMX1czMihSeENvbmZpZywgUlRMX1IzMihSeENvbmZpZykgfCBBY2NlcHRCcm9hZGNhc3QgfAorCQkJCUFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTMyMjAsNiArMzQ4Niw3IEBACiAJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzMxOgogCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8zMjoKIAljYXNlIFJUTF9HSUdBX01BQ19WRVJfMzM6CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzM0OgogCQlvcHMtPmRvd24JPSByODE2OF9wbGxfcG93ZXJfZG93bjsKIAkJb3BzLT51cAkJPSByODE2OF9wbGxfcG93ZXJfdXA7CiAJCWJyZWFrOwpAQCAtMzIzMSw2ICszNDk4LDQ3IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBydGxfaW5pdF9yeGNmZyhzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisKKwlzd2l0Y2ggKHRwLT5tYWNfdmVyc2lvbikgeworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8wMToKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMDI6CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzAzOgorCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8wNDoKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMDU6CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzA2OgorCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xMDoKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTE6CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzEyOgorCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xMzoKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTQ6CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzE1OgorCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xNjoKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTc6CisJCVJUTF9XMzIoUnhDb25maWcsIFJYX0ZJRk9fVEhSRVNIIHwgUlhfRE1BX0JVUlNUKTsKKwkJYnJlYWs7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzE4OgorCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xOToKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjA6CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIxOgorCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8yMjoKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjM6CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzI0OgorCQlSVExfVzMyKFJ4Q29uZmlnLCBSWDEyOF9JTlRfRU4gfCBSWF9NVUxUSV9FTiB8IFJYX0RNQV9CVVJTVCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUTF9XMzIoUnhDb25maWcsIFJYMTI4X0lOVF9FTiB8IFJYX0RNQV9CVVJTVCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9pbml0X3JpbmdfaW5kZXhlcyhzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwl0cC0+ZGlydHlfdHggPSB0cC0+ZGlydHlfcnggPSB0cC0+Y3VyX3R4ID0gdHAtPmN1cl9yeCA9IDA7Cit9CisKIHN0YXRpYyB2b2lkIHJ0bF9od19yZXNldChzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKIHsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CkBAIC0zMjQzLDggKzM1NTEsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKIAkJaWYgKChSVExfUjgoQ2hpcENtZCkgJiBDbWRSZXNldCkgPT0gMCkKIAkJCWJyZWFrOwotCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxKTsKKwkJdWRlbGF5KDEwMCk7CiAJfQorCisJcnRsODE2OV9pbml0X3JpbmdfaW5kZXhlcyh0cCk7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0CkBAIC0zMzQ4LDkgKzM2NTgsMTMgQEAKIAl9CiAJdHAtPm1taW9fYWRkciA9IGlvYWRkcjsKIAotCXRwLT5wY2llX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9FWFApOwotCWlmICghdHAtPnBjaWVfY2FwKQotCQluZXRpZl9pbmZvKHRwLCBwcm9iZSwgZGV2LCAibm8gUENJIEV4cHJlc3MgY2FwYWJpbGl0eVxuIik7CisJaWYgKCFwY2lfaXNfcGNpZShwZGV2KSkKKwkJbmV0aWZfaW5mbyh0cCwgcHJvYmUsIGRldiwgIm5vdCBQQ0kgRXhwcmVzc1xuIik7CisKKwkvKiBJZGVudGlmeSBjaGlwIGF0dGFjaGVkIHRvIGJvYXJkICovCisJcnRsODE2OV9nZXRfbWFjX3ZlcnNpb24odHAsIGRldiwgY2ZnLT5kZWZhdWx0X3Zlcik7CisKKwlydGxfaW5pdF9yeGNmZyh0cCk7CiAKIAlSVExfVzE2KEludHJNYXNrLCAweDAwMDApOwogCkBAIC0zMzYwLDkgKzM2NzQsNiBAQAogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKLQkvKiBJZGVudGlmeSBjaGlwIGF0dGFjaGVkIHRvIGJvYXJkICovCi0JcnRsODE2OV9nZXRfbWFjX3ZlcnNpb24odHAsIGRldiwgY2ZnLT5kZWZhdWx0X3Zlcik7Ci0KIAkvKgogCSAqIFByZXRlbmQgd2UgYXJlIHVzaW5nIFZMQU5zOyBUaGlzIGJ5cGFzc2VzIGEgbmFzdHkgYnVnIHdoZXJlCiAJICogSW50ZXJydXB0cyBzdG9wIGZsb3dpbmcgb24gaGlnaCBsb2FkIG9uIDgxMTBTQ2QgY29udHJvbGxlcnMuCkBAIC0zNDQyLDcgKzM3NTMsNyBAQAogCXRwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKIAl0cC0+dGltZXIuZnVuY3Rpb24gPSBydGw4MTY5X3BoeV90aW1lcjsKIAotCXRwLT5mdyA9IFJUTF9GSVJNV0FSRV9VTktOT1dOOworCXRwLT5ydGxfZncgPSBSVExfRklSTVdBUkVfVU5LTk9XTjsKIAogCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKHJjIDwgMCkKQEAgLTM1MTEsMjUgKzM4MjIsNDggQEAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bF9yZXF1ZXN0X3VuY2FjaGVkX2Zpcm13YXJlKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQoreworCXN0cnVjdCBydGxfZncgKnJ0bF9mdzsKKwljb25zdCBjaGFyICpuYW1lOworCWludCByYyA9IC1FTk9NRU07CisKKwluYW1lID0gcnRsX2xvb2t1cF9maXJtd2FyZV9uYW1lKHRwKTsKKwlpZiAoIW5hbWUpCisJCWdvdG8gb3V0X25vX2Zpcm13YXJlOworCisJcnRsX2Z3ID0ga3phbGxvYyhzaXplb2YoKnJ0bF9mdyksIEdGUF9LRVJORUwpOworCWlmICghcnRsX2Z3KQorCQlnb3RvIGVycl93YXJuOworCisJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZydGxfZnctPmZ3LCBuYW1lLCAmdHAtPnBjaV9kZXYtPmRldik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJfZnJlZTsKKworCXJjID0gcnRsX2NoZWNrX2Zpcm13YXJlKHRwLCBydGxfZncpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyX3JlbGVhc2VfZmlybXdhcmU7CisKKwl0cC0+cnRsX2Z3ID0gcnRsX2Z3Oworb3V0OgorCXJldHVybjsKKworZXJyX3JlbGVhc2VfZmlybXdhcmU6CisJcmVsZWFzZV9maXJtd2FyZShydGxfZnctPmZ3KTsKK2Vycl9mcmVlOgorCWtmcmVlKHJ0bF9mdyk7CitlcnJfd2FybjoKKwluZXRpZl93YXJuKHRwLCBpZnVwLCB0cC0+ZGV2LCAidW5hYmxlIHRvIGxvYWQgZmlybXdhcmUgcGF0Y2ggJXMgKCVkKVxuIiwKKwkJICAgbmFtZSwgcmMpOworb3V0X25vX2Zpcm13YXJlOgorCXRwLT5ydGxfZncgPSBOVUxMOworCWdvdG8gb3V0OworfQorCiBzdGF0aWMgdm9pZCBydGxfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKIHsKLQkvKiBSZXR1cm4gZWFybHkgaWYgdGhlIGZpcm13YXJlIGlzIGFscmVhZHkgbG9hZGVkIC8gY2FjaGVkLiAqLwotCWlmIChJU19FUlIodHAtPmZ3KSkgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCW5hbWUgPSBydGxfbG9va3VwX2Zpcm13YXJlX25hbWUodHApOwotCQlpZiAobmFtZSkgewotCQkJaW50IHJjOwotCi0JCQlyYyA9IHJlcXVlc3RfZmlybXdhcmUoJnRwLT5mdywgbmFtZSwgJnRwLT5wY2lfZGV2LT5kZXYpOwotCQkJaWYgKHJjID49IDApCi0JCQkJcmV0dXJuOwotCi0JCQluZXRpZl93YXJuKHRwLCBpZnVwLCB0cC0+ZGV2LCAidW5hYmxlIHRvIGxvYWQgIgotCQkJCSJmaXJtd2FyZSBwYXRjaCAlcyAoJWQpXG4iLCBuYW1lLCByYyk7Ci0JCX0KLQkJdHAtPmZ3ID0gTlVMTDsKLQl9CisJaWYgKElTX0VSUih0cC0+cnRsX2Z3KSkKKwkJcnRsX3JlcXVlc3RfdW5jYWNoZWRfZmlybXdhcmUodHApOwogfQogCiBzdGF0aWMgaW50IHJ0bDgxNjlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMzYwNCw2ICszOTM4LDEzIEBACiAJZ290byBvdXQ7CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bF9yeF9jbG9zZShzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisKKwlSVExfVzMyKFJ4Q29uZmlnLCBSVExfUjMyKFJ4Q29uZmlnKSAmIH5SWF9DT05GSUdfQUNDRVBUX01BU0spOworfQorCiBzdGF0aWMgdm9pZCBydGw4MTY5X2h3X3Jlc2V0KHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQogewogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKQEAgLTM2MTEsMjggKzM5NTIsMjcgQEAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KIAlydGw4MTY5X2lycV9tYXNrX2FuZF9hY2soaW9hZGRyKTsKIAorCXJ0bF9yeF9jbG9zZSh0cCk7CisKIAlpZiAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMjcgfHwKIAkgICAgdHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMjggfHwKIAkgICAgdHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMzEpIHsKIAkJd2hpbGUgKFJUTF9SOChUeFBvbGwpICYgTlBRKQogCQkJdWRlbGF5KDIwKTsKLQorCX0gZWxzZSBpZiAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMzQpIHsKKwkJd2hpbGUgKCEoUlRMX1IzMihUeENvbmZpZykgJiBUWENGR19FTVBUWSkpCisJCQl1ZGVsYXkoMTAwKTsKKwl9IGVsc2UgeworCQlSVExfVzgoQ2hpcENtZCwgUlRMX1I4KENoaXBDbWQpIHwgU3RvcFJlcSk7CisJCXVkZWxheSgxMDApOwogCX0KIAotCS8qIFJlc2V0IHRoZSBjaGlwc2V0ICovCi0JUlRMX1c4KENoaXBDbWQsIENtZFJlc2V0KTsKLQotCS8qIFBDSSBjb21taXQgKi8KLQlSVExfUjgoQ2hpcENtZCk7CisJcnRsX2h3X3Jlc2V0KHRwKTsKIH0KIAogc3RhdGljIHZvaWQgcnRsX3NldF9yeF90eF9jb25maWdfcmVnaXN0ZXJzKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQogewogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKLQl1MzIgY2ZnID0gcnRsODE2OV9yeF9jb25maWc7Ci0KLQljZmcgfD0gKFJUTF9SMzIoUnhDb25maWcpICYgUlRMX1JYX0NPTkZJR19NQVNLKTsKLQlSVExfVzMyKFJ4Q29uZmlnLCBjZmcpOwogCiAJLyogU2V0IERNQSBidXJzdCBzaXplIGFuZCBJbnRlcmZyYW1lIEdhcCBUaW1lICovCiAJUlRMX1czMihUeENvbmZpZywgKFRYX0RNQV9CVVJTVCA8PCBUeERNQVNoaWZ0KSB8CkBAIC0zNjQzLDggKzM5ODMsNiBAQAogewogCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXJ0bF9od19yZXNldCh0cCk7Ci0KIAl0cC0+aHdfc3RhcnQoZGV2KTsKIAogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CkBAIC0zNjgxLDcgKzQwMTksNyBAQAogCiBzdGF0aWMgdm9pZCBydGw4MTY5X3NldF9tYWdpY19yZWcodm9pZCBfX2lvbWVtICppb2FkZHIsIHVuc2lnbmVkIG1hY192ZXJzaW9uKQogewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2NmZzJfaW5mbyB7CiAJCXUzMiBtYWNfdmVyc2lvbjsKIAkJdTMyIGNsazsKIAkJdTMyIHZhbDsKQEAgLTM2OTAsNyArNDAyOCw4IEBACiAJCXsgUlRMX0dJR0FfTUFDX1ZFUl8wNSwgUENJX0Nsb2NrXzY2TUh6LCAweDAwMGZmZmZmIH0sCiAJCXsgUlRMX0dJR0FfTUFDX1ZFUl8wNiwgUENJX0Nsb2NrXzMzTUh6LCAweDAwZmZmZjAwIH0sIC8vIDgxMTBTQ2UKIAkJeyBSVExfR0lHQV9NQUNfVkVSXzA2LCBQQ0lfQ2xvY2tfNjZNSHosIDB4MDBmZmZmZmYgfQotCX0sICpwID0gY2ZnMl9pbmZvOworCX07CisJY29uc3Qgc3RydWN0IHJ0bF9jZmcyX2luZm8gKnAgPSBjZmcyX2luZm87CiAJdW5zaWduZWQgaW50IGk7CiAJdTMyIGNsazsKIApAQCAtMzcyMSw2ICs0MDYwLDggQEAKIAkgICAgdHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMDQpCiAJCVJUTF9XOChDaGlwQ21kLCBDbWRUeEVuYiB8IENtZFJ4RW5iKTsKIAorCXJ0bF9pbml0X3J4Y2ZnKHRwKTsKKwogCVJUTF9XOChFYXJseVR4VGhyZXMsIE5vRWFybHlUeCk7CiAKIAlydGxfc2V0X3J4X21heF9zaXplKGlvYWRkciwgcnhfYnVmX3N6KTsKQEAgLTM3NzgsOSArNDExOSw3IEBACiAKIHN0YXRpYyB2b2lkIHJ0bF90eF9wZXJmb3JtYW5jZV90d2VhayhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTE2IGZvcmNlKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBjYXAgPSB0cC0+cGNpZV9jYXA7CisJaW50IGNhcCA9IHBjaV9wY2llX2NhcChwZGV2KTsKIAogCWlmIChjYXApIHsKIAkJdTE2IGN0bDsKQEAgLTM4MjgsOSArNDE2Nyw3IEBACiAKIHN0YXRpYyB2b2lkIHJ0bF9kaXNhYmxlX2Nsb2NrX3JlcXVlc3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IGNhcCA9IHRwLT5wY2llX2NhcDsKKwlpbnQgY2FwID0gcGNpX3BjaWVfY2FwKHBkZXYpOwogCiAJaWYgKGNhcCkgewogCQl1MTYgY3RsOwpAQCAtMzg0Myw5ICs0MTgwLDcgQEAKIAogc3RhdGljIHZvaWQgcnRsX2VuYWJsZV9jbG9ja19yZXF1ZXN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBjYXAgPSB0cC0+cGNpZV9jYXA7CisJaW50IGNhcCA9IHBjaV9wY2llX2NhcChwZGV2KTsKIAogCWlmIChjYXApIHsKIAkJdTE2IGN0bDsKQEAgLTQwMzYsOSArNDM3MSw5IEBACiAJcnRsX2VuYWJsZV9jbG9ja19yZXF1ZXN0KHBkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OGUodm9pZCBfX2lvbWVtICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxNjhlXzEodm9pZCBfX2lvbWVtICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXBoeV9pbmZvIGVfaW5mb184MTY4ZVtdID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXBoeV9pbmZvIGVfaW5mb184MTY4ZV8xW10gPSB7CiAJCXsgMHgwMCwgMHgwMjAwLAkweDAxMDAgfSwKIAkJeyAweDAwLCAweDAwMDAsCTB4MDAwNCB9LAogCQl7IDB4MDYsIDB4MDAwMiwJMHgwMDAxIH0sCkBAIC00MDU2LDcgKzQzOTEsNyBAQAogCiAJcnRsX2NzaV9hY2Nlc3NfZW5hYmxlXzIoaW9hZGRyKTsKIAotCXJ0bF9lcGh5X2luaXQoaW9hZGRyLCBlX2luZm9fODE2OGUsIEFSUkFZX1NJWkUoZV9pbmZvXzgxNjhlKSk7CisJcnRsX2VwaHlfaW5pdChpb2FkZHIsIGVfaW5mb184MTY4ZV8xLCBBUlJBWV9TSVpFKGVfaW5mb184MTY4ZV8xKSk7CiAKIAlydGxfdHhfcGVyZm9ybWFuY2VfdHdlYWsocGRldiwgMHg1IDw8IE1BWF9SRUFEX1JFUVVFU1RfU0hJRlQpOwogCkBAIC00MDcxLDYgKzQ0MDYsNDQgQEAKIAlSVExfVzgoQ29uZmlnNSwgUlRMX1I4KENvbmZpZzUpICYgflNwaV9lbik7CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bF9od19zdGFydF84MTY4ZV8yKHZvaWQgX19pb21lbSAqaW9hZGRyLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGVwaHlfaW5mbyBlX2luZm9fODE2OGVfMltdID0geworCQl7IDB4MDksIDB4MDAwMCwJMHgwMDgwIH0sCisJCXsgMHgxOSwgMHgwMDAwLAkweDAyMjQgfQorCX07CisKKwlydGxfY3NpX2FjY2Vzc19lbmFibGVfMShpb2FkZHIpOworCisJcnRsX2VwaHlfaW5pdChpb2FkZHIsIGVfaW5mb184MTY4ZV8yLCBBUlJBWV9TSVpFKGVfaW5mb184MTY4ZV8yKSk7CisKKwlydGxfdHhfcGVyZm9ybWFuY2VfdHdlYWsocGRldiwgMHg1IDw8IE1BWF9SRUFEX1JFUVVFU1RfU0hJRlQpOworCisJcnRsX2VyaV93cml0ZShpb2FkZHIsIDB4YzAsIEVSSUFSX01BU0tfMDAxMSwgMHgwMDAwLCBFUklBUl9FWEdNQUMpOworCXJ0bF9lcmlfd3JpdGUoaW9hZGRyLCAweGI4LCBFUklBUl9NQVNLXzAwMTEsIDB4MDAwMCwgRVJJQVJfRVhHTUFDKTsKKwlydGxfZXJpX3dyaXRlKGlvYWRkciwgMHhjOCwgRVJJQVJfTUFTS18xMTExLCAweDAwMTAwMDAyLCBFUklBUl9FWEdNQUMpOworCXJ0bF9lcmlfd3JpdGUoaW9hZGRyLCAweGU4LCBFUklBUl9NQVNLXzExMTEsIDB4MDAxMDAwMDYsIEVSSUFSX0VYR01BQyk7CisJcnRsX2VyaV93cml0ZShpb2FkZHIsIDB4Y2MsIEVSSUFSX01BU0tfMTExMSwgMHgwMDAwMDA1MCwgRVJJQVJfRVhHTUFDKTsKKwlydGxfZXJpX3dyaXRlKGlvYWRkciwgMHhkMCwgRVJJQVJfTUFTS18xMTExLCAweDA3ZmYwMDYwLCBFUklBUl9FWEdNQUMpOworCXJ0bF93MXcwX2VyaShpb2FkZHIsIDB4MWIwLCBFUklBUl9NQVNLXzAwMDEsIDB4MTAsIDB4MDAsIEVSSUFSX0VYR01BQyk7CisJcnRsX3cxdzBfZXJpKGlvYWRkciwgMHgwZDQsIEVSSUFSX01BU0tfMDAxMSwgMHgwYzAwLCAweGZmMDAsCisJCSAgICAgRVJJQVJfRVhHTUFDKTsKKworCVJUTF9XOChNYXhUeFBhY2tldFNpemUsIDB4MjcpOworCisJcnRsX2Rpc2FibGVfY2xvY2tfcmVxdWVzdChwZGV2KTsKKworCVJUTF9XMzIoVHhDb25maWcsIFJUTF9SMzIoVHhDb25maWcpIHwgVFhDRkdfQVVUT19GSUZPKTsKKwlSVExfVzgoTUNVLCBSVExfUjgoTUNVKSAmIH5OT1dfSVNfT09CKTsKKworCS8qIEFkanVzdCBFRUUgTEVEIGZyZXF1ZW5jeSAqLworCVJUTF9XOChFRUVfTEVELCBSVExfUjgoRUVFX0xFRCkgJiB+MHgwNyk7CisKKwlSVExfVzgoRExMUFIsIFJUTF9SOChETExQUikgfCBQRk1fRU4pOworCVJUTF9XMzIoTUlTQywgUlRMX1IzMihNSVNDKSB8IFBXTV9FTik7CisJUlRMX1c4KENvbmZpZzUsIFJUTF9SOChDb25maWc1KSAmIH5TcGlfZW4pOworfQorCiBzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTQxNTksNyArNDUzMiwxMCBAQAogCiAJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzMyOgogCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8zMzoKLQkJcnRsX2h3X3N0YXJ0XzgxNjhlKGlvYWRkciwgcGRldik7CisJCXJ0bF9od19zdGFydF84MTY4ZV8xKGlvYWRkciwgcGRldik7CisJCWJyZWFrOworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8zNDoKKwkJcnRsX2h3X3N0YXJ0XzgxNjhlXzIoaW9hZGRyLCBwZGV2KTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNDI1Niw3ICs0NjMyLDcgQEAKIAlSVExfVzMyKEZ1bmNFdmVudCwgUlRMX1IzMihGdW5jRXZlbnQpICYgfjB4MDEwMDAwKTsKIAogCVJUTF9XOChNQ1UsIFJUTF9SOChNQ1UpIHwgRU5fTkRQIHwgRU5fT09CX1JFU0VUKTsKLQlSVExfVzgoRExMUFIsIFJUTF9SOChETExQUikgfCBQTV9TV0lUQ0gpOworCVJUTF9XOChETExQUiwgUlRMX1I4KERMTFBSKSB8IFBGTV9FTik7CiAKIAlydGxfZXBoeV9pbml0KGlvYWRkciwgZV9pbmZvXzgxMDVlXzEsIEFSUkFZX1NJWkUoZV9pbmZvXzgxMDVlXzEpKTsKIH0KQEAgLTQyNzUsNyArNDY1MSw3IEBACiAKIAlpZiAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMTMgfHwKIAkgICAgdHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMTYpIHsKLQkJaW50IGNhcCA9IHRwLT5wY2llX2NhcDsKKwkJaW50IGNhcCA9IHBjaV9wY2llX2NhcChwZGV2KTsKIAogCQlpZiAoY2FwKSB7CiAJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgY2FwICsgUENJX0VYUF9ERVZDVEwsCkBAIC00NDU4LDExICs0ODM0LDYgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIHZvaWQgcnRsODE2OV9pbml0X3JpbmdfaW5kZXhlcyhzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKLXsKLQl0cC0+ZGlydHlfdHggPSB0cC0+ZGlydHlfcnggPSB0cC0+Y3VyX3R4ID0gdHAtPmN1cl9yeCA9IDA7Ci19Ci0KIHN0YXRpYyBpbnQgcnRsODE2OV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CkBAIC00NTkwLDcgKzQ5NjEsNyBAQAogCiAJcnRsODE2OV90eF9jbGVhcih0cCk7CiAKLQlydGw4MTY5X2luaXRfcmluZ19pbmRleGVzKHRwKTsKKwlydGw4MTY5X2h3X3Jlc2V0KHRwKTsKIAlydGxfaHdfc3RhcnQoZGV2KTsKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiAJcnRsODE2OV9jaGVja19saW5rX3N0YXR1cyhkZXYsIHRwLCB0cC0+bW1pb19hZGRyKTsKQEAgLTUwMDQsNyArNTM3NSw3IEBACiAJCSAqIHRoZSBjaGlwLCBzbyBqdXN0IGV4aXQgdGhlIGxvb3AuCiAJCSAqLwogCQlpZiAodW5saWtlbHkoIW5ldGlmX3J1bm5pbmcoZGV2KSkpIHsKLQkJCXJ0bDgxNjlfYXNpY19kb3duKGlvYWRkcik7CisJCQlydGw4MTY5X2h3X3Jlc2V0KHRwKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTUxMjcsNyArNTQ5OCw3IEBACiAKIAlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CiAKLQlydGw4MTY5X2FzaWNfZG93bihpb2FkZHIpOworCXJ0bDgxNjlfaHdfcmVzZXQodHApOwogCS8qCiAJICogQXQgdGhpcyBwb2ludCBkZXZpY2UgaW50ZXJydXB0cyBjYW4gbm90IGJlIGVuYWJsZWQgaW4gYW55IGZ1bmN0aW9uLAogCSAqIGFzIG5ldGlmX3J1bm5pbmcgaXMgbm90IHRydWUgKHJ0bDgxNjlfaW50ZXJydXB0LCBydGw4MTY5X3Jlc2V0X3Rhc2ssCkBAIC01MjEwLDggKzU1ODEsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CiAKLQl0bXAgPSBydGw4MTY5X3J4X2NvbmZpZyB8IHJ4X21vZGUgfAotCSAgICAgIChSVExfUjMyKFJ4Q29uZmlnKSAmIFJUTF9SWF9DT05GSUdfTUFTSyk7CisJdG1wID0gKFJUTF9SMzIoUnhDb25maWcpICYgflJYX0NPTkZJR19BQ0NFUFRfTUFTSykgfCByeF9tb2RlOwogCiAJaWYgKHRwLT5tYWNfdmVyc2lvbiA+IFJUTF9HSUdBX01BQ19WRVJfMDYpIHsKIAkJdTMyIGRhdGEgPSBtY19maWx0ZXJbMF07CkBAIC01MzgxLDEzICs1NzUxLDE2IEBACiAKIAlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CiAKLQlydGw4MTY5X2FzaWNfZG93bihpb2FkZHIpOworCXJ0bDgxNjlfaHdfcmVzZXQodHApOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CiAKIAlpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9QT1dFUl9PRkYpIHsKLQkJLyogV29MIGZhaWxzIHdpdGggc29tZSA4MTY4IHdoZW4gdGhlIHJlY2VpdmVyIGlzIGRpc2FibGVkLiAqLwotCQlpZiAodHAtPmZlYXR1cmVzICYgUlRMX0ZFQVRVUkVfV09MKSB7CisJCS8qIFdvTCBmYWlscyB3aXRoIDgxNjhiIHdoZW4gdGhlIHJlY2VpdmVyIGlzIGRpc2FibGVkLiAqLworCQlpZiAoKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzExIHx8CisJCSAgICAgdHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMTIgfHwKKwkJICAgICB0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8xNykgJiYKKwkJICAgICh0cC0+ZmVhdHVyZXMgJiBSVExfRkVBVFVSRV9XT0wpKSB7CiAJCQlwY2lfY2xlYXJfbWFzdGVyKHBkZXYpOwogCiAJCQlSVExfVzgoQ2hpcENtZCwgQ21kUnhFbmIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcmlvbmV0LmMgYi9kcml2ZXJzL25ldC9yaW9uZXQuYwppbmRleCA3N2M1MDkyLi44NmFjMzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yaW9uZXQuYworKysgYi9kcml2ZXJzL25ldC9yaW9uZXQuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAl9CiAKLQlpZiAoZXRoLT5oX2Rlc3RbMF0gJiAweDAxKSB7CisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGV0aC0+aF9kZXN0KSkgewogCQlmb3IgKGkgPSAwOyBpIDwgUklPX01BWF9ST1VURV9FTlRSSUVTKHJuZXQtPm1wb3J0LT5zeXNfc2l6ZSk7CiAJCQkJaSsrKQogCQkJaWYgKHJpb25ldF9hY3RpdmVbaV0pCkBAIC0zNzgsNyArMzc4LDcgQEAKIAogc3RhdGljIHZvaWQgcmlvbmV0X3JlbW92ZShzdHJ1Y3QgcmlvX2RldiAqcmRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSByaW9fZ2V0X2RydmRhdGEocmRldik7CiAJc3RydWN0IHJpb25ldF9wZWVyICpwZWVyLCAqdG1wOwogCiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylyaW9uZXRfYWN0aXZlLCByZGV2LT5uZXQtPmhwb3J0LT5zeXNfc2l6ZSA/CkBAIC00MzMsMjIgKzQzMywxMiBAQAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAogfTsKIAotc3RhdGljIGludCByaW9uZXRfc2V0dXBfbmV0ZGV2KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0KQorc3RhdGljIGludCByaW9uZXRfc2V0dXBfbmV0ZGV2KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlpbnQgcmMgPSAwOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgcmlvbmV0X3ByaXZhdGUgKnJuZXQ7CiAJdTE2IGRldmljZV9pZDsKIAotCS8qIEFsbG9jYXRlIG91ciBuZXRfZGV2aWNlIHN0cnVjdHVyZSAqLwotCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHJpb25ldF9wcml2YXRlKSk7Ci0JaWYgKG5kZXYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogY291bGQgbm90IGFsbG9jYXRlIGV0aGVybmV0IGRldmljZS5cbiIsCi0JCSAgICAgICBEUlZfTkFNRSk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJcmlvbmV0X2FjdGl2ZSA9IChzdHJ1Y3QgcmlvX2RldiAqKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCiAJCQltcG9ydC0+c3lzX3NpemUgPyBfX2ZscyhzaXplb2Yodm9pZCAqKSkgKyA0IDogMCk7CiAJaWYgKCFyaW9uZXRfYWN0aXZlKSB7CkBAIC01MDQsMTEgKzQ5NCwyMSBAQAogCWludCByYyA9IC1FTk9ERVY7CiAJdTMyIGxwZWYsIGxzcmNfb3BzLCBsZHN0X29wczsKIAlzdHJ1Y3QgcmlvbmV0X3BlZXIgKnBlZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBOVUxMOwogCiAJLyogSWYgbG9jYWwgZGV2aWNlIGlzIG5vdCByaW9uZXQgY2FwYWJsZSwgZ2l2ZSB1cCBxdWlja2x5ICovCiAJaWYgKCFyaW9uZXRfY2FwYWJsZSkKIAkJZ290byBvdXQ7CiAKKwkvKiBBbGxvY2F0ZSBvdXIgbmV0X2RldmljZSBzdHJ1Y3R1cmUgKi8KKwluZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCByaW9uZXRfcHJpdmF0ZSkpOworCWlmIChuZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBldGhlcm5ldCBkZXZpY2UuXG4iLAorCQkgICAgICAgRFJWX05BTUUpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwogCS8qCiAJICogRmlyc3QgdGltZSB0aHJvdWdoLCBtYWtlIHN1cmUgbG9jYWwgZGV2aWNlIGlzIHJpb25ldAogCSAqIGNhcGFibGUsIHNldHVwIG5ldGRldiwgIGFuZCBzZXQgZmxhZ3Mgc28gdGhpcyBpcyBza2lwcGVkCkBAIC01MjksNyArNTI5LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJcmMgPSByaW9uZXRfc2V0dXBfbmV0ZGV2KHJkZXYtPm5ldC0+aHBvcnQpOworCQlyYyA9IHJpb25ldF9zZXR1cF9uZXRkZXYocmRldi0+bmV0LT5ocG9ydCwgbmRldik7CiAJCXJpb25ldF9jaGVjayA9IDE7CiAJfQogCkBAIC01NDYsNiArNTQ2LDggQEAKIAkJbGlzdF9hZGRfdGFpbCgmcGVlci0+bm9kZSwgJnJpb25ldF9wZWVycyk7CiAJfQogCisJcmlvX3NldF9kcnZkYXRhKHJkZXYsIG5kZXYpOworCiAgICAgICBvdXQ6CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby5jIGIvZHJpdmVycy9uZXQvczJpby5jCmluZGV4IGRmMGQyYzguLjI3N2Q0OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3MyaW8uYworKysgYi9kcml2ZXJzL25ldC9zMmlvLmMKQEAgLTM1Niw1NiArMzU2LDYgQEAKIAlzcC0+ZGVmX21hY19hZGRyW29mZnNldF0ubWFjX2FkZHJbMF0gPSAodTgpIChtYWNfYWRkciA+PiA0MCk7CiB9CiAKLS8qIEFkZCB0aGUgdmxhbiAqLwotc3RhdGljIHZvaWQgczJpb192bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQotewotCWludCBpOwotCXN0cnVjdCBzMmlvX25pYyAqbmljID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzW01BWF9UWF9GSUZPU107Ci0Jc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnID0gJm5pYy0+Y29uZmlnOwotCXN0cnVjdCBtYWNfaW5mbyAqbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspIHsKLQkJc3RydWN0IGZpZm9faW5mbyAqZmlmbyA9ICZtYWNfY29udHJvbC0+Zmlmb3NbaV07Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmZpZm8tPnR4X2xvY2ssIGZsYWdzW2ldKTsKLQl9Ci0KLQluaWMtPnZsZ3JwID0gZ3JwOwotCi0JZm9yIChpID0gY29uZmlnLT50eF9maWZvX251bSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCXN0cnVjdCBmaWZvX2luZm8gKmZpZm8gPSAmbWFjX2NvbnRyb2wtPmZpZm9zW2ldOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpZm8tPnR4X2xvY2ssIGZsYWdzW2ldKTsKLQl9Ci19Ci0KLS8qIFVucmVnaXN0ZXIgdGhlIHZsYW4gKi8KLXN0YXRpYyB2b2lkIHMyaW9fdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHMyaW9fbmljICpuaWMgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3NbTUFYX1RYX0ZJRk9TXTsKLQlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWcgPSAmbmljLT5jb25maWc7Ci0Jc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOwotCi0JZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgewotCQlzdHJ1Y3QgZmlmb19pbmZvICpmaWZvID0gJm1hY19jb250cm9sLT5maWZvc1tpXTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmlmby0+dHhfbG9jaywgZmxhZ3NbaV0pOwotCX0KLQotCWlmIChuaWMtPnZsZ3JwKQotCQl2bGFuX2dyb3VwX3NldF9kZXZpY2UobmljLT52bGdycCwgdmlkLCBOVUxMKTsKLQotCWZvciAoaSA9IGNvbmZpZy0+dHhfZmlmb19udW0gLSAxOyBpID49IDA7IGktLSkgewotCQlzdHJ1Y3QgZmlmb19pbmZvICpmaWZvID0gJm1hY19jb250cm9sLT5maWZvc1tpXTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaWZvLT50eF9sb2NrLCBmbGFnc1tpXSk7Ci0JfQotfQotCiAvKgogICogQ29uc3RhbnRzIHRvIGJlIHByb2dyYW1tZWQgaW50byB0aGUgWGVuYSdzIHJlZ2lzdGVycywgdG8gY29uZmlndXJlCiAgKiB0aGUgWEFVSS4KQEAgLTg0MSw3ICs3OTEsNyBAQAogCQkJdG1wX3BfYWRkciA9IHJpbmctPnJ4X2Jsb2Nrc1tqXS5ibG9ja19kbWFfYWRkcjsKIAkJCXRtcF9wX2FkZHJfbmV4dCA9IHJpbmctPnJ4X2Jsb2Nrc1tuZXh0XS5ibG9ja19kbWFfYWRkcjsKIAotCQkJcHJlX3J4ZF9ibGsgPSAoc3RydWN0IFJ4RF9ibG9jayAqKXRtcF92X2FkZHI7CisJCQlwcmVfcnhkX2JsayA9IHRtcF92X2FkZHI7CiAJCQlwcmVfcnhkX2Jsay0+cmVzZXJ2ZWRfMl9wTmV4dF9SeERfYmxvY2sgPQogCQkJCSh1bnNpZ25lZCBsb25nKXRtcF92X2FkZHJfbmV4dDsKIAkJCXByZV9yeGRfYmxrLT5wTmV4dF9SeERfQmxrX3BoeXNpY2FsID0KQEAgLTkxOCw3ICs4NjgsNyBAQAogCW1hY19jb250cm9sLT5zdGF0c19tZW1fc3ogPSBzaXplOwogCiAJdG1wX3ZfYWRkciA9IG1hY19jb250cm9sLT5zdGF0c19tZW07Ci0JbWFjX2NvbnRyb2wtPnN0YXRzX2luZm8gPSAoc3RydWN0IHN0YXRfYmxvY2sgKil0bXBfdl9hZGRyOworCW1hY19jb250cm9sLT5zdGF0c19pbmZvID0gdG1wX3ZfYWRkcjsKIAltZW1zZXQodG1wX3ZfYWRkciwgMCwgc2l6ZSk7CiAJREJHX1BSSU5UKElOSVRfREJHLCAiJXM6IFJpbmcgTWVtIFBIWTogMHglbGx4XG4iLAogCQlkZXZfbmFtZSgmbmljLT5wZGV2LT5kZXYpLCAodW5zaWduZWQgbG9uZyBsb25nKXRtcF9wX2FkZHIpOwpAQCAtMjQzOSw3ICsyMzg5LDcgQEAKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmlmby0+dHhfbG9jaywgZmxhZ3MpOwogCQlmb3IgKGogPSAwOyBqIDwgdHhfY2ZnLT5maWZvX2xlbjsgaisrKSB7Ci0JCQl0eGRwID0gKHN0cnVjdCBUeEQgKilmaWZvLT5saXN0X2luZm9bal0ubGlzdF92aXJ0X2FkZHI7CisJCQl0eGRwID0gZmlmby0+bGlzdF9pbmZvW2pdLmxpc3RfdmlydF9hZGRyOwogCQkJc2tiID0gczJpb190eGRsX2dldHNrYigmbWFjX2NvbnRyb2wtPmZpZm9zW2ldLCB0eGRwLCBqKTsKIAkJCWlmIChza2IpIHsKIAkJCQlzd3N0YXRzLT5tZW1fZnJlZWQgKz0gc2tiLT50cnVlc2l6ZTsKQEAgLTMwNzUsOCArMzAyNSw3IEBACiAKIAlnZXRfaW5mbyA9IGZpZm9fZGF0YS0+dHhfY3Vycl9nZXRfaW5mbzsKIAltZW1jcHkoJnB1dF9pbmZvLCAmZmlmb19kYXRhLT50eF9jdXJyX3B1dF9pbmZvLCBzaXplb2YocHV0X2luZm8pKTsKLQl0eGRscCA9IChzdHJ1Y3QgVHhEICopCi0JCWZpZm9fZGF0YS0+bGlzdF9pbmZvW2dldF9pbmZvLm9mZnNldF0ubGlzdF92aXJ0X2FkZHI7CisJdHhkbHAgPSBmaWZvX2RhdGEtPmxpc3RfaW5mb1tnZXRfaW5mby5vZmZzZXRdLmxpc3RfdmlydF9hZGRyOwogCXdoaWxlICgoISh0eGRscC0+Q29udHJvbF8xICYgVFhEX0xJU1RfT1dOX1hFTkEpKSAmJgogCSAgICAgICAoZ2V0X2luZm8ub2Zmc2V0ICE9IHB1dF9pbmZvLm9mZnNldCkgJiYKIAkgICAgICAgKHR4ZGxwLT5Ib3N0X0NvbnRyb2wpKSB7CkBAIC0zMTI5LDggKzMwNzgsNyBAQAogCQlnZXRfaW5mby5vZmZzZXQrKzsKIAkJaWYgKGdldF9pbmZvLm9mZnNldCA9PSBnZXRfaW5mby5maWZvX2xlbiArIDEpCiAJCQlnZXRfaW5mby5vZmZzZXQgPSAwOwotCQl0eGRscCA9IChzdHJ1Y3QgVHhEICopCi0JCQlmaWZvX2RhdGEtPmxpc3RfaW5mb1tnZXRfaW5mby5vZmZzZXRdLmxpc3RfdmlydF9hZGRyOworCQl0eGRscCA9IGZpZm9fZGF0YS0+bGlzdF9pbmZvW2dldF9pbmZvLm9mZnNldF0ubGlzdF92aXJ0X2FkZHI7CiAJCWZpZm9fZGF0YS0+dHhfY3Vycl9nZXRfaW5mby5vZmZzZXQgPSBnZXRfaW5mby5vZmZzZXQ7CiAJfQogCkBAIC00MTExLDcgKzQwNTksNyBAQAogCQkJc3RydWN0IHRjcGhkciAqdGg7CiAJCQlpcCA9IGlwX2hkcihza2IpOwogCi0JCQlpZiAoKGlwLT5mcmFnX29mZiAmIGh0b25zKElQX09GRlNFVHxJUF9NRikpID09IDApIHsKKwkJCWlmICghaXBfaXNfZnJhZ21lbnQoaXApKSB7CiAJCQkJdGggPSAoc3RydWN0IHRjcGhkciAqKSgoKHVuc2lnbmVkIGNoYXIgKilpcCkgKwogCQkJCQkJICAgICAgIGlwLT5paGwqNCk7CiAKQEAgLTQxNjMsNyArNDExMSw3IEBACiAKIAlwdXRfb2ZmID0gKHUxNilmaWZvLT50eF9jdXJyX3B1dF9pbmZvLm9mZnNldDsKIAlnZXRfb2ZmID0gKHUxNilmaWZvLT50eF9jdXJyX2dldF9pbmZvLm9mZnNldDsKLQl0eGRwID0gKHN0cnVjdCBUeEQgKilmaWZvLT5saXN0X2luZm9bcHV0X29mZl0ubGlzdF92aXJ0X2FkZHI7CisJdHhkcCA9IGZpZm8tPmxpc3RfaW5mb1twdXRfb2ZmXS5saXN0X3ZpcnRfYWRkcjsKIAogCXF1ZXVlX2xlbiA9IGZpZm8tPnR4X2N1cnJfcHV0X2luZm8uZmlmb19sZW4gKyAxOwogCS8qIEF2b2lkICJwdXQiIHBvaW50ZXIgZ29pbmcgYmV5b25kICJnZXQiIHBvaW50ZXIgKi8KQEAgLTc3MzksOCArNzY4Nyw2IEBACiAJLm5kb19zZXRfbWFjX2FkZHJlc3MgICAgPSBzMmlvX3NldF9tYWNfYWRkciwKIAkubmRvX2NoYW5nZV9tdHUJICAgCT0gczJpb19jaGFuZ2VfbXR1LAogCS5uZG9fc2V0X2ZlYXR1cmVzCT0gczJpb19zZXRfZmVhdHVyZXMsCi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyICAgPSBzMmlvX3ZsYW5fcnhfcmVnaXN0ZXIsCi0JLm5kb192bGFuX3J4X2tpbGxfdmlkICAgPSBzMmlvX3ZsYW5fcnhfa2lsbF92aWQsCiAJLm5kb190eF90aW1lb3V0CSAgIAk9IHMyaW9fdHhfd2F0Y2hkb2csCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlciAgICA9IHMyaW9fbmV0cG9sbCwKQEAgLTc5NzIsOSArNzkxOCw3IEBACiAKIAkvKiBJbml0aWFsaXppbmcgdGhlIEJBUjEgYWRkcmVzcyBhcyB0aGUgc3RhcnQgb2YgdGhlIEZJRk8gcG9pbnRlci4gKi8KIAlmb3IgKGogPSAwOyBqIDwgTUFYX1RYX0ZJRk9TOyBqKyspIHsKLQkJbWFjX2NvbnRyb2wtPnR4X0ZJRk9fc3RhcnRbal0gPQotCQkJKHN0cnVjdCBUeEZJRk9fZWxlbWVudCBfX2lvbWVtICopCi0JCQkoc3AtPmJhcjEgKyAoaiAqIDB4MDAwMjAwMDApKTsKKwkJbWFjX2NvbnRyb2wtPnR4X0ZJRk9fc3RhcnRbal0gPSBzcC0+YmFyMSArIChqICogMHgwMDAyMDAwMCk7CiAJfQogCiAJLyogIERyaXZlciBlbnRyeSBwb2ludHMgKi8KQEAgLTg2MjEsMTggKzg1NjUsMTIgQEAKIAlzdHJ1Y3QgczJpb19uaWMgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0JaWYgKHNwLT52bGdycCAmJiB2bGFuX3RhZyAmJiAoc3AtPnZsYW5fc3RyaXBfZmxhZykpIHsKLQkJLyogUXVldWVpbmcgdGhlIHZsYW4gZnJhbWUgdG8gdGhlIHVwcGVyIGxheWVyICovCi0JCWlmIChzcC0+Y29uZmlnLm5hcGkpCi0JCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBzcC0+dmxncnAsIHZsYW5fdGFnKTsKLQkJZWxzZQotCQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgc3AtPnZsZ3JwLCB2bGFuX3RhZyk7Ci0JfSBlbHNlIHsKLQkJaWYgKHNwLT5jb25maWcubmFwaSkKLQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Ci0JCWVsc2UKLQkJCW5ldGlmX3J4KHNrYik7Ci0JfQorCWlmICh2bGFuX3RhZyAmJiBzcC0+dmxhbl9zdHJpcF9mbGFnKQorCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdmxhbl90YWcpOworCWlmIChzcC0+Y29uZmlnLm5hcGkpCisJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJZWxzZQorCQluZXRpZl9yeChza2IpOwogfQogCiBzdGF0aWMgdm9pZCBscm9fYXBwZW5kX3BrdChzdHJ1Y3QgczJpb19uaWMgKnNwLCBzdHJ1Y3QgbHJvICpscm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmggYi9kcml2ZXJzL25ldC9zMmlvLmgKaW5kZXggODAwYjNhNC4uZDU1OTY5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5oCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uaApAQCAtOTM5LDcgKzkzOSw2IEBACiAKIAlpbnQgdGFza19mbGFnOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydF90aW1lOwotCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKIAlpbnQgdmxhbl9zdHJpcF9mbGFnOwogI2RlZmluZSBNU0lYX0ZMRyAgICAgICAgICAgICAgICAweEE1CiAJaW50IG51bV9lbnRyaWVzOwpAQCAtOTY4LDggKzk2Nyw4IEBACiAJdTggIHNlcmlhbF9udW1bVlBEX1NUUklOR19MRU5dOwogfTsKIAotI2RlZmluZSBSRVNFVF9FUlJPUiAxOwotI2RlZmluZSBDTURfRVJST1IgICAyOworI2RlZmluZSBSRVNFVF9FUlJPUiAxCisjZGVmaW5lIENNRF9FUlJPUiAgIDIKIAogLyogIE9TIHJlbGF0ZWQgc3lzdGVtIGNhbGxzICovCiAjaWZuZGVmIHJlYWRxCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMgYi9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMKaW5kZXggNjhkNTA0Mi4uZWE2NWY3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYwpAQCAtMjU5Nyw3ICsyNTk3LDcgQEAKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwbGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCUJVR19PTighcmVzKTsKLQlzYm1fYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwlzYm1fYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogCWlmICghc2JtX2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIG1hcCBkZXZpY2UgcmVnaXN0ZXJzXG4iLAogCQkgICAgICAgZGV2X25hbWUoJnBsZGV2LT5kZXYpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NjOTIwMzEuYyBiL2RyaXZlcnMvbmV0L3NjOTIwMzEuYwppbmRleCBmYTc0MzE0Li45ZGE0NzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zYzkyMDMxLmMKKysrIGIvZHJpdmVycy9uZXQvc2M5MjAzMS5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKiBtYXRjaGluZywgc28geW91IG5lZWQgdG8gZW5hYmxlIElGRl9QUk9NSVNDIHdoZW4gdXNpbmcgaXQuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3NmYy9LY29uZmlnCmluZGV4IGE2NWM5ODYuLmEzZDViYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9LY29uZmlnCkBAIC0xLDUgKzEsNSBAQAogY29uZmlnIFNGQwotCXRyaXN0YXRlICJTb2xhcmZsYXJlIFNvbGFyc3Rvcm0gU0ZDNDAwMC9TRkM5MDAwLWZhbWlseSBzdXBwb3J0IgorCXRyaXN0YXRlICJTb2xhcmZsYXJlIFNGQzQwMDAvU0ZDOTAwMC1mYW1pbHkgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBJTkVUCiAJc2VsZWN0IE1ESU8KIAlzZWxlY3QgQ1JDMzIKQEAgLTcsMTMgKzcsMTIgQEAKIAlzZWxlY3QgSTJDX0FMR09CSVQKIAloZWxwCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyAxMC1naWdhYml0IEV0aGVybmV0IGNhcmRzIGJhc2VkIG9uCi0JICB0aGUgU29sYXJmbGFyZSBDb21tdW5pY2F0aW9ucyBTb2xhcnN0b3JtIFNGQzQwMDAgYW5kCi0JICBTRkM5MDAwLWZhbWlseSBjb250cm9sbGVycy4KKwkgIHRoZSBTb2xhcmZsYXJlIFNGQzQwMDAgYW5kIFNGQzkwMDAtZmFtaWx5IGNvbnRyb2xsZXJzLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgVGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc2ZjLgogY29uZmlnIFNGQ19NVEQKLQlib29sICJTb2xhcmZsYXJlIFNvbGFyc3Rvcm0gU0ZDNDAwMC9TRkM5MDAwLWZhbWlseSBNVEQgc3VwcG9ydCIKKwlib29sICJTb2xhcmZsYXJlIFNGQzQwMDAvU0ZDOTAwMC1mYW1pbHkgTVREIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTRkMgJiYgTVREICYmICEoU0ZDPXkgJiYgTVREPW0pCiAJZGVmYXVsdCB5CiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL2VmeC5jIGIvZHJpdmVycy9uZXQvc2ZjL2VmeC5jCmluZGV4IGM5MTQ3MjkuLmZhY2E3NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9lZnguYworKysgYi9kcml2ZXJzL25ldC9zZmMvZWZ4LmMKQEAgLTIyOSw4ICsyMjksNyBAQAogCXN0cnVjdCBlZnhfbmljICplZnggPSBjaGFubmVsLT5lZng7CiAJaW50IHNwZW50OwogCi0JaWYgKHVubGlrZWx5KGVmeC0+cmVzZXRfcGVuZGluZyAhPSBSRVNFVF9UWVBFX05PTkUgfHwKLQkJICAgICAhY2hhbm5lbC0+ZW5hYmxlZCkpCisJaWYgKHVubGlrZWx5KGVmeC0+cmVzZXRfcGVuZGluZyB8fCAhY2hhbm5lbC0+ZW5hYmxlZCkpCiAJCXJldHVybiAwOwogCiAJc3BlbnQgPSBlZnhfbmljX3Byb2Nlc3NfZXZlbnRxKGNoYW5uZWwsIGJ1ZGdldCk7CkBAIC0xNDYxLDcgKzE0NjAsNyBAQAogCSAqIHJlc2V0X3BlbmRpbmcgW21vZGlmaWVkIGZyb20gYW4gYXRvbWljIGNvbnRleHRdLCB3ZSBpbnN0ZWFkIGd1YXJhbnRlZQogCSAqIHRoYXQgZWZ4X21jZGlfbW9kZV9wb2xsKCkgaXNuJ3QgcmV2ZXJ0ZWQgZXJyb25lb3VzbHkgKi8KIAllZnhfbWNkaV9tb2RlX2V2ZW50KGVmeCk7Ci0JaWYgKGVmeC0+cmVzZXRfcGVuZGluZyAhPSBSRVNFVF9UWVBFX05PTkUpCisJaWYgKGVmeC0+cmVzZXRfcGVuZGluZykKIAkJZWZ4X21jZGlfbW9kZV9wb2xsKGVmeCk7CiAKIAkvKiBTdGFydCB0aGUgaGFyZHdhcmUgbW9uaXRvciBpZiB0aGVyZSBpcyBvbmUuIE90aGVyd2lzZSAod2UncmUgbGluawpAQCAtMjExOCw4ICsyMTE3LDEwIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qIEFsbG93IHJlc2V0cyB0byBiZSByZXNjaGVkdWxlZC4gKi8KLQllZngtPnJlc2V0X3BlbmRpbmcgPSBSRVNFVF9UWVBFX05PTkU7CisJLyogQ2xlYXIgZmxhZ3MgZm9yIHRoZSBzY29wZXMgd2UgY292ZXJlZC4gIFdlIGFzc3VtZSB0aGUgTklDIGFuZAorCSAqIGRyaXZlciBhcmUgbm93IHF1aWVzY2VudCBzbyB0aGF0IHRoZXJlIGlzIG5vIHJhY2UgaGVyZS4KKwkgKi8KKwllZngtPnJlc2V0X3BlbmRpbmcgJj0gLSgxIDw8IChtZXRob2QgKyAxKSk7CiAKIAkvKiBSZWluaXRpYWxpc2UgYnVzLW1hc3RlcmluZywgd2hpY2ggbWF5IGhhdmUgYmVlbiB0dXJuZWQgb2ZmIGJlZm9yZQogCSAqIHRoZSByZXNldCB3YXMgc2NoZWR1bGVkLiBUaGlzIGlzIHN0aWxsIGFwcHJvcHJpYXRlLCBldmVuIGluIHRoZQpAQCAtMjE1NCwxMiArMjE1NSwxMyBAQAogc3RhdGljIHZvaWQgZWZ4X3Jlc2V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGVmeF9uaWMsIHJlc2V0X3dvcmspOworCXVuc2lnbmVkIGxvbmcgcGVuZGluZyA9IEFDQ0VTU19PTkNFKGVmeC0+cmVzZXRfcGVuZGluZyk7CiAKLQlpZiAoZWZ4LT5yZXNldF9wZW5kaW5nID09IFJFU0VUX1RZUEVfTk9ORSkKKwlpZiAoIXBlbmRpbmcpCiAJCXJldHVybjsKIAogCS8qIElmIHdlJ3JlIG5vdCBSVU5OSU5HIHRoZW4gZG9uJ3QgcmVzZXQuIExlYXZlIHRoZSByZXNldF9wZW5kaW5nCi0JICogZmxhZyBzZXQgc28gdGhhdCBlZnhfcGNpX3Byb2JlX21haW4gd2lsbCBiZSByZXRyaWVkICovCisJICogZmxhZ3Mgc2V0IHNvIHRoYXQgZWZ4X3BjaV9wcm9iZV9tYWluIHdpbGwgYmUgcmV0cmllZCAqLwogCWlmIChlZngtPnN0YXRlICE9IFNUQVRFX1JVTk5JTkcpIHsKIAkJbmV0aWZfaW5mbyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAogCQkJICAgInNjaGVkdWxlZCByZXNldCBxdWVuY2hlZC4gTklDIG5vdCBSVU5OSU5HXG4iKTsKQEAgLTIxNjcsNyArMjE2OSw3IEBACiAJfQogCiAJcnRubF9sb2NrKCk7Ci0JKHZvaWQpZWZ4X3Jlc2V0KGVmeCwgZWZ4LT5yZXNldF9wZW5kaW5nKTsKKwkodm9pZCllZnhfcmVzZXQoZWZ4LCBmbHMocGVuZGluZykgLSAxKTsKIAlydG5sX3VubG9jaygpOwogfQogCkBAIC0yMTc1LDQwICsyMTc3LDI0IEBACiB7CiAJZW51bSByZXNldF90eXBlIG1ldGhvZDsKIAotCWlmIChlZngtPnJlc2V0X3BlbmRpbmcgIT0gUkVTRVRfVFlQRV9OT05FKSB7Ci0JCW5ldGlmX2luZm8oZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKLQkJCSAgICJxdWVuY2hpbmcgYWxyZWFkeSBzY2hlZHVsZWQgcmVzZXRcbiIpOwotCQlyZXR1cm47Ci0JfQotCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBSRVNFVF9UWVBFX0lOVklTSUJMRToKIAljYXNlIFJFU0VUX1RZUEVfQUxMOgogCWNhc2UgUkVTRVRfVFlQRV9XT1JMRDoKIAljYXNlIFJFU0VUX1RZUEVfRElTQUJMRToKIAkJbWV0aG9kID0gdHlwZTsKKwkJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJzY2hlZHVsaW5nICVzIHJlc2V0XG4iLAorCQkJICBSRVNFVF9UWVBFKG1ldGhvZCkpOwogCQlicmVhazsKLQljYXNlIFJFU0VUX1RZUEVfUlhfUkVDT1ZFUlk6Ci0JY2FzZSBSRVNFVF9UWVBFX1JYX0RFU0NfRkVUQ0g6Ci0JY2FzZSBSRVNFVF9UWVBFX1RYX0RFU0NfRkVUQ0g6Ci0JY2FzZSBSRVNFVF9UWVBFX1RYX1NLSVA6Ci0JCW1ldGhvZCA9IFJFU0VUX1RZUEVfSU5WSVNJQkxFOwotCQlicmVhazsKLQljYXNlIFJFU0VUX1RZUEVfTUNfRkFJTFVSRToKIAlkZWZhdWx0OgotCQltZXRob2QgPSBSRVNFVF9UWVBFX0FMTDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKG1ldGhvZCAhPSB0eXBlKQorCQltZXRob2QgPSBlZngtPnR5cGUtPm1hcF9yZXNldF9yZWFzb24odHlwZSk7CiAJCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAogCQkJICAic2NoZWR1bGluZyAlcyByZXNldCBmb3IgJXNcbiIsCiAJCQkgIFJFU0VUX1RZUEUobWV0aG9kKSwgUkVTRVRfVFlQRSh0eXBlKSk7Ci0JZWxzZQotCQluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgInNjaGVkdWxpbmcgJXMgcmVzZXRcbiIsCi0JCQkgIFJFU0VUX1RZUEUobWV0aG9kKSk7CisJCWJyZWFrOworCX0KIAotCWVmeC0+cmVzZXRfcGVuZGluZyA9IG1ldGhvZDsKKwlzZXRfYml0KG1ldGhvZCwgJmVmeC0+cmVzZXRfcGVuZGluZyk7CiAKIAkvKiBlZnhfcHJvY2Vzc19jaGFubmVsKCkgd2lsbCBubyBsb25nZXIgcmVhZCBldmVudHMgb25jZSBhCiAJICogcmVzZXQgaXMgc2NoZWR1bGVkLiBTbyBzd2l0Y2ggYmFjayB0byBwb2xsJ2QgTUNESSBjb21wbGV0aW9ucy4gKi8KQEAgLTIyODgsNyArMjI3NCw2IEBACiAJZWZ4LT5wY2lfZGV2ID0gcGNpX2RldjsKIAllZngtPm1zZ19lbmFibGUgPSBkZWJ1ZzsKIAllZngtPnN0YXRlID0gU1RBVEVfSU5JVDsKLQllZngtPnJlc2V0X3BlbmRpbmcgPSBSRVNFVF9UWVBFX05PTkU7CiAJc3RybGNweShlZngtPm5hbWUsIHBjaV9uYW1lKHBjaV9kZXYpLCBzaXplb2YoZWZ4LT5uYW1lKSk7CiAKIAllZngtPm5ldF9kZXYgPSBuZXRfZGV2OwpAQCAtMjQ5MSw3ICsyNDc2LDcgQEAKIAkJZ290byBmYWlsMTsKIAogCW5ldGlmX2luZm8oZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAotCQkgICAiU29sYXJmbGFyZSBDb21tdW5pY2F0aW9ucyBOSUMgZGV0ZWN0ZWRcbiIpOworCQkgICAiU29sYXJmbGFyZSBOSUMgZGV0ZWN0ZWRcbiIpOwogCiAJLyogU2V0IHVwIGJhc2ljIEkvTyAoQkFSIG1hcHBpbmdzIGV0YykgKi8KIAlyYyA9IGVmeF9pbml0X2lvKGVmeCk7CkBAIC0yNTEwLDcgKzI0OTUsNyBAQAogCQljYW5jZWxfd29ya19zeW5jKCZlZngtPnJlc2V0X3dvcmspOwogCiAJCWlmIChyYyA9PSAwKSB7Ci0JCQlpZiAoZWZ4LT5yZXNldF9wZW5kaW5nICE9IFJFU0VUX1RZUEVfTk9ORSkgeworCQkJaWYgKGVmeC0+cmVzZXRfcGVuZGluZykgewogCQkJCS8qIElmIHRoZXJlIHdhcyBhIHNjaGVkdWxlZCByZXNldCBkdXJpbmcKIAkJCQkgKiBwcm9iZSwgdGhlIE5JQyBpcyBwcm9iYWJseSBob3NlZCBhbnl3YXkgKi8KIAkJCQllZnhfcGNpX3JlbW92ZV9tYWluKGVmeCk7CkBAIC0yNTIxLDExICsyNTA2LDEyIEBACiAJCX0KIAogCQkvKiBSZXRyeSBpZiBhIHJlY292ZXJhYmx5IHJlc2V0IGV2ZW50IGhhcyBiZWVuIHNjaGVkdWxlZCAqLwotCQlpZiAoKGVmeC0+cmVzZXRfcGVuZGluZyAhPSBSRVNFVF9UWVBFX0lOVklTSUJMRSkgJiYKLQkJICAgIChlZngtPnJlc2V0X3BlbmRpbmcgIT0gUkVTRVRfVFlQRV9BTEwpKQorCQlpZiAoZWZ4LT5yZXNldF9wZW5kaW5nICYKKwkJICAgIH4oMSA8PCBSRVNFVF9UWVBFX0lOVklTSUJMRSB8IDEgPDwgUkVTRVRfVFlQRV9BTEwpIHx8CisJCSAgICAhZWZ4LT5yZXNldF9wZW5kaW5nKQogCQkJZ290byBmYWlsMzsKIAotCQllZngtPnJlc2V0X3BlbmRpbmcgPSBSRVNFVF9UWVBFX05PTkU7CisJCWVmeC0+cmVzZXRfcGVuZGluZyA9IDA7CiAJfQogCiAJaWYgKHJjKSB7CkBAIC0yNjA5LDcgKzI1OTUsNyBAQAogCiAJZWZ4LT50eXBlLT5maW5pKGVmeCk7CiAKLQllZngtPnJlc2V0X3BlbmRpbmcgPSBSRVNFVF9UWVBFX05PTkU7CisJZWZ4LT5yZXNldF9wZW5kaW5nID0gMDsKIAogCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOwogCXJldHVybiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EM2hvdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZW51bS5oIGIvZHJpdmVycy9uZXQvc2ZjL2VudW0uaAppbmRleCAzODRjZmUzLi5kNzI1YThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvZW51bS5oCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9lbnVtLmgKQEAgLTEzNCw2ICsxMzQsOCBAQAogICogb3RoZXIgdmFsdWVzc3BlY2lmeSByZWFzb25zLCB3aGljaCBlZnhfc2NoZWR1bGVfcmVzZXQoKSB3aWxsIGNob29zZQogICogYSBtZXRob2QgZm9yLgogICoKKyAqIFJlc2V0IG1ldGhvZHMgYXJlIG51bWJlcmVkIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgc2NvcGUuCisgKgogICogQFJFU0VUX1RZUEVfSU5WSVNJQkxFOiBkb24ndCByZXNldCB0aGUgUEhZcyBvciBpbnRlcnJ1cHRzCiAgKiBAUkVTRVRfVFlQRV9BTEw6IHJlc2V0IGV2ZXJ5dGhpbmcgYnV0IFBDSSBjb3JlIGJsb2NrcwogICogQFJFU0VUX1RZUEVfV09STEQ6IHJlc2V0IGV2ZXJ5dGhpbmcsIHNhdmUgJiByZXN0b3JlIFBDSSBjb25maWcKQEAgLTE0Nyw3ICsxNDksNiBAQAogICogQFJFU0VUX1RZUEVfTUNfRkFJTFVSRTogTUMgcmVib290L2Fzc2VydGlvbgogICovCiBlbnVtIHJlc2V0X3R5cGUgewotCVJFU0VUX1RZUEVfTk9ORSA9IC0xLAogCVJFU0VUX1RZUEVfSU5WSVNJQkxFID0gMCwKIAlSRVNFVF9UWVBFX0FMTCA9IDEsCiAJUkVTRVRfVFlQRV9XT1JMRCA9IDIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvc2ZjL2V0aHRvb2wuYwppbmRleCBkMjI5MDI3Li5iYzQ2NDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9ldGh0b29sLmMKQEAgLTc5NiwzMCArNzk2LDEzIEBACiBzdGF0aWMgaW50IGVmeF9ldGh0b29sX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCB1MzIgKmZsYWdzKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQllbnVtIHJlc2V0X3R5cGUgbWV0aG9kOwotCWVudW0gewotCQlFVEhfUkVTRVRfRUZYX0lOVklTSUJMRSA9IChFVEhfUkVTRVRfRE1BIHwgRVRIX1JFU0VUX0ZJTFRFUiB8Ci0JCQkJCSAgIEVUSF9SRVNFVF9PRkZMT0FEIHwgRVRIX1JFU0VUX01BQykKLQl9OworCWludCByYzsKIAotCS8qIENoZWNrIGZvciBtaW5pbWFsIHJlc2V0IGZsYWdzICovCi0JaWYgKCgqZmxhZ3MgJiBFVEhfUkVTRVRfRUZYX0lOVklTSUJMRSkgIT0gRVRIX1JFU0VUX0VGWF9JTlZJU0lCTEUpCi0JCXJldHVybiAtRUlOVkFMOwotCSpmbGFncyBePSBFVEhfUkVTRVRfRUZYX0lOVklTSUJMRTsKLQltZXRob2QgPSBSRVNFVF9UWVBFX0lOVklTSUJMRTsKKwlyYyA9IGVmeC0+dHlwZS0+bWFwX3Jlc2V0X2ZsYWdzKGZsYWdzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CiAKLQlpZiAoKmZsYWdzICYgRVRIX1JFU0VUX1BIWSkgewotCQkqZmxhZ3MgXj0gRVRIX1JFU0VUX1BIWTsKLQkJbWV0aG9kID0gUkVTRVRfVFlQRV9BTEw7Ci0JfQotCi0JaWYgKCgqZmxhZ3MgJiBlZngtPnR5cGUtPnJlc2V0X3dvcmxkX2ZsYWdzKSA9PQotCSAgICBlZngtPnR5cGUtPnJlc2V0X3dvcmxkX2ZsYWdzKSB7Ci0JCSpmbGFncyBePSBlZngtPnR5cGUtPnJlc2V0X3dvcmxkX2ZsYWdzOwotCQltZXRob2QgPSBSRVNFVF9UWVBFX1dPUkxEOwotCX0KLQotCXJldHVybiBlZnhfcmVzZXQoZWZ4LCBtZXRob2QpOworCXJldHVybiBlZnhfcmVzZXQoZWZ4LCByYyk7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9mYWxjb24uYyBiL2RyaXZlcnMvbmV0L3NmYy9mYWxjb24uYwppbmRleCA2MDE3NmU4Li45NGJmNGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvZmFsY29uLmMKKysrIGIvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbi5jCkBAIC01MzYsNyArNTM2LDcgQEAKIAllZnhfb3dvcmRfdCByZWc7CiAJaW50IGxpbmtfc3BlZWQsIGlzb2xhdGU7CiAKLQlpc29sYXRlID0gKGVmeC0+cmVzZXRfcGVuZGluZyAhPSBSRVNFVF9UWVBFX05PTkUpOworCWlzb2xhdGUgPSAhIUFDQ0VTU19PTkNFKGVmeC0+cmVzZXRfcGVuZGluZyk7CiAKIAlzd2l0Y2ggKGxpbmtfc3RhdGUtPnNwZWVkKSB7CiAJY2FzZSAxMDAwMDogbGlua19zcGVlZCA9IDM7IGJyZWFrOwpAQCAtMTA1MSw2ICsxMDUxLDQ5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwogCitzdGF0aWMgZW51bSByZXNldF90eXBlIGZhbGNvbl9tYXBfcmVzZXRfcmVhc29uKGVudW0gcmVzZXRfdHlwZSByZWFzb24pCit7CisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIFJFU0VUX1RZUEVfUlhfUkVDT1ZFUlk6CisJY2FzZSBSRVNFVF9UWVBFX1JYX0RFU0NfRkVUQ0g6CisJY2FzZSBSRVNFVF9UWVBFX1RYX0RFU0NfRkVUQ0g6CisJY2FzZSBSRVNFVF9UWVBFX1RYX1NLSVA6CisJCS8qIFRoZXNlIGNhbiBvY2Nhc2lvbmFsbHkgb2NjdXIgZHVlIHRvIGhhcmR3YXJlIGJ1Z3MuCisJCSAqIFdlIHRyeSB0byByZXNldCB3aXRob3V0IGRpc3J1cHRpbmcgdGhlIGxpbmsuCisJCSAqLworCQlyZXR1cm4gUkVTRVRfVFlQRV9JTlZJU0lCTEU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFJFU0VUX1RZUEVfQUxMOworCX0KK30KKworc3RhdGljIGludCBmYWxjb25fbWFwX3Jlc2V0X2ZsYWdzKHUzMiAqZmxhZ3MpCit7CisJZW51bSB7CisJCUZBTENPTl9SRVNFVF9JTlZJU0lCTEUgPSAoRVRIX1JFU0VUX0RNQSB8IEVUSF9SRVNFVF9GSUxURVIgfAorCQkJCQkgIEVUSF9SRVNFVF9PRkZMT0FEIHwgRVRIX1JFU0VUX01BQyksCisJCUZBTENPTl9SRVNFVF9BTEwgPSBGQUxDT05fUkVTRVRfSU5WSVNJQkxFIHwgRVRIX1JFU0VUX1BIWSwKKwkJRkFMQ09OX1JFU0VUX1dPUkxEID0gRkFMQ09OX1JFU0VUX0FMTCB8IEVUSF9SRVNFVF9JUlEsCisJfTsKKworCWlmICgoKmZsYWdzICYgRkFMQ09OX1JFU0VUX1dPUkxEKSA9PSBGQUxDT05fUkVTRVRfV09STEQpIHsKKwkJKmZsYWdzICY9IH5GQUxDT05fUkVTRVRfV09STEQ7CisJCXJldHVybiBSRVNFVF9UWVBFX1dPUkxEOworCX0KKworCWlmICgoKmZsYWdzICYgRkFMQ09OX1JFU0VUX0FMTCkgPT0gRkFMQ09OX1JFU0VUX0FMTCkgeworCQkqZmxhZ3MgJj0gfkZBTENPTl9SRVNFVF9BTEw7CisJCXJldHVybiBSRVNFVF9UWVBFX0FMTDsKKwl9CisKKwlpZiAoKCpmbGFncyAmIEZBTENPTl9SRVNFVF9JTlZJU0lCTEUpID09IEZBTENPTl9SRVNFVF9JTlZJU0lCTEUpIHsKKwkJKmZsYWdzICY9IH5GQUxDT05fUkVTRVRfSU5WSVNJQkxFOworCQlyZXR1cm4gUkVTRVRfVFlQRV9JTlZJU0lCTEU7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKIC8qIFJlc2V0cyBOSUMgdG8ga25vd24gc3RhdGUuICBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgaW4gcHJvY2VzcwogICogY29udGV4dCBhbmQgaXMgYWxsb3dlZCB0byBzbGVlcC4gKi8KIHN0YXRpYyBpbnQgX19mYWxjb25fcmVzZXRfaHcoc3RydWN0IGVmeF9uaWMgKmVmeCwgZW51bSByZXNldF90eXBlIG1ldGhvZCkKQEAgLTE3MDksNiArMTc1Miw4IEBACiAJLmluaXQgPSBmYWxjb25faW5pdF9uaWMsCiAJLmZpbmkgPSBlZnhfcG9ydF9kdW1teV9vcF92b2lkLAogCS5tb25pdG9yID0gZmFsY29uX21vbml0b3IsCisJLm1hcF9yZXNldF9yZWFzb24gPSBmYWxjb25fbWFwX3Jlc2V0X3JlYXNvbiwKKwkubWFwX3Jlc2V0X2ZsYWdzID0gZmFsY29uX21hcF9yZXNldF9mbGFncywKIAkucmVzZXQgPSBmYWxjb25fcmVzZXRfaHcsCiAJLnByb2JlX3BvcnQgPSBmYWxjb25fcHJvYmVfcG9ydCwKIAkucmVtb3ZlX3BvcnQgPSBmYWxjb25fcmVtb3ZlX3BvcnQsCkBAIC0xNzQxLDcgKzE3ODYsNiBAQAogCS50eF9kY19iYXNlID0gMHgxMzAwMDAsCiAJLnJ4X2RjX2Jhc2UgPSAweDEwMDAwMCwKIAkub2ZmbG9hZF9mZWF0dXJlcyA9IE5FVElGX0ZfSVBfQ1NVTSwKLQkucmVzZXRfd29ybGRfZmxhZ3MgPSBFVEhfUkVTRVRfSVJRLAogfTsKIAogY29uc3Qgc3RydWN0IGVmeF9uaWNfdHlwZSBmYWxjb25fYjBfbmljX3R5cGUgPSB7CkBAIC0xNzUwLDYgKzE3OTQsOCBAQAogCS5pbml0ID0gZmFsY29uX2luaXRfbmljLAogCS5maW5pID0gZWZ4X3BvcnRfZHVtbXlfb3Bfdm9pZCwKIAkubW9uaXRvciA9IGZhbGNvbl9tb25pdG9yLAorCS5tYXBfcmVzZXRfcmVhc29uID0gZmFsY29uX21hcF9yZXNldF9yZWFzb24sCisJLm1hcF9yZXNldF9mbGFncyA9IGZhbGNvbl9tYXBfcmVzZXRfZmxhZ3MsCiAJLnJlc2V0ID0gZmFsY29uX3Jlc2V0X2h3LAogCS5wcm9iZV9wb3J0ID0gZmFsY29uX3Byb2JlX3BvcnQsCiAJLnJlbW92ZV9wb3J0ID0gZmFsY29uX3JlbW92ZV9wb3J0LApAQCAtMTc5MSw2ICsxODM3LDUgQEAKIAkudHhfZGNfYmFzZSA9IDB4MTMwMDAwLAogCS5yeF9kY19iYXNlID0gMHgxMDAwMDAsCiAJLm9mZmxvYWRfZmVhdHVyZXMgPSBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX1JYSEFTSCB8IE5FVElGX0ZfTlRVUExFLAotCS5yZXNldF93b3JsZF9mbGFncyA9IEVUSF9SRVNFVF9JUlEsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZmlsdGVyLmMgYi9kcml2ZXJzL25ldC9zZmMvZmlsdGVyLmMKaW5kZXggOTVhOTgwZi4uMmI5NjM2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL2ZpbHRlci5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9maWx0ZXIuYwpAQCAtMzM1LDI4ICszMzUsMzUgQEAKIAkJCSAgICAgYm9vbCBmb3JfaW5zZXJ0LCBpbnQgKmRlcHRoX3JlcXVpcmVkKQogewogCXVuc2lnbmVkIGhhc2gsIGluY3IsIGZpbHRlcl9pZHgsIGRlcHRoLCBkZXB0aF9tYXg7Ci0Jc3RydWN0IGVmeF9maWx0ZXJfc3BlYyAqY21wOwogCiAJaGFzaCA9IGVmeF9maWx0ZXJfaGFzaChrZXkpOwogCWluY3IgPSBlZnhfZmlsdGVyX2luY3JlbWVudChrZXkpOwotCWRlcHRoX21heCA9IChzcGVjLT5wcmlvcml0eSA8PSBFRlhfRklMVEVSX1BSSV9ISU5UID8KLQkJICAgICBGSUxURVJfQ1RMX1NSQ0hfSElOVF9NQVggOiBGSUxURVJfQ1RMX1NSQ0hfTUFYKTsKIAotCWZvciAoZGVwdGggPSAxLCBmaWx0ZXJfaWR4ID0gaGFzaCAmICh0YWJsZS0+c2l6ZSAtIDEpOwotCSAgICAgZGVwdGggPD0gZGVwdGhfbWF4ICYmIHRlc3RfYml0KGZpbHRlcl9pZHgsIHRhYmxlLT51c2VkX2JpdG1hcCk7Ci0JICAgICArK2RlcHRoKSB7Ci0JCWNtcCA9ICZ0YWJsZS0+c3BlY1tmaWx0ZXJfaWR4XTsKLQkJaWYgKGVmeF9maWx0ZXJfZXF1YWwoc3BlYywgY21wKSkKLQkJCWdvdG8gZm91bmQ7CisJZmlsdGVyX2lkeCA9IGhhc2ggJiAodGFibGUtPnNpemUgLSAxKTsKKwlkZXB0aCA9IDE7CisJZGVwdGhfbWF4ID0gKGZvcl9pbnNlcnQgPworCQkgICAgIChzcGVjLT5wcmlvcml0eSA8PSBFRlhfRklMVEVSX1BSSV9ISU5UID8KKwkJICAgICAgRklMVEVSX0NUTF9TUkNIX0hJTlRfTUFYIDogRklMVEVSX0NUTF9TUkNIX01BWCkgOgorCQkgICAgIHRhYmxlLT5zZWFyY2hfZGVwdGhbc3BlYy0+dHlwZV0pOworCisJZm9yICg7OykgeworCQkvKiBSZXR1cm4gc3VjY2VzcyBpZiBlbnRyeSBpcyB1c2VkIGFuZCBtYXRjaGVzIHRoaXMgc3BlYworCQkgKiBvciBlbnRyeSBpcyB1bnVzZWQgYW5kIHdlIGFyZSB0cnlpbmcgdG8gaW5zZXJ0LgorCQkgKi8KKwkJaWYgKHRlc3RfYml0KGZpbHRlcl9pZHgsIHRhYmxlLT51c2VkX2JpdG1hcCkgPworCQkgICAgZWZ4X2ZpbHRlcl9lcXVhbChzcGVjLCAmdGFibGUtPnNwZWNbZmlsdGVyX2lkeF0pIDoKKwkJICAgIGZvcl9pbnNlcnQpIHsKKwkJCSpkZXB0aF9yZXF1aXJlZCA9IGRlcHRoOworCQkJcmV0dXJuIGZpbHRlcl9pZHg7CisJCX0KKworCQkvKiBSZXR1cm4gZmFpbHVyZSBpZiB3ZSByZWFjaGVkIHRoZSBtYXhpbXVtIHNlYXJjaCBkZXB0aCAqLworCQlpZiAoZGVwdGggPT0gZGVwdGhfbWF4KQorCQkJcmV0dXJuIGZvcl9pbnNlcnQgPyAtRUJVU1kgOiAtRU5PRU5UOworCiAJCWZpbHRlcl9pZHggPSAoZmlsdGVyX2lkeCArIGluY3IpICYgKHRhYmxlLT5zaXplIC0gMSk7CisJCSsrZGVwdGg7CiAJfQotCWlmICghZm9yX2luc2VydCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JaWYgKGRlcHRoID4gZGVwdGhfbWF4KQotCQlyZXR1cm4gLUVCVVNZOwotZm91bmQ6Ci0JKmRlcHRoX3JlcXVpcmVkID0gZGVwdGg7Ci0JcmV0dXJuIGZpbHRlcl9pZHg7CiB9CiAKIC8qIENvbnN0cnVjdC9kZWNvbnN0cnVjdCBleHRlcm5hbCBmaWx0ZXIgSURzICovCkBAIC02NTAsMTEgKzY1NywxMSBAQAogCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKIAogCS8qIFJGUyBtdXN0IHZhbGlkYXRlIHRoZSBJUCBoZWFkZXIgbGVuZ3RoIGJlZm9yZSBjYWxsaW5nIHVzICovCi0JRUZYX0JVR19PTl9QQVJBTk9JRCghcHNrYl9tYXlfcHVsbChza2IsIG5ob2ZmICsgc2l6ZW9mKCppcCkpKTsKKwlFRlhfQlVHX09OX1BBUkFOT0lEKHNrYl9oZWFkbGVuKHNrYikgPCBuaG9mZiArIHNpemVvZigqaXApKTsKIAlpcCA9IChjb25zdCBzdHJ1Y3QgaXBoZHIgKikoc2tiLT5kYXRhICsgbmhvZmYpOwotCWlmIChpcC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpCisJaWYgKGlwX2lzX2ZyYWdtZW50KGlwKSkKIAkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7Ci0JRUZYX0JVR19PTl9QQVJBTk9JRCghcHNrYl9tYXlfcHVsbChza2IsIG5ob2ZmICsgNCAqIGlwLT5paGwgKyA0KSk7CisJRUZYX0JVR19PTl9QQVJBTk9JRChza2JfaGVhZGxlbihza2IpIDwgbmhvZmYgKyA0ICogaXAtPmlobCArIDQpOwogCXBvcnRzID0gKGNvbnN0IF9fYmUxNiAqKShza2ItPmRhdGEgKyBuaG9mZiArIDQgKiBpcC0+aWhsKTsKIAogCWVmeF9maWx0ZXJfaW5pdF9yeCgmc3BlYywgRUZYX0ZJTFRFUl9QUklfSElOVCwgMCwgcnhxX2luZGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9uZXRfZHJpdmVyLmggYi9kcml2ZXJzL25ldC9zZmMvbmV0X2RyaXZlci5oCmluZGV4IGU4ZDVmMDMuLmI4ZTI1MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9uZXRfZHJpdmVyLmgKKysrIGIvZHJpdmVycy9uZXQvc2ZjL25ldF9kcml2ZXIuaApAQCAtMTcsNyArMTcsNiBAQAogI2RlZmluZSBERUJVRwogI2VuZGlmCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CkBAIC02NDUsNyArNjQ0LDcgQEAKICAqIEBpcnFfcnhfbW9kZXJhdGlvbjogSVJRIG1vZGVyYXRpb24gdGltZSBmb3IgUlggZXZlbnQgcXVldWVzCiAgKiBAbXNnX2VuYWJsZTogTG9nIG1lc3NhZ2UgZW5hYmxlIGZsYWdzCiAgKiBAc3RhdGU6IERldmljZSBzdGF0ZSBmbGFnLiBTZXJpYWxpc2VkIGJ5IHRoZSBydG5sX2xvY2suCi0gKiBAcmVzZXRfcGVuZGluZzogUGVuZGluZyByZXNldCBtZXRob2QgKG5vcm1hbGx5IFJFU0VUX1RZUEVfTk9ORSkKKyAqIEByZXNldF9wZW5kaW5nOiBCaXRtYXNrIGZvciBwZW5kaW5nIHJlc2V0cwogICogQHR4X3F1ZXVlOiBUWCBETUEgcXVldWVzCiAgKiBAcnhfcXVldWU6IFJYIERNQSBxdWV1ZXMKICAqIEBjaGFubmVsOiBDaGFubmVscwpAQCAtNzI4LDcgKzcyNyw3IEBACiAJdTMyIG1zZ19lbmFibGU7CiAKIAllbnVtIG5pY19zdGF0ZSBzdGF0ZTsKLQllbnVtIHJlc2V0X3R5cGUgcmVzZXRfcGVuZGluZzsKKwl1bnNpZ25lZCBsb25nIHJlc2V0X3BlbmRpbmc7CiAKIAlzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWxbRUZYX01BWF9DSEFOTkVMU107CiAJY2hhciBjaGFubmVsX25hbWVbRUZYX01BWF9DSEFOTkVMU11bSUZOQU1TSVogKyA2XTsKQEAgLTgyOCw2ICs4MjcsOCBAQAogICogQGluaXQ6IEluaXRpYWxpc2UgdGhlIGNvbnRyb2xsZXIKICAqIEBmaW5pOiBTaHV0IGRvd24gdGhlIGNvbnRyb2xsZXIKICAqIEBtb25pdG9yOiBQZXJpb2RpYyBmdW5jdGlvbiBmb3IgcG9sbGluZyBsaW5rIHN0YXRlIGFuZCBoYXJkd2FyZSBtb25pdG9yCisgKiBAbWFwX3Jlc2V0X3JlYXNvbjogTWFwIGV0aHRvb2wgcmVzZXQgcmVhc29uIHRvIGEgcmVzZXQgbWV0aG9kCisgKiBAbWFwX3Jlc2V0X2ZsYWdzOiBNYXAgZXRodG9vbCByZXNldCBmbGFncyB0byBhIHJlc2V0IG1ldGhvZCwgaWYgcG9zc2libGUKICAqIEByZXNldDogUmVzZXQgdGhlIGNvbnRyb2xsZXIgaGFyZHdhcmUgYW5kIHBvc3NpYmx5IHRoZSBQSFkuICBUaGlzIHdpbGwKICAqCWJlIGNhbGxlZCB3aGlsZSB0aGUgY29udHJvbGxlciBpcyB1bmluaXRpYWxpc2VkLgogICogQHByb2JlX3BvcnQ6IFByb2JlIHRoZSBNQUMgYW5kIFBIWQpAQCAtODY1LDggKzg2Niw2IEBACiAgKiBAcnhfZGNfYmFzZTogQmFzZSBhZGRyZXNzIGluIFNSQU0gb2YgUlggcXVldWUgZGVzY3JpcHRvciBjYWNoZXMKICAqIEBvZmZsb2FkX2ZlYXR1cmVzOiBuZXRfZGV2aWNlIGZlYXR1cmUgZmxhZ3MgZm9yIHByb3RvY29sIG9mZmxvYWQKICAqCWZlYXR1cmVzIGltcGxlbWVudGVkIGluIGhhcmR3YXJlCi0gKiBAcmVzZXRfd29ybGRfZmxhZ3M6IEZsYWdzIGZvciBhZGRpdGlvbmFsIGNvbXBvbmVudHMgY292ZXJlZCBieQotICoJcmVzZXQgbWV0aG9kIFJFU0VUX1RZUEVfV09STEQKICAqLwogc3RydWN0IGVmeF9uaWNfdHlwZSB7CiAJaW50ICgqcHJvYmUpKHN0cnVjdCBlZnhfbmljICplZngpOwpAQCAtODc0LDYgKzg3Myw4IEBACiAJaW50ICgqaW5pdCkoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiAJdm9pZCAoKmZpbmkpKHN0cnVjdCBlZnhfbmljICplZngpOwogCXZvaWQgKCptb25pdG9yKShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKKwllbnVtIHJlc2V0X3R5cGUgKCptYXBfcmVzZXRfcmVhc29uKShlbnVtIHJlc2V0X3R5cGUgcmVhc29uKTsKKwlpbnQgKCptYXBfcmVzZXRfZmxhZ3MpKHUzMiAqZmxhZ3MpOwogCWludCAoKnJlc2V0KShzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBlbnVtIHJlc2V0X3R5cGUgbWV0aG9kKTsKIAlpbnQgKCpwcm9iZV9wb3J0KShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIAl2b2lkICgqcmVtb3ZlX3BvcnQpKHN0cnVjdCBlZnhfbmljICplZngpOwpAQCAtOTA4LDcgKzkwOSw2IEBACiAJdW5zaWduZWQgaW50IHR4X2RjX2Jhc2U7CiAJdW5zaWduZWQgaW50IHJ4X2RjX2Jhc2U7CiAJdTMyIG9mZmxvYWRfZmVhdHVyZXM7Ci0JdTMyIHJlc2V0X3dvcmxkX2ZsYWdzOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvbmljLmMgYi9kcml2ZXJzL25ldC9zZmMvbmljLmMKaW5kZXggZjJhMmI5NC4uYmFmYTIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL25pYy5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9uaWMuYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL3NpZW5hLmMgYi9kcml2ZXJzL25ldC9zZmMvc2llbmEuYwppbmRleCBmYjQ3MjFmLi41NzM1ZTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvc2llbmEuYworKysgYi9kcml2ZXJzL25ldC9zZmMvc2llbmEuYwpAQCAtMTc3LDYgKzE3NywzNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KIAorc3RhdGljIGVudW0gcmVzZXRfdHlwZSBzaWVuYV9tYXBfcmVzZXRfcmVhc29uKGVudW0gcmVzZXRfdHlwZSByZWFzb24pCit7CisJcmV0dXJuIFJFU0VUX1RZUEVfQUxMOworfQorCitzdGF0aWMgaW50IHNpZW5hX21hcF9yZXNldF9mbGFncyh1MzIgKmZsYWdzKQoreworCWVudW0geworCQlTSUVOQV9SRVNFVF9QT1JUID0gKEVUSF9SRVNFVF9ETUEgfCBFVEhfUkVTRVRfRklMVEVSIHwKKwkJCQkgICAgRVRIX1JFU0VUX09GRkxPQUQgfCBFVEhfUkVTRVRfTUFDIHwKKwkJCQkgICAgRVRIX1JFU0VUX1BIWSksCisJCVNJRU5BX1JFU0VUX01DID0gKFNJRU5BX1JFU0VUX1BPUlQgfAorCQkJCSAgRVRIX1JFU0VUX01HTVQgPDwgRVRIX1JFU0VUX1NIQVJFRF9TSElGVCksCisJfTsKKworCWlmICgoKmZsYWdzICYgU0lFTkFfUkVTRVRfTUMpID09IFNJRU5BX1JFU0VUX01DKSB7CisJCSpmbGFncyAmPSB+U0lFTkFfUkVTRVRfTUM7CisJCXJldHVybiBSRVNFVF9UWVBFX1dPUkxEOworCX0KKworCWlmICgoKmZsYWdzICYgU0lFTkFfUkVTRVRfUE9SVCkgPT0gU0lFTkFfUkVTRVRfUE9SVCkgeworCQkqZmxhZ3MgJj0gflNJRU5BX1JFU0VUX1BPUlQ7CisJCXJldHVybiBSRVNFVF9UWVBFX0FMTDsKKwl9CisKKwkvKiBubyBpbnZpc2libGUgcmVzZXQgaW1wbGVtZW50ZWQgKi8KKworCXJldHVybiAtRUlOVkFMOworfQorCiBzdGF0aWMgaW50IHNpZW5hX3Jlc2V0X2h3KHN0cnVjdCBlZnhfbmljICplZngsIGVudW0gcmVzZXRfdHlwZSBtZXRob2QpCiB7CiAJaW50IHJjOwpAQCAtMzkwLDE3ICs0MjAsMTYgQEAKIAllZngtPm5pY19kYXRhID0gTlVMTDsKIH0KIAotI2RlZmluZSBTVEFUU19HRU5FUkFUSU9OX0lOVkFMSUQgKCh1NjQpKC0xKSkKKyNkZWZpbmUgU1RBVFNfR0VORVJBVElPTl9JTlZBTElEICgoX19mb3JjZSBfX2xlNjQpKC0xKSkKIAogc3RhdGljIGludCBzaWVuYV90cnlfdXBkYXRlX25pY19zdGF0cyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCXU2NCAqZG1hX3N0YXRzOworCV9fbGU2NCAqZG1hX3N0YXRzOwogCXN0cnVjdCBlZnhfbWFjX3N0YXRzICptYWNfc3RhdHM7Ci0JdTY0IGdlbmVyYXRpb25fc3RhcnQ7Ci0JdTY0IGdlbmVyYXRpb25fZW5kOworCV9fbGU2NCBnZW5lcmF0aW9uX3N0YXJ0LCBnZW5lcmF0aW9uX2VuZDsKIAogCW1hY19zdGF0cyA9ICZlZngtPm1hY19zdGF0czsKLQlkbWFfc3RhdHMgPSAodTY0ICopZWZ4LT5zdGF0c19idWZmZXIuYWRkcjsKKwlkbWFfc3RhdHMgPSBlZngtPnN0YXRzX2J1ZmZlci5hZGRyOwogCiAJZ2VuZXJhdGlvbl9lbmQgPSBkbWFfc3RhdHNbTUNfQ01EX01BQ19HRU5FUkFUSU9OX0VORF07CiAJaWYgKGdlbmVyYXRpb25fZW5kID09IFNUQVRTX0dFTkVSQVRJT05fSU5WQUxJRCkKQEAgLTQwOCw3ICs0MzcsNyBAQAogCXJtYigpOwogCiAjZGVmaW5lIE1BQ19TVEFUKE0sIEQpIFwKLQltYWNfc3RhdHMtPk0gPSBkbWFfc3RhdHNbTUNfQ01EX01BQ18gIyMgRF0KKwltYWNfc3RhdHMtPk0gPSBsZTY0X3RvX2NwdShkbWFfc3RhdHNbTUNfQ01EX01BQ18gIyMgRF0pCiAKIAlNQUNfU1RBVCh0eF9ieXRlcywgVFhfQllURVMpOwogCU1BQ19TVEFUKHR4X2JhZF9ieXRlcywgVFhfQkFEX0JZVEVTKTsKQEAgLTQ3OCw3ICs1MDcsOCBAQAogCU1BQ19TVEFUKHJ4X2ludGVybmFsX2Vycm9yLCBSWF9JTlRFUk5BTF9FUlJPUl9QS1RTKTsKIAltYWNfc3RhdHMtPnJ4X2dvb2RfbHQ2NCA9IDA7CiAKLQllZngtPm5fcnhfbm9kZXNjX2Ryb3BfY250ID0gZG1hX3N0YXRzW01DX0NNRF9NQUNfUlhfTk9ERVNDX0RST1BTXTsKKwllZngtPm5fcnhfbm9kZXNjX2Ryb3BfY250ID0KKwkJbGU2NF90b19jcHUoZG1hX3N0YXRzW01DX0NNRF9NQUNfUlhfTk9ERVNDX0RST1BTXSk7CiAKICN1bmRlZiBNQUNfU1RBVAogCkBAIC01MDcsNyArNTM3LDcgQEAKIAogc3RhdGljIHZvaWQgc2llbmFfc3RhcnRfbmljX3N0YXRzKHN0cnVjdCBlZnhfbmljICplZngpCiB7Ci0JdTY0ICpkbWFfc3RhdHMgPSAodTY0ICopZWZ4LT5zdGF0c19idWZmZXIuYWRkcjsKKwlfX2xlNjQgKmRtYV9zdGF0cyA9IGVmeC0+c3RhdHNfYnVmZmVyLmFkZHI7CiAKIAlkbWFfc3RhdHNbTUNfQ01EX01BQ19HRU5FUkFUSU9OX0VORF0gPSBTVEFUU19HRU5FUkFUSU9OX0lOVkFMSUQ7CiAKQEAgLTYwNSw2ICs2MzUsOCBAQAogCS5pbml0ID0gc2llbmFfaW5pdF9uaWMsCiAJLmZpbmkgPSBlZnhfcG9ydF9kdW1teV9vcF92b2lkLAogCS5tb25pdG9yID0gTlVMTCwKKwkubWFwX3Jlc2V0X3JlYXNvbiA9IHNpZW5hX21hcF9yZXNldF9yZWFzb24sCisJLm1hcF9yZXNldF9mbGFncyA9IHNpZW5hX21hcF9yZXNldF9mbGFncywKIAkucmVzZXQgPSBzaWVuYV9yZXNldF9odywKIAkucHJvYmVfcG9ydCA9IHNpZW5hX3Byb2JlX3BvcnQsCiAJLnJlbW92ZV9wb3J0ID0gc2llbmFfcmVtb3ZlX3BvcnQsCkBAIC02NDEsNSArNjczLDQgQEAKIAkucnhfZGNfYmFzZSA9IDB4NjgwMDAsCiAJLm9mZmxvYWRfZmVhdHVyZXMgPSAoTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0gfAogCQkJICAgICBORVRJRl9GX1JYSEFTSCB8IE5FVElGX0ZfTlRVUExFKSwKLQkucmVzZXRfd29ybGRfZmxhZ3MgPSBFVEhfUkVTRVRfTUdNVCA8PCBFVEhfUkVTRVRfU0hBUkVEX1NISUZULAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NnaXNlZXEuYyBiL2RyaXZlcnMvbmV0L3NnaXNlZXEuYwppbmRleCA1NDQxNWM3Li41MmZiN2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZ2lzZWVxLmMKKysrIGIvZHJpdmVycy9uZXQvc2dpc2VlcS5jCkBAIC02LDYgKzYsNyBAQAogCiAjdW5kZWYgREVCVUcKIAorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2hfZXRoLmMgYi9kcml2ZXJzL25ldC9zaF9ldGguYwppbmRleCA4YTcyYTk3Li5hZDM1YzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zaF9ldGguYworKysgYi9kcml2ZXJzL25ldC9zaF9ldGguYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKICNpbmNsdWRlICJzaF9ldGguaCIKIApAQCAtMTQwLDYgKzEzOSw4IEBACiAJLnRwYXVzZXIJPSAxLAogCS5od19zd2FwCT0gMSwKIAkubm9fYWRlCQk9IDEsCisJLnJwYWRpcgkJPSAxLAorCS5ycGFkaXJfdmFsdWUgICA9IDIgPDwgMTYsCiB9OwogCiAjZGVmaW5lIFNIX0dJR0FfRVRIX0JBU0UJMHhmZWUwMDAwMApAQCAtODY0LDYgKzg2NSw4IEBACiAJCQlicmVhazsKIAkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLwogCQlpZiAobWRwLT50eF9za2J1ZmZbZW50cnldKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKCZuZGV2LT5kZXYsIHR4ZGVzYy0+YWRkciwKKwkJCQkJIHR4ZGVzYy0+YnVmZmVyX2xlbmd0aCwgRE1BX1RPX0RFVklDRSk7CiAJCQlkZXZfa2ZyZWVfc2tiX2lycShtZHAtPnR4X3NrYnVmZltlbnRyeV0pOwogCQkJbWRwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKIAkJCWZyZWVOdW0rKzsKQEAgLTExODQsOCArMTE4Nyw4IEBACiAJCQkJbWRwLT5jZC0+c2V0X3JhdGUobmRldik7CiAJCX0KIAkJaWYgKG1kcC0+bGluayA9PSBQSFlfRE9XTikgewotCQkJc2hfZXRoX3dyaXRlKG5kZXYsIChzaF9ldGhfcmVhZChuZGV2LCBFQ01SKSAmIH5FQ01SX1RYRikKLQkJCQkJfCBFQ01SX0RNLCBFQ01SKTsKKwkJCXNoX2V0aF93cml0ZShuZGV2LAorCQkJCShzaF9ldGhfcmVhZChuZGV2LCBFQ01SKSAmIH5FQ01SX1RYRiksIEVDTVIpOwogCQkJbmV3X3N0YXRlID0gMTsKIAkJCW1kcC0+bGluayA9IHBoeWRldi0+bGluazsKIAkJfQpAQCAtMTQ4NywxMyArMTQ5MCwxMiBAQAogCWVudHJ5ID0gbWRwLT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CiAJbWRwLT50eF9za2J1ZmZbZW50cnldID0gc2tiOwogCXR4ZGVzYyA9ICZtZHAtPnR4X3JpbmdbZW50cnldOwotCXR4ZGVzYy0+YWRkciA9IHZpcnRfdG9fcGh5cyhza2ItPmRhdGEpOwogCS8qIHNvZnQgc3dhcC4gKi8KIAlpZiAoIW1kcC0+Y2QtPmh3X3N3YXApCiAJCXNoX2V0aF9zb2Z0X3N3YXAocGh5c190b192aXJ0KEFMSUdOKHR4ZGVzYy0+YWRkciwgNCkpLAogCQkJCSBza2ItPmxlbiArIDIpOwotCS8qIHdyaXRlIGJhY2sgKi8KLQlfX2ZsdXNoX3B1cmdlX3JlZ2lvbihza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwl0eGRlc2MtPmFkZHIgPSBkbWFfbWFwX3NpbmdsZSgmbmRldi0+ZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOwogCWlmIChza2ItPmxlbiA8IEVUSEVSU01BTEwpCiAJCXR4ZGVzYy0+YnVmZmVyX2xlbmd0aCA9IEVUSEVSU01BTEw7CiAJZWxzZQpAQCAtMTc3MCw3ICsxNzcyLDcgQEAKIAlpbnQgcmV0LCBkZXZubyA9IDA7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBOVUxMOwotCXN0cnVjdCBzaF9ldGhfcHJpdmF0ZSAqbWRwOworCXN0cnVjdCBzaF9ldGhfcHJpdmF0ZSAqbWRwID0gTlVMTDsKIAlzdHJ1Y3Qgc2hfZXRoX3BsYXRfZGF0YSAqcGQ7CiAKIAkvKiBnZXQgYmFzZSBhZGRyICovCkBAIC0xODg4LDcgKzE4OTAsNyBAQAogCiBvdXRfcmVsZWFzZToKIAkvKiBuZXRfZGV2IGZyZWUgKi8KLQlpZiAobWRwLT50c3VfYWRkcikKKwlpZiAobWRwICYmIG1kcC0+dHN1X2FkZHIpCiAJCWlvdW5tYXAobWRwLT50c3VfYWRkcik7CiAJaWYgKG5kZXYpCiAJCWZyZWVfbmV0ZGV2KG5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2lzMTkwLmMgYi9kcml2ZXJzL25ldC9zaXMxOTAuYwppbmRleCBiNDM2ZTAwLi44YWQ3YmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zaXMxOTAuYworKysgYi9kcml2ZXJzL25ldC9zaXMxOTAuYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2lzOTAwLmMgYi9kcml2ZXJzL25ldC9zaXM5MDAuYwppbmRleCA0ODRmNzk1Li42NThhMTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zaXM5MDAuYworKysgYi9kcml2ZXJzL25ldC9zaXM5MDAuYwpAQCAtNDgyLDcgKzQ4Miw3IEBACiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dF9jbGVhcmRldjsKIAl9Ci0Jc2lzX3ByaXYtPnR4X3JpbmcgPSAoQnVmZmVyRGVzYyAqKXJpbmdfc3BhY2U7CisJc2lzX3ByaXYtPnR4X3JpbmcgPSByaW5nX3NwYWNlOwogCXNpc19wcml2LT50eF9yaW5nX2RtYSA9IHJpbmdfZG1hOwogCiAJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsIFJYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CkBAIC00OTAsNyArNDkwLDcgQEAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfdW5tYXBfdHg7CiAJfQotCXNpc19wcml2LT5yeF9yaW5nID0gKEJ1ZmZlckRlc2MgKilyaW5nX3NwYWNlOworCXNpc19wcml2LT5yeF9yaW5nID0gcmluZ19zcGFjZTsKIAlzaXNfcHJpdi0+cnhfcmluZ19kbWEgPSByaW5nX2RtYTsKIAogCS8qIFRoZSBTaVM5MDAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwppbmRleCBmNGJlNWM3Li45OGVjNjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2dlLmMKKysrIGIvZHJpdmVycy9uZXQvc2tnZS5jCkBAIC01MCw3ICs1MCw3IEBACiAjaW5jbHVkZSAic2tnZS5oIgogCiAjZGVmaW5lIERSVl9OQU1FCQkic2tnZSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjEzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMTQiCiAKICNkZWZpbmUgREVGQVVMVF9UWF9SSU5HX1NJWkUJMTI4CiAjZGVmaW5lIERFRkFVTFRfUlhfUklOR19TSVpFCTUxMgpAQCAtODMsMTcgKzgzLDIwIEBACiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDA9bm9uZSwuLi4sMTY9YWxsKSIpOwogCiBzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoc2tnZV9pZF90YWJsZSkgPSB7Ci0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDOTQwKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzk0MEIpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgUENJX0RFVklDRV9JRF9TWVNLT05ORUNUX0dFKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIFBDSV9ERVZJQ0VfSURfU1lTS09OTkVDVF9ZVSkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ETElOSywgUENJX0RFVklDRV9JRF9ETElOS19ER0U1MTBUKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0RMSU5LLCAweDRiMDEpIH0sCS8qIERHRS01MzBUICovCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzIwKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NTAwNSkgfSwgLyogQmVsa2luICovCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ05FVCwgUENJX0RFVklDRV9JRF9DTkVUX0dJR0FDQVJEKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0xJTktTWVMsIFBDSV9ERVZJQ0VfSURfTElOS1NZU19FRzEwNjQpIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0xJTktTWVMsIDB4MTAzMiwgUENJX0FOWV9JRCwgMHgwMDE1IH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxNzAwKSB9LAkgIC8qIDNDb20gM0M5NDAgKi8KKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF8zQ09NLCAweDgwRUIpIH0sCSAgLyogM0NvbSAzQzk0MEIgKi8KKyNpZmRlZiBDT05GSUdfU0tHRV9HRU5FU0lTCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgMHg0MzAwKSB9LCAvKiBTSy05eHggKi8KKyNlbmRpZgorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIDB4NDMyMCkgfSwgLyogU0stOTh4eCBWMi4wICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfRExJTkssIDB4NGIwMSkgfSwJICAvKiBELUxpbmsgREdFLTUzMFQgKHJldi5CKSAqLworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0RMSU5LLCAweDRjMDApIH0sCSAgLyogRC1MaW5rIERHRS01MzBUICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfRExJTkssIDB4NDMwMikgfSwJICAvKiBELUxpbmsgREdFLTUzMFQgUmV2IEMxICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzIwKSB9LAkgIC8qIE1hcnZlbGwgWXVrb24gODhFODAwMS84MDAzLzgwMTAgKi8KKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDUwMDUpIH0sCSAgLyogQmVsa2luICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ05FVCwgMHg0MzRFKSB9LCAJICAvKiBDTmV0IFBvd2VyRy0yMDAwICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTElOS1NZUywgMHgxMDY0KSB9LAkgIC8qIExpbmtzeXMgRUcxMDY0IHYyICovCisJeyBQQ0lfVkVORE9SX0lEX0xJTktTWVMsIDB4MTAzMiwgUENJX0FOWV9JRCwgMHgwMDE1IH0sIC8qIExpbmtzeXMgRUcxMDMyIHYyICovCiAJeyAwIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2tnZV9pZF90YWJsZSk7CkBAIC0xMTksNiArMTIyLDE1IEBACiBzdGF0aWMgY29uc3QgdTMyIG5hcGltYXNrW10gPSB7IElTX1IxX0Z8SVNfWEExX0YsIElTX1IyX0Z8SVNfWEEyX0YgfTsKIHN0YXRpYyBjb25zdCB1MzIgcG9ydG1hc2tbXSA9IHsgSVNfUE9SVF8xLCBJU19QT1JUXzIgfTsKIAorc3RhdGljIGlubGluZSBib29sIGlzX2dlbmVzaXMoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3KQoreworI2lmZGVmIENPTkZJR19TS0dFX0dFTkVTSVMKKwlyZXR1cm4gaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTOworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwogc3RhdGljIGludCBza2dlX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXJldHVybiAweDQwMDA7CkBAIC0xNDYsNyArMTU4LDcgQEAKIC8qIFdha2Ugb24gTGFuIG9ubHkgc3VwcG9ydGVkIG9uIFl1a29uIGNoaXBzIHdpdGggcmV2IDEgb3IgYWJvdmUgKi8KIHN0YXRpYyB1MzIgd29sX3N1cHBvcnRlZChjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcpCiB7Ci0JaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKKwlpZiAoaXNfZ2VuZXNpcyhodykpCiAJCXJldHVybiAwOwogCiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT04gJiYgaHctPmNoaXBfcmV2ID09IDApCkBAIC0yNzAsNyArMjgyLDcgQEAKIAkJCSAgICAgU1VQUE9SVEVEX0F1dG9uZWcgfAogCQkJICAgICBTVVBQT1JURURfVFApOwogCi0JCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJCWlmIChpc19nZW5lc2lzKGh3KSkKIAkJCXN1cHBvcnRlZCAmPSB+KFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAogCQkJCSAgICAgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKIAkJCQkgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfApAQCAtNDMzLDcgKzQ0NSw3IEBACiB7CiAJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpZiAoc2tnZS0+aHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKQorCWlmIChpc19nZW5lc2lzKHNrZ2UtPmh3KSkKIAkJZ2VuZXNpc19nZXRfc3RhdHMoc2tnZSwgZGF0YSk7CiAJZWxzZQogCQl5dWtvbl9nZXRfc3RhdHMoc2tnZSwgZGF0YSk7CkBAIC00NDgsNyArNDYwLDcgQEAKIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1NjQgZGF0YVtBUlJBWV9TSVpFKHNrZ2Vfc3RhdHMpXTsKIAotCWlmIChza2dlLT5ody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJaWYgKGlzX2dlbmVzaXMoc2tnZS0+aHcpKQogCQlnZW5lc2lzX2dldF9zdGF0cyhza2dlLCBkYXRhKTsKIAllbHNlCiAJCXl1a29uX2dldF9zdGF0cyhza2dlLCBkYXRhKTsKQEAgLTU4OSw3ICs2MDEsNyBAQAogLyogQ2hpcCBpbnRlcm5hbCBmcmVxdWVuY3kgZm9yIGNsb2NrIGNhbGN1bGF0aW9ucyAqLwogc3RhdGljIGlubGluZSB1MzIgaHdraHooY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3KQogewotCXJldHVybiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSA/IDUzMTI1IDogNzgxMjU7CisJcmV0dXJuIGlzX2dlbmVzaXMoaHcpID8gNTMxMjUgOiA3ODEyNTsKIH0KIAogLyogQ2hpcCBIWiB0byBtaWNyb3NlY29uZHMgKi8KQEAgLTY3NCw3ICs2ODYsNyBAQAogCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKIAogCXNwaW5fbG9ja19iaCgmaHctPnBoeV9sb2NrKTsKLQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisJaWYgKGlzX2dlbmVzaXMoaHcpKSB7CiAJCXN3aXRjaCAobW9kZSkgewogCQljYXNlIExFRF9NT0RFX09GRjoKIAkJCWlmIChody0+cGh5X3R5cGUgPT0gU0tfUEhZX0JDT00pCkBAIC0xMDUzLDcgKzEwNjUsNiBAQAogCW5ldGlmX2luZm8oc2tnZSwgbGluaywgc2tnZS0+bmV0ZGV2LCAiTGluayBpcyBkb3duXG4iKTsKIH0KIAotCiBzdGF0aWMgdm9pZCB4bV9saW5rX2Rvd24oc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltwb3J0XTsKQEAgLTExNzIsNyArMTE4Myw2IEBACiAJeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwgcmVnIHwgWE1fTURfRlJGKTsKIH0KIAotCiAvKiBDb252ZXJ0IG1vZGUgdG8gTUlJIHZhbHVlcyAgKi8KIHN0YXRpYyBjb25zdCB1MTYgcGh5X3BhdXNlX21hcFtdID0gewogCVtGTE9XX01PREVfTk9ORV0gPQkwLApAQCAtMjQwNSw3ICsyNDE1LDcgQEAKIAluZXRpZl9jYXJyaWVyX29mZihza2dlLT5uZXRkZXYpOwogCiAJc3Bpbl9sb2NrX2JoKCZody0+cGh5X2xvY2spOwotCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKKwlpZiAoaXNfZ2VuZXNpcyhodykpIHsKIAkJZ2VuZXNpc19yZXNldChodywgcG9ydCk7CiAJCWdlbmVzaXNfbWFjX2luaXQoaHcsIHBvcnQpOwogCX0gZWxzZSB7CkBAIC0yNDM2LDcgKzI0NDYsOCBAQAogCWNhc2UgU0lPQ0dNSUlSRUc6IHsKIAkJdTE2IHZhbCA9IDA7CiAJCXNwaW5fbG9ja19iaCgmaHctPnBoeV9sb2NrKTsKLQkJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKKworCQlpZiAoaXNfZ2VuZXNpcyhodykpCiAJCQllcnIgPSBfX3htX3BoeV9yZWFkKGh3LCBza2dlLT5wb3J0LCBkYXRhLT5yZWdfbnVtICYgMHgxZiwgJnZhbCk7CiAJCWVsc2UKIAkJCWVyciA9IF9fZ21fcGh5X3JlYWQoaHcsIHNrZ2UtPnBvcnQsIGRhdGEtPnJlZ19udW0gJiAweDFmLCAmdmFsKTsKQEAgLTI0NDcsNyArMjQ1OCw3IEBACiAKIAljYXNlIFNJT0NTTUlJUkVHOgogCQlzcGluX2xvY2tfYmgoJmh3LT5waHlfbG9jayk7Ci0JCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJCWlmIChpc19nZW5lc2lzKGh3KSkKIAkJCWVyciA9IHhtX3BoeV93cml0ZShodywgc2tnZS0+cG9ydCwgZGF0YS0+cmVnX251bSAmIDB4MWYsCiAJCQkJICAgZGF0YS0+dmFsX2luKTsKIAkJZWxzZQpAQCAtMjU1OSw3ICsyNTcwLDcgQEAKIAogCS8qIEluaXRpYWxpemUgTUFDICovCiAJc3Bpbl9sb2NrX2JoKCZody0+cGh5X2xvY2spOwotCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJaWYgKGlzX2dlbmVzaXMoaHcpKQogCQlnZW5lc2lzX21hY19pbml0KGh3LCBwb3J0KTsKIAllbHNlCiAJCXl1a29uX21hY19pbml0KGh3LCBwb3J0KTsKQEAgLTI2MjEsNyArMjYzMiw3IEBACiAKIAluZXRpZl90eF9kaXNhYmxlKGRldik7CiAKLQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTICYmIGh3LT5waHlfdHlwZSA9PSBTS19QSFlfWE1BQykKKwlpZiAoaXNfZ2VuZXNpcyhodykgJiYgaHctPnBoeV90eXBlID09IFNLX1BIWV9YTUFDKQogCQlkZWxfdGltZXJfc3luYygmc2tnZS0+bGlua190aW1lcik7CiAKIAluYXBpX2Rpc2FibGUoJnNrZ2UtPm5hcGkpOwpAQCAtMjYzMyw3ICsyNjQ0LDcgQEAKIAlzcGluX3VubG9ja19pcnEoJmh3LT5od19sb2NrKTsKIAogCXNrZ2Vfd3JpdGU4KHNrZ2UtPmh3LCBTS19SRUcoc2tnZS0+cG9ydCwgTE5LX0xFRF9SRUcpLCBMRURfT0ZGKTsKLQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKQorCWlmIChpc19nZW5lc2lzKGh3KSkKIAkJZ2VuZXNpc19zdG9wKHNrZ2UpOwogCWVsc2UKIAkJeXVrb25fc3RvcChza2dlKTsKQEAgLTI2NjEsNyArMjY3Miw3IEBACiAKIAlza2dlX3J4X3N0b3AoaHcsIHBvcnQpOwogCi0JaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykgeworCWlmIChpc19nZW5lc2lzKGh3KSkgewogCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYX01GRl9DVFJMMiksIE1GRl9SU1RfU0VUKTsKIAkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9NRkZfQ1RSTDIpLCBNRkZfUlNUX1NFVCk7CiAJfSBlbHNlIHsKQEAgLTI5NTcsNyArMjk2OCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdTE2IHBoeV9sZW5ndGgoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCB1MzIgc3RhdHVzKQogewotCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJaWYgKGlzX2dlbmVzaXMoaHcpKQogCQlyZXR1cm4gc3RhdHVzID4+IFhNUl9GU19MRU5fU0hJRlQ7CiAJZWxzZQogCQlyZXR1cm4gc3RhdHVzID4+IEdNUl9GU19MRU5fU0hJRlQ7CkBAIC0yOTY1LDcgKzI5NzYsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBiYWRfcGh5X3N0YXR1cyhjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIHUzMiBzdGF0dXMpCiB7Ci0JaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKKwlpZiAoaXNfZ2VuZXNpcyhodykpCiAJCXJldHVybiAoc3RhdHVzICYgKFhNUl9GU19FUlIgfCBYTVJfRlNfMkxfVkxBTikpICE9IDA7CiAJZWxzZQogCQlyZXR1cm4gKHN0YXR1cyAmIEdNUl9GU19BTllfRVJSKSB8fApAQCAtMjk3NSw5ICsyOTg2LDggQEAKIHN0YXRpYyB2b2lkIHNrZ2Vfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OwogCi0JaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKKwlpZiAoaXNfZ2VuZXNpcyhza2dlLT5odykpCiAJCWdlbmVzaXNfc2V0X211bHRpY2FzdChkZXYpOwogCWVsc2UKIAkJeXVrb25fc2V0X211bHRpY2FzdChkZXYpOwpAQCAtMzA1Nyw3ICszMDY3LDcgQEAKIAkJICAgICAicnggZXJyLCBzbG90ICV0ZCBjb250cm9sIDB4JXggc3RhdHVzIDB4JXhcbiIsCiAJCSAgICAgZSAtIHNrZ2UtPnJ4X3Jpbmcuc3RhcnQsIGNvbnRyb2wsIHN0YXR1cyk7CiAKLQlpZiAoc2tnZS0+aHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisJaWYgKGlzX2dlbmVzaXMoc2tnZS0+aHcpKSB7CiAJCWlmIChzdGF0dXMgJiAoWE1SX0ZTX1JVTlR8WE1SX0ZTX0xOR19FUlIpKQogCQkJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCWlmIChzdGF0dXMgJiBYTVJfRlNfRlJBX0VSUikKQEAgLTMxNzEsNyArMzE4MSw3IEBACiAKIAkrK2Rldi0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9yczsKIAotCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJaWYgKGlzX2dlbmVzaXMoaHcpKQogCQlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDEpLAogCQkJICAgICBNRkZfQ0xSX1BFUlIpOwogCWVsc2UKQEAgLTMxODMsNyArMzE5Myw3IEBACiAKIHN0YXRpYyB2b2lkIHNrZ2VfbWFjX2ludHIoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKIHsKLQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKQorCWlmIChpc19nZW5lc2lzKGh3KSkKIAkJZ2VuZXNpc19tYWNfaW50cihodywgcG9ydCk7CiAJZWxzZQogCQl5dWtvbl9tYWNfaW50cihodywgcG9ydCk7CkBAIC0zMTk1LDcgKzMyMDUsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaHctPnBkZXY7CiAJdTMyIGh3c3RhdHVzID0gc2tnZV9yZWFkMzIoaHcsIEIwX0hXRV9JU1JDKTsKIAotCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKKwlpZiAoaXNfZ2VuZXNpcyhodykpIHsKIAkJLyogY2xlYXIgeG1hYyBlcnJvcnMgKi8KIAkJaWYgKGh3c3RhdHVzICYgKElTX05PX1NUQVRfTTF8SVNfTk9fVElTVF9NMSkpCiAJCQlza2dlX3dyaXRlMTYoaHcsIFJYX01GRl9DVFJMMSwgTUZGX0NMUl9JTlNUQVQpOwpAQCAtMzI3OCw3ICszMjg4LDcgQEAKIAkJCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJCQlzcGluX2xvY2soJmh3LT5waHlfbG9jayk7Ci0JCQlpZiAoaHctPmNoaXBfaWQgIT0gQ0hJUF9JRF9HRU5FU0lTKQorCQkJaWYgKCFpc19nZW5lc2lzKGh3KSkKIAkJCQl5dWtvbl9waHlfaW50cihza2dlKTsKIAkJCWVsc2UgaWYgKGh3LT5waHlfdHlwZSA9PSBTS19QSFlfQkNPTSkKIAkJCQliY29tX3BoeV9pbnRyKHNrZ2UpOwpAQCAtMzM5Nyw3ICszNDA3LDcgQEAKIAkJbWVtY3B5X3RvaW8oaHctPnJlZ3MgKyBCMl9NQUNfMSArIHBvcnQqOCwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCQltZW1jcHlfdG9pbyhody0+cmVncyArIEIyX01BQ18yICsgcG9ydCo4LCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAKLQkJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKKwkJaWYgKGlzX2dlbmVzaXMoaHcpKQogCQkJeG1fb3V0YWRkcihodywgcG9ydCwgWE1fU0EsIGRldi0+ZGV2X2FkZHIpOwogCQllbHNlIHsKIAkJCWdtYV9zZXRfYWRkcihodywgcG9ydCwgR01fU1JDX0FERFJfMUwsIGRldi0+ZGV2X2FkZHIpOwpAQCAtMzQ3Myw2ICszNDgzLDcgQEAKIAogCXN3aXRjaCAoaHctPmNoaXBfaWQpIHsKIAljYXNlIENISVBfSURfR0VORVNJUzoKKyNpZmRlZiBDT05GSUdfU0tHRV9HRU5FU0lTCiAJCXN3aXRjaCAoaHctPnBoeV90eXBlKSB7CiAJCWNhc2UgU0tfUEhZX1hNQUM6CiAJCQlody0+cGh5X2FkZHIgPSBQSFlfQUREUl9YTUFDOwpAQCAtMzQ4Niw2ICszNDk3LDEwIEBACiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCX0KIAkJYnJlYWs7CisjZWxzZQorCQlkZXZfZXJyKCZody0+cGRldi0+ZGV2LCAiR2VuZXNpcyBjaGlwIGRldGVjdGVkIGJ1dCBub3QgY29uZmlndXJlZFxuIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKyNlbmRpZgogCiAJY2FzZSBDSElQX0lEX1lVS09OOgogCWNhc2UgQ0hJUF9JRF9ZVUtPTl9MSVRFOgpAQCAtMzUwOCw3ICszNTIzLDcgQEAKIAogCS8qIHJlYWQgdGhlIGFkYXB0ZXJzIFJBTSBzaXplICovCiAJdDggPSBza2dlX3JlYWQ4KGh3LCBCMl9FXzApOwotCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKKwlpZiAoaXNfZ2VuZXNpcyhodykpIHsKIAkJaWYgKHQ4ID09IDMpIHsKIAkJCS8qIHNwZWNpYWwgY2FzZTogNCB4IDY0ayB4IDM2LCBvZmZzZXQgPSAweDgwMDAwICovCiAJCQlody0+cmFtX3NpemUgPSAweDEwMDAwMDsKQEAgLTM1MjMsMTAgKzM1MzgsMTAgQEAKIAlody0+aW50cl9tYXNrID0gSVNfSFdfRVJSOwogCiAJLyogVXNlIFBIWSBJUlEgZm9yIGFsbCBidXQgZmliZXIgYmFzZWQgR2VuZXNpcyBib2FyZCAqLwotCWlmICghKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUyAmJiBody0+cGh5X3R5cGUgPT0gU0tfUEhZX1hNQUMpKQorCWlmICghKGlzX2dlbmVzaXMoaHcpICYmIGh3LT5waHlfdHlwZSA9PSBTS19QSFlfWE1BQykpCiAJCWh3LT5pbnRyX21hc2sgfD0gSVNfRVhUX1JFRzsKIAotCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJaWYgKGlzX2dlbmVzaXMoaHcpKQogCQlnZW5lc2lzX2luaXQoaHcpOwogCWVsc2UgewogCQkvKiBzd2l0Y2ggcG93ZXIgdG8gVkNDIChXQSBmb3IgVkFVWCBwcm9ibGVtKSAqLwpAQCAtMzU5MSw3ICszNjA2LDcgQEAKIAlza2dlX3dyaXRlMzIoaHcsIEIwX0lNU0ssIGh3LT5pbnRyX21hc2spOwogCiAJZm9yIChpID0gMDsgaSA8IGh3LT5wb3J0czsgaSsrKSB7Ci0JCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJCWlmIChpc19nZW5lc2lzKGh3KSkKIAkJCWdlbmVzaXNfcmVzZXQoaHcsIGkpOwogCQllbHNlCiAJCQl5dWtvbl9yZXNldChodywgaSk7CkBAIC0zODAyLDkgKzM4MTcsOSBAQAogCXNrZ2UtPnBvcnQgPSBwb3J0OwogCiAJLyogT25seSB1c2VkIGZvciBHZW5lc2lzIFhNQUMgKi8KLQlzZXR1cF90aW1lcigmc2tnZS0+bGlua190aW1lciwgeG1fbGlua190aW1lciwgKHVuc2lnbmVkIGxvbmcpIHNrZ2UpOwotCi0JaWYgKGh3LT5jaGlwX2lkICE9IENISVBfSURfR0VORVNJUykgeworCWlmIChpc19nZW5lc2lzKGh3KSkKKwkgICAgc2V0dXBfdGltZXIoJnNrZ2UtPmxpbmtfdGltZXIsIHhtX2xpbmtfdGltZXIsICh1bnNpZ25lZCBsb25nKSBza2dlKTsKKwllbHNlIHsKIAkJZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0cgfAogCQkgICAgICAgICAgICAgICAgICAgTkVUSUZfRl9SWENTVU07CiAJCWRldi0+ZmVhdHVyZXMgfD0gZGV2LT5od19mZWF0dXJlczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZ2UuaCBiL2RyaXZlcnMvbmV0L3NrZ2UuaAppbmRleCA1OThiZjdhLi5hMmViMzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2dlLmgKKysrIGIvZHJpdmVycy9uZXQvc2tnZS5oCkBAIC0zLDYgKzMsNyBAQAogICovCiAjaWZuZGVmIF9TS0dFX0gKICNkZWZpbmUgX1NLR0VfSAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAvKiBQQ0kgY29uZmlnIHJlZ2lzdGVycyAqLwogI2RlZmluZSBQQ0lfREVWX1JFRzEJMHg0MApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2t5Mi5jIGIvZHJpdmVycy9uZXQvc2t5Mi5jCmluZGV4IDNlZTQxZGEuLjU3MzM5ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NreTIuYworKysgYi9kcml2ZXJzL25ldC9za3kyLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KQEAgLTQ5LDcgKzUwLDcgQEAKICNpbmNsdWRlICJza3kyLmgiCiAKICNkZWZpbmUgRFJWX05BTUUJCSJza3kyIgotI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMjgiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMS4yOSIKIAogLyoKICAqIFRoZSBZdWtvbiBJSSBjaGlwc2V0IHRha2VzIDY0IGJpdCBjb21tYW5kIGJsb2NrcyAoY2FsbGVkIGxpc3QgZWxlbWVudHMpCkBAIC0zNjQsNiArMzY1LDE3IEBACiAJCQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9GRV9TUEVDXzIsIHNwZWMpOwogCQkJfQogCQl9IGVsc2UgeworCQkJaWYgKGh3LT5jaGlwX2lkID49IENISVBfSURfWVVLT05fT1BUKSB7CisJCQkJdTE2IGN0cmwyID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9DVFJMXzIpOworCisJCQkJLyogZW5hYmxlIFBIWSBSZXZlcnNlIEF1dG8tTmVnb3RpYXRpb24gKi8KKwkJCQljdHJsMiB8PSAxdSA8PCAxMzsKKworCQkJCS8qIFdyaXRlIFBIWSBjaGFuZ2VzIChTVy1yZXNldCBtdXN0IGZvbGxvdykgKi8KKwkJCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9DVFJMXzIsIGN0cmwyKTsKKwkJCX0KKworCiAJCQkvKiBkaXNhYmxlIGVuZXJneSBkZXRlY3QgKi8KIAkJCWN0cmwgJj0gflBIWV9NX1BDX0VOX0RFVF9NU0s7CiAKQEAgLTYyNSw2ICs2MzcsNjMgQEAKIAkJaWYgKGxlZG92ZXIpCiAJCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0xFRF9PVkVSLCBsZWRvdmVyKTsKIAorCX0gZWxzZSBpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9QUk0gJiYKKwkJICAgKHNreTJfcmVhZDgoaHcsIEIyX01BQ19DRkcpICYgMHhmKSA9PSAweDcpIHsKKwkJaW50IGk7CisJCS8qIFRoaXMgYSBwaHkgcmVnaXN0ZXIgc2V0dXAgd29ya2Fyb3VuZCBjb3BpZWQgZnJvbSB2ZW5kb3IgZHJpdmVyLiAqLworCQlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJCXUxNiByZWcsIHZhbDsKKwkJfSBlZWVfYWZlW10gPSB7CisJCQl7IDB4MTU2LCAweDU4Y2UgfSwKKwkJCXsgMHgxNTMsIDB4OTllYiB9LAorCQkJeyAweDE0MSwgMHg4MDY0IH0sCisJCQkvKiB7IDB4MTU1LCAweDEzMGIgfSwqLworCQkJeyAweDAwMCwgMHgwMDAwIH0sCisJCQl7IDB4MTUxLCAweDg0MzMgfSwKKwkJCXsgMHgxNGIsIDB4OGM0NCB9LAorCQkJeyAweDE0YywgMHgwZjkwIH0sCisJCQl7IDB4MTRmLCAweDM5YWEgfSwKKwkJCS8qIHsgMHgxNTQsIDB4MmYzOSB9LCovCisJCQl7IDB4MTRkLCAweGJhMzMgfSwKKwkJCXsgMHgxNDQsIDB4MDA0OCB9LAorCQkJeyAweDE1MiwgMHgyMDEwIH0sCisJCQkvKiB7IDB4MTU4LCAweDEyMjMgfSwqLworCQkJeyAweDE0MCwgMHg0NDQ0IH0sCisJCQl7IDB4MTU0LCAweDJmM2IgfSwKKwkJCXsgMHgxNTgsIDB4YjIwMyB9LAorCQkJeyAweDE1NywgMHgyMDI5IH0sCisJCX07CisKKwkJLyogU3RhcnQgV29ya2Fyb3VuZCBmb3IgT3B0aW1hRUVFIFJldi5aMCAqLworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9BRFIsIDB4MDBmYik7CisKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCAgMSwgMHg0MDk5KTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCAgMywgMHgxMTIwKTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCAxMSwgMHgxMTNjKTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCAxNCwgMHg4MTAwKTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCAxNSwgMHgxMTJhKTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCAxNywgMHgxMDA4KTsKKworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9BRFIsIDB4MDBmYyk7CisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgIDEsIDB4MjBiMCk7CisKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQURSLCAweDAwZmYpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVlZV9hZmUpOyBpKyspIHsKKwkJCS8qIGFwcGx5IEFGRSBzZXR0aW5ncyAqLworCQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCAxNywgZWVlX2FmZVtpXS52YWwpOworCQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCAxNiwgZWVlX2FmZVtpXS5yZWcgfCAxdTw8MTMpOworCQl9CisKKwkJLyogRW5kIFdvcmthcm91bmQgZm9yIE9wdGltYUVFRSAqLworCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9BRFIsIDApOworCisJCS8qIEVuYWJsZSAxMEJhc2UtVGUgKEVFRSkgKi8KKwkJaWYgKGh3LT5jaGlwX2lkID49IENISVBfSURfWVVLT05fUFJNKSB7CisJCQlyZWcgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfRVhUX0NUUkwpOworCQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQ1RSTCwKKwkJCQkgICAgIHJlZyB8IFBIWV9NXzEwQl9URV9FTkFCTEUpOworCQl9CiAJfQogCiAJLyogRW5hYmxlIHBoeSBpbnRlcnJ1cHQgb24gYXV0by1uZWdvdGlhdGlvbiBjb21wbGV0ZSAob3IgbGluayB1cCkgKi8KQEAgLTcxMyw2ICs3ODIsMjAgQEAKIAlza3kyX3dyaXRlOChodywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09GRik7CiB9CiAKKy8qIGNvbmZpZ3VyZSBJUEcgYWNjb3JkaW5nIHRvIHVzZWQgbGluayBzcGVlZCAqLworc3RhdGljIHZvaWQgc2t5Ml9zZXRfaXBnKHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCit7CisJdTE2IHJlZzsKKworCXJlZyA9IGdtYV9yZWFkMTYoc2t5Mi0+aHcsIHNreTItPnBvcnQsIEdNX1NFUklBTF9NT0RFKTsKKwlyZWcgJj0gfkdNX1NNT0RfSVBHX01TSzsKKwlpZiAoc2t5Mi0+c3BlZWQgPiBTUEVFRF8xMDApCisJCXJlZyB8PSBJUEdfREFUQV9WQUwoSVBHX0RBVEFfREVGXzEwMDApOworCWVsc2UKKwkJcmVnIHw9IElQR19EQVRBX1ZBTChJUEdfREFUQV9ERUZfMTBfMTAwKTsKKwlnbWFfd3JpdGUxNihza3kyLT5odywgc2t5Mi0+cG9ydCwgR01fU0VSSUFMX01PREUsIHJlZyk7Cit9CisKIC8qIEVuYWJsZSBSeC9UeCAqLwogc3RhdGljIHZvaWQgc2t5Ml9lbmFibGVfcnhfdHgoc3RydWN0IHNreTJfcG9ydCAqc2t5MikKIHsKQEAgLTg4MSw3ICs5NjQsNyBAQAogCiAJLyogc2VyaWFsIG1vZGUgcmVnaXN0ZXIgKi8KIAlyZWcgPSBEQVRBX0JMSU5EX1ZBTChEQVRBX0JMSU5EX0RFRikgfAotCQlHTV9TTU9EX1ZMQU5fRU5BIHwgSVBHX0RBVEFfVkFMKElQR19EQVRBX0RFRik7CisJCUdNX1NNT0RfVkxBTl9FTkEgfCBJUEdfREFUQV9WQUwoSVBHX0RBVEFfREVGXzEwMDApOwogCiAJaWYgKGh3LT5kZXZbcG9ydF0tPm10dSA+IEVUSF9EQVRBX0xFTikKIAkJcmVnIHw9IEdNX1NNT0RfSlVNQk9fRU5BOwpAQCAtMTM2MSwxMyArMTQ0NCwxNCBAQAogICogQWxsb2NhdGUgYW4gc2tiIGZvciByZWNlaXZpbmcuIElmIHRoZSBNVFUgaXMgbGFyZ2UgZW5vdWdoCiAgKiBtYWtlIHRoZSBza2Igbm9uLWxpbmVhciB3aXRoIGEgZnJhZ21lbnQgbGlzdCBvZiBwYWdlcy4KICAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICpza3kyX3J4X2FsbG9jKHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnNreTJfcnhfYWxsb2Moc3RydWN0IHNreTJfcG9ydCAqc2t5MiwgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGk7CiAKLQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHNreTItPm5ldGRldiwKLQkJCSAgICAgICBza3kyLT5yeF9kYXRhX3NpemUgKyBza3kyX3J4X3BhZChza3kyLT5odykpOworCXNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYihza3kyLT5uZXRkZXYsCisJCQkJIHNreTItPnJ4X2RhdGFfc2l6ZSArIHNreTJfcnhfcGFkKHNreTItPmh3KSwKKwkJCQkgZ2ZwKTsKIAlpZiAoIXNrYikKIAkJZ290byBub21lbTsKIApAQCAtMTM4NSw3ICsxNDY5LDcgQEAKIAkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOwogCiAJZm9yIChpID0gMDsgaSA8IHNreTItPnJ4X25mcmFnczsgaSsrKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZShHRlBfQVRPTUlDKTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlKGdmcCk7CiAKIAkJaWYgKCFwYWdlKQogCQkJZ290byBmcmVlX3BhcnRpYWw7CkBAIC0xNDE1LDcgKzE0OTksNyBAQAogCWZvciAoaSA9IDA7IGkgPCBza3kyLT5yeF9wZW5kaW5nOyBpKyspIHsKIAkJc3RydWN0IHJ4X3JpbmdfaW5mbyAqcmUgPSBza3kyLT5yeF9yaW5nICsgaTsKIAotCQlyZS0+c2tiID0gc2t5Ml9yeF9hbGxvYyhza3kyKTsKKwkJcmUtPnNrYiA9IHNreTJfcnhfYWxsb2Moc2t5MiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcmUtPnNrYikKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNDQ4LDcgKzE1MzIsNyBAQAogCXNreTJfcXNldChodywgcnhxKTsKIAogCS8qIE9uIFBDSSBleHByZXNzIGxvd2VyaW5nIHRoZSB3YXRlcm1hcmsgZ2l2ZXMgYmV0dGVyIHBlcmZvcm1hbmNlICovCi0JaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoaHctPnBkZXYsIFBDSV9DQVBfSURfRVhQKSkKKwlpZiAocGNpX2lzX3BjaWUoaHctPnBkZXYpKQogCQlza3kyX3dyaXRlMzIoaHcsIFFfQUREUihyeHEsIFFfV00pLCBCTVVfV01fUEVYKTsKIAogCS8qIFRoZXNlIGNoaXBzIGhhdmUgbm8gcmFtIGJ1ZmZlcj8KQEAgLTIwNTEsNiArMjEzNSw4IEBACiAJCVtGQ19CT1RIXQk9ICJib3RoIiwKIAl9OwogCisJc2t5Ml9zZXRfaXBnKHNreTIpOworCiAJc2t5Ml9lbmFibGVfcnhfdHgoc2t5Mik7CiAKIAlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCBQSFlfTV9ERUZfTVNLKTsKQEAgLTIyODgsOCArMjM3NCwxMSBAQAogCWRldi0+bXR1ID0gbmV3X210dTsKIAluZXRkZXZfdXBkYXRlX2ZlYXR1cmVzKGRldik7CiAKLQltb2RlID0gREFUQV9CTElORF9WQUwoREFUQV9CTElORF9ERUYpIHwKLQkJR01fU01PRF9WTEFOX0VOQSB8IElQR19EQVRBX1ZBTChJUEdfREFUQV9ERUYpOworCW1vZGUgPSBEQVRBX0JMSU5EX1ZBTChEQVRBX0JMSU5EX0RFRikgfAlHTV9TTU9EX1ZMQU5fRU5BOworCWlmIChza3kyLT5zcGVlZCA+IFNQRUVEXzEwMCkKKwkJbW9kZSB8PSBJUEdfREFUQV9WQUwoSVBHX0RBVEFfREVGXzEwMDApOworCWVsc2UKKwkJbW9kZSB8PSBJUEdfREFUQV9WQUwoSVBHX0RBVEFfREVGXzEwXzEwMCk7CiAKIAlpZiAoZGV2LT5tdHUgPiBFVEhfREFUQV9MRU4pCiAJCW1vZGUgfD0gR01fU01PRF9KVU1CT19FTkE7CkBAIC0yMzgzLDcgKzI0NzIsNyBAQAogCXN0cnVjdCByeF9yaW5nX2luZm8gbnJlOwogCXVuc2lnbmVkIGhkcl9zcGFjZSA9IHNreTItPnJ4X2RhdGFfc2l6ZTsKIAotCW5yZS5za2IgPSBza3kyX3J4X2FsbG9jKHNreTIpOworCW5yZS5za2IgPSBza3kyX3J4X2FsbG9jKHNreTIsIEdGUF9BVE9NSUMpOwogCWlmICh1bmxpa2VseSghbnJlLnNrYikpCiAJCWdvdG8gbm9idWY7CiAKQEAgLTI5MzgsNiArMzAyNyw4IEBACiAJY2FzZSBDSElQX0lEX1lVS09OX1NVUFI6CiAJY2FzZSBDSElQX0lEX1lVS09OX1VMXzI6CiAJY2FzZSBDSElQX0lEX1lVS09OX09QVDoKKwljYXNlIENISVBfSURfWVVLT05fUFJNOgorCWNhc2UgQ0hJUF9JRF9ZVUtPTl9PUF8yOgogCQlyZXR1cm4gMTI1OwogCiAJY2FzZSBDSElQX0lEX1lVS09OX0ZFOgpAQCAtMjk5NCw3ICszMDg1LDggQEAKIAkJaHctPmZsYWdzID0gU0tZMl9IV19HSUdBQklUCiAJCQl8IFNLWTJfSFdfTkVXRVJfUEhZCiAJCQl8IFNLWTJfSFdfTkVXX0xFCi0JCQl8IFNLWTJfSFdfQURWX1BPV0VSX0NUTDsKKwkJCXwgU0tZMl9IV19BRFZfUE9XRVJfQ1RMCisJCQl8IFNLWTJfSFdfUlNTX0NIS1NVTTsKIAogCQkvKiBOZXcgdHJhbnNtaXQgY2hlY2tzdW0gKi8KIAkJaWYgKGh3LT5jaGlwX3JldiAhPSBDSElQX1JFVl9ZVV9FWF9CMCkKQEAgLTMwMjIsNyArMzExNCw3IEBACiAKIAkJLyogVGhlIHdvcmthcm91bmQgZm9yIHN0YXR1cyBjb25mbGljdHMgVkxBTiB0YWcgZGV0ZWN0aW9uLiAqLwogCQlpZiAoaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0ZFMl9BMCkKLQkJCWh3LT5mbGFncyB8PSBTS1kyX0hXX1ZMQU5fQlJPS0VOOworCQkJaHctPmZsYWdzIHw9IFNLWTJfSFdfVkxBTl9CUk9LRU4gfCBTS1kyX0hXX1JTU19DSEtTVU07CiAJCWJyZWFrOwogCiAJY2FzZSBDSElQX0lEX1lVS09OX1NVUFI6CkBAIC0zMDMxLDYgKzMxMjMsOSBAQAogCQkJfCBTS1kyX0hXX05FV19MRQogCQkJfCBTS1kyX0hXX0FVVE9fVFhfU1VNCiAJCQl8IFNLWTJfSFdfQURWX1BPV0VSX0NUTDsKKworCQlpZiAoaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX1NVX0EwKQorCQkJaHctPmZsYWdzIHw9IFNLWTJfSFdfUlNTX0NIS1NVTTsKIAkJYnJlYWs7CiAKIAljYXNlIENISVBfSURfWVVLT05fVUxfMjoKQEAgLTMwMzksNiArMzEzNCw4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBDSElQX0lEX1lVS09OX09QVDoKKwljYXNlIENISVBfSURfWVVLT05fUFJNOgorCWNhc2UgQ0hJUF9JRF9ZVUtPTl9PUF8yOgogCQlody0+ZmxhZ3MgPSBTS1kyX0hXX0dJR0FCSVQKIAkJCXwgU0tZMl9IV19ORVdfTEUKIAkJCXwgU0tZMl9IV19BRFZfUE9XRVJfQ1RMOwpAQCAtMzA3MSw3ICszMTY4LDcgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGh3LT5wZGV2OwogCXUxNiBzdGF0dXM7Ci0JaW50IGksIGNhcDsKKwlpbnQgaTsKIAl1MzIgaHdlX21hc2sgPSBZMl9IV0VfQUxMX01BU0s7CiAKIAkvKiBkaXNhYmxlIEFTRiAqLwpAQCAtMzEwNyw4ICszMjA0LDcgQEAKIAogCXNreTJfd3JpdGU4KGh3LCBCMF9DVFNULCBDU19NUlNUX0NMUik7CiAKLQljYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKLQlpZiAoY2FwKSB7CisJaWYgKHBjaV9pc19wY2llKHBkZXYpKSB7CiAJCXNreTJfd3JpdGUzMihodywgWTJfQ0ZHX0FFUiArIFBDSV9FUlJfVU5DT1JfU1RBVFVTLAogCQkJICAgICAweGZmZmZmZmZmdWwpOwogCkBAIC0zMTM5LDMwICszMjM1LDMzIEBACiAJCXNreTJfcGNpX3dyaXRlMzIoaHcsIFBDSV9ERVZfUkVHMywgUF9DTEtfTUFDU0VDX0RJUyk7CiAJfQogCi0JaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fT1BUKSB7CisJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fT1BUIHx8CisJICAgIGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fUFJNIHx8CisJICAgIGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fT1BfMikgewogCQl1MTYgcmVnOwogCQl1MzIgbXNrOwogCi0JCWlmIChody0+Y2hpcF9yZXYgPT0gMCkgeworCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9PUFQgJiYgaHctPmNoaXBfcmV2ID09IDApIHsKIAkJCS8qIGRpc2FibGUgUENJLUUgUEhZIHBvd2VyIGRvd24gKHNldCBQSFkgcmVnIDB4ODAsIGJpdCA3ICovCiAJCQlza3kyX3dyaXRlMzIoaHcsIFkyX1BFWF9QSFlfREFUQSwgKDB4ODBVTCA8PCAxNikgfCAoMSA8PCA3KSk7CiAKIAkJCS8qIHNldCBQSFkgTGluayBEZXRlY3QgVGltZXIgdG8gMS4xIHNlY29uZCAoMTF4IDEwMG1zKSAqLwogCQkJcmVnID0gMTA7CisKKwkJCS8qIHJlLWVuYWJsZSBQRVggUE0gaW4gUEVYIFBIWSBkZWJ1ZyByZWcuIDggKGNsZWFyIGJpdCAxMikgKi8KKwkJCXNreTJfd3JpdGUzMihodywgWTJfUEVYX1BIWV9EQVRBLCBQRVhfREJfQUNDRVNTIHwgKDB4MDhVTCA8PCAxNikpOwogCQl9IGVsc2UgewogCQkJLyogc2V0IFBIWSBMaW5rIERldGVjdCBUaW1lciB0byAwLjQgc2Vjb25kICg0eCAxMDBtcykgKi8KIAkJCXJlZyA9IDM7CiAJCX0KIAogCQlyZWcgPDw9IFBTTV9DT05GSUdfUkVHNF9USU1FUl9QSFlfTElOS19ERVRFQ1RfQkFTRTsKKwkJcmVnIHw9IFBTTV9DT05GSUdfUkVHNF9SU1RfUEhZX0xJTktfREVURUNUOwogCiAJCS8qIHJlc2V0IFBIWSBMaW5rIERldGVjdCAqLwogCQlza3kyX3dyaXRlOChodywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09OKTsKLQkJc2t5Ml9wY2lfd3JpdGUxNihodywgUFNNX0NPTkZJR19SRUc0LAotCQkJCSByZWcgfCBQU01fQ09ORklHX1JFRzRfUlNUX1BIWV9MSU5LX0RFVEVDVCk7CiAJCXNreTJfcGNpX3dyaXRlMTYoaHcsIFBTTV9DT05GSUdfUkVHNCwgcmVnKTsKIAotCiAJCS8qIGVuYWJsZSBQSFkgUXVpY2sgTGluayAqLwogCQltc2sgPSBza3kyX3JlYWQzMihodywgQjBfSU1TSyk7CiAJCW1zayB8PSBZMl9JU19QSFlfUUxOSzsKQEAgLTMxNzAsMTEgKzMyNjksMTEgQEAKIAogCQkvKiBjaGVjayBpZiBQU012MiB3YXMgcnVubmluZyBiZWZvcmUgKi8KIAkJcmVnID0gc2t5Ml9wY2lfcmVhZDE2KGh3LCBQU01fQ09ORklHX1JFRzMpOwotCQlpZiAocmVnICYgUENJX0VYUF9MTktDVExfQVNQTUMpIHsKLQkJCWNhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9FWFApOworCQlpZiAocmVnICYgUENJX0VYUF9MTktDVExfQVNQTUMpCiAJCQkvKiByZXN0b3JlIHRoZSBQQ0llIExpbmsgQ29udHJvbCByZWdpc3RlciAqLwotCQkJc2t5Ml9wY2lfd3JpdGUxNihodywgY2FwICsgUENJX0VYUF9MTktDVEwsIHJlZyk7Ci0JCX0KKwkJCXNreTJfcGNpX3dyaXRlMTYoaHcsIHBkZXYtPnBjaWVfY2FwICsgUENJX0VYUF9MTktDVEwsCisJCQkJCSByZWcpOworCiAJCXNreTJfd3JpdGU4KGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT0ZGKTsKIAogCQkvKiByZS1lbmFibGUgUEVYIFBNIGluIFBFWCBQSFkgZGVidWcgcmVnLiA4IChjbGVhciBiaXQgMTIpICovCkBAIC00MTc1LDggKzQyNzQsMTggQEAKIAkvKiBJbiBvcmRlciB0byBkbyBKdW1ibyBwYWNrZXRzIG9uIHRoZXNlIGNoaXBzLCBuZWVkIHRvIHR1cm4gb2ZmIHRoZQogCSAqIHRyYW5zbWl0IHN0b3JlL2ZvcndhcmQuIFRoZXJlZm9yZSBjaGVja3N1bSBvZmZsb2FkIHdvbid0IHdvcmsuCiAJICovCi0JaWYgKGRldi0+bXR1ID4gRVRIX0RBVEFfTEVOICYmIGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUNfVSkKKwlpZiAoZGV2LT5tdHUgPiBFVEhfREFUQV9MRU4gJiYgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKSB7CisJCW5ldGRldl9pbmZvKGRldiwgImNoZWNrc3VtIG9mZmxvYWQgbm90IHBvc3NpYmxlIHdpdGgganVtYm8gZnJhbWVzXG4iKTsKIAkJZmVhdHVyZXMgJj0gfihORVRJRl9GX1RTT3xORVRJRl9GX1NHfE5FVElGX0ZfQUxMX0NTVU0pOworCX0KKworCS8qIFNvbWUgaGFyZHdhcmUgcmVxdWlyZXMgcmVjZWl2ZSBjaGVja3N1bSBmb3IgUlNTIHRvIHdvcmsuICovCisJaWYgKCAoZmVhdHVyZXMgJiBORVRJRl9GX1JYSEFTSCkgJiYKKwkgICAgICEoZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkgJiYKKwkgICAgIChza3kyLT5ody0+ZmxhZ3MgJiBTS1kyX0hXX1JTU19DSEtTVU0pKSB7CisJCW5ldGRldl9pbmZvKGRldiwgInJlY2VpdmUgaGFzaGluZyBmb3JjZXMgcmVjZWl2ZSBjaGVja3N1bVxuIik7CisJCWZlYXR1cmVzIHw9IE5FVElGX0ZfUlhDU1VNOworCX0KIAogCXJldHVybiBmZWF0dXJlczsKIH0KQEAgLTQ2NzYsOSArNDc4NSwxMSBAQAogCQkiVUwgMiIsCQkvKiAweGJhICovCiAJCSJVbmtub3duIiwJLyogMHhiYiAqLwogCQkiT3B0aW1hIiwJLyogMHhiYyAqLworCQkiT3B0aW1hIFByaW1lIiwgLyogMHhiZCAqLworCQkiT3B0aW1hIDIiLAkvKiAweGJlICovCiAJfTsKIAotCWlmIChjaGlwaWQgPj0gQ0hJUF9JRF9ZVUtPTl9YTCAmJiBjaGlwaWQgPD0gQ0hJUF9JRF9ZVUtPTl9PUFQpCisJaWYgKGNoaXBpZCA+PSBDSElQX0lEX1lVS09OX1hMICYmIGNoaXBpZCA8PSBDSElQX0lEX1lVS09OX09QXzIpCiAJCXN0cm5jcHkoYnVmLCBuYW1lW2NoaXBpZCAtIENISVBfSURfWVVLT05fWExdLCBzeik7CiAJZWxzZQogCQlzbnByaW50ZihidWYsIHN6LCAiKGNoaXAgJSN4KSIsIGNoaXBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za3kyLmggYi9kcml2ZXJzL25ldC9za3kyLmgKaW5kZXggMzE4YzlhZS4uMGFmMzFiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2t5Mi5oCisrKyBiL2RyaXZlcnMvbmV0L3NreTIuaApAQCAtNDEyLDcgKzQxMiw3IEBACiAJWTJfSVNfSFdfRVJSCT0gMTw8MzEsCS8qIEludGVycnVwdCBIVyBFcnJvciAqLwogCVkyX0lTX1NUQVRfQk1VCT0gMTw8MzAsCS8qIFN0YXR1cyBCTVUgSW50ZXJydXB0ICovCiAJWTJfSVNfQVNGCT0gMTw8MjksCS8qIEFTRiBzdWJzeXN0ZW0gSW50ZXJydXB0ICovCi0KKwlZMl9JU19DUFVfVE8JPSAxPDwyOCwJLyogQ1BVIFRpbWVvdXQgKi8KIAlZMl9JU19QT0xMX0NISwk9IDE8PDI3LAkvKiBDaGVjayBJUlEgZnJvbSBwb2xsaW5nIHVuaXQgKi8KIAlZMl9JU19UV1NJX1JEWQk9IDE8PDI2LAkvKiBJUlEgb24gZW5kIG9mIFRXU0kgVHggKi8KIAlZMl9JU19JUlFfU1cJPSAxPDwyNSwJLyogU1cgZm9yY2VkIElSUQkqLwpAQCAtNTQ3LDYgKzU0Nyw4IEBACiAJQ0hJUF9JRF9ZVUtPTl9TVVBSID0gMHhiOSwgLyogWVVLT04tMiBTdXByZW1lICovCiAJQ0hJUF9JRF9ZVUtPTl9VTF8yID0gMHhiYSwgLyogWVVLT04tMiBVbHRyYSAyICovCiAJQ0hJUF9JRF9ZVUtPTl9PUFQgID0gMHhiYywgLyogWVVLT04tMiBPcHRpbWEgKi8KKwlDSElQX0lEX1lVS09OX1BSTSAgPSAweGJkLCAvKiBZVUtPTi0yIE9wdGltYSBQcmltZSAqLworCUNISVBfSURfWVVLT05fT1BfMiA9IDB4YmUsIC8qIFlVS09OLTIgT3B0aW1hIDIgKi8KIH07CiAKIGVudW0geXVrb25feGxfcmV2IHsKQEAgLTE0MjAsOCArMTQyMiwxMCBAQAogCVBIWV9NX0VDX0ZJQl9BTl9FTkEgPSAxPDwzLCAvKiBGaWJlciBBdXRvLU5lZy4gRW5hYmxlICg4OEUxMDExUyBvbmx5KSAqLwogCVBIWV9NX0VDX0RURV9EX0VOQSAgPSAxPDwyLCAvKiBEVEUgRGV0ZWN0IEVuYWJsZSAoODhFMTExMSBvbmx5KSAqLwogCVBIWV9NX0VDX1RYX1RJTV9DVCAgPSAxPDwxLCAvKiBSR01JSSBUeCBUaW1pbmcgQ29udHJvbCAqLwotCVBIWV9NX0VDX1RSQU5TX0RJUyAgPSAxPDwwLCAvKiBUcmFuc21pdHRlciBEaXNhYmxlICg4OEUxMTExIG9ubHkpICovfTsKKwlQSFlfTV9FQ19UUkFOU19ESVMgID0gMTw8MCwgLyogVHJhbnNtaXR0ZXIgRGlzYWJsZSAoODhFMTExMSBvbmx5KSAqLwogCisJUEhZX01fMTBCX1RFX0VOQUJMRSA9IDE8PDcsIC8qIDEwQmFzZS1UZSBFbmFibGUgKDg4RTgwNzkgYW5kIGFib3ZlKSAqLworfTsKICNkZWZpbmUgUEhZX01fRUNfTV9EU0MoeCkJKCh1MTYpKHgpPDwxMCAmIFBIWV9NX0VDX01fRFNDX01TSykKIAkJCQkJLyogMDA9MXg7IDAxPTJ4OyAxMD0zeDsgMTE9NHggKi8KICNkZWZpbmUgUEhZX01fRUNfU19EU0MoeCkJKCh1MTYpKHgpPDw4ICYgUEhZX01fRUNfU19EU0NfTVNLKQpAQCAtMTgwNywxMCArMTgxMSwxMSBAQAogfTsKIAogI2RlZmluZSBEQVRBX0JMSU5EX1ZBTCh4KQkoKCh4KTw8MTEpICYgR01fU01PRF9EQVRBQkxfTVNLKQotI2RlZmluZSBEQVRBX0JMSU5EX0RFRgkJMHgwNAotCiAjZGVmaW5lIElQR19EQVRBX1ZBTCh4KQkJKHggJiBHTV9TTU9EX0lQR19NU0spCi0jZGVmaW5lIElQR19EQVRBX0RFRgkJMHgxZQorCisjZGVmaW5lIERBVEFfQkxJTkRfREVGCQkweDA0CisjZGVmaW5lIElQR19EQVRBX0RFRl8xMDAwCTB4MWUKKyNkZWZpbmUgSVBHX0RBVEFfREVGXzEwXzEwMAkweDE4CiAKIC8qCUdNX1NNSV9DVFJMCQkJMTYgYml0IHIvdwlTTUkgQ29udHJvbCBSZWdpc3RlciAqLwogZW51bSB7CkBAIC0yMjgxLDYgKzIyODYsNyBAQAogI2RlZmluZSBTS1kyX0hXX0FEVl9QT1dFUl9DVEwJMHgwMDAwMDA4MAkvKiBhZGRpdGlvbmFsIFBIWSBwb3dlciByZWdzICovCiAjZGVmaW5lIFNLWTJfSFdfUlNTX0JST0tFTgkweDAwMDAwMTAwCiAjZGVmaW5lIFNLWTJfSFdfVkxBTl9CUk9LRU4gICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgU0tZMl9IV19SU1NfQ0hLU1VNCTB4MDAwMDA0MDAJLyogUlNTIHJlcXVpcmVzIGNoa3N1bSAqLwogCiAJdTgJICAgICAJICAgICBjaGlwX2lkOwogCXU4CQkgICAgIGNoaXBfcmV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2xoYy5jIGIvZHJpdmVycy9uZXQvc2xoYy5jCmluZGV4IGFiOWUzYjcuLjBhMGE2NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NsaGMuYworKysgYi9kcml2ZXJzL25ldC9zbGhjLmMKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCQlsY3MgPSBjczsKIAkJY3MgPSBjcy0+bmV4dDsKIAkJY29tcC0+c2xzX29fc2VhcmNoZXMrKzsKLQl9OworCX0KIAkvKgogCSAqIERpZG4ndCBmaW5kIGl0IC0tIHJlLXVzZSBvbGRlc3QgY3N0YXRlLiAgU2VuZCBhbgogCSAqIHVuY29tcHJlc3NlZCBwYWNrZXQgdGhhdCB0ZWxscyB0aGUgb3RoZXIgc2lkZSB3aGF0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbGlwLmMgYi9kcml2ZXJzL25ldC9zbGlwLmMKaW5kZXggOGVjMWE5YS4uZjExYjNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2xpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3NsaXAuYwpAQCAtMTgyLDExICsxODIsMTEgQEAKICNpZmRlZiBTTF9JTkNMVURFX0NTTElQCiAJY2J1ZmYgPSB4Y2hnKCZzbC0+Y2J1ZmYsIGNidWZmKTsKIAlzbGNvbXAgPSB4Y2hnKCZzbC0+c2xjb21wLCBzbGNvbXApOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NMSVBfTU9ERV9TTElQNgogCXNsLT54ZGF0YSAgICA9IDA7CiAJc2wtPnhiaXRzICAgID0gMDsKICNlbmRpZgotI2VuZGlmCiAJc3Bpbl91bmxvY2tfYmgoJnNsLT5sb2NrKTsKIAllcnIgPSAwOwogCkBAIC0xOTQsOCArMTk0LDcgQEAKIGVycl9leGl0OgogI2lmZGVmIFNMX0lOQ0xVREVfQ1NMSVAKIAlrZnJlZShjYnVmZik7Ci0JaWYgKHNsY29tcCkKLQkJc2xoY19mcmVlKHNsY29tcCk7CisJc2xoY19mcmVlKHNsY29tcCk7CiAjZW5kaWYKIAlrZnJlZSh4YnVmZik7CiAJa2ZyZWUocmJ1ZmYpOwpAQCAtMjQ4LDcgKzI0Nyw3IEBACiAjZWxzZQogCWlmICh4YnVmZiA9PSBOVUxMIHx8IHJidWZmID09IE5VTEwpICB7CiAjZW5kaWYKLQkJaWYgKG10dSA+PSBzbC0+bXR1KSB7CisJCWlmIChtdHUgPiBzbC0+bXR1KSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIGdyb3cgc2xpcCBidWZmZXJzLCBNVFUgY2hhbmdlIGNhbmNlbGxlZC5cbiIsCiAJCQkgICAgICAgZGV2LT5uYW1lKTsKIAkJCWVyciA9IC1FTk9CVUZTOwpAQCAtNzI0LDEyICs3MjMsMTAgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2xpcCAqc2xfYWxsb2MoZGV2X3QgbGluZSkKIHsKIAlpbnQgaTsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOwogCXN0cnVjdCBzbGlwICAgICAgICpzbDsKIAotCWlmIChzbGlwX2RldnMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CS8qIE1hc3RlciBhcnJheSBtaXNzaW5nICEgKi8KLQogCWZvciAoaSA9IDA7IGkgPCBzbGlwX21heGRldjsgaSsrKSB7CiAJCWRldiA9IHNsaXBfZGV2c1tpXTsKIAkJaWYgKGRldiA9PSBOVUxMKQpAQCAtNzM5LDI1ICs3MzYsMTIgQEAKIAlpZiAoaSA+PSBzbGlwX21heGRldikKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoZGV2KSB7Ci0JCXNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkJaWYgKHRlc3RfYml0KFNMRl9JTlVTRSwgJnNsLT5mbGFncykpIHsKLQkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7Ci0JCQlkZXYgPSBOVUxMOwotCQkJc2xpcF9kZXZzW2ldID0gTlVMTDsKLQkJfQotCX0KKwlzcHJpbnRmKG5hbWUsICJzbCVkIiwgaSk7CisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZigqc2wpLCBuYW1lLCBzbF9zZXR1cCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOwogCi0JaWYgKCFkZXYpIHsKLQkJY2hhciBuYW1lW0lGTkFNU0laXTsKLQkJc3ByaW50ZihuYW1lLCAic2wlZCIsIGkpOwotCi0JCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnNsKSwgbmFtZSwgc2xfc2V0dXApOwotCQlpZiAoIWRldikKLQkJCXJldHVybiBOVUxMOwotCQlkZXYtPmJhc2VfYWRkciAgPSBpOwotCX0KLQorCWRldi0+YmFzZV9hZGRyICA9IGk7CiAJc2wgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJLyogSW5pdGlhbGl6ZSBjaGFubmVsIGNvbnRyb2wgZGF0YSAqLwpAQCAtODIzLDcgKzgwNyw2IEBACiAKIAlzbC0+dHR5ID0gdHR5OwogCXR0eS0+ZGlzY19kYXRhID0gc2w7Ci0Jc2wtPmxpbmUgPSB0dHlfZGV2bnVtKHR0eSk7CiAJc2wtPnBpZCA9IGN1cnJlbnQtPnBpZDsKIAogCWlmICghdGVzdF9iaXQoU0xGX0lOVVNFLCAmc2wtPmZsYWdzKSkgewpAQCAtODkwLDggKzg3Myw2IEBACiAKIAl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CiAJc2wtPnR0eSA9IE5VTEw7Ci0JaWYgKCFzbC0+bGVhc2VkKQotCQlzbC0+bGluZSA9IDA7CiAKIAkvKiBWU1YgPSB2ZXJ5IGltcG9ydGFudCB0byByZW1vdmUgdGltZXJzICovCiAjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NsaXAuaCBiL2RyaXZlcnMvbmV0L3NsaXAuaAppbmRleCA5MTRlOTU4Li5hYTA3NjRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbGlwLmgKKysrIGIvZHJpdmVycy9uZXQvc2xpcC5oCkBAIC05MCw3ICs5MCw2IEBACiAKICAgdW5zaWduZWQgY2hhcgkJbW9kZTsJCS8qIFNMSVAgbW9kZQkJCSovCiAgIHVuc2lnbmVkIGNoYXIJCWxlYXNlZDsKLSAgZGV2X3QJCQlsaW5lOwogICBwaWRfdAkJCXBpZDsKICNkZWZpbmUgU0xfTU9ERV9TTElQCTAKICNkZWZpbmUgU0xfTU9ERV9DU0xJUAkxCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWMtbWNhLmMgYi9kcml2ZXJzL25ldC9zbWMtbWNhLmMKaW5kZXggZDA3YzM5Yy4uMzQ5MzRmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jLW1jYS5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYy1tY2EuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKaW5kZXggMjM1YTNjNi4uYmE0NGVkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKKysrIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKQEAgLTYyLDYgKzYyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTExeC5jIGIvZHJpdmVycy9uZXQvc21jOTExeC5jCmluZGV4IDA1Mzg2M2EuLmE5MWZlMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxMXguYworKysgYi9kcml2ZXJzL25ldC9zbWM5MTF4LmMKQEAgLTEzNTEsMTEgKzEzNTEsNiBAQAogCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CiAJCQl1MzIgcG9zaXRpb247CiAKLQkJCS8qIG1ha2Ugc3VyZSB0aGlzIGlzIGEgbXVsdGljYXN0IGFkZHJlc3MgLQotCQkJCXNob3VsZG4ndCB0aGlzIGJlIGEgZ2l2ZW4gaWYgd2UgaGF2ZSBpdCBoZXJlID8gKi8KLQkJCWlmICghKCpoYS0+YWRkciAmIDEpKQotCQkJCWNvbnRpbnVlOwotCiAJCQkvKiB1cHBlciA2IGJpdHMgYXJlIHVzZWQgYXMgaGFzaCBpbmRleCAqLwogCQkJcG9zaXRpb24gPSBldGhlcl9jcmMoRVRIX0FMRU4sIGhhLT5hZGRyKT4+MjY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxOTQuYyBiL2RyaXZlcnMvbmV0L3NtYzkxOTQuYwppbmRleCA3NDg2ZDA5Li41YjY1YWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MTk0LmMKKysrIGIvZHJpdmVycy9uZXQvc21jOTE5NC5jCkBAIC00NDcsMTEgKzQ0Nyw2IEBACiAJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewogCQlpbnQgcG9zaXRpb247CiAKLQkJLyogbWFrZSBzdXJlIHRoaXMgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcyAtIHNob3VsZG4ndCB0aGlzCi0JCSAgIGJlIGEgZ2l2ZW4gaWYgd2UgaGF2ZSBpdCBoZXJlID8gKi8KLQkJaWYgKCEoKmhhLT5hZGRyICYgMSkpCi0JCQljb250aW51ZTsKLQogCQkvKiBvbmx5IHVzZSB0aGUgbG93IG9yZGVyIGJpdHMgKi8KIAkJcG9zaXRpb24gPSBldGhlcl9jcmNfbGUoNiwgaGEtPmFkZHIpICYgMHgzZjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTF4LmMgYi9kcml2ZXJzL25ldC9zbWM5MXguYwppbmRleCBkYzQ4MDVmLi4yYjFkMjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MXguYworKysgYi9kcml2ZXJzL25ldC9zbWM5MXguYwpAQCAtMTQyNSwxMSArMTQyNSw2IEBACiAJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKIAkJCWludCBwb3NpdGlvbjsKIAotCQkJLyogbWFrZSBzdXJlIHRoaXMgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcyAtCi0JCSAgIAkgICBzaG91bGRuJ3QgdGhpcyBiZSBhIGdpdmVuIGlmIHdlIGhhdmUgaXQgaGVyZSA/ICovCi0JCQlpZiAoISgqaGEtPmFkZHIgJiAxKSkKLQkJCQljb250aW51ZTsKLQogCQkJLyogb25seSB1c2UgdGhlIGxvdyBvcmRlciBiaXRzICovCiAJCQlwb3NpdGlvbiA9IGNyYzMyX2xlKH4wLCBoYS0+YWRkciwgNikgJiAweDNmOwogCkBAIC0yNDAwLDggKzIzOTUsMTAgQEAKIAl7IC5jb21wYXRpYmxlID0gInNtc2MsbGFuOTFjOTQiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAic21zYyxsYW45MWMxMTEiLCB9LAogCXt9LAotfQorfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNtYzkxeF9tYXRjaCk7CisjZWxzZQorI2RlZmluZSBzbWM5MXhfbWF0Y2ggTlVMTAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyBzbWNfZHJ2X3BtX29wcyA9IHsKQEAgLTI0MTYsOSArMjQxMyw3IEBACiAJCS5uYW1lCT0gQ0FSRE5BTUUsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkucG0JPSAmc21jX2Rydl9wbV9vcHMsCi0jaWZkZWYgQ09ORklHX09GCiAJCS5vZl9tYXRjaF90YWJsZSA9IHNtYzkxeF9tYXRjaCwKLSNlbmRpZgogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbXNjOTExeC5jIGIvZHJpdmVycy9uZXQvc21zYzkxMXguYwppbmRleCBjNmQ0N2QxLi5iOTAxNmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbXNjOTExeC5jCisrKyBiL2RyaXZlcnMvbmV0L3Ntc2M5MTF4LmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xNDczLDYgKzE0NzQsNyBAQAogCiAJcGRhdGEtPm9wcy0+dHhfd3JpdGVmaWZvKHBkYXRhLCAodW5zaWduZWQgaW50ICopYnVmcCwgd3Jzeik7CiAJZnJlZXNwYWNlIC09IChza2ItPmxlbiArIDMyKTsKKwlza2JfdHhfdGltZXN0YW1wKHNrYik7CiAJZGV2X2tmcmVlX3NrYihza2IpOwogCiAJaWYgKHVubGlrZWx5KHNtc2M5MTF4X3R4X2dldF90eHN0YXRjb3VudChwZGF0YSkgPj0gMzApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21zYzk0MjAuYyBiL2RyaXZlcnMvbmV0L3Ntc2M5NDIwLmMKaW5kZXggNGM5MmFkOC4uNDU5NzI2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21zYzk0MjAuYworKysgYi9kcml2ZXJzL25ldC9zbXNjOTQyMC5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgpAQCAtMTAzMCw2ICsxMDMxLDggQEAKIAlwZC0+dHhfcmluZ1tpbmRleF0uc3RhdHVzID0gVERFUzBfT1dOXzsKIAl3bWIoKTsKIAorCXNrYl90eF90aW1lc3RhbXAoc2tiKTsKKwogCS8qIGtpY2sgdGhlIERNQSAqLwogCXNtc2M5NDIwX3JlZ193cml0ZShwZCwgVFhfUE9MTF9ERU1BTkQsIDEpOwogCXNtc2M5NDIwX3BjaV9mbHVzaF93cml0ZShwZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKaW5kZXggOTQ5ZjEyNC4uMWZmMzQ5MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYworKysgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KQEAgLTEwMDMsOSArMTAwNCw3IEBACiAJfQogCiAJaWYgKGRhdGFfc3RhdHVzICYgU1BJREVSX05FVF9WTEFOX1BBQ0tFVCkgewotCQkvKiBmdXJ0aGVyIGVuaGFuY2VtZW50czogSFctYWNjZWwgVkxBTgotCQkgKiB2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2IKLQkJICovCisJCS8qIGZ1cnRoZXIgZW5oYW5jZW1lbnRzOiBIVy1hY2NlbCBWTEFOICovCiAJfQogCiAJLyogdXBkYXRlIG5ldGRldmljZSBzdGF0aXN0aWNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jIGIvZHJpdmVycy9uZXQvc3RhcmZpcmUuYwppbmRleCAzNjA0NWYzLi43YWUxZjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuMSIKICNkZWZpbmUgRFJWX1JFTERBVEUJIkp1bHkgIDYsIDIwMDgiCiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTU2MCw3ICs1NjEsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CiAjaWZkZWYgVkxBTl9TVVBQT1JUCi0Jc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3ZsYW5zW0JJVFNfVE9fTE9OR1MoVkxBTl9OX1ZJRCldOwogI2VuZGlmCiAJdm9pZCAqcXVldWVfbWVtOwogCWRtYV9hZGRyX3QgcXVldWVfbWVtX2RtYTsKQEAgLTYwNiwxOCArNjA3LDYgQEAKIAogCiAjaWZkZWYgVkxBTl9TVVBQT1JUCi1zdGF0aWMgdm9pZCBuZXRkZXZfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQotewotICAgICAgICBzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotICAgICAgICBzcGluX2xvY2soJm5wLT5sb2NrKTsKLQlpZiAoZGVidWcgPiAyKQotCQlwcmludGsoIiVzOiBTZXR0aW5nIHZsZ3JwIHRvICVwXG4iLCBkZXYtPm5hbWUsIGdycCk7Ci0gICAgICAgIG5wLT52bGdycCA9IGdycDsKLQlzZXRfcnhfbW9kZShkZXYpOwotICAgICAgICBzcGluX3VubG9jaygmbnAtPmxvY2spOwotfQotCiBzdGF0aWMgdm9pZCBuZXRkZXZfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTYyNSw2ICs2MTQsNyBAQAogCXNwaW5fbG9jaygmbnAtPmxvY2spOwogCWlmIChkZWJ1ZyA+IDEpCiAJCXByaW50aygiJXM6IEFkZGluZyB2bGFuaWQgJWQgdG8gdmxhbiBmaWx0ZXJcbiIsIGRldi0+bmFtZSwgdmlkKTsKKwlzZXRfYml0KHZpZCwgbnAtPmFjdGl2ZV92bGFucyk7CiAJc2V0X3J4X21vZGUoZGV2KTsKIAlzcGluX3VubG9jaygmbnAtPmxvY2spOwogfQpAQCAtNjM2LDcgKzYyNiw3IEBACiAJc3Bpbl9sb2NrKCZucC0+bG9jayk7CiAJaWYgKGRlYnVnID4gMSkKIAkJcHJpbnRrKCIlczogcmVtb3ZpbmcgdmxhbmlkICVkIGZyb20gdmxhbiBmaWx0ZXJcbiIsIGRldi0+bmFtZSwgdmlkKTsKLQl2bGFuX2dyb3VwX3NldF9kZXZpY2UobnAtPnZsZ3JwLCB2aWQsIE5VTEwpOworCWNsZWFyX2JpdCh2aWQsIG5wLT5hY3RpdmVfdmxhbnMpOwogCXNldF9yeF9tb2RlKGRldik7CiAJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKIH0KQEAgLTY0NywxNSArNjM3LDE0IEBACiAJLm5kb19vcGVuCQk9IG5ldGRldl9vcGVuLAogCS5uZG9fc3RvcAkJPSBuZXRkZXZfY2xvc2UsCiAJLm5kb19zdGFydF94bWl0CQk9IHN0YXJ0X3R4LAotCS5uZG9fdHhfdGltZW91dCAJPSB0eF90aW1lb3V0LAotCS5uZG9fZ2V0X3N0YXRzIAkJPSBnZXRfc3RhdHMsCisJLm5kb190eF90aW1lb3V0CQk9IHR4X3RpbWVvdXQsCisJLm5kb19nZXRfc3RhdHMJCT0gZ2V0X3N0YXRzLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlLAotCS5uZG9fZG9faW9jdGwgCQk9IG5ldGRldl9pb2N0bCwKKwkubmRvX2RvX2lvY3RsCQk9IG5ldGRldl9pb2N0bCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogI2lmZGVmIFZMQU5fU1VQUE9SVAotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IG5ldGRldl92bGFuX3J4X3JlZ2lzdGVyLAogCS5uZG9fdmxhbl9yeF9hZGRfdmlkCT0gbmV0ZGV2X3ZsYW5fcnhfYWRkX3ZpZCwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSBuZXRkZXZfdmxhbl9yeF9raWxsX3ZpZCwKICNlbmRpZgpAQCAtMTUyNywyMSArMTUxNiwxNyBAQAogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjaGVja3N1bV9odywgc3RhdHVzMiA9ICUjeFxuIiwgZGV2LT5uYW1lLCBsZTE2X3RvX2NwdShkZXNjLT5zdGF0dXMyKSk7CiAJCX0KICNpZmRlZiBWTEFOX1NVUFBPUlQKLQkJaWYgKG5wLT52bGdycCAmJiBsZTE2X3RvX2NwdShkZXNjLT5zdGF0dXMyKSAmIDB4MDIwMCkgeworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+c3RhdHVzMikgJiAweDAyMDApIHsKIAkJCXUxNiB2bGlkID0gbGUxNl90b19jcHUoZGVzYy0+dmxhbmlkKTsKIAogCQkJaWYgKGRlYnVnID4gNCkgewogCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIG5ldGRldl9yeCgpIHZsYW5pZCA9ICVkXG4iLAogCQkJCSAgICAgICB2bGlkKTsKIAkJCX0KLQkJCS8qCi0JCQkgKiB2bGFuX2h3YWNjZWxfcnggZXhwZWN0cyBhIHBhY2tldCB3aXRoIHRoZSBWTEFOIHRhZwotCQkJICogc3RyaXBwZWQgb3V0LgotCQkJICovCi0JCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBucC0+dmxncnAsIHZsaWQpOwotCQl9IGVsc2UKKwkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGlkKTsKKwkJfQogI2VuZGlmIC8qIFZMQU5fU1VQUE9SVCAqLwotCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIAkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAKIAluZXh0X3J4OgpAQCAtMTc1MSw2ICsxNzM2LDMyIEBACiAJcmV0dXJuICZkZXYtPnN0YXRzOwogfQogCisjaWZkZWYgVkxBTl9TVVBQT1JUCitzdGF0aWMgdTMyIHNldF92bGFuX21vZGUoc3RydWN0IG5ldGRldl9wcml2YXRlICpucCkKK3sKKwl1MzIgcmV0ID0gVmxhbk1vZGU7CisJdTE2IHZpZDsKKwl2b2lkIF9faW9tZW0gKmZpbHRlcl9hZGRyID0gbnAtPmJhc2UgKyBIYXNoVGFibGUgKyA4OworCWludCB2bGFuX2NvdW50ID0gMDsKKworCWZvcl9lYWNoX3NldF9iaXQodmlkLCBucC0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKSB7CisJCWlmICh2bGFuX2NvdW50ID09IDMyKQorCQkJYnJlYWs7CisJCXdyaXRldyh2aWQsIGZpbHRlcl9hZGRyKTsKKwkJZmlsdGVyX2FkZHIgKz0gMTY7CisJCXZsYW5fY291bnQrKzsKKwl9CisJaWYgKHZsYW5fY291bnQgPT0gMzIpIHsKKwkJcmV0IHw9IFBlcmZlY3RGaWx0ZXJWbGFuOworCQl3aGlsZSAodmxhbl9jb3VudCA8IDMyKSB7CisJCQl3cml0ZXcoMCwgZmlsdGVyX2FkZHIpOworCQkJZmlsdGVyX2FkZHIgKz0gMTY7CisJCQl2bGFuX2NvdW50Kys7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKiBWTEFOX1NVUFBPUlQgKi8KIAogc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTE3NTksMzAgKzE3NzAsOSBAQAogCXUzMiByeF9tb2RlID0gTWluVkxBTlByaW87CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKIAlpbnQgaTsKLSNpZmRlZiBWTEFOX1NVUFBPUlQKIAotCXJ4X21vZGUgfD0gVmxhbk1vZGU7Ci0JaWYgKG5wLT52bGdycCkgewotCQlpbnQgdmxhbl9jb3VudCA9IDA7Ci0JCXZvaWQgX19pb21lbSAqZmlsdGVyX2FkZHIgPSBpb2FkZHIgKyBIYXNoVGFibGUgKyA4OwotCQlmb3IgKGkgPSAwOyBpIDwgVkxBTl9WSURfTUFTSzsgaSsrKSB7Ci0JCQlpZiAodmxhbl9ncm91cF9nZXRfZGV2aWNlKG5wLT52bGdycCwgaSkpIHsKLQkJCQlpZiAodmxhbl9jb3VudCA+PSAzMikKLQkJCQkJYnJlYWs7Ci0JCQkJd3JpdGV3KGksIGZpbHRlcl9hZGRyKTsKLQkJCQlmaWx0ZXJfYWRkciArPSAxNjsKLQkJCQl2bGFuX2NvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJaWYgKGkgPT0gVkxBTl9WSURfTUFTSykgewotCQkJcnhfbW9kZSB8PSBQZXJmZWN0RmlsdGVyVmxhbjsKLQkJCXdoaWxlICh2bGFuX2NvdW50IDwgMzIpIHsKLQkJCQl3cml0ZXcoMCwgZmlsdGVyX2FkZHIpOwotCQkJCWZpbHRlcl9hZGRyICs9IDE2OwotCQkJCXZsYW5fY291bnQrKzsKLQkJCX0KLQkJfQotCX0KKyNpZmRlZiBWTEFOX1NVUFBPUlQKKwlyeF9tb2RlIHw9IHNldF92bGFuX21vZGUobnApOwogI2VuZGlmIC8qIFZMQU5fU1VQUE9SVCAqLwogCiAJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkvKiBTZXQgcHJvbWlzY3VvdXMuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdG1tYWMvZHdtYWMxMDAwX2NvcmUuYyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9kd21hYzEwMDBfY29yZS5jCmluZGV4IGYyMDQ1NWMuLjBmNjNiM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0bW1hYy9kd21hYzEwMDBfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9kd21hYzEwMDBfY29yZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJkd21hYzEwMDAuaCIKIAogc3RhdGljIHZvaWQgZHdtYWMxMDAwX2NvcmVfaW5pdCh2b2lkIF9faW9tZW0gKmlvYWRkcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0bW1hYy9kd21hYzEwMDBfZG1hLmMgYi9kcml2ZXJzL25ldC9zdG1tYWMvZHdtYWMxMDAwX2RtYS5jCmluZGV4IDJjNDc3MTIuLjNkYmVlYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0bW1hYy9kd21hYzEwMDBfZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvc3RtbWFjL2R3bWFjMTAwMF9kbWEuYwpAQCAtMjYsNiArMjYsNyBAQAogICBBdXRob3I6IEdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJkd21hYzEwMDAuaCIKICNpbmNsdWRlICJkd21hY19kbWEuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL2R3bWFjMTAwX2NvcmUuYyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9kd21hYzEwMF9jb3JlLmMKaW5kZXggYzcyNGZjMy4uNzQzYTU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3RtbWFjL2R3bWFjMTAwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9zdG1tYWMvZHdtYWMxMDBfY29yZS5jCkBAIC0yOSw2ICsyOSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJkd21hYzEwMC5oIgogCiBzdGF0aWMgdm9pZCBkd21hYzEwMF9jb3JlX2luaXQodm9pZCBfX2lvbWVtICppb2FkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdG1tYWMvZHdtYWMxMDBfZG1hLmMgYi9kcml2ZXJzL25ldC9zdG1tYWMvZHdtYWMxMDBfZG1hLmMKaW5kZXggZTNlMjI0Yi4uNjI3ZjY1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3RtbWFjL2R3bWFjMTAwX2RtYS5jCisrKyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9kd21hYzEwMF9kbWEuYwpAQCAtMjgsNiArMjgsNyBAQAogICBBdXRob3I6IEdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJkd21hYzEwMC5oIgogI2luY2x1ZGUgImR3bWFjX2RtYS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjLmggYi9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjLmgKaW5kZXggMmIwNzZiMy4uZGUxOTI5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3RtbWFjL3N0bW1hYy5oCisrKyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWMuaApAQCAtMjAsNyArMjAsNyBAQAogICBBdXRob3I6IEdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSJOb3ZfMjAxMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSJKdWx5XzIwMTEiCiAjaW5jbHVkZSA8bGludXgvc3RtbWFjLmg+CiAKICNpbmNsdWRlICJjb21tb24uaCIKQEAgLTU2LDE0ICs1Niw5IEBACiAJc3RydWN0IHN0bW1hY19leHRyYV9zdGF0cyB4c3RhdHM7CiAJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CiAKLQlwaHlfaW50ZXJmYWNlX3QgcGh5X2ludGVyZmFjZTsKLQlpbnQgcGh5X2FkZHI7Ci0JaW50IHBoeV9tYXNrOwotCWludCAoKnBoeV9yZXNldCkgKHZvaWQgKnByaXYpOwogCWludCByeF9jb2U7CiAJaW50IG5vX2NzdW1faW5zZXJ0aW9uOwogCi0JaW50IHBoeV9pcnE7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKIAlpbnQgb2xkbGluazsKIAlpbnQgc3BlZWQ7CkBAIC03MSw2ICs2Niw3IEBACiAJdW5zaWduZWQgaW50IGZsb3dfY3RybDsKIAl1bnNpZ25lZCBpbnQgcGF1c2U7CiAJc3RydWN0IG1paV9idXMgKm1paTsKKwlpbnQgbWlpX2lycVtQSFlfTUFYX0FERFJdOwogCiAJdTMyIG1zZ19lbmFibGU7CiAJc3BpbmxvY2tfdCBsb2NrOwpAQCAtNzksOSArNzUsNiBAQAogI2lmZGVmIENPTkZJR19TVE1NQUNfVElNRVIKIAlzdHJ1Y3Qgc3RtbWFjX3RpbWVyICp0bTsKICNlbmRpZgotI2lmZGVmIFNUTU1BQ19WTEFOX1RBR19VU0VECi0Jc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOwotI2VuZGlmCiAJc3RydWN0IHBsYXRfc3RtbWFjZW5ldF9kYXRhICpwbGF0OwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RtbWFjL3N0bW1hY19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX2V0aHRvb2wuYwppbmRleCBhZTUyMTNhLi43ZWQ4ZmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX2V0aHRvb2wuYwpAQCAtMjQsOCArMjQsMTAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSAic3RtbWFjLmgiCiAjaW5jbHVkZSAiZHdtYWNfZG1hLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX21haW4uYyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWNfbWFpbi5jCmluZGV4IGUyNWU0NGEuLmM2ZTU2N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWNfbWFpbi5jCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSAic3RtbWFjLmgiCiAKICNkZWZpbmUgU1RNTUFDX1JFU09VUkNFX05BTUUJInN0bW1hY2V0aCIKLSNkZWZpbmUgUEhZX1JFU09VUkNFX05BTUUJInN0bW1hY3BoeSIKIAogI3VuZGVmIFNUTU1BQ19ERUJVRwogLyojZGVmaW5lIFNUTU1BQ19ERUJVRyovCkBAIC0zMDUsMTggKzMwNCwxMyBAQAogCXByaXYtPnNwZWVkID0gMDsKIAlwcml2LT5vbGRkdXBsZXggPSAtMTsKIAotCWlmIChwcml2LT5waHlfYWRkciA9PSAtMSkgewotCQkvKiBXZSBkb24ndCBoYXZlIGEgUEhZLCBzbyBkbyBub3RoaW5nICovCi0JCXJldHVybiAwOwotCX0KLQogCXNucHJpbnRmKGJ1c19pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXgiLCBwcml2LT5wbGF0LT5idXNfaWQpOwogCXNucHJpbnRmKHBoeV9pZCwgTUlJX0JVU19JRF9TSVpFICsgMywgUEhZX0lEX0ZNVCwgYnVzX2lkLAotCQkgcHJpdi0+cGh5X2FkZHIpOworCQkgcHJpdi0+cGxhdC0+cGh5X2FkZHIpOwogCXByX2RlYnVnKCJzdG1tYWNfaW5pdF9waHk6ICB0cnlpbmcgdG8gYXR0YWNoIHRvICVzXG4iLCBwaHlfaWQpOwogCiAJcGh5ZGV2ID0gcGh5X2Nvbm5lY3QoZGV2LCBwaHlfaWQsICZzdG1tYWNfYWRqdXN0X2xpbmssIDAsCi0JCQlwcml2LT5waHlfaW50ZXJmYWNlKTsKKwkJCSAgICAgcHJpdi0+cGxhdC0+aW50ZXJmYWNlKTsKIAogCWlmIChJU19FUlIocGh5ZGV2KSkgewogCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIiwgZGV2LT5uYW1lKTsKQEAgLTMzNSw3ICszMjksNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcHJfZGVidWcoInN0bW1hY19pbml0X3BoeTogICVzOiBhdHRhY2hlZCB0byBQSFkgKFVJRCAweCV4KSIKLQkgICAgICAgIiBMaW5rID0gJWRcbiIsIGRldi0+bmFtZSwgcGh5ZGV2LT5waHlfaWQsIHBoeWRldi0+bGluayk7CisJCSAiIExpbmsgPSAlZFxuIiwgZGV2LT5uYW1lLCBwaHlkZXYtPnBoeV9pZCwgcGh5ZGV2LT5saW5rKTsKIAogCXByaXYtPnBoeWRldiA9IHBoeWRldjsKIApAQCAtNTU3LDkgKzU1MSwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBzdG1tYWNfZG1hX29wZXJhdGlvbl9tb2RlKHN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdikKIHsKLQlpZiAobGlrZWx5KChwcml2LT5wbGF0LT50eF9jb2UpICYmICghcHJpdi0+bm9fY3N1bV9pbnNlcnRpb24pKSkgewotCQkvKiBJbiBjYXNlIG9mIEdNQUMsIFNGIG1vZGUgaGFzIHRvIGJlIGVuYWJsZWQKLQkJICogdG8gcGVyZm9ybSB0aGUgVFggQ09FLiBUaGlzIGRlcGVuZHMgb246CisJaWYgKGxpa2VseShwcml2LT5wbGF0LT5mb3JjZV9zZl9kbWFfbW9kZSB8fAorCQkoKHByaXYtPnBsYXQtPnR4X2NvZSkgJiYgKCFwcml2LT5ub19jc3VtX2luc2VydGlvbikpKSkgeworCQkvKgorCQkgKiBJbiBjYXNlIG9mIEdNQUMsIFNGIG1vZGUgY2FuIGJlIGVuYWJsZWQKKwkJICogdG8gcGVyZm9ybSB0aGUgVFggQ09FIGluIEhXLiBUaGlzIGRlcGVuZHMgb246CiAJCSAqIDEpIFRYIENPRSBpZiBhY3R1YWxseSBzdXBwb3J0ZWQKIAkJICogMikgVGhlcmUgaXMgbm8gYnVnZ2VkIEp1bWJvIGZyYW1lIHN1cHBvcnQKIAkJICogICAgdGhhdCBuZWVkcyB0byBub3QgaW5zZXJ0IGNzdW0gaW4gdGhlIFRERVMuCkBAIC0xMDQ1LDYgKzEwNDEsNyBAQAogCQkJCQkgIGxlbiwgRE1BX1RPX0RFVklDRSk7CiAJCXByaXYtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOwogCQlwcml2LT5ody0+ZGVzYy0+cHJlcGFyZV90eF9kZXNjKGRlc2MsIDAsIGxlbiwgY3N1bV9pbnNlcnRpb24pOworCQl3bWIoKTsKIAkJcHJpdi0+aHctPmRlc2MtPnNldF90eF9vd25lcihkZXNjKTsKIAl9CiAKQEAgLTEwNTYsNiArMTA1Myw5IEBACiAJaWYgKGxpa2VseShwcml2LT50bS0+ZW5hYmxlKSkKIAkJcHJpdi0+aHctPmRlc2MtPmNsZWFyX3R4X2ljKGRlc2MpOwogI2VuZGlmCisKKwl3bWIoKTsKKwogCS8qIFRvIGF2b2lkIHJhaXNlIGNvbmRpdGlvbiAqLwogCXByaXYtPmh3LT5kZXNjLT5zZXRfdHhfb3duZXIoZmlyc3QpOwogCkBAIC0xMDc5LDYgKzEwNzksOCBAQAogCiAJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAorCXNrYl90eF90aW1lc3RhbXAoc2tiKTsKKwogCXByaXYtPmh3LT5kbWEtPmVuYWJsZV9kbWFfdHJhbnNtaXNzaW9uKHByaXYtPmlvYWRkcik7CiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwpAQCAtMTExNiw2ICsxMTE4LDcgQEAKIAkJCX0KIAkJCVJYX0RCRyhLRVJOX0lORk8gIlx0cmVmaWxsIGVudHJ5ICMlZFxuIiwgZW50cnkpOwogCQl9CisJCXdtYigpOwogCQlwcml2LT5ody0+ZGVzYy0+c2V0X3J4X293bmVyKHAgKyBlbnRyeSk7CiAJfQogfQpAQCAtMTQxMiwyMCArMTQxNSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmZGVmIFNUTU1BQ19WTEFOX1RBR19VU0VECi1zdGF0aWMgdm9pZCBzdG1tYWNfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQotewotCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlEQkcocHJvYmUsIElORk8sICIlczogU2V0dGluZyB2bGdycCB0byAlcFxuIiwgZGV2LT5uYW1lLCBncnApOwotCi0Jc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKLQlwcml2LT52bGdycCA9IGdycDsKLQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Ci19Ci0jZW5kaWYKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBzdG1tYWNfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4gPSBzdG1tYWNfb3BlbiwKIAkubmRvX3N0YXJ0X3htaXQgPSBzdG1tYWNfeG1pdCwKQEAgLTE0MzYsOSArMTQyNSw2IEBACiAJLm5kb190eF90aW1lb3V0ID0gc3RtbWFjX3R4X3RpbWVvdXQsCiAJLm5kb19kb19pb2N0bCA9IHN0bW1hY19pb2N0bCwKIAkubmRvX3NldF9jb25maWcgPSBzdG1tYWNfY29uZmlnLAotI2lmZGVmIFNUTU1BQ19WTEFOX1RBR19VU0VECi0JLm5kb192bGFuX3J4X3JlZ2lzdGVyID0gc3RtbWFjX3ZsYW5fcnhfcmVnaXN0ZXIsCi0jZW5kaWYKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyID0gc3RtbWFjX3BvbGxfY29udHJvbGxlciwKICNlbmRpZgpAQCAtMTUzNiw3MSArMTUyMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc3RtbWFjcGh5X2R2cl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBwbGF0X3N0bW1hY3BoeV9kYXRhICpwbGF0X2RhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JcHJfZGVidWcoInN0bW1hY3BoeV9kdnJfcHJvYmU6IGFkZGVkIHBoeSBmb3IgYnVzICVkXG4iLAotCSAgICAgICBwbGF0X2RhdC0+YnVzX2lkKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0bW1hY3BoeV9kdnJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN0bW1hY3BoeV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJICAgLm5hbWUgPSBQSFlfUkVTT1VSQ0VfTkFNRSwKLQkJICAgfSwKLQkucHJvYmUgPSBzdG1tYWNwaHlfZHZyX3Byb2JlLAotCS5yZW1vdmUgPSBzdG1tYWNwaHlfZHZyX3JlbW92ZSwKLX07Ci0KLS8qKgotICogc3RtbWFjX2Fzc29jaWF0ZV9waHkKLSAqIEBkZXY6IHBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZQotICogQGRhdGE6IHBvaW50cyB0byB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCi0gKiBEZXNjcmlwdGlvbjogU2NhbnMgdGhyb3VnaCBhbGwgdGhlIFBIWXMgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBjaGVja3MgaWYKLSAqIGFueSBhcmUgYXNzb2NpYXRlZCB3aXRoIG91ciBNQUMuICBJZiBzbywgdGhlbiBqdXN0IGZpbGwgaW4KLSAqIHRoZSBibGFua3MgaW4gb3VyIGxvY2FsIGNvbnRleHQgc3RydWN0dXJlCi0gKi8KLXN0YXRpYyBpbnQgc3RtbWFjX2Fzc29jaWF0ZV9waHkoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IChzdHJ1Y3Qgc3RtbWFjX3ByaXYgKilkYXRhOwotCXN0cnVjdCBwbGF0X3N0bW1hY3BoeV9kYXRhICpwbGF0X2RhdCA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQotCURCRyhwcm9iZSwgREVCVUcsICIlczogY2hlY2tpbmcgcGh5IGZvciBidXMgJWRcbiIsIF9fZnVuY19fLAotCQlwbGF0X2RhdC0+YnVzX2lkKTsKLQotCS8qIENoZWNrIHRoYXQgdGhpcyBwaHkgaXMgZm9yIHRoZSBNQUMgYmVpbmcgaW5pdGlhbGlzZWQgKi8KLQlpZiAocHJpdi0+cGxhdC0+YnVzX2lkICE9IHBsYXRfZGF0LT5idXNfaWQpCi0JCXJldHVybiAwOwotCi0JLyogT0ssIHRoaXMgUEhZIGlzIGNvbm5lY3RlZCB0byB0aGUgTUFDLgotCSAgIEdvIGFoZWFkIGFuZCBnZXQgdGhlIHBhcmFtZXRlcnMgKi8KLQlEQkcocHJvYmUsIERFQlVHLCAiJXM6IE9LLiBGb3VuZCBQSFkgY29uZmlnXG4iLCBfX2Z1bmNfXyk7Ci0JcHJpdi0+cGh5X2lycSA9Ci0JICAgIHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHRvX3BsYXRmb3JtX2RldmljZShkZXYpLCAicGh5aXJxIik7Ci0JREJHKHByb2JlLCBERUJVRywgIiVzOiBQSFkgaXJxIG9uIGJ1cyAlZCBpcyAlZFxuIiwgX19mdW5jX18sCi0JICAgIHBsYXRfZGF0LT5idXNfaWQsIHByaXYtPnBoeV9pcnEpOwotCi0JLyogT3ZlcnJpZGUgd2l0aCBrZXJuZWwgcGFyYW1ldGVycyBpZiBzdXBwbGllZCBYWFggQ1JTIFhYWAotCSAqIHRoaXMgbmVlZHMgdG8gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgKi8KLQlpZiAoKHBoeWFkZHIgPj0gMCkgJiYgKHBoeWFkZHIgPD0gMzEpKQotCQlwbGF0X2RhdC0+cGh5X2FkZHIgPSBwaHlhZGRyOwotCi0JcHJpdi0+cGh5X2FkZHIgPSBwbGF0X2RhdC0+cGh5X2FkZHI7Ci0JcHJpdi0+cGh5X21hc2sgPSBwbGF0X2RhdC0+cGh5X21hc2s7Ci0JcHJpdi0+cGh5X2ludGVyZmFjZSA9IHBsYXRfZGF0LT5pbnRlcmZhY2U7Ci0JcHJpdi0+cGh5X3Jlc2V0ID0gcGxhdF9kYXQtPnBoeV9yZXNldDsKLQotCURCRyhwcm9iZSwgREVCVUcsICIlczogZXhpdGluZ1xuIiwgX19mdW5jX18pOwotCXJldHVybiAxOwkvKiBmb3JjZXMgZXhpdCBvZiBkcml2ZXJfZm9yX2VhY2hfZGV2aWNlKCkgKi8KLX0KLQogLyoqCiAgKiBzdG1tYWNfZHZyX3Byb2JlCiAgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIKQEAgLTE2OTEsMTQgKzE2MTIsMTAgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfcGxhdF9leGl0OwogCi0JLyogYXNzb2NpYXRlIGEgUEhZIC0gaXQgaXMgcHJvdmlkZWQgYnkgYW5vdGhlciBwbGF0Zm9ybSBidXMgKi8KLQlpZiAoIWRyaXZlcl9mb3JfZWFjaF9kZXZpY2UKLQkgICAgKCYoc3RtbWFjcGh5X2RyaXZlci5kcml2ZXIpLCBOVUxMLCAodm9pZCAqKXByaXYsCi0JICAgICBzdG1tYWNfYXNzb2NpYXRlX3BoeSkpIHsKLQkJcHJfZXJyKCJObyBQSFkgZGV2aWNlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1BQyFcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIG91dF91bnJlZ2lzdGVyOwotCX0KKwkvKiBPdmVycmlkZSB3aXRoIGtlcm5lbCBwYXJhbWV0ZXJzIGlmIHN1cHBsaWVkIFhYWCBDUlMgWFhYCisJICogdGhpcyBuZWVkcyB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyAqLworCWlmICgocGh5YWRkciA+PSAwKSAmJiAocGh5YWRkciA8PSAzMSkpCisJCXByaXYtPnBsYXQtPnBoeV9hZGRyID0gcGh5YWRkcjsKIAogCXByX2luZm8oIlx0JXMgLSAoZGV2LiBuYW1lOiAlcyAtIGlkOiAlZCwgSVJRICMlZFxuIgogCSAgICAgICAiXHRJTyBiYXNlIGFkZHI6IDB4JXApXG4iLCBuZGV2LT5uYW1lLCBwZGV2LT5uYW1lLApAQCAtMTg5OCwxMSArMTgxNSw2IEBACiB7CiAJaW50IHJldDsKIAotCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnN0bW1hY3BoeV9kcml2ZXIpKSB7Ci0JCXByX2VycigiTm8gUEhZIGRldmljZXMgcmVnaXN0ZXJlZCFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KIAlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnN0bW1hY19kcml2ZXIpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xOTEzLDcgKzE4MjUsNiBAQAogICovCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3RtbWFjX2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnN0bW1hY3BoeV9kcml2ZXIpOwogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzdG1tYWNfZHJpdmVyKTsKIH0KIApAQCAtMTkyNSwzMyArMTgzNiw1MiBAQAogCWlmICghc3RyIHx8ICEqc3RyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAl3aGlsZSAoKG9wdCA9IHN0cnNlcCgmc3RyLCAiLCIpKSAhPSBOVUxMKSB7Ci0JCWlmICghc3RybmNtcChvcHQsICJkZWJ1ZzoiLCA2KSkKLQkJCXN0cmljdF9zdHJ0b3VsKG9wdCArIDYsIDAsICh1bnNpZ25lZCBsb25nICopJmRlYnVnKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAicGh5YWRkcjoiLCA4KSkKLQkJCXN0cmljdF9zdHJ0b3VsKG9wdCArIDgsIDAsICh1bnNpZ25lZCBsb25nICopJnBoeWFkZHIpOwotCQllbHNlIGlmICghc3RybmNtcChvcHQsICJkbWFfdHhzaXplOiIsIDExKSkKLQkJCXN0cmljdF9zdHJ0b3VsKG9wdCArIDExLCAwLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyAqKSZkbWFfdHhzaXplKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAiZG1hX3J4c2l6ZToiLCAxMSkpCi0JCQlzdHJpY3Rfc3RydG91bChvcHQgKyAxMSwgMCwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgKikmZG1hX3J4c2l6ZSk7Ci0JCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgImJ1Zl9zejoiLCA3KSkKLQkJCXN0cmljdF9zdHJ0b3VsKG9wdCArIDcsIDAsICh1bnNpZ25lZCBsb25nICopJmJ1Zl9zeik7Ci0JCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgInRjOiIsIDMpKQotCQkJc3RyaWN0X3N0cnRvdWwob3B0ICsgMywgMCwgKHVuc2lnbmVkIGxvbmcgKikmdGMpOwotCQllbHNlIGlmICghc3RybmNtcChvcHQsICJ3YXRjaGRvZzoiLCA5KSkKLQkJCXN0cmljdF9zdHJ0b3VsKG9wdCArIDksIDAsICh1bnNpZ25lZCBsb25nICopJndhdGNoZG9nKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAiZmxvd19jdHJsOiIsIDEwKSkKLQkJCXN0cmljdF9zdHJ0b3VsKG9wdCArIDEwLCAwLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyAqKSZmbG93X2N0cmwpOwotCQllbHNlIGlmICghc3RybmNtcChvcHQsICJwYXVzZToiLCA2KSkKLQkJCXN0cmljdF9zdHJ0b3VsKG9wdCArIDYsIDAsICh1bnNpZ25lZCBsb25nICopJnBhdXNlKTsKKwkJaWYgKCFzdHJuY21wKG9wdCwgImRlYnVnOiIsIDYpKSB7CisJCQlpZiAoc3RyaWN0X3N0cnRvdWwob3B0ICsgNiwgMCwgKHVuc2lnbmVkIGxvbmcgKikmZGVidWcpKQorCQkJCWdvdG8gZXJyOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKG9wdCwgInBoeWFkZHI6IiwgOCkpIHsKKwkJCWlmIChzdHJpY3Rfc3RydG91bChvcHQgKyA4LCAwLAorCQkJCQkgICAodW5zaWduZWQgbG9uZyAqKSZwaHlhZGRyKSkKKwkJCQlnb3RvIGVycjsKKwkJfSBlbHNlIGlmICghc3RybmNtcChvcHQsICJkbWFfdHhzaXplOiIsIDExKSkgeworCQkJaWYgKHN0cmljdF9zdHJ0b3VsKG9wdCArIDExLCAwLAorCQkJCQkgICAodW5zaWduZWQgbG9uZyAqKSZkbWFfdHhzaXplKSkKKwkJCQlnb3RvIGVycjsKKwkJfSBlbHNlIGlmICghc3RybmNtcChvcHQsICJkbWFfcnhzaXplOiIsIDExKSkgeworCQkJaWYgKHN0cmljdF9zdHJ0b3VsKG9wdCArIDExLCAwLAorCQkJCQkgICAodW5zaWduZWQgbG9uZyAqKSZkbWFfcnhzaXplKSkKKwkJCQlnb3RvIGVycjsKKwkJfSBlbHNlIGlmICghc3RybmNtcChvcHQsICJidWZfc3o6IiwgNykpIHsKKwkJCWlmIChzdHJpY3Rfc3RydG91bChvcHQgKyA3LCAwLAorCQkJCQkgICAodW5zaWduZWQgbG9uZyAqKSZidWZfc3opKQorCQkJCWdvdG8gZXJyOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKG9wdCwgInRjOiIsIDMpKSB7CisJCQlpZiAoc3RyaWN0X3N0cnRvdWwob3B0ICsgMywgMCwgKHVuc2lnbmVkIGxvbmcgKikmdGMpKQorCQkJCWdvdG8gZXJyOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKG9wdCwgIndhdGNoZG9nOiIsIDkpKSB7CisJCQlpZiAoc3RyaWN0X3N0cnRvdWwob3B0ICsgOSwgMCwKKwkJCQkJICAgKHVuc2lnbmVkIGxvbmcgKikmd2F0Y2hkb2cpKQorCQkJCWdvdG8gZXJyOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKG9wdCwgImZsb3dfY3RybDoiLCAxMCkpIHsKKwkJCWlmIChzdHJpY3Rfc3RydG91bChvcHQgKyAxMCwgMCwKKwkJCQkJICAgKHVuc2lnbmVkIGxvbmcgKikmZmxvd19jdHJsKSkKKwkJCQlnb3RvIGVycjsKKwkJfSBlbHNlIGlmICghc3RybmNtcChvcHQsICJwYXVzZToiLCA2KSkgeworCQkJaWYgKHN0cmljdF9zdHJ0b3VsKG9wdCArIDYsIDAsICh1bnNpZ25lZCBsb25nICopJnBhdXNlKSkKKwkJCQlnb3RvIGVycjsKICNpZmRlZiBDT05GSUdfU1RNTUFDX1RJTUVSCi0JCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgInRtcmF0ZToiLCA3KSkKLQkJCXN0cmljdF9zdHJ0b3VsKG9wdCArIDcsIDAsICh1bnNpZ25lZCBsb25nICopJnRtcmF0ZSk7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAidG1yYXRlOiIsIDcpKSB7CisJCQlpZiAoc3RyaWN0X3N0cnRvdWwob3B0ICsgNywgMCwKKwkJCQkJICAgKHVuc2lnbmVkIGxvbmcgKikmdG1yYXRlKSkKKwkJCQlnb3RvIGVycjsKICNlbmRpZgorCQl9CiAJfQogCXJldHVybiAwOworCitlcnI6CisJcHJfZXJyKCIlczogRVJST1IgYnJva2VuIG1vZHVsZSBwYXJhbWV0ZXIgY29udmVyc2lvbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogX19zZXR1cCgic3RtbWFjZXRoPSIsIHN0bW1hY19jbWRsaW5lX29wdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdG1tYWMvc3RtbWFjX21kaW8uYyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWNfbWRpby5jCmluZGV4IDIzNGI0MDYuLjljM2I5ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWNfbWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L3N0bW1hYy9zdG1tYWNfbWRpby5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSAic3RtbWFjLmgiCiAKQEAgLTExMiw5ICsxMTMsOSBAQAogCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXVuc2lnbmVkIGludCBtaWlfYWRkcmVzcyA9IHByaXYtPmh3LT5taWkuYWRkcjsKIAotCWlmIChwcml2LT5waHlfcmVzZXQpIHsKKwlpZiAocHJpdi0+cGxhdC0+bWRpb19idXNfZGF0YS0+cGh5X3Jlc2V0KSB7CiAJCXByX2RlYnVnKCJzdG1tYWNfbWRpb19yZXNldDogY2FsbGluZyBwaHlfcmVzZXRcbiIpOwotCQlwcml2LT5waHlfcmVzZXQocHJpdi0+cGxhdC0+YnNwX3ByaXYpOworCQlwcml2LT5wbGF0LT5tZGlvX2J1c19kYXRhLT5waHlfcmVzZXQocHJpdi0+cGxhdC0+YnNwX3ByaXYpOwogCX0KIAogCS8qIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBwcm9ibGVtcyB3aXRoIHRoZSBTVEUxMDFQIFBIWS4KQEAgLTEzNywzMCArMTM4LDI5IEBACiAJc3RydWN0IG1paV9idXMgKm5ld19idXM7CiAJaW50ICppcnFsaXN0OwogCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBzdG1tYWNfbWRpb19idXNfZGF0YSAqbWRpb19idXNfZGF0YSA9IHByaXYtPnBsYXQtPm1kaW9fYnVzX2RhdGE7CiAJaW50IGFkZHIsIGZvdW5kOwogCisJaWYgKCFtZGlvX2J1c19kYXRhKQorCQlyZXR1cm4gMDsKKwogCW5ld19idXMgPSBtZGlvYnVzX2FsbG9jKCk7CiAJaWYgKG5ld19idXMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpcnFsaXN0ID0ga3phbGxvYyhzaXplb2YoaW50KSAqIFBIWV9NQVhfQUREUiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGlycWxpc3QgPT0gTlVMTCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGlycWxpc3RfYWxsb2NfZmFpbDsKLQl9Ci0KLQkvKiBBc3NpZ24gSVJRIHRvIHBoeSBhdCBhZGRyZXNzIHBoeV9hZGRyICovCi0JaWYgKHByaXYtPnBoeV9hZGRyICE9IC0xKQotCQlpcnFsaXN0W3ByaXYtPnBoeV9hZGRyXSA9IHByaXYtPnBoeV9pcnE7CisJaWYgKG1kaW9fYnVzX2RhdGEtPmlycXMpCisJCWlycWxpc3QgPSBtZGlvX2J1c19kYXRhLT5pcnFzOworCWVsc2UKKwkJaXJxbGlzdCA9IHByaXYtPm1paV9pcnE7CiAKIAluZXdfYnVzLT5uYW1lID0gIlNUTU1BQyBNSUkgQnVzIjsKIAluZXdfYnVzLT5yZWFkID0gJnN0bW1hY19tZGlvX3JlYWQ7CiAJbmV3X2J1cy0+d3JpdGUgPSAmc3RtbWFjX21kaW9fd3JpdGU7CiAJbmV3X2J1cy0+cmVzZXQgPSAmc3RtbWFjX21kaW9fcmVzZXQ7Ci0Jc25wcmludGYobmV3X2J1cy0+aWQsIE1JSV9CVVNfSURfU0laRSwgIiV4IiwgcHJpdi0+cGxhdC0+YnVzX2lkKTsKKwlzbnByaW50ZihuZXdfYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXgiLCBtZGlvX2J1c19kYXRhLT5idXNfaWQpOwogCW5ld19idXMtPnByaXYgPSBuZGV2OwogCW5ld19idXMtPmlycSA9IGlycWxpc3Q7Ci0JbmV3X2J1cy0+cGh5X21hc2sgPSBwcml2LT5waHlfbWFzazsKKwluZXdfYnVzLT5waHlfbWFzayA9IG1kaW9fYnVzX2RhdGEtPnBoeV9tYXNrOwogCW5ld19idXMtPnBhcmVudCA9IHByaXYtPmRldmljZTsKIAllcnIgPSBtZGlvYnVzX3JlZ2lzdGVyKG5ld19idXMpOwogCWlmIChlcnIgIT0gMCkgewpAQCAtMTcxLDE4ICsxNzEsNTAgQEAKIAlwcml2LT5taWkgPSBuZXdfYnVzOwogCiAJZm91bmQgPSAwOwotCWZvciAoYWRkciA9IDA7IGFkZHIgPCAzMjsgYWRkcisrKSB7CisJZm9yIChhZGRyID0gMDsgYWRkciA8IFBIWV9NQVhfQUREUjsgYWRkcisrKSB7CiAJCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBuZXdfYnVzLT5waHlfbWFwW2FkZHJdOwogCQlpZiAocGh5ZGV2KSB7Ci0JCQlpZiAocHJpdi0+cGh5X2FkZHIgPT0gLTEpIHsKLQkJCQlwcml2LT5waHlfYWRkciA9IGFkZHI7Ci0JCQkJcGh5ZGV2LT5pcnEgPSBwcml2LT5waHlfaXJxOwotCQkJCWlycWxpc3RbYWRkcl0gPSBwcml2LT5waHlfaXJxOworCQkJaW50IGFjdCA9IDA7CisJCQljaGFyIGlycV9udW1bNF07CisJCQljaGFyICppcnFfc3RyOworCisJCQkvKgorCQkJICogSWYgYW4gSVJRIHdhcyBwcm92aWRlZCB0byBiZSBhc3NpZ25lZCBhZnRlcgorCQkJICogdGhlIGJ1cyBwcm9iZSwgZG8gaXQgaGVyZS4KKwkJCSAqLworCQkJaWYgKChtZGlvX2J1c19kYXRhLT5pcnFzID09IE5VTEwpICYmCisJCQkgICAgKG1kaW9fYnVzX2RhdGEtPnByb2JlZF9waHlfaXJxID4gMCkpIHsKKwkJCQlpcnFsaXN0W2FkZHJdID0gbWRpb19idXNfZGF0YS0+cHJvYmVkX3BoeV9pcnE7CisJCQkJcGh5ZGV2LT5pcnEgPSBtZGlvX2J1c19kYXRhLT5wcm9iZWRfcGh5X2lycTsKIAkJCX0KLQkJCXByX2luZm8oIiVzOiBQSFkgSUQgJTA4eCBhdCAlZCBJUlEgJWQgKCVzKSVzXG4iLAotCQkJICAgICAgIG5kZXYtPm5hbWUsIHBoeWRldi0+cGh5X2lkLCBhZGRyLAotCQkJICAgICAgIHBoeWRldi0+aXJxLCBkZXZfbmFtZSgmcGh5ZGV2LT5kZXYpLAotCQkJICAgICAgIChhZGRyID09IHByaXYtPnBoeV9hZGRyKSA/ICIgYWN0aXZlIiA6ICIiKTsKKworCQkJLyoKKwkJCSAqIElmIHdlJ3JlICBnb2luZyB0byBiaW5kIHRoZSBNQUMgdG8gdGhpcyBQSFkgYnVzLAorCQkJICogYW5kIG5vIFBIWSBudW1iZXIgd2FzIHByb3ZpZGVkIHRvIHRoZSBNQUMsCisJCQkgKiB1c2UgdGhlIG9uZSBwcm9iZWQgaGVyZS4KKwkJCSAqLworCQkJaWYgKChwcml2LT5wbGF0LT5idXNfaWQgPT0gbWRpb19idXNfZGF0YS0+YnVzX2lkKSAmJgorCQkJICAgIChwcml2LT5wbGF0LT5waHlfYWRkciA9PSAtMSkpCisJCQkJcHJpdi0+cGxhdC0+cGh5X2FkZHIgPSBhZGRyOworCisJCQlhY3QgPSAocHJpdi0+cGxhdC0+YnVzX2lkID09IG1kaW9fYnVzX2RhdGEtPmJ1c19pZCkgJiYKKwkJCQkocHJpdi0+cGxhdC0+cGh5X2FkZHIgPT0gYWRkcik7CisJCQlzd2l0Y2ggKHBoeWRldi0+aXJxKSB7CisJCQljYXNlIFBIWV9QT0xMOgorCQkJCWlycV9zdHIgPSAiUE9MTCI7CisJCQkJYnJlYWs7CisJCQljYXNlIFBIWV9JR05PUkVfSU5URVJSVVBUOgorCQkJCWlycV9zdHIgPSAiSUdOT1JFIjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc3ByaW50ZihpcnFfbnVtLCAiJWQiLCBwaHlkZXYtPmlycSk7CisJCQkJaXJxX3N0ciA9IGlycV9udW07CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcl9pbmZvKCIlczogUEhZIElEICUwOHggYXQgJWQgSVJRICVzICglcyklc1xuIiwKKwkJCQluZGV2LT5uYW1lLCBwaHlkZXYtPnBoeV9pZCwgYWRkciwKKwkJCQlpcnFfc3RyLCBkZXZfbmFtZSgmcGh5ZGV2LT5kZXYpLAorCQkJCWFjdCA/ICIgYWN0aXZlIiA6ICIiKTsKIAkJCWZvdW5kID0gMTsKIAkJfQogCX0KQEAgLTE5MSwxMCArMjIzLDkgQEAKIAkJcHJfd2FybmluZygiJXM6IE5vIFBIWSBmb3VuZFxuIiwgbmRldi0+bmFtZSk7CiAKIAlyZXR1cm4gMDsKKwogYnVzX3JlZ2lzdGVyX2ZhaWw6Ci0Ja2ZyZWUoaXJxbGlzdCk7Ci1pcnFsaXN0X2FsbG9jX2ZhaWw6Ci0Ja2ZyZWUobmV3X2J1cyk7CisJbWRpb2J1c19mcmVlKG5ld19idXMpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTIwOSw3ICsyNDAsOCBAQAogCiAJbWRpb2J1c191bnJlZ2lzdGVyKHByaXYtPm1paSk7CiAJcHJpdi0+bWlpLT5wcml2ID0gTlVMTDsKLQlrZnJlZShwcml2LT5taWkpOworCW1kaW9idXNfZnJlZShwcml2LT5taWkpOworCXByaXYtPm1paSA9IE5VTEw7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmJtYWMuYyBiL2RyaXZlcnMvbmV0L3N1bmJtYWMuYwppbmRleCBhYTQ3NjU4Li4yOTdhNDI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5ibWFjLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5jCkBAIC05OTgsNyArOTk4LDYgQEAKIAlzdHJ1Y3QgYmlnbWFjICpicCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9pZCBfX2lvbWVtICpicmVncyA9IGJwLT5icmVnczsKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCWNoYXIgKmFkZHJzOwogCWludCBpOwogCXUzMiB0bXAsIGNyYzsKIApAQCAtMTAyNywxMiArMTAyNiw3IEBACiAJCQloYXNoX3RhYmxlW2ldID0gMDsKIAogCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7Ci0JCQlhZGRycyA9IGhhLT5hZGRyOwotCi0JCQlpZiAoISgqYWRkcnMgJiAxKSkKLQkJCQljb250aW51ZTsKLQotCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBoYS0+YWRkcik7CiAJCQljcmMgPj49IDI2OwogCQkJaGFzaF90YWJsZVtjcmMgPj4gNF0gfD0gMSA8PCAoY3JjICYgMHhmKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwppbmRleCBhYjU5MzAwLi5iZTc0NWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW0uYworKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwpAQCAtMTAsMjUgKzEwLDYgQEAKICAqIE5BUEkgYW5kIE5FVFBPTEwgc3VwcG9ydAogICogKEMpIDIwMDQgYnkgRXJpYyBMZW1vaW5lIChlcmljLmxlbW9pbmVAZ21haWwuY29tKQogICoKLSAqIFRPRE86Ci0gKiAgLSBOb3cgdGhhdCB0aGUgZHJpdmVyIHdhcyBzaWduaWZpY2FudGx5IHNpbXBsaWZpZWQsIEkgbmVlZCB0byByZXdvcmsKLSAqICAgIHRoZSBsb2NraW5nLiBJJ20gc3VyZSB3ZSBkb24ndCBuZWVkIF8yXyBzcGlubG9ja3MsIGFuZCB3ZSBwcm9iYWJseQotICogICAgY2FuIGF2b2lkIHRha2luZyBtb3N0IG9mIHRoZW0gZm9yIHNvIGxvbmcgcGVyaW9kIG9mIHRpbWUgKGFuZCBzY2hlZHVsZQotICogICAgaW5zdGVhZCkuIFRoZSBtYWluIGlzc3VlcyBhdCB0aGlzIHBvaW50IGFyZSBjYXVzZWQgYnkgdGhlIG5ldGRldiBsYXllcgotICogICAgdGhvdWdoOgotICoKLSAqICAgIGdlbV9jaGFuZ2VfbXR1KCkgYW5kIGdlbV9zZXRfbXVsdGljYXN0KCkgYXJlIGNhbGxlZCB3aXRoIGEgcmVhZF9sb2NrKCkKLSAqICAgIGhlbHAgYnkgbmV0L2NvcmUvZGV2LmMsIHRodXMgdGhleSBjYW4ndCBzY2hlZHVsZS4gVGhhdCBtZWFucyB0aGV5IGNhbid0Ci0gKiAgICBjYWxsIG5hcGlfZGlzYWJsZSgpIG5laXRoZXIsIHRodXMgZm9yY2UgZ2VtX3BvbGwoKSB0byBrZWVwIGEgc3BpbmxvY2sKLSAqICAgIHdoZXJlIGl0IGNvdWxkIGhhdmUgYmVlbiBkcm9wcGVkLiBjaGFuZ2VfbXR1IGVzcGVjaWFsbHkgd291bGQgbG92ZSBhbHNvIHRvCi0gKiAgICBiZSBhYmxlIHRvIG1zbGVlcCBpbnN0ZWFkIG9mIGhvcnJpZCBsb2NrZWQgZGVsYXlzIHdoZW4gcmVzZXR0aW5nIHRoZSBIVywKLSAqICAgIGJ1dCB0aGF0IHJlYWRfbG9jaygpIG1ha2VzIGl0IGltcG9zc2libGUsIHVubGVzcyBJIGRlZmVyIGl0J3MgYWN0aW9uIHRvCi0gKiAgICB0aGUgcmVzZXQgdGFzaywgd2hpY2ggbWVhbnMgaXQnbGwgYmUgYXN5bmNocm9ub3VzICh3b24ndCB0YWtlIGVmZmVjdCB1bnRpbAotICogICAgdGhlIHN5c3RlbSBzY2hlZHVsZXMgYSBiaXQpLgotICoKLSAqICAgIEFsc28sIGl0IHdvdWxkIHByb2JhYmx5IGJlIHBvc3NpYmxlIHRvIGFsc28gcmVtb3ZlIG1vc3Qgb2YgdGhlIGxvbmctbGlmZQotICogICAgbG9ja2luZyBpbiBvcGVuL3Jlc3VtZSBjb2RlIHBhdGggKGdlbV9yZWluaXRfY2hpcCkgYnkgYmVlaW5nIG1vcmUgY2FyZWZ1bAotICogICAgYWJvdXQgd2hlbiB3ZSBjYW4gc3RhcnQgdGFraW5nIGludGVycnVwdHMgb3IgZ2V0IHhtaXQoKSBjYWxsZWQuLi4KICAqLwogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CkBAIC01Nyw3ICszOCw2IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KIApAQCAtNjYsMTUgKzQ2LDE0IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKICNpZmRlZiBDT05GSUdfU1BBUkMKICNpbmNsdWRlIDxhc20vaWRwcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQ19QTUFDCiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgogI2VuZGlmCkBAIC05NSwxMiArNzQsMTEgQEAKIAkJCSBTVVBQT1JURURfUGF1c2UgfCBTVVBQT1JURURfQXV0b25lZykKIAogI2RlZmluZSBEUlZfTkFNRQkic3VuZ2VtIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC45OCIKLSNkZWZpbmUgRFJWX1JFTERBVEUJIjgvMjQvMDMiCi0jZGVmaW5lIERSVl9BVVRIT1IJIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAiCisjZGVmaW5lIERSVl9BVVRIT1IJIkRhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AcmVkaGF0LmNvbT4iCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KLSAgICAgICAgRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiICIgRFJWX0FVVEhPUiAiXG4iOworICAgICAgICBEUlZfTkFNRSAiLmM6diIgRFJWX1ZFUlNJT04gIiAiIERSVl9BVVRIT1IgIlxuIjsKIAogTU9EVUxFX0FVVEhPUihEUlZfQVVUSE9SKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3VuIEdFTSBHYml0IGV0aGVybmV0IGRyaXZlciIpOwpAQCAtMjE4LDYgKzE5Niw3IEBACiB7CiAJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cywgaW5jbHVkaW5nIFRYRE9ORSAqLwogCXdyaXRlbChHUkVHX1NUQVRfTkFQSSB8IEdSRUdfU1RBVF9UWERPTkUsIGdwLT5yZWdzICsgR1JFR19JTUFTSyk7CisJKHZvaWQpcmVhZGwoZ3AtPnJlZ3MgKyBHUkVHX0lNQVNLKTsgLyogd3JpdGUgcG9zdGluZyAqLwogfQogCiBzdGF0aWMgdm9pZCBnZW1fZ2V0X2NlbGwoc3RydWN0IGdlbSAqZ3ApCkBAIC0yNDcsNiArMjI2LDI5IEBACiAjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW1fbmV0aWZfc3RvcChzdHJ1Y3QgZ2VtICpncCkKK3sKKwlncC0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CS8qIHByZXZlbnQgdHggdGltZW91dCAqLworCW5hcGlfZGlzYWJsZSgmZ3AtPm5hcGkpOworCW5ldGlmX3R4X2Rpc2FibGUoZ3AtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW1fbmV0aWZfc3RhcnQoc3RydWN0IGdlbSAqZ3ApCit7CisJLyogTk9URTogdW5jb25kaXRpb25hbCBuZXRpZl93YWtlX3F1ZXVlIGlzIG9ubHkKKwkgKiBhcHByb3ByaWF0ZSBzbyBsb25nIGFzIGFsbCBjYWxsZXJzIGFyZSBhc3N1cmVkIHRvCisJICogaGF2ZSBmcmVlIHR4IHNsb3RzLgorCSAqLworCW5ldGlmX3dha2VfcXVldWUoZ3AtPmRldik7CisJbmFwaV9lbmFibGUoJmdwLT5uYXBpKTsKK30KKworc3RhdGljIHZvaWQgZ2VtX3NjaGVkdWxlX3Jlc2V0KHN0cnVjdCBnZW0gKmdwKQoreworCWdwLT5yZXNldF90YXNrX3BlbmRpbmcgPSAxOworCXNjaGVkdWxlX3dvcmsoJmdwLT5yZXNldF90YXNrKTsKK30KKwogc3RhdGljIHZvaWQgZ2VtX2hhbmRsZV9taWZfZXZlbnQoc3RydWN0IGdlbSAqZ3AsIHUzMiByZWdfdmFsLCB1MzIgY2hhbmdlZF9iaXRzKQogewogCWlmIChuZXRpZl9tc2dfaW50cihncCkpCkBAIC02MDQsNTYgKzYwNiw0NiBAQAogCQkJCWdwLT5kZXYtPm5hbWUpOwogCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCi0JCWdvdG8gZG9fcmVzZXQ7CisJCXJldHVybiAxOwogCX0KIAogCWlmIChnZW1fc3RhdHVzICYgR1JFR19TVEFUX1BDUykgewogCQlpZiAoZ2VtX3Bjc19pbnRlcnJ1cHQoZGV2LCBncCwgZ2VtX3N0YXR1cykpCi0JCQlnb3RvIGRvX3Jlc2V0OworCQkJcmV0dXJuIDE7CiAJfQogCiAJaWYgKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfVFhNQUMpIHsKIAkJaWYgKGdlbV90eG1hY19pbnRlcnJ1cHQoZGV2LCBncCwgZ2VtX3N0YXR1cykpCi0JCQlnb3RvIGRvX3Jlc2V0OworCQkJcmV0dXJuIDE7CiAJfQogCiAJaWYgKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfUlhNQUMpIHsKIAkJaWYgKGdlbV9yeG1hY19pbnRlcnJ1cHQoZGV2LCBncCwgZ2VtX3N0YXR1cykpCi0JCQlnb3RvIGRvX3Jlc2V0OworCQkJcmV0dXJuIDE7CiAJfQogCiAJaWYgKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfTUFDKSB7CiAJCWlmIChnZW1fbWFjX2ludGVycnVwdChkZXYsIGdwLCBnZW1fc3RhdHVzKSkKLQkJCWdvdG8gZG9fcmVzZXQ7CisJCQlyZXR1cm4gMTsKIAl9CiAKIAlpZiAoZ2VtX3N0YXR1cyAmIEdSRUdfU1RBVF9NSUYpIHsKIAkJaWYgKGdlbV9taWZfaW50ZXJydXB0KGRldiwgZ3AsIGdlbV9zdGF0dXMpKQotCQkJZ290byBkb19yZXNldDsKKwkJCXJldHVybiAxOwogCX0KIAogCWlmIChnZW1fc3RhdHVzICYgR1JFR19TVEFUX1BDSUVSUikgewogCQlpZiAoZ2VtX3BjaV9pbnRlcnJ1cHQoZGV2LCBncCwgZ2VtX3N0YXR1cykpCi0JCQlnb3RvIGRvX3Jlc2V0OworCQkJcmV0dXJuIDE7CiAJfQogCiAJcmV0dXJuIDA7Ci0KLWRvX3Jlc2V0OgotCWdwLT5yZXNldF90YXNrX3BlbmRpbmcgPSAxOwotCXNjaGVkdWxlX3dvcmsoJmdwLT5yZXNldF90YXNrKTsKLQotCXJldHVybiAxOwogfQogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGdlbV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZ2VtICpncCwgdTMyIGdlbV9zdGF0dXMpCiB7CiAJaW50IGVudHJ5LCBsaW1pdDsKIAotCWlmIChuZXRpZl9tc2dfaW50cihncCkpCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggaW50ZXJydXB0LCBnZW1fc3RhdHVzOiAweCV4XG4iLAotCQkJZ3AtPmRldi0+bmFtZSwgZ2VtX3N0YXR1cyk7Ci0KIAllbnRyeSA9IGdwLT50eF9vbGQ7CiAJbGltaXQgPSAoKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfVFhOUikgPj4gR1JFR19TVEFUX1RYTlJfU0hJRlQpOwogCXdoaWxlIChlbnRyeSAhPSBsaW1pdCkgewpAQCAtNjk3LDEzICs2ODksMjcgQEAKIAkJfQogCiAJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwotCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJfQogCWdwLT50eF9vbGQgPSBlbnRyeTsKIAotCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKLQkgICAgVFhfQlVGRlNfQVZBSUwoZ3ApID4gKE1BWF9TS0JfRlJBR1MgKyAxKSkKLQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCS8qIE5lZWQgdG8gbWFrZSB0aGUgdHhfb2xkIHVwZGF0ZSB2aXNpYmxlIHRvIGdlbV9zdGFydF94bWl0KCkKKwkgKiBiZWZvcmUgY2hlY2tpbmcgZm9yIG5ldGlmX3F1ZXVlX3N0b3BwZWQoKS4gIFdpdGhvdXQgdGhlCisJICogbWVtb3J5IGJhcnJpZXIsIHRoZXJlIGlzIGEgc21hbGwgcG9zc2liaWxpdHkgdGhhdCBnZW1fc3RhcnRfeG1pdCgpCisJICogd2lsbCBtaXNzIGl0IGFuZCBjYXVzZSB0aGUgcXVldWUgdG8gYmUgc3RvcHBlZCBmb3JldmVyLgorCSAqLworCXNtcF9tYigpOworCisJaWYgKHVubGlrZWx5KG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCQkgICAgIFRYX0JVRkZTX0FWQUlMKGdwKSA+IChNQVhfU0tCX0ZSQUdTICsgMSkpKSB7CisJCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCAwKTsKKworCQlfX25ldGlmX3R4X2xvY2sodHhxLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCSAgICBUWF9CVUZGU19BVkFJTChncCkgPiAoTUFYX1NLQl9GUkFHUyArIDEpKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlfX25ldGlmX3R4X3VubG9jayh0eHEpOworCX0KIH0KIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBnZW1fcG9zdF9yeGRzKHN0cnVjdCBnZW0gKmdwLCBpbnQgbGltaXQpCkBAIC03MzYsNiArNzQyLDIxIEBACiAJfQogfQogCisjZGVmaW5lIEFMSUdORURfUlhfU0tCX0FERFIoYWRkcikgXAorICAgICAgICAoKCgodW5zaWduZWQgbG9uZykoYWRkcikgKyAoNjRVTCAtIDFVTCkpICYgfig2NFVMIC0gMVVMKSkgLSAodW5zaWduZWQgbG9uZykoYWRkcikpCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3Qgc2tfYnVmZiAqZ2VtX2FsbG9jX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc2l6ZSwKKwkJCQkJCWdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKHNpemUgKyA2NCwgZ2ZwX2ZsYWdzKTsKKworCWlmIChsaWtlbHkoc2tiKSkgeworCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IEFMSUdORURfUlhfU0tCX0FERFIoc2tiLT5kYXRhKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpOworCQlza2ItPmRldiA9IGRldjsKKwl9CisJcmV0dXJuIHNrYjsKK30KKwogc3RhdGljIGludCBnZW1fcngoc3RydWN0IGdlbSAqZ3AsIGludCB3b3JrX3RvX2RvKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBncC0+ZGV2OwpAQCAtNzk5LDcgKzgyMCw3IEBACiAJCWlmIChsZW4gPiBSWF9DT1BZX1RIUkVTSE9MRCkgewogCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CiAKLQkJCW5ld19za2IgPSBnZW1fYWxsb2Nfc2tiKFJYX0JVRl9BTExPQ19TSVpFKGdwKSwgR0ZQX0FUT01JQyk7CisJCQluZXdfc2tiID0gZ2VtX2FsbG9jX3NrYihkZXYsIFJYX0JVRl9BTExPQ19TSVpFKGdwKSwgR0ZQX0FUT01JQyk7CiAJCQlpZiAobmV3X3NrYiA9PSBOVUxMKSB7CiAJCQkJZHJvcHMrKzsKIAkJCQlnb3RvIGRyb3BfaXQ7CkBAIC04MDgsNyArODI5LDYgQEAKIAkJCQkgICAgICAgUlhfQlVGX0FMTE9DX1NJWkUoZ3ApLAogCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJZ3AtPnJ4X3NrYnNbZW50cnldID0gbmV3X3NrYjsKLQkJCW5ld19za2ItPmRldiA9IGdwLT5kZXY7CiAJCQlza2JfcHV0KG5ld19za2IsIChncC0+cnhfYnVmX3N6ICsgUlhfT0ZGU0VUKSk7CiAJCQlyeGQtPmJ1ZmZlciA9IGNwdV90b19sZTY0KHBjaV9tYXBfcGFnZShncC0+cGRldiwKIAkJCQkJCQkgICAgICAgdmlydF90b19wYWdlKG5ld19za2ItPmRhdGEpLApAQCAtODIwLDcgKzg0MCw3IEBACiAJCQkvKiBUcmltIHRoZSBvcmlnaW5hbCBza2IgZm9yIHRoZSBuZXRpZi4gKi8KIAkJCXNrYl90cmltKHNrYiwgbGVuKTsKIAkJfSBlbHNlIHsKLQkJCXN0cnVjdCBza19idWZmICpjb3B5X3NrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqY29weV9za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgbGVuICsgMik7CiAKIAkJCWlmIChjb3B5X3NrYiA9PSBOVUxMKSB7CiAJCQkJZHJvcHMrKzsKQEAgLTg0Miw3ICs4NjIsNyBAQAogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBncC0+ZGV2KTsKIAotCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQluYXBpX2dyb19yZWNlaXZlKCZncC0+bmFwaSwgc2tiKTsKIAogCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CkBAIC04NjUsMjggKzg4NSwzMiBAQAogewogCXN0cnVjdCBnZW0gKmdwID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBnZW0sIG5hcGkpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBncC0+ZGV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHdvcmtfZG9uZTsKIAotCS8qCi0JICogTkFQSSBsb2NraW5nIG5pZ2h0bWFyZTogU2VlIGNvbW1lbnQgYXQgaGVhZCBvZiBkcml2ZXIKLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKLQogCXdvcmtfZG9uZSA9IDA7CiAJZG8gewogCQkvKiBIYW5kbGUgYW5vbWFsaWVzICovCi0JCWlmIChncC0+c3RhdHVzICYgR1JFR19TVEFUX0FCTk9STUFMKSB7Ci0JCQlpZiAoZ2VtX2Fibm9ybWFsX2lycShkZXYsIGdwLCBncC0+c3RhdHVzKSkKLQkJCQlicmVhazsKKwkJaWYgKHVubGlrZWx5KGdwLT5zdGF0dXMgJiBHUkVHX1NUQVRfQUJOT1JNQUwpKSB7CisJCQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgMCk7CisJCQlpbnQgcmVzZXQ7CisKKwkJCS8qIFdlIHJ1biB0aGUgYWJub3JtYWwgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgd2l0aAorCQkJICogdGhlIFR4IGxvY2suIEl0IG9ubHkgcmVzZXRzIHRoZSBSeCBwb3J0aW9uIG9mIHRoZQorCQkJICogY2hpcCwgYnV0IHdlIG5lZWQgdG8gZ3VhcmQgaXQgYWdhaW5zdCBETUEgYmVpbmcKKwkJCSAqIHJlc3RhcnRlZCBieSB0aGUgbGluayBwb2xsIHRpbWVyCisJCQkgKi8KKwkJCV9fbmV0aWZfdHhfbG9jayh0eHEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCQlyZXNldCA9IGdlbV9hYm5vcm1hbF9pcnEoZGV2LCBncCwgZ3AtPnN0YXR1cyk7CisJCQlfX25ldGlmX3R4X3VubG9jayh0eHEpOworCQkJaWYgKHJlc2V0KSB7CisJCQkJZ2VtX3NjaGVkdWxlX3Jlc2V0KGdwKTsKKwkJCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCQkJCXJldHVybiB3b3JrX2RvbmU7CisJCQl9CiAJCX0KIAogCQkvKiBSdW4gVFggY29tcGxldGlvbiB0aHJlYWQgKi8KLQkJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CiAJCWdlbV90eChkZXYsIGdwLCBncC0+c3RhdHVzKTsKLQkJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOwogCiAJCS8qIFJ1biBSWCB0aHJlYWQuIFdlIGRvbid0IHVzZSBhbnkgbG9ja2luZyBoZXJlLAogCQkgKiBjb2RlIHdpbGxpbmcgdG8gZG8gYmFkIHRoaW5ncyAtIGxpa2UgY2xlYW5pbmcgdGhlCkBAIC04OTgsMTYgKzkyMiwxMiBAQAogCQlpZiAod29ya19kb25lID49IGJ1ZGdldCkKIAkJCXJldHVybiB3b3JrX2RvbmU7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7Ci0KIAkJZ3AtPnN0YXR1cyA9IHJlYWRsKGdwLT5yZWdzICsgR1JFR19TVEFUKTsKIAl9IHdoaWxlIChncC0+c3RhdHVzICYgR1JFR19TVEFUX05BUEkpOwogCi0JX19uYXBpX2NvbXBsZXRlKG5hcGkpOworCW5hcGlfY29tcGxldGUobmFwaSk7CiAJZ2VtX2VuYWJsZV9pbnRzKGdwKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7Ci0KIAlyZXR1cm4gd29ya19kb25lOwogfQogCkBAIC05MTUsMzIgKzkzNSwyMyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CiAJc3RydWN0IGdlbSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBTd2FsbG93IGludGVycnVwdHMgd2hlbiBzaHV0dGluZyB0aGUgY2hpcCBkb3duLCB0aG91Z2gKLQkgKiB0aGF0IHNob3VsZG4ndCBoYXBwZW4sIHdlIHNob3VsZCBoYXZlIGRvbmUgZnJlZV9pcnEoKSBhdAotCSAqIHRoaXMgcG9pbnQuLi4KLQkgKi8KLQlpZiAoIWdwLT5ydW5uaW5nKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKIAogCWlmIChuYXBpX3NjaGVkdWxlX3ByZXAoJmdwLT5uYXBpKSkgewogCQl1MzIgZ2VtX3N0YXR1cyA9IHJlYWRsKGdwLT5yZWdzICsgR1JFR19TVEFUKTsKIAotCQlpZiAoZ2VtX3N0YXR1cyA9PSAwKSB7CisJCWlmICh1bmxpa2VseShnZW1fc3RhdHVzID09IDApKSB7CiAJCQluYXBpX2VuYWJsZSgmZ3AtPm5hcGkpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKIAkJCXJldHVybiBJUlFfTk9ORTsKIAkJfQorCQlpZiAobmV0aWZfbXNnX2ludHIoZ3ApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBnZW1faW50ZXJydXB0KCkgZ2VtX3N0YXR1czogMHgleFxuIiwKKwkJCSAgICAgICBncC0+ZGV2LT5uYW1lLCBnZW1fc3RhdHVzKTsKKwogCQlncC0+c3RhdHVzID0gZ2VtX3N0YXR1czsKIAkJZ2VtX2Rpc2FibGVfaW50cyhncCk7CiAJCV9fbmFwaV9zY2hlZHVsZSgmZ3AtPm5hcGkpOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7Ci0KIAkvKiBJZiBwb2xsaW5nIHdhcyBkaXNhYmxlZCBhdCB0aGUgdGltZSB3ZSByZWNlaXZlZCB0aGF0CiAJICogaW50ZXJydXB0LCB3ZSBtYXkgcmV0dXJuIElSUV9IQU5ETEVEIGhlcmUgd2hpbGUgd2UKIAkgKiBzaG91bGQgcmV0dXJuIElSUV9OT05FLiBObyBiaWcgZGVhbC4uLgpAQCAtOTUxLDEwICs5NjIsMTEgQEAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgZ2VtX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCS8qIGdlbV9pbnRlcnJ1cHQgaXMgc2FmZSB0byByZWVudHJhbmNlIHNvIG5vIG5lZWQKLQkgKiB0byBkaXNhYmxlX2lycSBoZXJlLgotCSAqLwotCWdlbV9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldik7CisJc3RydWN0IGdlbSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZGlzYWJsZV9pcnEoZ3AtPnBkZXYtPmlycSk7CisJZ2VtX2ludGVycnVwdChncC0+cGRldi0+aXJxLCBkZXYpOworCWVuYWJsZV9pcnEoZ3AtPnBkZXYtPmlycSk7CiB9CiAjZW5kaWYKIApAQCAtOTYzLDEwICs5NzUsNyBAQAogCXN0cnVjdCBnZW0gKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCW5ldGRldl9lcnIoZGV2LCAidHJhbnNtaXQgdGltZWQgb3V0LCByZXNldHRpbmdcbiIpOwotCWlmICghZ3AtPnJ1bm5pbmcpIHsKLQkJbmV0ZGV2X2VycihkZXYsICJocm0uLiBodyBub3QgcnVubmluZyAhXG4iKTsKLQkJcmV0dXJuOwotCX0KKwogCW5ldGRldl9lcnIoZGV2LCAiVFhfU1RBVEVbJTA4eDolMDh4OiUwOHhdXG4iLAogCQkgICByZWFkbChncC0+cmVncyArIFRYRE1BX0NGRyksCiAJCSAgIHJlYWRsKGdwLT5yZWdzICsgTUFDX1RYU1RBVCksCkBAIC05NzYsMTQgKzk4NSw3IEBACiAJCSAgIHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYU1RBVCksCiAJCSAgIHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKSk7CiAKLQlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7Ci0Jc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7Ci0KLQlncC0+cmVzZXRfdGFza19wZW5kaW5nID0gMTsKLQlzY2hlZHVsZV93b3JrKCZncC0+cmVzZXRfdGFzayk7Ci0KLQlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOwotCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworCWdlbV9zY2hlZHVsZV9yZXNldChncCk7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCBnZW1faW50bWUoaW50IGVudHJ5KQpAQCAtMTAwMSw3ICsxMDAzLDYgQEAKIAlzdHJ1Y3QgZ2VtICpncCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGVudHJ5OwogCXU2NCBjdHJsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAljdHJsID0gMDsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewpAQCAtMTAxMywyMSArMTAxNCwxMiBAQAogCQkJKGNzdW1fc3R1ZmZfb2ZmIDw8IDIxKSk7CiAJfQogCi0JaWYgKCFzcGluX3RyeWxvY2tfaXJxc2F2ZSgmZ3AtPnR4X2xvY2ssIGZsYWdzKSkgewotCQkvKiBUZWxsIHVwcGVyIGxheWVyIHRvIHJlcXVldWUgKi8KLQkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7Ci0JfQotCS8qIFdlIHJhY2VkIHdpdGggZ2VtX2RvX3N0b3AoKSAqLwotCWlmICghZ3AtPnJ1bm5pbmcpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPnR4X2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwotCX0KLQotCS8qIFRoaXMgaXMgYSBoYXJkIGVycm9yLCBsb2cgaXQuICovCi0JaWYgKFRYX0JVRkZTX0FWQUlMKGdwKSA8PSAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpKSB7Ci0JCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPnR4X2xvY2ssIGZsYWdzKTsKLQkJbmV0ZGV2X2VycihkZXYsICJCVUchIFR4IFJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIik7CisJaWYgKHVubGlrZWx5KFRYX0JVRkZTX0FWQUlMKGdwKSA8PSAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpKSkgeworCQkvKiBUaGlzIGlzIGEgaGFyZCBlcnJvciwgbG9nIGl0LiAqLworCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJbmV0ZGV2X2VycihkZXYsICJCVUchIFR4IFJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIik7CisJCX0KIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIApAQCAtMTEwNCwxNyArMTA5NiwyMyBAQAogCX0KIAogCWdwLT50eF9uZXcgPSBlbnRyeTsKLQlpZiAoVFhfQlVGRlNfQVZBSUwoZ3ApIDw9IChNQVhfU0tCX0ZSQUdTICsgMSkpCisJaWYgKHVubGlrZWx5KFRYX0JVRkZTX0FWQUlMKGdwKSA8PSAoTUFYX1NLQl9GUkFHUyArIDEpKSkgewogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKKwkJLyogbmV0aWZfc3RvcF9xdWV1ZSgpIG11c3QgYmUgZG9uZSBiZWZvcmUgY2hlY2tpbmcKKwkJICogY2hlY2tpbmcgdHggaW5kZXggaW4gVFhfQlVGRlNfQVZBSUwoKSBiZWxvdywgYmVjYXVzZQorCQkgKiBpbiBnZW1fdHgoKSwgd2UgdXBkYXRlIHR4X29sZCBiZWZvcmUgY2hlY2tpbmcgZm9yCisJCSAqIG5ldGlmX3F1ZXVlX3N0b3BwZWQoKS4KKwkJICovCisJCXNtcF9tYigpOworCQlpZiAoVFhfQlVGRlNfQVZBSUwoZ3ApID4gKE1BWF9TS0JfRlJBR1MgKyAxKSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CiAJaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQoZ3ApKQogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IHF1ZXVlZCwgc2xvdCAlZCwgc2tibGVuICVkXG4iLAogCQkgICAgICAgZGV2LT5uYW1lLCBlbnRyeSwgc2tiLT5sZW4pOwogCW1iKCk7CiAJd3JpdGVsKGdwLT50eF9uZXcsIGdwLT5yZWdzICsgVFhETUFfS0lDSyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPnR4X2xvY2ssIGZsYWdzKTsKLQotCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOyAvKiBORVRJRl9GX0xMVFggZHJpdmVyIDooICovCiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQpAQCAtMTE4NCw3ICsxMTgyLDYgQEAKIAogI2RlZmluZSBTVE9QX1RSSUVTIDMyCiAKLS8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCiBzdGF0aWMgdm9pZCBnZW1fcmVzZXQoc3RydWN0IGdlbSAqZ3ApCiB7CiAJaW50IGxpbWl0OwpAQCAtMTIxMyw3ICsxMjEwLDYgQEAKIAkJZ2VtX3Bjc19yZWluaXRfYWR2KGdwKTsKIH0KIAotLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KIHN0YXRpYyB2b2lkIGdlbV9zdGFydF9kbWEoc3RydWN0IGdlbSAqZ3ApCiB7CiAJdTMyIHZhbDsKQEAgLTEyMzYsOCArMTIzMiw3IEBACiAJd3JpdGVsKFJYX1JJTkdfU0laRSAtIDQsIGdwLT5yZWdzICsgUlhETUFfS0lDSyk7CiB9CiAKLS8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suIERNQSB3b24ndCBiZQotICogYWN0dWFsbHkgc3RvcHBlZCBiZWZvcmUgYWJvdXQgNG1zIHRobyAuLi4KKy8qIERNQSB3b24ndCBiZSBhY3R1YWxseSBzdG9wcGVkIGJlZm9yZSBhYm91dCA0bXMgdGhvIC4uLgogICovCiBzdGF0aWMgdm9pZCBnZW1fc3RvcF9kbWEoc3RydWN0IGdlbSAqZ3ApCiB7CkBAIC0xMjU5LDcgKzEyNTQsNiBAQAogfQogCiAKLS8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCiAvLyBYWFggZGJsIGNoZWNrIHdoYXQgdGhhdCBmdW5jdGlvbiBzaG91bGQgZG8gd2hlbiBjYWxsZWQgb24gUENTIFBIWQogc3RhdGljIHZvaWQgZ2VtX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oc3RydWN0IGdlbSAqZ3AsIHN0cnVjdCBldGh0b29sX2NtZCAqZXApCiB7CkBAIC0xMzE5LDcgKzEzMTMsNyBAQAogCS8qIElmIHdlIGFyZSBhc2xlZXAsIHdlIGRvbid0IHRyeSB0byBhY3R1YWxseSBzZXR1cCB0aGUgUEhZLCB3ZQogCSAqIGp1c3Qgc3RvcmUgdGhlIHNldHRpbmdzCiAJICovCi0JaWYgKGdwLT5hc2xlZXApIHsKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGdwLT5kZXYpKSB7CiAJCWdwLT5waHlfbWlpLmF1dG9uZWcgPSBncC0+d2FudF9hdXRvbmVnID0gYXV0b25lZzsKIAkJZ3AtPnBoeV9taWkuc3BlZWQgPSBzcGVlZDsKIAkJZ3AtPnBoeV9taWkuZHVwbGV4ID0gZHVwbGV4OwpAQCAtMTM0NSwxMyArMTMzOSwxMiBAQAogCiAvKiBBIGxpbmstdXAgY29uZGl0aW9uIGhhcyBvY2N1cnJlZCwgaW5pdGlhbGl6ZSBhbmQgZW5hYmxlIHRoZQogICogcmVzdCBvZiB0aGUgY2hpcC4KLSAqCi0gKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLgogICovCiBzdGF0aWMgaW50IGdlbV9zZXRfbGlua19tb2RlcyhzdHJ1Y3QgZ2VtICpncCkKIHsKLQl1MzIgdmFsOworCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZ3AtPmRldiwgMCk7CiAJaW50IGZ1bGxfZHVwbGV4LCBzcGVlZCwgcGF1c2U7CisJdTMyIHZhbDsKIAogCWZ1bGxfZHVwbGV4ID0gMDsKIAlzcGVlZCA9IFNQRUVEXzEwOwpAQCAtMTM3NSw4ICsxMzY4LDExIEBACiAJbmV0aWZfaW5mbyhncCwgbGluaywgZ3AtPmRldiwgIkxpbmsgaXMgdXAgYXQgJWQgTWJwcywgJXMtZHVwbGV4XG4iLAogCQkgICBzcGVlZCwgKGZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKSk7CiAKLQlpZiAoIWdwLT5ydW5uaW5nKQotCQlyZXR1cm4gMDsKKworCS8qIFdlIHRha2UgdGhlIHR4IHF1ZXVlIGxvY2sgdG8gYXZvaWQgY29sbGlzaW9ucyBiZXR3ZWVuCisJICogdGhpcyBjb2RlLCB0aGUgdHggcGF0aCBhbmQgdGhlIE5BUEktZHJpdmVuIGVycm9yIHBhdGgKKwkgKi8KKwlfX25ldGlmX3R4X2xvY2sodHhxLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCiAJdmFsID0gKE1BQ19UWENGR19FSVBHMCB8IE1BQ19UWENGR19OR1UpOwogCWlmIChmdWxsX2R1cGxleCkgewpAQCAtMTQyNSwxOCArMTQyMSw2IEBACiAJCQlwYXVzZSA9IDE7CiAJfQogCi0JaWYgKG5ldGlmX21zZ19saW5rKGdwKSkgewotCQlpZiAocGF1c2UpIHsKLQkJCW5ldGRldl9pbmZvKGdwLT5kZXYsCi0JCQkJICAgICJQYXVzZSBpcyBlbmFibGVkIChyeGZpZm86ICVkIG9mZjogJWQgb246ICVkKVxuIiwKLQkJCQkgICAgZ3AtPnJ4X2ZpZm9fc3osCi0JCQkJICAgIGdwLT5yeF9wYXVzZV9vZmYsCi0JCQkJICAgIGdwLT5yeF9wYXVzZV9vbik7Ci0JCX0gZWxzZSB7Ci0JCQluZXRkZXZfaW5mbyhncC0+ZGV2LCAiUGF1c2UgaXMgZGlzYWJsZWRcbiIpOwotCQl9Ci0JfQotCiAJaWYgKCFmdWxsX2R1cGxleCkKIAkJd3JpdGVsKDUxMiwgZ3AtPnJlZ3MgKyBNQUNfU1RJTUUpOwogCWVsc2UKQEAgLTE0NTAsMTAgKzE0MzQsMjMgQEAKIAogCWdlbV9zdGFydF9kbWEoZ3ApOwogCisJX19uZXRpZl90eF91bmxvY2sodHhxKTsKKworCWlmIChuZXRpZl9tc2dfbGluayhncCkpIHsKKwkJaWYgKHBhdXNlKSB7CisJCQluZXRkZXZfaW5mbyhncC0+ZGV2LAorCQkJCSAgICAiUGF1c2UgaXMgZW5hYmxlZCAocnhmaWZvOiAlZCBvZmY6ICVkIG9uOiAlZClcbiIsCisJCQkJICAgIGdwLT5yeF9maWZvX3N6LAorCQkJCSAgICBncC0+cnhfcGF1c2Vfb2ZmLAorCQkJCSAgICBncC0+cnhfcGF1c2Vfb24pOworCQl9IGVsc2UgeworCQkJbmV0ZGV2X2luZm8oZ3AtPmRldiwgIlBhdXNlIGlzIGRpc2FibGVkXG4iKTsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCi0vKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLwogc3RhdGljIGludCBnZW1fbWRpb19saW5rX25vdF91cChzdHJ1Y3QgZ2VtICpncCkKIHsKIAlzd2l0Y2ggKGdwLT5sc3RhdGUpIHsKQEAgLTE1MDEsMjAgKzE0OTgsMTIgQEAKIHN0YXRpYyB2b2lkIGdlbV9saW5rX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgZ2VtICpncCA9IChzdHJ1Y3QgZ2VtICopIGRhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGdwLT5kZXY7CiAJaW50IHJlc3RhcnRfYW5lZyA9IDA7CiAKLQlpZiAoZ3AtPmFzbGVlcCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOwotCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOwotCWdlbV9nZXRfY2VsbChncCk7Ci0KLQkvKiBJZiB0aGUgcmVzZXQgdGFzayBpcyBzdGlsbCBwZW5kaW5nLCB3ZSBqdXN0Ci0JICogcmVzY2hlZHVsZSB0aGUgbGluayB0aW1lcgotCSAqLworCS8qIFRoZXJlJ3Mgbm8gcG9pbnQgZG9pbmcgYW55dGhpbmcgaWYgd2UncmUgZ29pbmcgdG8gYmUgcmVzZXQgKi8KIAlpZiAoZ3AtPnJlc2V0X3Rhc2tfcGVuZGluZykKLQkJZ290byByZXN0YXJ0OworCQlyZXR1cm47CiAKIAlpZiAoZ3AtPnBoeV90eXBlID09IHBoeV9zZXJpYWxpbmsgfHwKIAkgICAgZ3AtPnBoeV90eXBlID09IHBoeV9zZXJkZXMpIHsKQEAgLTE1MjgsNyArMTUxNyw3IEBACiAJCQkJZ290byByZXN0YXJ0OwogCiAJCQlncC0+bHN0YXRlID0gbGlua191cDsKLQkJCW5ldGlmX2NhcnJpZXJfb24oZ3AtPmRldik7CisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CiAJCQkodm9pZClnZW1fc2V0X2xpbmtfbW9kZXMoZ3ApOwogCQl9CiAJCWdvdG8gcmVzdGFydDsKQEAgLTE1NDQsMTIgKzE1MzMsMTIgQEAKIAkJCWdwLT5sYXN0X2ZvcmNlZF9zcGVlZCA9IGdwLT5waHlfbWlpLnNwZWVkOwogCQkJZ3AtPnRpbWVyX3RpY2tzID0gNTsKIAkJCWlmIChuZXRpZl9tc2dfbGluayhncCkpCi0JCQkJbmV0ZGV2X2luZm8oZ3AtPmRldiwKKwkJCQluZXRkZXZfaW5mbyhkZXYsCiAJCQkJCSAgICAiR290IGxpbmsgYWZ0ZXIgZmFsbGJhY2ssIHJldHJ5aW5nIGF1dG9uZWcgb25jZS4uLlxuIik7CiAJCQlncC0+cGh5X21paS5kZWYtPm9wcy0+c2V0dXBfYW5lZygmZ3AtPnBoeV9taWksIGdwLT5waHlfbWlpLmFkdmVydGlzaW5nKTsKIAkJfSBlbHNlIGlmIChncC0+bHN0YXRlICE9IGxpbmtfdXApIHsKIAkJCWdwLT5sc3RhdGUgPSBsaW5rX3VwOwotCQkJbmV0aWZfY2Fycmllcl9vbihncC0+ZGV2KTsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKIAkJCWlmIChnZW1fc2V0X2xpbmtfbW9kZXMoZ3ApKQogCQkJCXJlc3RhcnRfYW5lZyA9IDE7CiAJCX0KQEAgLTE1NTksMTEgKzE1NDgsMTEgQEAKIAkJICovCiAJCWlmIChncC0+bHN0YXRlID09IGxpbmtfdXApIHsKIAkJCWdwLT5sc3RhdGUgPSBsaW5rX2Rvd247Ci0JCQluZXRpZl9pbmZvKGdwLCBsaW5rLCBncC0+ZGV2LCAiTGluayBkb3duXG4iKTsKLQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGdwLT5kZXYpOwotCQkJZ3AtPnJlc2V0X3Rhc2tfcGVuZGluZyA9IDE7Ci0JCQlzY2hlZHVsZV93b3JrKCZncC0+cmVzZXRfdGFzayk7Ci0JCQlyZXN0YXJ0X2FuZWcgPSAxOworCQkJbmV0aWZfaW5mbyhncCwgbGluaywgZGV2LCAiTGluayBkb3duXG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQlnZW1fc2NoZWR1bGVfcmVzZXQoZ3ApOworCQkJLyogVGhlIHJlc2V0IHRhc2sgd2lsbCByZXN0YXJ0IHRoZSB0aW1lciAqLworCQkJcmV0dXJuOwogCQl9IGVsc2UgaWYgKCsrZ3AtPnRpbWVyX3RpY2tzID4gMTApIHsKIAkJCWlmIChmb3VuZF9taWlfcGh5KGdwKSkKIAkJCQlyZXN0YXJ0X2FuZWcgPSBnZW1fbWRpb19saW5rX25vdF91cChncCk7CkBAIC0xNTczLDE3ICsxNTYyLDEyIEBACiAJfQogCWlmIChyZXN0YXJ0X2FuZWcpIHsKIAkJZ2VtX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oZ3AsIE5VTEwpOwotCQlnb3RvIG91dF91bmxvY2s7CisJCXJldHVybjsKIAl9CiByZXN0YXJ0OgogCW1vZF90aW1lcigmZ3AtPmxpbmtfdGltZXIsIGppZmZpZXMgKyAoKDEyICogSFopIC8gMTApKTsKLW91dF91bmxvY2s6Ci0JZ2VtX3B1dF9jZWxsKGdwKTsKLQlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOwotCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOwogfQogCi0vKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLwogc3RhdGljIHZvaWQgZ2VtX2NsZWFuX3JpbmdzKHN0cnVjdCBnZW0gKmdwKQogewogCXN0cnVjdCBnZW1faW5pdF9ibG9jayAqZ2IgPSBncC0+aW5pdF9ibG9jazsKQEAgLTE2MzQsNyArMTYxOCw2IEBACiAJfQogfQogCi0vKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLwogc3RhdGljIHZvaWQgZ2VtX2luaXRfcmluZ3Moc3RydWN0IGdlbSAqZ3ApCiB7CiAJc3RydWN0IGdlbV9pbml0X2Jsb2NrICpnYiA9IGdwLT5pbml0X2Jsb2NrOwpAQCAtMTY1Myw3ICsxNjM2LDcgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkJc3RydWN0IGdlbV9yeGQgKnJ4ZCA9ICZnYi0+cnhkW2ldOwogCi0JCXNrYiA9IGdlbV9hbGxvY19za2IoUlhfQlVGX0FMTE9DX1NJWkUoZ3ApLCBHRlBfQVRPTUlDKTsKKwkJc2tiID0gZ2VtX2FsbG9jX3NrYihkZXYsIFJYX0JVRl9BTExPQ19TSVpFKGdwKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghc2tiKSB7CiAJCQlyeGQtPmJ1ZmZlciA9IDA7CiAJCQlyeGQtPnN0YXR1c193b3JkID0gMDsKQEAgLTE2NjEsNyArMTY0NCw2IEBACiAJCX0KIAogCQlncC0+cnhfc2tic1tpXSA9IHNrYjsKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYl9wdXQoc2tiLCAoZ3AtPnJ4X2J1Zl9zeiArIFJYX09GRlNFVCkpOwogCQlkbWFfYWRkciA9IHBjaV9tYXBfcGFnZShncC0+cGRldiwKIAkJCQkJdmlydF90b19wYWdlKHNrYi0+ZGF0YSksCkBAIC0xNzM3LDcgKzE3MTksNyBAQAogCiAJaWYgKGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8wIHx8CiAJICAgIGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8xKSB7Ci0JICAgIAkvLyBYWFggY2hlY2sgZm9yIGVycm9ycworCQkvKiBSZXNldCBhbmQgZGV0ZWN0IE1JSSBQSFkgKi8KIAkJbWlpX3BoeV9wcm9iZSgmZ3AtPnBoeV9taWksIGdwLT5taWlfcGh5X2FkZHIpOwogCiAJCS8qIEluaXQgUEhZICovCkBAIC0xNzUzLDEzICsxNzM1LDE1IEBACiAJZ3AtPmxzdGF0ZSA9IGxpbmtfZG93bjsKIAluZXRpZl9jYXJyaWVyX29mZihncC0+ZGV2KTsKIAotCS8qIENhbiBJIGFkdmVydGlzZSBnaWdhYml0IGhlcmUgPyBJJ2QgbmVlZCBCQ00gUEhZIGRvY3MuLi4gKi8KLQlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJLyogUHJpbnQgdGhpbmdzIG91dCAqLworCWlmIChncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMCB8fAorCSAgICBncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMSkKKwkJbmV0ZGV2X2luZm8oZ3AtPmRldiwgIkZvdW5kICVzIFBIWVxuIiwKKwkJCSAgICBncC0+cGh5X21paS5kZWYgPyBncC0+cGh5X21paS5kZWYtPm5hbWUgOiAibm8iKTsKKwogCWdlbV9iZWdpbl9hdXRvX25lZ290aWF0aW9uKGdwLCBOVUxMKTsKLQlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKIH0KIAotLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KIHN0YXRpYyB2b2lkIGdlbV9pbml0X2RtYShzdHJ1Y3QgZ2VtICpncCkKIHsKIAl1NjQgZGVzY19kbWEgPSAodTY0KSBncC0+Z2Jsb2NrX2R2bWE7CkBAIC0xNzk3LDcgKzE3ODEsNiBAQAogCQkgICAgICAgZ3AtPnJlZ3MgKyBSWERNQV9CTEFOSyk7CiB9CiAKLS8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCiBzdGF0aWMgdTMyIGdlbV9zZXR1cF9tdWx0aWNhc3Qoc3RydWN0IGdlbSAqZ3ApCiB7CiAJdTMyIHJ4Y2ZnID0gMDsKQEAgLTE4MTgsMTIgKzE4MDEsNyBAQAogCiAJCW1lbXNldChoYXNoX3RhYmxlLCAwLCBzaXplb2YoaGFzaF90YWJsZSkpOwogCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZ3AtPmRldikgewotCQkJY2hhciAqYWRkcnMgPSBoYS0+YWRkcjsKLQotCQkJaWYgKCEoKmFkZHJzICYgMSkpCi0JCQkJY29udGludWU7Ci0KLSAJCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGhhLT5hZGRyKTsKIAkJCWNyYyA+Pj0gMjQ7CiAJCQloYXNoX3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8ICgxNSAtIChjcmMgJiAweGYpKTsKIAkJfQpAQCAtMTgzNSw3ICsxODEzLDYgQEAKIAlyZXR1cm4gcnhjZmc7CiB9CiAKLS8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCiBzdGF0aWMgdm9pZCBnZW1faW5pdF9tYWMoc3RydWN0IGdlbSAqZ3ApCiB7CiAJdW5zaWduZWQgY2hhciAqZSA9ICZncC0+ZGV2LT5kZXZfYWRkclswXTsKQEAgLTE5MTgsNyArMTg5NSw2IEBACiAJCXdyaXRlbCgwLCBncC0+cmVncyArIFdPTF9XQUtFQ1NSKTsKIH0KIAotLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KIHN0YXRpYyB2b2lkIGdlbV9pbml0X3BhdXNlX3RocmVzaG9sZHMoc3RydWN0IGdlbSAqZ3ApCiB7CiAgICAgICAgCXUzMiBjZmc7CkBAIC0yMDc5LDcgKzIwNTUsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLwogc3RhdGljIHZvaWQgZ2VtX3JlaW5pdF9jaGlwKHN0cnVjdCBnZW0gKmdwKQogewogCS8qIFJlc2V0IHRoZSBjaGlwICovCkBAIC0yMTAwLDExICsyMDc1LDkgQEAKIH0KIAogCi0vKiBNdXN0IGJlIGludm9rZWQgd2l0aCBubyBsb2NrIGhlbGQuICovCiBzdGF0aWMgdm9pZCBnZW1fc3RvcF9waHkoc3RydWN0IGdlbSAqZ3AsIGludCB3b2wpCiB7CiAJdTMyIG1pZmNmZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogTGV0IHRoZSBjaGlwIHNldHRsZSBkb3duIGEgYml0LCBpdCBzZWVtcyB0aGF0IGhlbHBzCiAJICogZm9yIHNsZWVwIG1vZGUgb24gc29tZSBtb2RlbHMKQEAgLTIxNTAsMTUgKzIxMjMsOSBAQAogCXdyaXRlbCgwLCBncC0+cmVncyArIFJYRE1BX0NGRyk7CiAKIAlpZiAoIXdvbCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKLQkJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CiAJCWdlbV9yZXNldChncCk7CiAJCXdyaXRlbChNQUNfVFhSU1RfQ01ELCBncC0+cmVncyArIE1BQ19UWFJTVCk7CiAJCXdyaXRlbChNQUNfUlhSU1RfQ01ELCBncC0+cmVncyArIE1BQ19SWFJTVCk7Ci0JCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogTm8gbmVlZCB0byB0YWtlIHRoZSBsb2NrIGhlcmUgKi8KIAogCQlpZiAoZm91bmRfbWlpX3BoeShncCkgJiYgZ3AtPnBoeV9taWkuZGVmLT5vcHMtPnN1c3BlbmQpCiAJCQlncC0+cGh5X21paS5kZWYtPm9wcy0+c3VzcGVuZCgmZ3AtPnBoeV9taWkpOwpAQCAtMjE3NSw3NyArMjE0Miw4NiBAQAogCX0KIH0KIAotCiBzdGF0aWMgaW50IGdlbV9kb19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBnZW0gKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7Ci0Jc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisJaW50IHJjOwogCiAJLyogRW5hYmxlIHRoZSBjZWxsICovCiAJZ2VtX2dldF9jZWxsKGdwKTsKIAorCS8qIE1ha2Ugc3VyZSBQQ0kgYWNjZXNzIGFuZCBidXMgbWFzdGVyIGFyZSBlbmFibGVkICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShncC0+cGRldik7CisJaWYgKHJjKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBjaGlwIG9uIFBDSSBidXMgIVxuIik7CisKKwkJLyogUHV0IGNlbGwgYW5kIGZvcmdldCBpdCBmb3Igbm93LCBpdCB3aWxsIGJlIGNvbnNpZGVyZWQgYXMKKwkJICogc3RpbGwgYXNsZWVwLCBhIG5ldyBzbGVlcCBjeWNsZSBtYXkgYnJpbmcgaXQgYmFjaworCQkgKi8KKwkJZ2VtX3B1dF9jZWxsKGdwKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJcGNpX3NldF9tYXN0ZXIoZ3AtPnBkZXYpOworCiAJLyogSW5pdCAmIHNldHVwIGNoaXAgaGFyZHdhcmUgKi8KIAlnZW1fcmVpbml0X2NoaXAoZ3ApOwogCi0JZ3AtPnJ1bm5pbmcgPSAxOwotCi0JbmFwaV9lbmFibGUoJmdwLT5uYXBpKTsKLQotCWlmIChncC0+bHN0YXRlID09IGxpbmtfdXApIHsKLQkJbmV0aWZfY2Fycmllcl9vbihncC0+ZGV2KTsKLQkJZ2VtX3NldF9saW5rX21vZGVzKGdwKTsKLQl9Ci0KLQluZXRpZl93YWtlX3F1ZXVlKGdwLT5kZXYpOwotCi0Jc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHJlcXVlc3RfaXJxKGdwLT5wZGV2LT5pcnEsIGdlbV9pbnRlcnJ1cHQsCi0JCQkJICAgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgKHZvaWQgKilkZXYpKSB7CisJLyogQW4gaW50ZXJydXB0IG1pZ2h0IGNvbWUgaW4gaGFuZHkgKi8KKwlyYyA9IHJlcXVlc3RfaXJxKGdwLT5wZGV2LT5pcnEsIGdlbV9pbnRlcnJ1cHQsCisJCQkgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgKHZvaWQgKilkZXYpOworCWlmIChyYykgewogCQluZXRkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycSAhXG4iKTsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKLQkJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7Ci0KLQkJbmFwaV9kaXNhYmxlKCZncC0+bmFwaSk7Ci0KLQkJZ3AtPnJ1bm5pbmcgPSAgMDsKIAkJZ2VtX3Jlc2V0KGdwKTsKIAkJZ2VtX2NsZWFuX3JpbmdzKGdwKTsKIAkJZ2VtX3B1dF9jZWxsKGdwKTsKLQotCQlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiAtRUFHQUlOOworCQlyZXR1cm4gcmM7CiAJfQogCisJLyogTWFyayB1cyBhcyBhdHRhY2hlZCBhZ2FpbiBpZiB3ZSBjb21lIGZyb20gcmVzdW1lKCksIHRoaXMgaGFzCisJICogbm8gZWZmZWN0IGlmIHdlIHdlcmVuJ3QgZGV0YXRjaGVkIGFuZCBuZWVkcyB0byBiZSBkb25lIG5vdy4KKwkgKi8KKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwkvKiBSZXN0YXJ0IE5BUEkgJiBxdWV1ZXMgKi8KKwlnZW1fbmV0aWZfc3RhcnQoZ3ApOworCisJLyogRGV0ZWN0ICYgaW5pdCBQSFksIHN0YXJ0IGF1dG9uZWcgZXRjLi4uIHRoaXMgd2lsbAorCSAqIGV2ZW50dWFsbHkgcmVzdWx0IGluIHN0YXJ0aW5nIERNQSBvcGVyYXRpb25zIHdoZW4KKwkgKiB0aGUgbGluayBpcyB1cAorCSAqLworCWdlbV9pbml0X3BoeShncCk7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZ2VtX2RvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHdvbCkKIHsKIAlzdHJ1Y3QgZ2VtICpncCA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOwotCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCS8qIFN0b3AgTkFQSSBhbmQgc3RvcCB0eCBxdWV1ZSAqLworCWdlbV9uZXRpZl9zdG9wKGdwKTsKIAotCWdwLT5ydW5uaW5nID0gMDsKLQotCS8qIFN0b3AgbmV0aWYgcXVldWUgKi8KLQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0KLQkvKiBNYWtlIHN1cmUgaW50cyBhcmUgZGlzYWJsZWQgKi8KKwkvKiBNYWtlIHN1cmUgaW50cyBhcmUgZGlzYWJsZWQuIFdlIGRvbid0IGNhcmUgYWJvdXQKKwkgKiBzeW5jaHJvbml6aW5nIGFzIE5BUEkgaXMgZGlzYWJsZWQsIHRodXMgYSBzdHJheQorCSAqIGludGVycnVwdCB3aWxsIGRvIG5vdGhpbmcgYmFkIChvdXIgaXJxIGhhbmRsZXIKKwkgKiBqdXN0IHNjaGVkdWxlcyBOQVBJKQorCSAqLwogCWdlbV9kaXNhYmxlX2ludHMoZ3ApOwogCi0JLyogV2UgY2FuIGRyb3AgdGhlIGxvY2sgbm93ICovCi0Jc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCS8qIFN0b3AgdGhlIGxpbmsgdGltZXIgKi8KKwlkZWxfdGltZXJfc3luYygmZ3AtPmxpbmtfdGltZXIpOworCisJLyogV2UgY2Fubm90IGNhbmNlbCB0aGUgcmVzZXQgdGFzayB3aGlsZSBob2xkaW5nIHRoZQorCSAqIHJ0bmwgbG9jaywgd2UnZCBnZXQgYW4gQS0+QiAvIEItPkEgZGVhZGxvY2sgc3RpdHVhdGlvbgorCSAqIGlmIHdlIGRpZC4gVGhpcyBpcyBub3QgYW4gaXNzdWUgaG93ZXZlciBhcyB0aGUgcmVzZXQKKwkgKiB0YXNrIGlzIHN5bmNocm9uaXplZCB2cy4gdXMgKHJ0bmxfbG9jaykgYW5kIHdpbGwgZG8KKwkgKiBub3RoaW5nIGlmIHRoZSBkZXZpY2UgaXMgZG93biBvciBzdXNwZW5kZWQuIFdlIGRvCisJICogc3RpbGwgY2xlYXIgcmVzZXRfdGFza19wZW5kaW5nIHRvIGF2b2lkIGEgc3B1cnJpb3VzCisJICogcmVzZXQgbGF0ZXIgb24gaW4gY2FzZSB3ZSBkbyByZXN1bWUgYmVmb3JlIGl0IGdldHMKKwkgKiBzY2hlZHVsZWQuCisJICovCisJZ3AtPnJlc2V0X3Rhc2tfcGVuZGluZyA9IDA7CiAKIAkvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gc2xlZXAgd2l0aCBXT0wgKi8KIAlnZW1fc3RvcF9kbWEoZ3ApOwpAQCAtMjI2MCw3OSArMjIzNiw3OSBAQAogCS8qIE5vIGlycSBuZWVkZWQgYW55bW9yZSAqLwogCWZyZWVfaXJxKGdwLT5wZGV2LT5pcnEsICh2b2lkICopIGRldik7CiAKKwkvKiBTaHV0IHRoZSBQSFkgZG93biBldmVudHVhbGx5IGFuZCBzZXR1cCBXT0wgKi8KKwlnZW1fc3RvcF9waHkoZ3AsIHdvbCk7CisKKwkvKiBNYWtlIHN1cmUgYnVzIG1hc3RlciBpcyBkaXNhYmxlZCAqLworCXBjaV9kaXNhYmxlX2RldmljZShncC0+cGRldik7CisKIAkvKiBDZWxsIG5vdCBuZWVkZWQgbmVpdGhlciBpZiBubyBXT0wgKi8KLQlpZiAoIXdvbCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIXdvbCkKIAkJZ2VtX3B1dF9jZWxsKGdwKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKLQl9CiB9CiAKIHN0YXRpYyB2b2lkIGdlbV9yZXNldF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZ2VtICpncCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZ2VtLCByZXNldF90YXNrKTsKIAotCW11dGV4X2xvY2soJmdwLT5wbV9tdXRleCk7CisJLyogTG9jayBvdXQgdGhlIG5ldHdvcmsgc3RhY2sgKGVzc2VudGlhbGx5IHNoaWVsZCBvdXJzZWx2ZXMKKwkgKiBhZ2FpbnN0IGEgcmFjaW5nIG9wZW4sIGNsb3NlLCBjb250cm9sIGNhbGwsIG9yIHN1c3BlbmQKKwkgKi8KKwlydG5sX2xvY2soKTsKIAotCWlmIChncC0+b3BlbmVkKQotCQluYXBpX2Rpc2FibGUoJmdwLT5uYXBpKTsKLQotCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKLQlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKLQotCWlmIChncC0+cnVubmluZykgewotCQluZXRpZl9zdG9wX3F1ZXVlKGdwLT5kZXYpOwotCi0JCS8qIFJlc2V0IHRoZSBjaGlwICYgcmluZ3MgKi8KLQkJZ2VtX3JlaW5pdF9jaGlwKGdwKTsKLQkJaWYgKGdwLT5sc3RhdGUgPT0gbGlua191cCkKLQkJCWdlbV9zZXRfbGlua19tb2RlcyhncCk7Ci0JCW5ldGlmX3dha2VfcXVldWUoZ3AtPmRldik7CisJLyogU2tpcCB0aGUgcmVzZXQgdGFzayBpZiBzdXNwZW5kZWQgb3IgY2xvc2VkLCBvciBpZiBpdCdzCisJICogYmVlbiBjYW5jZWxsZWQgYnkgZ2VtX2RvX3N0b3AgKHNlZSBjb21tZW50IHRoZXJlKQorCSAqLworCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZ3AtPmRldikgfHwKKwkgICAgIW5ldGlmX3J1bm5pbmcoZ3AtPmRldikgfHwKKwkgICAgIWdwLT5yZXNldF90YXNrX3BlbmRpbmcpIHsKKwkJcnRubF91bmxvY2soKTsKKwkJcmV0dXJuOwogCX0KIAorCS8qIFN0b3AgdGhlIGxpbmsgdGltZXIgKi8KKwlkZWxfdGltZXJfc3luYygmZ3AtPmxpbmtfdGltZXIpOworCisJLyogU3RvcCBOQVBJIGFuZCB0eCAqLworCWdlbV9uZXRpZl9zdG9wKGdwKTsKKworCS8qIFJlc2V0IHRoZSBjaGlwICYgcmluZ3MgKi8KKwlnZW1fcmVpbml0X2NoaXAoZ3ApOworCWlmIChncC0+bHN0YXRlID09IGxpbmtfdXApCisJCWdlbV9zZXRfbGlua19tb2RlcyhncCk7CisKKwkvKiBSZXN0YXJ0IE5BUEkgYW5kIFR4ICovCisJZ2VtX25ldGlmX3N0YXJ0KGdwKTsKKworCS8qIFdlIGFyZSBiYWNrICEgKi8KIAlncC0+cmVzZXRfdGFza19wZW5kaW5nID0gMDsKIAotCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7CisJLyogSWYgdGhlIGxpbmsgaXMgbm90IHVwLCByZXN0YXJ0IGF1dG9uZWcsIGVsc2UgcmVzdGFydCB0aGUKKwkgKiBwb2xsaW5nIHRpbWVyCisJICovCisJaWYgKGdwLT5sc3RhdGUgIT0gbGlua191cCkKKwkJZ2VtX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oZ3AsIE5VTEwpOworCWVsc2UKKwkJbW9kX3RpbWVyKCZncC0+bGlua190aW1lciwgamlmZmllcyArICgoMTIgKiBIWikgLyAxMCkpOwogCi0JaWYgKGdwLT5vcGVuZWQpCi0JCW5hcGlfZW5hYmxlKCZncC0+bmFwaSk7Ci0KLQltdXRleF91bmxvY2soJmdwLT5wbV9tdXRleCk7CisJcnRubF91bmxvY2soKTsKIH0KIAotCiBzdGF0aWMgaW50IGdlbV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGdlbSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCByYyA9IDA7Ci0KLQltdXRleF9sb2NrKCZncC0+cG1fbXV0ZXgpOwotCi0JLyogV2UgbmVlZCB0aGUgY2VsbCBlbmFibGVkICovCi0JaWYgKCFncC0+YXNsZWVwKQotCQlyYyA9IGdlbV9kb19zdGFydChkZXYpOwotCWdwLT5vcGVuZWQgPSAocmMgPT0gMCk7Ci0KLQltdXRleF91bmxvY2soJmdwLT5wbV9tdXRleCk7Ci0KLQlyZXR1cm4gcmM7CisJLyogV2UgYWxsb3cgb3BlbiB3aGlsZSBzdXNwZW5kZWQsIHdlIGp1c3QgZG8gbm90aGluZywKKwkgKiB0aGUgY2hpcCB3aWxsIGJlIGluaXRpYWxpemVkIGluIHJlc3VtZSgpCisJICovCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXJldHVybiBnZW1fZG9fc3RhcnQoZGV2KTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBnZW1fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZ2VtICpncCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQltdXRleF9sb2NrKCZncC0+cG1fbXV0ZXgpOwotCi0JbmFwaV9kaXNhYmxlKCZncC0+bmFwaSk7Ci0KLQlncC0+b3BlbmVkID0gMDsKLQlpZiAoIWdwLT5hc2xlZXApCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCiAJCWdlbV9kb19zdG9wKGRldiwgMCk7CiAKLQltdXRleF91bmxvY2soJmdwLT5wbV9tdXRleCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjM0MSw1OSArMjMxNywzNSBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGdlbSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQltdXRleF9sb2NrKCZncC0+cG1fbXV0ZXgpOworCS8qIExvY2sgdGhlIG5ldHdvcmsgc3RhY2sgZmlyc3QgdG8gYXZvaWQgcmFjaW5nIHdpdGggb3Blbi9jbG9zZSwKKwkgKiByZXNldCB0YXNrIGFuZCBzZXR0aW5nIGNhbGxzCisJICovCisJcnRubF9sb2NrKCk7CiAKLQluZXRkZXZfaW5mbyhkZXYsICJzdXNwZW5kaW5nLCBXYWtlT25MYW4gJXNcbiIsCi0JCSAgICAoZ3AtPndha2Vfb25fbGFuICYmIGdwLT5vcGVuZWQpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0KLQkvKiBLZWVwIHRoZSBjZWxsIGVuYWJsZWQgZHVyaW5nIHRoZSBlbnRpcmUgb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7Ci0Jc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7Ci0JZ2VtX2dldF9jZWxsKGdwKTsKLQlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBJZiB0aGUgZHJpdmVyIGlzIG9wZW5lZCwgd2Ugc3RvcCB0aGUgTUFDICovCi0JaWYgKGdwLT5vcGVuZWQpIHsKLQkJbmFwaV9kaXNhYmxlKCZncC0+bmFwaSk7Ci0KLQkJLyogU3RvcCB0cmFmZmljLCBtYXJrIHVzIGNsb3NlZCAqLworCS8qIE5vdCBydW5uaW5nLCBtYXJrIG91cnNlbHZlcyBub24tcHJlc2VudCwgbm8gbmVlZCBmb3IKKwkgKiBhIGxvY2sgaGVyZQorCSAqLworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJcnRubF91bmxvY2soKTsKKwkJcmV0dXJuIDA7CisJfQorCW5ldGRldl9pbmZvKGRldiwgInN1c3BlbmRpbmcsIFdha2VPbkxhbiAlc1xuIiwKKwkJICAgIChncC0+d2FrZV9vbl9sYW4gJiYgbmV0aWZfcnVubmluZyhkZXYpKSA/CisJCSAgICAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKIAotCQkvKiBTd2l0Y2ggb2ZmIE1BQywgcmVtZW1iZXIgV09MIHNldHRpbmcgKi8KLQkJZ3AtPmFzbGVlcF93b2wgPSBncC0+d2FrZV9vbl9sYW47Ci0JCWdlbV9kb19zdG9wKGRldiwgZ3AtPmFzbGVlcF93b2wpOwotCX0gZWxzZQotCQlncC0+YXNsZWVwX3dvbCA9IDA7Ci0KLQkvKiBNYXJrIHVzIGFzbGVlcCAqLwotCWdwLT5hc2xlZXAgPSAxOwotCXdtYigpOwotCi0JLyogU3RvcCB0aGUgbGluayB0aW1lciAqLwotCWRlbF90aW1lcl9zeW5jKCZncC0+bGlua190aW1lcik7Ci0KLQkvKiBOb3cgd2UgcmVsZWFzZSB0aGUgbXV0ZXggdG8gbm90IGJsb2NrIHRoZSByZXNldCB0YXNrIHdobwotCSAqIGNhbiB0YWtlIGl0IHRvby4gV2UgYXJlIG1hcmtlZCBhc2xlZXAsIHNvIHRoZXJlIHdpbGwgYmUgbm8KLQkgKiBjb25mbGljdCBoZXJlCisJLyogVGVsbCB0aGUgbmV0d29yayBzdGFjayB3ZSdyZSBnb25lLiBnZW1fZG9fc3RvcCgpIGJlbG93IHdpbGwKKwkgKiBzeW5jaHJvbml6ZSB3aXRoIFRYLCBzdG9wIE5BUEkgZXRjLi4uCiAJICovCi0JbXV0ZXhfdW5sb2NrKCZncC0+cG1fbXV0ZXgpOworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKIAotCS8qIFdhaXQgZm9yIHRoZSBwZW5kaW5nIHJlc2V0IHRhc2sgdG8gY29tcGxldGUgKi8KLQlmbHVzaF93b3JrX3N5bmMoJmdwLT5yZXNldF90YXNrKTsKKwkvKiBTd2l0Y2ggb2ZmIGNoaXAsIHJlbWVtYmVyIFdPTCBzZXR0aW5nICovCisJZ3AtPmFzbGVlcF93b2wgPSBncC0+d2FrZV9vbl9sYW47CisJZ2VtX2RvX3N0b3AoZGV2LCBncC0+YXNsZWVwX3dvbCk7CiAKLQkvKiBTaHV0IHRoZSBQSFkgZG93biBldmVudHVhbGx5IGFuZCBzZXR1cCBXT0wgKi8KLQlnZW1fc3RvcF9waHkoZ3AsIGdwLT5hc2xlZXBfd29sKTsKLQotCS8qIE1ha2Ugc3VyZSBidXMgbWFzdGVyIGlzIGRpc2FibGVkICovCi0JcGNpX2Rpc2FibGVfZGV2aWNlKGdwLT5wZGV2KTsKLQotCS8qIFJlbGVhc2UgdGhlIGNlbGwsIG5vIG5lZWQgdG8gdGFrZSBhIGxvY2sgYXQgdGhpcyBwb2ludCBzaW5jZQotCSAqIG5vdGhpbmcgZWxzZSBjYW4gaGFwcGVuIG5vdwotCSAqLwotCWdlbV9wdXRfY2VsbChncCk7CisJLyogVW5sb2NrIHRoZSBuZXR3b3JrIHN0YWNrICovCisJcnRubF91bmxvY2soKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQwMiw1MyArMjM1NCwyMyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGdlbSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQluZXRkZXZfaW5mbyhkZXYsICJyZXN1bWluZ1xuIik7CisJLyogU2VlIGxvY2tpbmcgY29tbWVudCBpbiBnZW1fc3VzcGVuZCAqLworCXJ0bmxfbG9jaygpOwogCi0JbXV0ZXhfbG9jaygmZ3AtPnBtX211dGV4KTsKLQotCS8qIEtlZXAgdGhlIGNlbGwgZW5hYmxlZCBkdXJpbmcgdGhlIGVudGlyZSBvcGVyYXRpb24sIG5vIG5lZWQgdG8KLQkgKiB0YWtlIGEgbG9jayBoZXJlIHRobyBzaW5jZSBub3RoaW5nIGVsc2UgY2FuIGhhcHBlbiB3aGlsZSB3ZSBhcmUKLQkgKiBtYXJrZWQgYXNsZWVwCisJLyogTm90IHJ1bm5pbmcsIG1hcmsgb3Vyc2VsdmVzIHByZXNlbnQsIG5vIG5lZWQgZm9yCisJICogYSBsb2NrIGhlcmUKIAkgKi8KLQlnZW1fZ2V0X2NlbGwoZ3ApOwotCi0JLyogTWFrZSBzdXJlIFBDSSBhY2Nlc3MgYW5kIGJ1cyBtYXN0ZXIgYXJlIGVuYWJsZWQgKi8KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZ3AtPnBkZXYpKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiQ2FuJ3QgcmUtZW5hYmxlIGNoaXAgIVxuIik7Ci0JCS8qIFB1dCBjZWxsIGFuZCBmb3JnZXQgaXQgZm9yIG5vdywgaXQgd2lsbCBiZSBjb25zaWRlcmVkIGFzCi0JCSAqIHN0aWxsIGFzbGVlcCwgYSBuZXcgc2xlZXAgY3ljbGUgbWF5IGJyaW5nIGl0IGJhY2sKLQkJICovCi0JCWdlbV9wdXRfY2VsbChncCk7Ci0JCW11dGV4X3VubG9jaygmZ3AtPnBtX211dGV4KTsKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJCXJ0bmxfdW5sb2NrKCk7CiAJCXJldHVybiAwOwogCX0KLQlwY2lfc2V0X21hc3RlcihncC0+cGRldik7CiAKLQkvKiBSZXNldCBldmVyeXRoaW5nICovCi0JZ2VtX3Jlc2V0KGdwKTsKLQotCS8qIE1hcmsgdXMgd29rZW4gdXAgKi8KLQlncC0+YXNsZWVwID0gMDsKLQl3bWIoKTsKLQotCS8qIEJyaW5nIHRoZSBQSFkgYmFjay4gQWdhaW4sIGxvY2sgaXMgdXNlbGVzcyBhdCB0aGlzIHBvaW50IGFzCi0JICogbm90aGluZyBjYW4gYmUgaGFwcGVuaW5nIHVudGlsIHdlIHJlc3RhcnQgdGhlIHdob2xlIHRoaW5nCisJLyogUmVzdGFydCBjaGlwLiBJZiB0aGF0IGZhaWxzIHRoZXJlIGlzbid0IG11Y2ggd2UgY2FuIGRvLCB3ZQorCSAqIGxlYXZlIHRoaW5ncyBzdG9wcGVkLgogCSAqLwotCWdlbV9pbml0X3BoeShncCk7Ci0KLQkvKiBJZiB3ZSB3ZXJlIG9wZW5lZCwgYnJpbmcgZXZlcnl0aGluZyBiYWNrICovCi0JaWYgKGdwLT5vcGVuZWQpIHsKLQkJLyogUmVzdGFydCBNQUMgKi8KLQkJZ2VtX2RvX3N0YXJ0KGRldik7Ci0KLQkJLyogUmUtYXR0YWNoIG5ldCBkZXZpY2UgKi8KLQkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOwotCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCWdlbV9kb19zdGFydChkZXYpOwogCiAJLyogSWYgd2UgaGFkIFdPTCBlbmFibGVkLCB0aGUgY2VsbCBjbG9jayB3YXMgbmV2ZXIgdHVybmVkIG9mZiBkdXJpbmcKIAkgKiBzbGVlcCwgc28gd2UgZW5kIHVwIGJlZWluZyB1bmJhbGFuY2VkLiBGaXggdGhhdCBoZXJlCkBAIC0yNDU2LDE1ICsyMzc4LDggQEAKIAlpZiAoZ3AtPmFzbGVlcF93b2wpCiAJCWdlbV9wdXRfY2VsbChncCk7CiAKLQkvKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgbmVlZCB0byBob2xkIHRoZSBjZWxsLCBpdCB3aWxsIGJlIGhlbGQgaWYgdGhlCi0JICogZHJpdmVyIGlzIG9wZW4gYnkgZ2VtX2RvX3N0YXJ0KCkuCi0JICovCi0JZ2VtX3B1dF9jZWxsKGdwKTsKLQotCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKLQotCW11dGV4X3VubG9jaygmZ3AtPnBtX211dGV4KTsKKwkvKiBVbmxvY2sgdGhlIG5ldHdvcmsgc3RhY2sgKi8KKwlydG5sX3VubG9jaygpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNDc0LDMzICsyMzg5LDM1IEBACiB7CiAJc3RydWN0IGdlbSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOwotCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOwotCiAJLyogSSBoYXZlIHNlZW4gdGhpcyBiZWluZyBjYWxsZWQgd2hpbGUgdGhlIFBNIHdhcyBpbiBwcm9ncmVzcywKLQkgKiBzbyB3ZSBzaGllbGQgYWdhaW5zdCB0aGlzCisJICogc28gd2Ugc2hpZWxkIGFnYWluc3QgdGhpcy4gTGV0J3MgYWxzbyBub3QgcG9rZSBhdCByZWdpc3RlcnMKKwkgKiB3aGlsZSB0aGUgcmVzZXQgdGFzayBpcyBnb2luZyBvbi4KKwkgKgorCSAqIFRPRE86IE1vdmUgc3RhdHMgY29sbGVjdGlvbiBlbHNld2hlcmUgKGxpbmsgdGltZXIgPykgYW5kCisJICogbWFrZSB0aGlzIGEgbm9wIHRvIGF2b2lkIGFsbCB0aG9zZSBzeW5jaHJvIGlzc3VlcwogCSAqLwotCWlmIChncC0+cnVubmluZykgewotCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfRkNTRVJSKTsKLQkJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0ZDU0VSUik7CisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpIHx8ICFuZXRpZl9ydW5uaW5nKGRldikpCisJCWdvdG8gYmFpbDsKIAotCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSByZWFkbChncC0+cmVncyArIE1BQ19BRVJSKTsKLQkJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0FFUlIpOworCS8qIEJldHRlciBzYWZlIHRoYW4gc29ycnkuLi4gKi8KKwlpZiAoV0FSTl9PTighZ3AtPmNlbGxfZW5hYmxlZCkpCisJCWdvdG8gYmFpbDsKIAotCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgKz0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfTEVSUik7Ci0JCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19MRVJSKTsKKwlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfRkNTRVJSKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfRkNTRVJSKTsKIAotCQlkZXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IHJlYWRsKGdwLT5yZWdzICsgTUFDX0VDT0xMKTsKLQkJZGV2LT5zdGF0cy5jb2xsaXNpb25zICs9Ci0JCQkocmVhZGwoZ3AtPnJlZ3MgKyBNQUNfRUNPTEwpICsKLQkJCSByZWFkbChncC0+cmVncyArIE1BQ19MQ09MTCkpOwotCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfRUNPTEwpOwotCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfTENPTEwpOwotCX0KKwlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSByZWFkbChncC0+cmVncyArIE1BQ19BRVJSKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfQUVSUik7CiAKLQlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOwotCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPSByZWFkbChncC0+cmVncyArIE1BQ19MRVJSKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfTEVSUik7CiAKKwlkZXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IHJlYWRsKGdwLT5yZWdzICsgTUFDX0VDT0xMKTsKKwlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0KKwkJKHJlYWRsKGdwLT5yZWdzICsgTUFDX0VDT0xMKSArIHJlYWRsKGdwLT5yZWdzICsgTUFDX0xDT0xMKSk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0VDT0xMKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfTENPTEwpOworIGJhaWw6CiAJcmV0dXJuICZkZXYtPnN0YXRzOwogfQogCkBAIC0yNTEzLDIyICsyNDMwLDE5IEBACiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG1hY2FkZHItPnNhX2RhdGEpKQogCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CiAKLQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCAhbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgewotCQkvKiBXZSdsbCBqdXN0IGNhdGNoIGl0IGxhdGVyIHdoZW4gdGhlCi0JCSAqIGRldmljZSBpcyB1cCdkIG9yIHJlc3VtZWQuCi0JCSAqLwotCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgbWFjYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJmdwLT5wbV9tdXRleCk7CiAJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIG1hY2FkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOwotCWlmIChncC0+cnVubmluZykgewotCQl3cml0ZWwoKGVbNF0gPDwgOCkgfCBlWzVdLCBncC0+cmVncyArIE1BQ19BRERSMCk7Ci0JCXdyaXRlbCgoZVsyXSA8PCA4KSB8IGVbM10sIGdwLT5yZWdzICsgTUFDX0FERFIxKTsKLQkJd3JpdGVsKChlWzBdIDw8IDgpIHwgZVsxXSwgZ3AtPnJlZ3MgKyBNQUNfQUREUjIpOwotCX0KLQltdXRleF91bmxvY2soJmdwLT5wbV9tdXRleCk7CisKKwkvKiBXZSdsbCBqdXN0IGNhdGNoIGl0IGxhdGVyIHdoZW4gdGhlIGRldmljZSBpcyB1cCdkIG9yIHJlc3VtZWQgKi8KKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCAhbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBCZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5Li4uICovCisJaWYgKFdBUk5fT04oIWdwLT5jZWxsX2VuYWJsZWQpKQorCQlyZXR1cm4gMDsKKworCXdyaXRlbCgoZVs0XSA8PCA4KSB8IGVbNV0sIGdwLT5yZWdzICsgTUFDX0FERFIwKTsKKwl3cml0ZWwoKGVbMl0gPDwgOCkgfCBlWzNdLCBncC0+cmVncyArIE1BQ19BRERSMSk7CisJd3JpdGVsKChlWzBdIDw8IDgpIHwgZVsxXSwgZ3AtPnJlZ3MgKyBNQUNfQUREUjIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNTM5LDE0ICsyNDUzLDEyIEBACiAJdTMyIHJ4Y2ZnLCByeGNmZ19uZXc7CiAJaW50IGxpbWl0ID0gMTAwMDA7CiAKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCAhbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOwotCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOwotCi0JaWYgKCFncC0+cnVubmluZykKLQkJZ290byBiYWlsOwotCi0JbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCS8qIEJldHRlciBzYWZlIHRoYW4gc29ycnkuLi4gKi8KKwlpZiAoZ3AtPnJlc2V0X3Rhc2tfcGVuZGluZyB8fCBXQVJOX09OKCFncC0+Y2VsbF9lbmFibGVkKSkKKwkJcmV0dXJuOwogCiAJcnhjZmcgPSByZWFkbChncC0+cmVncyArIE1BQ19SWENGRyk7CiAJcnhjZmdfbmV3ID0gZ2VtX3NldHVwX211bHRpY2FzdChncCk7CkBAIC0yNTY2LDEyICsyNDc4LDYgQEAKIAlyeGNmZyB8PSByeGNmZ19uZXc7CiAKIAl3cml0ZWwocnhjZmcsIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKLQotCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLQotIGJhaWw6Ci0Jc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKIH0KIAogLyogSnVtYm8tZ3JhbXMgZG9uJ3Qgc2VlbSB0byB3b3JrIDotKCAqLwpAQCAtMjU4OSwyNiArMjQ5NSwyMSBAQAogCWlmIChuZXdfbXR1IDwgR0VNX01JTl9NVFUgfHwgbmV3X210dSA+IEdFTV9NQVhfTVRVKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghbmV0aWZfcnVubmluZyhkZXYpIHx8ICFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7Ci0JCS8qIFdlJ2xsIGp1c3QgY2F0Y2ggaXQgbGF0ZXIgd2hlbiB0aGUKLQkJICogZGV2aWNlIGlzIHVwJ2Qgb3IgcmVzdW1lZC4KLQkJICovCi0JCWRldi0+bXR1ID0gbmV3X210dTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmZ3AtPnBtX211dGV4KTsKLQlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7Ci0Jc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CiAJZGV2LT5tdHUgPSBuZXdfbXR1OwotCWlmIChncC0+cnVubmluZykgewotCQlnZW1fcmVpbml0X2NoaXAoZ3ApOwotCQlpZiAoZ3AtPmxzdGF0ZSA9PSBsaW5rX3VwKQotCQkJZ2VtX3NldF9saW5rX21vZGVzKGdwKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKLQltdXRleF91bmxvY2soJmdwLT5wbV9tdXRleCk7CisKKwkvKiBXZSdsbCBqdXN0IGNhdGNoIGl0IGxhdGVyIHdoZW4gdGhlIGRldmljZSBpcyB1cCdkIG9yIHJlc3VtZWQgKi8KKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCAhbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBCZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5Li4uICovCisJaWYgKFdBUk5fT04oIWdwLT5jZWxsX2VuYWJsZWQpKQorCQlyZXR1cm4gMDsKKworCWdlbV9uZXRpZl9zdG9wKGdwKTsKKwlnZW1fcmVpbml0X2NoaXAoZ3ApOworCWlmIChncC0+bHN0YXRlID09IGxpbmtfdXApCisJCWdlbV9zZXRfbGlua19tb2RlcyhncCk7CisJZ2VtX25ldGlmX3N0YXJ0KGdwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjY0MCw3ICsyNTQxLDYgQEAKIAkJY21kLT5waHlfYWRkcmVzcyA9IDA7IC8qIFhYWCBmaXhlZCBQSFlBRCAqLwogCiAJCS8qIFJldHVybiBjdXJyZW50IFBIWSBzZXR0aW5ncyAqLwotCQlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CiAJCWNtZC0+YXV0b25lZyA9IGdwLT53YW50X2F1dG9uZWc7CiAJCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIGdwLT5waHlfbWlpLnNwZWVkKTsKIAkJY21kLT5kdXBsZXggPSBncC0+cGh5X21paS5kdXBsZXg7CkBAIC0yNjUyLDcgKzI1NTIsNiBAQAogCQkgKi8KIAkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgPT0gMCkKIAkJCWNtZC0+YWR2ZXJ0aXNpbmcgPSBjbWQtPnN1cHBvcnRlZDsKLQkJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7CiAJfSBlbHNlIHsgLy8gWFhYIFBDUyA/CiAJCWNtZC0+c3VwcG9ydGVkID0KIAkJCShTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CkBAIC0yNzA2LDExICsyNjA1LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogQXBwbHkgc2V0dGluZ3MgYW5kIHJlc3RhcnQgbGluayBwcm9jZXNzLiAqLwotCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKLQlnZW1fZ2V0X2NlbGwoZ3ApOwotCWdlbV9iZWdpbl9hdXRvX25lZ290aWF0aW9uKGdwLCBjbWQpOwotCWdlbV9wdXRfY2VsbChncCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7CisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGdwLT5kZXYpKSB7CisJCWRlbF90aW1lcl9zeW5jKCZncC0+bGlua190aW1lcik7CisJCWdlbV9iZWdpbl9hdXRvX25lZ290aWF0aW9uKGdwLCBjbWQpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjcyMiwxMiArMjYyMCwxMSBAQAogCWlmICghZ3AtPndhbnRfYXV0b25lZykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBSZXN0YXJ0IGxpbmsgcHJvY2Vzcy4gKi8KLQlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7Ci0JZ2VtX2dldF9jZWxsKGdwKTsKLQlnZW1fYmVnaW5fYXV0b19uZWdvdGlhdGlvbihncCwgTlVMTCk7Ci0JZ2VtX3B1dF9jZWxsKGdwKTsKLQlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKKwkvKiBSZXN0YXJ0IGxpbmsgcHJvY2VzcyAgKi8KKwlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQoZ3AtPmRldikpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmdwLT5saW5rX3RpbWVyKTsKKwkJZ2VtX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oZ3AsIE5VTEwpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjc5MSwxNiArMjY4OCwxMSBAQAogCXN0cnVjdCBnZW0gKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkoaWZyKTsKIAlpbnQgcmMgPSAtRU9QTk9UU1VQUDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogSG9sZCB0aGUgUE0gbXV0ZXggd2hpbGUgZG9pbmcgaW9jdGwncyBvciB3ZSBtYXkgY29sbGlkZQotCSAqIHdpdGggcG93ZXIgbWFuYWdlbWVudC4KKwkvKiBGb3IgU0lPQ0dNSUlSRUcgYW5kIFNJT0NTTUlJUkVHIHRoZSBjb3JlIGNoZWNrcyBmb3IgdXMgdGhhdAorCSAqIG5ldGlmX2RldmljZV9wcmVzZW50KCkgaXMgdHJ1ZSBhbmQgaG9sZHMgcnRubF9sb2NrIGZvciB1cworCSAqIHNvIHdlIGhhdmUgbm90aGluZyB0byB3b3JyeSBhYm91dAogCSAqLwotCW11dGV4X2xvY2soJmdwLT5wbV9tdXRleCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKLQlnZW1fZ2V0X2NlbGwoZ3ApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KQEAgLTI4MDgsMzIgKzI3MDAsMTcgQEAKIAkJLyogRmFsbHRocm91Z2guLi4gKi8KIAogCWNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCi0JCWlmICghZ3AtPnJ1bm5pbmcpCi0JCQlyYyA9IC1FQUdBSU47Ci0JCWVsc2UgewotCQkJZGF0YS0+dmFsX291dCA9IF9fcGh5X3JlYWQoZ3AsIGRhdGEtPnBoeV9pZCAmIDB4MWYsCi0JCQkJCQkgICBkYXRhLT5yZWdfbnVtICYgMHgxZik7Ci0JCQlyYyA9IDA7Ci0JCX0KKwkJZGF0YS0+dmFsX291dCA9IF9fcGh5X3JlYWQoZ3AsIGRhdGEtPnBoeV9pZCAmIDB4MWYsCisJCQkJCSAgIGRhdGEtPnJlZ19udW0gJiAweDFmKTsKKwkJcmMgPSAwOwogCQlicmVhazsKIAogCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLwotCQlpZiAoIWdwLT5ydW5uaW5nKQotCQkJcmMgPSAtRUFHQUlOOwotCQllbHNlIHsKLQkJCV9fcGh5X3dyaXRlKGdwLCBkYXRhLT5waHlfaWQgJiAweDFmLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwKLQkJCQkgICAgZGF0YS0+dmFsX2luKTsKLQkJCXJjID0gMDsKLQkJfQorCQlfX3BoeV93cml0ZShncCwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsCisJCQkgICAgZGF0YS0+dmFsX2luKTsKKwkJcmMgPSAwOwogCQlicmVhazsKLQl9OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7Ci0JZ2VtX3B1dF9jZWxsKGdwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOwotCi0JbXV0ZXhfdW5sb2NrKCZncC0+cG1fbXV0ZXgpOwotCisJfQogCXJldHVybiByYzsKIH0KIApAQCAtMjkyMSwyMyArMjc5OCw5IEBACiAKIAkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAotCQkvKiBTdG9wIHRoZSBsaW5rIHRpbWVyICovCi0JCWRlbF90aW1lcl9zeW5jKCZncC0+bGlua190aW1lcik7Ci0KLQkJLyogV2Ugc2hvdWxkbid0IG5lZWQgYW55IGxvY2tpbmcgaGVyZSAqLwotCQlnZW1fZ2V0X2NlbGwoZ3ApOwotCi0JCS8qIENhbmNlbCByZXNldCB0YXNrICovCisJCS8qIEVuc3VyZSByZXNldCB0YXNrIGlzIHRydWVseSBnb25lICovCiAJCWNhbmNlbF93b3JrX3N5bmMoJmdwLT5yZXNldF90YXNrKTsKIAotCQkvKiBTaHV0IHRoZSBQSFkgZG93biAqLwotCQlnZW1fc3RvcF9waHkoZ3AsIDApOwotCi0JCWdlbV9wdXRfY2VsbChncCk7Ci0KLQkJLyogTWFrZSBzdXJlIGJ1cyBtYXN0ZXIgaXMgZGlzYWJsZWQgKi8KLQkJcGNpX2Rpc2FibGVfZGV2aWNlKGdwLT5wZGV2KTsKLQogCQkvKiBGcmVlIHJlc291cmNlcyAqLwogCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsCiAJCQkJICAgIHNpemVvZihzdHJ1Y3QgZ2VtX2luaXRfYmxvY2spLApAQCAtMzA0MywxMCArMjkwNiw2IEBACiAKIAlncC0+bXNnX2VuYWJsZSA9IERFRkFVTFRfTVNHOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmdwLT5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmZ3AtPnR4X2xvY2spOwotCW11dGV4X2luaXQoJmdwLT5wbV9tdXRleCk7Ci0KIAlpbml0X3RpbWVyKCZncC0+bGlua190aW1lcik7CiAJZ3AtPmxpbmtfdGltZXIuZnVuY3Rpb24gPSBnZW1fbGlua190aW1lcjsKIAlncC0+bGlua190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGdwOwpAQCAtMzEyMiwxNCArMjk4MSwxMSBAQAogCS8qIFNldCB0aGF0IG5vdywgaW4gY2FzZSBQTSBraWNrcyBpbiBub3cgKi8KIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAotCS8qIERldGVjdCAmIGluaXQgUEhZLCBzdGFydCBhdXRvbmVnLCB3ZSByZWxlYXNlIHRoZSBjZWxsIG5vdwotCSAqIHRvbywgaXQgd2lsbCBiZSBtYW5hZ2VkIGJ5IHdob2V2ZXIgbmVlZHMgaXQKLQkgKi8KLQlnZW1faW5pdF9waHkoZ3ApOwotCi0Jc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOwotCWdlbV9wdXRfY2VsbChncCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7CisJLyogV2UgY2FuIGRvIHNjYXR0ZXIvZ2F0aGVyIGFuZCBIVyBjaGVja3N1bSAqLworCWRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNOworCWRldi0+ZmVhdHVyZXMgfD0gZGV2LT5od19mZWF0dXJlcyB8IE5FVElGX0ZfUlhDU1VNOworCWlmIChwY2lfdXNpbmdfZGFjKQorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKIAogCS8qIFJlZ2lzdGVyIHdpdGgga2VybmVsICovCiAJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CkBAIC0zMTM4LDIwICsyOTk0LDE1IEBACiAJCWdvdG8gZXJyX291dF9mcmVlX2NvbnNpc3RlbnQ7CiAJfQogCisJLyogVW5kbyB0aGUgZ2V0X2NlbGwgd2l0aCBhcHByb3ByaWF0ZSBsb2NraW5nICh3ZSBjb3VsZCB1c2UKKwkgKiBuZG9faW5pdC91bmluaXQgYnV0IHRoYXQgd291bGQgYmUgZXZlbiBtb3JlIGNsdW1zeSBpbWhvKQorCSAqLworCXJ0bmxfbG9jaygpOworCWdlbV9wdXRfY2VsbChncCk7CisJcnRubF91bmxvY2soKTsKKwogCW5ldGRldl9pbmZvKGRldiwgIlN1biBHRU0gKFBDSSkgMTAvMTAwLzEwMDBCYXNlVCBFdGhlcm5ldCAlcE1cbiIsCiAJCSAgICBkZXYtPmRldl9hZGRyKTsKLQotCWlmIChncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMCB8fAotICAgICAJICAgIGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8xKQotCQluZXRkZXZfaW5mbyhkZXYsICJGb3VuZCAlcyBQSFlcbiIsCi0JCQkgICAgZ3AtPnBoeV9taWkuZGVmID8gZ3AtPnBoeV9taWkuZGVmLT5uYW1lIDogIm5vIik7Ci0KLQkvKiBHRU0gY2FuIGRvIGl0IGFsbC4uLiAqLwotCWRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNOwotCWRldi0+ZmVhdHVyZXMgfD0gZGV2LT5od19mZWF0dXJlcyB8IE5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9MTFRYOwotCWlmIChwY2lfdXNpbmdfZGFjKQotCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKLQogCXJldHVybiAwOwogCiBlcnJfb3V0X2ZyZWVfY29uc2lzdGVudDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbS5oIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmgKaW5kZXggZDIyNTA3Ny4uODM1Y2UxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZ2VtLmgKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmgKQEAgLTk3MywyMyArOTczLDE0IEBACiB9OwogCiBzdHJ1Y3QgZ2VtIHsKLQlzcGlubG9ja190CQlsb2NrOwotCXNwaW5sb2NrX3QJCXR4X2xvY2s7CiAJdm9pZCBfX2lvbWVtCQkqcmVnczsKIAlpbnQJCQlyeF9uZXcsIHJ4X29sZDsKIAlpbnQJCQl0eF9uZXcsIHR4X29sZDsKIAogCXVuc2lnbmVkIGludCBoYXNfd29sIDogMTsJLyogY2hpcCBzdXBwb3J0cyB3YWtlLW9uLWxhbiAqLwotCXVuc2lnbmVkIGludCBhc2xlZXAgOiAxOwkvKiBjaGlwIGFzbGVlcCwgcHJvdGVjdGVkIGJ5IHBtX211dGV4ICovCiAJdW5zaWduZWQgaW50IGFzbGVlcF93b2wgOiAxOwkvKiB3YXMgYXNsZWVwIHdpdGggV09MIGVuYWJsZWQgKi8KLQl1bnNpZ25lZCBpbnQgb3BlbmVkIDogMTsJLyogZHJpdmVyIG9wZW5lZCwgcHJvdGVjdGVkIGJ5IHBtX211dGV4ICovCi0JdW5zaWduZWQgaW50IHJ1bm5pbmcgOiAxOwkvKiBjaGlwIHJ1bm5pbmcsIHByb3RlY3RlZCBieSBsb2NrICovCiAKLQkvKiBjZWxsIGVuYWJsZSBjb3VudCwgcHJvdGVjdGVkIGJ5IGxvY2sgKi8KIAlpbnQJCQljZWxsX2VuYWJsZWQ7Ci0KLQlzdHJ1Y3QgbXV0ZXgJCXBtX211dGV4OwotCiAJdTMyCQkJbXNnX2VuYWJsZTsKIAl1MzIJCQlzdGF0dXM7CiAKQEAgLTEwMzMsMjAgKzEwMjQsNCBAQAogI2RlZmluZSBmb3VuZF9taWlfcGh5KGdwKSAoKGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8wIHx8IGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8xKSAmJiBcCiAJCQkgICBncC0+cGh5X21paS5kZWYgJiYgZ3AtPnBoeV9taWkuZGVmLT5vcHMpCiAKLSNkZWZpbmUgQUxJR05FRF9SWF9TS0JfQUREUihhZGRyKSBcCi0gICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShhZGRyKSArICg2NFVMIC0gMVVMKSkgJiB+KDY0VUwgLSAxVUwpKSAtICh1bnNpZ25lZCBsb25nKShhZGRyKSkKLXN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBza19idWZmICpnZW1fYWxsb2Nfc2tiKGludCBzaXplLAotCQkJCQkJZ2ZwX3QgZ2ZwX2ZsYWdzKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2Ioc2l6ZSArIDY0LCBnZnBfZmxhZ3MpOwotCi0JaWYgKHNrYikgewotCQlpbnQgb2Zmc2V0ID0gKGludCkgQUxJR05FRF9SWF9TS0JfQUREUihza2ItPmRhdGEpOwotCQlpZiAob2Zmc2V0KQotCQkJc2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpOwotCX0KLQotCXJldHVybiBza2I7Ci19Ci0KICNlbmRpZiAvKiBfU1VOR0VNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmhtZS5jIGIvZHJpdmVycy9uZXQvc3VuaG1lLmMKaW5kZXggMzBhYWQ1NC4uODU2ZTA1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuaG1lLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuaG1lLmMKQEAgLTE1MjQsMTcgKzE1MjQsMTEgQEAKIAl9IGVsc2UgaWYgKChocC0+ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA9PSAwKSB7CiAJCXUxNiBoYXNoX3RhYmxlWzRdOwogCQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCQljaGFyICphZGRyczsKIAkJdTMyIGNyYzsKIAogCQltZW1zZXQoaGFzaF90YWJsZSwgMCwgc2l6ZW9mKGhhc2hfdGFibGUpKTsKIAkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGhwLT5kZXYpIHsKLQkJCWFkZHJzID0gaGEtPmFkZHI7Ci0KLQkJCWlmICghKCphZGRycyAmIDEpKQotCQkJCWNvbnRpbnVlOwotCi0JCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGhhLT5hZGRyKTsKIAkJCWNyYyA+Pj0gMjY7CiAJCQloYXNoX3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOwogCQl9CkBAIC0yMzYxLDcgKzIzNTUsNiBAQAogCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9pZCBfX2lvbWVtICpicmVncyA9IGhwLT5iaWdtYWNyZWdzOwogCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7Ci0JY2hhciAqYWRkcnM7CiAJdTMyIGNyYzsKIAogCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKQEAgLTIzNzksMTIgKzIzNzIsNyBAQAogCiAJCW1lbXNldChoYXNoX3RhYmxlLCAwLCBzaXplb2YoaGFzaF90YWJsZSkpOwogCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7Ci0JCQlhZGRycyA9IGhhLT5hZGRyOwotCi0JCQlpZiAoISgqYWRkcnMgJiAxKSkKLQkJCQljb250aW51ZTsKLQotCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBoYS0+YWRkcik7CiAJCQljcmMgPj49IDI2OwogCQkJaGFzaF90YWJsZVtjcmMgPj4gNF0gfD0gMSA8PCAoY3JjICYgMHhmKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VubGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bmxhbmNlLmMKaW5kZXggMzJhNWM3Zi4uMDZmMmQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VubGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9zdW5sYW5jZS5jCkBAIC0xMTcwLDcgKzExNzAsNiBAQAogewogCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQljaGFyICphZGRyczsKIAl1MzIgY3JjOwogCXUzMiB2YWw7CiAKQEAgLTExOTUsMTIgKzExOTQsNyBAQAogCiAJLyogQWRkIGFkZHJlc3NlcyAqLwogCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKLQkJYWRkcnMgPSBoYS0+YWRkcjsKLQotCQkvKiBtdWx0aWNhc3QgYWRkcmVzcz8gKi8KLQkJaWYgKCEoKmFkZHJzICYgMSkpCi0JCQljb250aW51ZTsKLQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGhhLT5hZGRyKTsKIAkJY3JjID0gY3JjID4+IDI2OwogCQlpZiAobHAtPnBpb19idWZmZXIpIHsKIAkJCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIF9faW9tZW0gKmliID0gbHAtPmluaXRfYmxvY2tfaW9tZW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5xZS5jIGIvZHJpdmVycy9uZXQvc3VucWUuYwppbmRleCAxOGVjZGMzLi4yMDljN2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5xZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bnFlLmMKQEAgLTYyOCw3ICs2MjgsNiBAQAogCXN0cnVjdCBzdW5xZSAqcWVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwogCXU4IG5ld19tY29uZmlnID0gcWVwLT5tY29uZmlnOwotCWNoYXIgKmFkZHJzOwogCWludCBpOwogCXUzMiBjcmM7CiAKQEAgLTY1MSwxMSArNjUwLDcgQEAKIAogCQltZW1zZXQoaGFzaF90YWJsZSwgMCwgc2l6ZW9mKGhhc2hfdGFibGUpKTsKIAkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewotCQkJYWRkcnMgPSBoYS0+YWRkcjsKLQotCQkJaWYgKCEoKmFkZHJzICYgMSkpCi0JCQkJY29udGludWU7Ci0JCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGhhLT5hZGRyKTsKIAkJCWNyYyA+Pj0gMjY7CiAJCQloYXNoX3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZWh1dGkuYyBiL2RyaXZlcnMvbmV0L3RlaHV0aS5jCmluZGV4IDgwZmJlZTAuLjc0OWJiZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RlaHV0aS5jCisrKyBiL2RyaXZlcnMvbmV0L3RlaHV0aS5jCkBAIC03NDIsMjIgKzc0Miw2IEBACiAJX19iZHhfdmxhbl9yeF92aWQobmRldiwgdmlkLCAwKTsKIH0KIAotLyoKLSAqIGJkeF92bGFuX3J4X3JlZ2lzdGVyIC0ga2VybmVsIGhvb2sgZm9yIGFkZGluZyBWTEFOIGdyb3VwCi0gKiBAbmRldiBuZXR3b3JrIGRldmljZQotICogQGdycCAgVkxBTiBncm91cAotICovCi1zdGF0aWMgdm9pZAotYmR4X3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IGJkeF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0KLQlFTlRFUjsKLQlEQkcoImRldmljZT0nJXMnLCBncm91cD0nJXAnXG4iLCBuZGV2LT5uYW1lLCBncnApOwotCXByaXYtPnZsZ3JwID0gZ3JwOwotCVJFVCgpOwotfQotCiAvKioKICAqIGJkeF9jaGFuZ2VfbXR1IC0gQ2hhbmdlIHRoZSBNYXhpbXVtIFRyYW5zZmVyIFVuaXQKICAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTExNDYsMjEgKzExMzAsMTUgQEAKIAkgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJRU5URVI7Ci0JREJHKCJyeGRkLT5mbGFncy5iaXRzLnZ0YWc9JWQgdmxncnA9JXBcbiIsIEdFVF9SWERfVlRBRyhyeGRfdmFsMSksCi0JICAgIHByaXYtPnZsZ3JwKTsKLQlpZiAocHJpdi0+dmxncnAgJiYgR0VUX1JYRF9WVEFHKHJ4ZF92YWwxKSkgewotCQlEQkcoIiVzOiB2bGFuIHJjdiB2bGFuICcleCcgdnRhZyAnJXgnLCBkZXZpY2UgbmFtZSAnJXMnXG4iLAorCURCRygicnhkZC0+ZmxhZ3MuYml0cy52dGFnPSVkXG4iLCBHRVRfUlhEX1ZUQUcocnhkX3ZhbDEpKTsKKwlpZiAoR0VUX1JYRF9WVEFHKHJ4ZF92YWwxKSkgeworCQlEQkcoIiVzOiB2bGFuIHJjdiB2bGFuICcleCcgdnRhZyAnJXgnXG4iLAogCQkgICAgcHJpdi0+bmRldi0+bmFtZSwKIAkJICAgIEdFVF9SWERfVkxBTl9JRChyeGRfdmxhbiksCi0JCSAgICBHRVRfUlhEX1ZUQUcocnhkX3ZhbDEpLAotCQkgICAgdmxhbl9ncm91cF9nZXRfZGV2aWNlKHByaXYtPnZsZ3JwLAotCQkJCQkgIEdFVF9SWERfVkxBTl9JRChyeGRfdmxhbikpLT5uYW1lKTsKLQkJLyogTkFQSSB2YXJpYW50IG9mIHJlY2VpdmUgZnVuY3Rpb25zICovCi0JCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIHByaXYtPnZsZ3JwLAotCQkJCQkgR0VUX1JYRF9WTEFOX1RDSShyeGRfdmxhbikpOwotCX0gZWxzZSB7Ci0JCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCSAgICBHRVRfUlhEX1ZUQUcocnhkX3ZhbDEpKTsKKwkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIEdFVF9SWERfVkxBTl9UQ0kocnhkX3ZsYW4pKTsKIAl9CisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIH0KIAogc3RhdGljIHZvaWQgYmR4X3JlY3ljbGVfc2tiKHN0cnVjdCBiZHhfcHJpdiAqcHJpdiwgc3RydWN0IHJ4ZF9kZXNjICpyeGRkKQpAQCAtMTg3Nyw3ICsxODU1LDcgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiZHhfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4JIAk9IGJkeF9vcGVuLAorCS5uZG9fb3BlbgkJPSBiZHhfb3BlbiwKIAkubmRvX3N0b3AJCT0gYmR4X2Nsb3NlLAogCS5uZG9fc3RhcnRfeG1pdAkJPSBiZHhfdHhfdHJhbnNtaXQsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCkBAIC0xODg1LDcgKzE4NjMsNiBAQAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gYmR4X3NldG11bHRpLAogCS5uZG9fY2hhbmdlX210dQkJPSBiZHhfY2hhbmdlX210dSwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGJkeF9zZXRfbWFjLAotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IGJkeF92bGFuX3J4X3JlZ2lzdGVyLAogCS5uZG9fdmxhbl9yeF9hZGRfdmlkCT0gYmR4X3ZsYW5fcnhfYWRkX3ZpZCwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSBiZHhfdmxhbl9yeF9raWxsX3ZpZCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZWh1dGkuaCBiL2RyaXZlcnMvbmV0L3RlaHV0aS5oCmluZGV4IGM1NjQyZmUuLjcwOWViZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RlaHV0aS5oCisrKyBiL2RyaXZlcnMvbmV0L3RlaHV0aS5oCkBAIC0yNTAsNyArMjUwLDYgQEAKIAlzdHJ1Y3QgcnhmX2ZpZm8gcnhmX2ZpZm8wOwogCXN0cnVjdCByeGRiICpyeGRiOwkvKiByeCBkYnMgdG8gc3RvcmUgc2tiIHBvaW50ZXJzICovCiAJaW50IG5hcGlfc3RvcDsKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CiAKIAkvKiBUeCBGSUZPczogMSBmb3IgZGF0YSBkZXNjLCAxIGZvciBlbXB0eSAoYWNrcykgZGVzYyAqLwogCXN0cnVjdCB0eGRfZmlmbyB0eGRfZmlmbzA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuYyBiL2RyaXZlcnMvbmV0L3RnMy5jCmluZGV4IGExZjlmOWUuLjgwMzU3NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KQEAgLTEwNiw2ICsxMDcsOCBAQAogCSBORVRJRl9NU0dfUlhfRVJSCXwgXAogCSBORVRJRl9NU0dfVFhfRVJSKQogCisjZGVmaW5lIFRHM19HUkNfTENMQ1RMX1BXUlNXX0RFTEFZCTEwMAorCiAvKiBsZW5ndGggb2YgdGltZSBiZWZvcmUgd2UgZGVjaWRlIHRoZSBoYXJkd2FyZSBpcyBib3JrZWQsCiAgKiBhbmQgZGV2LT50eF90aW1lb3V0KCkgc2hvdWxkIGJlIGNhbGxlZCB0byBmaXggdGhlIHByb2JsZW0KICAqLwpAQCAtNjA1LDcgKzYwOCw3IEBACiBzdGF0aWMgdm9pZCB0ZzNfYXBlX2xvY2tfaW5pdChzdHJ1Y3QgdGczICp0cCkKIHsKIAlpbnQgaTsKLQl1MzIgcmVnYmFzZTsKKwl1MzIgcmVnYmFzZSwgYml0OwogCiAJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzYxKQogCQlyZWdiYXNlID0gVEczX0FQRV9MT0NLX0dSQU5UOwpAQCAtNjEzLDIwICs2MTYsMzQgQEAKIAkJcmVnYmFzZSA9IFRHM19BUEVfUEVSX0xPQ0tfR1JBTlQ7CiAKIAkvKiBNYWtlIHN1cmUgdGhlIGRyaXZlciBoYXNuJ3QgYW55IHN0YWxlIGxvY2tzLiAqLwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoaSA9PSBURzNfQVBFX0xPQ0tfR1BJTykKKwkJCWNvbnRpbnVlOwogCQl0ZzNfYXBlX3dyaXRlMzIodHAsIHJlZ2Jhc2UgKyA0ICogaSwgQVBFX0xPQ0tfR1JBTlRfRFJJVkVSKTsKKwl9CisKKwkvKiBDbGVhciB0aGUgY29ycmVjdCBiaXQgb2YgdGhlIEdQSU8gbG9jayB0b28uICovCisJaWYgKCF0cC0+cGNpX2ZuKQorCQliaXQgPSBBUEVfTE9DS19HUkFOVF9EUklWRVI7CisJZWxzZQorCQliaXQgPSAxIDw8IHRwLT5wY2lfZm47CisKKwl0ZzNfYXBlX3dyaXRlMzIodHAsIHJlZ2Jhc2UgKyA0ICogVEczX0FQRV9MT0NLX0dQSU8sIGJpdCk7CiB9CiAKIHN0YXRpYyBpbnQgdGczX2FwZV9sb2NrKHN0cnVjdCB0ZzMgKnRwLCBpbnQgbG9ja251bSkKIHsKIAlpbnQgaSwgb2ZmOwogCWludCByZXQgPSAwOwotCXUzMiBzdGF0dXMsIHJlcSwgZ250OworCXUzMiBzdGF0dXMsIHJlcSwgZ250LCBiaXQ7CiAKIAlpZiAoIXRnM19mbGFnKHRwLCBFTkFCTEVfQVBFKSkKIAkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKGxvY2tudW0pIHsKKwljYXNlIFRHM19BUEVfTE9DS19HUElPOgorCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NjEpCisJCQlyZXR1cm4gMDsKIAljYXNlIFRHM19BUEVfTE9DS19HUkM6CiAJY2FzZSBURzNfQVBFX0xPQ0tfTUVNOgogCQlicmVhazsKQEAgLTY0NCwyMSArNjYxLDI0IEBACiAKIAlvZmYgPSA0ICogbG9ja251bTsKIAotCXRnM19hcGVfd3JpdGUzMih0cCwgcmVxICsgb2ZmLCBBUEVfTE9DS19SRVFfRFJJVkVSKTsKKwlpZiAobG9ja251bSAhPSBURzNfQVBFX0xPQ0tfR1BJTyB8fCAhdHAtPnBjaV9mbikKKwkJYml0ID0gQVBFX0xPQ0tfUkVRX0RSSVZFUjsKKwllbHNlCisJCWJpdCA9IDEgPDwgdHAtPnBjaV9mbjsKKworCXRnM19hcGVfd3JpdGUzMih0cCwgcmVxICsgb2ZmLCBiaXQpOwogCiAJLyogV2FpdCBmb3IgdXAgdG8gMSBtaWxsaXNlY29uZCB0byBhY3F1aXJlIGxvY2suICovCiAJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCXN0YXR1cyA9IHRnM19hcGVfcmVhZDMyKHRwLCBnbnQgKyBvZmYpOwotCQlpZiAoc3RhdHVzID09IEFQRV9MT0NLX0dSQU5UX0RSSVZFUikKKwkJaWYgKHN0YXR1cyA9PSBiaXQpCiAJCQlicmVhazsKIAkJdWRlbGF5KDEwKTsKIAl9CiAKLQlpZiAoc3RhdHVzICE9IEFQRV9MT0NLX0dSQU5UX0RSSVZFUikgeworCWlmIChzdGF0dXMgIT0gYml0KSB7CiAJCS8qIFJldm9rZSB0aGUgbG9jayByZXF1ZXN0LiAqLwotCQl0ZzNfYXBlX3dyaXRlMzIodHAsIGdudCArIG9mZiwKLQkJCQlBUEVfTE9DS19HUkFOVF9EUklWRVIpOwotCisJCXRnM19hcGVfd3JpdGUzMih0cCwgZ250ICsgb2ZmLCBiaXQpOwogCQlyZXQgPSAtRUJVU1k7CiAJfQogCkBAIC02NjcsMTIgKzY4NywxNSBAQAogCiBzdGF0aWMgdm9pZCB0ZzNfYXBlX3VubG9jayhzdHJ1Y3QgdGczICp0cCwgaW50IGxvY2tudW0pCiB7Ci0JdTMyIGdudDsKKwl1MzIgZ250LCBiaXQ7CiAKIAlpZiAoIXRnM19mbGFnKHRwLCBFTkFCTEVfQVBFKSkKIAkJcmV0dXJuOwogCiAJc3dpdGNoIChsb2NrbnVtKSB7CisJY2FzZSBURzNfQVBFX0xPQ0tfR1BJTzoKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzYxKQorCQkJcmV0dXJuOwogCWNhc2UgVEczX0FQRV9MT0NLX0dSQzoKIAljYXNlIFRHM19BUEVfTE9DS19NRU06CiAJCWJyZWFrOwpAQCAtNjg1LDcgKzcwOCwxMiBAQAogCWVsc2UKIAkJZ250ID0gVEczX0FQRV9QRVJfTE9DS19HUkFOVDsKIAotCXRnM19hcGVfd3JpdGUzMih0cCwgZ250ICsgNCAqIGxvY2tudW0sIEFQRV9MT0NLX0dSQU5UX0RSSVZFUik7CisJaWYgKGxvY2tudW0gIT0gVEczX0FQRV9MT0NLX0dQSU8gfHwgIXRwLT5wY2lfZm4pCisJCWJpdCA9IEFQRV9MT0NLX0dSQU5UX0RSSVZFUjsKKwllbHNlCisJCWJpdCA9IDEgPDwgdHAtPnBjaV9mbjsKKworCXRnM19hcGVfd3JpdGUzMih0cCwgZ250ICsgNCAqIGxvY2tudW0sIGJpdCk7CiB9CiAKIHN0YXRpYyB2b2lkIHRnM19kaXNhYmxlX2ludHMoc3RydWN0IHRnMyAqdHApCkBAIC04NjAsNyArODg4LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKCh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19GRVQpICYmCi0JICAgIChyZWcgPT0gTUlJX1RHM19DVFJMIHx8IHJlZyA9PSBNSUlfVEczX0FVWF9DVFJMKSkKKwkgICAgKHJlZyA9PSBNSUlfQ1RSTDEwMDAgfHwgcmVnID09IE1JSV9URzNfQVVYX0NUUkwpKQogCQlyZXR1cm4gMDsKIAogCWlmICgodHAtPm1pX21vZGUgJiBNQUNfTUlfTU9ERV9BVVRPX1BPTEwpICE9IDApIHsKQEAgLTExNjcsNyArMTE5NSw3IEBACiAJaWYgKHRnM19mbGFnKHRwLCA1NzE3X1BMVVMpKSB7CiAJCXUzMiBpc19zZXJkZXM7CiAKLQkJdHAtPnBoeV9hZGRyID0gUENJX0ZVTkModHAtPnBkZXYtPmRldmZuKSArIDE7CisJCXRwLT5waHlfYWRkciA9IHRwLT5wY2lfZm4gKyAxOwogCiAJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcxN19BMCkKIAkJCWlzX3NlcmRlcyA9IHRyMzIoU0dfRElHX1NUQVRVUykgJiBTR19ESUdfSVNfU0VSREVTOwpAQCAtMTgzMCw2ICsxODU4LDEyIEBACiAJfQogCiAJaWYgKCF0cC0+c2V0bHBpY250KSB7CisJCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMSAmJgorCQkgICAhVEczX1BIWV9BVVhDVExfU01EU1BfRU5BQkxFKHRwKSkgeworCQkJdGczX3BoeWRzcF93cml0ZSh0cCwgTUlJX1RHM19EU1BfVEFQMjYsIDB4MDAwMCk7CisJCQlURzNfUEhZX0FVWENUTF9TTURTUF9ESVNBQkxFKHRwKTsKKwkJfQorCiAJCXZhbCA9IHRyMzIoVEczX0NQTVVfRUVFX01PREUpOwogCQl0dzMyKFRHM19DUE1VX0VFRV9NT0RFLCB2YWwgJiB+VEczX0NQTVVfRUVFTURfTFBJX0VOQUJMRSk7CiAJfQpAQCAtMTg0NCw3ICsxODc4LDkgQEAKIAkgICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE5IHx8CiAJICAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjUpICYmCiAJICAgICFURzNfUEhZX0FVWENUTF9TTURTUF9FTkFCTEUodHApKSB7Ci0JCXRnM19waHlkc3Bfd3JpdGUodHAsIE1JSV9URzNfRFNQX1RBUDI2LCAweDAwMDMpOworCQl2YWwgPSBNSUlfVEczX0RTUF9UQVAyNl9BTE5PS08gfAorCQkgICAgICBNSUlfVEczX0RTUF9UQVAyNl9STVJYU1RPOworCQl0ZzNfcGh5ZHNwX3dyaXRlKHRwLCBNSUlfVEczX0RTUF9UQVAyNiwgdmFsKTsKIAkJVEczX1BIWV9BVVhDVExfU01EU1BfRElTQUJMRSh0cCk7CiAJfQogCkBAIC0xOTgwLDE1ICsyMDE2LDE0IEBACiAKIAkJLyogU2V0IGZ1bGwtZHVwbGV4LCAxMDAwIG1icHMuICAqLwogCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLAotCQkJICAgICBCTUNSX0ZVTExEUExYIHwgVEczX0JNQ1JfU1BFRUQxMDAwKTsKKwkJCSAgICAgQk1DUl9GVUxMRFBMWCB8IEJNQ1JfU1BFRUQxMDAwKTsKIAogCQkvKiBTZXQgdG8gbWFzdGVyIG1vZGUuICAqLwotCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9URzNfQ1RSTCwgJnBoeTlfb3JpZykpCisJCWlmICh0ZzNfcmVhZHBoeSh0cCwgTUlJX0NUUkwxMDAwLCAmcGh5OV9vcmlnKSkKIAkJCWNvbnRpbnVlOwogCi0JCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLAotCQkJICAgICAoTUlJX1RHM19DVFJMX0FTX01BU1RFUiB8Ci0JCQkgICAgICBNSUlfVEczX0NUUkxfRU5BQkxFX0FTX01BU1RFUikpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9DVFJMMTAwMCwKKwkJCSAgICAgQ1RMMTAwMF9BU19NQVNURVIgfCBDVEwxMDAwX0VOQUJMRV9NQVNURVIpOwogCiAJCWVyciA9IFRHM19QSFlfQVVYQ1RMX1NNRFNQX0VOQUJMRSh0cCk7CiAJCWlmIChlcnIpCkBAIC0yMDEzLDcgKzIwNDgsNyBAQAogCiAJVEczX1BIWV9BVVhDVExfU01EU1BfRElTQUJMRSh0cCk7CiAKLQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwgcGh5OV9vcmlnKTsKKwl0ZzNfd3JpdGVwaHkodHAsIE1JSV9DVFJMMTAwMCwgcGh5OV9vcmlnKTsKIAogCWlmICghdGczX3JlYWRwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsICZyZWczMikpIHsKIAkJcmVnMzIgJj0gfjB4MzAwMDsKQEAgLTIxNjUsMjEgKzIyMDAsMjE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHRnM19mcm9iX2F1eF9wb3dlcihzdHJ1Y3QgdGczICp0cCkKKyNkZWZpbmUgVEczX0dQSU9fTVNHX0RSVlJfUFJFUwkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgVEczX0dQSU9fTVNHX05FRURfVkFVWAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgVEczX0dQSU9fTVNHX01BU0sJCSAoVEczX0dQSU9fTVNHX0RSVlJfUFJFUyB8IFwKKwkJCQkJICBURzNfR1BJT19NU0dfTkVFRF9WQVVYKQorI2RlZmluZSBURzNfR1BJT19NU0dfQUxMX0RSVlJfUFJFU19NQVNLIFwKKwkoKFRHM19HUElPX01TR19EUlZSX1BSRVMgPDwgMCkgfCBcCisJIChURzNfR1BJT19NU0dfRFJWUl9QUkVTIDw8IDQpIHwgXAorCSAoVEczX0dQSU9fTVNHX0RSVlJfUFJFUyA8PCA4KSB8IFwKKwkgKFRHM19HUElPX01TR19EUlZSX1BSRVMgPDwgMTIpKQorCisjZGVmaW5lIFRHM19HUElPX01TR19BTExfTkVFRF9WQVVYX01BU0sgXAorCSgoVEczX0dQSU9fTVNHX05FRURfVkFVWCA8PCAwKSB8IFwKKwkgKFRHM19HUElPX01TR19ORUVEX1ZBVVggPDwgNCkgfCBcCisJIChURzNfR1BJT19NU0dfTkVFRF9WQVVYIDw8IDgpIHwgXAorCSAoVEczX0dQSU9fTVNHX05FRURfVkFVWCA8PCAxMikpCisKK3N0YXRpYyBpbmxpbmUgdTMyIHRnM19zZXRfZnVuY3Rpb25fc3RhdHVzKHN0cnVjdCB0ZzMgKnRwLCB1MzIgbmV3c3RhdCkKK3sKKwl1MzIgc3RhdHVzLCBzaGlmdDsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSkKKwkJc3RhdHVzID0gdGczX2FwZV9yZWFkMzIodHAsIFRHM19BUEVfR1BJT19NU0cpOworCWVsc2UKKwkJc3RhdHVzID0gdHIzMihURzNfQ1BNVV9EUlZfU1RBVFVTKTsKKworCXNoaWZ0ID0gVEczX0FQRV9HUElPX01TR19TSElGVCArIDQgKiB0cC0+cGNpX2ZuOworCXN0YXR1cyAmPSB+KFRHM19HUElPX01TR19NQVNLIDw8IHNoaWZ0KTsKKwlzdGF0dXMgfD0gKG5ld3N0YXQgPDwgc2hpZnQpOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3IHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE5KQorCQl0ZzNfYXBlX3dyaXRlMzIodHAsIFRHM19BUEVfR1BJT19NU0csIHN0YXR1cyk7CisJZWxzZQorCQl0dzMyKFRHM19DUE1VX0RSVl9TVEFUVVMsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzID4+IFRHM19BUEVfR1BJT19NU0dfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRnM19wd3JzcmNfc3dpdGNoX3RvX3ZtYWluKHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICghdGczX2ZsYWcodHAsIElTX05JQykpCisJCXJldHVybiAwOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3IHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE5IHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzIwKSB7CisJCWlmICh0ZzNfYXBlX2xvY2sodHAsIFRHM19BUEVfTE9DS19HUElPKSkKKwkJCXJldHVybiAtRUlPOworCisJCXRnM19zZXRfZnVuY3Rpb25fc3RhdHVzKHRwLCBURzNfR1BJT19NU0dfRFJWUl9QUkVTKTsKKworCQl0dzMyX3dhaXRfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsLAorCQkJICAgIFRHM19HUkNfTENMQ1RMX1BXUlNXX0RFTEFZKTsKKworCQl0ZzNfYXBlX3VubG9jayh0cCwgVEczX0FQRV9MT0NLX0dQSU8pOworCX0gZWxzZSB7CisJCXR3MzJfd2FpdF9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwsCisJCQkgICAgVEczX0dSQ19MQ0xDVExfUFdSU1dfREVMQVkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZzNfcHdyc3JjX2RpZV93aXRoX3ZtYWluKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBncmNfbG9jYWxfY3RybDsKKworCWlmICghdGczX2ZsYWcodHAsIElTX05JQykgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDAgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpCisJCXJldHVybjsKKworCWdyY19sb2NhbF9jdHJsID0gdHAtPmdyY19sb2NhbF9jdHJsIHwgR1JDX0xDTENUUkxfR1BJT19PRTE7CisKKwl0dzMyX3dhaXRfZihHUkNfTE9DQUxfQ1RSTCwKKwkJICAgIGdyY19sb2NhbF9jdHJsIHwgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxLAorCQkgICAgVEczX0dSQ19MQ0xDVExfUFdSU1dfREVMQVkpOworCisJdHczMl93YWl0X2YoR1JDX0xPQ0FMX0NUUkwsCisJCSAgICBncmNfbG9jYWxfY3RybCwKKwkJICAgIFRHM19HUkNfTENMQ1RMX1BXUlNXX0RFTEFZKTsKKworCXR3MzJfd2FpdF9mKEdSQ19MT0NBTF9DVFJMLAorCQkgICAgZ3JjX2xvY2FsX2N0cmwgfCBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEsCisJCSAgICBURzNfR1JDX0xDTENUTF9QV1JTV19ERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19wd3JzcmNfc3dpdGNoX3RvX3ZhdXgoc3RydWN0IHRnMyAqdHApCit7CisJaWYgKCF0ZzNfZmxhZyh0cCwgSVNfTklDKSkKKwkJcmV0dXJuOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxKSB7CisJCXR3MzJfd2FpdF9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAorCQkJICAgIChHUkNfTENMQ1RSTF9HUElPX09FMCB8CisJCQkgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT0UxIHwKKwkJCSAgICAgR1JDX0xDTENUUkxfR1BJT19PRTIgfAorCQkJICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDAgfAorCQkJICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEpLAorCQkJICAgIFRHM19HUkNfTENMQ1RMX1BXUlNXX0RFTEFZKTsKKwl9IGVsc2UgaWYgKHRwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9USUdPTjNfNTc2MSB8fAorCQkgICB0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3NjFTKSB7CisJCS8qIFRoZSA1NzYxIG5vbi1lIGRldmljZSBzd2FwcyBHUElPIDAgYW5kIEdQSU8gMi4gKi8KKwkJdTMyIGdyY19sb2NhbF9jdHJsID0gR1JDX0xDTENUUkxfR1BJT19PRTAgfAorCQkJCSAgICAgR1JDX0xDTENUUkxfR1BJT19PRTEgfAorCQkJCSAgICAgR1JDX0xDTENUUkxfR1BJT19PRTIgfAorCQkJCSAgICAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQwIHwKKwkJCQkgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMSB8CisJCQkJICAgICB0cC0+Z3JjX2xvY2FsX2N0cmw7CisJCXR3MzJfd2FpdF9mKEdSQ19MT0NBTF9DVFJMLCBncmNfbG9jYWxfY3RybCwKKwkJCSAgICBURzNfR1JDX0xDTENUTF9QV1JTV19ERUxBWSk7CisKKwkJZ3JjX2xvY2FsX2N0cmwgfD0gR1JDX0xDTENUUkxfR1BJT19PVVRQVVQyOworCQl0dzMyX3dhaXRfZihHUkNfTE9DQUxfQ1RSTCwgZ3JjX2xvY2FsX2N0cmwsCisJCQkgICAgVEczX0dSQ19MQ0xDVExfUFdSU1dfREVMQVkpOworCisJCWdyY19sb2NhbF9jdHJsICY9IH5HUkNfTENMQ1RSTF9HUElPX09VVFBVVDA7CisJCXR3MzJfd2FpdF9mKEdSQ19MT0NBTF9DVFJMLCBncmNfbG9jYWxfY3RybCwKKwkJCSAgICBURzNfR1JDX0xDTENUTF9QV1JTV19ERUxBWSk7CisJfSBlbHNlIHsKKwkJdTMyIG5vX2dwaW8yOworCQl1MzIgZ3JjX2xvY2FsX2N0cmwgPSAwOworCisJCS8qIFdvcmthcm91bmQgdG8gcHJldmVudCBvdmVyZHJhd2luZyBBbXBzLiAqLworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTQpIHsKKwkJCWdyY19sb2NhbF9jdHJsIHw9IEdSQ19MQ0xDVFJMX0dQSU9fT0UzOworCQkJdHczMl93YWl0X2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkJICAgIGdyY19sb2NhbF9jdHJsLAorCQkJCSAgICBURzNfR1JDX0xDTENUTF9QV1JTV19ERUxBWSk7CisJCX0KKworCQkvKiBPbiA1NzUzIGFuZCB2YXJpYW50cywgR1BJTzIgY2Fubm90IGJlIHVzZWQuICovCisJCW5vX2dwaW8yID0gdHAtPm5pY19zcmFtX2RhdGFfY2ZnICYKKwkJCSAgIE5JQ19TUkFNX0RBVEFfQ0ZHX05PX0dQSU8yOworCisJCWdyY19sb2NhbF9jdHJsIHw9IEdSQ19MQ0xDVFJMX0dQSU9fT0UwIHwKKwkJCQkgIEdSQ19MQ0xDVFJMX0dQSU9fT0UxIHwKKwkJCQkgIEdSQ19MQ0xDVFJMX0dQSU9fT0UyIHwKKwkJCQkgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMSB8CisJCQkJICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDI7CisJCWlmIChub19ncGlvMikgeworCQkJZ3JjX2xvY2FsX2N0cmwgJj0gfihHUkNfTENMQ1RSTF9HUElPX09FMiB8CisJCQkJCSAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDIpOworCQl9CisJCXR3MzJfd2FpdF9mKEdSQ19MT0NBTF9DVFJMLAorCQkJICAgIHRwLT5ncmNfbG9jYWxfY3RybCB8IGdyY19sb2NhbF9jdHJsLAorCQkJICAgIFRHM19HUkNfTENMQ1RMX1BXUlNXX0RFTEFZKTsKKworCQlncmNfbG9jYWxfY3RybCB8PSBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDA7CisKKwkJdHczMl93YWl0X2YoR1JDX0xPQ0FMX0NUUkwsCisJCQkgICAgdHAtPmdyY19sb2NhbF9jdHJsIHwgZ3JjX2xvY2FsX2N0cmwsCisJCQkgICAgVEczX0dSQ19MQ0xDVExfUFdSU1dfREVMQVkpOworCisJCWlmICghbm9fZ3BpbzIpIHsKKwkJCWdyY19sb2NhbF9jdHJsICY9IH5HUkNfTENMQ1RSTF9HUElPX09VVFBVVDI7CisJCQl0dzMyX3dhaXRfZihHUkNfTE9DQUxfQ1RSTCwKKwkJCQkgICAgdHAtPmdyY19sb2NhbF9jdHJsIHwgZ3JjX2xvY2FsX2N0cmwsCisJCQkJICAgIFRHM19HUkNfTENMQ1RMX1BXUlNXX0RFTEFZKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdGczX2Zyb2JfYXV4X3Bvd2VyXzU3MTcoc3RydWN0IHRnMyAqdHAsIGJvb2wgd29sX2VuYWJsZSkKK3sKKwl1MzIgbXNnID0gMDsKKworCS8qIFNlcmlhbGl6ZSBwb3dlciBzdGF0ZSB0cmFuc2l0aW9ucyAqLworCWlmICh0ZzNfYXBlX2xvY2sodHAsIFRHM19BUEVfTE9DS19HUElPKSkKKwkJcmV0dXJuOworCisJaWYgKHRnM19mbGFnKHRwLCBFTkFCTEVfQVNGKSB8fCB0ZzNfZmxhZyh0cCwgRU5BQkxFX0FQRSkgfHwgd29sX2VuYWJsZSkKKwkJbXNnID0gVEczX0dQSU9fTVNHX05FRURfVkFVWDsKKworCW1zZyA9IHRnM19zZXRfZnVuY3Rpb25fc3RhdHVzKHRwLCBtc2cpOworCisJaWYgKG1zZyAmIFRHM19HUElPX01TR19BTExfRFJWUl9QUkVTX01BU0spCisJCWdvdG8gZG9uZTsKKworCWlmIChtc2cgJiBURzNfR1BJT19NU0dfQUxMX05FRURfVkFVWF9NQVNLKQorCQl0ZzNfcHdyc3JjX3N3aXRjaF90b192YXV4KHRwKTsKKwllbHNlCisJCXRnM19wd3JzcmNfZGllX3dpdGhfdm1haW4odHApOworCitkb25lOgorCXRnM19hcGVfdW5sb2NrKHRwLCBURzNfQVBFX0xPQ0tfR1BJTyk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19mcm9iX2F1eF9wb3dlcihzdHJ1Y3QgdGczICp0cCwgYm9vbCBpbmNsdWRlX3dvbCkKIHsKIAlib29sIG5lZWRfdmF1eCA9IGZhbHNlOwogCiAJLyogVGhlIEdQSU9zIGRvIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBvbiA1Nzc2NS4gKi8KIAlpZiAoIXRnM19mbGFnKHRwLCBJU19OSUMpIHx8Ci0JICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE5IHx8CiAJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkKIAkJcmV0dXJuOwogCi0JaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCB8fAotCSAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTQgfHwKLQkgICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3IHx8Ci0JICAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcyMCkgJiYKLQkgICAgdHAtPnBkZXZfcGVlciAhPSB0cC0+cGRldikgeworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcyMCkgeworCQl0ZzNfZnJvYl9hdXhfcG93ZXJfNTcxNyh0cCwgaW5jbHVkZV93b2wgPworCQkJCQl0ZzNfZmxhZyh0cCwgV09MX0VOQUJMRSkgIT0gMCA6IDApOworCQlyZXR1cm47CisJfQorCisJaWYgKHRwLT5wZGV2X3BlZXIgJiYgdHAtPnBkZXZfcGVlciAhPSB0cC0+cGRldikgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3BlZXI7CiAKIAkJZGV2X3BlZXIgPSBwY2lfZ2V0X2RydmRhdGEodHAtPnBkZXZfcGVlcik7CkBAIC0yMTkxLDk1ICsyNDE5LDIwIEBACiAJCQlpZiAodGczX2ZsYWcodHBfcGVlciwgSU5JVF9DT01QTEVURSkpCiAJCQkJcmV0dXJuOwogCi0JCQlpZiAodGczX2ZsYWcodHBfcGVlciwgV09MX0VOQUJMRSkgfHwKKwkJCWlmICgoaW5jbHVkZV93b2wgJiYgdGczX2ZsYWcodHBfcGVlciwgV09MX0VOQUJMRSkpIHx8CiAJCQkgICAgdGczX2ZsYWcodHBfcGVlciwgRU5BQkxFX0FTRikpCiAJCQkJbmVlZF92YXV4ID0gdHJ1ZTsKIAkJfQogCX0KIAotCWlmICh0ZzNfZmxhZyh0cCwgV09MX0VOQUJMRSkgfHwgdGczX2ZsYWcodHAsIEVOQUJMRV9BU0YpKQorCWlmICgoaW5jbHVkZV93b2wgJiYgdGczX2ZsYWcodHAsIFdPTF9FTkFCTEUpKSB8fAorCSAgICB0ZzNfZmxhZyh0cCwgRU5BQkxFX0FTRikpCiAJCW5lZWRfdmF1eCA9IHRydWU7CiAKLQlpZiAobmVlZF92YXV4KSB7Ci0JCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAotCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpIHsKLQkJCXR3MzJfd2FpdF9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAotCQkJCSAgICAoR1JDX0xDTENUUkxfR1BJT19PRTAgfAotCQkJCSAgICAgR1JDX0xDTENUUkxfR1BJT19PRTEgfAotCQkJCSAgICAgR1JDX0xDTENUUkxfR1BJT19PRTIgfAotCQkJCSAgICAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQwIHwKLQkJCQkgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMSksCi0JCQkJICAgIDEwMCk7Ci0JCX0gZWxzZSBpZiAodHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzYxIHx8Ci0JCQkgICB0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3NjFTKSB7Ci0JCQkvKiBUaGUgNTc2MSBub24tZSBkZXZpY2Ugc3dhcHMgR1BJTyAwIGFuZCBHUElPIDIuICovCi0JCQl1MzIgZ3JjX2xvY2FsX2N0cmwgPSBHUkNfTENMQ1RSTF9HUElPX09FMCB8Ci0JCQkJCSAgICAgR1JDX0xDTENUUkxfR1BJT19PRTEgfAotCQkJCQkgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT0UyIHwKLQkJCQkJICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDAgfAotCQkJCQkgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMSB8Ci0JCQkJCSAgICAgdHAtPmdyY19sb2NhbF9jdHJsOwotCQkJdHczMl93YWl0X2YoR1JDX0xPQ0FMX0NUUkwsIGdyY19sb2NhbF9jdHJsLCAxMDApOwotCi0JCQlncmNfbG9jYWxfY3RybCB8PSBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDI7Ci0JCQl0dzMyX3dhaXRfZihHUkNfTE9DQUxfQ1RSTCwgZ3JjX2xvY2FsX2N0cmwsIDEwMCk7Ci0KLQkJCWdyY19sb2NhbF9jdHJsICY9IH5HUkNfTENMQ1RSTF9HUElPX09VVFBVVDA7Ci0JCQl0dzMyX3dhaXRfZihHUkNfTE9DQUxfQ1RSTCwgZ3JjX2xvY2FsX2N0cmwsIDEwMCk7Ci0JCX0gZWxzZSB7Ci0JCQl1MzIgbm9fZ3BpbzI7Ci0JCQl1MzIgZ3JjX2xvY2FsX2N0cmwgPSAwOwotCi0JCQkvKiBXb3JrYXJvdW5kIHRvIHByZXZlbnQgb3ZlcmRyYXdpbmcgQW1wcy4gKi8KLQkJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0KLQkJCSAgICBBU0lDX1JFVl81NzE0KSB7Ci0JCQkJZ3JjX2xvY2FsX2N0cmwgfD0gR1JDX0xDTENUUkxfR1BJT19PRTM7Ci0JCQkJdHczMl93YWl0X2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8Ci0JCQkJCSAgICBncmNfbG9jYWxfY3RybCwgMTAwKTsKLQkJCX0KLQotCQkJLyogT24gNTc1MyBhbmQgdmFyaWFudHMsIEdQSU8yIGNhbm5vdCBiZSB1c2VkLiAqLwotCQkJbm9fZ3BpbzIgPSB0cC0+bmljX3NyYW1fZGF0YV9jZmcgJgotCQkJCSAgICBOSUNfU1JBTV9EQVRBX0NGR19OT19HUElPMjsKLQotCQkJZ3JjX2xvY2FsX2N0cmwgfD0gR1JDX0xDTENUUkxfR1BJT19PRTAgfAotCQkJCQkgR1JDX0xDTENUUkxfR1BJT19PRTEgfAotCQkJCQkgR1JDX0xDTENUUkxfR1BJT19PRTIgfAotCQkJCQkgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxIHwKLQkJCQkJIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMjsKLQkJCWlmIChub19ncGlvMikgewotCQkJCWdyY19sb2NhbF9jdHJsICY9IH4oR1JDX0xDTENUUkxfR1BJT19PRTIgfAotCQkJCQkJICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMik7Ci0JCQl9Ci0JCQl0dzMyX3dhaXRfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsIHwKLQkJCQkJCSAgICBncmNfbG9jYWxfY3RybCwgMTAwKTsKLQotCQkJZ3JjX2xvY2FsX2N0cmwgfD0gR1JDX0xDTENUUkxfR1BJT19PVVRQVVQwOwotCi0JCQl0dzMyX3dhaXRfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsIHwKLQkJCQkJCSAgICBncmNfbG9jYWxfY3RybCwgMTAwKTsKLQotCQkJaWYgKCFub19ncGlvMikgewotCQkJCWdyY19sb2NhbF9jdHJsICY9IH5HUkNfTENMQ1RSTF9HUElPX09VVFBVVDI7Ci0JCQkJdHczMl93YWl0X2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8Ci0JCQkJCSAgICBncmNfbG9jYWxfY3RybCwgMTAwKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMCAmJgotCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDEpIHsKLQkJCXR3MzJfd2FpdF9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAotCQkJCSAgICAoR1JDX0xDTENUUkxfR1BJT19PRTEgfAotCQkJCSAgICAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxKSwgMTAwKTsKLQotCQkJdHczMl93YWl0X2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8Ci0JCQkJICAgIEdSQ19MQ0xDVFJMX0dQSU9fT0UxLCAxMDApOwotCi0JCQl0dzMyX3dhaXRfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsIHwKLQkJCQkgICAgKEdSQ19MQ0xDVFJMX0dQSU9fT0UxIHwKLQkJCQkgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMSksIDEwMCk7Ci0JCX0KLQl9CisJaWYgKG5lZWRfdmF1eCkKKwkJdGczX3B3cnNyY19zd2l0Y2hfdG9fdmF1eCh0cCk7CisJZWxzZQorCQl0ZzNfcHdyc3JjX2RpZV93aXRoX3ZtYWluKHRwKTsKIH0KIAogc3RhdGljIGludCB0ZzNfNTcwMF9saW5rX3BvbGFyaXR5KHN0cnVjdCB0ZzMgKnRwLCB1MzIgc3BlZWQpCkBAIC0yNjE5LDE1ICsyNzcyLDE5IEBACiAKIHN0YXRpYyBpbnQgdGczX3Bvd2VyX3VwKHN0cnVjdCB0ZzMgKnRwKQogeworCWludCBlcnI7CisKIAl0ZzNfZW5hYmxlX3JlZ2lzdGVyX2FjY2Vzcyh0cCk7CiAKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHRwLT5wZGV2LCBQQ0lfRDApOworCWVyciA9IHBjaV9zZXRfcG93ZXJfc3RhdGUodHAtPnBkZXYsIFBDSV9EMCk7CisJaWYgKCFlcnIpIHsKKwkJLyogU3dpdGNoIG91dCBvZiBWYXV4IGlmIGl0IGlzIGEgTklDICovCisJCXRnM19wd3JzcmNfc3dpdGNoX3RvX3ZtYWluKHRwKTsKKwl9IGVsc2UgeworCQluZXRkZXZfZXJyKHRwLT5kZXYsICJUcmFuc2l0aW9uIHRvIEQwIGZhaWxlZFxuIik7CisJfQogCi0JLyogU3dpdGNoIG91dCBvZiBWYXV4IGlmIGl0IGlzIGEgTklDICovCi0JaWYgKHRnM19mbGFnKHRwLCBJU19OSUMpKQotCQl0dzMyX3dhaXRfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsLCAxMDApOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCB0ZzNfcG93ZXJfZG93bl9wcmVwYXJlKHN0cnVjdCB0ZzMgKnRwKQpAQCAtMjY0MiwxMSArMjc5OSwxMSBAQAogCQl1MTYgbG5rY3RsOwogCiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LAotCQkJCSAgICAgdHAtPnBjaWVfY2FwICsgUENJX0VYUF9MTktDVEwsCisJCQkJICAgICBwY2lfcGNpZV9jYXAodHAtPnBkZXYpICsgUENJX0VYUF9MTktDVEwsCiAJCQkJICAgICAmbG5rY3RsKTsKIAkJbG5rY3RsIHw9IFBDSV9FWFBfTE5LQ1RMX0NMS1JFUV9FTjsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRwLT5wZGV2LAotCQkJCSAgICAgIHRwLT5wY2llX2NhcCArIFBDSV9FWFBfTE5LQ1RMLAorCQkJCSAgICAgIHBjaV9wY2llX2NhcCh0cC0+cGRldikgKyBQQ0lfRVhQX0xOS0NUTCwKIAkJCQkgICAgICBsbmtjdGwpOwogCX0KIApAQCAtMjg1Miw3ICszMDA5LDcgQEAKIAlpZiAoIShkZXZpY2Vfc2hvdWxkX3dha2UpICYmICF0ZzNfZmxhZyh0cCwgRU5BQkxFX0FTRikpCiAJCXRnM19wb3dlcl9kb3duX3BoeSh0cCwgZG9fbG93X3Bvd2VyKTsKIAotCXRnM19mcm9iX2F1eF9wb3dlcih0cCk7CisJdGczX2Zyb2JfYXV4X3Bvd2VyKHRwLCB0cnVlKTsKIAogCS8qIFdvcmthcm91bmQgZm9yIHVuc3RhYmxlIFBMTCBjbG9jayAqLwogCWlmICgoR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IENISVBSRVZfNTc1MF9BWCkgfHwKQEAgLTI5NTcsMTYgKzMxMTQsMTUgQEAKIAogCW5ld19hZHYgPSAwOwogCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQotCQluZXdfYWR2IHw9IE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGOworCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMDAwSEFMRjsKIAlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKLQkJbmV3X2FkdiB8PSBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTDsKKwkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTAwMEZVTEw7CiAKIAlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQTAgfHwKIAkgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQjApCi0JCW5ld19hZHYgfD0gKE1JSV9URzNfQ1RSTF9BU19NQVNURVIgfAotCQkJICAgIE1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSKTsKKwkJbmV3X2FkdiB8PSBDVEwxMDAwX0FTX01BU1RFUiB8IENUTDEwMDBfRU5BQkxFX01BU1RFUjsKIAotCWVyciA9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCBuZXdfYWR2KTsKKwllcnIgPSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9DVFJMMTAwMCwgbmV3X2Fkdik7CiAJaWYgKGVycikKIAkJZ290byBkb25lOwogCkBAIC0yOTgwLDIwICszMTM2LDYgQEAKIAlpZiAoIWVycikgewogCQl1MzIgZXJyMjsKIAotCQlzd2l0Y2ggKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSkgewotCQljYXNlIEFTSUNfUkVWXzU3MTc6Ci0JCWNhc2UgQVNJQ19SRVZfNTc3NjU6Ci0JCQlpZiAoIXRnM19waHlkc3BfcmVhZCh0cCwgTUlJX1RHM19EU1BfQ0gzNFRQMiwgJnZhbCkpCi0JCQkJdGczX3BoeWRzcF93cml0ZSh0cCwgTUlJX1RHM19EU1BfQ0gzNFRQMiwgdmFsIHwKLQkJCQkJCSBNSUlfVEczX0RTUF9DSDM0VFAyX0hJQlcwMSk7Ci0JCQkvKiBGYWxsIHRocm91Z2ggKi8KLQkJY2FzZSBBU0lDX1JFVl81NzE5OgotCQkJdmFsID0gTUlJX1RHM19EU1BfVEFQMjZfQUxOT0tPIHwKLQkJCSAgICAgIE1JSV9URzNfRFNQX1RBUDI2X1JNUlhTVE8gfAotCQkJICAgICAgTUlJX1RHM19EU1BfVEFQMjZfT1BDU0lOUFQ7Ci0JCQl0ZzNfcGh5ZHNwX3dyaXRlKHRwLCBNSUlfVEczX0RTUF9UQVAyNiwgdmFsKTsKLQkJfQotCiAJCXZhbCA9IDA7CiAJCS8qIEFkdmVydGlzZSAxMDAtQmFzZVRYIEVFRSBhYmlsaXR5ICovCiAJCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCkBAIC0zMDAyLDYgKzMxNDQsMjUgQEAKIAkJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCiAJCQl2YWwgfD0gTURJT19BTl9FRUVfQURWXzEwMDBUOwogCQllcnIgPSB0ZzNfcGh5X2NsNDVfd3JpdGUodHAsIE1ESU9fTU1EX0FOLCBNRElPX0FOX0VFRV9BRFYsIHZhbCk7CisJCWlmIChlcnIpCisJCQl2YWwgPSAwOworCisJCXN3aXRjaCAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpKSB7CisJCWNhc2UgQVNJQ19SRVZfNTcxNzoKKwkJY2FzZSBBU0lDX1JFVl81Nzc2NToKKwkJY2FzZSBBU0lDX1JFVl81NzE5OgorCQkJLyogSWYgd2UgYWR2ZXJ0aXNlZCBhbnkgZWVlIGFkdmVydGlzZW1lbnRzIGFib3ZlLi4uICovCisJCQlpZiAodmFsKQorCQkJCXZhbCA9IE1JSV9URzNfRFNQX1RBUDI2X0FMTk9LTyB8CisJCQkJICAgICAgTUlJX1RHM19EU1BfVEFQMjZfUk1SWFNUTyB8CisJCQkJICAgICAgTUlJX1RHM19EU1BfVEFQMjZfT1BDU0lOUFQ7CisJCQl0ZzNfcGh5ZHNwX3dyaXRlKHRwLCBNSUlfVEczX0RTUF9UQVAyNiwgdmFsKTsKKwkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQljYXNlIEFTSUNfUkVWXzU3MjA6CisJCQlpZiAoIXRnM19waHlkc3BfcmVhZCh0cCwgTUlJX1RHM19EU1BfQ0gzNFRQMiwgJnZhbCkpCisJCQkJdGczX3BoeWRzcF93cml0ZSh0cCwgTUlJX1RHM19EU1BfQ0gzNFRQMiwgdmFsIHwKKwkJCQkJCSBNSUlfVEczX0RTUF9DSDM0VFAyX0hJQlcwMSk7CisJCX0KIAogCQllcnIyID0gVEczX1BIWV9BVVhDVExfU01EU1BfRElTQUJMRSh0cCk7CiAJCWlmICghZXJyKQpAQCAtMzA3NSw3ICszMjM2LDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgU1BFRURfMTAwMDoKLQkJCWJtY3IgfD0gVEczX0JNQ1JfU1BFRUQxMDAwOworCQkJYm1jciB8PSBCTUNSX1NQRUVEMTAwMDsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTMxNTIsNyArMzMxMyw3IEBACiAJCWlmIChtYXNrICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKIAkJCWFsbF9tYXNrIHw9IEFEVkVSVElTRV8xMDAwRlVMTDsKIAotCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9URzNfQ1RSTCwgJnRnM19jdHJsKSkKKwkJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfQ1RSTDEwMDAsICZ0ZzNfY3RybCkpCiAJCQlyZXR1cm4gMDsKIAogCQlpZiAoKHRnM19jdHJsICYgYWxsX21hc2spICE9IGFsbF9tYXNrKQpAQCAtMzQ0OSw3ICszNjEwLDcgQEAKIAkJdTE2IG9sZGxua2N0bCwgbmV3bG5rY3RsOwogCiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LAotCQkJCSAgICAgdHAtPnBjaWVfY2FwICsgUENJX0VYUF9MTktDVEwsCisJCQkJICAgICBwY2lfcGNpZV9jYXAodHAtPnBkZXYpICsgUENJX0VYUF9MTktDVEwsCiAJCQkJICAgICAmb2xkbG5rY3RsKTsKIAkJaWYgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwIHx8CiAJCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwKQpAQCAtMzQ1OCw3ICszNjE5LDcgQEAKIAkJCW5ld2xua2N0bCA9IG9sZGxua2N0bCB8IFBDSV9FWFBfTE5LQ1RMX0NMS1JFUV9FTjsKIAkJaWYgKG5ld2xua2N0bCAhPSBvbGRsbmtjdGwpCiAJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHAtPnBkZXYsCi0JCQkJCSAgICAgIHRwLT5wY2llX2NhcCArIFBDSV9FWFBfTE5LQ1RMLAorCQkJCQkgICAgICBwY2lfcGNpZV9jYXAodHAtPnBkZXYpICsgUENJX0VYUF9MTktDVEwsCiAJCQkJCSAgICAgIG5ld2xua2N0bCk7CiAJfQogCkBAIC01ODIxLDggKzU5ODIsNyBAQAogCQkvKiBNYWtlIHN1cmUgbmV3IHNrYiBkb2VzIG5vdCBjcm9zcyBhbnkgNEcgYm91bmRhcmllcy4KIAkJICogRHJvcCB0aGUgcGFja2V0IGlmIGl0IGRvZXMuCiAJCSAqLwotCQl9IGVsc2UgaWYgKHRnM19mbGFnKHRwLCA0R19ETUFfQk5EUllfQlVHKSAmJgotCQkJICAgdGczXzRnX292ZXJmbG93X3Rlc3QobmV3X2FkZHIsIG5ld19za2ItPmxlbikpIHsKKwkJfSBlbHNlIGlmICh0ZzNfNGdfb3ZlcmZsb3dfdGVzdChuZXdfYWRkciwgbmV3X3NrYi0+bGVuKSkgewogCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgbmV3X2FkZHIsIG5ld19za2ItPmxlbiwKIAkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQkJcmV0ID0gLTE7CkBAIC02MDE3LDEyICs2MTc3LDEwIEBACiAJaWYgKHRnM19mbGFnKHRwLCBTSE9SVF9ETUFfQlVHKSAmJiBsZW4gPD0gOCkKIAkJd291bGRfaGl0X2h3YnVnID0gMTsKIAotCWlmICh0ZzNfZmxhZyh0cCwgNEdfRE1BX0JORFJZX0JVRykgJiYKLQkgICAgdGczXzRnX292ZXJmbG93X3Rlc3QobWFwcGluZywgbGVuKSkKKwlpZiAodGczXzRnX292ZXJmbG93X3Rlc3QobWFwcGluZywgbGVuKSkKIAkJd291bGRfaGl0X2h3YnVnID0gMTsKIAotCWlmICh0ZzNfZmxhZyh0cCwgNDBCSVRfRE1BX0xJTUlUX0JVRykgJiYKLQkgICAgdGczXzQwYml0X292ZXJmbG93X3Rlc3QodHAsIG1hcHBpbmcsIGxlbikpCisJaWYgKHRnM180MGJpdF9vdmVyZmxvd190ZXN0KHRwLCBtYXBwaW5nLCBsZW4pKQogCQl3b3VsZF9oaXRfaHdidWcgPSAxOwogCiAJaWYgKHRnM19mbGFnKHRwLCA1NzAxX0RNQV9CVUcpKQpAQCAtNjA1NSwxMiArNjIxMywxMCBAQAogCQkJICAgIGxlbiA8PSA4KQogCQkJCXdvdWxkX2hpdF9od2J1ZyA9IDE7CiAKLQkJCWlmICh0ZzNfZmxhZyh0cCwgNEdfRE1BX0JORFJZX0JVRykgJiYKLQkJCSAgICB0ZzNfNGdfb3ZlcmZsb3dfdGVzdChtYXBwaW5nLCBsZW4pKQorCQkJaWYgKHRnM180Z19vdmVyZmxvd190ZXN0KG1hcHBpbmcsIGxlbikpCiAJCQkJd291bGRfaGl0X2h3YnVnID0gMTsKIAotCQkJaWYgKHRnM19mbGFnKHRwLCA0MEJJVF9ETUFfTElNSVRfQlVHKSAmJgotCQkJICAgIHRnM180MGJpdF9vdmVyZmxvd190ZXN0KHRwLCBtYXBwaW5nLCBsZW4pKQorCQkJaWYgKHRnM180MGJpdF9vdmVyZmxvd190ZXN0KHRwLCBtYXBwaW5nLCBsZW4pKQogCQkJCXdvdWxkX2hpdF9od2J1ZyA9IDE7CiAKIAkJCWlmICh0ZzNfZmxhZyh0cCwgSFdfVFNPXzEpIHx8CkBAIC02MDg4LDYgKzYyNDQsOCBAQAogCQllbnRyeSA9IE5FWFRfVFgodG5hcGktPnR4X3Byb2QpOwogCX0KIAorCXNrYl90eF90aW1lc3RhbXAoc2tiKTsKKwogCS8qIFBhY2tldHMgYXJlIHJlYWR5LCB1cGRhdGUgVHggcHJvZHVjZXIgaWR4IGxvY2FsIGFuZCBvbiBjYXJkLiAqLwogCXR3MzJfdHhfbWJveCh0bmFwaS0+cHJvZG1ib3gsIGVudHJ5KTsKIApAQCAtNzE5Myw3ICs3MzUxLDcgQEAKIAogCXVkZWxheSgxMjApOwogCi0JaWYgKHRnM19mbGFnKHRwLCBQQ0lfRVhQUkVTUykgJiYgdHAtPnBjaWVfY2FwKSB7CisJaWYgKHRnM19mbGFnKHRwLCBQQ0lfRVhQUkVTUykgJiYgcGNpX3BjaWVfY2FwKHRwLT5wZGV2KSkgewogCQl1MTYgdmFsMTY7CiAKIAkJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzUwX0EwKSB7CkBAIC03MjExLDcgKzczNjksNyBAQAogCiAJCS8qIENsZWFyIHRoZSAibm8gc25vb3AiIGFuZCAicmVsYXhlZCBvcmRlcmluZyIgYml0cy4gKi8KIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQodHAtPnBkZXYsCi0JCQkJICAgICB0cC0+cGNpZV9jYXAgKyBQQ0lfRVhQX0RFVkNUTCwKKwkJCQkgICAgIHBjaV9wY2llX2NhcCh0cC0+cGRldikgKyBQQ0lfRVhQX0RFVkNUTCwKIAkJCQkgICAgICZ2YWwxNik7CiAJCXZhbDE2ICY9IH4oUENJX0VYUF9ERVZDVExfUkVMQVhfRU4gfAogCQkJICAgUENJX0VYUF9ERVZDVExfTk9TTk9PUF9FTik7CkBAIC03MjIyLDE0ICs3MzgwLDE0IEBACiAJCWlmICghdGczX2ZsYWcodHAsIENQTVVfUFJFU0VOVCkpCiAJCQl2YWwxNiAmPSB+UENJX0VYUF9ERVZDVExfUEFZTE9BRDsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRwLT5wZGV2LAotCQkJCSAgICAgIHRwLT5wY2llX2NhcCArIFBDSV9FWFBfREVWQ1RMLAorCQkJCSAgICAgIHBjaV9wY2llX2NhcCh0cC0+cGRldikgKyBQQ0lfRVhQX0RFVkNUTCwKIAkJCQkgICAgICB2YWwxNik7CiAKIAkJcGNpZV9zZXRfcmVhZHJxKHRwLT5wZGV2LCB0cC0+cGNpZV9yZWFkcnEpOwogCiAJCS8qIENsZWFyIGVycm9yIHN0YXR1cyAqLwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHAtPnBkZXYsCi0JCQkJICAgICAgdHAtPnBjaWVfY2FwICsgUENJX0VYUF9ERVZTVEEsCisJCQkJICAgICAgcGNpX3BjaWVfY2FwKHRwLT5wZGV2KSArIFBDSV9FWFBfREVWU1RBLAogCQkJCSAgICAgIFBDSV9FWFBfREVWU1RBX0NFRCB8CiAJCQkJICAgICAgUENJX0VYUF9ERVZTVEFfTkZFRCB8CiAJCQkJICAgICAgUENJX0VYUF9ERVZTVEFfRkVEIHwKQEAgLTcyNjcsMTYgKzc0MjUsMTEgQEAKIAkJdHczMihURzNQQ0lfQ0xPQ0tfQ1RSTCwgdHAtPnBjaV9jbG9ja19jdHJsKTsKIAl9CiAKLQlpZiAodGczX2ZsYWcodHAsIEVOQUJMRV9BUEUpKQotCQl0cC0+bWFjX21vZGUgPSBNQUNfTU9ERV9BUEVfVFhfRU4gfAotCQkJICAgICAgIE1BQ19NT0RFX0FQRV9SWF9FTiB8Ci0JCQkgICAgICAgTUFDX01PREVfVERFX0VOQUJMRTsKLQogCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19QSFlfU0VSREVTKSB7Ci0JCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfVEJJOworCQl0cC0+bWFjX21vZGUgPSBNQUNfTU9ERV9QT1JUX01PREVfVEJJOwogCQl2YWwgPSB0cC0+bWFjX21vZGU7CiAJfSBlbHNlIGlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19NSUlfU0VSREVTKSB7Ci0JCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKKwkJdHAtPm1hY19tb2RlID0gTUFDX01PREVfUE9SVF9NT0RFX0dNSUk7CiAJCXZhbCA9IHRwLT5tYWNfbW9kZTsKIAl9IGVsc2UKIAkJdmFsID0gMDsKQEAgLTc3NTEsNiArNzkwNCw5IEBACiAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KIAl0dzMyX21haWxib3hfZih0cC0+bmFwaVswXS5pbnRfbWJveCwgMSk7CisJdHAtPm5hcGlbMF0uY2hrX21zaV9jbnQgPSAwOworCXRwLT5uYXBpWzBdLmxhc3RfcnhfY29ucyA9IDA7CisJdHAtPm5hcGlbMF0ubGFzdF90eF9jb25zID0gMDsKIAogCS8qIFplcm8gbWFpbGJveCByZWdpc3RlcnMuICovCiAJaWYgKHRnM19mbGFnKHRwLCBTVVBQT1JUX01TSVgpKSB7CkBAIC03NzYxLDYgKzc5MTcsOSBAQAogCQkJCXR3MzJfbWFpbGJveCh0cC0+bmFwaVtpXS5wcm9kbWJveCwgMCk7CiAJCQl0dzMyX3J4X21ib3godHAtPm5hcGlbaV0uY29uc21ib3gsIDApOwogCQkJdHczMl9tYWlsYm94X2YodHAtPm5hcGlbaV0uaW50X21ib3gsIDEpOworCQkJdHAtPm5hcGlbMF0uY2hrX21zaV9jbnQgPSAwOworCQkJdHAtPm5hcGlbaV0ubGFzdF9yeF9jb25zID0gMDsKKwkJCXRwLT5uYXBpW2ldLmxhc3RfdHhfY29ucyA9IDA7CiAJCX0KIAkJaWYgKCF0ZzNfZmxhZyh0cCwgRU5BQkxFX1RTUykpCiAJCQl0dzMyX21haWxib3godHAtPm5hcGlbMF0ucHJvZG1ib3gsIDApOwpAQCAtODQwOCwxMiArODU2NywxMSBAQAogCQl1ZGVsYXkoMTApOwogCX0KIAotCWlmICh0ZzNfZmxhZyh0cCwgRU5BQkxFX0FQRSkpCi0JCXRwLT5tYWNfbW9kZSA9IE1BQ19NT0RFX0FQRV9UWF9FTiB8IE1BQ19NT0RFX0FQRV9SWF9FTjsKLQllbHNlCi0JCXRwLT5tYWNfbW9kZSA9IDA7CiAJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1RYU1RBVF9FTkFCTEUgfCBNQUNfTU9ERV9SWFNUQVRfRU5BQkxFIHwKLQkJTUFDX01PREVfVERFX0VOQUJMRSB8IE1BQ19NT0RFX1JERV9FTkFCTEUgfCBNQUNfTU9ERV9GSERFX0VOQUJMRTsKKwkJCU1BQ19NT0RFX1RERV9FTkFCTEUgfCBNQUNfTU9ERV9SREVfRU5BQkxFIHwKKwkJCU1BQ19NT0RFX0ZIREVfRU5BQkxFOworCWlmICh0ZzNfZmxhZyh0cCwgRU5BQkxFX0FQRSkpCisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9BUEVfVFhfRU4gfCBNQUNfTU9ERV9BUEVfUlhfRU47CiAJaWYgKCF0ZzNfZmxhZyh0cCwgNTcwNV9QTFVTKSAmJgogCSAgICAhKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX1BIWV9TRVJERVMpICYmCiAJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAwKQpAQCAtODU2NSwxNSArODcyMywyNCBAQAogCXVkZWxheSgxMDApOwogCiAJaWYgKHRnM19mbGFnKHRwLCBFTkFCTEVfUlNTKSkgeworCQlpbnQgaSA9IDA7CiAJCXUzMiByZWcgPSBNQUNfUlNTX0lORElSX1RCTF8wOwotCQl1OCAqZW50ID0gKHU4ICopJnZhbDsKIAotCQkvKiBTZXR1cCB0aGUgaW5kaXJlY3Rpb24gdGFibGUgKi8KLQkJZm9yIChpID0gMDsgaSA8IFRHM19SU1NfSU5ESVJfVEJMX1NJWkU7IGkrKykgewotCQkJaW50IGlkeCA9IGkgJSBzaXplb2YodmFsKTsKKwkJaWYgKHRwLT5pcnFfY250ID09IDIpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBURzNfUlNTX0lORElSX1RCTF9TSVpFOyBpICs9IDgpIHsKKwkJCQl0dzMyKHJlZywgMHgwKTsKKwkJCQlyZWcgKz0gNDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXUzMiB2YWw7CiAKLQkJCWVudFtpZHhdID0gaSAlICh0cC0+aXJxX2NudCAtIDEpOwotCQkJaWYgKGlkeCA9PSBzaXplb2YodmFsKSAtIDEpIHsKKwkJCXdoaWxlIChpIDwgVEczX1JTU19JTkRJUl9UQkxfU0laRSkgeworCQkJCXZhbCA9IGkgJSAodHAtPmlycV9jbnQgLSAxKTsKKwkJCQlpKys7CisJCQkJZm9yICg7IGkgJSA4OyBpKyspIHsKKwkJCQkJdmFsIDw8PSA0OworCQkJCQl2YWwgfD0gKGkgJSAodHAtPmlycV9jbnQgLSAxKSk7CisJCQkJfQogCQkJCXR3MzIocmVnLCB2YWwpOwogCQkJCXJlZyArPSA0OwogCQkJfQpAQCAtODgxNiw2ICs4OTgzLDMwIEBACiAJVEczX1NUQVRfQUREMzIoJnNwLT5yeF9lcnJvcnMsIFJDVkxQQ19JTl9FUlJPUlNfQ05UKTsKIH0KIAorc3RhdGljIHZvaWQgdGczX2Noa19taXNzZWRfbXNpKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IHRwLT5pcnFfY250OyBpKyspIHsKKwkJc3RydWN0IHRnM19uYXBpICp0bmFwaSA9ICZ0cC0+bmFwaVtpXTsKKworCQlpZiAodGczX2hhc193b3JrKHRuYXBpKSkgeworCQkJaWYgKHRuYXBpLT5sYXN0X3J4X2NvbnMgPT0gdG5hcGktPnJ4X3JjYl9wdHIgJiYKKwkJCSAgICB0bmFwaS0+bGFzdF90eF9jb25zID09IHRuYXBpLT50eF9jb25zKSB7CisJCQkJaWYgKHRuYXBpLT5jaGtfbXNpX2NudCA8IDEpIHsKKwkJCQkJdG5hcGktPmNoa19tc2lfY250Kys7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJdHczMl9tYWlsYm94KHRuYXBpLT5pbnRfbWJveCwKKwkJCQkJICAgICB0bmFwaS0+bGFzdF90YWcgPDwgMjQpOworCQkJfQorCQl9CisJCXRuYXBpLT5jaGtfbXNpX2NudCA9IDA7CisJCXRuYXBpLT5sYXN0X3J4X2NvbnMgPSB0bmFwaS0+cnhfcmNiX3B0cjsKKwkJdG5hcGktPmxhc3RfdHhfY29ucyA9IHRuYXBpLT50eF9jb25zOworCX0KK30KKwogc3RhdGljIHZvaWQgdGczX3RpbWVyKHVuc2lnbmVkIGxvbmcgX19vcGFxdWUpCiB7CiAJc3RydWN0IHRnMyAqdHAgPSAoc3RydWN0IHRnMyAqKSBfX29wYXF1ZTsKQEAgLTg4MjUsNiArOTAxNiwxMCBAQAogCiAJc3Bpbl9sb2NrKCZ0cC0+bG9jayk7CiAKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1KQorCQl0ZzNfY2hrX21pc3NlZF9tc2kodHApOworCiAJaWYgKCF0ZzNfZmxhZyh0cCwgVEFHR0VEX1NUQVRVUykpIHsKIAkJLyogQWxsIG9mIHRoaXMgZ2FyYmFnZSBpcyBiZWNhdXNlIHdoZW4gdXNpbmcgbm9uLXRhZ2dlZAogCQkgKiBJUlEgc3RhdHVzIHRoZSBtYWlsYm94L3N0YXR1c19ibG9jayBwcm90b2NvbCB0aGUgY2hpcApAQCAtODk4OCw3ICs5MTgzLDcgQEAKIAkgKiBUdXJuIG9mZiBNU0kgb25lIHNob3QgbW9kZS4gIE90aGVyd2lzZSB0aGlzIHRlc3QgaGFzIG5vCiAJICogb2JzZXJ2YWJsZSB3YXkgdG8ga25vdyB3aGV0aGVyIHRoZSBpbnRlcnJ1cHQgd2FzIGRlbGl2ZXJlZC4KIAkgKi8KLQlpZiAodGczX2ZsYWcodHAsIDU3NzY1X1BMVVMpICYmIHRnM19mbGFnKHRwLCBVU0lOR19NU0kpKSB7CisJaWYgKHRnM19mbGFnKHRwLCA1Nzc2NV9QTFVTKSkgewogCQl2YWwgPSB0cjMyKE1TR0lOVF9NT0RFKSB8IE1TR0lOVF9NT0RFX09ORV9TSE9UX0RJU0FCTEU7CiAJCXR3MzIoTVNHSU5UX01PREUsIHZhbCk7CiAJfQpAQCAtOTAxNiw2ICs5MjExLDEwIEBACiAJCQlicmVhazsKIAkJfQogCisJCWlmICh0ZzNfZmxhZyh0cCwgNTc3NjVfUExVUykgJiYKKwkJICAgIHRuYXBpLT5od19zdGF0dXMtPnN0YXR1c190YWcgIT0gdG5hcGktPmxhc3RfdGFnKQorCQkJdHczMl9tYWlsYm94X2YodG5hcGktPmludF9tYm94LCB0bmFwaS0+bGFzdF90YWcgPDwgMjQpOworCiAJCW1zbGVlcCgxMCk7CiAJfQogCkBAIC05MDMwLDcgKzkyMjksNyBAQAogCiAJaWYgKGludHJfb2spIHsKIAkJLyogUmVlbmFibGUgTVNJIG9uZSBzaG90IG1vZGUuICovCi0JCWlmICh0ZzNfZmxhZyh0cCwgNTc3NjVfUExVUykgJiYgdGczX2ZsYWcodHAsIFVTSU5HX01TSSkpIHsKKwkJaWYgKHRnM19mbGFnKHRwLCA1Nzc2NV9QTFVTKSkgewogCQkJdmFsID0gdHIzMihNU0dJTlRfTU9ERSkgJiB+TVNHSU5UX01PREVfT05FX1NIT1RfRElTQUJMRTsKIAkJCXR3MzIoTVNHSU5UX01PREUsIHZhbCk7CiAJCX0KQEAgLTkzMDAsNyArOTQ5OSw5IEBACiAJCXRnM19oYWx0KHRwLCBSRVNFVF9LSU5EX1NIVVRET1dOLCAxKTsKIAkJdGczX2ZyZWVfcmluZ3ModHApOwogCX0gZWxzZSB7Ci0JCWlmICh0ZzNfZmxhZyh0cCwgVEFHR0VEX1NUQVRVUykpCisJCWlmICh0ZzNfZmxhZyh0cCwgVEFHR0VEX1NUQVRVUykgJiYKKwkJCUdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzE3ICYmCisJCQlHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTc3NjUpCiAJCQl0cC0+dGltZXJfb2Zmc2V0ID0gSFo7CiAJCWVsc2UKIAkJCXRwLT50aW1lcl9vZmZzZXQgPSBIWiAvIDEwOwpAQCAtOTM3Niw2ICs5NTc3LDggQEAKIAogZXJyX291dDE6CiAJdGczX2ludHNfZmluaSh0cCk7CisJdGczX2Zyb2JfYXV4X3Bvd2VyKHRwLCBmYWxzZSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZSh0cC0+cGRldiwgUENJX0QzaG90KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC05OTAyLDYgKzEwMTA1LDE4IEBACiAJfQogCiAJY21kLT5hZHZlcnRpc2luZyA9IHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZzsKKwlpZiAodGczX2ZsYWcodHAsIFBBVVNFX0FVVE9ORUcpKSB7CisJCWlmICh0cC0+bGlua19jb25maWcuZmxvd2N0cmwgJiBGTE9XX0NUUkxfUlgpIHsKKwkJCWlmICh0cC0+bGlua19jb25maWcuZmxvd2N0cmwgJiBGTE9XX0NUUkxfVFgpIHsKKwkJCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfUGF1c2U7CisJCQl9IGVsc2UgeworCQkJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QYXVzZSB8CisJCQkJCQkgICAgQURWRVJUSVNFRF9Bc3ltX1BhdXNlOworCQkJfQorCQl9IGVsc2UgaWYgKHRwLT5saW5rX2NvbmZpZy5mbG93Y3RybCAmIEZMT1dfQ1RSTF9UWCkgeworCQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CisJCX0KKwl9CiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewogCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkKTsKIAkJY21kLT5kdXBsZXggPSB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleDsKQEAgLTEwMzU4LDcgKzEwNTczLDcgQEAKIAltZW1jcHkodG1wX3N0YXRzLCB0ZzNfZ2V0X2VzdGF0cyh0cCksIHNpemVvZih0cC0+ZXN0YXRzKSk7CiB9CiAKLXN0YXRpYyBfX2JlMzIgKiB0ZzNfdnBkX3JlYWRibG9jayhzdHJ1Y3QgdGczICp0cCkKK3N0YXRpYyBfX2JlMzIgKnRnM192cGRfcmVhZGJsb2NrKHN0cnVjdCB0ZzMgKnRwLCB1MzIgKnZwZGxlbikKIHsKIAlpbnQgaTsKIAlfX2JlMzIgKmJ1ZjsKQEAgLTEwNDI1LDYgKzEwNjQwLDggQEAKIAkJCWdvdG8gZXJyb3I7CiAJfQogCisJKnZwZGxlbiA9IGxlbjsKKwogCXJldHVybiBidWY7CiAKIGVycm9yOgpAQCAtMTA0MzYsMTIgKzEwNjUzLDE1IEBACiAjZGVmaW5lIE5WUkFNX1NFTEZCT09UX0ZPUk1BVDFfMF9TSVpFCTB4MTQKICNkZWZpbmUgTlZSQU1fU0VMRkJPT1RfRk9STUFUMV8yX1NJWkUJMHgxOAogI2RlZmluZSBOVlJBTV9TRUxGQk9PVF9GT1JNQVQxXzNfU0laRQkweDFjCisjZGVmaW5lIE5WUkFNX1NFTEZCT09UX0ZPUk1BVDFfNF9TSVpFCTB4MjAKKyNkZWZpbmUgTlZSQU1fU0VMRkJPT1RfRk9STUFUMV81X1NJWkUJMHgyNAorI2RlZmluZSBOVlJBTV9TRUxGQk9PVF9GT1JNQVQxXzZfU0laRQkweDUwCiAjZGVmaW5lIE5WUkFNX1NFTEZCT09UX0hXX1NJWkUgMHgyMAogI2RlZmluZSBOVlJBTV9TRUxGQk9PVF9EQVRBX1NJWkUgMHgxYwogCiBzdGF0aWMgaW50IHRnM190ZXN0X252cmFtKHN0cnVjdCB0ZzMgKnRwKQogewotCXUzMiBjc3VtLCBtYWdpYzsKKwl1MzIgY3N1bSwgbWFnaWMsIGxlbjsKIAlfX2JlMzIgKmJ1ZjsKIAlpbnQgaSwgaiwgaywgZXJyID0gMCwgc2l6ZTsKIApAQCAtMTA0NjYsOCArMTA2ODYsMTcgQEAKIAkJCWNhc2UgVEczX0VFUFJPTV9TQl9SRVZJU0lPTl8zOgogCQkJCXNpemUgPSBOVlJBTV9TRUxGQk9PVF9GT1JNQVQxXzNfU0laRTsKIAkJCQlicmVhazsKKwkJCWNhc2UgVEczX0VFUFJPTV9TQl9SRVZJU0lPTl80OgorCQkJCXNpemUgPSBOVlJBTV9TRUxGQk9PVF9GT1JNQVQxXzRfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVEczX0VFUFJPTV9TQl9SRVZJU0lPTl81OgorCQkJCXNpemUgPSBOVlJBTV9TRUxGQk9PVF9GT1JNQVQxXzVfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVEczX0VFUFJPTV9TQl9SRVZJU0lPTl82OgorCQkJCXNpemUgPSBOVlJBTV9TRUxGQk9PVF9GT1JNQVQxXzZfU0laRTsKKwkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIDA7CisJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAJCX0gZWxzZQogCQkJcmV0dXJuIDA7CkBAIC0xMDU3MywxOCArMTA4MDIsMTcgQEAKIAogCWtmcmVlKGJ1Zik7CiAKLQlidWYgPSB0ZzNfdnBkX3JlYWRibG9jayh0cCk7CisJYnVmID0gdGczX3ZwZF9yZWFkYmxvY2sodHAsICZsZW4pOwogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWkgPSBwY2lfdnBkX2ZpbmRfdGFnKCh1OCAqKWJ1ZiwgMCwgVEczX05WTV9WUERfTEVOLAotCQkJICAgICBQQ0lfVlBEX0xSRFRfUk9fREFUQSk7CisJaSA9IHBjaV92cGRfZmluZF90YWcoKHU4ICopYnVmLCAwLCBsZW4sIFBDSV9WUERfTFJEVF9ST19EQVRBKTsKIAlpZiAoaSA+IDApIHsKIAkJaiA9IHBjaV92cGRfbHJkdF9zaXplKCYoKHU4ICopYnVmKVtpXSk7CiAJCWlmIChqIDwgMCkKIAkJCWdvdG8gb3V0OwogCi0JCWlmIChpICsgUENJX1ZQRF9MUkRUX1RBR19TSVpFICsgaiA+IFRHM19OVk1fVlBEX0xFTikKKwkJaWYgKGkgKyBQQ0lfVlBEX0xSRFRfVEFHX1NJWkUgKyBqID4gbGVuKQogCQkJZ290byBvdXQ7CiAKIAkJaSArPSBQQ0lfVlBEX0xSRFRfVEFHX1NJWkU7CkBAIC0xMTM0MCw4ICsxMTU2OCwxMiBAQAogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19MT1dfUE9XRVIpCi0JCXRnM19wb3dlcl91cCh0cCk7CisJaWYgKCh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19MT1dfUE9XRVIpICYmCisJICAgIHRnM19wb3dlcl91cCh0cCkpIHsKKwkJZXRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKwkJbWVtc2V0KGRhdGEsIDEsIHNpemVvZih1NjQpICogVEczX05VTV9URVNUKTsKKwkJcmV0dXJuOworCX0KIAogCW1lbXNldChkYXRhLCAwLCBzaXplb2YodTY0KSAqIFRHM19OVU1fVEVTVCk7CiAKQEAgLTEyNTg1LDI5ICsxMjgxNyw2IEBACiBzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX2dldF9lZXByb21faHdfY2ZnKHN0cnVjdCB0ZzMgKnRwKQogewogCXUzMiB2YWw7Ci0JdTE2IHBtY3NyOwotCi0JLyogT24gc29tZSBlYXJseSBjaGlwcyB0aGUgU1JBTSBjYW5ub3QgYmUgYWNjZXNzZWQgaW4gRDNob3Qgc3RhdGUsCi0JICogc28gbmVlZCBtYWtlIHN1cmUgd2UncmUgaW4gRDAuCi0JICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQodHAtPnBkZXYsIHRwLT5wbV9jYXAgKyBQQ0lfUE1fQ1RSTCwgJnBtY3NyKTsKLQlwbWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHAtPnBkZXYsIHRwLT5wbV9jYXAgKyBQQ0lfUE1fQ1RSTCwgcG1jc3IpOwotCW1zbGVlcCgxKTsKLQotCS8qIE1ha2Ugc3VyZSByZWdpc3RlciBhY2Nlc3NlcyAoaW5kaXJlY3Qgb3Igb3RoZXJ3aXNlKQotCSAqIHdpbGwgZnVuY3Rpb24gY29ycmVjdGx5LgotCSAqLwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKLQkJCSAgICAgICB0cC0+bWlzY19ob3N0X2N0cmwpOwotCi0JLyogVGhlIG1lbW9yeSBhcmJpdGVyIGhhcyB0byBiZSBlbmFibGVkIGluIG9yZGVyIGZvciBTUkFNIGFjY2Vzc2VzCi0JICogdG8gc3VjY2VlZC4gIE5vcm1hbGx5IG9uIHBvd2VydXAgdGhlIHRnMyBjaGlwIGZpcm13YXJlIHdpbGwgbWFrZQotCSAqIHN1cmUgaXQgaXMgZW5hYmxlZCwgYnV0IG90aGVyIGVudGl0aWVzIHN1Y2ggYXMgc3lzdGVtIG5ldGJvb3QKLQkgKiBjb2RlIG1pZ2h0IGRpc2FibGUgaXQuCi0JICovCi0JdmFsID0gdHIzMihNRU1BUkJfTU9ERSk7Ci0JdHczMihNRU1BUkJfTU9ERSwgdmFsIHwgTUVNQVJCX01PREVfRU5BQkxFKTsKIAogCXRwLT5waHlfaWQgPSBURzNfUEhZX0lEX0lOVkFMSUQ7CiAJdHAtPmxlZF9jdHJsID0gTEVEX0NUUkxfTU9ERV9QSFlfMTsKQEAgLTEyOTQ3LDcgKzEzMTU2LDkgQEAKIAl9CiAKIAlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19BTllfU0VSREVTKSAmJgotCSAgICAoKHRwLT5wZGV2LT5kZXZpY2UgPT0gVEczUENJX0RFVklDRV9USUdPTjNfNTcxOCAmJgorCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTkgfHwKKwkgICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzIwIHx8CisJICAgICAodHAtPnBkZXYtPmRldmljZSA9PSBURzNQQ0lfREVWSUNFX1RJR09OM181NzE4ICYmCiAJICAgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MTdfQTApIHx8CiAJICAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1ICYmCiAJICAgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3NzY1X0EwKSkpCkBAIC0xMjk5OSwxNCArMTMyMTAsMTQgQEAKIHsKIAl1OCAqdnBkX2RhdGE7CiAJdW5zaWduZWQgaW50IGJsb2NrX2VuZCwgcm9zaXplLCBsZW47CisJdTMyIHZwZGxlbjsKIAlpbnQgaiwgaSA9IDA7CiAKLQl2cGRfZGF0YSA9ICh1OCAqKXRnM192cGRfcmVhZGJsb2NrKHRwKTsKKwl2cGRfZGF0YSA9ICh1OCAqKXRnM192cGRfcmVhZGJsb2NrKHRwLCAmdnBkbGVuKTsKIAlpZiAoIXZwZF9kYXRhKQogCQlnb3RvIG91dF9ub192cGQ7CiAKLQlpID0gcGNpX3ZwZF9maW5kX3RhZyh2cGRfZGF0YSwgMCwgVEczX05WTV9WUERfTEVOLAotCQkJICAgICBQQ0lfVlBEX0xSRFRfUk9fREFUQSk7CisJaSA9IHBjaV92cGRfZmluZF90YWcodnBkX2RhdGEsIDAsIHZwZGxlbiwgUENJX1ZQRF9MUkRUX1JPX0RBVEEpOwogCWlmIChpIDwgMCkKIAkJZ290byBvdXRfbm90X2ZvdW5kOwogCkBAIC0xMzAxNCw3ICsxMzIyNSw3IEBACiAJYmxvY2tfZW5kID0gaSArIFBDSV9WUERfTFJEVF9UQUdfU0laRSArIHJvc2l6ZTsKIAlpICs9IFBDSV9WUERfTFJEVF9UQUdfU0laRTsKIAotCWlmIChibG9ja19lbmQgPiBURzNfTlZNX1ZQRF9MRU4pCisJaWYgKGJsb2NrX2VuZCA+IHZwZGxlbikKIAkJZ290byBvdXRfbm90X2ZvdW5kOwogCiAJaiA9IHBjaV92cGRfZmluZF9pbmZvX2tleXdvcmQodnBkX2RhdGEsIGksIHJvc2l6ZSwKQEAgLTEzMDM5LDcgKzEzMjUwLDcgQEAKIAkJCWdvdG8gcGFydG5vOwogCiAJCW1lbWNweSh0cC0+ZndfdmVyLCAmdnBkX2RhdGFbal0sIGxlbik7Ci0JCXN0cm5jYXQodHAtPmZ3X3ZlciwgIiBiYyAiLCBURzNfTlZNX1ZQRF9MRU4gLSBsZW4gLSAxKTsKKwkJc3RybmNhdCh0cC0+ZndfdmVyLCAiIGJjICIsIHZwZGxlbiAtIGxlbiAtIDEpOwogCX0KIAogcGFydG5vOgpAQCAtMTMwNTIsNyArMTMyNjMsNyBAQAogCiAJaSArPSBQQ0lfVlBEX0lORk9fRkxEX0hEUl9TSVpFOwogCWlmIChsZW4gPiBURzNfQlBOX1NJWkUgfHwKLQkgICAgKGxlbiArIGkpID4gVEczX05WTV9WUERfTEVOKQorCSAgICAobGVuICsgaSkgPiB2cGRsZW4pCiAJCWdvdG8gb3V0X25vdF9mb3VuZDsKIAogCW1lbWNweSh0cC0+Ym9hcmRfcGFydF9udW1iZXIsICZ2cGRfZGF0YVtpXSwgbGVuKTsKQEAgLTEzMzUzLDEwICsxMzU2NCwxNSBAQAogCWVsc2UKIAkJcmV0dXJuOwogCi0JaWYgKCF0ZzNfZmxhZyh0cCwgRU5BQkxFX0FTRikgfHwgdGczX2ZsYWcodHAsIEVOQUJMRV9BUEUpIHx8IHZwZF92ZXJzKQorCWlmICh2cGRfdmVycykKIAkJZ290byBkb25lOwogCi0JdGczX3JlYWRfbWdtdGZ3X3Zlcih0cCk7CisJaWYgKHRnM19mbGFnKHRwLCBFTkFCTEVfQVBFKSkgeworCQlpZiAodGczX2ZsYWcodHAsIEVOQUJMRV9BU0YpKQorCQkJdGczX3JlYWRfZGFzaF92ZXIodHApOworCX0gZWxzZSBpZiAodGczX2ZsYWcodHAsIEVOQUJMRV9BU0YpKSB7CisJCXRnM19yZWFkX21nbXRmd192ZXIodHApOworCX0KIAogZG9uZToKIAl0cC0+ZndfdmVyW1RHM19WRVJfU0laRSAtIDFdID0gMDsKQEAgLTEzNDAwLDE0ICsxMzYxNiwxNyBAQAogCXBjaV9jbWQgJj0gflBDSV9DT01NQU5EX0lOVkFMSURBVEU7CiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NtZCk7CiAKLQkvKiBJdCBpcyBhYnNvbHV0ZWx5IGNyaXRpY2FsIHRoYXQgVEczUENJX01JU0NfSE9TVF9DVFJMCi0JICogaGFzIHRoZSByZWdpc3RlciBpbmRpcmVjdCB3cml0ZSBlbmFibGUgYml0IHNldCBiZWZvcmUKLQkgKiB3ZSB0cnkgdG8gYWNjZXNzIGFueSBvZiB0aGUgTU1JTyByZWdpc3RlcnMuICBJdCBpcyBhbHNvCi0JICogY3JpdGljYWwgdGhhdCB0aGUgUENJLVggaHcgd29ya2Fyb3VuZCBzaXR1YXRpb24gaXMgZGVjaWRlZAotCSAqIGJlZm9yZSB0aGF0IGFzIHdlbGwuCisJLyogSW1wb3J0YW50ISAtLSBNYWtlIHN1cmUgcmVnaXN0ZXIgYWNjZXNzZXMgYXJlIGJ5dGVzd2FwcGVkCisJICogY29ycmVjdGx5LiAgQWxzbywgZm9yIHRob3NlIGNoaXBzIHRoYXQgcmVxdWlyZSBpdCwgbWFrZQorCSAqIHN1cmUgdGhhdCBpbmRpcmVjdCByZWdpc3RlciBhY2Nlc3NlcyBhcmUgZW5hYmxlZCBiZWZvcmUKKwkgKiB0aGUgZmlyc3Qgb3BlcmF0aW9uLgogCSAqLwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01JU0NfSE9TVF9DVFJMLAogCQkJICAgICAgJm1pc2NfY3RybF9yZWcpOworCXRwLT5taXNjX2hvc3RfY3RybCB8PSAobWlzY19jdHJsX3JlZyAmCisJCQkgICAgICAgTUlTQ19IT1NUX0NUUkxfQ0hJUFJFVik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01JU0NfSE9TVF9DVFJMLAorCQkJICAgICAgIHRwLT5taXNjX2hvc3RfY3RybCk7CiAKIAl0cC0+cGNpX2NoaXBfcmV2X2lkID0gKG1pc2NfY3RybF9yZWcgPj4KIAkJCSAgICAgICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWX1NISUZUKTsKQEAgLTEzNTYzLDE2ICsxMzc4Miw4IEBACiAJCX0gd2hpbGUgKGJyaWRnZSk7CiAJfQogCi0JLyogSW5pdGlhbGl6ZSBtaXNjIGhvc3QgY29udHJvbCBpbiBQQ0kgYmxvY2suICovCi0JdHAtPm1pc2NfaG9zdF9jdHJsIHw9IChtaXNjX2N0cmxfcmVnICYKLQkJCSAgICAgICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCi0JCQkgICAgICAgdHAtPm1pc2NfaG9zdF9jdHJsKTsKLQogCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCB8fAotCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNCB8fAotCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAotCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcyMCkKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTQpCiAJCXRwLT5wZGV2X3BlZXIgPSB0ZzNfZmluZF9wZWVyKHRwKTsKIAogCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fApAQCAtMTM2NjYsMTUgKzEzODc3LDggQEAKIAkJfQogCX0KIAotCS8qIEFsbCBjaGlwcyBjYW4gZ2V0IGNvbmZ1c2VkIGlmIFRYIGJ1ZmZlcnMKLQkgKiBzdHJhZGRsZSB0aGUgNEdCIGFkZHJlc3MgYm91bmRhcnkuCi0JICovCi0JdGczX2ZsYWdfc2V0KHRwLCA0R19ETUFfQk5EUllfQlVHKTsKLQogCWlmICh0ZzNfZmxhZyh0cCwgNTc1NV9QTFVTKSkKIAkJdGczX2ZsYWdfc2V0KHRwLCBTSE9SVF9ETUFfQlVHKTsKLQllbHNlCi0JCXRnM19mbGFnX3NldCh0cCwgNDBCSVRfRE1BX0xJTUlUX0JVRyk7CiAKIAlpZiAodGczX2ZsYWcodHAsIDU3MTdfUExVUykpCiAJCXRnM19mbGFnX3NldCh0cCwgTFJHX1BST0RfUklOR19DQVApOwpAQCAtMTM2OTEsOCArMTM4OTUsNyBAQAogCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1BDSVNUQVRFLAogCQkJICAgICAgJnBjaV9zdGF0ZV9yZWcpOwogCi0JdHAtPnBjaWVfY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eSh0cC0+cGRldiwgUENJX0NBUF9JRF9FWFApOwotCWlmICh0cC0+cGNpZV9jYXAgIT0gMCkgeworCWlmIChwY2lfaXNfcGNpZSh0cC0+cGRldikpIHsKIAkJdTE2IGxua2N0bDsKIAogCQl0ZzNfZmxhZ19zZXQodHAsIFBDSV9FWFBSRVNTKTsKQEAgLTEzNzA1LDcgKzEzOTA4LDcgQEAKIAkJcGNpZV9zZXRfcmVhZHJxKHRwLT5wZGV2LCB0cC0+cGNpZV9yZWFkcnEpOwogCiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LAotCQkJCSAgICAgdHAtPnBjaWVfY2FwICsgUENJX0VYUF9MTktDVEwsCisJCQkJICAgICBwY2lfcGNpZV9jYXAodHAtPnBkZXYpICsgUENJX0VYUF9MTktDVEwsCiAJCQkJICAgICAmbG5rY3RsKTsKIAkJaWYgKGxua2N0bCAmIFBDSV9FWFBfTE5LQ1RMX0NMS1JFUV9FTikgewogCQkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PQpAQCAtMTM3MjIsNiArMTM5MjUsMTAgQEAKIAkJCXRnM19mbGFnX3NldCh0cCwgTDFQTExQRF9FTik7CiAJCX0KIAl9IGVsc2UgaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzg1KSB7CisJCS8qIEJDTTU3ODUgZGV2aWNlcyBhcmUgZWZmZWN0aXZlbHkgUENJZSBkZXZpY2VzLCBhbmQgc2hvdWxkCisJCSAqIGZvbGxvdyBQQ0llIGNvZGVwYXRocywgYnV0IGRvIG5vdCBoYXZlIGEgUENJZSBjYXBhYmlsaXRpZXMKKwkJICogc2VjdGlvbi4KKwkJKi8KIAkJdGczX2ZsYWdfc2V0KHRwLCBQQ0lfRVhQUkVTUyk7CiAJfSBlbHNlIGlmICghdGczX2ZsYWcodHAsIDU3MDVfUExVUykgfHwKIAkJICAgdGczX2ZsYWcodHAsIDU3ODBfQ0xBU1MpKSB7CkBAIC0xMzc1Nyw2ICsxMzk2NCw5IEBACiAJCQkJICAgICAgdHAtPnBjaV9sYXRfdGltZXIpOwogCX0KIAorCS8qIEltcG9ydGFudCEgLS0gSXQgaXMgY3JpdGljYWwgdGhhdCB0aGUgUENJLVggaHcgd29ya2Fyb3VuZAorCSAqIHNpdHVhdGlvbiBpcyBkZWNpZGVkIGJlZm9yZSB0aGUgZmlyc3QgTU1JTyByZWdpc3RlciBhY2Nlc3MuCisJICovCiAJaWYgKEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBDSElQUkVWXzU3MDBfQlgpIHsKIAkJLyogNTcwMCBCWCBjaGlwcyBuZWVkIHRvIGhhdmUgdGhlaXIgVFggcHJvZHVjZXIgaW5kZXgKIAkJICogbWFpbGJveGVzIHdyaXR0ZW4gdHdpY2UgdG8gd29ya2Fyb3VuZCBhIGJ1Zy4KQEAgLTEzODYzLDYgKzE0MDczLDIyIEBACiAJICAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpKSkKIAkJdGczX2ZsYWdfc2V0KHRwLCBTUkFNX1VTRV9DT05GSUcpOwogCisJLyogVGhlIG1lbW9yeSBhcmJpdGVyIGhhcyB0byBiZSBlbmFibGVkIGluIG9yZGVyIGZvciBTUkFNIGFjY2Vzc2VzCisJICogdG8gc3VjY2VlZC4gIE5vcm1hbGx5IG9uIHBvd2VydXAgdGhlIHRnMyBjaGlwIGZpcm13YXJlIHdpbGwgbWFrZQorCSAqIHN1cmUgaXQgaXMgZW5hYmxlZCwgYnV0IG90aGVyIGVudGl0aWVzIHN1Y2ggYXMgc3lzdGVtIG5ldGJvb3QKKwkgKiBjb2RlIG1pZ2h0IGRpc2FibGUgaXQuCisJICovCisJdmFsID0gdHIzMihNRU1BUkJfTU9ERSk7CisJdHczMihNRU1BUkJfTU9ERSwgdmFsIHwgTUVNQVJCX01PREVfRU5BQkxFKTsKKworCWlmICh0ZzNfZmxhZyh0cCwgUENJWF9NT0RFKSkgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsCisJCQkJICAgICAgdHAtPnBjaXhfY2FwICsgUENJX1hfU1RBVFVTLCAmdmFsKTsKKwkJdHAtPnBjaV9mbiA9IHZhbCAmIDB4NzsKKwl9IGVsc2UgeworCQl0cC0+cGNpX2ZuID0gUENJX0ZVTkModHAtPnBkZXYtPmRldmZuKSAmIDM7CisJfQorCiAJLyogR2V0IGVlcHJvbSBodyBjb25maWcgYmVmb3JlIGNhbGxpbmcgdGczX3NldF9wb3dlcl9zdGF0ZSgpLgogCSAqIEluIHBhcnRpY3VsYXIsIHRoZSBURzNfRkxBR19JU19OSUMgZmxhZyBtdXN0IGJlCiAJICogZGV0ZXJtaW5lZCBiZWZvcmUgY2FsbGluZyB0ZzNfc2V0X3Bvd2VyX3N0YXRlKCkgc28gdGhhdApAQCAtMTM4ODIsNiArMTQxMDgsOCBAQAogCQkJCSBQQ0lTVEFURV9BTExPV19BUEVfUFNQQUNFX1dSOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUENJU1RBVEUsCiAJCQkJICAgICAgIHBjaV9zdGF0ZV9yZWcpOworCisJCXRnM19hcGVfbG9ja19pbml0KHRwKTsKIAl9CiAKIAlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3ODQgfHwKQEAgLTEzODkxLDggKzE0MTE5LDkgQEAKIAkgICAgdGczX2ZsYWcodHAsIDU3NzY1X1BMVVMpKQogCQl0ZzNfZmxhZ19zZXQodHAsIENQTVVfUFJFU0VOVCk7CiAKLQkvKiBTZXQgdXAgdHAtPmdyY19sb2NhbF9jdHJsIGJlZm9yZSBjYWxsaW5nIHRnM19wb3dlcl91cCgpLgotCSAqIEdQSU8xIGRyaXZlbiBoaWdoIHdpbGwgYnJpbmcgNTcwMCdzIGV4dGVybmFsIFBIWSBvdXQgb2YgcmVzZXQuCisJLyogU2V0IHVwIHRwLT5ncmNfbG9jYWxfY3RybCBiZWZvcmUgY2FsbGluZworCSAqIHRnM19wd3JzcmNfc3dpdGNoX3RvX3ZtYWluKCkuICBHUElPMSBkcml2ZW4gaGlnaAorCSAqIHdpbGwgYnJpbmcgNTcwMCdzIGV4dGVybmFsIFBIWSBvdXQgb2YgcmVzZXQuCiAJICogSXQgaXMgYWxzbyB1c2VkIGFzIGVlcHJvbSB3cml0ZSBwcm90ZWN0IG9uIExPTXMuCiAJICovCiAJdHAtPmdyY19sb2NhbF9jdHJsID0gR1JDX0xDTENUUkxfSU5UX09OX0FUVE4gfCBHUkNfTENMQ1RSTF9BVVRPX1NFRVBST007CkBAIC0xMzkyMSwxMiArMTQxNTAsOCBAQAogCQkJCQkgICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDA7CiAJfQogCi0JLyogRm9yY2UgdGhlIGNoaXAgaW50byBEMC4gKi8KLQllcnIgPSB0ZzNfcG93ZXJfdXAodHApOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmdHAtPnBkZXYtPmRldiwgIlRyYW5zaXRpb24gdG8gRDAgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJLyogU3dpdGNoIG91dCBvZiBWYXV4IGlmIGl0IGlzIGEgTklDICovCisJdGczX3B3cnNyY19zd2l0Y2hfdG9fdm1haW4odHApOwogCiAJLyogRGVyaXZlIGluaXRpYWwganVtYm8gbW9kZSBmcm9tIE1UVSBhc3NpZ25lZCBpbgogCSAqIGV0aGVyX3NldHVwKCkgdmlhIHRoZSBhbGxvY19ldGhlcmRldigpIGNhbGwKQEAgLTE0MjI5LDkgKzE0NDU0LDkgQEAKIAkJZWxzZQogCQkJdGczX252cmFtX3VubG9jayh0cCk7CiAJfSBlbHNlIGlmICh0ZzNfZmxhZyh0cCwgNTcxN19QTFVTKSkgewotCQlpZiAoUENJX0ZVTkModHAtPnBkZXYtPmRldmZuKSAmIDEpCisJCWlmICh0cC0+cGNpX2ZuICYgMSkKIAkJCW1hY19vZmZzZXQgPSAweGNjOwotCQlpZiAoUENJX0ZVTkModHAtPnBkZXYtPmRldmZuKSA+IDEpCisJCWlmICh0cC0+cGNpX2ZuID4gMSkKIAkJCW1hY19vZmZzZXQgKz0gMHgxOGM7CiAJfSBlbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTkwNikKIAkJbWFjX29mZnNldCA9IDB4MTA7CkBAIC0xNDk0MSwxMSArMTUxNjYsMTcgQEAKIAkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOwogCX0KIAorCWVyciA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlRyYW5zaXRpb24gdG8gRDAgZmFpbGVkLCBhYm9ydGluZ1xuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisKIAlkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2YoKnRwKSwgVEczX0lSUV9NQVhfVkVDUyk7CiAJaWYgKCFkZXYpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXRoZXJkZXYgYWxsb2MgZmFpbGVkLCBhYm9ydGluZ1xuIik7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwkJZ290byBlcnJfb3V0X3Bvd2VyX2Rvd247CiAJfQogCiAJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKQEAgLTE0OTk0LDYgKzE1MjI1LDI0IEBACiAJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKIAl9CiAKKwlpZiAodHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzYxIHx8CisJICAgIHRwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9USUdPTjNfNTc2MUUgfHwKKwkgICAgdHAtPnBkZXYtPmRldmljZSA9PSBURzNQQ0lfREVWSUNFX1RJR09OM181NzYxUyB8fAorCSAgICB0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3NjFTRSB8fAorCSAgICB0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3MTcgfHwKKwkgICAgdHAtPnBkZXYtPmRldmljZSA9PSBURzNQQ0lfREVWSUNFX1RJR09OM181NzE4IHx8CisJICAgIHRwLT5wZGV2LT5kZXZpY2UgPT0gVEczUENJX0RFVklDRV9USUdPTjNfNTcxOSB8fAorCSAgICB0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3MjApIHsKKwkJdGczX2ZsYWdfc2V0KHRwLCBFTkFCTEVfQVBFKTsKKwkJdHAtPmFwZXJlZ3MgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgQkFSXzIpOworCQlpZiAoIXRwLT5hcGVyZWdzKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkNhbm5vdCBtYXAgQVBFIHJlZ2lzdGVycywgYWJvcnRpbmdcbiIpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX291dF9pb3VubWFwOworCQl9CisJfQorCiAJdHAtPnJ4X3BlbmRpbmcgPSBURzNfREVGX1JYX1JJTkdfUEVORElORzsKIAl0cC0+cnhfanVtYm9fcGVuZGluZyA9IFRHM19ERUZfUlhfSlVNQk9fUklOR19QRU5ESU5HOwogCkBAIC0xNTAwNiw3ICsxNTI1NSw3IEBACiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiUHJvYmxlbSBmZXRjaGluZyBpbnZhcmlhbnRzIG9mIGNoaXAsIGFib3J0aW5nXG4iKTsKLQkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJCWdvdG8gZXJyX291dF9hcGV1bm1hcDsKIAl9CiAKIAkvKiBUaGUgRVBCIGJyaWRnZSBpbnNpZGUgNTcxNCwgNTcxNSwgYW5kIDU3ODAgYW5kIGFueQpAQCAtMTUwMzUsNyArMTUyODQsNyBAQAogCQkJaWYgKGVyciA8IDApIHsKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gb2J0YWluIDY0IGJpdCAiCiAJCQkJCSJETUEgZm9yIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIpOwotCQkJCWdvdG8gZXJyX291dF9pb3VubWFwOworCQkJCWdvdG8gZXJyX291dF9hcGV1bm1hcDsKIAkJCX0KIAkJfQogCX0KQEAgLTE1MDQ0LDcgKzE1MjkzLDcgQEAKIAkJaWYgKGVycikgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sIGFib3J0aW5nXG4iKTsKLQkJCWdvdG8gZXJyX291dF9pb3VubWFwOworCQkJZ290byBlcnJfb3V0X2FwZXVubWFwOwogCQl9CiAJfQogCkBAIC0xNTEwOSwyMiArMTUzNTgsNyBAQAogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJIkNvdWxkIG5vdCBvYnRhaW4gdmFsaWQgZXRoZXJuZXQgYWRkcmVzcywgYWJvcnRpbmdcbiIpOwotCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKLQl9Ci0KLQlpZiAodGczX2ZsYWcodHAsIEVOQUJMRV9BUEUpKSB7Ci0JCXRwLT5hcGVyZWdzID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIEJBUl8yKTsKLQkJaWYgKCF0cC0+YXBlcmVncykgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCSJDYW5ub3QgbWFwIEFQRSByZWdpc3RlcnMsIGFib3J0aW5nXG4iKTsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKLQkJfQotCi0JCXRnM19hcGVfbG9ja19pbml0KHRwKTsKLQotCQlpZiAodGczX2ZsYWcodHAsIEVOQUJMRV9BU0YpKQotCQkJdGczX3JlYWRfZGFzaF92ZXIodHApOworCQlnb3RvIGVycl9vdXRfYXBldW5tYXA7CiAJfQogCiAJLyoKQEAgLTE1MTkyLDYgKzE1NDI2LDExIEBACiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAorCWlmICh0ZzNfZmxhZyh0cCwgNTcxN19QTFVTKSkgeworCQkvKiBSZXN1bWUgYSBsb3ctcG93ZXIgbW9kZSAqLworCQl0ZzNfZnJvYl9hdXhfcG93ZXIodHAsIGZhbHNlKTsKKwl9CisKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZ1xuIik7CkBAIC0xNTI1Nyw2ICsxNTQ5Niw5IEBACiBlcnJfb3V0X2ZyZWVfZGV2OgogCWZyZWVfbmV0ZGV2KGRldik7CiAKK2Vycl9vdXRfcG93ZXJfZG93bjoKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CisKIGVycl9vdXRfZnJlZV9yZXM6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIApAQCAtMTU0ODEsMTAgKzE1NzIzLDggQEAKIAl9CiAKIAllcnIgPSB0ZzNfcG93ZXJfdXAodHApOwotCWlmIChlcnIpIHsKLQkJbmV0ZGV2X2VycihuZXRkZXYsICJGYWlsZWQgdG8gcmVzdG9yZSByZWdpc3RlciBhY2Nlc3MuXG4iKTsKKwlpZiAoZXJyKQogCQlnb3RvIGRvbmU7Ci0JfQogCiAJcmMgPSBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5oIGIvZHJpdmVycy9uZXQvdGczLmgKaW5kZXggNWIzZDJmMy4uNjkxNTM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGczLmgKKysrIGIvZHJpdmVycy9uZXQvdGczLmgKQEAgLTEwNjUsNiArMTA2NSw4IEBACiAjZGVmaW5lICBSQ1ZMU0NfU1RBVFVTX0VSUk9SX0FUVE4JIDB4MDAwMDAwMDQKIC8qIDB4MzQwOCAtLT4gMHgzNjAwIHVudXNlZCAqLwogCisjZGVmaW5lIFRHM19DUE1VX0RSVl9TVEFUVVMJCTB4MDAwMDM0NGMKKwogLyogQ1BNVSByZWdpc3RlcnMgKi8KICNkZWZpbmUgVEczX0NQTVVfQ1RSTAkJCTB4MDAwMDM2MDAKICNkZWZpbmUgIENQTVVfQ1RSTF9MSU5LX0lETEVfTU9ERQkgMHgwMDAwMDIwMApAQCAtMTExOCwxMCArMTEyMCwxMCBAQAogI2RlZmluZSAgVEczX0NQTVVfRUVFTURfRUVFX0VOQUJMRQkgMHgwMDEwMDAwMAogI2RlZmluZSBURzNfQ1BNVV9FRUVfREJUTVIxCQkweDAwMDAzNmI0CiAjZGVmaW5lICBURzNfQ1BNVV9EQlRNUjFfUENJRVhJVF8yMDQ3VVMJIDB4MDdmZjAwMDAKLSNkZWZpbmUgIFRHM19DUE1VX0RCVE1SMV9MTktJRExFXzIwNDdVUwkgMHgwMDAwNzBmZgorI2RlZmluZSAgVEczX0NQTVVfREJUTVIxX0xOS0lETEVfMjA0N1VTCSAweDAwMDAwN2ZmCiAjZGVmaW5lIFRHM19DUE1VX0VFRV9EQlRNUjIJCTB4MDAwMDM2YjgKICNkZWZpbmUgIFRHM19DUE1VX0RCVE1SMl9BUEVfVFhfMjA0N1VTCSAweDA3ZmYwMDAwCi0jZGVmaW5lICBURzNfQ1BNVV9EQlRNUjJfVFhJRFhFUV8yMDQ3VVMJIDB4MDAwMDcwZmYKKyNkZWZpbmUgIFRHM19DUE1VX0RCVE1SMl9UWElEWEVRXzIwNDdVUwkgMHgwMDAwMDdmZgogI2RlZmluZSBURzNfQ1BNVV9FRUVfTE5LSURMX0NUUkwJMHgwMDAwMzZiYwogI2RlZmluZSAgVEczX0NQTVVfRUVFX0xOS0lETF9QQ0lFX05MMAkgMHgwMTAwMDAwMAogI2RlZmluZSAgVEczX0NQTVVfRUVFX0xOS0lETF9VQVJUX0lETAkgMHgwMDAwMDAwNApAQCAtMjE1MiwxNCArMjE1NCw2IEBACiAKIAogLyoqKiBUaWdvbjMgc3BlY2lmaWMgUEhZIE1JSSByZWdpc3RlcnMuICoqKi8KLSNkZWZpbmUgIFRHM19CTUNSX1NQRUVEMTAwMAkJMHgwMDQwCi0KLSNkZWZpbmUgTUlJX1RHM19DVFJMCQkJMHgwOSAvKiAxMDAwLWJhc2VUIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgIE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGCTB4MDEwMAotI2RlZmluZSAgTUlJX1RHM19DVFJMX0FEVl8xMDAwX0ZVTEwJMHgwMjAwCi0jZGVmaW5lICBNSUlfVEczX0NUUkxfQVNfTUFTVEVSCQkweDA4MDAKLSNkZWZpbmUgIE1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSCTB4MTAwMAotCiAjZGVmaW5lIE1JSV9URzNfTU1EX0NUUkwJCTB4MGQgLyogTU1EIEFjY2VzcyBDb250cm9sIHJlZ2lzdGVyICovCiAjZGVmaW5lIE1JSV9URzNfTU1EX0NUUkxfREFUQV9OT0lOQwkweDQwMDAKICNkZWZpbmUgTUlJX1RHM19NTURfQUREUkVTUwkJMHgwZSAvKiBNTUQgQWRkcmVzcyBEYXRhIHJlZ2lzdGVyICovCkBAIC0yMTg2LDcgKzIxODAsNyBAQAogI2RlZmluZSAgTUlJX1RHM19EU1BfVEFQMjZfT1BDU0lOUFQJMHgwMDA0CiAjZGVmaW5lIE1JSV9URzNfRFNQX0FBREoxQ0gwCQkweDAwMWYKICNkZWZpbmUgTUlJX1RHM19EU1BfQ0gzNFRQMgkJMHg0MDIyCi0jZGVmaW5lIE1JSV9URzNfRFNQX0NIMzRUUDJfSElCVzAxCTB4MDE3YgorI2RlZmluZSBNSUlfVEczX0RTUF9DSDM0VFAyX0hJQlcwMQkweDAxZmYKICNkZWZpbmUgTUlJX1RHM19EU1BfQUFESjFDSDMJCTB4NjAxZgogI2RlZmluZSAgTUlJX1RHM19EU1BfQUFESjFDSDNfQURDQ0tBREoJMHgwMDAyCiAjZGVmaW5lIE1JSV9URzNfRFNQX0VYUDFfSU5UX1NUQVQJMHgwZjAxCkBAIC0yMjg1LDYgKzIyNzksOCBAQAogCiAKIC8qIEFQRSByZWdpc3RlcnMuICBBY2Nlc3NpYmxlIHRocm91Z2ggQkFSMSAqLworI2RlZmluZSBURzNfQVBFX0dQSU9fTVNHCQkweDAwMDgKKyNkZWZpbmUgVEczX0FQRV9HUElPX01TR19TSElGVAkJNAogI2RlZmluZSBURzNfQVBFX0VWRU5UCQkJMHgwMDBjCiAjZGVmaW5lICBBUEVfRVZFTlRfMQkJCSAweDAwMDAwMDAxCiAjZGVmaW5lIFRHM19BUEVfTE9DS19SRVEJCTB4MDAyYwpAQCAtMjM0Nyw2ICsyMzQzLDcgQEAKIC8qIEFQRSBjb252ZW5pZW5jZSBlbnVtZXJhdGlvbnMuICovCiAjZGVmaW5lIFRHM19BUEVfTE9DS19HUkMgICAgICAgICAgICAgICAgMQogI2RlZmluZSBURzNfQVBFX0xPQ0tfTUVNICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVEczX0FQRV9MT0NLX0dQSU8gICAgICAgICAgICAgICA3CiAKICNkZWZpbmUgVEczX0VFUFJPTV9TQl9GMVIyX01CQV9PRkYJMHgxMAogCkBAIC0yODAwLDYgKzI3OTcsNyBAQAogCXN0cnVjdCB0ZzMJCQkqdHA7CiAJc3RydWN0IHRnM19od19zdGF0dXMJCSpod19zdGF0dXM7CiAKKwl1MzIJCQkJY2hrX21zaV9jbnQ7CiAJdTMyCQkJCWxhc3RfdGFnOwogCXUzMgkJCQlsYXN0X2lycV90YWc7CiAJdTMyCQkJCWludF9tYm94OwpAQCAtMjgwNyw2ICsyODA1LDcgQEAKIAogCXUzMgkJCQljb25zbWJveCBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAJdTMyCQkJCXJ4X3JjYl9wdHI7CisJdTMyCQkJCWxhc3RfcnhfY29uczsKIAl1MTYJCQkJKnJ4X3JjYl9wcm9kX2lkeDsKIAlzdHJ1Y3QgdGczX3J4X3Byb2RyaW5nX3NldAlwcm9kcmluZzsKIAlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjCSpyeF9yY2I7CkBAIC0yODE0LDYgKzI4MTMsNyBAQAogCXUzMgkJCQl0eF9wcm9kCV9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAl1MzIJCQkJdHhfY29uczsKIAl1MzIJCQkJdHhfcGVuZGluZzsKKwl1MzIJCQkJbGFzdF90eF9jb25zOwogCXUzMgkJCQlwcm9kbWJveDsKIAlzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjCSp0eF9yaW5nOwogCXN0cnVjdCByaW5nX2luZm8JCSp0eF9idWZmZXJzOwpAQCAtMjg2Miw3ICsyODYyLDcgQEAKIAlURzNfRkxBR19JU181Nzg4LAogCVRHM19GTEFHX01BWF9SWFBFTkRfNjQsCiAJVEczX0ZMQUdfVFNPX0NBUEFCTEUsCi0JVEczX0ZMQUdfUENJX0VYUFJFU1MsCisJVEczX0ZMQUdfUENJX0VYUFJFU1MsIC8qIEJDTTU3ODUgKyBwY2lfaXNfcGNpZSgpICovCiAJVEczX0ZMQUdfQVNGX05FV19IQU5EU0hBS0UsCiAJVEczX0ZMQUdfSFdfQVVUT05FRywKIAlURzNfRkxBR19JU19OSUMsCkBAIC0yODkzLDggKzI4OTMsNiBAQAogCVRHM19GTEFHX05PX05WUkFNLAogCVRHM19GTEFHX0VOQUJMRV9SU1MsCiAJVEczX0ZMQUdfRU5BQkxFX1RTUywKLQlURzNfRkxBR180R19ETUFfQk5EUllfQlVHLAotCVRHM19GTEFHXzQwQklUX0RNQV9MSU1JVF9CVUcsCiAJVEczX0ZMQUdfU0hPUlRfRE1BX0JVRywKIAlURzNfRkxBR19VU0VfSlVNQk9fQkRGTEFHLAogCVRHM19GTEFHX0wxUExMUERfRU4sCkBAIC0zMDI3LDEyICszMDI1LDEwIEBACiAJdTgJCQkJcGNpX2NhY2hlbGluZV9zejsKIAl1OAkJCQlwY2lfbGF0X3RpbWVyOwogCisJaW50CQkJCXBjaV9mbjsKIAlpbnQJCQkJcG1fY2FwOwogCWludAkJCQltc2lfY2FwOwotCXVuaW9uIHsKIAlpbnQJCQkJcGNpeF9jYXA7Ci0JaW50CQkJCXBjaWVfY2FwOwotCX07CiAJaW50CQkJCXBjaWVfcmVhZHJxOwogCiAJc3RydWN0IG1paV9idXMJCQkqbWRpb19idXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90bGFuLmMgYi9kcml2ZXJzL25ldC90bGFuLmMKaW5kZXggYWNlNjQwNC4uMTQ1ODcxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3RsYW4uYwpAQCAtMjksOCArMjksMTAgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9laXNhLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTkuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jCmluZGV4IGZmMzJiZWYuLmI2MTYyZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jCkBAIC0zMDQsNyArMzA0LDcgQEAKIAogCWlmICgoaSA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwiM2MzNTkiKSkpIHsgCiAJCXJldHVybiBpIDsgCi0JfSA7IAorCX0KIAogCS8qIAogCSAqIEFsbG93aW5nIGluaXRfdHJkZXYgdG8gYWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSB3aWxsIGFsaWduCkBAIC0xNzczLDcgKzE3NzMsOSBAQAogCWlmIChyZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSAhPSAwKSB7ICAvKiBNaXNyIG5vdCBjbGVhciAqLwogCQlmb3IgKGk9MDsgaTw2OyBpKyspIHsgCiAJCQl3cml0ZWwoTUVNX0JZVEVfUkVBRCB8IDB4REZGRTAgfCBpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKLQkJCXdoaWxlIChyZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSAhPSAwICkge30gOyAvKiBFbXB0eSBMb29wICovCisJCQl3aGlsZSAocmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgIT0gMCkgeworCQkJCTsJLyogRW1wdHkgTG9vcCAqLworCQkJfQogCQl9IAogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2libXRyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYwppbmRleCA0Nzg2NDk3Li5lMjU3YTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYwpAQCAtMTIzLDYgKzEyMyw3IEBACiAvKiBzb21lIDk1IE9TIHNlbmQgbWFueSBub24gVUkgZnJhbWU7IHRoaXMgYWxsb3cgcmVtb3ZpbmcgdGhlIHdhcm5pbmcgKi8KICNkZWZpbmUgVFJfRklMVEVSTk9OVUkJMQogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KQEAgLTE3Nyw3ICsxNzgsNyBAQAogCWNhc2UgMHhEOiByZXR1cm4gIjE2LzQgQWRhcHRlci9BIChzaG9ydCkgfCAxNi80IElTQS0xNiBBZGFwdGVyIjsKIAljYXNlIDB4QzogcmV0dXJuICJBdXRvIDE2LzQgQWRhcHRlciI7CiAJZGVmYXVsdDogcmV0dXJuICJhZGFwdGVyICh1bmtub3duIHR5cGUpIjsKLQl9OworCX0KIH07CiAKICNkZWZpbmUgVFJDX0lOSVQgMHgwMQkJLyogIFRyYWNlIGluaXRpYWxpemF0aW9uICYgUFJPQkVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuYwppbmRleCAyYmVkYzBhLi42MTUzY2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9tYWRnZW1jLmMKQEAgLTQxOCw3ICs0MTgsNyBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCi0JZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCWRldiA9IGRldl9pZDsKIAogCS8qIE1ha2Ugc3VyZSBpdHMgcmVhbGx5IHVzLiAtLSB0aGUgTWFkZ2Ugd2F5ICovCiAJcGVuZGluZyA9IGluYihkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90c2kxMDhfZXRoLmMgYi9kcml2ZXJzL25ldC90c2kxMDhfZXRoLmMKaW5kZXggNWM2MzNhMy4uNjRjYjlhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHNpMTA4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3RzaTEwOF9ldGguYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKaW5kZXggZTJmNjkyMy4uY2U5MGVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKaW5kZXggZWZhYTFkNi4uOTU5YjQxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCkBAIC0xODY4LDE0ICsxODY4LDEzIEBACiAJICAgIGkgPSBERTRYNV9QS1RfU1RBVF9TWjsKIAl9CiAgICAgfQotICAgIGlmIChidWZbMF0gJiAweDAxKSB7ICAgICAgICAgIC8qIE11bHRpY2FzdC9Ccm9hZGNhc3QgKi8KLSAgICAgICAgaWYgKCgqKHMzMiAqKSZidWZbMF0gPT0gLTEpICYmICgqKHMxNiAqKSZidWZbNF0gPT0gLTEpKSB7CisgICAgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGJ1ZikpIHsKKyAgICAgICAgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGJ1ZikpIHsKIAkgICAgbHAtPnBrdFN0YXRzLmJyb2FkY2FzdCsrOwogCX0gZWxzZSB7CiAJICAgIGxwLT5wa3RTdGF0cy5tdWx0aWNhc3QrKzsKIAl9Ci0gICAgfSBlbHNlIGlmICgoKihzMzIgKikmYnVmWzBdID09ICooczMyICopJmRldi0+ZGV2X2FkZHJbMF0pICYmCi0JICAgICAgICgqKHMxNiAqKSZidWZbNF0gPT0gKihzMTYgKikmZGV2LT5kZXZfYWRkcls0XSkpIHsKKyAgICB9IGVsc2UgaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihidWYsIGRldi0+ZGV2X2FkZHIpID09IDApIHsKICAgICAgICAgbHAtPnBrdFN0YXRzLnVuaWNhc3QrKzsKICAgICB9CiAKQEAgLTE5NjQsOSArMTk2Myw3IEBACiAJb21yIHw9IE9NUl9QTTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhc3MgYWxsIG11bHRpY2FzdHMgKi8KICAgICB9IGVsc2UgaWYgKGxwLT5zZXR1cF9mID09IEhBU0hfUEVSRikgeyAgIC8qIEhhc2ggRmlsdGVyaW5nICovCiAJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewotCSAgICBhZGRycyA9IGhhLT5hZGRyOwotCSAgICBpZiAoKCphZGRycyAmIDB4MDEpID09IDEpIHsgICAgICAvKiBtdWx0aWNhc3QgYWRkcmVzcz8gKi8KLQkJY3JjID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBhZGRycyk7CisJCWNyYyA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgaGEtPmFkZHIpOwogCQloYXNoY29kZSA9IGNyYyAmIEhBU0hfQklUUzsgIC8qIGhhc2hjb2RlIGlzIDkgTFNiIG9mIENSQyAqLwogCiAJCWJ5dGUgPSBoYXNoY29kZSA+PiAzOyAgICAgICAgLyogYml0WzMtOF0gLT4gYnl0ZSBpbiBmaWx0ZXIgKi8KQEAgLTE5NzcsNyArMTk3NCw2IEBACiAJCSAgICBieXRlIC09IDE7CiAJCX0KIAkJbHAtPnNldHVwX2ZyYW1lW2J5dGVdIHw9IGJpdDsKLQkgICAgfQogCX0KICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmZlY3QgZmlsdGVyaW5nICovCiAJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCmluZGV4IDQ2ODUxMjcuLjlhMjFjYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKQEAgLTg3OSw3ICs4NzksNiBAQAogCXR4cHRyID0gZGItPnR4X3JlbW92ZV9wdHI7CiAJd2hpbGUoZGItPnR4X3BhY2tldF9jbnQpIHsKIAkJdGRlczAgPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczApOwotCQlwcl9kZWJ1ZygidGRlczA9JXhcbiIsIHRkZXMwKTsKIAkJaWYgKHRkZXMwICYgMHg4MDAwMDAwMCkKIAkJCWJyZWFrOwogCkBAIC04ODksNyArODg4LDYgQEAKIAogCQkvKiBUcmFuc21pdCBzdGF0aXN0aWMgY291bnRlciAqLwogCQlpZiAoIHRkZXMwICE9IDB4N2ZmZmZmZmYgKSB7Ci0JCQlwcl9kZWJ1ZygidGRlczA9JXhcbiIsIHRkZXMwKTsKIAkJCWRldi0+c3RhdHMuY29sbGlzaW9ucyArPSAodGRlczAgPj4gMykgJiAweGY7CiAJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlMzJfdG9fY3B1KHR4cHRyLT50ZGVzMSkgJiAweDdmZjsKIAkJCWlmICh0ZGVzMCAmIFRERVMwX0VSUl9NQVNLKSB7CkBAIC05ODYsNyArOTg0LDYgQEAKIAkJCS8qIGVycm9yIHN1bW1hcnkgYml0IGNoZWNrICovCiAJCQlpZiAocmRlczAgJiAweDgwMDApIHsKIAkJCQkvKiBUaGlzIGlzIGEgZXJyb3IgcGFja2V0ICovCi0JCQkJcHJfZGVidWcoInJkZXMwOiAleFxuIiwgcmRlczApOwogCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJaWYgKHJkZXMwICYgMSkKIAkJCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwpAQCAtMTYzOCw3ICsxNjM1LDYgQEAKIAkJZWxzZSAJCQkJLyogRE05MTAyL0RNOTEwMkEgKi8KIAkJCXBoeV9tb2RlID0gcGh5X3JlYWQoZGItPmlvYWRkciwKIAkJCQkgICAgZGItPnBoeV9hZGRyLCAxNywgZGItPmNoaXBfaWQpICYgMHhmMDAwOwotCQlwcl9kZWJ1ZygiUGh5X21vZGUgJXhcbiIsIHBoeV9tb2RlKTsKIAkJc3dpdGNoIChwaHlfbW9kZSkgewogCQljYXNlIDB4MTAwMDogZGItPm9wX21vZGUgPSBETUZFXzEwTUhGOyBicmVhazsKIAkJY2FzZSAweDIwMDA6IGRiLT5vcF9tb2RlID0gRE1GRV8xME1GRDsgYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9wbmljLmMgYi9kcml2ZXJzL25ldC90dWxpcC9wbmljLmMKaW5kZXggYWE0ZDlkYS4uNTJkODk4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvcG5pYy5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMuYwpAQCAtMTMsNiArMTMsNyBAQAogCVBsZWFzZSBzdWJtaXQgYnVncyB0byBodHRwOi8vYnVnemlsbGEua2VybmVsLm9yZy8gLgogKi8KIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlICJ0dWxpcC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCmluZGV4IDgyZjg3NjQuLjEyNDY5OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAidHVsaXAuaCIKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVuLmMgYi9kcml2ZXJzL25ldC90dW4uYwppbmRleCA3NGU5NDA1Li45YTZiMzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dW4uYworKysgYi9kcml2ZXJzL25ldC90dW4uYwpAQCAtNDYwLDcgKzQ2MCwyMyBAQAogCiAJcmV0dXJuIChmZWF0dXJlcyAmIHR1bi0+c2V0X2ZlYXR1cmVzKSB8IChmZWF0dXJlcyAmIH5UVU5fVVNFUl9GRUFUVVJFUyk7CiB9Ci0KKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgdHVuX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qCisJICogVHVuIG9ubHkgcmVjZWl2ZXMgZnJhbWVzIHdoZW46CisJICogMSkgdGhlIGNoYXIgZGV2aWNlIGVuZHBvaW50IGdldHMgZGF0YSBmcm9tIHVzZXIgc3BhY2UKKwkgKiAyKSB0aGUgdHVuIHNvY2tldCBnZXRzIGEgc2VuZG1zZyBjYWxsIGZyb20gdXNlciBzcGFjZQorCSAqIFNpbmNlIGJvdGggb2YgdGhvc2UgYXJlIHN5bmNyb25vdXMgb3BlcmF0aW9ucywgd2UgYXJlIGd1YXJhbnRlZWQKKwkgKiBuZXZlciB0byBoYXZlIHBlbmRpbmcgZGF0YSB3aGVuIHdlIHBvbGwgZm9yIGl0CisJICogc28gdGhlcmVzIG5vdGhpbmcgdG8gZG8gaGVyZSBidXQgcmV0dXJuLgorCSAqIFdlIG5lZWQgdGhpcyB0aG91Z2ggc28gbmV0cG9sbCByZWNvZ25pemVzIHVzIGFzIGFuIGludGVyZmFjZSB0aGF0CisJICogc3VwcG9ydHMgcG9sbGluZywgd2hpY2ggZW5hYmxlcyBicmlkZ2UgZGV2aWNlcyBpbiB2aXJ0IHNldHVwcyB0bworCSAqIHN0aWxsIHVzZSBuZXRjb25zb2xlCisJICovCisJcmV0dXJuOworfQorI2VuZGlmCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHR1bl9uZXRkZXZfb3BzID0gewogCS5uZG9fdW5pbml0CQk9IHR1bl9uZXRfdW5pbml0LAogCS5uZG9fb3BlbgkJPSB0dW5fbmV0X29wZW4sCkBAIC00NjgsNiArNDg0LDkgQEAKIAkubmRvX3N0YXJ0X3htaXQJCT0gdHVuX25ldF94bWl0LAogCS5uZG9fY2hhbmdlX210dQkJPSB0dW5fbmV0X2NoYW5nZV9tdHUsCiAJLm5kb19maXhfZmVhdHVyZXMJPSB0dW5fbmV0X2ZpeF9mZWF0dXJlcywKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gdHVuX3BvbGxfY29udHJvbGxlciwKKyNlbmRpZgogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB0YXBfbmV0ZGV2X29wcyA9IHsKQEAgLTQ4MCw2ICs0OTksOSBAQAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gdHVuX25ldF9tY2xpc3QsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlcgk9IHR1bl9wb2xsX2NvbnRyb2xsZXIsCisjZW5kaWYKIH07CiAKIC8qIEluaXRpYWxpemUgbmV0IGRldmljZS4gKi8KQEAgLTU1MCw5ICs1NzIsOSBAQAogCiAvKiBwcmVwYWQgaXMgdGhlIGFtb3VudCB0byByZXNlcnZlIGF0IGZyb250LiAgbGVuIGlzIGxlbmd0aCBhZnRlciB0aGF0LgogICogbGluZWFyIGlzIGEgaGludCBhcyB0byBob3cgbXVjaCB0byBjb3B5ICh1c3VhbGx5IGhlYWRlcnMpLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdHVuX2FsbG9jX3NrYihzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLAotCQkJCQkgICAgc2l6ZV90IHByZXBhZCwgc2l6ZV90IGxlbiwKLQkJCQkJICAgIHNpemVfdCBsaW5lYXIsIGludCBub2Jsb2NrKQorc3RhdGljIHN0cnVjdCBza19idWZmICp0dW5fYWxsb2Nfc2tiKHN0cnVjdCB0dW5fc3RydWN0ICp0dW4sCisJCQkJICAgICBzaXplX3QgcHJlcGFkLCBzaXplX3QgbGVuLAorCQkJCSAgICAgc2l6ZV90IGxpbmVhciwgaW50IG5vYmxvY2spCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gdHVuLT5zb2NrZXQuc2s7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTU3OCwxMyArNjAwLDEzIEBACiB9CiAKIC8qIEdldCBwYWNrZXQgZnJvbSB1c2VyIHNwYWNlIGJ1ZmZlciAqLwotc3RhdGljIF9faW5saW5lX18gc3NpemVfdCB0dW5fZ2V0X3VzZXIoc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGlvdmVjICppdiwgc2l6ZV90IGNvdW50LAotCQkJCSAgICAgICBpbnQgbm9ibG9jaykKK3N0YXRpYyBzc2l6ZV90IHR1bl9nZXRfdXNlcihzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaXYsIHNpemVfdCBjb3VudCwKKwkJCSAgICBpbnQgbm9ibG9jaykKIHsKIAlzdHJ1Y3QgdHVuX3BpIHBpID0geyAwLCBjcHVfdG9fYmUxNihFVEhfUF9JUCkgfTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXNpemVfdCBsZW4gPSBjb3VudCwgYWxpZ24gPSAwOworCXNpemVfdCBsZW4gPSBjb3VudCwgYWxpZ24gPSBORVRfU0tCX1BBRDsKIAlzdHJ1Y3QgdmlydGlvX25ldF9oZHIgZ3NvID0geyAwIH07CiAJaW50IG9mZnNldCA9IDA7CiAKQEAgLTYxNCw3ICs2MzYsNyBAQAogCX0KIAogCWlmICgodHVuLT5mbGFncyAmIFRVTl9UWVBFX01BU0spID09IFRVTl9UQVBfREVWKSB7Ci0JCWFsaWduID0gTkVUX0lQX0FMSUdOOworCQlhbGlnbiArPSBORVRfSVBfQUxJR047CiAJCWlmICh1bmxpa2VseShsZW4gPCBFVEhfSExFTiB8fAogCQkJICAgICAoZ3NvLmhkcl9sZW4gJiYgZ3NvLmhkcl9sZW4gPCBFVEhfSExFTikpKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC02NjYsNyArNjg4LDcgQEAKIAljYXNlIFRVTl9UQVBfREVWOgogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tPmRldik7CiAJCWJyZWFrOwotCX07CisJfQogCiAJaWYgKGdzby5nc29fdHlwZSAhPSBWSVJUSU9fTkVUX0hEUl9HU09fTk9ORSkgewogCQlwcl9kZWJ1ZygiR1NPIVxuIik7CkBAIC03MjksOSArNzUxLDkgQEAKIH0KIAogLyogUHV0IHBhY2tldCB0byB0aGUgdXNlciBzcGFjZSBidWZmZXIgKi8KLXN0YXRpYyBfX2lubGluZV9fIHNzaXplX3QgdHVuX3B1dF91c2VyKHN0cnVjdCB0dW5fc3RydWN0ICp0dW4sCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaXYsIGludCBsZW4pCitzdGF0aWMgc3NpemVfdCB0dW5fcHV0X3VzZXIoc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biwKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaXYsIGludCBsZW4pCiB7CiAJc3RydWN0IHR1bl9waSBwaSA9IHsgMCwgc2tiLT5wcm90b2NvbCB9OwogCXNzaXplX3QgdG90YWwgPSAwOwpAQCAtNzg4LDYgKzgxMCw4IEBACiAJCQlnc28uZmxhZ3MgPSBWSVJUSU9fTkVUX0hEUl9GX05FRURTX0NTVU07CiAJCQlnc28uY3N1bV9zdGFydCA9IHNrYl9jaGVja3N1bV9zdGFydF9vZmZzZXQoc2tiKTsKIAkJCWdzby5jc3VtX29mZnNldCA9IHNrYi0+Y3N1bV9vZmZzZXQ7CisJCX0gZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpIHsKKwkJCWdzby5mbGFncyA9IFZJUlRJT19ORVRfSERSX0ZfREFUQV9WQUxJRDsKIAkJfSAvKiBlbHNlIGV2ZXJ5dGhpbmcgaXMgemVybyAqLwogCiAJCWlmICh1bmxpa2VseShtZW1jcHlfdG9pb3ZlY2VuZChpdiwgKHZvaWQgKikmZ3NvLCB0b3RhbCwKQEAgLTgxNyw3ICs4NDEsOCBAQAogCiAJdHVuX2RlYnVnKEtFUk5fSU5GTywgdHVuLCAidHVuX2Nocl9yZWFkXG4iKTsKIAotCWFkZF93YWl0X3F1ZXVlKCZ0dW4tPndxLndhaXQsICZ3YWl0KTsKKwlpZiAodW5saWtlbHkoIW5vYmxvY2spKQorCQlhZGRfd2FpdF9xdWV1ZSgmdHVuLT53cS53YWl0LCAmd2FpdCk7CiAJd2hpbGUgKGxlbikgewogCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKIApAQCAtODQ4LDcgKzg3Myw4IEBACiAJfQogCiAJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnR1bi0+d3Eud2FpdCwgJndhaXQpOworCWlmICh1bmxpa2VseSghbm9ibG9jaykpCisJCXJlbW92ZV93YWl0X3F1ZXVlKCZ0dW4tPndxLndhaXQsICZ3YWl0KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90eXBob29uLmMgYi9kcml2ZXJzL25ldC90eXBob29uLmMKaW5kZXggM2RlNDI4My4uMWQ1MDkxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwpAQCAtMjM2Nyw3ICsyMzY3LDcgQEAKIAogCWRldi0+aXJxID0gcGRldi0+aXJxOwogCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl0cC0+c2hhcmVkID0gKHN0cnVjdCB0eXBob29uX3NoYXJlZCAqKSBzaGFyZWQ7CisJdHAtPnNoYXJlZCA9IHNoYXJlZDsKIAl0cC0+c2hhcmVkX2RtYSA9IHNoYXJlZF9kbWE7CiAJdHAtPnBkZXYgPSBwZGV2OwogCXRwLT50eF9wZGV2ID0gcGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCmluZGV4IGVmMDQxMDUuLmQzNDY1YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwpAQCAtMjAzMCwxMSArMjAzMCw2IEBACiAJCQlvdXRfYmUzMigmcF84Mnh4X2FkZHJfZmlsdC0+Z2FkZHJfbCwgMHgwKTsKIAogCQkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewotCQkJCS8qIE9ubHkgc3VwcG9ydCBncm91cCBtdWx0aWNhc3QgZm9yIG5vdy4KLQkJCQkgKi8KLQkJCQlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhhLT5hZGRyKSkKLQkJCQkJY29udGludWU7Ci0KIAkJCQkvKiBBc2sgQ1BNIHRvIHJ1biBDUkMgYW5kIHNldCBiaXQgaW4KIAkJCQkgKiBmaWx0ZXIgbWFzay4KIAkJCQkgKi8KQEAgLTMxNjUsNiArMzE2MCw4IEBACiAKIAl1Z2V0aC0+dHhCZFt0eFFdID0gYmQ7CiAKKwlza2JfdHhfdGltZXN0YW1wKHNrYik7CisKIAlpZiAodWdldGgtPnBfc2NoZWR1bGVyKSB7CiAJCXVnZXRoLT5jcHVjb3VudFt0eFFdKys7CiAJCS8qIEluZGljYXRlIHRvIFFFIHRoYXQgdGhlcmUgYXJlIG1vcmUgVHggYmRzIHJlYWR5IGZvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL0tjb25maWcgYi9kcml2ZXJzL25ldC91c2IvS2NvbmZpZwppbmRleCA5ZDRmOTExLi44NGQ0NjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC91c2IvS2NvbmZpZwpAQCAtMzg1LDYgKzM4NSwxNiBAQAogCSAgcm91dGVyIHdpdGggVVNCIGV0aGVybmV0IHBvcnQuIFRoaXMgZHJpdmVyIGlzIGZvciByb3V0ZXJzIG9ubHksCiAJICBpdCB3aWxsIG5vdCB3b3JrIHdpdGggQURTTCBtb2RlbXMgKHVzZSBjeGFjcnUgZHJpdmVyIGluc3RlYWQpLgogCitjb25maWcgVVNCX05FVF9LQUxNSUEKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBLYWxtaWEgYmFzZWQgTFRFIFVTQiBtb2RlbSIKKwlkZXBlbmRzIG9uIFVTQl9VU0JORVQKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBTYW1zdW5nIEthbG1pYSBiYXNlZCBVU0IgbW9kZW0KKwkgIGFzIFNhbXN1bmcgR1QtQjM3MzAuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGthbG1pYS4KKwogY29uZmlnIFVTQl9IU08KIAl0cmlzdGF0ZSAiT3B0aW9uIFVTQiBIaWdoIFNwZWVkIE1vYmlsZSBEZXZpY2VzIgogCWRlcGVuZHMgb24gVVNCICYmIFJGS0lMTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvdXNiL01ha2VmaWxlCmluZGV4IGM3ZWM4YTUuLmMyMDNmYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC91c2IvTWFrZWZpbGUKQEAgLTIzLDYgKzIzLDcgQEAKIG9iai0kKENPTkZJR19VU0JfVVNCTkVUKQkrPSB1c2JuZXQubwogb2JqLSQoQ09ORklHX1VTQl9ORVRfSU5UNTFYMSkJKz0gaW50NTF4MS5vCiBvYmotJChDT05GSUdfVVNCX0NEQ19QSE9ORVQpCSs9IGNkYy1waG9uZXQubworb2JqLSQoQ09ORklHX1VTQl9ORVRfS0FMTUlBKQkrPSBrYWxtaWEubwogb2JqLSQoQ09ORklHX1VTQl9JUEhFVEgpCSs9IGlwaGV0aC5vCiBvYmotJChDT05GSUdfVVNCX1NJRVJSQV9ORVQpCSs9IHNpZXJyYV9uZXQubwogb2JqLSQoQ09ORklHX1VTQl9ORVRfQ1g4MjMxMF9FVEgpCSs9IGN4ODIzMTBfZXRoLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9hc2l4LmMgYi9kcml2ZXJzL25ldC91c2IvYXNpeC5jCmluZGV4IDY5OThhYTYuLjUyNTAyODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9hc2l4LmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2FzaXguYwpAQCAtMTUwMiw2ICsxNTAyLDEwIEBACiAJVVNCX0RFVklDRSAoMHgwNGYxLCAweDMwMDgpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3eF9pbmZvLAogfSwgeworCS8vIEFTSVggQVg4ODc3MkIgMTAvMTAwCisJVVNCX0RFVklDRSAoMHgwYjk1LCAweDc3MmIpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODc3Ml9pbmZvLAorfSwgewogCS8vIEFTSVggQVg4ODc3MiAxMC8xMDAKIAlVU0JfREVWSUNFICgweDBiOTUsIDB4NzcyMCksCiAJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZheDg4NzcyX2luZm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvY2RjLXBob25ldC5jIGIvZHJpdmVycy9uZXQvdXNiL2NkYy1waG9uZXQuYwppbmRleCBmOTY3OTEzLi5hNjBkMDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvY2RjLXBob25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jZGMtcGhvbmV0LmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMgYi9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jCmluZGV4IGYzM2NhNmEuLmZkNjIyYTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMKQEAgLTQ3LDcgKzQ3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvaHNvLmMgYi9kcml2ZXJzL25ldC91c2IvaHNvLmMKaW5kZXggMzg3Y2E0My4uMzA0ZmU3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2hzby5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9oc28uYwpAQCAtMjQyMSwxMCArMjQyMSw4IEBACiAKIAlyZW1vdmVfbmV0X2RldmljZShoc29fbmV0LT5wYXJlbnQpOwogCi0JaWYgKGhzb19uZXQtPm5ldCkgeworCWlmIChoc29fbmV0LT5uZXQpCiAJCXVucmVnaXN0ZXJfbmV0ZGV2KGhzb19uZXQtPm5ldCk7Ci0JCWZyZWVfbmV0ZGV2KGhzb19uZXQtPm5ldCk7Ci0JfQogCiAJLyogc3RhcnQgZnJlZWluZyAqLwogCWZvciAoaSA9IDA7IGkgPCBNVVhfQlVMS19SWF9CVUZfQ09VTlQ7IGkrKykgewpAQCAtMjQzNiw2ICsyNDM0LDkgQEAKIAlrZnJlZShoc29fbmV0LT5tdXhfYnVsa190eF9idWYpOwogCWhzb19uZXQtPm11eF9idWxrX3R4X2J1ZiA9IE5VTEw7CiAKKwlpZiAoaHNvX25ldC0+bmV0KQorCQlmcmVlX25ldGRldihoc29fbmV0LT5uZXQpOworCiAJa2ZyZWUoaHNvX2Rldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9pcGhldGguYyBiL2RyaXZlcnMvbmV0L3VzYi9pcGhldGguYwppbmRleCA4MTEyNmZmLi4xNTc3MmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvaXBoZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2lwaGV0aC5jCkBAIC00MDksMTIgKzQwOSw2IEBACiAJdXNiX3VubGlua191cmIoZGV2LT50eF91cmIpOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlwaGV0aF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQotewotCXN0cnVjdCBpcGhldGhfZGV2aWNlICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwotCXJldHVybiAmZGV2LT5uZXQtPnN0YXRzOwotfQotCiBzdGF0aWMgdTMyIGlwaGV0aF9ldGh0b29sX29wX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiAJc3RydWN0IGlwaGV0aF9kZXZpY2UgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CkBAIC00MjYsMTEgKzQyMCwxMCBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpcGhldGhfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4gPSAmaXBoZXRoX29wZW4sCi0JLm5kb19zdG9wID0gJmlwaGV0aF9jbG9zZSwKLQkubmRvX3N0YXJ0X3htaXQgPSAmaXBoZXRoX3R4LAotCS5uZG9fdHhfdGltZW91dCA9ICZpcGhldGhfdHhfdGltZW91dCwKLQkubmRvX2dldF9zdGF0cyA9ICZpcGhldGhfc3RhdHMsCisJLm5kb19vcGVuID0gaXBoZXRoX29wZW4sCisJLm5kb19zdG9wID0gaXBoZXRoX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdCA9IGlwaGV0aF90eCwKKwkubmRvX3R4X3RpbWVvdXQgPSBpcGhldGhfdHhfdGltZW91dCwKIH07CiAKIHN0YXRpYyBpbnQgaXBoZXRoX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2thbG1pYS5jIGIvZHJpdmVycy9uZXQvdXNiL2thbG1pYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNmQwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC91c2Iva2FsbWlhLmMKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBVU0IgbmV0d29yayBpbnRlcmZhY2UgZHJpdmVyIGZvciBTYW1zdW5nIEthbG1pYSBiYXNlZCBMVEUgVVNCIG1vZGVtIGxpa2UgdGhlCisgKiBTYW1zdW5nIEdULUIzNzMwIGFuZCBHVC1CMzcxMC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTWFyaXVzIEJqb2VybnN0YWQgS290c2JhayA8bWFyaXVzQGtvdHNiYWsuY29tPgorICoKKyAqIFNwb25zb3JlZCBieSBRdWlja2xpbmsgVmlkZW8gRGlzdHJpYnV0aW9uIFNlcnZpY2VzIEx0ZC4KKyAqCisgKiBCYXNlZCBvbiB0aGUgY2RjX2VlbSBtb2R1bGUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvY2RjLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3VzYm5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorCisvKgorICogVGhlIFNhbXN1bmcgS2FsbWlhIGJhc2VkIExURSBVU0IgbW9kZW1zIGhhdmUgYSBDREMgQUNNIHBvcnQgZm9yIG1vZGVtIGNvbnRyb2wKKyAqIGhhbmRsZWQgYnkgdGhlICJvcHRpb24iIG1vZHVsZSBhbmQgYW4gZXRoZXJuZXQgZGF0YSBwb3J0IGhhbmRsZWQgYnkgdGhpcworICogbW9kdWxlLgorICoKKyAqIFRoZSBzdGljayBtdXN0IGZpcnN0IGJlIHN3aXRjaGVkIGludG8gbW9kZW0gbW9kZSBieSB1c2JfbW9kZXN3aXRjaAorICogb3Igc2ltaWxhciB0b29sLiBUaGVuIHRoZSBtb2RlbSBnZXRzIHNlbnQgdHdvIGluaXRpYWxpemF0aW9uIHBhY2tldHMgYnkKKyAqIHRoaXMgbW9kdWxlLCB3aGljaCBnaXZlcyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGRldmljZS4gVXNlciBzcGFjZSBjYW4gdGhlbgorICogY29ubmVjdCB0aGUgbW9kZW0gdXNpbmcgQVQgY29tbWFuZHMgdGhyb3VnaCB0aGUgQUNNIHBvcnQgYW5kIHRoZW4gdXNlCisgKiBESENQIG9uIHRoZSBuZXR3b3JrIGludGVyZmFjZSBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlLiBOZXR3b3JrIHBhY2tldHMgYXJlCisgKiBzZW50IHRvIGFuZCBmcm9tIHRoZSBtb2RlbSBpbiBhIHByb3ByaWV0YXJ5IGZvcm1hdCBkaXNjb3ZlcmVkIGFmdGVyIHdhdGNoaW5nCisgKiB0aGUgYmVoYXZpb3Igb2YgdGhlIHdpbmRvd3MgZHJpdmVyIGZvciB0aGUgbW9kZW0uCisgKgorICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlIG9mIHRoZSBtb2RlbSBpcyBhdmFpbGFibGUgaW4gdXNiX21vZGVzd2l0Y2gKKyAqIGZvcnVtIGFuZCB0aGUgcHJvamVjdCBwYWdlOgorICoKKyAqIGh0dHA6Ly93d3cuZHJhaXNiZXJnaG9mLmRlL3VzYl9tb2Rlc3dpdGNoL2JiL3ZpZXd0b3BpYy5waHA/dD00NjUKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ta290c2Jhay9TYW1zdW5nLUdULUIzNzMwLWxpbnV4LWRyaXZlcgorICovCisKKy8qICNkZWZpbmUJREVCVUcgKi8KKy8qICNkZWZpbmUJVkVSQk9TRSAqLworCisjZGVmaW5lIEtBTE1JQV9IRUFERVJfTEVOR1RIIDYKKyNkZWZpbmUgS0FMTUlBX0FMSUdOX1NJWkUgNAorI2RlZmluZSBLQUxNSUFfVVNCX1RJTUVPVVQgMTAwMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludAora2FsbWlhX3NlbmRfaW5pdF9wYWNrZXQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCAqaW5pdF9tc2csIHU4IGluaXRfbXNnX2xlbiwKKwl1OCAqYnVmZmVyLCB1OCBleHBlY3RlZF9sZW4pCit7CisJaW50IGFjdF9sZW47CisJaW50IHN0YXR1czsKKworCW5ldGRldl9kYmcoZGV2LT5uZXQsICJTZW5kaW5nIGluaXQgcGFja2V0Iik7CisKKwlzdGF0dXMgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LCAweDAyKSwKKwkJaW5pdF9tc2csIGluaXRfbXNnX2xlbiwgJmFjdF9sZW4sIEtBTE1JQV9VU0JfVElNRU9VVCk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCW5ldGRldl9lcnIoZGV2LT5uZXQsCisJCQkiRXJyb3Igc2VuZGluZyBpbml0IHBhY2tldC4gU3RhdHVzICVpLCBsZW5ndGggJWlcbiIsCisJCQlzdGF0dXMsIGFjdF9sZW4pOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwllbHNlIGlmIChhY3RfbGVuICE9IGluaXRfbXNnX2xlbikgeworCQluZXRkZXZfZXJyKGRldi0+bmV0LAorCQkJIkRpZCBub3Qgc2VuZCBhbGwgb2YgaW5pdCBwYWNrZXQuIEJ5dGVzIHNlbnQ6ICVpIiwKKwkJCWFjdF9sZW4pOworCX0KKwllbHNlIHsKKwkJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlN1Y2Nlc3NmdWxseSBzZW50IGluaXQgcGFja2V0LiIpOworCX0KKworCXN0YXR1cyA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIDB4ODEpLAorCQlidWZmZXIsIGV4cGVjdGVkX2xlbiwgJmFjdF9sZW4sIEtBTE1JQV9VU0JfVElNRU9VVCk7CisKKwlpZiAoc3RhdHVzICE9IDApCisJCW5ldGRldl9lcnIoZGV2LT5uZXQsCisJCQkiRXJyb3IgcmVjZWl2aW5nIGluaXQgcmVzdWx0LiBTdGF0dXMgJWksIGxlbmd0aCAlaVxuIiwKKwkJCXN0YXR1cywgYWN0X2xlbik7CisJZWxzZSBpZiAoYWN0X2xlbiAhPSBleHBlY3RlZF9sZW4pCisJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJVbmV4cGVjdGVkIGluaXQgcmVzdWx0IGxlbmd0aDogJWlcbiIsCisJCQlhY3RfbGVuKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK2thbG1pYV9pbml0X2FuZF9nZXRfZXRoZXJuZXRfYWRkcihzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4ICpldGhlcm5ldF9hZGRyKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGluaXRfbXNnXzFbXSA9CisJCXsgMHg1NywgMHg1MCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwKKwkJMHgwMCwgMHgwMCB9OworCXN0YXRpYyBjb25zdCBjaGFyIGluaXRfbXNnXzJbXSA9CisJCXsgMHg1NywgMHg1MCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhmNCwKKwkJMHgwMCwgMHgwMCB9OworCXN0YXRpYyBjb25zdCBpbnQgYnVmbGVuID0gMjg7CisJY2hhciAqdXNiX2J1ZjsKKwlpbnQgc3RhdHVzOworCisJdXNiX2J1ZiA9IGttYWxsb2MoYnVmbGVuLCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2JfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweSh1c2JfYnVmLCBpbml0X21zZ18xLCAxMik7CisJc3RhdHVzID0ga2FsbWlhX3NlbmRfaW5pdF9wYWNrZXQoZGV2LCB1c2JfYnVmLCBzaXplb2YoaW5pdF9tc2dfMSkKKwkJLyBzaXplb2YoaW5pdF9tc2dfMVswXSksIHVzYl9idWYsIDI0KTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiBzdGF0dXM7CisKKwltZW1jcHkodXNiX2J1ZiwgaW5pdF9tc2dfMiwgMTIpOworCXN0YXR1cyA9IGthbG1pYV9zZW5kX2luaXRfcGFja2V0KGRldiwgdXNiX2J1Ziwgc2l6ZW9mKGluaXRfbXNnXzIpCisJCS8gc2l6ZW9mKGluaXRfbXNnXzJbMF0pLCB1c2JfYnVmLCAyOCk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJbWVtY3B5KGV0aGVybmV0X2FkZHIsIHVzYl9idWYgKyAxMCwgRVRIX0FMRU4pOworCisJa2ZyZWUodXNiX2J1Zik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAora2FsbWlhX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQgc3RhdHVzOworCXU4IGV0aGVybmV0X2FkZHJbRVRIX0FMRU5dOworCisJLyogRG9uJ3QgYmluZCB0byBBVCBjb21tYW5kIGludGVyZmFjZSAqLworCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MgIT0gVVNCX0NMQVNTX1ZFTkRPUl9TUEVDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldi0+aW4gPSB1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LCAweDgxICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKKwlkZXYtPm91dCA9IHVzYl9zbmRidWxrcGlwZShkZXYtPnVkZXYsIDB4MDIgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOworCWRldi0+c3RhdHVzID0gTlVMTDsKKworCWRldi0+bmV0LT5oYXJkX2hlYWRlcl9sZW4gKz0gS0FMTUlBX0hFQURFUl9MRU5HVEg7CisJZGV2LT5oYXJkX210dSA9IDE0MDA7CisJZGV2LT5yeF91cmJfc2l6ZSA9IGRldi0+aGFyZF9tdHUgKiAxMDsgLy8gRm91bmQgYXMgb3B0aW1hbCBhZnRlciB0ZXN0aW5nCisKKwlzdGF0dXMgPSBrYWxtaWFfaW5pdF9hbmRfZ2V0X2V0aGVybmV0X2FkZHIoZGV2LCBldGhlcm5ldF9hZGRyKTsKKworCWlmIChzdGF0dXMgPCAwKSB7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoZHJpdmVyX29mKGludGYpLCBpbnRmKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwltZW1jcHkoZGV2LT5uZXQtPmRldl9hZGRyLCBldGhlcm5ldF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGRldi0+bmV0LT5wZXJtX2FkZHIsIGV0aGVybmV0X2FkZHIsIEVUSF9BTEVOKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitrYWxtaWFfdHhfZml4dXAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBmbGFncykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7CisJdTE2IGNvbnRlbnRfbGVuOworCXVuc2lnbmVkIGNoYXIgKmhlYWRlcl9zdGFydDsKKwl1bnNpZ25lZCBjaGFyIGV0aGVyX3R5cGVfMSwgZXRoZXJfdHlwZV8yOworCXU4IHJlbWFpbmRlciwgcGFkbGVuID0gMDsKKworCWlmICghc2tiX2Nsb25lZChza2IpKSB7CisJCWludCBoZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOworCQlpbnQgdGFpbHJvb20gPSBza2JfdGFpbHJvb20oc2tiKTsKKworCQlpZiAoKHRhaWxyb29tID49IEtBTE1JQV9BTElHTl9TSVpFKSAmJiAoaGVhZHJvb20KKwkJCT49IEtBTE1JQV9IRUFERVJfTEVOR1RIKSkKKwkJCWdvdG8gZG9uZTsKKworCQlpZiAoKGhlYWRyb29tICsgdGFpbHJvb20pID4gKEtBTE1JQV9IRUFERVJfTEVOR1RICisJCQkrIEtBTE1JQV9BTElHTl9TSVpFKSkgeworCQkJc2tiLT5kYXRhID0gbWVtbW92ZShza2ItPmhlYWQgKyBLQUxNSUFfSEVBREVSX0xFTkdUSCwKKwkJCQlza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgc2tiLT5sZW4pOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJc2tiMiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIEtBTE1JQV9IRUFERVJfTEVOR1RILAorCQlLQUxNSUFfQUxJR05fU0laRSwgZmxhZ3MpOworCWlmICghc2tiMikKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXNrYiA9IHNrYjI7CisKK2RvbmU6CisJaGVhZGVyX3N0YXJ0ID0gc2tiX3B1c2goc2tiLCBLQUxNSUFfSEVBREVSX0xFTkdUSCk7CisJZXRoZXJfdHlwZV8xID0gaGVhZGVyX3N0YXJ0W0tBTE1JQV9IRUFERVJfTEVOR1RIICsgMTJdOworCWV0aGVyX3R5cGVfMiA9IGhlYWRlcl9zdGFydFtLQUxNSUFfSEVBREVSX0xFTkdUSCArIDEzXTsKKworCW5ldGRldl9kYmcoZGV2LT5uZXQsICJTZW5kaW5nIGV0aGVyVHlwZTogJTAyeCUwMngiLCBldGhlcl90eXBlXzEsCisJCWV0aGVyX3R5cGVfMik7CisKKwkvKiBBY2NvcmRpbmcgdG8gZW1waXJpYyBkYXRhIGZvciBkYXRhIHBhY2thZ2VzICovCisJaGVhZGVyX3N0YXJ0WzBdID0gMHg1NzsKKwloZWFkZXJfc3RhcnRbMV0gPSAweDQ0OworCWNvbnRlbnRfbGVuID0gc2tiLT5sZW4gLSBLQUxNSUFfSEVBREVSX0xFTkdUSDsKKworCXB1dF91bmFsaWduZWRfbGUxNihjb250ZW50X2xlbiwgJmhlYWRlcl9zdGFydFsyXSk7CisJaGVhZGVyX3N0YXJ0WzRdID0gZXRoZXJfdHlwZV8xOworCWhlYWRlcl9zdGFydFs1XSA9IGV0aGVyX3R5cGVfMjsKKworCS8qIEFsaWduIHRvIDQgYnl0ZXMgYnkgcGFkZGluZyB3aXRoIHplcm9zICovCisJcmVtYWluZGVyID0gc2tiLT5sZW4gJSBLQUxNSUFfQUxJR05fU0laRTsKKwlpZiAocmVtYWluZGVyID4gMCkgeworCQlwYWRsZW4gPSBLQUxNSUFfQUxJR05fU0laRSAtIHJlbWFpbmRlcjsKKwkJbWVtc2V0KHNrYl9wdXQoc2tiLCBwYWRsZW4pLCAwLCBwYWRsZW4pOworCX0KKworCW5ldGRldl9kYmcoCisJCWRldi0+bmV0LAorCQkiU2VuZGluZyBwYWNrYWdlIHdpdGggbGVuZ3RoICVpIGFuZCBwYWRkaW5nICVpLiBIZWFkZXI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LiIsCisJCWNvbnRlbnRfbGVuLCBwYWRsZW4sIGhlYWRlcl9zdGFydFswXSwgaGVhZGVyX3N0YXJ0WzFdLAorCQloZWFkZXJfc3RhcnRbMl0sIGhlYWRlcl9zdGFydFszXSwgaGVhZGVyX3N0YXJ0WzRdLAorCQloZWFkZXJfc3RhcnRbNV0pOworCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludAora2FsbWlhX3J4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKgorCSAqIE91ciB0YXNrIGhlcmUgaXMgdG8gc3RyaXAgb2ZmIGZyYW1pbmcsIGxlYXZpbmcgc2tiIHdpdGggb25lCisJICogZGF0YSBmcmFtZSBmb3IgdGhlIHVzYm5ldCBmcmFtZXdvcmsgY29kZSB0byBwcm9jZXNzLgorCSAqLworCXN0YXRpYyBjb25zdCB1OCBIRUFERVJfRU5EX09GX1VTQl9QQUNLRVRbXSA9CisJCXsgMHg1NywgMHg1YSwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCB9OworCXN0YXRpYyBjb25zdCB1OCBFWFBFQ1RFRF9VTktOT1dOX0hFQURFUl8xW10gPQorCQl7IDB4NTcsIDB4NDMsIDB4MWUsIDB4MDAsIDB4MTUsIDB4MDIgfTsKKwlzdGF0aWMgY29uc3QgdTggRVhQRUNURURfVU5LTk9XTl9IRUFERVJfMltdID0KKwkJeyAweDU3LCAweDUwLCAweDBlLCAweDAwLCAweDAwLCAweDAwIH07CisJaW50IGkgPSAwOworCisJLyogaW5jb21wbGV0ZSBoZWFkZXI/ICovCisJaWYgKHNrYi0+bGVuIDwgS0FMTUlBX0hFQURFUl9MRU5HVEgpCisJCXJldHVybiAwOworCisJZG8geworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7CisJCXU4ICpoZWFkZXJfc3RhcnQ7CisJCXUxNiB1c2JfcGFja2V0X2xlbmd0aCwgZXRoZXJfcGFja2V0X2xlbmd0aDsKKwkJaW50IGlzX2xhc3Q7CisKKwkJaGVhZGVyX3N0YXJ0ID0gc2tiLT5kYXRhOworCisJCWlmICh1bmxpa2VseShoZWFkZXJfc3RhcnRbMF0gIT0gMHg1NyB8fCBoZWFkZXJfc3RhcnRbMV0gIT0gMHg0NCkpIHsKKwkJCWlmICghbWVtY21wKGhlYWRlcl9zdGFydCwgRVhQRUNURURfVU5LTk9XTl9IRUFERVJfMSwKKwkJCQlzaXplb2YoRVhQRUNURURfVU5LTk9XTl9IRUFERVJfMSkpIHx8ICFtZW1jbXAoCisJCQkJaGVhZGVyX3N0YXJ0LCBFWFBFQ1RFRF9VTktOT1dOX0hFQURFUl8yLAorCQkJCXNpemVvZihFWFBFQ1RFRF9VTktOT1dOX0hFQURFUl8yKSkpIHsKKwkJCQluZXRkZXZfZGJnKAorCQkJCQlkZXYtPm5ldCwKKwkJCQkJIlJlY2VpdmVkIGV4cGVjdGVkIHVua25vd24gZnJhbWUgaGVhZGVyOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC4gUGFja2FnZSBsZW5ndGg6ICVpXG4iLAorCQkJCQloZWFkZXJfc3RhcnRbMF0sIGhlYWRlcl9zdGFydFsxXSwKKwkJCQkJaGVhZGVyX3N0YXJ0WzJdLCBoZWFkZXJfc3RhcnRbM10sCisJCQkJCWhlYWRlcl9zdGFydFs0XSwgaGVhZGVyX3N0YXJ0WzVdLAorCQkJCQlza2ItPmxlbiAtIEtBTE1JQV9IRUFERVJfTEVOR1RIKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCW5ldGRldl9lcnIoCisJCQkJCWRldi0+bmV0LAorCQkJCQkiUmVjZWl2ZWQgdW5rbm93biBmcmFtZSBoZWFkZXI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LiBQYWNrYWdlIGxlbmd0aDogJWlcbiIsCisJCQkJCWhlYWRlcl9zdGFydFswXSwgaGVhZGVyX3N0YXJ0WzFdLAorCQkJCQloZWFkZXJfc3RhcnRbMl0sIGhlYWRlcl9zdGFydFszXSwKKwkJCQkJaGVhZGVyX3N0YXJ0WzRdLCBoZWFkZXJfc3RhcnRbNV0sCisJCQkJCXNrYi0+bGVuIC0gS0FMTUlBX0hFQURFUl9MRU5HVEgpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWVsc2UKKwkJCW5ldGRldl9kYmcoCisJCQkJZGV2LT5uZXQsCisJCQkJIlJlY2VpdmVkIGhlYWRlcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguIFBhY2thZ2UgbGVuZ3RoOiAlaVxuIiwKKwkJCQloZWFkZXJfc3RhcnRbMF0sIGhlYWRlcl9zdGFydFsxXSwgaGVhZGVyX3N0YXJ0WzJdLAorCQkJCWhlYWRlcl9zdGFydFszXSwgaGVhZGVyX3N0YXJ0WzRdLCBoZWFkZXJfc3RhcnRbNV0sCisJCQkJc2tiLT5sZW4gLSBLQUxNSUFfSEVBREVSX0xFTkdUSCk7CisKKwkJLyogc3VidHJhY3Qgc3RhcnQgaGVhZGVyIGFuZCBlbmQgaGVhZGVyICovCisJCXVzYl9wYWNrZXRfbGVuZ3RoID0gc2tiLT5sZW4gLSAoMiAqIEtBTE1JQV9IRUFERVJfTEVOR1RIKTsKKwkJZXRoZXJfcGFja2V0X2xlbmd0aCA9IGdldF91bmFsaWduZWRfbGUxNigmaGVhZGVyX3N0YXJ0WzJdKTsKKwkJc2tiX3B1bGwoc2tiLCBLQUxNSUFfSEVBREVSX0xFTkdUSCk7CisKKwkJLyogU29tZSBzbWFsbCBwYWNrZXRzIG1pc3NlcyBlbmQgbWFya2VyICovCisJCWlmICh1c2JfcGFja2V0X2xlbmd0aCA8IGV0aGVyX3BhY2tldF9sZW5ndGgpIHsKKwkJCWV0aGVyX3BhY2tldF9sZW5ndGggPSB1c2JfcGFja2V0X2xlbmd0aAorCQkJCSsgS0FMTUlBX0hFQURFUl9MRU5HVEg7CisJCQlpc19sYXN0ID0gdHJ1ZTsKKwkJfQorCQllbHNlIHsKKwkJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJDb3JyZWN0IHBhY2thZ2UgbGVuZ3RoICMlaSIsIGkKKwkJCQkrIDEpOworCisJCQlpc19sYXN0ID0gKG1lbWNtcChza2ItPmRhdGEgKyBldGhlcl9wYWNrZXRfbGVuZ3RoLAorCQkJCUhFQURFUl9FTkRfT0ZfVVNCX1BBQ0tFVCwKKwkJCQlzaXplb2YoSEVBREVSX0VORF9PRl9VU0JfUEFDS0VUKSkgPT0gMCk7CisJCQlpZiAoIWlzX2xhc3QpIHsKKwkJCQloZWFkZXJfc3RhcnQgPSBza2ItPmRhdGEgKyBldGhlcl9wYWNrZXRfbGVuZ3RoOworCQkJCW5ldGRldl9kYmcoCisJCQkJCWRldi0+bmV0LAorCQkJCQkiRW5kIGhlYWRlcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguIFBhY2thZ2UgbGVuZ3RoOiAlaVxuIiwKKwkJCQkJaGVhZGVyX3N0YXJ0WzBdLCBoZWFkZXJfc3RhcnRbMV0sCisJCQkJCWhlYWRlcl9zdGFydFsyXSwgaGVhZGVyX3N0YXJ0WzNdLAorCQkJCQloZWFkZXJfc3RhcnRbNF0sIGhlYWRlcl9zdGFydFs1XSwKKwkJCQkJc2tiLT5sZW4gLSBLQUxNSUFfSEVBREVSX0xFTkdUSCk7CisJCQl9CisJCX0KKworCQlpZiAoaXNfbGFzdCkgeworCQkJc2tiMiA9IHNrYjsKKwkJfQorCQllbHNlIHsKKwkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseSghc2tiMikpCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQlza2JfdHJpbShza2IyLCBldGhlcl9wYWNrZXRfbGVuZ3RoKTsKKworCQlpZiAoaXNfbGFzdCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZSB7CisJCQl1c2JuZXRfc2tiX3JldHVybihkZXYsIHNrYjIpOworCQkJc2tiX3B1bGwoc2tiLCBldGhlcl9wYWNrZXRfbGVuZ3RoKTsKKwkJfQorCisJCWkrKzsKKwl9CisJd2hpbGUgKHNrYi0+bGVuKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGthbG1pYV9pbmZvID0geworCS5kZXNjcmlwdGlvbiA9ICJTYW1zdW5nIEthbG1pYSBMVEUgVVNCIGRvbmdsZSIsCisJLmZsYWdzID0gRkxBR19XV0FOLAorCS5iaW5kID0ga2FsbWlhX2JpbmQsCisJLnJ4X2ZpeHVwID0ga2FsbWlhX3J4X2ZpeHVwLAorCS50eF9maXh1cCA9IGthbG1pYV90eF9maXh1cAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHByb2R1Y3RzW10gPSB7CisJLyogVGhlIHVuc3dpdGNoZWQgVVNCIElELCB0byBnZXQgdGhlIG1vZHVsZSBhdXRvIGxvYWRlZDogKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNGU4LCAweDY4OWEpIH0sCisJLyogVGhlIHN0aWNrIHN3aXRoZWQgaW50byBtb2RlbSAoYnkgZS5nLiB1c2JfbW9kZXN3aXRjaCk6ICovCisJeyBVU0JfREVWSUNFKDB4MDRlOCwgMHg2ODg5KSwKKwkJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZrYWxtaWFfaW5mbywgfSwKKwl7IC8qIEVNUFRZID09IGVuZCBvZiBsaXN0ICovfSB9OworTU9EVUxFX0RFVklDRV9UQUJMRSggdXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBrYWxtaWFfZHJpdmVyID0geworCS5uYW1lID0gImthbG1pYSIsCisJLmlkX3RhYmxlID0gcHJvZHVjdHMsCisJLnByb2JlID0gdXNibmV0X3Byb2JlLAorCS5kaXNjb25uZWN0ID0gdXNibmV0X2Rpc2Nvbm5lY3QsCisJLnN1c3BlbmQgPSB1c2JuZXRfc3VzcGVuZCwKKwkucmVzdW1lID0gdXNibmV0X3Jlc3VtZQorfTsKKworc3RhdGljIGludCBfX2luaXQga2FsbWlhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZrYWxtaWFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KCBrYWxtaWFfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBrYWxtaWFfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZrYWxtaWFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KCBrYWxtaWFfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcml1cyBCam9lcm5zdGFkIEtvdHNiYWsgPG1hcml1c0Brb3RzYmFrLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBLYWxtaWEgVVNCIG5ldHdvcmsgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvemF1cnVzLmMgYi9kcml2ZXJzL25ldC91c2IvemF1cnVzLmMKaW5kZXggMjQxNzU2ZS4uMWEyMjM0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3phdXJ1cy5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi96YXVydXMuYwpAQCAtMzMxLDE3ICszMzEsNyBAQAogCVpBVVJVU19NQVNURVJfSU5URVJGQUNFLAogCS5kcml2ZXJfaW5mbyA9IFpBVVJVU19QWEFfSU5GTywKIH0sCi0KLQotLyogQXQgbGVhc3Qgc29tZSBvZiB0aGUgbmV3ZXN0IFBYQSB1bml0cyBoYXZlIHZlcnkgZGlmZmVyZW50IGxpZXMgYWJvdXQKLSAqIHRoZWlyIHN0YW5kYXJkcyBzdXBwb3J0OiAgdGhleSBjbGFpbSB0byBiZSBjZWxsIHBob25lcyBvZmZlcmluZwotICogZGlyZWN0IGFjY2VzcyB0byB0aGVpciByYWRpb3MhICAoTm8sIHRoZXkgZG9uJ3QgY29uZm9ybSB0byBDREMgTURMTS4pCi0gKi8KIHsKLQlVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfTURMTSwKLQkJCVVTQl9DRENfUFJPVE9fTk9ORSksCi0JLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZib2d1c19tZGxtX2luZm8sCi19LCB7CiAJLyogTW90b3JvbGEgTU9UT01BR1ggcGhvbmVzICovCiAJVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgyMmI4LCAweDY0MjUsIFVTQl9DTEFTU19DT01NLAogCQkJVVNCX0NEQ19TVUJDTEFTU19NRExNLCBVU0JfQ0RDX1BST1RPX05PTkUpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmV0aC5jIGIvZHJpdmVycy9uZXQvdmV0aC5jCmluZGV4IDg0NjE1NzYuLjdmNzhkYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZldGguYworKysgYi9kcml2ZXJzL25ldC92ZXRoLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdTY0X3N0YXRzX3N5bmMuaD4KIAogI2luY2x1ZGUgPG5ldC9kc3QuaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgpAQCAtMjQsMTIgKzI1LDEyIEBACiAjZGVmaW5lIE1BWF9NVFUgNjU1MzUJCS8qIE1heCBMMyBNVFUgKGFyYml0cmFyeSkgKi8KIAogc3RydWN0IHZldGhfbmV0X3N0YXRzIHsKLQl1bnNpZ25lZCBsb25nCXJ4X3BhY2tldHM7Ci0JdW5zaWduZWQgbG9uZwl0eF9wYWNrZXRzOwotCXVuc2lnbmVkIGxvbmcJcnhfYnl0ZXM7Ci0JdW5zaWduZWQgbG9uZwl0eF9ieXRlczsKLQl1bnNpZ25lZCBsb25nCXR4X2Ryb3BwZWQ7Ci0JdW5zaWduZWQgbG9uZwlyeF9kcm9wcGVkOworCXU2NAkJCXJ4X3BhY2tldHM7CisJdTY0CQkJdHhfcGFja2V0czsKKwl1NjQJCQlyeF9ieXRlczsKKwl1NjQJCQl0eF9ieXRlczsKKwl1NjQJCQlyeF9kcm9wcGVkOworCXN0cnVjdCB1NjRfc3RhdHNfc3luYwlzeW5jcDsKIH07CiAKIHN0cnVjdCB2ZXRoX3ByaXYgewpAQCAtMTI0LDkgKzEyNSw2IEBACiAJc3RhdHMgPSB0aGlzX2NwdV9wdHIocHJpdi0+c3RhdHMpOwogCXJjdl9zdGF0cyA9IHRoaXNfY3B1X3B0cihyY3ZfcHJpdi0+c3RhdHMpOwogCi0JaWYgKCEocmN2LT5mbGFncyAmIElGRl9VUCkpCi0JCWdvdG8gdHhfZHJvcDsKLQogCS8qIGRvbid0IGNoYW5nZSBpcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCwgYXMgdGhhdAogCSAgIHdpbGwgY2F1c2UgYmFkIGNoZWNrc3VtIG9uIGZvcndhcmRlZCBwYWNrZXRzICovCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUgJiYKQEAgLTEzNywyMSArMTM1LDIyIEBACiAJaWYgKGRldl9mb3J3YXJkX3NrYihyY3YsIHNrYikgIT0gTkVUX1JYX1NVQ0NFU1MpCiAJCWdvdG8gcnhfZHJvcDsKIAorCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnN0YXRzLT5zeW5jcCk7CiAJc3RhdHMtPnR4X2J5dGVzICs9IGxlbmd0aDsKIAlzdGF0cy0+dHhfcGFja2V0cysrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZzdGF0cy0+c3luY3ApOwogCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcmN2X3N0YXRzLT5zeW5jcCk7CiAJcmN2X3N0YXRzLT5yeF9ieXRlcyArPSBsZW5ndGg7CiAJcmN2X3N0YXRzLT5yeF9wYWNrZXRzKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJjdl9zdGF0cy0+c3luY3ApOwogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAotdHhfZHJvcDoKLQlrZnJlZV9za2Ioc2tiKTsKLQlzdGF0cy0+dHhfZHJvcHBlZCsrOwotCXJldHVybiBORVRERVZfVFhfT0s7Ci0KIHJ4X2Ryb3A6CisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcmN2X3N0YXRzLT5zeW5jcCk7CiAJcmN2X3N0YXRzLT5yeF9kcm9wcGVkKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJjdl9zdGF0cy0+c3luY3ApOwogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKQEAgLTE1OSwzMiArMTU4LDM0IEBACiAgKiBnZW5lcmFsIHJvdXRpbmVzCiAgKi8KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2ZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqdmV0aF9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnRvdCkKIHsKLQlzdHJ1Y3QgdmV0aF9wcml2ICpwcml2OworCXN0cnVjdCB2ZXRoX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBjcHU7Ci0Jc3RydWN0IHZldGhfbmV0X3N0YXRzICpzdGF0cywgdG90YWwgPSB7MH07Ci0KLQlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJc3RhdHMgPSBwZXJfY3B1X3B0cihwcml2LT5zdGF0cywgY3B1KTsKKwkJc3RydWN0IHZldGhfbmV0X3N0YXRzICpzdGF0cyA9IHBlcl9jcHVfcHRyKHByaXYtPnN0YXRzLCBjcHUpOworCQl1NjQgcnhfcGFja2V0cywgcnhfYnl0ZXMsIHJ4X2Ryb3BwZWQ7CisJCXU2NCB0eF9wYWNrZXRzLCB0eF9ieXRlczsKKwkJdW5zaWduZWQgaW50IHN0YXJ0OwogCi0JCXRvdGFsLnJ4X3BhY2tldHMgKz0gc3RhdHMtPnJ4X3BhY2tldHM7Ci0JCXRvdGFsLnR4X3BhY2tldHMgKz0gc3RhdHMtPnR4X3BhY2tldHM7Ci0JCXRvdGFsLnJ4X2J5dGVzICAgKz0gc3RhdHMtPnJ4X2J5dGVzOwotCQl0b3RhbC50eF9ieXRlcyAgICs9IHN0YXRzLT50eF9ieXRlczsKLQkJdG90YWwudHhfZHJvcHBlZCArPSBzdGF0cy0+dHhfZHJvcHBlZDsKLQkJdG90YWwucnhfZHJvcHBlZCArPSBzdGF0cy0+cnhfZHJvcHBlZDsKKwkJZG8geworCQkJc3RhcnQgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW5fYmgoJnN0YXRzLT5zeW5jcCk7CisJCQlyeF9wYWNrZXRzID0gc3RhdHMtPnJ4X3BhY2tldHM7CisJCQl0eF9wYWNrZXRzID0gc3RhdHMtPnR4X3BhY2tldHM7CisJCQlyeF9ieXRlcyA9IHN0YXRzLT5yeF9ieXRlczsKKwkJCXR4X2J5dGVzID0gc3RhdHMtPnR4X2J5dGVzOworCQkJcnhfZHJvcHBlZCA9IHN0YXRzLT5yeF9kcm9wcGVkOworCQl9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnlfYmgoJnN0YXRzLT5zeW5jcCwgc3RhcnQpKTsKKwkJdG90LT5yeF9wYWNrZXRzICs9IHJ4X3BhY2tldHM7CisJCXRvdC0+dHhfcGFja2V0cyArPSB0eF9wYWNrZXRzOworCQl0b3QtPnJ4X2J5dGVzICAgKz0gcnhfYnl0ZXM7CisJCXRvdC0+dHhfYnl0ZXMgICArPSB0eF9ieXRlczsKKwkJdG90LT5yeF9kcm9wcGVkICs9IHJ4X2Ryb3BwZWQ7CiAJfQotCWRldi0+c3RhdHMucnhfcGFja2V0cyA9IHRvdGFsLnJ4X3BhY2tldHM7Ci0JZGV2LT5zdGF0cy50eF9wYWNrZXRzID0gdG90YWwudHhfcGFja2V0czsKLQlkZXYtPnN0YXRzLnJ4X2J5dGVzICAgPSB0b3RhbC5yeF9ieXRlczsKLQlkZXYtPnN0YXRzLnR4X2J5dGVzICAgPSB0b3RhbC50eF9ieXRlczsKLQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQgPSB0b3RhbC50eF9kcm9wcGVkOwotCWRldi0+c3RhdHMucnhfZHJvcHBlZCA9IHRvdGFsLnJ4X2Ryb3BwZWQ7CiAKLQlyZXR1cm4gJmRldi0+c3RhdHM7CisJcmV0dXJuIHRvdDsKIH0KIAogc3RhdGljIGludCB2ZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTI1NCw3ICsyNTUsNyBAQAogCS5uZG9fc3RvcCAgICAgICAgICAgID0gdmV0aF9jbG9zZSwKIAkubmRvX3N0YXJ0X3htaXQgICAgICA9IHZldGhfeG1pdCwKIAkubmRvX2NoYW5nZV9tdHUgICAgICA9IHZldGhfY2hhbmdlX210dSwKLQkubmRvX2dldF9zdGF0cyAgICAgICA9IHZldGhfZ2V0X3N0YXRzLAorCS5uZG9fZ2V0X3N0YXRzNjQgICAgID0gdmV0aF9nZXRfc3RhdHM2NCwKIAkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGV0aF9tYWNfYWRkciwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKaW5kZXggMDZkYWE5ZC4uZGViMWVjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKKysrIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTUwMSw2ICs1MDIsNyBAQAogc3RhdGljIHZvaWQgdmVsb2NpdHlfaW5pdF9jYW1fZmlsdGVyKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQogewogCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICpyZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisJdW5zaWduZWQgaW50IHZpZCwgaSA9IDA7CiAKIAkvKiBUdXJuIG9uIE1DRkdfUFFFTiwgdHVybiBvZmYgTUNGR19SVEdPUFQgKi8KIAlXT1JEX1JFR19CSVRTX1NFVChNQ0ZHX1BRRU4sIE1DRkdfUlRHT1BULCAmcmVncy0+TUNGRyk7CkBAIC01MTMsMzAgKzUxNSwxNyBAQAogCW1hY19zZXRfY2FtX21hc2socmVncywgdnB0ci0+bUNBTW1hc2spOwogCiAJLyogRW5hYmxlIFZDQU1zICovCi0JaWYgKHZwdHItPnZsZ3JwKSB7Ci0JCXVuc2lnbmVkIGludCB2aWQsIGkgPSAwOwogCi0JCWlmICghdmxhbl9ncm91cF9nZXRfZGV2aWNlKHZwdHItPnZsZ3JwLCAwKSkKLQkJCVdPUkRfUkVHX0JJVFNfT04oTUNGR19SVEdPUFQsICZyZWdzLT5NQ0ZHKTsKKwlpZiAodGVzdF9iaXQoMCwgdnB0ci0+YWN0aXZlX3ZsYW5zKSkKKwkJV09SRF9SRUdfQklUU19PTihNQ0ZHX1JUR09QVCwgJnJlZ3MtPk1DRkcpOwogCi0JCWZvciAodmlkID0gMTsgKHZpZCA8IFZMQU5fVklEX01BU0spOyB2aWQrKykgewotCQkJaWYgKHZsYW5fZ3JvdXBfZ2V0X2RldmljZSh2cHRyLT52bGdycCwgdmlkKSkgewotCQkJCW1hY19zZXRfdmxhbl9jYW0ocmVncywgaSwgKHU4ICopICZ2aWQpOwotCQkJCXZwdHItPnZDQU1tYXNrW2kgLyA4XSB8PSAweDEgPDwgKGkgJSA4KTsKLQkJCQlpZiAoKytpID49IFZDQU1fU0laRSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJbWFjX3NldF92bGFuX2NhbV9tYXNrKHJlZ3MsIHZwdHItPnZDQU1tYXNrKTsKKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgdnB0ci0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKSB7CisJCW1hY19zZXRfdmxhbl9jYW0ocmVncywgaSwgKHU4ICopICZ2aWQpOworCQl2cHRyLT52Q0FNbWFza1tpIC8gOF0gfD0gMHgxIDw8IChpICUgOCk7CisJCWlmICgrK2kgPj0gVkNBTV9TSVpFKQorCQkJYnJlYWs7CiAJfQotfQotCi1zdGF0aWMgdm9pZCB2ZWxvY2l0eV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKLXsKLQlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IG5ldGRldl9wcml2KGRldik7Ci0KLQl2cHRyLT52bGdycCA9IGdycDsKKwltYWNfc2V0X3ZsYW5fY2FtX21hc2socmVncywgdnB0ci0+dkNBTW1hc2spOwogfQogCiBzdGF0aWMgdm9pZCB2ZWxvY2l0eV92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQpAQCAtNTQ0LDYgKzUzMyw3IEBACiAJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJc3Bpbl9sb2NrX2lycSgmdnB0ci0+bG9jayk7CisJc2V0X2JpdCh2aWQsIHZwdHItPmFjdGl2ZV92bGFucyk7CiAJdmVsb2NpdHlfaW5pdF9jYW1fZmlsdGVyKHZwdHIpOwogCXNwaW5fdW5sb2NrX2lycSgmdnB0ci0+bG9jayk7CiB9CkBAIC01NTMsNyArNTQzLDcgQEAKIAlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IG5ldGRldl9wcml2KGRldik7CiAKIAlzcGluX2xvY2tfaXJxKCZ2cHRyLT5sb2NrKTsKLQl2bGFuX2dyb3VwX3NldF9kZXZpY2UodnB0ci0+dmxncnAsIHZpZCwgTlVMTCk7CisJY2xlYXJfYml0KHZpZCwgdnB0ci0+YWN0aXZlX3ZsYW5zKTsKIAl2ZWxvY2l0eV9pbml0X2NhbV9maWx0ZXIodnB0cik7CiAJc3Bpbl91bmxvY2tfaXJxKCZ2cHRyLT5sb2NrKTsKIH0KQEAgLTE4ODcsNyArMTg3Nyw3IEBACiAJCWVsc2UKIAkJCW5ldGlmX3dha2VfcXVldWUodnB0ci0+ZGV2KTsKIAotCX07CisJfQogCWlmIChzdGF0dXMgJiBJU1JfTUlCRkkpCiAJCXZlbG9jaXR5X3VwZGF0ZV9od19taWJzKHZwdHIpOwogCWlmIChzdGF0dXMgJiBJU1JfTFNURUkpCkBAIC0yMDk0LDExICsyMDg0LDEyIEBACiAJc2tiX3B1dChza2IsIHBrdF9sZW4gLSA0KTsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB2cHRyLT5kZXYpOwogCi0JaWYgKHZwdHItPnZsZ3JwICYmIChyZC0+cmRlc2MwLlJTUiAmIFJTUl9ERVRBRykpIHsKLQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgdnB0ci0+dmxncnAsCi0JCQkJc3dhYjE2KGxlMTZfdG9fY3B1KHJkLT5yZGVzYzEuUFFUQUcpKSk7Ci0JfSBlbHNlCi0JCW5ldGlmX3J4KHNrYik7CisJaWYgKHJkLT5yZGVzYzAuUlNSICYgUlNSX0RFVEFHKSB7CisJCXUxNiB2aWQgPSBzd2FiMTYobGUxNl90b19jcHUocmQtPnJkZXNjMS5QUVRBRykpOworCisJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2aWQpOworCX0KKwluZXRpZl9yeChza2IpOwogCiAJc3RhdHMtPnJ4X2J5dGVzICs9IHBrdF9sZW47CiAKQEAgLTI2NDEsNyArMjYzMiw2IEBACiAJLm5kb19kb19pb2N0bAkJPSB2ZWxvY2l0eV9pb2N0bCwKIAkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IHZlbG9jaXR5X3ZsYW5fcnhfYWRkX3ZpZCwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSB2ZWxvY2l0eV92bGFuX3J4X2tpbGxfdmlkLAotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IHZlbG9jaXR5X3ZsYW5fcnhfcmVnaXN0ZXIsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5oIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmgKaW5kZXggMGYxZjA1Zi4uNGNiOWYxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmgKKysrIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmgKQEAgLTE0MzcsNyArMTQzNyw3IEBACiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAotCXN0cnVjdCB2bGFuX2dyb3VwICAgICp2bGdycDsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV92bGFuc1tCSVRTX1RPX0xPTkdTKFZMQU5fTl9WSUQpXTsKIAl1OCBpcF9hZGRyWzRdOwogCWVudW0gY2hpcF90eXBlIGNoaXBfaWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwppbmRleCBmNjg1MzI0Li4wYzczMjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCkBAIC00MCw2ICs0MCwxNSBAQAogCiAjZGVmaW5lIFZJUlRORVRfU0VORF9DT01NQU5EX1NHX01BWCAgICAyCiAKK3N0cnVjdCB2aXJ0bmV0X3N0YXRzIHsKKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgc3luY3A7CisJdTY0IHR4X2J5dGVzOworCXU2NCB0eF9wYWNrZXRzOworCisJdTY0IHJ4X2J5dGVzOworCXU2NCByeF9wYWNrZXRzOworfTsKKwogc3RydWN0IHZpcnRuZXRfaW5mbyB7CiAJc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXY7CiAJc3RydWN0IHZpcnRxdWV1ZSAqcnZxLCAqc3ZxLCAqY3ZxOwpAQCAtNTYsNiArNjUsOSBAQAogCS8qIEhvc3Qgd2lsbCBtZXJnZSByeCBidWZmZXJzIGZvciBiaWcgcGFja2V0cyAoc2hha2UgaXQhIHNoYWtlIGl0ISkgKi8KIAlib29sIG1lcmdlYWJsZV9yeF9idWZzOwogCisJLyogQWN0aXZlIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgdmlydG5ldF9zdGF0cyBfX3BlcmNwdSAqc3RhdHM7CisKIAkvKiBXb3JrIHN0cnVjdCBmb3IgcmVmaWxsaW5nIGlmIHdlIHJ1biBsb3cgb24gbWVtb3J5LiAqLwogCXN0cnVjdCBkZWxheWVkX3dvcmsgcmVmaWxsOwogCkBAIC0yMDksNyArMjIxLDYgQEAKIAkJCXNrYi0+ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCiAJCXBhZ2UgPSB2aXJ0cXVldWVfZ2V0X2J1Zih2aS0+cnZxLCAmbGVuKTsKIAkJaWYgKCFwYWdlKSB7CiAJCQlwcl9kZWJ1ZygiJXM6IHJ4IGVycm9yOiAlZCBidWZmZXJzIG1pc3NpbmdcbiIsCkBAIC0yMTcsNiArMjI4LDcgQEAKIAkJCXNrYi0+ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCiAJCWlmIChsZW4gPiBQQUdFX1NJWkUpCiAJCQlsZW4gPSBQQUdFX1NJWkU7CiAKQEAgLTIzMCw2ICsyNDIsNyBAQAogc3RhdGljIHZvaWQgcmVjZWl2ZV9idWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdmlydG5ldF9zdGF0cyBfX3BlcmNwdSAqc3RhdHMgPSB0aGlzX2NwdV9wdHIodmktPnN0YXRzKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXN0cnVjdCBza2Jfdm5ldF9oZHIgKmhkcjsKQEAgLTI2NSw4ICsyNzgsMTEgQEAKIAogCWhkciA9IHNrYl92bmV0X2hkcihza2IpOwogCXNrYi0+dHJ1ZXNpemUgKz0gc2tiLT5kYXRhX2xlbjsKLQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwotCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmc3RhdHMtPnN5bmNwKTsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmc3RhdHMtPnN5bmNwKTsKIAogCWlmIChoZHItPmhkci5mbGFncyAmIFZJUlRJT19ORVRfSERSX0ZfTkVFRFNfQ1NVTSkgewogCQlwcl9kZWJ1ZygiTmVlZHMgY3N1bSFcbiIpOwpAQCAtMjc0LDYgKzI5MCw4IEBACiAJCQkJCSAgaGRyLT5oZHIuY3N1bV9zdGFydCwKIAkJCQkJICBoZHItPmhkci5jc3VtX29mZnNldCkpCiAJCQlnb3RvIGZyYW1lX2VycjsKKwl9IGVsc2UgaWYgKGhkci0+aGRyLmZsYWdzICYgVklSVElPX05FVF9IRFJfRl9EQVRBX1ZBTElEKSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfQogCiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKQEAgLTUxMywxMSArNTMxLDE2IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBpbnQgbGVuLCB0b3Rfc2dzID0gMDsKKwlzdHJ1Y3QgdmlydG5ldF9zdGF0cyBfX3BlcmNwdSAqc3RhdHMgPSB0aGlzX2NwdV9wdHIodmktPnN0YXRzKTsKIAogCXdoaWxlICgoc2tiID0gdmlydHF1ZXVlX2dldF9idWYodmktPnN2cSwgJmxlbikpICE9IE5VTEwpIHsKIAkJcHJfZGVidWcoIlNlbnQgc2tiICVwXG4iLCBza2IpOwotCQl2aS0+ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKLQkJdmktPmRldi0+c3RhdHMudHhfcGFja2V0cysrOworCisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnN0YXRzLT5zeW5jcCk7CisJCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnN0YXRzLT5zeW5jcCk7CisKIAkJdG90X3NncyArPSBza2Jfdm5ldF9oZHIoc2tiKS0+bnVtX3NnOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCX0KQEAgLTYzOSw2ICs2NjIsNDAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqdmlydG5ldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgICAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICp0b3QpCit7CisJc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBjcHU7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlzdHJ1Y3QgdmlydG5ldF9zdGF0cyBfX3BlcmNwdSAqc3RhdHMKKwkJCT0gcGVyX2NwdV9wdHIodmktPnN0YXRzLCBjcHUpOworCQl1NjQgdHBhY2tldHMsIHRieXRlcywgcnBhY2tldHMsIHJieXRlczsKKworCQlkbyB7CisJCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbigmc3RhdHMtPnN5bmNwKTsKKwkJCXRwYWNrZXRzID0gc3RhdHMtPnR4X3BhY2tldHM7CisJCQl0Ynl0ZXMgICA9IHN0YXRzLT50eF9ieXRlczsKKwkJCXJwYWNrZXRzID0gc3RhdHMtPnJ4X3BhY2tldHM7CisJCQlyYnl0ZXMgICA9IHN0YXRzLT5yeF9ieXRlczsKKwkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5KCZzdGF0cy0+c3luY3AsIHN0YXJ0KSk7CisKKwkJdG90LT5yeF9wYWNrZXRzICs9IHJwYWNrZXRzOworCQl0b3QtPnR4X3BhY2tldHMgKz0gdHBhY2tldHM7CisJCXRvdC0+cnhfYnl0ZXMgICArPSByYnl0ZXM7CisJCXRvdC0+dHhfYnl0ZXMgICArPSB0Ynl0ZXM7CisJfQorCisJdG90LT50eF9kcm9wcGVkID0gZGV2LT5zdGF0cy50eF9kcm9wcGVkOworCXRvdC0+cnhfZHJvcHBlZCA9IGRldi0+c3RhdHMucnhfZHJvcHBlZDsKKwl0b3QtPnJ4X2xlbmd0aF9lcnJvcnMgPSBkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisJdG90LT5yeF9mcmFtZV9lcnJvcnMgPSBkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKKworCXJldHVybiB0b3Q7Cit9CisKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgdmlydG5ldF9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC04MzMsNiArODkwLDcgQEAKIAkubmRvX3NldF9tYWNfYWRkcmVzcyA9IHZpcnRuZXRfc2V0X21hY19hZGRyZXNzLAogCS5uZG9fc2V0X3J4X21vZGUgICAgID0gdmlydG5ldF9zZXRfcnhfbW9kZSwKIAkubmRvX2NoYW5nZV9tdHUJICAgICA9IHZpcnRuZXRfY2hhbmdlX210dSwKKwkubmRvX2dldF9zdGF0czY0ICAgICA9IHZpcnRuZXRfc3RhdHMsCiAJLm5kb192bGFuX3J4X2FkZF92aWQgPSB2aXJ0bmV0X3ZsYW5fcnhfYWRkX3ZpZCwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQgPSB2aXJ0bmV0X3ZsYW5fcnhfa2lsbF92aWQsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKQEAgLTg5Myw2ICs5NTEsNyBAQAogCS8qIFNldCB1cCBuZXR3b3JrIGRldmljZSBhcyBub3JtYWwuICovCiAJZGV2LT5uZXRkZXZfb3BzID0gJnZpcnRuZXRfbmV0ZGV2OwogCWRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX0hJR0hETUE7CisKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmdmlydG5ldF9ldGh0b29sX29wcyk7CiAJU0VUX05FVERFVl9ERVYoZGV2LCAmdmRldi0+ZGV2KTsKIApAQCAtOTM3LDYgKzk5NiwxMSBAQAogCXZpLT52ZGV2ID0gdmRldjsKIAl2ZGV2LT5wcml2ID0gdmk7CiAJdmktPnBhZ2VzID0gTlVMTDsKKwl2aS0+c3RhdHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IHZpcnRuZXRfc3RhdHMpOworCWVyciA9IC1FTk9NRU07CisJaWYgKHZpLT5zdGF0cyA9PSBOVUxMKQorCQlnb3RvIGZyZWU7CisKIAlJTklUX0RFTEFZRURfV09SSygmdmktPnJlZmlsbCwgcmVmaWxsX3dvcmspOwogCXNnX2luaXRfdGFibGUodmktPnJ4X3NnLCBBUlJBWV9TSVpFKHZpLT5yeF9zZykpOwogCXNnX2luaXRfdGFibGUodmktPnR4X3NnLCBBUlJBWV9TSVpFKHZpLT50eF9zZykpOwpAQCAtOTU2LDcgKzEwMjAsNyBAQAogCiAJZXJyID0gdmRldi0+Y29uZmlnLT5maW5kX3Zxcyh2ZGV2LCBudnFzLCB2cXMsIGNhbGxiYWNrcywgbmFtZXMpOwogCWlmIChlcnIpCi0JCWdvdG8gZnJlZTsKKwkJZ290byBmcmVlX3N0YXRzOwogCiAJdmktPnJ2cSA9IHZxc1swXTsKIAl2aS0+c3ZxID0gdnFzWzFdOwpAQCAtMTAwMSw2ICsxMDY1LDggQEAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnZpLT5yZWZpbGwpOwogZnJlZV92cXM6CiAJdmRldi0+Y29uZmlnLT5kZWxfdnFzKHZkZXYpOworZnJlZV9zdGF0czoKKwlmcmVlX3BlcmNwdSh2aS0+c3RhdHMpOwogZnJlZToKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBlcnI7CkBAIC0xMDQ3LDYgKzExMTMsNyBAQAogCXdoaWxlICh2aS0+cGFnZXMpCiAJCV9fZnJlZV9wYWdlcyhnZXRfYV9wYWdlKHZpLCBHRlBfS0VSTkVMKSwgMCk7CiAKKwlmcmVlX3BlcmNwdSh2aS0+c3RhdHMpOwogCWZyZWVfbmV0ZGV2KHZpLT5kZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKaW5kZXggZmE2ZTJhYy4uMWNiYWNiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jCisrKyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYwpAQCAtNDA1LDEwICs0MDUsOCBAQAogCiAJd2hpbGUgKHRxLT50eF9yaW5nLm5leHQyY29tcCAhPSB0cS0+dHhfcmluZy5uZXh0MmZpbGwpIHsKIAkJc3RydWN0IHZteG5ldDNfdHhfYnVmX2luZm8gKnRiaTsKLQkJdW5pb24gVm14bmV0M19HZW5lcmljRGVzYyAqZ2Rlc2M7CiAKIAkJdGJpID0gdHEtPmJ1Zl9pbmZvICsgdHEtPnR4X3JpbmcubmV4dDJjb21wOwotCQlnZGVzYyA9IHRxLT50eF9yaW5nLmJhc2UgKyB0cS0+dHhfcmluZy5uZXh0MmNvbXA7CiAKIAkJdm14bmV0M191bm1hcF90eF9idWYodGJpLCBhZGFwdGVyLT5wZGV2KTsKIAkJaWYgKHRiaS0+c2tiKSB7CkBAIC01NzUsNyArNTczLDcgQEAKIAlzdHJ1Y3Qgdm14bmV0M19jbWRfcmluZyAqcmluZyA9ICZycS0+cnhfcmluZ1tyaW5nX2lkeF07CiAJdTMyIHZhbDsKIAotCXdoaWxlIChudW1fYWxsb2NhdGVkIDwgbnVtX3RvX2FsbG9jKSB7CisJd2hpbGUgKG51bV9hbGxvY2F0ZWQgPD0gbnVtX3RvX2FsbG9jKSB7CiAJCXN0cnVjdCB2bXhuZXQzX3J4X2J1Zl9pbmZvICpyYmk7CiAJCXVuaW9uIFZteG5ldDNfR2VuZXJpY0Rlc2MgKmdkOwogCkBAIC02MjEsOSArNjE5LDE1IEBACiAKIAkJQlVHX09OKHJiaS0+ZG1hX2FkZHIgPT0gMCk7CiAJCWdkLT5yeGQuYWRkciA9IGNwdV90b19sZTY0KHJiaS0+ZG1hX2FkZHIpOwotCQlnZC0+ZHdvcmRbMl0gPSBjcHVfdG9fbGUzMigocmluZy0+Z2VuIDw8IFZNWE5FVDNfUlhEX0dFTl9TSElGVCkKKwkJZ2QtPmR3b3JkWzJdID0gY3B1X3RvX2xlMzIoKCFyaW5nLT5nZW4gPDwgVk1YTkVUM19SWERfR0VOX1NISUZUKQogCQkJCQkgICB8IHZhbCB8IHJiaS0+bGVuKTsKIAorCQkvKiBGaWxsIHRoZSBsYXN0IGJ1ZmZlciBidXQgZG9udCBtYXJrIGl0IHJlYWR5LCBvciBlbHNlIHRoZQorCQkgKiBkZXZpY2Ugd2lsbCB0aGluayB0aGF0IHRoZSBxdWV1ZSBpcyBmdWxsICovCisJCWlmIChudW1fYWxsb2NhdGVkID09IG51bV90b19hbGxvYykKKwkJCWJyZWFrOworCisJCWdkLT5kd29yZFsyXSB8PSBjcHVfdG9fbGUzMihyaW5nLT5nZW4gPDwgVk1YTkVUM19SWERfR0VOX1NISUZUKTsKIAkJbnVtX2FsbG9jYXRlZCsrOwogCQl2bXhuZXQzX2NtZF9yaW5nX2Fkdl9uZXh0MmZpbGwocmluZyk7CiAJfQpAQCAtOTIwLDcgKzkyNCw3IEBACiAJY291bnQgPSBWTVhORVQzX1RYRF9ORUVERUQoc2tiX2hlYWRsZW4oc2tiKSkgKwogCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMTsKIAotCWN0eC5pcHY0ID0gKHNrYi0+cHJvdG9jb2wgPT0gY3B1X3RvX2JlMTYoRVRIX1BfSVApKTsKKwljdHguaXB2NCA9ICh2bGFuX2dldF9wcm90b2NvbChza2IpID09IGNwdV90b19iZTE2KEVUSF9QX0lQKSk7CiAKIAljdHgubXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIAlpZiAoY3R4Lm1zcykgewpAQCAtMTE0MCw2ICsxMTQ0LDcgQEAKIAkJVk1YTkVUM19SRUdfUlhQUk9ELCBWTVhORVQzX1JFR19SWFBST0QyCiAJfTsKIAl1MzIgbnVtX3J4ZCA9IDA7CisJYm9vbCBza2lwX3BhZ2VfZnJhZ3MgPSBmYWxzZTsKIAlzdHJ1Y3QgVm14bmV0M19SeENvbXBEZXNjICpyY2Q7CiAJc3RydWN0IHZteG5ldDNfcnhfY3R4ICpjdHggPSAmcnEtPnJ4X2N0eDsKICNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKQEAgLTExNTAsMTEgKzExNTUsMTIgQEAKIAkJCSAgJnJ4Q29tcCk7CiAJd2hpbGUgKHJjZC0+Z2VuID09IHJxLT5jb21wX3JpbmcuZ2VuKSB7CiAJCXN0cnVjdCB2bXhuZXQzX3J4X2J1Zl9pbmZvICpyYmk7Ci0JCXN0cnVjdCBza19idWZmICpza2I7CisJCXN0cnVjdCBza19idWZmICpza2IsICpuZXdfc2tiID0gTlVMTDsKKwkJc3RydWN0IHBhZ2UgKm5ld19wYWdlID0gTlVMTDsKIAkJaW50IG51bV90b19hbGxvYzsKIAkJc3RydWN0IFZteG5ldDNfUnhEZXNjICpyeGQ7CiAJCXUzMiBpZHgsIHJpbmdfaWR4OwotCisJCXN0cnVjdCB2bXhuZXQzX2NtZF9yaW5nCSpyaW5nID0gTlVMTDsKIAkJaWYgKG51bV9yeGQgPj0gcXVvdGEpIHsKIAkJCS8qIHdlIG1heSBzdG9wIGV2ZW4gYmVmb3JlIHdlIHNlZSB0aGUgRU9QIGRlc2Mgb2YKIAkJCSAqIHRoZSBjdXJyZW50IHBrdApAQCAtMTE2NSw2ICsxMTcxLDcgQEAKIAkJQlVHX09OKHJjZC0+cnFJRCAhPSBycS0+cWlkICYmIHJjZC0+cnFJRCAhPSBycS0+cWlkMik7CiAJCWlkeCA9IHJjZC0+cnhkSWR4OwogCQlyaW5nX2lkeCA9IHJjZC0+cnFJRCA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMgPyAwIDogMTsKKwkJcmluZyA9IHJxLT5yeF9yaW5nICsgcmluZ19pZHg7CiAJCXZteG5ldDNfZ2V0UnhEZXNjKHJ4ZCwgJnJxLT5yeF9yaW5nW3JpbmdfaWR4XS5iYXNlW2lkeF0ucnhkLAogCQkJCSAgJnJ4Q21kRGVzYyk7CiAJCXJiaSA9IHJxLT5idWZfaW5mb1tyaW5nX2lkeF0gKyBpZHg7CkBAIC0xMTkzLDM3ICsxMjAwLDgwIEBACiAJCQkJZ290byByY2RfZG9uZTsKIAkJCX0KIAorCQkJc2tpcF9wYWdlX2ZyYWdzID0gZmFsc2U7CiAJCQljdHgtPnNrYiA9IHJiaS0+c2tiOwotCQkJcmJpLT5za2IgPSBOVUxMOworCQkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IocmJpLT5sZW4gKyBORVRfSVBfQUxJR04pOworCQkJaWYgKG5ld19za2IgPT0gTlVMTCkgeworCQkJCS8qIFNrYiBhbGxvY2F0aW9uIGZhaWxlZCwgZG8gbm90IGhhbmRvdmVyIHRoaXMKKwkJCQkgKiBza2IgdG8gc3RhY2suIFJldXNlIGl0LiBEcm9wIHRoZSBleGlzdGluZyBwa3QKKwkJCQkgKi8KKwkJCQlycS0+c3RhdHMucnhfYnVmX2FsbG9jX2ZhaWx1cmUrKzsKKwkJCQljdHgtPnNrYiA9IE5VTEw7CisJCQkJcnEtPnN0YXRzLmRyb3BfdG90YWwrKzsKKwkJCQlza2lwX3BhZ2VfZnJhZ3MgPSB0cnVlOworCQkJCWdvdG8gcmNkX2RvbmU7CisJCQl9CiAKIAkJCXBjaV91bm1hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgcmJpLT5kbWFfYWRkciwgcmJpLT5sZW4sCiAJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJCQlza2JfcHV0KGN0eC0+c2tiLCByY2QtPmxlbik7CisKKwkJCS8qIEltbWVkaWF0ZSByZWZpbGwgKi8KKwkJCW5ld19za2ItPmRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwkJCXNrYl9yZXNlcnZlKG5ld19za2IsIE5FVF9JUF9BTElHTik7CisJCQlyYmktPnNrYiA9IG5ld19za2I7CisJCQlyYmktPmRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwKKwkJCQkJcmJpLT5za2ItPmRhdGEsIHJiaS0+bGVuLAorCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcnhkLT5hZGRyID0gY3B1X3RvX2xlNjQocmJpLT5kbWFfYWRkcik7CisJCQlyeGQtPmxlbiA9IHJiaS0+bGVuOworCiAJCX0gZWxzZSB7Ci0JCQlCVUdfT04oY3R4LT5za2IgPT0gTlVMTCk7CisJCQlCVUdfT04oY3R4LT5za2IgPT0gTlVMTCAmJiAhc2tpcF9wYWdlX2ZyYWdzKTsKKwogCQkJLyogbm9uIFNPUCBidWZmZXIgbXVzdCBiZSB0eXBlIDEgaW4gbW9zdCBjYXNlcyAqLwotCQkJaWYgKHJiaS0+YnVmX3R5cGUgPT0gVk1YTkVUM19SWF9CVUZfUEFHRSkgewotCQkJCUJVR19PTihyeGQtPmJ0eXBlICE9IFZNWE5FVDNfUlhEX0JUWVBFX0JPRFkpOworCQkJQlVHX09OKHJiaS0+YnVmX3R5cGUgIT0gVk1YTkVUM19SWF9CVUZfUEFHRSk7CisJCQlCVUdfT04ocnhkLT5idHlwZSAhPSBWTVhORVQzX1JYRF9CVFlQRV9CT0RZKTsKIAotCQkJCWlmIChyY2QtPmxlbikgewotCQkJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAotCQkJCQkJICAgICAgIHJiaS0+ZG1hX2FkZHIsIHJiaS0+bGVuLAotCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkvKiBJZiBhbiBzb3AgYnVmZmVyIHdhcyBkcm9wcGVkLCBza2lwIGFsbAorCQkJICogZm9sbG93aW5nIG5vbi1zb3AgZnJhZ21lbnRzLiBUaGV5IHdpbGwgYmUgcmV1c2VkLgorCQkJICovCisJCQlpZiAoc2tpcF9wYWdlX2ZyYWdzKQorCQkJCWdvdG8gcmNkX2RvbmU7CiAKLQkJCQkJdm14bmV0M19hcHBlbmRfZnJhZyhjdHgtPnNrYiwgcmNkLCByYmkpOwotCQkJCQlyYmktPnBhZ2UgPSBOVUxMOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgb25seSB0aW1lIGEgbm9uLVNPUCBidWZmZXIgaXMgdHlwZSAwIGlzCi0JCQkJICogd2hlbiBpdCdzIEVPUCBhbmQgZXJyb3IgZmxhZyBpcyByYWlzZWQsIHdoaWNoCi0JCQkJICogaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkLgorCQkJbmV3X3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOworCQkJaWYgKHVubGlrZWx5KG5ld19wYWdlID09IE5VTEwpKSB7CisJCQkJLyogUmVwbGFjZW1lbnQgcGFnZSBmcmFnIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisJCQkJICogUmV1c2UgdGhpcyBwYWdlLiBEcm9wIHRoZSBwa3QgYW5kIGZyZWUgdGhlCisJCQkJICogc2tiIHdoaWNoIGNvbnRhaW5lZCB0aGlzIHBhZ2UgYXMgYSBmcmFnLiBTa2lwCisJCQkJICogcHJvY2Vzc2luZyBhbGwgdGhlIGZvbGxvd2luZyBub24tc29wIGZyYWdzLgogCQkJCSAqLwotCQkJCUJVR19PTih0cnVlKTsKKwkJCQlycS0+c3RhdHMucnhfYnVmX2FsbG9jX2ZhaWx1cmUrKzsKKwkJCQlkZXZfa2ZyZWVfc2tiKGN0eC0+c2tiKTsKKwkJCQljdHgtPnNrYiA9IE5VTEw7CisJCQkJc2tpcF9wYWdlX2ZyYWdzID0gdHJ1ZTsKKwkJCQlnb3RvIHJjZF9kb25lOwogCQkJfQorCisJCQlpZiAocmNkLT5sZW4pIHsKKwkJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCQkgICAgICAgcmJpLT5kbWFfYWRkciwgcmJpLT5sZW4sCisJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkJdm14bmV0M19hcHBlbmRfZnJhZyhjdHgtPnNrYiwgcmNkLCByYmkpOworCQkJfQorCisJCQkvKiBJbW1lZGlhdGUgcmVmaWxsICovCisJCQlyYmktPnBhZ2UgPSBuZXdfcGFnZTsKKwkJCXJiaS0+ZG1hX2FkZHIgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgcmJpLT5wYWdlLAorCQkJCQkJICAgICAwLCBQQUdFX1NJWkUsCisJCQkJCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlyeGQtPmFkZHIgPSBjcHVfdG9fbGU2NChyYmktPmRtYV9hZGRyKTsKKwkJCXJ4ZC0+bGVuID0gcmJpLT5sZW47CiAJCX0KIAorCiAJCXNrYiA9IGN0eC0+c2tiOwogCQlpZiAocmNkLT5lb3ApIHsKIAkJCXNrYi0+bGVuICs9IHNrYi0+ZGF0YV9sZW47CkBAIC0xMjMzLDM3ICsxMjgzLDM5IEBACiAJCQkJCSh1bmlvbiBWbXhuZXQzX0dlbmVyaWNEZXNjICopcmNkKTsKIAkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGFkYXB0ZXItPm5ldGRldik7CiAKLQkJCWlmICh1bmxpa2VseShhZGFwdGVyLT52bGFuX2dycCAmJiByY2QtPnRzKSkgewotCQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsCi0JCQkJCQlhZGFwdGVyLT52bGFuX2dycCwgcmNkLT50Y2kpOwotCQkJfSBlbHNlIHsKKwkJCWlmICh1bmxpa2VseShyY2QtPnRzKSkKKwkJCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgcmNkLT50Y2kpOworCisJCQlpZiAoYWRhcHRlci0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKQogCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Ci0JCQl9CisJCQllbHNlCisJCQkJbmFwaV9ncm9fcmVjZWl2ZSgmcnEtPm5hcGksIHNrYik7CiAKIAkJCWN0eC0+c2tiID0gTlVMTDsKIAkJfQogCiByY2RfZG9uZToKLQkJLyogZGV2aWNlIG1heSBza2lwIHNvbWUgcnggZGVzY3MgKi8KLQkJcnEtPnJ4X3JpbmdbcmluZ19pZHhdLm5leHQyY29tcCA9IGlkeDsKLQkJVk1YTkVUM19JTkNfUklOR19JRFhfT05MWShycS0+cnhfcmluZ1tyaW5nX2lkeF0ubmV4dDJjb21wLAotCQkJCQkgIHJxLT5yeF9yaW5nW3JpbmdfaWR4XS5zaXplKTsKKwkJLyogZGV2aWNlIG1heSBoYXZlIHNraXBwZWQgc29tZSByeCBkZXNjcyAqLworCQlyaW5nLT5uZXh0MmNvbXAgPSBpZHg7CisJCW51bV90b19hbGxvYyA9IHZteG5ldDNfY21kX3JpbmdfZGVzY19hdmFpbChyaW5nKTsKKwkJcmluZyA9IHJxLT5yeF9yaW5nICsgcmluZ19pZHg7CisJCXdoaWxlIChudW1fdG9fYWxsb2MpIHsKKwkJCXZteG5ldDNfZ2V0UnhEZXNjKHJ4ZCwgJnJpbmctPmJhc2VbcmluZy0+bmV4dDJmaWxsXS5yeGQsCisJCQkJCSAgJnJ4Q21kRGVzYyk7CisJCQlCVUdfT04oIXJ4ZC0+YWRkcik7CiAKLQkJLyogcmVmaWxsIHJ4IGJ1ZmZlcnMgZnJlcXVlbnRseSB0byBhdm9pZCBzdGFydmluZyB0aGUgaC93ICovCi0JCW51bV90b19hbGxvYyA9IHZteG5ldDNfY21kX3JpbmdfZGVzY19hdmFpbChycS0+cnhfcmluZyArCi0JCQkJCQkJICAgcmluZ19pZHgpOwotCQlpZiAodW5saWtlbHkobnVtX3RvX2FsbG9jID4gVk1YTkVUM19SWF9BTExPQ19USFJFU0hPTEQocnEsCi0JCQkJCQkJcmluZ19pZHgsIGFkYXB0ZXIpKSkgewotCQkJdm14bmV0M19ycV9hbGxvY19yeF9idWYocnEsIHJpbmdfaWR4LCBudW1fdG9fYWxsb2MsCi0JCQkJCQlhZGFwdGVyKTsKKwkJCS8qIFJlY3YgZGVzYyBpcyByZWFkeSB0byBiZSB1c2VkIGJ5IHRoZSBkZXZpY2UgKi8KKwkJCXJ4ZC0+Z2VuID0gcmluZy0+Z2VuOworCQkJdm14bmV0M19jbWRfcmluZ19hZHZfbmV4dDJmaWxsKHJpbmcpOworCQkJbnVtX3RvX2FsbG9jLS07CisJCX0KIAotCQkJLyogaWYgbmVlZGVkLCB1cGRhdGUgdGhlIHJlZ2lzdGVyICovCi0JCQlpZiAodW5saWtlbHkocnEtPnNoYXJlZC0+dXBkYXRlUnhQcm9kKSkgewotCQkJCVZNWE5FVDNfV1JJVEVfQkFSMF9SRUcoYWRhcHRlciwKLQkJCQkJcnhwcm9kX3JlZ1tyaW5nX2lkeF0gKyBycS0+cWlkICogOCwKLQkJCQkJcnEtPnJ4X3JpbmdbcmluZ19pZHhdLm5leHQyZmlsbCk7Ci0JCQkJcnEtPnVuY29tbWl0dGVkW3JpbmdfaWR4XSA9IDA7Ci0JCQl9CisJCS8qIGlmIG5lZWRlZCwgdXBkYXRlIHRoZSByZWdpc3RlciAqLworCQlpZiAodW5saWtlbHkocnEtPnNoYXJlZC0+dXBkYXRlUnhQcm9kKSkgeworCQkJVk1YTkVUM19XUklURV9CQVIwX1JFRyhhZGFwdGVyLAorCQkJCXJ4cHJvZF9yZWdbcmluZ19pZHhdICsgcnEtPnFpZCAqIDgsCisJCQkJcmluZy0+bmV4dDJmaWxsKTsKKwkJCXJxLT51bmNvbW1pdHRlZFtyaW5nX2lkeF0gPSAwOwogCQl9CiAKIAkJdm14bmV0M19jb21wX3JpbmdfYWR2X25leHQycHJvYygmcnEtPmNvbXBfcmluZyk7CkBAIC0xODU4LDc5ICsxOTEwLDE4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAotdm14bmV0M192bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IFZteG5ldDNfRHJpdmVyU2hhcmVkICpzaGFyZWQgPSBhZGFwdGVyLT5zaGFyZWQ7Ci0JdTMyICp2ZlRhYmxlID0gYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLnJ4RmlsdGVyQ29uZi52ZlRhYmxlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoZ3JwKSB7Ci0JCS8qIGFkZCB2bGFuIHJ4IHN0cmlwcGluZy4gKi8KLQkJaWYgKGFkYXB0ZXItPm5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpIHsKLQkJCWludCBpOwotCQkJYWRhcHRlci0+dmxhbl9ncnAgPSBncnA7Ci0KLQkJCS8qCi0JCQkgKiAgQ2xlYXIgZW50aXJlIHZmVGFibGU7IHRoZW4gZW5hYmxlIHVudGFnZ2VkIHBrdHMuCi0JCQkgKiAgTm90ZTogc2V0dGluZyBvbmUgZW50cnkgaW4gdmZUYWJsZSB0byBub24temVybyB0dXJucwotCQkJICogIG9uIFZMQU4gcnggZmlsdGVyaW5nLgotCQkJICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgVk1YTkVUM19WRlRfU0laRTsgaSsrKQotCQkJCXZmVGFibGVbaV0gPSAwOwotCi0JCQlWTVhORVQzX1NFVF9WRlRBQkxFX0VOVFJZKHZmVGFibGUsIDApOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmNtZF9sb2NrLCBmbGFncyk7Ci0JCQlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0NNRCwKLQkJCQkJICAgICAgIFZNWE5FVDNfQ01EX1VQREFURV9WTEFOX0ZJTFRFUlMpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Y21kX2xvY2ssIGZsYWdzKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHZsYW5fcnhfcmVnaXN0ZXIgd2hlbiBkZXZpY2UgaGFzICIKLQkJCSAgICAgICAibm8gTkVUSUZfRl9IV19WTEFOX1JYXG4iLCBuZXRkZXYtPm5hbWUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogcmVtb3ZlIHZsYW4gcnggc3RyaXBwaW5nLiAqLwotCQlzdHJ1Y3QgVm14bmV0M19EU0RldlJlYWQgKmRldlJlYWQgPSAmc2hhcmVkLT5kZXZSZWFkOwotCQlhZGFwdGVyLT52bGFuX2dycCA9IE5VTEw7Ci0KLQkJaWYgKGRldlJlYWQtPm1pc2MudXB0RmVhdHVyZXMgJiBVUFQxX0ZfUlhWTEFOKSB7Ci0JCQlpbnQgaTsKLQotCQkJZm9yIChpID0gMDsgaSA8IFZNWE5FVDNfVkZUX1NJWkU7IGkrKykgewotCQkJCS8qIGNsZWFyIGVudGlyZSB2ZlRhYmxlOyB0aGlzIGFsc28gZGlzYWJsZXMKLQkJCQkgKiBWTEFOIHJ4IGZpbHRlcmluZwotCQkJCSAqLwotCQkJCXZmVGFibGVbaV0gPSAwOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmNtZF9sb2NrLCBmbGFncyk7Ci0JCQlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0NNRCwKLQkJCQkJICAgICAgIFZNWE5FVDNfQ01EX1VQREFURV9WTEFOX0ZJTFRFUlMpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Y21kX2xvY2ssIGZsYWdzKTsKLQkJfQotCX0KLX0KLQogCiBzdGF0aWMgdm9pZAogdm14bmV0M19yZXN0b3JlX3ZsYW4oc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlpZiAoYWRhcHRlci0+dmxhbl9ncnApIHsKLQkJdTE2IHZpZDsKLQkJdTMyICp2ZlRhYmxlID0gYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLnJ4RmlsdGVyQ29uZi52ZlRhYmxlOwotCQlib29sIGFjdGl2ZVZsYW4gPSBmYWxzZTsKKwl1MzIgKnZmVGFibGUgPSBhZGFwdGVyLT5zaGFyZWQtPmRldlJlYWQucnhGaWx0ZXJDb25mLnZmVGFibGU7CisJdTE2IHZpZDsKIAotCQlmb3IgKHZpZCA9IDA7IHZpZCA8IFZMQU5fTl9WSUQ7IHZpZCsrKSB7Ci0JCQlpZiAodmxhbl9ncm91cF9nZXRfZGV2aWNlKGFkYXB0ZXItPnZsYW5fZ3JwLCB2aWQpKSB7Ci0JCQkJVk1YTkVUM19TRVRfVkZUQUJMRV9FTlRSWSh2ZlRhYmxlLCB2aWQpOwotCQkJCWFjdGl2ZVZsYW4gPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChhY3RpdmVWbGFuKSB7Ci0JCQkvKiBjb250aW51ZSB0byBhbGxvdyB1bnRhZ2dlZCBwa3RzICovCi0JCQlWTVhORVQzX1NFVF9WRlRBQkxFX0VOVFJZKHZmVGFibGUsIDApOwotCQl9Ci0JfQorCS8qIGFsbG93IHVudGFnZ2VkIHBrdHMgKi8KKwlWTVhORVQzX1NFVF9WRlRBQkxFX0VOVFJZKHZmVGFibGUsIDApOworCisJZm9yX2VhY2hfc2V0X2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucywgVkxBTl9OX1ZJRCkKKwkJVk1YTkVUM19TRVRfVkZUQUJMRV9FTlRSWSh2ZlRhYmxlLCB2aWQpOwogfQogCiAKQEAgLTE5NDYsNiArMTkzNyw4IEBACiAJVk1YTkVUM19XUklURV9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19DTUQsCiAJCQkgICAgICAgVk1YTkVUM19DTURfVVBEQVRFX1ZMQU5fRklMVEVSUyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Y21kX2xvY2ssIGZsYWdzKTsKKworCXNldF9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOwogfQogCiAKQEAgLTE5NjEsNiArMTk1NCw4IEBACiAJVk1YTkVUM19XUklURV9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19DTUQsCiAJCQkgICAgICAgVk1YTkVUM19DTURfVVBEQVRFX1ZMQU5fRklMVEVSUyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Y21kX2xvY2ssIGZsYWdzKTsKKworCWNsZWFyX2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucyk7CiB9CiAKIApAQCAtMTk5Nyw4ICsxOTkyLDE0IEBACiAJdTggKm5ld190YWJsZSA9IE5VTEw7CiAJdTMyIG5ld19tb2RlID0gVk1YTkVUM19SWE1fVUNBU1Q7CiAKLQlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJdTMyICp2ZlRhYmxlID0gYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLnJ4RmlsdGVyQ29uZi52ZlRhYmxlOworCQltZW1zZXQodmZUYWJsZSwgMCwgVk1YTkVUM19WRlRfU0laRSAqIHNpemVvZigqdmZUYWJsZSkpOworCiAJCW5ld19tb2RlIHw9IFZNWE5FVDNfUlhNX1BST01JU0M7CisJfSBlbHNlIHsKKwkJdm14bmV0M19yZXN0b3JlX3ZsYW4oYWRhcHRlcik7CisJfQogCiAJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQlJPQURDQVNUKQogCQluZXdfbW9kZSB8PSBWTVhORVQzX1JYTV9CQ0FTVDsKQEAgLTIwMzIsNiArMjAzMyw4IEBACiAJCXJ4Q29uZi0+cnhNb2RlID0gY3B1X3RvX2xlMzIobmV3X21vZGUpOwogCQlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0NNRCwKIAkJCQkgICAgICAgVk1YTkVUM19DTURfVVBEQVRFX1JYX01PREUpOworCQlWTVhORVQzX1dSSVRFX0JBUjFfUkVHKGFkYXB0ZXIsIFZNWE5FVDNfUkVHX0NNRCwKKwkJCQkgICAgICAgVk1YTkVUM19DTURfVVBEQVRFX1ZMQU5fRklMVEVSUyk7CiAJfQogCiAJVk1YTkVUM19XUklURV9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19DTUQsCkBAIC0yNjQxLDEyICsyNjQ0LDEzIEBACiAKIAluZXRkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfUlhDU1VNIHwKIAkJTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9IV19WTEFOX1RYIHwKLQkJTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYgfCBORVRJRl9GX0xSTzsKKwkJTkVUSUZfRl9IV19WTEFOX1JYIHwgTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYgfAorCQlORVRJRl9GX0xSTzsKIAlpZiAoZG1hNjQpCi0JCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwotCW5ldGRldi0+dmxhbl9mZWF0dXJlcyA9IG5ldGRldi0+aHdfZmVhdHVyZXMgJiB+TkVUSUZfRl9IV19WTEFOX1RYOwotCW5ldGRldi0+ZmVhdHVyZXMgPSBuZXRkZXYtPmh3X2ZlYXR1cmVzIHwKLQkJTkVUSUZfRl9IV19WTEFOX1JYIHwgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUjsKKwkJbmV0ZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzID0gbmV0ZGV2LT5od19mZWF0dXJlcyAmCisJCQkJfihORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlgpOworCW5ldGRldi0+ZmVhdHVyZXMgPSBuZXRkZXYtPmh3X2ZlYXR1cmVzIHwgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUjsKIAogCW5ldGRldl9pbmZvKGFkYXB0ZXItPm5ldGRldiwKIAkJImZlYXR1cmVzOiBzZyBjc3VtIHZsYW4gamYgdHNvIHRzb0lQdjYgbHJvJXNcbiIsCkBAIC0yODY0LDEwICsyODY4LDkgQEAKIAkJLm5kb19zZXRfbWFjX2FkZHJlc3MgPSB2bXhuZXQzX3NldF9tYWNfYWRkciwKIAkJLm5kb19jaGFuZ2VfbXR1ID0gdm14bmV0M19jaGFuZ2VfbXR1LAogCQkubmRvX3NldF9mZWF0dXJlcyA9IHZteG5ldDNfc2V0X2ZlYXR1cmVzLAotCQkubmRvX2dldF9zdGF0cyA9IHZteG5ldDNfZ2V0X3N0YXRzLAorCQkubmRvX2dldF9zdGF0czY0ID0gdm14bmV0M19nZXRfc3RhdHM2NCwKIAkJLm5kb190eF90aW1lb3V0ID0gdm14bmV0M190eF90aW1lb3V0LAogCQkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHZteG5ldDNfc2V0X21jLAotCQkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIgPSB2bXhuZXQzX3ZsYW5fcnhfcmVnaXN0ZXIsCiAJCS5uZG9fdmxhbl9yeF9hZGRfdmlkID0gdm14bmV0M192bGFuX3J4X2FkZF92aWQsCiAJCS5uZG9fdmxhbl9yeF9raWxsX3ZpZCA9IHZteG5ldDNfdmxhbl9yeF9raWxsX3ZpZCwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgpAQCAtMjg5NCw2ICsyODk3LDcgQEAKIAllbHNlCiAjZW5kaWYKIAkJbnVtX3J4X3F1ZXVlcyA9IDE7CisJbnVtX3J4X3F1ZXVlcyA9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKG51bV9yeF9xdWV1ZXMpOwogCiAJaWYgKGVuYWJsZV9tcSkKIAkJbnVtX3R4X3F1ZXVlcyA9IG1pbihWTVhORVQzX0RFVklDRV9NQVhfVFhfUVVFVUVTLApAQCAtMjkwMSw2ICsyOTA1LDcgQEAKIAllbHNlCiAJCW51bV90eF9xdWV1ZXMgPSAxOwogCisJbnVtX3R4X3F1ZXVlcyA9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKG51bV90eF9xdWV1ZXMpOwogCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyKSwKIAkJCQkgICBtYXgobnVtX3R4X3F1ZXVlcywgbnVtX3J4X3F1ZXVlcykpOwogCXByaW50ayhLRVJOX0lORk8gIiMgb2YgVHggcXVldWVzIDogJWQsICMgb2YgUnggcXVldWVzIDogJWRcbiIsCkBAIC0yOTg4LDYgKzI5OTMsNyBAQAogCQlnb3RvIGVycl92ZXI7CiAJfQogCisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKIAl2bXhuZXQzX2RlY2xhcmVfZmVhdHVyZXMoYWRhcHRlciwgZG1hNjQpOwogCiAJYWRhcHRlci0+ZGV2X251bWJlciA9IGF0b21pY19yZWFkKCZkZXZpY2VzX2ZvdW5kKTsKQEAgLTMwMzMsNyArMzAzOSw2IEBACiAJbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMpOwogCW5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMoYWRhcHRlci0+bmV0ZGV2LCBhZGFwdGVyLT5udW1fcnhfcXVldWVzKTsKIAotCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7CiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAKIAlpZiAoZXJyKSB7CkBAIC0zMDg1LDYgKzMwOTAsNyBAQAogCWVsc2UKICNlbmRpZgogCQludW1fcnhfcXVldWVzID0gMTsKKwludW1fcnhfcXVldWVzID0gcm91bmRkb3duX3Bvd19vZl90d28obnVtX3J4X3F1ZXVlcyk7CiAKIAljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT53b3JrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19ldGh0b29sLmMKaW5kZXggZGM5NTlmZS4uMjc0MDBlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZXRodG9vbC5jCkBAIC0xMTMsMTUgKzExMywxNSBAQAogfTsKIAogCi1zdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCi12bXhuZXQzX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICoKK3ZteG5ldDNfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKIHsKIAlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyOwogCXN0cnVjdCB2bXhuZXQzX3RxX2RyaXZlcl9zdGF0cyAqZHJ2VHhTdGF0czsKIAlzdHJ1Y3Qgdm14bmV0M19ycV9kcml2ZXJfc3RhdHMgKmRydlJ4U3RhdHM7CiAJc3RydWN0IFVQVDFfVHhTdGF0cyAqZGV2VHhTdGF0czsKIAlzdHJ1Y3QgVVBUMV9SeFN0YXRzICpkZXZSeFN0YXRzOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfc3RhdHMgPSAmbmV0ZGV2LT5zdGF0czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCkBAIC0xMzIsMzYgKzEzMiwzNiBAQAogCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01ELCBWTVhORVQzX0NNRF9HRVRfU1RBVFMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmNtZF9sb2NrLCBmbGFncyk7CiAKLQltZW1zZXQobmV0X3N0YXRzLCAwLCBzaXplb2YoKm5ldF9zdGF0cykpOwogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdHhfcXVldWVzOyBpKyspIHsKIAkJZGV2VHhTdGF0cyA9ICZhZGFwdGVyLT50cWRfc3RhcnRbaV0uc3RhdHM7CiAJCWRydlR4U3RhdHMgPSAmYWRhcHRlci0+dHhfcXVldWVbaV0uc3RhdHM7Ci0JCW5ldF9zdGF0cy0+dHhfcGFja2V0cyArPSBkZXZUeFN0YXRzLT51Y2FzdFBrdHNUeE9LICsKLQkJCQkJZGV2VHhTdGF0cy0+bWNhc3RQa3RzVHhPSyArCi0JCQkJCWRldlR4U3RhdHMtPmJjYXN0UGt0c1R4T0s7Ci0JCW5ldF9zdGF0cy0+dHhfYnl0ZXMgKz0gZGV2VHhTdGF0cy0+dWNhc3RCeXRlc1R4T0sgKwotCQkJCSAgICAgIGRldlR4U3RhdHMtPm1jYXN0Qnl0ZXNUeE9LICsKLQkJCQkgICAgICBkZXZUeFN0YXRzLT5iY2FzdEJ5dGVzVHhPSzsKLQkJbmV0X3N0YXRzLT50eF9lcnJvcnMgKz0gZGV2VHhTdGF0cy0+cGt0c1R4RXJyb3I7Ci0JCW5ldF9zdGF0cy0+dHhfZHJvcHBlZCArPSBkcnZUeFN0YXRzLT5kcm9wX3RvdGFsOworCQlzdGF0cy0+dHhfcGFja2V0cyArPSBkZXZUeFN0YXRzLT51Y2FzdFBrdHNUeE9LICsKKwkJCQkgICAgIGRldlR4U3RhdHMtPm1jYXN0UGt0c1R4T0sgKworCQkJCSAgICAgZGV2VHhTdGF0cy0+YmNhc3RQa3RzVHhPSzsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IGRldlR4U3RhdHMtPnVjYXN0Qnl0ZXNUeE9LICsKKwkJCQkgICBkZXZUeFN0YXRzLT5tY2FzdEJ5dGVzVHhPSyArCisJCQkJICAgZGV2VHhTdGF0cy0+YmNhc3RCeXRlc1R4T0s7CisJCXN0YXRzLT50eF9lcnJvcnMgKz0gZGV2VHhTdGF0cy0+cGt0c1R4RXJyb3I7CisJCXN0YXRzLT50eF9kcm9wcGVkICs9IGRydlR4U3RhdHMtPmRyb3BfdG90YWw7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykgewogCQlkZXZSeFN0YXRzID0gJmFkYXB0ZXItPnJxZF9zdGFydFtpXS5zdGF0czsKIAkJZHJ2UnhTdGF0cyA9ICZhZGFwdGVyLT5yeF9xdWV1ZVtpXS5zdGF0czsKLQkJbmV0X3N0YXRzLT5yeF9wYWNrZXRzICs9IGRldlJ4U3RhdHMtPnVjYXN0UGt0c1J4T0sgKwotCQkJCQlkZXZSeFN0YXRzLT5tY2FzdFBrdHNSeE9LICsKLQkJCQkJZGV2UnhTdGF0cy0+YmNhc3RQa3RzUnhPSzsKKwkJc3RhdHMtPnJ4X3BhY2tldHMgKz0gZGV2UnhTdGF0cy0+dWNhc3RQa3RzUnhPSyArCisJCQkJICAgICBkZXZSeFN0YXRzLT5tY2FzdFBrdHNSeE9LICsKKwkJCQkgICAgIGRldlJ4U3RhdHMtPmJjYXN0UGt0c1J4T0s7CiAKLQkJbmV0X3N0YXRzLT5yeF9ieXRlcyArPSBkZXZSeFN0YXRzLT51Y2FzdEJ5dGVzUnhPSyArCi0JCQkJICAgICAgZGV2UnhTdGF0cy0+bWNhc3RCeXRlc1J4T0sgKwotCQkJCSAgICAgIGRldlJ4U3RhdHMtPmJjYXN0Qnl0ZXNSeE9LOworCQlzdGF0cy0+cnhfYnl0ZXMgKz0gZGV2UnhTdGF0cy0+dWNhc3RCeXRlc1J4T0sgKworCQkJCSAgIGRldlJ4U3RhdHMtPm1jYXN0Qnl0ZXNSeE9LICsKKwkJCQkgICBkZXZSeFN0YXRzLT5iY2FzdEJ5dGVzUnhPSzsKIAotCQluZXRfc3RhdHMtPnJ4X2Vycm9ycyArPSBkZXZSeFN0YXRzLT5wa3RzUnhFcnJvcjsKLQkJbmV0X3N0YXRzLT5yeF9kcm9wcGVkICs9IGRydlJ4U3RhdHMtPmRyb3BfdG90YWw7Ci0JCW5ldF9zdGF0cy0+bXVsdGljYXN0ICs9ICBkZXZSeFN0YXRzLT5tY2FzdFBrdHNSeE9LOworCQlzdGF0cy0+cnhfZXJyb3JzICs9IGRldlJ4U3RhdHMtPnBrdHNSeEVycm9yOworCQlzdGF0cy0+cnhfZHJvcHBlZCArPSBkcnZSeFN0YXRzLT5kcm9wX3RvdGFsOworCQlzdGF0cy0+bXVsdGljYXN0ICs9ICBkZXZSeFN0YXRzLT5tY2FzdFBrdHNSeE9LOwogCX0KLQlyZXR1cm4gbmV0X3N0YXRzOworCisJcmV0dXJuIHN0YXRzOwogfQogCiBzdGF0aWMgaW50CkBAIC0yNjgsNyArMjY4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBjaGFuZ2VkID0gZmVhdHVyZXMgXiBuZXRkZXYtPmZlYXR1cmVzOwogCi0JaWYgKGNoYW5nZWQgJiAoTkVUSUZfRl9SWENTVU18TkVUSUZfRl9MUk8pKSB7CisJaWYgKGNoYW5nZWQgJiAoTkVUSUZfRl9SWENTVU0gfCBORVRJRl9GX0xSTyB8IE5FVElGX0ZfSFdfVkxBTl9SWCkpIHsKIAkJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pCiAJCQlhZGFwdGVyLT5zaGFyZWQtPmRldlJlYWQubWlzYy51cHRGZWF0dXJlcyB8PQogCQkJVVBUMV9GX1JYQ1NVTTsKQEAgLTI4NCw2ICsyODQsMTMgQEAKIAkJCWFkYXB0ZXItPnNoYXJlZC0+ZGV2UmVhZC5taXNjLnVwdEZlYXR1cmVzICY9CiAJCQkJCQkJflVQVDFfRl9MUk87CiAKKwkJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQkJYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLm1pc2MudXB0RmVhdHVyZXMgfD0KKwkJCVVQVDFfRl9SWFZMQU47CisJCWVsc2UKKwkJCWFkYXB0ZXItPnNoYXJlZC0+ZGV2UmVhZC5taXNjLnVwdEZlYXR1cmVzICY9CisJCQl+VVBUMV9GX1JYVkxBTjsKKwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+Y21kX2xvY2ssIGZsYWdzKTsKIAkJVk1YTkVUM19XUklURV9CQVIxX1JFRyhhZGFwdGVyLCBWTVhORVQzX1JFR19DTUQsCiAJCQkJICAgICAgIFZNWE5FVDNfQ01EX1VQREFURV9GRUFUVVJFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaCBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaAppbmRleCBmNTBkMzZmLi5iMThlYWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmgKKysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oCkBAIC0yNyw2ICsyNyw3IEBACiAjaWZuZGVmIF9WTVhORVQzX0lOVF9ICiAjZGVmaW5lIF9WTVhORVQzX0lOVF9ICiAKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KQEAgLTU1LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogI2luY2x1ZGUgInZteG5ldDNfZGVmcy5oIgogCkBAIC02OCwxMCArNzAsMTAgQEAKIC8qCiAgKiBWZXJzaW9uIG51bWJlcnMKICAqLwotI2RlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX1NUUklORyAgICIxLjEuOS4wLWsiCisjZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuMS4xOC4wLWsiCiAKIC8qIGEgMzItYml0IGludCwgZWFjaCBieXRlIGVuY29kZSBhIHZlcmlvbiBudW1iZXIgaW4gVk1YTkVUM19EUklWRVJfVkVSU0lPTiAqLwotI2RlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX05VTSAgICAgIDB4MDEwMTA5MDAKKyNkZWZpbmUgVk1YTkVUM19EUklWRVJfVkVSU0lPTl9OVU0gICAgICAweDAxMDExMjAwCiAKICNpZiBkZWZpbmVkKENPTkZJR19QQ0lfTVNJKQogCS8qIFJTUyBvbmx5IG1ha2VzIHNlbnNlIGlmIE1TSS1YIGlzIHN1cHBvcnRlZC4gKi8KQEAgLTMxNSw3ICszMTcsNyBAQAogc3RydWN0IHZteG5ldDNfYWRhcHRlciB7CiAJc3RydWN0IHZteG5ldDNfdHhfcXVldWUJCXR4X3F1ZXVlW1ZNWE5FVDNfREVWSUNFX01BWF9UWF9RVUVVRVNdOwogCXN0cnVjdCB2bXhuZXQzX3J4X3F1ZXVlCQlyeF9xdWV1ZVtWTVhORVQzX0RFVklDRV9NQVhfUlhfUVVFVUVTXTsKLQlzdHJ1Y3Qgdmxhbl9ncm91cAkJKnZsYW5fZ3JwOworCXVuc2lnbmVkIGxvbmcJCQlhY3RpdmVfdmxhbnNbQklUU19UT19MT05HUyhWTEFOX05fVklEKV07CiAJc3RydWN0IHZteG5ldDNfaW50cgkJaW50cjsKIAlzcGlubG9ja190CQkJY21kX2xvY2s7CiAJc3RydWN0IFZteG5ldDNfRHJpdmVyU2hhcmVkCSpzaGFyZWQ7CkBAIC0zMjMsNyArMzI1LDYgQEAKIAlzdHJ1Y3QgVm14bmV0M19UeFF1ZXVlRGVzYwkqdHFkX3N0YXJ0OyAgICAgLyogYWxsIHR4IHF1ZXVlIGRlc2MgKi8KIAlzdHJ1Y3QgVm14bmV0M19SeFF1ZXVlRGVzYwkqcnFkX3N0YXJ0OwkvKiBhbGwgcnggcXVldWUgZGVzYyAqLwogCXN0cnVjdCBuZXRfZGV2aWNlCQkqbmV0ZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCQluZXRfc3RhdHM7CiAJc3RydWN0IHBjaV9kZXYJCQkqcGRldjsKIAogCXU4CQkJX19pb21lbSAqaHdfYWRkcjA7IC8qIGZvciBCQVIgMCAqLwpAQCAtNDA3LDcgKzQwOCw5IEBACiAJCSAgICAgIHUzMiB0eF9yaW5nX3NpemUsIHUzMiByeF9yaW5nX3NpemUsIHUzMiByeF9yaW5nMl9zaXplKTsKIAogZXh0ZXJuIHZvaWQgdm14bmV0M19zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Ci1leHRlcm4gc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZteG5ldDNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworCitleHRlcm4gc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICoKK3ZteG5ldDNfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cyk7CiAKIGV4dGVybiBjaGFyIHZteG5ldDNfZHJpdmVyX25hbWVbXTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdnhnZS92eGdlLWNvbmZpZy5jIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLWNvbmZpZy5jCmluZGV4IDMyNzYzYjIuLjE1MjBjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1jb25maWcuYworKysgYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtY29uZmlnLmMKQEAgLTU4Miw3ICs1ODIsNyBAQAogCQlnb3RvIGV4aXQ7CiAKIAl2YWw2NCA9CXJlYWRxKCZsZWdhY3lfcmVnLT50b2NfZmlyc3RfcG9pbnRlcik7Ci0JdG9jID0gKHN0cnVjdCB2eGdlX2h3X3RvY19yZWcgX19pb21lbSAqKShiYXIwK3ZhbDY0KTsKKwl0b2MgPSBiYXIwICsgdmFsNjQ7CiBleGl0OgogCXJldHVybiB0b2M7CiB9CkBAIC02MDAsNyArNjAwLDcgQEAKIAl1MzIgaTsKIAllbnVtIHZ4Z2VfaHdfc3RhdHVzIHN0YXR1cyA9IFZYR0VfSFdfT0s7CiAKLQlobGRldi0+bGVnYWN5X3JlZyA9IChzdHJ1Y3QgdnhnZV9od19sZWdhY3lfcmVnIF9faW9tZW0gKilobGRldi0+YmFyMDsKKwlobGRldi0+bGVnYWN5X3JlZyA9IGhsZGV2LT5iYXIwOwogCiAJaGxkZXYtPnRvY19yZWcgPSBfX3Z4Z2VfaHdfZGV2aWNlX3RvY19nZXQoaGxkZXYtPmJhcjApOwogCWlmIChobGRldi0+dG9jX3JlZyAgPT0gTlVMTCkgewpAQCAtNjA5LDM5ICs2MDksMzEgQEAKIAl9CiAKIAl2YWw2NCA9IHJlYWRxKCZobGRldi0+dG9jX3JlZy0+dG9jX2NvbW1vbl9wb2ludGVyKTsKLQlobGRldi0+Y29tbW9uX3JlZyA9Ci0JKHN0cnVjdCB2eGdlX2h3X2NvbW1vbl9yZWcgX19pb21lbSAqKShobGRldi0+YmFyMCArIHZhbDY0KTsKKwlobGRldi0+Y29tbW9uX3JlZyA9IGhsZGV2LT5iYXIwICsgdmFsNjQ7CiAKIAl2YWw2NCA9IHJlYWRxKCZobGRldi0+dG9jX3JlZy0+dG9jX21ycGNpbV9wb2ludGVyKTsKLQlobGRldi0+bXJwY2ltX3JlZyA9Ci0JCShzdHJ1Y3QgdnhnZV9od19tcnBjaW1fcmVnIF9faW9tZW0gKikoaGxkZXYtPmJhcjAgKyB2YWw2NCk7CisJaGxkZXYtPm1ycGNpbV9yZWcgPSBobGRldi0+YmFyMCArIHZhbDY0OwogCiAJZm9yIChpID0gMDsgaSA8IFZYR0VfSFdfVElUQU5fU1JQQ0lNX1JFR19TUEFDRVM7IGkrKykgewogCQl2YWw2NCA9IHJlYWRxKCZobGRldi0+dG9jX3JlZy0+dG9jX3NycGNpbV9wb2ludGVyW2ldKTsKLQkJaGxkZXYtPnNycGNpbV9yZWdbaV0gPQotCQkJKHN0cnVjdCB2eGdlX2h3X3NycGNpbV9yZWcgX19pb21lbSAqKQotCQkJCShobGRldi0+YmFyMCArIHZhbDY0KTsKKwkJaGxkZXYtPnNycGNpbV9yZWdbaV0gPSBobGRldi0+YmFyMCArIHZhbDY0OwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBWWEdFX0hXX1RJVEFOX1ZQTUdNVF9SRUdfU1BBQ0VTOyBpKyspIHsKIAkJdmFsNjQgPSByZWFkcSgmaGxkZXYtPnRvY19yZWctPnRvY192cG1nbXRfcG9pbnRlcltpXSk7Ci0JCWhsZGV2LT52cG1nbXRfcmVnW2ldID0KLQkJKHN0cnVjdCB2eGdlX2h3X3ZwbWdtdF9yZWcgX19pb21lbSAqKShobGRldi0+YmFyMCArIHZhbDY0KTsKKwkJaGxkZXYtPnZwbWdtdF9yZWdbaV0gPSBobGRldi0+YmFyMCArIHZhbDY0OwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBWWEdFX0hXX1RJVEFOX1ZQQVRIX1JFR19TUEFDRVM7IGkrKykgewogCQl2YWw2NCA9IHJlYWRxKCZobGRldi0+dG9jX3JlZy0+dG9jX3ZwYXRoX3BvaW50ZXJbaV0pOwotCQlobGRldi0+dnBhdGhfcmVnW2ldID0KLQkJCShzdHJ1Y3QgdnhnZV9od192cGF0aF9yZWcgX19pb21lbSAqKQotCQkJCShobGRldi0+YmFyMCArIHZhbDY0KTsKKwkJaGxkZXYtPnZwYXRoX3JlZ1tpXSA9IGhsZGV2LT5iYXIwICsgdmFsNjQ7CiAJfQogCiAJdmFsNjQgPSByZWFkcSgmaGxkZXYtPnRvY19yZWctPnRvY19rZGZjKTsKIAogCXN3aXRjaCAoVlhHRV9IV19UT0NfR0VUX0tERkNfSU5JVElBTF9CSVIodmFsNjQpKSB7CiAJY2FzZSAwOgotCQlobGRldi0+a2RmYyA9ICh1OCBfX2lvbWVtICopKGhsZGV2LT5iYXIwICsKLQkJCVZYR0VfSFdfVE9DX0dFVF9LREZDX0lOSVRJQUxfT0ZGU0VUKHZhbDY0KSk7CisJCWhsZGV2LT5rZGZjID0gaGxkZXYtPmJhcjAgKyBWWEdFX0hXX1RPQ19HRVRfS0RGQ19JTklUSUFMX09GRlNFVCh2YWw2NCkgOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTc2MSwxMiArNzUzLDExIEBACiBzdGF0aWMgZW51bSB2eGdlX2h3X3N0YXR1cwogX192eGdlX2h3X3ZlcmlmeV9wY2lfZV9pbmZvKHN0cnVjdCBfX3Z4Z2VfaHdfZGV2aWNlICpobGRldikKIHsKLQlpbnQgZXhwX2NhcDsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaGxkZXYtPnBkZXY7CiAJdTE2IGxuazsKIAogCS8qIEdldCB0aGUgbmVnb3RpYXRlZCBsaW5rIHdpZHRoIGFuZCBzcGVlZCBmcm9tIFBDSSBjb25maWcgc3BhY2UgKi8KLQlleHBfY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShobGRldi0+cGRldiwgUENJX0NBUF9JRF9FWFApOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGhsZGV2LT5wZGV2LCBleHBfY2FwICsgUENJX0VYUF9MTktTVEEsICZsbmspOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgZGV2LT5wY2llX2NhcCArIFBDSV9FWFBfTE5LU1RBLCAmbG5rKTsKIAogCWlmICgobG5rICYgUENJX0VYUF9MTktTVEFfQ0xTKSAhPSAxKQogCQlyZXR1cm4gVlhHRV9IV19FUlJfSU5WQUxJRF9QQ0lfSU5GTzsKQEAgLTEwMjQsNyArMTAxNSw3IEBACiAJfQogCiAJdmFsNjQgPSByZWFkcSgmdG9jLT50b2NfY29tbW9uX3BvaW50ZXIpOwotCWNvbW1vbl9yZWcgPSAoc3RydWN0IHZ4Z2VfaHdfY29tbW9uX3JlZyBfX2lvbWVtICopKGJhcjAgKyB2YWw2NCk7CisJY29tbW9uX3JlZyA9IGJhcjAgKyB2YWw2NDsKIAogCXN0YXR1cyA9IF9fdnhnZV9od19kZXZpY2VfdnBhdGhfcmVzZXRfaW5fcHJvZ19jaGVjaygKIAkJKHU2NCBfX2lvbWVtICopJmNvbW1vbl9yZWctPnZwYXRoX3JzdF9pbl9wcm9nKTsKQEAgLTEwNDQsOCArMTAzNSw3IEBACiAKIAkJdmFsNjQgPSByZWFkcSgmdG9jLT50b2NfdnBtZ210X3BvaW50ZXJbaV0pOwogCi0JCXZwbWdtdF9yZWcgPSAoc3RydWN0IHZ4Z2VfaHdfdnBtZ210X3JlZyBfX2lvbWVtICopCi0JCQkJKGJhcjAgKyB2YWw2NCk7CisJCXZwbWdtdF9yZWcgPSBiYXIwICsgdmFsNjQ7CiAKIAkJaHdfaW5mby0+ZnVuY19pZCA9IF9fdnhnZV9od192cGF0aF9mdW5jX2lkX2dldCh2cG1nbXRfcmVnKTsKIAkJaWYgKF9fdnhnZV9od19kZXZpY2VfYWNjZXNzX3JpZ2h0c19nZXQoaHdfaW5mby0+aG9zdF90eXBlLApAQCAtMTA1NCw4ICsxMDQ0LDcgQEAKIAogCQkJdmFsNjQgPSByZWFkcSgmdG9jLT50b2NfbXJwY2ltX3BvaW50ZXIpOwogCi0JCQltcnBjaW1fcmVnID0gKHN0cnVjdCB2eGdlX2h3X21ycGNpbV9yZWcgX19pb21lbSAqKQotCQkJCQkoYmFyMCArIHZhbDY0KTsKKwkJCW1ycGNpbV9yZWcgPSBiYXIwICsgdmFsNjQ7CiAKIAkJCXdyaXRlcSgwLCAmbXJwY2ltX3JlZy0+eGdtYWNfZ2VuX2Z3X21lbW9fbWFzayk7CiAJCQl3bWIoKTsKQEAgLTEwNjQsOCArMTA1Myw3IEBACiAJCXZhbDY0ID0gcmVhZHEoJnRvYy0+dG9jX3ZwYXRoX3BvaW50ZXJbaV0pOwogCiAJCXNwaW5fbG9ja19pbml0KCZ2cGF0aC5sb2NrKTsKLQkJdnBhdGgudnBfcmVnID0gKHN0cnVjdCB2eGdlX2h3X3ZwYXRoX3JlZyBfX2lvbWVtICopCi0JCQkgICAgICAgKGJhcjAgKyB2YWw2NCk7CisJCXZwYXRoLnZwX3JlZyA9IGJhcjAgKyB2YWw2NDsKIAkJdnBhdGgudnBfb3BlbiA9IFZYR0VfSFdfVlBfTk9UX09QRU47CiAKIAkJc3RhdHVzID0gX192eGdlX2h3X3ZwYXRoX3BjaV9mdW5jX21vZGVfZ2V0KCZ2cGF0aCwgaHdfaW5mbyk7CkBAIC0xMDg4LDggKzEwNzYsNyBAQAogCQkJY29udGludWU7CiAKIAkJdmFsNjQgPSByZWFkcSgmdG9jLT50b2NfdnBhdGhfcG9pbnRlcltpXSk7Ci0JCXZwYXRoLnZwX3JlZyA9IChzdHJ1Y3QgdnhnZV9od192cGF0aF9yZWcgX19pb21lbSAqKQotCQkJICAgICAgIChiYXIwICsgdmFsNjQpOworCQl2cGF0aC52cF9yZWcgPSBiYXIwICsgdmFsNjQ7CiAJCXZwYXRoLnZwX29wZW4gPSBWWEdFX0hXX1ZQX05PVF9PUEVOOwogCiAJCXN0YXR1cyA9ICBfX3Z4Z2VfaHdfdnBhdGhfYWRkcl9nZXQoJnZwYXRoLApAQCAtMTk5NCwxMyArMTk4MSwxMSBAQAogCiB1MTYgdnhnZV9od19kZXZpY2VfbGlua193aWR0aF9nZXQoc3RydWN0IF9fdnhnZV9od19kZXZpY2UgKmhsZGV2KQogewotCWludCBsaW5rX3dpZHRoLCBleHBfY2FwOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBobGRldi0+cGRldjsKIAl1MTYgbG5rOwogCi0JZXhwX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkoaGxkZXYtPnBkZXYsIFBDSV9DQVBfSURfRVhQKTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChobGRldi0+cGRldiwgZXhwX2NhcCArIFBDSV9FWFBfTE5LU1RBLCAmbG5rKTsKLQlsaW5rX3dpZHRoID0gKGxuayAmIFZYR0VfSFdfUENJX0VYUF9MTktDQVBfTE5LX1dJRFRIKSA+PiA0OwotCXJldHVybiBsaW5rX3dpZHRoOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgZGV2LT5wY2llX2NhcCArIFBDSV9FWFBfTE5LU1RBLCAmbG5rKTsKKwlyZXR1cm4gKGxuayAmIFZYR0VfSFdfUENJX0VYUF9MTktDQVBfTE5LX1dJRFRIKSA+PiA0OwogfQogCiAvKgpAQCAtMjE0MCw4ICsyMTI1LDcgQEAKIAkJCQkJbWVtYmxvY2tfaW5kZXgsIGl0ZW0sCiAJCQkJCSZtZW1ibG9ja19pdGVtX2lkeCk7CiAKLQkJcnhkcCA9IChzdHJ1Y3QgdnhnZV9od19yaW5nX3J4ZF8xICopCi0JCQkJcmluZy0+Y2hhbm5lbC5yZXNlcnZlX2FycltyZXNlcnZlX2luZGV4XTsKKwkJcnhkcCA9IHJpbmctPmNoYW5uZWwucmVzZXJ2ZV9hcnJbcmVzZXJ2ZV9pbmRleF07CiAKIAkJdWxkX3ByaXYgPSAoKHU4ICopcnhkYmxvY2tfcHJpdiArIHJpbmctPnJ4ZF9wcml2X3NpemUgKiBpKTsKIApAQCAtNDg4MCw4ICs0ODY0LDcgQEAKIAkJZ290byB2cGF0aF9vcGVuX2V4aXQ4OwogCX0KIAotCXZwYXRoLT5od19zdGF0cyA9IChzdHJ1Y3QgdnhnZV9od192cGF0aF9zdGF0c19od19pbmZvICopdnBhdGgtPgotCQkJc3RhdHNfYmxvY2stPm1lbWJsb2NrOworCXZwYXRoLT5od19zdGF0cyA9IHZwYXRoLT5zdGF0c19ibG9jay0+bWVtYmxvY2s7CiAJbWVtc2V0KHZwYXRoLT5od19zdGF0cywgMCwKIAkJc2l6ZW9mKHN0cnVjdCB2eGdlX2h3X3ZwYXRoX3N0YXRzX2h3X2luZm8pKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdnhnZS92eGdlLWNvbmZpZy5oIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLWNvbmZpZy5oCmluZGV4IDM1OWI5YjkuLmRkMzYyNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1jb25maWcuaAorKysgYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtY29uZmlnLmgKQEAgLTEzLDggKzEzLDEwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBWWEdFX0NPTkZJR19ICiAjZGVmaW5lIFZYR0VfQ09ORklHX0gKKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2lmbmRlZiBWWEdFX0NBQ0hFX0xJTkVfU0laRQogI2RlZmluZSBWWEdFX0NBQ0hFX0xJTkVfU0laRSAxMjgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1tYWluLmMgYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtbWFpbi5jCmluZGV4IDhhYjg3MGEuLjE3ODM0OGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1tYWluLmMKQEAgLTQzLDcgKzQzLDkgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KQEAgLTI5NSwyMyArMjk3LDIyIEBACiAJc2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIHJpbmctPmRyaXZlcl9pZCk7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcmluZy0+bmRldik7CiAKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyaW5nLT5zdGF0cy5zeW5jcCk7CiAJcmluZy0+c3RhdHMucnhfZnJtcysrOwogCXJpbmctPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW5ndGg7CiAKIAlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTVVMVElDQVNUKQogCQlyaW5nLT5zdGF0cy5yeF9tY2FzdCsrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyaW5nLT5zdGF0cy5zeW5jcCk7CiAKIAl2eGdlX2RlYnVnX3J4KFZYR0VfVFJBQ0UsCiAJCSIlczogJXM6JWQgIHNrYiBwcm90b2NvbCA9ICVkIiwKIAkJcmluZy0+bmRldi0+bmFtZSwgX19mdW5jX18sIF9fTElORV9fLCBza2ItPnByb3RvY29sKTsKIAotCWlmIChyaW5nLT52bGdycCAmJiBleHRfaW5mby0+dmxhbiAmJgotCQkocmluZy0+dmxhbl90YWdfc3RyaXAgPT0KLQkJCVZYR0VfSFdfVlBBVEhfUlBBX1NUUklQX1ZMQU5fVEFHX0VOQUJMRSkpCi0JCXZsYW5fZ3JvX3JlY2VpdmUocmluZy0+bmFwaV9wLCByaW5nLT52bGdycCwKLQkJCQlleHRfaW5mby0+dmxhbiwgc2tiKTsKLQllbHNlCi0JCW5hcGlfZ3JvX3JlY2VpdmUocmluZy0+bmFwaV9wLCBza2IpOworCWlmIChleHRfaW5mby0+dmxhbiAmJgorCSAgICByaW5nLT52bGFuX3RhZ19zdHJpcCA9PSBWWEdFX0hXX1ZQQVRIX1JQQV9TVFJJUF9WTEFOX1RBR19FTkFCTEUpCisJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCBleHRfaW5mby0+dmxhbik7CisJbmFwaV9ncm9fcmVjZWl2ZShyaW5nLT5uYXBpX3AsIHNrYik7CiAKIAl2eGdlX2RlYnVnX2VudHJ5ZXhpdChWWEdFX1RSQUNFLAogCQkiJXM6ICVzOiVkIEV4aXRpbmcuLi4iLCByaW5nLT5uZGV2LT5uYW1lLCBfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtNTkxLDggKzU5MiwxMCBAQAogCQl2eGdlX2h3X2ZpZm9fdHhkbF9mcmVlKGZpZm9faHcsIGR0cik7CiAKIAkJLyogVXBkYXRpbmcgdGhlIHN0YXRpc3RpY3MgYmxvY2sgKi8KKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmZmlmby0+c3RhdHMuc3luY3ApOwogCQlmaWZvLT5zdGF0cy50eF9mcm1zKys7CiAJCWZpZm8tPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmZmlmby0+c3RhdHMuc3luY3ApOwogCiAJCSpkb25lX3NrYisrID0gc2tiOwogCkBAIC02MjgsNyArNjMxLDcgQEAKIAogCQlpcCA9IGlwX2hkcihza2IpOwogCi0JCWlmICgoaXAtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUfElQX01GKSkgPT0gMCkgeworCQlpZiAoIWlwX2lzX2ZyYWdtZW50KGlwKSkgewogCQkJdGggPSAoc3RydWN0IHRjcGhkciAqKSgoKHVuc2lnbmVkIGNoYXIgKilpcCkgKwogCQkJCQlpcC0+aWhsKjQpOwogCkBAIC02NzksOCArNjgyLDcgQEAKIAluZXdfbWFjX2VudHJ5LT5zdGF0ZSA9IG1hYy0+c3RhdGU7CiAJdnBhdGgtPm1hY19hZGRyX2NudCsrOwogCi0JLyogSXMgdGhpcyBhIG11bHRpY2FzdCBhZGRyZXNzICovCi0JaWYgKDB4MDEgJiBtYWMtPm1hY2FkZHJbMF0pCisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKG1hYy0+bWFjYWRkcikpCiAJCXZwYXRoLT5tY2FzdF9hZGRyX2NudCsrOwogCiAJcmV0dXJuIFRSVUU7CkBAIC02OTQsNyArNjk2LDcgQEAKIAlzdHJ1Y3QgdnhnZV92cGF0aCAqdnBhdGg7CiAJZW51bSB2eGdlX2h3X3ZwYXRoX21hY19hZGRyX2FkZF9tb2RlIGR1cGxpY2F0ZV9tb2RlOwogCi0JaWYgKDB4MDEgJiBtYWMtPm1hY2FkZHJbMF0pIC8qIG11bHRpY2FzdCBhZGRyZXNzICovCisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKG1hYy0+bWFjYWRkcikpCiAJCWR1cGxpY2F0ZV9tb2RlID0gVlhHRV9IV19WUEFUSF9NQUNfQUREUl9BRERfRFVQTElDQVRFOwogCWVsc2UKIAkJZHVwbGljYXRlX21vZGUgPSBWWEdFX0hXX1ZQQVRIX01BQ19BRERSX1JFUExBQ0VfRFVQTElDQVRFOwpAQCAtMTA3Myw4ICsxMDc1LDcgQEAKIAkJCWtmcmVlKChzdHJ1Y3QgdnhnZV9tYWNfYWRkcnMgKillbnRyeSk7CiAJCQl2cGF0aC0+bWFjX2FkZHJfY250LS07CiAKLQkJCS8qIElzIHRoaXMgYSBtdWx0aWNhc3QgYWRkcmVzcyAqLwotCQkJaWYgKDB4MDEgJiBtYWMtPm1hY2FkZHJbMF0pCisJCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIobWFjLT5tYWNhZGRyKSkKIAkJCQl2cGF0aC0+bWNhc3RfYWRkcl9jbnQtLTsKIAkJCXJldHVybiBUUlVFOwogCQl9CkBAIC0xMTk2LDggKzExOTcsNyBAQAogCQkJCW1hY19hZGRyZXNzID0gKHU4ICopJm1hY19lbnRyeS0+bWFjYWRkcjsKIAkJCQltZW1jcHkobWFjX2luZm8ubWFjYWRkciwgbWFjX2FkZHJlc3MsIEVUSF9BTEVOKTsKIAotCQkJCS8qIElzIHRoaXMgYSBtdWx0aWNhc3QgYWRkcmVzcyAqLwotCQkJCWlmICgweDAxICYgbWFjX2luZm8ubWFjYWRkclswXSkgeworCQkJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihtYWNfaW5mby5tYWNhZGRyKSkgewogCQkJCQlmb3IgKHZwYXRoX2lkeCA9IDA7IHZwYXRoX2lkeCA8CiAJCQkJCQl2ZGV2LT5ub19vZl92cGF0aDsKIAkJCQkJCXZwYXRoX2lkeCsrKSB7CkBAIC0xMjM5LDggKzEyMzksNyBAQAogCQkJCW1hY19hZGRyZXNzID0gKHU4ICopJm1hY19lbnRyeS0+bWFjYWRkcjsKIAkJCQltZW1jcHkobWFjX2luZm8ubWFjYWRkciwgbWFjX2FkZHJlc3MsIEVUSF9BTEVOKTsKIAotCQkJCS8qIElzIHRoaXMgYSBtdWx0aWNhc3QgYWRkcmVzcyAqLwotCQkJCWlmICgweDAxICYgbWFjX2luZm8ubWFjYWRkclswXSkKKwkJCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIobWFjX2luZm8ubWFjYWRkcikpCiAJCQkJCWJyZWFrOwogCQkJfQogCkBAIC0xNDg4LDE1ICsxNDg3LDExIEBACiAJc3RydWN0IHZ4Z2VkZXYgKnZkZXYgPSB2cGF0aC0+dmRldjsKIAl1MTYgdmlkOwogCi0JaWYgKHZkZXYtPnZsZ3JwICYmIHZwYXRoLT5pc19vcGVuKSB7CisJaWYgKCF2cGF0aC0+aXNfb3BlbikKKwkJcmV0dXJuIHN0YXR1czsKIAotCQlmb3IgKHZpZCA9IDA7IHZpZCA8IFZMQU5fTl9WSUQ7IHZpZCsrKSB7Ci0JCQlpZiAoIXZsYW5fZ3JvdXBfZ2V0X2RldmljZSh2ZGV2LT52bGdycCwgdmlkKSkKLQkJCQljb250aW51ZTsKLQkJCS8qIEFkZCB0aGVzZSB2bGFuIHRvIHRoZSB2aWQgdGFibGUgKi8KLQkJCXN0YXR1cyA9IHZ4Z2VfaHdfdnBhdGhfdmlkX2FkZCh2cGF0aC0+aGFuZGxlLCB2aWQpOwotCQl9Ci0JfQorCWZvcl9lYWNoX3NldF9iaXQodmlkLCB2ZGV2LT5hY3RpdmVfdmxhbnMsIFZMQU5fTl9WSUQpCisJCXN0YXR1cyA9IHZ4Z2VfaHdfdnBhdGhfdmlkX2FkZCh2cGF0aC0+aGFuZGxlLCB2aWQpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI2MjksMTEgKzI2MjQsMTYgQEAKIAlzdHJ1Y3QgdnhnZV92cGF0aCAqdnBhdGg7CiAJc3RydWN0IHZ4Z2VfcmluZyAqcmluZzsKIAlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHJ4X2ZybXM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgdmRldi0+bm9fb2ZfdnBhdGg7IGkrKykgewogCQlyaW5nID0gJnZkZXYtPnZwYXRoc1tpXS5yaW5nOworCisJCS8qIFRydW5jYXRlZCB0byBtYWNoaW5lIHdvcmQgc2l6ZSBudW1iZXIgb2YgZnJhbWVzICovCisJCXJ4X2ZybXMgPSBBQ0NFU1NfT05DRShyaW5nLT5zdGF0cy5yeF9mcm1zKTsKKwogCQkvKiBEaWQgdGhpcyB2cGF0aCByZWNlaXZlZCBhbnkgcGFja2V0cyAqLwotCQlpZiAocmluZy0+c3RhdHMucHJldl9yeF9mcm1zID09IHJpbmctPnN0YXRzLnJ4X2ZybXMpIHsKKwkJaWYgKHJpbmctPnN0YXRzLnByZXZfcnhfZnJtcyA9PSByeF9mcm1zKSB7CiAJCQlzdGF0dXMgPSB2eGdlX2h3X3ZwYXRoX2NoZWNrX2xlYWsocmluZy0+aGFuZGxlKTsKIAogCQkJLyogRGlkIGl0IHJlY2VpdmVkIGFueSBwYWNrZXRzIGxhc3QgdGltZSAqLwpAQCAtMjY1Myw3ICsyNjUzLDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJcmluZy0+c3RhdHMucHJldl9yeF9mcm1zID0gcmluZy0+c3RhdHMucnhfZnJtczsKKwkJcmluZy0+c3RhdHMucHJldl9yeF9mcm1zID0gcnhfZnJtczsKIAkJcmluZy0+bGFzdF9zdGF0dXMgPSBzdGF0dXM7CiAJfQogCkBAIC0zMTI0LDE0ICszMTI0LDM2IEBACiAKIAkvKiBuZXRfc3RhdHMgYWxyZWFkeSB6ZXJvZWQgYnkgY2FsbGVyICovCiAJZm9yIChrID0gMDsgayA8IHZkZXYtPm5vX29mX3ZwYXRoOyBrKyspIHsKLQkJbmV0X3N0YXRzLT5yeF9wYWNrZXRzICs9IHZkZXYtPnZwYXRoc1trXS5yaW5nLnN0YXRzLnJ4X2ZybXM7Ci0JCW5ldF9zdGF0cy0+cnhfYnl0ZXMgKz0gdmRldi0+dnBhdGhzW2tdLnJpbmcuc3RhdHMucnhfYnl0ZXM7Ci0JCW5ldF9zdGF0cy0+cnhfZXJyb3JzICs9IHZkZXYtPnZwYXRoc1trXS5yaW5nLnN0YXRzLnJ4X2Vycm9yczsKLQkJbmV0X3N0YXRzLT5tdWx0aWNhc3QgKz0gdmRldi0+dnBhdGhzW2tdLnJpbmcuc3RhdHMucnhfbWNhc3Q7Ci0JCW5ldF9zdGF0cy0+cnhfZHJvcHBlZCArPSB2ZGV2LT52cGF0aHNba10ucmluZy5zdGF0cy5yeF9kcm9wcGVkOwotCQluZXRfc3RhdHMtPnR4X3BhY2tldHMgKz0gdmRldi0+dnBhdGhzW2tdLmZpZm8uc3RhdHMudHhfZnJtczsKLQkJbmV0X3N0YXRzLT50eF9ieXRlcyArPSB2ZGV2LT52cGF0aHNba10uZmlmby5zdGF0cy50eF9ieXRlczsKLQkJbmV0X3N0YXRzLT50eF9lcnJvcnMgKz0gdmRldi0+dnBhdGhzW2tdLmZpZm8uc3RhdHMudHhfZXJyb3JzOworCQlzdHJ1Y3QgdnhnZV9yaW5nX3N0YXRzICpyeHN0YXRzID0gJnZkZXYtPnZwYXRoc1trXS5yaW5nLnN0YXRzOworCQlzdHJ1Y3QgdnhnZV9maWZvX3N0YXRzICp0eHN0YXRzID0gJnZkZXYtPnZwYXRoc1trXS5maWZvLnN0YXRzOworCQl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJCXU2NCBwYWNrZXRzLCBieXRlcywgbXVsdGljYXN0OworCisJCWRvIHsKKwkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luKCZyeHN0YXRzLT5zeW5jcCk7CisKKwkJCXBhY2tldHMgICA9IHJ4c3RhdHMtPnJ4X2ZybXM7CisJCQltdWx0aWNhc3QgPSByeHN0YXRzLT5yeF9tY2FzdDsKKwkJCWJ5dGVzICAgICA9IHJ4c3RhdHMtPnJ4X2J5dGVzOworCQl9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoJnJ4c3RhdHMtPnN5bmNwLCBzdGFydCkpOworCisJCW5ldF9zdGF0cy0+cnhfcGFja2V0cyArPSBwYWNrZXRzOworCQluZXRfc3RhdHMtPnJ4X2J5dGVzICs9IGJ5dGVzOworCQluZXRfc3RhdHMtPm11bHRpY2FzdCArPSBtdWx0aWNhc3Q7CisKKwkJbmV0X3N0YXRzLT5yeF9lcnJvcnMgKz0gcnhzdGF0cy0+cnhfZXJyb3JzOworCQluZXRfc3RhdHMtPnJ4X2Ryb3BwZWQgKz0gcnhzdGF0cy0+cnhfZHJvcHBlZDsKKworCQlkbyB7CisJCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbigmdHhzdGF0cy0+c3luY3ApOworCisJCQlwYWNrZXRzID0gdHhzdGF0cy0+dHhfZnJtczsKKwkJCWJ5dGVzICAgPSB0eHN0YXRzLT50eF9ieXRlczsKKwkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5KCZ0eHN0YXRzLT5zeW5jcCwgc3RhcnQpKTsKKworCQluZXRfc3RhdHMtPnR4X3BhY2tldHMgKz0gcGFja2V0czsKKwkJbmV0X3N0YXRzLT50eF9ieXRlcyArPSBieXRlczsKKwkJbmV0X3N0YXRzLT50eF9lcnJvcnMgKz0gdHhzdGF0cy0+dHhfZXJyb3JzOwogCX0KIAogCXJldHVybiBuZXRfc3RhdHM7CkBAIC0zMjc1LDYwICszMjk3LDYgQEAKIH0KIAogLyoqCi0gKiB2eGdlX3ZsYW5fcnhfcmVnaXN0ZXIKLSAqIEBkZXY6IG5ldCBkZXZpY2UgcG9pbnRlci4KLSAqIEBncnA6IHZsYW4gZ3JvdXAKLSAqCi0gKiBWbGFuIGdyb3VwIHJlZ2lzdHJhdGlvbgotICovCi1zdGF0aWMgdm9pZAotdnhnZV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0Jc3RydWN0IHZ4Z2VkZXYgKnZkZXY7Ci0Jc3RydWN0IHZ4Z2VfdnBhdGggKnZwYXRoOwotCWludCB2cDsKLQl1NjQgdmlkOwotCWVudW0gdnhnZV9od19zdGF0dXMgc3RhdHVzOwotCWludCBpOwotCi0JdnhnZV9kZWJ1Z19lbnRyeWV4aXQoVlhHRV9UUkFDRSwgIiVzOiVkIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCXZkZXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JdnBhdGggPSAmdmRldi0+dnBhdGhzWzBdOwotCWlmICgoTlVMTCA9PSBncnApICYmICh2cGF0aC0+aXNfb3BlbikpIHsKLQkJLyogR2V0IHRoZSBmaXJzdCB2bGFuICovCi0JCXN0YXR1cyA9IHZ4Z2VfaHdfdnBhdGhfdmlkX2dldCh2cGF0aC0+aGFuZGxlLCAmdmlkKTsKLQotCQl3aGlsZSAoc3RhdHVzID09IFZYR0VfSFdfT0spIHsKLQotCQkJLyogRGVsZXRlIHRoaXMgdmxhbiBmcm9tIHRoZSB2aWQgdGFibGUgKi8KLQkJCWZvciAodnAgPSAwOyB2cCA8IHZkZXYtPm5vX29mX3ZwYXRoOyB2cCsrKSB7Ci0JCQkJdnBhdGggPSAmdmRldi0+dnBhdGhzW3ZwXTsKLQkJCQlpZiAoIXZwYXRoLT5pc19vcGVuKQotCQkJCQljb250aW51ZTsKLQotCQkJCXZ4Z2VfaHdfdnBhdGhfdmlkX2RlbGV0ZSh2cGF0aC0+aGFuZGxlLCB2aWQpOwotCQkJfQotCi0JCQkvKiBHZXQgdGhlIG5leHQgdmxhbiB0byBiZSBkZWxldGVkICovCi0JCQl2cGF0aCA9ICZ2ZGV2LT52cGF0aHNbMF07Ci0JCQlzdGF0dXMgPSB2eGdlX2h3X3ZwYXRoX3ZpZF9nZXQodnBhdGgtPmhhbmRsZSwgJnZpZCk7Ci0JCX0KLQl9Ci0KLQl2ZGV2LT52bGdycCA9IGdycDsKLQotCWZvciAoaSA9IDA7IGkgPCB2ZGV2LT5ub19vZl92cGF0aDsgaSsrKSB7Ci0JCWlmICh2ZGV2LT52cGF0aHNbaV0uaXNfY29uZmlndXJlZCkKLQkJCXZkZXYtPnZwYXRoc1tpXS5yaW5nLnZsZ3JwID0gZ3JwOwotCX0KLQotCXZ4Z2VfZGVidWdfZW50cnlleGl0KFZYR0VfVFJBQ0UsCi0JCSIlczolZCAgRXhpdGluZy4uLiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci19Ci0KLS8qKgogICogdnhnZV92bGFuX3J4X2FkZF92aWQKICAqIEBkZXY6IG5ldCBkZXZpY2UgcG9pbnRlci4KICAqIEB2aWQ6IHZpZApAQCAtMzMzOCwxMiArMzMwNiwxMCBAQAogc3RhdGljIHZvaWQKIHZ4Z2Vfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKLQlzdHJ1Y3QgdnhnZWRldiAqdmRldjsKKwlzdHJ1Y3QgdnhnZWRldiAqdmRldiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHZ4Z2VfdnBhdGggKnZwYXRoOwogCWludCB2cF9pZDsKIAotCXZkZXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCiAJLyogQWRkIHRoZXNlIHZsYW4gdG8gdGhlIHZpZCB0YWJsZSAqLwogCWZvciAodnBfaWQgPSAwOyB2cF9pZCA8IHZkZXYtPm5vX29mX3ZwYXRoOyB2cF9pZCsrKSB7CiAJCXZwYXRoID0gJnZkZXYtPnZwYXRoc1t2cF9pZF07CkBAIC0zMzUxLDYgKzMzMTcsNyBAQAogCQkJY29udGludWU7CiAJCXZ4Z2VfaHdfdnBhdGhfdmlkX2FkZCh2cGF0aC0+aGFuZGxlLCB2aWQpOwogCX0KKwlzZXRfYml0KHZpZCwgdmRldi0+YWN0aXZlX3ZsYW5zKTsKIH0KIAogLyoqCkBAIC0zMzYzLDE2ICszMzMwLDEyIEBACiBzdGF0aWMgdm9pZAogdnhnZV92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKLQlzdHJ1Y3QgdnhnZWRldiAqdmRldjsKKwlzdHJ1Y3QgdnhnZWRldiAqdmRldiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHZ4Z2VfdnBhdGggKnZwYXRoOwogCWludCB2cF9pZDsKIAogCXZ4Z2VfZGVidWdfZW50cnlleGl0KFZYR0VfVFJBQ0UsICIlczolZCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKLQl2ZGV2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXZsYW5fZ3JvdXBfc2V0X2RldmljZSh2ZGV2LT52bGdycCwgdmlkLCBOVUxMKTsKLQogCS8qIERlbGV0ZSB0aGlzIHZsYW4gZnJvbSB0aGUgdmlkIHRhYmxlICovCiAJZm9yICh2cF9pZCA9IDA7IHZwX2lkIDwgdmRldi0+bm9fb2ZfdnBhdGg7IHZwX2lkKyspIHsKIAkJdnBhdGggPSAmdmRldi0+dnBhdGhzW3ZwX2lkXTsKQEAgLTMzODIsNiArMzM0NSw3IEBACiAJfQogCXZ4Z2VfZGVidWdfZW50cnlleGl0KFZYR0VfVFJBQ0UsCiAJCSIlczolZCAgRXhpdGluZy4uLiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJY2xlYXJfYml0KHZpZCwgdmRldi0+YWN0aXZlX3ZsYW5zKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB2eGdlX25ldGRldl9vcHMgPSB7CkBAIC0zMzk2LDcgKzMzNjAsNiBAQAogCS5uZG9fY2hhbmdlX210dSAgICAgICAgID0gdnhnZV9jaGFuZ2VfbXR1LAogCS5uZG9fZml4X2ZlYXR1cmVzCT0gdnhnZV9maXhfZmVhdHVyZXMsCiAJLm5kb19zZXRfZmVhdHVyZXMJPSB2eGdlX3NldF9mZWF0dXJlcywKLQkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIgICA9IHZ4Z2Vfdmxhbl9yeF9yZWdpc3RlciwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQgICA9IHZ4Z2Vfdmxhbl9yeF9raWxsX3ZpZCwKIAkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IHZ4Z2Vfdmxhbl9yeF9hZGRfdmlkLAogCS5uZG9fdHhfdGltZW91dCAgICAgICAgID0gdnhnZV90eF93YXRjaGRvZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1tYWluLmggYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtbWFpbi5oCmluZGV4IGVkMTIwYWIuLmY1MmE0MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS1tYWluLmgKKysrIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLW1haW4uaApAQCAtMTgsNiArMTgsOCBAQAogI2luY2x1ZGUgInZ4Z2UtY29uZmlnLmgiCiAjaW5jbHVkZSAidnhnZS12ZXJzaW9uLmgiCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KIAogI2RlZmluZSBWWEdFX0RSSVZFUl9OQU1FCQkidnhnZSIKICNkZWZpbmUgVlhHRV9EUklWRVJfVkVORE9SCQkiTmV0ZXJpb24sIEluYyIKQEAgLTIwMSwzMCArMjAzLDE0IEBACiAvKiBTb2Z0d2FyZSBTdGF0aXN0aWNzICovCiAKIHN0cnVjdCB2eGdlX3N3X3N0YXRzIHsKLQkvKiBOZXR3b3JrIFN0YXRzIChpbnRlcmZhY2Ugc3RhdHMpICovCi0KLQkvKiBUeCAqLwotCXU2NCB0eF9mcm1zOwotCXU2NCB0eF9lcnJvcnM7Ci0JdTY0IHR4X2J5dGVzOwotCXU2NCB0eGRfbm90X2ZyZWU7Ci0JdTY0IHR4ZF9vdXRfb2ZfZGVzYzsKIAogCS8qIFZpcnR1YWwgUGF0aCAqLwotCXU2NCB2cGF0aHNfb3BlbjsKLQl1NjQgdnBhdGhfb3Blbl9mYWlsOwotCi0JLyogUnggKi8KLQl1NjQgcnhfZnJtczsKLQl1NjQgcnhfZXJyb3JzOwotCXU2NCByeF9ieXRlczsKLQl1NjQgcnhfbWNhc3Q7CisJdW5zaWduZWQgbG9uZyB2cGF0aHNfb3BlbjsKKwl1bnNpZ25lZCBsb25nIHZwYXRoX29wZW5fZmFpbDsKIAogCS8qIE1pc2MuICovCi0JdTY0IGxpbmtfdXA7Ci0JdTY0IGxpbmtfZG93bjsKLQl1NjQgcGNpX21hcF9mYWlsOwotCXU2NCBza2JfYWxsb2NfZmFpbDsKKwl1bnNpZ25lZCBsb25nIGxpbmtfdXA7CisJdW5zaWduZWQgbG9uZyBsaW5rX2Rvd247CiB9OwogCiBzdHJ1Y3QgdnhnZV9tYWNfYWRkcnMgewpAQCAtMjM3LDEyICsyMjMsMTQgQEAKIHN0cnVjdCB2eGdlZGV2OwogCiBzdHJ1Y3QgdnhnZV9maWZvX3N0YXRzIHsKKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMJc3luY3A7CiAJdTY0IHR4X2ZybXM7Ci0JdTY0IHR4X2Vycm9yczsKIAl1NjQgdHhfYnl0ZXM7Ci0JdTY0IHR4ZF9ub3RfZnJlZTsKLQl1NjQgdHhkX291dF9vZl9kZXNjOwotCXU2NCBwY2lfbWFwX2ZhaWw7CisKKwl1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIHR4ZF9ub3RfZnJlZTsKKwl1bnNpZ25lZCBsb25nIHR4ZF9vdXRfb2ZfZGVzYzsKKwl1bnNpZ25lZCBsb25nIHBjaV9tYXBfZmFpbDsKIH07CiAKIHN0cnVjdCB2eGdlX2ZpZm8gewpAQCAtMjY0LDE0ICsyNTIsMTYgQEAKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCiBzdHJ1Y3QgdnhnZV9yaW5nX3N0YXRzIHsKLQl1NjQgcHJldl9yeF9mcm1zOworCXN0cnVjdCB1NjRfc3RhdHNfc3luYyBzeW5jcDsKIAl1NjQgcnhfZnJtczsKLQl1NjQgcnhfZXJyb3JzOwotCXU2NCByeF9kcm9wcGVkOwotCXU2NCByeF9ieXRlczsKIAl1NjQgcnhfbWNhc3Q7Ci0JdTY0IHBjaV9tYXBfZmFpbDsKLQl1NjQgc2tiX2FsbG9jX2ZhaWw7CisJdTY0IHJ4X2J5dGVzOworCisJdW5zaWduZWQgbG9uZyByeF9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyByeF9kcm9wcGVkOworCXVuc2lnbmVkIGxvbmcgcHJldl9yeF9mcm1zOworCXVuc2lnbmVkIGxvbmcgcGNpX21hcF9mYWlsOworCXVuc2lnbmVkIGxvbmcgc2tiX2FsbG9jX2ZhaWw7CiB9OwogCiBzdHJ1Y3QgdnhnZV9yaW5nIHsKQEAgLTI5OSw3ICsyODksNiBAQAogI2RlZmluZSBWWEdFX01BWF9NQUNfQUREUl9DT1VOVAkJMzAKIAogCWludCB2bGFuX3RhZ19zdHJpcDsKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CiAJdTMyIHJ4X3ZlY3Rvcl9ubzsKIAllbnVtIHZ4Z2VfaHdfc3RhdHVzIGxhc3Rfc3RhdHVzOwogCkBAIC0zNDQsNyArMzMzLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmRldjsKIAlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CiAJc3RydWN0IF9fdnhnZV9od19kZXZpY2UgKmRldmg7Ci0Jc3RydWN0IHZsYW5fZ3JvdXAJKnZsZ3JwOworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3ZsYW5zW0JJVFNfVE9fTE9OR1MoVkxBTl9OX1ZJRCldOwogCWludCB2bGFuX3RhZ19zdHJpcDsKIAlzdHJ1Y3QgdnhnZV9jb25maWcJY29uZmlnOwogCXVuc2lnbmVkIGxvbmcJc3RhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtdHJhZmZpYy5jIGIvZHJpdmVycy9uZXQvdnhnZS92eGdlLXRyYWZmaWMuYwppbmRleCBmOTM1MTcwLi5hZDY0Y2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtdHJhZmZpYy5jCisrKyBiL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS10cmFmZmljLmMKQEAgLTEzMDksNyArMTMwOSw3IEBACiAKIAl2eGdlX2h3X2NoYW5uZWxfZHRyX3RyeV9jb21wbGV0ZShjaGFubmVsLCByeGRoKTsKIAotCXJ4ZHAgPSAoc3RydWN0IHZ4Z2VfaHdfcmluZ19yeGRfMSAqKSpyeGRoOworCXJ4ZHAgPSAqcnhkaDsKIAlpZiAocnhkcCA9PSBOVUxMKSB7CiAJCXN0YXR1cyA9IFZYR0VfSFdfSU5GX05PX01PUkVfQ09NUExFVEVEX0RFU0NSSVBUT1JTOwogCQlnb3RvIGV4aXQ7CkBAIC0xNTY1LDcgKzE1NjUsNyBAQAogCWNoYW5uZWwgPSAmZmlmby0+Y2hhbm5lbDsKIAogCXR4ZGxfcHJpdiA9IF9fdnhnZV9od19maWZvX3R4ZGxfcHJpdihmaWZvLCB0eGRsaCk7Ci0JdHhkcF9maXJzdCA9IChzdHJ1Y3QgdnhnZV9od19maWZvX3R4ZCAqKXR4ZGxoOworCXR4ZHBfZmlyc3QgPSB0eGRsaDsKIAogCXR4ZHBfbGFzdCA9IChzdHJ1Y3QgdnhnZV9od19maWZvX3R4ZCAqKXR4ZGxoICArICAodHhkbF9wcml2LT5mcmFncyAtIDEpOwogCXR4ZHBfbGFzdC0+Y29udHJvbF8wIHw9CkBAIC0xNjMxLDcgKzE2MzEsNyBAQAogCiAJdnhnZV9od19jaGFubmVsX2R0cl90cnlfY29tcGxldGUoY2hhbm5lbCwgdHhkbGgpOwogCi0JdHhkcCA9IChzdHJ1Y3QgdnhnZV9od19maWZvX3R4ZCAqKSp0eGRsaDsKKwl0eGRwID0gKnR4ZGxoOwogCWlmICh0eGRwID09IE5VTEwpIHsKIAkJc3RhdHVzID0gVlhHRV9IV19JTkZfTk9fTU9SRV9DT01QTEVURURfREVTQ1JJUFRPUlM7CiAJCWdvdG8gZXhpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jMTAxLmMgYi9kcml2ZXJzL25ldC93YW4vYzEwMS5jCmluZGV4IDRhYzg1YTAuLjU0Zjk5NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9jMTAxLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2MxMDEuYwpAQCAtMTQsNiArMTQsOCBAQAogICogICAgTW94YSBDMTAxIFVzZXIncyBNYW51YWwKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CkBAIC0zMTMsNDQgKzMxNSw0NCBAQAogCWludCByZXN1bHQ7CiAKIAlpZiAoaXJxPDMgfHwgaXJxPjE1IHx8IGlycSA9PSA2KSAvKiBGSVhNRSAqLyB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYzEwMTogaW52YWxpZCBJUlEgdmFsdWVcbiIpOworCQlwcl9lcnIoImludmFsaWQgSVJRIHZhbHVlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKHdpbmJhc2UgPCAweEMwMDAwIHx8IHdpbmJhc2UgPiAweERGRkZGIHx8ICh3aW5iYXNlICYgMHgzRkZGKSAhPTApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiBpbnZhbGlkIFJBTSB2YWx1ZVxuIik7CisJCXByX2VycigiaW52YWxpZCBSQU0gdmFsdWVcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAljYXJkID0ga3phbGxvYyhzaXplb2YoY2FyZF90KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNhcmQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImMxMDE6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlwcl9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQogCiAJY2FyZC0+ZGV2ID0gYWxsb2NfaGRsY2RldihjYXJkKTsKIAlpZiAoIWNhcmQtPmRldikgewotCQlwcmludGsoS0VSTl9FUlIgImMxMDE6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlwcl9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQlrZnJlZShjYXJkKTsKIAkJcmV0dXJuIC1FTk9CVUZTOwogCX0KIAogCWlmIChyZXF1ZXN0X2lycShpcnEsIHNjYV9pbnRyLCAwLCBkZXZuYW1lLCBjYXJkKSkgewotCQlwcmludGsoS0VSTl9FUlIgImMxMDE6IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlFcbiIpOworCQlwcl9lcnIoImNvdWxkIG5vdCBhbGxvY2F0ZSBJUlFcbiIpOwogCQljMTAxX2Rlc3Ryb3lfY2FyZChjYXJkKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJY2FyZC0+aXJxID0gaXJxOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24od2luYmFzZSwgQzEwMV9NQVBQRURfUkFNX1NJWkUsIGRldm5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYzEwMTogY291bGQgbm90IHJlcXVlc3QgUkFNIHdpbmRvd1xuIik7CisJCXByX2VycigiY291bGQgbm90IHJlcXVlc3QgUkFNIHdpbmRvd1xuIik7CiAJCWMxMDFfZGVzdHJveV9jYXJkKGNhcmQpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAljYXJkLT5waHlfd2luYmFzZSA9IHdpbmJhc2U7CiAJY2FyZC0+d2luMGJhc2UgPSBpb3JlbWFwKHdpbmJhc2UsIEMxMDFfTUFQUEVEX1JBTV9TSVpFKTsKIAlpZiAoIWNhcmQtPndpbjBiYXNlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYzEwMTogY291bGQgbm90IG1hcCBJL08gYWRkcmVzc1xuIik7CisJCXByX2VycigiY291bGQgbm90IG1hcCBJL08gYWRkcmVzc1xuIik7CiAJCWMxMDFfZGVzdHJveV9jYXJkKGNhcmQpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0zODEsNyArMzgzLDcgQEAKIAogCXJlc3VsdCA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldik7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJjMTAxOiB1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyBkZXZpY2VcbiIpOworCQlwcl93YXJuKCJ1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyBkZXZpY2VcbiIpOwogCQljMTAxX2Rlc3Ryb3lfY2FyZChjYXJkKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC0zODksMTAgKzM5MSw4IEBACiAJc2NhX2luaXRfcG9ydChjYXJkKTsgLyogU2V0IHVwIEMxMDEgbWVtb3J5ICovCiAJc2V0X2NhcnJpZXIoY2FyZCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogTW94YSBDMTAxIG9uIElSUSV1LCIKLQkgICAgICAgIiB1c2luZyAldSBUWCArICV1IFJYIHBhY2tldHMgcmluZ3NcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgY2FyZC0+aXJxLAotCSAgICAgICBjYXJkLT50eF9yaW5nX2J1ZmZlcnMsIGNhcmQtPnJ4X3JpbmdfYnVmZmVycyk7CisJbmV0ZGV2X2luZm8oZGV2LCAiTW94YSBDMTAxIG9uIElSUSV1LCB1c2luZyAldSBUWCArICV1IFJYIHBhY2tldHMgcmluZ3NcbiIsCisJCSAgICBjYXJkLT5pcnEsIGNhcmQtPnR4X3JpbmdfYnVmZmVycywgY2FyZC0+cnhfcmluZ19idWZmZXJzKTsKIAogCSpuZXdfY2FyZCA9IGNhcmQ7CiAJbmV3X2NhcmQgPSAmY2FyZC0+bmV4dF9jYXJkOwpAQCAtNDA1LDEyICs0MDUsMTIgQEAKIHsKIAlpZiAoaHcgPT0gTlVMTCkgewogI2lmZGVmIE1PRFVMRQotCQlwcmludGsoS0VSTl9JTkZPICJjMTAxOiBubyBjYXJkIGluaXRpYWxpemVkXG4iKTsKKwkJcHJfaW5mbygibm8gY2FyZCBpbml0aWFsaXplZFxuIik7CiAjZW5kaWYKIAkJcmV0dXJuIC1FSU5WQUw7CS8qIG5vIHBhcmFtZXRlcnMgc3BlY2lmaWVkLCBhYm9ydCAqLwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCB2ZXJzaW9uKTsKKwlwcl9pbmZvKCIlc1xuIiwgdmVyc2lvbik7CiAKIAlkbyB7CiAJCXVuc2lnbmVkIGxvbmcgaXJxLCByYW07CkBAIC00MjgsNyArNDI4LDcgQEAKIAkJCXJldHVybiBmaXJzdF9jYXJkID8gMCA6IC1FSU5WQUw7CiAJfXdoaWxlKCpodysrID09ICc6Jyk7CiAKLQlwcmludGsoS0VSTl9FUlIgImMxMDE6IGludmFsaWQgaGFyZHdhcmUgcGFyYW1ldGVyc1xuIik7CisJcHJfZXJyKCJpbnZhbGlkIGhhcmR3YXJlIHBhcmFtZXRlcnNcbiIpOwogCXJldHVybiBmaXJzdF9jYXJkID8gMCA6IC1FSU5WQUw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMgYi9kcml2ZXJzL25ldC93YW4vY29zYS5jCmluZGV4IDZmYjZmOGUuLjZhZWQyMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYwpAQCAtNzQsNiArNzQsOCBAQAogICogVGhlIFN5bmMgUFBQL0Npc2NvIEhETEMgbGF5ZXIgKHN5bmNwcHAuYykgcG9ydGVkIHRvIExpbnV4IGJ5IEFsYW4gQ294CiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTM2MSwxNCArMzYzLDEzIEBACiAKIAlpZiAoY29zYV9tYWpvciA+IDApIHsKIAkJaWYgKHJlZ2lzdGVyX2NocmRldihjb3NhX21ham9yLCAiY29zYSIsICZjb3NhX2ZvcHMpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb3NhOiB1bmFibGUgdG8gZ2V0IG1ham9yICVkXG4iLAotCQkJCWNvc2FfbWFqb3IpOworCQkJcHJfd2FybigidW5hYmxlIHRvIGdldCBtYWpvciAlZFxuIiwgY29zYV9tYWpvcik7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoIShjb3NhX21ham9yPXJlZ2lzdGVyX2NocmRldigwLCAiY29zYSIsICZjb3NhX2ZvcHMpKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29zYTogdW5hYmxlIHRvIHJlZ2lzdGVyIGNoYXJkZXZcbiIpOworCQkJcHJfd2FybigidW5hYmxlIHRvIHJlZ2lzdGVyIGNoYXJkZXZcbiIpOwogCQkJZXJyID0gLUVJTzsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0zNzgsNyArMzc5LDcgQEAKIAlmb3IgKGk9MDsgaW9baV0gIT0gMCAmJiBpIDwgTUFYX0NBUkRTOyBpKyspCiAJCWNvc2FfcHJvYmUoaW9baV0sIGlycVtpXSwgZG1hW2ldKTsKIAlpZiAoIW5yX2NhcmRzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNvc2E6IG5vIGRldmljZXMgZm91bmQuXG4iKTsKKwkJcHJfd2Fybigibm8gZGV2aWNlcyBmb3VuZFxuIik7CiAJCXVucmVnaXN0ZXJfY2hyZGV2KGNvc2FfbWFqb3IsICJjb3NhIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwpAQCAtNDQ3LDI2ICs0NDgsMjUgQEAKIAkvKiBDaGVja2luZyB2YWxpZGl0eSBvZiBwYXJhbWV0ZXJzOiAqLwogCS8qIElSUSBzaG91bGQgYmUgMi03IG9yIDEwLTE1OyBuZWdhdGl2ZSBJUlEgbWVhbnMgYXV0b3Byb2JlICovCiAJaWYgKChpcnEgPj0gMCAgJiYgaXJxIDwgMikgfHwgaXJxID4gMTUgfHwgKGlycSA8IDEwICYmIGlycSA+IDcpKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJjb3NhX3Byb2JlOiBpbnZhbGlkIElSUSAlZFxuIiwgaXJxKTsKKwkJcHJfaW5mbygiaW52YWxpZCBJUlEgJWRcbiIsIGlycSk7CiAJCXJldHVybiAtMTsKIAl9CiAJLyogSS9PIGFkZHJlc3Mgc2hvdWxkIGJlIGJldHdlZW4gMHgxMDAgYW5kIDB4M2ZmIGFuZCBzaG91bGQgYmUKIAkgKiBtdWx0aXBsZSBvZiA4LiAqLwogCWlmIChiYXNlIDwgMHgxMDAgfHwgYmFzZSA+IDB4M2ZmIHx8IGJhc2UgJiAweDcpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gImNvc2FfcHJvYmU6IGludmFsaWQgSS9PIGFkZHJlc3MgMHgleFxuIiwKLQkJCWJhc2UpOworCQlwcl9pbmZvKCJpbnZhbGlkIEkvTyBhZGRyZXNzIDB4JXhcbiIsIGJhc2UpOwogCQlyZXR1cm4gLTE7CiAJfQogCS8qIERNQSBzaG91bGQgYmUgMCwxIG9yIDMtNyAqLwogCWlmIChkbWEgPCAwIHx8IGRtYSA9PSA0IHx8IGRtYSA+IDcpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gImNvc2FfcHJvYmU6IGludmFsaWQgRE1BICVkXG4iLCBkbWEpOworCQlwcl9pbmZvKCJpbnZhbGlkIERNQSAlZFxuIiwgZG1hKTsKIAkJcmV0dXJuIC0xOwogCX0KIAkvKiBhbmQgZmluYWxseSwgb24gMTYtYml0IENPU0EgRE1BIHNob3VsZCBiZSA0LTcgYW5kIAogCSAqIEkvTyBiYXNlIHNob3VsZCBub3QgYmUgbXVsdGlwbGUgb2YgMHgxMCAqLwogCWlmICgoKGJhc2UgJiAweDgpICYmIGRtYSA8IDQpIHx8ICghKGJhc2UgJiAweDgpICYmIGRtYSA+IDMpKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJjb3NhX3Byb2JlOiA4LzE2IGJpdCBiYXNlIGFuZCBETUEgbWlzbWF0Y2giCi0JCQkiIChiYXNlPTB4JXgsIGRtYT0lZClcbiIsIGJhc2UsIGRtYSk7CisJCXByX2luZm8oIjgvMTYgYml0IGJhc2UgYW5kIERNQSBtaXNtYXRjaCAoYmFzZT0weCV4LCBkbWE9JWQpXG4iLAorCQkJYmFzZSwgZG1hKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNDc5LDcgKzQ3OSw3IEBACiAJCXJldHVybiAtMTsKIAkKIAlpZiAoY29zYV9yZXNldF9hbmRfcmVhZF9pZChjb3NhLCBjb3NhLT5pZF9zdHJpbmcpIDwgMCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiY29zYTogcHJvYmUgYXQgMHgleCBmYWlsZWQuXG4iLCBiYXNlKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInByb2JlIGF0IDB4JXggZmFpbGVkLlxuIiwgYmFzZSk7CiAJCWVyciA9IC0xOwogCQlnb3RvIGVycl9vdXQ7CiAJfQpAQCAtNDkyLDggKzQ5Miw3IEBACiAJZWxzZSB7CiAvKiBQcmludCBhIHdhcm5pbmcgb25seSBpZiB3ZSBhcmUgbm90IGF1dG9wcm9iaW5nICovCiAjaWZuZGVmIENPU0FfSVNBX0FVVE9QUk9CRQotCQlwcmludGsoS0VSTl9JTkZPICJjb3NhOiB2YWxpZCBzaWduYXR1cmUgbm90IGZvdW5kIGF0IDB4JXguXG4iLAotCQkJYmFzZSk7CisJCXByX2luZm8oInZhbGlkIHNpZ25hdHVyZSBub3QgZm91bmQgYXQgMHgleFxuIiwgYmFzZSk7CiAjZW5kaWYKIAkJZXJyID0gLTE7CiAJCWdvdG8gZXJyX291dDsKQEAgLTUwMSwxNCArNTAwLDE0IEBACiAJLyogVXBkYXRlIHRoZSBuYW1lIG9mIHRoZSByZWdpb24gbm93IHdlIGtub3cgdGhlIHR5cGUgb2YgY2FyZCAqLyAKIAlyZWxlYXNlX3JlZ2lvbihiYXNlLCBpc184Yml0KGNvc2EpPzI6NCk7CiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlLCBpc184Yml0KGNvc2EpPzI6NCwgY29zYS0+dHlwZSkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgImNvc2E6IGNoYW5naW5nIG5hbWUgYXQgMHgleCBmYWlsZWQuXG4iLCBiYXNlKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImNoYW5naW5nIG5hbWUgYXQgMHgleCBmYWlsZWQuXG4iLCBiYXNlKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIE5vdyBkbyBJUlEgYXV0b3Byb2JlICovCiAJaWYgKGlycSA8IDApIHsKIAkJdW5zaWduZWQgbG9uZyBpcnFzOwotLyoJCXByaW50ayhLRVJOX0lORk8gIklSUSBhdXRvcHJvYmVcbiIpOyAqLworLyoJCXByX2luZm8oIklSUSBhdXRvcHJvYmVcbiIpOyAqLwogCQlpcnFzID0gcHJvYmVfaXJxX29uKCk7CiAJCS8qIAogCQkgKiBFbmFibGUgaW50ZXJydXB0IG9uIHR4IGJ1ZmZlciBlbXB0eSAoaXQgc3VyZSBpcykgCkBAIC01MjYsMTMgKzUyNSwxMyBAQAogCQljb3NhX2dldGRhdGE4KGNvc2EpOwogCiAJCWlmIChpcnEgPCAwKSB7Ci0JCQlwcmludGsgKEtFUk5fSU5GTyAiY29zYSBJUlEgYXV0b3Byb2JlOiBtdWx0aXBsZSBpbnRlcnJ1cHRzIG9idGFpbmVkICglZCwgYm9hcmQgYXQgMHgleClcbiIsCisJCQlwcl9pbmZvKCJtdWx0aXBsZSBpbnRlcnJ1cHRzIG9idGFpbmVkICglZCwgYm9hcmQgYXQgMHgleClcbiIsCiAJCQkJaXJxLCBjb3NhLT5kYXRhcmVnKTsKIAkJCWVyciA9IC0xOwogCQkJZ290byBlcnJfb3V0OwogCQl9CiAJCWlmIChpcnEgPT0gMCkgewotCQkJcHJpbnRrIChLRVJOX0lORk8gImNvc2EgSVJRIGF1dG9wcm9iZTogbm8gaW50ZXJydXB0IG9idGFpbmVkIChib2FyZCBhdCAweCV4KVxuIiwKKwkJCXByX2luZm8oIm5vIGludGVycnVwdCBvYnRhaW5lZCAoYm9hcmQgYXQgMHgleClcbiIsCiAJCQkJY29zYS0+ZGF0YXJlZyk7CiAJCS8qCXJldHVybiAtMTsgKi8KIAkJfQpAQCAtNTc5LDggKzU3OCw3IEBACiAKIAkJLyogUmVnaXN0ZXIgdGhlIG5ldHdvcmsgaW50ZXJmYWNlICovCiAJCWlmICghKGNoYW4tPm5ldGRldiA9IGFsbG9jX2hkbGNkZXYoY2hhbikpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYWxsb2NfaGRsY2RldiBmYWlsZWQuXG4iLAotCQkJICAgICAgIGNoYW4tPm5hbWUpOworCQkJcHJfd2FybigiJXM6IGFsbG9jX2hkbGNkZXYgZmFpbGVkXG4iLCBjaGFuLT5uYW1lKTsKIAkJCWdvdG8gZXJyX2hkbGNkZXY7CiAJCX0KIAkJZGV2X3RvX2hkbGMoY2hhbi0+bmV0ZGV2KS0+YXR0YWNoID0gY29zYV9uZXRfYXR0YWNoOwpAQCAtNTkxLDE0ICs1ODksMTQgQEAKIAkJY2hhbi0+bmV0ZGV2LT5pcnEgPSBjaGFuLT5jb3NhLT5pcnE7CiAJCWNoYW4tPm5ldGRldi0+ZG1hID0gY2hhbi0+Y29zYS0+ZG1hOwogCQlpZiAocmVnaXN0ZXJfaGRsY19kZXZpY2UoY2hhbi0+bmV0ZGV2KSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKCkiCi0JCQkgICAgICAgIiBmYWlsZWQuXG4iLCBjaGFuLT5uZXRkZXYtPm5hbWUpOworCQkJbmV0ZGV2X3dhcm4oY2hhbi0+bmV0ZGV2LAorCQkJCSAgICAicmVnaXN0ZXJfaGRsY19kZXZpY2UoKSBmYWlsZWRcbiIpOwogCQkJZnJlZV9uZXRkZXYoY2hhbi0+bmV0ZGV2KTsKIAkJCWdvdG8gZXJyX2hkbGNkZXY7CiAJCX0KIAl9CiAKLQlwcmludGsgKEtFUk5fSU5GTyAiY29zYSVkOiAlcyAoJXMgYXQgMHgleCBpcnEgJWQgZG1hICVkKSwgJWQgY2hhbm5lbHNcbiIsCisJcHJfaW5mbygiY29zYSVkOiAlcyAoJXMgYXQgMHgleCBpcnEgJWQgZG1hICVkKSwgJWQgY2hhbm5lbHNcbiIsCiAJCWNvc2EtPm51bSwgY29zYS0+aWRfc3RyaW5nLCBjb3NhLT50eXBlLAogCQljb3NhLT5kYXRhcmVnLCBjb3NhLT5pcnEsIGNvc2EtPmRtYSwgY29zYS0+bmNoYW5uZWxzKTsKIApAQCAtNjE4LDggKzYxNiw3IEBACiAJZnJlZV9pcnEoY29zYS0+aXJxLCBjb3NhKTsKIGVycl9vdXQ6CiAJcmVsZWFzZV9yZWdpb24oY29zYS0+ZGF0YXJlZyxpc184Yml0KGNvc2EpPzI6NCk7Ci0JcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IGFsbG9jYXRpbmcgcmVzb3VyY2VzIGZhaWxlZFxuIiwKLQkgICAgICAgY29zYS0+bnVtKTsKKwlwcl9ub3RpY2UoImNvc2ElZDogYWxsb2NhdGluZyByZXNvdXJjZXMgZmFpbGVkXG4iLCBjb3NhLT5udW0pOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTY0MSwxNCArNjM4LDE0IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghKGNoYW4tPmNvc2EtPmZpcm13YXJlX3N0YXR1cyAmIENPU0FfRldfU1RBUlQpKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHN0YXJ0IHRoZSBmaXJtd2FyZSBmaXJzdCAoc3RhdHVzICVkKVxuIiwKLQkJCWNoYW4tPmNvc2EtPm5hbWUsIGNoYW4tPmNvc2EtPmZpcm13YXJlX3N0YXR1cyk7CisJCXByX25vdGljZSgiJXM6IHN0YXJ0IHRoZSBmaXJtd2FyZSBmaXJzdCAoc3RhdHVzICVkKVxuIiwKKwkJCSAgY2hhbi0+Y29zYS0+bmFtZSwgY2hhbi0+Y29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmNvc2EtPmxvY2ssIGZsYWdzKTsKIAlpZiAoY2hhbi0+dXNhZ2UgIT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY29zYV9uZXRfb3BlbiBjYWxsZWQgd2l0aCB1c2FnZSBjb3VudCIKLQkJICAgICAgICIgJWRcbiIsIGNoYW4tPm5hbWUsIGNoYW4tPnVzYWdlKTsKKwkJcHJfd2FybigiJXM6IGNvc2FfbmV0X29wZW4gY2FsbGVkIHdpdGggdXNhZ2UgY291bnQgJWRcbiIsCisJCQljaGFuLT5uYW1lLCBjaGFuLT51c2FnZSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmNvc2EtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC03MzYsOCArNzMzLDcgQEAKIAlrZnJlZV9za2IoY2hhbi0+cnhfc2tiKTsKIAljaGFuLT5yeF9za2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOwogCWlmIChjaGFuLT5yeF9za2IgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0XG4iLAotCQkJY2hhbi0+bmFtZSk7CisJCXByX25vdGljZSgiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXRcbiIsIGNoYW4tPm5hbWUpOwogCQljaGFuLT5uZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNzQ4LDggKzc0NCw3IEBACiBzdGF0aWMgaW50IGNvc2FfbmV0X3J4X2RvbmUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbikKIHsKIAlpZiAoIWNoYW4tPnJ4X3NrYikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcnhfZG9uZSB3aXRoIGVtcHR5IHNrYiFcbiIsCi0JCQljaGFuLT5uYW1lKTsKKwkJcHJfd2FybigiJXM6IHJ4X2RvbmUgd2l0aCBlbXB0eSBza2IhXG4iLCBjaGFuLT5uYW1lKTsKIAkJY2hhbi0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJY2hhbi0+bmV0ZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJcmV0dXJuIDA7CkBAIC03NjgsOCArNzYzLDcgQEAKIHN0YXRpYyBpbnQgY29zYV9uZXRfdHhfZG9uZShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuLCBpbnQgc2l6ZSkKIHsKIAlpZiAoIWNoYW4tPnR4X3NrYikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHhfZG9uZSB3aXRoIGVtcHR5IHNrYiFcbiIsCi0JCQljaGFuLT5uYW1lKTsKKwkJcHJfd2FybigiJXM6IHR4X2RvbmUgd2l0aCBlbXB0eSBza2IhXG4iLCBjaGFuLT5uYW1lKTsKIAkJY2hhbi0+bmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJY2hhbi0+bmV0ZGV2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOwogCQlyZXR1cm4gMTsKQEAgLTc5NCwxNSArNzg4LDE1IEBACiAJY2hhciAqa2J1ZjsKIAogCWlmICghKGNvc2EtPmZpcm13YXJlX3N0YXR1cyAmIENPU0FfRldfU1RBUlQpKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHN0YXJ0IHRoZSBmaXJtd2FyZSBmaXJzdCAoc3RhdHVzICVkKVxuIiwKLQkJCWNvc2EtPm5hbWUsIGNvc2EtPmZpcm13YXJlX3N0YXR1cyk7CisJCXByX25vdGljZSgiJXM6IHN0YXJ0IHRoZSBmaXJtd2FyZSBmaXJzdCAoc3RhdHVzICVkKVxuIiwKKwkJCSAgY29zYS0+bmFtZSwgY29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2hhbi0+cmxvY2spKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCQogCWlmICgoY2hhbi0+cnhkYXRhID0ga21hbGxvYyhDT1NBX01UVSwgR0ZQX0RNQXxHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogY29zYV9yZWFkKCkgLSBPT01cbiIsIGNvc2EtPm5hbWUpOworCQlwcl9pbmZvKCIlczogY29zYV9yZWFkKCkgLSBPT01cbiIsIGNvc2EtPm5hbWUpOwogCQltdXRleF91bmxvY2soJmNoYW4tPnJsb2NrKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtODY5LDggKzg2Myw4IEBACiAJY2hhciAqa2J1ZjsKIAogCWlmICghKGNvc2EtPmZpcm13YXJlX3N0YXR1cyAmIENPU0FfRldfU1RBUlQpKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHN0YXJ0IHRoZSBmaXJtd2FyZSBmaXJzdCAoc3RhdHVzICVkKVxuIiwKLQkJCWNvc2EtPm5hbWUsIGNvc2EtPmZpcm13YXJlX3N0YXR1cyk7CisJCXByX25vdGljZSgiJXM6IHN0YXJ0IHRoZSBmaXJtd2FyZSBmaXJzdCAoc3RhdHVzICVkKVxuIiwKKwkJCSAgY29zYS0+bmFtZSwgY29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2hhbi0+d3NlbSkpCkBAIC04ODEsOCArODc1LDggQEAKIAkKIAkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCiAJaWYgKChrYnVmID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTHxHRlBfRE1BKSkgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBjb3NhX3dyaXRlKCkgT09NIC0gZHJvcHBpbmcgcGFja2V0XG4iLAotCQkJY29zYS0+bmFtZSk7CisJCXByX25vdGljZSgiJXM6IGNvc2Ffd3JpdGUoKSBPT00gLSBkcm9wcGluZyBwYWNrZXRcbiIsCisJCQkgIGNvc2EtPm5hbWUpOwogCQl1cCgmY2hhbi0+d3NlbSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTkzMiw3ICs5MjYsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGNvc2FfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqcG9sbCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJjb3NhX3BvbGwgaXMgaGVyZVxuIik7CisJcHJfaW5mbygiY29zYV9wb2xsIGlzIGhlcmVcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDE3LDE1ICsxMDExLDE0IEBACiB7CiAJY2hhciBpZHN0cmluZ1tDT1NBX01BWF9JRF9TVFJJTkddOwogCWlmIChjb3NhLT51c2FnZSA+IDEpCi0JCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogV0FSTklORzogcmVzZXQgcmVxdWVzdGVkIHdpdGggY29zYS0+dXNhZ2UgPiAxICglZCkuIE9kZCB0aGluZ3MgbWF5IGhhcHBlbi5cbiIsCisJCXByX2luZm8oImNvc2ElZDogV0FSTklORzogcmVzZXQgcmVxdWVzdGVkIHdpdGggY29zYS0+dXNhZ2UgPiAxICglZCkuIE9kZCB0aGluZ3MgbWF5IGhhcHBlbi5cbiIsCiAJCQljb3NhLT5udW0sIGNvc2EtPnVzYWdlKTsKIAljb3NhLT5maXJtd2FyZV9zdGF0dXMgJj0gfihDT1NBX0ZXX1JFU0VUfENPU0FfRldfU1RBUlQpOwogCWlmIChjb3NhX3Jlc2V0X2FuZF9yZWFkX2lkKGNvc2EsIGlkc3RyaW5nKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IHJlc2V0IGZhaWxlZFxuIiwgY29zYS0+bnVtKTsKKwkJcHJfbm90aWNlKCJjb3NhJWQ6IHJlc2V0IGZhaWxlZFxuIiwgY29zYS0+bnVtKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogcmVzZXR0aW5nIGRldmljZTogJXNcbiIsIGNvc2EtPm51bSwKLQkJaWRzdHJpbmcpOworCXByX2luZm8oImNvc2ElZDogcmVzZXR0aW5nIGRldmljZTogJXNcbiIsIGNvc2EtPm51bSwgaWRzdHJpbmcpOwogCWNvc2EtPmZpcm13YXJlX3N0YXR1cyB8PSBDT1NBX0ZXX1JFU0VUOwogCXJldHVybiAwOwogfQpAQCAtMTAzNywxMSArMTAzMCwxMSBAQAogCWludCBpOwogCiAJaWYgKGNvc2EtPnVzYWdlID4gMSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdBUk5JTkc6IGRvd25sb2FkIG9mIG1pY3JvY29kZSByZXF1ZXN0ZWQgd2l0aCBjb3NhLT51c2FnZSA+IDEgKCVkKS4gT2RkIHRoaW5ncyBtYXkgaGFwcGVuLlxuIiwKKwkJcHJfaW5mbygiJXM6IFdBUk5JTkc6IGRvd25sb2FkIG9mIG1pY3JvY29kZSByZXF1ZXN0ZWQgd2l0aCBjb3NhLT51c2FnZSA+IDEgKCVkKS4gT2RkIHRoaW5ncyBtYXkgaGFwcGVuLlxuIiwKIAkJCWNvc2EtPm5hbWUsIGNvc2EtPnVzYWdlKTsKIAlpZiAoIShjb3NhLT5maXJtd2FyZV9zdGF0dXMgJiBDT1NBX0ZXX1JFU0VUKSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiByZXNldCB0aGUgY2FyZCBmaXJzdCAoc3RhdHVzICVkKS5cbiIsCi0JCQljb3NhLT5uYW1lLCBjb3NhLT5maXJtd2FyZV9zdGF0dXMpOworCQlwcl9ub3RpY2UoIiVzOiByZXNldCB0aGUgY2FyZCBmaXJzdCAoc3RhdHVzICVkKVxuIiwKKwkJCSAgY29zYS0+bmFtZSwgY29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAJCkBAIC0xMDU5LDExICsxMDUyLDExIEBACiAKIAlpID0gZG93bmxvYWQoY29zYSwgZC5jb2RlLCBkLmxlbiwgZC5hZGRyKTsKIAlpZiAoaSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IG1pY3JvY29kZSBkb3dubG9hZCBmYWlsZWQ6ICVkXG4iLAotCQkJY29zYS0+bnVtLCBpKTsKKwkJcHJfbm90aWNlKCJjb3NhJWQ6IG1pY3JvY29kZSBkb3dubG9hZCBmYWlsZWQ6ICVkXG4iLAorCQkJICBjb3NhLT5udW0sIGkpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBkb3dubG9hZGluZyBtaWNyb2NvZGUgLSAweCUwNHggYnl0ZXMgYXQgMHglMDR4XG4iLAorCXByX2luZm8oImNvc2ElZDogZG93bmxvYWRpbmcgbWljcm9jb2RlIC0gMHglMDR4IGJ5dGVzIGF0IDB4JTA0eFxuIiwKIAkJY29zYS0+bnVtLCBkLmxlbiwgZC5hZGRyKTsKIAljb3NhLT5maXJtd2FyZV9zdGF0dXMgfD0gQ09TQV9GV19SRVNFVHxDT1NBX0ZXX0RPV05MT0FEOwogCXJldHVybiAwOwpAQCAtMTA3NiwxMiArMTA2OSwxMSBAQAogCWludCBpOwogCiAJaWYgKGNvc2EtPnVzYWdlID4gMSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBXQVJOSU5HOiByZWFkbWVtIHJlcXVlc3RlZCB3aXRoICIKLQkJCSJjb3NhLT51c2FnZSA+IDEgKCVkKS4gT2RkIHRoaW5ncyBtYXkgaGFwcGVuLlxuIiwKKwkJcHJfaW5mbygiY29zYSVkOiBXQVJOSU5HOiByZWFkbWVtIHJlcXVlc3RlZCB3aXRoIGNvc2EtPnVzYWdlID4gMSAoJWQpLiBPZGQgdGhpbmdzIG1heSBoYXBwZW4uXG4iLAogCQkJY29zYS0+bnVtLCBjb3NhLT51c2FnZSk7CiAJaWYgKCEoY29zYS0+ZmlybXdhcmVfc3RhdHVzICYgQ09TQV9GV19SRVNFVCkpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogcmVzZXQgdGhlIGNhcmQgZmlyc3QgKHN0YXR1cyAlZCkuXG4iLAotCQkJY29zYS0+bmFtZSwgY29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKKwkJcHJfbm90aWNlKCIlczogcmVzZXQgdGhlIGNhcmQgZmlyc3QgKHN0YXR1cyAlZClcbiIsCisJCQkgIGNvc2EtPm5hbWUsIGNvc2EtPmZpcm13YXJlX3N0YXR1cyk7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCkBAIC0xMDkzLDExICsxMDg1LDEwIEBACiAKIAlpID0gcmVhZG1lbShjb3NhLCBkLmNvZGUsIGQubGVuLCBkLmFkZHIpOwogCWlmIChpIDwgMCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgImNvc2ElZDogcmVhZGluZyBtZW1vcnkgZmFpbGVkOiAlZFxuIiwKLQkJCWNvc2EtPm51bSwgaSk7CisJCXByX25vdGljZSgiY29zYSVkOiByZWFkaW5nIG1lbW9yeSBmYWlsZWQ6ICVkXG4iLCBjb3NhLT5udW0sIGkpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiByZWFkaW5nIGNhcmQgbWVtb3J5IC0gMHglMDR4IGJ5dGVzIGF0IDB4JTA0eFxuIiwKKwlwcl9pbmZvKCJjb3NhJWQ6IHJlYWRpbmcgY2FyZCBtZW1vcnkgLSAweCUwNHggYnl0ZXMgYXQgMHglMDR4XG4iLAogCQljb3NhLT5udW0sIGQubGVuLCBkLmFkZHIpOwogCWNvc2EtPmZpcm13YXJlX3N0YXR1cyB8PSBDT1NBX0ZXX1JFU0VUOwogCXJldHVybiAwOwpAQCAtMTEwOSwyMyArMTEwMCwyMiBAQAogCWludCBpOwogCiAJaWYgKGNvc2EtPnVzYWdlID4gMSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBXQVJOSU5HOiBzdGFydCBtaWNyb2NvZGUgcmVxdWVzdGVkIHdpdGggY29zYS0+dXNhZ2UgPiAxICglZCkuIE9kZCB0aGluZ3MgbWF5IGhhcHBlbi5cbiIsCisJCXByX2luZm8oImNvc2ElZDogV0FSTklORzogc3RhcnQgbWljcm9jb2RlIHJlcXVlc3RlZCB3aXRoIGNvc2EtPnVzYWdlID4gMSAoJWQpLiBPZGQgdGhpbmdzIG1heSBoYXBwZW4uXG4iLAogCQkJY29zYS0+bnVtLCBjb3NhLT51c2FnZSk7CiAKIAlpZiAoKGNvc2EtPmZpcm13YXJlX3N0YXR1cyAmIChDT1NBX0ZXX1JFU0VUfENPU0FfRldfRE9XTkxPQUQpKQogCQkhPSAoQ09TQV9GV19SRVNFVHxDT1NBX0ZXX0RPV05MT0FEKSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBkb3dubG9hZCB0aGUgbWljcm9jb2RlIGFuZC9vciByZXNldCB0aGUgY2FyZCBmaXJzdCAoc3RhdHVzICVkKS5cbiIsCi0JCQljb3NhLT5uYW1lLCBjb3NhLT5maXJtd2FyZV9zdGF0dXMpOworCQlwcl9ub3RpY2UoIiVzOiBkb3dubG9hZCB0aGUgbWljcm9jb2RlIGFuZC9vciByZXNldCB0aGUgY2FyZCBmaXJzdCAoc3RhdHVzICVkKVxuIiwKKwkJCSAgY29zYS0+bmFtZSwgY29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAJY29zYS0+ZmlybXdhcmVfc3RhdHVzICY9IH5DT1NBX0ZXX1JFU0VUOwogCWlmICgoaT1zdGFydG1pY3JvY29kZShjb3NhLCBhZGRyZXNzKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiY29zYSVkOiBzdGFydCBtaWNyb2NvZGUgYXQgMHglMDR4IGZhaWxlZDogJWRcbiIsCi0JCQljb3NhLT5udW0sIGFkZHJlc3MsIGkpOworCQlwcl9ub3RpY2UoImNvc2ElZDogc3RhcnQgbWljcm9jb2RlIGF0IDB4JTA0eCBmYWlsZWQ6ICVkXG4iLAorCQkJICBjb3NhLT5udW0sIGFkZHJlc3MsIGkpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBzdGFydGluZyBtaWNyb2NvZGUgYXQgMHglMDR4XG4iLAotCQljb3NhLT5udW0sIGFkZHJlc3MpOworCXByX2luZm8oImNvc2ElZDogc3RhcnRpbmcgbWljcm9jb2RlIGF0IDB4JTA0eFxuIiwgY29zYS0+bnVtLCBhZGRyZXNzKTsKIAljb3NhLT5zdGFydGFkZHIgPSBhZGRyZXNzOwogCWNvc2EtPmZpcm13YXJlX3N0YXR1cyB8PSBDT1NBX0ZXX1NUQVJUOwogCXJldHVybiAwOwpAQCAtMTI1NSwxMSArMTI0NSwxMSBAQAogI2lmZGVmIERFQlVHX0RBVEEKIAlpbnQgaTsKIAotCXByaW50ayhLRVJOX0lORk8gImNvc2ElZGMlZDogc3RhcnRpbmcgdHgoMHgleCkiLCBjaGFuLT5jb3NhLT5udW0sCi0JCWNoYW4tPm51bSwgbGVuKTsKKwlwcl9pbmZvKCJjb3NhJWRjJWQ6IHN0YXJ0aW5nIHR4KDB4JXgpIiwKKwkJY2hhbi0+Y29zYS0+bnVtLCBjaGFuLT5udW0sIGxlbik7CiAJZm9yIChpPTA7IGk8bGVuOyBpKyspCi0JCXByaW50aygiICUwMngiLCBidWZbaV0mMHhmZik7Ci0JcHJpbnRrKCJcbiIpOworCQlwcl9jb250KCIgJTAyeCIsIGJ1ZltpXSYweGZmKTsKKwlwcl9jb250KCJcbiIpOwogI2VuZGlmCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKIAljaGFuLT50eGJ1ZiA9IGJ1ZjsKQEAgLTEzNTMsNyArMTM0Myw3IEBACiAJaWYgKHRlc3RfYml0KFRYQklULCAmY29zYS0+cnh0eCkpCiAJCXMgPSAiVFggRE1BIjsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyB0aW1lb3V0IC0gcmVzdGFydGluZy5cbiIsIGNvc2EtPm5hbWUsIHMpOyAKKwlwcl9pbmZvKCIlczogJXMgdGltZW91dCAtIHJlc3RhcnRpbmdcbiIsIGNvc2EtPm5hbWUsIHMpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjb3NhLT5sb2NrLCBmbGFncyk7CiAJY29zYS0+cnh0eCA9IDA7CiAKQEAgLTEzODcsNyArMTM3Nyw3IEBACiAJCXJldHVybiAwOwogCWlmICgoYl4gKGIrbGVuKSkgJiAweDEwMDAwKSB7CiAJCWlmIChjb3VudCsrIDwgNSkKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwYWNrZXQgc3Bhbm5pbmcgYSA2NGsgYm91bmRhcnlcbiIsCisJCQlwcl9pbmZvKCIlczogcGFja2V0IHNwYW5uaW5nIGEgNjRrIGJvdW5kYXJ5XG4iLAogCQkJCWNoYW4tPm5hbWUpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNDk4LDggKzE0ODgsNyBAQAogCQljaGFyIGM7CiAJCWludCBpOwogCQlpZiAoKGk9Z2V0X3dhaXRfZGF0YShjb3NhKSkgPT0gLTEpIHsKLQkJCXByaW50ayAoS0VSTl9JTkZPICJjb3NhOiAweCUwNHggYnl0ZXMgcmVtYWluaW5nXG4iLAotCQkJCWxlbmd0aCk7CisJCQlwcl9pbmZvKCIweCUwNHggYnl0ZXMgcmVtYWluaW5nXG4iLCBsZW5ndGgpOwogCQkJcmV0dXJuIC0xMTsKIAkJfQogCQljPWk7CkBAIC0xNTgyLDE0ICsxNTcxLDE1IEBACiAJCQlzaG9ydCByOwogCQkJciA9IGNvc2FfZ2V0ZGF0YTgoY29zYSk7CiAjaWYgMAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYTogZ2V0X3dhaXRfZGF0YSByZXR1cm5pbmcgYWZ0ZXIgJWQgcmV0cmllc1xuIiwgOTk5LXJldHJpZXMpOworCQkJcHJfaW5mbygiZ2V0X3dhaXRfZGF0YSByZXR1cm5pbmcgYWZ0ZXIgJWQgcmV0cmllc1xuIiwKKwkJCQk5OTktcmV0cmllcyk7CiAjZW5kaWYKIAkJCXJldHVybiByOwogCQl9CiAJCS8qIHNsZWVwIGlmIG5vdCByZWFkeSB0byByZWFkICovCiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiY29zYTogdGltZW91dCBpbiBnZXRfd2FpdF9kYXRhIChzdGF0dXMgMHgleClcbiIsCisJcHJfaW5mbygidGltZW91dCBpbiBnZXRfd2FpdF9kYXRhIChzdGF0dXMgMHgleClcbiIsCiAJCWNvc2FfZ2V0c3RhdHVzKGNvc2EpKTsKIAlyZXR1cm4gLTE7CiB9CkBAIC0xNjA3LDcgKzE1OTcsNyBAQAogCQlpZiAoY29zYV9nZXRzdGF0dXMoY29zYSkgJiBTUl9UWF9SRFkpIHsKIAkJCWNvc2FfcHV0ZGF0YTgoY29zYSwgZGF0YSk7CiAjaWYgMAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUHV0ZGF0YTogJWQgcmV0cmllc1xuIiwgOTk5LXJldHJpZXMpOworCQkJcHJfaW5mbygiUHV0ZGF0YTogJWQgcmV0cmllc1xuIiwgOTk5LXJldHJpZXMpOwogI2VuZGlmCiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTYxNiw3ICsxNjA2LDcgQEAKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogI2VuZGlmCiAJfQotCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogdGltZW91dCBpbiBwdXRfd2FpdF9kYXRhIChzdGF0dXMgMHgleClcbiIsCisJcHJfaW5mbygiY29zYSVkOiB0aW1lb3V0IGluIHB1dF93YWl0X2RhdGEgKHN0YXR1cyAweCV4KVxuIiwKIAkJY29zYS0+bnVtLCBjb3NhX2dldHN0YXR1cyhjb3NhKSk7CiAJcmV0dXJuIC0xOwogfQpAQCAtMTYzNiwxMyArMTYyNiwxMyBAQAogCXNwcmludGYodGVtcCwgIiUwNFgiLCBudW1iZXIpOwogCWZvciAoaT0wOyBpPDQ7IGkrKykgewogCQlpZiAocHV0X3dhaXRfZGF0YShjb3NhLCB0ZW1wW2ldKSA9PSAtMSkgewotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IHB1dGhleG51bWJlciBmYWlsZWQgdG8gd3JpdGUgYnl0ZSAlZFxuIiwKLQkJCQljb3NhLT5udW0sIGkpOworCQkJcHJfbm90aWNlKCJjb3NhJWQ6IHB1dGhleG51bWJlciBmYWlsZWQgdG8gd3JpdGUgYnl0ZSAlZFxuIiwKKwkJCQkgIGNvc2EtPm51bSwgaSk7CiAJCQlyZXR1cm4gLTEtMippOwogCQl9CiAJCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9IHRlbXBbaV0pIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiY29zYSVkOiBwdXRoZXhodW1iZXIgZmFpbGVkIHRvIHJlYWQgZWNobyBvZiBieXRlICVkXG4iLAotCQkJCWNvc2EtPm51bSwgaSk7CisJCQlwcl9ub3RpY2UoImNvc2ElZDogcHV0aGV4aHVtYmVyIGZhaWxlZCB0byByZWFkIGVjaG8gb2YgYnl0ZSAlZFxuIiwKKwkJCQkgIGNvc2EtPm51bSwgaSk7CiAJCQlyZXR1cm4gLTItMippOwogCQl9CiAJfQpAQCAtMTY4Nyw4ICsxNjc3LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBmbGFnczE7CiAjaWZkZWYgREVCVUdfSVJRUwotCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogU1JfRE9XTl9SRVFVRVNUIHN0YXR1cz0weCUwNHhcbiIsCi0JCWNvc2EtPm51bSwgc3RhdHVzKTsKKwlwcl9pbmZvKCJjb3NhJWQ6IFNSX0RPV05fUkVRVUVTVCBzdGF0dXM9MHglMDR4XG4iLCBjb3NhLT5udW0sIHN0YXR1cyk7CiAjZW5kaWYKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOwogCXNldF9iaXQoVFhCSVQsICZjb3NhLT5yeHR4KTsKQEAgLTE2OTYsOCArMTY4NSw3IEBACiAJCS8qIGZsb3cgY29udHJvbCwgc2VlIHRoZSBjb21tZW50IGFib3ZlICovCiAJCWludCBpPTA7CiAJCWlmICghY29zYS0+dHhiaXRtYXApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyBjaGFubmVsIHdhbnRzIGRhdGEgIgotCQkJCSJpbiBUWCBJUlEuIEV4cGVjdCBETUEgdGltZW91dC4iLAorCQkJcHJfd2FybigiJXM6IE5vIGNoYW5uZWwgd2FudHMgZGF0YSBpbiBUWCBJUlEuIEV4cGVjdCBETUEgdGltZW91dC5cbiIsCiAJCQkJY29zYS0+bmFtZSk7CiAJCQlwdXRfZHJpdmVyX3N0YXR1c19ub2xvY2soY29zYSk7CiAJCQljbGVhcl9iaXQoVFhCSVQsICZjb3NhLT5yeHR4KTsKQEAgLTE3ODAsMTQgKzE3NjgsMTQgQEAKIAlpZiAoY29zYS0+YnVzbWFzdGVyKSB7CiAJCXVuc2lnbmVkIGxvbmcgYWRkciA9IHZpcnRfdG9fYnVzKGNvc2EtPnR4YnVmKTsKIAkJaW50IGNvdW50PTA7Ci0JCXByaW50ayhLRVJOX0lORk8gImJ1c21hc3RlciBJUlFcbiIpOworCQlwcl9pbmZvKCJidXNtYXN0ZXIgSVJRXG4iKTsKIAkJd2hpbGUgKCEoY29zYV9nZXRzdGF0dXMoY29zYSkmU1JfVFhfUkRZKSkgewogCQkJY291bnQrKzsKIAkJCXVkZWxheSgxMCk7CiAJCQlpZiAoY291bnQgPiAxMDAwKSBicmVhazsKIAkJfQotCQlwcmludGsoS0VSTl9JTkZPICJzdGF0dXMgJXhcbiIsIGNvc2FfZ2V0c3RhdHVzKGNvc2EpKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAicmVhZHkgYWZ0ZXIgJWQgbG9vcHNcbiIsIGNvdW50KTsKKwkJcHJfaW5mbygic3RhdHVzICV4XG4iLCBjb3NhX2dldHN0YXR1cyhjb3NhKSk7CisJCXByX2luZm8oInJlYWR5IGFmdGVyICVkIGxvb3BzXG4iLCBjb3VudCk7CiAJCWNvc2FfcHV0ZGF0YTE2KGNvc2EsIChhZGRyID4+IDE2KSYweGZmZmYpOwogCiAJCWNvdW50ID0gMDsKQEAgLTE3OTYsNyArMTc4NCw3IEBACiAJCQlpZiAoY291bnQgPiAxMDAwKSBicmVhazsKIAkJCXVkZWxheSgxMCk7CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTyAicmVhZHkgYWZ0ZXIgJWQgbG9vcHNcbiIsIGNvdW50KTsKKwkJcHJfaW5mbygicmVhZHkgYWZ0ZXIgJWQgbG9vcHNcbiIsIGNvdW50KTsKIAkJY29zYV9wdXRkYXRhMTYoY29zYSwgYWRkciAmMHhmZmZmKTsKIAkJZmxhZ3MxID0gY2xhaW1fZG1hX2xvY2soKTsKIAkJc2V0X2RtYV9tb2RlKGNvc2EtPmRtYSwgRE1BX01PREVfQ0FTQ0FERSk7CkBAIC0xODI0LDcgKzE4MTIsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAjaWZkZWYgREVCVUdfSVJRUwotCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogU1JfVVBfUkVRVUVTVFxuIiwgY29zYS0+bnVtKTsKKwlwcl9pbmZvKCJjb3NhJWQ6IFNSX1VQX1JFUVVFU1RcbiIsIGNvc2EtPm51bSk7CiAjZW5kaWYKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjb3NhLT5sb2NrLCBmbGFncyk7CkBAIC0xODQ3LDcgKzE4MzUsNyBAQAogCQkJZGVidWdfZGF0YV9pbihjb3NhLCBjb3NhLT5yeHNpemUgJiAweGZmKTsKICNlbmRpZgogI2lmIDAKLQkJCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogcmVjZWl2ZSByeHNpemUgPSAoMHglMDR4KS5cbiIsCisJCQlwcl9pbmZvKCJjb3NhJWQ6IHJlY2VpdmUgcnhzaXplID0gKDB4JTA0eClcbiIsCiAJCQkJY29zYS0+bnVtLCBjb3NhLT5yeHNpemUpOwogI2VuZGlmCiAJCX0KQEAgLTE4NTcsMTIgKzE4NDUsMTIgQEAKIAkJZGVidWdfZGF0YV9pbihjb3NhLCBjb3NhLT5yeHNpemUpOwogI2VuZGlmCiAjaWYgMAotCQlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IHJlY2VpdmUgcnhzaXplID0gKDB4JTA0eCkuXG4iLAorCQlwcl9pbmZvKCJjb3NhJWQ6IHJlY2VpdmUgcnhzaXplID0gKDB4JTA0eClcbiIsCiAJCQljb3NhLT5udW0sIGNvc2EtPnJ4c2l6ZSk7CiAjZW5kaWYKIAl9CiAJaWYgKCgoY29zYS0+cnhzaXplICYgMHhlMDAwKSA+PiAxMykgPj0gY29zYS0+bmNoYW5uZWxzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByeCBmb3IgdW5rbm93biBjaGFubmVsICgweCUwNHgpXG4iLAorCQlwcl93YXJuKCIlczogcnggZm9yIHVua25vd24gY2hhbm5lbCAoMHglMDR4KVxuIiwKIAkJCWNvc2EtPm5hbWUsIGNvc2EtPnJ4c2l6ZSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKIAkJZ290byByZWplY3Q7CkBAIC0xODc3LDcgKzE4NjUsNyBAQAogCiAJaWYgKCFjb3NhLT5yeGJ1ZikgewogcmVqZWN0OgkJLyogUmVqZWN0IHRoZSBwYWNrZXQgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiByZWplY3RpbmcgcGFja2V0IG9uIGNoYW5uZWwgJWRcbiIsCisJCXByX2luZm8oImNvc2ElZDogcmVqZWN0aW5nIHBhY2tldCBvbiBjaGFubmVsICVkXG4iLAogCQkJY29zYS0+bnVtLCBjb3NhLT5yeGNoYW4tPm51bSk7CiAJCWNvc2EtPnJ4YnVmID0gY29zYS0+Ym91bmNlYnVmOwogCX0KQEAgLTE5MjQsMTEgKzE5MTIsMTEgQEAKICNpZmRlZiBERUJVR19EQVRBCiAJewogCQlpbnQgaTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkYyVkOiBkb25lIHJ4KDB4JXgpIiwgY29zYS0+bnVtLCAKLQkJCWNvc2EtPnJ4Y2hhbi0+bnVtLCBjb3NhLT5yeHNpemUpOworCQlwcl9pbmZvKCJjb3NhJWRjJWQ6IGRvbmUgcngoMHgleCkiLAorCQkJY29zYS0+bnVtLCBjb3NhLT5yeGNoYW4tPm51bSwgY29zYS0+cnhzaXplKTsKIAkJZm9yIChpPTA7IGk8Y29zYS0+cnhzaXplOyBpKyspCi0JCQlwcmludGsgKCIgJTAyeCIsIGNvc2EtPnJ4YnVmW2ldJjB4ZmYpOwotCQlwcmludGsoIlxuIik7CisJCQlwcl9jb250KCIgJTAyeCIsIGNvc2EtPnJ4YnVmW2ldJjB4ZmYpOworCQlwcl9jb250KCJcbiIpOwogCX0KICNlbmRpZgogCQkvKiBQYWNrZXQgZm9yIHVua25vd24gY2hhbm5lbD8gKi8KQEAgLTE5NDAsOCArMTkyOCw3IEBACiAJCQlpZiAoY29zYS0+cnhjaGFuLT5yeF9kb25lKGNvc2EtPnJ4Y2hhbikpCiAJCQkJY2xlYXJfYml0KGNvc2EtPnJ4Y2hhbi0+bnVtLCAmY29zYS0+cnhiaXRtYXApOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiY29zYSVkOiB1bmV4cGVjdGVkIEVPVCBpbnRlcnJ1cHRcbiIsCi0JCQljb3NhLT5udW0pOworCQlwcl9ub3RpY2UoImNvc2ElZDogdW5leHBlY3RlZCBFT1QgaW50ZXJydXB0XG4iLCBjb3NhLT5udW0pOwogCX0KIAkvKgogCSAqIENsZWFyIHRoZSBSWEJJVCwgVFhCSVQgYW5kIElSUUJJVCAodGhlIGxhdGVzdCBzaG91bGQgYmUKQEAgLTE5NjMsOCArMTk1MCw3IEBACiBhZ2FpbjoKIAlzdGF0dXMgPSBjb3NhX2dldHN0YXR1cyhjb3NhKTsKICNpZmRlZiBERUJVR19JUlFTCi0JcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBnb3QgSVJRLCBzdGF0dXMgMHglMDJ4XG4iLCBjb3NhLT5udW0sCi0JCXN0YXR1cyAmIDB4ZmYpOworCXByX2luZm8oImNvc2ElZDogZ290IElSUSwgc3RhdHVzIDB4JTAyeFxuIiwgY29zYS0+bnVtLCBzdGF0dXMgJiAweGZmKTsKICNlbmRpZgogI2lmZGVmIERFQlVHX0lPCiAJZGVidWdfc3RhdHVzX2luKGNvc2EsIHN0YXR1cyk7CkBAIC0xOTg1LDE1ICsxOTcxLDE1IEBACiAJCQl1ZGVsYXkoMTAwKTsKIAkJCWdvdG8gYWdhaW47CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiB1bmtub3duIHN0YXR1cyAweCUwMnggaW4gSVJRIGFmdGVyICVkIHJldHJpZXNcbiIsCisJCXByX2luZm8oImNvc2ElZDogdW5rbm93biBzdGF0dXMgMHglMDJ4IGluIElSUSBhZnRlciAlZCByZXRyaWVzXG4iLAogCQkJY29zYS0+bnVtLCBzdGF0dXMgJiAweGZmLCBjb3VudCk7CiAJfQogI2lmZGVmIERFQlVHX0lSUVMKIAlpZiAoY291bnQpCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiAlZC10aW1lcyBnb3QgdW5rbm93biBzdGF0dXMgaW4gSVJRXG4iLAorCQlwcl9pbmZvKCIlczogJWQtdGltZXMgZ290IHVua25vd24gc3RhdHVzIGluIElSUVxuIiwKIAkJCWNvc2EtPm5hbWUsIGNvdW50KTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiByZXR1cm5pbmcgZnJvbSBJUlFcbiIsIGNvc2EtPm5hbWUpOworCQlwcl9pbmZvKCIlczogcmV0dXJuaW5nIGZyb20gSVJRXG4iLCBjb3NhLT5uYW1lKTsKICNlbmRpZgogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTIwMjQsNDEgKzIwMTAsNDEgQEAKIAkJcyA9ICJOT19SRVEiOwogCQlicmVhazsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElPOiBzdGF0dXMgLT4gMHglMDJ4ICglcyVzJXMlcylcbiIsCisJcHJfaW5mbygiJXM6IElPOiBzdGF0dXMgLT4gMHglMDJ4ICglcyVzJXMlcylcbiIsCiAJCWNvc2EtPm5hbWUsCiAJCXN0YXR1cywKLQkJc3RhdHVzICYgU1JfVVNSX1JRID8gIlVTUl9SUXwiOiIiLAotCQlzdGF0dXMgJiBTUl9UWF9SRFkgPyAiVFhfUkRZfCI6IiIsCi0JCXN0YXR1cyAmIFNSX1JYX1JEWSA/ICJSWF9SRFl8IjoiIiwKKwkJc3RhdHVzICYgU1JfVVNSX1JRID8gIlVTUl9SUXwiIDogIiIsCisJCXN0YXR1cyAmIFNSX1RYX1JEWSA/ICJUWF9SRFl8IiA6ICIiLAorCQlzdGF0dXMgJiBTUl9SWF9SRFkgPyAiUlhfUkRZfCIgOiAiIiwKIAkJcyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRlYnVnX3N0YXR1c19vdXQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IHN0YXR1cykKIHsKLQlwcmludGsoS0VSTl9JTkZPICIlczogSU86IHN0YXR1cyA8LSAweCUwMnggKCVzJXMlcyVzJXMlcylcbiIsCisJcHJfaW5mbygiJXM6IElPOiBzdGF0dXMgPC0gMHglMDJ4ICglcyVzJXMlcyVzJXMpXG4iLAogCQljb3NhLT5uYW1lLAogCQlzdGF0dXMsCi0JCXN0YXR1cyAmIFNSX1JYX0RNQV9FTkEgID8gIlJYRE1BfCI6IiFyeGRtYXwiLAotCQlzdGF0dXMgJiBTUl9UWF9ETUFfRU5BICA/ICJUWERNQXwiOiIhdHhkbWF8IiwKLQkJc3RhdHVzICYgU1JfUlNUICAgICAgICAgPyAiUkVTRVR8IjoiIiwKLQkJc3RhdHVzICYgU1JfVVNSX0lOVF9FTkEgPyAiVVNSSU5UfCI6IiF1c3JpbnR8IiwKLQkJc3RhdHVzICYgU1JfVFhfSU5UX0VOQSAgPyAiVFhJTlR8IjoiIXR4aW50fCIsCi0JCXN0YXR1cyAmIFNSX1JYX0lOVF9FTkEgID8gIlJYSU5UIjoiIXJ4aW50Iik7CisJCXN0YXR1cyAmIFNSX1JYX0RNQV9FTkEgID8gIlJYRE1BfCIgIDogIiFyeGRtYXwiLAorCQlzdGF0dXMgJiBTUl9UWF9ETUFfRU5BICA/ICJUWERNQXwiICA6ICIhdHhkbWF8IiwKKwkJc3RhdHVzICYgU1JfUlNUICAgICAgICAgPyAiUkVTRVR8IiAgOiAiIiwKKwkJc3RhdHVzICYgU1JfVVNSX0lOVF9FTkEgPyAiVVNSSU5UfCIgOiAiIXVzcmludHwiLAorCQlzdGF0dXMgJiBTUl9UWF9JTlRfRU5BICA/ICJUWElOVHwiICA6ICIhdHhpbnR8IiwKKwkJc3RhdHVzICYgU1JfUlhfSU5UX0VOQSAgPyAiUlhJTlQiICAgOiAiIXJ4aW50Iik7CiB9CiAKIHN0YXRpYyB2b2lkIGRlYnVnX2RhdGFfaW4oc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IGRhdGEpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElPOiBkYXRhIC0+IDB4JTA0eFxuIiwgY29zYS0+bmFtZSwgZGF0YSk7CisJcHJfaW5mbygiJXM6IElPOiBkYXRhIC0+IDB4JTA0eFxuIiwgY29zYS0+bmFtZSwgZGF0YSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRlYnVnX2RhdGFfb3V0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBkYXRhKQogewotCXByaW50ayhLRVJOX0lORk8gIiVzOiBJTzogZGF0YSA8LSAweCUwNHhcbiIsIGNvc2EtPm5hbWUsIGRhdGEpOworCXByX2luZm8oIiVzOiBJTzogZGF0YSA8LSAweCUwNHhcbiIsIGNvc2EtPm5hbWUsIGRhdGEpOwogfQogCiBzdGF0aWMgdm9pZCBkZWJ1Z19kYXRhX2NtZChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgZGF0YSkKIHsKLQlwcmludGsoS0VSTl9JTkZPICIlczogSU86IGRhdGEgPC0gMHglMDR4ICglc3wlcylcbiIsCisJcHJfaW5mbygiJXM6IElPOiBkYXRhIDwtIDB4JTA0eCAoJXN8JXMpXG4iLAogCQljb3NhLT5uYW1lLCBkYXRhLAogCQlkYXRhICYgU1JfUkRZX1JDViA/ICJSWF9SRFkiIDogIiFyeF9yZHkiLAogCQlkYXRhICYgU1JfUkRZX1NORCA/ICJUWF9SRFkiIDogIiF0eF9yZHkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jeWN4X2Rydi5jIGIvZHJpdmVycy9uZXQvd2FuL2N5Y3hfZHJ2LmMKaW5kZXggMTY0YzM2Mi4uMmEzZWNhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2N5Y3hfZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2N5Y3hfZHJ2LmMKQEAgLTQ4LDYgKzQ4LDggQEAKICogQXVnICA4LCAxOTk4CWFjbWUJCUluaXRpYWwgdmVyc2lvbi4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIF9faW5pdCAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLwpAQCAtODEsMTAgKzgzLDkgQEAKIC8qIEdsb2JhbCBEYXRhICovCiAKIC8qIHByaXZhdGUgZGF0YSAqLwotc3RhdGljIGNvbnN0IGNoYXIgbW9kbmFtZVtdID0gImN5Y3hfZHJ2IjsKIHN0YXRpYyBjb25zdCBjaGFyIGZ1bGxuYW1lW10gPSAiQ3ljbG9tIDJYIFN1cHBvcnQgTW9kdWxlIjsKLXN0YXRpYyBjb25zdCBjaGFyIGNvcHlyaWdodFtdID0gIihjKSAxOTk4LTIwMDMgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvICIKLQkJCSAgIjxhY21lQGNvbmVjdGl2YS5jb20uYnI+IjsKK3N0YXRpYyBjb25zdCBjaGFyIGNvcHlyaWdodFtdID0KKwkiKGMpIDE5OTgtMjAwMyBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4iOwogCiAvKiBIYXJkd2FyZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCiAgKiBUaGVzZSBhcmUgYXJyYXlzIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIGJ5IHZlcmlmaWNhdGlvbiByb3V0aW5lcy4KQEAgLTExMCw4ICsxMTEsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjeWN4X2Rydl9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiV1LiV1ICVzXG4iLCBmdWxsbmFtZSwgTU9EX1ZFUlNJT04sIE1PRF9SRUxFQVNFLAotCQkJIGNvcHlyaWdodCk7CisJcHJfaW5mbygiJXMgdiV1LiV1ICVzXG4iLAorCQlmdWxsbmFtZSwgTU9EX1ZFUlNJT04sIE1PRF9SRUxFQVNFLCBjb3B5cmlnaHQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzksMTggKzE0MCwxNiBAQAogCiAJLyogVmVyaWZ5IElSUSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KIAlpZiAoIWdldF9vcHRpb25faW5kZXgoY3ljeF8yeF9pcnFfb3B0aW9ucywgaHctPmlycSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRICVkIGlzIGludmFsaWQhXG4iLCBtb2RuYW1lLCBody0+aXJxKTsKKwkJcHJfZXJyKCJJUlEgJWQgaXMgaW52YWxpZCFcbiIsIGh3LT5pcnEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBTZXR1cCBhZGFwdGVyIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93IGFuZCB0ZXN0IG1lbW9yeSAqLwogCWlmICghZHBtYmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBkcG0gYWRkcmVzcyFcbiIsCi0JCQkJbW9kbmFtZSk7CisJCXByX2VycigieW91IG11c3Qgc3BlY2lmeSB0aGUgZHBtIGFkZHJlc3MhXG4iKTsKICAJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSBpZiAoIWdldF9vcHRpb25faW5kZXgoY3ljMnhfZHBtYmFzZV9vcHRpb25zLCBkcG1iYXNlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZW1vcnkgYWRkcmVzcyAweCVsWCBpcyBpbnZhbGlkIVxuIiwKLQkJCQltb2RuYW1lLCBkcG1iYXNlKTsKKwkJcHJfZXJyKCJtZW1vcnkgYWRkcmVzcyAweCVsWCBpcyBpbnZhbGlkIVxuIiwgZHBtYmFzZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTU4LDEzICsxNTcsMTIgQEAKIAlody0+ZHBtc2l6ZSA9IENZQ1hfV0lORE9XU0laRTsKIAogCWlmICghZGV0ZWN0X2N5YzJ4KGh3LT5kcG1iYXNlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhZGFwdGVyIEN5Y2xvbSAyWCBub3QgZm91bmQgYXQgIgotCQkJCSJhZGRyZXNzIDB4JWxYIVxuIiwgbW9kbmFtZSwgZHBtYmFzZSk7CisJCXByX2VycigiYWRhcHRlciBDeWNsb20gMlggbm90IGZvdW5kIGF0IGFkZHJlc3MgMHglbFghXG4iLAorCQkgICAgICAgZHBtYmFzZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBmb3VuZCBDeWNsb20gMlggY2FyZCBhdCBhZGRyZXNzIDB4JWxYLlxuIiwKLQkJCSBtb2RuYW1lLCBkcG1iYXNlKTsKKwlwcl9pbmZvKCJmb3VuZCBDeWNsb20gMlggY2FyZCBhdCBhZGRyZXNzIDB4JWxYXG4iLCBkcG1iYXNlKTsKIAogCS8qIExvYWQgZmlybXdhcmUuIElmIGxvYWRlciBmYWlscyB0aGVuIHNodXQgZG93biBhZGFwdGVyICovCiAJZXJyID0gbG9hZF9jeWMyeChodywgY2ZtLCBsZW4pOwpAQCAtMzM5LDcgKzMzNyw3IEBACiAJZm9yIChpID0gMCA7IGkgPCBsZW4gOyBpICs9IENGTV9MT0FEX0JVRlNaKQogCQlpZiAoYnVmZmVyX2xvYWQoYWRkciwgY29kZSArIGksCiAJCQkJbWluX3QodTMyLCBDRk1fTE9BRF9CVUZTWiwgKGxlbiAtIGkpKSkgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAhIVxuIiwgbW9kbmFtZSk7CisJCQlwcl9lcnIoIkVycm9yICEhXG4iKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCkBAIC0zNzAsNyArMzY4LDcgQEAKIAlmb3IgKGkgPSAwIDsgaSA8IGxlbiA7IGkgKz0gQ0ZNX0xPQURfQlVGU1opCiAJCWlmIChidWZmZXJfbG9hZChhZGRyLCBjb2RlICsgaSwKIAkJCQltaW5fdCh1MzIsIENGTV9MT0FEX0JVRlNaLCAobGVuIC0gaSkpKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgISFcbiIsIG1vZG5hbWUpOworCQkJcHJfZXJyKCJFcnJvciAhIVxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIApAQCAtMzkxLDIzICszODksMjAgQEAKIAl1MTYgY2tzdW07CiAKIAkvKiBBbm5vdW5jZSAqLwotCXByaW50ayhLRVJOX0lORk8gIiVzOiBmaXJtd2FyZSBzaWduYXR1cmU9XCIlc1wiXG4iLCBtb2RuYW1lLAotCQkJCQkJCSAgICBjZm0tPnNpZ25hdHVyZSk7CisJcHJfaW5mbygiZmlybXdhcmUgc2lnbmF0dXJlPVwiJXNcIlxuIiwgY2ZtLT5zaWduYXR1cmUpOwogCiAJLyogVmVyaWZ5IGZpcm13YXJlIHNpZ25hdHVyZSAqLwogCWlmIChzdHJjbXAoY2ZtLT5zaWduYXR1cmUsIENGTV9TSUdOQVRVUkUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6bG9hZF9jeWMyeDogbm90IEN5Y2xvbS0yWCBmaXJtd2FyZSFcbiIsCi0JCQkJbW9kbmFtZSk7CisJCXByX2VycigibG9hZF9jeWMyeDogbm90IEN5Y2xvbS0yWCBmaXJtd2FyZSFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogZmlybXdhcmUgdmVyc2lvbj0ldVxuIiwgbW9kbmFtZSwgY2ZtLT52ZXJzaW9uKTsKKwlwcl9pbmZvKCJmaXJtd2FyZSB2ZXJzaW9uPSV1XG4iLCBjZm0tPnZlcnNpb24pOwogCiAJLyogVmVyaWZ5IGZpcm13YXJlIG1vZHVsZSBmb3JtYXQgdmVyc2lvbiAqLwogCWlmIChjZm0tPnZlcnNpb24gIT0gQ0ZNX1ZFUlNJT04pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczolczogZmlybXdhcmUgZm9ybWF0ICV1IHJlamVjdGVkISAiCi0JCQkJIkV4cGVjdGluZyAldS5cbiIsCi0JCQkJbW9kbmFtZSwgX19mdW5jX18sIGNmbS0+dmVyc2lvbiwgQ0ZNX1ZFUlNJT04pOworCQlwcl9lcnIoIiVzOiBmaXJtd2FyZSBmb3JtYXQgJXUgcmVqZWN0ZWQhIEV4cGVjdGluZyAldS5cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY2ZtLT52ZXJzaW9uLCBDRk1fVkVSU0lPTik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDE5LDIzICs0MTQsMjIgQEAKIAlpZiAoKChsZW4gLSBzaXplb2Yoc3RydWN0IGN5Y3hfZmlybXdhcmUpIC0gMSkgIT0gY2ZtLT5pbmZvLmNvZGVzaXplKSB8fAogKi8KIAlpZiAoY2tzdW0gIT0gY2ZtLT5jaGVja3N1bSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiVzOiBmaXJtd2FyZSBjb3JydXB0ZWQhXG4iLAotCQkJCW1vZG5hbWUsIF9fZnVuY19fKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIgY2RzaXplID0gMHgleCAoZXhwZWN0ZWQgMHglbHgpXG4iLAotCQkJCWxlbiAtIChpbnQpc2l6ZW9mKHN0cnVjdCBjeWN4X2Zpcm13YXJlKSAtIDEsCi0JCQkJY2ZtLT5pbmZvLmNvZGVzaXplKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIgY2hrc3VtID0gMHgleCAoZXhwZWN0ZWQgMHgleClcbiIsCi0JCQkJY2tzdW0sIGNmbS0+Y2hlY2tzdW0pOworCQlwcl9lcnIoIiVzOiBmaXJtd2FyZSBjb3JydXB0ZWQhXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiIGNkc2l6ZSA9IDB4JXggKGV4cGVjdGVkIDB4JWx4KVxuIiwKKwkJICAgICAgIGxlbiAtIChpbnQpc2l6ZW9mKHN0cnVjdCBjeWN4X2Zpcm13YXJlKSAtIDEsCisJCSAgICAgICBjZm0tPmluZm8uY29kZXNpemUpOworCQlwcl9lcnIoIiBjaGtzdW0gPSAweCV4IChleHBlY3RlZCAweCV4KVxuIiwKKwkJICAgICAgIGNrc3VtLCBjZm0tPmNoZWNrc3VtKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogSWYgZXZlcnl0aGluZyBpcyBvaywgc2V0IHJlc2V0LCBkYXRhIGFuZCBjb2RlIHBvaW50ZXJzICovCiAJaW1nX2hkciA9IChzdHJ1Y3QgY3ljeF9md19oZWFkZXIgKikmY2ZtLT5pbWFnZTsKICNpZmRlZiBGSVJNV0FSRV9ERUJVRwotCXByaW50ayhLRVJOX0lORk8gIiVzOiVzOiBpbWFnZSBzaXplc1xuIiwgX19mdW5jX18sIG1vZG5hbWUpOwotCXByaW50ayhLRVJOX0lORk8gIiByZXNldD0lbHVcbiIsIGltZ19oZHItPnJlc2V0X3NpemUpOwotCXByaW50ayhLRVJOX0lORk8gIiAgZGF0YT0lbHVcbiIsIGltZ19oZHItPmRhdGFfc2l6ZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICBjb2RlPSVsdVxuIiwgaW1nX2hkci0+Y29kZV9zaXplKTsKKwlwcl9pbmZvKCIlczogaW1hZ2Ugc2l6ZXNcbiIsIF9fZnVuY19fKTsKKwlwcl9pbmZvKCIgcmVzZXQ9JWx1XG4iLCBpbWdfaGRyLT5yZXNldF9zaXplKTsKKwlwcl9pbmZvKCIgIGRhdGE9JWx1XG4iLCBpbWdfaGRyLT5kYXRhX3NpemUpOworCXByX2luZm8oIiAgY29kZT0lbHVcbiIsIGltZ19oZHItPmNvZGVfc2l6ZSk7CiAjZW5kaWYKIAlyZXNldF9pbWFnZSA9ICgodTggKilpbWdfaGRyKSArIHNpemVvZihzdHJ1Y3QgY3ljeF9md19oZWFkZXIpOwogCWRhdGFfaW1hZ2UgPSByZXNldF9pbWFnZSArIGltZ19oZHItPnJlc2V0X3NpemU7CkBAIC00NDMsMTUgKzQzNywxNCBAQAogCiAJLyotLS0tIFN0YXJ0IGxvYWQgLS0tLSovCiAJLyogQW5ub3VuY2UgKi8KLQlwcmludGsoS0VSTl9JTkZPICIlczogbG9hZGluZyBmaXJtd2FyZSAlcyAoSUQ9JXUpLi4uXG4iLCBtb2RuYW1lLAotCQkJIGNmbS0+ZGVzY3JbMF0gPyBjZm0tPmRlc2NyIDogInVua25vd24gZmlybXdhcmUiLAotCQkJIGNmbS0+aW5mby5jb2RlaWQpOworCXByX2luZm8oImxvYWRpbmcgZmlybXdhcmUgJXMgKElEPSV1KS4uLlxuIiwKKwkJY2ZtLT5kZXNjclswXSA/IGNmbS0+ZGVzY3IgOiAidW5rbm93biBmaXJtd2FyZSIsCisJCWNmbS0+aW5mby5jb2RlaWQpOwogCiAJZm9yIChpID0gMCA7IGkgPCA1IDsgaSsrKSB7CiAJCS8qIFJlc2V0IEN5Y2xvbSBoYXJkd2FyZSAqLwogCQlpZiAoIXJlc2V0X2N5YzJ4KGh3LT5kcG1iYXNlKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZHBtIHByb2JsZW0gb3IgYm9hcmQgbm90IGZvdW5kXG4iLAotCQkJCQltb2RuYW1lKTsKKwkJCXByX2VycigiZHBtIHByb2JsZW0gb3IgYm9hcmQgbm90IGZvdW5kXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTQ2OCwxOSArNDYxLDE5IEBACiAJCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMSAqIDEwMDApOwogCX0KIAotCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlc2V0IG5vdCBzdGFydGVkLlxuIiwgbW9kbmFtZSk7CisJcHJfZXJyKCJyZXNldCBub3Qgc3RhcnRlZFxuIik7CiAJcmV0dXJuIC1FSU5WQUw7CiAKIHJlc2V0X2xvYWRlZDoKIAkvKiBMb2FkIGRhdGEuYmluICovCiAJaWYgKGN5Y3hfZGF0YV9ib290KGh3LT5kcG1iYXNlLCBkYXRhX2ltYWdlLCBpbWdfaGRyLT5kYXRhX3NpemUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBsb2FkIGRhdGEgZmlsZS5cbiIsIG1vZG5hbWUpOworCQlwcl9lcnIoImNhbm5vdCBsb2FkIGRhdGEgZmlsZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIExvYWQgY29kZS5iaW4gKi8KIAlpZiAoY3ljeF9jb2RlX2Jvb3QoaHctPmRwbWJhc2UsIGNvZGVfaW1hZ2UsIGltZ19oZHItPmNvZGVfc2l6ZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGxvYWQgY29kZSBmaWxlLlxuIiwgbW9kbmFtZSk7CisJCXByX2VycigiY2Fubm90IGxvYWQgY29kZSBmaWxlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00OTMsNyArNDg2LDcgQEAKIAkvKiBBcnRodXIgR2FuemVydCdzIHRpcDogd2FpdCBhIHdoaWxlIGFmdGVyIHRoZSBmaXJtd2FyZSBsb2FkaW5nLi4uCiAJICAgc2VnIGFiciAyNiAxNzoxNzoxMiBFU1QgMTk5OSAtIGFjbWUgKi8KIAltc2xlZXBfaW50ZXJydXB0aWJsZSg3ICogMTAwMCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZpcm13YXJlIGxvYWRlZCFcbiIsIG1vZG5hbWUpOworCXByX2luZm8oImZpcm13YXJlIGxvYWRlZCFcbiIpOwogCiAJLyogZW5hYmxlIGludGVycnVwdHMgKi8KIAljeWN4X2ludGVuKGh3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jeWN4X21haW4uYyBiL2RyaXZlcnMvbmV0L3dhbi9jeWN4X21haW4uYwppbmRleCA4NTlkYmE5Li44MWZiYmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vY3ljeF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2N5Y3hfbWFpbi5jCkBAIC00MCw2ICs0MCw4IEBACiAqIDE5OTgvMDgvMDgJYWNtZQkJSW5pdGlhbCB2ZXJzaW9uLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCkBAIC01MCw2ICs1Miw3IEBACiAjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KICNpbmNsdWRlIDxsaW51eC9jeWNsb214Lmg+CS8qIGN5Y2xvbXggY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPiAgICAgICAgIC8qIF9faW5pdCAod2hlbiBub3QgdXNpbmcgYXMgYSBtb2R1bGUpICovCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKIHVuc2lnbmVkIGludCBjeWN4X2RlYnVnOwogCkBAIC0xMDYsNyArMTA5LDcgQEAKIHsKIAlpbnQgY250LCBlcnIgPSAtRU5PTUVNOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiV1LiV1ICVzXG4iLAorCXByX2luZm8oIiVzIHYldS4ldSAlc1xuIiwKIAkJY3ljeF9mdWxsbmFtZSwgQ1lDWF9EUlZfVkVSU0lPTiwgQ1lDWF9EUlZfUkVMRUFTRSwKIAkJY3ljeF9jb3B5cmlnaHQpOwogCkBAIC0xMzIsOSArMTM1LDggQEAKIAkJZXJyID0gcmVnaXN0ZXJfd2FuX2RldmljZSh3YW5kZXYpOwogCiAJCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIHJlZ2lzdHJhdGlvbiBmYWlsZWQgd2l0aCAiCi0JCQkJCSJlcnJvciAlZCFcbiIsCi0JCQkJCWN5Y3hfZHJ2bmFtZSwgY2FyZC0+ZGV2bmFtZSwgZXJyKTsKKwkJCXByX2VycigiJXMgcmVnaXN0cmF0aW9uIGZhaWxlZCB3aXRoIGVycm9yICVkIVxuIiwKKwkJCSAgICAgICBjYXJkLT5kZXZuYW1lLCBlcnIpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xOTcsMTQgKzE5OSwxMyBAQAogCiAJcmMgPSAtRUlOVkFMOwogCWlmICghY29uZi0+ZGF0YV9zaXplIHx8ICFjb25mLT5kYXRhKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZpcm13YXJlIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uICIKLQkJCQkiZGF0YSFcbiIsIHdhbmRldi0+bmFtZSk7CisJCXByX2VycigiJXM6IGZpcm13YXJlIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uIGRhdGEhXG4iLAorCQkgICAgICAgd2FuZGV2LT5uYW1lKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJaWYgKGNvbmYtPmlycSA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGNvbmZpZ3VyZSB3aXRob3V0IElSUSFcbiIsCi0JCQkJd2FuZGV2LT5uYW1lKTsKKwkJcHJfZXJyKCIlczogY2FuJ3QgY29uZmlndXJlIHdpdGhvdXQgSVJRIVxuIiwgd2FuZGV2LT5uYW1lKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0yMTIsOCArMjEzLDcgQEAKIAlpcnEgPSBjb25mLT5pcnEgPT0gMiA/IDkgOiBjb25mLT5pcnE7CS8qIElSUTIgLT4gSVJROSAqLwogCiAJaWYgKHJlcXVlc3RfaXJxKGlycSwgY3ljeF9pc3IsIDAsIHdhbmRldi0+bmFtZSwgY2FyZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgcmVzZXJ2ZSBJUlEgJWQhXG4iLAotCQkJCXdhbmRldi0+bmFtZSwgaXJxKTsKKwkJcHJfZXJyKCIlczogY2FuJ3QgcmVzZXJ2ZSBJUlEgJWQhXG4iLCB3YW5kZXYtPm5hbWUsIGlycSk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjQ1LDggKzI0NSw3IEBACiAJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGhpcyBmaXJtd2FyZSBpcyBub3Qgc3VwcG9ydGVkIVxuIiwKLQkJCQl3YW5kZXYtPm5hbWUpOworCQlwcl9lcnIoIiVzOiB0aGlzIGZpcm13YXJlIGlzIG5vdCBzdXBwb3J0ZWQhXG4iLCB3YW5kZXYtPm5hbWUpOwogCQlyYyA9IC1FSU5WQUw7CiAJfQogCkBAIC0yODcsOCArMjg2LDcgQEAKIAljYXJkID0gd2FuZGV2LT5wcml2YXRlOwogCXdhbmRldi0+c3RhdGUgPSBXQU5fVU5DT05GSUdVUkVEOwogCWN5Y3hfZG93bigmY2FyZC0+aHcpOwotCXByaW50ayhLRVJOX0lORk8gIiVzOiBpcnEgJWQgYmVpbmcgZnJlZWQhXG4iLCB3YW5kZXYtPm5hbWUsCi0JCQl3YW5kZXYtPmlycSk7CisJcHJfaW5mbygiJXM6IGlycSAlZCBiZWluZyBmcmVlZCFcbiIsIHdhbmRldi0+bmFtZSwgd2FuZGV2LT5pcnEpOwogCWZyZWVfaXJxKHdhbmRldi0+aXJxLCBjYXJkKTsKIG91dDoJcmV0dXJuIHJldDsKIH0KQEAgLTMwNyw4ICszMDUsOCBAQAogCQlnb3RvIG91dDsKIAogCWlmIChjYXJkLT5pbl9pc3IpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludGVycnVwdCByZS1lbnRyYW5jeSBvbiBJUlEgJWQhXG4iLAotCQkJCSAgICBjYXJkLT5kZXZuYW1lLCBjYXJkLT53YW5kZXYuaXJxKTsKKwkJcHJfd2FybigiJXM6IGludGVycnVwdCByZS1lbnRyYW5jeSBvbiBJUlEgJWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY2FyZC0+d2FuZGV2LmlycSk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzM2LDcgKzMzNCw3IEBACiAJCQlzdHJpbmdfc3RhdGUgPSAiZGlzY29ubmVjdGVkISI7CiAJCQlicmVhazsKIAkJfQotCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayAlc1xuIiwgY2FyZC0+ZGV2bmFtZSwgc3RyaW5nX3N0YXRlKTsKKwkJcHJfaW5mbygiJXM6IGxpbmsgJXNcbiIsIGNhcmQtPmRldm5hbWUsIHN0cmluZ19zdGF0ZSk7CiAJCWNhcmQtPndhbmRldi5zdGF0ZSA9IHN0YXRlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2N5Y3hfeDI1LmMgYi9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYwppbmRleCBjZjllMTVmLi4wNmYzZjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYworKysgYi9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYwpAQCAtNzYsNiArNzYsOCBAQAogKiAxOTk4LzA4LzA4CWFjbWUJCUluaXRpYWwgdmVyc2lvbi4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBDWUNMT01YX1gyNV9ERUJVRyAxCiAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgkvKiBpc2RpZ2l0KCkgKi8KQEAgLTIzMCw4ICsyMzIsOCBAQAogCiAJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gSUQgKi8KIAlpZiAoY29uZi0+Y29uZmlnX2lkICE9IFdBTkNPTkZJR19YMjUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgY29uZmlndXJhdGlvbiBJRCAldSFcbiIsCi0JCQkJIGNhcmQtPmRldm5hbWUsIGNvbmYtPmNvbmZpZ19pZCk7CisJCXByX2luZm8oIiVzOiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gSUQgJXUhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY29uZi0+Y29uZmlnX2lkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zNzQsOCArMzc2LDcgQEAKIAlpbnQgZXJyID0gMDsKIAogCWlmICghY29uZi0+bmFtZVswXSB8fCBzdHJsZW4oY29uZi0+bmFtZSkgPiBXQU5fSUZOQU1FX1NaKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIGludGVyZmFjZSBuYW1lIVxuIiwKLQkJICAgICAgIGNhcmQtPmRldm5hbWUpOworCQlwcl9pbmZvKCIlczogaW52YWxpZCBpbnRlcmZhY2UgbmFtZSFcbiIsIGNhcmQtPmRldm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTM5OCw4ICszOTksOCBAQAogCiAJCWlmIChsZW4pIHsKIAkJCWlmIChsZW4gPiBXQU5fQUREUkVTU19TWikgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGxvY2FsIGFkZHIgdG9vIGxvbmchXG4iLAotCQkJCQkJd2FuZGV2LT5uYW1lLCBjaGFuLT5uYW1lKTsKKwkJCQlwcl9lcnIoIiVzOiAlcyBsb2NhbCBhZGRyIHRvbyBsb25nIVxuIiwKKwkJCQkgICAgICAgd2FuZGV2LT5uYW1lLCBjaGFuLT5uYW1lKTsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJCWdvdG8gZXJyb3I7CiAJCQl9IGVsc2UgewpAQCAtNDI5LDE1ICs0MzAsMTQgQEAKIAkJaWYgKGxjbiA+PSBjYXJkLT51LngubG9fcHZjICYmIGxjbiA8PSBjYXJkLT51LnguaGlfcHZjKQogCQkJY2hhbi0+bGNuID0gbGNuOwogCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSIlczogUFZDICV1IGlzIG91dCBvZiByYW5nZSBvbiBpbnRlcmZhY2UgJXMhXG4iLAotCQkJCXdhbmRldi0+bmFtZSwgbGNuLCBjaGFuLT5uYW1lKTsKKwkJCXByX2VycigiJXM6IFBWQyAldSBpcyBvdXQgb2YgcmFuZ2Ugb24gaW50ZXJmYWNlICVzIVxuIiwKKwkJCSAgICAgICB3YW5kZXYtPm5hbWUsIGxjbiwgY2hhbi0+bmFtZSk7CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvcjsKIAkJfQogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgbWVkaWEgYWRkcmVzcyBvbiBpbnRlcmZhY2UgJXMhXG4iLAotCQkJCXdhbmRldi0+bmFtZSwgY2hhbi0+bmFtZSk7CisJCXByX2VycigiJXM6IGludmFsaWQgbWVkaWEgYWRkcmVzcyBvbiBpbnRlcmZhY2UgJXMhXG4iLAorCQkgICAgICAgd2FuZGV2LT5uYW1lLCBjaGFuLT5uYW1lKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC02MDcsOSArNjA3LDggQEAKIAkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CiAJZWxzZSBpZiAoY2hhbi0+c3ZjICYmIGNoYW4tPnByb3RvY29sICYmCiAJCSBjaGFuLT5wcm90b2NvbCAhPSBudG9ocyhza2ItPnByb3RvY29sKSkgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiJXM6IHVuc3VwcG9ydGVkIEV0aGVydHlwZSAweCUwNFggb24gaW50ZXJmYWNlICVzIVxuIiwKLQkJICAgICAgIGNhcmQtPmRldm5hbWUsIG50b2hzKHNrYi0+cHJvdG9jb2wpLCBkZXYtPm5hbWUpOworCQlwcl9pbmZvKCIlczogdW5zdXBwb3J0ZWQgRXRoZXJ0eXBlIDB4JTA0WCBvbiBpbnRlcmZhY2UgJXMhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgbnRvaHMoc2tiLT5wcm90b2NvbCksIGRldi0+bmFtZSk7CiAJCSsrY2hhbi0+aWZzdGF0cy50eF9lcnJvcnM7CiAJfSBlbHNlIGlmIChjaGFuLT5wcm90b2NvbCA9PSBFVEhfUF9JUCkgewogCQlzd2l0Y2ggKGNoYW4tPnN0YXRlKSB7CkBAIC02NDMsOSArNjQyLDggQEAKIAkJCWN5Y3hfeDI1X2NoYW5fZGlzY29ubmVjdChkZXYpOwogCQkJZ290byBmcmVlX3BhY2tldDsKIAkgICAgICAgIGRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgIiVzOiB1bmtub3duICVkIHgyNS1pZmFjZSByZXF1ZXN0IG9uICVzIVxuIiwKLQkJCSAgICAgICBjYXJkLT5kZXZuYW1lLCBza2ItPmRhdGFbMF0sIGRldi0+bmFtZSk7CisJCQlwcl9pbmZvKCIlczogdW5rbm93biAlZCB4MjUtaWZhY2UgcmVxdWVzdCBvbiAlcyFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgc2tiLT5kYXRhWzBdLCBkZXYtPm5hbWUpOwogCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Vycm9yczsKIAkJCWdvdG8gZnJlZV9wYWNrZXQ7CiAJCX0KQEAgLTc0Niw4ICs3NDQsNyBAQAogCQljYXJkLT5idWZmX2ludF9tb2RlX3VuYnVzeSA9IDE7CiAJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIAl9IGVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSICIlczphY2t2YyBmb3IgaW5leGlzdGVudCBsY24gJWRcbiIsCi0JCQkJIGNhcmQtPmRldm5hbWUsIGxjbik7CisJCXByX2VycigiJXM6YWNrdmMgZm9yIGluZXhpc3RlbnQgbGNuICVkXG4iLCBjYXJkLT5kZXZuYW1lLCBsY24pOwogfQogCiAvKiBSZWNlaXZlIGludGVycnVwdCBoYW5kbGVyLgpAQCAtNzgwLDggKzc3Nyw4IEBACiAJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24od2FuZGV2LCBsY24pOwogCWlmICghZGV2KSB7CiAJCS8qIEludmFsaWQgY2hhbm5lbCwgZGlzY2FyZCBwYWNrZXQgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlY2VpdmluZyBvbiBvcnBoYW5lZCBMQ04gJWQhXG4iLAotCQkJCSBjYXJkLT5kZXZuYW1lLCBsY24pOworCQlwcl9pbmZvKCIlczogcmVjZWl2aW5nIG9uIG9ycGhhbmVkIExDTiAlZCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBsY24pOwogCQlyZXR1cm47CiAJfQogCkBAIC04MDIsOCArNzk5LDggQEAKIAkJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKChjaGFuLT5wcm90b2NvbCA9PSBFVEhfUF9YMjUgPyAxIDogMCkgKwogCQkJCQkgYnVmc2l6ZSArCiAJCQkJCSBkZXYtPmhhcmRfaGVhZGVyX2xlbikpID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLAotCQkJCQkgY2FyZC0+ZGV2bmFtZSk7CisJCQlwcl9pbmZvKCIlczogbm8gc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKIAkJCWNoYW4tPmRyb3Bfc2VxdWVuY2UgPSAxOwogCQkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CiAJCQlyZXR1cm47CkBAIC04MjYsOCArODIzLDggQEAKIAkJaWYgKGJpdG0pCiAJCQljaGFuLT5kcm9wX3NlcXVlbmNlID0gMTsKIAotCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5leHBlY3RlZGx5IGxvbmcgcGFja2V0IHNlcXVlbmNlICIKLQkJCSJvbiBpbnRlcmZhY2UgJXMhXG4iLCBjYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOworCQlwcl9pbmZvKCIlczogdW5leHBlY3RlZGx5IGxvbmcgcGFja2V0IHNlcXVlbmNlIG9uIGludGVyZmFjZSAlcyFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOwogCQkrK2NoYW4tPmlmc3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKIAkJcmV0dXJuOwogCX0KQEAgLTg4MCw4ICs4NzcsOCBAQAogCWRldiA9IGN5Y3hfeDI1X2dldF9kZXZfYnlfZHRlX2FkZHIod2FuZGV2LCByZW0pOwogCWlmICghZGV2KSB7CiAJCS8qIEludmFsaWQgY2hhbm5lbCwgZGlzY2FyZCBwYWNrZXQgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbm5lY3Qgbm90IGV4cGVjdGVkOiByZW1vdGUgJXMhXG4iLAotCQkJCSBjYXJkLT5kZXZuYW1lLCByZW0pOworCQlwcl9pbmZvKCIlczogY29ubmVjdCBub3QgZXhwZWN0ZWQ6IHJlbW90ZSAlcyFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCByZW0pOwogCQlyZXR1cm47CiAJfQogCkBAIC05MDksOCArOTA2LDggQEAKIAlpZiAoIWRldikgewogCQkvKiBJbnZhbGlkIGNoYW5uZWwsIGRpc2NhcmQgcGFja2V0ICovCiAJCWNsZWFyX2JpdCgtLWtleSwgKHZvaWQqKSZjYXJkLT51LnguY29ubmVjdGlvbl9rZXlzKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbm5lY3QgY29uZmlybSBub3QgZXhwZWN0ZWQ6IGxjbiAlZCwgIgotCQkJCSAia2V5PSVkIVxuIiwgY2FyZC0+ZGV2bmFtZSwgbGNuLCBrZXkpOworCQlwcl9pbmZvKCIlczogY29ubmVjdCBjb25maXJtIG5vdCBleHBlY3RlZDogbGNuICVkLCBrZXk9JWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgbGNuLCBrZXkpOwogCQlyZXR1cm47CiAJfQogCkBAIC05MzQsOCArOTMxLDggQEAKIAlkZXYgPSBjeWN4X3gyNV9nZXRfZGV2X2J5X2xjbih3YW5kZXYsIGxjbik7CiAJaWYgKCFkZXYpIHsKIAkJLyogSW52YWxpZCBjaGFubmVsLCBkaXNjYXJkIHBhY2tldCAqLwotCQlwcmludGsoS0VSTl9JTkZPICIlczpkaXNjb25uZWN0IGNvbmZpcm0gbm90IGV4cGVjdGVkITpsY24gJWRcbiIsCi0JCQkJIGNhcmQtPmRldm5hbWUsIGxjbik7CisJCXByX2luZm8oIiVzOmRpc2Nvbm5lY3QgY29uZmlybSBub3QgZXhwZWN0ZWQhOmxjbiAlZFxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGxjbik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTk4MCwxMyArOTc3LDEzIEBACiAJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYgKyAxMCArIHRvcmVhZCwgJmNvZGUsIDEpOwogCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgMTAgKyB0b3JlYWQgKyAxLCAmcm91dGluZSwgMSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJjeWN4X3gyNV9pcnFfaGFuZGxlcjogWDI1X0xPRyAoMHg0NTAwKSBpbmRpYy46XG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICJjbWQtPmJ1Zj0weCVYXG4iLCBjbWQtPmJ1Zik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiTG9nIG1lc3NhZ2UgY29kZT0weCVYXG4iLCBtc2dfY29kZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiTGluaz0lZFxuIiwgbGluayk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibG9nIGNvZGU9MHglWFxuIiwgY29kZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibG9nIHJvdXRpbmU9MHglWFxuIiwgcm91dGluZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiTWVzc2FnZSBzaXplPSVkXG4iLCBzaXplKTsKKwlwcl9pbmZvKCJjeWN4X3gyNV9pcnFfaGFuZGxlcjogWDI1X0xPRyAoMHg0NTAwKSBpbmRpYy46XG4iKTsKKwlwcl9pbmZvKCJjbWQtPmJ1Zj0weCVYXG4iLCBjbWQtPmJ1Zik7CisJcHJfaW5mbygiTG9nIG1lc3NhZ2UgY29kZT0weCVYXG4iLCBtc2dfY29kZSk7CisJcHJfaW5mbygiTGluaz0lZFxuIiwgbGluayk7CisJcHJfaW5mbygibG9nIGNvZGU9MHglWFxuIiwgY29kZSk7CisJcHJfaW5mbygibG9nIHJvdXRpbmU9MHglWFxuIiwgcm91dGluZSk7CisJcHJfaW5mbygiTWVzc2FnZSBzaXplPSVkXG4iLCBzaXplKTsKIAloZXhfZHVtcCgiTWVzc2FnZSIsIGJmLCB0b3JlYWQpOwogI2VuZGlmCiB9CkBAIC0xMDA5LDI0ICsxMDA2LDE0IEBACiBzdGF0aWMgdm9pZCBjeWN4X3gyNV9pcnFfc3B1cmlvdXMoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAogCQkJCSAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKQogewotCXByaW50ayhLRVJOX0lORk8gIiVzOiBzcHVyaW91cyBpbnRlcnJ1cHQgKDB4JVgpIVxuIiwKLQkJCSBjYXJkLT5kZXZuYW1lLCBjbWQtPmNvbW1hbmQpOworCXByX2luZm8oIiVzOiBzcHVyaW91cyBpbnRlcnJ1cHQgKDB4JVgpIVxuIiwKKwkJY2FyZC0+ZGV2bmFtZSwgY21kLT5jb21tYW5kKTsKIH0KICNpZmRlZiBDWUNMT01YX1gyNV9ERUJVRwogc3RhdGljIHZvaWQgaGV4X2R1bXAoY2hhciAqbXNnLCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKQogewotCXVuc2lnbmVkIGNoYXIgaGV4WzEwMjRdLAotCSAgICAJKiBwaGV4ID0gaGV4OwotCi0JaWYgKGxlbiA+PSAoc2l6ZW9mKGhleCkgLyAyKSkKLQkJbGVuID0gKHNpemVvZihoZXgpIC8gMikgLSAxOwotCi0Jd2hpbGUgKGxlbi0tKSB7Ci0JCXNwcmludGYocGhleCwgIiUwMngiLCAqcCsrKTsKLQkJcGhleCArPSAyOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc1xuIiwgbXNnLCBoZXgpOworCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgbXNnLCBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLAorCQkgICAgICAgcCwgbGVuLCB0cnVlKTsKIH0KICNlbmRpZgogCkBAIC0xMjAzLDggKzExOTAsOCBAQAogCXU4IGtleTsKIAogCWlmIChjYXJkLT51LnguY29ubmVjdGlvbl9rZXlzID09IH4wVSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogdG9vIG1hbnkgc2ltdWx0YW5lb3VzIGNvbm5lY3Rpb24gIgotCQkJCSAicmVxdWVzdHMhXG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkJcHJfaW5mbygiJXM6IHRvbyBtYW55IHNpbXVsdGFuZW91cyBjb25uZWN0aW9uIHJlcXVlc3RzIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKQEAgLTEzODEsOCArMTM2OCw4IEBACiAJaWYgKGNoYW4tPnN0YXRlID09IFdBTl9DT05ORUNURUQpCiAJCWN5Y3hfeDI1X2NoYW5fZGlzY29ubmVjdChkZXYpOwogCWVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZm9yIHN2YyAoJXMpIG5vdCBjb25uZWN0ZWQhXG4iLAotCQkJCWNoYW4tPmNhcmQtPmRldm5hbWUsIF9fZnVuY19fLCBkZXYtPm5hbWUpOworCQlwcl9lcnIoIiVzOiAlcyBmb3Igc3ZjICglcykgbm90IGNvbm5lY3RlZCFcbiIsCisJCSAgICAgICBjaGFuLT5jYXJkLT5kZXZuYW1lLCBfX2Z1bmNfXywgZGV2LT5uYW1lKTsKIH0KIAogLyogU2V0IGxvZ2ljYWwgY2hhbm5lbCBzdGF0ZS4gKi8KQEAgLTE0MzMsOCArMTQyMCw4IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcmZhY2UgJXMgJXNcbiIsIGNhcmQtPmRldm5hbWUsCi0JCQkJICBkZXYtPm5hbWUsIHN0cmluZ19zdGF0ZSk7CisJCXByX2luZm8oIiVzOiBpbnRlcmZhY2UgJXMgJXNcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsIHN0cmluZ19zdGF0ZSk7CiAJCWNoYW4tPnN0YXRlID0gc3RhdGU7CiAJfQogCkBAIC0xNDg4LDcgKzE0NzUsNyBAQAogCXVuc2lnbmVkIGNoYXIgKnB0cjsKIAogCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYigxKSkgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTU1Nyw1NiArMTU0NCw1NiBAQAogI2lmZGVmIENZQ0xPTVhfWDI1X0RFQlVHCiBzdGF0aWMgdm9pZCBjeWN4X3gyNV9kdW1wX2NvbmZpZyhzdHJ1Y3QgY3ljeF94MjVfY29uZmlnICpjb25mKQogewotCXByaW50ayhLRVJOX0lORk8gIlguMjUgY29uZmlndXJhdGlvblxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCXByaW50ayhLRVJOX0lORk8gImxpbmsgbnVtYmVyPSVkXG4iLCBjb25mLT5saW5rKTsKLQlwcmludGsoS0VSTl9JTkZPICJsaW5lIHNwZWVkPSVkXG4iLCBjb25mLT5zcGVlZCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiY2xvY2s9JXN0ZXJuYWxcbiIsIGNvbmYtPmNsb2NrID09IDggPyAiRXgiIDogIkluIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiIyBsZXZlbCAyIHJldHJhbnNtLj0lZFxuIiwgY29uZi0+bjIpOwotCXByaW50ayhLRVJOX0lORk8gImxldmVsIDIgd2luZG93PSVkXG4iLCBjb25mLT5uMndpbik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibGV2ZWwgMyB3aW5kb3c9JWRcbiIsIGNvbmYtPm4zd2luKTsKLQlwcmludGsoS0VSTl9JTkZPICIjIGxvZ2ljYWwgY2hhbm5lbHM9JWRcbiIsIGNvbmYtPm52Yyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibGV2ZWwgMyBwa3QgbGVuPSVkXG4iLCBjb25mLT5wa3RsZW4pOwotCXByaW50ayhLRVJOX0lORk8gIm15IGFkZHJlc3M9JWRcbiIsIGNvbmYtPmxvY2FkZHIpOwotCXByaW50ayhLRVJOX0lORk8gInJlbW90ZSBhZGRyZXNzPSVkXG4iLCBjb25mLT5yZW1hZGRyKTsKLQlwcmludGsoS0VSTl9JTkZPICJ0MT0lZCBzZWNvbmRzXG4iLCBjb25mLT50MSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAidDI9JWQgc2Vjb25kc1xuIiwgY29uZi0+dDIpOwotCXByaW50ayhLRVJOX0lORk8gInQyMT0lZCBzZWNvbmRzXG4iLCBjb25mLT50MjEpOwotCXByaW50ayhLRVJOX0lORk8gIiMgUFZDcz0lZFxuIiwgY29uZi0+bnB2Yyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAidDIzPSVkIHNlY29uZHNcbiIsIGNvbmYtPnQyMyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiZmxhZ3M9MHgleFxuIiwgY29uZi0+ZmxhZ3MpOworCXByX2luZm8oIlguMjUgY29uZmlndXJhdGlvblxuIik7CisJcHJfaW5mbygiLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXByX2luZm8oImxpbmsgbnVtYmVyPSVkXG4iLCBjb25mLT5saW5rKTsKKwlwcl9pbmZvKCJsaW5lIHNwZWVkPSVkXG4iLCBjb25mLT5zcGVlZCk7CisJcHJfaW5mbygiY2xvY2s9JXN0ZXJuYWxcbiIsIGNvbmYtPmNsb2NrID09IDggPyAiRXgiIDogIkluIik7CisJcHJfaW5mbygiIyBsZXZlbCAyIHJldHJhbnNtLj0lZFxuIiwgY29uZi0+bjIpOworCXByX2luZm8oImxldmVsIDIgd2luZG93PSVkXG4iLCBjb25mLT5uMndpbik7CisJcHJfaW5mbygibGV2ZWwgMyB3aW5kb3c9JWRcbiIsIGNvbmYtPm4zd2luKTsKKwlwcl9pbmZvKCIjIGxvZ2ljYWwgY2hhbm5lbHM9JWRcbiIsIGNvbmYtPm52Yyk7CisJcHJfaW5mbygibGV2ZWwgMyBwa3QgbGVuPSVkXG4iLCBjb25mLT5wa3RsZW4pOworCXByX2luZm8oIm15IGFkZHJlc3M9JWRcbiIsIGNvbmYtPmxvY2FkZHIpOworCXByX2luZm8oInJlbW90ZSBhZGRyZXNzPSVkXG4iLCBjb25mLT5yZW1hZGRyKTsKKwlwcl9pbmZvKCJ0MT0lZCBzZWNvbmRzXG4iLCBjb25mLT50MSk7CisJcHJfaW5mbygidDI9JWQgc2Vjb25kc1xuIiwgY29uZi0+dDIpOworCXByX2luZm8oInQyMT0lZCBzZWNvbmRzXG4iLCBjb25mLT50MjEpOworCXByX2luZm8oIiMgUFZDcz0lZFxuIiwgY29uZi0+bnB2Yyk7CisJcHJfaW5mbygidDIzPSVkIHNlY29uZHNcbiIsIGNvbmYtPnQyMyk7CisJcHJfaW5mbygiZmxhZ3M9MHgleFxuIiwgY29uZi0+ZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBjeWN4X3gyNV9kdW1wX3N0YXRzKHN0cnVjdCBjeWN4X3gyNV9zdGF0cyAqc3RhdHMpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiWC4yNSBzdGF0aXN0aWNzXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLVxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAicnhfY3JjX2Vycm9ycz0lZFxuIiwgc3RhdHMtPnJ4X2NyY19lcnJvcnMpOwotCXByaW50ayhLRVJOX0lORk8gInJ4X292ZXJfZXJyb3JzPSVkXG4iLCBzdGF0cy0+cnhfb3Zlcl9lcnJvcnMpOwotCXByaW50ayhLRVJOX0lORk8gIm4yX3R4X2ZyYW1lcz0lZFxuIiwgc3RhdHMtPm4yX3R4X2ZyYW1lcyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibjJfcnhfZnJhbWVzPSVkXG4iLCBzdGF0cy0+bjJfcnhfZnJhbWVzKTsKLQlwcmludGsoS0VSTl9JTkZPICJ0eF90aW1lb3V0cz0lZFxuIiwgc3RhdHMtPnR4X3RpbWVvdXRzKTsKLQlwcmludGsoS0VSTl9JTkZPICJyeF90aW1lb3V0cz0lZFxuIiwgc3RhdHMtPnJ4X3RpbWVvdXRzKTsKLQlwcmludGsoS0VSTl9JTkZPICJuM190eF9wYWNrZXRzPSVkXG4iLCBzdGF0cy0+bjNfdHhfcGFja2V0cyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibjNfcnhfcGFja2V0cz0lZFxuIiwgc3RhdHMtPm4zX3J4X3BhY2tldHMpOwotCXByaW50ayhLRVJOX0lORk8gInR4X2Fib3J0cz0lZFxuIiwgc3RhdHMtPnR4X2Fib3J0cyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAicnhfYWJvcnRzPSVkXG4iLCBzdGF0cy0+cnhfYWJvcnRzKTsKKwlwcl9pbmZvKCJYLjI1IHN0YXRpc3RpY3NcbiIpOworCXByX2luZm8oIi0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcl9pbmZvKCJyeF9jcmNfZXJyb3JzPSVkXG4iLCBzdGF0cy0+cnhfY3JjX2Vycm9ycyk7CisJcHJfaW5mbygicnhfb3Zlcl9lcnJvcnM9JWRcbiIsIHN0YXRzLT5yeF9vdmVyX2Vycm9ycyk7CisJcHJfaW5mbygibjJfdHhfZnJhbWVzPSVkXG4iLCBzdGF0cy0+bjJfdHhfZnJhbWVzKTsKKwlwcl9pbmZvKCJuMl9yeF9mcmFtZXM9JWRcbiIsIHN0YXRzLT5uMl9yeF9mcmFtZXMpOworCXByX2luZm8oInR4X3RpbWVvdXRzPSVkXG4iLCBzdGF0cy0+dHhfdGltZW91dHMpOworCXByX2luZm8oInJ4X3RpbWVvdXRzPSVkXG4iLCBzdGF0cy0+cnhfdGltZW91dHMpOworCXByX2luZm8oIm4zX3R4X3BhY2tldHM9JWRcbiIsIHN0YXRzLT5uM190eF9wYWNrZXRzKTsKKwlwcl9pbmZvKCJuM19yeF9wYWNrZXRzPSVkXG4iLCBzdGF0cy0+bjNfcnhfcGFja2V0cyk7CisJcHJfaW5mbygidHhfYWJvcnRzPSVkXG4iLCBzdGF0cy0+dHhfYWJvcnRzKTsKKwlwcl9pbmZvKCJyeF9hYm9ydHM9JWRcbiIsIHN0YXRzLT5yeF9hYm9ydHMpOwogfQogCiBzdGF0aWMgdm9pZCBjeWN4X3gyNV9kdW1wX2RldnMoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2FuZGV2LT5kZXY7CiAKLQlwcmludGsoS0VSTl9JTkZPICJYLjI1IGRldiBzdGF0ZXNcbiIpOwotCXByaW50ayhLRVJOX0lORk8gIm5hbWU6IGFkZHI6ICAgICAgICAgICB0eG9mZjogIHByb3RvY29sOlxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcl9pbmZvKCJYLjI1IGRldiBzdGF0ZXNcbiIpOworCXByX2luZm8oIm5hbWU6IGFkZHI6ICAgICAgICAgICB0eG9mZjogIHByb3RvY29sOlxuIik7CisJcHJfaW5mbygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAogCXdoaWxlKGRldikgewogCQlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IG5ldGRldl9wcml2KGRldik7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJS01LjVzICUtMTUuMTVzICAgJWQgICAgIEVUSF9QXyVzXG4iLAotCQkJCSBjaGFuLT5uYW1lLCBjaGFuLT5hZGRyLCBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldiksCi0JCQkJIGNoYW4tPnByb3RvY29sID09IEVUSF9QX0lQID8gIklQIiA6ICJYMjUiKTsKKwkJcHJfaW5mbygiJS01LjVzICUtMTUuMTVzICAgJWQgICAgIEVUSF9QXyVzXG4iLAorCQkJY2hhbi0+bmFtZSwgY2hhbi0+YWRkciwgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpLAorCQkJY2hhbi0+cHJvdG9jb2wgPT0gRVRIX1BfSVAgPyAiSVAiIDogIlgyNSIpOwogCQlkZXYgPSBjaGFuLT5zbGF2ZTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZGxjaS5jIGIvZHJpdmVycy9uZXQvd2FuL2RsY2kuYwppbmRleCAyMWIxMDRkLi40OGFiMzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vZGxjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9kbGNpLmMKQEAgLTI4LDYgKzI4LDggQEAKICAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xMTIsOCArMTE0LDcgQEAKIAogCWRscCA9IG5ldGRldl9wcml2KGRldik7CiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBpbnZhbGlkIGRhdGEgbm8gaGVhZGVyXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X25vdGljZShkZXYsICJpbnZhbGlkIGRhdGEgbm8gaGVhZGVyXG4iKTsKIAkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybjsKQEAgLTEyNiw3ICsxMjcsOCBAQAogCiAJaWYgKGhkci0+Y29udHJvbCAhPSBGUkFEX0lfVUkpCiAJewotCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBJbnZhbGlkIGhlYWRlciBmbGFnIDB4JTAyWC5cbiIsIGRldi0+bmFtZSwgaGRyLT5jb250cm9sKTsKKwkJbmV0ZGV2X25vdGljZShkZXYsICJJbnZhbGlkIGhlYWRlciBmbGFnIDB4JTAyWFxuIiwKKwkJCSAgICAgIGhkci0+Y29udHJvbCk7CiAJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJfQogCWVsc2UKQEAgLTEzNSwxNCArMTM3LDE4IEBACiAJCQljYXNlIEZSQURfUF9QQURESU5HOgogCQkJCWlmIChoZHItPk5MUElEICE9IEZSQURfUF9TTkFQKQogCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVW5zdXBwb3J0ZWQgTkxQSUQgMHglMDJYLlxuIiwgZGV2LT5uYW1lLCBoZHItPk5MUElEKTsKKwkJCQkJbmV0ZGV2X25vdGljZShkZXYsICJVbnN1cHBvcnRlZCBOTFBJRCAweCUwMlhcbiIsCisJCQkJCQkgICAgICBoZHItPk5MUElEKTsKIAkJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCSAKIAkJCQlpZiAoaGRyLT5PVUlbMF0gKyBoZHItPk9VSVsxXSArIGhkci0+T1VJWzJdICE9IDApCiAJCQkJewotCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBVbnN1cHBvcnRlZCBvcmdhbml6YXRpb25hbGx5IHVuaXF1ZSBpZGVudGlmaWVyIDB4JTAyWC0lMDJYLSUwMlguXG4iLCBkZXYtPm5hbWUsIGhkci0+T1VJWzBdLCBoZHItPk9VSVsxXSwgaGRyLT5PVUlbMl0pOworCQkJCQluZXRkZXZfbm90aWNlKGRldiwgIlVuc3VwcG9ydGVkIG9yZ2FuaXphdGlvbmFsbHkgdW5pcXVlIGlkZW50aWZpZXIgMHglMDJYLSUwMlgtJTAyWFxuIiwKKwkJCQkJCSAgICAgIGhkci0+T1VJWzBdLAorCQkJCQkJICAgICAgaGRyLT5PVUlbMV0sCisJCQkJCQkgICAgICBoZHItPk9VSVsyXSk7CiAJCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTE2MywxMiArMTY5LDE0IEBACiAJCQljYXNlIEZSQURfUF9TTkFQOgogCQkJY2FzZSBGUkFEX1BfUTkzMzoKIAkJCWNhc2UgRlJBRF9QX0NMTlA6Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVW5zdXBwb3J0ZWQgTkxQSUQgMHglMDJYLlxuIiwgZGV2LT5uYW1lLCBoZHItPnBhZCk7CisJCQkJbmV0ZGV2X25vdGljZShkZXYsICJVbnN1cHBvcnRlZCBOTFBJRCAweCUwMlhcbiIsCisJCQkJCSAgICAgIGhkci0+cGFkKTsKIAkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IEludmFsaWQgcGFkIGJ5dGUgMHglMDJYLlxuIiwgZGV2LT5uYW1lLCBoZHItPnBhZCk7CisJCQkJbmV0ZGV2X25vdGljZShkZXYsICJJbnZhbGlkIHBhZCBieXRlIDB4JTAyWFxuIiwKKwkJCQkJICAgICAgaGRyLT5wYWQpOwogCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJYnJlYWs7CQkJCQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZHNjYzQuYyBiL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCmluZGV4IGFjYjllYTguLjA1OGUxNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCkBAIC04MCw2ICs4MCw4IEBACiAgKiAtIG1pc2MgY3JhcGVjdG9teS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC05OSw2ICsxMDEsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgpAQCAtNTUyLDcgKzU1NSw3IEBACiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEwKTsKIAkJcm1iKCk7CiAJfSB3aGlsZSAoKytpID4gMCk7Ci0JcHJpbnRrKEtFUk5fRVJSICIlczogJXMgdGltZW91dFxuIiwgZGV2LT5uYW1lLCBtc2cpOworCW5ldGRldl9lcnIoZGV2LCAiJXMgdGltZW91dFxuIiwgbXNnKTsKIGRvbmU6CiAJcmV0dXJuIChpID49IDApID8gaSA6IC1FQUdBSU47CiB9CkBAIC01NjgsMTggKzU3MSwxOCBAQAogCQl1MzIgc3RhdGUgPSByZWFkbChpb2FkZHIpOwogCiAJCWlmIChzdGF0ZSAmIEFyQWNrKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzIGFja1xuIiwgZGV2LT5uYW1lLCBtc2cpOworCQkJbmV0ZGV2X2RiZyhkZXYsICIlcyBhY2tcbiIsIG1zZyk7CiAJCQl3cml0ZWwoQXJBY2ssIGlvYWRkcik7CiAJCQlnb3RvIGRvbmU7CiAJCX0gZWxzZSBpZiAoc3RhdGUgJiBBcmYpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGZhaWxlZFxuIiwgZGV2LT5uYW1lLCBtc2cpOworCQkJbmV0ZGV2X2VycihkZXYsICIlcyBmYWlsZWRcbiIsIG1zZyk7CiAJCQl3cml0ZWwoQXJmLCBpb2FkZHIpOwogCQkJaSA9IC0xOwogCQkJZ290byBkb25lOwogCX0KIAkJcm1iKCk7CiAJfSB3aGlsZSAoKytpID4gMCk7Ci0JcHJpbnRrKEtFUk5fRVJSICIlczogJXMgdGltZW91dFxuIiwgZGV2LT5uYW1lLCBtc2cpOworCW5ldGRldl9lcnIoZGV2LCAiJXMgdGltZW91dFxuIiwgbXNnKTsKIGRvbmU6CiAJcmV0dXJuIGk7CiB9CkBAIC02MzUsNyArNjM4LDcgQEAKIAogCXdyaXRlbChNVEZpfFJkdCwgZHByaXYtPmJhc2VfYWRkciArIGRwcml2LT5kZXZfaWQqMHgwYyArIENIMENGRyk7CiAJaWYgKGRzY2M0X2RvX2FjdGlvbihkZXYsICJSZHQiKSA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFR4IHJlc2V0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihkZXYsICJUeCByZXNldCBmYWlsZWRcbiIpOwogfQogI2VuZGlmCiAKQEAgLTcyMSwyMiArNzI0LDIwIEBACiAKIAlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAwLCAicmVnaXN0ZXJzIik7CiAJaWYgKHJjIDwgMCkgewotCSAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgcmVzZXJ2ZSBNTUlPIHJlZ2lvbiAocmVncylcbiIsCi0JCQlEUlZfTkFNRSk7CisJCXByX2VycigiY2FuJ3QgcmVzZXJ2ZSBNTUlPIHJlZ2lvbiAocmVncylcbiIpOwogCSAgICAgICAgZ290byBlcnJfZGlzYWJsZV8wOwogCX0KIAlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAxLCAiTEJJIGludGVyZmFjZSIpOwogCWlmIChyYyA8IDApIHsKLQkgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IHJlc2VydmUgTU1JTyByZWdpb24gKGxiaSlcbiIsCi0JCQlEUlZfTkFNRSk7CisJCXByX2VycigiY2FuJ3QgcmVzZXJ2ZSBNTUlPIHJlZ2lvbiAobGJpKVxuIik7CiAJICAgICAgICBnb3RvIGVycl9mcmVlX21taW9fcmVnaW9uXzE7CiAJfQogCiAJaW9hZGRyID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDApOwogCWlmICghaW9hZGRyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCByZW1hcCBNTUlPIHJlZ2lvbiAlbGx4IEAgJWxseFxuIiwKLQkJCURSVl9OQU1FLCAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCksCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSk7CisJCXByX2VycigiY2Fubm90IHJlbWFwIE1NSU8gcmVnaW9uICVsbHggQCAlbGx4XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCkpOwogCQlyYyA9IC1FSU87CiAJCWdvdG8gZXJyX2ZyZWVfbW1pb19yZWdpb25zXzI7CiAJfQpAQCAtNzU2LDcgKzc1Nyw3IEBACiAKIAlyYyA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgZHNjYzRfaXJxLCBJUlFGX1NIQVJFRCwgRFJWX05BTUUsIHByaXYtPnJvb3QpOwogCWlmIChyYyA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IElSUSAlZCBidXN5XG4iLCBEUlZfTkFNRSwgcGRldi0+aXJxKTsKKwkJcHJfd2FybigiSVJRICVkIGJ1c3lcbiIsIHBkZXYtPmlycSk7CiAJCWdvdG8gZXJyX3JlbGVhc2VfNDsKIAl9CiAKQEAgLTkwMyw3ICs5MDQsNyBAQAogCiAJcm9vdCA9IGtjYWxsb2MoZGV2X3Blcl9jYXJkLCBzaXplb2YoKnJvb3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJvb3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgYWxsb2NhdGUgZGF0YVxuIiwgRFJWX05BTUUpOworCQlwcl9lcnIoImNhbid0IGFsbG9jYXRlIGRhdGFcbiIpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCkBAIC05MTUsNyArOTE2LDcgQEAKIAogCXBwcml2ID0ga3phbGxvYyhzaXplb2YoKnBwcml2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcHJpdikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIsIERSVl9OQU1FKTsKKwkJcHJfZXJyKCJjYW4ndCBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOwogCQlnb3RvIGVycl9mcmVlX2RldjsKIAl9CiAKQEAgLTk1MSw3ICs5NTIsNyBAQAogCiAJCXJldCA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGQpOwogCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHJlZ2lzdGVyXG4iLCBEUlZfTkFNRSk7CisJCQlwcl9lcnIoInVuYWJsZSB0byByZWdpc3RlclxuIik7CiAJCQlkc2NjNF9yZWxlYXNlX3JpbmcoZHByaXYpOwogCQkJZ290byBlcnJfdW5yZWdpc3RlcjsKIAkgICAgICAgIH0KQEAgLTEwMDQsNyArMTAwNSw3IEBACiAJaWYgKHNldHRpbmdzLT5sb29wYmFjayAmJiAoc2V0dGluZ3MtPmNsb2NrX3R5cGUgIT0gQ0xPQ0tfSU5UKSkgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHNjYzRfdG9fZGV2KGRwcml2KTsKIAotCQlwcmludGsoS0VSTl9JTkZPICIlczogbG9vcGJhY2sgcmVxdWlyZXMgY2xvY2tcbiIsIGRldi0+bmFtZSk7CisJCW5ldGRldl9pbmZvKGRldiwgImxvb3BiYWNrIHJlcXVpcmVzIGNsb2NrXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlyZXR1cm4gMDsKQEAgLTEwNzcsNyArMTA3OCw3IEBACiAJCXNjY19wYXRjaGwoMCwgUG93ZXJVcCwgZHByaXYsIGRldiwgQ0NSMCk7CiAJCXNjY19wYXRjaGwoMCwgMHgwMDA1MDAwMCwgZHByaXYsIGRldiwgQ0NSMik7CiAJCXNjY193cml0ZWwoRXZlbnRzTWFzaywgZHByaXYsIGRldiwgSU1SKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVwIGFnYWluLlxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAidXAgYWdhaW5cbiIpOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC0xMDk0LDExICsxMDk1LDExIEBACiAJICogc2l0dWF0aW9ucy4KIAkgKi8KIAlpZiAoc2NjX3JlYWRsX3N0YXIoZHByaXYsIGRldikgJiBTY2NCdXN5KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgYnVzeS4gVHJ5IGxhdGVyXG4iLCBkZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKGRldiwgImJ1c3kgLSB0cnkgbGF0ZXJcbiIpOwogCQlyZXQgPSAtRUFHQUlOOwogCQlnb3RvIGVycl9vdXQ7CiAJfSBlbHNlCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBhdmFpbGFibGUuIEdvb2RcbiIsIGRldi0+bmFtZSk7CisJCW5ldGRldl9pbmZvKGRldiwgImF2YWlsYWJsZSAtIGdvb2RcbiIpOwogCiAJc2NjX3dyaXRlbChFdmVudHNNYXNrLCBkcHJpdiwgZGV2LCBJTVIpOwogCkBAIC0xMTE2LDcgKzExMTcsNyBAQAogCSAqIHJlc2V0IGlzIG5lZWRlZC4gU3VnZ2VzdGlvbnMgYW55b25lID8KIAkgKi8KIAlpZiAoKHJldCA9IGRzY2M0X3hwcl9hY2soZHByaXYpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgdGltZW91dFxuIiwgRFJWX05BTUUsICJYUFIiKTsKKwkJcHJfZXJyKCJYUFIgdGltZW91dFxuIik7CiAJCWdvdG8gZXJyX2Rpc2FibGVfc2NjX2V2ZW50czsKIAl9CiAJCkBAIC0xMzQxLDggKzEzNDIsNyBAQAogCQkJcmV0dXJuIC1FUEVSTTsKIAogCQlpZiAoZHByaXYtPmZsYWdzICYgRmFrZVJlc2V0KSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogcGxlYXNlIHJlc2V0IHRoZSBkZXZpY2UiCi0JCQkgICAgICAgIiBiZWZvcmUgdGhpcyBjb21tYW5kXG4iLCBkZXYtPm5hbWUpOworCQkJbmV0ZGV2X2luZm8oZGV2LCAicGxlYXNlIHJlc2V0IHRoZSBkZXZpY2UgYmVmb3JlIHRoaXMgY29tbWFuZFxuIik7CiAJCQlyZXR1cm4gLUVQRVJNOwogCQl9CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmZHByaXYtPnNldHRpbmdzLCBsaW5lLCBzaXplKSkKQEAgLTE1MDUsOCArMTUwNSw3IEBACiAJd3JpdGVsKHN0YXRlLCBpb2FkZHIgKyBHU1RBUik7CiAKIAlpZiAoc3RhdGUgJiBBcmYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbHVyZSAoQXJmKS4gSGFyYXNzIHRoZSBtYWludGVuZXJcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKGRldiwgImZhaWx1cmUgKEFyZikuIEhhcmFzcyB0aGUgbWFpbnRhaW5lclxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAlzdGF0ZSAmPSB+QXJBY2s7CkBAIC0xNTE0LDcgKzE1MTMsNyBAQAogCQlpZiAoZGVidWcgPiAwKQogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDZmdJVlxuIiwgRFJWX05BTUUpOwogCQlpZiAocHJpdi0+aXFjZmdbcHJpdi0+Y2ZnX2N1cisrJUlSUV9SSU5HX1NJWkVdICYgY3B1X3RvX2xlMzIoQXJmKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGZhaWxlZFxuIiwgZGV2LT5uYW1lLCAiQ0ZHIik7CisJCQluZXRkZXZfZXJyKGRldiwgIkNGRyBmYWlsZWRcbiIpOwogCQlpZiAoIShzdGF0ZSAmPSB+Q2ZnKSkKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTE1OTUsOCArMTU5NCw4IEBACiAJCQkJKytkcHJpdi0+dHhfZGlydHk7CiAJCQl9IGVsc2UgewogCQkJCWlmIChkZWJ1ZyA+IDEpCi0JCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgVHg6IE5VTEwgc2tiICVkXG4iLAotCQkJCQkJZGV2LT5uYW1lLCBjdXIpOworCQkJCQluZXRkZXZfZXJyKGRldiwgIlR4OiBOVUxMIHNrYiAlZFxuIiwKKwkJCQkJCSAgIGN1cik7CiAJCQl9CiAJCQkvKgogCQkJICogSWYgdGhlIGRyaXZlciBlbmRzIHNlbmRpbmcgY3JhcCBvbiB0aGUgd2lyZSwgaXQKQEAgLTE2MTUsNyArMTYxNCw3IEBACiAJCSAqIFRyYW5zbWl0IERhdGEgVW5kZXJydW4KIAkJICovCiAJCWlmIChzdGF0ZSAmIFhkdSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogWERVLiBBc2sgbWFpbnRhaW5lclxuIiwgRFJWX05BTUUpOworCQkJbmV0ZGV2X2VycihkZXYsICJUeCBEYXRhIFVuZGVycnVuLiBBc2sgbWFpbnRhaW5lclxuIik7CiAJCQlkcHJpdi0+ZmxhZ3MgPSBOZWVkSURUOwogCQkJLyogVHggcmVzZXQgKi8KIAkJCXdyaXRlbChNVEZpIHwgUmR0LApAQCAtMTYyNCwxMyArMTYyMywxMyBAQAogCQkJcmV0dXJuOwogCQl9CiAJCWlmIChzdGF0ZSAmIEN0cykgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENUUyB0cmFuc2l0aW9uXG4iLCBkZXYtPm5hbWUpOworCQkJbmV0ZGV2X2luZm8oZGV2LCAiQ1RTIHRyYW5zaXRpb25cbiIpOwogCQkJaWYgKCEoc3RhdGUgJj0gfkN0cykpIC8qIERFQlVHICovCiAJCQkJZ290byB0cnk7CiAJCX0KIAkJaWYgKHN0YXRlICYgWG1yKSB7CiAJCQkvKiBGcmFtZSBuZWVkcyB0byBiZSBzZW50IGFnYWluIC0gRklYTUUgKi8KLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFhtci4gQXNrIG1haW50YWluZXJcbiIsIERSVl9OQU1FKTsKKwkJCW5ldGRldl9lcnIoZGV2LCAiVHggUmVUeC4gQXNrIG1haW50YWluZXJcbiIpOwogCQkJaWYgKCEoc3RhdGUgJj0gflhtcikpIC8qIERFQlVHICovCiAJCQkJZ290byB0cnk7CiAJCX0KQEAgLTE2NDgsNyArMTY0Nyw3IEBACiAJCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKCFpKQotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzIGJ1c3kgaW4gaXJxXG4iLCBkZXYtPm5hbWUpOworCQkJCW5ldGRldl9pbmZvKGRldiwgImJ1c3kgaW4gaXJxXG4iKTsKIAogCQkJc2NjX2FkZHIgPSBkcHJpdi0+YmFzZV9hZGRyICsgMHgwYypkcHJpdi0+ZGV2X2lkOwogCQkJLyogS2VlcCB0aGlzIG9yZGVyOiBJRFQgYmVmb3JlIElEUiAqLwpAQCAtMTY4NSw3ICsxNjg0LDcgQEAKIAkJfQogCQlpZiAoc3RhdGUgJiBDZCkgewogCQkJaWYgKGRlYnVnID4gMCkKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0QgdHJhbnNpdGlvblxuIiwgZGV2LT5uYW1lKTsKKwkJCQluZXRkZXZfaW5mbyhkZXYsICJDRCB0cmFuc2l0aW9uXG4iKTsKIAkJCWlmICghKHN0YXRlICY9IH5DZCkpIC8qIERFQlVHICovCiAJCQkJZ290byB0cnk7CiAJCX0KQEAgLTE2OTQsMTEgKzE2OTMsMTEgQEAKICNpZmRlZiBEU0NDNF9QT0xMSU5HCiAJCQl3aGlsZSAoIWRzY2M0X3R4X3BvbGwoZHByaXYsIGRldikpOwogI2VuZGlmCi0JCQlwcmludGsoS0VSTl9JTkZPICIlczogVHggSGlcbiIsIGRldi0+bmFtZSk7CisJCQluZXRkZXZfaW5mbyhkZXYsICJUeCBIaVxuIik7CiAJCQlzdGF0ZSAmPSB+SGk7CiAJCX0KIAkJaWYgKHN0YXRlICYgRXJyKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogVHggRVJSXG4iLCBkZXYtPm5hbWUpOworCQkJbmV0ZGV2X2luZm8oZGV2LCAiVHggRVJSXG4iKTsKIAkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQlzdGF0ZSAmPSB+RXJyOwogCQl9CkBAIC0xNzY4LDcgKzE3NjcsNyBAQAogCQkJZ290byB0cnk7CiAJCX0KIAkJaWYgKHN0YXRlICYgSGkgKSB7IC8qIEhJIGJpdCAqLwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ4IEhpXG4iLCBkZXYtPm5hbWUpOworCQkJbmV0ZGV2X2luZm8oZGV2LCAiUnggSGlcbiIpOwogCQkJc3RhdGUgJj0gfkhpOwogCQkJZ290byB0cnk7CiAJCX0KQEAgLTE3OTksNyArMTc5OCw3IEBACiAJCQkJZ290byB0cnk7CiAJCX0KIAkJaWYgKHN0YXRlICYgQ3RzKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogQ1RTIHRyYW5zaXRpb25cbiIsIGRldi0+bmFtZSk7CisJCQluZXRkZXZfaW5mbyhkZXYsICJDVFMgdHJhbnNpdGlvblxuIik7CiAJCQlpZiAoIShzdGF0ZSAmPSB+Q3RzKSkgLyogREVCVUcgKi8KIAkJCQlnb3RvIHRyeTsKIAkJfQpAQCAtMTg1OCwxNCArMTg1NywxMiBAQAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgUnhGRCksIHNjY19hZGRyICsgQ0gwQlJEQSk7CiAJCQl3cml0ZWwoTVRGaXxSZHJ8SWRyLCBzY2NfYWRkciArIENIMENGRyk7CiAJCQlpZiAoZHNjYzRfZG9fYWN0aW9uKGRldiwgIlJEUiIpIDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJETyByZWNvdmVyeSBmYWlsZWQoJXMpXG4iLAotCQkJCSAgICAgICBkZXYtPm5hbWUsICJSRFIiKTsKKwkJCQluZXRkZXZfZXJyKGRldiwgIlJETyByZWNvdmVyeSBmYWlsZWQoUkRSKVxuIik7CiAJCQkJZ290byByZG9fZW5kOwogCQkJfQogCQkJd3JpdGVsKE1URml8SWRyLCBzY2NfYWRkciArIENIMENGRyk7CiAJCQlpZiAoZHNjYzRfZG9fYWN0aW9uKGRldiwgIklEUiIpIDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJETyByZWNvdmVyeSBmYWlsZWQoJXMpXG4iLAotCQkJCSAgICAgICBkZXYtPm5hbWUsICJJRFIiKTsKKwkJCQluZXRkZXZfZXJyKGRldiwgIlJETyByZWNvdmVyeSBmYWlsZWQoSURSKVxuIik7CiAJCQkJZ290byByZG9fZW5kOwogCQkJfQogCQlyZG9fZW5kOgpAQCAtMTg3NCw3ICsxODcxLDcgQEAKIAkJCWdvdG8gdHJ5OwogCQl9CiAJCWlmIChzdGF0ZSAmIENkKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0QgdHJhbnNpdGlvblxuIiwgZGV2LT5uYW1lKTsKKwkJCW5ldGRldl9pbmZvKGRldiwgIkNEIHRyYW5zaXRpb25cbiIpOwogCQkJaWYgKCEoc3RhdGUgJj0gfkNkKSkgLyogREVCVUcgKi8KIAkJCQlnb3RvIHRyeTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKaW5kZXggZTA1MGJkNi4uZWJiOWYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYworKysgYi9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pZi5oPgogI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTE2NjQsMTAgKzE2NjUsOSBAQAogCSAqIGV4aXN0aW5nIGZpcm13YXJlIGV0YyBzbyB3ZSBqdXN0IHJlcG9ydCBpdCBmb3IgdGhlIG1vbWVudC4KIAkgKi8KIAlpZiAoRlNUX1JETChjYXJkLCBudW1iZXJPZlBvcnRzKSAhPSBjYXJkLT5ucG9ydHMpIHsKLQkJcHJfd2FybmluZygiUG9ydCBjb3VudCBtaXNtYXRjaCBvbiBjYXJkICVkLiAiCi0JCQkgICAiRmlybXdhcmUgdGhpbmtzICVkIHdlIHNheSAlZFxuIiwKLQkJCSAgIGNhcmQtPmNhcmRfbm8sCi0JCQkgICBGU1RfUkRMKGNhcmQsIG51bWJlck9mUG9ydHMpLCBjYXJkLT5ucG9ydHMpOworCQlwcl93YXJuKCJQb3J0IGNvdW50IG1pc21hdGNoIG9uIGNhcmQgJWQuICBGaXJtd2FyZSB0aGlua3MgJWQgd2Ugc2F5ICVkXG4iLAorCQkJY2FyZC0+Y2FyZF9ubywKKwkJCUZTVF9SREwoY2FyZCwgbnVtYmVyT2ZQb3J0cyksIGNhcmQtPm5wb3J0cyk7CiAJfQogfQogCkBAIC0yMjAzLDggKzIyMDMsMTAgQEAKIAogCWlmIChwb3J0LT5tb2RlICE9IEZTVF9SQVcpIHsKIAkJZXJyID0gaGRsY19vcGVuKGRldik7Ci0JCWlmIChlcnIpCisJCWlmIChlcnIpIHsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogCQkJcmV0dXJuIGVycjsKKwkJfQogCX0KIAogCWZzdF9vcGVucG9ydChwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZDY0NTcwLmMgYi9kcml2ZXJzL25ldC93YW4vaGQ2NDU3MC5jCmluZGV4IGEzZWEyN2MuLjMzYjY3ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9oZDY0NTcwLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzAuYwpAQCAtNTgyLDggKzU4Miw4IEBACiAJICAgICAgIHNjYV9pbihEU1JfUlgocGh5X25vZGUocG9ydCkpLCBjYXJkKSwgcG9ydC0+cnhpbiwKIAkgICAgICAgc2NhX2luKERTUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpICYgRFNSX0RFID8gIiIgOiAiaW4iKTsKIAlmb3IgKGNudCA9IDA7IGNudCA8IHBvcnRfdG9fY2FyZChwb3J0KS0+cnhfcmluZ19idWZmZXJzOyBjbnQrKykKLQkJcHJpbnRrKCIgJTAyWCIsIHJlYWRiKCYoZGVzY19hZGRyZXNzKHBvcnQsIGNudCwgMCktPnN0YXQpKSk7Ci0JcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwkJcHJfY29udCgiICUwMlgiLCByZWFkYigmKGRlc2NfYWRkcmVzcyhwb3J0LCBjbnQsIDApLT5zdGF0KSkpOworCXByX2NvbnQoIlxuIik7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiVFggcmluZzogQ0RBPSV1IEVEQT0ldSBEU1I9JTAyWCBpbj0ldSAiCiAJICAgICAgICJsYXN0PSV1ICVzYWN0aXZlIiwKQEAgLTU5Myw4ICs1OTMsOCBAQAogCSAgICAgICBzY2FfaW4oRFNSX1RYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCkgJiBEU1JfREUgPyAiIiA6ICJpbiIpOwogCiAJZm9yIChjbnQgPSAwOyBjbnQgPCBwb3J0X3RvX2NhcmQocG9ydCktPnR4X3JpbmdfYnVmZmVyczsgY250KyspCi0JCXByaW50aygiICUwMlgiLCByZWFkYigmKGRlc2NfYWRkcmVzcyhwb3J0LCBjbnQsIDEpLT5zdGF0KSkpOwotCXByaW50aygiXG4iKTsKKwkJcHJfY29udCgiICUwMlgiLCByZWFkYigmKGRlc2NfYWRkcmVzcyhwb3J0LCBjbnQsIDEpLT5zdGF0KSkpOworCXByX2NvbnQoIlxuIik7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiTVNDSTogTUQ6ICUwMnggJTAyeCAlMDJ4LCBTVDogJTAyeCAlMDJ4ICUwMnggJTAyeCwiCiAJICAgICAgICIgRlNUOiAlMDJ4IENTVDogJTAyeCAlMDJ4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzIuYyBiL2RyaXZlcnMvbmV0L3dhbi9oZDY0NTcyLmMKaW5kZXggZTMwNTI3NC4uZWZjMGRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzIuYworKysgYi9kcml2ZXJzL25ldC93YW4vaGQ2NDU3Mi5jCkBAIC01MzAsOCArNTMwLDggQEAKIAkgICAgICAgc2NhX2luKERTUl9SWChwb3J0LT5jaGFuKSwgY2FyZCksIHBvcnQtPnJ4aW4sCiAJICAgICAgIHNjYV9pbihEU1JfUlgocG9ydC0+Y2hhbiksIGNhcmQpICYgRFNSX0RFID8gIiIgOiAiaW4iKTsKIAlmb3IgKGNudCA9IDA7IGNudCA8IHBvcnQtPmNhcmQtPnJ4X3JpbmdfYnVmZmVyczsgY250KyspCi0JCXByaW50aygiICUwMlgiLCByZWFkYigmKGRlc2NfYWRkcmVzcyhwb3J0LCBjbnQsIDApLT5zdGF0KSkpOwotCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisJCXByX2NvbnQoIiAlMDJYIiwgcmVhZGIoJihkZXNjX2FkZHJlc3MocG9ydCwgY250LCAwKS0+c3RhdCkpKTsKKwlwcl9jb250KCJcbiIpOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIlRYIHJpbmc6IENEQT0ldSBFREE9JXUgRFNSPSUwMlggaW49JXUgIgogCSAgICAgICAibGFzdD0ldSAlc2FjdGl2ZSIsCkBAIC01NDEsOCArNTQxLDggQEAKIAkgICAgICAgc2NhX2luKERTUl9UWChwb3J0LT5jaGFuKSwgY2FyZCkgJiBEU1JfREUgPyAiIiA6ICJpbiIpOwogCiAJZm9yIChjbnQgPSAwOyBjbnQgPCBwb3J0LT5jYXJkLT50eF9yaW5nX2J1ZmZlcnM7IGNudCsrKQotCQlwcmludGsoIiAlMDJYIiwgcmVhZGIoJihkZXNjX2FkZHJlc3MocG9ydCwgY250LCAxKS0+c3RhdCkpKTsKLQlwcmludGsoIlxuIik7CisJCXByX2NvbnQoIiAlMDJYIiwgcmVhZGIoJihkZXNjX2FkZHJlc3MocG9ydCwgY250LCAxKS0+c3RhdCkpKTsKKwlwcl9jb250KCJcbiIpOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIk1TQ0k6IE1EOiAlMDJ4ICUwMnggJTAyeCwiCiAJICAgICAgICIgU1Q6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCwgRlNUOiAlMDJ4IENTVDogJTAyeCAlMDJ4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGMuYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjLmMKaW5kZXggNWQ0YmI2MS4uMTBjYzdkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2hkbGMuYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsYy5jCkBAIC0yMiw2ICsyMiw4IEBACiAgKiAtIHByb3RvLT5zdGFydCgpIGFuZCBzdG9wKCkgYXJlIGNhbGxlZCB3aXRoIHNwaW5fbG9ja19pcnEgaGVsZC4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KQEAgLTEzMCwxMCArMTMyLDEwIEBACiAJCWdvdG8gY2Fycmllcl9leGl0OwogCiAJaWYgKGhkbGMtPmNhcnJpZXIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENhcnJpZXIgZGV0ZWN0ZWRcbiIsIGRldi0+bmFtZSk7CisJCW5ldGRldl9pbmZvKGRldiwgIkNhcnJpZXIgZGV0ZWN0ZWRcbiIpOwogCQloZGxjX3Byb3RvX3N0YXJ0KGRldik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENhcnJpZXIgbG9zdFxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiQ2FycmllciBsb3N0XG4iKTsKIAkJaGRsY19wcm90b19zdG9wKGRldik7CiAJfQogCkBAIC0xNjUsMTAgKzE2NywxMCBAQAogCXNwaW5fbG9ja19pcnEoJmhkbGMtPnN0YXRlX2xvY2spOwogCiAJaWYgKGhkbGMtPmNhcnJpZXIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENhcnJpZXIgZGV0ZWN0ZWRcbiIsIGRldi0+bmFtZSk7CisJCW5ldGRldl9pbmZvKGRldiwgIkNhcnJpZXIgZGV0ZWN0ZWRcbiIpOwogCQloZGxjX3Byb3RvX3N0YXJ0KGRldik7CiAJfSBlbHNlCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyBjYXJyaWVyXG4iLCBkZXYtPm5hbWUpOworCQluZXRkZXZfaW5mbyhkZXYsICJObyBjYXJyaWVyXG4iKTsKIAogCWhkbGMtPm9wZW4gPSAxOwogCkBAIC0yODEsOCArMjgzLDggQEAKIAlpZiAoc2l6ZSkKIAkJaWYgKChkZXZfdG9faGRsYyhkZXYpLT5zdGF0ZSA9IGttYWxsb2Moc2l6ZSwKIAkJCQkJCSAgICAgICBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTWVtb3J5IHNxdWVlemUgb24iCi0JCQkgICAgICAgIiBoZGxjX3Byb3RvX2F0dGFjaCgpXG4iKTsKKwkJCW5ldGRldl93YXJuKGRldiwKKwkJCQkgICAgIk1lbW9yeSBzcXVlZXplIG9uIGhkbGNfcHJvdG9fYXR0YWNoKClcbiIpOwogCQkJbW9kdWxlX3B1dChwcm90by0+bW9kdWxlKTsKIAkJCXJldHVybiAtRU5PQlVGUzsKIAkJfQpAQCAtMzYzLDcgKzM2NSw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCB2ZXJzaW9uKTsKKwlwcl9pbmZvKCIlc1xuIiwgdmVyc2lvbik7CiAJaWYgKChyZXN1bHQgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmhkbGNfbm90aWZpZXIpKSAhPSAwKQogCQlyZXR1cm4gcmVzdWx0OwogCWRldl9hZGRfcGFjaygmaGRsY19wYWNrZXRfdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19jaXNjby5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYwppbmRleCBiMWU1ZTViLi4zZjIwODA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaGRsY19jaXNjby5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKQEAgLTEwMyw5ICsxMDMsNyBAQAogCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBoZGxjX2hlYWRlcikgKwogCQkJICAgIHNpemVvZihzdHJ1Y3QgY2lzY29fcGFja2V0KSk7CiAJaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIiVzOiBNZW1vcnkgc3F1ZWV6ZSBvbiBjaXNjb19rZWVwYWxpdmVfc2VuZCgpXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X3dhcm4oZGV2LCAiTWVtb3J5IHNxdWVlemUgb24gY2lzY29fa2VlcGFsaXZlX3NlbmQoKVxuIik7CiAJCXJldHVybjsKIAl9CiAJc2tiX3Jlc2VydmUoc2tiLCA0KTsKQEAgLTE4MSw4ICsxNzksOCBAQAogCQkgICAgIENJU0NPX1BBQ0tFVF9MRU4pICYmCiAJCSAgICAoc2tiLT5sZW4gIT0gc2l6ZW9mKHN0cnVjdCBoZGxjX2hlYWRlcikgKwogCQkgICAgIENJU0NPX0JJR19QQUNLRVRfTEVOKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgbGVuZ3RoIG9mIENpc2NvIGNvbnRyb2wiCi0JCQkgICAgICAgIiBwYWNrZXQgKCVkIGJ5dGVzKVxuIiwgZGV2LT5uYW1lLCBza2ItPmxlbik7CisJCQluZXRkZXZfaW5mbyhkZXYsICJJbnZhbGlkIGxlbmd0aCBvZiBDaXNjbyBjb250cm9sIHBhY2tldCAoJWQgYnl0ZXMpXG4iLAorCQkJCSAgICBza2ItPmxlbik7CiAJCQlnb3RvIHJ4X2Vycm9yOwogCQl9CiAKQEAgLTIxNyw4ICsyMTUsNyBAQAogCQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwogCiAJCWNhc2UgQ0lTQ09fQUREUl9SRVBMWToKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmV4cGVjdGVkIENpc2NvIElQIGFkZHJlc3MgIgotCQkJICAgICAgICJyZXBseVxuIiwgZGV2LT5uYW1lKTsKKwkJCW5ldGRldl9pbmZvKGRldiwgIlVuZXhwZWN0ZWQgQ2lzY28gSVAgYWRkcmVzcyByZXBseVxuIik7CiAJCQlnb3RvIHJ4X2Vycm9yOwogCiAJCWNhc2UgQ0lTQ09fS0VFUEFMSVZFX1JFUToKQEAgLTIzNSw5ICsyMzIsOCBAQAogCQkJCQltaW4gPSBzZWMgLyA2MDsgc2VjIC09IG1pbiAqIDYwOwogCQkJCQlocnMgPSBtaW4gLyA2MDsgbWluIC09IGhycyAqIDYwOwogCQkJCQlkYXlzID0gaHJzIC8gMjQ7IGhycyAtPSBkYXlzICogMjQ7Ci0JCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIHVwIChwZWVyICIKLQkJCQkJICAgICAgICJ1cHRpbWUgJXVkJXVoJXVtJXVzKVxuIiwKLQkJCQkJICAgICAgIGRldi0+bmFtZSwgZGF5cywgaHJzLCBtaW4sIHNlYyk7CisJCQkJCW5ldGRldl9pbmZvKGRldiwgIkxpbmsgdXAgKHBlZXIgdXB0aW1lICV1ZCV1aCV1bSV1cylcbiIsCisJCQkJCQkgICAgZGF5cywgaHJzLCBtaW4sIHNlYyk7CiAJCQkJCW5ldGlmX2Rvcm1hbnRfb2ZmKGRldik7CiAJCQkJCXN0LT51cCA9IDE7CiAJCQkJfQpAQCAtMjQ5LDggKzI0NSw3IEBACiAJCX0gLyogc3dpdGNoIChrZWVwYWxpdmUgdHlwZSkgKi8KIAl9IC8qIHN3aXRjaCAocHJvdG9jb2wpICovCiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJXhcbiIsIGRldi0+bmFtZSwKLQkgICAgICAgbnRvaHMoZGF0YS0+cHJvdG9jb2wpKTsKKwluZXRkZXZfaW5mbyhkZXYsICJVbnN1cHBvcnRlZCBwcm90b2NvbCAleFxuIiwgbnRvaHMoZGF0YS0+cHJvdG9jb2wpKTsKIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCXJldHVybiBORVRfUlhfRFJPUDsKIApAQCAtMjcyLDcgKzI2Nyw3IEBACiAJaWYgKHN0LT51cCAmJgogCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHN0LT5sYXN0X3BvbGwgKyBzdC0+c2V0dGluZ3MudGltZW91dCAqIEhaKSkgewogCQlzdC0+dXAgPSAwOwotCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBkb3duXG4iLCBkZXYtPm5hbWUpOworCQluZXRkZXZfaW5mbyhkZXYsICJMaW5rIGRvd25cbiIpOwogCQluZXRpZl9kb3JtYW50X29uKGRldik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19mci5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfZnIuYwppbmRleCBmYzQzM2YyLi5iMjVjOTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaGRsY19mci5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMKQEAgLTQ0NiwxNSArNDQ2LDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmcl9sb2dfZGxjaV9hY3RpdmUocHZjX2RldmljZSAqcHZjKQogewotCXByaW50ayhLRVJOX0lORk8gIiVzOiBETENJICVkIFslcyVzJXNdJXMgJXNcbiIsCi0JICAgICAgIHB2Yy0+ZnJhZC0+bmFtZSwKLQkgICAgICAgcHZjLT5kbGNpLAotCSAgICAgICBwdmMtPm1haW4gPyBwdmMtPm1haW4tPm5hbWUgOiAiIiwKLQkgICAgICAgcHZjLT5tYWluICYmIHB2Yy0+ZXRoZXIgPyAiICIgOiAiIiwKLQkgICAgICAgcHZjLT5ldGhlciA/IHB2Yy0+ZXRoZXItPm5hbWUgOiAiIiwKLQkgICAgICAgcHZjLT5zdGF0ZS5uZXcgPyAiIG5ldyIgOiAiIiwKLQkgICAgICAgIXB2Yy0+c3RhdGUuZXhpc3QgPyAiZGVsZXRlZCIgOgotCSAgICAgICBwdmMtPnN0YXRlLmFjdGl2ZSA/ICJhY3RpdmUiIDogImluYWN0aXZlIik7CisJbmV0ZGV2X2luZm8ocHZjLT5mcmFkLCAiRExDSSAlZCBbJXMlcyVzXSVzICVzXG4iLAorCQkgICAgcHZjLT5kbGNpLAorCQkgICAgcHZjLT5tYWluID8gcHZjLT5tYWluLT5uYW1lIDogIiIsCisJCSAgICBwdmMtPm1haW4gJiYgcHZjLT5ldGhlciA/ICIgIiA6ICIiLAorCQkgICAgcHZjLT5ldGhlciA/IHB2Yy0+ZXRoZXItPm5hbWUgOiAiIiwKKwkJICAgIHB2Yy0+c3RhdGUubmV3ID8gIiBuZXciIDogIiIsCisJCSAgICAhcHZjLT5zdGF0ZS5leGlzdCA/ICJkZWxldGVkIiA6CisJCSAgICBwdmMtPnN0YXRlLmFjdGl2ZSA/ICJhY3RpdmUiIDogImluYWN0aXZlIik7CiB9CiAKIApAQCAtNDgxLDE2ICs0ODAsMTQgQEAKIAlpZiAoZGNlICYmIGZ1bGxyZXApIHsKIAkJbGVuICs9IHN0YXRlKGhkbGMpLT5kY2VfcHZjX2NvdW50ICogKDIgKyBzdGF0X2xlbik7CiAJCWlmIChsZW4gPiBIRExDX01BWF9NUlUpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbWFueSBQVkNzIHdoaWxlIHNlbmRpbmcgIgotCQkJICAgICAgICJMTUkgZnVsbCByZXBvcnRcbiIsIGRldi0+bmFtZSk7CisJCQluZXRkZXZfd2FybihkZXYsICJUb28gbWFueSBQVkNzIHdoaWxlIHNlbmRpbmcgTE1JIGZ1bGwgcmVwb3J0XG4iKTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAogCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKIAlpZiAoIXNrYikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUgb24gZnJfbG1pX3NlbmQoKVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7CisJCW5ldGRldl93YXJuKGRldiwgIk1lbW9yeSBzcXVlZXplIG9uIGZyX2xtaV9zZW5kKClcbiIpOwogCQlyZXR1cm47CiAJfQogCW1lbXNldChza2ItPmRhdGEsIDAsIGxlbik7CkBAIC02MTUsOCArNjEyLDcgQEAKIAkJc3RhdGUoaGRsYyktPmxhc3RfZXJyb3JzIDw8PSAxOyAvKiBTaGlmdCB0aGUgbGlzdCAqLwogCQlpZiAoc3RhdGUoaGRsYyktPnJlcXVlc3QpIHsKIAkJCWlmIChzdGF0ZShoZGxjKS0+cmVsaWFibGUpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIExNSSBzdGF0dXMgcmVwbHkgIgotCQkJCSAgICAgICAicmVjZWl2ZWRcbiIsIGRldi0+bmFtZSk7CisJCQkJbmV0ZGV2X2luZm8oZGV2LCAiTm8gTE1JIHN0YXR1cyByZXBseSByZWNlaXZlZFxuIik7CiAJCQlzdGF0ZShoZGxjKS0+bGFzdF9lcnJvcnMgfD0gMTsKIAkJfQogCkBAIC02MjgsOCArNjI0LDcgQEAKIAl9CiAKIAlpZiAoc3RhdGUoaGRsYyktPnJlbGlhYmxlICE9IHJlbGlhYmxlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rICVzcmVsaWFibGVcbiIsIGRldi0+bmFtZSwKLQkJICAgICAgIHJlbGlhYmxlID8gIiIgOiAidW4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiTGluayAlc3JlbGlhYmxlXG4iLCByZWxpYWJsZSA/ICIiIDogInVuIik7CiAJCWZyX3NldF9saW5rX3N0YXRlKHJlbGlhYmxlLCBkZXYpOwogCX0KIApAQCAtNjY1LDMzICs2NjAsMzIgQEAKIAogCWlmIChza2ItPmxlbiA8IChsbWkgPT0gTE1JX0FOU0kgPyBMTUlfQU5TSV9MRU5HVEggOgogCQkJTE1JX0NDSVRUX0NJU0NPX0xFTkdUSCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNob3J0IExNSSBmcmFtZVxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiU2hvcnQgTE1JIGZyYW1lXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJaWYgKHNrYi0+ZGF0YVszXSAhPSAobG1pID09IExNSV9DSVNDTyA/IE5MUElEX0NJU0NPX0xNSSA6CiAJCQkgICAgIE5MUElEX0NDSVRUX0FOU0lfTE1JKSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgbm9uLUxNSSBmcmFtZSB3aXRoIExNSSBETENJXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiUmVjZWl2ZWQgbm9uLUxNSSBmcmFtZSB3aXRoIExNSSBETENJXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJaWYgKHNrYi0+ZGF0YVs0XSAhPSBMTUlfQ0FMTFJFRikgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52YWxpZCBMTUkgQ2FsbCByZWZlcmVuY2UgKDB4JTAyWClcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIHNrYi0+ZGF0YVs0XSk7CisJCW5ldGRldl9pbmZvKGRldiwgIkludmFsaWQgTE1JIENhbGwgcmVmZXJlbmNlICgweCUwMlgpXG4iLAorCQkJICAgIHNrYi0+ZGF0YVs0XSk7CiAJCXJldHVybiAxOwogCX0KIAogCWlmIChza2ItPmRhdGFbNV0gIT0gKGRjZSA/IExNSV9TVEFUVVNfRU5RVUlSWSA6IExNSV9TVEFUVVMpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnZhbGlkIExNSSBNZXNzYWdlIHR5cGUgKDB4JTAyWClcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIHNrYi0+ZGF0YVs1XSk7CisJCW5ldGRldl9pbmZvKGRldiwgIkludmFsaWQgTE1JIE1lc3NhZ2UgdHlwZSAoMHglMDJYKVxuIiwKKwkJCSAgICBza2ItPmRhdGFbNV0pOwogCQlyZXR1cm4gMTsKIAl9CiAKIAlpZiAobG1pID09IExNSV9BTlNJKSB7CiAJCWlmIChza2ItPmRhdGFbNl0gIT0gTE1JX0FOU0lfTE9DS1NISUZUKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogTm90IEFOU0kgbG9ja2luZyBzaGlmdCBpbiBMTUkiCi0JCQkgICAgICAgIiBtZXNzYWdlICgweCUwMlgpXG4iLCBkZXYtPm5hbWUsIHNrYi0+ZGF0YVs2XSk7CisJCQluZXRkZXZfaW5mbyhkZXYsICJOb3QgQU5TSSBsb2NraW5nIHNoaWZ0IGluIExNSSBtZXNzYWdlICgweCUwMlgpXG4iLAorCQkJCSAgICBza2ItPmRhdGFbNl0pOwogCQkJcmV0dXJuIDE7CiAJCX0KIAkJaSA9IDc7CkBAIC03MDAsMzQgKzY5NCwzNCBAQAogCiAJaWYgKHNrYi0+ZGF0YVtpXSAhPSAobG1pID09IExNSV9DQ0lUVCA/IExNSV9DQ0lUVF9SRVBUWVBFIDoKIAkJCSAgICAgTE1JX0FOU0lfQ0lTQ09fUkVQVFlQRSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vdCBhbiBMTUkgUmVwb3J0IHR5cGUgSUUgKDB4JTAyWClcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIHNrYi0+ZGF0YVtpXSk7CisJCW5ldGRldl9pbmZvKGRldiwgIk5vdCBhbiBMTUkgUmVwb3J0IHR5cGUgSUUgKDB4JTAyWClcbiIsCisJCQkgICAgc2tiLT5kYXRhW2ldKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJaWYgKHNrYi0+ZGF0YVsrK2ldICE9IExNSV9SRVBUX0xFTikgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52YWxpZCBMTUkgUmVwb3J0IHR5cGUgSUUgbGVuZ3RoIgotCQkgICAgICAgIiAoJXUpXG4iLCBkZXYtPm5hbWUsIHNrYi0+ZGF0YVtpXSk7CisJCW5ldGRldl9pbmZvKGRldiwgIkludmFsaWQgTE1JIFJlcG9ydCB0eXBlIElFIGxlbmd0aCAoJXUpXG4iLAorCQkJICAgIHNrYi0+ZGF0YVtpXSk7CiAJCXJldHVybiAxOwogCX0KIAogCXJlcHR5cGUgPSBza2ItPmRhdGFbKytpXTsKIAlpZiAocmVwdHlwZSAhPSBMTUlfSU5URUdSSVRZICYmIHJlcHR5cGUgIT0gTE1JX0ZVTExSRVApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuc3VwcG9ydGVkIExNSSBSZXBvcnQgdHlwZSAoMHglMDJYKVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgcmVwdHlwZSk7CisJCW5ldGRldl9pbmZvKGRldiwgIlVuc3VwcG9ydGVkIExNSSBSZXBvcnQgdHlwZSAoMHglMDJYKVxuIiwKKwkJCSAgICByZXB0eXBlKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJaWYgKHNrYi0+ZGF0YVsrK2ldICE9IChsbWkgPT0gTE1JX0NDSVRUID8gTE1JX0NDSVRUX0FMSVZFIDoKIAkJCSAgICAgICBMTUlfQU5TSV9DSVNDT19BTElWRSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vdCBhbiBMTUkgTGluayBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uIgotCQkgICAgICAgIiBJRSAoMHglMDJYKVxuIiwgZGV2LT5uYW1lLCBza2ItPmRhdGFbaV0pOworCQluZXRkZXZfaW5mbyhkZXYsICJOb3QgYW4gTE1JIExpbmsgaW50ZWdyaXR5IHZlcmlmaWNhdGlvbiBJRSAoMHglMDJYKVxuIiwKKwkJCSAgICBza2ItPmRhdGFbaV0pOwogCQlyZXR1cm4gMTsKIAl9CiAKIAlpZiAoc2tiLT5kYXRhWysraV0gIT0gTE1JX0lOVEVHX0xFTikgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52YWxpZCBMTUkgTGluayBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uIgotCQkgICAgICAgIiBJRSBsZW5ndGggKCV1KVxuIiwgZGV2LT5uYW1lLCBza2ItPmRhdGFbaV0pOworCQluZXRkZXZfaW5mbyhkZXYsICJJbnZhbGlkIExNSSBMaW5rIGludGVncml0eSB2ZXJpZmljYXRpb24gSUUgbGVuZ3RoICgldSlcbiIsCisJCQkgICAgc2tiLT5kYXRhW2ldKTsKIAkJcmV0dXJuIDE7CiAJfQogCWkrKzsKQEAgLTgwMSwxNCArNzk1LDE0IEBACiAKIAkJaWYgKHNrYi0+ZGF0YVtpXSAhPSAobG1pID09IExNSV9DQ0lUVCA/IExNSV9DQ0lUVF9QVkNTVEFUIDoKIAkJCQkgICAgICAgTE1JX0FOU0lfQ0lTQ09fUFZDU1RBVCkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBOb3QgYW4gTE1JIFBWQyBzdGF0dXMgSUUiCi0JCQkgICAgICAgIiAoMHglMDJYKVxuIiwgZGV2LT5uYW1lLCBza2ItPmRhdGFbaV0pOworCQkJbmV0ZGV2X2luZm8oZGV2LCAiTm90IGFuIExNSSBQVkMgc3RhdHVzIElFICgweCUwMlgpXG4iLAorCQkJCSAgICBza2ItPmRhdGFbaV0pOwogCQkJcmV0dXJuIDE7CiAJCX0KIAogCQlpZiAoc2tiLT5kYXRhWysraV0gIT0gc3RhdF9sZW4pIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnZhbGlkIExNSSBQVkMgc3RhdHVzIElFIGxlbmd0aCIKLQkJCSAgICAgICAiICgldSlcbiIsIGRldi0+bmFtZSwgc2tiLT5kYXRhW2ldKTsKKwkJCW5ldGRldl9pbmZvKGRldiwgIkludmFsaWQgTE1JIFBWQyBzdGF0dXMgSUUgbGVuZ3RoICgldSlcbiIsCisJCQkJICAgIHNrYi0+ZGF0YVtpXSk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlpKys7CkBAIC04MjksOSArODIzLDcgQEAKIAkJcHZjID0gYWRkX3B2YyhkZXYsIGRsY2kpOwogCiAJCWlmICghcHZjICYmICFub19yYW0pIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiJXM6IE1lbW9yeSBzcXVlZXplIG9uIGZyX2xtaV9yZWN2KClcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCW5ldGRldl93YXJuKGRldiwgIk1lbW9yeSBzcXVlZXplIG9uIGZyX2xtaV9yZWN2KClcbiIpOwogCQkJbm9fcmFtID0gMTsKIAkJfQogCkBAIC05MDIsOCArODk0LDggQEAKIAlwdmMgPSBmaW5kX3B2YyhoZGxjLCBkbGNpKTsKIAlpZiAoIXB2YykgewogI2lmZGVmIERFQlVHX1BLVAotCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gUFZDIGZvciByZWNlaXZlZCBmcmFtZSdzIERMQ0kgJWRcbiIsCi0JCSAgICAgICBmcmFkLT5uYW1lLCBkbGNpKTsKKwkJbmV0ZGV2X2luZm8oZnJhZCwgIk5vIFBWQyBmb3IgcmVjZWl2ZWQgZnJhbWUncyBETENJICVkXG4iLAorCQkJICAgIGRsY2kpOwogI2VuZGlmCiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCXJldHVybiBORVRfUlhfRFJPUDsKQEAgLTk2MiwxNCArOTU0LDE0IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuc3VwcG9ydGVkIHByb3RvY29sLCBPVUk9JXggIgotCQkJICAgICAgICJQSUQ9JXhcbiIsIGZyYWQtPm5hbWUsIG91aSwgcGlkKTsKKwkJCW5ldGRldl9pbmZvKGZyYWQsICJVbnN1cHBvcnRlZCBwcm90b2NvbCwgT1VJPSV4IFBJRD0leFxuIiwKKwkJCQkgICAgb3VpLCBwaWQpOwogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCXJldHVybiBORVRfUlhfRFJPUDsKIAkJfQogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnN1cHBvcnRlZCBwcm90b2NvbCwgTkxQSUQ9JXggIgotCQkgICAgICAgImxlbmd0aCA9ICVpXG4iLCBmcmFkLT5uYW1lLCBkYXRhWzNdLCBza2ItPmxlbik7CisJCW5ldGRldl9pbmZvKGZyYWQsICJVbnN1cHBvcnRlZCBwcm90b2NvbCwgTkxQSUQ9JXggbGVuZ3RoPSVpXG4iLAorCQkJICAgIGRhdGFbM10sIHNrYi0+bGVuKTsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCX0KQEAgLTEwNzMsOCArMTA2NSw3IEBACiAJaW50IHVzZWQ7CiAKIAlpZiAoKHB2YyA9IGFkZF9wdmMoZnJhZCwgZGxjaSkpID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplIG9uIGZyX2FkZF9wdmMoKVxuIiwKLQkJICAgICAgIGZyYWQtPm5hbWUpOworCQluZXRkZXZfd2FybihmcmFkLCAiTWVtb3J5IHNxdWVlemUgb24gZnJfYWRkX3B2YygpXG4iKTsKIAkJcmV0dXJuIC1FTk9CVUZTOwogCX0KIApAQCAtMTA4OSw4ICsxMDgwLDcgQEAKIAkJZGV2ID0gYWxsb2NfbmV0ZGV2KDAsICJwdmMlZCIsIHB2Y19zZXR1cCk7CiAKIAlpZiAoIWRldikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUgb24gZnJfcHZjKClcbiIsCi0JCSAgICAgICBmcmFkLT5uYW1lKTsKKwkJbmV0ZGV2X3dhcm4oZnJhZCwgIk1lbW9yeSBzcXVlZXplIG9uIGZyX3B2YygpXG4iKTsKIAkJZGVsZXRlX3VudXNlZF9wdmNzKGhkbGMpOwogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfcHBwLmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYwppbmRleCA5NDFmMDUzLi4wNTVhOTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYwpAQCAtMjIzLDggKzIyMyw3IEBACiAJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGhkbGNfaGVhZGVyKSArCiAJCQkgICAgc2l6ZW9mKHN0cnVjdCBjcF9oZWFkZXIpICsgbWFnaWNfbGVuICsgbGVuKTsKIAlpZiAoIXNrYikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogb3V0IG9mIG1lbW9yeSBpbiBwcHBfdHhfY3AoKVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7CisJCW5ldGRldl93YXJuKGRldiwgIm91dCBvZiBtZW1vcnkgaW4gcHBwX3R4X2NwKClcbiIpOwogCQlyZXR1cm47CiAJfQogCXNrYl9yZXNlcnZlKHNrYiwgc2l6ZW9mKHN0cnVjdCBoZGxjX2hlYWRlcikpOwpAQCAtMzQ1LDcgKzM0NCw3IEBACiAJCXBwcF90eF9jcChkZXYsIHBpZCwgQ1BfQ09ERV9SRUosICsrcHBwLT5zZXEsIGxlbiwgZGF0YSk7CiAKIAlpZiAob2xkX3N0YXRlICE9IE9QRU5FRCAmJiBwcm90by0+c3RhdGUgPT0gT1BFTkVEKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyB1cFxuIiwgZGV2LT5uYW1lLCBwcm90b19uYW1lKHBpZCkpOworCQluZXRkZXZfaW5mbyhkZXYsICIlcyB1cFxuIiwgcHJvdG9fbmFtZShwaWQpKTsKIAkJaWYgKHBpZCA9PSBQSURfTENQKSB7CiAJCQluZXRpZl9kb3JtYW50X29mZihkZXYpOwogCQkJcHBwX2NwX2V2ZW50KGRldiwgUElEX0lQQ1AsIFNUQVJULCAwLCAwLCAwLCBOVUxMKTsKQEAgLTM1Niw3ICszNTUsNyBAQAogCQl9CiAJfQogCWlmIChvbGRfc3RhdGUgPT0gT1BFTkVEICYmIHByb3RvLT5zdGF0ZSAhPSBPUEVORUQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGRvd25cbiIsIGRldi0+bmFtZSwgcHJvdG9fbmFtZShwaWQpKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiJXMgZG93blxuIiwgcHJvdG9fbmFtZShwaWQpKTsKIAkJaWYgKHBpZCA9PSBQSURfTENQKSB7CiAJCQluZXRpZl9kb3JtYW50X29uKGRldik7CiAJCQlwcHBfY3BfZXZlbnQoZGV2LCBQSURfSVBDUCwgU1RPUCwgMCwgMCwgMCwgTlVMTCk7CkBAIC01ODUsNyArNTg0LDcgQEAKIAkJCWJyZWFrOwogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcHAtPmxhc3RfcG9uZyArCiAJCQkgICAgICAgcHBwLT5rZWVwYWxpdmVfdGltZW91dCAqIEhaKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgZG93blxuIiwgcHJvdG8tPmRldi0+bmFtZSk7CisJCQluZXRkZXZfaW5mbyhwcm90by0+ZGV2LCAiTGluayBkb3duXG4iKTsKIAkJCXBwcF9jcF9ldmVudChwcm90by0+ZGV2LCBQSURfTENQLCBTVE9QLCAwLCAwLCAwLCBOVUxMKTsKIAkJCXBwcF9jcF9ldmVudChwcm90by0+ZGV2LCBQSURfTENQLCBTVEFSVCwgMCwgMCwgMCwgTlVMTCk7CiAJCX0gZWxzZSB7CS8qIHNlbmQga2VlcC1hbGl2ZSBwYWNrZXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3gyNS5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfeDI1LmMKaW5kZXggNzA1MjdlNS4uNTZhZWIwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfeDI1LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfeDI1LmMKQEAgLTM0LDcgKzM0LDcgQEAKIAl1bnNpZ25lZCBjaGFyICpwdHI7CiAKIAlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoMSkpID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogb3V0IG9mIG1lbW9yeVxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihkZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTA2LDkgKzEwNiw4IEBACiAJCQkJLyogU2VuZCBjb25uZWN0IGNvbmZpcm0uIG1zZyB0byBsZXZlbCAzICovCiAJCQkJeDI1X2Nvbm5lY3RlZChkZXYsIDApOwogCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IExBUEIgY29ubmVjdCByZXF1ZXN0ICIKLQkJCQkgICAgICAgImZhaWxlZCwgZXJyb3IgY29kZSA9ICVpXG4iLAotCQkJCSAgICAgICBkZXYtPm5hbWUsIHJlc3VsdCk7CisJCQkJbmV0ZGV2X2VycihkZXYsICJMQVBCIGNvbm5lY3QgcmVxdWVzdCBmYWlsZWQsIGVycm9yIGNvZGUgPSAlaVxuIiwKKwkJCQkJICAgcmVzdWx0KTsKIAkJfQogCQlicmVhazsKIApAQCAtMTE4LDkgKzExNyw4IEBACiAJCQkJLyogU2VuZCBkaXNjb25uZWN0IGNvbmZpcm0uIG1zZyB0byBsZXZlbCAzICovCiAJCQkJeDI1X2Rpc2Nvbm5lY3RlZChkZXYsIDApOwogCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IExBUEIgZGlzY29ubmVjdCByZXF1ZXN0ICIKLQkJCQkgICAgICAgImZhaWxlZCwgZXJyb3IgY29kZSA9ICVpXG4iLAotCQkJCSAgICAgICBkZXYtPm5hbWUsIHJlc3VsdCk7CisJCQkJbmV0ZGV2X2VycihkZXYsICJMQVBCIGRpc2Nvbm5lY3QgcmVxdWVzdCBmYWlsZWQsIGVycm9yIGNvZGUgPSAlaVxuIiwKKwkJCQkJICAgcmVzdWx0KTsKIAkJfQogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hvc3Rlc3Nfc3YxMS5jIGIvZHJpdmVycy9uZXQvd2FuL2hvc3Rlc3Nfc3YxMS5jCmluZGV4IGU4MTc1ODMuLjNkODBlNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9ob3N0ZXNzX3N2MTEuYworKysgYi9kcml2ZXJzL25ldC93YW4vaG9zdGVzc19zdjExLmMKQEAgLTIwLDYgKzIwLDggQEAKICAqCUdlbmVyaWMgSERMQyBwb3J0IENvcHlyaWdodCAoQykgMjAwOCBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC0xOTIsOCArMTk0LDcgQEAKIAkgKi8KIAogCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCA4LCAiQ29tdHJvbCBTVjExIikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaG9zdGVzczogSS9PIDB4JVggYWxyZWFkeSBpbiB1c2UuXG4iLAotCQkgICAgICAgaW9iYXNlKTsKKwkJcHJfd2FybigiSS9PIDB4JVggYWxyZWFkeSBpbiB1c2VcbiIsIGlvYmFzZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMjIxLDcgKzIyMiw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEoaXJxLCB6ODUzMF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCiAJCQkiSG9zdGVzcyBTVjExIiwgc3YpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJob3N0ZXNzOiBJUlEgJWQgYWxyZWFkeSBpbiB1c2UuXG4iLCBpcnEpOworCQlwcl93YXJuKCJJUlEgJWQgYWxyZWFkeSBpbiB1c2VcbiIsIGlycSk7CiAJCWdvdG8gZXJyX2lycTsKIAl9CiAKQEAgLTI1NSw3ICsyNTYsNyBAQAogCSAqLwogCiAJaWYgKHo4NTMwX2luaXQoc3YpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiWjg1MzAgc2VyaWVzIGRldmljZSBub3QgZm91bmQuXG4iKTsKKwkJcHJfZXJyKCJaODUzMCBzZXJpZXMgZGV2aWNlIG5vdCBmb3VuZFxuIik7CiAJCWVuYWJsZV9pcnEoaXJxKTsKIAkJZ290byBmcmVlX2RtYTsKIAl9CkBAIC0yODIsNyArMjgzLDcgQEAKIAluZXRkZXYtPmlycSA9IGlycTsKIAogCWlmIChyZWdpc3Rlcl9oZGxjX2RldmljZShuZXRkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaG9zdGVzczogdW5hYmxlIHRvIHJlZ2lzdGVyIEhETEMgZGV2aWNlLlxuIik7CisJCXByX2VycigidW5hYmxlIHRvIHJlZ2lzdGVyIEhETEMgZGV2aWNlXG4iKTsKIAkJZnJlZV9uZXRkZXYobmV0ZGV2KTsKIAkJZ290byBmcmVlX2RtYTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaXhwNHh4X2hzcy5jIGIvZHJpdmVycy9uZXQvd2FuL2l4cDR4eF9oc3MuYwppbmRleCBmMWUxNjQzLi5hYWFjYTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaXhwNHh4X2hzcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9peHA0eHhfaHNzLmMKQEAgLTgsNiArOCw4IEBACiAgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KQEAgLTM1OCw5ICszNjAsOCBAQAogewogCXUzMiAqdmFsID0gKHUzMiopbXNnOwogCWlmIChucGVfc2VuZF9tZXNzYWdlKHBvcnQtPm5wZSwgbXNnLCB3aGF0KSkgewotCQlwcmludGsoS0VSTl9DUklUICJIU1MtJWk6IHVuYWJsZSB0byBzZW5kIGNvbW1hbmQgWyUwOFg6JTA4WF0iCi0JCSAgICAgICAiIHRvICVzXG4iLCBwb3J0LT5pZCwgdmFsWzBdLCB2YWxbMV0sCi0JCSAgICAgICBucGVfbmFtZShwb3J0LT5ucGUpKTsKKwkJcHJfY3JpdCgiSFNTLSVpOiB1bmFibGUgdG8gc2VuZCBjb21tYW5kIFslMDhYOiUwOFhdIHRvICVzXG4iLAorCQkJcG9ydC0+aWQsIHZhbFswXSwgdmFsWzFdLCBucGVfbmFtZShwb3J0LT5ucGUpKTsKIAkJQlVHKCk7CiAJfQogfQpAQCAtNDQ3LDggKzQ0OCw3IEBACiAJaWYgKG5wZV9yZWN2X21lc3NhZ2UocG9ydC0+bnBlLCAmbXNnLCAiSFNTX0xPQURfQ09ORklHIikgfHwKIAkgICAgLyogSFNTX0xPQURfQ09ORklHIGZvciBwb3J0ICMxIHJldHVybnMgcG9ydF9pZCA9ICM0ICovCiAJICAgIG1zZy5jbWQgIT0gUE9SVF9DT05GSUdfTE9BRCB8fCBtc2cuZGF0YTMyKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgIkhTUy0laTogSFNTX0xPQURfQ09ORklHIGZhaWxlZFxuIiwKLQkJICAgICAgIHBvcnQtPmlkKTsKKwkJcHJfY3JpdCgiSFNTLSVpOiBIU1NfTE9BRF9DT05GSUcgZmFpbGVkXG4iLCBwb3J0LT5pZCk7CiAJCUJVRygpOwogCX0KIApAQCAtNDc3LDggKzQ3Nyw3IEBACiAJbXNnLmhzc19wb3J0ID0gcG9ydC0+aWQ7CiAJaHNzX25wZV9zZW5kKHBvcnQsICZtc2csICJQT1JUX0VSUk9SX1JFQUQiKTsKIAlpZiAobnBlX3JlY3ZfbWVzc2FnZShwb3J0LT5ucGUsICZtc2csICJQT1JUX0VSUk9SX1JFQUQiKSkgewotCQlwcmludGsoS0VSTl9DUklUICJIU1MtJWk6IHVuYWJsZSB0byByZWFkIEhTUyBzdGF0dXNcbiIsCi0JCSAgICAgICBwb3J0LT5pZCk7CisJCXByX2NyaXQoIkhTUy0laTogdW5hYmxlIHRvIHJlYWQgSFNTIHN0YXR1c1xuIiwgcG9ydC0+aWQpOwogCQlCVUcoKTsKIAl9CiAKQEAgLTczNiw5ICs3MzUsOCBAQAogCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgkvKiBGSVhNRSAtIHJlbW92ZSBwcmludGsgKi8KLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGhzc19oZGxjX3BvbGw6IHN0YXR1cyAweCUwMlgiCi0JCQkgICAgICAgIiBlcnJvcnMgJXVcbiIsIGRldi0+bmFtZSwgZGVzYy0+c3RhdHVzLAotCQkJICAgICAgIGRlc2MtPmVycm9yX2NvdW50KTsKKwkJCW5ldGRldl9lcnIoZGV2LCAiaHNzX2hkbGNfcG9sbDogc3RhdHVzIDB4JTAyWCBlcnJvcnMgJXVcbiIsCisJCQkJICAgZGVzYy0+c3RhdHVzLCBkZXNjLT5lcnJvcl9jb3VudCk7CiAJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQl9CiAKQEAgLTExMjcsOCArMTEyNSw4IEBACiAJCWJ1ZmZzLS07CiAKIAlpZiAoYnVmZnMpCi0JCXByaW50ayhLRVJOX0NSSVQgIiVzOiB1bmFibGUgdG8gZHJhaW4gUlggcXVldWUsICVpIGJ1ZmZlcihzKSIKLQkJICAgICAgICIgbGVmdCBpbiBOUEVcbiIsIGRldi0+bmFtZSwgYnVmZnMpOworCQluZXRkZXZfY3JpdChkZXYsICJ1bmFibGUgdG8gZHJhaW4gUlggcXVldWUsICVpIGJ1ZmZlcihzKSBsZWZ0IGluIE5QRVxuIiwKKwkJCSAgICBidWZmcyk7CiAKIAlidWZmcyA9IFRYX0RFU0NTOwogCXdoaWxlIChxdWV1ZV9nZXRfZGVzYyhxdWV1ZV9pZHNbcG9ydC0+aWRdLnR4LCBwb3J0LCAxKSA+PSAwKQpAQCAtMTE0Myw4ICsxMTQxLDggQEAKIAl9IHdoaWxlICgrK2kgPCBNQVhfQ0xPU0VfV0FJVCk7CiAKIAlpZiAoYnVmZnMpCi0JCXByaW50ayhLRVJOX0NSSVQgIiVzOiB1bmFibGUgdG8gZHJhaW4gVFggcXVldWUsICVpIGJ1ZmZlcihzKSAiCi0JCSAgICAgICAibGVmdCBpbiBOUEVcbiIsIGRldi0+bmFtZSwgYnVmZnMpOworCQluZXRkZXZfY3JpdChkZXYsICJ1bmFibGUgdG8gZHJhaW4gVFggcXVldWUsICVpIGJ1ZmZlcihzKSBsZWZ0IGluIE5QRVxuIiwKKwkJCSAgICBidWZmcyk7CiAjaWYgREVCVUdfQ0xPU0UKIAlpZiAoIWJ1ZmZzKQogCQlwcmludGsoS0VSTl9ERUJVRyAiRHJhaW5pbmcgVFggcXVldWVzIHRvb2sgJWkgY3ljbGVzXG4iLCBpKTsKQEAgLTEzNjQsNyArMTM2Miw3IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwb3J0KTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBIU1MtJWlcbiIsIGRldi0+bmFtZSwgcG9ydC0+aWQpOworCW5ldGRldl9pbmZvKGRldiwgIkhTUy0laVxuIiwgcG9ydC0+aWQpOwogCXJldHVybiAwOwogCiBlcnJfZnJlZV9uZXRkZXY6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbGFwYmV0aGVyLmMgYi9kcml2ZXJzL25ldC93YW4vbGFwYmV0aGVyLmMKaW5kZXggZWVjNDYzZi4uYTgxNzA4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2xhcGJldGhlci5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sYXBiZXRoZXIuYwpAQCAtMjAsNiArMjAsOCBAQAogICoJMjAwMC0xMS0xNAlIZW5uZXIgRWlzZW4JZGV2X2hvbGQvcHV0LCBORVRERVZfR09JTkdfRE9XTiBzdXBwb3J0CiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgpAQCAtMTY1LDEzICsxNjcsMTEgQEAKIAkJYnJlYWs7CiAJY2FzZSBYMjVfSUZBQ0VfQ09OTkVDVDoKIAkJaWYgKChlcnIgPSBsYXBiX2Nvbm5lY3RfcmVxdWVzdChkZXYpKSAhPSBMQVBCX09LKQotCQkJcHJpbnRrKEtFUk5fRVJSICJsYXBiZXRoOiBsYXBiX2Nvbm5lY3RfcmVxdWVzdCAiCi0JCQkgICAgICAgImVycm9yOiAlZFxuIiwgZXJyKTsKKwkJCXByX2VycigibGFwYl9jb25uZWN0X3JlcXVlc3QgZXJyb3I6ICVkXG4iLCBlcnIpOwogCQlnb3RvIGRyb3A7CiAJY2FzZSBYMjVfSUZBQ0VfRElTQ09OTkVDVDoKIAkJaWYgKChlcnIgPSBsYXBiX2Rpc2Nvbm5lY3RfcmVxdWVzdChkZXYpKSAhPSBMQVBCX09LKQotCQkJcHJpbnRrKEtFUk5fRVJSICJsYXBiZXRoOiBsYXBiX2Rpc2Nvbm5lY3RfcmVxdWVzdCAiCi0JCQkgICAgICAgImVycjogJWRcbiIsIGVycik7CisJCQlwcl9lcnIoImxhcGJfZGlzY29ubmVjdF9yZXF1ZXN0IGVycjogJWRcbiIsIGVycik7CiAJCS8qIEZhbGwgdGhydSAqLwogCWRlZmF1bHQ6CiAJCWdvdG8gZHJvcDsKQEAgLTE4MCw3ICsxODAsNyBAQAogCXNrYl9wdWxsKHNrYiwgMSk7CiAKIAlpZiAoKGVyciA9IGxhcGJfZGF0YV9yZXF1ZXN0KGRldiwgc2tiKSkgIT0gTEFQQl9PSykgewotCQlwcmludGsoS0VSTl9FUlIgImxhcGJldGg6IGxhcGJfZGF0YV9yZXF1ZXN0IGVycm9yIC0gJWRcbiIsIGVycik7CisJCXByX2VycigibGFwYl9kYXRhX3JlcXVlc3QgZXJyb3IgLSAlZFxuIiwgZXJyKTsKIAkJZ290byBkcm9wOwogCX0KIG91dDoKQEAgLTIyMCw3ICsyMjAsNyBAQAogCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKDEpOwogCiAJaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJsYXBiZXRoOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcHJfZXJyKCJvdXQgb2YgbWVtb3J5XG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjM3LDcgKzIzNyw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoMSk7CiAKIAlpZiAoIXNrYikgewotCQlwcmludGsoS0VSTl9FUlIgImxhcGJldGg6IG91dCBvZiBtZW1vcnlcbiIpOworCQlwcl9lcnIoIm91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNzcsNyArMjc3LDcgQEAKIAlpbnQgZXJyOwogCiAJaWYgKChlcnIgPSBsYXBiX3JlZ2lzdGVyKGRldiwgJmxhcGJldGhfY2FsbGJhY2tzKSkgIT0gTEFQQl9PSykgewotCQlwcmludGsoS0VSTl9FUlIgImxhcGJldGg6IGxhcGJfcmVnaXN0ZXIgZXJyb3IgLSAlZFxuIiwgZXJyKTsKKwkJcHJfZXJyKCJsYXBiX3JlZ2lzdGVyIGVycm9yOiAlZFxuIiwgZXJyKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yOTIsNyArMjkyLDcgQEAKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKIAlpZiAoKGVyciA9IGxhcGJfdW5yZWdpc3RlcihkZXYpKSAhPSBMQVBCX09LKQotCQlwcmludGsoS0VSTl9FUlIgImxhcGJldGg6IGxhcGJfdW5yZWdpc3RlciBlcnJvciAtICVkXG4iLCBlcnIpOworCQlwcl9lcnIoImxhcGJfdW5yZWdpc3RlciBlcnJvcjogJWRcbiIsIGVycik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Zhci5oIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfdmFyLmgKaW5kZXggMDFhZDQ1Mi4uYTFkMjAyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfdmFyLmgKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfdmFyLmgKQEAgLTM4MCw3ICszODAsNyBAQAogLyogQ1NSNiBzZXR0aW5ncyAqLwogI2RlZmluZSBPUEVSQVRJT05fTU9ERSAgMHgwMDAwMDIwMCAvKiBGdWxsIER1cGxleCAgICAgICovCiAjZGVmaW5lIFBST01JU0NfTU9ERSAgICAweDAwMDAwMDQwIC8qIFByb21pc2N1b3VzIE1vZGUgKi8KLSNkZWZpbmUgUkVDSUVWRV9BTEwgICAgIDB4NDAwMDAwMDAgLyogUmVjZWl2ZSBBbGwgICAgICAqLworI2RlZmluZSBSRUNFSVZFX0FMTCAgICAgMHg0MDAwMDAwMCAvKiBSZWNlaXZlIEFsbCAgICAgICovCiAjZGVmaW5lIFBBU1NfQkFEX0ZSQU1FUyAweDAwMDAwMDA4IC8qIFBhc3MgQmFkIEZyYW1lcyAgKi8KIAogLyogRGVjIGNvbnRyb2wgcmVnaXN0ZXJzICBDU1I2IGFzIHdlbGwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9uMi5jIGIvZHJpdmVycy9uZXQvd2FuL24yLmMKaW5kZXggMTdkNDA4Zi4uNTEyOWFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL24yLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL24yLmMKQEAgLTE2LDYgKzE2LDggQEAKICAqICAgIFNETCBJbmMuIFBQUC9IRExDL0NJU0NPIGRyaXZlcgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KQEAgLTM0MSw1NyArMzQzLDU3IEBACiAJaW50IGk7CiAKIAlpZiAoaW8gPCAweDIwMCB8fCBpbyA+IDB4M0ZGIHx8IChpbyAlIE4yX0lPUE9SVFMpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJuMjogaW52YWxpZCBJL08gcG9ydCB2YWx1ZVxuIik7CisJCXByX2VycigiaW52YWxpZCBJL08gcG9ydCB2YWx1ZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmIChpcnEgPCAzIHx8IGlycSA+IDE1IHx8IGlycSA9PSA2KSAvKiBGSVhNRSAqLyB7Ci0JCXByaW50ayhLRVJOX0VSUiAibjI6IGludmFsaWQgSVJRIHZhbHVlXG4iKTsKKwkJcHJfZXJyKCJpbnZhbGlkIElSUSB2YWx1ZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmICh3aW5iYXNlIDwgMHhBMDAwMCB8fCB3aW5iYXNlID4gMHhGRkZGRiB8fCAod2luYmFzZSAmIDB4RkZGKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibjI6IGludmFsaWQgUkFNIHZhbHVlXG4iKTsKKwkJcHJfZXJyKCJpbnZhbGlkIFJBTSB2YWx1ZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWNhcmQgPSBremFsbG9jKHNpemVvZihjYXJkX3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2FyZCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibjI6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlwcl9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQogCiAJY2FyZC0+cG9ydHNbMF0uZGV2ID0gYWxsb2NfaGRsY2RldigmY2FyZC0+cG9ydHNbMF0pOwogCWNhcmQtPnBvcnRzWzFdLmRldiA9IGFsbG9jX2hkbGNkZXYoJmNhcmQtPnBvcnRzWzFdKTsKIAlpZiAoIWNhcmQtPnBvcnRzWzBdLmRldiB8fCAhY2FyZC0+cG9ydHNbMV0uZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibjI6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlwcl9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIE4yX0lPUE9SVFMsIGRldm5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibjI6IEkvTyBwb3J0IHJlZ2lvbiBpbiB1c2VcbiIpOworCQlwcl9lcnIoIkkvTyBwb3J0IHJlZ2lvbiBpbiB1c2VcbiIpOwogCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWNhcmQtPmlvID0gaW87CiAKIAlpZiAocmVxdWVzdF9pcnEoaXJxLCBzY2FfaW50ciwgMCwgZGV2bmFtZSwgY2FyZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJuMjogY291bGQgbm90IGFsbG9jYXRlIElSUVxuIik7CisJCXByX2VycigiY291bGQgbm90IGFsbG9jYXRlIElSUVxuIik7CiAJCW4yX2Rlc3Ryb3lfY2FyZChjYXJkKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJY2FyZC0+aXJxID0gaXJxOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24od2luYmFzZSwgVVNFX1dJTkRPV1NJWkUsIGRldm5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibjI6IGNvdWxkIG5vdCByZXF1ZXN0IFJBTSB3aW5kb3dcbiIpOworCQlwcl9lcnIoImNvdWxkIG5vdCByZXF1ZXN0IFJBTSB3aW5kb3dcbiIpOwogCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWNhcmQtPnBoeV93aW5iYXNlID0gd2luYmFzZTsKIAljYXJkLT53aW5iYXNlID0gaW9yZW1hcCh3aW5iYXNlLCBVU0VfV0lORE9XU0laRSk7CiAJaWYgKCFjYXJkLT53aW5iYXNlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibjI6IGlvcmVtYXAoKSBmYWlsZWRcbiIpOworCQlwcl9lcnIoImlvcmVtYXAoKSBmYWlsZWRcbiIpOwogCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTQxMyw3ICs0MTUsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAibjI6IGludmFsaWQgd2luZG93IHNpemVcbiIpOworCQlwcl9lcnIoImludmFsaWQgd2luZG93IHNpemVcbiIpOwogCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTQzMywxMiArNDM1LDEyIEBACiAJY2FyZC0+YnVmZl9vZmZzZXQgPSAodmFsaWQwICsgdmFsaWQxKSAqIHNpemVvZihwa3RfZGVzYykgKgogCQkoY2FyZC0+dHhfcmluZ19idWZmZXJzICsgY2FyZC0+cnhfcmluZ19idWZmZXJzKTsKIAotCXByaW50ayhLRVJOX0lORk8gIm4yOiBSSVNDb20vTjIgJXUgS0IgUkFNLCBJUlEldSwgIgotCSAgICAgICAidXNpbmcgJXUgVFggKyAldSBSWCBwYWNrZXRzIHJpbmdzXG4iLCBjYXJkLT5yYW1fc2l6ZSAvIDEwMjQsCi0JICAgICAgIGNhcmQtPmlycSwgY2FyZC0+dHhfcmluZ19idWZmZXJzLCBjYXJkLT5yeF9yaW5nX2J1ZmZlcnMpOworCXByX2luZm8oIlJJU0NvbS9OMiAldSBLQiBSQU0sIElSUSV1LCB1c2luZyAldSBUWCArICV1IFJYIHBhY2tldHMgcmluZ3NcbiIsCisJCWNhcmQtPnJhbV9zaXplIC8gMTAyNCwgY2FyZC0+aXJxLAorCQljYXJkLT50eF9yaW5nX2J1ZmZlcnMsIGNhcmQtPnJ4X3JpbmdfYnVmZmVycyk7CiAKIAlpZiAoY2FyZC0+dHhfcmluZ19idWZmZXJzIDwgMSkgewotCQlwcmludGsoS0VSTl9FUlIgIm4yOiBSQU0gdGVzdCBmYWlsZWRcbiIpOworCQlwcl9lcnIoIlJBTSB0ZXN0IGZhaWxlZFxuIik7CiAJCW4yX2Rlc3Ryb3lfY2FyZChjYXJkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtNDc0LDE2ICs0NzYsMTQgQEAKIAkJcG9ydC0+Y2FyZCA9IGNhcmQ7CiAKIAkJaWYgKHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm4yOiB1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyAiCi0JCQkgICAgICAgImRldmljZVxuIik7CisJCQlwcl93YXJuKCJ1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyBkZXZpY2VcbiIpOwogCQkJcG9ydC0+Y2FyZCA9IE5VTEw7CiAJCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CiAJCQlyZXR1cm4gLUVOT0JVRlM7CiAJCX0KIAkJc2NhX2luaXRfcG9ydChwb3J0KTsgLyogU2V0IHVwIFNDQSBtZW1vcnkgKi8KIAotCQlwcmludGsoS0VSTl9JTkZPICIlczogUklTQ29tL04yIG5vZGUgJWRcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIHBvcnQtPnBoeV9ub2RlKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiUklTQ29tL04yIG5vZGUgJWRcbiIsIHBvcnQtPnBoeV9ub2RlKTsKIAl9CiAKIAkqbmV3X2NhcmQgPSBjYXJkOwpAQCAtNDk4LDEyICs0OTgsMTIgQEAKIHsKIAlpZiAoaHc9PU5VTEwpIHsKICNpZmRlZiBNT0RVTEUKLQkJcHJpbnRrKEtFUk5fSU5GTyAibjI6IG5vIGNhcmQgaW5pdGlhbGl6ZWRcbiIpOworCQlwcl9pbmZvKCJubyBjYXJkIGluaXRpYWxpemVkXG4iKTsKICNlbmRpZgogCQlyZXR1cm4gLUVJTlZBTDsJLyogbm8gcGFyYW1ldGVycyBzcGVjaWZpZWQsIGFib3J0ICovCiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOworCXByX2luZm8oIiVzXG4iLCB2ZXJzaW9uKTsKIAogCWRvIHsKIAkJdW5zaWduZWQgbG9uZyBpbywgaXJxLCByYW07CkBAIC01NDEsNyArNTQxLDcgQEAKIAkJCXJldHVybiBmaXJzdF9jYXJkID8gMCA6IC1FSU5WQUw7CiAJfXdoaWxlKCpodysrID09ICc6Jyk7CiAKLQlwcmludGsoS0VSTl9FUlIgIm4yOiBpbnZhbGlkIGhhcmR3YXJlIHBhcmFtZXRlcnNcbiIpOworCXByX2VycigiaW52YWxpZCBoYXJkd2FyZSBwYXJhbWV0ZXJzXG4iKTsKIAlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRUlOVkFMOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vcGMzMDBfZHJ2LmMgYi9kcml2ZXJzL25ldC93YW4vcGMzMDBfZHJ2LmMKaW5kZXggOTYxN2QzZC4uMWVlZWRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF9kcnYuYwpAQCAtMjEyLDYgKzIxMiw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC0zMjQyLDcgKzMyNDQsNyBAQAogCXJjc2RhdGUrKzsKIAl0bXAgPSBzdHJyY2hyKHJjc2RhdGUsICcgJyk7CiAJKnRtcCA9ICdcMCc7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQ3ljbGFkZXMtUEMzMDAgZHJpdmVyICVzICVzXG4iLCByY3N2ZXJzLCByY3NkYXRlKTsKKwlwcl9pbmZvKCJDeWNsYWRlcy1QQzMwMCBkcml2ZXIgJXMgJXNcbiIsIHJjc3ZlcnMsIHJjc2RhdGUpOwogfQkJCQkvKiBzaG93X3ZlcnNpb24gKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjcGNfbmV0ZGV2X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYwppbmRleCAxYzY1ZDFjLi5kNDdkMmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vcGMzMDBfdHR5LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX3R0eS5jCkBAIC03NTUsNyArNzU1LDcgQEAKIAogCWRzcl9yeCA9IGNwY19yZWFkYihjYXJkLT5ody5zY2FiYXNlICsgRFNSX1JYKGNoKSk7CiAKLQljcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKXBjMzAwZGV2LT5jcGNfdHR5OyAKKwljcGNfdHR5ID0gcGMzMDBkZXYtPmNwY190dHk7CiAKIAl3aGlsZSAoMSkgeyAKIAkJcnhfbGVuID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMHRvby5jIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwdG9vLmMKaW5kZXggYzdhYjNiZS4uYzQ5YzFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwdG9vLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwdG9vLmMKQEAgLTE3LDYgKzE3LDggQEAKICAqIFBDMzAwL1gyMSBjYXJkcy4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0zMTgsNyArMzIwLDcgQEAKIAogCWNhcmQgPSBremFsbG9jKHNpemVvZihjYXJkX3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2FyZCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicGMzMDA6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlwcl9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCXJldHVybiAtRU5PQlVGUzsKQEAgLTMyOCw3ICszMzAsNyBAQAogCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApICE9IFBDMzAwX1BMWF9TSVpFIHx8CiAJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikgIT0gUEMzMDBfU0NBX1NJWkUgfHwKIAkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKSA8IDE2Mzg0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicGMzMDA6IGludmFsaWQgY2FyZCBFRVBST00gcGFyYW1ldGVyc1xuIik7CisJCXByX2VycigiaW52YWxpZCBjYXJkIEVFUFJPTSBwYXJhbWV0ZXJzXG4iKTsKIAkJcGMzMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTM0NSw3ICszNDcsNyBAQAogCWlmIChjYXJkLT5wbHhiYXNlID09IE5VTEwgfHwKIAkgICAgY2FyZC0+c2NhYmFzZSA9PSBOVUxMIHx8CiAJICAgIGNhcmQtPnJhbWJhc2UgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgInBjMzAwOiBpb3JlbWFwKCkgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJpb3JlbWFwKCkgZmFpbGVkXG4iKTsKIAkJcGMzMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CiAJfQogCkBAIC0zNzAsNyArMzcyLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5uX3BvcnRzOyBpKyspCiAJCWlmICghKGNhcmQtPnBvcnRzW2ldLm5ldGRldiA9IGFsbG9jX2hkbGNkZXYoJmNhcmQtPnBvcnRzW2ldKSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAicGMzMDA6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQkJcHJfZXJyKCJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKIAkJCXBjMzAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTQxMSwxNSArNDEzLDE0IEBACiAJY2FyZC0+YnVmZl9vZmZzZXQgPSBjYXJkLT5uX3BvcnRzICogc2l6ZW9mKHBrdF9kZXNjKSAqCiAJCShjYXJkLT50eF9yaW5nX2J1ZmZlcnMgKyBjYXJkLT5yeF9yaW5nX2J1ZmZlcnMpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAicGMzMDA6IFBDMzAwLyVzLCAldSBLQiBSQU0gYXQgMHgleCwgSVJRJXUsICIKLQkgICAgICAgInVzaW5nICV1IFRYICsgJXUgUlggcGFja2V0cyByaW5nc1xuIiwKLQkgICAgICAgY2FyZC0+dHlwZSA9PSBQQzMwMF9YMjEgPyAiWDIxIiA6Ci0JICAgICAgIGNhcmQtPnR5cGUgPT0gUEMzMDBfVEUgPyAiVEUiIDogIlJTViIsCi0JICAgICAgIHJhbXNpemUgLyAxMDI0LCByYW1waHlzLCBwZGV2LT5pcnEsCi0JICAgICAgIGNhcmQtPnR4X3JpbmdfYnVmZmVycywgY2FyZC0+cnhfcmluZ19idWZmZXJzKTsKKwlwcl9pbmZvKCJQQzMwMC8lcywgJXUgS0IgUkFNIGF0IDB4JXgsIElSUSV1LCB1c2luZyAldSBUWCArICV1IFJYIHBhY2tldHMgcmluZ3NcbiIsCisJCWNhcmQtPnR5cGUgPT0gUEMzMDBfWDIxID8gIlgyMSIgOgorCQljYXJkLT50eXBlID09IFBDMzAwX1RFID8gIlRFIiA6ICJSU1YiLAorCQlyYW1zaXplIC8gMTAyNCwgcmFtcGh5cywgcGRldi0+aXJxLAorCQljYXJkLT50eF9yaW5nX2J1ZmZlcnMsIGNhcmQtPnJ4X3JpbmdfYnVmZmVycyk7CiAKIAlpZiAoY2FyZC0+dHhfcmluZ19idWZmZXJzIDwgMSkgewotCQlwcmludGsoS0VSTl9FUlIgInBjMzAwOiBSQU0gdGVzdCBmYWlsZWRcbiIpOworCQlwcl9lcnIoIlJBTSB0ZXN0IGZhaWxlZFxuIik7CiAJCXBjMzAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC00MjksOCArNDMwLDcgQEAKIAogCS8qIEFsbG9jYXRlIElSUSAqLwogCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIHNjYV9pbnRyLCBJUlFGX1NIQVJFRCwgInBjMzAwIiwgY2FyZCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicGMzMDA6IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlElZC5cbiIsCi0JCSAgICAgICBwZGV2LT5pcnEpOworCQlwcl93YXJuKCJjb3VsZCBub3QgYWxsb2NhdGUgSVJRJWRcbiIsIHBkZXYtPmlycSk7CiAJCXBjMzAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTQ2NiwxNSArNDY2LDEzIEBACiAKIAkJc2NhX2luaXRfcG9ydChwb3J0KTsKIAkJaWYgKHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAicGMzMDA6IHVuYWJsZSB0byByZWdpc3RlciBoZGxjICIKLQkJCSAgICAgICAiZGV2aWNlXG4iKTsKKwkJCXByX2VycigidW5hYmxlIHRvIHJlZ2lzdGVyIGhkbGMgZGV2aWNlXG4iKTsKIAkJCXBvcnQtPmNhcmQgPSBOVUxMOwogCQkJcGMzMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CiAJCQlyZXR1cm4gLUVOT0JVRlM7CiAJCX0KIAotCQlwcmludGsoS0VSTl9JTkZPICIlczogUEMzMDAgY2hhbm5lbCAlZFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgcG9ydC0+Y2hhbik7CisJCW5ldGRldl9pbmZvKGRldiwgIlBDMzAwIGNoYW5uZWwgJWRcbiIsIHBvcnQtPmNoYW4pOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTUwNSwxMSArNTAzLDExIEBACiBzdGF0aWMgaW50IF9faW5pdCBwYzMwMF9pbml0X21vZHVsZSh2b2lkKQogewogCWlmIChwY2lfY2xvY2tfZnJlcSA8IDEwMDAwMDAgfHwgcGNpX2Nsb2NrX2ZyZXEgPiA4MDAwMDAwMCkgewotCQlwcmludGsoS0VSTl9FUlIgInBjMzAwOiBJbnZhbGlkIFBDSSBjbG9jayBmcmVxdWVuY3lcbiIpOworCQlwcl9lcnIoIkludmFsaWQgUENJIGNsb2NrIGZyZXF1ZW5jeVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAodXNlX2NyeXN0YWxfY2xvY2sgIT0gMCAmJiB1c2VfY3J5c3RhbF9jbG9jayAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicGMzMDA6IEludmFsaWQgJ3VzZV9jcnlzdGFsX2Nsb2NrJyB2YWx1ZVxuIik7CisJCXByX2VycigiSW52YWxpZCAndXNlX2NyeXN0YWxfY2xvY2snIHZhbHVlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vcGNpMjAwc3luLmMgYi9kcml2ZXJzL25ldC93YW4vcGNpMjAwc3luLmMKaW5kZXggZmQ3Mzc1OS4uMWNlMjExNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3BjaTIwMHN5bi5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9wY2kyMDBzeW4uYwpAQCAtMTQsNiArMTQsOCBAQAogICogICAgUExYIFRlY2hub2xvZ3kgSW5jLiBQQ0k5MDUyIERhdGEgQm9vawogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KQEAgLTI5Nyw3ICsyOTksNyBAQAogCiAJY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKGNhcmRfdCksIEdGUF9LRVJORUwpOwogCWlmIChjYXJkID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwY2kyMDBzeW46IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlwcl9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCXJldHVybiAtRU5PQlVGUzsKQEAgLTMwNiw3ICszMDgsNyBAQAogCWNhcmQtPnBvcnRzWzBdLm5ldGRldiA9IGFsbG9jX2hkbGNkZXYoJmNhcmQtPnBvcnRzWzBdKTsKIAljYXJkLT5wb3J0c1sxXS5uZXRkZXYgPSBhbGxvY19oZGxjZGV2KCZjYXJkLT5wb3J0c1sxXSk7CiAJaWYgKCFjYXJkLT5wb3J0c1swXS5uZXRkZXYgfHwgIWNhcmQtPnBvcnRzWzFdLm5ldGRldikgewotCQlwcmludGsoS0VSTl9FUlIgInBjaTIwMHN5bjogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXByX2VycigidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CiAJCXBjaTIwMF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzE0LDcgKzMxNiw3IEBACiAJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgIT0gUENJMjAwU1lOX1BMWF9TSVpFIHx8CiAJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikgIT0gUENJMjAwU1lOX1NDQV9TSVpFIHx8CiAJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMykgPCAxNjM4NCkgewotCQlwcmludGsoS0VSTl9FUlIgInBjaTIwMHN5bjogaW52YWxpZCBjYXJkIEVFUFJPTSBwYXJhbWV0ZXJzXG4iKTsKKwkJcHJfZXJyKCJpbnZhbGlkIGNhcmQgRUVQUk9NIHBhcmFtZXRlcnNcbiIpOwogCQlwY2kyMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTMzMSw3ICszMzMsNyBAQAogCWlmIChjYXJkLT5wbHhiYXNlID09IE5VTEwgfHwKIAkgICAgY2FyZC0+c2NhYmFzZSA9PSBOVUxMIHx8CiAJICAgIGNhcmQtPnJhbWJhc2UgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgInBjaTIwMHN5bjogaW9yZW1hcCgpIGZhaWxlZFxuIik7CisJCXByX2VycigiaW9yZW1hcCgpIGZhaWxlZFxuIik7CiAJCXBjaTIwMF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpAQCAtMzU3LDEyICszNTksMTIgQEAKIAljYXJkLT5idWZmX29mZnNldCA9IDIgKiBzaXplb2YocGt0X2Rlc2MpICogKGNhcmQtPnR4X3JpbmdfYnVmZmVycyArCiAJCQkJCQkgICAgY2FyZC0+cnhfcmluZ19idWZmZXJzKTsKIAotCXByaW50ayhLRVJOX0lORk8gInBjaTIwMHN5bjogJXUgS0IgUkFNIGF0IDB4JXgsIElSUSV1LCB1c2luZyAldSBUWCArIgotCSAgICAgICAiICV1IFJYIHBhY2tldHMgcmluZ3NcbiIsIHJhbXNpemUgLyAxMDI0LCByYW1waHlzLAotCSAgICAgICBwZGV2LT5pcnEsIGNhcmQtPnR4X3JpbmdfYnVmZmVycywgY2FyZC0+cnhfcmluZ19idWZmZXJzKTsKKwlwcl9pbmZvKCIldSBLQiBSQU0gYXQgMHgleCwgSVJRJXUsIHVzaW5nICV1IFRYICsgJXUgUlggcGFja2V0cyByaW5nc1xuIiwKKwkJcmFtc2l6ZSAvIDEwMjQsIHJhbXBoeXMsCisJCXBkZXYtPmlycSwgY2FyZC0+dHhfcmluZ19idWZmZXJzLCBjYXJkLT5yeF9yaW5nX2J1ZmZlcnMpOwogCiAJaWYgKGNhcmQtPnR4X3JpbmdfYnVmZmVycyA8IDEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwY2kyMDBzeW46IFJBTSB0ZXN0IGZhaWxlZFxuIik7CisJCXByX2VycigiUkFNIHRlc3QgZmFpbGVkXG4iKTsKIAkJcGNpMjAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0zNzMsOCArMzc1LDcgQEAKIAogCS8qIEFsbG9jYXRlIElSUSAqLwogCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIHNjYV9pbnRyLCBJUlFGX1NIQVJFRCwgInBjaTIwMHN5biIsIGNhcmQpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaTIwMHN5bjogY291bGQgbm90IGFsbG9jYXRlIElSUSVkLlxuIiwKLQkJICAgICAgIHBkZXYtPmlycSk7CisJCXByX3dhcm4oImNvdWxkIG5vdCBhbGxvY2F0ZSBJUlElZFxuIiwgcGRldi0+aXJxKTsKIAkJcGNpMjAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTQwMCwxNSArNDAxLDEzIEBACiAJCXBvcnQtPmNhcmQgPSBjYXJkOwogCQlzY2FfaW5pdF9wb3J0KHBvcnQpOwogCQlpZiAocmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJwY2kyMDBzeW46IHVuYWJsZSB0byByZWdpc3RlciBoZGxjICIKLQkJCSAgICAgICAiZGV2aWNlXG4iKTsKKwkJCXByX2VycigidW5hYmxlIHRvIHJlZ2lzdGVyIGhkbGMgZGV2aWNlXG4iKTsKIAkJCXBvcnQtPmNhcmQgPSBOVUxMOwogCQkJcGNpMjAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQkJcmV0dXJuIC1FTk9CVUZTOwogCQl9CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBDSTIwMFNZTiBjaGFubmVsICVkXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBwb3J0LT5jaGFuKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiUENJMjAwU1lOIGNoYW5uZWwgJWRcbiIsIHBvcnQtPmNoYW4pOwogCX0KIAogCXNjYV9mbHVzaChjYXJkKTsKQEAgLTQzNSw3ICs0MzQsNyBAQAogc3RhdGljIGludCBfX2luaXQgcGNpMjAwX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaWYgKHBjaV9jbG9ja19mcmVxIDwgMTAwMDAwMCB8fCBwY2lfY2xvY2tfZnJlcSA+IDgwMDAwMDAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicGNpMjAwc3luOiBJbnZhbGlkIFBDSSBjbG9jayBmcmVxdWVuY3lcbiIpOworCQlwcl9lcnIoIkludmFsaWQgUENJIGNsb2NrIGZyZXF1ZW5jeVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGNpMjAwX3BjaV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NibmkuYyBiL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMKaW5kZXggY2ZmMTNhOS4uODYxMjdiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3NibmkuYworKysgYi9kcml2ZXJzL25ldC93YW4vc2JuaS5jCkBAIC0zNyw2ICszNyw4IEBACiAgKglLbm93biBwcm9ibGVtOiB0aGlzIGRyaXZlciB3YXNuJ3QgdGVzdGVkIG9uIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CkBAIC0yMDAsOCArMjAyLDggQEAKIAogCQlyZXR1cm4gIDA7CiAJZWxzZSB7Ci0JCXByaW50ayggS0VSTl9FUlIgInNibmk6IGJhc2UgYWRkcmVzcyAweCVseCBpcyBidXN5LCBvciBhZGFwdGVyICIKLQkJCSJpcyBtYWxmdW5jdGlvbmFsIVxuIiwgZGV2LT5iYXNlX2FkZHIgKTsKKwkJcHJfZXJyKCJiYXNlIGFkZHJlc3MgMHglbHggaXMgYnVzeSwgb3IgYWRhcHRlciBpcyBtYWxmdW5jdGlvbmFsIVxuIiwKKwkJICAgICAgIGRldi0+YmFzZV9hZGRyKTsKIAkJcmV0dXJuICAtRU5PREVWOwogCX0KIH0KQEAgLTIyNiw3ICsyMjgsNiBAQAogaW50IF9faW5pdCBzYm5pX3Byb2JlKGludCB1bml0KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RhdGljIHVuc2lnbmVkICB2ZXJzaW9uX3ByaW50ZWQgX19pbml0ZGF0YSA9IDA7CiAJaW50IGVycjsKIAogCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCksICJzYm5pIiwgc2JuaV9kZXZzZXR1cCk7CkBAIC0yNTAsOCArMjUxLDcgQEAKIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0JaWYoIHZlcnNpb25fcHJpbnRlZCsrID09IDAgKQotCQlwcmludGsoIEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uICk7CisJcHJfaW5mb19vbmNlKCIlcyIsIHZlcnNpb24pOwogCXJldHVybiAwOwogfQogCkBAIC0zMDMsNyArMzAzLDYgQEAKIAkgICAgICAgIT0gTlVMTCApIHsKIAkJaW50ICBwY2lfaXJxX2xpbmU7CiAJCXVuc2lnbmVkIGxvbmcgIHBjaV9pb2FkZHI7Ci0JCXUxNiAgc3Vic3lzOwogCiAJCWlmKCBwZGV2LT52ZW5kb3IgIT0gU0JOSV9QQ0lfVkVORE9SICYmCiAJCSAgICBwZGV2LT5kZXZpY2UgIT0gU0JOSV9QQ0lfREVWSUNFICkKQEAgLTMxNCw5ICszMTMsNyBAQAogCiAJCS8qIEF2b2lkIGFscmVhZHkgZm91bmQgY2FyZHMgZnJvbSBwcmV2aW91cyBjYWxscyAqLwogCQlpZiggIXJlcXVlc3RfcmVnaW9uKCBwY2lfaW9hZGRyLCBTQk5JX0lPX0VYVEVOVCwgZGV2LT5uYW1lICkgKSB7Ci0JCQlwY2lfcmVhZF9jb25maWdfd29yZCggcGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJnN1YnN5cyApOwotCi0JCQlpZiAoc3Vic3lzICE9IDIpCisJCQlpZiAocGRldi0+c3Vic3lzdGVtX2RldmljZSAhPSAyKQogCQkJCWNvbnRpbnVlOwogCiAJCQkvKiBEdWFsIGFkYXB0ZXIgaXMgcHJlc2VudCAqLwpAQCAtMzI2LDkgKzMyMyw5IEBACiAJCX0KIAogCQlpZiAocGNpX2lycV9saW5lIDw9IDAgfHwgcGNpX2lycV9saW5lID49IG5yX2lycXMpCi0JCQlwcmludGsoIEtFUk5fV0FSTklORwotCSIgIFdBUk5JTkc6IFRoZSBQQ0kgQklPUyBhc3NpZ25lZCB0aGlzIFBDSSBjYXJkIHRvIElSUSAlZCwgd2hpY2ggaXMgdW5saWtlbHkgdG8gd29yayEuXG4iCi0JIiBZb3Ugc2hvdWxkIHVzZSB0aGUgUENJIEJJT1Mgc2V0dXAgdG8gYXNzaWduIGEgdmFsaWQgSVJRIGxpbmUuXG4iLAorCQkJcHJfd2FybigKKyJXQVJOSU5HOiBUaGUgUENJIEJJT1MgYXNzaWduZWQgdGhpcyBQQ0kgY2FyZCB0byBJUlEgJWQsIHdoaWNoIGlzIHVubGlrZWx5IHRvIHdvcmshLlxuIgorIllvdSBzaG91bGQgdXNlIHRoZSBQQ0kgQklPUyBzZXR1cCB0byBhc3NpZ24gYSB2YWxpZCBJUlEgbGluZS5cbiIsCiAJCQkJcGNpX2lycV9saW5lICk7CiAKIAkJLyogYXZvaWRpbmcgcmUtZW5hYmxlIGR1YWwgYWRhcHRlcnMgKi8KQEAgLTM3Miw4ICszNjksNyBAQAogCQlvdXRiKCAwLCBpb2FkZHIgKyBDU1IwICk7CiAKIAkJaWYoICFpcnEgKSB7Ci0JCQlwcmludGsoIEtFUk5fRVJSICIlczogY2FuJ3QgZGV0ZWN0IGRldmljZSBpcnEhXG4iLAotCQkJCWRldi0+bmFtZSApOworCQkJcHJfZXJyKCIlczogY2FuJ3QgZGV0ZWN0IGRldmljZSBpcnEhXG4iLCBkZXYtPm5hbWUpOwogCQkJcmVsZWFzZV9yZWdpb24oIGlvYWRkciwgU0JOSV9JT19FWFRFTlQgKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CkBAIC0zODYsNyArMzgyLDcgQEAKIAkvKiBGaWxsIGluIHNibmktc3BlY2lmaWMgZGV2IGZpZWxkcy4gKi8KIAlubCA9IG5ldGRldl9wcml2KGRldik7CiAJaWYoICFubCApIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgbWVtb3J5IVxuIiwgZGV2LT5uYW1lICk7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byBnZXQgbWVtb3J5IVxuIiwgZGV2LT5uYW1lKTsKIAkJcmVsZWFzZV9yZWdpb24oIGlvYWRkciwgU0JOSV9JT19FWFRFTlQgKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNDE1LDIxICs0MTEsMjEgQEAKIAlpZiggaW5iKCBpb2FkZHIgKyBDU1IwICkgJiAweDAxICkKIAkJbmwtPnN0YXRlIHw9IEZMX1NMT1dfTU9ERTsKIAotCXByaW50ayggS0VSTl9OT1RJQ0UgIiVzOiBpb2FkZHIgJSNseCwgaXJxICVkLCAiCi0JCSJNQUM6IDAwOmZmOjAxOiUwMng6JTAyeDolMDJ4XG4iLCAKLQkJZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsCi0JCSgodTggKikgZGV2LT5kZXZfYWRkcikgWzNdLAotCQkoKHU4ICopIGRldi0+ZGV2X2FkZHIpIFs0XSwKLQkJKCh1OCAqKSBkZXYtPmRldl9hZGRyKSBbNV0gKTsKKwlwcl9ub3RpY2UoIiVzOiBpb2FkZHIgJSNseCwgaXJxICVkLCBNQUM6IDAwOmZmOjAxOiUwMng6JTAyeDolMDJ4XG4iLAorCQkgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLAorCQkgICgodTggKilkZXYtPmRldl9hZGRyKVszXSwKKwkJICAoKHU4ICopZGV2LT5kZXZfYWRkcilbNF0sCisJCSAgKCh1OCAqKWRldi0+ZGV2X2FkZHIpWzVdKTsKIAotCXByaW50ayggS0VSTl9OT1RJQ0UgIiVzOiBzcGVlZCAlZCwgcmVjZWl2ZSBsZXZlbCAiLCBkZXYtPm5hbWUsCi0JCSggKG5sLT5zdGF0ZSAmIEZMX1NMT1dfTU9ERSkgID8gIDUwMDAwMCA6IDIwMDAwMDApCi0JCS8gKDEgPDwgbmwtPmNzcjEucmF0ZSkgKTsKKwlwcl9ub3RpY2UoIiVzOiBzcGVlZCAlZCIsCisJCSAgZGV2LT5uYW1lLAorCQkgICgobmwtPnN0YXRlICYgRkxfU0xPV19NT0RFKSA/IDUwMDAwMCA6IDIwMDAwMDApCisJCSAgLyAoMSA8PCBubC0+Y3NyMS5yYXRlKSk7CiAKIAlpZiggbmwtPmRlbHRhX3J4bCA9PSAwICkKLQkJcHJpbnRrKCAiMHgleCAoZml4ZWQpXG4iLCBubC0+Y3VyX3J4bF9pbmRleCApOyAKKwkJcHJfY29udCgiLCByZWNlaXZlIGxldmVsIDB4JXggKGZpeGVkKVxuIiwgbmwtPmN1cl9yeGxfaW5kZXgpOwogCWVsc2UKLQkJcHJpbnRrKCAiKGF1dG8pXG4iKTsKKwkJcHJfY29udCgiLCByZWNlaXZlIGxldmVsIChhdXRvKVxuIik7CiAKICNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKIAlubC0+bWFzdGVyID0gZGV2OwpAQCAtNTY4LDcgKzU2NCw3IEBACiAJCSAqLwogCQljc3IwID0gaW5iKCBpb2FkZHIgKyBDU1IwICk7CiAJCWlmKCAhKGNzcjAgJiBUUl9SRFkpICB8fCAgKGNzcjAgJiBSQ19SRFkpICkKLQkJCXByaW50ayggS0VSTl9FUlIgIiVzOiBpbnRlcm5hbCBlcnJvciFcbiIsIGRldi0+bmFtZSApOworCQkJbmV0ZGV2X2VycihkZXYsICJpbnRlcm5hbCBlcnJvciFcbiIpOwogCiAJCS8qIGlmIHN0YXRlICYgRkxfTkVFRF9SRVNFTkQgIT0gMCB0aGVuIHR4X2ZyYW1lbm8gIT0gMCAqLwogCQlpZiggcmVxX2FucyAgfHwgIG5sLT50eF9mcmFtZW5vICE9IDAgKQpAQCAtODUxLDcgKzg0Nyw3IEBACiAKIAkvKiBubC0+dHhfYnVmX3AgPT0gTlVMTCBoZXJlISAqLwogCWlmKCBubC0+dHhfYnVmX3AgKQotCQlwcmludGsoIEtFUk5fRVJSICIlczogbWVtb3J5IGxlYWshXG4iLCBkZXYtPm5hbWUgKTsKKwkJbmV0ZGV2X2VycihkZXYsICJtZW1vcnkgbGVhayFcbiIpOwogCiAJbmwtPm91dHBvcyA9IDA7CiAJbmwtPnN0YXRlICY9IH4oRkxfV0FJVF9BQ0sgfCBGTF9ORUVEX1JFU0VORCk7CkBAIC0xMTc5LDE2ICsxMTc1LDE1IEBACiAKIAkJCQkoKHN0cnVjdCBuZXRfbG9jYWwgKikgKG5ldGRldl9wcml2KCpwKSkpCiAJCQkJCS0+c2Vjb25kID0gZGV2OwotCQkJCXByaW50ayggS0VSTl9OT1RJQ0UgIiVzOiB1c2luZyBzaGFyZWQgaXJxICIKLQkJCQkJIndpdGggJXNcbiIsIGRldi0+bmFtZSwgKCpwKS0+bmFtZSApOworCQkJCW5ldGRldl9ub3RpY2UoZGV2LCAidXNpbmcgc2hhcmVkIGlycSB3aXRoICVzXG4iLAorCQkJCQkgICAgICAoKnApLT5uYW1lKTsKIAkJCQlubC0+c3RhdGUgfD0gRkxfU0VDT05EQVJZOwogCQkJCWdvdG8gIGhhbmRsZXJfYXR0YWNoZWQ7CiAJCQl9CiAJfQogCiAJaWYoIHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzYm5pX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KSApIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwKLQkJCWRldi0+bmFtZSwgZGV2LT5pcnEgKTsKKwkJbmV0ZGV2X2VycihkZXYsICJ1bmFibGUgdG8gZ2V0IElSUSAlZFxuIiwgZGV2LT5pcnEpOwogCQlyZXR1cm4gIC1FQUdBSU47CiAJfQogCkBAIC0xMjIwLDggKzEyMTUsOCBAQAogCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiggbmwtPnNlY29uZCAgJiYgIG5sLT5zZWNvbmQtPmZsYWdzICYgSUZGX1VQICkgewotCQlwcmludGsoIEtFUk5fTk9USUNFICJTZWNvbmRhcnkgY2hhbm5lbCAoJXMpIGlzIGFjdGl2ZSFcbiIsCi0JCQlubC0+c2Vjb25kLT5uYW1lICk7CisJCW5ldGRldl9ub3RpY2UoZGV2LCAiU2Vjb25kYXJ5IGNoYW5uZWwgKCVzKSBpcyBhY3RpdmUhXG4iLAorCQkJICAgICAgbmwtPnNlY29uZC0+bmFtZSk7CiAJCXJldHVybiAgLUVCVVNZOwogCX0KIApAQCAtMTM2Myw4ICsxMzU4LDggQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCQlzbGF2ZV9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBzbGF2ZV9uYW1lICk7CiAJCWlmKCAhc2xhdmVfZGV2ICB8fCAgIShzbGF2ZV9kZXYtPmZsYWdzICYgSUZGX1VQKSApIHsKLQkJCXByaW50ayggS0VSTl9FUlIgIiVzOiB0cnlpbmcgdG8gZW5zbGF2ZSBub24tYWN0aXZlICIKLQkJCQkiZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUsIHNsYXZlX25hbWUgKTsKKwkJCW5ldGRldl9lcnIoZGV2LCAidHJ5aW5nIHRvIGVuc2xhdmUgbm9uLWFjdGl2ZSBkZXZpY2UgJXNcbiIsCisJCQkJICAgc2xhdmVfbmFtZSk7CiAJCQlyZXR1cm4gIC1FUEVSTTsKIAkJfQogCkBAIC0xNDE3LDggKzE0MTIsNyBAQAogCiAJc3Bpbl91bmxvY2soICZzbmwtPmxvY2sgKTsKIAlzcGluX3VubG9jayggJm5sLT5sb2NrICk7Ci0JcHJpbnRrKCBLRVJOX05PVElDRSAiJXM6IHNsYXZlIGRldmljZSAoJXMpIGF0dGFjaGVkLlxuIiwKLQkJZGV2LT5uYW1lLCBzbGF2ZV9kZXYtPm5hbWUgKTsKKwluZXRkZXZfbm90aWNlKGRldiwgInNsYXZlIGRldmljZSAoJXMpIGF0dGFjaGVkXG4iLCBzbGF2ZV9kZXYtPm5hbWUpOwogCXJldHVybiAgMDsKIH0KIApAQCAtMTU0Nyw3ICsxNTQxLDcgQEAKIAkJCQlicmVhazsKIAl9CiBiYWRfcGFyYW06Ci0JcHJpbnRrKCBLRVJOX0VSUiAiRXJyb3IgaW4gc2JuaSBrZXJuZWwgcGFyYW1ldGVyIVxuIiApOworCXByX2VycigiRXJyb3IgaW4gc2JuaSBrZXJuZWwgcGFyYW1ldGVyIVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYS5jCmluZGV4IDNmNGUyYjUuLmM4NTMxNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NkbGEuYwpAQCAtMzIsNiArMzIsOCBAQAogICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTM1MCwyNCArMzUyLDI0IEBACiAJCWNhc2UgU0RMQV9SRVRfTU9ERU06CiAJCQlzdGF0ZSA9IGRhdGE7CiAJCQlpZiAoKnN0YXRlICYgU0RMQV9NT0RFTV9EQ0RfTE9XKQotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb2RlbSBEQ0QgdW5leHBlY3RlZGx5IGxvdyFcbiIsIGRldi0+bmFtZSk7CisJCQkJbmV0ZGV2X2luZm8oZGV2LCAiTW9kZW0gRENEIHVuZXhwZWN0ZWRseSBsb3chXG4iKTsKIAkJCWlmICgqc3RhdGUgJiBTRExBX01PREVNX0NUU19MT1cpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vZGVtIENUUyB1bmV4cGVjdGVkbHkgbG93IVxuIiwgZGV2LT5uYW1lKTsKKwkJCQluZXRkZXZfaW5mbyhkZXYsICJNb2RlbSBDVFMgdW5leHBlY3RlZGx5IGxvdyFcbiIpOwogCQkJLyogSSBzaG91bGQgcHJvYmFibHkgZG8gc29tZXRoaW5nIGFib3V0IHRoaXMhICovCiAJCQlicmVhazsKIAogCQljYXNlIFNETEFfUkVUX0NIQU5ORUxfT0ZGOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENoYW5uZWwgYmVjYW1lIGlub3BlcmF0aXZlIVxuIiwgZGV2LT5uYW1lKTsKKwkJCW5ldGRldl9pbmZvKGRldiwgIkNoYW5uZWwgYmVjYW1lIGlub3BlcmF0aXZlIVxuIik7CiAJCQkvKiBzYW1lIGhlcmUgKi8KIAkJCWJyZWFrOwogCiAJCWNhc2UgU0RMQV9SRVRfQ0hBTk5FTF9PTjoKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDaGFubmVsIGJlY2FtZSBvcGVyYXRpdmUhXG4iLCBkZXYtPm5hbWUpOworCQkJbmV0ZGV2X2luZm8oZGV2LCAiQ2hhbm5lbCBiZWNhbWUgb3BlcmF0aXZlIVxuIik7CiAJCQkvKiBzYW1lIGhlcmUgKi8KIAkJCWJyZWFrOwogCiAJCWNhc2UgU0RMQV9SRVRfRExDSV9TVEFUVVM6Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogU3RhdHVzIGNoYW5nZSByZXBvcnRlZCBieSBBY2Nlc3MgTm9kZS5cbiIsIGRldi0+bmFtZSk7CisJCQluZXRkZXZfaW5mbyhkZXYsICJTdGF0dXMgY2hhbmdlIHJlcG9ydGVkIGJ5IEFjY2VzcyBOb2RlXG4iKTsKIAkJCWxlbiAvPSBzaXplb2Yoc3RydWN0IF9kbGNpX3N0YXQpOwogCQkJZm9yKHBzdGF0dXMgPSBkYXRhLCBpPTA7aSA8IGxlbjtpKysscHN0YXR1cysrKQogCQkJewpAQCAtMzgyLDI5ICszODQsMzIgQEAKIAkJCQkJc3ByaW50ZihsaW5lLCAidW5rbm93biBzdGF0dXM6ICUwMlgiLCBwc3RhdHVzLT5mbGFncyk7CiAJCQkJCXN0YXRlID0gbGluZTsKIAkJCQl9Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERMQ0kgJWk6ICVzLlxuIiwgZGV2LT5uYW1lLCBwc3RhdHVzLT5kbGNpLCBzdGF0ZSk7CisJCQkJbmV0ZGV2X2luZm8oZGV2LCAiRExDSSAlaTogJXNcbiIsCisJCQkJCSAgICBwc3RhdHVzLT5kbGNpLCBzdGF0ZSk7CiAJCQkJLyogc2FtZSBoZXJlICovCiAJCQl9CiAJCQlicmVhazsKIAogCQljYXNlIFNETEFfUkVUX0RMQ0lfVU5LTk9XTjoKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCB1bmtub3duIERMQ0lzOiIsIGRldi0+bmFtZSk7CisJCQluZXRkZXZfaW5mbyhkZXYsICJSZWNlaXZlZCB1bmtub3duIERMQ0lzOiIpOwogCQkJbGVuIC89IHNpemVvZihzaG9ydCk7CiAJCQlmb3IocGRsY2kgPSBkYXRhLGk9MDtpIDwgbGVuO2krKyxwZGxjaSsrKQotCQkJCXByaW50aygiICVpIiwgKnBkbGNpKTsKLQkJCXByaW50aygiXG4iKTsKKwkJCQlwcl9jb250KCIgJWkiLCAqcGRsY2kpOworCQkJcHJfY29udCgiXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0RMQV9SRVRfVElNRU9VVDoKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvbW1hbmQgdGltZWQgb3V0IVxuIiwgZGV2LT5uYW1lKTsKKwkJCW5ldGRldl9lcnIoZGV2LCAiQ29tbWFuZCB0aW1lZCBvdXQhXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0RMQV9SRVRfQlVGX09WRVJTSVpFOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJjL0NJUiBvdmVyZmxvdywgYWNjZXB0YWJsZSBzaXplIGlzICVpXG4iLCBkZXYtPm5hbWUsIGxlbik7CisJCQluZXRkZXZfaW5mbyhkZXYsICJCYy9DSVIgb3ZlcmZsb3csIGFjY2VwdGFibGUgc2l6ZSBpcyAlaVxuIiwKKwkJCQkgICAgbGVuKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0RMQV9SRVRfQlVGX1RPT19CSUc6Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogQnVmZmVyIHNpemUgb3ZlciBzcGVjaWZpZWQgbWF4IG9mICVpXG4iLCBkZXYtPm5hbWUsIGxlbik7CisJCQluZXRkZXZfaW5mbyhkZXYsICJCdWZmZXIgc2l6ZSBvdmVyIHNwZWNpZmllZCBtYXggb2YgJWlcbiIsCisJCQkJICAgIGxlbik7CiAJCQlicmVhazsKIAogCQljYXNlIFNETEFfUkVUX0NIQU5ORUxfSU5BQ1RJVkU6CkBAIC00MTUsNyArNDIwLDggQEAKIAkJCQlicmVhazsKIAogCQlkZWZhdWx0OiAKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ21kIDB4JTIuMlggZ2VuZXJhdGVkIHJldHVybiBjb2RlIDB4JTIuMlhcbiIsIGRldi0+bmFtZSwgY21kLCByZXQpOworCQkJbmV0ZGV2X2RiZyhkZXYsICJDbWQgMHglMDJYIGdlbmVyYXRlZCByZXR1cm4gY29kZSAweCUwMlhcbiIsCisJCQkJICAgY21kLCByZXQpOwogCQkJLyogRnVydGhlciBwcm9jZXNzaW5nIGNvdWxkIGJlIGRvbmUgaGVyZSAqLwogCQkJYnJlYWs7CiAJfQpAQCAtNjc4LDEyICs2ODQsMTQgQEAKIAkJY2FzZSBBUlBIUkRfRlJBRDoKIAkJCWlmIChza2ItPmRldi0+dHlwZSAhPSBBUlBIUkRfRExDSSkKIAkJCXsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm9uIERMQ0kgZGV2aWNlLCB0eXBlICVpLCB0cmllZCB0byBzZW5kIG9uIEZSQUQgbW9kdWxlLlxuIiwgZGV2LT5uYW1lLCBza2ItPmRldi0+dHlwZSk7CisJCQkJbmV0ZGV2X3dhcm4oZGV2LCAiTm9uIERMQ0kgZGV2aWNlLCB0eXBlICVpLCB0cmllZCB0byBzZW5kIG9uIEZSQUQgbW9kdWxlXG4iLAorCQkJCQkgICAgc2tiLT5kZXYtPnR5cGUpOwogCQkJCWFjY2VwdCA9IDA7CiAJCQl9CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmtub3duIGZpcm13YXJlIHR5cGUgMHglNC40WFxuIiwgZGV2LT5uYW1lLCBkZXYtPnR5cGUpOworCQkJbmV0ZGV2X3dhcm4oZGV2LCAidW5rbm93biBmaXJtd2FyZSB0eXBlIDB4JTA0WFxuIiwKKwkJCQkgICAgZGV2LT50eXBlKTsKIAkJCWFjY2VwdCA9IDA7CiAJCQlicmVhazsKIAl9CkBAIC04MDcsNyArODE1LDggQEAKIAogCQlpZiAoaSA9PSBDT05GSUdfRExDSV9NQVgpCiAJCXsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFJlY2VpdmVkIHBhY2tldCBmcm9tIGludmFsaWQgRExDSSAlaSwgaWdub3JpbmcuIiwgZGV2LT5uYW1lLCBkbGNpKTsKKwkJCW5ldGRldl9ub3RpY2UoZGV2LCAiUmVjZWl2ZWQgcGFja2V0IGZyb20gaW52YWxpZCBETENJICVpLCBpZ25vcmluZ1xuIiwKKwkJCQkgICAgICBkbGNpKTsKIAkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQlzdWNjZXNzID0gMDsKIAkJfQpAQCAtODE5LDcgKzgyOCw3IEBACiAJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgc2l6ZW9mKHN0cnVjdCBmcmhkcikpOwogCQlpZiAoc2tiID09IE5VTEwpIAogCQl7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCW5ldGRldl9ub3RpY2UoZGV2LCAiTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldFxuIik7CiAJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCXN1Y2Nlc3MgPSAwOwogCQl9CkBAIC04ODAsOCArODg5LDcgQEAKIAogCWlmICghZmxwLT5pbml0aWFsaXplZCkKIAl7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpcnEgJWQgZm9yIHVuaW5pdGlhbGl6ZWQgZGV2aWNlLlxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQluZXRkZXZfd2FybihkZXYsICJpcnEgJWQgZm9yIHVuaW5pdGlhbGl6ZWQgZGV2aWNlXG4iLCBkZXYtPmlycSk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKQEAgLTkwMSw3ICs5MDksNyBAQAogCQljYXNlIFNETEFfSU5UUl9UWDoKIAkJY2FzZSBTRExBX0lOVFJfQ09NUExFVEU6CiAJCWNhc2UgU0RMQV9JTlRSX1RJTUVSOgotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgaXJxIGZsYWcgMHglMDJYLlxuIiwgZGV2LT5uYW1lLCBieXRlKTsKKwkJCW5ldGRldl93YXJuKGRldiwgImludmFsaWQgaXJxIGZsYWcgMHglMDJYXG4iLCBieXRlKTsKIAkJCWJyZWFrOwogCX0KIApAQCAtMTM0Nyw3ICsxMzU1LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKG1hcC0+YmFzZV9hZGRyLCBTRExBX0lPX0VYVEVOVFMsIGRldi0+bmFtZSkpewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJTRExBOiBpby1wb3J0IDB4JTA0bHggaW4gdXNlXG4iLCBkZXYtPmJhc2VfYWRkcik7CisJCXByX3dhcm4oImlvLXBvcnQgMHglMDRseCBpbiB1c2VcbiIsIGRldi0+YmFzZV9hZGRyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWJhc2UgPSBtYXAtPmJhc2VfYWRkcjsKQEAgLTE0MTIsNyArMTQyMCw3IEBACiAJCX0KIAl9CiAKLQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBVbmtub3duIGNhcmQgdHlwZVxuIiwgZGV2LT5uYW1lKTsKKwluZXRkZXZfbm90aWNlKGRldiwgIlVua25vd24gY2FyZCB0eXBlXG4iKTsKIAllcnIgPSAtRU5PREVWOwogCWdvdG8gZmFpbDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NlYWxldmVsLmMgYi9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYwppbmRleCBlOTE0NTdkNi4uMGI0ZmQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3NlYWxldmVsLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NlYWxldmVsLmMKQEAgLTEyLDYgKzEyLDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTE5MCw3ICsxOTIsNyBAQAogCWRldi0+aXJxID0gaXJxOwogCiAJaWYgKHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzZWFsZXZlbDogdW5hYmxlIHRvIHJlZ2lzdGVyIEhETEMgZGV2aWNlXG4iKTsKKwkJcHJfZXJyKCJ1bmFibGUgdG8gcmVnaXN0ZXIgSERMQyBkZXZpY2VcbiIpOwogCQlmcmVlX25ldGRldihkZXYpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMjE1LDggKzIxNyw3IEBACiAJICovCiAKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgOCwgIlNlYWxldmVsIDQwMjEiKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJzZWFsZXZlbDogSS9PIDB4JVggYWxyZWFkeSBpbiB1c2UuXG4iLAotCQkgICAgICAgaW9iYXNlKTsKKwkJcHJfd2FybigiSS9PIDB4JVggYWxyZWFkeSBpbiB1c2VcbiIsIGlvYmFzZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMjY3LDcgKzI2OCw3IEBACiAKIAlpZiAocmVxdWVzdF9pcnEoaXJxLCB6ODUzMF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCiAJCQkiU2VhTGV2ZWwiLCBkZXYpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJzZWFsZXZlbDogSVJRICVkIGFscmVhZHkgaW4gdXNlLlxuIiwgaXJxKTsKKwkJcHJfd2FybigiSVJRICVkIGFscmVhZHkgaW4gdXNlXG4iLCBpcnEpOwogCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKIAl9CiAKQEAgLTI5Miw3ICsyOTMsNyBAQAogCSAqLwogCiAJaWYgKHo4NTMwX2luaXQoZGV2KSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiWjg1MzAgc2VyaWVzIGRldmljZSBub3QgZm91bmQuXG4iKTsKKwkJcHJfZXJyKCJaODUzMCBzZXJpZXMgZGV2aWNlIG5vdCBmb3VuZFxuIik7CiAJCWVuYWJsZV9pcnEoaXJxKTsKIAkJZ290byBmcmVlX2h3OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jIGIvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmMKaW5kZXggZGI3M2E3Yi4uNDRiNzA3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmMKQEAgLTEzLDYgKzEzLDggQEAKICAqICAgLSB3YW5YTDEwMCB3aWxsIHJlcXVpcmUgbWlub3IgZHJpdmVyIG1vZGlmaWNhdGlvbnMsIG5vIGFjY2VzcyB0byBodwogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTIyLDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CkBAIC0xMDEsOSArMTA0LDggQEAKIHsKIAlkbWFfYWRkcl90IGFkZHIgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBwdHIsIHNpemUsIGRpcmVjdGlvbik7CiAJaWYgKGFkZHIgKyBzaXplID4gMHgxMDAwMDAwMDBMTCkKLQkJcHJpbnRrKEtFUk5fQ1JJVCAid2FuWEwgJXM6IHBjaV9tYXBfc2luZ2xlKCkgcmV0dXJuZWQgbWVtb3J5IgotCQkgICAgICAgIiBhdCAweCVMWCFcbiIsIHBjaV9uYW1lKHBkZXYpLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyKTsKKwkJcHJfY3JpdCgiJXM6IHBjaV9tYXBfc2luZ2xlKCkgcmV0dXJuZWQgbWVtb3J5IGF0IDB4JWxseCFcbiIsCisJCQlwY2lfbmFtZShwZGV2KSwgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyKTsKIAlyZXR1cm4gYWRkcjsKIH0KIApAQCAtMTQ2LDggKzE0OCw4IEBACiAJCX0KIAkJZHRlID0gKHZhbHVlICYgU1RBVFVTX0NBQkxFX0RDRSkgPyAiIERDRSIgOiAiIERURSI7CiAJfQotCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyVzIG1vZHVsZSwgJXMgY2FibGUlcyVzXG4iLAotCSAgICAgICBwb3J0LT5kZXYtPm5hbWUsIHBtLCBkdGUsIGNhYmxlLCBkc3IsIGRjZCk7CisJbmV0ZGV2X2luZm8ocG9ydC0+ZGV2LCAiJXMlcyBtb2R1bGUsICVzIGNhYmxlJXMlc1xuIiwKKwkJICAgIHBtLCBkdGUsIGNhYmxlLCBkc3IsIGRjZCk7CiAKIAlpZiAodmFsdWUgJiBTVEFUVVNfQ0FCTEVfRENEKQogCQluZXRpZl9jYXJyaWVyX29uKHBvcnQtPmRldik7CkBAIC0xOTcsOCArMTk5LDggQEAKIAl3aGlsZSAoZGVzYyA9ICZjYXJkLT5zdGF0dXMtPnJ4X2Rlc2NzW2NhcmQtPnJ4X2luXSwKIAkgICAgICAgZGVzYy0+c3RhdCAhPSBQQUNLRVRfRU1QVFkpIHsKIAkJaWYgKChkZXNjLT5zdGF0ICYgUEFDS0VUX1BPUlRfTUFTSykgPiBjYXJkLT5uX3BvcnRzKQotCQkJcHJpbnRrKEtFUk5fQ1JJVCAid2FuWEwgJXM6IHJlY2VpdmVkIHBhY2tldCBmb3IiCi0JCQkgICAgICAgIiBub25leGlzdGVudCBwb3J0XG4iLCBwY2lfbmFtZShjYXJkLT5wZGV2KSk7CisJCQlwcl9jcml0KCIlczogcmVjZWl2ZWQgcGFja2V0IGZvciBub25leGlzdGVudCBwb3J0XG4iLAorCQkJCXBjaV9uYW1lKGNhcmQtPnBkZXYpKTsKIAkJZWxzZSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gY2FyZC0+cnhfc2tic1tjYXJkLT5yeF9pbl07CiAJCQlwb3J0X3QgKnBvcnQgPSAmY2FyZC0+cG9ydHNbZGVzYy0+c3RhdCAmCkBAIC0yODIsNyArMjg0LDcgQEAKICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0dGVyIGJ1ZmZlciBmdWxsXG4iLCBkZXYtPm5hbWUpOwogI2VuZGlmCiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwogCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7ICAgICAgIC8qIHJlcXVlc3QgcGFja2V0IHRvIGJlIHF1ZXVlZCAqLwogCX0KIApAQCAtMzk2LDcgKzM5OCw3IEBACiAJaW50IGk7CiAKIAlpZiAoZ2V0X3N0YXR1cyhwb3J0KS0+b3BlbikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwb3J0IGFscmVhZHkgb3BlblxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihkZXYsICJwb3J0IGFscmVhZHkgb3BlblxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoKGkgPSBoZGxjX29wZW4oZGV2KSkgIT0gMCkKQEAgLTQxNiw3ICs0MTgsNyBAQAogCQl9CiAJfSB3aGlsZSAodGltZV9hZnRlcih0aW1lb3V0LCBqaWZmaWVzKSk7CiAKLQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gb3BlbiBwb3J0XG4iLCBkZXYtPm5hbWUpOworCW5ldGRldl9lcnIoZGV2LCAidW5hYmxlIHRvIG9wZW4gcG9ydFxuIik7CiAJLyogYXNrIHRoZSBjYXJkIHRvIGNsb3NlIHRoZSBwb3J0LCBzaG91bGQgaXQgYmUgc3RpbGwgYWxpdmUgKi8KIAl3cml0ZWwoMSA8PCAoRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8wICsgcG9ydC0+bm9kZSksIGRicik7CiAJcmV0dXJuIC1FRkFVTFQ7CkBAIC00NDIsNyArNDQ0LDcgQEAKIAl9IHdoaWxlICh0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpKTsKIAogCWlmIChnZXRfc3RhdHVzKHBvcnQpLT5vcGVuKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gY2xvc2UgcG9ydFxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihkZXYsICJ1bmFibGUgdG8gY2xvc2UgcG9ydFxuIik7CiAKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKQEAgLTU2NywxMSArNTY5LDcgQEAKIAlpbnQgaSwgcG9ydHMsIGFsbG9jX3NpemU7CiAKICNpZm5kZWYgTU9EVUxFCi0Jc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247Ci0JaWYgKCFwcmludGVkX3ZlcnNpb24pIHsKLQkJcHJpbnRlZF92ZXJzaW9uKys7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCB2ZXJzaW9uKTsKLQl9CisJcHJfaW5mb19vbmNlKCIlc1xuIiwgdmVyc2lvbik7CiAjZW5kaWYKIAogCWkgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKQEAgLTU4Nyw3ICs1ODUsNyBAQAogCSAgIHdvcmsgb24gbW9zdCBwbGF0Zm9ybXMgKi8KIAlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygyOCkpIHx8CiAJICAgIHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDI4KSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ3YW5YTDogTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iKTsKKwkJcHJfZXJyKCJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb25cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTYwNiw4ICs2MDQsNyBAQAogCWFsbG9jX3NpemUgPSBzaXplb2YoY2FyZF90KSArIHBvcnRzICogc2l6ZW9mKHBvcnRfdCk7CiAJY2FyZCA9IGt6YWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNhcmQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIndhblhMICVzOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLCBwY2lfbmFtZShwZGV2KSk7CiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAkJcmV0dXJuIC1FTk9CVUZTOwpAQCAtNjM0LDcgKzYzMSw3IEBACiAJICAgdG8gaW5kaWNhdGUgdGhlIGNhcmQgY2FuIGRvIDMyLWJpdCBETUEgYWRkcmVzc2luZyAqLwogCWlmIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkgfHwKIAkgICAgcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSkgewotCQlwcmludGsoS0VSTl9FUlIgIndhblhMOiBObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb25cbiIpOworCQlwcl9lcnIoIk5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvblxuIik7CiAJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC02NDQsNyArNjQxLDcgQEAKIAogCWNhcmQtPnBseCA9IGlvcmVtYXBfbm9jYWNoZShwbHhfcGh5LCAweDcwKTsKIAlpZiAoIWNhcmQtPnBseCkgewotCQlwcmludGsoS0VSTl9FUlIgIndhbnhsOiBpb3JlbWFwKCkgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJpb3JlbWFwKCkgZmFpbGVkXG4iKTsKICAJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC02NTYsOCArNjUzLDggQEAKIAl0aW1lb3V0ID0gamlmZmllcyArIDIwICogSFo7CiAJd2hpbGUgKChzdGF0ID0gcmVhZGwoY2FyZC0+cGx4ICsgUExYX01BSUxCT1hfMCkpICE9IDApIHsKIAkJaWYgKHRpbWVfYmVmb3JlKHRpbWVvdXQsIGppZmZpZXMpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YW5YTCAlczogdGltZW91dCB3YWl0aW5nIGZvciIKLQkJCSAgICAgICAiIFBVVFMgdG8gY29tcGxldGVcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJCXByX3dhcm4oIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIFBVVFMgdG8gY29tcGxldGVcbiIsCisJCQkJcGNpX25hbWUocGRldikpOwogCQkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtNjY4LDggKzY2NSw4IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IFBVVFMgdGVzdCAweCVYIgotCQkJICAgICAgICIgZmFpbGVkXG4iLCBwY2lfbmFtZShwZGV2KSwgc3RhdCAmIDB4MzApOworCQkJcHJfd2FybigiJXM6IFBVVFMgdGVzdCAweCVYIGZhaWxlZFxuIiwKKwkJCQlwY2lfbmFtZShwZGV2KSwgc3RhdCAmIDB4MzApOwogCQkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtNjg3LDE3ICs2ODQsMTYgQEAKIAkvKiBzYW5pdHkgY2hlY2sgdGhlIGJvYXJkJ3MgcmVwb3J0ZWQgbWVtb3J5IHNpemUgKi8KIAlpZiAocmFtc2l6ZSA8IEJVRkZFUlNfQUREUiArCiAJICAgIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiBCVUZGRVJfTEVOR1RIICogcG9ydHMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IG5vIGVub3VnaCBvbi1ib2FyZCBSQU0iCi0JCSAgICAgICAiICgldSBieXRlcyBkZXRlY3RlZCwgJXUgYnl0ZXMgcmVxdWlyZWQpXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldiksIHJhbXNpemUsIEJVRkZFUlNfQUREUiArCi0JCSAgICAgICAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogQlVGRkVSX0xFTkdUSCAqIHBvcnRzKTsKKwkJcHJfd2FybigiJXM6IG5vIGVub3VnaCBvbi1ib2FyZCBSQU0gKCV1IGJ5dGVzIGRldGVjdGVkLCAldSBieXRlcyByZXF1aXJlZClcbiIsCisJCQlwY2lfbmFtZShwZGV2KSwgcmFtc2l6ZSwKKwkJCUJVRkZFUlNfQUREUiArCisJCQkoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogQlVGRkVSX0xFTkdUSCAqIHBvcnRzKTsKIAkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmICh3YW54bF9wdXRzX2NvbW1hbmQoY2FyZCwgTUJYMV9DTURfQlNXQVApKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIndhblhMICVzOiB1bmFibGUgdG8gU2V0IEJ5dGUgU3dhcCIKLQkJICAgICAgICIgTW9kZVxuIiwgcGNpX25hbWUocGRldikpOworCQlwcl93YXJuKCIlczogdW5hYmxlIHRvIFNldCBCeXRlIFN3YXAgTW9kZVxuIiwgcGNpX25hbWUocGRldikpOwogCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtNzE0LDcgKzcxMCw3IEBACiAKIAltZW0gPSBpb3JlbWFwX25vY2FjaGUobWVtX3BoeSwgUERNX09GRlNFVCArIHNpemVvZihmaXJtd2FyZSkpOwogCWlmICghbWVtKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAid2FueGw6IGlvcmVtYXAoKSBmYWlsZWRcbiIpOworCQlwcl9lcnIoImlvcmVtYXAoKSBmYWlsZWRcbiIpOwogIAkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTczMyw4ICs3MjksNyBAQAogCXdyaXRlbCgwLCBjYXJkLT5wbHggKyBQTFhfTUFJTEJPWF81KTsKIAogCWlmICh3YW54bF9wdXRzX2NvbW1hbmQoY2FyZCwgTUJYMV9DTURfQUJPUlRKKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YW5YTCAlczogdW5hYmxlIHRvIEFib3J0IGFuZCBKdW1wXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlwcl93YXJuKCIlczogdW5hYmxlIHRvIEFib3J0IGFuZCBKdW1wXG4iLCBwY2lfbmFtZShwZGV2KSk7CiAJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC03NDgsOCArNzQzLDggQEAKIAl9d2hpbGUgKHRpbWVfYWZ0ZXIodGltZW91dCwgamlmZmllcykpOwogCiAJaWYgKCFzdGF0KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIndhblhMICVzOiB0aW1lb3V0IHdoaWxlIGluaXRpYWxpemluZyBjYXJkICIKLQkJICAgICAgICJmaXJtd2FyZVxuIiwgcGNpX25hbWUocGRldikpOworCQlwcl93YXJuKCIlczogdGltZW91dCB3aGlsZSBpbml0aWFsaXppbmcgY2FyZCBmaXJtd2FyZVxuIiwKKwkJCXBjaV9uYW1lKHBkZXYpKTsKIAkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTc1OCwxMyArNzUzLDEzIEBACiAJcmFtc2l6ZSA9IHN0YXQ7CiAjZW5kaWYKIAotCXByaW50ayhLRVJOX0lORk8gIndhblhMICVzOiBhdCAweCVYLCAldSBLQiBvZiBSQU0gYXQgMHglWCwgaXJxICV1XG4iLAotCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcGx4X3BoeSwgcmFtc2l6ZSAvIDEwMjQsIG1lbV9waHksIHBkZXYtPmlycSk7CisJcHJfaW5mbygiJXM6IGF0IDB4JVgsICV1IEtCIG9mIFJBTSBhdCAweCVYLCBpcnEgJXVcbiIsCisJCXBjaV9uYW1lKHBkZXYpLCBwbHhfcGh5LCByYW1zaXplIC8gMTAyNCwgbWVtX3BoeSwgcGRldi0+aXJxKTsKIAogCS8qIEFsbG9jYXRlIElSUSAqLwogCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIHdhbnhsX2ludHIsIElSUUZfU0hBUkVELCAid2FuWEwiLCBjYXJkKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YW5YTCAlczogY291bGQgbm90IGFsbG9jYXRlIElSUSVpLlxuIiwKLQkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT5pcnEpOworCQlwcl93YXJuKCIlczogY291bGQgbm90IGFsbG9jYXRlIElSUSVpXG4iLAorCQkJcGNpX25hbWUocGRldiksIHBkZXYtPmlycSk7CiAJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTc3NSw4ICs3NzAsOCBAQAogCQlwb3J0X3QgKnBvcnQgPSAmY2FyZC0+cG9ydHNbaV07CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19oZGxjZGV2KHBvcnQpOwogCQlpZiAoIWRldikgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ3YW5YTCAlczogdW5hYmxlIHRvIGFsbG9jYXRlIgotCQkJICAgICAgICIgbWVtb3J5XG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLAorCQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKIAkJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTc5Miw4ICs3ODcsOCBAQAogCQlwb3J0LT5ub2RlID0gaTsKIAkJZ2V0X3N0YXR1cyhwb3J0KS0+Y2xvY2tpbmcgPSBDTE9DS19FWFQ7CiAJCWlmIChyZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIndhblhMICVzOiB1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyIKLQkJCSAgICAgICAiIGRldmljZVxuIiwgcGNpX25hbWUocGRldikpOworCQkJcHJfZXJyKCIlczogdW5hYmxlIHRvIHJlZ2lzdGVyIGhkbGMgZGV2aWNlXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKIAkJCWZyZWVfbmV0ZGV2KGRldik7CiAJCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKIAkJCXJldHVybiAtRU5PQlVGUzsKQEAgLTgwMSwxMSArNzk2LDExIEBACiAJCWNhcmQtPm5fcG9ydHMrKzsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJ3YW5YTCAlczogcG9ydCIsIHBjaV9uYW1lKHBkZXYpKTsKKwlwcl9pbmZvKCIlczogcG9ydCIsIHBjaV9uYW1lKHBkZXYpKTsKIAlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKykKLQkJcHJpbnRrKCIlcyAjJWk6ICVzIiwgaSA/ICIsIiA6ICIiLCBpLAotCQkgICAgICAgY2FyZC0+cG9ydHNbaV0uZGV2LT5uYW1lKTsKLQlwcmludGsoIlxuIik7CisJCXByX2NvbnQoIiVzICMlaTogJXMiLAorCQkJaSA/ICIsIiA6ICIiLCBpLCBjYXJkLT5wb3J0c1tpXS5kZXYtPm5hbWUpOworCXByX2NvbnQoIlxuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKykKIAkJd2FueGxfY2FibGVfaW50cigmY2FyZC0+cG9ydHNbaV0pOyAvKiBnZXQgY2FycmllciBzdGF0dXMgZXRjLiovCkBAIC04MzUsNyArODMwLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IHdhbnhsX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAjaWZkZWYgTU9EVUxFCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOworCXByX2luZm8oIiVzXG4iLCB2ZXJzaW9uKTsKICNlbmRpZgogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ3YW54bF9wY2lfZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMgYi9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5jCmluZGV4IDI0Mjk3YjIuLjQ2Y2ViM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuYwpAQCAtMTQsNiArMTQsOCBAQAogICoJMjAwMC0xMC0yOQlIZW5uZXIgRWlzZW4JbGFwYl9kYXRhX2luZGljYXRpb24oKSByZXR1cm4gc3RhdHVzLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtOTYsNyArOTgsNyBAQAogCQkJeDI1X2FzeV9kZXZzW2ldID0gZGV2OwogCQkJcmV0dXJuIHNsOwogCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAieDI1X2FzeV9hbGxvYygpIC0gcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbHVyZS5cbiIpOworCQkJcHJfd2FybigiJXMoKTogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbHVyZVxuIiwgX19mdW5jX18pOwogCQkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJfQogCX0KQEAgLTExNCw4ICsxMTYsNyBAQAogCXNsLT54YnVmZiA9IE5VTEw7CiAKIAlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTTEZfSU5VU0UsICZzbC0+ZmxhZ3MpKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB4MjVfYXN5X2ZyZWUgZm9yIGFscmVhZHkgZnJlZSB1bml0LlxuIiwKLQkJCXNsLT5kZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKHNsLT5kZXYsICJ4MjVfYXN5X2ZyZWUgZm9yIGFscmVhZHkgZnJlZSB1bml0XG4iKTsKIH0KIAogc3RhdGljIGludCB4MjVfYXN5X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld210dSkKQEAgLTEyOCw4ICsxMjksNyBAQAogCXJidWZmID0ga21hbGxvYyhsZW4gKyA0LCBHRlBfQVRPTUlDKTsKIAogCWlmICh4YnVmZiA9PSBOVUxMIHx8IHJidWZmID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBncm93IFguMjUgYnVmZmVycywgTVRVIGNoYW5nZSBjYW5jZWxsZWQuXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X3dhcm4oZGV2LCAidW5hYmxlIHRvIGdyb3cgWC4yNSBidWZmZXJzLCBNVFUgY2hhbmdlIGNhbmNlbGxlZFxuIik7CiAJCWtmcmVlKHhidWZmKTsKIAkJa2ZyZWUocmJ1ZmYpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE5OCw4ICsxOTgsNyBAQAogCiAJc2tiID0gZGV2X2FsbG9jX3NrYihjb3VudCsxKTsKIAlpZiAoc2tiID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAotCQkJc2wtPmRldi0+bmFtZSk7CisJCW5ldGRldl93YXJuKHNsLT5kZXYsICJtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0XG4iKTsKIAkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCXJldHVybjsKIAl9CkBAIC0yODcsOSArMjg2LDkgQEAKIAkJLyogTWF5IGJlIHdlIG11c3QgY2hlY2sgdHJhbnNtaXR0ZXIgdGltZW91dCBoZXJlID8KIAkJICogICAgICAxNCBPY3QgMTk5NCBEbWl0cnkgR29yb2RjaGFuaW4uCiAJCSAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCAlcz9cbiIsIGRldi0+bmFtZSwKLQkJICAgICAgICh0dHlfY2hhcnNfaW5fYnVmZmVyKHNsLT50dHkpIHx8IHNsLT54bGVmdCkgPwotCQkgICAgICAgImJhZCBsaW5lIHF1YWxpdHkiIDogImRyaXZlciBlcnJvciIpOworCQluZXRkZXZfd2FybihkZXYsICJ0cmFuc21pdCB0aW1lZCBvdXQsICVzP1xuIiwKKwkJCSAgICAodHR5X2NoYXJzX2luX2J1ZmZlcihzbC0+dHR5KSB8fCBzbC0+eGxlZnQpID8KKwkJCSAgICAiYmFkIGxpbmUgcXVhbGl0eSIgOiAiZHJpdmVyIGVycm9yIik7CiAJCXNsLT54bGVmdCA9IDA7CiAJCWNsZWFyX2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmc2wtPnR0eS0+ZmxhZ3MpOwogCQl4MjVfYXN5X3VubG9jayhzbCk7CkBAIC0zMDYsOCArMzA1LDcgQEAKIAlpbnQgZXJyOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKHNsLT5kZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHhtaXQgY2FsbCB3aGVuIGlmYWNlIGlzIGRvd25cbiIsCi0JCQlkZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKGRldiwgInhtaXQgY2FsbCB3aGVuIGlmYWNlIGlzIGRvd25cbiIpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9CkBAIC0zMTgsMTMgKzMxNiwxNSBAQAogCWNhc2UgWDI1X0lGQUNFX0NPTk5FQ1Q6IC8qIENvbm5lY3Rpb24gcmVxdWVzdCAuLiBkbyBub3RoaW5nICovCiAJCWVyciA9IGxhcGJfY29ubmVjdF9yZXF1ZXN0KGRldik7CiAJCWlmIChlcnIgIT0gTEFQQl9PSykKLQkJCXByaW50ayhLRVJOX0VSUiAieDI1X2FzeTogbGFwYl9jb25uZWN0X3JlcXVlc3QgZXJyb3IgLSAlZFxuIiwgZXJyKTsKKwkJCW5ldGRldl9lcnIoZGV2LCAibGFwYl9jb25uZWN0X3JlcXVlc3QgZXJyb3I6ICVkXG4iLAorCQkJCSAgIGVycik7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCWNhc2UgWDI1X0lGQUNFX0RJU0NPTk5FQ1Q6IC8qIGRvIG5vdGhpbmcgLSBoYW5nIHVwID8/ICovCiAJCWVyciA9IGxhcGJfZGlzY29ubmVjdF9yZXF1ZXN0KGRldik7CiAJCWlmIChlcnIgIT0gTEFQQl9PSykKLQkJCXByaW50ayhLRVJOX0VSUiAieDI1X2FzeTogbGFwYl9kaXNjb25uZWN0X3JlcXVlc3QgZXJyb3IgLSAlZFxuIiwgZXJyKTsKKwkJCW5ldGRldl9lcnIoZGV2LCAibGFwYl9kaXNjb25uZWN0X3JlcXVlc3QgZXJyb3I6ICVkXG4iLAorCQkJCSAgIGVycik7CiAJZGVmYXVsdDoKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiBORVRERVZfVFhfT0s7CkBAIC0zNDMsNyArMzQzLDcgQEAKIAogCWVyciA9IGxhcGJfZGF0YV9yZXF1ZXN0KGRldiwgc2tiKTsKIAlpZiAoZXJyICE9IExBUEJfT0spIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ4MjVfYXN5OiBsYXBiX2RhdGFfcmVxdWVzdCBlcnJvciAtICVkXG4iLCBlcnIpOworCQluZXRkZXZfZXJyKGRldiwgImxhcGJfZGF0YV9yZXF1ZXN0IGVycm9yOiAlZFxuIiwgZXJyKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQpAQCAtMzc4LDcgKzM3OCw3IEBACiAJc3Bpbl9sb2NrKCZzbC0+bG9jayk7CiAJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoc2wtPmRldikgfHwgc2wtPnR0eSA9PSBOVUxMKSB7CiAJCXNwaW5fdW5sb2NrKCZzbC0+bG9jayk7Ci0JCXByaW50ayhLRVJOX0VSUiAieDI1X2FzeTogdGJ1c3kgZHJvcFxuIik7CisJCW5ldGRldl9lcnIoZGV2LCAidGJ1c3kgZHJvcFxuIik7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm47CiAJfQpAQCAtNDA0LDcgKzQwNCw3IEBACiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKDEpOwogCWlmIChza2IgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIngyNV9hc3k6IG91dCBvZiBtZW1vcnlcbiIpOworCQluZXRkZXZfZXJyKGRldiwgIm91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC00MjMsNyArNDIzLDcgQEAKIAogCXNrYiA9IGRldl9hbGxvY19za2IoMSk7CiAJaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAieDI1X2FzeTogb3V0IG9mIG1lbW9yeVxuIik7CisJCW5ldGRldl9lcnIoZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTYwMyw4ICs2MDMsOCBAQAogCiAJZXJyID0gbGFwYl91bnJlZ2lzdGVyKHNsLT5kZXYpOwogCWlmIChlcnIgIT0gTEFQQl9PSykKLQkJcHJpbnRrKEtFUk5fRVJSICJ4MjVfYXN5X2Nsb3NlOiBsYXBiX3VucmVnaXN0ZXIgZXJyb3IgLSVkXG4iLAotCQkJZXJyKTsKKwkJcHJfZXJyKCJ4MjVfYXN5X2Nsb3NlOiBsYXBiX3VucmVnaXN0ZXIgZXJyb3I6ICVkXG4iLAorCQkgICAgICAgZXJyKTsKIAogCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKIAlzbC0+dHR5ID0gTlVMTDsKQEAgLTc4MiwxNCArNzgyLDEzIEBACiAJaWYgKHgyNV9hc3lfbWF4ZGV2IDwgNCkKIAkJeDI1X2FzeV9tYXhkZXYgPSA0OyAvKiBTYW5pdHkgKi8KIAotCXByaW50ayhLRVJOX0lORk8gIlguMjUgYXN5bmM6IHZlcnNpb24gMC4wMCBBTFBIQSAiCi0JCQkiKGR5bmFtaWMgY2hhbm5lbHMsIG1heD0lZCkuXG4iLCB4MjVfYXN5X21heGRldik7CisJcHJfaW5mbygiWC4yNSBhc3luYzogdmVyc2lvbiAwLjAwIEFMUEhBIChkeW5hbWljIGNoYW5uZWxzLCBtYXg9JWQpXG4iLAorCQl4MjVfYXN5X21heGRldik7CiAKIAl4MjVfYXN5X2RldnMgPSBrY2FsbG9jKHgyNV9hc3lfbWF4ZGV2LCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UgKiksCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCF4MjVfYXN5X2RldnMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiWDI1IGFzeW5jOiBDYW4ndCBhbGxvY2F0ZSB4MjVfYXN5X2N0cmxzW10gIgotCQkJCSJhcnJheSEgVWFhcmdoISAoLT4gTm8gWC4yNSBhdmFpbGFibGUpXG4iKTsKKwkJcHJfd2FybigiQ2FuJ3QgYWxsb2NhdGUgeDI1X2FzeV9jdHJsc1tdIGFycmF5ISBVYWFyZ2ghICgtPiBObyBYLjI1IGF2YWlsYWJsZSlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYyBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYwppbmRleCAwODA2MjMyLi4wZTU3NjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5jCkBAIC0zNiw2ICszNiw4IEBACiAgKglTeW5jaHJvbm91cyBtb2RlIHdpdGhvdXQgRE1BIGlzIHVubGlrZWx5IHRvIHBhc3MgYWJvdXQgMjQwMCBiYXVkLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC0zNjUsNyArMzY3LDcgQEAKIAkJCQljLT5jb3VudD0wOwogCQkJCWlmKHN0YXQmUnhfT1ZSKQogCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG92ZXJydW5cbiIsIGMtPmRldi0+bmFtZSk7CisJCQkJCXByX3dhcm4oIiVzOiBvdmVycnVuXG4iLCBjLT5kZXYtPm5hbWUpOwogCQkJCQljLT5yeF9vdmVycnVuKys7CiAJCQkJfQogCQkJCWlmKHN0YXQmQ1JDX0VSUikKQEAgLTQ2NCwxMiArNDY2LDEyIEBACiAJaWYgKGFsdGVyZWQgJiBjaGFuLT5kY2RjaGVjaykKIAl7CiAJCWlmIChzdGF0dXMgJiBjaGFuLT5kY2RjaGVjaykgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCByYWlzZWRcbiIsIGNoYW4tPmRldi0+bmFtZSk7CisJCQlwcl9pbmZvKCIlczogRENEIHJhaXNlZFxuIiwgY2hhbi0+ZGV2LT5uYW1lKTsKIAkJCXdyaXRlX3pzcmVnKGNoYW4sIFIzLCBjaGFuLT5yZWdzWzNdIHwgUnhFTkFCTEUpOwogCQkJaWYgKGNoYW4tPm5ldGRldmljZSkKIAkJCQluZXRpZl9jYXJyaWVyX29uKGNoYW4tPm5ldGRldmljZSk7CiAJCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogRENEIGxvc3RcbiIsIGNoYW4tPmRldi0+bmFtZSk7CisJCQlwcl9pbmZvKCIlczogRENEIGxvc3RcbiIsIGNoYW4tPmRldi0+bmFtZSk7CiAJCQl3cml0ZV96c3JlZyhjaGFuLCBSMywgY2hhbi0+cmVnc1szXSAmIH5SeEVOQUJMRSk7CiAJCQl6ODUzMF9mbHVzaF9maWZvKGNoYW4pOwogCQkJaWYgKGNoYW4tPm5ldGRldmljZSkKQEAgLTUzOCwxMiArNTQwLDEyIEBACiB7CiAJaWYoIWNoYW4tPmRtYV90eCkKIAl7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkhleSB3aG8gdHVybmVkIHRoZSBETUEgb2ZmP1xuIik7CisJCXByX3dhcm4oIkhleSB3aG8gdHVybmVkIHRoZSBETUEgb2ZmP1xuIik7CiAJCXo4NTMwX3R4KGNoYW4pOwogCQlyZXR1cm47CiAJfQogCS8qIFRoaXMgc2hvdWxkbid0IG9jY3VyIGluIERNQSBtb2RlICovCi0JcHJpbnRrKEtFUk5fRVJSICJETUEgdHggLSBib2d1cyBldmVudCFcbiIpOworCXByX2VycigiRE1BIHR4IC0gYm9ndXMgZXZlbnQhXG4iKTsKIAl6ODUzMF90eChjaGFuKTsKIH0KIApAQCAtNTg1LDEyICs1ODcsMTIgQEAKIAlpZiAoYWx0ZXJlZCAmIGNoYW4tPmRjZGNoZWNrKQogCXsKIAkJaWYgKHN0YXR1cyAmIGNoYW4tPmRjZGNoZWNrKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogRENEIHJhaXNlZFxuIiwgY2hhbi0+ZGV2LT5uYW1lKTsKKwkJCXByX2luZm8oIiVzOiBEQ0QgcmFpc2VkXG4iLCBjaGFuLT5kZXYtPm5hbWUpOwogCQkJd3JpdGVfenNyZWcoY2hhbiwgUjMsIGNoYW4tPnJlZ3NbM10gfCBSeEVOQUJMRSk7CiAJCQlpZiAoY2hhbi0+bmV0ZGV2aWNlKQogCQkJCW5ldGlmX2NhcnJpZXJfb24oY2hhbi0+bmV0ZGV2aWNlKTsKIAkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOkRDRCBsb3N0XG4iLCBjaGFuLT5kZXYtPm5hbWUpOworCQkJcHJfaW5mbygiJXM6IERDRCBsb3N0XG4iLCBjaGFuLT5kZXYtPm5hbWUpOwogCQkJd3JpdGVfenNyZWcoY2hhbiwgUjMsIGNoYW4tPnJlZ3NbM10gJiB+UnhFTkFCTEUpOwogCQkJejg1MzBfZmx1c2hfZmlmbyhjaGFuKTsKIAkJCWlmIChjaGFuLT5uZXRkZXZpY2UpCkBAIC03MTIsNyArNzE0LDcgQEAKIAkKIAlpZihsb2NrZXIpCiAJewotCQlwcmludGsoS0VSTl9FUlIgIklSUSByZS1lbnRlclxuIik7CisJCXByX2VycigiSVJRIHJlLWVudGVyXG4iKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIAlsb2NrZXI9MTsKQEAgLTc1OCw3ICs3NjAsOCBAQAogCX0KIAlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsKIAlpZih3b3JrPT01MDAwKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnRlcnJ1cHQgamFtbWVkIC0gYWJvcnQoMHglWCkhXG4iLCBkZXYtPm5hbWUsIGludHIpOworCQlwcl9lcnIoIiVzOiBpbnRlcnJ1cHQgamFtbWVkIC0gYWJvcnQoMHglWCkhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpbnRyKTsKIAkvKiBPayBhbGwgZG9uZSAqLwogCWxvY2tlcj0wOwogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTEyMjUsNyArMTIyOCw3IEBACiAKIHZvaWQgejg1MzBfZGVzY3JpYmUoc3RydWN0IHo4NTMwX2RldiAqZGV2LCBjaGFyICptYXBwaW5nLCB1bnNpZ25lZCBsb25nIGlvKQogewotCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBmb3VuZCBhdCAlcyAweCVsWCwgSVJRICVkLlxuIiwKKwlwcl9pbmZvKCIlczogJXMgZm91bmQgYXQgJXMgMHglbFgsIElSUSAlZFxuIiwKIAkJZGV2LT5uYW1lLCAKIAkJejg1MzBfdHlwZV9uYW1lW2Rldi0+dHlwZV0sCiAJCW1hcHBpbmcsCkBAIC0xNjIxLDggKzE2MjQsNyBAQAogCQllbHNlCiAJCQkvKiBDYW4ndCBvY2N1ciBhcyB3ZSBkb250IHJlZW5hYmxlIHRoZSBETUEgaXJxIHVudGlsCiAJCQkgICBhZnRlciB0aGUgZmxpcCBpcyBkb25lICovCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRE1BIGZsaXAgb3ZlcnJ1biFcbiIsCi0JCQkgICAgICAgYy0+bmV0ZGV2aWNlLT5uYW1lKTsKKwkJCW5ldGRldl93YXJuKGMtPm5ldGRldmljZSwgIkRNQSBmbGlwIG92ZXJydW4hXG4iKTsKIAogCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKIApAQCAtMTYzNyw4ICsxNjM5LDcgQEAKIAkJc2tiID0gZGV2X2FsbG9jX3NrYihjdCk7CiAJCWlmIChza2IgPT0gTlVMTCkgewogCQkJYy0+bmV0ZGV2aWNlLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUuXG4iLAotCQkJICAgICAgIGMtPm5ldGRldmljZS0+bmFtZSk7CisJCQluZXRkZXZfd2FybihjLT5uZXRkZXZpY2UsICJNZW1vcnkgc3F1ZWV6ZVxuIik7CiAJCX0gZWxzZSB7CiAJCQlza2JfcHV0KHNrYiwgY3QpOwogCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCByeGIsIGN0KTsKQEAgLTE2NzgsOCArMTY3OSw3IEBACiAKIAkJYy0+c2tiMiA9IGRldl9hbGxvY19za2IoYy0+bXR1KTsKIAkJaWYgKGMtPnNrYjIgPT0gTlVMTCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZW1vcnkgc3F1ZWV6ZS5cbiIsCi0JCQkgICAgICAgYy0+bmV0ZGV2aWNlLT5uYW1lKTsKKwkJCW5ldGRldl93YXJuKGMtPm5ldGRldmljZSwgIm1lbW9yeSBzcXVlZXplXG4iKTsKIAkJZWxzZQogCQkJc2tiX3B1dChjLT5za2IyLCBjLT5tdHUpOwogCQljLT5uZXRkZXZpY2UtPnN0YXRzLnJ4X3BhY2tldHMrKzsKQEAgLTE2OTMsNyArMTY5Myw3IEBACiAJCWMtPnJ4X2Z1bmN0aW9uKGMsIHNrYik7CiAJfSBlbHNlIHsKIAkJYy0+bmV0ZGV2aWNlLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IExvc3QgYSBmcmFtZVxuIiwgYy0+bmV0ZGV2aWNlLT5uYW1lKTsKKwkJbmV0ZGV2X2VycihjLT5uZXRkZXZpY2UsICJMb3N0IGEgZnJhbWVcbiIpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS5jCmluZGV4IGFmZTJjYmMuLjQzZWJjNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FkbTgyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hZG04MjExLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aC5oCmluZGV4IDdjZjQzMTcuLjE3YzRiNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoLmgKQEAgLTE2MSw2ICsxNjEsNyBAQAogCWNvbnN0IHN0cnVjdCBhdGhfYnVzX29wcyAqYnVzX29wczsKIAogCWJvb2wgYnRjb2V4X2VuYWJsZWQ7CisJYm9vbCBkaXNhYmxlX2FuaTsKIH07CiAKIHN0cnVjdCBza19idWZmICphdGhfcnhidWZfYWxsb2Moc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9haGIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9haGIuYwppbmRleCBlYTk5ODI3Li5hMmExNjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYWhiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FoYi5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJiYXNlLmgiCiAjaW5jbHVkZSAicmVnLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKIAogLyogcmV0dXJuIGJ1cyBjYWNoZXNpemUgaW4gNEIgd29yZCB1bml0cyAqLwogc3RhdGljIHZvaWQgYXRoNWtfYWhiX3JlYWRfY2FjaGVzaXplKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sIGludCAqY3N6KQpAQCAtMzUsOCArMzQsOCBAQAogc3RhdGljIGJvb2wKIGF0aDVrX2FoYl9lZXByb21fcmVhZChzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uLCB1MzIgb2ZmLCB1MTYgKmRhdGEpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGNvbW1vbi0+cHJpdjsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKHNjLT5kZXYpOworCXN0cnVjdCBhdGg1a19odyAqYWggPSBjb21tb24tPnByaXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShhaC0+ZGV2KTsKIAlzdHJ1Y3QgYXIyMzF4X2JvYXJkX2NvbmZpZyAqYmNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXUxNiAqZWVwcm9tLCAqZWVwcm9tX2VuZDsKIApAQCAtNTYsOCArNTUsNyBAQAogCiBpbnQgYXRoNWtfaHdfcmVhZF9zcmV2KHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGFoLT5haF9zYzsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKHNjLT5kZXYpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoYWgtPmRldik7CiAJc3RydWN0IGFyMjMxeF9ib2FyZF9jb25maWcgKmJjZmcgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlhaC0+YWhfbWFjX3NyZXYgPSBiY2ZnLT5kZXZpZDsKIAlyZXR1cm4gMDsKQEAgLTY1LDEyICs2MywxMSBAQAogCiBzdGF0aWMgaW50IGF0aDVrX2FoYl9lZXByb21fcmVhZF9tYWMoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggKm1hYykKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gYWgtPmFoX3NjOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2Uoc2MtPmRldik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShhaC0+ZGV2KTsKIAlzdHJ1Y3QgYXIyMzF4X2JvYXJkX2NvbmZpZyAqYmNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXU4ICpjZmdfbWFjOwogCi0JaWYgKHRvX3BsYXRmb3JtX2RldmljZShzYy0+ZGV2KS0+aWQgPT0gMCkKKwlpZiAodG9fcGxhdGZvcm1fZGV2aWNlKGFoLT5kZXYpLT5pZCA9PSAwKQogCQljZmdfbWFjID0gYmNmZy0+Y29uZmlnLT53bGFuMF9tYWM7CiAJZWxzZQogCQljZmdfbWFjID0gYmNmZy0+Y29uZmlnLT53bGFuMV9tYWM7CkBAIC05MCw3ICs4Nyw3IEBACiBzdGF0aWMgaW50IGF0aF9haGJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgYXIyMzF4X2JvYXJkX2NvbmZpZyAqYmNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2M7CisJc3RydWN0IGF0aDVrX2h3ICphaDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAl2b2lkIF9faW9tZW0gKm1lbTsKQEAgLTEyNywxOSArMTI0LDE5IEBACiAKIAlpcnEgPSByZXMtPnN0YXJ0OwogCi0JaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBhdGg1a19zb2Z0YyksICZhdGg1a19od19vcHMpOworCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZihzdHJ1Y3QgYXRoNWtfaHcpLCAmYXRoNWtfaHdfb3BzKTsKIAlpZiAoaHcgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtZW1vcnkgZm9yIGllZWU4MDIxMV9od1xuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dDsKIAl9CiAKLQlzYyA9IGh3LT5wcml2OwotCXNjLT5odyA9IGh3OwotCXNjLT5kZXYgPSAmcGRldi0+ZGV2OwotCXNjLT5pb2Jhc2UgPSBtZW07Ci0Jc2MtPmlycSA9IGlycTsKLQlzYy0+ZGV2aWQgPSBiY2ZnLT5kZXZpZDsKKwlhaCA9IGh3LT5wcml2OworCWFoLT5odyA9IGh3OworCWFoLT5kZXYgPSAmcGRldi0+ZGV2OworCWFoLT5pb2Jhc2UgPSBtZW07CisJYWgtPmlycSA9IGlycTsKKwlhaC0+ZGV2aWQgPSBiY2ZnLT5kZXZpZDsKIAogCWlmIChiY2ZnLT5kZXZpZCA+PSBBUjVLX1NSRVZfQVIyMzE1X1I2KSB7CiAJCS8qIEVuYWJsZSBXTUFDIEFIQiBhcmJpdHJhdGlvbiAqLwpAQCAtMTU1LDcgKzE1Miw3IEBACiAJCS8qIEVuYWJsZSBXTUFDIERNQSBhY2Nlc3MgKGFzc3VtaW5nIDUzMTIgb3IgMjMxeCovCiAJCS8qIFRPRE86IGNoZWNrIG90aGVyIHBsYXRmb3JtcyAqLwogCQlyZWcgPSBfX3Jhd19yZWFkbCgodm9pZCBfX2lvbWVtICopIEFSNUtfQVI1MzEyX0VOQUJMRSk7Ci0JCWlmICh0b19wbGF0Zm9ybV9kZXZpY2Uoc2MtPmRldiktPmlkID09IDApCisJCWlmICh0b19wbGF0Zm9ybV9kZXZpY2UoYWgtPmRldiktPmlkID09IDApCiAJCQlyZWcgfD0gQVI1S19BUjUzMTJfRU5BQkxFX1dMQU4wOwogCQllbHNlCiAJCQlyZWcgfD0gQVI1S19BUjUzMTJfRU5BQkxFX1dMQU4xOwpAQCAtMTY2LDEzICsxNjMsMTMgQEAKIAkJICogdXNlZCBhcyBwYXNzLXRocm91Z2guIERpc2FibGUgMiBHSHogc3VwcG9ydCBpbiB0aGUKIAkJICogZHJpdmVyIGZvciBpdAogCQkgKi8KLQkJaWYgKHRvX3BsYXRmb3JtX2RldmljZShzYy0+ZGV2KS0+aWQgPT0gMCAmJgotCQkgICAgKGJjZmctPmNvbmZpZy0+ZmxhZ3MgJiAoQkRfV0xBTjB8QkRfV0xBTjEpKSA9PQotCQkgICAgIChCRF9XTEFOMXxCRF9XTEFOMCkpCi0JCQlfX3NldF9iaXQoQVRIX1NUQVRfMkdfRElTQUJMRUQsIHNjLT5zdGF0dXMpOworCQlpZiAodG9fcGxhdGZvcm1fZGV2aWNlKGFoLT5kZXYpLT5pZCA9PSAwICYmCisJCSAgICAoYmNmZy0+Y29uZmlnLT5mbGFncyAmIChCRF9XTEFOMCB8IEJEX1dMQU4xKSkgPT0KKwkJICAgICAoQkRfV0xBTjEgfCBCRF9XTEFOMCkpCisJCQlfX3NldF9iaXQoQVRIX1NUQVRfMkdfRElTQUJMRUQsIGFoLT5zdGF0dXMpOwogCX0KIAotCXJldCA9IGF0aDVrX2luaXRfc29mdGMoc2MsICZhdGhfYWhiX2J1c19vcHMpOworCXJldCA9IGF0aDVrX2luaXRfc29mdGMoYWgsICZhdGhfYWhiX2J1c19vcHMpOwogCWlmIChyZXQgIT0gMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYXR0YWNoIGRldmljZSwgZXJyPSVkXG4iLCByZXQpOwogCQlyZXQgPSAtRU5PREVWOwpAQCAtMTk0LDEzICsxOTEsMTMgQEAKIHsKIAlzdHJ1Y3QgYXIyMzF4X2JvYXJkX2NvbmZpZyAqYmNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYzsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoOwogCXUzMiByZWc7CiAKIAlpZiAoIWh3KQogCQlyZXR1cm4gMDsKIAotCXNjID0gaHctPnByaXY7CisJYWggPSBody0+cHJpdjsKIAogCWlmIChiY2ZnLT5kZXZpZCA+PSBBUjVLX1NSRVZfQVIyMzE1X1I2KSB7CiAJCS8qIERpc2FibGUgV01BQyBBSEIgYXJiaXRyYXRpb24gKi8KQEAgLTIxMCwxNSArMjA3LDE2IEBACiAJfSBlbHNlIHsKIAkJLypTdG9wIERNQSBhY2Nlc3MgKi8KIAkJcmVnID0gX19yYXdfcmVhZGwoKHZvaWQgX19pb21lbSAqKSBBUjVLX0FSNTMxMl9FTkFCTEUpOwotCQlpZiAodG9fcGxhdGZvcm1fZGV2aWNlKHNjLT5kZXYpLT5pZCA9PSAwKQorCQlpZiAodG9fcGxhdGZvcm1fZGV2aWNlKGFoLT5kZXYpLT5pZCA9PSAwKQogCQkJcmVnICY9IH5BUjVLX0FSNTMxMl9FTkFCTEVfV0xBTjA7CiAJCWVsc2UKIAkJCXJlZyAmPSB+QVI1S19BUjUzMTJfRU5BQkxFX1dMQU4xOwogCQlfX3Jhd193cml0ZWwocmVnLCAodm9pZCBfX2lvbWVtICopIEFSNUtfQVI1MzEyX0VOQUJMRSk7CiAJfQogCi0JYXRoNWtfZGVpbml0X3NvZnRjKHNjKTsKKwlhdGg1a19kZWluaXRfc29mdGMoYWgpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWllZWU4MDIxMV9mcmVlX2h3KGh3KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5jCmluZGV4IGY5MTVmNDAuLjYwM2FlMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hbmkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYW5pLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAlzdGF0aWMgY29uc3QgczggZnJbXSA9IHsgLTc4LCAtODAgfTsKICNlbmRpZgogCWlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPj0gQVJSQVlfU0laRShzeikpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgIm5vaXNlIGltbXVuaXkgbGV2ZWwgJWQgb3V0IG9mIHJhbmdlIiwKKwkJQVRINUtfRVJSKGFoLCAibm9pc2UgaW1tdW5pdHkgbGV2ZWwgJWQgb3V0IG9mIHJhbmdlIiwKIAkJCSAgbGV2ZWwpOwogCQlyZXR1cm47CiAJfQpAQCAtODgsOCArODgsOCBAQAogCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX1NJRywKIAkJCQlBUjVLX1BIWV9TSUdfRklSUFdSLCBmcltsZXZlbF0pOwogCi0JYWgtPmFoX3NjLT5hbmlfc3RhdGUubm9pc2VfaW1tX2xldmVsID0gbGV2ZWw7Ci0JQVRINUtfREJHX1VOTElNSVQoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19BTkksICJuZXcgbGV2ZWwgJWQiLCBsZXZlbCk7CisJYWgtPmFuaV9zdGF0ZS5ub2lzZV9pbW1fbGV2ZWwgPSBsZXZlbDsKKwlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQU5JLCAibmV3IGxldmVsICVkIiwgbGV2ZWwpOwogfQogCiAKQEAgLTEwNSw4ICsxMDUsOCBAQAogCXN0YXRpYyBjb25zdCBpbnQgdmFsW10gPSB7IDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2IH07CiAKIAlpZiAobGV2ZWwgPCAwIHx8IGxldmVsID49IEFSUkFZX1NJWkUodmFsKSB8fAotCSAgICBsZXZlbCA+IGFoLT5haF9zYy0+YW5pX3N0YXRlLm1heF9zcHVyX2xldmVsKSB7Ci0JCUFUSDVLX0VSUihhaC0+YWhfc2MsICJzcHVyIGltbXVuaXR5IGxldmVsICVkIG91dCBvZiByYW5nZSIsCisJICAgIGxldmVsID4gYWgtPmFuaV9zdGF0ZS5tYXhfc3B1cl9sZXZlbCkgeworCQlBVEg1S19FUlIoYWgsICJzcHVyIGltbXVuaXR5IGxldmVsICVkIG91dCBvZiByYW5nZSIsCiAJCQkgIGxldmVsKTsKIAkJcmV0dXJuOwogCX0KQEAgLTExNCw4ICsxMTQsOCBAQAogCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX09GRE1fU0VMRkNPUlIsCiAJCUFSNUtfUEhZX09GRE1fU0VMRkNPUlJfQ1lQV1JfVEhSMSwgdmFsW2xldmVsXSk7CiAKLQlhaC0+YWhfc2MtPmFuaV9zdGF0ZS5zcHVyX2xldmVsID0gbGV2ZWw7Ci0JQVRINUtfREJHX1VOTElNSVQoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19BTkksICJuZXcgbGV2ZWwgJWQiLCBsZXZlbCk7CisJYWgtPmFuaV9zdGF0ZS5zcHVyX2xldmVsID0gbGV2ZWw7CisJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0FOSSwgIm5ldyBsZXZlbCAlZCIsIGxldmVsKTsKIH0KIAogCkBAIC0xMzAsMTUgKzEzMCwxNSBAQAogCXN0YXRpYyBjb25zdCBpbnQgdmFsW10gPSB7IDAsIDQsIDggfTsKIAogCWlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPj0gQVJSQVlfU0laRSh2YWwpKSB7Ci0JCUFUSDVLX0VSUihhaC0+YWhfc2MsICJmaXJzdGVwIGxldmVsICVkIG91dCBvZiByYW5nZSIsIGxldmVsKTsKKwkJQVRINUtfRVJSKGFoLCAiZmlyc3RlcCBsZXZlbCAlZCBvdXQgb2YgcmFuZ2UiLCBsZXZlbCk7CiAJCXJldHVybjsKIAl9CiAKIAlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9TSUcsCiAJCQkJQVI1S19QSFlfU0lHX0ZJUlNURVAsIHZhbFtsZXZlbF0pOwogCi0JYWgtPmFoX3NjLT5hbmlfc3RhdGUuZmlyc3RlcF9sZXZlbCA9IGxldmVsOwotCUFUSDVLX0RCR19VTkxJTUlUKGFoLT5haF9zYywgQVRINUtfREVCVUdfQU5JLCAibmV3IGxldmVsICVkIiwgbGV2ZWwpOworCWFoLT5hbmlfc3RhdGUuZmlyc3RlcF9sZXZlbCA9IGxldmVsOworCUFUSDVLX0RCR19VTkxJTUlUKGFoLCBBVEg1S19ERUJVR19BTkksICJuZXcgbGV2ZWwgJWQiLCBsZXZlbCk7CiB9CiAKIApAQCAtMTc4LDggKzE3OCw4IEBACiAJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19QSFlfV0VBS19PRkRNX0xPV19USFIsCiAJCQkJQVI1S19QSFlfV0VBS19PRkRNX0xPV19USFJfU0VMRkNPUl9FTik7CiAKLQlhaC0+YWhfc2MtPmFuaV9zdGF0ZS5vZmRtX3dlYWtfc2lnID0gb247Ci0JQVRINUtfREJHX1VOTElNSVQoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19BTkksICJ0dXJuZWQgJXMiLAorCWFoLT5hbmlfc3RhdGUub2ZkbV93ZWFrX3NpZyA9IG9uOworCUFUSDVLX0RCR19VTkxJTUlUKGFoLCBBVEg1S19ERUJVR19BTkksICJ0dXJuZWQgJXMiLAogCQkJICBvbiA/ICJvbiIgOiAib2ZmIik7CiB9CiAKQEAgLTE5NSw4ICsxOTUsOCBAQAogCXN0YXRpYyBjb25zdCBpbnQgdmFsW10gPSB7IDgsIDYgfTsKIAlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9DQ0tfQ1JPU1NDT1JSLAogCQkJCUFSNUtfUEhZX0NDS19DUk9TU0NPUlJfV0VBS19TSUdfVEhSLCB2YWxbb25dKTsKLQlhaC0+YWhfc2MtPmFuaV9zdGF0ZS5jY2tfd2Vha19zaWcgPSBvbjsKLQlBVEg1S19EQkdfVU5MSU1JVChhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX0FOSSwgInR1cm5lZCAlcyIsCisJYWgtPmFuaV9zdGF0ZS5jY2tfd2Vha19zaWcgPSBvbjsKKwlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQU5JLCAidHVybmVkICVzIiwKIAkJCSAgb24gPyAib24iIDogIm9mZiIpOwogfQogCkBAIC0yMTgsNyArMjE4LDcgQEAKIHsKIAlpbnQgcnNzaSA9IGV3bWFfcmVhZCgmYWgtPmFoX2JlYWNvbl9yc3NpX2F2Zyk7CiAKLQlBVEg1S19EQkdfVU5MSU1JVChhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX0FOSSwgInJhaXNlIGltbXVuaXR5ICglcykiLAorCUFUSDVLX0RCR19VTkxJTUlUKGFoLCBBVEg1S19ERUJVR19BTkksICJyYWlzZSBpbW11bml0eSAoJXMpIiwKIAkJb2ZkbV90cmlnZ2VyID8gIk9ERk0iIDogIkNDSyIpOwogCiAJLyogZmlyc3Q6IHJhaXNlIG5vaXNlIGltbXVuaXR5ICovCkBAIC0yMjksMTMgKzIyOSwxMyBAQAogCiAJLyogb25seSBPRkRNOiByYWlzZSBzcHVyIGltbXVuaXR5IGxldmVsICovCiAJaWYgKG9mZG1fdHJpZ2dlciAmJgotCSAgICBhcy0+c3B1cl9sZXZlbCA8IGFoLT5haF9zYy0+YW5pX3N0YXRlLm1heF9zcHVyX2xldmVsKSB7CisJICAgIGFzLT5zcHVyX2xldmVsIDwgYWgtPmFuaV9zdGF0ZS5tYXhfc3B1cl9sZXZlbCkgewogCQlhdGg1a19hbmlfc2V0X3NwdXJfaW1tdW5pdHlfbGV2ZWwoYWgsIGFzLT5zcHVyX2xldmVsICsgMSk7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBBUCBtb2RlICovCi0JaWYgKGFoLT5haF9zYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CisJaWYgKGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKIAkJaWYgKGFzLT5maXJzdGVwX2xldmVsIDwgQVRINUtfQU5JX01BWF9GSVJTVEVQX0xWTCkKIAkJCWF0aDVrX2FuaV9zZXRfZmlyc3RlcF9sZXZlbChhaCwgYXMtPmZpcnN0ZXBfbGV2ZWwgKyAxKTsKIAkJcmV0dXJuOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJICogZG9uJ3Qgc2h1dCBvdXQgYSByZW1vdGUgbm9kZSBieSByYWlzaW5nIGltbXVuaXR5IHRvbyBoaWdoLiAqLwogCiAJaWYgKHJzc2kgPiBBVEg1S19BTklfUlNTSV9USFJfSElHSCkgewotCQlBVEg1S19EQkdfVU5MSU1JVChhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX0FOSSwKKwkJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0FOSSwKIAkJCQkgICJiZWFjb24gUlNTSSBoaWdoIik7CiAJCS8qIG9ubHkgT0ZETTogYmVhY29uIFJTU0kgaXMgaGlnaCwgd2UgY2FuIGRpc2FibGUgT0RGTSB3ZWFrCiAJCSAqIHNpZ25hbCBkZXRlY3Rpb24gKi8KQEAgLTI2NSw3ICsyNjUsNyBAQAogCX0gZWxzZSBpZiAocnNzaSA+IEFUSDVLX0FOSV9SU1NJX1RIUl9MT1cpIHsKIAkJLyogYmVhY29uIFJTU0kgaW4gbWlkIHJhbmdlLCB3ZSBuZWVkIE9GRE0gd2VhayBzaWduYWwgZGV0ZWN0LAogCQkgKiBidXQgY2FuIHJhaXNlIGZpcnN0ZXAgbGV2ZWwgKi8KLQkJQVRINUtfREJHX1VOTElNSVQoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19BTkksCisJCUFUSDVLX0RCR19VTkxJTUlUKGFoLCBBVEg1S19ERUJVR19BTkksCiAJCQkJICAiYmVhY29uIFJTU0kgbWlkIik7CiAJCWlmIChvZmRtX3RyaWdnZXIgJiYgYXMtPm9mZG1fd2Vha19zaWcgPT0gZmFsc2UpCiAJCQlhdGg1a19hbmlfc2V0X29mZG1fd2Vha19zaWduYWxfZGV0ZWN0aW9uKGFoLCB0cnVlKTsKQEAgLTI3NSw3ICsyNzUsNyBAQAogCX0gZWxzZSBpZiAoYWgtPmFoX2N1cnJlbnRfY2hhbm5lbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKSB7CiAJCS8qIGJlYWNvbiBSU1NJIGlzIGxvdy4gaW4gQi9HIG1vZGUgdHVybiBvZiBPRkRNIHdlYWsgc2lnbmFsCiAJCSAqIGRldGVjdCBhbmQgemVybyBmaXJzdGVwIGxldmVsIHRvIG1heGltaXplIENDSyBzZW5zaXRpdml0eSAqLwotCQlBVEg1S19EQkdfVU5MSU1JVChhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX0FOSSwKKwkJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0FOSSwKIAkJCQkgICJiZWFjb24gUlNTSSBsb3csIDJHSHoiKTsKIAkJaWYgKG9mZG1fdHJpZ2dlciAmJiBhcy0+b2ZkbV93ZWFrX3NpZyA9PSB0cnVlKQogCQkJYXRoNWtfYW5pX3NldF9vZmRtX3dlYWtfc2lnbmFsX2RldGVjdGlvbihhaCwgZmFsc2UpOwpAQCAtMzAzLDkgKzMwMyw5IEBACiB7CiAJaW50IHJzc2kgPSBld21hX3JlYWQoJmFoLT5haF9iZWFjb25fcnNzaV9hdmcpOwogCi0JQVRINUtfREJHX1VOTElNSVQoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19BTkksICJsb3dlciBpbW11bml0eSIpOworCUFUSDVLX0RCR19VTkxJTUlUKGFoLCBBVEg1S19ERUJVR19BTkksICJsb3dlciBpbW11bml0eSIpOwogCi0JaWYgKGFoLT5haF9zYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CisJaWYgKGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKIAkJLyogQVAgbW9kZSAqLwogCQlpZiAoYXMtPmZpcnN0ZXBfbGV2ZWwgPiAwKSB7CiAJCQlhdGg1a19hbmlfc2V0X2ZpcnN0ZXBfbGV2ZWwoYWgsIGFzLT5maXJzdGVwX2xldmVsIC0gMSk7CkBAIC00NjQsNyArNDY0LDcgQEAKIHZvaWQKIGF0aDVrX2FuaV9jYWxpYnJhdGlvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCXN0cnVjdCBhdGg1a19hbmlfc3RhdGUgKmFzID0gJmFoLT5haF9zYy0+YW5pX3N0YXRlOworCXN0cnVjdCBhdGg1a19hbmlfc3RhdGUgKmFzID0gJmFoLT5hbmlfc3RhdGU7CiAJaW50IGxpc3Rlbiwgb2ZkbV9oaWdoLCBvZmRtX2xvdywgY2NrX2hpZ2gsIGNja19sb3c7CiAKIAkvKiBnZXQgbGlzdGVuIHRpbWUgc2luY2UgbGFzdCBjYWxsIGFuZCBhZGQgaXQgdG8gdGhlIGNvdW50ZXIgYmVjYXVzZSB3ZQpAQCAtNDgzLDkgKzQ4Myw5IEBACiAJb2ZkbV9sb3cgPSBhcy0+bGlzdGVuX3RpbWUgKiBBVEg1S19BTklfT0ZETV9UUklHX0xPVyAvIDEwMDA7CiAJY2NrX2xvdyA9IGFzLT5saXN0ZW5fdGltZSAqIEFUSDVLX0FOSV9DQ0tfVFJJR19MT1cgLyAxMDAwOwogCi0JQVRINUtfREJHX1VOTElNSVQoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19BTkksCisJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0FOSSwKIAkJImxpc3RlbiAlZCAobm93ICVkKSIsIGFzLT5saXN0ZW5fdGltZSwgbGlzdGVuKTsKLQlBVEg1S19EQkdfVU5MSU1JVChhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX0FOSSwKKwlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQU5JLAogCQkiY2hlY2sgaGlnaCBvZmRtICVkLyVkIGNjayAlZC8lZCIsCiAJCWFzLT5vZmRtX2Vycm9ycywgb2ZkbV9oaWdoLCBhcy0+Y2NrX2Vycm9ycywgY2NrX2hpZ2gpOwogCkBAIC00OTgsNyArNDk4LDcgQEAKIAl9IGVsc2UgaWYgKGFzLT5saXN0ZW5fdGltZSA+IDUgKiBBVEg1S19BTklfTElTVEVOX1BFUklPRCkgewogCQkvKiBJZiBtb3JlIHRoYW4gNSAoVE9ETzogd2h5IDU/KSBwZXJpb2RzIGhhdmUgcGFzc2VkIGFuZCB3ZSBnb3QKIAkJICogcmVsYXRpdmVseSBsaXR0bGUgZXJyb3JzIHdlIGNhbiB0cnkgdG8gbG93ZXIgaW1tdW5pdHkgKi8KLQkJQVRINUtfREJHX1VOTElNSVQoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19BTkksCisJCUFUSDVLX0RCR19VTkxJTUlUKGFoLCBBVEg1S19ERUJVR19BTkksCiAJCQkiY2hlY2sgbG93IG9mZG0gJWQvJWQgY2NrICVkLyVkIiwKIAkJCWFzLT5vZmRtX2Vycm9ycywgb2ZkbV9sb3csIGFzLT5jY2tfZXJyb3JzLCBjY2tfbG93KTsKIApAQCAtNTI1LDcgKzUyNSw3IEBACiB2b2lkCiBhdGg1a19hbmlfbWliX2ludHIoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlICphcyA9ICZhaC0+YWhfc2MtPmFuaV9zdGF0ZTsKKwlzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlICphcyA9ICZhaC0+YW5pX3N0YXRlOwogCiAJLyogbm90aGluZyB0byBkbyBoZXJlIGlmIEhXIGRvZXMgbm90IGhhdmUgUEhZIGVycm9yIGNvdW50ZXJzIC0gdGhleQogCSAqIGNhbid0IGJlIHRoZSByZWFzb24gZm9yIHRoZSBNSUIgaW50ZXJydXB0IHRoZW4gKi8KQEAgLTUzNiw3ICs1MzYsNyBAQAogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19PRkRNX0ZJTF9DTlQpOwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19DQ0tfRklMX0NOVCk7CiAKLQlpZiAoYWgtPmFoX3NjLT5hbmlfc3RhdGUuYW5pX21vZGUgIT0gQVRINUtfQU5JX01PREVfQVVUTykKKwlpZiAoYWgtPmFuaV9zdGF0ZS5hbmlfbW9kZSAhPSBBVEg1S19BTklfTU9ERV9BVVRPKQogCQlyZXR1cm47CiAKIAkvKiBJZiBvbmUgb2YgdGhlIGVycm9ycyB0cmlnZ2VyZWQsIHdlIGNhbiBnZXQgYSBzdXBlcmZsdW91cyBzZWNvbmQKQEAgLTU0Nyw3ICs1NDcsNyBAQAogCiAJaWYgKGFzLT5vZmRtX2Vycm9ycyA+IEFUSDVLX0FOSV9PRkRNX1RSSUdfSElHSCB8fAogCSAgICBhcy0+Y2NrX2Vycm9ycyA+IEFUSDVLX0FOSV9DQ0tfVFJJR19ISUdIKQotCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+YWhfc2MtPmFuaV90YXNrbGV0KTsKKwkJdGFza2xldF9zY2hlZHVsZSgmYWgtPmFuaV90YXNrbGV0KTsKIH0KIAogCkBAIC01NjEsMTYgKzU2MSwxNiBAQAogYXRoNWtfYW5pX3BoeV9lcnJvcl9yZXBvcnQoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJCSAgIGVudW0gYXRoNWtfcGh5X2Vycm9yX2NvZGUgcGh5ZXJyKQogewotCXN0cnVjdCBhdGg1a19hbmlfc3RhdGUgKmFzID0gJmFoLT5haF9zYy0+YW5pX3N0YXRlOworCXN0cnVjdCBhdGg1a19hbmlfc3RhdGUgKmFzID0gJmFoLT5hbmlfc3RhdGU7CiAKIAlpZiAocGh5ZXJyID09IEFSNUtfUlhfUEhZX0VSUk9SX09GRE1fVElNSU5HKSB7CiAJCWFzLT5vZmRtX2Vycm9ycysrOwogCQlpZiAoYXMtPm9mZG1fZXJyb3JzID4gQVRINUtfQU5JX09GRE1fVFJJR19ISUdIKQotCQkJdGFza2xldF9zY2hlZHVsZSgmYWgtPmFoX3NjLT5hbmlfdGFza2xldCk7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+YW5pX3Rhc2tsZXQpOwogCX0gZWxzZSBpZiAocGh5ZXJyID09IEFSNUtfUlhfUEhZX0VSUk9SX0NDS19USU1JTkcpIHsKIAkJYXMtPmNja19lcnJvcnMrKzsKIAkJaWYgKGFzLT5jY2tfZXJyb3JzID4gQVRINUtfQU5JX0NDS19UUklHX0hJR0gpCi0JCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+YWhfc2MtPmFuaV90YXNrbGV0KTsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmFoLT5hbmlfdGFza2xldCk7CiAJfQogfQogCkBAIC02MzAsMjAgKzYzMCwyNSBAQAogCWlmIChhaC0+YWhfdmVyc2lvbiA8IEFSNUtfQVI1MjEyKQogCQlyZXR1cm47CiAKKwlpZiAobW9kZSA8IEFUSDVLX0FOSV9NT0RFX09GRiB8fCBtb2RlID4gQVRINUtfQU5JX01PREVfQVVUTykgeworCQlBVEg1S19FUlIoYWgsICJBTkkgbW9kZSAlZCBvdXQgb2YgcmFuZ2UiLCBtb2RlKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIGNsZWFyIG9sZCBzdGF0ZSBpbmZvcm1hdGlvbiAqLwotCW1lbXNldCgmYWgtPmFoX3NjLT5hbmlfc3RhdGUsIDAsIHNpemVvZihhaC0+YWhfc2MtPmFuaV9zdGF0ZSkpOworCW1lbXNldCgmYWgtPmFuaV9zdGF0ZSwgMCwgc2l6ZW9mKGFoLT5hbmlfc3RhdGUpKTsKIAogCS8qIG9sZGVyIGhhcmR3YXJlIGhhcyBtb3JlIHNwdXIgbGV2ZWxzIHRoYW4gbmV3ZXIgKi8KIAlpZiAoYWgtPmFoX21hY19zcmV2IDwgQVI1S19TUkVWX0FSMjQxNCkKLQkJYWgtPmFoX3NjLT5hbmlfc3RhdGUubWF4X3NwdXJfbGV2ZWwgPSA3OworCQlhaC0+YW5pX3N0YXRlLm1heF9zcHVyX2xldmVsID0gNzsKIAllbHNlCi0JCWFoLT5haF9zYy0+YW5pX3N0YXRlLm1heF9zcHVyX2xldmVsID0gMjsKKwkJYWgtPmFuaV9zdGF0ZS5tYXhfc3B1cl9sZXZlbCA9IDI7CiAKIAkvKiBpbml0aWFsIHZhbHVlcyBmb3Igb3VyIGFuaSBwYXJhbWV0ZXJzICovCiAJaWYgKG1vZGUgPT0gQVRINUtfQU5JX01PREVfT0ZGKSB7Ci0JCUFUSDVLX0RCR19VTkxJTUlUKGFoLT5haF9zYywgQVRINUtfREVCVUdfQU5JLCAiQU5JIG9mZlxuIik7Ci0JfSBlbHNlIGlmICAobW9kZSA9PSBBVEg1S19BTklfTU9ERV9NQU5VQUxfTE9XKSB7Ci0JCUFUSDVLX0RCR19VTkxJTUlUKGFoLT5haF9zYywgQVRINUtfREVCVUdfQU5JLAorCQlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQU5JLCAiQU5JIG9mZlxuIik7CisJfSBlbHNlIGlmIChtb2RlID09IEFUSDVLX0FOSV9NT0RFX01BTlVBTF9MT1cpIHsKKwkJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0FOSSwKIAkJCSJBTkkgbWFudWFsIGxvdyAtPiBoaWdoIHNlbnNpdGl2aXR5XG4iKTsKIAkJYXRoNWtfYW5pX3NldF9ub2lzZV9pbW11bml0eV9sZXZlbChhaCwgMCk7CiAJCWF0aDVrX2FuaV9zZXRfc3B1cl9pbW11bml0eV9sZXZlbChhaCwgMCk7CkBAIC02NTEsMTcgKzY1NiwxNyBAQAogCQlhdGg1a19hbmlfc2V0X29mZG1fd2Vha19zaWduYWxfZGV0ZWN0aW9uKGFoLCB0cnVlKTsKIAkJYXRoNWtfYW5pX3NldF9jY2tfd2Vha19zaWduYWxfZGV0ZWN0aW9uKGFoLCB0cnVlKTsKIAl9IGVsc2UgaWYgKG1vZGUgPT0gQVRINUtfQU5JX01PREVfTUFOVUFMX0hJR0gpIHsKLQkJQVRINUtfREJHX1VOTElNSVQoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19BTkksCisJCUFUSDVLX0RCR19VTkxJTUlUKGFoLCBBVEg1S19ERUJVR19BTkksCiAJCQkiQU5JIG1hbnVhbCBoaWdoIC0+IGxvdyBzZW5zaXRpdml0eVxuIik7CiAJCWF0aDVrX2FuaV9zZXRfbm9pc2VfaW1tdW5pdHlfbGV2ZWwoYWgsCiAJCQkJCUFUSDVLX0FOSV9NQVhfTk9JU0VfSU1NX0xWTCk7CiAJCWF0aDVrX2FuaV9zZXRfc3B1cl9pbW11bml0eV9sZXZlbChhaCwKLQkJCQkJYWgtPmFoX3NjLT5hbmlfc3RhdGUubWF4X3NwdXJfbGV2ZWwpOworCQkJCQlhaC0+YW5pX3N0YXRlLm1heF9zcHVyX2xldmVsKTsKIAkJYXRoNWtfYW5pX3NldF9maXJzdGVwX2xldmVsKGFoLCBBVEg1S19BTklfTUFYX0ZJUlNURVBfTFZMKTsKIAkJYXRoNWtfYW5pX3NldF9vZmRtX3dlYWtfc2lnbmFsX2RldGVjdGlvbihhaCwgZmFsc2UpOwogCQlhdGg1a19hbmlfc2V0X2Nja193ZWFrX3NpZ25hbF9kZXRlY3Rpb24oYWgsIGZhbHNlKTsKIAl9IGVsc2UgaWYgKG1vZGUgPT0gQVRINUtfQU5JX01PREVfQVVUTykgewotCQlBVEg1S19EQkdfVU5MSU1JVChhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX0FOSSwgIkFOSSBhdXRvXG4iKTsKKwkJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0FOSSwgIkFOSSBhdXRvXG4iKTsKIAkJYXRoNWtfYW5pX3NldF9ub2lzZV9pbW11bml0eV9sZXZlbChhaCwgMCk7CiAJCWF0aDVrX2FuaV9zZXRfc3B1cl9pbW11bml0eV9sZXZlbChhaCwgMCk7CiAJCWF0aDVrX2FuaV9zZXRfZmlyc3RlcF9sZXZlbChhaCwgMCk7CkBAIC02ODcsNyArNjkyLDcgQEAKIAkJCQkJCSAgIH5BUjVLX1JYX0ZJTFRFUl9QSFlFUlIpOwogCX0KIAotCWFoLT5haF9zYy0+YW5pX3N0YXRlLmFuaV9tb2RlID0gbW9kZTsKKwlhaC0+YW5pX3N0YXRlLmFuaV9tb2RlID0gbW9kZTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hdGg1ay5oCmluZGV4IGJiNTA3MDAuLjI3N2Q1Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hdGg1ay5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hdGg1ay5oCkBAIC0xOCwxNCArMTgsMTYgQEAKICNpZm5kZWYgX0FUSDVLX0gKICNkZWZpbmUgX0FUSDVLX0gKIAotLyogVE9ETzogQ2xlYW4gdXAgY2hhbm5lbCBkZWJ1Z2luZyAtZG9lc24ndCB3b3JrIGFueXdheS0gYW5kIHN0YXJ0CisvKiBUT0RPOiBDbGVhbiB1cCBjaGFubmVsIGRlYnVnZ2luZyAoZG9lc24ndCB3b3JrIGFueXdheSkgYW5kIHN0YXJ0CiAgKiB3b3JraW5nIG9uIHJlZy4gY29udHJvbCBjb2RlIHVzaW5nIGFsbCBhdmFpbGFibGUgZWVwcm9tIGluZm9ybWF0aW9uCi0gKiAtcmV2LiBlbmdpbmVlcmluZyBuZWVkZWQtICovCisgKiAocmV2LiBlbmdpbmVlcmluZyBuZWVkZWQpICovCiAjZGVmaW5lIENIQU5fREVCVUcJMAogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2F2ZXJhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKIC8qIFJYL1RYIGRlc2NyaXB0b3IgaHcgc3RydWN0cwpAQCAtMzYsNDMgKzM4LDQ2IEBACiAgKiBUT0RPOiBNYWtlIGEgbW9yZSBnZW5lcmljIHN0cnVjdCAoZWcuIGFkZCBtb3JlIHN0dWZmIHRvIGF0aDVrX2NhcGFiaWxpdGllcykKICAqIGFuZCBjbGVhbiB1cCBjb21tb24gYml0cywgdGhlbiBpbnRyb2R1Y2Ugc2V0L2dldCBmdW5jdGlvbnMgaW4gZWVwcm9tLmMgKi8KICNpbmNsdWRlICJlZXByb20uaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgIi4uL2F0aC5oIgorI2luY2x1ZGUgImFuaS5oIgogCiAvKiBQQ0kgSURzICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTAgCQkweDAwMDcgLyogQVI1MjEwICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUzMTEgCQkweDAwMTEgLyogQVI1MzExICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTEgCQkweDAwMTIgLyogQVI1MjExICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTIgCQkweDAwMTMgLyogQVI1MjEyICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1JEQUc2NzUgCQkweDAwMTMgLyogM0NSREFHNjc1IChBdGhlcm9zIEFSNTIxMikgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzJfM0NSUEFHMTc1IAkJMHgwMDEzIC8qIDNDUlBBRzE3NSAoQXRoZXJvcyBBUjUyMTIpICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTBfQVAgCTB4MDIwNyAvKiBBUjUyMTAgKEVhcmx5KSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEwCQkweDAwMDcgLyogQVI1MjEwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUzMTEJCTB4MDAxMSAvKiBBUjUzMTEgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTIxMQkJMHgwMDEyIC8qIEFSNTIxMSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEyCQkweDAwMTMgLyogQVI1MjEyICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1JEQUc2NzUJCTB4MDAxMyAvKiAzQ1JEQUc2NzUgKEF0aGVyb3MgQVI1MjEyKSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fMl8zQ1JQQUcxNzUJCTB4MDAxMyAvKiAzQ1JQQUcxNzUgKEF0aGVyb3MgQVI1MjEyKSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEwX0FQCQkweDAyMDcgLyogQVI1MjEwIChFYXJseSkgKi8KICNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTIxMl9JQk0JMHgxMDE0IC8qIEFSNTIxMiAoSUJNIE1pbmlQQ0kpICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTBfREVGQVVMVCAJMHgxMTA3IC8qIEFSNTIxMCAobm8gZWVwcm9tKSAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEyX0RFRkFVTFQgCTB4MTExMyAvKiBBUjUyMTIgKG5vIGVlcHJvbSkgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTIxMV9ERUZBVUxUIAkweDExMTIgLyogQVI1MjExIChubyBlZXByb20pICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfRlBHQSAJMHhmMDEzIC8qIEFSNTIxMiAoZW11bGF0aW9uIGJvYXJkKSAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjExX0xFR0FDWSAJMHhmZjEyIC8qIEFSNTIxMSAoZW11bGF0aW9uIGJvYXJkKSAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjExX0ZQR0ExMUIgCTB4ZjExYiAvKiBBUjUyMTEgKGVtdWxhdGlvbiBib2FyZCkgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTMxMl9SRVYyIAkweDAwNTIgLyogQVI1MzEyIFdNQUMgKEFQMzEpICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUzMTJfUkVWNyAJMHgwMDU3IC8qIEFSNTMxMiBXTUFDIChBUDMwLTA0MCkgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTMxMl9SRVY4IAkweDAwNTggLyogQVI1MzEyIFdNQUMgKEFQNDMtMDMwKSAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEyXzAwMTQgCTB4MDAxNCAvKiBBUjUyMTIgY29tcGF0aWJsZSAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEyXzAwMTUgCTB4MDAxNSAvKiBBUjUyMTIgY29tcGF0aWJsZSAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEyXzAwMTYgCTB4MDAxNiAvKiBBUjUyMTIgY29tcGF0aWJsZSAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEyXzAwMTcgCTB4MDAxNyAvKiBBUjUyMTIgY29tcGF0aWJsZSAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEyXzAwMTggCTB4MDAxOCAvKiBBUjUyMTIgY29tcGF0aWJsZSAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEyXzAwMTkgCTB4MDAxOSAvKiBBUjUyMTIgY29tcGF0aWJsZSAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVIyNDEzIAkJMHgwMDFhIC8qIEFSMjQxMyAoR3JpZmZpbi1saXRlKSAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1NDEzIAkJMHgwMDFiIC8qIEFSNTQxMyAoRWFnbGUpICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjU0MjQgCQkweDAwMWMgLyogQVI1NDI0IChDb25kb3IgUENJLUUpICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjU0MTYgCQkweDAwMjMgLyogQVI1NDE2ICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjU0MTggCQkweDAwMjQgLyogQVI1NDE4ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTBfREVGQVVMVAkweDExMDcgLyogQVI1MjEwIChubyBlZXByb20pICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfREVGQVVMVAkweDExMTMgLyogQVI1MjEyIChubyBlZXByb20pICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTFfREVGQVVMVAkweDExMTIgLyogQVI1MjExIChubyBlZXByb20pICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfRlBHQQkweGYwMTMgLyogQVI1MjEyIChlbXVsYXRpb24gYm9hcmQpICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTFfTEVHQUNZCTB4ZmYxMiAvKiBBUjUyMTEgKGVtdWxhdGlvbiBib2FyZCkgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTIxMV9GUEdBMTFCCTB4ZjExYiAvKiBBUjUyMTEgKGVtdWxhdGlvbiBib2FyZCkgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTMxMl9SRVYyCTB4MDA1MiAvKiBBUjUzMTIgV01BQyAoQVAzMSkgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTMxMl9SRVY3CTB4MDA1NyAvKiBBUjUzMTIgV01BQyAoQVAzMC0wNDApICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUzMTJfUkVWOAkweDAwNTggLyogQVI1MzEyIFdNQUMgKEFQNDMtMDMwKSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEyXzAwMTQJMHgwMDE0IC8qIEFSNTIxMiBjb21wYXRpYmxlICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfMDAxNQkweDAwMTUgLyogQVI1MjEyIGNvbXBhdGlibGUgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTIxMl8wMDE2CTB4MDAxNiAvKiBBUjUyMTIgY29tcGF0aWJsZSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1MjEyXzAwMTcJMHgwMDE3IC8qIEFSNTIxMiBjb21wYXRpYmxlICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTJfMDAxOAkweDAwMTggLyogQVI1MjEyIGNvbXBhdGlibGUgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTIxMl8wMDE5CTB4MDAxOSAvKiBBUjUyMTIgY29tcGF0aWJsZSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVIyNDEzCQkweDAwMWEgLyogQVIyNDEzIChHcmlmZmluLWxpdGUpICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjU0MTMJCTB4MDAxYiAvKiBBUjU0MTMgKEVhZ2xlKSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfQVI1NDI0CQkweDAwMWMgLyogQVI1NDI0IChDb25kb3IgUENJLUUpICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjU0MTYJCTB4MDAyMyAvKiBBUjU0MTYgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTQxOAkJMHgwMDI0IC8qIEFSNTQxOCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKICAgR0VORVJJQyBEUklWRVIgREVGSU5JVElPTlMKIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEFUSDVLX1BSSU5URihmbXQsIC4uLikgICBwcmludGsoIiVzOiAiIGZtdCwgX19mdW5jX18sICMjX19WQV9BUkdTX18pCisjZGVmaW5lIEFUSDVLX1BSSU5URihmbXQsIC4uLikgXAorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAiIGZtdCwgX19mdW5jX18sICMjX19WQV9BUkdTX18pCiAKICNkZWZpbmUgQVRINUtfUFJJTlRLKF9zYywgX2xldmVsLCBfZm10LCAuLi4pIFwKIAlwcmludGsoX2xldmVsICJhdGg1ayAlczogIiBfZm10LCBcCkBAIC0xNTUsNyArMTYwLDcgQEAKIH0gd2hpbGUgKDApCiAKIC8qCi0gKiBTb21lIHR1bmVhYmxlIHZhbHVlcyAodGhlc2Ugc2hvdWxkIGJlIGNoYW5nZWFibGUgYnkgdGhlIHVzZXIpCisgKiBTb21lIHR1bmFibGUgdmFsdWVzICh0aGVzZSBzaG91bGQgYmUgY2hhbmdlYWJsZSBieSB0aGUgdXNlcikKICAqIFRPRE86IE1ha2UgdXNlIG9mIHRoZW0gYW5kIGFkZCBtb3JlIG9wdGlvbnMgT1IgdXNlIGRlYnVnL2NvbmZpZ2ZzCiAgKi8KICNkZWZpbmUgQVI1S19UVU5FX0RNQV9CRUFDT05fUkVTUAkJMgpAQCAtMTcwLDggKzE3NSw4IEBACiAjZGVmaW5lIEFSNUtfVFVORV9SU1NJX1RIUkVTCQkJMTI5CiAvKiBUaGlzIG11c3QgYmUgc2V0IHdoZW4gc2V0dGluZyB0aGUgUlNTSSB0aHJlc2hvbGQgb3RoZXJ3aXNlIGl0IGNhbgogICogcHJldmVudCBhIHJlc2V0LiBJZiBBUjVLX1JTU0lfVEhSIGlzIHJlYWQgYWZ0ZXIgd3JpdGluZyB0byBpdAotICogdGhlIEJNSVNTX1RIUkVTIHdpbGwgYmUgc2VlbiBhcyAwLCBzZWVtcyBoYXJ3YXJlIGRvZXNuJ3Qga2VlcAotICogdHJhY2sgb2YgaXQuIE1heCB2YWx1ZSBkZXBlbmRzIG9uIGhhcndhcmUuIEZvciBBUjUyMTAgdGhpcyBpcyBqdXN0IDcuCisgKiB0aGUgQk1JU1NfVEhSRVMgd2lsbCBiZSBzZWVuIGFzIDAsIHNlZW1zIGhhcmR3YXJlIGRvZXNuJ3Qga2VlcAorICogdHJhY2sgb2YgaXQuIE1heCB2YWx1ZSBkZXBlbmRzIG9uIGhhcmR3YXJlLiBGb3IgQVI1MjEwIHRoaXMgaXMganVzdCA3LgogICogRm9yIEFSNTIxMSsgdGhpcyBzZWVtcyB0byBiZSB1cCB0byAyNTUuICovCiAjZGVmaW5lIEFSNUtfVFVORV9CTUlTU19USFJFUwkJCTcKICNkZWZpbmUgQVI1S19UVU5FX1JFR0lTVEVSX0RXRUxMX1RJTUUJCTIwMDAwCkBAIC0zNjEsNyArMzY2LDcgQEAKIC8qCiAgKiBTb21lIG9mIHRoaXMgaW5mb3JtYXRpb24gaXMgYmFzZWQgb24gRG9jdW1lbnRhdGlvbiBmcm9tOgogICoKLSAqIGh0dHA6Ly9tYWR3aWZpLXByb2plY3Qub3JnL3dpa2kvQ2hpcHNldEZlYXR1cmVzL1N1cGVyQUcgCisgKiBodHRwOi8vbWFkd2lmaS1wcm9qZWN0Lm9yZy93aWtpL0NoaXBzZXRGZWF0dXJlcy9TdXBlckFHCiAgKgogICogTW9kdWxhdGlvbiBmb3IgQXRoZXJvcycgZVh0ZW5kZWQgUmFuZ2UgLSByYW5nZSBlbmhhbmNpbmcgZXh0ZW5zaW9uIHRoYXQgaXMKICAqIHN1cHBvc2VkIHRvIGRvdWJsZSB0aGUgZGlzdGFuY2UgYW4gQXRoZXJvcyBjbGllbnQgZGV2aWNlIGNhbiBrZWVwIGEKQEAgLTM3NCwxMiArMzc5LDEyIEBACiAgKiB0aGV5IGFyZSBleGNsdXNpdmUuCiAgKgogICovCi0jZGVmaW5lIE1PRFVMQVRJT05fWFIgCQkweDAwMDAwMjAwCisjZGVmaW5lIE1PRFVMQVRJT05fWFIJCTB4MDAwMDAyMDAKIC8qCiAgKiBNb2R1bGF0aW9uIGZvciBBdGhlcm9zJyBUdXJibyBHIGFuZCBUdXJibyBBLCBpdHMgc3VwcG9zZWQgdG8gcHJvdmlkZSBhCiAgKiB0aHJvdWdocHV0IHRyYW5zbWlzc2lvbiBzcGVlZCB1cCB0byA0ME1iaXQvcy02ME1iaXQvcyBhdCBhIDEwOE1iaXQvcwogICogc2lnbmFsaW5nIHJhdGUgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgYm9uZGluZyBvZiB0d28gNTRNYml0L3MgODAyLjExZwotICogY2hhbm5lbHMuIFRvIHVzZSB0aGlzIGZlYXR1cmUgeW91ciBBY2Nlc3MgUG9pbnQgbXVzdCBhbHNvIHN1cG9ydCBpdC4KKyAqIGNoYW5uZWxzLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdXIgQWNjZXNzIFBvaW50IG11c3QgYWxzbyBzdXBwb3J0IGl0LgogICogVGhlcmUgaXMgYWxzbyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gInN0YXRpYyIgYW5kICJkeW5hbWljIiB0dXJibyBtb2RlczoKICAqCiAgKiAtIFN0YXRpYzogaXMgdGhlIGR1bWIgdmVyc2lvbjogZGV2aWNlcyBzZXQgdG8gdGhpcyBtb2RlIHN0aWNrIHRvIGl0IHVudGlsCkBAIC00OTUsOSArNTAwLDkgQEAKICAqLwogZW51bSBhdGg1a190eF9xdWV1ZV9zdWJ0eXBlIHsKIAlBUjVLX1dNRV9BQ19CSyA9IDAsCS8qQmFja2dyb3VuZCB0cmFmZmljKi8KLQlBUjVLX1dNRV9BQ19CRSwgCS8qQmVzdC1lZmZvcnQgKG5vcm1hbCkgdHJhZmZpYykqLwotCUFSNUtfV01FX0FDX1ZJLCAJLypWaWRlbyB0cmFmZmljKi8KLQlBUjVLX1dNRV9BQ19WTywgCS8qVm9pY2UgdHJhZmZpYyovCisJQVI1S19XTUVfQUNfQkUsCQkvKkJlc3QtZWZmb3J0IChub3JtYWwpIHRyYWZmaWMqLworCUFSNUtfV01FX0FDX1ZJLAkJLypWaWRlbyB0cmFmZmljKi8KKwlBUjVLX1dNRV9BQ19WTywJCS8qVm9pY2UgdHJhZmZpYyovCiB9OwogCiAvKgpAQCAtNTM3LDYgKzU0MiwyNyBAQAogI2RlZmluZSBBUjVLX1RYUV9GTEFHX0NPTVBSRVNTSU9OX0VOQUJMRQkweDIwMDAJLyogRW5hYmxlIGh3IGNvbXByZXNzaW9uIC1ub3QgaW1wbGVtZW50ZWQtKi8KIAogLyoKKyAqIERhdGEgdHJhbnNtaXQgcXVldWUgc3RhdGUuICBPbmUgb2YgdGhlc2UgZXhpc3RzIGZvciBlYWNoCisgKiBoYXJkd2FyZSB0cmFuc21pdCBxdWV1ZS4gIFBhY2tldHMgc2VudCB0byB1cyBmcm9tIGFib3ZlCisgKiBhcmUgYXNzaWduZWQgdG8gcXVldWVzIGJhc2VkIG9uIHRoZWlyIHByaW9yaXR5LiAgTm90IGFsbAorICogZGV2aWNlcyBzdXBwb3J0IGEgY29tcGxldGUgc2V0IG9mIGhhcmR3YXJlIHRyYW5zbWl0IHF1ZXVlcy4KKyAqIEZvciB0aG9zZSBkZXZpY2VzIHRoZSBhcnJheSBzY19hYzJxIHdpbGwgbWFwIG11bHRpcGxlCisgKiBwcmlvcml0aWVzIHRvIGZld2VyIGhhcmR3YXJlIHF1ZXVlcyAodHlwaWNhbGx5IGFsbCB0byBvbmUKKyAqIGhhcmR3YXJlIHF1ZXVlKS4KKyAqLworc3RydWN0IGF0aDVrX3R4cSB7CisJdW5zaWduZWQgaW50CQlxbnVtOwkvKiBoYXJkd2FyZSBxIG51bWJlciAqLworCXUzMgkJCSpsaW5rOwkvKiBsaW5rIHB0ciBpbiBsYXN0IFRYIGRlc2MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXE7CS8qIHRyYW5zbWl0IHF1ZXVlICovCisJc3BpbmxvY2tfdAkJbG9jazsJLyogbG9jayBvbiBxIGFuZCBsaW5rICovCisJYm9vbAkJCXNldHVwOworCWludAkJCXR4cV9sZW47IC8qIG51bWJlciBvZiBxdWV1ZWQgYnVmZmVycyAqLworCWludAkJCXR4cV9tYXg7IC8qIG1heCBhbGxvd2VkIG51bSBvZiBxdWV1ZWQgYnVmZmVycyAqLworCWJvb2wJCQl0eHFfcG9sbF9tYXJrOworCXVuc2lnbmVkIGludAkJdHhxX3N0dWNrOwkvKiBpbmZvcm1hdGlvbmFsIGNvdW50ZXIgKi8KK307CisKKy8qCiAgKiBBIHN0cnVjdCB0byBob2xkIHR4IHF1ZXVlJ3MgcGFyYW1ldGVycwogICovCiBzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gewpAQCAtNjE2LDggKzY0Miw4IEBACiAjZGVmaW5lIEFSNUtfUlhFUlJfRklGTwkJMHgwNAogI2RlZmluZSBBUjVLX1JYRVJSX0RFQ1JZUFQJMHgwOAogI2RlZmluZSBBUjVLX1JYRVJSX01JQwkJMHgxMAotI2RlZmluZSBBUjVLX1JYS0VZSVhfSU5WQUxJRAkoKHU4KSAtIDEpCi0jZGVmaW5lIEFSNUtfVFhLRVlJWF9JTlZBTElECSgodTMyKSAtIDEpCisjZGVmaW5lIEFSNUtfUlhLRVlJWF9JTlZBTElECSgodTgpIC0xKQorI2RlZmluZSBBUjVLX1RYS0VZSVhfSU5WQUxJRAkoKHUzMikgLTEpCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqXApAQCAtNjc4LDE3ICs3MDQsMTggQEAKICNkZWZpbmUJQ0hBTk5FTF9EWU4JMHgwNDAwCS8qIER5bmFtaWMgQ0NLLU9GRE0gY2hhbm5lbCAoZm9yIGcgb3BlcmF0aW9uKSAqLwogI2RlZmluZQlDSEFOTkVMX1hSCTB4MDgwMAkvKiBYUiBjaGFubmVsICovCiAKLSNkZWZpbmUJQ0hBTk5FTF9BCShDSEFOTkVMXzVHSFp8Q0hBTk5FTF9PRkRNKQotI2RlZmluZQlDSEFOTkVMX0IJKENIQU5ORUxfMkdIWnxDSEFOTkVMX0NDSykKLSNkZWZpbmUJQ0hBTk5FTF9HCShDSEFOTkVMXzJHSFp8Q0hBTk5FTF9PRkRNKQotI2RlZmluZQlDSEFOTkVMX1gJKENIQU5ORUxfNUdIWnxDSEFOTkVMX09GRE18Q0hBTk5FTF9YUikKKyNkZWZpbmUJQ0hBTk5FTF9BCShDSEFOTkVMXzVHSFogfCBDSEFOTkVMX09GRE0pCisjZGVmaW5lCUNIQU5ORUxfQgkoQ0hBTk5FTF8yR0haIHwgQ0hBTk5FTF9DQ0spCisjZGVmaW5lCUNIQU5ORUxfRwkoQ0hBTk5FTF8yR0haIHwgQ0hBTk5FTF9PRkRNKQorI2RlZmluZQlDSEFOTkVMX1gJKENIQU5ORUxfNUdIWiB8IENIQU5ORUxfT0ZETSB8IENIQU5ORUxfWFIpCiAKLSNkZWZpbmUJQ0hBTk5FTF9BTEwJKENIQU5ORUxfT0ZETXxDSEFOTkVMX0NDS3xDSEFOTkVMXzJHSFp8Q0hBTk5FTF81R0haKQorI2RlZmluZQlDSEFOTkVMX0FMTAkoQ0hBTk5FTF9PRkRNIHwgQ0hBTk5FTF9DQ0sgfCBcCisJCQkgQ0hBTk5FTF8yR0haIHwgQ0hBTk5FTF81R0haKQogCiAjZGVmaW5lIENIQU5ORUxfTU9ERVMJCUNIQU5ORUxfQUxMCiAKIC8qCi0gKiBVc2VkIGludGVybmFseSBmb3IgcmVzZXRfdHhfcXVldWUpLgorICogVXNlZCBpbnRlcm5hbGx5IGZvciBhdGg1a19od19yZXNldF90eF9xdWV1ZSgpLgogICogQWxzbyBzZWUgc3RydWN0IHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbC4KICAqLwogI2RlZmluZSBJU19DSEFOX1hSKF9jKQkoKF9jLT5od192YWx1ZSAmIENIQU5ORUxfWFIpICE9IDApCkBAIC03MTAsNyArNzM3LDcgQEAKIFwqKioqKioqKioqKioqKioqKiovCiAKIC8qKgotICogU2VlbXMgdGhlIGFyNXh4eCBoYXJ3YXJlIHN1cHBvcnRzIHVwIHRvIDMyIHJhdGVzLCBpbmRleGVkIGJ5IDEtMzIuCisgKiBTZWVtcyB0aGUgYXI1eHh4IGhhcmR3YXJlIHN1cHBvcnRzIHVwIHRvIDMyIHJhdGVzLCBpbmRleGVkIGJ5IDEtMzIuCiAgKgogICogVGhlIHJhdGUgY29kZSBpcyB1c2VkIHRvIGdldCB0aGUgUlggcmF0ZSBvciBzZXQgdGhlIFRYIHJhdGUgb24gdGhlCiAgKiBoYXJkd2FyZSBkZXNjcmlwdG9ycy4gSXQgaXMgYWxzbyB1c2VkIGZvciBpbnRlcm5hbCBtb2R1bGF0aW9uIGNvbnRyb2wKQEAgLTc2Nyw2ICs3OTQsNyBAQAogICovCiAKICNkZWZpbmUgQVI1S19LRVlDQUNIRV9TSVpFCTgKK2V4dGVybiBpbnQgYXRoNWtfbW9kcGFyYW1fbm9od2NyeXB0OwogCiAvKioqKioqKioqKioqKioqKioqKioqKipcCiAgSFcgUkVMQVRFRCBERUZJTklUSU9OUwpAQCAtNzc1LDExICs4MDMsMTEgQEAKIC8qCiAgKiBNaXNjIGRlZmluaXRpb25zCiAgKi8KLSNkZWZpbmUJQVI1S19SU1NJX0VQX01VTFRJUExJRVIJKDE8PDcpCisjZGVmaW5lCUFSNUtfUlNTSV9FUF9NVUxUSVBMSUVSCSgxIDw8IDcpCiAKICNkZWZpbmUgQVI1S19BU1NFUlRfRU5UUlkoX2UsIF9zKSBkbyB7CQlcCiAJaWYgKF9lID49IF9zKQkJCQlcCi0JCXJldHVybiAoZmFsc2UpOwkJCVwKKwkJcmV0dXJuIGZhbHNlOwkJCVwKIH0gd2hpbGUgKDApCiAKIC8qCkBAIC03OTAsNTIgKzgxOCw1MiBAQAogICogZW51bSBhdGg1a19pbnQgLSBIYXJkd2FyZSBpbnRlcnJ1cHQgbWFza3MgaGVscGVycwogICoKICAqIEBBUjVLX0lOVF9SWDogbWFzayB0byBpZGVudGlmeSByZWNlaXZlZCBmcmFtZSBpbnRlcnJ1cHRzLCBvZiB0eXBlCi0gKiAJQVI1S19JU1JfUlhPSyBvciBBUjVLX0lTUl9SWEVSUgorICoJQVI1S19JU1JfUlhPSyBvciBBUjVLX0lTUl9SWEVSUgogICogQEFSNUtfSU5UX1JYREVTQzogUmVxdWVzdCBSWCBkZXNjcmlwdG9yL1JlYWQgUlggZGVzY3JpcHRvciAoPykKICAqIEBBUjVLX0lOVF9SWE5PRlJNOiBObyBmcmFtZSByZWNlaXZlZCAoPykKICAqIEBBUjVLX0lOVF9SWEVPTDogcmVjZWl2ZWQgRW5kIE9mIExpc3QgZm9yIFZFT0wgKFZpcnR1YWwgRW5kIE9mIExpc3QpLiBUaGUKLSAqIAlRdWV1ZSBDb250cm9sIFVuaXQgKFFDVSkgc2lnbmFscyBhbiBFT0wgaW50ZXJydXB0IG9ubHkgaWYgYSBkZXNjcmlwdG9yJ3MKLSAqIAlMaW5rUHRyIGlzIE5VTEwuIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvOgotICogCWh0dHA6Ly93d3cuZnJlZXBhdGVudHNvbmxpbmUuY29tLzIwMDMwMjI1NzM5Lmh0bWwKKyAqCVF1ZXVlIENvbnRyb2wgVW5pdCAoUUNVKSBzaWduYWxzIGFuIEVPTCBpbnRlcnJ1cHQgb25seSBpZiBhIGRlc2NyaXB0b3IncworICoJTGlua1B0ciBpcyBOVUxMLiBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0bzoKKyAqCWh0dHA6Ly93d3cuZnJlZXBhdGVudHNvbmxpbmUuY29tLzIwMDMwMjI1NzM5Lmh0bWwKICAqIEBBUjVLX0lOVF9SWE9STjogSW5kaWNhdGVzIHdlIGdvdCBSWCBvdmVycnVuIChlZy4gbm8gbW9yZSBkZXNjcmlwdG9ycykuCi0gKiAJTm90ZSB0aGF0IFJ4IG92ZXJydW4gaXMgbm90IGFsd2F5cyBmYXRhbCwgb24gc29tZSBjaGlwcyB3ZSBjYW4gY29udGludWUKLSAqIAlvcGVyYXRpb24gd2l0aG91dCByZXNldGluZyB0aGUgY2FyZCwgdGhhdCdzIHdoeSBpbnRfZmF0YWwgaXMgbm90Ci0gKiAJY29tbW9uIGZvciBhbGwgY2hpcHMuCisgKglOb3RlIHRoYXQgUnggb3ZlcnJ1biBpcyBub3QgYWx3YXlzIGZhdGFsLCBvbiBzb21lIGNoaXBzIHdlIGNhbiBjb250aW51ZQorICoJb3BlcmF0aW9uIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBjYXJkLCB0aGF0J3Mgd2h5IGludF9mYXRhbCBpcyBub3QKKyAqCWNvbW1vbiBmb3IgYWxsIGNoaXBzLgogICogQEFSNUtfSU5UX1RYOiBtYXNrIHRvIGlkZW50aWZ5IHJlY2VpdmVkIGZyYW1lIGludGVycnVwdHMsIG9mIHR5cGUKLSAqIAlBUjVLX0lTUl9UWE9LIG9yIEFSNUtfSVNSX1RYRVJSCisgKglBUjVLX0lTUl9UWE9LIG9yIEFSNUtfSVNSX1RYRVJSCiAgKiBAQVI1S19JTlRfVFhERVNDOiBSZXF1ZXN0IFRYIGRlc2NyaXB0b3IvUmVhZCBUWCBzdGF0dXMgZGVzY3JpcHRvciAoPykKICAqIEBBUjVLX0lOVF9UWFVSTjogcmVjZWl2ZWQgd2hlbiB3ZSBzaG91bGQgaW5jcmVhc2UgdGhlIFRYIHRyaWdnZXIgdGhyZXNob2xkCi0gKiAJV2UgY3VycmVudGx5IGRvIGluY3JlbWVudHMgb24gaW50ZXJydXB0IGJ5Ci0gKiAJKEFSNUtfVFVORV9NQVhfVFhfRklGT19USFJFUyAtIGN1cnJlbnRfdHJpZ2dlcl9sZXZlbCkgLyAyCisgKglXZSBjdXJyZW50bHkgZG8gaW5jcmVtZW50cyBvbiBpbnRlcnJ1cHQgYnkKKyAqCShBUjVLX1RVTkVfTUFYX1RYX0ZJRk9fVEhSRVMgLSBjdXJyZW50X3RyaWdnZXJfbGV2ZWwpIC8gMgogICogQEFSNUtfSU5UX01JQjogSW5kaWNhdGVzIHRoZSBlaXRoZXIgTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBCYXNlIGNvdW50ZXJzIG9yCiAgKglvbmUgb2YgdGhlIFBIWSBlcnJvciBjb3VudGVycyByZWFjaGVkIHRoZSBtYXhpbXVtIHZhbHVlIGFuZCBzaG91bGQgYmUKICAqCXJlYWQgYW5kIGNsZWFyZWQuCiAgKiBAQVI1S19JTlRfUlhQSFk6IFJYIFBIWSBFcnJvcgogICogQEFSNUtfSU5UX1JYS0NNOiBSWCBLZXkgY2FjaGUgbWlzcwogICogQEFSNUtfSU5UX1NXQkE6IFNvZnRXYXJlIEJlYWNvbiBBbGVydCAtIGluZGljYXRlcyBpdHMgdGltZSB0byBzZW5kIGEKLSAqIAliZWFjb24gdGhhdCBtdXN0IGJlIGhhbmRsZWQgaW4gc29mdHdhcmUuIFRoZSBhbHRlcm5hdGl2ZSBpcyBpZiB5b3UKLSAqIAloYXZlIFZFT0wgc3VwcG9ydCwgaW4gdGhhdCBjYXNlIHlvdSBsZXQgdGhlIGhhcmR3YXJlIGRlYWwgd2l0aCB0aGluZ3MuCisgKgliZWFjb24gdGhhdCBtdXN0IGJlIGhhbmRsZWQgaW4gc29mdHdhcmUuIFRoZSBhbHRlcm5hdGl2ZSBpcyBpZiB5b3UKKyAqCWhhdmUgVkVPTCBzdXBwb3J0LCBpbiB0aGF0IGNhc2UgeW91IGxldCB0aGUgaGFyZHdhcmUgZGVhbCB3aXRoIHRoaW5ncy4KICAqIEBBUjVLX0lOVF9CTUlTUzogSWYgaW4gU1RBIG1vZGUgdGhpcyBpbmRpY2F0ZXMgd2UgaGF2ZSBzdG9wcGVkIHNlZWluZwotICogCWJlYWNvbnMgZnJvbSB0aGUgQVAgaGF2ZSBhc3NvY2lhdGVkIHdpdGgsIHdlIHNob3VsZCBwcm9iYWJseSB0cnkgdG8KLSAqIAlyZWFzc29jaWF0ZS4gV2hlbiBpbiBJQlNTIG1vZGUgdGhpcyBtaWdodCBtZWFuIHdlIGhhdmUgbm90IHJlY2VpdmVkCi0gKiAJYW55IGJlYWNvbnMgZnJvbSBhbnkgbG9jYWwgc3RhdGlvbnMuIE5vdGUgdGhhdCBldmVyeSBzdGF0aW9uIGluIGFuCi0gKiAJSUJTUyBzY2hlZHVsZXMgdG8gc2VuZCBiZWFjb25zIGF0IHRoZSBUYXJnZXQgQmVhY29uIFRyYW5zbWlzc2lvbiBUaW1lCi0gKiAJKFRCVFQpIHdpdGggYSByYW5kb20gYmFja29mZi4KKyAqCWJlYWNvbnMgZnJvbSB0aGUgQVAgaGF2ZSBhc3NvY2lhdGVkIHdpdGgsIHdlIHNob3VsZCBwcm9iYWJseSB0cnkgdG8KKyAqCXJlYXNzb2NpYXRlLiBXaGVuIGluIElCU1MgbW9kZSB0aGlzIG1pZ2h0IG1lYW4gd2UgaGF2ZSBub3QgcmVjZWl2ZWQKKyAqCWFueSBiZWFjb25zIGZyb20gYW55IGxvY2FsIHN0YXRpb25zLiBOb3RlIHRoYXQgZXZlcnkgc3RhdGlvbiBpbiBhbgorICoJSUJTUyBzY2hlZHVsZXMgdG8gc2VuZCBiZWFjb25zIGF0IHRoZSBUYXJnZXQgQmVhY29uIFRyYW5zbWlzc2lvbiBUaW1lCisgKgkoVEJUVCkgd2l0aCBhIHJhbmRvbSBiYWNrb2ZmLgogICogQEFSNUtfSU5UX0JOUjogQmVhY29uIE5vdCBSZWFkeSBpbnRlcnJ1cHQgLSA/PwogICogQEFSNUtfSU5UX0dQSU86IEdQSU8gaW50ZXJydXB0IGlzIHVzZWQgZm9yIFJGIEtpbGwsIGRpc2FibGVkIGZvciBub3cKLSAqIAl1bnRpbCBwcm9wZXJseSBoYW5kbGVkCisgKgl1bnRpbCBwcm9wZXJseSBoYW5kbGVkCiAgKiBAQVI1S19JTlRfRkFUQUw6IEZhdGFsIGVycm9ycyB3ZXJlIGVuY291bnRlcmVkLCB0eXBpY2FsbHkgY2F1c2VkIGJ5IERNQQotICogCWVycm9ycy4gVGhlc2UgdHlwZXMgb2YgZXJyb3JzIHdlIGNhbiBlbmFibGUgc2VlbSB0byBiZSBvZiB0eXBlCi0gKiAJQVI1S19TSU1SMl9NQ0FCVCwgQVI1S19TSU1SMl9TU0VSUiBhbmQgQVI1S19TSU1SMl9EUEVSUi4KKyAqCWVycm9ycy4gVGhlc2UgdHlwZXMgb2YgZXJyb3JzIHdlIGNhbiBlbmFibGUgc2VlbSB0byBiZSBvZiB0eXBlCisgKglBUjVLX1NJTVIyX01DQUJULCBBUjVLX1NJTVIyX1NTRVJSIGFuZCBBUjVLX1NJTVIyX0RQRVJSLgogICogQEFSNUtfSU5UX0dMT0JBTDogVXNlZCB0byBjbGVhciBhbmQgc2V0IHRoZSBJRVIKICAqIEBBUjVLX0lOVF9OT0NBUkQ6IHNpZ25hbHMgdGhlIGNhcmQgaGFzIGJlZW4gcmVtb3ZlZAotICogQEFSNUtfSU5UX0NPTU1PTjogY29tbW9uIGludGVycnVwdHMgc2hhcmVkIGFtb2dzdCBNQUNzIHdpdGggdGhlIHNhbWUKLSAqIAliaXQgdmFsdWUKKyAqIEBBUjVLX0lOVF9DT01NT046IGNvbW1vbiBpbnRlcnJ1cHRzIHNoYXJlZCBhbW9uZyBNQUNzIHdpdGggdGhlIHNhbWUKKyAqCWJpdCB2YWx1ZQogICoKICAqIFRoZXNlIGFyZSBtYXBwZWQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygc29tZSBjb21tb24gYml0cwogICogYmV0d2VlbiB0aGUgTUFDcywgdG8gYmUgYWJsZSB0byBzZXQgaW50ciBwcm9wZXJ0aWVzCiAgKiBlYXNpZXIuIFNvbWUgb2YgdGhlbSBhcmUgbm90IHVzZWQgeWV0IGluc2lkZSBody5jLiBNb3N0IG1hcAotICogdG8gdGhlIHJlc3BlY3RpdmUgaHcgaW50ZXJydXB0IHZhbHVlIGFzIHRoZXkgYXJlIGNvbW1vbiBhbW9nc3QgZGlmZmVyZW50CisgKiB0byB0aGUgcmVzcGVjdGl2ZSBodyBpbnRlcnJ1cHQgdmFsdWUgYXMgdGhleSBhcmUgY29tbW9uIGFtb25nIGRpZmZlcmVudAogICogTUFDcy4KICAqLwogZW51bSBhdGg1a19pbnQgewpAQCAtOTQ0LDM1ICs5NzIsNiBAQAogI2RlZmluZSBBUjVLX1NPRlRMRURfT04JCTAKICNkZWZpbmUgQVI1S19TT0ZUTEVEX09GRgkxCiAKLS8qCi0gKiBDaGlwc2V0IGNhcGFiaWxpdGllcyAtc2VlIGF0aDVrX2h3X2dldF9jYXBhYmlsaXR5LQotICogZ2V0X2NhcGFiaWxpdHkgZnVuY3Rpb24gaXMgbm90IHlldCBmdWxseSBpbXBsZW1lbnRlZAotICogaW4gYXRoNWsgc28gbW9zdCBvZiB0aGVzZSBkb24ndCB3b3JrIHlldC4uLgotICogVE9ETzogSW1wbGVtZW50IHRoZXNlICYgbWVyZ2Ugd2l0aCBfVFVORV8gc3R1ZmYgYWJvdmUKLSAqLwotZW51bSBhdGg1a19jYXBhYmlsaXR5X3R5cGUgewotCUFSNUtfQ0FQX1JFR19ETU4JCT0gMCwJLyogVXNlZCB0byBnZXQgY3VycmVudCByZWcuIGRvbWFpbiBpZCAqLwotCUFSNUtfQ0FQX1RLSVBfTUlDCQk9IDIsCS8qIENhbiBoYW5kbGUgVEtJUCBNSUMgaW4gaGFyZHdhcmUgKi8KLQlBUjVLX0NBUF9US0lQX1NQTElUCQk9IDMsCS8qIFRLSVAgdXNlcyBzcGxpdCBrZXlzICovCi0JQVI1S19DQVBfUEhZQ09VTlRFUlMJCT0gNCwJLyogUEhZIGVycm9yIGNvdW50ZXJzICovCi0JQVI1S19DQVBfRElWRVJTSVRZCQk9IDUsCS8qIFN1cHBvcnRzIGZhc3QgZGl2ZXJzaXR5ICovCi0JQVI1S19DQVBfTlVNX1RYUVVFVUVTCQk9IDYsCS8qIFVzZWQgdG8gZ2V0IG1heCBudW1iZXIgb2YgaHcgdHhxdWV1ZXMgKi8KLQlBUjVLX0NBUF9WRU9MCQkJPSA3LAkvKiBTdXBwb3J0cyB2aXJ0dWFsIEVPTCAqLwotCUFSNUtfQ0FQX0NPTVBSRVNTSU9OCQk9IDgsCS8qIFN1cHBvcnRzIGNvbXByZXNzaW9uICovCi0JQVI1S19DQVBfQlVSU1QJCQk9IDksCS8qIFN1cHBvcnRzIHBhY2tldCBidXJzdGluZyAqLwotCUFSNUtfQ0FQX0ZBU1RGUkFNRQkJPSAxMCwJLyogU3VwcG9ydHMgZmFzdCBmcmFtZXMgKi8KLQlBUjVLX0NBUF9UWFBPVwkJCT0gMTEsCS8qIFVzZWQgdG8gZ2V0IGdsb2JhbCB0eCBwb3dlciBsaW1pdCAqLwotCUFSNUtfQ0FQX1RQQwkJCT0gMTIsCS8qIENhbiBkbyBwZXItcGFja2V0IHR4IHBvd2VyIGNvbnRyb2wgKG5lZWRlZCBmb3IgODAyLjExYSkgKi8KLQlBUjVLX0NBUF9CU1NJRE1BU0sJCT0gMTMsCS8qIFN1cHBvcnRzIGJzc2lkIG1hc2sgKi8KLQlBUjVLX0NBUF9NQ0FTVF9LRVlTUkNICQk9IDE0LAkvKiBTdXBwb3J0cyBtdWx0aWNhc3Qga2V5IHNlYXJjaCAqLwotCUFSNUtfQ0FQX1RTRl9BREpVU1QJCT0gMTUsCS8qIFN1cHBvcnRzIGJlYWNvbiB0c2YgYWRqdXN0ICovCi0JQVI1S19DQVBfWFIJCQk9IDE2LAkvKiBTdXBwb3J0cyBYUiBtb2RlICovCi0JQVI1S19DQVBfV01FX1RLSVBNSUMgCQk9IDE3LAkvKiBTdXBwb3J0cyBUS0lQIE1JQyB3aGVuIHVzaW5nIFdNTSAqLwotCUFSNUtfQ0FQX0NIQU5fSEFMRlJBVEUgCQk9IDE4LAkvKiBTdXBwb3J0cyBoYWxmIHJhdGUgY2hhbm5lbHMgKi8KLQlBUjVLX0NBUF9DSEFOX1FVQVJURVJSQVRFIAk9IDE5LAkvKiBTdXBwb3J0cyBxdWFydGVyIHJhdGUgY2hhbm5lbHMgKi8KLQlBUjVLX0NBUF9SRlNJTEVOVAkJPSAyMCwJLyogU3VwcG9ydHMgUkZzaWxlbnQgKi8KLX07Ci0KIAogLyogWFhYOiB3ZSAqbWF5KiBtb3ZlIGNhcF9yYW5nZSBzdHVmZiB0byBzdHJ1Y3Qgd2lwaHkgKi8KIHN0cnVjdCBhdGg1a19jYXBhYmlsaXRpZXMgewpAQCAtMTAwOSw4ICsxMDA4LDcgQEAKIAogLyogc2l6ZSBvZiBub2lzZSBmbG9vciBoaXN0b3J5IChrZWVwIGl0IGEgcG93ZXIgb2YgdHdvKSAqLwogI2RlZmluZSBBVEg1S19ORl9DQUxfSElTVF9NQVgJOAotc3RydWN0IGF0aDVrX25mY2FsX2hpc3QKLXsKK3N0cnVjdCBhdGg1a19uZmNhbF9oaXN0IHsKIAlzMTYgaW5kZXg7CQkJCS8qIGN1cnJlbnQgaW5kZXggaW50byBuZnZhbCAqLwogCXMxNiBuZnZhbFtBVEg1S19ORl9DQUxfSElTVF9NQVhdOwkvKiBsYXN0IGZldyBub2lzZSBmbG9vcnMgKi8KIH07CkBAIC0xMDI1LDkgKzEwMjMsNjYgQEAKIAlpbnQgYXZnX3dlaWdodDsKIH07CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gIEhBUkRXQVJFIEFCU1RSQUNUSU9OIExBWUVSIFNUUlVDVFVSRQotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQVRINUtfTEVEX01BWF9OQU1FX0xFTiAzMQorCisvKgorICogU3RhdGUgZm9yIExFRCB0cmlnZ2VycworICovCitzdHJ1Y3QgYXRoNWtfbGVkIHsKKwljaGFyIG5hbWVbQVRINUtfTEVEX01BWF9OQU1FX0xFTiArIDFdOwkvKiBuYW1lIG9mIHRoZSBMRUQgaW4gc3lzZnMgKi8KKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoOwkJCS8qIGRyaXZlciBzdGF0ZSAqLworCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkX2RldjsJCS8qIGxlZCBjbGFzc2RldiAqLworfTsKKworLyogUmZraWxsICovCitzdHJ1Y3QgYXRoNWtfcmZraWxsIHsKKwkvKiBHUElPIFBJTiBmb3IgcmZraWxsICovCisJdTE2IGdwaW87CisJLyogcG9sYXJpdHkgb2YgcmZraWxsIEdQSU8gUElOICovCisJYm9vbCBwb2xhcml0eTsKKwkvKiBSRktJTEwgdG9nZ2xlIHRhc2tsZXQgKi8KKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdG9nZ2xlcTsKK307CisKKy8qIHN0YXRpc3RpY3MgKi8KK3N0cnVjdCBhdGg1a19zdGF0aXN0aWNzIHsKKwkvKiBhbnRlbm5hIHVzZSAqLworCXVuc2lnbmVkIGludCBhbnRlbm5hX3J4WzVdOwkvKiBmcmFtZXMgY291bnQgcGVyIGFudGVubmEgUlggKi8KKwl1bnNpZ25lZCBpbnQgYW50ZW5uYV90eFs1XTsJLyogZnJhbWVzIGNvdW50IHBlciBhbnRlbm5hIFRYICovCisKKwkvKiBmcmFtZSBlcnJvcnMgKi8KKwl1bnNpZ25lZCBpbnQgcnhfYWxsX2NvdW50OwkvKiBhbGwgUlggZnJhbWVzLCBpbmNsdWRpbmcgZXJyb3JzICovCisJdW5zaWduZWQgaW50IHR4X2FsbF9jb3VudDsJLyogYWxsIFRYIGZyYW1lcywgaW5jbHVkaW5nIGVycm9ycyAqLworCXVuc2lnbmVkIGludCByeF9ieXRlc19jb3VudDsJLyogYWxsIFJYIGJ5dGVzLCBpbmNsdWRpbmcgZXJyb3JlZCBwa3RzCisJCQkJCSAqIGFuZCB0aGUgTUFDIGhlYWRlcnMgZm9yIGVhY2ggcGFja2V0CisJCQkJCSAqLworCXVuc2lnbmVkIGludCB0eF9ieXRlc19jb3VudDsJLyogYWxsIFRYIGJ5dGVzLCBpbmNsdWRpbmcgZXJyb3JlZCBwa3RzCisJCQkJCSAqIGFuZCB0aGUgTUFDIGhlYWRlcnMgYW5kIHBhZGRpbmcgZm9yCisJCQkJCSAqIGVhY2ggcGFja2V0LgorCQkJCQkgKi8KKwl1bnNpZ25lZCBpbnQgcnhlcnJfY3JjOworCXVuc2lnbmVkIGludCByeGVycl9waHk7CisJdW5zaWduZWQgaW50IHJ4ZXJyX3BoeV9jb2RlWzMyXTsKKwl1bnNpZ25lZCBpbnQgcnhlcnJfZmlmbzsKKwl1bnNpZ25lZCBpbnQgcnhlcnJfZGVjcnlwdDsKKwl1bnNpZ25lZCBpbnQgcnhlcnJfbWljOworCXVuc2lnbmVkIGludCByeGVycl9wcm9jOworCXVuc2lnbmVkIGludCByeGVycl9qdW1ibzsKKwl1bnNpZ25lZCBpbnQgdHhlcnJfcmV0cnk7CisJdW5zaWduZWQgaW50IHR4ZXJyX2ZpZm87CisJdW5zaWduZWQgaW50IHR4ZXJyX2ZpbHQ7CisKKwkvKiBNSUIgY291bnRlcnMgKi8KKwl1bnNpZ25lZCBpbnQgYWNrX2ZhaWw7CisJdW5zaWduZWQgaW50IHJ0c19mYWlsOworCXVuc2lnbmVkIGludCBydHNfb2s7CisJdW5zaWduZWQgaW50IGZjc19lcnJvcjsKKwl1bnNpZ25lZCBpbnQgYmVhY29uczsKKworCXVuc2lnbmVkIGludCBtaWJfaW50cjsKKwl1bnNpZ25lZCBpbnQgcnhvcm5faW50cjsKKwl1bnNpZ25lZCBpbnQgcnhlb2xfaW50cjsKK307CiAKIC8qCiAgKiBNaXNjIGRlZmluZXMKQEAgLTEwMzYsMTIgKzEwOTEsMTE0IEBACiAjZGVmaW5lIEFSNUtfTUFYX0dQSU8JCTEwCiAjZGVmaW5lIEFSNUtfTUFYX1JGX0JBTktTCTgKIAotLyogVE9ETzogQ2xlYW4gdXAgYW5kIG1lcmdlIHdpdGggYXRoNWtfc29mdGMgKi8KKyNpZiBDSEFOX0RFQlVHCisjZGVmaW5lIEFUSF9DSEFOX01BWAkoMjYgKyAyNiArIDI2ICsgMjAwICsgMjAwKQorI2Vsc2UKKyNkZWZpbmUgQVRIX0NIQU5fTUFYCSgxNCArIDE0ICsgMTQgKyAyNTIgKyAyMCkKKyNlbmRpZgorCisjZGVmaW5lCUFUSF9SWEJVRgk0MAkJLyogbnVtYmVyIG9mIFJYIGJ1ZmZlcnMgKi8KKyNkZWZpbmUJQVRIX1RYQlVGCTIwMAkJLyogbnVtYmVyIG9mIFRYIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgQVRIX0JDQlVGCTQJCS8qIG51bWJlciBvZiBiZWFjb24gYnVmZmVycyAqLworI2RlZmluZSBBVEg1S19UWFFfTEVOX01BWAkoQVRIX1RYQlVGIC8gNCkJCS8qIGJ1ZnMgcGVyIHF1ZXVlICovCisjZGVmaW5lIEFUSDVLX1RYUV9MRU5fTE9XCShBVEg1S19UWFFfTEVOX01BWCAvIDIpCS8qIGxvdyBtYXJrICovCisKKy8qIERyaXZlciBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggYW4gaW5zdGFuY2Ugb2YgYSBkZXZpY2UgKi8KIHN0cnVjdCBhdGg1a19odyB7CiAJc3RydWN0IGF0aF9jb21tb24gICAgICAgY29tbW9uOwogCi0Jc3RydWN0IGF0aDVrX3NvZnRjCSphaF9zYzsKLQl2b2lkIF9faW9tZW0JCSphaF9pb2Jhc2U7CisJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CQkvKiBmb3IgZG1hIG1hcHBpbmcgKi8KKwlpbnQgaXJxOworCXUxNiBkZXZpZDsKKwl2b2lkIF9faW9tZW0JCSppb2Jhc2U7CS8qIGFkZHJlc3Mgb2YgdGhlIGRldmljZSAqLworCXN0cnVjdCBtdXRleAkJbG9jazsJCS8qIGRldi1sZXZlbCBsb2NrICovCisJc3RydWN0IGllZWU4MDIxMV9odwkqaHc7CQkvKiBJRUVFIDgwMi4xMSBjb21tb24gKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIHNiYW5kc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgY2hhbm5lbHNbQVRIX0NIQU5fTUFYXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUJcmF0ZXNbSUVFRTgwMjExX05VTV9CQU5EU11bQVI1S19NQVhfUkFURVNdOworCXM4CQkJcmF0ZV9pZHhbSUVFRTgwMjExX05VTV9CQU5EU11bQVI1S19NQVhfUkFURVNdOworCWVudW0gbmw4MDIxMV9pZnR5cGUJb3Btb2RlOworCisjaWZkZWYgQ09ORklHX0FUSDVLX0RFQlVHCisJc3RydWN0IGF0aDVrX2RiZ19pbmZvCWRlYnVnOwkJLyogZGVidWcgaW5mbyAqLworI2VuZGlmIC8qIENPTkZJR19BVEg1S19ERUJVRyAqLworCisJc3RydWN0IGF0aDVrX2J1ZgkqYnVmcHRyOwkvKiBhbGxvY2F0ZWQgYnVmZmVyIHB0ciAqLworCXN0cnVjdCBhdGg1a19kZXNjCSpkZXNjOwkJLyogVFgvUlggZGVzY3JpcHRvcnMgKi8KKwlkbWFfYWRkcl90CQlkZXNjX2RhZGRyOwkvKiBETUEgKHBoeXNpY2FsKSBhZGRyZXNzICovCisJc2l6ZV90CQkJZGVzY19sZW47CS8qIHNpemUgb2YgVFgvUlggZGVzY3JpcHRvcnMgKi8KKworCURFQ0xBUkVfQklUTUFQKHN0YXR1cywgNik7CisjZGVmaW5lIEFUSF9TVEFUX0lOVkFMSUQJMAkJLyogZGlzYWJsZSBoYXJkd2FyZSBhY2Nlc3NlcyAqLworI2RlZmluZSBBVEhfU1RBVF9NUlJFVFJZCTEJCS8qIG11bHRpLXJhdGUgcmV0cnkgc3VwcG9ydCAqLworI2RlZmluZSBBVEhfU1RBVF9QUk9NSVNDCTIKKyNkZWZpbmUgQVRIX1NUQVRfTEVEU09GVAkzCQkvKiBlbmFibGUgTEVEIGdwaW8gc3RhdHVzICovCisjZGVmaW5lIEFUSF9TVEFUX1NUQVJURUQJNAkJLyogb3BlbmVkICYgaXJxcyBlbmFibGVkICovCisjZGVmaW5lIEFUSF9TVEFUXzJHX0RJU0FCTEVECTUJCS8qIG11bHRpYmFuZCByYWRpbyB3aXRob3V0IDJHICovCisKKwl1bnNpZ25lZCBpbnQJCWZpbHRlcl9mbGFnczsJLyogSFcgZmxhZ3MsIEFSNUtfUlhfRklMVEVSXyogKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmN1cmNoYW47CS8qIGN1cnJlbnQgaC93IGNoYW5uZWwgKi8KKworCXUxNgkJCW52aWZzOworCisJZW51bSBhdGg1a19pbnQJCWltYXNrOwkJLyogaW50ZXJydXB0IG1hc2sgY29weSAqLworCisJc3BpbmxvY2tfdAkJaXJxbG9jazsKKwlib29sCQkJcnhfcGVuZGluZzsJLyogcnggdGFza2xldCBwZW5kaW5nICovCisJYm9vbAkJCXR4X3BlbmRpbmc7CS8qIHR4IHRhc2tsZXQgcGVuZGluZyAqLworCisJdTgJCQlsbGFkZHJbRVRIX0FMRU5dOworCXU4CQkJYnNzaWRtYXNrW0VUSF9BTEVOXTsKKworCXVuc2lnbmVkIGludAkJbGVkX3BpbiwJLyogR1BJTyBwaW4gZm9yIGRyaXZpbmcgTEVEICovCisJCQkJbGVkX29uOwkJLyogcGluIHNldHRpbmcgZm9yIExFRCBvbiAqLworCisJc3RydWN0IHdvcmtfc3RydWN0CXJlc2V0X3dvcms7CS8qIGRlZmVycmVkIGNoaXAgcmVzZXQgKi8KKworCXVuc2lnbmVkIGludAkJcnhidWZzaXplOwkvKiByeCBzaXplIGJhc2VkIG9uIG10dSAqLworCXN0cnVjdCBsaXN0X2hlYWQJcnhidWY7CQkvKiByZWNlaXZlIGJ1ZmZlciAqLworCXNwaW5sb2NrX3QJCXJ4YnVmbG9jazsKKwl1MzIJCQkqcnhsaW5rOwkvKiBsaW5rIHB0ciBpbiBsYXN0IFJYIGRlc2MgKi8KKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcnh0cTsJCS8qIHJ4IGludHIgdGFza2xldCAqLworCXN0cnVjdCBhdGg1a19sZWQJcnhfbGVkOwkJLyogcnggbGVkICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkCXR4YnVmOwkJLyogdHJhbnNtaXQgYnVmZmVyICovCisJc3BpbmxvY2tfdAkJdHhidWZsb2NrOworCXVuc2lnbmVkIGludAkJdHhidWZfbGVuOwkvKiBidWYgY291bnQgaW4gdHhidWYgbGlzdCAqLworCXN0cnVjdCBhdGg1a190eHEJdHhxc1tBUjVLX05VTV9UWF9RVUVVRVNdOwkvKiB0eCBxdWV1ZXMgKi8KKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdHh0cTsJCS8qIHR4IGludHIgdGFza2xldCAqLworCXN0cnVjdCBhdGg1a19sZWQJdHhfbGVkOwkJLyogdHggbGVkICovCisKKwlzdHJ1Y3QgYXRoNWtfcmZraWxsCXJmX2tpbGw7CisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJY2FsaWI7CQkvKiBjYWxpYnJhdGlvbiB0YXNrbGV0ICovCisKKwlzcGlubG9ja190CQlibG9jazsJCS8qIHByb3RlY3RzIGJlYWNvbiAqLworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAliZWFjb250cTsJLyogYmVhY29uIGludHIgdGFza2xldCAqLworCXN0cnVjdCBsaXN0X2hlYWQJYmNidWY7CQkvKiBiZWFjb24gYnVmZmVyICovCisJc3RydWN0IGllZWU4MDIxMV92aWYJKmJzbG90W0FUSF9CQ0JVRl07CisJdTE2CQkJbnVtX2FwX3ZpZnM7CisJdTE2CQkJbnVtX2FkaG9jX3ZpZnM7CisJdW5zaWduZWQgaW50CQliaGFscSwJCS8qIFNXIHEgZm9yIG91dGdvaW5nIGJlYWNvbnMgKi8KKwkJCQlibWlzc2NvdW50LAkvKiBtaXNzZWQgYmVhY29uIHRyYW5zbWl0cyAqLworCQkJCWJpbnR2YWwsCS8qIGJlYWNvbiBpbnRlcnZhbCBpbiBUVSAqLworCQkJCWJzZW50OworCXVuc2lnbmVkIGludAkJbmV4dHRidHQ7CS8qIG5leHQgYmVhY29uIHRpbWUgaW4gVFUgKi8KKwlzdHJ1Y3QgYXRoNWtfdHhxCSpjYWJxOwkJLyogY29udGVudCBhZnRlciBiZWFjb24gKi8KKworCWludAkJCXBvd2VyX2xldmVsOwkvKiBSZXF1ZXN0ZWQgdHggcG93ZXIgaW4gZEJtICovCisJYm9vbAkJCWFzc29jOwkJLyogYXNzb2NpYXRlIHN0YXRlICovCisJYm9vbAkJCWVuYWJsZV9iZWFjb247CS8qIHRydWUgaWYgYmVhY29ucyBhcmUgb24gKi8KKworCXN0cnVjdCBhdGg1a19zdGF0aXN0aWNzCXN0YXRzOworCisJc3RydWN0IGF0aDVrX2FuaV9zdGF0ZQlhbmlfc3RhdGU7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CWFuaV90YXNrbGV0OwkvKiBBTkkgY2FsaWJyYXRpb24gKi8KKworCXN0cnVjdCBkZWxheWVkX3dvcmsJdHhfY29tcGxldGVfd29yazsKKworCXN0cnVjdCBzdXJ2ZXlfaW5mbwlzdXJ2ZXk7CQkvKiBjb2xsZWN0ZWQgc3VydmV5IGluZm8gKi8KIAogCWVudW0gYXRoNWtfaW50CQlhaF9pbXI7CiAKQEAgLTEwNjUsNiArMTIyMiw4IEBACiAJdTgJCQlhaF9yZXRyeV9sb25nOwogCXU4CQkJYWhfcmV0cnlfc2hvcnQ7CiAKKwl1MzIJCQlhaF91c2VfMzJraHpfY2xvY2s7CisKIAl1OAkJCWFoX2NvdmVyYWdlX2NsYXNzOwogCWJvb2wJCQlhaF9hY2tfYml0cmF0ZV9oaWdoOwogCXU4CQkJYWhfYndtb2RlOwpAQCAtMTE2OCw0MyArMTMyNyw0MyBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzIGF0aDVrX2h3X29wczsKIAogLyogSW5pdGlhbGl6YXRpb24gYW5kIGRldGFjaCBmdW5jdGlvbnMgKi8KLWludCBhdGg1a19pbml0X3NvZnRjKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIGNvbnN0IHN0cnVjdCBhdGhfYnVzX29wcyAqYnVzX29wcyk7Ci12b2lkIGF0aDVrX2RlaW5pdF9zb2Z0YyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKLWludCBhdGg1a19od19pbml0KHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOworaW50IGF0aDVrX2luaXRfc29mdGMoc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3Qgc3RydWN0IGF0aF9idXNfb3BzICpidXNfb3BzKTsKK3ZvaWQgYXRoNWtfZGVpbml0X3NvZnRjKHN0cnVjdCBhdGg1a19odyAqYWgpOworaW50IGF0aDVrX2h3X2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCk7CiB2b2lkIGF0aDVrX2h3X2RlaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKIAotaW50IGF0aDVrX3N5c2ZzX3JlZ2lzdGVyKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOwotdm9pZCBhdGg1a19zeXNmc191bnJlZ2lzdGVyKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOworaW50IGF0aDVrX3N5c2ZzX3JlZ2lzdGVyKHN0cnVjdCBhdGg1a19odyAqYWgpOwordm9pZCBhdGg1a19zeXNmc191bnJlZ2lzdGVyKHN0cnVjdCBhdGg1a19odyAqYWgpOwogCiAvKiBiYXNlLmMgKi8KIHN0cnVjdCBhdGg1a19idWY7CiBzdHJ1Y3QgYXRoNWtfdHhxOwogCi12b2lkIHNldF9iZWFjb25fZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGVuYWJsZSk7Ci1ib29sIGF0aF9hbnlfdmlmX2Fzc29jKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOwordm9pZCBhdGg1a19zZXRfYmVhY29uX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBlbmFibGUpOworYm9vbCBhdGg1a19hbnlfdmlmX2Fzc29jKHN0cnVjdCBhdGg1a19odyAqYWgpOwogdm9pZCBhdGg1a190eF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgIHN0cnVjdCBhdGg1a190eHEgKnR4cSk7Ci1pbnQgYXRoNWtfaW5pdF9odyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKLWludCBhdGg1a19zdG9wX2h3KHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOwotdm9pZCBhdGg1a19tb2RlX3NldHVwKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwotdm9pZCBhdGg1a191cGRhdGVfYnNzaWRfbWFza19hbmRfb3Btb2RlKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsCitpbnQgYXRoNWtfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBhdGg1a19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgYXRoNWtfbW9kZV9zZXR1cChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKK3ZvaWQgYXRoNWtfdXBkYXRlX2Jzc2lkX21hc2tfYW5kX29wbW9kZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLWludCBhdGg1a19jaGFuX3NldChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4pOwotdm9pZCBhdGg1a19iZWFjb25fdXBkYXRlX3RpbWVycyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCB1NjQgYmNfdHNmKTsKK2ludCBhdGg1a19jaGFuX3NldChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4pOwordm9pZCBhdGg1a19iZWFjb25fdXBkYXRlX3RpbWVycyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1NjQgYmNfdHNmKTsKIGludCBhdGg1a19iZWFjb25fdXBkYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLXZvaWQgYXRoNWtfYmVhY29uX2NvbmZpZyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKLXZvaWQgYXRoNWtfdHhidWZfZnJlZV9za2Ioc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IGF0aDVrX2J1ZiAqYmYpOwotdm9pZCBhdGg1a19yeGJ1Zl9mcmVlX3NrYihzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoNWtfYnVmICpiZik7Cit2b2lkIGF0aDVrX2JlYWNvbl9jb25maWcoc3RydWN0IGF0aDVrX2h3ICphaCk7Cit2b2lkIGF0aDVrX3R4YnVmX2ZyZWVfc2tiKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19idWYgKmJmKTsKK3ZvaWQgYXRoNWtfcnhidWZfZnJlZV9za2Ioc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2J1ZiAqYmYpOwogCiAvKkNoaXAgaWQgaGVscGVyIGZ1bmN0aW9ucyAqLwogY29uc3QgY2hhciAqYXRoNWtfY2hpcF9uYW1lKGVudW0gYXRoNWtfc3Jldl90eXBlIHR5cGUsIHVfaW50MTZfdCB2YWwpOwogaW50IGF0aDVrX2h3X3JlYWRfc3JldihzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKIAogLyogTEVEIGZ1bmN0aW9ucyAqLwotaW50IGF0aDVrX2luaXRfbGVkcyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKLXZvaWQgYXRoNWtfbGVkX2VuYWJsZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKLXZvaWQgYXRoNWtfbGVkX29mZihzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKLXZvaWQgYXRoNWtfdW5yZWdpc3Rlcl9sZWRzKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOworaW50IGF0aDVrX2luaXRfbGVkcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK3ZvaWQgYXRoNWtfbGVkX2VuYWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK3ZvaWQgYXRoNWtfbGVkX29mZihzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK3ZvaWQgYXRoNWtfdW5yZWdpc3Rlcl9sZWRzKHN0cnVjdCBhdGg1a19odyAqYWgpOwogCiAKIC8qIFJlc2V0IEZ1bmN0aW9ucyAqLwpAQCAtMTI1Myw3ICsxNDEyLDcgQEAKIAkJaW50IGxlbiwgc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlLCBib29sIHNob3J0cHJlKTsKIHVuc2lnbmVkIGludCBhdGg1a19od19nZXRfZGVmYXVsdF9zbG90dGltZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKIHVuc2lnbmVkIGludCBhdGg1a19od19nZXRfZGVmYXVsdF9zaWZzKHN0cnVjdCBhdGg1a19odyAqYWgpOwotZXh0ZXJuIGludCBhdGg1a19od19zZXRfb3Btb2RlKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3Btb2RlKTsKK2ludCBhdGg1a19od19zZXRfb3Btb2RlKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3Btb2RlKTsKIHZvaWQgYXRoNWtfaHdfc2V0X2NvdmVyYWdlX2NsYXNzKHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IGNvdmVyYWdlX2NsYXNzKTsKIC8qIFJYIGZpbHRlciBjb250cm9sKi8KIGludCBhdGg1a19od19zZXRfbGxhZGRyKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICptYWMpOwpAQCAtMTMxOCw5ICsxNDc3LDYgQEAKIAogLyogTWlzYyBmdW5jdGlvbnMgVE9ETzogQ2xlYW51cCAqLwogaW50IGF0aDVrX2h3X3NldF9jYXBhYmlsaXRpZXMoc3RydWN0IGF0aDVrX2h3ICphaCk7Ci1pbnQgYXRoNWtfaHdfZ2V0X2NhcGFiaWxpdHkoc3RydWN0IGF0aDVrX2h3ICphaCwKLQkJCSAgICBlbnVtIGF0aDVrX2NhcGFiaWxpdHlfdHlwZSBjYXBfdHlwZSwgdTMyIGNhcGFiaWxpdHksCi0JCQkgICAgdTMyICpyZXN1bHQpOwogaW50IGF0aDVrX2h3X2VuYWJsZV9wc3BvbGwoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggKmJzc2lkLCB1MTYgYXNzb2NfaWQpOwogaW50IGF0aDVrX2h3X2Rpc2FibGVfcHNwb2xsKHN0cnVjdCBhdGg1a19odyAqYWgpOwogCkBAIC0xMzU2LDE3ICsxNTEyLDE3IEBACiAJCQkJdTggbW9kZSwgYm9vbCBmYXN0KTsKIAogLyoKLSAqIEZ1bmN0aW9ucyB1c2VkIGludGVybmFseQorICogRnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseQogICovCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGF0aF9jb21tb24gKmF0aDVrX2h3X2NvbW1vbihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotICAgICAgICByZXR1cm4gJmFoLT5jb21tb247CisJcmV0dXJuICZhaC0+Y29tbW9uOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhdGhfcmVndWxhdG9yeSAqYXRoNWtfaHdfcmVndWxhdG9yeShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotICAgICAgICByZXR1cm4gJihhdGg1a19od19jb21tb24oYWgpLT5yZWd1bGF0b3J5KTsKKwlyZXR1cm4gJihhdGg1a19od19jb21tb24oYWgpLT5yZWd1bGF0b3J5KTsKIH0KIAogI2lmZGVmIENPTkZJR19BVEhFUk9TX0FSMjMxWApAQCAtMTM3NywxMCArMTUzMywxMCBAQAogCS8qIE9uIEFSMjMxNSBhbmQgQVIyMzE3IHRoZSBQQ0kgY2xvY2sgZG9tYWluIHJlZ2lzdGVycwogCSAqIGFyZSBvdXRzaWRlIG9mIHRoZSBXTUFDIHJlZ2lzdGVyIHNwYWNlICovCiAJaWYgKHVubGlrZWx5KChyZWcgPj0gMHg0MDAwKSAmJiAocmVnIDwgMHg1MDAwKSAmJgotCQkoYWgtPmFoX21hY19zcmV2ID49IEFSNUtfU1JFVl9BUjIzMTVfUjYpKSkKKwkgICAgKGFoLT5haF9tYWNfc3JldiA+PSBBUjVLX1NSRVZfQVIyMzE1X1I2KSkpCiAJCXJldHVybiBBUjVLX0FSMjMxNV9QQ0lfQkFTRSArIHJlZzsKIAotCXJldHVybiBhaC0+YWhfaW9iYXNlICsgcmVnOworCXJldHVybiBhaC0+aW9iYXNlICsgcmVnOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBhdGg1a19od19yZWdfcmVhZChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgcmVnKQpAQCAtMTM5NywxMiArMTU1MywxMiBAQAogCiBzdGF0aWMgaW5saW5lIHUzMiBhdGg1a19od19yZWdfcmVhZChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgcmVnKQogewotCXJldHVybiBpb3JlYWQzMihhaC0+YWhfaW9iYXNlICsgcmVnKTsKKwlyZXR1cm4gaW9yZWFkMzIoYWgtPmlvYmFzZSArIHJlZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a19od19yZWdfd3JpdGUoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHZhbCwgdTE2IHJlZykKIHsKLQlpb3dyaXRlMzIodmFsLCBhaC0+YWhfaW9iYXNlICsgcmVnKTsKKwlpb3dyaXRlMzIodmFsLCBhaC0+aW9iYXNlICsgcmVnKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXR0YWNoLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXR0YWNoLmMKaW5kZXggMTU4ODQwMS4uZjhhNmIzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0dGFjaC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hdHRhY2guYwpAQCAtNTksNyArNTksNyBAQAogCQkJY3VyX3ZhbCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBjdXJfcmVnKTsKIAogCQkJaWYgKGN1cl92YWwgIT0gdmFyX3BhdHRlcm4pIHsKLQkJCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiUE9TVCBGYWlsZWQgISEhXG4iKTsKKwkJCQlBVEg1S19FUlIoYWgsICJQT1NUIEZhaWxlZCAhISFcbiIpOwogCQkJCXJldHVybiAtRUFHQUlOOwogCQkJfQogCkBAIC03NCw3ICs3NCw3IEBACiAJCQljdXJfdmFsID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIGN1cl9yZWcpOwogCiAJCQlpZiAoY3VyX3ZhbCAhPSB2YXJfcGF0dGVybikgewotCQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsICJQT1NUIEZhaWxlZCAhISFcbiIpOworCQkJCUFUSDVLX0VSUihhaCwgIlBPU1QgRmFpbGVkICEhIVxuIik7CiAJCQkJcmV0dXJuIC1FQUdBSU47CiAJCQl9CiAKQEAgLTk1LDE4ICs5NSwxOCBAQAogLyoqCiAgKiBhdGg1a19od19pbml0IC0gQ2hlY2sgaWYgaHcgaXMgc3VwcG9ydGVkIGFuZCBpbml0IHRoZSBuZWVkZWQgc3RydWN0cwogICoKLSAqIEBzYzogVGhlICZzdHJ1Y3QgYXRoNWtfc29mdGMgd2UgZ290IGZyb20gdGhlIGRyaXZlcidzIGluaXRfc29mdGMgZnVuY3Rpb24KKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcgd2UgZ290IGZyb20gdGhlIGRyaXZlcidzIGluaXRfc29mdGMgZnVuY3Rpb24KICAqCiAgKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCwgcGVyZm9ybSBhIFBPU1QgYW5kIGluaXRpYWxpemUgdGhlIG5lZWRlZAogICogc3RydWN0cy4gUmV0dXJucyAtRU5PTUVNIGlmIHdlIGRvbid0IGhhdmUgbWVtb3J5IGZvciB0aGUgbmVlZGVkIHN0cnVjdHMsCiAgKiAtRU5PREVWIGlmIHRoZSBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCBvciBwcmludHMgYW4gZXJyb3IgbXNnIGlmIHNvbWV0aGluZwogICogZWxzZSB3ZW50IHdyb25nLgogICovCi1pbnQgYXRoNWtfaHdfaW5pdChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQoraW50IGF0aDVrX2h3X2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCXN0YXRpYyBjb25zdCB1OCB6ZXJvX21hY1tFVEhfQUxFTl0gPSB7IH07CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBzYy0+cGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFoLT5wZGV2OwogCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWU7CiAJaW50IHJldDsKIAl1MzIgc3JldjsKQEAgLTEyMiw4ICsxMjIsOCBAQAogCWFoLT5haF9yZXRyeV9sb25nID0gQVI1S19JTklUX1JFVFJZX0xPTkc7CiAJYWgtPmFoX2FudF9tb2RlID0gQVI1S19BTlRNT0RFX0RFRkFVTFQ7CiAJYWgtPmFoX25vaXNlX2Zsb29yID0gLTk1OwkvKiB1bnRpbCBmaXJzdCBORiBjYWxpYnJhdGlvbiBpcyBydW4gKi8KLQlzYy0+YW5pX3N0YXRlLmFuaV9tb2RlID0gQVRINUtfQU5JX01PREVfQVVUTzsKLQlhaC0+YWhfY3VycmVudF9jaGFubmVsID0gJnNjLT5jaGFubmVsc1swXTsKKwlhaC0+YW5pX3N0YXRlLmFuaV9tb2RlID0gQVRINUtfQU5JX01PREVfQVVUTzsKKwlhaC0+YWhfY3VycmVudF9jaGFubmVsID0gJmFoLT5jaGFubmVsc1swXTsKIAogCS8qCiAJICogRmluZCB0aGUgbWFjIHZlcnNpb24KQEAgLTE5MSw3ICsxOTEsNyBAQAogCQlicmVhazsKIAljYXNlIEFSNUtfU1JFVl9SQURfNTQyNDoKIAkJaWYgKGFoLT5haF9tYWNfdmVyc2lvbiA9PSBBUjVLX1NSRVZfQVIyNDI1IHx8Ci0JCWFoLT5haF9tYWNfdmVyc2lvbiA9PSBBUjVLX1NSRVZfQVIyNDE3KXsKKwkJICAgIGFoLT5haF9tYWNfdmVyc2lvbiA9PSBBUjVLX1NSRVZfQVIyNDE3KSB7CiAJCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGMjQyNTsKIAkJCWFoLT5haF9zaW5nbGVfY2hpcCA9IHRydWU7CiAJCX0gZWxzZSB7CkBAIC0yMTAsNDMgKzIxMCw0MiBAQAogCQkJYWgtPmFoX3JhZGlvXzJnaHpfcmV2aXNpb24gPSBhdGg1a19od19yYWRpb19yZXZpc2lvbihhaCwKIAkJCQkJCQkJQ0hBTk5FTF8yR0haKTsKIAkJfSBlbHNlIGlmIChhaC0+YWhfbWFjX3ZlcnNpb24gPT0gKEFSNUtfU1JFVl9BUjI0MjUgPj4gNCkgfHwKLQkJYWgtPmFoX21hY192ZXJzaW9uID09IChBUjVLX1NSRVZfQVIyNDE3ID4+IDQpIHx8Ci0JCWFoLT5haF9waHlfcmV2aXNpb24gPT0gQVI1S19TUkVWX1BIWV8yNDI1KSB7CisJCQkgICBhaC0+YWhfbWFjX3ZlcnNpb24gPT0gKEFSNUtfU1JFVl9BUjI0MTcgPj4gNCkgfHwKKwkJCSAgIGFoLT5haF9waHlfcmV2aXNpb24gPT0gQVI1S19TUkVWX1BIWV8yNDI1KSB7CiAJCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGMjQyNTsKIAkJCWFoLT5haF9zaW5nbGVfY2hpcCA9IHRydWU7CiAJCQlhaC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiA9IEFSNUtfU1JFVl9SQURfMjQyNTsKIAkJfSBlbHNlIGlmIChzcmV2ID09IEFSNUtfU1JFVl9BUjUyMTNBICYmCi0JCWFoLT5haF9waHlfcmV2aXNpb24gPT0gQVI1S19TUkVWX1BIWV81MjEyQikgeworCQkJICAgYWgtPmFoX3BoeV9yZXZpc2lvbiA9PSBBUjVLX1NSRVZfUEhZXzUyMTJCKSB7CiAJCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGNTExMjsKIAkJCWFoLT5haF9zaW5nbGVfY2hpcCA9IGZhbHNlOwogCQkJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPSBBUjVLX1NSRVZfUkFEXzUxMTJCOwogCQl9IGVsc2UgaWYgKGFoLT5haF9tYWNfdmVyc2lvbiA9PSAoQVI1S19TUkVWX0FSMjQxNSA+PiA0KSB8fAotCQkJYWgtPmFoX21hY192ZXJzaW9uID09IChBUjVLX1NSRVZfQVIyMzE1X1I2ID4+IDQpKSB7CisJCQkgICBhaC0+YWhfbWFjX3ZlcnNpb24gPT0gKEFSNUtfU1JFVl9BUjIzMTVfUjYgPj4gNCkpIHsKIAkJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkYyMzE2OwogCQkJYWgtPmFoX3NpbmdsZV9jaGlwID0gdHJ1ZTsKIAkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uID0gQVI1S19TUkVWX1JBRF8yMzE2OwogCQl9IGVsc2UgaWYgKGFoLT5haF9tYWNfdmVyc2lvbiA9PSAoQVI1S19TUkVWX0FSNTQxNCA+PiA0KSB8fAotCQlhaC0+YWhfcGh5X3JldmlzaW9uID09IEFSNUtfU1JFVl9QSFlfNTQxMykgeworCQkJICAgYWgtPmFoX3BoeV9yZXZpc2lvbiA9PSBBUjVLX1NSRVZfUEhZXzU0MTMpIHsKIAkJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkY1NDEzOwogCQkJYWgtPmFoX3NpbmdsZV9jaGlwID0gdHJ1ZTsKIAkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uID0gQVI1S19TUkVWX1JBRF81NDEzOwogCQl9IGVsc2UgaWYgKGFoLT5haF9tYWNfdmVyc2lvbiA9PSAoQVI1S19TUkVWX0FSMjQxNCA+PiA0KSB8fAotCQlhaC0+YWhfcGh5X3JldmlzaW9uID09IEFSNUtfU1JFVl9QSFlfMjQxMykgeworCQkJICAgYWgtPmFoX3BoeV9yZXZpc2lvbiA9PSBBUjVLX1NSRVZfUEhZXzI0MTMpIHsKIAkJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkYyNDEzOwogCQkJYWgtPmFoX3NpbmdsZV9jaGlwID0gdHJ1ZTsKIAkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uID0gQVI1S19TUkVWX1JBRF8yNDEzOwogCQl9IGVsc2UgewotCQkJQVRINUtfRVJSKHNjLCAiQ291bGRuJ3QgaWRlbnRpZnkgcmFkaW8gcmV2aXNpb24uXG4iKTsKKwkJCUFUSDVLX0VSUihhaCwgIkNvdWxkbid0IGlkZW50aWZ5IHJhZGlvIHJldmlzaW9uLlxuIik7CiAJCQlyZXQgPSAtRU5PREVWOwogCQkJZ290byBlcnI7CiAJCX0KIAl9CiAKIAotCS8qIFJldHVybiBvbiB1bnN1cG9ydGVkIGNoaXBzICh1bnN1cHBvcnRlZCBlZXByb20gZXRjKSAqLwotCWlmICgoc3JldiA+PSBBUjVLX1NSRVZfQVI1NDE2KSAmJgotCShzcmV2IDwgQVI1S19TUkVWX0FSMjQyNSkpIHsKLQkJQVRINUtfRVJSKHNjLCAiRGV2aWNlIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIik7CisJLyogUmV0dXJuIG9uIHVuc3VwcG9ydGVkIGNoaXBzICh1bnN1cHBvcnRlZCBlZXByb20gZXRjKSAqLworCWlmICgoc3JldiA+PSBBUjVLX1NSRVZfQVI1NDE2KSAmJiAoc3JldiA8IEFSNUtfU1JFVl9BUjI0MjUpKSB7CisJCUFUSDVLX0VSUihhaCwgIkRldmljZSBub3QgeWV0IHN1cHBvcnRlZC5cbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycjsKIAl9CkBAIC0yNjgsNyArMjY3LDcgQEAKIAkgKi8KIAlyZXQgPSBhdGg1a19lZXByb21faW5pdChhaCk7CiAJaWYgKHJldCkgewotCQlBVEg1S19FUlIoc2MsICJ1bmFibGUgdG8gaW5pdCBFRVBST01cbiIpOworCQlBVEg1S19FUlIoYWgsICJ1bmFibGUgdG8gaW5pdCBFRVBST01cbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTI4NSw3ICsyODQsNyBAQAogCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MjgwMDAwMzksIEFSNUtfUENJRV9TRVJERVMpOwogCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4NTMxNjA4MjQsIEFSNUtfUENJRV9TRVJERVMpOwogCi0JCS8qIElmIHNlcmRlcyBwcm9ncmFtaW5nIGlzIGVuYWJsZWQsIGluY3JlYXNlIFBDSS1FCisJCS8qIElmIHNlcmRlcyBwcm9ncmFtbWluZyBpcyBlbmFibGVkLCBpbmNyZWFzZSBQQ0ktRQogCQkgKiB0eCBwb3dlciBmb3Igc3lzdGVtcyB3aXRoIGxvbmcgdHJhY2UgZnJvbSBob3N0CiAJCSAqIHRvIG1pbmljYXJkIGNvbm5lY3Rvci4gKi8KIAkJaWYgKGVlLT5lZV9zZXJkZXMpCkBAIC0zMDksMTcgKzMwOCwxNyBAQAogCS8qIEdldCBtaXNjIGNhcGFiaWxpdGllcyAqLwogCXJldCA9IGF0aDVrX2h3X3NldF9jYXBhYmlsaXRpZXMoYWgpOwogCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKHNjLCAidW5hYmxlIHRvIGdldCBkZXZpY2UgY2FwYWJpbGl0aWVzXG4iKTsKKwkJQVRINUtfRVJSKGFoLCAidW5hYmxlIHRvIGdldCBkZXZpY2UgY2FwYWJpbGl0aWVzXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCi0JaWYgKHRlc3RfYml0KEFUSF9TVEFUXzJHX0RJU0FCTEVELCBzYy0+c3RhdHVzKSkgeworCWlmICh0ZXN0X2JpdChBVEhfU1RBVF8yR19ESVNBQkxFRCwgYWgtPnN0YXR1cykpIHsKIAkJX19jbGVhcl9iaXQoQVI1S19NT0RFXzExQiwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSk7CiAJCV9fY2xlYXJfYml0KEFSNUtfTU9ERV8xMUcsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpOwogCX0KIAogCS8qIENyeXB0byBzZXR0aW5ncyAqLwotCWNvbW1vbi0+a2V5bWF4ID0gKHNjLT5haC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/CisJY29tbW9uLT5rZXltYXggPSAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPwogCQkJICBBUjVLX0tFWVRBQkxFX1NJWkVfNTIxMCA6IEFSNUtfS0VZVEFCTEVfU0laRV81MjExKTsKIAogCWlmIChzcmV2ID49IEFSNUtfU1JFVl9BUjUyMTJfVjQgJiYKQEAgLTMzNCwxMiArMzMzLDEyIEBACiAJfQogCiAJLyogTUFDIGFkZHJlc3MgaXMgY2xlYXJlZCB1bnRpbCBhZGRfaW50ZXJmYWNlICovCi0JYXRoNWtfaHdfc2V0X2xsYWRkcihhaCwgKHU4W0VUSF9BTEVOXSl7fSk7CisJYXRoNWtfaHdfc2V0X2xsYWRkcihhaCwgemVyb19tYWMpOwogCiAJLyogU2V0IEJTU0lEIHRvIGJjYXN0IGFkZHJlc3M6IGZmOmZmOmZmOmZmOmZmOmZmIGZvciBub3cgKi8KIAltZW1jcHkoY29tbW9uLT5jdXJic3NpZCwgYXRoX2JjYXN0X21hYywgRVRIX0FMRU4pOwogCWF0aDVrX2h3X3NldF9ic3NpZChhaCk7Ci0JYXRoNWtfaHdfc2V0X29wbW9kZShhaCwgc2MtPm9wbW9kZSk7CisJYXRoNWtfaHdfc2V0X29wbW9kZShhaCwgYWgtPm9wbW9kZSk7CiAKIAlhdGg1a19od19yZmdhaW5fb3B0X2luaXQoYWgpOwogCkBAIC0zNjAsNyArMzU5LDcgQEAKICAqLwogdm9pZCBhdGg1a19od19kZWluaXQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlfX3NldF9iaXQoQVRIX1NUQVRfSU5WQUxJRCwgYWgtPmFoX3NjLT5zdGF0dXMpOworCV9fc2V0X2JpdChBVEhfU1RBVF9JTlZBTElELCBhaC0+c3RhdHVzKTsKIAogCWlmIChhaC0+YWhfcmZfYmFua3MgIT0gTlVMTCkKIAkJa2ZyZWUoYWgtPmFoX3JmX2JhbmtzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jCmluZGV4IDIyMDQ3NjIuLmY1NGRmZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuYwpAQCAtNDIsNiArNDIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC03Miw2ICs3MywxMSBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGFsbF9jaGFubmVscywgbW9kcGFyYW1fYWxsX2NoYW5uZWxzLCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoYWxsX2NoYW5uZWxzLCAiRXhwb3NlIGFsbCBjaGFubmVscyB0aGUgZGV2aWNlIGNhbiB1c2UuIik7CiAKK3N0YXRpYyBpbnQgbW9kcGFyYW1fZmFzdGNoYW5zd2l0Y2g7Cittb2R1bGVfcGFyYW1fbmFtZWQoZmFzdGNoYW5zd2l0Y2gsIG1vZHBhcmFtX2Zhc3RjaGFuc3dpdGNoLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZmFzdGNoYW5zd2l0Y2gsICJFbmFibGUgZmFzdCBjaGFubmVsIHN3aXRjaGluZyBmb3IgQVIyNDEzL0FSNTQxMyByYWRpb3MuIik7CisKKwogLyogTW9kdWxlIGluZm8gKi8KIE1PRFVMRV9BVVRIT1IoIkppcmkgU2xhYnkiKTsKIE1PRFVMRV9BVVRIT1IoIk5pY2sgS29zc2lmaWRpcyIpOwpAQCAtODAsMTAgKzg2LDggQEAKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKIAogc3RhdGljIGludCBhdGg1a19pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLXN0YXRpYyBpbnQgYXRoNWtfcmVzZXQoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAorc3RhdGljIGludCBhdGg1a19yZXNldChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCiAJCQkJCQkJCWJvb2wgc2tpcF9wY3UpOwotaW50IGF0aDVrX2JlYWNvbl91cGRhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwotdm9pZCBhdGg1a19iZWFjb25fdXBkYXRlX3RpbWVycyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCB1NjQgYmNfdHNmKTsKIAogLyogS25vd24gU1JFVnMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfc3Jldl9uYW1lIHNyZXZfbmFtZXNbXSA9IHsKQEAgLTIzNCw4ICsyMzgsOCBAQAogc3RhdGljIGludCBhdGg1a19yZWdfbm90aWZpZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHdpcGh5X3RvX2llZWU4MDIxMV9odyh3aXBoeSk7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCXN0cnVjdCBhdGhfcmVndWxhdG9yeSAqcmVndWxhdG9yeSA9IGF0aDVrX2h3X3JlZ3VsYXRvcnkoc2MtPmFoKTsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gaHctPnByaXY7CisJc3RydWN0IGF0aF9yZWd1bGF0b3J5ICpyZWd1bGF0b3J5ID0gYXRoNWtfaHdfcmVndWxhdG9yeShhaCk7CiAKIAlyZXR1cm4gYXRoX3JlZ19ub3RpZmllcl9hcHBseSh3aXBoeSwgcmVxdWVzdCwgcmVndWxhdG9yeSk7CiB9CkBAIC0yODUsNyArMjg5LDcgQEAKIAkJYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCUFUSDVLX1dBUk4oYWgtPmFoX3NjLCAiYmFkIG1vZGUsIG5vdCBjb3B5aW5nIGNoYW5uZWxzXG4iKTsKKwkJQVRINUtfV0FSTihhaCwgImJhZCBtb2RlLCBub3QgY29weWluZyBjaGFubmVsc1xuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzIzLDUxICszMjcsNTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLWF0aDVrX3NldHVwX3JhdGVfaWR4KHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmIpCithdGg1a19zZXR1cF9yYXRlX2lkeChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpiKQogewogCXU4IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVI1S19NQVhfUkFURVM7IGkrKykKLQkJc2MtPnJhdGVfaWR4W2ItPmJhbmRdW2ldID0gLTE7CisJCWFoLT5yYXRlX2lkeFtiLT5iYW5kXVtpXSA9IC0xOwogCiAJZm9yIChpID0gMDsgaSA8IGItPm5fYml0cmF0ZXM7IGkrKykgewotCQlzYy0+cmF0ZV9pZHhbYi0+YmFuZF1bYi0+Yml0cmF0ZXNbaV0uaHdfdmFsdWVdID0gaTsKKwkJYWgtPnJhdGVfaWR4W2ItPmJhbmRdW2ItPmJpdHJhdGVzW2ldLmh3X3ZhbHVlXSA9IGk7CiAJCWlmIChiLT5iaXRyYXRlc1tpXS5od192YWx1ZV9zaG9ydCkKLQkJCXNjLT5yYXRlX2lkeFtiLT5iYW5kXVtiLT5iaXRyYXRlc1tpXS5od192YWx1ZV9zaG9ydF0gPSBpOworCQkJYWgtPnJhdGVfaWR4W2ItPmJhbmRdW2ItPmJpdHJhdGVzW2ldLmh3X3ZhbHVlX3Nob3J0XSA9IGk7CiAJfQogfQogCiBzdGF0aWMgaW50CiBhdGg1a19zZXR1cF9iYW5kcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gaHctPnByaXY7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJaW50IG1heF9jLCBjb3VudF9jID0gMDsKIAlpbnQgaTsKIAotCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKHNjLT5zYmFuZHMpIDwgSUVFRTgwMjExX05VTV9CQU5EUyk7Ci0JbWF4X2MgPSBBUlJBWV9TSVpFKHNjLT5jaGFubmVscyk7CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoYWgtPnNiYW5kcykgPCBJRUVFODAyMTFfTlVNX0JBTkRTKTsKKwltYXhfYyA9IEFSUkFZX1NJWkUoYWgtPmNoYW5uZWxzKTsKIAogCS8qIDJHSHogYmFuZCAqLwotCXNiYW5kID0gJnNjLT5zYmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07CisJc2JhbmQgPSAmYWgtPnNiYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXTsKIAlzYmFuZC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0Jc2JhbmQtPmJpdHJhdGVzID0gJnNjLT5yYXRlc1tJRUVFODAyMTFfQkFORF8yR0haXVswXTsKKwlzYmFuZC0+Yml0cmF0ZXMgPSAmYWgtPnJhdGVzW0lFRUU4MDIxMV9CQU5EXzJHSFpdWzBdOwogCi0JaWYgKHRlc3RfYml0KEFSNUtfTU9ERV8xMUcsIHNjLT5haC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlKSkgeworCWlmICh0ZXN0X2JpdChBUjVLX01PREVfMTFHLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlKSkgewogCQkvKiBHIG1vZGUgKi8KIAkJbWVtY3B5KHNiYW5kLT5iaXRyYXRlcywgJmF0aDVrX3JhdGVzWzBdLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSkgKiAxMik7CiAJCXNiYW5kLT5uX2JpdHJhdGVzID0gMTI7CiAKLQkJc2JhbmQtPmNoYW5uZWxzID0gc2MtPmNoYW5uZWxzOworCQlzYmFuZC0+Y2hhbm5lbHMgPSBhaC0+Y2hhbm5lbHM7CiAJCXNiYW5kLT5uX2NoYW5uZWxzID0gYXRoNWtfc2V0dXBfY2hhbm5lbHMoYWgsIHNiYW5kLT5jaGFubmVscywKIAkJCQkJQVI1S19NT0RFXzExRywgbWF4X2MpOwogCiAJCWh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSBzYmFuZDsKIAkJY291bnRfYyA9IHNiYW5kLT5uX2NoYW5uZWxzOwogCQltYXhfYyAtPSBjb3VudF9jOwotCX0gZWxzZSBpZiAodGVzdF9iaXQoQVI1S19NT0RFXzExQiwgc2MtPmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpKSB7CisJfSBlbHNlIGlmICh0ZXN0X2JpdChBUjVLX01PREVfMTFCLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlKSkgewogCQkvKiBCIG1vZGUgKi8KIAkJbWVtY3B5KHNiYW5kLT5iaXRyYXRlcywgJmF0aDVrX3JhdGVzWzBdLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSkgKiA0KTsKQEAgLTM4Niw3ICszODksNyBAQAogCQkJfQogCQl9CiAKLQkJc2JhbmQtPmNoYW5uZWxzID0gc2MtPmNoYW5uZWxzOworCQlzYmFuZC0+Y2hhbm5lbHMgPSBhaC0+Y2hhbm5lbHM7CiAJCXNiYW5kLT5uX2NoYW5uZWxzID0gYXRoNWtfc2V0dXBfY2hhbm5lbHMoYWgsIHNiYW5kLT5jaGFubmVscywKIAkJCQkJQVI1S19NT0RFXzExQiwgbWF4X2MpOwogCkBAIC0zOTQsMjcgKzM5NywyNyBAQAogCQljb3VudF9jID0gc2JhbmQtPm5fY2hhbm5lbHM7CiAJCW1heF9jIC09IGNvdW50X2M7CiAJfQotCWF0aDVrX3NldHVwX3JhdGVfaWR4KHNjLCBzYmFuZCk7CisJYXRoNWtfc2V0dXBfcmF0ZV9pZHgoYWgsIHNiYW5kKTsKIAogCS8qIDVHSHogYmFuZCwgQSBtb2RlICovCi0JaWYgKHRlc3RfYml0KEFSNUtfTU9ERV8xMUEsIHNjLT5haC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlKSkgewotCQlzYmFuZCA9ICZzYy0+c2JhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOworCWlmICh0ZXN0X2JpdChBUjVLX01PREVfMTFBLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlKSkgeworCQlzYmFuZCA9ICZhaC0+c2JhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOwogCQlzYmFuZC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFo7Ci0JCXNiYW5kLT5iaXRyYXRlcyA9ICZzYy0+cmF0ZXNbSUVFRTgwMjExX0JBTkRfNUdIWl1bMF07CisJCXNiYW5kLT5iaXRyYXRlcyA9ICZhaC0+cmF0ZXNbSUVFRTgwMjExX0JBTkRfNUdIWl1bMF07CiAKIAkJbWVtY3B5KHNiYW5kLT5iaXRyYXRlcywgJmF0aDVrX3JhdGVzWzRdLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSkgKiA4KTsKIAkJc2JhbmQtPm5fYml0cmF0ZXMgPSA4OwogCi0JCXNiYW5kLT5jaGFubmVscyA9ICZzYy0+Y2hhbm5lbHNbY291bnRfY107CisJCXNiYW5kLT5jaGFubmVscyA9ICZhaC0+Y2hhbm5lbHNbY291bnRfY107CiAJCXNiYW5kLT5uX2NoYW5uZWxzID0gYXRoNWtfc2V0dXBfY2hhbm5lbHMoYWgsIHNiYW5kLT5jaGFubmVscywKIAkJCQkJQVI1S19NT0RFXzExQSwgbWF4X2MpOwogCiAJCWh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBzYmFuZDsKIAl9Ci0JYXRoNWtfc2V0dXBfcmF0ZV9pZHgoc2MsIHNiYW5kKTsKKwlhdGg1a19zZXR1cF9yYXRlX2lkeChhaCwgc2JhbmQpOwogCi0JYXRoNWtfZGVidWdfZHVtcF9iYW5kcyhzYyk7CisJYXRoNWtfZGVidWdfZHVtcF9iYW5kcyhhaCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQyNCwxNCArNDI3LDE0IEBACiAgKiBUbyBhY2NvbXBsaXNoIHRoaXMgd2UgbXVzdCBmaXJzdCBjbGVhbnVwIGFueSBwZW5kaW5nIERNQSwKICAqIHRoZW4gcmVzdGFydCBzdHVmZiBhZnRlciBhIGxhICBhdGg1a19pbml0LgogICoKLSAqIENhbGxlZCB3aXRoIHNjLT5sb2NrLgorICogQ2FsbGVkIHdpdGggYWgtPmxvY2suCiAgKi8KIGludAotYXRoNWtfY2hhbl9zZXQoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuKQorYXRoNWtfY2hhbl9zZXQoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuKQogewotCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfUkVTRVQsCisJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19SRVNFVCwKIAkJICAiY2hhbm5lbCBzZXQsIHJlc2V0dGluZyAoJXUgLT4gJXUgTUh6KVxuIiwKLQkJICBzYy0+Y3VyY2hhbi0+Y2VudGVyX2ZyZXEsIGNoYW4tPmNlbnRlcl9mcmVxKTsKKwkJICBhaC0+Y3VyY2hhbi0+Y2VudGVyX2ZyZXEsIGNoYW4tPmNlbnRlcl9mcmVxKTsKIAogCS8qCiAJICogVG8gc3dpdGNoIGNoYW5uZWxzIGNsZWFyIGFueSBwZW5kaW5nIERNQSBvcGVyYXRpb25zOwpAQCAtNDM5LDcgKzQ0Miw3IEBACiAJICogaGFyZHdhcmUgYXQgdGhlIG5ldyBmcmVxdWVuY3ksIGFuZCB0aGVuIHJlLWVuYWJsZQogCSAqIHRoZSByZWxldmFudCBiaXRzIG9mIHRoZSBoL3cuCiAJICovCi0JcmV0dXJuIGF0aDVrX3Jlc2V0KHNjLCBjaGFuLCB0cnVlKTsKKwlyZXR1cm4gYXRoNWtfcmVzZXQoYWgsIGNoYW4sIHRydWUpOwogfQogCiB2b2lkIGF0aDVrX3ZpZl9pdGVyKHZvaWQgKmRhdGEsIHU4ICptYWMsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCkBAIC00ODMsMTAgKzQ4NiwxMCBAQAogfQogCiB2b2lkCi1hdGg1a191cGRhdGVfYnNzaWRfbWFza19hbmRfb3Btb2RlKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsCithdGg1a191cGRhdGVfYnNzaWRfbWFza19hbmRfb3Btb2RlKHN0cnVjdCBhdGg1a19odyAqYWgsCiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKLQlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKHNjLT5haCk7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJc3RydWN0IGF0aDVrX3ZpZl9pdGVyX2RhdGEgaXRlcl9kYXRhOwogCXUzMiByZmlsdDsKIApAQCAtNTA1LDQxICs1MDgsNDEgQEAKIAkJYXRoNWtfdmlmX2l0ZXIoJml0ZXJfZGF0YSwgdmlmLT5hZGRyLCB2aWYpOwogCiAJLyogR2V0IGxpc3Qgb2YgYWxsIGFjdGl2ZSBNQUMgYWRkcmVzc2VzICovCi0JaWVlZTgwMjExX2l0ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXNfYXRvbWljKHNjLT5odywgYXRoNWtfdmlmX2l0ZXIsCisJaWVlZTgwMjExX2l0ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXNfYXRvbWljKGFoLT5odywgYXRoNWtfdmlmX2l0ZXIsCiAJCQkJCQkgICAmaXRlcl9kYXRhKTsKLQltZW1jcHkoc2MtPmJzc2lkbWFzaywgaXRlcl9kYXRhLm1hc2ssIEVUSF9BTEVOKTsKKwltZW1jcHkoYWgtPmJzc2lkbWFzaywgaXRlcl9kYXRhLm1hc2ssIEVUSF9BTEVOKTsKIAotCXNjLT5vcG1vZGUgPSBpdGVyX2RhdGEub3Btb2RlOwotCWlmIChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEKQorCWFoLT5vcG1vZGUgPSBpdGVyX2RhdGEub3Btb2RlOworCWlmIChhaC0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEKQogCQkvKiBOb3RoaW5nIGFjdGl2ZSwgZGVmYXVsdCB0byBzdGF0aW9uIG1vZGUgKi8KLQkJc2MtPm9wbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CisJCWFoLT5vcG1vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwogCi0JYXRoNWtfaHdfc2V0X29wbW9kZShzYy0+YWgsIHNjLT5vcG1vZGUpOwotCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfTU9ERSwgIm1vZGUgc2V0dXAgb3Btb2RlICVkICglcylcbiIsCi0JCSAgc2MtPm9wbW9kZSwgYXRoX29wbW9kZV90b19zdHJpbmcoc2MtPm9wbW9kZSkpOworCWF0aDVrX2h3X3NldF9vcG1vZGUoYWgsIGFoLT5vcG1vZGUpOworCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfTU9ERSwgIm1vZGUgc2V0dXAgb3Btb2RlICVkICglcylcbiIsCisJCSAgYWgtPm9wbW9kZSwgYXRoX29wbW9kZV90b19zdHJpbmcoYWgtPm9wbW9kZSkpOwogCiAJaWYgKGl0ZXJfZGF0YS5uZWVkX3NldF9od19hZGRyICYmIGl0ZXJfZGF0YS5mb3VuZF9hY3RpdmUpCi0JCWF0aDVrX2h3X3NldF9sbGFkZHIoc2MtPmFoLCBpdGVyX2RhdGEuYWN0aXZlX21hYyk7CisJCWF0aDVrX2h3X3NldF9sbGFkZHIoYWgsIGl0ZXJfZGF0YS5hY3RpdmVfbWFjKTsKIAotCWlmIChhdGg1a19od19oYXNic3NpZG1hc2soc2MtPmFoKSkKLQkJYXRoNWtfaHdfc2V0X2Jzc2lkX21hc2soc2MtPmFoLCBzYy0+YnNzaWRtYXNrKTsKKwlpZiAoYXRoNWtfaHdfaGFzYnNzaWRtYXNrKGFoKSkKKwkJYXRoNWtfaHdfc2V0X2Jzc2lkX21hc2soYWgsIGFoLT5ic3NpZG1hc2spOwogCiAJLyogU2V0IHVwIFJYIEZpbHRlciAqLwogCWlmIChpdGVyX2RhdGEubl9zdGFzID4gMSkgewogCQkvKiBJZiB5b3UgaGF2ZSBtdWx0aXBsZSBTVEEgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8KIAkJICogZGlmZmVyZW50IEFQcywgQVJQcyBhcmUgbm90IHJlY2VpdmVkIChtb3N0IG9mIHRoZSB0aW1lPykKLQkJICogRW5hYmxpbmcgUFJPTUlTQyBhcHBlYXJzIHRvIGZpeCB0aGF0IHByb2JlbS4KKwkJICogRW5hYmxpbmcgUFJPTUlTQyBhcHBlYXJzIHRvIGZpeCB0aGF0IHByb2JsZW0uCiAJCSAqLwotCQlzYy0+ZmlsdGVyX2ZsYWdzIHw9IEFSNUtfUlhfRklMVEVSX1BST007CisJCWFoLT5maWx0ZXJfZmxhZ3MgfD0gQVI1S19SWF9GSUxURVJfUFJPTTsKIAl9CiAKLQlyZmlsdCA9IHNjLT5maWx0ZXJfZmxhZ3M7Ci0JYXRoNWtfaHdfc2V0X3J4X2ZpbHRlcihzYy0+YWgsIHJmaWx0KTsKLQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX01PREUsICJSWCBmaWx0ZXIgMHgleFxuIiwgcmZpbHQpOworCXJmaWx0ID0gYWgtPmZpbHRlcl9mbGFnczsKKwlhdGg1a19od19zZXRfcnhfZmlsdGVyKGFoLCByZmlsdCk7CisJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19NT0RFLCAiUlggZmlsdGVyIDB4JXhcbiIsIHJmaWx0KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWF0aDVrX2h3X3RvX2RyaXZlcl9yaXgoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgaW50IGh3X3JpeCkKK2F0aDVrX2h3X3RvX2RyaXZlcl9yaXgoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IGh3X3JpeCkKIHsKIAlpbnQgcml4OwogCkBAIC01NDgsNyArNTUxLDcgQEAKIAkJCSJod19yaXggb3V0IG9mIGJvdW5kczogJXhcbiIsIGh3X3JpeCkpCiAJCXJldHVybiAwOwogCi0Jcml4ID0gc2MtPnJhdGVfaWR4W3NjLT5jdXJjaGFuLT5iYW5kXVtod19yaXhdOworCXJpeCA9IGFoLT5yYXRlX2lkeFthaC0+Y3VyY2hhbi0+YmFuZF1baHdfcml4XTsKIAlpZiAoV0FSTihyaXggPCAwLCAiaW52YWxpZCBod19yaXg6ICV4XG4iLCBod19yaXgpKQogCQlyaXggPSAwOwogCkBAIC01NjAsOSArNTYzLDkgQEAKIFwqKioqKioqKioqKioqKiovCiAKIHN0YXRpYwotc3RydWN0IHNrX2J1ZmYgKmF0aDVrX3J4X3NrYl9hbGxvYyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBkbWFfYWRkcl90ICpza2JfYWRkcikKK3N0cnVjdCBza19idWZmICphdGg1a19yeF9za2JfYWxsb2Moc3RydWN0IGF0aDVrX2h3ICphaCwgZG1hX2FkZHJfdCAqc2tiX2FkZHIpCiB7Ci0Jc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihzYy0+YWgpOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg1a19od19jb21tb24oYWgpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAkvKgpAQCAtNTc0LDE3ICs1NzcsMTcgQEAKIAkJCSAgICAgIEdGUF9BVE9NSUMpOwogCiAJaWYgKCFza2IpIHsKLQkJQVRINUtfRVJSKHNjLCAiY2FuJ3QgYWxsb2Mgc2tidWZmIG9mIHNpemUgJXVcbiIsCisJCUFUSDVLX0VSUihhaCwgImNhbid0IGFsbG9jIHNrYnVmZiBvZiBzaXplICV1XG4iLAogCQkJCWNvbW1vbi0+cnhfYnVmc2l6ZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCSpza2JfYWRkciA9IGRtYV9tYXBfc2luZ2xlKHNjLT5kZXYsCisJKnNrYl9hZGRyID0gZG1hX21hcF9zaW5nbGUoYWgtPmRldiwKIAkJCQkgICBza2ItPmRhdGEsIGNvbW1vbi0+cnhfYnVmc2l6ZSwKIAkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwogCi0JaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHNjLT5kZXYsICpza2JfYWRkcikpKSB7Ci0JCUFUSDVLX0VSUihzYywgIiVzOiBETUEgbWFwcGluZyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoYWgtPmRldiwgKnNrYl9hZGRyKSkpIHsKKwkJQVRINUtfRVJSKGFoLCAiJXM6IERNQSBtYXBwaW5nIGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTU5MiwxNSArNTk1LDE0IEBACiB9CiAKIHN0YXRpYyBpbnQKLWF0aDVrX3J4YnVmX3NldHVwKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBhdGg1a19idWYgKmJmKQorYXRoNWtfcnhidWZfc2V0dXAoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2J1ZiAqYmYpCiB7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYmYtPnNrYjsKIAlzdHJ1Y3QgYXRoNWtfZGVzYyAqZHM7CiAJaW50IHJldDsKIAogCWlmICghc2tiKSB7Ci0JCXNrYiA9IGF0aDVrX3J4X3NrYl9hbGxvYyhzYywgJmJmLT5za2JhZGRyKTsKKwkJc2tiID0gYXRoNWtfcnhfc2tiX2FsbG9jKGFoLCAmYmYtPnNrYmFkZHIpOwogCQlpZiAoIXNrYikKIAkJCXJldHVybiAtRU5PTUVNOwogCQliZi0+c2tiID0gc2tiOwpAQCAtNjI2LDEzICs2MjgsMTMgQEAKIAlkcy0+ZHNfZGF0YSA9IGJmLT5za2JhZGRyOwogCXJldCA9IGF0aDVrX2h3X3NldHVwX3J4X2Rlc2MoYWgsIGRzLCBhaC0+Y29tbW9uLnJ4X2J1ZnNpemUsIDApOwogCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKHNjLCAiJXM6IGNvdWxkIG5vdCBzZXR1cCBSWCBkZXNjXG4iLCBfX2Z1bmNfXyk7CisJCUFUSDVLX0VSUihhaCwgIiVzOiBjb3VsZCBub3Qgc2V0dXAgUlggZGVzY1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChzYy0+cnhsaW5rICE9IE5VTEwpCi0JCSpzYy0+cnhsaW5rID0gYmYtPmRhZGRyOwotCXNjLT5yeGxpbmsgPSAmZHMtPmRzX2xpbms7CisJaWYgKGFoLT5yeGxpbmsgIT0gTlVMTCkKKwkJKmFoLT5yeGxpbmsgPSBiZi0+ZGFkZHI7CisJYWgtPnJ4bGluayA9ICZkcy0+ZHNfbGluazsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjYwLDEwICs2NjIsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1hdGg1a190eGJ1Zl9zZXR1cChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoNWtfYnVmICpiZiwKK2F0aDVrX3R4YnVmX3NldHVwKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19idWYgKmJmLAogCQkgIHN0cnVjdCBhdGg1a190eHEgKnR4cSwgaW50IHBhZHNpemUpCiB7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKIAlzdHJ1Y3QgYXRoNWtfZGVzYyAqZHMgPSBiZi0+ZGVzYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYmYtPnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CkBAIC02NzksMTAgKzY4MCwxMCBAQAogCWZsYWdzID0gQVI1S19UWERFU0NfSU5UUkVRIHwgQVI1S19UWERFU0NfQ0xSRE1BU0s7CiAKIAkvKiBYWFggZW5kaWFubmVzcyAqLwotCWJmLT5za2JhZGRyID0gZG1hX21hcF9zaW5nbGUoc2MtPmRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwliZi0+c2tiYWRkciA9IGRtYV9tYXBfc2luZ2xlKGFoLT5kZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCiAJCQlETUFfVE9fREVWSUNFKTsKIAotCXJhdGUgPSBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoc2MtPmh3LCBpbmZvKTsKKwlyYXRlID0gaWVlZTgwMjExX2dldF90eF9yYXRlKGFoLT5odywgaW5mbyk7CiAJaWYgKCFyYXRlKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX3VubWFwOwpAQCAtNzA2LDIwICs3MDcsMjAgQEAKIAl9CiAJaWYgKHJjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB7CiAJCWZsYWdzIHw9IEFSNUtfVFhERVNDX1JUU0VOQTsKLQkJY3RzX3JhdGUgPSBpZWVlODAyMTFfZ2V0X3J0c19jdHNfcmF0ZShzYy0+aHcsIGluZm8pLT5od192YWx1ZTsKLQkJZHVyYXRpb24gPSBsZTE2X3RvX2NwdShpZWVlODAyMTFfcnRzX2R1cmF0aW9uKHNjLT5odywKKwkJY3RzX3JhdGUgPSBpZWVlODAyMTFfZ2V0X3J0c19jdHNfcmF0ZShhaC0+aHcsIGluZm8pLT5od192YWx1ZTsKKwkJZHVyYXRpb24gPSBsZTE2X3RvX2NwdShpZWVlODAyMTFfcnRzX2R1cmF0aW9uKGFoLT5odywKIAkJCWluZm8tPmNvbnRyb2wudmlmLCBwa3RsZW4sIGluZm8pKTsKIAl9CiAJaWYgKHJjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCkgewogCQlmbGFncyB8PSBBUjVLX1RYREVTQ19DVFNFTkE7Ci0JCWN0c19yYXRlID0gaWVlZTgwMjExX2dldF9ydHNfY3RzX3JhdGUoc2MtPmh3LCBpbmZvKS0+aHdfdmFsdWU7Ci0JCWR1cmF0aW9uID0gbGUxNl90b19jcHUoaWVlZTgwMjExX2N0c3Rvc2VsZl9kdXJhdGlvbihzYy0+aHcsCisJCWN0c19yYXRlID0gaWVlZTgwMjExX2dldF9ydHNfY3RzX3JhdGUoYWgtPmh3LCBpbmZvKS0+aHdfdmFsdWU7CisJCWR1cmF0aW9uID0gbGUxNl90b19jcHUoaWVlZTgwMjExX2N0c3Rvc2VsZl9kdXJhdGlvbihhaC0+aHcsCiAJCQlpbmZvLT5jb250cm9sLnZpZiwgcGt0bGVuLCBpbmZvKSk7CiAJfQogCXJldCA9IGFoLT5haF9zZXR1cF90eF9kZXNjKGFoLCBkcywgcGt0bGVuLAogCQlpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihza2IpLCBwYWRzaXplLAogCQlnZXRfaHdfcGFja2V0X3R5cGUoc2tiKSwKLQkJKHNjLT5wb3dlcl9sZXZlbCAqIDIpLAorCQkoYWgtPnBvd2VyX2xldmVsICogMiksCiAJCWh3X3JhdGUsCiAJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uY291bnQsIGtleWlkeCwgYWgtPmFoX3R4X2FudCwgZmxhZ3MsCiAJCWN0c19yYXRlLCBkdXJhdGlvbik7CkBAIC03MjksNyArNzMwLDcgQEAKIAltZW1zZXQobXJyX3JhdGUsIDAsIHNpemVvZihtcnJfcmF0ZSkpOwogCW1lbXNldChtcnJfdHJpZXMsIDAsIHNpemVvZihtcnJfdHJpZXMpKTsKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXJhdGUgPSBpZWVlODAyMTFfZ2V0X2FsdF9yZXRyeV9yYXRlKHNjLT5odywgaW5mbywgaSk7CisJCXJhdGUgPSBpZWVlODAyMTFfZ2V0X2FsdF9yZXRyeV9yYXRlKGFoLT5odywgaW5mbywgaSk7CiAJCWlmICghcmF0ZSkKIAkJCWJyZWFrOwogCkBAIC03NjAsNyArNzYxLDcgQEAKIAogCXJldHVybiAwOwogZXJyX3VubWFwOgotCWRtYV91bm1hcF9zaW5nbGUoc2MtPmRldiwgYmYtPnNrYmFkZHIsIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwlkbWFfdW5tYXBfc2luZ2xlKGFoLT5kZXYsIGJmLT5za2JhZGRyLCBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzY5LDcgKzc3MCw3IEBACiBcKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGludAotYXRoNWtfZGVzY19hbGxvYyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQorYXRoNWtfZGVzY19hbGxvYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXN0cnVjdCBhdGg1a19kZXNjICpkczsKIAlzdHJ1Y3QgYXRoNWtfYnVmICpiZjsKQEAgLTc3OCw2OSArNzc5LDY4IEBACiAJaW50IHJldDsKIAogCS8qIGFsbG9jYXRlIGRlc2NyaXB0b3JzICovCi0Jc2MtPmRlc2NfbGVuID0gc2l6ZW9mKHN0cnVjdCBhdGg1a19kZXNjKSAqCisJYWgtPmRlc2NfbGVuID0gc2l6ZW9mKHN0cnVjdCBhdGg1a19kZXNjKSAqCiAJCQkoQVRIX1RYQlVGICsgQVRIX1JYQlVGICsgQVRIX0JDQlVGICsgMSk7CiAKLQlzYy0+ZGVzYyA9IGRtYV9hbGxvY19jb2hlcmVudChzYy0+ZGV2LCBzYy0+ZGVzY19sZW4sCi0JCQkJJnNjLT5kZXNjX2RhZGRyLCBHRlBfS0VSTkVMKTsKLQlpZiAoc2MtPmRlc2MgPT0gTlVMTCkgewotCQlBVEg1S19FUlIoc2MsICJjYW4ndCBhbGxvY2F0ZSBkZXNjcmlwdG9yc1xuIik7CisJYWgtPmRlc2MgPSBkbWFfYWxsb2NfY29oZXJlbnQoYWgtPmRldiwgYWgtPmRlc2NfbGVuLAorCQkJCSZhaC0+ZGVzY19kYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKGFoLT5kZXNjID09IE5VTEwpIHsKKwkJQVRINUtfRVJSKGFoLCAiY2FuJ3QgYWxsb2NhdGUgZGVzY3JpcHRvcnNcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKIAl9Ci0JZHMgPSBzYy0+ZGVzYzsKLQlkYSA9IHNjLT5kZXNjX2RhZGRyOwotCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfQU5ZLCAiRE1BIG1hcDogJXAgKCV6dSkgLT4gJWxseFxuIiwKLQkJZHMsIHNjLT5kZXNjX2xlbiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzYy0+ZGVzY19kYWRkcik7CisJZHMgPSBhaC0+ZGVzYzsKKwlkYSA9IGFoLT5kZXNjX2RhZGRyOworCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfQU5ZLCAiRE1BIG1hcDogJXAgKCV6dSkgLT4gJWxseFxuIiwKKwkJZHMsIGFoLT5kZXNjX2xlbiwgKHVuc2lnbmVkIGxvbmcgbG9uZylhaC0+ZGVzY19kYWRkcik7CiAKIAliZiA9IGtjYWxsb2MoMSArIEFUSF9UWEJVRiArIEFUSF9SWEJVRiArIEFUSF9CQ0JVRiwKIAkJCXNpemVvZihzdHJ1Y3QgYXRoNWtfYnVmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJmID09IE5VTEwpIHsKLQkJQVRINUtfRVJSKHNjLCAiY2FuJ3QgYWxsb2NhdGUgYnVmcHRyXG4iKTsKKwkJQVRINUtfRVJSKGFoLCAiY2FuJ3QgYWxsb2NhdGUgYnVmcHRyXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfZnJlZTsKIAl9Ci0Jc2MtPmJ1ZnB0ciA9IGJmOworCWFoLT5idWZwdHIgPSBiZjsKIAotCUlOSVRfTElTVF9IRUFEKCZzYy0+cnhidWYpOworCUlOSVRfTElTVF9IRUFEKCZhaC0+cnhidWYpOwogCWZvciAoaSA9IDA7IGkgPCBBVEhfUlhCVUY7IGkrKywgYmYrKywgZHMrKywgZGEgKz0gc2l6ZW9mKCpkcykpIHsKIAkJYmYtPmRlc2MgPSBkczsKIAkJYmYtPmRhZGRyID0gZGE7Ci0JCWxpc3RfYWRkX3RhaWwoJmJmLT5saXN0LCAmc2MtPnJ4YnVmKTsKKwkJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZhaC0+cnhidWYpOwogCX0KIAotCUlOSVRfTElTVF9IRUFEKCZzYy0+dHhidWYpOwotCXNjLT50eGJ1Zl9sZW4gPSBBVEhfVFhCVUY7Ci0JZm9yIChpID0gMDsgaSA8IEFUSF9UWEJVRjsgaSsrLCBiZisrLCBkcysrLAotCQkJZGEgKz0gc2l6ZW9mKCpkcykpIHsKKwlJTklUX0xJU1RfSEVBRCgmYWgtPnR4YnVmKTsKKwlhaC0+dHhidWZfbGVuID0gQVRIX1RYQlVGOworCWZvciAoaSA9IDA7IGkgPCBBVEhfVFhCVUY7IGkrKywgYmYrKywgZHMrKywgZGEgKz0gc2l6ZW9mKCpkcykpIHsKIAkJYmYtPmRlc2MgPSBkczsKIAkJYmYtPmRhZGRyID0gZGE7Ci0JCWxpc3RfYWRkX3RhaWwoJmJmLT5saXN0LCAmc2MtPnR4YnVmKTsKKwkJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZhaC0+dHhidWYpOwogCX0KIAogCS8qIGJlYWNvbiBidWZmZXJzICovCi0JSU5JVF9MSVNUX0hFQUQoJnNjLT5iY2J1Zik7CisJSU5JVF9MSVNUX0hFQUQoJmFoLT5iY2J1Zik7CiAJZm9yIChpID0gMDsgaSA8IEFUSF9CQ0JVRjsgaSsrLCBiZisrLCBkcysrLCBkYSArPSBzaXplb2YoKmRzKSkgewogCQliZi0+ZGVzYyA9IGRzOwogCQliZi0+ZGFkZHIgPSBkYTsKLQkJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZzYy0+YmNidWYpOworCQlsaXN0X2FkZF90YWlsKCZiZi0+bGlzdCwgJmFoLT5iY2J1Zik7CiAJfQogCiAJcmV0dXJuIDA7CiBlcnJfZnJlZToKLQlkbWFfZnJlZV9jb2hlcmVudChzYy0+ZGV2LCBzYy0+ZGVzY19sZW4sIHNjLT5kZXNjLCBzYy0+ZGVzY19kYWRkcik7CisJZG1hX2ZyZWVfY29oZXJlbnQoYWgtPmRldiwgYWgtPmRlc2NfbGVuLCBhaC0+ZGVzYywgYWgtPmRlc2NfZGFkZHIpOwogZXJyOgotCXNjLT5kZXNjID0gTlVMTDsKKwlhaC0+ZGVzYyA9IE5VTEw7CiAJcmV0dXJuIHJldDsKIH0KIAogdm9pZAotYXRoNWtfdHhidWZfZnJlZV9za2Ioc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IGF0aDVrX2J1ZiAqYmYpCithdGg1a190eGJ1Zl9mcmVlX3NrYihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgYXRoNWtfYnVmICpiZikKIHsKIAlCVUdfT04oIWJmKTsKIAlpZiAoIWJmLT5za2IpCiAJCXJldHVybjsKLQlkbWFfdW5tYXBfc2luZ2xlKHNjLT5kZXYsIGJmLT5za2JhZGRyLCBiZi0+c2tiLT5sZW4sCisJZG1hX3VubWFwX3NpbmdsZShhaC0+ZGV2LCBiZi0+c2tiYWRkciwgYmYtPnNrYi0+bGVuLAogCQkJRE1BX1RPX0RFVklDRSk7CiAJZGV2X2tmcmVlX3NrYl9hbnkoYmYtPnNrYik7CiAJYmYtPnNrYiA9IE5VTEw7CkBAIC04NDksMTUgKzg0OSwxNCBAQAogfQogCiB2b2lkCi1hdGg1a19yeGJ1Zl9mcmVlX3NrYihzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoNWtfYnVmICpiZikKK2F0aDVrX3J4YnVmX2ZyZWVfc2tiKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19idWYgKmJmKQogewotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAKIAlCVUdfT04oIWJmKTsKIAlpZiAoIWJmLT5za2IpCiAJCXJldHVybjsKLQlkbWFfdW5tYXBfc2luZ2xlKHNjLT5kZXYsIGJmLT5za2JhZGRyLCBjb21tb24tPnJ4X2J1ZnNpemUsCisJZG1hX3VubWFwX3NpbmdsZShhaC0+ZGV2LCBiZi0+c2tiYWRkciwgY29tbW9uLT5yeF9idWZzaXplLAogCQkJRE1BX0ZST01fREVWSUNFKTsKIAlkZXZfa2ZyZWVfc2tiX2FueShiZi0+c2tiKTsKIAliZi0+c2tiID0gTlVMTDsKQEAgLTg2NiwyNCArODY1LDI0IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1hdGg1a19kZXNjX2ZyZWUoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK2F0aDVrX2Rlc2NfZnJlZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXN0cnVjdCBhdGg1a19idWYgKmJmOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShiZiwgJnNjLT50eGJ1ZiwgbGlzdCkKLQkJYXRoNWtfdHhidWZfZnJlZV9za2Ioc2MsIGJmKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJmLCAmc2MtPnJ4YnVmLCBsaXN0KQotCQlhdGg1a19yeGJ1Zl9mcmVlX3NrYihzYywgYmYpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYmYsICZzYy0+YmNidWYsIGxpc3QpCi0JCWF0aDVrX3R4YnVmX2ZyZWVfc2tiKHNjLCBiZik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShiZiwgJmFoLT50eGJ1ZiwgbGlzdCkKKwkJYXRoNWtfdHhidWZfZnJlZV9za2IoYWgsIGJmKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJmLCAmYWgtPnJ4YnVmLCBsaXN0KQorCQlhdGg1a19yeGJ1Zl9mcmVlX3NrYihhaCwgYmYpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmYsICZhaC0+YmNidWYsIGxpc3QpCisJCWF0aDVrX3R4YnVmX2ZyZWVfc2tiKGFoLCBiZik7CiAKIAkvKiBGcmVlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYWxsIGRlc2NyaXB0b3JzICovCi0JZG1hX2ZyZWVfY29oZXJlbnQoc2MtPmRldiwgc2MtPmRlc2NfbGVuLCBzYy0+ZGVzYywgc2MtPmRlc2NfZGFkZHIpOwotCXNjLT5kZXNjID0gTlVMTDsKLQlzYy0+ZGVzY19kYWRkciA9IDA7CisJZG1hX2ZyZWVfY29oZXJlbnQoYWgtPmRldiwgYWgtPmRlc2NfbGVuLCBhaC0+ZGVzYywgYWgtPmRlc2NfZGFkZHIpOworCWFoLT5kZXNjID0gTlVMTDsKKwlhaC0+ZGVzY19kYWRkciA9IDA7CiAKLQlrZnJlZShzYy0+YnVmcHRyKTsKLQlzYy0+YnVmcHRyID0gTlVMTDsKKwlrZnJlZShhaC0+YnVmcHRyKTsKKwlhaC0+YnVmcHRyID0gTlVMTDsKIH0KIAogCkBAIC04OTIsMTAgKzg5MSw5IEBACiBcKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBzdHJ1Y3QgYXRoNWtfdHhxICoKLWF0aDVrX3R4cV9zZXR1cChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLAorYXRoNWtfdHhxX3NldHVwKHN0cnVjdCBhdGg1a19odyAqYWgsCiAJCWludCBxdHlwZSwgaW50IHN1YnR5cGUpCiB7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKIAlzdHJ1Y3QgYXRoNWtfdHhxICp0eHE7CiAJc3RydWN0IGF0aDVrX3R4cV9pbmZvIHFpID0gewogCQkudHFpX3N1YnR5cGUgPSBzdWJ0eXBlLApAQCAtOTI5LDEzICs5MjcsMTMgQEAKIAkJICovCiAJCXJldHVybiBFUlJfUFRSKHFudW0pOwogCX0KLQlpZiAocW51bSA+PSBBUlJBWV9TSVpFKHNjLT50eHFzKSkgewotCQlBVEg1S19FUlIoc2MsICJodyBxbnVtICV1IG91dCBvZiByYW5nZSwgbWF4ICV0dSFcbiIsCi0JCQlxbnVtLCBBUlJBWV9TSVpFKHNjLT50eHFzKSk7CisJaWYgKHFudW0gPj0gQVJSQVlfU0laRShhaC0+dHhxcykpIHsKKwkJQVRINUtfRVJSKGFoLCAiaHcgcW51bSAldSBvdXQgb2YgcmFuZ2UsIG1heCAldHUhXG4iLAorCQkJcW51bSwgQVJSQVlfU0laRShhaC0+dHhxcykpOwogCQlhdGg1a19od19yZWxlYXNlX3R4X3F1ZXVlKGFoLCBxbnVtKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQotCXR4cSA9ICZzYy0+dHhxc1txbnVtXTsKKwl0eHEgPSAmYWgtPnR4cXNbcW51bV07CiAJaWYgKCF0eHEtPnNldHVwKSB7CiAJCXR4cS0+cW51bSA9IHFudW07CiAJCXR4cS0+bGluayA9IE5VTEw7CkBAIC05NDcsNyArOTQ1LDcgQEAKIAkJdHhxLT50eHFfcG9sbF9tYXJrID0gZmFsc2U7CiAJCXR4cS0+dHhxX3N0dWNrID0gMDsKIAl9Ci0JcmV0dXJuICZzYy0+dHhxc1txbnVtXTsKKwlyZXR1cm4gJmFoLT50eHFzW3FudW1dOwogfQogCiBzdGF0aWMgaW50CkBAIC05NjcsMTggKzk2NSwxNyBAQAogfQogCiBzdGF0aWMgaW50Ci1hdGg1a19iZWFjb25xX2NvbmZpZyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQorYXRoNWtfYmVhY29ucV9jb25maWcoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOwogCXN0cnVjdCBhdGg1a190eHFfaW5mbyBxaTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gYXRoNWtfaHdfZ2V0X3R4X3F1ZXVlcHJvcHMoYWgsIHNjLT5iaGFscSwgJnFpKTsKKwlyZXQgPSBhdGg1a19od19nZXRfdHhfcXVldWVwcm9wcyhhaCwgYWgtPmJoYWxxLCAmcWkpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCi0JaWYgKHNjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKLQkJc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSB7CisJaWYgKGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkgICAgYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSB7CiAJCS8qCiAJCSAqIEFsd2F5cyBidXJzdCBvdXQgYmVhY29uIGFuZCBDQUIgdHJhZmZpYwogCQkgKiAoYWlmcyA9IGN3bWluID0gY3dtYXggPSAwKQpAQCAtOTg2LDcgKzk4Myw3IEBACiAJCXFpLnRxaV9haWZzID0gMDsKIAkJcWkudHFpX2N3X21pbiA9IDA7CiAJCXFpLnRxaV9jd19tYXggPSAwOwotCX0gZWxzZSBpZiAoc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCX0gZWxzZSBpZiAoYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQkvKgogCQkgKiBBZGhvYyBtb2RlOyBiYWNrb2ZmIGJldHdlZW4gMCBhbmQgKDIgKiBjd19taW4pLgogCQkgKi8KQEAgLTk5NSwxNyArOTkyLDE3IEBACiAJCXFpLnRxaV9jd19tYXggPSAyICogQVI1S19UVU5FX0NXTUlOOwogCX0KIAotCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfQkVBQ09OLAorCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfQkVBQ09OLAogCQkiYmVhY29uIHF1ZXVlcHJvcHMgdHFpX2FpZnM6JWQgdHFpX2N3X21pbjolZCB0cWlfY3dfbWF4OiVkXG4iLAogCQlxaS50cWlfYWlmcywgcWkudHFpX2N3X21pbiwgcWkudHFpX2N3X21heCk7CiAKLQlyZXQgPSBhdGg1a19od19zZXRfdHhfcXVldWVwcm9wcyhhaCwgc2MtPmJoYWxxLCAmcWkpOworCXJldCA9IGF0aDVrX2h3X3NldF90eF9xdWV1ZXByb3BzKGFoLCBhaC0+YmhhbHEsICZxaSk7CiAJaWYgKHJldCkgewotCQlBVEg1S19FUlIoc2MsICIlczogdW5hYmxlIHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIGZvciBiZWFjb24gIgorCQlBVEg1S19FUlIoYWgsICIlczogdW5hYmxlIHRvIHVwZGF0ZSBwYXJhbWV0ZXJzIGZvciBiZWFjb24gIgogCQkJImhhcmR3YXJlIHF1ZXVlIVxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycjsKIAl9Ci0JcmV0ID0gYXRoNWtfaHdfcmVzZXRfdHhfcXVldWUoYWgsIHNjLT5iaGFscSk7IC8qIHB1c2ggdG8gaC93ICovCisJcmV0ID0gYXRoNWtfaHdfcmVzZXRfdHhfcXVldWUoYWgsIGFoLT5iaGFscSk7IC8qIHB1c2ggdG8gaC93ICovCiAJaWYgKHJldCkKIAkJZ290byBlcnI7CiAKQEAgLTEwMTQsNyArMTAxMSw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnI7CiAKLQlxaS50cWlfcmVhZHlfdGltZSA9IChzYy0+YmludHZhbCAqIDgwKSAvIDEwMDsKKwlxaS50cWlfcmVhZHlfdGltZSA9IChhaC0+YmludHZhbCAqIDgwKSAvIDEwMDsKIAlyZXQgPSBhdGg1a19od19zZXRfdHhfcXVldWVwcm9wcyhhaCwgQVI1S19UWF9RVUVVRV9JRF9DQUIsICZxaSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnI7CkBAIC0xMDI3LDcgKzEwMjQsNyBAQAogLyoqCiAgKiBhdGg1a19kcmFpbl90eF9idWZmcyAtIEVtcHR5IHR4IGJ1ZmZlcnMKICAqCi0gKiBAc2MgVGhlICZzdHJ1Y3QgYXRoNWtfc29mdGMKKyAqIEBhaCBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIEVtcHR5IHR4IGJ1ZmZlcnMgZnJvbSBhbGwgcXVldWVzIGluIHByZXBhcmF0aW9uCiAgKiBvZiBhIHJlc2V0IG9yIGR1cmluZyBzaHV0ZG93bi4KQEAgLTEwMzYsMjYgKzEwMzMsMjYgQEAKICAqCXdlIGRvIG5vdCBuZWVkIHRvIGJsb2NrIGF0aDVrX3R4X3Rhc2tsZXQKICAqLwogc3RhdGljIHZvaWQKLWF0aDVrX2RyYWluX3R4X2J1ZmZzKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpCithdGg1a19kcmFpbl90eF9idWZmcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXN0cnVjdCBhdGg1a190eHEgKnR4cTsKIAlzdHJ1Y3QgYXRoNWtfYnVmICpiZiwgKmJmMDsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNjLT50eHFzKTsgaSsrKSB7Ci0JCWlmIChzYy0+dHhxc1tpXS5zZXR1cCkgewotCQkJdHhxID0gJnNjLT50eHFzW2ldOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFoLT50eHFzKTsgaSsrKSB7CisJCWlmIChhaC0+dHhxc1tpXS5zZXR1cCkgeworCQkJdHhxID0gJmFoLT50eHFzW2ldOwogCQkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmxvY2spOwogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJmLCBiZjAsICZ0eHEtPnEsIGxpc3QpIHsKLQkJCQlhdGg1a19kZWJ1Z19wcmludHR4YnVmKHNjLCBiZik7CisJCQkJYXRoNWtfZGVidWdfcHJpbnR0eGJ1ZihhaCwgYmYpOwogCi0JCQkJYXRoNWtfdHhidWZfZnJlZV9za2Ioc2MsIGJmKTsKKwkJCQlhdGg1a190eGJ1Zl9mcmVlX3NrYihhaCwgYmYpOwogCi0JCQkJc3Bpbl9sb2NrX2JoKCZzYy0+dHhidWZsb2NrKTsKLQkJCQlsaXN0X21vdmVfdGFpbCgmYmYtPmxpc3QsICZzYy0+dHhidWYpOwotCQkJCXNjLT50eGJ1Zl9sZW4rKzsKKwkJCQlzcGluX2xvY2tfYmgoJmFoLT50eGJ1ZmxvY2spOworCQkJCWxpc3RfbW92ZV90YWlsKCZiZi0+bGlzdCwgJmFoLT50eGJ1Zik7CisJCQkJYWgtPnR4YnVmX2xlbisrOwogCQkJCXR4cS0+dHhxX2xlbi0tOwotCQkJCXNwaW5fdW5sb2NrX2JoKCZzYy0+dHhidWZsb2NrKTsKKwkJCQlzcGluX3VubG9ja19iaCgmYWgtPnR4YnVmbG9jayk7CiAJCQl9CiAJCQl0eHEtPmxpbmsgPSBOVUxMOwogCQkJdHhxLT50eHFfcG9sbF9tYXJrID0gZmFsc2U7CkBAIC0xMDY1LDE0ICsxMDYyLDE0IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1hdGg1a190eHFfcmVsZWFzZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQorYXRoNWtfdHhxX3JlbGVhc2Uoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlzdHJ1Y3QgYXRoNWtfdHhxICp0eHEgPSBzYy0+dHhxczsKKwlzdHJ1Y3QgYXRoNWtfdHhxICp0eHEgPSBhaC0+dHhxczsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNjLT50eHFzKTsgaSsrLCB0eHErKykKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhaC0+dHhxcyk7IGkrKywgdHhxKyspCiAJCWlmICh0eHEtPnNldHVwKSB7Ci0JCQlhdGg1a19od19yZWxlYXNlX3R4X3F1ZXVlKHNjLT5haCwgdHhxLT5xbnVtKTsKKwkJCWF0aDVrX2h3X3JlbGVhc2VfdHhfcXVldWUoYWgsIHR4cS0+cW51bSk7CiAJCQl0eHEtPnNldHVwID0gZmFsc2U7CiAJCX0KIH0KQEAgLTEwODYsMzMgKzEwODMsMzIgQEAKICAqIEVuYWJsZSB0aGUgcmVjZWl2ZSBoL3cgZm9sbG93aW5nIGEgcmVzZXQuCiAgKi8KIHN0YXRpYyBpbnQKLWF0aDVrX3J4X3N0YXJ0KHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpCithdGg1a19yeF9zdGFydChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJc3RydWN0IGF0aDVrX2J1ZiAqYmY7CiAJaW50IHJldDsKIAogCWNvbW1vbi0+cnhfYnVmc2l6ZSA9IHJvdW5kdXAoSUVFRTgwMjExX01BWF9GUkFNRV9MRU4sIGNvbW1vbi0+Y2FjaGVsc3opOwogCi0JQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19SRVNFVCwgImNhY2hlbHN6ICV1IHJ4X2J1ZnNpemUgJXVcbiIsCisJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19SRVNFVCwgImNhY2hlbHN6ICV1IHJ4X2J1ZnNpemUgJXVcbiIsCiAJCSAgY29tbW9uLT5jYWNoZWxzeiwgY29tbW9uLT5yeF9idWZzaXplKTsKIAotCXNwaW5fbG9ja19iaCgmc2MtPnJ4YnVmbG9jayk7Ci0Jc2MtPnJ4bGluayA9IE5VTEw7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShiZiwgJnNjLT5yeGJ1ZiwgbGlzdCkgewotCQlyZXQgPSBhdGg1a19yeGJ1Zl9zZXR1cChzYywgYmYpOworCXNwaW5fbG9ja19iaCgmYWgtPnJ4YnVmbG9jayk7CisJYWgtPnJ4bGluayA9IE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShiZiwgJmFoLT5yeGJ1ZiwgbGlzdCkgeworCQlyZXQgPSBhdGg1a19yeGJ1Zl9zZXR1cChhaCwgYmYpOwogCQlpZiAocmV0ICE9IDApIHsKLQkJCXNwaW5fdW5sb2NrX2JoKCZzYy0+cnhidWZsb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZhaC0+cnhidWZsb2NrKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJfQotCWJmID0gbGlzdF9maXJzdF9lbnRyeSgmc2MtPnJ4YnVmLCBzdHJ1Y3QgYXRoNWtfYnVmLCBsaXN0KTsKKwliZiA9IGxpc3RfZmlyc3RfZW50cnkoJmFoLT5yeGJ1Ziwgc3RydWN0IGF0aDVrX2J1ZiwgbGlzdCk7CiAJYXRoNWtfaHdfc2V0X3J4ZHAoYWgsIGJmLT5kYWRkcik7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNjLT5yeGJ1ZmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZhaC0+cnhidWZsb2NrKTsKIAogCWF0aDVrX2h3X3N0YXJ0X3J4X2RtYShhaCk7CS8qIGVuYWJsZSByZWN2IGRlc2NyaXB0b3JzICovCi0JYXRoNWtfdXBkYXRlX2Jzc2lkX21hc2tfYW5kX29wbW9kZShzYywgTlVMTCk7IC8qIHNldCBmaWx0ZXJzLCBldGMuICovCisJYXRoNWtfdXBkYXRlX2Jzc2lkX21hc2tfYW5kX29wbW9kZShhaCwgTlVMTCk7IC8qIHNldCBmaWx0ZXJzLCBldGMuICovCiAJYXRoNWtfaHdfc3RhcnRfcnhfcGN1KGFoKTsJLyogcmUtZW5hYmxlIFBDVS9ETUEgZW5naW5lICovCiAKIAlyZXR1cm4gMDsKQEAgLTExMjgsMjEgKzExMjQsMTkgQEAKICAqIGRvZXMuCiAgKi8KIHN0YXRpYyB2b2lkCi1hdGg1a19yeF9zdG9wKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpCithdGg1a19yeF9zdG9wKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKIAogCWF0aDVrX2h3X3NldF9yeF9maWx0ZXIoYWgsIDApOwkvKiBjbGVhciByZWN2IGZpbHRlciAqLwogCWF0aDVrX2h3X3N0b3BfcnhfcGN1KGFoKTsJLyogZGlzYWJsZSBQQ1UgKi8KIAotCWF0aDVrX2RlYnVnX3ByaW50cnhidWZmcyhzYywgYWgpOworCWF0aDVrX2RlYnVnX3ByaW50cnhidWZmcyhhaCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLWF0aDVrX3J4X2RlY3J5cHRlZChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorYXRoNWtfcnhfZGVjcnlwdGVkKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgKnJzKQogewotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9ICh2b2lkICopc2tiLT5kYXRhOwogCXVuc2lnbmVkIGludCBrZXlpeCwgaGxlbjsKQEAgLTExNjksMTAgKzExNjMsMTAgQEAKIAogCiBzdGF0aWMgdm9pZAotYXRoNWtfY2hlY2tfaWJzc190c2Yoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2F0aDVrX2NoZWNrX2lic3NfdHNmKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4cykKIHsKLQlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKHNjLT5haCk7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJdTY0IHRzZiwgYmNfdHN0YW1wOwogCXUzMiBod190dTsKIAlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2tiLT5kYXRhOwpAQCAtMTE4NSwxMSArMTE3OSwxMSBAQAogCQkgKiBoYXZlIHVwZGF0ZWQgdGhlIGxvY2FsIFRTRi4gV2UgaGF2ZSB0byB3b3JrIGFyb3VuZCB2YXJpb3VzCiAJCSAqIGhhcmR3YXJlIGJ1Z3MsIHRob3VnaC4uLgogCQkgKi8KLQkJdHNmID0gYXRoNWtfaHdfZ2V0X3RzZjY0KHNjLT5haCk7CisJCXRzZiA9IGF0aDVrX2h3X2dldF90c2Y2NChhaCk7CiAJCWJjX3RzdGFtcCA9IGxlNjRfdG9fY3B1KG1nbXQtPnUuYmVhY29uLnRpbWVzdGFtcCk7CiAJCWh3X3R1ID0gVFNGX1RPX1RVKHRzZik7CiAKLQkJQVRINUtfREJHX1VOTElNSVQoc2MsIEFUSDVLX0RFQlVHX0JFQUNPTiwKKwkJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0JFQUNPTiwKIAkJCSJiZWFjb24gJWxseCBtYWN0aW1lICVsbHggKGRpZmYgJWxsZCkgdHNmIG5vdyAlbGx4XG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyliY190c3RhbXAsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKXJ4cy0+bWFjdGltZSwKQEAgLTEyMDgsNyArMTIwMiw3IEBACiAJCSAqIHJlY2VpdmVkLCBub3QgbGlrZSBtYWM4MDIxMSB3aGljaCBkZWZpbmVzIGl0IGF0IHRoZSBzdGFydC4KIAkJICovCiAJCWlmIChiY190c3RhbXAgPiByeHMtPm1hY3RpbWUpIHsKLQkJCUFUSDVLX0RCR19VTkxJTUlUKHNjLCBBVEg1S19ERUJVR19CRUFDT04sCisJCQlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQkVBQ09OLAogCQkJCSJmaXhpbmcgbWFjdGltZSBmcm9tICVsbHggdG8gJWxseFxuIiwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJ4cy0+bWFjdGltZSwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKXRzZik7CkBAIC0xMjIxLDI1ICsxMjE1LDI0IEBACiAJCSAqIGJlYWNvbnMuIFRoaXMgYWxzbyB0YWtlcyBjYXJlIG9mIHN5bmNocm9uaXppbmcgYmVhY29uIHNlbmRpbmcKIAkJICogdGltZXMgd2l0aCBvdGhlciBzdGF0aW9ucy4KIAkJICovCi0JCWlmIChod190dSA+PSBzYy0+bmV4dHRidHQpCi0JCQlhdGg1a19iZWFjb25fdXBkYXRlX3RpbWVycyhzYywgYmNfdHN0YW1wKTsKKwkJaWYgKGh3X3R1ID49IGFoLT5uZXh0dGJ0dCkKKwkJCWF0aDVrX2JlYWNvbl91cGRhdGVfdGltZXJzKGFoLCBiY190c3RhbXApOwogCiAJCS8qIENoZWNrIGlmIHRoZSBiZWFjb24gdGltZXJzIGFyZSBzdGlsbCBjb3JyZWN0LCBiZWNhdXNlIGEgVFNGCiAJCSAqIHVwZGF0ZSBtaWdodCBoYXZlIGNyZWF0ZWQgYSB3aW5kb3cgYmV0d2VlbiB0aGVtIC0gZm9yIGEKIAkJICogbG9uZ2VyIGRlc2NyaXB0aW9uIHNlZSB0aGUgY29tbWVudCBvZiB0aGlzIGZ1bmN0aW9uOiAqLwotCQlpZiAoIWF0aDVrX2h3X2NoZWNrX2JlYWNvbl90aW1lcnMoc2MtPmFoLCBzYy0+YmludHZhbCkpIHsKLQkJCWF0aDVrX2JlYWNvbl91cGRhdGVfdGltZXJzKHNjLCBiY190c3RhbXApOwotCQkJQVRINUtfREJHX1VOTElNSVQoc2MsIEFUSDVLX0RFQlVHX0JFQUNPTiwKKwkJaWYgKCFhdGg1a19od19jaGVja19iZWFjb25fdGltZXJzKGFoLCBhaC0+YmludHZhbCkpIHsKKwkJCWF0aDVrX2JlYWNvbl91cGRhdGVfdGltZXJzKGFoLCBiY190c3RhbXApOworCQkJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0JFQUNPTiwKIAkJCQkiZml4ZWQgYmVhY29uIHRpbWVycyBhZnRlciBiZWFjb24gcmVjZWl2ZVxuIik7CiAJCX0KIAl9CiB9CiAKIHN0YXRpYyB2b2lkCi1hdGg1a191cGRhdGVfYmVhY29uX3Jzc2koc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJzc2kpCithdGg1a191cGRhdGVfYmVhY29uX3Jzc2koc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJzc2kpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg1a19od19jb21tb24oYWgpOwogCiAJLyogb25seSBiZWFjb25zIGZyb20gb3VyIEJTU0lEICovCkBAIC0xMjU4LDE2ICsxMjUxLDE1IEBACiAgKi8KIHN0YXRpYyBpbnQgYXRoNWtfY29tbW9uX3BhZHBvcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICogaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJX19sZTE2IGZyYW1lX2NvbnRyb2wgPSBoZHItPmZyYW1lX2NvbnRyb2w7CiAJaW50IHBhZHBvcyA9IDI0OwogCi0JaWYgKGllZWU4MDIxMV9oYXNfYTQoZnJhbWVfY29udHJvbCkpIHsKKwlpZiAoaWVlZTgwMjExX2hhc19hNChmcmFtZV9jb250cm9sKSkKIAkJcGFkcG9zICs9IEVUSF9BTEVOOwotCX0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZyYW1lX2NvbnRyb2wpKSB7CisKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZyYW1lX2NvbnRyb2wpKQogCQlwYWRwb3MgKz0gSUVFRTgwMjExX1FPU19DVExfTEVOOwotCX0KIAogCXJldHVybiBwYWRwb3M7CiB9CkBAIC0xMjgxLDEzICsxMjczLDEzIEBACiAJaW50IHBhZHBvcyA9IGF0aDVrX2NvbW1vbl9wYWRwb3Moc2tiKTsKIAlpbnQgcGFkc2l6ZSA9IHBhZHBvcyAmIDM7CiAKLQlpZiAocGFkc2l6ZSAmJiBza2ItPmxlbj5wYWRwb3MpIHsKKwlpZiAocGFkc2l6ZSAmJiBza2ItPmxlbiA+IHBhZHBvcykgewogCiAJCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IHBhZHNpemUpCiAJCQlyZXR1cm4gLTE7CiAKIAkJc2tiX3B1c2goc2tiLCBwYWRzaXplKTsKLQkJbWVtbW92ZShza2ItPmRhdGEsIHNrYi0+ZGF0YStwYWRzaXplLCBwYWRwb3MpOworCQltZW1tb3ZlKHNrYi0+ZGF0YSwgc2tiLT5kYXRhICsgcGFkc2l6ZSwgcGFkcG9zKTsKIAkJcmV0dXJuIHBhZHNpemU7CiAJfQogCkBAIC0xMzEyLDcgKzEzMDQsNyBAQAogCWludCBwYWRwb3MgPSBhdGg1a19jb21tb25fcGFkcG9zKHNrYik7CiAJaW50IHBhZHNpemUgPSBwYWRwb3MgJiAzOwogCi0JaWYgKHBhZHNpemUgJiYgc2tiLT5sZW4+PXBhZHBvcytwYWRzaXplKSB7CisJaWYgKHBhZHNpemUgJiYgc2tiLT5sZW4gPj0gcGFkcG9zICsgcGFkc2l6ZSkgewogCQltZW1tb3ZlKHNrYi0+ZGF0YSArIHBhZHNpemUsIHNrYi0+ZGF0YSwgcGFkcG9zKTsKIAkJc2tiX3B1bGwoc2tiLCBwYWRzaXplKTsKIAkJcmV0dXJuIHBhZHNpemU7CkBAIC0xMzIyLDcgKzEzMTQsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotYXRoNWtfcmVjZWl2ZV9mcmFtZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorYXRoNWtfcmVjZWl2ZV9mcmFtZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgc3RydWN0IGF0aDVrX3J4X3N0YXR1cyAqcnMpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4czsKQEAgLTEzNDgsNDQgKzEzNDAsNDQgQEAKIAkgKiB0aW1lc3RhbXAgKGJlZ2lubmluZyBvZiBwaHkgZnJhbWUsIGRhdGEgZnJhbWUsIGVuZCBvZiByeD8pLgogCSAqIFRoZSBvbmx5IHRoaW5nIHdlIGtub3cgaXMgdGhhdCBpdCBpcyBoYXJkd2FyZSBzcGVjaWZpYy4uLgogCSAqIE9uIEFSNTIxMyBpdCBzZWVtcyB0aGUgcnggdGltZXN0YW1wIGlzIGF0IHRoZSBlbmQgb2YgdGhlCi0JICogZnJhbWUsIGJ1dCBpJ20gbm90IHN1cmUuCisJICogZnJhbWUsIGJ1dCBJJ20gbm90IHN1cmUuCiAJICoKIAkgKiBOT1RFOiBtYWM4MDIxMSBkZWZpbmVzIG1hY3RpbWUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlyc3QKIAkgKiBkYXRhIHN5bWJvbC4gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgdGltZSByZWZlcmVuY2VzIGl0J3MKIAkgKiBpbXBvc3NpYmxlIHRvIGNvbXBseSB0byB0aGF0LiBUaGlzIGFmZmVjdHMgSUJTUyBtZXJnZSBvbmx5CiAJICogcmlnaHQgbm93LCBzbyBpdCdzIG5vdCB0b28gYmFkLi4uCiAJICovCi0JcnhzLT5tYWN0aW1lID0gYXRoNWtfZXh0ZW5kX3RzZihzYy0+YWgsIHJzLT5yc190c3RhbXApOworCXJ4cy0+bWFjdGltZSA9IGF0aDVrX2V4dGVuZF90c2YoYWgsIHJzLT5yc190c3RhbXApOwogCXJ4cy0+ZmxhZyB8PSBSWF9GTEFHX01BQ1RJTUVfTVBEVTsKIAotCXJ4cy0+ZnJlcSA9IHNjLT5jdXJjaGFuLT5jZW50ZXJfZnJlcTsKLQlyeHMtPmJhbmQgPSBzYy0+Y3VyY2hhbi0+YmFuZDsKKwlyeHMtPmZyZXEgPSBhaC0+Y3VyY2hhbi0+Y2VudGVyX2ZyZXE7CisJcnhzLT5iYW5kID0gYWgtPmN1cmNoYW4tPmJhbmQ7CiAKLQlyeHMtPnNpZ25hbCA9IHNjLT5haC0+YWhfbm9pc2VfZmxvb3IgKyBycy0+cnNfcnNzaTsKKwlyeHMtPnNpZ25hbCA9IGFoLT5haF9ub2lzZV9mbG9vciArIHJzLT5yc19yc3NpOwogCiAJcnhzLT5hbnRlbm5hID0gcnMtPnJzX2FudGVubmE7CiAKIAlpZiAocnMtPnJzX2FudGVubmEgPiAwICYmIHJzLT5yc19hbnRlbm5hIDwgNSkKLQkJc2MtPnN0YXRzLmFudGVubmFfcnhbcnMtPnJzX2FudGVubmFdKys7CisJCWFoLT5zdGF0cy5hbnRlbm5hX3J4W3JzLT5yc19hbnRlbm5hXSsrOwogCWVsc2UKLQkJc2MtPnN0YXRzLmFudGVubmFfcnhbMF0rKzsgLyogaW52YWxpZCAqLworCQlhaC0+c3RhdHMuYW50ZW5uYV9yeFswXSsrOyAvKiBpbnZhbGlkICovCiAKLQlyeHMtPnJhdGVfaWR4ID0gYXRoNWtfaHdfdG9fZHJpdmVyX3JpeChzYywgcnMtPnJzX3JhdGUpOwotCXJ4cy0+ZmxhZyB8PSBhdGg1a19yeF9kZWNyeXB0ZWQoc2MsIHNrYiwgcnMpOworCXJ4cy0+cmF0ZV9pZHggPSBhdGg1a19od190b19kcml2ZXJfcml4KGFoLCBycy0+cnNfcmF0ZSk7CisJcnhzLT5mbGFnIHw9IGF0aDVrX3J4X2RlY3J5cHRlZChhaCwgc2tiLCBycyk7CiAKIAlpZiAocnhzLT5yYXRlX2lkeCA+PSAwICYmIHJzLT5yc19yYXRlID09Ci0JICAgIHNjLT5zYmFuZHNbc2MtPmN1cmNoYW4tPmJhbmRdLmJpdHJhdGVzW3J4cy0+cmF0ZV9pZHhdLmh3X3ZhbHVlX3Nob3J0KQorCSAgICBhaC0+c2JhbmRzW2FoLT5jdXJjaGFuLT5iYW5kXS5iaXRyYXRlc1tyeHMtPnJhdGVfaWR4XS5od192YWx1ZV9zaG9ydCkKIAkJcnhzLT5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7CiAKLQl0cmFjZV9hdGg1a19yeChzYywgc2tiKTsKKwl0cmFjZV9hdGg1a19yeChhaCwgc2tiKTsKIAotCWF0aDVrX3VwZGF0ZV9iZWFjb25fcnNzaShzYywgc2tiLCBycy0+cnNfcnNzaSk7CisJYXRoNWtfdXBkYXRlX2JlYWNvbl9yc3NpKGFoLCBza2IsIHJzLT5yc19yc3NpKTsKIAogCS8qIGNoZWNrIGJlYWNvbnMgaW4gSUJTUyBtb2RlICovCi0JaWYgKHNjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCi0JCWF0aDVrX2NoZWNrX2lic3NfdHNmKHNjLCBza2IsIHJ4cyk7CisJaWYgKGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCWF0aDVrX2NoZWNrX2lic3NfdHNmKGFoLCBza2IsIHJ4cyk7CiAKLQlpZWVlODAyMTFfcngoc2MtPmh3LCBza2IpOworCWllZWU4MDIxMV9yeChhaC0+aHcsIHNrYik7CiB9CiAKIC8qKiBhdGg1a19mcmFtZV9yZWNlaXZlX29rKCkgLSBEbyB3ZSB3YW50IHRvIHJlY2VpdmUgdGhpcyBmcmFtZSBvciBub3Q/CkBAIC0xMzk0LDIwICsxMzg2LDIwIEBACiAgKiBzdGF0aXN0aWNzLiBSZXR1cm4gdHJ1ZSBpZiB3ZSB3YW50IHRoaXMgZnJhbWUsIGZhbHNlIGlmIG5vdC4KICAqLwogc3RhdGljIGJvb2wKLWF0aDVrX3JlY2VpdmVfZnJhbWVfb2soc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IGF0aDVrX3J4X3N0YXR1cyAqcnMpCithdGg1a19yZWNlaXZlX2ZyYW1lX29rKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgKnJzKQogewotCXNjLT5zdGF0cy5yeF9hbGxfY291bnQrKzsKLQlzYy0+c3RhdHMucnhfYnl0ZXNfY291bnQgKz0gcnMtPnJzX2RhdGFsZW47CisJYWgtPnN0YXRzLnJ4X2FsbF9jb3VudCsrOworCWFoLT5zdGF0cy5yeF9ieXRlc19jb3VudCArPSBycy0+cnNfZGF0YWxlbjsKIAogCWlmICh1bmxpa2VseShycy0+cnNfc3RhdHVzKSkgewogCQlpZiAocnMtPnJzX3N0YXR1cyAmIEFSNUtfUlhFUlJfQ1JDKQotCQkJc2MtPnN0YXRzLnJ4ZXJyX2NyYysrOworCQkJYWgtPnN0YXRzLnJ4ZXJyX2NyYysrOwogCQlpZiAocnMtPnJzX3N0YXR1cyAmIEFSNUtfUlhFUlJfRklGTykKLQkJCXNjLT5zdGF0cy5yeGVycl9maWZvKys7CisJCQlhaC0+c3RhdHMucnhlcnJfZmlmbysrOwogCQlpZiAocnMtPnJzX3N0YXR1cyAmIEFSNUtfUlhFUlJfUEhZKSB7Ci0JCQlzYy0+c3RhdHMucnhlcnJfcGh5Kys7CisJCQlhaC0+c3RhdHMucnhlcnJfcGh5Kys7CiAJCQlpZiAocnMtPnJzX3BoeWVyciA+IDAgJiYgcnMtPnJzX3BoeWVyciA8IDMyKQotCQkJCXNjLT5zdGF0cy5yeGVycl9waHlfY29kZVtycy0+cnNfcGh5ZXJyXSsrOworCQkJCWFoLT5zdGF0cy5yeGVycl9waHlfY29kZVtycy0+cnNfcGh5ZXJyXSsrOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCWlmIChycy0+cnNfc3RhdHVzICYgQVI1S19SWEVSUl9ERUNSWVBUKSB7CkBAIC0xNDIxLDEzICsxNDEzLDEzIEBACiAJCQkgKgogCQkJICogWFhYIGRvIGtleSBjYWNoZSBmYXVsdGluZwogCQkJICovCi0JCQlzYy0+c3RhdHMucnhlcnJfZGVjcnlwdCsrOworCQkJYWgtPnN0YXRzLnJ4ZXJyX2RlY3J5cHQrKzsKIAkJCWlmIChycy0+cnNfa2V5aXggPT0gQVI1S19SWEtFWUlYX0lOVkFMSUQgJiYKIAkJCSAgICAhKHJzLT5yc19zdGF0dXMgJiBBUjVLX1JYRVJSX0NSQykpCiAJCQkJcmV0dXJuIHRydWU7CiAJCX0KIAkJaWYgKHJzLT5yc19zdGF0dXMgJiBBUjVLX1JYRVJSX01JQykgewotCQkJc2MtPnN0YXRzLnJ4ZXJyX21pYysrOworCQkJYWgtPnN0YXRzLnJ4ZXJyX21pYysrOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KIApAQCAtMTQzNywyNSArMTQyOSwyNiBAQAogCX0KIAogCWlmICh1bmxpa2VseShycy0+cnNfbW9yZSkpIHsKLQkJc2MtPnN0YXRzLnJ4ZXJyX2p1bWJvKys7CisJCWFoLT5zdGF0cy5yeGVycl9qdW1ibysrOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgdm9pZAotYXRoNWtfc2V0X2N1cnJlbnRfaW1hc2soc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK2F0aDVrX3NldF9jdXJyZW50X2ltYXNrKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0JZW51bSBhdGg1a19pbnQgaW1hc2sgPSBzYy0+aW1hc2s7CisJZW51bSBhdGg1a19pbnQgaW1hc2s7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+aXJxbG9jaywgZmxhZ3MpOwotCWlmIChzYy0+cnhfcGVuZGluZykKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWgtPmlycWxvY2ssIGZsYWdzKTsKKwlpbWFzayA9IGFoLT5pbWFzazsKKwlpZiAoYWgtPnJ4X3BlbmRpbmcpCiAJCWltYXNrICY9IH5BUjVLX0lOVF9SWF9BTEw7Ci0JaWYgKHNjLT50eF9wZW5kaW5nKQorCWlmIChhaC0+dHhfcGVuZGluZykKIAkJaW1hc2sgJj0gfkFSNUtfSU5UX1RYX0FMTDsKLQlhdGg1a19od19zZXRfaW1yKHNjLT5haCwgaW1hc2spOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5pcnFsb2NrLCBmbGFncyk7CisJYXRoNWtfaHdfc2V0X2ltcihhaCwgaW1hc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoLT5pcnFsb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNDY0LDM5ICsxNDU3LDM4IEBACiAJc3RydWN0IGF0aDVrX3J4X3N0YXR1cyBycyA9IHt9OwogCXN0cnVjdCBza19idWZmICpza2IsICpuZXh0X3NrYjsKIAlkbWFfYWRkcl90IG5leHRfc2tiX2FkZHI7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9ICh2b2lkICopZGF0YTsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCXN0cnVjdCBhdGg1a19odyAqYWggPSAodm9pZCAqKWRhdGE7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJc3RydWN0IGF0aDVrX2J1ZiAqYmY7CiAJc3RydWN0IGF0aDVrX2Rlc2MgKmRzOwogCWludCByZXQ7CiAKLQlzcGluX2xvY2soJnNjLT5yeGJ1ZmxvY2spOwotCWlmIChsaXN0X2VtcHR5KCZzYy0+cnhidWYpKSB7Ci0JCUFUSDVLX1dBUk4oc2MsICJlbXB0eSByeCBidWYgcG9vbFxuIik7CisJc3Bpbl9sb2NrKCZhaC0+cnhidWZsb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmYWgtPnJ4YnVmKSkgeworCQlBVEg1S19XQVJOKGFoLCAiZW1wdHkgcnggYnVmIHBvb2xcbiIpOwogCQlnb3RvIHVubG9jazsKIAl9CiAJZG8gewotCQliZiA9IGxpc3RfZmlyc3RfZW50cnkoJnNjLT5yeGJ1Ziwgc3RydWN0IGF0aDVrX2J1ZiwgbGlzdCk7CisJCWJmID0gbGlzdF9maXJzdF9lbnRyeSgmYWgtPnJ4YnVmLCBzdHJ1Y3QgYXRoNWtfYnVmLCBsaXN0KTsKIAkJQlVHX09OKGJmLT5za2IgPT0gTlVMTCk7CiAJCXNrYiA9IGJmLT5za2I7CiAJCWRzID0gYmYtPmRlc2M7CiAKIAkJLyogYmFpbCBpZiBIVyBpcyBzdGlsbCB1c2luZyBzZWxmLWxpbmtlZCBkZXNjcmlwdG9yICovCi0JCWlmIChhdGg1a19od19nZXRfcnhkcChzYy0+YWgpID09IGJmLT5kYWRkcikKKwkJaWYgKGF0aDVrX2h3X2dldF9yeGRwKGFoKSA9PSBiZi0+ZGFkZHIpCiAJCQlicmVhazsKIAotCQlyZXQgPSBzYy0+YWgtPmFoX3Byb2NfcnhfZGVzYyhzYy0+YWgsIGRzLCAmcnMpOworCQlyZXQgPSBhaC0+YWhfcHJvY19yeF9kZXNjKGFoLCBkcywgJnJzKTsKIAkJaWYgKHVubGlrZWx5KHJldCA9PSAtRUlOUFJPR1JFU1MpKQogCQkJYnJlYWs7CiAJCWVsc2UgaWYgKHVubGlrZWx5KHJldCkpIHsKLQkJCUFUSDVLX0VSUihzYywgImVycm9yIGluIHByb2Nlc3NpbmcgcnggZGVzY3JpcHRvclxuIik7Ci0JCQlzYy0+c3RhdHMucnhlcnJfcHJvYysrOworCQkJQVRINUtfRVJSKGFoLCAiZXJyb3IgaW4gcHJvY2Vzc2luZyByeCBkZXNjcmlwdG9yXG4iKTsKKwkJCWFoLT5zdGF0cy5yeGVycl9wcm9jKys7CiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChhdGg1a19yZWNlaXZlX2ZyYW1lX29rKHNjLCAmcnMpKSB7Ci0JCQluZXh0X3NrYiA9IGF0aDVrX3J4X3NrYl9hbGxvYyhzYywgJm5leHRfc2tiX2FkZHIpOworCQlpZiAoYXRoNWtfcmVjZWl2ZV9mcmFtZV9vayhhaCwgJnJzKSkgeworCQkJbmV4dF9za2IgPSBhdGg1a19yeF9za2JfYWxsb2MoYWgsICZuZXh0X3NrYl9hZGRyKTsKIAogCQkJLyoKIAkJCSAqIElmIHdlIGNhbid0IHJlcGxhY2UgYmYtPnNrYiB3aXRoIGEgbmV3IHNrYiB1bmRlcgpAQCAtMTUwNSwyNCArMTQ5NywyNCBAQAogCQkJaWYgKCFuZXh0X3NrYikKIAkJCQlnb3RvIG5leHQ7CiAKLQkJCWRtYV91bm1hcF9zaW5nbGUoc2MtPmRldiwgYmYtPnNrYmFkZHIsCisJCQlkbWFfdW5tYXBfc2luZ2xlKGFoLT5kZXYsIGJmLT5za2JhZGRyLAogCQkJCQkgY29tbW9uLT5yeF9idWZzaXplLAogCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKIAogCQkJc2tiX3B1dChza2IsIHJzLnJzX2RhdGFsZW4pOwogCi0JCQlhdGg1a19yZWNlaXZlX2ZyYW1lKHNjLCBza2IsICZycyk7CisJCQlhdGg1a19yZWNlaXZlX2ZyYW1lKGFoLCBza2IsICZycyk7CiAKIAkJCWJmLT5za2IgPSBuZXh0X3NrYjsKIAkJCWJmLT5za2JhZGRyID0gbmV4dF9za2JfYWRkcjsKIAkJfQogbmV4dDoKLQkJbGlzdF9tb3ZlX3RhaWwoJmJmLT5saXN0LCAmc2MtPnJ4YnVmKTsKLQl9IHdoaWxlIChhdGg1a19yeGJ1Zl9zZXR1cChzYywgYmYpID09IDApOworCQlsaXN0X21vdmVfdGFpbCgmYmYtPmxpc3QsICZhaC0+cnhidWYpOworCX0gd2hpbGUgKGF0aDVrX3J4YnVmX3NldHVwKGFoLCBiZikgPT0gMCk7CiB1bmxvY2s6Ci0Jc3Bpbl91bmxvY2soJnNjLT5yeGJ1ZmxvY2spOwotCXNjLT5yeF9wZW5kaW5nID0gZmFsc2U7Ci0JYXRoNWtfc2V0X2N1cnJlbnRfaW1hc2soc2MpOworCXNwaW5fdW5sb2NrKCZhaC0+cnhidWZsb2NrKTsKKwlhaC0+cnhfcGVuZGluZyA9IGZhbHNlOworCWF0aDVrX3NldF9jdXJyZW50X2ltYXNrKGFoKTsKIH0KIAogCkBAIC0xNTM0LDEyICsxNTI2LDEyIEBACiBhdGg1a190eF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkgICAgICAgc3RydWN0IGF0aDVrX3R4cSAqdHhxKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gaHctPnByaXY7CiAJc3RydWN0IGF0aDVrX2J1ZiAqYmY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcGFkc2l6ZTsKIAotCXRyYWNlX2F0aDVrX3R4KHNjLCBza2IsIHR4cSk7CisJdHJhY2VfYXRoNWtfdHgoYWgsIHNrYiwgdHhxKTsKIAogCS8qCiAJICogVGhlIGhhcmR3YXJlIGV4cGVjdHMgdGhlIGhlYWRlciBwYWRkZWQgdG8gNCBieXRlIGJvdW5kYXJpZXMuCkBAIC0xNTQ3LDM2ICsxNTM5LDM3IEBACiAJICovCiAJcGFkc2l6ZSA9IGF0aDVrX2FkZF9wYWRkaW5nKHNrYik7CiAJaWYgKHBhZHNpemUgPCAwKSB7Ci0JCUFUSDVLX0VSUihzYywgInR4IGhkcmxlbiBub3QgJSU0OiBub3QgZW5vdWdoIgorCQlBVEg1S19FUlIoYWgsICJ0eCBoZHJsZW4gbm90ICUlNDogbm90IGVub3VnaCIKIAkJCSAgIiBoZWFkcm9vbSB0byBwYWQiKTsKIAkJZ290byBkcm9wX3BhY2tldDsKIAl9CiAKLQlpZiAodHhxLT50eHFfbGVuID49IHR4cS0+dHhxX21heCkKKwlpZiAodHhxLT50eHFfbGVuID49IHR4cS0+dHhxX21heCAmJgorCSAgICB0eHEtPnFudW0gPD0gQVI1S19UWF9RVUVVRV9JRF9EQVRBX01BWCkKIAkJaWVlZTgwMjExX3N0b3BfcXVldWUoaHcsIHR4cS0+cW51bSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPnR4YnVmbG9jaywgZmxhZ3MpOwotCWlmIChsaXN0X2VtcHR5KCZzYy0+dHhidWYpKSB7Ci0JCUFUSDVLX0VSUihzYywgIm5vIGZ1cnRoZXIgdHhidWYgYXZhaWxhYmxlLCBkcm9wcGluZyBwYWNrZXRcbiIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+dHhidWZsb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFoLT50eGJ1ZmxvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmYWgtPnR4YnVmKSkgeworCQlBVEg1S19FUlIoYWgsICJubyBmdXJ0aGVyIHR4YnVmIGF2YWlsYWJsZSwgZHJvcHBpbmcgcGFja2V0XG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWgtPnR4YnVmbG9jaywgZmxhZ3MpOwogCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOwogCQlnb3RvIGRyb3BfcGFja2V0OwogCX0KLQliZiA9IGxpc3RfZmlyc3RfZW50cnkoJnNjLT50eGJ1Ziwgc3RydWN0IGF0aDVrX2J1ZiwgbGlzdCk7CisJYmYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhaC0+dHhidWYsIHN0cnVjdCBhdGg1a19idWYsIGxpc3QpOwogCWxpc3RfZGVsKCZiZi0+bGlzdCk7Ci0Jc2MtPnR4YnVmX2xlbi0tOwotCWlmIChsaXN0X2VtcHR5KCZzYy0+dHhidWYpKQorCWFoLT50eGJ1Zl9sZW4tLTsKKwlpZiAobGlzdF9lbXB0eSgmYWgtPnR4YnVmKSkKIAkJaWVlZTgwMjExX3N0b3BfcXVldWVzKGh3KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+dHhidWZsb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWgtPnR4YnVmbG9jaywgZmxhZ3MpOwogCiAJYmYtPnNrYiA9IHNrYjsKIAotCWlmIChhdGg1a190eGJ1Zl9zZXR1cChzYywgYmYsIHR4cSwgcGFkc2l6ZSkpIHsKKwlpZiAoYXRoNWtfdHhidWZfc2V0dXAoYWgsIGJmLCB0eHEsIHBhZHNpemUpKSB7CiAJCWJmLT5za2IgPSBOVUxMOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPnR4YnVmbG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZF90YWlsKCZiZi0+bGlzdCwgJnNjLT50eGJ1Zik7Ci0JCXNjLT50eGJ1Zl9sZW4rKzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPnR4YnVmbG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWgtPnR4YnVmbG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZF90YWlsKCZiZi0+bGlzdCwgJmFoLT50eGJ1Zik7CisJCWFoLT50eGJ1Zl9sZW4rKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWgtPnR4YnVmbG9jaywgZmxhZ3MpOwogCQlnb3RvIGRyb3BfcGFja2V0OwogCX0KIAlyZXR1cm47CkBAIC0xNTg2LDE1ICsxNTc5LDE1IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1hdGg1a190eF9mcmFtZV9jb21wbGV0ZWQoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2F0aDVrX3R4X2ZyYW1lX2NvbXBsZXRlZChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJIHN0cnVjdCBhdGg1a190eHEgKnR4cSwgc3RydWN0IGF0aDVrX3R4X3N0YXR1cyAqdHMpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwogCXU4IHRyaWVzWzNdOwogCWludCBpOwogCi0Jc2MtPnN0YXRzLnR4X2FsbF9jb3VudCsrOwotCXNjLT5zdGF0cy50eF9ieXRlc19jb3VudCArPSBza2ItPmxlbjsKKwlhaC0+c3RhdHMudHhfYWxsX2NvdW50Kys7CisJYWgtPnN0YXRzLnR4X2J5dGVzX2NvdW50ICs9IHNrYi0+bGVuOwogCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAKIAl0cmllc1swXSA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudDsKQEAgLTE2MTQsMTUgKzE2MDcsMTUgQEAKIAlpbmZvLT5zdGF0dXMucmF0ZXNbdHMtPnRzX2ZpbmFsX2lkeCArIDFdLmlkeCA9IC0xOwogCiAJaWYgKHVubGlrZWx5KHRzLT50c19zdGF0dXMpKSB7Ci0JCXNjLT5zdGF0cy5hY2tfZmFpbCsrOworCQlhaC0+c3RhdHMuYWNrX2ZhaWwrKzsKIAkJaWYgKHRzLT50c19zdGF0dXMgJiBBUjVLX1RYRVJSX0ZJTFQpIHsKIAkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX1RYX0ZJTFRFUkVEOwotCQkJc2MtPnN0YXRzLnR4ZXJyX2ZpbHQrKzsKKwkJCWFoLT5zdGF0cy50eGVycl9maWx0Kys7CiAJCX0KIAkJaWYgKHRzLT50c19zdGF0dXMgJiBBUjVLX1RYRVJSX1hSRVRSWSkKLQkJCXNjLT5zdGF0cy50eGVycl9yZXRyeSsrOworCQkJYWgtPnN0YXRzLnR4ZXJyX3JldHJ5Kys7CiAJCWlmICh0cy0+dHNfc3RhdHVzICYgQVI1S19UWEVSUl9GSUZPKQotCQkJc2MtPnN0YXRzLnR4ZXJyX2ZpZm8rKzsKKwkJCWFoLT5zdGF0cy50eGVycl9maWZvKys7CiAJfSBlbHNlIHsKIAkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQUNLOwogCQlpbmZvLT5zdGF0dXMuYWNrX3NpZ25hbCA9IHRzLT50c19yc3NpOwpAQCAtMTYzOCwxNiArMTYzMSwxNiBAQAogCWF0aDVrX3JlbW92ZV9wYWRkaW5nKHNrYik7CiAKIAlpZiAodHMtPnRzX2FudGVubmEgPiAwICYmIHRzLT50c19hbnRlbm5hIDwgNSkKLQkJc2MtPnN0YXRzLmFudGVubmFfdHhbdHMtPnRzX2FudGVubmFdKys7CisJCWFoLT5zdGF0cy5hbnRlbm5hX3R4W3RzLT50c19hbnRlbm5hXSsrOwogCWVsc2UKLQkJc2MtPnN0YXRzLmFudGVubmFfdHhbMF0rKzsgLyogaW52YWxpZCAqLworCQlhaC0+c3RhdHMuYW50ZW5uYV90eFswXSsrOyAvKiBpbnZhbGlkICovCiAKLQl0cmFjZV9hdGg1a190eF9jb21wbGV0ZShzYywgc2tiLCB0eHEsIHRzKTsKLQlpZWVlODAyMTFfdHhfc3RhdHVzKHNjLT5odywgc2tiKTsKKwl0cmFjZV9hdGg1a190eF9jb21wbGV0ZShhaCwgc2tiLCB0eHEsIHRzKTsKKwlpZWVlODAyMTFfdHhfc3RhdHVzKGFoLT5odywgc2tiKTsKIH0KIAogc3RhdGljIHZvaWQKLWF0aDVrX3R4X3Byb2Nlc3NxKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBhdGg1a190eHEgKnR4cSkKK2F0aDVrX3R4X3Byb2Nlc3NxKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a190eHEgKnR4cSkKIHsKIAlzdHJ1Y3QgYXRoNWtfdHhfc3RhdHVzIHRzID0ge307CiAJc3RydWN0IGF0aDVrX2J1ZiAqYmYsICpiZjA7CkBAIC0xNjY0LDExICsxNjU3LDExIEBACiAJCWlmIChiZi0+c2tiICE9IE5VTEwpIHsKIAkJCWRzID0gYmYtPmRlc2M7CiAKLQkJCXJldCA9IHNjLT5haC0+YWhfcHJvY190eF9kZXNjKHNjLT5haCwgZHMsICZ0cyk7CisJCQlyZXQgPSBhaC0+YWhfcHJvY190eF9kZXNjKGFoLCBkcywgJnRzKTsKIAkJCWlmICh1bmxpa2VseShyZXQgPT0gLUVJTlBST0dSRVNTKSkKIAkJCQlicmVhazsKIAkJCWVsc2UgaWYgKHVubGlrZWx5KHJldCkpIHsKLQkJCQlBVEg1S19FUlIoc2MsCisJCQkJQVRINUtfRVJSKGFoLAogCQkJCQkiZXJyb3IgJWQgd2hpbGUgcHJvY2Vzc2luZyAiCiAJCQkJCSJxdWV1ZSAldVxuIiwgcmV0LCB0eHEtPnFudW0pOwogCQkJCWJyZWFrOwpAQCAtMTY3Nyw5ICsxNjcwLDkgQEAKIAkJCXNrYiA9IGJmLT5za2I7CiAJCQliZi0+c2tiID0gTlVMTDsKIAotCQkJZG1hX3VubWFwX3NpbmdsZShzYy0+ZGV2LCBiZi0+c2tiYWRkciwgc2tiLT5sZW4sCisJCQlkbWFfdW5tYXBfc2luZ2xlKGFoLT5kZXYsIGJmLT5za2JhZGRyLCBza2ItPmxlbiwKIAkJCQkJRE1BX1RPX0RFVklDRSk7Ci0JCQlhdGg1a190eF9mcmFtZV9jb21wbGV0ZWQoc2MsIHNrYiwgdHhxLCAmdHMpOworCQkJYXRoNWtfdHhfZnJhbWVfY29tcGxldGVkKGFoLCBza2IsIHR4cSwgJnRzKTsKIAkJfQogCiAJCS8qCkBAIC0xNjg4LDMxICsxNjgxLDMxIEBACiAJCSAqIGhvc3QgbWVtb3J5IGFuZCBtb3ZlZCBvbi4KIAkJICogQWx3YXlzIGtlZXAgdGhlIGxhc3QgZGVzY3JpcHRvciB0byBhdm9pZCBIVyByYWNlcy4uLgogCQkgKi8KLQkJaWYgKGF0aDVrX2h3X2dldF90eGRwKHNjLT5haCwgdHhxLT5xbnVtKSAhPSBiZi0+ZGFkZHIpIHsKLQkJCXNwaW5fbG9jaygmc2MtPnR4YnVmbG9jayk7Ci0JCQlsaXN0X21vdmVfdGFpbCgmYmYtPmxpc3QsICZzYy0+dHhidWYpOwotCQkJc2MtPnR4YnVmX2xlbisrOworCQlpZiAoYXRoNWtfaHdfZ2V0X3R4ZHAoYWgsIHR4cS0+cW51bSkgIT0gYmYtPmRhZGRyKSB7CisJCQlzcGluX2xvY2soJmFoLT50eGJ1ZmxvY2spOworCQkJbGlzdF9tb3ZlX3RhaWwoJmJmLT5saXN0LCAmYWgtPnR4YnVmKTsKKwkJCWFoLT50eGJ1Zl9sZW4rKzsKIAkJCXR4cS0+dHhxX2xlbi0tOwotCQkJc3Bpbl91bmxvY2soJnNjLT50eGJ1ZmxvY2spOworCQkJc3Bpbl91bmxvY2soJmFoLT50eGJ1ZmxvY2spOwogCQl9CiAJfQogCXNwaW5fdW5sb2NrKCZ0eHEtPmxvY2spOwogCWlmICh0eHEtPnR4cV9sZW4gPCBBVEg1S19UWFFfTEVOX0xPVyAmJiB0eHEtPnFudW0gPCA0KQotCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShzYy0+aHcsIHR4cS0+cW51bSk7CisJCWllZWU4MDIxMV93YWtlX3F1ZXVlKGFoLT5odywgdHhxLT5xbnVtKTsKIH0KIAogc3RhdGljIHZvaWQKIGF0aDVrX3Rhc2tsZXRfdHgodW5zaWduZWQgbG9uZyBkYXRhKQogewogCWludCBpOwotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSAodm9pZCAqKWRhdGE7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9ICh2b2lkICopZGF0YTsKIAotCWZvciAoaT0wOyBpIDwgQVI1S19OVU1fVFhfUVVFVUVTOyBpKyspCi0JCWlmIChzYy0+dHhxc1tpXS5zZXR1cCAmJiAoc2MtPmFoLT5haF90eHFfaXNyICYgQklUKGkpKSkKLQkJCWF0aDVrX3R4X3Byb2Nlc3NxKHNjLCAmc2MtPnR4cXNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBBUjVLX05VTV9UWF9RVUVVRVM7IGkrKykKKwkJaWYgKGFoLT50eHFzW2ldLnNldHVwICYmIChhaC0+YWhfdHhxX2lzciAmIEJJVChpKSkpCisJCQlhdGg1a190eF9wcm9jZXNzcShhaCwgJmFoLT50eHFzW2ldKTsKIAotCXNjLT50eF9wZW5kaW5nID0gZmFsc2U7Ci0JYXRoNWtfc2V0X2N1cnJlbnRfaW1hc2soc2MpOworCWFoLT50eF9wZW5kaW5nID0gZmFsc2U7CisJYXRoNWtfc2V0X2N1cnJlbnRfaW1hc2soYWgpOwogfQogCiAKQEAgLTE3MjQsMjUgKzE3MTcsMjQgQEAKICAqIFNldHVwIHRoZSBiZWFjb24gZnJhbWUgZm9yIHRyYW5zbWl0LgogICovCiBzdGF0aWMgaW50Ci1hdGg1a19iZWFjb25fc2V0dXAoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IGF0aDVrX2J1ZiAqYmYpCithdGg1a19iZWFjb25fc2V0dXAoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2J1ZiAqYmYpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGJmLT5za2I7CiAJc3RydWN0CWllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CiAJc3RydWN0IGF0aDVrX2Rlc2MgKmRzOwogCWludCByZXQgPSAwOwogCXU4IGFudGVubmE7CiAJdTMyIGZsYWdzOwogCWNvbnN0IGludCBwYWRzaXplID0gMDsKIAotCWJmLT5za2JhZGRyID0gZG1hX21hcF9zaW5nbGUoc2MtPmRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwliZi0+c2tiYWRkciA9IGRtYV9tYXBfc2luZ2xlKGFoLT5kZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCiAJCQlETUFfVE9fREVWSUNFKTsKLQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX0JFQUNPTiwgInNrYiAlcCBbZGF0YSAlcCBsZW4gJXVdICIKKwlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0JFQUNPTiwgInNrYiAlcCBbZGF0YSAlcCBsZW4gJXVdICIKIAkJCSJza2JhZGRyICVsbHhcbiIsIHNrYiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmYtPnNrYmFkZHIpOwogCi0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHNjLT5kZXYsIGJmLT5za2JhZGRyKSkgewotCQlBVEg1S19FUlIoc2MsICJiZWFjb24gRE1BIG1hcHBpbmcgZmFpbGVkXG4iKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoYWgtPmRldiwgYmYtPnNrYmFkZHIpKSB7CisJCUFUSDVLX0VSUihhaCwgImJlYWNvbiBETUEgbWFwcGluZyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE3NTAsNyArMTc0Miw3IEBACiAJYW50ZW5uYSA9IGFoLT5haF90eF9hbnQ7CiAKIAlmbGFncyA9IEFSNUtfVFhERVNDX05PQUNLOwotCWlmIChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmIGF0aDVrX2h3X2hhc3Zlb2woYWgpKSB7CisJaWYgKGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYgYXRoNWtfaHdfaGFzdmVvbChhaCkpIHsKIAkJZHMtPmRzX2xpbmsgPSBiZi0+ZGFkZHI7CS8qIHNlbGYtbGlua2VkICovCiAJCWZsYWdzIHw9IEFSNUtfVFhERVNDX1ZFT0w7CiAJfSBlbHNlCkBAIC0xNzYyLDcgKzE3NTQsNyBAQAogCSAqIDQgYmVhY29ucyB0byBtYWtlIHN1cmUgZXZlcnlib2R5IGhlYXJzIG91ciBBUC4KIAkgKiBXaGVuIGEgY2xpZW50IHRyaWVzIHRvIGFzc29jaWF0ZSwgaHcgd2lsbCBrZWVwCiAJICogdHJhY2sgb2YgdGhlIHR4IGFudGVubmEgdG8gYmUgdXNlZCBmb3IgdGhpcyBjbGllbnQKLQkgKiBhdXRvbWF0aWNhbHksIGJhc2VkIG9uIEFDS2VkIHBhY2tldHMuCisJICogYXV0b21hdGljYWxseSwgYmFzZWQgb24gQUNLZWQgcGFja2V0cy4KIAkgKgogCSAqIE5vdGU6IEFQIHN0aWxsIGxpc3RlbnMgYW5kIHRyYW5zbWl0cyBSVFMgb24gdGhlCiAJICogZGVmYXVsdCBhbnRlbm5hIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIGFuIG9tbmkuCkBAIC0xNzc1LDcgKzE3NjcsNyBAQAogCSAqIG9uIGFsbCBvZiB0aGVtLgogCSAqLwogCWlmIChhaC0+YWhfYW50X21vZGUgPT0gQVI1S19BTlRNT0RFX1NFQ1RPUl9BUCkKLQkJYW50ZW5uYSA9IHNjLT5ic2VudCAmIDQgPyAyIDogMTsKKwkJYW50ZW5uYSA9IGFoLT5ic2VudCAmIDQgPyAyIDogMTsKIAogCiAJLyogRklYTUU6IElmIHdlIGFyZSBpbiBnIG1vZGUgYW5kIHJhdGUgaXMgYSBDQ0sgcmF0ZQpAQCAtMTc4NCw4ICsxNzc2LDggQEAKIAlkcy0+ZHNfZGF0YSA9IGJmLT5za2JhZGRyOwogCXJldCA9IGFoLT5haF9zZXR1cF90eF9kZXNjKGFoLCBkcywgc2tiLT5sZW4sCiAJCQlpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihza2IpLCBwYWRzaXplLAotCQkJQVI1S19QS1RfVFlQRV9CRUFDT04sIChzYy0+cG93ZXJfbGV2ZWwgKiAyKSwKLQkJCWllZWU4MDIxMV9nZXRfdHhfcmF0ZShzYy0+aHcsIGluZm8pLT5od192YWx1ZSwKKwkJCUFSNUtfUEtUX1RZUEVfQkVBQ09OLCAoYWgtPnBvd2VyX2xldmVsICogMiksCisJCQlpZWVlODAyMTFfZ2V0X3R4X3JhdGUoYWgtPmh3LCBpbmZvKS0+aHdfdmFsdWUsCiAJCQkxLCBBUjVLX1RYS0VZSVhfSU5WQUxJRCwKIAkJCWFudGVubmEsIGZsYWdzLCAwLCAwKTsKIAlpZiAocmV0KQpAQCAtMTc5Myw3ICsxNzg1LDcgQEAKIAogCXJldHVybiAwOwogZXJyX3VubWFwOgotCWRtYV91bm1hcF9zaW5nbGUoc2MtPmRldiwgYmYtPnNrYmFkZHIsIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwlkbWFfdW5tYXBfc2luZ2xlKGFoLT5kZXYsIGJmLT5za2JhZGRyLCBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTgwOCw3ICsxODAwLDcgQEAKIGF0aDVrX2JlYWNvbl91cGRhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OwogCXN0cnVjdCBhdGg1a192aWYgKmF2ZiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC0xODI0LDkgKzE4MTYsOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlhdGg1a190eGJ1Zl9mcmVlX3NrYihzYywgYXZmLT5iYnVmKTsKKwlhdGg1a190eGJ1Zl9mcmVlX3NrYihhaCwgYXZmLT5iYnVmKTsKIAlhdmYtPmJidWYtPnNrYiA9IHNrYjsKLQlyZXQgPSBhdGg1a19iZWFjb25fc2V0dXAoc2MsIGF2Zi0+YmJ1Zik7CisJcmV0ID0gYXRoNWtfYmVhY29uX3NldHVwKGFoLCBhdmYtPmJidWYpOwogCWlmIChyZXQpCiAJCWF2Zi0+YmJ1Zi0+c2tiID0gTlVMTDsKIG91dDoKQEAgLTE4NDIsMTUgKzE4MzQsMTQgQEAKICAqIG9yIHVzZXIgY29udGV4dCBmcm9tIGF0aDVrX2JlYWNvbl9jb25maWcuCiAgKi8KIHN0YXRpYyB2b2lkCi1hdGg1a19iZWFjb25fc2VuZChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQorYXRoNWtfYmVhY29uX3NlbmQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOwogCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7CiAJc3RydWN0IGF0aDVrX3ZpZiAqYXZmOwogCXN0cnVjdCBhdGg1a19idWYgKmJmOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQlBVEg1S19EQkdfVU5MSU1JVChzYywgQVRINUtfREVCVUdfQkVBQ09OLCAiaW4gYmVhY29uX3NlbmRcbiIpOworCUFUSDVLX0RCR19VTkxJTUlUKGFoLCBBVEg1S19ERUJVR19CRUFDT04sICJpbiBiZWFjb25fc2VuZFxuIik7CiAKIAkvKgogCSAqIENoZWNrIGlmIHRoZSBwcmV2aW91cyBiZWFjb24gaGFzIGdvbmUgb3V0LiAgSWYKQEAgLTE4NTksNDcgKzE4NTAsNDcgQEAKIAkgKiBpbmRpY2F0ZSBhIHByb2JsZW0gYW5kIHNob3VsZCBub3Qgb2NjdXIuICBJZiB3ZQogCSAqIG1pc3MgdG9vIG1hbnkgY29uc2VjdXRpdmUgYmVhY29ucyByZXNldCB0aGUgZGV2aWNlLgogCSAqLwotCWlmICh1bmxpa2VseShhdGg1a19od19udW1fdHhfcGVuZGluZyhhaCwgc2MtPmJoYWxxKSAhPSAwKSkgewotCQlzYy0+Ym1pc3Njb3VudCsrOwotCQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX0JFQUNPTiwKLQkJCSJtaXNzZWQgJXUgY29uc2VjdXRpdmUgYmVhY29uc1xuIiwgc2MtPmJtaXNzY291bnQpOwotCQlpZiAoc2MtPmJtaXNzY291bnQgPiAxMCkgewkvKiBOQjogMTAgaXMgYSBndWVzcyAqLwotCQkJQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19CRUFDT04sCisJaWYgKHVubGlrZWx5KGF0aDVrX2h3X251bV90eF9wZW5kaW5nKGFoLCBhaC0+YmhhbHEpICE9IDApKSB7CisJCWFoLT5ibWlzc2NvdW50Kys7CisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfQkVBQ09OLAorCQkJIm1pc3NlZCAldSBjb25zZWN1dGl2ZSBiZWFjb25zXG4iLCBhaC0+Ym1pc3Njb3VudCk7CisJCWlmIChhaC0+Ym1pc3Njb3VudCA+IDEwKSB7CS8qIE5COiAxMCBpcyBhIGd1ZXNzICovCisJCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0JFQUNPTiwKIAkJCQkic3R1Y2sgYmVhY29uIHRpbWUgKCV1IG1pc3NlZClcbiIsCi0JCQkJc2MtPmJtaXNzY291bnQpOwotCQkJQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19SRVNFVCwKKwkJCQlhaC0+Ym1pc3Njb3VudCk7CisJCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX1JFU0VULAogCQkJCSAgInN0dWNrIGJlYWNvbiwgcmVzZXR0aW5nXG4iKTsKLQkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKHNjLT5odywgJnNjLT5yZXNldF93b3JrKTsKKwkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKGFoLT5odywgJmFoLT5yZXNldF93b3JrKTsKIAkJfQogCQlyZXR1cm47CiAJfQotCWlmICh1bmxpa2VseShzYy0+Ym1pc3Njb3VudCAhPSAwKSkgewotCQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX0JFQUNPTiwKKwlpZiAodW5saWtlbHkoYWgtPmJtaXNzY291bnQgIT0gMCkpIHsKKwkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19CRUFDT04sCiAJCQkicmVzdW1lIGJlYWNvbiB4bWl0IGFmdGVyICV1IG1pc3Nlc1xuIiwKLQkJCXNjLT5ibWlzc2NvdW50KTsKLQkJc2MtPmJtaXNzY291bnQgPSAwOworCQkJYWgtPmJtaXNzY291bnQpOworCQlhaC0+Ym1pc3Njb3VudCA9IDA7CiAJfQogCi0JaWYgKChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQICYmIHNjLT5udW1fYXBfdmlmcyA+IDEpIHx8Ci0JCQlzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpIHsKKwlpZiAoKGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYgYWgtPm51bV9hcF92aWZzID4gMSkgfHwKKwkJCWFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkgewogCQl1NjQgdHNmID0gYXRoNWtfaHdfZ2V0X3RzZjY0KGFoKTsKIAkJdTMyIHRzZnR1ID0gVFNGX1RPX1RVKHRzZik7Ci0JCWludCBzbG90ID0gKCh0c2Z0dSAlIHNjLT5iaW50dmFsKSAqIEFUSF9CQ0JVRikgLyBzYy0+YmludHZhbDsKLQkJdmlmID0gc2MtPmJzbG90WyhzbG90ICsgMSkgJSBBVEhfQkNCVUZdOwotCQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX0JFQUNPTiwKKwkJaW50IHNsb3QgPSAoKHRzZnR1ICUgYWgtPmJpbnR2YWwpICogQVRIX0JDQlVGKSAvIGFoLT5iaW50dmFsOworCQl2aWYgPSBhaC0+YnNsb3RbKHNsb3QgKyAxKSAlIEFUSF9CQ0JVRl07CisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfQkVBQ09OLAogCQkJInRzZiAlbGx4IHRzZnR1ICV4IGludHZhbCAldSBzbG90ICV1IHZpZiAlcFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdHNmLCB0c2Z0dSwgc2MtPmJpbnR2YWwsIHNsb3QsIHZpZik7CisJCQkodW5zaWduZWQgbG9uZyBsb25nKXRzZiwgdHNmdHUsIGFoLT5iaW50dmFsLCBzbG90LCB2aWYpOwogCX0gZWxzZSAvKiBvbmx5IG9uZSBpbnRlcmZhY2UgKi8KLQkJdmlmID0gc2MtPmJzbG90WzBdOworCQl2aWYgPSBhaC0+YnNsb3RbMF07CiAKIAlpZiAoIXZpZikKIAkJcmV0dXJuOwogCiAJYXZmID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwogCWJmID0gYXZmLT5iYnVmOwotCWlmICh1bmxpa2VseShiZi0+c2tiID09IE5VTEwgfHwgc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8Ci0JCQlzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpKSB7Ci0JCUFUSDVLX1dBUk4oc2MsICJiZj0lcCBiZl9za2I9JXBcbiIsIGJmLCBiZiA/IGJmLT5za2IgOiBOVUxMKTsKKwlpZiAodW5saWtlbHkoYmYtPnNrYiA9PSBOVUxMIHx8IGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAorCQkgICAgIGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikpIHsKKwkJQVRINUtfV0FSTihhaCwgImJmPSVwIGJmX3NrYj0lcFxuIiwgYmYsIGJmID8gYmYtPnNrYiA6IE5VTEwpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xOTA4LDM2ICsxODk5LDQwIEBACiAJICogVGhpcyBzaG91bGQgbmV2ZXIgZmFpbCBzaW5jZSB3ZSBjaGVjayBhYm92ZSB0aGF0IG5vIGZyYW1lcwogCSAqIGFyZSBzdGlsbCBwZW5kaW5nIG9uIHRoZSBxdWV1ZS4KIAkgKi8KLQlpZiAodW5saWtlbHkoYXRoNWtfaHdfc3RvcF9iZWFjb25fcXVldWUoYWgsIHNjLT5iaGFscSkpKSB7Ci0JCUFUSDVLX1dBUk4oc2MsICJiZWFjb24gcXVldWUgJXUgZGlkbid0IHN0YXJ0L3N0b3AgP1xuIiwgc2MtPmJoYWxxKTsKKwlpZiAodW5saWtlbHkoYXRoNWtfaHdfc3RvcF9iZWFjb25fcXVldWUoYWgsIGFoLT5iaGFscSkpKSB7CisJCUFUSDVLX1dBUk4oYWgsICJiZWFjb24gcXVldWUgJXUgZGlkbid0IHN0YXJ0L3N0b3AgP1xuIiwgYWgtPmJoYWxxKTsKIAkJLyogTkI6IGh3IHN0aWxsIHN0b3BzIERNQSwgc28gcHJvY2VlZCAqLwogCX0KIAogCS8qIHJlZnJlc2ggdGhlIGJlYWNvbiBmb3IgQVAgb3IgTUVTSCBtb2RlICovCi0JaWYgKHNjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKLQkJCXNjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkKLQkJYXRoNWtfYmVhY29uX3VwZGF0ZShzYy0+aHcsIHZpZik7CisJaWYgKGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkgICAgYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKQorCQlhdGg1a19iZWFjb25fdXBkYXRlKGFoLT5odywgdmlmKTsKIAotCXRyYWNlX2F0aDVrX3R4KHNjLCBiZi0+c2tiLCAmc2MtPnR4cXNbc2MtPmJoYWxxXSk7CisJdHJhY2VfYXRoNWtfdHgoYWgsIGJmLT5za2IsICZhaC0+dHhxc1thaC0+YmhhbHFdKTsKIAotCWF0aDVrX2h3X3NldF90eGRwKGFoLCBzYy0+YmhhbHEsIGJmLT5kYWRkcik7Ci0JYXRoNWtfaHdfc3RhcnRfdHhfZG1hKGFoLCBzYy0+YmhhbHEpOwotCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfQkVBQ09OLCAiVFhEUFsldV0gPSAlbGx4ICglcClcbiIsCi0JCXNjLT5iaGFscSwgKHVuc2lnbmVkIGxvbmcgbG9uZyliZi0+ZGFkZHIsIGJmLT5kZXNjKTsKKwlhdGg1a19od19zZXRfdHhkcChhaCwgYWgtPmJoYWxxLCBiZi0+ZGFkZHIpOworCWF0aDVrX2h3X3N0YXJ0X3R4X2RtYShhaCwgYWgtPmJoYWxxKTsKKwlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0JFQUNPTiwgIlRYRFBbJXVdID0gJWxseCAoJXApXG4iLAorCQlhaC0+YmhhbHEsICh1bnNpZ25lZCBsb25nIGxvbmcpYmYtPmRhZGRyLCBiZi0+ZGVzYyk7CiAKLQlza2IgPSBpZWVlODAyMTFfZ2V0X2J1ZmZlcmVkX2JjKHNjLT5odywgdmlmKTsKKwlza2IgPSBpZWVlODAyMTFfZ2V0X2J1ZmZlcmVkX2JjKGFoLT5odywgdmlmKTsKIAl3aGlsZSAoc2tiKSB7Ci0JCWF0aDVrX3R4X3F1ZXVlKHNjLT5odywgc2tiLCBzYy0+Y2FicSk7Ci0JCXNrYiA9IGllZWU4MDIxMV9nZXRfYnVmZmVyZWRfYmMoc2MtPmh3LCB2aWYpOworCQlhdGg1a190eF9xdWV1ZShhaC0+aHcsIHNrYiwgYWgtPmNhYnEpOworCisJCWlmIChhaC0+Y2FicS0+dHhxX2xlbiA+PSBhaC0+Y2FicS0+dHhxX21heCkKKwkJCWJyZWFrOworCisJCXNrYiA9IGllZWU4MDIxMV9nZXRfYnVmZmVyZWRfYmMoYWgtPmh3LCB2aWYpOwogCX0KIAotCXNjLT5ic2VudCsrOworCWFoLT5ic2VudCsrOwogfQogCiAvKioKICAqIGF0aDVrX2JlYWNvbl91cGRhdGVfdGltZXJzIC0gdXBkYXRlIGJlYWNvbiB0aW1lcnMKICAqCi0gKiBAc2M6IHN0cnVjdCBhdGg1a19zb2Z0YyBwb2ludGVyIHdlIGFyZSBvcGVyYXRpbmcgb24KKyAqIEBhaDogc3RydWN0IGF0aDVrX2h3IHBvaW50ZXIgd2UgYXJlIG9wZXJhdGluZyBvbgogICogQGJjX3RzZjogdGhlIHRpbWVzdGFtcCBvZiB0aGUgYmVhY29uLiAwIHRvIHJlc2V0IHRoZSBUU0YuIC0xIHRvIHBlcmZvcm0gYQogICogICAgICAgICAgYmVhY29uIHRpbWVyIHVwZGF0ZSBiYXNlZCBvbiB0aGUgY3VycmVudCBIVyBUU0YuCiAgKgpAQCAtMTk1MSwxNyArMTk0NiwxNiBAQAogICogZnVuY3Rpb24gdG8gaGF2ZSBpdCBhbGwgdG9nZXRoZXIgaW4gb25lIHBsYWNlLgogICovCiB2b2lkCi1hdGg1a19iZWFjb25fdXBkYXRlX3RpbWVycyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCB1NjQgYmNfdHNmKQorYXRoNWtfYmVhY29uX3VwZGF0ZV90aW1lcnMoc3RydWN0IGF0aDVrX2h3ICphaCwgdTY0IGJjX3RzZikKIHsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOwogCXUzMiBuZXh0dGJ0dCwgaW50dmFsLCBod190dSwgYmNfdHU7CiAJdTY0IGh3X3RzZjsKIAotCWludHZhbCA9IHNjLT5iaW50dmFsICYgQVI1S19CRUFDT05fUEVSSU9EOwotCWlmIChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQICYmIHNjLT5udW1fYXBfdmlmcyA+IDEpIHsKKwlpbnR2YWwgPSBhaC0+YmludHZhbCAmIEFSNUtfQkVBQ09OX1BFUklPRDsKKwlpZiAoYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCAmJiBhaC0+bnVtX2FwX3ZpZnMgPiAxKSB7CiAJCWludHZhbCAvPSBBVEhfQkNCVUY7CS8qIHN0YWdnZXJlZCBtdWx0aS1ic3MgYmVhY29ucyAqLwogCQlpZiAoaW50dmFsIDwgMTUpCi0JCQlBVEg1S19XQVJOKHNjLCAiaW50dmFsICV1IGlzIHRvbyBsb3csIG1pbiAxNVxuIiwKKwkJCUFUSDVLX1dBUk4oYWgsICJpbnR2YWwgJXUgaXMgdG9vIGxvdywgbWluIDE1XG4iLAogCQkJCSAgIGludHZhbCk7CiAJfQogCWlmIChXQVJOX09OKCFpbnR2YWwpKQpAQCAtMTk3NCw3ICsxOTY4LDcgQEAKIAlod190c2YgPSBhdGg1a19od19nZXRfdHNmNjQoYWgpOwogCWh3X3R1ID0gVFNGX1RPX1RVKGh3X3RzZik7CiAKLSNkZWZpbmUgRlVER0UgQVI1S19UVU5FX1NXX0JFQUNPTl9SRVNQICsgMworI2RlZmluZSBGVURHRSAoQVI1S19UVU5FX1NXX0JFQUNPTl9SRVNQICsgMykKIAkvKiBXZSB1c2UgRlVER0UgdG8gbWFrZSBzdXJlIHRoZSBuZXh0IFRCVFQgaXMgYWhlYWQgb2YgdGhlIGN1cnJlbnQgVFUuCiAJICogU2luY2Ugd2UgbGF0ZXIgc3VidHJhY3QgQVI1S19UVU5FX1NXX0JFQUNPTl9SRVNQICgxMCkgaW4gdGhlIHRpbWVyCiAJICogY29uZmlndXJhdGlvbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBiaWdnZXIgdGhhbiB0aGF0LiAqLwpAQCAtMjAwMCw3ICsxOTk0LDcgQEAKIAkJICogYXV0b21hdGljYWxseSB1cGRhdGUgdGhlIFRTRiBhbmQgdGhlbiB3ZSBuZWVkIHRvIHJlY29uZmlndXJlCiAJCSAqIHRoZSB0aW1lcnMuCiAJCSAqLwotCQlBVEg1S19EQkdfVU5MSU1JVChzYywgQVRINUtfREVCVUdfQkVBQ09OLAorCQlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQkVBQ09OLAogCQkJIm5lZWQgdG8gd2FpdCBmb3IgSFcgVFNGIHN5bmNcbiIpOwogCQlyZXR1cm47CiAJfSBlbHNlIHsKQEAgLTIwMTUsNyArMjAwOSw3IEBACiAJfQogI3VuZGVmIEZVREdFCiAKLQlzYy0+bmV4dHRidHQgPSBuZXh0dGJ0dDsKKwlhaC0+bmV4dHRidHQgPSBuZXh0dGJ0dDsKIAogCWludHZhbCB8PSBBUjVLX0JFQUNPTl9FTkE7CiAJYXRoNWtfaHdfaW5pdF9iZWFjb24oYWgsIG5leHR0YnR0LCBpbnR2YWwpOwpAQCAtMjAyNSwyMCArMjAxOSwyMCBAQAogCSAqIG9mIHRoaXMgZnVuY3Rpb24KIAkgKi8KIAlpZiAoYmNfdHNmID09IC0xKQotCQlBVEg1S19EQkdfVU5MSU1JVChzYywgQVRINUtfREVCVUdfQkVBQ09OLAorCQlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQkVBQ09OLAogCQkJInJlY29uZmlndXJlZCB0aW1lcnMgYmFzZWQgb24gSFcgVFNGXG4iKTsKIAllbHNlIGlmIChiY190c2YgPT0gMCkKLQkJQVRINUtfREJHX1VOTElNSVQoc2MsIEFUSDVLX0RFQlVHX0JFQUNPTiwKKwkJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0JFQUNPTiwKIAkJCSJyZXNldCBIVyBUU0YgYW5kIHRpbWVyc1xuIik7CiAJZWxzZQotCQlBVEg1S19EQkdfVU5MSU1JVChzYywgQVRINUtfREVCVUdfQkVBQ09OLAorCQlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQkVBQ09OLAogCQkJInVwZGF0ZWQgdGltZXJzIGJhc2VkIG9uIGJlYWNvbiBUU0ZcbiIpOwogCi0JQVRINUtfREJHX1VOTElNSVQoc2MsIEFUSDVLX0RFQlVHX0JFQUNPTiwKKwlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQkVBQ09OLAogCQkJICAiYmNfdHNmICVsbHggaHdfdHNmICVsbHggYmNfdHUgJXUgaHdfdHUgJXUgbmV4dHRidHQgJXVcbiIsCiAJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJjX3RzZiwKIAkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgaHdfdHNmLCBiY190dSwgaHdfdHUsIG5leHR0YnR0KTsKLQlBVEg1S19EQkdfVU5MSU1JVChzYywgQVRINUtfREVCVUdfQkVBQ09OLCAiaW50dmFsICV1ICVzICVzXG4iLAorCUFUSDVLX0RCR19VTkxJTUlUKGFoLCBBVEg1S19ERUJVR19CRUFDT04sICJpbnR2YWwgJXUgJXMgJXNcbiIsCiAJCWludHZhbCAmIEFSNUtfQkVBQ09OX1BFUklPRCwKIAkJaW50dmFsICYgQVI1S19CRUFDT05fRU5BID8gIkFSNUtfQkVBQ09OX0VOQSIgOiAiIiwKIAkJaW50dmFsICYgQVI1S19CRUFDT05fUkVTRVRfVFNGID8gIkFSNUtfQkVBQ09OX1JFU0VUX1RTRiIgOiAiIik7CkBAIC0yMDQ3LDIyICsyMDQxLDIxIEBACiAvKioKICAqIGF0aDVrX2JlYWNvbl9jb25maWcgLSBDb25maWd1cmUgdGhlIGJlYWNvbiBxdWV1ZXMgYW5kIGludGVycnVwdHMKICAqCi0gKiBAc2M6IHN0cnVjdCBhdGg1a19zb2Z0YyBwb2ludGVyIHdlIGFyZSBvcGVyYXRpbmcgb24KKyAqIEBhaDogc3RydWN0IGF0aDVrX2h3IHBvaW50ZXIgd2UgYXJlIG9wZXJhdGluZyBvbgogICoKICAqIEluIElCU1MgbW9kZSB3ZSB1c2UgYSBzZWxmLWxpbmtlZCB0eCBkZXNjcmlwdG9yIGlmIHBvc3NpYmxlLiBXZSBlbmFibGUgU1dCQQogICogaW50ZXJydXB0cyB0byBkZXRlY3QgVFNGIHVwZGF0ZXMgb25seS4KICAqLwogdm9pZAotYXRoNWtfYmVhY29uX2NvbmZpZyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQorYXRoNWtfYmVhY29uX2NvbmZpZyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+YmxvY2ssIGZsYWdzKTsKLQlzYy0+Ym1pc3Njb3VudCA9IDA7Ci0Jc2MtPmltYXNrICY9IH4oQVI1S19JTlRfQk1JU1MgfCBBUjVLX0lOVF9TV0JBKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWgtPmJsb2NrLCBmbGFncyk7CisJYWgtPmJtaXNzY291bnQgPSAwOworCWFoLT5pbWFzayAmPSB+KEFSNUtfSU5UX0JNSVNTIHwgQVI1S19JTlRfU1dCQSk7CiAKLQlpZiAoc2MtPmVuYWJsZV9iZWFjb24pIHsKKwlpZiAoYWgtPmVuYWJsZV9iZWFjb24pIHsKIAkJLyoKIAkJICogSW4gSUJTUyBtb2RlIHdlIHVzZSBhIHNlbGYtbGlua2VkIHR4IGRlc2NyaXB0b3IgYW5kIGxldCB0aGUKIAkJICogaGFyZHdhcmUgc2VuZCB0aGUgYmVhY29ucyBhdXRvbWF0aWNhbGx5LiBXZSBoYXZlIHRvIGxvYWQgaXQKQEAgLTIwNzAsNTAgKzIwNjMsNTAgQEAKIAkJICogV2UgdXNlIHRoZSBTV0JBIGludGVycnVwdCBvbmx5IHRvIGtlZXAgdHJhY2sgb2YgdGhlIGJlYWNvbgogCQkgKiB0aW1lcnMgaW4gb3JkZXIgdG8gZGV0ZWN0IGF1dG9tYXRpYyBUU0YgdXBkYXRlcy4KIAkJICovCi0JCWF0aDVrX2JlYWNvbnFfY29uZmlnKHNjKTsKKwkJYXRoNWtfYmVhY29ucV9jb25maWcoYWgpOwogCi0JCXNjLT5pbWFzayB8PSBBUjVLX0lOVF9TV0JBOworCQlhaC0+aW1hc2sgfD0gQVI1S19JTlRfU1dCQTsKIAotCQlpZiAoc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCQlpZiAoYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQkJaWYgKGF0aDVrX2h3X2hhc3Zlb2woYWgpKQotCQkJCWF0aDVrX2JlYWNvbl9zZW5kKHNjKTsKKwkJCQlhdGg1a19iZWFjb25fc2VuZChhaCk7CiAJCX0gZWxzZQotCQkJYXRoNWtfYmVhY29uX3VwZGF0ZV90aW1lcnMoc2MsIC0xKTsKKwkJCWF0aDVrX2JlYWNvbl91cGRhdGVfdGltZXJzKGFoLCAtMSk7CiAJfSBlbHNlIHsKLQkJYXRoNWtfaHdfc3RvcF9iZWFjb25fcXVldWUoc2MtPmFoLCBzYy0+YmhhbHEpOworCQlhdGg1a19od19zdG9wX2JlYWNvbl9xdWV1ZShhaCwgYWgtPmJoYWxxKTsKIAl9CiAKLQlhdGg1a19od19zZXRfaW1yKGFoLCBzYy0+aW1hc2spOworCWF0aDVrX2h3X3NldF9pbXIoYWgsIGFoLT5pbWFzayk7CiAJbW1pb3diKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmJsb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWgtPmJsb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDVrX3Rhc2tsZXRfYmVhY29uKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gKHN0cnVjdCBhdGg1a19zb2Z0YyAqKSBkYXRhOworCXN0cnVjdCBhdGg1a19odyAqYWggPSAoc3RydWN0IGF0aDVrX2h3ICopIGRhdGE7CiAKIAkvKgogCSAqIFNvZnR3YXJlIGJlYWNvbiBhbGVydC0tdGltZSB0byBzZW5kIGEgYmVhY29uLgogCSAqCiAJICogSW4gSUJTUyBtb2RlIHdlIHVzZSB0aGlzIGludGVycnVwdCBqdXN0IHRvCiAJICoga2VlcCB0cmFjayBvZiB0aGUgbmV4dCBUQlRUICh0YXJnZXQgYmVhY29uCi0JICogdHJhbnNtaXNzaW9uIHRpbWUpIGluIG9yZGVyIHRvIGRldGVjdCB3ZXRoZXIKKwkgKiB0cmFuc21pc3Npb24gdGltZSkgaW4gb3JkZXIgdG8gZGV0ZWN0IHdoZXRoZXIKIAkgKiBhdXRvbWF0aWMgVFNGIHVwZGF0ZXMgaGFwcGVuZWQuCiAJICovCi0JaWYgKHNjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKLQkJLyogWFhYOiBvbmx5IGlmIFZFT0wgc3VwcHBvcnRlZCAqLwotCQl1NjQgdHNmID0gYXRoNWtfaHdfZ2V0X3RzZjY0KHNjLT5haCk7Ci0JCXNjLT5uZXh0dGJ0dCArPSBzYy0+YmludHZhbDsKLQkJQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19CRUFDT04sCisJaWYgKGFoLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKKwkJLyogWFhYOiBvbmx5IGlmIFZFT0wgc3VwcG9ydGVkICovCisJCXU2NCB0c2YgPSBhdGg1a19od19nZXRfdHNmNjQoYWgpOworCQlhaC0+bmV4dHRidHQgKz0gYWgtPmJpbnR2YWw7CisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfQkVBQ09OLAogCQkJCSJTV0JBIG5leHR0YnR0OiAleCBod190dTogJXggIgogCQkJCSJUU0Y6ICVsbHhcbiIsCi0JCQkJc2MtPm5leHR0YnR0LAorCQkJCWFoLT5uZXh0dGJ0dCwKIAkJCQlUU0ZfVE9fVFUodHNmKSwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKSB0c2YpOwogCX0gZWxzZSB7Ci0JCXNwaW5fbG9jaygmc2MtPmJsb2NrKTsKLQkJYXRoNWtfYmVhY29uX3NlbmQoc2MpOwotCQlzcGluX3VubG9jaygmc2MtPmJsb2NrKTsKKwkJc3Bpbl9sb2NrKCZhaC0+YmxvY2spOworCQlhdGg1a19iZWFjb25fc2VuZChhaCk7CisJCXNwaW5fdW5sb2NrKCZhaC0+YmxvY2spOwogCX0KIH0KIApAQCAtMjEzMCwxMiArMjEyMywxMiBAQAogCQkvKiBydW4gQU5JIG9ubHkgd2hlbiBmdWxsIGNhbGlicmF0aW9uIGlzIG5vdCBhY3RpdmUgKi8KIAkJYWgtPmFoX2NhbF9uZXh0X2FuaSA9IGppZmZpZXMgKwogCQkJbXNlY3NfdG9famlmZmllcyhBVEg1S19UVU5FX0NBTElCUkFUSU9OX0lOVEVSVkFMX0FOSSk7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJmFoLT5haF9zYy0+YW5pX3Rhc2tsZXQpOworCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+YW5pX3Rhc2tsZXQpOwogCiAJfSBlbHNlIGlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGFoLT5haF9jYWxfbmV4dF9mdWxsKSkgewogCQlhaC0+YWhfY2FsX25leHRfZnVsbCA9IGppZmZpZXMgKwogCQkJbXNlY3NfdG9famlmZmllcyhBVEg1S19UVU5FX0NBTElCUkFUSU9OX0lOVEVSVkFMX0ZVTEwpOwotCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+YWhfc2MtPmNhbGliKTsKKwkJdGFza2xldF9zY2hlZHVsZSgmYWgtPmNhbGliKTsKIAl9CiAJLyogd2UgY291bGQgdXNlIFNXSSB0byBnZW5lcmF0ZSBlbm91Z2ggaW50ZXJydXB0cyB0byBtZWV0IG91cgogCSAqIGNhbGlicmF0aW9uIGludGVydmFsIHJlcXVpcmVtZW50cywgaWYgbmVjZXNzYXJ5OgpAQCAtMjE0Myw0NCArMjEzNiw0MyBAQAogfQogCiBzdGF0aWMgdm9pZAotYXRoNWtfc2NoZWR1bGVfcngoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK2F0aDVrX3NjaGVkdWxlX3J4KHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0Jc2MtPnJ4X3BlbmRpbmcgPSB0cnVlOwotCXRhc2tsZXRfc2NoZWR1bGUoJnNjLT5yeHRxKTsKKwlhaC0+cnhfcGVuZGluZyA9IHRydWU7CisJdGFza2xldF9zY2hlZHVsZSgmYWgtPnJ4dHEpOwogfQogCiBzdGF0aWMgdm9pZAotYXRoNWtfc2NoZWR1bGVfdHgoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK2F0aDVrX3NjaGVkdWxlX3R4KHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0Jc2MtPnR4X3BlbmRpbmcgPSB0cnVlOwotCXRhc2tsZXRfc2NoZWR1bGUoJnNjLT50eHRxKTsKKwlhaC0+dHhfcGVuZGluZyA9IHRydWU7CisJdGFza2xldF9zY2hlZHVsZSgmYWgtPnR4dHEpOwogfQogCi1pcnFyZXR1cm5fdAorc3RhdGljIGlycXJldHVybl90CiBhdGg1a19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZGV2X2lkOwotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGRldl9pZDsKIAllbnVtIGF0aDVrX2ludCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IGNvdW50ZXIgPSAxMDAwOwogCi0JaWYgKHVubGlrZWx5KHRlc3RfYml0KEFUSF9TVEFUX0lOVkFMSUQsIHNjLT5zdGF0dXMpIHx8CisJaWYgKHVubGlrZWx5KHRlc3RfYml0KEFUSF9TVEFUX0lOVkFMSUQsIGFoLT5zdGF0dXMpIHx8CiAJCSgoYXRoNWtfZ2V0X2J1c190eXBlKGFoKSAhPSBBVEhfQUhCKSAmJgogCQkJCSFhdGg1a19od19pc19pbnRyX3BlbmRpbmcoYWgpKSkpCiAJCXJldHVybiBJUlFfTk9ORTsKIAogCWRvIHsKIAkJYXRoNWtfaHdfZ2V0X2lzcihhaCwgJnN0YXR1cyk7CQkvKiBOQjogY2xlYXJzIElSUSB0b28gKi8KLQkJQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19JTlRSLCAic3RhdHVzIDB4JXgvMHgleFxuIiwKLQkJCQlzdGF0dXMsIHNjLT5pbWFzayk7CisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfSU5UUiwgInN0YXR1cyAweCV4LzB4JXhcbiIsCisJCQkJc3RhdHVzLCBhaC0+aW1hc2spOwogCQlpZiAodW5saWtlbHkoc3RhdHVzICYgQVI1S19JTlRfRkFUQUwpKSB7CiAJCQkvKgogCQkJICogRmF0YWwgZXJyb3JzIGFyZSB1bnJlY292ZXJhYmxlLgogCQkJICogVHlwaWNhbGx5IHRoZXNlIGFyZSBjYXVzZWQgYnkgRE1BIGVycm9ycy4KIAkJCSAqLwotCQkJQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19SRVNFVCwKKwkJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsCiAJCQkJICAiZmF0YWwgaW50LCByZXNldHRpbmdcbiIpOwotCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoc2MtPmh3LCAmc2MtPnJlc2V0X3dvcmspOworCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoYWgtPmh3LCAmYWgtPnJlc2V0X3dvcmspOwogCQl9IGVsc2UgaWYgKHVubGlrZWx5KHN0YXR1cyAmIEFSNUtfSU5UX1JYT1JOKSkgewogCQkJLyoKIAkJCSAqIFJlY2VpdmUgYnVmZmVycyBhcmUgZnVsbC4gRWl0aGVyIHRoZSBidXMgaXMgYnVzeSBvcgpAQCAtMjE5MSw0NSArMjE4Myw0NCBAQAogCQkJICogV2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoaWNoIHZlcnNpb25zIG5lZWQgYSByZXNldCAtCiAJCQkgKiB0aGlzIGd1ZXNzIGlzIGNvcGllZCBmcm9tIHRoZSBIQUwuCiAJCQkgKi8KLQkJCXNjLT5zdGF0cy5yeG9ybl9pbnRyKys7CisJCQlhaC0+c3RhdHMucnhvcm5faW50cisrOwogCQkJaWYgKGFoLT5haF9tYWNfc3JldiA8IEFSNUtfU1JFVl9BUjUyMTIpIHsKLQkJCQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX1JFU0VULAorCQkJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsCiAJCQkJCSAgInJ4IG92ZXJydW4sIHJlc2V0dGluZ1xuIik7Ci0JCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoc2MtPmh3LCAmc2MtPnJlc2V0X3dvcmspOwotCQkJfQotCQkJZWxzZQotCQkJCWF0aDVrX3NjaGVkdWxlX3J4KHNjKTsKKwkJCQlpZWVlODAyMTFfcXVldWVfd29yayhhaC0+aHcsICZhaC0+cmVzZXRfd29yayk7CisJCQl9IGVsc2UKKwkJCQlhdGg1a19zY2hlZHVsZV9yeChhaCk7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfU1dCQSkgewotCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnNjLT5iZWFjb250cSk7Ci0JCQl9CisJCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfU1dCQSkKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZhaC0+YmVhY29udHEpOworCiAJCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfUlhFT0wpIHsKIAkJCQkvKgogCQkJCSogTkI6IHRoZSBoYXJkd2FyZSBzaG91bGQgcmUtcmVhZCB0aGUgbGluayB3aGVuCiAJCQkJKiAgICAgUlhFIGJpdCBpcyB3cml0dGVuLCBidXQgaXQgZG9lc24ndCB3b3JrIGF0CiAJCQkJKiAgICAgbGVhc3Qgb24gb2xkZXIgaGFyZHdhcmUgcmV2cy4KIAkJCQkqLwotCQkJCXNjLT5zdGF0cy5yeGVvbF9pbnRyKys7CisJCQkJYWgtPnN0YXRzLnJ4ZW9sX2ludHIrKzsKIAkJCX0KIAkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9UWFVSTikgewogCQkJCS8qIGJ1bXAgdHggdHJpZ2dlciBsZXZlbCAqLwogCQkJCWF0aDVrX2h3X3VwZGF0ZV90eF90cmlnbGV2ZWwoYWgsIHRydWUpOwogCQkJfQogCQkJaWYgKHN0YXR1cyAmIChBUjVLX0lOVF9SWE9LIHwgQVI1S19JTlRfUlhFUlIpKQotCQkJCWF0aDVrX3NjaGVkdWxlX3J4KHNjKTsKKwkJCQlhdGg1a19zY2hlZHVsZV9yeChhaCk7CiAJCQlpZiAoc3RhdHVzICYgKEFSNUtfSU5UX1RYT0sgfCBBUjVLX0lOVF9UWERFU0MKIAkJCQkJfCBBUjVLX0lOVF9UWEVSUiB8IEFSNUtfSU5UX1RYRU9MKSkKLQkJCQlhdGg1a19zY2hlZHVsZV90eChzYyk7CisJCQkJYXRoNWtfc2NoZWR1bGVfdHgoYWgpOwogCQkJaWYgKHN0YXR1cyAmIEFSNUtfSU5UX0JNSVNTKSB7CiAJCQkJLyogVE9ETyAqLwogCQkJfQogCQkJaWYgKHN0YXR1cyAmIEFSNUtfSU5UX01JQikgewotCQkJCXNjLT5zdGF0cy5taWJfaW50cisrOworCQkJCWFoLT5zdGF0cy5taWJfaW50cisrOwogCQkJCWF0aDVrX2h3X3VwZGF0ZV9taWJfY291bnRlcnMoYWgpOwogCQkJCWF0aDVrX2FuaV9taWJfaW50cihhaCk7CiAJCQl9CiAJCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfR1BJTykKLQkJCQl0YXNrbGV0X3NjaGVkdWxlKCZzYy0+cmZfa2lsbC50b2dnbGVxKTsKKwkJCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+cmZfa2lsbC50b2dnbGVxKTsKIAogCQl9CiAKQEAgLTIyMzgsMTEgKzIyMjksMTEgQEAKIAogCX0gd2hpbGUgKGF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhhaCkgJiYgLS1jb3VudGVyID4gMCk7CiAKLQlpZiAoc2MtPnJ4X3BlbmRpbmcgfHwgc2MtPnR4X3BlbmRpbmcpCi0JCWF0aDVrX3NldF9jdXJyZW50X2ltYXNrKHNjKTsKKwlpZiAoYWgtPnJ4X3BlbmRpbmcgfHwgYWgtPnR4X3BlbmRpbmcpCisJCWF0aDVrX3NldF9jdXJyZW50X2ltYXNrKGFoKTsKIAogCWlmICh1bmxpa2VseSghY291bnRlcikpCi0JCUFUSDVLX1dBUk4oc2MsICJ0b28gbWFueSBpbnRlcnJ1cHRzLCBnaXZpbmcgdXAgZm9yIG5vd1xuIik7CisJCUFUSDVLX1dBUk4oYWgsICJ0b28gbWFueSBpbnRlcnJ1cHRzLCBnaXZpbmcgdXAgZm9yIG5vd1xuIik7CiAKIAlhdGg1a19pbnRyX2NhbGlicmF0aW9uX3BvbGwoYWgpOwogCkBAIC0yMjU2LDI4ICsyMjQ3LDI3IEBACiBzdGF0aWMgdm9pZAogYXRoNWtfdGFza2xldF9jYWxpYnJhdGUodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSAodm9pZCAqKWRhdGE7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gKHZvaWQgKilkYXRhOwogCiAJLyogT25seSBmdWxsIGNhbGlicmF0aW9uIGZvciBub3cgKi8KIAlhaC0+YWhfY2FsX21hc2sgfD0gQVI1S19DQUxJQlJBVElPTl9GVUxMOwogCi0JQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsICJjaGFubmVsICV1LyV4XG4iLAotCQlpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoc2MtPmN1cmNoYW4tPmNlbnRlcl9mcmVxKSwKLQkJc2MtPmN1cmNoYW4tPmh3X3ZhbHVlKTsKKwlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0NBTElCUkFURSwgImNoYW5uZWwgJXUvJXhcbiIsCisJCWllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChhaC0+Y3VyY2hhbi0+Y2VudGVyX2ZyZXEpLAorCQlhaC0+Y3VyY2hhbi0+aHdfdmFsdWUpOwogCiAJaWYgKGF0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZShhaCkgPT0gQVI1S19SRkdBSU5fTkVFRF9DSEFOR0UpIHsKIAkJLyoKIAkJICogUmZnYWluIGlzIG91dCBvZiBib3VuZHMsIHJlc2V0IHRoZSBjaGlwCiAJCSAqIHRvIGxvYWQgbmV3IGdhaW4gdmFsdWVzLgogCQkgKi8KLQkJQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19SRVNFVCwgImNhbGlicmF0aW9uLCByZXNldHRpbmdcbiIpOwotCQlpZWVlODAyMTFfcXVldWVfd29yayhzYy0+aHcsICZzYy0+cmVzZXRfd29yayk7CisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsICJjYWxpYnJhdGlvbiwgcmVzZXR0aW5nXG4iKTsKKwkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoYWgtPmh3LCAmYWgtPnJlc2V0X3dvcmspOwogCX0KLQlpZiAoYXRoNWtfaHdfcGh5X2NhbGlicmF0ZShhaCwgc2MtPmN1cmNoYW4pKQotCQlBVEg1S19FUlIoc2MsICJjYWxpYnJhdGlvbiBvZiBjaGFubmVsICV1IGZhaWxlZFxuIiwKKwlpZiAoYXRoNWtfaHdfcGh5X2NhbGlicmF0ZShhaCwgYWgtPmN1cmNoYW4pKQorCQlBVEg1S19FUlIoYWgsICJjYWxpYnJhdGlvbiBvZiBjaGFubmVsICV1IGZhaWxlZFxuIiwKIAkJCWllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbCgKLQkJCQlzYy0+Y3VyY2hhbi0+Y2VudGVyX2ZyZXEpKTsKKwkJCQlhaC0+Y3VyY2hhbi0+Y2VudGVyX2ZyZXEpKTsKIAogCS8qIE5vaXNlIGZsb29yIGNhbGlicmF0aW9uIGludGVycnVwdHMgcngvdHggcGF0aCB3aGlsZSBJL1EgY2FsaWJyYXRpb24KIAkgKiBkb2Vzbid0LgpAQCAtMjI5Niw4ICsyMjg2LDcgQEAKIHN0YXRpYyB2b2lkCiBhdGg1a190YXNrbGV0X2FuaSh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9ICh2b2lkICopZGF0YTsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCXN0cnVjdCBhdGg1a19odyAqYWggPSAodm9pZCAqKWRhdGE7CiAKIAlhaC0+YWhfY2FsX21hc2sgfD0gQVI1S19DQUxJQlJBVElPTl9BTkk7CiAJYXRoNWtfYW5pX2NhbGlicmF0aW9uKGFoKTsKQEAgLTIzMDgsMjEgKzIyOTcsMjEgQEAKIHN0YXRpYyB2b2lkCiBhdGg1a190eF9jb21wbGV0ZV9wb2xsX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0aDVrX3NvZnRjLAorCXN0cnVjdCBhdGg1a19odyAqYWggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0aDVrX2h3LAogCQkJdHhfY29tcGxldGVfd29yay53b3JrKTsKIAlzdHJ1Y3QgYXRoNWtfdHhxICp0eHE7CiAJaW50IGk7CiAJYm9vbCBuZWVkcmVzZXQgPSBmYWxzZTsKIAotCW11dGV4X2xvY2soJnNjLT5sb2NrKTsKKwltdXRleF9sb2NrKCZhaC0+bG9jayk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzYy0+dHhxcyk7IGkrKykgewotCQlpZiAoc2MtPnR4cXNbaV0uc2V0dXApIHsKLQkJCXR4cSA9ICZzYy0+dHhxc1tpXTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhaC0+dHhxcyk7IGkrKykgeworCQlpZiAoYWgtPnR4cXNbaV0uc2V0dXApIHsKKwkJCXR4cSA9ICZhaC0+dHhxc1tpXTsKIAkJCXNwaW5fbG9ja19iaCgmdHhxLT5sb2NrKTsKIAkJCWlmICh0eHEtPnR4cV9sZW4gPiAxKSB7CiAJCQkJaWYgKHR4cS0+dHhxX3BvbGxfbWFyaykgewotCQkJCQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX1hNSVQsCisJCQkJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfWE1JVCwKIAkJCQkJCSAgIlRYIHF1ZXVlIHN0dWNrICVkXG4iLAogCQkJCQkJICB0eHEtPnFudW0pOwogCQkJCQluZWVkcmVzZXQgPSB0cnVlOwpAQCAtMjMzOCwxNCArMjMyNywxNCBAQAogCX0KIAogCWlmIChuZWVkcmVzZXQpIHsKLQkJQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19SRVNFVCwKKwkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19SRVNFVCwKIAkJCSAgIlRYIHF1ZXVlcyBzdHVjaywgcmVzZXR0aW5nXG4iKTsKLQkJYXRoNWtfcmVzZXQoc2MsIE5VTEwsIHRydWUpOworCQlhdGg1a19yZXNldChhaCwgTlVMTCwgdHJ1ZSk7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZzYy0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhaC0+bG9jayk7CiAKLQlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKHNjLT5odywgJnNjLT50eF9jb21wbGV0ZV93b3JrLAorCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoYWgtPmh3LCAmYWgtPnR4X2NvbXBsZXRlX3dvcmssCiAJCW1zZWNzX3RvX2ppZmZpZXMoQVRINUtfVFhfQ09NUExFVEVfUE9MTF9JTlQpKTsKIH0KIApAQCAtMjM1NCwxNiArMjM0MywxNiBAQAogKiBJbml0aWFsaXphdGlvbiByb3V0aW5lcyAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaW50Ci1hdGg1a19pbml0X3NvZnRjKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIGNvbnN0IHN0cnVjdCBhdGhfYnVzX29wcyAqYnVzX29wcykKK2ludCBfX2RldmluaXQKK2F0aDVrX2luaXRfc29mdGMoc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3Qgc3RydWN0IGF0aF9idXNfb3BzICpidXNfb3BzKQogewotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gc2MtPmh3OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gYWgtPmh3OwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb247CiAJaW50IHJldDsKIAlpbnQgY3N6OwogCiAJLyogSW5pdGlhbGl6ZSBkcml2ZXIgcHJpdmF0ZSBkYXRhICovCi0JU0VUX0lFRUU4MDIxMV9ERVYoaHcsIHNjLT5kZXYpOworCVNFVF9JRUVFODAyMTFfREVWKGh3LCBhaC0+ZGV2KTsKIAlody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTIHwKIAkJCUlFRUU4MDIxMV9IV19IT1NUX0JST0FEQ0FTVF9QU19CVUZGRVJJTkcgfAogCQkJSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfApAQCAtMjM4NiwzOSArMjM3NSwzMCBAQAogCSAqIE1hcmsgdGhlIGRldmljZSBhcyBkZXRhY2hlZCB0byBhdm9pZCBwcm9jZXNzaW5nCiAJICogaW50ZXJydXB0cyB1bnRpbCBzZXR1cCBpcyBjb21wbGV0ZS4KIAkgKi8KLQlfX3NldF9iaXQoQVRIX1NUQVRfSU5WQUxJRCwgc2MtPnN0YXR1cyk7CisJX19zZXRfYml0KEFUSF9TVEFUX0lOVkFMSUQsIGFoLT5zdGF0dXMpOwogCi0Jc2MtPm9wbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0Jc2MtPmJpbnR2YWwgPSAxMDAwOwotCW11dGV4X2luaXQoJnNjLT5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmc2MtPnJ4YnVmbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnNjLT50eGJ1ZmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZzYy0+YmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZzYy0+aXJxbG9jayk7CisJYWgtPm9wbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CisJYWgtPmJpbnR2YWwgPSAxMDAwOworCW11dGV4X2luaXQoJmFoLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWgtPnJ4YnVmbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFoLT50eGJ1ZmxvY2spOworCXNwaW5fbG9ja19pbml0KCZhaC0+YmxvY2spOworCXNwaW5fbG9ja19pbml0KCZhaC0+aXJxbG9jayk7CiAKIAkvKiBTZXR1cCBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCXJldCA9IHJlcXVlc3RfaXJxKHNjLT5pcnEsIGF0aDVrX2ludHIsIElSUUZfU0hBUkVELCAiYXRoIiwgc2MpOworCXJldCA9IHJlcXVlc3RfaXJxKGFoLT5pcnEsIGF0aDVrX2ludHIsIElSUUZfU0hBUkVELCAiYXRoIiwgYWgpOwogCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKHNjLCAicmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKKwkJQVRINUtfRVJSKGFoLCAicmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCi0JLyogSWYgd2UgcGFzc2VkIHRoZSB0ZXN0LCBtYWxsb2MgYW4gYXRoNWtfaHcgc3RydWN0ICovCi0Jc2MtPmFoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0aDVrX2h3KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzYy0+YWgpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJQVRINUtfRVJSKHNjLCAib3V0IG9mIG1lbW9yeVxuIik7Ci0JCWdvdG8gZXJyX2lycTsKLQl9Ci0KLQlzYy0+YWgtPmFoX3NjID0gc2M7Ci0Jc2MtPmFoLT5haF9pb2Jhc2UgPSBzYy0+aW9iYXNlOwotCWNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihzYy0+YWgpOworCWNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJY29tbW9uLT5vcHMgPSAmYXRoNWtfY29tbW9uX29wczsKIAljb21tb24tPmJ1c19vcHMgPSBidXNfb3BzOwotCWNvbW1vbi0+YWggPSBzYy0+YWg7CisJY29tbW9uLT5haCA9IGFoOwogCWNvbW1vbi0+aHcgPSBodzsKLQljb21tb24tPnByaXYgPSBzYzsKKwljb21tb24tPnByaXYgPSBhaDsKKwljb21tb24tPmNsb2NrcmF0ZSA9IDQwOwogCiAJLyoKIAkgKiBDYWNoZSBsaW5lIHNpemUgaXMgdXNlZCB0byBzaXplIGFuZCBhbGlnbiB2YXJpb3VzCkBAIC0yNDMwLDEyICsyNDEwLDEyIEBACiAJc3Bpbl9sb2NrX2luaXQoJmNvbW1vbi0+Y2NfbG9jayk7CiAKIAkvKiBJbml0aWFsaXplIGRldmljZSAqLwotCXJldCA9IGF0aDVrX2h3X2luaXQoc2MpOworCXJldCA9IGF0aDVrX2h3X2luaXQoYWgpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX2ZyZWVfYWg7CisJCWdvdG8gZXJyX2lycTsKIAogCS8qIHNldCB1cCBtdWx0aS1yYXRlIHJldHJ5IGNhcGFiaWxpdGllcyAqLwotCWlmIChzYy0+YWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKIAkJaHctPm1heF9yYXRlcyA9IDQ7CiAJCWh3LT5tYXhfcmF0ZV90cmllcyA9IG1heChBUjVLX0lOSVRfUkVUUllfU0hPUlQsCiAJCQkJCSBBUjVLX0lOSVRfUkVUUllfTE9ORyk7CkBAIC0yNDQ4LDc3ICsyNDI4LDc0IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfYWg7CiAKLQlBVEg1S19JTkZPKHNjLCAiQXRoZXJvcyBBUiVzIGNoaXAgZm91bmQgKE1BQzogMHgleCwgUEhZOiAweCV4KVxuIiwKLQkJCWF0aDVrX2NoaXBfbmFtZShBUjVLX1ZFUlNJT05fTUFDLCBzYy0+YWgtPmFoX21hY19zcmV2KSwKLQkJCQkJc2MtPmFoLT5haF9tYWNfc3JldiwKLQkJCQkJc2MtPmFoLT5haF9waHlfcmV2aXNpb24pOworCUFUSDVLX0lORk8oYWgsICJBdGhlcm9zIEFSJXMgY2hpcCBmb3VuZCAoTUFDOiAweCV4LCBQSFk6IDB4JXgpXG4iLAorCQkJYXRoNWtfY2hpcF9uYW1lKEFSNUtfVkVSU0lPTl9NQUMsIGFoLT5haF9tYWNfc3JldiksCisJCQkJCWFoLT5haF9tYWNfc3JldiwKKwkJCQkJYWgtPmFoX3BoeV9yZXZpc2lvbik7CiAKLQlpZiAoIXNjLT5haC0+YWhfc2luZ2xlX2NoaXApIHsKKwlpZiAoIWFoLT5haF9zaW5nbGVfY2hpcCkgewogCQkvKiBTaW5nbGUgY2hpcCByYWRpbyAoIVJGNTExMSkgKi8KLQkJaWYgKHNjLT5haC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiAmJgotCQkJIXNjLT5haC0+YWhfcmFkaW9fMmdoel9yZXZpc2lvbikgeworCQlpZiAoYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gJiYKKwkJCSFhaC0+YWhfcmFkaW9fMmdoel9yZXZpc2lvbikgewogCQkJLyogTm8gNUdIeiBzdXBwb3J0IC0+IHJlcG9ydCAyR0h6IHJhZGlvICovCiAJCQlpZiAoIXRlc3RfYml0KEFSNUtfTU9ERV8xMUEsCi0JCQkJc2MtPmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpKSB7Ci0JCQkJQVRINUtfSU5GTyhzYywgIlJGJXMgMkdIeiByYWRpbyBmb3VuZCAoMHgleClcbiIsCisJCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSkpIHsKKwkJCQlBVEg1S19JTkZPKGFoLCAiUkYlcyAyR0h6IHJhZGlvIGZvdW5kICgweCV4KVxuIiwKIAkJCQkJYXRoNWtfY2hpcF9uYW1lKEFSNUtfVkVSU0lPTl9SQUQsCi0JCQkJCQlzYy0+YWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pLAotCQkJCQkJc2MtPmFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uKTsKKwkJCQkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uKSwKKwkJCQkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uKTsKIAkJCS8qIE5vIDJHSHogc3VwcG9ydCAoNTExMCBhbmQgc29tZQotCQkJICogNUdoeiBvbmx5IGNhcmRzKSAtPiByZXBvcnQgNUdoeiByYWRpbyAqLworCQkJICogNUdIeiBvbmx5IGNhcmRzKSAtPiByZXBvcnQgNUdIeiByYWRpbyAqLwogCQkJfSBlbHNlIGlmICghdGVzdF9iaXQoQVI1S19NT0RFXzExQiwKLQkJCQlzYy0+YWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSkpIHsKLQkJCQlBVEg1S19JTkZPKHNjLCAiUkYlcyA1R0h6IHJhZGlvIGZvdW5kICgweCV4KVxuIiwKKwkJCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlKSkgeworCQkJCUFUSDVLX0lORk8oYWgsICJSRiVzIDVHSHogcmFkaW8gZm91bmQgKDB4JXgpXG4iLAogCQkJCQlhdGg1a19jaGlwX25hbWUoQVI1S19WRVJTSU9OX1JBRCwKLQkJCQkJCXNjLT5haC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiksCi0JCQkJCQlzYy0+YWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pOworCQkJCQkJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pLAorCQkJCQkJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pOwogCQkJLyogTXVsdGliYW5kIHJhZGlvICovCiAJCQl9IGVsc2UgewotCQkJCUFUSDVLX0lORk8oc2MsICJSRiVzIG11bHRpYmFuZCByYWRpbyBmb3VuZCIKKwkJCQlBVEg1S19JTkZPKGFoLCAiUkYlcyBtdWx0aWJhbmQgcmFkaW8gZm91bmQiCiAJCQkJCSIgKDB4JXgpXG4iLAogCQkJCQlhdGg1a19jaGlwX25hbWUoQVI1S19WRVJTSU9OX1JBRCwKLQkJCQkJCXNjLT5haC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiksCi0JCQkJCQlzYy0+YWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pOworCQkJCQkJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pLAorCQkJCQkJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pOwogCQkJfQogCQl9CiAJCS8qIE11bHRpIGNoaXAgcmFkaW8gKFJGNTExMSAtIFJGMjExMSkgLT4KIAkJICogcmVwb3J0IGJvdGggMkdIei81R0h6IHJhZGlvcyAqLwotCQllbHNlIGlmIChzYy0+YWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gJiYKLQkJCQlzYy0+YWgtPmFoX3JhZGlvXzJnaHpfcmV2aXNpb24pewotCQkJQVRINUtfSU5GTyhzYywgIlJGJXMgNUdIeiByYWRpbyBmb3VuZCAoMHgleClcbiIsCisJCWVsc2UgaWYgKGFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uICYmCisJCQkJYWgtPmFoX3JhZGlvXzJnaHpfcmV2aXNpb24pIHsKKwkJCUFUSDVLX0lORk8oYWgsICJSRiVzIDVHSHogcmFkaW8gZm91bmQgKDB4JXgpXG4iLAogCQkJCWF0aDVrX2NoaXBfbmFtZShBUjVLX1ZFUlNJT05fUkFELAotCQkJCQlzYy0+YWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pLAotCQkJCQlzYy0+YWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pOwotCQkJQVRINUtfSU5GTyhzYywgIlJGJXMgMkdIeiByYWRpbyBmb3VuZCAoMHgleClcbiIsCisJCQkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uKSwKKwkJCQkJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pOworCQkJQVRINUtfSU5GTyhhaCwgIlJGJXMgMkdIeiByYWRpbyBmb3VuZCAoMHgleClcbiIsCiAJCQkJYXRoNWtfY2hpcF9uYW1lKEFSNUtfVkVSU0lPTl9SQUQsCi0JCQkJCXNjLT5haC0+YWhfcmFkaW9fMmdoel9yZXZpc2lvbiksCi0JCQkJCXNjLT5haC0+YWhfcmFkaW9fMmdoel9yZXZpc2lvbik7CisJCQkJCWFoLT5haF9yYWRpb18yZ2h6X3JldmlzaW9uKSwKKwkJCQkJYWgtPmFoX3JhZGlvXzJnaHpfcmV2aXNpb24pOwogCQl9CiAJfQogCi0JYXRoNWtfZGVidWdfaW5pdF9kZXZpY2Uoc2MpOworCWF0aDVrX2RlYnVnX2luaXRfZGV2aWNlKGFoKTsKIAogCS8qIHJlYWR5IHRvIHByb2Nlc3MgaW50ZXJydXB0cyAqLwotCV9fY2xlYXJfYml0KEFUSF9TVEFUX0lOVkFMSUQsIHNjLT5zdGF0dXMpOworCV9fY2xlYXJfYml0KEFUSF9TVEFUX0lOVkFMSUQsIGFoLT5zdGF0dXMpOwogCiAJcmV0dXJuIDA7CiBlcnJfYWg6Ci0JYXRoNWtfaHdfZGVpbml0KHNjLT5haCk7Ci1lcnJfZnJlZV9haDoKLQlrZnJlZShzYy0+YWgpOworCWF0aDVrX2h3X2RlaW5pdChhaCk7CiBlcnJfaXJxOgotCWZyZWVfaXJxKHNjLT5pcnEsIHNjKTsKKwlmcmVlX2lycShhaC0+aXJxLCBhaCk7CiBlcnI6CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludAotYXRoNWtfc3RvcF9sb2NrZWQoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK2F0aDVrX3N0b3BfbG9ja2VkKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKIAotCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfUkVTRVQsICJpbnZhbGlkICV1XG4iLAotCQkJdGVzdF9iaXQoQVRIX1NUQVRfSU5WQUxJRCwgc2MtPnN0YXR1cykpOworCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsICJpbnZhbGlkICV1XG4iLAorCQkJdGVzdF9iaXQoQVRIX1NUQVRfSU5WQUxJRCwgYWgtPnN0YXR1cykpOwogCiAJLyoKIAkgKiBTaHV0ZG93biB0aGUgaGFyZHdhcmUgYW5kIGRyaXZlcjoKQEAgLTI1MzUsMzcgKzI1MTIsMzYgQEAKIAkgKiBOb3RlIHRoYXQgc29tZSBvZiB0aGlzIHdvcmsgaXMgbm90IHBvc3NpYmxlIGlmIHRoZQogCSAqIGhhcmR3YXJlIGlzIGdvbmUgKGludmFsaWQpLgogCSAqLwotCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhzYy0+aHcpOworCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhhaC0+aHcpOwogCi0JaWYgKCF0ZXN0X2JpdChBVEhfU1RBVF9JTlZBTElELCBzYy0+c3RhdHVzKSkgewotCQlhdGg1a19sZWRfb2ZmKHNjKTsKKwlpZiAoIXRlc3RfYml0KEFUSF9TVEFUX0lOVkFMSUQsIGFoLT5zdGF0dXMpKSB7CisJCWF0aDVrX2xlZF9vZmYoYWgpOwogCQlhdGg1a19od19zZXRfaW1yKGFoLCAwKTsKLQkJc3luY2hyb25pemVfaXJxKHNjLT5pcnEpOwotCQlhdGg1a19yeF9zdG9wKHNjKTsKKwkJc3luY2hyb25pemVfaXJxKGFoLT5pcnEpOworCQlhdGg1a19yeF9zdG9wKGFoKTsKIAkJYXRoNWtfaHdfZG1hX3N0b3AoYWgpOwotCQlhdGg1a19kcmFpbl90eF9idWZmcyhzYyk7CisJCWF0aDVrX2RyYWluX3R4X2J1ZmZzKGFoKTsKIAkJYXRoNWtfaHdfcGh5X2Rpc2FibGUoYWgpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1pbnQKLWF0aDVrX2luaXRfaHcoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK2ludCBhdGg1a19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCXN0cnVjdCBhdGg1a19odyAqYWggPSBody0+cHJpdjsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKGFoKTsKIAlpbnQgcmV0LCBpOwogCi0JbXV0ZXhfbG9jaygmc2MtPmxvY2spOworCW11dGV4X2xvY2soJmFoLT5sb2NrKTsKIAotCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfUkVTRVQsICJtb2RlICVkXG4iLCBzYy0+b3Btb2RlKTsKKwlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX1JFU0VULCAibW9kZSAlZFxuIiwgYWgtPm9wbW9kZSk7CiAKIAkvKgogCSAqIFN0b3AgYW55dGhpbmcgcHJldmlvdXNseSBzZXR1cC4gIFRoaXMgaXMgc2FmZQogCSAqIG5vIG1hdHRlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggb3Igbm90LgogCSAqLwotCWF0aDVrX3N0b3BfbG9ja2VkKHNjKTsKKwlhdGg1a19zdG9wX2xvY2tlZChhaCk7CiAKIAkvKgogCSAqIFRoZSBiYXNpYyBpbnRlcmZhY2UgdG8gc2V0dGluZyB0aGUgaGFyZHdhcmUgaW4gYSBnb29kCkBAIC0yNTc0LDEyICsyNTUwLDEyIEBACiAJICogYmUgZm9sbG93ZWQgYnkgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGFwcHJvcHJpYXRlIGJpdHMKIAkgKiBhbmQgdGhlbiBzZXR1cCBvZiB0aGUgaW50ZXJydXB0IG1hc2suCiAJICovCi0Jc2MtPmN1cmNoYW4gPSBzYy0+aHctPmNvbmYuY2hhbm5lbDsKLQlzYy0+aW1hc2sgPSBBUjVLX0lOVF9SWE9LIHwgQVI1S19JTlRfUlhFUlIgfCBBUjVLX0lOVF9SWEVPTCB8CisJYWgtPmN1cmNoYW4gPSBhaC0+aHctPmNvbmYuY2hhbm5lbDsKKwlhaC0+aW1hc2sgPSBBUjVLX0lOVF9SWE9LIHwgQVI1S19JTlRfUlhFUlIgfCBBUjVLX0lOVF9SWEVPTCB8CiAJCUFSNUtfSU5UX1JYT1JOIHwgQVI1S19JTlRfVFhERVNDIHwgQVI1S19JTlRfVFhFT0wgfAogCQlBUjVLX0lOVF9GQVRBTCB8IEFSNUtfSU5UX0dMT0JBTCB8IEFSNUtfSU5UX01JQjsKIAotCXJldCA9IGF0aDVrX3Jlc2V0KHNjLCBOVUxMLCBmYWxzZSk7CisJcmV0ID0gYXRoNWtfcmVzZXQoYWgsIE5VTEwsIGZhbHNlKTsKIAlpZiAocmV0KQogCQlnb3RvIGRvbmU7CiAKQEAgLTI1OTYsMjkgKzI1NzIsMjkgQEAKIAkgKiByYXRlICovCiAJYWgtPmFoX2Fja19iaXRyYXRlX2hpZ2ggPSB0cnVlOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2MtPmJzbG90KTsgaSsrKQotCQlzYy0+YnNsb3RbaV0gPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFoLT5ic2xvdCk7IGkrKykKKwkJYWgtPmJzbG90W2ldID0gTlVMTDsKIAogCXJldCA9IDA7CiBkb25lOgogCW1taW93YigpOwotCW11dGV4X3VubG9jaygmc2MtPmxvY2spOworCW11dGV4X3VubG9jaygmYWgtPmxvY2spOwogCi0JaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayhzYy0+aHcsICZzYy0+dHhfY29tcGxldGVfd29yaywKKwlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKGFoLT5odywgJmFoLT50eF9jb21wbGV0ZV93b3JrLAogCQkJbXNlY3NfdG9famlmZmllcyhBVEg1S19UWF9DT01QTEVURV9QT0xMX0lOVCkpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgc3RvcF90YXNrbGV0cyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQorc3RhdGljIHZvaWQgYXRoNWtfc3RvcF90YXNrbGV0cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCXNjLT5yeF9wZW5kaW5nID0gZmFsc2U7Ci0Jc2MtPnR4X3BlbmRpbmcgPSBmYWxzZTsKLQl0YXNrbGV0X2tpbGwoJnNjLT5yeHRxKTsKLQl0YXNrbGV0X2tpbGwoJnNjLT50eHRxKTsKLQl0YXNrbGV0X2tpbGwoJnNjLT5jYWxpYik7Ci0JdGFza2xldF9raWxsKCZzYy0+YmVhY29udHEpOwotCXRhc2tsZXRfa2lsbCgmc2MtPmFuaV90YXNrbGV0KTsKKwlhaC0+cnhfcGVuZGluZyA9IGZhbHNlOworCWFoLT50eF9wZW5kaW5nID0gZmFsc2U7CisJdGFza2xldF9raWxsKCZhaC0+cnh0cSk7CisJdGFza2xldF9raWxsKCZhaC0+dHh0cSk7CisJdGFza2xldF9raWxsKCZhaC0+Y2FsaWIpOworCXRhc2tsZXRfa2lsbCgmYWgtPmJlYWNvbnRxKTsKKwl0YXNrbGV0X2tpbGwoJmFoLT5hbmlfdGFza2xldCk7CiB9CiAKIC8qCkBAIC0yNjI3LDE0ICsyNjAzLDE0IEBACiAgKiBpZiBhbm90aGVyIHRocmVhZCBkb2VzIGEgc3lzdGVtIGNhbGwgYW5kIHRoZSB0aHJlYWQgZG9pbmcgdGhlCiAgKiBzdG9wIGlzIHByZWVtcHRlZCkuCiAgKi8KLWludAotYXRoNWtfc3RvcF9odyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQordm9pZCBhdGg1a19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogeworCXN0cnVjdCBhdGg1a19odyAqYWggPSBody0+cHJpdjsKIAlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmc2MtPmxvY2spOwotCXJldCA9IGF0aDVrX3N0b3BfbG9ja2VkKHNjKTsKLQlpZiAocmV0ID09IDAgJiYgIXRlc3RfYml0KEFUSF9TVEFUX0lOVkFMSUQsIHNjLT5zdGF0dXMpKSB7CisJbXV0ZXhfbG9jaygmYWgtPmxvY2spOworCXJldCA9IGF0aDVrX3N0b3BfbG9ja2VkKGFoKTsKKwlpZiAocmV0ID09IDAgJiYgIXRlc3RfYml0KEFUSF9TVEFUX0lOVkFMSUQsIGFoLT5zdGF0dXMpKSB7CiAJCS8qCiAJCSAqIERvbid0IHNldCB0aGUgY2FyZCBpbiBmdWxsIHNsZWVwIG1vZGUhCiAJCSAqCkBAIC0yNjU1LDc4ICsyNjMxLDc4IEBACiAJCSAqIGFuZCBTYW0ncyBIQUwgZG8gYW55d2F5KS4gSW5zdGVhZCBQZXJmb3JtIGEgZnVsbCByZXNldAogCQkgKiBvbiB0aGUgZGV2aWNlIChzYW1lIGFzIGluaXRpYWwgc3RhdGUgYWZ0ZXIgYXR0YWNoKSBhbmQKIAkJICogbGVhdmUgaXQgaWRsZSAoa2VlcCBNQUMvQkIgb24gd2FybSByZXNldCkgKi8KLQkJcmV0ID0gYXRoNWtfaHdfb25faG9sZChzYy0+YWgpOworCQlyZXQgPSBhdGg1a19od19vbl9ob2xkKGFoKTsKIAotCQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX1JFU0VULAorCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX1JFU0VULAogCQkJCSJwdXR0aW5nIGRldmljZSB0byBzbGVlcFxuIik7CiAJfQogCiAJbW1pb3diKCk7Ci0JbXV0ZXhfdW5sb2NrKCZzYy0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhaC0+bG9jayk7CiAKLQlzdG9wX3Rhc2tsZXRzKHNjKTsKKwlhdGg1a19zdG9wX3Rhc2tsZXRzKGFoKTsKIAotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmc2MtPnR4X2NvbXBsZXRlX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYWgtPnR4X2NvbXBsZXRlX3dvcmspOwogCi0JYXRoNWtfcmZraWxsX2h3X3N0b3Aoc2MtPmFoKTsKLQotCXJldHVybiByZXQ7CisJYXRoNWtfcmZraWxsX2h3X3N0b3AoYWgpOwogfQogCiAvKgogICogUmVzZXQgdGhlIGhhcmR3YXJlLiAgSWYgY2hhbiBpcyBub3QgTlVMTCwgdGhlbiBhbHNvIHBhdXNlIHJ4L3R4CiAgKiBhbmQgY2hhbmdlIHRvIHRoZSBnaXZlbiBjaGFubmVsLgogICoKLSAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHNjLT5sb2NrLgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdpdGggYWgtPmxvY2suCiAgKi8KIHN0YXRpYyBpbnQKLWF0aDVrX3Jlc2V0KHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKK2F0aDVrX3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKIAkJCQkJCQlib29sIHNraXBfcGN1KQogewotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJaW50IHJldCwgYW5pX21vZGU7CisJYm9vbCBmYXN0OwogCi0JQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19SRVNFVCwgInJlc2V0dGluZ1xuIik7CisJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19SRVNFVCwgInJlc2V0dGluZ1xuIik7CiAKIAlhdGg1a19od19zZXRfaW1yKGFoLCAwKTsKLQlzeW5jaHJvbml6ZV9pcnEoc2MtPmlycSk7Ci0Jc3RvcF90YXNrbGV0cyhzYyk7CisJc3luY2hyb25pemVfaXJxKGFoLT5pcnEpOworCWF0aDVrX3N0b3BfdGFza2xldHMoYWgpOwogCiAJLyogU2F2ZSBhbmkgbW9kZSBhbmQgZGlzYWJsZSBBTkkgZHVyaW5nCiAJICogcmVzZXQuIElmIHdlIGRvbid0IHdlIG1pZ2h0IGdldCBmYWxzZQogCSAqIFBIWSBlcnJvciBpbnRlcnJ1cHRzLiAqLwotCWFuaV9tb2RlID0gYWgtPmFoX3NjLT5hbmlfc3RhdGUuYW5pX21vZGU7CisJYW5pX21vZGUgPSBhaC0+YW5pX3N0YXRlLmFuaV9tb2RlOwogCWF0aDVrX2FuaV9pbml0KGFoLCBBVEg1S19BTklfTU9ERV9PRkYpOwogCiAJLyogV2UgYXJlIGdvaW5nIHRvIGVtcHR5IGh3IHF1ZXVlcwogCSAqIHNvIHdlIHNob3VsZCBhbHNvIGZyZWUgYW55IHJlbWFpbmluZwogCSAqIHR4IGJ1ZmZlcnMgKi8KLQlhdGg1a19kcmFpbl90eF9idWZmcyhzYyk7CisJYXRoNWtfZHJhaW5fdHhfYnVmZnMoYWgpOwogCWlmIChjaGFuKQotCQlzYy0+Y3VyY2hhbiA9IGNoYW47Ci0JcmV0ID0gYXRoNWtfaHdfcmVzZXQoYWgsIHNjLT5vcG1vZGUsIHNjLT5jdXJjaGFuLCBjaGFuICE9IE5VTEwsCi0JCQkJCQkJCXNraXBfcGN1KTsKKwkJYWgtPmN1cmNoYW4gPSBjaGFuOworCisJZmFzdCA9ICgoY2hhbiAhPSBOVUxMKSAmJiBtb2RwYXJhbV9mYXN0Y2hhbnN3aXRjaCkgPyAxIDogMDsKKworCXJldCA9IGF0aDVrX2h3X3Jlc2V0KGFoLCBhaC0+b3Btb2RlLCBhaC0+Y3VyY2hhbiwgZmFzdCwgc2tpcF9wY3UpOwogCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKHNjLCAiY2FuJ3QgcmVzZXQgaGFyZHdhcmUgKCVkKVxuIiwgcmV0KTsKKwkJQVRINUtfRVJSKGFoLCAiY2FuJ3QgcmVzZXQgaGFyZHdhcmUgKCVkKVxuIiwgcmV0KTsKIAkJZ290byBlcnI7CiAJfQogCi0JcmV0ID0gYXRoNWtfcnhfc3RhcnQoc2MpOworCXJldCA9IGF0aDVrX3J4X3N0YXJ0KGFoKTsKIAlpZiAocmV0KSB7Ci0JCUFUSDVLX0VSUihzYywgImNhbid0IHN0YXJ0IHJlY3YgbG9naWNcbiIpOworCQlBVEg1S19FUlIoYWgsICJjYW4ndCBzdGFydCByZWN2IGxvZ2ljXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJYXRoNWtfYW5pX2luaXQoYWgsIGFuaV9tb2RlKTsKIAotCWFoLT5haF9jYWxfbmV4dF9mdWxsID0gamlmZmllczsKKwlhaC0+YWhfY2FsX25leHRfZnVsbCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CiAJYWgtPmFoX2NhbF9uZXh0X2FuaSA9IGppZmZpZXM7CiAJYWgtPmFoX2NhbF9uZXh0X25mID0gamlmZmllczsKIAlld21hX2luaXQoJmFoLT5haF9iZWFjb25fcnNzaV9hdmcsIDEwMjQsIDgpOwogCiAJLyogY2xlYXIgc3VydmV5IGRhdGEgYW5kIGN5Y2xlIGNvdW50ZXJzICovCi0JbWVtc2V0KCZzYy0+c3VydmV5LCAwLCBzaXplb2Yoc2MtPnN1cnZleSkpOworCW1lbXNldCgmYWgtPnN1cnZleSwgMCwgc2l6ZW9mKGFoLT5zdXJ2ZXkpKTsKIAlzcGluX2xvY2tfYmgoJmNvbW1vbi0+Y2NfbG9jayk7CiAJYXRoX2h3X2N5Y2xlX2NvdW50ZXJzX3VwZGF0ZShjb21tb24pOwogCW1lbXNldCgmY29tbW9uLT5jY19zdXJ2ZXksIDAsIHNpemVvZihjb21tb24tPmNjX3N1cnZleSkpOwpAQCAtMjc0MiwxMiArMjcxOCwxMiBAQAogCSAqCiAJICogWFhYIG5lZWRlZD8KIAkgKi8KLS8qCWF0aDVrX2NoYW5fY2hhbmdlKHNjLCBjKTsgKi8KKy8qCWF0aDVrX2NoYW5fY2hhbmdlKGFoLCBjKTsgKi8KIAotCWF0aDVrX2JlYWNvbl9jb25maWcoc2MpOworCWF0aDVrX2JlYWNvbl9jb25maWcoYWgpOwogCS8qIGludHJzIGFyZSBlbmFibGVkIGJ5IGF0aDVrX2JlYWNvbl9jb25maWcgKi8KIAotCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhzYy0+aHcpOworCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhhaC0+aHcpOwogCiAJcmV0dXJuIDA7CiBlcnI6CkBAIC0yNzU2LDIwICsyNzMyLDE5IEBACiAKIHN0YXRpYyB2b2lkIGF0aDVrX3Jlc2V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0aDVrX3NvZnRjLAorCXN0cnVjdCBhdGg1a19odyAqYWggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0aDVrX2h3LAogCQlyZXNldF93b3JrKTsKIAotCW11dGV4X2xvY2soJnNjLT5sb2NrKTsKLQlhdGg1a19yZXNldChzYywgTlVMTCwgdHJ1ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZzYy0+bG9jayk7CisJbXV0ZXhfbG9jaygmYWgtPmxvY2spOworCWF0aDVrX3Jlc2V0KGFoLCBOVUxMLCB0cnVlKTsKKwltdXRleF91bmxvY2soJmFoLT5sb2NrKTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIGludCBfX2RldmluaXQKIGF0aDVrX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gaHctPnByaXY7CiAJc3RydWN0IGF0aF9yZWd1bGF0b3J5ICpyZWd1bGF0b3J5ID0gYXRoNWtfaHdfcmVndWxhdG9yeShhaCk7CiAJc3RydWN0IGF0aDVrX3R4cSAqdHhxOwogCXU4IG1hY1tFVEhfQUxFTl0gPSB7fTsKQEAgLTI3ODgsMjYgKzI3NjMsMjYgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7CiAJaWYgKHJldCA+IDApCi0JCV9fc2V0X2JpdChBVEhfU1RBVF9NUlJFVFJZLCBzYy0+c3RhdHVzKTsKKwkJX19zZXRfYml0KEFUSF9TVEFUX01SUkVUUlksIGFoLT5zdGF0dXMpOwogCiAJLyoKIAkgKiBDb2xsZWN0IHRoZSBjaGFubmVsIGxpc3QuICBUaGUgODAyLjExIGxheWVyCi0JICogaXMgcmVzcG9zaWJsZSBmb3IgZmlsdGVyaW5nIHRoaXMgbGlzdCBiYXNlZAorCSAqIGlzIHJlc3BvbnNpYmxlIGZvciBmaWx0ZXJpbmcgdGhpcyBsaXN0IGJhc2VkCiAJICogb24gc2V0dGluZ3MgbGlrZSB0aGUgcGh5IG1vZGUgYW5kIHJlZ3VsYXRvcnkKIAkgKiBkb21haW4gcmVzdHJpY3Rpb25zLgogCSAqLwogCXJldCA9IGF0aDVrX3NldHVwX2JhbmRzKGh3KTsKIAlpZiAocmV0KSB7Ci0JCUFUSDVLX0VSUihzYywgImNhbid0IGdldCBjaGFubmVsc1xuIik7CisJCUFUSDVLX0VSUihhaCwgImNhbid0IGdldCBjaGFubmVsc1xuIik7CiAJCWdvdG8gZXJyOwogCX0KIAogCS8qCiAJICogQWxsb2NhdGUgdHgrcnggZGVzY3JpcHRvcnMgYW5kIHBvcHVsYXRlIHRoZSBsaXN0cy4KIAkgKi8KLQlyZXQgPSBhdGg1a19kZXNjX2FsbG9jKHNjKTsKKwlyZXQgPSBhdGg1a19kZXNjX2FsbG9jKGFoKTsKIAlpZiAocmV0KSB7Ci0JCUFUSDVLX0VSUihzYywgImNhbid0IGFsbG9jYXRlIGRlc2NyaXB0b3JzXG4iKTsKKwkJQVRINUtfRVJSKGFoLCAiY2FuJ3QgYWxsb2NhdGUgZGVzY3JpcHRvcnNcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTI4MTksMTQgKzI3OTQsMTQgQEAKIAkgKi8KIAlyZXQgPSBhdGg1a19iZWFjb25xX3NldHVwKGFoKTsKIAlpZiAocmV0IDwgMCkgewotCQlBVEg1S19FUlIoc2MsICJjYW4ndCBzZXR1cCBhIGJlYWNvbiB4bWl0IHF1ZXVlXG4iKTsKKwkJQVRINUtfRVJSKGFoLCAiY2FuJ3Qgc2V0dXAgYSBiZWFjb24geG1pdCBxdWV1ZVxuIik7CiAJCWdvdG8gZXJyX2Rlc2M7CiAJfQotCXNjLT5iaGFscSA9IHJldDsKLQlzYy0+Y2FicSA9IGF0aDVrX3R4cV9zZXR1cChzYywgQVI1S19UWF9RVUVVRV9DQUIsIDApOwotCWlmIChJU19FUlIoc2MtPmNhYnEpKSB7Ci0JCUFUSDVLX0VSUihzYywgImNhbid0IHNldHVwIGNhYiBxdWV1ZVxuIik7Ci0JCXJldCA9IFBUUl9FUlIoc2MtPmNhYnEpOworCWFoLT5iaGFscSA9IHJldDsKKwlhaC0+Y2FicSA9IGF0aDVrX3R4cV9zZXR1cChhaCwgQVI1S19UWF9RVUVVRV9DQUIsIDApOworCWlmIChJU19FUlIoYWgtPmNhYnEpKSB7CisJCUFUSDVLX0VSUihhaCwgImNhbid0IHNldHVwIGNhYiBxdWV1ZVxuIik7CisJCXJldCA9IFBUUl9FUlIoYWgtPmNhYnEpOwogCQlnb3RvIGVycl9iaGFsOwogCX0KIApAQCAtMjgzNSw5NyArMjgxMCw5NyBAQAogCWlmIChhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0gPj0gNikgewogCQkvKiBUaGlzIG9yZGVyIG1hdGNoZXMgbWFjODAyMTEncyBxdWV1ZSBwcmlvcml0eSwgc28gd2UgY2FuCiAJCSogZGlyZWN0bHkgdXNlIHRoZSBtYWM4MDIxMSBxdWV1ZSBudW1iZXIgd2l0aG91dCBhbnkgbWFwcGluZyAqLwotCQl0eHEgPSBhdGg1a190eHFfc2V0dXAoc2MsIEFSNUtfVFhfUVVFVUVfREFUQSwgQVI1S19XTUVfQUNfVk8pOworCQl0eHEgPSBhdGg1a190eHFfc2V0dXAoYWgsIEFSNUtfVFhfUVVFVUVfREFUQSwgQVI1S19XTUVfQUNfVk8pOwogCQlpZiAoSVNfRVJSKHR4cSkpIHsKLQkJCUFUSDVLX0VSUihzYywgImNhbid0IHNldHVwIHhtaXQgcXVldWVcbiIpOworCQkJQVRINUtfRVJSKGFoLCAiY2FuJ3Qgc2V0dXAgeG1pdCBxdWV1ZVxuIik7CiAJCQlyZXQgPSBQVFJfRVJSKHR4cSk7CiAJCQlnb3RvIGVycl9xdWV1ZXM7CiAJCX0KLQkJdHhxID0gYXRoNWtfdHhxX3NldHVwKHNjLCBBUjVLX1RYX1FVRVVFX0RBVEEsIEFSNUtfV01FX0FDX1ZJKTsKKwkJdHhxID0gYXRoNWtfdHhxX3NldHVwKGFoLCBBUjVLX1RYX1FVRVVFX0RBVEEsIEFSNUtfV01FX0FDX1ZJKTsKIAkJaWYgKElTX0VSUih0eHEpKSB7Ci0JCQlBVEg1S19FUlIoc2MsICJjYW4ndCBzZXR1cCB4bWl0IHF1ZXVlXG4iKTsKKwkJCUFUSDVLX0VSUihhaCwgImNhbid0IHNldHVwIHhtaXQgcXVldWVcbiIpOwogCQkJcmV0ID0gUFRSX0VSUih0eHEpOwogCQkJZ290byBlcnJfcXVldWVzOwogCQl9Ci0JCXR4cSA9IGF0aDVrX3R4cV9zZXR1cChzYywgQVI1S19UWF9RVUVVRV9EQVRBLCBBUjVLX1dNRV9BQ19CRSk7CisJCXR4cSA9IGF0aDVrX3R4cV9zZXR1cChhaCwgQVI1S19UWF9RVUVVRV9EQVRBLCBBUjVLX1dNRV9BQ19CRSk7CiAJCWlmIChJU19FUlIodHhxKSkgewotCQkJQVRINUtfRVJSKHNjLCAiY2FuJ3Qgc2V0dXAgeG1pdCBxdWV1ZVxuIik7CisJCQlBVEg1S19FUlIoYWgsICJjYW4ndCBzZXR1cCB4bWl0IHF1ZXVlXG4iKTsKIAkJCXJldCA9IFBUUl9FUlIodHhxKTsKIAkJCWdvdG8gZXJyX3F1ZXVlczsKIAkJfQotCQl0eHEgPSBhdGg1a190eHFfc2V0dXAoc2MsIEFSNUtfVFhfUVVFVUVfREFUQSwgQVI1S19XTUVfQUNfQkspOworCQl0eHEgPSBhdGg1a190eHFfc2V0dXAoYWgsIEFSNUtfVFhfUVVFVUVfREFUQSwgQVI1S19XTUVfQUNfQkspOwogCQlpZiAoSVNfRVJSKHR4cSkpIHsKLQkJCUFUSDVLX0VSUihzYywgImNhbid0IHNldHVwIHhtaXQgcXVldWVcbiIpOworCQkJQVRINUtfRVJSKGFoLCAiY2FuJ3Qgc2V0dXAgeG1pdCBxdWV1ZVxuIik7CiAJCQlyZXQgPSBQVFJfRVJSKHR4cSk7CiAJCQlnb3RvIGVycl9xdWV1ZXM7CiAJCX0KIAkJaHctPnF1ZXVlcyA9IDQ7CiAJfSBlbHNlIHsKIAkJLyogb2xkZXIgaGFyZHdhcmUgKDUyMTApIGNhbiBvbmx5IHN1cHBvcnQgb25lIGRhdGEgcXVldWUgKi8KLQkJdHhxID0gYXRoNWtfdHhxX3NldHVwKHNjLCBBUjVLX1RYX1FVRVVFX0RBVEEsIEFSNUtfV01FX0FDX0JFKTsKKwkJdHhxID0gYXRoNWtfdHhxX3NldHVwKGFoLCBBUjVLX1RYX1FVRVVFX0RBVEEsIEFSNUtfV01FX0FDX0JFKTsKIAkJaWYgKElTX0VSUih0eHEpKSB7Ci0JCQlBVEg1S19FUlIoc2MsICJjYW4ndCBzZXR1cCB4bWl0IHF1ZXVlXG4iKTsKKwkJCUFUSDVLX0VSUihhaCwgImNhbid0IHNldHVwIHhtaXQgcXVldWVcbiIpOwogCQkJcmV0ID0gUFRSX0VSUih0eHEpOwogCQkJZ290byBlcnJfcXVldWVzOwogCQl9CiAJCWh3LT5xdWV1ZXMgPSAxOwogCX0KIAotCXRhc2tsZXRfaW5pdCgmc2MtPnJ4dHEsIGF0aDVrX3Rhc2tsZXRfcngsICh1bnNpZ25lZCBsb25nKXNjKTsKLQl0YXNrbGV0X2luaXQoJnNjLT50eHRxLCBhdGg1a190YXNrbGV0X3R4LCAodW5zaWduZWQgbG9uZylzYyk7Ci0JdGFza2xldF9pbml0KCZzYy0+Y2FsaWIsIGF0aDVrX3Rhc2tsZXRfY2FsaWJyYXRlLCAodW5zaWduZWQgbG9uZylzYyk7Ci0JdGFza2xldF9pbml0KCZzYy0+YmVhY29udHEsIGF0aDVrX3Rhc2tsZXRfYmVhY29uLCAodW5zaWduZWQgbG9uZylzYyk7Ci0JdGFza2xldF9pbml0KCZzYy0+YW5pX3Rhc2tsZXQsIGF0aDVrX3Rhc2tsZXRfYW5pLCAodW5zaWduZWQgbG9uZylzYyk7CisJdGFza2xldF9pbml0KCZhaC0+cnh0cSwgYXRoNWtfdGFza2xldF9yeCwgKHVuc2lnbmVkIGxvbmcpYWgpOworCXRhc2tsZXRfaW5pdCgmYWgtPnR4dHEsIGF0aDVrX3Rhc2tsZXRfdHgsICh1bnNpZ25lZCBsb25nKWFoKTsKKwl0YXNrbGV0X2luaXQoJmFoLT5jYWxpYiwgYXRoNWtfdGFza2xldF9jYWxpYnJhdGUsICh1bnNpZ25lZCBsb25nKWFoKTsKKwl0YXNrbGV0X2luaXQoJmFoLT5iZWFjb250cSwgYXRoNWtfdGFza2xldF9iZWFjb24sICh1bnNpZ25lZCBsb25nKWFoKTsKKwl0YXNrbGV0X2luaXQoJmFoLT5hbmlfdGFza2xldCwgYXRoNWtfdGFza2xldF9hbmksICh1bnNpZ25lZCBsb25nKWFoKTsKIAotCUlOSVRfV09SSygmc2MtPnJlc2V0X3dvcmssIGF0aDVrX3Jlc2V0X3dvcmspOwotCUlOSVRfREVMQVlFRF9XT1JLKCZzYy0+dHhfY29tcGxldGVfd29yaywgYXRoNWtfdHhfY29tcGxldGVfcG9sbF93b3JrKTsKKwlJTklUX1dPUksoJmFoLT5yZXNldF93b3JrLCBhdGg1a19yZXNldF93b3JrKTsKKwlJTklUX0RFTEFZRURfV09SSygmYWgtPnR4X2NvbXBsZXRlX3dvcmssIGF0aDVrX3R4X2NvbXBsZXRlX3BvbGxfd29yayk7CiAKIAlyZXQgPSBhdGg1a19od19jb21tb24oYWgpLT5idXNfb3BzLT5lZXByb21fcmVhZF9tYWMoYWgsIG1hYyk7CiAJaWYgKHJldCkgewotCQlBVEg1S19FUlIoc2MsICJ1bmFibGUgdG8gcmVhZCBhZGRyZXNzIGZyb20gRUVQUk9NXG4iKTsKKwkJQVRINUtfRVJSKGFoLCAidW5hYmxlIHRvIHJlYWQgYWRkcmVzcyBmcm9tIEVFUFJPTVxuIik7CiAJCWdvdG8gZXJyX3F1ZXVlczsKIAl9CiAKIAlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihodywgbWFjKTsKLQltZW1jcHkoJnNjLT5sbGFkZHIsIG1hYywgRVRIX0FMRU4pOworCW1lbWNweSgmYWgtPmxsYWRkciwgbWFjLCBFVEhfQUxFTik7CiAJLyogQWxsIE1BQyBhZGRyZXNzIGJpdHMgbWF0dGVyIGZvciBBQ0tzICovCi0JYXRoNWtfdXBkYXRlX2Jzc2lkX21hc2tfYW5kX29wbW9kZShzYywgTlVMTCk7CisJYXRoNWtfdXBkYXRlX2Jzc2lkX21hc2tfYW5kX29wbW9kZShhaCwgTlVMTCk7CiAKIAlyZWd1bGF0b3J5LT5jdXJyZW50X3JkID0gYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tLmVlX3JlZ2RvbWFpbjsKIAlyZXQgPSBhdGhfcmVnZF9pbml0KHJlZ3VsYXRvcnksIGh3LT53aXBoeSwgYXRoNWtfcmVnX25vdGlmaWVyKTsKIAlpZiAocmV0KSB7Ci0JCUFUSDVLX0VSUihzYywgImNhbid0IGluaXRpYWxpemUgcmVndWxhdG9yeSBzeXN0ZW1cbiIpOworCQlBVEg1S19FUlIoYWgsICJjYW4ndCBpbml0aWFsaXplIHJlZ3VsYXRvcnkgc3lzdGVtXG4iKTsKIAkJZ290byBlcnJfcXVldWVzOwogCX0KIAogCXJldCA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyhodyk7CiAJaWYgKHJldCkgewotCQlBVEg1S19FUlIoc2MsICJjYW4ndCByZWdpc3RlciBpZWVlODAyMTEgaHdcbiIpOworCQlBVEg1S19FUlIoYWgsICJjYW4ndCByZWdpc3RlciBpZWVlODAyMTEgaHdcbiIpOwogCQlnb3RvIGVycl9xdWV1ZXM7CiAJfQogCiAJaWYgKCFhdGhfaXNfd29ybGRfcmVnZChyZWd1bGF0b3J5KSkKIAkJcmVndWxhdG9yeV9oaW50KGh3LT53aXBoeSwgcmVndWxhdG9yeS0+YWxwaGEyKTsKIAotCWF0aDVrX2luaXRfbGVkcyhzYyk7CisJYXRoNWtfaW5pdF9sZWRzKGFoKTsKIAotCWF0aDVrX3N5c2ZzX3JlZ2lzdGVyKHNjKTsKKwlhdGg1a19zeXNmc19yZWdpc3RlcihhaCk7CiAKIAlyZXR1cm4gMDsKIGVycl9xdWV1ZXM6Ci0JYXRoNWtfdHhxX3JlbGVhc2Uoc2MpOworCWF0aDVrX3R4cV9yZWxlYXNlKGFoKTsKIGVycl9iaGFsOgotCWF0aDVrX2h3X3JlbGVhc2VfdHhfcXVldWUoYWgsIHNjLT5iaGFscSk7CisJYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZShhaCwgYWgtPmJoYWxxKTsKIGVycl9kZXNjOgotCWF0aDVrX2Rlc2NfZnJlZShzYyk7CisJYXRoNWtfZGVzY19mcmVlKGFoKTsKIGVycjoKIAlyZXR1cm4gcmV0OwogfQogCiB2b2lkCi1hdGg1a19kZWluaXRfc29mdGMoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK2F0aDVrX2RlaW5pdF9zb2Z0YyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gc2MtPmh3OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gYWgtPmh3OwogCiAJLyoKIAkgKiBOQjogdGhlIG9yZGVyIG9mIHRoZXNlIGlzIGltcG9ydGFudDoKQEAgLTI5NDEsMjMgKzI5MTYsMjMgQEAKIAkgKiBPdGhlciB0aGFuIHRoYXQsIGl0J3Mgc3RyYWlnaHRmb3J3YXJkLi4uCiAJICovCiAJaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcoaHcpOwotCWF0aDVrX2Rlc2NfZnJlZShzYyk7Ci0JYXRoNWtfdHhxX3JlbGVhc2Uoc2MpOwotCWF0aDVrX2h3X3JlbGVhc2VfdHhfcXVldWUoc2MtPmFoLCBzYy0+YmhhbHEpOwotCWF0aDVrX3VucmVnaXN0ZXJfbGVkcyhzYyk7CisJYXRoNWtfZGVzY19mcmVlKGFoKTsKKwlhdGg1a190eHFfcmVsZWFzZShhaCk7CisJYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZShhaCwgYWgtPmJoYWxxKTsKKwlhdGg1a191bnJlZ2lzdGVyX2xlZHMoYWgpOwogCi0JYXRoNWtfc3lzZnNfdW5yZWdpc3RlcihzYyk7CisJYXRoNWtfc3lzZnNfdW5yZWdpc3RlcihhaCk7CiAJLyoKIAkgKiBOQjogY2FuJ3QgcmVjbGFpbSB0aGVzZSB1bnRpbCBhZnRlciBpZWVlODAyMTFfaWZkZXRhY2gKIAkgKiByZXR1cm5zIGJlY2F1c2Ugd2UnbGwgZ2V0IGNhbGxlZCBiYWNrIHRvIHJlY2xhaW0gbm9kZQogCSAqIHN0YXRlIGFuZCBwb3RlbnRpYWxseSB3YW50IHRvIHVzZSB0aGVtLgogCSAqLwotCWF0aDVrX2h3X2RlaW5pdChzYy0+YWgpOwotCWZyZWVfaXJxKHNjLT5pcnEsIHNjKTsKKwlhdGg1a19od19kZWluaXQoYWgpOworCWZyZWVfaXJxKGFoLT5pcnEsIGFoKTsKIH0KIAogYm9vbAotYXRoX2FueV92aWZfYXNzb2Moc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK2F0aDVrX2FueV92aWZfYXNzb2Moc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgYXRoNWtfdmlmX2l0ZXJfZGF0YSBpdGVyX2RhdGE7CiAJaXRlcl9kYXRhLmh3X21hY2FkZHIgPSBOVUxMOwpAQCAtMjk2NSwxNiArMjk0MCwxNSBAQAogCWl0ZXJfZGF0YS5uZWVkX3NldF9od19hZGRyID0gZmFsc2U7CiAJaXRlcl9kYXRhLmZvdW5kX2FjdGl2ZSA9IHRydWU7CiAKLQlpZWVlODAyMTFfaXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlc19hdG9taWMoc2MtPmh3LCBhdGg1a192aWZfaXRlciwKKwlpZWVlODAyMTFfaXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlc19hdG9taWMoYWgtPmh3LCBhdGg1a192aWZfaXRlciwKIAkJCQkJCSAgICZpdGVyX2RhdGEpOwogCXJldHVybiBpdGVyX2RhdGEuYW55X2Fzc29jOwogfQogCiB2b2lkCi1zZXRfYmVhY29uX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBlbmFibGUpCithdGg1a19zZXRfYmVhY29uX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBlbmFibGUpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OwogCXUzMiByZmlsdDsKIAlyZmlsdCA9IGF0aDVrX2h3X2dldF9yeF9maWx0ZXIoYWgpOwogCWlmIChlbmFibGUpCkBAIC0yOTgyLDUgKzI5NTYsNSBAQAogCWVsc2UKIAkJcmZpbHQgJj0gfkFSNUtfUlhfRklMVEVSX0JFQUNPTjsKIAlhdGg1a19od19zZXRfcnhfZmlsdGVyKGFoLCByZmlsdCk7Ci0Jc2MtPmZpbHRlcl9mbGFncyA9IHJmaWx0OworCWFoLT5maWx0ZXJfZmxhZ3MgPSByZmlsdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5oCmluZGV4IGIyOTRmMzMuLmE4MWYyOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuaApAQCAtNDUsMjMgKzQ1LDEzIEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNsdWRlICJhdGg1ay5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYW5pLmgiCi0KICNpbmNsdWRlICIuLi9yZWdkLmgiCiAjaW5jbHVkZSAiLi4vYXRoLmgiCiAKLSNkZWZpbmUJQVRIX1JYQlVGCTQwCQkvKiBudW1iZXIgb2YgUlggYnVmZmVycyAqLwotI2RlZmluZQlBVEhfVFhCVUYJMjAwCQkvKiBudW1iZXIgb2YgVFggYnVmZmVycyAqLwotI2RlZmluZSBBVEhfQkNCVUYJNAkJLyogbnVtYmVyIG9mIGJlYWNvbiBidWZmZXJzICovCi0jZGVmaW5lIEFUSDVLX1RYUV9MRU5fTUFYCShBVEhfVFhCVUYgLyA0KQkJLyogYnVmcyBwZXIgcXVldWUgKi8KLSNkZWZpbmUgQVRINUtfVFhRX0xFTl9MT1cJKEFUSDVLX1RYUV9MRU5fTUFYIC8gMikJLyogbG93IG1hcmsgKi8KLQogc3RydWN0IGF0aDVrX2J1ZiB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXN0cnVjdCBhdGg1a19kZXNjCSpkZXNjOwkvKiB2aXJ0dWFsIGFkZHIgb2YgZGVzYyAqLwpAQCAtNzAsOTUgKzYwLDYgQEAKIAlkbWFfYWRkcl90CQlza2JhZGRyOy8qIHBoeXNpY2FsIGFkZHIgb2Ygc2tiIGRhdGEgKi8KIH07CiAKLS8qCi0gKiBEYXRhIHRyYW5zbWl0IHF1ZXVlIHN0YXRlLiAgT25lIG9mIHRoZXNlIGV4aXN0cyBmb3IgZWFjaAotICogaGFyZHdhcmUgdHJhbnNtaXQgcXVldWUuICBQYWNrZXRzIHNlbnQgdG8gdXMgZnJvbSBhYm92ZQotICogYXJlIGFzc2lnbmVkIHRvIHF1ZXVlcyBiYXNlZCBvbiB0aGVpciBwcmlvcml0eS4gIE5vdCBhbGwKLSAqIGRldmljZXMgc3VwcG9ydCBhIGNvbXBsZXRlIHNldCBvZiBoYXJkd2FyZSB0cmFuc21pdCBxdWV1ZXMuCi0gKiBGb3IgdGhvc2UgZGV2aWNlcyB0aGUgYXJyYXkgc2NfYWMycSB3aWxsIG1hcCBtdWx0aXBsZQotICogcHJpb3JpdGllcyB0byBmZXdlciBoYXJkd2FyZSBxdWV1ZXMgKHR5cGljYWxseSBhbGwgdG8gb25lCi0gKiBoYXJkd2FyZSBxdWV1ZSkuCi0gKi8KLXN0cnVjdCBhdGg1a190eHEgewotCXVuc2lnbmVkIGludAkJcW51bTsJLyogaGFyZHdhcmUgcSBudW1iZXIgKi8KLQl1MzIJCQkqbGluazsJLyogbGluayBwdHIgaW4gbGFzdCBUWCBkZXNjICovCi0Jc3RydWN0IGxpc3RfaGVhZAlxOwkvKiB0cmFuc21pdCBxdWV1ZSAqLwotCXNwaW5sb2NrX3QJCWxvY2s7CS8qIGxvY2sgb24gcSBhbmQgbGluayAqLwotCWJvb2wJCQlzZXR1cDsKLQlpbnQJCQl0eHFfbGVuOyAvKiBudW1iZXIgb2YgcXVldWVkIGJ1ZmZlcnMgKi8KLQlpbnQJCQl0eHFfbWF4OyAvKiBtYXggYWxsb3dlZCBudW0gb2YgcXVldWVkIGJ1ZmZlcnMgKi8KLQlib29sCQkJdHhxX3BvbGxfbWFyazsKLQl1bnNpZ25lZCBpbnQJCXR4cV9zdHVjazsJLyogaW5mb3JtYXRpb25hbCBjb3VudGVyICovCi19OwotCi0jZGVmaW5lIEFUSDVLX0xFRF9NQVhfTkFNRV9MRU4gMzEKLQotLyoKLSAqIFN0YXRlIGZvciBMRUQgdHJpZ2dlcnMKLSAqLwotc3RydWN0IGF0aDVrX2xlZAotewotCWNoYXIgbmFtZVtBVEg1S19MRURfTUFYX05BTUVfTEVOICsgMV07CS8qIG5hbWUgb2YgdGhlIExFRCBpbiBzeXNmcyAqLwotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2M7CQkJLyogZHJpdmVyIHN0YXRlICovCi0Jc3RydWN0IGxlZF9jbGFzc2RldiBsZWRfZGV2OwkJLyogbGVkIGNsYXNzZGV2ICovCi19OwotCi0vKiBSZmtpbGwgKi8KLXN0cnVjdCBhdGg1a19yZmtpbGwgewotCS8qIEdQSU8gUElOIGZvciByZmtpbGwgKi8KLQl1MTYgZ3BpbzsKLQkvKiBwb2xhcml0eSBvZiByZmtpbGwgR1BJTyBQSU4gKi8KLQlib29sIHBvbGFyaXR5OwotCS8qIFJGS0lMTCB0b2dnbGUgdGFza2xldCAqLwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0b2dnbGVxOwotfTsKLQotLyogc3RhdGlzdGljcyAqLwotc3RydWN0IGF0aDVrX3N0YXRpc3RpY3MgewotCS8qIGFudGVubmEgdXNlICovCi0JdW5zaWduZWQgaW50IGFudGVubmFfcnhbNV07CS8qIGZyYW1lcyBjb3VudCBwZXIgYW50ZW5uYSBSWCAqLwotCXVuc2lnbmVkIGludCBhbnRlbm5hX3R4WzVdOwkvKiBmcmFtZXMgY291bnQgcGVyIGFudGVubmEgVFggKi8KLQotCS8qIGZyYW1lIGVycm9ycyAqLwotCXVuc2lnbmVkIGludCByeF9hbGxfY291bnQ7CS8qIGFsbCBSWCBmcmFtZXMsIGluY2x1ZGluZyBlcnJvcnMgKi8KLQl1bnNpZ25lZCBpbnQgdHhfYWxsX2NvdW50OwkvKiBhbGwgVFggZnJhbWVzLCBpbmNsdWRpbmcgZXJyb3JzICovCi0JdW5zaWduZWQgaW50IHJ4X2J5dGVzX2NvdW50OwkvKiBhbGwgUlggYnl0ZXMsIGluY2x1ZGluZyBlcnJvcmVkIHBrcwotCQkJCQkgKiBhbmQgdGhlIE1BQyBoZWFkZXJzIGZvciBlYWNoIHBhY2tldAotCQkJCQkgKi8KLQl1bnNpZ25lZCBpbnQgdHhfYnl0ZXNfY291bnQ7CS8qIGFsbCBUWCBieXRlcywgaW5jbHVkaW5nIGVycm9yZWQgcGt0cwotCQkJCQkgKiBhbmQgdGhlIE1BQyBoZWFkZXJzIGFuZCBwYWRkaW5nIGZvcgotCQkJCQkgKiBlYWNoIHBhY2tldC4KLQkJCQkJICovCi0JdW5zaWduZWQgaW50IHJ4ZXJyX2NyYzsKLQl1bnNpZ25lZCBpbnQgcnhlcnJfcGh5OwotCXVuc2lnbmVkIGludCByeGVycl9waHlfY29kZVszMl07Ci0JdW5zaWduZWQgaW50IHJ4ZXJyX2ZpZm87Ci0JdW5zaWduZWQgaW50IHJ4ZXJyX2RlY3J5cHQ7Ci0JdW5zaWduZWQgaW50IHJ4ZXJyX21pYzsKLQl1bnNpZ25lZCBpbnQgcnhlcnJfcHJvYzsKLQl1bnNpZ25lZCBpbnQgcnhlcnJfanVtYm87Ci0JdW5zaWduZWQgaW50IHR4ZXJyX3JldHJ5OwotCXVuc2lnbmVkIGludCB0eGVycl9maWZvOwotCXVuc2lnbmVkIGludCB0eGVycl9maWx0OwotCi0JLyogTUlCIGNvdW50ZXJzICovCi0JdW5zaWduZWQgaW50IGFja19mYWlsOwotCXVuc2lnbmVkIGludCBydHNfZmFpbDsKLQl1bnNpZ25lZCBpbnQgcnRzX29rOwotCXVuc2lnbmVkIGludCBmY3NfZXJyb3I7Ci0JdW5zaWduZWQgaW50IGJlYWNvbnM7Ci0KLQl1bnNpZ25lZCBpbnQgbWliX2ludHI7Ci0JdW5zaWduZWQgaW50IHJ4b3JuX2ludHI7Ci0JdW5zaWduZWQgaW50IHJ4ZW9sX2ludHI7Ci19OwotCi0jaWYgQ0hBTl9ERUJVRwotI2RlZmluZSBBVEhfQ0hBTl9NQVgJKDI2KzI2KzI2KzIwMCsyMDApCi0jZWxzZQotI2RlZmluZSBBVEhfQ0hBTl9NQVgJKDE0KzE0KzE0KzI1MisyMCkKLSNlbmRpZgotCiBzdHJ1Y3QgYXRoNWtfdmlmIHsKIAlib29sCQkJYXNzb2M7IC8qIGFyZSB3ZSBhc3NvY2lhdGVkIG9yIG5vdCAqLwogCWVudW0gbmw4MDIxMV9pZnR5cGUJb3Btb2RlOwpAQCAtMTY3LDEwNCArNjgsNiBAQAogCXU4CQkJbGxhZGRyW0VUSF9BTEVOXTsKIH07CiAKLS8qIFNvZnR3YXJlIENhcnJpZXIsIGtlZXBzIHRyYWNrIG9mIHRoZSBkcml2ZXIgc3RhdGUKLSAqIGFzc29jaWF0ZWQgd2l0aCBhbiBpbnN0YW5jZSBvZiBhIGRldmljZSAqLwotc3RydWN0IGF0aDVrX3NvZnRjIHsKLQlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7Ci0Jc3RydWN0IGRldmljZQkJKmRldjsJCS8qIGZvciBkbWEgbWFwcGluZyAqLwotCWludCBpcnE7Ci0JdTE2IGRldmlkOwotCXZvaWQgX19pb21lbQkJKmlvYmFzZTsJLyogYWRkcmVzcyBvZiB0aGUgZGV2aWNlICovCi0Jc3RydWN0IG11dGV4CQlsb2NrOwkJLyogZGV2LWxldmVsIGxvY2sgKi8KLQlzdHJ1Y3QgaWVlZTgwMjExX2h3CSpodzsJCS8qIElFRUUgODAyLjExIGNvbW1vbiAqLwotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgc2JhbmRzW0lFRUU4MDIxMV9OVU1fQkFORFNdOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBjaGFubmVsc1tBVEhfQ0hBTl9NQVhdOwotCXN0cnVjdCBpZWVlODAyMTFfcmF0ZQlyYXRlc1tJRUVFODAyMTFfTlVNX0JBTkRTXVtBUjVLX01BWF9SQVRFU107Ci0JczgJCQlyYXRlX2lkeFtJRUVFODAyMTFfTlVNX0JBTkRTXVtBUjVLX01BWF9SQVRFU107Ci0JZW51bSBubDgwMjExX2lmdHlwZQlvcG1vZGU7Ci0Jc3RydWN0IGF0aDVrX2h3CQkqYWg7CQkvKiBBdGhlcm9zIEhXICovCi0KLSNpZmRlZiBDT05GSUdfQVRINUtfREVCVUcKLQlzdHJ1Y3QgYXRoNWtfZGJnX2luZm8JZGVidWc7CQkvKiBkZWJ1ZyBpbmZvICovCi0jZW5kaWYgLyogQ09ORklHX0FUSDVLX0RFQlVHICovCi0KLQlzdHJ1Y3QgYXRoNWtfYnVmCSpidWZwdHI7CS8qIGFsbG9jYXRlZCBidWZmZXIgcHRyICovCi0Jc3RydWN0IGF0aDVrX2Rlc2MJKmRlc2M7CQkvKiBUWC9SWCBkZXNjcmlwdG9ycyAqLwotCWRtYV9hZGRyX3QJCWRlc2NfZGFkZHI7CS8qIERNQSAocGh5c2ljYWwpIGFkZHJlc3MgKi8KLQlzaXplX3QJCQlkZXNjX2xlbjsJLyogc2l6ZSBvZiBUWC9SWCBkZXNjcmlwdG9ycyAqLwotCi0JREVDTEFSRV9CSVRNQVAoc3RhdHVzLCA2KTsKLSNkZWZpbmUgQVRIX1NUQVRfSU5WQUxJRAkwCQkvKiBkaXNhYmxlIGhhcmR3YXJlIGFjY2Vzc2VzICovCi0jZGVmaW5lIEFUSF9TVEFUX01SUkVUUlkJMQkJLyogbXVsdGktcmF0ZSByZXRyeSBzdXBwb3J0ICovCi0jZGVmaW5lIEFUSF9TVEFUX1BST01JU0MJMgotI2RlZmluZSBBVEhfU1RBVF9MRURTT0ZUCTMJCS8qIGVuYWJsZSBMRUQgZ3BpbyBzdGF0dXMgKi8KLSNkZWZpbmUgQVRIX1NUQVRfU1RBUlRFRAk0CQkvKiBvcGVuZWQgJiBpcnFzIGVuYWJsZWQgKi8KLSNkZWZpbmUgQVRIX1NUQVRfMkdfRElTQUJMRUQJNQkJLyogbXVsdGliYW5kIHJhZGlvIHdpdGhvdXQgMkcgKi8KLQotCXVuc2lnbmVkIGludAkJZmlsdGVyX2ZsYWdzOwkvKiBIVyBmbGFncywgQVI1S19SWF9GSUxURVJfKiAqLwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY3VyY2hhbjsJLyogY3VycmVudCBoL3cgY2hhbm5lbCAqLwotCi0JdTE2CQkJbnZpZnM7Ci0KLQllbnVtIGF0aDVrX2ludAkJaW1hc2s7CQkvKiBpbnRlcnJ1cHQgbWFzayBjb3B5ICovCi0KLQlzcGlubG9ja190CQlpcnFsb2NrOwotCWJvb2wJCQlyeF9wZW5kaW5nOwkvKiByeCB0YXNrbGV0IHBlbmRpbmcgKi8KLQlib29sCQkJdHhfcGVuZGluZzsJLyogdHggdGFza2xldCBwZW5kaW5nICovCi0KLQl1OAkJCWxsYWRkcltFVEhfQUxFTl07Ci0JdTgJCQlic3NpZG1hc2tbRVRIX0FMRU5dOwotCi0JdW5zaWduZWQgaW50CQlsZWRfcGluLAkvKiBHUElPIHBpbiBmb3IgZHJpdmluZyBMRUQgKi8KLQkJCQlsZWRfb247CQkvKiBwaW4gc2V0dGluZyBmb3IgTEVEIG9uICovCi0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcmVzZXRfd29yazsJLyogZGVmZXJyZWQgY2hpcCByZXNldCAqLwotCi0JdW5zaWduZWQgaW50CQlyeGJ1ZnNpemU7CS8qIHJ4IHNpemUgYmFzZWQgb24gbXR1ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlyeGJ1ZjsJCS8qIHJlY2VpdmUgYnVmZmVyICovCi0Jc3BpbmxvY2tfdAkJcnhidWZsb2NrOwotCXUzMgkJCSpyeGxpbms7CS8qIGxpbmsgcHRyIGluIGxhc3QgUlggZGVzYyAqLwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlyeHRxOwkJLyogcnggaW50ciB0YXNrbGV0ICovCi0Jc3RydWN0IGF0aDVrX2xlZAlyeF9sZWQ7CQkvKiByeCBsZWQgKi8KLQotCXN0cnVjdCBsaXN0X2hlYWQJdHhidWY7CQkvKiB0cmFuc21pdCBidWZmZXIgKi8KLQlzcGlubG9ja190CQl0eGJ1ZmxvY2s7Ci0JdW5zaWduZWQgaW50CQl0eGJ1Zl9sZW47CS8qIGJ1ZiBjb3VudCBpbiB0eGJ1ZiBsaXN0ICovCi0Jc3RydWN0IGF0aDVrX3R4cQl0eHFzW0FSNUtfTlVNX1RYX1FVRVVFU107CS8qIHR4IHF1ZXVlcyAqLwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0eHRxOwkJLyogdHggaW50ciB0YXNrbGV0ICovCi0Jc3RydWN0IGF0aDVrX2xlZAl0eF9sZWQ7CQkvKiB0eCBsZWQgKi8KLQotCXN0cnVjdCBhdGg1a19yZmtpbGwJcmZfa2lsbDsKLQotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAljYWxpYjsJCS8qIGNhbGlicmF0aW9uIHRhc2tsZXQgKi8KLQotCXNwaW5sb2NrX3QJCWJsb2NrOwkJLyogcHJvdGVjdHMgYmVhY29uICovCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CWJlYWNvbnRxOwkvKiBiZWFjb24gaW50ciB0YXNrbGV0ICovCi0Jc3RydWN0IGxpc3RfaGVhZAliY2J1ZjsJCS8qIGJlYWNvbiBidWZmZXIgKi8KLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZgkqYnNsb3RbQVRIX0JDQlVGXTsKLQl1MTYJCQludW1fYXBfdmlmczsKLQl1MTYJCQludW1fYWRob2NfdmlmczsKLQl1bnNpZ25lZCBpbnQJCWJoYWxxLAkJLyogU1cgcSBmb3Igb3V0Z29pbmcgYmVhY29ucyAqLwotCQkJCWJtaXNzY291bnQsCS8qIG1pc3NlZCBiZWFjb24gdHJhbnNtaXRzICovCi0JCQkJYmludHZhbCwJLyogYmVhY29uIGludGVydmFsIGluIFRVICovCi0JCQkJYnNlbnQ7Ci0JdW5zaWduZWQgaW50CQluZXh0dGJ0dDsJLyogbmV4dCBiZWFjb24gdGltZSBpbiBUVSAqLwotCXN0cnVjdCBhdGg1a190eHEJKmNhYnE7CQkvKiBjb250ZW50IGFmdGVyIGJlYWNvbiAqLwotCi0JaW50IAkJCXBvd2VyX2xldmVsOwkvKiBSZXF1ZXN0ZWQgdHggcG93ZXIgaW4gZGJtICovCi0JYm9vbAkJCWFzc29jOwkJLyogYXNzb2NpYXRlIHN0YXRlICovCi0JYm9vbAkJCWVuYWJsZV9iZWFjb247CS8qIHRydWUgaWYgYmVhY29ucyBhcmUgb24gKi8KLQotCXN0cnVjdCBhdGg1a19zdGF0aXN0aWNzCXN0YXRzOwotCi0Jc3RydWN0IGF0aDVrX2FuaV9zdGF0ZQlhbmlfc3RhdGU7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CWFuaV90YXNrbGV0OwkvKiBBTkkgY2FsaWJyYXRpb24gKi8KLQotCXN0cnVjdCBkZWxheWVkX3dvcmsJdHhfY29tcGxldGVfd29yazsKLQotCXN0cnVjdCBzdXJ2ZXlfaW5mbwlzdXJ2ZXk7CQkvKiBjb2xsZWN0ZWQgc3VydmV5IGluZm8gKi8KLX07Ci0KIHN0cnVjdCBhdGg1a192aWZfaXRlcl9kYXRhIHsKIAljb25zdCB1OAkqaHdfbWFjYWRkcjsKIAl1OAkJbWFza1tFVEhfQUxFTl07CkBAIC0yNzgsOSArODEsMTAgQEAKIHZvaWQgYXRoNWtfdmlmX2l0ZXIodm9pZCAqZGF0YSwgdTggKm1hYywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CiAKIAotI2RlZmluZSBhdGg1a19od19oYXNic3NpZG1hc2soX2FoKSBcCi0JKGF0aDVrX2h3X2dldF9jYXBhYmlsaXR5KF9haCwgQVI1S19DQVBfQlNTSURNQVNLLCAwLCBOVUxMKSA9PSAwKQotI2RlZmluZSBhdGg1a19od19oYXN2ZW9sKF9haCkgXAotCShhdGg1a19od19nZXRfY2FwYWJpbGl0eShfYWgsIEFSNUtfQ0FQX1ZFT0wsIDAsIE5VTEwpID09IDApCisvKiBDaGVjayB3aGV0aGVyIEJTU0lEIG1hc2sgaXMgc3VwcG9ydGVkICovCisjZGVmaW5lIGF0aDVrX2h3X2hhc2Jzc2lkbWFzayhfYWgpIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikKKworLyogQ2hlY2sgd2hldGhlciB2aXJ0dWFsIEVPTCBpcyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgYXRoNWtfaHdfaGFzdmVvbChfYWgpIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvY2Fwcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2NhcHMuYwppbmRleCA3ZGQ4OGUxLi5lZWZlNjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvY2Fwcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9jYXBzLmMKQEAgLTUyLDggKzUyLDggQEAKIAkJX19zZXRfYml0KEFSNUtfTU9ERV8xMUEsIGNhcHMtPmNhcF9tb2RlKTsKIAl9IGVsc2UgewogCQkvKgotCQkgKiBYWFggVGhlIHRyYW5jZWl2ZXIgc3VwcG9ydHMgZnJlcXVlbmNpZXMgZnJvbSA0OTIwIHRvIDYxMDBHSHoKLQkJICogWFhYIGFuZCBmcm9tIDIzMTIgdG8gMjczMkdIei4gVGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlCisJCSAqIFhYWCBUaGUgdHJhbnNjZWl2ZXIgc3VwcG9ydHMgZnJlcXVlbmNpZXMgZnJvbSA0OTIwIHRvIDYxMDBNSHoKKwkJICogWFhYIGFuZCBmcm9tIDIzMTIgdG8gMjczMk1Iei4gVGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlCiAJCSAqIFhYWCBjdXJyZW50IGllZWU4MDIxMSBpbXBsZW1lbnRhdGlvbiBiZWNhdXNlIHRoZSBJRUVFCiAJCSAqIFhYWCBjaGFubmVsIG1hcHBpbmcgZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSBjaGFubmVsCiAJCSAqIFhYWCBudW1iZXJzICgyMzEyTUh6IGlzIGNoYW5uZWwgLTE5KS4gT2YgY291cnNlLCB0aGlzCkBAIC0xMTIsNTEgKzExMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIE1haW4gZnVuY3Rpb24gdXNlZCBieSB0aGUgZHJpdmVyIHBhcnQgdG8gY2hlY2sgY2FwcyAqLwotaW50IGF0aDVrX2h3X2dldF9jYXBhYmlsaXR5KHN0cnVjdCBhdGg1a19odyAqYWgsCi0JCWVudW0gYXRoNWtfY2FwYWJpbGl0eV90eXBlIGNhcF90eXBlLAotCQl1MzIgY2FwYWJpbGl0eSwgdTMyICpyZXN1bHQpCi17Ci0Jc3dpdGNoIChjYXBfdHlwZSkgewotCWNhc2UgQVI1S19DQVBfTlVNX1RYUVVFVUVTOgotCQlpZiAocmVzdWx0KSB7Ci0JCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApCi0JCQkJKnJlc3VsdCA9IEFSNUtfTlVNX1RYX1FVRVVFU19OT1FDVTsKLQkJCWVsc2UKLQkJCQkqcmVzdWx0ID0gQVI1S19OVU1fVFhfUVVFVUVTOwotCQkJZ290byB5ZXM7Ci0JCX0KLQljYXNlIEFSNUtfQ0FQX1ZFT0w6Ci0JCWdvdG8geWVzOwotCWNhc2UgQVI1S19DQVBfQ09NUFJFU1NJT046Ci0JCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikKLQkJCWdvdG8geWVzOwotCQllbHNlCi0JCQlnb3RvIG5vOwotCWNhc2UgQVI1S19DQVBfQlVSU1Q6Ci0JCWdvdG8geWVzOwotCWNhc2UgQVI1S19DQVBfVFBDOgotCQlnb3RvIHllczsKLQljYXNlIEFSNUtfQ0FQX0JTU0lETUFTSzoKLQkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKQotCQkJZ290byB5ZXM7Ci0JCWVsc2UKLQkJCWdvdG8gbm87Ci0JY2FzZSBBUjVLX0NBUF9YUjoKLQkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKQotCQkJZ290byB5ZXM7Ci0JCWVsc2UKLQkJCWdvdG8gbm87Ci0JZGVmYXVsdDoKLQkJZ290byBubzsKLQl9Ci0KLW5vOgotCXJldHVybiAtRUlOVkFMOwoteWVzOgotCXJldHVybiAwOwotfQotCiAvKgogICogVE9ETzogRm9sbG93aW5nIGZ1bmN0aW9ucyBzaG91bGQgYmUgcGFydCBvZiBhIG5ldyBmdW5jdGlvbgogICogc2V0X2NhcGFiaWxpdHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKaW5kZXggMGJmNzMxMy4uY2NjYTcyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKQEAgLTE1NywxMCArMTU3LDEwIEBACiAKIHN0YXRpYyBpbnQgcmVnX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnApCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2VxLT5wcml2YXRlOwogCXN0cnVjdCByZWcgKnIgPSBwOwogCXNlcV9wcmludGYoc2VxLCAiJS0yNXMweCUwOHhcbiIsIHItPm5hbWUsCi0JCWF0aDVrX2h3X3JlZ19yZWFkKHNjLT5haCwgci0+YWRkcikpOworCQlhdGg1a19od19yZWdfcmVhZChhaCwgci0+YWRkcikpOwogCXJldHVybiAwOwogfQogCkBAIC0xOTcsNDMgKzE5Nyw0MiBAQAogc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX2JlYWNvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNoYXIgYnVmWzUwMF07CiAJdW5zaWduZWQgaW50IGxlbiA9IDA7CiAJdW5zaWduZWQgaW50IHY7CiAJdTY0IHRzZjsKIAotCXYgPSBhdGg1a19od19yZWdfcmVhZChzYy0+YWgsIEFSNUtfQkVBQ09OKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCXYgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19CRUFDT04pOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkiJS0yNHMweCUwOHhcdGludHZhbDogJWRcdFRJTTogMHgleFxuIiwKIAkJIkFSNUtfQkVBQ09OIiwgdiwgdiAmIEFSNUtfQkVBQ09OX1BFUklPRCwKIAkJKHYgJiBBUjVLX0JFQUNPTl9USU0pID4+IEFSNUtfQkVBQ09OX1RJTV9TKTsKIAotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICIlLTI0czB4JTA4eFxuIiwKLQkJIkFSNUtfTEFTVF9UU1RQIiwgYXRoNWtfaHdfcmVnX3JlYWQoc2MtPmFoLCBBUjVLX0xBU1RfVFNUUCkpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiJS0yNHMweCUwOHhcbiIsCisJCSJBUjVLX0xBU1RfVFNUUCIsIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0xBU1RfVFNUUCkpOwogCi0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgIiUtMjRzMHglMDh4XG5cbiIsCi0JCSJBUjVLX0JFQUNPTl9DTlQiLCBhdGg1a19od19yZWdfcmVhZChzYy0+YWgsIEFSNUtfQkVBQ09OX0NOVCkpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiJS0yNHMweCUwOHhcblxuIiwKKwkJIkFSNUtfQkVBQ09OX0NOVCIsIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0JFQUNPTl9DTlQpKTsKIAotCXYgPSBhdGg1a19od19yZWdfcmVhZChzYy0+YWgsIEFSNUtfVElNRVIwKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiJS0yNHMweCUwOHhcdFRVOiAlMDh4XG4iLAorCXYgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19USU1FUjApOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiJS0yNHMweCUwOHhcdFRVOiAlMDh4XG4iLAogCQkiQVI1S19USU1FUjAgKFRCVFQpIiwgdiwgdik7CiAKLQl2ID0gYXRoNWtfaHdfcmVnX3JlYWQoc2MtPmFoLCBBUjVLX1RJTUVSMSk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgIiUtMjRzMHglMDh4XHRUVTogJTA4eFxuIiwKKwl2ID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfVElNRVIxKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIiUtMjRzMHglMDh4XHRUVTogJTA4eFxuIiwKIAkJIkFSNUtfVElNRVIxIChETUEpIiwgdiwgdiA+PiAzKTsKIAotCXYgPSBhdGg1a19od19yZWdfcmVhZChzYy0+YWgsIEFSNUtfVElNRVIyKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiJS0yNHMweCUwOHhcdFRVOiAlMDh4XG4iLAorCXYgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19USU1FUjIpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiJS0yNHMweCUwOHhcdFRVOiAlMDh4XG4iLAogCQkiQVI1S19USU1FUjIgKFNXQkEpIiwgdiwgdiA+PiAzKTsKIAotCXYgPSBhdGg1a19od19yZWdfcmVhZChzYy0+YWgsIEFSNUtfVElNRVIzKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiJS0yNHMweCUwOHhcdFRVOiAlMDh4XG4iLAorCXYgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19USU1FUjMpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiJS0yNHMweCUwOHhcdFRVOiAlMDh4XG4iLAogCQkiQVI1S19USU1FUjMgKEFUSU0pIiwgdiwgdik7CiAKLQl0c2YgPSBhdGg1a19od19nZXRfdHNmNjQoc2MtPmFoKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCXRzZiA9IGF0aDVrX2h3X2dldF90c2Y2NChhaCk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCSJUU0ZcdFx0MHglMDE2bGx4XHRUVTogJTA4eFxuIiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0c2YsIFRTRl9UT19UVSh0c2YpKTsKIApAQCAtMjQ3LDggKzI0Niw3IEBACiAJCQkJIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAogCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAljaGFyIGJ1ZlsyMF07CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBtaW4oY291bnQsIHNpemVvZihidWYpKSkpCkBAIC0yNzksOSArMjc3LDkgQEAKIAkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCiAJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19SRVNFVCwgImRlYnVnIGZpbGUgdHJpZ2dlcmVkIHJlc2V0XG4iKTsKLQlpZWVlODAyMTFfcXVldWVfd29yayhzYy0+aHcsICZzYy0+cmVzZXRfd29yayk7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX1JFU0VULCAiZGVidWcgZmlsZSB0cmlnZ2VyZWQgcmVzZXRcbiIpOworCWllZWU4MDIxMV9xdWV1ZV93b3JrKGFoLT5odywgJmFoLT5yZXNldF93b3JrKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTMxOCwyMyArMzE2LDIzIEBACiBzdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfZGVidWcoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdGg1a19odyAqYWggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJY2hhciBidWZbNzAwXTsKIAl1bnNpZ25lZCBpbnQgbGVuID0gMDsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCi0JCSJERUJVRyBMRVZFTDogMHglMDh4XG5cbiIsIHNjLT5kZWJ1Zy5sZXZlbCk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCisJCSJERUJVRyBMRVZFTDogMHglMDh4XG5cbiIsIGFoLT5kZWJ1Zy5sZXZlbCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYmdfaW5mbykgLSAxOyBpKyspIHsKLQkJbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCQkiJTEwcyAlYyAweCUwOHggLSAlc1xuIiwgZGJnX2luZm9baV0ubmFtZSwKLQkJCXNjLT5kZWJ1Zy5sZXZlbCAmIGRiZ19pbmZvW2ldLmxldmVsID8gJysnIDogJyAnLAorCQkJYWgtPmRlYnVnLmxldmVsICYgZGJnX2luZm9baV0ubGV2ZWwgPyAnKycgOiAnICcsCiAJCQlkYmdfaW5mb1tpXS5sZXZlbCwgZGJnX2luZm9baV0uZGVzYyk7CiAJfQotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCSIlMTBzICVjIDB4JTA4eCAtICVzXG4iLCBkYmdfaW5mb1tpXS5uYW1lLAotCQlzYy0+ZGVidWcubGV2ZWwgPT0gZGJnX2luZm9baV0ubGV2ZWwgPyAnKycgOiAnICcsCisJCWFoLT5kZWJ1Zy5sZXZlbCA9PSBkYmdfaW5mb1tpXS5sZXZlbCA/ICcrJyA6ICcgJywKIAkJZGJnX2luZm9baV0ubGV2ZWwsIGRiZ19pbmZvW2ldLmRlc2MpOwogCiAJaWYgKGxlbiA+IHNpemVvZihidWYpKQpAQCAtMzQ3LDcgKzM0NSw3IEBACiAJCQkJIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAogCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdGg1a19odyAqYWggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgaW50IGk7CiAJY2hhciBidWZbMjBdOwogCkBAIC0zNTcsNyArMzU1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYmdfaW5mbyk7IGkrKykgewogCQlpZiAoc3RybmNtcChidWYsIGRiZ19pbmZvW2ldLm5hbWUsCiAJCQkJCXN0cmxlbihkYmdfaW5mb1tpXS5uYW1lKSkgPT0gMCkgewotCQkJc2MtPmRlYnVnLmxldmVsIF49IGRiZ19pbmZvW2ldLmxldmVsOyAvKiB0b2dnbGUgYml0ICovCisJCQlhaC0+ZGVidWcubGV2ZWwgXj0gZGJnX2luZm9baV0ubGV2ZWw7IC8qIHRvZ2dsZSBiaXQgKi8KIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMzc4LDY2ICszNzYsNjYgQEAKIHN0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV9hbnRlbm5hKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNoYXIgYnVmWzcwMF07CiAJdW5zaWduZWQgaW50IGxlbiA9IDA7CiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgaW50IHY7CiAKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiYW50ZW5uYSBtb2RlXHQlZFxuIiwKLQkJc2MtPmFoLT5haF9hbnRfbW9kZSk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgImRlZmF1bHQgYW50ZW5uYVx0JWRcbiIsCi0JCXNjLT5haC0+YWhfZGVmX2FudCk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgInR4IGFudGVubmFcdCVkXG4iLAotCQlzYy0+YWgtPmFoX3R4X2FudCk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICJhbnRlbm5hIG1vZGVcdCVkXG4iLAorCQlhaC0+YWhfYW50X21vZGUpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiZGVmYXVsdCBhbnRlbm5hXHQlZFxuIiwKKwkJYWgtPmFoX2RlZl9hbnQpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAidHggYW50ZW5uYVx0JWRcbiIsCisJCWFoLT5haF90eF9hbnQpOwogCi0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgIlxuQU5URU5OQVx0XHRSWFx0VFhcbiIpOwotCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKHNjLT5zdGF0cy5hbnRlbm5hX3J4KTsgaSsrKSB7Ci0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICJcbkFOVEVOTkFcdFx0UlhcdFRYXG4iKTsKKwlmb3IgKGkgPSAxOyBpIDwgQVJSQVlfU0laRShhaC0+c3RhdHMuYW50ZW5uYV9yeCk7IGkrKykgeworCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKIAkJCSJbYW50ZW5uYSAlZF1cdCVkXHQlZFxuIiwKLQkJCWksIHNjLT5zdGF0cy5hbnRlbm5hX3J4W2ldLCBzYy0+c3RhdHMuYW50ZW5uYV90eFtpXSk7CisJCQlpLCBhaC0+c3RhdHMuYW50ZW5uYV9yeFtpXSwgYWgtPnN0YXRzLmFudGVubmFfdHhbaV0pOwogCX0KLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiW2ludmFsaWRdXHQlZFx0JWRcbiIsCi0JCQlzYy0+c3RhdHMuYW50ZW5uYV9yeFswXSwgc2MtPnN0YXRzLmFudGVubmFfdHhbMF0pOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiW2ludmFsaWRdXHQlZFx0JWRcbiIsCisJCQlhaC0+c3RhdHMuYW50ZW5uYV9yeFswXSwgYWgtPnN0YXRzLmFudGVubmFfdHhbMF0pOwogCi0JdiA9IGF0aDVrX2h3X3JlZ19yZWFkKHNjLT5haCwgQVI1S19ERUZBVUxUX0FOVEVOTkEpOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJdiA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0RFRkFVTFRfQU5URU5OQSk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCQkiXG5BUjVLX0RFRkFVTFRfQU5URU5OQVx0MHglMDh4XG4iLCB2KTsKIAotCXYgPSBhdGg1a19od19yZWdfcmVhZChzYy0+YWgsIEFSNUtfU1RBX0lEMSk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwl2ID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfU1RBX0lEMSk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCSJBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BXHQlZFxuIiwKIAkJKHYgJiBBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BKSAhPSAwKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkiQVI1S19TVEFfSUQxX0RFU0NfQU5URU5OQVx0JWRcbiIsCiAJCSh2ICYgQVI1S19TVEFfSUQxX0RFU0NfQU5URU5OQSkgIT0gMCk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKIAkJIkFSNUtfU1RBX0lEMV9SVFNfREVGX0FOVEVOTkFcdCVkXG4iLAogCQkodiAmIEFSNUtfU1RBX0lEMV9SVFNfREVGX0FOVEVOTkEpICE9IDApOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCSJBUjVLX1NUQV9JRDFfU0VMRkdFTl9ERUZfQU5UXHQlZFxuIiwKIAkJKHYgJiBBUjVLX1NUQV9JRDFfU0VMRkdFTl9ERUZfQU5UKSAhPSAwKTsKIAotCXYgPSBhdGg1a19od19yZWdfcmVhZChzYy0+YWgsIEFSNUtfUEhZX0FHQ0NUTCk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwl2ID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0FHQ0NUTCk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCSJcbkFSNUtfUEhZX0FHQ0NUTF9PRkRNX0RJVl9ESVNcdCVkXG4iLAogCQkodiAmIEFSNUtfUEhZX0FHQ0NUTF9PRkRNX0RJVl9ESVMpICE9IDApOwogCi0JdiA9IGF0aDVrX2h3X3JlZ19yZWFkKHNjLT5haCwgQVI1S19QSFlfUkVTVEFSVCk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwl2ID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX1JFU1RBUlQpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkiQVI1S19QSFlfUkVTVEFSVF9ESVZfR0NcdFx0JXhcbiIsCiAJCSh2ICYgQVI1S19QSFlfUkVTVEFSVF9ESVZfR0MpID4+IEFSNUtfUEhZX1JFU1RBUlRfRElWX0dDX1MpOwogCi0JdiA9IGF0aDVrX2h3X3JlZ19yZWFkKHNjLT5haCwgQVI1S19QSFlfRkFTVF9BTlRfRElWKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCXYgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfRkFTVF9BTlRfRElWKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKIAkJIkFSNUtfUEhZX0ZBU1RfQU5UX0RJVl9FTlx0JWRcbiIsCiAJCSh2ICYgQVI1S19QSFlfRkFTVF9BTlRfRElWX0VOKSAhPSAwKTsKIAotCXYgPSBhdGg1a19od19yZWdfcmVhZChzYy0+YWgsIEFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEVfMCk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwl2ID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEVfMCk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCQkiXG5BUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzBcdDB4JTA4eFxuIiwgdik7Ci0JdiA9IGF0aDVrX2h3X3JlZ19yZWFkKHNjLT5haCwgQVI1S19QSFlfQU5UX1NXSVRDSF9UQUJMRV8xKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCXYgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfQU5UX1NXSVRDSF9UQUJMRV8xKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKIAkJCSJBUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzFcdDB4JTA4eFxuIiwgdik7CiAKIAlpZiAobGVuID4gc2l6ZW9mKGJ1ZikpCkBAIC00NTAsNyArNDQ4LDcgQEAKIAkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCiAJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBpbnQgaTsKIAljaGFyIGJ1ZlsyMF07CiAKQEAgLTQ1OCwxOCArNDU2LDE4IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKHN0cm5jbXAoYnVmLCAiZGl2ZXJzaXR5IiwgOSkgPT0gMCkgewotCQlhdGg1a19od19zZXRfYW50ZW5uYV9tb2RlKHNjLT5haCwgQVI1S19BTlRNT0RFX0RFRkFVTFQpOworCQlhdGg1a19od19zZXRfYW50ZW5uYV9tb2RlKGFoLCBBUjVLX0FOVE1PREVfREVGQVVMVCk7CiAJCXByaW50ayhLRVJOX0lORk8gImF0aDVrIGRlYnVnOiBlbmFibGUgZGl2ZXJzaXR5XG4iKTsKIAl9IGVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiZml4ZWQtYSIsIDcpID09IDApIHsKLQkJYXRoNWtfaHdfc2V0X2FudGVubmFfbW9kZShzYy0+YWgsIEFSNUtfQU5UTU9ERV9GSVhFRF9BKTsKKwkJYXRoNWtfaHdfc2V0X2FudGVubmFfbW9kZShhaCwgQVI1S19BTlRNT0RFX0ZJWEVEX0EpOwogCQlwcmludGsoS0VSTl9JTkZPICJhdGg1ayBkZWJ1Z2ZzOiBmaXhlZCBhbnRlbm5hIEFcbiIpOwogCX0gZWxzZSBpZiAoc3RybmNtcChidWYsICJmaXhlZC1iIiwgNykgPT0gMCkgewotCQlhdGg1a19od19zZXRfYW50ZW5uYV9tb2RlKHNjLT5haCwgQVI1S19BTlRNT0RFX0ZJWEVEX0IpOworCQlhdGg1a19od19zZXRfYW50ZW5uYV9tb2RlKGFoLCBBUjVLX0FOVE1PREVfRklYRURfQik7CiAJCXByaW50ayhLRVJOX0lORk8gImF0aDVrIGRlYnVnOiBmaXhlZCBhbnRlbm5hIEJcbiIpOwogCX0gZWxzZSBpZiAoc3RybmNtcChidWYsICJjbGVhciIsIDUpID09IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2MtPnN0YXRzLmFudGVubmFfcngpOyBpKyspIHsKLQkJCXNjLT5zdGF0cy5hbnRlbm5hX3J4W2ldID0gMDsKLQkJCXNjLT5zdGF0cy5hbnRlbm5hX3R4W2ldID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWgtPnN0YXRzLmFudGVubmFfcngpOyBpKyspIHsKKwkJCWFoLT5zdGF0cy5hbnRlbm5hX3J4W2ldID0gMDsKKwkJCWFoLT5zdGF0cy5hbnRlbm5hX3R4W2ldID0gMDsKIAkJfQogCQlwcmludGsoS0VSTl9JTkZPICJhdGg1ayBkZWJ1ZzogY2xlYXJlZCBhbnRlbm5hIHN0YXRzXG4iKTsKIAl9CkBAIC00ODksNDIgKzQ4Nyw0MiBAQAogc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX21pc2Moc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdGg1a19odyAqYWggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJY2hhciBidWZbNzAwXTsKIAl1bnNpZ25lZCBpbnQgbGVuID0gMDsKLQl1MzIgZmlsdCA9IGF0aDVrX2h3X2dldF9yeF9maWx0ZXIoc2MtPmFoKTsKKwl1MzIgZmlsdCA9IGF0aDVrX2h3X2dldF9yeF9maWx0ZXIoYWgpOwogCi0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgImJzc2lkLW1hc2s6ICVwTVxuIiwKLQkJCXNjLT5ic3NpZG1hc2spOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICJmaWx0ZXItZmxhZ3M6IDB4JXggIiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgImJzc2lkLW1hc2s6ICVwTVxuIiwKKwkJCWFoLT5ic3NpZG1hc2spOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiZmlsdGVyLWZsYWdzOiAweCV4ICIsCiAJCQlmaWx0KTsKIAlpZiAoZmlsdCAmIEFSNUtfUlhfRklMVEVSX1VDQVNUKQotCQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiIFVDQVNUIik7CisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiIFVDQVNUIik7CiAJaWYgKGZpbHQgJiBBUjVLX1JYX0ZJTFRFUl9NQ0FTVCkKLQkJbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgIiBNQ0FTVCIpOworCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIiBNQ0FTVCIpOwogCWlmIChmaWx0ICYgQVI1S19SWF9GSUxURVJfQkNBU1QpCi0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICIgQkNBU1QiKTsKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICIgQkNBU1QiKTsKIAlpZiAoZmlsdCAmIEFSNUtfUlhfRklMVEVSX0NPTlRST0wpCi0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICIgQ09OVFJPTCIpOworCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIiBDT05UUk9MIik7CiAJaWYgKGZpbHQgJiBBUjVLX1JYX0ZJTFRFUl9CRUFDT04pCi0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICIgQkVBQ09OIik7CisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiIEJFQUNPTiIpOwogCWlmIChmaWx0ICYgQVI1S19SWF9GSUxURVJfUFJPTSkKLQkJbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgIiBQUk9NIik7CisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiIFBST00iKTsKIAlpZiAoZmlsdCAmIEFSNUtfUlhfRklMVEVSX1hSUE9MTCkKLQkJbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgIiBYUlBPTEwiKTsKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICIgWFJQT0xMIik7CiAJaWYgKGZpbHQgJiBBUjVLX1JYX0ZJTFRFUl9QUk9CRVJFUSkKLQkJbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgIiBQUk9CRVJFUSIpOworCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIiBQUk9CRVJFUSIpOwogCWlmIChmaWx0ICYgQVI1S19SWF9GSUxURVJfUEhZRVJSXzUyMTIpCi0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICIgUEhZRVJSLTUyMTIiKTsKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICIgUEhZRVJSLTUyMTIiKTsKIAlpZiAoZmlsdCAmIEFSNUtfUlhfRklMVEVSX1JBREFSRVJSXzUyMTIpCi0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICIgUkFEQVJFUlItNTIxMiIpOworCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIiBSQURBUkVSUi01MjEyIik7CiAJaWYgKGZpbHQgJiBBUjVLX1JYX0ZJTFRFUl9QSFlFUlJfNTIxMSkKLQkJc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiIFBIWUVSUi01MjExIik7CisJCXNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICIgUEhZRVJSLTUyMTEiKTsKIAlpZiAoZmlsdCAmIEFSNUtfUlhfRklMVEVSX1JBREFSRVJSXzUyMTEpCi0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICIgUkFEQVJFUlItNTIxMSIpOworCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIiBSQURBUkVSUi01MjExIik7CiAKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiXG5vcG1vZGU6ICVzICglZClcbiIsCi0JCQlhdGhfb3Btb2RlX3RvX3N0cmluZyhzYy0+b3Btb2RlKSwgc2MtPm9wbW9kZSk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICJcbm9wbW9kZTogJXMgKCVkKVxuIiwKKwkJCWF0aF9vcG1vZGVfdG9fc3RyaW5nKGFoLT5vcG1vZGUpLCBhaC0+b3Btb2RlKTsKIAogCWlmIChsZW4gPiBzaXplb2YoYnVmKSkKIAkJbGVuID0gc2l6ZW9mKGJ1Zik7CkBAIC01NDQsNzEgKzU0Miw3MSBAQAogc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX2ZyYW1lZXJyb3JzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYXRoNWtfc3RhdGlzdGljcyAqc3QgPSAmc2MtPnN0YXRzOworCXN0cnVjdCBhdGg1a19odyAqYWggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0aDVrX3N0YXRpc3RpY3MgKnN0ID0gJmFoLT5zdGF0czsKIAljaGFyIGJ1Zls3MDBdOwogCXVuc2lnbmVkIGludCBsZW4gPSAwOwogCWludCBpOwogCi0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKIAkJCSJSWFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiQ1JDXHQldVx0KCV1JSUpXG4iLAorCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiQ1JDXHQldVx0KCV1JSUpXG4iLAogCQkJc3QtPnJ4ZXJyX2NyYywKIAkJCXN0LT5yeF9hbGxfY291bnQgPiAwID8KLQkJCQlzdC0+cnhlcnJfY3JjKjEwMC9zdC0+cnhfYWxsX2NvdW50IDogMCk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgIlBIWVx0JXVcdCgldSUlKVxuIiwKKwkJCQlzdC0+cnhlcnJfY3JjICogMTAwIC8gc3QtPnJ4X2FsbF9jb3VudCA6IDApOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiUEhZXHQldVx0KCV1JSUpXG4iLAogCQkJc3QtPnJ4ZXJyX3BoeSwKIAkJCXN0LT5yeF9hbGxfY291bnQgPiAwID8KLQkJCQlzdC0+cnhlcnJfcGh5KjEwMC9zdC0+cnhfYWxsX2NvdW50IDogMCk7CisJCQkJc3QtPnJ4ZXJyX3BoeSAqIDEwMCAvIHN0LT5yeF9hbGxfY291bnQgOiAwKTsKIAlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewogCQlpZiAoc3QtPnJ4ZXJyX3BoeV9jb2RlW2ldKQotCQkJbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwkJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJCSIgcGh5X2VyclsldV1cdCV1XG4iLAogCQkJCWksIHN0LT5yeGVycl9waHlfY29kZVtpXSk7CiAJfQogCi0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgIkZJRk9cdCV1XHQoJXUlJSlcbiIsCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICJGSUZPXHQldVx0KCV1JSUpXG4iLAogCQkJc3QtPnJ4ZXJyX2ZpZm8sCiAJCQlzdC0+cnhfYWxsX2NvdW50ID4gMCA/Ci0JCQkJc3QtPnJ4ZXJyX2ZpZm8qMTAwL3N0LT5yeF9hbGxfY291bnQgOiAwKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiZGVjcnlwdFx0JXVcdCgldSUlKVxuIiwKKwkJCQlzdC0+cnhlcnJfZmlmbyAqIDEwMCAvIHN0LT5yeF9hbGxfY291bnQgOiAwKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgImRlY3J5cHRcdCV1XHQoJXUlJSlcbiIsCiAJCQlzdC0+cnhlcnJfZGVjcnlwdCwKIAkJCXN0LT5yeF9hbGxfY291bnQgPiAwID8KLQkJCQlzdC0+cnhlcnJfZGVjcnlwdCoxMDAvc3QtPnJ4X2FsbF9jb3VudCA6IDApOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICJNSUNcdCV1XHQoJXUlJSlcbiIsCisJCQkJc3QtPnJ4ZXJyX2RlY3J5cHQgKiAxMDAgLyBzdC0+cnhfYWxsX2NvdW50IDogMCk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICJNSUNcdCV1XHQoJXUlJSlcbiIsCiAJCQlzdC0+cnhlcnJfbWljLAogCQkJc3QtPnJ4X2FsbF9jb3VudCA+IDAgPwotCQkJCXN0LT5yeGVycl9taWMqMTAwL3N0LT5yeF9hbGxfY291bnQgOiAwKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAicHJvY2Vzc1x0JXVcdCgldSUlKVxuIiwKKwkJCQlzdC0+cnhlcnJfbWljICogMTAwIC8gc3QtPnJ4X2FsbF9jb3VudCA6IDApOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAicHJvY2Vzc1x0JXVcdCgldSUlKVxuIiwKIAkJCXN0LT5yeGVycl9wcm9jLAogCQkJc3QtPnJ4X2FsbF9jb3VudCA+IDAgPwotCQkJCXN0LT5yeGVycl9wcm9jKjEwMC9zdC0+cnhfYWxsX2NvdW50IDogMCk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgImp1bWJvXHQldVx0KCV1JSUpXG4iLAorCQkJCXN0LT5yeGVycl9wcm9jICogMTAwIC8gc3QtPnJ4X2FsbF9jb3VudCA6IDApOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAianVtYm9cdCV1XHQoJXUlJSlcbiIsCiAJCQlzdC0+cnhlcnJfanVtYm8sCiAJCQlzdC0+cnhfYWxsX2NvdW50ID4gMCA/Ci0JCQkJc3QtPnJ4ZXJyX2p1bWJvKjEwMC9zdC0+cnhfYWxsX2NvdW50IDogMCk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgIltSWCBhbGxcdCV1XVxuIiwKKwkJCQlzdC0+cnhlcnJfanVtYm8gKiAxMDAgLyBzdC0+cnhfYWxsX2NvdW50IDogMCk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICJbUlggYWxsXHQldV1cbiIsCiAJCQlzdC0+cnhfYWxsX2NvdW50KTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiUlgtYWxsLWJ5dGVzXHQldVxuIiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIlJYLWFsbC1ieXRlc1x0JXVcbiIsCiAJCQlzdC0+cnhfYnl0ZXNfY291bnQpOwogCi0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKIAkJCSJcblRYXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICJyZXRyeVx0JXVcdCgldSUlKVxuIiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgInJldHJ5XHQldVx0KCV1JSUpXG4iLAogCQkJc3QtPnR4ZXJyX3JldHJ5LAogCQkJc3QtPnR4X2FsbF9jb3VudCA+IDAgPwotCQkJCXN0LT50eGVycl9yZXRyeSoxMDAvc3QtPnR4X2FsbF9jb3VudCA6IDApOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICJGSUZPXHQldVx0KCV1JSUpXG4iLAorCQkJCXN0LT50eGVycl9yZXRyeSAqIDEwMCAvIHN0LT50eF9hbGxfY291bnQgOiAwKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIkZJRk9cdCV1XHQoJXUlJSlcbiIsCiAJCQlzdC0+dHhlcnJfZmlmbywKIAkJCXN0LT50eF9hbGxfY291bnQgPiAwID8KLQkJCQlzdC0+dHhlcnJfZmlmbyoxMDAvc3QtPnR4X2FsbF9jb3VudCA6IDApOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICJmaWx0ZXJcdCV1XHQoJXUlJSlcbiIsCisJCQkJc3QtPnR4ZXJyX2ZpZm8gKiAxMDAgLyBzdC0+dHhfYWxsX2NvdW50IDogMCk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICJmaWx0ZXJcdCV1XHQoJXUlJSlcbiIsCiAJCQlzdC0+dHhlcnJfZmlsdCwKIAkJCXN0LT50eF9hbGxfY291bnQgPiAwID8KLQkJCQlzdC0+dHhlcnJfZmlsdCoxMDAvc3QtPnR4X2FsbF9jb3VudCA6IDApOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICJbVFggYWxsXHQldV1cbiIsCisJCQkJc3QtPnR4ZXJyX2ZpbHQgKiAxMDAgLyBzdC0+dHhfYWxsX2NvdW50IDogMCk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICJbVFggYWxsXHQldV1cbiIsCiAJCQlzdC0+dHhfYWxsX2NvdW50KTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiVFgtYWxsLWJ5dGVzXHQldVxuIiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIlRYLWFsbC1ieXRlc1x0JXVcbiIsCiAJCQlzdC0+dHhfYnl0ZXNfY291bnQpOwogCiAJaWYgKGxlbiA+IHNpemVvZihidWYpKQpAQCAtNjIxLDggKzYxOSw4IEBACiAJCQkJIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAogCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhdGg1a19zdGF0aXN0aWNzICpzdCA9ICZzYy0+c3RhdHM7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXRoNWtfc3RhdGlzdGljcyAqc3QgPSAmYWgtPnN0YXRzOwogCWNoYXIgYnVmWzIwXTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikpKSkKQEAgLTY2MCwxMDAgKzY1OCwxMDQgQEAKIHN0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV9hbmkoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhdGg1a19zdGF0aXN0aWNzICpzdCA9ICZzYy0+c3RhdHM7Ci0Jc3RydWN0IGF0aDVrX2FuaV9zdGF0ZSAqYXMgPSAmc2MtPmFuaV9zdGF0ZTsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdGg1a19zdGF0aXN0aWNzICpzdCA9ICZhaC0+c3RhdHM7CisJc3RydWN0IGF0aDVrX2FuaV9zdGF0ZSAqYXMgPSAmYWgtPmFuaV9zdGF0ZTsKIAogCWNoYXIgYnVmWzcwMF07CiAJdW5zaWduZWQgaW50IGxlbiA9IDA7CiAKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJIkhXIGhhcyBQSFkgZXJyb3IgY291bnRlcnM6XHQlc1xuIiwKLQkJCXNjLT5haC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9oYXNfcGh5ZXJyX2NvdW50ZXJzID8KKwkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2hhc19waHllcnJfY291bnRlcnMgPwogCQkJInllcyIgOiAibm8iKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJIkhXIG1heCBzcHVyIGltbXVuaXR5IGxldmVsOlx0JWRcbiIsCiAJCQlhcy0+bWF4X3NwdXJfbGV2ZWwpOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCSJcbkFOSSBzdGF0ZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICJvcGVyYXRpbmcgbW9kZTpcdFx0XHQiKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIm9wZXJhdGluZyBtb2RlOlx0XHRcdCIpOwogCXN3aXRjaCAoYXMtPmFuaV9tb2RlKSB7CiAJY2FzZSBBVEg1S19BTklfTU9ERV9PRkY6Ci0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICJPRkZcbiIpOworCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIk9GRlxuIik7CiAJCWJyZWFrOwogCWNhc2UgQVRINUtfQU5JX01PREVfTUFOVUFMX0xPVzoKLQkJbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCQkiTUFOVUFMIExPV1xuIik7CiAJCWJyZWFrOwogCWNhc2UgQVRINUtfQU5JX01PREVfTUFOVUFMX0hJR0g6Ci0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJIk1BTlVBTCBISUdIXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBBVEg1S19BTklfTU9ERV9BVVRPOgotCQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiQVVUT1xuIik7CisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiQVVUT1xuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJIj8/PyAobm90IGdvb2QpXG4iKTsKIAkJYnJlYWs7CiAJfQotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCQkibm9pc2UgaW1tdW5pdHkgbGV2ZWw6XHRcdCVkXG4iLAogCQkJYXMtPm5vaXNlX2ltbV9sZXZlbCk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKIAkJCSJzcHVyIGltbXVuaXR5IGxldmVsOlx0XHQlZFxuIiwKIAkJCWFzLT5zcHVyX2xldmVsKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAiZmlyc3RlcCBsZXZlbDpcdFx0XHQlZFxuIiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKKwkJCSJmaXJzdGVwIGxldmVsOlx0XHRcdCVkXG4iLAogCQkJYXMtPmZpcnN0ZXBfbGV2ZWwpOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCQkiT0ZETSB3ZWFrIHNpZ25hbCBkZXRlY3Rpb246XHQlc1xuIiwKIAkJCWFzLT5vZmRtX3dlYWtfc2lnID8gIm9uIiA6ICJvZmYiKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJIkNDSyB3ZWFrIHNpZ25hbCBkZXRlY3Rpb246XHQlc1xuIiwKIAkJCWFzLT5jY2tfd2Vha19zaWcgPyAib24iIDogIm9mZiIpOwogCi0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKIAkJCSJcbk1JQiBJTlRFUlJVUFRTOlx0XHQldVxuIiwKIAkJCXN0LT5taWJfaW50cik7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKIAkJCSJiZWFjb24gUlNTSSBhdmVyYWdlOlx0JWRcbiIsCi0JCQkoaW50KWV3bWFfcmVhZCgmc2MtPmFoLT5haF9iZWFjb25fcnNzaV9hdmcpKTsKKwkJCShpbnQpZXdtYV9yZWFkKCZhaC0+YWhfYmVhY29uX3Jzc2lfYXZnKSk7CiAKICNkZWZpbmUgQ0NfUFJJTlQoX3N0cnVjdCwgX2ZpZWxkKSBcCiAJX3N0cnVjdC5fZmllbGQsIFwKIAlfc3RydWN0LmN5Y2xlcyA+IDAgPyBcCi0JX3N0cnVjdC5fZmllbGQqMTAwL19zdHJ1Y3QuY3ljbGVzIDogMAorCV9zdHJ1Y3QuX2ZpZWxkICogMTAwIC8gX3N0cnVjdC5jeWNsZXMgOiAwCiAKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLCAicHJvZmNudCB0eFx0XHQldVx0KCVkJSUpXG4iLAorCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAorCQkJInByb2ZjbnQgdHhcdFx0JXVcdCglZCUlKVxuIiwKIAkJCUNDX1BSSU5UKGFzLT5sYXN0X2NjLCB0eF9mcmFtZSkpOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICJwcm9mY250IHJ4XHRcdCV1XHQoJWQlJSlcbiIsCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCisJCQkicHJvZmNudCByeFx0XHQldVx0KCVkJSUpXG4iLAogCQkJQ0NfUFJJTlQoYXMtPmxhc3RfY2MsIHJ4X2ZyYW1lKSk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgInByb2ZjbnQgYnVzeVx0XHQldVx0KCVkJSUpXG4iLAorCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAorCQkJInByb2ZjbnQgYnVzeVx0XHQldVx0KCVkJSUpXG4iLAogCQkJQ0NfUFJJTlQoYXMtPmxhc3RfY2MsIHJ4X2J1c3kpKTsKICN1bmRlZiBDQ19QUklOVAotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sICJwcm9mY250IGN5Y2xlc1x0XHQldVxuIiwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgInByb2ZjbnQgY3ljbGVzXHRcdCV1XG4iLAogCQkJYXMtPmxhc3RfY2MuY3ljbGVzKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJImxpc3RlbiB0aW1lXHRcdCVkXHRsYXN0OiAlZFxuIiwKIAkJCWFzLT5saXN0ZW5fdGltZSwgYXMtPmxhc3RfbGlzdGVuKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJIk9GRE0gZXJyb3JzXHRcdCV1XHRsYXN0OiAldVx0c3VtOiAldVxuIiwKIAkJCWFzLT5vZmRtX2Vycm9ycywgYXMtPmxhc3Rfb2ZkbV9lcnJvcnMsCiAJCQlhcy0+c3VtX29mZG1fZXJyb3JzKTsKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAorCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJIkNDSyBlcnJvcnNcdFx0JXVcdGxhc3Q6ICV1XHRzdW06ICV1XG4iLAogCQkJYXMtPmNja19lcnJvcnMsIGFzLT5sYXN0X2Nja19lcnJvcnMsCiAJCQlhcy0+c3VtX2Nja19lcnJvcnMpOwotCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCiAJCQkiQVI1S19QSFlFUlJfQ05UMVx0JXhcdCg9JWQpXG4iLAotCQkJYXRoNWtfaHdfcmVnX3JlYWQoc2MtPmFoLCBBUjVLX1BIWUVSUl9DTlQxKSwKKwkJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWUVSUl9DTlQxKSwKIAkJCUFUSDVLX0FOSV9PRkRNX1RSSUdfSElHSCAtIChBVEg1S19QSFlFUlJfQ05UX01BWCAtCi0JCQlhdGg1a19od19yZWdfcmVhZChzYy0+YWgsIEFSNUtfUEhZRVJSX0NOVDEpKSk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwKKwkJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWUVSUl9DTlQxKSkpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJIkFSNUtfUEhZRVJSX0NOVDJcdCV4XHQoPSVkKVxuIiwKLQkJCWF0aDVrX2h3X3JlZ19yZWFkKHNjLT5haCwgQVI1S19QSFlFUlJfQ05UMiksCisJCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlFUlJfQ05UMiksCiAJCQlBVEg1S19BTklfQ0NLX1RSSUdfSElHSCAtIChBVEg1S19QSFlFUlJfQ05UX01BWCAtCi0JCQlhdGg1a19od19yZWdfcmVhZChzYy0+YWgsIEFSNUtfUEhZRVJSX0NOVDIpKSk7CisJCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlFUlJfQ05UMikpKTsKIAogCWlmIChsZW4gPiBzaXplb2YoYnVmKSkKIAkJbGVuID0gc2l6ZW9mKGJ1Zik7CkBAIC03NjUsNDIgKzc2Nyw0MiBAQAogCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNoYXIgYnVmWzIwXTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoc3RybmNtcChidWYsICJzZW5zLWxvdyIsIDgpID09IDApIHsKLQkJYXRoNWtfYW5pX2luaXQoc2MtPmFoLCBBVEg1S19BTklfTU9ERV9NQU5VQUxfSElHSCk7CisJCWF0aDVrX2FuaV9pbml0KGFoLCBBVEg1S19BTklfTU9ERV9NQU5VQUxfSElHSCk7CiAJfSBlbHNlIGlmIChzdHJuY21wKGJ1ZiwgInNlbnMtaGlnaCIsIDkpID09IDApIHsKLQkJYXRoNWtfYW5pX2luaXQoc2MtPmFoLCBBVEg1S19BTklfTU9ERV9NQU5VQUxfTE9XKTsKKwkJYXRoNWtfYW5pX2luaXQoYWgsIEFUSDVLX0FOSV9NT0RFX01BTlVBTF9MT1cpOwogCX0gZWxzZSBpZiAoc3RybmNtcChidWYsICJhbmktb2ZmIiwgNykgPT0gMCkgewotCQlhdGg1a19hbmlfaW5pdChzYy0+YWgsIEFUSDVLX0FOSV9NT0RFX09GRik7CisJCWF0aDVrX2FuaV9pbml0KGFoLCBBVEg1S19BTklfTU9ERV9PRkYpOwogCX0gZWxzZSBpZiAoc3RybmNtcChidWYsICJhbmktb24iLCA2KSA9PSAwKSB7Ci0JCWF0aDVrX2FuaV9pbml0KHNjLT5haCwgQVRINUtfQU5JX01PREVfQVVUTyk7CisJCWF0aDVrX2FuaV9pbml0KGFoLCBBVEg1S19BTklfTU9ERV9BVVRPKTsKIAl9IGVsc2UgaWYgKHN0cm5jbXAoYnVmLCAibm9pc2UtbG93IiwgOSkgPT0gMCkgewotCQlhdGg1a19hbmlfc2V0X25vaXNlX2ltbXVuaXR5X2xldmVsKHNjLT5haCwgMCk7CisJCWF0aDVrX2FuaV9zZXRfbm9pc2VfaW1tdW5pdHlfbGV2ZWwoYWgsIDApOwogCX0gZWxzZSBpZiAoc3RybmNtcChidWYsICJub2lzZS1oaWdoIiwgMTApID09IDApIHsKLQkJYXRoNWtfYW5pX3NldF9ub2lzZV9pbW11bml0eV9sZXZlbChzYy0+YWgsCisJCWF0aDVrX2FuaV9zZXRfbm9pc2VfaW1tdW5pdHlfbGV2ZWwoYWgsCiAJCQkJCQkgICBBVEg1S19BTklfTUFYX05PSVNFX0lNTV9MVkwpOwogCX0gZWxzZSBpZiAoc3RybmNtcChidWYsICJzcHVyLWxvdyIsIDgpID09IDApIHsKLQkJYXRoNWtfYW5pX3NldF9zcHVyX2ltbXVuaXR5X2xldmVsKHNjLT5haCwgMCk7CisJCWF0aDVrX2FuaV9zZXRfc3B1cl9pbW11bml0eV9sZXZlbChhaCwgMCk7CiAJfSBlbHNlIGlmIChzdHJuY21wKGJ1ZiwgInNwdXItaGlnaCIsIDkpID09IDApIHsKLQkJYXRoNWtfYW5pX3NldF9zcHVyX2ltbXVuaXR5X2xldmVsKHNjLT5haCwKLQkJCQkJCSAgc2MtPmFuaV9zdGF0ZS5tYXhfc3B1cl9sZXZlbCk7CisJCWF0aDVrX2FuaV9zZXRfc3B1cl9pbW11bml0eV9sZXZlbChhaCwKKwkJCQkJCSAgYWgtPmFuaV9zdGF0ZS5tYXhfc3B1cl9sZXZlbCk7CiAJfSBlbHNlIGlmIChzdHJuY21wKGJ1ZiwgImZpci1sb3ciLCA3KSA9PSAwKSB7Ci0JCWF0aDVrX2FuaV9zZXRfZmlyc3RlcF9sZXZlbChzYy0+YWgsIDApOworCQlhdGg1a19hbmlfc2V0X2ZpcnN0ZXBfbGV2ZWwoYWgsIDApOwogCX0gZWxzZSBpZiAoc3RybmNtcChidWYsICJmaXItaGlnaCIsIDgpID09IDApIHsKLQkJYXRoNWtfYW5pX3NldF9maXJzdGVwX2xldmVsKHNjLT5haCwgQVRINUtfQU5JX01BWF9GSVJTVEVQX0xWTCk7CisJCWF0aDVrX2FuaV9zZXRfZmlyc3RlcF9sZXZlbChhaCwgQVRINUtfQU5JX01BWF9GSVJTVEVQX0xWTCk7CiAJfSBlbHNlIGlmIChzdHJuY21wKGJ1ZiwgIm9mZG0tb2ZmIiwgOCkgPT0gMCkgewotCQlhdGg1a19hbmlfc2V0X29mZG1fd2Vha19zaWduYWxfZGV0ZWN0aW9uKHNjLT5haCwgZmFsc2UpOworCQlhdGg1a19hbmlfc2V0X29mZG1fd2Vha19zaWduYWxfZGV0ZWN0aW9uKGFoLCBmYWxzZSk7CiAJfSBlbHNlIGlmIChzdHJuY21wKGJ1ZiwgIm9mZG0tb24iLCA3KSA9PSAwKSB7Ci0JCWF0aDVrX2FuaV9zZXRfb2ZkbV93ZWFrX3NpZ25hbF9kZXRlY3Rpb24oc2MtPmFoLCB0cnVlKTsKKwkJYXRoNWtfYW5pX3NldF9vZmRtX3dlYWtfc2lnbmFsX2RldGVjdGlvbihhaCwgdHJ1ZSk7CiAJfSBlbHNlIGlmIChzdHJuY21wKGJ1ZiwgImNjay1vZmYiLCA3KSA9PSAwKSB7Ci0JCWF0aDVrX2FuaV9zZXRfY2NrX3dlYWtfc2lnbmFsX2RldGVjdGlvbihzYy0+YWgsIGZhbHNlKTsKKwkJYXRoNWtfYW5pX3NldF9jY2tfd2Vha19zaWduYWxfZGV0ZWN0aW9uKGFoLCBmYWxzZSk7CiAJfSBlbHNlIGlmIChzdHJuY21wKGJ1ZiwgImNjay1vbiIsIDYpID09IDApIHsKLQkJYXRoNWtfYW5pX3NldF9jY2tfd2Vha19zaWduYWxfZGV0ZWN0aW9uKHNjLT5haCwgdHJ1ZSk7CisJCWF0aDVrX2FuaV9zZXRfY2NrX3dlYWtfc2lnbmFsX2RldGVjdGlvbihhaCwgdHJ1ZSk7CiAJfQogCXJldHVybiBjb3VudDsKIH0KQEAgLTgxOSw3ICs4MjEsNyBAQAogc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX3F1ZXVlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNoYXIgYnVmWzcwMF07CiAJdW5zaWduZWQgaW50IGxlbiA9IDA7CiAKQEAgLTgyNywxMyArODI5LDEzIEBACiAJc3RydWN0IGF0aDVrX2J1ZiAqYmYsICpiZjA7CiAJaW50IGksIG47CiAKLQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgc2l6ZW9mKGJ1ZiktbGVuLAotCQkJImF2YWlsYWJsZSB0eGJ1ZmZlcnM6ICVkXG4iLCBzYy0+dHhidWZfbGVuKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKKwkJCSJhdmFpbGFibGUgdHhidWZmZXJzOiAlZFxuIiwgYWgtPnR4YnVmX2xlbik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzYy0+dHhxcyk7IGkrKykgewotCQl0eHEgPSAmc2MtPnR4cXNbaV07CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWgtPnR4cXMpOyBpKyspIHsKKwkJdHhxID0gJmFoLT50eHFzW2ldOwogCi0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJIiUwMmQ6ICVzc2V0dXBcbiIsIGksIHR4cS0+c2V0dXAgPyAiIiA6ICJub3QgIik7CiAKIAkJaWYgKCF0eHEtPnNldHVwKQpAQCAtODQ1LDkgKzg0Nyw5IEBACiAJCQluKys7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmxvY2spOwogCi0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJCSIgIGxlbjogJWQgYnVmczogJWRcbiIsIHR4cS0+dHhxX2xlbiwgbik7Ci0JCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBzaXplb2YoYnVmKS1sZW4sCisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAogCQkJCSIgIHN0dWNrOiAlZFxuIiwgdHhxLT50eHFfc3R1Y2spOwogCX0KIApAQCAtODYxLDE2ICs4NjMsMTYgQEAKIAkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCiAJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAljaGFyIGJ1ZlsyMF07CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBtaW4oY291bnQsIHNpemVvZihidWYpKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKHN0cm5jbXAoYnVmLCAic3RhcnQiLCA1KSA9PSAwKQotCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMoc2MtPmh3KTsKKwkJaWVlZTgwMjExX3dha2VfcXVldWVzKGFoLT5odyk7CiAJZWxzZSBpZiAoc3RybmNtcChidWYsICJzdG9wIiwgNCkgPT0gMCkKLQkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHNjLT5odyk7CisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhhaC0+aHcpOwogCiAJcmV0dXJuIGNvdW50OwogfQpAQCAtODg2LDU0ICs4ODgsNTcgQEAKIAogCiB2b2lkCi1hdGg1a19kZWJ1Z19pbml0X2RldmljZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQorYXRoNWtfZGVidWdfaW5pdF9kZXZpY2Uoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpwaHlkaXI7CiAKLQlzYy0+ZGVidWcubGV2ZWwgPSBhdGg1a19kZWJ1ZzsKKwlhaC0+ZGVidWcubGV2ZWwgPSBhdGg1a19kZWJ1ZzsKIAotCXBoeWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigiYXRoNWsiLCBzYy0+aHctPndpcGh5LT5kZWJ1Z2ZzZGlyKTsKKwlwaHlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImF0aDVrIiwgYWgtPmh3LT53aXBoeS0+ZGVidWdmc2Rpcik7CiAJaWYgKCFwaHlkaXIpCi0JICAgIHJldHVybjsKKwkJcmV0dXJuOwogCi0JZGVidWdmc19jcmVhdGVfZmlsZSgiZGVidWciLCBTX0lXVVNSIHwgU19JUlVTUiwgcGh5ZGlyLCBzYywKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJkZWJ1ZyIsIFNfSVdVU1IgfCBTX0lSVVNSLCBwaHlkaXIsIGFoLAogCQkJICAgICZmb3BzX2RlYnVnKTsKIAotCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ2lzdGVycyIsIFNfSVJVU1IsIHBoeWRpciwgc2MsICZmb3BzX3JlZ2lzdGVycyk7CisJZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXJzIiwgU19JUlVTUiwgcGh5ZGlyLCBhaCwgJmZvcHNfcmVnaXN0ZXJzKTsKIAotCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImJlYWNvbiIsIFNfSVdVU1IgfCBTX0lSVVNSLCBwaHlkaXIsIHNjLAorCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImJlYWNvbiIsIFNfSVdVU1IgfCBTX0lSVVNSLCBwaHlkaXIsIGFoLAogCQkJICAgICZmb3BzX2JlYWNvbik7CiAKLQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZXNldCIsIFNfSVdVU1IsIHBoeWRpciwgc2MsICZmb3BzX3Jlc2V0KTsKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZXNldCIsIFNfSVdVU1IsIHBoeWRpciwgYWgsICZmb3BzX3Jlc2V0KTsKIAotCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImFudGVubmEiLCBTX0lXVVNSIHwgU19JUlVTUiwgcGh5ZGlyLCBzYywKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhbnRlbm5hIiwgU19JV1VTUiB8IFNfSVJVU1IsIHBoeWRpciwgYWgsCiAJCQkgICAgJmZvcHNfYW50ZW5uYSk7CiAKLQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJtaXNjIiwgU19JUlVTUiwgcGh5ZGlyLCBzYywgJmZvcHNfbWlzYyk7CisJZGVidWdmc19jcmVhdGVfZmlsZSgibWlzYyIsIFNfSVJVU1IsIHBoeWRpciwgYWgsICZmb3BzX21pc2MpOwogCi0JZGVidWdmc19jcmVhdGVfZmlsZSgiZnJhbWVlcnJvcnMiLCBTX0lXVVNSIHwgU19JUlVTUiwgcGh5ZGlyLCBzYywKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJmcmFtZWVycm9ycyIsIFNfSVdVU1IgfCBTX0lSVVNSLCBwaHlkaXIsIGFoLAogCQkJICAgICZmb3BzX2ZyYW1lZXJyb3JzKTsKIAotCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImFuaSIsIFNfSVdVU1IgfCBTX0lSVVNSLCBwaHlkaXIsIHNjLCAmZm9wc19hbmkpOworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImFuaSIsIFNfSVdVU1IgfCBTX0lSVVNSLCBwaHlkaXIsIGFoLCAmZm9wc19hbmkpOwogCi0JZGVidWdmc19jcmVhdGVfZmlsZSgicXVldWUiLCBTX0lXVVNSIHwgU19JUlVTUiwgcGh5ZGlyLCBzYywKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJxdWV1ZSIsIFNfSVdVU1IgfCBTX0lSVVNSLCBwaHlkaXIsIGFoLAogCQkJICAgICZmb3BzX3F1ZXVlKTsKKworCWRlYnVnZnNfY3JlYXRlX2Jvb2woIjMya2h6X2Nsb2NrIiwgU19JV1VTUiB8IFNfSVJVU1IsIHBoeWRpciwKKwkJCSAgICAmYWgtPmFoX3VzZV8zMmtoel9jbG9jayk7CiB9CiAKIC8qIGZ1bmN0aW9ucyB1c2VkIGluIG90aGVyIHBsYWNlcyAqLwogCiB2b2lkCi1hdGg1a19kZWJ1Z19kdW1wX2JhbmRzKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpCithdGg1a19kZWJ1Z19kdW1wX2JhbmRzKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJdW5zaWduZWQgaW50IGIsIGk7CiAKLQlpZiAobGlrZWx5KCEoc2MtPmRlYnVnLmxldmVsICYgQVRINUtfREVCVUdfRFVNUEJBTkRTKSkpCisJaWYgKGxpa2VseSghKGFoLT5kZWJ1Zy5sZXZlbCAmIEFUSDVLX0RFQlVHX0RVTVBCQU5EUykpKQogCQlyZXR1cm47CiAKLQlCVUdfT04oIXNjLT5zYmFuZHMpOworCUJVR19PTighYWgtPnNiYW5kcyk7CiAKIAlmb3IgKGIgPSAwOyBiIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgYisrKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmJhbmQgPSAmc2MtPnNiYW5kc1tiXTsKKwkJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqYmFuZCA9ICZhaC0+c2JhbmRzW2JdOwogCQljaGFyIGJuYW1lWzZdOwogCQlzd2l0Y2ggKGJhbmQtPmJhbmQpIHsKIAkJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgpAQCAtOTgzLDQxICs5ODgsNDEgQEAKIH0KIAogdm9pZAotYXRoNWtfZGVidWdfcHJpbnRyeGJ1ZmZzKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBhdGg1a19odyAqYWgpCithdGg1a19kZWJ1Z19wcmludHJ4YnVmZnMoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgYXRoNWtfZGVzYyAqZHM7CiAJc3RydWN0IGF0aDVrX2J1ZiAqYmY7CiAJc3RydWN0IGF0aDVrX3J4X3N0YXR1cyBycyA9IHt9OwogCWludCBzdGF0dXM7CiAKLQlpZiAobGlrZWx5KCEoc2MtPmRlYnVnLmxldmVsICYgQVRINUtfREVCVUdfREVTQykpKQorCWlmIChsaWtlbHkoIShhaC0+ZGVidWcubGV2ZWwgJiBBVEg1S19ERUJVR19ERVNDKSkpCiAJCXJldHVybjsKIAogCXByaW50ayhLRVJOX0RFQlVHICJyeGRwICV4LCByeGxpbmsgJXBcbiIsCi0JCWF0aDVrX2h3X2dldF9yeGRwKGFoKSwgc2MtPnJ4bGluayk7CisJCWF0aDVrX2h3X2dldF9yeGRwKGFoKSwgYWgtPnJ4bGluayk7CiAKLQlzcGluX2xvY2tfYmgoJnNjLT5yeGJ1ZmxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYmYsICZzYy0+cnhidWYsIGxpc3QpIHsKKwlzcGluX2xvY2tfYmgoJmFoLT5yeGJ1ZmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmYsICZhaC0+cnhidWYsIGxpc3QpIHsKIAkJZHMgPSBiZi0+ZGVzYzsKIAkJc3RhdHVzID0gYWgtPmFoX3Byb2NfcnhfZGVzYyhhaCwgZHMsICZycyk7CiAJCWlmICghc3RhdHVzKQogCQkJYXRoNWtfZGVidWdfcHJpbnRyeGJ1ZihiZiwgc3RhdHVzID09IDAsICZycyk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzYy0+cnhidWZsb2NrKTsKKwlzcGluX3VubG9ja19iaCgmYWgtPnJ4YnVmbG9jayk7CiB9CiAKIHZvaWQKLWF0aDVrX2RlYnVnX3ByaW50dHhidWYoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IGF0aDVrX2J1ZiAqYmYpCithdGg1a19kZWJ1Z19wcmludHR4YnVmKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19idWYgKmJmKQogewogCXN0cnVjdCBhdGg1a19kZXNjICpkcyA9IGJmLT5kZXNjOwogCXN0cnVjdCBhdGg1a19od181MjEyX3R4X2Rlc2MgKnRkID0gJmRzLT51ZC5kc190eDUyMTI7CiAJc3RydWN0IGF0aDVrX3R4X3N0YXR1cyB0cyA9IHt9OwogCWludCBkb25lOwogCi0JaWYgKGxpa2VseSghKHNjLT5kZWJ1Zy5sZXZlbCAmIEFUSDVLX0RFQlVHX0RFU0MpKSkKKwlpZiAobGlrZWx5KCEoYWgtPmRlYnVnLmxldmVsICYgQVRINUtfREVCVUdfREVTQykpKQogCQlyZXR1cm47CiAKLQlkb25lID0gc2MtPmFoLT5haF9wcm9jX3R4X2Rlc2Moc2MtPmFoLCBiZi0+ZGVzYywgJnRzKTsKKwlkb25lID0gYWgtPmFoX3Byb2NfdHhfZGVzYyhhaCwgYmYtPmRlc2MsICZ0cyk7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiVCAoJXAgJWxseCkgJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAiCiAJCSIlMDh4ICVjXG4iLCBkcywgKHVuc2lnbmVkIGxvbmcgbG9uZyliZi0+ZGFkZHIsIGRzLT5kc19saW5rLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVidWcuaAppbmRleCAxOTNkZDJkLi43ZjM3ZGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVidWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVidWcuaApAQCAtNjEsNyArNjEsNiBAQAogI2lmbmRlZiBfQVRINUtfREVCVUdfSAogI2RlZmluZSBfQVRINUtfREVCVUdfSAogCi1zdHJ1Y3QgYXRoNWtfc29mdGM7CiBzdHJ1Y3QgYXRoNWtfaHc7CiBzdHJ1Y3Qgc2tfYnVmZjsKIHN0cnVjdCBhdGg1a19idWY7CkBAIC0xMjcsMzkgKzEyNiwzOSBAQAogCX0gd2hpbGUgKDApCiAKIHZvaWQKLWF0aDVrX2RlYnVnX2luaXRfZGV2aWNlKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOworYXRoNWtfZGVidWdfaW5pdF9kZXZpY2Uoc3RydWN0IGF0aDVrX2h3ICphaCk7CiAKIHZvaWQKLWF0aDVrX2RlYnVnX3ByaW50cnhidWZmcyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK2F0aDVrX2RlYnVnX3ByaW50cnhidWZmcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKIAogdm9pZAotYXRoNWtfZGVidWdfZHVtcF9iYW5kcyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKTsKK2F0aDVrX2RlYnVnX2R1bXBfYmFuZHMoc3RydWN0IGF0aDVrX2h3ICphaCk7CiAKIHZvaWQKLWF0aDVrX2RlYnVnX3ByaW50dHhidWYoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgc3RydWN0IGF0aDVrX2J1ZiAqYmYpOworYXRoNWtfZGVidWdfcHJpbnR0eGJ1ZihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgYXRoNWtfYnVmICpiZik7CiAKICNlbHNlIC8qIG5vIGRlYnVnZ2luZyAqLwogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAogc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKQotQVRINUtfREJHKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHVuc2lnbmVkIGludCBtLCBjb25zdCBjaGFyICpmbXQsIC4uLikge30KK0FUSDVLX0RCRyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgbSwgY29uc3QgY2hhciAqZm10LCAuLi4pIHt9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSkKLUFUSDVLX0RCR19VTkxJTUlUKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHVuc2lnbmVkIGludCBtLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK0FUSDVLX0RCR19VTkxJTUlUKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBtLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHt9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotYXRoNWtfZGVidWdfaW5pdF9kZXZpY2Uoc3RydWN0IGF0aDVrX3NvZnRjICpzYykge30KK2F0aDVrX2RlYnVnX2luaXRfZGV2aWNlKHN0cnVjdCBhdGg1a19odyAqYWgpIHt9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotYXRoNWtfZGVidWdfcHJpbnRyeGJ1ZmZzKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBhdGg1a19odyAqYWgpIHt9CithdGg1a19kZWJ1Z19wcmludHJ4YnVmZnMoc3RydWN0IGF0aDVrX2h3ICphaCkge30KIAogc3RhdGljIGlubGluZSB2b2lkCi1hdGg1a19kZWJ1Z19kdW1wX2JhbmRzKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpIHt9CithdGg1a19kZWJ1Z19kdW1wX2JhbmRzKHN0cnVjdCBhdGg1a19odyAqYWgpIHt9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotYXRoNWtfZGVidWdfcHJpbnR0eGJ1ZihzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoNWtfYnVmICpiZikge30KK2F0aDVrX2RlYnVnX3ByaW50dHhidWYoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2J1ZiAqYmYpIHt9CiAKICNlbmRpZiAvKiBpZmRlZiBDT05GSUdfQVRINUtfREVCVUcgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmMKaW5kZXggNjIxNzJkNS4uODQ2NTM1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVzYy5jCkBAIC01NSwxMiArNTUsMTIgQEAKIAkgKiAgIG5vaXNlIG9uIHRoZSBjaGFubmVsLCBzbyBpdCBpcyBpbXBvcnRhbnQgdG8gYXZvaWQgdGhpcy4KIAkgKi8KIAlpZiAodW5saWtlbHkodHhfdHJpZXMwID09IDApKSB7Ci0JCUFUSDVLX0VSUihhaC0+YWhfc2MsICJ6ZXJvIHJldHJpZXNcbiIpOworCQlBVEg1S19FUlIoYWgsICJ6ZXJvIHJldHJpZXNcbiIpOwogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHVubGlrZWx5KHR4X3JhdGUwID09IDApKSB7Ci0JCUFUSDVLX0VSUihhaC0+YWhfc2MsICJ6ZXJvIHJhdGVcbiIpOworCQlBVEg1S19FUlIoYWgsICJ6ZXJvIHJhdGVcbiIpOwogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMDcsMTAgKzEwNywxMyBAQAogCQljYXNlIEFSNUtfUEtUX1RZUEVfQkVBQ09OOgogCQljYXNlIEFSNUtfUEtUX1RZUEVfUFJPQkVfUkVTUDoKIAkJCWZyYW1lX3R5cGUgPSBBUjVLX0FSNTIxMF9UWF9ERVNDX0ZSQU1FX1RZUEVfTk9fREVMQVk7CisJCQlicmVhazsKIAkJY2FzZSBBUjVLX1BLVF9UWVBFX1BJRlM6CiAJCQlmcmFtZV90eXBlID0gQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX1BJRlM7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWZyYW1lX3R5cGUgPSB0eXBlOworCQkJYnJlYWs7CiAJCX0KIAogCQl0eF9jdGwtPnR4X2NvbnRyb2xfMCB8PQpAQCAtMjAwLDEyICsyMDMsMTIgQEAKIAkgKiAgIG5vaXNlIG9uIHRoZSBjaGFubmVsLCBzbyBpdCBpcyBpbXBvcnRhbnQgdG8gYXZvaWQgdGhpcy4KIAkgKi8KIAlpZiAodW5saWtlbHkodHhfdHJpZXMwID09IDApKSB7Ci0JCUFUSDVLX0VSUihhaC0+YWhfc2MsICJ6ZXJvIHJldHJpZXNcbiIpOworCQlBVEg1S19FUlIoYWgsICJ6ZXJvIHJldHJpZXNcbiIpOwogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHVubGlrZWx5KHR4X3JhdGUwID09IDApKSB7Ci0JCUFUSDVLX0VSUihhaC0+YWhfc2MsICJ6ZXJvIHJhdGVcbiIpOworCQlBVEg1S19FUlIoYWgsICJ6ZXJvIHJhdGVcbiIpOwogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0zMTMsNyArMzE2LDcgQEAKIAlpZiAodW5saWtlbHkoKHR4X3JhdGUxID09IDAgJiYgdHhfdHJpZXMxICE9IDApIHx8CiAJCSAgICAgKHR4X3JhdGUyID09IDAgJiYgdHhfdHJpZXMyICE9IDApIHx8CiAJCSAgICAgKHR4X3JhdGUzID09IDAgJiYgdHhfdHJpZXMzICE9IDApKSkgewotCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiemVybyByYXRlXG4iKTsKKwkJQVRINUtfRVJSKGFoLCAiemVybyByYXRlXG4iKTsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmgKaW5kZXggMjUwOWQwYi4uY2ZkNTI5YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuaApAQCAtNTgsMTEgKzU4LDExIEBACiAjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRlJBTUVfUkVDRUlWRV9PSwkweDAwMDAwMDAyIC8qIHJlY2VwdGlvbiBzdWNjZXNzICovCiAjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfQ1JDX0VSUk9SCQkweDAwMDAwMDA0IC8qIENSQyBlcnJvciAqLwogI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0ZJRk9fT1ZFUlJVTl81MjEwCTB4MDAwMDAwMDggLyogWzUyMTBdIEZJRk8gb3ZlcnJ1biAqLwotI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0RFQ1JZUFRfQ1JDX0VSUk9SCTB4MDAwMDAwMTAgLyogZGVjeXB0aW9uIENSQyBmYWlsdXJlICovCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfREVDUllQVF9DUkNfRVJST1IJMHgwMDAwMDAxMCAvKiBkZWNyeXB0aW9uIENSQyBmYWlsdXJlICovCiAjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfUEhZX0VSUk9SCQkweDAwMDAwMGUwIC8qIFBIWSBlcnJvciAqLwogI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1BIWV9FUlJPUl9TCQk1CiAjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYX1ZBTElECTB4MDAwMDAxMDAgLyoga2V5IGluZGV4IHZhbGlkICovCi0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYCQkweDAwMDA3ZTAwIC8qIGRlY3lwdGlvbiBrZXkgaW5kZXggKi8KKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVgJCTB4MDAwMDdlMDAgLyogZGVjcnlwdGlvbiBrZXkgaW5kZXggKi8KICNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVhfUwkJOQogI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1JFQ0VJVkVfVElNRVNUQU1QCTB4MGZmZjgwMDAgLyogMTMgYml0IG9mIFRTRiAqLwogI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1JFQ0VJVkVfVElNRVNUQU1QX1MJMTUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kbWEuYwppbmRleCAyMTA5MWMyLi4wZDVkNDAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RtYS5jCkBAIC0yNSw3ICsyNSw3IEBACiAgKgogICogSGVyZSB3ZSBzZXR1cCBkZXNjcmlwdG9yIHBvaW50ZXJzIChyeGRwL3R4ZHApIHN0YXJ0L3N0b3AgZG1hIGVuZ2luZSBhbmQKICAqIGhhbmRsZSBxdWV1ZSBzZXR1cCBmb3IgNTIxMCBjaGlwc2V0IChyZXN0IGFyZSBoYW5kbGVkIG9uIHFjdS5jKS4KLSAqIEFsc28gd2Ugc2V0dXAgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKElNUikgYW5kIHJlYWQgdGhlIHZhcmlvdXMgaXRlcnJ1cHQKKyAqIEFsc28gd2Ugc2V0dXAgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKElNUikgYW5kIHJlYWQgdGhlIHZhcmlvdXMgaW50ZXJydXB0CiAgKiBzdGF0dXMgcmVnaXN0ZXJzIChJU1IpLgogICoKICAqIFRPRE86IEhhbmRsZSBTSVNSIG9uIDUyMTErIGFuZCBpbnRyb2R1Y2UgYSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHF1ZXVlCkBAIC03Myw3ICs3Myw3IEBACiAJCXVkZWxheSgxMDApOwogCiAJaWYgKCFpKQotCQlBVEg1S19EQkcoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19ETUEsCisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfRE1BLAogCQkJCSJmYWlsZWQgdG8gc3RvcCBSWCBETUEgIVxuIik7CiAKIAlyZXR1cm4gaSA/IDAgOiAtRUJVU1k7CkBAIC0xMDAsNyArMTAwLDcgQEAKIGludCBhdGg1a19od19zZXRfcnhkcChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgcGh5c19hZGRyKQogewogCWlmIChhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19DUikgJiBBUjVLX0NSX1JYRSkgewotCQlBVEg1S19EQkcoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19ETUEsCisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfRE1BLAogCQkJCSJ0cmllZCB0byBzZXQgUlhEUCB3aGlsZSByeCB3YXMgYWN0aXZlICFcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNDMsNyArMjQzLDcgQEAKIAkJCXVkZWxheSgxMDApOwogCiAJCWlmIChBUjVLX1JFR19SRUFEX1EoYWgsIEFSNUtfUUNVX1RYRSwgcXVldWUpKQotCQkJQVRINUtfREJHKGFoLT5haF9zYywgQVRINUtfREVCVUdfRE1BLAorCQkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19ETUEsCiAJCQkJInF1ZXVlICVpIGRpZG4ndCBzdG9wICFcbiIsIHF1ZXVlKTsKIAogCQkvKiBDaGVjayBmb3IgcGVuZGluZyBmcmFtZXMgKi8KQEAgLTI1OCw3ICsyNTgsNyBAQAogCQkvKiBGb3IgMjQxMysgb3JkZXIgUENVIHRvIGRyb3AgcGFja2V0cyB1c2luZwogCQkgKiBRVUlFVCBtZWNoYW5pc20gKi8KIAkJaWYgKGFoLT5haF9tYWNfdmVyc2lvbiA+PSAoQVI1S19TUkVWX0FSMjQxNCA+PiA0KSAmJgotCQlwZW5kaW5nKXsKKwkJICAgIHBlbmRpbmcpIHsKIAkJCS8qIFNldCBwZXJpb2RpY2l0eSBhbmQgZHVyYXRpb24gKi8KIAkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwKIAkJCQlBUjVLX1JFR19TTSgxMDAsIEFSNUtfUVVJRVRfQ1RMMl9RVF9QRVIpfApAQCAtMjk1LDcgKzI5NSw3IEBACiAJCQkJCUFSNUtfRElBR19TV19DSEFOTkVMX0lETEVfSElHSCk7CiAKIAkJCWlmIChwZW5kaW5nKQotCQkJCUFUSDVLX0RCRyhhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX0RNQSwKKwkJCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0RNQSwKIAkJCQkJInF1aWV0IG1lY2hhbmlzbSBkaWRuJ3Qgd29yayBxOiVpICFcbiIsCiAJCQkJCXF1ZXVlKTsKIAkJfQpAQCAtMzA5LDcgKzMwOSw3IEBACiAJCS8qIENsZWFyIHJlZ2lzdGVyICovCiAJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19RQ1VfVFhEKTsKIAkJaWYgKHBlbmRpbmcpIHsKLQkJCUFUSDVLX0RCRyhhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX0RNQSwKKwkJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfRE1BLAogCQkJCQkidHggZG1hIGRpZG4ndCBzdG9wIChxOiVpLCBmcm06JWkpICFcbiIsCiAJCQkJCXF1ZXVlLCBwZW5kaW5nKTsKIAkJCXJldHVybiAtRUJVU1k7CkBAIC0zMzMsNyArMzMzLDcgQEAKIAlpbnQgcmV0OwogCXJldCA9IGF0aDVrX2h3X3N0b3BfdHhfZG1hKGFoLCBxdWV1ZSk7CiAJaWYgKHJldCkgewotCQlBVEg1S19EQkcoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19ETUEsCisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfRE1BLAogCQkJCSJiZWFjb24gcXVldWUgZGlkbid0IHN0b3AgIVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTcyNiw3ICs3MjYsNyBAQAogCQkJaW50X21hc2sgfD0gQVI1S19JTVJfUlhET1BQTEVSOwogCiAJCS8qIE5vdGU6IFBlciBxdWV1ZSBpbnRlcnJ1cHQgbWFza3MKLQkJICogYXJlIHNldCB2aWEgcmVzZXRfdHhfcXVldWUgKHFjdS5jKSAqLworCQkgKiBhcmUgc2V0IHZpYSBhdGg1a19od19yZXNldF90eF9xdWV1ZSgpIChxY3UuYykgKi8KIAkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBpbnRfbWFzaywgQVI1S19QSU1SKTsKIAkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzaW1yMiwgQVI1S19TSU1SMik7CiAKQEAgLTc4Myw3ICs3ODMsNyBAQAogCSAqIGZvciBhbGwgUENJLUUgY2FyZHMgdG8gYmUgc2FmZSkuCiAJICoKIAkgKiBYWFg6IG5lZWQgdG8gY2hlY2sgNTIxMCBmb3IgdGhpcwotCSAqIFRPRE86IENoZWNrIG91dCB0eCB0cmlnZXIgbGV2ZWwsIGl0J3MgYWx3YXlzIDY0IG9uIGR1bXBzIGJ1dCBJCisJICogVE9ETzogQ2hlY2sgb3V0IHR4IHRyaWdnZXIgbGV2ZWwsIGl0J3MgYWx3YXlzIDY0IG9uIGR1bXBzIGJ1dCBJCiAJICogZ3Vlc3Mgd2UgY2FuIHR3ZWFrIGl0IGFuZCBzZWUgaG93IGl0IGdvZXMgOy0pCiAJICovCiAJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZWVwcm9tLmMKaW5kZXggMWZlZjg0Zi4uOTA2OGI5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9lZXByb20uYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCSAqIGJpZyBzdGlsbCwgd2FpdGluZyBvbiBhIGJldHRlciB2YWx1ZS4KIAkJICovCiAJCWlmIChlZXBfbWF4ID4gKDMgKiBBUjVLX0VFUFJPTV9JTkZPX01BWCkpIHsKLQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsICJJbnZhbGlkIG1heCBjdXN0b20gRUVQUk9NIHNpemU6ICIKKwkJCUFUSDVLX0VSUihhaCwgIkludmFsaWQgbWF4IGN1c3RvbSBFRVBST00gc2l6ZTogIgogCQkJCSAgIiVkICgweCUwNHgpIG1heCBleHBlY3RlZDogJWQgKDB4JTA0eClcbiIsCiAJCQkJICBlZXBfbWF4LCBlZXBfbWF4LAogCQkJCSAgMyAqIEFSNUtfRUVQUk9NX0lORk9fTUFYLApAQCAtMTE5LDcgKzExOSw3IEBACiAJCWNrc3VtIF49IHZhbDsKIAl9CiAJaWYgKGNrc3VtICE9IEFSNUtfRUVQUk9NX0lORk9fQ0tTVU0pIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgIkludmFsaWQgRUVQUk9NICIKKwkJQVRINUtfRVJSKGFoLCAiSW52YWxpZCBFRVBST00gIgogCQkJICAiY2hlY2tzdW06IDB4JTA0eCBlZXBfbWF4OiAweCUwNHggKCVzKVxuIiwKIAkJCSAgY2tzdW0sIGVlcF9tYXgsCiAJCQkgIGVlcF9tYXggPT0gQVI1S19FRVBST01fSU5GT19NQVggPwpAQCAtMjIzLDE0ICsyMjMsMTQgQEAKIAlhaC0+YWhfYW50X2N0bFttb2RlXVtBUjVLX0FOVF9DVExdID0KIAkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVswXSA8PCA0KTsKIAlhaC0+YWhfYW50X2N0bFttb2RlXVtBUjVLX0FOVF9TV1RBQkxFX0FdID0KLQkgICAgIGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVsxXSAJfAotCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzJdIDw8IDYpIAl8CisJICAgICBlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bMV0JfAorCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzJdIDw8IDYpCXwKIAkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVszXSA8PCAxMikgfAogCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzRdIDw8IDE4KSB8CiAJICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bNV0gPDwgMjQpOwogCWFoLT5haF9hbnRfY3RsW21vZGVdW0FSNUtfQU5UX1NXVEFCTEVfQl0gPQotCSAgICAgZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzZdIAl8Ci0JICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bN10gPDwgNikgCXwKKwkgICAgIGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVs2XQl8CisJICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bN10gPDwgNikJfAogCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzhdIDw8IDEyKSB8CiAJICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bOV0gPDwgMTgpIHwKIAkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVsxMF0gPDwgMjQpOwpAQCAtMjU1LDcgKzI1NSw3IEBACiAJZWUtPmVlX25fcGllcnNbbW9kZV0gPSAwOwogCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOwogCWVlLT5lZV9hZGNfZGVzaXJlZF9zaXplW21vZGVdCT0gKHM4KSgodmFsID4+IDgpICYgMHhmZik7Ci0Jc3dpdGNoKG1vZGUpIHsKKwlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFBOgogCQllZS0+ZWVfb2JbbW9kZV1bM10JPSAodmFsID4+IDUpICYgMHg3OwogCQllZS0+ZWVfZGJbbW9kZV1bM10JPSAodmFsID4+IDIpICYgMHg3OwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJLyogTm90ZTogPj0gdjUgaGF2ZSBiZyBmcmVxIHBpZXJzIG9uIGFub3RoZXIgbG9jYXRpb24KIAkgKiBzbyB0aGVzZSBmcmVxIHBpZXJzIGFyZSBpZ25vcmVkIGZvciA+PSB2NSAoc2hvdWxkIGJlIDB4ZmYKIAkgKiBhbnl3YXkpICovCi0Jc3dpdGNoKG1vZGUpIHsKKwlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFBOgogCQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPCBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMSkKIAkJCWJyZWFrOwpAQCAtNDIyLDcgKzQyMiw3IEBACiAJaWYgKGVlLT5lZV92ZXJzaW9uIDwgQVI1S19FRVBST01fVkVSU0lPTl81XzApCiAJCWdvdG8gZG9uZTsKIAotCXN3aXRjaCAobW9kZSl7CisJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExQToKIAkJZWUtPmVlX3N3aXRjaF9zZXR0bGluZ190dXJib1ttb2RlXSA9ICh2YWwgPj4gNikgJiAweDdmOwogCkBAIC00MzYsNyArNDM2LDcgQEAKIAkJZWUtPmVlX2FkY19kZXNpcmVkX3NpemVfdHVyYm9bbW9kZV0gfD0gKHZhbCAmIDB4MSkgPDwgNzsKIAkJZWUtPmVlX3BnYV9kZXNpcmVkX3NpemVfdHVyYm9bbW9kZV0gPSAodmFsID4+IDEpICYgMHhmZjsKIAotCQlpZiAoQVI1S19FRVBST01fRUVNQVAoZWUtPmVlX21pc2MwKSA+PTIpCisJCWlmIChBUjVLX0VFUFJPTV9FRU1BUChlZS0+ZWVfbWlzYzApID49IDIpCiAJCQllZS0+ZWVfcGRfZ2Fpbl9vdmVybGFwID0gKHZhbCA+PiA5KSAmIDB4ZjsKIAkJYnJlYWs7CiAJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExRzoKQEAgLTUxNiw3ICs1MTYsNyBAQAogCXUxNiB2YWw7CiAKIAllZS0+ZWVfbl9waWVyc1ttb2RlXSA9IDA7Ci0Jd2hpbGUoaSA8IG1heCkgeworCXdoaWxlIChpIDwgbWF4KSB7CiAJCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOwogCiAJCWZyZXExID0gdmFsICYgMHhmZjsKQEAgLTYwMiw3ICs2MDIsNyBAQAogCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwogCXN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mbyAqcGNhbDsKIAotCXN3aXRjaChtb2RlKSB7CisJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExQjoKIAkJcGNhbCA9IGVlLT5lZV9wd3JfY2FsX2I7CiAJCWJyZWFrOwpAQCAtNjM0LDcgKzYzNCw3IEBACiAvKiBVc2VkIHRvIG1hdGNoIFBDREFDIHN0ZXBzIHdpdGggcG93ZXIgdmFsdWVzIG9uIFJGNTExMSBjaGlwcwogICogKGVlcHJvbSB2ZXJzaW9ucyA8IDQpLiBGb3IgUkY1MTExIHdlIGhhdmUgMTEgcHJlLWRlZmluZWQgUENEQUMKICAqIHN0ZXBzIHRoYXQgbWF0Y2ggd2l0aCB0aGUgcG93ZXIgdmFsdWVzIHdlIHJlYWQgZnJvbSBlZXByb20uIE9uCi0gKiBvbGRlciBlZXByb20gdmVyc2lvbnMgKDwgMy4yKSB0aGVzZSBzdGVwcyBhcmUgZXF1YWx5IHNwYWNlZCBhdAorICogb2xkZXIgZWVwcm9tIHZlcnNpb25zICg8IDMuMikgdGhlc2Ugc3RlcHMgYXJlIGVxdWFsbHkgc3BhY2VkIGF0CiAgKiAxMCUgb2YgdGhlIHBjZGFjIGN1cnZlIC11bnRpbCB0aGUgY3VydmUgcmVhY2hlcyBpdHMgbWF4aW11bS0KICAqICgxMSBzdGVwcyBmcm9tIDAgdG8gMTAwJSkgYnV0IG9uIG5ld2VyIGVlcHJvbSB2ZXJzaW9ucyAoPj0gMy4yKQogICogdGhlc2UgMTEgc3RlcHMgYXJlIHNwYWNlZCBpbiBhIGRpZmZlcmVudCB3YXkuIFRoaXMgZnVuY3Rpb24gcmV0dXJucwpAQCAtNjQ0LDEwICs2NDQsMTIgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogYXRoNWtfZ2V0X3BjZGFjX2ludGVyY2VwdHMoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggbWluLCB1OCBtYXgsIHU4ICp2cCkKIHsKLQlzdGF0aWMgY29uc3QgdTE2IGludGVyY2VwdHMzW10gPQotCQl7IDAsIDUsIDEwLCAyMCwgMzAsIDUwLCA3MCwgODUsIDkwLCA5NSwgMTAwIH07Ci0Jc3RhdGljIGNvbnN0IHUxNiBpbnRlcmNlcHRzM18yW10gPQotCQl7IDAsIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwgOTAsIDEwMCB9OworCXN0YXRpYyBjb25zdCB1MTYgaW50ZXJjZXB0czNbXSA9IHsKKwkJMCwgNSwgMTAsIDIwLCAzMCwgNTAsIDcwLCA4NSwgOTAsIDk1LCAxMDAKKwl9OworCXN0YXRpYyBjb25zdCB1MTYgaW50ZXJjZXB0czNfMltdID0geworCQkwLCAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgODAsIDkwLCAxMDAKKwl9OwogCWNvbnN0IHUxNiAqaXA7CiAJaW50IGk7CiAKQEAgLTY5MSwxNCArNjkzLDEyIEBACiAJCWlmICghY2hpbmZvW3BpZXJdLnBkX2N1cnZlcykKIAkJCWNvbnRpbnVlOwogCi0JCWZvciAocGRnID0gMDsgcGRnIDwgZWUtPmVlX3BkX2dhaW5zW21vZGVdOyBwZGcrKykgeworCQlmb3IgKHBkZyA9IDA7IHBkZyA8IEFSNUtfRUVQUk9NX05fUERfQ1VSVkVTOyBwZGcrKykgewogCQkJc3RydWN0IGF0aDVrX3BkZ2Fpbl9pbmZvICpwZCA9CiAJCQkJCSZjaGluZm9bcGllcl0ucGRfY3VydmVzW3BkZ107CiAKLQkJCWlmIChwZCAhPSBOVUxMKSB7Ci0JCQkJa2ZyZWUocGQtPnBkX3N0ZXApOwotCQkJCWtmcmVlKHBkLT5wZF9wd3IpOwotCQkJfQorCQkJa2ZyZWUocGQtPnBkX3N0ZXApOworCQkJa2ZyZWUocGQtPnBkX3B3cik7CiAJCX0KIAogCQlrZnJlZShjaGluZm9bcGllcl0ucGRfY3VydmVzKTsKQEAgLTc2NCw3ICs3NjQsNyBAQAogCiAJCS8qIEZpbGwgcmF3IGRhdGFzZXQKIAkJICogKGNvbnZlcnQgcG93ZXIgdG8gMC4yNWRCIHVuaXRzCi0JCSAqIGZvciBSRjUxMTIgY29tYmF0aWJpbGl0eSkgKi8KKwkJICogZm9yIFJGNTExMiBjb21wYXRpYmlsaXR5KSAqLwogCQlmb3IgKHBvaW50ID0gMDsgcG9pbnQgPCBwZC0+cGRfcG9pbnRzOyBwb2ludCsrKSB7CiAKIAkJCS8qIEFic29sdXRlIHZhbHVlcyAqLwpAQCAtNzk4LDcgKzc5OCw3IEBACiAJdTE2IHZhbDsKIAogCW9mZnNldCA9IEFSNUtfRUVQUk9NX0dST1VQU19TVEFSVChlZS0+ZWVfdmVyc2lvbik7Ci0Jc3dpdGNoKG1vZGUpIHsKKwlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIEFSNUtfRUVQUk9NX01PREVfMTFBOgogCQlpZiAoIUFSNUtfRUVQUk9NX0hEUl8xMUEoZWUtPmVlX2hlYWRlcikpCiAJCQlyZXR1cm4gMDsKQEAgLTg4NCw3ICs4ODQsNyBAQAogICogUmVhZCBwb3dlciBjYWxpYnJhdGlvbiBmb3IgUkY1MTEyIGNoaXBzCiAgKgogICogRm9yIFJGNTExMiB3ZSBoYXZlIDQgWFBEIC1lWHRlcm5hbCBQb3dlciBEZXRlY3Rvci0gY3VydmVzCi0gKiBmb3IgZWFjaCBjYWxpYnJhdGVkIGNoYW5uZWwgb24gMCwgLTYsIC0xMiBhbmQgLTE4ZGJtIGJ1dCB3ZSBvbmx5CisgKiBmb3IgZWFjaCBjYWxpYnJhdGVkIGNoYW5uZWwgb24gMCwgLTYsIC0xMiBhbmQgLTE4ZEJtIGJ1dCB3ZSBvbmx5CiAgKiB1c2UgdGhlIGhpZ2hlciAoMykgYW5kIHRoZSBsb3dlciAoMCkgY3VydmVzLiBFYWNoIGN1cnZlIGhhcyAwLjVkQgogICogcG93ZXIgc3RlcHMgb24geCBheGlzIGFuZCBQQ0RBQyBzdGVwcyBvbiB5IGF4aXMgYW5kIGxvb2tzIGxpa2UgYQogICogbGluZWFyIGZ1bmN0aW9uLiBUbyByZWNyZWF0ZSB0aGUgY3VydmUgYW5kIHBhc3MgdGhlIHBvd2VyIHZhbHVlcwpAQCAtMTE2NSw3ICsxMTY1LDcgQEAKIHsKIAl1MzIgb2Zmc2V0ID0gQVI1S19FRVBST01fQ0FMX0RBVEFfU1RBUlQoZWUtPmVlX21pc2M0KTsKIAotCXN3aXRjaChtb2RlKSB7CisJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBBUjVLX0VFUFJPTV9NT0RFXzExRzoKIAkJaWYgKEFSNUtfRUVQUk9NX0hEUl8xMUIoZWUtPmVlX2hlYWRlcikpCiAJCQlvZmZzZXQgKz0gYXRoNWtfcGRnYWluc19zaXplXzI0MTMoZWUsCkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogCiAJCQkvKiBGaWxsIHJhdyBkYXRhc2V0CiAJCQkgKiBjb252ZXJ0IGFsbCBwd3IgbGV2ZWxzIHRvCi0JCQkgKiBxdWFydGVyIGRCIGZvciBSRjUxMTIgY29tYmF0aWJpbGl0eSAqLworCQkJICogcXVhcnRlciBkQiBmb3IgUkY1MTEyIGNvbXBhdGliaWxpdHkgKi8KIAkJCXBkLT5wZF9zdGVwWzBdID0gcGNpbmZvLT5wZGRhY19pW3BkZ107CiAJCQlwZC0+cGRfcHdyWzBdID0gNCAqIHBjaW5mby0+cHdyX2lbcGRnXTsKIApAQCAtMTYyMiw4ICsxNjIyLDggQEAKIAkJb2Zmc2V0ICs9IEFSNUtfRUVQUk9NX0dST1VQU19TVEFSVChlZS0+ZWVfdmVyc2lvbik7CiAKIAlyZXAgPSBlZS0+ZWVfY3RsX3B3cjsKLQlmb3IoaSA9IDA7IGkgPCBlZS0+ZWVfY3RsczsgaSsrKSB7Ci0JCXN3aXRjaChlZS0+ZWVfY3RsW2ldICYgQVI1S19DVExfTU9ERV9NKSB7CisJZm9yIChpID0gMDsgaSA8IGVlLT5lZV9jdGxzOyBpKyspIHsKKwkJc3dpdGNoIChlZS0+ZWVfY3RsW2ldICYgQVI1S19DVExfTU9ERV9NKSB7CiAJCWNhc2UgQVI1S19DVExfMTFBOgogCQljYXNlIEFSNUtfQ1RMX1RVUkJPOgogCQkJY3RsX21vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9lZXByb20uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9lZXByb20uaAppbmRleCA2NTExYzI3Li5kYzJiY2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZWVwcm9tLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2VlcHJvbS5oCkBAIC01MCw3ICs1MCw3IEBACiAKICNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTgkJQVI1S19FRVBST01fSU5GTygxKQkvKiBFRVBST00gVmVyc2lvbiAqLwogI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMAkJMHgzMDAwCS8qIE5vIGlkZWEgd2hhdCdzIGdvaW5nIG9uIGJlZm9yZSB0aGlzIHZlcnNpb24gKi8KLSNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl8zXzEJCTB4MzAwMQkvKiBvYi9kYiB2YWx1ZXMgZm9yIDJHaHogKGFyNTIxMV9yZnJlZ3MpICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT05fM18xCQkweDMwMDEJLyogb2IvZGIgdmFsdWVzIGZvciAyR0h6IChhcjUyMTFfcmZyZWdzKSAqLwogI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMgkJMHgzMDAyCS8qIGRpZmZlcmVudCBmcmVxdWVuY3kgcmVwcmVzZW50YXRpb24gKGVlcHJvbV9iaW4yZnJlcSkgKi8KICNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl8zXzMJCTB4MzAwMwkvKiBvZmZzZXRzIGNoYW5nZWQsIGhhcyAzMiBDVExzIChzZWUgYmVsb3cpIGFuZCBlZV9mYWxzZV9kZXRlY3QgKGVlcHJvbV9yZWFkX21vZGVzKSAqLwogI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfNAkJMHgzMDA0CS8qIGhhcyBlZV9pX2dhaW4sIGVlX2Nja19vZmRtX3Bvd2VyX2RlbHRhIChlZXByb21fcmVhZF9tb2RlcykgKi8KQEAgLTc1LDExICs3NSwxMSBAQAogI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfMTFBKF92KQkJKCgoX3YpID4+IEFSNUtfRUVQUk9NX01PREVfMTFBKSAmIDB4MSkKICNkZWZpbmUgQVI1S19FRVBST01fSERSXzExQihfdikJCSgoKF92KSA+PiBBUjVLX0VFUFJPTV9NT0RFXzExQikgJiAweDEpCiAjZGVmaW5lIEFSNUtfRUVQUk9NX0hEUl8xMUcoX3YpCQkoKChfdikgPj4gQVI1S19FRVBST01fTU9ERV8xMUcpICYgMHgxKQotI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfVF8yR0haX0RJUyhfdikJKCgoX3YpID4+IDMpICYgMHgxKQkvKiBEaXNhYmxlIHR1cmJvIGZvciAyR2h6ICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0hEUl9UXzJHSFpfRElTKF92KQkoKChfdikgPj4gMykgJiAweDEpCS8qIERpc2FibGUgdHVyYm8gZm9yIDJHSHogKi8KICNkZWZpbmUgQVI1S19FRVBST01fSERSX1RfNUdIWl9EQk0oX3YpCSgoKF92KSA+PiA0KSAmIDB4N2YpCS8qIE1heCB0dXJibyBwb3dlciBmb3IgPCAyVyBwb3dlciBjb25zdW1wdGlvbiAqLwogI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfREVWSUNFKF92KQkoKChfdikgPj4gMTEpICYgMHg3KQkvKiBEZXZpY2UgdHlwZSAoMSBDYXJkYnVzLCAyIFBDSSwgMyBNaW5pUENJLCA0IEFQKSAqLwogI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfUkZLSUxMKF92KQkoKChfdikgPj4gMTQpICYgMHgxKQkvKiBEZXZpY2UgaGFzIFJGS2lsbCBzdXBwb3J0ICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX0hEUl9UXzVHSFpfRElTKF92KQkoKChfdikgPj4gMTUpICYgMHgxKQkvKiBEaXNhYmxlIHR1cmJvIGZvciA1R2h6ICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0hEUl9UXzVHSFpfRElTKF92KQkoKChfdikgPj4gMTUpICYgMHgxKQkvKiBEaXNhYmxlIHR1cmJvIGZvciA1R0h6ICovCiAKIC8qIE5ld2VyIEVFUFJPTXMgYXJlIHVzaW5nIGEgZGlmZmVyZW50IG9mZnNldCAqLwogI2RlZmluZSBBUjVLX0VFUFJPTV9PRkYoX3YsIF92M18wLCBfdjNfMykgXApAQCAtMTIwLDcgKzEyMCw3IEBACiAjZGVmaW5lIEFSNUtfRUVQUk9NX0ZGX0RJUyhfdikJCSgoKF92KSA+PiAyKSAmIDB4MSkJLyogZGlzYWJsZSBmYXN0IGZyYW1lcyAqLwogI2RlZmluZSBBUjVLX0VFUFJPTV9CVVJTVF9ESVMoX3YpCSgoKF92KSA+PiAzKSAmIDB4MSkJLyogZGlzYWJsZSBidXJzdGluZyAqLwogI2RlZmluZSBBUjVLX0VFUFJPTV9NQVhfUUNVKF92KQkJKCgoX3YpID4+IDQpICYgMHhmKQkvKiBtYXggbnVtYmVyIG9mIFFDVXMuIGRlZmF1bHRzIHRvIDEwICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX0hFQVZZX0NMSVBfRU4oX3YpCSgoKF92KSA+PiA4KSAmIDB4MSkJLyogZW5hYmxlIGhlYXl5IGNsaXBwaW5nICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0hFQVZZX0NMSVBfRU4oX3YpCSgoKF92KSA+PiA4KSAmIDB4MSkJLyogZW5hYmxlIGhlYXZ5IGNsaXBwaW5nICovCiAjZGVmaW5lIEFSNUtfRUVQUk9NX0tFWV9DQUNIRV9TSVpFKF92KQkoKChfdikgPj4gMTIpICYgMHhmKQkvKiBrZXkgY2FjaGUgc2l6ZS4gZGVmYXVsdHMgdG8gMTI4ICovCiAKICNkZWZpbmUgQVI1S19FRVBST01fTUlTQzYJCUFSNUtfRUVQUk9NX0lORk8oMTApCkBAIC0yMjMsNyArMjIzLDcgQEAKICNkZWZpbmUgQVI1S19FRVBST01fQ0NLX09GRE1fREVMVEEJMTUKICNkZWZpbmUgQVI1S19FRVBST01fTl9JUV9DQUwJCTIKIC8qIDVHSHovMkdIeiAqLwotZW51bSBhdGg1a19lZXByb21fZnJlcV9iYW5kc3sKK2VudW0gYXRoNWtfZWVwcm9tX2ZyZXFfYmFuZHMgewogCUFSNUtfRUVQUk9NX0JBTkRfNUdIWiA9IDAsCiAJQVI1S19FRVBST01fQkFORF8yR0haID0gMSwKIAlBUjVLX0VFUFJPTV9OX0ZSRVFfQkFORFMsCkBAIC0yNzAsNyArMjcwLDcgQEAKIAogLyogUGVyIGNoYW5uZWwgY2FsaWJyYXRpb24gZGF0YSwgdXNlZCBmb3IgcG93ZXIgdGFibGUgc2V0dXAgKi8KIHN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mb19yZjUxMTEgewotCS8qIFBvd2VyIGxldmVscyBpbiBoYWxmIGRibSB1bml0cworCS8qIFBvd2VyIGxldmVscyBpbiBoYWxmIGRCbSB1bml0cwogCSAqIGZvciBvbmUgcG93ZXIgY3VydmUuICovCiAJdTggcHdyW0FSNUtfRUVQUk9NX05fUFdSX1BPSU5UU181MTExXTsKIAkvKiBQQ0RBQyB0YWJsZSBzdGVwcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2luaXR2YWxzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYwppbmRleCBlNDkzNDBkLi41YWI2MDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYwpAQCAtMTEzLDggKzExMyw4IEBACiAJeyBBUjVLX1BIWSgyOCksCTB4MDAwMDAwMGYgfSwKIAl7IEFSNUtfUEhZKDI5KSwJMHgwMDAwMDA4MCB9LAogCXsgQVI1S19QSFkoMzApLAkweDAwMDAwMDA0IH0sCi0JeyBBUjVLX1BIWSgzMSksCTB4MDAwMDAwMTggfSwgCS8qIDB4OTg3YyAqLwotCXsgQVI1S19QSFkoNjQpLAkweDAwMDAwMDAwIH0sIAkvKiAweDk5MDAgKi8KKwl7IEFSNUtfUEhZKDMxKSwJMHgwMDAwMDAxOCB9LAkvKiAweDk4N2MgKi8KKwl7IEFSNUtfUEhZKDY0KSwJMHgwMDAwMDAwMCB9LAkvKiAweDk5MDAgKi8KIAl7IEFSNUtfUEhZKDY1KSwJMHgwMDAwMDAwMCB9LAogCXsgQVI1S19QSFkoNjYpLAkweDAwMDAwMDAwIH0sCiAJeyBBUjVLX1BIWSg2NyksCTB4MDA4MDAwMDAgfSwKQEAgLTU0OSw3ICs1NDksNyBAQAogCXsgQVI1S19ESUFHX1NXXzUyMTEsCTB4MDAwMDAwMDAgfSwKIAl7IEFSNUtfQUREQUNfVEVTVCwJMHgwMDAwMDAwMCB9LAogCXsgQVI1S19ERUZBVUxUX0FOVEVOTkEsCTB4MDAwMDAwMDAgfSwKLQl7IEFSNUtfRlJBTUVfQ1RMX1FPU00sIAkweDAwMGZjNzhmIH0sCisJeyBBUjVLX0ZSQU1FX0NUTF9RT1NNLAkweDAwMGZjNzhmIH0sCiAJeyBBUjVLX1hSTU9ERSwJCTB4MmE4MjMwMWEgfSwKIAl7IEFSNUtfWFJERUxBWSwJCTB4MDVkYzAxZTAgfSwKIAl7IEFSNUtfWFJUSU1FT1VULAkweDFmNDAyNzEwIH0sCkBAIC03NjAsOSArNzYwLDkgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmkgcmY1MTExX2luaV9jb21tb25fZW5kW10gPSB7CiAJeyBBUjVLX0RDVV9GUCwJCTB4MDAwMDAwMDAgfSwKLQl7IEFSNUtfUEhZX0FHQywgCTB4MDAwMDAwMDAgfSwKLQl7IEFSNUtfUEhZX0FEQ19DVEwsIAkweDAwMDIyZmZlIH0sCi0JeyAweDk4M2MsIAkJMHgwMDAyMDEwMCB9LAorCXsgQVI1S19QSFlfQUdDLAkJMHgwMDAwMDAwMCB9LAorCXsgQVI1S19QSFlfQURDX0NUTCwJMHgwMDAyMmZmZSB9LAorCXsgMHg5ODNjLAkJMHgwMDAyMDEwMCB9LAogCXsgQVI1S19QSFlfR0FJTl9PRkZTRVQsCTB4MTI4NDYxM2MgfSwKIAl7IEFSNUtfUEhZX1BBUERfUFJPQkUsCTB4MDAwMDQ4ODMgfSwKIAl7IDB4OTk0MCwJCTB4MDAwMDAwMDQgfSwKQEAgLTE0MDksNyArMTQwOSw3IEBACiAJICogV3JpdGUgaW5pdGlhbCByZWdpc3RlciBzZXR0aW5ncwogCSAqLwogCi0JLyogRm9yIEFSNTIxMiBhbmQgY29tYmF0aWJsZSAqLworCS8qIEZvciBBUjUyMTIgYW5kIGNvbXBhdGlibGUgKi8KIAlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKIAogCQkvKiBGaXJzdCBzZXQgb2YgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyAqLwpAQCAtMTU0Miw3ICsxNTQyLDcgQEAKIAogCQkvKiBBUjVLX01PREVfMTFCICovCiAJCWlmIChtb2RlID4gMikgewotCQkJQVRINUtfRVJSKGFoLT5haF9zYywKKwkJCUFUSDVLX0VSUihhaCwKIAkJCQkidW5zdXBwb3J0ZWQgY2hhbm5lbCBtb2RlOiAlZFxuIiwgbW9kZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2xlZC5jCmluZGV4IDU3NmVkZjIuLjhjMTdhMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9sZWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvbGVkLmMKQEAgLTQzLDE2ICs0MywxNiBAQAogI2luY2x1ZGUgImF0aDVrLmgiCiAjaW5jbHVkZSAiYmFzZS5oIgogCi0jZGVmaW5lIEFUSF9TREVWSUNFKHN1YnYsc3ViZCkgXAorI2RlZmluZSBBVEhfU0RFVklDRShzdWJ2LCBzdWJkKSBcCiAJLnZlbmRvciA9IFBDSV9BTllfSUQsIC5kZXZpY2UgPSBQQ0lfQU5ZX0lELCBcCiAJLnN1YnZlbmRvciA9IChzdWJ2KSwgLnN1YmRldmljZSA9IChzdWJkKQogCi0jZGVmaW5lIEFUSF9MRUQocGluLHBvbGFyaXR5KSAuZHJpdmVyX2RhdGEgPSAoKChwaW4pIDw8IDgpIHwgKHBvbGFyaXR5KSkKKyNkZWZpbmUgQVRIX0xFRChwaW4sIHBvbGFyaXR5KSAuZHJpdmVyX2RhdGEgPSAoKChwaW4pIDw8IDgpIHwgKHBvbGFyaXR5KSkKICNkZWZpbmUgQVRIX1BJTihkYXRhKSAoKGRhdGEpID4+IDgpCiAjZGVmaW5lIEFUSF9QT0xBUklUWShkYXRhKSAoKGRhdGEpICYgMHhmZikKIAogLyogRGV2aWNlcyB3ZSBtYXRjaCBvbiBmb3IgTEVEIGNvbmZpZyBpbmZvICh0eXBpY2FsbHkgbGFwdG9wcykgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhdGg1a19sZWRfZGV2aWNlc1tdID0geworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGF0aDVrX2xlZF9kZXZpY2VzKSA9IHsKIAkvKiBBUjUyMTEgKi8KIAl7IFBDSV9WREVWSUNFKEFUSEVST1MsIFBDSV9ERVZJQ0VfSURfQVRIRVJPU19BUjUyMTEpLCBBVEhfTEVEKDAsIDApIH0sCiAJLyogSFAgQ29tcGFxIG5jNnh4LCBuYzQwMDAsIG54NjAwMCAqLwpAQCAtODYsMjYgKzg2LDI2IEBACiAJeyB9CiB9OwogCi12b2lkIGF0aDVrX2xlZF9lbmFibGUoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK3ZvaWQgYXRoNWtfbGVkX2VuYWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCWlmICh0ZXN0X2JpdChBVEhfU1RBVF9MRURTT0ZULCBzYy0+c3RhdHVzKSkgewotCQlhdGg1a19od19zZXRfZ3Bpb19vdXRwdXQoc2MtPmFoLCBzYy0+bGVkX3Bpbik7Ci0JCWF0aDVrX2xlZF9vZmYoc2MpOworCWlmICh0ZXN0X2JpdChBVEhfU1RBVF9MRURTT0ZULCBhaC0+c3RhdHVzKSkgeworCQlhdGg1a19od19zZXRfZ3Bpb19vdXRwdXQoYWgsIGFoLT5sZWRfcGluKTsKKwkJYXRoNWtfbGVkX29mZihhaCk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdGg1a19sZWRfb24oc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK3N0YXRpYyB2b2lkIGF0aDVrX2xlZF9vbihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCWlmICghdGVzdF9iaXQoQVRIX1NUQVRfTEVEU09GVCwgc2MtPnN0YXR1cykpCisJaWYgKCF0ZXN0X2JpdChBVEhfU1RBVF9MRURTT0ZULCBhaC0+c3RhdHVzKSkKIAkJcmV0dXJuOwotCWF0aDVrX2h3X3NldF9ncGlvKHNjLT5haCwgc2MtPmxlZF9waW4sIHNjLT5sZWRfb24pOworCWF0aDVrX2h3X3NldF9ncGlvKGFoLCBhaC0+bGVkX3BpbiwgYWgtPmxlZF9vbik7CiB9CiAKLXZvaWQgYXRoNWtfbGVkX29mZihzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQordm9pZCBhdGg1a19sZWRfb2ZmKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0JaWYgKCF0ZXN0X2JpdChBVEhfU1RBVF9MRURTT0ZULCBzYy0+c3RhdHVzKSkKKwlpZiAoIXRlc3RfYml0KEFUSF9TVEFUX0xFRFNPRlQsIGFoLT5zdGF0dXMpKQogCQlyZXR1cm47Ci0JYXRoNWtfaHdfc2V0X2dwaW8oc2MtPmFoLCBzYy0+bGVkX3BpbiwgIXNjLT5sZWRfb24pOworCWF0aDVrX2h3X3NldF9ncGlvKGFoLCBhaC0+bGVkX3BpbiwgIWFoLT5sZWRfb24pOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTE2LDI3ICsxMTYsMjcgQEAKIAkJbGVkX2Rldik7CiAKIAlpZiAoYnJpZ2h0bmVzcyA9PSBMRURfT0ZGKQotCQlhdGg1a19sZWRfb2ZmKGxlZC0+c2MpOworCQlhdGg1a19sZWRfb2ZmKGxlZC0+YWgpOwogCWVsc2UKLQkJYXRoNWtfbGVkX29uKGxlZC0+c2MpOworCQlhdGg1a19sZWRfb24obGVkLT5haCk7CiB9CiAKIHN0YXRpYyBpbnQKLWF0aDVrX3JlZ2lzdGVyX2xlZChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoNWtfbGVkICpsZWQsCithdGg1a19yZWdpc3Rlcl9sZWQoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2xlZCAqbGVkLAogCQkgICBjb25zdCBjaGFyICpuYW1lLCBjaGFyICp0cmlnZ2VyKQogewogCWludCBlcnI7CiAKLQlsZWQtPnNjID0gc2M7CisJbGVkLT5haCA9IGFoOwogCXN0cm5jcHkobGVkLT5uYW1lLCBuYW1lLCBzaXplb2YobGVkLT5uYW1lKSk7CiAJbGVkLT5sZWRfZGV2Lm5hbWUgPSBsZWQtPm5hbWU7CiAJbGVkLT5sZWRfZGV2LmRlZmF1bHRfdHJpZ2dlciA9IHRyaWdnZXI7CiAJbGVkLT5sZWRfZGV2LmJyaWdodG5lc3Nfc2V0ID0gYXRoNWtfbGVkX2JyaWdodG5lc3Nfc2V0OwogCi0JZXJyID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKHNjLT5kZXYsICZsZWQtPmxlZF9kZXYpOworCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcihhaC0+ZGV2LCAmbGVkLT5sZWRfZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCUFUSDVLX1dBUk4oc2MsICJjb3VsZCBub3QgcmVnaXN0ZXIgTEVEICVzXG4iLCBuYW1lKTsKLQkJbGVkLT5zYyA9IE5VTEw7CisJCUFUSDVLX1dBUk4oYWgsICJjb3VsZCBub3QgcmVnaXN0ZXIgTEVEICVzXG4iLCBuYW1lKTsKKwkJbGVkLT5haCA9IE5VTEw7CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC0xNDQsMzAgKzE0NCwzMCBAQAogc3RhdGljIHZvaWQKIGF0aDVrX3VucmVnaXN0ZXJfbGVkKHN0cnVjdCBhdGg1a19sZWQgKmxlZCkKIHsKLQlpZiAoIWxlZC0+c2MpCisJaWYgKCFsZWQtPmFoKQogCQlyZXR1cm47CiAJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmxlZC0+bGVkX2Rldik7Ci0JYXRoNWtfbGVkX29mZihsZWQtPnNjKTsKLQlsZWQtPnNjID0gTlVMTDsKKwlhdGg1a19sZWRfb2ZmKGxlZC0+YWgpOworCWxlZC0+YWggPSBOVUxMOwogfQogCi12b2lkIGF0aDVrX3VucmVnaXN0ZXJfbGVkcyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQordm9pZCBhdGg1a191bnJlZ2lzdGVyX2xlZHMoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlhdGg1a191bnJlZ2lzdGVyX2xlZCgmc2MtPnJ4X2xlZCk7Ci0JYXRoNWtfdW5yZWdpc3Rlcl9sZWQoJnNjLT50eF9sZWQpOworCWF0aDVrX3VucmVnaXN0ZXJfbGVkKCZhaC0+cnhfbGVkKTsKKwlhdGg1a191bnJlZ2lzdGVyX2xlZCgmYWgtPnR4X2xlZCk7CiB9CiAKLWludCBhdGg1a19pbml0X2xlZHMoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK2ludCBfX2RldmluaXQgYXRoNWtfaW5pdF9sZWRzKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBzYy0+aHc7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBhaC0+aHc7CiAjaWZuZGVmIENPTkZJR19BVEhFUk9TX0FSMjMxWAotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gc2MtPnBkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhaC0+cGRldjsKICNlbmRpZgogCWNoYXIgbmFtZVtBVEg1S19MRURfTUFYX05BTUVfTEVOICsgMV07CiAJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKm1hdGNoOwogCi0JaWYgKCFzYy0+cGRldikKKwlpZiAoIWFoLT5wZGV2KQogCQlyZXR1cm4gMDsKIAogI2lmZGVmIENPTkZJR19BVEhFUk9TX0FSMjMxWApAQCAtMTc2LDI0ICsxNzYsMjQgQEAKIAltYXRjaCA9IHBjaV9tYXRjaF9pZCgmYXRoNWtfbGVkX2RldmljZXNbMF0sIHBkZXYpOwogI2VuZGlmCiAJaWYgKG1hdGNoKSB7Ci0JCV9fc2V0X2JpdChBVEhfU1RBVF9MRURTT0ZULCBzYy0+c3RhdHVzKTsKLQkJc2MtPmxlZF9waW4gPSBBVEhfUElOKG1hdGNoLT5kcml2ZXJfZGF0YSk7Ci0JCXNjLT5sZWRfb24gPSBBVEhfUE9MQVJJVFkobWF0Y2gtPmRyaXZlcl9kYXRhKTsKKwkJX19zZXRfYml0KEFUSF9TVEFUX0xFRFNPRlQsIGFoLT5zdGF0dXMpOworCQlhaC0+bGVkX3BpbiA9IEFUSF9QSU4obWF0Y2gtPmRyaXZlcl9kYXRhKTsKKwkJYWgtPmxlZF9vbiA9IEFUSF9QT0xBUklUWShtYXRjaC0+ZHJpdmVyX2RhdGEpOwogCX0KIAotCWlmICghdGVzdF9iaXQoQVRIX1NUQVRfTEVEU09GVCwgc2MtPnN0YXR1cykpCisJaWYgKCF0ZXN0X2JpdChBVEhfU1RBVF9MRURTT0ZULCBhaC0+c3RhdHVzKSkKIAkJZ290byBvdXQ7CiAKLQlhdGg1a19sZWRfZW5hYmxlKHNjKTsKKwlhdGg1a19sZWRfZW5hYmxlKGFoKTsKIAogCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImF0aDVrLSVzOjpyeCIsIHdpcGh5X25hbWUoaHctPndpcGh5KSk7Ci0JcmV0ID0gYXRoNWtfcmVnaXN0ZXJfbGVkKHNjLCAmc2MtPnJ4X2xlZCwgbmFtZSwKKwlyZXQgPSBhdGg1a19yZWdpc3Rlcl9sZWQoYWgsICZhaC0+cnhfbGVkLCBuYW1lLAogCQlpZWVlODAyMTFfZ2V0X3J4X2xlZF9uYW1lKGh3KSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKIAlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJhdGg1ay0lczo6dHgiLCB3aXBoeV9uYW1lKGh3LT53aXBoeSkpOwotCXJldCA9IGF0aDVrX3JlZ2lzdGVyX2xlZChzYywgJnNjLT50eF9sZWQsIG5hbWUsCisJcmV0ID0gYXRoNWtfcmVnaXN0ZXJfbGVkKGFoLCAmYWgtPnR4X2xlZCwgbmFtZSwKIAkJaWVlZTgwMjExX2dldF90eF9sZWRfbmFtZShodykpOwogb3V0OgogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvbWFjODAyMTEtb3BzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvbWFjODAyMTEtb3BzLmMKaW5kZXggODA3YmQ2NC4uMmE3MTVjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL21hYzgwMjExLW9wcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9tYWM4MDIxMS1vcHMuYwpAQCAtNDYsOCArNDYsNiBAQAogI2luY2x1ZGUgImJhc2UuaCIKICNpbmNsdWRlICJyZWcuaCIKIAotZXh0ZXJuIGludCBhdGg1a19tb2RwYXJhbV9ub2h3Y3J5cHQ7Ci0KIC8qKioqKioqKioqKioqKioqKioqKlwKICogTWFjODAyMTEgZnVuY3Rpb25zICoKIFwqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU1LDQ0ICs1MywzMCBAQAogc3RhdGljIHZvaWQKIGF0aDVrX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gaHctPnByaXY7CiAJdTE2IHFudW0gPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKIAotCWlmIChXQVJOX09OKHFudW0gPj0gc2MtPmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bSkpIHsKKwlpZiAoV0FSTl9PTihxbnVtID49IGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bSkpIHsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJcmV0dXJuOwogCX0KIAotCWF0aDVrX3R4X3F1ZXVlKGh3LCBza2IsICZzYy0+dHhxc1txbnVtXSk7Ci19Ci0KLQotc3RhdGljIGludAotYXRoNWtfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0JcmV0dXJuIGF0aDVrX2luaXRfaHcoaHctPnByaXYpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1hdGg1a19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCWF0aDVrX3N0b3BfaHcoaHctPnByaXYpOworCWF0aDVrX3R4X3F1ZXVlKGh3LCBza2IsICZhaC0+dHhxc1txbnVtXSk7CiB9CiAKIAogc3RhdGljIGludAogYXRoNWtfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OwogCWludCByZXQ7CiAJc3RydWN0IGF0aDVrX3ZpZiAqYXZmID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwogCi0JbXV0ZXhfbG9jaygmc2MtPmxvY2spOworCW11dGV4X2xvY2soJmFoLT5sb2NrKTsKIAogCWlmICgodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CiAJICAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCi0JICAgICYmIChzYy0+bnVtX2FwX3ZpZnMgKyBzYy0+bnVtX2FkaG9jX3ZpZnMpID49IEFUSF9CQ0JVRikgeworCSAgICAmJiAoYWgtPm51bV9hcF92aWZzICsgYWgtPm51bV9hZGhvY192aWZzKSA+PSBBVEhfQkNCVUYpIHsKIAkJcmV0ID0gLUVMTlJORzsKIAkJZ290byBlbmQ7CiAJfQpAQCAtMTAyLDkgKzg2LDkgQEAKIAkgKiBXZSB3b3VsZCBuZWVkIHRvIG9wZXJhdGUgdGhlIEhXIGluIGFkLWhvYyBtb2RlIHRvIGFsbG93IFRTRiB1cGRhdGVzCiAJICogZm9yIHRoZSBJQlNTLCBidXQgdGhpcyBicmVha3Mgd2l0aCBhZGRpdGlvbmFsIEFQIG9yIFNUQSBpbnRlcmZhY2VzCiAJICogYXQgdGhlIG1vbWVudC4gKi8KLQlpZiAoc2MtPm51bV9hZGhvY192aWZzIHx8Ci0JICAgIChzYy0+bnZpZnMgJiYgdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSkgewotCQlBVEg1S19FUlIoc2MsICJPbmx5IG9uZSBzaW5nbGUgYWQtaG9jIGludGVyZmFjZSBpcyBhbGxvd2VkLlxuIik7CisJaWYgKGFoLT5udW1fYWRob2NfdmlmcyB8fAorCSAgICAoYWgtPm52aWZzICYmIHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykpIHsKKwkJQVRINUtfRVJSKGFoLCAiT25seSBvbmUgc2luZ2xlIGFkLWhvYyBpbnRlcmZhY2UgaXMgYWxsb3dlZC5cbiIpOwogCQlyZXQgPSAtRUxOUk5HOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0xMjEsOCArMTA1LDggQEAKIAkJZ290byBlbmQ7CiAJfQogCi0Jc2MtPm52aWZzKys7Ci0JQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19NT0RFLCAiYWRkIGludGVyZmFjZSBtb2RlICVkXG4iLCBhdmYtPm9wbW9kZSk7CisJYWgtPm52aWZzKys7CisJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19NT0RFLCAiYWRkIGludGVyZmFjZSBtb2RlICVkXG4iLCBhdmYtPm9wbW9kZSk7CiAKIAkvKiBBc3NpZ24gdGhlIHZhcC9hZGhvYyB0byBhIGJlYWNvbiB4bWl0IHNsb3QuICovCiAJaWYgKChhdmYtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgfHwKQEAgLTEzMCwzOCArMTE0LDM4IEBACiAJICAgIChhdmYtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSkgewogCQlpbnQgc2xvdDsKIAotCQlXQVJOX09OKGxpc3RfZW1wdHkoJnNjLT5iY2J1ZikpOwotCQlhdmYtPmJidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzYy0+YmNidWYsIHN0cnVjdCBhdGg1a19idWYsCisJCVdBUk5fT04obGlzdF9lbXB0eSgmYWgtPmJjYnVmKSk7CisJCWF2Zi0+YmJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJmFoLT5iY2J1Ziwgc3RydWN0IGF0aDVrX2J1ZiwKIAkJCQkJICAgICBsaXN0KTsKIAkJbGlzdF9kZWwoJmF2Zi0+YmJ1Zi0+bGlzdCk7CiAKIAkJYXZmLT5ic2xvdCA9IDA7CiAJCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBBVEhfQkNCVUY7IHNsb3QrKykgewotCQkJaWYgKCFzYy0+YnNsb3Rbc2xvdF0pIHsKKwkJCWlmICghYWgtPmJzbG90W3Nsb3RdKSB7CiAJCQkJYXZmLT5ic2xvdCA9IHNsb3Q7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJQlVHX09OKHNjLT5ic2xvdFthdmYtPmJzbG90XSAhPSBOVUxMKTsKLQkJc2MtPmJzbG90W2F2Zi0+YnNsb3RdID0gdmlmOworCQlCVUdfT04oYWgtPmJzbG90W2F2Zi0+YnNsb3RdICE9IE5VTEwpOworCQlhaC0+YnNsb3RbYXZmLT5ic2xvdF0gPSB2aWY7CiAJCWlmIChhdmYtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkKLQkJCXNjLT5udW1fYXBfdmlmcysrOworCQkJYWgtPm51bV9hcF92aWZzKys7CiAJCWVsc2UgaWYgKGF2Zi0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQotCQkJc2MtPm51bV9hZGhvY192aWZzKys7CisJCQlhaC0+bnVtX2FkaG9jX3ZpZnMrKzsKIAl9CiAKIAkvKiBBbnkgTUFDIGFkZHJlc3MgaXMgZmluZSwgYWxsIG90aGVycyBhcmUgaW5jbHVkZWQgdGhyb3VnaCB0aGUKIAkgKiBmaWx0ZXIuCiAJICovCi0JbWVtY3B5KCZzYy0+bGxhZGRyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKLQlhdGg1a19od19zZXRfbGxhZGRyKHNjLT5haCwgdmlmLT5hZGRyKTsKKwltZW1jcHkoJmFoLT5sbGFkZHIsIHZpZi0+YWRkciwgRVRIX0FMRU4pOworCWF0aDVrX2h3X3NldF9sbGFkZHIoYWgsIHZpZi0+YWRkcik7CiAKIAltZW1jcHkoJmF2Zi0+bGxhZGRyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKIAotCWF0aDVrX3VwZGF0ZV9ic3NpZF9tYXNrX2FuZF9vcG1vZGUoc2MsIHZpZik7CisJYXRoNWtfdXBkYXRlX2Jzc2lkX21hc2tfYW5kX29wbW9kZShhaCwgdmlmKTsKIAlyZXQgPSAwOwogZW5kOgotCW11dGV4X3VubG9jaygmc2MtPmxvY2spOworCW11dGV4X3VubG9jaygmYWgtPmxvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3MCwzMSArMTU0LDMxIEBACiBhdGg1a19yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OwogCXN0cnVjdCBhdGg1a192aWYgKmF2ZiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCW11dGV4X2xvY2soJnNjLT5sb2NrKTsKLQlzYy0+bnZpZnMtLTsKKwltdXRleF9sb2NrKCZhaC0+bG9jayk7CisJYWgtPm52aWZzLS07CiAKIAlpZiAoYXZmLT5iYnVmKSB7Ci0JCWF0aDVrX3R4YnVmX2ZyZWVfc2tiKHNjLCBhdmYtPmJidWYpOwotCQlsaXN0X2FkZF90YWlsKCZhdmYtPmJidWYtPmxpc3QsICZzYy0+YmNidWYpOworCQlhdGg1a190eGJ1Zl9mcmVlX3NrYihhaCwgYXZmLT5iYnVmKTsKKwkJbGlzdF9hZGRfdGFpbCgmYXZmLT5iYnVmLT5saXN0LCAmYWgtPmJjYnVmKTsKIAkJZm9yIChpID0gMDsgaSA8IEFUSF9CQ0JVRjsgaSsrKSB7Ci0JCQlpZiAoc2MtPmJzbG90W2ldID09IHZpZikgewotCQkJCXNjLT5ic2xvdFtpXSA9IE5VTEw7CisJCQlpZiAoYWgtPmJzbG90W2ldID09IHZpZikgeworCQkJCWFoLT5ic2xvdFtpXSA9IE5VTEw7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJYXZmLT5iYnVmID0gTlVMTDsKIAl9CiAJaWYgKGF2Zi0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKQotCQlzYy0+bnVtX2FwX3ZpZnMtLTsKKwkJYWgtPm51bV9hcF92aWZzLS07CiAJZWxzZSBpZiAoYXZmLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCi0JCXNjLT5udW1fYWRob2Nfdmlmcy0tOworCQlhaC0+bnVtX2FkaG9jX3ZpZnMtLTsKIAotCWF0aDVrX3VwZGF0ZV9ic3NpZF9tYXNrX2FuZF9vcG1vZGUoc2MsIE5VTEwpOwotCW11dGV4X3VubG9jaygmc2MtPmxvY2spOworCWF0aDVrX3VwZGF0ZV9ic3NpZF9tYXNrX2FuZF9vcG1vZGUoYWgsIE5VTEwpOworCW11dGV4X3VubG9jaygmYWgtPmxvY2spOwogfQogCiAKQEAgLTIwNCwyMyArMTg4LDIyIEBACiBzdGF0aWMgaW50CiBhdGg1a19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCXN0cnVjdCBhdGg1a19odyAqYWggPSBody0+cHJpdjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7CiAJaW50IHJldCA9IDA7CiAJaW50IGk7CiAKLQltdXRleF9sb2NrKCZzYy0+bG9jayk7CisJbXV0ZXhfbG9jaygmYWgtPmxvY2spOwogCiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkgewotCQlyZXQgPSBhdGg1a19jaGFuX3NldChzYywgY29uZi0+Y2hhbm5lbCk7CisJCXJldCA9IGF0aDVrX2NoYW5fc2V0KGFoLCBjb25mLT5jaGFubmVsKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIHVubG9jazsKIAl9CiAKIAlpZiAoKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUE9XRVIpICYmCi0JKHNjLT5wb3dlcl9sZXZlbCAhPSBjb25mLT5wb3dlcl9sZXZlbCkpIHsKLQkJc2MtPnBvd2VyX2xldmVsID0gY29uZi0+cG93ZXJfbGV2ZWw7CisJKGFoLT5wb3dlcl9sZXZlbCAhPSBjb25mLT5wb3dlcl9sZXZlbCkpIHsKKwkJYWgtPnBvd2VyX2xldmVsID0gY29uZi0+cG93ZXJfbGV2ZWw7CiAKIAkJLyogSGFsZiBkQiBzdGVwcyAqLwogCQlhdGg1a19od19zZXRfdHhwb3dlcl9saW1pdChhaCwgKGNvbmYtPnBvd2VyX2xldmVsICogMikpOwpAQCAtMjU0LDcgKzIzNyw3IEBACiAJYXRoNWtfaHdfc2V0X2FudGVubmFfbW9kZShhaCwgYWgtPmFoX2FudF9tb2RlKTsKIAogdW5sb2NrOgotCW11dGV4X3VubG9jaygmc2MtPmxvY2spOworCW11dGV4X3VubG9jaygmYWgtPmxvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI2NCwxMiArMjQ3LDExIEBACiAJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiwgdTMyIGNoYW5nZXMpCiB7CiAJc3RydWN0IGF0aDVrX3ZpZiAqYXZmID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOworCXN0cnVjdCBhdGg1a19odyAqYWggPSBody0+cHJpdjsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKGFoKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JbXV0ZXhfbG9jaygmc2MtPmxvY2spOworCW11dGV4X2xvY2soJmFoLT5sb2NrKTsKIAogCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQlNTSUQpIHsKIAkJLyogQ2FjaGUgZm9yIGxhdGVyIHVzZSBkdXJpbmcgcmVzZXRzICovCkBAIC0yODAsNyArMjYyLDcgQEAKIAl9CiAKIAlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0JFQUNPTl9JTlQpCi0JCXNjLT5iaW50dmFsID0gYnNzX2NvbmYtPmJlYWNvbl9pbnQ7CisJCWFoLT5iaW50dmFsID0gYnNzX2NvbmYtPmJlYWNvbl9pbnQ7CiAKIAlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0VSUF9TTE9UKSB7CiAJCWludCBzbG90X3RpbWU7CkBAIC0yOTQsMTYgKzI3NiwxNiBAQAogCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKIAkJYXZmLT5hc3NvYyA9IGJzc19jb25mLT5hc3NvYzsKIAkJaWYgKGJzc19jb25mLT5hc3NvYykKLQkJCXNjLT5hc3NvYyA9IGJzc19jb25mLT5hc3NvYzsKKwkJCWFoLT5hc3NvYyA9IGJzc19jb25mLT5hc3NvYzsKIAkJZWxzZQotCQkJc2MtPmFzc29jID0gYXRoX2FueV92aWZfYXNzb2Moc2MpOworCQkJYWgtPmFzc29jID0gYXRoNWtfYW55X3ZpZl9hc3NvYyhhaCk7CiAKLQkJaWYgKHNjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKLQkJCXNldF9iZWFjb25fZmlsdGVyKGh3LCBzYy0+YXNzb2MpOwotCQlhdGg1a19od19zZXRfbGVkc3RhdGUoc2MtPmFoLCBzYy0+YXNzb2MgPworCQlpZiAoYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCQkJYXRoNWtfc2V0X2JlYWNvbl9maWx0ZXIoaHcsIGFoLT5hc3NvYyk7CisJCWF0aDVrX2h3X3NldF9sZWRzdGF0ZShhaCwgYWgtPmFzc29jID8KIAkJCUFSNUtfTEVEX0FTU09DIDogQVI1S19MRURfSU5JVCk7CiAJCWlmIChic3NfY29uZi0+YXNzb2MpIHsKLQkJCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfQU5ZLAorCQkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19BTlksCiAJCQkJICAiQnNzIEluZm8gQVNTT0MgJWQsIGJzc2lkOiAlcE1cbiIsCiAJCQkJICBic3NfY29uZi0+YWlkLCBjb21tb24tPmN1cmJzc2lkKTsKIAkJCWNvbW1vbi0+Y3VyYWlkID0gYnNzX2NvbmYtPmFpZDsKQEAgLTMxMywxOSArMjk1LDE5IEBACiAJfQogCiAJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CRUFDT04pIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5ibG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWgtPmJsb2NrLCBmbGFncyk7CiAJCWF0aDVrX2JlYWNvbl91cGRhdGUoaHcsIHZpZik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5ibG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaC0+YmxvY2ssIGZsYWdzKTsKIAl9CiAKIAlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKQotCQlzYy0+ZW5hYmxlX2JlYWNvbiA9IGJzc19jb25mLT5lbmFibGVfYmVhY29uOworCQlhaC0+ZW5hYmxlX2JlYWNvbiA9IGJzc19jb25mLT5lbmFibGVfYmVhY29uOwogCiAJaWYgKGNoYW5nZXMgJiAoQlNTX0NIQU5HRURfQkVBQ09OIHwgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQgfAogCQkgICAgICAgQlNTX0NIQU5HRURfQkVBQ09OX0lOVCkpCi0JCWF0aDVrX2JlYWNvbl9jb25maWcoc2MpOworCQlhdGg1a19iZWFjb25fY29uZmlnKGFoKTsKIAotCW11dGV4X3VubG9jaygmc2MtPmxvY2spOworCW11dGV4X3VubG9jaygmYWgtPmxvY2spOwogfQogCiAKQEAgLTM1MCw3ICszMzIsNyBAQAogCQltZmlsdFtwb3MgLyAzMl0gfD0gKDEgPDwgKHBvcyAlIDMyKSk7CiAJCS8qIFhYWDogd2UgbWlnaHQgYmUgYWJsZSB0byBqdXN0IGRvIHRoaXMgaW5zdGVhZCwKIAkJKiBidXQgbm90IHN1cmUsIG5lZWRzIHRlc3RpbmcsIGlmIHdlIGRvIHVzZSB0aGlzIHdlJ2QKLQkJKiBuZWV0IHRvIGluZm9ybSBiZWxvdyB0byBub3QgcmVzZXQgdGhlIG1jYXN0ICovCisJCSogbmVlZCB0byBpbmZvcm0gYmVsb3cgbm90IHRvIHJlc2V0IHRoZSBtY2FzdCAqLwogCQkvKiBhdGg1a19od19zZXRfbWNhc3RfZmlsdGVyaW5kZXgoYWgsCiAJCSAqICAgICAgaGEtPmFkZHJbNV0pOyAqLwogCX0KQEAgLTM4NiwxMiArMzY4LDExIEBACiAJRklGX1BMQ1BGQUlMIHwgRklGX0NPTlRST0wgfCBGSUZfT1RIRVJfQlNTIHwgXAogCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKQogCi0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OwogCXUzMiBtZmlsdFsyXSwgcmZpbHQ7CiAJc3RydWN0IGF0aDVrX3ZpZl9pdGVyX2RhdGEgaXRlcl9kYXRhOyAvKiB0byBjb3VudCBTVEEgaW50ZXJmYWNlcyAqLwogCi0JbXV0ZXhfbG9jaygmc2MtPmxvY2spOworCW11dGV4X2xvY2soJmFoLT5sb2NrKTsKIAogCW1maWx0WzBdID0gbXVsdGljYXN0OwogCW1maWx0WzFdID0gbXVsdGljYXN0ID4+IDMyOwpAQCAtNDA5LDEyICszOTAsMTIgQEAKIAogCWlmIChjaGFuZ2VkX2ZsYWdzICYgKEZJRl9QUk9NSVNDX0lOX0JTUyB8IEZJRl9PVEhFUl9CU1MpKSB7CiAJCWlmICgqbmV3X2ZsYWdzICYgRklGX1BST01JU0NfSU5fQlNTKQotCQkJX19zZXRfYml0KEFUSF9TVEFUX1BST01JU0MsIHNjLT5zdGF0dXMpOworCQkJX19zZXRfYml0KEFUSF9TVEFUX1BST01JU0MsIGFoLT5zdGF0dXMpOwogCQllbHNlCi0JCQlfX2NsZWFyX2JpdChBVEhfU1RBVF9QUk9NSVNDLCBzYy0+c3RhdHVzKTsKKwkJCV9fY2xlYXJfYml0KEFUSF9TVEFUX1BST01JU0MsIGFoLT5zdGF0dXMpOwogCX0KIAotCWlmICh0ZXN0X2JpdChBVEhfU1RBVF9QUk9NSVNDLCBzYy0+c3RhdHVzKSkKKwlpZiAodGVzdF9iaXQoQVRIX1NUQVRfUFJPTUlTQywgYWgtPnN0YXR1cykpCiAJCXJmaWx0IHw9IEFSNUtfUlhfRklMVEVSX1BST007CiAKIAkvKiBOb3RlLCBBUjVLX1JYX0ZJTFRFUl9NQ0FTVCBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KQEAgLTQyOSw3ICs0MTAsNyBAQAogCiAJLyogRklGX0JDTl9QUkJSRVNQX1BST01JU0MgcmVhbGx5IG1lYW5zIHRvIGVuYWJsZSBiZWFjb25zCiAJKiBhbmQgcHJvYmVzIGZvciBhbnkgQlNTSUQgKi8KLQlpZiAoKCpuZXdfZmxhZ3MgJiBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQykgfHwgKHNjLT5udmlmcyA+IDEpKQorCWlmICgoKm5ld19mbGFncyAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKSB8fCAoYWgtPm52aWZzID4gMSkpCiAJCXJmaWx0IHw9IEFSNUtfUlhfRklMVEVSX0JFQUNPTjsKIAogCS8qIEZJRl9DT05UUk9MIGRvYyBzYXlzIHRoYXQgaWYgRklGX1BST01JU0NfSU5fQlNTIGlzIG5vdApAQCAtNDQ0LDcgKzQyNSw3IEBACiAKIAkvKiBYWFggbW92ZSB0aGVzZSB0byBtYWM4MDIxMSwgYW5kIGFkZCBhIGJlYWNvbiBJRkYgZmxhZyB0byBtYWM4MDIxMSAqLwogCi0Jc3dpdGNoIChzYy0+b3Btb2RlKSB7CisJc3dpdGNoIChhaC0+b3Btb2RlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgogCQlyZmlsdCB8PSBBUjVLX1JYX0ZJTFRFUl9DT05UUk9MIHwKIAkJCSBBUjVLX1JYX0ZJTFRFUl9CRUFDT04gfApAQCAtNDU3LDcgKzQzOCw3IEBACiAJCQkgQVI1S19SWF9GSUxURVJfQkVBQ09OOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JCWlmIChzYy0+YXNzb2MpCisJCWlmIChhaC0+YXNzb2MpCiAJCQlyZmlsdCB8PSBBUjVLX1JYX0ZJTFRFUl9CRUFDT047CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC00NjYsMTQgKzQ0NywxNCBAQAogCWl0ZXJfZGF0YS5od19tYWNhZGRyID0gTlVMTDsKIAlpdGVyX2RhdGEubl9zdGFzID0gMDsKIAlpdGVyX2RhdGEubmVlZF9zZXRfaHdfYWRkciA9IGZhbHNlOwotCWllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzX2F0b21pYyhzYy0+aHcsIGF0aDVrX3ZpZl9pdGVyLAorCWllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzX2F0b21pYyhhaC0+aHcsIGF0aDVrX3ZpZl9pdGVyLAogCQkJCQkJICAgJml0ZXJfZGF0YSk7CiAKIAkvKiBTZXQgdXAgUlggRmlsdGVyICovCiAJaWYgKGl0ZXJfZGF0YS5uX3N0YXMgPiAxKSB7CiAJCS8qIElmIHlvdSBoYXZlIG11bHRpcGxlIFNUQSBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0bwogCQkgKiBkaWZmZXJlbnQgQVBzLCBBUlBzIGFyZSBub3QgcmVjZWl2ZWQgKG1vc3Qgb2YgdGhlIHRpbWU/KQotCQkgKiBFbmFibGluZyBQUk9NSVNDIGFwcGVhcnMgdG8gZml4IHRoYXQgcHJvYmVtLgorCQkgKiBFbmFibGluZyBQUk9NSVNDIGFwcGVhcnMgdG8gZml4IHRoYXQgcHJvYmxlbS4KIAkJICovCiAJCXJmaWx0IHw9IEFSNUtfUlhfRklMVEVSX1BST007CiAJfQpAQCAtNDg1LDkgKzQ2Niw5IEBACiAJYXRoNWtfaHdfc2V0X21jYXN0X2ZpbHRlcihhaCwgbWZpbHRbMF0sIG1maWx0WzFdKTsKIAkvKiBTZXQgdGhlIGNhY2hlZCBodyBmaWx0ZXIgZmxhZ3MsIHRoaXMgd2lsbCBsYXRlciBhY3R1YWxseQogCSAqIGJlIHNldCBpbiBIVyAqLwotCXNjLT5maWx0ZXJfZmxhZ3MgPSByZmlsdDsKKwlhaC0+ZmlsdGVyX2ZsYWdzID0gcmZpbHQ7CiAKLQltdXRleF91bmxvY2soJnNjLT5sb2NrKTsKKwltdXRleF91bmxvY2soJmFoLT5sb2NrKTsKIH0KIAogCkBAIC00OTYsOCArNDc3LDcgQEAKIAkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAogCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gaHctPnByaXY7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJaW50IHJldCA9IDA7CiAKQEAgLTUxOCw3ICs0OTgsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltdXRleF9sb2NrKCZzYy0+bG9jayk7CisJbXV0ZXhfbG9jaygmYWgtPmxvY2spOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNFVF9LRVk6CkBAIC01NDIsNyArNTIyLDcgQEAKIAl9CiAKIAltbWlvd2IoKTsKLQltdXRleF91bmxvY2soJnNjLT5sb2NrKTsKKwltdXRleF91bmxvY2soJmFoLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01NTAsMTcgKzUzMCwxNyBAQAogc3RhdGljIHZvaWQKIGF0aDVrX3N3X3NjYW5fc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCWlmICghc2MtPmFzc29jKQotCQlhdGg1a19od19zZXRfbGVkc3RhdGUoc2MtPmFoLCBBUjVLX0xFRF9TQ0FOKTsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gaHctPnByaXY7CisJaWYgKCFhaC0+YXNzb2MpCisJCWF0aDVrX2h3X3NldF9sZWRzdGF0ZShhaCwgQVI1S19MRURfU0NBTik7CiB9CiAKIAogc3RhdGljIHZvaWQKIGF0aDVrX3N3X3NjYW5fY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCWF0aDVrX2h3X3NldF9sZWRzdGF0ZShzYy0+YWgsIHNjLT5hc3NvYyA/CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OworCWF0aDVrX2h3X3NldF9sZWRzdGF0ZShhaCwgYWgtPmFzc29jID8KIAkJQVI1S19MRURfQVNTT0MgOiBBUjVLX0xFRF9JTklUKTsKIH0KIApAQCAtNTY5LDE1ICs1NDksMTUgQEAKIGF0aDVrX2dldF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgKnN0YXRzKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gaHctPnByaXY7CiAKIAkvKiBGb3JjZSB1cGRhdGUgKi8KLQlhdGg1a19od191cGRhdGVfbWliX2NvdW50ZXJzKHNjLT5haCk7CisJYXRoNWtfaHdfdXBkYXRlX21pYl9jb3VudGVycyhhaCk7CiAKLQlzdGF0cy0+ZG90MTFBQ0tGYWlsdXJlQ291bnQgPSBzYy0+c3RhdHMuYWNrX2ZhaWw7Ci0Jc3RhdHMtPmRvdDExUlRTRmFpbHVyZUNvdW50ID0gc2MtPnN0YXRzLnJ0c19mYWlsOwotCXN0YXRzLT5kb3QxMVJUU1N1Y2Nlc3NDb3VudCA9IHNjLT5zdGF0cy5ydHNfb2s7Ci0Jc3RhdHMtPmRvdDExRkNTRXJyb3JDb3VudCA9IHNjLT5zdGF0cy5mY3NfZXJyb3I7CisJc3RhdHMtPmRvdDExQUNLRmFpbHVyZUNvdW50ID0gYWgtPnN0YXRzLmFja19mYWlsOworCXN0YXRzLT5kb3QxMVJUU0ZhaWx1cmVDb3VudCA9IGFoLT5zdGF0cy5ydHNfZmFpbDsKKwlzdGF0cy0+ZG90MTFSVFNTdWNjZXNzQ291bnQgPSBhaC0+c3RhdHMucnRzX29rOworCXN0YXRzLT5kb3QxMUZDU0Vycm9yQ291bnQgPSBhaC0+c3RhdHMuZmNzX2Vycm9yOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01ODcsMTUgKzU2NywxNCBAQAogYXRoNWtfY29uZl90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IHF1ZXVlLAogCSAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OwogCXN0cnVjdCBhdGg1a190eHFfaW5mbyBxaTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChxdWV1ZSA+PSBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0pCiAJCXJldHVybiAwOwogCi0JbXV0ZXhfbG9jaygmc2MtPmxvY2spOworCW11dGV4X2xvY2soJmFoLT5sb2NrKTsKIAogCWF0aDVrX2h3X2dldF90eF9xdWV1ZXByb3BzKGFoLCBxdWV1ZSwgJnFpKTsKIApAQCAtNjA0LDIwICs1ODMsMjAgQEAKIAlxaS50cWlfY3dfbWF4ID0gcGFyYW1zLT5jd19tYXg7CiAJcWkudHFpX2J1cnN0X3RpbWUgPSBwYXJhbXMtPnR4b3A7CiAKLQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX0FOWSwKKwlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0FOWSwKIAkJICAiQ29uZmlndXJlIHR4IFtxdWV1ZSAlZF0sICAiCiAJCSAgImFpZnM6ICVkLCBjd19taW46ICVkLCBjd19tYXg6ICVkLCB0eG9wOiAlZFxuIiwKIAkJICBxdWV1ZSwgcGFyYW1zLT5haWZzLCBwYXJhbXMtPmN3X21pbiwKIAkJICBwYXJhbXMtPmN3X21heCwgcGFyYW1zLT50eG9wKTsKIAogCWlmIChhdGg1a19od19zZXRfdHhfcXVldWVwcm9wcyhhaCwgcXVldWUsICZxaSkpIHsKLQkJQVRINUtfRVJSKHNjLAorCQlBVEg1S19FUlIoYWgsCiAJCQkgICJVbmFibGUgdG8gdXBkYXRlIGhhcmR3YXJlIHF1ZXVlICV1IVxuIiwgcXVldWUpOwogCQlyZXQgPSAtRUlPOwogCX0gZWxzZQogCQlhdGg1a19od19yZXNldF90eF9xdWV1ZShhaCwgcXVldWUpOwogCi0JbXV0ZXhfdW5sb2NrKCZzYy0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhaC0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjI2LDQzICs2MDUsNDMgQEAKIHN0YXRpYyB1NjQKIGF0aDVrX2dldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OworCXN0cnVjdCBhdGg1a19odyAqYWggPSBody0+cHJpdjsKIAotCXJldHVybiBhdGg1a19od19nZXRfdHNmNjQoc2MtPmFoKTsKKwlyZXR1cm4gYXRoNWtfaHdfZ2V0X3RzZjY0KGFoKTsKIH0KIAogCiBzdGF0aWMgdm9pZAogYXRoNWtfc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTY0IHRzZikKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OwogCi0JYXRoNWtfaHdfc2V0X3RzZjY0KHNjLT5haCwgdHNmKTsKKwlhdGg1a19od19zZXRfdHNmNjQoYWgsIHRzZik7CiB9CiAKIAogc3RhdGljIHZvaWQKIGF0aDVrX3Jlc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OwogCiAJLyoKIAkgKiBpbiBJQlNTIG1vZGUgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGJlYWNvbiB0aW1lcnMgdG9vLgogCSAqIHRoaXMgd2lsbCBhbHNvIHJlc2V0IHRoZSBUU0YgaWYgd2UgY2FsbCBpdCB3aXRoIDAKIAkgKi8KLQlpZiAoc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKLQkJYXRoNWtfYmVhY29uX3VwZGF0ZV90aW1lcnMoc2MsIDApOworCWlmIChhaC0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQorCQlhdGg1a19iZWFjb25fdXBkYXRlX3RpbWVycyhhaCwgMCk7CiAJZWxzZQotCQlhdGg1a19od19yZXNldF90c2Yoc2MtPmFoKTsKKwkJYXRoNWtfaHdfcmVzZXRfdHNmKGFoKTsKIH0KIAogCiBzdGF0aWMgaW50CiBhdGg1a19nZXRfc3VydmV5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgaWR4LCBzdHJ1Y3Qgc3VydmV5X2luZm8gKnN1cnZleSkKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OwogCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKLQlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKHNjLT5haCk7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJc3RydWN0IGF0aF9jeWNsZV9jb3VudGVycyAqY2MgPSAmY29tbW9uLT5jY19zdXJ2ZXk7CiAJdW5zaWduZWQgaW50IGRpdiA9IGNvbW1vbi0+Y2xvY2tyYXRlICogMTAwMDsKIApAQCAtNjcyLDE4ICs2NTEsMTggQEAKIAlzcGluX2xvY2tfYmgoJmNvbW1vbi0+Y2NfbG9jayk7CiAJYXRoX2h3X2N5Y2xlX2NvdW50ZXJzX3VwZGF0ZShjb21tb24pOwogCWlmIChjYy0+Y3ljbGVzID4gMCkgewotCQlzYy0+c3VydmV5LmNoYW5uZWxfdGltZSArPSBjYy0+Y3ljbGVzIC8gZGl2OwotCQlzYy0+c3VydmV5LmNoYW5uZWxfdGltZV9idXN5ICs9IGNjLT5yeF9idXN5IC8gZGl2OwotCQlzYy0+c3VydmV5LmNoYW5uZWxfdGltZV9yeCArPSBjYy0+cnhfZnJhbWUgLyBkaXY7Ci0JCXNjLT5zdXJ2ZXkuY2hhbm5lbF90aW1lX3R4ICs9IGNjLT50eF9mcmFtZSAvIGRpdjsKKwkJYWgtPnN1cnZleS5jaGFubmVsX3RpbWUgKz0gY2MtPmN5Y2xlcyAvIGRpdjsKKwkJYWgtPnN1cnZleS5jaGFubmVsX3RpbWVfYnVzeSArPSBjYy0+cnhfYnVzeSAvIGRpdjsKKwkJYWgtPnN1cnZleS5jaGFubmVsX3RpbWVfcnggKz0gY2MtPnJ4X2ZyYW1lIC8gZGl2OworCQlhaC0+c3VydmV5LmNoYW5uZWxfdGltZV90eCArPSBjYy0+dHhfZnJhbWUgLyBkaXY7CiAJfQogCW1lbXNldChjYywgMCwgc2l6ZW9mKCpjYykpOwogCXNwaW5fdW5sb2NrX2JoKCZjb21tb24tPmNjX2xvY2spOwogCi0JbWVtY3B5KHN1cnZleSwgJnNjLT5zdXJ2ZXksIHNpemVvZigqc3VydmV5KSk7CisJbWVtY3B5KHN1cnZleSwgJmFoLT5zdXJ2ZXksIHNpemVvZigqc3VydmV5KSk7CiAKIAlzdXJ2ZXktPmNoYW5uZWwgPSBjb25mLT5jaGFubmVsOwotCXN1cnZleS0+bm9pc2UgPSBzYy0+YWgtPmFoX25vaXNlX2Zsb29yOworCXN1cnZleS0+bm9pc2UgPSBhaC0+YWhfbm9pc2VfZmxvb3I7CiAJc3VydmV5LT5maWxsZWQgPSBTVVJWRVlfSU5GT19OT0lTRV9EQk0gfAogCQkJU1VSVkVZX0lORk9fQ0hBTk5FTF9USU1FIHwKIAkJCVNVUlZFWV9JTkZPX0NIQU5ORUxfVElNRV9CVVNZIHwKQEAgLTcwNywyNSArNjg2LDI1IEBACiBzdGF0aWMgdm9pZAogYXRoNWtfc2V0X2NvdmVyYWdlX2NsYXNzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBjb3ZlcmFnZV9jbGFzcykKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OwogCi0JbXV0ZXhfbG9jaygmc2MtPmxvY2spOwotCWF0aDVrX2h3X3NldF9jb3ZlcmFnZV9jbGFzcyhzYy0+YWgsIGNvdmVyYWdlX2NsYXNzKTsKLQltdXRleF91bmxvY2soJnNjLT5sb2NrKTsKKwltdXRleF9sb2NrKCZhaC0+bG9jayk7CisJYXRoNWtfaHdfc2V0X2NvdmVyYWdlX2NsYXNzKGFoLCBjb3ZlcmFnZV9jbGFzcyk7CisJbXV0ZXhfdW5sb2NrKCZhaC0+bG9jayk7CiB9CiAKIAogc3RhdGljIGludAogYXRoNWtfc2V0X2FudGVubmEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB0eF9hbnQsIHUzMiByeF9hbnQpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OworCXN0cnVjdCBhdGg1a19odyAqYWggPSBody0+cHJpdjsKIAogCWlmICh0eF9hbnQgPT0gMSAmJiByeF9hbnQgPT0gMSkKLQkJYXRoNWtfaHdfc2V0X2FudGVubmFfbW9kZShzYy0+YWgsIEFSNUtfQU5UTU9ERV9GSVhFRF9BKTsKKwkJYXRoNWtfaHdfc2V0X2FudGVubmFfbW9kZShhaCwgQVI1S19BTlRNT0RFX0ZJWEVEX0EpOwogCWVsc2UgaWYgKHR4X2FudCA9PSAyICYmIHJ4X2FudCA9PSAyKQotCQlhdGg1a19od19zZXRfYW50ZW5uYV9tb2RlKHNjLT5haCwgQVI1S19BTlRNT0RFX0ZJWEVEX0IpOworCQlhdGg1a19od19zZXRfYW50ZW5uYV9tb2RlKGFoLCBBUjVLX0FOVE1PREVfRklYRURfQik7CiAJZWxzZSBpZiAoKHR4X2FudCAmIDMpID09IDMgJiYgKHJ4X2FudCAmIDMpID09IDMpCi0JCWF0aDVrX2h3X3NldF9hbnRlbm5hX21vZGUoc2MtPmFoLCBBUjVLX0FOVE1PREVfREVGQVVMVCk7CisJCWF0aDVrX2h3X3NldF9hbnRlbm5hX21vZGUoYWgsIEFSNUtfQU5UTU9ERV9ERUZBVUxUKTsKIAllbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiAwOwpAQCAtNzM1LDkgKzcxNCw5IEBACiBzdGF0aWMgaW50CiBhdGg1a19nZXRfYW50ZW5uYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyICp0eF9hbnQsIHUzMiAqcnhfYW50KQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gaHctPnByaXY7CiAKLQlzd2l0Y2ggKHNjLT5haC0+YWhfYW50X21vZGUpIHsKKwlzd2l0Y2ggKGFoLT5haF9hbnRfbW9kZSkgewogCWNhc2UgQVI1S19BTlRNT0RFX0ZJWEVEX0E6CiAJCSp0eF9hbnQgPSAxOyAqcnhfYW50ID0gMTsgYnJlYWs7CiAJY2FzZSBBUjVLX0FOVE1PREVfRklYRURfQjoKQEAgLTc1Miw5ICs3MzEsOSBAQAogc3RhdGljIHZvaWQgYXRoNWtfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQl1MzIgKnR4LCB1MzIgKnR4X21heCwgdTMyICpyeCwgdTMyICpyeF9tYXgpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OworCXN0cnVjdCBhdGg1a19odyAqYWggPSBody0+cHJpdjsKIAotCSp0eCA9IHNjLT50eHFzW0FSNUtfVFhfUVVFVUVfSURfREFUQV9NSU5dLnR4cV9tYXg7CisJKnR4ID0gYWgtPnR4cXNbQVI1S19UWF9RVUVVRV9JRF9EQVRBX01JTl0udHhxX21heDsKIAogCSp0eF9tYXggPSBBVEg1S19UWFFfTEVOX01BWDsKIAkqcnggPSAqcnhfbWF4ID0gQVRIX1JYQlVGOwpAQCAtNzYzLDcgKzc0Miw3IEBACiAKIHN0YXRpYyBpbnQgYXRoNWtfc2V0X3JpbmdwYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIHR4LCB1MzIgcngpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OworCXN0cnVjdCBhdGg1a19odyAqYWggPSBody0+cHJpdjsKIAl1MTYgcW51bTsKIAogCS8qIG9ubHkgc3VwcG9ydCBzZXR0aW5nIHR4IHJpbmcgc2l6ZSBmb3Igbm93ICovCkBAIC03NzQsMTYgKzc1MywxNiBAQAogCWlmICghdHggfHwgdHggPiBBVEg1S19UWFFfTEVOX01BWCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmb3IgKHFudW0gPSAwOyBxbnVtIDwgQVJSQVlfU0laRShzYy0+dHhxcyk7IHFudW0rKykgewotCQlpZiAoIXNjLT50eHFzW3FudW1dLnNldHVwKQorCWZvciAocW51bSA9IDA7IHFudW0gPCBBUlJBWV9TSVpFKGFoLT50eHFzKTsgcW51bSsrKSB7CisJCWlmICghYWgtPnR4cXNbcW51bV0uc2V0dXApCiAJCQljb250aW51ZTsKLQkJaWYgKHNjLT50eHFzW3FudW1dLnFudW0gPCBBUjVLX1RYX1FVRVVFX0lEX0RBVEFfTUlOIHx8Ci0JCSAgICBzYy0+dHhxc1txbnVtXS5xbnVtID4gQVI1S19UWF9RVUVVRV9JRF9EQVRBX01BWCkKKwkJaWYgKGFoLT50eHFzW3FudW1dLnFudW0gPCBBUjVLX1RYX1FVRVVFX0lEX0RBVEFfTUlOIHx8CisJCSAgICBhaC0+dHhxc1txbnVtXS5xbnVtID4gQVI1S19UWF9RVUVVRV9JRF9EQVRBX01BWCkKIAkJCWNvbnRpbnVlOwogCi0JCXNjLT50eHFzW3FudW1dLnR4cV9tYXggPSB0eDsKLQkJaWYgKHNjLT50eHFzW3FudW1dLnR4cV9sZW4gPj0gc2MtPnR4cXNbcW51bV0udHhxX21heCkKLQkJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKGh3LCBzYy0+dHhxc1txbnVtXS5xbnVtKTsKKwkJYWgtPnR4cXNbcW51bV0udHhxX21heCA9IHR4OworCQlpZiAoYWgtPnR4cXNbcW51bV0udHhxX2xlbiA+PSBhaC0+dHhxc1txbnVtXS50eHFfbWF4KQorCQkJaWVlZTgwMjExX3N0b3BfcXVldWUoaHcsIGFoLT50eHFzW3FudW1dLnFudW0pOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjaS5jCmluZGV4IDI5NmMzMTYuLmVhZjc5YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGNpLmMKQEAgLTM0LDEyICszNCwxMiBAQAogCXsgUENJX1ZERVZJQ0UoM0NPTV8yLCAgMHgwMDEzKSB9LCAvKiAzY29tIDUyMTIgKi8KIAl7IFBDSV9WREVWSUNFKDNDT00sICAgIDB4MDAxMykgfSwgLyogM2NvbSAzQ1JEQUc2NzUgNTIxMiAqLwogCXsgUENJX1ZERVZJQ0UoQVRIRVJPUywgMHgxMDE0KSB9LCAvKiBJQk0gbWluaXBjaSA1MjEyICovCi0JeyBQQ0lfVkRFVklDRShBVEhFUk9TLCAweDAwMTQpIH0sIC8qIDUyMTIgY29tYmF0aWJsZSAqLwotCXsgUENJX1ZERVZJQ0UoQVRIRVJPUywgMHgwMDE1KSB9LCAvKiA1MjEyIGNvbWJhdGlibGUgKi8KLQl7IFBDSV9WREVWSUNFKEFUSEVST1MsIDB4MDAxNikgfSwgLyogNTIxMiBjb21iYXRpYmxlICovCi0JeyBQQ0lfVkRFVklDRShBVEhFUk9TLCAweDAwMTcpIH0sIC8qIDUyMTIgY29tYmF0aWJsZSAqLwotCXsgUENJX1ZERVZJQ0UoQVRIRVJPUywgMHgwMDE4KSB9LCAvKiA1MjEyIGNvbWJhdGlibGUgKi8KLQl7IFBDSV9WREVWSUNFKEFUSEVST1MsIDB4MDAxOSkgfSwgLyogNTIxMiBjb21iYXRpYmxlICovCisJeyBQQ0lfVkRFVklDRShBVEhFUk9TLCAweDAwMTQpIH0sIC8qIDUyMTIgY29tcGF0aWJsZSAqLworCXsgUENJX1ZERVZJQ0UoQVRIRVJPUywgMHgwMDE1KSB9LCAvKiA1MjEyIGNvbXBhdGlibGUgKi8KKwl7IFBDSV9WREVWSUNFKEFUSEVST1MsIDB4MDAxNikgfSwgLyogNTIxMiBjb21wYXRpYmxlICovCisJeyBQQ0lfVkRFVklDRShBVEhFUk9TLCAweDAwMTcpIH0sIC8qIDUyMTIgY29tcGF0aWJsZSAqLworCXsgUENJX1ZERVZJQ0UoQVRIRVJPUywgMHgwMDE4KSB9LCAvKiA1MjEyIGNvbXBhdGlibGUgKi8KKwl7IFBDSV9WREVWSUNFKEFUSEVST1MsIDB4MDAxOSkgfSwgLyogNTIxMiBjb21wYXRpYmxlICovCiAJeyBQQ0lfVkRFVklDRShBVEhFUk9TLCAweDAwMWEpIH0sIC8qIDI0MTMgR3JpZmZpbi1saXRlICovCiAJeyBQQ0lfVkRFVklDRShBVEhFUk9TLCAweDAwMWIpIH0sIC8qIDU0MTMgRWFnbGUgKi8KIAl7IFBDSV9WREVWSUNFKEFUSEVST1MsIDB4MDAxYykgfSwgLyogUENJLUUgY2FyZHMgKi8KQEAgLTUxLDEwICs1MSwxMCBAQAogLyogcmV0dXJuIGJ1cyBjYWNoZXNpemUgaW4gNEIgd29yZCB1bml0cyAqLwogc3RhdGljIHZvaWQgYXRoNWtfcGNpX3JlYWRfY2FjaGVzaXplKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sIGludCAqY3N6KQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSAoc3RydWN0IGF0aDVrX3NvZnRjICopIGNvbW1vbi0+cHJpdjsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gKHN0cnVjdCBhdGg1a19odyAqKSBjb21tb24tPnByaXY7CiAJdTggdTh0bXA7CiAKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShzYy0+cGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJnU4dG1wKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShhaC0+cGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJnU4dG1wKTsKIAkqY3N6ID0gKGludCl1OHRtcDsKIAogCS8qCkBAIC0xNTYsNyArMTU2LDcgQEAKIAkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXZvaWQgX19pb21lbSAqbWVtOwotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2M7CisJc3RydWN0IGF0aDVrX2h3ICphaDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAlpbnQgcmV0OwogCXU4IGNzejsKQEAgLTIzNCw3ICsyMzQsNyBAQAogCiAJbWVtID0gcGNpX2lvbWFwKHBkZXYsIDAsIDApOwogCWlmICghbWVtKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCByZW1hcCBQQ0kgbWVtb3J5IHJlZ2lvblxuIikgOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVtYXAgUENJIG1lbW9yeSByZWdpb25cbiIpOwogCQlyZXQgPSAtRUlPOwogCQlnb3RvIGVycl9yZWc7CiAJfQpAQCAtMjQzLDcgKzI0Myw3IEBACiAJICogQWxsb2NhdGUgaHcgKG1hYzgwMjExIG1haW4gc3RydWN0KQogCSAqIGFuZCBody0+cHJpdiAoZHJpdmVyIHByaXZhdGUgZGF0YSkKIAkgKi8KLQlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2YoKnNjKSwgJmF0aDVrX2h3X29wcyk7CisJaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKCphaCksICZhdGg1a19od19vcHMpOwogCWlmIChodyA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBpZWVlODAyMTFfaHdcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMjUyLDE2ICsyNTIsMTYgQEAKIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJyZWdpc3RlcmVkIGFzICclcydcbiIsIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CiAKLQlzYyA9IGh3LT5wcml2OwotCXNjLT5odyA9IGh3OwotCXNjLT5wZGV2ID0gcGRldjsKLQlzYy0+ZGV2ID0gJnBkZXYtPmRldjsKLQlzYy0+aXJxID0gcGRldi0+aXJxOwotCXNjLT5kZXZpZCA9IGlkLT5kZXZpY2U7Ci0Jc2MtPmlvYmFzZSA9IG1lbTsgLyogU28gd2UgY2FuIHVubWFwIGl0IG9uIGRldGFjaCAqLworCWFoID0gaHctPnByaXY7CisJYWgtPmh3ID0gaHc7CisJYWgtPnBkZXYgPSBwZGV2OworCWFoLT5kZXYgPSAmcGRldi0+ZGV2OworCWFoLT5pcnEgPSBwZGV2LT5pcnE7CisJYWgtPmRldmlkID0gaWQtPmRldmljZTsKKwlhaC0+aW9iYXNlID0gbWVtOyAvKiBTbyB3ZSBjYW4gdW5tYXAgaXQgb24gZGV0YWNoICovCiAKIAkvKiBJbml0aWFsaXplICovCi0JcmV0ID0gYXRoNWtfaW5pdF9zb2Z0YyhzYywgJmF0aF9wY2lfYnVzX29wcyk7CisJcmV0ID0gYXRoNWtfaW5pdF9zb2Z0YyhhaCwgJmF0aF9wY2lfYnVzX29wcyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfZnJlZTsKIApAQCAtMjg1LDEwICsyODUsMTAgQEAKIGF0aDVrX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OworCXN0cnVjdCBhdGg1a19odyAqYWggPSBody0+cHJpdjsKIAotCWF0aDVrX2RlaW5pdF9zb2Z0YyhzYyk7Ci0JcGNpX2lvdW5tYXAocGRldiwgc2MtPmlvYmFzZSk7CisJYXRoNWtfZGVpbml0X3NvZnRjKGFoKTsKKwlwY2lfaW91bm1hcChwZGV2LCBhaC0+aW9iYXNlKTsKIAlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCWllZWU4MDIxMV9mcmVlX2h3KGh3KTsKQEAgLTI5NywxNiArMjk3LDE5IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IGF0aDVrX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gcGNpX2dldF9kcnZkYXRhKHRvX3BjaV9kZXYoZGV2KSk7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9IGh3LT5wcml2OwogCi0JYXRoNWtfbGVkX29mZihzYyk7CisJYXRoNWtfbGVkX29mZihhaCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNWtfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gaHctPnByaXY7CiAKIAkvKgogCSAqIFN1c3BlbmQvUmVzdW1lIHJlc2V0cyB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UsIHNvIHdlIGhhdmUgdG8KQEAgLTMxNSw3ICszMTgsNyBAQAogCSAqLwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQxLCAwKTsKIAotCWF0aDVrX2xlZF9lbmFibGUoc2MpOworCWF0aDVrX2xlZF9lbmFibGUoYWgpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGN1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGN1LmMKaW5kZXggNzEyYTlhYy4uMDY3MzEzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjdS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY3UuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgImJhc2UuaCIKIAogLyoKLSAqIEFSNTIxMisgY2FuIHVzZSBoaWdoZXIgcmF0ZXMgZm9yIGFjayB0cmFuc21pdGlvbgorICogQVI1MjEyKyBjYW4gdXNlIGhpZ2hlciByYXRlcyBmb3IgYWNrIHRyYW5zbWlzc2lvbgogICogYmFzZWQgb24gY3VycmVudCB0eCByYXRlIGluc3RlYWQgb2YgdGhlIGJhc2UgcmF0ZS4KICAqIEl0IGRvZXMgdGhpcyB0byBiZXR0ZXIgdXRpbGl6ZSBjaGFubmVsIHVzYWdlLgogICogVGhpcyBpcyBhIG1hcHBpbmcgYmV0d2VlbiBHIHJhdGVzICh0aGF0IGNvdmVyIGJvdGgKQEAgLTc3LDE0ICs3NywxMyBAQAogaW50IGF0aDVrX2h3X2dldF9mcmFtZV9kdXJhdGlvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlpbnQgbGVuLCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGUsIGJvb2wgc2hvcnRwcmUpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGFoLT5haF9zYzsKIAlpbnQgc2lmcywgcHJlYW1ibGUsIHBsY3BfYml0cywgc3ltX3RpbWU7CiAJaW50IGJpdHJhdGUsIGJpdHMsIHN5bWJvbHMsIHN5bWJvbF9iaXRzOwogCWludCBkdXI7CiAKIAkvKiBGYWxsYmFjayAqLwogCWlmICghYWgtPmFoX2J3bW9kZSkgewotCQlfX2xlMTYgcmF3X2R1ciA9IGllZWU4MDIxMV9nZW5lcmljX2ZyYW1lX2R1cmF0aW9uKHNjLT5odywKKwkJX19sZTE2IHJhd19kdXIgPSBpZWVlODAyMTFfZ2VuZXJpY19mcmFtZV9kdXJhdGlvbihhaC0+aHcsCiAJCQkJCU5VTEwsIGxlbiwgcmF0ZSk7CiAKIAkJLyogc3VidHJhY3QgZGlmZmVyZW5jZSBiZXR3ZWVuIGxvbmcgYW5kIHNob3J0IHByZWFtYmxlICovCkBAIC0yMDUsNyArMjA0LDcgQEAKICAqLwogdm9pZCBhdGg1a19od191cGRhdGVfbWliX2NvdW50ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0Jc3RydWN0IGF0aDVrX3N0YXRpc3RpY3MgKnN0YXRzID0gJmFoLT5haF9zYy0+c3RhdHM7CisJc3RydWN0IGF0aDVrX3N0YXRpc3RpY3MgKnN0YXRzID0gJmFoLT5zdGF0czsKIAogCS8qIFJlYWQtQW5kLUNsZWFyICovCiAJc3RhdHMtPmFja19mYWlsICs9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0FDS19GQUlMKTsKQEAgLTI0MCwyNSArMjM5LDI0IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a19od193cml0ZV9yYXRlX2R1cmF0aW9uKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGFoLT5haF9zYzsKIAlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGU7CiAJdW5zaWduZWQgaW50IGk7CiAJLyogODAyLjExZyBjb3ZlcnMgYm90aCBPRkRNIGFuZCBDQ0sgKi8KIAl1OCBiYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKIAogCS8qIFdyaXRlIHJhdGUgZHVyYXRpb24gdGFibGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgc2MtPnNiYW5kc1tiYW5kXS5uX2JpdHJhdGVzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgYWgtPnNiYW5kc1tiYW5kXS5uX2JpdHJhdGVzOyBpKyspIHsKIAkJdTMyIHJlZzsKIAkJdTE2IHR4X3RpbWU7CiAKIAkJaWYgKGFoLT5haF9hY2tfYml0cmF0ZV9oaWdoKQotCQkJcmF0ZSA9ICZzYy0+c2JhbmRzW2JhbmRdLmJpdHJhdGVzW2Fja19yYXRlc19oaWdoW2ldXTsKKwkJCXJhdGUgPSAmYWgtPnNiYW5kc1tiYW5kXS5iaXRyYXRlc1thY2tfcmF0ZXNfaGlnaFtpXV07CiAJCS8qIENDSyAtPiAxTWIgKi8KIAkJZWxzZSBpZiAoaSA8IDQpCi0JCQlyYXRlID0gJnNjLT5zYmFuZHNbYmFuZF0uYml0cmF0ZXNbMF07CisJCQlyYXRlID0gJmFoLT5zYmFuZHNbYmFuZF0uYml0cmF0ZXNbMF07CiAJCS8qIE9GRE0gLT4gNk1iICovCiAJCWVsc2UKLQkJCXJhdGUgPSAmc2MtPnNiYW5kc1tiYW5kXS5iaXRyYXRlc1s0XTsKKwkJCXJhdGUgPSAmYWgtPnNiYW5kc1tiYW5kXS5iaXRyYXRlc1s0XTsKIAogCQkvKiBTZXQgQUNLIHRpbWVvdXQgKi8KIAkJcmVnID0gQVI1S19SQVRFX0RVUihyYXRlLT5od192YWx1ZSk7CkBAIC01MzQsOSArNTMyLDkgQEAKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAotCVdBUk5fT04oIGkgPT0gQVRINUtfTUFYX1RTRl9SRUFEICk7CisJV0FSTl9PTihpID09IEFUSDVLX01BWF9UU0ZfUkVBRCk7CiAKLQlyZXR1cm4gKCgodTY0KXRzZl91cHBlcjEgPDwgMzIpIHwgdHNmX2xvd2VyKTsKKwlyZXR1cm4gKCh1NjQpdHNmX3VwcGVyMSA8PCAzMikgfCB0c2ZfbG93ZXI7CiB9CiAKIC8qKgpAQCAtNTg2LDcgKzU4NCw3IEBACiAJLyoKIAkgKiBTZXQgdGhlIGFkZGl0aW9uYWwgdGltZXJzIGJ5IG1vZGUKIAkgKi8KLQlzd2l0Y2ggKGFoLT5haF9zYy0+b3Btb2RlKSB7CisJc3dpdGNoIChhaC0+b3Btb2RlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJLyogSW4gU1RBIG1vZGUgdGltZXIxIGlzIHVzZWQgYXMgbmV4dCB3YWtldXAKQEAgLTYyMyw4ICs2MjEsOCBAQAogCSAqIFNldCB0aGUgYmVhY29uIHJlZ2lzdGVyIGFuZCBlbmFibGUgYWxsIHRpbWVycy4KIAkgKi8KIAkvKiBXaGVuIGluIEFQIG9yIE1lc2ggUG9pbnQgbW9kZSB6ZXJvIHRpbWVyMCB0byBzdGFydCBUU0YgKi8KLQlpZiAoYWgtPmFoX3NjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKLQkgICAgYWgtPmFoX3NjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkKKwlpZiAoYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAorCSAgICBhaC0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpCiAJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19USU1FUjApOwogCiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBuZXh0X2JlYWNvbiwgQVI1S19USU1FUjApOwpAQCAtNjQzLDE0ICs2NDEsMTQgQEAKIAkvKiBGbHVzaCBhbnkgcGVuZGluZyBCTUlTUyBpbnRlcnJ1cHRzIG9uIElTUiBieQogCSAqIHBlcmZvcm1pbmcgYSBjbGVhci1vbi13cml0ZSBvcGVyYXRpb24gb24gUElTUgogCSAqIHJlZ2lzdGVyIGZvciB0aGUgQk1JU1MgYml0ICh3cml0aW5nIGEgYml0IG9uCi0JICogSVNSIHRvZ2xlcyBhIHJlc2V0IGZvciB0aGF0IGJpdCBhbmQgbGVhdmVzCi0JICogdGhlIHJlc3QgYml0cyBpbnRhY3QpICovCisJICogSVNSIHRvZ2dsZXMgYSByZXNldCBmb3IgdGhhdCBiaXQgYW5kIGxlYXZlcworCSAqIHRoZSByZW1haW5pbmcgYml0cyBpbnRhY3QpICovCiAJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQogCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfSVNSX0JNSVNTLCBBUjVLX0lTUik7CiAJZWxzZQogCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfSVNSX0JNSVNTLCBBUjVLX1BJU1IpOwogCi0JLyogVE9ETzogU2V0IGVuY2hhbmNlZCBzbGVlcCByZWdpc3RlcnMgb24gQVI1MjEyCisJLyogVE9ETzogU2V0IGVuaGFuY2VkIHNsZWVwIHJlZ2lzdGVycyBvbiBBUjUyMTIKIAkgKiBiYXNlZCBvbiB2aWYtPmJzc19jb25mIHBhcmFtcywgdW50aWwgdGhlbgogCSAqIGRpc2FibGUgcG93ZXIgc2F2ZSByZXBvcnRpbmcuKi8KIAlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfU1RBX0lEMSwgQVI1S19TVEFfSUQxX1BXUl9TVik7CkBAIC03MzgsNyArNzM2LDcgQEAKIAlkbWEgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19USU1FUjEpID4+IDM7CiAKIAkvKiBOT1RFOiBTV0JBIGlzIGRpZmZlcmVudC4gSGF2aW5nIGEgd3Jvbmcgd2luZG93IHRoZXJlIGRvZXMgbm90Ci0JICogc3RvcCB1cyBmcm9tIHNlbmRpbmcgZGF0YSBhbmQgdGhpcyBjb25kaXRpb24gaXMgY2F0Y2hlZCB0aHJ1CisJICogc3RvcCB1cyBmcm9tIHNlbmRpbmcgZGF0YSBhbmQgdGhpcyBjb25kaXRpb24gaXMgY2F1Z2h0IGJ5CiAJICogb3RoZXIgbWVhbnMgKFNXQkEgaW50ZXJydXB0KSAqLwogCiAJaWYgKGF0aDVrX2NoZWNrX3RpbWVyX3dpbihuYnR0LCBhdGltLCAxLCBpbnR2YWwpICYmCkBAIC04MTQsNyArODEyLDcgQEAKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKGFoKTsKIAl1MzIgcGN1X3JlZywgYmVhY29uX3JlZywgbG93X2lkLCBoaWdoX2lkOwogCi0JQVRINUtfREJHKGFoLT5haF9zYywgQVRINUtfREVCVUdfTU9ERSwgIm1vZGUgJWRcbiIsIG9wX21vZGUpOworCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfTU9ERSwgIm1vZGUgJWRcbiIsIG9wX21vZGUpOwogCiAJLyogUHJlc2VydmUgcmVzdCBzZXR0aW5ncyAqLwogCXBjdV9yZWcgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19TVEFfSUQxKSAmIDB4ZmZmZjAwMDA7CkBAIC04OTAsMTMgKzg4OCwxMyBAQAogCSAqIFhYWDogcmV0aGluayB0aGlzIGFmdGVyIG5ldyBtb2RlIGNoYW5nZXMgdG8KIAkgKiBtYWM4MDIxMSBhcmUgaW50ZWdyYXRlZCAqLwogCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMiAmJgotCQlhaC0+YWhfc2MtPm52aWZzKQorCQlhaC0+bnZpZnMpCiAJCWF0aDVrX2h3X3dyaXRlX3JhdGVfZHVyYXRpb24oYWgpOwogCiAJLyogU2V0IFJTU0kvQlJTU0kgdGhyZXNob2xkcwogCSAqCiAJICogTm90ZTogSWYgd2UgZGVjaWRlIHRvIHNldCB0aGlzIHZhbHVlCi0JICogZHluYW1pY2FseSwgaGF2ZSBpbiBtaW5kIHRoYXQgd2hlbiBBUjVLX1JTU0lfVEhSCisJICogZHluYW1pY2FsbHksIGhhdmUgaW4gbWluZCB0aGF0IHdoZW4gQVI1S19SU1NJX1RIUgogCSAqIHJlZ2lzdGVyIGlzIHJlYWQgaXQgbWlnaHQgcmV0dXJuIDB4NDAgaWYgd2UgaGF2ZW4ndAogCSAqIHdyb3RlIGFueXRoaW5nIHRvIGl0IHBsdXMgQk1JU1MgUlNTSSB0aHJlc2hvbGQgaXMgemVyb2VkLgogCSAqIFNvIGRvaW5nIGEgc2F2ZS9yZXN0b3JlIHByb2NlZHVyZSBoZXJlIGlzbid0IHRoZSByaWdodApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BoeS5jCmluZGV4IDU1NDQxOTEuLjgxZTQ2NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGh5LmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2luY2x1ZGUgImF0aDVrLmgiCiAjaW5jbHVkZSAicmVnLmgiCkBAIC0xMDUsNiArMTA2LDcgQEAKIAogCWlmICgoYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTEyKSB8fAogCShhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjU0MTMpIHx8CisJKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGMjQxMykgfHwKIAkoYWgtPmFoX21hY192ZXJzaW9uID09IChBUjVLX1NSRVZfQVIyNDE3ID4+IDQpKSkKIAkJcmVmY2xrX2ZyZXEgPSA0MDsKIAllbHNlCkBAIC0xNzMsNyArMTc1LDcgQEAKIAkJZGF0YSA9IGF0aDVrX2h3X2JpdHN3YXAodmFsLCBudW1fYml0cyk7CiAKIAlmb3IgKGJpdHNfc2hpZnRlZCA9IDAsIGJpdHNfbGVmdCA9IG51bV9iaXRzOyBiaXRzX2xlZnQgPiAwOwotCXBvc2l0aW9uID0gMCwgZW50cnkrKykgeworCSAgICAgcG9zaXRpb24gPSAwLCBlbnRyeSsrKSB7CiAKIAkJbGFzdF9iaXQgPSAocG9zaXRpb24gKyBiaXRzX2xlZnQgPiA4KSA/IDggOgogCQkJCQlwb3NpdGlvbiArIGJpdHNfbGVmdDsKQEAgLTM2Myw3ICszNjUsNyBAQAogCXJldHVybiAwOwogfQogCi0vKiBTY2hlZHVsZSBhIGdhaW4gcHJvYmUgY2hlY2sgb24gdGhlIG5leHQgdHJhbnNtaXRlZCBwYWNrZXQuCisvKiBTY2hlZHVsZSBhIGdhaW4gcHJvYmUgY2hlY2sgb24gdGhlIG5leHQgdHJhbnNtaXR0ZWQgcGFja2V0LgogICogVGhhdCBtZWFucyBvdXIgbmV4dCBwYWNrZXQgaXMgZ29pbmcgdG8gYmUgc2VudCB3aXRoIGxvd2VyCiAgKiB0eCBwb3dlciBhbmQgYSBQZWFrIHRvIEF2ZXJhZ2UgUG93ZXIgRGV0ZWN0b3IgKFBBUEQpIHdpbGwgdHJ5CiAgKiB0byBtZWFzdXJlIHRoZSBnYWluLgpAQCAtNDcyLDcgKzQ3NCw3IEBACiAJCWxldmVsWzBdID0gMDsKIAkJbGV2ZWxbMV0gPSAoc3RlcCA9PSA2MykgPyA1MCA6IHN0ZXAgKyA0OwogCQlsZXZlbFsyXSA9IChzdGVwICE9IDYzKSA/IDY0IDogbGV2ZWxbMF07Ci0JCWxldmVsWzNdID0gbGV2ZWxbMl0gKyA1MCA7CisJCWxldmVsWzNdID0gbGV2ZWxbMl0gKyA1MDsKIAogCQlhaC0+YWhfZ2Fpbi5nX2hpZ2ggPSBsZXZlbFszXSAtCiAJCQkoc3RlcCA9PSA2MyA/IEFSNUtfR0FJTl9EWU5fQURKVVNUX0hJX01BUkdJTiA6IC01KTsKQEAgLTU0OSw3ICs1NTEsNyBAQAogCiAJCWZvciAoYWgtPmFoX2dhaW4uZ190YXJnZXQgPSBhaC0+YWhfZ2Fpbi5nX2N1cnJlbnQ7CiAJCQkJYWgtPmFoX2dhaW4uZ190YXJnZXQgPD0gYWgtPmFoX2dhaW4uZ19sb3cgJiYKLQkJCQlhaC0+YWhfZ2Fpbi5nX3N0ZXBfaWR4IDwgZ28tPmdvX3N0ZXBzX2NvdW50LTE7CisJCQkJYWgtPmFoX2dhaW4uZ19zdGVwX2lkeCA8IGdvLT5nb19zdGVwc19jb3VudCAtIDE7CiAJCQkJZ19zdGVwID0gJmdvLT5nb19zdGVwW2FoLT5haF9nYWluLmdfc3RlcF9pZHhdKQogCQkJYWgtPmFoX2dhaW4uZ190YXJnZXQgLT0gMiAqCiAJCQkgICAgKGdvLT5nb19zdGVwWysrYWgtPmFoX2dhaW4uZ19zdGVwX2lkeF0uZ29zX2dhaW4gLQpAQCAtNTYwLDcgKzU2Miw3IEBACiAJfQogCiBkb25lOgotCUFUSDVLX0RCRyhhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX0NBTElCUkFURSwKKwlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0NBTElCUkFURSwKIAkJInJldCAlZCwgZ2FpbiBzdGVwICV1LCBjdXJyZW50IGdhaW4gJXUsIHRhcmdldCBnYWluICV1XG4iLAogCQlyZXQsIGFoLT5haF9nYWluLmdfc3RlcF9pZHgsIGFoLT5haF9nYWluLmdfY3VycmVudCwKIAkJYWgtPmFoX2dhaW4uZ190YXJnZXQpOwpAQCAtNjE0LDEzICs2MTYsMTMgQEAKIAkJCWF0aDVrX2h3X3JmX2dhaW5mX2NvcnIoYWgpOwogCQkJYWgtPmFoX2dhaW4uZ19jdXJyZW50ID0KIAkJCQlhaC0+YWhfZ2Fpbi5nX2N1cnJlbnQgPj0gYWgtPmFoX2dhaW4uZ19mX2NvcnIgPwotCQkJCShhaC0+YWhfZ2Fpbi5nX2N1cnJlbnQtYWgtPmFoX2dhaW4uZ19mX2NvcnIpIDoKKwkJCQkoYWgtPmFoX2dhaW4uZ19jdXJyZW50IC0gYWgtPmFoX2dhaW4uZ19mX2NvcnIpIDoKIAkJCQkwOwogCQl9CiAKIAkJLyogQ2hlY2sgaWYgbWVhc3VyZW1lbnQgaXMgb2sgYW5kIGlmIHdlIG5lZWQKIAkJICogdG8gYWRqdXN0IGdhaW4sIHNjaGVkdWxlIGEgZ2FpbiBhZGp1c3RtZW50LAotCQkgKiBlbHNlIHN3aXRjaCBiYWNrIHRvIHRoZSBhY2l2ZSBzdGF0ZSAqLworCQkgKiBlbHNlIHN3aXRjaCBiYWNrIHRvIHRoZSBhY3RpdmUgc3RhdGUgKi8KIAkJaWYgKGF0aDVrX2h3X3JmX2NoZWNrX2dhaW5mX3JlYWRiYWNrKGFoKSAmJgogCQlBUjVLX0dBSU5fQ0hFQ0tfQURKVVNUKCZhaC0+YWhfZ2FpbikgJiYKIAkJYXRoNWtfaHdfcmZfZ2FpbmZfYWRqdXN0KGFoKSkgewpAQCAtNzcyLDcgKzc3NCw3IEBACiAJCWFoLT5haF9yZl9iYW5rcyA9IGttYWxsb2Moc2l6ZW9mKHUzMikgKiBhaC0+YWhfcmZfYmFua3Nfc2l6ZSwKIAkJCQkJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmIChhaC0+YWhfcmZfYmFua3MgPT0gTlVMTCkgewotCQkJQVRINUtfRVJSKGFoLT5haF9zYywgIm91dCBvZiBtZW1vcnlcbiIpOworCQkJQVRINUtfRVJSKGFoLCAib3V0IG9mIG1lbW9yeVxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KQEAgLTc4Miw3ICs3ODQsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGFoLT5haF9yZl9iYW5rc19zaXplOyBpKyspIHsKIAkJaWYgKGluaV9yZmJbaV0ucmZiX2JhbmsgPj0gQVI1S19NQVhfUkZfQkFOS1MpIHsKLQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsICJpbnZhbGlkIGJhbmtcbiIpOworCQkJQVRINUtfRVJSKGFoLCAiaW52YWxpZCBiYW5rXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTgwNyw3ICs4MDksNyBAQAogCQkgKiB1c2UgYl9PQiBhbmQgYl9EQiBwYXJhbWV0ZXJzIHN0b3JlZAogCQkgKiBpbiBlZXByb20gb24gZWUtPmVlX29iW2VlX21vZGVdWzBdCiAJCSAqCi0JCSAqIEZvciBhbGwgb3RoZXIgY2hpcHMgd2UgdXNlIE9CL0RCIGZvciAyR2h6CisJCSAqIEZvciBhbGwgb3RoZXIgY2hpcHMgd2UgdXNlIE9CL0RCIGZvciAyR0h6CiAJCSAqIHN0b3JlZCBpbiB0aGUgYi9nIG1vZGFsIHNlY3Rpb24ganVzdCBsaWtlCiAJCSAqIDgwMi4xMWEgb24gZWUtPmVlX29iW2VlX21vZGVdWzFdICovCiAJCWlmICgoYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTExKSB8fApAQCAtOTcwLDE3ICs5NzIsMjAgQEAKIAkJCX0KIAogCQkJLyogTG93ZXIgc3ludGggdm9sdGFnZSBvbiBSZXYgMiAqLwotCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCAyLAotCQkJCQlBUjVLX1JGX0hJR0hfVkNfQ1AsIHRydWUpOworCQkJaWYgKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMiAmJgorCQkJICAgIChhaC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiAmIEFSNUtfU1JFVl9SRVYpID4gMCkgeworCQkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgMiwKKwkJCQkJCUFSNUtfUkZfSElHSF9WQ19DUCwgdHJ1ZSk7CiAKLQkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgMiwKLQkJCQkJQVI1S19SRl9NSURfVkNfQ1AsIHRydWUpOworCQkJCWF0aDVrX2h3X3JmYl9vcChhaCwgcmZfcmVncywgMiwKKwkJCQkJCUFSNUtfUkZfTUlEX1ZDX0NQLCB0cnVlKTsKIAotCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCAyLAotCQkJCQlBUjVLX1JGX0xPV19WQ19DUCwgdHJ1ZSk7CisJCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCAyLAorCQkJCQkJQVI1S19SRl9MT1dfVkNfQ1AsIHRydWUpOwogCi0JCQlhdGg1a19od19yZmJfb3AoYWgsIHJmX3JlZ3MsIDIsCi0JCQkJCUFSNUtfUkZfUFVTSF9VUCwgdHJ1ZSk7CisJCQkJYXRoNWtfaHdfcmZiX29wKGFoLCByZl9yZWdzLCAyLAorCQkJCQkJQVI1S19SRl9QVVNIX1VQLCB0cnVlKTsKKwkJCX0KIAogCQkJLyogRGVjcmVhc2UgcG93ZXIgY29uc3VtcHRpb24gb24gNTIxMysgQmFzZUJhbmQgKi8KIAkJCWlmIChhaC0+YWhfcGh5X3JldmlzaW9uID49IEFSNUtfU1JFVl9QSFlfNTIxMkEpIHsKQEAgLTEyNTksMTIgKzEyNjQsMTIgQEAKIHsKIAlpbnQgcmV0OwogCS8qCi0JICogQ2hlY2sgYm91bmRzIHN1cHBvcnRlZCBieSB0aGUgUEhZICh3ZSBkb24ndCBjYXJlIGFib3V0IHJlZ3VsdG9yeQorCSAqIENoZWNrIGJvdW5kcyBzdXBwb3J0ZWQgYnkgdGhlIFBIWSAod2UgZG9uJ3QgY2FyZSBhYm91dCByZWd1bGF0b3J5CiAJICogcmVzdHJpY3Rpb25zIGF0IHRoaXMgcG9pbnQpLiBOb3RlOiBod192YWx1ZSBhbHJlYWR5IGhhcyB0aGUgYmFuZAogCSAqIChDSEFOTkVMXzJHSFosIG9yIENIQU5ORUxfNUdIWikgc28gd2UgaW5mb3JtIGF0aDVrX2NoYW5uZWxfb2soKQogCSAqIG9mIHRoZSBiYW5kIGJ5IHRoYXQgKi8KIAlpZiAoIWF0aDVrX2NoYW5uZWxfb2soYWgsIGNoYW5uZWwtPmNlbnRlcl9mcmVxLCBjaGFubmVsLT5od192YWx1ZSkpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywKKwkJQVRINUtfRVJSKGFoLAogCQkJImNoYW5uZWwgZnJlcXVlbmN5ICgldSBNSHopIG91dCBvZiBzdXBwb3J0ZWQgIgogCQkJImJhbmQgcmFuZ2VcbiIsCiAJCQljaGFubmVsLT5jZW50ZXJfZnJlcSk7CkBAIC0xMzMxLDcgKzEzMzYsNyBAQAogc3RhdGljIHZvaWQgYXRoNWtfaHdfdXBkYXRlX25mY2FsX2hpc3Qoc3RydWN0IGF0aDVrX2h3ICphaCwgczE2IG5vaXNlX2Zsb29yKQogewogCXN0cnVjdCBhdGg1a19uZmNhbF9oaXN0ICpoaXN0ID0gJmFoLT5haF9uZmNhbF9oaXN0OwotCWhpc3QtPmluZGV4ID0gKGhpc3QtPmluZGV4ICsgMSkgJiAoQVRINUtfTkZfQ0FMX0hJU1RfTUFYLTEpOworCWhpc3QtPmluZGV4ID0gKGhpc3QtPmluZGV4ICsgMSkgJiAoQVRINUtfTkZfQ0FMX0hJU1RfTUFYIC0gMSk7CiAJaGlzdC0+bmZ2YWxbaGlzdC0+aW5kZXhdID0gbm9pc2VfZmxvb3I7CiB9CiAKQEAgLTEzNDQsMTggKzEzNDksMTggQEAKIAltZW1jcHkoc29ydCwgYWgtPmFoX25mY2FsX2hpc3QubmZ2YWwsIHNpemVvZihzb3J0KSk7CiAJZm9yIChpID0gMDsgaSA8IEFUSDVLX05GX0NBTF9ISVNUX01BWCAtIDE7IGkrKykgewogCQlmb3IgKGogPSAxOyBqIDwgQVRINUtfTkZfQ0FMX0hJU1RfTUFYIC0gaTsgaisrKSB7Ci0JCQlpZiAoc29ydFtqXSA+IHNvcnRbai0xXSkgeworCQkJaWYgKHNvcnRbal0gPiBzb3J0W2ogLSAxXSkgewogCQkJCXRtcCA9IHNvcnRbal07Ci0JCQkJc29ydFtqXSA9IHNvcnRbai0xXTsKLQkJCQlzb3J0W2otMV0gPSB0bXA7CisJCQkJc29ydFtqXSA9IHNvcnRbaiAtIDFdOworCQkJCXNvcnRbaiAtIDFdID0gdG1wOwogCQkJfQogCQl9CiAJfQogCWZvciAoaSA9IDA7IGkgPCBBVEg1S19ORl9DQUxfSElTVF9NQVg7IGkrKykgewotCQlBVEg1S19EQkcoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsCisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfQ0FMSUJSQVRFLAogCQkJImNhbCAlZDolZFxuIiwgaSwgc29ydFtpXSk7CiAJfQotCXJldHVybiBzb3J0WyhBVEg1S19ORl9DQUxfSElTVF9NQVgtMSkgLyAyXTsKKwlyZXR1cm4gc29ydFsoQVRINUtfTkZfQ0FMX0hJU1RfTUFYIC0gMSkgLyAyXTsKIH0KIAogLyoKQEAgLTEzNzgsNyArMTM4Myw3IEBACiAKIAkvKiBrZWVwIGxhc3QgdmFsdWUgaWYgY2FsaWJyYXRpb24gaGFzbid0IGNvbXBsZXRlZCAqLwogCWlmIChhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfQUdDQ1RMKSAmIEFSNUtfUEhZX0FHQ0NUTF9ORikgewotCQlBVEg1S19EQkcoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsCisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfQ0FMSUJSQVRFLAogCQkJIk5GIGRpZCBub3QgY29tcGxldGUgaW4gY2FsaWJyYXRpb24gd2luZG93XG4iKTsKIAogCQlyZXR1cm47CkBAIC0xMzkxLDcgKzEzOTYsNyBAQAogCXRocmVzaG9sZCA9IGVlLT5lZV9ub2lzZV9mbG9vcl90aHJbZWVfbW9kZV07CiAKIAlpZiAobmYgPiB0aHJlc2hvbGQpIHsKLQkJQVRINUtfREJHKGFoLT5haF9zYywgQVRINUtfREVCVUdfQ0FMSUJSQVRFLAorCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0NBTElCUkFURSwKIAkJCSJub2lzZSBmbG9vciBmYWlsdXJlIGRldGVjdGVkOyAiCiAJCQkicmVhZCAlZCwgdGhyZXNob2xkICVkXG4iLAogCQkJbmYsIHRocmVzaG9sZCk7CkBAIC0xNDI4LDcgKzE0MzMsNyBAQAogCiAJYWgtPmFoX25vaXNlX2Zsb29yID0gbmY7CiAKLQlBVEg1S19EQkcoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsCisJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsCiAJCSJub2lzZSBmbG9vciBjYWxpYnJhdGVkOiAlZFxuIiwgbmYpOwogfQogCkBAIC0xNTE2LDcgKzE1MjEsNyBAQAogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgcGh5X3NhdCwgQVI1S19QSFlfQURDU0FUKTsKIAogCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgImNhbGlicmF0aW9uIHRpbWVvdXQgKCV1TUh6KVxuIiwKKwkJQVRINUtfRVJSKGFoLCAiY2FsaWJyYXRpb24gdGltZW91dCAoJXVNSHopXG4iLAogCQkJCWNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xNTUxLDcgKzE1NTYsNyBAQAogCQlpcV9jb3JyID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0lRUkVTX0NBTF9DT1JSKTsKIAkJaV9wd3IgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfSVFSRVNfQ0FMX1BXUl9JKTsKIAkJcV9wd3IgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfSVFSRVNfQ0FMX1BXUl9RKTsKLQkJQVRINUtfREJHX1VOTElNSVQoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsCisJCUFUSDVLX0RCR19VTkxJTUlUKGFoLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsCiAJCQkiaXFfY29ycjoleCBpX3B3cjoleCBxX3B3cjoleCIsIGlxX2NvcnIsIGlfcHdyLCBxX3B3cik7CiAJCWlmIChpX3B3ciAmJiBxX3B3cikKIAkJCWJyZWFrOwpAQCAtMTU3Nyw3ICsxNTgyLDcgQEAKIAkJcV9jb2ZmID0gKGlfcHdyIC8gcV9jb2ZmZCkgLSAxMjg7CiAJcV9jb2ZmID0gY2xhbXAocV9jb2ZmLCAtMTYsIDE1KTsgLyogc2lnbmVkIDUgYml0ICovCiAKLQlBVEg1S19EQkdfVU5MSU1JVChhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX0NBTElCUkFURSwKKwlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQ0FMSUJSQVRFLAogCQkJIm5ldyBJOiVkIFE6JWQgKGlfY29mZmQ6JXggcV9jb2ZmZDoleCkiLAogCQkJaV9jb2ZmLCBxX2NvZmYsIGlfY29mZmQsIHFfY29mZmQpOwogCkBAIC0xNjA0LDExICsxNjA5LDEzIEBACiAJaW50IHJldDsKIAogCWlmIChhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjUxMTApCi0JCXJldCA9IGF0aDVrX2h3X3JmNTExMF9jYWxpYnJhdGUoYWgsIGNoYW5uZWwpOwotCWVsc2UgewotCQlyZXQgPSBhdGg1a19od19yZjUxMXhfaXFfY2FsaWJyYXRlKGFoKTsKKwkJcmV0dXJuIGF0aDVrX2h3X3JmNTExMF9jYWxpYnJhdGUoYWgsIGNoYW5uZWwpOworCisJcmV0ID0gYXRoNWtfaHdfcmY1MTF4X2lxX2NhbGlicmF0ZShhaCk7CisKKwlpZiAoKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMSB8fCBhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjUxMTIpICYmCisJICAgIChjaGFubmVsLT5od192YWx1ZSAmIENIQU5ORUxfT0ZETSkpCiAJCWF0aDVrX2h3X3JlcXVlc3RfcmZnYWluX3Byb2JlKGFoKTsKLQl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTgxNSw3ICsxODIyLDcgQEAKIAogCX0gZWxzZSBpZiAoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0lRKSAmCiAJQVI1S19QSFlfSVFfU1BVUl9GSUxUX0VOKSB7Ci0JCS8qIENsZWFuIHVwIHNwdXIgbWl0aWdhdGlvbiBzZXR0aW5ncyBhbmQgZGlzYWJsZSBmbGl0ZXIgKi8KKwkJLyogQ2xlYW4gdXAgc3B1ciBtaXRpZ2F0aW9uIHNldHRpbmdzIGFuZCBkaXNhYmxlIGZpbHRlciAqLwogCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9CSU5fTUFTS19DVEwsCiAJCQkJCUFSNUtfUEhZX0JJTl9NQVNLX0NUTF9SQVRFLCAwKTsKIAkJQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX1BIWV9JUSwKQEAgLTE5NjAsNyArMTk2Nyw3IEBACiAKIAllZV9tb2RlID0gYXRoNWtfZWVwcm9tX21vZGVfZnJvbV9jaGFubmVsKGNoYW5uZWwpOwogCWlmIChlZV9tb2RlIDwgMCkgewotCQlBVEg1S19FUlIoYWgtPmFoX3NjLAorCQlBVEg1S19FUlIoYWgsCiAJCQkiaW52YWxpZCBjaGFubmVsOiAlZFxuIiwgY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOwogCQlyZXR1cm47CiAJfQpAQCAtMjA4MCw3ICsyMDg3LDcgQEAKIAkgKiBhbHdheXMgMSBpbnN0ZWFkIG9mIDEuMjUsIDEuNzUgZXRjKS4gV2Ugc2NhbGUgdXAgYnkgMTAwCiAJICogdG8gaGF2ZSBzb21lIGFjY3VyYWN5IGJvdGggZm9yIDAuNSBhbmQgMC4yNSBzdGVwcy4KIAkgKi8KLQlyYXRpbyA9ICgoMTAwICogeV9yaWdodCAtIDEwMCAqIHlfbGVmdCkvKHhfcmlnaHQgLSB4X2xlZnQpKTsKKwlyYXRpbyA9ICgoMTAwICogeV9yaWdodCAtIDEwMCAqIHlfbGVmdCkgLyAoeF9yaWdodCAtIHhfbGVmdCkpOwogCiAJLyogTm93IHNjYWxlIGRvd24gdG8gYmUgaW4gcmFuZ2UgKi8KIAlyZXN1bHQgPSB5X2xlZnQgKyAocmF0aW8gKiAodGFyZ2V0IC0geF9sZWZ0KSAvIDEwMCk7CkBAIC0yMTU5LDcgKzIxNjYsNyBAQAogCQkJdTggKnZwZF90YWJsZSwgdTggdHlwZSkKIHsKIAl1OCBpZHhbMl0gPSB7IDAsIDEgfTsKLQlzMTYgcHdyX2kgPSAyKnBtaW47CisJczE2IHB3cl9pID0gMiAqIHBtaW47CiAJaW50IGk7CiAKIAlpZiAobnVtX3BvaW50cyA8IDIpCkBAIC0yNDM3LDcgKzI0NDQsNyBAQAogCX0KIAogCWlmIChlZGdlX3B3cikKLQkJYWgtPmFoX3R4cG93ZXIudHhwX21heF9wd3IgPSA0Km1pbihlZGdlX3B3ciwgbWF4X2NoYW5fcHdyKTsKKwkJYWgtPmFoX3R4cG93ZXIudHhwX21heF9wd3IgPSA0ICogbWluKGVkZ2VfcHdyLCBtYXhfY2hhbl9wd3IpOwogfQogCiAKQEAgLTI0NTYsNyArMjQ2Myw3IEBACiBhdGg1a19maWxsX3B3cl90b19wY2RhY190YWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzMTYqIHRhYmxlX21pbiwKIAkJCQkJCQlzMTYgKnRhYmxlX21heCkKIHsKLQl1OCAJKnBjZGFjX291dCA9IGFoLT5haF90eHBvd2VyLnR4cF9wZF90YWJsZTsKKwl1OAkqcGNkYWNfb3V0ID0gYWgtPmFoX3R4cG93ZXIudHhwX3BkX3RhYmxlOwogCXU4CSpwY2RhY190bXAgPSBhaC0+YWhfdHhwb3dlci50bXBMWzBdOwogCXU4CXBjZGFjXzAsIHBjZGFjX24sIHBjZGFjX2ksIHB3cl9pZHgsIGk7CiAJczE2CW1pbl9wd3IsIG1heF9wd3I7CkBAIC0yNDc1LDggKzI0ODIsOCBAQAogCiAJLyogQ29weSB2YWx1ZXMgZnJvbSBwY2RhY190bXAgKi8KIAlwd3JfaWR4ID0gbWluX3B3cjsKLQlmb3IgKGkgPSAwIDsgcHdyX2lkeCA8PSBtYXhfcHdyICYmCi0JcGNkYWNfaSA8IEFSNUtfRUVQUk9NX1BPV0VSX1RBQkxFX1NJWkU7IGkrKykgeworCWZvciAoaSA9IDA7IHB3cl9pZHggPD0gbWF4X3B3ciAmJgorCQkgICAgcGNkYWNfaSA8IEFSNUtfRUVQUk9NX1BPV0VSX1RBQkxFX1NJWkU7IGkrKykgewogCQlwY2RhY19vdXRbcGNkYWNfaSsrXSA9IHBjZGFjX3RtcFtpXTsKIAkJcHdyX2lkeCsrOwogCX0KQEAgLTI1MDIsNyArMjUwOSw3IEBACiBhdGg1a19jb21iaW5lX2xpbmVhcl9wY2RhY19jdXJ2ZXMoc3RydWN0IGF0aDVrX2h3ICphaCwgczE2KiB0YWJsZV9taW4sCiAJCQkJCQlzMTYgKnRhYmxlX21heCwgdTggcGRjdXJ2ZXMpCiB7Ci0JdTggCSpwY2RhY19vdXQgPSBhaC0+YWhfdHhwb3dlci50eHBfcGRfdGFibGU7CisJdTgJKnBjZGFjX291dCA9IGFoLT5haF90eHBvd2VyLnR4cF9wZF90YWJsZTsKIAl1OAkqcGNkYWNfbG93X3B3cjsKIAl1OAkqcGNkYWNfaGlnaF9wd3I7CiAJdTgJKnBjZGFjX3RtcDsKQEAgLTI1MTAsOCArMjUxNyw4IEBACiAJczE2CW1heF9wd3JfaWR4OwogCXMxNgltaW5fcHdyX2lkeDsKIAlzMTYJbWlkX3B3cl9pZHggPSAwOwotCS8qIEVkZ2UgZmxhZyB0dXJzIG9uIHRoZSA3bnRoIGJpdCBvbiB0aGUgUENEQUMKLQkgKiB0byBkZWxjYXJlIHRoZSBoaWdoZXIgcG93ZXIgY3VydmUgKGZvcmNlIHZhbHVlcworCS8qIEVkZ2UgZmxhZyB0dXJucyBvbiB0aGUgN250aCBiaXQgb24gdGhlIFBDREFDCisJICogdG8gZGVjbGFyZSB0aGUgaGlnaGVyIHBvd2VyIGN1cnZlIChmb3JjZSB2YWx1ZXMKIAkgKiB0byBiZSBncmVhdGVyIHRoYW4gNjQpLiBJZiB3ZSBvbmx5IGhhdmUgb25lIGN1cnZlCiAJICogd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhpcywgaWYgd2UgaGF2ZSAyIGN1cnZlcyBhbmQKIAkgKiBmaWxsIHRoZSB0YWJsZSBiYWNrd2FyZHMgdGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvCkBAIC0yNTUyLDcgKzI1NTksNyBAQAogCX0KIAogCS8qIFRoaXMgaXMgdXNlZCB3aGVuIHNldHRpbmcgdHggcG93ZXIqLwotCWFoLT5haF90eHBvd2VyLnR4cF9taW5faWR4ID0gbWluX3B3cl9pZHgvMjsKKwlhaC0+YWhfdHhwb3dlci50eHBfbWluX2lkeCA9IG1pbl9wd3JfaWR4IC8gMjsKIAogCS8qIEZpbGwgUG93ZXIgdG8gUENEQUMgdGFibGUgYmFja3dhcmRzICovCiAJcHdyID0gbWF4X3B3cl9pZHg7CkBAIC0yNTYxLDE0ICsyNTY4LDE0IEBACiAJCSAqIGVkZ2UgZmxhZyBhbmQgc2V0IHBjZGFjX3RtcCB0byBsb3dlcgogCQkgKiBwb3dlciBjdXJ2ZS4qLwogCQlpZiAoZWRnZV9mbGFnID09IDB4NDAgJiYKLQkJKDIqcHdyIDw9ICh0YWJsZV9tYXhbMV0gLSB0YWJsZV9taW5bMF0pIHx8IHB3ciA9PSAwKSkgeworCQkoMiAqIHB3ciA8PSAodGFibGVfbWF4WzFdIC0gdGFibGVfbWluWzBdKSB8fCBwd3IgPT0gMCkpIHsKIAkJCWVkZ2VfZmxhZyA9IDB4MDA7CiAJCQlwY2RhY190bXAgPSBwY2RhY19sb3dfcHdyOwotCQkJcHdyID0gbWlkX3B3cl9pZHgvMjsKKwkJCXB3ciA9IG1pZF9wd3JfaWR4IC8gMjsKIAkJfQogCiAJCS8qIERvbid0IGdvIGJlbG93IDEsIGV4dHJhcG9sYXRlIGJlbG93IGlmIHdlIGhhdmUKLQkJICogYWxyZWFkeSBzd2l0aGNlZCB0byB0aGUgbG93ZXIgcG93ZXIgY3VydmUgLW9yCisJCSAqIGFscmVhZHkgc3dpdGNoZWQgdG8gdGhlIGxvd2VyIHBvd2VyIGN1cnZlIC1vcgogCQkgKiB3ZSBvbmx5IGhhdmUgb25lIGN1cnZlIGFuZCBlZGdlX2ZsYWcgaXMgemVybwogCQkgKiBhbnl3YXkgKi8KIAkJaWYgKHBjZGFjX3RtcFtwd3JdIDwgMSAmJiAoZWRnZV9mbGFnID09IDB4MDApKSB7CkBAIC0yNTk2LDcgKzI2MDMsNyBAQAogc3RhdGljIHZvaWQKIGF0aDVrX3dyaXRlX3BjZGFjX3RhYmxlKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0JdTggCSpwY2RhY19vdXQgPSBhaC0+YWhfdHhwb3dlci50eHBfcGRfdGFibGU7CisJdTgJKnBjZGFjX291dCA9IGFoLT5haF90eHBvd2VyLnR4cF9wZF90YWJsZTsKIAlpbnQJaTsKIAogCS8qCkBAIC0yNjA0LDggKzI2MTEsOCBAQAogCSAqLwogCWZvciAoaSA9IDA7IGkgPCAoQVI1S19FRVBST01fUE9XRVJfVEFCTEVfU0laRSAvIDIpOyBpKyspIHsKIAkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAotCQkJKCgocGNkYWNfb3V0WzIqaSArIDBdIDw8IDggfCAweGZmKSAmIDB4ZmZmZikgPDwgMCkgfAotCQkJKCgocGNkYWNfb3V0WzIqaSArIDFdIDw8IDggfCAweGZmKSAmIDB4ZmZmZikgPDwgMTYpLAorCQkJKCgocGNkYWNfb3V0WzIgKiBpICsgMF0gPDwgOCB8IDB4ZmYpICYgMHhmZmZmKSA8PCAwKSB8CisJCQkoKChwY2RhY19vdXRbMiAqIGkgKyAxXSA8PCA4IHwgMHhmZikgJiAweGZmZmYpIDw8IDE2KSwKIAkJCUFSNUtfUEhZX1BDREFDX1RYUE9XRVIoaSkpOwogCX0KIH0KQEAgLTI3ODgsMTIgKzI3OTUsOCBAQAogCSAqIFdyaXRlIFRYIHBvd2VyIHZhbHVlcwogCSAqLwogCWZvciAoaSA9IDA7IGkgPCAoQVI1S19FRVBST01fUE9XRVJfVEFCTEVfU0laRSAvIDIpOyBpKyspIHsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAotCQkJKChwZGFkY19vdXRbNCppICsgMF0gJiAweGZmKSA8PCAwKSB8Ci0JCQkoKHBkYWRjX291dFs0KmkgKyAxXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCSgocGRhZGNfb3V0WzQqaSArIDJdICYgMHhmZikgPDwgMTYpIHwKLQkJCSgocGRhZGNfb3V0WzQqaSArIDNdICYgMHhmZikgPDwgMjQpLAotCQkJQVI1S19QSFlfUERBRENfVFhQT1dFUihpKSk7CisJCXUzMiB2YWwgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJnBkYWRjX291dFs0ICogaV0pOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHZhbCwgQVI1S19QSFlfUERBRENfVFhQT1dFUihpKSk7CiAJfQogfQogCkBAIC0yODA1LDcgKzI4MDgsNyBAQAogLyoKICAqIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gdGhhdCB1c2VzIGFsbCBvZiB0aGUgYWJvdmUKICAqIHRvIHNldCBQQ0RBQy9QREFEQyB0YWJsZSBvbiBodyBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbC4KLSAqIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgdHggcG93ZXIgY2FsaWJyYXRpb24gb24gdGhlIGJhc2JhbmQsCisgKiBUaGlzIHRhYmxlIGlzIHVzZWQgZm9yIHR4IHBvd2VyIGNhbGlicmF0aW9uIG9uIHRoZSBiYXNlYmFuZCwKICAqIHdpdGhvdXQgaXQgd2UgZ2V0IHdlaXJkIHR4IHBvd2VyIGxldmVscyBhbmQgaW4gc29tZSBjYXNlcwogICogZGlzdG9ydGVkIHNwZWN0cmFsIG1hc2sKICAqLwpAQCAtMzExNiwxMyArMzExOSwxMyBAQAogCWludCByZXQ7CiAKIAlpZiAodHhwb3dlciA+IEFSNUtfVFVORV9NQVhfVFhQT1dFUikgewotCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiaW52YWxpZCB0eCBwb3dlcjogJXVcbiIsIHR4cG93ZXIpOworCQlBVEg1S19FUlIoYWgsICJpbnZhbGlkIHR4IHBvd2VyOiAldVxuIiwgdHhwb3dlcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVlX21vZGUgPSBhdGg1a19lZXByb21fbW9kZV9mcm9tX2NoYW5uZWwoY2hhbm5lbCk7CiAJaWYgKGVlX21vZGUgPCAwKSB7Ci0JCUFUSDVLX0VSUihhaC0+YWhfc2MsCisJCUFUSDVLX0VSUihhaCwKIAkJCSJpbnZhbGlkIGNoYW5uZWw6ICVkXG4iLCBjaGFubmVsLT5jZW50ZXJfZnJlcSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTMyMjMsNyArMzIyNiw3IEBACiAKIGludCBhdGg1a19od19zZXRfdHhwb3dlcl9saW1pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCB0eHBvd2VyKQogewotCUFUSDVLX0RCRyhhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX1RYUE9XRVIsCisJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19UWFBPV0VSLAogCQkiY2hhbmdpbmcgdHhwb3dlciB0byAlZFxuIiwgdHhwb3dlcik7CiAKIAlyZXR1cm4gYXRoNWtfaHdfdHhwb3dlcihhaCwgYWgtPmFoX2N1cnJlbnRfY2hhbm5lbCwgdHhwb3dlcik7CkBAIC0zNDM0LDcgKzM0MzcsNyBAQAogCSAqIGR1cmluZyBhdGg1a19waHlfY2FsaWJyYXRlKSAqLwogCWlmIChhdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KGFoLCBBUjVLX1BIWV9BR0NDVEwsCiAJCQlBUjVLX1BIWV9BR0NDVExfQ0FMLCAwLCBmYWxzZSkpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgImdhaW4gY2FsaWJyYXRpb24gdGltZW91dCAoJXVNSHopXG4iLAorCQlBVEg1S19FUlIoYWgsICJnYWluIGNhbGlicmF0aW9uIHRpbWVvdXQgKCV1TUh6KVxuIiwKIAkJCWNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9xY3UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9xY3UuYwppbmRleCBiMThjNTAyLi42NWYxMDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcWN1LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3FjdS5jCkBAIC0xODcsNyArMTg3LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIEFSNUtfVFhfUVVFVUVfWFJfREFUQToKIAkJCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMikKLQkJCQlBVEg1S19FUlIoYWgtPmFoX3NjLAorCQkJCUFUSDVLX0VSUihhaCwKIAkJCQkJIlhSIGRhdGEgcXVldWVzIG9ubHkgc3VwcG9ydGVkIGluIgogCQkJCQkiIDUyMTIhXG4iKTsKIAkJCXF1ZXVlID0gQVI1S19UWF9RVUVVRV9JRF9YUl9EQVRBOwpAQCAtNTEwLDcgKzUxMCw2IEBACiBpbnQgYXRoNWtfaHdfc2V0X2lmc19pbnRlcnZhbHMoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHNsb3RfdGltZSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBhaC0+YWhfY3VycmVudF9jaGFubmVsOwotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBhaC0+YWhfc2M7CiAJc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlOwogCXUzMiBhY2tfdHhfdGltZSwgZWlmcywgZWlmc19jbG9jaywgc2lmcywgc2lmc19jbG9jazsKIAl1MzIgc2xvdF90aW1lX2Nsb2NrID0gYXRoNWtfaHdfaHRvY2xvY2soYWgsIHNsb3RfdGltZSk7CkBAIC01NDYsOSArNTQ1LDkgQEAKIAkgKiBBbHNvIHdlIGhhdmUgZGlmZmVyZW50IGxvd2VzdCByYXRlIGZvciA4MDIuMTFhCiAJICovCiAJaWYgKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF81R0haKQotCQlyYXRlID0gJnNjLT5zYmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0uYml0cmF0ZXNbMF07CisJCXJhdGUgPSAmYWgtPnNiYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5iaXRyYXRlc1swXTsKIAllbHNlCi0JCXJhdGUgPSAmc2MtPnNiYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5iaXRyYXRlc1swXTsKKwkJcmF0ZSA9ICZhaC0+c2JhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLmJpdHJhdGVzWzBdOwogCiAJYWNrX3R4X3RpbWUgPSBhdGg1a19od19nZXRfZnJhbWVfZHVyYXRpb24oYWgsIDEwLCByYXRlLCBmYWxzZSk7CiAKQEAgLTYyMiw3ICs2MjEsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtOyBpKyspIHsKIAkJCXJldCA9IGF0aDVrX2h3X3Jlc2V0X3R4X3F1ZXVlKGFoLCBpKTsKIAkJCWlmIChyZXQpIHsKLQkJCQlBVEg1S19FUlIoYWgtPmFoX3NjLAorCQkJCUFUSDVLX0VSUihhaCwKIAkJCQkJImZhaWxlZCB0byByZXNldCBUWCBxdWV1ZSAjJWRcbiIsIGkpOwogCQkJCXJldHVybiByZXQ7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVnLmgKaW5kZXggZDEyYjgyNy4uZjVjMTAwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZWcuaApAQCAtNzIsNyArNzIsNyBAQAogI2RlZmluZQlBUjVLX0NGR19TV1JECQkweDAwMDAwMDA0CS8qIEJ5dGUtc3dhcCBSWCBkZXNjcmlwdG9yICovCiAjZGVmaW5lCUFSNUtfQ0ZHX1NXUkIJCTB4MDAwMDAwMDgJLyogQnl0ZS1zd2FwIFJYIGJ1ZmZlciAqLwogI2RlZmluZQlBUjVLX0NGR19TV1JHCQkweDAwMDAwMDEwCS8qIEJ5dGUtc3dhcCBSZWdpc3RlciBhY2Nlc3MgKi8KLSNkZWZpbmUgQVI1S19DRkdfSUJTUwkJMHgwMDAwMDAyMCAJLyogMC1CU1MsIDEtSUJTUyBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfQ0ZHX0lCU1MJCTB4MDAwMDAwMjAJLyogMC1CU1MsIDEtSUJTUyBbNTIxMStdICovCiAjZGVmaW5lIEFSNUtfQ0ZHX1BIWV9PSwkJMHgwMDAwMDEwMAkvKiBbNTIxMStdICovCiAjZGVmaW5lIEFSNUtfQ0ZHX0VFQlMJCTB4MDAwMDAyMDAJLyogRUVQUk9NIGlzIGJ1c3kgKi8KICNkZWZpbmUJQVI1S19DRkdfQ0xLR0QJCTB4MDAwMDA0MDAJLyogQ2xvY2sgZ2F0ZWQgKERpc2FibGUgZHluYW1pYyBjbG9jaykgKi8KQEAgLTE3MCw3ICsxNzAsNyBAQAogI2RlZmluZSBBUjVLX1RYQ0ZHX1NETUFNUl9TCQkwCiAjZGVmaW5lIEFSNUtfVFhDRkdfQl9NT0RFCQkweDAwMDAwMDA4CS8qIFNldCBiIG1vZGUgZm9yIDUxMTEgKGVuYWJsZSAyMTExKSAqLwogI2RlZmluZSBBUjVLX1RYQ0ZHX1RYRlNUUAkJMHgwMDAwMDAwOAkvKiBUWCBETUEgZnVsbCBTdG9wIFs1MjEwXSAqLwotI2RlZmluZSBBUjVLX1RYQ0ZHX1RYRlVMTAkJMHgwMDAwMDNmMAkvKiBUWCBUcmlnZXIgbGV2ZWwgbWFzayAqLworI2RlZmluZSBBUjVLX1RYQ0ZHX1RYRlVMTAkJMHgwMDAwMDNmMAkvKiBUWCBUcmlnZ2VyIGxldmVsIG1hc2sgKi8KICNkZWZpbmUgQVI1S19UWENGR19UWEZVTExfUwkJNAogI2RlZmluZSBBUjVLX1RYQ0ZHX1RYRlVMTF8wQgkJMHgwMDAwMDAwMAogI2RlZmluZSBBUjVLX1RYQ0ZHX1RYRlVMTF82NEIJCTB4MDAwMDAwMTAKQEAgLTI4MywxNiArMjgzLDE2IEBACiAgKi8KICNkZWZpbmUgQVI1S19JU1IJCTB4MDAxYwkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgWzUyMTBdICovCiAjZGVmaW5lIEFSNUtfUElTUgkJMHgwMDgwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCi0jZGVmaW5lIEFSNUtfSVNSX1JYT0sJCTB4MDAwMDAwMDEJLyogRnJhbWUgc3VjY2Vzc2Z1bHkgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgQVI1S19JU1JfUlhPSwkJMHgwMDAwMDAwMQkvKiBGcmFtZSBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgKi8KICNkZWZpbmUgQVI1S19JU1JfUlhERVNDCQkweDAwMDAwMDAyCS8qIFJYIGRlc2NyaXB0b3IgcmVxdWVzdCAqLwogI2RlZmluZSBBUjVLX0lTUl9SWEVSUgkJMHgwMDAwMDAwNAkvKiBSZWNlaXZlIGVycm9yICovCiAjZGVmaW5lIEFSNUtfSVNSX1JYTk9GUk0JMHgwMDAwMDAwOAkvKiBObyBmcmFtZSByZWNlaXZlZCAocmVjZWl2ZSB0aW1lb3V0KSAqLwogI2RlZmluZSBBUjVLX0lTUl9SWEVPTAkJMHgwMDAwMDAxMAkvKiBFbXB0eSBSWCBkZXNjcmlwdG9yICovCiAjZGVmaW5lIEFSNUtfSVNSX1JYT1JOCQkweDAwMDAwMDIwCS8qIFJlY2VpdmUgRklGTyBvdmVycnVuICovCi0jZGVmaW5lIEFSNUtfSVNSX1RYT0sJCTB4MDAwMDAwNDAJLyogRnJhbWUgc3VjY2Vzc2Z1bHkgdHJhbnNtaXRlZCAqLworI2RlZmluZSBBUjVLX0lTUl9UWE9LCQkweDAwMDAwMDQwCS8qIEZyYW1lIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCAqLwogI2RlZmluZSBBUjVLX0lTUl9UWERFU0MJCTB4MDAwMDAwODAJLyogVFggZGVzY3JpcHRvciByZXF1ZXN0ICovCiAjZGVmaW5lIEFSNUtfSVNSX1RYRVJSCQkweDAwMDAwMTAwCS8qIFRyYW5zbWl0IGVycm9yICovCi0jZGVmaW5lIEFSNUtfSVNSX1RYTk9GUk0JMHgwMDAwMDIwMAkvKiBObyBmcmFtZSB0cmFuc21pdGVkICh0cmFuc21pdCB0aW1lb3V0KSAqLworI2RlZmluZSBBUjVLX0lTUl9UWE5PRlJNCTB4MDAwMDAyMDAJLyogTm8gZnJhbWUgdHJhbnNtaXR0ZWQgKHRyYW5zbWl0IHRpbWVvdXQpICovCiAjZGVmaW5lIEFSNUtfSVNSX1RYRU9MCQkweDAwMDAwNDAwCS8qIEVtcHR5IFRYIGRlc2NyaXB0b3IgKi8KICNkZWZpbmUgQVI1S19JU1JfVFhVUk4JCTB4MDAwMDA4MDAJLyogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biAqLwogI2RlZmluZSBBUjVLX0lTUl9NSUIJCTB4MDAwMDEwMDAJLyogVXBkYXRlIE1JQiBjb3VudGVycyAqLwpAQCAtMzAzLDcgKzMwMyw3IEBACiAjZGVmaW5lIEFSNUtfSVNSX0JSU1NJCQkweDAwMDIwMDAwCS8qIEJlYWNvbiByc3NpIGJlbG93IHRocmVzaG9sZCAoPykgKi8KICNkZWZpbmUgQVI1S19JU1JfQk1JU1MJCTB4MDAwNDAwMDAJLyogQmVhY29uIG1pc3NlZCAqLwogI2RlZmluZSBBUjVLX0lTUl9ISVVFUlIJCTB4MDAwODAwMDAJLyogSG9zdCBJbnRlcmZhY2UgVW5pdCBlcnJvciBbNTIxMStdICovCi0jZGVmaW5lIEFSNUtfSVNSX0JOUgkJMHgwMDEwMDAwMCAJLyogQmVhY29uIG5vdCByZWFkeSBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfSVNSX0JOUgkJMHgwMDEwMDAwMAkvKiBCZWFjb24gbm90IHJlYWR5IFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19JU1JfTUNBQlQJCTB4MDAxMDAwMDAJLyogTWFzdGVyIEN5Y2xlIEFib3J0IFs1MjEwXSAqLwogI2RlZmluZSBBUjVLX0lTUl9SWENISVJQCTB4MDAyMDAwMDAJLyogQ0hJUlAgUmVjZWl2ZWQgWzUyMTIrXSAqLwogI2RlZmluZSBBUjVLX0lTUl9TU0VSUgkJMHgwMDIwMDAwMAkvKiBTaWduYWxlZCBTeXN0ZW0gRXJyb3IgWzUyMTBdICovCkBAIC0zNzcsMTYgKzM3NywxNiBAQAogICovCiAjZGVmaW5lCUFSNUtfSU1SCQkweDAwMjAJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjEwXSAqLwogI2RlZmluZSBBUjVLX1BJTVIJCTB4MDBhMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgWzUyMTErXSAqLwotI2RlZmluZSBBUjVLX0lNUl9SWE9LCQkweDAwMDAwMDAxCS8qIEZyYW1lIHN1Y2Nlc3NmdWx5IHJlY2VpdmVkKi8KKyNkZWZpbmUgQVI1S19JTVJfUlhPSwkJMHgwMDAwMDAwMQkvKiBGcmFtZSBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQqLwogI2RlZmluZSBBUjVLX0lNUl9SWERFU0MJCTB4MDAwMDAwMDIJLyogUlggZGVzY3JpcHRvciByZXF1ZXN0Ki8KICNkZWZpbmUgQVI1S19JTVJfUlhFUlIJCTB4MDAwMDAwMDQJLyogUmVjZWl2ZSBlcnJvciovCiAjZGVmaW5lIEFSNUtfSU1SX1JYTk9GUk0JMHgwMDAwMDAwOAkvKiBObyBmcmFtZSByZWNlaXZlZCAocmVjZWl2ZSB0aW1lb3V0KSovCiAjZGVmaW5lIEFSNUtfSU1SX1JYRU9MCQkweDAwMDAwMDEwCS8qIEVtcHR5IFJYIGRlc2NyaXB0b3IqLwogI2RlZmluZSBBUjVLX0lNUl9SWE9STgkJMHgwMDAwMDAyMAkvKiBSZWNlaXZlIEZJRk8gb3ZlcnJ1biovCi0jZGVmaW5lIEFSNUtfSU1SX1RYT0sJCTB4MDAwMDAwNDAJLyogRnJhbWUgc3VjY2Vzc2Z1bHkgdHJhbnNtaXRlZCovCisjZGVmaW5lIEFSNUtfSU1SX1RYT0sJCTB4MDAwMDAwNDAJLyogRnJhbWUgc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkKi8KICNkZWZpbmUgQVI1S19JTVJfVFhERVNDCQkweDAwMDAwMDgwCS8qIFRYIGRlc2NyaXB0b3IgcmVxdWVzdCovCiAjZGVmaW5lIEFSNUtfSU1SX1RYRVJSCQkweDAwMDAwMTAwCS8qIFRyYW5zbWl0IGVycm9yKi8KLSNkZWZpbmUgQVI1S19JTVJfVFhOT0ZSTQkweDAwMDAwMjAwCS8qIE5vIGZyYW1lIHRyYW5zbWl0ZWQgKHRyYW5zbWl0IHRpbWVvdXQpKi8KKyNkZWZpbmUgQVI1S19JTVJfVFhOT0ZSTQkweDAwMDAwMjAwCS8qIE5vIGZyYW1lIHRyYW5zbWl0dGVkICh0cmFuc21pdCB0aW1lb3V0KSovCiAjZGVmaW5lIEFSNUtfSU1SX1RYRU9MCQkweDAwMDAwNDAwCS8qIEVtcHR5IFRYIGRlc2NyaXB0b3IqLwogI2RlZmluZSBBUjVLX0lNUl9UWFVSTgkJMHgwMDAwMDgwMAkvKiBUcmFuc21pdCBGSUZPIHVuZGVycnVuKi8KICNkZWZpbmUgQVI1S19JTVJfTUlCCQkweDAwMDAxMDAwCS8qIFVwZGF0ZSBNSUIgY291bnRlcnMqLwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAjZGVmaW5lIEFSNUtfSU1SX0JSU1NJCQkweDAwMDIwMDAwCS8qIEJlYWNvbiByc3NpIGJlbG93IHRocmVzaG9sZCAoPykgKi8KICNkZWZpbmUgQVI1S19JTVJfQk1JU1MJCTB4MDAwNDAwMDAJLyogQmVhY29uIG1pc3NlZCovCiAjZGVmaW5lIEFSNUtfSU1SX0hJVUVSUgkJMHgwMDA4MDAwMAkvKiBIb3N0IEludGVyZmFjZSBVbml0IGVycm9yIFs1MjExK10gKi8KLSNkZWZpbmUgQVI1S19JTVJfQk5SCQkweDAwMTAwMDAwIAkvKiBCZWFjb24gbm90IHJlYWR5IFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19JTVJfQk5SCQkweDAwMTAwMDAwCS8qIEJlYWNvbiBub3QgcmVhZHkgWzUyMTErXSAqLwogI2RlZmluZSBBUjVLX0lNUl9NQ0FCVAkJMHgwMDEwMDAwMAkvKiBNYXN0ZXIgQ3ljbGUgQWJvcnQgWzUyMTBdICovCiAjZGVmaW5lIEFSNUtfSU1SX1JYQ0hJUlAJMHgwMDIwMDAwMAkvKiBDSElSUCBSZWNlaXZlZCBbNTIxMitdKi8KICNkZWZpbmUgQVI1S19JTVJfU1NFUlIJCTB4MDAyMDAwMDAJLyogU2lnbmFsZWQgU3lzdGVtIEVycm9yIFs1MjEwXSAqLwpAQCAtNjAxLDcgKzYwMSw3IEBACiAgKiBRQ1UgbWlzYyByZWdpc3RlcnMKICAqLwogI2RlZmluZSBBUjVLX1FDVV9NSVNDX0JBU0UJCTB4MDljMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgLVF1ZXVlMCBNSVNDICovCi0jZGVmaW5lCUFSNUtfUUNVX01JU0NfRlJTSEVEX00JCTB4MDAwMDAwMGYJLyogRnJhbWUgc2hlZHVsaW5nIG1hc2sgKi8KKyNkZWZpbmUJQVI1S19RQ1VfTUlTQ19GUlNIRURfTQkJMHgwMDAwMDAwZgkvKiBGcmFtZSBzY2hlZHVsaW5nIG1hc2sgKi8KICNkZWZpbmUJQVI1S19RQ1VfTUlTQ19GUlNIRURfQVNBUAkJMAkvKiBBU0FQICovCiAjZGVmaW5lCUFSNUtfUUNVX01JU0NfRlJTSEVEX0NCUgkJMQkvKiBDb25zdGFudCBCaXQgUmF0ZSAqLwogI2RlZmluZQlBUjVLX1FDVV9NSVNDX0ZSU0hFRF9EQkFfR1QJCTIJLyogRE1BIEJlYWNvbiBhbGVydCBnYXRlZCAqLwpAQCAtNjUzLDEzICs2NTMsMTMgQEAKICAqIHJlZ2lzdGVycyBbNTIxMStdCiAgKgogICogVGhlc2UgcmVnaXN0ZXJzIGNvbnRyb2wgdGhlIHZhcmlvdXMgY2hhcmFjdGVyaXN0aWNzIG9mIGVhY2ggcXVldWUKLSAqIGZvciA4MDIuMTFlIChXTUUpIGNvbWJhdGliaWxpdHkgc28gdGhleSBnbyB0b2dldGhlciB3aXRoCisgKiBmb3IgODAyLjExZSAoV01FKSBjb21wYXRpYmlsaXR5IHNvIHRoZXkgZ28gdG9nZXRoZXIgd2l0aAogICogUUNVIHJlZ2lzdGVycyBpbiBwYWlycy4gRm9yIGVhY2ggcXVldWUgd2UgaGF2ZSBhIFFDVSBtYXNrIHJlZ2lzdGVyLAogICogKDB4MTAwMCAtIDB4MTAyYyksIGEgbG9jYWwtSUZTIHNldHRpbmdzIHJlZ2lzdGVyICgweDEwNDAgLSAweDEwNmMpLAogICogYSByZXRyeSBsaW1pdCByZWdpc3RlciAoMHgxMDgwIC0gMHgxMGFjKSwgYSBjaGFubmVsIHRpbWUgcmVnaXN0ZXIKICAqICgweDEwYzAgLSAweDEwZWMpLCBhIG1pc2Mtc2V0dGluZ3MgcmVnaXN0ZXIgKDB4MTEwMCAtIDB4MTEyYykgYW5kCiAgKiBhIHNlcXVlbmNlIG51bWJlciByZWdpc3RlciAoMHgxMTQwIC0gMHgxMTZjKS4gSXQgc2VlbXMgdGhhdCAiZ2xvYmFsIgotICogcmVnaXN0ZXJzIGhlcmUgYWZlY3QgYWxsIHF1ZXVlcyAoc2VlIHVzZSBvZiBEQ1VfR0JMX0lGU19TTE9UIGluIGFyNWspLgorICogcmVnaXN0ZXJzIGhlcmUgYWZmZWN0IGFsbCBxdWV1ZXMgKHNlZSB1c2Ugb2YgRENVX0dCTF9JRlNfU0xPVCBpbiBhcjVrKS4KICAqIFdlIHVzZSB0aGUgc2FtZSBtYWNyb3MgaGVyZSBmb3IgZWFzaWVyIHJlZ2lzdGVyIGFjY2Vzcy4KICAqCiAgKi8KQEAgLTc3OSw3ICs3NzksNyBAQAogICogYW5kIGl0J3MgdXNlZCBmb3IgZ2VuZXJhdGluZyBwc2V1ZG8tcmFuZG9tCiAgKiBudW1iZXIgc2VxdWVuY2VzLgogICoKLSAqIChJZiBpIHVuZGVyc3RhbmQgY29yZWN0bHksIHJhbmRvbSBudW1iZXJzIGFyZQorICogKElmIGkgdW5kZXJzdGFuZCBjb3JyZWN0bHksIHJhbmRvbSBudW1iZXJzIGFyZQogICogdXNlZCBmb3IgaWRsZSBzZW5zaW5nIC1tdWx0aXBsaWVkIHdpdGggY3dtaW4vbWF4IGV0Yy0pCiAgKi8KICNkZWZpbmUgQVI1S19EQ1VfR0JMX0lGU19NSVNDCQkJMHgxMGYwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLwpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKICNkZWZpbmUJQVI1S19QQ0lFX1dBRU4JMHg0MDdjCiAKIC8qCi0gKiBQQ0ktRSBTZXJpYWxpemVyL0Rlc2lyaWFsaXplcgorICogUENJLUUgU2VyaWFsaXplci9EZXNlcmlhbGl6ZXIKICAqIHJlZ2lzdGVycwogICovCiAjZGVmaW5lCUFSNUtfUENJRV9TRVJERVMJMHg0MDgwCkBAIC0xMjI3LDcgKzEyMjcsNyBAQAogCQkJCQlBUjVLX1VTRUNfNTIxMCA6IEFSNUtfVVNFQ181MjExKQogI2RlZmluZSBBUjVLX1VTRUNfMQkJCTB4MDAwMDAwN2YJLyogY2xvY2sgY3ljbGVzIGZvciAxdXMgKi8KICNkZWZpbmUgQVI1S19VU0VDXzFfUwkJCTAKLSNkZWZpbmUgQVI1S19VU0VDXzMyCQkJMHgwMDAwM2Y4MAkvKiBjbG9jayBjeWNsZXMgZm9yIDF1cyB3aGlsZSBvbiAzMk1oeiBjbG9jayAqLworI2RlZmluZSBBUjVLX1VTRUNfMzIJCQkweDAwMDAzZjgwCS8qIGNsb2NrIGN5Y2xlcyBmb3IgMXVzIHdoaWxlIG9uIDMyTUh6IGNsb2NrICovCiAjZGVmaW5lIEFSNUtfVVNFQ18zMl9TCQkJNwogI2RlZmluZSBBUjVLX1VTRUNfVFhfTEFURU5DWV81MjExCTB4MDA3ZmMwMDAKICNkZWZpbmUgQVI1S19VU0VDX1RYX0xBVEVOQ1lfNTIxMV9TCTE0CkBAIC0xMzI4LDE2ICsxMzI4LDE2IEBACiAjZGVmaW5lIEFSNUtfUlhfRklMVEVSXzUyMTEJMHg4MDNjCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCiAjZGVmaW5lIEFSNUtfUlhfRklMVEVSCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCiAJCQkJQVI1S19SWF9GSUxURVJfNTIxMCA6IEFSNUtfUlhfRklMVEVSXzUyMTEpCi0jZGVmaW5lCUFSNUtfUlhfRklMVEVSX1VDQVNUIAkweDAwMDAwMDAxCS8qIERvbid0IGZpbHRlciB1bmljYXN0IGZyYW1lcyAqLwotI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9NQ0FTVCAJMHgwMDAwMDAwMgkvKiBEb24ndCBmaWx0ZXIgbXVsdGljYXN0IGZyYW1lcyAqLwotI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9CQ0FTVCAJMHgwMDAwMDAwNAkvKiBEb24ndCBmaWx0ZXIgYnJvYWRjYXN0IGZyYW1lcyAqLwotI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9DT05UUk9MIAkweDAwMDAwMDA4CS8qIERvbid0IGZpbHRlciBjb250cm9sIGZyYW1lcyAqLwotI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9CRUFDT04gCTB4MDAwMDAwMTAJLyogRG9uJ3QgZmlsdGVyIGJlYWNvbiBmcmFtZXMgKi8KLSNkZWZpbmUJQVI1S19SWF9GSUxURVJfUFJPTSAJMHgwMDAwMDAyMAkvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLwotI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9YUlBPTEwgCTB4MDAwMDAwNDAJLyogRG9uJ3QgZmlsdGVyIFhSIHBvbGwgZnJhbWUgWzUyMTIrXSAqLworI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9VQ0FTVAkweDAwMDAwMDAxCS8qIERvbid0IGZpbHRlciB1bmljYXN0IGZyYW1lcyAqLworI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9NQ0FTVAkweDAwMDAwMDAyCS8qIERvbid0IGZpbHRlciBtdWx0aWNhc3QgZnJhbWVzICovCisjZGVmaW5lCUFSNUtfUlhfRklMVEVSX0JDQVNUCTB4MDAwMDAwMDQJLyogRG9uJ3QgZmlsdGVyIGJyb2FkY2FzdCBmcmFtZXMgKi8KKyNkZWZpbmUJQVI1S19SWF9GSUxURVJfQ09OVFJPTAkweDAwMDAwMDA4CS8qIERvbid0IGZpbHRlciBjb250cm9sIGZyYW1lcyAqLworI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9CRUFDT04JMHgwMDAwMDAxMAkvKiBEb24ndCBmaWx0ZXIgYmVhY29uIGZyYW1lcyAqLworI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9QUk9NCTB4MDAwMDAwMjAJLyogU2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKyNkZWZpbmUJQVI1S19SWF9GSUxURVJfWFJQT0xMCTB4MDAwMDAwNDAJLyogRG9uJ3QgZmlsdGVyIFhSIHBvbGwgZnJhbWUgWzUyMTIrXSAqLwogI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9QUk9CRVJFUSAweDAwMDAwMDgwCS8qIERvbid0IGZpbHRlciBwcm9iZSByZXF1ZXN0cyBbNTIxMitdICovCiAjZGVmaW5lCUFSNUtfUlhfRklMVEVSX1BIWUVSUl81MjEyCTB4MDAwMDAxMDAJLyogRG9uJ3QgZmlsdGVyIHBoeSBlcnJvcnMgWzUyMTIrXSAqLwotI2RlZmluZQlBUjVLX1JYX0ZJTFRFUl9SQURBUkVSUl81MjEyIAkweDAwMDAwMjAwCS8qIERvbid0IGZpbHRlciBwaHkgcmFkYXIgZXJyb3JzIFs1MjEyK10gKi8KKyNkZWZpbmUJQVI1S19SWF9GSUxURVJfUkFEQVJFUlJfNTIxMgkweDAwMDAwMjAwCS8qIERvbid0IGZpbHRlciBwaHkgcmFkYXIgZXJyb3JzIFs1MjEyK10gKi8KICNkZWZpbmUgQVI1S19SWF9GSUxURVJfUEhZRVJSXzUyMTEJMHgwMDAwMDA0MAkvKiBbNTIxMV0gKi8KICNkZWZpbmUgQVI1S19SWF9GSUxURVJfUkFEQVJFUlJfNTIxMQkweDAwMDAwMDgwCS8qIFs1MjExXSAqLwogI2RlZmluZSBBUjVLX1JYX0ZJTFRFUl9QSFlFUlIgIFwKQEAgLTE0NjEsNyArMTQ2MSw3IEBACiAgKiBBRERBQyB0ZXN0IHJlZ2lzdGVyIFs1MjExK10KICAqLwogI2RlZmluZSBBUjVLX0FEREFDX1RFU1QJCQkweDgwNTQJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCi0jZGVmaW5lIEFSNUtfQUREQUNfVEVTVF9UWENPTlQgCQkweDAwMDAwMDAxCS8qIFRlc3QgY29udGludW91cyB0eCAqLworI2RlZmluZSBBUjVLX0FEREFDX1RFU1RfVFhDT05UCQkweDAwMDAwMDAxCS8qIFRlc3QgY29udGludW91cyB0eCAqLwogI2RlZmluZSBBUjVLX0FEREFDX1RFU1RfVFNUX01PREUJMHgwMDAwMDAwMgkvKiBUZXN0IG1vZGUgKi8KICNkZWZpbmUgQVI1S19BRERBQ19URVNUX0xPT1BfRU4JCTB4MDAwMDAwMDQJLyogRW5hYmxlIGxvb3AgKi8KICNkZWZpbmUgQVI1S19BRERBQ19URVNUX0xPT1BfTEVOCTB4MDAwMDAwMDgJLyogTG9vcCBsZW5ndGggKGZpZWxkKSAqLwpAQCAtMTYzMiw3ICsxNjMyLDcgQEAKICNkZWZpbmUgQVI1S19TTEVFUDBfTkVYVF9EVElNCQkweDAwMDdmZmZmCS8qIE1hc2sgZm9yIG5leHQgRFRJTSAoPykgKi8KICNkZWZpbmUgQVI1S19TTEVFUDBfTkVYVF9EVElNX1MJCTAKICNkZWZpbmUgQVI1S19TTEVFUDBfQVNTVU1FX0RUSU0JCTB4MDAwODAwMDAJLyogQXNzdW1lIERUSU0gKi8KLSNkZWZpbmUgQVI1S19TTEVFUDBfRU5IX1NMRUVQX0VOCTB4MDAxMDAwMDAJLyogRW5hYmxlIGVuY2hhbmNlZCBzbGVlcCBjb250cm9sICovCisjZGVmaW5lIEFSNUtfU0xFRVAwX0VOSF9TTEVFUF9FTgkweDAwMTAwMDAwCS8qIEVuYWJsZSBlbmhhbmNlZCBzbGVlcCBjb250cm9sICovCiAjZGVmaW5lIEFSNUtfU0xFRVAwX0NBQlRPCQkweGZmMDAwMDAwCS8qIE1hc2sgZm9yIENBQiBUaW1lIE91dCAqLwogI2RlZmluZSBBUjVLX1NMRUVQMF9DQUJUT19TCQkyNAogCkBAIC0xNjU3LDcgKzE2NTcsNyBAQAogLyoKICAqIFRYIHBvd2VyIGNvbnRyb2wgKFRQQykgcmVnaXN0ZXIKICAqCi0gKiBYWFg6IFBDREFDIHN0ZXBzICgwLjVkYm0pIG9yIERCTSA/CisgKiBYWFg6IFBDREFDIHN0ZXBzICgwLjVkQm0pIG9yIGRCbSA/CiAgKgogICovCiAjZGVmaW5lIEFSNUtfVFhQQwkJCTB4ODBlOAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KQEAgLTE2NzMsNyArMTY3Myw3IEBACiAvKgogICogUHJvZmlsZSBjb3VudCByZWdpc3RlcnMKICAqCi0gKiBUaGVzZSByZWdpc3RlcnMgY2FuIGJlIGNsZWFyZWQgYW5kIGZyZWV6ZWQgd2l0aCBBVEg1S19NSUJDLCBidXQgdGhleSBkbyBub3QKKyAqIFRoZXNlIHJlZ2lzdGVycyBjYW4gYmUgY2xlYXJlZCBhbmQgZnJvemVuIHdpdGggQVRINUtfTUlCQywgYnV0IHRoZXkgZG8gbm90CiAgKiBnZW5lcmF0ZSBhIE1JQiBpbnRlcnJ1cHQuCiAgKiBJbnN0ZWFkIG9mIG92ZXJmbG93aW5nLCB0aGV5IHNoaWZ0IGJ5IG9uZSBiaXQgdG8gdGhlIHJpZ2h0LiBBbGwgcmVnaXN0ZXJzCiAgKiBzaGlmdCB0b2dldGhlciwgaS5lLiB3aGVuIG9uZSByZWFjaGVzIHRoZSBtYXgsIGFsbCBzaGlmdCBhdCB0aGUgc2FtZSB0aW1lIGJ5CkBAIC0xODM4LDcgKzE4MzgsNyBAQAogI2RlZmluZSBBUjVLX1BIWV9UU1QyX1RSSUdfU0VMCQkweDAwMDAwMDA3CS8qIFRyaWdnZXIgc2VsZWN0ICg/KSovCiAjZGVmaW5lIEFSNUtfUEhZX1RTVDJfVFJJRwkJMHgwMDAwMDAxMAkvKiBUcmlnZ2VyICg/KSAqLwogI2RlZmluZSBBUjVLX1BIWV9UU1QyX0NCVVNfTU9ERQkJMHgwMDAwMDA2MAkvKiBDYXJkYnVzIG1vZGUgKD8pICovCi0jZGVmaW5lIEFSNUtfUEhZX1RTVDJfQ0xLMzIJCTB4MDAwMDA0MDAJLyogQ0xLX09VVCBpcyBDTEszMiAoMzJLaHogZXh0ZXJuYWwpICovCisjZGVmaW5lIEFSNUtfUEhZX1RTVDJfQ0xLMzIJCTB4MDAwMDA0MDAJLyogQ0xLX09VVCBpcyBDTEszMiAoMzJrSHogZXh0ZXJuYWwpICovCiAjZGVmaW5lIEFSNUtfUEhZX1RTVDJfQ0hBTkNPUl9EVU1QX0VOCTB4MDAwMDA4MDAJLyogRW5hYmxlIENoYW5jb3IgZHVtcCAoPykgKi8KICNkZWZpbmUgQVI1S19QSFlfVFNUMl9FVkVOX0NIQU5DT1JfRFVNUAkweDAwMDAxMDAwCS8qIEV2ZW4gQ2hhbmNvciBkdW1wICg/KSAqLwogI2RlZmluZSBBUjVLX1BIWV9UU1QyX1JGU0lMRU5UX0VOCTB4MDAwMDIwMDAJLyogRW5hYmxlIFJGU0lMRU5UICovCkBAIC0yMDAyLDcgKzIwMDIsNyBAQAogI2RlZmluZQlBUjVLX1BIWV9BR0NDVExfT0ZETV9ESVZfRElTCTB4MDAwMDAwMDgJLyogRGlzYWJsZSBhbnRlbm5hIGRpdmVyc2l0eSBvbiBPRkRNIG1vZGVzICovCiAjZGVmaW5lCUFSNUtfUEhZX0FHQ0NUTF9ORl9FTgkJMHgwMDAwODAwMAkvKiBFbmFibGUgbmYgY2FsaWJyYXRpb24gdG8gaGFwcGVuICg/KSAqLwogI2RlZmluZQlBUjVLX1BIWV9BR0NUTF9GTFRSX0NBTAkJMHgwMDAxMDAwMAkvKiBBbGxvdyBmaWx0ZXIgY2FsaWJyYXRpb24gKD8pICovCi0jZGVmaW5lCUFSNUtfUEhZX0FHQ0NUTF9ORl9OT1VQREFURQkweDAwMDIwMDAwCS8qIERvbid0IHVwZGF0ZSBuZiBhdXRvbWF0aWNhbHkgKi8KKyNkZWZpbmUJQVI1S19QSFlfQUdDQ1RMX05GX05PVVBEQVRFCTB4MDAwMjAwMDAJLyogRG9uJ3QgdXBkYXRlIG5mIGF1dG9tYXRpY2FsbHkgKi8KIAogLyoKICAqIFBIWSBub2lzZSBmbG9vciBzdGF0dXMgcmVnaXN0ZXIgKENDQSA9IENsZWFyIENoYW5uZWwgQXNzZXNzbWVudCkKQEAgLTIwMzgsNyArMjAzOCw3IEBACiAjZGVmaW5lIEFSNUtfUEhZX1dFQUtfT0ZETV9ISUdIX1RIUl9NMl9TCTI0CiAKIC8qIExvdyB0aHJlc2hvbGRzICovCi0jZGVmaW5lIEFSNUtfUEhZX1dFQUtfT0ZETV9MT1dfVEhSIAkJMHg5ODZjCisjZGVmaW5lIEFSNUtfUEhZX1dFQUtfT0ZETV9MT1dfVEhSCQkweDk4NmMKICNkZWZpbmUgQVI1S19QSFlfV0VBS19PRkRNX0xPV19USFJfU0VMRkNPUl9FTgkweDAwMDAwMDAxCiAjZGVmaW5lIEFSNUtfUEhZX1dFQUtfT0ZETV9MT1dfVEhSX00yX0NPVU5UCTB4MDAwMDNmMDAKICNkZWZpbmUgQVI1S19QSFlfV0VBS19PRkRNX0xPV19USFJfTTJfQ09VTlRfUwk4CkBAIC0yMDg5LDcgKzIwODksNyBAQAogICoKICAqIEl0J3Mgb2J2aW91cyBmcm9tIHRoZSBjb2RlIHRoYXQgMHg5ODljIGlzIHRoZSBidWZmZXIgcmVnaXN0ZXIgYnV0CiAgKiBmb3IgdGhlIG90aGVyIHNwZWNpYWwgcmVnaXN0ZXJzIHRoYXQgd2Ugd3JpdGUgdG8gYWZ0ZXIgc2VuZGluZyBlYWNoCi0gKiBwYWNrZXQsIGkgaGF2ZSBubyBpZGVhLiBTbyBpJ2xsIG5hbWUgdGhlbSBCVUZGRVJfQ09OVFJPTF9YIHJlZ2lzdGVycworICogcGFja2V0LCBpIGhhdmUgbm8gaWRlYS4gU28gSSdsbCBuYW1lIHRoZW0gQlVGRkVSX0NPTlRST0xfWCByZWdpc3RlcnMKICAqIGZvciBub3cuIEl0J3MgaW50ZXJlc3RpbmcgdGhhdCB0aGV5IGFyZSBhbHNvIHVzZWQgZm9yIHNvbWUgb3RoZXIgb3BlcmF0aW9ucy4KICAqLwogCkBAIC0yMjU5LDEyICsyMjU5LDEzIEBACiAjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF9JTExMRU5fRVJSCTB4MDgwMDAwMDAJLyogSWxsZWdhbCBsZW5ndGggKi8KICNkZWZpbmUJQVI1S19QSFlfRlJBTUVfQ1RMX1NFUlZJQ0VfRVJSCTB4MjAwMDAwMDAKICNkZWZpbmUJQVI1S19QSFlfRlJBTUVfQ1RMX1RYVVJOX0VSUgkweDQwMDAwMDAwCS8qIFRYIHVuZGVycnVuICovCi0jZGVmaW5lIEFSNUtfUEhZX0ZSQU1FX0NUTF9JTkkJCUFSNUtfUEhZX0ZSQU1FX0NUTF9TRVJWSUNFX0VSUiB8IFwKLQkJCUFSNUtfUEhZX0ZSQU1FX0NUTF9UWFVSTl9FUlIgfCBcCi0JCQlBUjVLX1BIWV9GUkFNRV9DVExfSUxMTEVOX0VSUiB8IFwKLQkJCUFSNUtfUEhZX0ZSQU1FX0NUTF9JTExSQVRFX0VSUiB8IFwKLQkJCUFSNUtfUEhZX0ZSQU1FX0NUTF9QQVJJVFlfRVJSIHwgXAotCQkJQVI1S19QSFlfRlJBTUVfQ1RMX1RJTUlOR19FUlIKKyNkZWZpbmUgQVI1S19QSFlfRlJBTUVfQ1RMX0lOSQlcCisJCQkoQVI1S19QSFlfRlJBTUVfQ1RMX1NFUlZJQ0VfRVJSIHwgXAorCQkJIEFSNUtfUEhZX0ZSQU1FX0NUTF9UWFVSTl9FUlIgfCBcCisJCQkgQVI1S19QSFlfRlJBTUVfQ1RMX0lMTExFTl9FUlIgfCBcCisJCQkgQVI1S19QSFlfRlJBTUVfQ1RMX0lMTFJBVEVfRVJSIHwgXAorCQkJIEFSNUtfUEhZX0ZSQU1FX0NUTF9QQVJJVFlfRVJSIHwgXAorCQkJIEFSNUtfUEhZX0ZSQU1FX0NUTF9USU1JTkdfRVJSKQogCiAvKgogICogUEhZIFR4IFBvd2VyIGFkanVzdG1lbnQgcmVnaXN0ZXIgWzUyMTJBK10KQEAgLTIyODEsMjIgKzIyODIsMjIgQEAKICNkZWZpbmUJQVI1S19QSFlfUkFEQVIJCQkweDk5NTQKICNkZWZpbmUJQVI1S19QSFlfUkFEQVJfRU5BQkxFCQkweDAwMDAwMDAxCiAjZGVmaW5lCUFSNUtfUEhZX1JBREFSX0RJU0FCTEUJCTB4MDAwMDAwMDAKLSNkZWZpbmUgQVI1S19QSFlfUkFEQVJfSU5CQU5EVEhSICAgIAkweDAwMDAwMDNlCS8qIEluYmFuZCB0aHJlc2hvbGQKKyNkZWZpbmUgQVI1S19QSFlfUkFEQVJfSU5CQU5EVEhSCTB4MDAwMDAwM2UJLyogSW5iYW5kIHRocmVzaG9sZAogCQkJCQkJCTUtYml0cywgdW5pdHMgdW5rbm93biB7MC4uMzF9CiAJCQkJCQkJKD8gTUh6ID8pICovCiAjZGVmaW5lIEFSNUtfUEhZX1JBREFSX0lOQkFORFRIUl9TCTEKIAotI2RlZmluZSBBUjVLX1BIWV9SQURBUl9QUlNTSV9USFIgICAgCTB4MDAwMDBmYzAJLyogUHVsc2UgUlNTSS9TTlIgdGhyZXNob2xkCisjZGVmaW5lIEFSNUtfUEhZX1JBREFSX1BSU1NJX1RIUgkweDAwMDAwZmMwCS8qIFB1bHNlIFJTU0kvU05SIHRocmVzaG9sZAogCQkJCQkJCTYtYml0cywgZEJtIHJhbmdlIHswLi42M30KIAkJCQkJCQlpbiBkQm0gdW5pdHMuICovCiAjZGVmaW5lIEFSNUtfUEhZX1JBREFSX1BSU1NJX1RIUl9TCTYKIAotI2RlZmluZSBBUjVLX1BIWV9SQURBUl9QSEVJR0hUX1RIUiAgIAkweDAwMDNmMDAwCS8qIFB1bHNlIGhlaWdodCB0aHJlc2hvbGQKKyNkZWZpbmUgQVI1S19QSFlfUkFEQVJfUEhFSUdIVF9USFIJMHgwMDAzZjAwMAkvKiBQdWxzZSBoZWlnaHQgdGhyZXNob2xkCiAJCQkJCQkJNi1iaXRzLCBkQm0gcmFuZ2UgezAuLjYzfQogCQkJCQkJCWluIGRCbSB1bml0cy4gKi8KICNkZWZpbmUgQVI1S19QSFlfUkFEQVJfUEhFSUdIVF9USFJfUwkxMgogCi0jZGVmaW5lIEFSNUtfUEhZX1JBREFSX1JTU0lfVEhSICAgIAkweDAwZmMwMDAwCS8qIFJhZGFyIFJTU0kvU05SIHRocmVzaG9sZC4KKyNkZWZpbmUgQVI1S19QSFlfUkFEQVJfUlNTSV9USFIJCTB4MDBmYzAwMDAJLyogUmFkYXIgUlNTSS9TTlIgdGhyZXNob2xkLgogCQkJCQkJCTYtYml0cywgZEJtIHJhbmdlIHswLi42M30KIAkJCQkJCQlpbiBkQm0gdW5pdHMuICovCiAjZGVmaW5lIEFSNUtfUEhZX1JBREFSX1JTU0lfVEhSX1MJMTgKQEAgLTIzMzksNyArMjM0MCw3IEBACiAjZGVmaW5lIEFSNUtfUEhZX1JFU1RBUlRfRElWX0dDX1MJMTgKIAogLyoKLSAqIFJGIEJ1cyBhY2Nlc3MgcmVxdWVzdCByZWdpc3RlciAoZm9yIHN5bnRoLW9seSBjaGFubmVsIHN3aXRjaGluZykKKyAqIFJGIEJ1cyBhY2Nlc3MgcmVxdWVzdCByZWdpc3RlciAoZm9yIHN5bnRoLW9ubHkgY2hhbm5lbCBzd2l0Y2hpbmcpCiAgKi8KICNkZWZpbmUgQVI1S19QSFlfUkZCVVNfUkVRCQkweDk5N0MKICNkZWZpbmUgQVI1S19QSFlfUkZCVVNfUkVRX1JFUVVFU1QJMHgwMDAwMDAwMQpAQCAtMjM4MSw3ICsyMzgyLDcgQEAKICAqLwogI2RlZmluZQlBUjVLX0JCX0dBSU5fQkFTRQkJMHg5YjAwCS8qIEJhc2VCYW5kIEFtcGxpZmllciBHYWluIHRhYmxlIGJhc2UgYWRkcmVzcyAqLwogI2RlZmluZSBBUjVLX0JCX0dBSU4oX24pCQkoQVI1S19CQl9HQUlOX0JBU0UgKyAoKF9uKSA8PCAyKSkKLSNkZWZpbmUJQVI1S19SRl9HQUlOX0JBU0UJCTB4OWEwMAkvKiBSRiBBbXBscmlmaWVyIEdhaW4gdGFibGUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lCUFSNUtfUkZfR0FJTl9CQVNFCQkweDlhMDAJLyogUkYgQW1wbGlmaWVyIEdhaW4gdGFibGUgYmFzZSBhZGRyZXNzICovCiAjZGVmaW5lIEFSNUtfUkZfR0FJTihfbikJCShBUjVLX1JGX0dBSU5fQkFTRSArICgoX24pIDw8IDIpKQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3Jlc2V0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYwppbmRleCAzNTEwZGUyLi4wNjg2YzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYwpAQCAtMjUsNyArMjUsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+IAkJLyogVG8gZGV0ZXJtaW5lIGlmIGEgY2FyZCBpcyBwY2ktZSAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgkJLyogVG8gZGV0ZXJtaW5lIGlmIGEgY2FyZCBpcyBwY2ktZSAqLwogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlICJhdGg1ay5oIgpAQCAtMTQyLDEwICsxNDIsMTEgQEAKIAogCS8qIFNldCAzMk1IeiBVU0VDIGNvdW50ZXIgKi8KIAlpZiAoKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMikgfHwKLQkJKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTQxMykgfHwKLQkJKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGMjMxNikgfHwKLQkJKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGMjMxNykpCi0JLyogUmVtYWluIG9uIDQwTUh6IGNsb2NrID8gKi8KKwkgICAgKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGMjQxMykgfHwKKwkgICAgKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTQxMykgfHwKKwkgICAgKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGMjMxNikgfHwKKwkgICAgKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGMjMxNykpCisJCS8qIFJlbWFpbiBvbiA0ME1IeiBjbG9jayA/ICovCiAJCXNjbG9jayA9IDQwIC0gMTsKIAllbHNlCiAJCXNjbG9jayA9IDMyIC0gMTsKQEAgLTIxMyw3ICsyMTQsNyBAQAogCXVzZWNfcmVnID0gKHVzZWMgfCBzY2xvY2sgfCB0eGxhdCB8IHJ4bGF0KTsKIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIHVzZWNfcmVnLCBBUjVLX1VTRUMpOwogCi0JLyogT24gNTExMiBzZXQgdHggZnJhbmUgdG8gdHggZGF0YSBzdGFydCBkZWxheSAqLworCS8qIE9uIDUxMTIgc2V0IHR4IGZyYW1lIHRvIHR4IGRhdGEgc3RhcnQgZGVsYXkgKi8KIAlpZiAoYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTEyKSB7CiAJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX1JGX0NUTDIsCiAJCQkJCUFSNUtfUEhZX1JGX0NUTDJfVFhGMlRYRF9TVEFSVCwKQEAgLTIzMyw3ICsyMzQsNyBAQAogc3RhdGljIHZvaWQgYXRoNWtfaHdfc2V0X3NsZWVwX2Nsb2NrKHN0cnVjdCBhdGg1a19odyAqYWgsIGJvb2wgZW5hYmxlKQogewogCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwotCXUzMiBzY2FsLCBzcGVuZGluZzsKKwl1MzIgc2NhbCwgc3BlbmRpbmcsIHNjbG9jazsKIAogCS8qIE9ubHkgc2V0IDMyS0h6IHNldHRpbmdzIGlmIHdlIGhhdmUgYW4gZXh0ZXJuYWwKIAkgKiAzMktIeiBjcnlzdGFsIHByZXNlbnQgKi8KQEAgLTMxNyw2ICszMTgsMTUgQEAKIAogCQkvKiBTZXQgdXAgdHNmIGluY3JlbWVudCBvbiBlYWNoIGN5Y2xlICovCiAJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfVFNGX1BBUk0sIEFSNUtfVFNGX1BBUk1fSU5DLCAxKTsKKworCQlpZiAoKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMikgfHwKKwkJCShhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjU0MTMpIHx8CisJCQkoYWgtPmFoX3JhZGlvID09IEFSNUtfUkYyMzE2KSB8fAorCQkJKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGMjMxNykpCisJCQlzY2xvY2sgPSA0MCAtIDE7CisJCWVsc2UKKwkJCXNjbG9jayA9IDMyIC0gMTsKKwkJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19VU0VDXzUyMTEsIEFSNUtfVVNFQ18zMiwgc2Nsb2NrKTsKIAl9CiB9CiAKQEAgLTM3NSwyMCArMzg1LDIwIEBACiBzdGF0aWMgaW50IGF0aDVrX2h3X3dpc29jX3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmbGFncykKIHsKIAl1MzIgbWFzayA9IGZsYWdzID8gZmxhZ3MgOiB+MFU7Ci0Jdm9sYXRpbGUgdTMyICpyZWc7CisJdTMyIF9faW9tZW0gKnJlZzsKIAl1MzIgcmVndmFsOwogCXUzMiB2YWwgPSAwOwogCiAJLyogYWgtPmFoX21hY19zcmV2IGlzIG5vdCBhdmFpbGFibGUgYXQgdGhpcyBwb2ludCB5ZXQgKi8KLQlpZiAoYWgtPmFoX3NjLT5kZXZpZCA+PSBBUjVLX1NSRVZfQVIyMzE1X1I2KSB7Ci0JCXJlZyA9ICh1MzIgKikgQVI1S19BUjIzMTVfUkVTRVQ7CisJaWYgKGFoLT5kZXZpZCA+PSBBUjVLX1NSRVZfQVIyMzE1X1I2KSB7CisJCXJlZyA9ICh1MzIgX19pb21lbSAqKSBBUjVLX0FSMjMxNV9SRVNFVDsKIAkJaWYgKG1hc2sgJiBBUjVLX1JFU0VUX0NUTF9QQ1UpCiAJCQl2YWwgfD0gQVI1S19BUjIzMTVfUkVTRVRfV01BQzsKIAkJaWYgKG1hc2sgJiBBUjVLX1JFU0VUX0NUTF9CQVNFQkFORCkKIAkJCXZhbCB8PSBBUjVLX0FSMjMxNV9SRVNFVF9CQl9XQVJNOwogCX0gZWxzZSB7Ci0JCXJlZyA9ICh1MzIgKikgQVI1S19BUjUzMTJfUkVTRVQ7Ci0JCWlmICh0b19wbGF0Zm9ybV9kZXZpY2UoYWgtPmFoX3NjLT5kZXYpLT5pZCA9PSAwKSB7CisJCXJlZyA9ICh1MzIgX19pb21lbSAqKSBBUjVLX0FSNTMxMl9SRVNFVDsKKwkJaWYgKHRvX3BsYXRmb3JtX2RldmljZShhaC0+ZGV2KS0+aWQgPT0gMCkgewogCQkJaWYgKG1hc2sgJiBBUjVLX1JFU0VUX0NUTF9QQ1UpCiAJCQkJdmFsIHw9IEFSNUtfQVI1MzEyX1JFU0VUX1dNQUMwOwogCQkJaWYgKG1hc2sgJiBBUjVLX1JFU0VUX0NUTF9CQVNFQkFORCkKQEAgLTUyMCw3ICs1MzAsNyBAQAogICovCiBpbnQgYXRoNWtfaHdfb25faG9sZChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWgtPmFoX3NjLT5wZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWgtPnBkZXY7CiAJdTMyIGJ1c19mbGFnczsKIAlpbnQgcmV0OwogCkBAIC01MzAsNyArNTQwLDcgQEAKIAkvKiBNYWtlIHN1cmUgZGV2aWNlIGlzIGF3YWtlICovCiAJcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKIAlpZiAocmV0KSB7Ci0JCUFUSDVLX0VSUihhaC0+YWhfc2MsICJmYWlsZWQgdG8gd2FrZXVwIHRoZSBNQUMgQ2hpcFxuIik7CisJCUFUSDVLX0VSUihhaCwgImZhaWxlZCB0byB3YWtldXAgdGhlIE1BQyBDaGlwXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTUzOSw3ICs1NDksNyBAQAogCSAqCiAJICogTm90ZTogcHV0dGluZyBQQ0kgY29yZSBvbiB3YXJtIHJlc2V0IG9uIFBDSS1FIGNhcmRzCiAJICogcmVzdWx0cyBjYXJkIHRvIGhhbmcgYW5kIGFsd2F5cyByZXR1cm4gMHhmZmZmLi4uIHNvCi0JICogd2UgaW5nb3JlIHRoYXQgZmxhZyBmb3IgUENJLUUgY2FyZHMuIE9uIFBDSSBjYXJkcworCSAqIHdlIGlnbm9yZSB0aGF0IGZsYWcgZm9yIFBDSS1FIGNhcmRzLiBPbiBQQ0kgY2FyZHMKIAkgKiB0aGlzIGZsYWcgZ2V0cyBjbGVhcmVkIGFmdGVyIDY0IFBDSSBjbG9ja3MuCiAJICovCiAJYnVzX2ZsYWdzID0gKHBkZXYgJiYgcGNpX2lzX3BjaWUocGRldikpID8gMCA6IEFSNUtfUkVTRVRfQ1RMX1BDSTsKQEAgLTU1NSwxNCArNTY1LDE0IEBACiAJfQogCiAJaWYgKHJldCkgewotCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiZmFpbGVkIHRvIHB1dCBkZXZpY2Ugb24gd2FybSByZXNldFxuIik7CisJCUFUSDVLX0VSUihhaCwgImZhaWxlZCB0byBwdXQgZGV2aWNlIG9uIHdhcm0gcmVzZXRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiAuLi53YWtldXAgYWdhaW4hKi8KIAlyZXQgPSBhdGg1a19od19zZXRfcG93ZXIoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOwogCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgImZhaWxlZCB0byBwdXQgZGV2aWNlIG9uIGhvbGRcbiIpOworCQlBVEg1S19FUlIoYWgsICJmYWlsZWQgdG8gcHV0IGRldmljZSBvbiBob2xkXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTU3NCw3ICs1ODQsNyBAQAogICovCiBpbnQgYXRoNWtfaHdfbmljX3dha2V1cChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgZmxhZ3MsIGJvb2wgaW5pdGlhbCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFoLT5haF9zYy0+cGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFoLT5wZGV2OwogCXUzMiB0dXJibywgbW9kZSwgY2xvY2ssIGJ1c19mbGFnczsKIAlpbnQgcmV0OwogCkBAIC01ODYsNyArNTk2LDcgQEAKIAkJLyogV2FrZXVwIHRoZSBkZXZpY2UgKi8KIAkJcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKIAkJaWYgKHJldCkgewotCQkJQVRINUtfRVJSKGFoLT5haF9zYywgImZhaWxlZCB0byB3YWtldXAgdGhlIE1BQyBDaGlwXG4iKTsKKwkJCUFUSDVLX0VSUihhaCwgImZhaWxlZCB0byB3YWtldXAgdGhlIE1BQyBDaGlwXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC01OTYsNyArNjA2LDcgQEAKIAkgKgogCSAqIE5vdGU6IHB1dHRpbmcgUENJIGNvcmUgb24gd2FybSByZXNldCBvbiBQQ0ktRSBjYXJkcwogCSAqIHJlc3VsdHMgY2FyZCB0byBoYW5nIGFuZCBhbHdheXMgcmV0dXJuIDB4ZmZmZi4uLiBzbwotCSAqIHdlIGluZ29yZSB0aGF0IGZsYWcgZm9yIFBDSS1FIGNhcmRzLiBPbiBQQ0kgY2FyZHMKKwkgKiB3ZSBpZ25vcmUgdGhhdCBmbGFnIGZvciBQQ0ktRSBjYXJkcy4gT24gUENJIGNhcmRzCiAJICogdGhpcyBmbGFnIGdldHMgY2xlYXJlZCBhZnRlciA2NCBQQ0kgY2xvY2tzLgogCSAqLwogCWJ1c19mbGFncyA9IChwZGV2ICYmIHBjaV9pc19wY2llKHBkZXYpKSA/IDAgOiBBUjVLX1JFU0VUX0NUTF9QQ0k7CkBAIC02MTYsMTggKzYyNiwxOCBAQAogCX0KIAogCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgImZhaWxlZCB0byByZXNldCB0aGUgTUFDIENoaXBcbiIpOworCQlBVEg1S19FUlIoYWgsICJmYWlsZWQgdG8gcmVzZXQgdGhlIE1BQyBDaGlwXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJLyogLi4ud2FrZXVwIGFnYWluIS4uLiovCiAJcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKIAlpZiAocmV0KSB7Ci0JCUFUSDVLX0VSUihhaC0+YWhfc2MsICJmYWlsZWQgdG8gcmVzdW1lIHRoZSBNQUMgQ2hpcFxuIik7CisJCUFUSDVLX0VSUihhaCwgImZhaWxlZCB0byByZXN1bWUgdGhlIE1BQyBDaGlwXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiAuLi5yZXNldCBjb25maWd1cmF0aW9uIHJlZ2l0ZXIgb24gV2lzb2MgLi4uCisJLyogLi4ucmVzZXQgY29uZmlndXJhdGlvbiByZWdpc3RlciBvbiBXaXNvYyAuLi4KIAkgKiAuLi5jbGVhciByZXNldCBjb250cm9sIHJlZ2lzdGVyIGFuZCBwdWxsIGRldmljZSBvdXQgb2YKIAkgKiB3YXJtIHJlc2V0IG9uIG90aGVycyAqLwogCWlmIChhdGg1a19nZXRfYnVzX3R5cGUoYWgpID09IEFUSF9BSEIpCkBAIC02MzYsNyArNjQ2LDcgQEAKIAkJcmV0ID0gYXRoNWtfaHdfbmljX3Jlc2V0KGFoLCAwKTsKIAogCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgImZhaWxlZCB0byB3YXJtIHJlc2V0IHRoZSBNQUMgQ2hpcFxuIik7CisJCUFUSDVLX0VSUihhaCwgImZhaWxlZCB0byB3YXJtIHJlc2V0IHRoZSBNQUMgQ2hpcFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtNjc3LDcgKzY4Nyw3IEBACiAJCQkJZWxzZQogCQkJCQltb2RlIHw9IEFSNUtfUEhZX01PREVfTU9EX0RZTjsKIAkJCX0gZWxzZSB7Ci0JCQkJQVRINUtfRVJSKGFoLT5haF9zYywKKwkJCQlBVEg1S19FUlIoYWgsCiAJCQkJCSJpbnZhbGlkIHJhZGlvIG1vZHVsYXRpb24gbW9kZVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CkBAIC02OTMsMTggKzcwMywxOCBAQAogCQkJaWYgKGZsYWdzICYgQ0hBTk5FTF9PRkRNKQogCQkJCW1vZGUgfD0gQVI1S19QSFlfTU9ERV9NT0RfT0ZETTsKIAkJCWVsc2UgewotCQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsCisJCQkJQVRINUtfRVJSKGFoLAogCQkJCQkiaW52YWxpZCByYWRpbyBtb2R1bGF0aW9uIG1vZGVcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9IGVsc2UgewotCQkJQVRINUtfRVJSKGFoLT5haF9zYywgImludmFsaWQgcmFkaW8gZnJlcXVlbmN5IG1vZGVcbiIpOworCQkJQVRINUtfRVJSKGFoLCAiaW52YWxpZCByYWRpbyBmcmVxdWVuY3kgbW9kZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCiAJCS8qWFhYOiBDYW4gYndtb2RlIGJlIHVzZWQgd2l0aCBkeW5hbWljIG1vZGUgPwogCQkgKiAoSSBkb24ndCB0aGluayBpdCBzdXBwb3J0cyA0NE1IeikgKi8KLQkJLyogT24gMjQyNSBpbml0dmFscyBUVVJCT19TSE9SVCBpcyBub3QgcHJlc3NlbnQgKi8KKwkJLyogT24gMjQyNSBpbml0dmFscyBUVVJCT19TSE9SVCBpcyBub3QgcHJlc2VudCAqLwogCQlpZiAoYWgtPmFoX2J3bW9kZSA9PSBBUjVLX0JXTU9ERV80ME1IWikgewogCQkJdHVyYm8gPSBBUjVLX1BIWV9UVVJCT19NT0RFIHwKIAkJCQkoYWgtPmFoX3JhZGlvID09IEFSNUtfUkYyNDI1KSA/IDAgOgpAQCAtMTA2Niw3ICsxMDc2LDcgQEAKIAkvKiBSRiBCdXMgZ3JhbnQgd29uJ3Qgd29yayBpZiB3ZSBoYXZlIHBlbmRpbmcKIAkgKiBmcmFtZXMgKi8KIAlpZiAocmV0ICYmIGZhc3QpIHsKLQkJQVRINUtfREJHKGFoLT5haF9zYywgQVRINUtfREVCVUdfUkVTRVQsCisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsCiAJCQkiRE1BIGRpZG4ndCBzdG9wLCBmYWxsaW5nIGJhY2sgdG8gbm9ybWFsIHJlc2V0XG4iKTsKIAkJZmFzdCA9IDA7CiAJCS8qIE5vbiBmYXRhbCwganVzdCBjb250aW51ZSB3aXRoCkBAIC0xMDgxLDcgKzEwOTEsNyBAQAogCWNhc2UgQ0hBTk5FTF9HOgogCiAJCWlmIChhaC0+YWhfdmVyc2lvbiA8PSBBUjVLX0FSNTIxMSkgewotCQkJQVRINUtfRVJSKGFoLT5haF9zYywKKwkJCUFUSDVLX0VSUihhaCwKIAkJCQkiRyBtb2RlIG5vdCBhdmFpbGFibGUgb24gNTIxMC81MjExIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMTA5MSw3ICsxMTAxLDcgQEAKIAljYXNlIENIQU5ORUxfQjoKIAogCQlpZiAoYWgtPmFoX3ZlcnNpb24gPCBBUjVLX0FSNTIxMSkgewotCQkJQVRINUtfRVJSKGFoLT5haF9zYywKKwkJCUFUSDVLX0VSUihhaCwKIAkJCQkiQiBtb2RlIG5vdCBhdmFpbGFibGUgb24gNTIxMCIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTExMDAsMTQgKzExMTAsMTQgQEAKIAkJYnJlYWs7CiAJY2FzZSBDSEFOTkVMX1hSOgogCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTEpIHsKLQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsCisJCQlBVEg1S19FUlIoYWgsCiAJCQkJIlhSIG1vZGUgbm90IGF2YWlsYWJsZSBvbiA1MjExIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQltb2RlID0gQVI1S19NT0RFX1hSOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlBVEg1S19FUlIoYWgtPmFoX3NjLAorCQlBVEg1S19FUlIoYWgsCiAJCQkiaW52YWxpZCBjaGFubmVsOiAlZFxuIiwgY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMTE5LDEzICsxMTI5LDE2IEBACiAJaWYgKGZhc3QpIHsKIAkJcmV0ID0gYXRoNWtfaHdfcGh5X2luaXQoYWgsIGNoYW5uZWwsIG1vZGUsIHRydWUpOwogCQlpZiAocmV0KSB7Ci0JCQlBVEg1S19EQkcoYWgtPmFoX3NjLCBBVEg1S19ERUJVR19SRVNFVCwKKwkJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsCiAJCQkJImZhc3QgY2hhbiBjaGFuZ2UgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gbm9ybWFsIHJlc2V0XG4iKTsKIAkJCS8qIE5vbiBmYXRhbCwgY2FuIGhhcHBlbiBlZy4KIAkJCSAqIG9uIG1vZGUgY2hhbmdlICovCiAJCQlyZXQgPSAwOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKKwkJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsCisJCQkJImZhc3QgY2hhbiBjaGFuZ2Ugc3VjY2Vzc2Z1bFxuIik7CiAJCQlyZXR1cm4gMDsKKwkJfQogCX0KIAogCS8qCkBAIC0xMjU1LDcgKzEyNjgsNyBAQAogCSAqLwogCXJldCA9IGF0aDVrX2h3X3BoeV9pbml0KGFoLCBjaGFubmVsLCBtb2RlLCBmYWxzZSk7CiAJaWYgKHJldCkgewotCQlBVEg1S19FUlIoYWgtPmFoX3NjLAorCQlBVEg1S19FUlIoYWgsCiAJCQkiZmFpbGVkIHRvIGluaXRpYWxpemUgUEhZICglaSkgIVxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xMjc0LDExICsxMjg3LDE2IEBACiAJYXRoNWtfaHdfZG1hX2luaXQoYWgpOwogCiAKLQkvKiBFbmFibGUgMzJLSHogY2xvY2sgZnVuY3Rpb24gZm9yIEFSNTIxMisgY2hpcHMKKwkvKgorCSAqIEVuYWJsZSAzMktIeiBjbG9jayBmdW5jdGlvbiBmb3IgQVI1MjEyKyBjaGlwcwogCSAqIFNldCBjbG9ja3MgdG8gMzJLSHogb3BlcmF0aW9uIGFuZCB1c2UgYW4KIAkgKiBleHRlcm5hbCAzMktIeiBjcnlzdGFsIHdoZW4gc2xlZXBpbmcgaWYgb25lCi0JICogZXhpc3RzICovCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyICYmCisJICogZXhpc3RzLgorCSAqIERpc2FibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSBpdCBpcyBhbHNvIGRpc2FibGVkIGluCisJICogb3RoZXIgZHJpdmVycyBhbmQgaXQgaXMga25vd24gdG8gY2F1c2Ugc3RhYmlsaXR5CisJICogaXNzdWVzIG9uIHNvbWUgZGV2aWNlcworCSAqLworCWlmIChhaC0+YWhfdXNlXzMya2h6X2Nsb2NrICYmIGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyICYmCiAJICAgIG9wX21vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCWF0aDVrX2h3X3NldF9zbGVlcF9jbG9jayhhaCwgdHJ1ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZmJ1ZmZlci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmYnVmZmVyLmgKaW5kZXggMTZiNjdlOC4uNWQxMWMyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmYnVmZmVyLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmYnVmZmVyLmgKQEAgLTI1NCw3ICsyNTQsNyBAQAogCiAvKiBSRlgxMTIgKERlcmJ5IDEpICovCiAKLS8qIEJBTksgNiAJCQkJbGVuICBwb3MgY29sICovCisvKiBCQU5LIDYJCQkJbGVuICBwb3MgY29sICovCiAjZGVmaW5lCUFSNUtfUkY1MTEyX09CXzJHSFoJCXsgMywgMjY5LCAwIH0KICNkZWZpbmUJQVI1S19SRjUxMTJfREJfMkdIWgkJeyAzLCAyNzIsIDAgfQogCkBAIC00OTUsNyArNDk1LDcgQEAKIC8qIEJBTksgMgkJCQlsZW4gIHBvcyBjb2wgKi8KICNkZWZpbmUgQVI1S19SRjI0MTNfUkZfVFVSQk8JCXsgMSwgMSwgICAyIH0KIAotLyogQkFOSyA2IAkJCQlsZW4gIHBvcyBjb2wgKi8KKy8qIEJBTksgNgkJCQlsZW4gIHBvcyBjb2wgKi8KICNkZWZpbmUJQVI1S19SRjI0MTNfT0JfMkdIWgkJeyAzLCAxNjgsIDAgfQogI2RlZmluZQlBUjVLX1JGMjQxM19EQl8yR0haCQl7IDMsIDE2NSwgMCB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZmdhaW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZmdhaW4uaAppbmRleCAxMzU0ZDhjLi5lYmZhZTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmZnYWluLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmZ2Fpbi5oCkBAIC0zMCw3ICszMCw3IEBACiAKIC8qIEluaXRpYWwgUkYgR2FpbiBzZXR0aW5ncyBmb3IgUkY1MTExICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9yZmdhaW4gcmZnYWluXzUxMTFbXSA9IHsKLQkvKgkJCSAgICAgIDVHaHoJMkdoegkqLworCS8qCQkJICAgICAgNUdIegkyR0h6CSovCiAJeyBBUjVLX1JGX0dBSU4oMCksCXsgMHgwMDAwMDFhOSwgMHgwMDAwMDAwMCB9IH0sCiAJeyBBUjVLX1JGX0dBSU4oMSksCXsgMHgwMDAwMDFlOSwgMHgwMDAwMDA0MCB9IH0sCiAJeyBBUjVLX1JGX0dBSU4oMiksCXsgMHgwMDAwMDAyOSwgMHgwMDAwMDA4MCB9IH0sCkBAIC05OSw3ICs5OSw3IEBACiAKIC8qIEluaXRpYWwgUkYgR2FpbiBzZXR0aW5ncyBmb3IgUkY1MTEyICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9yZmdhaW4gcmZnYWluXzUxMTJbXSA9IHsKLQkvKgkJCSAgICAgIDVHaHoJMkdoegkqLworCS8qCQkJICAgICAgNUdIegkyR0h6CSovCiAJeyBBUjVLX1JGX0dBSU4oMCksCXsgMHgwMDAwMDAwNywgMHgwMDAwMDAwNyB9IH0sCiAJeyBBUjVLX1JGX0dBSU4oMSksCXsgMHgwMDAwMDA0NywgMHgwMDAwMDA0NyB9IH0sCiAJeyBBUjVLX1JGX0dBSU4oMiksCXsgMHgwMDAwMDA4NywgMHgwMDAwMDA4NyB9IH0sCkBAIC0zMDUsNyArMzA1LDcgQEAKIAogLyogSW5pdGlhbCBSRiBHYWluIHNldHRpbmdzIGZvciBSRjU0MTMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX3JmZ2FpbiByZmdhaW5fNTQxM1tdID0gewotCS8qCQkJICAgICAgNUdoegkyR2h6CSovCisJLyoJCQkgICAgICA1R0h6CTJHSHoJKi8KIAl7IEFSNUtfUkZfR0FJTigwKSwJeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSwKIAl7IEFSNUtfUkZfR0FJTigxKSwJeyAweDAwMDAwMDQwLCAweDAwMDAwMDQwIH0gfSwKIAl7IEFSNUtfUkZfR0FJTigyKSwJeyAweDAwMDAwMDgwLCAweDAwMDAwMDgwIH0gfSwKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCiAvKiBDaGVjayBpZiBvdXIgY3VycmVudCBtZWFzdXJlbWVudCBpcyBpbnNpZGUgb3VyCiAgKiBjdXJyZW50IHZhcmlhYmxlIGF0dGVudWF0aW9uIHdpbmRvdyAqLwotI2RlZmluZSBBUjVLX0dBSU5fQ0hFQ0tfQURKVVNUKF9nKSAJCVwKKyNkZWZpbmUgQVI1S19HQUlOX0NIRUNLX0FESlVTVChfZykJCVwKIAkoKF9nKS0+Z19jdXJyZW50IDw9IChfZyktPmdfbG93IHx8IChfZyktPmdfY3VycmVudCA+PSAoX2cpLT5nX2hpZ2gpCiAKIHN0cnVjdCBhdGg1a19nYWluX29wdF9zdGVwIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZmtpbGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZmtpbGwuYwppbmRleCA0MWE4NzdiLi45NDVmYzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmZraWxsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3Jma2lsbC5jCkBAIC0zNiw4NiArMzYsODEgQEAKICNpbmNsdWRlICJiYXNlLmgiCiAKIAotc3RhdGljIGlubGluZSB2b2lkIGF0aDVrX3Jma2lsbF9kaXNhYmxlKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoNWtfcmZraWxsX2Rpc2FibGUoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX0FOWSwgInJma2lsbCBkaXNhYmxlIChncGlvOiVkIHBvbGFyaXR5OiVkKVxuIiwKLQkJc2MtPnJmX2tpbGwuZ3Bpbywgc2MtPnJmX2tpbGwucG9sYXJpdHkpOwotCWF0aDVrX2h3X3NldF9ncGlvX291dHB1dChzYy0+YWgsIHNjLT5yZl9raWxsLmdwaW8pOwotCWF0aDVrX2h3X3NldF9ncGlvKHNjLT5haCwgc2MtPnJmX2tpbGwuZ3BpbywgIXNjLT5yZl9raWxsLnBvbGFyaXR5KTsKKwlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0FOWSwgInJma2lsbCBkaXNhYmxlIChncGlvOiVkIHBvbGFyaXR5OiVkKVxuIiwKKwkJYWgtPnJmX2tpbGwuZ3BpbywgYWgtPnJmX2tpbGwucG9sYXJpdHkpOworCWF0aDVrX2h3X3NldF9ncGlvX291dHB1dChhaCwgYWgtPnJmX2tpbGwuZ3Bpbyk7CisJYXRoNWtfaHdfc2V0X2dwaW8oYWgsIGFoLT5yZl9raWxsLmdwaW8sICFhaC0+cmZfa2lsbC5wb2xhcml0eSk7CiB9CiAKIAotc3RhdGljIGlubGluZSB2b2lkIGF0aDVrX3Jma2lsbF9lbmFibGUoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a19yZmtpbGxfZW5hYmxlKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0JQVRINUtfREJHKHNjLCBBVEg1S19ERUJVR19BTlksICJyZmtpbGwgZW5hYmxlIChncGlvOiVkIHBvbGFyaXR5OiVkKVxuIiwKLQkJc2MtPnJmX2tpbGwuZ3Bpbywgc2MtPnJmX2tpbGwucG9sYXJpdHkpOwotCWF0aDVrX2h3X3NldF9ncGlvX291dHB1dChzYy0+YWgsIHNjLT5yZl9raWxsLmdwaW8pOwotCWF0aDVrX2h3X3NldF9ncGlvKHNjLT5haCwgc2MtPnJmX2tpbGwuZ3Bpbywgc2MtPnJmX2tpbGwucG9sYXJpdHkpOworCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfQU5ZLCAicmZraWxsIGVuYWJsZSAoZ3BpbzolZCBwb2xhcml0eTolZClcbiIsCisJCWFoLT5yZl9raWxsLmdwaW8sIGFoLT5yZl9raWxsLnBvbGFyaXR5KTsKKwlhdGg1a19od19zZXRfZ3Bpb19vdXRwdXQoYWgsIGFoLT5yZl9raWxsLmdwaW8pOworCWF0aDVrX2h3X3NldF9ncGlvKGFoLCBhaC0+cmZfa2lsbC5ncGlvLCBhaC0+cmZfa2lsbC5wb2xhcml0eSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a19yZmtpbGxfc2V0X2ludHIoc3RydWN0IGF0aDVrX3NvZnRjICpzYywgYm9vbCBlbmFibGUpCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoNWtfcmZraWxsX3NldF9pbnRyKHN0cnVjdCBhdGg1a19odyAqYWgsIGJvb2wgZW5hYmxlKQogewotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CiAJdTMyIGN1cnZhbDsKIAotCWF0aDVrX2h3X3NldF9ncGlvX2lucHV0KGFoLCBzYy0+cmZfa2lsbC5ncGlvKTsKLQljdXJ2YWwgPSBhdGg1a19od19nZXRfZ3BpbyhhaCwgc2MtPnJmX2tpbGwuZ3Bpbyk7Ci0JYXRoNWtfaHdfc2V0X2dwaW9faW50cihhaCwgc2MtPnJmX2tpbGwuZ3BpbywgZW5hYmxlID8KKwlhdGg1a19od19zZXRfZ3Bpb19pbnB1dChhaCwgYWgtPnJmX2tpbGwuZ3Bpbyk7CisJY3VydmFsID0gYXRoNWtfaHdfZ2V0X2dwaW8oYWgsIGFoLT5yZl9raWxsLmdwaW8pOworCWF0aDVrX2h3X3NldF9ncGlvX2ludHIoYWgsIGFoLT5yZl9raWxsLmdwaW8sIGVuYWJsZSA/CiAJCQkJCSEhY3VydmFsIDogIWN1cnZhbCk7CiB9CiAKIHN0YXRpYyBib29sCi1hdGg1a19pc19yZmtpbGxfc2V0KHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpCithdGg1a19pc19yZmtpbGxfc2V0KHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJLyogY29uZmlndXJpbmcgR1BJTyBmb3IgaW5wdXQgZm9yIHNvbWUgcmVhc29uIGRpc2FibGVzIHJma2lsbCAqLwotCS8qYXRoNWtfaHdfc2V0X2dwaW9faW5wdXQoc2MtPmFoLCBzYy0+cmZfa2lsbC5ncGlvKTsqLwotCXJldHVybiBhdGg1a19od19nZXRfZ3BpbyhzYy0+YWgsIHNjLT5yZl9raWxsLmdwaW8pID09Ci0JCQkJCQkJc2MtPnJmX2tpbGwucG9sYXJpdHk7CisJLyphdGg1a19od19zZXRfZ3Bpb19pbnB1dChhaCwgYWgtPnJmX2tpbGwuZ3Bpbyk7Ki8KKwlyZXR1cm4gYXRoNWtfaHdfZ2V0X2dwaW8oYWgsIGFoLT5yZl9raWxsLmdwaW8pID09CisJCQkJCQkJYWgtPnJmX2tpbGwucG9sYXJpdHk7CiB9CiAKIHN0YXRpYyB2b2lkCiBhdGg1a190YXNrbGV0X3Jma2lsbF90b2dnbGUodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSAodm9pZCAqKWRhdGE7CisJc3RydWN0IGF0aDVrX2h3ICphaCA9ICh2b2lkICopZGF0YTsKIAlib29sIGJsb2NrZWQ7CiAKLQlibG9ja2VkID0gYXRoNWtfaXNfcmZraWxsX3NldChzYyk7Ci0Jd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShzYy0+aHctPndpcGh5LCBibG9ja2VkKTsKKwlibG9ja2VkID0gYXRoNWtfaXNfcmZraWxsX3NldChhaCk7CisJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShhaC0+aHctPndpcGh5LCBibG9ja2VkKTsKIH0KIAogCiB2b2lkCiBhdGg1a19yZmtpbGxfaHdfc3RhcnQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gYWgtPmFoX3NjOwotCiAJLyogcmVhZCByZmtpbGwgR1BJTyBjb25maWd1cmF0aW9uIGZyb20gRUVQUk9NIGhlYWRlciAqLwotCXNjLT5yZl9raWxsLmdwaW8gPSBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb20uZWVfcmZraWxsX3BpbjsKLQlzYy0+cmZfa2lsbC5wb2xhcml0eSA9IGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbS5lZV9yZmtpbGxfcG9sOworCWFoLT5yZl9raWxsLmdwaW8gPSBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb20uZWVfcmZraWxsX3BpbjsKKwlhaC0+cmZfa2lsbC5wb2xhcml0eSA9IGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbS5lZV9yZmtpbGxfcG9sOwogCi0JdGFza2xldF9pbml0KCZzYy0+cmZfa2lsbC50b2dnbGVxLCBhdGg1a190YXNrbGV0X3Jma2lsbF90b2dnbGUsCi0JCSh1bnNpZ25lZCBsb25nKXNjKTsKKwl0YXNrbGV0X2luaXQoJmFoLT5yZl9raWxsLnRvZ2dsZXEsIGF0aDVrX3Rhc2tsZXRfcmZraWxsX3RvZ2dsZSwKKwkJKHVuc2lnbmVkIGxvbmcpYWgpOwogCi0JYXRoNWtfcmZraWxsX2Rpc2FibGUoc2MpOworCWF0aDVrX3Jma2lsbF9kaXNhYmxlKGFoKTsKIAogCS8qIGVuYWJsZSBpbnRlcnJ1cHQgZm9yIHJma2lsbCBzd2l0Y2ggKi8KIAlpZiAoQVI1S19FRVBST01fSERSX1JGS0lMTChhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb20uZWVfaGVhZGVyKSkKLQkJYXRoNWtfcmZraWxsX3NldF9pbnRyKHNjLCB0cnVlKTsKKwkJYXRoNWtfcmZraWxsX3NldF9pbnRyKGFoLCB0cnVlKTsKIH0KIAogCiB2b2lkCiBhdGg1a19yZmtpbGxfaHdfc3RvcChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBhaC0+YWhfc2M7Ci0KIAkvKiBkaXNhYmxlIGludGVycnVwdCBmb3IgcmZraWxsIHN3aXRjaCAqLwogCWlmIChBUjVLX0VFUFJPTV9IRFJfUkZLSUxMKGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbS5lZV9oZWFkZXIpKQotCQlhdGg1a19yZmtpbGxfc2V0X2ludHIoc2MsIGZhbHNlKTsKKwkJYXRoNWtfcmZraWxsX3NldF9pbnRyKGFoLCBmYWxzZSk7CiAKLQl0YXNrbGV0X2tpbGwoJnNjLT5yZl9raWxsLnRvZ2dsZXEpOworCXRhc2tsZXRfa2lsbCgmYWgtPnJmX2tpbGwudG9nZ2xlcSk7CiAKIAkvKiBlbmFibGUgUkZLSUxMIHdoZW4gc3RvcHBpbmcgSFcgc28gV2lmaSBMRUQgaXMgdHVybmVkIG9mZiAqLwotCWF0aDVrX3Jma2lsbF9lbmFibGUoc2MpOworCWF0aDVrX3Jma2lsbF9lbmFibGUoYWgpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvc3lzZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9zeXNmcy5jCmluZGV4IDkyOWM2OGMuLjAyNDRhMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9zeXNmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9zeXNmcy5jCkBAIC0xMCwxOSArMTAsMjMgQEAKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJCVwKIAkJCWNoYXIgKmJ1ZikJCQkJCVwKIHsJCQkJCQkJCQlcCi0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZ2V0KTsgCQkJXAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBhdGg1a19odyAqYWggPSBody0+cHJpdjsJCQkJXAorCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBnZXQpOwkJCVwKIH0JCQkJCQkJCQlcCiAJCQkJCQkJCQlcCiBzdGF0aWMgc3NpemVfdCBhdGg1a19hdHRyX3N0b3JlXyMjbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCQlcCiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQlcCiB7CQkJCQkJCQkJXAotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCi0JaW50IHZhbDsJCQkJCQkJXAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBhdGg1a19odyAqYWggPSBody0+cHJpdjsJCQkJXAorCWludCB2YWwsIHJldDsJCQkJCQkJXAogCQkJCQkJCQkJXAotCXZhbCA9IChpbnQpc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAotCXNldChzYy0+YWgsIHZhbCk7CQkJCQkJXAorCXJldCA9IGtzdHJ0b2ludChidWYsIDEwLCAmdmFsKTsJCQkJCVwKKwlpZiAocmV0IDwgMCkJCQkJCQkJXAorCQlyZXR1cm4gcmV0OwkJCQkJCVwKKwlzZXQoYWgsIHZhbCk7CQkJCQkJXAogCXJldHVybiBjb3VudDsJCQkJCQkJXAogfQkJCQkJCQkJCVwKIHN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPIHwgU19JV1VTUiwJCQkJXApAQCAtMzMsMjUgKzM3LDI2IEBACiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCQlcCiAJCQljaGFyICpidWYpCQkJCQlcCiB7CQkJCQkJCQkJXAotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGdldCk7IAkJCVwKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gaHctPnByaXY7CQkJCVwKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZ2V0KTsJCQlcCiB9CQkJCQkJCQkJXAogc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGF0aDVrX2F0dHJfc2hvd18jI25hbWUsIE5VTEwpCiAKIC8qKiogQU5JICoqKi8KIAotU0lNUExFX1NIT1dfU1RPUkUoYW5pX21vZGUsIHNjLT5hbmlfc3RhdGUuYW5pX21vZGUsIGF0aDVrX2FuaV9pbml0KTsKLVNJTVBMRV9TSE9XX1NUT1JFKG5vaXNlX2ltbXVuaXR5X2xldmVsLCBzYy0+YW5pX3N0YXRlLm5vaXNlX2ltbV9sZXZlbCwKK1NJTVBMRV9TSE9XX1NUT1JFKGFuaV9tb2RlLCBhaC0+YW5pX3N0YXRlLmFuaV9tb2RlLCBhdGg1a19hbmlfaW5pdCk7CitTSU1QTEVfU0hPV19TVE9SRShub2lzZV9pbW11bml0eV9sZXZlbCwgYWgtPmFuaV9zdGF0ZS5ub2lzZV9pbW1fbGV2ZWwsCiAJCQlhdGg1a19hbmlfc2V0X25vaXNlX2ltbXVuaXR5X2xldmVsKTsKLVNJTVBMRV9TSE9XX1NUT1JFKHNwdXJfbGV2ZWwsIHNjLT5hbmlfc3RhdGUuc3B1cl9sZXZlbCwKK1NJTVBMRV9TSE9XX1NUT1JFKHNwdXJfbGV2ZWwsIGFoLT5hbmlfc3RhdGUuc3B1cl9sZXZlbCwKIAkJCWF0aDVrX2FuaV9zZXRfc3B1cl9pbW11bml0eV9sZXZlbCk7Ci1TSU1QTEVfU0hPV19TVE9SRShmaXJzdGVwX2xldmVsLCBzYy0+YW5pX3N0YXRlLmZpcnN0ZXBfbGV2ZWwsCitTSU1QTEVfU0hPV19TVE9SRShmaXJzdGVwX2xldmVsLCBhaC0+YW5pX3N0YXRlLmZpcnN0ZXBfbGV2ZWwsCiAJCQlhdGg1a19hbmlfc2V0X2ZpcnN0ZXBfbGV2ZWwpOwotU0lNUExFX1NIT1dfU1RPUkUob2ZkbV93ZWFrX3NpZ25hbF9kZXRlY3Rpb24sIHNjLT5hbmlfc3RhdGUub2ZkbV93ZWFrX3NpZywKK1NJTVBMRV9TSE9XX1NUT1JFKG9mZG1fd2Vha19zaWduYWxfZGV0ZWN0aW9uLCBhaC0+YW5pX3N0YXRlLm9mZG1fd2Vha19zaWcsCiAJCQlhdGg1a19hbmlfc2V0X29mZG1fd2Vha19zaWduYWxfZGV0ZWN0aW9uKTsKLVNJTVBMRV9TSE9XX1NUT1JFKGNja193ZWFrX3NpZ25hbF9kZXRlY3Rpb24sIHNjLT5hbmlfc3RhdGUuY2NrX3dlYWtfc2lnLAorU0lNUExFX1NIT1dfU1RPUkUoY2NrX3dlYWtfc2lnbmFsX2RldGVjdGlvbiwgYWgtPmFuaV9zdGF0ZS5jY2tfd2Vha19zaWcsCiAJCQlhdGg1a19hbmlfc2V0X2Nja193ZWFrX3NpZ25hbF9kZXRlY3Rpb24pOwotU0lNUExFX1NIT1coc3B1cl9sZXZlbF9tYXgsIHNjLT5hbmlfc3RhdGUubWF4X3NwdXJfbGV2ZWwpOworU0lNUExFX1NIT1coc3B1cl9sZXZlbF9tYXgsIGFoLT5hbmlfc3RhdGUubWF4X3NwdXJfbGV2ZWwpOwogCiBzdGF0aWMgc3NpemVfdCBhdGg1a19hdHRyX3Nob3dfbm9pc2VfaW1tdW5pdHlfbGV2ZWxfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtOTMsMTQgKzk4LDE0IEBACiAvKioqIHJlZ2lzdGVyIC8gdW5yZWdpc3RlciAqKiovCiAKIGludAotYXRoNWtfc3lzZnNfcmVnaXN0ZXIoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK2F0aDVrX3N5c2ZzX3JlZ2lzdGVyKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gc2MtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhaC0+ZGV2OwogCWludCBlcnI7CiAKIAllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmF0aDVrX2F0dHJpYnV0ZV9ncm91cF9hbmkpOwogCWlmIChlcnIpIHsKLQkJQVRINUtfRVJSKHNjLCAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBncm91cFxuIik7CisJCUFUSDVLX0VSUihhaCwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZ3JvdXBcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTA4LDkgKzExMyw5IEBACiB9CiAKIHZvaWQKLWF0aDVrX3N5c2ZzX3VucmVnaXN0ZXIoc3RydWN0IGF0aDVrX3NvZnRjICpzYykKK2F0aDVrX3N5c2ZzX3VucmVnaXN0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzYy0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFoLT5kZXY7CiAKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJmF0aDVrX2F0dHJpYnV0ZV9ncm91cF9hbmkpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3RyYWNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvdHJhY2UuaAppbmRleCAyZGU2OGFkLi5jNzQxYzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvdHJhY2UuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvdHJhY2UuaApAQCAtMTIsMjIgKzEyLDE5IEBACiAKIHN0cnVjdCBza19idWZmOwogCi0jZGVmaW5lIFBSSVZfRU5UUlkgIF9fZmllbGQoc3RydWN0IGF0aDVrX3NvZnRjICosIHByaXYpCi0jZGVmaW5lIFBSSVZfQVNTSUdOIF9fZW50cnktPnByaXYgPSBwcml2Ci0KICN1bmRlZiBUUkFDRV9TWVNURU0KICNkZWZpbmUgVFJBQ0VfU1lTVEVNIGF0aDVrCiAKIFRSQUNFX0VWRU5UKGF0aDVrX3J4LAotCVRQX1BST1RPKHN0cnVjdCBhdGg1a19zb2Z0YyAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiksCisJVFBfUFJPVE8oc3RydWN0IGF0aDVrX2h3ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSwKIAlUUF9BUkdTKHByaXYsIHNrYiksCiAJVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQorCQlfX2ZpZWxkKHN0cnVjdCBhdGg1a19odyAqLCBwcml2KQogCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIHNrYmFkZHIpCiAJCV9fZHluYW1pY19hcnJheSh1OCwgZnJhbWUsIHNrYi0+bGVuKQogCSksCiAJVFBfZmFzdF9hc3NpZ24oCi0JCVBSSVZfQVNTSUdOOworCQlfX2VudHJ5LT5wcml2ID0gcHJpdjsKIAkJX19lbnRyeS0+c2tiYWRkciA9ICh1bnNpZ25lZCBsb25nKSBza2I7CiAJCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KGZyYW1lKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJKSwKQEAgLTM3LDIwICszNCwyMCBAQAogKTsKIAogVFJBQ0VfRVZFTlQoYXRoNWtfdHgsCi0JVFBfUFJPVE8oc3RydWN0IGF0aDVrX3NvZnRjICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCVRQX1BST1RPKHN0cnVjdCBhdGg1a19odyAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJIHN0cnVjdCBhdGg1a190eHEgKnEpLAogCiAJVFBfQVJHUyhwcml2LCBza2IsIHEpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQorCQlfX2ZpZWxkKHN0cnVjdCBhdGg1a19odyAqLCBwcml2KQogCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIHNrYmFkZHIpCiAJCV9fZmllbGQodTgsIHFudW0pCiAJCV9fZHluYW1pY19hcnJheSh1OCwgZnJhbWUsIHNrYi0+bGVuKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKLQkJUFJJVl9BU1NJR047CisJCV9fZW50cnktPnByaXYgPSBwcml2OwogCQlfX2VudHJ5LT5za2JhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHNrYjsKIAkJX19lbnRyeS0+cW51bSA9ICh1OCkgcS0+cW51bTsKIAkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkoZnJhbWUpLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKQEAgLTYzLDEzICs2MCwxMyBAQAogKTsKIAogVFJBQ0VfRVZFTlQoYXRoNWtfdHhfY29tcGxldGUsCi0JVFBfUFJPVE8oc3RydWN0IGF0aDVrX3NvZnRjICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCVRQX1BST1RPKHN0cnVjdCBhdGg1a19odyAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJIHN0cnVjdCBhdGg1a190eHEgKnEsIHN0cnVjdCBhdGg1a190eF9zdGF0dXMgKnRzKSwKIAogCVRQX0FSR1MocHJpdiwgc2tiLCBxLCB0cyksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAotCQlQUklWX0VOVFJZCisJCV9fZmllbGQoc3RydWN0IGF0aDVrX2h3ICosIHByaXYpCiAJCV9fZmllbGQodW5zaWduZWQgbG9uZywgc2tiYWRkcikKIAkJX19maWVsZCh1OCwgcW51bSkKIAkJX19maWVsZCh1OCwgdHNfc3RhdHVzKQpAQCAtNzgsNyArNzUsNyBAQAogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKLQkJUFJJVl9BU1NJR047CisJCV9fZW50cnktPnByaXYgPSBwcml2OwogCQlfX2VudHJ5LT5za2JhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHNrYjsKIAkJX19lbnRyeS0+cW51bSA9ICh1OCkgcS0+cW51bTsKIAkJX19lbnRyeS0+dHNfc3RhdHVzID0gdHMtPnRzX3N0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9haGIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9haGIuYwppbmRleCA1YjQ5Y2QwLi4wYjM2ZmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYWhiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FoYi5jCkBAIC0yNyw2ICsyNywxMCBAQAogCQkuZHJpdmVyX2RhdGEgPSBBUjU0MTZfQVI5MTAwX0RFVklELAogCX0sCiAJeworCQkubmFtZSA9ICJhcjkzM3hfd21hYyIsCisJCS5kcml2ZXJfZGF0YSA9IEFSOTMwMF9ERVZJRF9BUjkzMzAsCisJfSwKKwl7CiAJCS5uYW1lID0gImFyOTM0eF93bWFjIiwKIAkJLmRyaXZlcl9kYXRhID0gQVI5MzAwX0RFVklEX0FSOTM0MCwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyNTAwOF9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjUwMDhfcGh5LmMKaW5kZXggNDQxYmIzMy4uZmFjMmM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyNTAwOF9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X3BoeS5jCkBAIC02MjcsNiArNjI3LDExIEBACiAJZWxzZQogCQlzeW50aERlbGF5IC89IDEwOwogCisJaWYgKElTX0NIQU5fSEFMRl9SQVRFKGNoYW4pKQorCQlzeW50aERlbGF5ICo9IDI7CisJZWxzZSBpZiAoSVNfQ0hBTl9RVUFSVEVSX1JBVEUoY2hhbikpCisJCXN5bnRoRGVsYXkgKj0gNDsKKwogCVJFR19XUklURShhaCwgQVJfUEhZX0FDVElWRSwgQVJfUEhZX0FDVElWRV9FTik7CiAKIAl1ZGVsYXkoc3ludGhEZWxheSArIEJBU0VfQUNUSVZBVEVfREVMQVkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9ody5jCmluZGV4IGYzNDRjYzIuLjlmZjdjMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2h3LmMKQEAgLTQ5OSw0NSArNDk5LDYgQEAKIAl9CiB9CiAKLS8qCi0gKiBJZiBBc3luYyBGSUZPIGlzIGVuYWJsZWQsIHRoZSBmb2xsb3dpbmcgY291bnRlcnMgY2hhbmdlIGFzIE1BQyBub3cgcnVucwotICogYXQgMTE3IE1oeiBpbnN0ZWFkIG9mIDg4LzQ0TUh6IHdoZW4gYXN5bmMgRklGTyBpcyBkaXNhYmxlZC4KLSAqCi0gKiBUaGUgdmFsdWVzIGJlbG93IHRlc3RlZCBmb3IgaHQ0MCAyIGNoYWluLgotICogT3ZlcndyaXRlIHRoZSBkZWxheS90aW1lb3V0cyBpbml0aWFsaXplZCBpbiBwcm9jZXNzIGluaS4KLSAqLwotdm9pZCBhcjkwMDJfaHdfdXBkYXRlX2FzeW5jX2ZpZm8oc3RydWN0IGF0aF9odyAqYWgpCi17Ci0JaWYgKEFSX1NSRVZfOTI4N18xM19PUl9MQVRFUihhaCkpIHsKLQkJUkVHX1dSSVRFKGFoLCBBUl9EX0dCTF9JRlNfU0lGUywKLQkJCSAgQVJfRF9HQkxfSUZTX1NJRlNfQVNZTkNfRklGT19EVVIpOwotCQlSRUdfV1JJVEUoYWgsIEFSX0RfR0JMX0lGU19TTE9ULAotCQkJICBBUl9EX0dCTF9JRlNfU0xPVF9BU1lOQ19GSUZPX0RVUik7Ci0JCVJFR19XUklURShhaCwgQVJfRF9HQkxfSUZTX0VJRlMsCi0JCQkgIEFSX0RfR0JMX0lGU19FSUZTX0FTWU5DX0ZJRk9fRFVSKTsKLQotCQlSRUdfV1JJVEUoYWgsIEFSX1RJTUVfT1VULCBBUl9USU1FX09VVF9BQ0tfQ1RTX0FTWU5DX0ZJRk9fRFVSKTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9VU0VDLCBBUl9VU0VDX0FTWU5DX0ZJRk9fRFVSKTsKLQotCQlSRUdfU0VUX0JJVChhaCwgQVJfTUFDX1BDVV9MT0dJQ19BTkFMWVpFUiwKLQkJCSAgICBBUl9NQUNfUENVX0xPR0lDX0FOQUxZWkVSX0RJU0JVRzIwNzY4KTsKLQkJUkVHX1JNV19GSUVMRChhaCwgQVJfQUhCX01PREUsIEFSX0FIQl9DVVNUT01fQlVSU1RfRU4sCi0JCQkgICAgICBBUl9BSEJfQ1VTVE9NX0JVUlNUX0FTWU5DX0ZJRk9fVkFMKTsKLQl9Ci19Ci0KLS8qCi0gKiBXZSBkb24ndCBlbmFibGUgV0VQIGFnZ3JlZ2F0aW9uIG9uIG1hYzgwMjExIGJ1dCB3ZSBrZWVwIHRoaXMKLSAqIGFyb3VuZCBmb3IgSEFMIHVuaWZpY2F0aW9uIHB1cnBvc2VzLgotICovCi12b2lkIGFyOTAwMl9od19lbmFibGVfd2VwX2FnZ3JlZ2F0aW9uKHN0cnVjdCBhdGhfaHcgKmFoKQotewotCWlmIChBUl9TUkVWXzkyODdfMTNfT1JfTEFURVIoYWgpKSB7Ci0JCVJFR19TRVRfQklUKGFoLCBBUl9QQ1VfTUlTQ19NT0RFMiwKLQkJCSAgICBBUl9QQ1VfTUlTQ19NT0RFMl9FTkFCTEVfQUdHV0VQKTsKLQl9Ci19Ci0KIC8qIFNldHMgdXAgdGhlIEFSNTAwOC9BUjkwMDEvQVI5MDAyIGhhcmR3YXJlIGZhbWlsaXkgY2FsbGJhY2tzICovCiB2b2lkIGFyOTAwMl9od19hdHRhY2hfb3BzKHN0cnVjdCBhdGhfaHcgKmFoKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfbWFjLmMKaW5kZXggMDc3ZThhNi4uNDViMjYyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX21hYy5jCkBAIC0yOCwxMSArMjgsNiBAQAogCSgoc3RydWN0IGF0aF9kZXNjKikgZHMpLT5kc19saW5rID0gZHNfbGluazsKIH0KIAotc3RhdGljIHZvaWQgYXI5MDAyX2h3X2dldF9kZXNjX2xpbmsodm9pZCAqZHMsIHUzMiAqKmRzX2xpbmspCi17Ci0JKmRzX2xpbmsgPSAmKChzdHJ1Y3QgYXRoX2Rlc2MgKilkcyktPmRzX2xpbms7Ci19Ci0KIHN0YXRpYyBib29sIGFyOTAwMl9od19nZXRfaXNyKHN0cnVjdCBhdGhfaHcgKmFoLCBlbnVtIGF0aDlrX2ludCAqbWFza2VkKQogewogCXUzMiBpc3IgPSAwOwpAQCAtNDM3LDcgKzQzMiw2IEBACiAKIAlvcHMtPnJ4X2VuYWJsZSA9IGFyOTAwMl9od19yeF9lbmFibGU7CiAJb3BzLT5zZXRfZGVzY19saW5rID0gYXI5MDAyX2h3X3NldF9kZXNjX2xpbms7Ci0Jb3BzLT5nZXRfZGVzY19saW5rID0gYXI5MDAyX2h3X2dldF9kZXNjX2xpbms7CiAJb3BzLT5nZXRfaXNyID0gYXI5MDAyX2h3X2dldF9pc3I7CiAJb3BzLT5maWxsX3R4ZGVzYyA9IGFyOTAwMl9od19maWxsX3R4ZGVzYzsKIAlvcHMtPnByb2NfdHhkZXNjID0gYXI5MDAyX2h3X3Byb2NfdHhkZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfcGh5LmMKaW5kZXggMmZlMGEzNC4uM2NiYmIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX3BoeS5jCkBAIC0xMTEsNyArMTExLDkgQEAKIAogCQlzd2l0Y2ggKGFoLT5lZXBfb3BzLT5nZXRfZWVwcm9tKGFoLCBFRVBfRlJBQ19OXzVHKSkgewogCQljYXNlIDA6Ci0JCQlpZiAoKGZyZXEgJSAyMCkgPT0gMCkKKwkJCWlmIChJU19DSEFOX0hBTEZfUkFURShjaGFuKSB8fCBJU19DSEFOX1FVQVJURVJfUkFURShjaGFuKSkKKwkJCQlhTW9kZVJlZlNlbCA9IDA7CisJCQllbHNlIGlmICgoZnJlcSAlIDIwKSA9PSAwKQogCQkJCWFNb2RlUmVmU2VsID0gMzsKIAkJCWVsc2UgaWYgKChmcmVxICUgMTApID09IDApCiAJCQkJYU1vZGVSZWZTZWwgPSAyOwpAQCAtMTI5LDggKzEzMSw5IEBACiAJCQljaGFubmVsU2VsID0gQ0hBTlNFTF81RyhmcmVxKTsKIAogCQkJLyogUmVmRGl2QSBzZXR0aW5nICovCi0JCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9BTl9TWU5USDksCi0JCQkJICAgICAgQVJfQU5fU1lOVEg5X1JFRkRJVkEsIHJlZkRpdkEpOworCQkJYXRoOWtfaHdfYW5hbG9nX3NoaWZ0X3JtdyhhaCwgQVJfQU5fU1lOVEg5LAorCQkJCSAgICAgIEFSX0FOX1NZTlRIOV9SRUZESVZBLAorCQkJCSAgICAgIEFSX0FOX1NZTlRIOV9SRUZESVZBX1MsIHJlZkRpdkEpOwogCiAJCX0KIApAQCAtNDQ3LDI2ICs0NTAsMjcgQEAKIHN0YXRpYyB1MzIgYXI5MDAyX2h3X2NvbXB1dGVfcGxsX2NvbnRyb2woc3RydWN0IGF0aF9odyAqYWgsCiAJCQkJCSBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKIHsKKwlpbnQgcmVmX2RpdiA9IDU7CisJaW50IHBsbF9kaXYgPSAweDJjOwogCXUzMiBwbGw7CiAKLQlwbGwgPSBTTSgweDUsIEFSX1JUQ185MTYwX1BMTF9SRUZESVYpOworCWlmIChjaGFuICYmIElTX0NIQU5fNUdIWihjaGFuKSAmJiAhSVNfQ0hBTl9BX0ZBU1RfQ0xPQ0soYWgsIGNoYW4pKSB7CisJCWlmIChBUl9TUkVWXzkyODBfMjAoYWgpKSB7CisJCQlyZWZfZGl2ID0gMTA7CisJCQlwbGxfZGl2ID0gMHg1MDsKKwkJfSBlbHNlIHsKKwkJCXBsbF9kaXYgPSAweDI4OworCQl9CisJfQorCisJcGxsID0gU00ocmVmX2RpdiwgQVJfUlRDXzkxNjBfUExMX1JFRkRJVik7CisJcGxsIHw9IFNNKHBsbF9kaXYsIEFSX1JUQ185MTYwX1BMTF9ESVYpOwogCiAJaWYgKGNoYW4gJiYgSVNfQ0hBTl9IQUxGX1JBVEUoY2hhbikpCiAJCXBsbCB8PSBTTSgweDEsIEFSX1JUQ185MTYwX1BMTF9DTEtTRUwpOwogCWVsc2UgaWYgKGNoYW4gJiYgSVNfQ0hBTl9RVUFSVEVSX1JBVEUoY2hhbikpCiAJCXBsbCB8PSBTTSgweDIsIEFSX1JUQ185MTYwX1BMTF9DTEtTRUwpOwogCi0JaWYgKGNoYW4gJiYgSVNfQ0hBTl81R0haKGNoYW4pKSB7Ci0JCWlmIChJU19DSEFOX0FfRkFTVF9DTE9DSyhhaCwgY2hhbikpCi0JCQlwbGwgPSAweDE0MmM7Ci0JCWVsc2UgaWYgKEFSX1NSRVZfOTI4MF8yMChhaCkpCi0JCQlwbGwgPSAweDI4NTA7Ci0JCWVsc2UKLQkJCXBsbCB8PSBTTSgweDI4LCBBUl9SVENfOTE2MF9QTExfRElWKTsKLQl9IGVsc2UgewotCQlwbGwgfD0gU00oMHgyYywgQVJfUlRDXzkxNjBfUExMX0RJVik7Ci0JfQotCiAJcmV0dXJuIHBsbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM18ycDJfaW5pdHZhbHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfMnAyX2luaXR2YWxzLmgKaW5kZXggZThhYzcwZC4uMjMzOTcyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM18ycDJfaW5pdHZhbHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzXzJwMl9pbml0dmFscy5oCkBAIC02NTMsOCArNjUzLDggQEAKIAl7MHgwMDAwYTI4OCwgMHgwMDAwMDExMCwgMHgwMDAwMDExMCwgMHgwMDAwMDExMCwgMHgwMDAwMDExMH0sCiAJezB4MDAwMGEyOGMsIDB4MDAwMjIyMjIsIDB4MDAwMjIyMjIsIDB4MDAwMjIyMjIsIDB4MDAwMjIyMjJ9LAogCXsweDAwMDBhMmM0LCAweDAwMTU4ZDE4LCAweDAwMTU4ZDE4LCAweDAwMTU4ZDE4LCAweDAwMTU4ZDE4fSwKLQl7MHgwMDAwYTJkMCwgMHgwMDA3MTk4MSwgMHgwMDA3MTk4MSwgMHgwMDA3MTk4MSwgMHgwMDA3MTk4Mn0sCi0JezB4MDAwMGEyZDgsIDB4Nzk5OWE4M2EsIDB4Nzk5OWE4M2EsIDB4Nzk5OWE4M2EsIDB4Nzk5OWE4M2F9LAorCXsweDAwMDBhMmQwLCAweDAwMDQxOTgxLCAweDAwMDQxOTgxLCAweDAwMDQxOTgxLCAweDAwMDQxOTgyfSwKKwl7MHgwMDAwYTJkOCwgMHg3OTk5YTgzYiwgMHg3OTk5YTgzYiwgMHg3OTk5YTgzYiwgMHg3OTk5YTgzYn0sCiAJezB4MDAwMGEzNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAogCXsweDAwMDBhODMwLCAweDAwMDAwMTljLCAweDAwMDAwMTljLCAweDAwMDAwMTljLCAweDAwMDAwMTljfSwKIAl7MHgwMDAwYWUwNCwgMHgwMDFjMDAwMCwgMHgwMDFjMDAwMCwgMHgwMDFjMDAwMCwgMHgwMDFjMDAwMH0sCkBAIC03NjEsNyArNzYxLDcgQEAKIAl7MHgwMDAwYTNlYywgMHgyMDIwMjAyMH0sCiAJezB4MDAwMGEzZjAsIDB4MDAwMDAwMDB9LAogCXsweDAwMDBhM2Y0LCAweDAwMDAwMjQ2fSwKLQl7MHgwMDAwYTNmOCwgMHgwY2RiZDM4MH0sCisJezB4MDAwMGEzZjgsIDB4MGM5YmQzODB9LAogCXsweDAwMDBhM2ZjLCAweDAwMGYwZjAxfSwKIAl7MHgwMDAwYTQwMCwgMHg4ZmE5MWYwMX0sCiAJezB4MDAwMGE0MDQsIDB4MDAwMDAwMDB9LApAQCAtNzgwLDcgKzc4MCw3IEBACiAJezB4MDAwMGE0M2MsIDB4MDAxMDAwMDB9LAogCXsweDAwMDBhNDQwLCAweDAwMDAwMDAwfSwKIAl7MHgwMDAwYTQ0NCwgMHgwMDAwMDAwMH0sCi0JezB4MDAwMGE0NDgsIDB4MDYwMDAwODB9LAorCXsweDAwMDBhNDQ4LCAweDA1MDAwMDgwfSwKIAl7MHgwMDAwYTQ0YywgMHgwMDAwMDAwMX0sCiAJezB4MDAwMGE0NTAsIDB4MDAwMTAwMDB9LAogCXsweDAwMDBhNDU4LCAweDAwMDAwMDAwfSwKQEAgLTE1MDAsOCArMTUwMCw2IEBACiAJezB4MDAwMDgxNmMsIDB4MDAwMDAwMDB9LAogCXsweDAwMDA4MWMwLCAweDAwMDAwMDAwfSwKIAl7MHgwMDAwODFjNCwgMHgzMzMzMjIxMH0sCi0JezB4MDAwMDgxYzgsIDB4MDAwMDAwMDB9LAotCXsweDAwMDA4MWNjLCAweDAwMDAwMDAwfSwKIAl7MHgwMDAwODFlYywgMHgwMDAwMDAwMH0sCiAJezB4MDAwMDgxZjAsIDB4MDAwMDAwMDB9LAogCXsweDAwMDA4MWY0LCAweDAwMDAwMDAwfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jCmluZGV4IGZmODE1MGUuLmQxMDljMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgImh3LmgiCiAjaW5jbHVkZSAiYXI5MDAzX3BoeS5oIgogI2luY2x1ZGUgImFyOTAwM19lZXByb20uaCIKQEAgLTE0NjEsNyArMTQ2Miw3IEBACiAJCXsgeyBDVEwoNjAsIDApLCBDVEwoNjAsIDEpLCBDVEwoNjAsIDApLCBDVEwoNjAsIDApIH0gfSwKIAkJeyB7IENUTCg2MCwgMSksIENUTCg2MCwgMCksIENUTCg2MCwgMCksIENUTCg2MCwgMSkgfSB9LAogCi0JCXsgeyBDVEwoNjAsIDEpLCBDVEwoNjAsIDApLCBDVEwoMCwgMCksIENUTCgwLCAwKSB9IH0sCisJCXsgeyBDVEwoNjAsIDEpLCBDVEwoNjAsIDApLCBDVEwoNjAsIDApLCBDVEwoNjAsIDApIH0gfSwKIAkJeyB7IENUTCg2MCwgMCksIENUTCg2MCwgMSksIENUTCg2MCwgMCksIENUTCg2MCwgMCkgfSB9LAogCQl7IHsgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAxKSwgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAwKSB9IH0sCiAKQEAgLTI2MTYsNyArMjYxNyw3IEBACiAJCSB7IHsgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAxKSwgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAwKSB9IH0sCiAJCSB7IHsgQ1RMKDYwLCAxKSwgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAxKSB9IH0sCiAKLQkJIHsgeyBDVEwoNjAsIDEpLCBDVEwoNjAsIDApLCBDVEwoMCwgMCksIENUTCgwLCAwKSB9IH0sCisJCSB7IHsgQ1RMKDYwLCAxKSwgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAwKSB9IH0sCiAJCSB7IHsgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAxKSwgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAwKSB9IH0sCiAJCSB7IHsgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAxKSwgQ1RMKDYwLCAwKSwgQ1RMKDYwLCAwKSB9IH0sCiAKQEAgLTMwMDYsMTEgKzMwMDcsMTEgQEAKIAogCXN3aXRjaCAocGFyYW0pIHsKIAljYXNlIEVFUF9NQUNfTFNXOgotCQlyZXR1cm4gZWVwLT5tYWNBZGRyWzBdIDw8IDggfCBlZXAtPm1hY0FkZHJbMV07CisJCXJldHVybiBnZXRfdW5hbGlnbmVkX2JlMTYoZWVwLT5tYWNBZGRyKTsKIAljYXNlIEVFUF9NQUNfTUlEOgotCQlyZXR1cm4gZWVwLT5tYWNBZGRyWzJdIDw8IDggfCBlZXAtPm1hY0FkZHJbM107CisJCXJldHVybiBnZXRfdW5hbGlnbmVkX2JlMTYoZWVwLT5tYWNBZGRyICsgMik7CiAJY2FzZSBFRVBfTUFDX01TVzoKLQkJcmV0dXJuIGVlcC0+bWFjQWRkcls0XSA8PCA4IHwgZWVwLT5tYWNBZGRyWzVdOworCQlyZXR1cm4gZ2V0X3VuYWxpZ25lZF9iZTE2KGVlcC0+bWFjQWRkciArIDQpOwogCWNhc2UgRUVQX1JFR18wOgogCQlyZXR1cm4gbGUxNl90b19jcHUocEJhc2UtPnJlZ0RtblswXSk7CiAJY2FzZSBFRVBfUkVHXzE6CkBAIC0zMDM4LDcgKzMwMzksNyBAQAogCWNhc2UgRUVQX0NIQUlOX01BU0tfUkVEVUNFOgogCQlyZXR1cm4gKHBCYXNlLT5taXNjQ29uZmlndXJhdGlvbiA+PiAweDMpICYgMHgxOwogCWNhc2UgRUVQX0FOVF9ESVZfQ1RMMToKLQkJcmV0dXJuIGxlMzJfdG9fY3B1KGVlcC0+YmFzZV9leHQxLmFudF9kaXZfY29udHJvbCk7CisJCXJldHVybiBlZXAtPmJhc2VfZXh0MS5hbnRfZGl2X2NvbnRyb2w7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMzMyNCw2ICszMzI1LDggQEAKIAlyZWFkID0gYXI5MzAwX3JlYWRfZWVwcm9tOwogCWlmIChBUl9TUkVWXzk0ODUoYWgpKQogCQljcHRyID0gQVI5MzAwX0JBU0VfQUREUl80SzsKKwllbHNlIGlmIChBUl9TUkVWXzkzMzAoYWgpKQorCQljcHRyID0gQVI5MzAwX0JBU0VfQUREUl81MTI7CiAJZWxzZQogCQljcHRyID0gQVI5MzAwX0JBU0VfQUREUjsKIAlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCkBAIC0zMzc4LDggKzMzODEsNyBAQAogCQlvc2l6ZSA9IGxlbmd0aDsKIAkJcmVhZChhaCwgY3B0ciwgd29yZCwgQ09NUF9IRFJfTEVOICsgb3NpemUgKyBDT01QX0NLU1VNX0xFTik7CiAJCWNoZWNrc3VtID0gYXI5MzAwX2NvbXBfY2tzdW0oJndvcmRbQ09NUF9IRFJfTEVOXSwgbGVuZ3RoKTsKLQkJbWNoZWNrc3VtID0gd29yZFtDT01QX0hEUl9MRU4gKyBvc2l6ZV0gfAotCQkgICAgKHdvcmRbQ09NUF9IRFJfTEVOICsgb3NpemUgKyAxXSA8PCA4KTsKKwkJbWNoZWNrc3VtID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZ3b3JkW0NPTVBfSERSX0xFTiArIG9zaXplXSk7CiAJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKIAkJCSJjaGVja3N1bSAleCAleFxuIiwgY2hlY2tzdW0sIG1jaGVja3N1bSk7CiAJCWlmIChjaGVja3N1bSA9PSBtY2hlY2tzdW0pIHsKQEAgLTM0NDIsNyArMzQ0NCw3IEBACiB7CiAJaW50IGJpYXMgPSBhcjkwMDNfaHdfeHBhX2JpYXNfbGV2ZWxfZ2V0KGFoLCBpczJnaHopOwogCi0JaWYgKEFSX1NSRVZfOTQ4NShhaCkgfHwgQVJfU1JFVl85MzQwKGFoKSkKKwlpZiAoQVJfU1JFVl85NDg1KGFoKSB8fCBBUl9TUkVWXzkzMzAoYWgpIHx8IEFSX1NSRVZfOTM0MChhaCkpCiAJCVJFR19STVdfRklFTEQoYWgsIEFSX0NIMF9UT1AyLCBBUl9DSDBfVE9QMl9YUEFCSUFTTFZMLCBiaWFzKTsKIAllbHNlIHsKIAkJUkVHX1JNV19GSUVMRChhaCwgQVJfQ0gwX1RPUCwgQVJfQ0gwX1RPUF9YUEFCSUFTTFZMLCBiaWFzKTsKQEAgLTM1MjMsNyArMzUyNSw3IEBACiAJCX0KIAl9CiAKLQlpZiAoQVJfU1JFVl85NDg1KGFoKSkgeworCWlmIChBUl9TUkVWXzkzMzAoYWgpIHx8IEFSX1NSRVZfOTQ4NShhaCkpIHsKIAkJdmFsdWUgPSBhdGg5a19od19hcjkzMDBfZ2V0X2VlcHJvbShhaCwgRUVQX0FOVF9ESVZfQ1RMMSk7CiAJCS8qCiAJCSAqIG1haW5fbG5hY29uZiwgYWx0X2xuYWNvbmYsIG1haW5fdGIsIGFsdF90YgpAQCAtMzcxMCw3ICszNzEyLDcgQEAKIAkJYXRoOWtfaHdfYXI5MzAwX2dldF9lZXByb20oYWgsIEVFUF9JTlRFUk5BTF9SRUdVTEFUT1IpOwogCiAJaWYgKGludGVybmFsX3JlZ3VsYXRvcikgewotCQlpZiAoQVJfU1JFVl85NDg1KGFoKSkgeworCQlpZiAoQVJfU1JFVl85MzMwKGFoKSB8fCBBUl9TUkVWXzk0ODUoYWgpKSB7CiAJCQlpbnQgcmVnX3BtdV9zZXQ7CiAKIAkJCXJlZ19wbXVfc2V0ID0gUkVHX1JFQUQoYWgsIEFSX1BIWV9QTVUyKSAmIH5BUl9QSFlfUE1VMl9QR007CkBAIC0zNzE4LDkgKzM3MjAsMjQgQEAKIAkJCWlmICghaXNfcG11X3NldChhaCwgQVJfUEhZX1BNVTIsIHJlZ19wbXVfc2V0KSkKIAkJCQlyZXR1cm47CiAKLQkJCXJlZ19wbXVfc2V0ID0gKDUgPDwgMSkgfCAoNyA8PCA0KSB8ICgxIDw8IDgpIHwKLQkJCQkgICAgICAoMiA8PCAxNCkgfCAoNiA8PCAxNykgfCAoMSA8PCAyMCkgfAotCQkJCSAgICAgICgzIDw8IDI0KSB8ICgxIDw8IDI4KTsKKwkJCWlmIChBUl9TUkVWXzkzMzAoYWgpKSB7CisJCQkJaWYgKGFoLT5pc19jbGtfMjVtaHopIHsKKwkJCQkJcmVnX3BtdV9zZXQgPSAoMyA8PCAxKSB8ICg4IDw8IDQpIHwKKwkJCQkJCSAgICAgICgzIDw8IDgpIHwgKDEgPDwgMTQpIHwKKwkJCQkJCSAgICAgICg2IDw8IDE3KSB8ICgxIDw8IDIwKSB8CisJCQkJCQkgICAgICAoMyA8PCAyNCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVnX3BtdV9zZXQgPSAoNCA8PCAxKSAgfCAoNyA8PCA0KSB8CisJCQkJCQkgICAgICAoMyA8PCA4KSAgfCAoMSA8PCAxNCkgfAorCQkJCQkJICAgICAgKDYgPDwgMTcpIHwgKDEgPDwgMjApIHwKKwkJCQkJCSAgICAgICgzIDw8IDI0KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJlZ19wbXVfc2V0ID0gKDUgPDwgMSkgfCAoNyA8PCA0KSB8CisJCQkJCSAgICAgICgxIDw8IDgpIHwgKDIgPDwgMTQpIHwKKwkJCQkJICAgICAgKDYgPDwgMTcpIHwgKDEgPDwgMjApIHwKKwkJCQkJICAgICAgKDMgPDwgMjQpIHwgKDEgPDwgMjgpOworCQkJfQogCiAJCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9QTVUxLCByZWdfcG11X3NldCk7CiAJCQlpZiAoIWlzX3BtdV9zZXQoYWgsIEFSX1BIWV9QTVUxLCByZWdfcG11X3NldCkpCkBAIC0zNzUxLDcgKzM3NjgsNyBAQAogCQkJCQkgICBBUl9SVENfUkVHX0NPTlRST0wxX1NXUkVHX1BST0dSQU0pOwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKEFSX1NSRVZfOTQ4NShhaCkpIHsKKwkJaWYgKEFSX1NSRVZfOTMzMChhaCkgfHwgQVJfU1JFVl85NDg1KGFoKSkgewogCQkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BNVTIsIEFSX1BIWV9QTVUyX1BHTSwgMCk7CiAJCQl3aGlsZSAoUkVHX1JFQURfRklFTEQoYWgsIEFSX1BIWV9QTVUyLAogCQkJCQkgICAgICBBUl9QSFlfUE1VMl9QR00pKQpAQCAtMzc5NSw5ICszODEyLDkgQEAKIAlhcjkwMDNfaHdfYW50X2N0cmxfYXBwbHkoYWgsIElTX0NIQU5fMkdIWihjaGFuKSk7CiAJYXI5MDAzX2h3X2RyaXZlX3N0cmVuZ3RoX2FwcGx5KGFoKTsKIAlhcjkwMDNfaHdfYXR0ZW5fYXBwbHkoYWgsIGNoYW4pOwotCWlmICghQVJfU1JFVl85MzQwKGFoKSkKKwlpZiAoIUFSX1NSRVZfOTMzMChhaCkgJiYgIUFSX1NSRVZfOTM0MChhaCkpCiAJCWFyOTAwM19od19pbnRlcm5hbF9yZWd1bGF0b3JfYXBwbHkoYWgpOwotCWlmIChBUl9TUkVWXzk0ODUoYWgpIHx8IEFSX1NSRVZfOTM0MChhaCkpCisJaWYgKEFSX1NSRVZfOTQ4NShhaCkgfHwgQVJfU1JFVl85MzMwKGFoKSB8fCBBUl9TUkVWXzkzNDAoYWgpKQogCQlhcjkwMDNfaHdfYXBwbHlfdHVuaW5nX2NhcHMoYWgpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2h3LmMKaW5kZXggMzkyYmYwZi4uOGVmZGVjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfaHcuYwpAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgImFyOTAwM18ycDJfaW5pdHZhbHMuaCIKICNpbmNsdWRlICJhcjk0ODVfaW5pdHZhbHMuaCIKICNpbmNsdWRlICJhcjkzNDBfaW5pdHZhbHMuaCIKKyNpbmNsdWRlICJhcjkzMzBfMXAxX2luaXR2YWxzLmgiCisjaW5jbHVkZSAiYXI5MzMwXzFwMl9pbml0dmFscy5oIgogCiAvKiBHZW5lcmFsIGhhcmR3YXJlIGNvZGUgZm9yIHRoZSBBUjkwMDMgaGFkd2FyZSBmYW1pbHkgKi8KIApAQCAtMjksNyArMzEsMTEzIEBACiAgKi8KIHN0YXRpYyB2b2lkIGFyOTAwM19od19pbml0X21vZGVfcmVncyhzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKLQlpZiAoQVJfU1JFVl85MzQwKGFoKSkgeworCWlmIChBUl9TUkVWXzkzMzBfMTEoYWgpKSB7CisJCS8qIG1hYyAqLworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1hY1tBVEhfSU5JX1BSRV0sIE5VTEwsIDAsIDApOworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1hY1tBVEhfSU5JX0NPUkVdLAorCQkJCWFyOTMzMV8xcDFfbWFjX2NvcmUsCisJCQkJQVJSQVlfU0laRShhcjkzMzFfMXAxX21hY19jb3JlKSwgMik7CisJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTWFjW0FUSF9JTklfUE9TVF0sCisJCQkJYXI5MzMxXzFwMV9tYWNfcG9zdGFtYmxlLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxXzFwMV9tYWNfcG9zdGFtYmxlKSwgNSk7CisKKwkJLyogYmIgKi8KKwkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlCQltBVEhfSU5JX1BSRV0sIE5VTEwsIDAsIDApOworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaUJCW0FUSF9JTklfQ09SRV0sCisJCQkJYXI5MzMxXzFwMV9iYXNlYmFuZF9jb3JlLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxXzFwMV9iYXNlYmFuZF9jb3JlKSwgMik7CisJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pQkJbQVRIX0lOSV9QT1NUXSwKKwkJCQlhcjkzMzFfMXAxX2Jhc2ViYW5kX3Bvc3RhbWJsZSwKKwkJCQlBUlJBWV9TSVpFKGFyOTMzMV8xcDFfYmFzZWJhbmRfcG9zdGFtYmxlKSwgNSk7CisKKwkJLyogcmFkaW8gKi8KKwkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlSYWRpb1tBVEhfSU5JX1BSRV0sIE5VTEwsIDAsIDApOworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVJhZGlvW0FUSF9JTklfQ09SRV0sCisJCQkJYXI5MzMxXzFwMV9yYWRpb19jb3JlLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxXzFwMV9yYWRpb19jb3JlKSwgMik7CisJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pUmFkaW9bQVRIX0lOSV9QT1NUXSwgTlVMTCwgMCwgMCk7CisKKwkJLyogc29jICovCisJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pU09DW0FUSF9JTklfUFJFXSwKKwkJCQlhcjkzMzFfMXAxX3NvY19wcmVhbWJsZSwKKwkJCQlBUlJBWV9TSVpFKGFyOTMzMV8xcDFfc29jX3ByZWFtYmxlKSwgMik7CisJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pU09DW0FUSF9JTklfQ09SRV0sIE5VTEwsIDAsIDApOworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVNPQ1tBVEhfSU5JX1BPU1RdLAorCQkJCWFyOTMzMV8xcDFfc29jX3Bvc3RhbWJsZSwKKwkJCQlBUlJBWV9TSVpFKGFyOTMzMV8xcDFfc29jX3Bvc3RhbWJsZSksIDIpOworCisJCS8qIHJ4L3R4IGdhaW4gKi8KKwkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1J4R2FpbiwKKwkJCQlhcjkzMzFfY29tbW9uX3J4X2dhaW5fMXAxLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxX2NvbW1vbl9yeF9nYWluXzFwMSksIDIpOworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzVHhHYWluLAorCQkJYXI5MzMxX21vZGVzX2xvd2VzdF9vYl9kYl90eF9nYWluXzFwMSwKKwkJCUFSUkFZX1NJWkUoYXI5MzMxX21vZGVzX2xvd2VzdF9vYl9kYl90eF9nYWluXzFwMSksCisJCQk1KTsKKworCQkvKiBhZGRpdGlvbmFsIGNsb2NrIHNldHRpbmdzICovCisJCWlmIChhaC0+aXNfY2xrXzI1bWh6KQorCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc0FkZGl0aW9uYWwsCisJCQkJCWFyOTMzMV8xcDFfeHRhbF8yNU0sCisJCQkJCUFSUkFZX1NJWkUoYXI5MzMxXzFwMV94dGFsXzI1TSksIDIpOworCQllbHNlCisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzQWRkaXRpb25hbCwKKwkJCQkJYXI5MzMxXzFwMV94dGFsXzQwTSwKKwkJCQkJQVJSQVlfU0laRShhcjkzMzFfMXAxX3h0YWxfNDBNKSwgMik7CisJfSBlbHNlIGlmIChBUl9TUkVWXzkzMzBfMTIoYWgpKSB7CisJCS8qIG1hYyAqLworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1hY1tBVEhfSU5JX1BSRV0sIE5VTEwsIDAsIDApOworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1hY1tBVEhfSU5JX0NPUkVdLAorCQkJCWFyOTMzMV8xcDJfbWFjX2NvcmUsCisJCQkJQVJSQVlfU0laRShhcjkzMzFfMXAyX21hY19jb3JlKSwgMik7CisJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTWFjW0FUSF9JTklfUE9TVF0sCisJCQkJYXI5MzMxXzFwMl9tYWNfcG9zdGFtYmxlLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxXzFwMl9tYWNfcG9zdGFtYmxlKSwgNSk7CisKKwkJLyogYmIgKi8KKwkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlCQltBVEhfSU5JX1BSRV0sIE5VTEwsIDAsIDApOworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaUJCW0FUSF9JTklfQ09SRV0sCisJCQkJYXI5MzMxXzFwMl9iYXNlYmFuZF9jb3JlLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxXzFwMl9iYXNlYmFuZF9jb3JlKSwgMik7CisJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pQkJbQVRIX0lOSV9QT1NUXSwKKwkJCQlhcjkzMzFfMXAyX2Jhc2ViYW5kX3Bvc3RhbWJsZSwKKwkJCQlBUlJBWV9TSVpFKGFyOTMzMV8xcDJfYmFzZWJhbmRfcG9zdGFtYmxlKSwgNSk7CisKKwkJLyogcmFkaW8gKi8KKwkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlSYWRpb1tBVEhfSU5JX1BSRV0sIE5VTEwsIDAsIDApOworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVJhZGlvW0FUSF9JTklfQ09SRV0sCisJCQkJYXI5MzMxXzFwMl9yYWRpb19jb3JlLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxXzFwMl9yYWRpb19jb3JlKSwgMik7CisJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pUmFkaW9bQVRIX0lOSV9QT1NUXSwgTlVMTCwgMCwgMCk7CisKKwkJLyogc29jICovCisJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pU09DW0FUSF9JTklfUFJFXSwKKwkJCQlhcjkzMzFfMXAyX3NvY19wcmVhbWJsZSwKKwkJCQlBUlJBWV9TSVpFKGFyOTMzMV8xcDJfc29jX3ByZWFtYmxlKSwgMik7CisJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pU09DW0FUSF9JTklfQ09SRV0sIE5VTEwsIDAsIDApOworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVNPQ1tBVEhfSU5JX1BPU1RdLAorCQkJCWFyOTMzMV8xcDJfc29jX3Bvc3RhbWJsZSwKKwkJCQlBUlJBWV9TSVpFKGFyOTMzMV8xcDJfc29jX3Bvc3RhbWJsZSksIDIpOworCisJCS8qIHJ4L3R4IGdhaW4gKi8KKwkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1J4R2FpbiwKKwkJCQlhcjkzMzFfY29tbW9uX3J4X2dhaW5fMXAyLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxX2NvbW1vbl9yeF9nYWluXzFwMiksIDIpOworCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzVHhHYWluLAorCQkJYXI5MzMxX21vZGVzX2xvd2VzdF9vYl9kYl90eF9nYWluXzFwMiwKKwkJCUFSUkFZX1NJWkUoYXI5MzMxX21vZGVzX2xvd2VzdF9vYl9kYl90eF9nYWluXzFwMiksCisJCQk1KTsKKworCQkvKiBhZGRpdGlvbmFsIGNsb2NrIHNldHRpbmdzICovCisJCWlmIChhaC0+aXNfY2xrXzI1bWh6KQorCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc0FkZGl0aW9uYWwsCisJCQkJCWFyOTMzMV8xcDJfeHRhbF8yNU0sCisJCQkJCUFSUkFZX1NJWkUoYXI5MzMxXzFwMl94dGFsXzI1TSksIDIpOworCQllbHNlCisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzQWRkaXRpb25hbCwKKwkJCQkJYXI5MzMxXzFwMl94dGFsXzQwTSwKKwkJCQkJQVJSQVlfU0laRShhcjkzMzFfMXAyX3h0YWxfNDBNKSwgMik7CisJfSBlbHNlIGlmIChBUl9TUkVWXzkzNDAoYWgpKSB7CiAJCS8qIG1hYyAqLwogCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1hY1tBVEhfSU5JX1BSRV0sIE5VTEwsIDAsIDApOwogCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1hY1tBVEhfSU5JX0NPUkVdLApAQCAtMjIwLDcgKzMyOCwxNyBAQAogCXN3aXRjaCAoYXI5MDAzX2h3X2dldF90eF9nYWluX2lkeChhaCkpIHsKIAljYXNlIDA6CiAJZGVmYXVsdDoKLQkJaWYgKEFSX1NSRVZfOTM0MChhaCkpCisJCWlmIChBUl9TUkVWXzkzMzBfMTIoYWgpKQorCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1R4R2FpbiwKKwkJCQlhcjkzMzFfbW9kZXNfbG93ZXN0X29iX2RiX3R4X2dhaW5fMXAyLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxX21vZGVzX2xvd2VzdF9vYl9kYl90eF9nYWluXzFwMiksCisJCQkJNSk7CisJCWVsc2UgaWYgKEFSX1NSRVZfOTMzMF8xMShhaCkpCisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzVHhHYWluLAorCQkJCWFyOTMzMV9tb2Rlc19sb3dlc3Rfb2JfZGJfdHhfZ2Fpbl8xcDEsCisJCQkJQVJSQVlfU0laRShhcjkzMzFfbW9kZXNfbG93ZXN0X29iX2RiX3R4X2dhaW5fMXAxKSwKKwkJCQk1KTsKKwkJZWxzZSBpZiAoQVJfU1JFVl85MzQwKGFoKSkKIAkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNUeEdhaW4sCiAJCQkJCWFyOTM0ME1vZGVzX2xvd2VzdF9vYl9kYl90eF9nYWluX3RhYmxlXzFwMCwKIAkJCQkgICAgICAgQVJSQVlfU0laRShhcjkzNDBNb2Rlc19sb3dlc3Rfb2JfZGJfdHhfZ2Fpbl90YWJsZV8xcDApLApAQCAtMjM3LDcgKzM1NSwxNyBAQAogCQkJCSAgICAgICA1KTsKIAkJYnJlYWs7CiAJY2FzZSAxOgotCQlpZiAoQVJfU1JFVl85MzQwKGFoKSkKKwkJaWYgKEFSX1NSRVZfOTMzMF8xMihhaCkpCisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzVHhHYWluLAorCQkJCWFyOTMzMV9tb2Rlc19oaWdoX29iX2RiX3R4X2dhaW5fMXAyLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxX21vZGVzX2hpZ2hfb2JfZGJfdHhfZ2Fpbl8xcDIpLAorCQkJCTUpOworCQllbHNlIGlmIChBUl9TUkVWXzkzMzBfMTEoYWgpKQorCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1R4R2FpbiwKKwkJCQlhcjkzMzFfbW9kZXNfaGlnaF9vYl9kYl90eF9nYWluXzFwMSwKKwkJCQlBUlJBWV9TSVpFKGFyOTMzMV9tb2Rlc19oaWdoX29iX2RiX3R4X2dhaW5fMXAxKSwKKwkJCQk1KTsKKwkJZWxzZSBpZiAoQVJfU1JFVl85MzQwKGFoKSkKIAkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNUeEdhaW4sCiAJCQkJCWFyOTM0ME1vZGVzX2xvd2VzdF9vYl9kYl90eF9nYWluX3RhYmxlXzFwMCwKIAkJCQkgICAgICAgQVJSQVlfU0laRShhcjkzNDBNb2Rlc19sb3dlc3Rfb2JfZGJfdHhfZ2Fpbl90YWJsZV8xcDApLApAQCAtMjU0LDcgKzM4MiwxNyBAQAogCQkJCSAgICAgICA1KTsKIAkJYnJlYWs7CiAJY2FzZSAyOgotCQlpZiAoQVJfU1JFVl85MzQwKGFoKSkKKwkJaWYgKEFSX1NSRVZfOTMzMF8xMihhaCkpCisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzVHhHYWluLAorCQkJCWFyOTMzMV9tb2Rlc19sb3dfb2JfZGJfdHhfZ2Fpbl8xcDIsCisJCQkJQVJSQVlfU0laRShhcjkzMzFfbW9kZXNfbG93X29iX2RiX3R4X2dhaW5fMXAyKSwKKwkJCQk1KTsKKwkJZWxzZSBpZiAoQVJfU1JFVl85MzMwXzExKGFoKSkKKwkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNUeEdhaW4sCisJCQkJYXI5MzMxX21vZGVzX2xvd19vYl9kYl90eF9nYWluXzFwMSwKKwkJCQlBUlJBWV9TSVpFKGFyOTMzMV9tb2Rlc19sb3dfb2JfZGJfdHhfZ2Fpbl8xcDEpLAorCQkJCTUpOworCQllbHNlIGlmIChBUl9TUkVWXzkzNDAoYWgpKQogCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1R4R2FpbiwKIAkJCQkJYXI5MzQwTW9kZXNfbG93ZXN0X29iX2RiX3R4X2dhaW5fdGFibGVfMXAwLAogCQkJCSAgICAgICBBUlJBWV9TSVpFKGFyOTM0ME1vZGVzX2xvd2VzdF9vYl9kYl90eF9nYWluX3RhYmxlXzFwMCksCkBAIC0yNzEsNyArNDA5LDE3IEBACiAJCQkJICAgICAgIDUpOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCWlmIChBUl9TUkVWXzkzNDAoYWgpKQorCQlpZiAoQVJfU1JFVl85MzMwXzEyKGFoKSkKKwkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNUeEdhaW4sCisJCQkJYXI5MzMxX21vZGVzX2hpZ2hfcG93ZXJfdHhfZ2Fpbl8xcDIsCisJCQkJQVJSQVlfU0laRShhcjkzMzFfbW9kZXNfaGlnaF9wb3dlcl90eF9nYWluXzFwMiksCisJCQkJNSk7CisJCWVsc2UgaWYgKEFSX1NSRVZfOTMzMF8xMShhaCkpCisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzVHhHYWluLAorCQkJCWFyOTMzMV9tb2Rlc19oaWdoX3Bvd2VyX3R4X2dhaW5fMXAxLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxX21vZGVzX2hpZ2hfcG93ZXJfdHhfZ2Fpbl8xcDEpLAorCQkJCTUpOworCQllbHNlIGlmIChBUl9TUkVWXzkzNDAoYWgpKQogCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1R4R2FpbiwKIAkJCQkJYXI5MzQwTW9kZXNfbG93ZXN0X29iX2RiX3R4X2dhaW5fdGFibGVfMXAwLAogCQkJCSAgICAgICBBUlJBWV9TSVpFKGFyOTM0ME1vZGVzX2xvd2VzdF9vYl9kYl90eF9nYWluX3RhYmxlXzFwMCksCkBAIC0yOTUsNyArNDQzLDE3IEBACiAJc3dpdGNoIChhcjkwMDNfaHdfZ2V0X3J4X2dhaW5faWR4KGFoKSkgewogCWNhc2UgMDoKIAlkZWZhdWx0OgotCQlpZiAoQVJfU1JFVl85MzQwKGFoKSkKKwkJaWYgKEFSX1NSRVZfOTMzMF8xMihhaCkpCisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1vZGVzUnhHYWluLAorCQkJCQlhcjkzMzFfY29tbW9uX3J4X2dhaW5fMXAyLAorCQkJCQlBUlJBWV9TSVpFKGFyOTMzMV9jb21tb25fcnhfZ2Fpbl8xcDIpLAorCQkJCQkyKTsKKwkJZWxzZSBpZiAoQVJfU1JFVl85MzMwXzExKGFoKSkKKwkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNSeEdhaW4sCisJCQkJCWFyOTMzMV9jb21tb25fcnhfZ2Fpbl8xcDEsCisJCQkJCUFSUkFZX1NJWkUoYXI5MzMxX2NvbW1vbl9yeF9nYWluXzFwMSksCisJCQkJCTIpOworCQllbHNlIGlmIChBUl9TUkVWXzkzNDAoYWgpKQogCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc1J4R2FpbiwKIAkJCQkgICAgICAgYXI5MzQwQ29tbW9uX3J4X2dhaW5fdGFibGVfMXAwLAogCQkJCSAgICAgICBBUlJBWV9TSVpFKGFyOTM0MENvbW1vbl9yeF9nYWluX3RhYmxlXzFwMCksCkBAIC0zMTIsNyArNDcwLDE3IEBACiAJCQkJICAgICAgIDIpOwogCQlicmVhazsKIAljYXNlIDE6Ci0JCWlmIChBUl9TUkVWXzkzNDAoYWgpKQorCQlpZiAoQVJfU1JFVl85MzMwXzEyKGFoKSkKKwkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNSeEdhaW4sCisJCQkJYXI5MzMxX2NvbW1vbl93b194bG5hX3J4X2dhaW5fMXAyLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxX2NvbW1vbl93b194bG5hX3J4X2dhaW5fMXAyKSwKKwkJCQkyKTsKKwkJZWxzZSBpZiAoQVJfU1JFVl85MzMwXzExKGFoKSkKKwkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNSeEdhaW4sCisJCQkJYXI5MzMxX2NvbW1vbl93b194bG5hX3J4X2dhaW5fMXAxLAorCQkJCUFSUkFZX1NJWkUoYXI5MzMxX2NvbW1vbl93b194bG5hX3J4X2dhaW5fMXAxKSwKKwkJCQkyKTsKKwkJZWxzZSBpZiAoQVJfU1JFVl85MzQwKGFoKSkKIAkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNSeEdhaW4sCiAJCQkJICAgICAgIGFyOTM0MENvbW1vbl93b194bG5hX3J4X2dhaW5fdGFibGVfMXAwLAogCQkJCSAgICAgICBBUlJBWV9TSVpFKGFyOTM0MENvbW1vbl93b194bG5hX3J4X2dhaW5fdGFibGVfMXAwKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21hYy5jCmluZGV4IDEwZDcxZjcuLjhmZjBiODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tYWMuYwpAQCAtNDMsMTMgKzQzLDYgQEAKIAlhZHMtPmN0bDEwIHw9IGFyOTAwM19jYWxjX3B0cl9jaGtzdW0oYWRzKTsKIH0KIAotc3RhdGljIHZvaWQgYXI5MDAzX2h3X2dldF9kZXNjX2xpbmsodm9pZCAqZHMsIHUzMiAqKmRzX2xpbmspCi17Ci0Jc3RydWN0IGFyOTAwM190eGMgKmFkcyA9IGRzOwotCi0JKmRzX2xpbmsgPSAmYWRzLT5saW5rOwotfQotCiBzdGF0aWMgYm9vbCBhcjkwMDNfaHdfZ2V0X2lzcihzdHJ1Y3QgYXRoX2h3ICphaCwgZW51bSBhdGg5a19pbnQgKm1hc2tlZCkKIHsKIAl1MzIgaXNyID0gMDsKQEAgLTIzNiw2ICsyMjksNyBAQAogc3RhdGljIGludCBhcjkwMDNfaHdfcHJvY190eGRlc2Moc3RydWN0IGF0aF9odyAqYWgsIHZvaWQgKmRzLAogCQkJCSBzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMpCiB7CisJc3RydWN0IGFyOTAwM190eGMgKnR4YyA9IChzdHJ1Y3QgYXI5MDAzX3R4YyAqKSBkczsKIAlzdHJ1Y3QgYXI5MDAzX3R4cyAqYWRzOwogCXUzMiBzdGF0dXM7CiAKQEAgLTI0NSw3ICsyMzksMTEgQEAKIAlpZiAoKHN0YXR1cyAmIEFSX1R4RG9uZSkgPT0gMCkKIAkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKIAotCWFoLT50c190YWlsID0gKGFoLT50c190YWlsICsgMSkgJSBhaC0+dHNfc2l6ZTsKKwl0cy0+cWlkID0gTVMoYWRzLT5kc19pbmZvLCBBUl9UeFFjdU51bSk7CisJaWYgKCF0eGMgfHwgKE1TKHR4Yy0+aW5mbywgQVJfVHhRY3VOdW0pID09IHRzLT5xaWQpKQorCQlhaC0+dHNfdGFpbCA9IChhaC0+dHNfdGFpbCArIDEpICUgYWgtPnRzX3NpemU7CisJZWxzZQorCQlyZXR1cm4gLUVOT0VOVDsKIAogCWlmICgoTVMoYWRzLT5kc19pbmZvLCBBUl9EZXNjSWQpICE9IEFUSEVST1NfVkVORE9SX0lEKSB8fAogCSAgICAoTVMoYWRzLT5kc19pbmZvLCBBUl9UeFJ4RGVzYykgIT0gMSkpIHsKQEAgLTI2MSw3ICsyNTksNiBAQAogCXRzLT50c19zZXFudW0gPSBNUyhzdGF0dXMsIEFSX1NlcU51bSk7CiAJdHMtPnRpZCA9IE1TKHN0YXR1cywgQVJfVHhUaWQpOwogCi0JdHMtPnFpZCA9IE1TKGFkcy0+ZHNfaW5mbywgQVJfVHhRY3VOdW0pOwogCXRzLT5kZXNjX2lkID0gTVMoYWRzLT5zdGF0dXMxLCBBUl9UeERlc2NJZCk7CiAJdHMtPnRzX3RzdGFtcCA9IGFkcy0+c3RhdHVzNDsKIAl0cy0+dHNfc3RhdHVzID0gMDsKQEAgLTQ5OCw3ICs0OTUsNiBAQAogCiAJb3BzLT5yeF9lbmFibGUgPSBhcjkwMDNfaHdfcnhfZW5hYmxlOwogCW9wcy0+c2V0X2Rlc2NfbGluayA9IGFyOTAwM19od19zZXRfZGVzY19saW5rOwotCW9wcy0+Z2V0X2Rlc2NfbGluayA9IGFyOTAwM19od19nZXRfZGVzY19saW5rOwogCW9wcy0+Z2V0X2lzciA9IGFyOTAwM19od19nZXRfaXNyOwogCW9wcy0+ZmlsbF90eGRlc2MgPSBhcjkwMDNfaHdfZmlsbF90eGRlc2M7CiAJb3BzLT5wcm9jX3R4ZGVzYyA9IGFyOTAwM19od19wcm9jX3R4ZGVzYzsKQEAgLTYyOSw4ICs2MjUsNyBAQAogCQkJcnhzLT5yc19zdGF0dXMgfD0gQVRIOUtfUlhFUlJfREVDUllQVDsKIAkJZWxzZSBpZiAocnhzcC0+c3RhdHVzMTEgJiBBUl9NaWNoYWVsRXJyKQogCQkJcnhzLT5yc19zdGF0dXMgfD0gQVRIOUtfUlhFUlJfTUlDOwotCi0JCWlmIChyeHNwLT5zdGF0dXMxMSAmIEFSX0tleU1pc3MpCisJCWVsc2UgaWYgKHJ4c3AtPnN0YXR1czExICYgQVJfS2V5TWlzcykKIAkJCXJ4cy0+cnNfc3RhdHVzIHw9IEFUSDlLX1JYRVJSX0RFQ1JZUFQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BhcHJkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BhcHJkLmMKaW5kZXggZTRkNmE4Ny4uZjgwZDFkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19wYXByZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGFwcmQuYwpAQCAtMjEsNiArMjEsMzYgQEAKIHsKIAlzdHJ1Y3QgYXRoX3JlZ3VsYXRvcnkgKnJlZ3VsYXRvcnkgPSBhdGg5a19od19yZWd1bGF0b3J5KGFoKTsKIAlzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiA9IGFoLT5jdXJjaGFuOworCXN0cnVjdCBhcjkzMDBfZWVwcm9tICplZXAgPSAmYWgtPmVlcHJvbS5hcjkzMDBfZWVwOworCisJLyoKKwkgKiAzIGJpdHMgZm9yIG1vZGFsSGVhZGVyNUcucGFwZFJhdGVNYXNrSHQyMAorCSAqIGlzIHVzZWQgZm9yIHN1Yi1iYW5kIGRpc2FibGluZyBvZiBQQVBSRC4KKwkgKiA1RyBiYW5kIGlzIGRpdmlkZWQgaW50byAzIHN1Yi1iYW5kcyAtLSB1cHBlciwKKwkgKiBtaWRkbGUsIGxvd2VyLgorCSAqIGlmIGJpdCAzMCBvZiBtb2RhbEhlYWRlcjVHLnBhcGRSYXRlTWFza0h0MjAgaXMgc2V0CisJICogLS0gZGlzYWJsZSBQQVBSRCBmb3IgdXBwZXIgYmFuZCA1R0h6CisJICogaWYgYml0IDI5IG9mIG1vZGFsSGVhZGVyNUcucGFwZFJhdGVNYXNrSHQyMCBpcyBzZXQKKwkgKiAtLSBkaXNhYmxlIFBBUFJEIGZvciBtaWRkbGUgYmFuZCA1R0h6CisJICogaWYgYml0IDI4IG9mIG1vZGFsSGVhZGVyNUcucGFwZFJhdGVNYXNrSHQyMCBpcyBzZXQKKwkgKiAtLSBkaXNhYmxlIFBBUFJEIGZvciBsb3dlciBiYW5kIDVHSHoKKwkgKi8KKworCWlmIChJU19DSEFOXzVHSFooY2hhbikpIHsKKwkJaWYgKGNoYW4tPmNoYW5uZWwgPj0gVVBQRVJfNUdfU1VCX0JBTkRfU1RBUlQpIHsKKwkJCWlmIChsZTMyX3RvX2NwdShlZXAtPm1vZGFsSGVhZGVyNUcucGFwZFJhdGVNYXNrSHQyMCkKKwkJCQkJCQkJICAmIEJJVCgzMCkpCisJCQkJdmFsID0gZmFsc2U7CisJCX0gZWxzZSBpZiAoY2hhbi0+Y2hhbm5lbCA+PSBNSURfNUdfU1VCX0JBTkRfU1RBUlQpIHsKKwkJCWlmIChsZTMyX3RvX2NwdShlZXAtPm1vZGFsSGVhZGVyNUcucGFwZFJhdGVNYXNrSHQyMCkKKwkJCQkJCQkJICAmIEJJVCgyOSkpCisJCQkJdmFsID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlpZiAobGUzMl90b19jcHUoZWVwLT5tb2RhbEhlYWRlcjVHLnBhcGRSYXRlTWFza0h0MjApCisJCQkJCQkJCSAgJiBCSVQoMjgpKQorCQkJCXZhbCA9IGZhbHNlOworCQl9CisJfQogCiAJaWYgKHZhbCkgewogCQlhaC0+cGFwcmRfdGFibGVfd3JpdGVfZG9uZSA9IHRydWU7CkBAIC00NiwxMSArNzYsMTAgQEAKIAogc3RhdGljIGludCBhcjkwMDNfZ2V0X3RyYWluaW5nX3Bvd2VyXzJnKHN0cnVjdCBhdGhfaHcgKmFoKQogewotCXN0cnVjdCBhcjkzMDBfZWVwcm9tICplZXAgPSAmYWgtPmVlcHJvbS5hcjkzMDBfZWVwOwotCXN0cnVjdCBhcjkzMDBfbW9kYWxfZWVwX2hlYWRlciAqaGRyID0gJmVlcC0+bW9kYWxIZWFkZXIyRzsKKwlzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiA9IGFoLT5jdXJjaGFuOwogCXVuc2lnbmVkIGludCBwb3dlciwgc2NhbGUsIGRlbHRhOwogCi0Jc2NhbGUgPSBNUyhsZTMyX3RvX2NwdShoZHItPnBhcGRSYXRlTWFza0h0MjApLCBBUjkzMDBfUEFQUkRfU0NBTEVfMSk7CisJc2NhbGUgPSBhcjkwMDNfZ2V0X3BhcHJkX3NjYWxlX2ZhY3RvcihhaCwgY2hhbik7CiAJcG93ZXIgPSBSRUdfUkVBRF9GSUVMRChhaCwgQVJfUEhZX1BPV0VSVFhfUkFURTUsCiAJCQkgICAgICAgQVJfUEhZX1BPV0VSVFhfUkFURTVfUE9XRVJUWEhUMjBfMCk7CiAKQEAgLTY3LDIwICs5NiwxMCBAQAogc3RhdGljIGludCBhcjkwMDNfZ2V0X3RyYWluaW5nX3Bvd2VyXzVnKHN0cnVjdCBhdGhfaHcgKmFoKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwotCXN0cnVjdCBhcjkzMDBfZWVwcm9tICplZXAgPSAmYWgtPmVlcHJvbS5hcjkzMDBfZWVwOwotCXN0cnVjdCBhcjkzMDBfbW9kYWxfZWVwX2hlYWRlciAqaGRyID0gJmVlcC0+bW9kYWxIZWFkZXI1RzsKIAlzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiA9IGFoLT5jdXJjaGFuOwogCXVuc2lnbmVkIGludCBwb3dlciwgc2NhbGUsIGRlbHRhOwogCi0JaWYgKGNoYW4tPmNoYW5uZWwgPj0gNTcwMCkKLQkJc2NhbGUgPSBNUyhsZTMyX3RvX2NwdShoZHItPnBhcGRSYXRlTWFza0h0MjApLAotCQkJICAgQVI5MzAwX1BBUFJEX1NDQUxFXzEpOwotCWVsc2UgaWYgKGNoYW4tPmNoYW5uZWwgPj0gNTQwMCkKLQkJc2NhbGUgPSBNUyhsZTMyX3RvX2NwdShoZHItPnBhcGRSYXRlTWFza0h0NDApLAotCQkJICAgQVI5MzAwX1BBUFJEX1NDQUxFXzIpOwotCWVsc2UKLQkJc2NhbGUgPSBNUyhsZTMyX3RvX2NwdShoZHItPnBhcGRSYXRlTWFza0h0NDApLAotCQkJICAgQVI5MzAwX1BBUFJEX1NDQUxFXzEpOworCXNjYWxlID0gYXI5MDAzX2dldF9wYXByZF9zY2FsZV9mYWN0b3IoYWgsIGNoYW4pOwogCiAJaWYgKElTX0NIQU5fSFQ0MChjaGFuKSkKIAkJcG93ZXIgPSBSRUdfUkVBRF9GSUVMRChhaCwgQVJfUEhZX1BPV0VSVFhfUkFURTgsCkBAIC05NCw3ICsxMTMsMjMgQEAKIAlpZiAoZGVsdGEgPiBzY2FsZSkKIAkJcmV0dXJuIC0xOwogCi0JcG93ZXIgKz0gMiAqIGdldF9zdHJlYW1zKGNvbW1vbi0+dHhfY2hhaW5tYXNrKTsKKwlzd2l0Y2ggKGdldF9zdHJlYW1zKGNvbW1vbi0+dHhfY2hhaW5tYXNrKSkgeworCWNhc2UgMToKKwkJZGVsdGEgPSA2OworCQlicmVhazsKKwljYXNlIDI6CisJCWRlbHRhID0gNDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlkZWx0YSA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRlbHRhID0gMDsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQkiSW52YWxpZCB0eC1jaGFpbm1hc2s6ICV1XG4iLCBjb21tb24tPnR4X2NoYWlubWFzayk7CisJfQorCisJcG93ZXIgKz0gZGVsdGE7CiAJcmV0dXJuIHBvd2VyOwogfQogCkBAIC0xMTksMTUgKzE1NCwxNiBAQAogCWVsc2UKIAkJdHJhaW5pbmdfcG93ZXIgPSBhcjkwMDNfZ2V0X3RyYWluaW5nX3Bvd2VyXzVnKGFoKTsKIAorCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJIlRyYWluaW5nIHBvd2VyOiAlZCwgVGFyZ2V0IHBvd2VyOiAlZFxuIiwKKwkJdHJhaW5pbmdfcG93ZXIsIGFoLT5wYXByZF90YXJnZXRfcG93ZXIpOworCiAJaWYgKHRyYWluaW5nX3Bvd2VyIDwgMCkgewogCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCiAJCQkiUEFQUkQgdGFyZ2V0IHBvd2VyIGRlbHRhIG91dCBvZiByYW5nZSIpOwogCQlyZXR1cm4gLUVSQU5HRTsKIAl9CiAJYWgtPnBhcHJkX3RyYWluaW5nX3Bvd2VyID0gdHJhaW5pbmdfcG93ZXI7Ci0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkiVHJhaW5pbmcgcG93ZXI6ICVkLCBUYXJnZXQgcG93ZXI6ICVkXG4iLAotCQlhaC0+cGFwcmRfdHJhaW5pbmdfcG93ZXIsIGFoLT5wYXByZF90YXJnZXRfcG93ZXIpOwogCiAJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1BBUFJEX0FNMkFNLCBBUl9QSFlfUEFQUkRfQU0yQU1fTUFTSywKIAkJICAgICAgYWgtPnBhcHJkX3JhdGVtYXNrKTsKQEAgLTIzMCw3ICsyNjYsNyBAQAogCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKGFoLT5wYXByZF9nYWluX3RhYmxlX2VudHJpZXMpKTsKIAltZW1zZXQoaW5kZXgsIDAsIHNpemVvZihhaC0+cGFwcmRfZ2Fpbl90YWJsZV9pbmRleCkpOwogCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgUEFQUkRfR0FJTl9UQUJMRV9FTlRSSUVTOyBpKyspIHsKIAkJZW50cnlbaV0gPSBSRUdfUkVBRChhaCwgcmVnKTsKIAkJaW5kZXhbaV0gPSAoZW50cnlbaV0gPj4gMjQpICYgMHhmZjsKIAkJcmVnICs9IDQ7CkBAIC0yNDAsMTMgKzI3NiwxMyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBhcjkwMDNfZ2V0X2Rlc2lyZWRfZ2FpbihzdHJ1Y3QgYXRoX2h3ICphaCwgaW50IGNoYWluLAogCQkJCQkgICAgaW50IHRhcmdldF9wb3dlcikKIHsKLQlpbnQgb2xwY19nYWluX2RlbHRhID0gMDsKKwlpbnQgb2xwY19nYWluX2RlbHRhID0gMCwgY2xfZ2Fpbl9tb2Q7CiAJaW50IGFscGhhX3RoZXJtLCBhbHBoYV92b2x0OwogCWludCB0aGVybV9jYWxfdmFsdWUsIHZvbHRfY2FsX3ZhbHVlOwogCWludCB0aGVybV92YWx1ZSwgdm9sdF92YWx1ZTsKIAlpbnQgdGhlcm1hbF9nYWluX2NvcnIsIHZvbHRhZ2VfZ2Fpbl9jb3JyOwogCWludCBkZXNpcmVkX3NjYWxlLCBkZXNpcmVkX2dhaW4gPSAwOwotCXUzMiByZWc7CisJdTMyIHJlZ19vbHBjICA9IDAsIHJlZ19jbF9nYWluICA9IDA7CiAKIAlSRUdfQ0xSX0JJVChhaCwgQVJfUEhZX1BBUFJEX1RSQUlORVJfU1RBVDEsCiAJCSAgICBBUl9QSFlfUEFQUkRfVFJBSU5FUl9TVEFUMV9QQVBSRF9UUkFJTl9ET05FKTsKQEAgLTI2NSwxNSArMzAxLDI5IEBACiAJdm9sdF92YWx1ZSA9IFJFR19SRUFEX0ZJRUxEKGFoLCBBUl9QSFlfQkJfVEhFUk1fQURDXzQsCiAJCQkJICAgIEFSX1BIWV9CQl9USEVSTV9BRENfNF9MQVRFU1RfVk9MVF9WQUxVRSk7CiAKLQlpZiAoY2hhaW4gPT0gMCkKLQkJcmVnID0gQVJfUEhZX1RQQ18xMV9CMDsKLQllbHNlIGlmIChjaGFpbiA9PSAxKQotCQlyZWcgPSBBUl9QSFlfVFBDXzExX0IxOwotCWVsc2UKLQkJcmVnID0gQVJfUEhZX1RQQ18xMV9CMjsKKwlzd2l0Y2ggKGNoYWluKSB7CisJY2FzZSAwOgorCQlyZWdfb2xwYyA9IEFSX1BIWV9UUENfMTFfQjA7CisJCXJlZ19jbF9nYWluID0gQVJfUEhZX0NMX1RBQl8wOworCQlicmVhazsKKwljYXNlIDE6CisJCXJlZ19vbHBjID0gQVJfUEhZX1RQQ18xMV9CMTsKKwkJcmVnX2NsX2dhaW4gPSBBUl9QSFlfQ0xfVEFCXzE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcmVnX29scGMgPSBBUl9QSFlfVFBDXzExX0IyOworCQlyZWdfY2xfZ2FpbiA9IEFSX1BIWV9DTF9UQUJfMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBBVEhfREJHX0NBTElCUkFURSwKKwkJIkludmFsaWQgY2hhaW5tYXNrOiAlZFxuIiwgY2hhaW4pOworCQlicmVhazsKKwl9CiAKLQlvbHBjX2dhaW5fZGVsdGEgPSBSRUdfUkVBRF9GSUVMRChhaCwgcmVnLAorCW9scGNfZ2Fpbl9kZWx0YSA9IFJFR19SRUFEX0ZJRUxEKGFoLCByZWdfb2xwYywKIAkJCQkJIEFSX1BIWV9UUENfMTFfT0xQQ19HQUlOX0RFTFRBKTsKKwljbF9nYWluX21vZCA9IFJFR19SRUFEX0ZJRUxEKGFoLCByZWdfY2xfZ2FpbiwKKwkJCQkJIEFSX1BIWV9DTF9UQUJfQ0xfR0FJTl9NT0QpOwogCiAJaWYgKG9scGNfZ2Fpbl9kZWx0YSA+PSAxMjgpCiAJCW9scGNfZ2Fpbl9kZWx0YSA9IG9scGNfZ2Fpbl9kZWx0YSAtIDI1NjsKQEAgLTI4Myw3ICszMzMsNyBAQAogCXZvbHRhZ2VfZ2Fpbl9jb3JyID0gKGFscGhhX3ZvbHQgKiAodm9sdF92YWx1ZSAtIHZvbHRfY2FsX3ZhbHVlKSArCiAJCQkgICAgICgxMjggLyAyKSkgLyAxMjg7CiAJZGVzaXJlZF9nYWluID0gdGFyZ2V0X3Bvd2VyIC0gb2xwY19nYWluX2RlbHRhIC0gdGhlcm1hbF9nYWluX2NvcnIgLQotCSAgICB2b2x0YWdlX2dhaW5fY29yciArIGRlc2lyZWRfc2NhbGU7CisJICAgIHZvbHRhZ2VfZ2Fpbl9jb3JyICsgZGVzaXJlZF9zY2FsZSArIGNsX2dhaW5fbW9kOwogCiAJcmV0dXJuIGRlc2lyZWRfZ2FpbjsKIH0KQEAgLTcyMSw3ICs3NzEsNyBAQAogCWRlc2lyZWRfZ2FpbiA9IGFyOTAwM19nZXRfZGVzaXJlZF9nYWluKGFoLCBjaGFpbiwgdHJhaW5fcG93ZXIpOwogCiAJZ2Fpbl9pbmRleCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgUEFQUkRfR0FJTl9UQUJMRV9FTlRSSUVTOyBpKyspIHsKIAkJaWYgKGFoLT5wYXByZF9nYWluX3RhYmxlX2luZGV4W2ldID49IGRlc2lyZWRfZ2FpbikKIAkJCWJyZWFrOwogCQlnYWluX2luZGV4Kys7CkBAIC03OTUsNyArODQ1LDI2IEBACiAKIGJvb2wgYXI5MDAzX3BhcHJkX2lzX2RvbmUoc3RydWN0IGF0aF9odyAqYWgpCiB7Ci0JcmV0dXJuICEhUkVHX1JFQURfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxLAorCWludCBwYXByZF9kb25lLCBhZ2MyX3B3cjsKKwlwYXByZF9kb25lID0gUkVHX1JFQURfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxLAogCQkJCUFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxX1BBUFJEX1RSQUlOX0RPTkUpOworCisJaWYgKHBhcHJkX2RvbmUgPT0gMHgxKSB7CisJCWFnYzJfcHdyID0gUkVHX1JFQURfRklFTEQoYWgsIEFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxLAorCQkJCUFSX1BIWV9QQVBSRF9UUkFJTkVSX1NUQVQxX1BBUFJEX0FHQzJfUFdSKTsKKworCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQkJIkFHQzJfUFdSID0gMHgleCB0cmFpbmluZyBkb25lID0gMHgleFxuIiwKKwkJCWFnYzJfcHdyLCBwYXByZF9kb25lKTsKKwkvKgorCSAqIGFnYzJfcHdyIHJhbmdlIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuICdJREVBTF9BR0MyX1BXUl9DSEFOR0UnCisJICogd2hlbiB0aGUgdHJhaW5pbmcgaXMgY29tcGxldGVseSBkb25lLCBvdGhlcndpc2UgcmV0cmFpbmluZyBpcworCSAqIGRvbmUgdG8gbWFrZSBzdXJlIHRoZSB2YWx1ZSBpcyBpbiBpZGVhbCByYW5nZQorCSAqLworCQlpZiAoYWdjMl9wd3IgPD0gUEFQUkRfSURFQUxfQUdDMl9QV1JfUkFOR0UpCisJCQlwYXByZF9kb25lID0gMDsKKwl9CisKKwlyZXR1cm4gISFwYXByZF9kb25lOwogfQogRVhQT1JUX1NZTUJPTChhcjkwMDNfcGFwcmRfaXNfZG9uZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuYwppbmRleCA4OTJjNDhiLi4xYmFjYThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmMKQEAgLTc1LDcgKzc1LDE5IEBACiAJZnJlcSA9IGNlbnRlcnMuc3ludGhfY2VudGVyOwogCiAJaWYgKGZyZXEgPCA0ODAwKSB7ICAgICAvKiAyIEdIeiwgZnJhY3Rpb25hbCBtb2RlICovCi0JCWlmIChBUl9TUkVWXzk0ODUoYWgpKSB7CisJCWlmIChBUl9TUkVWXzkzMzAoYWgpKSB7CisJCQl1MzIgY2hhbl9mcmFjOworCQkJdTMyIGRpdjsKKworCQkJaWYgKGFoLT5pc19jbGtfMjVtaHopCisJCQkJZGl2ID0gNzU7CisJCQllbHNlCisJCQkJZGl2ID0gMTIwOworCisJCQljaGFubmVsU2VsID0gKGZyZXEgKiA0KSAvIGRpdjsKKwkJCWNoYW5fZnJhYyA9ICgoKGZyZXEgKiA0KSAlIGRpdikgKiAweDIwMDAwKSAvIGRpdjsKKwkJCWNoYW5uZWxTZWwgPSAoY2hhbm5lbFNlbCA8PCAxNykgfCBjaGFuX2ZyYWM7CisJCX0gZWxzZSBpZiAoQVJfU1JFVl85NDg1KGFoKSkgewogCQkJdTMyIGNoYW5fZnJhYzsKIAogCQkJLyoKQEAgLTEwNCw3ICsxMTYsNyBAQAogCQkJdTMyIGNoYW5fZnJhYzsKIAogCQkJY2hhbm5lbFNlbCA9IChmcmVxICogMikgLyA3NTsKLQkJCWNoYW5fZnJhYyA9ICgoZnJlcSAlIDc1KSAqIDB4MjAwMDApIC8gNzU7CisJCQljaGFuX2ZyYWMgPSAoKChmcmVxICogMikgJSA3NSkgKiAweDIwMDAwKSAvIDc1OwogCQkJY2hhbm5lbFNlbCA9IChjaGFubmVsU2VsIDw8IDE3KSB8IGNoYW5fZnJhYzsKIAkJfSBlbHNlIHsKIAkJCWNoYW5uZWxTZWwgPSBDSEFOU0VMXzVHKGZyZXEpOwpAQCAtMTY4LDcgKzE4MCw3IEBACiAJICogaXMgb3V0LW9mLWJhbmQgYW5kIGNhbiBiZSBpZ25vcmVkLgogCSAqLwogCi0JaWYgKEFSX1NSRVZfOTQ4NShhaCkgfHwgQVJfU1JFVl85MzQwKGFoKSkgeworCWlmIChBUl9TUkVWXzk0ODUoYWgpIHx8IEFSX1NSRVZfOTM0MChhaCkgfHwgQVJfU1JFVl85MzMwKGFoKSkgewogCQlzcHVyX2ZiaW5fcHRyID0gYXI5MDAzX2dldF9zcHVyX2NoYW5fcHRyKGFoLAogCQkJCQkJCSBJU19DSEFOXzJHSFooY2hhbikpOwogCQlpZiAoc3B1cl9mYmluX3B0clswXSA9PSAwKSAvKiBObyBzcHVyICovCkBAIC0xOTMsNyArMjA1LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBtYXhfc3B1cl9jbnRzOyBpKyspIHsKIAkJbmVnYXRpdmUgPSAwOwotCQlpZiAoQVJfU1JFVl85NDg1KGFoKSB8fCBBUl9TUkVWXzkzNDAoYWgpKQorCQlpZiAoQVJfU1JFVl85NDg1KGFoKSB8fCBBUl9TUkVWXzkzNDAoYWgpIHx8IEFSX1NSRVZfOTMzMChhaCkpCiAJCQljdXJfYmJfc3B1ciA9IEZCSU4yRlJFUShzcHVyX2ZiaW5fcHRyW2ldLAogCQkJCQlJU19DSEFOXzJHSFooY2hhbikpIC0gc3ludGhfZnJlcTsKIAkJZWxzZQpAQCAtNjU5LDYgKzY3MSw5IEBACiAJCVJFR19XUklURV9BUlJBWSgmYWgtPmluaU1vZGVzQWRkaXRpb25hbCwKIAkJCQltb2Rlc0luZGV4LCByZWdXcml0ZXMpOwogCisJaWYgKEFSX1NSRVZfOTMwMChhaCkpCisJCVJFR19XUklURV9BUlJBWSgmYWgtPmluaU1vZGVzQWRkaXRpb25hbCwgMSwgcmVnV3JpdGVzKTsKKwogCWlmIChBUl9TUkVWXzkzNDAoYWgpICYmICFhaC0+aXNfY2xrXzI1bWh6KQogCQlSRUdfV1JJVEVfQVJSQVkoJmFoLT5pbmlNb2Rlc0FkZGl0aW9uYWxfNDBNLCAxLCByZWdXcml0ZXMpOwogCkBAIC0xMDc0LDcgKzEwODksMTAgQEAKIHsKIAlhaC0+bmZfMmcubWF4ID0gQVJfUEhZX0NDQV9NQVhfR09PRF9WQUxfOTMwMF8yR0haOwogCWFoLT5uZl8yZy5taW4gPSBBUl9QSFlfQ0NBX01JTl9HT09EX1ZBTF85MzAwXzJHSFo7Ci0JYWgtPm5mXzJnLm5vbWluYWwgPSBBUl9QSFlfQ0NBX05PTV9WQUxfOTMwMF8yR0haOworCWlmIChBUl9TUkVWXzkzMzAoYWgpKQorCQlhaC0+bmZfMmcubm9taW5hbCA9IEFSX1BIWV9DQ0FfTk9NX1ZBTF85MzMwXzJHSFo7CisJZWxzZQorCQlhaC0+bmZfMmcubm9taW5hbCA9IEFSX1BIWV9DQ0FfTk9NX1ZBTF85MzAwXzJHSFo7CiAJYWgtPm5mXzVnLm1heCA9IEFSX1BIWV9DQ0FfTUFYX0dPT0RfVkFMXzkzMDBfNUdIWjsKIAlhaC0+bmZfNWcubWluID0gQVJfUEhZX0NDQV9NSU5fR09PRF9WQUxfOTMwMF81R0haOwogCWFoLT5uZl81Zy5ub21pbmFsID0gQVJfUEhZX0NDQV9OT01fVkFMXzkzMDBfNUdIWjsKQEAgLTExOTYsOCArMTIxNCwxNyBAQAogCQkJCSBBUl9QSFlfOTQ4NV9BTlRfRElWX0FMVF9MTkFDT05GX1M7CiAJYW50Y29uZi0+ZmFzdF9kaXZfYmlhcyA9IChyZWd2YWwgJiBBUl9QSFlfOTQ4NV9BTlRfRkFTVF9ESVZfQklBUykgPj4KIAkJCQkgIEFSX1BIWV85NDg1X0FOVF9GQVNUX0RJVl9CSUFTX1M7Ci0JYW50Y29uZi0+bG5hMV9sbmEyX2RlbHRhID0gLTk7Ci0JYW50Y29uZi0+ZGl2X2dyb3VwID0gMjsKKworCWlmIChBUl9TUkVWXzkzMzBfMTEoYWgpKSB7CisJCWFudGNvbmYtPmxuYTFfbG5hMl9kZWx0YSA9IC05OworCQlhbnRjb25mLT5kaXZfZ3JvdXAgPSAxOworCX0gZWxzZSBpZiAoQVJfU1JFVl85NDg1KGFoKSkgeworCQlhbnRjb25mLT5sbmExX2xuYTJfZGVsdGEgPSAtOTsKKwkJYW50Y29uZi0+ZGl2X2dyb3VwID0gMjsKKwl9IGVsc2UgeworCQlhbnRjb25mLT5sbmExX2xuYTJfZGVsdGEgPSAtMzsKKwkJYW50Y29uZi0+ZGl2X2dyb3VwID0gMDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGFyOTAwM19od19hbnRkaXZfY29tYl9jb25mX3NldChzdHJ1Y3QgYXRoX2h3ICphaCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5oCmluZGV4IDQ0MzA5MGQuLjZkZTNmMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuaApAQCAtMzMyLDYgKzMzMiw4IEBACiAjZGVmaW5lIEFSX1BIWV9DQ0FfTUFYX0dPT0RfVkFMXzkzMDBfMkdIWiAgICAgLTk1CiAjZGVmaW5lIEFSX1BIWV9DQ0FfTUFYX0dPT0RfVkFMXzkzMDBfNUdIWiAgICAgLTEwMAogCisjZGVmaW5lIEFSX1BIWV9DQ0FfTk9NX1ZBTF85MzMwXzJHSFogICAgICAgICAgLTExOAorCiAvKgogICogQUdDIEZpZWxkIERlZmluaXRpb25zCiAgKi8KQEAgLTYyMywxMSArNjI1LDExIEBACiAjZGVmaW5lIEFSX1BIWV82NU5NX0NIMl9SWFRYMSAgICAgICAweDE2OTAwCiAjZGVmaW5lIEFSX1BIWV82NU5NX0NIMl9SWFRYMiAgICAgICAweDE2OTA0CiAKLSNkZWZpbmUgQVJfQ0gwX1RPUDIgKEFSX1NSRVZfOTQ4NShhaCkgPyAweDAwMDE2Mjg0IDogMHgwMDAxNjI4YykKKyNkZWZpbmUgQVJfQ0gwX1RPUDIJCShBUl9TUkVWXzkzMDAoYWgpID8gMHgxNjI4YyA6IDB4MTYyODQpCiAjZGVmaW5lIEFSX0NIMF9UT1AyX1hQQUJJQVNMVkwJCTB4ZjAwMAogI2RlZmluZSBBUl9DSDBfVE9QMl9YUEFCSUFTTFZMX1MJMTIKIAotI2RlZmluZSBBUl9DSDBfWFRBTAkJKEFSX1NSRVZfOTQ4NShhaCkgPyAweDE2MjkwIDogMHgxNjI5NCkKKyNkZWZpbmUgQVJfQ0gwX1hUQUwJCShBUl9TUkVWXzkzMDAoYWgpID8gMHgxNjI5NCA6IDB4MTYyOTApCiAjZGVmaW5lIEFSX0NIMF9YVEFMX0NBUElOREFDCTB4N2YwMDAwMDAKICNkZWZpbmUgQVJfQ0gwX1hUQUxfQ0FQSU5EQUNfUwkyNAogI2RlZmluZSBBUl9DSDBfWFRBTF9DQVBPVVREQUMJMHgwMGZlMDAwMApAQCAtMTExOSw2ICsxMTIxLDkgQEAKICNkZWZpbmUgQVJfUEhZX1BPV0VSVFhfUkFURThfUE9XRVJUWEhUNDBfNQkweDNGMDAKICNkZWZpbmUgQVJfUEhZX1BPV0VSVFhfUkFURThfUE9XRVJUWEhUNDBfNV9TCTgKIAorI2RlZmluZSBBUl9QSFlfQ0xfVEFCX0NMX0dBSU5fTU9ECQkweDFmCisjZGVmaW5lIEFSX1BIWV9DTF9UQUJfQ0xfR0FJTl9NT0RfUwkJMAorCiB2b2lkIGFyOTAwM19od19zZXRfY2hhaW5fbWFza3Moc3RydWN0IGF0aF9odyAqYWgsIHU4IHJ4LCB1OCB0eCk7CiAKICNlbmRpZiAgLyogQVI5MDAzX1BIWV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MzMwXzFwMV9pbml0dmFscy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTMzMF8xcDFfaW5pdHZhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTFkOWIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTMzMF8xcDFfaW5pdHZhbHMuaApAQCAtMCwwICsxLDExNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBJTklUVkFMU185MzMwXzFQMV9ICisjZGVmaW5lIElOSVRWQUxTXzkzMzBfMVAxX0gKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMzFfMXAxX2Jhc2ViYW5kX3Bvc3RhbWJsZVtdWzVdID0geworCS8qICBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgKi8KKwl7MHgwMDAwOTgxMCwgMHhkMDBhODAwNSwgMHhkMDBhODAwNSwgMHhkMDBhODAwNSwgMHhkMDBhODAwNX0sCisJezB4MDAwMDk4MjAsIDB4MjA2YTAwMmUsIDB4MjA2YTAwMmUsIDB4MjA2YTAwMmUsIDB4MjA2YTAwMmV9LAorCXsweDAwMDA5ODI0LCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwfSwKKwl7MHgwMDAwOTgyOCwgMHgwNjkwMzA4MSwgMHgwNjkwMzA4MSwgMHgwNjkwMzg4MSwgMHgwNjkwMzg4MX0sCisJezB4MDAwMDk4MmMsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDR9LAorCXsweDAwMDA5ODMwLCAweDAwMDAwNTljLCAweDAwMDAwNTljLCAweDAwMDAwNTljLCAweDAwMDAwNTljfSwKKwl7MHgwMDAwOWMwMCwgMHgwMDAwMDA0NCwgMHgwMDAwMDA0NCwgMHgwMDAwMDA0NCwgMHgwMDAwMDA0NH0sCisJezB4MDAwMDllMDAsIDB4MDM3MjE2MWUsIDB4MDM3MjE2MWUsIDB4MDM3MjE2YTQsIDB4MDM3MjE2YTR9LAorCXsweDAwMDA5ZTA0LCAweDAwMTgyMDIwLCAweDAwMTgyMDIwLCAweDAwMTgyMDIwLCAweDAwMTgyMDIwfSwKKwl7MHgwMDAwOWUwYywgMHg2YzQwMDBlMiwgMHg2ZDQwMDBlMiwgMHg2ZDQwMDBlMiwgMHg2YzQwMDBlMn0sCisJezB4MDAwMDllMTAsIDB4N2VjODBkMmUsIDB4N2VjODBkMmUsIDB4N2VjODBkMmUsIDB4N2VjODBkMmV9LAorCXsweDAwMDA5ZTE0LCAweDMxMzk1ZDVlLCAweDMxMzk2MDVlLCAweDMxMzk2MDVlLCAweDMxMzk1ZDVlfSwKKwl7MHgwMDAwOWUxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDllMWMsIDB4MDAwMWNmOWMsIDB4MDAwMWNmOWMsIDB4MDAwMjFmOWMsIDB4MDAwMjFmOWN9LAorCXsweDAwMDA5ZTIwLCAweDAwMDAwM2I1LCAweDAwMDAwM2I1LCAweDAwMDAwM2NlLCAweDAwMDAwM2NlfSwKKwl7MHgwMDAwOWUyYywgMHgwMDAwMDAxYywgMHgwMDAwMDAxYywgMHgwMDAwMzIyMSwgMHgwMDAwMzIyMX0sCisJezB4MDAwMDllM2MsIDB4Y2Y5NDYyMjIsIDB4Y2Y5NDYyMjIsIDB4Y2Y5NDYyMjIsIDB4Y2Y5NDYyMjJ9LAorCXsweDAwMDA5ZTQ0LCAweDAyMzIxZTI3LCAweDAyMzIxZTI3LCAweDAyMjgyMzI0LCAweDAyMjgyMzI0fSwKKwl7MHgwMDAwOWU0OCwgMHg1MDMwMjAxYSwgMHg1MDMwMjAxYSwgMHg1MDMwMjAxMCwgMHg1MDMwMjAxMH0sCisJezB4MDAwMDlmYzgsIDB4MDAwM2YwMDAsIDB4MDAwM2YwMDAsIDB4MDAwMWEwMDAsIDB4MDAwMWEwMDB9LAorCXsweDAwMDBhMjA0LCAweDAwMDAzZmMwLCAweDAwMDAzZmM0LCAweDAwMDAzZmM0LCAweDAwMDAzZmMwfSwKKwl7MHgwMDAwYTIwOCwgMHgwMDAwMDEwNCwgMHgwMDAwMDEwNCwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwNH0sCisJezB4MDAwMGEyMzAsIDB4MDAwMDAwMGEsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMGJ9LAorCXsweDAwMDBhMjM0LCAweDAwMDAwZmZmLCAweDAwMDAwZmZmLCAweDEwMDAwZmZmLCAweDAwMDAwZmZmfSwKKwl7MHgwMDAwYTIzOCwgMHhmZmI4MTAxOCwgMHhmZmI4MTAxOCwgMHhmZmI4MTAxOCwgMHhmZmI4MTAxOH0sCisJezB4MDAwMGEyNTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAyMTAsIDB4MDAwMDAxMDh9LAorCXsweDAwMDBhMjU0LCAweDAwMDAwN2QwLCAweDAwMDAwZmEwLCAweDAwMDAxMTMwLCAweDAwMDAwODk4fSwKKwl7MHgwMDAwYTI1OCwgMHgwMjAyMDAwMiwgMHgwMjAyMDAwMiwgMHgwMjAyMDAwMiwgMHgwMjAyMDAwMn0sCisJezB4MDAwMGEyNWMsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGUsIDB4MDEwMDBlMGV9LAorCXsweDAwMDBhMjYwLCAweDNhMDIxNTAxLCAweDNhMDIxNTAxLCAweDNhMDIxNTAxLCAweDNhMDIxNTAxfSwKKwl7MHgwMDAwYTI2NCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZX0sCisJezB4MDAwMGEyODAsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGJ9LAorCXsweDAwMDBhMjg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI4OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyOGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMmM0LCAweDAwMTU4ZDE4LCAweDAwMTU4ZDE4LCAweDAwMTU4ZDE4LCAweDAwMTU4ZDE4fSwKKwl7MHgwMDAwYTJkMCwgMHgwMDA3MTk4MSwgMHgwMDA3MTk4MSwgMHgwMDA3MTk4MSwgMHgwMDA3MTk4MX0sCisJezB4MDAwMGEyZDgsIDB4Zjk5OWE4M2EsIDB4Zjk5OWE4M2EsIDB4Zjk5OWE4M2EsIDB4Zjk5OWE4M2F9LAorCXsweDAwMDBhMzU4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYWUwNCwgMHgwMDgwMjAyMCwgMHgwMDgwMjAyMCwgMHgwMDgwMjAyMCwgMHgwMDgwMjAyMH0sCisJezB4MDAwMGFlMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMzFfbW9kZXNfbG93ZXN0X29iX2RiX3R4X2dhaW5fMXAxW11bNV0gPSB7CisJLyogICBBZGRyICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAqLworCXsweDAwMDBhMmQ4LCAweDc5OTlhODNhLCAweDc5OTlhODNhLCAweDc5OTlhODNhLCAweDc5OTlhODNhfSwKKwl7MHgwMDAwYTJkYywgMHhmZmZmMmE1MiwgMHhmZmZmMmE1MiwgMHhmZmZmMmE1MiwgMHhmZmZmMmE1Mn0sCisJezB4MDAwMGEyZTAsIDB4ZmZmZmNjODQsIDB4ZmZmZmNjODQsIDB4ZmZmZmNjODQsIDB4ZmZmZmNjODR9LAorCXsweDAwMDBhMmU0LCAweGZmZmZmMDAwLCAweGZmZmZmMDAwLCAweGZmZmZmMDAwLCAweGZmZmZmMDAwfSwKKwl7MHgwMDAwYTJlOCwgMHhmZmZlMDAwMCwgMHhmZmZlMDAwMCwgMHhmZmZlMDAwMCwgMHhmZmZlMDAwMH0sCisJezB4MDAwMGE0MTAsIDB4MDAwMDUwZDcsIDB4MDAwMDUwZDcsIDB4MDAwMDUwZDAsIDB4MDAwMDUwZDB9LAorCXsweDAwMDBhNTAwLCAweDAwMDIyMjAwLCAweDAwMDIyMjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTUwNCwgMHgwNTA2MjAwMiwgMHgwNTA2MjAwMiwgMHgwNDAwMDAwMiwgMHgwNDAwMDAwMn0sCisJezB4MDAwMGE1MDgsIDB4MGMwMDJlMDAsIDB4MGMwMDJlMDAsIDB4MDgwMDAwMDQsIDB4MDgwMDAwMDR9LAorCXsweDAwMDBhNTBjLCAweDExMDYyMjAyLCAweDExMDYyMjAyLCAweDBkMDAwMjAwLCAweDBkMDAwMjAwfSwKKwl7MHgwMDAwYTUxMCwgMHgxNzAyMmUwMCwgMHgxNzAyMmUwMCwgMHgxMTAwMDIwMiwgMHgxMTAwMDIwMn0sCisJezB4MDAwMGE1MTQsIDB4MWQwMDBlYzIsIDB4MWQwMDBlYzIsIDB4MTUwMDA0MDAsIDB4MTUwMDA0MDB9LAorCXsweDAwMDBhNTE4LCAweDI1MDIwZWMwLCAweDI1MDIwZWMwLCAweDE5MDAwNDAyLCAweDE5MDAwNDAyfSwKKwl7MHgwMDAwYTUxYywgMHgyYjAyMGVjMywgMHgyYjAyMGVjMywgMHgxZDAwMDQwNCwgMHgxZDAwMDQwNH0sCisJezB4MDAwMGE1MjAsIDB4MmYwMDFmMDQsIDB4MmYwMDFmMDQsIDB4MjMwMDBhMDAsIDB4MjMwMDBhMDB9LAorCXsweDAwMDBhNTI0LCAweDM1MDAxZmM0LCAweDM1MDAxZmM0LCAweDI3MDAwYTAyLCAweDI3MDAwYTAyfSwKKwl7MHgwMDAwYTUyOCwgMHgzYzAyMmYwNCwgMHgzYzAyMmYwNCwgMHgyYjAwMGEwNCwgMHgyYjAwMGEwNH0sCisJezB4MDAwMGE1MmMsIDB4NDEwMjNlODUsIDB4NDEwMjNlODUsIDB4MmQwMDBhMjAsIDB4MmQwMDBhMjB9LAorCXsweDAwMDBhNTMwLCAweDQ4MDIzZWM2LCAweDQ4MDIzZWM2LCAweDMxMDAwYTIyLCAweDMxMDAwYTIyfSwKKwl7MHgwMDAwYTUzNCwgMHg0ZDAyM2YwMSwgMHg0ZDAyM2YwMSwgMHgzNTAwMGEyNCwgMHgzNTAwMGEyNH0sCisJezB4MDAwMGE1MzgsIDB4NTMwMjNmNGIsIDB4NTMwMjNmNGIsIDB4MzgwMDBhNDMsIDB4MzgwMDBhNDN9LAorCXsweDAwMDBhNTNjLCAweDVhMDI3ZjA5LCAweDVhMDI3ZjA5LCAweDNiMDAwZTQyLCAweDNiMDAwZTQyfSwKKwl7MHgwMDAwYTU0MCwgMHg1ZjAyN2ZjOSwgMHg1ZjAyN2ZjOSwgMHgzZjAwMGU0NCwgMHgzZjAwMGU0NH0sCisJezB4MDAwMGE1NDQsIDB4NjUwMmZlY2EsIDB4NjUwMmZlY2EsIDB4NDIwMDBlNjQsIDB4NDIwMDBlNjR9LAorCXsweDAwMDBhNTQ4LCAweDZiMDJmZjRhLCAweDZiMDJmZjRhLCAweDQ2MDAwZTY2LCAweDQ2MDAwZTY2fSwKKwl7MHgwMDAwYTU0YywgMHg3MjAzZmVjYSwgMHg3MjAzZmVjYSwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1NTAsIDB4NzcwM2ZmMGIsIDB4NzcwM2ZmMGIsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTU0LCAweDdkMDZmZmNiLCAweDdkMDZmZmNiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU1OCwgMHg4NDA3ZmYwYiwgMHg4NDA3ZmYwYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1NWMsIDB4ODkwN2ZmY2IsIDB4ODkwN2ZmY2IsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTYwLCAweDkwMGZmZjBiLCAweDkwMGZmZjBiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU2NCwgMHg5NjBmZmZjYiwgMHg5NjBmZmZjYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1NjgsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTZjLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU3MCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1NzQsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTc4LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU3YywgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1ODAsIDB4MDAwMjIyMDAsIDB4MDAwMjIyMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNTg0LCAweDA1MDYyMDAyLCAweDA1MDYyMDAyLCAweDA0MDAwMDAyLCAweDA0MDAwMDAyfSwKKwl7MHgwMDAwYTU4OCwgMHgwYzAwMmUwMCwgMHgwYzAwMmUwMCwgMHgwODAwMDAwNCwgMHgwODAwMDAwNH0sCisJezB4MDAwMGE1OGMsIDB4MTEwNjIyMDIsIDB4MTEwNjIyMDIsIDB4MGIwMDAyMDAsIDB4MGIwMDAyMDB9LAorCXsweDAwMDBhNTkwLCAweDE3MDIyZTAwLCAweDE3MDIyZTAwLCAweDBmMDAwMjAyLCAweDBmMDAwMjAyfSwKKwl7MHgwMDAwYTU5NCwgMHgxZDAwMGVjMiwgMHgxZDAwMGVjMiwgMHgxMTAwMDQwMCwgMHgxMTAwMDQwMH0sCisJezB4MDAwMGE1OTgsIDB4MjUwMjBlYzAsIDB4MjUwMjBlYzAsIDB4MTUwMDA0MDIsIDB4MTUwMDA0MDJ9LAorCXsweDAwMDBhNTljLCAweDJiMDIwZWMzLCAweDJiMDIwZWMzLCAweDE5MDAwNDA0LCAweDE5MDAwNDA0fSwKKwl7MHgwMDAwYTVhMCwgMHgyZjAwMWYwNCwgMHgyZjAwMWYwNCwgMHgxYjAwMDYwMywgMHgxYjAwMDYwM30sCisJezB4MDAwMGE1YTQsIDB4MzUwMDFmYzQsIDB4MzUwMDFmYzQsIDB4MWYwMDBhMDIsIDB4MWYwMDBhMDJ9LAorCXsweDAwMDBhNWE4LCAweDNjMDIyZjA0LCAweDNjMDIyZjA0LCAweDIzMDAwYTA0LCAweDIzMDAwYTA0fSwKKwl7MHgwMDAwYTVhYywgMHg0MTAyM2U4NSwgMHg0MTAyM2U4NSwgMHgyNjAwMGEyMCwgMHgyNjAwMGEyMH0sCisJezB4MDAwMGE1YjAsIDB4NDgwMjNlYzYsIDB4NDgwMjNlYzYsIDB4MmEwMDBlMjAsIDB4MmEwMDBlMjB9LAorCXsweDAwMDBhNWI0LCAweDRkMDIzZjAxLCAweDRkMDIzZjAxLCAweDJlMDAwZTIyLCAweDJlMDAwZTIyfSwKKwl7MHgwMDAwYTViOCwgMHg1MzAyM2Y0YiwgMHg1MzAyM2Y0YiwgMHgzMTAwMGUyNCwgMHgzMTAwMGUyNH0sCisJezB4MDAwMGE1YmMsIDB4NWEwMjdmMDksIDB4NWEwMjdmMDksIDB4MzQwMDE2NDAsIDB4MzQwMDE2NDB9LAorCXsweDAwMDBhNWMwLCAweDVmMDI3ZmM5LCAweDVmMDI3ZmM5LCAweDM4MDAxNjYwLCAweDM4MDAxNjYwfSwKKwl7MHgwMDAwYTVjNCwgMHg2NTAyZmVjYSwgMHg2NTAyZmVjYSwgMHgzYjAwMTg2MSwgMHgzYjAwMTg2MX0sCisJezB4MDAwMGE1YzgsIDB4NmIwMmZmNGEsIDB4NmIwMmZmNGEsIDB4M2UwMDFhODEsIDB4M2UwMDFhODF9LAorCXsweDAwMDBhNWNjLCAweDcyMDNmZWNhLCAweDcyMDNmZWNhLCAweDQyMDAxYTgzLCAweDQyMDAxYTgzfSwKKwl7MHgwMDAwYTVkMCwgMHg3NzAzZmYwYiwgMHg3NzAzZmYwYiwgMHg0NDAwMWM4NCwgMHg0NDAwMWM4NH0sCisJezB4MDAwMGE1ZDQsIDB4N2QwNmZmY2IsIDB4N2QwNmZmY2IsIDB4NDgwMDFjZTMsIDB4NDgwMDFjZTN9LAorCXsweDAwMDBhNWQ4LCAweDg0MDdmZjBiLCAweDg0MDdmZjBiLCAweDRjMDAxY2U1LCAweDRjMDAxY2U1fSwKKwl7MHgwMDAwYTVkYywgMHg4OTA3ZmZjYiwgMHg4OTA3ZmZjYiwgMHg1MDAwMWNlOSwgMHg1MDAwMWNlOX0sCisJezB4MDAwMGE1ZTAsIDB4OTAwZmZmMGIsIDB4OTAwZmZmMGIsIDB4NTQwMDFjZWIsIDB4NTQwMDFjZWJ9LAorCXsweDAwMDBhNWU0LCAweDk2MGZmZmNiLCAweDk2MGZmZmNiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVlOCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZWMsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWYwLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVmNCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZjgsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWZjLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTYwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjE0LCAweDAxNDA0MDAwLCAweDAxNDA0MDAwLCAweDAxNDA0MDAwLCAweDAxNDA0MDAwfSwKKwl7MHgwMDAwYTYxOCwgMHgwMTQwNDUwMSwgMHgwMTQwNDUwMSwgMHgwMTQwNDUwMSwgMHgwMTQwNDUwMX0sCisJezB4MDAwMGE2MWMsIDB4MDIwMDg4MDIsIDB4MDIwMDg4MDIsIDB4MDIwMDg4MDIsIDB4MDIwMDg4MDJ9LAorCXsweDAwMDBhNjIwLCAweDAyODBjODAyLCAweDAyODBjODAyLCAweDAyODBjODAyLCAweDAyODBjODAyfSwKKwl7MHgwMDAwYTYyNCwgMHgwMzAxMGEwMywgMHgwMzAxMGEwMywgMHgwMzAxMGEwMywgMHgwMzAxMGEwM30sCisJezB4MDAwMGE2MjgsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDR9LAorCXsweDAwMDBhNjJjLCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0fSwKKwl7MHgwMDAwYTYzMCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNH0sCisJezB4MDAwMGE2MzQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDR9LAorCXsweDAwMDBhNjM4LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0fSwKKwl7MHgwMDAwYTYzYywgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNH0sCisJezB4MDAwMTYwNDQsIDB4MDM0OTIyZGIsIDB4MDM0OTIyZGIsIDB4MDM0OTIyZGIsIDB4MDM0OTIyZGJ9LAorCXsweDAwMDE2Mjg0LCAweDE0ZDNmMDAwLCAweDE0ZDNmMDAwLCAweDE0ZDNmMDAwLCAweDE0ZDNmMDAwfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzMxX21vZGVzX2hpZ2hfb2JfZGJfdHhfZ2Fpbl8xcDFbXVs1XSA9IHsKKwkvKiAgIEFkZHIgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICovCisJezB4MDAwMGEyZDgsIDB4Nzk5OWE4M2EsIDB4Nzk5OWE4M2EsIDB4Nzk5OWE4M2EsIDB4Nzk5OWE4M2F9LAorCXsweDAwMDBhMmRjLCAweGZmYWE5YTUyLCAweGZmYWE5YTUyLCAweGZmYWE5YTUyLCAweGZmYWE5YTUyfSwKKwl7MHgwMDAwYTJlMCwgMHhmZmIzMWM4NCwgMHhmZmIzMWM4NCwgMHhmZmIzMWM4NCwgMHhmZmIzMWM4NH0sCisJezB4MDAwMGEyZTQsIDB4ZmY0M2UwMDAsIDB4ZmY0M2UwMDAsIDB4ZmY0M2UwMDAsIDB4ZmY0M2UwMDB9LAorCXsweDAwMDBhMmU4LCAweGZmZmMwMDAwLCAweGZmZmMwMDAwLCAweGZmZmMwMDAwLCAweGZmZmMwMDAwfSwKKwl7MHgwMDAwYTQxMCwgMHgwMDAwNTBkNywgMHgwMDAwNTBkNywgMHgwMDAwNTBkNywgMHgwMDAwNTBkN30sCisJezB4MDAwMGE1MDAsIDB4MDAwMjIyMDAsIDB4MDAwMjIyMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNTA0LCAweDA1MDYyMDAyLCAweDA1MDYyMDAyLCAweDA0MDAwMDAyLCAweDA0MDAwMDAyfSwKKwl7MHgwMDAwYTUwOCwgMHgwYzAwMmUwMCwgMHgwYzAwMmUwMCwgMHgwODAwMDAwNCwgMHgwODAwMDAwNH0sCisJezB4MDAwMGE1MGMsIDB4MTEwNjIyMDIsIDB4MTEwNjIyMDIsIDB4MGQwMDAyMDAsIDB4MGQwMDAyMDB9LAorCXsweDAwMDBhNTEwLCAweDE3MDIyZTAwLCAweDE3MDIyZTAwLCAweDExMDAwMjAyLCAweDExMDAwMjAyfSwKKwl7MHgwMDAwYTUxNCwgMHgxZDAwMGVjMiwgMHgxZDAwMGVjMiwgMHgxNTAwMDQwMCwgMHgxNTAwMDQwMH0sCisJezB4MDAwMGE1MTgsIDB4MjUwMjBlYzAsIDB4MjUwMjBlYzAsIDB4MTkwMDA0MDIsIDB4MTkwMDA0MDJ9LAorCXsweDAwMDBhNTFjLCAweDJiMDIwZWMzLCAweDJiMDIwZWMzLCAweDFkMDAwNDA0LCAweDFkMDAwNDA0fSwKKwl7MHgwMDAwYTUyMCwgMHgyZjAwMWYwNCwgMHgyZjAwMWYwNCwgMHgyMzAwMGEwMCwgMHgyMzAwMGEwMH0sCisJezB4MDAwMGE1MjQsIDB4MzUwMDFmYzQsIDB4MzUwMDFmYzQsIDB4MjcwMDBhMDIsIDB4MjcwMDBhMDJ9LAorCXsweDAwMDBhNTI4LCAweDNjMDIyZjA0LCAweDNjMDIyZjA0LCAweDJiMDAwYTA0LCAweDJiMDAwYTA0fSwKKwl7MHgwMDAwYTUyYywgMHg0MTAyM2U4NSwgMHg0MTAyM2U4NSwgMHgzZDAwMTYyMCwgMHgzZDAwMTYyMH0sCisJezB4MDAwMGE1MzAsIDB4NDgwMjNlYzYsIDB4NDgwMjNlYzYsIDB4M2YwMDE2MjEsIDB4M2YwMDE2MjF9LAorCXsweDAwMDBhNTM0LCAweDRkMDIzZjAxLCAweDRkMDIzZjAxLCAweDQyMDAxNjQwLCAweDQyMDAxNjQwfSwKKwl7MHgwMDAwYTUzOCwgMHg1MzAyM2Y0YiwgMHg1MzAyM2Y0YiwgMHg0NDAwMTY0MSwgMHg0NDAwMTY0MX0sCisJezB4MDAwMGE1M2MsIDB4NWEwMjdmMDksIDB4NWEwMjdmMDksIDB4NDYwMDE2NDIsIDB4NDYwMDE2NDJ9LAorCXsweDAwMDBhNTQwLCAweDVmMDI3ZmM5LCAweDVmMDI3ZmM5LCAweDQ5MDAxNjQ0LCAweDQ5MDAxNjQ0fSwKKwl7MHgwMDAwYTU0NCwgMHg2NTAyZmVjYSwgMHg2NTAyZmVjYSwgMHg0YzAwMWE4MSwgMHg0YzAwMWE4MX0sCisJezB4MDAwMGE1NDgsIDB4NmIwMmZmNGEsIDB4NmIwMmZmNGEsIDB4NGYwMDFhODMsIDB4NGYwMDFhODN9LAorCXsweDAwMDBhNTRjLCAweDcyMDNmZWNhLCAweDcyMDNmZWNhLCAweDUyMDAxYzg0LCAweDUyMDAxYzg0fSwKKwl7MHgwMDAwYTU1MCwgMHg3NzAzZmYwYiwgMHg3NzAzZmYwYiwgMHg1NTAwMWNlMywgMHg1NTAwMWNlM30sCisJezB4MDAwMGE1NTQsIDB4N2QwNmZmY2IsIDB4N2QwNmZmY2IsIDB4NTkwMDFjZTUsIDB4NTkwMDFjZTV9LAorCXsweDAwMDBhNTU4LCAweDg0MDdmZjBiLCAweDg0MDdmZjBiLCAweDVkMDAxY2U5LCAweDVkMDAxY2U5fSwKKwl7MHgwMDAwYTU1YywgMHg4OTA3ZmZjYiwgMHg4OTA3ZmZjYiwgMHg2NDAwMWVlYywgMHg2NDAwMWVlY30sCisJezB4MDAwMGE1NjAsIDB4OTAwZmZmMGIsIDB4OTAwZmZmMGIsIDB4NjQwMDFlZWMsIDB4NjQwMDFlZWN9LAorCXsweDAwMDBhNTY0LCAweDk2MGZmZmNiLCAweDk2MGZmZmNiLCAweDY0MDAxZWVjLCAweDY0MDAxZWVjfSwKKwl7MHgwMDAwYTU2OCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg2NDAwMWVlYywgMHg2NDAwMWVlY30sCisJezB4MDAwMGE1NmMsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NjQwMDFlZWMsIDB4NjQwMDFlZWN9LAorCXsweDAwMDBhNTcwLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDY0MDAxZWVjLCAweDY0MDAxZWVjfSwKKwl7MHgwMDAwYTU3NCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg2NDAwMWVlYywgMHg2NDAwMWVlY30sCisJezB4MDAwMGE1NzgsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NjQwMDFlZWMsIDB4NjQwMDFlZWN9LAorCXsweDAwMDBhNTdjLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDY0MDAxZWVjLCAweDY0MDAxZWVjfSwKKwl7MHgwMDAwYTU4MCwgMHgwMDAyMjIwMCwgMHgwMDAyMjIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE1ODQsIDB4MDUwNjIwMDIsIDB4MDUwNjIwMDIsIDB4MDQwMDAwMDIsIDB4MDQwMDAwMDJ9LAorCXsweDAwMDBhNTg4LCAweDBjMDAyZTAwLCAweDBjMDAyZTAwLCAweDA4MDAwMDA0LCAweDA4MDAwMDA0fSwKKwl7MHgwMDAwYTU4YywgMHgxMTA2MjIwMiwgMHgxMTA2MjIwMiwgMHgwYjAwMDIwMCwgMHgwYjAwMDIwMH0sCisJezB4MDAwMGE1OTAsIDB4MTcwMjJlMDAsIDB4MTcwMjJlMDAsIDB4MGYwMDAyMDIsIDB4MGYwMDAyMDJ9LAorCXsweDAwMDBhNTk0LCAweDFkMDAwZWMyLCAweDFkMDAwZWMyLCAweDExMDAwNDAwLCAweDExMDAwNDAwfSwKKwl7MHgwMDAwYTU5OCwgMHgyNTAyMGVjMCwgMHgyNTAyMGVjMCwgMHgxNTAwMDQwMiwgMHgxNTAwMDQwMn0sCisJezB4MDAwMGE1OWMsIDB4MmIwMjBlYzMsIDB4MmIwMjBlYzMsIDB4MTkwMDA0MDQsIDB4MTkwMDA0MDR9LAorCXsweDAwMDBhNWEwLCAweDJmMDAxZjA0LCAweDJmMDAxZjA0LCAweDFiMDAwNjAzLCAweDFiMDAwNjAzfSwKKwl7MHgwMDAwYTVhNCwgMHgzNTAwMWZjNCwgMHgzNTAwMWZjNCwgMHgxZjAwMGEwMiwgMHgxZjAwMGEwMn0sCisJezB4MDAwMGE1YTgsIDB4M2MwMjJmMDQsIDB4M2MwMjJmMDQsIDB4MjMwMDBhMDQsIDB4MjMwMDBhMDR9LAorCXsweDAwMDBhNWFjLCAweDQxMDIzZTg1LCAweDQxMDIzZTg1LCAweDI2MDAwYTIwLCAweDI2MDAwYTIwfSwKKwl7MHgwMDAwYTViMCwgMHg0ODAyM2VjNiwgMHg0ODAyM2VjNiwgMHgyYTAwMGUyMCwgMHgyYTAwMGUyMH0sCisJezB4MDAwMGE1YjQsIDB4NGQwMjNmMDEsIDB4NGQwMjNmMDEsIDB4MmUwMDBlMjIsIDB4MmUwMDBlMjJ9LAorCXsweDAwMDBhNWI4LCAweDUzMDIzZjRiLCAweDUzMDIzZjRiLCAweDMxMDAwZTI0LCAweDMxMDAwZTI0fSwKKwl7MHgwMDAwYTViYywgMHg1YTAyN2YwOSwgMHg1YTAyN2YwOSwgMHgzNDAwMTY0MCwgMHgzNDAwMTY0MH0sCisJezB4MDAwMGE1YzAsIDB4NWYwMjdmYzksIDB4NWYwMjdmYzksIDB4MzgwMDE2NjAsIDB4MzgwMDE2NjB9LAorCXsweDAwMDBhNWM0LCAweDY1MDJmZWNhLCAweDY1MDJmZWNhLCAweDNiMDAxODYxLCAweDNiMDAxODYxfSwKKwl7MHgwMDAwYTVjOCwgMHg2YjAyZmY0YSwgMHg2YjAyZmY0YSwgMHgzZTAwMWE4MSwgMHgzZTAwMWE4MX0sCisJezB4MDAwMGE1Y2MsIDB4NzIwM2ZlY2EsIDB4NzIwM2ZlY2EsIDB4NDIwMDFhODMsIDB4NDIwMDFhODN9LAorCXsweDAwMDBhNWQwLCAweDc3MDNmZjBiLCAweDc3MDNmZjBiLCAweDQ0MDAxYzg0LCAweDQ0MDAxYzg0fSwKKwl7MHgwMDAwYTVkNCwgMHg3ZDA2ZmZjYiwgMHg3ZDA2ZmZjYiwgMHg0ODAwMWNlMywgMHg0ODAwMWNlM30sCisJezB4MDAwMGE1ZDgsIDB4ODQwN2ZmMGIsIDB4ODQwN2ZmMGIsIDB4NGMwMDFjZTUsIDB4NGMwMDFjZTV9LAorCXsweDAwMDBhNWRjLCAweDg5MDdmZmNiLCAweDg5MDdmZmNiLCAweDUwMDAxY2U5LCAweDUwMDAxY2U5fSwKKwl7MHgwMDAwYTVlMCwgMHg5MDBmZmYwYiwgMHg5MDBmZmYwYiwgMHg1NDAwMWNlYiwgMHg1NDAwMWNlYn0sCisJezB4MDAwMGE1ZTQsIDB4OTYwZmZmY2IsIDB4OTYwZmZmY2IsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWU4LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVlYywgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZjAsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWY0LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVmOCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZmMsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MTQsIDB4MDE0MDQwMDAsIDB4MDE0MDQwMDAsIDB4MDE0MDQwMDAsIDB4MDE0MDQwMDB9LAorCXsweDAwMDBhNjE4LCAweDAyMDA4NTAxLCAweDAyMDA4NTAxLCAweDAyMDA4NTAxLCAweDAyMDA4NTAxfSwKKwl7MHgwMDAwYTYxYywgMHgwMjAwODgwMiwgMHgwMjAwODgwMiwgMHgwMjAwODgwMiwgMHgwMjAwODgwMn0sCisJezB4MDAwMGE2MjAsIDB4MDI4MGM4MDIsIDB4MDI4MGM4MDIsIDB4MDI4MGM4MDIsIDB4MDI4MGM4MDJ9LAorCXsweDAwMDBhNjI0LCAweDAyODBjYTAzLCAweDAyODBjYTAzLCAweDAyODBjYTAzLCAweDAyODBjYTAzfSwKKwl7MHgwMDAwYTYyOCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNH0sCisJezB4MDAwMGE2MmMsIDB4MDQwMTUwMDUsIDB4MDQwMTUwMDUsIDB4MDQwMTUwMDUsIDB4MDQwMTUwMDV9LAorCXsweDAwMDBhNjMwLCAweDA0MDE1MDA1LCAweDA0MDE1MDA1LCAweDA0MDE1MDA1LCAweDA0MDE1MDA1fSwKKwl7MHgwMDAwYTYzNCwgMHgwNDAxNTAwNSwgMHgwNDAxNTAwNSwgMHgwNDAxNTAwNSwgMHgwNDAxNTAwNX0sCisJezB4MDAwMGE2MzgsIDB4MDQwMTUwMDUsIDB4MDQwMTUwMDUsIDB4MDQwMTUwMDUsIDB4MDQwMTUwMDV9LAorCXsweDAwMDBhNjNjLCAweDA0MDE1MDA1LCAweDA0MDE1MDA1LCAweDA0MDE1MDA1LCAweDA0MDE1MDA1fSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzMxX21vZGVzX2xvd19vYl9kYl90eF9nYWluXzFwMVtdWzVdID0geworCS8qICAgQWRkciAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgKi8KKwl7MHgwMDAwYTJkOCwgMHg3OTk5YTgzYSwgMHg3OTk5YTgzYSwgMHg3OTk5YTgzYSwgMHg3OTk5YTgzYX0sCisJezB4MDAwMGEyZGMsIDB4ZmZmZjJhNTIsIDB4ZmZmZjJhNTIsIDB4ZmZmZjJhNTIsIDB4ZmZmZjJhNTJ9LAorCXsweDAwMDBhMmUwLCAweGZmZmZjYzg0LCAweGZmZmZjYzg0LCAweGZmZmZjYzg0LCAweGZmZmZjYzg0fSwKKwl7MHgwMDAwYTJlNCwgMHhmZmZmZjAwMCwgMHhmZmZmZjAwMCwgMHhmZmZmZjAwMCwgMHhmZmZmZjAwMH0sCisJezB4MDAwMGEyZTgsIDB4ZmZmZTAwMDAsIDB4ZmZmZTAwMDAsIDB4ZmZmZTAwMDAsIDB4ZmZmZTAwMDB9LAorCXsweDAwMDBhNDEwLCAweDAwMDA1MGQ3LCAweDAwMDA1MGQ3LCAweDAwMDA1MGQwLCAweDAwMDA1MGQwfSwKKwl7MHgwMDAwYTUwMCwgMHgwMDAyMjIwMCwgMHgwMDAyMjIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE1MDQsIDB4MDUwNjIwMDIsIDB4MDUwNjIwMDIsIDB4MDQwMDAwMDIsIDB4MDQwMDAwMDJ9LAorCXsweDAwMDBhNTA4LCAweDBjMDAyZTAwLCAweDBjMDAyZTAwLCAweDA4MDAwMDA0LCAweDA4MDAwMDA0fSwKKwl7MHgwMDAwYTUwYywgMHgxMTA2MjIwMiwgMHgxMTA2MjIwMiwgMHgwZDAwMDIwMCwgMHgwZDAwMDIwMH0sCisJezB4MDAwMGE1MTAsIDB4MTcwMjJlMDAsIDB4MTcwMjJlMDAsIDB4MTEwMDAyMDIsIDB4MTEwMDAyMDJ9LAorCXsweDAwMDBhNTE0LCAweDFkMDAwZWMyLCAweDFkMDAwZWMyLCAweDE1MDAwNDAwLCAweDE1MDAwNDAwfSwKKwl7MHgwMDAwYTUxOCwgMHgyNTAyMGVjMCwgMHgyNTAyMGVjMCwgMHgxOTAwMDQwMiwgMHgxOTAwMDQwMn0sCisJezB4MDAwMGE1MWMsIDB4MmIwMjBlYzMsIDB4MmIwMjBlYzMsIDB4MWQwMDA0MDQsIDB4MWQwMDA0MDR9LAorCXsweDAwMDBhNTIwLCAweDJmMDAxZjA0LCAweDJmMDAxZjA0LCAweDIzMDAwYTAwLCAweDIzMDAwYTAwfSwKKwl7MHgwMDAwYTUyNCwgMHgzNTAwMWZjNCwgMHgzNTAwMWZjNCwgMHgyNzAwMGEwMiwgMHgyNzAwMGEwMn0sCisJezB4MDAwMGE1MjgsIDB4M2MwMjJmMDQsIDB4M2MwMjJmMDQsIDB4MmIwMDBhMDQsIDB4MmIwMDBhMDR9LAorCXsweDAwMDBhNTJjLCAweDQxMDIzZTg1LCAweDQxMDIzZTg1LCAweDJkMDAwYTIwLCAweDJkMDAwYTIwfSwKKwl7MHgwMDAwYTUzMCwgMHg0ODAyM2VjNiwgMHg0ODAyM2VjNiwgMHgzMTAwMGEyMiwgMHgzMTAwMGEyMn0sCisJezB4MDAwMGE1MzQsIDB4NGQwMjNmMDEsIDB4NGQwMjNmMDEsIDB4MzUwMDBhMjQsIDB4MzUwMDBhMjR9LAorCXsweDAwMDBhNTM4LCAweDUzMDIzZjRiLCAweDUzMDIzZjRiLCAweDM4MDAwYTQzLCAweDM4MDAwYTQzfSwKKwl7MHgwMDAwYTUzYywgMHg1YTAyN2YwOSwgMHg1YTAyN2YwOSwgMHgzYjAwMGU0MiwgMHgzYjAwMGU0Mn0sCisJezB4MDAwMGE1NDAsIDB4NWYwMjdmYzksIDB4NWYwMjdmYzksIDB4M2YwMDBlNDQsIDB4M2YwMDBlNDR9LAorCXsweDAwMDBhNTQ0LCAweDY1MDJmZWNhLCAweDY1MDJmZWNhLCAweDQyMDAwZTY0LCAweDQyMDAwZTY0fSwKKwl7MHgwMDAwYTU0OCwgMHg2YjAyZmY0YSwgMHg2YjAyZmY0YSwgMHg0NjAwMGU2NiwgMHg0NjAwMGU2Nn0sCisJezB4MDAwMGE1NGMsIDB4NzIwM2ZlY2EsIDB4NzIwM2ZlY2EsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTUwLCAweDc3MDNmZjBiLCAweDc3MDNmZjBiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU1NCwgMHg3ZDA2ZmZjYiwgMHg3ZDA2ZmZjYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1NTgsIDB4ODQwN2ZmMGIsIDB4ODQwN2ZmMGIsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTVjLCAweDg5MDdmZmNiLCAweDg5MDdmZmNiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU2MCwgMHg5MDBmZmYwYiwgMHg5MDBmZmYwYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1NjQsIDB4OTYwZmZmY2IsIDB4OTYwZmZmY2IsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTY4LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU2YywgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1NzAsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTc0LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU3OCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1N2MsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTgwLCAweDAwMDIyMjAwLCAweDAwMDIyMjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTU4NCwgMHgwNTA2MjAwMiwgMHgwNTA2MjAwMiwgMHgwNDAwMDAwMiwgMHgwNDAwMDAwMn0sCisJezB4MDAwMGE1ODgsIDB4MGMwMDJlMDAsIDB4MGMwMDJlMDAsIDB4MDgwMDAwMDQsIDB4MDgwMDAwMDR9LAorCXsweDAwMDBhNThjLCAweDExMDYyMjAyLCAweDExMDYyMjAyLCAweDBiMDAwMjAwLCAweDBiMDAwMjAwfSwKKwl7MHgwMDAwYTU5MCwgMHgxNzAyMmUwMCwgMHgxNzAyMmUwMCwgMHgwZjAwMDIwMiwgMHgwZjAwMDIwMn0sCisJezB4MDAwMGE1OTQsIDB4MWQwMDBlYzIsIDB4MWQwMDBlYzIsIDB4MTEwMDA0MDAsIDB4MTEwMDA0MDB9LAorCXsweDAwMDBhNTk4LCAweDI1MDIwZWMwLCAweDI1MDIwZWMwLCAweDE1MDAwNDAyLCAweDE1MDAwNDAyfSwKKwl7MHgwMDAwYTU5YywgMHgyYjAyMGVjMywgMHgyYjAyMGVjMywgMHgxOTAwMDQwNCwgMHgxOTAwMDQwNH0sCisJezB4MDAwMGE1YTAsIDB4MmYwMDFmMDQsIDB4MmYwMDFmMDQsIDB4MWIwMDA2MDMsIDB4MWIwMDA2MDN9LAorCXsweDAwMDBhNWE0LCAweDM1MDAxZmM0LCAweDM1MDAxZmM0LCAweDFmMDAwYTAyLCAweDFmMDAwYTAyfSwKKwl7MHgwMDAwYTVhOCwgMHgzYzAyMmYwNCwgMHgzYzAyMmYwNCwgMHgyMzAwMGEwNCwgMHgyMzAwMGEwNH0sCisJezB4MDAwMGE1YWMsIDB4NDEwMjNlODUsIDB4NDEwMjNlODUsIDB4MjYwMDBhMjAsIDB4MjYwMDBhMjB9LAorCXsweDAwMDBhNWIwLCAweDQ4MDIzZWM2LCAweDQ4MDIzZWM2LCAweDJhMDAwZTIwLCAweDJhMDAwZTIwfSwKKwl7MHgwMDAwYTViNCwgMHg0ZDAyM2YwMSwgMHg0ZDAyM2YwMSwgMHgyZTAwMGUyMiwgMHgyZTAwMGUyMn0sCisJezB4MDAwMGE1YjgsIDB4NTMwMjNmNGIsIDB4NTMwMjNmNGIsIDB4MzEwMDBlMjQsIDB4MzEwMDBlMjR9LAorCXsweDAwMDBhNWJjLCAweDVhMDI3ZjA5LCAweDVhMDI3ZjA5LCAweDM0MDAxNjQwLCAweDM0MDAxNjQwfSwKKwl7MHgwMDAwYTVjMCwgMHg1ZjAyN2ZjOSwgMHg1ZjAyN2ZjOSwgMHgzODAwMTY2MCwgMHgzODAwMTY2MH0sCisJezB4MDAwMGE1YzQsIDB4NjUwMmZlY2EsIDB4NjUwMmZlY2EsIDB4M2IwMDE4NjEsIDB4M2IwMDE4NjF9LAorCXsweDAwMDBhNWM4LCAweDZiMDJmZjRhLCAweDZiMDJmZjRhLCAweDNlMDAxYTgxLCAweDNlMDAxYTgxfSwKKwl7MHgwMDAwYTVjYywgMHg3MjAzZmVjYSwgMHg3MjAzZmVjYSwgMHg0MjAwMWE4MywgMHg0MjAwMWE4M30sCisJezB4MDAwMGE1ZDAsIDB4NzcwM2ZmMGIsIDB4NzcwM2ZmMGIsIDB4NDQwMDFjODQsIDB4NDQwMDFjODR9LAorCXsweDAwMDBhNWQ0LCAweDdkMDZmZmNiLCAweDdkMDZmZmNiLCAweDQ4MDAxY2UzLCAweDQ4MDAxY2UzfSwKKwl7MHgwMDAwYTVkOCwgMHg4NDA3ZmYwYiwgMHg4NDA3ZmYwYiwgMHg0YzAwMWNlNSwgMHg0YzAwMWNlNX0sCisJezB4MDAwMGE1ZGMsIDB4ODkwN2ZmY2IsIDB4ODkwN2ZmY2IsIDB4NTAwMDFjZTksIDB4NTAwMDFjZTl9LAorCXsweDAwMDBhNWUwLCAweDkwMGZmZjBiLCAweDkwMGZmZjBiLCAweDU0MDAxY2ViLCAweDU0MDAxY2VifSwKKwl7MHgwMDAwYTVlNCwgMHg5NjBmZmZjYiwgMHg5NjBmZmZjYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZTgsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWVjLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVmMCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZjQsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWY4LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVmYywgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE2MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYxNCwgMHgwMTQwNDAwMCwgMHgwMTQwNDAwMCwgMHgwMTQwNDAwMCwgMHgwMTQwNDAwMH0sCisJezB4MDAwMGE2MTgsIDB4MDE0MDQ1MDEsIDB4MDE0MDQ1MDEsIDB4MDE0MDQ1MDEsIDB4MDE0MDQ1MDF9LAorCXsweDAwMDBhNjFjLCAweDAyMDA4ODAyLCAweDAyMDA4ODAyLCAweDAyMDA4ODAyLCAweDAyMDA4ODAyfSwKKwl7MHgwMDAwYTYyMCwgMHgwMjgwYzgwMiwgMHgwMjgwYzgwMiwgMHgwMjgwYzgwMiwgMHgwMjgwYzgwMn0sCisJezB4MDAwMGE2MjQsIDB4MDMwMTBhMDMsIDB4MDMwMTBhMDMsIDB4MDMwMTBhMDMsIDB4MDMwMTBhMDN9LAorCXsweDAwMDBhNjI4LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0fSwKKwl7MHgwMDAwYTYyYywgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNH0sCisJezB4MDAwMGE2MzAsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDR9LAorCXsweDAwMDBhNjM0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0fSwKKwl7MHgwMDAwYTYzOCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNH0sCisJezB4MDAwMGE2M2MsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDR9LAorCXsweDAwMDE2MDQ0LCAweDAzNDkyMmRiLCAweDAzNDkyMmRiLCAweDAzNDkyMmRiLCAweDAzNDkyMmRifSwKKwl7MHgwMDAxNjI4NCwgMHgxNGQzZjAwMCwgMHgxNGQzZjAwMCwgMHgxNGQzZjAwMCwgMHgxNGQzZjAwMH0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV8xcDFfYmFzZWJhbmRfY29yZV90eGZpcl9jb2VmZl9qYXBhbl8yNDg0W11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDBhMzk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM5YywgMHg2ZjdmMDMwMX0sCisJezB4MDAwMGEzYTAsIDB4Y2E5MjI4ZWV9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMzFfMXAxX3h0YWxfMjVNW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA3MDM4LCAweDAwMDAwMmY4fSwKKwl7MHgwMDAwODI0NCwgMHgwMDEwZjNkN30sCisJezB4MDAwMDgyNGMsIDB4MDAwMWU3YWV9LAorCXsweDAwMDE2MDljLCAweDBmNTA4ZjI5fSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzMxXzFwMV9yYWRpb19jb3JlW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDE2MDAwLCAweDM2ZGI2ZGI2fSwKKwl7MHgwMDAxNjAwNCwgMHg2ZGI2ZGI0MH0sCisJezB4MDAwMTYwMDgsIDB4NzM4MDAwMDB9LAorCXsweDAwMDE2MDBjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjA0MCwgMHg3ZjgwZmZmOH0sCisJezB4MDAwMTYwNDQsIDB4MDNkYjYyZGJ9LAorCXsweDAwMDE2MDQ4LCAweDZjOTI0MjY4fSwKKwl7MHgwMDAxNjA0YywgMHgwMDBmMDI3OH0sCisJezB4MDAwMTYwNTAsIDB4NGRiNmRiOGN9LAorCXsweDAwMDE2MDU0LCAweDZkYjYwMDAwfSwKKwl7MHgwMDAxNjA4MCwgMHgwMDA4MDAwMH0sCisJezB4MDAwMTYwODQsIDB4MGU0ODA0OGN9LAorCXsweDAwMDE2MDg4LCAweDE0MjE0NTE0fSwKKwl7MHgwMDAxNjA4YywgMHgxMTlmMDgxY30sCisJezB4MDAwMTYwOTAsIDB4MjQ5MjY0OTB9LAorCXsweDAwMDE2MDk4LCAweGQ0MTFlYjg0fSwKKwl7MHgwMDAxNjBhMCwgMHhjMjEwOGZmZX0sCisJezB4MDAwMTYwYTQsIDB4ODEyZmMzNzB9LAorCXsweDAwMDE2MGE4LCAweDQyM2M4MDAwfSwKKwl7MHgwMDAxNjBhYywgMHgyNDY1MTgwMH0sCisJezB4MDAwMTYwYjAsIDB4MDMyODRmM2V9LAorCXsweDAwMDE2MGI0LCAweDkyNDgwMDQwfSwKKwl7MHgwMDAxNjBjMCwgMHgwMDZkYjZkYn0sCisJezB4MDAwMTYwYzQsIDB4MDE4NmRiNjB9LAorCXsweDAwMDE2MGM4LCAweDZkYjZkYjZjfSwKKwl7MHgwMDAxNjBjYywgMHg2ZGU2YzMwMH0sCisJezB4MDAwMTYwZDAsIDB4MTQ1MDA4MjB9LAorCXsweDAwMDE2MTAwLCAweDA0Y2IwMDAxfSwKKwl7MHgwMDAxNjEwNCwgMHhmZmY4MDAxNX0sCisJezB4MDAwMTYxMDgsIDB4MDAwODAwMTB9LAorCXsweDAwMDE2MTBjLCAweDAwMTcwMDAwfSwKKwl7MHgwMDAxNjE0MCwgMHgxMDgwNDAwMH0sCisJezB4MDAwMTYxNDQsIDB4MDE4ODQwODB9LAorCXsweDAwMDE2MTQ4LCAweDAwMDA4MGMwfSwKKwl7MHgwMDAxNjI4MCwgMHgwMTAwMDAxNX0sCisJezB4MDAwMTYyODQsIDB4MTRkMjAwMDB9LAorCXsweDAwMDE2Mjg4LCAweDAwMzE4MDAwfSwKKwl7MHgwMDAxNjI4YywgMHg1MDAwMDAwMH0sCisJezB4MDAwMTYyOTAsIDB4NGI5NjIxMGZ9LAorCXsweDAwMDE2MzgwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjM4NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzODgsIDB4MDA4MDA3MDB9LAorCXsweDAwMDE2MzhjLCAweDAwODAwNzAwfSwKKwl7MHgwMDAxNjM5MCwgMHgwMDgwMDcwMH0sCisJezB4MDAwMTYzOTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2Mzk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjM5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzYTAsIDB4MDAwMDAwMDF9LAorCXsweDAwMDE2M2E0LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAxNjNhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2IwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjNiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2JjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjNjMCwgMHgwMDAwMDBhMH0sCisJezB4MDAwMTYzYzQsIDB4MDAwYzAwMDB9LAorCXsweDAwMDE2M2M4LCAweDE0MDIxNDAyfSwKKwl7MHgwMDAxNjNjYywgMHgwMDAwMTQwMn0sCisJezB4MDAwMTYzZDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2Q0LCAweDAwMDAwMDAwfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzMxXzFwMV9zb2NfcG9zdGFtYmxlW11bNV0gPSB7CisJLyogIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAqLworCXsweDAwMDA3MDEwLCAweDAwMDAwMDIyLCAweDAwMDAwMDIyLCAweDAwMDAwMDIyLCAweDAwMDAwMDIyfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzMxX2NvbW1vbl93b194bG5hX3J4X2dhaW5fMXAxW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDBhMDAwLCAweDAwMDYwMDA1fSwKKwl7MHgwMDAwYTAwNCwgMHgwMDgxMDA4MH0sCisJezB4MDAwMGEwMDgsIDB4MDA4MzAwODJ9LAorCXsweDAwMDBhMDBjLCAweDAwODUwMDg0fSwKKwl7MHgwMDAwYTAxMCwgMHgwMTgyMDE4MX0sCisJezB4MDAwMGEwMTQsIDB4MDE4NDAxODN9LAorCXsweDAwMDBhMDE4LCAweDAxODgwMTg1fSwKKwl7MHgwMDAwYTAxYywgMHgwMThhMDE4OX0sCisJezB4MDAwMGEwMjAsIDB4MDI4NTAyODR9LAorCXsweDAwMDBhMDI0LCAweDAyODkwMjg4fSwKKwl7MHgwMDAwYTAyOCwgMHgwMjhiMDI4YX0sCisJezB4MDAwMGEwMmMsIDB4MDM4NTAzODR9LAorCXsweDAwMDBhMDMwLCAweDAzODkwMzg4fSwKKwl7MHgwMDAwYTAzNCwgMHgwMzhiMDM4YX0sCisJezB4MDAwMGEwMzgsIDB4MDM4ZDAzOGN9LAorCXsweDAwMDBhMDNjLCAweDAzOTEwMzkwfSwKKwl7MHgwMDAwYTA0MCwgMHgwMzkzMDM5Mn0sCisJezB4MDAwMGEwNDQsIDB4MDM5NTAzOTR9LAorCXsweDAwMDBhMDQ4LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYTA0YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwODAsIDB4MjgyODI4Mjh9LAorCXsweDAwMDBhMDg0LCAweDI4MjgyODI4fSwKKwl7MHgwMDAwYTA4OCwgMHgyODI4MjgyOH0sCisJezB4MDAwMGEwOGMsIDB4MjgyODI4Mjh9LAorCXsweDAwMDBhMDkwLCAweDI4MjgyODI4fSwKKwl7MHgwMDAwYTA5NCwgMHgyNDI0MjQyOH0sCisJezB4MDAwMGEwOTgsIDB4MTcxZTFlMWV9LAorCXsweDAwMDBhMDljLCAweDAyMDIwYjBifSwKKwl7MHgwMDAwYTBhMCwgMHgwMjAyMDIwMn0sCisJezB4MDAwMGEwYTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGMwLCAweDIyMDcyMjA4fSwKKwl7MHgwMDAwYTBjNCwgMHgyMjA1MjIwNn0sCisJezB4MDAwMGEwYzgsIDB4MjIwMzIyMDR9LAorCXsweDAwMDBhMGNjLCAweDIyMDEyMjAyfSwKKwl7MHgwMDAwYTBkMCwgMHgyMjFmMjIwMH0sCisJezB4MDAwMGEwZDQsIDB4MjIxZDIyMWV9LAorCXsweDAwMDBhMGQ4LCAweDMzMDIzMzAzfSwKKwl7MHgwMDAwYTBkYywgMHgzMzAwMzMwMX0sCisJezB4MDAwMGEwZTAsIDB4MzMxZTMzMWZ9LAorCXsweDAwMDBhMGU0LCAweDQ0MDIzMzFkfSwKKwl7MHgwMDAwYTBlOCwgMHg0NDAwNDQwMX0sCisJezB4MDAwMGEwZWMsIDB4NDQxZTQ0MWZ9LAorCXsweDAwMDBhMGYwLCAweDU1MDI1NTAzfSwKKwl7MHgwMDAwYTBmNCwgMHg1NTAwNTUwMX0sCisJezB4MDAwMGEwZjgsIDB4NTUxZTU1MWZ9LAorCXsweDAwMDBhMGZjLCAweDY2MDI1NTFkfSwKKwl7MHgwMDAwYTEwMCwgMHg2NjAwNjYwMX0sCisJezB4MDAwMGExMDQsIDB4NjYxZTY2MWZ9LAorCXsweDAwMDBhMTA4LCAweDc3MDM2NjFkfSwKKwl7MHgwMDAwYTEwYywgMHg3NzAxNzcwMn0sCisJezB4MDAwMGExMTAsIDB4MDAwMDc3MDB9LAorCXsweDAwMDBhMTE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTExOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExNDAsIDB4MDAxZjAwMDB9LAorCXsweDAwMDBhMTQ0LCAweDExMWYxMTAwfSwKKwl7MHgwMDAwYTE0OCwgMHgxMTFkMTExZX0sCisJezB4MDAwMGExNGMsIDB4MTExYjExMWN9LAorCXsweDAwMDBhMTUwLCAweDIyMDMyMjA0fSwKKwl7MHgwMDAwYTE1NCwgMHgyMjAxMjIwMn0sCisJezB4MDAwMGExNTgsIDB4MjIxZjIyMDB9LAorCXsweDAwMDBhMTVjLCAweDIyMWQyMjFlfSwKKwl7MHgwMDAwYTE2MCwgMHgzMzAxMzMwMn0sCisJezB4MDAwMGExNjQsIDB4MzMxZjMzMDB9LAorCXsweDAwMDBhMTY4LCAweDQ0MDIzMzFlfSwKKwl7MHgwMDAwYTE2YywgMHg0NDAwNDQwMX0sCisJezB4MDAwMGExNzAsIDB4NDQxZTQ0MWZ9LAorCXsweDAwMDBhMTc0LCAweDU1MDE1NTAyfSwKKwl7MHgwMDAwYTE3OCwgMHg1NTFmNTUwMH0sCisJezB4MDAwMGExN2MsIDB4NjYwMjU1MWV9LAorCXsweDAwMDBhMTgwLCAweDY2MDA2NjAxfSwKKwl7MHgwMDAwYTE4NCwgMHg2NjFlNjYxZn0sCisJezB4MDAwMGExODgsIDB4NzcwMzY2MWR9LAorCXsweDAwMDBhMThjLCAweDc3MDE3NzAyfSwKKwl7MHgwMDAwYTE5MCwgMHgwMDAwNzcwMH0sCisJezB4MDAwMGExOTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTE5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFkOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFlNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFmMCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGExZjQsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBhMWY4LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYTFmYywgMHgwMDAwMDI5Nn0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV8xcDFfYmFzZWJhbmRfY29yZVtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwOTgwMCwgMHhhZmU2OGUzMH0sCisJezB4MDAwMDk4MDQsIDB4ZmQxNGUwMDB9LAorCXsweDAwMDA5ODA4LCAweDljMGE4ZjZifSwKKwl7MHgwMDAwOTgwYywgMHgwNDgwMDAwMH0sCisJezB4MDAwMDk4MTQsIDB4OTI4MGMwMGF9LAorCXsweDAwMDA5ODE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOTgxYywgMHgwMDAyMDAyOH0sCisJezB4MDAwMDk4MzQsIDB4NWYzY2EzZGV9LAorCXsweDAwMDA5ODM4LCAweDAxMDhlY2ZmfSwKKwl7MHgwMDAwOTgzYywgMHgxNDc1MDYwMH0sCisJezB4MDAwMDk4ODAsIDB4MjAxZmZmMDB9LAorCXsweDAwMDA5ODg0LCAweDAwMDAxMDQyfSwKKwl7MHgwMDAwOThhNCwgMHgwMDIwMDQwMH0sCisJezB4MDAwMDk4YjAsIDB4MzI4NDBiYmV9LAorCXsweDAwMDA5OGQwLCAweDAwNGI2YThlfSwKKwl7MHgwMDAwOThkNCwgMHgwMDAwMDgyMH0sCisJezB4MDAwMDk4ZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5OGYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOThmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDljMDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YzA4LCAweDAzMjAwMDAwfSwKKwl7MHgwMDAwOWMwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDljMTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YzE0LCAweDAwMDQ2Mzg0fSwKKwl7MHgwMDAwOWMxOCwgMHgwNWI2YjQ0MH0sCisJezB4MDAwMDljMWMsIDB4MDBiNmI0NDB9LAorCXsweDAwMDA5ZDAwLCAweGMwODBhMzMzfSwKKwl7MHgwMDAwOWQwNCwgMHg0MDIwNmMxMH0sCisJezB4MDAwMDlkMDgsIDB4MDA5YzQwNjB9LAorCXsweDAwMDA5ZDBjLCAweDE4ODM4MDBhfSwKKwl7MHgwMDAwOWQxMCwgMHgwMTgzNDA2MX0sCisJezB4MDAwMDlkMTQsIDB4MDBjMDA0MDB9LAorCXsweDAwMDA5ZDE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWUwOCwgMHgwMDM4MjMzY30sCisJezB4MDAwMDllMjQsIDB4OTkyN2I1MTV9LAorCXsweDAwMDA5ZTI4LCAweDEyZWYwMjAwfSwKKwl7MHgwMDAwOWUzMCwgMHgwNjMzNmY3N30sCisJezB4MDAwMDllMzQsIDB4NmFmNjUzMmZ9LAorCXsweDAwMDA5ZTM4LCAweDBjYzgwYzAwfSwKKwl7MHgwMDAwOWU0MCwgMHgwZDI2MTgyMH0sCisJezB4MDAwMDllNGMsIDB4MDAwMDEwMDR9LAorCXsweDAwMDA5ZTUwLCAweDAwZmYwM2YxfSwKKwl7MHgwMDAwOWZjMCwgMHg4MDNlNDc4OH0sCisJezB4MDAwMDlmYzQsIDB4MDAwMWVmYjV9LAorCXsweDAwMDA5ZmNjLCAweDQwMDAwMDE0fSwKKwl7MHgwMDAwYTIwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyMjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTIyOCwgMHgxMDAwMjMxMH0sCisJezB4MDAwMGEyM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjQ0LCAweDBjMDAwMDAwfSwKKwl7MHgwMDAwYTJhMCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMGEyYzAsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhMmM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJjYywgMHgxOGM0MzQzM30sCisJezB4MDAwMGEyZDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMmRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJlMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyZTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMmU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyZjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMmY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJmOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM1MCwgMHgwMDAwYTAwMH0sCisJezB4MDAwMGEzNjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzcwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM5MCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMGEzOTQsIDB4MDAwMDA0NDR9LAorCXsweDAwMDBhMzk4LCAweDAwMWYwZTBmfSwKKwl7MHgwMDAwYTM5YywgMHgwMDc1MzkzZn0sCisJezB4MDAwMGEzYTAsIDB4Yjc5ZjY0Mjd9LAorCXsweDAwMDBhM2E0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNhOCwgMHhhYWFhYWFhYX0sCisJezB4MDAwMGEzYWMsIDB4M2M0NjY0Nzh9LAorCXsweDAwMDBhM2MwLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNjNCwgMHgyMjIyMjIyMH0sCisJezB4MDAwMGEzYzgsIDB4MjAyMDAwMjB9LAorCXsweDAwMDBhM2NjLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNkMCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZDQsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2Q4LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNkYywgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZTAsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2U0LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNlOCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZWMsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2YwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTNmNCwgMHgwMDAwMDAwNn0sCisJezB4MDAwMGEzZjgsIDB4MGNkYmQzODB9LAorCXsweDAwMDBhM2ZjLCAweDAwMGYwZjAxfSwKKwl7MHgwMDAwYTQwMCwgMHg4ZmE5MWYwMX0sCisJezB4MDAwMGE0MDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNDA4LCAweDBlNzllNWM2fSwKKwl7MHgwMDAwYTQwYywgMHgwMDgyMDgyMH0sCisJezB4MDAwMGE0MTQsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhNDE4LCAweDJkMDAxZGNlfSwKKwl7MHgwMDAwYTQxYywgMHgxY2U3MzljZX0sCisJezB4MDAwMGE0MjAsIDB4MDAwMDAxY2V9LAorCXsweDAwMDBhNDI0LCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTQyOCwgMHgwMDAwMDFjZX0sCisJezB4MDAwMGE0MmMsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhNDMwLCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTQzNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE0MzgsIDB4MDAwMDE4MDF9LAorCXsweDAwMDBhNDNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTQ0MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE0NDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNDQ4LCAweDA0MDAwMDAwfSwKKwl7MHgwMDAwYTQ0YywgMHgwMDAwMDAwMX0sCisJezB4MDAwMGE0NTAsIDB4MDAwMTAwMDB9LAorCXsweDAwMDBhNDU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTY0MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2NDQsIDB4M2ZhZDlkNzR9LAorCXsweDAwMDBhNjQ4LCAweDAwNDgwNjBhfSwKKwl7MHgwMDAwYTY0YywgMHgwMDAwM2MzN30sCisJezB4MDAwMGE2NzAsIDB4MDMwMjAxMDB9LAorCXsweDAwMDBhNjc0LCAweDA5MDgwNTA0fSwKKwl7MHgwMDAwYTY3OCwgMHgwZDBjMGIwYX0sCisJezB4MDAwMGE2N2MsIDB4MTMxMjExMTB9LAorCXsweDAwMDBhNjgwLCAweDMxMzAxNTE0fSwKKwl7MHgwMDAwYTY4NCwgMHgzNTM0MzMzMn0sCisJezB4MDAwMGE2ODgsIDB4MDAwMDAwMzZ9LAorCXsweDAwMDBhNjkwLCAweDAwMDAwODM4fSwKKwl7MHgwMDAwYTdjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE3YzQsIDB4ZmZmZmZmZmN9LAorCXsweDAwMDBhN2M4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTdjYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE3ZDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhN2Q0LCAweDAwMDAwMDA0fSwKKwl7MHgwMDAwYTdkYywgMHgwMDAwMDAwMX0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV9tb2Rlc19oaWdoX3Bvd2VyX3R4X2dhaW5fMXAxW11bNV0gPSB7CisJLyogIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAqLworCXsweDAwMDBhMmQ4LCAweDc5OTlhODNhLCAweDc5OTlhODNhLCAweDc5OTlhODNhLCAweDc5OTlhODNhfSwKKwl7MHgwMDAwYTJkYywgMHhmZmZmMmE1MiwgMHhmZmZmMmE1MiwgMHhmZmZmMmE1MiwgMHhmZmZmMmE1Mn0sCisJezB4MDAwMGEyZTAsIDB4ZmZmZmNjODQsIDB4ZmZmZmNjODQsIDB4ZmZmZmNjODQsIDB4ZmZmZmNjODR9LAorCXsweDAwMDBhMmU0LCAweGZmZmZmMDAwLCAweGZmZmZmMDAwLCAweGZmZmZmMDAwLCAweGZmZmZmMDAwfSwKKwl7MHgwMDAwYTJlOCwgMHhmZmZlMDAwMCwgMHhmZmZlMDAwMCwgMHhmZmZlMDAwMCwgMHhmZmZlMDAwMH0sCisJezB4MDAwMGE0MTAsIDB4MDAwMDUwZDcsIDB4MDAwMDUwZDcsIDB4MDAwMDUwZDAsIDB4MDAwMDUwZDB9LAorCXsweDAwMDBhNTAwLCAweDAwMDIyMjAwLCAweDAwMDIyMjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTUwNCwgMHgwNTA2MjAwMiwgMHgwNTA2MjAwMiwgMHgwNDAwMDAwMiwgMHgwNDAwMDAwMn0sCisJezB4MDAwMGE1MDgsIDB4MGMwMDJlMDAsIDB4MGMwMDJlMDAsIDB4MDgwMDAwMDQsIDB4MDgwMDAwMDR9LAorCXsweDAwMDBhNTBjLCAweDExMDYyMjAyLCAweDExMDYyMjAyLCAweDBkMDAwMjAwLCAweDBkMDAwMjAwfSwKKwl7MHgwMDAwYTUxMCwgMHgxNzAyMmUwMCwgMHgxNzAyMmUwMCwgMHgxMTAwMDIwMiwgMHgxMTAwMDIwMn0sCisJezB4MDAwMGE1MTQsIDB4MWQwMDBlYzIsIDB4MWQwMDBlYzIsIDB4MTUwMDA0MDAsIDB4MTUwMDA0MDB9LAorCXsweDAwMDBhNTE4LCAweDI1MDIwZWMwLCAweDI1MDIwZWMwLCAweDE5MDAwNDAyLCAweDE5MDAwNDAyfSwKKwl7MHgwMDAwYTUxYywgMHgyYjAyMGVjMywgMHgyYjAyMGVjMywgMHgxZDAwMDQwNCwgMHgxZDAwMDQwNH0sCisJezB4MDAwMGE1MjAsIDB4MmYwMDFmMDQsIDB4MmYwMDFmMDQsIDB4MjMwMDBhMDAsIDB4MjMwMDBhMDB9LAorCXsweDAwMDBhNTI0LCAweDM1MDAxZmM0LCAweDM1MDAxZmM0LCAweDI3MDAwYTAyLCAweDI3MDAwYTAyfSwKKwl7MHgwMDAwYTUyOCwgMHgzYzAyMmYwNCwgMHgzYzAyMmYwNCwgMHgyYjAwMGEwNCwgMHgyYjAwMGEwNH0sCisJezB4MDAwMGE1MmMsIDB4NDEwMjNlODUsIDB4NDEwMjNlODUsIDB4MmQwMDBhMjAsIDB4MmQwMDBhMjB9LAorCXsweDAwMDBhNTMwLCAweDQ4MDIzZWM2LCAweDQ4MDIzZWM2LCAweDMxMDAwYTIyLCAweDMxMDAwYTIyfSwKKwl7MHgwMDAwYTUzNCwgMHg0ZDAyM2YwMSwgMHg0ZDAyM2YwMSwgMHgzNTAwMGEyNCwgMHgzNTAwMGEyNH0sCisJezB4MDAwMGE1MzgsIDB4NTMwMjNmNGIsIDB4NTMwMjNmNGIsIDB4MzgwMDBhNDMsIDB4MzgwMDBhNDN9LAorCXsweDAwMDBhNTNjLCAweDVhMDI3ZjA5LCAweDVhMDI3ZjA5LCAweDNiMDAwZTQyLCAweDNiMDAwZTQyfSwKKwl7MHgwMDAwYTU0MCwgMHg1ZjAyN2ZjOSwgMHg1ZjAyN2ZjOSwgMHgzZjAwMGU0NCwgMHgzZjAwMGU0NH0sCisJezB4MDAwMGE1NDQsIDB4NjUwMmZlY2EsIDB4NjUwMmZlY2EsIDB4NDIwMDBlNjQsIDB4NDIwMDBlNjR9LAorCXsweDAwMDBhNTQ4LCAweDZiMDJmZjRhLCAweDZiMDJmZjRhLCAweDQ2MDAwZTY2LCAweDQ2MDAwZTY2fSwKKwl7MHgwMDAwYTU0YywgMHg3MjAzZmVjYSwgMHg3MjAzZmVjYSwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1NTAsIDB4NzcwM2ZmMGIsIDB4NzcwM2ZmMGIsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTU0LCAweDdkMDZmZmNiLCAweDdkMDZmZmNiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU1OCwgMHg4NDA3ZmYwYiwgMHg4NDA3ZmYwYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1NWMsIDB4ODkwN2ZmY2IsIDB4ODkwN2ZmY2IsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTYwLCAweDkwMGZmZjBiLCAweDkwMGZmZjBiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU2NCwgMHg5NjBmZmZjYiwgMHg5NjBmZmZjYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1NjgsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTZjLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU3MCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1NzQsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NGEwMDBlYTYsIDB4NGEwMDBlYTZ9LAorCXsweDAwMDBhNTc4LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDRhMDAwZWE2LCAweDRhMDAwZWE2fSwKKwl7MHgwMDAwYTU3YywgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg0YTAwMGVhNiwgMHg0YTAwMGVhNn0sCisJezB4MDAwMGE1ODAsIDB4MDAwMjIyMDAsIDB4MDAwMjIyMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNTg0LCAweDA1MDYyMDAyLCAweDA1MDYyMDAyLCAweDA0MDAwMDAyLCAweDA0MDAwMDAyfSwKKwl7MHgwMDAwYTU4OCwgMHgwYzAwMmUwMCwgMHgwYzAwMmUwMCwgMHgwODAwMDAwNCwgMHgwODAwMDAwNH0sCisJezB4MDAwMGE1OGMsIDB4MTEwNjIyMDIsIDB4MTEwNjIyMDIsIDB4MGIwMDAyMDAsIDB4MGIwMDAyMDB9LAorCXsweDAwMDBhNTkwLCAweDE3MDIyZTAwLCAweDE3MDIyZTAwLCAweDBmMDAwMjAyLCAweDBmMDAwMjAyfSwKKwl7MHgwMDAwYTU5NCwgMHgxZDAwMGVjMiwgMHgxZDAwMGVjMiwgMHgxMTAwMDQwMCwgMHgxMTAwMDQwMH0sCisJezB4MDAwMGE1OTgsIDB4MjUwMjBlYzAsIDB4MjUwMjBlYzAsIDB4MTUwMDA0MDIsIDB4MTUwMDA0MDJ9LAorCXsweDAwMDBhNTljLCAweDJiMDIwZWMzLCAweDJiMDIwZWMzLCAweDE5MDAwNDA0LCAweDE5MDAwNDA0fSwKKwl7MHgwMDAwYTVhMCwgMHgyZjAwMWYwNCwgMHgyZjAwMWYwNCwgMHgxYjAwMDYwMywgMHgxYjAwMDYwM30sCisJezB4MDAwMGE1YTQsIDB4MzUwMDFmYzQsIDB4MzUwMDFmYzQsIDB4MWYwMDBhMDIsIDB4MWYwMDBhMDJ9LAorCXsweDAwMDBhNWE4LCAweDNjMDIyZjA0LCAweDNjMDIyZjA0LCAweDIzMDAwYTA0LCAweDIzMDAwYTA0fSwKKwl7MHgwMDAwYTVhYywgMHg0MTAyM2U4NSwgMHg0MTAyM2U4NSwgMHgyNjAwMGEyMCwgMHgyNjAwMGEyMH0sCisJezB4MDAwMGE1YjAsIDB4NDgwMjNlYzYsIDB4NDgwMjNlYzYsIDB4MmEwMDBlMjAsIDB4MmEwMDBlMjB9LAorCXsweDAwMDBhNWI0LCAweDRkMDIzZjAxLCAweDRkMDIzZjAxLCAweDJlMDAwZTIyLCAweDJlMDAwZTIyfSwKKwl7MHgwMDAwYTViOCwgMHg1MzAyM2Y0YiwgMHg1MzAyM2Y0YiwgMHgzMTAwMGUyNCwgMHgzMTAwMGUyNH0sCisJezB4MDAwMGE1YmMsIDB4NWEwMjdmMDksIDB4NWEwMjdmMDksIDB4MzQwMDE2NDAsIDB4MzQwMDE2NDB9LAorCXsweDAwMDBhNWMwLCAweDVmMDI3ZmM5LCAweDVmMDI3ZmM5LCAweDM4MDAxNjYwLCAweDM4MDAxNjYwfSwKKwl7MHgwMDAwYTVjNCwgMHg2NTAyZmVjYSwgMHg2NTAyZmVjYSwgMHgzYjAwMTg2MSwgMHgzYjAwMTg2MX0sCisJezB4MDAwMGE1YzgsIDB4NmIwMmZmNGEsIDB4NmIwMmZmNGEsIDB4M2UwMDFhODEsIDB4M2UwMDFhODF9LAorCXsweDAwMDBhNWNjLCAweDcyMDNmZWNhLCAweDcyMDNmZWNhLCAweDQyMDAxYTgzLCAweDQyMDAxYTgzfSwKKwl7MHgwMDAwYTVkMCwgMHg3NzAzZmYwYiwgMHg3NzAzZmYwYiwgMHg0NDAwMWM4NCwgMHg0NDAwMWM4NH0sCisJezB4MDAwMGE1ZDQsIDB4N2QwNmZmY2IsIDB4N2QwNmZmY2IsIDB4NDgwMDFjZTMsIDB4NDgwMDFjZTN9LAorCXsweDAwMDBhNWQ4LCAweDg0MDdmZjBiLCAweDg0MDdmZjBiLCAweDRjMDAxY2U1LCAweDRjMDAxY2U1fSwKKwl7MHgwMDAwYTVkYywgMHg4OTA3ZmZjYiwgMHg4OTA3ZmZjYiwgMHg1MDAwMWNlOSwgMHg1MDAwMWNlOX0sCisJezB4MDAwMGE1ZTAsIDB4OTAwZmZmMGIsIDB4OTAwZmZmMGIsIDB4NTQwMDFjZWIsIDB4NTQwMDFjZWJ9LAorCXsweDAwMDBhNWU0LCAweDk2MGZmZmNiLCAweDk2MGZmZmNiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVlOCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZWMsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWYwLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVmNCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZjgsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWZjLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTYwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjE0LCAweDAxNDA0MDAwLCAweDAxNDA0MDAwLCAweDAxNDA0MDAwLCAweDAxNDA0MDAwfSwKKwl7MHgwMDAwYTYxOCwgMHgwMTQwNDUwMSwgMHgwMTQwNDUwMSwgMHgwMTQwNDUwMSwgMHgwMTQwNDUwMX0sCisJezB4MDAwMGE2MWMsIDB4MDIwMDg4MDIsIDB4MDIwMDg4MDIsIDB4MDIwMDg4MDIsIDB4MDIwMDg4MDJ9LAorCXsweDAwMDBhNjIwLCAweDAyODBjODAyLCAweDAyODBjODAyLCAweDAyODBjODAyLCAweDAyODBjODAyfSwKKwl7MHgwMDAwYTYyNCwgMHgwMzAxMGEwMywgMHgwMzAxMGEwMywgMHgwMzAxMGEwMywgMHgwMzAxMGEwM30sCisJezB4MDAwMGE2MjgsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDR9LAorCXsweDAwMDBhNjJjLCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0fSwKKwl7MHgwMDAwYTYzMCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNH0sCisJezB4MDAwMGE2MzQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDQsIDB4MDMwMTBjMDR9LAorCXsweDAwMDBhNjM4LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0LCAweDAzMDEwYzA0fSwKKwl7MHgwMDAwYTYzYywgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNCwgMHgwMzAxMGMwNH0sCisJezB4MDAwMTYwNDQsIDB4MDM0OTIyZGIsIDB4MDM0OTIyZGIsIDB4MDM0OTIyZGIsIDB4MDM0OTIyZGJ9LAorCXsweDAwMDE2Mjg0LCAweDE0ZDNmMDAwLCAweDE0ZDNmMDAwLCAweDE0ZDNmMDAwLCAweDE0ZDNmMDAwfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzMxXzFwMV9tYWNfcG9zdGFtYmxlW11bNV0gPSB7CisJLyogIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAqLworCXsweDAwMDAxMDMwLCAweDAwMDAwMjMwLCAweDAwMDAwNDYwLCAweDAwMDAwMmMwLCAweDAwMDAwMTYwfSwKKwl7MHgwMDAwMTA3MCwgMHgwMDAwMDE2OCwgMHgwMDAwMDJkMCwgMHgwMDAwMDMxOCwgMHgwMDAwMDE4Y30sCisJezB4MDAwMDEwYjAsIDB4MDAwMDBlNjAsIDB4MDAwMDFjYzAsIDB4MDAwMDdjNzAsIDB4MDAwMDNlMzh9LAorCXsweDAwMDA4MDE0LCAweDAzZTgwM2U4LCAweDA3ZDAwN2QwLCAweDEwODAxNjAwLCAweDA4NDAwYjAwfSwKKwl7MHgwMDAwODAxYywgMHgxMjhkODAyNywgMHgxMjhkODA0ZiwgMHgxMmUwMDA1NywgMHgxMmUwMDAyYn0sCisJezB4MDAwMDgxMjAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MTAsIDB4MDhmMDQ4MTB9LAorCXsweDAwMDA4MWQwLCAweDAwMDAzMjEwLCAweDAwMDAzMjEwLCAweDAwMDAzMjBhLCAweDAwMDAzMjBhfSwKKwl7MHgwMDAwODMxOCwgMHgwMDAwM2U4MCwgMHgwMDAwN2QwMCwgMHgwMDAwNjg4MCwgMHgwMDAwMzQ0MH0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV8xcDFfc29jX3ByZWFtYmxlW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA3MDIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNzAzNCwgMHgwMDAwMDAwMn0sCisJezB4MDAwMDcwMzgsIDB4MDAwMDAyZjh9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMzFfMXAxX3h0YWxfNDBNW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA3MDM4LCAweDAwMDAwNGMyfSwKKwl7MHgwMDAwODI0NCwgMHgwMDEwZjQwMH0sCisJezB4MDAwMDgyNGMsIDB4MDAwMWU4MDB9LAorCXsweDAwMDE2MDljLCAweDBiMjgzZjMxfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzMxXzFwMV9tYWNfY29yZVtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwMDAwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDAwMzAsIDB4MDAwMjAwODV9LAorCXsweDAwMDAwMDM0LCAweDAwMDAwMDA1fSwKKwl7MHgwMDAwMDA0MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDAwNDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDQ4LCAweDAwMDAwMDA4fSwKKwl7MHgwMDAwMDA0YywgMHgwMDAwMDAxMH0sCisJezB4MDAwMDAwNTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDQwLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA0NCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNDgsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDRjLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1MCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNTQsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDU4LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1YywgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNjAsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDY0LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTBmMCwgMHgwMDAwMDEwMH0sCisJezB4MDAwMDEyNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMmIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0M2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNDdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA0NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDRjLCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODA1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDVjLCAweDAwMGZjNzhmfSwKKwl7MHgwMDAwODA2MCwgMHgwMDAwMDAwZn0sCisJezB4MDAwMDgwNjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDcwLCAweDAwMDAwMzEwfSwKKwl7MHgwMDAwODA3NCwgMHgwMDAwMDAyMH0sCisJezB4MDAwMDgwNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDljLCAweDAwMDAwMDBmfSwKKwl7MHgwMDAwODBhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwYTQsIDB4MDJmZjAwMDB9LAorCXsweDAwMDA4MGE4LCAweDBlMDcwNjA1fSwKKwl7MHgwMDAwODBhYywgMHgwMDAwMDAwZH0sCisJezB4MDAwMDgwYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGMwLCAweDJhODAwMDAwfSwKKwl7MHgwMDAwODBjNCwgMHgwNjkwMDE2OH0sCisJezB4MDAwMDgwYzgsIDB4MTM4ODFjMjB9LAorCXsweDAwMDA4MGNjLCAweDAxZjQwMDAwfSwKKwl7MHgwMDAwODBkMCwgMHgwMDI1MjUwMH0sCisJezB4MDAwMDgwZDQsIDB4MDBhMDAwMDB9LAorCXsweDAwMDA4MGQ4LCAweDAwNDAwMDAwfSwKKwl7MHgwMDAwODBkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZTAsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MGU0LCAweDAwMDBmZmZmfSwKKwl7MHgwMDAwODBlOCwgMHgzZjNmM2YzZn0sCisJezB4MDAwMDgwZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZmMsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA4MTAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEwOCwgMHgwMDAwMDA1Mn0sCisJezB4MDAwMDgxMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODExNCwgMHgwMDAwMDdmZn0sCisJezB4MDAwMDgxMTgsIDB4MDAwMDAwYWF9LAorCXsweDAwMDA4MTFjLCAweDAwMDAzMjEwfSwKKwl7MHgwMDAwODEyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzYywgMHgwMDAwZmZmZn0sCisJezB4MDAwMDgxNDQsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MTY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODE2YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxNzAsIDB4MTg0ODYyMDB9LAorCXsweDAwMDA4MTc0LCAweDMzMzMyMjEwfSwKKwl7MHgwMDAwODE3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxN2MsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA4MWMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFjNCwgMHgzMzMzMjIxMH0sCisJezB4MDAwMDgxYzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFkNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI0MCwgMHgwMDEwMDAwMH0sCisJezB4MDAwMDgyNDgsIDB4MDAwMDA4MDB9LAorCXsweDAwMDA4MjUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjVjLCAweDQwMDAwMDAwfSwKKwl7MHgwMDAwODI2MCwgMHgwMDA4MDkyMn0sCisJezB4MDAwMDgyNjQsIDB4OWQ0MDAwMTB9LAorCXsweDAwMDA4MjY4LCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODI2YywgMHgwMDAwZmZmZn0sCisJezB4MDAwMDgyNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjc0LCAweDQwMDAwMDAwfSwKKwl7MHgwMDAwODI3OCwgMHgwMDNlNDE4MH0sCisJezB4MDAwMDgyN2MsIDB4MDAwMDAwMDR9LAorCXsweDAwMDA4Mjg0LCAweDAwMDAwMDJjfSwKKwl7MHgwMDAwODI4OCwgMHgwMDAwMDAyY30sCisJezB4MDAwMDgyOGMsIDB4MDAwMDAwZmZ9LAorCXsweDAwMDA4Mjk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyOWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzAwLCAweDAwMDAwMTQwfSwKKwl7MHgwMDAwODMxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMWMsIDB4MDAwMDAxMGR9LAorCXsweDAwMDA4MzI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMyYywgMHgwMDAwMDAwN30sCisJezB4MDAwMDgzMzAsIDB4MDAwMDAzMDJ9LAorCXsweDAwMDA4MzM0LCAweDAwMDAwNzAwfSwKKwl7MHgwMDAwODMzOCwgMHgwMGZmMDAwMH0sCisJezB4MDAwMDgzM2MsIDB4MDI0MDAwMDB9LAorCXsweDAwMDA4MzQwLCAweDAwMDEwN2ZmfSwKKwl7MHgwMDAwODM0NCwgMHhhYTQ4MTA1Yn0sCisJezB4MDAwMDgzNDgsIDB4MDA4ZjAwMDB9LAorCXsweDAwMDA4MzVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM2MCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgzNjQsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MzY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzNzQsIDB4MDAwMDAwZmZ9LAorCXsweDAwMDA4Mzc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzODAsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4Mzg0LCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODM5MCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgzOTQsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4Mzk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4M2E0LCAweDAwMDBmYTE0fSwKKwl7MHgwMDAwODNhOCwgMHgwMDBmMGMwMH0sCisJezB4MDAwMDgzYWMsIDB4MzMzMzIyMTB9LAorCXsweDAwMDA4M2IwLCAweDMzMzMyMjEwfSwKKwl7MHgwMDAwODNiNCwgMHgzMzMzMjIxMH0sCisJezB4MDAwMDgzYjgsIDB4MzMzMzIyMTB9LAorCXsweDAwMDA4M2JjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODNjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzYzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4M2M4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODNjYywgMHgwMDAwMDIwMH0sCisJezB4MDAwMDgzZDAsIDB4MDAwMzAxZmZ9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMzFfY29tbW9uX3J4X2dhaW5fMXAxW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDBhMDAwLCAweDAwMDEwMDAwfSwKKwl7MHgwMDAwYTAwNCwgMHgwMDAzMDAwMn0sCisJezB4MDAwMGEwMDgsIDB4MDAwNTAwMDR9LAorCXsweDAwMDBhMDBjLCAweDAwODEwMDgwfSwKKwl7MHgwMDAwYTAxMCwgMHgwMDgzMDA4Mn0sCisJezB4MDAwMGEwMTQsIDB4MDE4MTAxODB9LAorCXsweDAwMDBhMDE4LCAweDAxODMwMTgyfSwKKwl7MHgwMDAwYTAxYywgMHgwMTg1MDE4NH0sCisJezB4MDAwMGEwMjAsIDB4MDE4OTAxODh9LAorCXsweDAwMDBhMDI0LCAweDAxOGIwMThhfSwKKwl7MHgwMDAwYTAyOCwgMHgwMThkMDE4Y30sCisJezB4MDAwMGEwMmMsIDB4MDE5MTAxOTB9LAorCXsweDAwMDBhMDMwLCAweDAxOTMwMTkyfSwKKwl7MHgwMDAwYTAzNCwgMHgwMTk1MDE5NH0sCisJezB4MDAwMGEwMzgsIDB4MDM4YTAxOTZ9LAorCXsweDAwMDBhMDNjLCAweDAzOGMwMzhifSwKKwl7MHgwMDAwYTA0MCwgMHgwMzkwMDM4ZH0sCisJezB4MDAwMGEwNDQsIDB4MDM5MjAzOTF9LAorCXsweDAwMDBhMDQ4LCAweDAzOTQwMzkzfSwKKwl7MHgwMDAwYTA0YywgMHgwMzk2MDM5NX0sCisJezB4MDAwMGEwNTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwODAsIDB4MjIyMjIyMjl9LAorCXsweDAwMDBhMDg0LCAweDFkMWQxZDFkfSwKKwl7MHgwMDAwYTA4OCwgMHgxZDFkMWQxZH0sCisJezB4MDAwMGEwOGMsIDB4MWQxZDFkMWR9LAorCXsweDAwMDBhMDkwLCAweDE3MWQxZDFkfSwKKwl7MHgwMDAwYTA5NCwgMHgxMTExMTcxN30sCisJezB4MDAwMGEwOTgsIDB4MDAwMzAzMTF9LAorCXsweDAwMDBhMDljLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGMwLCAweDAwMWYwMDAwfSwKKwl7MHgwMDAwYTBjNCwgMHgwMTAwMDEwMX0sCisJezB4MDAwMGEwYzgsIDB4MDExZTAxMWZ9LAorCXsweDAwMDBhMGNjLCAweDAxMWMwMTFkfSwKKwl7MHgwMDAwYTBkMCwgMHgwMjAzMDIwNH0sCisJezB4MDAwMGEwZDQsIDB4MDIwMTAyMDJ9LAorCXsweDAwMDBhMGQ4LCAweDAyMWYwMjAwfSwKKwl7MHgwMDAwYTBkYywgMHgwMzAyMDIxZX0sCisJezB4MDAwMGEwZTAsIDB4MDMwMDAzMDF9LAorCXsweDAwMDBhMGU0LCAweDAzMWUwMzFmfSwKKwl7MHgwMDAwYTBlOCwgMHgwNDAyMDMxZH0sCisJezB4MDAwMGEwZWMsIDB4MDQwMDA0MDF9LAorCXsweDAwMDBhMGYwLCAweDA0MWUwNDFmfSwKKwl7MHgwMDAwYTBmNCwgMHgwNTAyMDQxZH0sCisJezB4MDAwMGEwZjgsIDB4MDUwMDA1MDF9LAorCXsweDAwMDBhMGZjLCAweDA1MWUwNTFmfSwKKwl7MHgwMDAwYTEwMCwgMHgwNjAxMDYwMn0sCisJezB4MDAwMGExMDQsIDB4MDYxZjA2MDB9LAorCXsweDAwMDBhMTA4LCAweDA2MWQwNjFlfSwKKwl7MHgwMDAwYTEwYywgMHgwNzAyMDcwM30sCisJezB4MDAwMGExMTAsIDB4MDcwMDA3MDF9LAorCXsweDAwMDBhMTE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTExOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExNDAsIDB4MDAxZjAwMDB9LAorCXsweDAwMDBhMTQ0LCAweDAxMDAwMTAxfSwKKwl7MHgwMDAwYTE0OCwgMHgwMTFlMDExZn0sCisJezB4MDAwMGExNGMsIDB4MDExYzAxMWR9LAorCXsweDAwMDBhMTUwLCAweDAyMDMwMjA0fSwKKwl7MHgwMDAwYTE1NCwgMHgwMjAxMDIwMn0sCisJezB4MDAwMGExNTgsIDB4MDIxZjAyMDB9LAorCXsweDAwMDBhMTVjLCAweDAzMDIwMjFlfSwKKwl7MHgwMDAwYTE2MCwgMHgwMzAwMDMwMX0sCisJezB4MDAwMGExNjQsIDB4MDMxZTAzMWZ9LAorCXsweDAwMDBhMTY4LCAweDA0MDIwMzFkfSwKKwl7MHgwMDAwYTE2YywgMHgwNDAwMDQwMX0sCisJezB4MDAwMGExNzAsIDB4MDQxZTA0MWZ9LAorCXsweDAwMDBhMTc0LCAweDA1MDIwNDFkfSwKKwl7MHgwMDAwYTE3OCwgMHgwNTAwMDUwMX0sCisJezB4MDAwMGExN2MsIDB4MDUxZTA1MWZ9LAorCXsweDAwMDBhMTgwLCAweDA2MDEwNjAyfSwKKwl7MHgwMDAwYTE4NCwgMHgwNjFmMDYwMH0sCisJezB4MDAwMGExODgsIDB4MDYxZDA2MWV9LAorCXsweDAwMDBhMThjLCAweDA3MDIwNzAzfSwKKwl7MHgwMDAwYTE5MCwgMHgwNzAwMDcwMX0sCisJezB4MDAwMGExOTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTE5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFkOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFlNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFmMCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGExZjQsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBhMWY4LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYTFmYywgMHgwMDAwMDE5Nn0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV9jb21tb25fdHhfZ2Fpbl9vZmZzZXQxXzFbXVsxXSA9IHsKKwl7MH0sCisJezN9LAorCXswfSwKKwl7MH0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV8xcDFfY2hhbnNlbF94dGFsXzI1TVtdID0geworCTB4MDEwMTQ3OWUsCisJMHgwMTAxZDAyNywKKwkweDAxMDI1OGFmLAorCTB4MDEwMmUxMzgsCisJMHgwMTAzNjljMCwKKwkweDAxMDNmMjQ5LAorCTB4MDEwNDdhZDEsCisJMHgwMTA1MDM1YSwKKwkweDAxMDU4YmUyLAorCTB4MDEwNjE0NmIsCisJMHgwMTA2OWNmMywKKwkweDAxMDcyNTdjLAorCTB4MDEwN2FlMDQsCisJMHgwMTA4ZjViMiwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzMxXzFwMV9jaGFuc2VsX3h0YWxfNDBNW10gPSB7CisJMHgwMGEwY2NiZSwKKwkweDAwYTEyMjEzLAorCTB4MDBhMTc3NjksCisJMHgwMGExY2NiZSwKKwkweDAwYTIyMjEzLAorCTB4MDBhMjc3NjksCisJMHgwMGEyY2NiZSwKKwkweDAwYTMyMjEzLAorCTB4MDBhMzc3NjksCisJMHgwMGEzY2NiZSwKKwkweDAwYTQyMjEzLAorCTB4MDBhNDc3NjksCisJMHgwMGE0Y2NiZSwKKwkweDAwYTU5OThiLAorfTsKKworI2VuZGlmIC8qIElOSVRWQUxTXzkzMzBfMVAxX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkzMzBfMXAyX2luaXR2YWxzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MzMwXzFwMl9pbml0dmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmNhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MzMwXzFwMl9pbml0dmFscy5oCkBAIC0wLDAgKzEsMTA4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIElOSVRWQUxTXzkzMzBfMVAyX0gKKyNkZWZpbmUgSU5JVFZBTFNfOTMzMF8xUDJfSAorCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV9tb2Rlc19sb3dlc3Rfb2JfZGJfdHhfZ2Fpbl8xcDJbXVs1XSA9IHsKKwkvKiAgQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICovCisJezB4MDAwMGE0MTAsIDB4MDAwMDUwZDcsIDB4MDAwMDUwZDcsIDB4MDAwMDUwZDcsIDB4MDAwMDUwZDd9LAorCXsweDAwMDBhNTAwLCAweDAwMDIyMjAwLCAweDAwMDIyMjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTUwNCwgMHgwNTA2MjAwMiwgMHgwNTA2MjAwMiwgMHgwNDAwMDAwMiwgMHgwNDAwMDAwMn0sCisJezB4MDAwMGE1MDgsIDB4MGMwMDJlMDAsIDB4MGMwMDJlMDAsIDB4MDgwMDAwMDQsIDB4MDgwMDAwMDR9LAorCXsweDAwMDBhNTBjLCAweDExMDYyMjAyLCAweDExMDYyMjAyLCAweDBkMDAwMjAwLCAweDBkMDAwMjAwfSwKKwl7MHgwMDAwYTUxMCwgMHgxNzAyMmUwMCwgMHgxNzAyMmUwMCwgMHgxMTAwMDIwMiwgMHgxMTAwMDIwMn0sCisJezB4MDAwMGE1MTQsIDB4MWQwMDBlYzIsIDB4MWQwMDBlYzIsIDB4MTUwMDA0MDAsIDB4MTUwMDA0MDB9LAorCXsweDAwMDBhNTE4LCAweDI1MDIwZWMwLCAweDI1MDIwZWMwLCAweDE5MDAwNDAyLCAweDE5MDAwNDAyfSwKKwl7MHgwMDAwYTUxYywgMHgyYjAyMGVjMywgMHgyYjAyMGVjMywgMHgxZDAwMDQwNCwgMHgxZDAwMDQwNH0sCisJezB4MDAwMGE1MjAsIDB4MmYwMDFmMDQsIDB4MmYwMDFmMDQsIDB4MjMwMDBhMDAsIDB4MjMwMDBhMDB9LAorCXsweDAwMDBhNTI0LCAweDM1MDAxZmM0LCAweDM1MDAxZmM0LCAweDI3MDAwYTAyLCAweDI3MDAwYTAyfSwKKwl7MHgwMDAwYTUyOCwgMHgzYzAyMmYwNCwgMHgzYzAyMmYwNCwgMHgyYjAwMGEwNCwgMHgyYjAwMGEwNH0sCisJezB4MDAwMGE1MmMsIDB4NDEwMjNlODUsIDB4NDEwMjNlODUsIDB4M2YwMDE2MjAsIDB4M2YwMDE2MjB9LAorCXsweDAwMDBhNTMwLCAweDQ4MDIzZWM2LCAweDQ4MDIzZWM2LCAweDQxMDAxNjIxLCAweDQxMDAxNjIxfSwKKwl7MHgwMDAwYTUzNCwgMHg0ZDAyM2YwMSwgMHg0ZDAyM2YwMSwgMHg0NDAwMTY0MCwgMHg0NDAwMTY0MH0sCisJezB4MDAwMGE1MzgsIDB4NTMwMjNmNGIsIDB4NTMwMjNmNGIsIDB4NDYwMDE2NDEsIDB4NDYwMDE2NDF9LAorCXsweDAwMDBhNTNjLCAweDVhMDI3ZjA5LCAweDVhMDI3ZjA5LCAweDQ4MDAxNjQyLCAweDQ4MDAxNjQyfSwKKwl7MHgwMDAwYTU0MCwgMHg1ZjAyN2ZjOSwgMHg1ZjAyN2ZjOSwgMHg0YjAwMTY0NCwgMHg0YjAwMTY0NH0sCisJezB4MDAwMGE1NDQsIDB4NjUwMmZlY2EsIDB4NjUwMmZlY2EsIDB4NGUwMDFhODEsIDB4NGUwMDFhODF9LAorCXsweDAwMDBhNTQ4LCAweDZiMDJmZjRhLCAweDZiMDJmZjRhLCAweDUxMDAxYTgzLCAweDUxMDAxYTgzfSwKKwl7MHgwMDAwYTU0YywgMHg3MjAzZmVjYSwgMHg3MjAzZmVjYSwgMHg1NDAwMWM4NCwgMHg1NDAwMWM4NH0sCisJezB4MDAwMGE1NTAsIDB4NzcwM2ZmMGIsIDB4NzcwM2ZmMGIsIDB4NTcwMDFjZTMsIDB4NTcwMDFjZTN9LAorCXsweDAwMDBhNTU0LCAweDdkMDZmZmNiLCAweDdkMDZmZmNiLCAweDViMDAxY2U1LCAweDViMDAxY2U1fSwKKwl7MHgwMDAwYTU1OCwgMHg4NDA3ZmYwYiwgMHg4NDA3ZmYwYiwgMHg1ZjAwMWNlOSwgMHg1ZjAwMWNlOX0sCisJezB4MDAwMGE1NWMsIDB4ODkwN2ZmY2IsIDB4ODkwN2ZmY2IsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTYwLCAweDkwMGZmZjBiLCAweDkwMGZmZjBiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU2NCwgMHg5NjBmZmZjYiwgMHg5NjBmZmZjYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1NjgsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTZjLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU3MCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1NzQsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTc4LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU3YywgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1ODAsIDB4MDAwMjIyMDAsIDB4MDAwMjIyMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNTg0LCAweDA1MDYyMDAyLCAweDA1MDYyMDAyLCAweDA0MDAwMDAyLCAweDA0MDAwMDAyfSwKKwl7MHgwMDAwYTU4OCwgMHgwYzAwMmUwMCwgMHgwYzAwMmUwMCwgMHgwODAwMDAwNCwgMHgwODAwMDAwNH0sCisJezB4MDAwMGE1OGMsIDB4MTEwNjIyMDIsIDB4MTEwNjIyMDIsIDB4MGIwMDAyMDAsIDB4MGIwMDAyMDB9LAorCXsweDAwMDBhNTkwLCAweDE3MDIyZTAwLCAweDE3MDIyZTAwLCAweDBmMDAwMjAyLCAweDBmMDAwMjAyfSwKKwl7MHgwMDAwYTU5NCwgMHgxZDAwMGVjMiwgMHgxZDAwMGVjMiwgMHgxMTAwMDQwMCwgMHgxMTAwMDQwMH0sCisJezB4MDAwMGE1OTgsIDB4MjUwMjBlYzAsIDB4MjUwMjBlYzAsIDB4MTUwMDA0MDIsIDB4MTUwMDA0MDJ9LAorCXsweDAwMDBhNTljLCAweDJiMDIwZWMzLCAweDJiMDIwZWMzLCAweDE5MDAwNDA0LCAweDE5MDAwNDA0fSwKKwl7MHgwMDAwYTVhMCwgMHgyZjAwMWYwNCwgMHgyZjAwMWYwNCwgMHgxYjAwMDYwMywgMHgxYjAwMDYwM30sCisJezB4MDAwMGE1YTQsIDB4MzUwMDFmYzQsIDB4MzUwMDFmYzQsIDB4MWYwMDBhMDIsIDB4MWYwMDBhMDJ9LAorCXsweDAwMDBhNWE4LCAweDNjMDIyZjA0LCAweDNjMDIyZjA0LCAweDIzMDAwYTA0LCAweDIzMDAwYTA0fSwKKwl7MHgwMDAwYTVhYywgMHg0MTAyM2U4NSwgMHg0MTAyM2U4NSwgMHgyNjAwMGEyMCwgMHgyNjAwMGEyMH0sCisJezB4MDAwMGE1YjAsIDB4NDgwMjNlYzYsIDB4NDgwMjNlYzYsIDB4MmEwMDBlMjAsIDB4MmEwMDBlMjB9LAorCXsweDAwMDBhNWI0LCAweDRkMDIzZjAxLCAweDRkMDIzZjAxLCAweDJlMDAwZTIyLCAweDJlMDAwZTIyfSwKKwl7MHgwMDAwYTViOCwgMHg1MzAyM2Y0YiwgMHg1MzAyM2Y0YiwgMHgzMTAwMGUyNCwgMHgzMTAwMGUyNH0sCisJezB4MDAwMGE1YmMsIDB4NWEwMjdmMDksIDB4NWEwMjdmMDksIDB4MzQwMDE2NDAsIDB4MzQwMDE2NDB9LAorCXsweDAwMDBhNWMwLCAweDVmMDI3ZmM5LCAweDVmMDI3ZmM5LCAweDM4MDAxNjYwLCAweDM4MDAxNjYwfSwKKwl7MHgwMDAwYTVjNCwgMHg2NTAyZmVjYSwgMHg2NTAyZmVjYSwgMHgzYjAwMTg2MSwgMHgzYjAwMTg2MX0sCisJezB4MDAwMGE1YzgsIDB4NmIwMmZmNGEsIDB4NmIwMmZmNGEsIDB4M2UwMDFhODEsIDB4M2UwMDFhODF9LAorCXsweDAwMDBhNWNjLCAweDcyMDNmZWNhLCAweDcyMDNmZWNhLCAweDQyMDAxYTgzLCAweDQyMDAxYTgzfSwKKwl7MHgwMDAwYTVkMCwgMHg3NzAzZmYwYiwgMHg3NzAzZmYwYiwgMHg0NDAwMWM4NCwgMHg0NDAwMWM4NH0sCisJezB4MDAwMGE1ZDQsIDB4N2QwNmZmY2IsIDB4N2QwNmZmY2IsIDB4NDgwMDFjZTMsIDB4NDgwMDFjZTN9LAorCXsweDAwMDBhNWQ4LCAweDg0MDdmZjBiLCAweDg0MDdmZjBiLCAweDRjMDAxY2U1LCAweDRjMDAxY2U1fSwKKwl7MHgwMDAwYTVkYywgMHg4OTA3ZmZjYiwgMHg4OTA3ZmZjYiwgMHg1MDAwMWNlOSwgMHg1MDAwMWNlOX0sCisJezB4MDAwMGE1ZTAsIDB4OTAwZmZmMGIsIDB4OTAwZmZmMGIsIDB4NTQwMDFjZWIsIDB4NTQwMDFjZWJ9LAorCXsweDAwMDBhNWU0LCAweDk2MGZmZmNiLCAweDk2MGZmZmNiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVlOCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZWMsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWYwLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVmNCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZjgsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWZjLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTYwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjE0LCAweDAxNDA0MDAwLCAweDAxNDA0MDAwLCAweDAxNDA0MDAwLCAweDAxNDA0MDAwfSwKKwl7MHgwMDAwYTYxOCwgMHgwMjAwODUwMSwgMHgwMjAwODUwMSwgMHgwMjAwODUwMSwgMHgwMjAwODUwMX0sCisJezB4MDAwMGE2MWMsIDB4MDIwMDg4MDIsIDB4MDIwMDg4MDIsIDB4MDIwMDg4MDIsIDB4MDIwMDg4MDJ9LAorCXsweDAwMDBhNjIwLCAweDAzMDBjODAyLCAweDAzMDBjODAyLCAweDAzMDBjODAyLCAweDAzMDBjODAyfSwKKwl7MHgwMDAwYTYyNCwgMHgwMzAwY2MwMywgMHgwMzAwY2MwMywgMHgwMzAwY2MwMywgMHgwMzAwY2MwM30sCisJezB4MDAwMGE2MjgsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDR9LAorCXsweDAwMDBhNjJjLCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0fSwKKwl7MHgwMDAwYTYzMCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNH0sCisJezB4MDAwMGE2MzQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDR9LAorCXsweDAwMDBhNjM4LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0fSwKKwl7MHgwMDAwYTYzYywgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNH0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV8xcDJfYmFzZWJhbmRfcG9zdGFtYmxlW11bNV0gPSB7CisJLyogIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAqLworCXsweDAwMDA5ODEwLCAweGQwMGE4MDA1LCAweGQwMGE4MDA1LCAweGQwMGE4MDA1LCAweGQwMGE4MDA1fSwKKwl7MHgwMDAwOTgyMCwgMHgyMDZhMDAyZSwgMHgyMDZhMDAyZSwgMHgyMDZhMDAyZSwgMHgyMDZhMDAyZX0sCisJezB4MDAwMDk4MjQsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDAsIDB4NWFjNjQwZDB9LAorCXsweDAwMDA5ODI4LCAweDA2OTAzMDgxLCAweDA2OTAzMDgxLCAweDA2OTAzODgxLCAweDA2OTAzODgxfSwKKwl7MHgwMDAwOTgyYywgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNCwgMHgwNWVlYTZkNH0sCisJezB4MDAwMDk4MzAsIDB4MDAwMDA1OWMsIDB4MDAwMDA1OWMsIDB4MDAwMDA1OWMsIDB4MDAwMDA1OWN9LAorCXsweDAwMDA5YzAwLCAweDAwMDAwMDQ0LCAweDAwMDAwMDQ0LCAweDAwMDAwMDQ0LCAweDAwMDAwMDQ0fSwKKwl7MHgwMDAwOWUwMCwgMHgwMzcyMTYxZSwgMHgwMzcyMTYxZSwgMHgwMzcyMTZhNCwgMHgwMzcyMTZhNH0sCisJezB4MDAwMDllMDQsIDB4MDAxODIwMjAsIDB4MDAxODIwMjAsIDB4MDAxODIwMjAsIDB4MDAxODIwMjB9LAorCXsweDAwMDA5ZTBjLCAweDZjNDAwMGUyLCAweDZkNDAwMGUyLCAweDZkNDAwMGUyLCAweDZjNDAwMGUyfSwKKwl7MHgwMDAwOWUxMCwgMHg3ZWM4MGQyZSwgMHg3ZWM4MGQyZSwgMHg3ZWM4MGQyZSwgMHg3ZWM4MGQyZX0sCisJezB4MDAwMDllMTQsIDB4MzEzOTVkNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTYwNWUsIDB4MzEzOTVkNWV9LAorCXsweDAwMDA5ZTE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWUxYywgMHgwMDAxY2Y5YywgMHgwMDAxY2Y5YywgMHgwMDAyMWY5YywgMHgwMDAyMWY5Y30sCisJezB4MDAwMDllMjAsIDB4MDAwMDAzYjUsIDB4MDAwMDAzYjUsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2V9LAorCXsweDAwMDA5ZTJjLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAweDAwMDAzMjIxLCAweDAwMDAzMjIxfSwKKwl7MHgwMDAwOWUzYywgMHhjZjk0NjIyMiwgMHhjZjk0NjIyMiwgMHhjZjk0NjIyMiwgMHhjZjk0NjIyMn0sCisJezB4MDAwMDllNDQsIDB4MDIzMjFlMjcsIDB4MDIzMjFlMjcsIDB4MDIyODIzMjQsIDB4MDIyODIzMjR9LAorCXsweDAwMDA5ZTQ4LCAweDUwMzAyMDFhLCAweDUwMzAyMDFhLCAweDUwMzAyMDEwLCAweDUwMzAyMDEwfSwKKwl7MHgwMDAwOWZjOCwgMHgwMDAzZjAwMCwgMHgwMDAzZjAwMCwgMHgwMDAxYTAwMCwgMHgwMDAxYTAwMH0sCisJezB4MDAwMGEyMDQsIDB4MDAwMDNmYzAsIDB4MDAwMDNmYzQsIDB4MDAwMDNmYzQsIDB4MDAwMDNmYzB9LAorCXsweDAwMDBhMjA4LCAweDAwMDAwMTA0LCAweDAwMDAwMTA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0fSwKKwl7MHgwMDAwYTIzMCwgMHgwMDAwMDAwYSwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNiwgMHgwMDAwMDAwYn0sCisJezB4MDAwMGEyMzQsIDB4MDAwMDBmZmYsIDB4MDAwMDBmZmYsIDB4MTAwMDBmZmYsIDB4MDAwMDBmZmZ9LAorCXsweDAwMDBhMjM4LCAweGZmYjgxMDE4LCAweGZmYjgxMDE4LCAweGZmYjgxMDE4LCAweGZmYjgxMDE4fSwKKwl7MHgwMDAwYTI1MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDIxMCwgMHgwMDAwMDEwOH0sCisJezB4MDAwMGEyNTQsIDB4MDAwMDA3ZDAsIDB4MDAwMDBmYTAsIDB4MDAwMDExMzAsIDB4MDAwMDA4OTh9LAorCXsweDAwMDBhMjU4LCAweDAyMDIwMDAyLCAweDAyMDIwMDAyLCAweDAyMDIwMDAyLCAweDAyMDIwMDAyfSwKKwl7MHgwMDAwYTI1YywgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZSwgMHgwMTAwMGUwZX0sCisJezB4MDAwMGEyNjAsIDB4M2EwMjE1MDEsIDB4M2EwMjE1MDEsIDB4M2EwMjE1MDEsIDB4M2EwMjE1MDF9LAorCXsweDAwMDBhMjY0LCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlfSwKKwl7MHgwMDAwYTI4MCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwYiwgMHgwMDAwMDAwYn0sCisJezB4MDAwMGEyODQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjg4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI4YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyYzQsIDB4MDAxNThkMTgsIDB4MDAxNThkMTgsIDB4MDAxNThkMTgsIDB4MDAxNThkMTh9LAorCXsweDAwMDBhMmQwLCAweDAwMDcxOTgxLCAweDAwMDcxOTgxLCAweDAwMDcxOTgxLCAweDAwMDcxOTgxfSwKKwl7MHgwMDAwYTJkOCwgMHhmOTk5YTgzYSwgMHhmOTk5YTgzYSwgMHhmOTk5YTgzYSwgMHhmOTk5YTgzYX0sCisJezB4MDAwMGEzNTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhZTA0LCAweDAwODAyMDIwLCAweDAwODAyMDIwLCAweDAwODAyMDIwLCAweDAwODAyMDIwfSwKKwl7MHgwMDAwYWUxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV9tb2Rlc19oaWdoX29iX2RiX3R4X2dhaW5fMXAyW11bNV0gPSB7CisJLyogIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAqLworCXsweDAwMDBhNDEwLCAweDAwMDA1MGQ3LCAweDAwMDA1MGQ3LCAweDAwMDA1MGQ3LCAweDAwMDA1MGQ3fSwKKwl7MHgwMDAwYTUwMCwgMHgwMDAyMjIwMCwgMHgwMDAyMjIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE1MDQsIDB4MDUwNjIwMDIsIDB4MDUwNjIwMDIsIDB4MDQwMDAwMDIsIDB4MDQwMDAwMDJ9LAorCXsweDAwMDBhNTA4LCAweDBjMDAyZTAwLCAweDBjMDAyZTAwLCAweDA4MDAwMDA0LCAweDA4MDAwMDA0fSwKKwl7MHgwMDAwYTUwYywgMHgxMTA2MjIwMiwgMHgxMTA2MjIwMiwgMHgwZDAwMDIwMCwgMHgwZDAwMDIwMH0sCisJezB4MDAwMGE1MTAsIDB4MTcwMjJlMDAsIDB4MTcwMjJlMDAsIDB4MTEwMDAyMDIsIDB4MTEwMDAyMDJ9LAorCXsweDAwMDBhNTE0LCAweDFkMDAwZWMyLCAweDFkMDAwZWMyLCAweDE1MDAwNDAwLCAweDE1MDAwNDAwfSwKKwl7MHgwMDAwYTUxOCwgMHgyNTAyMGVjMCwgMHgyNTAyMGVjMCwgMHgxOTAwMDQwMiwgMHgxOTAwMDQwMn0sCisJezB4MDAwMGE1MWMsIDB4MmIwMjBlYzMsIDB4MmIwMjBlYzMsIDB4MWQwMDA0MDQsIDB4MWQwMDA0MDR9LAorCXsweDAwMDBhNTIwLCAweDJmMDAxZjA0LCAweDJmMDAxZjA0LCAweDIzMDAwYTAwLCAweDIzMDAwYTAwfSwKKwl7MHgwMDAwYTUyNCwgMHgzNTAwMWZjNCwgMHgzNTAwMWZjNCwgMHgyNzAwMGEwMiwgMHgyNzAwMGEwMn0sCisJezB4MDAwMGE1MjgsIDB4M2MwMjJmMDQsIDB4M2MwMjJmMDQsIDB4MmIwMDBhMDQsIDB4MmIwMDBhMDR9LAorCXsweDAwMDBhNTJjLCAweDQxMDIzZTg1LCAweDQxMDIzZTg1LCAweDNmMDAxNjIwLCAweDNmMDAxNjIwfSwKKwl7MHgwMDAwYTUzMCwgMHg0ODAyM2VjNiwgMHg0ODAyM2VjNiwgMHg0MTAwMTYyMSwgMHg0MTAwMTYyMX0sCisJezB4MDAwMGE1MzQsIDB4NGQwMjNmMDEsIDB4NGQwMjNmMDEsIDB4NDQwMDE2NDAsIDB4NDQwMDE2NDB9LAorCXsweDAwMDBhNTM4LCAweDUzMDIzZjRiLCAweDUzMDIzZjRiLCAweDQ2MDAxNjQxLCAweDQ2MDAxNjQxfSwKKwl7MHgwMDAwYTUzYywgMHg1YTAyN2YwOSwgMHg1YTAyN2YwOSwgMHg0ODAwMTY0MiwgMHg0ODAwMTY0Mn0sCisJezB4MDAwMGE1NDAsIDB4NWYwMjdmYzksIDB4NWYwMjdmYzksIDB4NGIwMDE2NDQsIDB4NGIwMDE2NDR9LAorCXsweDAwMDBhNTQ0LCAweDY1MDJmZWNhLCAweDY1MDJmZWNhLCAweDRlMDAxYTgxLCAweDRlMDAxYTgxfSwKKwl7MHgwMDAwYTU0OCwgMHg2YjAyZmY0YSwgMHg2YjAyZmY0YSwgMHg1MTAwMWE4MywgMHg1MTAwMWE4M30sCisJezB4MDAwMGE1NGMsIDB4NzIwM2ZlY2EsIDB4NzIwM2ZlY2EsIDB4NTQwMDFjODQsIDB4NTQwMDFjODR9LAorCXsweDAwMDBhNTUwLCAweDc3MDNmZjBiLCAweDc3MDNmZjBiLCAweDU3MDAxY2UzLCAweDU3MDAxY2UzfSwKKwl7MHgwMDAwYTU1NCwgMHg3ZDA2ZmZjYiwgMHg3ZDA2ZmZjYiwgMHg1YjAwMWNlNSwgMHg1YjAwMWNlNX0sCisJezB4MDAwMGE1NTgsIDB4ODQwN2ZmMGIsIDB4ODQwN2ZmMGIsIDB4NWYwMDFjZTksIDB4NWYwMDFjZTl9LAorCXsweDAwMDBhNTVjLCAweDg5MDdmZmNiLCAweDg5MDdmZmNiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU2MCwgMHg5MDBmZmYwYiwgMHg5MDBmZmYwYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1NjQsIDB4OTYwZmZmY2IsIDB4OTYwZmZmY2IsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTY4LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU2YywgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1NzAsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTc0LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU3OCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1N2MsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTgwLCAweDAwMDIyMjAwLCAweDAwMDIyMjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTU4NCwgMHgwNTA2MjAwMiwgMHgwNTA2MjAwMiwgMHgwNDAwMDAwMiwgMHgwNDAwMDAwMn0sCisJezB4MDAwMGE1ODgsIDB4MGMwMDJlMDAsIDB4MGMwMDJlMDAsIDB4MDgwMDAwMDQsIDB4MDgwMDAwMDR9LAorCXsweDAwMDBhNThjLCAweDExMDYyMjAyLCAweDExMDYyMjAyLCAweDBiMDAwMjAwLCAweDBiMDAwMjAwfSwKKwl7MHgwMDAwYTU5MCwgMHgxNzAyMmUwMCwgMHgxNzAyMmUwMCwgMHgwZjAwMDIwMiwgMHgwZjAwMDIwMn0sCisJezB4MDAwMGE1OTQsIDB4MWQwMDBlYzIsIDB4MWQwMDBlYzIsIDB4MTEwMDA0MDAsIDB4MTEwMDA0MDB9LAorCXsweDAwMDBhNTk4LCAweDI1MDIwZWMwLCAweDI1MDIwZWMwLCAweDE1MDAwNDAyLCAweDE1MDAwNDAyfSwKKwl7MHgwMDAwYTU5YywgMHgyYjAyMGVjMywgMHgyYjAyMGVjMywgMHgxOTAwMDQwNCwgMHgxOTAwMDQwNH0sCisJezB4MDAwMGE1YTAsIDB4MmYwMDFmMDQsIDB4MmYwMDFmMDQsIDB4MWIwMDA2MDMsIDB4MWIwMDA2MDN9LAorCXsweDAwMDBhNWE0LCAweDM1MDAxZmM0LCAweDM1MDAxZmM0LCAweDFmMDAwYTAyLCAweDFmMDAwYTAyfSwKKwl7MHgwMDAwYTVhOCwgMHgzYzAyMmYwNCwgMHgzYzAyMmYwNCwgMHgyMzAwMGEwNCwgMHgyMzAwMGEwNH0sCisJezB4MDAwMGE1YWMsIDB4NDEwMjNlODUsIDB4NDEwMjNlODUsIDB4MjYwMDBhMjAsIDB4MjYwMDBhMjB9LAorCXsweDAwMDBhNWIwLCAweDQ4MDIzZWM2LCAweDQ4MDIzZWM2LCAweDJhMDAwZTIwLCAweDJhMDAwZTIwfSwKKwl7MHgwMDAwYTViNCwgMHg0ZDAyM2YwMSwgMHg0ZDAyM2YwMSwgMHgyZTAwMGUyMiwgMHgyZTAwMGUyMn0sCisJezB4MDAwMGE1YjgsIDB4NTMwMjNmNGIsIDB4NTMwMjNmNGIsIDB4MzEwMDBlMjQsIDB4MzEwMDBlMjR9LAorCXsweDAwMDBhNWJjLCAweDVhMDI3ZjA5LCAweDVhMDI3ZjA5LCAweDM0MDAxNjQwLCAweDM0MDAxNjQwfSwKKwl7MHgwMDAwYTVjMCwgMHg1ZjAyN2ZjOSwgMHg1ZjAyN2ZjOSwgMHgzODAwMTY2MCwgMHgzODAwMTY2MH0sCisJezB4MDAwMGE1YzQsIDB4NjUwMmZlY2EsIDB4NjUwMmZlY2EsIDB4M2IwMDE4NjEsIDB4M2IwMDE4NjF9LAorCXsweDAwMDBhNWM4LCAweDZiMDJmZjRhLCAweDZiMDJmZjRhLCAweDNlMDAxYTgxLCAweDNlMDAxYTgxfSwKKwl7MHgwMDAwYTVjYywgMHg3MjAzZmVjYSwgMHg3MjAzZmVjYSwgMHg0MjAwMWE4MywgMHg0MjAwMWE4M30sCisJezB4MDAwMGE1ZDAsIDB4NzcwM2ZmMGIsIDB4NzcwM2ZmMGIsIDB4NDQwMDFjODQsIDB4NDQwMDFjODR9LAorCXsweDAwMDBhNWQ0LCAweDdkMDZmZmNiLCAweDdkMDZmZmNiLCAweDQ4MDAxY2UzLCAweDQ4MDAxY2UzfSwKKwl7MHgwMDAwYTVkOCwgMHg4NDA3ZmYwYiwgMHg4NDA3ZmYwYiwgMHg0YzAwMWNlNSwgMHg0YzAwMWNlNX0sCisJezB4MDAwMGE1ZGMsIDB4ODkwN2ZmY2IsIDB4ODkwN2ZmY2IsIDB4NTAwMDFjZTksIDB4NTAwMDFjZTl9LAorCXsweDAwMDBhNWUwLCAweDkwMGZmZjBiLCAweDkwMGZmZjBiLCAweDU0MDAxY2ViLCAweDU0MDAxY2VifSwKKwl7MHgwMDAwYTVlNCwgMHg5NjBmZmZjYiwgMHg5NjBmZmZjYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZTgsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWVjLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVmMCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZjQsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWY4LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVmYywgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE2MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYxNCwgMHgwMTQwNDAwMCwgMHgwMTQwNDAwMCwgMHgwMTQwNDAwMCwgMHgwMTQwNDAwMH0sCisJezB4MDAwMGE2MTgsIDB4MDIwMDg1MDEsIDB4MDIwMDg1MDEsIDB4MDIwMDg1MDEsIDB4MDIwMDg1MDF9LAorCXsweDAwMDBhNjFjLCAweDAyMDA4ODAyLCAweDAyMDA4ODAyLCAweDAyMDA4ODAyLCAweDAyMDA4ODAyfSwKKwl7MHgwMDAwYTYyMCwgMHgwMzAwYzgwMiwgMHgwMzAwYzgwMiwgMHgwMzAwYzgwMiwgMHgwMzAwYzgwMn0sCisJezB4MDAwMGE2MjQsIDB4MDMwMGNjMDMsIDB4MDMwMGNjMDMsIDB4MDMwMGNjMDMsIDB4MDMwMGNjMDN9LAorCXsweDAwMDBhNjI4LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0fSwKKwl7MHgwMDAwYTYyYywgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNH0sCisJezB4MDAwMGE2MzAsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDR9LAorCXsweDAwMDBhNjM0LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0fSwKKwl7MHgwMDAwYTYzOCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNH0sCisJezB4MDAwMGE2M2MsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDR9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMzFfbW9kZXNfbG93X29iX2RiX3R4X2dhaW5fMXAyW11bNV0gPSB7CisJLyogIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAqLworCXsweDAwMDBhNDEwLCAweDAwMDA1MGQ3LCAweDAwMDA1MGQ3LCAweDAwMDA1MGQ3LCAweDAwMDA1MGQ3fSwKKwl7MHgwMDAwYTUwMCwgMHgwMDAyMjIwMCwgMHgwMDAyMjIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE1MDQsIDB4MDUwNjIwMDIsIDB4MDUwNjIwMDIsIDB4MDQwMDAwMDIsIDB4MDQwMDAwMDJ9LAorCXsweDAwMDBhNTA4LCAweDBjMDAyZTAwLCAweDBjMDAyZTAwLCAweDA4MDAwMDA0LCAweDA4MDAwMDA0fSwKKwl7MHgwMDAwYTUwYywgMHgxMTA2MjIwMiwgMHgxMTA2MjIwMiwgMHgwZDAwMDIwMCwgMHgwZDAwMDIwMH0sCisJezB4MDAwMGE1MTAsIDB4MTcwMjJlMDAsIDB4MTcwMjJlMDAsIDB4MTEwMDAyMDIsIDB4MTEwMDAyMDJ9LAorCXsweDAwMDBhNTE0LCAweDFkMDAwZWMyLCAweDFkMDAwZWMyLCAweDE1MDAwNDAwLCAweDE1MDAwNDAwfSwKKwl7MHgwMDAwYTUxOCwgMHgyNTAyMGVjMCwgMHgyNTAyMGVjMCwgMHgxOTAwMDQwMiwgMHgxOTAwMDQwMn0sCisJezB4MDAwMGE1MWMsIDB4MmIwMjBlYzMsIDB4MmIwMjBlYzMsIDB4MWQwMDA0MDQsIDB4MWQwMDA0MDR9LAorCXsweDAwMDBhNTIwLCAweDJmMDAxZjA0LCAweDJmMDAxZjA0LCAweDIzMDAwYTAwLCAweDIzMDAwYTAwfSwKKwl7MHgwMDAwYTUyNCwgMHgzNTAwMWZjNCwgMHgzNTAwMWZjNCwgMHgyNzAwMGEwMiwgMHgyNzAwMGEwMn0sCisJezB4MDAwMGE1MjgsIDB4M2MwMjJmMDQsIDB4M2MwMjJmMDQsIDB4MmIwMDBhMDQsIDB4MmIwMDBhMDR9LAorCXsweDAwMDBhNTJjLCAweDQxMDIzZTg1LCAweDQxMDIzZTg1LCAweDNmMDAxNjIwLCAweDNmMDAxNjIwfSwKKwl7MHgwMDAwYTUzMCwgMHg0ODAyM2VjNiwgMHg0ODAyM2VjNiwgMHg0MTAwMTYyMSwgMHg0MTAwMTYyMX0sCisJezB4MDAwMGE1MzQsIDB4NGQwMjNmMDEsIDB4NGQwMjNmMDEsIDB4NDQwMDE2NDAsIDB4NDQwMDE2NDB9LAorCXsweDAwMDBhNTM4LCAweDUzMDIzZjRiLCAweDUzMDIzZjRiLCAweDQ2MDAxNjQxLCAweDQ2MDAxNjQxfSwKKwl7MHgwMDAwYTUzYywgMHg1YTAyN2YwOSwgMHg1YTAyN2YwOSwgMHg0ODAwMTY0MiwgMHg0ODAwMTY0Mn0sCisJezB4MDAwMGE1NDAsIDB4NWYwMjdmYzksIDB4NWYwMjdmYzksIDB4NGIwMDE2NDQsIDB4NGIwMDE2NDR9LAorCXsweDAwMDBhNTQ0LCAweDY1MDJmZWNhLCAweDY1MDJmZWNhLCAweDRlMDAxYTgxLCAweDRlMDAxYTgxfSwKKwl7MHgwMDAwYTU0OCwgMHg2YjAyZmY0YSwgMHg2YjAyZmY0YSwgMHg1MTAwMWE4MywgMHg1MTAwMWE4M30sCisJezB4MDAwMGE1NGMsIDB4NzIwM2ZlY2EsIDB4NzIwM2ZlY2EsIDB4NTQwMDFjODQsIDB4NTQwMDFjODR9LAorCXsweDAwMDBhNTUwLCAweDc3MDNmZjBiLCAweDc3MDNmZjBiLCAweDU3MDAxY2UzLCAweDU3MDAxY2UzfSwKKwl7MHgwMDAwYTU1NCwgMHg3ZDA2ZmZjYiwgMHg3ZDA2ZmZjYiwgMHg1YjAwMWNlNSwgMHg1YjAwMWNlNX0sCisJezB4MDAwMGE1NTgsIDB4ODQwN2ZmMGIsIDB4ODQwN2ZmMGIsIDB4NWYwMDFjZTksIDB4NWYwMDFjZTl9LAorCXsweDAwMDBhNTVjLCAweDg5MDdmZmNiLCAweDg5MDdmZmNiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU2MCwgMHg5MDBmZmYwYiwgMHg5MDBmZmYwYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1NjQsIDB4OTYwZmZmY2IsIDB4OTYwZmZmY2IsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTY4LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU2YywgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1NzAsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTc0LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU3OCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1N2MsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTgwLCAweDAwMDIyMjAwLCAweDAwMDIyMjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTU4NCwgMHgwNTA2MjAwMiwgMHgwNTA2MjAwMiwgMHgwNDAwMDAwMiwgMHgwNDAwMDAwMn0sCisJezB4MDAwMGE1ODgsIDB4MGMwMDJlMDAsIDB4MGMwMDJlMDAsIDB4MDgwMDAwMDQsIDB4MDgwMDAwMDR9LAorCXsweDAwMDBhNThjLCAweDExMDYyMjAyLCAweDExMDYyMjAyLCAweDBiMDAwMjAwLCAweDBiMDAwMjAwfSwKKwl7MHgwMDAwYTU5MCwgMHgxNzAyMmUwMCwgMHgxNzAyMmUwMCwgMHgwZjAwMDIwMiwgMHgwZjAwMDIwMn0sCisJezB4MDAwMGE1OTQsIDB4MWQwMDBlYzIsIDB4MWQwMDBlYzIsIDB4MTEwMDA0MDAsIDB4MTEwMDA0MDB9LAorCXsweDAwMDBhNTk4LCAweDI1MDIwZWMwLCAweDI1MDIwZWMwLCAweDE1MDAwNDAyLCAweDE1MDAwNDAyfSwKKwl7MHgwMDAwYTU5YywgMHgyYjAyMGVjMywgMHgyYjAyMGVjMywgMHgxOTAwMDQwNCwgMHgxOTAwMDQwNH0sCisJezB4MDAwMGE1YTAsIDB4MmYwMDFmMDQsIDB4MmYwMDFmMDQsIDB4MWIwMDA2MDMsIDB4MWIwMDA2MDN9LAorCXsweDAwMDBhNWE0LCAweDM1MDAxZmM0LCAweDM1MDAxZmM0LCAweDFmMDAwYTAyLCAweDFmMDAwYTAyfSwKKwl7MHgwMDAwYTVhOCwgMHgzYzAyMmYwNCwgMHgzYzAyMmYwNCwgMHgyMzAwMGEwNCwgMHgyMzAwMGEwNH0sCisJezB4MDAwMGE1YWMsIDB4NDEwMjNlODUsIDB4NDEwMjNlODUsIDB4MjYwMDBhMjAsIDB4MjYwMDBhMjB9LAorCXsweDAwMDBhNWIwLCAweDQ4MDIzZWM2LCAweDQ4MDIzZWM2LCAweDJhMDAwZTIwLCAweDJhMDAwZTIwfSwKKwl7MHgwMDAwYTViNCwgMHg0ZDAyM2YwMSwgMHg0ZDAyM2YwMSwgMHgyZTAwMGUyMiwgMHgyZTAwMGUyMn0sCisJezB4MDAwMGE1YjgsIDB4NTMwMjNmNGIsIDB4NTMwMjNmNGIsIDB4MzEwMDBlMjQsIDB4MzEwMDBlMjR9LAorCXsweDAwMDBhNWJjLCAweDVhMDI3ZjA5LCAweDVhMDI3ZjA5LCAweDM0MDAxNjQwLCAweDM0MDAxNjQwfSwKKwl7MHgwMDAwYTVjMCwgMHg1ZjAyN2ZjOSwgMHg1ZjAyN2ZjOSwgMHgzODAwMTY2MCwgMHgzODAwMTY2MH0sCisJezB4MDAwMGE1YzQsIDB4NjUwMmZlY2EsIDB4NjUwMmZlY2EsIDB4M2IwMDE4NjEsIDB4M2IwMDE4NjF9LAorCXsweDAwMDBhNWM4LCAweDZiMDJmZjRhLCAweDZiMDJmZjRhLCAweDNlMDAxYTgxLCAweDNlMDAxYTgxfSwKKwl7MHgwMDAwYTVjYywgMHg3MjAzZmVjYSwgMHg3MjAzZmVjYSwgMHg0MjAwMWE4MywgMHg0MjAwMWE4M30sCisJezB4MDAwMGE1ZDAsIDB4NzcwM2ZmMGIsIDB4NzcwM2ZmMGIsIDB4NDQwMDFjODQsIDB4NDQwMDFjODR9LAorCXsweDAwMDBhNWQ0LCAweDdkMDZmZmNiLCAweDdkMDZmZmNiLCAweDQ4MDAxY2UzLCAweDQ4MDAxY2UzfSwKKwl7MHgwMDAwYTVkOCwgMHg4NDA3ZmYwYiwgMHg4NDA3ZmYwYiwgMHg0YzAwMWNlNSwgMHg0YzAwMWNlNX0sCisJezB4MDAwMGE1ZGMsIDB4ODkwN2ZmY2IsIDB4ODkwN2ZmY2IsIDB4NTAwMDFjZTksIDB4NTAwMDFjZTl9LAorCXsweDAwMDBhNWUwLCAweDkwMGZmZjBiLCAweDkwMGZmZjBiLCAweDU0MDAxY2ViLCAweDU0MDAxY2VifSwKKwl7MHgwMDAwYTVlNCwgMHg5NjBmZmZjYiwgMHg5NjBmZmZjYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZTgsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWVjLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVmMCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZjQsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWY4LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVmYywgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE2MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYxNCwgMHgwMTQwNDAwMCwgMHgwMTQwNDAwMCwgMHgwMTQwNDAwMCwgMHgwMTQwNDAwMH0sCisJezB4MDAwMGE2MTgsIDB4MDIwMDg1MDEsIDB4MDIwMDg1MDEsIDB4MDIwMDg1MDEsIDB4MDIwMDg1MDF9LAorCXsweDAwMDBhNjFjLCAweDAyMDA4ODAyLCAweDAyMDA4ODAyLCAweDAyMDA4ODAyLCAweDAyMDA4ODAyfSwKKwl7MHgwMDAwYTYyMCwgMHgwMzAwYzgwMiwgMHgwMzAwYzgwMiwgMHgwMzAwYzgwMiwgMHgwMzAwYzgwMn0sCisJezB4MDAwMGE2MjQsIDB4MDMwMGNjMDMsIDB4MDMwMGNjMDMsIDB4MDMwMGNjMDMsIDB4MDMwMGNjMDN9LAorCXsweDAwMDBhNjI4LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0fSwKKwl7MHgwMDAwYTYyYywgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNH0sCisJezB4MDAwMGE2MzAsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDR9LAorCXsweDAwMDBhNjM0LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0fSwKKwl7MHgwMDAwYTYzOCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNH0sCisJezB4MDAwMGE2M2MsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDR9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMzFfMXAyX2Jhc2ViYW5kX2NvcmVfdHhmaXJfY29lZmZfamFwYW5fMjQ4NFtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwYTM5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzOWMsIDB4NmY3ZjAzMDF9LAorCXsweDAwMDBhM2EwLCAweGNhOTIyOGVlfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzMxXzFwMl94dGFsXzI1TVtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwNzAzOCwgMHgwMDAwMDJmOH0sCisJezB4MDAwMDgyNDQsIDB4MDAxMGYzZDd9LAorCXsweDAwMDA4MjRjLCAweDAwMDFlN2FlfSwKKwl7MHgwMDAxNjA5YywgMHgwZjUwOGYyOX0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV8xcDJfcmFkaW9fY29yZVtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAxNjAwMCwgMHgzNmRiNmRiNn0sCisJezB4MDAwMTYwMDQsIDB4NmRiNmRiNDB9LAorCXsweDAwMDE2MDA4LCAweDczODAwMDAwfSwKKwl7MHgwMDAxNjAwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYwNDAsIDB4N2Y4MGZmZjh9LAorCXsweDAwMDE2MDQ0LCAweDAzZDZkMmRifSwKKwl7MHgwMDAxNjA0OCwgMHg2YzkyNDI2OH0sCisJezB4MDAwMTYwNGMsIDB4MDAwZjAyNzh9LAorCXsweDAwMDE2MDUwLCAweDRkYjZkYjhjfSwKKwl7MHgwMDAxNjA1NCwgMHg2ZGI2MDAwMH0sCisJezB4MDAwMTYwODAsIDB4MDAwODAwMDB9LAorCXsweDAwMDE2MDg0LCAweDBlNDgwNDhjfSwKKwl7MHgwMDAxNjA4OCwgMHgxNDIxNDUxNH0sCisJezB4MDAwMTYwOGMsIDB4MTE5ZjA4MWN9LAorCXsweDAwMDE2MDkwLCAweDI0OTI2NDkwfSwKKwl7MHgwMDAxNjA5OCwgMHhkNDExZWI4NH0sCisJezB4MDAwMTYwYTAsIDB4YzIxMDhmZmV9LAorCXsweDAwMDE2MGE0LCAweDgxMmZjMzcwfSwKKwl7MHgwMDAxNjBhOCwgMHg0MjNjODAwMH0sCisJezB4MDAwMTYwYWMsIDB4MjQ2NTE4MDB9LAorCXsweDAwMDE2MGIwLCAweDAzMjg0ZjNlfSwKKwl7MHgwMDAxNjBiNCwgMHg5MjQ4MDA0MH0sCisJezB4MDAwMTYwYzAsIDB4MDA2ZGI2ZGJ9LAorCXsweDAwMDE2MGM0LCAweDAxODZkYjYwfSwKKwl7MHgwMDAxNjBjOCwgMHg2ZGI2ZGI2Y30sCisJezB4MDAwMTYwY2MsIDB4NmRlNmMzMDB9LAorCXsweDAwMDE2MGQwLCAweDE0NTAwODIwfSwKKwl7MHgwMDAxNjEwMCwgMHgwNGNiMDAwMX0sCisJezB4MDAwMTYxMDQsIDB4ZmZmODAwMTV9LAorCXsweDAwMDE2MTA4LCAweDAwMDgwMDEwfSwKKwl7MHgwMDAxNjEwYywgMHgwMDE3MDAwMH0sCisJezB4MDAwMTYxNDAsIDB4MTA4MDQwMDB9LAorCXsweDAwMDE2MTQ0LCAweDAxODg0MDgwfSwKKwl7MHgwMDAxNjE0OCwgMHgwMDAwODBjMH0sCisJezB4MDAwMTYyODAsIDB4MDEwMDAwMTV9LAorCXsweDAwMDE2Mjg0LCAweDE0ZDIwMDAwfSwKKwl7MHgwMDAxNjI4OCwgMHgwMDMxODAwMH0sCisJezB4MDAwMTYyOGMsIDB4NTAwMDAwMDB9LAorCXsweDAwMDE2MjkwLCAweDRiOTYyMTBmfSwKKwl7MHgwMDAxNjM4MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzODQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2Mzg4LCAweDAwODAwNzAwfSwKKwl7MHgwMDAxNjM4YywgMHgwMDgwMDcwMH0sCisJezB4MDAwMTYzOTAsIDB4MDA4MDA3MDB9LAorCXsweDAwMDE2Mzk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjM5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzOWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2EwLCAweDAwMDAwMDAxfSwKKwl7MHgwMDAxNjNhNCwgMHgwMDAwMDAwMX0sCisJezB4MDAwMTYzYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2FjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjNiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDE2M2I4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjNiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMTYzYzAsIDB4MDAwMDAwYTB9LAorCXsweDAwMDE2M2M0LCAweDAwMGMwMDAwfSwKKwl7MHgwMDAxNjNjOCwgMHgxNDAyMTQwMn0sCisJezB4MDAwMTYzY2MsIDB4MDAwMDE0MDJ9LAorCXsweDAwMDE2M2QwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAxNjNkNCwgMHgwMDAwMDAwMH0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV8xcDJfc29jX3Bvc3RhbWJsZVtdWzVdID0geworCS8qICBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgKi8KKwl7MHgwMDAwNzAxMCwgMHgwMDAwMDAyMiwgMHgwMDAwMDAyMiwgMHgwMDAwMDAyMiwgMHgwMDAwMDAyMn0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV9jb21tb25fd29feGxuYV9yeF9nYWluXzFwMltdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwYTAwMCwgMHgwMDA2MDAwNX0sCisJezB4MDAwMGEwMDQsIDB4MDA4MTAwODB9LAorCXsweDAwMDBhMDA4LCAweDAwODMwMDgyfSwKKwl7MHgwMDAwYTAwYywgMHgwMDg1MDA4NH0sCisJezB4MDAwMGEwMTAsIDB4MDE4MjAxODF9LAorCXsweDAwMDBhMDE0LCAweDAxODQwMTgzfSwKKwl7MHgwMDAwYTAxOCwgMHgwMTg4MDE4NX0sCisJezB4MDAwMGEwMWMsIDB4MDE4YTAxODl9LAorCXsweDAwMDBhMDIwLCAweDAyODUwMjg0fSwKKwl7MHgwMDAwYTAyNCwgMHgwMjg5MDI4OH0sCisJezB4MDAwMGEwMjgsIDB4MDI4YjAyOGF9LAorCXsweDAwMDBhMDJjLCAweDAzODUwMzg0fSwKKwl7MHgwMDAwYTAzMCwgMHgwMzg5MDM4OH0sCisJezB4MDAwMGEwMzQsIDB4MDM4YjAzOGF9LAorCXsweDAwMDBhMDM4LCAweDAzOGQwMzhjfSwKKwl7MHgwMDAwYTAzYywgMHgwMzkxMDM5MH0sCisJezB4MDAwMGEwNDAsIDB4MDM5MzAzOTJ9LAorCXsweDAwMDBhMDQ0LCAweDAzOTUwMzk0fSwKKwl7MHgwMDAwYTA0OCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGEwNGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA2MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA2YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDc0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwN2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDgwLCAweDI4MjgyODI4fSwKKwl7MHgwMDAwYTA4NCwgMHgyODI4MjgyOH0sCisJezB4MDAwMGEwODgsIDB4MjgyODI4Mjh9LAorCXsweDAwMDBhMDhjLCAweDI4MjgyODI4fSwKKwl7MHgwMDAwYTA5MCwgMHgyODI4MjgyOH0sCisJezB4MDAwMGEwOTQsIDB4MjQyNDI0Mjh9LAorCXsweDAwMDBhMDk4LCAweDE3MWUxZTFlfSwKKwl7MHgwMDAwYTA5YywgMHgwMjAyMGIwYn0sCisJezB4MDAwMGEwYTAsIDB4MDIwMjAyMDJ9LAorCXsweDAwMDBhMGE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBjMCwgMHgyMjA3MjIwOH0sCisJezB4MDAwMGEwYzQsIDB4MjIwNTIyMDZ9LAorCXsweDAwMDBhMGM4LCAweDIyMDMyMjA0fSwKKwl7MHgwMDAwYTBjYywgMHgyMjAxMjIwMn0sCisJezB4MDAwMGEwZDAsIDB4MjIxZjIyMDB9LAorCXsweDAwMDBhMGQ0LCAweDIyMWQyMjFlfSwKKwl7MHgwMDAwYTBkOCwgMHgzMzAyMzMwM30sCisJezB4MDAwMGEwZGMsIDB4MzMwMDMzMDF9LAorCXsweDAwMDBhMGUwLCAweDMzMWUzMzFmfSwKKwl7MHgwMDAwYTBlNCwgMHg0NDAyMzMxZH0sCisJezB4MDAwMGEwZTgsIDB4NDQwMDQ0MDF9LAorCXsweDAwMDBhMGVjLCAweDQ0MWU0NDFmfSwKKwl7MHgwMDAwYTBmMCwgMHg1NTAyNTUwM30sCisJezB4MDAwMGEwZjQsIDB4NTUwMDU1MDF9LAorCXsweDAwMDBhMGY4LCAweDU1MWU1NTFmfSwKKwl7MHgwMDAwYTBmYywgMHg2NjAyNTUxZH0sCisJezB4MDAwMGExMDAsIDB4NjYwMDY2MDF9LAorCXsweDAwMDBhMTA0LCAweDY2MWU2NjFmfSwKKwl7MHgwMDAwYTEwOCwgMHg3NzAzNjYxZH0sCisJezB4MDAwMGExMGMsIDB4NzcwMTc3MDJ9LAorCXsweDAwMDBhMTEwLCAweDAwMDA3NzAwfSwKKwl7MHgwMDAwYTExNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEyMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEyYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTQwLCAweDAwMWYwMDAwfSwKKwl7MHgwMDAwYTE0NCwgMHgxMTFmMTEwMH0sCisJezB4MDAwMGExNDgsIDB4MTExZDExMWV9LAorCXsweDAwMDBhMTRjLCAweDExMWIxMTFjfSwKKwl7MHgwMDAwYTE1MCwgMHgyMjAzMjIwNH0sCisJezB4MDAwMGExNTQsIDB4MjIwMTIyMDJ9LAorCXsweDAwMDBhMTU4LCAweDIyMWYyMjAwfSwKKwl7MHgwMDAwYTE1YywgMHgyMjFkMjIxZX0sCisJezB4MDAwMGExNjAsIDB4MzMwMTMzMDJ9LAorCXsweDAwMDBhMTY0LCAweDMzMWYzMzAwfSwKKwl7MHgwMDAwYTE2OCwgMHg0NDAyMzMxZX0sCisJezB4MDAwMGExNmMsIDB4NDQwMDQ0MDF9LAorCXsweDAwMDBhMTcwLCAweDQ0MWU0NDFmfSwKKwl7MHgwMDAwYTE3NCwgMHg1NTAxNTUwMn0sCisJezB4MDAwMGExNzgsIDB4NTUxZjU1MDB9LAorCXsweDAwMDBhMTdjLCAweDY2MDI1NTFlfSwKKwl7MHgwMDAwYTE4MCwgMHg2NjAwNjYwMX0sCisJezB4MDAwMGExODQsIDB4NjYxZTY2MWZ9LAorCXsweDAwMDBhMTg4LCAweDc3MDM2NjFkfSwKKwl7MHgwMDAwYTE4YywgMHg3NzAxNzcwMn0sCisJezB4MDAwMGExOTAsIDB4MDAwMDc3MDB9LAorCXsweDAwMDBhMTk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTE5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExOWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWFjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFiMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFiYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWM0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExY2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFkNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFlMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWU4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFlYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZjAsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBhMWY0LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYTFmOCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGExZmMsIDB4MDAwMDAyOTZ9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMzFfMXAyX2Jhc2ViYW5kX2NvcmVbXVsyXSA9IHsKKwkvKiBBZGRyICAgICAgYWxsbW9kZXMgICovCisJezB4MDAwMDk4MDAsIDB4YWZlNjhlMzB9LAorCXsweDAwMDA5ODA0LCAweGZkMTRlMDAwfSwKKwl7MHgwMDAwOTgwOCwgMHg5YzBhOGY2Yn0sCisJezB4MDAwMDk4MGMsIDB4MDQ4MDAwMDB9LAorCXsweDAwMDA5ODE0LCAweDkyODBjMDBhfSwKKwl7MHgwMDAwOTgxOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4MWMsIDB4MDAwMjAwMjh9LAorCXsweDAwMDA5ODM0LCAweDVmM2NhM2RlfSwKKwl7MHgwMDAwOTgzOCwgMHgwMTA4ZWNmZn0sCisJezB4MDAwMDk4M2MsIDB4MTQ3NTA2MDB9LAorCXsweDAwMDA5ODgwLCAweDIwMWZmZjAwfSwKKwl7MHgwMDAwOTg4NCwgMHgwMDAwMTA0Mn0sCisJezB4MDAwMDk4YTQsIDB4MDAyMDA0MDB9LAorCXsweDAwMDA5OGIwLCAweDMyODQwYmJlfSwKKwl7MHgwMDAwOThkMCwgMHgwMDRiNmE4ZX0sCisJezB4MDAwMDk4ZDQsIDB4MDAwMDA4MjB9LAorCXsweDAwMDA5OGRjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOThmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDk4ZjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YzA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWMwOCwgMHgwMzIwMDAwMH0sCisJezB4MDAwMDljMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA5YzEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwOWMxNCwgMHgwMDA0NjM4NH0sCisJezB4MDAwMDljMTgsIDB4MDViNmI0NDB9LAorCXsweDAwMDA5YzFjLCAweDAwYjZiNDQwfSwKKwl7MHgwMDAwOWQwMCwgMHhjMDgwYTMzM30sCisJezB4MDAwMDlkMDQsIDB4NDAyMDZjMTB9LAorCXsweDAwMDA5ZDA4LCAweDAwOWM0MDYwfSwKKwl7MHgwMDAwOWQwYywgMHgxODgzODAwYX0sCisJezB4MDAwMDlkMTAsIDB4MDE4MzQwNjF9LAorCXsweDAwMDA5ZDE0LCAweDAwYzAwNDAwfSwKKwl7MHgwMDAwOWQxOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDllMDgsIDB4MDAzODIzM2N9LAorCXsweDAwMDA5ZTI0LCAweDk5MjdiNTE1fSwKKwl7MHgwMDAwOWUyOCwgMHgxMmVmMDIwMH0sCisJezB4MDAwMDllMzAsIDB4MDYzMzZmNzd9LAorCXsweDAwMDA5ZTM0LCAweDZhZjY1MzJmfSwKKwl7MHgwMDAwOWUzOCwgMHgwY2M4MGMwMH0sCisJezB4MDAwMDllNDAsIDB4MGQyNjE4MjB9LAorCXsweDAwMDA5ZTRjLCAweDAwMDAxMDA0fSwKKwl7MHgwMDAwOWU1MCwgMHgwMGZmMDNmMX0sCisJezB4MDAwMDlmYzAsIDB4ODAzZTQ3ODh9LAorCXsweDAwMDA5ZmM0LCAweDAwMDFlZmI1fSwKKwl7MHgwMDAwOWZjYywgMHg0MDAwMDAxNH0sCisJezB4MDAwMGEyMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMjIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTIyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyMjgsIDB4MTAwMDIzMTB9LAorCXsweDAwMDBhMjNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTI0NCwgMHgwYzAwMDAwMH0sCisJezB4MDAwMGEyYTAsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhMmMwLCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwYTJjOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyY2MsIDB4MThjNDM0MzN9LAorCXsweDAwMDBhMmQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyZTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMmU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJlOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMmYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTJmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEyZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMzQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM0YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzNTAsIDB4MDAwMGEwMDB9LAorCXsweDAwMDBhMzY0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTM3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzOTAsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhMzk0LCAweDAwMDAwNDQ0fSwKKwl7MHgwMDAwYTM5OCwgMHgwMDFmMGUwZn0sCisJezB4MDAwMGEzOWMsIDB4MDA3NTM5M2Z9LAorCXsweDAwMDBhM2EwLCAweGI3OWY2NDI3fSwKKwl7MHgwMDAwYTNhNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYTgsIDB4YWFhYWFhYWF9LAorCXsweDAwMDBhM2FjLCAweDNjNDY2NDc4fSwKKwl7MHgwMDAwYTNjMCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzYzQsIDB4MjIyMjIyMjB9LAorCXsweDAwMDBhM2M4LCAweDIwMjAwMDIwfSwKKwl7MHgwMDAwYTNjYywgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZDAsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2Q0LCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNkOCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZGMsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2UwLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNlNCwgMHgyMDIwMjAyMH0sCisJezB4MDAwMGEzZTgsIDB4MjAyMDIwMjB9LAorCXsweDAwMDBhM2VjLCAweDIwMjAyMDIwfSwKKwl7MHgwMDAwYTNmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzZjQsIDB4MDAwMDAwMDZ9LAorCXsweDAwMDBhM2Y4LCAweDBjZGJkMzgwfSwKKwl7MHgwMDAwYTNmYywgMHgwMDBmMGYwMX0sCisJezB4MDAwMGE0MDAsIDB4OGZhOTFmMDF9LAorCXsweDAwMDBhNDA0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTQwOCwgMHgwZTc5ZTVjNn0sCisJezB4MDAwMGE0MGMsIDB4MDA4MjA4MjB9LAorCXsweDAwMDBhNDE0LCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTQxOCwgMHgyZDAwMWRjZX0sCisJezB4MDAwMGE0MWMsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhNDIwLCAweDAwMDAwMWNlfSwKKwl7MHgwMDAwYTQyNCwgMHgxY2U3MzljZX0sCisJezB4MDAwMGE0MjgsIDB4MDAwMDAxY2V9LAorCXsweDAwMDBhNDJjLCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTQzMCwgMHgxY2U3MzljZX0sCisJezB4MDAwMGE0MzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNDM4LCAweDAwMDAxODAxfSwKKwl7MHgwMDAwYTQzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE0NDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNDQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTQ0OCwgMHgwNDAwMDAwMH0sCisJezB4MDAwMGE0NGMsIDB4MDAwMDAwMDF9LAorCXsweDAwMDBhNDUwLCAweDAwMDEwMDAwfSwKKwl7MHgwMDAwYTQ1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2NDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjQ0LCAweDNmYWQ5ZDc0fSwKKwl7MHgwMDAwYTY0OCwgMHgwMDQ4MDYwYX0sCisJezB4MDAwMGE2NGMsIDB4MDAwMDNjMzd9LAorCXsweDAwMDBhNjcwLCAweDAzMDIwMTAwfSwKKwl7MHgwMDAwYTY3NCwgMHgwOTA4MDUwNH0sCisJezB4MDAwMGE2NzgsIDB4MGQwYzBiMGF9LAorCXsweDAwMDBhNjdjLCAweDEzMTIxMTEwfSwKKwl7MHgwMDAwYTY4MCwgMHgzMTMwMTUxNH0sCisJezB4MDAwMGE2ODQsIDB4MzUzNDMzMzJ9LAorCXsweDAwMDBhNjg4LCAweDAwMDAwMDM2fSwKKwl7MHgwMDAwYTY5MCwgMHgwMDAwMDgzOH0sCisJezB4MDAwMGE3YzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhN2M0LCAweGZmZmZmZmZjfSwKKwl7MHgwMDAwYTdjOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE3Y2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhN2QwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTdkNCwgMHgwMDAwMDAwNH0sCisJezB4MDAwMGE3ZGMsIDB4MDAwMDAwMDF9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMzFfbW9kZXNfaGlnaF9wb3dlcl90eF9nYWluXzFwMltdWzVdID0geworCS8qICBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgKi8KKwl7MHgwMDAwYTQxMCwgMHgwMDAwNTBkNywgMHgwMDAwNTBkNywgMHgwMDAwNTBkNywgMHgwMDAwNTBkN30sCisJezB4MDAwMGE1MDAsIDB4MDAwMjIyMDAsIDB4MDAwMjIyMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNTA0LCAweDA1MDYyMDAyLCAweDA1MDYyMDAyLCAweDA0MDAwMDAyLCAweDA0MDAwMDAyfSwKKwl7MHgwMDAwYTUwOCwgMHgwYzAwMmUwMCwgMHgwYzAwMmUwMCwgMHgwODAwMDAwNCwgMHgwODAwMDAwNH0sCisJezB4MDAwMGE1MGMsIDB4MTEwNjIyMDIsIDB4MTEwNjIyMDIsIDB4MGQwMDAyMDAsIDB4MGQwMDAyMDB9LAorCXsweDAwMDBhNTEwLCAweDE3MDIyZTAwLCAweDE3MDIyZTAwLCAweDExMDAwMjAyLCAweDExMDAwMjAyfSwKKwl7MHgwMDAwYTUxNCwgMHgxZDAwMGVjMiwgMHgxZDAwMGVjMiwgMHgxNTAwMDQwMCwgMHgxNTAwMDQwMH0sCisJezB4MDAwMGE1MTgsIDB4MjUwMjBlYzAsIDB4MjUwMjBlYzAsIDB4MTkwMDA0MDIsIDB4MTkwMDA0MDJ9LAorCXsweDAwMDBhNTFjLCAweDJiMDIwZWMzLCAweDJiMDIwZWMzLCAweDFkMDAwNDA0LCAweDFkMDAwNDA0fSwKKwl7MHgwMDAwYTUyMCwgMHgyZjAwMWYwNCwgMHgyZjAwMWYwNCwgMHgyMzAwMGEwMCwgMHgyMzAwMGEwMH0sCisJezB4MDAwMGE1MjQsIDB4MzUwMDFmYzQsIDB4MzUwMDFmYzQsIDB4MjcwMDBhMDIsIDB4MjcwMDBhMDJ9LAorCXsweDAwMDBhNTI4LCAweDNjMDIyZjA0LCAweDNjMDIyZjA0LCAweDJiMDAwYTA0LCAweDJiMDAwYTA0fSwKKwl7MHgwMDAwYTUyYywgMHg0MTAyM2U4NSwgMHg0MTAyM2U4NSwgMHgzZjAwMTYyMCwgMHgzZjAwMTYyMH0sCisJezB4MDAwMGE1MzAsIDB4NDgwMjNlYzYsIDB4NDgwMjNlYzYsIDB4NDEwMDE2MjEsIDB4NDEwMDE2MjF9LAorCXsweDAwMDBhNTM0LCAweDRkMDIzZjAxLCAweDRkMDIzZjAxLCAweDQ0MDAxNjQwLCAweDQ0MDAxNjQwfSwKKwl7MHgwMDAwYTUzOCwgMHg1MzAyM2Y0YiwgMHg1MzAyM2Y0YiwgMHg0NjAwMTY0MSwgMHg0NjAwMTY0MX0sCisJezB4MDAwMGE1M2MsIDB4NWEwMjdmMDksIDB4NWEwMjdmMDksIDB4NDgwMDE2NDIsIDB4NDgwMDE2NDJ9LAorCXsweDAwMDBhNTQwLCAweDVmMDI3ZmM5LCAweDVmMDI3ZmM5LCAweDRiMDAxNjQ0LCAweDRiMDAxNjQ0fSwKKwl7MHgwMDAwYTU0NCwgMHg2NTAyZmVjYSwgMHg2NTAyZmVjYSwgMHg0ZTAwMWE4MSwgMHg0ZTAwMWE4MX0sCisJezB4MDAwMGE1NDgsIDB4NmIwMmZmNGEsIDB4NmIwMmZmNGEsIDB4NTEwMDFhODMsIDB4NTEwMDFhODN9LAorCXsweDAwMDBhNTRjLCAweDcyMDNmZWNhLCAweDcyMDNmZWNhLCAweDU0MDAxYzg0LCAweDU0MDAxYzg0fSwKKwl7MHgwMDAwYTU1MCwgMHg3NzAzZmYwYiwgMHg3NzAzZmYwYiwgMHg1NzAwMWNlMywgMHg1NzAwMWNlM30sCisJezB4MDAwMGE1NTQsIDB4N2QwNmZmY2IsIDB4N2QwNmZmY2IsIDB4NWIwMDFjZTUsIDB4NWIwMDFjZTV9LAorCXsweDAwMDBhNTU4LCAweDg0MDdmZjBiLCAweDg0MDdmZjBiLCAweDVmMDAxY2U5LCAweDVmMDAxY2U5fSwKKwl7MHgwMDAwYTU1YywgMHg4OTA3ZmZjYiwgMHg4OTA3ZmZjYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1NjAsIDB4OTAwZmZmMGIsIDB4OTAwZmZmMGIsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTY0LCAweDk2MGZmZmNiLCAweDk2MGZmZmNiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU2OCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1NmMsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTcwLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU3NCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg2NjAwMWVlYywgMHg2NjAwMWVlY30sCisJezB4MDAwMGE1NzgsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NjYwMDFlZWMsIDB4NjYwMDFlZWN9LAorCXsweDAwMDBhNTdjLCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDY2MDAxZWVjLCAweDY2MDAxZWVjfSwKKwl7MHgwMDAwYTU4MCwgMHgwMDAyMjIwMCwgMHgwMDAyMjIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE1ODQsIDB4MDUwNjIwMDIsIDB4MDUwNjIwMDIsIDB4MDQwMDAwMDIsIDB4MDQwMDAwMDJ9LAorCXsweDAwMDBhNTg4LCAweDBjMDAyZTAwLCAweDBjMDAyZTAwLCAweDA4MDAwMDA0LCAweDA4MDAwMDA0fSwKKwl7MHgwMDAwYTU4YywgMHgxMTA2MjIwMiwgMHgxMTA2MjIwMiwgMHgwYjAwMDIwMCwgMHgwYjAwMDIwMH0sCisJezB4MDAwMGE1OTAsIDB4MTcwMjJlMDAsIDB4MTcwMjJlMDAsIDB4MGYwMDAyMDIsIDB4MGYwMDAyMDJ9LAorCXsweDAwMDBhNTk0LCAweDFkMDAwZWMyLCAweDFkMDAwZWMyLCAweDExMDAwNDAwLCAweDExMDAwNDAwfSwKKwl7MHgwMDAwYTU5OCwgMHgyNTAyMGVjMCwgMHgyNTAyMGVjMCwgMHgxNTAwMDQwMiwgMHgxNTAwMDQwMn0sCisJezB4MDAwMGE1OWMsIDB4MmIwMjBlYzMsIDB4MmIwMjBlYzMsIDB4MTkwMDA0MDQsIDB4MTkwMDA0MDR9LAorCXsweDAwMDBhNWEwLCAweDJmMDAxZjA0LCAweDJmMDAxZjA0LCAweDFiMDAwNjAzLCAweDFiMDAwNjAzfSwKKwl7MHgwMDAwYTVhNCwgMHgzNTAwMWZjNCwgMHgzNTAwMWZjNCwgMHgxZjAwMGEwMiwgMHgxZjAwMGEwMn0sCisJezB4MDAwMGE1YTgsIDB4M2MwMjJmMDQsIDB4M2MwMjJmMDQsIDB4MjMwMDBhMDQsIDB4MjMwMDBhMDR9LAorCXsweDAwMDBhNWFjLCAweDQxMDIzZTg1LCAweDQxMDIzZTg1LCAweDI2MDAwYTIwLCAweDI2MDAwYTIwfSwKKwl7MHgwMDAwYTViMCwgMHg0ODAyM2VjNiwgMHg0ODAyM2VjNiwgMHgyYTAwMGUyMCwgMHgyYTAwMGUyMH0sCisJezB4MDAwMGE1YjQsIDB4NGQwMjNmMDEsIDB4NGQwMjNmMDEsIDB4MmUwMDBlMjIsIDB4MmUwMDBlMjJ9LAorCXsweDAwMDBhNWI4LCAweDUzMDIzZjRiLCAweDUzMDIzZjRiLCAweDMxMDAwZTI0LCAweDMxMDAwZTI0fSwKKwl7MHgwMDAwYTViYywgMHg1YTAyN2YwOSwgMHg1YTAyN2YwOSwgMHgzNDAwMTY0MCwgMHgzNDAwMTY0MH0sCisJezB4MDAwMGE1YzAsIDB4NWYwMjdmYzksIDB4NWYwMjdmYzksIDB4MzgwMDE2NjAsIDB4MzgwMDE2NjB9LAorCXsweDAwMDBhNWM0LCAweDY1MDJmZWNhLCAweDY1MDJmZWNhLCAweDNiMDAxODYxLCAweDNiMDAxODYxfSwKKwl7MHgwMDAwYTVjOCwgMHg2YjAyZmY0YSwgMHg2YjAyZmY0YSwgMHgzZTAwMWE4MSwgMHgzZTAwMWE4MX0sCisJezB4MDAwMGE1Y2MsIDB4NzIwM2ZlY2EsIDB4NzIwM2ZlY2EsIDB4NDIwMDFhODMsIDB4NDIwMDFhODN9LAorCXsweDAwMDBhNWQwLCAweDc3MDNmZjBiLCAweDc3MDNmZjBiLCAweDQ0MDAxYzg0LCAweDQ0MDAxYzg0fSwKKwl7MHgwMDAwYTVkNCwgMHg3ZDA2ZmZjYiwgMHg3ZDA2ZmZjYiwgMHg0ODAwMWNlMywgMHg0ODAwMWNlM30sCisJezB4MDAwMGE1ZDgsIDB4ODQwN2ZmMGIsIDB4ODQwN2ZmMGIsIDB4NGMwMDFjZTUsIDB4NGMwMDFjZTV9LAorCXsweDAwMDBhNWRjLCAweDg5MDdmZmNiLCAweDg5MDdmZmNiLCAweDUwMDAxY2U5LCAweDUwMDAxY2U5fSwKKwl7MHgwMDAwYTVlMCwgMHg5MDBmZmYwYiwgMHg5MDBmZmYwYiwgMHg1NDAwMWNlYiwgMHg1NDAwMWNlYn0sCisJezB4MDAwMGE1ZTQsIDB4OTYwZmZmY2IsIDB4OTYwZmZmY2IsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWU4LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVlYywgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZjAsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNWY0LCAweDljMWZmZjBiLCAweDljMWZmZjBiLCAweDU2MDAxZWVjLCAweDU2MDAxZWVjfSwKKwl7MHgwMDAwYTVmOCwgMHg5YzFmZmYwYiwgMHg5YzFmZmYwYiwgMHg1NjAwMWVlYywgMHg1NjAwMWVlY30sCisJezB4MDAwMGE1ZmMsIDB4OWMxZmZmMGIsIDB4OWMxZmZmMGIsIDB4NTYwMDFlZWMsIDB4NTYwMDFlZWN9LAorCXsweDAwMDBhNjAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYwNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhNjBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTYxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGE2MTQsIDB4MDE0MDQwMDAsIDB4MDE0MDQwMDAsIDB4MDE0MDQwMDAsIDB4MDE0MDQwMDB9LAorCXsweDAwMDBhNjE4LCAweDAyMDA4NTAxLCAweDAyMDA4NTAxLCAweDAyMDA4NTAxLCAweDAyMDA4NTAxfSwKKwl7MHgwMDAwYTYxYywgMHgwMjAwODgwMiwgMHgwMjAwODgwMiwgMHgwMjAwODgwMiwgMHgwMjAwODgwMn0sCisJezB4MDAwMGE2MjAsIDB4MDMwMGM4MDIsIDB4MDMwMGM4MDIsIDB4MDMwMGM4MDIsIDB4MDMwMGM4MDJ9LAorCXsweDAwMDBhNjI0LCAweDAzMDBjYzAzLCAweDAzMDBjYzAzLCAweDAzMDBjYzAzLCAweDAzMDBjYzAzfSwKKwl7MHgwMDAwYTYyOCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNH0sCisJezB4MDAwMGE2MmMsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDR9LAorCXsweDAwMDBhNjMwLCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0fSwKKwl7MHgwMDAwYTYzNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNCwgMHgwNDAxMTAwNH0sCisJezB4MDAwMGE2MzgsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDQsIDB4MDQwMTEwMDR9LAorCXsweDAwMDBhNjNjLCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0LCAweDA0MDExMDA0fSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzMxXzFwMl9tYWNfcG9zdGFtYmxlW11bNV0gPSB7CisJLyogIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAqLworCXsweDAwMDAxMDMwLCAweDAwMDAwMjMwLCAweDAwMDAwNDYwLCAweDAwMDAwMmMwLCAweDAwMDAwMTYwfSwKKwl7MHgwMDAwMTA3MCwgMHgwMDAwMDE2OCwgMHgwMDAwMDJkMCwgMHgwMDAwMDMxOCwgMHgwMDAwMDE4Y30sCisJezB4MDAwMDEwYjAsIDB4MDAwMDBlNjAsIDB4MDAwMDFjYzAsIDB4MDAwMDdjNzAsIDB4MDAwMDNlMzh9LAorCXsweDAwMDA4MDE0LCAweDAzZTgwM2U4LCAweDA3ZDAwN2QwLCAweDEwODAxNjAwLCAweDA4NDAwYjAwfSwKKwl7MHgwMDAwODAxYywgMHgxMjhkODAyNywgMHgxMjhkODA0ZiwgMHgxMmUwMDA1NywgMHgxMmUwMDAyYn0sCisJezB4MDAwMDgxMjAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MDAsIDB4MDhmMDQ4MTAsIDB4MDhmMDQ4MTB9LAorCXsweDAwMDA4MWQwLCAweDAwMDAzMjEwLCAweDAwMDAzMjEwLCAweDAwMDAzMjBhLCAweDAwMDAzMjBhfSwKKwl7MHgwMDAwODMxOCwgMHgwMDAwM2U4MCwgMHgwMDAwN2QwMCwgMHgwMDAwNjg4MCwgMHgwMDAwMzQ0MH0sCit9OworCitzdGF0aWMgY29uc3QgdTMyIGFyOTMzMV8xcDJfc29jX3ByZWFtYmxlW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA3MDIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwNzAzNCwgMHgwMDAwMDAwMn0sCisJezB4MDAwMDcwMzgsIDB4MDAwMDAyZjh9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMzFfMXAyX3h0YWxfNDBNW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDA3MDM4LCAweDAwMDAwNGMyfSwKKwl7MHgwMDAwODI0NCwgMHgwMDEwZjQwMH0sCisJezB4MDAwMDgyNGMsIDB4MDAwMWU4MDB9LAorCXsweDAwMDE2MDljLCAweDBiMjgzZjMxfSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5MzMxXzFwMl9tYWNfY29yZVtdWzJdID0geworCS8qIEFkZHIgICAgICBhbGxtb2RlcyAgKi8KKwl7MHgwMDAwMDAwOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDAwMzAsIDB4MDAwMjAwODV9LAorCXsweDAwMDAwMDM0LCAweDAwMDAwMDA1fSwKKwl7MHgwMDAwMDA0MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDAwNDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDQ4LCAweDAwMDAwMDA4fSwKKwl7MHgwMDAwMDA0YywgMHgwMDAwMDAxMH0sCisJezB4MDAwMDAwNTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMDQwLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA0NCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNDgsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDRjLCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1MCwgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNTQsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDU4LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTA1YywgMHgwMDJmZmMwZn0sCisJezB4MDAwMDEwNjAsIDB4MDAyZmZjMGZ9LAorCXsweDAwMDAxMDY0LCAweDAwMmZmYzBmfSwKKwl7MHgwMDAwMTBmMCwgMHgwMDAwMDEwMH0sCisJezB4MDAwMDEyNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxMmIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMTJmMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDE0M2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAxNDdjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMDQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDA4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAwYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwMTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODAzOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwM2MsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDQwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODA0NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNDgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDRjLCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODA1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwNTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDVjLCAweDAwMGZjNzhmfSwKKwl7MHgwMDAwODA2MCwgMHgwMDAwMDAwZn0sCisJezB4MDAwMDgwNjQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDcwLCAweDAwMDAwMzEwfSwKKwl7MHgwMDAwODA3NCwgMHgwMDAwMDAyMH0sCisJezB4MDAwMDgwNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MDljLCAweDAwMDAwMDBmfSwKKwl7MHgwMDAwODBhMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwYTQsIDB4MDJmZjAwMDB9LAorCXsweDAwMDA4MGE4LCAweDBlMDcwNjA1fSwKKwl7MHgwMDAwODBhYywgMHgwMDAwMDAwZH0sCisJezB4MDAwMDgwYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGMwLCAweDJhODAwMDAwfSwKKwl7MHgwMDAwODBjNCwgMHgwNjkwMDE2OH0sCisJezB4MDAwMDgwYzgsIDB4MTM4ODFjMjB9LAorCXsweDAwMDA4MGNjLCAweDAxZjQwMDAwfSwKKwl7MHgwMDAwODBkMCwgMHgwMDI1MjUwMH0sCisJezB4MDAwMDgwZDQsIDB4MDBhMDAwMDB9LAorCXsweDAwMDA4MGQ4LCAweDAwNDAwMDAwfSwKKwl7MHgwMDAwODBkYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZTAsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MGU0LCAweDAwMDBmZmZmfSwKKwl7MHgwMDAwODBlOCwgMHgzZjNmM2YzZn0sCisJezB4MDAwMDgwZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MGYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODBmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgwZmMsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA4MTAwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEwOCwgMHgwMDAwMDA1Mn0sCisJezB4MDAwMDgxMGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTEwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODExNCwgMHgwMDAwMDdmZn0sCisJezB4MDAwMDgxMTgsIDB4MDAwMDAwYWF9LAorCXsweDAwMDA4MTFjLCAweDAwMDAzMjEwfSwKKwl7MHgwMDAwODEyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxMzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODEzYywgMHgwMDAwZmZmZn0sCisJezB4MDAwMDgxNDQsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MTY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODE2YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxNzAsIDB4MTg0ODYyMDB9LAorCXsweDAwMDA4MTc0LCAweDMzMzMyMjEwfSwKKwl7MHgwMDAwODE3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxN2MsIDB4MDAwMjAwMDB9LAorCXsweDAwMDA4MWMwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFjNCwgMHgzMzMzMjIxMH0sCisJezB4MDAwMDgxYzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWNjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFkNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODFmNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgxZjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MWZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI0MCwgMHgwMDEwMDAwMH0sCisJezB4MDAwMDgyNDgsIDB4MDAwMDA4MDB9LAorCXsweDAwMDA4MjUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI1NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyNTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MjVjLCAweDQwMDAwMDAwfSwKKwl7MHgwMDAwODI2MCwgMHgwMDA4MDkyMn0sCisJezB4MDAwMDgyNjQsIDB4OWQ0MDAwMTB9LAorCXsweDAwMDA4MjY4LCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODI2YywgMHgwMDAwZmZmZn0sCisJezB4MDAwMDgyNzAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4Mjc0LCAweDQwMDAwMDAwfSwKKwl7MHgwMDAwODI3OCwgMHgwMDNlNDE4MH0sCisJezB4MDAwMDgyN2MsIDB4MDAwMDAwMDR9LAorCXsweDAwMDA4Mjg0LCAweDAwMDAwMDJjfSwKKwl7MHgwMDAwODI4OCwgMHgwMDAwMDAyY30sCisJezB4MDAwMDgyOGMsIDB4MDAwMDAwZmZ9LAorCXsweDAwMDA4Mjk0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODI5OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgyOWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4MzAwLCAweDAwMDAwMTQwfSwKKwl7MHgwMDAwODMxNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzMWMsIDB4MDAwMDAxMGR9LAorCXsweDAwMDA4MzI4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODMyYywgMHgwMDAwMDAwN30sCisJezB4MDAwMDgzMzAsIDB4MDAwMDAzMDJ9LAorCXsweDAwMDA4MzM0LCAweDAwMDAwNzAwfSwKKwl7MHgwMDAwODMzOCwgMHgwMGZmMDAwMH0sCisJezB4MDAwMDgzM2MsIDB4MDI0MDAwMDB9LAorCXsweDAwMDA4MzQwLCAweDAwMDEwN2ZmfSwKKwl7MHgwMDAwODM0NCwgMHhhYTQ4MTA1Yn0sCisJezB4MDAwMDgzNDgsIDB4MDA4ZjAwMDB9LAorCXsweDAwMDA4MzVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM2MCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgzNjQsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4MzY4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzNzQsIDB4MDAwMDAwZmZ9LAorCXsweDAwMDA4Mzc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzODAsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4Mzg0LCAweGZmZmZmZmZmfSwKKwl7MHgwMDAwODM5MCwgMHhmZmZmZmZmZn0sCisJezB4MDAwMDgzOTQsIDB4ZmZmZmZmZmZ9LAorCXsweDAwMDA4Mzk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODM5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4M2E0LCAweDAwMDBmYTE0fSwKKwl7MHgwMDAwODNhOCwgMHgwMDBmMGMwMH0sCisJezB4MDAwMDgzYWMsIDB4MzMzMzIyMTB9LAorCXsweDAwMDA4M2IwLCAweDMzMzMyMjEwfSwKKwl7MHgwMDAwODNiNCwgMHgzMzMzMjIxMH0sCisJezB4MDAwMDgzYjgsIDB4MzMzMzIyMTB9LAorCXsweDAwMDA4M2JjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODNjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDgzYzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDA4M2M4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwODNjYywgMHgwMDAwMDIwMH0sCisJezB4MDAwMDgzZDAsIDB4MDAwMzAxZmZ9LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBhcjkzMzFfY29tbW9uX3J4X2dhaW5fMXAyW11bMl0gPSB7CisJLyogQWRkciAgICAgIGFsbG1vZGVzICAqLworCXsweDAwMDBhMDAwLCAweDAwMDEwMDAwfSwKKwl7MHgwMDAwYTAwNCwgMHgwMDAzMDAwMn0sCisJezB4MDAwMGEwMDgsIDB4MDAwNTAwMDR9LAorCXsweDAwMDBhMDBjLCAweDAwODEwMDgwfSwKKwl7MHgwMDAwYTAxMCwgMHgwMTgwMDA4Mn0sCisJezB4MDAwMGEwMTQsIDB4MDE4MjAxODF9LAorCXsweDAwMDBhMDE4LCAweDAxODQwMTgzfSwKKwl7MHgwMDAwYTAxYywgMHgwMTg4MDE4NX0sCisJezB4MDAwMGEwMjAsIDB4MDE4YTAxODl9LAorCXsweDAwMDBhMDI0LCAweDAyODUwMjg0fSwKKwl7MHgwMDAwYTAyOCwgMHgwMjg5MDI4OH0sCisJezB4MDAwMGEwMmMsIDB4MDM4NTAzODR9LAorCXsweDAwMDBhMDMwLCAweDAzODkwMzg4fSwKKwl7MHgwMDAwYTAzNCwgMHgwMzhiMDM4YX0sCisJezB4MDAwMGEwMzgsIDB4MDM4ZDAzOGN9LAorCXsweDAwMDBhMDNjLCAweDAzOTEwMzkwfSwKKwl7MHgwMDAwYTA0MCwgMHgwMzkzMDM5Mn0sCisJezB4MDAwMGEwNDQsIDB4MDM5NTAzOTR9LAorCXsweDAwMDBhMDQ4LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYTA0YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDU0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA1OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDYwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA2NCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDZjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3MCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwNzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTA3YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwODAsIDB4MjgyODI4Mjh9LAorCXsweDAwMDBhMDg0LCAweDI4MjgyODI4fSwKKwl7MHgwMDAwYTA4OCwgMHgyODI4MjgyOH0sCisJezB4MDAwMGEwOGMsIDB4MjgyODI4Mjh9LAorCXsweDAwMDBhMDkwLCAweDI4MjgyODI4fSwKKwl7MHgwMDAwYTA5NCwgMHgyMTIxMjEyOH0sCisJezB4MDAwMGEwOTgsIDB4MTcxYzFjMWN9LAorCXsweDAwMDBhMDljLCAweDAyMDIwMjEyfSwKKwl7MHgwMDAwYTBhMCwgMHgwMDAwMDIwMn0sCisJezB4MDAwMGEwYTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGE4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBhYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYjAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGI0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTBiOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEwYmMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMGMwLCAweDAwMWYwMDAwfSwKKwl7MHgwMDAwYTBjNCwgMHgxMTFmMTEwMH0sCisJezB4MDAwMGEwYzgsIDB4MTExZDExMWV9LAorCXsweDAwMDBhMGNjLCAweDExMWIxMTFjfSwKKwl7MHgwMDAwYTBkMCwgMHgyMjAzMjIwNH0sCisJezB4MDAwMGEwZDQsIDB4MjIwMTIyMDJ9LAorCXsweDAwMDBhMGQ4LCAweDIyMWYyMjAwfSwKKwl7MHgwMDAwYTBkYywgMHgyMjFkMjIxZX0sCisJezB4MDAwMGEwZTAsIDB4MzMwMTMzMDJ9LAorCXsweDAwMDBhMGU0LCAweDMzMWYzMzAwfSwKKwl7MHgwMDAwYTBlOCwgMHg0NDAyMzMxZX0sCisJezB4MDAwMGEwZWMsIDB4NDQwMDQ0MDF9LAorCXsweDAwMDBhMGYwLCAweDQ0MWU0NDFmfSwKKwl7MHgwMDAwYTBmNCwgMHg1NTAxNTUwMn0sCisJezB4MDAwMGEwZjgsIDB4NTUxZjU1MDB9LAorCXsweDAwMDBhMGZjLCAweDY2MDI1NTFlfSwKKwl7MHgwMDAwYTEwMCwgMHg2NjAwNjYwMX0sCisJezB4MDAwMGExMDQsIDB4NjYxZTY2MWZ9LAorCXsweDAwMDBhMTA4LCAweDc3MDM2NjFkfSwKKwl7MHgwMDAwYTEwYywgMHg3NzAxNzcwMn0sCisJezB4MDAwMGExMTAsIDB4MDAwMDc3MDB9LAorCXsweDAwMDBhMTE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTExOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEyNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExMzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTEzYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExNDAsIDB4MDAxZjAwMDB9LAorCXsweDAwMDBhMTQ0LCAweDExMWYxMTAwfSwKKwl7MHgwMDAwYTE0OCwgMHgxMTFkMTExZX0sCisJezB4MDAwMGExNGMsIDB4MTExYjExMWN9LAorCXsweDAwMDBhMTUwLCAweDIyMDMyMjA0fSwKKwl7MHgwMDAwYTE1NCwgMHgyMjAxMjIwMn0sCisJezB4MDAwMGExNTgsIDB4MjIxZjIyMDB9LAorCXsweDAwMDBhMTVjLCAweDIyMWQyMjFlfSwKKwl7MHgwMDAwYTE2MCwgMHgzMzAxMzMwMn0sCisJezB4MDAwMGExNjQsIDB4MzMxZjMzMDB9LAorCXsweDAwMDBhMTY4LCAweDQ0MDIzMzFlfSwKKwl7MHgwMDAwYTE2YywgMHg0NDAwNDQwMX0sCisJezB4MDAwMGExNzAsIDB4NDQxZTQ0MWZ9LAorCXsweDAwMDBhMTc0LCAweDU1MDE1NTAyfSwKKwl7MHgwMDAwYTE3OCwgMHg1NTFmNTUwMH0sCisJezB4MDAwMGExN2MsIDB4NjYwMjU1MWV9LAorCXsweDAwMDBhMTgwLCAweDY2MDA2NjAxfSwKKwl7MHgwMDAwYTE4NCwgMHg2NjFlNjYxZn0sCisJezB4MDAwMGExODgsIDB4NzcwMzY2MWR9LAorCXsweDAwMDBhMThjLCAweDc3MDE3NzAyfSwKKwl7MHgwMDAwYTE5MCwgMHgwMDAwNzcwMH0sCisJezB4MDAwMGExOTQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMTk4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTE5YywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYTAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWE0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFhOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYWMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWIwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFiNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYjgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWJjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExYzQsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWM4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFjYywgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWQ0LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFkOCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZGMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWUwLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFlNCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGExZTgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhMWVjLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwYTFmMCwgMHgwMDAwMDM5Nn0sCisJezB4MDAwMGExZjQsIDB4MDAwMDAzOTZ9LAorCXsweDAwMDBhMWY4LCAweDAwMDAwMzk2fSwKKwl7MHgwMDAwYTFmYywgMHgwMDAwMDI5Nn0sCit9OworCisjZW5kaWYgLyogSU5JVFZBTFNfOTMzMF8xUDJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2F0aDlrLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXRoOWsuaAppbmRleCBmNzUwNjhiLi40NjM5M2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXRoOWsuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXRoOWsuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogCkBAIC01NCw4ICs1NSw2IEBACiAJCShfbCkgJj0gKChfc3opIC0gMSk7CQlcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBBX01BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotCiAjZGVmaW5lIFRTRl9UT19UVShfaCxfbCkgXAogCSgoKCh1MzIpKF9oKSkgPDwgMjIpIHwgKCgodTMyKShfbCkpID4+IDEwKSkKIApAQCAtMTAyLDYgKzEwMSwxMSBAQAogCiAjZGVmaW5lIEFUSF9UWFNUQVRVU19SSU5HX1NJWkUgNjQKIAorI2RlZmluZQlEUzJQSFlTKF9kZCwgX2RzKQkJCQkJCVwKKwkoKF9kZCktPmRkX2Rlc2NfcGFkZHIgKyAoKGNhZGRyX3QpKF9kcykgLSAoY2FkZHJfdCkoX2RkKS0+ZGRfZGVzYykpCisjZGVmaW5lIEFUSF9ERVNDXzRLQl9CT1VORF9DSEVDSyhfZGFkZHIpICgoKChfZGFkZHIpICYgMHhGRkYpID4gMHhGN0YpID8gMSA6IDApCisjZGVmaW5lIEFUSF9ERVNDXzRLQl9CT1VORF9OVU1fU0tJUFBFRChfbGVuKSAoKF9sZW4pIC8gNDA5NikKKwogc3RydWN0IGF0aF9kZXNjZG1hIHsKIAl2b2lkICpkZF9kZXNjOwogCWRtYV9hZGRyX3QgZGRfZGVzY19wYWRkcjsKQEAgLTE3OSw3ICsxODMsNyBAQAogc3RydWN0IGF0aF90eHEgewogCWludCBtYWM4MDIxMV9xbnVtOyAvKiBtYWM4MDIxMSBxdWV1ZSBudW1iZXIsIC0xIG1lYW5zIG5vdCBtYWM4MDIxMSBRICovCiAJdTMyIGF4cV9xbnVtOyAvKiBhdGg5ayBoYXJkd2FyZSBxdWV1ZSBudW1iZXIgKi8KLQl1MzIgKmF4cV9saW5rOworCXZvaWQgKmF4cV9saW5rOwogCXN0cnVjdCBsaXN0X2hlYWQgYXhxX3E7CiAJc3BpbmxvY2tfdCBheHFfbG9jazsKIAl1MzIgYXhxX2RlcHRoOwpAQCAtMTg4LDcgKzE5Miw2IEBACiAJYm9vbCBheHFfdHhfaW5wcm9ncmVzczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGF4cV9hY3E7CiAJc3RydWN0IGxpc3RfaGVhZCB0eHFfZmlmb1tBVEhfVFhGSUZPX0RFUFRIXTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHR4cV9maWZvX3BlbmRpbmc7CiAJdTggdHhxX2hlYWRpZHg7CiAJdTggdHhxX3RhaWxpZHg7CiAJaW50IHBlbmRpbmdfZnJhbWVzOwpAQCAtNDI4LDYgKzQzMSw3IEBACiB2b2lkIGF0aF9od19wbGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCBhdGhfcGFwcmRfY2FsaWJyYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIGF0aF9hbmlfY2FsaWJyYXRlKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIGF0aF9zdGFydF9hbmkoc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbik7CiAKIC8qKioqKioqKioqLwogLyogQlRDT0VYICovCkBAIC01NzksNyArNTgzLDcgQEAKIAlpbnQgbmFwczsgICAgICAvKiBudW1iZXIgb2YgQVAgdmlmcyAqLwogCWludCBubWVzaGVzOyAgIC8qIG51bWJlciBvZiBtZXNoIHZpZnMgKi8KIAlpbnQgbnN0YXRpb25zOyAvKiBudW1iZXIgb2Ygc3RhdGlvbiB2aWZzICovCi0JaW50IG53ZHM7ICAgICAgLyogbnVtYmVyIG9mIG53ZCB2aWZzICovCisJaW50IG53ZHM7ICAgICAgLyogbnVtYmVyIG9mIFdEUyB2aWZzICovCiAJaW50IG5hZGhvY3M7ICAgLyogbnVtYmVyIG9mIGFkaG9jIHZpZnMgKi8KIAlpbnQgbm90aGVyczsgICAvKiBudW1iZXIgb2YgdmlmcyBub3Qgc3BlY2lmaWVkIGFib3ZlLiAqLwogfTsKQEAgLTY2OSwxMiArNjczLDggQEAKIAkJICAgIGNvbnN0IHN0cnVjdCBhdGhfYnVzX29wcyAqYnVzX29wcyk7CiB2b2lkIGF0aDlrX2RlaW5pdF9kZXZpY2Uoc3RydWN0IGF0aF9zb2Z0YyAqc2MpOwogdm9pZCBhdGg5a19zZXRfaHdfY2FwYWIoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLWludCBhdGhfc2V0X2NoYW5uZWwoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmhjaGFuKTsKIAotdm9pZCBhdGhfcmFkaW9fZW5hYmxlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiB2b2lkIGF0aF9yYWRpb19kaXNhYmxlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci1ib29sIGF0aDlrX3NldHBvd2VyKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBlbnVtIGF0aDlrX3Bvd2VyX21vZGUgbW9kZSk7CiBib29sIGF0aDlrX3VzZXNfYmVhY29ucyhpbnQgdHlwZSk7CiAKICNpZmRlZiBDT05GSUdfQVRIOUtfUENJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYmVhY29uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYmVhY29uLmMKaW5kZXggZDRkOGNlYy4uMGQxM2ZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2JlYWNvbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9iZWFjb24uYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlICJhdGg5ay5oIgogCiAjZGVmaW5lIEZVREdFIDIKQEAgLTM2MCw2ICszNjEsNyBAQAogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXN0cnVjdCBhdGhfYnVmICpiZiA9IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKwlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyB0czsKIAlpbnQgc2xvdDsKIAl1MzIgYmZhZGRyLCBiYyA9IDA7CiAKQEAgLTM4NCw3ICszODYsOSBAQAogCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQlNUVUNLLAogCQkJCSJiZWFjb24gaXMgb2ZmaWNpYWxseSBzdHVja1xuIik7CiAJCQlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfVFNGX1JFU0VUOworCQkJc3Bpbl9sb2NrKCZzYy0+c2NfcGN1X2xvY2spOwogCQkJYXRoX3Jlc2V0KHNjLCB0cnVlKTsKKwkJCXNwaW5fdW5sb2NrKCZzYy0+c2NfcGN1X2xvY2spOwogCQl9CiAKIAkJcmV0dXJuOwpAQCAtNDY0LDYgKzQ2OCwxMSBAQAogCQlhdGg5a19od190eHN0YXJ0KGFoLCBzYy0+YmVhY29uLmJlYWNvbnEpOwogCiAJCXNjLT5iZWFjb24uYXN0X2JlX3htaXQgKz0gYmM7ICAgICAvKiBYWFggcGVyLXZpZj8gKi8KKwkJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkgeworCQkJc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOworCQkJYXRoOWtfaHdfdHhwcm9jZGVzYyhhaCwgYmYtPmJmX2Rlc2MsICh2b2lkICopJnRzKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOworCQl9CiAJfQogfQogCkBAIC00OTYsNyArNTA1LDcgQEAKIAl1MzIgbmV4dHRidHQsIGludHZhbDsKIAogCS8qIE5COiB0aGUgYmVhY29uIGludGVydmFsIGlzIGtlcHQgaW50ZXJuYWxseSBpbiBUVSdzICovCi0JaW50dmFsID0gVFVfVE9fVVNFQyhjb25mLT5iZWFjb25faW50ZXJ2YWwgJiBBVEg5S19CRUFDT05fUEVSSU9EKTsKKwlpbnR2YWwgPSBUVV9UT19VU0VDKGNvbmYtPmJlYWNvbl9pbnRlcnZhbCk7CiAJaW50dmFsIC89IEFUSF9CQ0JVRjsgICAgLyogZm9yIHN0YWdnZXJlZCBiZWFjb25zICovCiAJbmV4dHRidHQgPSBpbnR2YWw7CiAKQEAgLTU0Myw3ICs1NTIsNyBAQAogCX0KIAogCW1lbXNldCgmYnMsIDAsIHNpemVvZihicykpOwotCWludHZhbCA9IGNvbmYtPmJlYWNvbl9pbnRlcnZhbCAmIEFUSDlLX0JFQUNPTl9QRVJJT0Q7CisJaW50dmFsID0gY29uZi0+YmVhY29uX2ludGVydmFsOwogCiAJLyoKIAkgKiBTZXR1cCBkdGltIGFuZCBjZnAgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8KQEAgLTY1MiwyMiArNjYxLDEzIEBACiB7CiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7Ci0JdTMyIHRzZiwgZGVsdGEsIGludHZhbCwgbmV4dHRidHQ7CisJdTMyIHRzZiwgaW50dmFsLCBuZXh0dGJ0dDsKIAogCWF0aDlrX3Jlc2V0X2JlYWNvbl9zdGF0dXMoc2MpOwogCi0JdHNmID0gYXRoOWtfaHdfZ2V0dHNmMzIoYWgpICsgVFVfVE9fVVNFQyhGVURHRSk7Ci0JaW50dmFsID0gVFVfVE9fVVNFQyhjb25mLT5iZWFjb25faW50ZXJ2YWwgJiBBVEg5S19CRUFDT05fUEVSSU9EKTsKLQotCWlmICghc2MtPmJlYWNvbi5iY190c3RhbXApCi0JCW5leHR0YnR0ID0gdHNmICsgaW50dmFsOwotCWVsc2UgewotCQlpZiAodHNmID4gc2MtPmJlYWNvbi5iY190c3RhbXApCi0JCQlkZWx0YSA9ICh0c2YgLSBzYy0+YmVhY29uLmJjX3RzdGFtcCk7Ci0JCWVsc2UKLQkJCWRlbHRhID0gKHRzZiArIDEgKyAofjBVIC0gc2MtPmJlYWNvbi5iY190c3RhbXApKTsKLQkJbmV4dHRidHQgPSB0c2YgKyBpbnR2YWwgLSAoZGVsdGEgJSBpbnR2YWwpOwotCX0KKwlpbnR2YWwgPSBUVV9UT19VU0VDKGNvbmYtPmJlYWNvbl9pbnRlcnZhbCk7CisJdHNmID0gcm91bmR1cChhdGg5a19od19nZXR0c2YzMihhaCkgKyBUVV9UT19VU0VDKEZVREdFKSwgaW50dmFsKTsKKwluZXh0dGJ0dCA9IHRzZiArIGludHZhbDsKIAogCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0JFQUNPTiwKIAkJIklCU1MgbmV4dHRidHQgJXUgaW50dmFsICV1ICgldSlcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmMKaW5kZXggNDFjZTBiMS4uNjYzNWMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9idGNvZXguYwpAQCAtNTAsNyArNTAsNyBAQAogCQkuYnRfZmlyc3Rfc2xvdF90aW1lID0gNSwKIAkJLmJ0X2hvbGRfcnhfY2xlYXIgPSB0cnVlLAogCX07Ci0JdTMyIGk7CisJdTMyIGksIGlkeDsKIAlib29sIHJ4Y2xlYXJfcG9sYXJpdHkgPSBhdGhfYnRfY29uZmlnLmJ0X3J4Y2xlYXJfcG9sYXJpdHk7CiAKIAlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkKQEAgLTczLDggKzczLDEwIEBACiAJCVNNKEFUSF9CVENPRVhfQk1JU1NfVEhSRVNILCBBUl9CVF9CQ05fTUlTU19USFJFU0gpIHwKIAkJQVJfQlRfRElTQUJMRV9CVF9BTlQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJYWgtPmh3X2dlbl90aW1lcnMuZ2VuX3RpbWVyX2luZGV4WyhkZWJydWlqbjMyIDw8IGkpID4+IDI3XSA9IGk7CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaWR4ID0gKGRlYnJ1aWpuMzIgPDwgaSkgPj4gMjc7CisJCWFoLT5od19nZW5fdGltZXJzLmdlbl90aW1lcl9pbmRleFtpZHhdID0gaTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MKGF0aDlrX2h3X2luaXRfYnRjb2V4X2h3KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYwppbmRleCBkNTVmZmQ3Li5kMWViODk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYwpAQCAtMTc2LDYgKzE3Niw1NiBAQAogCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKIH07CiAKK3N0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV9kaXNhYmxlX2FuaShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CisJY2hhciBidWZbMzJdOworCXVuc2lnbmVkIGludCBsZW47CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjb21tb24tPmRpc2FibGVfYW5pKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2ZpbGVfZGlzYWJsZV9hbmkoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oc2MtPnNjX2FoKTsKKwl1bnNpZ25lZCBsb25nIGRpc2FibGVfYW5pOworCWNoYXIgYnVmWzMyXTsKKwlzc2l6ZV90IGxlbjsKKworCWxlbiA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlidWZbbGVuXSA9ICdcMCc7CisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJmRpc2FibGVfYW5pKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb21tb24tPmRpc2FibGVfYW5pID0gISFkaXNhYmxlX2FuaTsKKworCWlmIChkaXNhYmxlX2FuaSkgeworCQlzYy0+c2NfZmxhZ3MgJj0gflNDX09QX0FOSV9SVU47CisJCWRlbF90aW1lcl9zeW5jKCZjb21tb24tPmFuaS50aW1lcik7CisJfSBlbHNlIHsKKwkJc2MtPnNjX2ZsYWdzIHw9IFNDX09QX0FOSV9SVU47CisJCWF0aF9zdGFydF9hbmkoY29tbW9uKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfZGlzYWJsZV9hbmkgPSB7CisJLnJlYWQgPSByZWFkX2ZpbGVfZGlzYWJsZV9hbmksCisJLndyaXRlID0gd3JpdGVfZmlsZV9kaXNhYmxlX2FuaSwKKwkub3BlbiA9IGF0aDlrX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OwogCiBzdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfZG1hKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQpAQCAtNTUwLDYgKzYwMCw3IEBACiAKIAlQUigiTVBEVXMgUXVldWVkOiAgICAiLCBxdWV1ZWQpOwogCVBSKCJNUERVcyBDb21wbGV0ZWQ6ICIsIGNvbXBsZXRlZCk7CisJUFIoIk1QRFVzIFhSZXRyaWVkOiAgIiwgeHJldHJpZXMpOwogCVBSKCJBZ2dyZWdhdGVzOiAgICAgICIsIGFfYWdncik7CiAJUFIoIkFNUERVcyBRdWV1ZWQgSFc6IiwgYV9xdWV1ZWRfaHcpOwogCVBSKCJBTVBEVXMgUXVldWVkIFNXOiIsIGFfcXVldWVkX3N3KTsKQEAgLTU4Nyw3ICs2MzgsNiBAQAogCiAJUFJRTEUoImF4cV9xIGVtcHR5OiAgICAgICAiLCBheHFfcSk7CiAJUFJRTEUoImF4cV9hY3EgZW1wdHk6ICAgICAiLCBheHFfYWNxKTsKLQlQUlFMRSgidHhxX2ZpZm9fcGVuZGluZzogICIsIHR4cV9maWZvX3BlbmRpbmcpOwogCWZvciAoaSA9IDA7IGkgPCBBVEhfVFhGSUZPX0RFUFRIOyBpKyspIHsKIAkJc25wcmludGYodG1wLCBzaXplb2YodG1wKSAtIDEsICJ0eHFfZmlmb1slaV0gZW1wdHk6ICIsIGkpOwogCQlQUlFMRSh0bXAsIHR4cV9maWZvW2ldKTsKQEAgLTY5OSw3ICs3NDksNiBAQAogCWNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBpbnQgbGVuID0gMCwgc2l6ZSA9IDgwMDA7CiAJc3NpemVfdCByZXR2YWwgPSAwOwotCWNvbnN0IGNoYXIgKnRtcDsKIAl1bnNpZ25lZCBpbnQgcmVnOwogCXN0cnVjdCBhdGg5a192aWZfaXRlcl9kYXRhIGl0ZXJfZGF0YTsKIApAQCAtNzA5LDMxICs3NTgsMTQgQEAKIAlpZiAoYnVmID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc3dpdGNoIChzYy0+c2NfYWgtPm9wbW9kZSkgewotCWNhc2UgIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQl0bXAgPSAiQURIT0MiOwotCQlicmVhazsKLQljYXNlICBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgotCQl0bXAgPSAiTUVTSCI7Ci0JCWJyZWFrOwotCWNhc2UgIE5MODAyMTFfSUZUWVBFX0FQOgotCQl0bXAgPSAiQVAiOwotCQlicmVhazsKLQljYXNlICBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQl0bXAgPSAiU1RBVElPTiI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXRtcCA9ICI/Pz8iOwotCQlicmVhazsKLQl9Ci0KIAlhdGg5a19wc193YWtldXAoc2MpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCiAJCQkiY3VyYnNzaWQ6ICVwTVxuIgogCQkJIk9QLU1vZGU6ICVzKCVpKVxuIgogCQkJIkJlYWNvbi1UaW1lci1SZWdpc3RlcjogMHgleFxuIiwKIAkJCWNvbW1vbi0+Y3VyYnNzaWQsCi0JCQl0bXAsIChpbnQpKHNjLT5zY19haC0+b3Btb2RlKSwKKwkJCWF0aF9vcG1vZGVfdG9fc3RyaW5nKHNjLT5zY19haC0+b3Btb2RlKSwKKwkJCShpbnQpKHNjLT5zY19haC0+b3Btb2RlKSwKIAkJCVJFR19SRUFEKGFoLCBBUl9CRUFDT05fUEVSSU9EKSk7CiAKIAlyZWcgPSBSRUdfUkVBRChhaCwgQVJfVElNRVJfTU9ERSk7CkBAIC04MDcsNyArODM5LDEwIEBACiAJCWVsc2UKIAkJCVRYX1NUQVRfSU5DKHFudW0sIGFfY29tcGxldGVkKTsKIAl9IGVsc2UgewotCQlUWF9TVEFUX0lOQyhxbnVtLCBjb21wbGV0ZWQpOworCQlpZiAoYmZfaXN4cmV0cmllZChiZikpCisJCQlUWF9TVEFUX0lOQyhxbnVtLCB4cmV0cmllcyk7CisJCWVsc2UKKwkJCVRYX1NUQVRfSU5DKHFudW0sIGNvbXBsZXRlZCk7CiAJfQogCiAJaWYgKHRzLT50c19zdGF0dXMgJiBBVEg5S19UWEVSUl9GSUZPKQpAQCAtMTE2MCw2ICsxMTk1LDggQEAKIAkJCSAgICBzYy0+ZGVidWcuZGVidWdmc19waHksIHNjLCAmZm9wc19yeF9jaGFpbm1hc2spOwogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInR4X2NoYWlubWFzayIsIFNfSVJVU1IgfCBTX0lXVVNSLAogCQkJICAgIHNjLT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwgc2MsICZmb3BzX3R4X2NoYWlubWFzayk7CisJZGVidWdmc19jcmVhdGVfZmlsZSgiZGlzYWJsZV9hbmkiLCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCSAgICBzYy0+ZGVidWcuZGVidWdmc19waHksIHNjLCAmZm9wc19kaXNhYmxlX2FuaSk7CiAJZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaWR4IiwgU19JUlVTUiB8IFNfSVdVU1IsIHNjLT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwKIAkJCSAgICBzYywgJmZvcHNfcmVnaWR4KTsKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZWd2YWwiLCBTX0lSVVNSIHwgU19JV1VTUiwgc2MtPmRlYnVnLmRlYnVnZnNfcGh5LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuaAppbmRleCA4Y2U2YWQ4Li40YTA0NTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuaApAQCAtMTE2LDYgKzExNiw3IEBACiAJdTMyIHR4X2J5dGVzX2FsbDsKIAl1MzIgcXVldWVkOwogCXUzMiBjb21wbGV0ZWQ7CisJdTMyIHhyZXRyaWVzOwogCXUzMiBhX2FnZ3I7CiAJdTMyIGFfcXVldWVkX2h3OwogCXUzMiBhX3F1ZXVlZF9zdzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fNGsuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fNGsuYwppbmRleCA1YjFlODk0Li40N2NjOTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzRrLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV80ay5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJhcjkwMDJfcGh5LmgiCiAKQEAgLTIwMywxMSArMjA0LDExIEBACiAJY2FzZSBFRVBfTkZUSFJFU0hfMjoKIAkJcmV0dXJuIHBNb2RhbC0+bm9pc2VGbG9vclRocmVzaENoWzBdOwogCWNhc2UgRUVQX01BQ19MU1c6Ci0JCXJldHVybiBwQmFzZS0+bWFjQWRkclswXSA8PCA4IHwgcEJhc2UtPm1hY0FkZHJbMV07CisJCXJldHVybiBnZXRfdW5hbGlnbmVkX2JlMTYocEJhc2UtPm1hY0FkZHIpOwogCWNhc2UgRUVQX01BQ19NSUQ6Ci0JCXJldHVybiBwQmFzZS0+bWFjQWRkclsyXSA8PCA4IHwgcEJhc2UtPm1hY0FkZHJbM107CisJCXJldHVybiBnZXRfdW5hbGlnbmVkX2JlMTYocEJhc2UtPm1hY0FkZHIgKyAyKTsKIAljYXNlIEVFUF9NQUNfTVNXOgotCQlyZXR1cm4gcEJhc2UtPm1hY0FkZHJbNF0gPDwgOCB8IHBCYXNlLT5tYWNBZGRyWzVdOworCQlyZXR1cm4gZ2V0X3VuYWxpZ25lZF9iZTE2KHBCYXNlLT5tYWNBZGRyICsgNCk7CiAJY2FzZSBFRVBfUkVHXzA6CiAJCXJldHVybiBwQmFzZS0+cmVnRG1uWzBdOwogCWNhc2UgRUVQX1JFR18xOgpAQCAtMzMxLDEwICszMzIsNyBAQAogCiAJCQlyZWdPZmZzZXQgPSBBUl9QSFlfQkFTRSArICg2NzIgPDwgMikgKyByZWdDaGFpbk9mZnNldDsKIAkJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7Ci0JCQkJcmVnMzIgPSAoKHBkYWRjVmFsdWVzWzQgKiBqICsgMF0gJiAweEZGKSA8PCAwKSB8Ci0JCQkJCSgocGRhZGNWYWx1ZXNbNCAqIGogKyAxXSAmIDB4RkYpIDw8IDgpIHwKLQkJCQkJKChwZGFkY1ZhbHVlc1s0ICogaiArIDJdICYgMHhGRikgPDwgMTYpfAotCQkJCQkoKHBkYWRjVmFsdWVzWzQgKiBqICsgM10gJiAweEZGKSA8PCAyNCk7CisJCQkJcmVnMzIgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJnBkYWRjVmFsdWVzWzQgKiBqXSk7CiAJCQkJUkVHX1dSSVRFKGFoLCByZWdPZmZzZXQsIHJlZzMyKTsKIAogCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fOTI4Ny5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV85Mjg3LmMKaW5kZXggMzQzZmM5Zi4uZDZmNmIxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV85Mjg3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV85Mjg3LmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlICJody5oIgogI2luY2x1ZGUgImFyOTAwMl9waHkuaCIKIApAQCAtMTk1LDExICsxOTYsMTEgQEAKIAljYXNlIEVFUF9ORlRIUkVTSF8yOgogCQlyZXR1cm4gcE1vZGFsLT5ub2lzZUZsb29yVGhyZXNoQ2hbMF07CiAJY2FzZSBFRVBfTUFDX0xTVzoKLQkJcmV0dXJuIHBCYXNlLT5tYWNBZGRyWzBdIDw8IDggfCBwQmFzZS0+bWFjQWRkclsxXTsKKwkJcmV0dXJuIGdldF91bmFsaWduZWRfYmUxNihwQmFzZS0+bWFjQWRkcik7CiAJY2FzZSBFRVBfTUFDX01JRDoKLQkJcmV0dXJuIHBCYXNlLT5tYWNBZGRyWzJdIDw8IDggfCBwQmFzZS0+bWFjQWRkclszXTsKKwkJcmV0dXJuIGdldF91bmFsaWduZWRfYmUxNihwQmFzZS0+bWFjQWRkciArIDIpOwogCWNhc2UgRUVQX01BQ19NU1c6Ci0JCXJldHVybiBwQmFzZS0+bWFjQWRkcls0XSA8PCA4IHwgcEJhc2UtPm1hY0FkZHJbNV07CisJCXJldHVybiBnZXRfdW5hbGlnbmVkX2JlMTYocEJhc2UtPm1hY0FkZHIgKyA0KTsKIAljYXNlIEVFUF9SRUdfMDoKIAkJcmV0dXJuIHBCYXNlLT5yZWdEbW5bMF07CiAJY2FzZSBFRVBfUkVHXzE6CkBAIC00MzQsMTAgKzQzNSw3IEBACiAJCQkJCSg2NzIgPDwgMikgKyByZWdDaGFpbk9mZnNldDsKIAogCQkJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7Ci0JCQkJCXJlZzMyID0gKChwZGFkY1ZhbHVlc1s0KmogKyAwXSAmIDB4RkYpIDw8IDApCi0JCQkJCQl8ICgocGRhZGNWYWx1ZXNbNCpqICsgMV0gJiAweEZGKSA8PCA4KQotCQkJCQkJfCAoKHBkYWRjVmFsdWVzWzQqaiArIDJdICYgMHhGRikgPDwgMTYpCi0JCQkJCQl8ICgocGRhZGNWYWx1ZXNbNCpqICsgM10gJiAweEZGKSA8PCAyNCk7CisJCQkJCXJlZzMyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZwZGFkY1ZhbHVlc1s0ICogal0pOwogCiAJCQkJCVJFR19XUklURShhaCwgcmVnT2Zmc2V0LCByZWczMik7CiAJCQkJCXJlZ09mZnNldCArPSA0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV9kZWYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fZGVmLmMKaW5kZXggMTdmMGE2OC4uYjk1NDBhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV9kZWYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tX2RlZi5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJhcjkwMDJfcGh5LmgiCiAKQEAgLTI3NiwxMSArMjc3LDExIEBACiAJY2FzZSBFRVBfTkZUSFJFU0hfMjoKIAkJcmV0dXJuIHBNb2RhbFsxXS5ub2lzZUZsb29yVGhyZXNoQ2hbMF07CiAJY2FzZSBFRVBfTUFDX0xTVzoKLQkJcmV0dXJuIHBCYXNlLT5tYWNBZGRyWzBdIDw8IDggfCBwQmFzZS0+bWFjQWRkclsxXTsKKwkJcmV0dXJuIGdldF91bmFsaWduZWRfYmUxNihwQmFzZS0+bWFjQWRkcik7CiAJY2FzZSBFRVBfTUFDX01JRDoKLQkJcmV0dXJuIHBCYXNlLT5tYWNBZGRyWzJdIDw8IDggfCBwQmFzZS0+bWFjQWRkclszXTsKKwkJcmV0dXJuIGdldF91bmFsaWduZWRfYmUxNihwQmFzZS0+bWFjQWRkciArIDIpOwogCWNhc2UgRUVQX01BQ19NU1c6Ci0JCXJldHVybiBwQmFzZS0+bWFjQWRkcls0XSA8PCA4IHwgcEJhc2UtPm1hY0FkZHJbNV07CisJCXJldHVybiBnZXRfdW5hbGlnbmVkX2JlMTYocEJhc2UtPm1hY0FkZHIgKyA0KTsKIAljYXNlIEVFUF9SRUdfMDoKIAkJcmV0dXJuIHBCYXNlLT5yZWdEbW5bMF07CiAJY2FzZSBFRVBfUkVHXzE6CkBAIC04MzEsMTAgKzgzMiw3IEBACiAKIAkJCXJlZ09mZnNldCA9IEFSX1BIWV9CQVNFICsgKDY3MiA8PCAyKSArIHJlZ0NoYWluT2Zmc2V0OwogCQkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKLQkJCQlyZWczMiA9ICgocGRhZGNWYWx1ZXNbNCAqIGogKyAwXSAmIDB4RkYpIDw8IDApIHwKLQkJCQkJKChwZGFkY1ZhbHVlc1s0ICogaiArIDFdICYgMHhGRikgPDwgOCkgfAotCQkJCQkoKHBkYWRjVmFsdWVzWzQgKiBqICsgMl0gJiAweEZGKSA8PCAxNil8Ci0JCQkJCSgocGRhZGNWYWx1ZXNbNCAqIGogKyAzXSAmIDB4RkYpIDw8IDI0KTsKKwkJCQlyZWczMiA9IGdldF91bmFsaWduZWRfbGUzMigmcGRhZGNWYWx1ZXNbNCAqIGpdKTsKIAkJCQlSRUdfV1JJVEUoYWgsIHJlZ09mZnNldCwgcmVnMzIpOwogCiAJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfRUVQUk9NLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2hpZl91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9oaWZfdXNiLmMKaW5kZXggMjYwZjFmMy4uZDNmNGE1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2hpZl91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaGlmX3VzYi5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSAiaHRjLmgiCiAKIC8qIGlkZW50aWZ5IGZpcm13YXJlIGltYWdlcyAqLwpAQCAtNDksNiArNTAsOCBAQAogCSAgLmRyaXZlcl9pbmZvID0gQVI5MjgwX1VTQiB9LCAgLyogTmV0Z2VhciBXTkRBMzIwMCAqLwogCXsgVVNCX0RFVklDRSgweDA4M0EsIDB4QTcwNCksCiAJICAuZHJpdmVyX2luZm8gPSBBUjkyODBfVVNCIH0sICAvKiBTTUMgTmV0d29ya3MgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDExLCAweDAxN2YpLAorCSAgLmRyaXZlcl9pbmZvID0gQVI5MjgwX1VTQiB9LCAgLyogU29ueSBVV0EtQlIxMDAgKi8KIAogCXsgVVNCX0RFVklDRSgweDBjZjMsIDB4MjBmZiksCiAJICAuZHJpdmVyX2luZm8gPSBTVE9SQUdFX0RFVklDRSB9LApAQCAtMTI3LDEyICsxMzAsMTQgQEAKIHN0YXRpYyB2b2lkIGhpZl91c2JfbWdtdF9jYihzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGNtZF9idWYgKmNtZCA9IChzdHJ1Y3QgY21kX2J1ZiAqKXVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgaGlmX2RldmljZV91c2IgKmhpZl9kZXYgPSBjbWQtPmhpZl9kZXY7CisJc3RydWN0IGhpZl9kZXZpY2VfdXNiICpoaWZfZGV2OwogCWJvb2wgdHhvayA9IHRydWU7CiAKIAlpZiAoIWNtZCB8fCAhY21kLT5za2IgfHwgIWNtZC0+aGlmX2RldikKIAkJcmV0dXJuOwogCisJaGlmX2RldiA9IGNtZC0+aGlmX2RldjsKKwogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKIAljYXNlIDA6CiAJCWJyZWFrOwpAQCAtNTU1LDggKzU2MCw4IEBACiAKIAkJcHRyID0gKHU4ICopIHNrYi0+ZGF0YTsKIAotCQlwa3RfbGVuID0gcHRyW2luZGV4XSArIChwdHJbaW5kZXgrMV0gPDwgOCk7Ci0JCXBrdF90YWcgPSBwdHJbaW5kZXgrMl0gKyAocHRyW2luZGV4KzNdIDw8IDgpOworCQlwa3RfbGVuID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHB0ciArIGluZGV4KTsKKwkJcGt0X3RhZyA9IGdldF91bmFsaWduZWRfbGUxNihwdHIgKyBpbmRleCArIDIpOwogCiAJCWlmIChwa3RfdGFnICE9IEFUSF9VU0JfUlhfU1RSRUFNX01PREVfVEFHKSB7CiAJCQlSWF9TVEFUX0lOQyhza2JfZHJvcHBlZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9iZWFjb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2JlYWNvbi5jCmluZGV4IGFhNmE3MzEuLjU3ZmUyMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2JlYWNvbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2JlYWNvbi5jCkBAIC03OSw3ICs3OSw3IEBACiAKIAltZW1zZXQoJmJzLCAwLCBzaXplb2YoYnMpKTsKIAotCWludHZhbCA9IGJzc19jb25mLT5iZWFjb25faW50ZXJ2YWwgJiBBVEg5S19CRUFDT05fUEVSSU9EOworCWludHZhbCA9IGJzc19jb25mLT5iZWFjb25faW50ZXJ2YWw7CiAJYm1pc3NfdGltZW91dCA9IChBVEhfREVGQVVMVF9CTUlTU19MSU1JVCAqIGJzc19jb25mLT5iZWFjb25faW50ZXJ2YWwpOwogCiAJLyoKQEAgLTE5NCw3ICsxOTQsNyBAQAogCXU4IGNtZF9yc3A7CiAJdTY0IHRzZjsKIAotCWludHZhbCA9IGJzc19jb25mLT5iZWFjb25faW50ZXJ2YWwgJiBBVEg5S19CRUFDT05fUEVSSU9EOworCWludHZhbCA9IGJzc19jb25mLT5iZWFjb25faW50ZXJ2YWw7CiAJaW50dmFsIC89IEFUSDlLX0hUQ19NQVhfQkNOX1ZJRjsKIAluZXh0dGJ0dCA9IGludHZhbDsKIApAQCAtMjUwLDcgKzI1MCw3IEBACiAJdTggY21kX3JzcDsKIAl1NjQgdHNmOwogCi0JaW50dmFsID0gYnNzX2NvbmYtPmJlYWNvbl9pbnRlcnZhbCAmIEFUSDlLX0JFQUNPTl9QRVJJT0Q7CisJaW50dmFsID0gYnNzX2NvbmYtPmJlYWNvbl9pbnRlcnZhbDsKIAluZXh0dGJ0dCA9IGludHZhbDsKIAogCS8qCkBAIC00MjcsNyArNDI3LDcgQEAKIAl1MTYgaW50dmFsOwogCWludCBzbG90OwogCi0JaW50dmFsID0gcHJpdi0+Y3VyX2JlYWNvbl9jb25mLmJlYWNvbl9pbnRlcnZhbCAmIEFUSDlLX0JFQUNPTl9QRVJJT0Q7CisJaW50dmFsID0gcHJpdi0+Y3VyX2JlYWNvbl9jb25mLmJlYWNvbl9pbnRlcnZhbDsKIAogCXRzZiA9IGJlNjRfdG9fY3B1KHN3YmEtPnRzZik7CiAJdHNmdHUgPSBUU0ZfVE9fVFUodHNmID4+IDMyLCB0c2YpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfZGVidWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2RlYnVnLmMKaW5kZXggYWE0OGIzYS4uZDNmZjMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9kZWJ1Zy5jCkBAIC02MjMsMTEgKzYyMyw4IEBACiAJCQkJcEJhc2U5Mjg3LT5vcGVuTG9vcFB3ckNudGwpOwogCX0KIAotCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkiJTIwcyA6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAotCQkJIk1hY0FkZHJlc3MiLAotCQkJcEJhc2UtPm1hY0FkZHJbMF0sIHBCYXNlLT5tYWNBZGRyWzFdLCBwQmFzZS0+bWFjQWRkclsyXSwKLQkJCXBCYXNlLT5tYWNBZGRyWzNdLCBwQmFzZS0+bWFjQWRkcls0XSwgcEJhc2UtPm1hY0FkZHJbNV0pOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sICIlMjBzIDogJXBNXG4iLCAiTWFjQWRkcmVzcyIsCisJCQlwQmFzZS0+bWFjQWRkcik7CiAJaWYgKGxlbiA+IHNpemUpCiAJCWxlbiA9IHNpemU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2luaXQuYwppbmRleCA2MWU2ZDM5Li4zYmVhN2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfaW5pdC5jCkBAIC03NTQsNiArNzU0LDcgQEAKIAkJSUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUyB8CiAJCUlFRUU4MDIxMV9IV19TVVBQT1JUU19QUyB8CiAJCUlFRUU4MDIxMV9IV19QU19OVUxMRlVOQ19TVEFDSyB8CisJCUlFRUU4MDIxMV9IV19SRVBPUlRTX1RYX0FDS19TVEFUVVMgfAogCQlJRUVFODAyMTFfSFdfSE9TVF9CUk9BRENBU1RfUFNfQlVGRkVSSU5HOwogCiAJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfbWFpbi5jCmluZGV4IDdiNzc5NjguLjcyMTJhY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9tYWluLmMKQEAgLTEyOTQsMTEgKzEyOTQsMTYgQEAKIAl1MzIgcmZpbHQ7CiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JYXRoOWtfaHRjX3BzX3dha2V1cChwcml2KTsKLQogCWNoYW5nZWRfZmxhZ3MgJj0gU1VQUE9SVEVEX0ZJTFRFUlM7CiAJKnRvdGFsX2ZsYWdzICY9IFNVUFBPUlRFRF9GSUxURVJTOwogCisJaWYgKHByaXYtPm9wX2ZsYWdzICYgT1BfSU5WQUxJRCkgeworCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihwcml2LT5haCksIEFUSF9EQkdfQU5ZLAorCQkJIlVuYWJsZSB0byBjb25maWd1cmUgZmlsdGVyIG9uIGludmFsaWQgc3RhdGVcbiIpOworCQlyZXR1cm47CisJfQorCWF0aDlrX2h0Y19wc193YWtldXAocHJpdik7CisKIAlwcml2LT5yeGZpbHRlciA9ICp0b3RhbF9mbGFnczsKIAlyZmlsdCA9IGF0aDlrX2h0Y19jYWxjcnhmaWx0ZXIocHJpdik7CiAJYXRoOWtfaHdfc2V0cnhmaWx0ZXIocHJpdi0+YWgsIHJmaWx0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody1vcHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody1vcHMuaAppbmRleCAyZjNlMDcyLi5jYjI5ZTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHctb3BzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LW9wcy5oCkBAIC0zOSwxMSArMzksNiBAQAogCWF0aDlrX2h3X29wcyhhaCktPnNldF9kZXNjX2xpbmsoZHMsIGxpbmspOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRoOWtfaHdfZ2V0X2Rlc2NfbGluayhzdHJ1Y3QgYXRoX2h3ICphaCwgdm9pZCAqZHMsCi0JCQkJCSAgdTMyICoqbGluaykKLXsKLQlhdGg5a19od19vcHMoYWgpLT5nZXRfZGVzY19saW5rKGRzLCBsaW5rKTsKLX0KIHN0YXRpYyBpbmxpbmUgYm9vbCBhdGg5a19od19jYWxpYnJhdGUoc3RydWN0IGF0aF9odyAqYWgsCiAJCQkJICAgICAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4sCiAJCQkJICAgICAgdTggcnhjaGFpbm1hc2ssCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCmluZGV4IDFiZTdjOGIuLjgwMDZjZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCkBAIC04Nyw3ICs4NywxMCBAQAogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXVuc2lnbmVkIGludCBjbG9ja3JhdGU7CiAKLQlpZiAoIWFoLT5jdXJjaGFuKSAvKiBzaG91bGQgcmVhbGx5IGNoZWNrIGZvciBDQ0sgaW5zdGVhZCAqLworCS8qIEFSOTI4NyB2MS4zKyB1c2VzIGFzeW5jIEZJRk8gYW5kIHJ1bnMgdGhlIE1BQyBhdCAxMTcgTUh6ICovCisJaWYgKEFSX1NSRVZfOTI4NyhhaCkgJiYgQVJfU1JFVl85Mjg3XzEzX09SX0xBVEVSKGFoKSkKKwkJY2xvY2tyYXRlID0gMTE3OworCWVsc2UgaWYgKCFhaC0+Y3VyY2hhbikgLyogc2hvdWxkIHJlYWxseSBjaGVjayBmb3IgQ0NLIGluc3RlYWQgKi8KIAkJY2xvY2tyYXRlID0gQVRIOUtfQ0xPQ0tfUkFURV9DQ0s7CiAJZWxzZSBpZiAoY29uZi0+Y2hhbm5lbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQogCQljbG9ja3JhdGUgPSBBVEg5S19DTE9DS19SQVRFXzJHSFpfT0ZETTsKQEAgLTk5LDYgKzEwMiwxMyBAQAogCWlmIChjb25mX2lzX2h0NDAoY29uZikpCiAJCWNsb2NrcmF0ZSAqPSAyOwogCisJaWYgKGFoLT5jdXJjaGFuKSB7CisJCWlmIChJU19DSEFOX0hBTEZfUkFURShhaC0+Y3VyY2hhbikpCisJCQljbG9ja3JhdGUgLz0gMjsKKwkJaWYgKElTX0NIQU5fUVVBUlRFUl9SQVRFKGFoLT5jdXJjaGFuKSkKKwkJCWNsb2NrcmF0ZSAvPSA0OworCX0KKwogCWNvbW1vbi0+Y2xvY2tyYXRlID0gY2xvY2tyYXRlOwogfQogCkBAIC0yNTEsNiArMjYxLDE1IEBACiAJY2FzZSBBUjU0MTZfQVI5MTAwX0RFVklEOgogCQlhaC0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID0gQVJfU1JFVl9WRVJTSU9OXzkxMDA7CiAJCWJyZWFrOworCWNhc2UgQVI5MzAwX0RFVklEX0FSOTMzMDoKKwkJYWgtPmh3X3ZlcnNpb24ubWFjVmVyc2lvbiA9IEFSX1NSRVZfVkVSU0lPTl85MzMwOworCQlpZiAoYWgtPmdldF9tYWNfcmV2aXNpb24pIHsKKwkJCWFoLT5od192ZXJzaW9uLm1hY1JldiA9IGFoLT5nZXRfbWFjX3JldmlzaW9uKCk7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBSRUdfUkVBRChhaCwgQVJfU1JFVik7CisJCQlhaC0+aHdfdmVyc2lvbi5tYWNSZXYgPSBNUyh2YWwsIEFSX1NSRVZfUkVWSVNJT04yKTsKKwkJfQorCQlyZXR1cm47CiAJY2FzZSBBUjkzMDBfREVWSURfQVI5MzQwOgogCQlhaC0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID0gQVJfU1JFVl9WRVJTSU9OXzkzNDA7CiAJCXZhbCA9IFJFR19SRUFEKGFoLCBBUl9TUkVWKTsKQEAgLTU1MSw2ICs1NzAsNyBAQAogCWNhc2UgQVJfU1JFVl9WRVJTSU9OXzkyODc6CiAJY2FzZSBBUl9TUkVWX1ZFUlNJT05fOTI3MToKIAljYXNlIEFSX1NSRVZfVkVSU0lPTl85MzAwOgorCWNhc2UgQVJfU1JFVl9WRVJTSU9OXzkzMzA6CiAJY2FzZSBBUl9TUkVWX1ZFUlNJT05fOTQ4NToKIAljYXNlIEFSX1NSRVZfVkVSU0lPTl85MzQwOgogCQlicmVhazsKQEAgLTU2MSw3ICs1ODEsOCBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JaWYgKEFSX1NSRVZfOTI3MShhaCkgfHwgQVJfU1JFVl85MTAwKGFoKSB8fCBBUl9TUkVWXzkzNDAoYWgpKQorCWlmIChBUl9TUkVWXzkyNzEoYWgpIHx8IEFSX1NSRVZfOTEwMChhaCkgfHwgQVJfU1JFVl85MzQwKGFoKSB8fAorCSAgICBBUl9TUkVWXzkzMzAoYWgpKQogCQlhaC0+aXNfcGNpZXhwcmVzcyA9IGZhbHNlOwogCiAJYWgtPmh3X3ZlcnNpb24ucGh5UmV2ID0gUkVHX1JFQUQoYWgsIEFSX1BIWV9DSElQX0lEKTsKQEAgLTYwNCw3ICs2MjUsMTAgQEAKIAllbHNlCiAJCWFoLT50eF90cmlnX2xldmVsID0gKEFSX0ZUUklHXzUxMkIgPj4gQVJfRlRSSUdfUyk7CiAKLQlhaC0+YmJfd2F0Y2hkb2dfdGltZW91dF9tcyA9IDI1OworCWlmIChBUl9TUkVWXzkzMzAoYWgpKQorCQlhaC0+YmJfd2F0Y2hkb2dfdGltZW91dF9tcyA9IDg1OworCWVsc2UKKwkJYWgtPmJiX3dhdGNoZG9nX3RpbWVvdXRfbXMgPSAyNTsKIAogCWNvbW1vbi0+c3RhdGUgPSBBVEhfSFdfSU5JVElBTElaRUQ7CiAKQEAgLTYzMCw2ICs2NTQsNyBAQAogCWNhc2UgQVIyNDI3X0RFVklEX1BDSUU6CiAJY2FzZSBBUjkzMDBfREVWSURfUENJRToKIAljYXNlIEFSOTMwMF9ERVZJRF9BUjk0ODVfUENJRToKKwljYXNlIEFSOTMwMF9ERVZJRF9BUjkzMzA6CiAJY2FzZSBBUjkzMDBfREVWSURfQVI5MzQwOgogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNzIyLDYgKzc0NywzOSBAQAogCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9DSDBfQkJfRFBMTDIsCiAJCQkgICAgICBBUl9DSDBfQkJfRFBMTDJfUExMX1BXRCwgMHgwKTsKIAkJdWRlbGF5KDEwMDApOworCX0gZWxzZSBpZiAoQVJfU1JFVl85MzMwKGFoKSkgeworCQl1MzIgZGRyX2RwbGwyLCBwbGxfY29udHJvbDIsIGtkOworCisJCWlmIChhaC0+aXNfY2xrXzI1bWh6KSB7CisJCQlkZHJfZHBsbDIgPSAweDE4ZTgyZjAxOworCQkJcGxsX2NvbnRyb2wyID0gMHhlMDRhM2Q7CisJCQlrZCA9IDB4MWQ7CisJCX0gZWxzZSB7CisJCQlkZHJfZHBsbDIgPSAweDE5ZTgyZjAxOworCQkJcGxsX2NvbnRyb2wyID0gMHg4ODY2NjY7CisJCQlrZCA9IDB4M2Q7CisJCX0KKworCQkvKiBwcm9ncmFtIEREUiBQTEwga2kgYW5kIGtkIHZhbHVlICovCisJCVJFR19XUklURShhaCwgQVJfQ0gwX0REUl9EUExMMiwgZGRyX2RwbGwyKTsKKworCQkvKiBwcm9ncmFtIEREUiBQTEwgcGhhc2Vfc2hpZnQgKi8KKwkJUkVHX1JNV19GSUVMRChhaCwgQVJfQ0gwX0REUl9EUExMMywKKwkJCSAgICAgIEFSX0NIMF9EUExMM19QSEFTRV9TSElGVCwgMHgxKTsKKworCQlSRUdfV1JJVEUoYWgsIEFSX1JUQ19QTExfQ09OVFJPTCwgMHgxMTQyYyk7CisJCXVkZWxheSgxMDAwKTsKKworCQkvKiBwcm9ncmFtIHJlZmRpdiwgbmludCwgZnJhYyB0byBSVEMgcmVnaXN0ZXIgKi8KKwkJUkVHX1dSSVRFKGFoLCBBUl9SVENfUExMX0NPTlRST0wyLCBwbGxfY29udHJvbDIpOworCisJCS8qIHByb2dyYW0gQkIgUExMIGtkIGFuZCBraSB2YWx1ZSAqLworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9DSDBfQkJfRFBMTDIsIEFSX0NIMF9EUExMMl9LRCwga2QpOworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9DSDBfQkJfRFBMTDIsIEFSX0NIMF9EUExMMl9LSSwgMHgwNik7CisKKwkJLyogcHJvZ3JhbSBCQiBQTEwgcGhhc2Vfc2hpZnQgKi8KKwkJUkVHX1JNV19GSUVMRChhaCwgQVJfQ0gwX0JCX0RQTEwzLAorCQkJICAgICAgQVJfQ0gwX0JCX0RQTEwzX1BIQVNFX1NISUZULCAweDEpOwogCX0gZWxzZSBpZiAoQVJfU1JFVl85MzQwKGFoKSkgewogCQl1MzIgcmVndmFsLCBwbGwyX2RpdmludCwgcGxsMl9kaXZmcmFjLCByZWZkaXY7CiAKQEAgLTc2Myw3ICs4MjEsNyBAQAogCiAJUkVHX1dSSVRFKGFoLCBBUl9SVENfUExMX0NPTlRST0wsIHBsbCk7CiAKLQlpZiAoQVJfU1JFVl85NDg1KGFoKSB8fCBBUl9TUkVWXzkzNDAoYWgpKQorCWlmIChBUl9TUkVWXzk0ODUoYWgpIHx8IEFSX1NSRVZfOTM0MChhaCkgfHwgQVJfU1JFVl85MzMwKGFoKSkKIAkJdWRlbGF5KDEwMDApOwogCiAJLyogU3dpdGNoIHRoZSBjb3JlIGNsb2NrIGZvciBhcjkyNzEgdG8gMTE3TWh6ICovCkBAIC04NDcsNiArOTA1LDEzIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBhdGg5a19od19zZXRfc2lmc190aW1lKHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgdXMpCit7CisJdTMyIHZhbCA9IGF0aDlrX2h3X21hY190b19jbGtzKGFoLCB1cyAtIDIpOworCXZhbCA9IG1pbih2YWwsICh1MzIpIDB4RkZGRik7CisJUkVHX1dSSVRFKGFoLCBBUl9EX0dCTF9JRlNfU0lGUywgdmFsKTsKK30KKwogc3RhdGljIHZvaWQgYXRoOWtfaHdfc2V0c2xvdHRpbWUoc3RydWN0IGF0aF9odyAqYWgsIHUzMiB1cykKIHsKIAl1MzIgdmFsID0gYXRoOWtfaHdfbWFjX3RvX2Nsa3MoYWgsIHVzKTsKQEAgLTg4NCwyNSArOTQ5LDYwIEBACiAKIHZvaWQgYXRoOWtfaHdfaW5pdF9nbG9iYWxfc2V0dGluZ3Moc3RydWN0IGF0aF9odyAqYWgpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmF0aDlrX2h3X2NvbW1vbihhaCktPmh3LT5jb25mOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZjb21tb24tPmh3LT5jb25mOworCWNvbnN0IHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuID0gYWgtPmN1cmNoYW47CiAJaW50IGFja3RpbWVvdXQ7CiAJaW50IHNsb3R0aW1lOwogCWludCBzaWZzdGltZTsKKwlpbnQgcnhfbGF0ID0gMCwgdHhfbGF0ID0gMCwgZWlmcyA9IDA7CisJdTMyIHJlZzsKIAogCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19SRVNFVCwgImFoLT5taXNjX21vZGUgMHgleFxuIiwKIAkJYWgtPm1pc2NfbW9kZSk7CiAKKwlpZiAoIWNoYW4pCisJCXJldHVybjsKKwogCWlmIChhaC0+bWlzY19tb2RlICE9IDApCiAJCVJFR19TRVRfQklUKGFoLCBBUl9QQ1VfTUlTQywgYWgtPm1pc2NfbW9kZSk7CiAKLQlpZiAoY29uZi0+Y2hhbm5lbCAmJiBjb25mLT5jaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCXNpZnN0aW1lID0gMTY7Ci0JZWxzZQotCQlzaWZzdGltZSA9IDEwOworCXJ4X2xhdCA9IDM3OworCXR4X2xhdCA9IDU0OworCisJaWYgKElTX0NIQU5fSEFMRl9SQVRFKGNoYW4pKSB7CisJCWVpZnMgPSAxNzU7CisJCXJ4X2xhdCAqPSAyOworCQl0eF9sYXQgKj0gMjsKKwkJaWYgKElTX0NIQU5fQV9GQVNUX0NMT0NLKGFoLCBjaGFuKSkKKwkJICAgIHR4X2xhdCArPSAxMTsKKworCQlzbG90dGltZSA9IDEzOworCQlzaWZzdGltZSA9IDMyOworCX0gZWxzZSBpZiAoSVNfQ0hBTl9RVUFSVEVSX1JBVEUoY2hhbikpIHsKKwkJZWlmcyA9IDM0MDsKKwkJcnhfbGF0ICo9IDQ7CisJCXR4X2xhdCAqPSA0OworCQlpZiAoSVNfQ0hBTl9BX0ZBU1RfQ0xPQ0soYWgsIGNoYW4pKQorCQkgICAgdHhfbGF0ICs9IDIyOworCisJCXNsb3R0aW1lID0gMjE7CisJCXNpZnN0aW1lID0gNjQ7CisJfSBlbHNlIHsKKwkJZWlmcyA9IFJFR19SRUFEKGFoLCBBUl9EX0dCTF9JRlNfRUlGUyk7CisJCXJlZyA9IFJFR19SRUFEKGFoLCBBUl9VU0VDKTsKKwkJcnhfbGF0ID0gTVMocmVnLCBBUl9VU0VDX1JYX0xBVCk7CisJCXR4X2xhdCA9IE1TKHJlZywgQVJfVVNFQ19UWF9MQVQpOworCisJCXNsb3R0aW1lID0gYWgtPnNsb3R0aW1lOworCQlpZiAoSVNfQ0hBTl81R0haKGNoYW4pKQorCQkJc2lmc3RpbWUgPSAxNjsKKwkJZWxzZQorCQkJc2lmc3RpbWUgPSAxMDsKKwl9CiAKIAkvKiBBcyBkZWZpbmVkIGJ5IElFRUUgODAyLjExLTIwMDcgMTcuMy44LjYgKi8KLQlzbG90dGltZSA9IGFoLT5zbG90dGltZSArIDMgKiBhaC0+Y292ZXJhZ2VfY2xhc3M7Ci0JYWNrdGltZW91dCA9IHNsb3R0aW1lICsgc2lmc3RpbWU7CisJYWNrdGltZW91dCA9IHNsb3R0aW1lICsgc2lmc3RpbWUgKyAzICogYWgtPmNvdmVyYWdlX2NsYXNzOwogCiAJLyoKIAkgKiBXb3JrYXJvdW5kIGZvciBlYXJseSBBQ0sgdGltZW91dHMsIGFkZCBhbiBvZmZzZXQgdG8gbWF0Y2ggdGhlCkBAIC05MTQsMTEgKzEwMTQsMjAgQEAKIAlpZiAoY29uZi0+Y2hhbm5lbCAmJiBjb25mLT5jaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopCiAJCWFja3RpbWVvdXQgKz0gNjQgLSBzaWZzdGltZSAtIGFoLT5zbG90dGltZTsKIAotCWF0aDlrX2h3X3NldHNsb3R0aW1lKGFoLCBhaC0+c2xvdHRpbWUpOworCWF0aDlrX2h3X3NldF9zaWZzX3RpbWUoYWgsIHNpZnN0aW1lKTsKKwlhdGg5a19od19zZXRzbG90dGltZShhaCwgc2xvdHRpbWUpOwogCWF0aDlrX2h3X3NldF9hY2tfdGltZW91dChhaCwgYWNrdGltZW91dCk7CiAJYXRoOWtfaHdfc2V0X2N0c190aW1lb3V0KGFoLCBhY2t0aW1lb3V0KTsKIAlpZiAoYWgtPmdsb2JhbHR4dGltZW91dCAhPSAodTMyKSAtMSkKIAkJYXRoOWtfaHdfc2V0X2dsb2JhbF90eHRpbWVvdXQoYWgsIGFoLT5nbG9iYWx0eHRpbWVvdXQpOworCisJUkVHX1dSSVRFKGFoLCBBUl9EX0dCTF9JRlNfRUlGUywgYXRoOWtfaHdfbWFjX3RvX2Nsa3MoYWgsIGVpZnMpKTsKKwlSRUdfUk1XKGFoLCBBUl9VU0VDLAorCQkoY29tbW9uLT5jbG9ja3JhdGUgLSAxKSB8CisJCVNNKHJ4X2xhdCwgQVJfVVNFQ19SWF9MQVQpIHwKKwkJU00odHhfbGF0LCBBUl9VU0VDX1RYX0xBVCksCisJCUFSX1VTRUNfVFhfTEFUIHwgQVJfVVNFQ19SWF9MQVQgfCBBUl9VU0VDX1VTRUMpOworCiB9CiBFWFBPUlRfU1lNQk9MKGF0aDlrX2h3X2luaXRfZ2xvYmFsX3NldHRpbmdzKTsKIApAQCAtMTExNCw2ICsxMjIzLDQxIEBACiAJCQlyc3RfZmxhZ3MgfD0gQVJfUlRDX1JDX01BQ19DT0xEOwogCX0KIAorCWlmIChBUl9TUkVWXzkzMzAoYWgpKSB7CisJCWludCBucGVuZCA9IDA7CisJCWludCBpOworCisJCS8qIEFSOTMzMCBXQVI6CisJCSAqIGNhbGwgZXh0ZXJuYWwgcmVzZXQgZnVuY3Rpb24gdG8gcmVzZXQgV01BQyBpZjoKKwkJICogLSBkb2luZyBhIGNvbGQgcmVzZXQKKwkJICogLSB3ZSBoYXZlIHBlbmRpbmcgZnJhbWVzIGluIHRoZSBUWCBxdWV1ZXMKKwkJICovCisKKwkJZm9yIChpID0gMDsgaSA8IEFSX05VTV9RQ1U7IGkrKykgeworCQkJbnBlbmQgPSBhdGg5a19od19udW10eHBlbmRpbmcoYWgsIGkpOworCQkJaWYgKG5wZW5kKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFoLT5leHRlcm5hbF9yZXNldCAmJgorCQkgICAgKG5wZW5kIHx8IHR5cGUgPT0gQVRIOUtfUkVTRVRfQ09MRCkpIHsKKwkJCWludCByZXNldF9lcnIgPSAwOworCisJCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfUkVTRVQsCisJCQkJInJlc2V0IE1BQyB2aWEgZXh0ZXJuYWwgcmVzZXRcbiIpOworCisJCQlyZXNldF9lcnIgPSBhaC0+ZXh0ZXJuYWxfcmVzZXQoKTsKKwkJCWlmIChyZXNldF9lcnIpIHsKKwkJCQlhdGhfZXJyKGF0aDlrX2h3X2NvbW1vbihhaCksCisJCQkJCSJFeHRlcm5hbCByZXNldCBmYWlsZWQsIGVycj0lZFxuIiwKKwkJCQkJcmVzZXRfZXJyKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCVJFR19XUklURShhaCwgQVJfUlRDX1JFU0VULCAxKTsKKwkJfQorCX0KKwogCVJFR19XUklURShhaCwgQVJfUlRDX1JDLCByc3RfZmxhZ3MpOwogCiAJUkVHV1JJVEVfQlVGRkVSX0ZMVVNIKGFoKTsKQEAgLTE0ODcsOSArMTYzMSwxMyBAQAogCiAJYXRoOWtfaHdfaW5pdF9nbG9iYWxfc2V0dGluZ3MoYWgpOwogCi0JaWYgKCFBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7Ci0JCWFyOTAwMl9od191cGRhdGVfYXN5bmNfZmlmbyhhaCk7Ci0JCWFyOTAwMl9od19lbmFibGVfd2VwX2FnZ3JlZ2F0aW9uKGFoKTsKKwlpZiAoQVJfU1JFVl85Mjg3KGFoKSAmJiBBUl9TUkVWXzkyODdfMTNfT1JfTEFURVIoYWgpKSB7CisJCVJFR19TRVRfQklUKGFoLCBBUl9NQUNfUENVX0xPR0lDX0FOQUxZWkVSLAorCQkJICAgIEFSX01BQ19QQ1VfTE9HSUNfQU5BTFlaRVJfRElTQlVHMjA3NjgpOworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9BSEJfTU9ERSwgQVJfQUhCX0NVU1RPTV9CVVJTVF9FTiwKKwkJCSAgICAgIEFSX0FIQl9DVVNUT01fQlVSU1RfQVNZTkNfRklGT19WQUwpOworCQlSRUdfU0VUX0JJVChhaCwgQVJfUENVX01JU0NfTU9ERTIsCisJCQkgICAgQVJfUENVX01JU0NfTU9ERTJfRU5BQkxFX0FHR1dFUCk7CiAJfQogCiAJUkVHX1NFVF9CSVQoYWgsIEFSX1NUQV9JRDEsIEFSX1NUQV9JRDFfUFJFU0VSVkVfU0VRTlVNKTsKQEAgLTE1NDUsNyArMTY5Myw3IEBACiAJCQkJUkVHX1dSSVRFKGFoLCBBUl9DRkcsIEFSX0NGR19TV1REIHwgQVJfQ0ZHX1NXUkQpOwogCQl9CiAjaWZkZWYgX19CSUdfRU5ESUFOCi0JCWVsc2UgaWYgKEFSX1NSRVZfOTM0MChhaCkpCisJCWVsc2UgaWYgKEFSX1NSRVZfOTMzMChhaCkgfHwgQVJfU1JFVl85MzQwKGFoKSkKIAkJCVJFR19STVcoYWgsIEFSX0NGRywgQVJfQ0ZHX1NXUkIgfCBBUl9DRkdfU1dUQiwgMCk7CiAJCWVsc2UKIAkJCVJFR19XUklURShhaCwgQVJfQ0ZHLCBBUl9DRkdfU1dURCB8IEFSX0NGR19TV1JEKTsKQEAgLTE3ODUsMTYgKzE5MzMsMTYgQEAKIAlSRUdfV1JJVEUoYWgsIEFSX05FWFRfVEJUVF9USU1FUiwgVFVfVE9fVVNFQyhicy0+YnNfbmV4dHRidHQpKTsKIAogCVJFR19XUklURShhaCwgQVJfQkVBQ09OX1BFUklPRCwKLQkJICBUVV9UT19VU0VDKGJzLT5ic19pbnR2YWwgJiBBVEg5S19CRUFDT05fUEVSSU9EKSk7CisJCSAgVFVfVE9fVVNFQyhicy0+YnNfaW50dmFsKSk7CiAJUkVHX1dSSVRFKGFoLCBBUl9ETUFfQkVBQ09OX1BFUklPRCwKLQkJICBUVV9UT19VU0VDKGJzLT5ic19pbnR2YWwgJiBBVEg5S19CRUFDT05fUEVSSU9EKSk7CisJCSAgVFVfVE9fVVNFQyhicy0+YnNfaW50dmFsKSk7CiAKIAlSRUdXUklURV9CVUZGRVJfRkxVU0goYWgpOwogCiAJUkVHX1JNV19GSUVMRChhaCwgQVJfUlNTSV9USFIsCiAJCSAgICAgIEFSX1JTU0lfVEhSX0JNX1RIUiwgYnMtPmJzX2JtaXNzdGhyZXNob2xkKTsKIAotCWJlYWNvbmludHZhbCA9IGJzLT5ic19pbnR2YWwgJiBBVEg5S19CRUFDT05fUEVSSU9EOworCWJlYWNvbmludHZhbCA9IGJzLT5ic19pbnR2YWw7CiAKIAlpZiAoYnMtPmJzX3NsZWVwZHVyYXRpb24gPiBiZWFjb25pbnR2YWwpCiAJCWJlYWNvbmludHZhbCA9IGJzLT5ic19zbGVlcGR1cmF0aW9uOwpAQCAtMTg0OSwxMiArMTk5NywyMiBAQAogLyogSFcgQ2FwYWJpbGl0aWVzICovCiAvKioqKioqKioqKioqKioqKioqKi8KIAorc3RhdGljIHU4IGZpeHVwX2NoYWlubWFzayh1OCBjaGlwX2NoYWlubWFzaywgdTggZWVwcm9tX2NoYWlubWFzaykKK3sKKwllZXByb21fY2hhaW5tYXNrICY9IGNoaXBfY2hhaW5tYXNrOworCWlmIChlZXByb21fY2hhaW5tYXNrKQorCQlyZXR1cm4gZWVwcm9tX2NoYWlubWFzazsKKwllbHNlCisJCXJldHVybiBjaGlwX2NoYWlubWFzazsKK30KKwogaW50IGF0aDlrX2h3X2ZpbGxfY2FwX2luZm8oc3RydWN0IGF0aF9odyAqYWgpCiB7CiAJc3RydWN0IGF0aDlrX2h3X2NhcGFiaWxpdGllcyAqcENhcCA9ICZhaC0+Y2FwczsKIAlzdHJ1Y3QgYXRoX3JlZ3VsYXRvcnkgKnJlZ3VsYXRvcnkgPSBhdGg5a19od19yZWd1bGF0b3J5KGFoKTsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKIAlzdHJ1Y3QgYXRoX2J0Y29leF9odyAqYnRjb2V4X2h3ID0gJmFoLT5idGNvZXhfaHc7CisJdW5zaWduZWQgaW50IGNoaXBfY2hhaW5tYXNrOwogCiAJdTE2IGVldmFsOwogCXU4IGFudF9kaXZfY3RsMSwgdHhfY2hhaW5tYXNrLCByeF9jaGFpbm1hc2s7CkBAIC0xODkxLDYgKzIwNDksMTUgQEAKIAlpZiAoZWV2YWwgJiBBUjU0MTZfT1BGTEFHU18xMUcpCiAJCXBDYXAtPmh3X2NhcHMgfD0gQVRIOUtfSFdfQ0FQXzJHSFo7CiAKKwlpZiAoQVJfU1JFVl85NDg1KGFoKSB8fCBBUl9TUkVWXzkyODUoYWgpIHx8IEFSX1NSRVZfOTMzMChhaCkpCisJCWNoaXBfY2hhaW5tYXNrID0gMTsKKwllbHNlIGlmICghQVJfU1JFVl85MjgwXzIwX09SX0xBVEVSKGFoKSkKKwkJY2hpcF9jaGFpbm1hc2sgPSA3OworCWVsc2UgaWYgKCFBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpIHx8IEFSX1NSRVZfOTM0MChhaCkpCisJCWNoaXBfY2hhaW5tYXNrID0gMzsKKwllbHNlCisJCWNoaXBfY2hhaW5tYXNrID0gNzsKKwogCXBDYXAtPnR4X2NoYWlubWFzayA9IGFoLT5lZXBfb3BzLT5nZXRfZWVwcm9tKGFoLCBFRVBfVFhfTUFTSyk7CiAJLyoKIAkgKiBGb3IgQVI5MjcxIHdlIHdpbGwgdGVtcG9yYXJpbGx5IHVzZXMgdGhlIHJ4IGNoYWlubWF4IGFzIHJlYWQgZnJvbQpAQCAtMTkwNyw2ICsyMDc0LDkgQEAKIAkJLyogVXNlIHJ4X2NoYWlubWFzayBmcm9tIEVFUFJPTS4gKi8KIAkJcENhcC0+cnhfY2hhaW5tYXNrID0gYWgtPmVlcF9vcHMtPmdldF9lZXByb20oYWgsIEVFUF9SWF9NQVNLKTsKIAorCXBDYXAtPnR4X2NoYWlubWFzayA9IGZpeHVwX2NoYWlubWFzayhjaGlwX2NoYWlubWFzaywgcENhcC0+dHhfY2hhaW5tYXNrKTsKKwlwQ2FwLT5yeF9jaGFpbm1hc2sgPSBmaXh1cF9jaGFpbm1hc2soY2hpcF9jaGFpbm1hc2ssIHBDYXAtPnJ4X2NoYWlubWFzayk7CisKIAlhaC0+bWlzY19tb2RlIHw9IEFSX1BDVV9NSUNfTkVXX0xPQ19FTkE7CiAKIAkvKiBlbmFibGUga2V5IHNlYXJjaCBmb3IgZXZlcnkgZnJhbWUgaW4gYW4gYWdncmVnYXRlICovCkBAIC0xOTgzLDcgKzIxNTMsNyBAQAogCiAJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKIAkJcENhcC0+aHdfY2FwcyB8PSBBVEg5S19IV19DQVBfRURNQSB8IEFUSDlLX0hXX0NBUF9GQVNUQ0xPQ0s7Ci0JCWlmICghQVJfU1JFVl85NDg1KGFoKSkKKwkJaWYgKCFBUl9TUkVWXzkzMzAoYWgpICYmICFBUl9TUkVWXzk0ODUoYWgpKQogCQkJcENhcC0+aHdfY2FwcyB8PSBBVEg5S19IV19DQVBfTERQQzsKIAogCQlwQ2FwLT5yeF9ocF9xZGVwdGggPSBBVEg5S19IV19SWF9IUF9RREVQVEg7CkBAIC0xOTk2LDEwICsyMTY2LDcgQEAKIAkJCXBDYXAtPmh3X2NhcHMgfD0gQVRIOUtfSFdfQ0FQX1BBUFJEOwogCX0gZWxzZSB7CiAJCXBDYXAtPnR4X2Rlc2NfbGVuID0gc2l6ZW9mKHN0cnVjdCBhdGhfZGVzYyk7Ci0JCWlmIChBUl9TUkVWXzkyODBfMjAoYWgpICYmCi0JCSAgICAoKGFoLT5lZXBfb3BzLT5nZXRfZWVwcm9tKGFoLCBFRVBfTUlOT1JfUkVWKSA8PQotCQkgICAgICBBUjU0MTZfRUVQX01JTk9SX1ZFUl8xNikgfHwKLQkJICAgICBhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbShhaCwgRUVQX0ZTVENMS181RykpKQorCQlpZiAoQVJfU1JFVl85MjgwXzIwKGFoKSkKIAkJCXBDYXAtPmh3X2NhcHMgfD0gQVRIOUtfSFdfQ0FQX0ZBU1RDTE9DSzsKIAl9CiAKQEAgLTIwMjUsNyArMjE5Miw3IEBACiAJfQogCiAKLQlpZiAoQVJfU1JFVl85NDg1KGFoKSkgeworCWlmIChBUl9TUkVWXzkzMzAoYWgpIHx8IEFSX1NSRVZfOTQ4NShhaCkpIHsKIAkJYW50X2Rpdl9jdGwxID0gYWgtPmVlcF9vcHMtPmdldF9lZXByb20oYWgsIEVFUF9BTlRfRElWX0NUTDEpOwogCQkvKgogCQkgKiBlbmFibGUgdGhlIGRpdmVyc2l0eS1jb21iaW5pbmcgYWxnb3JpdGhtIG9ubHkgd2hlbgpAQCAtMjU3NCw2ICsyNzQxLDcgQEAKIAl7IEFSX1NSRVZfVkVSU0lPTl85Mjg3LCAgICAgICAgICI5Mjg3IiB9LAogCXsgQVJfU1JFVl9WRVJTSU9OXzkyNzEsICAgICAgICAgIjkyNzEiIH0sCiAJeyBBUl9TUkVWX1ZFUlNJT05fOTMwMCwgICAgICAgICAiOTMwMCIgfSwKKwl7IEFSX1NSRVZfVkVSU0lPTl85MzMwLCAgICAgICAgICI5MzMwIiB9LAogCXsgQVJfU1JFVl9WRVJTSU9OXzk0ODUsICAgICAgICAgIjk0ODUiIH0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCmluZGV4IDRiMTU3YzUuLjZhY2QwZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCkBAIC00NSw2ICs0NSw3IEBACiAjZGVmaW5lIEFSOTMwMF9ERVZJRF9QQ0lFCTB4MDAzMAogI2RlZmluZSBBUjkzMDBfREVWSURfQVI5MzQwCTB4MDAzMQogI2RlZmluZSBBUjkzMDBfREVWSURfQVI5NDg1X1BDSUUgMHgwMDMyCisjZGVmaW5lIEFSOTMwMF9ERVZJRF9BUjkzMzAJMHgwMDM1CiAKICNkZWZpbmUgQVI1NDE2X0FSOTEwMF9ERVZJRAkweDAwMGIKIApAQCAtMTQyLDYgKzE0Myw4IEBACiAjZGVmaW5lIEFSX0tFWVRBQkxFX1NJWkUgICAgICAgICAgICAxMjgKICNkZWZpbmUgUE9XRVJfVVBfVElNRSAgICAgICAgICAgICAgIDEwMDAwCiAjZGVmaW5lIFNQVVJfUlNTSV9USFJFU0ggICAgICAgICAgICA0MAorI2RlZmluZSBVUFBFUl81R19TVUJfQkFORF9TVEFSVAkJNTcwMAorI2RlZmluZSBNSURfNUdfU1VCX0JBTkRfU1RBUlQJCTU0MDAKIAogI2RlZmluZSBDQUJfVElNRU9VVF9WQUwgICAgICAgICAgICAgMTAKICNkZWZpbmUgQkVBQ09OX1RJTUVPVVRfVkFMICAgICAgICAgIDEwCkBAIC0xNTcsOCArMTYwLDkgQEAKICNkZWZpbmUgQVRIOUtfSFdfUlhfSFBfUURFUFRICTE2CiAjZGVmaW5lIEFUSDlLX0hXX1JYX0xQX1FERVBUSAkxMjgKIAotI2RlZmluZSBQQVBSRF9HQUlOX1RBQkxFX0VOVFJJRVMgICAgMzIKLSNkZWZpbmUgUEFQUkRfVEFCTEVfU1ogICAgICAgICAgICAgIDI0CisjZGVmaW5lIFBBUFJEX0dBSU5fVEFCTEVfRU5UUklFUwkzMgorI2RlZmluZSBQQVBSRF9UQUJMRV9TWgkJCTI0CisjZGVmaW5lIFBBUFJEX0lERUFMX0FHQzJfUFdSX1JBTkdFCTB4ZTAKIAogZW51bSBhdGhfaHdfdHhxX3N1YnR5cGUgewogCUFUSF9UWFFfQUNfQkUgPSAwLApAQCAtNDAzLDcgKzQwNyw2IEBACiAJdTMyIGJzX25leHR0YnR0OwogCXUzMiBic19uZXh0ZHRpbTsKIAl1MzIgYnNfaW50dmFsOwotI2RlZmluZSBBVEg5S19CRUFDT05fUEVSSU9EICAgICAgIDB4MDAwMGZmZmYKICNkZWZpbmUgQVRIOUtfVFNGT09SX1RIUkVTSE9MRCAgICAweDAwMDA0MjQwIC8qIDE2ayB1cyAqLwogCXUzMiBic19kdGltcGVyaW9kOwogCXUxNiBic19jZnBwZXJpb2Q7CkBAIC02MDMsNyArNjA2LDYgQEAKIAkJCQkgICAgIGludCBwb3dlcl9vZmYpOwogCXZvaWQgKCpyeF9lbmFibGUpKHN0cnVjdCBhdGhfaHcgKmFoKTsKIAl2b2lkICgqc2V0X2Rlc2NfbGluaykodm9pZCAqZHMsIHUzMiBsaW5rKTsKLQl2b2lkICgqZ2V0X2Rlc2NfbGluaykodm9pZCAqZHMsIHUzMiAqKmxpbmspOwogCWJvb2wgKCpjYWxpYnJhdGUpKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiwKIAkJCSAgdTggcnhjaGFpbm1hc2ssCkBAIC04NjIsNiArODY0LDggQEAKIAl1MzIgZW50X21vZGU7CiAKIAlib29sIGlzX2Nsa18yNW1oejsKKwlpbnQgKCpnZXRfbWFjX3JldmlzaW9uKSh2b2lkKTsKKwlpbnQgKCpleHRlcm5hbF9yZXNldCkodm9pZCk7CiB9OwogCiBzdHJ1Y3QgYXRoX2J1c19vcHMgewpAQCAtOTgxLDggKzk4NSw2IEBACiB2b2lkIGFyOTAwMl9od19jY2tfY2hhbjE0X3NwcmVhZChzdHJ1Y3QgYXRoX2h3ICphaCk7CiBpbnQgYXI5MDAyX2h3X3JmX2NsYWltKHN0cnVjdCBhdGhfaHcgKmFoKTsKIHZvaWQgYXI5MDAyX2h3X2VuYWJsZV9hc3luY19maWZvKHN0cnVjdCBhdGhfaHcgKmFoKTsKLXZvaWQgYXI5MDAyX2h3X3VwZGF0ZV9hc3luY19maWZvKHN0cnVjdCBhdGhfaHcgKmFoKTsKLXZvaWQgYXI5MDAyX2h3X2VuYWJsZV93ZXBfYWdncmVnYXRpb24oc3RydWN0IGF0aF9odyAqYWgpOwogCiAvKgogICogQ29kZSBzcGVjaWZpYyB0byBBUjkwMDMsIHdlIHN0dWZmIHRoZXNlIGhlcmUgdG8gYXZvaWQgY2FsbGJhY2tzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYwppbmRleCA0NWM1ODVhLi5hYzUxMDcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2F0aDlrX3BsYXRmb3JtLmg+CiAKQEAgLTE5Niw2ICsxOTcsMTkgQEAKIAlyZXR1cm4gdmFsOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IF9fYXRoOWtfcmVnX3JtdyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgdTMyIHJlZ19vZmZzZXQsCisJCQkJICAgIHUzMiBzZXQsIHUzMiBjbHIpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IGlvcmVhZDMyKHNjLT5tZW0gKyByZWdfb2Zmc2V0KTsKKwl2YWwgJj0gfmNscjsKKwl2YWwgfD0gc2V0OworCWlvd3JpdGUzMih2YWwsIHNjLT5tZW0gKyByZWdfb2Zmc2V0KTsKKworCXJldHVybiB2YWw7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYXRoOWtfcmVnX3Jtdyh2b2lkICpod19wcml2LCB1MzIgcmVnX29mZnNldCwgdTMyIHNldCwgdTMyIGNscikKIHsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IChzdHJ1Y3QgYXRoX2h3ICopIGh3X3ByaXY7CkBAIC0yMDQsMTYgKzIxOCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoZmxhZ3MpOwogCXUzMiB2YWw7CiAKLQlpZiAoYWgtPmNvbmZpZy5zZXJpYWxpemVfcmVnbW9kZSA9PSBTRVJfUkVHX01PREVfT04pCisJaWYgKGFoLT5jb25maWcuc2VyaWFsaXplX3JlZ21vZGUgPT0gU0VSX1JFR19NT0RFX09OKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+c2Nfc2VyaWFsX3J3LCBmbGFncyk7Ci0KLQl2YWwgPSBpb3JlYWQzMihzYy0+bWVtICsgcmVnX29mZnNldCk7Ci0JdmFsICY9IH5jbHI7Ci0JdmFsIHw9IHNldDsKLQlpb3dyaXRlMzIodmFsLCBzYy0+bWVtICsgcmVnX29mZnNldCk7Ci0KLQlpZiAoYWgtPmNvbmZpZy5zZXJpYWxpemVfcmVnbW9kZSA9PSBTRVJfUkVHX01PREVfT04pCisJCXZhbCA9IF9fYXRoOWtfcmVnX3JtdyhzYywgcmVnX29mZnNldCwgc2V0LCBjbHIpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+c2Nfc2VyaWFsX3J3LCBmbGFncyk7CisJfSBlbHNlCisJCXZhbCA9IF9fYXRoOWtfcmVnX3JtdyhzYywgcmVnX29mZnNldCwgc2V0LCBjbHIpOwogCiAJcmV0dXJuIHZhbDsKIH0KQEAgLTI0NSw3ICsyNTUsNyBAQAogCWh0X2luZm8tPmFtcGR1X2ZhY3RvciA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLOwogCWh0X2luZm8tPmFtcGR1X2RlbnNpdHkgPSBJRUVFODAyMTFfSFRfTVBEVV9ERU5TSVRZXzg7CiAKLQlpZiAoQVJfU1JFVl85NDg1KGFoKSkKKwlpZiAoQVJfU1JFVl85MzMwKGFoKSB8fCBBUl9TUkVWXzk0ODUoYWgpKQogCQltYXhfc3RyZWFtcyA9IDE7CiAJZWxzZSBpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkKIAkJbWF4X3N0cmVhbXMgPSAzOwpAQCAtMjk4LDEwICszMDgsNiBAQAogCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBjb25zdCBjaGFyICpuYW1lLAogCQkgICAgICBpbnQgbmJ1ZiwgaW50IG5kZXNjLCBib29sIGlzX3R4KQogewotI2RlZmluZQlEUzJQSFlTKF9kZCwgX2RzKQkJCQkJCVwKLQkoKF9kZCktPmRkX2Rlc2NfcGFkZHIgKyAoKGNhZGRyX3QpKF9kcykgLSAoY2FkZHJfdCkoX2RkKS0+ZGRfZGVzYykpCi0jZGVmaW5lIEFUSF9ERVNDXzRLQl9CT1VORF9DSEVDSyhfZGFkZHIpICgoKChfZGFkZHIpICYgMHhGRkYpID4gMHhGN0YpID8gMSA6IDApCi0jZGVmaW5lIEFUSF9ERVNDXzRLQl9CT1VORF9OVU1fU0tJUFBFRChfbGVuKSAoKF9sZW4pIC8gNDA5NikKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CiAJdTggKmRzOwogCXN0cnVjdCBhdGhfYnVmICpiZjsKQEAgLTM5Niw5ICs0MDIsNiBAQAogZmFpbDoKIAltZW1zZXQoZGQsIDAsIHNpemVvZigqZGQpKTsKIAlyZXR1cm4gZXJyb3I7Ci0jdW5kZWYgQVRIX0RFU0NfNEtCX0JPVU5EX0NIRUNLCi0jdW5kZWYgQVRIX0RFU0NfNEtCX0JPVU5EX05VTV9TS0lQUEVECi0jdW5kZWYgRFMyUEhZUwogfQogCiB2b2lkIGF0aDlrX2luaXRfY3J5cHRvKHN0cnVjdCBhdGhfc29mdGMgKnNjKQpAQCAtNTE5LDcgKzUyMiw2IEBACiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpOwogCWludCBpID0gMDsKLQogCXNldHVwX3RpbWVyKCZjb21tb24tPmFuaS50aW1lciwgYXRoX2FuaV9jYWxpYnJhdGUsICh1bnNpZ25lZCBsb25nKXNjKTsKIAogCXNjLT5jb25maWcudHhwb3dsaW1pdCA9IEFUSF9UWFBPV0VSX01BWDsKQEAgLTU3NSw2ICs1NzcsOCBAQAogCQlzYy0+c2NfYWgtPmdwaW9fdmFsID0gcGRhdGEtPmdwaW9fdmFsOwogCQlzYy0+c2NfYWgtPmxlZF9waW4gPSBwZGF0YS0+bGVkX3BpbjsKIAkJYWgtPmlzX2Nsa18yNW1oeiA9IHBkYXRhLT5pc19jbGtfMjVtaHo7CisJCWFoLT5nZXRfbWFjX3JldmlzaW9uID0gcGRhdGEtPmdldF9tYWNfcmV2aXNpb247CisJCWFoLT5leHRlcm5hbF9yZXNldCA9IHBkYXRhLT5leHRlcm5hbF9yZXNldDsKIAl9CiAKIAljb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwpAQCAtNTg1LDYgKzU4OSw3IEBACiAJY29tbW9uLT5wcml2ID0gc2M7CiAJY29tbW9uLT5kZWJ1Z19tYXNrID0gYXRoOWtfZGVidWc7CiAJY29tbW9uLT5idGNvZXhfZW5hYmxlZCA9IGF0aDlrX2J0Y29leF9lbmFibGUgPT0gMTsKKwljb21tb24tPmRpc2FibGVfYW5pID0gZmFsc2U7CiAJc3Bpbl9sb2NrX2luaXQoJmNvbW1vbi0+Y2NfbG9jayk7CiAKIAlzcGluX2xvY2tfaW5pdCgmc2MtPnNjX3NlcmlhbF9ydyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmMKaW5kZXggYzIwOTFmMS4uYjZiNTIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWMuYwpAQCAtNjQ1LDggKzY0NSw3IEBACiAJCQlycy0+cnNfc3RhdHVzIHw9IEFUSDlLX1JYRVJSX0RFQ1JZUFQ7CiAJCWVsc2UgaWYgKGFkcy5kc19yeHN0YXR1czggJiBBUl9NaWNoYWVsRXJyKQogCQkJcnMtPnJzX3N0YXR1cyB8PSBBVEg5S19SWEVSUl9NSUM7Ci0KLQkJaWYgKGFkcy5kc19yeHN0YXR1czggJiBBUl9LZXlNaXNzKQorCQllbHNlIGlmIChhZHMuZHNfcnhzdGF0dXM4ICYgQVJfS2V5TWlzcykKIAkJCXJzLT5yc19zdGF0dXMgfD0gQVRIOUtfUlhFUlJfREVDUllQVDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCmluZGV4IDJjYTM1MWYuLjkwOThhYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYwpAQCAtNjIsMTQgKzYyLDEyIEBACiAKIAlpZiAodHhxLT5heHFfZGVwdGggfHwgIWxpc3RfZW1wdHkoJnR4cS0+YXhxX2FjcSkpCiAJCXBlbmRpbmcgPSB0cnVlOwotCWVsc2UgaWYgKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0VETUEpCi0JCXBlbmRpbmcgPSAhbGlzdF9lbXB0eSgmdHhxLT50eHFfZmlmb19wZW5kaW5nKTsKIAogCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAlyZXR1cm4gcGVuZGluZzsKIH0KIAotYm9vbCBhdGg5a19zZXRwb3dlcihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgZW51bSBhdGg5a19wb3dlcl9tb2RlIG1vZGUpCitzdGF0aWMgYm9vbCBhdGg5a19zZXRwb3dlcihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgZW51bSBhdGg5a19wb3dlcl9tb2RlIG1vZGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIHJldDsKQEAgLTEzNiw3ICsxMzQsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5zY19wbV9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aF9zdGFydF9hbmkoc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbikKK3ZvaWQgYXRoX3N0YXJ0X2FuaShzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uKQogewogCXN0cnVjdCBhdGhfaHcgKmFoID0gY29tbW9uLT5haDsKIAl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyk7CkBAIC0yMTksNyArMjE3LDcgQEAKICAqIGJ5IHJlc2V0aW5nIHRoZSBjaGlwLiAgVG8gYWNjb21wbGlzaCB0aGlzIHdlIG11c3QgZmlyc3QgY2xlYW51cCBhbnkgcGVuZGluZwogICogRE1BLCB0aGVuIHJlc3RhcnQgc3R1ZmYuCiAqLwotaW50IGF0aF9zZXRfY2hhbm5lbChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCitzdGF0aWMgaW50IGF0aF9zZXRfY2hhbm5lbChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCSAgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqaGNoYW4pCiB7CiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CkBAIC0zMDIsNyArMzAwLDggQEAKIAkJCWF0aF9zZXRfYmVhY29uKHNjKTsKIAkJaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayhzYy0+aHcsICZzYy0+dHhfY29tcGxldGVfd29yaywgMCk7CiAJCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoc2MtPmh3LCAmc2MtPmh3X3BsbF93b3JrLCBIWi8yKTsKLQkJYXRoX3N0YXJ0X2FuaShjb21tb24pOworCQlpZiAoIWNvbW1vbi0+ZGlzYWJsZV9hbmkpCisJCQlhdGhfc3RhcnRfYW5pKGNvbW1vbik7CiAJfQogCiAgcHNfcmVzdG9yZToKQEAgLTM2MSw3ICszNjAsNyBAQAogCXR4Y3RsLnBhcHJkID0gQklUKGNoYWluKTsKIAogCWlmIChhdGhfdHhfc3RhcnQoaHcsIHNrYiwgJnR4Y3RsKSAhPSAwKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsICJQQVBSRCBUWCBmYWlsZWRcbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsICJQQVBSRCBUWCBmYWlsZWRcbiIpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMzcwLDcgKzM2OSw3IEBACiAJCQltc2Vjc190b19qaWZmaWVzKEFUSF9QQVBSRF9USU1FT1VUKSk7CiAKIAlpZiAoIXRpbWVfbGVmdCkKLQkJYXRoX2RiZyhhdGg5a19od19jb21tb24oc2MtPnNjX2FoKSwgQVRIX0RCR19DQUxJQlJBVEUsCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKIAkJCSJUaW1lb3V0IHdhaXRpbmcgZm9yIHBhcHJkIHRyYWluaW5nIG9uIFRYIGNoYWluICVkXG4iLAogCQkJY2hhaW4pOwogCkBAIC0zOTQsMTIgKzM5MywxNCBAQAogCWlmICghY2FsZGF0YSkKIAkJcmV0dXJuOwogCisJYXRoOWtfcHNfd2FrZXVwKHNjKTsKKwogCWlmIChhcjkwMDNfcGFwcmRfaW5pdF90YWJsZShhaCkgPCAwKQotCQlyZXR1cm47CisJCWdvdG8gZmFpbF9wYXByZDsKIAogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9LRVJORUwpOwogCWlmICghc2tiKQotCQlyZXR1cm47CisJCWdvdG8gZmFpbF9wYXByZDsKIAogCXNrYl9wdXQoc2tiLCBsZW4pOwogCW1lbXNldChza2ItPmRhdGEsIDAsIGxlbik7CkBAIC00MTEsNyArNDEyLDYgQEAKIAltZW1jcHkoaGRyLT5hZGRyMiwgaHctPndpcGh5LT5wZXJtX2FkZHIsIEVUSF9BTEVOKTsKIAltZW1jcHkoaGRyLT5hZGRyMywgaHctPndpcGh5LT5wZXJtX2FkZHIsIEVUSF9BTEVOKTsKIAotCWF0aDlrX3BzX3dha2V1cChzYyk7CiAJZm9yIChjaGFpbiA9IDA7IGNoYWluIDwgQVI5MzAwX01BWF9DSEFJTlM7IGNoYWluKyspIHsKIAkJaWYgKCEoY29tbW9uLT50eF9jaGFpbm1hc2sgJiBCSVQoY2hhaW4pKSkKIAkJCWNvbnRpbnVlOwpAQCAtNDMxLDExICs0MzEsMTggQEAKIAkJaWYgKCFhdGhfcGFwcmRfc2VuZF9mcmFtZShzYywgc2tiLCBjaGFpbikpCiAJCQlnb3RvIGZhaWxfcGFwcmQ7CiAKLQkJaWYgKCFhcjkwMDNfcGFwcmRfaXNfZG9uZShhaCkpCisJCWlmICghYXI5MDAzX3BhcHJkX2lzX2RvbmUoYWgpKSB7CisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCisJCQkJIlBBUFJEIG5vdCB5ZXQgZG9uZSBvbiBjaGFpbiAlZFxuIiwgY2hhaW4pOwogCQkJYnJlYWs7CisJCX0KIAotCQlpZiAoYXI5MDAzX3BhcHJkX2NyZWF0ZV9jdXJ2ZShhaCwgY2FsZGF0YSwgY2hhaW4pICE9IDApCisJCWlmIChhcjkwMDNfcGFwcmRfY3JlYXRlX2N1cnZlKGFoLCBjYWxkYXRhLCBjaGFpbikpIHsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJCQkiUEFQUkQgY3JlYXRlIGN1cnZlIGZhaWxlZCBvbiBjaGFpbiAlZFxuIiwKKwkJCQkJCQkJICAgY2hhaW4pOwogCQkJYnJlYWs7CisJCX0KIAogCQljaGFpbl9vayA9IDE7CiAJfQpAQCAtNTE1LDI0ICs1MjIsMTkgQEAKIAkJY29tbW9uLT5hbmkuY2hlY2thbmlfdGltZXIgPSB0aW1lc3RhbXA7CiAJfQogCi0JLyogU2tpcCBhbGwgcHJvY2Vzc2luZyBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uICovCi0JaWYgKGxvbmdjYWwgfHwgc2hvcnRjYWwgfHwgYW5pZmxhZykgewotCQkvKiBDYWxsIEFOSSByb3V0aW5lIGlmIG5lY2Vzc2FyeSAqLwotCQlpZiAoYW5pZmxhZykgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbW1vbi0+Y2NfbG9jaywgZmxhZ3MpOwotCQkJYXRoOWtfaHdfYW5pX21vbml0b3IoYWgsIGFoLT5jdXJjaGFuKTsKLQkJCWF0aF91cGRhdGVfc3VydmV5X3N0YXRzKHNjKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbW1vbi0+Y2NfbG9jaywgZmxhZ3MpOwotCQl9CisJLyogQ2FsbCBBTkkgcm91dGluZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoYW5pZmxhZykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY29tbW9uLT5jY19sb2NrLCBmbGFncyk7CisJCWF0aDlrX2h3X2FuaV9tb25pdG9yKGFoLCBhaC0+Y3VyY2hhbik7CisJCWF0aF91cGRhdGVfc3VydmV5X3N0YXRzKHNjKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tbW9uLT5jY19sb2NrLCBmbGFncyk7CisJfQogCi0JCS8qIFBlcmZvcm0gY2FsaWJyYXRpb24gaWYgbmVjZXNzYXJ5ICovCi0JCWlmIChsb25nY2FsIHx8IHNob3J0Y2FsKSB7Ci0JCQljb21tb24tPmFuaS5jYWxkb25lID0KLQkJCQlhdGg5a19od19jYWxpYnJhdGUoYWgsCi0JCQkJCQkgICBhaC0+Y3VyY2hhbiwKLQkJCQkJCSAgIGNvbW1vbi0+cnhfY2hhaW5tYXNrLAotCQkJCQkJICAgbG9uZ2NhbCk7Ci0JCX0KKwkvKiBQZXJmb3JtIGNhbGlicmF0aW9uIGlmIG5lY2Vzc2FyeSAqLworCWlmIChsb25nY2FsIHx8IHNob3J0Y2FsKSB7CisJCWNvbW1vbi0+YW5pLmNhbGRvbmUgPQorCQkJYXRoOWtfaHdfY2FsaWJyYXRlKGFoLCBhaC0+Y3VyY2hhbiwKKwkJCQkJCWNvbW1vbi0+cnhfY2hhaW5tYXNrLCBsb25nY2FsKTsKIAl9CiAKIAlhdGg5a19wc19yZXN0b3JlKHNjKTsKQEAgLTYxNSw4ICs2MTcsMTEgQEAKIAlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19SRVNFVCwgIlBvc3NpYmxlIGJhc2ViYW5kIGhhbmcsICIKIAkJImJ1c3k9JWQgKHRyeSAlZClcbiIsIGJ1c3ksIHNjLT5od19idXN5X2NvdW50ICsgMSk7CiAJaWYgKGJ1c3kgPj0gOTkpIHsKLQkJaWYgKCsrc2MtPmh3X2J1c3lfY291bnQgPj0gMykKKwkJaWYgKCsrc2MtPmh3X2J1c3lfY291bnQgPj0gMykgeworCQkJc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOwogCQkJYXRoX3Jlc2V0KHNjLCB0cnVlKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOworCQl9CiAJfSBlbHNlIGlmIChidXN5ID49IDApCiAJCXNjLT5od19idXN5X2NvdW50ID0gMDsKIApAQCAtNjM1LDcgKzY0MCw5IEBACiAJCQkvKiBSeCBpcyBodW5nIGZvciBtb3JlIHRoYW4gNTAwbXMuIFJlc2V0IGl0ICovCiAJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19SRVNFVCwKIAkJCQkiUG9zc2libGUgUlggaGFuZywgcmVzZXR0aW5nIik7CisJCQlzcGluX2xvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CiAJCQlhdGhfcmVzZXQoc2MsIHRydWUpOworCQkJc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CiAJCQljb3VudCA9IDA7CiAJCX0KIAl9IGVsc2UKQEAgLTY3Miw3ICs2NzksOSBAQAogCiAJaWYgKChzdGF0dXMgJiBBVEg5S19JTlRfRkFUQUwpIHx8CiAJICAgIChzdGF0dXMgJiBBVEg5S19JTlRfQkJfV0FUQ0hET0cpKSB7CisJCXNwaW5fbG9jaygmc2MtPnNjX3BjdV9sb2NrKTsKIAkJYXRoX3Jlc2V0KHNjLCB0cnVlKTsKKwkJc3Bpbl91bmxvY2soJnNjLT5zY19wY3VfbG9jayk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTg2OCw3ICs4NzcsNyBAQAogI3VuZGVmIFNDSEVEX0lOVFIKIH0KIAotdm9pZCBhdGhfcmFkaW9fZW5hYmxlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3N0YXRpYyB2b2lkIGF0aF9yYWRpb19lbmFibGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwpAQCAtOTc0LDEwICs5ODMsMTAgQEAKIAlzYy0+aHdfYnVzeV9jb3VudCA9IDA7CiAKIAkvKiBTdG9wIEFOSSAqLworCiAJZGVsX3RpbWVyX3N5bmMoJmNvbW1vbi0+YW5pLnRpbWVyKTsKIAogCWF0aDlrX3BzX3dha2V1cChzYyk7Ci0Jc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOwogCiAJaWVlZTgwMjExX3N0b3BfcXVldWVzKGh3KTsKIApAQCAtMTAyMCwxMCArMTAyOSwxMSBAQAogCX0KIAogCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CiAKIAkvKiBTdGFydCBBTkkgKi8KLQlhdGhfc3RhcnRfYW5pKGNvbW1vbik7CisJaWYgKCFjb21tb24tPmRpc2FibGVfYW5pKQorCQlhdGhfc3RhcnRfYW5pKGNvbW1vbik7CisKIAlhdGg5a19wc19yZXN0b3JlKHNjKTsKIAogCXJldHVybiByOwpAQCAtMTI2MSw3ICsxMjcxLDYgQEAKIAogCS8qIGRpc2FibGUgSEFMIGFuZCBwdXQgaC93IHRvIHNsZWVwICovCiAJYXRoOWtfaHdfZGlzYWJsZShhaCk7Ci0JYXRoOWtfaHdfY29uZmlncGNpcG93ZXJzYXZlKGFoLCAxLCAxKTsKIAogCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOwogCkBAIC0xNDEyLDEwICsxNDIxLDE0IEBACiAJYXRoOWtfaHdfc2V0X2ludGVycnVwdHMoYWgsIGFoLT5pbWFzayk7CiAKIAkvKiBTZXQgdXAgQU5JICovCi0JaWYgKChpdGVyX2RhdGEubmFwcyArIGl0ZXJfZGF0YS5uYWRob2NzKSA+IDApIHsKKwlpZiAoaXRlcl9kYXRhLm5hcHMgPiAwKSB7CiAJCXNjLT5zY19haC0+c3RhdHMuYXZnYnJzc2kgPSBBVEhfUlNTSV9EVU1NWV9NQVJLRVI7Ci0JCXNjLT5zY19mbGFncyB8PSBTQ19PUF9BTklfUlVOOwotCQlhdGhfc3RhcnRfYW5pKGNvbW1vbik7CisKKwkJaWYgKCFjb21tb24tPmRpc2FibGVfYW5pKSB7CisJCQlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfQU5JX1JVTjsKKwkJCWF0aF9zdGFydF9hbmkoY29tbW9uKTsKKwkJfQorCiAJfSBlbHNlIHsKIAkJc2MtPnNjX2ZsYWdzICY9IH5TQ19PUF9BTklfUlVOOwogCQlkZWxfdGltZXJfc3luYygmY29tbW9uLT5hbmkudGltZXIpOwpAQCAtMTk1Miw1MCArMTk2NSwzOCBAQAogCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mID0gJnZpZi0+YnNzX2NvbmY7CiAJc3RydWN0IGF0aF92aWYgKmF2cCA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKIAotCXN3aXRjaCAoc2MtPnNjX2FoLT5vcG1vZGUpIHsKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQkvKiBUaGVyZSBjYW4gYmUgb25seSBvbmUgdmlmIGF2YWlsYWJsZSAqLworCS8qCisJICogU2tpcCBpdGVyYXRpb24gaWYgcHJpbWFyeSBzdGF0aW9uIHZpZidzIGJzcyBpbmZvCisJICogd2FzIG5vdCBjaGFuZ2VkCisJICovCisJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1BSSU1fU1RBX1ZJRikKKwkJcmV0dXJuOworCisJaWYgKGJzc19jb25mLT5hc3NvYykgeworCQlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfUFJJTV9TVEFfVklGOworCQlhdnAtPnByaW1hcnlfc3RhX3ZpZiA9IHRydWU7CiAJCW1lbWNweShjb21tb24tPmN1cmJzc2lkLCBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKIAkJY29tbW9uLT5jdXJhaWQgPSBic3NfY29uZi0+YWlkOwogCQlhdGg5a19od193cml0ZV9hc3NvY2lkKHNjLT5zY19haCk7Ci0JCS8qIGNvbmZpZ3VyZSBiZWFjb24gKi8KLQkJaWYgKGJzc19jb25mLT5lbmFibGVfYmVhY29uKQotCQkJYXRoX2JlYWNvbl9jb25maWcoc2MsIHZpZik7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJLyoKLQkJICogU2tpcCBpdGVyYXRpb24gaWYgcHJpbWFyeSBzdGF0aW9uIHZpZidzIGJzcyBpbmZvCi0JCSAqIHdhcyBub3QgY2hhbmdlZAotCQkgKi8KLQkJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1BSSU1fU1RBX1ZJRikKLQkJCWJyZWFrOwotCi0JCWlmIChic3NfY29uZi0+YXNzb2MpIHsKLQkJCXNjLT5zY19mbGFncyB8PSBTQ19PUF9QUklNX1NUQV9WSUY7Ci0JCQlhdnAtPnByaW1hcnlfc3RhX3ZpZiA9IHRydWU7Ci0JCQltZW1jcHkoY29tbW9uLT5jdXJic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTik7Ci0JCQljb21tb24tPmN1cmFpZCA9IGJzc19jb25mLT5haWQ7Ci0JCQlhdGg5a19od193cml0ZV9hc3NvY2lkKHNjLT5zY19haCk7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKIAkJCQkiQnNzIEluZm8gQVNTT0MgJWQsIGJzc2lkOiAlcE1cbiIsCiAJCQkJYnNzX2NvbmYtPmFpZCwgY29tbW9uLT5jdXJic3NpZCk7Ci0JCQlhdGhfYmVhY29uX2NvbmZpZyhzYywgdmlmKTsKLQkJCS8qCi0JCQkgKiBSZXF1ZXN0IGEgcmUtY29uZmlndXJhdGlvbiBvZiBCZWFjb24gcmVsYXRlZCB0aW1lcnMKLQkJCSAqIG9uIHRoZSByZWNlaXB0IG9mIHRoZSBmaXJzdCBCZWFjb24gZnJhbWUgKGkuZS4sCi0JCQkgKiBhZnRlciB0aW1lIHN5bmMgd2l0aCB0aGUgQVApLgotCQkJICovCi0JCQlzYy0+cHNfZmxhZ3MgfD0gUFNfQkVBQ09OX1NZTkMgfCBQU19XQUlUX0ZPUl9CRUFDT047Ci0JCQkvKiBSZXNldCByc3NpIHN0YXRzICovCi0JCQlzYy0+bGFzdF9yc3NpID0gQVRIX1JTU0lfRFVNTVlfTUFSS0VSOwotCQkJc2MtPnNjX2FoLT5zdGF0cy5hdmdicnNzaSA9IEFUSF9SU1NJX0RVTU1ZX01BUktFUjsKKwkJYXRoX2JlYWNvbl9jb25maWcoc2MsIHZpZik7CisJCS8qCisJCSAqIFJlcXVlc3QgYSByZS1jb25maWd1cmF0aW9uIG9mIEJlYWNvbiByZWxhdGVkIHRpbWVycworCQkgKiBvbiB0aGUgcmVjZWlwdCBvZiB0aGUgZmlyc3QgQmVhY29uIGZyYW1lIChpLmUuLAorCQkgKiBhZnRlciB0aW1lIHN5bmMgd2l0aCB0aGUgQVApLgorCQkgKi8KKwkJc2MtPnBzX2ZsYWdzIHw9IFBTX0JFQUNPTl9TWU5DIHwgUFNfV0FJVF9GT1JfQkVBQ09OOworCQkvKiBSZXNldCByc3NpIHN0YXRzICovCisJCXNjLT5sYXN0X3Jzc2kgPSBBVEhfUlNTSV9EVU1NWV9NQVJLRVI7CisJCXNjLT5zY19haC0+c3RhdHMuYXZnYnJzc2kgPSBBVEhfUlNTSV9EVU1NWV9NQVJLRVI7CiAKKwkJaWYgKCFjb21tb24tPmRpc2FibGVfYW5pKSB7CiAJCQlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfQU5JX1JVTjsKIAkJCWF0aF9zdGFydF9hbmkoY29tbW9uKTsKIAkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKKwogCX0KIH0KIApAQCAtMjAwNSw2ICsyMDA2LDkgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiA9ICZ2aWYtPmJzc19jb25mOwogCXN0cnVjdCBhdGhfdmlmICphdnAgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CiAKKwlpZiAoc2MtPnNjX2FoLT5vcG1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKKwkJcmV0dXJuOworCiAJLyogUmVjb25maWd1cmUgYnNzIGluZm8gKi8KIAlpZiAoYXZwLT5wcmltYXJ5X3N0YV92aWYgJiYgIWJzc19jb25mLT5hc3NvYykgewogCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCkBAIC0yMDIzLDggKzIwMjcsNyBAQAogCSAqIE5vbmUgb2Ygc3RhdGlvbiB2aWZzIGFyZSBhc3NvY2lhdGVkLgogCSAqIENsZWFyIGJzc2lkICYgYWlkCiAJICovCi0JaWYgKChzYy0+c2NfYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSAmJgotCSAgICAhKHNjLT5zY19mbGFncyAmIFNDX09QX1BSSU1fU1RBX1ZJRikpIHsKKwlpZiAoIShzYy0+c2NfZmxhZ3MgJiBTQ19PUF9QUklNX1NUQV9WSUYpKSB7CiAJCWF0aDlrX2h3X3dyaXRlX2Fzc29jaWQoc2MtPnNjX2FoKTsKIAkJLyogU3RvcCBBTkkgKi8KIAkJc2MtPnNjX2ZsYWdzICY9IH5TQ19PUF9BTklfUlVOOwpAQCAtMjA1NCw2ICsyMDU3LDI2IEBACiAJCQljb21tb24tPmN1cmJzc2lkLCBjb21tb24tPmN1cmFpZCk7CiAJfQogCisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9JQlNTKSB7CisJCS8qIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSB2aWYgYXZhaWxhYmxlICovCisJCW1lbWNweShjb21tb24tPmN1cmJzc2lkLCBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJY29tbW9uLT5jdXJhaWQgPSBic3NfY29uZi0+YWlkOworCQlhdGg5a19od193cml0ZV9hc3NvY2lkKHNjLT5zY19haCk7CisKKwkJaWYgKGJzc19jb25mLT5pYnNzX2pvaW5lZCkgeworCQkJc2MtPnNjX2FoLT5zdGF0cy5hdmdicnNzaSA9IEFUSF9SU1NJX0RVTU1ZX01BUktFUjsKKworCQkJaWYgKCFjb21tb24tPmRpc2FibGVfYW5pKSB7CisJCQkJc2MtPnNjX2ZsYWdzIHw9IFNDX09QX0FOSV9SVU47CisJCQkJYXRoX3N0YXJ0X2FuaShjb21tb24pOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlzYy0+c2NfZmxhZ3MgJj0gflNDX09QX0FOSV9SVU47CisJCQlkZWxfdGltZXJfc3luYygmY29tbW9uLT5hbmkudGltZXIpOworCQl9CisJfQorCiAJLyogRW5hYmxlIHRyYW5zbWlzc2lvbiBvZiBiZWFjb25zIChBUCwgSUJTUywgTUVTSCkgKi8KIAlpZiAoKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CRUFDT04pIHx8CiAJICAgICgoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKSAmJiBic3NfY29uZi0+ZW5hYmxlX2JlYWNvbikpIHsKQEAgLTIzMDgsOSArMjMzMSw5IEBACiAJYXRoOWtfcHNfd2FrZXVwKHNjKTsKIAlzcGluX2xvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CiAJZHJhaW5fdHhxID0gYXRoX2RyYWluX2FsbF90eHEoc2MsIGZhbHNlKTsKLQlzcGluX3VubG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKIAlpZiAoIWRyYWluX3R4cSkKIAkJYXRoX3Jlc2V0KHNjLCBmYWxzZSk7CisJc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CiAJYXRoOWtfcHNfcmVzdG9yZShzYyk7CiAJaWVlZTgwMjExX3dha2VfcXVldWVzKGh3KTsKIApAQCAtMjMzNCw3ICsyMzU3LDcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLWludCBhdGg5a190eF9sYXN0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3N0YXRpYyBpbnQgYXRoOWtfdHhfbGFzdF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBody0+cHJpdjsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYwppbmRleCBiOGNiZmM3Li4zYmFkMGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jCkBAIC0yNzgsNiArMjc4LDEyIEBACiAKIAlhdGg5a19od19zZXRfZ3BpbyhzYy0+c2NfYWgsIHNjLT5zY19haC0+bGVkX3BpbiwgMSk7CiAKKwkvKiBUaGUgZGV2aWNlIGhhcyB0byBiZSBtb3ZlZCB0byBGVUxMU0xFRVAgZm9yY2libHkuCisJICogT3RoZXJ3aXNlIHRoZSBjaGlwIG5ldmVyIG1vdmVkIHRvIGZ1bGwgc2xlZXAsCisJICogd2hlbiBubyBpbnRlcmZhY2UgaXMgdXAuCisJICovCisJYXRoOWtfaHdfc2V0cG93ZXIoc2MtPnNjX2FoLCBBVEg5S19QTV9GVUxMX1NMRUVQKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCmluZGV4IGJhN2YzNmEuLmMwNGE2YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCkBAIC0zNzksNyArMzc5LDMwIEBACiB9OwogCiBzdGF0aWMgaW50IGF0aF9yY19nZXRfcmF0ZWluZGV4KGNvbnN0IHN0cnVjdCBhdGhfcmF0ZV90YWJsZSAqcmF0ZV90YWJsZSwKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnJhdGUpOworCQkJCXN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqcmF0ZSkKK3sKKwlpbnQgcml4ID0gMCwgaSA9IDA7CisJc3RhdGljIGNvbnN0IGludCBtY3Nfcml4X29mZltdID0geyA3LCAxNSwgMjAsIDIxLCAyMiwgMjMgfTsKKworCWlmICghKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykpCisJCXJldHVybiByYXRlLT5pZHg7CisKKwl3aGlsZSAoaSA8IEFSUkFZX1NJWkUobWNzX3JpeF9vZmYpICYmIHJhdGUtPmlkeCA+IG1jc19yaXhfb2ZmW2ldKSB7CisJCXJpeCsrOyBpKys7CisJfQorCisJcml4ICs9IHJhdGUtPmlkeCArIHJhdGVfdGFibGUtPm1jc19zdGFydDsKKworCWlmICgocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIKSAmJgorCSAgICAocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kpKQorCQlyaXggPSByYXRlX3RhYmxlLT5pbmZvW3JpeF0uaHRfaW5kZXg7CisJZWxzZSBpZiAocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kpCisJCXJpeCA9IHJhdGVfdGFibGUtPmluZm9bcml4XS5zZ2lfaW5kZXg7CisJZWxzZSBpZiAocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIKQorCQlyaXggPSByYXRlX3RhYmxlLT5pbmZvW3JpeF0uY3c0MGluZGV4OworCisJcmV0dXJuIHJpeDsKK30KIAogc3RhdGljIHZvaWQgYXRoX3JjX3NvcnRfdmFsaWRyYXRlcyhjb25zdCBzdHJ1Y3QgYXRoX3JhdGVfdGFibGUgKnJhdGVfdGFibGUsCiAJCQkJICAgc3RydWN0IGF0aF9yYXRlX3ByaXYgKmF0aF9yY19wcml2KQpAQCAtNTMzLDcgKzU1Niw3IEBACiAJCQkJCVt2YWxpZF9yYXRlX2NvdW50XSA9IGo7CiAJCQkJYXRoX3JjX3ByaXYtPnZhbGlkX3BoeV9yYXRlY250W3BoeV0gKz0gMTsKIAkJCQlhdGhfcmNfc2V0X3ZhbGlkX3JhdGVfaWR4KGF0aF9yY19wcml2LCBqLCAxKTsKLQkJCQloaSA9IEFfTUFYKGhpLCBqKTsKKwkJCQloaSA9IG1heChoaSwgaik7CiAJCQl9CiAJCX0KIAl9CkBAIC01NjksNyArNTkyLDcgQEAKIAkJCQlbYXRoX3JjX3ByaXYtPnZhbGlkX3BoeV9yYXRlY250W3BoeV1dID0gajsKIAkJCWF0aF9yY19wcml2LT52YWxpZF9waHlfcmF0ZWNudFtwaHldICs9IDE7CiAJCQlhdGhfcmNfc2V0X3ZhbGlkX3JhdGVfaWR4KGF0aF9yY19wcml2LCBqLCAxKTsKLQkJCWhpID0gQV9NQVgoaGksIGopOworCQkJaGkgPSBtYXgoaGksIGopOwogCQl9CiAJfQogCkBAIC0xMDgwLDMxICsxMTAzLDYgQEAKIAogfQogCi1zdGF0aWMgaW50IGF0aF9yY19nZXRfcmF0ZWluZGV4KGNvbnN0IHN0cnVjdCBhdGhfcmF0ZV90YWJsZSAqcmF0ZV90YWJsZSwKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnJhdGUpCi17Ci0JaW50IHJpeCA9IDAsIGkgPSAwOwotCXN0YXRpYyBjb25zdCBpbnQgbWNzX3JpeF9vZmZbXSA9IHsgNywgMTUsIDIwLCAyMSwgMjIsIDIzIH07Ci0KLQlpZiAoIShyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpKQotCQlyZXR1cm4gcmF0ZS0+aWR4OwotCi0Jd2hpbGUgKGkgPCBBUlJBWV9TSVpFKG1jc19yaXhfb2ZmKSAmJiByYXRlLT5pZHggPiBtY3Nfcml4X29mZltpXSkgewotCQlyaXgrKzsgaSsrOwotCX0KLQotCXJpeCArPSByYXRlLT5pZHggKyByYXRlX3RhYmxlLT5tY3Nfc3RhcnQ7Ci0KLQlpZiAoKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSCkgJiYKLQkgICAgKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJKSkKLQkJcml4ID0gcmF0ZV90YWJsZS0+aW5mb1tyaXhdLmh0X2luZGV4OwotCWVsc2UgaWYgKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJKQotCQlyaXggPSByYXRlX3RhYmxlLT5pbmZvW3JpeF0uc2dpX2luZGV4OwotCWVsc2UgaWYgKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSCkKLQkJcml4ID0gcmF0ZV90YWJsZS0+aW5mb1tyaXhdLmN3NDBpbmRleDsKLQotCXJldHVybiByaXg7Ci19CiAKIHN0YXRpYyB2b2lkIGF0aF9yY190eF9zdGF0dXMoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCiAJCQkgICAgIHN0cnVjdCBhdGhfcmF0ZV9wcml2ICphdGhfcmNfcHJpdiwKQEAgLTEyMjgsNyArMTIyNiw3IEBACiAJCQkJCQkgICAgICAgaHRfbWNzLAogCQkJCQkJICAgICAgIGF0aF9yY19wcml2LT5odF9jYXApOwogCQl9Ci0JCWhpID0gQV9NQVgoaGksIGh0aGkpOworCQloaSA9IG1heChoaSwgaHRoaSk7CiAJfQogCiAJYXRoX3JjX3ByaXYtPnJhdGVfdGFibGVfc2l6ZSA9IGhpICsgMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWN2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVjdi5jCmluZGV4IDA3ZTM1ZTUuLjlhNDg1MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWN2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlY3YuYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlICJhdGg5ay5oIgogI2luY2x1ZGUgImFyOTAwM19tYWMuaCIKIApAQCAtMzksNiArNDAsNyBAQAogCQkJcmVzdWx0ID0gdHJ1ZTsKIAkJYnJlYWs7CiAJY2FzZSAxOgorCWNhc2UgMjoKIAkJaWYgKCgoKGN1cnJfbWFpbl9zZXQgPT0gQVRIX0FOVF9ESVZfQ09NQl9MTkEyKSAmJgogCQkJKGN1cnJfYWx0X3NldCA9PSBBVEhfQU5UX0RJVl9DT01CX0xOQTEpICYmCiAJCQkJKGFsdF9yc3NpX2F2ZyA+PSAobWFpbl9yc3NpX2F2ZyAtIDUpKSkgfHwKQEAgLTgxMywxNiArODE1LDE5IEBACiAJCQkgICAgc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJ4X3N0YXRzLAogCQkJICAgIGJvb2wgKmRlY3J5cHRfZXJyb3IpCiB7Ci0jZGVmaW5lIGlzX21jX29yX3ZhbGlkX3RraXBfa2V5aXggKChpc19tYyB8fAkJCVwKLQkJKHJ4X3N0YXRzLT5yc19rZXlpeCAhPSBBVEg5S19SWEtFWUlYX0lOVkFMSUQgJiYgXAotCQl0ZXN0X2JpdChyeF9zdGF0cy0+cnNfa2V5aXgsIGNvbW1vbi0+dGtpcF9rZXltYXApKSkpCi0KKwlib29sIGlzX21jLCBpc192YWxpZF90a2lwLCBzdHJpcF9taWMsIG1pY19lcnJvcjsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IGNvbW1vbi0+YWg7CiAJX19sZTE2IGZjOwogCXU4IHJ4X3N0YXR1c19sZW4gPSBhaC0+Y2Fwcy5yeF9zdGF0dXNfbGVuOwogCiAJZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CiAKKwlpc19tYyA9ICEhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSk7CisJaXNfdmFsaWRfdGtpcCA9IHJ4X3N0YXRzLT5yc19rZXlpeCAhPSBBVEg5S19SWEtFWUlYX0lOVkFMSUQgJiYKKwkJdGVzdF9iaXQocnhfc3RhdHMtPnJzX2tleWl4LCBjb21tb24tPnRraXBfa2V5bWFwKTsKKwlzdHJpcF9taWMgPSBpc192YWxpZF90a2lwICYmICEocnhfc3RhdHMtPnJzX3N0YXR1cyAmCisJCShBVEg5S19SWEVSUl9ERUNSWVBUIHwgQVRIOUtfUlhFUlJfQ1JDIHwgQVRIOUtfUlhFUlJfTUlDKSk7CisKIAlpZiAoIXJ4X3N0YXRzLT5yc19kYXRhbGVuKQogCQlyZXR1cm4gZmFsc2U7CiAgICAgICAgIC8qCkBAIC04MzcsNiArODQyLDExIEBACiAJaWYgKHJ4X3N0YXRzLT5yc19tb3JlKQogCQlyZXR1cm4gdHJ1ZTsKIAorCW1pY19lcnJvciA9IGlzX3ZhbGlkX3RraXAgJiYgIWllZWU4MDIxMV9pc19jdGwoZmMpICYmCisJCSFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykgJiYKKwkJIShsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpICYmCisJCShyeF9zdGF0cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfTUlDKTsKKwogCS8qCiAJICogVGhlIHJ4X3N0YXRzLT5yc19zdGF0dXMgd2lsbCBub3QgYmUgc2V0IHVudGlsIHRoZSBlbmQgb2YgdGhlCiAJICogY2hhaW5lZCBkZXNjcmlwdG9ycyBzbyBpdCBjYW4gYmUgaWdub3JlZCBpZiByc19tb3JlIGlzIHNldC4gVGhlCkBAIC04NDQsMzAgKzg1NCwxOCBAQAogCSAqIGRlc2NyaXB0b3JzLgogCSAqLwogCWlmIChyeF9zdGF0cy0+cnNfc3RhdHVzICE9IDApIHsKLQkJaWYgKHJ4X3N0YXRzLT5yc19zdGF0dXMgJiBBVEg5S19SWEVSUl9DUkMpCisJCWlmIChyeF9zdGF0cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfQ1JDKSB7CiAJCQlyeHMtPmZsYWcgfD0gUlhfRkxBR19GQUlMRURfRkNTX0NSQzsKKwkJCW1pY19lcnJvciA9IGZhbHNlOworCQl9CiAJCWlmIChyeF9zdGF0cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfUEhZKQogCQkJcmV0dXJuIGZhbHNlOwogCiAJCWlmIChyeF9zdGF0cy0+cnNfc3RhdHVzICYgQVRIOUtfUlhFUlJfREVDUllQVCkgewogCQkJKmRlY3J5cHRfZXJyb3IgPSB0cnVlOwotCQl9IGVsc2UgaWYgKHJ4X3N0YXRzLT5yc19zdGF0dXMgJiBBVEg5S19SWEVSUl9NSUMpIHsKLQkJCWJvb2wgaXNfbWM7Ci0JCQkvKgotCQkJICogVGhlIE1JQyBlcnJvciBiaXQgaXMgb25seSB2YWxpZCBpZiB0aGUgZnJhbWUKLQkJCSAqIGlzIG5vdCBhIGNvbnRyb2wgZnJhbWUgb3IgZnJhZ21lbnQsIGFuZCBpdCB3YXMKLQkJCSAqIGRlY3J5cHRlZCB1c2luZyBhIHZhbGlkIFRLSVAga2V5LgotCQkJICovCi0JCQlpc19tYyA9ICEhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSk7Ci0KLQkJCWlmICghaWVlZTgwMjExX2lzX2N0bChmYykgJiYKLQkJCSAgICAhaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoZmMpICYmCi0JCQkgICAgIShsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpICYmCi0JCQkgICAgaXNfbWNfb3JfdmFsaWRfdGtpcF9rZXlpeCkKLQkJCQlyeHMtPmZsYWcgfD0gUlhfRkxBR19NTUlDX0VSUk9SOwotCQkJZWxzZQotCQkJCXJ4X3N0YXRzLT5yc19zdGF0dXMgJj0gfkFUSDlLX1JYRVJSX01JQzsKKwkJCW1pY19lcnJvciA9IGZhbHNlOwogCQl9CisKIAkJLyoKIAkJICogUmVqZWN0IGVycm9yIGZyYW1lcyB3aXRoIHRoZSBleGNlcHRpb24gb2YKIAkJICogZGVjcnlwdGlvbiBhbmQgTUlDIGZhaWx1cmVzLiBGb3IgbW9uaXRvciBtb2RlLApAQCAtODg1LDYgKzg4MywxOCBAQAogCQkJfQogCQl9CiAJfQorCisJLyoKKwkgKiBGb3IgdW5pY2FzdCBmcmFtZXMgdGhlIE1JQyBlcnJvciBiaXQgY2FuIGhhdmUgZmFsc2UgcG9zaXRpdmVzLAorCSAqIHNvIGFsbCBNSUMgZXJyb3IgcmVwb3J0cyBuZWVkIHRvIGJlIHZhbGlkYXRlZCBpbiBzb2Z0d2FyZS4KKwkgKiBGYWxzZSBuZWdhdGl2ZXMgYXJlIG5vdCBjb21tb24sIHNvIHNraXAgc29mdHdhcmUgdmVyaWZpY2F0aW9uCisJICogaWYgdGhlIGhhcmR3YXJlIGNvbnNpZGVycyB0aGUgTUlDIHZhbGlkLgorCSAqLworCWlmIChzdHJpcF9taWMpCisJCXJ4cy0+ZmxhZyB8PSBSWF9GTEFHX01NSUNfU1RSSVBQRUQ7CisJZWxzZSBpZiAoaXNfbWMgJiYgbWljX2Vycm9yKQorCQlyeHMtPmZsYWcgfD0gUlhfRkxBR19NTUlDX0VSUk9SOworCiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTEwNzUsMzkgKzEwODUsMzkgQEAKIAkJYW50Y29tYi0+cnNzaV9sbmExID0gbWFpbl9yc3NpX2F2ZzsKIAogCXN3aXRjaCAoKGFudF9jb25mLm1haW5fbG5hX2NvbmYgPDwgNCkgfCBhbnRfY29uZi5hbHRfbG5hX2NvbmYpIHsKLQljYXNlICgweDEwKTogLyogTE5BMiBBLUIgKi8KKwljYXNlIDB4MTA6IC8qIExOQTIgQS1CICovCiAJCWFudGNvbWItPm1haW5fY29uZiA9IEFUSF9BTlRfRElWX0NPTUJfTE5BMV9NSU5VU19MTkEyOwogCQlhbnRjb21iLT5maXJzdF9xdWlja19zY2FuX2NvbmYgPQogCQkJQVRIX0FOVF9ESVZfQ09NQl9MTkExX1BMVVNfTE5BMjsKIAkJYW50Y29tYi0+c2Vjb25kX3F1aWNrX3NjYW5fY29uZiA9IEFUSF9BTlRfRElWX0NPTUJfTE5BMTsKIAkJYnJlYWs7Ci0JY2FzZSAoMHgyMCk6IC8qIExOQTEgQS1CICovCisJY2FzZSAweDIwOiAvKiBMTkExIEEtQiAqLwogCQlhbnRjb21iLT5tYWluX2NvbmYgPSBBVEhfQU5UX0RJVl9DT01CX0xOQTFfTUlOVVNfTE5BMjsKIAkJYW50Y29tYi0+Zmlyc3RfcXVpY2tfc2Nhbl9jb25mID0KIAkJCUFUSF9BTlRfRElWX0NPTUJfTE5BMV9QTFVTX0xOQTI7CiAJCWFudGNvbWItPnNlY29uZF9xdWlja19zY2FuX2NvbmYgPSBBVEhfQU5UX0RJVl9DT01CX0xOQTI7CiAJCWJyZWFrOwotCWNhc2UgKDB4MjEpOiAvKiBMTkExIExOQTIgKi8KKwljYXNlIDB4MjE6IC8qIExOQTEgTE5BMiAqLwogCQlhbnRjb21iLT5tYWluX2NvbmYgPSBBVEhfQU5UX0RJVl9DT01CX0xOQTI7CiAJCWFudGNvbWItPmZpcnN0X3F1aWNrX3NjYW5fY29uZiA9CiAJCQlBVEhfQU5UX0RJVl9DT01CX0xOQTFfTUlOVVNfTE5BMjsKIAkJYW50Y29tYi0+c2Vjb25kX3F1aWNrX3NjYW5fY29uZiA9CiAJCQlBVEhfQU5UX0RJVl9DT01CX0xOQTFfUExVU19MTkEyOwogCQlicmVhazsKLQljYXNlICgweDEyKTogLyogTE5BMiBMTkExICovCisJY2FzZSAweDEyOiAvKiBMTkEyIExOQTEgKi8KIAkJYW50Y29tYi0+bWFpbl9jb25mID0gQVRIX0FOVF9ESVZfQ09NQl9MTkExOwogCQlhbnRjb21iLT5maXJzdF9xdWlja19zY2FuX2NvbmYgPQogCQkJQVRIX0FOVF9ESVZfQ09NQl9MTkExX01JTlVTX0xOQTI7CiAJCWFudGNvbWItPnNlY29uZF9xdWlja19zY2FuX2NvbmYgPQogCQkJQVRIX0FOVF9ESVZfQ09NQl9MTkExX1BMVVNfTE5BMjsKIAkJYnJlYWs7Ci0JY2FzZSAoMHgxMyk6IC8qIExOQTIgQStCICovCisJY2FzZSAweDEzOiAvKiBMTkEyIEErQiAqLwogCQlhbnRjb21iLT5tYWluX2NvbmYgPSBBVEhfQU5UX0RJVl9DT01CX0xOQTFfUExVU19MTkEyOwogCQlhbnRjb21iLT5maXJzdF9xdWlja19zY2FuX2NvbmYgPQogCQkJQVRIX0FOVF9ESVZfQ09NQl9MTkExX01JTlVTX0xOQTI7CiAJCWFudGNvbWItPnNlY29uZF9xdWlja19zY2FuX2NvbmYgPSBBVEhfQU5UX0RJVl9DT01CX0xOQTE7CiAJCWJyZWFrOwotCWNhc2UgKDB4MjMpOiAvKiBMTkExIEErQiAqLworCWNhc2UgMHgyMzogLyogTE5BMSBBK0IgKi8KIAkJYW50Y29tYi0+bWFpbl9jb25mID0gQVRIX0FOVF9ESVZfQ09NQl9MTkExX1BMVVNfTE5BMjsKIAkJYW50Y29tYi0+Zmlyc3RfcXVpY2tfc2Nhbl9jb25mID0KIAkJCUFUSF9BTlRfRElWX0NPTUJfTE5BMV9NSU5VU19MTkEyOwpAQCAtMTMyNCw2NSArMTMzNCwxNDggQEAKIAkJLyogQWRqdXN0IHRoZSBmYXN0X2Rpdl9iaWFzIGJhc2VkIG9uIG1haW4gYW5kIGFsdCBsbmEgY29uZiAqLwogCQlzd2l0Y2ggKChhbnRfY29uZi0+bWFpbl9sbmFfY29uZiA8PCA0KSB8CiAJCQkJYW50X2NvbmYtPmFsdF9sbmFfY29uZikgewotCQljYXNlICgweDAxKTogLyogQS1CIExOQTIgKi8KKwkJY2FzZSAweDAxOiAvKiBBLUIgTE5BMiAqLwogCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDNiOwogCQkJYnJlYWs7Ci0JCWNhc2UgKDB4MDIpOiAvKiBBLUIgTE5BMSAqLworCQljYXNlIDB4MDI6IC8qIEEtQiBMTkExICovCiAJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4M2Q7CiAJCQlicmVhazsKLQkJY2FzZSAoMHgwMyk6IC8qIEEtQiBBK0IgKi8KKwkJY2FzZSAweDAzOiAvKiBBLUIgQStCICovCiAJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4MTsKIAkJCWJyZWFrOwotCQljYXNlICgweDEwKTogLyogTE5BMiBBLUIgKi8KKwkJY2FzZSAweDEwOiAvKiBMTkEyIEEtQiAqLwogCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDc7CiAJCQlicmVhazsKLQkJY2FzZSAoMHgxMik6IC8qIExOQTIgTE5BMSAqLworCQljYXNlIDB4MTI6IC8qIExOQTIgTE5BMSAqLwogCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDI7CiAJCQlicmVhazsKLQkJY2FzZSAoMHgxMyk6IC8qIExOQTIgQStCICovCisJCWNhc2UgMHgxMzogLyogTE5BMiBBK0IgKi8KIAkJCWFudF9jb25mLT5mYXN0X2Rpdl9iaWFzID0gMHg3OwogCQkJYnJlYWs7Ci0JCWNhc2UgKDB4MjApOiAvKiBMTkExIEEtQiAqLworCQljYXNlIDB4MjA6IC8qIExOQTEgQS1CICovCiAJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4NjsKIAkJCWJyZWFrOwotCQljYXNlICgweDIxKTogLyogTE5BMSBMTkEyICovCisJCWNhc2UgMHgyMTogLyogTE5BMSBMTkEyICovCiAJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4MDsKIAkJCWJyZWFrOwotCQljYXNlICgweDIzKTogLyogTE5BMSBBK0IgKi8KKwkJY2FzZSAweDIzOiAvKiBMTkExIEErQiAqLwogCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDY7CiAJCQlicmVhazsKLQkJY2FzZSAoMHgzMCk6IC8qIEErQiBBLUIgKi8KKwkJY2FzZSAweDMwOiAvKiBBK0IgQS1CICovCiAJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4MTsKIAkJCWJyZWFrOwotCQljYXNlICgweDMxKTogLyogQStCIExOQTIgKi8KKwkJY2FzZSAweDMxOiAvKiBBK0IgTE5BMiAqLwogCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDNiOwogCQkJYnJlYWs7Ci0JCWNhc2UgKDB4MzIpOiAvKiBBK0IgTE5BMSAqLworCQljYXNlIDB4MzI6IC8qIEErQiBMTkExICovCiAJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4M2Q7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9CisJfSBlbHNlIGlmIChhbnRfY29uZi0+ZGl2X2dyb3VwID09IDEpIHsKKwkJLyogQWRqdXN0IHRoZSBmYXN0X2Rpdl9iaWFzIGJhc2VkIG9uIG1haW4gYW5kIGFsdF9sbmFfY29uZiAqLworCQlzd2l0Y2ggKChhbnRfY29uZi0+bWFpbl9sbmFfY29uZiA8PCA0KSB8CisJCQlhbnRfY29uZi0+YWx0X2xuYV9jb25mKSB7CisJCWNhc2UgMHgwMTogLyogQS1CIExOQTIgKi8KKwkJCWFudF9jb25mLT5mYXN0X2Rpdl9iaWFzID0gMHgxOworCQkJYW50X2NvbmYtPm1haW5fZ2FpbnRiID0gMDsKKwkJCWFudF9jb25mLT5hbHRfZ2FpbnRiID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDB4MDI6IC8qIEEtQiBMTkExICovCisJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4MTsKKwkJCWFudF9jb25mLT5tYWluX2dhaW50YiA9IDA7CisJCQlhbnRfY29uZi0+YWx0X2dhaW50YiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAweDAzOiAvKiBBLUIgQStCICovCisJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4MTsKKwkJCWFudF9jb25mLT5tYWluX2dhaW50YiA9IDA7CisJCQlhbnRfY29uZi0+YWx0X2dhaW50YiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAweDEwOiAvKiBMTkEyIEEtQiAqLworCQkJaWYgKCEoYW50Y29tYi0+c2NhbikgJiYKKwkJCSAgICAoYWx0X3JhdGlvID4gQVRIX0FOVF9ESVZfQ09NQl9BTFRfQU5UX1JBVElPKSkKKwkJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4M2Y7CisJCQllbHNlCisJCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDE7CisJCQlhbnRfY29uZi0+bWFpbl9nYWludGIgPSAwOworCQkJYW50X2NvbmYtPmFsdF9nYWludGIgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgxMjogLyogTE5BMiBMTkExICovCisJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4MTsKKwkJCWFudF9jb25mLT5tYWluX2dhaW50YiA9IDA7CisJCQlhbnRfY29uZi0+YWx0X2dhaW50YiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAweDEzOiAvKiBMTkEyIEErQiAqLworCQkJaWYgKCEoYW50Y29tYi0+c2NhbikgJiYKKwkJCSAgICAoYWx0X3JhdGlvID4gQVRIX0FOVF9ESVZfQ09NQl9BTFRfQU5UX1JBVElPKSkKKwkJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4M2Y7CisJCQllbHNlCisJCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDE7CisJCQlhbnRfY29uZi0+bWFpbl9nYWludGIgPSAwOworCQkJYW50X2NvbmYtPmFsdF9nYWludGIgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgyMDogLyogTE5BMSBBLUIgKi8KKwkJCWlmICghKGFudGNvbWItPnNjYW4pICYmCisJCQkgICAgKGFsdF9yYXRpbyA+IEFUSF9BTlRfRElWX0NPTUJfQUxUX0FOVF9SQVRJTykpCisJCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDNmOworCQkJZWxzZQorCQkJCWFudF9jb25mLT5mYXN0X2Rpdl9iaWFzID0gMHgxOworCQkJYW50X2NvbmYtPm1haW5fZ2FpbnRiID0gMDsKKwkJCWFudF9jb25mLT5hbHRfZ2FpbnRiID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDB4MjE6IC8qIExOQTEgTE5BMiAqLworCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDE7CisJCQlhbnRfY29uZi0+bWFpbl9nYWludGIgPSAwOworCQkJYW50X2NvbmYtPmFsdF9nYWludGIgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgyMzogLyogTE5BMSBBK0IgKi8KKwkJCWlmICghKGFudGNvbWItPnNjYW4pICYmCisJCQkgICAgKGFsdF9yYXRpbyA+IEFUSF9BTlRfRElWX0NPTUJfQUxUX0FOVF9SQVRJTykpCisJCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDNmOworCQkJZWxzZQorCQkJCWFudF9jb25mLT5mYXN0X2Rpdl9iaWFzID0gMHgxOworCQkJYW50X2NvbmYtPm1haW5fZ2FpbnRiID0gMDsKKwkJCWFudF9jb25mLT5hbHRfZ2FpbnRiID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDB4MzA6IC8qIEErQiBBLUIgKi8KKwkJCWFudF9jb25mLT5mYXN0X2Rpdl9iaWFzID0gMHgxOworCQkJYW50X2NvbmYtPm1haW5fZ2FpbnRiID0gMDsKKwkJCWFudF9jb25mLT5hbHRfZ2FpbnRiID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDB4MzE6IC8qIEErQiBMTkEyICovCisJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4MTsKKwkJCWFudF9jb25mLT5tYWluX2dhaW50YiA9IDA7CisJCQlhbnRfY29uZi0+YWx0X2dhaW50YiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAweDMyOiAvKiBBK0IgTE5BMSAqLworCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDE7CisJCQlhbnRfY29uZi0+bWFpbl9nYWludGIgPSAwOworCQkJYW50X2NvbmYtPmFsdF9nYWludGIgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCX0gZWxzZSBpZiAoYW50X2NvbmYtPmRpdl9ncm91cCA9PSAyKSB7CiAJCS8qIEFkanVzdCB0aGUgZmFzdF9kaXZfYmlhcyBiYXNlZCBvbiBtYWluIGFuZCBhbHRfbG5hX2NvbmYgKi8KIAkJc3dpdGNoICgoYW50X2NvbmYtPm1haW5fbG5hX2NvbmYgPDwgNCkgfAogCQkJCWFudF9jb25mLT5hbHRfbG5hX2NvbmYpIHsKLQkJY2FzZSAoMHgwMSk6IC8qIEEtQiBMTkEyICovCisJCWNhc2UgMHgwMTogLyogQS1CIExOQTIgKi8KIAkJCWFudF9jb25mLT5mYXN0X2Rpdl9iaWFzID0gMHgxOwogCQkJYW50X2NvbmYtPm1haW5fZ2FpbnRiID0gMDsKIAkJCWFudF9jb25mLT5hbHRfZ2FpbnRiID0gMDsKIAkJCWJyZWFrOwotCQljYXNlICgweDAyKTogLyogQS1CIExOQTEgKi8KKwkJY2FzZSAweDAyOiAvKiBBLUIgTE5BMSAqLwogCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDE7CiAJCQlhbnRfY29uZi0+bWFpbl9nYWludGIgPSAwOwogCQkJYW50X2NvbmYtPmFsdF9nYWludGIgPSAwOwogCQkJYnJlYWs7Ci0JCWNhc2UgKDB4MDMpOiAvKiBBLUIgQStCICovCisJCWNhc2UgMHgwMzogLyogQS1CIEErQiAqLwogCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDE7CiAJCQlhbnRfY29uZi0+bWFpbl9nYWludGIgPSAwOwogCQkJYW50X2NvbmYtPmFsdF9nYWludGIgPSAwOwogCQkJYnJlYWs7Ci0JCWNhc2UgKDB4MTApOiAvKiBMTkEyIEEtQiAqLworCQljYXNlIDB4MTA6IC8qIExOQTIgQS1CICovCiAJCQlpZiAoIShhbnRjb21iLT5zY2FuKSAmJgogCQkJCShhbHRfcmF0aW8gPiBBVEhfQU5UX0RJVl9DT01CX0FMVF9BTlRfUkFUSU8pKQogCQkJCWFudF9jb25mLT5mYXN0X2Rpdl9iaWFzID0gMHgxOwpAQCAtMTM5MSwxMiArMTQ4NCwxMiBAQAogCQkJYW50X2NvbmYtPm1haW5fZ2FpbnRiID0gMDsKIAkJCWFudF9jb25mLT5hbHRfZ2FpbnRiID0gMDsKIAkJCWJyZWFrOwotCQljYXNlICgweDEyKTogLyogTE5BMiBMTkExICovCisJCWNhc2UgMHgxMjogLyogTE5BMiBMTkExICovCiAJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4MTsKIAkJCWFudF9jb25mLT5tYWluX2dhaW50YiA9IDA7CiAJCQlhbnRfY29uZi0+YWx0X2dhaW50YiA9IDA7CiAJCQlicmVhazsKLQkJY2FzZSAoMHgxMyk6IC8qIExOQTIgQStCICovCisJCWNhc2UgMHgxMzogLyogTE5BMiBBK0IgKi8KIAkJCWlmICghKGFudGNvbWItPnNjYW4pICYmCiAJCQkJKGFsdF9yYXRpbyA+IEFUSF9BTlRfRElWX0NPTUJfQUxUX0FOVF9SQVRJTykpCiAJCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDE7CkBAIC0xNDA1LDcgKzE0OTgsNyBAQAogCQkJYW50X2NvbmYtPm1haW5fZ2FpbnRiID0gMDsKIAkJCWFudF9jb25mLT5hbHRfZ2FpbnRiID0gMDsKIAkJCWJyZWFrOwotCQljYXNlICgweDIwKTogLyogTE5BMSBBLUIgKi8KKwkJY2FzZSAweDIwOiAvKiBMTkExIEEtQiAqLwogCQkJaWYgKCEoYW50Y29tYi0+c2NhbikgJiYKIAkJCQkoYWx0X3JhdGlvID4gQVRIX0FOVF9ESVZfQ09NQl9BTFRfQU5UX1JBVElPKSkKIAkJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4MTsKQEAgLTE0MTQsMTIgKzE1MDcsMTIgQEAKIAkJCWFudF9jb25mLT5tYWluX2dhaW50YiA9IDA7CiAJCQlhbnRfY29uZi0+YWx0X2dhaW50YiA9IDA7CiAJCQlicmVhazsKLQkJY2FzZSAoMHgyMSk6IC8qIExOQTEgTE5BMiAqLworCQljYXNlIDB4MjE6IC8qIExOQTEgTE5BMiAqLwogCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDE7CiAJCQlhbnRfY29uZi0+bWFpbl9nYWludGIgPSAwOwogCQkJYW50X2NvbmYtPmFsdF9nYWludGIgPSAwOwogCQkJYnJlYWs7Ci0JCWNhc2UgKDB4MjMpOiAvKiBMTkExIEErQiAqLworCQljYXNlIDB4MjM6IC8qIExOQTEgQStCICovCiAJCQlpZiAoIShhbnRjb21iLT5zY2FuKSAmJgogCQkJCShhbHRfcmF0aW8gPiBBVEhfQU5UX0RJVl9DT01CX0FMVF9BTlRfUkFUSU8pKQogCQkJCWFudF9jb25mLT5mYXN0X2Rpdl9iaWFzID0gMHgxOwpAQCAtMTQyOCwxNyArMTUyMSwxNyBAQAogCQkJYW50X2NvbmYtPm1haW5fZ2FpbnRiID0gMDsKIAkJCWFudF9jb25mLT5hbHRfZ2FpbnRiID0gMDsKIAkJCWJyZWFrOwotCQljYXNlICgweDMwKTogLyogQStCIEEtQiAqLworCQljYXNlIDB4MzA6IC8qIEErQiBBLUIgKi8KIAkJCWFudF9jb25mLT5mYXN0X2Rpdl9iaWFzID0gMHgxOwogCQkJYW50X2NvbmYtPm1haW5fZ2FpbnRiID0gMDsKIAkJCWFudF9jb25mLT5hbHRfZ2FpbnRiID0gMDsKIAkJCWJyZWFrOwotCQljYXNlICgweDMxKTogLyogQStCIExOQTIgKi8KKwkJY2FzZSAweDMxOiAvKiBBK0IgTE5BMiAqLwogCQkJYW50X2NvbmYtPmZhc3RfZGl2X2JpYXMgPSAweDE7CiAJCQlhbnRfY29uZi0+bWFpbl9nYWludGIgPSAwOwogCQkJYW50X2NvbmYtPmFsdF9nYWludGIgPSAwOwogCQkJYnJlYWs7Ci0JCWNhc2UgKDB4MzIpOiAvKiBBK0IgTE5BMSAqLworCQljYXNlIDB4MzI6IC8qIEErQiBMTkExICovCiAJCQlhbnRfY29uZi0+ZmFzdF9kaXZfYmlhcyA9IDB4MTsKIAkJCWFudF9jb25mLT5tYWluX2dhaW50YiA9IDA7CiAJCQlhbnRfY29uZi0+YWx0X2dhaW50YiA9IDA7CkBAIC0xNDQ2LDkgKzE1MzksNyBAQAogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KLQogCX0KLQogfQogCiAvKiBBbnRlbm5hIGRpdmVyc2l0eSBhbmQgY29tYmluaW5nICovCkBAIC0xODU2LDYgKzE5NDcsOSBAQAogCQkJc2MtPnJ4LnJ4b3RoZXJhbnQgPSAwOwogCQl9CiAKKwkJaWYgKHJ4cy0+ZmxhZyAmIFJYX0ZMQUdfTU1JQ19TVFJJUFBFRCkKKwkJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA4KTsKKwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPnNjX3BtX2xvY2ssIGZsYWdzKTsKIAogCQlpZiAoKHNjLT5wc19mbGFncyAmIChQU19XQUlUX0ZPUl9CRUFDT04gfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oCmluZGV4IGMxOGVlOTkuLmZhNGMwYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnLmgKQEAgLTYwMCw3ICs2MDAsNiBAQAogCiAjZGVmaW5lIEFSX0RfR0JMX0lGU19TSUZTICAgICAgICAgMHgxMDMwCiAjZGVmaW5lIEFSX0RfR0JMX0lGU19TSUZTX00gICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBBUl9EX0dCTF9JRlNfU0lGU19BU1lOQ19GSUZPX0RVUiAweDAwMDAwM0FCCiAjZGVmaW5lIEFSX0RfR0JMX0lGU19TSUZTX1JFU1YwICAgMHhGRkZGRkZGRgogCiAjZGVmaW5lIEFSX0RfVFhCTEtfQkFTRSAgICAgICAgICAgIDB4MTAzOApAQCAtNjE2LDEyICs2MTUsMTAgQEAKICNkZWZpbmUgQVJfRF9HQkxfSUZTX1NMT1QgICAgICAgICAweDEwNzAKICNkZWZpbmUgQVJfRF9HQkxfSUZTX1NMT1RfTSAgICAgICAweDAwMDBGRkZGCiAjZGVmaW5lIEFSX0RfR0JMX0lGU19TTE9UX1JFU1YwICAgMHhGRkZGMDAwMAotI2RlZmluZSBBUl9EX0dCTF9JRlNfU0xPVF9BU1lOQ19GSUZPX0RVUiAgIDB4MDAwMDA0MjAKIAogI2RlZmluZSBBUl9EX0dCTF9JRlNfRUlGUyAgICAgICAgIDB4MTBiMAogI2RlZmluZSBBUl9EX0dCTF9JRlNfRUlGU19NICAgICAgIDB4MDAwMEZGRkYKICNkZWZpbmUgQVJfRF9HQkxfSUZTX0VJRlNfUkVTVjAgICAweEZGRkYwMDAwCi0jZGVmaW5lIEFSX0RfR0JMX0lGU19FSUZTX0FTWU5DX0ZJRk9fRFVSICAgMHgwMDAwQTVFQgogCiAjZGVmaW5lIEFSX0RfR0JMX0lGU19NSVNDICAgICAgICAweDEwZjAKICNkZWZpbmUgQVJfRF9HQkxfSUZTX01JU0NfTEZTUl9TTElDRV9TRUwgICAgICAgIDB4MDAwMDAwMDcKQEAgLTc4OCw2ICs3ODUsMTAgQEAKICNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTl85MjcxXzExCTEKICNkZWZpbmUgQVJfU1JFVl9WRVJTSU9OXzkzMDAJCTB4MWMwCiAjZGVmaW5lIEFSX1NSRVZfUkVWSVNJT05fOTMwMF8yMAkyIC8qIDIuMCBhbmQgMi4xICovCisjZGVmaW5lIEFSX1NSRVZfVkVSU0lPTl85MzMwCQkweDIwMAorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkzMzBfMTAJMAorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkzMzBfMTEJMQorI2RlZmluZSBBUl9TUkVWX1JFVklTSU9OXzkzMzBfMTIJMgogI2RlZmluZSBBUl9TUkVWX1ZFUlNJT05fOTQ4NQkJMHgyNDAKICNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTl85NDg1XzEwCTAKICNkZWZpbmUgQVJfU1JFVl9SRVZJU0lPTl85NDg1XzExICAgICAgICAxCkBAIC04NjIsNiArODYzLDE4IEBACiAjZGVmaW5lIEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihfYWgpIFwKIAkoKF9haCktPmh3X3ZlcnNpb24ubWFjVmVyc2lvbiA+PSBBUl9TUkVWX1ZFUlNJT05fOTMwMCkKIAorI2RlZmluZSBBUl9TUkVWXzkzMzAoX2FoKSBcCisJKCgoX2FoKS0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID09IEFSX1NSRVZfVkVSU0lPTl85MzMwKSkKKyNkZWZpbmUgQVJfU1JFVl85MzMwXzEwKF9haCkgXAorCShBUl9TUkVWXzkzMzAoKF9haCkpICYmIFwKKwkgKChfYWgpLT5od192ZXJzaW9uLm1hY1JldiA9PSBBUl9TUkVWX1JFVklTSU9OXzkzMzBfMTApKQorI2RlZmluZSBBUl9TUkVWXzkzMzBfMTEoX2FoKSBcCisJKEFSX1NSRVZfOTMzMCgoX2FoKSkgJiYgXAorCSAoKF9haCktPmh3X3ZlcnNpb24ubWFjUmV2ID09IEFSX1NSRVZfUkVWSVNJT05fOTMzMF8xMSkpCisjZGVmaW5lIEFSX1NSRVZfOTMzMF8xMihfYWgpIFwKKwkoQVJfU1JFVl85MzMwKChfYWgpKSAmJiBcCisJICgoX2FoKS0+aHdfdmVyc2lvbi5tYWNSZXYgPT0gQVJfU1JFVl9SRVZJU0lPTl85MzMwXzEyKSkKKwogI2RlZmluZSBBUl9TUkVWXzk0ODUoX2FoKSBcCiAJKCgoX2FoKS0+aHdfdmVyc2lvbi5tYWNWZXJzaW9uID09IEFSX1NSRVZfVkVSU0lPTl85NDg1KSkKICNkZWZpbmUgQVJfU1JFVl85NDg1XzEwKF9haCkgXApAQCAtMTQ2MSw3ICsxNDc0LDYgQEAKICNkZWZpbmUgQVJfVElNRV9PVVRfQUNLX1MgICAgMAogI2RlZmluZSBBUl9USU1FX09VVF9DVFMgICAgICAweDNGRkYwMDAwCiAjZGVmaW5lIEFSX1RJTUVfT1VUX0NUU19TICAgIDE2Ci0jZGVmaW5lIEFSX1RJTUVfT1VUX0FDS19DVFNfQVNZTkNfRklGT19EVVIgICAgMHgxNjAwMUQ1NgogCiAjZGVmaW5lIEFSX1JTU0lfVEhSICAgICAgICAgIDB4ODAxOAogI2RlZmluZSBBUl9SU1NJX1RIUl9NQVNLICAgICAweDAwMDAwMEZGCkBAIC0xNDc3LDcgKzE0ODksNiBAQAogI2RlZmluZSBBUl9VU0VDX1RYX0xBVF9TICAgICAxNAogI2RlZmluZSBBUl9VU0VDX1JYX0xBVCAgICAgICAweDFGODAwMDAwCiAjZGVmaW5lIEFSX1VTRUNfUlhfTEFUX1MgICAgIDIzCi0jZGVmaW5lIEFSX1VTRUNfQVNZTkNfRklGT19EVVIgICAgMHgxMmUwMDA3NAogCiAjZGVmaW5lIEFSX1JFU0VUX1RTRiAgICAgICAgMHg4MDIwCiAjZGVmaW5lIEFSX1JFU0VUX1RTRl9PTkNFICAgMHgwMTAwMDAwMApAQCAtMTg2MiwyOSArMTg3Myw2IEBACiAjZGVmaW5lIEFSX1JBVEVfRFVSQVRJT04oX24pICAgIChBUl9SQVRFX0RVUkFUSU9OXzAgKyAoKF9uKTw8MikpCiAKIAotI2RlZmluZSBBUl9LRVlUQUJMRV8wICAgICAgICAgICAweDg4MDAKLSNkZWZpbmUgQVJfS0VZVEFCTEUoX24pICAgICAgICAgKEFSX0tFWVRBQkxFXzAgKyAoKF9uKSozMikpCi0jZGVmaW5lIEFSX0tFWV9DQUNIRV9TSVpFICAgICAgIDEyOAotI2RlZmluZSBBUl9SU1ZEX0tFWVRBQkxFX0VOVFJJRVMgNAotI2RlZmluZSBBUl9LRVlfVFlQRSAgICAgICAgICAgICAweDAwMDAwMDA3Ci0jZGVmaW5lIEFSX0tFWVRBQkxFX1RZUEVfNDAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQVJfS0VZVEFCTEVfVFlQRV8xMDQgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBUl9LRVlUQUJMRV9UWVBFXzEyOCAgICAweDAwMDAwMDAzCi0jZGVmaW5lIEFSX0tFWVRBQkxFX1RZUEVfVEtJUCAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQVJfS0VZVEFCTEVfVFlQRV9BRVMgICAgMHgwMDAwMDAwNQotI2RlZmluZSBBUl9LRVlUQUJMRV9UWVBFX0NDTSAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIEFSX0tFWVRBQkxFX1RZUEVfQ0xSICAgIDB4MDAwMDAwMDcKLSNkZWZpbmUgQVJfS0VZVEFCTEVfQU5UICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBBUl9LRVlUQUJMRV9WQUxJRCAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEFSX0tFWVRBQkxFX0tFWTAoX24pICAgIChBUl9LRVlUQUJMRShfbikgKyAwKQotI2RlZmluZSBBUl9LRVlUQUJMRV9LRVkxKF9uKSAgICAoQVJfS0VZVEFCTEUoX24pICsgNCkKLSNkZWZpbmUgQVJfS0VZVEFCTEVfS0VZMihfbikgICAgKEFSX0tFWVRBQkxFKF9uKSArIDgpCi0jZGVmaW5lIEFSX0tFWVRBQkxFX0tFWTMoX24pICAgIChBUl9LRVlUQUJMRShfbikgKyAxMikKLSNkZWZpbmUgQVJfS0VZVEFCTEVfS0VZNChfbikgICAgKEFSX0tFWVRBQkxFKF9uKSArIDE2KQotI2RlZmluZSBBUl9LRVlUQUJMRV9UWVBFKF9uKSAgICAoQVJfS0VZVEFCTEUoX24pICsgMjApCi0jZGVmaW5lIEFSX0tFWVRBQkxFX01BQzAoX24pICAgIChBUl9LRVlUQUJMRShfbikgKyAyNCkKLSNkZWZpbmUgQVJfS0VZVEFCTEVfTUFDMShfbikgICAgKEFSX0tFWVRBQkxFKF9uKSArIDI4KQotCiAjZGVmaW5lIEFSOTI3MV9DT1JFX0NMT0NLCTExNyAgIC8qIGNsb2NrIHRvIDExN01oeiAqLwogI2RlZmluZSBBUjkyNzFfVEFSR0VUX0JBVURfUkFURQkxOTIwMCAvKiAxMTUyMDAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKaW5kZXggMzc3OWI4OS4uY2M1OTU3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgImF0aDlrLmgiCiAjaW5jbHVkZSAiYXI5MDAzX21hYy5oIgogCkBAIC01Myw3ICs1NCw3IEBACiAJCQkJc3RydWN0IGF0aF90eHEgKnR4cSwgc3RydWN0IGxpc3RfaGVhZCAqYmZfcSwKIAkJCQlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMsIGludCB0eG9rLCBpbnQgc2VuZGJhcik7CiBzdGF0aWMgdm9pZCBhdGhfdHhfdHhxYWRkYnVmKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxLAotCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKKwkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgYm9vbCBpbnRlcm5hbCk7CiBzdGF0aWMgdm9pZCBhdGhfYnVmX3NldF9yYXRlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX2J1ZiAqYmYsIGludCBsZW4pOwogc3RhdGljIHZvaWQgYXRoX3R4X3JjX3N0YXR1cyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9idWYgKmJmLAogCQkJICAgICBzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMsIGludCBuZnJhbWVzLCBpbnQgbmJhZCwKQEAgLTM3Nyw4ICszNzgsNyBAQAogCQkJYmZfbmV4dCA9IGJmLT5iZl9uZXh0OwogCiAJCQliZi0+YmZfc3RhdGUuYmZfdHlwZSB8PSBCVUZfWFJFVFJZOwotCQkJaWYgKChzYy0+c2NfYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9FRE1BKSB8fAotCQkJICAgICFiZi0+YmZfc3RhbGUgfHwgYmZfbmV4dCAhPSBOVUxMKQorCQkJaWYgKCFiZi0+YmZfc3RhbGUgfHwgYmZfbmV4dCAhPSBOVUxMKQogCQkJCWxpc3RfbW92ZV90YWlsKCZiZi0+bGlzdCwgJmJmX2hlYWQpOwogCiAJCQlhdGhfdHhfcmNfc3RhdHVzKHNjLCBiZiwgdHMsIDEsIDEsIDAsIGZhbHNlKTsKQEAgLTQ2MywyMCArNDYzLDE0IEBACiAJCQl9CiAJCX0KIAotCQlpZiAoIShzYy0+c2NfYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9FRE1BKSAmJgotCQkgICAgYmZfbmV4dCA9PSBOVUxMKSB7Ci0JCQkvKgotCQkJICogTWFrZSBzdXJlIHRoZSBsYXN0IGRlc2MgaXMgcmVjbGFpbWVkIGlmIGl0Ci0JCQkgKiBub3QgYSBob2xkaW5nIGRlc2MuCi0JCQkgKi8KLQkJCWlmICghYmZfbGFzdC0+YmZfc3RhbGUpCi0JCQkJbGlzdF9tb3ZlX3RhaWwoJmJmLT5saXN0LCAmYmZfaGVhZCk7Ci0JCQllbHNlCi0JCQkJSU5JVF9MSVNUX0hFQUQoJmJmX2hlYWQpOwotCQl9IGVsc2UgewotCQkJQlVHX09OKGxpc3RfZW1wdHkoYmZfcSkpOworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIGxhc3QgZGVzYyBpcyByZWNsYWltZWQgaWYgaXQKKwkJICogbm90IGEgaG9sZGluZyBkZXNjLgorCQkgKi8KKwkJaWYgKCFiZl9sYXN0LT5iZl9zdGFsZSB8fCBiZl9uZXh0ICE9IE5VTEwpCiAJCQlsaXN0X21vdmVfdGFpbCgmYmYtPmxpc3QsICZiZl9oZWFkKTsKLQkJfQorCQllbHNlCisJCQlJTklUX0xJU1RfSEVBRCgmYmZfaGVhZCk7CiAKIAkJaWYgKCF0eHBlbmRpbmcgfHwgKHRpZC0+c3RhdGUgJiBBR0dSX0NMRUFOVVApKSB7CiAJCQkvKgpAQCAtNTcyLDExICs1NjYsOCBAQAogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlpZiAobmVlZHJlc2V0KSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOworCWlmIChuZWVkcmVzZXQpCiAJCWF0aF9yZXNldChzYywgZmFsc2UpOwotCQlzcGluX2xvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7Ci0JfQogfQogCiBzdGF0aWMgdTMyIGF0aF9sb29rdXBfcmF0ZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9idWYgKmJmLApAQCAtNjcxLDcgKzY2Miw4IEBACiAJICogVE9ETyAtIHRoaXMgY291bGQgYmUgaW1wcm92ZWQgdG8gYmUgZGVwZW5kZW50IG9uIHRoZSByYXRlLgogCSAqICAgICAgVGhlIGhhcmR3YXJlIGNhbiBrZWVwIHVwIGF0IGxvd2VyIHJhdGVzLCBidXQgbm90IGhpZ2hlciByYXRlcwogCSAqLwotCWlmIChmaS0+a2V5aXggIT0gQVRIOUtfVFhLRVlJWF9JTlZBTElEKQorCWlmICgoZmktPmtleWl4ICE9IEFUSDlLX1RYS0VZSVhfSU5WQUxJRCkgJiYKKwkgICAgIShzYy0+c2NfYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9FRE1BKSkKIAkJbmRlbGltICs9IEFUSF9BR0dSX0VOQ1JZUFRERUxJTTsKIAogCS8qCkBAIC04MzcsNyArODI5LDcgQEAKIAkJCWJmLT5iZl9zdGF0ZS5iZl90eXBlICY9IH5CVUZfQUdHUjsKIAkJCWF0aDlrX2h3X2NscjExbl9hZ2dyKHNjLT5zY19haCwgYmYtPmJmX2Rlc2MpOwogCQkJYXRoX2J1Zl9zZXRfcmF0ZShzYywgYmYsIGZpLT5mcmFtZWxlbik7Ci0JCQlhdGhfdHhfdHhxYWRkYnVmKHNjLCB0eHEsICZiZl9xKTsKKwkJCWF0aF90eF90eHFhZGRidWYoc2MsIHR4cSwgJmJmX3EsIGZhbHNlKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTg0OSw3ICs4NDEsNyBAQAogCQkvKiBhbmNob3IgbGFzdCBkZXNjIG9mIGFnZ3JlZ2F0ZSAqLwogCQlhdGg5a19od19zZXQxMW5fYWdncl9sYXN0KHNjLT5zY19haCwgYmYtPmJmX2xhc3RiZi0+YmZfZGVzYyk7CiAKLQkJYXRoX3R4X3R4cWFkZGJ1ZihzYywgdHhxLCAmYmZfcSk7CisJCWF0aF90eF90eHFhZGRidWYoc2MsIHR4cSwgJmJmX3EsIGZhbHNlKTsKIAkJVFhfU1RBVF9JTkModHhxLT5heHFfcW51bSwgYV9hZ2dyKTsKIAogCX0gd2hpbGUgKHR4cS0+YXhxX2FtcGR1X2RlcHRoIDwgQVRIX0FHR1JfTUlOX1FERVBUSCAmJgpAQCAtMTA4NSw3ICsxMDc3LDYgQEAKIAkJdHhxLT50eHFfaGVhZGlkeCA9IHR4cS0+dHhxX3RhaWxpZHggPSAwOwogCQlmb3IgKGkgPSAwOyBpIDwgQVRIX1RYRklGT19ERVBUSDsgaSsrKQogCQkJSU5JVF9MSVNUX0hFQUQoJnR4cS0+dHhxX2ZpZm9baV0pOwotCQlJTklUX0xJU1RfSEVBRCgmdHhxLT50eHFfZmlmb19wZW5kaW5nKTsKIAl9CiAJcmV0dXJuICZzYy0+dHgudHhxW2F4cV9xbnVtXTsKIH0KQEAgLTExNTUsMTMgKzExNDYsMTAgQEAKICAgICByZXR1cm4gYmZfaXNhbXBkdShiZikgJiYgIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUkFURV9DVFJMX1BST0JFKTsKIH0KIAotLyoKLSAqIERyYWluIGEgZ2l2ZW4gVFggcXVldWUgKGNvdWxkIGJlIEJlYWNvbiBvciBEYXRhKQotICoKLSAqIFRoaXMgYXNzdW1lcyBvdXRwdXQgaGFzIGJlZW4gc3RvcHBlZCBhbmQKLSAqIHdlIGRvIG5vdCBuZWVkIHRvIGJsb2NrIGF0aF90eF90YXNrbGV0LgotICovCi12b2lkIGF0aF9kcmFpbnR4cShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwgYm9vbCByZXRyeV90eCkKK3N0YXRpYyB2b2lkIGF0aF9kcmFpbl90eHFfbGlzdChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwKKwkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBib29sIHJldHJ5X3R4KQorCV9fcmVsZWFzZXModHhxLT5heHFfbG9jaykKKwlfX2FjcXVpcmVzKHR4cS0+YXhxX2xvY2spCiB7CiAJc3RydWN0IGF0aF9idWYgKmJmLCAqbGFzdGJmOwogCXN0cnVjdCBsaXN0X2hlYWQgYmZfaGVhZDsKQEAgLTExNzAsOTMgKzExNTgsNjMgQEAKIAltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKIAlJTklUX0xJU1RfSEVBRCgmYmZfaGVhZCk7CiAKLQlmb3IgKDs7KSB7Ci0JCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCWJmID0gbGlzdF9maXJzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgYXRoX2J1ZiwgbGlzdCk7CiAKLQkJaWYgKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0VETUEpIHsKLQkJCWlmIChsaXN0X2VtcHR5KCZ0eHEtPnR4cV9maWZvW3R4cS0+dHhxX3RhaWxpZHhdKSkgewotCQkJCXR4cS0+dHhxX2hlYWRpZHggPSB0eHEtPnR4cV90YWlsaWR4ID0gMDsKLQkJCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWJmID0gbGlzdF9maXJzdF9lbnRyeSgmdHhxLT50eHFfZmlmb1t0eHEtPnR4cV90YWlsaWR4XSwKLQkJCQkJCSAgICAgIHN0cnVjdCBhdGhfYnVmLCBsaXN0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChsaXN0X2VtcHR5KCZ0eHEtPmF4cV9xKSkgewotCQkJCXR4cS0+YXhxX2xpbmsgPSBOVUxMOwotCQkJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJmID0gbGlzdF9maXJzdF9lbnRyeSgmdHhxLT5heHFfcSwgc3RydWN0IGF0aF9idWYsCi0JCQkJCSAgICAgIGxpc3QpOworCQlpZiAoYmYtPmJmX3N0YWxlKSB7CisJCQlsaXN0X2RlbCgmYmYtPmxpc3QpOwogCi0JCQlpZiAoYmYtPmJmX3N0YWxlKSB7Ci0JCQkJbGlzdF9kZWwoJmJmLT5saXN0KTsKLQkJCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7Ci0KLQkJCQlhdGhfdHhfcmV0dXJuX2J1ZmZlcihzYywgYmYpOwotCQkJCWNvbnRpbnVlOwotCQkJfQorCQkJYXRoX3R4X3JldHVybl9idWZmZXIoc2MsIGJmKTsKKwkJCWNvbnRpbnVlOwogCQl9CiAKIAkJbGFzdGJmID0gYmYtPmJmX2xhc3RiZjsKLQotCQlpZiAoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkgewotCQkJbGlzdF9jdXRfcG9zaXRpb24oJmJmX2hlYWQsCi0JCQkJCSAgJnR4cS0+dHhxX2ZpZm9bdHhxLT50eHFfdGFpbGlkeF0sCi0JCQkJCSAgJmxhc3RiZi0+bGlzdCk7Ci0JCQlJTkNSKHR4cS0+dHhxX3RhaWxpZHgsIEFUSF9UWEZJRk9fREVQVEgpOwotCQl9IGVsc2UgewotCQkJLyogcmVtb3ZlIGF0aF9idWYncyBvZiB0aGUgc2FtZSBtcGR1IGZyb20gdHhxICovCi0JCQlsaXN0X2N1dF9wb3NpdGlvbigmYmZfaGVhZCwgJnR4cS0+YXhxX3EsICZsYXN0YmYtPmxpc3QpOwotCQl9CisJCWxpc3RfY3V0X3Bvc2l0aW9uKCZiZl9oZWFkLCBsaXN0LCAmbGFzdGJmLT5saXN0KTsKIAogCQl0eHEtPmF4cV9kZXB0aC0tOwogCQlpZiAoYmZfaXNfYW1wZHVfbm90X3Byb2JpbmcoYmYpKQogCQkJdHhxLT5heHFfYW1wZHVfZGVwdGgtLTsKLQkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCisJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAkJaWYgKGJmX2lzYW1wZHUoYmYpKQogCQkJYXRoX3R4X2NvbXBsZXRlX2FnZ3Ioc2MsIHR4cSwgYmYsICZiZl9oZWFkLCAmdHMsIDAsCiAJCQkJCSAgICAgcmV0cnlfdHgpOwogCQllbHNlCiAJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgJnRzLCAwLCAwKTsKLQl9Ci0KLQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwotCXR4cS0+YXhxX3R4X2lucHJvZ3Jlc3MgPSBmYWxzZTsKLQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7Ci0KLQlpZiAoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkgewogCQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwotCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnR4cS0+dHhxX2ZpZm9fcGVuZGluZykpIHsKLQkJCWJmID0gbGlzdF9maXJzdF9lbnRyeSgmdHhxLT50eHFfZmlmb19wZW5kaW5nLAotCQkJCQkgICAgICBzdHJ1Y3QgYXRoX2J1ZiwgbGlzdCk7Ci0JCQlsaXN0X2N1dF9wb3NpdGlvbigmYmZfaGVhZCwKLQkJCQkJICAmdHhxLT50eHFfZmlmb19wZW5kaW5nLAotCQkJCQkgICZiZi0+YmZfbGFzdGJmLT5saXN0KTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKLQotCQkJaWYgKGJmX2lzYW1wZHUoYmYpKQotCQkJCWF0aF90eF9jb21wbGV0ZV9hZ2dyKHNjLCB0eHEsIGJmLCAmYmZfaGVhZCwKLQkJCQkJCSAgICAgJnRzLCAwLCByZXRyeV90eCk7Ci0JCQllbHNlCi0JCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsCi0JCQkJCQkgICAgJnRzLCAwLCAwKTsKLQkJCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCX0KK30KKworLyoKKyAqIERyYWluIGEgZ2l2ZW4gVFggcXVldWUgKGNvdWxkIGJlIEJlYWNvbiBvciBEYXRhKQorICoKKyAqIFRoaXMgYXNzdW1lcyBvdXRwdXQgaGFzIGJlZW4gc3RvcHBlZCBhbmQKKyAqIHdlIGRvIG5vdCBuZWVkIHRvIGJsb2NrIGF0aF90eF90YXNrbGV0LgorICovCit2b2lkIGF0aF9kcmFpbnR4cShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwgYm9vbCByZXRyeV90eCkKK3sKKwlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOworCWlmIChzYy0+c2NfYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9FRE1BKSB7CisJCWludCBpZHggPSB0eHEtPnR4cV90YWlsaWR4OworCisJCXdoaWxlICghbGlzdF9lbXB0eSgmdHhxLT50eHFfZmlmb1tpZHhdKSkgeworCQkJYXRoX2RyYWluX3R4cV9saXN0KHNjLCB0eHEsICZ0eHEtPnR4cV9maWZvW2lkeF0sCisJCQkJCSAgIHJldHJ5X3R4KTsKKworCQkJSU5DUihpZHgsIEFUSF9UWEZJRk9fREVQVEgpOworCQl9CisJCXR4cS0+dHhxX3RhaWxpZHggPSBpZHg7CisJfQorCisJdHhxLT5heHFfbGluayA9IE5VTEw7CisJdHhxLT5heHFfdHhfaW5wcm9ncmVzcyA9IGZhbHNlOworCWF0aF9kcmFpbl90eHFfbGlzdChzYywgdHhxLCAmdHhxLT5heHFfcSwgcmV0cnlfdHgpOwogCiAJLyogZmx1c2ggYW55IHBlbmRpbmcgZnJhbWVzIGlmIGFnZ3JlZ2F0aW9uIGlzIGVuYWJsZWQgKi8KLQlpZiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfVFhBR0dSKSB7Ci0JCWlmICghcmV0cnlfdHgpIHsKLQkJCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7Ci0JCQlhdGhfdHhxX2RyYWluX3BlbmRpbmdfYnVmZmVycyhzYywgdHhxKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKLQkJfQotCX0KKwlpZiAoKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikgJiYgIXJldHJ5X3R4KQorCQlhdGhfdHhxX2RyYWluX3BlbmRpbmdfYnVmZmVycyhzYywgdHhxKTsKKworCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIH0KIAogYm9vbCBhdGhfZHJhaW5fYWxsX3R4cShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgYm9vbCByZXRyeV90eCkKQEAgLTEzNzAsMTEgKzEzMjgsMTMgQEAKICAqIGFzc3VtZSB0aGUgZGVzY3JpcHRvcnMgYXJlIGFscmVhZHkgY2hhaW5lZCB0b2dldGhlciBieSBjYWxsZXIuCiAgKi8KIHN0YXRpYyB2b2lkIGF0aF90eF90eHFhZGRidWYoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEsCi0JCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCisJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGJvb2wgaW50ZXJuYWwpCiB7CiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7Ci0Jc3RydWN0IGF0aF9idWYgKmJmOworCXN0cnVjdCBhdGhfYnVmICpiZiwgKmJmX2xhc3Q7CisJYm9vbCBwdXR0eGJ1ZiA9IGZhbHNlOworCWJvb2wgZWRtYTsKIAogCS8qCiAJICogSW5zZXJ0IHRoZSBmcmFtZSBvbiB0aGUgb3V0Ym91bmQgbGlzdCBhbmQKQEAgLTEzODQsNTEgKzEzNDQsNDkgQEAKIAlpZiAobGlzdF9lbXB0eShoZWFkKSkKIAkJcmV0dXJuOwogCisJZWRtYSA9ICEhKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSk7CiAJYmYgPSBsaXN0X2ZpcnN0X2VudHJ5KGhlYWQsIHN0cnVjdCBhdGhfYnVmLCBsaXN0KTsKKwliZl9sYXN0ID0gbGlzdF9lbnRyeShoZWFkLT5wcmV2LCBzdHJ1Y3QgYXRoX2J1ZiwgbGlzdCk7CiAKIAlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19RVUVVRSwKIAkJInFudW06ICVkLCB0eHEgZGVwdGg6ICVkXG4iLCB0eHEtPmF4cV9xbnVtLCB0eHEtPmF4cV9kZXB0aCk7CiAKLQlpZiAoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkgewotCQlpZiAodHhxLT5heHFfZGVwdGggPj0gQVRIX1RYRklGT19ERVBUSCkgewotCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KGhlYWQsICZ0eHEtPnR4cV9maWZvX3BlbmRpbmcpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghbGlzdF9lbXB0eSgmdHhxLT50eHFfZmlmb1t0eHEtPnR4cV9oZWFkaWR4XSkpCi0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19YTUlULAotCQkJCSJJbml0aWFsaXppbmcgdHggZmlmbyAlZCB3aGljaCBpcyBub24tZW1wdHlcbiIsCi0JCQkJdHhxLT50eHFfaGVhZGlkeCk7Ci0JCUlOSVRfTElTVF9IRUFEKCZ0eHEtPnR4cV9maWZvW3R4cS0+dHhxX2hlYWRpZHhdKTsKLQkJbGlzdF9zcGxpY2VfaW5pdChoZWFkLCAmdHhxLT50eHFfZmlmb1t0eHEtPnR4cV9oZWFkaWR4XSk7CisJaWYgKGVkbWEgJiYgbGlzdF9lbXB0eSgmdHhxLT50eHFfZmlmb1t0eHEtPnR4cV9oZWFkaWR4XSkpIHsKKwkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KGhlYWQsICZ0eHEtPnR4cV9maWZvW3R4cS0+dHhxX2hlYWRpZHhdKTsKIAkJSU5DUih0eHEtPnR4cV9oZWFkaWR4LCBBVEhfVFhGSUZPX0RFUFRIKTsKLQkJVFhfU1RBVF9JTkModHhxLT5heHFfcW51bSwgcHV0dHhidWYpOwotCQlhdGg5a19od19wdXR0eGJ1ZihhaCwgdHhxLT5heHFfcW51bSwgYmYtPmJmX2RhZGRyKTsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfWE1JVCwgIlRYRFBbJXVdID0gJWxseCAoJXApXG4iLAotCQkJdHhxLT5heHFfcW51bSwgaXRvNjQoYmYtPmJmX2RhZGRyKSwgYmYtPmJmX2Rlc2MpOworCQlwdXR0eGJ1ZiA9IHRydWU7CiAJfSBlbHNlIHsKIAkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KGhlYWQsICZ0eHEtPmF4cV9xKTsKIAotCQlpZiAodHhxLT5heHFfbGluayA9PSBOVUxMKSB7Ci0JCQlUWF9TVEFUX0lOQyh0eHEtPmF4cV9xbnVtLCBwdXR0eGJ1Zik7Ci0JCQlhdGg5a19od19wdXR0eGJ1ZihhaCwgdHhxLT5heHFfcW51bSwgYmYtPmJmX2RhZGRyKTsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsICJUWERQWyV1XSA9ICVsbHggKCVwKVxuIiwKLQkJCQl0eHEtPmF4cV9xbnVtLCBpdG82NChiZi0+YmZfZGFkZHIpLAotCQkJCWJmLT5iZl9kZXNjKTsKLQkJfSBlbHNlIHsKLQkJCSp0eHEtPmF4cV9saW5rID0gYmYtPmJmX2RhZGRyOworCQlpZiAodHhxLT5heHFfbGluaykgeworCQkJYXRoOWtfaHdfc2V0X2Rlc2NfbGluayhhaCwgdHhxLT5heHFfbGluaywgYmYtPmJmX2RhZGRyKTsKIAkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsCiAJCQkJImxpbmtbJXVdICglcCk9JWxseCAoJXApXG4iLAogCQkJCXR4cS0+YXhxX3FudW0sIHR4cS0+YXhxX2xpbmssCiAJCQkJaXRvNjQoYmYtPmJmX2RhZGRyKSwgYmYtPmJmX2Rlc2MpOwotCQl9Ci0JCWF0aDlrX2h3X2dldF9kZXNjX2xpbmsoYWgsIGJmLT5iZl9sYXN0YmYtPmJmX2Rlc2MsCi0JCQkJICAgICAgICZ0eHEtPmF4cV9saW5rKTsKKwkJfSBlbHNlIGlmICghZWRtYSkKKwkJCXB1dHR4YnVmID0gdHJ1ZTsKKworCQl0eHEtPmF4cV9saW5rID0gYmZfbGFzdC0+YmZfZGVzYzsKKwl9CisKKwlpZiAocHV0dHhidWYpIHsKKwkJVFhfU1RBVF9JTkModHhxLT5heHFfcW51bSwgcHV0dHhidWYpOworCQlhdGg5a19od19wdXR0eGJ1ZihhaCwgdHhxLT5heHFfcW51bSwgYmYtPmJmX2RhZGRyKTsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfWE1JVCwgIlRYRFBbJXVdID0gJWxseCAoJXApXG4iLAorCQkJdHhxLT5heHFfcW51bSwgaXRvNjQoYmYtPmJmX2RhZGRyKSwgYmYtPmJmX2Rlc2MpOworCX0KKworCWlmICghZWRtYSkgewogCQlUWF9TVEFUX0lOQyh0eHEtPmF4cV9xbnVtLCB0eHN0YXJ0KTsKIAkJYXRoOWtfaHdfdHhzdGFydChhaCwgdHhxLT5heHFfcW51bSk7CiAJfQotCXR4cS0+YXhxX2RlcHRoKys7Ci0JaWYgKGJmX2lzX2FtcGR1X25vdF9wcm9iaW5nKGJmKSkKLQkJdHhxLT5heHFfYW1wZHVfZGVwdGgrKzsKKworCWlmICghaW50ZXJuYWwpIHsKKwkJdHhxLT5heHFfZGVwdGgrKzsKKwkJaWYgKGJmX2lzX2FtcGR1X25vdF9wcm9iaW5nKGJmKSkKKwkJCXR4cS0+YXhxX2FtcGR1X2RlcHRoKys7CisJfQogfQogCiBzdGF0aWMgdm9pZCBhdGhfdHhfc2VuZF9hbXBkdShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9hdHhfdGlkICp0aWQsCkBAIC0xNDcwLDcgKzE0MjgsNyBAQAogCVRYX1NUQVRfSU5DKHR4Y3RsLT50eHEtPmF4cV9xbnVtLCBhX3F1ZXVlZF9odyk7CiAJYmYtPmJmX2xhc3RiZiA9IGJmOwogCWF0aF9idWZfc2V0X3JhdGUoc2MsIGJmLCBmaS0+ZnJhbWVsZW4pOwotCWF0aF90eF90eHFhZGRidWYoc2MsIHR4Y3RsLT50eHEsICZiZl9oZWFkKTsKKwlhdGhfdHhfdHhxYWRkYnVmKHNjLCB0eGN0bC0+dHhxLCAmYmZfaGVhZCwgZmFsc2UpOwogfQogCiBzdGF0aWMgdm9pZCBhdGhfdHhfc2VuZF9ub3JtYWwoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEsCkBAIC0xNDkwLDcgKzE0NDgsNyBAQAogCWJmLT5iZl9sYXN0YmYgPSBiZjsKIAlmaSA9IGdldF9mcmFtZV9pbmZvKGJmLT5iZl9tcGR1KTsKIAlhdGhfYnVmX3NldF9yYXRlKHNjLCBiZiwgZmktPmZyYW1lbGVuKTsKLQlhdGhfdHhfdHhxYWRkYnVmKHNjLCB0eHEsIGJmX2hlYWQpOworCWF0aF90eF90eHFhZGRidWYoc2MsIHR4cSwgYmZfaGVhZCwgZmFsc2UpOwogCVRYX1NUQVRfSU5DKHR4cS0+YXhxX3FudW0sIHF1ZXVlZCk7CiB9CiAKQEAgLTIwNzcsNiArMjAzNSw0MCBAQAogCXR4X2luZm8tPnN0YXR1cy5yYXRlc1t0eF9yYXRlaW5kZXhdLmNvdW50ID0gdHMtPnRzX2xvbmdyZXRyeSArIDE7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aF90eF9wcm9jZXNzX2J1ZmZlcihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwKKwkJCQkgIHN0cnVjdCBhdGhfdHhfc3RhdHVzICp0cywgc3RydWN0IGF0aF9idWYgKmJmLAorCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqYmZfaGVhZCkKKwlfX3JlbGVhc2VzKHR4cS0+YXhxX2xvY2spCisJX19hY3F1aXJlcyh0eHEtPmF4cV9sb2NrKQoreworCWludCB0eG9rOworCisJdHhxLT5heHFfZGVwdGgtLTsKKwl0eG9rID0gISh0cy0+dHNfc3RhdHVzICYgQVRIOUtfVFhFUlJfTUFTSyk7CisJdHhxLT5heHFfdHhfaW5wcm9ncmVzcyA9IGZhbHNlOworCWlmIChiZl9pc19hbXBkdV9ub3RfcHJvYmluZyhiZikpCisJCXR4cS0+YXhxX2FtcGR1X2RlcHRoLS07CisKKwlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisKKwlpZiAoIWJmX2lzYW1wZHUoYmYpKSB7CisJCS8qCisJCSAqIFRoaXMgZnJhbWUgaXMgc2VudCBvdXQgYXMgYSBzaW5nbGUgZnJhbWUuCisJCSAqIFVzZSBoYXJkd2FyZSByZXRyeSBzdGF0dXMgZm9yIHRoaXMgZnJhbWUuCisJCSAqLworCQlpZiAodHMtPnRzX3N0YXR1cyAmIEFUSDlLX1RYRVJSX1hSRVRSWSkKKwkJCWJmLT5iZl9zdGF0ZS5iZl90eXBlIHw9IEJVRl9YUkVUUlk7CisJCWF0aF90eF9yY19zdGF0dXMoc2MsIGJmLCB0cywgMSwgdHhvayA/IDAgOiAxLCB0eG9rLCB0cnVlKTsKKwkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgYmZfaGVhZCwgdHMsIHR4b2ssIDApOworCX0gZWxzZQorCQlhdGhfdHhfY29tcGxldGVfYWdncihzYywgdHhxLCBiZiwgYmZfaGVhZCwgdHMsIHR4b2ssIHRydWUpOworCisJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKworCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9UWEFHR1IpCisJCWF0aF90eHFfc2NoZWR1bGUoc2MsIHR4cSk7Cit9CisKIHN0YXRpYyB2b2lkIGF0aF90eF9wcm9jZXNzcShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSkKIHsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKQEAgLTIwODUsMjAgKzIwNzcsMTggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGJmX2hlYWQ7CiAJc3RydWN0IGF0aF9kZXNjICpkczsKIAlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyB0czsKLQlpbnQgdHhvazsKIAlpbnQgc3RhdHVzOwogCiAJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUVVFVUUsICJ0eCBxdWV1ZSAlZCAoJXgpLCBsaW5rICVwXG4iLAogCQl0eHEtPmF4cV9xbnVtLCBhdGg5a19od19nZXR0eGJ1ZihzYy0+c2NfYWgsIHR4cS0+YXhxX3FudW0pLAogCQl0eHEtPmF4cV9saW5rKTsKIAorCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAJZm9yICg7OykgewotCQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCQlpZiAobGlzdF9lbXB0eSgmdHhxLT5heHFfcSkpIHsKIAkJCXR4cS0+YXhxX2xpbmsgPSBOVUxMOwogCQkJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikKIAkJCQlhdGhfdHhxX3NjaGVkdWxlKHNjLCB0eHEpOwotCQkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCQkJYnJlYWs7CiAJCX0KIAkJYmYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0eHEtPmF4cV9xLCBzdHJ1Y3QgYXRoX2J1ZiwgbGlzdCk7CkBAIC0yMTE0LDEzICsyMTA0LDExIEBACiAJCWJmX2hlbGQgPSBOVUxMOwogCQlpZiAoYmYtPmJmX3N0YWxlKSB7CiAJCQliZl9oZWxkID0gYmY7Ci0JCQlpZiAobGlzdF9pc19sYXN0KCZiZl9oZWxkLT5saXN0LCAmdHhxLT5heHFfcSkpIHsKLQkJCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJCQlpZiAobGlzdF9pc19sYXN0KCZiZl9oZWxkLT5saXN0LCAmdHhxLT5heHFfcSkpCiAJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWJmID0gbGlzdF9lbnRyeShiZl9oZWxkLT5saXN0Lm5leHQsCi0JCQkJCQlzdHJ1Y3QgYXRoX2J1ZiwgbGlzdCk7Ci0JCQl9CisKKwkJCWJmID0gbGlzdF9lbnRyeShiZl9oZWxkLT5saXN0Lm5leHQsIHN0cnVjdCBhdGhfYnVmLAorCQkJCQlsaXN0KTsKIAkJfQogCiAJCWxhc3RiZiA9IGJmLT5iZl9sYXN0YmY7CkBAIC0yMTI4LDEwICsyMTE2LDkgQEAKIAogCQltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKIAkJc3RhdHVzID0gYXRoOWtfaHdfdHhwcm9jZGVzYyhhaCwgZHMsICZ0cyk7Ci0JCWlmIChzdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJCWlmIChzdGF0dXMgPT0gLUVJTlBST0dSRVNTKQogCQkJYnJlYWs7Ci0JCX0KKwogCQlUWF9TVEFUX0lOQyh0eHEtPmF4cV9xbnVtLCB0eHByb2NkZXNjKTsKIAogCQkvKgpAQCAtMjE0NSw0MiArMjEzMiwxNCBAQAogCQkJbGlzdF9jdXRfcG9zaXRpb24oJmJmX2hlYWQsCiAJCQkJJnR4cS0+YXhxX3EsIGxhc3RiZi0+bGlzdC5wcmV2KTsKIAotCQl0eHEtPmF4cV9kZXB0aC0tOwotCQl0eG9rID0gISh0cy50c19zdGF0dXMgJiBBVEg5S19UWEVSUl9NQVNLKTsKLQkJdHhxLT5heHFfdHhfaW5wcm9ncmVzcyA9IGZhbHNlOwotCQlpZiAoYmZfaGVsZCkKKwkJaWYgKGJmX2hlbGQpIHsKIAkJCWxpc3RfZGVsKCZiZl9oZWxkLT5saXN0KTsKLQotCQlpZiAoYmZfaXNfYW1wZHVfbm90X3Byb2JpbmcoYmYpKQotCQkJdHhxLT5heHFfYW1wZHVfZGVwdGgtLTsKLQotCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7Ci0KLQkJaWYgKGJmX2hlbGQpCiAJCQlhdGhfdHhfcmV0dXJuX2J1ZmZlcihzYywgYmZfaGVsZCk7Ci0KLQkJaWYgKCFiZl9pc2FtcGR1KGJmKSkgewotCQkJLyoKLQkJCSAqIFRoaXMgZnJhbWUgaXMgc2VudCBvdXQgYXMgYSBzaW5nbGUgZnJhbWUuCi0JCQkgKiBVc2UgaGFyZHdhcmUgcmV0cnkgc3RhdHVzIGZvciB0aGlzIGZyYW1lLgotCQkJICovCi0JCQlpZiAodHMudHNfc3RhdHVzICYgQVRIOUtfVFhFUlJfWFJFVFJZKQotCQkJCWJmLT5iZl9zdGF0ZS5iZl90eXBlIHw9IEJVRl9YUkVUUlk7Ci0JCQlhdGhfdHhfcmNfc3RhdHVzKHNjLCBiZiwgJnRzLCAxLCB0eG9rID8gMCA6IDEsIHR4b2ssIHRydWUpOwogCQl9CiAKLQkJaWYgKGJmX2lzYW1wZHUoYmYpKQotCQkJYXRoX3R4X2NvbXBsZXRlX2FnZ3Ioc2MsIHR4cSwgYmYsICZiZl9oZWFkLCAmdHMsIHR4b2ssCi0JCQkJCSAgICAgdHJ1ZSk7Ci0JCWVsc2UKLQkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCAmdHMsIHR4b2ssIDApOwotCi0JCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7Ci0KLQkJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikKLQkJCWF0aF90eHFfc2NoZWR1bGUoc2MsIHR4cSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwkJYXRoX3R4X3Byb2Nlc3NfYnVmZmVyKHNjLCB0eHEsICZ0cywgYmYsICZiZl9oZWFkKTsKIAl9CisJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGVfcG9sbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTIyMTMsNyArMjE3Miw5IEBACiAJaWYgKG5lZWRyZXNldCkgewogCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpLCBBVEhfREJHX1JFU0VULAogCQkJInR4IGh1bmcsIHJlc2V0dGluZyB0aGUgY2hpcFxuIik7CisJCXNwaW5fbG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKIAkJYXRoX3Jlc2V0KHNjLCB0cnVlKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CiAJfQogCiAJaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayhzYy0+aHcsICZzYy0+dHhfY29tcGxldGVfd29yaywKQEAgLTIyMzcsMTcgKzIxOTgsMTYgQEAKIAogdm9pZCBhdGhfdHhfZWRtYV90YXNrbGV0KHN0cnVjdCBhdGhfc29mdGMgKnNjKQogewotCXN0cnVjdCBhdGhfdHhfc3RhdHVzIHR4czsKKwlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyB0czsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CiAJc3RydWN0IGF0aF90eHEgKnR4cTsKIAlzdHJ1Y3QgYXRoX2J1ZiAqYmYsICpsYXN0YmY7CiAJc3RydWN0IGxpc3RfaGVhZCBiZl9oZWFkOwogCWludCBzdGF0dXM7Ci0JaW50IHR4b2s7CiAKIAlmb3IgKDs7KSB7Ci0JCXN0YXR1cyA9IGF0aDlrX2h3X3R4cHJvY2Rlc2MoYWgsIE5VTEwsICh2b2lkICopJnR4cyk7CisJCXN0YXR1cyA9IGF0aDlrX2h3X3R4cHJvY2Rlc2MoYWgsIE5VTEwsICh2b2lkICopJnRzKTsKIAkJaWYgKHN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCiAJCQlicmVhazsKIAkJaWYgKHN0YXR1cyA9PSAtRUlPKSB7CkBAIC0yMjU3LDEyICsyMjE3LDEzIEBACiAJCX0KIAogCQkvKiBTa2lwIGJlYWNvbiBjb21wbGV0aW9ucyAqLwotCQlpZiAodHhzLnFpZCA9PSBzYy0+YmVhY29uLmJlYWNvbnEpCisJCWlmICh0cy5xaWQgPT0gc2MtPmJlYWNvbi5iZWFjb25xKQogCQkJY29udGludWU7CiAKLQkJdHhxID0gJnNjLT50eC50eHFbdHhzLnFpZF07CisJCXR4cSA9ICZzYy0+dHgudHhxW3RzLnFpZF07CiAKIAkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwogCQlpZiAobGlzdF9lbXB0eSgmdHhxLT50eHFfZmlmb1t0eHEtPnR4cV90YWlsaWR4XSkpIHsKIAkJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAkJCXJldHVybjsKQEAgLTIyNzUsNDEgKzIyMzYsMjEgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJmJmX2hlYWQpOwogCQlsaXN0X2N1dF9wb3NpdGlvbigmYmZfaGVhZCwgJnR4cS0+dHhxX2ZpZm9bdHhxLT50eHFfdGFpbGlkeF0sCiAJCQkJICAmbGFzdGJmLT5saXN0KTsKLQkJSU5DUih0eHEtPnR4cV90YWlsaWR4LCBBVEhfVFhGSUZPX0RFUFRIKTsKLQkJdHhxLT5heHFfZGVwdGgtLTsKLQkJdHhxLT5heHFfdHhfaW5wcm9ncmVzcyA9IGZhbHNlOwotCQlpZiAoYmZfaXNfYW1wZHVfbm90X3Byb2JpbmcoYmYpKQotCQkJdHhxLT5heHFfYW1wZHVfZGVwdGgtLTsKLQkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCi0JCXR4b2sgPSAhKHR4cy50c19zdGF0dXMgJiBBVEg5S19UWEVSUl9NQVNLKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnR4cS0+dHhxX2ZpZm9bdHhxLT50eHFfdGFpbGlkeF0pKSB7CisJCQlJTkNSKHR4cS0+dHhxX3RhaWxpZHgsIEFUSF9UWEZJRk9fREVQVEgpOwogCi0JCWlmICghYmZfaXNhbXBkdShiZikpIHsKLQkJCWlmICh0eHMudHNfc3RhdHVzICYgQVRIOUtfVFhFUlJfWFJFVFJZKQotCQkJCWJmLT5iZl9zdGF0ZS5iZl90eXBlIHw9IEJVRl9YUkVUUlk7Ci0JCQlhdGhfdHhfcmNfc3RhdHVzKHNjLCBiZiwgJnR4cywgMSwgdHhvayA/IDAgOiAxLCB0eG9rLCB0cnVlKTsKKwkJCWlmICghbGlzdF9lbXB0eSgmdHhxLT5heHFfcSkpIHsKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkIGJmX3E7CisKKwkJCQlJTklUX0xJU1RfSEVBRCgmYmZfcSk7CisJCQkJdHhxLT5heHFfbGluayA9IE5VTEw7CisJCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ0eHEtPmF4cV9xLCAmYmZfcSk7CisJCQkJYXRoX3R4X3R4cWFkZGJ1ZihzYywgdHhxLCAmYmZfcSwgdHJ1ZSk7CisJCQl9CiAJCX0KIAotCQlpZiAoYmZfaXNhbXBkdShiZikpCi0JCQlhdGhfdHhfY29tcGxldGVfYWdncihzYywgdHhxLCBiZiwgJmJmX2hlYWQsICZ0eHMsCi0JCQkJCSAgICAgdHhvaywgdHJ1ZSk7Ci0JCWVsc2UKLQkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLAotCQkJCQkgICAgJnR4cywgdHhvaywgMCk7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKLQotCQlpZiAoIWxpc3RfZW1wdHkoJnR4cS0+dHhxX2ZpZm9fcGVuZGluZykpIHsKLQkJCUlOSVRfTElTVF9IRUFEKCZiZl9oZWFkKTsKLQkJCWJmID0gbGlzdF9maXJzdF9lbnRyeSgmdHhxLT50eHFfZmlmb19wZW5kaW5nLAotCQkJCQkgICAgICBzdHJ1Y3QgYXRoX2J1ZiwgbGlzdCk7Ci0JCQlsaXN0X2N1dF9wb3NpdGlvbigmYmZfaGVhZCwKLQkJCQkJICAmdHhxLT50eHFfZmlmb19wZW5kaW5nLAotCQkJCQkgICZiZi0+YmZfbGFzdGJmLT5saXN0KTsKLQkJCWF0aF90eF90eHFhZGRidWYoc2MsIHR4cSwgJmJmX2hlYWQpOwotCQl9IGVsc2UgaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikKLQkJCWF0aF90eHFfc2NoZWR1bGUoc2MsIHR4cSk7Ci0KKwkJYXRoX3R4X3Byb2Nlc3NfYnVmZmVyKHNjLCB0eHEsICZ0cywgYmYsICZiZl9oZWFkKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9jYXJsOTE3MC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2Nhcmw5MTcwLmgKaW5kZXggNGRhMDFhOS4uYzU0MjdhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2Nhcmw5MTcwLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2Nhcmw5MTcwLmgKQEAgLTY3LDYgKzY3LDggQEAKIAogI2RlZmluZSBQQVlMT0FEX01BWAkoQ0FSTDkxNzBfTUFYX0NNRF9MRU4gLyA0IC0gMSkKIAorc3RhdGljIGNvbnN0IHU4IGFyOTE3MF9xbWFwW19fQVI5MTcwX05VTV9UWFFdID0geyAzLCAyLCAxLCAwIH07CisKIGVudW0gY2FybDkxNzBfcmZfaW5pdF9tb2RlIHsKIAlDQVJMOTE3MF9SRklfTk9ORSwKIAlDQVJMOTE3MF9SRklfV0FSTSwKQEAgLTE3NSw3ICsxNzcsNyBAQAogCiBzdHJ1Y3QgY2FybDkxNzBfdmlmIHsKIAl1bnNpZ25lZCBpbnQgaWQ7Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBfX3JjdSAqdmlmOwogfTsKIAogc3RydWN0IGNhcmw5MTcwX3ZpZl9pbmZvIHsKQEAgLTMwOSw3ICszMTEsNyBAQAogCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7CiAJdW5zaWduZWQgaW50IGdsb2JhbF9wcmV0YnR0OwogCXVuc2lnbmVkIGludCBnbG9iYWxfYmVhY29uX2ludDsKLQlzdHJ1Y3QgY2FybDkxNzBfdmlmX2luZm8gKmJlYWNvbl9pdGVyOworCXN0cnVjdCBjYXJsOTE3MF92aWZfaW5mbyBfX3JjdSAqYmVhY29uX2l0ZXI7CiAJdW5zaWduZWQgaW50IGJlYWNvbl9lbmFibGVkOwogCiAJLyogY3J5cHRvZ3JhcGhpYyBlbmdpbmUgKi8KQEAgLTM4Nyw3ICszODksNyBAQAogCS8qIHR4IGFtcGR1ICovCiAJc3RydWN0IHdvcmtfc3RydWN0IGFtcGR1X3dvcms7CiAJc3BpbmxvY2tfdCB0eF9hbXBkdV9saXN0X2xvY2s7Ci0Jc3RydWN0IGNhcmw5MTcwX3N0YV90aWQgKnR4X2FtcGR1X2l0ZXI7CisJc3RydWN0IGNhcmw5MTcwX3N0YV90aWQgX19yY3UgKnR4X2FtcGR1X2l0ZXI7CiAJc3RydWN0IGxpc3RfaGVhZCB0eF9hbXBkdV9saXN0OwogCWF0b21pY190IHR4X2FtcGR1X3VwbG9hZDsKIAlhdG9taWNfdCB0eF9hbXBkdV9zY2hlZHVsZXI7CkBAIC00NDAsNyArNDQyLDYgQEAKIGVudW0gY2FybDkxNzBfcHNfb2ZmX292ZXJyaWRlX3JlYXNvbnMgewogCVBTX09GRl9WSUYJPSBCSVQoMCksCiAJUFNfT0ZGX0JDTgk9IEJJVCgxKSwKLQlQU19PRkZfNUdIWgk9IEJJVCgyKSwKIH07CiAKIHN0cnVjdCBjYXJsOTE3MF9iYV9zdGF0cyB7CkBAIC00NTUsNyArNDU2LDcgQEAKIAlib29sIHNsZWVwaW5nOwogCWF0b21pY190IHBlbmRpbmdfZnJhbWVzOwogCXVuc2lnbmVkIGludCBhbXBkdV9tYXhfbGVuOwotCXN0cnVjdCBjYXJsOTE3MF9zdGFfdGlkICphZ2dbQ0FSTDkxNzBfTlVNX1RJRF07CisJc3RydWN0IGNhcmw5MTcwX3N0YV90aWQgX19yY3UgKmFnZ1tDQVJMOTE3MF9OVU1fVElEXTsKIAlzdHJ1Y3QgY2FybDkxNzBfYmFfc3RhdHMgc3RhdHNbQ0FSTDkxNzBfTlVNX1RJRF07CiB9OwogCkBAIC01MzEsNyArNTMyLDYgQEAKIGludCBjYXJsOTE3MF9zZXRfc2xvdF90aW1lKHN0cnVjdCBhcjkxNzAgKmFyKTsKIGludCBjYXJsOTE3MF9zZXRfbWFjX3JhdGVzKHN0cnVjdCBhcjkxNzAgKmFyKTsKIGludCBjYXJsOTE3MF9zZXRfaHdyZXRyeV9saW1pdChzdHJ1Y3QgYXI5MTcwICphciwgY29uc3QgdTMyIG1heF9yZXRyeSk7Ci1pbnQgY2FybDkxNzBfdXBkYXRlX2JlYWNvbihzdHJ1Y3QgYXI5MTcwICphciwgY29uc3QgYm9vbCBzdWJtaXQpOwogaW50IGNhcmw5MTcwX3VwbG9hZF9rZXkoc3RydWN0IGFyOTE3MCAqYXIsIGNvbnN0IHU4IGlkLCBjb25zdCB1OCAqbWFjLAogCWNvbnN0IHU4IGt0eXBlLCBjb25zdCB1OCBrZXlpZHgsIGNvbnN0IHU4ICprZXlkYXRhLCBjb25zdCBpbnQga2V5bGVuKTsKIGludCBjYXJsOTE3MF9kaXNhYmxlX2tleShzdHJ1Y3QgYXI5MTcwICphciwgY29uc3QgdTggaWQpOwpAQCAtNTUyLDYgKzU1Miw3IEBACiB2b2lkIGNhcmw5MTcwX3R4X3NjaGVkdWxlcihzdHJ1Y3QgYXI5MTcwICphcik7CiB2b2lkIGNhcmw5MTcwX3R4X2dldF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgY2FybDkxNzBfdHhfcHV0X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBjYXJsOTE3MF91cGRhdGVfYmVhY29uKHN0cnVjdCBhcjkxNzAgKmFyLCBjb25zdCBib29sIHN1Ym1pdCk7CiAKIC8qIExFRHMgKi8KICNpZmRlZiBDT05GSUdfQ0FSTDkxNzBfTEVEUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2NtZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2NtZC5oCmluZGV4IDU2ODE3NGMuLmQ1Zjk1YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9jbWQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvY21kLmgKQEAgLTg3LDcgKzg3LDcgQEAKIAlfX2FyLT5jbWRfYnVmWzIgKiBfX25yZWcgKyAxXSA9IGNwdV90b19sZTMyKHIpOwkJCVwKIAlfX2FyLT5jbWRfYnVmWzIgKiBfX25yZWcgKyAyXSA9IGNwdV90b19sZTMyKHYpOwkJCVwKIAlfX25yZWcrKzsJCQkJCQkJXAotCWlmICgoX19ucmVnID49IFBBWUxPQURfTUFYLzIpKSB7CQkJCVwKKwlpZiAoKF9fbnJlZyA+PSBQQVlMT0FEX01BWCAvIDIpKSB7CQkJCVwKIAkJaWYgKElTX0FDQ0VQVElOR19DTUQoX19hcikpCQkJCVwKIAkJCV9fZXJyID0gY2FybDkxNzBfZXhlY19jbWQoX19hciwJCQlcCiAJCQkJQ0FSTDkxNzBfQ01EX1dSRUcsIDggKiBfX25yZWcsCQlcCkBAIC0xNjAsNyArMTYwLDcgQEAKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgY2FybDkxNzBfYXN5bmNfcmVnd3JpdGVfZmluaXNoKCkgZG8gewkJCQlcCi1fX2FzeW5jX3JlZ3dyaXRlX291dCA6CQkJCQkJCVwKK19fYXN5bmNfcmVnd3JpdGVfb3V0OgkJCQkJCQlcCiAJaWYgKF9fY21kICE9IE5VTEwgJiYgX19lcnIgPT0gMCkJCQkJXAogCQljYXJsOTE3MF9hc3luY19yZWd3cml0ZV9mbHVzaCgpOwkJCVwKIAlrZnJlZShfX2NtZCk7CQkJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2RlYnVnLmMKaW5kZXggMGFjMTEyNC4uZGU1N2Y5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2RlYnVnLmMKQEAgLTY5NSw3ICs2OTUsNyBAQAogfQogX19ERUJVR0ZTX0RFQ0xBUkVfUldfRklMRShidWcsIDQwMCwgQ0FSTDkxNzBfU1RPUFBFRCk7CiAKLXN0YXRpYyBjb25zdCBjaGFyICplcnBfbW9kZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBlcnBfbW9kZXNbXSA9IHsKIAlbQ0FSTDkxNzBfRVJQX0lOVkFMSURdID0gIklOVkFMSUQiLAogCVtDQVJMOTE3MF9FUlBfQVVUT10gPSAiQXV0b21hdGljIiwKIAlbQ0FSTDkxNzBfRVJQX01BQzgwMjExXSA9ICJTZXQgYnkgTUFDODAyMTEiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2Z3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZncuYwppbmRleCAyMjE5NTdjLi4zOWRkZWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZncuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZncuYwpAQCAtMjM3LDcgKzIzNyw3IEBACiAJCWFyLT5kaXNhYmxlX29mZmxvYWQgPSB0cnVlOwogCX0KIAotCWlmIChTVVBQKENBUkw5MTcwRldfUFNNKSkKKwlpZiAoU1VQUChDQVJMOTE3MEZXX1BTTSkgJiYgU1VQUChDQVJMOTE3MEZXX0ZJWEVEXzVHSFpfUFNNKSkKIAkJYXItPmh3LT5mbGFncyB8PSBJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFM7CiAKIAlpZiAoIVNVUFAoQ0FSTDkxNzBGV19VU0JfSU5JVF9GSVJNV0FSRSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9md2NtZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2Z3Y21kLmgKaW5kZXggMzA0NDlkMi4uMGE2ZGVjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2Z3Y21kLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2Z3Y21kLmgKQEAgLTQsNyArNCw3IEBACiAgKiBGaXJtd2FyZSBjb21tYW5kIGludGVyZmFjZSBkZWZpbml0aW9ucwogICoKICAqIENvcHlyaWdodCAyMDA4LCBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgotICogQ29weXJpZ2h0IDIwMDksIDIwMTAsIENocmlzdGlhbiBMYW1wYXJ0ZXIgPGNodW5rZWV5QGdvb2dsZW1haWwuY29tPgorICogQ29weXJpZ2h0IDIwMDktMjAxMSBDaHJpc3RpYW4gTGFtcGFydGVyIDxjaHVua2VleUBnb29nbGVtYWlsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTU0LDYgKzU0LDcgQEAKIAlDQVJMOTE3MF9DTURfQkNOX0NUUkwJCT0gMHgwNSwKIAlDQVJMOTE3MF9DTURfUkVBRF9UU0YJCT0gMHgwNiwKIAlDQVJMOTE3MF9DTURfUlhfRklMVEVSCQk9IDB4MDcsCisJQ0FSTDkxNzBfQ01EX1dPTAkJPSAweDA4LAogCiAJLyogQ0FNICovCiAJQ0FSTDkxNzBfQ01EX0VLRVkJCT0gMHgxMCwKQEAgLTE4MCw2ICsxODEsMjEgQEAKICNkZWZpbmUgQ0FSTDkxNzBfQkNOX0NUUkxfRFJBSU4JMAogI2RlZmluZSBDQVJMOTE3MF9CQ05fQ1RSTF9DQUJfVFJJR0dFUgkxCiAKK3N0cnVjdCBjYXJsOTE3MF93b2xfY21kIHsKKwlfX2xlMzIJCWZsYWdzOworCXU4CQltYWNbNl07CisJdTgJCWJzc2lkWzZdOworCV9fbGUzMgkJbnVsbF9pbnRlcnZhbDsKKwlfX2xlMzIJCWZyZWVfZm9yX3VzZTI7CisJX19sZTMyCQltYXNrOworCXU4CQlwYXR0ZXJuWzMyXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQ0FSTDkxNzBfV09MX0NNRF9TSVpFCQk2MAorCisjZGVmaW5lIENBUkw5MTcwX1dPTF9ESVNDT05ORUNUCQkxCisjZGVmaW5lIENBUkw5MTcwX1dPTF9NQUdJQ19QS1QJCTIKKwogc3RydWN0IGNhcmw5MTcwX2NtZF9oZWFkIHsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CkBAIC0yMDMsNiArMjE5LDcgQEAKIAkJc3RydWN0IGNhcmw5MTcwX3dyaXRlX3JlZwl3cmVnOwogCQlzdHJ1Y3QgY2FybDkxNzBfcmZfaW5pdAkJcmZfaW5pdDsKIAkJc3RydWN0IGNhcmw5MTcwX3BzbQkJcHNtOworCQlzdHJ1Y3QgY2FybDkxNzBfd29sX2NtZAkJd29sOwogCQlzdHJ1Y3QgY2FybDkxNzBfYmNuX2N0cmxfY21kCWJjbl9jdHJsOwogCQlzdHJ1Y3QgY2FybDkxNzBfcnhfZmlsdGVyX2NtZAlyeF9maWx0ZXI7CiAJCXU4IGRhdGFbQ0FSTDkxNzBfTUFYX0NNRF9QQVlMT0FEX0xFTl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZndkZXNjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZndkZXNjLmgKaW5kZXggOTIxMDY2OC4uNmQ5YzA4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2Z3ZGVzYy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9md2Rlc2MuaApAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBGaXJtd2FyZSBkZXNjcmlwdG9yIGZvcm1hdAogICoKLSAqIENvcHlyaWdodCAyMDA5LCAyMDEwLCBDaHJpc3RpYW4gTGFtcGFydGVyIDxjaHVua2VleUBnb29nbGVtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAyMDA5LTIwMTEgQ2hyaXN0aWFuIExhbXBhcnRlciA8Y2h1bmtlZXlAZ29vZ2xlbWFpbC5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC03Miw2ICs3MiwxMiBAQAogCS8qIFdha2UgdXAgb24gV0xBTiAqLwogCUNBUkw5MTcwRldfV09MLAogCisJLyogRmlybXdhcmUgc3VwcG9ydHMgUFNNIGluIHRoZSA1R0haIEJhbmQgKi8KKwlDQVJMOTE3MEZXX0ZJWEVEXzVHSFpfUFNNLAorCisJLyogSFcgKEFOSSwgQ0NBLCBNSUIpIHRhbGx5IGNvdW50ZXJzICovCisJQ0FSTDkxNzBGV19IV19DT1VOVEVSUywKKwogCS8qIEtFRVAgTEFTVCAqLwogCV9fQ0FSTDkxNzBGV19GRUFUVVJFX05VTQogfTsKQEAgLTgyLDYgKzg4LDcgQEAKICNkZWZpbmUgREJHX01BR0lDCSJEQkdcMCIKICNkZWZpbmUgQ0hLX01BR0lDCSJDSEtcMCIKICNkZWZpbmUgVFhTUV9NQUdJQwkiVFhTUSIKKyNkZWZpbmUgV09MX01BR0lDCSJXT0xcMCIKICNkZWZpbmUgTEFTVF9NQUdJQwkiTEFTVCIKIAogI2RlZmluZSBDQVJMOTE3MEZXX1NFVF9EQVkoZCkgKCgoZCkgLSAxKSAlIDMxKQpAQCAtMTA0LDcgKzExMSw3IEBACiAJKHNpemVvZihzdHJ1Y3QgY2FybDkxNzBmd19kZXNjX2hlYWQpKQogCiAjZGVmaW5lIENBUkw5MTcwRldfT1RVU19ERVNDX01JTl9WRVIJCTYKLSNkZWZpbmUgQ0FSTDkxNzBGV19PVFVTX0RFU0NfQ1VSX1ZFUgkJNgorI2RlZmluZSBDQVJMOTE3MEZXX09UVVNfREVTQ19DVVJfVkVSCQk3CiBzdHJ1Y3QgY2FybDkxNzBmd19vdHVzX2Rlc2MgewogCXN0cnVjdCBjYXJsOTE3MGZ3X2Rlc2NfaGVhZCBoZWFkOwogCV9fbGUzMiBmZWF0dXJlX3NldDsKQEAgLTE4Niw2ICsxOTMsMTYgQEAKICNkZWZpbmUgQ0FSTDkxNzBGV19UWFNRX0RFU0NfU0laRQkJCVwKIAkoc2l6ZW9mKHN0cnVjdCBjYXJsOTE3MGZ3X3R4c3FfZGVzYykpCiAKKyNkZWZpbmUgQ0FSTDkxNzBGV19XT0xfREVTQ19NSU5fVkVSCQkJMQorI2RlZmluZSBDQVJMOTE3MEZXX1dPTF9ERVNDX0NVUl9WRVIJCQkxCitzdHJ1Y3QgY2FybDkxNzBmd193b2xfZGVzYyB7CisJc3RydWN0IGNhcmw5MTcwZndfZGVzY19oZWFkIGhlYWQ7CisKKwlfX2xlMzIgc3VwcG9ydGVkX3RyaWdnZXJzOwkvKiBDQVJMOTE3MF9XT0xfICovCit9IF9fcGFja2VkOworI2RlZmluZSBDQVJMOTE3MEZXX1dPTF9ERVNDX1NJWkUJCQlcCisJKHNpemVvZihzdHJ1Y3QgY2FybDkxNzBmd193b2xfZGVzYykpCisKICNkZWZpbmUgQ0FSTDkxNzBGV19MQVNUX0RFU0NfTUlOX1ZFUgkJCTEKICNkZWZpbmUgQ0FSTDkxNzBGV19MQVNUX0RFU0NfQ1VSX1ZFUgkJCTIKIHN0cnVjdCBjYXJsOTE3MGZ3X2xhc3RfZGVzYyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9ody5oCmluZGV4IDRlMzA3NjIuLmZhODM0YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9ody5oCkBAIC00LDcgKzQsNyBAQAogICogUmVnaXN0ZXIgbWFwLCBoYXJkd2FyZS1zcGVjaWZpYyBkZWZpbml0aW9ucwogICoKICAqIENvcHlyaWdodCAyMDA4LCBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgotICogQ29weXJpZ2h0IDIwMDksIDIwMTAsIENocmlzdGlhbiBMYW1wYXJ0ZXIgPGNodW5rZWV5QGdvb2dsZW1haWwuY29tPgorICogQ29weXJpZ2h0IDIwMDktMjAxMSBDaHJpc3RpYW4gTGFtcGFydGVyIDxjaHVua2VleUBnb29nbGVtYWlsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE3NCw2ICsxNzQsNyBAQAogI2RlZmluZQkJQVI5MTcwX01BQ19TTklGRkVSX0VOQUJMRV9QUk9NSVNDCUJJVCgwKQogI2RlZmluZQkJQVI5MTcwX01BQ19TTklGRkVSX0RFRkFVTFRTCQkweDAyMDAwMDAwCiAjZGVmaW5lCUFSOTE3MF9NQUNfUkVHX0VOQ1JZUFRJT04JCShBUjkxNzBfTUFDX1JFR19CQVNFICsgMHg2NzgpCisjZGVmaW5lCQlBUjkxNzBfTUFDX0VOQ1JZUFRJT05fTUdNVF9SWF9TT0ZUV0FSRQlCSVQoMikKICNkZWZpbmUJCUFSOTE3MF9NQUNfRU5DUllQVElPTl9SWF9TT0ZUV0FSRQlCSVQoMykKICNkZWZpbmUJCUFSOTE3MF9NQUNfRU5DUllQVElPTl9ERUZBVUxUUwkJMHg3MAogCkBAIC0yMjIsNiArMjIzLDEyIEBACiAjZGVmaW5lIEFSOTE3MF9NQUNfUkVHX1RYX0JMT0NLQUNLUwkJKEFSOTE3MF9NQUNfUkVHX0JBU0UgKyAweDZjMCkKICNkZWZpbmUgQVI5MTcwX01BQ19SRUdfTkFWX0NPVU5UCQkoQVI5MTcwX01BQ19SRUdfQkFTRSArIDB4NmM0KQogI2RlZmluZSBBUjkxNzBfTUFDX1JFR19CQUNLT0ZGX1NUQVRVUwkJKEFSOTE3MF9NQUNfUkVHX0JBU0UgKyAweDZjOCkKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkFDS09GRl9DQ0EJCQlCSVQoMjQpCisjZGVmaW5lCQlBUjkxNzBfTUFDX0JBQ0tPRkZfVFhfUEVYCQlCSVQoMjUpCisjZGVmaW5lCQlBUjkxNzBfTUFDX0JBQ0tPRkZfUlhfUEUJCUJJVCgyNikKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkFDS09GRl9NRF9SRUFEWQkJQklUKDI3KQorI2RlZmluZQkJQVI5MTcwX01BQ19CQUNLT0ZGX1RYX1BFCQlCSVQoMjgpCisKICNkZWZpbmUJQVI5MTcwX01BQ19SRUdfVFhfUkVUUlkJCQkoQVI5MTcwX01BQ19SRUdfQkFTRSArIDB4NmNjKQogCiAjZGVmaW5lIEFSOTE3MF9NQUNfUkVHX1RYX0NPTVBMRVRFCQkoQVI5MTcwX01BQ19SRUdfQkFTRSArIDB4NmQ0KQpAQCAtMzU3LDcgKzM2NCwxOCBAQAogCiAjZGVmaW5lIEFSOTE3MF9NQUNfUkVHX0RNQV9XTEFOX1NUQVRVUwkJKEFSOTE3MF9NQUNfUkVHX0JBU0UgKyAweGQzOCkKICNkZWZpbmUJQVI5MTcwX01BQ19SRUdfRE1BX1NUQVRVUwkJKEFSOTE3MF9NQUNfUkVHX0JBU0UgKyAweGQzYykKKyNkZWZpbmUgQVI5MTcwX01BQ19SRUdfRE1BX1RYUV9MQVNUX0FERFIJKEFSOTE3MF9NQUNfUkVHX0JBU0UgKyAweGQ0MCkKKyNkZWZpbmUJQVI5MTcwX01BQ19SRUdfRE1BX1RYUTBfTEFTVF9BRERSCShBUjkxNzBfTUFDX1JFR19CQVNFICsgMHhkNDApCisjZGVmaW5lCUFSOTE3MF9NQUNfUkVHX0RNQV9UWFExX0xBU1RfQUREUgkoQVI5MTcwX01BQ19SRUdfQkFTRSArIDB4ZDQ0KQorI2RlZmluZQlBUjkxNzBfTUFDX1JFR19ETUFfVFhRMl9MQVNUX0FERFIJKEFSOTE3MF9NQUNfUkVHX0JBU0UgKyAweGQ0OCkKKyNkZWZpbmUJQVI5MTcwX01BQ19SRUdfRE1BX1RYUTNfTEFTVF9BRERSCShBUjkxNzBfTUFDX1JFR19CQVNFICsgMHhkNGMpCisjZGVmaW5lCUFSOTE3MF9NQUNfUkVHX0RNQV9UWFE0X0xBU1RfQUREUgkoQVI5MTcwX01BQ19SRUdfQkFTRSArIDB4ZDUwKQorI2RlZmluZQlBUjkxNzBfTUFDX1JFR19ETUFfVFhRMFExX0xFTgkJKEFSOTE3MF9NQUNfUkVHX0JBU0UgKyAweGQ1NCkKKyNkZWZpbmUJQVI5MTcwX01BQ19SRUdfRE1BX1RYUTJRM19MRU4JCShBUjkxNzBfTUFDX1JFR19CQVNFICsgMHhkNTgpCisjZGVmaW5lCUFSOTE3MF9NQUNfUkVHX0RNQV9UWFE0X0xFTgkJKEFSOTE3MF9NQUNfUkVHX0JBU0UgKyAweGQ1YykKIAorI2RlZmluZSBBUjkxNzBfTUFDX1JFR19ETUFfVFhRWF9MQVNUX0FERFIJKEFSOTE3MF9NQUNfUkVHX0JBU0UgKyAweGQ3NCkKKyNkZWZpbmUgQVI5MTcwX01BQ19SRUdfRE1BX1RYUVhfRkFJTF9BRERSCShBUjkxNzBfTUFDX1JFR19CQVNFICsgMHhkNzgpCiAjZGVmaW5lCUFSOTE3MF9NQUNfUkVHX1RYUlhfTVBJCQkJKEFSOTE3MF9NQUNfUkVHX0JBU0UgKyAweGQ3YykKICNkZWZpbmUJCUFSOTE3MF9NQUNfVFhSWF9NUElfVFhfTVBJX01BU0sJCTB4MDAwMDAwMGYKICNkZWZpbmUJCUFSOTE3MF9NQUNfVFhSWF9NUElfVFhfVE9fTUFTSwkJMHgwMDAwZmZmMApAQCAtMzc3LDEwICszOTUsNDAgQEAKIAogI2RlZmluZSBBUjkxNzBfTUFDX1JFR19CQ05fQ1VSUl9BRERSCQkoQVI5MTcwX01BQ19SRUdfQkFTRSArIDB4ZDk4KQogI2RlZmluZQlBUjkxNzBfTUFDX1JFR19CQ05fQ09VTlQJCShBUjkxNzBfTUFDX1JFR19CQVNFICsgMHhkOWMpCi0KLQogI2RlZmluZQlBUjkxNzBfTUFDX1JFR19CQ05fSFQxCQkJKEFSOTE3MF9NQUNfUkVHX0JBU0UgKyAweGRhMCkKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMV9IVF9FTgkJQklUKDApCisjZGVmaW5lCQlBUjkxNzBfTUFDX0JDTl9IVDFfR0ZfUE1CCQlCSVQoMSkKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMV9TUF9FWFAJCUJJVCgyKQorI2RlZmluZQkJQVI5MTcwX01BQ19CQ05fSFQxX1RYX0JGCQlCSVQoMykKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMV9QV1JfQ1RSTF9TCQk0CisjZGVmaW5lCQlBUjkxNzBfTUFDX0JDTl9IVDFfUFdSX0NUUkwJCTB4NzAKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMV9UWF9BTlQxCQlCSVQoNykKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMV9UWF9BTlQwCQlCSVQoOCkKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMV9OVU1fTEZUX1MJCTkKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMV9OVU1fTEZUCQkweDYwMAorI2RlZmluZQkJQVI5MTcwX01BQ19CQ05fSFQxX0JXQ18yME1fRVhUCQlCSVQoMTYpCisjZGVmaW5lCQlBUjkxNzBfTUFDX0JDTl9IVDFfQldDXzQwTV9TSEFSRUQJQklUKDE3KQorI2RlZmluZQkJQVI5MTcwX01BQ19CQ05fSFQxX0JXQ180ME1fRFVQCQkoQklUKDE2KSB8IEJJVCgxNykpCisjZGVmaW5lCQlBUjkxNzBfTUFDX0JDTl9IVDFfQkZfTUNTX1MJCTE4CisjZGVmaW5lCQlBUjkxNzBfTUFDX0JDTl9IVDFfQkZfTUNTCQkweDFjMDAwMAorI2RlZmluZQkJQVI5MTcwX01BQ19CQ05fSFQxX1RQQ19TCQkyMQorI2RlZmluZQkJQVI5MTcwX01BQ19CQ05fSFQxX1RQQwkJCTB4N2UwMDAwMAorI2RlZmluZQkJQVI5MTcwX01BQ19CQ05fSFQxX0NIQUlOX01BU0tfUwkJMjcKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMV9DSEFJTl9NQVNLCQkweDM4MDAwMDAwCisKICNkZWZpbmUJQVI5MTcwX01BQ19SRUdfQkNOX0hUMgkJCShBUjkxNzBfTUFDX1JFR19CQVNFICsgMHhkYTQpCisjZGVmaW5lCQlBUjkxNzBfTUFDX0JDTl9IVDJfTUNTX1MJCTAKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMl9NQ1MJCQkweDdmCisjZGVmaW5lCQlBUjkxNzBfTUFDX0JDTl9IVDJfQlc0MAkJCUJJVCg4KQorI2RlZmluZQkJQVI5MTcwX01BQ19CQ05fSFQyX1NNT09USElORwkJQklUKDkpCisjZGVmaW5lCQlBUjkxNzBfTUFDX0JDTl9IVDJfU1MJCQlCSVQoMTApCisjZGVmaW5lCQlBUjkxNzBfTUFDX0JDTl9IVDJfTlNTCQkJQklUKDExKQorI2RlZmluZQkJQVI5MTcwX01BQ19CQ05fSFQyX1NUQkNfUwkJMTIKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMl9TVEJDCQkJMHgzMDAwCisjZGVmaW5lCQlBUjkxNzBfTUFDX0JDTl9IVDJfQURWX0NPRAkJQklUKDE0KQorI2RlZmluZQkJQVI5MTcwX01BQ19CQ05fSFQyX1NHSQkJCUJJVCgxNSkKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMl9MRU5fUwkJMTYKKyNkZWZpbmUJCUFSOTE3MF9NQUNfQkNOX0hUMl9MRU4JCQkweGZmZmYwMDAwCiAKICNkZWZpbmUJQVI5MTcwX01BQ19SRUdfRE1BX1RYUVhfQUREUl9DVVJSCShBUjkxNzBfTUFDX1JFR19CQVNFICsgMHhkYzApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9sZWQuYwppbmRleCA0YmIyY2JkLi43OGRhZGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2xlZC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAl9CiAKIAlpZiAobGlrZWx5KElTX0FDQ0VQVElOR19DTUQoYXIpICYmIGFybC0+dG9nZ2xlZCkpCi0JCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoYXItPmh3LCAmYXItPmxlZF93b3JrLCBIWi8xMCk7CisJCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoYXItPmh3LCAmYXItPmxlZF93b3JrLCBIWiAvIDEwKTsKIH0KIAogc3RhdGljIGludCBjYXJsOTE3MF9sZWRfcmVnaXN0ZXJfbGVkKHN0cnVjdCBhcjkxNzAgKmFyLCBpbnQgaSwgY2hhciAqbmFtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9tYWMuYwppbmRleCAzODVjZjUwLi5kZmRhOTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL21hYy5jCkBAIC00NTUsMTM1ICs0NTUsNiBAQAogCXJldHVybiBjYXJsOTE3MF9yZWd3cml0ZV9yZXN1bHQoKTsKIH0KIAotaW50IGNhcmw5MTcwX3VwZGF0ZV9iZWFjb24oc3RydWN0IGFyOTE3MCAqYXIsIGNvbnN0IGJvb2wgc3VibWl0KQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXN0cnVjdCBjYXJsOTE3MF92aWZfaW5mbyAqY3ZpZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aW5mbzsKLQlfX2xlMzIgKmRhdGEsICpvbGQgPSBOVUxMOwotCXUzMiB3b3JkLCBvZmYsIGFkZHIsIGxlbjsKLQlpbnQgaSA9IDAsIGVyciA9IDA7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JY3ZpZiA9IHJjdV9kZXJlZmVyZW5jZShhci0+YmVhY29uX2l0ZXIpOwotcmV0cnk6Ci0JaWYgKGFyLT52aWZzID09IDAgfHwgIWN2aWYpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmN1KGN2aWYsICZhci0+dmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGN2aWYtPmFjdGl2ZSAmJiBjdmlmLT5lbmFibGVfYmVhY29uKQotCQkJZ290byBmb3VuZDsKLQl9Ci0KLQlpZiAoIWFyLT5iZWFjb25fZW5hYmxlZCB8fCBpKyspCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCWdvdG8gcmV0cnk7Ci0KLWZvdW5kOgotCXJjdV9hc3NpZ25fcG9pbnRlcihhci0+YmVhY29uX2l0ZXIsIGN2aWYpOwotCi0Jc2tiID0gaWVlZTgwMjExX2JlYWNvbl9nZXRfdGltKGFyLT5odywgY2FybDkxNzBfZ2V0X3ZpZihjdmlmKSwKLQkJTlVMTCwgTlVMTCk7Ci0KLQlpZiAoIXNrYikgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9mcmVlOwotCX0KLQotCXR4aW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQlpZiAodHhpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykgewotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9mcmVlOwotCX0KLQotCXNwaW5fbG9ja19iaCgmYXItPmJlYWNvbl9sb2NrKTsKLQlkYXRhID0gKF9fbGUzMiAqKXNrYi0+ZGF0YTsKLQlpZiAoY3ZpZi0+YmVhY29uKQotCQlvbGQgPSAoX19sZTMyICopY3ZpZi0+YmVhY29uLT5kYXRhOwotCi0Jb2ZmID0gY3ZpZi0+aWQgKiBBUjkxNzBfTUFDX0JDTl9MRU5HVEhfTUFYOwotCWFkZHIgPSBhci0+ZncuYmVhY29uX2FkZHIgKyBvZmY7Ci0JbGVuID0gcm91bmR1cChza2ItPmxlbiArIEZDU19MRU4sIDQpOwotCi0JaWYgKChvZmYgKyBsZW4pID4gYXItPmZ3LmJlYWNvbl9tYXhfbGVuKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCXdpcGh5X2Vycihhci0+aHctPndpcGh5LCAiYmVhY29uIGRvZXMgbm90ICIKLQkJCQkgICJmaXQgaW50byBkZXZpY2UgbWVtb3J5IVxuIik7Ci0JCX0KLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBlcnJfdW5sb2NrOwotCX0KLQotCWlmIChsZW4gPiBBUjkxNzBfTUFDX0JDTl9MRU5HVEhfTUFYKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCXdpcGh5X2Vycihhci0+aHctPndpcGh5LCAibm8gc3VwcG9ydCBmb3IgYmVhY29ucyAiCi0JCQkJImJpZ2dlciB0aGFuICVkICh5b3VyczolZCkuXG4iLAotCQkJCSBBUjkxNzBfTUFDX0JDTl9MRU5HVEhfTUFYLCBsZW4pOwotCQl9Ci0KLQkJZXJyID0gLUVNU0dTSVpFOwotCQlnb3RvIGVycl91bmxvY2s7Ci0JfQotCi0JaSA9IHR4aW5mby0+Y29udHJvbC5yYXRlc1swXS5pZHg7Ci0JaWYgKHR4aW5mby0+YmFuZCAhPSBJRUVFODAyMTFfQkFORF8yR0haKQotCQlpICs9IDQ7Ci0KLQl3b3JkID0gX19jYXJsOTE3MF9yYXRldGFibGVbaV0uaHdfdmFsdWUgJiAweGY7Ci0JaWYgKGkgPCA0KQotCQl3b3JkIHw9ICgoc2tiLT5sZW4gKyBGQ1NfTEVOKSA8PCAoMyArIDE2KSkgKyAweDA0MDA7Ci0JZWxzZQotCQl3b3JkIHw9ICgoc2tiLT5sZW4gKyBGQ1NfTEVOKSA8PCAxNikgKyAweDAwMTA7Ci0KLQljYXJsOTE3MF9hc3luY19yZWd3cml0ZV9iZWdpbihhcik7Ci0JY2FybDkxNzBfYXN5bmNfcmVnd3JpdGUoQVI5MTcwX01BQ19SRUdfQkNOX1BMQ1AsIHdvcmQpOwotCi0JZm9yIChpID0gMDsgaSA8IERJVl9ST1VORF9VUChza2ItPmxlbiwgNCk7IGkrKykgewotCQkvKgotCQkgKiBYWFg6IFRoaXMgYWNjZXNzZXMgYmV5b25kIHNrYiBkYXRhIGZvciB1cAotCQkgKgl0byB0aGUgbGFzdCAzIGJ5dGVzISEKLQkJICovCi0KLQkJaWYgKG9sZCAmJiAoZGF0YVtpXSA9PSBvbGRbaV0pKQotCQkJY29udGludWU7Ci0KLQkJd29yZCA9IGxlMzJfdG9fY3B1KGRhdGFbaV0pOwotCQljYXJsOTE3MF9hc3luY19yZWd3cml0ZShhZGRyICsgNCAqIGksIHdvcmQpOwotCX0KLQljYXJsOTE3MF9hc3luY19yZWd3cml0ZV9maW5pc2goKTsKLQotCWRldl9rZnJlZV9za2JfYW55KGN2aWYtPmJlYWNvbik7Ci0JY3ZpZi0+YmVhY29uID0gTlVMTDsKLQotCWVyciA9IGNhcmw5MTcwX2FzeW5jX3JlZ3dyaXRlX3Jlc3VsdCgpOwotCWlmICghZXJyKQotCQljdmlmLT5iZWFjb24gPSBza2I7Ci0Jc3Bpbl91bmxvY2tfYmgoJmFyLT5iZWFjb25fbG9jayk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfZnJlZTsKLQotCWlmIChzdWJtaXQpIHsKLQkJZXJyID0gY2FybDkxNzBfYmNuX2N0cmwoYXIsIGN2aWYtPmlkLAotCQkJCQlDQVJMOTE3MF9CQ05fQ1RSTF9DQUJfVFJJR0dFUiwKLQkJCQkJYWRkciwgc2tiLT5sZW4gKyBGQ1NfTEVOKTsKLQotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfZnJlZTsKLQl9Ci1vdXRfdW5sb2NrOgotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiAwOwotCi1lcnJfdW5sb2NrOgotCXNwaW5fdW5sb2NrX2JoKCZhci0+YmVhY29uX2xvY2spOwotCi1lcnJfZnJlZToKLQlyY3VfcmVhZF91bmxvY2soKTsKLQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCXJldHVybiBlcnI7Ci19Ci0KIGludCBjYXJsOTE3MF91cGxvYWRfa2V5KHN0cnVjdCBhcjkxNzAgKmFyLCBjb25zdCB1OCBpZCwgY29uc3QgdTggKm1hYywKIAkJCWNvbnN0IHU4IGt0eXBlLCBjb25zdCB1OCBrZXlpZHgsIGNvbnN0IHU4ICprZXlkYXRhLAogCQkJY29uc3QgaW50IGtleWxlbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvbWFpbi5jCmluZGV4IDU0ZDA5M2MuLjAxMjI5MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL21haW4uYwpAQCAtMzQ1LDExICszNDUsMTEgQEAKIAljYXJsOTE3MF96YXBfcXVldWVzKGFyKTsKIAogCS8qIHJlc2V0IFFvUyBkZWZhdWx0cyAqLwotCUNBUkw5MTcwX0ZJTExfUVVFVUUoYXItPmVkY2ZbMF0sIDMsIDE1LCAxMDIzLCAgMCk7IC8qIEJFU1QgRUZGT1JUICovCi0JQ0FSTDkxNzBfRklMTF9RVUVVRShhci0+ZWRjZlsxXSwgMiwgNywgICAgMTUsIDk0KTsgLyogVklERU8gKi8KLQlDQVJMOTE3MF9GSUxMX1FVRVVFKGFyLT5lZGNmWzJdLCAyLCAzLCAgICAgNywgNDcpOyAvKiBWT0lDRSAqLwotCUNBUkw5MTcwX0ZJTExfUVVFVUUoYXItPmVkY2ZbM10sIDcsIDE1LCAxMDIzLCAgMCk7IC8qIEJBQ0tHUk9VTkQgKi8KLQlDQVJMOTE3MF9GSUxMX1FVRVVFKGFyLT5lZGNmWzRdLCAyLCAzLCAgICAgNywgIDApOyAvKiBTUEVDSUFMICovCisJQ0FSTDkxNzBfRklMTF9RVUVVRShhci0+ZWRjZltBUjkxNzBfVFhRX1ZPXSwgMiwgMywgICAgIDcsIDQ3KTsKKwlDQVJMOTE3MF9GSUxMX1FVRVVFKGFyLT5lZGNmW0FSOTE3MF9UWFFfVkldLCAyLCA3LCAgICAxNSwgOTQpOworCUNBUkw5MTcwX0ZJTExfUVVFVUUoYXItPmVkY2ZbQVI5MTcwX1RYUV9CRV0sIDMsIDE1LCAxMDIzLCAgMCk7CisJQ0FSTDkxNzBfRklMTF9RVUVVRShhci0+ZWRjZltBUjkxNzBfVFhRX0JLXSwgNywgMTUsIDEwMjMsICAwKTsKKwlDQVJMOTE3MF9GSUxMX1FVRVVFKGFyLT5lZGNmW0FSOTE3MF9UWFFfU1BFQ0lBTF0sIDIsIDMsIDcsIDApOwogCiAJYXItPmN1cnJlbnRfZmFjdG9yID0gYXItPmN1cnJlbnRfZGVuc2l0eSA9IC0xOwogCS8qICJUaGUgZmlyc3Qga2V5IGlzIHVuaXF1ZS4iICovCkBAIC0xNDg0LDYgKzE0ODQsMTMgQEAKIAl9CiB9CiAKK3N0YXRpYyBib29sIGNhcmw5MTcwX3R4X2ZyYW1lc19wZW5kaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBhcjkxNzAgKmFyID0gaHctPnByaXY7CisKKwlyZXR1cm4gISFhdG9taWNfcmVhZCgmYXItPnR4X3RvdGFsX3F1ZXVlZCk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyBjYXJsOTE3MF9vcHMgPSB7CiAJLnN0YXJ0CQkJPSBjYXJsOTE3MF9vcF9zdGFydCwKIAkuc3RvcAkJCT0gY2FybDkxNzBfb3Bfc3RvcCwKQEAgLTE1MDQsNiArMTUxMSw3IEBACiAJLmdldF9zdXJ2ZXkJCT0gY2FybDkxNzBfb3BfZ2V0X3N1cnZleSwKIAkuZ2V0X3N0YXRzCQk9IGNhcmw5MTcwX29wX2dldF9zdGF0cywKIAkuYW1wZHVfYWN0aW9uCQk9IGNhcmw5MTcwX29wX2FtcGR1X2FjdGlvbiwKKwkudHhfZnJhbWVzX3BlbmRpbmcJPSBjYXJsOTE3MF90eF9mcmFtZXNfcGVuZGluZywKIH07CiAKIHZvaWQgKmNhcmw5MTcwX2FsbG9jKHNpemVfdCBwcml2X3NpemUpCkBAIC0xNTc3LDYgKzE1ODUsNyBAQAogCQkgICAgIElFRUU4MDIxMV9IV19SRVBPUlRTX1RYX0FDS19TVEFUVVMgfAogCQkgICAgIElFRUU4MDIxMV9IV19TVVBQT1JUU19QUyB8CiAJCSAgICAgSUVFRTgwMjExX0hXX1BTX05VTExGVU5DX1NUQUNLIHwKKwkJICAgICBJRUVFODAyMTFfSFdfTkVFRF9EVElNX1BFUklPRCB8CiAJCSAgICAgSUVFRTgwMjExX0hXX1NJR05BTF9EQk07CiAKIAlpZiAoIW1vZHBhcmFtX25vaHQpIHsKQEAgLTE2MjEsNyArMTYzMCw3IEBACiAJQlVJTERfQlVHX09OKHNpemVvZihhci0+ZWVwcm9tKSAlIFJCKTsKICNlbmRpZgogCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZihhci0+ZWVwcm9tKS9SQjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihhci0+ZWVwcm9tKSAvIFJCOyBpKyspIHsKIAkJZm9yIChqID0gMDsgaiA8IFJXOyBqKyspCiAJCQlvZmZzZXRzW2pdID0gY3B1X3RvX2xlMzIoQVI5MTcwX0VFUFJPTV9TVEFSVCArCiAJCQkJCQkgUkIgKiBpICsgNCAqIGopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3BoeS5jCmluZGV4IGI2YWUwZTEuLmFhMTQ3YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvcGh5LmMKQEAgLTEwOTgsNyArMTA5OCw3IEBACiAJICoJSXNuJ3QgaXQganVzdCBESVZfUk9VTkRfVVAoeSwgMTw8U0hJRlQpPwogCSAqCUNhbiB3ZSByZWx5IG9uIHRoZSBjb21waWxlciB0byBvcHRpbWlzZSBhd2F5IHRoZSBkaXY/CiAJICovCi0JcmV0dXJuICh5ID4+IFNISUZUKSArICgoeSAmICgxPDwoU0hJRlQtMSkpKSA+PiAoU0hJRlQgLSAxKSk7CisJcmV0dXJuICh5ID4+IFNISUZUKSArICgoeSAmICgxIDw8IChTSElGVCAtIDEpKSkgPj4gKFNISUZUIC0gMSkpOwogI3VuZGVmIFNISUZUCiB9CiAKQEAgLTEzNzksNyArMTM3OSw3IEBACiAKIAkJCW1vZGVzW2ldLm1heF9wb3dlciA9CiAJCQkJY2FybDkxNzBfZ2V0X21heF9lZGdlX3Bvd2VyKGFyLAotCQkJCQlmcmVxK2Zfb2ZmLCBFREdFUyhjdGxfaWR4LCAxKSk7CisJCQkJCWZyZXEgKyBmX29mZiwgRURHRVMoY3RsX2lkeCwgMSkpOwogCiAJCQkvKgogCQkJICogVE9ETzogY2hlY2sgaWYgdGhlIHJlZ3VsYXRvcnkgbWF4LiBwb3dlciBpcwpAQCAtMTQ0MSw3ICsxNDQxLDcgQEAKIAlpZiAoZnJlcSA8IDMwMDApCiAJCWYgPSBmcmVxIC0gMjMwMDsKIAllbHNlCi0JCWYgPSAoZnJlcSAtIDQ4MDApLzU7CisJCWYgPSAoZnJlcSAtIDQ4MDApIC8gNTsKIAogCS8qCiAJICogY3ljbGUgdGhyb3VnaCB0aGUgdmFyaW91cyBtb2RlcwpAQCAtMTc4MywxMiArMTc4Myw2IEBACiAJCX0KIAl9CiAKLQkvKiBGSVhNRTogUFNNIGRvZXMgbm90IHdvcmsgaW4gNUdIeiBCYW5kICovCi0JaWYgKGNoYW5uZWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJYXItPnBzLm9mZl9vdmVycmlkZSB8PSBQU19PRkZfNUdIWjsKLQllbHNlCi0JCWFyLT5wcy5vZmZfb3ZlcnJpZGUgJj0gflBTX09GRl81R0haOwotCiAJYXItPmNoYW5uZWwgPSBjaGFubmVsOwogCWFyLT5odF9zZXR0aW5ncyA9IG5ld19odDsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3J4LmMKaW5kZXggZWMyMWVhOS4uZGM5OTAzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3J4LmMKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCQl1OCAqcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKIAkJcmVzZXJ2ZWQgKz0gTkVUX0lQX0FMSUdOOwogCi0JCWlmICgqcWMgJiBJRUVFODAyMTFfUU9TX0NPTlRST0xfQV9NU0RVX1BSRVNFTlQpCisJCWlmICgqcWMgJiBJRUVFODAyMTFfUU9TX0NUTF9BX01TRFVfUFJFU0VOVCkKIAkJCXJlc2VydmVkICs9IE5FVF9JUF9BTElHTjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3R4LmMKaW5kZXggZTk0MDg0Zi4uZDIwOTQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3R4LmMKQEAgLTY2MSwxMSArNjYxLDY3IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBjYXJsOTE3MF90eF9yYXRlX3RwY19jaGFpbnMoc3RydWN0IGFyOTE3MCAqYXIsCisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnR4cmF0ZSwKKwl1bnNpZ25lZCBpbnQgKnBoeXJhdGUsIHVuc2lnbmVkIGludCAqdHBjLCB1bnNpZ25lZCBpbnQgKmNoYWlucykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGUgPSBOVUxMOworCXU4ICp0eHBvd2VyOworCXVuc2lnbmVkIGludCBpZHg7CisKKwlpZHggPSB0eHJhdGUtPmlkeDsKKwkqdHBjID0gMDsKKwkqcGh5cmF0ZSA9IDA7CisKKwlpZiAodHhyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHsKKwkJaWYgKHR4cmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIKSB7CisJCQkvKiArMSBkQm0gZm9yIEhUNDAgKi8KKwkJCSp0cGMgKz0gMjsKKworCQkJaWYgKGluZm8tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKKwkJCQl0eHBvd2VyID0gYXItPnBvd2VyXzJHX2h0NDA7CisJCQllbHNlCisJCQkJdHhwb3dlciA9IGFyLT5wb3dlcl81R19odDQwOworCQl9IGVsc2UgeworCQkJaWYgKGluZm8tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKKwkJCQl0eHBvd2VyID0gYXItPnBvd2VyXzJHX2h0MjA7CisJCQllbHNlCisJCQkJdHhwb3dlciA9IGFyLT5wb3dlcl81R19odDIwOworCQl9CisKKwkJKnBoeXJhdGUgPSB0eHJhdGUtPmlkeDsKKwkJKnRwYyArPSB0eHBvd2VyW2lkeCAmIDddOworCX0gZWxzZSB7CisJCWlmIChpbmZvLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKKwkJCWlmIChpZHggPCA0KQorCQkJCXR4cG93ZXIgPSBhci0+cG93ZXJfMkdfY2NrOworCQkJZWxzZQorCQkJCXR4cG93ZXIgPSBhci0+cG93ZXJfMkdfb2ZkbTsKKwkJfSBlbHNlIHsKKwkJCXR4cG93ZXIgPSBhci0+cG93ZXJfNUdfbGVnOworCQkJaWR4ICs9IDQ7CisJCX0KKworCQlyYXRlID0gJl9fY2FybDkxNzBfcmF0ZXRhYmxlW2lkeF07CisJCSp0cGMgKz0gdHhwb3dlclsocmF0ZS0+aHdfdmFsdWUgJiAweDMwKSA+PiA0XTsKKwkJKnBoeXJhdGUgPSByYXRlLT5od192YWx1ZSAmIDB4ZjsKKwl9CisKKwlpZiAoYXItPmVlcHJvbS50eF9tYXNrID09IDEpIHsKKwkJKmNoYWlucyA9IEFSOTE3MF9UWF9QSFlfVFhDSEFJTl8xOworCX0gZWxzZSB7CisJCWlmICghKHR4cmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKSAmJgorCQkgICAgcmF0ZSAmJiByYXRlLT5iaXRyYXRlID49IDM2MCkKKwkJCSpjaGFpbnMgPSBBUjkxNzBfVFhfUEhZX1RYQ0hBSU5fMTsKKwkJZWxzZQorCQkJKmNoYWlucyA9IEFSOTE3MF9UWF9QSFlfVFhDSEFJTl8yOworCX0KK30KKwogc3RhdGljIF9fbGUzMiBjYXJsOTE3MF90eF9waHlzZXQoc3RydWN0IGFyOTE3MCAqYXIsCiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnR4cmF0ZSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGUgPSBOVUxMOwotCXUzMiBwb3dlciwgY2hhaW5zOworCXVuc2lnbmVkIGludCBwb3dlciA9IDAsIGNoYWlucyA9IDAsIHBoeXJhdGUgPSAwOwogCV9fbGUzMiB0bXA7CiAKIAl0bXAgPSBjcHVfdG9fbGUzMigwKTsKQEAgLTY4MiwzNSArNzM4LDEyIEBACiAJCXRtcCB8PSBjcHVfdG9fbGUzMihBUjkxNzBfVFhfUEhZX1NIT1JUX0dJKTsKIAogCWlmICh0eHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykgewotCQl1MzIgciA9IHR4cmF0ZS0+aWR4OwotCQl1OCAqdHhwb3dlcjsKKwkJU0VUX1ZBTChBUjkxNzBfVFhfUEhZX01DUywgcGh5cmF0ZSwgdHhyYXRlLT5pZHgpOwogCiAJCS8qIGhlYXZ5IGNsaXAgY29udHJvbCAqLwotCQl0bXAgfD0gY3B1X3RvX2xlMzIoKHIgJiAweDcpIDw8CisJCXRtcCB8PSBjcHVfdG9fbGUzMigodHhyYXRlLT5pZHggJiAweDcpIDw8CiAJCQlBUjkxNzBfVFhfUEhZX1RYX0hFQVZZX0NMSVBfUyk7CiAKLQkJaWYgKHR4cmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIKSB7Ci0JCQlpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJCXR4cG93ZXIgPSBhci0+cG93ZXJfNUdfaHQ0MDsKLQkJCWVsc2UKLQkJCQl0eHBvd2VyID0gYXItPnBvd2VyXzJHX2h0NDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJCXR4cG93ZXIgPSBhci0+cG93ZXJfNUdfaHQyMDsKLQkJCWVsc2UKLQkJCQl0eHBvd2VyID0gYXItPnBvd2VyXzJHX2h0MjA7Ci0JCX0KLQotCQlwb3dlciA9IHR4cG93ZXJbciAmIDddOwotCi0JCS8qICsxIGRCbSBmb3IgSFQ0MCAqLwotCQlpZiAodHhyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEgpCi0JCQlwb3dlciArPSAyOwotCi0JCXIgPDw9IEFSOTE3MF9UWF9QSFlfTUNTX1M7Ci0JCUJVR19PTihyICYgfkFSOTE3MF9UWF9QSFlfTUNTKTsKLQotCQl0bXAgfD0gY3B1X3RvX2xlMzIociAmIEFSOTE3MF9UWF9QSFlfTUNTKTsKIAkJdG1wIHw9IGNwdV90b19sZTMyKEFSOTE3MF9UWF9QSFlfTU9EX0hUKTsKIAogCQkvKgpAQCAtNzIwLDM0ICs3NTMsMTUgQEAKIAkJICogdG1wIHw9IGNwdV90b19sZTMyKEFSOTE3MF9UWF9QSFlfR1JFRU5GSUVMRCk7CiAJCSAqLwogCX0gZWxzZSB7Ci0JCXU4ICp0eHBvd2VyOwotCQl1MzIgbW9kOwotCQl1MzIgcGh5cmF0ZTsKLQkJdTggaWR4ID0gdHhyYXRlLT5pZHg7Ci0KLQkJaWYgKGluZm8tPmJhbmQgIT0gSUVFRTgwMjExX0JBTkRfMkdIWikgewotCQkJaWR4ICs9IDQ7Ci0JCQl0eHBvd2VyID0gYXItPnBvd2VyXzVHX2xlZzsKLQkJCW1vZCA9IEFSOTE3MF9UWF9QSFlfTU9EX09GRE07CisJCWlmIChpbmZvLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKKwkJCWlmICh0eHJhdGUtPmlkeCA8PSBBUjkxNzBfVFhfUEhZX1JBVEVfQ0NLXzExTSkKKwkJCQl0bXAgfD0gY3B1X3RvX2xlMzIoQVI5MTcwX1RYX1BIWV9NT0RfQ0NLKTsKKwkJCWVsc2UKKwkJCQl0bXAgfD0gY3B1X3RvX2xlMzIoQVI5MTcwX1RYX1BIWV9NT0RfT0ZETSk7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoaWR4IDwgNCkgewotCQkJCXR4cG93ZXIgPSBhci0+cG93ZXJfMkdfY2NrOwotCQkJCW1vZCA9IEFSOTE3MF9UWF9QSFlfTU9EX0NDSzsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kID0gQVI5MTcwX1RYX1BIWV9NT0RfT0ZETTsKLQkJCQl0eHBvd2VyID0gYXItPnBvd2VyXzJHX29mZG07Ci0JCQl9CisJCQl0bXAgfD0gY3B1X3RvX2xlMzIoQVI5MTcwX1RYX1BIWV9NT0RfT0ZETSk7CiAJCX0KIAotCQlyYXRlID0gJl9fY2FybDkxNzBfcmF0ZXRhYmxlW2lkeF07Ci0KLQkJcGh5cmF0ZSA9IHJhdGUtPmh3X3ZhbHVlICYgMHhGOwotCQlwb3dlciA9IHR4cG93ZXJbKHJhdGUtPmh3X3ZhbHVlICYgMHgzMCkgPj4gNF07Ci0JCXBoeXJhdGUgPDw9IEFSOTE3MF9UWF9QSFlfTUNTX1M7Ci0KLQkJdG1wIHw9IGNwdV90b19sZTMyKG1vZCk7Ci0JCXRtcCB8PSBjcHVfdG9fbGUzMihwaHlyYXRlKTsKLQogCQkvKgogCQkgKiBzaG9ydCBwcmVhbWJsZSBzZWVtcyB0byBiZSBicm9rZW4gdG9vLgogCQkgKgpAQCAtNzU1LDIzICs3NjksMTIgQEAKIAkJICoJdG1wIHw9IGNwdV90b19sZTMyKEFSOTE3MF9UWF9QSFlfU0hPUlRfUFJFQU1CTEUpOwogCQkgKi8KIAl9Ci0JcG93ZXIgPDw9IEFSOTE3MF9UWF9QSFlfVFhfUFdSX1M7Ci0JcG93ZXIgJj0gQVI5MTcwX1RYX1BIWV9UWF9QV1I7Ci0JdG1wIHw9IGNwdV90b19sZTMyKHBvd2VyKTsKKwljYXJsOTE3MF90eF9yYXRlX3RwY19jaGFpbnMoYXIsIGluZm8sIHR4cmF0ZSwKKwkJCQkgICAgJnBoeXJhdGUsICZwb3dlciwgJmNoYWlucyk7CiAKLQkvKiBzZXQgVFggY2hhaW5zICovCi0JaWYgKGFyLT5lZXByb20udHhfbWFzayA9PSAxKSB7Ci0JCWNoYWlucyA9IEFSOTE3MF9UWF9QSFlfVFhDSEFJTl8xOwotCX0gZWxzZSB7Ci0JCWNoYWlucyA9IEFSOTE3MF9UWF9QSFlfVFhDSEFJTl8yOwotCi0JCS8qID49IDM2TSBsZWdhY3kgT0ZETSAtIHVzZSBvbmx5IG9uZSBjaGFpbiAqLwotCQlpZiAocmF0ZSAmJiByYXRlLT5iaXRyYXRlID49IDM2MCAmJgotCQkgICAgISh0eHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykpCi0JCQljaGFpbnMgPSBBUjkxNzBfVFhfUEhZX1RYQ0hBSU5fMTsKLQl9Ci0JdG1wIHw9IGNwdV90b19sZTMyKGNoYWlucyA8PCBBUjkxNzBfVFhfUEhZX1RYQ0hBSU5fUyk7Ci0KKwl0bXAgfD0gY3B1X3RvX2xlMzIoU0VUX0NPTlNUVkFMKEFSOTE3MF9UWF9QSFlfTUNTLCBwaHlyYXRlKSk7CisJdG1wIHw9IGNwdV90b19sZTMyKFNFVF9DT05TVFZBTChBUjkxNzBfVFhfUEhZX1RYX1BXUiwgcG93ZXIpKTsKKwl0bXAgfD0gY3B1X3RvX2xlMzIoU0VUX0NPTlNUVkFMKEFSOTE3MF9UWF9QSFlfVFhDSEFJTiwgY2hhaW5zKSk7CiAJcmV0dXJuIHRtcDsKIH0KIApAQCAtMTQzOCwzICsxNDQxLDE1NCBAQAogCWlmIChhci0+dHhfc2NoZWR1bGUpCiAJCWNhcmw5MTcwX3R4KGFyKTsKIH0KKworaW50IGNhcmw5MTcwX3VwZGF0ZV9iZWFjb24oc3RydWN0IGFyOTE3MCAqYXIsIGNvbnN0IGJvb2wgc3VibWl0KQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBjYXJsOTE3MF92aWZfaW5mbyAqY3ZpZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnJhdGU7CisJX19sZTMyICpkYXRhLCAqb2xkID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgcGxjcCwgcG93ZXIsIGNoYWluczsKKwl1MzIgd29yZCwgaHQxLCBvZmYsIGFkZHIsIGxlbjsKKwlpbnQgaSA9IDAsIGVyciA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJY3ZpZiA9IHJjdV9kZXJlZmVyZW5jZShhci0+YmVhY29uX2l0ZXIpOworcmV0cnk6CisJaWYgKGFyLT52aWZzID09IDAgfHwgIWN2aWYpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmN1KGN2aWYsICZhci0+dmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN2aWYtPmFjdGl2ZSAmJiBjdmlmLT5lbmFibGVfYmVhY29uKQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlpZiAoIWFyLT5iZWFjb25fZW5hYmxlZCB8fCBpKyspCisJCWdvdG8gb3V0X3VubG9jazsKKworCWdvdG8gcmV0cnk7CisKK2ZvdW5kOgorCXJjdV9hc3NpZ25fcG9pbnRlcihhci0+YmVhY29uX2l0ZXIsIGN2aWYpOworCisJc2tiID0gaWVlZTgwMjExX2JlYWNvbl9nZXRfdGltKGFyLT5odywgY2FybDkxNzBfZ2V0X3ZpZihjdmlmKSwKKwkJTlVMTCwgTlVMTCk7CisKKwlpZiAoIXNrYikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXR4aW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzcGluX2xvY2tfYmgoJmFyLT5iZWFjb25fbG9jayk7CisJZGF0YSA9IChfX2xlMzIgKilza2ItPmRhdGE7CisJaWYgKGN2aWYtPmJlYWNvbikKKwkJb2xkID0gKF9fbGUzMiAqKWN2aWYtPmJlYWNvbi0+ZGF0YTsKKworCW9mZiA9IGN2aWYtPmlkICogQVI5MTcwX01BQ19CQ05fTEVOR1RIX01BWDsKKwlhZGRyID0gYXItPmZ3LmJlYWNvbl9hZGRyICsgb2ZmOworCWxlbiA9IHJvdW5kdXAoc2tiLT5sZW4gKyBGQ1NfTEVOLCA0KTsKKworCWlmICgob2ZmICsgbGVuKSA+IGFyLT5mdy5iZWFjb25fbWF4X2xlbikgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQl3aXBoeV9lcnIoYXItPmh3LT53aXBoeSwgImJlYWNvbiBkb2VzIG5vdCAiCisJCQkJICAiZml0IGludG8gZGV2aWNlIG1lbW9yeSFcbiIpOworCQl9CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3VubG9jazsKKwl9CisKKwlpZiAobGVuID4gQVI5MTcwX01BQ19CQ05fTEVOR1RIX01BWCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQl3aXBoeV9lcnIoYXItPmh3LT53aXBoeSwgIm5vIHN1cHBvcnQgZm9yIGJlYWNvbnMgIgorCQkJCSJiaWdnZXIgdGhhbiAlZCAoeW91cnM6JWQpLlxuIiwKKwkJCQkgQVI5MTcwX01BQ19CQ05fTEVOR1RIX01BWCwgbGVuKTsKKwkJfQorCisJCWVyciA9IC1FTVNHU0laRTsKKwkJZ290byBlcnJfdW5sb2NrOworCX0KKworCWh0MSA9IEFSOTE3MF9NQUNfQkNOX0hUMV9UWF9BTlQwOworCXJhdGUgPSAmdHhpbmZvLT5jb250cm9sLnJhdGVzWzBdOworCWNhcmw5MTcwX3R4X3JhdGVfdHBjX2NoYWlucyhhciwgdHhpbmZvLCByYXRlLCAmcGxjcCwgJnBvd2VyLCAmY2hhaW5zKTsKKwlpZiAoISh0eGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKSkgeworCQlpZiAocGxjcCA8PSBBUjkxNzBfVFhfUEhZX1JBVEVfQ0NLXzExTSkKKwkJCXBsY3AgfD0gKChza2ItPmxlbiArIEZDU19MRU4pIDw8ICgzICsgMTYpKSArIDB4MDQwMDsKKwkJZWxzZQorCQkJcGxjcCB8PSAoKHNrYi0+bGVuICsgRkNTX0xFTikgPDwgMTYpICsgMHgwMDEwOworCX0gZWxzZSB7CisJCWh0MSB8PSBBUjkxNzBfTUFDX0JDTl9IVDFfSFRfRU47CisJCWlmIChyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSkKKwkJCXBsY3AgfD0gQVI5MTcwX01BQ19CQ05fSFQyX1NHSTsKKworCQlpZiAocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIKSB7CisJCQlodDEgfD0gQVI5MTcwX01BQ19CQ05fSFQxX0JXQ180ME1fU0hBUkVEOworCQkJcGxjcCB8PSBBUjkxNzBfTUFDX0JDTl9IVDJfQlc0MDsKKwkJfQorCQlpZiAocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfRFVQX0RBVEEpIHsKKwkJCWh0MSB8PSBBUjkxNzBfTUFDX0JDTl9IVDFfQldDXzQwTV9EVVA7CisJCQlwbGNwIHw9IEFSOTE3MF9NQUNfQkNOX0hUMl9CVzQwOworCQl9CisKKwkJU0VUX1ZBTChBUjkxNzBfTUFDX0JDTl9IVDJfTEVOLCBwbGNwLCBza2ItPmxlbiArIEZDU19MRU4pOworCX0KKworCVNFVF9WQUwoQVI5MTcwX01BQ19CQ05fSFQxX1BXUl9DVFJMLCBodDEsIDcpOworCVNFVF9WQUwoQVI5MTcwX01BQ19CQ05fSFQxX1RQQywgaHQxLCBwb3dlcik7CisJU0VUX1ZBTChBUjkxNzBfTUFDX0JDTl9IVDFfQ0hBSU5fTUFTSywgaHQxLCBjaGFpbnMpOworCWlmIChjaGFpbnMgPT0gQVI5MTcwX1RYX1BIWV9UWENIQUlOXzIpCisJCWh0MSB8PSBBUjkxNzBfTUFDX0JDTl9IVDFfVFhfQU5UMTsKKworCWNhcmw5MTcwX2FzeW5jX3JlZ3dyaXRlX2JlZ2luKGFyKTsKKwljYXJsOTE3MF9hc3luY19yZWd3cml0ZShBUjkxNzBfTUFDX1JFR19CQ05fSFQxLCBodDEpOworCWlmICghKHR4aW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpKQorCQljYXJsOTE3MF9hc3luY19yZWd3cml0ZShBUjkxNzBfTUFDX1JFR19CQ05fUExDUCwgcGxjcCk7CisJZWxzZQorCQljYXJsOTE3MF9hc3luY19yZWd3cml0ZShBUjkxNzBfTUFDX1JFR19CQ05fSFQyLCBwbGNwKTsKKworCWZvciAoaSA9IDA7IGkgPCBESVZfUk9VTkRfVVAoc2tiLT5sZW4sIDQpOyBpKyspIHsKKwkJLyoKKwkJICogWFhYOiBUaGlzIGFjY2Vzc2VzIGJleW9uZCBza2IgZGF0YSBmb3IgdXAKKwkJICoJdG8gdGhlIGxhc3QgMyBieXRlcyEhCisJCSAqLworCisJCWlmIChvbGQgJiYgKGRhdGFbaV0gPT0gb2xkW2ldKSkKKwkJCWNvbnRpbnVlOworCisJCXdvcmQgPSBsZTMyX3RvX2NwdShkYXRhW2ldKTsKKwkJY2FybDkxNzBfYXN5bmNfcmVnd3JpdGUoYWRkciArIDQgKiBpLCB3b3JkKTsKKwl9CisJY2FybDkxNzBfYXN5bmNfcmVnd3JpdGVfZmluaXNoKCk7CisKKwlkZXZfa2ZyZWVfc2tiX2FueShjdmlmLT5iZWFjb24pOworCWN2aWYtPmJlYWNvbiA9IE5VTEw7CisKKwllcnIgPSBjYXJsOTE3MF9hc3luY19yZWd3cml0ZV9yZXN1bHQoKTsKKwlpZiAoIWVycikKKwkJY3ZpZi0+YmVhY29uID0gc2tiOworCXNwaW5fdW5sb2NrX2JoKCZhci0+YmVhY29uX2xvY2spOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwlpZiAoc3VibWl0KSB7CisJCWVyciA9IGNhcmw5MTcwX2Jjbl9jdHJsKGFyLCBjdmlmLT5pZCwKKwkJCQkJQ0FSTDkxNzBfQkNOX0NUUkxfQ0FCX1RSSUdHRVIsCisJCQkJCWFkZHIsIHNrYi0+bGVuICsgRkNTX0xFTik7CisKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX2ZyZWU7CisJfQorb3V0X3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gMDsKKworZXJyX3VubG9jazoKKwlzcGluX3VubG9ja19iaCgmYXItPmJlYWNvbl9sb2NrKTsKKworZXJyX2ZyZWU6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3VzYi5jCmluZGV4IDJmYjUzZDAuLjMzM2I2OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdXNiLmMKQEAgLTExMiw2ICsxMTIsOCBAQAogCXsgVVNCX0RFVklDRSgweDA0YmIsIDB4MDkzZikgfSwKIAkvKiBORUMgV0wzMDBOVS1HICovCiAJeyBVU0JfREVWSUNFKDB4MDQwOSwgMHgwMjQ5KSB9LAorCS8qIE5FQyBXTDMwME5VLUFHICovCisJeyBVU0JfREVWSUNFKDB4MDQwOSwgMHgwMmI0KSB9LAogCS8qIEFWTSBGUklUWiFXTEFOIFVTQiBTdGljayBOICovCiAJeyBVU0JfREVWSUNFKDB4MDU3YywgMHg4NDAxKSB9LAogCS8qIEFWTSBGUklUWiFXTEFOIFVTQiBTdGljayBOIDIuNCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3ZlcnNpb24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC92ZXJzaW9uLmgKaW5kZXggMTUwOTVjMC4uNjQ3MDM3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3ZlcnNpb24uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdmVyc2lvbi5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX0NBUkw5MTcwX1NIQVJFRF9WRVJTSU9OX0gKICNkZWZpbmUgX19DQVJMOTE3MF9TSEFSRURfVkVSU0lPTl9ICiAjZGVmaW5lIENBUkw5MTcwRldfVkVSU0lPTl9ZRUFSIDExCi0jZGVmaW5lIENBUkw5MTcwRldfVkVSU0lPTl9NT05USCAxCi0jZGVmaW5lIENBUkw5MTcwRldfVkVSU0lPTl9EQVkgMjIKLSNkZWZpbmUgQ0FSTDkxNzBGV19WRVJTSU9OX0dJVCAiMS45LjIiCisjZGVmaW5lIENBUkw5MTcwRldfVkVSU0lPTl9NT05USCA2CisjZGVmaW5lIENBUkw5MTcwRldfVkVSU0lPTl9EQVkgMzAKKyNkZWZpbmUgQ0FSTDkxNzBGV19WRVJTSU9OX0dJVCAiMS45LjQiCiAjZW5kaWYgLyogX19DQVJMOTE3MF9TSEFSRURfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvd2xhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3dsYW4uaAppbmRleCA5ZTEzMjRiLi5lYTE3OTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvd2xhbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC93bGFuLmgKQEAgLTQsNyArNCw3IEBACiAgKiBSWC9UWCBtZXRhIGRlc2NyaXB0b3IgZm9ybWF0CiAgKgogICogQ29weXJpZ2h0IDIwMDgsIEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+Ci0gKiBDb3B5cmlnaHQgMjAwOSwgMjAxMCwgQ2hyaXN0aWFuIExhbXBhcnRlciA8Y2h1bmtlZXlAZ29vZ2xlbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgMjAwOS0yMDExIENocmlzdGlhbiBMYW1wYXJ0ZXIgPGNodW5rZWV5QGdvb2dsZW1haWwuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjc4LDcgKzI3OCw3IEBACiBzdHJ1Y3QgY2FybDkxNzBfdHhfc3VwZXJmcmFtZSB7CiAJc3RydWN0IGNhcmw5MTcwX3R4X3N1cGVyZGVzYyBzOwogCXN0cnVjdCBhcjkxNzBfdHhfZnJhbWUgZjsKLX0gX19wYWNrZWQ7Cit9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAogI2VuZGlmIC8qIF9fQ0FSTDkxNzBGV19fICovCiAKQEAgLTMyOCw3ICszMjgsNyBAQAogCXN0cnVjdCBfY2FybDkxNzBfdHhfc3VwZXJkZXNjIHM7CiAJc3RydWN0IF9hcjkxNzBfdHhfaHdkZXNjIGY7CiAJdTggZnJhbWVfZGF0YVswXTsKLX0gX19wYWNrZWQ7Cit9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAogI2RlZmluZQlDQVJMOTE3MF9UWF9TVVBFUkRFU0NfTEVOCQkyNAogI2RlZmluZQlBUjkxNzBfVFhfSFdERVNDX0xFTgkJCTgKQEAgLTQwNCwxNiArNDA0LDYgQEAKIAkgICAgICAgKHQtPkRBaWR4ICYgMHhjMCkgPj4gNjsKIH0KIAotZW51bSBhcjkxNzBfdHhxIHsKLQlBUjkxNzBfVFhRX0JFLAotCi0JQVI5MTcwX1RYUV9WSSwKLQlBUjkxNzBfVFhRX1ZPLAotCUFSOTE3MF9UWFFfQkssCi0KLQlfX0FSOTE3MF9OVU1fVFhRLAotfTsKLQogLyoKICAqIFRoaXMgaXMgYW4gd29ya2Fyb3VuZCBmb3Igc2V2ZXJhbCB1bmRvY3VtZW50ZWQgYnVncy4KICAqIERvbid0IG1lc3Mgd2l0aCB0aGUgUW9TL0FDIDwtPiBIVyBRdWV1ZSBtYXAsIGlmIHlvdSBkb24ndApAQCAtNDMxLDcgKzQyMSwxNCBAQAogICogcmVzdWx0LCB0aGlzIG1ha2VzIHRoZSBkZXZpY2UgcHJldHR5IG11Y2ggdXNlbGVzcwogICogZm9yIGFueSBzZXJpb3VzIDgwMi4xMW4gc2V0dXAuCiAgKi8KLXN0YXRpYyBjb25zdCB1OCBhcjkxNzBfcW1hcFtfX0FSOTE3MF9OVU1fVFhRXSA9IHsgMiwgMSwgMCwgMyB9OworZW51bSBhcjkxNzBfdHhxIHsKKwlBUjkxNzBfVFhRX0JLID0gMCwJLyogVFhRMCAqLworCUFSOTE3MF9UWFFfQkUsCQkvKiBUWFExCSovCisJQVI5MTcwX1RYUV9WSSwJCS8qIFRYUTIJKi8KKwlBUjkxNzBfVFhRX1ZPLAkJLyogVFhRMyAqLworCisJX19BUjkxNzBfTlVNX1RYUSwKK307CiAKICNkZWZpbmUJQVI5MTcwX1RYUV9ERVBUSAkJCTMyCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9rZXkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9rZXkuYwppbmRleCBhNjFlZjNkNi4uMTdiMGVmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2tleS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9rZXkuYwpAQCAtMTA1LDExICsxMDUsOCBAQAogCQlpZiAobWFjWzBdICYgMHgwMSkKIAkJCXVuaWNhc3RfZmxhZyA9IDA7CiAKLQkJbWFjSGkgPSAobWFjWzVdIDw8IDgpIHwgbWFjWzRdOwotCQltYWNMbyA9IChtYWNbM10gPDwgMjQpIHwKLQkJCShtYWNbMl0gPDwgMTYpIHwKLQkJCShtYWNbMV0gPDwgOCkgfAotCQkJbWFjWzBdOworCQltYWNMbyA9IGdldF91bmFsaWduZWRfbGUzMihtYWMpOworCQltYWNIaSA9IGdldF91bmFsaWduZWRfbGUxNihtYWMgKyA0KTsKIAkJbWFjTG8gPj49IDE7CiAJCW1hY0xvIHw9IChtYWNIaSAmIDEpIDw8IDMxOwogCQltYWNIaSA+Pj0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCmluZGV4IDM5YTExZTguLjdlNDVjYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwpAQCAtNDAsNiArNDAsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9LY29uZmlnCmluZGV4IDQ4MDU5NWYuLmQyMjkzZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9LY29uZmlnCkBAIC0yNiw2ICsyNiwxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGJlIGJ1aWx0IGFzIGEgbW9kdWxlIChyZWNvbW1lbmRlZCkgdGhhdCB3aWxsIGJlIGNhbGxlZCAiYjQzIi4KIAkgIElmIHVuc3VyZSwgc2F5IE0uCiAKK2NvbmZpZyBCNDNfQkNNQQorCWJvb2wgIlN1cHBvcnQgZm9yIEJDTUEgYnVzIgorCWRlcGVuZHMgb24gQjQzICYmIEJDTUEgJiYgQlJPS0VOCisJZGVmYXVsdCB5CisKK2NvbmZpZyBCNDNfU1NCCisJYm9vbAorCWRlcGVuZHMgb24gQjQzICYmIFNTQgorCWRlZmF1bHQgeQorCiAjIEF1dG8tc2VsZWN0IFNTQiBQQ0ktSE9TVCBzdXBwb3J0LCBpZiBwb3NzaWJsZQogY29uZmlnIEI0M19QQ0lfQVVUT1NFTEVDVAogCWJvb2wKQEAgLTgwLDYgKzkwLDEyIEBACiAKICNEYXRhIHRyYW5zZmVycyB0byB0aGUgZGV2aWNlIHZpYSBQSU8uIFdlIHdhbnQgaXQgYXMgYSBmYWxsYmFjayBldmVuCiAjIGlmIHdlIGNhbiBkbyBETUEuCitjb25maWcgQjQzX0JDTUFfUElPCisJYm9vbAorCWRlcGVuZHMgb24gQjQzX0JDTUEKKwlzZWxlY3QgQkNNQV9CTE9DS0lPCisJZGVmYXVsdCB5CisKIGNvbmZpZyBCNDNfUElPCiAJYm9vbAogCWRlcGVuZHMgb24gQjQzCkBAIC0xMDcsNiArMTIzLDIyIEBACiAJICBhbmQgZW1iZWRkZWQgZGV2aWNlcy4gSXQgc3VwcG9ydHMgODAyLjExYS9nCiAJICAoODAyLjExYSBzdXBwb3J0IGlzIG9wdGlvbmFsLCBhbmQgY3VycmVudGx5IGRpc2FibGVkKS4KIAorY29uZmlnIEI0M19QSFlfSFQKKwlib29sICJTdXBwb3J0IGZvciBIVC1QSFkgZGV2aWNlcyAoQlJPS0VOKSIKKwlkZXBlbmRzIG9uIEI0MyAmJiBCUk9LRU4KKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgSFQtUEhZLgorCisJICBTYXkgTiwgdGhpcyBpcyBCUk9LRU4gYW5kIGNyYXNoZXMgZHJpdmVyLgorCitjb25maWcgQjQzX1BIWV9MQ04KKwlib29sICJTdXBwb3J0IGZvciBMQ04tUEhZIGRldmljZXMgKEJST0tFTikiCisJZGVwZW5kcyBvbiBCNDMgJiYgQlJPS0VOCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgdGhlIExDTi1QSFkuCisKKwkgIFNheSBOLCB0aGlzIGlzIEJST0tFTiBhbmQgY3Jhc2hlcyBkcml2ZXIuCisKICMgVGhpcyBjb25maWcgb3B0aW9uIGF1dG9tYXRpY2FsbHkgZW5hYmxlcyBiNDMgTEVEUyBzdXBwb3J0LAogIyBpZiBpdCdzIHBvc3NpYmxlLgogY29uZmlnIEI0M19MRURTCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvTWFrZWZpbGUKaW5kZXggY2VmMzM0YS4uNDY0OGJiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKIGI0My15CQkJCSs9IG1haW4ubworYjQzLXkJCQkJKz0gYnVzLm8KIGI0My15CQkJCSs9IHRhYmxlcy5vCiBiNDMtJChDT05GSUdfQjQzX1BIWV9OKQkJKz0gdGFibGVzX25waHkubwogYjQzLSQoQ09ORklHX0I0M19QSFlfTikJCSs9IHJhZGlvXzIwNTUubwpAQCAtOSw2ICsxMCwxMCBAQAogYjQzLSQoQ09ORklHX0I0M19QSFlfTikJCSs9IHBoeV9uLm8KIGI0My0kKENPTkZJR19CNDNfUEhZX0xQKQkrPSBwaHlfbHAubwogYjQzLSQoQ09ORklHX0I0M19QSFlfTFApCSs9IHRhYmxlc19scHBoeS5vCitiNDMtJChDT05GSUdfQjQzX1BIWV9IVCkJKz0gcGh5X2h0Lm8KK2I0My0kKENPTkZJR19CNDNfUEhZX0hUKQkrPSB0YWJsZXNfcGh5X2h0Lm8KK2I0My0kKENPTkZJR19CNDNfUEhZX0hUKQkrPSByYWRpb18yMDU5Lm8KK2I0My0kKENPTkZJR19CNDNfUEhZX0xDTikJKz0gcGh5X2xjbi5vIHRhYmxlc19waHlfbGNuLm8KIGI0My15CQkJCSs9IHN5c2ZzLm8KIGI0My15CQkJCSs9IHhtaXQubwogYjQzLXkJCQkJKz0gbG8ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oCmluZGV4IDI1YTc4Y2YuLmM4MThiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9iNDMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYjQzLmgKQEAgLTUsMTIgKzUsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2h3X3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjbWEvYmNtYS5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2IuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KIAogI2luY2x1ZGUgImRlYnVnZnMuaCIKICNpbmNsdWRlICJsZWRzLmgiCiAjaW5jbHVkZSAicmZraWxsLmgiCisjaW5jbHVkZSAiYnVzLmgiCiAjaW5jbHVkZSAibG8uaCIKICNpbmNsdWRlICJwaHlfY29tbW9uLmgiCiAKQEAgLTkwLDYgKzkyLDggQEAKICNkZWZpbmUgQjQzX01NSU9fUElPMTFfQkFTRTQJCTB4MzAwCiAjZGVmaW5lIEI0M19NTUlPX1BJTzExX0JBU0U1CQkweDM0MAogCisjZGVmaW5lIEI0M19NTUlPX1JBRElPMjRfQ09OVFJPTAkweDNEOAkvKiBjb3JlIHJldiA+PSAyNCBvbmx5ICovCisjZGVmaW5lIEI0M19NTUlPX1JBRElPMjRfREFUQQkJMHgzREEJLyogY29yZSByZXYgPj0gMjQgb25seSAqLwogI2RlZmluZSBCNDNfTU1JT19QSFlfVkVSCQkweDNFMAogI2RlZmluZSBCNDNfTU1JT19QSFlfUkFESU8JCTB4M0UyCiAjZGVmaW5lIEI0M19NTUlPX1BIWTAJCQkweDNFNgpAQCAtMzYxLDYgKzM2NSwxMCBAQAogI2RlZmluZSBCNDNfUEhZVFlQRV9HCQkJMHgwMgogI2RlZmluZSBCNDNfUEhZVFlQRV9OCQkJMHgwNAogI2RlZmluZSBCNDNfUEhZVFlQRV9MUAkJCTB4MDUKKyNkZWZpbmUgQjQzX1BIWVRZUEVfU1NMUE4JCTB4MDYKKyNkZWZpbmUgQjQzX1BIWVRZUEVfSFQJCQkweDA3CisjZGVmaW5lIEI0M19QSFlUWVBFX0xDTgkJCTB4MDgKKyNkZWZpbmUgQjQzX1BIWVRZUEVfTENOWE4JCTB4MDkKIAogLyogUEhZUmVnaXN0ZXJzICovCiAjZGVmaW5lIEI0M19QSFlfSUxUX0FfQ1RSTAkJMHgwMDcyCkBAIC00MTQsNiArNDIyLDIzIEBACiAjZGVmaW5lIEI0M19NQUNDTURfQ0NBCQkJMHgwMDAwMDAwOAkvKiBDbGVhciBjaGFubmVsIGFzc2Vzc21lbnQgKi8KICNkZWZpbmUgQjQzX01BQ0NNRF9CR05PSVNFCQkweDAwMDAwMDEwCS8qIEJhY2tncm91bmQgbm9pc2UgKi8KIAorLyogQkNNQSA4MDIuMTEgY29yZSBzcGVjaWZpYyBJTyBDb250cm9sIChCQ01BX0lPQ1RMKSBmbGFncyAqLworI2RlZmluZSBCNDNfQkNNQV9JT0NUTF9QSFlfQ0xLRU4JMHgwMDAwMDAwNAkvKiBQSFkgQ2xvY2sgRW5hYmxlICovCisjZGVmaW5lIEI0M19CQ01BX0lPQ1RMX1BIWV9SRVNFVAkweDAwMDAwMDA4CS8qIFBIWSBSZXNldCAqLworI2RlZmluZSBCNDNfQkNNQV9JT0NUTF9NQUNQSFlDTEtFTgkweDAwMDAwMDEwCS8qIE1BQyBQSFkgQ2xvY2sgQ29udHJvbCBFbmFibGUgKi8KKyNkZWZpbmUgQjQzX0JDTUFfSU9DVExfUExMUkVGU0VMCTB4MDAwMDAwMjAJLyogUExMIEZyZXF1ZW5jeSBSZWZlcmVuY2UgU2VsZWN0ICovCisjZGVmaW5lIEI0M19CQ01BX0lPQ1RMX1BIWV9CVwkJMHgwMDAwMDBDMAkvKiBQSFkgYmFuZCB3aWR0aCBhbmQgY2xvY2sgc3BlZWQgbWFzayAoTi1QSFkrIG9ubHk/KSAqLworI2RlZmluZSAgQjQzX0JDTUFfSU9DVExfUEhZX0JXXzEwTUhaCTB4MDAwMDAwMDAJLyogMTAgTUh6IGJhbmR3aWR0aCwgNDAgTUh6IFBIWSAqLworI2RlZmluZSAgQjQzX0JDTUFfSU9DVExfUEhZX0JXXzIwTUhaCTB4MDAwMDAwNDAJLyogMjAgTUh6IGJhbmR3aWR0aCwgODAgTUh6IFBIWSAqLworI2RlZmluZSAgQjQzX0JDTUFfSU9DVExfUEhZX0JXXzQwTUhaCTB4MDAwMDAwODAJLyogNDAgTUh6IGJhbmR3aWR0aCwgMTYwIE1IeiBQSFkgKi8KKyNkZWZpbmUgQjQzX0JDTUFfSU9DVExfR01PREUJCTB4MDAwMDIwMDAJLyogRyBNb2RlIEVuYWJsZSAqLworCisvKiBCQ01BIDgwMi4xMSBjb3JlIHNwZWNpZmljIElPIHN0YXR1cyAoQkNNQV9JT1NUKSBmbGFncyAqLworI2RlZmluZSBCNDNfQkNNQV9JT1NUXzJHX1BIWQkJMHgwMDAwMDAwMQkvKiAyLjRHIGNhcGFibGUgcGh5ICovCisjZGVmaW5lIEI0M19CQ01BX0lPU1RfNUdfUEhZCQkweDAwMDAwMDAyCS8qIDVHIGNhcGFibGUgcGh5ICovCisjZGVmaW5lIEI0M19CQ01BX0lPU1RfRkFTVENMS0EJCTB4MDAwMDAwMDQJLyogRmFzdCBDbG9jayBBdmFpbGFibGUgKi8KKyNkZWZpbmUgQjQzX0JDTUFfSU9TVF9EVUFMQl9QSFkJCTB4MDAwMDAwMDgJLyogRHVhbGJhbmQgcGh5ICovCisKIC8qIDgwMi4xMSBjb3JlIHNwZWNpZmljIFRNIFN0YXRlIExvdyAoU1NCX1RNU0xPVykgZmxhZ3MgKi8KICNkZWZpbmUgQjQzX1RNU0xPV19HTU9ERQkJMHgyMDAwMDAwMAkvKiBHIE1vZGUgRW5hYmxlICovCiAjZGVmaW5lIEI0M19UTVNMT1dfUEhZX0JBTkRXSURUSAkweDAwQzAwMDAwCS8qIFBIWSBiYW5kIHdpZHRoIGFuZCBjbG9jayBzcGVlZCBtYXNrIChOLVBIWSBvbmx5KSAqLwpAQCAtNTY5LDYgKzU5NCw3IEBACiAJc3RydWN0IGI0M19kbWFyaW5nICpyeF9yaW5nOwogCiAJdTMyIHRyYW5zbGF0aW9uOyAvKiBSb3V0aW5nIGJpdHMgKi8KKwlib29sIHBhcml0eTsgLyogQ2hlY2sgZm9yIHBhcml0eSAqLwogfTsKIAogc3RydWN0IGI0M19waW9fdHhxdWV1ZTsKQEAgLTcwNyw3ICs3MzMsNyBAQAogCiAvKiBEYXRhIHN0cnVjdHVyZSBmb3Igb25lIHdpcmVsZXNzIGRldmljZSAoODAyLjExIGNvcmUpICovCiBzdHJ1Y3QgYjQzX3dsZGV2IHsKLQlzdHJ1Y3Qgc3NiX2RldmljZSAqc2RldjsKKwlzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldjsKIAlzdHJ1Y3QgYjQzX3dsICp3bDsKIAogCS8qIFRoZSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gc3RhdHVzLgpAQCAtODc5LDM2ICs5MDUsNTkgQEAKIAlyZXR1cm4gd2wtPmh3LT5jb25mLmNoYW5uZWwtPmJhbmQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGI0M19idXNfbWF5X3Bvd2VyZG93bihzdHJ1Y3QgYjQzX3dsZGV2ICp3bGRldikKK3sKKwlyZXR1cm4gd2xkZXYtPmRldi0+YnVzX21heV9wb3dlcmRvd24od2xkZXYtPmRldik7Cit9CitzdGF0aWMgaW5saW5lIGludCBiNDNfYnVzX3Bvd2VydXAoc3RydWN0IGI0M193bGRldiAqd2xkZXYsIGJvb2wgZHluYW1pY19wY3RsKQoreworCXJldHVybiB3bGRldi0+ZGV2LT5idXNfcG93ZXJ1cCh3bGRldi0+ZGV2LCBkeW5hbWljX3BjdGwpOworfQorc3RhdGljIGlubGluZSBpbnQgYjQzX2RldmljZV9pc19lbmFibGVkKHN0cnVjdCBiNDNfd2xkZXYgKndsZGV2KQoreworCXJldHVybiB3bGRldi0+ZGV2LT5kZXZpY2VfaXNfZW5hYmxlZCh3bGRldi0+ZGV2KTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBiNDNfZGV2aWNlX2VuYWJsZShzdHJ1Y3QgYjQzX3dsZGV2ICp3bGRldiwKKwkJCQkgICAgIHUzMiBjb3JlX3NwZWNpZmljX2ZsYWdzKQoreworCXdsZGV2LT5kZXYtPmRldmljZV9lbmFibGUod2xkZXYtPmRldiwgY29yZV9zcGVjaWZpY19mbGFncyk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYjQzX2RldmljZV9kaXNhYmxlKHN0cnVjdCBiNDNfd2xkZXYgKndsZGV2LAorCQkJCSAgICAgIHUzMiBjb3JlX3NwZWNpZmljX2ZsYWdzKQoreworCXdsZGV2LT5kZXYtPmRldmljZV9kaXNhYmxlKHdsZGV2LT5kZXYsIGNvcmVfc3BlY2lmaWNfZmxhZ3MpOworfQorCiBzdGF0aWMgaW5saW5lIHUxNiBiNDNfcmVhZDE2KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCkKIHsKLQlyZXR1cm4gc3NiX3JlYWQxNihkZXYtPnNkZXYsIG9mZnNldCk7CisJcmV0dXJuIGRldi0+ZGV2LT5yZWFkMTYoZGV2LT5kZXYsIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBiNDNfd3JpdGUxNihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiB2YWx1ZSkKIHsKLQlzc2Jfd3JpdGUxNihkZXYtPnNkZXYsIG9mZnNldCwgdmFsdWUpOworCWRldi0+ZGV2LT53cml0ZTE2KGRldi0+ZGV2LCBvZmZzZXQsIHZhbHVlKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgYjQzX3JlYWQzMihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQpCiB7Ci0JcmV0dXJuIHNzYl9yZWFkMzIoZGV2LT5zZGV2LCBvZmZzZXQpOworCXJldHVybiBkZXYtPmRldi0+cmVhZDMyKGRldi0+ZGV2LCBvZmZzZXQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYjQzX3dyaXRlMzIoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MzIgdmFsdWUpCiB7Ci0Jc3NiX3dyaXRlMzIoZGV2LT5zZGV2LCBvZmZzZXQsIHZhbHVlKTsKKwlkZXYtPmRldi0+d3JpdGUzMihkZXYtPmRldiwgb2Zmc2V0LCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBiNDNfYmxvY2tfcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHZvaWQgKmJ1ZmZlciwKIAkJCQkgc2l6ZV90IGNvdW50LCB1MTYgb2Zmc2V0LCB1OCByZWdfd2lkdGgpCiB7Ci0Jc3NiX2Jsb2NrX3JlYWQoZGV2LT5zZGV2LCBidWZmZXIsIGNvdW50LCBvZmZzZXQsIHJlZ193aWR0aCk7CisJZGV2LT5kZXYtPmJsb2NrX3JlYWQoZGV2LT5kZXYsIGJ1ZmZlciwgY291bnQsIG9mZnNldCwgcmVnX3dpZHRoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGI0M19ibG9ja193cml0ZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKIAkJCQkgICBzaXplX3QgY291bnQsIHUxNiBvZmZzZXQsIHU4IHJlZ193aWR0aCkKIHsKLQlzc2JfYmxvY2tfd3JpdGUoZGV2LT5zZGV2LCBidWZmZXIsIGNvdW50LCBvZmZzZXQsIHJlZ193aWR0aCk7CisJZGV2LT5kZXYtPmJsb2NrX3dyaXRlKGRldi0+ZGV2LCBidWZmZXIsIGNvdW50LCBvZmZzZXQsIHJlZ193aWR0aCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBiNDNfdXNpbmdfcGlvX3RyYW5zZmVycyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYnVzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjM2Y2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9idXMuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKworICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCisgIEJ1cyBhYnN0cmFjdGlvbiBsYXllcgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0ZWV0LCBGaWZ0aCBGbG9vciwKKyAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyovCisKKyNpbmNsdWRlICJiNDMuaCIKKyNpbmNsdWRlICJidXMuaCIKKworLyogQkNNQSAqLworI2lmZGVmIENPTkZJR19CNDNfQkNNQQorc3RhdGljIGludCBiNDNfYnVzX2JjbWFfYnVzX21heV9wb3dlcmRvd24oc3RydWN0IGI0M19idXNfZGV2ICpkZXYpCit7CisJcmV0dXJuIDA7IC8qIGJjbWFfYnVzX21heV9wb3dlcmRvd24oZGV2LT5iZGV2LT5idXMpOyAqLworfQorc3RhdGljIGludCBiNDNfYnVzX2JjbWFfYnVzX3Bvd2VydXAoc3RydWN0IGI0M19idXNfZGV2ICpkZXYsCisJCQkJCSAgYm9vbCBkeW5hbWljX3BjdGwpCit7CisJcmV0dXJuIDA7IC8qIGJjbWFfYnVzX3Bvd2VydXAoZGV2LT5zZGV2LT5idXMsIGR5bmFtaWNfcGN0bCk7ICovCit9CitzdGF0aWMgaW50IGI0M19idXNfYmNtYV9kZXZpY2VfaXNfZW5hYmxlZChzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldikKK3sKKwlyZXR1cm4gYmNtYV9jb3JlX2lzX2VuYWJsZWQoZGV2LT5iZGV2KTsKK30KK3N0YXRpYyB2b2lkIGI0M19idXNfYmNtYV9kZXZpY2VfZW5hYmxlKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LAorCQkJCQkgICAgIHUzMiBjb3JlX3NwZWNpZmljX2ZsYWdzKQoreworCWJjbWFfY29yZV9lbmFibGUoZGV2LT5iZGV2LCBjb3JlX3NwZWNpZmljX2ZsYWdzKTsKK30KK3N0YXRpYyB2b2lkIGI0M19idXNfYmNtYV9kZXZpY2VfZGlzYWJsZShzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldiwKKwkJCQkJICAgICAgdTMyIGNvcmVfc3BlY2lmaWNfZmxhZ3MpCit7CisJYmNtYV9jb3JlX2Rpc2FibGUoZGV2LT5iZGV2LCBjb3JlX3NwZWNpZmljX2ZsYWdzKTsKK30KK3N0YXRpYyB1MTYgYjQzX2J1c19iY21hX3JlYWQxNihzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldiwgdTE2IG9mZnNldCkKK3sKKwlyZXR1cm4gYmNtYV9yZWFkMTYoZGV2LT5iZGV2LCBvZmZzZXQpOworfQorc3RhdGljIHUzMiBiNDNfYnVzX2JjbWFfcmVhZDMyKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LCB1MTYgb2Zmc2V0KQoreworCXJldHVybiBiY21hX3JlYWQzMihkZXYtPmJkZXYsIG9mZnNldCk7Cit9CitzdGF0aWMKK3ZvaWQgYjQzX2J1c19iY21hX3dyaXRlMTYoc3RydWN0IGI0M19idXNfZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiB2YWx1ZSkKK3sKKwliY21hX3dyaXRlMTYoZGV2LT5iZGV2LCBvZmZzZXQsIHZhbHVlKTsKK30KK3N0YXRpYwordm9pZCBiNDNfYnVzX2JjbWFfd3JpdGUzMihzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldiwgdTE2IG9mZnNldCwgdTMyIHZhbHVlKQoreworCWJjbWFfd3JpdGUzMihkZXYtPmJkZXYsIG9mZnNldCwgdmFsdWUpOworfQorc3RhdGljCit2b2lkIGI0M19idXNfYmNtYV9ibG9ja19yZWFkKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LCB2b2lkICpidWZmZXIsCisJCQkgICAgIHNpemVfdCBjb3VudCwgdTE2IG9mZnNldCwgdTggcmVnX3dpZHRoKQoreworCWJjbWFfYmxvY2tfcmVhZChkZXYtPmJkZXYsIGJ1ZmZlciwgY291bnQsIG9mZnNldCwgcmVnX3dpZHRoKTsKK30KK3N0YXRpYwordm9pZCBiNDNfYnVzX2JjbWFfYmxvY2tfd3JpdGUoc3RydWN0IGI0M19idXNfZGV2ICpkZXYsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgdTE2IG9mZnNldCwgdTggcmVnX3dpZHRoKQoreworCWJjbWFfYmxvY2tfd3JpdGUoZGV2LT5iZGV2LCBidWZmZXIsIGNvdW50LCBvZmZzZXQsIHJlZ193aWR0aCk7Cit9CisKK3N0cnVjdCBiNDNfYnVzX2RldiAqYjQzX2J1c19kZXZfYmNtYV9pbml0KHN0cnVjdCBiY21hX2RldmljZSAqY29yZSkKK3sKKwlzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXYtPmJ1c190eXBlID0gQjQzX0JVU19CQ01BOworCWRldi0+YmRldiA9IGNvcmU7CisKKwlkZXYtPmJ1c19tYXlfcG93ZXJkb3duID0gYjQzX2J1c19iY21hX2J1c19tYXlfcG93ZXJkb3duOworCWRldi0+YnVzX3Bvd2VydXAgPSBiNDNfYnVzX2JjbWFfYnVzX3Bvd2VydXA7CisJZGV2LT5kZXZpY2VfaXNfZW5hYmxlZCA9IGI0M19idXNfYmNtYV9kZXZpY2VfaXNfZW5hYmxlZDsKKwlkZXYtPmRldmljZV9lbmFibGUgPSBiNDNfYnVzX2JjbWFfZGV2aWNlX2VuYWJsZTsKKwlkZXYtPmRldmljZV9kaXNhYmxlID0gYjQzX2J1c19iY21hX2RldmljZV9kaXNhYmxlOworCisJZGV2LT5yZWFkMTYgPSBiNDNfYnVzX2JjbWFfcmVhZDE2OworCWRldi0+cmVhZDMyID0gYjQzX2J1c19iY21hX3JlYWQzMjsKKwlkZXYtPndyaXRlMTYgPSBiNDNfYnVzX2JjbWFfd3JpdGUxNjsKKwlkZXYtPndyaXRlMzIgPSBiNDNfYnVzX2JjbWFfd3JpdGUzMjsKKwlkZXYtPmJsb2NrX3JlYWQgPSBiNDNfYnVzX2JjbWFfYmxvY2tfcmVhZDsKKwlkZXYtPmJsb2NrX3dyaXRlID0gYjQzX2J1c19iY21hX2Jsb2NrX3dyaXRlOworCisJZGV2LT5kZXYgPSAmY29yZS0+ZGV2OworCWRldi0+ZG1hX2RldiA9IGNvcmUtPmRtYV9kZXY7CisJZGV2LT5pcnEgPSBjb3JlLT5pcnE7CisKKwkvKgorCWRldi0+Ym9hcmRfdmVuZG9yID0gY29yZS0+YnVzLT5ib2FyZGluZm8udmVuZG9yOworCWRldi0+Ym9hcmRfdHlwZSA9IGNvcmUtPmJ1cy0+Ym9hcmRpbmZvLnR5cGU7CisJZGV2LT5ib2FyZF9yZXYgPSBjb3JlLT5idXMtPmJvYXJkaW5mby5yZXY7CisJKi8KKworCWRldi0+Y2hpcF9pZCA9IGNvcmUtPmJ1cy0+Y2hpcGluZm8uaWQ7CisJZGV2LT5jaGlwX3JldiA9IGNvcmUtPmJ1cy0+Y2hpcGluZm8ucmV2OworCWRldi0+Y2hpcF9wa2cgPSBjb3JlLT5idXMtPmNoaXBpbmZvLnBrZzsKKworCWRldi0+YnVzX3Nwcm9tID0gJmNvcmUtPmJ1cy0+c3Byb207CisKKwlkZXYtPmNvcmVfaWQgPSBjb3JlLT5pZC5pZDsKKwlkZXYtPmNvcmVfcmV2ID0gY29yZS0+aWQucmV2OworCisJcmV0dXJuIGRldjsKK30KKyNlbmRpZiAvKiBDT05GSUdfQjQzX0JDTUEgKi8KKworLyogU1NCICovCisjaWZkZWYgQ09ORklHX0I0M19TU0IKK3N0YXRpYyBpbnQgYjQzX2J1c19zc2JfYnVzX21heV9wb3dlcmRvd24oc3RydWN0IGI0M19idXNfZGV2ICpkZXYpCit7CisJcmV0dXJuIHNzYl9idXNfbWF5X3Bvd2VyZG93bihkZXYtPnNkZXYtPmJ1cyk7Cit9CitzdGF0aWMgaW50IGI0M19idXNfc3NiX2J1c19wb3dlcnVwKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LAorCQkJCQkgIGJvb2wgZHluYW1pY19wY3RsKQoreworCXJldHVybiBzc2JfYnVzX3Bvd2VydXAoZGV2LT5zZGV2LT5idXMsIGR5bmFtaWNfcGN0bCk7Cit9CitzdGF0aWMgaW50IGI0M19idXNfc3NiX2RldmljZV9pc19lbmFibGVkKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2KQoreworCXJldHVybiBzc2JfZGV2aWNlX2lzX2VuYWJsZWQoZGV2LT5zZGV2KTsKK30KK3N0YXRpYyB2b2lkIGI0M19idXNfc3NiX2RldmljZV9lbmFibGUoc3RydWN0IGI0M19idXNfZGV2ICpkZXYsCisJCQkJCSAgICAgdTMyIGNvcmVfc3BlY2lmaWNfZmxhZ3MpCit7CisJc3NiX2RldmljZV9lbmFibGUoZGV2LT5zZGV2LCBjb3JlX3NwZWNpZmljX2ZsYWdzKTsKK30KK3N0YXRpYyB2b2lkIGI0M19idXNfc3NiX2RldmljZV9kaXNhYmxlKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LAorCQkJCQkgICAgICB1MzIgY29yZV9zcGVjaWZpY19mbGFncykKK3sKKwlzc2JfZGV2aWNlX2Rpc2FibGUoZGV2LT5zZGV2LCBjb3JlX3NwZWNpZmljX2ZsYWdzKTsKK30KKworc3RhdGljIHUxNiBiNDNfYnVzX3NzYl9yZWFkMTYoc3RydWN0IGI0M19idXNfZGV2ICpkZXYsIHUxNiBvZmZzZXQpCit7CisJcmV0dXJuIHNzYl9yZWFkMTYoZGV2LT5zZGV2LCBvZmZzZXQpOworfQorc3RhdGljIHUzMiBiNDNfYnVzX3NzYl9yZWFkMzIoc3RydWN0IGI0M19idXNfZGV2ICpkZXYsIHUxNiBvZmZzZXQpCit7CisJcmV0dXJuIHNzYl9yZWFkMzIoZGV2LT5zZGV2LCBvZmZzZXQpOworfQorc3RhdGljIHZvaWQgYjQzX2J1c19zc2Jfd3JpdGUxNihzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldiwgdTE2IG9mZnNldCwgdTE2IHZhbHVlKQoreworCXNzYl93cml0ZTE2KGRldi0+c2Rldiwgb2Zmc2V0LCB2YWx1ZSk7Cit9CitzdGF0aWMgdm9pZCBiNDNfYnVzX3NzYl93cml0ZTMyKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJc3NiX3dyaXRlMzIoZGV2LT5zZGV2LCBvZmZzZXQsIHZhbHVlKTsKK30KK3N0YXRpYyB2b2lkIGI0M19idXNfc3NiX2Jsb2NrX3JlYWQoc3RydWN0IGI0M19idXNfZGV2ICpkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJCQkgICBzaXplX3QgY291bnQsIHUxNiBvZmZzZXQsIHU4IHJlZ193aWR0aCkKK3sKKwlzc2JfYmxvY2tfcmVhZChkZXYtPnNkZXYsIGJ1ZmZlciwgY291bnQsIG9mZnNldCwgcmVnX3dpZHRoKTsKK30KK3N0YXRpYwordm9pZCBiNDNfYnVzX3NzYl9ibG9ja193cml0ZShzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldiwgY29uc3Qgdm9pZCAqYnVmZmVyLAorCQkJICAgICBzaXplX3QgY291bnQsIHUxNiBvZmZzZXQsIHU4IHJlZ193aWR0aCkKK3sKKwlzc2JfYmxvY2tfd3JpdGUoZGV2LT5zZGV2LCBidWZmZXIsIGNvdW50LCBvZmZzZXQsIHJlZ193aWR0aCk7Cit9CisKK3N0cnVjdCBiNDNfYnVzX2RldiAqYjQzX2J1c19kZXZfc3NiX2luaXQoc3RydWN0IHNzYl9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IGI0M19idXNfZGV2ICpkZXY7CisKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJZGV2LT5idXNfdHlwZSA9IEI0M19CVVNfU1NCOworCWRldi0+c2RldiA9IHNkZXY7CisKKwlkZXYtPmJ1c19tYXlfcG93ZXJkb3duID0gYjQzX2J1c19zc2JfYnVzX21heV9wb3dlcmRvd247CisJZGV2LT5idXNfcG93ZXJ1cCA9IGI0M19idXNfc3NiX2J1c19wb3dlcnVwOworCWRldi0+ZGV2aWNlX2lzX2VuYWJsZWQgPSBiNDNfYnVzX3NzYl9kZXZpY2VfaXNfZW5hYmxlZDsKKwlkZXYtPmRldmljZV9lbmFibGUgPSBiNDNfYnVzX3NzYl9kZXZpY2VfZW5hYmxlOworCWRldi0+ZGV2aWNlX2Rpc2FibGUgPSBiNDNfYnVzX3NzYl9kZXZpY2VfZGlzYWJsZTsKKworCWRldi0+cmVhZDE2ID0gYjQzX2J1c19zc2JfcmVhZDE2OworCWRldi0+cmVhZDMyID0gYjQzX2J1c19zc2JfcmVhZDMyOworCWRldi0+d3JpdGUxNiA9IGI0M19idXNfc3NiX3dyaXRlMTY7CisJZGV2LT53cml0ZTMyID0gYjQzX2J1c19zc2Jfd3JpdGUzMjsKKwlkZXYtPmJsb2NrX3JlYWQgPSBiNDNfYnVzX3NzYl9ibG9ja19yZWFkOworCWRldi0+YmxvY2tfd3JpdGUgPSBiNDNfYnVzX3NzYl9ibG9ja193cml0ZTsKKworCWRldi0+ZGV2ID0gc2Rldi0+ZGV2OworCWRldi0+ZG1hX2RldiA9IHNkZXYtPmRtYV9kZXY7CisJZGV2LT5pcnEgPSBzZGV2LT5pcnE7CisKKwlkZXYtPmJvYXJkX3ZlbmRvciA9IHNkZXYtPmJ1cy0+Ym9hcmRpbmZvLnZlbmRvcjsKKwlkZXYtPmJvYXJkX3R5cGUgPSBzZGV2LT5idXMtPmJvYXJkaW5mby50eXBlOworCWRldi0+Ym9hcmRfcmV2ID0gc2Rldi0+YnVzLT5ib2FyZGluZm8ucmV2OworCisJZGV2LT5jaGlwX2lkID0gc2Rldi0+YnVzLT5jaGlwX2lkOworCWRldi0+Y2hpcF9yZXYgPSBzZGV2LT5idXMtPmNoaXBfcmV2OworCWRldi0+Y2hpcF9wa2cgPSBzZGV2LT5idXMtPmNoaXBfcGFja2FnZTsKKworCWRldi0+YnVzX3Nwcm9tID0gJnNkZXYtPmJ1cy0+c3Byb207CisKKwlkZXYtPmNvcmVfaWQgPSBzZGV2LT5pZC5jb3JlaWQ7CisJZGV2LT5jb3JlX3JldiA9IHNkZXYtPmlkLnJldmlzaW9uOworCisJcmV0dXJuIGRldjsKK30KKyNlbmRpZiAvKiBDT05GSUdfQjQzX1NTQiAqLworCit2b2lkICpiNDNfYnVzX2dldF93bGRldihzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldikKK3sKKwlzd2l0Y2ggKGRldi0+YnVzX3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwljYXNlIEI0M19CVVNfQkNNQToKKwkJcmV0dXJuIGJjbWFfZ2V0X2RydmRhdGEoZGV2LT5iZGV2KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CNDNfU1NCCisJY2FzZSBCNDNfQlVTX1NTQjoKKwkJcmV0dXJuIHNzYl9nZXRfZHJ2ZGF0YShkZXYtPnNkZXYpOworI2VuZGlmCisJfQorCXJldHVybiBOVUxMOworfQorCit2b2lkIGI0M19idXNfc2V0X3dsZGV2KHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LCB2b2lkICp3bGRldikKK3sKKwlzd2l0Y2ggKGRldi0+YnVzX3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwljYXNlIEI0M19CVVNfQkNNQToKKwkJYmNtYV9zZXRfZHJ2ZGF0YShkZXYtPmJkZXYsIHdsZGV2KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CNDNfU1NCCisJY2FzZSBCNDNfQlVTX1NTQjoKKwkJc3NiX3NldF9kcnZkYXRhKGRldi0+c2Rldiwgd2xkZXYpOworI2VuZGlmCisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2J1cy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2J1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NGM5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYnVzLmgKQEAgLTAsMCArMSw3MCBAQAorI2lmbmRlZiBCNDNfQlVTX0hfCisjZGVmaW5lIEI0M19CVVNfSF8KKworZW51bSBiNDNfYnVzX3R5cGUgeworI2lmZGVmIENPTkZJR19CNDNfQkNNQQorCUI0M19CVVNfQkNNQSwKKyNlbmRpZgorCUI0M19CVVNfU1NCLAorfTsKKworc3RydWN0IGI0M19idXNfZGV2IHsKKwllbnVtIGI0M19idXNfdHlwZSBidXNfdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBiY21hX2RldmljZSAqYmRldjsKKwkJc3RydWN0IHNzYl9kZXZpY2UgKnNkZXY7CisJfTsKKworCWludCAoKmJ1c19tYXlfcG93ZXJkb3duKShzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldik7CisJaW50ICgqYnVzX3Bvd2VydXApKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LCBib29sIGR5bmFtaWNfcGN0bCk7CisJaW50ICgqZGV2aWNlX2lzX2VuYWJsZWQpKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2KTsKKwl2b2lkICgqZGV2aWNlX2VuYWJsZSkoc3RydWN0IGI0M19idXNfZGV2ICpkZXYsCisJCQkgICAgICB1MzIgY29yZV9zcGVjaWZpY19mbGFncyk7CisJdm9pZCAoKmRldmljZV9kaXNhYmxlKShzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldiwKKwkJCSAgICAgICB1MzIgY29yZV9zcGVjaWZpY19mbGFncyk7CisKKwl1MTYgKCpyZWFkMTYpKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LCB1MTYgb2Zmc2V0KTsKKwl1MzIgKCpyZWFkMzIpKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LCB1MTYgb2Zmc2V0KTsKKwl2b2lkICgqd3JpdGUxNikoc3RydWN0IGI0M19idXNfZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiB2YWx1ZSk7CisJdm9pZCAoKndyaXRlMzIpKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MzIgdmFsdWUpOworCXZvaWQgKCpibG9ja19yZWFkKShzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldiwgdm9pZCAqYnVmZmVyLAorCQkJICAgc2l6ZV90IGNvdW50LCB1MTYgb2Zmc2V0LCB1OCByZWdfd2lkdGgpOworCXZvaWQgKCpibG9ja193cml0ZSkoc3RydWN0IGI0M19idXNfZGV2ICpkZXYsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkJCSAgICBzaXplX3QgY291bnQsIHUxNiBvZmZzZXQsIHU4IHJlZ193aWR0aCk7CisKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGRldmljZSAqZG1hX2RldjsKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJdTE2IGJvYXJkX3ZlbmRvcjsKKwl1MTYgYm9hcmRfdHlwZTsKKwl1MTYgYm9hcmRfcmV2OworCisJdTE2IGNoaXBfaWQ7CisJdTggY2hpcF9yZXY7CisJdTggY2hpcF9wa2c7CisKKwlzdHJ1Y3Qgc3NiX3Nwcm9tICpidXNfc3Byb207CisKKwl1MTYgY29yZV9pZDsKKwl1OCBjb3JlX3JldjsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBiNDNfYnVzX2hvc3RfaXNfcGNtY2lhKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2KQoreworCXJldHVybiAoZGV2LT5idXNfdHlwZSA9PSBCNDNfQlVTX1NTQiAmJgorCQlkZXYtPnNkZXYtPmJ1cy0+YnVzdHlwZSA9PSBTU0JfQlVTVFlQRV9QQ01DSUEpOworfQorc3RhdGljIGlubGluZSBib29sIGI0M19idXNfaG9zdF9pc19zZGlvKHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2KQoreworCXJldHVybiAoZGV2LT5idXNfdHlwZSA9PSBCNDNfQlVTX1NTQiAmJgorCQlkZXYtPnNkZXYtPmJ1cy0+YnVzdHlwZSA9PSBTU0JfQlVTVFlQRV9TRElPKTsKK30KKworc3RydWN0IGI0M19idXNfZGV2ICpiNDNfYnVzX2Rldl9iY21hX2luaXQoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlKTsKK3N0cnVjdCBiNDNfYnVzX2RldiAqYjQzX2J1c19kZXZfc3NiX2luaXQoc3RydWN0IHNzYl9kZXZpY2UgKnNkZXYpOworCit2b2lkICpiNDNfYnVzX2dldF93bGRldihzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldik7Cit2b2lkIGI0M19idXNfc2V0X3dsZGV2KHN0cnVjdCBiNDNfYnVzX2RldiAqZGV2LCB2b2lkICpkYXRhKTsKKworI2VuZGlmIC8qIEI0M19CVVNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZGVidWdmcy5jCmluZGV4IDU5ZjU5ZmEuLmU3NTFmZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RlYnVnZnMuYwpAQCAtNCw3ICs0LDcgQEAKIAogICBkZWJ1Z2ZzIGRyaXZlciBkZWJ1Z2dpbmcgY29kZQogCi0gIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kbWEuYwppbmRleCA0N2Q0NGJjLi44M2NiYTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RtYS5jCkBAIC00LDcgKzQsNyBAQAogCiAgIERNQSByaW5nYnVmZmVyIGFuZCBkZXNjcmlwdG9yIGFsbG9jYXRpb24vbWFuYWdlbWVudAogCi0gIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KIAogICBTb21lIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgYjQ0LmMgZHJpdmVyCiAgIENvcHlyaWdodCAoQykgMjAwMiBEYXZpZCBTLiBNaWxsZXIKQEAgLTE3NCw3ICsxNzQsNyBAQAogCWFkZHJoaSA9ICgoKHU2NCkgZG1hYWRkciA+PiAzMikgJiB+U1NCX0RNQV9UUkFOU0xBVElPTl9NQVNLKTsKIAlhZGRyZXh0ID0gKCgodTY0KSBkbWFhZGRyID4+IDMyKSAmIFNTQl9ETUFfVFJBTlNMQVRJT05fTUFTSykKIAkgICAgPj4gU1NCX0RNQV9UUkFOU0xBVElPTl9TSElGVDsKLQlhZGRyaGkgfD0gKHJpbmctPmRldi0+ZG1hLnRyYW5zbGF0aW9uIDw8IDEpOworCWFkZHJoaSB8PSByaW5nLT5kZXYtPmRtYS50cmFuc2xhdGlvbjsKIAlpZiAoc2xvdCA9PSByaW5nLT5ucl9zbG90cyAtIDEpCiAJCWN0bDAgfD0gQjQzX0RNQTY0X0RDVEwwX0RUQUJMRUVORDsKIAlpZiAoc3RhcnQpCkBAIC0zMzMsMTAgKzMzMywxMCBAQAogCWRtYV9hZGRyX3QgZG1hYWRkcjsKIAogCWlmICh0eCkgewotCQlkbWFhZGRyID0gZG1hX21hcF9zaW5nbGUocmluZy0+ZGV2LT5zZGV2LT5kbWFfZGV2LAorCQlkbWFhZGRyID0gZG1hX21hcF9zaW5nbGUocmluZy0+ZGV2LT5kZXYtPmRtYV9kZXYsCiAJCQkJCSBidWYsIGxlbiwgRE1BX1RPX0RFVklDRSk7CiAJfSBlbHNlIHsKLQkJZG1hYWRkciA9IGRtYV9tYXBfc2luZ2xlKHJpbmctPmRldi0+c2Rldi0+ZG1hX2RldiwKKwkJZG1hYWRkciA9IGRtYV9tYXBfc2luZ2xlKHJpbmctPmRldi0+ZGV2LT5kbWFfZGV2LAogCQkJCQkgYnVmLCBsZW4sIERNQV9GUk9NX0RFVklDRSk7CiAJfQogCkBAIC0zNDgsMTAgKzM0OCwxMCBAQAogCQkJICBkbWFfYWRkcl90IGFkZHIsIHNpemVfdCBsZW4sIGludCB0eCkKIHsKIAlpZiAodHgpIHsKLQkJZG1hX3VubWFwX3NpbmdsZShyaW5nLT5kZXYtPnNkZXYtPmRtYV9kZXYsCisJCWRtYV91bm1hcF9zaW5nbGUocmluZy0+ZGV2LT5kZXYtPmRtYV9kZXYsCiAJCQkJIGFkZHIsIGxlbiwgRE1BX1RPX0RFVklDRSk7CiAJfSBlbHNlIHsKLQkJZG1hX3VubWFwX3NpbmdsZShyaW5nLT5kZXYtPnNkZXYtPmRtYV9kZXYsCisJCWRtYV91bm1hcF9zaW5nbGUocmluZy0+ZGV2LT5kZXYtPmRtYV9kZXYsCiAJCQkJIGFkZHIsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKIAl9CiB9CkBAIC0zNjEsNyArMzYxLDcgQEAKIAkJCQkgZG1hX2FkZHJfdCBhZGRyLCBzaXplX3QgbGVuKQogewogCUI0M19XQVJOX09OKHJpbmctPnR4KTsKLQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShyaW5nLT5kZXYtPnNkZXYtPmRtYV9kZXYsCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocmluZy0+ZGV2LT5kZXYtPmRtYV9kZXYsCiAJCQkJICAgIGFkZHIsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKIH0KIApAQCAtMzcwLDcgKzM3MCw3IEBACiAJCQkJICAgIGRtYV9hZGRyX3QgYWRkciwgc2l6ZV90IGxlbikKIHsKIAlCNDNfV0FSTl9PTihyaW5nLT50eCk7Ci0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocmluZy0+ZGV2LT5zZGV2LT5kbWFfZGV2LAorCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHJpbmctPmRldi0+ZGV2LT5kbWFfZGV2LAogCQkJCSAgIGFkZHIsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKIH0KIApAQCAtNDAxLDcgKzQwMSw3IEBACiAJICovCiAJaWYgKHJpbmctPnR5cGUgPT0gQjQzX0RNQV82NEJJVCkKIAkJZmxhZ3MgfD0gR0ZQX0RNQTsKLQlyaW5nLT5kZXNjYmFzZSA9IGRtYV9hbGxvY19jb2hlcmVudChyaW5nLT5kZXYtPnNkZXYtPmRtYV9kZXYsCisJcmluZy0+ZGVzY2Jhc2UgPSBkbWFfYWxsb2NfY29oZXJlbnQocmluZy0+ZGV2LT5kZXYtPmRtYV9kZXYsCiAJCQkJCSAgICBCNDNfRE1BX1JJTkdNRU1TSVpFLAogCQkJCQkgICAgJihyaW5nLT5kbWFiYXNlKSwgZmxhZ3MpOwogCWlmICghcmluZy0+ZGVzY2Jhc2UpIHsKQEAgLTQxNSw3ICs0MTUsNyBAQAogCiBzdGF0aWMgdm9pZCBmcmVlX3JpbmdtZW1vcnkoc3RydWN0IGI0M19kbWFyaW5nICpyaW5nKQogewotCWRtYV9mcmVlX2NvaGVyZW50KHJpbmctPmRldi0+c2Rldi0+ZG1hX2RldiwgQjQzX0RNQV9SSU5HTUVNU0laRSwKKwlkbWFfZnJlZV9jb2hlcmVudChyaW5nLT5kZXYtPmRldi0+ZG1hX2RldiwgQjQzX0RNQV9SSU5HTUVNU0laRSwKIAkJCSAgcmluZy0+ZGVzY2Jhc2UsIHJpbmctPmRtYWJhc2UpOwogfQogCkBAIC01MjMsNyArNTIzLDcgQEAKIAkJCQkgIGRtYV9hZGRyX3QgYWRkciwKIAkJCQkgIHNpemVfdCBidWZmZXJzaXplLCBib29sIGRtYV90b19kZXZpY2UpCiB7Ci0JaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHJpbmctPmRldi0+c2Rldi0+ZG1hX2RldiwgYWRkcikpKQorCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihyaW5nLT5kZXYtPmRldi0+ZG1hX2RldiwgYWRkcikpKQogCQlyZXR1cm4gMTsKIAogCXN3aXRjaCAocmluZy0+dHlwZSkgewpAQCAtNjU5LDYgKzY1OSw3IEBACiAJdTMyIHZhbHVlOwogCXUzMiBhZGRyZXh0OwogCXUzMiB0cmFucyA9IHJpbmctPmRldi0+ZG1hLnRyYW5zbGF0aW9uOworCWJvb2wgcGFyaXR5ID0gcmluZy0+ZGV2LT5kbWEucGFyaXR5OwogCiAJaWYgKHJpbmctPnR4KSB7CiAJCWlmIChyaW5nLT50eXBlID09IEI0M19ETUFfNjRCSVQpIHsKQEAgLTY2OSwxMyArNjcwLDE1IEBACiAJCQl2YWx1ZSA9IEI0M19ETUE2NF9UWEVOQUJMRTsKIAkJCXZhbHVlIHw9IChhZGRyZXh0IDw8IEI0M19ETUE2NF9UWEFERFJFWFRfU0hJRlQpCiAJCQkgICAgJiBCNDNfRE1BNjRfVFhBRERSRVhUX01BU0s7CisJCQlpZiAoIXBhcml0eSkKKwkJCQl2YWx1ZSB8PSBCNDNfRE1BNjRfVFhQQVJJVFlESVNBQkxFOwogCQkJYjQzX2RtYV93cml0ZShyaW5nLCBCNDNfRE1BNjRfVFhDVEwsIHZhbHVlKTsKIAkJCWI0M19kbWFfd3JpdGUocmluZywgQjQzX0RNQTY0X1RYUklOR0xPLAogCQkJCSAgICAgIChyaW5nYmFzZSAmIDB4RkZGRkZGRkYpKTsKIAkJCWI0M19kbWFfd3JpdGUocmluZywgQjQzX0RNQTY0X1RYUklOR0hJLAogCQkJCSAgICAgICgocmluZ2Jhc2UgPj4gMzIpICYKIAkJCQkgICAgICAgflNTQl9ETUFfVFJBTlNMQVRJT05fTUFTSykKLQkJCQkgICAgICB8ICh0cmFucyA8PCAxKSk7CisJCQkJICAgICAgfCB0cmFucyk7CiAJCX0gZWxzZSB7CiAJCQl1MzIgcmluZ2Jhc2UgPSAodTMyKSAocmluZy0+ZG1hYmFzZSk7CiAKQEAgLTY4NCw2ICs2ODcsOCBAQAogCQkJdmFsdWUgPSBCNDNfRE1BMzJfVFhFTkFCTEU7CiAJCQl2YWx1ZSB8PSAoYWRkcmV4dCA8PCBCNDNfRE1BMzJfVFhBRERSRVhUX1NISUZUKQogCQkJICAgICYgQjQzX0RNQTMyX1RYQUREUkVYVF9NQVNLOworCQkJaWYgKCFwYXJpdHkpCisJCQkJdmFsdWUgfD0gQjQzX0RNQTMyX1RYUEFSSVRZRElTQUJMRTsKIAkJCWI0M19kbWFfd3JpdGUocmluZywgQjQzX0RNQTMyX1RYQ1RMLCB2YWx1ZSk7CiAJCQliNDNfZG1hX3dyaXRlKHJpbmcsIEI0M19ETUEzMl9UWFJJTkcsCiAJCQkJICAgICAgKHJpbmdiYXNlICYgflNTQl9ETUFfVFJBTlNMQVRJT05fTUFTSykKQEAgLTcwMiwxMyArNzA3LDE1IEBACiAJCQl2YWx1ZSB8PSBCNDNfRE1BNjRfUlhFTkFCTEU7CiAJCQl2YWx1ZSB8PSAoYWRkcmV4dCA8PCBCNDNfRE1BNjRfUlhBRERSRVhUX1NISUZUKQogCQkJICAgICYgQjQzX0RNQTY0X1JYQUREUkVYVF9NQVNLOworCQkJaWYgKCFwYXJpdHkpCisJCQkJdmFsdWUgfD0gQjQzX0RNQTY0X1JYUEFSSVRZRElTQUJMRTsKIAkJCWI0M19kbWFfd3JpdGUocmluZywgQjQzX0RNQTY0X1JYQ1RMLCB2YWx1ZSk7CiAJCQliNDNfZG1hX3dyaXRlKHJpbmcsIEI0M19ETUE2NF9SWFJJTkdMTywKIAkJCQkgICAgICAocmluZ2Jhc2UgJiAweEZGRkZGRkZGKSk7CiAJCQliNDNfZG1hX3dyaXRlKHJpbmcsIEI0M19ETUE2NF9SWFJJTkdISSwKIAkJCQkgICAgICAoKHJpbmdiYXNlID4+IDMyKSAmCiAJCQkJICAgICAgIH5TU0JfRE1BX1RSQU5TTEFUSU9OX01BU0spCi0JCQkJICAgICAgfCAodHJhbnMgPDwgMSkpOworCQkJCSAgICAgIHwgdHJhbnMpOwogCQkJYjQzX2RtYV93cml0ZShyaW5nLCBCNDNfRE1BNjRfUlhJTkRFWCwgcmluZy0+bnJfc2xvdHMgKgogCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYjQzX2RtYWRlc2M2NCkpOwogCQl9IGVsc2UgewpAQCAtNzIwLDYgKzcyNyw4IEBACiAJCQl2YWx1ZSB8PSBCNDNfRE1BMzJfUlhFTkFCTEU7CiAJCQl2YWx1ZSB8PSAoYWRkcmV4dCA8PCBCNDNfRE1BMzJfUlhBRERSRVhUX1NISUZUKQogCQkJICAgICYgQjQzX0RNQTMyX1JYQUREUkVYVF9NQVNLOworCQkJaWYgKCFwYXJpdHkpCisJCQkJdmFsdWUgfD0gQjQzX0RNQTMyX1JYUEFSSVRZRElTQUJMRTsKIAkJCWI0M19kbWFfd3JpdGUocmluZywgQjQzX0RNQTMyX1JYQ1RMLCB2YWx1ZSk7CiAJCQliNDNfZG1hX3dyaXRlKHJpbmcsIEI0M19ETUEzMl9SWFJJTkcsCiAJCQkJICAgICAgKHJpbmdiYXNlICYgflNTQl9ETUFfVFJBTlNMQVRJT05fTUFTSykKQEAgLTc1NywxNCArNzY2LDE0IEBACiAKIHN0YXRpYyB2b2lkIGZyZWVfYWxsX2Rlc2NidWZmZXJzKHN0cnVjdCBiNDNfZG1hcmluZyAqcmluZykKIHsKLQlzdHJ1Y3QgYjQzX2RtYWRlc2NfZ2VuZXJpYyAqZGVzYzsKIAlzdHJ1Y3QgYjQzX2RtYWRlc2NfbWV0YSAqbWV0YTsKIAlpbnQgaTsKIAogCWlmICghcmluZy0+dXNlZF9zbG90cykKIAkJcmV0dXJuOwogCWZvciAoaSA9IDA7IGkgPCByaW5nLT5ucl9zbG90czsgaSsrKSB7Ci0JCWRlc2MgPSByaW5nLT5vcHMtPmlkeDJkZXNjKHJpbmcsIGksICZtZXRhKTsKKwkJLyogZ2V0IG1ldGEgLSBpZ25vcmUgcmV0dXJuZWQgdmFsdWUgKi8KKwkJcmluZy0+b3BzLT5pZHgyZGVzYyhyaW5nLCBpLCAmbWV0YSk7CiAKIAkJaWYgKCFtZXRhLT5za2IgfHwgYjQzX2RtYV9wdHJfaXNfcG9pc29uZWQobWV0YS0+c2tiKSkgewogCQkJQjQzX1dBUk5fT04oIXJpbmctPnR4KTsKQEAgLTg2OSw3ICs4NzgsNyBAQAogCQkJZ290byBlcnJfa2ZyZWVfbWV0YTsKIAogCQkvKiB0ZXN0IGZvciBhYmlsaXR5IHRvIGRtYSB0byB0eGhkcl9jYWNoZSAqLwotCQlkbWFfdGVzdCA9IGRtYV9tYXBfc2luZ2xlKGRldi0+c2Rldi0+ZG1hX2RldiwKKwkJZG1hX3Rlc3QgPSBkbWFfbWFwX3NpbmdsZShkZXYtPmRldi0+ZG1hX2RldiwKIAkJCQkJICByaW5nLT50eGhkcl9jYWNoZSwKIAkJCQkJICBiNDNfdHhoZHJfc2l6ZShkZXYpLAogCQkJCQkgIERNQV9UT19ERVZJQ0UpOwpAQCAtODg0LDcgKzg5Myw3IEBACiAJCQlpZiAoIXJpbmctPnR4aGRyX2NhY2hlKQogCQkJCWdvdG8gZXJyX2tmcmVlX21ldGE7CiAKLQkJCWRtYV90ZXN0ID0gZG1hX21hcF9zaW5nbGUoZGV2LT5zZGV2LT5kbWFfZGV2LAorCQkJZG1hX3Rlc3QgPSBkbWFfbWFwX3NpbmdsZShkZXYtPmRldi0+ZG1hX2RldiwKIAkJCQkJCSAgcmluZy0+dHhoZHJfY2FjaGUsCiAJCQkJCQkgIGI0M190eGhkcl9zaXplKGRldiksCiAJCQkJCQkgIERNQV9UT19ERVZJQ0UpOwpAQCAtODk4LDcgKzkwNyw3IEBACiAJCQl9CiAJCX0KIAotCQlkbWFfdW5tYXBfc2luZ2xlKGRldi0+c2Rldi0+ZG1hX2RldiwKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYtPmRldi0+ZG1hX2RldiwKIAkJCQkgZG1hX3Rlc3QsIGI0M190eGhkcl9zaXplKGRldiksCiAJCQkJIERNQV9UT19ERVZJQ0UpOwogCX0KQEAgLTEwMTMsOSArMTAyMiw5IEBACiAJLyogVHJ5IHRvIHNldCB0aGUgRE1BIG1hc2suIElmIGl0IGZhaWxzLCB0cnkgZmFsbGluZyBiYWNrIHRvIGEKIAkgKiBsb3dlciBtYXNrLCBhcyB3ZSBjYW4gYWx3YXlzIGFsc28gc3VwcG9ydCBhIGxvd2VyIG9uZS4gKi8KIAl3aGlsZSAoMSkgewotCQllcnIgPSBkbWFfc2V0X21hc2soZGV2LT5zZGV2LT5kbWFfZGV2LCBtYXNrKTsKKwkJZXJyID0gZG1hX3NldF9tYXNrKGRldi0+ZGV2LT5kbWFfZGV2LCBtYXNrKTsKIAkJaWYgKCFlcnIpIHsKLQkJCWVyciA9IGRtYV9zZXRfY29oZXJlbnRfbWFzayhkZXYtPnNkZXYtPmRtYV9kZXYsIG1hc2spOworCQkJZXJyID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKGRldi0+ZGV2LT5kbWFfZGV2LCBtYXNrKTsKIAkJCWlmICghZXJyKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xMDU1LDcgKzEwNjQsMjYgQEAKIAllcnIgPSBiNDNfZG1hX3NldF9tYXNrKGRldiwgZG1hbWFzayk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQlkbWEtPnRyYW5zbGF0aW9uID0gc3NiX2RtYV90cmFuc2xhdGlvbihkZXYtPnNkZXYpOworCisJc3dpdGNoIChkZXYtPmRldi0+YnVzX3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwljYXNlIEI0M19CVVNfQkNNQToKKwkJZG1hLT50cmFuc2xhdGlvbiA9IGJjbWFfY29yZV9kbWFfdHJhbnNsYXRpb24oZGV2LT5kZXYtPmJkZXYpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CNDNfU1NCCisJY2FzZSBCNDNfQlVTX1NTQjoKKwkJZG1hLT50cmFuc2xhdGlvbiA9IHNzYl9kbWFfdHJhbnNsYXRpb24oZGV2LT5kZXYtPnNkZXYpOworCQlicmVhazsKKyNlbmRpZgorCX0KKworCWRtYS0+cGFyaXR5ID0gdHJ1ZTsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwkvKiBUT0RPOiBmaW5kIG91dCB3aGljaCBTU0IgZGV2aWNlcyBuZWVkIGRpc2FibGluZyBwYXJpdHkgKi8KKwlpZiAoZGV2LT5kZXYtPmJ1c190eXBlID09IEI0M19CVVNfQkNNQSkKKwkJZG1hLT5wYXJpdHkgPSBmYWxzZTsKKyNlbmRpZgogCiAJZXJyID0gLUVOT01FTTsKIAkvKiBzZXR1cCBUWCBETUEgY2hhbm5lbHMuICovCkBAIC0xMDg1LDcgKzExMTMsNyBAQAogCQlnb3RvIGVycl9kZXN0cm95X21jYXN0OwogCiAJLyogTm8gc3VwcG9ydCBmb3IgdGhlIFRYIHN0YXR1cyBETUEgcmluZy4gKi8KLQlCNDNfV0FSTl9PTihkZXYtPnNkZXYtPmlkLnJldmlzaW9uIDwgNSk7CisJQjQzX1dBUk5fT04oZGV2LT5kZXYtPmNvcmVfcmV2IDwgNSk7CiAKIAliNDNkYmcoZGV2LT53bCwgIiV1LWJpdCBETUEgaW5pdGlhbGl6ZWRcbiIsCiAJICAgICAgICh1bnNpZ25lZCBpbnQpdHlwZSk7CkBAIC0xMzg4LDcgKzE0MTYsNiBAQAogewogCWNvbnN0IHN0cnVjdCBiNDNfZG1hX29wcyAqb3BzOwogCXN0cnVjdCBiNDNfZG1hcmluZyAqcmluZzsKLQlzdHJ1Y3QgYjQzX2RtYWRlc2NfZ2VuZXJpYyAqZGVzYzsKIAlzdHJ1Y3QgYjQzX2RtYWRlc2NfbWV0YSAqbWV0YTsKIAlpbnQgc2xvdCwgZmlyc3R1c2VkOwogCWJvb2wgZnJhbWVfc3VjY2VlZDsKQEAgLTE0MTYsNyArMTQ0Myw4IEBACiAJb3BzID0gcmluZy0+b3BzOwogCXdoaWxlICgxKSB7CiAJCUI0M19XQVJOX09OKHNsb3QgPCAwIHx8IHNsb3QgPj0gcmluZy0+bnJfc2xvdHMpOwotCQlkZXNjID0gb3BzLT5pZHgyZGVzYyhyaW5nLCBzbG90LCAmbWV0YSk7CisJCS8qIGdldCBtZXRhIC0gaWdub3JlIHJldHVybmVkIHZhbHVlICovCisJCW9wcy0+aWR4MmRlc2MocmluZywgc2xvdCwgJm1ldGEpOwogCiAJCWlmIChiNDNfZG1hX3B0cl9pc19wb2lzb25lZChtZXRhLT5za2IpKSB7CiAJCQliNDNkYmcoZGV2LT53bCwgIlBvaXNvbmVkIFRYIHNsb3QgJWQgKGZpcnN0PSVkKSAiCkBAIC0xNjAwLDYgKzE2MjgsNyBAQAogCQlkbWFfcngocmluZywgJnNsb3QpOwogCQl1cGRhdGVfbWF4X3VzZWRfc2xvdHMocmluZywgKyt1c2VkX3Nsb3RzKTsKIAl9CisJd21iKCk7CiAJb3BzLT5zZXRfY3VycmVudF9yeHNsb3QocmluZywgc2xvdCk7CiAJcmluZy0+Y3VycmVudF9zbG90ID0gc2xvdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kbWEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kbWEuaAppbmRleCBlOGE4MGExLi5jZGY4NzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZG1hLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RtYS5oCkBAIC0yMCw2ICsyMCw3IEBACiAjZGVmaW5lCQlCNDNfRE1BMzJfVFhTVVNQRU5ECQkJMHgwMDAwMDAwMgogI2RlZmluZQkJQjQzX0RNQTMyX1RYTE9PUEJBQ0sJCTB4MDAwMDAwMDQKICNkZWZpbmUJCUI0M19ETUEzMl9UWEZMVVNICQkJMHgwMDAwMDAxMAorI2RlZmluZQkJQjQzX0RNQTMyX1RYUEFSSVRZRElTQUJMRQkJMHgwMDAwMDgwMAogI2RlZmluZQkJQjQzX0RNQTMyX1RYQUREUkVYVF9NQVNLCQkweDAwMDMwMDAwCiAjZGVmaW5lCQlCNDNfRE1BMzJfVFhBRERSRVhUX1NISUZUCQkxNgogI2RlZmluZSBCNDNfRE1BMzJfVFhSSU5HCQkJCTB4MDQKQEAgLTQ0LDYgKzQ1LDcgQEAKICNkZWZpbmUJCUI0M19ETUEzMl9SWEZST0ZGX01BU0sJCTB4MDAwMDAwRkUKICNkZWZpbmUJCUI0M19ETUEzMl9SWEZST0ZGX1NISUZUCQkxCiAjZGVmaW5lCQlCNDNfRE1BMzJfUlhESVJFQ1RGSUZPCQkweDAwMDAwMTAwCisjZGVmaW5lCQlCNDNfRE1BMzJfUlhQQVJJVFlESVNBQkxFCQkweDAwMDAwODAwCiAjZGVmaW5lCQlCNDNfRE1BMzJfUlhBRERSRVhUX01BU0sJCTB4MDAwMzAwMDAKICNkZWZpbmUJCUI0M19ETUEzMl9SWEFERFJFWFRfU0hJRlQJCTE2CiAjZGVmaW5lIEI0M19ETUEzMl9SWFJJTkcJCQkJMHgxNApAQCAtODQsNiArODYsNyBAQAogI2RlZmluZQkJQjQzX0RNQTY0X1RYU1VTUEVORAkJCTB4MDAwMDAwMDIKICNkZWZpbmUJCUI0M19ETUE2NF9UWExPT1BCQUNLCQkweDAwMDAwMDA0CiAjZGVmaW5lCQlCNDNfRE1BNjRfVFhGTFVTSAkJCTB4MDAwMDAwMTAKKyNkZWZpbmUJCUI0M19ETUE2NF9UWFBBUklUWURJU0FCTEUJCTB4MDAwMDA4MDAKICNkZWZpbmUJCUI0M19ETUE2NF9UWEFERFJFWFRfTUFTSwkJMHgwMDAzMDAwMAogI2RlZmluZQkJQjQzX0RNQTY0X1RYQUREUkVYVF9TSElGVAkJMTYKICNkZWZpbmUgQjQzX0RNQTY0X1RYSU5ERVgJCQkJMHgwNApAQCAtMTExLDYgKzExNCw3IEBACiAjZGVmaW5lCQlCNDNfRE1BNjRfUlhGUk9GRl9NQVNLCQkweDAwMDAwMEZFCiAjZGVmaW5lCQlCNDNfRE1BNjRfUlhGUk9GRl9TSElGVAkJMQogI2RlZmluZQkJQjQzX0RNQTY0X1JYRElSRUNURklGTwkJMHgwMDAwMDEwMAorI2RlZmluZQkJQjQzX0RNQTY0X1JYUEFSSVRZRElTQUJMRQkJMHgwMDAwMDgwMAogI2RlZmluZQkJQjQzX0RNQTY0X1JYQUREUkVYVF9NQVNLCQkweDAwMDMwMDAwCiAjZGVmaW5lCQlCNDNfRE1BNjRfUlhBRERSRVhUX1NISUZUCQkxNgogI2RlZmluZSBCNDNfRE1BNjRfUlhJTkRFWAkJCQkweDI0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbGVkcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xlZHMuYwppbmRleCAwY2FmYWZlLi5hMzhjMWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbGVkcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9sZWRzLmMKQEAgLTUsNyArNSw3IEBACiAKICAgQ29weXJpZ2h0IChjKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPiwKICAgQ29weXJpZ2h0IChjKSAyMDA1IFN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+Ci0gIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgIENvcHlyaWdodCAoYykgMjAwNSBEYW5ueSB2YW4gRHlrIDxrdWdlbGZhbmdAZ2VudG9vLm9yZz4KICAgQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYXMgSmFnZ2kgPGFuZHJlYXMuamFnZ2lAd2F0ZXJ3YXZlLmNoPgogCkBAIC0xMzgsNyArMTM4LDcgQEAKIAlsZWQtPmxlZF9kZXYuZGVmYXVsdF90cmlnZ2VyID0gZGVmYXVsdF90cmlnZ2VyOwogCWxlZC0+bGVkX2Rldi5icmlnaHRuZXNzX3NldCA9IGI0M19sZWRfYnJpZ2h0bmVzc19zZXQ7CiAKLQllcnIgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoZGV2LT5zZGV2LT5kZXYsICZsZWQtPmxlZF9kZXYpOworCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcihkZXYtPmRldi0+ZGV2LCAmbGVkLT5sZWRfZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWI0M3dhcm4oZGV2LT53bCwgIkxFRHM6IEZhaWxlZCB0byByZWdpc3RlciAlc1xuIiwgbmFtZSk7CiAJCWxlZC0+d2wgPSBOVUxMOwpAQCAtMjE1LDEzICsyMTUsMTIgQEAKIAkJCQkgIGVudW0gYjQzX2xlZF9iZWhhdmlvdXIgKmJlaGF2aW91ciwKIAkJCQkgIGJvb2wgKmFjdGl2ZWxvdykKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CiAJdTggc3Byb21bNF07CiAKLQlzcHJvbVswXSA9IGJ1cy0+c3Byb20uZ3BpbzA7Ci0Jc3Byb21bMV0gPSBidXMtPnNwcm9tLmdwaW8xOwotCXNwcm9tWzJdID0gYnVzLT5zcHJvbS5ncGlvMjsKLQlzcHJvbVszXSA9IGJ1cy0+c3Byb20uZ3BpbzM7CisJc3Byb21bMF0gPSBkZXYtPmRldi0+YnVzX3Nwcm9tLT5ncGlvMDsKKwlzcHJvbVsxXSA9IGRldi0+ZGV2LT5idXNfc3Byb20tPmdwaW8xOworCXNwcm9tWzJdID0gZGV2LT5kZXYtPmJ1c19zcHJvbS0+Z3BpbzI7CisJc3Byb21bM10gPSBkZXYtPmRldi0+YnVzX3Nwcm9tLT5ncGlvMzsKIAogCWlmIChzcHJvbVtsZWRfaW5kZXhdID09IDB4RkYpIHsKIAkJLyogVGhlcmUgaXMgbm8gTEVEIGluZm9ybWF0aW9uIGluIHRoZSBTUFJPTQpAQCAtMjMxLDEyICsyMzAsMTIgQEAKIAkJY2FzZSAwOgogCQkJKmJlaGF2aW91ciA9IEI0M19MRURfQUNUSVZJVFk7CiAJCQkqYWN0aXZlbG93ID0gMTsKLQkJCWlmIChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9DT01QQVEpCisJCQlpZiAoZGV2LT5kZXYtPmJvYXJkX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NPTVBBUSkKIAkJCQkqYmVoYXZpb3VyID0gQjQzX0xFRF9SQURJT19BTEw7CiAJCQlicmVhazsKIAkJY2FzZSAxOgogCQkJKmJlaGF2aW91ciA9IEI0M19MRURfUkFESU9fQjsKLQkJCWlmIChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLKQorCQkJaWYgKGRldi0+ZGV2LT5ib2FyZF92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLKQogCQkJCSpiZWhhdmlvdXIgPSBCNDNfTEVEX0FTU09DOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9sby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xvLmMKaW5kZXggMmVmN2Q0Yi4uNGM4MmQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xvLmMKQEAgLTYsNyArNiw3IEBACiAKICAgQ29weXJpZ2h0IChjKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPiwKICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IFN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+Ci0gIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBEYW5ueSB2YW4gRHlrIDxrdWdlbGZhbmdAZ2VudG9vLm9yZz4KICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEFuZHJlYXMgSmFnZ2kgPGFuZHJlYXMuamFnZ2lAd2F0ZXJ3YXZlLmNoPgogCkBAIC05OCw3ICs5OCw3IEBACiAJCXJmb3ZlciB8PSBwZ2E7CiAJCXJmb3ZlciB8PSBsbmE7CiAJCXJmb3ZlciB8PSB0cnN3X3J4OwotCQlpZiAoKGRldi0+c2Rldi0+YnVzLT5zcHJvbS5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9FWFRMTkEpCisJCWlmICgoZGV2LT5kZXYtPmJ1c19zcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfRVhUTE5BKQogCQkgICAgJiYgcGh5LT5yZXYgPiA2KQogCQkJcmZvdmVyIHw9IEI0M19QSFlfUkZPVkVSVkFMX0VYVExOQTsKIApAQCAtMzAxLDE0ICszMDEsMTIgQEAKIAkJbWF4X3J4X2dhaW4gPSAwOwogCiAJaWYgKGhhc19sb29wYmFja19nYWluKHBoeSkpIHsKLQkJaW50IHRyc3dfcnggPSAwOwogCQlpbnQgdHJzd19yeF9nYWluOwogCiAJCWlmICh1c2VfdHJzd19yeCkgewogCQkJdHJzd19yeF9nYWluID0gZ3BoeS0+dHJzd19yeF9nYWluIC8gMjsKIAkJCWlmIChtYXhfcnhfZ2FpbiA+PSB0cnN3X3J4X2dhaW4pIHsKIAkJCQl0cnN3X3J4X2dhaW4gPSBtYXhfcnhfZ2FpbiAtIHRyc3dfcnhfZ2FpbjsKLQkJCQl0cnN3X3J4ID0gMHgyMDsKIAkJCX0KIAkJfSBlbHNlCiAJCQl0cnN3X3J4X2dhaW4gPSBtYXhfcnhfZ2FpbjsKQEAgLTM4Nyw3ICszODUsNyBAQAogc3RhdGljIHZvaWQgbG9fbWVhc3VyZV9zZXR1cChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCiAJCQkgICAgIHN0cnVjdCBsb19nX3NhdmVkX3ZhbHVlcyAqc2F2KQogewotCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gJmRldi0+c2Rldi0+YnVzLT5zcHJvbTsKKwlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9IGRldi0+ZGV2LT5idXNfc3Byb207CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKIAlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOwogCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsbyA9IGdwaHktPmxvX2NvbnRyb2w7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYwppbmRleCBlYjQxNTk2Li4wMzJkNDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKQEAgLTQsNyArNCw3IEBACiAKICAgQ29weXJpZ2h0IChjKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPgogICBDb3B5cmlnaHQgKGMpIDIwMDUgU3RlZmFubyBCcml2aW8gPHN0ZWZhbm8uYnJpdmlvQHBvbGltaS5pdD4KLSAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAgQ29weXJpZ2h0IChjKSAyMDA1IERhbm55IHZhbiBEeWsgPGt1Z2VsZmFuZ0BnZW50b28ub3JnPgogICBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhcyBKYWdnaSA8YW5kcmVhcy5qYWdnaUB3YXRlcndhdmUuY2g+CiAKQEAgLTExMyw2ICsxMTMsMTcgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChwaW8sIGI0M19tb2RwYXJhbV9waW8sIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBpbywgIlVzZSBQSU8gYWNjZXNzZXMgYnkgZGVmYXVsdDogMD1ETUEsIDE9UElPIik7CiAKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmNtYV9kZXZpY2VfaWQgYjQzX2JjbWFfdGJsW10gPSB7CisJQkNNQV9DT1JFKEJDTUFfTUFOVUZfQkNNLCBCQ01BX0NPUkVfODAyMTEsIDB4MTcsIEJDTUFfQU5ZX0NMQVNTKSwKKwlCQ01BX0NPUkUoQkNNQV9NQU5VRl9CQ00sIEJDTUFfQ09SRV84MDIxMSwgMHgxOCwgQkNNQV9BTllfQ0xBU1MpLAorCUJDTUFfQ09SRShCQ01BX01BTlVGX0JDTSwgQkNNQV9DT1JFXzgwMjExLCAweDFELCBCQ01BX0FOWV9DTEFTUyksCisJQkNNQV9DT1JFVEFCTEVfRU5ECit9OworTU9EVUxFX0RFVklDRV9UQUJMRShiY21hLCBiNDNfYmNtYV90YmwpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgogc3RhdGljIGNvbnN0IHN0cnVjdCBzc2JfZGV2aWNlX2lkIGI0M19zc2JfdGJsW10gPSB7CiAJU1NCX0RFVklDRShTU0JfVkVORE9SX0JST0FEQ09NLCBTU0JfREVWXzgwMjExLCA1KSwKIAlTU0JfREVWSUNFKFNTQl9WRU5ET1JfQlJPQURDT00sIFNTQl9ERVZfODAyMTEsIDYpLApAQCAtMTI2LDggKzEzNyw4IEBACiAJU1NCX0RFVklDRShTU0JfVkVORE9SX0JST0FEQ09NLCBTU0JfREVWXzgwMjExLCAxNiksCiAJU1NCX0RFVlRBQkxFX0VORAogfTsKLQogTU9EVUxFX0RFVklDRV9UQUJMRShzc2IsIGI0M19zc2JfdGJsKTsKKyNlbmRpZgogCiAvKiBDaGFubmVsIGFuZCByYXRldGFibGVzIGFyZSBzaGFyZWQgZm9yIGFsbCBkZXZpY2VzLgogICogVGhleSBjYW4ndCBiZSBjb25zdCwgYmVjYXVzZSBpZWVlODAyMTEgcHV0cyBzb21lIHByZWNhbGN1bGF0ZWQKQEAgLTU0OCw3ICs1NTksNyBAQAogewogCXUzMiBsb3csIGhpZ2g7CiAKLQlCNDNfV0FSTl9PTihkZXYtPnNkZXYtPmlkLnJldmlzaW9uIDwgMyk7CisJQjQzX1dBUk5fT04oZGV2LT5kZXYtPmNvcmVfcmV2IDwgMyk7CiAKIAkvKiBUaGUgaGFyZHdhcmUgZ3VhcmFudGVlcyB1cyBhbiBhdG9taWMgcmVhZCwgaWYgd2UKIAkgKiByZWFkIHRoZSBsb3cgcmVnaXN0ZXIgZmlyc3QuICovCkBAIC01ODYsNyArNTk3LDcgQEAKIHsKIAl1MzIgbG93LCBoaWdoOwogCi0JQjQzX1dBUk5fT04oZGV2LT5zZGV2LT5pZC5yZXZpc2lvbiA8IDMpOworCUI0M19XQVJOX09OKGRldi0+ZGV2LT5jb3JlX3JldiA8IDMpOwogCiAJbG93ID0gdHNmOwogCWhpZ2ggPSAodHNmID4+IDMyKTsKQEAgLTcxNCw3ICs3MjUsNyBAQAogCQliNDNfcmFtX3dyaXRlKGRldiwgaSAqIDQsIGJ1ZmZlcltpXSk7CiAKIAliNDNfd3JpdGUxNihkZXYsIDB4MDU2OCwgMHgwMDAwKTsKLQlpZiAoZGV2LT5zZGV2LT5pZC5yZXZpc2lvbiA8IDExKQorCWlmIChkZXYtPmRldi0+Y29yZV9yZXYgPCAxMSkKIAkJYjQzX3dyaXRlMTYoZGV2LCAweDA3QzAsIDB4MDAwMCk7CiAJZWxzZQogCQliNDNfd3JpdGUxNihkZXYsIDB4MDdDMCwgMHgwMTAwKTsKQEAgLTExMzIsNyArMTE0Myw3IEBACiAJYjQzX3dyaXRlMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwsIG1hY2N0bCk7CiAJLyogQ29tbWl0IHdyaXRlICovCiAJYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX01BQ0NUTCk7Ci0JaWYgKGF3YWtlICYmIGRldi0+c2Rldi0+aWQucmV2aXNpb24gPj0gNSkgeworCWlmIChhd2FrZSAmJiBkZXYtPmRldi0+Y29yZV9yZXYgPj0gNSkgewogCQkvKiBXYWl0IGZvciB0aGUgbWljcm9jb2RlIHRvIHdha2UgdXAuICovCiAJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewogCQkJdWNzdGF0ID0gYjQzX3NobV9yZWFkMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwKQEAgLTExNDQsMzUgKzExNTUsODUgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGI0M19zc2Jfd2lyZWxlc3NfY29yZV9yZXNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUzMiBmbGFncykKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKK3N0YXRpYyB2b2lkIGI0M19iY21hX3BoeV9yZXNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0JdTMyIHRtc2xvdzsKKwl1MzIgZmxhZ3M7CiAKKwkvKiBQdXQgUEhZIGludG8gcmVzZXQgKi8KKwlmbGFncyA9IGJjbWFfYXJlYWQzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCk7CisJZmxhZ3MgfD0gQjQzX0JDTUFfSU9DVExfUEhZX1JFU0VUOworCWZsYWdzIHw9IEI0M19CQ01BX0lPQ1RMX1BIWV9CV18yME1IWjsgLyogTWFrZSAyMCBNSHogZGVmICovCisJYmNtYV9hd3JpdGUzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCwgZmxhZ3MpOworCXVkZWxheSgyKTsKKworCS8qIFRha2UgUEhZIG91dCBvZiByZXNldCAqLworCWZsYWdzID0gYmNtYV9hcmVhZDMyKGRldi0+ZGV2LT5iZGV2LCBCQ01BX0lPQ1RMKTsKKwlmbGFncyAmPSB+QjQzX0JDTUFfSU9DVExfUEhZX1JFU0VUOworCWZsYWdzIHw9IEJDTUFfSU9DVExfRkdDOworCWJjbWFfYXdyaXRlMzIoZGV2LT5kZXYtPmJkZXYsIEJDTUFfSU9DVEwsIGZsYWdzKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiBEbyBub3QgZm9yY2UgY2xvY2sgYW55bW9yZSAqLworCWZsYWdzID0gYmNtYV9hcmVhZDMyKGRldi0+ZGV2LT5iZGV2LCBCQ01BX0lPQ1RMKTsKKwlmbGFncyAmPSB+QkNNQV9JT0NUTF9GR0M7CisJYmNtYV9hd3JpdGUzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCwgZmxhZ3MpOworCXVkZWxheSgxKTsKK30KKworc3RhdGljIHZvaWQgYjQzX2JjbWFfd2lyZWxlc3NfY29yZV9yZXNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGJvb2wgZ21vZGUpCit7CisJYjQzX2RldmljZV9lbmFibGUoZGV2LCBCNDNfQkNNQV9JT0NUTF9QSFlfQ0xLRU4pOworCWJjbWFfY29yZV9zZXRfY2xvY2ttb2RlKGRldi0+ZGV2LT5iZGV2LCBCQ01BX0NMS01PREVfRkFTVCk7CisJYjQzX2JjbWFfcGh5X3Jlc2V0KGRldik7CisJYmNtYV9jb3JlX3BsbF9jdGwoZGV2LT5kZXYtPmJkZXYsIDB4MzAwLCAweDMwMDAwMDAsIHRydWUpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGI0M19zc2Jfd2lyZWxlc3NfY29yZV9yZXNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGJvb2wgZ21vZGUpCit7CisJc3RydWN0IHNzYl9kZXZpY2UgKnNkZXYgPSBkZXYtPmRldi0+c2RldjsKKwl1MzIgdG1zbG93OworCXUzMiBmbGFncyA9IDA7CisKKwlpZiAoZ21vZGUpCisJCWZsYWdzIHw9IEI0M19UTVNMT1dfR01PREU7CiAJZmxhZ3MgfD0gQjQzX1RNU0xPV19QSFlDTEtFTjsKIAlmbGFncyB8PSBCNDNfVE1TTE9XX1BIWVJFU0VUOwogCWlmIChkZXYtPnBoeS50eXBlID09IEI0M19QSFlUWVBFX04pCiAJCWZsYWdzIHw9IEI0M19UTVNMT1dfUEhZX0JBTkRXSURUSF8yME1IWjsgLyogTWFrZSAyMCBNSHogZGVmICovCi0Jc3NiX2RldmljZV9lbmFibGUoZGV2LT5zZGV2LCBmbGFncyk7CisJYjQzX2RldmljZV9lbmFibGUoZGV2LCBmbGFncyk7CiAJbXNsZWVwKDIpOwkJLyogV2FpdCBmb3IgdGhlIFBMTCB0byB0dXJuIG9uLiAqLwogCiAJLyogTm93IHRha2UgdGhlIFBIWSBvdXQgb2YgUmVzZXQgYWdhaW4gKi8KLQl0bXNsb3cgPSBzc2JfcmVhZDMyKGRldi0+c2RldiwgU1NCX1RNU0xPVyk7CisJdG1zbG93ID0gc3NiX3JlYWQzMihzZGV2LCBTU0JfVE1TTE9XKTsKIAl0bXNsb3cgfD0gU1NCX1RNU0xPV19GR0M7CiAJdG1zbG93ICY9IH5CNDNfVE1TTE9XX1BIWVJFU0VUOwotCXNzYl93cml0ZTMyKGRldi0+c2RldiwgU1NCX1RNU0xPVywgdG1zbG93KTsKLQlzc2JfcmVhZDMyKGRldi0+c2RldiwgU1NCX1RNU0xPVyk7CS8qIGZsdXNoICovCisJc3NiX3dyaXRlMzIoc2RldiwgU1NCX1RNU0xPVywgdG1zbG93KTsKKwlzc2JfcmVhZDMyKHNkZXYsIFNTQl9UTVNMT1cpOwkvKiBmbHVzaCAqLwogCW1zbGVlcCgxKTsKIAl0bXNsb3cgJj0gflNTQl9UTVNMT1dfRkdDOwotCXNzYl93cml0ZTMyKGRldi0+c2RldiwgU1NCX1RNU0xPVywgdG1zbG93KTsKLQlzc2JfcmVhZDMyKGRldi0+c2RldiwgU1NCX1RNU0xPVyk7CS8qIGZsdXNoICovCisJc3NiX3dyaXRlMzIoc2RldiwgU1NCX1RNU0xPVywgdG1zbG93KTsKKwlzc2JfcmVhZDMyKHNkZXYsIFNTQl9UTVNMT1cpOwkvKiBmbHVzaCAqLwogCW1zbGVlcCgxKTsKIH0KIAotdm9pZCBiNDNfd2lyZWxlc3NfY29yZV9yZXNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUzMiBmbGFncykKK3ZvaWQgYjQzX3dpcmVsZXNzX2NvcmVfcmVzZXQoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGdtb2RlKQogewogCXUzMiBtYWNjdGw7CiAKLQliNDNfc3NiX3dpcmVsZXNzX2NvcmVfcmVzZXQoZGV2LCBmbGFncyk7CisJc3dpdGNoIChkZXYtPmRldi0+YnVzX3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwljYXNlIEI0M19CVVNfQkNNQToKKwkJYjQzX2JjbWFfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIGdtb2RlKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCWNhc2UgQjQzX0JVU19TU0I6CisJCWI0M19zc2Jfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIGdtb2RlKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CiAKIAkvKiBUdXJuIEFuYWxvZyBPTiwgYnV0IG9ubHkgaWYgd2UgYWxyZWFkeSBrbm93IHRoZSBQSFktdHlwZS4KIAkgKiBUaGlzIHByb3RlY3RzIGFnYWluc3QgdmVyeSBlYXJseSBzZXR1cCB3aGVyZSB3ZSBkb24ndCBrbm93IHRoZQpAQCAtMTE4Myw3ICsxMjQ0LDcgQEAKIAogCW1hY2N0bCA9IGI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwpOwogCW1hY2N0bCAmPSB+QjQzX01BQ0NUTF9HTU9ERTsKLQlpZiAoZmxhZ3MgJiBCNDNfVE1TTE9XX0dNT0RFKQorCWlmIChnbW9kZSkKIAkJbWFjY3RsIHw9IEI0M19NQUNDVExfR01PREU7CiAJbWFjY3RsIHw9IEI0M19NQUNDVExfSUhSX0VOQUJMRUQ7CiAJYjQzX3dyaXRlMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwsIG1hY2N0bCk7CkBAIC0xMjIxLDcgKzEyODIsNyBAQAogewogCXUzMiBkdW1teTsKIAotCWlmIChkZXYtPnNkZXYtPmlkLnJldmlzaW9uIDwgNSkKKwlpZiAoZGV2LT5kZXYtPmNvcmVfcmV2IDwgNSkKIAkJcmV0dXJuOwogCS8qIFJlYWQgYWxsIGVudHJpZXMgZnJvbSB0aGUgbWljcm9jb2RlIFRYc3RhdHVzIEZJRk8KIAkgKiBhbmQgdGhyb3cgdGhlbSBhd2F5LgpAQCAtMTQyNyw5ICsxNDg4LDkgQEAKIAogCS8qIEdldCB0aGUgbWFzayBvZiBhdmFpbGFibGUgYW50ZW5uYXMuICovCiAJaWYgKGRldi0+cGh5Lmdtb2RlKQotCQlhbnRlbm5hX21hc2sgPSBkZXYtPnNkZXYtPmJ1cy0+c3Byb20uYW50X2F2YWlsYWJsZV9iZzsKKwkJYW50ZW5uYV9tYXNrID0gZGV2LT5kZXYtPmJ1c19zcHJvbS0+YW50X2F2YWlsYWJsZV9iZzsKIAllbHNlCi0JCWFudGVubmFfbWFzayA9IGRldi0+c2Rldi0+YnVzLT5zcHJvbS5hbnRfYXZhaWxhYmxlX2E7CisJCWFudGVubmFfbWFzayA9IGRldi0+ZGV2LT5idXNfc3Byb20tPmFudF9hdmFpbGFibGVfYTsKIAogCWlmICghKGFudGVubmFfbWFzayAmICgxIDw8IChhbnRlbm5hX25yIC0gMSkpKSkgewogCQkvKiBUaGlzIGFudGVubmEgaXMgbm90IGF2YWlsYWJsZS4gRmFsbCBiYWNrIHRvIGRlZmF1bHQuICovCkBAIC0xNjQ0LDcgKzE3MDUsNyBAQAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAJZGV2ID0gd2wtPmN1cnJlbnRfZGV2OwogCWlmIChsaWtlbHkoZGV2ICYmIChiNDNfc3RhdHVzKGRldikgPj0gQjQzX1NUQVRfSU5JVElBTElaRUQpKSkgewotCQlpZiAoZGV2LT5zZGV2LT5idXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfU0RJTykgeworCQlpZiAoYjQzX2J1c19ob3N0X2lzX3NkaW8oZGV2LT5kZXYpKSB7CiAJCQkvKiB3bC0+bXV0ZXggaXMgZW5vdWdoLiAqLwogCQkJYjQzX2RvX2JlYWNvbl91cGRhdGVfdHJpZ2dlcl93b3JrKGRldik7CiAJCQltbWlvd2IoKTsKQEAgLTE2ODksNyArMTc1MCw3IEBACiBzdGF0aWMgdm9pZCBiNDNfc2V0X2JlYWNvbl9pbnQoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgYmVhY29uX2ludCkKIHsKIAliNDNfdGltZV9sb2NrKGRldik7Ci0JaWYgKGRldi0+c2Rldi0+aWQucmV2aXNpb24gPj0gMykgeworCWlmIChkZXYtPmRldi0+Y29yZV9yZXYgPj0gMykgewogCQliNDNfd3JpdGUzMihkZXYsIEI0M19NTUlPX1RTRl9DRlBfUkVQLCAoYmVhY29uX2ludCA8PCAxNikpOwogCQliNDNfd3JpdGUzMihkZXYsIEI0M19NTUlPX1RTRl9DRlBfU1RBUlQsIChiZWFjb25faW50IDw8IDEwKSk7CiAJfSBlbHNlIHsKQEAgLTE5MjMsNyArMTk4NCw3IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAlyZWFzb24gJj0gZGV2LT5pcnFfbWFzazsKIAlpZiAoIXJlYXNvbikKLQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlkZXYtPmRtYV9yZWFzb25bMF0gPSBiNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fRE1BMF9SRUFTT04pCiAJICAgICYgMHgwMDAxREMwMDsKQEAgLTIwNjMsNyArMjEyNCw3IEBACiAJCUI0M19XQVJOX09OKDEpOwogCQlyZXR1cm4gLUVOT1NZUzsKIAl9Ci0JZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmYmxvYiwgY3R4LT5md25hbWUsIGN0eC0+ZGV2LT5zZGV2LT5kZXYpOworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmJsb2IsIGN0eC0+ZnduYW1lLCBjdHgtPmRldi0+ZGV2LT5kZXYpOwogCWlmIChlcnIgPT0gLUVOT0VOVCkgewogCQlzbnByaW50ZihjdHgtPmVycm9yc1tjdHgtPnJlcV90eXBlXSwKIAkJCSBzaXplb2YoY3R4LT5lcnJvcnNbY3R4LT5yZXFfdHlwZV0pLApAQCAtMjExMywyNiArMjE3NCw0OCBAQAogewogCXN0cnVjdCBiNDNfd2xkZXYgKmRldiA9IGN0eC0+ZGV2OwogCXN0cnVjdCBiNDNfZmlybXdhcmUgKmZ3ID0gJmN0eC0+ZGV2LT5mdzsKLQljb25zdCB1OCByZXYgPSBjdHgtPmRldi0+c2Rldi0+aWQucmV2aXNpb247CisJY29uc3QgdTggcmV2ID0gY3R4LT5kZXYtPmRldi0+Y29yZV9yZXY7CiAJY29uc3QgY2hhciAqZmlsZW5hbWU7CiAJdTMyIHRtc2hpZ2g7CiAJaW50IGVycjsKIAorCS8qIEZpbGVzIGZvciBIVCBhbmQgTENOIHdlcmUgZm91bmQgYnkgdHJ5aW5nIG9uZSBieSBvbmUgKi8KKwogCS8qIEdldCBtaWNyb2NvZGUgKi8KLQlpZiAoKHJldiA+PSA1KSAmJiAocmV2IDw9IDEwKSkKKwlpZiAoKHJldiA+PSA1KSAmJiAocmV2IDw9IDEwKSkgewogCQlmaWxlbmFtZSA9ICJ1Y29kZTUiOwotCWVsc2UgaWYgKChyZXYgPj0gMTEpICYmIChyZXYgPD0gMTIpKQorCX0gZWxzZSBpZiAoKHJldiA+PSAxMSkgJiYgKHJldiA8PSAxMikpIHsKIAkJZmlsZW5hbWUgPSAidWNvZGUxMSI7Ci0JZWxzZSBpZiAocmV2ID09IDEzKQorCX0gZWxzZSBpZiAocmV2ID09IDEzKSB7CiAJCWZpbGVuYW1lID0gInVjb2RlMTMiOwotCWVsc2UgaWYgKHJldiA9PSAxNCkKKwl9IGVsc2UgaWYgKHJldiA9PSAxNCkgewogCQlmaWxlbmFtZSA9ICJ1Y29kZTE0IjsKLQllbHNlIGlmIChyZXYgPT0gMTUpCisJfSBlbHNlIGlmIChyZXYgPT0gMTUpIHsKIAkJZmlsZW5hbWUgPSAidWNvZGUxNSI7Ci0JZWxzZSBpZiAoKHJldiA+PSAxNikgJiYgKHJldiA8PSAyMCkpCi0JCWZpbGVuYW1lID0gInVjb2RlMTZfbWltbyI7Ci0JZWxzZQotCQlnb3RvIGVycl9ub191Y29kZTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGRldi0+cGh5LnR5cGUpIHsKKwkJY2FzZSBCNDNfUEhZVFlQRV9OOgorCQkJaWYgKHJldiA+PSAxNikKKwkJCQlmaWxlbmFtZSA9ICJ1Y29kZTE2X21pbW8iOworCQkJZWxzZQorCQkJCWdvdG8gZXJyX25vX3Vjb2RlOworCQkJYnJlYWs7CisJCWNhc2UgQjQzX1BIWVRZUEVfSFQ6CisJCQlpZiAocmV2ID09IDI5KQorCQkJCWZpbGVuYW1lID0gInVjb2RlMjlfbWltbyI7CisJCQllbHNlCisJCQkJZ290byBlcnJfbm9fdWNvZGU7CisJCQlicmVhazsKKwkJY2FzZSBCNDNfUEhZVFlQRV9MQ046CisJCQlpZiAocmV2ID09IDI0KQorCQkJCWZpbGVuYW1lID0gInVjb2RlMjRfbWltbyI7CisJCQllbHNlCisJCQkJZ290byBlcnJfbm9fdWNvZGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyX25vX3Vjb2RlOworCQl9CisJfQogCWVyciA9IGI0M19kb19yZXF1ZXN0X2Z3KGN0eCwgZmlsZW5hbWUsICZmdy0+dWNvZGUpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2xvYWQ7CkBAIC0yMTU3LDcgKzIyNDAsNyBAQAogCXN3aXRjaCAoZGV2LT5waHkudHlwZSkgewogCWNhc2UgQjQzX1BIWVRZUEVfQToKIAkJaWYgKChyZXYgPj0gNSkgJiYgKHJldiA8PSAxMCkpIHsKLQkJCXRtc2hpZ2ggPSBzc2JfcmVhZDMyKGRldi0+c2RldiwgU1NCX1RNU0hJR0gpOworCQkJdG1zaGlnaCA9IHNzYl9yZWFkMzIoZGV2LT5kZXYtPnNkZXYsIFNTQl9UTVNISUdIKTsKIAkJCWlmICh0bXNoaWdoICYgQjQzX1RNU0hJR0hfSEFWRV8yR0haX1BIWSkKIAkJCQlmaWxlbmFtZSA9ICJhMGcxaW5pdHZhbHM1IjsKIAkJCWVsc2UKQEAgLTIxOTEsNiArMjI3NCwxOCBAQAogCQllbHNlCiAJCQlnb3RvIGVycl9ub19pbml0dmFsczsKIAkJYnJlYWs7CisJY2FzZSBCNDNfUEhZVFlQRV9IVDoKKwkJaWYgKHJldiA9PSAyOSkKKwkJCWZpbGVuYW1lID0gImh0MGluaXR2YWxzMjkiOworCQllbHNlCisJCQlnb3RvIGVycl9ub19pbml0dmFsczsKKwkJYnJlYWs7CisJY2FzZSBCNDNfUEhZVFlQRV9MQ046CisJCWlmIChyZXYgPT0gMjQpCisJCQlmaWxlbmFtZSA9ICJsY24waW5pdHZhbHMyNCI7CisJCWVsc2UKKwkJCWdvdG8gZXJyX25vX2luaXR2YWxzOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlnb3RvIGVycl9ub19pbml0dmFsczsKIAl9CkBAIC0yMjAyLDcgKzIyOTcsNyBAQAogCXN3aXRjaCAoZGV2LT5waHkudHlwZSkgewogCWNhc2UgQjQzX1BIWVRZUEVfQToKIAkJaWYgKChyZXYgPj0gNSkgJiYgKHJldiA8PSAxMCkpIHsKLQkJCXRtc2hpZ2ggPSBzc2JfcmVhZDMyKGRldi0+c2RldiwgU1NCX1RNU0hJR0gpOworCQkJdG1zaGlnaCA9IHNzYl9yZWFkMzIoZGV2LT5kZXYtPnNkZXYsIFNTQl9UTVNISUdIKTsKIAkJCWlmICh0bXNoaWdoICYgQjQzX1RNU0hJR0hfSEFWRV8yR0haX1BIWSkKIAkJCQlmaWxlbmFtZSA9ICJhMGcxYnNpbml0dmFsczUiOwogCQkJZWxzZQpAQCAtMjIzOCw2ICsyMzMzLDE4IEBACiAJCWVsc2UKIAkJCWdvdG8gZXJyX25vX2luaXR2YWxzOwogCQlicmVhazsKKwljYXNlIEI0M19QSFlUWVBFX0hUOgorCQlpZiAocmV2ID09IDI5KQorCQkJZmlsZW5hbWUgPSAiaHQwYnNpbml0dmFsczI5IjsKKwkJZWxzZQorCQkJZ290byBlcnJfbm9faW5pdHZhbHM7CisJCWJyZWFrOworCWNhc2UgQjQzX1BIWVRZUEVfTENOOgorCQlpZiAocmV2ID09IDI0KQorCQkJZmlsZW5hbWUgPSAibGNuMGJzaW5pdHZhbHMyNCI7CisJCWVsc2UKKwkJCWdvdG8gZXJyX25vX2luaXR2YWxzOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlnb3RvIGVycl9ub19pbml0dmFsczsKIAl9CkBAIC0yNDQ4LDcgKzI1NTUsNyBAQAogCiAJc25wcmludGYod2lwaHktPmZ3X3ZlcnNpb24sIHNpemVvZih3aXBoeS0+ZndfdmVyc2lvbiksICIldS4ldSIsCiAJCQlkZXYtPmZ3LnJldiwgZGV2LT5mdy5wYXRjaCk7Ci0Jd2lwaHktPmh3X3ZlcnNpb24gPSBkZXYtPnNkZXYtPmlkLmNvcmVpZDsKKwl3aXBoeS0+aHdfdmVyc2lvbiA9IGRldi0+ZGV2LT5jb3JlX2lkOwogCiAJaWYgKGI0M19pc19vbGRfdHhoZHJfZm9ybWF0KGRldikpIHsKIAkJLyogV2UncmUgb3ZlciB0aGUgZGVhZGxpbmUsIGJ1dCB3ZSBrZWVwIHN1cHBvcnQgZm9yIG9sZCBmdwpAQCAtMjU2Niw3ICsyNjczLDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCBzc2JfZGV2aWNlICpiNDNfc3NiX2dwaW9fZGV2KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CisJc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+ZGV2LT5zZGV2LT5idXM7CiAKICNpZmRlZiBDT05GSUdfU1NCX0RSSVZFUl9QQ0lDT1JFCiAJcmV0dXJuIChidXMtPmNoaXBjby5kZXYgPyBidXMtPmNoaXBjby5kZXYgOiBidXMtPnBjaWNvcmUuZGV2KTsKQEAgLTI1ODgsNyArMjY5NSw3IEBACiAKIAltYXNrID0gMHgwMDAwMDAxRjsKIAlzZXQgPSAweDAwMDAwMDBGOwotCWlmIChkZXYtPnNkZXYtPmJ1cy0+Y2hpcF9pZCA9PSAweDQzMDEpIHsKKwlpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0MzAxKSB7CiAJCW1hc2sgfD0gMHgwMDYwOwogCQlzZXQgfD0gMHgwMDYwOwogCX0KQEAgLTI1OTksMjEgKzI3MDYsMzQgQEAKIAkJbWFzayB8PSAweDAxODA7CiAJCXNldCB8PSAweDAxODA7CiAJfQotCWlmIChkZXYtPnNkZXYtPmJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfUEFDVFJMKSB7CisJaWYgKGRldi0+ZGV2LT5idXNfc3Byb20tPmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1BBQ1RSTCkgewogCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0dQSU9fTUFTSywKIAkJCSAgICBiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fR1BJT19NQVNLKQogCQkJICAgIHwgMHgwMjAwKTsKIAkJbWFzayB8PSAweDAyMDA7CiAJCXNldCB8PSAweDAyMDA7CiAJfQotCWlmIChkZXYtPnNkZXYtPmlkLnJldmlzaW9uID49IDIpCisJaWYgKGRldi0+ZGV2LT5jb3JlX3JldiA+PSAyKQogCQltYXNrIHw9IDB4MDAxMDsJLyogRklYTUU6IFRoaXMgaXMgcmVkdW5kYW50LiAqLwogCi0JZ3Bpb2RldiA9IGI0M19zc2JfZ3Bpb19kZXYoZGV2KTsKLQlpZiAoZ3Bpb2RldikKLQkJc3NiX3dyaXRlMzIoZ3Bpb2RldiwgQjQzX0dQSU9fQ09OVFJPTCwKLQkJCSAgICAoc3NiX3JlYWQzMihncGlvZGV2LCBCNDNfR1BJT19DT05UUk9MKQotCQkJICAgICAmIG1hc2spIHwgc2V0KTsKKwlzd2l0Y2ggKGRldi0+ZGV2LT5idXNfdHlwZSkgeworI2lmZGVmIENPTkZJR19CNDNfQkNNQQorCWNhc2UgQjQzX0JVU19CQ01BOgorCQliY21hX2NjX3dyaXRlMzIoJmRldi0+ZGV2LT5iZGV2LT5idXMtPmRydl9jYywgQkNNQV9DQ19HUElPQ1RMLAorCQkJCShiY21hX2NjX3JlYWQzMigmZGV2LT5kZXYtPmJkZXYtPmJ1cy0+ZHJ2X2NjLAorCQkJCQlCQ01BX0NDX0dQSU9DVEwpICYgbWFzaykgfCBzZXQpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CNDNfU1NCCisJY2FzZSBCNDNfQlVTX1NTQjoKKwkJZ3Bpb2RldiA9IGI0M19zc2JfZ3Bpb19kZXYoZGV2KTsKKwkJaWYgKGdwaW9kZXYpCisJCQlzc2Jfd3JpdGUzMihncGlvZGV2LCBCNDNfR1BJT19DT05UUk9MLAorCQkJCSAgICAoc3NiX3JlYWQzMihncGlvZGV2LCBCNDNfR1BJT19DT05UUk9MKQorCQkJCSAgICAmIG1hc2spIHwgc2V0KTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI2MjMsOSArMjc0MywyMSBAQAogewogCXN0cnVjdCBzc2JfZGV2aWNlICpncGlvZGV2OwogCi0JZ3Bpb2RldiA9IGI0M19zc2JfZ3Bpb19kZXYoZGV2KTsKLQlpZiAoZ3Bpb2RldikKLQkJc3NiX3dyaXRlMzIoZ3Bpb2RldiwgQjQzX0dQSU9fQ09OVFJPTCwgMCk7CisJc3dpdGNoIChkZXYtPmRldi0+YnVzX3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwljYXNlIEI0M19CVVNfQkNNQToKKwkJYmNtYV9jY193cml0ZTMyKCZkZXYtPmRldi0+YmRldi0+YnVzLT5kcnZfY2MsIEJDTUFfQ0NfR1BJT0NUTCwKKwkJCQkwKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCWNhc2UgQjQzX0JVU19TU0I6CisJCWdwaW9kZXYgPSBiNDNfc3NiX2dwaW9fZGV2KGRldik7CisJCWlmIChncGlvZGV2KQorCQkJc3NiX3dyaXRlMzIoZ3Bpb2RldiwgQjQzX0dQSU9fQ09OVFJPTCwgMCk7CisJCWJyZWFrOworI2VuZGlmCisJfQogfQogCiAvKiBodHRwOi8vYmNtLXNwZWNzLnNpcHNvbHV0aW9ucy5uZXQvRW5hYmxlTWFjICovCkBAIC0yNjk3LDEyICsyODI5LDMwIEBACiAvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL01hY1BoeUNsa1NldCAqLwogdm9pZCBiNDNfbWFjX3BoeV9jbG9ja19zZXQoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIG9uKQogewotCXUzMiB0bXNsb3cgPSBzc2JfcmVhZDMyKGRldi0+c2RldiwgU1NCX1RNU0xPVyk7Ci0JaWYgKG9uKQotCQl0bXNsb3cgfD0gQjQzX1RNU0xPV19NQUNQSFlDTEtFTjsKLQllbHNlCi0JCXRtc2xvdyAmPSB+QjQzX1RNU0xPV19NQUNQSFlDTEtFTjsKLQlzc2Jfd3JpdGUzMihkZXYtPnNkZXYsIFNTQl9UTVNMT1csIHRtc2xvdyk7CisJdTMyIHRtcDsKKworCXN3aXRjaCAoZGV2LT5kZXYtPmJ1c190eXBlKSB7CisjaWZkZWYgQ09ORklHX0I0M19CQ01BCisJY2FzZSBCNDNfQlVTX0JDTUE6CisJCXRtcCA9IGJjbWFfYXJlYWQzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCk7CisJCWlmIChvbikKKwkJCXRtcCB8PSBCNDNfQkNNQV9JT0NUTF9NQUNQSFlDTEtFTjsKKwkJZWxzZQorCQkJdG1wICY9IH5CNDNfQkNNQV9JT0NUTF9NQUNQSFlDTEtFTjsKKwkJYmNtYV9hd3JpdGUzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCwgdG1wKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCWNhc2UgQjQzX0JVU19TU0I6CisJCXRtcCA9IHNzYl9yZWFkMzIoZGV2LT5kZXYtPnNkZXYsIFNTQl9UTVNMT1cpOworCQlpZiAob24pCisJCQl0bXAgfD0gQjQzX1RNU0xPV19NQUNQSFlDTEtFTjsKKwkJZWxzZQorCQkJdG1wICY9IH5CNDNfVE1TTE9XX01BQ1BIWUNMS0VOOworCQlzc2Jfd3JpdGUzMihkZXYtPmRldi0+c2RldiwgU1NCX1RNU0xPVywgdG1wKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGI0M19hZGp1c3Rfb3Btb2RlKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKQEAgLTI3NDEsMTUgKzI4OTEsMTUgQEAKIAkvKiBXb3JrYXJvdW5kOiBPbiBvbGQgaGFyZHdhcmUgdGhlIEhXLU1BQy1hZGRyZXNzLWZpbHRlcgogCSAqIGRvZXNuJ3Qgd29yayBwcm9wZXJseSwgc28gYWx3YXlzIHJ1biBwcm9taXNjIGluIGZpbHRlcgogCSAqIGl0IGluIHNvZnR3YXJlLiAqLwotCWlmIChkZXYtPnNkZXYtPmlkLnJldmlzaW9uIDw9IDQpCisJaWYgKGRldi0+ZGV2LT5jb3JlX3JldiA8PSA0KQogCQljdGwgfD0gQjQzX01BQ0NUTF9QUk9NSVNDOwogCiAJYjQzX3dyaXRlMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwsIGN0bCk7CiAKIAljZnBfcHJldGJ0dCA9IDI7CiAJaWYgKChjdGwgJiBCNDNfTUFDQ1RMX0lORlJBKSAmJiAhKGN0bCAmIEI0M19NQUNDVExfQVApKSB7Ci0JCWlmIChkZXYtPnNkZXYtPmJ1cy0+Y2hpcF9pZCA9PSAweDQzMDYgJiYKLQkJICAgIGRldi0+c2Rldi0+YnVzLT5jaGlwX3JldiA9PSAzKQorCQlpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0MzA2ICYmCisJCSAgICBkZXYtPmRldi0+Y2hpcF9yZXYgPT0gMykKIAkJCWNmcF9wcmV0YnR0ID0gMTAwOwogCQllbHNlCiAJCQljZnBfcHJldGJ0dCA9IDUwOwpAQCAtMjkwNyw3ICszMDU3LDcgQEAKIAkJYjQzX3dyaXRlMTYoZGV2LCAweDAwNUUsIHZhbHVlMTYpOwogCX0KIAliNDNfd3JpdGUzMihkZXYsIDB4MDEwMCwgMHgwMTAwMDAwMCk7Ci0JaWYgKGRldi0+c2Rldi0+aWQucmV2aXNpb24gPCA1KQorCWlmIChkZXYtPmRldi0+Y29yZV9yZXYgPCA1KQogCQliNDNfd3JpdGUzMihkZXYsIDB4MDEwQywgMHgwMTAwMDAwMCk7CiAKIAliNDNfd3JpdGUzMihkZXYsIEI0M19NTUlPX01BQ0NUTCwgYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX01BQ0NUTCkKQEAgLTI5MjIsNyArMzA3Miw3IEBACiAJLyogSW5pdGlhbGx5IHNldCB0aGUgd2lyZWxlc3Mgb3BlcmF0aW9uIG1vZGUuICovCiAJYjQzX2FkanVzdF9vcG1vZGUoZGV2KTsKIAotCWlmIChkZXYtPnNkZXYtPmlkLnJldmlzaW9uIDwgMykgeworCWlmIChkZXYtPmRldi0+Y29yZV9yZXYgPCAzKSB7CiAJCWI0M193cml0ZTE2KGRldiwgMHgwNjBFLCAweDAwMDApOwogCQliNDNfd3JpdGUxNihkZXYsIDB4MDYxMCwgMHg4MDAwKTsKIAkJYjQzX3dyaXRlMTYoZGV2LCAweDA2MDQsIDB4MDAwMCk7CkBAIC0yOTQxLDggKzMwOTEsMjAgQEAKIAogCWI0M19tYWNfcGh5X2Nsb2NrX3NldChkZXYsIHRydWUpOwogCi0JYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QT1dFUlVQX0RFTEFZLAotCQkgICAgZGV2LT5zZGV2LT5idXMtPmNoaXBjby5mYXN0X3B3cnVwX2RlbGF5KTsKKwlzd2l0Y2ggKGRldi0+ZGV2LT5idXNfdHlwZSkgeworI2lmZGVmIENPTkZJR19CNDNfQkNNQQorCWNhc2UgQjQzX0JVU19CQ01BOgorCQkvKiBGSVhNRTogMHhFNzQgaXMgcXVpdGUgY29tbW9uLCBidXQgc2hvdWxkIGJlIHJlYWQgZnJvbSBDQyAqLworCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1BPV0VSVVBfREVMQVksIDB4RTc0KTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCWNhc2UgQjQzX0JVU19TU0I6CisJCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUE9XRVJVUF9ERUxBWSwKKwkJCSAgICBkZXYtPmRldi0+c2Rldi0+YnVzLT5jaGlwY28uZmFzdF9wd3J1cF9kZWxheSk7CisJCWJyZWFrOworI2VuZGlmCisJfQogCiAJZXJyID0gMDsKIAliNDNkYmcoZGV2LT53bCwgIkNoaXAgaW5pdGlhbGl6ZWRcbiIpOwpAQCAtMzEwNSw3ICszMjY3LDcgQEAKIAliNDNfc2htX3dyaXRlMzIoZGV2LCBCNDNfU0hNX1NIQVJFRCwgMCwgYmFja3VwMCk7CiAJYjQzX3NobV93cml0ZTMyKGRldiwgQjQzX1NITV9TSEFSRUQsIDQsIGJhY2t1cDQpOwogCi0JaWYgKChkZXYtPnNkZXYtPmlkLnJldmlzaW9uID49IDMpICYmIChkZXYtPnNkZXYtPmlkLnJldmlzaW9uIDw9IDEwKSkgeworCWlmICgoZGV2LT5kZXYtPmNvcmVfcmV2ID49IDMpICYmIChkZXYtPmRldi0+Y29yZV9yZXYgPD0gMTApKSB7CiAJCS8qIFRoZSAzMmJpdCByZWdpc3RlciBzaGFkb3dzIHRoZSB0d28gMTZiaXQgcmVnaXN0ZXJzCiAJCSAqIHdpdGggdXBkYXRlIHNpZGVlZmZlY3RzLiBWYWxpZGF0ZSB0aGlzLiAqLwogCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1RTRl9DRlBfU1RBUlQsIDB4QUFBQSk7CkBAIC0zNDU4LDIxICszNjIwLDMzIEBACiAKIHN0YXRpYyB2b2lkIGI0M19wdXRfcGh5X2ludG9fcmVzZXQoc3RydWN0IGI0M193bGRldiAqZGV2KQogewotCXN0cnVjdCBzc2JfZGV2aWNlICpzZGV2ID0gZGV2LT5zZGV2OwotCXUzMiB0bXNsb3c7CisJdTMyIHRtcDsKIAotCXRtc2xvdyA9IHNzYl9yZWFkMzIoc2RldiwgU1NCX1RNU0xPVyk7Ci0JdG1zbG93ICY9IH5CNDNfVE1TTE9XX0dNT0RFOwotCXRtc2xvdyB8PSBCNDNfVE1TTE9XX1BIWVJFU0VUOwotCXRtc2xvdyB8PSBTU0JfVE1TTE9XX0ZHQzsKLQlzc2Jfd3JpdGUzMihzZGV2LCBTU0JfVE1TTE9XLCB0bXNsb3cpOwotCW1zbGVlcCgxKTsKKwlzd2l0Y2ggKGRldi0+ZGV2LT5idXNfdHlwZSkgeworI2lmZGVmIENPTkZJR19CNDNfQkNNQQorCWNhc2UgQjQzX0JVU19CQ01BOgorCQliNDNlcnIoZGV2LT53bCwKKwkJICAgICAgICJQdXR0aW5nIFBIWSBpbnRvIHJlc2V0IG5vdCBzdXBwb3J0ZWQgb24gQkNNQVxuIik7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0I0M19TU0IKKwljYXNlIEI0M19CVVNfU1NCOgorCQl0bXAgPSBzc2JfcmVhZDMyKGRldi0+ZGV2LT5zZGV2LCBTU0JfVE1TTE9XKTsKKwkJdG1wICY9IH5CNDNfVE1TTE9XX0dNT0RFOworCQl0bXAgfD0gQjQzX1RNU0xPV19QSFlSRVNFVDsKKwkJdG1wIHw9IFNTQl9UTVNMT1dfRkdDOworCQlzc2Jfd3JpdGUzMihkZXYtPmRldi0+c2RldiwgU1NCX1RNU0xPVywgdG1wKTsKKwkJbXNsZWVwKDEpOwogCi0JdG1zbG93ID0gc3NiX3JlYWQzMihzZGV2LCBTU0JfVE1TTE9XKTsKLQl0bXNsb3cgJj0gflNTQl9UTVNMT1dfRkdDOwotCXRtc2xvdyB8PSBCNDNfVE1TTE9XX1BIWVJFU0VUOwotCXNzYl93cml0ZTMyKHNkZXYsIFNTQl9UTVNMT1csIHRtc2xvdyk7Ci0JbXNsZWVwKDEpOworCQl0bXAgPSBzc2JfcmVhZDMyKGRldi0+ZGV2LT5zZGV2LCBTU0JfVE1TTE9XKTsKKwkJdG1wICY9IH5TU0JfVE1TTE9XX0ZHQzsKKwkJdG1wIHw9IEI0M19UTVNMT1dfUEhZUkVTRVQ7CisJCXNzYl93cml0ZTMyKGRldi0+ZGV2LT5zZGV2LCBTU0JfVE1TTE9XLCB0bXApOworCQltc2xlZXAoMSk7CisKKwkJYnJlYWs7CisjZW5kaWYKKwl9CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICpiYW5kX3RvX3N0cmluZyhlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCkBAIC0zOTU0LDcgKzQxMjgsNyBAQAogCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBkZXZpY2UuICovCiAJYjQzX3NldF9zdGF0dXMoZGV2LCBCNDNfU1RBVF9JTklUSUFMSVpFRCk7Ci0JaWYgKGRldi0+c2Rldi0+YnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1NESU8pIHsKKwlpZiAoYjQzX2J1c19ob3N0X2lzX3NkaW8oZGV2LT5kZXYpKSB7CiAJCS8qIHdsLT5tdXRleCBpcyBsb2NrZWQuIFRoYXQgaXMgZW5vdWdoLiAqLwogCQliNDNfd3JpdGUzMihkZXYsIEI0M19NTUlPX0dFTl9JUlFfTUFTSywgMCk7CiAJCWI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19HRU5fSVJRX01BU0spOwkvKiBGbHVzaCAqLwpAQCAtMzk2NywxMSArNDE0MSwxMSBAQAogCS8qIFN5bmNocm9uaXplIGFuZCBmcmVlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMuIFVubG9jayB0byBhdm9pZCBkZWFkbG9ja3MuICovCiAJb3JpZ19kZXYgPSBkZXY7CiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwotCWlmIChkZXYtPnNkZXYtPmJ1cy0+YnVzdHlwZSA9PSBTU0JfQlVTVFlQRV9TRElPKSB7CisJaWYgKGI0M19idXNfaG9zdF9pc19zZGlvKGRldi0+ZGV2KSkgewogCQliNDNfc2Rpb19mcmVlX2lycShkZXYpOwogCX0gZWxzZSB7Ci0JCXN5bmNocm9uaXplX2lycShkZXYtPnNkZXYtPmlycSk7Ci0JCWZyZWVfaXJxKGRldi0+c2Rldi0+aXJxLCBkZXYpOworCQlzeW5jaHJvbml6ZV9pcnEoZGV2LT5kZXYtPmlycSk7CisJCWZyZWVfaXJxKGRldi0+ZGV2LT5pcnEsIGRldik7CiAJfQogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAJZGV2ID0gd2wtPmN1cnJlbnRfZGV2OwpAQCAtNDAwNCwxOSArNDE3OCwxOSBAQAogCUI0M19XQVJOX09OKGI0M19zdGF0dXMoZGV2KSAhPSBCNDNfU1RBVF9JTklUSUFMSVpFRCk7CiAKIAlkcmFpbl90eHN0YXR1c19xdWV1ZShkZXYpOwotCWlmIChkZXYtPnNkZXYtPmJ1cy0+YnVzdHlwZSA9PSBTU0JfQlVTVFlQRV9TRElPKSB7CisJaWYgKGI0M19idXNfaG9zdF9pc19zZGlvKGRldi0+ZGV2KSkgewogCQllcnIgPSBiNDNfc2Rpb19yZXF1ZXN0X2lycShkZXYsIGI0M19zZGlvX2ludGVycnVwdF9oYW5kbGVyKTsKIAkJaWYgKGVycikgewogCQkJYjQzZXJyKGRldi0+d2wsICJDYW5ub3QgcmVxdWVzdCBTRElPIElSUVxuIik7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0gZWxzZSB7Ci0JCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGRldi0+c2Rldi0+aXJxLCBiNDNfaW50ZXJydXB0X2hhbmRsZXIsCisJCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGRldi0+ZGV2LT5pcnEsIGI0M19pbnRlcnJ1cHRfaGFuZGxlciwKIAkJCQkJICAgYjQzX2ludGVycnVwdF90aHJlYWRfaGFuZGxlciwKIAkJCQkJICAgSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBkZXYpOwogCQlpZiAoZXJyKSB7CiAJCQliNDNlcnIoZGV2LT53bCwgIkNhbm5vdCByZXF1ZXN0IElSUS0lZFxuIiwKLQkJCSAgICAgICBkZXYtPnNkZXYtPmlycSk7CisJCQkgICAgICAgZGV2LT5kZXYtPmlycSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTQwODMsOSArNDI1NywyMSBAQAogCQkJdW5zdXBwb3J0ZWQgPSAxOwogCQlicmVhazsKICNlbmRpZgorI2lmZGVmIENPTkZJR19CNDNfUEhZX0hUCisJY2FzZSBCNDNfUEhZVFlQRV9IVDoKKwkJaWYgKHBoeV9yZXYgPiAxKQorCQkJdW5zdXBwb3J0ZWQgPSAxOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CNDNfUEhZX0xDTgorCWNhc2UgQjQzX1BIWVRZUEVfTENOOgorCQlpZiAocGh5X3JldiA+IDEpCisJCQl1bnN1cHBvcnRlZCA9IDE7CisJCWJyZWFrOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJdW5zdXBwb3J0ZWQgPSAxOwotCX07CisJfQogCWlmICh1bnN1cHBvcnRlZCkgewogCQliNDNlcnIoZGV2LT53bCwgIkZPVU5EIFVOU1VQUE9SVEVEIFBIWSAiCiAJCSAgICAgICAiKEFuYWxvZyAldSwgVHlwZSAldSwgUmV2aXNpb24gJXUpXG4iLApAQCAtNDA5NiwyMiArNDI4Miw0MiBAQAogCSAgICAgICBhbmFsb2dfdHlwZSwgcGh5X3R5cGUsIHBoeV9yZXYpOwogCiAJLyogR2V0IFJBRElPIHZlcnNpb25pbmcgKi8KLQlpZiAoZGV2LT5zZGV2LT5idXMtPmNoaXBfaWQgPT0gMHg0MzE3KSB7Ci0JCWlmIChkZXYtPnNkZXYtPmJ1cy0+Y2hpcF9yZXYgPT0gMCkKLQkJCXRtcCA9IDB4MzIwNTAxN0Y7Ci0JCWVsc2UgaWYgKGRldi0+c2Rldi0+YnVzLT5jaGlwX3JldiA9PSAxKQotCQkJdG1wID0gMHg0MjA1MDE3RjsKLQkJZWxzZQotCQkJdG1wID0gMHg1MjA1MDE3RjsKKwlpZiAoZGV2LT5kZXYtPmNvcmVfcmV2ID49IDI0KSB7CisJCXUxNiByYWRpbzI0WzNdOworCisJCWZvciAodG1wID0gMDsgdG1wIDwgMzsgdG1wKyspIHsKKwkJCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUkFESU8yNF9DT05UUk9MLCB0bXApOworCQkJcmFkaW8yNFt0bXBdID0gYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX1JBRElPMjRfREFUQSk7CisJCX0KKworCQkvKiBCcm9hZGNvbSB1c2VzICJpZCIgZm9yIG91ciAidmVyIiBhbmQgaGFzIHNlcGFyYXRlZCAidmVyIiAqLworCQkvKiByYWRpb192ZXIgPSAocmFkaW8yNFswXSAmIDB4RjApID4+IDQ7ICovCisKKwkJcmFkaW9fbWFudWYgPSAweDE3RjsKKwkJcmFkaW9fdmVyID0gKHJhZGlvMjRbMl0gPDwgOCkgfCByYWRpbzI0WzFdOworCQlyYWRpb19yZXYgPSAocmFkaW8yNFswXSAmIDB4Rik7CiAJfSBlbHNlIHsKLQkJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19SQURJT19DT05UUk9MLCBCNDNfUkFESU9DVExfSUQpOwotCQl0bXAgPSBiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fUkFESU9fREFUQV9MT1cpOwotCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1JBRElPX0NPTlRST0wsIEI0M19SQURJT0NUTF9JRCk7Ci0JCXRtcCB8PSAodTMyKWI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19SQURJT19EQVRBX0hJR0gpIDw8IDE2OworCQlpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0MzE3KSB7CisJCQlpZiAoZGV2LT5kZXYtPmNoaXBfcmV2ID09IDApCisJCQkJdG1wID0gMHgzMjA1MDE3RjsKKwkJCWVsc2UgaWYgKGRldi0+ZGV2LT5jaGlwX3JldiA9PSAxKQorCQkJCXRtcCA9IDB4NDIwNTAxN0Y7CisJCQllbHNlCisJCQkJdG1wID0gMHg1MjA1MDE3RjsKKwkJfSBlbHNlIHsKKwkJCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUkFESU9fQ09OVFJPTCwKKwkJCQkgICAgQjQzX1JBRElPQ1RMX0lEKTsKKwkJCXRtcCA9IGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19SQURJT19EQVRBX0xPVyk7CisJCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1JBRElPX0NPTlRST0wsCisJCQkJICAgIEI0M19SQURJT0NUTF9JRCk7CisJCQl0bXAgfD0gKHUzMiliNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fUkFESU9fREFUQV9ISUdIKQorCQkJCTw8IDE2OworCQl9CisJCXJhZGlvX21hbnVmID0gKHRtcCAmIDB4MDAwMDBGRkYpOworCQlyYWRpb192ZXIgPSAodG1wICYgMHgwRkZGRjAwMCkgPj4gMTI7CisJCXJhZGlvX3JldiA9ICh0bXAgJiAweEYwMDAwMDAwKSA+PiAyODsKIAl9Ci0JcmFkaW9fbWFudWYgPSAodG1wICYgMHgwMDAwMEZGRik7Ci0JcmFkaW9fdmVyID0gKHRtcCAmIDB4MEZGRkYwMDApID4+IDEyOwotCXJhZGlvX3JldiA9ICh0bXAgJiAweEYwMDAwMDAwKSA+PiAyODsKKwogCWlmIChyYWRpb19tYW51ZiAhPSAweDE3RiAvKiBCcm9hZGNvbSAqLykKIAkJdW5zdXBwb3J0ZWQgPSAxOwogCXN3aXRjaCAocGh5X3R5cGUpIHsKQEAgLTQxMzksNiArNDM0NSwxNCBAQAogCQlpZiAocmFkaW9fdmVyICE9IDB4MjA2MiAmJiByYWRpb192ZXIgIT0gMHgyMDYzKQogCQkJdW5zdXBwb3J0ZWQgPSAxOwogCQlicmVhazsKKwljYXNlIEI0M19QSFlUWVBFX0hUOgorCQlpZiAocmFkaW9fdmVyICE9IDB4MjA1OSkKKwkJCXVuc3VwcG9ydGVkID0gMTsKKwkJYnJlYWs7CisJY2FzZSBCNDNfUEhZVFlQRV9MQ046CisJCWlmIChyYWRpb192ZXIgIT0gMHgyMDY0KQorCQkJdW5zdXBwb3J0ZWQgPSAxOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlCNDNfV0FSTl9PTigxKTsKIAl9CkBAIC00MjA0LDcgKzQ0MTgsNyBAQAogCiBzdGF0aWMgdm9pZCBiNDNfYmx1ZXRvb3RoX2NvZXh0X2VuYWJsZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSAmZGV2LT5zZGV2LT5idXMtPnNwcm9tOworCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gZGV2LT5kZXYtPmJ1c19zcHJvbTsKIAl1NjQgaGY7CiAKIAlpZiAoIW1vZHBhcmFtX2J0Y29leCkKQEAgLTQyMzEsMTYgKzQ0NDUsMjEgQEAKIAogc3RhdGljIHZvaWQgYjQzX2ltY2ZnbG9fdGltZW91dHNfd29ya2Fyb3VuZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+c2Rldi0+YnVzOworCXN0cnVjdCBzc2JfYnVzICpidXM7CiAJdTMyIHRtcDsKIAorCWlmIChkZXYtPmRldi0+YnVzX3R5cGUgIT0gQjQzX0JVU19TU0IpCisJCXJldHVybjsKKworCWJ1cyA9IGRldi0+ZGV2LT5zZGV2LT5idXM7CisKIAlpZiAoKGJ1cy0+Y2hpcF9pZCA9PSAweDQzMTEgJiYgYnVzLT5jaGlwX3JldiA9PSAyKSB8fAogCSAgICAoYnVzLT5jaGlwX2lkID09IDB4NDMxMikpIHsKLQkJdG1wID0gc3NiX3JlYWQzMihkZXYtPnNkZXYsIFNTQl9JTUNGR0xPKTsKKwkJdG1wID0gc3NiX3JlYWQzMihkZXYtPmRldi0+c2RldiwgU1NCX0lNQ0ZHTE8pOwogCQl0bXAgJj0gflNTQl9JTUNGR0xPX1JFUVRPOwogCQl0bXAgJj0gflNTQl9JTUNGR0xPX1NFUlRPOwogCQl0bXAgfD0gMHgzOwotCQlzc2Jfd3JpdGUzMihkZXYtPnNkZXYsIFNTQl9JTUNGR0xPLCB0bXApOworCQlzc2Jfd3JpdGUzMihkZXYtPmRldi0+c2RldiwgU1NCX0lNQ0ZHTE8sIHRtcCk7CiAJCXNzYl9jb21taXRfc2V0dGluZ3MoYnVzKTsKIAl9CiB9CkBAIC00MzEwLDM2ICs0NTI5LDQ1IEBACiAJCWRldi0+d2wtPmN1cnJlbnRfYmVhY29uID0gTlVMTDsKIAl9CiAKLQlzc2JfZGV2aWNlX2Rpc2FibGUoZGV2LT5zZGV2LCAwKTsKLQlzc2JfYnVzX21heV9wb3dlcmRvd24oZGV2LT5zZGV2LT5idXMpOworCWI0M19kZXZpY2VfZGlzYWJsZShkZXYsIDApOworCWI0M19idXNfbWF5X3Bvd2VyZG93bihkZXYpOwogfQogCiAvKiBJbml0aWFsaXplIGEgd2lyZWxlc3MgY29yZSAqLwogc3RhdGljIGludCBiNDNfd2lyZWxlc3NfY29yZV9pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7Ci0Jc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSAmYnVzLT5zcHJvbTsKKwlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9IGRldi0+ZGV2LT5idXNfc3Byb207CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKIAlpbnQgZXJyOwogCXU2NCBoZjsKLQl1MzIgdG1wOwogCiAJQjQzX1dBUk5fT04oYjQzX3N0YXR1cyhkZXYpICE9IEI0M19TVEFUX1VOSU5JVCk7CiAKLQllcnIgPSBzc2JfYnVzX3Bvd2VydXAoYnVzLCAwKTsKKwllcnIgPSBiNDNfYnVzX3Bvd2VydXAoZGV2LCAwKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQlpZiAoIXNzYl9kZXZpY2VfaXNfZW5hYmxlZChkZXYtPnNkZXYpKSB7Ci0JCXRtcCA9IHBoeS0+Z21vZGUgPyBCNDNfVE1TTE9XX0dNT0RFIDogMDsKLQkJYjQzX3dpcmVsZXNzX2NvcmVfcmVzZXQoZGV2LCB0bXApOwotCX0KKwlpZiAoIWI0M19kZXZpY2VfaXNfZW5hYmxlZChkZXYpKQorCQliNDNfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIHBoeS0+Z21vZGUpOwogCiAJLyogUmVzZXQgYWxsIGRhdGEgc3RydWN0dXJlcy4gKi8KIAlzZXR1cF9zdHJ1Y3Rfd2xkZXZfZm9yX2luaXQoZGV2KTsKIAlwaHktPm9wcy0+cHJlcGFyZV9zdHJ1Y3RzKGRldik7CiAKIAkvKiBFbmFibGUgSVJRIHJvdXRpbmcgdG8gdGhpcyBkZXZpY2UuICovCi0Jc3NiX3BjaWNvcmVfZGV2X2lycXZlY3NfZW5hYmxlKCZidXMtPnBjaWNvcmUsIGRldi0+c2Rldik7CisJc3dpdGNoIChkZXYtPmRldi0+YnVzX3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwljYXNlIEI0M19CVVNfQkNNQToKKwkJYmNtYV9jb3JlX3BjaV9pcnFfY3RsKCZkZXYtPmRldi0+YmRldi0+YnVzLT5kcnZfcGNpLAorCQkJCSAgICAgIGRldi0+ZGV2LT5iZGV2LCB0cnVlKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCWNhc2UgQjQzX0JVU19TU0I6CisJCXNzYl9wY2ljb3JlX2Rldl9pcnF2ZWNzX2VuYWJsZSgmZGV2LT5kZXYtPnNkZXYtPmJ1cy0+cGNpY29yZSwKKwkJCQkJICAgICAgIGRldi0+ZGV2LT5zZGV2KTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CiAKIAliNDNfaW1jZmdsb190aW1lb3V0c193b3JrYXJvdW5kKGRldik7CiAJYjQzX2JsdWV0b290aF9jb2V4dF9kaXNhYmxlKGRldik7CkBAIC00MzUyLDcgKzQ1ODAsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2J1c2Rvd247CiAJYjQzX3NobV93cml0ZTE2KGRldiwgQjQzX1NITV9TSEFSRUQsCi0JCQlCNDNfU0hNX1NIX1dMQ09SRVJFViwgZGV2LT5zZGV2LT5pZC5yZXZpc2lvbik7CisJCQlCNDNfU0hNX1NIX1dMQ09SRVJFViwgZGV2LT5kZXYtPmNvcmVfcmV2KTsKIAloZiA9IGI0M19oZl9yZWFkKGRldik7CiAJaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKSB7CiAJCWhmIHw9IEI0M19IRl9TWU1XOwpAQCAtNDM3MCw4ICs0NTk4LDkgQEAKIAlpZiAoc3Byb20tPmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1hUQUxfTk9TTE9XKQogCQloZiB8PSBCNDNfSEZfRFNDUlE7IC8qIERpc2FibGUgc2xvd2Nsb2NrIHJlcXVlc3RzIGZyb20gdWNvZGUuICovCiAjaWZkZWYgQ09ORklHX1NTQl9EUklWRVJfUENJQ09SRQotCWlmICgoYnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1BDSSkgJiYKLQkgICAgKGJ1cy0+cGNpY29yZS5kZXYtPmlkLnJldmlzaW9uIDw9IDEwKSkKKwlpZiAoZGV2LT5kZXYtPmJ1c190eXBlID09IEI0M19CVVNfU1NCICYmCisJICAgIGRldi0+ZGV2LT5zZGV2LT5idXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfUENJICYmCisJICAgIGRldi0+ZGV2LT5zZGV2LT5idXMtPnBjaWNvcmUuZGV2LT5pZC5yZXZpc2lvbiA8PSAxMCkKIAkJaGYgfD0gQjQzX0hGX1BDSVNDVzsgLyogUENJIHNsb3cgY2xvY2sgd29ya2Fyb3VuZC4gKi8KICNlbmRpZgogCWhmICY9IH5CNDNfSEZfU0tDRlBVUDsKQEAgLTQzOTksOCArNDYyOCw4IEBACiAJLyogTWF4aW11bSBDb250ZW50aW9uIFdpbmRvdyAqLwogCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0NSQVRDSCwgQjQzX1NITV9TQ19NQVhDT05ULCAweDNGRik7CiAKLQlpZiAoKGRldi0+c2Rldi0+YnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1BDTUNJQSkgfHwKLQkgICAgKGRldi0+c2Rldi0+YnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1NESU8pIHx8CisJaWYgKGI0M19idXNfaG9zdF9pc19wY21jaWEoZGV2LT5kZXYpIHx8CisJICAgIGI0M19idXNfaG9zdF9pc19zZGlvKGRldi0+ZGV2KSB8fAogCSAgICBkZXYtPnVzZV9waW8pIHsKIAkJZGV2LT5fX3VzaW5nX3Bpb190cmFuc2ZlcnMgPSAxOwogCQllcnIgPSBiNDNfcGlvX2luaXQoZGV2KTsKQEAgLTQ0MTQsNyArNDY0Myw3IEBACiAJYjQzX3NldF9zeW50aF9wdV9kZWxheShkZXYsIDEpOwogCWI0M19ibHVldG9vdGhfY29leHRfZW5hYmxlKGRldik7CiAKLQlzc2JfYnVzX3Bvd2VydXAoYnVzLCAhKHNwcm9tLT5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9YVEFMX05PU0xPVykpOworCWI0M19idXNfcG93ZXJ1cChkZXYsICEoc3Byb20tPmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1hUQUxfTk9TTE9XKSk7CiAJYjQzX3VwbG9hZF9jYXJkX21hY2FkZHJlc3MoZGV2KTsKIAliNDNfc2VjdXJpdHlfaW5pdChkZXYpOwogCkBAIC00NDMxLDcgKzQ2NjAsNyBAQAogZXJyX2NoaXBfZXhpdDoKIAliNDNfY2hpcF9leGl0KGRldik7CiBlcnJfYnVzZG93bjoKLQlzc2JfYnVzX21heV9wb3dlcmRvd24oYnVzKTsKKwliNDNfYnVzX21heV9wb3dlcmRvd24oZGV2KTsKIAlCNDNfV0FSTl9PTihiNDNfc3RhdHVzKGRldikgIT0gQjQzX1NUQVRfVU5JTklUKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNDczNywxMSArNDk2NiwxMCBAQAogc3RhdGljIGludCBiNDNfd2lyZWxlc3NfY29yZV9hdHRhY2goc3RydWN0IGI0M193bGRldiAqZGV2KQogewogCXN0cnVjdCBiNDNfd2wgKndsID0gZGV2LT53bDsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSAoYnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1BDSSkgPyBidXMtPmhvc3RfcGNpIDogTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CiAJaW50IGVycjsKLQlib29sIGhhdmVfMmdoel9waHkgPSAwLCBoYXZlXzVnaHpfcGh5ID0gMDsKIAl1MzIgdG1wOworCWJvb2wgaGF2ZV8yZ2h6X3BoeSA9IDAsIGhhdmVfNWdoel9waHkgPSAwOwogCiAJLyogRG8gTk9UIGRvIGFueSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gaGVyZS4KIAkgKiBEbyBpdCBpbiB3aXJlbGVzc19jb3JlX2luaXQoKSBpbnN0ZWFkLgpAQCAtNDc1MCwyNSArNDk3OCw0MiBAQAogCSAqIHRoYXQgaW4gY29yZV9pbml0KCksIHRvby4KIAkgKi8KIAotCWVyciA9IHNzYl9idXNfcG93ZXJ1cChidXMsIDApOworI2lmZGVmIENPTkZJR19CNDNfU1NCCisJaWYgKGRldi0+ZGV2LT5idXNfdHlwZSA9PSBCNDNfQlVTX1NTQiAmJgorCSAgICBkZXYtPmRldi0+c2Rldi0+YnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1BDSSkKKwkJcGRldiA9IGRldi0+ZGV2LT5zZGV2LT5idXMtPmhvc3RfcGNpOworI2VuZGlmCisKKwllcnIgPSBiNDNfYnVzX3Bvd2VydXAoZGV2LCAwKTsKIAlpZiAoZXJyKSB7CiAJCWI0M2Vycih3bCwgIkJ1cyBwb3dlcnVwIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KLQkvKiBHZXQgdGhlIFBIWSB0eXBlLiAqLwotCWlmIChkZXYtPnNkZXYtPmlkLnJldmlzaW9uID49IDUpIHsKLQkJdTMyIHRtc2hpZ2g7CiAKLQkJdG1zaGlnaCA9IHNzYl9yZWFkMzIoZGV2LT5zZGV2LCBTU0JfVE1TSElHSCk7Ci0JCWhhdmVfMmdoel9waHkgPSAhISh0bXNoaWdoICYgQjQzX1RNU0hJR0hfSEFWRV8yR0haX1BIWSk7Ci0JCWhhdmVfNWdoel9waHkgPSAhISh0bXNoaWdoICYgQjQzX1RNU0hJR0hfSEFWRV81R0haX1BIWSk7Ci0JfSBlbHNlCi0JCUI0M19XQVJOX09OKDEpOworCS8qIEdldCB0aGUgUEhZIHR5cGUuICovCisJc3dpdGNoIChkZXYtPmRldi0+YnVzX3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwljYXNlIEI0M19CVVNfQkNNQToKKwkJdG1wID0gYmNtYV9hcmVhZDMyKGRldi0+ZGV2LT5iZGV2LCBCQ01BX0lPU1QpOworCQloYXZlXzJnaHpfcGh5ID0gISEodG1wICYgQjQzX0JDTUFfSU9TVF8yR19QSFkpOworCQloYXZlXzVnaHpfcGh5ID0gISEodG1wICYgQjQzX0JDTUFfSU9TVF81R19QSFkpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CNDNfU1NCCisJY2FzZSBCNDNfQlVTX1NTQjoKKwkJaWYgKGRldi0+ZGV2LT5jb3JlX3JldiA+PSA1KSB7CisJCQl0bXAgPSBzc2JfcmVhZDMyKGRldi0+ZGV2LT5zZGV2LCBTU0JfVE1TSElHSCk7CisJCQloYXZlXzJnaHpfcGh5ID0gISEodG1wICYgQjQzX1RNU0hJR0hfSEFWRV8yR0haX1BIWSk7CisJCQloYXZlXzVnaHpfcGh5ID0gISEodG1wICYgQjQzX1RNU0hJR0hfSEFWRV81R0haX1BIWSk7CisJCX0gZWxzZQorCQkJQjQzX1dBUk5fT04oMSk7CisJCWJyZWFrOworI2VuZGlmCisJfQogCiAJZGV2LT5waHkuZ21vZGUgPSBoYXZlXzJnaHpfcGh5OwogCWRldi0+cGh5LnJhZGlvX29uID0gMTsKLQl0bXAgPSBkZXYtPnBoeS5nbW9kZSA/IEI0M19UTVNMT1dfR01PREUgOiAwOwotCWI0M193aXJlbGVzc19jb3JlX3Jlc2V0KGRldiwgdG1wKTsKKwliNDNfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIGRldi0+cGh5Lmdtb2RlKTsKIAogCWVyciA9IGI0M19waHlfdmVyc2lvbmluZyhkZXYpOwogCWlmIChlcnIpCkBAIC00NzkwLDYgKzUwMzUsOCBAQAogI2VuZGlmCiAJCWNhc2UgQjQzX1BIWVRZUEVfRzoKIAkJY2FzZSBCNDNfUEhZVFlQRV9OOgorCQljYXNlIEI0M19QSFlUWVBFX0hUOgorCQljYXNlIEI0M19QSFlUWVBFX0xDTjoKIAkJCWhhdmVfMmdoel9waHkgPSAxOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC00ODE2LDggKzUwNjMsNyBAQAogCQlnb3RvIGVycl9wb3dlcmRvd247CiAKIAlkZXYtPnBoeS5nbW9kZSA9IGhhdmVfMmdoel9waHk7Ci0JdG1wID0gZGV2LT5waHkuZ21vZGUgPyBCNDNfVE1TTE9XX0dNT0RFIDogMDsKLQliNDNfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIHRtcCk7CisJYjQzX3dpcmVsZXNzX2NvcmVfcmVzZXQoZGV2LCBkZXYtPnBoeS5nbW9kZSk7CiAKIAllcnIgPSBiNDNfdmFsaWRhdGVfY2hpcGFjY2VzcyhkZXYpOwogCWlmIChlcnIpCkBAIC00ODMyLDggKzUwNzgsOCBAQAogCUlOSVRfV09SSygmZGV2LT5yZXN0YXJ0X3dvcmssIGI0M19jaGlwX3Jlc2V0KTsKIAogCWRldi0+cGh5Lm9wcy0+c3dpdGNoX2FuYWxvZyhkZXYsIDApOwotCXNzYl9kZXZpY2VfZGlzYWJsZShkZXYtPnNkZXYsIDApOwotCXNzYl9idXNfbWF5X3Bvd2VyZG93bihidXMpOworCWI0M19kZXZpY2VfZGlzYWJsZShkZXYsIDApOworCWI0M19idXNfbWF5X3Bvd2VyZG93bihkZXYpOwogCiBvdXQ6CiAJcmV0dXJuIGVycjsKQEAgLTQ4NDEsMTEgKzUwODcsMTEgQEAKIGVycl9waHlfZnJlZToKIAliNDNfcGh5X2ZyZWUoZGV2KTsKIGVycl9wb3dlcmRvd246Ci0Jc3NiX2J1c19tYXlfcG93ZXJkb3duKGJ1cyk7CisJYjQzX2J1c19tYXlfcG93ZXJkb3duKGRldik7CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgYjQzX29uZV9jb3JlX2RldGFjaChzdHJ1Y3Qgc3NiX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgYjQzX29uZV9jb3JlX2RldGFjaChzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldikKIHsKIAlzdHJ1Y3QgYjQzX3dsZGV2ICp3bGRldjsKIAlzdHJ1Y3QgYjQzX3dsICp3bDsKQEAgLTQ4NTMsMTcgKzUwOTksMTcgQEAKIAkvKiBEbyBub3QgY2FuY2VsIGllZWU4MDIxMS13b3JrcXVldWUgYmFzZWQgd29yayBoZXJlLgogCSAqIFNlZSBjb21tZW50IGluIGI0M19yZW1vdmUoKS4gKi8KIAotCXdsZGV2ID0gc3NiX2dldF9kcnZkYXRhKGRldik7CisJd2xkZXYgPSBiNDNfYnVzX2dldF93bGRldihkZXYpOwogCXdsID0gd2xkZXYtPndsOwogCWI0M19kZWJ1Z2ZzX3JlbW92ZV9kZXZpY2Uod2xkZXYpOwogCWI0M193aXJlbGVzc19jb3JlX2RldGFjaCh3bGRldik7CiAJbGlzdF9kZWwoJndsZGV2LT5saXN0KTsKIAl3bC0+bnJfZGV2cy0tOwotCXNzYl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCWI0M19idXNfc2V0X3dsZGV2KGRldiwgTlVMTCk7CiAJa2ZyZWUod2xkZXYpOwogfQogCi1zdGF0aWMgaW50IGI0M19vbmVfY29yZV9hdHRhY2goc3RydWN0IHNzYl9kZXZpY2UgKmRldiwgc3RydWN0IGI0M193bCAqd2wpCitzdGF0aWMgaW50IGI0M19vbmVfY29yZV9hdHRhY2goc3RydWN0IGI0M19idXNfZGV2ICpkZXYsIHN0cnVjdCBiNDNfd2wgKndsKQogewogCXN0cnVjdCBiNDNfd2xkZXYgKndsZGV2OwogCWludCBlcnIgPSAtRU5PTUVNOwpAQCAtNDg3Myw3ICs1MTE5LDcgQEAKIAkJZ290byBvdXQ7CiAKIAl3bGRldi0+dXNlX3BpbyA9IGI0M19tb2RwYXJhbV9waW87Ci0Jd2xkZXYtPnNkZXYgPSBkZXY7CisJd2xkZXYtPmRldiA9IGRldjsKIAl3bGRldi0+d2wgPSB3bDsKIAliNDNfc2V0X3N0YXR1cyh3bGRldiwgQjQzX1NUQVRfVU5JTklUKTsKIAl3bGRldi0+YmFkX2ZyYW1lc19wcmVlbXB0ID0gbW9kcGFyYW1fYmFkX2ZyYW1lc19wcmVlbXB0OwpAQCAtNDg4NSw3ICs1MTMxLDcgQEAKIAogCWxpc3RfYWRkKCZ3bGRldi0+bGlzdCwgJndsLT5kZXZsaXN0KTsKIAl3bC0+bnJfZGV2cysrOwotCXNzYl9zZXRfZHJ2ZGF0YShkZXYsIHdsZGV2KTsKKwliNDNfYnVzX3NldF93bGRldihkZXYsIHdsZGV2KTsKIAliNDNfZGVidWdmc19hZGRfZGV2aWNlKHdsZGV2KTsKIAogICAgICAgb3V0OgpAQCAtNDkyNiwxOSArNTE3MiwyMCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYjQzX3dpcmVsZXNzX2V4aXQoc3RydWN0IHNzYl9kZXZpY2UgKmRldiwgc3RydWN0IGI0M193bCAqd2wpCitzdGF0aWMgdm9pZCBiNDNfd2lyZWxlc3NfZXhpdChzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldiwgc3RydWN0IGI0M193bCAqd2wpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSB3bC0+aHc7CiAKLQlzc2Jfc2V0X2RldnR5cGVkYXRhKGRldiwgTlVMTCk7CisJc3NiX3NldF9kZXZ0eXBlZGF0YShkZXYtPnNkZXYsIE5VTEwpOwogCWllZWU4MDIxMV9mcmVlX2h3KGh3KTsKIH0KIAotc3RhdGljIHN0cnVjdCBiNDNfd2wgKmI0M193aXJlbGVzc19pbml0KHN0cnVjdCBzc2JfZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IGI0M193bCAqYjQzX3dpcmVsZXNzX2luaXQoc3RydWN0IGI0M19idXNfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSAmZGV2LT5idXMtPnNwcm9tOworCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gZGV2LT5idXNfc3Byb207CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJc3RydWN0IGI0M193bCAqd2w7CisJY2hhciBjaGlwX25hbWVbNl07CiAKIAlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2YoKndsKSwgJmI0M19od19vcHMpOwogCWlmICghaHcpIHsKQEAgLTQ5NzcsMjkgKzUyMjQsMTA1IEBACiAJSU5JVF9XT1JLKCZ3bC0+dHhfd29yaywgYjQzX3R4X3dvcmspOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJndsLT50eF9xdWV1ZSk7CiAKLQliNDNpbmZvKHdsLCAiQnJvYWRjb20gJTA0WCBXTEFOIGZvdW5kIChjb3JlIHJldmlzaW9uICV1KVxuIiwKLQkJZGV2LT5idXMtPmNoaXBfaWQsIGRldi0+aWQucmV2aXNpb24pOworCXNucHJpbnRmKGNoaXBfbmFtZSwgQVJSQVlfU0laRShjaGlwX25hbWUpLAorCQkgKGRldi0+Y2hpcF9pZCA+IDB4OTk5OSkgPyAiJWQiIDogIiUwNFgiLCBkZXYtPmNoaXBfaWQpOworCWI0M2luZm8od2wsICJCcm9hZGNvbSAlcyBXTEFOIGZvdW5kIChjb3JlIHJldmlzaW9uICV1KVxuIiwgY2hpcF9uYW1lLAorCQlkZXYtPmNvcmVfcmV2KTsKIAlyZXR1cm4gd2w7CiB9CiAKLXN0YXRpYyBpbnQgYjQzX3NzYl9wcm9iZShzdHJ1Y3Qgc3NiX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgc3NiX2RldmljZV9pZCAqaWQpCisjaWZkZWYgQ09ORklHX0I0M19CQ01BCitzdGF0aWMgaW50IGI0M19iY21hX3Byb2JlKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSkKIHsKKwlzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldjsKKwlzdHJ1Y3QgYjQzX3dsICp3bDsKKwlpbnQgZXJyOworCisJZGV2ID0gYjQzX2J1c19kZXZfYmNtYV9pbml0KGNvcmUpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdsID0gYjQzX3dpcmVsZXNzX2luaXQoZGV2KTsKKwlpZiAoSVNfRVJSKHdsKSkgeworCQllcnIgPSBQVFJfRVJSKHdsKTsKKwkJZ290byBiY21hX291dDsKKwl9CisKKwllcnIgPSBiNDNfb25lX2NvcmVfYXR0YWNoKGRldiwgd2wpOworCWlmIChlcnIpCisJCWdvdG8gYmNtYV9lcnJfd2lyZWxlc3NfZXhpdDsKKworCWVyciA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyh3bC0+aHcpOworCWlmIChlcnIpCisJCWdvdG8gYmNtYV9lcnJfb25lX2NvcmVfZGV0YWNoOworCWI0M19sZWRzX3JlZ2lzdGVyKHdsLT5jdXJyZW50X2Rldik7CisKK2JjbWFfb3V0OgorCXJldHVybiBlcnI7CisKK2JjbWFfZXJyX29uZV9jb3JlX2RldGFjaDoKKwliNDNfb25lX2NvcmVfZGV0YWNoKGRldik7CitiY21hX2Vycl93aXJlbGVzc19leGl0OgorCWllZWU4MDIxMV9mcmVlX2h3KHdsLT5odyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYjQzX2JjbWFfcmVtb3ZlKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSkKK3sKKwlzdHJ1Y3QgYjQzX3dsZGV2ICp3bGRldiA9IGJjbWFfZ2V0X2RydmRhdGEoY29yZSk7CisJc3RydWN0IGI0M193bCAqd2wgPSB3bGRldi0+d2w7CisKKwkvKiBXZSBtdXN0IGNhbmNlbCBhbnkgd29yayBoZXJlIGJlZm9yZSB1bnJlZ2lzdGVyaW5nIGZyb20gaWVlZTgwMjExLAorCSAqIGFzIHRoZSBpZWVlODAyMTEgdW5yZWcgd2lsbCBkZXN0cm95IHRoZSB3b3JrcXVldWUuICovCisJY2FuY2VsX3dvcmtfc3luYygmd2xkZXYtPnJlc3RhcnRfd29yayk7CisKKwkvKiBSZXN0b3JlIHRoZSBxdWV1ZXMgY291bnQgYmVmb3JlIHVucmVnaXN0ZXJpbmcsIGJlY2F1c2UgZmlybXdhcmUgZGV0ZWN0CisJICogbWlnaHQgaGF2ZSBtb2RpZmllZCBpdC4gUmVzdG9yaW5nIGlzIGltcG9ydGFudCwgc28gdGhlIG5ldHdvcmtpbmcKKwkgKiBzdGFjayBjYW4gcHJvcGVybHkgZnJlZSByZXNvdXJjZXMuICovCisJd2wtPmh3LT5xdWV1ZXMgPSB3bC0+bWFjODAyMTFfaW5pdGlhbGx5X3JlZ2lzdGVyZWRfcXVldWVzOworCWI0M19sZWRzX3N0b3Aod2xkZXYpOworCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHdsLT5odyk7CisKKwliNDNfb25lX2NvcmVfZGV0YWNoKHdsZGV2LT5kZXYpOworCisJYjQzX2xlZHNfdW5yZWdpc3Rlcih3bCk7CisKKwlpZWVlODAyMTFfZnJlZV9odyh3bC0+aHcpOworfQorCitzdGF0aWMgc3RydWN0IGJjbWFfZHJpdmVyIGI0M19iY21hX2RyaXZlciA9IHsKKwkubmFtZQkJPSBLQlVJTERfTU9ETkFNRSwKKwkuaWRfdGFibGUJPSBiNDNfYmNtYV90YmwsCisJLnByb2JlCQk9IGI0M19iY21hX3Byb2JlLAorCS5yZW1vdmUJCT0gYjQzX2JjbWFfcmVtb3ZlLAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0I0M19TU0IKK3N0YXRpYworaW50IGI0M19zc2JfcHJvYmUoc3RydWN0IHNzYl9kZXZpY2UgKnNkZXYsIGNvbnN0IHN0cnVjdCBzc2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYjQzX2J1c19kZXYgKmRldjsKIAlzdHJ1Y3QgYjQzX3dsICp3bDsKIAlpbnQgZXJyOwogCWludCBmaXJzdCA9IDA7CiAKLQl3bCA9IHNzYl9nZXRfZGV2dHlwZWRhdGEoZGV2KTsKKwlkZXYgPSBiNDNfYnVzX2Rldl9zc2JfaW5pdChzZGV2KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bCA9IHNzYl9nZXRfZGV2dHlwZWRhdGEoc2Rldik7CiAJaWYgKCF3bCkgewogCQkvKiBQcm9iaW5nIHRoZSBmaXJzdCBjb3JlLiBNdXN0IHNldHVwIGNvbW1vbiBzdHJ1Y3QgYjQzX3dsICovCiAJCWZpcnN0ID0gMTsKLQkJYjQzX3Nwcm9tX2ZpeHVwKGRldi0+YnVzKTsKKwkJYjQzX3Nwcm9tX2ZpeHVwKHNkZXYtPmJ1cyk7CiAJCXdsID0gYjQzX3dpcmVsZXNzX2luaXQoZGV2KTsKIAkJaWYgKElTX0VSUih3bCkpIHsKIAkJCWVyciA9IFBUUl9FUlIod2wpOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJc3NiX3NldF9kZXZ0eXBlZGF0YShkZXYsIHdsKTsKLQkJQjQzX1dBUk5fT04oc3NiX2dldF9kZXZ0eXBlZGF0YShkZXYpICE9IHdsKTsKKwkJc3NiX3NldF9kZXZ0eXBlZGF0YShzZGV2LCB3bCk7CisJCUI0M19XQVJOX09OKHNzYl9nZXRfZGV2dHlwZWRhdGEoc2RldikgIT0gd2wpOwogCX0KIAllcnIgPSBiNDNfb25lX2NvcmVfYXR0YWNoKGRldiwgd2wpOwogCWlmIChlcnIpCkBAIC01MDIzLDEwICs1MzQ2LDEwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgYjQzX3NzYl9yZW1vdmUoc3RydWN0IHNzYl9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGI0M19zc2JfcmVtb3ZlKHN0cnVjdCBzc2JfZGV2aWNlICpzZGV2KQogewotCXN0cnVjdCBiNDNfd2wgKndsID0gc3NiX2dldF9kZXZ0eXBlZGF0YShkZXYpOwotCXN0cnVjdCBiNDNfd2xkZXYgKndsZGV2ID0gc3NiX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGI0M193bCAqd2wgPSBzc2JfZ2V0X2RldnR5cGVkYXRhKHNkZXYpOworCXN0cnVjdCBiNDNfd2xkZXYgKndsZGV2ID0gc3NiX2dldF9kcnZkYXRhKHNkZXYpOwogCiAJLyogV2UgbXVzdCBjYW5jZWwgYW55IHdvcmsgaGVyZSBiZWZvcmUgdW5yZWdpc3RlcmluZyBmcm9tIGllZWU4MDIxMSwKIAkgKiBhcyB0aGUgaWVlZTgwMjExIHVucmVnIHdpbGwgZGVzdHJveSB0aGUgd29ya3F1ZXVlLiAqLwpAQCAtNTA0MiwxNyArNTM2NSwyNSBAQAogCQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyh3bC0+aHcpOwogCX0KIAotCWI0M19vbmVfY29yZV9kZXRhY2goZGV2KTsKKwliNDNfb25lX2NvcmVfZGV0YWNoKHdsZGV2LT5kZXYpOwogCiAJaWYgKGxpc3RfZW1wdHkoJndsLT5kZXZsaXN0KSkgewogCQliNDNfbGVkc191bnJlZ2lzdGVyKHdsKTsKIAkJLyogTGFzdCBjb3JlIG9uIHRoZSBjaGlwIHVucmVnaXN0ZXJlZC4KIAkJICogV2UgY2FuIGRlc3Ryb3kgY29tbW9uIHN0cnVjdCBiNDNfd2wuCiAJCSAqLwotCQliNDNfd2lyZWxlc3NfZXhpdChkZXYsIHdsKTsKKwkJYjQzX3dpcmVsZXNzX2V4aXQod2xkZXYtPmRldiwgd2wpOwogCX0KIH0KIAorc3RhdGljIHN0cnVjdCBzc2JfZHJpdmVyIGI0M19zc2JfZHJpdmVyID0geworCS5uYW1lCQk9IEtCVUlMRF9NT0ROQU1FLAorCS5pZF90YWJsZQk9IGI0M19zc2JfdGJsLAorCS5wcm9iZQkJPSBiNDNfc3NiX3Byb2JlLAorCS5yZW1vdmUJCT0gYjQzX3NzYl9yZW1vdmUsCit9OworI2VuZGlmIC8qIENPTkZJR19CNDNfU1NCICovCisKIC8qIFBlcmZvcm0gYSBoYXJkd2FyZSByZXNldC4gVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQuICovCiB2b2lkIGI0M19jb250cm9sbGVyX3Jlc3RhcnQoc3RydWN0IGI0M193bGRldiAqZGV2LCBjb25zdCBjaGFyICpyZWFzb24pCiB7CkBAIC01MDYzLDEzICs1Mzk0LDYgQEAKIAlpZWVlODAyMTFfcXVldWVfd29yayhkZXYtPndsLT5odywgJmRldi0+cmVzdGFydF93b3JrKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzc2JfZHJpdmVyIGI0M19zc2JfZHJpdmVyID0gewotCS5uYW1lCQk9IEtCVUlMRF9NT0ROQU1FLAotCS5pZF90YWJsZQk9IGI0M19zc2JfdGJsLAotCS5wcm9iZQkJPSBiNDNfc3NiX3Byb2JlLAotCS5yZW1vdmUJCT0gYjQzX3NzYl9yZW1vdmUsCi19OwotCiBzdGF0aWMgdm9pZCBiNDNfcHJpbnRfZHJpdmVyaW5mbyh2b2lkKQogewogCWNvbnN0IGNoYXIgKmZlYXRfcGNpID0gIiIsICpmZWF0X3BjbWNpYSA9ICIiLCAqZmVhdF9ucGh5ID0gIiIsCkBAIC01MTA4LDE0ICs1NDMyLDI3IEBACiAJZXJyID0gYjQzX3NkaW9faW5pdCgpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3BjbWNpYV9leGl0OwotCWVyciA9IHNzYl9kcml2ZXJfcmVnaXN0ZXIoJmI0M19zc2JfZHJpdmVyKTsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwllcnIgPSBiY21hX2RyaXZlcl9yZWdpc3RlcigmYjQzX2JjbWFfZHJpdmVyKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9zZGlvX2V4aXQ7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCWVyciA9IHNzYl9kcml2ZXJfcmVnaXN0ZXIoJmI0M19zc2JfZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9iY21hX2RyaXZlcl9leGl0OworI2VuZGlmCiAJYjQzX3ByaW50X2RyaXZlcmluZm8oKTsKIAogCXJldHVybiBlcnI7CiAKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorZXJyX2JjbWFfZHJpdmVyX2V4aXQ6CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwliY21hX2RyaXZlcl91bnJlZ2lzdGVyKCZiNDNfYmNtYV9kcml2ZXIpOwogZXJyX3NkaW9fZXhpdDoKKyNlbmRpZgogCWI0M19zZGlvX2V4aXQoKTsKIGVycl9wY21jaWFfZXhpdDoKIAliNDNfcGNtY2lhX2V4aXQoKTsKQEAgLTUxMjYsNyArNTQ2MywxMiBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYjQzX2V4aXQodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgogCXNzYl9kcml2ZXJfdW5yZWdpc3RlcigmYjQzX3NzYl9kcml2ZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0I0M19CQ01BCisJYmNtYV9kcml2ZXJfdW5yZWdpc3RlcigmYjQzX2JjbWFfZHJpdmVyKTsKKyNlbmRpZgogCWI0M19zZGlvX2V4aXQoKTsKIAliNDNfcGNtY2lhX2V4aXQoKTsKIAliNDNfZGVidWdmc19leGl0KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uaAppbmRleCBhMGQzMjdmLi44YzY4NGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmgKQEAgLTQsNyArNCw3IEBACiAKICAgQ29weXJpZ2h0IChjKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPiwKICAgICAgICAgICAgICAgICAgICAgIFN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+Ci0gICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAgICAgICAgICAgICAgICAgICAgIERhbm55IHZhbiBEeWsgPGt1Z2VsZmFuZ0BnZW50b28ub3JnPgogICAgICAgICAgICAgICAgICAgICAgQW5kcmVhcyBKYWdnaSA8YW5kcmVhcy5qYWdnaUB3YXRlcndhdmUuY2g+CiAKQEAgLTEyMSw3ICsxMjEsNyBAQAogCiB2b2lkIGI0M19kdW1teV90cmFuc21pc3Npb24oc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIG9mZG0sIGJvb2wgcGFfb24pOwogCi12b2lkIGI0M193aXJlbGVzc19jb3JlX3Jlc2V0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTMyIGZsYWdzKTsKK3ZvaWQgYjQzX3dpcmVsZXNzX2NvcmVfcmVzZXQoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGdtb2RlKTsKIAogdm9pZCBiNDNfY29udHJvbGxlcl9yZXN0YXJ0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgY29uc3QgY2hhciAqcmVhc29uKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BjbWNpYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BjbWNpYS5jCmluZGV4IDJjODQ2MWQuLjEyYjZiNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9wY21jaWEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGNtY2lhLmMKQEAgLTIsNyArMiw3IEBACiAKICAgQnJvYWRjb20gQjQzIHdpcmVsZXNzIGRyaXZlcgogCi0gIENvcHlyaWdodCAoYykgMjAwNyBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICBDb3B5cmlnaHQgKGMpIDIwMDcgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9hLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2EuYwppbmRleCBiMDFjOGNlLi5hNmMzODEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2EuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2EuYwpAQCAtNSw3ICs1LDcgQEAKIAogICBDb3B5cmlnaHQgKGMpIDIwMDUgTWFydGluIExhbmdlciA8bWFydGluLWxhbmdlckBnbXguZGU+LAogICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBTdGVmYW5vIEJyaXZpbyA8c3RlZmFuby5icml2aW9AcG9saW1pLml0PgotICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgRGFubnkgdmFuIER5ayA8a3VnZWxmYW5nQGdlbnRvby5vcmc+CiAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBBbmRyZWFzIEphZ2dpIDxhbmRyZWFzLmphZ2dpQHdhdGVyd2F2ZS5jaD4KIApAQCAtMjY1LDcgKzI2NSw2IEBACiAKIHZvaWQgYjQzX3BoeV9pbml0YShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+c2Rldi0+YnVzOwogCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CiAKIAkvKiBUaGlzIGxvd2xldmVsIEEtUEhZIGluaXQgaXMgYWxzbyBjYWxsZWQgZnJvbSBHLVBIWSBpbml0LgpAQCAtMjk2LDkgKzI5NSw5IEBACiAKIAkJYjQzX3JhZGlvX2luaXQyMDYwKGRldik7CiAKLQkJaWYgKChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0gU1NCX0JPQVJEVkVORE9SX0JDTSkgJiYKLQkJICAgICgoYnVzLT5ib2FyZGluZm8udHlwZSA9PSBTU0JfQk9BUkRfQlU0MzA2KSB8fAotCQkgICAgIChidXMtPmJvYXJkaW5mby50eXBlID09IFNTQl9CT0FSRF9CVTQzMDkpKSkgeworCQlpZiAoKGRldi0+ZGV2LT5ib2FyZF92ZW5kb3IgPT0gU1NCX0JPQVJEVkVORE9SX0JDTSkgJiYKKwkJICAgICgoZGV2LT5kZXYtPmJvYXJkX3R5cGUgPT0gU1NCX0JPQVJEX0JVNDMwNikgfHwKKwkJICAgICAoZGV2LT5kZXYtPmJvYXJkX3R5cGUgPT0gU1NCX0JPQVJEX0JVNDMwOSkpKSB7CiAJCQk7IC8vVE9ETzogQSBQSFkgTE8KIAkJfQogCkBAIC0zMTEsNyArMzEwLDcgQEAKIAl9CiAKIAlpZiAoKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKSAmJgotCSAgICAoZGV2LT5zZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1BBQ1RSTCkpIHsKKwkgICAgKGRldi0+ZGV2LT5idXNfc3Byb20tPmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1BBQ1RSTCkpIHsKIAkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX1BIWV9PRkRNKDB4NkUpLCAweEUwMDAsIDB4M0NGKTsKIAl9CiB9CkBAIC0zMjMsMTcgKzMyMiwxNyBAQAogCXN0cnVjdCBiNDNfcGh5X2EgKmFwaHkgPSBwaHktPmE7CiAJczE2IHBhYjAsIHBhYjEsIHBhYjI7CiAKLQlwYWIwID0gKHMxNikgKGRldi0+c2Rldi0+YnVzLT5zcHJvbS5wYTFiMCk7Ci0JcGFiMSA9IChzMTYpIChkZXYtPnNkZXYtPmJ1cy0+c3Byb20ucGExYjEpOwotCXBhYjIgPSAoczE2KSAoZGV2LT5zZGV2LT5idXMtPnNwcm9tLnBhMWIyKTsKKwlwYWIwID0gKHMxNikgKGRldi0+ZGV2LT5idXNfc3Byb20tPnBhMWIwKTsKKwlwYWIxID0gKHMxNikgKGRldi0+ZGV2LT5idXNfc3Byb20tPnBhMWIxKTsKKwlwYWIyID0gKHMxNikgKGRldi0+ZGV2LT5idXNfc3Byb20tPnBhMWIyKTsKIAogCWlmIChwYWIwICE9IDAgJiYgcGFiMSAhPSAwICYmIHBhYjIgIT0gMCAmJgogCSAgICBwYWIwICE9IC0xICYmIHBhYjEgIT0gLTEgJiYgcGFiMiAhPSAtMSkgewogCQkvKiBUaGUgcGFiWCB2YWx1ZXMgYXJlIHNldCBpbiBTUFJPTS4gVXNlIHRoZW0uICovCi0JCWlmICgoczgpIGRldi0+c2Rldi0+YnVzLT5zcHJvbS5pdHNzaV9hICE9IDAgJiYKLQkJICAgIChzOCkgZGV2LT5zZGV2LT5idXMtPnNwcm9tLml0c3NpX2EgIT0gLTEpCisJCWlmICgoczgpIGRldi0+ZGV2LT5idXNfc3Byb20tPml0c3NpX2EgIT0gMCAmJgorCQkgICAgKHM4KSBkZXYtPmRldi0+YnVzX3Nwcm9tLT5pdHNzaV9hICE9IC0xKQogCQkJYXBoeS0+dGd0X2lkbGVfdHNzaSA9Ci0JCQkgICAgKHM4KSAoZGV2LT5zZGV2LT5idXMtPnNwcm9tLml0c3NpX2EpOworCQkJICAgIChzOCkgKGRldi0+ZGV2LT5idXNfc3Byb20tPml0c3NpX2EpOwogCQllbHNlCiAJCQlhcGh5LT50Z3RfaWRsZV90c3NpID0gNjI7CiAJCWFwaHktPnRzc2kyZGJtID0gYjQzX2dlbmVyYXRlX2R5bl90c3NpMmRibV90YWIoZGV2LCBwYWIwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9jb21tb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfY29tbW9uLmMKaW5kZXggZTQ2YjJmNC4uMDdmMDA5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2NvbW1vbi5jCkBAIC01LDcgKzUsNyBAQAogCiAgIENvcHlyaWdodCAoYykgMjAwNSBNYXJ0aW4gTGFuZ2VyIDxtYXJ0aW4tbGFuZ2VyQGdteC5kZT4sCiAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+Ci0gIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBEYW5ueSB2YW4gRHlrIDxrdWdlbGZhbmdAZ2VudG9vLm9yZz4KICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEFuZHJlYXMgSmFnZ2kgPGFuZHJlYXMuamFnZ2lAd2F0ZXJ3YXZlLmNoPgogCkBAIC0zMSw2ICszMSw4IEBACiAjaW5jbHVkZSAicGh5X2EuaCIKICNpbmNsdWRlICJwaHlfbi5oIgogI2luY2x1ZGUgInBoeV9scC5oIgorI2luY2x1ZGUgInBoeV9odC5oIgorI2luY2x1ZGUgInBoeV9sY24uaCIKICNpbmNsdWRlICJiNDMuaCIKICNpbmNsdWRlICJtYWluLmgiCiAKQEAgLTU5LDYgKzYxLDE2IEBACiAJCXBoeS0+b3BzID0gJmI0M19waHlvcHNfbHA7CiAjZW5kaWYKIAkJYnJlYWs7CisJY2FzZSBCNDNfUEhZVFlQRV9IVDoKKyNpZmRlZiBDT05GSUdfQjQzX1BIWV9IVAorCQlwaHktPm9wcyA9ICZiNDNfcGh5b3BzX2h0OworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgQjQzX1BIWVRZUEVfTENOOgorI2lmZGVmIENPTkZJR19CNDNfUEhZX0xDTgorCQlwaHktPm9wcyA9ICZiNDNfcGh5b3BzX2xjbjsKKyNlbmRpZgorCQlicmVhazsKIAl9CiAJaWYgKEI0M19XQVJOX09OKCFwaHktPm9wcykpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTY4LDcgKzE4MCw3IEBACiAJQjQzX1dBUk5fT04oZGV2LT5waHkucGh5X2xvY2tlZCk7CiAJZGV2LT5waHkucGh5X2xvY2tlZCA9IDE7CiAjZW5kaWYKLQlCNDNfV0FSTl9PTihkZXYtPnNkZXYtPmlkLnJldmlzaW9uIDwgMyk7CisJQjQzX1dBUk5fT04oZGV2LT5kZXYtPmNvcmVfcmV2IDwgMyk7CiAKIAlpZiAoIWI0M19pc19tb2RlKGRldi0+d2wsIE5MODAyMTFfSUZUWVBFX0FQKSkKIAkJYjQzX3Bvd2VyX3NhdmluZ19jdGxfYml0cyhkZXYsIEI0M19QU19BV0FLRSk7CkBAIC0xODAsNyArMTkyLDcgQEAKIAlCNDNfV0FSTl9PTighZGV2LT5waHkucGh5X2xvY2tlZCk7CiAJZGV2LT5waHkucGh5X2xvY2tlZCA9IDA7CiAjZW5kaWYKLQlCNDNfV0FSTl9PTihkZXYtPnNkZXYtPmlkLnJldmlzaW9uIDwgMyk7CisJQjQzX1dBUk5fT04oZGV2LT5kZXYtPmNvcmVfcmV2IDwgMyk7CiAKIAlpZiAoIWI0M19pc19tb2RlKGRldi0+d2wsIE5MODAyMTFfSUZUWVBFX0FQKSkKIAkJYjQzX3Bvd2VyX3NhdmluZ19jdGxfYml0cyhkZXYsIDApOwpAQCAtMzY4LDggKzM4MCw4IEBACiAJLyogVGhlIG5leHQgY2hlY2sgd2lsbCBiZSBuZWVkZWQgaW4gdHdvIHNlY29uZHMsIG9yIGxhdGVyLiAqLwogCXBoeS0+bmV4dF90eHB3cl9jaGVja190aW1lID0gcm91bmRfamlmZmllcyhub3cgKyAoSFogKiAyKSk7CiAKLQlpZiAoKGRldi0+c2Rldi0+YnVzLT5ib2FyZGluZm8udmVuZG9yID09IFNTQl9CT0FSRFZFTkRPUl9CQ00pICYmCi0JICAgIChkZXYtPnNkZXYtPmJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JVNDMwNikpCisJaWYgKChkZXYtPmRldi0+Ym9hcmRfdmVuZG9yID09IFNTQl9CT0FSRFZFTkRPUl9CQ00pICYmCisJICAgIChkZXYtPmRldi0+Ym9hcmRfdHlwZSA9PSBTU0JfQk9BUkRfQlU0MzA2KSkKIAkJcmV0dXJuOyAvKiBObyBzb2Z0d2FyZSB0eHBvd2VyIGFkanVzdG1lbnQgbmVlZGVkICovCiAKIAlyZXN1bHQgPSBwaHktPm9wcy0+cmVjYWxjX3R4cG93ZXIoZGV2LCAhIShmbGFncyAmIEI0M19UWFBXUl9JR05PUkVfVFNTSSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9jb21tb24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfY29tbW9uLmgKaW5kZXggMjQwMWJlZS4uYWE3N2JhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2NvbW1vbi5oCkBAIC0xOTQsNiArMTk0LDggQEAKIHN0cnVjdCBiNDNfcGh5X2c7CiBzdHJ1Y3QgYjQzX3BoeV9uOwogc3RydWN0IGI0M19waHlfbHA7CitzdHJ1Y3QgYjQzX3BoeV9odDsKK3N0cnVjdCBiNDNfcGh5X2xjbjsKIAogc3RydWN0IGI0M19waHkgewogCS8qIEhhcmR3YXJlIG9wZXJhdGlvbiBjYWxsYmFja3MuICovCkBAIC0yMTYsNiArMjE4LDEwIEBACiAJCXN0cnVjdCBiNDNfcGh5X24gKm47CiAJCS8qIExQLVBIWSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogCQlzdHJ1Y3QgYjQzX3BoeV9scCAqbHA7CisJCS8qIEhULVBIWSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworCQlzdHJ1Y3QgYjQzX3BoeV9odCAqaHQ7CisJCS8qIExDTi1QSFkgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKwkJc3RydWN0IGI0M19waHlfbGNuICpsY247CiAJfTsKIAogCS8qIEJhbmQgc3VwcG9ydCBmbGFncy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfZy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9nLmMKaW5kZXggMTc1OGEyOC4uOGUxNTdiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9nLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9nLmMKQEAgLTUsNyArNSw3IEBACiAKICAgQ29weXJpZ2h0IChjKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPiwKICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgU3RlZmFubyBCcml2aW8gPHN0ZWZhbm8uYnJpdmlvQHBvbGltaS5pdD4KLSAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IERhbm55IHZhbiBEeWsgPGt1Z2VsZmFuZ0BnZW50b28ub3JnPgogICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQW5kcmVhcyBKYWdnaSA8YW5kcmVhcy5qYWdnaUB3YXRlcndhdmUuY2g+CiAKQEAgLTcxOCw3ICs3MTgsNyBAQAogCUI0M19XQVJOX09OKHBoeS0+dHlwZSAhPSBCNDNfUEhZVFlQRV9HKTsKIAogCWlmICghcGh5LT5nbW9kZSB8fAotCSAgICAhKGRldi0+c2Rldi0+YnVzLT5zcHJvbS5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9SU1NJKSkgeworCSAgICAhKGRldi0+ZGV2LT5idXNfc3Byb20tPmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1JTU0kpKSB7CiAJCXRtcDE2ID0gYjQzX25yc3NpX2h3X3JlYWQoZGV2LCAweDIwKTsKIAkJaWYgKHRtcDE2ID49IDB4MjApCiAJCQl0bXAxNiAtPSAweDQwOwpAQCAtMTExNCw3ICsxMTE0LDcgQEAKIHsKIAlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwogCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHkgPSBwaHktPmc7Ci0Jc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSAmKGRldi0+c2Rldi0+YnVzLT5zcHJvbSk7CisJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSBkZXYtPmRldi0+YnVzX3Nwcm9tOwogCiAJaWYgKCFwaHktPmdtb2RlKQogCQlyZXR1cm4gMDsKQEAgLTE0OTEsNyArMTQ5MSw2IEBACiAKIHN0YXRpYyB2b2lkIGI0M19waHlfaW5pdGI1KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKIAlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOwogCXUxNiBvZmZzZXQsIHZhbHVlOwpAQCAtMTUwMCw4ICsxNDk5LDggQEAKIAlpZiAocGh5LT5hbmFsb2cgPT0gMSkgewogCQliNDNfcmFkaW9fc2V0KGRldiwgMHgwMDdBLCAweDAwNTApOwogCX0KLQlpZiAoKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciAhPSBTU0JfQk9BUkRWRU5ET1JfQkNNKSAmJgotCSAgICAoYnVzLT5ib2FyZGluZm8udHlwZSAhPSBTU0JfQk9BUkRfQlU0MzA2KSkgeworCWlmICgoZGV2LT5kZXYtPmJvYXJkX3ZlbmRvciAhPSBTU0JfQk9BUkRWRU5ET1JfQkNNKSAmJgorCSAgICAoZGV2LT5kZXYtPmJvYXJkX3R5cGUgIT0gU1NCX0JPQVJEX0JVNDMwNikpIHsKIAkJdmFsdWUgPSAweDIxMjA7CiAJCWZvciAob2Zmc2V0ID0gMHgwMEE4OyBvZmZzZXQgPCAweDAwQzc7IG9mZnNldCsrKSB7CiAJCQliNDNfcGh5X3dyaXRlKGRldiwgb2Zmc2V0LCB2YWx1ZSk7CkBAIC0xNjIwLDcgKzE2MTksNyBAQAogCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUEsIDB4ODgpOwogCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUIsIDB4NkIpOwogCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUMsIDB4MEYpOwotCQlpZiAoZGV2LT5zZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX0FMVElRKSB7CisJCWlmIChkZXYtPmRldi0+YnVzX3Nwcm9tLT5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9BTFRJUSkgewogCQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDVELCAweEZBKTsKIAkJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1RSwgMHhEOCk7CiAJCX0gZWxzZSB7CkBAIC0xNzg3LDcgKzE3ODYsNyBAQAogCWI0M19waHlfc2V0KGRldiwgQjQzX1BIWV9SRk9WRVIsIDB4MDEwMCk7CiAJYjQzX3BoeV9tYXNrKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsIDB4Q0ZGRik7CiAKLQlpZiAoZGV2LT5zZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX0VYVExOQSkgeworCWlmIChkZXYtPmRldi0+YnVzX3Nwcm9tLT5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9FWFRMTkEpIHsKIAkJaWYgKHBoeS0+cmV2ID49IDcpIHsKIAkJCWI0M19waHlfc2V0KGRldiwgQjQzX1BIWV9SRk9WRVIsIDB4MDgwMCk7CiAJCQliNDNfcGh5X3NldChkZXYsIEI0M19QSFlfUkZPVkVSVkFMLCAweDgwMDApOwpAQCAtMTkyMiw3ICsxOTIxLDYgQEAKIC8qIEluaXRpYWxpemUgQi9HIFBIWSBwb3dlciBjb250cm9sICovCiBzdGF0aWMgdm9pZCBiNDNfcGh5X2luaXRfcGN0bChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+c2Rldi0+YnVzOwogCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CiAJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKIAlzdHJ1Y3QgYjQzX3JmYXR0IG9sZF9yZmF0dDsKQEAgLTE5MzEsOCArMTkyOSw4IEBACiAKIAlCNDNfV0FSTl9PTihwaHktPnR5cGUgIT0gQjQzX1BIWVRZUEVfRyk7CiAKLQlpZiAoKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNKSAmJgotCSAgICAoYnVzLT5ib2FyZGluZm8udHlwZSA9PSBTU0JfQk9BUkRfQlU0MzA2KSkKKwlpZiAoKGRldi0+ZGV2LT5ib2FyZF92ZW5kb3IgPT0gU1NCX0JPQVJEVkVORE9SX0JDTSkgJiYKKwkgICAgKGRldi0+ZGV2LT5ib2FyZF90eXBlID09IFNTQl9CT0FSRF9CVTQzMDYpKQogCQlyZXR1cm47CiAKIAliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDI4LCAweDgwMTgpOwpAQCAtMjA1Myw3ICsyMDUxLDcgQEAKIAlpZiAocGh5LT5yZXYgPj0gNikgewogCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfUEhZX0NDSygweDM2KSwgMHgwRkZGLCAoZ3BoeS0+bG9fY29udHJvbC0+dHhfYmlhcyA8PCAxMikpOwogCX0KLQlpZiAoZGV2LT5zZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1BBQ1RSTCkKKwlpZiAoZGV2LT5kZXYtPmJ1c19zcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfUEFDVFJMKQogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgyRSksIDB4ODA3NSk7CiAJZWxzZQogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgyRSksIDB4ODA3Rik7CkBAIC0yMDY2LDcgKzIwNjQsNyBAQAogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9MT19NQVNLLCAweDgwNzgpOwogCX0KIAotCWlmICghKGRldi0+c2Rldi0+YnVzLT5zcHJvbS5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9SU1NJKSkgeworCWlmICghKGRldi0+ZGV2LT5idXNfc3Byb20tPmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1JTU0kpKSB7CiAJCS8qIFRoZSBzcGVjcyBzdGF0ZSB0byB1cGRhdGUgdGhlIE5SU1NJIExUIHdpdGgKIAkJICogdGhlIHZhbHVlIDB4N0ZGRkZGRkYgaGVyZS4gSSB0aGluayB0aGF0IGlzIHNvbWUgd2VpcmQKIAkJICogY29tcGlsZXIgb3B0aW1pemF0aW9uIGluIHRoZSBvcmlnaW5hbCBkcml2ZXIuCkBAIC0yMDg4LDggKzIwODYsOCBAQAogCS8qIEZJWE1FOiBUaGUgc3BlYyBzYXlzIGluIHRoZSBmb2xsb3dpbmcgaWYsIHRoZSAwIHNob3VsZCBiZSByZXBsYWNlZAogCSAgICdpZiBPRkRNIG1heSBub3QgYmUgdXNlZCBpbiB0aGUgY3VycmVudCBsb2NhbGUnCiAJICAgYnV0IE9GRE0gaXMgbGVnYWwgZXZlcnl3aGVyZSAqLwotCWlmICgoZGV2LT5zZGV2LT5idXMtPmNoaXBfaWQgPT0gMHg0MzA2Ci0JICAgICAmJiBkZXYtPnNkZXYtPmJ1cy0+Y2hpcF9wYWNrYWdlID09IDIpIHx8IDApIHsKKwlpZiAoKGRldi0+ZGV2LT5jaGlwX2lkID09IDB4NDMwNgorCSAgICAgJiYgZGV2LT5kZXYtPmNoaXBfcGtnID09IDIpIHx8IDApIHsKIAkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX1BIWV9DUlMwLCAweEJGRkYpOwogCQliNDNfcGh5X21hc2soZGV2LCBCNDNfUEhZX09GRE0oMHhDMyksIDB4N0ZGRik7CiAJfQpAQCAtMjEwNSw3ICsyMTAzLDcgQEAKIAliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0NIQU5ORUwsIGNoYW5uZWwyZnJlcV9iZyhjaGFubmVsKSk7CiAKIAlpZiAoY2hhbm5lbCA9PSAxNCkgewotCQlpZiAoZGV2LT5zZGV2LT5idXMtPnNwcm9tLmNvdW50cnlfY29kZSA9PQorCQlpZiAoZGV2LT5kZXYtPmJ1c19zcHJvbS0+Y291bnRyeV9jb2RlID09CiAJCSAgICBTU0JfU1BST00xQ0NPREVfSkFQQU4pCiAJCQliNDNfaGZfd3JpdGUoZGV2LAogCQkJCSAgICAgYjQzX2hmX3JlYWQoZGV2KSAmIH5CNDNfSEZfQUNQUik7CkBAIC0yMTM2LDE3ICsyMTM0LDE3IEBACiBzdGF0aWMgdm9pZCBkZWZhdWx0X3JhZGlvX2F0dGVudWF0aW9uKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3QgYjQzX3JmYXR0ICpyZikKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CisJc3RydWN0IGI0M19idXNfZGV2ICpiZGV2ID0gZGV2LT5kZXY7CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKIAogCXJmLT53aXRoX3BhZG1peCA9IDA7CiAKLQlpZiAoYnVzLT5ib2FyZGluZm8udmVuZG9yID09IFNTQl9CT0FSRFZFTkRPUl9CQ00gJiYKLQkgICAgYnVzLT5ib2FyZGluZm8udHlwZSA9PSBTU0JfQk9BUkRfQkNNNDMwOUcpIHsKLQkJaWYgKGJ1cy0+Ym9hcmRpbmZvLnJldiA8IDB4NDMpIHsKKwlpZiAoZGV2LT5kZXYtPmJvYXJkX3ZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNICYmCisJICAgIGRldi0+ZGV2LT5ib2FyZF90eXBlID09IFNTQl9CT0FSRF9CQ000MzA5RykgeworCQlpZiAoZGV2LT5kZXYtPmJvYXJkX3JldiA8IDB4NDMpIHsKIAkJCXJmLT5hdHQgPSAyOwogCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKGJ1cy0+Ym9hcmRpbmZvLnJldiA8IDB4NTEpIHsKKwkJfSBlbHNlIGlmIChkZXYtPmRldi0+Ym9hcmRfcmV2IDwgMHg1MSkgewogCQkJcmYtPmF0dCA9IDM7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTIxNzIsMjEgKzIxNzAsMjEgQEAKIAkJCXJldHVybjsKIAkJY2FzZSAxOgogCQkJaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKSB7Ci0JCQkJaWYgKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNCi0JCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JDTTQzMDlHCi0JCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnJldiA+PSAzMCkKKwkJCQlpZiAoYmRldi0+Ym9hcmRfdmVuZG9yID09IFNTQl9CT0FSRFZFTkRPUl9CQ00KKwkJCQkgICAgJiYgYmRldi0+Ym9hcmRfdHlwZSA9PSBTU0JfQk9BUkRfQkNNNDMwOUcKKwkJCQkgICAgJiYgYmRldi0+Ym9hcmRfcmV2ID49IDMwKQogCQkJCQlyZi0+YXR0ID0gMzsKLQkJCQllbHNlIGlmIChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0KKwkJCQllbHNlIGlmIChiZGV2LT5ib2FyZF92ZW5kb3IgPT0KIAkJCQkJIFNTQl9CT0FSRFZFTkRPUl9CQ00KLQkJCQkJICYmIGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0KKwkJCQkJICYmIGJkZXYtPmJvYXJkX3R5cGUgPT0KIAkJCQkJIFNTQl9CT0FSRF9CVTQzMDYpCiAJCQkJCXJmLT5hdHQgPSAzOwogCQkJCWVsc2UKIAkJCQkJcmYtPmF0dCA9IDE7CiAJCQl9IGVsc2UgewotCQkJCWlmIChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0gU1NCX0JPQVJEVkVORE9SX0JDTQotCQkJCSAgICAmJiBidXMtPmJvYXJkaW5mby50eXBlID09IFNTQl9CT0FSRF9CQ000MzA5RwotCQkJCSAgICAmJiBidXMtPmJvYXJkaW5mby5yZXYgPj0gMzApCisJCQkJaWYgKGJkZXYtPmJvYXJkX3ZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNCisJCQkJICAgICYmIGJkZXYtPmJvYXJkX3R5cGUgPT0gU1NCX0JPQVJEX0JDTTQzMDlHCisJCQkJICAgICYmIGJkZXYtPmJvYXJkX3JldiA+PSAzMCkKIAkJCQkJcmYtPmF0dCA9IDc7CiAJCQkJZWxzZQogCQkJCQlyZi0+YXR0ID0gNjsKQEAgLTIxOTQsMTYgKzIxOTIsMTYgQEAKIAkJCXJldHVybjsKIAkJY2FzZSAyOgogCQkJaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKSB7Ci0JCQkJaWYgKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNCi0JCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JDTTQzMDlHCi0JCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnJldiA+PSAzMCkKKwkJCQlpZiAoYmRldi0+Ym9hcmRfdmVuZG9yID09IFNTQl9CT0FSRFZFTkRPUl9CQ00KKwkJCQkgICAgJiYgYmRldi0+Ym9hcmRfdHlwZSA9PSBTU0JfQk9BUkRfQkNNNDMwOUcKKwkJCQkgICAgJiYgYmRldi0+Ym9hcmRfcmV2ID49IDMwKQogCQkJCQlyZi0+YXR0ID0gMzsKLQkJCQllbHNlIGlmIChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0KKwkJCQllbHNlIGlmIChiZGV2LT5ib2FyZF92ZW5kb3IgPT0KIAkJCQkJIFNTQl9CT0FSRFZFTkRPUl9CQ00KLQkJCQkJICYmIGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0KKwkJCQkJICYmIGJkZXYtPmJvYXJkX3R5cGUgPT0KIAkJCQkJIFNTQl9CT0FSRF9CVTQzMDYpCiAJCQkJCXJmLT5hdHQgPSA1OwotCQkJCWVsc2UgaWYgKGJ1cy0+Y2hpcF9pZCA9PSAweDQzMjApCisJCQkJZWxzZSBpZiAoYmRldi0+Y2hpcF9pZCA9PSAweDQzMjApCiAJCQkJCXJmLT5hdHQgPSA0OwogCQkJCWVsc2UKIAkJCQkJcmYtPmF0dCA9IDM7CkBAIC0yMzg0LDExICsyMzgyLDExIEBACiAJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKIAlzMTYgcGFiMCwgcGFiMSwgcGFiMjsKIAotCXBhYjAgPSAoczE2KSAoZGV2LT5zZGV2LT5idXMtPnNwcm9tLnBhMGIwKTsKLQlwYWIxID0gKHMxNikgKGRldi0+c2Rldi0+YnVzLT5zcHJvbS5wYTBiMSk7Ci0JcGFiMiA9IChzMTYpIChkZXYtPnNkZXYtPmJ1cy0+c3Byb20ucGEwYjIpOworCXBhYjAgPSAoczE2KSAoZGV2LT5kZXYtPmJ1c19zcHJvbS0+cGEwYjApOworCXBhYjEgPSAoczE2KSAoZGV2LT5kZXYtPmJ1c19zcHJvbS0+cGEwYjEpOworCXBhYjIgPSAoczE2KSAoZGV2LT5kZXYtPmJ1c19zcHJvbS0+cGEwYjIpOwogCi0JQjQzX1dBUk5fT04oKGRldi0+c2Rldi0+YnVzLT5jaGlwX2lkID09IDB4NDMwMSkgJiYKKwlCNDNfV0FSTl9PTigoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0MzAxKSAmJgogCQkgICAgKHBoeS0+cmFkaW9fdmVyICE9IDB4MjA1MCkpOyAvKiBOb3Qgc3VwcG9ydGVkIGFueW1vcmUgKi8KIAogCWdwaHktPmR5bl90c3NpX3RibCA9IDA7CkBAIC0yMzk2LDEwICsyMzk0LDEwIEBACiAJaWYgKHBhYjAgIT0gMCAmJiBwYWIxICE9IDAgJiYgcGFiMiAhPSAwICYmCiAJICAgIHBhYjAgIT0gLTEgJiYgcGFiMSAhPSAtMSAmJiBwYWIyICE9IC0xKSB7CiAJCS8qIFRoZSBwYWJYIHZhbHVlcyBhcmUgc2V0IGluIFNQUk9NLiBVc2UgdGhlbS4gKi8KLQkJaWYgKChzOCkgZGV2LT5zZGV2LT5idXMtPnNwcm9tLml0c3NpX2JnICE9IDAgJiYKLQkJICAgIChzOCkgZGV2LT5zZGV2LT5idXMtPnNwcm9tLml0c3NpX2JnICE9IC0xKSB7CisJCWlmICgoczgpIGRldi0+ZGV2LT5idXNfc3Byb20tPml0c3NpX2JnICE9IDAgJiYKKwkJICAgIChzOCkgZGV2LT5kZXYtPmJ1c19zcHJvbS0+aXRzc2lfYmcgIT0gLTEpIHsKIAkJCWdwaHktPnRndF9pZGxlX3Rzc2kgPQotCQkJCShzOCkgKGRldi0+c2Rldi0+YnVzLT5zcHJvbS5pdHNzaV9iZyk7CisJCQkJKHM4KSAoZGV2LT5kZXYtPmJ1c19zcHJvbS0+aXRzc2lfYmcpOwogCQl9IGVsc2UKIAkJCWdwaHktPnRndF9pZGxlX3Rzc2kgPSA2MjsKIAkJZ3BoeS0+dHNzaTJkYm0gPSBiNDNfZ2VuZXJhdGVfZHluX3Rzc2kyZGJtX3RhYihkZXYsIHBhYjAsCkBAIC0yNTM3LDcgKzI1MzUsNyBAQAogCQliNDNfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIDApOwogCQliNDNfcGh5X2luaXRnKGRldik7CiAJCXBoeS0+Z21vZGUgPSAxOwotCQliNDNfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIEI0M19UTVNMT1dfR01PREUpOworCQliNDNfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIDEpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjg0MCw3ICsyODM4LDcgQEAKIAkJCQkgICAgQjQzX1RYQ1RMX1RYTUlYOwogCQkJCXJmYXR0ICs9IDI7CiAJCQkJYmJhdHQgKz0gMjsKLQkJCX0gZWxzZSBpZiAoZGV2LT5zZGV2LT5idXMtPnNwcm9tLgorCQkJfSBlbHNlIGlmIChkZXYtPmRldi0+YnVzX3Nwcm9tLT4KIAkJCQkgICBib2FyZGZsYWdzX2xvICYKIAkJCQkgICBCNDNfQkZMX1BBQ1RSTCkgewogCQkJCWJiYXR0ICs9IDQgKiAocmZhdHQgLSAyKTsKQEAgLTI5MTQsMTQgKzI5MTIsMTQgQEAKIAllc3RpbWF0ZWRfcHdyID0gYjQzX2dwaHlfZXN0aW1hdGVfcG93ZXJfb3V0KGRldiwgYXZlcmFnZV90c3NpKTsKIAogCUI0M19XQVJOX09OKHBoeS0+dHlwZSAhPSBCNDNfUEhZVFlQRV9HKTsKLQltYXhfcHdyID0gZGV2LT5zZGV2LT5idXMtPnNwcm9tLm1heHB3cl9iZzsKLQlpZiAoZGV2LT5zZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1BBQ1RSTCkKKwltYXhfcHdyID0gZGV2LT5kZXYtPmJ1c19zcHJvbS0+bWF4cHdyX2JnOworCWlmIChkZXYtPmRldi0+YnVzX3Nwcm9tLT5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9QQUNUUkwpCiAJCW1heF9wd3IgLT0gMzsgLyogbWludXMgMC43NSAqLwogCWlmICh1bmxpa2VseShtYXhfcHdyID49IElOVF9UT19RNTIoMzAvKmRCbSovKSkpIHsKIAkJYjQzd2FybihkZXYtPndsLAogCQkJIkludmFsaWQgbWF4LVRYLXBvd2VyIHZhbHVlIGluIFNQUk9NLlxuIik7CiAJCW1heF9wd3IgPSBJTlRfVE9fUTUyKDIwKTsgLyogZmFrZSBpdCAqLwotCQlkZXYtPnNkZXYtPmJ1cy0+c3Byb20ubWF4cHdyX2JnID0gbWF4X3B3cjsKKwkJZGV2LT5kZXYtPmJ1c19zcHJvbS0+bWF4cHdyX2JnID0gbWF4X3B3cjsKIAl9CiAKIAkvKiBHZXQgZGVzaXJlZCBwb3dlciAoaW4gUTUuMikgKi8KQEAgLTMwMTQsNyArMzAxMiw3IEBACiB7CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKIAotCWlmICghKGRldi0+c2Rldi0+YnVzLT5zcHJvbS5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9SU1NJKSkKKwlpZiAoIShkZXYtPmRldi0+YnVzX3Nwcm9tLT5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9SU1NJKSkKIAkJcmV0dXJuOwogCiAJYjQzX21hY19zdXNwZW5kKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2h0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2h0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0MDkxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfaHQuYwpAQCAtMCwwICsxLDQxMyBAQAorLyoKKworICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCisgIElFRUUgODAyLjExbiBIVC1QSFkgc3VwcG9ydAorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0ZWV0LCBGaWZ0aCBGbG9vciwKKyAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJiNDMuaCIKKyNpbmNsdWRlICJwaHlfaHQuaCIKKyNpbmNsdWRlICJ0YWJsZXNfcGh5X2h0LmgiCisjaW5jbHVkZSAicmFkaW9fMjA1OS5oIgorI2luY2x1ZGUgIm1haW4uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWRpbyAyMDU5LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBiNDNfcmFkaW9fMjA1OV9jaGFubmVsX3NldHVwKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCWNvbnN0IHN0cnVjdCBiNDNfcGh5X2h0X2NoYW5uZWx0YWJfZV9yYWRpbzIwNTkgKmUpCit7CisJdTggaTsKKwl1MTYgcm91dGluZzsKKworCWI0M19yYWRpb193cml0ZShkZXYsIDB4MTYsIGUtPnJhZGlvX3N5bjE2KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCAweDE3LCBlLT5yYWRpb19zeW4xNyk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgMHgyMiwgZS0+cmFkaW9fc3luMjIpOworCWI0M19yYWRpb193cml0ZShkZXYsIDB4MjUsIGUtPnJhZGlvX3N5bjI1KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCAweDI3LCBlLT5yYWRpb19zeW4yNyk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgMHgyOCwgZS0+cmFkaW9fc3luMjgpOworCWI0M19yYWRpb193cml0ZShkZXYsIDB4MjksIGUtPnJhZGlvX3N5bjI5KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCAweDJjLCBlLT5yYWRpb19zeW4yYyk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgMHgyZCwgZS0+cmFkaW9fc3luMmQpOworCWI0M19yYWRpb193cml0ZShkZXYsIDB4MzcsIGUtPnJhZGlvX3N5bjM3KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCAweDQxLCBlLT5yYWRpb19zeW40MSk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgMHg0MywgZS0+cmFkaW9fc3luNDMpOworCWI0M19yYWRpb193cml0ZShkZXYsIDB4NDcsIGUtPnJhZGlvX3N5bjQ3KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCAweDRhLCBlLT5yYWRpb19zeW40YSk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgMHg1OCwgZS0+cmFkaW9fc3luNTgpOworCWI0M19yYWRpb193cml0ZShkZXYsIDB4NWEsIGUtPnJhZGlvX3N5bjVhKTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCAweDZhLCBlLT5yYWRpb19zeW42YSk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgMHg2ZCwgZS0+cmFkaW9fc3luNmQpOworCWI0M19yYWRpb193cml0ZShkZXYsIDB4NmUsIGUtPnJhZGlvX3N5bjZlKTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCAweDkyLCBlLT5yYWRpb19zeW45Mik7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgMHg5OCwgZS0+cmFkaW9fc3luOTgpOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlyb3V0aW5nID0gaSA/IFIyMDU5X1JYUlgxIDogUjIwNTlfVFhSWDA7CisJCWI0M19yYWRpb193cml0ZShkZXYsIHJvdXRpbmcgfCAweDRhLCBlLT5yYWRpb19yeHR4NGEpOworCQliNDNfcmFkaW9fd3JpdGUoZGV2LCByb3V0aW5nIHwgMHg1OCwgZS0+cmFkaW9fcnh0eDU4KTsKKwkJYjQzX3JhZGlvX3dyaXRlKGRldiwgcm91dGluZyB8IDB4NWEsIGUtPnJhZGlvX3J4dHg1YSk7CisJCWI0M19yYWRpb193cml0ZShkZXYsIHJvdXRpbmcgfCAweDZhLCBlLT5yYWRpb19yeHR4NmEpOworCQliNDNfcmFkaW9fd3JpdGUoZGV2LCByb3V0aW5nIHwgMHg2ZCwgZS0+cmFkaW9fcnh0eDZkKTsKKwkJYjQzX3JhZGlvX3dyaXRlKGRldiwgcm91dGluZyB8IDB4NmUsIGUtPnJhZGlvX3J4dHg2ZSk7CisJCWI0M19yYWRpb193cml0ZShkZXYsIHJvdXRpbmcgfCAweDkyLCBlLT5yYWRpb19yeHR4OTIpOworCQliNDNfcmFkaW9fd3JpdGUoZGV2LCByb3V0aW5nIHwgMHg5OCwgZS0+cmFkaW9fcnh0eDk4KTsKKwl9CisKKwl1ZGVsYXkoNTApOworCisJLyogQ2FsaWJyYXRpb24gKi8KKwliNDNfcmFkaW9fbWFzayhkZXYsIDB4MmIsIH4weDEpOworCWI0M19yYWRpb19tYXNrKGRldiwgMHgyZSwgfjB4NCk7CisJYjQzX3JhZGlvX3NldChkZXYsIDB4MmUsIDB4NCk7CisJYjQzX3JhZGlvX3NldChkZXYsIDB4MmIsIDB4MSk7CisKKwl1ZGVsYXkoMzAwKTsKK30KKworc3RhdGljIHZvaWQgYjQzX3JhZGlvXzIwNTlfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJY29uc3QgdTE2IHJvdXRpbmdbXSA9IHsgUjIwNTlfU1lOLCBSMjA1OV9UWFJYMCwgUjIwNTlfUlhSWDEgfTsKKwljb25zdCB1MTYgcmFkaW9fdmFsdWVzWzNdWzJdID0geworCQl7IDB4NjEsIDB4RTkgfSwgeyAweDY5LCAweEQ1IH0sIHsgMHg3MywgMHg5OSB9LAorCX07CisJdTE2IGksIGo7CisKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBSMjA1OV9BTEwgfCAweDUxLCAweDAwNzApOworCWI0M19yYWRpb193cml0ZShkZXYsIFIyMDU5X0FMTCB8IDB4NWEsIDB4MDAwMyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyb3V0aW5nKTsgaSsrKQorCQliNDNfcmFkaW9fc2V0KGRldiwgcm91dGluZ1tpXSB8IDB4MTQ2LCAweDMpOworCisJYjQzX3JhZGlvX3NldChkZXYsIDB4MmUsIDB4MDA3OCk7CisJYjQzX3JhZGlvX3NldChkZXYsIDB4YzAsIDB4MDA4MCk7CisJbXNsZWVwKDIpOworCWI0M19yYWRpb19tYXNrKGRldiwgMHgyZSwgfjB4MDA3OCk7CisJYjQzX3JhZGlvX21hc2soZGV2LCAweGMwLCB+MHgwMDgwKTsKKworCWlmICgxKSB7IC8qIEZJWE1FICovCisJCWI0M19yYWRpb19zZXQoZGV2LCBSMjA1OV9SWFJYMSB8IDB4NCwgMHgxKTsKKwkJdWRlbGF5KDEwKTsKKwkJYjQzX3JhZGlvX3NldChkZXYsIFIyMDU5X1JYUlgxIHwgMHgwQkYsIDB4MSk7CisJCWI0M19yYWRpb19tYXNrc2V0KGRldiwgUjIwNTlfUlhSWDEgfCAweDE5QiwgMHgzLCAweDIpOworCisJCWI0M19yYWRpb19zZXQoZGV2LCBSMjA1OV9SWFJYMSB8IDB4NCwgMHgyKTsKKwkJdWRlbGF5KDEwMCk7CisJCWI0M19yYWRpb19tYXNrKGRldiwgUjIwNTlfUlhSWDEgfCAweDQsIH4weDIpOworCisJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCQlpZiAoYjQzX3JhZGlvX3JlYWQoZGV2LCBSMjA1OV9SWFJYMSB8IDB4MTQ1KSAmIDEpIHsKKwkJCQlpID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxMDApOworCQl9CisJCWlmIChpKQorCQkJYjQzZXJyKGRldi0+d2wsICJyYWRpbyAweDk0NSB0aW1lb3V0XG4iKTsKKworCQliNDNfcmFkaW9fbWFzayhkZXYsIFIyMDU5X1JYUlgxIHwgMHg0LCB+MHgxKTsKKwkJYjQzX3JhZGlvX3NldChkZXYsIDB4YSwgMHg2MCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgMHgxN0YsIHJhZGlvX3ZhbHVlc1tpXVswXSk7CisJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCAweDEzRCwgMHg2RSk7CisJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCAweDEzRSwgcmFkaW9fdmFsdWVzW2ldWzFdKTsKKwkJCWI0M19yYWRpb193cml0ZShkZXYsIDB4MTNDLCAweDU1KTsKKworCQkJZm9yIChqID0gMDsgaiA8IDEwMDAwOyBqKyspIHsKKwkJCQlpZiAoYjQzX3JhZGlvX3JlYWQoZGV2LCAweDE0MCkgJiAyKSB7CisJCQkJCWogPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJdWRlbGF5KDUwMCk7CisJCQl9CisJCQlpZiAoaikKKwkJCQliNDNlcnIoZGV2LT53bCwgInJhZGlvIDB4MTQwIHRpbWVvdXRcbiIpOworCisJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCAweDEzQywgMHgxNSk7CisJCX0KKworCQliNDNfcmFkaW9fbWFzayhkZXYsIDB4MTdGLCB+MHgxKTsKKwl9CisKKwliNDNfcmFkaW9fbWFzayhkZXYsIDB4MTEsIH4weDAwMDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoYW5uZWwgc3dpdGNoaW5nIG9wcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYjQzX3BoeV9odF9jaGFubmVsX3NldHVwKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQljb25zdCBzdHJ1Y3QgYjQzX3BoeV9odF9jaGFubmVsdGFiX2VfcGh5ICplLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqbmV3X2NoYW5uZWwpCit7CisJYm9vbCBvbGRfYmFuZF81Z2h6OworCXU4IGk7CisKKwlvbGRfYmFuZF81Z2h6ID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9IVF9CQU5EQ1RMKSAmIDA7IC8qIEZJWE1FICovCisJaWYgKG5ld19jaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFogJiYgIW9sZF9iYW5kXzVnaHopIHsKKwkJLyogVE9ETyAqLworCX0gZWxzZSBpZiAobmV3X2NoYW5uZWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWiAmJiBvbGRfYmFuZF81Z2h6KSB7CisJCS8qIFRPRE8gKi8KKwl9CisKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9CVzEsIGUtPmJ3MSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfSFRfQlcyLCBlLT5idzIpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX0JXMywgZS0+YnczKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9CVzQsIGUtPmJ3NCk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfSFRfQlc1LCBlLT5idzUpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX0JXNiwgZS0+Ync2KTsKKworCS8qIFRPRE86IHNvbWUgb3BzIG9uIFBIWSByZWdzIDB4MEIwIGFuZCAweEMwQSAqLworCisJLyogVE9ETzogc2VwYXJhdGVkIGZ1bmN0aW9uPyAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJdTE2IG1hc2s7CisJCXUzMiB0bXAgPSBiNDNfaHR0YWJfcmVhZChkZXYsIEI0M19IVFRBQjMyKDI2LCAweEU4KSk7CisKKwkJaWYgKDApIC8qIEZJWE1FICovCisJCQltYXNrID0gMHgyIDw8IChpICogNCk7CisJCWVsc2UKKwkJCW1hc2sgPSAwOworCQliNDNfcGh5X21hc2soZGV2LCBCNDNfUEhZX0VYVEcoMHgxMDgpLCBtYXNrKTsKKworCQliNDNfaHR0YWJfd3JpdGUoZGV2LCBCNDNfSFRUQUIxNig3LCAweDExMCArIGkpLCB0bXAgPj4gMTYpOworCQliNDNfaHR0YWJfd3JpdGUoZGV2LCBCNDNfSFRUQUI4KDEzLCAweDYzICsgKGkgKiA0KSksCisJCQkJdG1wICYgMHhGRik7CisJCWI0M19odHRhYl93cml0ZShkZXYsIEI0M19IVFRBQjgoMTMsIDB4NzMgKyAoaSAqIDQpKSwKKwkJCQl0bXAgJiAweEZGKTsKKwl9CisKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMTdlLCAweDM4MzApOworfQorCitzdGF0aWMgaW50IGI0M19waHlfaHRfc2V0X2NoYW5uZWwoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAorCQkJCSAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKworCWNvbnN0IHN0cnVjdCBiNDNfcGh5X2h0X2NoYW5uZWx0YWJfZV9yYWRpbzIwNTkgKmNoZW50X3IyMDU5ID0gTlVMTDsKKworCWlmIChwaHktPnJhZGlvX3ZlciA9PSAweDIwNTkpIHsKKwkJY2hlbnRfcjIwNTkgPSBiNDNfcGh5X2h0X2dldF9jaGFubmVsdGFiX2VfcjIwNTkoZGV2LAorCQkJCQkJCWNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwkJaWYgKCFjaGVudF9yMjA1OSkKKwkJCXJldHVybiAtRVNSQ0g7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FU1JDSDsKKwl9CisKKwkvKiBUT0RPOiBJbiBjYXNlIG9mIE4tUEhZIHNvbWUgYmFuZHdpZHRoIHN3aXRjaGluZyBnb2VzIGhlcmUgKi8KKworCWlmIChwaHktPnJhZGlvX3ZlciA9PSAweDIwNTkpIHsKKwkJYjQzX3JhZGlvXzIwNTlfY2hhbm5lbF9zZXR1cChkZXYsIGNoZW50X3IyMDU5KTsKKwkJYjQzX3BoeV9odF9jaGFubmVsX3NldHVwKGRldiwgJihjaGVudF9yMjA1OS0+cGh5X3JlZ3MpLAorCQkJCQkgY2hhbm5lbCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FU1JDSDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCYXNpYyBQSFkgb3BzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGI0M19waHlfaHRfb3BfYWxsb2NhdGUoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5X2h0ICpwaHlfaHQ7CisKKwlwaHlfaHQgPSBremFsbG9jKHNpemVvZigqcGh5X2h0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaHlfaHQpCisJCXJldHVybiAtRU5PTUVNOworCWRldi0+cGh5Lmh0ID0gcGh5X2h0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19waHlfaHRfb3BfcHJlcGFyZV9zdHJ1Y3RzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X2h0ICpwaHlfaHQgPSBwaHktPmh0OworCisJbWVtc2V0KHBoeV9odCwgMCwgc2l6ZW9mKCpwaHlfaHQpKTsKK30KKworc3RhdGljIGludCBiNDNfcGh5X2h0X29wX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCWI0M19waHlfaHRfdGFibGVzX2luaXQoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiNDNfcGh5X2h0X29wX2ZyZWUoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfaHQgKnBoeV9odCA9IHBoeS0+aHQ7CisKKwlrZnJlZShwaHlfaHQpOworCXBoeS0+aHQgPSBOVUxMOworfQorCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1JhZGlvL1N3aXRjaCUyMFJhZGlvICovCitzdGF0aWMgdm9pZCBiNDNfcGh5X2h0X29wX3NvZnR3YXJlX3Jma2lsbChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCisJCQkJCWJvb2wgYmxvY2tlZCkKK3sKKwlpZiAoYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX01BQ0NUTCkgJiBCNDNfTUFDQ1RMX0VOQUJMRUQpCisJCWI0M2VycihkZXYtPndsLCAiTUFDIG5vdCBzdXNwZW5kZWRcbiIpOworCisJLyogSW4gdGhlIGZvbGxvd2luZyBQSFkgb3BzIHdlIGNvcHkgd2wncyBkdW1teSBiZWhhdmlvdXIuCisJICogVE9ETzogRmluZCBvdXQgaWYgcmVhZHMgKGN1cnJlbnRseSBoaWRkZW4gaW4gbWFza3MvbWFza3NldHMpIGFyZQorCSAqIG5lZWRlZCBhbmQgcmVwbGFjZSBmb2xsb3dpbmcgb3BzIHdpdGgganVzdCB3cml0ZXMgb3IgdyZyLgorCSAqIE5vdGU6IEI0M19QSFlfSFRfUkZfQ1RMMSByZWdpc3RlciBpcyB0cmlja3ksIHdyb25nIG9wZXJhdGlvbiBjYW4KKwkgKiBjYXVzZSBkZWxheWVkICghKSBtYWNoaW5lIGxvY2sgdXAuICovCisJaWYgKGJsb2NrZWQpIHsKKwkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX1BIWV9IVF9SRl9DVEwxLCAwKTsKKwl9IGVsc2UgeworCQliNDNfcGh5X21hc2soZGV2LCBCNDNfUEhZX0hUX1JGX0NUTDEsIDApOworCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfUEhZX0hUX1JGX0NUTDEsIDAsIDB4MSk7CisJCWI0M19waHlfbWFzayhkZXYsIEI0M19QSFlfSFRfUkZfQ1RMMSwgMCk7CisJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19QSFlfSFRfUkZfQ1RMMSwgMCwgMHgyKTsKKworCQlpZiAoZGV2LT5waHkucmFkaW9fdmVyID09IDB4MjA1OSkKKwkJCWI0M19yYWRpb18yMDU5X2luaXQoZGV2KTsKKwkJZWxzZQorCQkJQjQzX1dBUk5fT04oMSk7CisKKwkJYjQzX3N3aXRjaF9jaGFubmVsKGRldiwgZGV2LT5waHkuY2hhbm5lbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiNDNfcGh5X2h0X29wX3N3aXRjaF9hbmFsb2coc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIG9uKQoreworCWlmIChvbikgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9BRkVfQ1RMMiwgMHgwMGNkKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfSFRfQUZFX0NUTDEsIDB4MDAwMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX0FGRV9DVEw0LCAweDAwY2QpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9BRkVfQ1RMMywgMHgwMDAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfSFRfQUZFX0NUTDYsIDB4MDBjZCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX0FGRV9DVEw1LCAweDAwMDApOworCX0gZWxzZSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX0FGRV9DVEwxLCAweDA3ZmYpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9BRkVfQ1RMMiwgMHgwMGZkKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfSFRfQUZFX0NUTDMsIDB4MDdmZik7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX0FGRV9DVEw0LCAweDAwZmQpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9BRkVfQ1RMNSwgMHgwN2ZmKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfSFRfQUZFX0NUTDYsIDB4MDBmZCk7CisJfQorfQorCitzdGF0aWMgaW50IGI0M19waHlfaHRfb3Bfc3dpdGNoX2NoYW5uZWwoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCQl1bnNpZ25lZCBpbnQgbmV3X2NoYW5uZWwpCit7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gZGV2LT53bC0+aHctPmNvbmYuY2hhbm5lbDsKKwllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSA9IGRldi0+d2wtPmh3LT5jb25mLmNoYW5uZWxfdHlwZTsKKworCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKKwkJaWYgKChuZXdfY2hhbm5lbCA8IDEpIHx8IChuZXdfY2hhbm5lbCA+IDE0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBiNDNfcGh5X2h0X3NldF9jaGFubmVsKGRldiwgY2hhbm5lbCwgY2hhbm5lbF90eXBlKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBiNDNfcGh5X2h0X29wX2dldF9kZWZhdWx0X2NoYW4oc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopCisJCXJldHVybiAxMTsKKwlyZXR1cm4gMzY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUi9XIG9wcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHUxNiBiNDNfcGh5X2h0X29wX3JlYWQoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgcmVnKQoreworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUEhZX0NPTlRST0wsIHJlZyk7CisJcmV0dXJuIGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19QSFlfREFUQSk7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19waHlfaHRfb3Bfd3JpdGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgcmVnLCB1MTYgdmFsdWUpCit7CisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFlfQ09OVFJPTCwgcmVnKTsKKwliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1BIWV9EQVRBLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19waHlfaHRfb3BfbWFza3NldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcsIHUxNiBtYXNrLAorCQkJCSB1MTYgc2V0KQoreworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUEhZX0NPTlRST0wsIHJlZyk7CisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFlfREFUQSwKKwkJICAgIChiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fUEhZX0RBVEEpICYgbWFzaykgfCBzZXQpOworfQorCitzdGF0aWMgdTE2IGI0M19waHlfaHRfb3BfcmFkaW9fcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcpCit7CisJLyogSFQtUEhZIG5lZWRzIDB4MjAwIGZvciByZWFkIGFjY2VzcyAqLworCXJlZyB8PSAweDIwMDsKKworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUkFESU8yNF9DT05UUk9MLCByZWcpOworCXJldHVybiBiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fUkFESU8yNF9EQVRBKTsKK30KKworc3RhdGljIHZvaWQgYjQzX3BoeV9odF9vcF9yYWRpb193cml0ZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcsCisJCQkJICAgICAgdTE2IHZhbHVlKQoreworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUkFESU8yNF9DT05UUk9MLCByZWcpOworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUkFESU8yNF9EQVRBLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBlbnVtIGI0M190eHB3cl9yZXN1bHQKK2I0M19waHlfaHRfb3BfcmVjYWxjX3R4cG93ZXIoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGlnbm9yZV90c3NpKQoreworCXJldHVybiBCNDNfVFhQV1JfUkVTX0RPTkU7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19waHlfaHRfb3BfYWRqdXN0X3R4cG93ZXIoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBIWSBvcHMgc3RydWN0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBzdHJ1Y3QgYjQzX3BoeV9vcGVyYXRpb25zIGI0M19waHlvcHNfaHQgPSB7CisJLmFsbG9jYXRlCQk9IGI0M19waHlfaHRfb3BfYWxsb2NhdGUsCisJLmZyZWUJCQk9IGI0M19waHlfaHRfb3BfZnJlZSwKKwkucHJlcGFyZV9zdHJ1Y3RzCT0gYjQzX3BoeV9odF9vcF9wcmVwYXJlX3N0cnVjdHMsCisJLmluaXQJCQk9IGI0M19waHlfaHRfb3BfaW5pdCwKKwkucGh5X3JlYWQJCT0gYjQzX3BoeV9odF9vcF9yZWFkLAorCS5waHlfd3JpdGUJCT0gYjQzX3BoeV9odF9vcF93cml0ZSwKKwkucGh5X21hc2tzZXQJCT0gYjQzX3BoeV9odF9vcF9tYXNrc2V0LAorCS5yYWRpb19yZWFkCQk9IGI0M19waHlfaHRfb3BfcmFkaW9fcmVhZCwKKwkucmFkaW9fd3JpdGUJCT0gYjQzX3BoeV9odF9vcF9yYWRpb193cml0ZSwKKwkuc29mdHdhcmVfcmZraWxsCT0gYjQzX3BoeV9odF9vcF9zb2Z0d2FyZV9yZmtpbGwsCisJLnN3aXRjaF9hbmFsb2cJCT0gYjQzX3BoeV9odF9vcF9zd2l0Y2hfYW5hbG9nLAorCS5zd2l0Y2hfY2hhbm5lbAkJPSBiNDNfcGh5X2h0X29wX3N3aXRjaF9jaGFubmVsLAorCS5nZXRfZGVmYXVsdF9jaGFuCT0gYjQzX3BoeV9odF9vcF9nZXRfZGVmYXVsdF9jaGFuLAorCS5yZWNhbGNfdHhwb3dlcgkJPSBiNDNfcGh5X2h0X29wX3JlY2FsY190eHBvd2VyLAorCS5hZGp1c3RfdHhwb3dlcgkJPSBiNDNfcGh5X2h0X29wX2FkanVzdF90eHBvd2VyLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfaHQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfaHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQ3YWZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9odC5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgQjQzX1BIWV9IVF9IXworI2RlZmluZSBCNDNfUEhZX0hUX0hfCisKKyNpbmNsdWRlICJwaHlfY29tbW9uLmgiCisKKworI2RlZmluZSBCNDNfUEhZX0hUX0JBTkRDVEwJCQkweDAwOSAvKiBCYW5kIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjQzX1BIWV9IVF9UQUJMRV9BRERSCQkJMHgwNzIgLyogVGFibGUgYWRkcmVzcyAqLworI2RlZmluZSBCNDNfUEhZX0hUX1RBQkxFX0RBVEFMTwkJCTB4MDczIC8qIFRhYmxlIGRhdGEgbG93ICovCisjZGVmaW5lIEI0M19QSFlfSFRfVEFCTEVfREFUQUhJCQkJMHgwNzQgLyogVGFibGUgZGF0YSBoaWdoICovCisjZGVmaW5lIEI0M19QSFlfSFRfQlcxCQkJCTB4MUNFCisjZGVmaW5lIEI0M19QSFlfSFRfQlcyCQkJCTB4MUNGCisjZGVmaW5lIEI0M19QSFlfSFRfQlczCQkJCTB4MUQwCisjZGVmaW5lIEI0M19QSFlfSFRfQlc0CQkJCTB4MUQxCisjZGVmaW5lIEI0M19QSFlfSFRfQlc1CQkJCTB4MUQyCisjZGVmaW5lIEI0M19QSFlfSFRfQlc2CQkJCTB4MUQzCisKKyNkZWZpbmUgQjQzX1BIWV9IVF9SRl9DVEwxCQkJQjQzX1BIWV9FWFRHKDB4MDEwKQorCisjZGVmaW5lIEI0M19QSFlfSFRfQUZFX0NUTDEJCQlCNDNfUEhZX0VYVEcoMHgxMTApCisjZGVmaW5lIEI0M19QSFlfSFRfQUZFX0NUTDIJCQlCNDNfUEhZX0VYVEcoMHgxMTEpCisjZGVmaW5lIEI0M19QSFlfSFRfQUZFX0NUTDMJCQlCNDNfUEhZX0VYVEcoMHgxMTQpCisjZGVmaW5lIEI0M19QSFlfSFRfQUZFX0NUTDQJCQlCNDNfUEhZX0VYVEcoMHgxMTUpCisjZGVmaW5lIEI0M19QSFlfSFRfQUZFX0NUTDUJCQlCNDNfUEhZX0VYVEcoMHgxMTgpCisjZGVmaW5lIEI0M19QSFlfSFRfQUZFX0NUTDYJCQlCNDNfUEhZX0VYVEcoMHgxMTkpCisKKworLyogVmFsdWVzIGZvciBQSFkgcmVnaXN0ZXJzIHVzZWQgb24gY2hhbm5lbCBzd2l0Y2hpbmcgKi8KK3N0cnVjdCBiNDNfcGh5X2h0X2NoYW5uZWx0YWJfZV9waHkgeworCXUxNiBidzE7CisJdTE2IGJ3MjsKKwl1MTYgYnczOworCXUxNiBidzQ7CisJdTE2IGJ3NTsKKwl1MTYgYnc2OworfTsKKworCitzdHJ1Y3QgYjQzX3BoeV9odCB7Cit9OworCisKK3N0cnVjdCBiNDNfcGh5X29wZXJhdGlvbnM7CitleHRlcm4gY29uc3Qgc3RydWN0IGI0M19waHlfb3BlcmF0aW9ucyBiNDNfcGh5b3BzX2h0OworCisjZW5kaWYgLyogQjQzX1BIWV9IVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9sY24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbGNuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3ZGJiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbGNuLmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKworICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCisgIElFRUUgODAyLjExbiBMQ04tUEhZIHN1cHBvcnQKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdGVldCwgRmlmdGggRmxvb3IsCisgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiYjQzLmgiCisjaW5jbHVkZSAicGh5X2xjbi5oIgorI2luY2x1ZGUgInRhYmxlc19waHlfbGNuLmgiCisjaW5jbHVkZSAibWFpbi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBIWSBvcHMgc3RydWN0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBzdHJ1Y3QgYjQzX3BoeV9vcGVyYXRpb25zIGI0M19waHlvcHNfbGNuID0geworCS8qCisJLmFsbG9jYXRlCQk9IGI0M19waHlfbGNuX29wX2FsbG9jYXRlLAorCS5mcmVlCQkJPSBiNDNfcGh5X2xjbl9vcF9mcmVlLAorCS5wcmVwYXJlX3N0cnVjdHMJPSBiNDNfcGh5X2xjbl9vcF9wcmVwYXJlX3N0cnVjdHMsCisJLmluaXQJCQk9IGI0M19waHlfbGNuX29wX2luaXQsCisJLnBoeV9yZWFkCQk9IGI0M19waHlfbGNuX29wX3JlYWQsCisJLnBoeV93cml0ZQkJPSBiNDNfcGh5X2xjbl9vcF93cml0ZSwKKwkucGh5X21hc2tzZXQJCT0gYjQzX3BoeV9sY25fb3BfbWFza3NldCwKKwkucmFkaW9fcmVhZAkJPSBiNDNfcGh5X2xjbl9vcF9yYWRpb19yZWFkLAorCS5yYWRpb193cml0ZQkJPSBiNDNfcGh5X2xjbl9vcF9yYWRpb193cml0ZSwKKwkuc29mdHdhcmVfcmZraWxsCT0gYjQzX3BoeV9sY25fb3Bfc29mdHdhcmVfcmZraWxsLAorCS5zd2l0Y2hfYW5hbG9nCQk9IGI0M19waHlfbGNuX29wX3N3aXRjaF9hbmFsb2csCisJLnN3aXRjaF9jaGFubmVsCQk9IGI0M19waHlfbGNuX29wX3N3aXRjaF9jaGFubmVsLAorCS5nZXRfZGVmYXVsdF9jaGFuCT0gYjQzX3BoeV9sY25fb3BfZ2V0X2RlZmF1bHRfY2hhbiwKKwkucmVjYWxjX3R4cG93ZXIJCT0gYjQzX3BoeV9sY25fb3BfcmVjYWxjX3R4cG93ZXIsCisJLmFkanVzdF90eHBvd2VyCQk9IGI0M19waHlfbGNuX29wX2FkanVzdF90eHBvd2VyLAorCSovCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9sY24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbGNuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0NmMyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbGNuLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBCNDNfUEhZX0xDTl9IXworI2RlZmluZSBCNDNfUEhZX0xDTl9IXworCisjaW5jbHVkZSAicGh5X2NvbW1vbi5oIgorCisKK3N0cnVjdCBiNDNfcGh5X2xjbiB7Cit9OworCisKK3N0cnVjdCBiNDNfcGh5X29wZXJhdGlvbnM7CitleHRlcm4gY29uc3Qgc3RydWN0IGI0M19waHlfb3BlcmF0aW9ucyBiNDNfcGh5b3BzX2xjbjsKKworI2VuZGlmIC8qIEI0M19QSFlfTENOX0hfICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9scC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9scC5jCmluZGV4IDAxMmM4ZGEuLmY5M2Q2NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbHAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2xwLmMKQEAgLTMsNyArMyw3IEBACiAgIEJyb2FkY29tIEI0MyB3aXJlbGVzcyBkcml2ZXIKICAgSUVFRSA4MDIuMTFhL2cgTFAtUEhZIGRyaXZlcgogCi0gIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgIENvcHlyaWdodCAoYykgMjAwOSBHw6Fib3IgU3RlZmFuaWsgPG5ldHJvbGxsZXIuM2RAZ21haWwuY29tPgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC04NSwzOSArODUsMzkgQEAKIC8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL0xQL1JlYWRCYW5kU3JvbSAqLwogc3RhdGljIHZvaWQgbHBwaHlfcmVhZF9iYW5kX3Nwcm9tKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKKwlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9IGRldi0+ZGV2LT5idXNfc3Byb207CiAJc3RydWN0IGI0M19waHlfbHAgKmxwcGh5ID0gZGV2LT5waHkubHA7Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+c2Rldi0+YnVzOwogCXUxNiBjY2twbywgbWF4cHdyOwogCXUzMiBvZmRtcG87CiAJaW50IGk7CiAKIAlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKSB7Ci0JCWxwcGh5LT50eF9pc29sYXRpb25fbWVkX2JhbmQgPSBidXMtPnNwcm9tLnRyaTJnOwotCQlscHBoeS0+YnhfYXJjaCA9IGJ1cy0+c3Byb20uYnhhMmc7Ci0JCWxwcGh5LT5yeF9wd3Jfb2Zmc2V0ID0gYnVzLT5zcHJvbS5yeHBvMmc7Ci0JCWxwcGh5LT5yc3NpX3ZmID0gYnVzLT5zcHJvbS5yc3Npc21mMmc7Ci0JCWxwcGh5LT5yc3NpX3ZjID0gYnVzLT5zcHJvbS5yc3Npc21jMmc7Ci0JCWxwcGh5LT5yc3NpX2dzID0gYnVzLT5zcHJvbS5yc3Npc2F2Mmc7Ci0JCWxwcGh5LT50eHBhWzBdID0gYnVzLT5zcHJvbS5wYTBiMDsKLQkJbHBwaHktPnR4cGFbMV0gPSBidXMtPnNwcm9tLnBhMGIxOwotCQlscHBoeS0+dHhwYVsyXSA9IGJ1cy0+c3Byb20ucGEwYjI7Ci0JCW1heHB3ciA9IGJ1cy0+c3Byb20ubWF4cHdyX2JnOworCQlscHBoeS0+dHhfaXNvbGF0aW9uX21lZF9iYW5kID0gc3Byb20tPnRyaTJnOworCQlscHBoeS0+YnhfYXJjaCA9IHNwcm9tLT5ieGEyZzsKKwkJbHBwaHktPnJ4X3B3cl9vZmZzZXQgPSBzcHJvbS0+cnhwbzJnOworCQlscHBoeS0+cnNzaV92ZiA9IHNwcm9tLT5yc3Npc21mMmc7CisJCWxwcGh5LT5yc3NpX3ZjID0gc3Byb20tPnJzc2lzbWMyZzsKKwkJbHBwaHktPnJzc2lfZ3MgPSBzcHJvbS0+cnNzaXNhdjJnOworCQlscHBoeS0+dHhwYVswXSA9IHNwcm9tLT5wYTBiMDsKKwkJbHBwaHktPnR4cGFbMV0gPSBzcHJvbS0+cGEwYjE7CisJCWxwcGh5LT50eHBhWzJdID0gc3Byb20tPnBhMGIyOworCQltYXhwd3IgPSBzcHJvbS0+bWF4cHdyX2JnOwogCQlscHBoeS0+bWF4X3R4X3B3cl9tZWRfYmFuZCA9IG1heHB3cjsKLQkJY2NrcG8gPSBidXMtPnNwcm9tLmNjazJncG87CisJCWNja3BvID0gc3Byb20tPmNjazJncG87CiAJCS8qCiAJCSAqIFdlIGRvbid0IHJlYWQgU1BST00ncyBvcG8gYXMgc3BlY3Mgc2F5LiBPbiByZXY4IFNQUk9NcwogCQkgKiBvcG8gPT0gb2ZkbTJncG8gYW5kIHdlIGRvbid0IGtub3cgYW55IFNTQiB3aXRoIExQLVBIWQogCQkgKiBhbmQgU1BST00gcmV2IGJlbG93IDguCiAJCSAqLwotCQlCNDNfV0FSTl9PTihidXMtPnNwcm9tLnJldmlzaW9uIDwgOCk7Ci0JCW9mZG1wbyA9IGJ1cy0+c3Byb20ub2ZkbTJncG87CisJCUI0M19XQVJOX09OKHNwcm9tLT5yZXZpc2lvbiA8IDgpOworCQlvZmRtcG8gPSBzcHJvbS0+b2ZkbTJncG87CiAJCWlmIChjY2twbykgewogCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQkJCWxwcGh5LT50eF9tYXhfcmF0ZVtpXSA9CiAJCQkJCW1heHB3ciAtIChvZmRtcG8gJiAweEYpICogMjsKIAkJCQlvZmRtcG8gPj49IDQ7CiAJCQl9Ci0JCQlvZmRtcG8gPSBidXMtPnNwcm9tLm9mZG0yZ3BvOworCQkJb2ZkbXBvID0gc3Byb20tPm9mZG0yZ3BvOwogCQkJZm9yIChpID0gNDsgaSA8IDE1OyBpKyspIHsKIAkJCQlscHBoeS0+dHhfbWF4X3JhdGVbaV0gPQogCQkJCQltYXhwd3IgLSAob2ZkbXBvICYgMHhGKSAqIDI7CkBAIC0xMzEsMzkgKzEzMSwzOSBAQAogCQkJCWxwcGh5LT50eF9tYXhfcmF0ZVtpXSA9IG1heHB3ciAtIG9mZG1wbzsKIAkJfQogCX0gZWxzZSB7IC8qIDVHSHogKi8KLQkJbHBwaHktPnR4X2lzb2xhdGlvbl9sb3dfYmFuZCA9IGJ1cy0+c3Byb20udHJpNWdsOwotCQlscHBoeS0+dHhfaXNvbGF0aW9uX21lZF9iYW5kID0gYnVzLT5zcHJvbS50cmk1ZzsKLQkJbHBwaHktPnR4X2lzb2xhdGlvbl9oaV9iYW5kID0gYnVzLT5zcHJvbS50cmk1Z2g7Ci0JCWxwcGh5LT5ieF9hcmNoID0gYnVzLT5zcHJvbS5ieGE1ZzsKLQkJbHBwaHktPnJ4X3B3cl9vZmZzZXQgPSBidXMtPnNwcm9tLnJ4cG81ZzsKLQkJbHBwaHktPnJzc2lfdmYgPSBidXMtPnNwcm9tLnJzc2lzbWY1ZzsKLQkJbHBwaHktPnJzc2lfdmMgPSBidXMtPnNwcm9tLnJzc2lzbWM1ZzsKLQkJbHBwaHktPnJzc2lfZ3MgPSBidXMtPnNwcm9tLnJzc2lzYXY1ZzsKLQkJbHBwaHktPnR4cGFbMF0gPSBidXMtPnNwcm9tLnBhMWIwOwotCQlscHBoeS0+dHhwYVsxXSA9IGJ1cy0+c3Byb20ucGExYjE7Ci0JCWxwcGh5LT50eHBhWzJdID0gYnVzLT5zcHJvbS5wYTFiMjsKLQkJbHBwaHktPnR4cGFsWzBdID0gYnVzLT5zcHJvbS5wYTFsb2IwOwotCQlscHBoeS0+dHhwYWxbMV0gPSBidXMtPnNwcm9tLnBhMWxvYjE7Ci0JCWxwcGh5LT50eHBhbFsyXSA9IGJ1cy0+c3Byb20ucGExbG9iMjsKLQkJbHBwaHktPnR4cGFoWzBdID0gYnVzLT5zcHJvbS5wYTFoaWIwOwotCQlscHBoeS0+dHhwYWhbMV0gPSBidXMtPnNwcm9tLnBhMWhpYjE7Ci0JCWxwcGh5LT50eHBhaFsyXSA9IGJ1cy0+c3Byb20ucGExaGliMjsKLQkJbWF4cHdyID0gYnVzLT5zcHJvbS5tYXhwd3JfYWw7Ci0JCW9mZG1wbyA9IGJ1cy0+c3Byb20ub2ZkbTVnbHBvOworCQlscHBoeS0+dHhfaXNvbGF0aW9uX2xvd19iYW5kID0gc3Byb20tPnRyaTVnbDsKKwkJbHBwaHktPnR4X2lzb2xhdGlvbl9tZWRfYmFuZCA9IHNwcm9tLT50cmk1ZzsKKwkJbHBwaHktPnR4X2lzb2xhdGlvbl9oaV9iYW5kID0gc3Byb20tPnRyaTVnaDsKKwkJbHBwaHktPmJ4X2FyY2ggPSBzcHJvbS0+YnhhNWc7CisJCWxwcGh5LT5yeF9wd3Jfb2Zmc2V0ID0gc3Byb20tPnJ4cG81ZzsKKwkJbHBwaHktPnJzc2lfdmYgPSBzcHJvbS0+cnNzaXNtZjVnOworCQlscHBoeS0+cnNzaV92YyA9IHNwcm9tLT5yc3Npc21jNWc7CisJCWxwcGh5LT5yc3NpX2dzID0gc3Byb20tPnJzc2lzYXY1ZzsKKwkJbHBwaHktPnR4cGFbMF0gPSBzcHJvbS0+cGExYjA7CisJCWxwcGh5LT50eHBhWzFdID0gc3Byb20tPnBhMWIxOworCQlscHBoeS0+dHhwYVsyXSA9IHNwcm9tLT5wYTFiMjsKKwkJbHBwaHktPnR4cGFsWzBdID0gc3Byb20tPnBhMWxvYjA7CisJCWxwcGh5LT50eHBhbFsxXSA9IHNwcm9tLT5wYTFsb2IxOworCQlscHBoeS0+dHhwYWxbMl0gPSBzcHJvbS0+cGExbG9iMjsKKwkJbHBwaHktPnR4cGFoWzBdID0gc3Byb20tPnBhMWhpYjA7CisJCWxwcGh5LT50eHBhaFsxXSA9IHNwcm9tLT5wYTFoaWIxOworCQlscHBoeS0+dHhwYWhbMl0gPSBzcHJvbS0+cGExaGliMjsKKwkJbWF4cHdyID0gc3Byb20tPm1heHB3cl9hbDsKKwkJb2ZkbXBvID0gc3Byb20tPm9mZG01Z2xwbzsKIAkJbHBwaHktPm1heF90eF9wd3JfbG93X2JhbmQgPSBtYXhwd3I7CiAJCWZvciAoaSA9IDQ7IGkgPCAxMjsgaSsrKSB7CiAJCQlscHBoeS0+dHhfbWF4X3JhdGVsW2ldID0gbWF4cHdyIC0gKG9mZG1wbyAmIDB4RikgKiAyOwogCQkJb2ZkbXBvID4+PSA0OwogCQl9Ci0JCW1heHB3ciA9IGJ1cy0+c3Byb20ubWF4cHdyX2E7Ci0JCW9mZG1wbyA9IGJ1cy0+c3Byb20ub2ZkbTVncG87CisJCW1heHB3ciA9IHNwcm9tLT5tYXhwd3JfYTsKKwkJb2ZkbXBvID0gc3Byb20tPm9mZG01Z3BvOwogCQlscHBoeS0+bWF4X3R4X3B3cl9tZWRfYmFuZCA9IG1heHB3cjsKIAkJZm9yIChpID0gNDsgaSA8IDEyOyBpKyspIHsKIAkJCWxwcGh5LT50eF9tYXhfcmF0ZVtpXSA9IG1heHB3ciAtIChvZmRtcG8gJiAweEYpICogMjsKIAkJCW9mZG1wbyA+Pj0gNDsKIAkJfQotCQltYXhwd3IgPSBidXMtPnNwcm9tLm1heHB3cl9haDsKLQkJb2ZkbXBvID0gYnVzLT5zcHJvbS5vZmRtNWdocG87CisJCW1heHB3ciA9IHNwcm9tLT5tYXhwd3JfYWg7CisJCW9mZG1wbyA9IHNwcm9tLT5vZmRtNWdocG87CiAJCWxwcGh5LT5tYXhfdHhfcHdyX2hpX2JhbmQgPSBtYXhwd3I7CiAJCWZvciAoaSA9IDQ7IGkgPCAxMjsgaSsrKSB7CiAJCQlscHBoeS0+dHhfbWF4X3JhdGVoW2ldID0gbWF4cHdyIC0gKG9mZG1wbyAmIDB4RikgKiAyOwpAQCAtMjE0LDcgKzIxNCw4IEBACiAKIHN0YXRpYyB2b2lkIGxwcGh5X2Jhc2ViYW5kX3JldjBfMV9pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CisJc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+ZGV2LT5zZGV2LT5idXM7CisJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSBkZXYtPmRldi0+YnVzX3Nwcm9tOwogCXN0cnVjdCBiNDNfcGh5X2xwICpscHBoeSA9IGRldi0+cGh5LmxwOwogCXUxNiB0bXAsIHRtcDI7CiAKQEAgLTI0Miw5ICsyNDMsOSBAQAogCWI0M19waHlfbWFza3NldChkZXYsIEI0M19MUFBIWV9DUlNfRURfVEhSRVNILCAweDAwRkYsIDB4QUQwMCk7CiAJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX0lOUFVUX1BXUkRCLAogCQkJMHhGRjAwLCBscHBoeS0+cnhfcHdyX29mZnNldCk7Ci0JaWYgKChidXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX0ZFTSkgJiYKKwlpZiAoKHNwcm9tLT5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9GRU0pICYmCiAJICAgKChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHx8Ci0JICAgKGJ1cy0+c3Byb20uYm9hcmRmbGFnc19oaSAmIEI0M19CRkhfUEFSRUYpKSkgeworCSAgIChzcHJvbS0+Ym9hcmRmbGFnc19oaSAmIEI0M19CRkhfUEFSRUYpKSkgewogCQlzc2JfcG11X3NldF9sZG9fdm9sdGFnZSgmYnVzLT5jaGlwY28sIExET19QQVJFRiwgMHgyOCk7CiAJCXNzYl9wbXVfc2V0X2xkb19wYXJlZigmYnVzLT5jaGlwY28sIHRydWUpOwogCQlpZiAoZGV2LT5waHkucmV2ID09IDApIHsKQEAgLTI2MCw3ICsyNjEsNyBAQAogCX0KIAl0bXAgPSBscHBoeS0+cnNzaV92ZiB8IGxwcGh5LT5yc3NpX3ZjIDw8IDQgfCAweEEwMDA7CiAJYjQzX3BoeV93cml0ZShkZXYsIEI0M19MUFBIWV9BRkVfUlNTSV9DVExfMCwgdG1wKTsKLQlpZiAoYnVzLT5zcHJvbS5ib2FyZGZsYWdzX2hpICYgQjQzX0JGSF9SU1NJSU5WKQorCWlmIChzcHJvbS0+Ym9hcmRmbGFnc19oaSAmIEI0M19CRkhfUlNTSUlOVikKIAkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX0FGRV9SU1NJX0NUTF8xLCAweEYwMDAsIDB4MEFBQSk7CiAJZWxzZQogCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTFBQSFlfQUZFX1JTU0lfQ1RMXzEsIDB4RjAwMCwgMHgwMkFBKTsKQEAgLTI2OCw3ICsyNjksNyBAQAogCWI0M19waHlfbWFza3NldChkZXYsIEI0M19MUFBIWV9SWF9SQURJT19DVEwsCiAJCQkweEZGRjksIChscHBoeS0+YnhfYXJjaCA8PCAxKSk7CiAJaWYgKGRldi0+cGh5LnJldiA9PSAxICYmCi0JICAgKGJ1cy0+c3Byb20uYm9hcmRmbGFnc19oaSAmIEI0M19CRkhfRkVNX0JUKSkgeworCSAgIChzcHJvbS0+Ym9hcmRmbGFnc19oaSAmIEI0M19CRkhfRkVNX0JUKSkgewogCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTFBQSFlfVFJfTE9PS1VQXzEsIDB4RkZDMCwgMHgwMDBBKTsKIAkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX1RSX0xPT0tVUF8xLCAweDNGMDAsIDB4MDkwMCk7CiAJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19MUFBIWV9UUl9MT09LVVBfMiwgMHhGRkMwLCAweDAwMEEpOwpAQCAtMjg2LDggKzI4Nyw4IEBACiAJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19MUFBIWV9UUl9MT09LVVBfOCwgMHhGRkMwLCAweDAwMEEpOwogCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTFBQSFlfVFJfTE9PS1VQXzgsIDB4QzBGRiwgMHgwQjAwKTsKIAl9IGVsc2UgaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfNUdIWiB8fAotCQkgIChidXMtPmJvYXJkaW5mby50eXBlID09IDB4MDQ4QSkgfHwgKChkZXYtPnBoeS5yZXYgPT0gMCkgJiYKLQkJICAoYnVzLT5zcHJvbS5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9GRU0pKSkgeworCQkgIChkZXYtPmRldi0+Ym9hcmRfdHlwZSA9PSAweDA0OEEpIHx8ICgoZGV2LT5waHkucmV2ID09IDApICYmCisJCSAgKHNwcm9tLT5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9GRU0pKSkgewogCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTFBQSFlfVFJfTE9PS1VQXzEsIDB4RkZDMCwgMHgwMDAxKTsKIAkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX1RSX0xPT0tVUF8xLCAweEMwRkYsIDB4MDQwMCk7CiAJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19MUFBIWV9UUl9MT09LVVBfMiwgMHhGRkMwLCAweDAwMDEpOwpAQCAtMjk3LDcgKzI5OCw3IEBACiAJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19MUFBIWV9UUl9MT09LVVBfNCwgMHhGRkMwLCAweDAwMDIpOwogCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTFBQSFlfVFJfTE9PS1VQXzQsIDB4QzBGRiwgMHgwQTAwKTsKIAl9IGVsc2UgaWYgKGRldi0+cGh5LnJldiA9PSAxIHx8Ci0JCSAgKGJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfRkVNKSkgeworCQkgIChzcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfRkVNKSkgewogCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTFBQSFlfVFJfTE9PS1VQXzEsIDB4RkZDMCwgMHgwMDA0KTsKIAkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX1RSX0xPT0tVUF8xLCAweEMwRkYsIDB4MDgwMCk7CiAJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19MUFBIWV9UUl9MT09LVVBfMiwgMHhGRkMwLCAweDAwMDQpOwpAQCAtMzE2LDE1ICszMTcsMTUgQEAKIAkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX1RSX0xPT0tVUF80LCAweEZGQzAsIDB4MDAwNik7CiAJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19MUFBIWV9UUl9MT09LVVBfNCwgMHhDMEZGLCAweDA3MDApOwogCX0KLQlpZiAoZGV2LT5waHkucmV2ID09IDEgJiYgKGJ1cy0+c3Byb20uYm9hcmRmbGFnc19oaSAmIEI0M19CRkhfUEFSRUYpKSB7CisJaWYgKGRldi0+cGh5LnJldiA9PSAxICYmIChzcHJvbS0+Ym9hcmRmbGFnc19oaSAmIEI0M19CRkhfUEFSRUYpKSB7CiAJCWI0M19waHlfY29weShkZXYsIEI0M19MUFBIWV9UUl9MT09LVVBfNSwgQjQzX0xQUEhZX1RSX0xPT0tVUF8xKTsKIAkJYjQzX3BoeV9jb3B5KGRldiwgQjQzX0xQUEhZX1RSX0xPT0tVUF82LCBCNDNfTFBQSFlfVFJfTE9PS1VQXzIpOwogCQliNDNfcGh5X2NvcHkoZGV2LCBCNDNfTFBQSFlfVFJfTE9PS1VQXzcsIEI0M19MUFBIWV9UUl9MT09LVVBfMyk7CiAJCWI0M19waHlfY29weShkZXYsIEI0M19MUFBIWV9UUl9MT09LVVBfOCwgQjQzX0xQUEhZX1RSX0xPT0tVUF80KTsKIAl9Ci0JaWYgKChidXMtPnNwcm9tLmJvYXJkZmxhZ3NfaGkgJiBCNDNfQkZIX0ZFTV9CVCkgJiYKLQkgICAgKGJ1cy0+Y2hpcF9pZCA9PSAweDUzNTQpICYmCi0JICAgIChidXMtPmNoaXBfcGFja2FnZSA9PSBTU0JfQ0hJUFBBQ0tfQkNNNDcxMlMpKSB7CisJaWYgKChzcHJvbS0+Ym9hcmRmbGFnc19oaSAmIEI0M19CRkhfRkVNX0JUKSAmJgorCSAgICAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg1MzU0KSAmJgorCSAgICAoZGV2LT5kZXYtPmNoaXBfcGtnID09IFNTQl9DSElQUEFDS19CQ000NzEyUykpIHsKIAkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTFBQSFlfQ1JTR0FJTl9DVEwsIDB4MDAwNik7CiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTFBQSFlfR1BJT19TRUxFQ1QsIDB4MDAwNSk7CiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTFBQSFlfR1BJT19PVVRFTiwgMHhGRkZGKTsKQEAgLTQxMiw3ICs0MTMsNiBAQAogCiBzdGF0aWMgdm9pZCBscHBoeV9iYXNlYmFuZF9yZXYycGx1c19pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CiAJc3RydWN0IGI0M19waHlfbHAgKmxwcGh5ID0gZGV2LT5waHkubHA7CiAKIAliNDNfcGh5X3dyaXRlKGRldiwgQjQzX0xQUEhZX0FGRV9EQUNfQ1RMLCAweDUwKTsKQEAgLTQzMiw3ICs0MzIsNyBAQAogCWI0M19waHlfbWFzayhkZXYsIEI0M19MUFBIWV9DUlNHQUlOX0NUTCwgfjB4NDAwMCk7CiAJYjQzX3BoeV9tYXNrKGRldiwgQjQzX0xQUEhZX0NSU0dBSU5fQ1RMLCB+MHgyMDAwKTsKIAliNDNfcGh5X3NldChkZXYsIEI0M19QSFlfT0ZETSgweDEwQSksIDB4MSk7Ci0JaWYgKGJ1cy0+Ym9hcmRpbmZvLnJldiA+PSAweDE4KSB7CisJaWYgKGRldi0+ZGV2LT5ib2FyZF9yZXYgPj0gMHgxOCkgewogCQliNDNfbHB0YWJfd3JpdGUoZGV2LCBCNDNfTFBUQUIzMigxNywgNjUpLCAweEVDKTsKIAkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX1BIWV9PRkRNKDB4MTBBKSwgMHhGRjAxLCAweDE0KTsKIAl9IGVsc2UgewpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX0NMSVBDVFJUSFJFU0gsIDB4RkMxRiwgMHhBMCk7CiAJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX0dBSU5ESVJFQ1RNSVNNQVRDSCwgMHhFMEZGLCAweDMwMCk7CiAJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX0hJR0FJTkRCLCAweDAwRkYsIDB4MkEwMCk7Ci0JaWYgKChidXMtPmNoaXBfaWQgPT0gMHg0MzI1KSAmJiAoYnVzLT5jaGlwX3JldiA9PSAwKSkgeworCWlmICgoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0MzI1KSAmJiAoZGV2LT5kZXYtPmNoaXBfcmV2ID09IDApKSB7CiAJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19MUFBIWV9MT1dHQUlOREIsIDB4MDBGRiwgMHgyMTAwKTsKIAkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX1ZFUllMT1dHQUlOREIsIDB4RkYwMCwgMHhBKTsKIAl9IGVsc2UgewpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX0NMSVBDVFJUSFJFU0gsIDB4RkZFMCwgMHgxMik7CiAJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX0dBSU5NSVNNQVRDSCwgMHgwRkZGLCAweDkwMDApOwogCi0JaWYgKChidXMtPmNoaXBfaWQgPT0gMHg0MzI1KSAmJiAoYnVzLT5jaGlwX3JldiA9PSAwKSkgeworCWlmICgoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0MzI1KSAmJiAoZGV2LT5kZXYtPmNoaXBfcmV2ID09IDApKSB7CiAJCWI0M19scHRhYl93cml0ZShkZXYsIEI0M19MUFRBQjE2KDB4MDgsIDB4MTQpLCAwKTsKIAkJYjQzX2xwdGFiX3dyaXRlKGRldiwgQjQzX0xQVEFCMTYoMHgwOCwgMHgxMiksIDB4NDApOwogCX0KQEAgLTQ5Miw3ICs0OTIsNyBAQAogCQkgICAgICAweDIwMDAgfCAoKHUxNilscHBoeS0+cnNzaV9ncyA8PCAxMCkgfAogCQkgICAgICAoKHUxNilscHBoeS0+cnNzaV92YyA8PCA0KSB8IGxwcGh5LT5yc3NpX3ZmKTsKIAotCWlmICgoYnVzLT5jaGlwX2lkID09IDB4NDMyNSkgJiYgKGJ1cy0+Y2hpcF9yZXYgPT0gMCkpIHsKKwlpZiAoKGRldi0+ZGV2LT5jaGlwX2lkID09IDB4NDMyNSkgJiYgKGRldi0+ZGV2LT5jaGlwX3JldiA9PSAwKSkgewogCQliNDNfcGh5X3NldChkZXYsIEI0M19MUFBIWV9BRkVfQURDX0NUTF8wLCAweDFDKTsKIAkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX0FGRV9DVEwsIDB4MDBGRiwgMHg4ODAwKTsKIAkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX0FGRV9BRENfQ1RMXzEsIDB4RkMzQywgMHgwNDAwKTsKQEAgLTUxOSw3ICs1MTksNyBAQAogc3RhdGljIHZvaWQgbHBwaHlfMjA2Ml9pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKIAlzdHJ1Y3QgYjQzX3BoeV9scCAqbHBwaHkgPSBkZXYtPnBoeS5scDsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CisJc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+ZGV2LT5zZGV2LT5idXM7CiAJdTMyIGNyeXN0YWxmcmVxLCB0bXAsIHJlZjsKIAl1bnNpZ25lZCBpbnQgaTsKIAljb25zdCBzdHJ1Y3QgYjIwNjJfZnJlcWRhdGEgKmZkID0gTlVMTDsKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCQlscHBoeV9zeW5jX3N0eChkZXYpOwogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4RjApLCAweDVGODApOwogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4RjEpLCAwKTsKLQkJaWYgKGRldi0+c2Rldi0+YnVzLT5jaGlwX2lkID09IDB4NDMyNSkgeworCQlpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0MzI1KSB7CiAJCQkvLyBUT0RPIFNTQiBQTVUgcmVjYWxpYnJhdGlvbgogCQl9CiAJfQpAQCAtMTI4OSw3ICsxMjg5LDcgQEAKIAogc3RhdGljIHZvaWQgbHBwaHlfcmV2MnBsdXNfcmNfY2FsaWIoc3RydWN0IGI0M193bGRldiAqZGV2KQogewotCXN0cnVjdCBzc2JfYnVzICpidXMgPSBkZXYtPnNkZXYtPmJ1czsKKwlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5kZXYtPnNkZXYtPmJ1czsKIAl1MzIgY3J5c3RhbF9mcmVxID0gYnVzLT5jaGlwY28ucG11LmNyeXN0YWxmcmVxICogMTAwMDsKIAl1OCB0bXAgPSBiNDNfcmFkaW9fcmVhZChkZXYsIEIyMDYzX1JYX0JCX1NQOCkgJiAweEZGOwogCWludCBpOwpAQCAtMTg0MCw3ICsxODQwLDYgQEAKIHN0YXRpYyB2b2lkIGxwcGh5X3BhcGRfY2FsX3R4cHdyKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKIAlzdHJ1Y3QgYjQzX3BoeV9scCAqbHBwaHkgPSBkZXYtPnBoeS5scDsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CiAJc3RydWN0IGxwcGh5X3R4X2dhaW5zIGdhaW5zLCBvbGRnYWluczsKIAlpbnQgb2xkX3R4cGN0bCwgb2xkX2FmZV9vdnIsIG9sZF9yZiwgb2xkX2JibXVsdDsKIApAQCAtMTg1NCw3ICsxODUzLDcgQEAKIAogCWxwcGh5X3NldF90eF9wb3dlcl9jb250cm9sKGRldiwgQjQzX0xQUEhZX1RYUENUTF9PRkYpOwogCi0JaWYgKGJ1cy0+Y2hpcF9pZCA9PSAweDQzMjUgJiYgYnVzLT5jaGlwX3JldiA9PSAwKQorCWlmIChkZXYtPmRldi0+Y2hpcF9pZCA9PSAweDQzMjUgJiYgZGV2LT5kZXYtPmNoaXBfcmV2ID09IDApCiAJCWxwcGh5X3BhcGRfY2FsKGRldiwgZ2FpbnMsIDAsIDEsIDMwKTsKIAllbHNlCiAJCWxwcGh5X3BhcGRfY2FsKGRldiwgZ2FpbnMsIDAsIDEsIDY1KTsKQEAgLTE4NzAsNyArMTg2OSw2IEBACiAJCQkgICAgYm9vbCByeCwgYm9vbCBwYSwgc3RydWN0IGxwcGh5X3R4X2dhaW5zICpnYWlucykKIHsKIAlzdHJ1Y3QgYjQzX3BoeV9scCAqbHBwaHkgPSBkZXYtPnBoeS5scDsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CiAJY29uc3Qgc3RydWN0IGxwcGh5X3J4X2lxX2NvbXAgKmlxY29tcCA9IE5VTEw7CiAJc3RydWN0IGxwcGh5X3R4X2dhaW5zIG5vZ2FpbnMsIG9sZGdhaW5zOwogCXUxNiB0bXA7CkBAIC0xODc5LDcgKzE4NzcsNyBAQAogCW1lbXNldCgmbm9nYWlucywgMCwgc2l6ZW9mKG5vZ2FpbnMpKTsKIAltZW1zZXQoJm9sZGdhaW5zLCAwLCBzaXplb2Yob2xkZ2FpbnMpKTsKIAotCWlmIChidXMtPmNoaXBfaWQgPT0gMHg1MzU0KSB7CisJaWYgKGRldi0+ZGV2LT5jaGlwX2lkID09IDB4NTM1NCkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShscHBoeV81MzU0X2lxX3RhYmxlKTsgaSsrKSB7CiAJCQlpZiAobHBwaHlfNTM1NF9pcV90YWJsZVtpXS5jaGFuID09IGxwcGh5LT5jaGFubmVsKSB7CiAJCQkJaXFjb21wID0gJmxwcGh5XzUzNTRfaXFfdGFibGVbaV07CkBAIC0yNDA4LDExICsyNDA2LDkgQEAKIAogc3RhdGljIHZvaWQgbHBwaHlfYjIwNjJfcmVzZXRfcGxsX2JpYXMoc3RydWN0IGI0M193bGRldiAqZGV2KQogewotCXN0cnVjdCBzc2JfYnVzICpidXMgPSBkZXYtPnNkZXYtPmJ1czsKLQogCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDYyX1NfUkZQTExfQ1RMMiwgMHhGRik7CiAJdWRlbGF5KDIwKTsKLQlpZiAoYnVzLT5jaGlwX2lkID09IDB4NTM1NCkgeworCWlmIChkZXYtPmRldi0+Y2hpcF9pZCA9PSAweDUzNTQpIHsKIAkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNjJfTl9DT01NMSwgNCk7CiAJCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDYyX1NfUkZQTExfQ1RMMiwgNCk7CiAJfSBlbHNlIHsKQEAgLTI0MzIsNyArMjQyOCw3IEBACiAJCQkgICAgdW5zaWduZWQgaW50IGNoYW5uZWwpCiB7CiAJc3RydWN0IGI0M19waHlfbHAgKmxwcGh5ID0gZGV2LT5waHkubHA7Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+c2Rldi0+YnVzOworCXN0cnVjdCBzc2JfYnVzICpidXMgPSBkZXYtPmRldi0+c2Rldi0+YnVzOwogCWNvbnN0IHN0cnVjdCBiMjA2eF9jaGFubmVsICpjaGFuZGF0YSA9IE5VTEw7CiAJdTMyIGNyeXN0YWxfZnJlcSA9IGJ1cy0+Y2hpcGNvLnBtdS5jcnlzdGFsZnJlcSAqIDEwMDA7CiAJdTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcsIHRtcDgsIHRtcDk7CkBAIC0yNTIyLDcgKzI1MTgsNyBAQAogc3RhdGljIGludCBscHBoeV9iMjA2M190dW5lKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKIAkJCSAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CisJc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+ZGV2LT5zZGV2LT5idXM7CiAKIAlzdGF0aWMgY29uc3Qgc3RydWN0IGIyMDZ4X2NoYW5uZWwgKmNoYW5kYXRhID0gTlVMTDsKIAl1MzIgY3J5c3RhbF9mcmVxID0gYnVzLT5jaGlwY28ucG11LmNyeXN0YWxmcmVxICogMTAwMDsKQEAgLTI2NzAsNiArMjY2NiwxMSBAQAogewogCWludCBlcnI7CiAKKwlpZiAoZGV2LT5kZXYtPmJ1c190eXBlICE9IEI0M19CVVNfU1NCKSB7CisJCWI0M2VycihkZXYtPndsLCAiTFAtUEhZIGlzIHN1cHBvcnRlZCBvbmx5IG9uIFNTQiFcbiIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCiAJbHBwaHlfcmVhZF9iYW5kX3Nwcm9tKGRldik7IC8vRklYTUUgc2hvdWxkIHRoaXMgYmUgaW4gcHJlcGFyZV9zdHJ1Y3RzPwogCWxwcGh5X2Jhc2ViYW5kX2luaXQoZGV2KTsKIAlscHBoeV9yYWRpb19pbml0KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5jCmluZGV4IDA1OTYwZGQuLjNiNDYzNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5jCkBAIC0zLDcgKzMsNyBAQAogICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCiAgIElFRUUgODAyLjExbiBQSFkgc3VwcG9ydAogCi0gIENvcHlyaWdodCAoYykgMjAwOCBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICBDb3B5cmlnaHQgKGMpIDIwMDggTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjk5LDcgKzI5OSw3IEBACiBzdGF0aWMgdm9pZCBiNDNfbnBoeV90eF9wb3dlcl9maXgoc3RydWN0IGI0M193bGRldiAqZGV2KQogewogCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBkZXYtPnBoeS5uOwotCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gJihkZXYtPnNkZXYtPmJ1cy0+c3Byb20pOworCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gZGV2LT5kZXYtPmJ1c19zcHJvbTsKIAogCXU4IHR4cGlbMl0sIGJibXVsdCwgaTsKIAl1MTYgdG1wLCByYWRpb19nYWluLCBkYWNfZ2FpbjsKQEAgLTQyMywxNiArNDIzLDE1IEBACiBzdGF0aWMgdm9pZCBiNDNfcmFkaW9faW5pdDIwNTVfcG9zdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7CiAJc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IGRldi0+cGh5Lm47Ci0Jc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSAmKGRldi0+c2Rldi0+YnVzLT5zcHJvbSk7Ci0Jc3RydWN0IHNzYl9ib2FyZGluZm8gKmJpbmZvID0gJihkZXYtPnNkZXYtPmJ1cy0+Ym9hcmRpbmZvKTsKKwlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9IGRldi0+ZGV2LT5idXNfc3Byb207CiAJaW50IGk7CiAJdTE2IHZhbDsKIAlib29sIHdvcmthcm91bmQgPSBmYWxzZTsKIAogCWlmIChzcHJvbS0+cmV2aXNpb24gPCA0KQotCQl3b3JrYXJvdW5kID0gKGJpbmZvLT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSAmJgotCQkJCWJpbmZvLT50eXBlID09IDB4NDZEICYmCi0JCQkJYmluZm8tPnJldiA+PSAweDQxKTsKKwkJd29ya2Fyb3VuZCA9IChkZXYtPmRldi0+Ym9hcmRfdmVuZG9yICE9IFBDSV9WRU5ET1JfSURfQlJPQURDT00KKwkJCSAgICAgICYmIGRldi0+ZGV2LT5ib2FyZF90eXBlID09IDB4NDZECisJCQkgICAgICAmJiBkZXYtPmRldi0+Ym9hcmRfcmV2ID49IDB4NDEpOwogCWVsc2UKIAkJd29ya2Fyb3VuZCA9CiAJCQkhKHNwcm9tLT5ib2FyZGZsYWdzMl9sbyAmIEI0M19CRkwyX1JYQkJfSU5UX1JFR19ESVMpOwpAQCAtNjA0LDE3ICs2MDMsMzMgQEAKIC8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vQm1hY1BoeUNsa0ZnYyAqLwogc3RhdGljIHZvaWQgYjQzX25waHlfYm1hY19jbG9ja19mZ2Moc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGZvcmNlKQogewotCXUzMiB0bXNsb3c7CisJdTMyIHRtcDsKIAogCWlmIChkZXYtPnBoeS50eXBlICE9IEI0M19QSFlUWVBFX04pCiAJCXJldHVybjsKIAotCXRtc2xvdyA9IHNzYl9yZWFkMzIoZGV2LT5zZGV2LCBTU0JfVE1TTE9XKTsKLQlpZiAoZm9yY2UpCi0JCXRtc2xvdyB8PSBTU0JfVE1TTE9XX0ZHQzsKLQllbHNlCi0JCXRtc2xvdyAmPSB+U1NCX1RNU0xPV19GR0M7Ci0Jc3NiX3dyaXRlMzIoZGV2LT5zZGV2LCBTU0JfVE1TTE9XLCB0bXNsb3cpOworCXN3aXRjaCAoZGV2LT5kZXYtPmJ1c190eXBlKSB7CisjaWZkZWYgQ09ORklHX0I0M19CQ01BCisJY2FzZSBCNDNfQlVTX0JDTUE6CisJCXRtcCA9IGJjbWFfYXJlYWQzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCk7CisJCWlmIChmb3JjZSkKKwkJCXRtcCB8PSBCQ01BX0lPQ1RMX0ZHQzsKKwkJZWxzZQorCQkJdG1wICY9IH5CQ01BX0lPQ1RMX0ZHQzsKKwkJYmNtYV9hd3JpdGUzMihkZXYtPmRldi0+YmRldiwgQkNNQV9JT0NUTCwgdG1wKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCWNhc2UgQjQzX0JVU19TU0I6CisJCXRtcCA9IHNzYl9yZWFkMzIoZGV2LT5kZXYtPnNkZXYsIFNTQl9UTVNMT1cpOworCQlpZiAoZm9yY2UpCisJCQl0bXAgfD0gU1NCX1RNU0xPV19GR0M7CisJCWVsc2UKKwkJCXRtcCAmPSB+U1NCX1RNU0xPV19GR0M7CisJCXNzYl93cml0ZTMyKGRldi0+ZGV2LT5zZGV2LCBTU0JfVE1TTE9XLCB0bXApOworCQlicmVhazsKKyNlbmRpZgorCX0KIH0KIAogLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9DQ0EgKi8KQEAgLTk1OSw4ICs5NzQsMjEgQEAKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0dQSU9fTE9PRU4sIDApOwogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfR1BJT19ISU9FTiwgMCk7CiAKLQkJc3NiX2NoaXBjb19ncGlvX2NvbnRyb2woJmRldi0+c2Rldi0+YnVzLT5jaGlwY28sIDB4RkMwMCwKLQkJCQkJMHhGQzAwKTsKKwkJc3dpdGNoIChkZXYtPmRldi0+YnVzX3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwkJY2FzZSBCNDNfQlVTX0JDTUE6CisJCQliY21hX2NoaXBjb19ncGlvX2NvbnRyb2woJmRldi0+ZGV2LT5iZGV2LT5idXMtPmRydl9jYywKKwkJCQkJCSAweEZDMDAsIDB4RkMwMCk7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CNDNfU1NCCisJCWNhc2UgQjQzX0JVU19TU0I6CisJCQlzc2JfY2hpcGNvX2dwaW9fY29udHJvbCgmZGV2LT5kZXYtPnNkZXYtPmJ1cy0+Y2hpcGNvLAorCQkJCQkJMHhGQzAwLCAweEZDMDApOworCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCiAJCWI0M193cml0ZTMyKGRldiwgQjQzX01NSU9fTUFDQ1RMLAogCQkJYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX01BQ0NUTCkgJgogCQkJfkI0M19NQUNDVExfR1BPVVRTTVNLKTsKQEAgLTk4Myw3ICsxMDExLDcgQEAKIHsKIAl1MTYgdG1wOwogCi0JaWYgKGRldi0+c2Rldi0+aWQucmV2aXNpb24gPT0gMTYpCisJaWYgKGRldi0+ZGV2LT5jb3JlX3JldiA9PSAxNikKIAkJYjQzX21hY19zdXNwZW5kKGRldik7CiAKIAl0bXAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9DTEFTU0NUTCk7CkBAIC05OTMsNyArMTAyMSw3IEBACiAJdG1wIHw9ICh2YWwgJiBtYXNrKTsKIAliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DTEFTU0NUTCwgMHhGRkY4LCB0bXApOwogCi0JaWYgKGRldi0+c2Rldi0+aWQucmV2aXNpb24gPT0gMTYpCisJaWYgKGRldi0+ZGV2LT5jb3JlX3JldiA9PSAxNikKIAkJYjQzX21hY19lbmFibGUoZGV2KTsKIAogCXJldHVybiB0bXA7CkBAIC0xMTY4LDcgKzExOTYsNyBAQAogc3RhdGljIHZvaWQgYjQzX25waHlfZ2Fpbl9jdHJsX3dvcmthcm91bmRzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKIAlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gZGV2LT5waHkubjsKLQlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9ICYoZGV2LT5zZGV2LT5idXMtPnNwcm9tKTsKKwlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9IGRldi0+ZGV2LT5idXNfc3Byb207CiAKIAkvKiBQSFkgcmV2IDAsIDEsIDIgKi8KIAl1OCBpLCBqOwpAQCAtMTM3Myw3ICsxNDAxLDcgQEAKIC8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vV29ya2Fyb3VuZHMgKi8KIHN0YXRpYyB2b2lkIGI0M19ucGh5X3dvcmthcm91bmRzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CisJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSBkZXYtPmRldi0+YnVzX3Nwcm9tOwogCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CiAJc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IHBoeS0+bjsKIApAQCAtMTQ0Myw5ICsxNDcxLDkgQEAKIAogCQkvKiBOIFBIWSBXQVIgVFggQ2hhaW4gVXBkYXRlIHdpdGggaHdfcGh5dHhjaGFpbiBhcyBhcmd1bWVudCAqLwogCi0JCWlmICgoYnVzLT5zcHJvbS5ib2FyZGZsYWdzMl9sbyAmIEI0M19CRkwyX0FQTExfV0FSICYmCisJCWlmICgoc3Byb20tPmJvYXJkZmxhZ3MyX2xvICYgQjQzX0JGTDJfQVBMTF9XQVIgJiYKIAkJICAgIGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgfHwKLQkJICAgIChidXMtPnNwcm9tLmJvYXJkZmxhZ3MyX2xvICYgQjQzX0JGTDJfR1BMTF9XQVIgJiYKKwkJICAgIChzcHJvbS0+Ym9hcmRmbGFnczJfbG8gJiBCNDNfQkZMMl9HUExMX1dBUiAmJgogCQkgICAgYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKSkKIAkJCXRtcDMyID0gMHgwMDA4ODg4ODsKIAkJZWxzZQpAQCAtMTUwMyw4ICsxNTMxLDggQEAKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX0xPMiwgMHgyRDgpOwogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfVVAyLCAweDMwMSk7CiAKLQkJaWYgKGJ1cy0+c3Byb20uYm9hcmRmbGFnczJfbG8gJiAweDEwMCAmJgotCQkgICAgYnVzLT5ib2FyZGluZm8udHlwZSA9PSAweDhCKSB7CisJCWlmIChzcHJvbS0+Ym9hcmRmbGFnczJfbG8gJiAweDEwMCAmJgorCQkgICAgZGV2LT5kZXYtPmJvYXJkX3R5cGUgPT0gMHg4QikgewogCQkJZGVsYXlzMVswXSA9IDB4MTsKIAkJCWRlbGF5czFbNV0gPSAweDE0OwogCQl9CkBAIC0zNTg2LDcgKzM2MTQsNyBAQAogICovCiBpbnQgYjQzX3BoeV9pbml0bihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+c2Rldi0+YnVzOworCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gZGV2LT5kZXYtPmJ1c19zcHJvbTsKIAlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwogCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBwaHktPm47CiAJdTggdHhfcHdyX3N0YXRlOwpAQCAtMzU5OSw5ICszNjI3LDIyIEBACiAJYm9vbCBkb19jYWwgPSBmYWxzZTsKIAogCWlmICgoZGV2LT5waHkucmV2ID49IDMpICYmCi0JICAgKGJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfRVhUTE5BKSAmJgorCSAgIChzcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfRVhUTE5BKSAmJgogCSAgIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopKSB7Ci0JCWNoaXBjb19zZXQzMigmZGV2LT5zZGV2LT5idXMtPmNoaXBjbywgU1NCX0NISVBDT19DSElQQ1RMLCAweDQwKTsKKwkJc3dpdGNoIChkZXYtPmRldi0+YnVzX3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfQjQzX0JDTUEKKwkJY2FzZSBCNDNfQlVTX0JDTUE6CisJCQliY21hX2NjX3NldDMyKCZkZXYtPmRldi0+YmRldi0+YnVzLT5kcnZfY2MsCisJCQkJICAgICAgQkNNQV9DQ19DSElQQ1RMLCAweDQwKTsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0I0M19TU0IKKwkJY2FzZSBCNDNfQlVTX1NTQjoKKwkJCWNoaXBjb19zZXQzMigmZGV2LT5kZXYtPnNkZXYtPmJ1cy0+Y2hpcGNvLAorCQkJCSAgICAgU1NCX0NISVBDT19DSElQQ1RMLCAweDQwKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCX0KIAl9CiAJbnBoeS0+ZGVhZl9jb3VudCA9IDA7CiAJYjQzX25waHlfdGFibGVzX2luaXQoZGV2KTsKQEAgLTM2MzksOSArMzY4MCw5IEBACiAJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRVNFUV9UWDJSWF9QVURfMjBNLCAweDIwKTsKIAliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQUZFU0VRX1RYMlJYX1BVRF80ME0sIDB4MjApOwogCi0JaWYgKGJ1cy0+c3Byb20uYm9hcmRmbGFnczJfbG8gJiAweDEwMCB8fAotCSAgICAoYnVzLT5ib2FyZGluZm8udmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVBQTEUgJiYKLQkgICAgIGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gMHg4QikpCisJaWYgKHNwcm9tLT5ib2FyZGZsYWdzMl9sbyAmIDB4MTAwIHx8CisJICAgIChkZXYtPmRldi0+Ym9hcmRfdmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVBQTEUgJiYKKwkgICAgIGRldi0+ZGV2LT5ib2FyZF90eXBlID09IDB4OEIpKQogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVFhSRUFMRkQsIDB4QTApOwogCWVsc2UKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RYUkVBTEZELCAweEI4KTsKQEAgLTQwMjYsMTEgKzQwNjcsMjQgQEAKIC8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL0FuYWNvcmUgKi8KIHN0YXRpYyB2b2lkIGI0M19ucGh5X29wX3N3aXRjaF9hbmFsb2coc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIG9uKQogewotCXUxNiB2YWwgPSBvbiA/IDAgOiAweDdGRkY7CisJdTE2IG92ZXJyaWRlID0gb24gPyAweDAgOiAweDdGRkY7CisJdTE2IGNvcmUgPSBvbiA/IDB4RCA6IDB4MDBGRDsKIAotCWlmIChkZXYtPnBoeS5yZXYgPj0gMykKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSMSwgdmFsKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIHZhbCk7CisJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7CisJCWlmIChvbikgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9DMSwgY29yZSk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIxLCBvdmVycmlkZSk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQUZFQ1RMX0MyLCBjb3JlKTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwgb3ZlcnJpZGUpOworCQl9IGVsc2UgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSMSwgb3ZlcnJpZGUpOworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9DMSwgY29yZSk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIG92ZXJyaWRlKTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9BRkVDVExfQzIsIGNvcmUpOworCQl9CisJfSBlbHNlIHsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSLCBvdmVycmlkZSk7CisJfQogfQogCiBzdGF0aWMgaW50IGI0M19ucGh5X29wX3N3aXRjaF9jaGFubmVsKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waW8uYwppbmRleCA3MmFiOTRkLi42ZTQyMjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3Bpby5jCkBAIC00LDcgKzQsNyBAQAogCiAgIFBJTyBkYXRhIHRyYW5zZmVyCiAKLSAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTExLDcgKzExMSw3IEBACiAJCUI0M19NTUlPX1BJTzExX0JBU0U1LAogCX07CiAKLQlpZiAoZGV2LT5zZGV2LT5pZC5yZXZpc2lvbiA+PSAxMSkgeworCWlmIChkZXYtPmRldi0+Y29yZV9yZXYgPj0gMTEpIHsKIAkJQjQzX1dBUk5fT04oaW5kZXggPj0gQVJSQVlfU0laRShiYXNlc19yZXYxMSkpOwogCQlyZXR1cm4gYmFzZXNfcmV2MTFbaW5kZXhdOwogCX0KQEAgLTEyMSwxNCArMTIxLDE0IEBACiAKIHN0YXRpYyB1MTYgcGlvX3R4cXVldWVfb2Zmc2V0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlpZiAoZGV2LT5zZGV2LT5pZC5yZXZpc2lvbiA+PSAxMSkKKwlpZiAoZGV2LT5kZXYtPmNvcmVfcmV2ID49IDExKQogCQlyZXR1cm4gMHgxODsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHUxNiBwaW9fcnhxdWV1ZV9vZmZzZXQoc3RydWN0IGI0M193bGRldiAqZGV2KQogewotCWlmIChkZXYtPnNkZXYtPmlkLnJldmlzaW9uID49IDExKQorCWlmIChkZXYtPmRldi0+Y29yZV9yZXYgPj0gMTEpCiAJCXJldHVybiAweDM4OwogCXJldHVybiA4OwogfQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJaWYgKCFxKQogCQlyZXR1cm4gTlVMTDsKIAlxLT5kZXYgPSBkZXY7Ci0JcS0+cmV2ID0gZGV2LT5zZGV2LT5pZC5yZXZpc2lvbjsKKwlxLT5yZXYgPSBkZXYtPmRldi0+Y29yZV9yZXY7CiAJcS0+bW1pb19iYXNlID0gaW5kZXhfdG9fcGlvcXVldWVfYmFzZShkZXYsIGluZGV4KSArCiAJCSAgICAgICBwaW9fdHhxdWV1ZV9vZmZzZXQoZGV2KTsKIAlxLT5pbmRleCA9IGluZGV4OwpAQCAtMTc4LDcgKzE3OCw3IEBACiAJaWYgKCFxKQogCQlyZXR1cm4gTlVMTDsKIAlxLT5kZXYgPSBkZXY7Ci0JcS0+cmV2ID0gZGV2LT5zZGV2LT5pZC5yZXZpc2lvbjsKKwlxLT5yZXYgPSBkZXYtPmRldi0+Y29yZV9yZXY7CiAJcS0+bW1pb19iYXNlID0gaW5kZXhfdG9fcGlvcXVldWVfYmFzZShkZXYsIGluZGV4KSArCiAJCSAgICAgICBwaW9fcnhxdWV1ZV9vZmZzZXQoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU1LmMKaW5kZXggNDRjNmRlYS4uOTM2NDNmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1NS5jCkBAIC0zLDcgKzMsNyBAQAogICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCiAgIElFRUUgODAyLjExbiBQSFkgYW5kIHJhZGlvIGRldmljZSBkYXRhIHRhYmxlcwogCi0gIENvcHlyaWdodCAoYykgMjAwOCBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICBDb3B5cmlnaHQgKGMpIDIwMDggTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU1LmgKaW5kZXggZDliZmEwZi4uNjdmOTYxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1NS5oCkBAIC0yNTEsNCArMjUxLDkgQEAKIHZvaWQgYjIwNTVfdXBsb2FkX2luaXR0YWIoc3RydWN0IGI0M193bGRldiAqZGV2LAogCQkJICBib29sIGdoejUsIGJvb2wgaWdub3JlX3VwbG9hZGZsYWcpOwogCisvKiBHZXQgdGhlIE5QSFkgQ2hhbm5lbCBTd2l0Y2ggVGFibGUgZW50cnkgZm9yIGEgY2hhbm5lbC4KKyAqIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlIHRvIGZpbmQgYW4gZW50cnkuICovCitjb25zdCBzdHJ1Y3QgYjQzX25waHlfY2hhbm5lbHRhYl9lbnRyeV9yZXYyICoKK2I0M19ucGh5X2dldF9jaGFudGFiZW50X3JldjIoc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCBjaGFubmVsKTsKKwogI2VuZGlmIC8qIEI0M19SQURJT18yMDU1X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1Ni5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTYuaAppbmRleCBkNjAxZjZlLi5kNTJkZjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1Ni5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU2LmgKQEAgLTExMTcsNCArMTExNyw5IEBACiB2b2lkIGIyMDU2X3VwbG9hZF9pbml0dGFicyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCiAJCQkgICBib29sIGdoejUsIGJvb2wgaWdub3JlX3VwbG9hZGZsYWcpOwogCisvKiBHZXQgdGhlIE5QSFkgQ2hhbm5lbCBTd2l0Y2ggVGFibGUgZW50cnkgZm9yIGEgY2hhbm5lbC4KKyAqIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlIHRvIGZpbmQgYW4gZW50cnkuICovCitjb25zdCBzdHJ1Y3QgYjQzX25waHlfY2hhbm5lbHRhYl9lbnRyeV9yZXYzICoKK2I0M19ucGh5X2dldF9jaGFudGFiZW50X3JldjMoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgZnJlcSk7CisKICNlbmRpZiAvKiBCNDNfUkFESU9fMjA1Nl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyOWY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU5LmMKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisKKyAgQnJvYWRjb20gQjQzIHdpcmVsZXNzIGRyaXZlcgorICBJRUVFIDgwMi4xMW4gMjA1OSByYWRpbyBkZXZpY2UgZGF0YSB0YWJsZXMKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdGVldCwgRmlmdGggRmxvb3IsCisgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisqLworCisjaW5jbHVkZSAiYjQzLmgiCisjaW5jbHVkZSAicmFkaW9fMjA1OS5oIgorCisjZGVmaW5lIFJBRElPUkVHUyhyMDAsIHIwMSwgcjAyLCByMDMsIHIwNCwgcjA1LCByMDYsIHIwNywgcjA4LCByMDksIFwKKwkJICByMTAsIHIxMSwgcjEyLCByMTMsIHIxNCwgcjE1LCByMTYsIHIxNywgcjE4LCByMTksIFwKKwkJICByMjAsIHIyMSwgcjIyLCByMjMsIHIyNCwgcjI1LCByMjYsIHIyNywgcjI4KSBcCisJLnJhZGlvX3N5bjE2CQkJPSByMDAsCVwKKwkucmFkaW9fc3luMTcJCQk9IHIwMSwJXAorCS5yYWRpb19zeW4yMgkJCT0gcjAyLAlcCisJLnJhZGlvX3N5bjI1CQkJPSByMDMsCVwKKwkucmFkaW9fc3luMjcJCQk9IHIwNCwJXAorCS5yYWRpb19zeW4yOAkJCT0gcjA1LAlcCisJLnJhZGlvX3N5bjI5CQkJPSByMDYsCVwKKwkucmFkaW9fc3luMmMJCQk9IHIwNywJXAorCS5yYWRpb19zeW4yZAkJCT0gcjA4LAlcCisJLnJhZGlvX3N5bjM3CQkJPSByMDksCVwKKwkucmFkaW9fc3luNDEJCQk9IHIxMCwJXAorCS5yYWRpb19zeW40MwkJCT0gcjExLAlcCisJLnJhZGlvX3N5bjQ3CQkJPSByMTIsCVwKKwkucmFkaW9fc3luNGEJCQk9IHIxMywJXAorCS5yYWRpb19zeW41OAkJCT0gcjE0LAlcCisJLnJhZGlvX3N5bjVhCQkJPSByMTUsCVwKKwkucmFkaW9fc3luNmEJCQk9IHIxNiwJXAorCS5yYWRpb19zeW42ZAkJCT0gcjE3LAlcCisJLnJhZGlvX3N5bjZlCQkJPSByMTgsCVwKKwkucmFkaW9fc3luOTIJCQk9IHIxOSwJXAorCS5yYWRpb19zeW45OAkJCT0gcjIwLAlcCisJLnJhZGlvX3J4dHg0YQkJCT0gcjIxLAlcCisJLnJhZGlvX3J4dHg1OAkJCT0gcjIyLAlcCisJLnJhZGlvX3J4dHg1YQkJCT0gcjIzLAlcCisJLnJhZGlvX3J4dHg2YQkJCT0gcjI0LAlcCisJLnJhZGlvX3J4dHg2ZAkJCT0gcjI1LAlcCisJLnJhZGlvX3J4dHg2ZQkJCT0gcjI2LAlcCisJLnJhZGlvX3J4dHg5MgkJCT0gcjI3LAlcCisJLnJhZGlvX3J4dHg5OAkJCT0gcjI4CisKKyNkZWZpbmUgUEhZUkVHUyhyMCwgcjEsIHIyLCByMywgcjQsIHI1KQlcCisJLnBoeV9yZWdzLmJ3MQk9IHIwLAlcCisJLnBoeV9yZWdzLmJ3Mgk9IHIxLAlcCisJLnBoeV9yZWdzLmJ3Mwk9IHIyLAlcCisJLnBoeV9yZWdzLmJ3NAk9IHIzLAlcCisJLnBoeV9yZWdzLmJ3NQk9IHI0LAlcCisJLnBoeV9yZWdzLmJ3Ngk9IHI1CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYjQzX3BoeV9odF9jaGFubmVsdGFiX2VfcmFkaW8yMDU5IGI0M19waHlfaHRfY2hhbm5lbHRhYl9yYWRpbzIwNTlbXSA9IHsKKyAgewkuZnJlcQkJCT0gMjQxMiwKKwlSQURJT1JFR1MoMHg0OCwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg2YywKKwkJICAweDA5LCAweDBmLCAweDBhLCAweDAwLCAweDBhLCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzYzksIDB4MDNjNSwgMHgwM2MxLCAweDA0M2EsIDB4MDQzZiwgMHgwNDQzKSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQxNywKKwlSQURJT1JFR1MoMHg0YiwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg3MSwKKwkJICAweDA5LCAweDBmLCAweDBhLCAweDAwLCAweDBhLCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzY2IsIDB4MDNjNywgMHgwM2MzLCAweDA0MzgsIDB4MDQzZCwgMHgwNDQxKSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQyMiwKKwlSQURJT1JFR1MoMHg0ZSwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg3NiwKKwkJICAweDA5LCAweDBmLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzY2QsIDB4MDNjOSwgMHgwM2M1LCAweDA0MzYsIDB4MDQzYSwgMHgwNDNmKSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQyNywKKwlSQURJT1JFR1MoMHg1MiwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg3YiwKKwkJICAweDA5LCAweDBmLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzY2YsIDB4MDNjYiwgMHgwM2M3LCAweDA0MzQsIDB4MDQzOCwgMHgwNDNkKSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQzMiwKKwlSQURJT1JFR1MoMHg1NSwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg4MCwKKwkJICAweDA5LCAweDBmLCAweDA4LCAweDAwLCAweDA4LCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzZDEsIDB4MDNjZCwgMHgwM2M5LCAweDA0MzEsIDB4MDQzNiwgMHgwNDNhKSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQzNywKKwlSQURJT1JFR1MoMHg1OCwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg4NSwKKwkJICAweDA5LCAweDBmLCAweDA4LCAweDAwLCAweDA4LCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzZDMsIDB4MDNjZiwgMHgwM2NiLCAweDA0MmYsIDB4MDQzNCwgMHgwNDM4KSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQ0MiwKKwlSQURJT1JFR1MoMHg1YywgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg4YSwKKwkJICAweDA5LCAweDBmLCAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzZDUsIDB4MDNkMSwgMHgwM2NkLCAweDA0MmQsIDB4MDQzMSwgMHgwNDM2KSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQ0NywKKwlSQURJT1JFR1MoMHg1ZiwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg4ZiwKKwkJICAweDA5LCAweDBmLCAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzZDcsIDB4MDNkMywgMHgwM2NmLCAweDA0MmIsIDB4MDQyZiwgMHgwNDM0KSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQ1MiwKKwlSQURJT1JFR1MoMHg2MiwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg5NCwKKwkJICAweDA5LCAweDBmLCAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzZDksIDB4MDNkNSwgMHgwM2QxLCAweDA0MjksIDB4MDQyZCwgMHgwNDMxKSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQ1NywKKwlSQURJT1JFR1MoMHg2NiwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg5OSwKKwkJICAweDA5LCAweDBmLCAweDA2LCAweDAwLCAweDA2LCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzZGIsIDB4MDNkNywgMHgwM2QzLCAweDA0MjcsIDB4MDQyYiwgMHgwNDJmKSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQ2MiwKKwlSQURJT1JFR1MoMHg2OSwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg5ZSwKKwkJICAweDA5LCAweDBmLCAweDA2LCAweDAwLCAweDA2LCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzZGQsIDB4MDNkOSwgMHgwM2Q1LCAweDA0MjQsIDB4MDQyOSwgMHgwNDJkKSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQ2NywKKwlSQURJT1JFR1MoMHg2YywgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHhhMywKKwkJICAweDA5LCAweDBmLCAweDA1LCAweDAwLCAweDA1LCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzZGYsIDB4MDNkYiwgMHgwM2Q3LCAweDA0MjIsIDB4MDQyNywgMHgwNDJiKSwKKyAgfSwKKyAgewkuZnJlcQkJCT0gMjQ3MiwKKwlSQURJT1JFR1MoMHg3MCwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHhhOCwKKwkJICAweDA5LCAweDBmLCAweDA1LCAweDAwLCAweDA1LCAweDAwLCAweDYxLCAweDAzLAorCQkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MDMsCisJCSAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCksCisJUEhZUkVHUygweDAzZTEsIDB4MDNkZCwgMHgwM2Q5LCAweDA0MjAsIDB4MDQyNCwgMHgwNDI5KSwKKyAgfSwKK307CisKK2NvbnN0IHN0cnVjdCBiNDNfcGh5X2h0X2NoYW5uZWx0YWJfZV9yYWRpbzIwNTkKKypiNDNfcGh5X2h0X2dldF9jaGFubmVsdGFiX2VfcjIwNTkoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgZnJlcSkKK3sKKwljb25zdCBzdHJ1Y3QgYjQzX3BoeV9odF9jaGFubmVsdGFiX2VfcmFkaW8yMDU5ICplOworCXVuc2lnbmVkIGludCBpOworCisJZSA9IGI0M19waHlfaHRfY2hhbm5lbHRhYl9yYWRpbzIwNTk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYjQzX3BoeV9odF9jaGFubmVsdGFiX3JhZGlvMjA1OSk7IGkrKywgZSsrKSB7CisJCWlmIChlLT5mcmVxID09IGZyZXEpCisJCQlyZXR1cm4gZTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDY5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1OS5oCkBAIC0wLDAgKzEsNTQgQEAKKyNpZm5kZWYgQjQzX1JBRElPXzIwNTlfSF8KKyNkZWZpbmUgQjQzX1JBRElPXzIwNTlfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJwaHlfaHQuaCIKKworI2RlZmluZSBSMjA1OV9TWU4JCQkweDAwMAorI2RlZmluZSBSMjA1OV9UWFJYMAkJCTB4NDAwCisjZGVmaW5lIFIyMDU5X1JYUlgxCQkJMHg4MDAKKyNkZWZpbmUgUjIwNTlfQUxMCQkJMHhDMDAKKworLyogVmFsdWVzIGZvciB2YXJpb3VzIHJlZ2lzdGVycyB1cGxvYWRlZCBvbiBjaGFubmVsIHN3aXRjaGluZyAqLworc3RydWN0IGI0M19waHlfaHRfY2hhbm5lbHRhYl9lX3JhZGlvMjA1OSB7CisJLyogVGhlIGNoYW5uZWwgZnJlcXVlbmN5IGluIE1IeiAqLworCXUxNiBmcmVxOworCS8qIFZhbHVlcyBmb3IgcmFkaW8gcmVnaXN0ZXJzICovCisJdTggcmFkaW9fc3luMTY7CisJdTggcmFkaW9fc3luMTc7CisJdTggcmFkaW9fc3luMjI7CisJdTggcmFkaW9fc3luMjU7CisJdTggcmFkaW9fc3luMjc7CisJdTggcmFkaW9fc3luMjg7CisJdTggcmFkaW9fc3luMjk7CisJdTggcmFkaW9fc3luMmM7CisJdTggcmFkaW9fc3luMmQ7CisJdTggcmFkaW9fc3luMzc7CisJdTggcmFkaW9fc3luNDE7CisJdTggcmFkaW9fc3luNDM7CisJdTggcmFkaW9fc3luNDc7CisJdTggcmFkaW9fc3luNGE7CisJdTggcmFkaW9fc3luNTg7CisJdTggcmFkaW9fc3luNWE7CisJdTggcmFkaW9fc3luNmE7CisJdTggcmFkaW9fc3luNmQ7CisJdTggcmFkaW9fc3luNmU7CisJdTggcmFkaW9fc3luOTI7CisJdTggcmFkaW9fc3luOTg7CisJdTggcmFkaW9fcnh0eDRhOworCXU4IHJhZGlvX3J4dHg1ODsKKwl1OCByYWRpb19yeHR4NWE7CisJdTggcmFkaW9fcnh0eDZhOworCXU4IHJhZGlvX3J4dHg2ZDsKKwl1OCByYWRpb19yeHR4NmU7CisJdTggcmFkaW9fcnh0eDkyOworCXU4IHJhZGlvX3J4dHg5ODsKKwkvKiBWYWx1ZXMgZm9yIFBIWSByZWdpc3RlcnMgKi8KKwlzdHJ1Y3QgYjQzX3BoeV9odF9jaGFubmVsdGFiX2VfcGh5IHBoeV9yZWdzOworfTsKKworY29uc3Qgc3RydWN0IGI0M19waHlfaHRfY2hhbm5lbHRhYl9lX3JhZGlvMjA1OQorKmI0M19waHlfaHRfZ2V0X2NoYW5uZWx0YWJfZV9yMjA1OShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBmcmVxKTsKKworI2VuZGlmIC8qIEI0M19SQURJT18yMDU5X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmZraWxsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmZraWxsLmMKaW5kZXggYTYxN2VmZS4uNzBjMmZjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3Jma2lsbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yZmtpbGwuYwpAQCAtMyw3ICszLDcgQEAKICAgQnJvYWRjb20gQjQzIHdpcmVsZXNzIGRyaXZlcgogICBSRktJTEwgc3VwcG9ydAogCi0gIENvcHlyaWdodCAoYykgMjAwNyBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICBDb3B5cmlnaHQgKGMpIDIwMDcgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzcsMTcgKzM3LDE2IEBACiB7CiAJc3RydWN0IGI0M193bCAqd2wgPSBod190b19iNDNfd2woaHcpOwogCXN0cnVjdCBiNDNfd2xkZXYgKmRldiA9IHdsLT5jdXJyZW50X2RldjsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CiAJYm9vbCBlbmFibGVkOwogCWJvb2wgYnJvdWdodF91cCA9IGZhbHNlOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAlpZiAodW5saWtlbHkoYjQzX3N0YXR1cyhkZXYpIDwgQjQzX1NUQVRfSU5JVElBTElaRUQpKSB7Ci0JCWlmIChzc2JfYnVzX3Bvd2VydXAoYnVzLCAwKSkgeworCQlpZiAoYjQzX2J1c19wb3dlcnVwKGRldiwgMCkpIHsKIAkJCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIAkJCXJldHVybjsKIAkJfQotCQlzc2JfZGV2aWNlX2VuYWJsZShkZXYtPnNkZXYsIDApOworCQliNDNfZGV2aWNlX2VuYWJsZShkZXYsIDApOwogCQlicm91Z2h0X3VwID0gdHJ1ZTsKIAl9CiAKQEAgLTYzLDggKzYyLDggQEAKIAl9CiAKIAlpZiAoYnJvdWdodF91cCkgewotCQlzc2JfZGV2aWNlX2Rpc2FibGUoZGV2LT5zZGV2LCAwKTsKLQkJc3NiX2J1c19tYXlfcG93ZXJkb3duKGJ1cyk7CisJCWI0M19kZXZpY2VfZGlzYWJsZShkZXYsIDApOworCQliNDNfYnVzX21heV9wb3dlcmRvd24oZGV2KTsKIAl9CiAKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvc2Rpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3NkaW8uYwppbmRleCA4MDhlMjViLi44MGIwNzU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9zZGlvLmMKQEAgLTQsNyArNCw3IEBACiAgKiBTRElPIG92ZXIgU29uaWNzIFNpbGljb24gQmFja3BsYW5lIGJ1cyBnbHVlIGZvciBiNDMuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IEFsYmVydCBIZXJyYW56Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNjYsNyArNjYsNyBAQAogaW50IGI0M19zZGlvX3JlcXVlc3RfaXJxKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKIAkJCSB2b2lkICgqaGFuZGxlcikoc3RydWN0IGI0M193bGRldiAqZGV2KSkKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CisJc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+ZGV2LT5zZGV2LT5idXM7CiAJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGJ1cy0+aG9zdF9zZGlvOwogCXN0cnVjdCBiNDNfc2RpbyAqc2RpbyA9IHNkaW9fZ2V0X2RydmRhdGEoZnVuYyk7CiAJaW50IGVycjsKQEAgLTgyLDcgKzgyLDcgQEAKIAogdm9pZCBiNDNfc2Rpb19mcmVlX2lycShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+c2Rldi0+YnVzOworCXN0cnVjdCBzc2JfYnVzICpidXMgPSBkZXYtPmRldi0+c2Rldi0+YnVzOwogCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBidXMtPmhvc3Rfc2RpbzsKIAlzdHJ1Y3QgYjQzX3NkaW8gKnNkaW8gPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOwogCkBAIC05Myw4ICs5Myw4IEBACiAJc2Rpby0+aXJxX2hhbmRsZXIgPSBOVUxMOwogfQogCi1zdGF0aWMgaW50IGI0M19zZGlvX3Byb2JlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMsCi0JCQkgIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBiNDNfc2Rpb19wcm9iZShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jLAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBiNDNfc2RpbyAqc2RpbzsKIAlzdHJ1Y3Qgc2Rpb19mdW5jX3R1cGxlICp0dXBsZTsKQEAgLTE3MSw3ICsxNzEsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIHZvaWQgYjQzX3NkaW9fcmVtb3ZlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYjQzX3NkaW9fcmVtb3ZlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCiB7CiAJc3RydWN0IGI0M19zZGlvICpzZGlvID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3N5c2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvc3lzZnMuYwppbmRleCA1N2FmNjE5Li44ZTg0MzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvc3lzZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvc3lzZnMuYwpAQCAtNCw3ICs0LDcgQEAKIAogICBTWVNGUyBzdXBwb3J0IHJvdXRpbmVzCiAKLSAgQ29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNDAsNyArMTQwLDcgQEAKIAogaW50IGI0M19zeXNmc19yZWdpc3RlcihzdHJ1Y3QgYjQzX3dsZGV2ICp3bGRldikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3bGRldi0+c2Rldi0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdsZGV2LT5kZXYtPmRldjsKIAogCUI0M19XQVJOX09OKGI0M19zdGF0dXMod2xkZXYpICE9IEI0M19TVEFUX0lOSVRJQUxJWkVEKTsKIApAQCAtMTQ5LDcgKzE0OSw3IEBACiAKIHZvaWQgYjQzX3N5c2ZzX3VucmVnaXN0ZXIoc3RydWN0IGI0M193bGRldiAqd2xkZXYpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gd2xkZXYtPnNkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3bGRldi0+ZGV2LT5kZXY7CiAKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaW50ZXJmZXJlbmNlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXMuYwppbmRleCAxZWY5YTY0Li5lYTI4OGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlcy5jCkBAIC00LDcgKzQsNyBAQAogCiAgIENvcHlyaWdodCAoYykgMjAwNSBNYXJ0aW4gTGFuZ2VyIDxtYXJ0aW4tbGFuZ2VyQGdteC5kZT4sCiAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+Ci0gIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNiBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDYgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAgQ29weXJpZ2h0IChjKSAyMDA1IERhbm55IHZhbiBEeWsgPGt1Z2VsZmFuZ0BnZW50b28ub3JnPgogICBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhcyBKYWdnaSA8YW5kcmVhcy5qYWdnaUB3YXRlcndhdmUuY2g+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfbHBwaHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfbHBwaHkuYwppbmRleCA1OWRmM2M2Li5jZmYxODdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX2xwcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19scHBoeS5jCkBAIC0zLDcgKzMsNyBAQAogICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCiAgIElFRUUgODAyLjExYS9nIExQLVBIWSBhbmQgcmFkaW8gZGV2aWNlIGRhdGEgdGFibGVzCiAKLSAgQ29weXJpZ2h0IChjKSAyMDA5IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgIENvcHlyaWdodCAoYykgMjAwOSBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICBDb3B5cmlnaHQgKGMpIDIwMDkgR8OhYm9yIFN0ZWZhbmlrIDxuZXRyb2xsbGVyLjNkQGdtYWlsLmNvbT4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjMwNCw3ICsyMzA0LDYgQEAKIAogdm9pZCBscHBoeV9yZXYycGx1c190YWJsZV9pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CiAJaW50IGk7CiAKIAlCNDNfV0FSTl9PTihkZXYtPnBoeS5yZXYgPCAyKTsKQEAgLTIzNDEsNyArMjM0MCw3IEBACiAJYjQzX2xwdGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTFBUQUIzMigxMCwgMCksCiAJCUFSUkFZX1NJWkUobHBwaHlfcGFwZF9tdWx0X3RhYmxlKSwgbHBwaHlfcGFwZF9tdWx0X3RhYmxlKTsKIAotCWlmICgoYnVzLT5jaGlwX2lkID09IDB4NDMyNSkgJiYgKGJ1cy0+Y2hpcF9yZXYgPT0gMCkpIHsKKwlpZiAoKGRldi0+ZGV2LT5jaGlwX2lkID09IDB4NDMyNSkgJiYgKGRldi0+ZGV2LT5jaGlwX3JldiA9PSAwKSkgewogCQliNDNfbHB0YWJfd3JpdGVfYnVsayhkZXYsIEI0M19MUFRBQjMyKDEzLCAwKSwKIAkJCUFSUkFZX1NJWkUobHBwaHlfYTBfZ2Fpbl9pZHhfdGFibGUpLCBscHBoeV9hMF9nYWluX2lkeF90YWJsZSk7CiAJCWI0M19scHRhYl93cml0ZV9idWxrKGRldiwgQjQzX0xQVEFCMTYoMTQsIDApLApAQCAtMjQxNiwxMiArMjQxNSwxMiBAQAogCiB2b2lkIGxwcGh5X2luaXRfdHhfZ2Fpbl90YWJsZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+c2Rldi0+YnVzOworCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gZGV2LT5kZXYtPmJ1c19zcHJvbTsKIAogCXN3aXRjaCAoZGV2LT5waHkucmV2KSB7CiAJY2FzZSAwOgotCQlpZiAoKGJ1cy0+c3Byb20uYm9hcmRmbGFnc19oaSAmIEI0M19CRkhfTk9QQSkgfHwKLQkJICAgIChidXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX0hHUEEpKQorCQlpZiAoKHNwcm9tLT5ib2FyZGZsYWdzX2hpICYgQjQzX0JGSF9OT1BBKSB8fAorCQkgICAgKHNwcm9tLT5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9IR1BBKSkKIAkJCWxwcGh5X3dyaXRlX2dhaW5fdGFibGVfYnVsayhkZXYsIDAsIDEyOCwKIAkJCQkJbHBwaHlfcmV2MF9ub3BhX3R4X2dhaW5fdGFibGUpOwogCQllbHNlIGlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopCkBAIC0yNDMyLDggKzI0MzEsOCBAQAogCQkJCQlscHBoeV9yZXYwXzVnaHpfdHhfZ2Fpbl90YWJsZSk7CiAJCWJyZWFrOwogCWNhc2UgMToKLQkJaWYgKChidXMtPnNwcm9tLmJvYXJkZmxhZ3NfaGkgJiBCNDNfQkZIX05PUEEpIHx8Ci0JCSAgICAoYnVzLT5zcHJvbS5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9IR1BBKSkKKwkJaWYgKChzcHJvbS0+Ym9hcmRmbGFnc19oaSAmIEI0M19CRkhfTk9QQSkgfHwKKwkJICAgIChzcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfSEdQQSkpCiAJCQlscHBoeV93cml0ZV9nYWluX3RhYmxlX2J1bGsoZGV2LCAwLCAxMjgsCiAJCQkJCWxwcGh5X3JldjFfbm9wYV90eF9nYWluX3RhYmxlKTsKIAkJZWxzZSBpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKQpAQCAtMjQ0NCw3ICsyNDQzLDcgQEAKIAkJCQkJbHBwaHlfcmV2MV81Z2h6X3R4X2dhaW5fdGFibGUpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlpZiAoYnVzLT5zcHJvbS5ib2FyZGZsYWdzX2hpICYgQjQzX0JGSF9OT1BBKQorCQlpZiAoc3Byb20tPmJvYXJkZmxhZ3NfaGkgJiBCNDNfQkZIX05PUEEpCiAJCQlscHBoeV93cml0ZV9nYWluX3RhYmxlX2J1bGsoZGV2LCAwLCAxMjgsCiAJCQkJCWxwcGh5X3JldjJfbm9wYV90eF9nYWluX3RhYmxlKTsKIAkJZWxzZSBpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuYwppbmRleCAyZGU0ODNiLi45MTZmMjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuYwpAQCAtMyw3ICszLDcgQEAKICAgQnJvYWRjb20gQjQzIHdpcmVsZXNzIGRyaXZlcgogICBJRUVFIDgwMi4xMW4gUEhZIGRhdGEgdGFibGVzCiAKLSAgQ29weXJpZ2h0IChjKSAyMDA4IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgIENvcHlyaWdodCAoYykgMjAwOCBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfbnBoeS5oCmluZGV4IDE4NTY5MzYuLmE4MTY5NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfbnBoeS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfbnBoeS5oCkBAIC02MCwxNiArNjAsOCBAQAogc3RydWN0IG5waHlfZ2Fpbl9jdGxfd29ya2Fyb3VuZF9lbnRyeSAqYjQzX25waHlfZ2V0X2dhaW5fY3RsX3dvcmthcm91bmRfZW50KAogCXN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCBnaHo1LCBib29sIGV4dF9sbmEpOwogCi0vKiBHZXQgdGhlIE5QSFkgQ2hhbm5lbCBTd2l0Y2ggVGFibGUgZW50cnkgZm9yIGEgY2hhbm5lbC4KLSAqIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlIHRvIGZpbmQgYW4gZW50cnkuICovCi1jb25zdCBzdHJ1Y3QgYjQzX25waHlfY2hhbm5lbHRhYl9lbnRyeV9yZXYyICoKLWI0M19ucGh5X2dldF9jaGFudGFiZW50X3JldjIoc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCBjaGFubmVsKTsKLWNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5X3JldjMgKgotYjQzX25waHlfZ2V0X2NoYW50YWJlbnRfcmV2MyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBmcmVxKTsKLQogCiAvKiBUaGUgTi1QSFkgdGFibGVzLiAqLwotCiAjZGVmaW5lIEI0M19OVEFCX1RZUEVNQVNLCQkweEYwMDAwMDAwCiAjZGVmaW5lIEI0M19OVEFCXzhCSVQJCQkweDEwMDAwMDAwCiAjZGVmaW5lIEI0M19OVEFCXzE2QklUCQkJMHgyMDAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19waHlfaHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfcGh5X2h0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzOTM4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfcGh5X2h0LmMKQEAgLTAsMCArMSw3NTAgQEAKKy8qCisKKyAgQnJvYWRjb20gQjQzIHdpcmVsZXNzIGRyaXZlcgorICBJRUVFIDgwMi4xMW4gSFQtUEhZIGRhdGEgdGFibGVzCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RlZXQsIEZpZnRoIEZsb29yLAorICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworKi8KKworI2luY2x1ZGUgImI0My5oIgorI2luY2x1ZGUgInRhYmxlc19waHlfaHQuaCIKKyNpbmNsdWRlICJwaHlfY29tbW9uLmgiCisjaW5jbHVkZSAicGh5X2h0LmgiCisKK3N0YXRpYyBjb25zdCB1MTYgYjQzX2h0dGFiXzB4MTJbXSA9IHsKKwkweDAwMDAsIDB4MDAwOCwgMHgwMDBhLCAweDAwMTAsIDB4MDAxMiwgMHgwMDE5LAorCTB4MDAxYSwgMHgwMDFjLCAweDAwODAsIDB4MDA4OCwgMHgwMDhhLCAweDAwOTAsCisJMHgwMDkyLCAweDAwOTksIDB4MDA5YSwgMHgwMDljLCAweDAxMDAsIDB4MDEwOCwKKwkweDAxMGEsIDB4MDExMCwgMHgwMTEyLCAweDAxMTksIDB4MDExYSwgMHgwMTFjLAorCTB4MDE4MCwgMHgwMTg4LCAweDAxOGEsIDB4MDE5MCwgMHgwMTkyLCAweDAxOTksCisJMHgwMTlhLCAweDAxOWMsIDB4MDAwMCwgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwKKwkweDAwOWEsIDB4MDBhMiwgMHgwMGFhLCAweDAxMjAsIDB4MDEyOCwgMHgwMTI4LAorCTB4MDEzMCwgMHgwMTM4LCAweDAxMzgsIDB4MDE0MCwgMHgwMTIyLCAweDAxMmEsCisJMHgwMTJhLCAweDAxMzIsIDB4MDEzYSwgMHgwMTNhLCAweDAxNDIsIDB4MDFhOCwKKwkweDAxYjAsIDB4MDFiOCwgMHgwMWIwLCAweDAxYjgsIDB4MDFjMCwgMHgwMWM4LAorCTB4MDFjMCwgMHgwMWM4LCAweDAxZDAsIDB4MDFkMCwgMHgwMWQ4LCAweDAxYWEsCisJMHgwMWIyLCAweDAxYmEsIDB4MDFiMiwgMHgwMWJhLCAweDAxYzIsIDB4MDFjYSwKKwkweDAxYzIsIDB4MDFjYSwgMHgwMWQyLCAweDAxZDIsIDB4MDFkYSwgMHgwMDAxLAorCTB4MDAwMiwgMHgwMDA0LCAweDAwMDksIDB4MDAwYywgMHgwMDExLCAweDAwMTQsCisJMHgwMDE4LCAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjQsIDB4MDA4MSwKKwkweDAwODIsIDB4MDA4NCwgMHgwMDg5LCAweDAwOGMsIDB4MDA5MSwgMHgwMDk0LAorCTB4MDA5OCwgMHgwMGEwLCAweDAwYTEsIDB4MDBhMiwgMHgwMGE0LCAweDAwMDcsCisJMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywKKwkweDAwMDcsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDA3LAorCTB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsCisJMHgwMDA3LCAweDAwMDcsIDB4MDAwNywgMHgwMDA3LCAweDAwMDcsIDB4MDAwNywKKwkweDAwMDcsIDB4MDAwNywKK307CisKK3N0YXRpYyBjb25zdCB1MTYgYjQzX2h0dGFiXzB4MjdbXSA9IHsKKwkweDAwMDksIDB4MDAwZSwgMHgwMDExLCAweDAwMTQsIDB4MDAxNywgMHgwMDFhLAorCTB4MDAxZCwgMHgwMDIwLCAweDAwMDksIDB4MDAwZSwgMHgwMDExLCAweDAwMTQsCisJMHgwMDE3LCAweDAwMWEsIDB4MDAxZCwgMHgwMDIwLCAweDAwMDksIDB4MDAwZSwKKwkweDAwMTEsIDB4MDAxNCwgMHgwMDE3LCAweDAwMWEsIDB4MDAxZCwgMHgwMDIwLAorCTB4MDAwOSwgMHgwMDBlLCAweDAwMTEsIDB4MDAxNCwgMHgwMDE3LCAweDAwMWEsCisJMHgwMDFkLCAweDAwMjAsCit9OworCitzdGF0aWMgY29uc3QgdTE2IGI0M19odHRhYl8weDI2W10gPSB7CisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGI0M19odHRhYl8weDI1W10gPSB7CisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBiNDNfaHR0YWJfMHgyZltdID0geworCTB4MDAwMzU3MDAsIDB4MDAwMmNjOWEsIDB4MDAwMjY2NjYsIDB4MDAwMTU4MWYsCisJMHgwMDAxNTgxZiwgMHgwMDAxNTgxZiwgMHgwMDAxNTgxZiwgMHgwMDAxNTgxZiwKKwkweDAwMDE1ODFmLCAweDAwMDE1ODFmLCAweDAwMDE1ODFmLCAweDAwMDM1NzAwLAorCTB4MDAwMmNjOWEsIDB4MDAwMjY2NjYsIDB4MDAwMTU4MWYsIDB4MDAwMTU4MWYsCisJMHgwMDAxNTgxZiwgMHgwMDAxNTgxZiwgMHgwMDAxNTgxZiwgMHgwMDAxNTgxZiwKKwkweDAwMDE1ODFmLCAweDAwMDE1ODFmLAorfTsKKworc3RhdGljIGNvbnN0IHUxNiBiNDNfaHR0YWJfMHgxYVtdID0geworCTB4MDA1NSwgMHgwMDU0LCAweDAwNTQsIDB4MDA1MywgMHgwMDUyLCAweDAwNTIsCisJMHgwMDUxLCAweDAwNTEsIDB4MDA1MCwgMHgwMDRmLCAweDAwNGYsIDB4MDA0ZSwKKwkweDAwNGUsIDB4MDA0ZCwgMHgwMDRjLCAweDAwNGMsIDB4MDA0YiwgMHgwMDRhLAorCTB4MDA0OSwgMHgwMDQ5LCAweDAwNDgsIDB4MDA0NywgMHgwMDQ2LCAweDAwNDYsCisJMHgwMDQ1LCAweDAwNDQsIDB4MDA0MywgMHgwMDQyLCAweDAwNDEsIDB4MDA0MCwKKwkweDAwNDAsIDB4MDAzZiwgMHgwMDNlLCAweDAwM2QsIDB4MDAzYywgMHgwMDNhLAorCTB4MDAzOSwgMHgwMDM4LCAweDAwMzcsIDB4MDAzNiwgMHgwMDM1LCAweDAwMzMsCisJMHgwMDMyLCAweDAwMzEsIDB4MDAyZiwgMHgwMDJlLCAweDAwMmMsIDB4MDAyYiwKKwkweDAwMjksIDB4MDAyNywgMHgwMDI1LCAweDAwMjMsIDB4MDAyMSwgMHgwMDFmLAorCTB4MDAxZCwgMHgwMDFhLCAweDAwMTgsIDB4MDAxNSwgMHgwMDEyLCAweDAwMGUsCisJMHgwMDBiLCAweDAwMDcsIDB4MDAwMiwgMHgwMGZkLAorfTsKKworc3RhdGljIGNvbnN0IHUxNiBiNDNfaHR0YWJfMHgxYltdID0geworCTB4MDA1NSwgMHgwMDU0LCAweDAwNTQsIDB4MDA1MywgMHgwMDUyLCAweDAwNTIsCisJMHgwMDUxLCAweDAwNTEsIDB4MDA1MCwgMHgwMDRmLCAweDAwNGYsIDB4MDA0ZSwKKwkweDAwNGUsIDB4MDA0ZCwgMHgwMDRjLCAweDAwNGMsIDB4MDA0YiwgMHgwMDRhLAorCTB4MDA0OSwgMHgwMDQ5LCAweDAwNDgsIDB4MDA0NywgMHgwMDQ2LCAweDAwNDYsCisJMHgwMDQ1LCAweDAwNDQsIDB4MDA0MywgMHgwMDQyLCAweDAwNDEsIDB4MDA0MCwKKwkweDAwNDAsIDB4MDAzZiwgMHgwMDNlLCAweDAwM2QsIDB4MDAzYywgMHgwMDNhLAorCTB4MDAzOSwgMHgwMDM4LCAweDAwMzcsIDB4MDAzNiwgMHgwMDM1LCAweDAwMzMsCisJMHgwMDMyLCAweDAwMzEsIDB4MDAyZiwgMHgwMDJlLCAweDAwMmMsIDB4MDAyYiwKKwkweDAwMjksIDB4MDAyNywgMHgwMDI1LCAweDAwMjMsIDB4MDAyMSwgMHgwMDFmLAorCTB4MDAxZCwgMHgwMDFhLCAweDAwMTgsIDB4MDAxNSwgMHgwMDEyLCAweDAwMGUsCisJMHgwMDBiLCAweDAwMDcsIDB4MDAwMiwgMHgwMGZkLAorfTsKKworc3RhdGljIGNvbnN0IHUxNiBiNDNfaHR0YWJfMHgxY1tdID0geworCTB4MDA1NSwgMHgwMDU0LCAweDAwNTQsIDB4MDA1MywgMHgwMDUyLCAweDAwNTIsCisJMHgwMDUxLCAweDAwNTEsIDB4MDA1MCwgMHgwMDRmLCAweDAwNGYsIDB4MDA0ZSwKKwkweDAwNGUsIDB4MDA0ZCwgMHgwMDRjLCAweDAwNGMsIDB4MDA0YiwgMHgwMDRhLAorCTB4MDA0OSwgMHgwMDQ5LCAweDAwNDgsIDB4MDA0NywgMHgwMDQ2LCAweDAwNDYsCisJMHgwMDQ1LCAweDAwNDQsIDB4MDA0MywgMHgwMDQyLCAweDAwNDEsIDB4MDA0MCwKKwkweDAwNDAsIDB4MDAzZiwgMHgwMDNlLCAweDAwM2QsIDB4MDAzYywgMHgwMDNhLAorCTB4MDAzOSwgMHgwMDM4LCAweDAwMzcsIDB4MDAzNiwgMHgwMDM1LCAweDAwMzMsCisJMHgwMDMyLCAweDAwMzEsIDB4MDAyZiwgMHgwMDJlLCAweDAwMmMsIDB4MDAyYiwKKwkweDAwMjksIDB4MDAyNywgMHgwMDI1LCAweDAwMjMsIDB4MDAyMSwgMHgwMDFmLAorCTB4MDAxZCwgMHgwMDFhLCAweDAwMTgsIDB4MDAxNSwgMHgwMDEyLCAweDAwMGUsCisJMHgwMDBiLCAweDAwMDcsIDB4MDAwMiwgMHgwMGZkLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBiNDNfaHR0YWJfMHgxYV8weGMwW10gPSB7CisJMHg1YmY3MDA0NCwgMHg1YmY3MDA0MiwgMHg1YmY3MDA0MCwgMHg1YmY3MDAzZSwKKwkweDViZjcwMDNjLCAweDViZjcwMDNiLCAweDViZjcwMDM5LCAweDViZjcwMDM3LAorCTB4NWJmNzAwMzYsIDB4NWJmNzAwMzQsIDB4NWJmNzAwMzMsIDB4NWJmNzAwMzEsCisJMHg1YmY3MDAzMCwgMHg1YmE3MDA0NCwgMHg1YmE3MDA0MiwgMHg1YmE3MDA0MCwKKwkweDViYTcwMDNlLCAweDViYTcwMDNjLCAweDViYTcwMDNiLCAweDViYTcwMDM5LAorCTB4NWJhNzAwMzcsIDB4NWJhNzAwMzYsIDB4NWJhNzAwMzQsIDB4NWJhNzAwMzMsCisJMHg1Yjc3MDA0NCwgMHg1Yjc3MDA0MiwgMHg1Yjc3MDA0MCwgMHg1Yjc3MDAzZSwKKwkweDViNzcwMDNjLCAweDViNzcwMDNiLCAweDViNzcwMDM5LCAweDViNzcwMDM3LAorCTB4NWI3NzAwMzYsIDB4NWI3NzAwMzQsIDB4NWI3NzAwMzMsIDB4NWI3NzAwMzEsCisJMHg1Yjc3MDAzMCwgMHg1Yjc3MDAyZiwgMHg1Yjc3MDAyZCwgMHg1Yjc3MDAyYywKKwkweDViNDcwMDQ0LCAweDViNDcwMDQyLCAweDViNDcwMDQwLCAweDViNDcwMDNlLAorCTB4NWI0NzAwM2MsIDB4NWI0NzAwM2IsIDB4NWI0NzAwMzksIDB4NWI0NzAwMzcsCisJMHg1YjQ3MDAzNiwgMHg1YjQ3MDAzNCwgMHg1YjQ3MDAzMywgMHg1YjQ3MDAzMSwKKwkweDViNDcwMDMwLCAweDViNDcwMDJmLCAweDViNDcwMDJkLCAweDViNDcwMDJjLAorCTB4NWI0NzAwMmIsIDB4NWI0NzAwMmEsIDB4NWIyNzAwNDQsIDB4NWIyNzAwNDIsCisJMHg1YjI3MDA0MCwgMHg1YjI3MDAzZSwgMHg1YjI3MDAzYywgMHg1YjI3MDAzYiwKKwkweDViMjcwMDM5LCAweDViMjcwMDM3LCAweDViMjcwMDM2LCAweDViMjcwMDM0LAorCTB4NWIyNzAwMzMsIDB4NWIyNzAwMzEsIDB4NWIyNzAwMzAsIDB4NWIyNzAwMmYsCisJMHg1YjE3MDA0NCwgMHg1YjE3MDA0MiwgMHg1YjE3MDA0MCwgMHg1YjE3MDAzZSwKKwkweDViMTcwMDNjLCAweDViMTcwMDNiLCAweDViMTcwMDM5LCAweDViMTcwMDM3LAorCTB4NWIxNzAwMzYsIDB4NWIxNzAwMzQsIDB4NWIxNzAwMzMsIDB4NWIxNzAwMzEsCisJMHg1YjE3MDAzMCwgMHg1YjE3MDAyZiwgMHg1YjE3MDAyZCwgMHg1YjE3MDAyYywKKwkweDViMTcwMDJiLCAweDViMTcwMDJhLCAweDViMTcwMDI4LCAweDViMTcwMDI3LAorCTB4NWIxNzAwMjYsIDB4NWIxNzAwMjUsIDB4NWIxNzAwMjQsIDB4NWIxNzAwMjMsCisJMHg1YjA3MDA0NCwgMHg1YjA3MDA0MiwgMHg1YjA3MDA0MCwgMHg1YjA3MDAzZSwKKwkweDViMDcwMDNjLCAweDViMDcwMDNiLCAweDViMDcwMDM5LCAweDViMDcwMDM3LAorCTB4NWIwNzAwMzYsIDB4NWIwNzAwMzQsIDB4NWIwNzAwMzMsIDB4NWIwNzAwMzEsCisJMHg1YjA3MDAzMCwgMHg1YjA3MDAyZiwgMHg1YjA3MDAyZCwgMHg1YjA3MDAyYywKKwkweDViMDcwMDJiLCAweDViMDcwMDJhLCAweDViMDcwMDI4LCAweDViMDcwMDI3LAorCTB4NWIwNzAwMjYsIDB4NWIwNzAwMjUsIDB4NWIwNzAwMjQsIDB4NWIwNzAwMjMsCisJMHg1YjA3MDAyMiwgMHg1YjA3MDAyMSwgMHg1YjA3MDAyMCwgMHg1YjA3MDAxZiwKKwkweDViMDcwMDFlLCAweDViMDcwMDFkLCAweDViMDcwMDFkLCAweDViMDcwMDFjLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBiNDNfaHR0YWJfMHgxYV8weDE0MFtdID0geworCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYjQzX2h0dGFiXzB4MWJfMHgxNDBbXSA9IHsKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGI0M19odHRhYl8weDFjXzB4MTQwW10gPSB7CisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHUxNiBiNDNfaHR0YWJfMHgxYV8weDFjMFtdID0geworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHUxNiBiNDNfaHR0YWJfMHgxYl8weDFjMFtdID0geworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHUxNiBiNDNfaHR0YWJfMHgxY18weDFjMFtdID0geworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHUxNiBiNDNfaHR0YWJfMHgxYV8weDI0MFtdID0geworCTB4MDAzNiwgMHgwMDM2LCAweDAwMzYsIDB4MDAzNiwgMHgwMDM2LCAweDAwMzYsCisJMHgwMDM2LCAweDAwMzYsIDB4MDAzNiwgMHgwMDM2LCAweDAwMzYsIDB4MDAzNiwKKwkweDAwMzYsIDB4MDAyYSwgMHgwMDJhLCAweDAwMmEsIDB4MDAyYSwgMHgwMDJhLAorCTB4MDAyYSwgMHgwMDJhLCAweDAwMmEsIDB4MDAyYSwgMHgwMDJhLCAweDAwMmEsCisJMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwgMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwKKwkweDAwMWUsIDB4MDAxZSwgMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwgMHgwMDFlLAorCTB4MDAxZSwgMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMGUsCisJMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwKKwkweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLAorCTB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMWZjLCAweDAxZmMsCisJMHgwMWZjLCAweDAxZmMsIDB4MDFmYywgMHgwMWZjLCAweDAxZmMsIDB4MDFmYywKKwkweDAxZmMsIDB4MDFmYywgMHgwMWZjLCAweDAxZmMsIDB4MDFmYywgMHgwMWZjLAorCTB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsCisJMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwKKwkweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLAorCTB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsCisJMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwKKwkweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LAorCTB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsCisJMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwKKwkweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LAorCTB4MDFkNiwgMHgwMWQ2LAorfTsKKworc3RhdGljIGNvbnN0IHUxNiBiNDNfaHR0YWJfMHgxYl8weDI0MFtdID0geworCTB4MDAzNiwgMHgwMDM2LCAweDAwMzYsIDB4MDAzNiwgMHgwMDM2LCAweDAwMzYsCisJMHgwMDM2LCAweDAwMzYsIDB4MDAzNiwgMHgwMDM2LCAweDAwMzYsIDB4MDAzNiwKKwkweDAwMzYsIDB4MDAyYSwgMHgwMDJhLCAweDAwMmEsIDB4MDAyYSwgMHgwMDJhLAorCTB4MDAyYSwgMHgwMDJhLCAweDAwMmEsIDB4MDAyYSwgMHgwMDJhLCAweDAwMmEsCisJMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwgMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwKKwkweDAwMWUsIDB4MDAxZSwgMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwgMHgwMDFlLAorCTB4MDAxZSwgMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMGUsCisJMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwKKwkweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLAorCTB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMWZjLCAweDAxZmMsCisJMHgwMWZjLCAweDAxZmMsIDB4MDFmYywgMHgwMWZjLCAweDAxZmMsIDB4MDFmYywKKwkweDAxZmMsIDB4MDFmYywgMHgwMWZjLCAweDAxZmMsIDB4MDFmYywgMHgwMWZjLAorCTB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsCisJMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwKKwkweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLAorCTB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsCisJMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwKKwkweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LAorCTB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsCisJMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwKKwkweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LAorCTB4MDFkNiwgMHgwMWQ2LAorfTsKKworc3RhdGljIGNvbnN0IHUxNiBiNDNfaHR0YWJfMHgxY18weDI0MFtdID0geworCTB4MDAzNiwgMHgwMDM2LCAweDAwMzYsIDB4MDAzNiwgMHgwMDM2LCAweDAwMzYsCisJMHgwMDM2LCAweDAwMzYsIDB4MDAzNiwgMHgwMDM2LCAweDAwMzYsIDB4MDAzNiwKKwkweDAwMzYsIDB4MDAyYSwgMHgwMDJhLCAweDAwMmEsIDB4MDAyYSwgMHgwMDJhLAorCTB4MDAyYSwgMHgwMDJhLCAweDAwMmEsIDB4MDAyYSwgMHgwMDJhLCAweDAwMmEsCisJMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwgMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwKKwkweDAwMWUsIDB4MDAxZSwgMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwgMHgwMDFlLAorCTB4MDAxZSwgMHgwMDFlLCAweDAwMWUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMGUsCisJMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwKKwkweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLAorCTB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4MDAwZSwgMHgwMWZjLCAweDAxZmMsCisJMHgwMWZjLCAweDAxZmMsIDB4MDFmYywgMHgwMWZjLCAweDAxZmMsIDB4MDFmYywKKwkweDAxZmMsIDB4MDFmYywgMHgwMWZjLCAweDAxZmMsIDB4MDFmYywgMHgwMWZjLAorCTB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsCisJMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwKKwkweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLAorCTB4MDFlZSwgMHgwMWVlLCAweDAxZWUsIDB4MDFlZSwgMHgwMWVlLCAweDAxZWUsCisJMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwKKwkweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LAorCTB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsCisJMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwKKwkweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LCAweDAxZDYsIDB4MDFkNiwgMHgwMWQ2LAorCTB4MDFkNiwgMHgwMWQ2LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBiNDNfaHR0YWJfMHgxZltdID0geworCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTYwMjMsIDB4MDAwMDYwMjgsCisJMHgwMDAzNDAzNiwgMHgwMDAzNDAyZSwgMHgwMDA3MjAzYywgMHgwMDA2ZTAzNywKKwkweDAwMDcwMDMwLCAweDAwMDk0MDFmLCAweDAwMDlhMDBmLCAweDAwMGI2MDBkLAorCTB4MDAwYzgwMDcsIDB4MDAwY2UwMDcsIDB4MDAxMDFmZmYsIDB4MDAxMjFmZjksCisJMHgwMDEyZTAwNCwgMHgwMDE0ZGZmYywgMHgwMDE2ZGZmNiwgMHgwMDE4ZGZlOSwKKwkweDAwMWIzZmU1LCAweDAwMWM1ZmQwLCAweDAwMWRkZmMyLCAweDAwMWYxZmI2LAorCTB4MDAyMDdmYTQsIDB4MDAyMTlmOGYsIDB4MDAyMmZmN2QsIDB4MDAyNDdmNmMsCisJMHgwMDI0ZGY1YiwgMHgwMDI2N2Y0YiwgMHgwMDI3ZGYzYiwgMHgwMDI5YmYzYiwKKwkweDAwMmI1ZjJmLCAweDAwMmQzZjJlLCAweDAwMmY1ZjJhLCAweDAwMmZmZjE1LAorCTB4MDAzMTVmMGIsIDB4MDAzMmRlZmEsIDB4MDAzM2JlZWIsIDB4MDAzNGZlZDksCisJMHgwMDM1M2VjNSwgMHgwMDM2MWViMCwgMHgwMDM2M2U5YiwgMHgwMDM2YmU4NywKKwkweDAwMzZiZTcwLCAweDAwMzhmZTY3LCAweDAwNDRiZWIyLCAweDAwNTEzZWYzLAorCTB4MDA1OTVmMTEsIDB4MDA2NjlmM2QsIDB4MDA3OGRmZGYsIDB4MDBhMTQzYWEsCisJMHgwMTY0MmZmZiwgMHgwMTYyYWZmZiwgMHgwMTYyMGZmZiwgMHgwMTYwY2ZmZiwKKwkweDAxNWYwZmZmLCAweDAxNWRhZmZmLCAweDAxNWJjZmZmLCAweDAxNWJjZmZmLAorCTB4MDE1YjRmZmYsIDB4MDE1YWNmZmYsIDB4MDE1OTBmZmYsIDB4MDE1NmNmZmYsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGI0M19odHRhYl8weDIxW10gPSB7CisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxNjAyMywgMHgwMDAwNjAyOCwKKwkweDAwMDM0MDM2LCAweDAwMDM0MDJlLCAweDAwMDcyMDNjLCAweDAwMDZlMDM3LAorCTB4MDAwNzAwMzAsIDB4MDAwOTQwMWYsIDB4MDAwOWEwMGYsIDB4MDAwYjYwMGQsCisJMHgwMDBjODAwNywgMHgwMDBjZTAwNywgMHgwMDEwMWZmZiwgMHgwMDEyMWZmOSwKKwkweDAwMTJlMDA0LCAweDAwMTRkZmZjLCAweDAwMTZkZmY2LCAweDAwMThkZmU5LAorCTB4MDAxYjNmZTUsIDB4MDAxYzVmZDAsIDB4MDAxZGRmYzIsIDB4MDAxZjFmYjYsCisJMHgwMDIwN2ZhNCwgMHgwMDIxOWY4ZiwgMHgwMDIyZmY3ZCwgMHgwMDI0N2Y2YywKKwkweDAwMjRkZjViLCAweDAwMjY3ZjRiLCAweDAwMjdkZjNiLCAweDAwMjliZjNiLAorCTB4MDAyYjVmMmYsIDB4MDAyZDNmMmUsIDB4MDAyZjVmMmEsIDB4MDAyZmZmMTUsCisJMHgwMDMxNWYwYiwgMHgwMDMyZGVmYSwgMHgwMDMzYmVlYiwgMHgwMDM0ZmVkOSwKKwkweDAwMzUzZWM1LCAweDAwMzYxZWIwLCAweDAwMzYzZTliLCAweDAwMzZiZTg3LAorCTB4MDAzNmJlNzAsIDB4MDAzOGZlNjcsIDB4MDA0NGJlYjIsIDB4MDA1MTNlZjMsCisJMHgwMDU5NWYxMSwgMHgwMDY2OWYzZCwgMHgwMDc4ZGZkZiwgMHgwMGExNDNhYSwKKwkweDAxNjQyZmZmLCAweDAxNjJhZmZmLCAweDAxNjIwZmZmLCAweDAxNjBjZmZmLAorCTB4MDE1ZjBmZmYsIDB4MDE1ZGFmZmYsIDB4MDE1YmNmZmYsIDB4MDE1YmNmZmYsCisJMHgwMTViNGZmZiwgMHgwMTVhY2ZmZiwgMHgwMTU5MGZmZiwgMHgwMTU2Y2ZmZiwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYjQzX2h0dGFiXzB4MjNbXSA9IHsKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDE2MDIzLCAweDAwMDA2MDI4LAorCTB4MDAwMzQwMzYsIDB4MDAwMzQwMmUsIDB4MDAwNzIwM2MsIDB4MDAwNmUwMzcsCisJMHgwMDA3MDAzMCwgMHgwMDA5NDAxZiwgMHgwMDA5YTAwZiwgMHgwMDBiNjAwZCwKKwkweDAwMGM4MDA3LCAweDAwMGNlMDA3LCAweDAwMTAxZmZmLCAweDAwMTIxZmY5LAorCTB4MDAxMmUwMDQsIDB4MDAxNGRmZmMsIDB4MDAxNmRmZjYsIDB4MDAxOGRmZTksCisJMHgwMDFiM2ZlNSwgMHgwMDFjNWZkMCwgMHgwMDFkZGZjMiwgMHgwMDFmMWZiNiwKKwkweDAwMjA3ZmE0LCAweDAwMjE5ZjhmLCAweDAwMjJmZjdkLCAweDAwMjQ3ZjZjLAorCTB4MDAyNGRmNWIsIDB4MDAyNjdmNGIsIDB4MDAyN2RmM2IsIDB4MDAyOWJmM2IsCisJMHgwMDJiNWYyZiwgMHgwMDJkM2YyZSwgMHgwMDJmNWYyYSwgMHgwMDJmZmYxNSwKKwkweDAwMzE1ZjBiLCAweDAwMzJkZWZhLCAweDAwMzNiZWViLCAweDAwMzRmZWQ5LAorCTB4MDAzNTNlYzUsIDB4MDAzNjFlYjAsIDB4MDAzNjNlOWIsIDB4MDAzNmJlODcsCisJMHgwMDM2YmU3MCwgMHgwMDM4ZmU2NywgMHgwMDQ0YmViMiwgMHgwMDUxM2VmMywKKwkweDAwNTk1ZjExLCAweDAwNjY5ZjNkLCAweDAwNzhkZmRmLCAweDAwYTE0M2FhLAorCTB4MDE2NDJmZmYsIDB4MDE2MmFmZmYsIDB4MDE2MjBmZmYsIDB4MDE2MGNmZmYsCisJMHgwMTVmMGZmZiwgMHgwMTVkYWZmZiwgMHgwMTViY2ZmZiwgMHgwMTViY2ZmZiwKKwkweDAxNWI0ZmZmLCAweDAxNWFjZmZmLCAweDAxNTkwZmZmLCAweDAxNTZjZmZmLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBiNDNfaHR0YWJfMHgyMFtdID0geworCTB4MGI1ZTAwMmQsIDB4MGFlMjAwMmYsIDB4MGEzYjAwMzIsIDB4MDlhNzAwMzUsCisJMHgwOTIyMDAzOCwgMHgwOGFiMDAzYiwgMHgwODFmMDAzZiwgMHgwN2EyMDA0MywKKwkweDA3MzQwMDQ3LCAweDA2ZDIwMDRiLCAweDA2N2EwMDRmLCAweDA2MTcwMDU0LAorCTB4MDViZjAwNTksIDB4MDU3MTAwNWUsIDB4MDUxZTAwNjQsIDB4MDRkMzAwNmEsCisJMHgwNDkxMDA3MCwgMHgwNDRjMDA3NywgMHgwNDBmMDA3ZSwgMHgwM2Q5MDA4NSwKKwkweDAzYTEwMDhkLCAweDAzNmYwMDk1LCAweDAzM2QwMDllLCAweDAzMGIwMGE4LAorCTB4MDJlMDAwYjIsIDB4MDJiOTAwYmMsIDB4MDI5MjAwYzcsIDB4MDI2ZDAwZDMsCisJMHgwMjQ5MDBlMCwgMHgwMjI5MDBlZCwgMHgwMjBhMDBmYiwgMHgwMWVjMDEwYSwKKwkweDAxZDIwMTE5LCAweDAxYjcwMTJhLCAweDAxOWUwMTNjLCAweDAxODgwMTRlLAorCTB4MDE3MjAxNjIsIDB4MDE1ZDAxNzcsIDB4MDE0OTAxOGUsIDB4MDEzNzAxYTUsCisJMHgwMTI2MDFiZSwgMHgwMTE1MDFkOCwgMHgwMTA2MDFmNCwgMHgwMGY3MDIxMiwKKwkweDAwZTkwMjMxLCAweDAwZGMwMjUzLCAweDAwZDAwMjc2LCAweDAwYzQwMjliLAorCTB4MDBiOTAyYzMsIDB4MDBhZjAyZWQsIDB4MDBhNTAzMTksIDB4MDA5YzAzNDgsCisJMHgwMDkzMDM3YSwgMHgwMDhiMDNhZiwgMHgwMDgzMDNlNiwgMHgwMDdjMDQyMiwKKwkweDAwNzUwNDYwLCAweDAwNmUwNGEzLCAweDAwNjgwNGU5LCAweDAwNjIwNTMzLAorCTB4MDA1ZDA1ODIsIDB4MDA1ODA1ZDYsIDB4MDA1MzA2MmUsIDB4MDA0ZTA2OGMsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGI0M19odHRhYl8weDIyW10gPSB7CisJMHgwYjVlMDAyZCwgMHgwYWUyMDAyZiwgMHgwYTNiMDAzMiwgMHgwOWE3MDAzNSwKKwkweDA5MjIwMDM4LCAweDA4YWIwMDNiLCAweDA4MWYwMDNmLCAweDA3YTIwMDQzLAorCTB4MDczNDAwNDcsIDB4MDZkMjAwNGIsIDB4MDY3YTAwNGYsIDB4MDYxNzAwNTQsCisJMHgwNWJmMDA1OSwgMHgwNTcxMDA1ZSwgMHgwNTFlMDA2NCwgMHgwNGQzMDA2YSwKKwkweDA0OTEwMDcwLCAweDA0NGMwMDc3LCAweDA0MGYwMDdlLCAweDAzZDkwMDg1LAorCTB4MDNhMTAwOGQsIDB4MDM2ZjAwOTUsIDB4MDMzZDAwOWUsIDB4MDMwYjAwYTgsCisJMHgwMmUwMDBiMiwgMHgwMmI5MDBiYywgMHgwMjkyMDBjNywgMHgwMjZkMDBkMywKKwkweDAyNDkwMGUwLCAweDAyMjkwMGVkLCAweDAyMGEwMGZiLCAweDAxZWMwMTBhLAorCTB4MDFkMjAxMTksIDB4MDFiNzAxMmEsIDB4MDE5ZTAxM2MsIDB4MDE4ODAxNGUsCisJMHgwMTcyMDE2MiwgMHgwMTVkMDE3NywgMHgwMTQ5MDE4ZSwgMHgwMTM3MDFhNSwKKwkweDAxMjYwMWJlLCAweDAxMTUwMWQ4LCAweDAxMDYwMWY0LCAweDAwZjcwMjEyLAorCTB4MDBlOTAyMzEsIDB4MDBkYzAyNTMsIDB4MDBkMDAyNzYsIDB4MDBjNDAyOWIsCisJMHgwMGI5MDJjMywgMHgwMGFmMDJlZCwgMHgwMGE1MDMxOSwgMHgwMDljMDM0OCwKKwkweDAwOTMwMzdhLCAweDAwOGIwM2FmLCAweDAwODMwM2U2LCAweDAwN2MwNDIyLAorCTB4MDA3NTA0NjAsIDB4MDA2ZTA0YTMsIDB4MDA2ODA0ZTksIDB4MDA2MjA1MzMsCisJMHgwMDVkMDU4MiwgMHgwMDU4MDVkNiwgMHgwMDUzMDYyZSwgMHgwMDRlMDY4YywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYjQzX2h0dGFiXzB4MjRbXSA9IHsKKwkweDBiNWUwMDJkLCAweDBhZTIwMDJmLCAweDBhM2IwMDMyLCAweDA5YTcwMDM1LAorCTB4MDkyMjAwMzgsIDB4MDhhYjAwM2IsIDB4MDgxZjAwM2YsIDB4MDdhMjAwNDMsCisJMHgwNzM0MDA0NywgMHgwNmQyMDA0YiwgMHgwNjdhMDA0ZiwgMHgwNjE3MDA1NCwKKwkweDA1YmYwMDU5LCAweDA1NzEwMDVlLCAweDA1MWUwMDY0LCAweDA0ZDMwMDZhLAorCTB4MDQ5MTAwNzAsIDB4MDQ0YzAwNzcsIDB4MDQwZjAwN2UsIDB4MDNkOTAwODUsCisJMHgwM2ExMDA4ZCwgMHgwMzZmMDA5NSwgMHgwMzNkMDA5ZSwgMHgwMzBiMDBhOCwKKwkweDAyZTAwMGIyLCAweDAyYjkwMGJjLCAweDAyOTIwMGM3LCAweDAyNmQwMGQzLAorCTB4MDI0OTAwZTAsIDB4MDIyOTAwZWQsIDB4MDIwYTAwZmIsIDB4MDFlYzAxMGEsCisJMHgwMWQyMDExOSwgMHgwMWI3MDEyYSwgMHgwMTllMDEzYywgMHgwMTg4MDE0ZSwKKwkweDAxNzIwMTYyLCAweDAxNWQwMTc3LCAweDAxNDkwMThlLCAweDAxMzcwMWE1LAorCTB4MDEyNjAxYmUsIDB4MDExNTAxZDgsIDB4MDEwNjAxZjQsIDB4MDBmNzAyMTIsCisJMHgwMGU5MDIzMSwgMHgwMGRjMDI1MywgMHgwMGQwMDI3NiwgMHgwMGM0MDI5YiwKKwkweDAwYjkwMmMzLCAweDAwYWYwMmVkLCAweDAwYTUwMzE5LCAweDAwOWMwMzQ4LAorCTB4MDA5MzAzN2EsIDB4MDA4YjAzYWYsIDB4MDA4MzAzZTYsIDB4MDA3YzA0MjIsCisJMHgwMDc1MDQ2MCwgMHgwMDZlMDRhMywgMHgwMDY4MDRlOSwgMHgwMDYyMDUzMywKKwkweDAwNWQwNTgyLCAweDAwNTgwNWQ2LCAweDAwNTMwNjJlLCAweDAwNGUwNjhjLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSL1cgb3BzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgYjQzX2h0dGFiX3JlYWQoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MzIgb2Zmc2V0KQoreworCXUzMiB0eXBlLCB2YWx1ZTsKKworCXR5cGUgPSBvZmZzZXQgJiBCNDNfSFRUQUJfVFlQRU1BU0s7CisJb2Zmc2V0ICY9IH5CNDNfSFRUQUJfVFlQRU1BU0s7CisJQjQzX1dBUk5fT04ob2Zmc2V0ID4gMHhGRkZGKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQjQzX0hUVEFCXzhCSVQ6CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX1RBQkxFX0FERFIsIG9mZnNldCk7CisJCXZhbHVlID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9IVF9UQUJMRV9EQVRBTE8pICYgMHhGRjsKKwkJYnJlYWs7CisJY2FzZSBCNDNfSFRUQUJfMTZCSVQ6CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX1RBQkxFX0FERFIsIG9mZnNldCk7CisJCXZhbHVlID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9IVF9UQUJMRV9EQVRBTE8pOworCQlicmVhazsKKwljYXNlIEI0M19IVFRBQl8zMkJJVDoKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfSFRfVEFCTEVfQUREUiwgb2Zmc2V0KTsKKwkJdmFsdWUgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0hUX1RBQkxFX0RBVEFISSk7CisJCXZhbHVlIDw8PSAxNjsKKwkJdmFsdWUgfD0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9IVF9UQUJMRV9EQVRBTE8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCNDNfV0FSTl9PTigxKTsKKwkJdmFsdWUgPSAwOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKwordm9pZCBiNDNfaHR0YWJfcmVhZF9idWxrKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTMyIG9mZnNldCwKKwkJCSB1bnNpZ25lZCBpbnQgbnJfZWxlbWVudHMsIHZvaWQgKl9kYXRhKQoreworCXUzMiB0eXBlOworCXU4ICpkYXRhID0gX2RhdGE7CisJdW5zaWduZWQgaW50IGk7CisKKwl0eXBlID0gb2Zmc2V0ICYgQjQzX0hUVEFCX1RZUEVNQVNLOworCW9mZnNldCAmPSB+QjQzX0hUVEFCX1RZUEVNQVNLOworCUI0M19XQVJOX09OKG9mZnNldCA+IDB4RkZGRik7CisKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9UQUJMRV9BRERSLCBvZmZzZXQpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2VsZW1lbnRzOyBpKyspIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgQjQzX0hUVEFCXzhCSVQ6CisJCQkqZGF0YSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfSFRfVEFCTEVfREFUQUxPKSAmIDB4RkY7CisJCQlkYXRhKys7CisJCQlicmVhazsKKwkJY2FzZSBCNDNfSFRUQUJfMTZCSVQ6CisJCQkqKCh1MTYgKilkYXRhKSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfSFRfVEFCTEVfREFUQUxPKTsKKwkJCWRhdGEgKz0gMjsKKwkJCWJyZWFrOworCQljYXNlIEI0M19IVFRBQl8zMkJJVDoKKwkJCSooKHUzMiAqKWRhdGEpID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9IVF9UQUJMRV9EQVRBSEkpOworCQkJKigodTMyICopZGF0YSkgPDw9IDE2OworCQkJKigodTMyICopZGF0YSkgfD0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9IVF9UQUJMRV9EQVRBTE8pOworCQkJZGF0YSArPSA0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCNDNfV0FSTl9PTigxKTsKKwkJfQorCX0KK30KKwordm9pZCBiNDNfaHR0YWJfd3JpdGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJdTMyIHR5cGU7CisKKwl0eXBlID0gb2Zmc2V0ICYgQjQzX0hUVEFCX1RZUEVNQVNLOworCW9mZnNldCAmPSAweEZGRkY7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEI0M19IVFRBQl84QklUOgorCQlCNDNfV0FSTl9PTih2YWx1ZSAmIH4weEZGKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfSFRfVEFCTEVfQUREUiwgb2Zmc2V0KTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfSFRfVEFCTEVfREFUQUxPLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQjQzX0hUVEFCXzE2QklUOgorCQlCNDNfV0FSTl9PTih2YWx1ZSAmIH4weEZGRkYpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9UQUJMRV9BRERSLCBvZmZzZXQpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9UQUJMRV9EQVRBTE8sIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBCNDNfSFRUQUJfMzJCSVQ6CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX1RBQkxFX0FERFIsIG9mZnNldCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX1RBQkxFX0RBVEFISSwgdmFsdWUgPj4gMTYpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9UQUJMRV9EQVRBTE8sIHZhbHVlICYgMHhGRkZGKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQjQzX1dBUk5fT04oMSk7CisJfQorCisJcmV0dXJuOworfQorCit2b2lkIGI0M19odHRhYl93cml0ZV9idWxrKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTMyIG9mZnNldCwKKwkJCSAgdW5zaWduZWQgaW50IG5yX2VsZW1lbnRzLCBjb25zdCB2b2lkICpfZGF0YSkKK3sKKwl1MzIgdHlwZSwgdmFsdWU7CisJY29uc3QgdTggKmRhdGEgPSBfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXR5cGUgPSBvZmZzZXQgJiBCNDNfSFRUQUJfVFlQRU1BU0s7CisJb2Zmc2V0ICY9IH5CNDNfSFRUQUJfVFlQRU1BU0s7CisJQjQzX1dBUk5fT04ob2Zmc2V0ID4gMHhGRkZGKTsKKworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX1RBQkxFX0FERFIsIG9mZnNldCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZWxlbWVudHM7IGkrKykgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBCNDNfSFRUQUJfOEJJVDoKKwkJCXZhbHVlID0gKmRhdGE7CisJCQlkYXRhKys7CisJCQlCNDNfV0FSTl9PTih2YWx1ZSAmIH4weEZGKTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX1RBQkxFX0RBVEFMTywgdmFsdWUpOworCQkJYnJlYWs7CisJCWNhc2UgQjQzX0hUVEFCXzE2QklUOgorCQkJdmFsdWUgPSAqKCh1MTYgKilkYXRhKTsKKwkJCWRhdGEgKz0gMjsKKwkJCUI0M19XQVJOX09OKHZhbHVlICYgfjB4RkZGRik7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9UQUJMRV9EQVRBTE8sIHZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIEI0M19IVFRBQl8zMkJJVDoKKwkJCXZhbHVlID0gKigodTMyICopZGF0YSk7CisJCQlkYXRhICs9IDQ7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9IVF9UQUJMRV9EQVRBSEksIHZhbHVlID4+IDE2KTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0hUX1RBQkxFX0RBVEFMTywKKwkJCQkJdmFsdWUgJiAweEZGRkYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCNDNfV0FSTl9PTigxKTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUYWJsZXMgb3BzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGh0dGFiX3VwbG9hZChkZXYsIG9mZnNldCwgZGF0YSkgZG8geyBcCisJCWI0M19odHRhYl93cml0ZV9idWxrKGRldiwgb2Zmc2V0LCBBUlJBWV9TSVpFKGRhdGEpLCBkYXRhKTsgXAorCX0gd2hpbGUgKDApCit2b2lkIGI0M19waHlfaHRfdGFibGVzX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjE2KDB4MTIsIDApLCBiNDNfaHR0YWJfMHgxMik7CisJaHR0YWJfdXBsb2FkKGRldiwgQjQzX0hUVEFCMTYoMHgyNywgMCksIGI0M19odHRhYl8weDI3KTsKKwlodHRhYl91cGxvYWQoZGV2LCBCNDNfSFRUQUIxNigweDI2LCAwKSwgYjQzX2h0dGFiXzB4MjYpOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjMyKDB4MjUsIDApLCBiNDNfaHR0YWJfMHgyNSk7CisJaHR0YWJfdXBsb2FkKGRldiwgQjQzX0hUVEFCMzIoMHgyZiwgMCksIGI0M19odHRhYl8weDJmKTsKKwlodHRhYl91cGxvYWQoZGV2LCBCNDNfSFRUQUIxNigweDFhLCAwKSwgYjQzX2h0dGFiXzB4MWEpOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjE2KDB4MWIsIDApLCBiNDNfaHR0YWJfMHgxYik7CisJaHR0YWJfdXBsb2FkKGRldiwgQjQzX0hUVEFCMTYoMHgxYywgMCksIGI0M19odHRhYl8weDFjKTsKKwlodHRhYl91cGxvYWQoZGV2LCBCNDNfSFRUQUIzMigweDFhLCAweDBjMCksIGI0M19odHRhYl8weDFhXzB4YzApOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjMyKDB4MWEsIDB4MTQwKSwgYjQzX2h0dGFiXzB4MWFfMHgxNDApOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjMyKDB4MWIsIDB4MTQwKSwgYjQzX2h0dGFiXzB4MWJfMHgxNDApOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjMyKDB4MWMsIDB4MTQwKSwgYjQzX2h0dGFiXzB4MWNfMHgxNDApOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjE2KDB4MWEsIDB4MWMwKSwgYjQzX2h0dGFiXzB4MWFfMHgxYzApOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjE2KDB4MWIsIDB4MWMwKSwgYjQzX2h0dGFiXzB4MWJfMHgxYzApOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjE2KDB4MWMsIDB4MWMwKSwgYjQzX2h0dGFiXzB4MWNfMHgxYzApOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjE2KDB4MWEsIDB4MjQwKSwgYjQzX2h0dGFiXzB4MWFfMHgyNDApOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjE2KDB4MWIsIDB4MjQwKSwgYjQzX2h0dGFiXzB4MWJfMHgyNDApOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjE2KDB4MWMsIDB4MjQwKSwgYjQzX2h0dGFiXzB4MWNfMHgyNDApOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjMyKDB4MWYsIDApLCBiNDNfaHR0YWJfMHgxZik7CisJaHR0YWJfdXBsb2FkKGRldiwgQjQzX0hUVEFCMzIoMHgyMSwgMCksIGI0M19odHRhYl8weDIxKTsKKwlodHRhYl91cGxvYWQoZGV2LCBCNDNfSFRUQUIzMigweDIzLCAwKSwgYjQzX2h0dGFiXzB4MjMpOworCWh0dGFiX3VwbG9hZChkZXYsIEI0M19IVFRBQjMyKDB4MjAsIDApLCBiNDNfaHR0YWJfMHgyMCk7CisJaHR0YWJfdXBsb2FkKGRldiwgQjQzX0hUVEFCMzIoMHgyMiwgMCksIGI0M19odHRhYl8weDIyKTsKKwlodHRhYl91cGxvYWQoZGV2LCBCNDNfSFRUQUIzMigweDI0LCAwKSwgYjQzX2h0dGFiXzB4MjQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19waHlfaHQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfcGh5X2h0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzYmUzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfcGh5X2h0LmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBCNDNfVEFCTEVTX1BIWV9IVF9IXworI2RlZmluZSBCNDNfVEFCTEVTX1BIWV9IVF9IXworCisvKiBUaGUgSFQtUEhZIHRhYmxlcy4gKi8KKyNkZWZpbmUgQjQzX0hUVEFCX1RZUEVNQVNLCQkweEYwMDAwMDAwCisjZGVmaW5lIEI0M19IVFRBQl84QklUCQkJMHgxMDAwMDAwMAorI2RlZmluZSBCNDNfSFRUQUJfMTZCSVQJCQkweDIwMDAwMDAwCisjZGVmaW5lIEI0M19IVFRBQl8zMkJJVAkJCTB4MzAwMDAwMDAKKyNkZWZpbmUgQjQzX0hUVEFCOCh0YWJsZSwgb2Zmc2V0KQkoKCh0YWJsZSkgPDwgMTApIHwgKG9mZnNldCkgfCBCNDNfSFRUQUJfOEJJVCkKKyNkZWZpbmUgQjQzX0hUVEFCMTYodGFibGUsIG9mZnNldCkJKCgodGFibGUpIDw8IDEwKSB8IChvZmZzZXQpIHwgQjQzX0hUVEFCXzE2QklUKQorI2RlZmluZSBCNDNfSFRUQUIzMih0YWJsZSwgb2Zmc2V0KQkoKCh0YWJsZSkgPDwgMTApIHwgKG9mZnNldCkgfCBCNDNfSFRUQUJfMzJCSVQpCisKK3UzMiBiNDNfaHR0YWJfcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUzMiBvZmZzZXQpOwordm9pZCBiNDNfaHR0YWJfcmVhZF9idWxrKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTMyIG9mZnNldCwKKwkJCSB1bnNpZ25lZCBpbnQgbnJfZWxlbWVudHMsIHZvaWQgKl9kYXRhKTsKK3ZvaWQgYjQzX2h0dGFiX3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKTsKK3ZvaWQgYjQzX2h0dGFiX3dyaXRlX2J1bGsoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MzIgb2Zmc2V0LAorCQkJICB1bnNpZ25lZCBpbnQgbnJfZWxlbWVudHMsIGNvbnN0IHZvaWQgKl9kYXRhKTsKKwordm9pZCBiNDNfcGh5X2h0X3RhYmxlc19pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldik7CisKKyNlbmRpZiAvKiBCNDNfVEFCTEVTX1BIWV9IVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19waHlfbGNuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX3BoeV9sY24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGMxZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19waHlfbGNuLmMKQEAgLTAsMCArMSwzNCBAQAorLyoKKworICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCisgIElFRUUgODAyLjExbiBMQ04tUEhZIGRhdGEgdGFibGVzCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RlZXQsIEZpZnRoIEZsb29yLAorICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworKi8KKworI2luY2x1ZGUgImI0My5oIgorI2luY2x1ZGUgInRhYmxlc19waHlfbGNuLmgiCisjaW5jbHVkZSAicGh5X2NvbW1vbi5oIgorI2luY2x1ZGUgInBoeV9sY24uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUYWJsZXMgb3BzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGI0M19waHlfbGNuX3RhYmxlc19pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfcGh5X2xjbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19waHlfbGNuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzMWIxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfcGh5X2xjbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBCNDNfVEFCTEVTX1BIWV9MQ05fSF8KKyNkZWZpbmUgQjQzX1RBQkxFU19QSFlfTENOX0hfCisKK3ZvaWQgYjQzX3BoeV9sY25fdGFibGVzX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KTsKKworI2VuZGlmIC8qIEI0M19UQUJMRVNfUEhZX0xDTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3dhLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvd2EuYwppbmRleCA4ZjRkYjQ0Li45YjFhMDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvd2EuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvd2EuYwpAQCAtNSw3ICs1LDcgQEAKICAgUEhZIHdvcmthcm91bmRzLgogCiAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+Ci0gIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IE1pY2hhZWwgQnVlc2NoIDxtYnVlc2NoQGZyZWVuZXQuZGU+CisgIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ1OCwxNyArNDU4LDE1IEBACiAKIHN0YXRpYyB2b2lkIGI0M193YV9ib2FyZHNfYShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+c2Rldi0+YnVzOwotCi0JaWYgKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNICYmCi0JICAgIGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JVNDMwNiAmJgotCSAgICBidXMtPmJvYXJkaW5mby5yZXYgPCAweDMwKSB7CisJaWYgKGRldi0+ZGV2LT5ib2FyZF92ZW5kb3IgPT0gU1NCX0JPQVJEVkVORE9SX0JDTSAmJgorCSAgICBkZXYtPmRldi0+Ym9hcmRfdHlwZSA9PSBTU0JfQk9BUkRfQlU0MzA2ICYmCisJICAgIGRldi0+ZGV2LT5ib2FyZF9yZXYgPCAweDMwKSB7CiAJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTAsIDB4RTAwMCk7CiAJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTMsIDB4MDE0MCk7CiAJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTQsIDB4MDI4MCk7CiAJfSBlbHNlIHsKLQkJaWYgKGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX01QNDMxOCAmJgotCQkgICAgYnVzLT5ib2FyZGluZm8ucmV2IDwgMHgyMCkgeworCQlpZiAoZGV2LT5kZXYtPmJvYXJkX3R5cGUgPT0gU1NCX0JPQVJEX01QNDMxOCAmJgorCQkgICAgZGV2LT5kZXYtPmJvYXJkX3JldiA8IDB4MjApIHsKIAkJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTMsIDB4MDIxMCk7CiAJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDE0LCAweDA4NDApOwogCQl9IGVsc2UgewpAQCAtNDg2LDE5ICs0ODQsMTkgQEAKIAogc3RhdGljIHZvaWQgYjQzX3dhX2JvYXJkc19nKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5zZGV2LT5idXM7CisJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSBkZXYtPmRldi0+YnVzX3Nwcm9tOwogCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CiAKLQlpZiAoYnVzLT5ib2FyZGluZm8udmVuZG9yICE9IFNTQl9CT0FSRFZFTkRPUl9CQ00gfHwKLQkgICAgYnVzLT5ib2FyZGluZm8udHlwZSAhPSBTU0JfQk9BUkRfQlU0MzA2IHx8Ci0JICAgIGJ1cy0+Ym9hcmRpbmZvLnJldiAhPSAweDE3KSB7CisJaWYgKGRldi0+ZGV2LT5ib2FyZF92ZW5kb3IgIT0gU1NCX0JPQVJEVkVORE9SX0JDTSB8fAorCSAgICBkZXYtPmRldi0+Ym9hcmRfdHlwZSAhPSBTU0JfQk9BUkRfQlU0MzA2IHx8CisJICAgIGRldi0+ZGV2LT5ib2FyZF9yZXYgIT0gMHgxNykgewogCQlpZiAocGh5LT5yZXYgPCAyKSB7CiAJCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgQjQzX09GRE1UQUJfR0FJTlhfUjEsIDEsIDB4MDAwMik7CiAJCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgQjQzX09GRE1UQUJfR0FJTlhfUjEsIDIsIDB4MDAwMSk7CiAJCX0gZWxzZSB7CiAJCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgQjQzX09GRE1UQUJfR0FJTlgsIDEsIDB4MDAwMik7CiAJCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgQjQzX09GRE1UQUJfR0FJTlgsIDIsIDB4MDAwMSk7Ci0JCQlpZiAoKGJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfRVhUTE5BKSAmJgorCQkJaWYgKChzcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfRVhUTE5BKSAmJgogCQkJICAgIChwaHktPnJldiA+PSA3KSkgewogCQkJCWI0M19waHlfbWFzayhkZXYsIEI0M19QSFlfRVhURygweDExKSwgMHhGN0ZGKTsKIAkJCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgQjQzX09GRE1UQUJfR0FJTlgsIDB4MDAyMCwgMHgwMDAxKTsKQEAgLTUxMCw3ICs1MDgsNyBAQAogCQkJfQogCQl9CiAJfQotCWlmIChidXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX0ZFTSkgeworCWlmIChzcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfRkVNKSB7CiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0dUQUJDVEwsIDB4MzEyMCk7CiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0dUQUJEQVRBLCAweEM0ODApOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My94bWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMveG1pdC5jCmluZGV4IGM4Zjk5YWUuLmI3NGYyNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3htaXQuYwpAQCAtNiw3ICs2LDcgQEAKIAogICBDb3B5cmlnaHQgKEMpIDIwMDUgTWFydGluIExhbmdlciA8bWFydGluLWxhbmdlckBnbXguZGU+CiAgIENvcHlyaWdodCAoQykgMjAwNSBTdGVmYW5vIEJyaXZpbyA8c3RlZmFuby5icml2aW9AcG9saW1pLml0PgotICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgIENvcHlyaWdodCAoQykgMjAwNSBEYW5ueSB2YW4gRHlrIDxrdWdlbGZhbmdAZ2VudG9vLm9yZz4KICAgQ29weXJpZ2h0IChDKSAyMDA1IEFuZHJlYXMgSmFnZ2kgPGFuZHJlYXMuamFnZ2lAd2F0ZXJ3YXZlLmNoPgogCkBAIC0zMjMsOCArMzIzLDcgQEAKIAkJCS8qIHdlIGdpdmUgdGhlIHBoYXNlMWtleSBhbmQgaXYxNiBoZXJlLCB0aGUga2V5IGlzIHN0b3JlZCBpbgogCQkJICogc2htLiBXaXRoIHRoYXQgdGhlIGhhcmR3YXJlIGNhbiBkbyBwaGFzZSAyIGFuZCBlbmNyeXB0aW9uLgogCQkJICovCi0JCQlpZWVlODAyMTFfZ2V0X3RraXBfa2V5KGluZm8tPmNvbnRyb2wuaHdfa2V5LCBza2JfZnJhZywKLQkJCQkJSUVFRTgwMjExX1RLSVBfUDFfS0VZLCAodTgqKXBoYXNlMWtleSk7CisJCQlpZWVlODAyMTFfZ2V0X3RraXBfcDFrKGluZm8tPmNvbnRyb2wuaHdfa2V5LCBza2JfZnJhZywgcGhhc2Uxa2V5KTsKIAkJCS8qIHBoYXNlMWtleSBpcyBpbiBob3N0IGVuZGlhbi4gQ29weSB0byBsaXR0bGUtZW5kaWFuIHR4aGRyLT5pdi4gKi8KIAkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKIAkJCQl0eGhkci0+aXZbaSAqIDIgKyAwXSA9IHBoYXNlMWtleVtpXTsKQEAgLTU0Nyw3ICs1NDYsNyBAQAogCQkJZWxzZQogCQkJCXRtcCAtPSAzOwogCQl9IGVsc2UgewotCQkJaWYgKGRldi0+c2Rldi0+YnVzLT5zcHJvbS4KKwkJCWlmIChkZXYtPmRldi0+YnVzX3Nwcm9tLT4KIAkJCSAgICBib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9SU1NJKSB7CiAJCQkJaWYgKGluX3Jzc2kgPiA2MykKIAkJCQkJaW5fcnNzaSA9IDYzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2I0M2xlZ2FjeS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2I0M2xlZ2FjeS5oCmluZGV4IDIzNTgzYmUuLjE3YTEzMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9iNDNsZWdhY3kuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvYjQzbGVnYWN5LmgKQEAgLTUzMiw2ICs1MzIsOCBAQAogCiAJc3RydWN0IGI0M2xlZ2FjeV9kbWFyaW5nICpyeF9yaW5nMDsKIAlzdHJ1Y3QgYjQzbGVnYWN5X2RtYXJpbmcgKnJ4X3JpbmczOyAvKiBvbmx5IG9uIGNvcmUucmV2IDwgNSAqLworCisJdTMyIHRyYW5zbGF0aW9uOyAvKiBSb3V0aW5nIGJpdHMgKi8KIH07CiAKIC8qIERhdGEgc3RydWN0dXJlcyBmb3IgUElPIHRyYW5zbWlzc2lvbiwgcGVyIDgwMjExIGNvcmUuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2RlYnVnZnMuYwppbmRleCBmMjMyNjE4Li41ZTI4YWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9kZWJ1Z2ZzLmMKQEAgLTQsNyArNCw3IEBACiAKICAgZGVidWdmcyBkcml2ZXIgZGVidWdnaW5nIGNvZGUKIAotICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvZG1hLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvZG1hLmMKaW5kZXggZTAzZTAxZC4uNTAxMGM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2RtYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9kbWEuYwpAQCAtNCw3ICs0LDcgQEAKIAogICBETUEgcmluZ2J1ZmZlciBhbmQgZGVzY3JpcHRvciBhbGxvY2F0aW9uL21hbmFnZW1lbnQKIAotICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAKICAgU29tZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gdGhlIGI0NC5jIGRyaXZlcgogICBDb3B5cmlnaHQgKEMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyCkBAIC03Myw3ICs3Myw3IEBACiAJYWRkciA9ICh1MzIpKGRtYWFkZHIgJiB+U1NCX0RNQV9UUkFOU0xBVElPTl9NQVNLKTsKIAlhZGRyZXh0ID0gKHUzMikoZG1hYWRkciAmIFNTQl9ETUFfVFJBTlNMQVRJT05fTUFTSykKIAkJICAgPj4gU1NCX0RNQV9UUkFOU0xBVElPTl9TSElGVDsKLQlhZGRyIHw9IHNzYl9kbWFfdHJhbnNsYXRpb24ocmluZy0+ZGV2LT5kZXYpOworCWFkZHIgfD0gcmluZy0+ZGV2LT5kbWEudHJhbnNsYXRpb247CiAJY3RsID0gKGJ1ZnNpemUgLSByaW5nLT5mcmFtZW9mZnNldCkKIAkgICAgICAmIEI0M2xlZ2FjeV9ETUEzMl9EQ1RMX0JZVEVDTlQ7CiAJaWYgKHNsb3QgPT0gcmluZy0+bnJfc2xvdHMgLSAxKQpAQCAtMTc1LDcgKzE3NSw3IEBACiAJYWRkcmhpID0gKCgodTY0KWRtYWFkZHIgPj4gMzIpICYgflNTQl9ETUFfVFJBTlNMQVRJT05fTUFTSyk7CiAJYWRkcmV4dCA9ICgoKHU2NClkbWFhZGRyID4+IDMyKSAmIFNTQl9ETUFfVFJBTlNMQVRJT05fTUFTSykKIAkJICA+PiBTU0JfRE1BX1RSQU5TTEFUSU9OX1NISUZUOwotCWFkZHJoaSB8PSBzc2JfZG1hX3RyYW5zbGF0aW9uKHJpbmctPmRldi0+ZGV2KTsKKwlhZGRyaGkgfD0gcmluZy0+ZGV2LT5kbWEudHJhbnNsYXRpb247CiAJaWYgKHNsb3QgPT0gcmluZy0+bnJfc2xvdHMgLSAxKQogCQljdGwwIHw9IEI0M2xlZ2FjeV9ETUE2NF9EQ1RMMF9EVEFCTEVFTkQ7CiAJaWYgKHN0YXJ0KQpAQCAtNzA5LDcgKzcwOSw3IEBACiAJaW50IGVyciA9IDA7CiAJdTMyIHZhbHVlOwogCXUzMiBhZGRyZXh0OwotCXUzMiB0cmFucyA9IHNzYl9kbWFfdHJhbnNsYXRpb24ocmluZy0+ZGV2LT5kZXYpOworCXUzMiB0cmFucyA9IHJpbmctPmRldi0+ZG1hLnRyYW5zbGF0aW9uOwogCiAJaWYgKHJpbmctPnR4KSB7CiAJCWlmIChyaW5nLT50eXBlID09IEI0M2xlZ2FjeV9ETUFfNjRCSVQpIHsKQEAgLTgxNywxNCArODE3LDEzIEBACiAKIHN0YXRpYyB2b2lkIGZyZWVfYWxsX2Rlc2NidWZmZXJzKHN0cnVjdCBiNDNsZWdhY3lfZG1hcmluZyAqcmluZykKIHsKLQlzdHJ1Y3QgYjQzbGVnYWN5X2RtYWRlc2NfZ2VuZXJpYyAqZGVzYzsKIAlzdHJ1Y3QgYjQzbGVnYWN5X2RtYWRlc2NfbWV0YSAqbWV0YTsKIAlpbnQgaTsKIAogCWlmICghcmluZy0+dXNlZF9zbG90cykKIAkJcmV0dXJuOwogCWZvciAoaSA9IDA7IGkgPCByaW5nLT5ucl9zbG90czsgaSsrKSB7Ci0JCWRlc2MgPSByaW5nLT5vcHMtPmlkeDJkZXNjKHJpbmcsIGksICZtZXRhKTsKKwkJcmluZy0+b3BzLT5pZHgyZGVzYyhyaW5nLCBpLCAmbWV0YSk7CiAKIAkJaWYgKCFtZXRhLT5za2IpIHsKIAkJCUI0M2xlZ2FjeV9XQVJOX09OKCFyaW5nLT50eCk7CkBAIC0xMDk0LDYgKzEwOTMsNyBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAjZW5kaWYKIAl9CisJZG1hLT50cmFuc2xhdGlvbiA9IHNzYl9kbWFfdHJhbnNsYXRpb24oZGV2LT5kZXYpOwogCiAJZXJyID0gLUVOT01FTTsKIAkvKiBzZXR1cCBUWCBETUEgY2hhbm5lbHMuICovCkBAIC0xMzcxLDEwICsxMzcxLDggQEAKIAkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBiNDNsZWdhY3lfZG1hcmluZyAqcmluZzsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCiAJcmluZyA9IHByaW9yaXR5X3RvX3R4cmluZyhkZXYsIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcmluZy0+bG9jaywgZmxhZ3MpOwpAQCAtMTQwMSw4ICsxMzk5LDYgQEAKIAogCS8qIGRtYV90eF9mcmFnbWVudCBtaWdodCByZWFsbG9jYXRlIHRoZSBza2IsIHNvIGludmFsaWRhdGUgcG9pbnRlcnMgcG9pbnRpbmcKIAkgKiBpbnRvIHRoZSBza2IgZGF0YSBvciBjYiBub3cuICovCi0JaGRyID0gTlVMTDsKLQlpbmZvID0gTlVMTDsKIAllcnIgPSBkbWFfdHhfZnJhZ21lbnQocmluZywgJnNrYik7CiAJaWYgKHVubGlrZWx5KGVyciA9PSAtRU5PS0VZKSkgewogCQkvKiBEcm9wIHRoaXMgcGFja2V0LCBhcyB3ZSBkb24ndCBoYXZlIHRoZSBlbmNyeXB0aW9uIGtleQpAQCAtMTQzNSw3ICsxNDMxLDYgQEAKIHsKIAljb25zdCBzdHJ1Y3QgYjQzbGVnYWN5X2RtYV9vcHMgKm9wczsKIAlzdHJ1Y3QgYjQzbGVnYWN5X2RtYXJpbmcgKnJpbmc7Ci0Jc3RydWN0IGI0M2xlZ2FjeV9kbWFkZXNjX2dlbmVyaWMgKmRlc2M7CiAJc3RydWN0IGI0M2xlZ2FjeV9kbWFkZXNjX21ldGEgKm1ldGE7CiAJaW50IHJldHJ5X2xpbWl0OwogCWludCBzbG90OwpAQCAtMTQ1MCw3ICsxNDQ1LDcgQEAKIAlvcHMgPSByaW5nLT5vcHM7CiAJd2hpbGUgKDEpIHsKIAkJQjQzbGVnYWN5X1dBUk5fT04oIShzbG90ID49IDAgJiYgc2xvdCA8IHJpbmctPm5yX3Nsb3RzKSk7Ci0JCWRlc2MgPSBvcHMtPmlkeDJkZXNjKHJpbmcsIHNsb3QsICZtZXRhKTsKKwkJb3BzLT5pZHgyZGVzYyhyaW5nLCBzbG90LCAmbWV0YSk7CiAKIAkJaWYgKG1ldGEtPnNrYikKIAkJCXVubWFwX2Rlc2NidWZmZXIocmluZywgbWV0YS0+ZG1hYWRkciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9pbHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9pbHQuYwppbmRleCBhODQ5MDc4Li5lZTU2ODJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvaWx0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2lsdC5jCkBAIC00LDcgKzQsNyBAQAogCiAgIENvcHlyaWdodCAoYykgMjAwNSBNYXJ0aW4gTGFuZ2VyIDxtYXJ0aW4tbGFuZ2VyQGdteC5kZT4sCiAJCSAgICAgU3RlZmFubyBCcml2aW8gPHN0ZWZhbm8uYnJpdmlvQHBvbGltaS5pdD4KLQkJICAgICBNaWNoYWVsIEJ1ZXNjaCA8bWJ1ZXNjaEBmcmVlbmV0LmRlPgorCQkgICAgIE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAJCSAgICAgRGFubnkgdmFuIER5ayA8a3VnZWxmYW5nQGdlbnRvby5vcmc+CiAJCSAgICAgQW5kcmVhcyBKYWdnaSA8YW5kcmVhcy5qYWdnaUB3YXRlcndhdmUuY2g+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9sZWRzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbGVkcy5jCmluZGV4IDM3ZTliZTguLjJmMWJmZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9sZWRzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2xlZHMuYwpAQCAtNSw3ICs1LDcgQEAKIAogICBDb3B5cmlnaHQgKGMpIDIwMDUgTWFydGluIExhbmdlciA8bWFydGluLWxhbmdlckBnbXguZGU+LAogICBDb3B5cmlnaHQgKGMpIDIwMDUgU3RlZmFubyBCcml2aW8gPHN0ZWZhbm8uYnJpdmlvQHBvbGltaS5pdD4KLSAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAgQ29weXJpZ2h0IChjKSAyMDA1IERhbm55IHZhbiBEeWsgPGt1Z2VsZmFuZ0BnZW50b28ub3JnPgogICBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhcyBKYWdnaSA8YW5kcmVhcy5qYWdnaUB3YXRlcndhdmUuY2g+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5jCmluZGV4IDFhYjg4NjEuLjA0YzAzYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uYwpAQCAtNCw3ICs0LDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPgogICogIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+Ci0gKiAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgKiAgQ29weXJpZ2h0IChjKSAyMDA1IERhbm55IHZhbiBEeWsgPGt1Z2VsZmFuZ0BnZW50b28ub3JnPgogICogIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWFzIEphZ2dpIDxhbmRyZWFzLmphZ2dpQHdhdGVyd2F2ZS5jaD4KICAqICBDb3B5cmlnaHQgKGMpIDIwMDcgTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgpAQCAtMTU2NCwxMCArMTU2NCwxMCBAQAogCXN0cnVjdCBiNDNsZWdhY3lfZmlybXdhcmUgKmZ3ID0gJmRldi0+Znc7CiAJY29uc3QgdTggcmV2ID0gZGV2LT5kZXYtPmlkLnJldmlzaW9uOwogCWNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCXUzMiB0bXNoaWdoOwogCWludCBlcnI7CiAKLQl0bXNoaWdoID0gc3NiX3JlYWQzMihkZXYtPmRldiwgU1NCX1RNU0hJR0gpOworCS8qIGRvIGR1bW15IHJlYWQgKi8KKwlzc2JfcmVhZDMyKGRldi0+ZGV2LCBTU0JfVE1TSElHSCk7CiAJaWYgKCFmdy0+dWNvZGUpIHsKIAkJaWYgKHJldiA9PSAyKQogCQkJZmlsZW5hbWUgPSAidWNvZGUyIjsKQEAgLTI2MzQsMTEgKzI2MzQsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IG5ld19waHltb2RlID0gMHhGRkZGOwogCWludCBhbnRlbm5hX3R4OwotCWludCBhbnRlbm5hX3J4OwogCWludCBlcnIgPSAwOwogCiAJYW50ZW5uYV90eCA9IEI0M2xlZ2FjeV9BTlRFTk5BX0RFRkFVTFQ7Ci0JYW50ZW5uYV9yeCA9IEI0M2xlZ2FjeV9BTlRFTk5BX0RFRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwogCWRldiA9IHdsLT5jdXJyZW50X2RldjsKQEAgLTI3NzUsMTQgKzI3NzMsMTIgQEAKIHsKIAlzdHJ1Y3QgYjQzbGVnYWN5X3dsICp3bCA9IGh3X3RvX2I0M2xlZ2FjeV93bChodyk7CiAJc3RydWN0IGI0M2xlZ2FjeV93bGRldiAqZGV2OwotCXN0cnVjdCBiNDNsZWdhY3lfcGh5ICpwaHk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAJQjQzbGVnYWN5X1dBUk5fT04od2wtPnZpZiAhPSB2aWYpOwogCiAJZGV2ID0gd2wtPmN1cnJlbnRfZGV2OwotCXBoeSA9ICZkZXYtPnBoeTsKIAogCS8qIERpc2FibGUgSVJRcyB3aGlsZSByZWNvbmZpZ3VyaW5nIHRoZSBkZXZpY2UuCiAJICogVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBkcm9wIHRoZSBzcGlubG9jayB0aHJvdWdob3V0CkBAIC0yOTc0LDcgKzI5NzAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQl1bnN1cHBvcnRlZCA9IDE7Ci0JfTsKKwl9CiAJaWYgKHVuc3VwcG9ydGVkKSB7CiAJCWI0M2xlZ2FjeWVycihkZXYtPndsLCAiRk9VTkQgVU5TVVBQT1JURUQgUEhZICIKIAkJICAgICAgICIoQW5hbG9nICV1LCBUeXBlICV1LCBSZXZpc2lvbiAldSlcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uaAppbmRleCAxZjBlMmUzNy4uYjc0YTA1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5oCkBAIC00LDcgKzQsNyBAQAogCiAgIENvcHlyaWdodCAoYykgMjAwNSBNYXJ0aW4gTGFuZ2VyIDxtYXJ0aW4tbGFuZ2VyQGdteC5kZT4sCiAgIENvcHlyaWdodCAoYykgMjAwNSBTdGVmYW5vIEJyaXZpbyA8c3RlZmFuby5icml2aW9AcG9saW1pLml0PgotICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgIENvcHlyaWdodCAoYykgMjAwNSAgRGFubnkgdmFuIER5ayA8a3VnZWxmYW5nQGdlbnRvby5vcmc+CiAgIENvcHlyaWdodCAoYykgMjAwNSAgQW5kcmVhcyBKYWdnaSA8YW5kcmVhcy5qYWdnaUB3YXRlcndhdmUuY2g+CiAgIENvcHlyaWdodCAoYykgMjAwNyAgTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3BoeS5jCmluZGV4IDI4ZTQ3N2QuLjk2ZmFhZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcGh5LmMKQEAgLTQsNyArNCw3IEBACiAKICAgQ29weXJpZ2h0IChjKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPiwKIAkJICAgICBTdGVmYW5vIEJyaXZpbyA8c3RlZmFuby5icml2aW9AcG9saW1pLml0PgotCQkgICAgIE1pY2hhZWwgQnVlc2NoIDxtYnVlc2NoQGZyZWVuZXQuZGU+CisJCSAgICAgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KIAkJICAgICBEYW5ueSB2YW4gRHlrIDxrdWdlbGZhbmdAZ2VudG9vLm9yZz4KICAgICAgQW5kcmVhcyBKYWdnaSA8YW5kcmVhcy5qYWdnaUB3YXRlcndhdmUuY2g+CiAgIENvcHlyaWdodCAoYykgMjAwNyBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcGh5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcGh5LmgKaW5kZXggZWNiZTQwOS4uODMxYTdhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9waHkuaApAQCAtNCw3ICs0LDcgQEAKIAogICBDb3B5cmlnaHQgKGMpIDIwMDUgTWFydGluIExhbmdlciA8bWFydGluLWxhbmdlckBnbXguZGU+LAogCQkgICAgIFN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+Ci0JCSAgICAgTWljaGFlbCBCdWVzY2ggPG1idWVzY2hAZnJlZW5ldC5kZT4KKwkJICAgICBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogCQkgICAgIERhbm55IHZhbiBEeWsgPGt1Z2VsZmFuZ0BnZW50b28ub3JnPgogCQkgICAgIEFuZHJlYXMgSmFnZ2kgPGFuZHJlYXMuamFnZ2lAd2F0ZXJ3YXZlLmNoPgogICBDb3B5cmlnaHQgKGMpIDIwMDcgTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3Bpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3Bpby5jCmluZGV4IGIwMzNiMGUuLjE5MjI1MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9waW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcGlvLmMKQEAgLTQsNyArNCw3IEBACiAKICAgUElPIFRyYW5zbWlzc2lvbgogCi0gIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3JhZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmFkaW8uYwppbmRleCAyZGY1NDVjLi40NzVlYjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmFkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmFkaW8uYwpAQCAtNCw3ICs0LDcgQEAKIAogICBDb3B5cmlnaHQgKGMpIDIwMDUgTWFydGluIExhbmdlciA8bWFydGluLWxhbmdlckBnbXguZGU+LAogCQkgICAgIFN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+Ci0JCSAgICAgTWljaGFlbCBCdWVzY2ggPG1idWVzY2hAZnJlZW5ldC5kZT4KKwkJICAgICBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogCQkgICAgIERhbm55IHZhbiBEeWsgPGt1Z2VsZmFuZ0BnZW50b28ub3JnPgogCQkgICAgIEFuZHJlYXMgSmFnZ2kgPGFuZHJlYXMuamFnZ2lAd2F0ZXJ3YXZlLmNoPgogICBDb3B5cmlnaHQgKGMpIDIwMDcgTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3JhZGlvLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmFkaW8uaAppbmRleCBlYzRkZTI4Li5iY2NiM2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmFkaW8uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmFkaW8uaApAQCAtNCw3ICs0LDcgQEAKIAogICBDb3B5cmlnaHQgKGMpIDIwMDUgTWFydGluIExhbmdlciA8bWFydGluLWxhbmdlckBnbXguZGU+LAogCQkgICAgIFN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+Ci0JCSAgICAgTWljaGFlbCBCdWVzY2ggPG1idWVzY2hAZnJlZW5ldC5kZT4KKwkJICAgICBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogCQkgICAgIERhbm55IHZhbiBEeWsgPGt1Z2VsZmFuZ0BnZW50b28ub3JnPgogCQkgICAgIEFuZHJlYXMgSmFnZ2kgPGFuZHJlYXMuamFnZ2lAd2F0ZXJ3YXZlLmNoPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmZraWxsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmZraWxsLmMKaW5kZXggYjkwZjIyMy4uYzQ1NTliYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3Jma2lsbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9yZmtpbGwuYwpAQCAtMyw3ICszLDcgQEAKICAgQnJvYWRjb20gQjQzIHdpcmVsZXNzIGRyaXZlcgogICBSRktJTEwgc3VwcG9ydAogCi0gIENvcHlyaWdodCAoYykgMjAwNyBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICBDb3B5cmlnaHQgKGMpIDIwMDcgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3N5c2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvc3lzZnMuYwppbmRleCA1NmMzODRmLi41N2Y4YjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvc3lzZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvc3lzZnMuYwpAQCAtNCw3ICs0LDcgQEAKIAogICBTWVNGUyBzdXBwb3J0IHJvdXRpbmVzCiAKLSAgQ29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kveG1pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3htaXQuYwppbmRleCAzYTk1NTQxLi41MTg4ZmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kveG1pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS94bWl0LmMKQEAgLTYsNyArNiw3IEBACiAKICAgQ29weXJpZ2h0IChDKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPgogICBDb3B5cmlnaHQgKEMpIDIwMDUgU3RlZmFubyBCcml2aW8gPHN0ZWZhbm8uYnJpdmlvQHBvbGltaS5pdD4KLSAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICBDb3B5cmlnaHQgKEMpIDIwMDUgRGFubnkgdmFuIER5ayA8a3VnZWxmYW5nQGdlbnRvby5vcmc+CiAgIENvcHlyaWdodCAoQykgMjAwNSBBbmRyZWFzIEphZ2dpIDxhbmRyZWFzLmphZ2dpQHdhdGVyd2F2ZS5jaD4KICAgQ29weXJpZ2h0IChDKSAyMDA3IExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KQEAgLTMyMSwxMSArMzIxLDkgQEAKIAkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKIAkJaW50IHJ0c19yYXRlOwogCQlpbnQgcnRzX3JhdGVfZmI7Ci0JCWludCBydHNfcmF0ZV9vZmRtOwogCQlpbnQgcnRzX3JhdGVfZmJfb2ZkbTsKIAogCQlydHNfcmF0ZSA9IGllZWU4MDIxMV9nZXRfcnRzX2N0c19yYXRlKGRldi0+d2wtPmh3LCBpbmZvKS0+aHdfdmFsdWU7Ci0JCXJ0c19yYXRlX29mZG0gPSBiNDNsZWdhY3lfaXNfb2ZkbV9yYXRlKHJ0c19yYXRlKTsKIAkJcnRzX3JhdGVfZmIgPSBiNDNsZWdhY3lfY2FsY19mYWxsYmFja19yYXRlKHJ0c19yYXRlKTsKIAkJcnRzX3JhdGVfZmJfb2ZkbSA9IGI0M2xlZ2FjeV9pc19vZmRtX3JhdGUocnRzX3JhdGVfZmIpOwogCQlpZiAocnRzX3JhdGVfZmJfb2ZkbSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfd2xhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF93bGFuLmgKaW5kZXggODhkYzZhNS4uN2JiMGI0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF93bGFuLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF93bGFuLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIEhPU1RBUF9XTEFOX0gKICNkZWZpbmUgSE9TVEFQX1dMQU5fSAogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwppbmRleCA0NDMwNzc1Li4zNzc0ZGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJInVudXNlZCIsCQkvKiBIT1NUX0lOVEVSUlVQVF9DT0FMRVNDSU5HICovCiAJInVuZGVmaW5lZCIsCiAJIkNBUkRfRElTQUJMRV9QSFlfT0ZGIiwKLQkiTVNEVV9UWF9SQVRFUyIgInVuZGVmaW5lZCIsCisJIk1TRFVfVFhfUkFURVMiLAogCSJ1bmRlZmluZWQiLAogCSJTRVRfU1RBVElPTl9TVEFUX0JJVFMiLAogCSJDTEVBUl9TVEFUSU9OU19TVEFUX0JJVFMiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuaAppbmRleCA5MTc5NWI1Li5lY2I1NjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuaApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3X3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd19yeC5jCmluZGV4IGU1YWQ3NmMuLjMyYTk5NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3X3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHdfcnguYwpAQCAtNDQyLDcgKzQ0Miw3IEBACiAJCSAqIDgwMi4xMSwgYnV0IG1ha2VzIGl0IGVhc2llciB0byB1c2UgZGlmZmVyZW50IGtleXMgd2l0aAogCQkgKiBzdGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFdFUCBrZXkgbWFwcGluZykuICovCiAKLQkJaWYgKCEoaGRyLT5hZGRyMVswXSAmIDB4MDEpIHx8IGxvY2FsLT5iY3J4X3N0YV9rZXkpCisJCWlmIChpc191bmljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgfHwgbG9jYWwtPmJjcnhfc3RhX2tleSkKIAkJCSh2b2lkKWhvc3RhcF9oYW5kbGVfc3RhX2NyeXB0byhsb2NhbCwgaGRyLCAmY3J5cHQsCiAJCQkJCQkgICAgICAgJnN0YSk7CiAjZW5kaWYKQEAgLTc3Miw3ICs3NzIsNyBAQAogCiAjaWZkZWYgTk9UX1lFVAogCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF3ZHMgJiYgaWVlZS0+YXAtPmJyaWRnZV9wYWNrZXRzKSB7Ci0JCWlmIChkc3RbMF0gJiAweDAxKSB7CisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkc3QpKSB7CiAJCQkvKiBjb3B5IG11bHRpY2FzdCBmcmFtZSBib3RoIHRvIHRoZSBoaWdoZXIgbGF5ZXJzIGFuZAogCQkJICogdG8gdGhlIHdpcmVsZXNzIG1lZGlhICovCiAJCQlpZWVlLT5hcC0+YnJpZGdlZF9tdWx0aWNhc3QrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3X3d4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd193eC5jCmluZGV4IGQ3YmQ2Y2YwLi42NjIzZTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd193eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3X3d4LmMKQEAgLTMwLDYgKzMwLDcgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUuYwppbmRleCBkMDk2ZGMyLi5kYWI2N2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LmMKQEAgLTQwOCw3ICs0MDgsNiBAQAogI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCiAJaXdsMzk0NV9hY2N1bXVsYXRpdmVfc3RhdGlzdGljcyhwcml2LCAoX19sZTMyICopJnBrdC0+dS5yYXcpOwogI2VuZGlmCi0JaXdsX2xlZ2FjeV9yZWNvdmVyX2Zyb21fc3RhdGlzdGljcyhwcml2LCBwa3QpOwogCiAJbWVtY3B5KCZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLCBwa3QtPnUucmF3LCBzaXplb2YocHJpdi0+XzM5NDUuc3RhdGlzdGljcykpOwogfQpAQCAtMjY0MCw3ICsyNjM5LDYgQEAKIAkudHhxX2ZyZWVfdGZkID0gaXdsMzk0NV9od190eHFfZnJlZV90ZmQsCiAJLnR4cV9pbml0ID0gaXdsMzk0NV9od190eF9xdWV1ZV9pbml0LAogCS5sb2FkX3Vjb2RlID0gaXdsMzk0NV9sb2FkX2JzbSwKLQkuZHVtcF9uaWNfZXZlbnRfbG9nID0gaXdsMzk0NV9kdW1wX25pY19ldmVudF9sb2csCiAJLmR1bXBfbmljX2Vycm9yX2xvZyA9IGl3bDM5NDVfZHVtcF9uaWNfZXJyb3JfbG9nLAogCS5hcG1fb3BzID0gewogCQkuaW5pdCA9IGl3bDM5NDVfYXBtX2luaXQsCkBAIC0yNjk4LDkgKzI2OTYsNyBAQAogCS5zZXRfbDBzID0gZmFsc2UsCiAJLnVzZV9ic20gPSB0cnVlLAogCS5sZWRfY29tcGVuc2F0aW9uID0gNjQsCi0JLnBsY3BfZGVsdGFfdGhyZXNob2xkID0gSVdMX01BWF9QTENQX0VSUl9MT05HX1RIUkVTSE9MRF9ERUYsCiAJLndkX3RpbWVvdXQgPSBJV0xfREVGX1dEX1RJTUVPVVQsCi0JLm1heF9ldmVudF9sb2dfc2l6ZSA9IDUxMiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXdsX2NmZyBpd2wzOTQ1X2JnX2NmZyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGliLmMKaW5kZXggYTdhNDczOS4uMmJlNmQ5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGliLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGliLmMKQEAgLTY5NCw0NyArNjk0LDYgQEAKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfcnhfcGh5X3JlcykpOwogfQogCi1zdGF0aWMgaW50IGl3bDQ5NjVfZ2V0X3NpbmdsZV9jaGFubmVsX2Zvcl9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkJICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAotCQkJCQkgICBzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbCAqc2Nhbl9jaCkKLXsKLQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKLQl1MTYgcGFzc2l2ZV9kd2VsbCA9IDA7Ci0JdTE2IGFjdGl2ZV9kd2VsbCA9IDA7Ci0JaW50IGFkZGVkID0gMDsKLQl1MTYgY2hhbm5lbCA9IDA7Ci0KLQlzYmFuZCA9IGl3bF9nZXRfaHdfbW9kZShwcml2LCBiYW5kKTsKLQlpZiAoIXNiYW5kKSB7Ci0JCUlXTF9FUlIocHJpdiwgImludmFsaWQgYmFuZFxuIik7Ci0JCXJldHVybiBhZGRlZDsKLQl9Ci0KLQlhY3RpdmVfZHdlbGwgPSBpd2xfbGVnYWN5X2dldF9hY3RpdmVfZHdlbGxfdGltZShwcml2LCBiYW5kLCAwKTsKLQlwYXNzaXZlX2R3ZWxsID0gaXdsX2xlZ2FjeV9nZXRfcGFzc2l2ZV9kd2VsbF90aW1lKHByaXYsIGJhbmQsIHZpZik7Ci0KLQlpZiAocGFzc2l2ZV9kd2VsbCA8PSBhY3RpdmVfZHdlbGwpCi0JCXBhc3NpdmVfZHdlbGwgPSBhY3RpdmVfZHdlbGwgKyAxOwotCi0JY2hhbm5lbCA9IGl3bF9sZWdhY3lfZ2V0X3NpbmdsZV9jaGFubmVsX251bWJlcihwcml2LCBiYW5kKTsKLQlpZiAoY2hhbm5lbCkgewotCQlzY2FuX2NoLT5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7Ci0JCXNjYW5fY2gtPnR5cGUgPSBTQ0FOX0NIQU5ORUxfVFlQRV9QQVNTSVZFOwotCQlzY2FuX2NoLT5hY3RpdmVfZHdlbGwgPSBjcHVfdG9fbGUxNihhY3RpdmVfZHdlbGwpOwotCQlzY2FuX2NoLT5wYXNzaXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYocGFzc2l2ZV9kd2VsbCk7Ci0JCS8qIFNldCB0eHBvd2VyIGxldmVscyB0byBkZWZhdWx0cyAqLwotCQlzY2FuX2NoLT5kc3BfYXR0ZW4gPSAxMTA7Ci0JCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCQlzY2FuX2NoLT50eF9nYWluID0gKCgxIDw8IDUpIHwgKDMgPDwgMykpIHwgMzsKLQkJZWxzZQotCQkJc2Nhbl9jaC0+dHhfZ2FpbiA9ICgoMSA8PCA1KSB8ICg1IDw8IDMpKTsKLQkJYWRkZWQrKzsKLQl9IGVsc2UKLQkJSVdMX0VSUihwcml2LCAibm8gdmFsaWQgY2hhbm5lbCBmb3VuZFxuIik7Ci0JcmV0dXJuIGFkZGVkOwotfQotCiBzdGF0aWMgaW50IGl3bDQ5NjVfZ2V0X2NoYW5uZWxzX2Zvcl9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJICAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCkBAIC04NTgsMTYgKzgxNywxMyBAQAogCXNjYW4tPnF1aWV0X3RpbWUgPSBJV0xfQUNUSVZFX1FVSUVUX1RJTUU7CiAKIAlpZiAoaXdsX2xlZ2FjeV9pc19hbnlfYXNzb2NpYXRlZChwcml2KSkgewotCQl1MTYgaW50ZXJ2YWwgPSAwOworCQl1MTYgaW50ZXJ2YWw7CiAJCXUzMiBleHRyYTsKIAkJdTMyIHN1c3BlbmRfdGltZSA9IDEwMDsKIAkJdTMyIHNjYW5fc3VzcGVuZF90aW1lID0gMTAwOwogCiAJCUlXTF9ERUJVR19JTkZPKHByaXYsICJTY2FubmluZyB3aGlsZSBhc3NvY2lhdGVkLi4uXG4iKTsKLQkJaWYgKHByaXYtPmlzX2ludGVybmFsX3Nob3J0X3NjYW4pCi0JCQlpbnRlcnZhbCA9IDA7Ci0JCWVsc2UKLQkJCWludGVydmFsID0gdmlmLT5ic3NfY29uZi5iZWFjb25faW50OworCQlpbnRlcnZhbCA9IHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludDsKIAogCQlzY2FuLT5zdXNwZW5kX3RpbWUgPSAwOwogCQlzY2FuLT5tYXhfb3V0X3RpbWUgPSBjcHVfdG9fbGUzMigyMDAgKiAxMDI0KTsKQEAgLTg4Miw5ICs4MzgsNyBAQAogCQkJICAgICAgIHNjYW5fc3VzcGVuZF90aW1lLCBpbnRlcnZhbCk7CiAJfQogCi0JaWYgKHByaXYtPmlzX2ludGVybmFsX3Nob3J0X3NjYW4pIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlN0YXJ0IGludGVybmFsIHBhc3NpdmUgc2Nhbi5cbiIpOwotCX0gZWxzZSBpZiAocHJpdi0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzKSB7CisJaWYgKHByaXYtPnNjYW5fcmVxdWVzdC0+bl9zc2lkcykgewogCQlpbnQgaSwgcCA9IDA7CiAJCUlXTF9ERUJVR19TQ0FOKHByaXYsICJLaWNraW5nIG9mZiBhY3RpdmUgc2NhblxuIik7CiAJCWZvciAoaSA9IDA7IGkgPCBwcml2LT5zY2FuX3JlcXVlc3QtPm5fc3NpZHM7IGkrKykgewpAQCAtOTgxLDM4ICs5MzUsMjEgQEAKIAlyeF9jaGFpbiB8PSByeF9hbnQgPDwgUlhPTl9SWF9DSEFJTl9GT1JDRV9TRUxfUE9TOwogCXJ4X2NoYWluIHw9IDB4MSA8PCBSWE9OX1JYX0NIQUlOX0RSSVZFUl9GT1JDRV9QT1M7CiAJc2Nhbi0+cnhfY2hhaW4gPSBjcHVfdG9fbGUxNihyeF9jaGFpbik7Ci0JaWYgKCFwcml2LT5pc19pbnRlcm5hbF9zaG9ydF9zY2FuKSB7Ci0JCWNtZF9sZW4gPSBpd2xfbGVnYWN5X2ZpbGxfcHJvYmVfcmVxKHByaXYsCisKKwljbWRfbGVuID0gaXdsX2xlZ2FjeV9maWxsX3Byb2JlX3JlcShwcml2LAogCQkJCQkoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2Nhbi0+ZGF0YSwKIAkJCQkJdmlmLT5hZGRyLAogCQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPmllLAogCQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPmllX2xlbiwKIAkJCQkJSVdMX01BWF9TQ0FOX1NJWkUgLSBzaXplb2YoKnNjYW4pKTsKLQl9IGVsc2UgewotCQkvKiB1c2UgYmNhc3QgYWRkciwgd2lsbCBub3QgYmUgdHJhbnNtaXR0ZWQgYnV0IG11c3QgYmUgdmFsaWQgKi8KLQkJY21kX2xlbiA9IGl3bF9sZWdhY3lfZmlsbF9wcm9iZV9yZXEocHJpdiwKLQkJCQkJKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXNjYW4tPmRhdGEsCi0JCQkJCWl3bGVnYWN5X2JjYXN0X2FkZHIsIE5VTEwsIDAsCi0JCQkJCUlXTF9NQVhfU0NBTl9TSVpFIC0gc2l6ZW9mKCpzY2FuKSk7Ci0KLQl9CiAJc2Nhbi0+dHhfY21kLmxlbiA9IGNwdV90b19sZTE2KGNtZF9sZW4pOwogCiAJc2Nhbi0+ZmlsdGVyX2ZsYWdzIHw9IChSWE9OX0ZJTFRFUl9BQ0NFUFRfR1JQX01TSyB8CiAJCQkgICAgICAgUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0spOwogCi0JaWYgKHByaXYtPmlzX2ludGVybmFsX3Nob3J0X3NjYW4pIHsKLQkJc2Nhbi0+Y2hhbm5lbF9jb3VudCA9Ci0JCQlpd2w0OTY1X2dldF9zaW5nbGVfY2hhbm5lbF9mb3Jfc2Nhbihwcml2LCB2aWYsIGJhbmQsCi0JCQkJKHZvaWQgKikmc2Nhbi0+ZGF0YVtsZTE2X3RvX2NwdSgKLQkJCQlzY2FuLT50eF9jbWQubGVuKV0pOwotCX0gZWxzZSB7Ci0JCXNjYW4tPmNoYW5uZWxfY291bnQgPQotCQkJaXdsNDk2NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4ocHJpdiwgdmlmLCBiYW5kLAotCQkJCWlzX2FjdGl2ZSwgbl9wcm9iZXMsCi0JCQkJKHZvaWQgKikmc2Nhbi0+ZGF0YVtsZTE2X3RvX2NwdSgKLQkJCQlzY2FuLT50eF9jbWQubGVuKV0pOwotCX0KKwlzY2FuLT5jaGFubmVsX2NvdW50ID0gaXdsNDk2NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4ocHJpdiwgdmlmLCBiYW5kLAorCQkJCQkJaXNfYWN0aXZlLCBuX3Byb2JlcywKKwkJCQkJCSh2b2lkICopJnNjYW4tPmRhdGFbY21kX2xlbl0pOwogCWlmIChzY2FuLT5jaGFubmVsX2NvdW50ID09IDApIHsKIAkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgImNoYW5uZWwgY291bnQgJWRcbiIsIHNjYW4tPmNoYW5uZWxfY291bnQpOwogCQlyZXR1cm4gLUVJTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXJzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1ycy5jCmluZGV4IDI0ZDE0OTkuLjliNjUxNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXJzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnMuYwpAQCAtMjI3NSw2ICsyMjc1LDkgQEAKIAlpZiAocmF0ZV9jb250cm9sX3NlbmRfbG93KHN0YSwgcHJpdl9zdGEsIHR4cmMpKQogCQlyZXR1cm47CiAKKwlpZiAoIWxxX3N0YSkKKwkJcmV0dXJuOworCiAJcmF0ZV9pZHggID0gbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHg7CiAKIAlpZiAobHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXJ4LmMKaW5kZXggYjlmYTJmNi4uMmIxNDRiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1yeC5jCkBAIC0xNTEsODEgKzE1MSw2IEBACiAKICNkZWZpbmUgUkVHX1JFQ0FMSUJfUEVSSU9EICg2MCkKIAotLyoqCi0gKiBpd2w0OTY1X2dvb2RfcGxjcF9oZWFsdGggLSBjaGVja3MgZm9yIHBsY3AgZXJyb3IuCi0gKgotICogV2hlbiB0aGUgcGxjcCBlcnJvciBpcyBleGNlZWRpbmcgdGhlIHRocmVzaG9sZHMsIHJlc2V0IHRoZSByYWRpbwotICogdG8gaW1wcm92ZSB0aGUgdGhyb3VnaHB1dC4KLSAqLwotYm9vbCBpd2w0OTY1X2dvb2RfcGxjcF9oZWFsdGgoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QpCi17Ci0JYm9vbCByYyA9IHRydWU7Ci0JaW50IGNvbWJpbmVkX3BsY3BfZGVsdGE7Ci0JdW5zaWduZWQgaW50IHBsY3BfbXNlYzsKLQl1bnNpZ25lZCBsb25nIHBsY3BfcmVjZWl2ZWRfamlmZmllczsKLQotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5wbGNwX2RlbHRhX3RocmVzaG9sZCA9PQotCSAgICBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9ESVNBQkxFKSB7Ci0JCUlXTF9ERUJVR19SQURJTyhwcml2LCAicGxjcF9lcnIgY2hlY2sgZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyoKLQkgKiBjaGVjayBmb3IgcGxjcF9lcnIgYW5kIHRyaWdnZXIgcmFkaW8gcmVzZXQgaWYgaXQgZXhjZWVkcwotCSAqIHRoZSBwbGNwIGVycm9yIHRocmVzaG9sZCBwbGNwX2RlbHRhLgotCSAqLwotCXBsY3BfcmVjZWl2ZWRfamlmZmllcyA9IGppZmZpZXM7Ci0JcGxjcF9tc2VjID0gamlmZmllc190b19tc2VjcygobG9uZykgcGxjcF9yZWNlaXZlZF9qaWZmaWVzIC0KLQkJCQkJKGxvbmcpIHByaXYtPnBsY3BfamlmZmllcyk7Ci0JcHJpdi0+cGxjcF9qaWZmaWVzID0gcGxjcF9yZWNlaXZlZF9qaWZmaWVzOwotCS8qCi0JICogY2hlY2sgdG8gbWFrZSBzdXJlIHBsY3BfbXNlYyBpcyBub3QgMCB0byBwcmV2ZW50IGRpdmlzaW9uCi0JICogYnkgemVyby4KLQkgKi8KLQlpZiAocGxjcF9tc2VjKSB7Ci0JCXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSAqb2ZkbTsKLQkJc3RydWN0IHN0YXRpc3RpY3NfcnhfaHRfcGh5ICpvZmRtX2h0OwotCi0JCW9mZG0gPSAmcGt0LT51LnN0YXRzLnJ4Lm9mZG07Ci0JCW9mZG1faHQgPSAmcGt0LT51LnN0YXRzLnJ4Lm9mZG1faHQ7Ci0JCWNvbWJpbmVkX3BsY3BfZGVsdGEgPQotCQkgICAgKGxlMzJfdG9fY3B1KG9mZG0tPnBsY3BfZXJyKSAtCi0JCSAgICBsZTMyX3RvX2NwdShwcml2LT5fNDk2NS5zdGF0aXN0aWNzLgotCQkJCXJ4Lm9mZG0ucGxjcF9lcnIpKSArCi0JCSAgICAobGUzMl90b19jcHUob2ZkbV9odC0+cGxjcF9lcnIpIC0KLQkJICAgIGxlMzJfdG9fY3B1KHByaXYtPl80OTY1LnN0YXRpc3RpY3MuCi0JCQkJcngub2ZkbV9odC5wbGNwX2VycikpOwotCi0JCWlmICgoY29tYmluZWRfcGxjcF9kZWx0YSA+IDApICYmCi0JCSAgICAoKGNvbWJpbmVkX3BsY3BfZGVsdGEgKiAxMDApIC8gcGxjcF9tc2VjKSA+Ci0JCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5wbGNwX2RlbHRhX3RocmVzaG9sZCkgewotCQkJLyoKLQkJCSAqIGlmIHBsY3BfZXJyIGV4Y2VlZCB0aGUgdGhyZXNob2xkLAotCQkJICogdGhlIGZvbGxvd2luZyBkYXRhIGlzIHByaW50ZWQgaW4gY3N2IGZvcm1hdDoKLQkJCSAqICAgIFRleHQ6IHBsY3BfZXJyIGV4Y2VlZGVkICVkLAotCQkJICogICAgUmVjZWl2ZWQgb2ZkbS5wbGNwX2VyciwKLQkJCSAqICAgIEN1cnJlbnQgb2ZkbS5wbGNwX2VyciwKLQkJCSAqICAgIFJlY2VpdmVkIG9mZG1faHQucGxjcF9lcnIsCi0JCQkgKiAgICBDdXJyZW50IG9mZG1faHQucGxjcF9lcnIsCi0JCQkgKiAgICBjb21iaW5lZF9wbGNwX2RlbHRhLAotCQkJICogICAgcGxjcF9tc2VjCi0JCQkgKi8KLQkJCUlXTF9ERUJVR19SQURJTyhwcml2LCAicGxjcF9lcnIgZXhjZWVkZWQgJXUsICIKLQkJCQkiJXUsICV1LCAldSwgJXUsICVkLCAldSBtU2Vjc1xuIiwKLQkJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5wbGNwX2RlbHRhX3RocmVzaG9sZCwKLQkJCQlsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2VyciksCi0JCQkJbGUzMl90b19jcHUob2ZkbS0+cGxjcF9lcnIpLAotCQkJCWxlMzJfdG9fY3B1KG9mZG1faHQtPnBsY3BfZXJyKSwKLQkJCQlsZTMyX3RvX2NwdShvZmRtX2h0LT5wbGNwX2VyciksCi0JCQkJY29tYmluZWRfcGxjcF9kZWx0YSwgcGxjcF9tc2VjKTsKLQotCQkJcmMgPSBmYWxzZTsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KIHZvaWQgaXdsNDk2NV9yeF9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQogewpAQCAtMjQ4LDggKzE3Myw3IEBACiAJaXdsNDk2NV9hY2N1bXVsYXRpdmVfc3RhdGlzdGljcyhwcml2LCAoX19sZTMyICopJnBrdC0+dS5zdGF0cyk7CiAjZW5kaWYKIAotCWl3bF9sZWdhY3lfcmVjb3Zlcl9mcm9tX3N0YXRpc3RpY3MocHJpdiwgcGt0KTsKLQorCS8qIFRPRE86IHJlYWRpbmcgc29tZSBvZiBzdGF0aXN0aWNzIGlzIHVubmVlZGVkICovCiAJbWVtY3B5KCZwcml2LT5fNDk2NS5zdGF0aXN0aWNzLCAmcGt0LT51LnN0YXRzLAogCQlzaXplb2YocHJpdi0+XzQ5NjUuc3RhdGlzdGljcykpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS10eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdHguYwppbmRleCA3OWFjMDgxLi5hYzRmNjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS10eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXR4LmMKQEAgLTI0MCw4ICsyNDAsNyBAQAogCiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgogCQl0eF9jbWQtPnNlY19jdGwgPSBUWF9DTURfU0VDX1RLSVA7Ci0JCWllZWU4MDIxMV9nZXRfdGtpcF9rZXkoa2V5Y29uZiwgc2tiX2ZyYWcsCi0JCQlJRUVFODAyMTFfVEtJUF9QMl9LRVksIHR4X2NtZC0+a2V5KTsKKwkJaWVlZTgwMjExX2dldF90a2lwX3AyayhrZXljb25mLCBza2JfZnJhZywgdHhfY21kLT5rZXkpOwogCQlJV0xfREVCVUdfVFgocHJpdiwgInR4X2NtZCB3aXRoIHRraXAgaHdjcnlwdG9cbiIpOwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmMKaW5kZXggZjlkYjI1Yi4uYmQ0YjAwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS5jCkBAIC00OTYsNyArNDk2LDcgQEAKIAkgICAgY2hhbm5lbCA8PSBDQUxJQl9JV0xfVFhfQVRURU5fR1I0X0xDSCkKIAkJcmV0dXJuIENBTElCX0NIX0dST1VQXzQ7CiAKLQlyZXR1cm4gLTE7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyB1MzIgaXdsNDk2NV9nZXRfc3ViX2JhbmQoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgY2hhbm5lbCkKQEAgLTkxNSw3ICs5MTUsNyBAQAogCWlmICh0eGF0dGVuX2dycCA8IDApIHsKIAkJSVdMX0VSUihwcml2LCAiQ2FuJ3QgZmluZCB0eGF0dGVuIGdyb3VwIGZvciBjaGFubmVsICVkLlxuIiwKIAkJCSAgY2hhbm5lbCk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gdHhhdHRlbl9ncnA7CiAJfQogCiAJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNoYW5uZWwgJWQgYmVsb25ncyB0byB0eGF0dGVuIGdyb3VwICVkXG4iLApAQCAtMTE4NSw4ICsxMTg1LDYgQEAKIAogCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1X2FzeW5jKHByaXYsIFJFUExZX1JYT05fQVNTT0MsCiAJCQkJICAgICBzaXplb2Yocnhvbl9hc3NvYyksICZyeG9uX2Fzc29jLCBOVUxMKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEyMTgsMTAgKzEyMTYsMTAgQEAKIAkgKiByZWNlaXZlIGNvbW1pdF9yeG9uIHJlcXVlc3QKIAkgKiBhYm9ydCBhbnkgcHJldmlvdXMgY2hhbm5lbCBzd2l0Y2ggaWYgc3RpbGwgaW4gcHJvY2VzcwogCSAqLwotCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgJiYKLQkgICAgKHByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgIT0gY3R4LT5zdGFnaW5nLmNoYW5uZWwpKSB7CisJaWYgKHRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSAmJgorCSAgICAocHJpdi0+c3dpdGNoX2NoYW5uZWwgIT0gY3R4LT5zdGFnaW5nLmNoYW5uZWwpKSB7CiAJCUlXTF9ERUJVR18xMUgocHJpdiwgImFib3J0IGNoYW5uZWwgc3dpdGNoIG9uICVkXG4iLAotCQkgICAgICBsZTE2X3RvX2NwdShwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsKSk7CisJCSAgICAgIGxlMTZfdG9fY3B1KHByaXYtPnN3aXRjaF9jaGFubmVsKSk7CiAJCWl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShwcml2LCBmYWxzZSk7CiAJfQogCkBAIC0xMjM3LDcgKzEyMzUsNyBAQAogCiAJCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwogCQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwgY3R4KTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gc2V0X3R4X3Bvd2VyOwogCX0KIAogCS8qIElmIHdlIGFyZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBhbmQgdGhlIG5ldyBjb25maWcgcmVxdWlyZXMKQEAgLTEzMTcsNiArMTMxNSw3IEBACiAKIAlpd2w0OTY1X2luaXRfc2Vuc2l0aXZpdHkocHJpdik7CiAKK3NldF90eF9wb3dlcjoKIAkvKiBJZiB3ZSBpc3N1ZSBhIG5ldyBSWE9OIGNvbW1hbmQgd2hpY2ggcmVxdWlyZWQgYSB0dW5lIHRoZW4gd2UgbXVzdAogCSAqIHNlbmQgYSBuZXcgVFhQT1dFUiBjb21tYW5kIG9yIHdlIHdvbid0IGJlIGFibGUgdG8gVHggYW55IGZyYW1lcyAqLwogCXJldCA9IGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIHRydWUpOwpAQCAtMTQwMyw5ICsxNDAyLDYgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCXByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgPSBjbWQuY2hhbm5lbDsKLQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSB0cnVlOwotCiAJcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsCiAJCQkgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsIHNpemVvZihjbWQpLCAmY21kKTsKIH0KQEAgLTIwNzMsNyArMjA2OSw2IEBACiAJLmlzX3ZhbGlkX3J0Y19kYXRhX2FkZHIgPSBpd2w0OTY1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIsCiAJLmluaXRfYWxpdmVfc3RhcnQgPSBpd2w0OTY1X2luaXRfYWxpdmVfc3RhcnQsCiAJLmxvYWRfdWNvZGUgPSBpd2w0OTY1X2xvYWRfYnNtLAotCS5kdW1wX25pY19ldmVudF9sb2cgPSBpd2w0OTY1X2R1bXBfbmljX2V2ZW50X2xvZywKIAkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaXdsNDk2NV9kdW1wX25pY19lcnJvcl9sb2csCiAJLmR1bXBfZmggPSBpd2w0OTY1X2R1bXBfZmgsCiAJLnNldF9jaGFubmVsX3N3aXRjaCA9IGl3bDQ5NjVfaHdfY2hhbm5lbF9zd2l0Y2gsCkBAIC0yMTA0LDcgKzIwOTksNiBAQAogCQkudHhfc3RhdHNfcmVhZCA9IGl3bDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZCwKIAkJLmdlbmVyYWxfc3RhdHNfcmVhZCA9IGl3bDQ5NjVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkLAogCX0sCi0JLmNoZWNrX3BsY3BfaGVhbHRoID0gaXdsNDk2NV9nb29kX3BsY3BfaGVhbHRoLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfbGVnYWN5X29wcyBpd2w0OTY1X2xlZ2FjeV9vcHMgPSB7CkBAIC0yMTU0LDEwICsyMTQ4LDggQEAKIAkudXNlX2JzbSA9IHRydWUsCiAJLmxlZF9jb21wZW5zYXRpb24gPSA2MSwKIAkuY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMgPSBJV0w0OTY1X0NBTF9OVU1fQkVBQ09OUywKLQkucGxjcF9kZWx0YV90aHJlc2hvbGQgPSBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9ERUYsCiAJLndkX3RpbWVvdXQgPSBJV0xfREVGX1dEX1RJTUVPVVQsCiAJLnRlbXBlcmF0dXJlX2tlbHZpbiA9IHRydWUsCi0JLm1heF9ldmVudF9sb2dfc2l6ZSA9IDUxMiwKIAkudWNvZGVfdHJhY2luZyA9IHRydWUsCiAJLnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlciA9IHRydWUsCiAJLmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlciA9IHRydWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29tbWFuZHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb21tYW5kcy5oCmluZGV4IDE3YTFkNTAuLjg5OTA0MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb21tYW5kcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb21tYW5kcy5oCkBAIC0yMjk3LDE0ICsyMjk3LDcgQEAKICNkZWZpbmUgSVdMX1BPV0VSX1ZFQ19TSVpFIDUKIAogI2RlZmluZSBJV0xfUE9XRVJfRFJJVkVSX0FMTE9XX1NMRUVQX01TSwljcHVfdG9fbGUxNihCSVQoMCkpCi0jZGVmaW5lIElXTF9QT1dFUl9QT1dFUl9TQVZFX0VOQV9NU0sJCWNwdV90b19sZTE2KEJJVCgwKSkKLSNkZWZpbmUgSVdMX1BPV0VSX1BPV0VSX01BTkFHRU1FTlRfRU5BX01TSwljcHVfdG9fbGUxNihCSVQoMSkpCi0jZGVmaW5lIElXTF9QT1dFUl9TTEVFUF9PVkVSX0RUSU1fTVNLCQljcHVfdG9fbGUxNihCSVQoMikpCiAjZGVmaW5lIElXTF9QT1dFUl9QQ0lfUE1fTVNLCQkJY3B1X3RvX2xlMTYoQklUKDMpKQotI2RlZmluZSBJV0xfUE9XRVJfRkFTVF9QRAkJCWNwdV90b19sZTE2KEJJVCg0KSkKLSNkZWZpbmUgSVdMX1BPV0VSX0JFQUNPTl9GSUxURVJJTkcJCWNwdV90b19sZTE2KEJJVCg1KSkKLSNkZWZpbmUgSVdMX1BPV0VSX1NIQURPV19SRUdfRU5BCQljcHVfdG9fbGUxNihCSVQoNikpCi0jZGVmaW5lIElXTF9QT1dFUl9DVF9LSUxMX1NFVAkJCWNwdV90b19sZTE2KEJJVCg3KSkKIAogc3RydWN0IGl3bDM5NDVfcG93ZXJ0YWJsZV9jbWQgewogCV9fbGUxNiBmbGFnczsKQEAgLTI2MjQsOCArMjYxNyw4IEBACiAJX19sZTMyIHN0YXR1czsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgIFNDQU5fT1dORVJfU1RBVFVTIDB4MTsKLSNkZWZpbmUgIE1FQVNVUkVfT1dORVJfU1RBVFVTIDB4MjsKKyNkZWZpbmUgIFNDQU5fT1dORVJfU1RBVFVTIDB4MQorI2RlZmluZSAgTUVBU1VSRV9PV05FUl9TVEFUVVMgMHgyCiAKICNkZWZpbmUgSVdMX1BST0JFX1NUQVRVU19PSwkJMAogI2RlZmluZSBJV0xfUFJPQkVfU1RBVFVTX1RYX0ZBSUxFRAlCSVQoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5jCmluZGV4IDQyZGY4MzIuLjM1Y2QyNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuYwpAQCAtODU5LDEyICs4NTksOCBAQAogCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKIAkJcmV0dXJuOwogCi0JaWYgKHByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcykgeworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZShjdHgtPnZpZiwgaXNfc3VjY2Vzcyk7Ci0JCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQkJcHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzID0gZmFsc2U7Ci0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCX0KIH0KIEVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKTsKIApAQCAtODc2LDE5ICs4NzIsMTkgQEAKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwogCXN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICpyeG9uID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7CiAKLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKSB7Ci0JCWlmICghbGUzMl90b19jcHUoY3NhLT5zdGF0dXMpICYmCi0JCSAgICAoY3NhLT5jaGFubmVsID09IHByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwpKSB7Ci0JCQlyeG9uLT5jaGFubmVsID0gY3NhLT5jaGFubmVsOwotCQkJY3R4LT5zdGFnaW5nLmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7Ci0JCQlJV0xfREVCVUdfMTFIKHByaXYsICJDU0Egbm90aWY6IGNoYW5uZWwgJWRcbiIsCisJaWYgKCF0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlmICghbGUzMl90b19jcHUoY3NhLT5zdGF0dXMpICYmIGNzYS0+Y2hhbm5lbCA9PSBwcml2LT5zd2l0Y2hfY2hhbm5lbCkgeworCQlyeG9uLT5jaGFubmVsID0gY3NhLT5jaGFubmVsOworCQljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKKwkJSVdMX0RFQlVHXzExSChwcml2LCAiQ1NBIG5vdGlmOiBjaGFubmVsICVkXG4iLAogCQkJICAgICAgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCQlpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUocHJpdiwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlJV0xfRVJSKHByaXYsICJDU0Egbm90aWYgKGZhaWwpIDogY2hhbm5lbCAlZFxuIiwKLQkJCSAgICAgIGxlMTZfdG9fY3B1KGNzYS0+Y2hhbm5lbCkpOwotCQkJaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHByaXYsIGZhbHNlKTsKLQkJfQorCQlpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUocHJpdiwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJSVdMX0VSUihwcml2LCAiQ1NBIG5vdGlmIChmYWlsKSA6IGNoYW5uZWwgJWRcbiIsCisJCQlsZTE2X3RvX2NwdShjc2EtPmNoYW5uZWwpKTsKKwkJaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHByaXYsIGZhbHNlKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcnhfY3NhKTsKQEAgLTkzNSw3ICs5MzEsNiBAQAogCXByaXYtPmNmZy0+b3BzLT5saWItPmR1bXBfbmljX2Vycm9yX2xvZyhwcml2KTsKIAlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9maCkKIAkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9maChwcml2LCBOVUxMLCBmYWxzZSk7Ci0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9uaWNfZXZlbnRfbG9nKHByaXYsIGZhbHNlLCBOVUxMLCBmYWxzZSk7CiAjaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCiAJaWYgKGl3bF9sZWdhY3lfZ2V0X2RlYnVnX2xldmVsKHByaXYpICYgSVdMX0RMX0ZXX0VSUk9SUykKIAkJaXdsX2xlZ2FjeV9wcmludF9yeF9jb25maWdfY21kKHByaXYsCkBAIC0xNzExLDQxICsxNzA2LDE0IEBACiBFWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfdXBkYXRlX3N0YXRzKTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBfaXdsX2xlZ2FjeV9mb3JjZV9yZl9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYW55X2Fzc29jaWF0ZWQocHJpdikpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgImZvcmNlIHJlc2V0IHJlamVjdGVkOiBub3QgYXNzb2NpYXRlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0JLyoKLQkgKiBUaGVyZSBpcyBubyBlYXN5IGFuZCBiZXR0ZXIgd2F5IHRvIGZvcmNlIHJlc2V0IHRoZSByYWRpbywKLQkgKiB0aGUgb25seSBrbm93biBtZXRob2QgaXMgc3dpdGNoaW5nIGNoYW5uZWwgd2hpY2ggd2lsbCBmb3JjZSB0bwotCSAqIHJlc2V0IGFuZCB0dW5lIHRoZSByYWRpby4KLQkgKiBVc2UgaW50ZXJuYWwgc2hvcnQgc2NhbiAoc2luZ2xlIGNoYW5uZWwpIG9wZXJhdGlvbiB0byBzaG91bGQKLQkgKiBhY2hpZXZlIHRoaXMgb2JqZWN0aXZlLgotCSAqIERyaXZlciBzaG91bGQgcmVzZXQgdGhlIHJhZGlvIHdoZW4gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG1pc3NlZAotCSAqIGJlYWNvbiwgb3IgYW55IG90aGVyIHVDb2RlIGVycm9yIGNvbmRpdGlvbiBkZXRlY3RlZC4KLQkgKi8KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicGVyZm9ybSByYWRpbyByZXNldC5cbiIpOwotCWl3bF9sZWdhY3lfaW50ZXJuYWxfc2hvcnRfaHdfc2Nhbihwcml2KTsKLX0KLQotCi1pbnQgaXdsX2xlZ2FjeV9mb3JjZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBtb2RlLCBib29sIGV4dGVybmFsKQoraW50IGl3bF9sZWdhY3lfZm9yY2VfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGV4dGVybmFsKQogewogCXN0cnVjdCBpd2xfZm9yY2VfcmVzZXQgKmZvcmNlX3Jlc2V0OwogCiAJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChtb2RlID49IElXTF9NQVhfRk9SQ0VfUkVTRVQpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgImludmFsaWQgcmVzZXQgcmVxdWVzdC5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZm9yY2VfcmVzZXQgPSAmcHJpdi0+Zm9yY2VfcmVzZXRbbW9kZV07CisJZm9yY2VfcmVzZXQgPSAmcHJpdi0+Zm9yY2VfcmVzZXQ7CiAJZm9yY2VfcmVzZXQtPnJlc2V0X3JlcXVlc3RfY291bnQrKzsKIAlpZiAoIWV4dGVybmFsKSB7CiAJCWlmIChmb3JjZV9yZXNldC0+bGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzICYmCkBAIC0xNzU4LDM3ICsxNzI2LDM0IEBACiAJfQogCWZvcmNlX3Jlc2V0LT5yZXNldF9zdWNjZXNzX2NvdW50Kys7CiAJZm9yY2VfcmVzZXQtPmxhc3RfZm9yY2VfcmVzZXRfamlmZmllcyA9IGppZmZpZXM7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInBlcmZvcm0gZm9yY2UgcmVzZXQgKCVkKVxuIiwgbW9kZSk7Ci0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBJV0xfUkZfUkVTRVQ6Ci0JCV9pd2xfbGVnYWN5X2ZvcmNlX3JmX3Jlc2V0KHByaXYpOwotCQlicmVhazsKLQljYXNlIElXTF9GV19SRVNFVDoKLQkJLyoKLQkJICogaWYgdGhlIHJlcXVlc3QgaXMgZnJvbSBleHRlcm5hbChleDogZGVidWdmcyksCi0JCSAqIHRoZW4gYWx3YXlzIHBlcmZvcm0gdGhlIHJlcXVlc3QgaW4gcmVnYXJkbGVzcyB0aGUgbW9kdWxlCi0JCSAqIHBhcmFtZXRlciBzZXR0aW5nCi0JCSAqIGlmIHRoZSByZXF1ZXN0IGlzIGZyb20gaW50ZXJuYWwgKHVDb2RlIGVycm9yIG9yIGRyaXZlcgotCQkgKiBkZXRlY3QgZmFpbHVyZSksIHRoZW4gZndfcmVzdGFydCBtb2R1bGUgcGFyYW1ldGVyCi0JCSAqIG5lZWQgdG8gYmUgY2hlY2sgYmVmb3JlIHBlcmZvcm1pbmcgZmlybXdhcmUgcmVsb2FkCi0JCSAqLwotCQlpZiAoIWV4dGVybmFsICYmICFwcml2LT5jZmctPm1vZF9wYXJhbXMtPnJlc3RhcnRfZncpIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJDYW5jZWwgZmlybXdhcmUgcmVsb2FkIGJhc2VkIG9uICIKLQkJCQkgICAgICAgIm1vZHVsZSBwYXJhbWV0ZXIgc2V0dGluZ1xuIik7Ci0JCQlicmVhazsKLQkJfQotCQlJV0xfRVJSKHByaXYsICJPbiBkZW1hbmQgZmlybXdhcmUgcmVsb2FkXG4iKTsKLQkJLyogU2V0IHRoZSBGVyBlcnJvciBmbGFnIC0tIGNsZWFyZWQgb24gaXdsX2Rvd24gKi8KLQkJc2V0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0JCS8qCi0JCSAqIEtlZXAgdGhlIHJlc3RhcnQgcHJvY2VzcyBmcm9tIHRyeWluZyB0byBzZW5kIGhvc3QKLQkJICogY29tbWFuZHMgYnkgY2xlYXJpbmcgdGhlIElOSVQgc3RhdHVzIGJpdAotCQkgKi8KLQkJY2xlYXJfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cyk7Ci0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVzdGFydCk7Ci0JCWJyZWFrOworCisJLyoKKwkgKiBpZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGV4dGVybmFsKGV4OiBkZWJ1Z2ZzKSwKKwkgKiB0aGVuIGFsd2F5cyBwZXJmb3JtIHRoZSByZXF1ZXN0IGluIHJlZ2FyZGxlc3MgdGhlIG1vZHVsZQorCSAqIHBhcmFtZXRlciBzZXR0aW5nCisJICogaWYgdGhlIHJlcXVlc3QgaXMgZnJvbSBpbnRlcm5hbCAodUNvZGUgZXJyb3Igb3IgZHJpdmVyCisJICogZGV0ZWN0IGZhaWx1cmUpLCB0aGVuIGZ3X3Jlc3RhcnQgbW9kdWxlIHBhcmFtZXRlcgorCSAqIG5lZWQgdG8gYmUgY2hlY2sgYmVmb3JlIHBlcmZvcm1pbmcgZmlybXdhcmUgcmVsb2FkCisJICovCisKKwlpZiAoIWV4dGVybmFsICYmICFwcml2LT5jZmctPm1vZF9wYXJhbXMtPnJlc3RhcnRfZncpIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNhbmNlbCBmaXJtd2FyZSByZWxvYWQgYmFzZWQgb24gIgorCQkJICAgICAgICJtb2R1bGUgcGFyYW1ldGVyIHNldHRpbmdcbiIpOworCQlyZXR1cm4gMDsKIAl9CisKKwlJV0xfRVJSKHByaXYsICJPbiBkZW1hbmQgZmlybXdhcmUgcmVsb2FkXG4iKTsKKworCS8qIFNldCB0aGUgRlcgZXJyb3IgZmxhZyAtLSBjbGVhcmVkIG9uIGl3bF9kb3duICovCisJc2V0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKwkvKgorCSAqIEtlZXAgdGhlIHJlc3RhcnQgcHJvY2VzcyBmcm9tIHRyeWluZyB0byBzZW5kIGhvc3QKKwkgKiBjb21tYW5kcyBieSBjbGVhcmluZyB0aGUgSU5JVCBzdGF0dXMgYml0CisJICovCisJY2xlYXJfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cyk7CisJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZXN0YXJ0KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xODgzLDcgKzE4NDgsNyBAQAogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCUlXTF9FUlIocHJpdiwgIlF1ZXVlICVkIHN0dWNrIGZvciAldSBtcy5cbiIsCiAJCQkJcS0+aWQsIHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPndkX3RpbWVvdXQpOwotCQlyZXQgPSBpd2xfbGVnYWN5X2ZvcmNlX3Jlc2V0KHByaXYsIElXTF9GV19SRVNFVCwgZmFsc2UpOworCQlyZXQgPSBpd2xfbGVnYWN5X2ZvcmNlX3Jlc2V0KHByaXYsIGZhbHNlKTsKIAkJcmV0dXJuIChyZXQgPT0gLUVBR0FJTikgPyAwIDogMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5oCmluZGV4IGJjNjZjNjAuLjg0ZGE3OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuaApAQCAtMTQzLDggKzE0Myw3IEBACiAJaW50ICgqaXNfdmFsaWRfcnRjX2RhdGFfYWRkcikodTMyIGFkZHIpOwogCS8qIDFzdCB1Y29kZSBsb2FkICovCiAJaW50ICgqbG9hZF91Y29kZSkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQlpbnQgKCpkdW1wX25pY19ldmVudF9sb2cpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIGJvb2wgZnVsbF9sb2csIGNoYXIgKipidWYsIGJvb2wgZGlzcGxheSk7CisKIAl2b2lkICgqZHVtcF9uaWNfZXJyb3JfbG9nKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogCWludCAoKmR1bXBfZmgpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgY2hhciAqKmJ1ZiwgYm9vbCBkaXNwbGF5KTsKIAlpbnQgKCpzZXRfY2hhbm5lbF9zd2l0Y2gpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKQEAgLTE2MSw5ICsxNjAsNiBAQAogCiAJLyogdGVtcGVyYXR1cmUgKi8KIAlzdHJ1Y3QgaXdsX3RlbXBfb3BzIHRlbXBfb3BzOwotCS8qIGNoZWNrIGZvciBwbGNwIGhlYWx0aCAqLwotCWJvb2wgKCpjaGVja19wbGNwX2hlYWx0aCkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KTsKIAogCXN0cnVjdCBpd2xfZGVidWdmc19vcHMgZGVidWdmc19vcHM7CiAKQEAgLTIwNywxMSArMjAzLDggQEAKICAqCXRvIHRoZSBkZXZpYXRpb24gdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBsZWQgZnJlcXVlbmN5LgogICoJVGhlIGRldGFpbCBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIGl3bC1sZWQuYwogICogQGNoYWluX25vaXNlX251bV9iZWFjb25zOiBudW1iZXIgb2YgYmVhY29ucyB1c2VkIHRvIGNvbXB1dGUgY2hhaW4gbm9pc2UKLSAqIEBwbGNwX2RlbHRhX3RocmVzaG9sZDogcGxjcCBlcnJvciByYXRlIHRocmVzaG9sZCB1c2VkIHRvIHRyaWdnZXIKLSAqCXJhZGlvIHR1bmluZyB3aGVuIHRoZXJlIGlzIGEgaGlnaCByZWNlaXZpbmcgcGxjcCBlcnJvciByYXRlCiAgKiBAd2RfdGltZW91dDogVFggcXVldWVzIHdhdGNoZG9nIHRpbWVvdXQKICAqIEB0ZW1wZXJhdHVyZV9rZWx2aW46IHRlbXBlcmF0dXJlIHJlcG9ydCBieSB1Q29kZSBpbiBrZWx2aW4KLSAqIEBtYXhfZXZlbnRfbG9nX3NpemU6IHNpemUgb2YgZXZlbnQgbG9nIGJ1ZmZlciBzaXplIGZvciB1Y29kZSBldmVudCBsb2dnaW5nCiAgKiBAdWNvZGVfdHJhY2luZzogc3VwcG9ydCB1Y29kZSBjb250aW51b3VzIHRyYWNpbmcKICAqIEBzZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXI6IGRyaXZlciBoYXMgdGhlIGNhcGFiaWxpdHkgdG8gcGVyZm9ybQogICoJc2Vuc2l0aXZpdHkgY2FsaWJyYXRpb24gb3BlcmF0aW9uCkBAIC0yMjksMTAgKzIyMiw4IEBACiAKIAl1MTYgbGVkX2NvbXBlbnNhdGlvbjsKIAlpbnQgY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0JdTggcGxjcF9kZWx0YV90aHJlc2hvbGQ7CiAJdW5zaWduZWQgaW50IHdkX3RpbWVvdXQ7CiAJYm9vbCB0ZW1wZXJhdHVyZV9rZWx2aW47Ci0JdTMyIG1heF9ldmVudF9sb2dfc2l6ZTsKIAljb25zdCBib29sIHVjb2RlX3RyYWNpbmc7CiAJY29uc3QgYm9vbCBzZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXI7CiAJY29uc3QgYm9vbCBjaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXI7CkBAIC00NDEsNyArNDMyLDcgQEAKIAkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEpOwogdm9pZCBpd2xfbGVnYWN5X2ludGVybmFsX3Nob3J0X2h3X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X2ZvcmNlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IG1vZGUsIGJvb2wgZXh0ZXJuYWwpOworaW50IGl3bF9sZWdhY3lfZm9yY2VfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGV4dGVybmFsKTsKIHUxNiBpd2xfbGVnYWN5X2ZpbGxfcHJvYmVfcmVxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqZnJhbWUsCiAJCSAgICAgICBjb25zdCB1OCAqdGEsIGNvbnN0IHU4ICppZSwgaW50IGllX2xlbiwgaW50IGxlZnQpOwpAQCAtNDkzLDcgKzQ4NCw3IEBACiB7CiAJaW50IHBvczsKIAl1MTYgcGNpX2xua19jdGw7Ci0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwcml2LT5wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJcG9zID0gcGNpX3BjaWVfY2FwKHByaXYtPnBjaV9kZXYpOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHByaXYtPnBjaV9kZXYsIHBvcyArIFBDSV9FWFBfTE5LQ1RMLCAmcGNpX2xua19jdGwpOwogCXJldHVybiBwY2lfbG5rX2N0bDsKIH0KQEAgLTUyMSw4ICs1MTIsNiBAQAogKiAgRXJyb3IgSGFuZGxpbmcgRGVidWdnaW5nCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGl3bDQ5NjVfZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsNDk2NV9kdW1wX25pY19ldmVudF9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgYm9vbCBmdWxsX2xvZywgY2hhciAqKmJ1ZiwgYm9vbCBkaXNwbGF5KTsKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKIHZvaWQgaXdsX2xlZ2FjeV9wcmludF9yeF9jb25maWdfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCSAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7CkBAIC01NjAsNyArNTQ5LDcgQEAKICNkZWZpbmUgU1RBVFVTX1NDQU5fSFcJCTE1CiAjZGVmaW5lIFNUQVRVU19QT1dFUl9QTUkJMTYKICNkZWZpbmUgU1RBVFVTX0ZXX0VSUk9SCQkxNwotCisjZGVmaW5lIFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HIDE4CiAKIHN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfcmVhZHkoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZWJ1Z2ZzLmMKaW5kZXggMmQzMjQzOC4uOTk2OTk2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGVidWdmcy5jCkBAIC0zOTEsNDggKzM5MSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19sb2dfZXZlbnRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyICpidWY7Ci0JaW50IHBvcyA9IDA7Ci0Jc3NpemVfdCByZXQgPSAtRU5PTUVNOwotCi0JcmV0ID0gcG9zID0gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9uaWNfZXZlbnRfbG9nKAotCQkJCQlwcml2LCB0cnVlLCAmYnVmLCB0cnVlKTsKLQlpZiAoYnVmKSB7Ci0JCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCQlrZnJlZShidWYpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX2xvZ19ldmVudF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdTMyIGV2ZW50X2xvZ19mbGFnOwotCWNoYXIgYnVmWzhdOwotCWludCBidWZfc2l6ZTsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAgMSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHNzY2FuZihidWYsICIlZCIsICZldmVudF9sb2dfZmxhZykgIT0gMSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKGV2ZW50X2xvZ19mbGFnID09IDEpCi0JCXByaXYtPmNmZy0+b3BzLT5saWItPmR1bXBfbmljX2V2ZW50X2xvZyhwcml2LCB0cnVlLAotCQkJCQkJCU5VTEwsIGZhbHNlKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotCi0KIHN0YXRpYyBzc2l6ZV90CiBpd2xfbGVnYWN5X2RiZ2ZzX2NoYW5uZWxzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCkBAIC03MDYsNyArNjY0LDYgQEAKIH0KIAogREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHNyYW0pOwotREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGxvZ19ldmVudCk7CiBERUJVR0ZTX1JFQURfRklMRV9PUFMobnZtKTsKIERFQlVHRlNfUkVBRF9GSUxFX09QUyhzdGF0aW9ucyk7CiBERUJVR0ZTX1JFQURfRklMRV9PUFMoY2hhbm5lbHMpOwpAQCAtMTA5OCw1NiArMTA1NSw2IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3Vjb2RlX3RyYWNpbmdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgYnVmWzEyOF07Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJ1Y29kZSB0cmFjZSB0aW1lciBpcyAlc1xuIiwKLQkJCXByaXYtPmV2ZW50X2xvZy51Y29kZV90cmFjZSA/ICJPbiIgOiAiT2ZmIik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibm9uX3dyYXBzX2NvdW50Olx0XHQgJXVcbiIsCi0JCQlwcml2LT5ldmVudF9sb2cubm9uX3dyYXBzX2NvdW50KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJ3cmFwc19vbmNlX2NvdW50Olx0XHQgJXVcbiIsCi0JCQlwcml2LT5ldmVudF9sb2cud3JhcHNfb25jZV9jb3VudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAid3JhcHNfbW9yZV9jb3VudDpcdFx0ICV1XG4iLAotCQkJcHJpdi0+ZXZlbnRfbG9nLndyYXBzX21vcmVfY291bnQpOwotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3Vjb2RlX3RyYWNpbmdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbOF07Ci0JaW50IGJ1Zl9zaXplOwotCWludCB0cmFjZTsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAgMSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHNzY2FuZihidWYsICIlZCIsICZ0cmFjZSkgIT0gMSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAodHJhY2UpIHsKLQkJcHJpdi0+ZXZlbnRfbG9nLnVjb2RlX3RyYWNlID0gdHJ1ZTsKLQkJLyogc2NoZWR1bGUgdGhlIHVjb2RlIHRpbWVyIHRvIG9jY3VyIGluIFVDT0RFX1RSQUNFX1BFUklPRCAqLwotCQltb2RfdGltZXIoJnByaXYtPnVjb2RlX3RyYWNlLAotCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoVUNPREVfVFJBQ0VfUEVSSU9EKSk7Ci0JfSBlbHNlIHsKLQkJcHJpdi0+ZXZlbnRfbG9nLnVjb2RlX3RyYWNlID0gZmFsc2U7Ci0JCWRlbF90aW1lcl9zeW5jKCZwcml2LT51Y29kZV90cmFjZSk7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCiBzdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3J4b25fZmxhZ3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQkJIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7CkBAIC0xMjM2LDcyICsxMTQzLDMxIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3BsY3BfZGVsdGFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgYnVmWzEyXTsKLQljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiV1XG4iLAotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+cGxjcF9kZWx0YV90aHJlc2hvbGQpOwotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3BsY3BfZGVsdGFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1Zls4XTsKLQlpbnQgYnVmX3NpemU7Ci0JaW50IHBsY3A7Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmcGxjcCkgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKChwbGNwIDwgSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfTUlOKSB8fAotCQkocGxjcCA+IElXTF9NQVhfUExDUF9FUlJfVEhSRVNIT0xEX01BWCkpCi0JCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnBsY3BfZGVsdGFfdGhyZXNob2xkID0KLQkJCUlXTF9NQVhfUExDUF9FUlJfVEhSRVNIT0xEX0RJU0FCTEU7Ci0JZWxzZQotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5wbGNwX2RlbHRhX3RocmVzaG9sZCA9IHBsY3A7Ci0JcmV0dXJuIGNvdW50OwotfQotCiBzdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX2ZvcmNlX3Jlc2V0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKIAogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgaSwgcG9zID0gMDsKKwlpbnQgcG9zID0gMDsKIAljaGFyIGJ1ZlszMDBdOwogCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOwogCXN0cnVjdCBpd2xfZm9yY2VfcmVzZXQgKmZvcmNlX3Jlc2V0OwogCi0JZm9yIChpID0gMDsgaSA8IElXTF9NQVhfRk9SQ0VfUkVTRVQ7IGkrKykgewotCQlmb3JjZV9yZXNldCA9ICZwcml2LT5mb3JjZV9yZXNldFtpXTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJGb3JjZSByZXNldCBtZXRob2QgJWRcbiIsIGkpOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIlx0bnVtYmVyIG9mIHJlc2V0IHJlcXVlc3Q6ICVkXG4iLAotCQkJCWZvcmNlX3Jlc2V0LT5yZXNldF9yZXF1ZXN0X2NvdW50KTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJcdG51bWJlciBvZiByZXNldCByZXF1ZXN0IHN1Y2Nlc3M6ICVkXG4iLAotCQkJCWZvcmNlX3Jlc2V0LT5yZXNldF9zdWNjZXNzX2NvdW50KTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJcdG51bWJlciBvZiByZXNldCByZXF1ZXN0IHJlamVjdDogJWRcbiIsCi0JCQkJZm9yY2VfcmVzZXQtPnJlc2V0X3JlamVjdF9jb3VudCk7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkiXHRyZXNldCBkdXJhdGlvbjogJWx1XG4iLAotCQkJCWZvcmNlX3Jlc2V0LT5yZXNldF9kdXJhdGlvbik7Ci0JfQorCWZvcmNlX3Jlc2V0ID0gJnByaXYtPmZvcmNlX3Jlc2V0OworCisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJIlx0bnVtYmVyIG9mIHJlc2V0IHJlcXVlc3Q6ICVkXG4iLAorCQkJZm9yY2VfcmVzZXQtPnJlc2V0X3JlcXVlc3RfY291bnQpOworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSJcdG51bWJlciBvZiByZXNldCByZXF1ZXN0IHN1Y2Nlc3M6ICVkXG4iLAorCQkJZm9yY2VfcmVzZXQtPnJlc2V0X3N1Y2Nlc3NfY291bnQpOworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSJcdG51bWJlciBvZiByZXNldCByZXF1ZXN0IHJlamVjdDogJWRcbiIsCisJCQlmb3JjZV9yZXNldC0+cmVzZXRfcmVqZWN0X2NvdW50KTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkiXHRyZXNldCBkdXJhdGlvbjogJWx1XG4iLAorCQkJZm9yY2VfcmVzZXQtPnJlc2V0X2R1cmF0aW9uKTsKKwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKIH0KIApAQCAtMTMwOSwyNSArMTE3NSwxMSBAQAogCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7CiAKKwlpbnQgcmV0OwogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1Zls4XTsKLQlpbnQgYnVmX3NpemU7Ci0JaW50IHJlc2V0LCByZXQ7CiAKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmcmVzZXQpICE9IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCXN3aXRjaCAocmVzZXQpIHsKLQljYXNlIElXTF9SRl9SRVNFVDoKLQljYXNlIElXTF9GV19SRVNFVDoKLQkJcmV0ID0gaXdsX2xlZ2FjeV9mb3JjZV9yZXNldChwcml2LCByZXNldCwgdHJ1ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlyZXQgPSBpd2xfbGVnYWN5X2ZvcmNlX3Jlc2V0KHByaXYsIHRydWUpOworCiAJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwogfQogCkBAIC0xMzY3LDEwICsxMjE5LDggQEAKIERFQlVHRlNfUkVBRF9GSUxFX09QUyhwb3dlcl9zYXZlX3N0YXR1cyk7CiBERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKGNsZWFyX3Vjb2RlX3N0YXRpc3RpY3MpOwogREVCVUdGU19XUklURV9GSUxFX09QUyhjbGVhcl90cmFmZmljX3N0YXRpc3RpY3MpOwotREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHVjb2RlX3RyYWNpbmcpOwogREVCVUdGU19SRUFEX0ZJTEVfT1BTKGZoX3JlZyk7CiBERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMobWlzc2VkX2JlYWNvbik7Ci1ERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMocGxjcF9kZWx0YSk7CiBERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoZm9yY2VfcmVzZXQpOwogREVCVUdGU19SRUFEX0ZJTEVfT1BTKHJ4b25fZmxhZ3MpOwogREVCVUdGU19SRUFEX0ZJTEVfT1BTKHJ4b25fZmlsdGVyX2ZsYWdzKTsKQEAgLTE0MDMsNyArMTI1Myw2IEBACiAKIAlERUJVR0ZTX0FERF9GSUxFKG52bSwgZGlyX2RhdGEsIFNfSVJVU1IpOwogCURFQlVHRlNfQUREX0ZJTEUoc3JhbSwgZGlyX2RhdGEsIFNfSVdVU1IgfCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKGxvZ19ldmVudCwgZGlyX2RhdGEsIFNfSVdVU1IgfCBTX0lSVVNSKTsKIAlERUJVR0ZTX0FERF9GSUxFKHN0YXRpb25zLCBkaXJfZGF0YSwgU19JUlVTUik7CiAJREVCVUdGU19BRERfRklMRShjaGFubmVscywgZGlyX2RhdGEsIFNfSVJVU1IpOwogCURFQlVHRlNfQUREX0ZJTEUoc3RhdHVzLCBkaXJfZGF0YSwgU19JUlVTUik7CkBAIC0xNDIwLDcgKzEyNjksNiBAQAogCURFQlVHRlNfQUREX0ZJTEUoY2xlYXJfdHJhZmZpY19zdGF0aXN0aWNzLCBkaXJfZGVidWcsIFNfSVdVU1IpOwogCURFQlVHRlNfQUREX0ZJTEUoZmhfcmVnLCBkaXJfZGVidWcsIFNfSVJVU1IpOwogCURFQlVHRlNfQUREX0ZJTEUobWlzc2VkX2JlYWNvbiwgZGlyX2RlYnVnLCBTX0lXVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHBsY3BfZGVsdGEsIGRpcl9kZWJ1ZywgU19JV1VTUiB8IFNfSVJVU1IpOwogCURFQlVHRlNfQUREX0ZJTEUoZm9yY2VfcmVzZXQsIGRpcl9kZWJ1ZywgU19JV1VTUiB8IFNfSVJVU1IpOwogCURFQlVHRlNfQUREX0ZJTEUodWNvZGVfcnhfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CiAJREVCVUdGU19BRERfRklMRSh1Y29kZV90eF9zdGF0cywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKQEAgLTE0MzAsOCArMTI3OCw2IEBACiAJCURFQlVHRlNfQUREX0ZJTEUoc2Vuc2l0aXZpdHksIGRpcl9kZWJ1ZywgU19JUlVTUik7CiAJaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcikKIAkJREVCVUdGU19BRERfRklMRShjaGFpbl9ub2lzZSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+dWNvZGVfdHJhY2luZykKLQkJREVCVUdGU19BRERfRklMRSh1Y29kZV90cmFjaW5nLCBkaXJfZGVidWcsIFNfSVdVU1IgfCBTX0lSVVNSKTsKIAlERUJVR0ZTX0FERF9GSUxFKHJ4b25fZmxhZ3MsIGRpcl9kZWJ1ZywgU19JV1VTUik7CiAJREVCVUdGU19BRERfRklMRShyeG9uX2ZpbHRlcl9mbGFncywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKIAlERUJVR0ZTX0FERF9GSUxFKHdkX3RpbWVvdXQsIGRpcl9kZWJ1ZywgU19JV1VTUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2LmgKaW5kZXggYmUwMTA2Yy4uOWM3ODZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZXYuaApAQCAtMzIsNiArMzIsNyBAQAogI2lmbmRlZiBfX2l3bF9sZWdhY3lfZGV2X2hfXwogI2RlZmluZSBfX2l3bF9sZWdhY3lfZGV2X2hfXwogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+IC8qIGZvciBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KQEAgLTg1NSw0MyArODU2LDYgQEAKIH07CiAKIC8qCi0gKiBpd2xfc3dpdGNoX3J4b246ICJjaGFubmVsIHN3aXRjaCIgc3RydWN0dXJlCi0gKgotICogQCBzd2l0Y2hfaW5fcHJvZ3Jlc3M6IGNoYW5uZWwgc3dpdGNoIGluIHByb2dyZXNzCi0gKiBAIGNoYW5uZWw6IG5ldyBjaGFubmVsCi0gKi8KLXN0cnVjdCBpd2xfc3dpdGNoX3J4b24gewotCWJvb2wgc3dpdGNoX2luX3Byb2dyZXNzOwotCV9fbGUxNiBjaGFubmVsOwotfTsKLQotLyoKLSAqIHNjaGVkdWxlIHRoZSB0aW1lciB0byB3YWtlIHVwIGV2ZXJ5IFVDT0RFX1RSQUNFX1BFUklPRCBtaWxsaXNlY29uZHMKLSAqIHRvIHBlcmZvcm0gY29udGludW91cyB1Q29kZSBldmVudCBsb2dnaW5nIG9wZXJhdGlvbiBpZiBlbmFibGVkCi0gKi8KLSNkZWZpbmUgVUNPREVfVFJBQ0VfUEVSSU9EICgxMDApCi0KLS8qCi0gKiBpd2xfZXZlbnRfbG9nOiBjdXJyZW50IHVDb2RlIGV2ZW50IGxvZyBwb3NpdGlvbgotICoKLSAqIEB1Y29kZV90cmFjZTogZW5hYmxlL2Rpc2FibGUgdWNvZGUgY29udGludW91cyB0cmFjZSB0aW1lcgotICogQG51bV93cmFwczogaG93IG1hbnkgdGltZXMgdGhlIGV2ZW50IGJ1ZmZlciB3cmFwcwotICogQG5leHRfZW50cnk6ICB0aGUgZW50cnkganVzdCBiZWZvcmUgdGhlIG5leHQgb25lIHRoYXQgdUNvZGUgd291bGQgZmlsbAotICogQG5vbl93cmFwc19jb3VudDogY291bnRlciBmb3Igbm8gd3JhcCBkZXRlY3RlZCB3aGVuIGR1bXAgdWNvZGUgZXZlbnRzCi0gKiBAd3JhcHNfb25jZV9jb3VudDogY291bnRlciBmb3Igd3JhcCBvbmNlIGRldGVjdGVkIHdoZW4gZHVtcCB1Y29kZSBldmVudHMKLSAqIEB3cmFwc19tb3JlX2NvdW50OiBjb3VudGVyIGZvciB3cmFwIG1vcmUgdGhhbiBvbmNlIGRldGVjdGVkCi0gKgkJICAgICAgd2hlbiBkdW1wIHVjb2RlIGV2ZW50cwotICovCi1zdHJ1Y3QgaXdsX2V2ZW50X2xvZyB7Ci0JYm9vbCB1Y29kZV90cmFjZTsKLQl1MzIgbnVtX3dyYXBzOwotCXUzMiBuZXh0X2VudHJ5OwotCWludCBub25fd3JhcHNfY291bnQ7Ci0JaW50IHdyYXBzX29uY2VfY291bnQ7Ci0JaW50IHdyYXBzX21vcmVfY291bnQ7Ci19OwotCi0vKgogICogaG9zdCBpbnRlcnJ1cHQgdGltZW91dCB2YWx1ZQogICogdXNlZCB3aXRoIHNldHRpbmcgaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZXIKICAqIHRoZSBDU1JfSU5UX0NPQUxFU0NJTkcgaXMgYW4gOCBiaXQgcmVnaXN0ZXIgaW4gMzItdXNlYyB1bml0CkBAIC05MDYsMTggKzg3MCw2IEBACiAjZGVmaW5lIElXTF9IT1NUX0lOVF9DQUxJQl9USU1FT1VUX0RFRgkoMHgxMCkKICNkZWZpbmUgSVdMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfTUlOCSgweDApCiAKLS8qCi0gKiBUaGlzIGlzIHRoZSB0aHJlc2hvbGQgdmFsdWUgb2YgcGxjcCBlcnJvciByYXRlIHBlciAxMDBtU2Vjcy4gIEl0IGlzCi0gKiB1c2VkIHRvIHNldCBhbmQgY2hlY2sgZm9yIHRoZSB2YWxpZGl0eSBvZiBwbGNwX2RlbHRhLgotICovCi0jZGVmaW5lIElXTF9NQVhfUExDUF9FUlJfVEhSRVNIT0xEX01JTgkoMSkKLSNkZWZpbmUgSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfREVGCSg1MCkKLSNkZWZpbmUgSVdMX01BWF9QTENQX0VSUl9MT05HX1RIUkVTSE9MRF9ERUYJKDEwMCkKLSNkZWZpbmUgSVdMX01BWF9QTENQX0VSUl9FWFRfTE9OR19USFJFU0hPTERfREVGCSgyMDApCi0jZGVmaW5lIElXTF9NQVhfUExDUF9FUlJfVEhSRVNIT0xEX01BWAkoMjU1KQotI2RlZmluZSBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9ESVNBQkxFCSgwKQotCi0jZGVmaW5lIElXTF9ERUxBWV9ORVhUX0ZPUkNFX1JGX1JFU0VUICAoSFoqMykKICNkZWZpbmUgSVdMX0RFTEFZX05FWFRfRk9SQ0VfRldfUkVMT0FEIChIWio1KQogCiAvKiBUWCBxdWV1ZSB3YXRjaGRvZyB0aW1lb3V0cyBpbiBtU2VjcyAqLwpAQCAtOTI1LDEyICs4NzcsNiBAQAogI2RlZmluZSBJV0xfTE9OR19XRF9USU1FT1VUCSgxMDAwMCkKICNkZWZpbmUgSVdMX01BWF9XRF9USU1FT1VUCSgxMjAwMDApCiAKLWVudW0gaXdsX3Jlc2V0IHsKLQlJV0xfUkZfUkVTRVQgPSAwLAotCUlXTF9GV19SRVNFVCwKLQlJV0xfTUFYX0ZPUkNFX1JFU0VULAotfTsKLQogc3RydWN0IGl3bF9mb3JjZV9yZXNldCB7CiAJaW50IHJlc2V0X3JlcXVlc3RfY291bnQ7CiAJaW50IHJlc2V0X3N1Y2Nlc3NfY291bnQ7CkBAIC0xMDQzLDExICs5ODksOCBAQAogCS8qIHRyYWNrIElCU1MgbWFuYWdlciAobGFzdCBiZWFjb24pIHN0YXR1cyAqLwogCXUzMiBpYnNzX21hbmFnZXI7CiAKLQkvKiBzdG9yaW5nIHRoZSBqaWZmaWVzIHdoZW4gdGhlIHBsY3AgZXJyb3IgcmF0ZSBpcyByZWNlaXZlZCAqLwotCXVuc2lnbmVkIGxvbmcgcGxjcF9qaWZmaWVzOwotCiAJLyogZm9yY2UgcmVzZXQgKi8KLQlzdHJ1Y3QgaXdsX2ZvcmNlX3Jlc2V0IGZvcmNlX3Jlc2V0W0lXTF9NQVhfRk9SQ0VfUkVTRVRdOworCXN0cnVjdCBpd2xfZm9yY2VfcmVzZXQgZm9yY2VfcmVzZXQ7CiAKIAkvKiB3ZSBhbGxvY2F0ZSBhcnJheSBvZiBpd2xfY2hhbm5lbF9pbmZvIGZvciBOSUMncyB2YWxpZCBjaGFubmVscy4KIAkgKiAgICBBY2Nlc3MgdmlhIGNoYW5uZWwgIyB1c2luZyBpbmRpcmVjdCBpbmRleCBhcnJheSAqLwpAQCAtMTA2OCw3ICsxMDExLDYgQEAKIAllbnVtIGllZWU4MDIxMV9iYW5kIHNjYW5fYmFuZDsKIAlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcXVlc3Q7CiAJc3RydWN0IGllZWU4MDIxMV92aWYgKnNjYW5fdmlmOwotCWJvb2wgaXNfaW50ZXJuYWxfc2hvcnRfc2NhbjsKIAl1OCBzY2FuX3R4X2FudFtJRUVFODAyMTFfTlVNX0JBTkRTXTsKIAl1OCBtZ210X3R4X2FudDsKIApAQCAtMTExNSw3ICsxMDU3LDcgQEAKIAogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0IGNvbnRleHRzW05VTV9JV0xfUlhPTl9DVFhdOwogCi0Jc3RydWN0IGl3bF9zd2l0Y2hfcnhvbiBzd2l0Y2hfcnhvbjsKKwlfX2xlMTYgc3dpdGNoX2NoYW5uZWw7CiAKIAkvKiAxc3QgcmVzcG9uc2VzIGZyb20gaW5pdGlhbGl6ZSBhbmQgcnVudGltZSB1Q29kZSBpbWFnZXMuCiAJICogXzQ5NjUncyBpbml0aWFsaXplIGFsaXZlIHJlc3BvbnNlIGNvbnRhaW5zIHNvbWUgY2FsaWJyYXRpb24gZGF0YS4gKi8KQEAgLTEyMjMsMTIgKzExNjUsNiBAQAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfSVdMNDk2NSkgfHwgZGVmaW5lZChDT05GSUdfSVdMNDk2NV9NT0RVTEUpCiAJCXN0cnVjdCB7Ci0JCQkvKgotCQkJICogcmVwb3J0aW5nIHRoZSBudW1iZXIgb2YgdGlkcyBoYXMgQUdHIG9uLiAwIG1lYW5zCi0JCQkgKiBubyBBR0dSRUdBVElPTgotCQkJICovCi0JCQl1OCBhZ2dfdGlkc19jb3VudDsKLQogCQkJc3RydWN0IGl3bF9yeF9waHlfcmVzIGxhc3RfcGh5X3JlczsKIAkJCWJvb2wgbGFzdF9waHlfcmVzX3ZhbGlkOwogCkBAIC0xMjY3LDcgKzEyMDMsNiBAQAogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpiZWFjb25fY3R4OwogCXN0cnVjdCBza19idWZmICpiZWFjb25fc2tiOwogCi0Jc3RydWN0IHdvcmtfc3RydWN0IHN0YXJ0X2ludGVybmFsX3NjYW47CiAJc3RydWN0IHdvcmtfc3RydWN0IHR4X2ZsdXNoOwogCiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV90YXNrbGV0OwpAQCAtMTMwNCwxMiArMTIzOSw5IEBACiAJdTMyIGRpc2FibGVfdHhfcG93ZXJfY2FsOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBydW5fdGltZV9jYWxpYl93b3JrOwogCXN0cnVjdCB0aW1lcl9saXN0IHN0YXRpc3RpY3NfcGVyaW9kaWM7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgdWNvZGVfdHJhY2U7CiAJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2c7CiAJYm9vbCBod19yZWFkeTsKIAotCXN0cnVjdCBpd2xfZXZlbnRfbG9nIGV2ZW50X2xvZzsKLQogCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkOwogCXVuc2lnbmVkIGxvbmcgYmxpbmtfb24sIGJsaW5rX29mZjsKIAlib29sIGxlZF9yZWdpc3RlcmVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldnRyYWNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuYwppbmRleCAwODBiODUyLi5hY2VjOTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuYwpAQCAtMzgsOCArMzgsNSBAQAogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfbGVnYWN5X2Rldl9pb3dyaXRlMzIpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfbGVnYWN5X2Rldl9yeCk7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9sZWdhY3lfZGV2X3R4KTsKLUVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2xlZ2FjeV9kZXZfdWNvZGVfZXZlbnQpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfbGVnYWN5X2Rldl91Y29kZV9lcnJvcik7Ci1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9sZWdhY3lfZGV2X3Vjb2RlX2NvbnRfZXZlbnQpOwotRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfbGVnYWN5X2Rldl91Y29kZV93cmFwX2V2ZW50KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldnRyYWNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuaAppbmRleCA5NjEyYWEwLi5hNDQzNzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuaApAQCAtOTYsNDcgKzk2LDYgQEAKICN1bmRlZiBUUkFDRV9TWVNURU0KICNkZWZpbmUgVFJBQ0VfU1lTVEVNIGl3bHdpZmlfbGVnYWN5X3Vjb2RlCiAKLVRSQUNFX0VWRU5UKGl3bHdpZmlfbGVnYWN5X2Rldl91Y29kZV9jb250X2V2ZW50LAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHRpbWUsIHUzMiBkYXRhLCB1MzIgZXYpLAotCVRQX0FSR1MocHJpdiwgdGltZSwgZGF0YSwgZXYpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCVBSSVZfRU5UUlkKLQotCQlfX2ZpZWxkKHUzMiwgdGltZSkKLQkJX19maWVsZCh1MzIsIGRhdGEpCi0JCV9fZmllbGQodTMyLCBldikKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlQUklWX0FTU0lHTjsKLQkJX19lbnRyeS0+dGltZSA9IHRpbWU7Ci0JCV9fZW50cnktPmRhdGEgPSBkYXRhOwotCQlfX2VudHJ5LT5ldiA9IGV2OwotCSksCi0JVFBfcHJpbnRrKCJbJXBdIEVWVF9MT0dUOiUwMTB1OjB4JTA4eDolMDR1IiwKLQkJICBfX2VudHJ5LT5wcml2LCBfX2VudHJ5LT50aW1lLCBfX2VudHJ5LT5kYXRhLCBfX2VudHJ5LT5ldikKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfbGVnYWN5X2Rldl91Y29kZV93cmFwX2V2ZW50LAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHdyYXBzLCB1MzIgbl9lbnRyeSwgdTMyIHBfZW50cnkpLAotCVRQX0FSR1MocHJpdiwgd3JhcHMsIG5fZW50cnksIHBfZW50cnkpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCVBSSVZfRU5UUlkKLQotCQlfX2ZpZWxkKHUzMiwgd3JhcHMpCi0JCV9fZmllbGQodTMyLCBuX2VudHJ5KQotCQlfX2ZpZWxkKHUzMiwgcF9lbnRyeSkKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlQUklWX0FTU0lHTjsKLQkJX19lbnRyeS0+d3JhcHMgPSB3cmFwczsKLQkJX19lbnRyeS0+bl9lbnRyeSA9IG5fZW50cnk7Ci0JCV9fZW50cnktPnBfZW50cnkgPSBwX2VudHJ5OwotCSksCi0JVFBfcHJpbnRrKCJbJXBdIHdyYXBzPSMlMDJkIG49MHglWCBwPTB4JVgiLAotCQkgIF9fZW50cnktPnByaXYsIF9fZW50cnktPndyYXBzLCBfX2VudHJ5LT5uX2VudHJ5LAotCQkgIF9fZW50cnktPnBfZW50cnkpCi0pOwotCiAjdW5kZWYgVFJBQ0VfU1lTVEVNCiAjZGVmaW5lIFRSQUNFX1NZU1RFTSBpd2x3aWZpCiAKQEAgLTI0MiwyNSArMjAxLDYgQEAKIAkJICBfX2VudHJ5LT5ibGluazIsIF9fZW50cnktPmlsaW5rMSwgX19lbnRyeS0+aWxpbmsyKQogKTsKIAotVFJBQ0VfRVZFTlQoaXdsd2lmaV9sZWdhY3lfZGV2X3Vjb2RlX2V2ZW50LAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHRpbWUsIHUzMiBkYXRhLCB1MzIgZXYpLAotCVRQX0FSR1MocHJpdiwgdGltZSwgZGF0YSwgZXYpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCVBSSVZfRU5UUlkKLQotCQlfX2ZpZWxkKHUzMiwgdGltZSkKLQkJX19maWVsZCh1MzIsIGRhdGEpCi0JCV9fZmllbGQodTMyLCBldikKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlQUklWX0FTU0lHTjsKLQkJX19lbnRyeS0+dGltZSA9IHRpbWU7Ci0JCV9fZW50cnktPmRhdGEgPSBkYXRhOwotCQlfX2VudHJ5LT5ldiA9IGV2OwotCSksCi0JVFBfcHJpbnRrKCJbJXBdIEVWVF9MT0dUOiUwMTB1OjB4JTA4eDolMDR1IiwKLQkJICBfX2VudHJ5LT5wcml2LCBfX2VudHJ5LT50aW1lLCBfX2VudHJ5LT5kYXRhLCBfX2VudHJ5LT5ldikKLSk7CiAjZW5kaWYgLyogX19JV0xXSUZJX0RFVklDRV9UUkFDRSAqLwogCiAjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZWVwcm9tLmMKaW5kZXggY2IzNDZkMS4uNWJmM2Y0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWVlcHJvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1lZXByb20uYwpAQCAtMzE2LDcgKzMxNiw2IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwotCQlyZXR1cm47CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtaGVscGVycy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWhlbHBlcnMuaAppbmRleCBhNmVmZmRhLi41Y2YyM2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtaGVscGVycy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1oZWxwZXJzLmgKQEAgLTEzMiw3ICsxMzIsMTYgQEAKIAkJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKHByaXYtPmh3LCBhYyk7CiB9CiAKKyNpZmRlZiBpZWVlODAyMTFfc3RvcF9xdWV1ZQorI3VuZGVmIGllZWU4MDIxMV9zdG9wX3F1ZXVlCisjZW5kaWYKKwogI2RlZmluZSBpZWVlODAyMTFfc3RvcF9xdWV1ZSBET19OT1RfVVNFX2llZWU4MDIxMV9zdG9wX3F1ZXVlCisKKyNpZmRlZiBpZWVlODAyMTFfd2FrZV9xdWV1ZQorI3VuZGVmIGllZWU4MDIxMV93YWtlX3F1ZXVlCisjZW5kaWYKKwogI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZSBET19OT1RfVVNFX2llZWU4MDIxMV93YWtlX3F1ZXVlCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1yeC5jCmluZGV4IDY1NGNmMjMuLjliNWQwYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1yeC5jCkBAIC0yMjcsMjcgKzIyNyw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcnhfc3BlY3RydW1fbWVhc3VyZV9ub3RpZik7CiAKLXZvaWQgaXdsX2xlZ2FjeV9yZWNvdmVyX2Zyb21fc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkKLXsKLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQlpZiAoaXdsX2xlZ2FjeV9pc19hbnlfYXNzb2NpYXRlZChwcml2KSkgewotCQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+Y2hlY2tfcGxjcF9oZWFsdGgpIHsKLQkJCWlmICghcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+Y2hlY2tfcGxjcF9oZWFsdGgoCi0JCQkgICAgcHJpdiwgcGt0KSkgewotCQkJCS8qCi0JCQkJICogaGlnaCBwbGNwIGVycm9yIGRldGVjdGVkCi0JCQkJICogcmVzZXQgUmFkaW8KLQkJCQkgKi8KLQkJCQlpd2xfbGVnYWN5X2ZvcmNlX3Jlc2V0KHByaXYsCi0JCQkJCQkJSVdMX1JGX1JFU0VULCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcmVjb3Zlcl9mcm9tX3N0YXRpc3RpY3MpOwotCiAvKgogICogcmV0dXJucyBub24temVybyBpZiBwYWNrZXQgc2hvdWxkIGJlIGRyb3BwZWQKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXNjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zY2FuLmMKaW5kZXggMzUzMjM0YS4uYTZiNTIyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXNjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc2Nhbi5jCkBAIC0xMDEsNyArMTAxLDYgQEAKIAkJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKHByaXYtPmh3LCBhYm9ydGVkKTsKIAl9CiAKLQlwcml2LT5pc19pbnRlcm5hbF9zaG9ydF9zY2FuID0gZmFsc2U7CiAJcHJpdi0+c2Nhbl92aWYgPSBOVUxMOwogCXByaXYtPnNjYW5fcmVxdWVzdCA9IE5VTEw7CiB9CkBAIC0zMjksMTAgKzMyOCw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfaW5pdF9zY2FuX3BhcmFtcyk7CiAKLXN0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGl3bF9sZWdhY3lfc2Nhbl9pbml0aWF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkJICBib29sIGludGVybmFsLAotCQkJCQkgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3N0YXRpYyBpbnQgaXdsX2xlZ2FjeV9zY2FuX2luaXRpYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKIAlpbnQgcmV0OwogCkBAIC0zNTksMTggKzM1NiwxNCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTdGFydGluZyAlc3NjYW4uLi5cbiIsCi0JCQlpbnRlcm5hbCA/ICJpbnRlcm5hbCBzaG9ydCAiIDogIiIpOworCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTdGFydGluZyBzY2FuLi4uXG4iKTsKIAogCXNldF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKTsKLQlwcml2LT5pc19pbnRlcm5hbF9zaG9ydF9zY2FuID0gaW50ZXJuYWw7CiAJcHJpdi0+c2Nhbl9zdGFydCA9IGppZmZpZXM7Ci0JcHJpdi0+c2Nhbl9iYW5kID0gYmFuZDsKIAogCXJldCA9IHByaXYtPmNmZy0+b3BzLT51dGlscy0+cmVxdWVzdF9zY2FuKHByaXYsIHZpZik7CiAJaWYgKHJldCkgewogCQljbGVhcl9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKTsKLQkJcHJpdi0+aXNfaW50ZXJuYWxfc2hvcnRfc2NhbiA9IGZhbHNlOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMzk0LDggKzM4Nyw3IEBACiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CiAKLQlpZiAodGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSAmJgotCSAgICAhcHJpdi0+aXNfaW50ZXJuYWxfc2hvcnRfc2NhbikgeworCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKSB7CiAJCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FuIGFscmVhZHkgaW4gcHJvZ3Jlc3MuXG4iKTsKIAkJcmV0ID0gLUVBR0FJTjsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtNDA0LDE3ICszOTYsOSBAQAogCS8qIG1hYzgwMjExIHdpbGwgb25seSBhc2sgZm9yIG9uZSBiYW5kIGF0IGEgdGltZSAqLwogCXByaXYtPnNjYW5fcmVxdWVzdCA9IHJlcTsKIAlwcml2LT5zY2FuX3ZpZiA9IHZpZjsKKwlwcml2LT5zY2FuX2JhbmQgPSByZXEtPmNoYW5uZWxzWzBdLT5iYW5kOwogCi0JLyoKLQkgKiBJZiBhbiBpbnRlcm5hbCBzY2FuIGlzIGluIHByb2dyZXNzLCBqdXN0IHNldAotCSAqIHVwIHRoZSBzY2FuX3JlcXVlc3QgYXMgcGVyIGFib3ZlLgotCSAqLwotCWlmIChwcml2LT5pc19pbnRlcm5hbF9zaG9ydF9zY2FuKSB7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTQ0FOIHJlcXVlc3QgZHVyaW5nIGludGVybmFsIHNjYW5cbiIpOwotCQlyZXQgPSAwOwotCX0gZWxzZQotCQlyZXQgPSBpd2xfbGVnYWN5X3NjYW5faW5pdGlhdGUocHJpdiwgdmlmLCBmYWxzZSwKLQkJCQkJcmVxLT5jaGFubmVsc1swXS0+YmFuZCk7CisJcmV0ID0gaXdsX2xlZ2FjeV9zY2FuX2luaXRpYXRlKHByaXYsIHZpZik7CiAKIAlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKIApAQCAtNDI1LDQwICs0MDksNiBAQAogfQogRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X21hY19od19zY2FuKTsKIAotLyoKLSAqIGludGVybmFsIHNob3J0IHNjYW4sIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmVlbiBjYWxsZWQgd2hpbGUgYXNzb2NpYXRlZC4KLSAqIEl0IHdpbGwgcmVzZXQgYW5kIHR1bmUgdGhlIHJhZGlvIHRvIHByZXZlbnQgcG9zc2libGUgUkYgcmVsYXRlZCBwcm9ibGVtCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV9pbnRlcm5hbF9zaG9ydF9od19zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnN0YXJ0X2ludGVybmFsX3NjYW4pOwotfQotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2JnX3N0YXJ0X2ludGVybmFsX3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsIHN0YXJ0X2ludGVybmFsX3NjYW4pOwotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlN0YXJ0IGludGVybmFsIHNjYW5cbiIpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHByaXYtPmlzX2ludGVybmFsX3Nob3J0X3NjYW4gPT0gdHJ1ZSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiSW50ZXJuYWwgc2NhbiBhbHJlYWR5IGluIHByb2dyZXNzXG4iKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gYWxyZWFkeSBpbiBwcm9ncmVzcy5cbiIpOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQlpZiAoaXdsX2xlZ2FjeV9zY2FuX2luaXRpYXRlKHByaXYsIE5VTEwsIHRydWUsIHByaXYtPmJhbmQpKQotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiZmFpbGVkIHRvIHN0YXJ0IGludGVybmFsIHNob3J0IHNjYW5cbiIpOwotIHVubG9jazoKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLX0KLQogc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9iZ19zY2FuX2NoZWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPQpAQCAtNTQyLDggKzQ5Miw3IEBACiAJICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsIHNjYW5fY29tcGxldGVkKTsKIAlib29sIGFib3J0ZWQ7CiAKLQlJV0xfREVCVUdfU0NBTihwcml2LCAiQ29tcGxldGVkICVzc2Nhbi5cbiIsCi0JCSAgICAgICBwcml2LT5pc19pbnRlcm5hbF9zaG9ydF9zY2FuID8gImludGVybmFsIHNob3J0ICIgOiAiIik7CisJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIkNvbXBsZXRlZCBzY2FuLlxuIik7CiAKIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5zY2FuX2NoZWNrKTsKIApAQCAtNTU4LDI3ICs1MDcsNiBAQAogCQlnb3RvIG91dF9zZXR0aW5nczsKIAl9CiAKLQlpZiAocHJpdi0+aXNfaW50ZXJuYWxfc2hvcnRfc2NhbiAmJiAhYWJvcnRlZCkgewotCQlpbnQgZXJyOwotCi0JCS8qIENoZWNrIGlmIG1hYzgwMjExIHJlcXVlc3RlZCBzY2FuIGR1cmluZyBvdXIgaW50ZXJuYWwgc2NhbiAqLwotCQlpZiAocHJpdi0+c2Nhbl9yZXF1ZXN0ID09IE5VTEwpCi0JCQlnb3RvIG91dF9jb21wbGV0ZTsKLQotCQkvKiBJZiBzbyByZXF1ZXN0IGEgbmV3IHNjYW4gKi8KLQkJZXJyID0gaXdsX2xlZ2FjeV9zY2FuX2luaXRpYXRlKHByaXYsIHByaXYtPnNjYW5fdmlmLCBmYWxzZSwKLQkJCQkJcHJpdi0+c2Nhbl9yZXF1ZXN0LT5jaGFubmVsc1swXS0+YmFuZCk7Ci0JCWlmIChlcnIpIHsKLQkJCUlXTF9ERUJVR19TQ0FOKHByaXYsCi0JCQkJImZhaWxlZCB0byBpbml0aWF0ZSBwZW5kaW5nIHNjYW46ICVkXG4iLCBlcnIpOwotCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQlnb3RvIG91dF9jb21wbGV0ZTsKLQkJfQotCi0JCWdvdG8gb3V0OwotCX0KLQotb3V0X2NvbXBsZXRlOgogCWl3bF9sZWdhY3lfY29tcGxldGVfc2Nhbihwcml2LCBhYm9ydGVkKTsKIAogb3V0X3NldHRpbmdzOgpAQCAtNTkwLDggKzUxOCw3IEBACiAJICogV2UgZG8gbm90IGNvbW1pdCBwb3dlciBzZXR0aW5ncyB3aGlsZSBzY2FuIGlzIHBlbmRpbmcsCiAJICogZG8gaXQgbm93IGlmIHRoZSBzZXR0aW5ncyBjaGFuZ2VkLgogCSAqLwotCWl3bF9sZWdhY3lfcG93ZXJfc2V0X21vZGUocHJpdiwgJnByaXYtPnBvd2VyX2RhdGEuc2xlZXBfY21kX25leHQsCi0JCQkJCQkJCWZhbHNlKTsKKwlpd2xfbGVnYWN5X3Bvd2VyX3NldF9tb2RlKHByaXYsICZwcml2LT5wb3dlcl9kYXRhLnNsZWVwX2NtZF9uZXh0LCBmYWxzZSk7CiAJaXdsX2xlZ2FjeV9zZXRfdHhfcG93ZXIocHJpdiwgcHJpdi0+dHhfcG93ZXJfbmV4dCwgZmFsc2UpOwogCiAJcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5wb3N0X3NjYW4ocHJpdik7CkBAIC02MDQsMTUgKzUzMSwxMiBAQAogewogCUlOSVRfV09SSygmcHJpdi0+c2Nhbl9jb21wbGV0ZWQsIGl3bF9sZWdhY3lfYmdfc2Nhbl9jb21wbGV0ZWQpOwogCUlOSVRfV09SSygmcHJpdi0+YWJvcnRfc2NhbiwgaXdsX2xlZ2FjeV9iZ19hYm9ydF9zY2FuKTsKLQlJTklUX1dPUksoJnByaXYtPnN0YXJ0X2ludGVybmFsX3NjYW4sCi0JCQkJaXdsX2xlZ2FjeV9iZ19zdGFydF9pbnRlcm5hbF9zY2FuKTsKIAlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+c2Nhbl9jaGVjaywgaXdsX2xlZ2FjeV9iZ19zY2FuX2NoZWNrKTsKIH0KIEVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXR1cF9zY2FuX2RlZmVycmVkX3dvcmspOwogCiB2b2lkIGl3bF9sZWdhY3lfY2FuY2VsX3NjYW5fZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+c3RhcnRfaW50ZXJuYWxfc2Nhbik7CiAJY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+YWJvcnRfc2Nhbik7CiAJY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+c2Nhbl9jb21wbGV0ZWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wzOTQ1LWJhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDM5NDUtYmFzZS5jCmluZGV4IDBlZTZiZTYuLjc5NTgyNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDM5NDUtYmFzZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDM5NDUtYmFzZS5jCkBAIC0xNDA5LDIxMiArMTQwOSw2IEBACiAJfQogfQogCi0jZGVmaW5lIEVWRU5UX1NUQVJUX09GRlNFVCAgKDYgKiBzaXplb2YodTMyKSkKLQotLyoqCi0gKiBpd2wzOTQ1X3ByaW50X2V2ZW50X2xvZyAtIER1bXAgZXJyb3IgZXZlbnQgbG9nIHRvIHN5c2xvZwotICoKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3ByaW50X2V2ZW50X2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBzdGFydF9pZHgsCi0JCQkJICB1MzIgbnVtX2V2ZW50cywgdTMyIG1vZGUsCi0JCQkJICBpbnQgcG9zLCBjaGFyICoqYnVmLCBzaXplX3QgYnVmc3opCi17Ci0JdTMyIGk7Ci0JdTMyIGJhc2U7ICAgICAgIC8qIFNSQU0gYnl0ZSBhZGRyZXNzIG9mIGV2ZW50IGxvZyBoZWFkZXIgKi8KLQl1MzIgZXZlbnRfc2l6ZTsJLyogMiB1MzJzLCBvciAzIHUzMnMgaWYgdGltZXN0YW1wIHJlY29yZGVkICovCi0JdTMyIHB0cjsgICAgICAgIC8qIFNSQU0gYnl0ZSBhZGRyZXNzIG9mIGxvZyBkYXRhICovCi0JdTMyIGV2LCB0aW1lLCBkYXRhOyAvKiBldmVudCBsb2cgZGF0YSAqLwotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0JaWYgKG51bV9ldmVudHMgPT0gMCkKLQkJcmV0dXJuIHBvczsKLQotCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlLmxvZ19ldmVudF90YWJsZV9wdHIpOwotCi0JaWYgKG1vZGUgPT0gMCkKLQkJZXZlbnRfc2l6ZSA9IDIgKiBzaXplb2YodTMyKTsKLQllbHNlCi0JCWV2ZW50X3NpemUgPSAzICogc2l6ZW9mKHUzMik7Ci0KLQlwdHIgPSBiYXNlICsgRVZFTlRfU1RBUlRfT0ZGU0VUICsgKHN0YXJ0X2lkeCAqIGV2ZW50X3NpemUpOwotCi0JLyogTWFrZSBzdXJlIGRldmljZSBpcyBwb3dlcmVkIHVwIGZvciBTUkFNIHJlYWRzICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWl3bF9ncmFiX25pY19hY2Nlc3MocHJpdik7Ci0KLQkvKiBTZXQgc3RhcnRpbmcgYWRkcmVzczsgcmVhZHMgd2lsbCBhdXRvLWluY3JlbWVudCAqLwotCV9pd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkFERFIsIHB0cik7Ci0Jcm1iKCk7Ci0KLQkvKiAidGltZSIgaXMgYWN0dWFsbHkgImRhdGEiIGZvciBtb2RlIDAgKG5vIHRpbWVzdGFtcCkuCi0JICogcGxhY2UgZXZlbnQgaWQgIyBhdCBmYXIgcmlnaHQgZm9yIGVhc2llciB2aXN1YWwgcGFyc2luZy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2V2ZW50czsgaSsrKSB7Ci0JCWV2ID0gX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JEQVQpOwotCQl0aW1lID0gX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JEQVQpOwotCQlpZiAobW9kZSA9PSAwKSB7Ci0JCQkvKiBkYXRhLCBldiAqLwotCQkJaWYgKGJ1ZnN6KSB7Ci0JCQkJcG9zICs9IHNjbnByaW50ZigqYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkJCSIweCUwOHg6JTA0dVxuIiwKLQkJCQkJCXRpbWUsIGV2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVdMX0VSUihwcml2LCAiMHglMDh4XHQlMDR1XG4iLCB0aW1lLCBldik7Ci0JCQkJdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X3Vjb2RlX2V2ZW50KHByaXYsIDAsCi0JCQkJCQkJICAgICAgdGltZSwgZXYpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZGF0YSA9IF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwKLQkJCQkJCQlIQlVTX1RBUkdfTUVNX1JEQVQpOwotCQkJaWYgKGJ1ZnN6KSB7Ci0JCQkJcG9zICs9IHNjbnByaW50ZigqYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkJCSIlMDEwdToweCUwOHg6JTA0dVxuIiwKLQkJCQkJCSB0aW1lLCBkYXRhLCBldik7Ci0JCQl9IGVsc2UgewotCQkJCUlXTF9FUlIocHJpdiwgIiUwMTB1XHQweCUwOHhcdCUwNHVcbiIsCi0JCQkJCXRpbWUsIGRhdGEsIGV2KTsKLQkJCQl0cmFjZV9pd2x3aWZpX2xlZ2FjeV9kZXZfdWNvZGVfZXZlbnQocHJpdiwgdGltZSwKLQkJCQkJCQkgICAgICBkYXRhLCBldik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBBbGxvdyBkZXZpY2UgdG8gcG93ZXIgZG93biAqLwotCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JcmV0dXJuIHBvczsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3ByaW50X2xhc3RfZXZlbnRfbG9ncyAtIER1bXAgdGhlIG5ld2VzdCAjIG9mIGV2ZW50IGxvZyB0byBzeXNsb2cKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3ByaW50X2xhc3RfZXZlbnRfbG9ncyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBjYXBhY2l0eSwKLQkJCQkgICAgICB1MzIgbnVtX3dyYXBzLCB1MzIgbmV4dF9lbnRyeSwKLQkJCQkgICAgICB1MzIgc2l6ZSwgdTMyIG1vZGUsCi0JCQkJICAgICAgaW50IHBvcywgY2hhciAqKmJ1Ziwgc2l6ZV90IGJ1ZnN6KQotewotCS8qCi0JICogZGlzcGxheSB0aGUgbmV3ZXN0IERFRkFVTFRfTE9HX0VOVFJJRVMgZW50cmllcwotCSAqIGkuZSB0aGUgZW50cmllcyBqdXN0IGJlZm9yZSB0aGUgbmV4dCBvbnQgdGhhdCB1Q29kZSB3b3VsZCBmaWxsLgotCSAqLwotCWlmIChudW1fd3JhcHMpIHsKLQkJaWYgKG5leHRfZW50cnkgPCBzaXplKSB7Ci0JCQlwb3MgPSBpd2wzOTQ1X3ByaW50X2V2ZW50X2xvZyhwcml2LAotCQkJCQkgICAgIGNhcGFjaXR5IC0gKHNpemUgLSBuZXh0X2VudHJ5KSwKLQkJCQkJICAgICBzaXplIC0gbmV4dF9lbnRyeSwgbW9kZSwKLQkJCQkJICAgICBwb3MsIGJ1ZiwgYnVmc3opOwotCQkJcG9zID0gaXdsMzk0NV9wcmludF9ldmVudF9sb2cocHJpdiwgMCwKLQkJCQkJCSAgICAgIG5leHRfZW50cnksIG1vZGUsCi0JCQkJCQkgICAgICBwb3MsIGJ1ZiwgYnVmc3opOwotCQl9IGVsc2UKLQkJCXBvcyA9IGl3bDM5NDVfcHJpbnRfZXZlbnRfbG9nKHByaXYsIG5leHRfZW50cnkgLSBzaXplLAotCQkJCQkJICAgICAgc2l6ZSwgbW9kZSwKLQkJCQkJCSAgICAgIHBvcywgYnVmLCBidWZzeik7Ci0JfSBlbHNlIHsKLQkJaWYgKG5leHRfZW50cnkgPCBzaXplKQotCQkJcG9zID0gaXdsMzk0NV9wcmludF9ldmVudF9sb2cocHJpdiwgMCwKLQkJCQkJCSAgICAgIG5leHRfZW50cnksIG1vZGUsCi0JCQkJCQkgICAgICBwb3MsIGJ1ZiwgYnVmc3opOwotCQllbHNlCi0JCQlwb3MgPSBpd2wzOTQ1X3ByaW50X2V2ZW50X2xvZyhwcml2LCBuZXh0X2VudHJ5IC0gc2l6ZSwKLQkJCQkJCSAgICAgIHNpemUsIG1vZGUsCi0JCQkJCQkgICAgICBwb3MsIGJ1ZiwgYnVmc3opOwotCX0KLQlyZXR1cm4gcG9zOwotfQotCi0jZGVmaW5lIERFRkFVTFRfSVdMMzk0NV9EVU1QX0VWRU5UX0xPR19FTlRSSUVTICgyMCkKLQotaW50IGl3bDM5NDVfZHVtcF9uaWNfZXZlbnRfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBmdWxsX2xvZywKLQkJCSAgICBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpCi17Ci0JdTMyIGJhc2U7ICAgICAgIC8qIFNSQU0gYnl0ZSBhZGRyZXNzIG9mIGV2ZW50IGxvZyBoZWFkZXIgKi8KLQl1MzIgY2FwYWNpdHk7ICAgLyogZXZlbnQgbG9nIGNhcGFjaXR5IGluICMgZW50cmllcyAqLwotCXUzMiBtb2RlOyAgICAgICAvKiAwIC0gbm8gdGltZXN0YW1wLCAxIC0gdGltZXN0YW1wIHJlY29yZGVkICovCi0JdTMyIG51bV93cmFwczsgIC8qICMgdGltZXMgdUNvZGUgd3JhcHBlZCB0byB0b3Agb2YgbG9nICovCi0JdTMyIG5leHRfZW50cnk7IC8qIGluZGV4IG9mIG5leHQgZW50cnkgdG8gYmUgd3JpdHRlbiBieSB1Q29kZSAqLwotCXUzMiBzaXplOyAgICAgICAvKiAjIGVudHJpZXMgdGhhdCB3ZSdsbCBwcmludCAqLwotCWludCBwb3MgPSAwOwotCXNpemVfdCBidWZzeiA9IDA7Ci0KLQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZS5sb2dfZXZlbnRfdGFibGVfcHRyKTsKLQlpZiAoIWl3bDM5NDVfaHdfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgewotCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIGV2ZW50IGxvZyBwb2ludGVyIDB4JTA4WFxuIiwgYmFzZSk7Ci0JCXJldHVybiAgLUVJTlZBTDsKLQl9Ci0KLQkvKiBldmVudCBsb2cgaGVhZGVyICovCi0JY2FwYWNpdHkgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSk7Ci0JbW9kZSA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgKDEgKiBzaXplb2YodTMyKSkpOwotCW51bV93cmFwcyA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgKDIgKiBzaXplb2YodTMyKSkpOwotCW5leHRfZW50cnkgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArICgzICogc2l6ZW9mKHUzMikpKTsKLQotCWlmIChjYXBhY2l0eSA+IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm1heF9ldmVudF9sb2dfc2l6ZSkgewotCQlJV0xfRVJSKHByaXYsICJMb2cgY2FwYWNpdHkgJWQgaXMgYm9ndXMsIGxpbWl0IHRvICVkIGVudHJpZXNcbiIsCi0JCQljYXBhY2l0eSwgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bWF4X2V2ZW50X2xvZ19zaXplKTsKLQkJY2FwYWNpdHkgPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5tYXhfZXZlbnRfbG9nX3NpemU7Ci0JfQotCi0JaWYgKG5leHRfZW50cnkgPiBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5tYXhfZXZlbnRfbG9nX3NpemUpIHsKLQkJSVdMX0VSUihwcml2LCAiTG9nIHdyaXRlIGluZGV4ICVkIGlzIGJvZ3VzLCBsaW1pdCB0byAlZFxuIiwKLQkJCW5leHRfZW50cnksIHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm1heF9ldmVudF9sb2dfc2l6ZSk7Ci0JCW5leHRfZW50cnkgPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5tYXhfZXZlbnRfbG9nX3NpemU7Ci0JfQotCi0Jc2l6ZSA9IG51bV93cmFwcyA/IGNhcGFjaXR5IDogbmV4dF9lbnRyeTsKLQotCS8qIGJhaWwgb3V0IGlmIG5vdGhpbmcgaW4gbG9nICovCi0JaWYgKHNpemUgPT0gMCkgewotCQlJV0xfRVJSKHByaXYsICJTdGFydCBJV0wgRXZlbnQgTG9nIER1bXA6IG5vdGhpbmcgaW4gbG9nXG4iKTsKLQkJcmV0dXJuIHBvczsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoIShpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIElXTF9ETF9GV19FUlJPUlMpICYmICFmdWxsX2xvZykKLQkJc2l6ZSA9IChzaXplID4gREVGQVVMVF9JV0wzOTQ1X0RVTVBfRVZFTlRfTE9HX0VOVFJJRVMpCi0JCQk/IERFRkFVTFRfSVdMMzk0NV9EVU1QX0VWRU5UX0xPR19FTlRSSUVTIDogc2l6ZTsKLSNlbHNlCi0Jc2l6ZSA9IChzaXplID4gREVGQVVMVF9JV0wzOTQ1X0RVTVBfRVZFTlRfTE9HX0VOVFJJRVMpCi0JCT8gREVGQVVMVF9JV0wzOTQ1X0RVTVBfRVZFTlRfTE9HX0VOVFJJRVMgOiBzaXplOwotI2VuZGlmCi0KLQlJV0xfRVJSKHByaXYsICJTdGFydCBJV0wgRXZlbnQgTG9nIER1bXA6IGRpc3BsYXkgbGFzdCAlZCBjb3VudFxuIiwKLQkJICBzaXplKTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCWlmIChkaXNwbGF5KSB7Ci0JCWlmIChmdWxsX2xvZykKLQkJCWJ1ZnN6ID0gY2FwYWNpdHkgKiA0ODsKLQkJZWxzZQotCQkJYnVmc3ogPSBzaXplICogNDg7Ci0JCSpidWYgPSBrbWFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCEqYnVmKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWlmICgoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiBJV0xfRExfRldfRVJST1JTKSB8fCBmdWxsX2xvZykgewotCQkvKiBpZiB1Q29kZSBoYXMgd3JhcHBlZCBiYWNrIHRvIHRvcCBvZiBsb2csCi0JCSAqIHN0YXJ0IGF0IHRoZSBvbGRlc3QgZW50cnksCi0JCSAqIGkuZSB0aGUgbmV4dCBvbmUgdGhhdCB1Q29kZSB3b3VsZCBmaWxsLgotCQkgKi8KLQkJaWYgKG51bV93cmFwcykKLQkJCXBvcyA9IGl3bDM5NDVfcHJpbnRfZXZlbnRfbG9nKHByaXYsIG5leHRfZW50cnksCi0JCQkJCQljYXBhY2l0eSAtIG5leHRfZW50cnksIG1vZGUsCi0JCQkJCQlwb3MsIGJ1ZiwgYnVmc3opOwotCi0JCS8qICh0aGVuL2Vsc2UpIHN0YXJ0IGF0IHRvcCBvZiBsb2cgKi8KLQkJcG9zID0gaXdsMzk0NV9wcmludF9ldmVudF9sb2cocHJpdiwgMCwgbmV4dF9lbnRyeSwgbW9kZSwKLQkJCQkJICAgICAgcG9zLCBidWYsIGJ1ZnN6KTsKLQl9IGVsc2UKLQkJcG9zID0gaXdsMzk0NV9wcmludF9sYXN0X2V2ZW50X2xvZ3MocHJpdiwgY2FwYWNpdHksIG51bV93cmFwcywKLQkJCQkJCSAgICBuZXh0X2VudHJ5LCBzaXplLCBtb2RlLAotCQkJCQkJICAgIHBvcywgYnVmLCBidWZzeik7Ci0jZWxzZQotCXBvcyA9IGl3bDM5NDVfcHJpbnRfbGFzdF9ldmVudF9sb2dzKHByaXYsIGNhcGFjaXR5LCBudW1fd3JhcHMsCi0JCQkJCSAgICBuZXh0X2VudHJ5LCBzaXplLCBtb2RlLAotCQkJCQkgICAgcG9zLCBidWYsIGJ1ZnN6KTsKLSNlbmRpZgotCXJldHVybiBwb3M7Ci19Ci0KIHN0YXRpYyB2b2lkIGl3bDM5NDVfaXJxX3Rhc2tsZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCXUzMiBpbnRhLCBoYW5kbGVkID0gMDsKQEAgLTE3NjIsNDkgKzE1NTYsNiBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbnQgaXdsMzk0NV9nZXRfc2luZ2xlX2NoYW5uZWxfZm9yX3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkJICAgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkJICAgICAgIHN0cnVjdCBpd2wzOTQ1X3NjYW5fY2hhbm5lbCAqc2Nhbl9jaCkKLXsKLQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKLQl1MTYgcGFzc2l2ZV9kd2VsbCA9IDA7Ci0JdTE2IGFjdGl2ZV9kd2VsbCA9IDA7Ci0JaW50IGFkZGVkID0gMDsKLQl1OCBjaGFubmVsID0gMDsKLQotCXNiYW5kID0gaXdsX2dldF9od19tb2RlKHByaXYsIGJhbmQpOwotCWlmICghc2JhbmQpIHsKLQkJSVdMX0VSUihwcml2LCAiaW52YWxpZCBiYW5kXG4iKTsKLQkJcmV0dXJuIGFkZGVkOwotCX0KLQotCWFjdGl2ZV9kd2VsbCA9IGl3bF9sZWdhY3lfZ2V0X2FjdGl2ZV9kd2VsbF90aW1lKHByaXYsIGJhbmQsIDApOwotCXBhc3NpdmVfZHdlbGwgPSBpd2xfbGVnYWN5X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgdmlmKTsKLQotCWlmIChwYXNzaXZlX2R3ZWxsIDw9IGFjdGl2ZV9kd2VsbCkKLQkJcGFzc2l2ZV9kd2VsbCA9IGFjdGl2ZV9kd2VsbCArIDE7Ci0KLQotCWNoYW5uZWwgPSBpd2xfbGVnYWN5X2dldF9zaW5nbGVfY2hhbm5lbF9udW1iZXIocHJpdiwgYmFuZCk7Ci0KLQlpZiAoY2hhbm5lbCkgewotCQlzY2FuX2NoLT5jaGFubmVsID0gY2hhbm5lbDsKLQkJc2Nhbl9jaC0+dHlwZSA9IDA7CS8qIHBhc3NpdmUgKi8KLQkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYoYWN0aXZlX2R3ZWxsKTsKLQkJc2Nhbl9jaC0+cGFzc2l2ZV9kd2VsbCA9IGNwdV90b19sZTE2KHBhc3NpdmVfZHdlbGwpOwotCQkvKiBTZXQgdHhwb3dlciBsZXZlbHMgdG8gZGVmYXVsdHMgKi8KLQkJc2Nhbl9jaC0+dHBjLmRzcF9hdHRlbiA9IDExMDsKLQkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCXNjYW5fY2gtPnRwYy50eF9nYWluID0gKCgxIDw8IDUpIHwgKDMgPDwgMykpIHwgMzsKLQkJZWxzZQotCQkJc2Nhbl9jaC0+dHBjLnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoNSA8PCAzKSk7Ci0JCWFkZGVkKys7Ci0JfSBlbHNlCi0JCUlXTF9FUlIocHJpdiwgIm5vIHZhbGlkIGNoYW5uZWwgZm91bmRcbiIpOwotCXJldHVybiBhZGRlZDsKLX0KLQogc3RhdGljIGludCBpd2wzOTQ1X2dldF9jaGFubmVsc19mb3Jfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkJCSBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCiAJCQkJICAgICB1OCBpc19hY3RpdmUsIHU4IG5fcHJvYmVzLApAQCAtMjgxNiw2ICsyNTY3LDcgQEAKIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CiAJYm9vbCBpc19hY3RpdmUgPSBmYWxzZTsKIAlpbnQgcmV0OworCXUxNiBsZW47CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7CiAKQEAgLTI4MzQsMTcgKzI1ODYsMTQgQEAKIAlzY2FuLT5xdWlldF90aW1lID0gSVdMX0FDVElWRV9RVUlFVF9USU1FOwogCiAJaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSkgewotCQl1MTYgaW50ZXJ2YWwgPSAwOworCQl1MTYgaW50ZXJ2YWw7CiAJCXUzMiBleHRyYTsKIAkJdTMyIHN1c3BlbmRfdGltZSA9IDEwMDsKIAkJdTMyIHNjYW5fc3VzcGVuZF90aW1lID0gMTAwOwogCiAJCUlXTF9ERUJVR19JTkZPKHByaXYsICJTY2FubmluZyB3aGlsZSBhc3NvY2lhdGVkLi4uXG4iKTsKIAotCQlpZiAocHJpdi0+aXNfaW50ZXJuYWxfc2hvcnRfc2NhbikKLQkJCWludGVydmFsID0gMDsKLQkJZWxzZQotCQkJaW50ZXJ2YWwgPSB2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQ7CisJCWludGVydmFsID0gdmlmLT5ic3NfY29uZi5iZWFjb25faW50OwogCiAJCXNjYW4tPnN1c3BlbmRfdGltZSA9IDA7CiAJCXNjYW4tPm1heF9vdXRfdGltZSA9IGNwdV90b19sZTMyKDIwMCAqIDEwMjQpOwpAQCAtMjg2Niw5ICsyNjE1LDcgQEAKIAkJCSAgICAgICBzY2FuX3N1c3BlbmRfdGltZSwgaW50ZXJ2YWwpOwogCX0KIAotCWlmIChwcml2LT5pc19pbnRlcm5hbF9zaG9ydF9zY2FuKSB7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTdGFydCBpbnRlcm5hbCBwYXNzaXZlIHNjYW4uXG4iKTsKLQl9IGVsc2UgaWYgKHByaXYtPnNjYW5fcmVxdWVzdC0+bl9zc2lkcykgeworCWlmIChwcml2LT5zY2FuX3JlcXVlc3QtPm5fc3NpZHMpIHsKIAkJaW50IGksIHAgPSAwOwogCQlJV0xfREVCVUdfU0NBTihwcml2LCAiS2lja2luZyBvZmYgYWN0aXZlIHNjYW5cbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzOyBpKyspIHsKQEAgLTI5MTksMzYgKzI2NjYsMTcgQEAKIAlzY2FuLT5nb29kX0NSQ190aCA9IGlzX2FjdGl2ZSA/IElXTF9HT09EX0NSQ19USF9ERUZBVUxUIDoKIAkJCQkJSVdMX0dPT0RfQ1JDX1RIX0RJU0FCTEVEOwogCi0JaWYgKCFwcml2LT5pc19pbnRlcm5hbF9zaG9ydF9zY2FuKSB7Ci0JCXNjYW4tPnR4X2NtZC5sZW4gPSBjcHVfdG9fbGUxNigKLQkJCWl3bF9sZWdhY3lfZmlsbF9wcm9iZV9yZXEocHJpdiwKLQkJCQkoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2Nhbi0+ZGF0YSwKLQkJCQl2aWYtPmFkZHIsCi0JCQkJcHJpdi0+c2Nhbl9yZXF1ZXN0LT5pZSwKLQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPmllX2xlbiwKLQkJCQlJV0xfTUFYX1NDQU5fU0laRSAtIHNpemVvZigqc2NhbikpKTsKLQl9IGVsc2UgewotCQkvKiB1c2UgYmNhc3QgYWRkciwgd2lsbCBub3QgYmUgdHJhbnNtaXR0ZWQgYnV0IG11c3QgYmUgdmFsaWQgKi8KLQkJc2Nhbi0+dHhfY21kLmxlbiA9IGNwdV90b19sZTE2KAotCQkJaXdsX2xlZ2FjeV9maWxsX3Byb2JlX3JlcShwcml2LAotCQkJCShzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilzY2FuLT5kYXRhLAotCQkJCWl3bGVnYWN5X2JjYXN0X2FkZHIsIE5VTEwsIDAsCi0JCQkJSVdMX01BWF9TQ0FOX1NJWkUgLSBzaXplb2YoKnNjYW4pKSk7Ci0JfQorCWxlbiA9IGl3bF9sZWdhY3lfZmlsbF9wcm9iZV9yZXEocHJpdiwgKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXNjYW4tPmRhdGEsCisJCQkJCXZpZi0+YWRkciwgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5pZSwKKwkJCQkJcHJpdi0+c2Nhbl9yZXF1ZXN0LT5pZV9sZW4sCisJCQkJCUlXTF9NQVhfU0NBTl9TSVpFIC0gc2l6ZW9mKCpzY2FuKSk7CisJc2Nhbi0+dHhfY21kLmxlbiA9IGNwdV90b19sZTE2KGxlbik7CisKIAkvKiBzZWxlY3QgUnggYW50ZW5uYXMgKi8KIAlzY2FuLT5mbGFncyB8PSBpd2wzOTQ1X2dldF9hbnRlbm5hX2ZsYWdzKHByaXYpOwogCi0JaWYgKHByaXYtPmlzX2ludGVybmFsX3Nob3J0X3NjYW4pIHsKLQkJc2Nhbi0+Y2hhbm5lbF9jb3VudCA9Ci0JCQlpd2wzOTQ1X2dldF9zaW5nbGVfY2hhbm5lbF9mb3Jfc2Nhbihwcml2LCB2aWYsIGJhbmQsCi0JCQkJKHZvaWQgKikmc2Nhbi0+ZGF0YVtsZTE2X3RvX2NwdSgKLQkJCQlzY2FuLT50eF9jbWQubGVuKV0pOwotCX0gZWxzZSB7Ci0JCXNjYW4tPmNoYW5uZWxfY291bnQgPQotCQkJaXdsMzk0NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4ocHJpdiwgYmFuZCwgaXNfYWN0aXZlLCBuX3Byb2JlcywKLQkJCQkodm9pZCAqKSZzY2FuLT5kYXRhW2xlMTZfdG9fY3B1KHNjYW4tPnR4X2NtZC5sZW4pXSwgdmlmKTsKLQl9Ci0KKwlzY2FuLT5jaGFubmVsX2NvdW50ID0gaXdsMzk0NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4ocHJpdiwgYmFuZCwgaXNfYWN0aXZlLCBuX3Byb2JlcywKKwkJCQkJCQkgICAgKHZvaWQgKikmc2Nhbi0+ZGF0YVtsZW5dLCB2aWYpOwogCWlmIChzY2FuLT5jaGFubmVsX2NvdW50ID09IDApIHsKIAkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgImNoYW5uZWwgY291bnQgJWRcbiIsIHNjYW4tPmNoYW5uZWxfY291bnQpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTM4MjQsMTAgKzM1NTIsNyBAQAogCXByaXYtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkID0gSVdMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX0RFRjsKIAogCS8qIGluaXRpYWxpemUgZm9yY2UgcmVzZXQgKi8KLQlwcml2LT5mb3JjZV9yZXNldFtJV0xfUkZfUkVTRVRdLnJlc2V0X2R1cmF0aW9uID0KLQkJSVdMX0RFTEFZX05FWFRfRk9SQ0VfUkZfUkVTRVQ7Ci0JcHJpdi0+Zm9yY2VfcmVzZXRbSVdMX0ZXX1JFU0VUXS5yZXNldF9kdXJhdGlvbiA9Ci0JCUlXTF9ERUxBWV9ORVhUX0ZPUkNFX0ZXX1JFTE9BRDsKKwlwcml2LT5mb3JjZV9yZXNldC5yZXNldF9kdXJhdGlvbiA9IElXTF9ERUxBWV9ORVhUX0ZPUkNFX0ZXX1JFTE9BRDsKIAogCWlmIChlZXByb20tPnZlcnNpb24gPCBFRVBST01fMzk0NV9FRVBST01fVkVSU0lPTikgewogCQlJV0xfV0FSTihwcml2LCAiVW5zdXBwb3J0ZWQgRUVQUk9NIHZlcnNpb246IDB4JTA0WFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDQ5NjUtYmFzZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsNDk2NS1iYXNlLmMKaW5kZXggYWYyYWUyMi4uMTQzMzQ2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsNDk2NS1iYXNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsNDk2NS1iYXNlLmMKQEAgLTQ4OCwxMzQgKzQ4OCw2IEBACiAJaXdsX2xlZ2FjeV9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChwcml2LCBDTURfQVNZTkMsIGZhbHNlKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3ByaW50X2NvbnRfZXZlbnRfdHJhY2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgYmFzZSwKLQkJCQkJdTMyIHN0YXJ0X2lkeCwgdTMyIG51bV9ldmVudHMsCi0JCQkJCXUzMiBtb2RlKQotewotCXUzMiBpOwotCXUzMiBwdHI7ICAgICAgICAvKiBTUkFNIGJ5dGUgYWRkcmVzcyBvZiBsb2cgZGF0YSAqLwotCXUzMiBldiwgdGltZSwgZGF0YTsgLyogZXZlbnQgbG9nIGRhdGEgKi8KLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQotCWlmIChtb2RlID09IDApCi0JCXB0ciA9IGJhc2UgKyAoNCAqIHNpemVvZih1MzIpKSArIChzdGFydF9pZHggKiAyICogc2l6ZW9mKHUzMikpOwotCWVsc2UKLQkJcHRyID0gYmFzZSArICg0ICogc2l6ZW9mKHUzMikpICsgKHN0YXJ0X2lkeCAqIDMgKiBzaXplb2YodTMyKSk7Ci0KLQkvKiBNYWtlIHN1cmUgZGV2aWNlIGlzIHBvd2VyZWQgdXAgZm9yIFNSQU0gcmVhZHMgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JaWYgKGl3bF9ncmFiX25pY19hY2Nlc3MocHJpdikpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBTZXQgc3RhcnRpbmcgYWRkcmVzczsgcmVhZHMgd2lsbCBhdXRvLWluY3JlbWVudCAqLwotCV9pd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkFERFIsIHB0cik7Ci0Jcm1iKCk7Ci0KLQkvKgotCSAqICJ0aW1lIiBpcyBhY3R1YWxseSAiZGF0YSIgZm9yIG1vZGUgMCAobm8gdGltZXN0YW1wKS4KLQkgKiBwbGFjZSBldmVudCBpZCAjIGF0IGZhciByaWdodCBmb3IgZWFzaWVyIHZpc3VhbCBwYXJzaW5nLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBudW1fZXZlbnRzOyBpKyspIHsKLQkJZXYgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0JCXRpbWUgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0JCWlmIChtb2RlID09IDApIHsKLQkJCXRyYWNlX2l3bHdpZmlfbGVnYWN5X2Rldl91Y29kZV9jb250X2V2ZW50KHByaXYsCi0JCQkJCQkJMCwgdGltZSwgZXYpOwotCQl9IGVsc2UgewotCQkJZGF0YSA9IF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwKLQkJCQkJCUhCVVNfVEFSR19NRU1fUkRBVCk7Ci0JCQl0cmFjZV9pd2x3aWZpX2xlZ2FjeV9kZXZfdWNvZGVfY29udF9ldmVudChwcml2LAotCQkJCQkJdGltZSwgZGF0YSwgZXYpOwotCQl9Ci0JfQotCS8qIEFsbG93IGRldmljZSB0byBwb3dlciBkb3duICovCi0JaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9jb250aW51b3VzX2V2ZW50X3RyYWNlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MzIgY2FwYWNpdHk7ICAgLyogZXZlbnQgbG9nIGNhcGFjaXR5IGluICMgZW50cmllcyAqLwotCXUzMiBiYXNlOyAgICAgICAvKiBTUkFNIGJ5dGUgYWRkcmVzcyBvZiBldmVudCBsb2cgaGVhZGVyICovCi0JdTMyIG1vZGU7ICAgICAgIC8qIDAgLSBubyB0aW1lc3RhbXAsIDEgLSB0aW1lc3RhbXAgcmVjb3JkZWQgKi8KLQl1MzIgbnVtX3dyYXBzOyAgLyogIyB0aW1lcyB1Q29kZSB3cmFwcGVkIHRvIHRvcCBvZiBsb2cgKi8KLQl1MzIgbmV4dF9lbnRyeTsgLyogaW5kZXggb2YgbmV4dCBlbnRyeSB0byBiZSB3cml0dGVuIGJ5IHVDb2RlICovCi0KLQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKQotCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LmVycm9yX2V2ZW50X3RhYmxlX3B0cik7Ci0JZWxzZQotCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZS5sb2dfZXZlbnRfdGFibGVfcHRyKTsKLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+aXNfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgewotCQljYXBhY2l0eSA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlKTsKLQkJbnVtX3dyYXBzID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsCi0JCQkJCQliYXNlICsgKDIgKiBzaXplb2YodTMyKSkpOwotCQltb2RlID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAoMSAqIHNpemVvZih1MzIpKSk7Ci0JCW5leHRfZW50cnkgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwKLQkJCQkJCWJhc2UgKyAoMyAqIHNpemVvZih1MzIpKSk7Ci0JfSBlbHNlCi0JCXJldHVybjsKLQotCWlmIChudW1fd3JhcHMgPT0gcHJpdi0+ZXZlbnRfbG9nLm51bV93cmFwcykgewotCQlpd2w0OTY1X3ByaW50X2NvbnRfZXZlbnRfdHJhY2UocHJpdiwKLQkJCQkgICAgICAgYmFzZSwgcHJpdi0+ZXZlbnRfbG9nLm5leHRfZW50cnksCi0JCQkJICAgICAgIG5leHRfZW50cnkgLSBwcml2LT5ldmVudF9sb2cubmV4dF9lbnRyeSwKLQkJCQkgICAgICAgbW9kZSk7Ci0JCXByaXYtPmV2ZW50X2xvZy5ub25fd3JhcHNfY291bnQrKzsKLQl9IGVsc2UgewotCQlpZiAoKG51bV93cmFwcyAtIHByaXYtPmV2ZW50X2xvZy5udW1fd3JhcHMpID4gMSkKLQkJCXByaXYtPmV2ZW50X2xvZy53cmFwc19tb3JlX2NvdW50Kys7Ci0JCWVsc2UKLQkJCXByaXYtPmV2ZW50X2xvZy53cmFwc19vbmNlX2NvdW50Kys7Ci0JCXRyYWNlX2l3bHdpZmlfbGVnYWN5X2Rldl91Y29kZV93cmFwX2V2ZW50KHByaXYsCi0JCQkJbnVtX3dyYXBzIC0gcHJpdi0+ZXZlbnRfbG9nLm51bV93cmFwcywKLQkJCQluZXh0X2VudHJ5LCBwcml2LT5ldmVudF9sb2cubmV4dF9lbnRyeSk7Ci0JCWlmIChuZXh0X2VudHJ5IDwgcHJpdi0+ZXZlbnRfbG9nLm5leHRfZW50cnkpIHsKLQkJCWl3bDQ5NjVfcHJpbnRfY29udF9ldmVudF90cmFjZShwcml2LCBiYXNlLAotCQkJICAgICAgIHByaXYtPmV2ZW50X2xvZy5uZXh0X2VudHJ5LAotCQkJICAgICAgIGNhcGFjaXR5IC0gcHJpdi0+ZXZlbnRfbG9nLm5leHRfZW50cnksCi0JCQkgICAgICAgbW9kZSk7Ci0KLQkJCWl3bDQ5NjVfcHJpbnRfY29udF9ldmVudF90cmFjZShwcml2LCBiYXNlLCAwLAotCQkJCW5leHRfZW50cnksIG1vZGUpOwotCQl9IGVsc2UgewotCQkJaXdsNDk2NV9wcmludF9jb250X2V2ZW50X3RyYWNlKHByaXYsIGJhc2UsCi0JCQkgICAgICAgbmV4dF9lbnRyeSwgY2FwYWNpdHkgLSBuZXh0X2VudHJ5LAotCQkJICAgICAgIG1vZGUpOwotCi0JCQlpd2w0OTY1X3ByaW50X2NvbnRfZXZlbnRfdHJhY2UocHJpdiwgYmFzZSwgMCwKLQkJCQluZXh0X2VudHJ5LCBtb2RlKTsKLQkJfQotCX0KLQlwcml2LT5ldmVudF9sb2cubnVtX3dyYXBzID0gbnVtX3dyYXBzOwotCXByaXYtPmV2ZW50X2xvZy5uZXh0X2VudHJ5ID0gbmV4dF9lbnRyeTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2JnX3Vjb2RlX3RyYWNlIC0gVGltZXIgY2FsbGJhY2sgdG8gbG9nIHVjb2RlIGV2ZW50Ci0gKgotICogVGhlIHRpbWVyIGlzIGNvbnRpbnVhbGx5IHNldCB0byBleGVjdXRlIGV2ZXJ5Ci0gKiBVQ09ERV9UUkFDRV9QRVJJT0QgbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IHRpbWVyIGV4cGlyZWQKLSAqIHRoaXMgZnVuY3Rpb24gaXMgdG8gcGVyZm9ybSBjb250aW51b3VzIHVDb2RlIGV2ZW50IGxvZ2dpbmcgb3BlcmF0aW9uCi0gKiBpZiBlbmFibGVkCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfYmdfdWNvZGVfdHJhY2UodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilkYXRhOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQlpZiAocHJpdi0+ZXZlbnRfbG9nLnVjb2RlX3RyYWNlKSB7Ci0JCWl3bDQ5NjVfY29udGludW91c19ldmVudF90cmFjZShwcml2KTsKLQkJLyogUmVzY2hlZHVsZSB0aGUgdGltZXIgdG8gb2NjdXIgaW4gVUNPREVfVFJBQ0VfUEVSSU9EICovCi0JCW1vZF90aW1lcigmcHJpdi0+dWNvZGVfdHJhY2UsCi0JCQkgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoVUNPREVfVFJBQ0VfUEVSSU9EKSk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBpd2w0OTY1X3J4X2JlYWNvbl9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCiB7CkBAIC0xNjEyLDcgKzE0ODQsNyBAQAogCSJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwKIAkiTk1JX1RSTV9IV19FUiIsCiAJIk5NSV9JTlRFUlJVUFRfVFJNIiwKLQkiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIKKwkiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIsCiAJIkRFQlVHXzAiLAogCSJERUJVR18xIiwKIAkiREVCVUdfMiIsCkBAIC0xNzExLDIwOSArMTU4Myw2IEBACiAJCXBjLCBibGluazEsIGJsaW5rMiwgaWxpbmsxLCBpbGluazIsIGhjbWQpOwogfQogCi0jZGVmaW5lIEVWRU5UX1NUQVJUX09GRlNFVCAgKDQgKiBzaXplb2YodTMyKSkKLQotLyoqCi0gKiBpd2w0OTY1X3ByaW50X2V2ZW50X2xvZyAtIER1bXAgZXJyb3IgZXZlbnQgbG9nIHRvIHN5c2xvZwotICoKLSAqLwotc3RhdGljIGludCBpd2w0OTY1X3ByaW50X2V2ZW50X2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBzdGFydF9pZHgsCi0JCQkgICAgICAgdTMyIG51bV9ldmVudHMsIHUzMiBtb2RlLAotCQkJICAgICAgIGludCBwb3MsIGNoYXIgKipidWYsIHNpemVfdCBidWZzeikKLXsKLQl1MzIgaTsKLQl1MzIgYmFzZTsgICAgICAgLyogU1JBTSBieXRlIGFkZHJlc3Mgb2YgZXZlbnQgbG9nIGhlYWRlciAqLwotCXUzMiBldmVudF9zaXplOyAvKiAyIHUzMnMsIG9yIDMgdTMycyBpZiB0aW1lc3RhbXAgcmVjb3JkZWQgKi8KLQl1MzIgcHRyOyAgICAgICAgLyogU1JBTSBieXRlIGFkZHJlc3Mgb2YgbG9nIGRhdGEgKi8KLQl1MzIgZXYsIHRpbWUsIGRhdGE7IC8qIGV2ZW50IGxvZyBkYXRhICovCi0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlpZiAobnVtX2V2ZW50cyA9PSAwKQotCQlyZXR1cm4gcG9zOwotCi0JaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkgewotCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LmxvZ19ldmVudF90YWJsZV9wdHIpOwotCX0gZWxzZSB7Ci0JCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlLmxvZ19ldmVudF90YWJsZV9wdHIpOwotCX0KLQotCWlmIChtb2RlID09IDApCi0JCWV2ZW50X3NpemUgPSAyICogc2l6ZW9mKHUzMik7Ci0JZWxzZQotCQlldmVudF9zaXplID0gMyAqIHNpemVvZih1MzIpOwotCi0JcHRyID0gYmFzZSArIEVWRU5UX1NUQVJUX09GRlNFVCArIChzdGFydF9pZHggKiBldmVudF9zaXplKTsKLQotCS8qIE1ha2Ugc3VyZSBkZXZpY2UgaXMgcG93ZXJlZCB1cCBmb3IgU1JBTSByZWFkcyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpOwotCi0JLyogU2V0IHN0YXJ0aW5nIGFkZHJlc3M7IHJlYWRzIHdpbGwgYXV0by1pbmNyZW1lbnQgKi8KLQlfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JBRERSLCBwdHIpOwotCXJtYigpOwotCi0JLyogInRpbWUiIGlzIGFjdHVhbGx5ICJkYXRhIiBmb3IgbW9kZSAwIChubyB0aW1lc3RhbXApLgotCSogcGxhY2UgZXZlbnQgaWQgIyBhdCBmYXIgcmlnaHQgZm9yIGVhc2llciB2aXN1YWwgcGFyc2luZy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2V2ZW50czsgaSsrKSB7Ci0JCWV2ID0gX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JEQVQpOwotCQl0aW1lID0gX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JEQVQpOwotCQlpZiAobW9kZSA9PSAwKSB7Ci0JCQkvKiBkYXRhLCBldiAqLwotCQkJaWYgKGJ1ZnN6KSB7Ci0JCQkJcG9zICs9IHNjbnByaW50ZigqYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkJCSJFVlRfTE9HOjB4JTA4eDolMDR1XG4iLAotCQkJCQkJdGltZSwgZXYpOwotCQkJfSBlbHNlIHsKLQkJCQl0cmFjZV9pd2x3aWZpX2xlZ2FjeV9kZXZfdWNvZGVfZXZlbnQocHJpdiwgMCwKLQkJCQkJdGltZSwgZXYpOwotCQkJCUlXTF9FUlIocHJpdiwgIkVWVF9MT0c6MHglMDh4OiUwNHVcbiIsCi0JCQkJCXRpbWUsIGV2KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWRhdGEgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsCi0JCQkJCQlIQlVTX1RBUkdfTUVNX1JEQVQpOwotCQkJaWYgKGJ1ZnN6KSB7Ci0JCQkJcG9zICs9IHNjbnByaW50ZigqYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkJCSJFVlRfTE9HVDolMDEwdToweCUwOHg6JTA0dVxuIiwKLQkJCQkJCSB0aW1lLCBkYXRhLCBldik7Ci0JCQl9IGVsc2UgewotCQkJCUlXTF9FUlIocHJpdiwgIkVWVF9MT0dUOiUwMTB1OjB4JTA4eDolMDR1XG4iLAotCQkJCQl0aW1lLCBkYXRhLCBldik7Ci0JCQkJdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X3Vjb2RlX2V2ZW50KHByaXYsIHRpbWUsCi0JCQkJCWRhdGEsIGV2KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIEFsbG93IGRldmljZSB0byBwb3dlciBkb3duICovCi0JaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlyZXR1cm4gcG9zOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfcHJpbnRfbGFzdF9ldmVudF9sb2dzIC0gRHVtcCB0aGUgbmV3ZXN0ICMgb2YgZXZlbnQgbG9nIHRvIHN5c2xvZwotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcHJpbnRfbGFzdF9ldmVudF9sb2dzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGNhcGFjaXR5LAotCQkJCSAgICB1MzIgbnVtX3dyYXBzLCB1MzIgbmV4dF9lbnRyeSwKLQkJCQkgICAgdTMyIHNpemUsIHUzMiBtb2RlLAotCQkJCSAgICBpbnQgcG9zLCBjaGFyICoqYnVmLCBzaXplX3QgYnVmc3opCi17Ci0JLyoKLQkgKiBkaXNwbGF5IHRoZSBuZXdlc3QgREVGQVVMVF9MT0dfRU5UUklFUyBlbnRyaWVzCi0JICogaS5lIHRoZSBlbnRyaWVzIGp1c3QgYmVmb3JlIHRoZSBuZXh0IG9udCB0aGF0IHVDb2RlIHdvdWxkIGZpbGwuCi0JICovCi0JaWYgKG51bV93cmFwcykgewotCQlpZiAobmV4dF9lbnRyeSA8IHNpemUpIHsKLQkJCXBvcyA9IGl3bDQ5NjVfcHJpbnRfZXZlbnRfbG9nKHByaXYsCi0JCQkJCQljYXBhY2l0eSAtIChzaXplIC0gbmV4dF9lbnRyeSksCi0JCQkJCQlzaXplIC0gbmV4dF9lbnRyeSwgbW9kZSwKLQkJCQkJCXBvcywgYnVmLCBidWZzeik7Ci0JCQlwb3MgPSBpd2w0OTY1X3ByaW50X2V2ZW50X2xvZyhwcml2LCAwLAotCQkJCQkJICBuZXh0X2VudHJ5LCBtb2RlLAotCQkJCQkJICBwb3MsIGJ1ZiwgYnVmc3opOwotCQl9IGVsc2UKLQkJCXBvcyA9IGl3bDQ5NjVfcHJpbnRfZXZlbnRfbG9nKHByaXYsIG5leHRfZW50cnkgLSBzaXplLAotCQkJCQkJICBzaXplLCBtb2RlLCBwb3MsIGJ1ZiwgYnVmc3opOwotCX0gZWxzZSB7Ci0JCWlmIChuZXh0X2VudHJ5IDwgc2l6ZSkgewotCQkJcG9zID0gaXdsNDk2NV9wcmludF9ldmVudF9sb2cocHJpdiwgMCwgbmV4dF9lbnRyeSwKLQkJCQkJCSAgbW9kZSwgcG9zLCBidWYsIGJ1ZnN6KTsKLQkJfSBlbHNlIHsKLQkJCXBvcyA9IGl3bDQ5NjVfcHJpbnRfZXZlbnRfbG9nKHByaXYsIG5leHRfZW50cnkgLSBzaXplLAotCQkJCQkJICBzaXplLCBtb2RlLCBwb3MsIGJ1ZiwgYnVmc3opOwotCQl9Ci0JfQotCXJldHVybiBwb3M7Ci19Ci0KLSNkZWZpbmUgREVGQVVMVF9EVU1QX0VWRU5UX0xPR19FTlRSSUVTICgyMCkKLQotaW50IGl3bDQ5NjVfZHVtcF9uaWNfZXZlbnRfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBmdWxsX2xvZywKLQkJCSAgICBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpCi17Ci0JdTMyIGJhc2U7ICAgICAgIC8qIFNSQU0gYnl0ZSBhZGRyZXNzIG9mIGV2ZW50IGxvZyBoZWFkZXIgKi8KLQl1MzIgY2FwYWNpdHk7ICAgLyogZXZlbnQgbG9nIGNhcGFjaXR5IGluICMgZW50cmllcyAqLwotCXUzMiBtb2RlOyAgICAgICAvKiAwIC0gbm8gdGltZXN0YW1wLCAxIC0gdGltZXN0YW1wIHJlY29yZGVkICovCi0JdTMyIG51bV93cmFwczsgIC8qICMgdGltZXMgdUNvZGUgd3JhcHBlZCB0byB0b3Agb2YgbG9nICovCi0JdTMyIG5leHRfZW50cnk7IC8qIGluZGV4IG9mIG5leHQgZW50cnkgdG8gYmUgd3JpdHRlbiBieSB1Q29kZSAqLwotCXUzMiBzaXplOyAgICAgICAvKiAjIGVudHJpZXMgdGhhdCB3ZSdsbCBwcmludCAqLwotCWludCBwb3MgPSAwOwotCXNpemVfdCBidWZzeiA9IDA7Ci0KLQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKSB7Ci0JCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQubG9nX2V2ZW50X3RhYmxlX3B0cik7Ci0JfSBlbHNlIHsKLQkJYmFzZSA9IGxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmUubG9nX2V2ZW50X3RhYmxlX3B0cik7Ci0JfQotCi0JaWYgKCFwcml2LT5jZmctPm9wcy0+bGliLT5pc192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJJbnZhbGlkIGV2ZW50IGxvZyBwb2ludGVyIDB4JTA4WCBmb3IgJXMgdUNvZGVcbiIsCi0JCQliYXNlLCAocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKSA/ICJJbml0IiA6ICJSVCIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBldmVudCBsb2cgaGVhZGVyICovCi0JY2FwYWNpdHkgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSk7Ci0JbW9kZSA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgKDEgKiBzaXplb2YodTMyKSkpOwotCW51bV93cmFwcyA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgKDIgKiBzaXplb2YodTMyKSkpOwotCW5leHRfZW50cnkgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArICgzICogc2l6ZW9mKHUzMikpKTsKLQotCXNpemUgPSBudW1fd3JhcHMgPyBjYXBhY2l0eSA6IG5leHRfZW50cnk7Ci0KLQkvKiBiYWlsIG91dCBpZiBub3RoaW5nIGluIGxvZyAqLwotCWlmIChzaXplID09IDApIHsKLQkJSVdMX0VSUihwcml2LCAiU3RhcnQgSVdMIEV2ZW50IExvZyBEdW1wOiBub3RoaW5nIGluIGxvZ1xuIik7Ci0JCXJldHVybiBwb3M7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaWYgKCEoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiBJV0xfRExfRldfRVJST1JTKSAmJiAhZnVsbF9sb2cpCi0JCXNpemUgPSAoc2l6ZSA+IERFRkFVTFRfRFVNUF9FVkVOVF9MT0dfRU5UUklFUykKLQkJCT8gREVGQVVMVF9EVU1QX0VWRU5UX0xPR19FTlRSSUVTIDogc2l6ZTsKLSNlbHNlCi0Jc2l6ZSA9IChzaXplID4gREVGQVVMVF9EVU1QX0VWRU5UX0xPR19FTlRSSUVTKQotCQk/IERFRkFVTFRfRFVNUF9FVkVOVF9MT0dfRU5UUklFUyA6IHNpemU7Ci0jZW5kaWYKLQlJV0xfRVJSKHByaXYsICJTdGFydCBJV0wgRXZlbnQgTG9nIER1bXA6IGRpc3BsYXkgbGFzdCAldSBlbnRyaWVzXG4iLAotCQlzaXplKTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCWlmIChkaXNwbGF5KSB7Ci0JCWlmIChmdWxsX2xvZykKLQkJCWJ1ZnN6ID0gY2FwYWNpdHkgKiA0ODsKLQkJZWxzZQotCQkJYnVmc3ogPSBzaXplICogNDg7Ci0JCSpidWYgPSBrbWFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCEqYnVmKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWlmICgoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiBJV0xfRExfRldfRVJST1JTKSB8fCBmdWxsX2xvZykgewotCQkvKgotCQkgKiBpZiB1Q29kZSBoYXMgd3JhcHBlZCBiYWNrIHRvIHRvcCBvZiBsb2csCi0JCSAqIHN0YXJ0IGF0IHRoZSBvbGRlc3QgZW50cnksCi0JCSAqIGkuZSB0aGUgbmV4dCBvbmUgdGhhdCB1Q29kZSB3b3VsZCBmaWxsLgotCQkgKi8KLQkJaWYgKG51bV93cmFwcykKLQkJCXBvcyA9IGl3bDQ5NjVfcHJpbnRfZXZlbnRfbG9nKHByaXYsIG5leHRfZW50cnksCi0JCQkJCQljYXBhY2l0eSAtIG5leHRfZW50cnksIG1vZGUsCi0JCQkJCQlwb3MsIGJ1ZiwgYnVmc3opOwotCQkvKiAodGhlbi9lbHNlKSBzdGFydCBhdCB0b3Agb2YgbG9nICovCi0JCXBvcyA9IGl3bDQ5NjVfcHJpbnRfZXZlbnRfbG9nKHByaXYsIDAsCi0JCQkJCSAgbmV4dF9lbnRyeSwgbW9kZSwgcG9zLCBidWYsIGJ1ZnN6KTsKLQl9IGVsc2UKLQkJcG9zID0gaXdsNDk2NV9wcmludF9sYXN0X2V2ZW50X2xvZ3MocHJpdiwgY2FwYWNpdHksIG51bV93cmFwcywKLQkJCQkJCW5leHRfZW50cnksIHNpemUsIG1vZGUsCi0JCQkJCQlwb3MsIGJ1ZiwgYnVmc3opOwotI2Vsc2UKLQlwb3MgPSBpd2w0OTY1X3ByaW50X2xhc3RfZXZlbnRfbG9ncyhwcml2LCBjYXBhY2l0eSwgbnVtX3dyYXBzLAotCQkJCQluZXh0X2VudHJ5LCBzaXplLCBtb2RlLAotCQkJCQlwb3MsIGJ1ZiwgYnVmc3opOwotI2VuZGlmCi0JcmV0dXJuIHBvczsKLX0KLQogc3RhdGljIHZvaWQgaXdsNDk2NV9yZl9raWxsX2N0X2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGl3bF9jdF9raWxsX2NvbmZpZyBjbWQ7CkBAIC0yNzczLDIwICsyNDQyLDEwIEBACiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6CiAJCUlXTF9ERUJVR19IVChwcml2LCAic3RhcnQgVHhcbiIpOwogCQlyZXQgPSBpd2w0OTY1X3R4X2FnZ19zdGFydChwcml2LCB2aWYsIHN0YSwgdGlkLCBzc24pOwotCQlpZiAocmV0ID09IDApIHsKLQkJCXByaXYtPl80OTY1LmFnZ190aWRzX2NvdW50Kys7Ci0JCQlJV0xfREVCVUdfSFQocHJpdiwgInByaXYtPl80OTY1LmFnZ190aWRzX2NvdW50ID0gJXVcbiIsCi0JCQkJICAgICBwcml2LT5fNDk2NS5hZ2dfdGlkc19jb3VudCk7Ci0JCX0KIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUDoKIAkJSVdMX0RFQlVHX0hUKHByaXYsICJzdG9wIFR4XG4iKTsKIAkJcmV0ID0gaXdsNDk2NV90eF9hZ2dfc3RvcChwcml2LCB2aWYsIHN0YSwgdGlkKTsKLQkJaWYgKChyZXQgPT0gMCkgJiYgKHByaXYtPl80OTY1LmFnZ190aWRzX2NvdW50ID4gMCkpIHsKLQkJCXByaXYtPl80OTY1LmFnZ190aWRzX2NvdW50LS07Ci0JCQlJV0xfREVCVUdfSFQocHJpdiwgInByaXYtPl80OTY1LmFnZ190aWRzX2NvdW50ID0gJXVcbiIsCi0JCQkJICAgICBwcml2LT5fNDk2NS5hZ2dfdGlkc19jb3VudCk7Ci0JCX0KIAkJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQkJcmV0ID0gMDsKIAkJYnJlYWs7CkBAIC0yODUxLDcgKzI1MTAsNiBAQAogCiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKIAl1MTYgY2g7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKIAlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKIApAQCAtMjg2MSw3MyArMjUxOSw3MyBAQAogCQlnb3RvIG91dDsKIAogCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKQorCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKIAkJZ290byBvdXQ7CiAKIAlpZiAoIWl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKIAkJZ290byBvdXQ7CiAKLQkvKiBjaGFubmVsIHN3aXRjaCBpbiBwcm9ncmVzcyAqLwotCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPT0gdHJ1ZSkKKwlpZiAoIXByaXYtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaCkKIAkJZ290byBvdXQ7CiAKLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKSB7CisJY2ggPSBjaGFubmVsLT5od192YWx1ZTsKKwlpZiAobGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCkgPT0gY2gpCisJCWdvdG8gb3V0OwogCi0JCWNoID0gY2hhbm5lbC0+aHdfdmFsdWU7Ci0JCWlmIChsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSAhPSBjaCkgewotCQkJY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LAotCQkJCQkJICAgICAgIGNoYW5uZWwtPmJhbmQsCi0JCQkJCQkgICAgICAgY2gpOwotCQkJaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImludmFsaWQgY2hhbm5lbFxuIik7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JCQlwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gY29uZi0+c21wc19tb2RlOwotCi0JCQkvKiBDb25maWd1cmUgSFQ0MCBjaGFubmVscyAqLwotCQkJY3R4LT5odC5lbmFibGVkID0gY29uZl9pc19odChjb25mKTsKLQkJCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKLQkJCQlpZiAoY29uZl9pc19odDQwX21pbnVzKGNvbmYpKSB7Ci0JCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KLQkJCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c7Ci0JCQkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKLQkJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKLQkJCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORTsKLQkJCQkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKLQotCQkJaWYgKChsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCkgIT0gY2gpKQotCQkJCWN0eC0+c3RhZ2luZy5mbGFncyA9IDA7Ci0KLQkJCWl3bF9sZWdhY3lfc2V0X3J4b25fY2hhbm5lbChwcml2LCBjaGFubmVsLCBjdHgpOwotCQkJaXdsX2xlZ2FjeV9zZXRfcnhvbl9odChwcml2LCBodF9jb25mKTsKLQkJCWl3bF9sZWdhY3lfc2V0X2ZsYWdzX2Zvcl9iYW5kKHByaXYsIGN0eCwgY2hhbm5lbC0+YmFuZCwKLQkJCQkJICAgICAgIGN0eC0+dmlmKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCQkJaXdsX2xlZ2FjeV9zZXRfcmF0ZShwcml2KTsKLQkJCS8qCi0JCQkgKiBhdCB0aGlzIHBvaW50LCBzdGFnaW5nX3J4b24gaGFzIHRoZQotCQkJICogY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbCBzd2l0Y2gKLQkJCSAqLwotCQkJaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChwcml2LAotCQkJCQkJCQkgICAgY2hfc3dpdGNoKSkKLQkJCQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLQkJfQorCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgY2hhbm5lbC0+YmFuZCwgY2gpOworCWlmICghaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7CisJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiaW52YWxpZCBjaGFubmVsXG4iKTsKKwkJZ290byBvdXQ7CiAJfQorCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gY29uZi0+c21wc19tb2RlOworCisJLyogQ29uZmlndXJlIEhUNDAgY2hhbm5lbHMgKi8KKwljdHgtPmh0LmVuYWJsZWQgPSBjb25mX2lzX2h0KGNvbmYpOworCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKKwkJaWYgKGNvbmZfaXNfaHQ0MF9taW51cyhjb25mKSkgeworCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOworCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7CisJCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKKwkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKKwkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOworCQl9IGVsc2UgeworCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU7CisJCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7CisJCX0KKwl9IGVsc2UKKwkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOworCisJaWYgKChsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCkgIT0gY2gpKQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOworCisJaXdsX2xlZ2FjeV9zZXRfcnhvbl9jaGFubmVsKHByaXYsIGNoYW5uZWwsIGN0eCk7CisJaXdsX2xlZ2FjeV9zZXRfcnhvbl9odChwcml2LCBodF9jb25mKTsKKwlpd2xfbGVnYWN5X3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIGNoYW5uZWwtPmJhbmQsIGN0eC0+dmlmKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlpd2xfbGVnYWN5X3NldF9yYXRlKHByaXYpOworCS8qCisJICogYXQgdGhpcyBwb2ludCwgc3RhZ2luZ19yeG9uIGhhcyB0aGUKKwkgKiBjb25maWd1cmF0aW9uIGZvciBjaGFubmVsIHN3aXRjaAorCSAqLworCXNldF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOworCXByaXYtPnN3aXRjaF9jaGFubmVsID0gY3B1X3RvX2xlMTYoY2gpOworCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gocHJpdiwgY2hfc3dpdGNoKSkgeworCQljbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOworCQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IDA7CisJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7CisJfQorCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKCFwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MpCi0JCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7CiAJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CiB9CiAKQEAgLTMwMzQsMTAgKzI2OTIsNiBAQAogCXByaXYtPnN0YXRpc3RpY3NfcGVyaW9kaWMuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXByaXY7CiAJcHJpdi0+c3RhdGlzdGljc19wZXJpb2RpYy5mdW5jdGlvbiA9IGl3bDQ5NjVfYmdfc3RhdGlzdGljc19wZXJpb2RpYzsKIAotCWluaXRfdGltZXIoJnByaXYtPnVjb2RlX3RyYWNlKTsKLQlwcml2LT51Y29kZV90cmFjZS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcHJpdjsKLQlwcml2LT51Y29kZV90cmFjZS5mdW5jdGlvbiA9IGl3bDQ5NjVfYmdfdWNvZGVfdHJhY2U7Ci0KIAlpbml0X3RpbWVyKCZwcml2LT53YXRjaGRvZyk7CiAJcHJpdi0+d2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXByaXY7CiAJcHJpdi0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBpd2xfbGVnYWN5X2JnX3dhdGNoZG9nOwpAQCAtMzA1Niw3ICsyNzEwLDYgQEAKIAlpd2xfbGVnYWN5X2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmsocHJpdik7CiAKIAlkZWxfdGltZXJfc3luYygmcHJpdi0+c3RhdGlzdGljc19wZXJpb2RpYyk7Ci0JZGVsX3RpbWVyX3N5bmMoJnByaXYtPnVjb2RlX3RyYWNlKTsKIH0KIAogc3RhdGljIHZvaWQgaXdsNDk2NV9pbml0X2h3X3JhdGVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKQEAgLTMxMzIsMTMgKzI3ODUsOSBAQAogCXByaXYtPml3X21vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwogCXByaXYtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPSBJRUVFODAyMTFfU01QU19TVEFUSUM7CiAJcHJpdi0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGOwotCXByaXYtPl80OTY1LmFnZ190aWRzX2NvdW50ID0gMDsKIAogCS8qIGluaXRpYWxpemUgZm9yY2UgcmVzZXQgKi8KLQlwcml2LT5mb3JjZV9yZXNldFtJV0xfUkZfUkVTRVRdLnJlc2V0X2R1cmF0aW9uID0KLQkJSVdMX0RFTEFZX05FWFRfRk9SQ0VfUkZfUkVTRVQ7Ci0JcHJpdi0+Zm9yY2VfcmVzZXRbSVdMX0ZXX1JFU0VUXS5yZXNldF9kdXJhdGlvbiA9Ci0JCUlXTF9ERUxBWV9ORVhUX0ZPUkNFX0ZXX1JFTE9BRDsKKwlwcml2LT5mb3JjZV9yZXNldC5yZXNldF9kdXJhdGlvbiA9IElXTF9ERUxBWV9ORVhUX0ZPUkNFX0ZXX1JFTE9BRDsKIAogCS8qIENob29zZSB3aGljaCByZWNlaXZlcnMvYW50ZW5uYXMgdG8gdXNlICovCiAJaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL01ha2VmaWxlCmluZGV4IDgyMjY2MDQuLjQ4YWI5MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9NYWtlZmlsZQpAQCAtNSwxNCArNSwxNiBAQAogaXdsYWduLW9ianMJCSs9IGl3bC1hZ24tbGliLm8gaXdsLWFnbi1jYWxpYi5vIGl3bC1pby5vCiBpd2xhZ24tb2JqcwkJKz0gaXdsLWFnbi10dC5vIGl3bC1hZ24tc3RhLm8gaXdsLWFnbi1lZXByb20ubwogCi1pd2xhZ24tb2JqcyAJCSs9IGl3bC1jb3JlLm8gaXdsLWVlcHJvbS5vIGl3bC1oY21kLm8gaXdsLXBvd2VyLm8KLWl3bGFnbi1vYmpzIAkJKz0gaXdsLXJ4Lm8gaXdsLXR4Lm8gaXdsLXN0YS5vCitpd2xhZ24tb2JqcyAJCSs9IGl3bC1jb3JlLm8gaXdsLWVlcHJvbS5vIGl3bC1wb3dlci5vCitpd2xhZ24tb2JqcyAJCSs9IGl3bC1yeC5vIGl3bC1zdGEubwogaXdsYWduLW9ianMgCQkrPSBpd2wtc2Nhbi5vIGl3bC1sZWQubwotaXdsYWduLW9ianMgICAgICAgICAgICAgKz0gaXdsLWFnbi1yeG9uLm8gaXdsLWFnbi1oY21kLm8gaXdsLWFnbi1pY3QubworaXdsYWduLW9ianMgICAgICAgICAgICAgKz0gaXdsLWFnbi1yeG9uLm8KIGl3bGFnbi1vYmpzICAgICAgICAgICAgICs9IGl3bC01MDAwLm8KIGl3bGFnbi1vYmpzICAgICAgICAgICAgICs9IGl3bC02MDAwLm8KIGl3bGFnbi1vYmpzICAgICAgICAgICAgICs9IGl3bC0xMDAwLm8KIGl3bGFnbi1vYmpzICAgICAgICAgICAgICs9IGl3bC0yMDAwLm8KK2l3bGFnbi1vYmpzICAgICAgICAgICAgICs9IGl3bC1wY2kubworaXdsYWduLW9ianMgICAgICAgICAgICAgKz0gaXdsLXRyYW5zLm8gaXdsLXRyYW5zLXJ4LXBjaWUubyBpd2wtdHJhbnMtdHgtcGNpZS5vCiAKIGl3bGFnbi0kKENPTkZJR19JV0xXSUZJX0RFQlVHRlMpICs9IGl3bC1kZWJ1Z2ZzLm8KIGl3bGFnbi0kKENPTkZJR19JV0xXSUZJX0RFVklDRV9UUkFDSU5HKSArPSBpd2wtZGV2dHJhY2UubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jCmluZGV4IDYxZDRhMTEuLjAxYjQ5ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTEwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMKQEAgLTI3LDggKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpAQCAtMzYsNiArMzQsNyBAQAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogCiAjaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgogI2luY2x1ZGUgIml3bC1kZXYuaCIKQEAgLTU1LDEwICs1NCwxMCBAQAogI2RlZmluZSBJV0wxMDBfVUNPREVfQVBJX01JTiA1CiAKICNkZWZpbmUgSVdMMTAwMF9GV19QUkUgIml3bHdpZmktMTAwMC0iCi0jZGVmaW5lIElXTDEwMDBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMMTAwMF9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0wxMDAwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDEwMDBfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogI2RlZmluZSBJV0wxMDBfRldfUFJFICJpd2x3aWZpLTEwMC0iCi0jZGVmaW5lIElXTDEwMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0wxMDBfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMMTAwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDEwMF9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiAKIC8qCkBAIC0xMjYsNyArMTI1LDYgQEAKIAkJCWl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXM7CiAKIAlwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0gPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwotCXByaXYtPmh3X3BhcmFtcy5kbWFfY2hubF9udW0gPSBGSDUwX1RDU1JfQ0hOTF9OVU07CiAJcHJpdi0+aHdfcGFyYW1zLnNjZF9iY190YmxzX3NpemUgPQogCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqCiAJCQlzaXplb2Yoc3RydWN0IGl3bGFnbl9zY2RfYmNfdGJsKTsKQEAgLTEzOSw3ICsxMzcsNiBAQAogCiAJcHJpdi0+aHdfcGFyYW1zLmh0NDBfY2hhbm5lbCA9ICBCSVQoSUVFRTgwMjExX0JBTkRfMkdIWikgfAogCQkJCQlCSVQoSUVFRTgwMjExX0JBTkRfNUdIWik7Ci0JcHJpdi0+aHdfcGFyYW1zLnJ4X3dydF9wdHJfcmVnID0gRkhfUlNDU1JfQ0hOTDBfV1BUUjsKIAogCXByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7CiAJaWYgKHByaXYtPmNmZy0+cnhfd2l0aF9zaXNvX2RpdmVyc2l0eSkKQEAgLTE3MSwxNSArMTY4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpd2xfbGliX29wcyBpd2wxMDAwX2xpYiA9IHsKIAkuc2V0X2h3X3BhcmFtcyA9IGl3bDEwMDBfaHdfc2V0X2h3X3BhcmFtcywKLQkucnhfaGFuZGxlcl9zZXR1cCA9IGl3bGFnbl9yeF9oYW5kbGVyX3NldHVwLAotCS5zZXR1cF9kZWZlcnJlZF93b3JrID0gaXdsYWduX3NldHVwX2RlZmVycmVkX3dvcmssCi0JLmlzX3ZhbGlkX3J0Y19kYXRhX2FkZHIgPSBpd2xhZ25faHdfdmFsaWRfcnRjX2RhdGFfYWRkciwKLQkuc2VuZF90eF9wb3dlciA9IGl3bGFnbl9zZW5kX3R4X3Bvd2VyLAotCS51cGRhdGVfY2hhaW5fZmxhZ3MgPSBpd2xfdXBkYXRlX2NoYWluX2ZsYWdzLAotCS5hcG1fb3BzID0gewotCQkuaW5pdCA9IGl3bF9hcG1faW5pdCwKLQkJLmNvbmZpZyA9IGl3bDEwMDBfbmljX2NvbmZpZywKLQl9LAorCS5uaWNfY29uZmlnID0gaXdsMTAwMF9uaWNfY29uZmlnLAogCS5lZXByb21fb3BzID0gewogCQkucmVndWxhdG9yeV9iYW5kcyA9IHsKIAkJCUVFUFJPTV9SRUdfQkFORF8xX0NIQU5ORUxTLApAQCAtMTkwLDE5ICsxNzksOCBAQAogCQkJRUVQUk9NX1JFR19CQU5EXzI0X0hUNDBfQ0hBTk5FTFMsCiAJCQlFRVBST01fUkVHVUxBVE9SWV9CQU5EX05PX0hUNDAsCiAJCX0sCi0JCS5xdWVyeV9hZGRyID0gaXdsYWduX2VlcHJvbV9xdWVyeV9hZGRyLAogCX0sCi0JLnRlbXBfb3BzID0gewotCQkudGVtcGVyYXR1cmUgPSBpd2xhZ25fdGVtcGVyYXR1cmUsCi0JIH0sCi0JLnR4Zmlmb19mbHVzaCA9IGl3bGFnbl90eGZpZm9fZmx1c2gsCi0JLmRldl90eGZpZm9fZmx1c2ggPSBpd2xhZ25fZGV2X3R4Zmlmb19mbHVzaCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX29wcyBpd2wxMDAwX29wcyA9IHsKLQkubGliID0gJml3bDEwMDBfbGliLAotCS5oY21kID0gJml3bGFnbl9oY21kLAotCS51dGlscyA9ICZpd2xhZ25faGNtZF91dGlscywKKwkudGVtcGVyYXR1cmUgPSBpd2xhZ25fdGVtcGVyYXR1cmUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGl3bF9iYXNlX3BhcmFtcyBpd2wxMDAwX2Jhc2VfcGFyYW1zID0gewpAQCAtMjIzLDYgKzIwMSw3IEBACiBzdGF0aWMgc3RydWN0IGl3bF9odF9wYXJhbXMgaXdsMTAwMF9odF9wYXJhbXMgPSB7CiAJLmh0X2dyZWVuZmllbGRfc3VwcG9ydCA9IHRydWUsCiAJLnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uID0gdHJ1ZSwgLyogdXNlIHJ0cy9jdHMgcHJvdGVjdGlvbiAqLworCS5zbXBzX21vZGUgPSBJRUVFODAyMTFfU01QU19TVEFUSUMsCiB9OwogCiAjZGVmaW5lIElXTF9ERVZJQ0VfMTAwMAkJCQkJCVwKQEAgLTIzMSw3ICsyMTAsNyBAQAogCS51Y29kZV9hcGlfbWluID0gSVdMMTAwMF9VQ09ERV9BUElfTUlOLAkJCVwKIAkuZWVwcm9tX3ZlciA9IEVFUFJPTV8xMDAwX0VFUFJPTV9WRVJTSU9OLAkJXAogCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzEwMDBfVFhfUE9XRVJfVkVSU0lPTiwJXAotCS5vcHMgPSAmaXdsMTAwMF9vcHMsCQkJCQlcCisJLmxpYiA9ICZpd2wxMDAwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsMTAwMF9iYXNlX3BhcmFtcywJCQlcCiAJLmxlZF9tb2RlID0gSVdMX0xFRF9CTElOSwogCkBAIC0yNTIsNyArMjMxLDcgQEAKIAkudWNvZGVfYXBpX21pbiA9IElXTDEwMF9VQ09ERV9BUElfTUlOLAkJCVwKIAkuZWVwcm9tX3ZlciA9IEVFUFJPTV8xMDAwX0VFUFJPTV9WRVJTSU9OLAkJXAogCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzEwMDBfVFhfUE9XRVJfVkVSU0lPTiwJXAotCS5vcHMgPSAmaXdsMTAwMF9vcHMsCQkJCQlcCisJLmxpYiA9ICZpd2wxMDAwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsMTAwMF9iYXNlX3BhcmFtcywJCQlcCiAJLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURSwJCQkJXAogCS5yeF93aXRoX3Npc29fZGl2ZXJzaXR5ID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMjAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMjAwMC5jCmluZGV4IDg2ZmVlYzguLjBlMTNmMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTIwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMKQEAgLTI3LDggKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpAQCAtMzYsNiArMzQsNyBAQAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogCiAjaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgogI2luY2x1ZGUgIml3bC1kZXYuaCIKQEAgLTUxLDIwICs1MCwyNSBAQAogI2RlZmluZSBJV0wyMDMwX1VDT0RFX0FQSV9NQVggNQogI2RlZmluZSBJV0wyMDAwX1VDT0RFX0FQSV9NQVggNQogI2RlZmluZSBJV0wxMDVfVUNPREVfQVBJX01BWCA1CisjZGVmaW5lIElXTDEzNV9VQ09ERV9BUElfTUFYIDUKIAogLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwogI2RlZmluZSBJV0wyMDMwX1VDT0RFX0FQSV9NSU4gNQogI2RlZmluZSBJV0wyMDAwX1VDT0RFX0FQSV9NSU4gNQogI2RlZmluZSBJV0wxMDVfVUNPREVfQVBJX01JTiA1CisjZGVmaW5lIElXTDEzNV9VQ09ERV9BUElfTUlOIDUKIAogI2RlZmluZSBJV0wyMDMwX0ZXX1BSRSAiaXdsd2lmaS0yMDMwLSIKLSNkZWZpbmUgSVdMMjAzMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0wyMDMwX0ZXX1BSRSAjYXBpICIudWNvZGUiCisjZGVmaW5lIElXTDIwMzBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMMjAzMF9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiAjZGVmaW5lIElXTDIwMDBfRldfUFJFICJpd2x3aWZpLTIwMDAtIgotI2RlZmluZSBJV0wyMDAwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDIwMDBfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMMjAwMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0wyMDAwX0ZXX1BSRSBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKICNkZWZpbmUgSVdMMTA1X0ZXX1BSRSAiaXdsd2lmaS0xMDUtIgotI2RlZmluZSBJV0wxMDVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMMTA1X0ZXX1BSRSAjYXBpICIudWNvZGUiCisjZGVmaW5lIElXTDEwNV9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0wxMDVfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKKworI2RlZmluZSBJV0wxMzVfRldfUFJFICJpd2x3aWZpLTEzNS0iCisjZGVmaW5lIElXTDEzNV9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0wxMzVfRldfUFJFICNhcGkgIi51Y29kZSIKIAogc3RhdGljIHZvaWQgaXdsMjAwMF9zZXRfY3RfdGhyZXNob2xkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKQEAgLTc2LDI4ICs4MCwxMSBAQAogLyogTklDIGNvbmZpZ3VyYXRpb24gZm9yIDIwMDAgc2VyaWVzICovCiBzdGF0aWMgdm9pZCBpd2wyMDAwX25pY19jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCXUxNiByYWRpb19jZmc7Ci0KLQlyYWRpb19jZmcgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1JBRElPX0NPTkZJRyk7Ci0KLQkvKiB3cml0ZSByYWRpbyBjb25maWcgdmFsdWVzIHRvIHJlZ2lzdGVyICovCi0JaWYgKEVFUFJPTV9SRl9DRkdfVFlQRV9NU0socmFkaW9fY2ZnKSA8PSBFRVBST01fUkZfQ09ORklHX1RZUEVfTUFYKQotCWl3bF9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJRUVQUk9NX1JGX0NGR19UWVBFX01TSyhyYWRpb19jZmcpIHwKLQkJCUVFUFJPTV9SRl9DRkdfU1RFUF9NU0socmFkaW9fY2ZnKSB8Ci0JCQlFRVBST01fUkZfQ0ZHX0RBU0hfTVNLKHJhZGlvX2NmZykpOwotCi0JLyogc2V0IENTUl9IV19DT05GSUdfUkVHIGZvciB1Q29kZSB1c2UgKi8KLQlpd2xfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJICAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9SQURJT19TSSB8Ci0JCSAgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTUFDX1NJKTsKKwlpd2xfcmZfY29uZmlnKHByaXYpOwogCiAJaWYgKHByaXYtPmNmZy0+aXFfaW52ZXJ0KQogCQlpd2xfc2V0X2JpdChwcml2LCBDU1JfR1BfRFJJVkVSX1JFRywKIAkJCSAgICBDU1JfR1BfRFJJVkVSX1JFR19CSVRfUkFESU9fSVFfSU5WRVIpOwotCi0JaWYgKHByaXYtPmNmZy0+ZGlzYWJsZV9vdHBfcmVmcmVzaCkKLQkJaXdsX3dyaXRlX3BycGgocHJpdiwgQVBNR19BTkFMT0dfU1ZSX1JFRywgMHg4MDAwMDAxMCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X3JhbmdlcyBpd2wyMDAwX3NlbnNpdGl2aXR5ID0gewpAQCAtMTMzLDcgKzEyMCw2IEBACiAJCQlpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzOwogCiAJcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKLQlwcml2LT5od19wYXJhbXMuZG1hX2NobmxfbnVtID0gRkg1MF9UQ1NSX0NITkxfTlVNOwogCXByaXYtPmh3X3BhcmFtcy5zY2RfYmNfdGJsc19zaXplID0KIAkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqCiAJCXNpemVvZihzdHJ1Y3QgaXdsYWduX3NjZF9iY190YmwpOwpAQCAtMTQ2LDcgKzEzMiw2IEBACiAKIAlwcml2LT5od19wYXJhbXMuaHQ0MF9jaGFubmVsID0gIEJJVChJRUVFODAyMTFfQkFORF8yR0haKSB8CiAJCQkJCUJJVChJRUVFODAyMTFfQkFORF81R0haKTsKLQlwcml2LT5od19wYXJhbXMucnhfd3J0X3B0cl9yZWcgPSBGSF9SU0NTUl9DSE5MMF9XUFRSOwogCiAJcHJpdi0+aHdfcGFyYW1zLnR4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KHByaXYtPmNmZy0+dmFsaWRfdHhfYW50KTsKIAlpZiAocHJpdi0+Y2ZnLT5yeF93aXRoX3Npc29fZGl2ZXJzaXR5KQpAQCAtMTY4LDcgKzE1Myw3IEBACiAJCUJJVChJV0xfQ0FMSUJfVFhfSVEpICAgICAgICAgICAgfAogCQlCSVQoSVdMX0NBTElCX0JBU0VfQkFORCk7CiAJaWYgKHByaXYtPmNmZy0+bmVlZF9kY19jYWxpYikKLQkJcHJpdi0+aHdfcGFyYW1zLmNhbGliX3J0X2NmZyB8PSBCSVQoSVdMX0NBTElCX0NGR19EQ19JRFgpOworCQlwcml2LT5od19wYXJhbXMuY2FsaWJfcnRfY2ZnIHw9IElXTF9DQUxJQl9DRkdfRENfSURYOwogCWlmIChwcml2LT5jZmctPm5lZWRfdGVtcF9vZmZzZXRfY2FsaWIpCiAJCXByaXYtPmh3X3BhcmFtcy5jYWxpYl9pbml0X2NmZyB8PSBCSVQoSVdMX0NBTElCX1RFTVBfT0ZGU0VUKTsKIApAQCAtMTc3LDkyICsxNjIsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGl3bDIwMzBfaHdfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGl3bF9wcml2ICpwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKQotewotCS8qCi0JICogTVVMVEktRklYTUUKLQkgKiBTZWUgaXdsX21hY19jaGFubmVsX3N3aXRjaC4KLQkgKi8KLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpd2w2MDAwX2NoYW5uZWxfc3dpdGNoX2NtZCBjbWQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0JdTMyIHN3aXRjaF90aW1lX2luX3VzZWMsIHVjb2RlX3N3aXRjaF90aW1lOwotCXUxNiBjaDsKLQl1MzIgdHNmX2xvdzsKLQl1OCBzd2l0Y2hfY291bnQ7Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCk7Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHsKLQkJLmlkID0gUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsCi0JCS5sZW4gPSB7IHNpemVvZihjbWQpLCB9LAotCQkuZmxhZ3MgPSBDTURfU1lOQywKLQkJLmRhdGEgPSB7ICZjbWQsIH0sCi0JfTsKLQotCWNtZC5iYW5kID0gcHJpdi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haOwotCWNoID0gY2hfc3dpdGNoLT5jaGFubmVsLT5od192YWx1ZTsKLQlJV0xfREVCVUdfMTFIKHByaXYsICJjaGFubmVsIHN3aXRjaCBmcm9tICV1IHRvICV1XG4iLAotCQljdHgtPmFjdGl2ZS5jaGFubmVsLCBjaCk7Ci0JY21kLmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7Ci0JY21kLnJ4b25fZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmxhZ3M7Ci0JY21kLnJ4b25fZmlsdGVyX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFnczsKLQlzd2l0Y2hfY291bnQgPSBjaF9zd2l0Y2gtPmNvdW50OwotCXRzZl9sb3cgPSBjaF9zd2l0Y2gtPnRpbWVzdGFtcCAmIDB4MGZmZmZmZmZmOwotCS8qCi0JICogY2FsY3VsYXRlIHRoZSB1Y29kZSBjaGFubmVsIHN3aXRjaCB0aW1lCi0JICogYWRkaW5nIFRTRiBhcyBvbmUgb2YgdGhlIGZhY3RvciBmb3Igd2hlbiB0byBzd2l0Y2gKLQkgKi8KLQlpZiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lID4gdHNmX2xvdykgJiYgYmVhY29uX2ludGVydmFsKSB7Ci0JCWlmIChzd2l0Y2hfY291bnQgPiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lIC0gdHNmX2xvdykgLwotCQkgICAgYmVhY29uX2ludGVydmFsKSkgewotCQkJc3dpdGNoX2NvdW50IC09IChwcml2LT51Y29kZV9iZWFjb25fdGltZSAtCi0JCQkJdHNmX2xvdykgLyBiZWFjb25faW50ZXJ2YWw7Ci0JCX0gZWxzZQotCQkJc3dpdGNoX2NvdW50ID0gMDsKLQl9Ci0JaWYgKHN3aXRjaF9jb3VudCA8PSAxKQotCQljbWQuc3dpdGNoX3RpbWUgPSBjcHVfdG9fbGUzMihwcml2LT51Y29kZV9iZWFjb25fdGltZSk7Ci0JZWxzZSB7Ci0JCXN3aXRjaF90aW1lX2luX3VzZWMgPQotCQkJdmlmLT5ic3NfY29uZi5iZWFjb25faW50ICogc3dpdGNoX2NvdW50ICogVElNRV9VTklUOwotCQl1Y29kZV9zd2l0Y2hfdGltZSA9IGl3bF91c2Vjc190b19iZWFjb25zKHByaXYsCi0JCQkJCQlzd2l0Y2hfdGltZV9pbl91c2VjLAotCQkJCQkJYmVhY29uX2ludGVydmFsKTsKLQkJY21kLnN3aXRjaF90aW1lID0gaXdsX2FkZF9iZWFjb25fdGltZShwcml2LAotCQkJCQkJcHJpdi0+dWNvZGVfYmVhY29uX3RpbWUsCi0JCQkJCQl1Y29kZV9zd2l0Y2hfdGltZSwKLQkJCQkJCWJlYWNvbl9pbnRlcnZhbCk7Ci0JfQotCUlXTF9ERUJVR18xMUgocHJpdiwgInVDb2RlIHRpbWUgZm9yIHRoZSBzd2l0Y2ggaXMgMHgleFxuIiwKLQkJICAgICAgY21kLnN3aXRjaF90aW1lKTsKLQljaF9pbmZvID0gaXdsX2dldF9jaGFubmVsX2luZm8ocHJpdiwgcHJpdi0+YmFuZCwgY2gpOwotCWlmIChjaF9pbmZvKQotCQljbWQuZXhwZWN0X2JlYWNvbiA9IGlzX2NoYW5uZWxfcmFkYXIoY2hfaW5mbyk7Ci0JZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgImludmFsaWQgY2hhbm5lbCBzd2l0Y2ggZnJvbSAldSB0byAldVxuIiwKLQkJCWN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgPSBjbWQuY2hhbm5lbDsKLQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSB0cnVlOwotCi0JcmV0dXJuIGl3bF9zZW5kX2NtZF9zeW5jKHByaXYsICZoY21kKTsKLX0KLQogc3RhdGljIHN0cnVjdCBpd2xfbGliX29wcyBpd2wyMDAwX2xpYiA9IHsKIAkuc2V0X2h3X3BhcmFtcyA9IGl3bDIwMDBfaHdfc2V0X2h3X3BhcmFtcywKLQkucnhfaGFuZGxlcl9zZXR1cCA9IGl3bGFnbl9yeF9oYW5kbGVyX3NldHVwLAotCS5zZXR1cF9kZWZlcnJlZF93b3JrID0gaXdsYWduX2J0X3NldHVwX2RlZmVycmVkX3dvcmssCi0JLmNhbmNlbF9kZWZlcnJlZF93b3JrID0gaXdsYWduX2J0X2NhbmNlbF9kZWZlcnJlZF93b3JrLAotCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaXdsYWduX2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIsCi0JLnNlbmRfdHhfcG93ZXIgPSBpd2xhZ25fc2VuZF90eF9wb3dlciwKLQkudXBkYXRlX2NoYWluX2ZsYWdzID0gaXdsX3VwZGF0ZV9jaGFpbl9mbGFncywKLQkuc2V0X2NoYW5uZWxfc3dpdGNoID0gaXdsMjAzMF9od19jaGFubmVsX3N3aXRjaCwKLQkuYXBtX29wcyA9IHsKLQkJLmluaXQgPSBpd2xfYXBtX2luaXQsCi0JCS5jb25maWcgPSBpd2wyMDAwX25pY19jb25maWcsCi0JfSwKKwkubmljX2NvbmZpZyA9IGl3bDIwMDBfbmljX2NvbmZpZywKIAkuZWVwcm9tX29wcyA9IHsKIAkJLnJlZ3VsYXRvcnlfYmFuZHMgPSB7CiAJCQlFRVBST01fUkVHX0JBTkRfMV9DSEFOTkVMUywKQEAgLTI3MywzOCArMTc1LDMwIEBACiAJCQlFRVBST01fNjAwMF9SRUdfQkFORF8yNF9IVDQwX0NIQU5ORUxTLAogCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwLAogCQl9LAotCQkucXVlcnlfYWRkciA9IGl3bGFnbl9lZXByb21fcXVlcnlfYWRkciwKIAkJLnVwZGF0ZV9lbmhhbmNlZF90eHBvd2VyID0gaXdsY29yZV9lZXByb21fZW5oYW5jZWRfdHhwb3dlciwKIAl9LAotCS50ZW1wX29wcyA9IHsKLQkJLnRlbXBlcmF0dXJlID0gaXdsYWduX3RlbXBlcmF0dXJlLAorCS50ZW1wZXJhdHVyZSA9IGl3bGFnbl90ZW1wZXJhdHVyZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXdsX2xpYl9vcHMgaXdsMjAzMF9saWIgPSB7CisJLnNldF9od19wYXJhbXMgPSBpd2wyMDAwX2h3X3NldF9od19wYXJhbXMsCisJLmJ0X3J4X2hhbmRsZXJfc2V0dXAgPSBpd2xhZ25fYnRfcnhfaGFuZGxlcl9zZXR1cCwKKwkuYnRfc2V0dXBfZGVmZXJyZWRfd29yayA9IGl3bGFnbl9idF9zZXR1cF9kZWZlcnJlZF93b3JrLAorCS5jYW5jZWxfZGVmZXJyZWRfd29yayA9IGl3bGFnbl9idF9jYW5jZWxfZGVmZXJyZWRfd29yaywKKwkubmljX2NvbmZpZyA9IGl3bDIwMDBfbmljX2NvbmZpZywKKwkuZWVwcm9tX29wcyA9IHsKKwkJLnJlZ3VsYXRvcnlfYmFuZHMgPSB7CisJCQlFRVBST01fUkVHX0JBTkRfMV9DSEFOTkVMUywKKwkJCUVFUFJPTV9SRUdfQkFORF8yX0NIQU5ORUxTLAorCQkJRUVQUk9NX1JFR19CQU5EXzNfQ0hBTk5FTFMsCisJCQlFRVBST01fUkVHX0JBTkRfNF9DSEFOTkVMUywKKwkJCUVFUFJPTV9SRUdfQkFORF81X0NIQU5ORUxTLAorCQkJRUVQUk9NXzYwMDBfUkVHX0JBTkRfMjRfSFQ0MF9DSEFOTkVMUywKKwkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCwKKwkJfSwKKwkJLnVwZGF0ZV9lbmhhbmNlZF90eHBvd2VyID0gaXdsY29yZV9lZXByb21fZW5oYW5jZWRfdHhwb3dlciwKIAl9LAotCS50eGZpZm9fZmx1c2ggPSBpd2xhZ25fdHhmaWZvX2ZsdXNoLAotCS5kZXZfdHhmaWZvX2ZsdXNoID0gaXdsYWduX2Rldl90eGZpZm9fZmx1c2gsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9vcHMgaXdsMjAwMF9vcHMgPSB7Ci0JLmxpYiA9ICZpd2wyMDAwX2xpYiwKLQkuaGNtZCA9ICZpd2xhZ25faGNtZCwKLQkudXRpbHMgPSAmaXdsYWduX2hjbWRfdXRpbHMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9vcHMgaXdsMjAzMF9vcHMgPSB7Ci0JLmxpYiA9ICZpd2wyMDAwX2xpYiwKLQkuaGNtZCA9ICZpd2xhZ25fYnRfaGNtZCwKLQkudXRpbHMgPSAmaXdsYWduX2hjbWRfdXRpbHMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9vcHMgaXdsMTA1X29wcyA9IHsKLQkubGliID0gJml3bDIwMDBfbGliLAotCS5oY21kID0gJml3bGFnbl9oY21kLAotCS51dGlscyA9ICZpd2xhZ25faGNtZF91dGlscywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX29wcyBpd2wxMzVfb3BzID0gewotCS5saWIgPSAmaXdsMjAwMF9saWIsCi0JLmhjbWQgPSAmaXdsYWduX2J0X2hjbWQsCi0JLnV0aWxzID0gJml3bGFnbl9oY21kX3V0aWxzLAorCS50ZW1wZXJhdHVyZSA9IGl3bGFnbl90ZW1wZXJhdHVyZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zIGl3bDIwMDBfYmFzZV9wYXJhbXMgPSB7CkBAIC0zNjUsMTMgKzI1OSwxMiBAQAogCS51Y29kZV9hcGlfbWluID0gSVdMMjAwMF9VQ09ERV9BUElfTUlOLAkJCVwKIAkuZWVwcm9tX3ZlciA9IEVFUFJPTV8yMDAwX0VFUFJPTV9WRVJTSU9OLAkJXAogCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzIwMDBfVFhfUE9XRVJfVkVSU0lPTiwJXAotCS5vcHMgPSAmaXdsMjAwMF9vcHMsCQkJCQlcCisJLmxpYiA9ICZpd2wyMDAwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsMjAwMF9iYXNlX3BhcmFtcywJCQlcCiAJLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliID0gdHJ1ZSwJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKLQkuaXFfaW52ZXJ0ID0gdHJ1ZSwJCQkJCVwKLQkuZGlzYWJsZV9vdHBfcmVmcmVzaCA9IHRydWUJCQkJXAorCS5pcV9pbnZlcnQgPSB0cnVlCQkJCQlcCiAKIHN0cnVjdCBpd2xfY2ZnIGl3bDIwMDBfMmJnbl9jZmcgPSB7CiAJLm5hbWUgPSAiMjAwMCBTZXJpZXMgMngyIEJHTiIsCkBAIC0zOTAsNyArMjgzLDcgQEAKIAkudWNvZGVfYXBpX21pbiA9IElXTDIwMzBfVUNPREVfQVBJX01JTiwJCQlcCiAJLmVlcHJvbV92ZXIgPSBFRVBST01fMjAwMF9FRVBST01fVkVSU0lPTiwJCVwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV8yMDAwX1RYX1BPV0VSX1ZFUlNJT04sCVwKLQkub3BzID0gJml3bDIwMzBfb3BzLAkJCQkJXAorCS5saWIgPSAmaXdsMjAzMF9saWIsCQkJCQlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDIwMzBfYmFzZV9wYXJhbXMsCQkJXAogCS5idF9wYXJhbXMgPSAmaXdsMjAzMF9idF9wYXJhbXMsCQkJXAogCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwJCQkJCVwKQEAgLTQxNiwxMyArMzA5LDE0IEBACiAJLnVjb2RlX2FwaV9taW4gPSBJV0wxMDVfVUNPREVfQVBJX01JTiwJCQlcCiAJLmVlcHJvbV92ZXIgPSBFRVBST01fMjAwMF9FRVBST01fVkVSU0lPTiwJCVwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV8yMDAwX1RYX1BPV0VSX1ZFUlNJT04sCVwKLQkub3BzID0gJml3bDEwNV9vcHMsCQkJCQlcCisJLmxpYiA9ICZpd2wyMDAwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsMjAwMF9iYXNlX3BhcmFtcywJCQlcCiAJLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliID0gdHJ1ZSwJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKIAkuYWR2X3BtID0gdHJ1ZSwJCQkJCQlcCi0JLnJ4X3dpdGhfc2lzb19kaXZlcnNpdHkgPSB0cnVlCQkJCVwKKwkucnhfd2l0aF9zaXNvX2RpdmVyc2l0eSA9IHRydWUsCQkJCVwKKwkuaXFfaW52ZXJ0ID0gdHJ1ZQkJCQkJXAogCiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDVfYmdfY2ZnID0gewogCS5uYW1lID0gIjEwNSBTZXJpZXMgMXgxIEJHIiwKQEAgLTQzNiwyNyArMzMwLDI4IEBACiB9OwogCiAjZGVmaW5lIElXTF9ERVZJQ0VfMTM1CQkJCQkJXAotCS5md19uYW1lX3ByZSA9IElXTDEwNV9GV19QUkUsCQkJCVwKLQkudWNvZGVfYXBpX21heCA9IElXTDEwNV9VQ09ERV9BUElfTUFYLAkJCVwKLQkudWNvZGVfYXBpX21pbiA9IElXTDEwNV9VQ09ERV9BUElfTUlOLAkJCVwKKwkuZndfbmFtZV9wcmUgPSBJV0wxMzVfRldfUFJFLAkJCQlcCisJLnVjb2RlX2FwaV9tYXggPSBJV0wxMzVfVUNPREVfQVBJX01BWCwJCQlcCisJLnVjb2RlX2FwaV9taW4gPSBJV0wxMzVfVUNPREVfQVBJX01JTiwJCQlcCiAJLmVlcHJvbV92ZXIgPSBFRVBST01fMjAwMF9FRVBST01fVkVSU0lPTiwJCVwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV8yMDAwX1RYX1BPV0VSX1ZFUlNJT04sCVwKLQkub3BzID0gJml3bDEzNV9vcHMsCQkJCQlcCisJLmxpYiA9ICZpd2wyMDMwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsMjAzMF9iYXNlX3BhcmFtcywJCQlcCiAJLmJ0X3BhcmFtcyA9ICZpd2wyMDMwX2J0X3BhcmFtcywJCQlcCiAJLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliID0gdHJ1ZSwJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKIAkuYWR2X3BtID0gdHJ1ZSwJCQkJCQlcCi0JLnJ4X3dpdGhfc2lzb19kaXZlcnNpdHkgPSB0cnVlCQkJCVwKKwkucnhfd2l0aF9zaXNvX2RpdmVyc2l0eSA9IHRydWUsCQkJCVwKKwkuaXFfaW52ZXJ0ID0gdHJ1ZQkJCQkJXAogCiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMzVfYmdfY2ZnID0gewotCS5uYW1lID0gIjEwNSBTZXJpZXMgMXgxIEJHL0JUIiwKKwkubmFtZSA9ICIxMzUgU2VyaWVzIDF4MSBCRy9CVCIsCiAJSVdMX0RFVklDRV8xMzUsCiB9OwogCiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMzVfYmduX2NmZyA9IHsKLQkubmFtZSA9ICIxMDUgU2VyaWVzIDF4MSBCR04vQlQiLAorCS5uYW1lID0gIjEzNSBTZXJpZXMgMXgxIEJHTi9CVCIsCiAJSVdMX0RFVklDRV8xMzUsCiAJLmh0X3BhcmFtcyA9ICZpd2wyMDAwX2h0X3BhcmFtcywKIH07CkBAIC00NjQsMyArMzU5LDQgQEAKIE1PRFVMRV9GSVJNV0FSRShJV0wyMDAwX01PRFVMRV9GSVJNV0FSRShJV0wyMDAwX1VDT0RFX0FQSV9NQVgpKTsKIE1PRFVMRV9GSVJNV0FSRShJV0wyMDMwX01PRFVMRV9GSVJNV0FSRShJV0wyMDMwX1VDT0RFX0FQSV9NQVgpKTsKIE1PRFVMRV9GSVJNV0FSRShJV0wxMDVfTU9EVUxFX0ZJUk1XQVJFKElXTDEwNV9VQ09ERV9BUElfTUFYKSk7CitNT0RVTEVfRklSTVdBUkUoSVdMMTM1X01PRFVMRV9GSVJNV0FSRShJV0wxMzVfVUNPREVfQVBJX01BWCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC1ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC1ody5oCmluZGV4IDA1YWQ0NzYuLmY5NjMwYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAtaHcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLWh3LmgKQEAgLTc1LDcgKzc1LDcgQEAKIHsKIAl1MTYgdGVtcGVyYXR1cmUsIHZvbHRhZ2U7CiAJX19sZTE2ICp0ZW1wX2NhbGliID0KLQkJKF9fbGUxNiAqKWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LCBFRVBST01fNTAwMF9URU1QRVJBVFVSRSk7CisJCShfX2xlMTYgKilpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgRUVQUk9NX1RFTVBFUkFUVVJFKTsKIAogCXRlbXBlcmF0dXJlID0gbGUxNl90b19jcHUodGVtcF9jYWxpYlswXSk7CiAJdm9sdGFnZSA9IGxlMTZfdG9fY3B1KHRlbXBfY2FsaWJbMV0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCmluZGV4IGE3MGI4Y2YuLjNlZWIxMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKQEAgLTI3LDggKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC0zNyw2ICszNSw3IEBACiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAKICNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCiAjaW5jbHVkZSAiaXdsLWRldi5oIgpAQCAtNDcsNiArNDYsNyBAQAogI2luY2x1ZGUgIml3bC1hZ24uaCIKICNpbmNsdWRlICJpd2wtYWduLWh3LmgiCiAjaW5jbHVkZSAiaXdsLTUwMDAtaHcuaCIKKyNpbmNsdWRlICJpd2wtdHJhbnMuaCIKIAogLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgSVdMNTAwMF9VQ09ERV9BUElfTUFYIDUKQEAgLTU3LDMzICs1NywyMCBAQAogI2RlZmluZSBJV0w1MTUwX1VDT0RFX0FQSV9NSU4gMQogCiAjZGVmaW5lIElXTDUwMDBfRldfUFJFICJpd2x3aWZpLTUwMDAtIgotI2RlZmluZSBJV0w1MDAwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDUwMDBfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMNTAwMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w1MDAwX0ZXX1BSRSBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKICNkZWZpbmUgSVdMNTE1MF9GV19QUkUgIml3bHdpZmktNTE1MC0iCi0jZGVmaW5lIElXTDUxNTBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNTE1MF9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0w1MTUwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDUxNTBfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogLyogTklDIGNvbmZpZ3VyYXRpb24gZm9yIDUwMDAgc2VyaWVzICovCiBzdGF0aWMgdm9pZCBpd2w1MDAwX25pY19jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IHJhZGlvX2NmZzsKKworCWl3bF9yZl9jb25maWcocHJpdik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JcmFkaW9fY2ZnID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9SQURJT19DT05GSUcpOwotCi0JLyogd3JpdGUgcmFkaW8gY29uZmlnIHZhbHVlcyB0byByZWdpc3RlciAqLwotCWlmIChFRVBST01fUkZfQ0ZHX1RZUEVfTVNLKHJhZGlvX2NmZykgPCBFRVBST01fUkZfQ09ORklHX1RZUEVfTUFYKQotCQlpd2xfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCSAgICBFRVBST01fUkZfQ0ZHX1RZUEVfTVNLKHJhZGlvX2NmZykgfAotCQkJICAgIEVFUFJPTV9SRl9DRkdfU1RFUF9NU0socmFkaW9fY2ZnKSB8Ci0JCQkgICAgRUVQUk9NX1JGX0NGR19EQVNIX01TSyhyYWRpb19jZmcpKTsKLQotCS8qIHNldCBDU1JfSFdfQ09ORklHX1JFRyBmb3IgdUNvZGUgdXNlICovCi0JaXdsX3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCSAgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfUkFESU9fU0kgfAotCQkgICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX01BQ19TSSk7Ci0KIAkvKiBXL0EgOiBOSUMgaXMgc3R1Y2sgaW4gYSByZXNldCBzdGF0ZSBhZnRlciBFYXJseSBQQ0llIHBvd2VyIG9mZgogCSAqIChQQ0llIHBvd2VyIGlzIGxvc3QgYmVmb3JlIFBFUlNUIyBpcyBhc3NlcnRlZCksCiAJICogY2F1c2luZyBNRSBGVyB0byBsb3NlIG93bmVyc2hpcCBhbmQgbm90IGJlaW5nIGFibGUgdG8gb2J0YWluIGl0IGJhY2suCkBAIC0xNzAsNyArMTU3LDYgQEAKIAkJCWl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXM7CiAKIAlwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0gPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwotCXByaXYtPmh3X3BhcmFtcy5kbWFfY2hubF9udW0gPSBGSDUwX1RDU1JfQ0hOTF9OVU07CiAJcHJpdi0+aHdfcGFyYW1zLnNjZF9iY190YmxzX3NpemUgPQogCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqCiAJCQlzaXplb2Yoc3RydWN0IGl3bGFnbl9zY2RfYmNfdGJsKTsKQEAgLTE4Myw3ICsxNjksNiBAQAogCiAJcHJpdi0+aHdfcGFyYW1zLmh0NDBfY2hhbm5lbCA9ICBCSVQoSUVFRTgwMjExX0JBTkRfMkdIWikgfAogCQkJCQlCSVQoSUVFRTgwMjExX0JBTkRfNUdIWik7Ci0JcHJpdi0+aHdfcGFyYW1zLnJ4X3dydF9wdHJfcmVnID0gRkhfUlNDU1JfQ0hOTDBfV1BUUjsKIAogCXByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7CiAJcHJpdi0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KHByaXYtPmNmZy0+dmFsaWRfcnhfYW50KTsKQEAgLTIxNSw3ICsyMDAsNiBAQAogCQkJaXdsYWduX21vZF9wYXJhbXMubnVtX29mX3F1ZXVlczsKIAogCXByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bSA9IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7Ci0JcHJpdi0+aHdfcGFyYW1zLmRtYV9jaG5sX251bSA9IEZINTBfVENTUl9DSE5MX05VTTsKIAlwcml2LT5od19wYXJhbXMuc2NkX2JjX3RibHNfc2l6ZSA9CiAJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzICoKIAkJCXNpemVvZihzdHJ1Y3QgaXdsYWduX3NjZF9iY190YmwpOwpAQCAtMjI4LDcgKzIxMiw2IEBACiAKIAlwcml2LT5od19wYXJhbXMuaHQ0MF9jaGFubmVsID0gIEJJVChJRUVFODAyMTFfQkFORF8yR0haKSB8CiAJCQkJCUJJVChJRUVFODAyMTFfQkFORF81R0haKTsKLQlwcml2LT5od19wYXJhbXMucnhfd3J0X3B0cl9yZWcgPSBGSF9SU0NTUl9DSE5MMF9XUFRSOwogCiAJcHJpdi0+aHdfcGFyYW1zLnR4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KHByaXYtPmNmZy0+dmFsaWRfdHhfYW50KTsKIAlwcml2LT5od19wYXJhbXMucnhfY2hhaW5zX251bSA9IG51bV9vZl9hbnQocHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpOwpAQCAtMzMxLDI0ICszMTQsMTQgQEAKIAkJCWN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCXByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgPSBjbWQuY2hhbm5lbDsKLQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSB0cnVlOwogCi0JcmV0dXJuIGl3bF9zZW5kX2NtZF9zeW5jKHByaXYsICZoY21kKTsKKwlyZXR1cm4gdHJhbnNfc2VuZF9jbWQoJnByaXYtPnRyYW5zLCAmaGNtZCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXdsX2xpYl9vcHMgaXdsNTAwMF9saWIgPSB7CiAJLnNldF9od19wYXJhbXMgPSBpd2w1MDAwX2h3X3NldF9od19wYXJhbXMsCi0JLnJ4X2hhbmRsZXJfc2V0dXAgPSBpd2xhZ25fcnhfaGFuZGxlcl9zZXR1cCwKLQkuc2V0dXBfZGVmZXJyZWRfd29yayA9IGl3bGFnbl9zZXR1cF9kZWZlcnJlZF93b3JrLAotCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaXdsYWduX2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIsCi0JLnNlbmRfdHhfcG93ZXIgPSBpd2xhZ25fc2VuZF90eF9wb3dlciwKLQkudXBkYXRlX2NoYWluX2ZsYWdzID0gaXdsX3VwZGF0ZV9jaGFpbl9mbGFncywKIAkuc2V0X2NoYW5uZWxfc3dpdGNoID0gaXdsNTAwMF9od19jaGFubmVsX3N3aXRjaCwKLQkuYXBtX29wcyA9IHsKLQkJLmluaXQgPSBpd2xfYXBtX2luaXQsCi0JCS5jb25maWcgPSBpd2w1MDAwX25pY19jb25maWcsCi0JfSwKKwkubmljX2NvbmZpZyA9IGl3bDUwMDBfbmljX2NvbmZpZywKIAkuZWVwcm9tX29wcyA9IHsKIAkJLnJlZ3VsYXRvcnlfYmFuZHMgPSB7CiAJCQlFRVBST01fUkVHX0JBTkRfMV9DSEFOTkVMUywKQEAgLTM1OSwyNyArMzMyLDE0IEBACiAJCQlFRVBST01fUkVHX0JBTkRfMjRfSFQ0MF9DSEFOTkVMUywKIAkJCUVFUFJPTV9SRUdfQkFORF81Ml9IVDQwX0NIQU5ORUxTCiAJCX0sCi0JCS5xdWVyeV9hZGRyID0gaXdsYWduX2VlcHJvbV9xdWVyeV9hZGRyLAogCX0sCi0JLnRlbXBfb3BzID0gewotCQkudGVtcGVyYXR1cmUgPSBpd2xhZ25fdGVtcGVyYXR1cmUsCi0JIH0sCi0JLnR4Zmlmb19mbHVzaCA9IGl3bGFnbl90eGZpZm9fZmx1c2gsCi0JLmRldl90eGZpZm9fZmx1c2ggPSBpd2xhZ25fZGV2X3R4Zmlmb19mbHVzaCwKKwkudGVtcGVyYXR1cmUgPSBpd2xhZ25fdGVtcGVyYXR1cmUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGl3bF9saWJfb3BzIGl3bDUxNTBfbGliID0gewogCS5zZXRfaHdfcGFyYW1zID0gaXdsNTE1MF9od19zZXRfaHdfcGFyYW1zLAotCS5yeF9oYW5kbGVyX3NldHVwID0gaXdsYWduX3J4X2hhbmRsZXJfc2V0dXAsCi0JLnNldHVwX2RlZmVycmVkX3dvcmsgPSBpd2xhZ25fc2V0dXBfZGVmZXJyZWRfd29yaywKLQkuaXNfdmFsaWRfcnRjX2RhdGFfYWRkciA9IGl3bGFnbl9od192YWxpZF9ydGNfZGF0YV9hZGRyLAotCS5zZW5kX3R4X3Bvd2VyID0gaXdsYWduX3NlbmRfdHhfcG93ZXIsCi0JLnVwZGF0ZV9jaGFpbl9mbGFncyA9IGl3bF91cGRhdGVfY2hhaW5fZmxhZ3MsCiAJLnNldF9jaGFubmVsX3N3aXRjaCA9IGl3bDUwMDBfaHdfY2hhbm5lbF9zd2l0Y2gsCi0JLmFwbV9vcHMgPSB7Ci0JCS5pbml0ID0gaXdsX2FwbV9pbml0LAotCQkuY29uZmlnID0gaXdsNTAwMF9uaWNfY29uZmlnLAotCX0sCisJLm5pY19jb25maWcgPSBpd2w1MDAwX25pY19jb25maWcsCiAJLmVlcHJvbV9vcHMgPSB7CiAJCS5yZWd1bGF0b3J5X2JhbmRzID0gewogCQkJRUVQUk9NX1JFR19CQU5EXzFfQ0hBTk5FTFMsCkBAIC0zOTAsMjUgKzM1MCw4IEBACiAJCQlFRVBST01fUkVHX0JBTkRfMjRfSFQ0MF9DSEFOTkVMUywKIAkJCUVFUFJPTV9SRUdfQkFORF81Ml9IVDQwX0NIQU5ORUxTCiAJCX0sCi0JCS5xdWVyeV9hZGRyID0gaXdsYWduX2VlcHJvbV9xdWVyeV9hZGRyLAogCX0sCi0JLnRlbXBfb3BzID0gewotCQkudGVtcGVyYXR1cmUgPSBpd2w1MTUwX3RlbXBlcmF0dXJlLAotCSB9LAotCS50eGZpZm9fZmx1c2ggPSBpd2xhZ25fdHhmaWZvX2ZsdXNoLAotCS5kZXZfdHhmaWZvX2ZsdXNoID0gaXdsYWduX2Rldl90eGZpZm9fZmx1c2gsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9vcHMgaXdsNTAwMF9vcHMgPSB7Ci0JLmxpYiA9ICZpd2w1MDAwX2xpYiwKLQkuaGNtZCA9ICZpd2xhZ25faGNtZCwKLQkudXRpbHMgPSAmaXdsYWduX2hjbWRfdXRpbHMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9vcHMgaXdsNTE1MF9vcHMgPSB7Ci0JLmxpYiA9ICZpd2w1MTUwX2xpYiwKLQkuaGNtZCA9ICZpd2xhZ25faGNtZCwKLQkudXRpbHMgPSAmaXdsYWduX2hjbWRfdXRpbHMsCisJLnRlbXBlcmF0dXJlID0gaXdsNTE1MF90ZW1wZXJhdHVyZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zIGl3bDUwMDBfYmFzZV9wYXJhbXMgPSB7CkBAIC00MjUsNyArMzY4LDYgQEAKIH07CiBzdGF0aWMgc3RydWN0IGl3bF9odF9wYXJhbXMgaXdsNTAwMF9odF9wYXJhbXMgPSB7CiAJLmh0X2dyZWVuZmllbGRfc3VwcG9ydCA9IHRydWUsCi0JLnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uID0gdHJ1ZSwgLyogdXNlIHJ0cy9jdHMgcHJvdGVjdGlvbiAqLwogfTsKIAogI2RlZmluZSBJV0xfREVWSUNFXzUwMDAJCQkJCQlcCkBAIC00MzQsNyArMzc2LDcgQEAKIAkudWNvZGVfYXBpX21pbiA9IElXTDUwMDBfVUNPREVfQVBJX01JTiwJCQlcCiAJLmVlcHJvbV92ZXIgPSBFRVBST01fNTAwMF9FRVBST01fVkVSU0lPTiwJCVwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV81MDAwX1RYX1BPV0VSX1ZFUlNJT04sCVwKLQkub3BzID0gJml3bDUwMDBfb3BzLAkJCQkJXAorCS5saWIgPSAmaXdsNTAwMF9saWIsCQkJCQlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDUwMDBfYmFzZV9wYXJhbXMsCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTksKIApAQCAtNDc3LDcgKzQxOSw3IEBACiAJLnVjb2RlX2FwaV9taW4gPSBJV0w1MDAwX1VDT0RFX0FQSV9NSU4sCiAJLmVlcHJvbV92ZXIgPSBFRVBST01fNTA1MF9FRVBST01fVkVSU0lPTiwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV81MDUwX1RYX1BPV0VSX1ZFUlNJT04sCi0JLm9wcyA9ICZpd2w1MDAwX29wcywKKwkubGliID0gJml3bDUwMDBfbGliLAogCS5iYXNlX3BhcmFtcyA9ICZpd2w1MDAwX2Jhc2VfcGFyYW1zLAogCS5odF9wYXJhbXMgPSAmaXdsNTAwMF9odF9wYXJhbXMsCiAJLmxlZF9tb2RlID0gSVdMX0xFRF9CTElOSywKQEAgLTQ5MCw3ICs0MzIsNyBAQAogCS51Y29kZV9hcGlfbWluID0gSVdMNTE1MF9VQ09ERV9BUElfTUlOLAkJCVwKIAkuZWVwcm9tX3ZlciA9IEVFUFJPTV81MDUwX0VFUFJPTV9WRVJTSU9OLAkJXAogCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzUwNTBfVFhfUE9XRVJfVkVSU0lPTiwJXAotCS5vcHMgPSAmaXdsNTE1MF9vcHMsCQkJCQlcCisJLmxpYiA9ICZpd2w1MTUwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNTAwMF9iYXNlX3BhcmFtcywJCQlcCiAJLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYwppbmRleCBmZGE2ZmUwLi45NzNkMTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jCkBAIC0yNyw4ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KQEAgLTM2LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KIAogI2luY2x1ZGUgIml3bC1lZXByb20uaCIKICNpbmNsdWRlICJpd2wtZGV2LmgiCkBAIC00Niw2ICs0NSw3IEBACiAjaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKICNpbmNsdWRlICJpd2wtYWduLWh3LmgiCiAjaW5jbHVkZSAiaXdsLTYwMDAtaHcuaCIKKyNpbmNsdWRlICJpd2wtdHJhbnMuaCIKIAogLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgSVdMNjAwMF9VQ09ERV9BUElfTUFYIDQKQEAgLTU4LDE2ICs1OCwxNiBAQAogI2RlZmluZSBJV0w2MDAwRzJfVUNPREVfQVBJX01JTiA0CiAKICNkZWZpbmUgSVdMNjAwMF9GV19QUkUgIml3bHdpZmktNjAwMC0iCi0jZGVmaW5lIElXTDYwMDBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNjAwMF9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0w2MDAwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDYwMDBfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogI2RlZmluZSBJV0w2MDUwX0ZXX1BSRSAiaXdsd2lmaS02MDUwLSIKLSNkZWZpbmUgSVdMNjA1MF9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w2MDUwX0ZXX1BSRSAjYXBpICIudWNvZGUiCisjZGVmaW5lIElXTDYwNTBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNjA1MF9GV19QUkUgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiAjZGVmaW5lIElXTDYwMDVfRldfUFJFICJpd2x3aWZpLTYwMDBnMmEtIgotI2RlZmluZSBJV0w2MDA1X01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDYwMDVfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSVdMNjAwNV9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w2MDA1X0ZXX1BSRSBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKICNkZWZpbmUgSVdMNjAzMF9GV19QUkUgIml3bHdpZmktNjAwMGcyYi0iCi0jZGVmaW5lIElXTDYwMzBfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMNjAzMF9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJV0w2MDMwX01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDYwMzBfRldfUFJFIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogc3RhdGljIHZvaWQgaXdsNjAwMF9zZXRfY3RfdGhyZXNob2xkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKQEAgLTk3LDIxICs5Nyw3IEBACiAvKiBOSUMgY29uZmlndXJhdGlvbiBmb3IgNjAwMCBzZXJpZXMgKi8KIHN0YXRpYyB2b2lkIGl3bDYwMDBfbmljX2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JdTE2IHJhZGlvX2NmZzsKLQotCXJhZGlvX2NmZyA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fUkFESU9fQ09ORklHKTsKLQotCS8qIHdyaXRlIHJhZGlvIGNvbmZpZyB2YWx1ZXMgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoRUVQUk9NX1JGX0NGR19UWVBFX01TSyhyYWRpb19jZmcpIDw9IEVFUFJPTV9SRl9DT05GSUdfVFlQRV9NQVgpCi0JCWl3bF9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJICAgIEVFUFJPTV9SRl9DRkdfVFlQRV9NU0socmFkaW9fY2ZnKSB8Ci0JCQkgICAgRUVQUk9NX1JGX0NGR19TVEVQX01TSyhyYWRpb19jZmcpIHwKLQkJCSAgICBFRVBST01fUkZfQ0ZHX0RBU0hfTVNLKHJhZGlvX2NmZykpOwotCi0JLyogc2V0IENTUl9IV19DT05GSUdfUkVHIGZvciB1Q29kZSB1c2UgKi8KLQlpd2xfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJICAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9SQURJT19TSSB8Ci0JCSAgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTUFDX1NJKTsKKwlpd2xfcmZfY29uZmlnKHByaXYpOwogCiAJLyogbm8gbG9ja2luZyByZXF1aXJlZCBmb3IgcmVnaXN0ZXIgd3JpdGUgKi8KIAlpZiAocHJpdi0+Y2ZnLT5wYV90eXBlID09IElXTF9QQV9JTlRFUk5BTCkgewpAQCAtMTIwLDEwICsxMDYsOCBAQAogCQkJICAgICBDU1JfR1BfRFJJVkVSX1JFR19CSVRfUkFESU9fU0tVXzJ4Ml9JUEEpOwogCX0KIAkvKiBkbyBhZGRpdGlvbmFsIG5pYyBjb25maWd1cmF0aW9uIGlmIG5lZWRlZCAqLwotCWlmIChwcml2LT5jZmctPm9wcy0+bmljICYmCi0JCXByaXYtPmNmZy0+b3BzLT5uaWMtPmFkZGl0aW9uYWxfbmljX2NvbmZpZykgewotCQkJcHJpdi0+Y2ZnLT5vcHMtPm5pYy0+YWRkaXRpb25hbF9uaWNfY29uZmlnKHByaXYpOwotCX0KKwlpZiAocHJpdi0+Y2ZnLT5hZGRpdGlvbmFsX25pY19jb25maWcpCisJCQlwcml2LT5jZmctPmFkZGl0aW9uYWxfbmljX2NvbmZpZyhwcml2KTsKIH0KIAogc3RhdGljIHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzIGl3bDYwMDBfc2Vuc2l0aXZpdHkgPSB7CkBAIC0xNTksNyArMTQzLDYgQEAKIAkJCWl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXM7CiAKIAlwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0gPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwotCXByaXYtPmh3X3BhcmFtcy5kbWFfY2hubF9udW0gPSBGSDUwX1RDU1JfQ0hOTF9OVU07CiAJcHJpdi0+aHdfcGFyYW1zLnNjZF9iY190YmxzX3NpemUgPQogCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqCiAJCQlzaXplb2Yoc3RydWN0IGl3bGFnbl9zY2RfYmNfdGJsKTsKQEAgLTE3Miw3ICsxNTUsNiBAQAogCiAJcHJpdi0+aHdfcGFyYW1zLmh0NDBfY2hhbm5lbCA9ICBCSVQoSUVFRTgwMjExX0JBTkRfMkdIWikgfAogCQkJCQlCSVQoSUVFRTgwMjExX0JBTkRfNUdIWik7Ci0JcHJpdi0+aHdfcGFyYW1zLnJ4X3dydF9wdHJfcmVnID0gRkhfUlNDU1JfQ0hOTDBfV1BUUjsKIAogCXByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7CiAJaWYgKHByaXYtPmNmZy0+cnhfd2l0aF9zaXNvX2RpdmVyc2l0eSkKQEAgLTE5NCw3ICsxNzYsNyBAQAogCQlCSVQoSVdMX0NBTElCX1RYX0lRKQkJfAogCQlCSVQoSVdMX0NBTElCX0JBU0VfQkFORCk7CiAJaWYgKHByaXYtPmNmZy0+bmVlZF9kY19jYWxpYikKLQkJcHJpdi0+aHdfcGFyYW1zLmNhbGliX3J0X2NmZyB8PSBCSVQoSVdMX0NBTElCX0NGR19EQ19JRFgpOworCQlwcml2LT5od19wYXJhbXMuY2FsaWJfcnRfY2ZnIHw9IElXTF9DQUxJQl9DRkdfRENfSURYOwogCWlmIChwcml2LT5jZmctPm5lZWRfdGVtcF9vZmZzZXRfY2FsaWIpCiAJCXByaXYtPmh3X3BhcmFtcy5jYWxpYl9pbml0X2NmZyB8PSBCSVQoSVdMX0NBTElCX1RFTVBfT0ZGU0VUKTsKIApAQCAtMjcwLDI0ICsyNTIsMTQgQEAKIAkJCWN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCXByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgPSBjbWQuY2hhbm5lbDsKLQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSB0cnVlOwogCi0JcmV0dXJuIGl3bF9zZW5kX2NtZF9zeW5jKHByaXYsICZoY21kKTsKKwlyZXR1cm4gdHJhbnNfc2VuZF9jbWQoJnByaXYtPnRyYW5zLCAmaGNtZCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXdsX2xpYl9vcHMgaXdsNjAwMF9saWIgPSB7CiAJLnNldF9od19wYXJhbXMgPSBpd2w2MDAwX2h3X3NldF9od19wYXJhbXMsCi0JLnJ4X2hhbmRsZXJfc2V0dXAgPSBpd2xhZ25fcnhfaGFuZGxlcl9zZXR1cCwKLQkuc2V0dXBfZGVmZXJyZWRfd29yayA9IGl3bGFnbl9zZXR1cF9kZWZlcnJlZF93b3JrLAotCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaXdsYWduX2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIsCi0JLnNlbmRfdHhfcG93ZXIgPSBpd2xhZ25fc2VuZF90eF9wb3dlciwKLQkudXBkYXRlX2NoYWluX2ZsYWdzID0gaXdsX3VwZGF0ZV9jaGFpbl9mbGFncywKIAkuc2V0X2NoYW5uZWxfc3dpdGNoID0gaXdsNjAwMF9od19jaGFubmVsX3N3aXRjaCwKLQkuYXBtX29wcyA9IHsKLQkJLmluaXQgPSBpd2xfYXBtX2luaXQsCi0JCS5jb25maWcgPSBpd2w2MDAwX25pY19jb25maWcsCi0JfSwKKwkubmljX2NvbmZpZyA9IGl3bDYwMDBfbmljX2NvbmZpZywKIAkuZWVwcm9tX29wcyA9IHsKIAkJLnJlZ3VsYXRvcnlfYmFuZHMgPSB7CiAJCQlFRVBST01fUkVHX0JBTkRfMV9DSEFOTkVMUywKQEAgLTI5OCwyOSArMjcwLDE4IEBACiAJCQlFRVBST01fNjAwMF9SRUdfQkFORF8yNF9IVDQwX0NIQU5ORUxTLAogCQkJRUVQUk9NX1JFR19CQU5EXzUyX0hUNDBfQ0hBTk5FTFMKIAkJfSwKLQkJLnF1ZXJ5X2FkZHIgPSBpd2xhZ25fZWVwcm9tX3F1ZXJ5X2FkZHIsCiAJCS51cGRhdGVfZW5oYW5jZWRfdHhwb3dlciA9IGl3bGNvcmVfZWVwcm9tX2VuaGFuY2VkX3R4cG93ZXIsCiAJfSwKLQkudGVtcF9vcHMgPSB7Ci0JCS50ZW1wZXJhdHVyZSA9IGl3bGFnbl90ZW1wZXJhdHVyZSwKLQkgfSwKLQkudHhmaWZvX2ZsdXNoID0gaXdsYWduX3R4Zmlmb19mbHVzaCwKLQkuZGV2X3R4Zmlmb19mbHVzaCA9IGl3bGFnbl9kZXZfdHhmaWZvX2ZsdXNoLAorCS50ZW1wZXJhdHVyZSA9IGl3bGFnbl90ZW1wZXJhdHVyZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXdsX2xpYl9vcHMgaXdsNjAzMF9saWIgPSB7CiAJLnNldF9od19wYXJhbXMgPSBpd2w2MDAwX2h3X3NldF9od19wYXJhbXMsCi0JLnJ4X2hhbmRsZXJfc2V0dXAgPSBpd2xhZ25fYnRfcnhfaGFuZGxlcl9zZXR1cCwKLQkuc2V0dXBfZGVmZXJyZWRfd29yayA9IGl3bGFnbl9idF9zZXR1cF9kZWZlcnJlZF93b3JrLAorCS5idF9yeF9oYW5kbGVyX3NldHVwID0gaXdsYWduX2J0X3J4X2hhbmRsZXJfc2V0dXAsCisJLmJ0X3NldHVwX2RlZmVycmVkX3dvcmsgPSBpd2xhZ25fYnRfc2V0dXBfZGVmZXJyZWRfd29yaywKIAkuY2FuY2VsX2RlZmVycmVkX3dvcmsgPSBpd2xhZ25fYnRfY2FuY2VsX2RlZmVycmVkX3dvcmssCi0JLmlzX3ZhbGlkX3J0Y19kYXRhX2FkZHIgPSBpd2xhZ25faHdfdmFsaWRfcnRjX2RhdGFfYWRkciwKLQkuc2VuZF90eF9wb3dlciA9IGl3bGFnbl9zZW5kX3R4X3Bvd2VyLAotCS51cGRhdGVfY2hhaW5fZmxhZ3MgPSBpd2xfdXBkYXRlX2NoYWluX2ZsYWdzLAogCS5zZXRfY2hhbm5lbF9zd2l0Y2ggPSBpd2w2MDAwX2h3X2NoYW5uZWxfc3dpdGNoLAotCS5hcG1fb3BzID0gewotCQkuaW5pdCA9IGl3bF9hcG1faW5pdCwKLQkJLmNvbmZpZyA9IGl3bDYwMDBfbmljX2NvbmZpZywKLQl9LAorCS5uaWNfY29uZmlnID0gaXdsNjAwMF9uaWNfY29uZmlnLAogCS5lZXByb21fb3BzID0gewogCQkucmVndWxhdG9yeV9iYW5kcyA9IHsKIAkJCUVFUFJPTV9SRUdfQkFORF8xX0NIQU5ORUxTLApAQCAtMzMxLDQ4ICsyOTIsOSBAQAogCQkJRUVQUk9NXzYwMDBfUkVHX0JBTkRfMjRfSFQ0MF9DSEFOTkVMUywKIAkJCUVFUFJPTV9SRUdfQkFORF81Ml9IVDQwX0NIQU5ORUxTCiAJCX0sCi0JCS5xdWVyeV9hZGRyID0gaXdsYWduX2VlcHJvbV9xdWVyeV9hZGRyLAogCQkudXBkYXRlX2VuaGFuY2VkX3R4cG93ZXIgPSBpd2xjb3JlX2VlcHJvbV9lbmhhbmNlZF90eHBvd2VyLAogCX0sCi0JLnRlbXBfb3BzID0gewotCQkudGVtcGVyYXR1cmUgPSBpd2xhZ25fdGVtcGVyYXR1cmUsCi0JIH0sCi0JLnR4Zmlmb19mbHVzaCA9IGl3bGFnbl90eGZpZm9fZmx1c2gsCi0JLmRldl90eGZpZm9fZmx1c2ggPSBpd2xhZ25fZGV2X3R4Zmlmb19mbHVzaCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX25pY19vcHMgaXdsNjA1MF9uaWNfb3BzID0gewotCS5hZGRpdGlvbmFsX25pY19jb25maWcgPSAmaXdsNjA1MF9hZGRpdGlvbmFsX25pY19jb25maWcsCi19OwotCi1zdGF0aWMgc3RydWN0IGl3bF9uaWNfb3BzIGl3bDYxNTBfbmljX29wcyA9IHsKLQkuYWRkaXRpb25hbF9uaWNfY29uZmlnID0gJml3bDYxNTBfYWRkaXRpb25hbF9uaWNfY29uZmlnLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfb3BzIGl3bDYwMDBfb3BzID0gewotCS5saWIgPSAmaXdsNjAwMF9saWIsCi0JLmhjbWQgPSAmaXdsYWduX2hjbWQsCi0JLnV0aWxzID0gJml3bGFnbl9oY21kX3V0aWxzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfb3BzIGl3bDYwNTBfb3BzID0gewotCS5saWIgPSAmaXdsNjAwMF9saWIsCi0JLmhjbWQgPSAmaXdsYWduX2hjbWQsCi0JLnV0aWxzID0gJml3bGFnbl9oY21kX3V0aWxzLAotCS5uaWMgPSAmaXdsNjA1MF9uaWNfb3BzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfb3BzIGl3bDYxNTBfb3BzID0gewotCS5saWIgPSAmaXdsNjAwMF9saWIsCi0JLmhjbWQgPSAmaXdsYWduX2hjbWQsCi0JLnV0aWxzID0gJml3bGFnbl9oY21kX3V0aWxzLAotCS5uaWMgPSAmaXdsNjE1MF9uaWNfb3BzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfb3BzIGl3bDYwMzBfb3BzID0gewotCS5saWIgPSAmaXdsNjAzMF9saWIsCi0JLmhjbWQgPSAmaXdsYWduX2J0X2hjbWQsCi0JLnV0aWxzID0gJml3bGFnbl9oY21kX3V0aWxzLAorCS50ZW1wZXJhdHVyZSA9IGl3bGFnbl90ZW1wZXJhdHVyZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zIGl3bDYwMDBfYmFzZV9wYXJhbXMgPSB7CkBAIC00NDgsNyArMzcwLDcgQEAKIAkudWNvZGVfYXBpX21pbiA9IElXTDYwMDBHMl9VQ09ERV9BUElfTUlOLAkJXAogCS5lZXByb21fdmVyID0gRUVQUk9NXzYwMDVfRUVQUk9NX1ZFUlNJT04sCQlcCiAJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNjAwNV9UWF9QT1dFUl9WRVJTSU9OLAlcCi0JLm9wcyA9ICZpd2w2MDAwX29wcywJCQkJCVwKKwkubGliID0gJml3bDYwMDBfbGliLAkJCQkJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2w2MDAwX2cyX2Jhc2VfcGFyYW1zLAkJCVwKIAkubmVlZF9kY19jYWxpYiA9IHRydWUsCQkJCQlcCiAJLm5lZWRfdGVtcF9vZmZzZXRfY2FsaWIgPSB0cnVlLAkJCQlcCkBAIC00NzYsNyArMzk4LDcgQEAKIAkudWNvZGVfYXBpX21pbiA9IElXTDYwMDBHMl9VQ09ERV9BUElfTUlOLAkJXAogCS5lZXByb21fdmVyID0gRUVQUk9NXzYwMzBfRUVQUk9NX1ZFUlNJT04sCQlcCiAJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNjAzMF9UWF9QT1dFUl9WRVJTSU9OLAlcCi0JLm9wcyA9ICZpd2w2MDMwX29wcywJCQkJCVwKKwkubGliID0gJml3bDYwMzBfbGliLAkJCQkJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2w2MDAwX2cyX2Jhc2VfcGFyYW1zLAkJCVwKIAkuYnRfcGFyYW1zID0gJml3bDYwMDBfYnRfcGFyYW1zLAkJCVwKIAkubmVlZF9kY19jYWxpYiA9IHRydWUsCQkJCQlcCkBAIC01NTcsNyArNDc5LDcgQEAKIAkudmFsaWRfcnhfYW50ID0gQU5UX0JDLAkJLyogLmNmZyBvdmVyd3JpdGUgKi8JXAogCS5lZXByb21fdmVyID0gRUVQUk9NXzYwMDBfRUVQUk9NX1ZFUlNJT04sCQlcCiAJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNjAwMF9UWF9QT1dFUl9WRVJTSU9OLAlcCi0JLm9wcyA9ICZpd2w2MDAwX29wcywJCQkJCVwKKwkubGliID0gJml3bDYwMDBfbGliLAkJCQkJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2w2MDAwX2Jhc2VfcGFyYW1zLAkJCVwKIAkucGFfdHlwZSA9IElXTF9QQV9JTlRFUk5BTCwJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTksKQEAgLTU4NCw3ICs1MDYsOCBAQAogCS51Y29kZV9hcGlfbWluID0gSVdMNjA1MF9VQ09ERV9BUElfTUlOLAkJCVwKIAkudmFsaWRfdHhfYW50ID0gQU5UX0FCLAkJLyogLmNmZyBvdmVyd3JpdGUgKi8JXAogCS52YWxpZF9yeF9hbnQgPSBBTlRfQUIsCQkvKiAuY2ZnIG92ZXJ3cml0ZSAqLwlcCi0JLm9wcyA9ICZpd2w2MDUwX29wcywJCQkJCVwKKwkubGliID0gJml3bDYwMDBfbGliLAkJCQkJXAorCS5hZGRpdGlvbmFsX25pY19jb25maWcgPSBpd2w2MDUwX2FkZGl0aW9uYWxfbmljX2NvbmZpZywJXAogCS5lZXByb21fdmVyID0gRUVQUk9NXzYwNTBfRUVQUk9NX1ZFUlNJT04sCQlcCiAJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNjA1MF9UWF9QT1dFUl9WRVJTSU9OLAlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDYwNTBfYmFzZV9wYXJhbXMsCQkJXApAQCAtNjA3LDcgKzUzMCw4IEBACiAJLmZ3X25hbWVfcHJlID0gSVdMNjA1MF9GV19QUkUsCQkJCVwKIAkudWNvZGVfYXBpX21heCA9IElXTDYwNTBfVUNPREVfQVBJX01BWCwJCQlcCiAJLnVjb2RlX2FwaV9taW4gPSBJV0w2MDUwX1VDT0RFX0FQSV9NSU4sCQkJXAotCS5vcHMgPSAmaXdsNjE1MF9vcHMsCQkJCQlcCisJLmxpYiA9ICZpd2w2MDAwX2xpYiwJCQkJCVwKKwkuYWRkaXRpb25hbF9uaWNfY29uZmlnID0gaXdsNjE1MF9hZGRpdGlvbmFsX25pY19jb25maWcsCVwKIAkuZWVwcm9tX3ZlciA9IEVFUFJPTV82MTUwX0VFUFJPTV9WRVJTSU9OLAkJXAogCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzYxNTBfVFhfUE9XRVJfVkVSU0lPTiwJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2w2MDUwX2Jhc2VfcGFyYW1zLAkJCVwKQEAgLTYzMyw3ICs1NTcsNyBAQAogCS51Y29kZV9hcGlfbWluID0gSVdMNjAwMF9VQ09ERV9BUElfTUlOLAogCS5lZXByb21fdmVyID0gRUVQUk9NXzYwMDBfRUVQUk9NX1ZFUlNJT04sCiAJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNjAwMF9UWF9QT1dFUl9WRVJTSU9OLAotCS5vcHMgPSAmaXdsNjAwMF9vcHMsCisJLmxpYiA9ICZpd2w2MDAwX2xpYiwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNjAwMF9iYXNlX3BhcmFtcywKIAkuaHRfcGFyYW1zID0gJml3bDYwMDBfaHRfcGFyYW1zLAogCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmMKaW5kZXggYzkyNTVkZS4uNzJkNjI5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmMKQEAgLTY2LDYgKzY2LDggQEAKICNpbmNsdWRlICJpd2wtZGV2LmgiCiAjaW5jbHVkZSAiaXdsLWNvcmUuaCIKICNpbmNsdWRlICJpd2wtYWduLWNhbGliLmgiCisjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCisjaW5jbHVkZSAiaXdsLWFnbi5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElOSVQgY2FsaWJyYXRpb25zIGZyYW1ld29yawpAQCAtODcsNiArODksNyBAQAogCiAJc3RydWN0IGl3bF9ob3N0X2NtZCBoY21kID0gewogCQkuaWQgPSBSRVBMWV9QSFlfQ0FMSUJSQVRJT05fQ01ELAorCQkuZmxhZ3MgPSBDTURfU1lOQywKIAl9OwogCiAJZm9yIChpID0gMDsgaSA8IElXTF9DQUxJQl9NQVg7IGkrKykgewpAQCAtOTUsNyArOTgsNyBAQAogCQkJaGNtZC5sZW5bMF0gPSBwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1Zl9sZW47CiAJCQloY21kLmRhdGFbMF0gPSBwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1ZjsKIAkJCWhjbWQuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWTsKLQkJCXJldCA9IGl3bF9zZW5kX2NtZF9zeW5jKHByaXYsICZoY21kKTsKKwkJCXJldCA9IHRyYW5zX3NlbmRfY21kKCZwcml2LT50cmFucywgJmhjbWQpOwogCQkJaWYgKHJldCkgewogCQkJCUlXTF9FUlIocHJpdiwgIkVycm9yICVkIGl0ZXJhdGlvbiAlZFxuIiwKIAkJCQkJcmV0LCBpKTsKQEAgLTQ4MSw3ICs0ODQsNyBAQAogCW1lbWNweSgmKHByaXYtPnNlbnNpdGl2aXR5X3RibFswXSksICYoY21kLnRhYmxlWzBdKSwKIAkgICAgICAgc2l6ZW9mKHUxNikqSERfVEFCTEVfU0laRSk7CiAKLQlyZXR1cm4gaXdsX3NlbmRfY21kKHByaXYsICZjbWRfb3V0KTsKKwlyZXR1cm4gdHJhbnNfc2VuZF9jbWQoJnByaXYtPnRyYW5zLCAmY21kX291dCk7CiB9CiAKIC8qIFByZXBhcmUgYSBTRU5TSVRJVklUWV9DTUQsIHNlbmQgdG8gdUNvZGUgaWYgdmFsdWVzIGhhdmUgY2hhbmdlZCAqLwpAQCAtNTQ1LDcgKzU0OCw3IEBACiAJICAgICAgICYoY21kLmVuaGFuY2VfdGFibGVbSERfSU5BX05PTl9TUVVBUkVfREVUX09GRE1fSU5ERVhdKSwKIAkgICAgICAgc2l6ZW9mKHUxNikqRU5IQU5DRV9IRF9UQUJMRV9FTlRSSUVTKTsKIAotCXJldHVybiBpd2xfc2VuZF9jbWQocHJpdiwgJmNtZF9vdXQpOworCXJldHVybiB0cmFuc19zZW5kX2NtZCgmcHJpdi0+dHJhbnMsICZjbWRfb3V0KTsKIH0KIAogdm9pZCBpd2xfaW5pdF9zZW5zaXRpdml0eShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCkBAIC04MzcsNiArODQwLDY1IEBACiAJCQlhY3RpdmVfY2hhaW5zKTsKIH0KIAorc3RhdGljIHZvaWQgaXdsYWduX2dhaW5fY29tcHV0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQl1MzIgYXZlcmFnZV9ub2lzZVtOVU1fUlhfQ0hBSU5TXSwKKwkJdTE2IG1pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaSwKKwkJdTMyIG1pbl9hdmVyYWdlX25vaXNlLAorCQl1OCBkZWZhdWx0X2NoYWluKQoreworCWludCBpOworCXMzMiBkZWx0YV9nOworCXN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YSA9ICZwcml2LT5jaGFpbl9ub2lzZV9kYXRhOworCisJLyoKKwkgKiBGaW5kIEdhaW4gQ29kZSBmb3IgdGhlIGNoYWlucyBiYXNlZCBvbiAiZGVmYXVsdCBjaGFpbiIKKwkgKi8KKwlmb3IgKGkgPSBkZWZhdWx0X2NoYWluICsgMTsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgeworCQlpZiAoKGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0pKSB7CisJCQlkYXRhLT5kZWx0YV9nYWluX2NvZGVbaV0gPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlkZWx0YV9nID0gKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX3NjYWxlICoKKwkJCSgoczMyKWF2ZXJhZ2Vfbm9pc2VbZGVmYXVsdF9jaGFpbl0gLQorCQkJKHMzMilhdmVyYWdlX25vaXNlW2ldKSkgLyAxNTAwOworCisJCS8qIGJvdW5kIGdhaW4gYnkgMiBiaXRzIHZhbHVlIG1heCwgM3JkIGJpdCBpcyBzaWduICovCisJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9CisJCQltaW4oYWJzKGRlbHRhX2cpLAorCQkJKGxvbmcpIENIQUlOX05PSVNFX01BWF9ERUxUQV9HQUlOX0NPREUpOworCisJCWlmIChkZWx0YV9nIDwgMCkKKwkJCS8qCisJCQkgKiBzZXQgbmVnYXRpdmUgc2lnbiAuLi4KKwkJCSAqIG5vdGUgdG8gSW50ZWwgZGV2ZWxvcGVyczogIFRoaXMgaXMgdUNvZGUgQVBJIGZvcm1hdCwKKwkJCSAqICAgbm90IHRoZSBmb3JtYXQgb2YgYW55IGludGVybmFsIGRldmljZSByZWdpc3RlcnMuCisJCQkgKiAgIERvIG5vdCBjaGFuZ2UgdGhpcyBmb3JtYXQgZm9yIGUuZy4gNjA1MCBvciBzaW1pbGFyCisJCQkgKiAgIGRldmljZXMuICBDaGFuZ2UgZm9ybWF0IG9ubHkgaWYgbW9yZSByZXNvbHV0aW9uCisJCQkgKiAgIChpLmUuIG1vcmUgdGhhbiAyIGJpdHMgbWFnbml0dWRlKSBpcyBuZWVkZWQuCisJCQkgKi8KKwkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSB8PSAoMSA8PCAyKTsKKwl9CisKKwlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIkRlbHRhIGdhaW5zOiBBTlRfQiA9ICVkICBBTlRfQyA9ICVkXG4iLAorCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzFdLCBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMl0pOworCisJaWYgKCFkYXRhLT5yYWRpb193cml0ZSkgeworCQlzdHJ1Y3QgaXdsX2NhbGliX2NoYWluX25vaXNlX2dhaW5fY21kIGNtZDsKKworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCisJCWl3bF9zZXRfY2FsaWJfaGRyKCZjbWQuaGRyLAorCQkJcHJpdi0+cGh5X2NhbGliX2NoYWluX25vaXNlX2dhaW5fY21kKTsKKwkJY21kLmRlbHRhX2dhaW5fMSA9IGRhdGEtPmRlbHRhX2dhaW5fY29kZVsxXTsKKwkJY21kLmRlbHRhX2dhaW5fMiA9IGRhdGEtPmRlbHRhX2dhaW5fY29kZVsyXTsKKwkJdHJhbnNfc2VuZF9jbWRfcGR1KCZwcml2LT50cmFucywgUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRCwKKwkJCUNNRF9BU1lOQywgc2l6ZW9mKGNtZCksICZjbWQpOworCisJCWRhdGEtPnJhZGlvX3dyaXRlID0gMTsKKwkJZGF0YS0+c3RhdGUgPSBJV0xfQ0hBSU5fTk9JU0VfQ0FMSUJSQVRFRDsKKwl9Cit9CiAKIC8qCiAgKiBBY2N1bXVsYXRlIDE2IGJlYWNvbnMgb2Ygc2lnbmFsIGFuZCBub2lzZSBzdGF0aXN0aWNzIGZvciBlYWNoIG9mCkBAIC05OTEsMTYgKzEwNTMsMTQgQEAKIAlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm1pbl9hdmVyYWdlX25vaXNlID0gJWQsIGFudGVubmEgJWRcbiIsCiAJCQltaW5fYXZlcmFnZV9ub2lzZSwgbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pKTsKIAotCWlmIChwcml2LT5jZmctPm9wcy0+dXRpbHMtPmdhaW5fY29tcHV0YXRpb24pCi0JCXByaXYtPmNmZy0+b3BzLT51dGlscy0+Z2Fpbl9jb21wdXRhdGlvbihwcml2LCBhdmVyYWdlX25vaXNlLAorCWl3bGFnbl9nYWluX2NvbXB1dGF0aW9uKHByaXYsIGF2ZXJhZ2Vfbm9pc2UsCiAJCQkJbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pLCBtaW5fYXZlcmFnZV9ub2lzZSwKIAkJCQlmaW5kX2ZpcnN0X2NoYWluKHByaXYtPmNmZy0+dmFsaWRfcnhfYW50KSk7CiAKIAkvKiBTb21lIHBvd2VyIGNoYW5nZXMgbWF5IGhhdmUgYmVlbiBtYWRlIGR1cmluZyB0aGUgY2FsaWJyYXRpb24uCiAJICogVXBkYXRlIGFuZCBjb21taXQgdGhlIFJYT04KIAkgKi8KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKQotCQlwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MocHJpdik7CisJaXdsX3VwZGF0ZV9jaGFpbl9mbGFncyhwcml2KTsKIAogCWRhdGEtPnN0YXRlID0gSVdMX0NIQUlOX05PSVNFX0RPTkU7CiAJaXdsX3Bvd2VyX3VwZGF0ZV9tb2RlKHByaXYsIGZhbHNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmgKaW5kZXggNGVmNGRkOS4uYTg2OWZjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmgKQEAgLTcxLDEzICs3MSw2IEBACiAKIHZvaWQgaXdsX2luaXRfc2Vuc2l0aXZpdHkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsX3Jlc2V0X3J1bl90aW1lX2NhbGliKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2NoYWluX25vaXNlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQotCWlmICghcHJpdi0+ZGlzYWJsZV9jaGFpbl9ub2lzZV9jYWwgJiYKLQkgICAgcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5jaGFpbl9ub2lzZV9yZXNldCkKLQkJcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5jaGFpbl9ub2lzZV9yZXNldChwcml2KTsKLX0KIAogaW50IGl3bF9zZW5kX2NhbGliX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGludCBpd2xfY2FsaWJfc2V0KHN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0ICpyZXMsIGNvbnN0IHU4ICpidWYsIGludCBsZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWVlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWVlcHJvbS5jCmluZGV4IDJlZjk0NDguLmI4MzQ3ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1lZXByb20uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tZWVwcm9tLmMKQEAgLTEwOCwxOCArMTA4LDE2IEBACiAKIGludCBpd2xfZWVwcm9tX2NoZWNrX3NrdShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JdTE2IGVlcHJvbV9za3U7CiAJdTE2IHJhZGlvX2NmZzsKIAotCWVlcHJvbV9za3UgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1NLVV9DQVApOwotCiAJaWYgKCFwcml2LT5jZmctPnNrdSkgewogCQkvKiBub3QgdXNpbmcgc2t1IG92ZXJ3cml0ZSAqLwotCQlwcml2LT5jZmctPnNrdSA9Ci0JCQkoKGVlcHJvbV9za3UgJiBFRVBST01fU0tVX0NBUF9CQU5EX1NFTEVDVElPTikgPj4KLQkJCUVFUFJPTV9TS1VfQ0FQX0JBTkRfUE9TKTsKLQkJaWYgKGVlcHJvbV9za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFKQotCQkJcHJpdi0+Y2ZnLT5za3UgfD0gSVdMX1NLVV9OOworCQlwcml2LT5jZmctPnNrdSA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fU0tVX0NBUCk7CisJCWlmIChwcml2LT5jZmctPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUgJiYKKwkJICAgICFwcml2LT5jZmctPmh0X3BhcmFtcykgeworCQkJSVdMX0VSUihwcml2LCAiSW52YWxpZCAxMW4gY29uZmlndXJhdGlvblxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCX0KIAlpZiAoIXByaXYtPmNmZy0+c2t1KSB7CiAJCUlXTF9FUlIocHJpdiwgIkludmFsaWQgZGV2aWNlIHNrdVxuIik7CkBAIC0xNTIsNyArMTUwLDcgQEAKIAogdm9pZCBpd2xfZWVwcm9tX2dldF9tYWMoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCAqbWFjKQogewotCWNvbnN0IHU4ICphZGRyID0gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5xdWVyeV9hZGRyKHByaXYsCisJY29uc3QgdTggKmFkZHIgPSBpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwKIAkJCQkJRUVQUk9NX01BQ19BRERSRVNTKTsKIAltZW1jcHkobWFjLCBhZGRyLCBFVEhfQUxFTik7CiB9CkBAIC0yNDcsMTAgKzI0NSwxMCBAQAogCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGl3bF9lZXByb21fZW5oYW5jZWRfdHhwd3IpICE9IDgpOwogCiAJLyogdGhlIGxlbmd0aCBpcyBpbiAxNi1iaXQgd29yZHMsIGJ1dCB3ZSB3YW50IGVudHJpZXMgKi8KLQl0eHBfbGVuID0gKF9fbGUxNiAqKSBpd2xhZ25fZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgRUVQUk9NX1RYUF9TWl9PRkZTKTsKKwl0eHBfbGVuID0gKF9fbGUxNiAqKSBpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgRUVQUk9NX1RYUF9TWl9PRkZTKTsKIAllbnRyaWVzID0gbGUxNl90b19jcHVwKHR4cF9sZW4pICogMiAvIEVFUFJPTV9UWFBfRU5UUllfTEVOOwogCi0JdHhwX2FycmF5ID0gKHZvaWQgKikgaXdsYWduX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIEVFUFJPTV9UWFBfT0ZGUyk7CisJdHhwX2FycmF5ID0gKHZvaWQgKikgaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIEVFUFJPTV9UWFBfT0ZGUyk7CiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IGVudHJpZXM7IGlkeCsrKSB7CiAJCXR4cCA9ICZ0eHBfYXJyYXlbaWR4XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1oY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taGNtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTJjNzJkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1oY21kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1hZ24uaCIKLQotaW50IGl3bGFnbl9zZW5kX3R4X2FudF9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCB2YWxpZF90eF9hbnQpCi17Ci0Jc3RydWN0IGl3bF90eF9hbnRfY29uZmlnX2NtZCB0eF9hbnRfY21kID0gewotCSAgLnZhbGlkID0gY3B1X3RvX2xlMzIodmFsaWRfdHhfYW50KSwKLQl9OwotCi0JaWYgKElXTF9VQ09ERV9BUEkocHJpdi0+dWNvZGVfdmVyKSA+IDEpIHsKLQkJSVdMX0RFQlVHX0hDKHByaXYsICJzZWxlY3QgdmFsaWQgdHggYW50OiAldVxuIiwgdmFsaWRfdHhfYW50KTsKLQkJcmV0dXJuIGl3bF9zZW5kX2NtZF9wZHUocHJpdiwgVFhfQU5UX0NPTkZJR1VSQVRJT05fQ01ELAotCQkJCQlzaXplb2Yoc3RydWN0IGl3bF90eF9hbnRfY29uZmlnX2NtZCksCi0JCQkJCSZ0eF9hbnRfY21kKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfSEMocHJpdiwgIlRYX0FOVF9DT05GSUdVUkFUSU9OX0NNRCBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KLX0KLQotc3RhdGljIHUxNiBpd2xhZ25fYnVpbGRfYWRkc3RhX2hjbWQoY29uc3Qgc3RydWN0IGl3bF9hZGRzdGFfY21kICpjbWQsIHU4ICpkYXRhKQotewotCXUxNiBzaXplID0gKHUxNilzaXplb2Yoc3RydWN0IGl3bF9hZGRzdGFfY21kKTsKLQlzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgKmFkZHN0YSA9IChzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgKilkYXRhOwotCW1lbWNweShhZGRzdGEsIGNtZCwgc2l6ZSk7Ci0JLyogcmVzcnZlZCBpbiA1MDAwICovCi0JYWRkc3RhLT5yYXRlX25fZmxhZ3MgPSBjcHVfdG9fbGUxNigwKTsKLQlyZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX2dhaW5fY29tcHV0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQl1MzIgYXZlcmFnZV9ub2lzZVtOVU1fUlhfQ0hBSU5TXSwKLQkJdTE2IG1pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaSwKLQkJdTMyIG1pbl9hdmVyYWdlX25vaXNlLAotCQl1OCBkZWZhdWx0X2NoYWluKQotewotCWludCBpOwotCXMzMiBkZWx0YV9nOwotCXN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YSA9ICZwcml2LT5jaGFpbl9ub2lzZV9kYXRhOwotCi0JLyoKLQkgKiBGaW5kIEdhaW4gQ29kZSBmb3IgdGhlIGNoYWlucyBiYXNlZCBvbiAiZGVmYXVsdCBjaGFpbiIKLQkgKi8KLQlmb3IgKGkgPSBkZWZhdWx0X2NoYWluICsgMTsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgewotCQlpZiAoKGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0pKSB7Ci0JCQlkYXRhLT5kZWx0YV9nYWluX2NvZGVbaV0gPSAwOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlkZWx0YV9nID0gKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX3NjYWxlICoKLQkJCSgoczMyKWF2ZXJhZ2Vfbm9pc2VbZGVmYXVsdF9jaGFpbl0gLQotCQkJKHMzMilhdmVyYWdlX25vaXNlW2ldKSkgLyAxNTAwOwotCi0JCS8qIGJvdW5kIGdhaW4gYnkgMiBiaXRzIHZhbHVlIG1heCwgM3JkIGJpdCBpcyBzaWduICovCi0JCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9Ci0JCQltaW4oYWJzKGRlbHRhX2cpLCAobG9uZykgQ0hBSU5fTk9JU0VfTUFYX0RFTFRBX0dBSU5fQ09ERSk7Ci0KLQkJaWYgKGRlbHRhX2cgPCAwKQotCQkJLyoKLQkJCSAqIHNldCBuZWdhdGl2ZSBzaWduIC4uLgotCQkJICogbm90ZSB0byBJbnRlbCBkZXZlbG9wZXJzOiAgVGhpcyBpcyB1Q29kZSBBUEkgZm9ybWF0LAotCQkJICogICBub3QgdGhlIGZvcm1hdCBvZiBhbnkgaW50ZXJuYWwgZGV2aWNlIHJlZ2lzdGVycy4KLQkJCSAqICAgRG8gbm90IGNoYW5nZSB0aGlzIGZvcm1hdCBmb3IgZS5nLiA2MDUwIG9yIHNpbWlsYXIKLQkJCSAqICAgZGV2aWNlcy4gIENoYW5nZSBmb3JtYXQgb25seSBpZiBtb3JlIHJlc29sdXRpb24KLQkJCSAqICAgKGkuZS4gbW9yZSB0aGFuIDIgYml0cyBtYWduaXR1ZGUpIGlzIG5lZWRlZC4KLQkJCSAqLwotCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldIHw9ICgxIDw8IDIpOwotCX0KLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiRGVsdGEgZ2FpbnM6IEFOVF9CID0gJWQgIEFOVF9DID0gJWRcbiIsCi0JCQlkYXRhLT5kZWx0YV9nYWluX2NvZGVbMV0sIGRhdGEtPmRlbHRhX2dhaW5fY29kZVsyXSk7Ci0KLQlpZiAoIWRhdGEtPnJhZGlvX3dyaXRlKSB7Ci0JCXN0cnVjdCBpd2xfY2FsaWJfY2hhaW5fbm9pc2VfZ2Fpbl9jbWQgY21kOwotCi0JCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0KLQkJY21kLmhkci5vcF9jb2RlID0gcHJpdi0+X2Fnbi5waHlfY2FsaWJfY2hhaW5fbm9pc2VfZ2Fpbl9jbWQ7Ci0JCWNtZC5oZHIuZmlyc3RfZ3JvdXAgPSAwOwotCQljbWQuaGRyLmdyb3Vwc19udW0gPSAxOwotCQljbWQuaGRyLmRhdGFfdmFsaWQgPSAxOwotCQljbWQuZGVsdGFfZ2Fpbl8xID0gZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzFdOwotCQljbWQuZGVsdGFfZ2Fpbl8yID0gZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzJdOwotCQlpd2xfc2VuZF9jbWRfcGR1X2FzeW5jKHByaXYsIFJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQsCi0JCQlzaXplb2YoY21kKSwgJmNtZCwgTlVMTCk7Ci0KLQkJZGF0YS0+cmFkaW9fd3JpdGUgPSAxOwotCQlkYXRhLT5zdGF0ZSA9IElXTF9DSEFJTl9OT0lTRV9DQUxJQlJBVEVEOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX2NoYWluX25vaXNlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2NoYWluX25vaXNlX2RhdGEgKmRhdGEgPSAmcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YTsKLQlpbnQgcmV0OwotCi0JaWYgKChkYXRhLT5zdGF0ZSA9PSBJV0xfQ0hBSU5fTk9JU0VfQUxJVkUpICYmCi0JICAgIGl3bF9pc19hbnlfYXNzb2NpYXRlZChwcml2KSkgewotCQlzdHJ1Y3QgaXdsX2NhbGliX2NoYWluX25vaXNlX3Jlc2V0X2NtZCBjbWQ7Ci0KLQkJLyogY2xlYXIgZGF0YSBmb3IgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gYWxnb3JpdGhtICovCi0JCWRhdGEtPmNoYWluX25vaXNlX2EgPSAwOwotCQlkYXRhLT5jaGFpbl9ub2lzZV9iID0gMDsKLQkJZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IDA7Ci0JCWRhdGEtPmNoYWluX3NpZ25hbF9hID0gMDsKLQkJZGF0YS0+Y2hhaW5fc2lnbmFsX2IgPSAwOwotCQlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IDA7Ci0JCWRhdGEtPmJlYWNvbl9jb3VudCA9IDA7Ci0KLQkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQkJY21kLmhkci5vcF9jb2RlID0gcHJpdi0+X2Fnbi5waHlfY2FsaWJfY2hhaW5fbm9pc2VfcmVzZXRfY21kOwotCQljbWQuaGRyLmZpcnN0X2dyb3VwID0gMDsKLQkJY21kLmhkci5ncm91cHNfbnVtID0gMTsKLQkJY21kLmhkci5kYXRhX3ZhbGlkID0gMTsKLQkJcmV0ID0gaXdsX3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9QSFlfQ0FMSUJSQVRJT05fQ01ELAotCQkJCQlzaXplb2YoY21kKSwgJmNtZCk7Ci0JCWlmIChyZXQpCi0JCQlJV0xfRVJSKHByaXYsCi0JCQkJIkNvdWxkIG5vdCBzZW5kIFJFUExZX1BIWV9DQUxJQlJBVElPTl9DTURcbiIpOwotCQlkYXRhLT5zdGF0ZSA9IElXTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFOwotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIlJ1biBjaGFpbl9ub2lzZV9jYWxpYnJhdGVcbiIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX3R4X2NtZF9wcm90ZWN0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKLQkJCQkgICAgIF9fbGUxNiBmYywgX19sZTMyICp0eF9mbGFncykKLXsKLQlpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19VU0VfUlRTX0NUUyB8fAotCSAgICBpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCkgewotCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19QUk9UX1JFUVVJUkVfTVNLOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHByaXYtPmNmZy0+aHRfcGFyYW1zICYmCi0JICAgIHByaXYtPmNmZy0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbiAmJgotCSAgICBpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpIHsKLQkJKnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfUFJPVF9SRVFVSVJFX01TSzsKLQkJcmV0dXJuOwotCX0KLX0KLQotLyogQ2FsYyBtYXggc2lnbmFsIGxldmVsIChkQm0pIGFtb25nIDMgcG9zc2libGUgcmVjZWl2ZXJzICovCi1zdGF0aWMgaW50IGl3bGFnbl9jYWxjX3Jzc2koc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgaXdsX3J4X3BoeV9yZXMgKnJ4X3Jlc3ApCi17Ci0JLyogZGF0YSBmcm9tIFBIWS9EU1AgcmVnYXJkaW5nIHNpZ25hbCBzdHJlbmd0aCwgZXRjLiwKLQkgKiAgIGNvbnRlbnRzIGFyZSBhbHdheXMgdGhlcmUsIG5vdCBjb25maWd1cmFibGUgYnkgaG9zdAotCSAqLwotCXN0cnVjdCBpd2xhZ25fbm9uX2NmZ19waHkgKm5jcGh5ID0KLQkJKHN0cnVjdCBpd2xhZ25fbm9uX2NmZ19waHkgKilyeF9yZXNwLT5ub25fY2ZnX3BoeV9idWY7Ci0JdTMyIHZhbCwgcnNzaV9hLCByc3NpX2IsIHJzc2lfYywgbWF4X3Jzc2k7Ci0JdTggYWdjOwotCi0JdmFsICA9IGxlMzJfdG9fY3B1KG5jcGh5LT5ub25fY2ZnX3BoeVtJV0xBR05fUlhfUkVTX0FHQ19JRFhdKTsKLQlhZ2MgPSAodmFsICYgSVdMQUdOX09GRE1fQUdDX01TSykgPj4gSVdMQUdOX09GRE1fQUdDX0JJVF9QT1M7Ci0KLQkvKiBGaW5kIG1heCByc3NpIGFtb25nIDMgcG9zc2libGUgcmVjZWl2ZXJzLgotCSAqIFRoZXNlIHZhbHVlcyBhcmUgbWVhc3VyZWQgYnkgdGhlIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciAoRFNQKS4KLQkgKiBUaGV5IHNob3VsZCBzdGF5IGZhaXJseSBjb25zdGFudCBldmVuIGFzIHRoZSBzaWduYWwgc3RyZW5ndGggdmFyaWVzLAotCSAqICAgaWYgdGhlIHJhZGlvJ3MgYXV0b21hdGljIGdhaW4gY29udHJvbCAoQUdDKSBpcyB3b3JraW5nIHJpZ2h0LgotCSAqIEFHQyB2YWx1ZSAoc2VlIGJlbG93KSB3aWxsIHByb3ZpZGUgdGhlICJpbnRlcmVzdGluZyIgaW5mby4KLQkgKi8KLQl2YWwgPSBsZTMyX3RvX2NwdShuY3BoeS0+bm9uX2NmZ19waHlbSVdMQUdOX1JYX1JFU19SU1NJX0FCX0lEWF0pOwotCXJzc2lfYSA9ICh2YWwgJiBJV0xBR05fT0ZETV9SU1NJX0lOQkFORF9BX0JJVE1TSykgPj4KLQkJSVdMQUdOX09GRE1fUlNTSV9BX0JJVF9QT1M7Ci0JcnNzaV9iID0gKHZhbCAmIElXTEFHTl9PRkRNX1JTU0lfSU5CQU5EX0JfQklUTVNLKSA+PgotCQlJV0xBR05fT0ZETV9SU1NJX0JfQklUX1BPUzsKLQl2YWwgPSBsZTMyX3RvX2NwdShuY3BoeS0+bm9uX2NmZ19waHlbSVdMQUdOX1JYX1JFU19SU1NJX0NfSURYXSk7Ci0JcnNzaV9jID0gKHZhbCAmIElXTEFHTl9PRkRNX1JTU0lfSU5CQU5EX0NfQklUTVNLKSA+PgotCQlJV0xBR05fT0ZETV9SU1NJX0NfQklUX1BPUzsKLQotCW1heF9yc3NpID0gbWF4X3QodTMyLCByc3NpX2EsIHJzc2lfYik7Ci0JbWF4X3Jzc2kgPSBtYXhfdCh1MzIsIG1heF9yc3NpLCByc3NpX2MpOwotCi0JSVdMX0RFQlVHX1NUQVRTKHByaXYsICJSc3NpIEluIEEgJWQgQiAlZCBDICVkIE1heCAlZCBBR0MgZEIgJWRcbiIsCi0JCXJzc2lfYSwgcnNzaV9iLCByc3NpX2MsIG1heF9yc3NpLCBhZ2MpOwotCi0JLyogZEJtID0gbWF4X3Jzc2kgZEIgLSBhZ2MgZEIgLSBjb25zdGFudC4KLQkgKiBIaWdoZXIgQUdDIChoaWdoZXIgcmFkaW8gZ2FpbikgbWVhbnMgbG93ZXIgc2lnbmFsLiAqLwotCXJldHVybiBtYXhfcnNzaSAtIGFnYyAtIElXTEFHTl9SU1NJX09GRlNFVDsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fc2V0X3Bhbl9wYXJhbXMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfd2lwYW5fcGFyYW1zX2NtZCBjbWQ7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eF9ic3MsICpjdHhfcGFuOwotCWludCBzbG90MCA9IDMwMCwgc2xvdDEgPSAwOwotCWludCByZXQ7Ci0KLQlpZiAocHJpdi0+dmFsaWRfY29udGV4dHMgPT0gQklUKElXTF9SWE9OX0NUWF9CU1MpKQotCQlyZXR1cm4gMDsKLQotCUJVSUxEX0JVR19PTihOVU1fSVdMX1JYT05fQ1RYICE9IDIpOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JY3R4X2JzcyA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQljdHhfcGFuID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9QQU5dOwotCi0JLyoKLQkgKiBJZiB0aGUgUEFOIGNvbnRleHQgaXMgaW5hY3RpdmUsIHRoZW4gd2UgZG9uJ3QgbmVlZAotCSAqIHRvIHVwZGF0ZSB0aGUgUEFOIHBhcmFtZXRlcnMsIHRoZSBsYXN0IHRoaW5nIHdlJ2xsCi0JICogaGF2ZSBkb25lIGJlZm9yZSBpdCBnb2VzIGluYWN0aXZlIGlzIG1ha2luZyB0aGUgUEFOCi0JICogcGFyYW1ldGVycyBiZSBXTEFOLW9ubHkuCi0JICovCi0JaWYgKCFjdHhfcGFuLT5pc19hY3RpdmUpCi0JCXJldHVybiAwOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCS8qIG9ubHkgMiBzbG90cyBhcmUgY3VycmVudGx5IGFsbG93ZWQgKi8KLQljbWQubnVtX3Nsb3RzID0gMjsKLQotCWNtZC5zbG90c1swXS50eXBlID0gMDsgLyogQlNTICovCi0JY21kLnNsb3RzWzFdLnR5cGUgPSAxOyAvKiBQQU4gKi8KLQotCWlmIChwcml2LT5fYWduLmh3X3JvY19jaGFubmVsKSB7Ci0JCS8qIGJvdGggY29udGV4dHMgbXVzdCBiZSB1c2VkIGZvciB0aGlzIHRvIGhhcHBlbiAqLwotCQlzbG90MSA9IHByaXYtPl9hZ24uaHdfcm9jX2R1cmF0aW9uOwotCQlzbG90MCA9IElXTF9NSU5fU0xPVF9USU1FOwotCX0gZWxzZSBpZiAoY3R4X2Jzcy0+dmlmICYmIGN0eF9wYW4tPnZpZikgewotCQlpbnQgYmNuaW50ID0gY3R4X3Bhbi0+dmlmLT5ic3NfY29uZi5iZWFjb25faW50OwotCQlpbnQgZHRpbSA9IGN0eF9wYW4tPnZpZi0+YnNzX2NvbmYuZHRpbV9wZXJpb2QgPzogMTsKLQotCQkvKiBzaG91bGQgYmUgc2V0LCBidXQgc2VlbXMgdW51c2VkPz8gKi8KLQkJY21kLmZsYWdzIHw9IGNwdV90b19sZTE2KElXTF9XSVBBTl9QQVJBTVNfRkxHX1NMT1RURURfTU9ERSk7Ci0KLQkJaWYgKGN0eF9wYW4tPnZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCAmJgotCQkgICAgYmNuaW50ICYmCi0JCSAgICBiY25pbnQgIT0gY3R4X2Jzcy0+dmlmLT5ic3NfY29uZi5iZWFjb25faW50KSB7Ci0JCQlJV0xfRVJSKHByaXYsCi0JCQkJImJlYWNvbiBpbnRlcnZhbHMgZG9uJ3QgbWF0Y2ggKCVkLCAlZClcbiIsCi0JCQkJY3R4X2Jzcy0+dmlmLT5ic3NfY29uZi5iZWFjb25faW50LAotCQkJCWN0eF9wYW4tPnZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCk7Ci0JCX0gZWxzZQotCQkJYmNuaW50ID0gbWF4X3QoaW50LCBiY25pbnQsCi0JCQkJICAgICAgIGN0eF9ic3MtPnZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCk7Ci0JCWlmICghYmNuaW50KQotCQkJYmNuaW50ID0gREVGQVVMVF9CRUFDT05fSU5URVJWQUw7Ci0JCXNsb3QwID0gYmNuaW50IC8gMjsKLQkJc2xvdDEgPSBiY25pbnQgLSBzbG90MDsKLQotCQlpZiAodGVzdF9iaXQoU1RBVFVTX1NDQU5fSFcsICZwcml2LT5zdGF0dXMpIHx8Ci0JCSAgICAoIWN0eF9ic3MtPnZpZi0+YnNzX2NvbmYuaWRsZSAmJgotCQkgICAgICFjdHhfYnNzLT52aWYtPmJzc19jb25mLmFzc29jKSkgewotCQkJc2xvdDAgPSBkdGltICogYmNuaW50ICogMyAtIElXTF9NSU5fU0xPVF9USU1FOwotCQkJc2xvdDEgPSBJV0xfTUlOX1NMT1RfVElNRTsKLQkJfSBlbHNlIGlmICghY3R4X3Bhbi0+dmlmLT5ic3NfY29uZi5pZGxlICYmCi0JCQkgICAhY3R4X3Bhbi0+dmlmLT5ic3NfY29uZi5hc3NvYykgewotCQkJc2xvdDEgPSBiY25pbnQgKiAzIC0gSVdMX01JTl9TTE9UX1RJTUU7Ci0JCQlzbG90MCA9IElXTF9NSU5fU0xPVF9USU1FOwotCQl9Ci0JfSBlbHNlIGlmIChjdHhfcGFuLT52aWYpIHsKLQkJc2xvdDAgPSAwOwotCQlzbG90MSA9IG1heF90KGludCwgMSwgY3R4X3Bhbi0+dmlmLT5ic3NfY29uZi5kdGltX3BlcmlvZCkgKgotCQkJCQljdHhfcGFuLT52aWYtPmJzc19jb25mLmJlYWNvbl9pbnQ7Ci0JCXNsb3QxID0gbWF4X3QoaW50LCBERUZBVUxUX0JFQUNPTl9JTlRFUlZBTCwgc2xvdDEpOwotCi0JCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cykpIHsKLQkJCXNsb3QwID0gc2xvdDEgKiAzIC0gSVdMX01JTl9TTE9UX1RJTUU7Ci0JCQlzbG90MSA9IElXTF9NSU5fU0xPVF9USU1FOwotCQl9Ci0JfQotCi0JY21kLnNsb3RzWzBdLndpZHRoID0gY3B1X3RvX2xlMTYoc2xvdDApOwotCWNtZC5zbG90c1sxXS53aWR0aCA9IGNwdV90b19sZTE2KHNsb3QxKTsKLQotCXJldCA9IGl3bF9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfV0lQQU5fUEFSQU1TLCBzaXplb2YoY21kKSwgJmNtZCk7Ci0JaWYgKHJldCkKLQkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2V0dGluZyBQQU4gcGFyYW1ldGVycyAoJWQpXG4iLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RydWN0IGl3bF9oY21kX29wcyBpd2xhZ25faGNtZCA9IHsKLQkuY29tbWl0X3J4b24gPSBpd2xhZ25fY29tbWl0X3J4b24sCi0JLnNldF9yeG9uX2NoYWluID0gaXdsYWduX3NldF9yeG9uX2NoYWluLAotCS5zZXRfdHhfYW50ID0gaXdsYWduX3NlbmRfdHhfYW50X2NvbmZpZywKLQkuc2VuZF9idF9jb25maWcgPSBpd2xfc2VuZF9idF9jb25maWcsCi0JLnNldF9wYW5fcGFyYW1zID0gaXdsYWduX3NldF9wYW5fcGFyYW1zLAotfTsKLQotc3RydWN0IGl3bF9oY21kX29wcyBpd2xhZ25fYnRfaGNtZCA9IHsKLQkuY29tbWl0X3J4b24gPSBpd2xhZ25fY29tbWl0X3J4b24sCi0JLnNldF9yeG9uX2NoYWluID0gaXdsYWduX3NldF9yeG9uX2NoYWluLAotCS5zZXRfdHhfYW50ID0gaXdsYWduX3NlbmRfdHhfYW50X2NvbmZpZywKLQkuc2VuZF9idF9jb25maWcgPSBpd2xhZ25fc2VuZF9hZHZhbmNlX2J0X2NvbmZpZywKLQkuc2V0X3Bhbl9wYXJhbXMgPSBpd2xhZ25fc2V0X3Bhbl9wYXJhbXMsCi19OwotCi1zdHJ1Y3QgaXdsX2hjbWRfdXRpbHNfb3BzIGl3bGFnbl9oY21kX3V0aWxzID0gewotCS5idWlsZF9hZGRzdGFfaGNtZCA9IGl3bGFnbl9idWlsZF9hZGRzdGFfaGNtZCwKLQkuZ2Fpbl9jb21wdXRhdGlvbiA9IGl3bGFnbl9nYWluX2NvbXB1dGF0aW9uLAotCS5jaGFpbl9ub2lzZV9yZXNldCA9IGl3bGFnbl9jaGFpbl9ub2lzZV9yZXNldCwKLQkudHhfY21kX3Byb3RlY3Rpb24gPSBpd2xhZ25fdHhfY21kX3Byb3RlY3Rpb24sCi0JLmNhbGNfcnNzaSA9IGl3bGFnbl9jYWxjX3Jzc2ksCi0JLnJlcXVlc3Rfc2NhbiA9IGl3bGFnbl9yZXF1ZXN0X3NjYW4sCi0JLnBvc3Rfc2NhbiA9IGl3bGFnbl9wb3N0X3NjYW4sCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWh3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taHcuaAppbmRleCA3YmQxOWY0Li4wZTViODQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taHcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taHcuaApAQCAtODEsMTMgKzgxLDYgQEAKIC8qIFJTU0kgdG8gZEJtICovCiAjZGVmaW5lIElXTEFHTl9SU1NJX09GRlNFVAk0NAogCi0vKiBQQ0kgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBDSV9DRkdfUkVUUllfVElNRU9VVAkweDA0MQotCi0vKiBQQ0kgcmVnaXN0ZXIgdmFsdWVzICovCi0jZGVmaW5lIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMFNfRU4JMHgwMQotI2RlZmluZSBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4JMHgwMgotCiAjZGVmaW5lIElXTEFHTl9ERUZBVUxUX1RYX1JFVFJZICAxNQogCiAvKiBMaW1pdCByYW5nZSBvZiB0eHBvd2VyIG91dHB1dCB0YXJnZXQgdG8gYmUgYmV0d2VlbiB0aGVzZSB2YWx1ZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1pY3QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1pY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1ZmRhNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1hZ24uaCIKLSNpbmNsdWRlICJpd2wtaGVscGVycy5oIgotCi0jZGVmaW5lIElDVF9DT1VOVCAoUEFHRV9TSVpFL3NpemVvZih1MzIpKQotCi0vKiBGcmVlIGRyYW0gdGFibGUgKi8KLXZvaWQgaXdsX2ZyZWVfaXNyX2ljdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaWYgKHByaXYtPl9hZ24uaWN0X3RibF92aXIpIHsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwKLQkJCQkgIChzaXplb2YodTMyKSAqIElDVF9DT1VOVCkgKyBQQUdFX1NJWkUsCi0JCQkJICBwcml2LT5fYWduLmljdF90YmxfdmlyLAotCQkJCSAgcHJpdi0+X2Fnbi5pY3RfdGJsX2RtYSk7Ci0JCXByaXYtPl9hZ24uaWN0X3RibF92aXIgPSBOVUxMOwotCX0KLX0KLQotCi0vKiBhbGxvY2F0ZSBkcmFtIHNoYXJlZCB0YWJsZSBpdCBpcyBhIFBBR0VfU0laRSBhbGlnbmVkCi0gKiBhbHNvIHJlc2V0IGFsbCBkYXRhIHJlbGF0ZWQgdG8gSUNUIHRhYmxlIGludGVycnVwdC4KLSAqLwotaW50IGl3bF9hbGxvY19pc3JfaWN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQotCS8qIGFsbG9jYXRlIHNocmFyZWQgZGF0YSB0YWJsZSAqLwotCXByaXYtPl9hZ24uaWN0X3RibF92aXIgPQotCQlkbWFfYWxsb2NfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwKLQkJCQkgICAoc2l6ZW9mKHUzMikgKiBJQ1RfQ09VTlQpICsgUEFHRV9TSVpFLAotCQkJCSAgICZwcml2LT5fYWduLmljdF90YmxfZG1hLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPl9hZ24uaWN0X3RibF92aXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogYWxpZ24gdGFibGUgdG8gUEFHRV9TSVpFIGJvdW5kYXJ5ICovCi0JcHJpdi0+X2Fnbi5hbGlnbmVkX2ljdF90YmxfZG1hID0gQUxJR04ocHJpdi0+X2Fnbi5pY3RfdGJsX2RtYSwgUEFHRV9TSVpFKTsKLQotCUlXTF9ERUJVR19JU1IocHJpdiwgImljdCBkbWEgYWRkciAlTHggZG1hIGFsaWduZWQgJUx4IGRpZmYgJWRcbiIsCi0JCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHJpdi0+X2Fnbi5pY3RfdGJsX2RtYSwKLQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwcml2LT5fYWduLmFsaWduZWRfaWN0X3RibF9kbWEsCi0JCQkoaW50KShwcml2LT5fYWduLmFsaWduZWRfaWN0X3RibF9kbWEgLSBwcml2LT5fYWduLmljdF90YmxfZG1hKSk7Ci0KLQlwcml2LT5fYWduLmljdF90YmwgPSAgcHJpdi0+X2Fnbi5pY3RfdGJsX3ZpciArCi0JCQkgIChwcml2LT5fYWduLmFsaWduZWRfaWN0X3RibF9kbWEgLSBwcml2LT5fYWduLmljdF90YmxfZG1hKTsKLQotCUlXTF9ERUJVR19JU1IocHJpdiwgImljdCB2aXIgYWRkciAlcCB2aXIgYWxpZ25lZCAlcCBkaWZmICVkXG4iLAotCQkJICAgICBwcml2LT5fYWduLmljdF90YmwsIHByaXYtPl9hZ24uaWN0X3RibF92aXIsCi0JCQkoaW50KShwcml2LT5fYWduLmFsaWduZWRfaWN0X3RibF9kbWEgLSBwcml2LT5fYWduLmljdF90YmxfZG1hKSk7Ci0KLQkvKiByZXNldCB0YWJsZSBhbmQgaW5kZXggdG8gYWxsIDAgKi8KLQltZW1zZXQocHJpdi0+X2Fnbi5pY3RfdGJsX3ZpciwwLCAoc2l6ZW9mKHUzMikgKiBJQ1RfQ09VTlQpICsgUEFHRV9TSVpFKTsKLQlwcml2LT5fYWduLmljdF9pbmRleCA9IDA7Ci0KLQkvKiBhZGQgcGVyaW9kaWMgUlggaW50ZXJydXB0ICovCi0JcHJpdi0+aW50YV9tYXNrIHw9IENTUl9JTlRfQklUX1JYX1BFUklPRElDOwotCXJldHVybiAwOwotfQotCi0vKiBEZXZpY2UgaXMgZ29pbmcgdXAgaW5mb3JtIGl0IGFib3V0IHVzaW5nIElDVCBpbnRlcnJ1cHQgdGFibGUsCi0gKiBhbHNvIHdlIG5lZWQgdG8gdGVsbCB0aGUgZHJpdmVyIHRvIHN0YXJ0IHVzaW5nIElDVCBpbnRlcnJ1cHQuCi0gKi8KLWludCBpd2xfcmVzZXRfaWN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MzIgdmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIXByaXYtPl9hZ24uaWN0X3RibF92aXIpCi0JCXJldHVybiAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCi0JbWVtc2V0KCZwcml2LT5fYWduLmljdF90YmxbMF0sIDAsIHNpemVvZih1MzIpICogSUNUX0NPVU5UKTsKLQotCXZhbCA9IHByaXYtPl9hZ24uYWxpZ25lZF9pY3RfdGJsX2RtYSA+PiBQQUdFX1NISUZUOwotCi0JdmFsIHw9IENTUl9EUkFNX0lOVF9UQkxfRU5BQkxFOwotCXZhbCB8PSBDU1JfRFJBTV9JTklUX1RCTF9XUkFQX0NIRUNLOwotCi0JSVdMX0RFQlVHX0lTUihwcml2LCAiQ1NSX0RSQU1fSU5UX1RCTF9SRUcgPTB4JVggIgotCQkJImFsaWduZWQgZG1hIGFkZHJlc3MgJUx4XG4iLAotCQkJdmFsLCAodW5zaWduZWQgbG9uZyBsb25nKXByaXYtPl9hZ24uYWxpZ25lZF9pY3RfdGJsX2RtYSk7Ci0KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfRFJBTV9JTlRfVEJMX1JFRywgdmFsKTsKLQlwcml2LT5fYWduLnVzZV9pY3QgPSB0cnVlOwotCXByaXYtPl9hZ24uaWN0X2luZGV4ID0gMDsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCBwcml2LT5pbnRhX21hc2spOwotCWl3bF9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRGV2aWNlIGlzIGdvaW5nIGRvd24gZGlzYWJsZSBpY3QgaW50ZXJydXB0IHVzYWdlICovCi12b2lkIGl3bF9kaXNhYmxlX2ljdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcHJpdi0+X2Fnbi51c2VfaWN0ID0gZmFsc2U7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgaXdsX2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRhdGE7Ci0JdTMyIGludGEsIGludGFfbWFzazsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCi0JdTMyIGludGFfZmg7Ci0jZW5kaWYKLQlpZiAoIXByaXYpCi0JCXJldHVybiBJUlFfTk9ORTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBEaXNhYmxlIChidXQgZG9uJ3QgY2xlYXIhKSBpbnRlcnJ1cHRzIGhlcmUgdG8gYXZvaWQKLQkgKiAgICBiYWNrLXRvLWJhY2sgSVNScyBhbmQgc3BvcmFkaWMgaW50ZXJydXB0cyBmcm9tIG91ciBOSUMuCi0JICogSWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gc2VydmljZSwgdGhlIHRhc2tsZXQgd2lsbCByZS1lbmFibGUgaW50cy4KLQkgKiBJZiB3ZSAqZG9uJ3QqIGhhdmUgc29tZXRoaW5nLCB3ZSdsbCByZS1lbmFibGUgYmVmb3JlIGxlYXZpbmcgaGVyZS4gKi8KLQlpbnRhX21hc2sgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9JTlRfTUFTSyk7ICAvKiBqdXN0IGZvciBkZWJ1ZyAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlRfTUFTSywgMHgwMDAwMDAwMCk7Ci0KLQkvKiBEaXNjb3ZlciB3aGljaCBpbnRlcnJ1cHRzIGFyZSBhY3RpdmUvcGVuZGluZyAqLwotCWludGEgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9JTlQpOwotCi0JLyogSWdub3JlIGludGVycnVwdCBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gTklDIHRvIHNlcnZpY2UuCi0JICogVGhpcyBtYXkgYmUgZHVlIHRvIElSUSBzaGFyZWQgd2l0aCBhbm90aGVyIGRldmljZSwKLQkgKiBvciBkdWUgdG8gc3BvcmFkaWMgaW50ZXJydXB0cyB0aHJvd24gZnJvbSBvdXIgTklDLiAqLwotCWlmICghaW50YSkgewotCQlJV0xfREVCVUdfSVNSKHByaXYsICJJZ25vcmUgaW50ZXJydXB0LCBpbnRhID09IDBcbiIpOwotCQlnb3RvIG5vbmU7Ci0JfQotCi0JaWYgKChpbnRhID09IDB4RkZGRkZGRkYpIHx8ICgoaW50YSAmIDB4RkZGRkZGRjApID09IDB4YTVhNWE1YTApKSB7Ci0JCS8qIEhhcmR3YXJlIGRpc2FwcGVhcmVkLiBJdCBtaWdodCBoYXZlIGFscmVhZHkgcmFpc2VkCi0JCSAqIGFuIGludGVycnVwdCAqLwotCQlJV0xfV0FSTihwcml2LCAiSEFSRFdBUkUgR09ORT8/IElOVEEgPT0gMHglMDh4XG4iLCBpbnRhKTsKLQkJZ290byB1bnBsdWdnZWQ7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKLQlpZiAoaXdsX2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIChJV0xfRExfSVNSKSkgewotCQlpbnRhX2ZoID0gaXdsX3JlYWQzMihwcml2LCBDU1JfRkhfSU5UX1NUQVRVUyk7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwgIklTUiBpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsICIKLQkJCSAgICAgICJmaCAweCUwOHhcbiIsIGludGEsIGludGFfbWFzaywgaW50YV9maCk7Ci0JfQotI2VuZGlmCi0KLQlwcml2LT5fYWduLmludGEgfD0gaW50YTsKLQkvKiBpd2xfaXJxX3Rhc2tsZXQoKSB3aWxsIHNlcnZpY2UgaW50ZXJydXB0cyBhbmQgcmUtZW5hYmxlIHRoZW0gKi8KLQlpZiAobGlrZWx5KGludGEpKQotCQl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfdGFza2xldCk7Ci0JZWxzZSBpZiAodGVzdF9iaXQoU1RBVFVTX0lOVF9FTkFCTEVELCAmcHJpdi0+c3RhdHVzKSAmJiAhcHJpdi0+X2Fnbi5pbnRhKQotCQlpd2xfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0KLSB1bnBsdWdnZWQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfSEFORExFRDsKLQotIG5vbmU6Ci0JLyogcmUtZW5hYmxlIGludGVycnVwdHMgaGVyZSBzaW5jZSB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHNlcnZpY2UuICovCi0JLyogb25seSBSZS1lbmFibGUgaWYgZGlzYWJsZWQgYnkgaXJxICBhbmQgbm8gc2NoZWR1bGVzIHRhc2tsZXQuICovCi0JaWYgKHRlc3RfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cykgJiYgIXByaXYtPl9hZ24uaW50YSkKLQkJaXdsX2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotLyogaW50ZXJydXB0IGhhbmRsZXIgdXNpbmcgaWN0IHRhYmxlLCB3aXRoIHRoaXMgaW50ZXJydXB0IGRyaXZlciB3aWxsCi0gKiBzdG9wIHVzaW5nIElOVEEgcmVnaXN0ZXIgdG8gZ2V0IGRldmljZSdzIGludGVycnVwdCwgcmVhZGluZyB0aGlzIHJlZ2lzdGVyCi0gKiBpcyBleHBlbnNpdmUsIGRldmljZSB3aWxsIHdyaXRlIGludGVycnVwdHMgaW4gSUNUIGRyYW0gdGFibGUsIGluY3JlbWVudAotICogaW5kZXggdGhlbiB3aWxsIGZpcmUgaW50ZXJydXB0IHRvIGRyaXZlciwgZHJpdmVyIHdpbGwgT1IgYWxsIElDVCB0YWJsZQotICogZW50cmllcyBmcm9tIGN1cnJlbnQgaW5kZXggdXAgdG8gdGFibGUgZW50cnkgd2l0aCAwIHZhbHVlLiB0aGUgcmVzdWx0IGlzCi0gKiB0aGUgaW50ZXJydXB0IHdlIG5lZWQgdG8gc2VydmljZSwgZHJpdmVyIHdpbGwgc2V0IHRoZSBlbnRyaWVzIGJhY2sgdG8gMCBhbmQKLSAqIHNldCBpbmRleC4KLSAqLwotaXJxcmV0dXJuX3QgaXdsX2lzcl9pY3QoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkYXRhOwotCXUzMiBpbnRhLCBpbnRhX21hc2s7Ci0JdTMyIHZhbCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghcHJpdikKLQkJcmV0dXJuIElSUV9OT05FOwotCi0JLyogZHJhbSBpbnRlcnJ1cHQgdGFibGUgbm90IHNldCB5ZXQsCi0JICogdXNlIGxlZ2FjeSBpbnRlcnJ1cHQuCi0JICovCi0JaWYgKCFwcml2LT5fYWduLnVzZV9pY3QpCi0JCXJldHVybiBpd2xfaXNyKGlycSwgZGF0YSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogRGlzYWJsZSAoYnV0IGRvbid0IGNsZWFyISkgaW50ZXJydXB0cyBoZXJlIHRvIGF2b2lkCi0JICogYmFjay10by1iYWNrIElTUnMgYW5kIHNwb3JhZGljIGludGVycnVwdHMgZnJvbSBvdXIgTklDLgotCSAqIElmIHdlIGhhdmUgc29tZXRoaW5nIHRvIHNlcnZpY2UsIHRoZSB0YXNrbGV0IHdpbGwgcmUtZW5hYmxlIGludHMuCi0JICogSWYgd2UgKmRvbid0KiBoYXZlIHNvbWV0aGluZywgd2UnbGwgcmUtZW5hYmxlIGJlZm9yZSBsZWF2aW5nIGhlcmUuCi0JICovCi0JaW50YV9tYXNrID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UX01BU0spOyAgLyoganVzdCBmb3IgZGVidWcgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5UX01BU0ssIDB4MDAwMDAwMDApOwotCi0KLQkvKiBJZ25vcmUgaW50ZXJydXB0IGlmIHRoZXJlJ3Mgbm90aGluZyBpbiBOSUMgdG8gc2VydmljZS4KLQkgKiBUaGlzIG1heSBiZSBkdWUgdG8gSVJRIHNoYXJlZCB3aXRoIGFub3RoZXIgZGV2aWNlLAotCSAqIG9yIGR1ZSB0byBzcG9yYWRpYyBpbnRlcnJ1cHRzIHRocm93biBmcm9tIG91ciBOSUMuICovCi0JaWYgKCFwcml2LT5fYWduLmljdF90YmxbcHJpdi0+X2Fnbi5pY3RfaW5kZXhdKSB7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwgIklnbm9yZSBpbnRlcnJ1cHQsIGludGEgPT0gMFxuIik7Ci0JCWdvdG8gbm9uZTsKLQl9Ci0KLQkvKiByZWFkIGFsbCBlbnRyaWVzIHRoYXQgbm90IDAgc3RhcnQgd2l0aCBpY3RfaW5kZXggKi8KLQl3aGlsZSAocHJpdi0+X2Fnbi5pY3RfdGJsW3ByaXYtPl9hZ24uaWN0X2luZGV4XSkgewotCi0JCXZhbCB8PSBsZTMyX3RvX2NwdShwcml2LT5fYWduLmljdF90YmxbcHJpdi0+X2Fnbi5pY3RfaW5kZXhdKTsKLQkJSVdMX0RFQlVHX0lTUihwcml2LCAiSUNUIGluZGV4ICVkIHZhbHVlIDB4JTA4WFxuIiwKLQkJCQlwcml2LT5fYWduLmljdF9pbmRleCwKLQkJCQlsZTMyX3RvX2NwdShwcml2LT5fYWduLmljdF90YmxbcHJpdi0+X2Fnbi5pY3RfaW5kZXhdKSk7Ci0JCXByaXYtPl9hZ24uaWN0X3RibFtwcml2LT5fYWduLmljdF9pbmRleF0gPSAwOwotCQlwcml2LT5fYWduLmljdF9pbmRleCA9IGl3bF9xdWV1ZV9pbmNfd3JhcChwcml2LT5fYWduLmljdF9pbmRleCwKLQkJCQkJCSAgICAgSUNUX0NPVU5UKTsKLQotCX0KLQotCS8qIFdlIHNob3VsZCBub3QgZ2V0IHRoaXMgdmFsdWUsIGp1c3QgaWdub3JlIGl0LiAqLwotCWlmICh2YWwgPT0gMHhmZmZmZmZmZikKLQkJdmFsID0gMDsKLQotCS8qCi0JICogdGhpcyBpcyBhIHcvYSBmb3IgYSBoL3cgYnVnLiB0aGUgaC93IGJ1ZyBtYXkgY2F1c2UgdGhlIFJ4IGJpdAotCSAqIChiaXQgMTUgYmVmb3JlIHNoaWZ0aW5nIGl0IHRvIDMxKSB0byBjbGVhciB3aGVuIHVzaW5nIGludGVycnVwdAotCSAqIGNvYWxlc2NpbmcuIGZvcnR1bmF0ZWx5LCBiaXRzIDE4IGFuZCAxOSBzdGF5IHNldCB3aGVuIHRoaXMgaGFwcGVucwotCSAqIHNvIHdlIHVzZSB0aGVtIHRvIGRlY2lkZSBvbiB0aGUgcmVhbCBzdGF0ZSBvZiB0aGUgUnggYml0LgotCSAqIEluIG9yZGVyIHdvcmRzLCBiaXQgMTUgaXMgc2V0IGlmIGJpdCAxOCBvciBiaXQgMTkgYXJlIHNldC4KLQkgKi8KLQlpZiAodmFsICYgMHhDMDAwMCkKLQkJdmFsIHw9IDB4ODAwMDsKLQotCWludGEgPSAoMHhmZiAmIHZhbCkgfCAoKDB4ZmYwMCAmIHZhbCkgPDwgMTYpOwotCUlXTF9ERUJVR19JU1IocHJpdiwgIklTUiBpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHggaWN0IDB4JTA4eFxuIiwKLQkJCWludGEsIGludGFfbWFzaywgdmFsKTsKLQotCWludGEgJj0gcHJpdi0+aW50YV9tYXNrOwotCXByaXYtPl9hZ24uaW50YSB8PSBpbnRhOwotCi0JLyogaXdsX2lycV90YXNrbGV0KCkgd2lsbCBzZXJ2aWNlIGludGVycnVwdHMgYW5kIHJlLWVuYWJsZSB0aGVtICovCi0JaWYgKGxpa2VseShpbnRhKSkKLQkJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3Rhc2tsZXQpOwotCWVsc2UgaWYgKHRlc3RfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cykgJiYgIXByaXYtPl9hZ24uaW50YSkgewotCQkvKiBBbGxvdyBpbnRlcnJ1cHQgaWYgd2FzIGRpc2FibGVkIGJ5IHRoaXMgaGFuZGxlciBhbmQKLQkJICogbm8gdGFza2xldCB3YXMgc2NoZWR1bGVzLCBXZSBzaG91bGQgbm90IGVuYWJsZSBpbnRlcnJ1cHQsCi0JCSAqIHRhc2tsZXQgd2lsbCBlbmFibGUgaXQuCi0JCSAqLwotCQlpd2xfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfSEFORExFRDsKLQotIG5vbmU6Ci0JLyogcmUtZW5hYmxlIGludGVycnVwdHMgaGVyZSBzaW5jZSB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHNlcnZpY2UuCi0JICogb25seSBSZS1lbmFibGUgaWYgZGlzYWJsZWQgYnkgaXJxLgotCSAqLwotCWlmICh0ZXN0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZwcml2LT5zdGF0dXMpICYmICFwcml2LT5fYWduLmludGEpCi0JCWl3bF9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gSVJRX05PTkU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tbGliLmMKaW5kZXggZjgwM2ZiNi4uM2JlZTBmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1saWIuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgIml3bC1hZ24taHcuaCIKICNpbmNsdWRlICJpd2wtYWduLmgiCiAjaW5jbHVkZSAiaXdsLXN0YS5oIgorI2luY2x1ZGUgIml3bC10cmFucy5oIgogCiBzdGF0aWMgaW5saW5lIHUzMiBpd2xhZ25fZ2V0X3NjZF9zc24oc3RydWN0IGl3bGFnbl90eF9yZXNwICp0eF9yZXNwKQogewpAQCAtNTIsNzMgKzUzLDczIEBACiAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgVFhfU1RBVFVTX1BPU1RQT05FX0RFTEFZOgotCQlwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLnBwX2RlbGF5Kys7CisJCXByaXYtPnJlcGx5X3R4X3N0YXRzLnBwX2RlbGF5Kys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX1BPU1RQT05FX0ZFV19CWVRFUzoKLQkJcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy5wcF9mZXdfYnl0ZXMrKzsKKwkJcHJpdi0+cmVwbHlfdHhfc3RhdHMucHBfZmV3X2J5dGVzKys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX1BPU1RQT05FX0JUX1BSSU86Ci0JCXByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMucHBfYnRfcHJpbysrOworCQlwcml2LT5yZXBseV90eF9zdGF0cy5wcF9idF9wcmlvKys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX1BPU1RQT05FX1FVSUVUX1BFUklPRDoKLQkJcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy5wcF9xdWlldF9wZXJpb2QrKzsKKwkJcHJpdi0+cmVwbHlfdHhfc3RhdHMucHBfcXVpZXRfcGVyaW9kKys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX1BPU1RQT05FX0NBTENfVFRBSzoKLQkJcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy5wcF9jYWxjX3R0YWsrKzsKKwkJcHJpdi0+cmVwbHlfdHhfc3RhdHMucHBfY2FsY190dGFrKys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX0ZBSUxfSU5URVJOQUxfQ1JPU1NFRF9SRVRSWToKLQkJcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy5pbnRfY3Jvc3NlZF9yZXRyeSsrOworCQlwcml2LT5yZXBseV90eF9zdGF0cy5pbnRfY3Jvc3NlZF9yZXRyeSsrOwogCQlicmVhazsKIAljYXNlIFRYX1NUQVRVU19GQUlMX1NIT1JUX0xJTUlUOgotCQlwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLnNob3J0X2xpbWl0Kys7CisJCXByaXYtPnJlcGx5X3R4X3N0YXRzLnNob3J0X2xpbWl0Kys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX0ZBSUxfTE9OR19MSU1JVDoKLQkJcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy5sb25nX2xpbWl0Kys7CisJCXByaXYtPnJlcGx5X3R4X3N0YXRzLmxvbmdfbGltaXQrKzsKIAkJYnJlYWs7CiAJY2FzZSBUWF9TVEFUVVNfRkFJTF9GSUZPX1VOREVSUlVOOgotCQlwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLmZpZm9fdW5kZXJydW4rKzsKKwkJcHJpdi0+cmVwbHlfdHhfc3RhdHMuZmlmb191bmRlcnJ1bisrOwogCQlicmVhazsKIAljYXNlIFRYX1NUQVRVU19GQUlMX0RSQUlOX0ZMT1c6Ci0JCXByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMuZHJhaW5fZmxvdysrOworCQlwcml2LT5yZXBseV90eF9zdGF0cy5kcmFpbl9mbG93Kys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX0ZBSUxfUkZLSUxMX0ZMVVNIOgotCQlwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLnJma2lsbF9mbHVzaCsrOworCQlwcml2LT5yZXBseV90eF9zdGF0cy5yZmtpbGxfZmx1c2grKzsKIAkJYnJlYWs7CiAJY2FzZSBUWF9TVEFUVVNfRkFJTF9MSUZFX0VYUElSRToKLQkJcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy5saWZlX2V4cGlyZSsrOworCQlwcml2LT5yZXBseV90eF9zdGF0cy5saWZlX2V4cGlyZSsrOwogCQlicmVhazsKIAljYXNlIFRYX1NUQVRVU19GQUlMX0RFU1RfUFM6Ci0JCXByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMuZGVzdF9wcysrOworCQlwcml2LT5yZXBseV90eF9zdGF0cy5kZXN0X3BzKys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX0ZBSUxfSE9TVF9BQk9SVEVEOgotCQlwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLmhvc3RfYWJvcnQrKzsKKwkJcHJpdi0+cmVwbHlfdHhfc3RhdHMuaG9zdF9hYm9ydCsrOwogCQlicmVhazsKIAljYXNlIFRYX1NUQVRVU19GQUlMX0JUX1JFVFJZOgotCQlwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLmJ0X3JldHJ5Kys7CisJCXByaXYtPnJlcGx5X3R4X3N0YXRzLmJ0X3JldHJ5Kys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX0ZBSUxfU1RBX0lOVkFMSUQ6Ci0JCXByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMuc3RhX2ludmFsaWQrKzsKKwkJcHJpdi0+cmVwbHlfdHhfc3RhdHMuc3RhX2ludmFsaWQrKzsKIAkJYnJlYWs7CiAJY2FzZSBUWF9TVEFUVVNfRkFJTF9GUkFHX0RST1BQRUQ6Ci0JCXByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMuZnJhZ19kcm9wKys7CisJCXByaXYtPnJlcGx5X3R4X3N0YXRzLmZyYWdfZHJvcCsrOwogCQlicmVhazsKIAljYXNlIFRYX1NUQVRVU19GQUlMX1RJRF9ESVNBQkxFOgotCQlwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLnRpZF9kaXNhYmxlKys7CisJCXByaXYtPnJlcGx5X3R4X3N0YXRzLnRpZF9kaXNhYmxlKys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX0ZBSUxfRklGT19GTFVTSEVEOgotCQlwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLmZpZm9fZmx1c2grKzsKKwkJcHJpdi0+cmVwbHlfdHhfc3RhdHMuZmlmb19mbHVzaCsrOwogCQlicmVhazsKIAljYXNlIFRYX1NUQVRVU19GQUlMX0lOU1VGRklDSUVOVF9DRl9QT0xMOgotCQlwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLmluc3VmZl9jZl9wb2xsKys7CisJCXByaXYtPnJlcGx5X3R4X3N0YXRzLmluc3VmZl9jZl9wb2xsKys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX0ZBSUxfUEFTU0lWRV9OT19SWDoKLQkJcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy5mYWlsX2h3X2Ryb3ArKzsKKwkJcHJpdi0+cmVwbHlfdHhfc3RhdHMuZmFpbF9od19kcm9wKys7CiAJCWJyZWFrOwogCWNhc2UgVFhfU1RBVFVTX0ZBSUxfTk9fQkVBQ09OX09OX1JBREFSOgotCQlwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLnN0YV9jb2xvcl9taXNtYXRjaCsrOworCQlwcml2LT5yZXBseV90eF9zdGF0cy5zdGFfY29sb3JfbWlzbWF0Y2grKzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy51bmtub3duKys7CisJCXByaXYtPnJlcGx5X3R4X3N0YXRzLnVua25vd24rKzsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTI5LDQzICsxMzAsNDMgQEAKIAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSBBR0dfVFhfU1RBVEVfVU5ERVJSVU5fTVNLOgotCQlwcml2LT5fYWduLnJlcGx5X2FnZ190eF9zdGF0cy51bmRlcnJ1bisrOworCQlwcml2LT5yZXBseV9hZ2dfdHhfc3RhdHMudW5kZXJydW4rKzsKIAkJYnJlYWs7CiAJY2FzZSBBR0dfVFhfU1RBVEVfQlRfUFJJT19NU0s6Ci0JCXByaXYtPl9hZ24ucmVwbHlfYWdnX3R4X3N0YXRzLmJ0X3ByaW8rKzsKKwkJcHJpdi0+cmVwbHlfYWdnX3R4X3N0YXRzLmJ0X3ByaW8rKzsKIAkJYnJlYWs7CiAJY2FzZSBBR0dfVFhfU1RBVEVfRkVXX0JZVEVTX01TSzoKLQkJcHJpdi0+X2Fnbi5yZXBseV9hZ2dfdHhfc3RhdHMuZmV3X2J5dGVzKys7CisJCXByaXYtPnJlcGx5X2FnZ190eF9zdGF0cy5mZXdfYnl0ZXMrKzsKIAkJYnJlYWs7CiAJY2FzZSBBR0dfVFhfU1RBVEVfQUJPUlRfTVNLOgotCQlwcml2LT5fYWduLnJlcGx5X2FnZ190eF9zdGF0cy5hYm9ydCsrOworCQlwcml2LT5yZXBseV9hZ2dfdHhfc3RhdHMuYWJvcnQrKzsKIAkJYnJlYWs7CiAJY2FzZSBBR0dfVFhfU1RBVEVfTEFTVF9TRU5UX1RUTF9NU0s6Ci0JCXByaXYtPl9hZ24ucmVwbHlfYWdnX3R4X3N0YXRzLmxhc3Rfc2VudF90dGwrKzsKKwkJcHJpdi0+cmVwbHlfYWdnX3R4X3N0YXRzLmxhc3Rfc2VudF90dGwrKzsKIAkJYnJlYWs7CiAJY2FzZSBBR0dfVFhfU1RBVEVfTEFTVF9TRU5UX1RSWV9DTlRfTVNLOgotCQlwcml2LT5fYWduLnJlcGx5X2FnZ190eF9zdGF0cy5sYXN0X3NlbnRfdHJ5Kys7CisJCXByaXYtPnJlcGx5X2FnZ190eF9zdGF0cy5sYXN0X3NlbnRfdHJ5Kys7CiAJCWJyZWFrOwogCWNhc2UgQUdHX1RYX1NUQVRFX0xBU1RfU0VOVF9CVF9LSUxMX01TSzoKLQkJcHJpdi0+X2Fnbi5yZXBseV9hZ2dfdHhfc3RhdHMubGFzdF9zZW50X2J0X2tpbGwrKzsKKwkJcHJpdi0+cmVwbHlfYWdnX3R4X3N0YXRzLmxhc3Rfc2VudF9idF9raWxsKys7CiAJCWJyZWFrOwogCWNhc2UgQUdHX1RYX1NUQVRFX1NDRF9RVUVSWV9NU0s6Ci0JCXByaXYtPl9hZ24ucmVwbHlfYWdnX3R4X3N0YXRzLnNjZF9xdWVyeSsrOworCQlwcml2LT5yZXBseV9hZ2dfdHhfc3RhdHMuc2NkX3F1ZXJ5Kys7CiAJCWJyZWFrOwogCWNhc2UgQUdHX1RYX1NUQVRFX1RFU1RfQkFEX0NSQzMyX01TSzoKLQkJcHJpdi0+X2Fnbi5yZXBseV9hZ2dfdHhfc3RhdHMuYmFkX2NyYzMyKys7CisJCXByaXYtPnJlcGx5X2FnZ190eF9zdGF0cy5iYWRfY3JjMzIrKzsKIAkJYnJlYWs7CiAJY2FzZSBBR0dfVFhfU1RBVEVfUkVTUE9OU0VfTVNLOgotCQlwcml2LT5fYWduLnJlcGx5X2FnZ190eF9zdGF0cy5yZXNwb25zZSsrOworCQlwcml2LT5yZXBseV9hZ2dfdHhfc3RhdHMucmVzcG9uc2UrKzsKIAkJYnJlYWs7CiAJY2FzZSBBR0dfVFhfU1RBVEVfRFVNUF9UWF9NU0s6Ci0JCXByaXYtPl9hZ24ucmVwbHlfYWdnX3R4X3N0YXRzLmR1bXBfdHgrKzsKKwkJcHJpdi0+cmVwbHlfYWdnX3R4X3N0YXRzLmR1bXBfdHgrKzsKIAkJYnJlYWs7CiAJY2FzZSBBR0dfVFhfU1RBVEVfREVMQVlfVFhfTVNLOgotCQlwcml2LT5fYWduLnJlcGx5X2FnZ190eF9zdGF0cy5kZWxheV90eCsrOworCQlwcml2LT5yZXBseV9hZ2dfdHhfc3RhdHMuZGVsYXlfdHgrKzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpdi0+X2Fnbi5yZXBseV9hZ2dfdHhfc3RhdHMudW5rbm93bisrOworCQlwcml2LT5yZXBseV9hZ2dfdHhfc3RhdHMudW5rbm93bisrOwogCQlicmVhazsKIAl9CiB9CkBAIC0zOTAsOCArMzkxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGl3bGFnbl9yeF9yZXBseV90eChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCit2b2lkIGl3bGFnbl9yeF9yZXBseV90eChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQogewogCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwogCXUxNiBzZXF1ZW5jZSA9IGxlMTZfdG9fY3B1KHBrdC0+aGRyLnNlcXVlbmNlKTsKQEAgLTQwMCw2ICs0MDAsNyBAQAogCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbdHhxX2lkXTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CiAJc3RydWN0IGl3bGFnbl90eF9yZXNwICp0eF9yZXNwID0gKHZvaWQgKikmcGt0LT51LnJhd1swXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCXN0cnVjdCBpd2xfdHhfaW5mbyAqdHhiOwogCXUzMiBzdGF0dXMgPSBsZTE2X3RvX2NwdSh0eF9yZXNwLT5zdGF0dXMuc3RhdHVzKTsKIAlpbnQgdGlkOwpAQCAtNDA4LDkgKzQwOSw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICgoaW5kZXggPj0gdHhxLT5xLm5fYmQpIHx8IChpd2xfcXVldWVfdXNlZCgmdHhxLT5xLCBpbmRleCkgPT0gMCkpIHsKLQkJSVdMX0VSUihwcml2LCAiUmVhZCBpbmRleCBmb3IgRE1BIHF1ZXVlIHR4cV9pZCAoJWQpIGluZGV4ICVkICIKLQkJCSAgImlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWRcbiIsIHR4cV9pZCwKLQkJCSAgaW5kZXgsIHR4cS0+cS5uX2JkLCB0eHEtPnEud3JpdGVfcHRyLAorCQlJV0xfRVJSKHByaXYsICIlczogUmVhZCBpbmRleCBmb3IgRE1BIHF1ZXVlIHR4cV9pZCAoJWQpICIKKwkJCSAgImluZGV4ICVkIGlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWRcbiIsIF9fZnVuY19fLAorCQkJICB0eHFfaWQsIGluZGV4LCB0eHEtPnEubl9iZCwgdHhxLT5xLndyaXRlX3B0ciwKIAkJCSAgdHhxLT5xLnJlYWRfcHRyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTQyNiw2ICs0MjcsMTEgQEAKIAkJSVdMQUdOX1RYX1JFU19SQV9QT1M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKKworCWhkciA9ICh2b2lkICopdHhiLT5za2ItPmRhdGE7CisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkKKwkJcHJpdi0+bGFzdF9zZXFfY3RsID0gdHhfcmVzcC0+c2VxX2N0bDsKKwogCWlmICh0eHEtPnNjaGVkX3JldHJ5KSB7CiAJCWNvbnN0IHUzMiBzY2Rfc3NuID0gaXdsYWduX2dldF9zY2Rfc3NuKHR4X3Jlc3ApOwogCQlzdHJ1Y3QgaXdsX2h0X2FnZyAqYWdnOwpAQCAtNDM4LDcgKzQ0NCw3IEBACiAJCWlmICh0eF9yZXNwLT5idF9raWxsX2NvdW50ICYmIHR4X3Jlc3AtPmZyYW1lX2NvdW50ID09IDEgJiYKIAkJICAgIHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCiAJCSAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgewotCQkJSVdMX1dBUk4ocHJpdiwgInJlY2VpdmUgcmVwbHkgdHggd2l0aCBidF9raWxsXG4iKTsKKwkJCUlXTF9ERUJVR19DT0VYKHByaXYsICJyZWNlaXZlIHJlcGx5IHR4IHdpdGggYnRfa2lsbFxuIik7CiAJCX0KIAkJaXdsYWduX3R4X3N0YXR1c19yZXBseV90eChwcml2LCBhZ2csIHR4X3Jlc3AsIHR4cV9pZCwgaW5kZXgpOwogCkBAIC00NzgsMjcgKzQ4NCw2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIH0KIAotdm9pZCBpd2xhZ25fcnhfaGFuZGxlcl9zZXR1cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogaW5pdCBjYWxpYnJhdGlvbiBoYW5kbGVycyAqLwotCXByaXYtPnJ4X2hhbmRsZXJzW0NBTElCUkFUSU9OX1JFU19OT1RJRklDQVRJT05dID0KLQkJCQkJaXdsYWduX3J4X2NhbGliX3Jlc3VsdDsKLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9UWF0gPSBpd2xhZ25fcnhfcmVwbHlfdHg7Ci0KLQkvKiBzZXQgdXAgbm90aWZpY2F0aW9uIHdhaXQgc3VwcG9ydCAqLwotCXNwaW5fbG9ja19pbml0KCZwcml2LT5fYWduLm5vdGlmX3dhaXRfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnByaXYtPl9hZ24ubm90aWZfd2FpdHMpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPl9hZ24ubm90aWZfd2FpdHEpOwotfQotCi12b2lkIGl3bGFnbl9zZXR1cF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKgotCSAqIG5vdGhpbmcgbmVlZCB0byBiZSBkb25lIGhlcmUgYW55bW9yZQotCSAqIHN0aWxsIGtlZXAgZm9yIGZ1dHVyZSB1c2UgaWYgbmVlZGVkCi0JICovCi19Ci0KIGludCBpd2xhZ25faHdfdmFsaWRfcnRjX2RhdGFfYWRkcih1MzIgYWRkcikKIHsKIAlyZXR1cm4gKGFkZHIgPj0gSVdMQUdOX1JUQ19EQVRBX0xPV0VSX0JPVU5EKSAmJgpAQCAtNTQwLDggKzUyNSw4IEBACiAJZWxzZQogCQl0eF9hbnRfY2ZnX2NtZCA9IFJFUExZX1RYX1BPV0VSX0RCTV9DTUQ7CiAKLQlyZXR1cm4gaXdsX3NlbmRfY21kX3BkdShwcml2LCB0eF9hbnRfY2ZnX2NtZCwgc2l6ZW9mKHR4X3Bvd2VyX2NtZCksCi0JCQkJJnR4X3Bvd2VyX2NtZCk7CisJcmV0dXJuIHRyYW5zX3NlbmRfY21kX3BkdSgmcHJpdi0+dHJhbnMsIHR4X2FudF9jZmdfY21kLCBDTURfU1lOQywKKwkJCXNpemVvZih0eF9wb3dlcl9jbWQpLCAmdHhfcG93ZXJfY21kKTsKIH0KIAogdm9pZCBpd2xhZ25fdGVtcGVyYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQpAQCAtNjEwLDggKzU5NSw3IEBACiAJcmV0dXJuIChhZGRyZXNzICYgQUREUkVTU19NU0spICsgKG9mZnNldCA8PCAxKTsKIH0KIAotY29uc3QgdTggKml3bGFnbl9lZXByb21fcXVlcnlfYWRkcihjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgIHNpemVfdCBvZmZzZXQpCitjb25zdCB1OCAqaXdsX2VlcHJvbV9xdWVyeV9hZGRyKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc2l6ZV90IG9mZnNldCkKIHsKIAl1MzIgYWRkcmVzcyA9IGVlcHJvbV9pbmRpcmVjdF9hZGRyZXNzKHByaXYsIG9mZnNldCk7CiAJQlVHX09OKGFkZHJlc3MgPj0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemUpOwpAQCAtNjIyLDM2NyArNjA2LDEyIEBACiAJLmFtc2R1X3NpemVfOEsgPSAxLAogCS5yZXN0YXJ0X2Z3ID0gMSwKIAkucGxjcF9jaGVjayA9IHRydWUsCisJLmJ0X2NvZXhfYWN0aXZlID0gdHJ1ZSwKKwkubm9fc2xlZXBfYXV0b2FkanVzdCA9IHRydWUsCisJLnBvd2VyX2xldmVsID0gSVdMX1BPV0VSX0lOREVYXzEsCiAJLyogdGhlIHJlc3QgYXJlIDAgYnkgZGVmYXVsdCAqLwogfTsKIAotdm9pZCBpd2xhZ25fcnhfcXVldWVfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfZnJlZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfdXNlZCk7Ci0JLyogRmlsbCB0aGUgcnhfdXNlZCBxdWV1ZSB3aXRoIF9hbGxfIG9mIHRoZSBSeCBidWZmZXJzICovCi0JZm9yIChpID0gMDsgaSA8IFJYX0ZSRUVfQlVGRkVSUyArIFJYX1FVRVVFX1NJWkU7IGkrKykgewotCQkvKiBJbiB0aGUgcmVzZXQgZnVuY3Rpb24sIHRoZXNlIGJ1ZmZlcnMgbWF5IGhhdmUgYmVlbiBhbGxvY2F0ZWQKLQkJICogdG8gYW4gU0tCLCBzbyB3ZSBuZWVkIHRvIHVubWFwIGFuZCBmcmVlIHBvdGVudGlhbCBzdG9yYWdlICovCi0JCWlmIChyeHEtPnBvb2xbaV0ucGFnZSAhPSBOVUxMKSB7Ci0JCQlwY2lfdW5tYXBfcGFnZShwcml2LT5wY2lfZGV2LCByeHEtPnBvb2xbaV0ucGFnZV9kbWEsCi0JCQkJUEFHRV9TSVpFIDw8IHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlfX2l3bF9mcmVlX3BhZ2VzKHByaXYsIHJ4cS0+cG9vbFtpXS5wYWdlKTsKLQkJCXJ4cS0+cG9vbFtpXS5wYWdlID0gTlVMTDsKLQkJfQotCQlsaXN0X2FkZF90YWlsKCZyeHEtPnBvb2xbaV0ubGlzdCwgJnJ4cS0+cnhfdXNlZCk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX1NJWkU7IGkrKykKLQkJcnhxLT5xdWV1ZVtpXSA9IE5VTEw7Ci0KLQkvKiBTZXQgdXMgc28gdGhhdCB3ZSBoYXZlIHByb2Nlc3NlZCBhbmQgdXNlZCBhbGwgYnVmZmVycywgYnV0IGhhdmUKLQkgKiBub3QgcmVzdG9ja2VkIHRoZSBSeCBxdWV1ZSB3aXRoIGZyZXNoIGJ1ZmZlcnMgKi8KLQlyeHEtPnJlYWQgPSByeHEtPndyaXRlID0gMDsKLQlyeHEtPndyaXRlX2FjdHVhbCA9IDA7Ci0JcnhxLT5mcmVlX2NvdW50ID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLX0KLQotaW50IGl3bGFnbl9yeF9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCXUzMiByYl9zaXplOwotCWNvbnN0IHUzMiByZmRubG9nID0gUlhfUVVFVUVfU0laRV9MT0c7IC8qIDI1NiBSQkRzICovCi0JdTMyIHJiX3RpbWVvdXQgPSAwOyAvKiBGSVhNRTogUlhfUkJfVElNRU9VVCBmb3IgYWxsIGRldmljZXM/ICovCi0KLQlyYl90aW1lb3V0ID0gUlhfUkJfVElNRU9VVDsKLQotCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5hbXNkdV9zaXplXzhLKQotCQlyYl9zaXplID0gRkhfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzhLOwotCWVsc2UKLQkJcmJfc2l6ZSA9IEZIX1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV80SzsKLQotCS8qIFN0b3AgUnggRE1BICovCi0JaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcsIDApOwotCi0JLyogUmVzZXQgZHJpdmVyJ3MgUnggcXVldWUgd3JpdGUgaW5kZXggKi8KLQlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcsIDApOwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgdG8gZmluZCBSQkQgY2lyY3VsYXIgYnVmZmVyIGluIERSQU0gKi8KLQlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfQkFTRV9SRUcsCi0JCQkgICAodTMyKShyeHEtPmJkX2RtYSA+PiA4KSk7Ci0KLQkvKiBUZWxsIGRldmljZSB3aGVyZSBpbiBEUkFNIHRvIHVwZGF0ZSBpdHMgUnggc3RhdHVzICovCi0JaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcsCi0JCQkgICByeHEtPnJiX3N0dHNfZG1hID4+IDQpOwotCi0JLyogRW5hYmxlIFJ4IERNQQotCSAqIEZIX1JDU1JfQ0hOTDBfUlhfSUdOT1JFX1JYRl9FTVBUWSBpcyBzZXQgYmVjYXVzZSBvZiBIVyBidWcgaW4KLQkgKiAgICAgIHRoZSBjcmVkaXQgbWVjaGFuaXNtIGluIDUwMDAgSFcgUlggRklGTwotCSAqIERpcmVjdCByeCBpbnRlcnJ1cHRzIHRvIGhvc3RzCi0JICogUnggYnVmZmVyIHNpemUgNCBvciA4awotCSAqIFJCIHRpbWVvdXQgMHgxMAotCSAqIDI1NiBSQkRzCi0JICovCi0JaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcsCi0JCQkgICBGSF9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX0VOQUJMRV9WQUwgfAotCQkJICAgRkhfUkNTUl9DSE5MMF9SWF9JR05PUkVfUlhGX0VNUFRZIHwKLQkJCSAgIEZIX1JDU1JfQ0hOTDBfUlhfQ09ORklHX0lSUV9ERVNUX0lOVF9IT1NUX1ZBTCB8Ci0JCQkgICBGSF9SQ1NSX0NITkwwX1JYX0NPTkZJR19TSU5HTEVfRlJBTUVfTVNLIHwKLQkJCSAgIHJiX3NpemV8Ci0JCQkgICAocmJfdGltZW91dCA8PCBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfSVJRX1JCVEhfUE9TKXwKLQkJCSAgIChyZmRubG9nIDw8IEZIX1JDU1JfUlhfQ09ORklHX1JCRENCX1NJWkVfUE9TKSk7Ci0KLQkvKiBTZXQgaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZXIgdG8gZGVmYXVsdCAoMjA0OCB1c2VjcykgKi8KLQlpd2xfd3JpdGU4KHByaXYsIENTUl9JTlRfQ09BTEVTQ0lORywgSVdMX0hPU1RfSU5UX1RJTUVPVVRfREVGKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpd2xhZ25fc2V0X3B3cl92bWFpbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0vKgotICogKGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzKQotICogdG8gc2V0IHBvd2VyIHRvIFZfQVVYLCBkbzoKLQotCQlpZiAocGNpX3BtZV9jYXBhYmxlKHByaXYtPnBjaV9kZXYsIFBDSV9EM2NvbGQpKQotCQkJaXdsX3NldF9iaXRzX21hc2tfcHJwaChwcml2LCBBUE1HX1BTX0NUUkxfUkVHLAotCQkJCQkgICAgICAgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZBVVgsCi0JCQkJCSAgICAgICB+QVBNR19QU19DVFJMX01TS19QV1JfU1JDKTsKLSAqLwotCi0JaXdsX3NldF9iaXRzX21hc2tfcHJwaChwcml2LCBBUE1HX1BTX0NUUkxfUkVHLAotCQkJICAgICAgIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WTUFJTiwKLQkJCSAgICAgICB+QVBNR19QU19DVFJMX01TS19QV1JfU1JDKTsKLX0KLQotaW50IGl3bGFnbl9od19uaWNfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOwotCWludCByZXQ7Ci0KLQkvKiBuaWNfaW5pdCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KHByaXYpOwotCi0JLyogU2V0IGludGVycnVwdCBjb2FsZXNjaW5nIGNhbGlicmF0aW9uIHRpbWVyIHRvIGRlZmF1bHQgKDUxMiB1c2VjcykgKi8KLQlpd2xfd3JpdGU4KHByaXYsIENTUl9JTlRfQ09BTEVTQ0lORywgSVdMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfREVGKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWl3bGFnbl9zZXRfcHdyX3ZtYWluKHByaXYpOwotCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5jb25maWcocHJpdik7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgUlggcXVldWUsIG9yIHJlc2V0IGlmIGl0IGlzIGFscmVhZHkgYWxsb2NhdGVkICovCi0JaWYgKCFyeHEtPmJkKSB7Ci0JCXJldCA9IGl3bF9yeF9xdWV1ZV9hbGxvYyhwcml2KTsKLQkJaWYgKHJldCkgewotCQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXRpYWxpemUgUnggcXVldWVcbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9IGVsc2UKLQkJaXdsYWduX3J4X3F1ZXVlX3Jlc2V0KHByaXYsIHJ4cSk7Ci0KLQlpd2xhZ25fcnhfcmVwbGVuaXNoKHByaXYpOwotCi0JaXdsYWduX3J4X2luaXQocHJpdiwgcnhxKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlyeHEtPm5lZWRfdXBkYXRlID0gMTsKLQlpd2xfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihwcml2LCByeHEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQWxsb2NhdGUgb3IgcmVzZXQgYW5kIGluaXQgYWxsIFR4IGFuZCBDb21tYW5kIHF1ZXVlcyAqLwotCWlmICghcHJpdi0+dHhxKSB7Ci0JCXJldCA9IGl3bGFnbl90eHFfY3R4X2FsbG9jKHByaXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9IGVsc2UKLQkJaXdsYWduX3R4cV9jdHhfcmVzZXQocHJpdik7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+c2hhZG93X3JlZ19lbmFibGUpIHsKLQkJLyogZW5hYmxlIHNoYWRvdyByZWdzIGluIEhXICovCi0JCWl3bF9zZXRfYml0KHByaXYsIENTUl9NQUNfU0hBRE9XX1JFR19DVFJMLAotCQkJMHg4MDBGRkZGRik7Ci0JfQotCi0Jc2V0X2JpdChTVEFUVVNfSU5JVCwgJnByaXYtPnN0YXR1cyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2xhZ25fZG1hX2FkZHIycmJkX3B0ciAtIGNvbnZlcnQgYSBETUEgYWRkcmVzcyB0byBhIHVDb2RlIHJlYWQgYnVmZmVyIHB0cgotICovCi1zdGF0aWMgaW5saW5lIF9fbGUzMiBpd2xhZ25fZG1hX2FkZHIycmJkX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgZG1hX2FkZHJfdCBkbWFfYWRkcikKLXsKLQlyZXR1cm4gY3B1X3RvX2xlMzIoKHUzMikoZG1hX2FkZHIgPj4gOCkpOwotfQotCi0vKioKLSAqIGl3bGFnbl9yeF9xdWV1ZV9yZXN0b2NrIC0gcmVmaWxsIFJYIHF1ZXVlIGZyb20gcHJlLWFsbG9jYXRlZCBwb29sCi0gKgotICogSWYgdGhlcmUgYXJlIHNsb3RzIGluIHRoZSBSWCBxdWV1ZSB0aGF0IG5lZWQgdG8gYmUgcmVzdG9ja2VkLAotICogYW5kIHdlIGhhdmUgZnJlZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlcnMsIGZpbGwgdGhlIHJhbmtzIGFzIG11Y2gKLSAqIGFzIHdlIGNhbiwgcHVsbGluZyBmcm9tIHJ4X2ZyZWUuCi0gKgotICogVGhpcyBtb3ZlcyB0aGUgJ3dyaXRlJyBpbmRleCBmb3J3YXJkIHRvIGNhdGNoIHVwIHdpdGggJ3Byb2Nlc3NlZCcsIGFuZAotICogYWxzbyB1cGRhdGVzIHRoZSBtZW1vcnkgYWRkcmVzcyBpbiB0aGUgZmlybXdhcmUgdG8gcmVmZXJlbmNlIHRoZSBuZXcKLSAqIHRhcmdldCBidWZmZXIuCi0gKi8KLXZvaWQgaXdsYWduX3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKLQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCXdoaWxlICgoaXdsX3J4X3F1ZXVlX3NwYWNlKHJ4cSkgPiAwKSAmJiAocnhxLT5mcmVlX2NvdW50KSkgewotCQkvKiBUaGUgb3ZlcndyaXR0ZW4gcnhiIG11c3QgYmUgYSB1c2VkIG9uZSAqLwotCQlyeGIgPSByeHEtPnF1ZXVlW3J4cS0+d3JpdGVdOwotCQlCVUdfT04ocnhiICYmIHJ4Yi0+cGFnZSk7Ci0KLQkJLyogR2V0IG5leHQgZnJlZSBSeCBidWZmZXIsIHJlbW92ZSBmcm9tIGZyZWUgbGlzdCAqLwotCQllbGVtZW50ID0gcnhxLT5yeF9mcmVlLm5leHQ7Ci0JCXJ4YiA9IGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyLCBsaXN0KTsKLQkJbGlzdF9kZWwoZWxlbWVudCk7Ci0KLQkJLyogUG9pbnQgdG8gUnggYnVmZmVyIHZpYSBuZXh0IFJCRCBpbiBjaXJjdWxhciBidWZmZXIgKi8KLQkJcnhxLT5iZFtyeHEtPndyaXRlXSA9IGl3bGFnbl9kbWFfYWRkcjJyYmRfcHRyKHByaXYsCi0JCQkJCQkJICAgICAgcnhiLT5wYWdlX2RtYSk7Ci0JCXJ4cS0+cXVldWVbcnhxLT53cml0ZV0gPSByeGI7Ci0JCXJ4cS0+d3JpdGUgPSAocnhxLT53cml0ZSArIDEpICYgUlhfUVVFVUVfTUFTSzsKLQkJcnhxLT5mcmVlX2NvdW50LS07Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCS8qIElmIHRoZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlciBwb29sIGlzIGRyb3BwaW5nIGxvdywgc2NoZWR1bGUgdG8KLQkgKiByZWZpbGwgaXQgKi8KLQlpZiAocnhxLT5mcmVlX2NvdW50IDw9IFJYX0xPV19XQVRFUk1BUkspCi0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cnhfcmVwbGVuaXNoKTsKLQotCi0JLyogSWYgd2UndmUgYWRkZWQgbW9yZSBzcGFjZSBmb3IgdGhlIGZpcm13YXJlIHRvIHBsYWNlIGRhdGEsIHRlbGwgaXQuCi0JICogSW5jcmVtZW50IGRldmljZSdzIHdyaXRlIHBvaW50ZXIgaW4gbXVsdGlwbGVzIG9mIDguICovCi0JaWYgKHJ4cS0+d3JpdGVfYWN0dWFsICE9IChyeHEtPndyaXRlICYgfjB4NykpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQlyeHEtPm5lZWRfdXBkYXRlID0gMTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0JCWl3bF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHByaXYsIHJ4cSk7Ci0JfQotfQotCi0vKioKLSAqIGl3bGFnbl9yeF9yZXBsZW5pc2ggLSBNb3ZlIGFsbCB1c2VkIHBhY2tldCBmcm9tIHJ4X3VzZWQgdG8gcnhfZnJlZQotICoKLSAqIFdoZW4gbW92aW5nIHRvIHJ4X2ZyZWUgYW4gU0tCIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNsb3QuCi0gKgotICogQWxzbyByZXN0b2NrIHRoZSBSeCBxdWV1ZSB2aWEgaXdsX3J4X3F1ZXVlX3Jlc3RvY2suCi0gKiBUaGlzIGlzIGNhbGxlZCBhcyBhIHNjaGVkdWxlZCB3b3JrIGl0ZW0gKGV4Y2VwdCBmb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uKQotICovCi12b2lkIGl3bGFnbl9yeF9hbGxvY2F0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGdmcF90IHByaW9yaXR5KQotewotCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKLQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWdmcF90IGdmcF9tYXNrID0gcHJpb3JpdHk7Ci0KLQl3aGlsZSAoMSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0JCWlmIChsaXN0X2VtcHR5KCZyeHEtPnJ4X3VzZWQpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAocnhxLT5mcmVlX2NvdW50ID4gUlhfTE9XX1dBVEVSTUFSSykKLQkJCWdmcF9tYXNrIHw9IF9fR0ZQX05PV0FSTjsKLQotCQlpZiAocHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIgPiAwKQotCQkJZ2ZwX21hc2sgfD0gX19HRlBfQ09NUDsKLQotCQkvKiBBbGxvYyBhIG5ldyByZWNlaXZlIGJ1ZmZlciAqLwotCQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwX21hc2ssIHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKLQkJaWYgKCFwYWdlKSB7Ci0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJhbGxvY19wYWdlcyBmYWlsZWQsICIKLQkJCQkJICAgICAgICJvcmRlcjogJWRcbiIsCi0JCQkJCSAgICAgICBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7Ci0KLQkJCWlmICgocnhxLT5mcmVlX2NvdW50IDw9IFJYX0xPV19XQVRFUk1BUkspICYmCi0JCQkgICAgbmV0X3JhdGVsaW1pdCgpKQotCQkJCUlXTF9DUklUKHByaXYsICJGYWlsZWQgdG8gYWxsb2NfcGFnZXMgd2l0aCAlcy4gT25seSAldSBmcmVlIGJ1ZmZlcnMgcmVtYWluaW5nLlxuIiwKLQkJCQkJIHByaW9yaXR5ID09IEdGUF9BVE9NSUMgPyAgIkdGUF9BVE9NSUMiIDogIkdGUF9LRVJORUwiLAotCQkJCQkgcnhxLT5mcmVlX2NvdW50KTsKLQkJCS8qIFdlIGRvbid0IHJlc2NoZWR1bGUgcmVwbGVuaXNoIHdvcmsgaGVyZSAtLSB3ZSB3aWxsCi0JCQkgKiBjYWxsIHRoZSByZXN0b2NrIG1ldGhvZCBhbmQgaWYgaXQgc3RpbGwgbmVlZHMKLQkJCSAqIG1vcmUgYnVmZmVycyBpdCB3aWxsIHNjaGVkdWxlIHJlcGxlbmlzaCAqLwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChsaXN0X2VtcHR5KCZyeHEtPnJ4X3VzZWQpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJCV9fZnJlZV9wYWdlcyhwYWdlLCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxlbWVudCA9IHJ4cS0+cnhfdXNlZC5uZXh0OwotCQlyeGIgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKGVsZW1lbnQpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCUJVR19PTihyeGItPnBhZ2UpOwotCQlyeGItPnBhZ2UgPSBwYWdlOwotCQkvKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgUkIgKi8KLQkJcnhiLT5wYWdlX2RtYSA9IHBjaV9tYXBfcGFnZShwcml2LT5wY2lfZGV2LCBwYWdlLCAwLAotCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkvKiBkbWEgYWRkcmVzcyBtdXN0IGJlIG5vIG1vcmUgdGhhbiAzNiBiaXRzICovCi0JCUJVR19PTihyeGItPnBhZ2VfZG1hICYgfkRNQV9CSVRfTUFTSygzNikpOwotCQkvKiBhbmQgYWxzbyAyNTYgYnl0ZSBhbGlnbmVkISAqLwotCQlCVUdfT04ocnhiLT5wYWdlX2RtYSAmIERNQV9CSVRfTUFTSyg4KSk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7Ci0JCXJ4cS0+ZnJlZV9jb3VudCsrOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCX0KLX0KLQotdm9pZCBpd2xhZ25fcnhfcmVwbGVuaXNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaXdsYWduX3J4X2FsbG9jYXRlKHByaXYsIEdGUF9LRVJORUwpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xhZ25fcnhfcXVldWVfcmVzdG9jayhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgaXdsYWduX3J4X3JlcGxlbmlzaF9ub3coc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWl3bGFnbl9yeF9hbGxvY2F0ZShwcml2LCBHRlBfQVRPTUlDKTsKLQotCWl3bGFnbl9yeF9xdWV1ZV9yZXN0b2NrKHByaXYpOwotfQotCi0vKiBBc3N1bWVzIHRoYXQgdGhlIHNrYiBmaWVsZCBvZiB0aGUgYnVmZmVycyBpbiAncG9vbCcgaXMga2VwdCBhY2N1cmF0ZS4KLSAqIElmIGFuIFNLQiBoYXMgYmVlbiBkZXRhY2hlZCwgdGhlIFBPT0wgbmVlZHMgdG8gaGF2ZSBpdHMgU0tCIHNldCB0byBOVUxMCi0gKiBUaGlzIGZyZWUgcm91dGluZSB3YWxrcyB0aGUgbGlzdCBvZiBQT09MIGVudHJpZXMgYW5kIGlmIFNLQiBpcyBzZXQgdG8KLSAqIG5vbiBOVUxMIGl0IGlzIHVubWFwcGVkIGFuZCBmcmVlZAotICovCi12b2lkIGl3bGFnbl9yeF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9TSVpFICsgUlhfRlJFRV9CVUZGRVJTOyBpKyspIHsKLQkJaWYgKHJ4cS0+cG9vbFtpXS5wYWdlICE9IE5VTEwpIHsKLQkJCXBjaV91bm1hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4cS0+cG9vbFtpXS5wYWdlX2RtYSwKLQkJCQlQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCV9faXdsX2ZyZWVfcGFnZXMocHJpdiwgcnhxLT5wb29sW2ldLnBhZ2UpOwotCQkJcnhxLT5wb29sW2ldLnBhZ2UgPSBOVUxMOwotCQl9Ci0JfQotCi0JZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwgNCAqIFJYX1FVRVVFX1NJWkUsIHJ4cS0+YmQsCi0JCQkgIHJ4cS0+YmRfZG1hKTsKLQlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGl3bF9yYl9zdGF0dXMpLAotCQkJICByeHEtPnJiX3N0dHMsIHJ4cS0+cmJfc3R0c19kbWEpOwotCXJ4cS0+YmQgPSBOVUxMOwotCXJ4cS0+cmJfc3R0cyAgPSBOVUxMOwotfQotCi1pbnQgaXdsYWduX3J4cV9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQotCS8qIHN0b3AgUnggRE1BICovCi0JaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcsIDApOwotCWl3bF9wb2xsX2RpcmVjdF9iaXQocHJpdiwgRkhfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRywKLQkJCSAgICBGSF9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUsIDEwMDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KIGludCBpd2xhZ25faHdyYXRlX3RvX21hYzgwMjExX2lkeCh1MzIgcmF0ZV9uX2ZsYWdzLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCiB7CiAJaW50IGlkeCA9IDA7CkBAIC0xMTI2LDcgKzc1NSw3IEBACiAKIHN0YXRpYyBpbnQgaXdsX2ZpbGxfb2ZmY2hfdHgoc3RydWN0IGl3bF9wcml2ICpwcml2LCB2b2lkICpkYXRhLCBzaXplX3QgbWF4bGVuKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT5fYWduLm9mZmNoYW5fdHhfc2tiOworCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT5vZmZjaGFuX3R4X3NrYjsKIAogCWlmIChza2ItPmxlbiA8IG1heGxlbikKIAkJbWF4bGVuID0gc2tiLT5sZW47CkBAIC0xMTQxLDYgKzc3MCw3IEBACiAJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7CiAJCS5pZCA9IFJFUExZX1NDQU5fQ01ELAogCQkubGVuID0geyBzaXplb2Yoc3RydWN0IGl3bF9zY2FuX2NtZCksIH0sCisJCS5mbGFncyA9IENNRF9TWU5DLAogCX07CiAJc3RydWN0IGl3bF9zY2FuX2NtZCAqc2NhbjsKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwpAQCAtMTIxMSw3ICs4NDEsNyBAQAogCX0gZWxzZSBpZiAocHJpdi0+c2Nhbl90eXBlID09IElXTF9TQ0FOX09GRkNIX1RYKSB7CiAJCXNjYW4tPnN1c3BlbmRfdGltZSA9IDA7CiAJCXNjYW4tPm1heF9vdXRfdGltZSA9Ci0JCQljcHVfdG9fbGUzMigxMDI0ICogcHJpdi0+X2Fnbi5vZmZjaGFuX3R4X3RpbWVvdXQpOworCQkJY3B1X3RvX2xlMzIoMTAyNCAqIHByaXYtPm9mZmNoYW5fdHhfdGltZW91dCk7CiAJfQogCiAJc3dpdGNoIChwcml2LT5zY2FuX3R5cGUpIHsKQEAgLTEzOTksOSArMTAyOSw5IEBACiAJCXNjYW5fY2ggPSAodm9pZCAqKSZzY2FuLT5kYXRhW2NtZF9sZW5dOwogCQlzY2FuX2NoLT50eXBlID0gU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFOwogCQlzY2FuX2NoLT5jaGFubmVsID0KLQkJCWNwdV90b19sZTE2KHByaXYtPl9hZ24ub2ZmY2hhbl90eF9jaGFuLT5od192YWx1ZSk7CisJCQljcHVfdG9fbGUxNihwcml2LT5vZmZjaGFuX3R4X2NoYW4tPmh3X3ZhbHVlKTsKIAkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0KLQkJCWNwdV90b19sZTE2KHByaXYtPl9hZ24ub2ZmY2hhbl90eF90aW1lb3V0KTsKKwkJCWNwdV90b19sZTE2KHByaXYtPm9mZmNoYW5fdHhfdGltZW91dCk7CiAJCXNjYW5fY2gtPnBhc3NpdmVfZHdlbGwgPSAwOwogCiAJCS8qIFNldCB0eHBvd2VyIGxldmVscyB0byBkZWZhdWx0cyAqLwpAQCAtMTQxMSw3ICsxMDQxLDcgQEAKIAkJICogcG93ZXIgbGV2ZWw6CiAJCSAqIHNjYW5fY2gtPnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMiA8PCAzKSkgfCAzOwogCQkgKi8KLQkJaWYgKHByaXYtPl9hZ24ub2ZmY2hhbl90eF9jaGFuLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCWlmIChwcml2LT5vZmZjaGFuX3R4X2NoYW4tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKIAkJCXNjYW5fY2gtPnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMyA8PCAzKSkgfCAzOwogCQllbHNlCiAJCQlzY2FuX2NoLT50eF9nYWluID0gKCgxIDw8IDUpIHwgKDUgPDwgMykpOwpAQCAtMTQzMywxNyArMTA2MywxNCBAQAogCS8qIHNldCBzY2FuIGJpdCBoZXJlIGZvciBQQU4gcGFyYW1zICovCiAJc2V0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7CiAKLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9wYW5fcGFyYW1zKSB7Ci0JCXJldCA9IHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcGFuX3BhcmFtcyhwcml2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQorCXJldCA9IGl3bGFnbl9zZXRfcGFuX3BhcmFtcyhwcml2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgJmNtZCk7CisJcmV0ID0gdHJhbnNfc2VuZF9jbWQoJnByaXYtPnRyYW5zLCAmY21kKTsKIAlpZiAocmV0KSB7CiAJCWNsZWFyX2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7Ci0JCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3Bhbl9wYXJhbXMpCi0JCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3Bhbl9wYXJhbXMocHJpdik7CisJCWl3bGFnbl9zZXRfcGFuX3BhcmFtcyhwcml2KTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTUyOCwyMyArMTE1NSwzMiBAQAogCW1pZ2h0X3NsZWVwKCk7CiAKIAltZW1zZXQoJmZsdXNoX2NtZCwgMCwgc2l6ZW9mKGZsdXNoX2NtZCkpOwotCWZsdXNoX2NtZC5maWZvX2NvbnRyb2wgPSBJV0xfVFhfRklGT19WT19NU0sgfCBJV0xfVFhfRklGT19WSV9NU0sgfAotCQkJCSBJV0xfVFhfRklGT19CRV9NU0sgfCBJV0xfVFhfRklGT19CS19NU0s7Ci0JaWYgKHByaXYtPmNmZy0+c2t1ICYgSVdMX1NLVV9OKQorCWlmIChmbHVzaF9jb250cm9sICYgQklUKElXTF9SWE9OX0NUWF9CU1MpKQorCQlmbHVzaF9jbWQuZmlmb19jb250cm9sID0gSVdMX1NDRF9WT19NU0sgfCBJV0xfU0NEX1ZJX01TSyB8CisJCQkJIElXTF9TQ0RfQkVfTVNLIHwgSVdMX1NDRF9CS19NU0sgfAorCQkJCSBJV0xfU0NEX01HTVRfTVNLOworCWlmICgoZmx1c2hfY29udHJvbCAmIEJJVChJV0xfUlhPTl9DVFhfUEFOKSkgJiYKKwkgICAgKHByaXYtPnZhbGlkX2NvbnRleHRzICE9IEJJVChJV0xfUlhPTl9DVFhfQlNTKSkpCisJCWZsdXNoX2NtZC5maWZvX2NvbnRyb2wgfD0gSVdMX1BBTl9TQ0RfVk9fTVNLIHwKKwkJCQlJV0xfUEFOX1NDRF9WSV9NU0sgfCBJV0xfUEFOX1NDRF9CRV9NU0sgfAorCQkJCUlXTF9QQU5fU0NEX0JLX01TSyB8IElXTF9QQU5fU0NEX01HTVRfTVNLIHwKKwkJCQlJV0xfUEFOX1NDRF9NVUxUSUNBU1RfTVNLOworCisJaWYgKHByaXYtPmNmZy0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRSkKIAkJZmx1c2hfY21kLmZpZm9fY29udHJvbCB8PSBJV0xfQUdHX1RYX1FVRVVFX01TSzsKIAogCUlXTF9ERUJVR19JTkZPKHByaXYsICJmaWZvIHF1ZXVlIGNvbnRyb2w6IDBYJXhcbiIsCiAJCSAgICAgICBmbHVzaF9jbWQuZmlmb19jb250cm9sKTsKIAlmbHVzaF9jbWQuZmx1c2hfY29udHJvbCA9IGNwdV90b19sZTE2KGZsdXNoX2NvbnRyb2wpOwogCi0JcmV0dXJuIGl3bF9zZW5kX2NtZChwcml2LCAmY21kKTsKKwlyZXR1cm4gdHJhbnNfc2VuZF9jbWQoJnByaXYtPnRyYW5zLCAmY21kKTsKIH0KIAogdm9pZCBpd2xhZ25fZGV2X3R4Zmlmb19mbHVzaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiBmbHVzaF9jb250cm9sKQogewogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAlpZWVlODAyMTFfc3RvcF9xdWV1ZXMocHJpdi0+aHcpOwotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT50eGZpZm9fZmx1c2gocHJpdiwgSVdMX0RST1BfQUxMKSkgeworCWlmIChpd2xhZ25fdHhmaWZvX2ZsdXNoKHByaXYsIElXTF9EUk9QX0FMTCkpIHsKIAkJSVdMX0VSUihwcml2LCAiZmx1c2ggcmVxdWVzdCBmYWlsXG4iKTsKIAkJZ290byBkb25lOwogCX0KQEAgLTE2OTksMTggKzEzMzUsMjEgQEAKIAkgKiAobWlnaHQgYmUgaW4gbW9uaXRvciBtb2RlKSwgb3IgdGhlIGludGVyZmFjZSBpcyBpbgogCSAqIElCU1MgbW9kZSAobm8gcHJvcGVyIHVDb2RlIHN1cHBvcnQgZm9yIGNvZXggdGhlbikuCiAJICovCi0JaWYgKCFidF9jb2V4X2FjdGl2ZSB8fCBwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CisJaWYgKCFpd2xhZ25fbW9kX3BhcmFtcy5idF9jb2V4X2FjdGl2ZSB8fAorCSAgICBwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CiAJCWJhc2ljLmZsYWdzID0gSVdMQUdOX0JUX0ZMQUdfQ09FWF9NT0RFX0RJU0FCTEVEOwogCX0gZWxzZSB7CiAJCWJhc2ljLmZsYWdzID0gSVdMQUdOX0JUX0ZMQUdfQ09FWF9NT0RFXzNXIDw8CiAJCQkJCUlXTEFHTl9CVF9GTEFHX0NPRVhfTU9ERV9TSElGVDsKLQkJaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCi0JCSAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YnRfc2NvX2Rpc2FibGUpCisKKwkJaWYgKCFwcml2LT5idF9lbmFibGVfcHNwb2xsKQogCQkJYmFzaWMuZmxhZ3MgfD0gSVdMQUdOX0JUX0ZMQUdfU1lOQ18yX0JUX0RJU0FCTEU7CisJCWVsc2UKKwkJCWJhc2ljLmZsYWdzICY9IH5JV0xBR05fQlRfRkxBR19TWU5DXzJfQlRfRElTQUJMRTsKIAogCQlpZiAocHJpdi0+YnRfY2hfYW5ub3VuY2UpCiAJCQliYXNpYy5mbGFncyB8PSBJV0xBR05fQlRfRkxBR19DSEFOTkVMX0lOSElCSVRJT047Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJCVCBjb2V4IGZsYWc6IDBYJXhcbiIsIGJhc2ljLmZsYWdzKTsKKwkJSVdMX0RFQlVHX0NPRVgocHJpdiwgIkJUIGNvZXggZmxhZzogMFgleFxuIiwgYmFzaWMuZmxhZ3MpOwogCX0KIAlwcml2LT5idF9lbmFibGVfZmxhZyA9IGJhc2ljLmZsYWdzOwogCWlmIChwcml2LT5idF9mdWxsX2NvbmN1cnJlbnQpCkBAIC0xNzIwLDcgKzEzNTksNyBAQAogCQltZW1jcHkoYmFzaWMuYnQzX2xvb2t1cF90YWJsZSwgaXdsYWduX2RlZl8zd19sb29rdXAsCiAJCQlzaXplb2YoaXdsYWduX2RlZl8zd19sb29rdXApKTsKIAotCUlXTF9ERUJVR19JTkZPKHByaXYsICJCVCBjb2V4ICVzIGluICVzIG1vZGVcbiIsCisJSVdMX0RFQlVHX0NPRVgocHJpdiwgIkJUIGNvZXggJXMgaW4gJXMgbW9kZVxuIiwKIAkJICAgICAgIGJhc2ljLmZsYWdzID8gImFjdGl2ZSIgOiAiZGlzYWJsZWQiLAogCQkgICAgICAgcHJpdi0+YnRfZnVsbF9jb25jdXJyZW50ID8KIAkJICAgICAgICJmdWxsIGNvbmN1cnJlbmN5IiA6ICIzLXdpcmUiKTsKQEAgLTE3MjgsMTkgKzEzNjcsOTcgQEAKIAlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmJ0X3Nlc3Npb25fMikgewogCQltZW1jcHkoJmJ0X2NtZF8yMDAwLmJhc2ljLCAmYmFzaWMsCiAJCQlzaXplb2YoYmFzaWMpKTsKLQkJcmV0ID0gaXdsX3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9CVF9DT05GSUcsCi0JCQlzaXplb2YoYnRfY21kXzIwMDApLCAmYnRfY21kXzIwMDApOworCQlyZXQgPSB0cmFuc19zZW5kX2NtZF9wZHUoJnByaXYtPnRyYW5zLCBSRVBMWV9CVF9DT05GSUcsCisJCQlDTURfU1lOQywgc2l6ZW9mKGJ0X2NtZF8yMDAwKSwgJmJ0X2NtZF8yMDAwKTsKIAl9IGVsc2UgewogCQltZW1jcHkoJmJ0X2NtZF82MDAwLmJhc2ljLCAmYmFzaWMsCiAJCQlzaXplb2YoYmFzaWMpKTsKLQkJcmV0ID0gaXdsX3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9CVF9DT05GSUcsCi0JCQlzaXplb2YoYnRfY21kXzYwMDApLCAmYnRfY21kXzYwMDApOworCQlyZXQgPSB0cmFuc19zZW5kX2NtZF9wZHUoJnByaXYtPnRyYW5zLCBSRVBMWV9CVF9DT05GSUcsCisJCQlDTURfU1lOQywgc2l6ZW9mKGJ0X2NtZF82MDAwKSwgJmJ0X2NtZF82MDAwKTsKIAl9CiAJaWYgKHJldCkKIAkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNlbmQgQlQgQ29leCBDb25maWdcbiIpOwogCiB9CiAKK3ZvaWQgaXdsYWduX2J0X2FkanVzdF9yc3NpX21vbml0b3Ioc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIHJzc2lfZW5hKQoreworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsICpmb3VuZF9jdHggPSBOVUxMOworCWJvb2wgZm91bmRfYXAgPSBmYWxzZTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKKworCS8qIENoZWNrIHdoZXRoZXIgQVAgb3IgR08gbW9kZSBpcyBhY3RpdmUuICovCisJaWYgKHJzc2lfZW5hKSB7CisJCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7CisJCQlpZiAoY3R4LT52aWYgJiYgY3R4LT52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkJCSAgICBpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkgeworCQkJCWZvdW5kX2FwID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogSWYgZGlzYWJsZSB3YXMgcmVjZWl2ZWQgb3IgSWYgR08vQVAgbW9kZSwgZGlzYWJsZSBSU1NJCisJICogbWVhc3VyZW1lbnRzLgorCSAqLworCWlmICghcnNzaV9lbmEgfHwgZm91bmRfYXApIHsKKwkJaWYgKHByaXYtPmN1cl9yc3NpX2N0eCkgeworCQkJY3R4ID0gcHJpdi0+Y3VyX3Jzc2lfY3R4OworCQkJaWVlZTgwMjExX2Rpc2FibGVfcnNzaV9yZXBvcnRzKGN0eC0+dmlmKTsKKwkJCXByaXYtPmN1cl9yc3NpX2N0eCA9IE5VTEw7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgcnNzaSBtZWFzdXJlbWVudHMgbmVlZCB0byBiZSBlbmFibGVkLCBjb25zaWRlciBhbGwgY2FzZXMgbm93LgorCSAqIEZpZ3VyZSBvdXQgaG93IG1hbnkgY29udGV4dHMgYXJlIGFjdGl2ZS4KKwkgKi8KKwlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgeworCQlpZiAoY3R4LT52aWYgJiYgY3R4LT52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCQkgICAgaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpIHsKKwkJCWZvdW5kX2N0eCA9IGN0eDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiByc3NpIG1vbml0b3IgYWxyZWFkeSBlbmFibGVkIGZvciB0aGUgY29ycmVjdCBpbnRlcmZhY2UuLi5ub3RoaW5nCisJICogdG8gZG8uCisJICovCisJaWYgKGZvdW5kX2N0eCA9PSBwcml2LT5jdXJfcnNzaV9jdHgpCisJCXJldHVybjsKKworCS8qCisJICogRmlndXJlIG91dCBpZiByc3NpIG1vbml0b3IgaXMgY3VycmVudGx5IGVuYWJsZWQsIGFuZCBuZWVkcworCSAqIHRvIGJlIGNoYW5nZWQuIElmIHJzc2kgbW9uaXRvciBpcyBhbHJlYWR5IGVuYWJsZWQsIGRpc2FibGUKKwkgKiBpdCBmaXJzdCBlbHNlIGp1c3QgZW5hYmxlIHJzc2kgbWVhc3VyZW1lbnRzIG9uIHRoZQorCSAqIGludGVyZmFjZSBmb3VuZCBhYm92ZS4KKwkgKi8KKwlpZiAocHJpdi0+Y3VyX3Jzc2lfY3R4KSB7CisJCWN0eCA9IHByaXYtPmN1cl9yc3NpX2N0eDsKKwkJaWYgKGN0eC0+dmlmKQorCQkJaWVlZTgwMjExX2Rpc2FibGVfcnNzaV9yZXBvcnRzKGN0eC0+dmlmKTsKKwl9CisKKwlwcml2LT5jdXJfcnNzaV9jdHggPSBmb3VuZF9jdHg7CisKKwlpZiAoIWZvdW5kX2N0eCkKKwkJcmV0dXJuOworCisJaWVlZTgwMjExX2VuYWJsZV9yc3NpX3JlcG9ydHMoZm91bmRfY3R4LT52aWYsCisJCQlJV0xBR05fQlRfUFNQX01JTl9SU1NJX1RIUkVTSE9MRCwKKwkJCUlXTEFHTl9CVF9QU1BfTUFYX1JTU0lfVEhSRVNIT0xEKTsKK30KKworc3RhdGljIGJvb2wgaXdsYWduX2J0X3RyYWZmaWNfaXNfc2NvKHN0cnVjdCBpd2xfYnRfdWFydF9tc2cgKnVhcnRfbXNnKQoreworCXJldHVybiBCVF9VQVJUX01TR19GUkFNRTNTQ09FU0NPX01TSyAmIHVhcnRfbXNnLT5mcmFtZTMgPj4KKwkJCUJUX1VBUlRfTVNHX0ZSQU1FM1NDT0VTQ09fUE9TOworfQorCiBzdGF0aWMgdm9pZCBpd2xhZ25fYnRfdHJhZmZpY19jaGFuZ2Vfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGl3bF9wcml2ICpwcml2ID0KQEAgLTE3NTgsNyArMTQ3NSw3IEBACiAJICogY29leCBwcm9maWxlIG5vdGlmaWNhdGlvbnMuIElnbm9yZSB0aGF0IHNpbmNlIG9ubHkgYmFkIGNvbnNlcXVlbmNlCiAJICogY2FuIGJlIG5vdCBtYXRjaGluZyBkZWJ1ZyBwcmludCB3aXRoIGFjdHVhbCBzdGF0ZS4KIAkgKi8KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQlQgdHJhZmZpYyBsb2FkIGNoYW5nZXM6ICVkXG4iLAorCUlXTF9ERUJVR19DT0VYKHByaXYsICJCVCB0cmFmZmljIGxvYWQgY2hhbmdlczogJWRcbiIsCiAJCSAgICAgICBwcml2LT5idF90cmFmZmljX2xvYWQpOwogCiAJc3dpdGNoIChwcml2LT5idF90cmFmZmljX2xvYWQpIHsKQEAgLTE3OTMsMjMgKzE1MTAsNDMgQEAKIAlpZiAodGVzdF9iaXQoU1RBVFVTX1NDQU5fSFcsICZwcml2LT5zdGF0dXMpKQogCQlnb3RvIG91dDsKIAotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MpCi0JCXByaXYtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncyhwcml2KTsKKwlpd2xfdXBkYXRlX2NoYWluX2ZsYWdzKHByaXYpOwogCiAJaWYgKHNtcHNfcmVxdWVzdCAhPSAtMSkgeworCQlwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gc21wc19yZXF1ZXN0OwogCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewogCQkJaWYgKGN0eC0+dmlmICYmIGN0eC0+dmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCQkJaWVlZTgwMjExX3JlcXVlc3Rfc21wcyhjdHgtPnZpZiwgc21wc19yZXF1ZXN0KTsKIAkJfQogCX0KKworCS8qCisJICogRHluYW1pYyBQUyBwb2xsIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS4gQWRqdXN0IFJTU0kgbWVhc3VyZW1lbnRzIGlmCisJICogbmVjZXNzYXJ5LgorCSAqLworCWl3bGFnbl9idF9jb2V4X3Jzc2lfbW9uaXRvcihwcml2KTsKIG91dDoKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIH0KIAorLyoKKyAqIElmIEJUIHNjbyB0cmFmZmljLCBhbmQgUlNTSSBtb25pdG9yIGlzIGVuYWJsZWQsIG1vdmUgbWVhc3VyZW1lbnRzIHRvIHRoZQorICogY29ycmVjdCBpbnRlcmZhY2Ugb3IgZGlzYWJsZSBpdCBpZiB0aGlzIGlzIHRoZSBsYXN0IGludGVyZmFjZSB0byBiZQorICogcmVtb3ZlZC4KKyAqLwordm9pZCBpd2xhZ25fYnRfY29leF9yc3NpX21vbml0b3Ioc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCWlmIChwcml2LT5idF9pc19zY28gJiYKKwkgICAgcHJpdi0+YnRfdHJhZmZpY19sb2FkID09IElXTF9CVF9DT0VYX1RSQUZGSUNfTE9BRF9DT05USU5VT1VTKQorCQlpd2xhZ25fYnRfYWRqdXN0X3Jzc2lfbW9uaXRvcihwcml2LCB0cnVlKTsKKwllbHNlCisJCWl3bGFnbl9idF9hZGp1c3RfcnNzaV9tb25pdG9yKHByaXYsIGZhbHNlKTsKK30KKwogc3RhdGljIHZvaWQgaXdsYWduX3ByaW50X3VhcnRtc2coc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCXN0cnVjdCBpd2xfYnRfdWFydF9tc2cgKnVhcnRfbXNnKQogewotCUlXTF9ERUJVR19OT1RJRihwcml2LCAiTWVzc2FnZSBUeXBlID0gMHglWCwgU1NOID0gMHglWCwgIgorCUlXTF9ERUJVR19DT0VYKHByaXYsICJNZXNzYWdlIFR5cGUgPSAweCVYLCBTU04gPSAweCVYLCAiCiAJCQkiVXBkYXRlIFJlcSA9IDB4JVgiLAogCQkoQlRfVUFSVF9NU0dfRlJBTUUxTVNHVFlQRV9NU0sgJiB1YXJ0X21zZy0+ZnJhbWUxKSA+PgogCQkJQlRfVUFSVF9NU0dfRlJBTUUxTVNHVFlQRV9QT1MsCkBAIC0xODE4LDcgKzE1NTUsNyBAQAogCQkoQlRfVUFSVF9NU0dfRlJBTUUxVVBEQVRFUkVRX01TSyAmIHVhcnRfbXNnLT5mcmFtZTEpID4+CiAJCQlCVF9VQVJUX01TR19GUkFNRTFVUERBVEVSRVFfUE9TKTsKIAotCUlXTF9ERUJVR19OT1RJRihwcml2LCAiT3BlbiBjb25uZWN0aW9ucyA9IDB4JVgsIFRyYWZmaWMgbG9hZCA9IDB4JVgsICIKKwlJV0xfREVCVUdfQ09FWChwcml2LCAiT3BlbiBjb25uZWN0aW9ucyA9IDB4JVgsIFRyYWZmaWMgbG9hZCA9IDB4JVgsICIKIAkJCSJDaGxfU2VxTiA9IDB4JVgsIEluIGJhbmQgPSAweCVYIiwKIAkJKEJUX1VBUlRfTVNHX0ZSQU1FMk9QRU5DT05ORUNUSU9OU19NU0sgJiB1YXJ0X21zZy0+ZnJhbWUyKSA+PgogCQkJQlRfVUFSVF9NU0dfRlJBTUUyT1BFTkNPTk5FQ1RJT05TX1BPUywKQEAgLTE4MjksNyArMTU2Niw3IEBACiAJCShCVF9VQVJUX01TR19GUkFNRTJJTkJBTkRfTVNLICYgdWFydF9tc2ctPmZyYW1lMikgPj4KIAkJCUJUX1VBUlRfTVNHX0ZSQU1FMklOQkFORF9QT1MpOwogCi0JSVdMX0RFQlVHX05PVElGKHByaXYsICJTQ08vZVNDTyA9IDB4JVgsIFNuaWZmID0gMHglWCwgQTJEUCA9IDB4JVgsICIKKwlJV0xfREVCVUdfQ09FWChwcml2LCAiU0NPL2VTQ08gPSAweCVYLCBTbmlmZiA9IDB4JVgsIEEyRFAgPSAweCVYLCAiCiAJCQkiQUNMID0gMHglWCwgTWFzdGVyID0gMHglWCwgT0JFWCA9IDB4JVgiLAogCQkoQlRfVUFSVF9NU0dfRlJBTUUzU0NPRVNDT19NU0sgJiB1YXJ0X21zZy0+ZnJhbWUzKSA+PgogCQkJQlRfVUFSVF9NU0dfRlJBTUUzU0NPRVNDT19QT1MsCkBAIC0xODQ0LDExICsxNTgxLDExIEBACiAJCShCVF9VQVJUX01TR19GUkFNRTNPQkVYX01TSyAmIHVhcnRfbXNnLT5mcmFtZTMpID4+CiAJCQlCVF9VQVJUX01TR19GUkFNRTNPQkVYX1BPUyk7CiAKLQlJV0xfREVCVUdfTk9USUYocHJpdiwgIklkbGUgZHVyYXRpb24gPSAweCVYIiwKKwlJV0xfREVCVUdfQ09FWChwcml2LCAiSWRsZSBkdXJhdGlvbiA9IDB4JVgiLAogCQkoQlRfVUFSVF9NU0dfRlJBTUU0SURMRURVUkFUSU9OX01TSyAmIHVhcnRfbXNnLT5mcmFtZTQpID4+CiAJCQlCVF9VQVJUX01TR19GUkFNRTRJRExFRFVSQVRJT05fUE9TKTsKIAotCUlXTF9ERUJVR19OT1RJRihwcml2LCAiVHggQWN0aXZpdHkgPSAweCVYLCBSeCBBY3Rpdml0eSA9IDB4JVgsICIKKwlJV0xfREVCVUdfQ09FWChwcml2LCAiVHggQWN0aXZpdHkgPSAweCVYLCBSeCBBY3Rpdml0eSA9IDB4JVgsICIKIAkJCSJlU0NPIFJldHJhbnNtaXNzaW9ucyA9IDB4JVgiLAogCQkoQlRfVUFSVF9NU0dfRlJBTUU1VFhBQ1RJVklUWV9NU0sgJiB1YXJ0X21zZy0+ZnJhbWU1KSA+PgogCQkJQlRfVUFSVF9NU0dfRlJBTUU1VFhBQ1RJVklUWV9QT1MsCkBAIC0xODU3LDEzICsxNTk0LDEzIEBACiAJCShCVF9VQVJUX01TR19GUkFNRTVFU0NPUkVUUkFOU01JVF9NU0sgJiB1YXJ0X21zZy0+ZnJhbWU1KSA+PgogCQkJQlRfVUFSVF9NU0dfRlJBTUU1RVNDT1JFVFJBTlNNSVRfUE9TKTsKIAotCUlXTF9ERUJVR19OT1RJRihwcml2LCAiU25pZmYgSW50ZXJ2YWwgPSAweCVYLCBEaXNjb3ZlcmFibGUgPSAweCVYIiwKKwlJV0xfREVCVUdfQ09FWChwcml2LCAiU25pZmYgSW50ZXJ2YWwgPSAweCVYLCBEaXNjb3ZlcmFibGUgPSAweCVYIiwKIAkJKEJUX1VBUlRfTVNHX0ZSQU1FNlNOSUZGSU5URVJWQUxfTVNLICYgdWFydF9tc2ctPmZyYW1lNikgPj4KIAkJCUJUX1VBUlRfTVNHX0ZSQU1FNlNOSUZGSU5URVJWQUxfUE9TLAogCQkoQlRfVUFSVF9NU0dfRlJBTUU2RElTQ09WRVJBQkxFX01TSyAmIHVhcnRfbXNnLT5mcmFtZTYpID4+CiAJCQlCVF9VQVJUX01TR19GUkFNRTZESVNDT1ZFUkFCTEVfUE9TKTsKIAotCUlXTF9ERUJVR19OT1RJRihwcml2LCAiU25pZmYgQWN0aXZpdHkgPSAweCVYLCBQYWdlID0gIgorCUlXTF9ERUJVR19DT0VYKHByaXYsICJTbmlmZiBBY3Rpdml0eSA9IDB4JVgsIFBhZ2UgPSAiCiAJCQkiMHglWCwgSW5xdWlyeSA9IDB4JVgsIENvbm5lY3RhYmxlID0gMHglWCIsCiAJCShCVF9VQVJUX01TR19GUkFNRTdTTklGRkFDVElWSVRZX01TSyAmIHVhcnRfbXNnLT5mcmFtZTcpID4+CiAJCQlCVF9VQVJUX01TR19GUkFNRTdTTklGRkFDVElWSVRZX1BPUywKQEAgLTE5MTMsMTQgKzE2NTAsMTYgQEAKIAkJcmV0dXJuOwogCX0KIAotCUlXTF9ERUJVR19OT1RJRihwcml2LCAiQlQgQ29leCBub3RpZmljYXRpb246XG4iKTsKLQlJV0xfREVCVUdfTk9USUYocHJpdiwgIiAgICBzdGF0dXM6ICVkXG4iLCBjb2V4LT5idF9zdGF0dXMpOwotCUlXTF9ERUJVR19OT1RJRihwcml2LCAiICAgIHRyYWZmaWMgbG9hZDogJWRcbiIsIGNvZXgtPmJ0X3RyYWZmaWNfbG9hZCk7Ci0JSVdMX0RFQlVHX05PVElGKHByaXYsICIgICAgQ0kgY29tcGxpYW5jZTogJWRcbiIsCisJSVdMX0RFQlVHX0NPRVgocHJpdiwgIkJUIENvZXggbm90aWZpY2F0aW9uOlxuIik7CisJSVdMX0RFQlVHX0NPRVgocHJpdiwgIiAgICBzdGF0dXM6ICVkXG4iLCBjb2V4LT5idF9zdGF0dXMpOworCUlXTF9ERUJVR19DT0VYKHByaXYsICIgICAgdHJhZmZpYyBsb2FkOiAlZFxuIiwgY29leC0+YnRfdHJhZmZpY19sb2FkKTsKKwlJV0xfREVCVUdfQ09FWChwcml2LCAiICAgIENJIGNvbXBsaWFuY2U6ICVkXG4iLAogCQkJY29leC0+YnRfY2lfY29tcGxpYW5jZSk7CiAJaXdsYWduX3ByaW50X3VhcnRtc2cocHJpdiwgdWFydF9tc2cpOwogCiAJcHJpdi0+bGFzdF9idF90cmFmZmljX2xvYWQgPSBwcml2LT5idF90cmFmZmljX2xvYWQ7CisJcHJpdi0+YnRfaXNfc2NvID0gaXdsYWduX2J0X3RyYWZmaWNfaXNfc2NvKHVhcnRfbXNnKTsKKwogCWlmIChwcml2LT5pd19tb2RlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CiAJCWlmIChwcml2LT5idF9zdGF0dXMgIT0gY29leC0+YnRfc3RhdHVzIHx8CiAJCSAgICBwcml2LT5sYXN0X2J0X3RyYWZmaWNfbG9hZCAhPSBjb2V4LT5idF90cmFmZmljX2xvYWQpIHsKQEAgLTE5NTQsMTUgKzE2OTMsMTIgQEAKIAogdm9pZCBpd2xhZ25fYnRfcnhfaGFuZGxlcl9zZXR1cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JaXdsYWduX3J4X2hhbmRsZXJfc2V0dXAocHJpdik7CiAJcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfQlRfQ09FWF9QUk9GSUxFX05PVElGXSA9CiAJCWl3bGFnbl9idF9jb2V4X3Byb2ZpbGVfbm90aWY7CiB9CiAKIHZvaWQgaXdsYWduX2J0X3NldHVwX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCWl3bGFnbl9zZXR1cF9kZWZlcnJlZF93b3JrKHByaXYpOwotCiAJSU5JVF9XT1JLKCZwcml2LT5idF90cmFmZmljX2NoYW5nZV93b3JrLAogCQkgIGl3bGFnbl9idF90cmFmZmljX2NoYW5nZV93b3JrKTsKIH0KQEAgLTIyNzQsOSArMjAxMCw5IEBACiAJd2FpdF9lbnRyeS0+dHJpZ2dlcmVkID0gZmFsc2U7CiAJd2FpdF9lbnRyeS0+YWJvcnRlZCA9IGZhbHNlOwogCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5fYWduLm5vdGlmX3dhaXRfbG9jayk7Ci0JbGlzdF9hZGQoJndhaXRfZW50cnktPmxpc3QsICZwcml2LT5fYWduLm5vdGlmX3dhaXRzKTsKLQlzcGluX3VubG9ja19iaCgmcHJpdi0+X2Fnbi5ub3RpZl93YWl0X2xvY2spOworCXNwaW5fbG9ja19iaCgmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKKwlsaXN0X2FkZCgmd2FpdF9lbnRyeS0+bGlzdCwgJnByaXYtPm5vdGlmX3dhaXRzKTsKKwlzcGluX3VubG9ja19iaCgmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKIH0KIAogaW50IGl3bGFnbl93YWl0X25vdGlmaWNhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCkBAIC0yMjg1LDEzICsyMDIxLDEzIEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChwcml2LT5fYWduLm5vdGlmX3dhaXRxLAorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChwcml2LT5ub3RpZl93YWl0cSwKIAkJCQkgd2FpdF9lbnRyeS0+dHJpZ2dlcmVkIHx8IHdhaXRfZW50cnktPmFib3J0ZWQsCiAJCQkJIHRpbWVvdXQpOwogCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5fYWduLm5vdGlmX3dhaXRfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZwcml2LT5ub3RpZl93YWl0X2xvY2spOwogCWxpc3RfZGVsKCZ3YWl0X2VudHJ5LT5saXN0KTsKLQlzcGluX3VubG9ja19iaCgmcHJpdi0+X2Fnbi5ub3RpZl93YWl0X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5ub3RpZl93YWl0X2xvY2spOwogCiAJaWYgKHdhaXRfZW50cnktPmFib3J0ZWQpCiAJCXJldHVybiAtRUlPOwpAQCAtMjMwNSw5MSArMjA0MSw3IEBACiB2b2lkIGl3bGFnbl9yZW1vdmVfbm90aWZpY2F0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCQlzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3YWl0X2VudHJ5KQogewotCXNwaW5fbG9ja19iaCgmcHJpdi0+X2Fnbi5ub3RpZl93YWl0X2xvY2spOworCXNwaW5fbG9ja19iaCgmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKIAlsaXN0X2RlbCgmd2FpdF9lbnRyeS0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnByaXYtPl9hZ24ubm90aWZfd2FpdF9sb2NrKTsKLX0KLQotaW50IGl3bGFnbl9zdGFydF9kZXZpY2Uoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQ7Ci0KLQlpZiAoaXdsX3ByZXBhcmVfY2FyZF9odyhwcml2KSkgewotCQlJV0xfV0FSTihwcml2LCAiRXhpdCBIVyBub3QgcmVhZHlcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBJZiBwbGF0Zm9ybSdzIFJGX0tJTEwgc3dpdGNoIGlzIE5PVCBzZXQgdG8gS0lMTCAqLwotCWlmIChpd2xfcmVhZDMyKHByaXYsIENTUl9HUF9DTlRSTCkgJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykKLQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQllbHNlCi0JCXNldF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCi0JaWYgKGl3bF9pc19yZmtpbGwocHJpdikpIHsKLQkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShwcml2LT5ody0+d2lwaHksIHRydWUpOwotCQlpd2xfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0JCXJldHVybiAtRVJGS0lMTDsKLQl9Ci0KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKLQotCXJldCA9IGl3bGFnbl9od19uaWNfaW5pdChwcml2KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBpbml0IG5pY1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwKLQkJICAgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCk7Ci0KLQkvKiBjbGVhciAoYWdhaW4pLCB0aGVuIGVuYWJsZSBob3N0IGludGVycnVwdHMgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKLQlpd2xfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0KLQkvKiByZWFsbHkgbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgaXdsYWduX3N0b3BfZGV2aWNlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX05FVk9fUkVTRVQpOwotCi0JLyogdGVsbCB0aGUgZGV2aWNlIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xfc3luY2hyb25pemVfaXJxKHByaXYpOwotCi0JLyogZGV2aWNlIGdvaW5nIGRvd24sIFN0b3AgdXNpbmcgSUNUIHRhYmxlICovCi0JaXdsX2Rpc2FibGVfaWN0KHByaXYpOwotCi0JLyoKLQkgKiBJZiBhIEhXIHJlc3RhcnQgaGFwcGVucyBkdXJpbmcgZmlybXdhcmUgbG9hZGluZywKLQkgKiB0aGVuIHRoZSBmaXJtd2FyZSBsb2FkaW5nIG1pZ2h0IGNhbGwgdGhpcyBmdW5jdGlvbgotCSAqIGFuZCBsYXRlciBpdCBtaWdodCBiZSBjYWxsZWQgYWdhaW4gZHVlIHRvIHRoZQotCSAqIHJlc3RhcnQuIFNvIGRvbid0IHByb2Nlc3MgYWdhaW4gaWYgdGhlIGRldmljZSBpcwotCSAqIGFscmVhZHkgZGVhZC4KLQkgKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0RFVklDRV9FTkFCTEVELCAmcHJpdi0+c3RhdHVzKSkgewotICAgICAgICAgICAgICAgIGl3bGFnbl90eHFfY3R4X3N0b3AocHJpdik7Ci0gICAgICAgICAgICAgICAgaXdsYWduX3J4cV9zdG9wKHByaXYpOwotCi0gICAgICAgICAgICAgICAgLyogUG93ZXItZG93biBkZXZpY2UncyBidXNtYXN0ZXIgRE1BIGNsb2NrcyAqLwotICAgICAgICAgICAgICAgIGl3bF93cml0ZV9wcnBoKHByaXYsIEFQTUdfQ0xLX0RJU19SRUcsIEFQTUdfQ0xLX1ZBTF9ETUFfQ0xLX1JRVCk7Ci0gICAgICAgICAgICAgICAgdWRlbGF5KDUpOwotICAgICAgICB9Ci0KLQkvKiBNYWtlIHN1cmUgKHJlZHVuZGFudCkgd2UndmUgcmVsZWFzZWQgb3VyIHJlcXVlc3QgdG8gc3RheSBhd2FrZSAqLwotCWl3bF9jbGVhcl9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLCBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOwotCi0JLyogU3RvcCB0aGUgZGV2aWNlLCBhbmQgcHV0IGl0IGluIGxvdyBwb3dlciBzdGF0ZSAqLwotCWl3bF9hcG1fc3RvcChwcml2KTsKKwlzcGluX3VubG9ja19iaCgmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1ycy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJzLmMKaW5kZXggNTkyYjBjZi4uMzc4OWZmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJzLmMKQEAgLTMzNiw2ICszMzYsMTIgQEAKIH0KIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCisvKioKKyAqIFByb2dyYW0gdGhlIGRldmljZSB0byB1c2UgZml4ZWQgcmF0ZSBmb3IgZnJhbWUgdHJhbnNtaXQKKyAqIFRoaXMgaXMgZm9yIGRlYnVnZ2luZy90ZXN0aW5nIG9ubHkKKyAqIG9uY2UgdGhlIGRldmljZSBzdGFydCB1c2UgZml4ZWQgcmF0ZSwgd2UgbmVlZCB0byByZWxvYWQgdGhlIG1vZHVsZQorICogdG8gYmVpbmcgYmFjayB0aGUgbm9ybWFsIG9wZXJhdGlvbi4KKyAqLwogc3RhdGljIHZvaWQgcnNfcHJvZ3JhbV9maXhfcmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkJc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSkKIHsKQEAgLTM0OCwxMyArMzU0LDE3IEBACiAJbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSAgPSAweDFGRDA7CS8qIDYgLSA2MCBNQml0cywgbm8gOSwgbm8gQ0NLICovCiAJbHFfc3RhLT5hY3RpdmVfbWltbzNfcmF0ZSAgPSAweDFGRDA7CS8qIDYgLSA2MCBNQml0cywgbm8gOSwgbm8gQ0NLICovCiAKLQlscV9zdGEtPmRiZ19maXhlZF9yYXRlID0gcHJpdi0+ZGJnX2ZpeGVkX3JhdGU7CisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1NWVE9PTAorCS8qIHRlc3Rtb2RlIGhhcyBoaWdoZXIgcHJpb3JpdHkgdG8gb3ZlcndpcnRlIHRoZSBmaXhlZCByYXRlICovCisJaWYgKHByaXYtPnRtX2ZpeGVkX3JhdGUpCisJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSBwcml2LT50bV9maXhlZF9yYXRlOworI2VuZGlmCiAKIAlJV0xfREVCVUdfUkFURShwcml2LCAic3RhX2lkICVkIHJhdGUgMHglWFxuIiwKLQkJbHFfc3RhLT5scS5zdGFfaWQsIHByaXYtPmRiZ19maXhlZF9yYXRlKTsKKwkJbHFfc3RhLT5scS5zdGFfaWQsIGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUpOwogCi0JaWYgKHByaXYtPmRiZ19maXhlZF9yYXRlKSB7Ci0JCXJzX2ZpbGxfbGlua19jbWQoTlVMTCwgbHFfc3RhLCBwcml2LT5kYmdfZml4ZWRfcmF0ZSk7CisJaWYgKGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUpIHsKKwkJcnNfZmlsbF9saW5rX2NtZChOVUxMLCBscV9zdGEsIGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUpOwogCQlpd2xfc2VuZF9scV9jbWQobHFfc3RhLT5kcnYsIGN0eCwgJmxxX3N0YS0+bHEsIENNRF9BU1lOQywKIAkJCQlmYWxzZSk7CiAJfQpAQCAtNDI2LDcgKzQzNiw3IEBACiAJCQlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkKTsKIAkJfQogCX0gZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgIkFnZ3JlZ2F0aW9uIG5vdCBlbmFibGVkIGZvciB0aWQgJWQgIgorCQlJV0xfREVCVUdfSFQocHJpdiwgIkFnZ3JlZ2F0aW9uIG5vdCBlbmFibGVkIGZvciB0aWQgJWQgIgogCQkJImJlY2F1c2UgbG9hZCA9ICV1XG4iLCB0aWQsIGxvYWQpOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTA3Miw4ICsxMDgyLDEwIEBACiAJLyogU2VlIGlmIHRoZXJlJ3MgYSBiZXR0ZXIgcmF0ZSBvciBtb2R1bGF0aW9uIG1vZGUgdG8gdHJ5LiAqLwogCWlmIChzdGEgJiYgc3RhLT5zdXBwX3JhdGVzW3NiYW5kLT5iYW5kXSkKIAkJcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHByaXYsIHNrYiwgc3RhLCBscV9zdGEpOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0JaWYgKHByaXYtPmRiZ19maXhlZF9yYXRlICE9IGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUpCisKKyNpZiBkZWZpbmVkKENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTKSAmJiBkZWZpbmVkKENPTkZJR19JV0xXSUZJX0RFVklDRV9TVlRPT0wpCisJaWYgKChwcml2LT50bV9maXhlZF9yYXRlKSAmJgorCSAgICAocHJpdi0+dG1fZml4ZWRfcmF0ZSAhPSBscV9zdGEtPmRiZ19maXhlZF9yYXRlKSkKIAkJcnNfcHJvZ3JhbV9maXhfcmF0ZShwcml2LCBscV9zdGEpOwogI2VuZGlmCiAJaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zICYmIHByaXYtPmNmZy0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0KQpAQCAtMjg5NSw4ICsyOTA3LDkgQEAKIAlpZiAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKIAkJbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHggKz0gSVdMX0ZJUlNUX09GRE1fUkFURTsKIAlscV9zdGEtPmlzX2FnZyA9IDA7Ci0KLQlwcml2LT5kYmdfZml4ZWRfcmF0ZSA9IDA7CisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1NWVE9PTAorCXByaXYtPnRtX2ZpeGVkX3JhdGUgPSAwOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKIAlscV9zdGEtPmRiZ19maXhlZF9yYXRlID0gMDsKICNlbmRpZgpAQCAtMzA5NSw3ICszMTA4LDYgQEAKIAkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJGaXhlZCByYXRlIE9OXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSAwOwotCQkJcHJpdi0+ZGJnX2ZpeGVkX3JhdGUgPSAwOwogCQkJSVdMX0VSUihwcml2LAogCQkJICAgICJJbnZhbGlkIGFudGVubmEgc2VsZWN0aW9uIDB4JVgsIFZhbGlkIGlzIDB4JVhcbiIsCiAJCQkgICAgYW50X3NlbF90eCwgdmFsaWRfdHhfYW50KTsKQEAgLTMxMjMsOSArMzEzNSw5IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKHNzY2FuZihidWYsICIleCIsICZwYXJzZWRfcmF0ZSkgPT0gMSkKLQkJcHJpdi0+ZGJnX2ZpeGVkX3JhdGUgPSBscV9zdGEtPmRiZ19maXhlZF9yYXRlID0gcGFyc2VkX3JhdGU7CisJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSBwYXJzZWRfcmF0ZTsKIAllbHNlCi0JCXByaXYtPmRiZ19maXhlZF9yYXRlID0gbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IDA7CisJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSAwOwogCiAJcnNfcHJvZ3JhbV9maXhfcmF0ZShwcml2LCBscV9zdGEpOwogCkBAIC0zMTU1LDcgKzMxNjcsNyBAQAogCQkJbHFfc3RhLT50b3RhbF9mYWlsZWQsIGxxX3N0YS0+dG90YWxfc3VjY2VzcywKIAkJCWxxX3N0YS0+YWN0aXZlX2xlZ2FjeV9yYXRlKTsKIAlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAiZml4ZWQgcmF0ZSAweCVYXG4iLAotCQkJcHJpdi0+ZGJnX2ZpeGVkX3JhdGUpOworCQkJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSk7CiAJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgInZhbGlkX3R4X2FudCAlcyVzJXNcbiIsCiAJICAgIChwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgQU5UX0EpID8gIkFOVF9BLCIgOiAiIiwKIAkgICAgKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJiBBTlRfQikgPyAiQU5UX0IsIiA6ICIiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4b24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeG9uLmMKaW5kZXggYTk1YWQ4NC4uZDQyZWYxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4b24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnhvbi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiaXdsLWNvcmUuaCIKICNpbmNsdWRlICJpd2wtYWduLWNhbGliLmgiCiAjaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKKyNpbmNsdWRlICJpd2wtdHJhbnMuaCIKIAogc3RhdGljIGludCBpd2xhZ25fZGlzYWJsZV9ic3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKQEAgLTM5LDcgKzQwLDggQEAKIAlpbnQgcmV0OwogCiAJc2VuZC0+ZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JcmV0ID0gaXdsX3NlbmRfY21kX3BkdShwcml2LCBjdHgtPnJ4b25fY21kLCBzaXplb2YoKnNlbmQpLCBzZW5kKTsKKwlyZXQgPSB0cmFuc19zZW5kX2NtZF9wZHUoJnByaXYtPnRyYW5zLCBjdHgtPnJ4b25fY21kLAorCQkJCUNNRF9TWU5DLCBzaXplb2YoKnNlbmQpLCBzZW5kKTsKIAogCXNlbmQtPmZpbHRlcl9mbGFncyA9IG9sZF9maWx0ZXI7CiAKQEAgLTY0LDcgKzY2LDggQEAKIAogCXNlbmQtPmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwogCXNlbmQtPmRldl90eXBlID0gUlhPTl9ERVZfVFlQRV9QMlA7Ci0JcmV0ID0gaXdsX3NlbmRfY21kX3BkdShwcml2LCBjdHgtPnJ4b25fY21kLCBzaXplb2YoKnNlbmQpLCBzZW5kKTsKKwlyZXQgPSB0cmFuc19zZW5kX2NtZF9wZHUoJnByaXYtPnRyYW5zLCBjdHgtPnJ4b25fY21kLAorCQkJCUNNRF9TWU5DLCBzaXplb2YoKnNlbmQpLCBzZW5kKTsKIAogCXNlbmQtPmZpbHRlcl9mbGFncyA9IG9sZF9maWx0ZXI7CiAJc2VuZC0+ZGV2X3R5cGUgPSBvbGRfZGV2X3R5cGU7CkBAIC04MSw2ICs4NCwyMiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgaXdsYWduX2Rpc2Nvbm5fcGFuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgICAgICBzdHJ1Y3QgaXdsX3J4b25fY21kICpzZW5kKQoreworCV9fbGUzMiBvbGRfZmlsdGVyID0gc2VuZC0+ZmlsdGVyX2ZsYWdzOworCWludCByZXQ7CisKKwlzZW5kLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKwlyZXQgPSB0cmFuc19zZW5kX2NtZF9wZHUoJnByaXYtPnRyYW5zLCBjdHgtPnJ4b25fY21kLCBDTURfU1lOQywKKwkJCQlzaXplb2YoKnNlbmQpLCBzZW5kKTsKKworCXNlbmQtPmZpbHRlcl9mbGFncyA9IG9sZF9maWx0ZXI7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBpd2xhZ25fdXBkYXRlX3FvcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQogewpAQCAtMTAyLDcgKzEyMSw3IEBACiAJCSAgICAgIGN0eC0+cW9zX2RhdGEucW9zX2FjdGl2ZSwKIAkJICAgICAgY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0ucW9zX2ZsYWdzKTsKIAotCXJldCA9IGl3bF9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5xb3NfY21kLAorCXJldCA9IHRyYW5zX3NlbmRfY21kX3BkdSgmcHJpdi0+dHJhbnMsIGN0eC0+cW9zX2NtZCwgQ01EX1NZTkMsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfcW9zcGFyYW1fY21kKSwKIAkJCSAgICAgICAmY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0pOwogCWlmIChyZXQpCkBAIC0xNjEsMTEgKzE4MCw4IEBACiAJCSBjdHgtPnN0YWdpbmcub2ZkbV9odF90cmlwbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOwogCXJ4b25fYXNzb2MuYWNxdWlzaXRpb25fZGF0YSA9IGN0eC0+c3RhZ2luZy5hY3F1aXNpdGlvbl9kYXRhOwogCi0JcmV0ID0gaXdsX3NlbmRfY21kX3BkdV9hc3luYyhwcml2LCBjdHgtPnJ4b25fYXNzb2NfY21kLAotCQkJCSAgICAgc2l6ZW9mKHJ4b25fYXNzb2MpLCAmcnhvbl9hc3NvYywgTlVMTCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQorCXJldCA9IHRyYW5zX3NlbmRfY21kX3BkdSgmcHJpdi0+dHJhbnMsIGN0eC0+cnhvbl9hc3NvY19jbWQsCisJCQkJQ01EX0FTWU5DLCBzaXplb2Yocnhvbl9hc3NvYyksICZyeG9uX2Fzc29jKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNzUsMTAgKzE5MSwyMSBAQAogCWludCByZXQ7CiAJc3RydWN0IGl3bF9yeG9uX2NtZCAqYWN0aXZlID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7CiAKLQlpZiAoY3R4LT5jdHhpZCA9PSBJV0xfUlhPTl9DVFhfQlNTKQorCWlmIChjdHgtPmN0eGlkID09IElXTF9SWE9OX0NUWF9CU1MpIHsKIAkJcmV0ID0gaXdsYWduX2Rpc2FibGVfYnNzKHByaXYsIGN0eCwgJmN0eC0+c3RhZ2luZyk7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCXJldCA9IGl3bGFnbl9kaXNhYmxlX3Bhbihwcml2LCBjdHgsICZjdHgtPnN0YWdpbmcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGN0eC0+dmlmKSB7CisJCQlyZXQgPSBpd2xfc2VuZF9yeG9uX3RpbWluZyhwcml2LCBjdHgpOworCQkJaWYgKHJldCkgeworCQkJCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byBzZW5kIHRpbWluZyAoJWQpIVxuIiwgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJcmV0ID0gaXdsYWduX2Rpc2Nvbm5fcGFuKHByaXYsIGN0eCwgJmN0eC0+c3RhZ2luZyk7CisJCX0KKwl9CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTg3LDYgKzIxNCw4IEBACiAJICoga2V5cywgc28gd2UgaGF2ZSB0byByZXN0b3JlIHRob3NlIGFmdGVyd2FyZHMuCiAJICovCiAJaXdsX2NsZWFyX3Vjb2RlX3N0YXRpb25zKHByaXYsIGN0eCk7CisJLyogdXBkYXRlIC0tIG1pZ2h0IG5lZWQgUDJQIG5vdyAqLworCWl3bF91cGRhdGVfYmNhc3Rfc3RhdGlvbihwcml2LCBjdHgpOwogCWl3bF9yZXN0b3JlX3N0YXRpb25zKHByaXYsIGN0eCk7CiAJcmV0ID0gaXdsX3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhwcml2LCBjdHgpOwogCWlmIChyZXQpIHsKQEAgLTIwNSwxMCArMjM0LDEyIEBACiAJc3RydWN0IGl3bF9yeG9uX2NtZCAqYWN0aXZlID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7CiAKIAkvKiBSWE9OIHRpbWluZyBtdXN0IGJlIGJlZm9yZSBhc3NvY2lhdGVkIFJYT04gKi8KLQlyZXQgPSBpd2xfc2VuZF9yeG9uX3RpbWluZyhwcml2LCBjdHgpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHNlbmQgdGltaW5nICglZCkhXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OworCWlmIChjdHgtPmN0eGlkID09IElXTF9SWE9OX0NUWF9CU1MpIHsKKwkJcmV0ID0gaXdsX3NlbmRfcnhvbl90aW1pbmcocHJpdiwgY3R4KTsKKwkJaWYgKHJldCkgeworCQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHNlbmQgdGltaW5nICglZCkhXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAkvKiBRb1MgaW5mbyBtYXkgYmUgY2xlYXJlZCBieSBwcmV2aW91cyB1bi1hc3NvYyBSWE9OICovCiAJaXdsYWduX3VwZGF0ZV9xb3MocHJpdiwgY3R4KTsKQEAgLTIzNSw3ICsyNjYsNyBAQAogCSAqIEFzc29jaWF0ZWQgUlhPTiBkb2Vzbid0IGNsZWFyIHRoZSBzdGF0aW9uIHRhYmxlIGluIHVDb2RlLAogCSAqIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVzdG9yZSBzdGF0aW9ucyBldGMuIGFmdGVyIHRoaXMuCiAJICovCi0JcmV0ID0gaXdsX3NlbmRfY21kX3BkdShwcml2LCBjdHgtPnJ4b25fY21kLAorCXJldCA9IHRyYW5zX3NlbmRfY21kX3BkdSgmcHJpdi0+dHJhbnMsIGN0eC0+cnhvbl9jbWQsIENNRF9TWU5DLAogCQkgICAgICBzaXplb2Yoc3RydWN0IGl3bF9yeG9uX2NtZCksICZjdHgtPnN0YWdpbmcpOwogCWlmIChyZXQpIHsKIAkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2V0dGluZyBuZXcgUlhPTiAoJWQpXG4iLCByZXQpOwpAQCAtMjYzLDkgKzI5NCwxMDcgQEAKIAkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2VuZGluZyBUWCBwb3dlciAoJWQpXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KKworCWlmICgoY3R4LT52aWYgJiYgY3R4LT52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgJiYKKwkgICAgcHJpdi0+Y2ZnLT5odF9wYXJhbXMtPnNtcHNfbW9kZSkKKwkJaWVlZTgwMjExX3JlcXVlc3Rfc21wcyhjdHgtPnZpZiwKKwkJCQkgICAgICAgcHJpdi0+Y2ZnLT5odF9wYXJhbXMtPnNtcHNfbW9kZSk7CisKIAlyZXR1cm4gMDsKIH0KIAoraW50IGl3bGFnbl9zZXRfcGFuX3BhcmFtcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGl3bF93aXBhbl9wYXJhbXNfY21kIGNtZDsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4X2JzcywgKmN0eF9wYW47CisJaW50IHNsb3QwID0gMzAwLCBzbG90MSA9IDA7CisJaW50IHJldDsKKworCWlmIChwcml2LT52YWxpZF9jb250ZXh0cyA9PSBCSVQoSVdMX1JYT05fQ1RYX0JTUykpCisJCXJldHVybiAwOworCisJQlVJTERfQlVHX09OKE5VTV9JV0xfUlhPTl9DVFggIT0gMik7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7CisKKwljdHhfYnNzID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOworCWN0eF9wYW4gPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX1BBTl07CisKKwkvKgorCSAqIElmIHRoZSBQQU4gY29udGV4dCBpcyBpbmFjdGl2ZSwgdGhlbiB3ZSBkb24ndCBuZWVkCisJICogdG8gdXBkYXRlIHRoZSBQQU4gcGFyYW1ldGVycywgdGhlIGxhc3QgdGhpbmcgd2UnbGwKKwkgKiBoYXZlIGRvbmUgYmVmb3JlIGl0IGdvZXMgaW5hY3RpdmUgaXMgbWFraW5nIHRoZSBQQU4KKwkgKiBwYXJhbWV0ZXJzIGJlIFdMQU4tb25seS4KKwkgKi8KKwlpZiAoIWN0eF9wYW4tPmlzX2FjdGl2ZSkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCisJLyogb25seSAyIHNsb3RzIGFyZSBjdXJyZW50bHkgYWxsb3dlZCAqLworCWNtZC5udW1fc2xvdHMgPSAyOworCisJY21kLnNsb3RzWzBdLnR5cGUgPSAwOyAvKiBCU1MgKi8KKwljbWQuc2xvdHNbMV0udHlwZSA9IDE7IC8qIFBBTiAqLworCisJaWYgKHByaXYtPmh3X3JvY19jaGFubmVsKSB7CisJCS8qIGJvdGggY29udGV4dHMgbXVzdCBiZSB1c2VkIGZvciB0aGlzIHRvIGhhcHBlbiAqLworCQlzbG90MSA9IHByaXYtPmh3X3JvY19kdXJhdGlvbjsKKwkJc2xvdDAgPSBJV0xfTUlOX1NMT1RfVElNRTsKKwl9IGVsc2UgaWYgKGN0eF9ic3MtPnZpZiAmJiBjdHhfcGFuLT52aWYpIHsKKwkJaW50IGJjbmludCA9IGN0eF9wYW4tPmJlYWNvbl9pbnQ7CisJCWludCBkdGltID0gY3R4X3Bhbi0+dmlmLT5ic3NfY29uZi5kdGltX3BlcmlvZCA/OiAxOworCisJCS8qIHNob3VsZCBiZSBzZXQsIGJ1dCBzZWVtcyB1bnVzZWQ/PyAqLworCQljbWQuZmxhZ3MgfD0gY3B1X3RvX2xlMTYoSVdMX1dJUEFOX1BBUkFNU19GTEdfU0xPVFRFRF9NT0RFKTsKKworCQlpZiAoY3R4X3Bhbi0+dmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQICYmCisJCSAgICBiY25pbnQgJiYKKwkJICAgIGJjbmludCAhPSBjdHhfYnNzLT5iZWFjb25faW50KSB7CisJCQlJV0xfRVJSKHByaXYsCisJCQkJImJlYWNvbiBpbnRlcnZhbHMgZG9uJ3QgbWF0Y2ggKCVkLCAlZClcbiIsCisJCQkJY3R4X2Jzcy0+YmVhY29uX2ludCwgY3R4X3Bhbi0+YmVhY29uX2ludCk7CisJCX0gZWxzZQorCQkJYmNuaW50ID0gbWF4X3QoaW50LCBiY25pbnQsCisJCQkJICAgICAgIGN0eF9ic3MtPmJlYWNvbl9pbnQpOworCQlpZiAoIWJjbmludCkKKwkJCWJjbmludCA9IERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMOworCQlzbG90MCA9IGJjbmludCAvIDI7CisJCXNsb3QxID0gYmNuaW50IC0gc2xvdDA7CisKKwkJaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKSB8fAorCQkgICAgKCFjdHhfYnNzLT52aWYtPmJzc19jb25mLmlkbGUgJiYKKwkJICAgICAhY3R4X2Jzcy0+dmlmLT5ic3NfY29uZi5hc3NvYykpIHsKKwkJCXNsb3QwID0gZHRpbSAqIGJjbmludCAqIDMgLSBJV0xfTUlOX1NMT1RfVElNRTsKKwkJCXNsb3QxID0gSVdMX01JTl9TTE9UX1RJTUU7CisJCX0gZWxzZSBpZiAoIWN0eF9wYW4tPnZpZi0+YnNzX2NvbmYuaWRsZSAmJgorCQkJICAgIWN0eF9wYW4tPnZpZi0+YnNzX2NvbmYuYXNzb2MpIHsKKwkJCXNsb3QxID0gYmNuaW50ICogMyAtIElXTF9NSU5fU0xPVF9USU1FOworCQkJc2xvdDAgPSBJV0xfTUlOX1NMT1RfVElNRTsKKwkJfQorCX0gZWxzZSBpZiAoY3R4X3Bhbi0+dmlmKSB7CisJCXNsb3QwID0gMDsKKwkJc2xvdDEgPSBtYXhfdChpbnQsIDEsIGN0eF9wYW4tPnZpZi0+YnNzX2NvbmYuZHRpbV9wZXJpb2QpICoKKwkJCQkJY3R4X3Bhbi0+YmVhY29uX2ludDsKKwkJc2xvdDEgPSBtYXhfdChpbnQsIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMLCBzbG90MSk7CisKKwkJaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKSkgeworCQkJc2xvdDAgPSBzbG90MSAqIDMgLSBJV0xfTUlOX1NMT1RfVElNRTsKKwkJCXNsb3QxID0gSVdMX01JTl9TTE9UX1RJTUU7CisJCX0KKwl9CisKKwljbWQuc2xvdHNbMF0ud2lkdGggPSBjcHVfdG9fbGUxNihzbG90MCk7CisJY21kLnNsb3RzWzFdLndpZHRoID0gY3B1X3RvX2xlMTYoc2xvdDEpOworCisJcmV0ID0gdHJhbnNfc2VuZF9jbWRfcGR1KCZwcml2LT50cmFucywgUkVQTFlfV0lQQU5fUEFSQU1TLCBDTURfU1lOQywKKwkJCXNpemVvZihjbWQpLCAmY21kKTsKKwlpZiAocmV0KQorCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIFBBTiBwYXJhbWV0ZXJzICglZClcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKioKICAqIGl3bGFnbl9jb21taXRfcnhvbiAtIGNvbW1pdCBzdGFnaW5nX3J4b24gdG8gaGFyZHdhcmUKICAqCkBAIC0zMDgsOCArNDM3LDggQEAKIAkvKiBhbHdheXMgZ2V0IHRpbWVzdGFtcCB3aXRoIFJ4IGZyYW1lICovCiAJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1RTRjJIT1NUX01TSzsKIAotCWlmIChjdHgtPmN0eGlkID09IElXTF9SWE9OX0NUWF9QQU4gJiYgcHJpdi0+X2Fnbi5od19yb2NfY2hhbm5lbCkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4gPSBwcml2LT5fYWduLmh3X3JvY19jaGFubmVsOworCWlmIChjdHgtPmN0eGlkID09IElXTF9SWE9OX0NUWF9QQU4gJiYgcHJpdi0+aHdfcm9jX2NoYW5uZWwpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuID0gcHJpdi0+aHdfcm9jX2NoYW5uZWw7CiAKIAkJaXdsX3NldF9yeG9uX2NoYW5uZWwocHJpdiwgY2hhbiwgY3R4KTsKIAkJaXdsX3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIGNoYW4tPmJhbmQsIE5VTEwpOwpAQCAtMzI1LDYgKzQ1NCwxNCBAQAogCQkJcmV0dXJuIDA7CiAJfQogCisJLyoKKwkgKiBmb3JjZSBDVFMtdG8tc2VsZiBmcmFtZXMgcHJvdGVjdGlvbiBpZiBSVFMtQ1RTIGlzIG5vdCBwcmVmZXJyZWQKKwkgKiBvbmUgYWdncmVnYXRpb24gcHJvdGVjdGlvbiBtZXRob2QKKwkgKi8KKwlpZiAoIShwcml2LT5jZmctPmh0X3BhcmFtcyAmJgorCSAgICAgIHByaXYtPmNmZy0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbikpCisJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TRUxGX0NUU19FTjsKKwogCWlmICgoY3R4LT52aWYgJiYgY3R4LT52aWYtPmJzc19jb25mLnVzZV9zaG9ydF9zbG90KSB8fAogCSAgICAhKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykpCiAJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKQEAgLTM0MiwxMCArNDc5LDEwIEBACiAJICogcmVjZWl2ZSBjb21taXRfcnhvbiByZXF1ZXN0CiAJICogYWJvcnQgYW55IHByZXZpb3VzIGNoYW5uZWwgc3dpdGNoIGlmIHN0aWxsIGluIHByb2Nlc3MKIAkgKi8KLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzICYmCi0JICAgIChwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSkgeworCWlmICh0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykgJiYKKwkgICAgKHByaXYtPnN3aXRjaF9jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSkgewogCQlJV0xfREVCVUdfMTFIKHByaXYsICJhYm9ydCBjaGFubmVsIHN3aXRjaCBvbiAlZFxuIiwKLQkJICAgICAgbGUxNl90b19jcHUocHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCkpOworCQkJICAgICAgbGUxNl90b19jcHUocHJpdi0+c3dpdGNoX2NoYW5uZWwpKTsKIAkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwogCX0KIApAQCAtMzYyLDEzICs0OTksMTYgQEAKIAkJfQogCiAJCW1lbWNweShhY3RpdmUsICZjdHgtPnN0YWdpbmcsIHNpemVvZigqYWN0aXZlKSk7Ci0JCXJldHVybiAwOwotCX0KKwkJLyoKKwkJICogV2UgZG8gbm90IGNvbW1pdCB0eCBwb3dlciBzZXR0aW5ncyB3aGlsZSBjaGFubmVsIGNoYW5naW5nLAorCQkgKiBkbyBpdCBub3cgaWYgYWZ0ZXIgc2V0dGluZ3MgY2hhbmdlZC4KKwkJICovCisJCWl3bF9zZXRfdHhfcG93ZXIocHJpdiwgcHJpdi0+dHhfcG93ZXJfbmV4dCwgZmFsc2UpOwogCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcGFuX3BhcmFtcykgewotCQlyZXQgPSBwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3Bhbl9wYXJhbXMocHJpdik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQkvKiBtYWtlIHN1cmUgd2UgYXJlIGluIHRoZSByaWdodCBQUyBzdGF0ZSAqLworCQlpd2xfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgdHJ1ZSk7CisKKwkJcmV0dXJuIDA7CiAJfQogCiAJaXdsX3NldF9yeG9uX2h3Y3J5cHRvKHByaXYsIGN0eCwgIWl3bGFnbl9tb2RfcGFyYW1zLnN3X2NyeXB0byk7CkBAIC0zOTIsNiArNTMyLDEwIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXJldCA9IGl3bGFnbl9zZXRfcGFuX3BhcmFtcyhwcml2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJaWYgKG5ld19hc3NvYykKIAkJcmV0dXJuIGl3bGFnbl9yeG9uX2Nvbm5lY3QocHJpdiwgY3R4KTsKIApAQCAtNDMzLDkgKzU3Nyw4IEBACiAJCSAqIHNldCB1cCB0aGUgU00gUFMgbW9kZSB0byBPRkYgaWYgYW4gSFQgY2hhbm5lbCBpcwogCQkgKiBjb25maWd1cmVkLgogCQkgKi8KLQkJaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KQotCQkJCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOworCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkKKwkJCWl3bGFnbl9zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwogCX0KIAogCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpIHsKQEAgLTYyMyw2ICs3NjYsMzggQEAKIAlodF9jb25mLT5zaW5nbGVfY2hhaW5fc3VmZmljaWVudCA9ICFuZWVkX211bHRpcGxlOwogfQogCitzdGF0aWMgdm9pZCBpd2xhZ25fY2hhaW5fbm9pc2VfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCXN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YSA9ICZwcml2LT5jaGFpbl9ub2lzZV9kYXRhOworCWludCByZXQ7CisKKwlpZiAoKGRhdGEtPnN0YXRlID09IElXTF9DSEFJTl9OT0lTRV9BTElWRSkgJiYKKwkgICAgaXdsX2lzX2FueV9hc3NvY2lhdGVkKHByaXYpKSB7CisJCXN0cnVjdCBpd2xfY2FsaWJfY2hhaW5fbm9pc2VfcmVzZXRfY21kIGNtZDsKKworCQkvKiBjbGVhciBkYXRhIGZvciBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbiBhbGdvcml0aG0gKi8KKwkJZGF0YS0+Y2hhaW5fbm9pc2VfYSA9IDA7CisJCWRhdGEtPmNoYWluX25vaXNlX2IgPSAwOworCQlkYXRhLT5jaGFpbl9ub2lzZV9jID0gMDsKKwkJZGF0YS0+Y2hhaW5fc2lnbmFsX2EgPSAwOworCQlkYXRhLT5jaGFpbl9zaWduYWxfYiA9IDA7CisJCWRhdGEtPmNoYWluX3NpZ25hbF9jID0gMDsKKwkJZGF0YS0+YmVhY29uX2NvdW50ID0gMDsKKworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQlpd2xfc2V0X2NhbGliX2hkcigmY21kLmhkciwKKwkJCXByaXYtPnBoeV9jYWxpYl9jaGFpbl9ub2lzZV9yZXNldF9jbWQpOworCQlyZXQgPSB0cmFuc19zZW5kX2NtZF9wZHUoJnByaXYtPnRyYW5zLAorCQkJCQlSRVBMWV9QSFlfQ0FMSUJSQVRJT05fQ01ELAorCQkJCQlDTURfU1lOQywgc2l6ZW9mKGNtZCksICZjbWQpOworCQlpZiAocmV0KQorCQkJSVdMX0VSUihwcml2LAorCQkJCSJDb3VsZCBub3Qgc2VuZCBSRVBMWV9QSFlfQ0FMSUJSQVRJT05fQ01EXG4iKTsKKwkJZGF0YS0+c3RhdGUgPSBJV0xfQ0hBSU5fTk9JU0VfQUNDVU1VTEFURTsKKwkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJSdW4gY2hhaW5fbm9pc2VfY2FsaWJyYXRlXG4iKTsKKwl9Cit9CisKIHZvaWQgaXdsYWduX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLApAQCAtNjc5LDcgKzg1NCwxMiBAQAogCQkJCWl3bF93YWtlX2FueV9xdWV1ZShwcml2LCBjdHgpOwogCQkJfQogCQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOworCisJCQlpZiAoY3R4LT5jdHhpZCA9PSBJV0xfUlhPTl9DVFhfQlNTKQorCQkJCXByaXYtPmhhdmVfcmVrZXlfZGF0YSA9IGZhbHNlOwogCQl9CisKKwkJaXdsYWduX2J0X2NvZXhfcnNzaV9tb25pdG9yKHByaXYpOwogCX0KIAogCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKQEAgLTY5MSw4ICs4NzEsNyBAQAogCQlpd2xfc2V0X3J4b25faHQocHJpdiwgJnByaXYtPmN1cnJlbnRfaHRfY29uZmlnKTsKIAl9CiAKLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQotCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKKwlpd2xhZ25fc2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKIAogCWlmIChic3NfY29uZi0+dXNlX2N0c19wcm90ICYmIChwcml2LT5iYW5kICE9IElFRUU4MDIxMV9CQU5EXzVHSFopKQogCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLOwpAQCAtNzMwLDcgKzkwOSw4IEBACiAJCQlpd2xfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgZmFsc2UpOwogCiAJCS8qIEVuYWJsZSBSWCBkaWZmZXJlbnRpYWwgZ2FpbiBhbmQgc2Vuc2l0aXZpdHkgY2FsaWJyYXRpb25zICovCi0JCWl3bF9jaGFpbl9ub2lzZV9yZXNldChwcml2KTsKKwkJaWYgKCFwcml2LT5kaXNhYmxlX2NoYWluX25vaXNlX2NhbCkKKwkJCWl3bGFnbl9jaGFpbl9ub2lzZV9yZXNldChwcml2KTsKIAkJcHJpdi0+c3RhcnRfY2FsaWIgPSAxOwogCX0KIApAQCAtNzU3LDYgKzkzNywxMyBAQAogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7CiAKIAkvKgorCSAqIFdlIGRvIG5vdCBjb21taXQgcG93ZXIgc2V0dGluZ3Mgd2hpbGUgc2NhbiBpcyBwZW5kaW5nLAorCSAqIGRvIGl0IG5vdyBpZiB0aGUgc2V0dGluZ3MgY2hhbmdlZC4KKwkgKi8KKwlpd2xfcG93ZXJfc2V0X21vZGUocHJpdiwgJnByaXYtPnBvd2VyX2RhdGEuc2xlZXBfY21kX25leHQsIGZhbHNlKTsKKwlpd2xfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKKworCS8qCiAJICogU2luY2Ugc2V0dGluZyB0aGUgUlhPTiBtYXkgaGF2ZSBiZWVuIGRlZmVycmVkIHdoaWxlCiAJICogcGVyZm9ybWluZyB0aGUgc2NhbiwgZmlyZSBvbmUgb2ZmIGlmIG5lZWRlZAogCSAqLwpAQCAtNzY0LDYgKzk1MSw1IEBACiAJCWlmIChtZW1jbXAoJmN0eC0+c3RhZ2luZywgJmN0eC0+YWN0aXZlLCBzaXplb2YoY3R4LT5zdGFnaW5nKSkpCiAJCQlpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKIAotCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3Bhbl9wYXJhbXMpCi0JCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcGFuX3BhcmFtcyhwcml2KTsKKwlpd2xhZ25fc2V0X3Bhbl9wYXJhbXMocHJpdik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tc3RhLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tc3RhLmMKaW5kZXggMGJkNzIyYy4uMzdlNjI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXN0YS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1zdGEuYwpAQCAtMzMsOSArMzMsMTAgQEAKICNpbmNsdWRlICJpd2wtY29yZS5oIgogI2luY2x1ZGUgIml3bC1zdGEuaCIKICNpbmNsdWRlICJpd2wtYWduLmgiCisjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKgotaXdsX3N0YV9hbGxvY19scShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHN0YV9pZCkKK2l3bF9zdGFfYWxsb2NfbHEoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LCB1OCBzdGFfaWQpCiB7CiAJaW50IGksIHI7CiAJc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICpsaW5rX2NtZDsKQEAgLTQ3LDEwICs0OCwxNSBAQAogCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBMUSBjbWQuXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQorCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOworCiAJLyogU2V0IHVwIHRoZSByYXRlIHNjYWxpbmcgdG8gc3RhcnQgYXQgc2VsZWN0ZWQgcmF0ZSwgZmFsbCBiYWNrCiAJICogYWxsIHRoZSB3YXkgZG93biB0byAxTSBpbiBJRUVFIG9yZGVyLCBhbmQgdGhlbiBzcGluIG9uIDFNICovCiAJaWYgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKIAkJciA9IElXTF9SQVRFXzZNX0lOREVYOworCWVsc2UgaWYgKGN0eCAmJiBjdHgtPnZpZiAmJiBjdHgtPnZpZi0+cDJwKQorCQlyID0gSVdMX1JBVEVfNk1fSU5ERVg7CiAJZWxzZQogCQlyID0gSVdMX1JBVEVfMU1fSU5ERVg7CiAKQEAgLTExNSw3ICsxMjEsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CiAKIAkvKiBTZXQgdXAgZGVmYXVsdCByYXRlIHNjYWxpbmcgdGFibGUgaW4gZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZSAqLwotCWxpbmtfY21kID0gaXdsX3N0YV9hbGxvY19scShwcml2LCBzdGFfaWQpOworCWxpbmtfY21kID0gaXdsX3N0YV9hbGxvY19scShwcml2LCBjdHgsIHN0YV9pZCk7CiAJaWYgKCFsaW5rX2NtZCkgewogCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIHN0YXRpb24gJXBNLlxuIiwKIAkJCWFkZHIpOwpAQCAtMTMzLDYgKzEzOSwxNCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogc3RhdGljIFdFUCBrZXlzCisgKgorICogRm9yIGVhY2ggY29udGV4dCwgdGhlIGRldmljZSBoYXMgYSB0YWJsZSBvZiA0IHN0YXRpYyBXRVAga2V5cworICogKG9uZSBmb3IgZWFjaCBrZXkgaW5kZXgpIHRoYXQgaXMgdXBkYXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcKKyAqIGNvbW1hbmRzLgorICovCisKIHN0YXRpYyBpbnQgaXdsX3NlbmRfc3RhdGljX3dlcGtleV9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCiAJCQkJICAgICAgYm9vbCBzZW5kX2lmX2VtcHR5KQpAQCAtMTc1LDcgKzE4OSw3IEBACiAJY21kLmxlblswXSA9IGNtZF9zaXplOwogCiAJaWYgKG5vdF9lbXB0eSB8fCBzZW5kX2lmX2VtcHR5KQotCQlyZXR1cm4gaXdsX3NlbmRfY21kKHByaXYsICZjbWQpOworCQlyZXR1cm4gdHJhbnNfc2VuZF9jbWQoJnByaXYtPnRyYW5zLCAmY21kKTsKIAllbHNlCiAJCXJldHVybiAwOwogfQpAQCAtMjI2LDkgKzI0MCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWtleWNvbmYtPmZsYWdzICY9IH5JRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7Ci0Ja2V5Y29uZi0+aHdfa2V5X2lkeCA9IEhXX0tFWV9ERUZBVUxUOwotCXByaXYtPnN0YXRpb25zW2N0eC0+YXBfc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKKwlrZXljb25mLT5od19rZXlfaWR4ID0gSVdMQUdOX0hXX0tFWV9ERUZBVUxUOwogCiAJY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleV9zaXplID0ga2V5Y29uZi0+a2V5bGVuOwogCW1lbWNweSgmY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleSwgJmtleWNvbmYtPmtleSwKQEAgLTI0MSwxNjYgKzI1MywxMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGl3bF9zZXRfd2VwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJCQl1OCBzdGFfaWQpCisvKgorICogZHluYW1pYyAocGVyLXN0YXRpb24pIGtleXMKKyAqCisgKiBUaGUgZHluYW1pYyBrZXlzIGFyZSBhIGxpdHRsZSBtb3JlIGNvbXBsaWNhdGVkLiBUaGUgZGV2aWNlIGhhcworICogYSBrZXkgY2FjaGUgb2YgdXAgdG8gU1RBX0tFWV9NQVhfTlVNL1NUQV9LRVlfTUFYX05VTV9QQU4ga2V5cy4KKyAqIFRoZXNlIGFyZSBsaW5rZWQgdG8gc3RhdGlvbnMgYnkgYSB0YWJsZSB0aGF0IGNvbnRhaW5zIGFuIGluZGV4CisgKiBpbnRvIHRoZSBrZXkgdGFibGUgZm9yIGVhY2ggc3RhdGlvbi9rZXkgaW5kZXgve21jYXN0LHVuaWNhc3R9LAorICogaS5lLiBpdCdzIGJhc2ljYWxseSBhbiBhcnJheSBvZiBwb2ludGVycyBsaWtlIHRoaXM6CisgKglrZXlfb2Zmc2V0X3Qga2V5X21hcHBpbmdbTlVNX1NUQVRJT05TXVs0XVsyXTsKKyAqIChpdCByZWFsbHkgd29ya3MgZGlmZmVyZW50bHksIGJ1dCB5b3UgY2FuIHRoaW5rIG9mIGl0IGFzIHN1Y2gpCisgKgorICogVGhlIGtleSB1cGxvYWRpbmcgYW5kIGxpbmtpbmcgaGFwcGVucyBpbiB0aGUgc2FtZSBjb21tYW5kLCB0aGUKKyAqIGFkZCBzdGF0aW9uIGNvbW1hbmQgd2l0aCBTVEFfTU9ESUZZX0tFWV9NQVNLLgorICovCisKK3N0YXRpYyB1OCBpd2xhZ25fa2V5X3N0YV9pZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCXU4IHN0YV9pZCA9IElXTF9JTlZBTElEX1NUQVRJT047CisKKwlpZiAoc3RhKQorCQlzdGFfaWQgPSBpd2xfc3RhX2lkKHN0YSk7CisKKwkvKgorCSAqIFRoZSBkZXZpY2UgZXhwZWN0cyBHVEtzIGZvciBzdGF0aW9uIGludGVyZmFjZXMgdG8gYmUKKwkgKiBpbnN0YWxsZWQgYXMgR1RLcyBmb3IgdGhlIEFQIHN0YXRpb24uIElmIHdlIGhhdmUgbm8KKwkgKiBzdGF0aW9uIElELCB0aGVuIHVzZSB0aGUgYXBfc3RhX2lkIGluIHRoYXQgY2FzZS4KKwkgKi8KKwlpZiAoIXN0YSAmJiB2aWYgJiYgdmlmX3ByaXYtPmN0eCkgeworCQlzd2l0Y2ggKHZpZi0+dHlwZSkgeworCQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCQlzdGFfaWQgPSB2aWZfcHJpdi0+Y3R4LT5hcF9zdGFfaWQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBJbiBhbGwgb3RoZXIgY2FzZXMsIHRoZSBrZXkgd2lsbCBiZQorCQkJICogdXNlZCBlaXRoZXIgZm9yIFRYIG9ubHkgb3IgaXMgYm91bmQKKwkJCSAqIHRvIGEgc3RhdGlvbiBhbHJlYWR5LgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBzdGFfaWQ7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX3NlbmRfc3RhX2tleShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKKwkJCSAgICAgICB1OCBzdGFfaWQsIHUzMiB0a2lwX2l2MzIsIHUxNiAqdGtpcF9wMWssCisJCQkgICAgICAgdTMyIGNtZF9mbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCV9fbGUxNiBrZXlfZmxhZ3MgPSAwOworCV9fbGUxNiBrZXlfZmxhZ3M7CiAJc3RydWN0IGl3bF9hZGRzdGFfY21kIHN0YV9jbWQ7CisJaW50IGk7CiAKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CisJbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIHNpemVvZihzdGFfY21kKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKIAotCWtleWNvbmYtPmZsYWdzICY9IH5JRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7CisJa2V5X2ZsYWdzID0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7CisJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLOwogCi0Ja2V5X2ZsYWdzIHw9IChTVEFfS0VZX0ZMR19XRVAgfCBTVEFfS0VZX0ZMR19NQVBfS0VZX01TSyk7Ci0Ja2V5X2ZsYWdzIHw9IGNwdV90b19sZTE2KGtleWNvbmYtPmtleWlkeCA8PCBTVEFfS0VZX0ZMR19LRVlJRF9QT1MpOwotCWtleV9mbGFncyAmPSB+U1RBX0tFWV9GTEdfSU5WQUxJRDsKLQotCWlmIChrZXljb25mLT5rZXlsZW4gPT0gV0VQX0tFWV9MRU5fMTI4KQorCXN3aXRjaCAoa2V5Y29uZi0+Y2lwaGVyKSB7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgorCQlrZXlfZmxhZ3MgfD0gU1RBX0tFWV9GTEdfQ0NNUDsKKwkJbWVtY3B5KHN0YV9jbWQua2V5LmtleSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCWtleV9mbGFncyB8PSBTVEFfS0VZX0ZMR19US0lQOworCQlzdGFfY21kLmtleS50a2lwX3J4X3RzY19ieXRlMiA9IHRraXBfaXYzMjsKKwkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJCXN0YV9jbWQua2V5LnRraXBfcnhfdHRha1tpXSA9IGNwdV90b19sZTE2KHRraXBfcDFrW2ldKTsKKwkJbWVtY3B5KHN0YV9jbWQua2V5LmtleSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKIAkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfRkxHX0tFWV9TSVpFX01TSzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKKwkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfRkxHX1dFUDsKKwkJbWVtY3B5KCZzdGFfY21kLmtleS5rZXlbM10sIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JaWYgKHN0YV9pZCA9PSBjdHgtPmJjYXN0X3N0YV9pZCkKKwlpZiAoIShrZXljb25mLT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpCiAJCWtleV9mbGFncyB8PSBTVEFfS0VZX01VTFRJQ0FTVF9NU0s7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKKwkvKiBrZXkgcG9pbnRlciAob2Zmc2V0KSAqLworCXN0YV9jbWQua2V5LmtleV9vZmZzZXQgPSBrZXljb25mLT5od19rZXlfaWR4OwogCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0ga2V5Y29uZi0+a2V5bGVuOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXlpZHggPSBrZXljb25mLT5rZXlpZHg7CisJc3RhX2NtZC5rZXkua2V5X2ZsYWdzID0ga2V5X2ZsYWdzOworCXN0YV9jbWQubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CisJc3RhX2NtZC5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOwogCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksCi0JCQkJa2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOwotCi0JbWVtY3B5KCZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5WzNdLAotCQkJCWtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKLQotCWlmICgocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyAmIFNUQV9LRVlfRkxHX0VOQ1JZUFRfTVNLKQotCQkJPT0gU1RBX0tFWV9GTEdfTk9fRU5DKQotCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9Ci0JCQkJIGl3bF9nZXRfZnJlZV91Y29kZV9rZXlfaW5kZXgocHJpdik7Ci0JLyogZWxzZSwgd2UgYXJlIG92ZXJyaWRpbmcgYW4gZXhpc3Rpbmcga2V5ID0+IG5vIG5lZWQgdG8gYWxsb2NhdGVkIHJvb20KLQkgKiBpbiB1Q29kZS4gKi8KLQotCVdBUk4ocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPT0gV0VQX0lOVkFMSURfT0ZGU0VULAotCQkibm8gc3BhY2UgZm9yIGEgbmV3IGtleSIpOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9IGtleV9mbGFnczsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOwotCi0JbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIHNpemVvZihzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YV9jbWQsIENNRF9TWU5DKTsKLX0KLQotc3RhdGljIGludCBpd2xfc2V0X2NjbXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCQkJIHU4IHN0YV9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCV9fbGUxNiBrZXlfZmxhZ3MgPSAwOwotCXN0cnVjdCBpd2xfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0Ja2V5X2ZsYWdzIHw9IChTVEFfS0VZX0ZMR19DQ01QIHwgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0spOwotCWtleV9mbGFncyB8PSBjcHVfdG9fbGUxNihrZXljb25mLT5rZXlpZHggPDwgU1RBX0tFWV9GTEdfS0VZSURfUE9TKTsKLQlrZXlfZmxhZ3MgJj0gflNUQV9LRVlfRkxHX0lOVkFMSUQ7Ci0KLQlpZiAoc3RhX2lkID09IGN0eC0+YmNhc3Rfc3RhX2lkKQotCQlrZXlfZmxhZ3MgfD0gU1RBX0tFWV9NVUxUSUNBU1RfTVNLOwotCi0Ja2V5Y29uZi0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0ga2V5Y29uZi0+a2V5bGVuOwotCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwKLQkgICAgICAga2V5Y29uZi0+a2V5bGVuKTsKLQotCW1lbWNweShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5LCBrZXljb25mLT5rZXksCi0JICAgICAgIGtleWNvbmYtPmtleWxlbik7Ci0KLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykKLQkJCT09IFNUQV9LRVlfRkxHX05PX0VOQykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQotCQkJCSBpd2xfZ2V0X2ZyZWVfdWNvZGVfa2V5X2luZGV4KHByaXYpOwotCS8qIGVsc2UsIHdlIGFyZSBvdmVycmlkaW5nIGFuIGV4aXN0aW5nIGtleSA9PiBubyBuZWVkIHRvIGFsbG9jYXRlZCByb29tCi0JICogaW4gdUNvZGUuICovCi0KLQlXQVJOKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKLQkJIm5vIHNwYWNlIGZvciBhIG5ldyBrZXkiKTsKLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPSBrZXlfZmxhZ3M7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQotCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBzaXplb2Yoc3RydWN0IGl3bF9hZGRzdGFfY21kKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkJCSB1OCBzdGFfaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQlfX2xlMTYga2V5X2ZsYWdzID0gMDsKLQotCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfVEtJUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKLQlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7Ci0Ja2V5X2ZsYWdzICY9IH5TVEFfS0VZX0ZMR19JTlZBTElEOwotCi0JaWYgKHN0YV9pZCA9PSBjdHgtPmJjYXN0X3N0YV9pZCkKLQkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfTVVMVElDQVNUX01TSzsKLQotCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0gMTY7Ci0KLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykKLQkJCT09IFNUQV9LRVlfRkxHX05PX0VOQykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQotCQkJCSBpd2xfZ2V0X2ZyZWVfdWNvZGVfa2V5X2luZGV4KHByaXYpOwotCS8qIGVsc2UsIHdlIGFyZSBvdmVycmlkaW5nIGFuIGV4aXN0aW5nIGtleSA9PiBubyBuZWVkIHRvIGFsbG9jYXRlZCByb29tCi0JICogaW4gdUNvZGUuICovCi0KLQlXQVJOKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKLQkJIm5vIHNwYWNlIGZvciBhIG5ldyBrZXkiKTsKLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPSBrZXlfZmxhZ3M7Ci0KLQotCS8qIFRoaXMgY29weSBpcyBhY3V0YWxseSBub3QgbmVlZGVkOiB3ZSBnZXQgdGhlIGtleSB3aXRoIGVhY2ggVFggKi8KLQltZW1jcHkocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleSwga2V5Y29uZi0+a2V5LCAxNik7Ci0KLQltZW1jcHkocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleSwga2V5Y29uZi0+a2V5LCAxNik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgY21kX2ZsYWdzKTsKIH0KIAogdm9pZCBpd2xfdXBkYXRlX3RraXBfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAorCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKIAkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpCiB7Ci0JdTggc3RhX2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7CisJdTggc3RhX2lkID0gaXdsYWduX2tleV9zdGFfaWQocHJpdiwgdmlmLCBzdGEpOworCisJaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKQorCQlyZXR1cm47CiAKIAlpZiAoaXdsX3NjYW5fY2FuY2VsKHByaXYpKSB7CiAJCS8qIGNhbmNlbCBzY2FuIGZhaWxlZCwganVzdCBsaXZlIHcvIGJhZCBrZXkgYW5kIHJlbHkKQEAgLTQwOCwxMjEgKzM3MSwxMTAgQEAKIAkJcmV0dXJuOwogCX0KIAotCXN0YV9pZCA9IGl3bF9zdGFfaWRfb3JfYnJvYWRjYXN0KHByaXYsIGN0eCwgc3RhKTsKLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHNjX2J5dGUyID0gKHU4KSBpdjMyOwotCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHRha1tpXSA9Ci0JCQljcHVfdG9fbGUxNihwaGFzZTFrZXlbaV0pOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQotCWl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBDTURfQVNZTkMpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQorCWl3bGFnbl9zZW5kX3N0YV9rZXkocHJpdiwga2V5Y29uZiwgc3RhX2lkLAorCQkJICAgIGl2MzIsIHBoYXNlMWtleSwgQ01EX0FTWU5DKTsKIH0KIAogaW50IGl3bF9yZW1vdmVfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKIAkJCSAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkgICB1OCBzdGFfaWQpCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IGtleV9mbGFnczsKLQl1OCBrZXlpZHg7CiAJc3RydWN0IGl3bF9hZGRzdGFfY21kIHN0YV9jbWQ7CisJdTggc3RhX2lkID0gaXdsYWduX2tleV9zdGFfaWQocHJpdiwgY3R4LT52aWYsIHN0YSk7CisKKwkvKiBpZiBzdGF0aW9uIGlzbid0IHRoZXJlLCBuZWl0aGVyIGlzIHRoZSBrZXkgKi8KKwlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCisJCXJldHVybiAtRU5PRU5UOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CisJbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIHNpemVvZihzdGFfY21kKSk7CisJaWYgKCEocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSVdMX1NUQV9VQ09ERV9BQ1RJVkUpKQorCQlzdGFfaWQgPSBJV0xfSU5WQUxJRF9TVEFUSU9OOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCisJCXJldHVybiAwOwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwogCiAJY3R4LT5rZXlfbWFwcGluZ19rZXlzLS07CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlrZXlfZmxhZ3MgPSBsZTE2X3RvX2NwdShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzKTsKLQlrZXlpZHggPSAoa2V5X2ZsYWdzID4+IFNUQV9LRVlfRkxHX0tFWUlEX1BPUykgJiAweDM7Ci0KIAlJV0xfREVCVUdfV0VQKHByaXYsICJSZW1vdmUgZHluYW1pYyBrZXk6IGlkeD0lZCBzdGE9JWRcbiIsCiAJCSAgICAgIGtleWNvbmYtPmtleWlkeCwgc3RhX2lkKTsKIAotCWlmIChrZXljb25mLT5rZXlpZHggIT0ga2V5aWR4KSB7Ci0JCS8qIFdlIG5lZWQgdG8gcmVtb3ZlIGEga2V5IHdpdGggaW5kZXggZGlmZmVyZW50IHRoYXQgdGhlIG9uZQotCQkgKiBpbiB0aGUgdUNvZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUga2V5IHdlIG5lZWQgdG8gcmVtb3ZlIGhhcwotCQkgKiBiZWVuIHJlcGxhY2VkIGJ5IGFub3RoZXIgb25lIHdpdGggZGlmZmVyZW50IGluZGV4LgotCQkgKiBEb24ndCBkbyBhbnl0aGluZyBhbmQgcmV0dXJuIG9rCi0JCSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoa2V5Y29uZi0+aHdfa2V5X2lkeCwgJnByaXYtPnVjb2RlX2tleV90YWJsZSkpCisJCUlXTF9FUlIocHJpdiwgIm9mZnNldCAlZCBub3QgdXNlZCBpbiB1Q29kZSBrZXkgdGFibGUuXG4iLAorCQkJa2V5Y29uZi0+aHdfa2V5X2lkeCk7CiAKLQlpZiAocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPT0gV0VQX0lOVkFMSURfT0ZGU0VUKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJSZW1vdmluZyB3cm9uZyBrZXkgJWQgMHgleFxuIiwKLQkJCSAgICBrZXljb25mLT5rZXlpZHgsIGtleV9mbGFncyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0LAotCQkmcHJpdi0+dWNvZGVfa2V5X3RhYmxlKSkKLQkJSVdMX0VSUihwcml2LCAiaW5kZXggJWQgbm90IHVzZWQgaW4gdUNvZGUga2V5IHRhYmxlLlxuIiwKLQkJCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0KTsKLQltZW1zZXQoJnByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mbywgMCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpd2xfaHdfa2V5KSk7Ci0JbWVtc2V0KCZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXksIDAsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaXdsX2tleWluZm8pKTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0KLQkJCVNUQV9LRVlfRkxHX05PX0VOQyB8IFNUQV9LRVlfRkxHX0lOVkFMSUQ7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPSBXRVBfSU5WQUxJRF9PRkZTRVQ7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQotCWlmIChpd2xfaXNfcmZraWxsKHByaXYpKSB7Ci0JCUlXTF9ERUJVR19XRVAocHJpdiwgIk5vdCBzZW5kaW5nIFJFUExZX0FERF9TVEEgY29tbWFuZCBiZWNhdXNlIFJGS0lMTCBlbmFibGVkLlxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgc2l6ZW9mKHN0cnVjdCBpd2xfYWRkc3RhX2NtZCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CisJc3RhX2NtZC5rZXkua2V5X2ZsYWdzID0gU1RBX0tFWV9GTEdfTk9fRU5DIHwgU1RBX0tFWV9GTEdfSU5WQUxJRDsKKwlzdGFfY21kLmtleS5rZXlfb2Zmc2V0ID0gV0VQX0lOVkFMSURfT0ZGU0VUOworCXN0YV9jbWQuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKKwlzdGFfY21kLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOwogCiAJcmV0dXJuIGl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YV9jbWQsIENNRF9TWU5DKTsKIH0KIAotaW50IGl3bF9zZXRfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoraW50IGl3bF9zZXRfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogeworCXN0cnVjdCBpZWVlODAyMTFfa2V5X3NlcSBzZXE7CisJdTE2IHAxa1s1XTsKIAlpbnQgcmV0OworCXU4IHN0YV9pZCA9IGl3bGFnbl9rZXlfc3RhX2lkKHByaXYsIGN0eC0+dmlmLCBzdGEpOworCWNvbnN0IHU4ICphZGRyOworCisJaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKIAorCWtleWNvbmYtPmh3X2tleV9pZHggPSBpd2xfZ2V0X2ZyZWVfdWNvZGVfa2V5X29mZnNldChwcml2KTsKKwlpZiAoa2V5Y29uZi0+aHdfa2V5X2lkeCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQpCisJCXJldHVybiAtRU5PU1BDOworCiAJY3R4LT5rZXlfbWFwcGluZ19rZXlzKys7Ci0Ja2V5Y29uZi0+aHdfa2V5X2lkeCA9IEhXX0tFWV9EWU5BTUlDOwogCiAJc3dpdGNoIChrZXljb25mLT5jaXBoZXIpIHsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCXJldCA9IGl3bF9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHByaXYsIGN0eCwga2V5Y29uZiwgc3RhX2lkKTsKLQkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQlyZXQgPSBpd2xfc2V0X3RraXBfZHluYW1pY19rZXlfaW5mbyhwcml2LCBjdHgsIGtleWNvbmYsIHN0YV9pZCk7CisJCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDOworCQlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7CisKKwkJaWYgKHN0YSkKKwkJCWFkZHIgPSBzdGEtPmFkZHI7CisJCWVsc2UgLyogc3RhdGlvbiBtb2RlIGNhc2Ugb25seSAqLworCQkJYWRkciA9IGN0eC0+YWN0aXZlLmJzc2lkX2FkZHI7CisKKwkJLyogcHJlLWZpbGwgcGhhc2UgMSBrZXkgaW50byBkZXZpY2UgY2FjaGUgKi8KKwkJaWVlZTgwMjExX2dldF9rZXlfcnhfc2VxKGtleWNvbmYsIDAsICZzZXEpOworCQlpZWVlODAyMTFfZ2V0X3RraXBfcnhfcDFrKGtleWNvbmYsIGFkZHIsIHNlcS50a2lwLml2MzIsIHAxayk7CisJCXJldCA9IGl3bGFnbl9zZW5kX3N0YV9rZXkocHJpdiwga2V5Y29uZiwgc3RhX2lkLAorCQkJCQkgIHNlcS50a2lwLml2MzIsIHAxaywgQ01EX1NZTkMpOwogCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJcmV0ID0gaXdsX3NldF93ZXBfZHluYW1pY19rZXlfaW5mbyhwcml2LCBjdHgsIGtleWNvbmYsIHN0YV9pZCk7CisJCXJldCA9IGl3bGFnbl9zZW5kX3N0YV9rZXkocHJpdiwga2V5Y29uZiwgc3RhX2lkLAorCQkJCQkgIDAsIE5VTEwsIENNRF9TWU5DKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJSVdMX0VSUihwcml2LAotCQkJIlVua25vd24gYWxnOiAlcyBjaXBoZXIgPSAleFxuIiwgX19mdW5jX18sCi0JCQlrZXljb25mLT5jaXBoZXIpOworCQlJV0xfRVJSKHByaXYsICJVbmtub3duIGNpcGhlciAleFxuIiwga2V5Y29uZi0+Y2lwaGVyKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CiAKLQlJV0xfREVCVUdfV0VQKHByaXYsICJTZXQgZHluYW1pYyBrZXk6IGNpcGhlcj0leCBsZW49JWQgaWR4PSVkIHN0YT0lZCByZXQ9JWRcbiIsCisJaWYgKHJldCkgeworCQljdHgtPmtleV9tYXBwaW5nX2tleXMtLTsKKwkJY2xlYXJfYml0KGtleWNvbmYtPmh3X2tleV9pZHgsICZwcml2LT51Y29kZV9rZXlfdGFibGUpOworCX0KKworCUlXTF9ERUJVR19XRVAocHJpdiwgIlNldCBkeW5hbWljIGtleTogY2lwaGVyPSV4IGxlbj0lZCBpZHg9JWQgc3RhPSVwTSByZXQ9JWRcbiIsCiAJCSAgICAgIGtleWNvbmYtPmNpcGhlciwga2V5Y29uZi0+a2V5bGVuLCBrZXljb25mLT5rZXlpZHgsCi0JCSAgICAgIHN0YV9pZCwgcmV0KTsKKwkJICAgICAgc3RhID8gc3RhLT5hZGRyIDogTlVMTCwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01NTQsNyArNTA2LDcgQEAKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSVdMX1NUQV9CQ0FTVDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwogCi0JbGlua19jbWQgPSBpd2xfc3RhX2FsbG9jX2xxKHByaXYsIHN0YV9pZCk7CisJbGlua19jbWQgPSBpd2xfc3RhX2FsbG9jX2xxKHByaXYsIGN0eCwgc3RhX2lkKTsKIAlpZiAoIWxpbmtfY21kKSB7CiAJCUlXTF9FUlIocHJpdiwKIAkJCSJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIGJjYXN0IHN0YXRpb24uXG4iKTsKQEAgLTU3NCwxNCArNTI2LDE0IEBACiAgKiBPbmx5IHVzZWQgYnkgaXdsYWduLiBQbGFjZWQgaGVyZSB0byBoYXZlIGFsbCBiY2FzdCBzdGF0aW9uIG1hbmFnZW1lbnQKICAqIGNvZGUgdG9nZXRoZXIuCiAgKi8KLXN0YXRpYyBpbnQgaXdsX3VwZGF0ZV9iY2FzdF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKK2ludCBpd2xfdXBkYXRlX2JjYXN0X3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICpsaW5rX2NtZDsKIAl1OCBzdGFfaWQgPSBjdHgtPmJjYXN0X3N0YV9pZDsKIAotCWxpbmtfY21kID0gaXdsX3N0YV9hbGxvY19scShwcml2LCBzdGFfaWQpOworCWxpbmtfY21kID0gaXdsX3N0YV9hbGxvY19scShwcml2LCBjdHgsIHN0YV9pZCk7CiAJaWYgKCFsaW5rX2NtZCkgewogCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIGJjYXN0IHN0YXRpb24uXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10dC5jCmluZGV4IDM0OGY3NGYuLmY1MDFkNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10dC5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIAkJLyogUmVzY2hlZHVsZSB0aGUgY3Rfa2lsbCB0aW1lciB0byBvY2N1ciBpbgogCQkgKiBDVF9LSUxMX0VYSVRfRFVSQVRJT04gc2Vjb25kcyB0byBlbnN1cmUgd2UgZ2V0IGEKIAkJICogdGhlcm1hbCB1cGRhdGUgKi8KLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJzY2hlZHVsZSBjdF9raWxsIGV4aXQgdGltZXJcbiIpOworCQlJV0xfREVCVUdfVEVNUChwcml2LCAic2NoZWR1bGUgY3Rfa2lsbCBleGl0IHRpbWVyXG4iKTsKIAkJbW9kX3RpbWVyKCZwcml2LT50aGVybWFsX3Rocm90dGxlLmN0X2tpbGxfZXhpdF90bSwKIAkJCSAgamlmZmllcyArIENUX0tJTExfRVhJVF9EVVJBVElPTiAqIEhaKTsKIAl9CkBAIC0yMDgsMTUgKzIwOCwxNSBAQAogCQkJICAgYm9vbCBzdG9wKQogewogCWlmIChzdG9wKSB7Ci0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiU3RvcCBhbGwgcXVldWVzXG4iKTsKKwkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIlN0b3AgYWxsIHF1ZXVlc1xuIik7CiAJCWlmIChwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKQogCQkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHByaXYtPmh3KTsKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsCisJCUlXTF9ERUJVR19URU1QKHByaXYsCiAJCQkJIlNjaGVkdWxlIDUgc2Vjb25kcyBDVF9LSUxMIFRpbWVyXG4iKTsKIAkJbW9kX3RpbWVyKCZwcml2LT50aGVybWFsX3Rocm90dGxlLmN0X2tpbGxfZXhpdF90bSwKIAkJCSAgamlmZmllcyArIENUX0tJTExfRVhJVF9EVVJBVElPTiAqIEhaKTsKIAl9IGVsc2UgewotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIldha2UgYWxsIHF1ZXVlc1xuIik7CisJCUlXTF9ERUJVR19URU1QKHByaXYsICJXYWtlIGFsbCBxdWV1ZXNcbiIpOwogCQlpZiAocHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKIAkJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhwcml2LT5odyk7CiAJfQpAQCAtMjMyLDcgKzIzMiw3IEBACiAKIAkvKiB0ZW1wZXJhdHVyZSB0aW1lciBleHBpcmVkLCByZWFkeSB0byBnbyBpbnRvIENUX0tJTEwgc3RhdGUgKi8KIAlpZiAodHQtPnN0YXRlICE9IElXTF9USV9DVF9LSUxMKSB7Ci0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiZW50ZXJpbmcgQ1RfS0lMTCBzdGF0ZSB3aGVuICIKKwkJSVdMX0RFQlVHX1RFTVAocHJpdiwgImVudGVyaW5nIENUX0tJTEwgc3RhdGUgd2hlbiAiCiAJCQkJInRlbXBlcmF0dXJlIHRpbWVyIGV4cGlyZWRcbiIpOwogCQl0dC0+c3RhdGUgPSBJV0xfVElfQ1RfS0lMTDsKIAkJc2V0X2JpdChTVEFUVVNfQ1RfS0lMTCwgJnByaXYtPnN0YXR1cyk7CkBAIC0yNDIsNyArMjQyLDcgQEAKIAogc3RhdGljIHZvaWQgaXdsX3ByZXBhcmVfY3Rfa2lsbF90YXNrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlByZXBhcmUgdG8gZW50ZXIgSVdMX1RJX0NUX0tJTExcbiIpOworCUlXTF9ERUJVR19URU1QKHByaXYsICJQcmVwYXJlIHRvIGVudGVyIElXTF9USV9DVF9LSUxMXG4iKTsKIAkvKiBtYWtlIHJlcXVlc3QgdG8gcmV0cmlldmUgc3RhdGlzdGljcyBpbmZvcm1hdGlvbiAqLwogCWl3bF9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChwcml2LCBDTURfU1lOQywgZmFsc2UpOwogCS8qIFJlc2NoZWR1bGUgdGhlIGN0X2tpbGwgd2FpdCB0aW1lciAqLwpAQCAtMjczLDcgKzI3Myw3IEBACiAJICAgICh0ZW1wID4gdHQtPnR0X3ByZXZpb3VzX3RlbXApICYmCiAJICAgICgodGVtcCAtIHR0LT50dF9wcmV2aW91c190ZW1wKSA+CiAJICAgIElXTF9UVF9JTkNSRUFTRV9NQVJHSU4pKSB7Ci0JCUlXTF9ERUJVR19QT1dFUihwcml2LAorCQlJV0xfREVCVUdfVEVNUChwcml2LAogCQkJIlRlbXBlcmF0dXJlIGluY3JlYXNlICVkIGRlZ3JlZSBDZWxzaXVzXG4iLAogCQkJKHRlbXAgLSB0dC0+dHRfcHJldmlvdXNfdGVtcCkpOwogCX0KQEAgLTMzOCw5ICszMzgsOSBAQAogCQkJfSBlbHNlIGlmIChvbGRfc3RhdGUgPT0gSVdMX1RJX0NUX0tJTEwgJiYKIAkJCQkgdHQtPnN0YXRlICE9IElXTF9USV9DVF9LSUxMKQogCQkJCWl3bF9wZXJmb3JtX2N0X2tpbGxfdGFzayhwcml2LCBmYWxzZSk7Ci0JCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlRlbXBlcmF0dXJlIHN0YXRlIGNoYW5nZWQgJXVcbiIsCisJCQlJV0xfREVCVUdfVEVNUChwcml2LCAiVGVtcGVyYXR1cmUgc3RhdGUgY2hhbmdlZCAldVxuIiwKIAkJCQkJdHQtPnN0YXRlKTsKLQkJCUlXTF9ERUJVR19QT1dFUihwcml2LCAiUG93ZXIgSW5kZXggY2hhbmdlIHRvICV1XG4iLAorCQkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIlBvd2VyIEluZGV4IGNoYW5nZSB0byAldVxuIiwKIAkJCQkJdHQtPnR0X3Bvd2VyX21vZGUpOwogCQl9CiAJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJCQkgICAgKHRlbXAgPiB0dC0+dHRfcHJldmlvdXNfdGVtcCkgJiYKIAkJCSAgICAoKHRlbXAgLSB0dC0+dHRfcHJldmlvdXNfdGVtcCkgPgogCQkJICAgIElXTF9UVF9JTkNSRUFTRV9NQVJHSU4pKSB7Ci0JCQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsCisJCQkJSVdMX0RFQlVHX1RFTVAocHJpdiwKIAkJCQkJIlRlbXBlcmF0dXJlIGluY3JlYXNlICVkICIKIAkJCQkJImRlZ3JlZSBDZWxzaXVzXG4iLAogCQkJCQkodGVtcCAtIHR0LT50dF9wcmV2aW91c190ZW1wKSk7CkBAIC00NjcsMTMgKzQ2NywxMyBAQAogCQkJCXNldF9iaXQoU1RBVFVTX0NUX0tJTEwsICZwcml2LT5zdGF0dXMpOwogCQkJdHQtPnN0YXRlID0gb2xkX3N0YXRlOwogCQl9IGVsc2UgewotCQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsCisJCQlJV0xfREVCVUdfVEVNUChwcml2LAogCQkJCQkiVGhlcm1hbCBUaHJvdHRsaW5nIHRvIG5ldyBzdGF0ZTogJXVcbiIsCiAJCQkJCXR0LT5zdGF0ZSk7CiAJCQlpZiAob2xkX3N0YXRlICE9IElXTF9USV9DVF9LSUxMICYmCiAJCQkgICAgdHQtPnN0YXRlID09IElXTF9USV9DVF9LSUxMKSB7CiAJCQkJaWYgKGZvcmNlKSB7Ci0JCQkJCUlXTF9ERUJVR19QT1dFUihwcml2LAorCQkJCQlJV0xfREVCVUdfVEVNUChwcml2LAogCQkJCQkJIkVudGVyIElXTF9USV9DVF9LSUxMXG4iKTsKIAkJCQkJc2V0X2JpdChTVEFUVVNfQ1RfS0lMTCwgJnByaXYtPnN0YXR1cyk7CiAJCQkJCWl3bF9wZXJmb3JtX2N0X2tpbGxfdGFzayhwcml2LCB0cnVlKTsKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCQkJCX0KIAkJCX0gZWxzZSBpZiAob2xkX3N0YXRlID09IElXTF9USV9DVF9LSUxMICYmCiAJCQkJICB0dC0+c3RhdGUgIT0gSVdMX1RJX0NUX0tJTEwpIHsKLQkJCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkV4aXQgSVdMX1RJX0NUX0tJTExcbiIpOworCQkJCUlXTF9ERUJVR19URU1QKHByaXYsICJFeGl0IElXTF9USV9DVF9LSUxMXG4iKTsKIAkJCQlpd2xfcGVyZm9ybV9jdF9raWxsX3Rhc2socHJpdiwgZmFsc2UpOwogCQkJfQogCQl9CkBAIC01NjgsNyArNTY4LDcgQEAKIAlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCiAJCXJldHVybjsKIAotCUlXTF9ERUJVR19QT1dFUihwcml2LCAiUXVldWVpbmcgY3JpdGljYWwgdGVtcGVyYXR1cmUgZW50ZXIuXG4iKTsKKwlJV0xfREVCVUdfVEVNUChwcml2LCAiUXVldWVpbmcgY3JpdGljYWwgdGVtcGVyYXR1cmUgZW50ZXIuXG4iKTsKIAlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPmN0X2VudGVyKTsKIH0KIApAQCAtNTc3LDcgKzU3Nyw3IEBACiAJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlyZXR1cm47CiAKLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlF1ZXVlaW5nIGNyaXRpY2FsIHRlbXBlcmF0dXJlIGV4aXQuXG4iKTsKKwlJV0xfREVCVUdfVEVNUChwcml2LCAiUXVldWVpbmcgY3JpdGljYWwgdGVtcGVyYXR1cmUgZXhpdC5cbiIpOwogCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+Y3RfZXhpdCk7CiB9CiAKQEAgLTYwMyw3ICs2MDMsNyBAQAogCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKIAkJcmV0dXJuOwogCi0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJRdWV1ZWluZyB0aGVybWFsIHRocm90dGxpbmcgd29yay5cbiIpOworCUlXTF9ERUJVR19URU1QKHByaXYsICJRdWV1ZWluZyB0aGVybWFsIHRocm90dGxpbmcgd29yay5cbiIpOwogCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+dHRfd29yayk7CiB9CiAKQEAgLTYxOCw3ICs2MTgsNyBAQAogCWludCBzaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfdHRfdHJhbnMpICogKElXTF9USV9TVEFURV9NQVggLSAxKTsKIAlzdHJ1Y3QgaXdsX3R0X3RyYW5zICp0cmFuc2FjdGlvbjsKIAotCUlXTF9ERUJVR19QT1dFUihwcml2LCAiSW5pdGlhbGl6ZSBUaGVybWFsIFRocm90dGxpbmdcbiIpOworCUlXTF9ERUJVR19URU1QKHByaXYsICJJbml0aWFsaXplIFRoZXJtYWwgVGhyb3R0bGluZ1xuIik7CiAKIAltZW1zZXQodHQsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3R0X21nbXQpKTsKIApAQCAtNjM4LDcgKzYzOCw3IEBACiAJSU5JVF9XT1JLKCZwcml2LT5jdF9leGl0LCBpd2xfYmdfY3RfZXhpdCk7CiAKIAlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+YWR2X3RoZXJtYWxfdGhyb3R0bGUpIHsKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJBZHZhbmNlZCBUaGVybWFsIFRocm90dGxpbmdcbiIpOworCQlJV0xfREVCVUdfVEVNUChwcml2LCAiQWR2YW5jZWQgVGhlcm1hbCBUaHJvdHRsaW5nXG4iKTsKIAkJdHQtPnJlc3RyaWN0aW9uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl3bF90dF9yZXN0cmljdGlvbikgKgogCQkJCQkgSVdMX1RJX1NUQVRFX01BWCwgR0ZQX0tFUk5FTCk7CiAJCXR0LT50cmFuc2FjdGlvbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpd2xfdHRfdHJhbnMpICoKQEAgLTY3MSw3ICs2NzEsNyBAQAogCQkJcHJpdi0+dGhlcm1hbF90aHJvdHRsZS5hZHZhbmNlZF90dCA9IHRydWU7CiAJCX0KIAl9IGVsc2UgewotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkxlZ2FjeSBUaGVybWFsIFRocm90dGxpbmdcbiIpOworCQlJV0xfREVCVUdfVEVNUChwcml2LCAiTGVnYWN5IFRoZXJtYWwgVGhyb3R0bGluZ1xuIik7CiAJCXByaXYtPnRoZXJtYWxfdGhyb3R0bGUuYWR2YW5jZWRfdHQgPSBmYWxzZTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10eC5jCmluZGV4IDQ5NzRjZDcuLjUzYmI1OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10eC5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKICNpbmNsdWRlICJpd2wtYWduLWh3LmgiCiAjaW5jbHVkZSAiaXdsLWFnbi5oIgorI2luY2x1ZGUgIml3bC10cmFucy5oIgogCiAvKgogICogbWFjODAyMTEgcXVldWVzLCBBQ3MsIGhhcmR3YXJlIHF1ZXVlcywgRklGT3MuCkBAIC05NSwxMzIgKzk2LDggQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotLyoqCi0gKiBpd2xhZ25fdHhxX3VwZGF0ZV9ieXRlX2NudF90YmwgLSBTZXQgdXAgZW50cnkgaW4gVHggYnl0ZS1jb3VudCBhcnJheQotICovCi1zdGF0aWMgdm9pZCBpd2xhZ25fdHhxX3VwZGF0ZV9ieXRlX2NudF90Ymwoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQkJCSAgIHUxNiBieXRlX2NudCkKLXsKLQlzdHJ1Y3QgaXdsYWduX3NjZF9iY190YmwgKnNjZF9iY190YmwgPSBwcml2LT5zY2RfYmNfdGJscy5hZGRyOwotCWludCB3cml0ZV9wdHIgPSB0eHEtPnEud3JpdGVfcHRyOwotCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7Ci0JdTggc2VjX2N0bCA9IDA7Ci0JdTggc3RhX2lkID0gMDsKLQl1MTYgbGVuID0gYnl0ZV9jbnQgKyBJV0xfVFhfQ1JDX1NJWkUgKyBJV0xfVFhfREVMSU1JVEVSX1NJWkU7Ci0JX19sZTE2IGJjX2VudDsKLQotCVdBUk5fT04obGVuID4gMHhGRkYgfHwgd3JpdGVfcHRyID49IFRGRF9RVUVVRV9TSVpFX01BWCk7Ci0KLQlzdGFfaWQgPSB0eHEtPmNtZFt0eHEtPnEud3JpdGVfcHRyXS0+Y21kLnR4LnN0YV9pZDsKLQlzZWNfY3RsID0gdHhxLT5jbWRbdHhxLT5xLndyaXRlX3B0cl0tPmNtZC50eC5zZWNfY3RsOwotCi0Jc3dpdGNoIChzZWNfY3RsICYgVFhfQ01EX1NFQ19NU0spIHsKLQljYXNlIFRYX0NNRF9TRUNfQ0NNOgotCQlsZW4gKz0gQ0NNUF9NSUNfTEVOOwotCQlicmVhazsKLQljYXNlIFRYX0NNRF9TRUNfVEtJUDoKLQkJbGVuICs9IFRLSVBfSUNWX0xFTjsKLQkJYnJlYWs7Ci0JY2FzZSBUWF9DTURfU0VDX1dFUDoKLQkJbGVuICs9IFdFUF9JVl9MRU4gKyBXRVBfSUNWX0xFTjsKLQkJYnJlYWs7Ci0JfQotCi0JYmNfZW50ID0gY3B1X3RvX2xlMTYoKGxlbiAmIDB4RkZGKSB8IChzdGFfaWQgPDwgMTIpKTsKLQotCXNjZF9iY190YmxbdHhxX2lkXS50ZmRfb2Zmc2V0W3dyaXRlX3B0cl0gPSBiY19lbnQ7Ci0KLQlpZiAod3JpdGVfcHRyIDwgVEZEX1FVRVVFX1NJWkVfQkNfRFVQKQotCQlzY2RfYmNfdGJsW3R4cV9pZF0uCi0JCQl0ZmRfb2Zmc2V0W1RGRF9RVUVVRV9TSVpFX01BWCArIHdyaXRlX3B0cl0gPSBiY19lbnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bGFnbl90eHFfaW52YWxfYnl0ZV9jbnRfdGJsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpCi17Ci0Jc3RydWN0IGl3bGFnbl9zY2RfYmNfdGJsICpzY2RfYmNfdGJsID0gcHJpdi0+c2NkX2JjX3RibHMuYWRkcjsKLQlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOwotCWludCByZWFkX3B0ciA9IHR4cS0+cS5yZWFkX3B0cjsKLQl1OCBzdGFfaWQgPSAwOwotCV9fbGUxNiBiY19lbnQ7Ci0KLQlXQVJOX09OKHJlYWRfcHRyID49IFRGRF9RVUVVRV9TSVpFX01BWCk7Ci0KLQlpZiAodHhxX2lkICE9IHByaXYtPmNtZF9xdWV1ZSkKLQkJc3RhX2lkID0gdHhxLT5jbWRbcmVhZF9wdHJdLT5jbWQudHguc3RhX2lkOwotCi0JYmNfZW50ID0gY3B1X3RvX2xlMTYoMSB8IChzdGFfaWQgPDwgMTIpKTsKLQlzY2RfYmNfdGJsW3R4cV9pZF0udGZkX29mZnNldFtyZWFkX3B0cl0gPSBiY19lbnQ7Ci0KLQlpZiAocmVhZF9wdHIgPCBURkRfUVVFVUVfU0laRV9CQ19EVVApCi0JCXNjZF9iY190YmxbdHhxX2lkXS4KLQkJCXRmZF9vZmZzZXRbVEZEX1FVRVVFX1NJWkVfTUFYICsgcmVhZF9wdHJdID0gYmNfZW50OwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl90eF9xdWV1ZV9zZXRfcTJyYXRpZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiByYV90aWQsCi0JCQkJCXUxNiB0eHFfaWQpCi17Ci0JdTMyIHRibF9kd19hZGRyOwotCXUzMiB0YmxfZHc7Ci0JdTE2IHNjZF9xMnJhdGlkOwotCi0Jc2NkX3EycmF0aWQgPSByYV90aWQgJiBJV0xfU0NEX1FVRVVFX1JBX1RJRF9NQVBfUkFUSURfTVNLOwotCi0JdGJsX2R3X2FkZHIgPSBwcml2LT5zY2RfYmFzZV9hZGRyICsKLQkJCUlXTEFHTl9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVRfUVVFVUUodHhxX2lkKTsKLQotCXRibF9kdyA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIHRibF9kd19hZGRyKTsKLQotCWlmICh0eHFfaWQgJiAweDEpCi0JCXRibF9kdyA9IChzY2RfcTJyYXRpZCA8PCAxNikgfCAodGJsX2R3ICYgMHgwMDAwRkZGRik7Ci0JZWxzZQotCQl0YmxfZHcgPSBzY2RfcTJyYXRpZCB8ICh0YmxfZHcgJiAweEZGRkYwMDAwKTsKLQotCWl3bF93cml0ZV90YXJnX21lbShwcml2LCB0YmxfZHdfYWRkciwgdGJsX2R3KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpd2xhZ25fdHhfcXVldWVfc3RvcF9zY2hlZHVsZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgdHhxX2lkKQotewotCS8qIFNpbXBseSBzdG9wIHRoZSBxdWV1ZSwgYnV0IGRvbid0IGNoYW5nZSBhbnkgY29uZmlndXJhdGlvbjsKLQkgKiB0aGUgU0NEX0FDVF9FTiBiaXQgaXMgdGhlIHdyaXRlLWVuYWJsZSBtYXNrIGZvciB0aGUgQUNUSVZFIGJpdC4gKi8KLQlpd2xfd3JpdGVfcHJwaChwcml2LAotCQlJV0xBR05fU0NEX1FVRVVFX1NUQVRVU19CSVRTKHR4cV9pZCksCi0JCSgwIDw8IElXTEFHTl9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX0FDVElWRSl8Ci0JCSgxIDw8IElXTEFHTl9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ1RfRU4pKTsKLX0KLQotdm9pZCBpd2xhZ25fc2V0X3dyX3B0cnMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCWludCB0eHFfaWQsIHUzMiBpbmRleCkKLXsKLQlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX1dSUFRSLAotCQkJKGluZGV4ICYgMHhmZikgfCAodHhxX2lkIDw8IDgpKTsKLQlpd2xfd3JpdGVfcHJwaChwcml2LCBJV0xBR05fU0NEX1FVRVVFX1JEUFRSKHR4cV9pZCksIGluZGV4KTsKLX0KLQotdm9pZCBpd2xhZ25fdHhfcXVldWVfc2V0X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkJaW50IHR4X2ZpZm9faWQsIGludCBzY2RfcmV0cnkpCi17Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKLQlpbnQgYWN0aXZlID0gdGVzdF9iaXQodHhxX2lkLCAmcHJpdi0+dHhxX2N0eF9hY3RpdmVfbXNrKSA/IDEgOiAwOwotCi0JaXdsX3dyaXRlX3BycGgocHJpdiwgSVdMQUdOX1NDRF9RVUVVRV9TVEFUVVNfQklUUyh0eHFfaWQpLAotCQkJKGFjdGl2ZSA8PCBJV0xBR05fU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19BQ1RJVkUpIHwKLQkJCSh0eF9maWZvX2lkIDw8IElXTEFHTl9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1RYRikgfAotCQkJKDEgPDwgSVdMQUdOX1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfV1NMKSB8Ci0JCQlJV0xBR05fU0NEX1FVRVVFX1NUVFNfUkVHX01TSyk7Ci0KLQl0eHEtPnNjaGVkX3JldHJ5ID0gc2NkX3JldHJ5OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIiVzICVzIFF1ZXVlICVkIG9uIEZJRk8gJWRcbiIsCi0JCSAgICAgICBhY3RpdmUgPyAiQWN0aXZhdGUiIDogIkRlYWN0aXZhdGUiLAotCQkgICAgICAgc2NkX3JldHJ5ID8gIkJBIiA6ICJBQy9DTUQiLCB0eHFfaWQsIHR4X2ZpZm9faWQpOwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl90eHFfYWdnX2VuYWJsZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIGludCBzdGFfaWQsIGludCB0aWQpCitzdGF0aWMgaW50IGl3bGFnbl90eHFfYWdnX2VuYWJsZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIGludCBzdGFfaWQsCisJCQkJaW50IHRpZCkKIHsKIAlpZiAoKElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSA+IHR4cV9pZCkgfHwKIAkgICAgKElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSArCkBAIC0yMzcsMTA2ICsxMTQsMTQgQEAKIAlyZXR1cm4gaXdsX3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChwcml2LCBzdGFfaWQsIHRpZCk7CiB9CiAKLXZvaWQgaXdsYWduX3R4cV9hZ2dfcXVldWVfc2V0dXAoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkJaW50IHRpZCwgaW50IGZyYW1lX2xpbWl0KQorc3RhdGljIHZvaWQgaXdsYWduX3R4X2NtZF9wcm90ZWN0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKKwkJCQkgICAgIF9fbGUxNiBmYywgX19sZTMyICp0eF9mbGFncykKIHsKLQlpbnQgc3RhX2lkLCB0eF9maWZvLCB0eHFfaWQsIHNzbl9pZHg7Ci0JdTE2IHJhX3RpZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOwotCi0Jc3RhX2lkID0gaXdsX3N0YV9pZChzdGEpOwotCWlmIChXQVJOX09OKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkKLQkJcmV0dXJuOwotCWlmIChXQVJOX09OKHRpZCA+PSBNQVhfVElEX0NPVU5UKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JdGlkX2RhdGEgPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXTsKLQlzc25faWR4ID0gU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKTsKLQl0eHFfaWQgPSB0aWRfZGF0YS0+YWdnLnR4cV9pZDsKLQl0eF9maWZvID0gdGlkX2RhdGEtPmFnZy50eF9maWZvOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyYV90aWQgPSBCVUlMRF9SQXhUSUQoc3RhX2lkLCB0aWQpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIFN0b3AgdGhpcyBUeCBxdWV1ZSBiZWZvcmUgY29uZmlndXJpbmcgaXQgKi8KLQlpd2xhZ25fdHhfcXVldWVfc3RvcF9zY2hlZHVsZXIocHJpdiwgdHhxX2lkKTsKLQotCS8qIE1hcCByZWNlaXZlci1hZGRyZXNzIC8gdHJhZmZpYy1JRCB0byB0aGlzIHF1ZXVlICovCi0JaXdsYWduX3R4X3F1ZXVlX3NldF9xMnJhdGlkKHByaXYsIHJhX3RpZCwgdHhxX2lkKTsKLQotCS8qIFNldCB0aGlzIHF1ZXVlIGFzIGEgY2hhaW4tYnVpbGRpbmcgcXVldWUgKi8KLQlpd2xfc2V0X2JpdHNfcHJwaChwcml2LCBJV0xBR05fU0NEX1FVRVVFQ0hBSU5fU0VMLCAoMTw8dHhxX2lkKSk7Ci0KLQkvKiBlbmFibGUgYWdncmVnYXRpb25zIGZvciB0aGUgcXVldWUgKi8KLQlpd2xfc2V0X2JpdHNfcHJwaChwcml2LCBJV0xBR05fU0NEX0FHR1JfU0VMLCAoMTw8dHhxX2lkKSk7Ci0KLQkvKiBQbGFjZSBmaXJzdCBURkQgYXQgaW5kZXggY29ycmVzcG9uZGluZyB0byBzdGFydCBzZXF1ZW5jZSBudW1iZXIuCi0JICogQXNzdW1lcyB0aGF0IHNzbl9pZHggaXMgdmFsaWQgKCE9IDB4RkZGKSAqLwotCXByaXYtPnR4cVt0eHFfaWRdLnEucmVhZF9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOwotCXByaXYtPnR4cVt0eHFfaWRdLnEud3JpdGVfcHRyID0gKHNzbl9pZHggJiAweGZmKTsKLQlpd2xhZ25fc2V0X3dyX3B0cnMocHJpdiwgdHhxX2lkLCBzc25faWR4KTsKLQotCS8qIFNldCB1cCBUeCB3aW5kb3cgc2l6ZSBhbmQgZnJhbWUgbGltaXQgZm9yIHRoaXMgcXVldWUgKi8KLQlpd2xfd3JpdGVfdGFyZ19tZW0ocHJpdiwgcHJpdi0+c2NkX2Jhc2VfYWRkciArCi0JCQlJV0xBR05fU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKHR4cV9pZCkgKwotCQkJc2l6ZW9mKHUzMiksCi0JCQkoKGZyYW1lX2xpbWl0IDw8Ci0JCQlJV0xBR05fU0NEX1FVRVVFX0NUWF9SRUcyX1dJTl9TSVpFX1BPUykgJgotCQkJSVdMQUdOX1NDRF9RVUVVRV9DVFhfUkVHMl9XSU5fU0laRV9NU0spIHwKLQkJCSgoZnJhbWVfbGltaXQgPDwKLQkJCUlXTEFHTl9TQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfUE9TKSAmCi0JCQlJV0xBR05fU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX01TSykpOwotCi0JaXdsX3NldF9iaXRzX3BycGgocHJpdiwgSVdMQUdOX1NDRF9JTlRFUlJVUFRfTUFTSywgKDEgPDwgdHhxX2lkKSk7Ci0KLQkvKiBTZXQgdXAgU3RhdHVzIGFyZWEgaW4gU1JBTSwgbWFwIHRvIFR4IERNQS9GSUZPLCBhY3RpdmF0ZSB0aGUgcXVldWUgKi8KLQlpd2xhZ25fdHhfcXVldWVfc2V0X3N0YXR1cyhwcml2LCAmcHJpdi0+dHhxW3R4cV9pZF0sIHR4X2ZpZm8sIDEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl90eHFfYWdnX2Rpc2FibGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgdHhxX2lkLAotCQkJCSAgdTE2IHNzbl9pZHgsIHU4IHR4X2ZpZm8pCi17Ci0JaWYgKChJV0xBR05fRklSU1RfQU1QRFVfUVVFVUUgPiB0eHFfaWQpIHx8Ci0JICAgIChJV0xBR05fRklSU1RfQU1QRFVfUVVFVUUgKwotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIDw9IHR4cV9pZCkpIHsKLQkJSVdMX0VSUihwcml2LAotCQkJInF1ZXVlIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVkLCBtdXN0IGJlICVkIHRvICVkXG4iLAotCQkJdHhxX2lkLCBJV0xBR05fRklSU1RfQU1QRFVfUVVFVUUsCi0JCQlJV0xBR05fRklSU1RfQU1QRFVfUVVFVUUgKwotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX2FtcGR1X3F1ZXVlcyAtIDEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpd2xhZ25fdHhfcXVldWVfc3RvcF9zY2hlZHVsZXIocHJpdiwgdHhxX2lkKTsKLQotCWl3bF9jbGVhcl9iaXRzX3BycGgocHJpdiwgSVdMQUdOX1NDRF9BR0dSX1NFTCwgKDEgPDwgdHhxX2lkKSk7Ci0KLQlwcml2LT50eHFbdHhxX2lkXS5xLnJlYWRfcHRyID0gKHNzbl9pZHggJiAweGZmKTsKLQlwcml2LT50eHFbdHhxX2lkXS5xLndyaXRlX3B0ciA9IChzc25faWR4ICYgMHhmZik7Ci0JLyogc3VwcG9zZXMgdGhhdCBzc25faWR4IGlzIHZhbGlkICghPSAweEZGRikgKi8KLQlpd2xhZ25fc2V0X3dyX3B0cnMocHJpdiwgdHhxX2lkLCBzc25faWR4KTsKLQotCWl3bF9jbGVhcl9iaXRzX3BycGgocHJpdiwgSVdMQUdOX1NDRF9JTlRFUlJVUFRfTUFTSywgKDEgPDwgdHhxX2lkKSk7Ci0JaXdsX3R4cV9jdHhfZGVhY3RpdmF0ZShwcml2LCB0eHFfaWQpOwotCWl3bGFnbl90eF9xdWV1ZV9zZXRfc3RhdHVzKHByaXYsICZwcml2LT50eHFbdHhxX2lkXSwgdHhfZmlmbywgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEFjdGl2YXRlL0RlYWN0aXZhdGUgVHggRE1BL0ZJRk8gY2hhbm5lbHMgYWNjb3JkaW5nIHR4IGZpZm9zIG1hc2sKLSAqIG11c3QgYmUgY2FsbGVkIHVuZGVyIHByaXYtPmxvY2sgYW5kIG1hYyBhY2Nlc3MKLSAqLwotdm9pZCBpd2xhZ25fdHhxX3NldF9zY2hlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBtYXNrKQotewotCWl3bF93cml0ZV9wcnBoKHByaXYsIElXTEFHTl9TQ0RfVFhGQUNULCBtYXNrKTsKKwlpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19VU0VfUlRTX0NUUyB8fAorCSAgICBpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCB8fAorCSAgICBpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpCisJCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX1BST1RfUkVRVUlSRV9NU0s7CiB9CiAKIC8qCkBAIC0zNTMsMTkgKzEzOCwxNSBAQAogCV9fbGUzMiB0eF9mbGFncyA9IHR4X2NtZC0+dHhfZmxhZ3M7CiAKIAl0eF9jbWQtPnN0b3BfdGltZS5saWZlX3RpbWUgPSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFOwotCWlmICghKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0spKSB7Ci0JCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfQUNLX01TSzsKLQkJaWYgKGllZWU4MDIxMV9pc19tZ210KGZjKSkKLQkJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7Ci0JCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykgJiYKLQkJICAgICEobGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkgJiAweGYpKQotCQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19UU0ZfTVNLOwotCX0gZWxzZSB7Ci0JCXR4X2ZsYWdzICY9ICh+VFhfQ01EX0ZMR19BQ0tfTVNLKTsKLQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQl9CiAKLQlpZiAoaWVlZTgwMjExX2lzX2JhY2tfcmVxKGZjKSkKKwlpZiAoIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSkKKwkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BQ0tfTVNLOworCWVsc2UKKwkJdHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfQUNLX01TSzsKKworCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpCisJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfVFNGX01TSzsKKwllbHNlIGlmIChpZWVlODAyMTFfaXNfYmFja19yZXEoZmMpKQogCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX0FDS19NU0sgfCBUWF9DTURfRkxHX0lNTV9CQV9SU1BfTUFTSzsKIAllbHNlIGlmIChpbmZvLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFogJiYKIAkJIHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCkBAIC0zODgsNyArMTY5LDcgQEAKIAkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKIAl9CiAKLQlwcml2LT5jZmctPm9wcy0+dXRpbHMtPnR4X2NtZF9wcm90ZWN0aW9uKHByaXYsIGluZm8sIGZjLCAmdHhfZmxhZ3MpOworCWl3bGFnbl90eF9jbWRfcHJvdGVjdGlvbihwcml2LCBpbmZvLCBmYywgJnR4X2ZsYWdzKTsKIAogCXR4X2ZsYWdzICY9IH4oVFhfQ01EX0ZMR19BTlRfU0VMX01TSyk7CiAJaWYgKGllZWU4MDIxMV9pc19tZ210KGZjKSkgewpAQCAtNDM2LDYgKzIxNywxOCBAQAogCWlmIChpZWVlODAyMTFfaXNfZGF0YShmYykpIHsKIAkJdHhfY21kLT5pbml0aWFsX3JhdGVfaW5kZXggPSAwOwogCQl0eF9jbWQtPnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLOworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9TVlRPT0wKKwkJaWYgKHByaXYtPnRtX2ZpeGVkX3JhdGUpIHsKKwkJCS8qCisJCQkgKiByYXRlIG92ZXJ3cml0ZSBieSB0ZXN0bW9kZQorCQkJICogd2Ugbm90IG9ubHkgc2VuZCBscSBjb21tYW5kIHRvIGNoYW5nZSByYXRlCisJCQkgKiB3ZSBhbHNvIHJlLWVuZm9yY2UgcGVyIGRhdGEgcGt0IGJhc2UuCisJCQkgKi8KKwkJCXR4X2NtZC0+dHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLOworCQkJbWVtY3B5KCZ0eF9jbWQtPnJhdGVfbl9mbGFncywgJnByaXYtPnRtX2ZpeGVkX3JhdGUsCisJCQkgICAgICAgc2l6ZW9mKHR4X2NtZC0+cmF0ZV9uX2ZsYWdzKSk7CisJCX0KKyNlbmRpZgogCQlyZXR1cm47CiAJfQogCkBAIC00OTcsOCArMjkwLDcgQEAKIAogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKIAkJdHhfY21kLT5zZWNfY3RsID0gVFhfQ01EX1NFQ19US0lQOwotCQlpZWVlODAyMTFfZ2V0X3RraXBfa2V5KGtleWNvbmYsIHNrYl9mcmFnLAotCQkJSUVFRTgwMjExX1RLSVBfUDJfS0VZLCB0eF9jbWQtPmtleSk7CisJCWllZWU4MDIxMV9nZXRfdGtpcF9wMmsoa2V5Y29uZiwgc2tiX2ZyYWcsIHR4X2NtZC0+a2V5KTsKIAkJSVdMX0RFQlVHX1RYKHByaXYsICJ0eF9jbWQgd2l0aCB0a2lwIGh3Y3J5cHRvXG4iKTsKIAkJYnJlYWs7CiAKQEAgLTUyOCwyNiArMzIwLDE3IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IGluZm8tPmNvbnRyb2wuc3RhOwogCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9IE5VTEw7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxOwotCXN0cnVjdCBpd2xfcXVldWUgKnE7Ci0Jc3RydWN0IGl3bF9kZXZpY2VfY21kICpvdXRfY21kOwotCXN0cnVjdCBpd2xfY21kX21ldGEgKm91dF9tZXRhOwotCXN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQ7CiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKKwlzdHJ1Y3QgaXdsX3R4X2NtZCAqdHhfY21kOwogCWludCB0eHFfaWQ7Ci0JZG1hX2FkZHJfdCBwaHlzX2FkZHIgPSAwOwotCWRtYV9hZGRyX3QgdHhjbWRfcGh5czsKLQlkbWFfYWRkcl90IHNjcmF0Y2hfcGh5czsKLQl1MTYgbGVuLCBmaXJzdGxlbiwgc2Vjb25kbGVuOworCiAJdTE2IHNlcV9udW1iZXIgPSAwOwogCV9fbGUxNiBmYzsKIAl1OCBoZHJfbGVuOworCXUxNiBsZW47CiAJdTggc3RhX2lkOwotCXU4IHdhaXRfd3JpdGVfcHRyID0gMDsKIAl1OCB0aWQgPSAwOwotCXU4ICpxYyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIGlzX2FnZyA9IGZhbHNlOwogCkBAIC01OTUsOCArMzc4LDggQEAKIAogCUlXTF9ERUJVR19UWChwcml2LCAic3RhdGlvbiBJZCAlZFxuIiwgc3RhX2lkKTsKIAotCWlmIChzdGEpCi0JCXN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCWlmIChpbmZvLT5jb250cm9sLnN0YSkKKwkJc3RhX3ByaXYgPSAodm9pZCAqKWluZm8tPmNvbnRyb2wuc3RhLT5kcnZfcHJpdjsKIAogCWlmIChzdGFfcHJpdiAmJiBzdGFfcHJpdi0+YXNsZWVwICYmCiAJICAgIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUFNQT0xMX1JFU1BPTlNFKSkgewpAQCAtNjMxLDYgKzQxNCw3IEBACiAJc3Bpbl9sb2NrKCZwcml2LT5zdGFfbG9jayk7CiAKIAlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgeworCQl1OCAqcWMgPSBOVUxMOwogCQlxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwogCQl0aWQgPSBxY1swXSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOwogCkBAIC02NTEsMzggKzQzNSwxMyBAQAogCQl9CiAJfQogCi0JdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXEgPSAmdHhxLT5xOwotCi0JaWYgKHVubGlrZWx5KGl3bF9xdWV1ZV9zcGFjZShxKSA8IHEtPmhpZ2hfbWFyaykpCisJdHhfY21kID0gdHJhbnNfZ2V0X3R4X2NtZCgmcHJpdi0+dHJhbnMsIHR4cV9pZCk7CisJaWYgKHVubGlrZWx5KCF0eF9jbWQpKQogCQlnb3RvIGRyb3BfdW5sb2NrX3N0YTsKIAotCS8qIFNldCB1cCBkcml2ZXIgZGF0YSBmb3IgdGhpcyBURkQgKi8KLQltZW1zZXQoJih0eHEtPnR4YltxLT53cml0ZV9wdHJdKSwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfdHhfaW5mbykpOwotCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uc2tiID0gc2tiOwotCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uY3R4ID0gY3R4OwotCi0JLyogU2V0IHVwIGZpcnN0IGVtcHR5IGVudHJ5IGluIHF1ZXVlJ3MgYXJyYXkgb2YgVHgvY21kIGJ1ZmZlcnMgKi8KLQlvdXRfY21kID0gdHhxLT5jbWRbcS0+d3JpdGVfcHRyXTsKLQlvdXRfbWV0YSA9ICZ0eHEtPm1ldGFbcS0+d3JpdGVfcHRyXTsKLQl0eF9jbWQgPSAmb3V0X2NtZC0+Y21kLnR4OwotCW1lbXNldCgmb3V0X2NtZC0+aGRyLCAwLCBzaXplb2Yob3V0X2NtZC0+aGRyKSk7Ci0JbWVtc2V0KHR4X2NtZCwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfdHhfY21kKSk7Ci0KLQkvKgotCSAqIFNldCB1cCB0aGUgVHgtY29tbWFuZCAobm90IE1BQyEpIGhlYWRlci4KLQkgKiBTdG9yZSB0aGUgY2hvc2VuIFR4IHF1ZXVlIGFuZCBURkQgaW5kZXggd2l0aGluIHRoZSBzZXF1ZW5jZSBmaWVsZDsKLQkgKiBhZnRlciBUeCwgdUNvZGUncyBUeCByZXNwb25zZSB3aWxsIHJldHVybiB0aGlzIHZhbHVlIHNvIGRyaXZlciBjYW4KLQkgKiBsb2NhdGUgdGhlIGZyYW1lIHdpdGhpbiB0aGUgdHggcXVldWUgYW5kIGRvIHBvc3QtdHggcHJvY2Vzc2luZy4KLQkgKi8KLQlvdXRfY21kLT5oZHIuY21kID0gUkVQTFlfVFg7Ci0Jb3V0X2NtZC0+aGRyLnNlcXVlbmNlID0gY3B1X3RvX2xlMTYoKHUxNikoUVVFVUVfVE9fU0VRKHR4cV9pZCkgfAotCQkJCUlOREVYX1RPX1NFUShxLT53cml0ZV9wdHIpKSk7Ci0KIAkvKiBDb3B5IE1BQyBoZWFkZXIgZnJvbSBza2IgaW50byBjb21tYW5kIGJ1ZmZlciAqLwogCW1lbWNweSh0eF9jbWQtPmhkciwgaGRyLCBoZHJfbGVuKTsKIAotCiAJLyogVG90YWwgIyBieXRlcyB0byBiZSB0cmFuc21pdHRlZCAqLwogCWxlbiA9ICh1MTYpc2tiLT5sZW47CiAJdHhfY21kLT5sZW4gPSBjcHVfdG9fbGUxNihsZW4pOwpAQCAtNjk3LDU0ICs0NTYsOSBAQAogCWl3bGFnbl90eF9jbWRfYnVpbGRfcmF0ZShwcml2LCB0eF9jbWQsIGluZm8sIGZjKTsKIAogCWl3bF91cGRhdGVfc3RhdHMocHJpdiwgdHJ1ZSwgZmMsIGxlbik7Ci0JLyoKLQkgKiBVc2UgdGhlIGZpcnN0IGVtcHR5IGVudHJ5IGluIHRoaXMgcXVldWUncyBjb21tYW5kIGJ1ZmZlciBhcnJheQotCSAqIHRvIGNvbnRhaW4gdGhlIFR4IGNvbW1hbmQgYW5kIE1BQyBoZWFkZXIgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyCi0JICogKHBheWxvYWQgZGF0YSB3aWxsIGJlIGluIGFub3RoZXIgYnVmZmVyKS4KLQkgKiBTaXplIG9mIHRoaXMgdmFyaWVzLCBkdWUgdG8gdmFyeWluZyBNQUMgaGVhZGVyIGxlbmd0aC4KLQkgKiBJZiBlbmQgaXMgbm90IGR3b3JkIGFsaWduZWQsIHdlJ2xsIGhhdmUgMiBleHRyYSBieXRlcyBhdCB0aGUgZW5kCi0JICogb2YgdGhlIE1BQyBoZWFkZXIgKGRldmljZSByZWFkcyBvbiBkd29yZCBib3VuZGFyaWVzKS4KLQkgKiBXZSdsbCB0ZWxsIGRldmljZSBhYm91dCB0aGlzIHBhZGRpbmcgbGF0ZXIuCi0JICovCi0JbGVuID0gc2l6ZW9mKHN0cnVjdCBpd2xfdHhfY21kKSArCi0JCXNpemVvZihzdHJ1Y3QgaXdsX2NtZF9oZWFkZXIpICsgaGRyX2xlbjsKLQlmaXJzdGxlbiA9IChsZW4gKyAzKSAmIH4zOwogCi0JLyogVGVsbCBOSUMgYWJvdXQgYW55IDItYnl0ZSBwYWRkaW5nIGFmdGVyIE1BQyBoZWFkZXIgKi8KLQlpZiAoZmlyc3RsZW4gIT0gbGVuKQotCQl0eF9jbWQtPnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfTUhfUEFEX01TSzsKLQotCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyBUeCBjb21tYW5kJ3MgaGVhZGVyIChub3QgTUFDIGhlYWRlciEpLAotCSAqIHdpdGhpbiBjb21tYW5kIGJ1ZmZlciBhcnJheS4gKi8KLQl0eGNtZF9waHlzID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwKLQkJCQkgICAgJm91dF9jbWQtPmhkciwgZmlyc3RsZW4sCi0JCQkJICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JaWYgKHVubGlrZWx5KHBjaV9kbWFfbWFwcGluZ19lcnJvcihwcml2LT5wY2lfZGV2LCB0eGNtZF9waHlzKSkpCisJaWYgKHRyYW5zX3R4KCZwcml2LT50cmFucywgc2tiLCB0eF9jbWQsIHR4cV9pZCwgZmMsIGlzX2FnZywgY3R4KSkKIAkJZ290byBkcm9wX3VubG9ja19zdGE7Ci0JZG1hX3VubWFwX2FkZHJfc2V0KG91dF9tZXRhLCBtYXBwaW5nLCB0eGNtZF9waHlzKTsKLQlkbWFfdW5tYXBfbGVuX3NldChvdXRfbWV0YSwgbGVuLCBmaXJzdGxlbik7Ci0KLQlpZiAoIWllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JfSBlbHNlIHsKLQkJd2FpdF93cml0ZV9wdHIgPSAxOwotCQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKLQl9Ci0KLQkvKiBTZXQgdXAgVEZEJ3MgMm5kIGVudHJ5IHRvIHBvaW50IGRpcmVjdGx5IHRvIHJlbWFpbmRlciBvZiBza2IsCi0JICogaWYgYW55ICg4MDIuMTEgbnVsbCBmcmFtZXMgaGF2ZSBubyBwYXlsb2FkKS4gKi8KLQlzZWNvbmRsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47Ci0JaWYgKHNlY29uZGxlbiA+IDApIHsKLQkJcGh5c19hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGNpX2Rldiwgc2tiLT5kYXRhICsgaGRyX2xlbiwKLQkJCQkJICAgc2Vjb25kbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJaWYgKHVubGlrZWx5KHBjaV9kbWFfbWFwcGluZ19lcnJvcihwcml2LT5wY2lfZGV2LCBwaHlzX2FkZHIpKSkgewotCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LAotCQkJCQkgZG1hX3VubWFwX2FkZHIob3V0X21ldGEsIG1hcHBpbmcpLAotCQkJCQkgZG1hX3VubWFwX2xlbihvdXRfbWV0YSwgbGVuKSwKLQkJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JCQlnb3RvIGRyb3BfdW5sb2NrX3N0YTsKLQkJfQotCX0KIAogCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CiAJCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSsrOwpAQCAtNzUzLDU1ICs0NjcsOSBAQAogCX0KIAogCXNwaW5fdW5sb2NrKCZwcml2LT5zdGFfbG9jayk7Ci0KLQkvKiBBdHRhY2ggYnVmZmVycyB0byBURkQgKi8KLQlpd2xhZ25fdHhxX2F0dGFjaF9idWZfdG9fdGZkKHByaXYsIHR4cSwgdHhjbWRfcGh5cywgZmlyc3RsZW4sIDEpOwotCWlmIChzZWNvbmRsZW4gPiAwKQotCQlpd2xhZ25fdHhxX2F0dGFjaF9idWZfdG9fdGZkKHByaXYsIHR4cSwgcGh5c19hZGRyLAotCQkJCQkgICAgIHNlY29uZGxlbiwgMCk7Ci0KLQlzY3JhdGNoX3BoeXMgPSB0eGNtZF9waHlzICsgc2l6ZW9mKHN0cnVjdCBpd2xfY21kX2hlYWRlcikgKwotCQkJCW9mZnNldG9mKHN0cnVjdCBpd2xfdHhfY21kLCBzY3JhdGNoKTsKLQotCS8qIHRha2UgYmFjayBvd25lcnNoaXAgb2YgRE1BIGJ1ZmZlciB0byBlbmFibGUgdXBkYXRlICovCi0JcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHByaXYtPnBjaV9kZXYsIHR4Y21kX3BoeXMsCi0JCQkJICAgIGZpcnN0bGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCXR4X2NtZC0+ZHJhbV9sc2JfcHRyID0gY3B1X3RvX2xlMzIoc2NyYXRjaF9waHlzKTsKLQl0eF9jbWQtPmRyYW1fbXNiX3B0ciA9IGl3bF9nZXRfZG1hX2hpX2FkZHIoc2NyYXRjaF9waHlzKTsKLQotCUlXTF9ERUJVR19UWChwcml2LCAic2VxdWVuY2UgbnIgPSAwWCV4XG4iLAotCQkgICAgIGxlMTZfdG9fY3B1KG91dF9jbWQtPmhkci5zZXF1ZW5jZSkpOwotCUlXTF9ERUJVR19UWChwcml2LCAidHhfZmxhZ3MgPSAwWCV4XG4iLCBsZTMyX3RvX2NwdSh0eF9jbWQtPnR4X2ZsYWdzKSk7Ci0JaXdsX3ByaW50X2hleF9kdW1wKHByaXYsIElXTF9ETF9UWCwgKHU4ICopdHhfY21kLCBzaXplb2YoKnR4X2NtZCkpOwotCWl3bF9wcmludF9oZXhfZHVtcChwcml2LCBJV0xfRExfVFgsICh1OCAqKXR4X2NtZC0+aGRyLCBoZHJfbGVuKTsKLQotCS8qIFNldCB1cCBlbnRyeSBmb3IgdGhpcyBURkQgaW4gVHggYnl0ZS1jb3VudCBhcnJheSAqLwotCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpCi0JCWl3bGFnbl90eHFfdXBkYXRlX2J5dGVfY250X3RibChwcml2LCB0eHEsCi0JCQkJCSAgICAgICBsZTE2X3RvX2NwdSh0eF9jbWQtPmxlbikpOwotCi0JcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHByaXYtPnBjaV9kZXYsIHR4Y21kX3BoeXMsCi0JCQkJICAgICAgIGZpcnN0bGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCi0JdHJhY2VfaXdsd2lmaV9kZXZfdHgocHJpdiwKLQkJCSAgICAgJigoc3RydWN0IGl3bF90ZmQgKil0eHEtPnRmZHMpW3R4cS0+cS53cml0ZV9wdHJdLAotCQkJICAgICBzaXplb2Yoc3RydWN0IGl3bF90ZmQpLAotCQkJICAgICAmb3V0X2NtZC0+aGRyLCBmaXJzdGxlbiwKLQkJCSAgICAgc2tiLT5kYXRhICsgaGRyX2xlbiwgc2Vjb25kbGVuKTsKLQotCS8qIFRlbGwgZGV2aWNlIHRoZSB3cml0ZSBpbmRleCAqanVzdCBwYXN0KiB0aGlzIGxhdGVzdCBmaWxsZWQgVEZEICovCi0JcS0+d3JpdGVfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHEtPndyaXRlX3B0ciwgcS0+bl9iZCk7Ci0JaXdsX3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsIHR4cSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJLyoKLQkgKiBBdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyAidHJhbnNtaXR0ZWQiIHN1Y2Nlc3NmdWxseQotCSAqIGFuZCB3ZSB3aWxsIGdldCBhIFRYIHN0YXR1cyBub3RpZmljYXRpb24gZXZlbnR1YWxseSwKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiByZXQuICJyZXQiIG9ubHkgaW5kaWNhdGVzCi0JICogd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlci4KLQkgKi8KLQotCS8qCiAJICogQXZvaWQgYXRvbWljIG9wcyBpZiBpdCBpc24ndCBhbiBhc3NvY2lhdGVkIGNsaWVudC4KIAkgKiBBbHNvLCBpZiB0aGlzIGlzIGEgcGFja2V0IGZvciBhZ2dyZWdhdGlvbiwgZG9uJ3QKIAkgKiBpbmNyZWFzZSB0aGUgY291bnRlciBiZWNhdXNlIHRoZSB1Y29kZSB3aWxsIHN0b3AKQEAgLTgxMSwxNyArNDc5LDYgQEAKIAlpZiAoc3RhX3ByaXYgJiYgc3RhX3ByaXYtPmNsaWVudCAmJiAhaXNfYWdnKQogCQlhdG9taWNfaW5jKCZzdGFfcHJpdi0+cGVuZGluZ19mcmFtZXMpOwogCi0JaWYgKChpd2xfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspICYmIHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQpIHsKLQkJaWYgKHdhaXRfd3JpdGVfcHRyKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JCQlpd2xfdHhxX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgdHhxKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJfSBlbHNlIHsKLQkJCWl3bF9zdG9wX3F1ZXVlKHByaXYsIHR4cSk7Ci0JCX0KLQl9Ci0KIAlyZXR1cm4gMDsKIAogZHJvcF91bmxvY2tfc3RhOgpAQCAtODMxLDE3OCArNDg4LDYgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGl3bGFnbl9hbGxvY19kbWFfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9kbWFfcHRyICpwdHIsIHNpemVfdCBzaXplKQotewotCXB0ci0+YWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LCBzaXplLCAmcHRyLT5kbWEsCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghcHRyLT5hZGRyKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwdHItPnNpemUgPSBzaXplOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsYWduX2ZyZWVfZG1hX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpd2xfZG1hX3B0ciAqcHRyKQotewotCWlmICh1bmxpa2VseSghcHRyLT5hZGRyKSkKLQkJcmV0dXJuOwotCi0JZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwgcHRyLT5zaXplLCBwdHItPmFkZHIsIHB0ci0+ZG1hKTsKLQltZW1zZXQocHRyLCAwLCBzaXplb2YoKnB0cikpOwotfQotCi0vKioKLSAqIGl3bGFnbl9od190eHFfY3R4X2ZyZWUgLSBGcmVlIFRYUSBDb250ZXh0Ci0gKgotICogRGVzdHJveSBhbGwgVFggRE1BIHF1ZXVlcyBhbmQgc3RydWN0dXJlcwotICovCi12b2lkIGl3bGFnbl9od190eHFfY3R4X2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCB0eHFfaWQ7Ci0KLQkvKiBUeCBxdWV1ZXMgKi8KLQlpZiAocHJpdi0+dHhxKSB7Ci0JCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKLQkJCWlmICh0eHFfaWQgPT0gcHJpdi0+Y21kX3F1ZXVlKQotCQkJCWl3bF9jbWRfcXVldWVfZnJlZShwcml2KTsKLQkJCWVsc2UKLQkJCQlpd2xfdHhfcXVldWVfZnJlZShwcml2LCB0eHFfaWQpOwotCX0KLQlpd2xhZ25fZnJlZV9kbWFfcHRyKHByaXYsICZwcml2LT5rdyk7Ci0KLQlpd2xhZ25fZnJlZV9kbWFfcHRyKHByaXYsICZwcml2LT5zY2RfYmNfdGJscyk7Ci0KLQkvKiBmcmVlIHR4IHF1ZXVlIHN0cnVjdHVyZSAqLwotCWl3bF9mcmVlX3R4cV9tZW0ocHJpdik7Ci19Ci0KLS8qKgotICogaXdsYWduX3R4cV9jdHhfYWxsb2MgLSBhbGxvY2F0ZSBUWCBxdWV1ZSBjb250ZXh0Ci0gKiBBbGxvY2F0ZSBhbGwgVHggRE1BIHN0cnVjdHVyZXMgYW5kIGluaXRpYWxpemUgdGhlbQotICoKLSAqIEBwYXJhbSBwcml2Ci0gKiBAcmV0dXJuIGVycm9yIGNvZGUKLSAqLwotaW50IGl3bGFnbl90eHFfY3R4X2FsbG9jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0OwotCWludCB0eHFfaWQsIHNsb3RzX251bTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogRnJlZSBhbGwgdHgvY21kIHF1ZXVlcyBhbmQga2VlcC13YXJtIGJ1ZmZlciAqLwotCWl3bGFnbl9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0KLQlyZXQgPSBpd2xhZ25fYWxsb2NfZG1hX3B0cihwcml2LCAmcHJpdi0+c2NkX2JjX3RibHMsCi0JCQkJcHJpdi0+aHdfcGFyYW1zLnNjZF9iY190YmxzX3NpemUpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiU2NoZWR1bGVyIEJDIFRhYmxlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLQkJZ290byBlcnJvcl9iY190YmxzOwotCX0KLQkvKiBBbGxvYyBrZWVwLXdhcm0gYnVmZmVyICovCi0JcmV0ID0gaXdsYWduX2FsbG9jX2RtYV9wdHIocHJpdiwgJnByaXYtPmt3LCBJV0xfS1dfU0laRSk7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJLZWVwIFdhcm0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQlnb3RvIGVycm9yX2t3OwotCX0KLQotCS8qIGFsbG9jYXRlIHR4IHF1ZXVlIHN0cnVjdHVyZSAqLwotCXJldCA9IGl3bF9hbGxvY190eHFfbWVtKHByaXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogVHVybiBvZmYgYWxsIFR4IERNQSBmaWZvcyAqLwotCWl3bGFnbl90eHFfc2V0X3NjaGVkKHByaXYsIDApOwotCi0JLyogVGVsbCBOSUMgd2hlcmUgdG8gZmluZCB0aGUgImtlZXAgd2FybSIgYnVmZmVyICovCi0JaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX0tXX01FTV9BRERSX1JFRywgcHJpdi0+a3cuZG1hID4+IDQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQWxsb2MgYW5kIGluaXQgYWxsIFR4IHF1ZXVlcywgaW5jbHVkaW5nIHRoZSBjb21tYW5kIHF1ZXVlICgjNC8jOSkgKi8KLQlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IHByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspIHsKLQkJc2xvdHNfbnVtID0gKHR4cV9pZCA9PSBwcml2LT5jbWRfcXVldWUpID8KLQkJCQkJVEZEX0NNRF9TTE9UUyA6IFRGRF9UWF9DTURfU0xPVFM7Ci0JCXJldCA9IGl3bF90eF9xdWV1ZV9pbml0KHByaXYsICZwcml2LT50eHFbdHhxX2lkXSwgc2xvdHNfbnVtLAotCQkJCSAgICAgICB0eHFfaWQpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJUeCAlZCBxdWV1ZSBpbml0IGZhaWxlZFxuIiwgdHhxX2lkKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotCi0gZXJyb3I6Ci0JaXdsYWduX2h3X3R4cV9jdHhfZnJlZShwcml2KTsKLQlpd2xhZ25fZnJlZV9kbWFfcHRyKHByaXYsICZwcml2LT5rdyk7Ci0gZXJyb3Jfa3c6Ci0JaXdsYWduX2ZyZWVfZG1hX3B0cihwcml2LCAmcHJpdi0+c2NkX2JjX3RibHMpOwotIGVycm9yX2JjX3RibHM6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBpd2xhZ25fdHhxX2N0eF9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHR4cV9pZCwgc2xvdHNfbnVtOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogVHVybiBvZmYgYWxsIFR4IERNQSBmaWZvcyAqLwotCWl3bGFnbl90eHFfc2V0X3NjaGVkKHByaXYsIDApOwotCi0JLyogVGVsbCBOSUMgd2hlcmUgdG8gZmluZCB0aGUgImtlZXAgd2FybSIgYnVmZmVyICovCi0JaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX0tXX01FTV9BRERSX1JFRywgcHJpdi0+a3cuZG1hID4+IDQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQWxsb2MgYW5kIGluaXQgYWxsIFR4IHF1ZXVlcywgaW5jbHVkaW5nIHRoZSBjb21tYW5kIHF1ZXVlICgjNCkgKi8KLQlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IHByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspIHsKLQkJc2xvdHNfbnVtID0gdHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSA/Ci0JCQkgICAgVEZEX0NNRF9TTE9UUyA6IFRGRF9UWF9DTURfU0xPVFM7Ci0JCWl3bF90eF9xdWV1ZV9yZXNldChwcml2LCAmcHJpdi0+dHhxW3R4cV9pZF0sIHNsb3RzX251bSwgdHhxX2lkKTsKLQl9Ci19Ci0KLS8qKgotICogaXdsYWduX3R4cV9jdHhfc3RvcCAtIFN0b3AgYWxsIFR4IERNQSBjaGFubmVscwotICovCi12b2lkIGl3bGFnbl90eHFfY3R4X3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCBjaCwgdHhxX2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBUdXJuIG9mZiBhbGwgVHggRE1BIGZpZm9zICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWl3bGFnbl90eHFfc2V0X3NjaGVkKHByaXYsIDApOwotCi0JLyogU3RvcCBlYWNoIFR4IERNQSBjaGFubmVsLCBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgaWRsZSAqLwotCWZvciAoY2ggPSAwOyBjaCA8IHByaXYtPmh3X3BhcmFtcy5kbWFfY2hubF9udW07IGNoKyspIHsKLQkJaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNoKSwgMHgwKTsKLQkJaWYgKGl3bF9wb2xsX2RpcmVjdF9iaXQocHJpdiwgRkhfVFNTUl9UWF9TVEFUVVNfUkVHLAotCQkJCSAgICBGSF9UU1NSX1RYX1NUQVRVU19SRUdfTVNLX0NITkxfSURMRShjaCksCi0JCQkJICAgIDEwMDApKQotCQkJSVdMX0VSUihwcml2LCAiRmFpbGluZyBvbiB0aW1lb3V0IHdoaWxlIHN0b3BwaW5nIgotCQkJICAgICIgRE1BIGNoYW5uZWwgJWQgWzB4JTA4eF0iLCBjaCwKLQkJCSAgICBpd2xfcmVhZF9kaXJlY3QzMihwcml2LCBGSF9UU1NSX1RYX1NUQVRVU19SRUcpKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCFwcml2LT50eHEpCi0JCXJldHVybjsKLQotCS8qIFVubWFwIERNQSBmcm9tIGhvc3Qgc3lzdGVtIGFuZCBmcmVlIHNrYidzICovCi0JZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKQotCQlpZiAodHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSkKLQkJCWl3bF9jbWRfcXVldWVfdW5tYXAocHJpdik7Ci0JCWVsc2UKLQkJCWl3bF90eF9xdWV1ZV91bm1hcChwcml2LCB0eHFfaWQpOwotfQotCiAvKgogICogRmluZCBmaXJzdCBhdmFpbGFibGUgKGxvd2VzdCB1bnVzZWQpIFR4IFF1ZXVlLCBtYXJrIGl0ICJhY3RpdmUiLgogICogQ2FsbGVkIG9ubHkgd2hlbiBmaW5kaW5nIHF1ZXVlIGZvciBhZ2dyZWdhdGlvbi4KQEAgLTEwMzMsOCArNTE4LDggQEAKIAlpZiAodW5saWtlbHkodHhfZmlmbyA8IDApKQogCQlyZXR1cm4gdHhfZmlmbzsKIAotCUlXTF9XQVJOKHByaXYsICIlcyBvbiByYSA9ICVwTSB0aWQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBzdGEtPmFkZHIsIHRpZCk7CisJSVdMX0RFQlVHX0hUKHByaXYsICJUWCBBR0cgcmVxdWVzdCBvbiByYSA9ICVwTSB0aWQgPSAlZFxuIiwKKwkJICAgICBzdGEtPmFkZHIsIHRpZCk7CiAKIAlzdGFfaWQgPSBpd2xfc3RhX2lkKHN0YSk7CiAJaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7CkBAIC0xMTUwLDcgKzYzNSw3IEBACiAJICogdG8gZGVhY3RpdmF0ZSB0aGUgdUNvZGUgcXVldWUsIGp1c3QgcmV0dXJuICJzdWNjZXNzIiB0byBhbGxvdwogCSAqICBtYWM4MDIxMSB0byBjbGVhbiB1cCBpdCBvd24gZGF0YS4KIAkgKi8KLQlpd2xhZ25fdHhxX2FnZ19kaXNhYmxlKHByaXYsIHR4cV9pZCwgc3NuLCB0eF9maWZvX2lkKTsKKwl0cmFuc190eHFfYWdnX2Rpc2FibGUoJnByaXYtPnRyYW5zLCB0eHFfaWQsIHNzbiwgdHhfZmlmb19pZCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIHN0YS0+YWRkciwgdGlkKTsKQEAgLTExNzksNyArNjY0LDggQEAKIAkJCXUxNiBzc24gPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOwogCQkJaW50IHR4X2ZpZm8gPSBnZXRfZmlmb19mcm9tX3RpZChjdHgsIHRpZCk7CiAJCQlJV0xfREVCVUdfSFQocHJpdiwgIkhXIHF1ZXVlIGVtcHR5OiBjb250aW51ZSBERUxCQSBmbG93XG4iKTsKLQkJCWl3bGFnbl90eHFfYWdnX2Rpc2FibGUocHJpdiwgdHhxX2lkLCBzc24sIHR4X2ZpZm8pOworCQkJdHJhbnNfdHhxX2FnZ19kaXNhYmxlKCZwcml2LT50cmFucywgdHhxX2lkLAorCQkJCXNzbiwgdHhfZmlmbyk7CiAJCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0FHR19PRkY7CiAJCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKGN0eC0+dmlmLCBhZGRyLCB0aWQpOwogCQl9CkBAIC0xMjM2LDkgKzcyMiw5IEBACiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKIAogCWlmICgoaW5kZXggPj0gcS0+bl9iZCkgfHwgKGl3bF9xdWV1ZV91c2VkKHEsIGluZGV4KSA9PSAwKSkgewotCQlJV0xfRVJSKHByaXYsICJSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGluZGV4ICVkLCAiCi0JCQkgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwgdHhxX2lkLAotCQkJICBpbmRleCwgcS0+bl9iZCwgcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7CisJCUlXTF9FUlIocHJpdiwgIiVzOiBSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksICIKKwkJCSAgImluZGV4ICVkIGlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWQuXG4iLCBfX2Z1bmNfXywKKwkJCSAgdHhxX2lkLCBpbmRleCwgcS0+bl9iZCwgcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTI2MSw3ICs3NDcsNyBAQAogCiAJCWl3bGFnbl90eHFfaW52YWxfYnl0ZV9jbnRfdGJsKHByaXYsIHR4cSk7CiAKLQkJaXdsYWduX3R4cV9mcmVlX3RmZChwcml2LCB0eHEpOworCQlpd2xhZ25fdHhxX2ZyZWVfdGZkKHByaXYsIHR4cSwgdHhxLT5xLnJlYWRfcHRyKTsKIAl9CiAJcmV0dXJuIG5mcmVlZDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi11Y29kZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXVjb2RlLmMKaW5kZXggOTdkZTVkOS4uYTg5NWEwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXVjb2RlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXVjb2RlLmMKQEAgLTM5LDM4ICszOSw3IEBACiAjaW5jbHVkZSAiaXdsLWFnbi1ody5oIgogI2luY2x1ZGUgIml3bC1hZ24uaCIKICNpbmNsdWRlICJpd2wtYWduLWNhbGliLmgiCi0KLSNkZWZpbmUgSVdMX0FDX1VOU0VUIC0xCi0KLXN0cnVjdCBxdWV1ZV90b19maWZvX2FjIHsKLQlzOCBmaWZvLCBhYzsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcXVldWVfdG9fZmlmb19hYyBpd2xhZ25fZGVmYXVsdF9xdWV1ZV90b190eF9maWZvW10gPSB7Ci0JeyBJV0xfVFhfRklGT19WTywgSUVFRTgwMjExX0FDX1ZPLCB9LAotCXsgSVdMX1RYX0ZJRk9fVkksIElFRUU4MDIxMV9BQ19WSSwgfSwKLQl7IElXTF9UWF9GSUZPX0JFLCBJRUVFODAyMTFfQUNfQkUsIH0sCi0JeyBJV0xfVFhfRklGT19CSywgSUVFRTgwMjExX0FDX0JLLCB9LAotCXsgSVdMQUdOX0NNRF9GSUZPX05VTSwgSVdMX0FDX1VOU0VULCB9LAotCXsgSVdMX1RYX0ZJRk9fVU5VU0VELCBJV0xfQUNfVU5TRVQsIH0sCi0JeyBJV0xfVFhfRklGT19VTlVTRUQsIElXTF9BQ19VTlNFVCwgfSwKLQl7IElXTF9UWF9GSUZPX1VOVVNFRCwgSVdMX0FDX1VOU0VULCB9LAotCXsgSVdMX1RYX0ZJRk9fVU5VU0VELCBJV0xfQUNfVU5TRVQsIH0sCi0JeyBJV0xfVFhfRklGT19VTlVTRUQsIElXTF9BQ19VTlNFVCwgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcXVldWVfdG9fZmlmb19hYyBpd2xhZ25faXBhbl9xdWV1ZV90b190eF9maWZvW10gPSB7Ci0JeyBJV0xfVFhfRklGT19WTywgSUVFRTgwMjExX0FDX1ZPLCB9LAotCXsgSVdMX1RYX0ZJRk9fVkksIElFRUU4MDIxMV9BQ19WSSwgfSwKLQl7IElXTF9UWF9GSUZPX0JFLCBJRUVFODAyMTFfQUNfQkUsIH0sCi0JeyBJV0xfVFhfRklGT19CSywgSUVFRTgwMjExX0FDX0JLLCB9LAotCXsgSVdMX1RYX0ZJRk9fQktfSVBBTiwgSUVFRTgwMjExX0FDX0JLLCB9LAotCXsgSVdMX1RYX0ZJRk9fQkVfSVBBTiwgSUVFRTgwMjExX0FDX0JFLCB9LAotCXsgSVdMX1RYX0ZJRk9fVklfSVBBTiwgSUVFRTgwMjExX0FDX1ZJLCB9LAotCXsgSVdMX1RYX0ZJRk9fVk9fSVBBTiwgSUVFRTgwMjExX0FDX1ZPLCB9LAotCXsgSVdMX1RYX0ZJRk9fQkVfSVBBTiwgMiwgfSwKLQl7IElXTEFHTl9DTURfRklGT19OVU0sIElXTF9BQ19VTlNFVCwgfSwKLX07CisjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgaXdsX3dpbWF4X2NvZXhfZXZlbnRfZW50cnkgY3VfcHJpb3JpdGllc1tDT0VYX05VTV9PRl9FVkVOVFNdID0gewogCXtDT0VYX0NVX1VOQVNTT0NfSURMRV9SUCwgQ09FWF9DVV9VTkFTU09DX0lETEVfV1AsCkBAIC0xNDMsNyArMTEyLDcgQEAKIAkJRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0RJU0FCTEUJfAogCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9FTkRURkQpOwogCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIiVzIHVDb2RlIHNlY3Rpb24gYmVpbmcgbG9hZGVkLi4uXG4iLCBuYW1lKTsKKwlJV0xfREVCVUdfRlcocHJpdiwgIiVzIHVDb2RlIHNlY3Rpb24gYmVpbmcgbG9hZGVkLi4uXG4iLCBuYW1lKTsKIAlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChwcml2LT53YWl0X2NvbW1hbmRfcXVldWUsCiAJCQkJCXByaXYtPnVjb2RlX3dyaXRlX2NvbXBsZXRlLCA1ICogSFopOwogCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKSB7CkBAIC0xODMsMTAgKzE1Miw3IEBACiAJX19sZTE2ICp4dGFsX2NhbGliID0KIAkJKF9fbGUxNiAqKWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LCBFRVBST01fWFRBTCk7CiAKLQljbWQuaGRyLm9wX2NvZGUgPSBJV0xfUEhZX0NBTElCUkFURV9DUllTVEFMX0ZSUV9DTUQ7Ci0JY21kLmhkci5maXJzdF9ncm91cCA9IDA7Ci0JY21kLmhkci5ncm91cHNfbnVtID0gMTsKLQljbWQuaGRyLmRhdGFfdmFsaWQgPSAxOworCWl3bF9zZXRfY2FsaWJfaGRyKCZjbWQuaGRyLCBJV0xfUEhZX0NBTElCUkFURV9DUllTVEFMX0ZSUV9DTUQpOwogCWNtZC5jYXBfcGluMSA9IGxlMTZfdG9fY3B1KHh0YWxfY2FsaWJbMF0pOwogCWNtZC5jYXBfcGluMiA9IGxlMTZfdG9fY3B1KHh0YWxfY2FsaWJbMV0pOwogCXJldHVybiBpd2xfY2FsaWJfc2V0KCZwcml2LT5jYWxpYl9yZXN1bHRzW0lXTF9DQUxJQl9YVEFMXSwKQEAgLTE5NywxNyArMTYzLDE2IEBACiB7CiAJc3RydWN0IGl3bF9jYWxpYl90ZW1wZXJhdHVyZV9vZmZzZXRfY21kIGNtZDsKIAlfX2xlMTYgKm9mZnNldF9jYWxpYiA9Ci0JCShfX2xlMTYgKilpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgRUVQUk9NXzUwMDBfVEVNUEVSQVRVUkUpOwotCWNtZC5oZHIub3BfY29kZSA9IElXTF9QSFlfQ0FMSUJSQVRFX1RFTVBfT0ZGU0VUX0NNRDsKLQljbWQuaGRyLmZpcnN0X2dyb3VwID0gMDsKLQljbWQuaGRyLmdyb3Vwc19udW0gPSAxOwotCWNtZC5oZHIuZGF0YV92YWxpZCA9IDE7Ci0JY21kLnJhZGlvX3NlbnNvcl9vZmZzZXQgPSBsZTE2X3RvX2NwdShvZmZzZXRfY2FsaWJbMV0pOworCQkoX19sZTE2ICopaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIEVFUFJPTV9URU1QRVJBVFVSRSk7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWl3bF9zZXRfY2FsaWJfaGRyKCZjbWQuaGRyLCBJV0xfUEhZX0NBTElCUkFURV9URU1QX09GRlNFVF9DTUQpOworCW1lbWNweSgmY21kLnJhZGlvX3NlbnNvcl9vZmZzZXQsIG9mZnNldF9jYWxpYiwgc2l6ZW9mKG9mZnNldF9jYWxpYikpOwogCWlmICghKGNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0KSkKIAkJY21kLnJhZGlvX3NlbnNvcl9vZmZzZXQgPSBERUZBVUxUX1JBRElPX1NFTlNPUl9PRkZTRVQ7Ci0JY21kLnJlc2VydmVkID0gMDsKKwogCUlXTF9ERUJVR19DQUxJQihwcml2LCAiUmFkaW8gc2Vuc29yIG9mZnNldDogJWRcbiIsCi0JCQljbWQucmFkaW9fc2Vuc29yX29mZnNldCk7CisJCQlsZTE2X3RvX2NwdShjbWQucmFkaW9fc2Vuc29yX29mZnNldCkpOwogCXJldHVybiBpd2xfY2FsaWJfc2V0KCZwcml2LT5jYWxpYl9yZXN1bHRzW0lXTF9DQUxJQl9URU1QX09GRlNFVF0sCiAJCQkgICAgICh1OCAqKSZjbWQsIHNpemVvZihjbWQpKTsKIH0KQEAgLTIyNSw5ICsxOTAsMTAgQEAKIAljYWxpYl9jZmdfY21kLnVjZF9jYWxpYl9jZmcub25jZS5pc19lbmFibGUgPSBJV0xfQ0FMSUJfSU5JVF9DRkdfQUxMOwogCWNhbGliX2NmZ19jbWQudWNkX2NhbGliX2NmZy5vbmNlLnN0YXJ0ID0gSVdMX0NBTElCX0lOSVRfQ0ZHX0FMTDsKIAljYWxpYl9jZmdfY21kLnVjZF9jYWxpYl9jZmcub25jZS5zZW5kX3JlcyA9IElXTF9DQUxJQl9JTklUX0NGR19BTEw7Ci0JY2FsaWJfY2ZnX2NtZC51Y2RfY2FsaWJfY2ZnLmZsYWdzID0gSVdMX0NBTElCX0lOSVRfQ0ZHX0FMTDsKKwljYWxpYl9jZmdfY21kLnVjZF9jYWxpYl9jZmcuZmxhZ3MgPQorCQlJV0xfQ0FMSUJfQ0ZHX0ZMQUdfU0VORF9DT01QTEVURV9OVEZZX01TSzsKIAotCXJldHVybiBpd2xfc2VuZF9jbWQocHJpdiwgJmNtZCk7CisJcmV0dXJuIHRyYW5zX3NlbmRfY21kKCZwcml2LT50cmFucywgJmNtZCk7CiB9CiAKIHZvaWQgaXdsYWduX3J4X2NhbGliX3Jlc3VsdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCkBAIC0zMjUsNyArMjkxLDggQEAKIAkJLyogY29leGlzdGVuY2UgaXMgZGlzYWJsZWQgKi8KIAkJbWVtc2V0KCZjb2V4X2NtZCwgMCwgc2l6ZW9mKGNvZXhfY21kKSk7CiAJfQotCXJldHVybiBpd2xfc2VuZF9jbWRfcGR1KHByaXYsIENPRVhfUFJJT1JJVFlfVEFCTEVfQ01ELAorCXJldHVybiB0cmFuc19zZW5kX2NtZF9wZHUoJnByaXYtPnRyYW5zLAorCQkJCUNPRVhfUFJJT1JJVFlfVEFCTEVfQ01ELCBDTURfU1lOQywKIAkJCQlzaXplb2YoY29leF9jbWQpLCAmY29leF9jbWQpOwogfQogCkBAIC0zNTcsNyArMzI0LDggQEAKIAogCW1lbWNweShwcmlvX3RibF9jbWQucHJpb190YmwsIGl3bGFnbl9idF9wcmlvX3RibCwKIAkJc2l6ZW9mKGl3bGFnbl9idF9wcmlvX3RibCkpOwotCWlmIChpd2xfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX0JUX0NPRVhfUFJJT19UQUJMRSwKKwlpZiAodHJhbnNfc2VuZF9jbWRfcGR1KCZwcml2LT50cmFucywKKwkJCQlSRVBMWV9CVF9DT0VYX1BSSU9fVEFCTEUsIENNRF9TWU5DLAogCQkJCXNpemVvZihwcmlvX3RibF9jbWQpLCAmcHJpb190YmxfY21kKSkKIAkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNlbmQgQlQgcHJpbyB0YmwgY29tbWFuZFxuIik7CiB9CkBAIC0zNjksNyArMzM3LDggQEAKIAogCWVudl9jbWQuYWN0aW9uID0gYWN0aW9uOwogCWVudl9jbWQudHlwZSA9IHR5cGU7Ci0JcmV0ID0gaXdsX3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9CVF9DT0VYX1BST1RfRU5WLAorCXJldCA9IHRyYW5zX3NlbmRfY21kX3BkdSgmcHJpdi0+dHJhbnMsCisJCQkgICAgICAgUkVQTFlfQlRfQ09FWF9QUk9UX0VOViwgQ01EX1NZTkMsCiAJCQkgICAgICAgc2l6ZW9mKGVudl9jbWQpLCAmZW52X2NtZCk7CiAJaWYgKHJldCkKIAkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNlbmQgQlQgZW52IGNvbW1hbmRcbiIpOwpAQCAtMzc5LDEwOSArMzQ4LDkgQEAKIAogc3RhdGljIGludCBpd2xhZ25fYWxpdmVfbm90aWZ5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKLQljb25zdCBzdHJ1Y3QgcXVldWVfdG9fZmlmb19hYyAqcXVldWVfdG9fZmlmbzsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCXUzMiBhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGksIGNoYW47Ci0JdTMyIHJlZ192YWw7CiAJaW50IHJldDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlwcml2LT5zY2RfYmFzZV9hZGRyID0gaXdsX3JlYWRfcHJwaChwcml2LCBJV0xBR05fU0NEX1NSQU1fQkFTRV9BRERSKTsKLQlhID0gcHJpdi0+c2NkX2Jhc2VfYWRkciArIElXTEFHTl9TQ0RfQ09OVEVYVF9EQVRBX09GRlNFVDsKLQlmb3IgKDsgYSA8IHByaXYtPnNjZF9iYXNlX2FkZHIgKyBJV0xBR05fU0NEX1RYX1NUVFNfQklUTUFQX09GRlNFVDsKLQkJYSArPSA0KQotCQlpd2xfd3JpdGVfdGFyZ19tZW0ocHJpdiwgYSwgMCk7Ci0JZm9yICg7IGEgPCBwcml2LT5zY2RfYmFzZV9hZGRyICsgSVdMQUdOX1NDRF9UUkFOU0xBVEVfVEJMX09GRlNFVDsKLQkJYSArPSA0KQotCQlpd2xfd3JpdGVfdGFyZ19tZW0ocHJpdiwgYSwgMCk7Ci0JZm9yICg7IGEgPCBwcml2LT5zY2RfYmFzZV9hZGRyICsKLQkgICAgICAgSVdMQUdOX1NDRF9UUkFOU0xBVEVfVEJMX09GRlNFVF9RVUVVRShwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0pOyBhICs9IDQpCi0JCWl3bF93cml0ZV90YXJnX21lbShwcml2LCBhLCAwKTsKLQotCWl3bF93cml0ZV9wcnBoKHByaXYsIElXTEFHTl9TQ0RfRFJBTV9CQVNFX0FERFIsCi0JCSAgICAgICBwcml2LT5zY2RfYmNfdGJscy5kbWEgPj4gMTApOwotCi0JLyogRW5hYmxlIERNQSBjaGFubmVsICovCi0JZm9yIChjaGFuID0gMDsgY2hhbiA8IEZINTBfVENTUl9DSE5MX05VTSA7IGNoYW4rKykKLQkJaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNoYW4pLAotCQkJCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFIHwKLQkJCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRU5BQkxFKTsKLQotCS8qIFVwZGF0ZSBGSCBjaGlja2VuIGJpdHMgKi8KLQlyZWdfdmFsID0gaXdsX3JlYWRfZGlyZWN0MzIocHJpdiwgRkhfVFhfQ0hJQ0tFTl9CSVRTX1JFRyk7Ci0JaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX1RYX0NISUNLRU5fQklUU19SRUcsCi0JCQkgICByZWdfdmFsIHwgRkhfVFhfQ0hJQ0tFTl9CSVRTX1NDRF9BVVRPX1JFVFJZX0VOKTsKLQotCWl3bF93cml0ZV9wcnBoKHByaXYsIElXTEFHTl9TQ0RfUVVFVUVDSEFJTl9TRUwsCi0JCUlXTEFHTl9TQ0RfUVVFVUVDSEFJTl9TRUxfQUxMKHByaXYpKTsKLQlpd2xfd3JpdGVfcHJwaChwcml2LCBJV0xBR05fU0NEX0FHR1JfU0VMLCAwKTsKLQotCS8qIGluaXRpYXRlIHRoZSBxdWV1ZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBpKyspIHsKLQkJaXdsX3dyaXRlX3BycGgocHJpdiwgSVdMQUdOX1NDRF9RVUVVRV9SRFBUUihpKSwgMCk7Ci0JCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfV1JQVFIsIDAgfCAoaSA8PCA4KSk7Ci0JCWl3bF93cml0ZV90YXJnX21lbShwcml2LCBwcml2LT5zY2RfYmFzZV9hZGRyICsKLQkJCQlJV0xBR05fU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKGkpLCAwKTsKLQkJaXdsX3dyaXRlX3RhcmdfbWVtKHByaXYsIHByaXYtPnNjZF9iYXNlX2FkZHIgKwotCQkJCUlXTEFHTl9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQoaSkgKwotCQkJCXNpemVvZih1MzIpLAotCQkJCSgoU0NEX1dJTl9TSVpFIDw8Ci0JCQkJSVdMQUdOX1NDRF9RVUVVRV9DVFhfUkVHMl9XSU5fU0laRV9QT1MpICYKLQkJCQlJV0xBR05fU0NEX1FVRVVFX0NUWF9SRUcyX1dJTl9TSVpFX01TSykgfAotCQkJCSgoU0NEX0ZSQU1FX0xJTUlUIDw8Ci0JCQkJSVdMQUdOX1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MpICYKLQkJCQlJV0xBR05fU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX01TSykpOwotCX0KLQotCWl3bF93cml0ZV9wcnBoKHByaXYsIElXTEFHTl9TQ0RfSU5URVJSVVBUX01BU0ssCi0JCQlJV0xfTUFTSygwLCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0pKTsKLQotCS8qIEFjdGl2YXRlIGFsbCBUeCBETUEvRklGTyBjaGFubmVscyAqLwotCWl3bGFnbl90eHFfc2V0X3NjaGVkKHByaXYsIElXTF9NQVNLKDAsIDcpKTsKLQotCS8qIG1hcCBxdWV1ZXMgdG8gRklGT3MgKi8KLQlpZiAocHJpdi0+dmFsaWRfY29udGV4dHMgIT0gQklUKElXTF9SWE9OX0NUWF9CU1MpKQotCQlxdWV1ZV90b19maWZvID0gaXdsYWduX2lwYW5fcXVldWVfdG9fdHhfZmlmbzsKLQllbHNlCi0JCXF1ZXVlX3RvX2ZpZm8gPSBpd2xhZ25fZGVmYXVsdF9xdWV1ZV90b190eF9maWZvOwotCi0JaXdsYWduX3NldF93cl9wdHJzKHByaXYsIHByaXYtPmNtZF9xdWV1ZSwgMCk7Ci0KLQkvKiBtYWtlIHN1cmUgYWxsIHF1ZXVlIGFyZSBub3Qgc3RvcHBlZCAqLwotCW1lbXNldCgmcHJpdi0+cXVldWVfc3RvcHBlZFswXSwgMCwgc2l6ZW9mKHByaXYtPnF1ZXVlX3N0b3BwZWQpKTsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQlhdG9taWNfc2V0KCZwcml2LT5xdWV1ZV9zdG9wX2NvdW50W2ldLCAwKTsKLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkKLQkJY3R4LT5sYXN0X3R4X3JlamVjdGVkID0gZmFsc2U7Ci0KLQkvKiByZXNldCB0byAwIHRvIGVuYWJsZSBhbGwgdGhlIHF1ZXVlIGZpcnN0ICovCi0JcHJpdi0+dHhxX2N0eF9hY3RpdmVfbXNrID0gMDsKLQotCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGl3bGFnbl9kZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm8pICE9IDEwKTsKLQlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShpd2xhZ25faXBhbl9xdWV1ZV90b190eF9maWZvKSAhPSAxMCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlpbnQgZmlmbyA9IHF1ZXVlX3RvX2ZpZm9baV0uZmlmbzsKLQkJaW50IGFjID0gcXVldWVfdG9fZmlmb1tpXS5hYzsKLQotCQlpd2xfdHhxX2N0eF9hY3RpdmF0ZShwcml2LCBpKTsKLQotCQlpZiAoZmlmbyA9PSBJV0xfVFhfRklGT19VTlVTRUQpCi0JCQljb250aW51ZTsKLQotCQlpZiAoYWMgIT0gSVdMX0FDX1VOU0VUKQotCQkJaXdsX3NldF9zd3FfaWQoJnByaXYtPnR4cVtpXSwgYWMsIGkpOwotCQlpd2xhZ25fdHhfcXVldWVfc2V0X3N0YXR1cyhwcml2LCAmcHJpdi0+dHhxW2ldLCBmaWZvLCAwKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBFbmFibGUgTDEtQWN0aXZlICovCi0JaXdsX2NsZWFyX2JpdHNfcHJwaChwcml2LCBBUE1HX1BDSURFVl9TVFRfUkVHLAotCQkJICBBUE1HX1BDSURFVl9TVFRfVkFMX0wxX0FDVF9ESVMpOworCXRyYW5zX3R4X3N0YXJ0KCZwcml2LT50cmFucyk7CiAKIAlyZXQgPSBpd2xhZ25fc2VuZF93aW1heF9jb2V4KHByaXYpOwogCWlmIChyZXQpCkBAIC01MDgsNyArMzc3LDcgQEAKIAl1MzIgdmFsOwogCXUzMiBpOwogCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKKwlJV0xfREVCVUdfRlcocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMTAwLCBpbWFnZSArPSAxMDAvc2l6ZW9mKHUzMikpIHsKIAkJLyogcmVhZCBkYXRhIGNvbWVzIHRocm91Z2ggc2luZ2xlIHBvcnQsIGF1dG8taW5jciBhZGRyICovCkBAIC01MzMsNyArNDAyLDcgQEAKIAl1MzIgb2ZmczsKIAlpbnQgZXJyb3JzID0gMDsKIAotCUlXTF9ERUJVR19JTkZPKHByaXYsICJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7CisJSVdMX0RFQlVHX0ZXKHByaXYsICJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7CiAKIAlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwKIAkJCSAgIElXTEFHTl9SVENfSU5TVF9MT1dFUl9CT1VORCk7CkBAIC01NTksNyArNDI4LDcgQEAKIHN0YXRpYyBpbnQgaXdsX3ZlcmlmeV91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBmd19pbWcgKmltZykKIHsKIAlpZiAoIWl3bGNvcmVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsICZpbWctPmNvZGUpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJ1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7CisJCUlXTF9ERUJVR19GVyhwcml2LCAidUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTU4Myw3ICs0NTIsNyBAQAogCiAJcGFsaXZlID0gJnBrdC0+dS5hbGl2ZV9mcmFtZTsKIAotCUlXTF9ERUJVR19JTkZPKHByaXYsICJBbGl2ZSB1Y29kZSBzdGF0dXMgMHglMDhYIHJldmlzaW9uICIKKwlJV0xfREVCVUdfRlcocHJpdiwgIkFsaXZlIHVjb2RlIHN0YXR1cyAweCUwOFggcmV2aXNpb24gIgogCQkgICAgICAgIjB4JTAxWCAweCUwMVhcbiIsCiAJCSAgICAgICBwYWxpdmUtPmlzX3ZhbGlkLCBwYWxpdmUtPnZlcl90eXBlLAogCQkgICAgICAgcGFsaXZlLT52ZXJfc3VidHlwZSk7CkBAIC02MDIsMTQgKzQ3MSwxNCBAQAogCiBpbnQgaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkJIHN0cnVjdCBmd19pbWcgKmltYWdlLAotCQkJCSBpbnQgc3VidHlwZSwgaW50IGFsdGVybmF0ZV9zdWJ0eXBlKQorCQkJCSBlbnVtIGl3bGFnbl91Y29kZV90eXBlIHVjb2RlX3R5cGUpCiB7CiAJc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCBhbGl2ZV93YWl0OwogCXN0cnVjdCBpd2xhZ25fYWxpdmVfZGF0YSBhbGl2ZV9kYXRhOwogCWludCByZXQ7Ci0JZW51bSBpd2xhZ25fdWNvZGVfc3VidHlwZSBvbGRfdHlwZTsKKwllbnVtIGl3bGFnbl91Y29kZV90eXBlIG9sZF90eXBlOwogCi0JcmV0ID0gaXdsYWduX3N0YXJ0X2RldmljZShwcml2KTsKKwlyZXQgPSB0cmFuc19zdGFydF9kZXZpY2UoJnByaXYtPnRyYW5zKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC02MTcsNyArNDg2LDcgQEAKIAkJCQkgICAgICBpd2xhZ25fYWxpdmVfZm4sICZhbGl2ZV9kYXRhKTsKIAogCW9sZF90eXBlID0gcHJpdi0+dWNvZGVfdHlwZTsKLQlwcml2LT51Y29kZV90eXBlID0gc3VidHlwZTsKKwlwcml2LT51Y29kZV90eXBlID0gdWNvZGVfdHlwZTsKIAogCXJldCA9IGl3bGFnbl9sb2FkX2dpdmVuX3Vjb2RlKHByaXYsIGltYWdlKTsKIAlpZiAocmV0KSB7CkBAIC02MjYsOCArNDk1LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiBSZW1vdmUgYWxsIHJlc2V0cyB0byBhbGxvdyBOSUMgdG8gb3BlcmF0ZSAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9SRVNFVCwgMCk7CisJdHJhbnNfa2lja19uaWMoJnByaXYtPnRyYW5zKTsKIAogCS8qCiAJICogU29tZSB0aGluZ3MgbWF5IHJ1biBpbiB0aGUgYmFja2dyb3VuZCBub3csIGJ1dCB3ZQpAQCAtNjQ1LDI0ICs1MTMsMjIgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYgKGFsaXZlX2RhdGEuc3VidHlwZSAhPSBzdWJ0eXBlICYmCi0JICAgIGFsaXZlX2RhdGEuc3VidHlwZSAhPSBhbHRlcm5hdGVfc3VidHlwZSkgewotCQlJV0xfRVJSKHByaXYsCi0JCQkiTG9hZGVkIHVjb2RlIGlzIG5vdCBleHBlY3RlZCB0eXBlIChnb3QgJWQsIGV4cGVjdGVkICVkKSFcbiIsCi0JCQlhbGl2ZV9kYXRhLnN1YnR5cGUsIHN1YnR5cGUpOwotCQlwcml2LT51Y29kZV90eXBlID0gb2xkX3R5cGU7Ci0JCXJldHVybiAtRUlPOwotCX0KKwkvKgorCSAqIFRoaXMgc3RlcCB0YWtlcyBhIGxvbmcgdGltZSAoNjAtODBtcyEhKSBhbmQKKwkgKiBXb1dMQU4gaW1hZ2Ugc2hvdWxkIGJlIGxvYWRlZCBxdWlja2x5LCBzbworCSAqIHNraXAgaXQgZm9yIFdvV0xBTi4KKwkgKi8KKwlpZiAodWNvZGVfdHlwZSAhPSBJV0xfVUNPREVfV09XTEFOKSB7CisJCXJldCA9IGl3bF92ZXJpZnlfdWNvZGUocHJpdiwgaW1hZ2UpOworCQlpZiAocmV0KSB7CisJCQlwcml2LT51Y29kZV90eXBlID0gb2xkX3R5cGU7CisJCQlyZXR1cm4gcmV0OworCQl9CiAKLQlyZXQgPSBpd2xfdmVyaWZ5X3Vjb2RlKHByaXYsIGltYWdlKTsKLQlpZiAocmV0KSB7Ci0JCXByaXYtPnVjb2RlX3R5cGUgPSBvbGRfdHlwZTsKLQkJcmV0dXJuIHJldDsKKwkJLyogZGVsYXkgYSBiaXQgdG8gZ2l2ZSByZmtpbGwgdGltZSB0byBydW4gKi8KKwkJbXNsZWVwKDUpOwogCX0KIAotCS8qIGRlbGF5IGEgYml0IHRvIGdpdmUgcmZraWxsIHRpbWUgdG8gcnVuICovCi0JbXNsZWVwKDUpOwotCiAJcmV0ID0gaXdsYWduX2FsaXZlX25vdGlmeShwcml2KTsKIAlpZiAocmV0KSB7CiAJCUlXTF9XQVJOKHByaXYsCkBAIC02ODUsNyArNTUxLDcgQEAKIAlpZiAoIXByaXYtPnVjb2RlX2luaXQuY29kZS5sZW4pCiAJCXJldHVybiAwOwogCi0JaWYgKHByaXYtPnVjb2RlX3R5cGUgIT0gVUNPREVfU1VCVFlQRV9OT05FX0xPQURFRCkKKwlpZiAocHJpdi0+dWNvZGVfdHlwZSAhPSBJV0xfVUNPREVfTk9ORSkKIAkJcmV0dXJuIDA7CiAKIAlpd2xhZ25faW5pdF9ub3RpZmljYXRpb25fd2FpdChwcml2LCAmY2FsaWJfd2FpdCwKQEAgLTY5NCw3ICs1NjAsNyBAQAogCiAJLyogV2lsbCBhbHNvIHN0YXJ0IHRoZSBkZXZpY2UgKi8KIAlyZXQgPSBpd2xhZ25fbG9hZF91Y29kZV93YWl0X2FsaXZlKHByaXYsICZwcml2LT51Y29kZV9pbml0LAotCQkJCQkgICBVQ09ERV9TVUJUWVBFX0lOSVQsIC0xKTsKKwkJCQkJICAgSVdMX1VDT0RFX0lOSVQpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTcxNCw2ICs1ODAsNiBAQAogCWl3bGFnbl9yZW1vdmVfbm90aWZpY2F0aW9uKHByaXYsICZjYWxpYl93YWl0KTsKICBvdXQ6CiAJLyogV2hhdGV2ZXIgaGFwcGVuZWQsIHN0b3AgdGhlIGRldmljZSAqLwotCWl3bGFnbl9zdG9wX2RldmljZShwcml2KTsKKwl0cmFuc19zdG9wX2RldmljZSgmcHJpdi0+dHJhbnMpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCmluZGV4IGE2NjJhZGMuLmIwYWU0ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCkBAIC0yNiwxNCArMjYsOSBAQAogICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS1hc3BtLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTQ5LDggKzQ0LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCi0jZGVmaW5lIERSVl9OQU1FICAgICAgICAiaXdsYWduIgotCiAjaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgogI2luY2x1ZGUgIml3bC1kZXYuaCIKICNpbmNsdWRlICJpd2wtY29yZS5oIgpAQCAtNTksNyArNTIsOCBAQAogI2luY2x1ZGUgIml3bC1zdGEuaCIKICNpbmNsdWRlICJpd2wtYWduLWNhbGliLmgiCiAjaW5jbHVkZSAiaXdsLWFnbi5oIgotCisjaW5jbHVkZSAiaXdsLWJ1cy5oIgorI2luY2x1ZGUgIml3bC10cmFucy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtOTMsMTIgKzg3LDEwIEBACiB7CiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKIAotCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pIHsKLQkJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCQkJaWYgKGN0eC0+YWN0aXZlLnJ4X2NoYWluICE9IGN0eC0+c3RhZ2luZy5yeF9jaGFpbikKLQkJCQlpd2xjb3JlX2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JCX0KKwlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgeworCQlpd2xhZ25fc2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKKwkJaWYgKGN0eC0+YWN0aXZlLnJ4X2NoYWluICE9IGN0eC0+c3RhZ2luZy5yeF9jaGFpbikKKwkJCWl3bGFnbl9jb21taXRfcnhvbihwcml2LCBjdHgpOwogCX0KIH0KIApAQCAtMTM0LDcgKzEyNiw5IEBACiAJc3RydWN0IGl3bF90eF9iZWFjb25fY21kICp0eF9iZWFjb25fY21kOwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBSRVBMWV9UWF9CRUFDT04sCisJCS5mbGFncyA9IENNRF9TWU5DLAogCX07CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwogCXUzMiBmcmFtZV9zaXplOwogCXUzMiByYXRlX2ZsYWdzOwogCXUzMiByYXRlOwpAQCAtMTc1LDE0ICsxNjksMzEgQEAKIAkJCSAgIGZyYW1lX3NpemUpOwogCiAJLyogU2V0IHVwIHBhY2tldCByYXRlIGFuZCBmbGFncyAqLwotCXJhdGUgPSBpd2xfcmF0ZV9nZXRfbG93ZXN0X3BsY3AocHJpdiwgcHJpdi0+YmVhY29uX2N0eCk7CisJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IocHJpdi0+YmVhY29uX3NrYik7CisKKwkvKgorCSAqIExldCdzIHNldCB1cCB0aGUgcmF0ZSBhdCBsZWFzdCBzb21ld2hhdCBjb3JyZWN0bHk7CisJICogaXQgd2lsbCBjdXJyZW50bHkgbm90IGFjdHVhbGx5IGJlIHVzZWQgYnkgdGhlIHVDb2RlLAorCSAqIGl0IHVzZXMgdGhlIGJyb2FkY2FzdCBzdGF0aW9uJ3MgcmF0ZSBpbnN0ZWFkLgorCSAqLworCWlmIChpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeCA8IDAgfHwKKwkgICAgaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpCisJCXJhdGUgPSAwOworCWVsc2UKKwkJcmF0ZSA9IGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4OworCiAJcHJpdi0+bWdtdF90eF9hbnQgPSBpd2xfdG9nZ2xlX3R4X2FudChwcml2LCBwcml2LT5tZ210X3R4X2FudCwKIAkJCQkJICAgICAgcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCk7CiAJcmF0ZV9mbGFncyA9IGl3bF9hbnRfaWR4X3RvX2ZsYWdzKHByaXYtPm1nbXRfdHhfYW50KTsKLQlpZiAoKHJhdGUgPj0gSVdMX0ZJUlNUX0NDS19SQVRFKSAmJiAocmF0ZSA8PSBJV0xfTEFTVF9DQ0tfUkFURSkpCisKKwkvKiBJbiBtYWM4MDIxMSwgcmF0ZXMgZm9yIDUgR0h6IHN0YXJ0IGF0IDAgKi8KKwlpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlyYXRlICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7CisJZWxzZSBpZiAocmF0ZSA+PSBJV0xfRklSU1RfQ0NLX1JBVEUgJiYgcmF0ZSA8PSBJV0xfTEFTVF9DQ0tfUkFURSkKIAkJcmF0ZV9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOwotCXR4X2JlYWNvbl9jbWQtPnR4LnJhdGVfbl9mbGFncyA9IGl3bF9od19zZXRfcmF0ZV9uX2ZsYWdzKHJhdGUsCi0JCQlyYXRlX2ZsYWdzKTsKKworCXR4X2JlYWNvbl9jbWQtPnR4LnJhdGVfbl9mbGFncyA9CisJCQlpd2xfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlLCByYXRlX2ZsYWdzKTsKIAogCS8qIFN1Ym1pdCBjb21tYW5kICovCiAJY21kLmxlblswXSA9IHNpemVvZigqdHhfYmVhY29uX2NtZCk7CkBAIC0xOTIsNyArMjAzLDcgQEAKIAljbWQuZGF0YVsxXSA9IHByaXYtPmJlYWNvbl9za2ItPmRhdGE7CiAJY21kLmRhdGFmbGFnc1sxXSA9IElXTF9IQ01EX0RGTF9OT0NPUFk7CiAKLQlyZXR1cm4gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgJmNtZCk7CisJcmV0dXJuIHRyYW5zX3NlbmRfY21kKCZwcml2LT50cmFucywgJmNtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGl3bF9iZ19iZWFjb25fdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTI0NSw3ICsyNTYsNyBAQAogCS8qIGRvbnQgc2VuZCBob3N0IGNvbW1hbmQgaWYgcmYta2lsbCBpcyBvbiAqLwogCWlmICghaXdsX2lzX3JlYWR5X3JmKHByaXYpKQogCQlyZXR1cm47Ci0JcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNlbmRfYnRfY29uZmlnKHByaXYpOworCWl3bGFnbl9zZW5kX2FkdmFuY2VfYnRfY29uZmlnKHByaXYpOwogfQogCiBzdGF0aWMgdm9pZCBpd2xfYmdfYnRfZnVsbF9jb25jdXJyZW5jeShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0yNzIsMTIgKzI4MywxMSBAQAogCSAqIHRvIGF2b2lkIDMtd2lyZSBjb2xsaXNpb25zCiAJICovCiAJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCQlpd2xjb3JlX2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7CisJCWl3bGFnbl9zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOworCQlpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKIAl9CiAKLQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2VuZF9idF9jb25maWcocHJpdik7CisJaXdsYWduX3NlbmRfYWR2YW5jZV9idF9jb25maWcocHJpdik7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CkBAIC0zNjIsNyArMzcyLDcgQEAKIAl1MzIgbmV4dF9lbnRyeTsgLyogaW5kZXggb2YgbmV4dCBlbnRyeSB0byBiZSB3cml0dGVuIGJ5IHVDb2RlICovCiAKIAliYXNlID0gcHJpdi0+ZGV2aWNlX3BvaW50ZXJzLmVycm9yX2V2ZW50X3RhYmxlOwotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5pc192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7CisJaWYgKGl3bGFnbl9od192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7CiAJCWNhcGFjaXR5ID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSk7CiAJCW51bV93cmFwcyA9IGl3bF9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAoMiAqIHNpemVvZih1MzIpKSk7CiAJCW1vZGUgPSBpd2xfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgKDEgKiBzaXplb2YodTMyKSkpOwpAQCAtNDQwLDM4MyArNDUwLDggQEAKIAlpZiAoIWl3bF9pc19yZWFkeV9yZihwcml2KSkKIAkJcmV0dXJuOwogCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnR4Zmlmb19mbHVzaCkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZGV2aWNlIHJlcXVlc3Q6IGZsdXNoIGFsbCB0eCBmcmFtZXNcbiIpOwotCQlpd2xhZ25fZGV2X3R4Zmlmb19mbHVzaChwcml2LCBJV0xfRFJPUF9BTEwpOwotCX0KLX0KLQotLyoqCi0gKiBpd2xfcnhfaGFuZGxlIC0gTWFpbiBlbnRyeSBmdW5jdGlvbiBmb3IgcmVjZWl2aW5nIHJlc3BvbnNlcyBmcm9tIHVDb2RlCi0gKgotICogVXNlcyB0aGUgcHJpdi0+cnhfaGFuZGxlcnMgY2FsbGJhY2sgZnVuY3Rpb24gYXJyYXkgdG8gaW52b2tlCi0gKiB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlcnMsIGluY2x1ZGluZyBjb21tYW5kIHJlc3BvbnNlcywKLSAqIGZyYW1lLXJlY2VpdmVkIG5vdGlmaWNhdGlvbnMsIGFuZCBvdGhlciBub3RpZmljYXRpb25zLgotICovCi1zdGF0aWMgdm9pZCBpd2xfcnhfaGFuZGxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YjsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0OwotCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7Ci0JdTMyIHIsIGk7Ci0JaW50IHJlY2xhaW07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCBmaWxsX3J4ID0gMDsKLQl1MzIgY291bnQgPSA4OwotCWludCB0b3RhbF9lbXB0eTsKLQotCS8qIHVDb2RlJ3MgcmVhZCBpbmRleCAoc3RvcmVkIGluIHNoYXJlZCBEUkFNKSBpbmRpY2F0ZXMgdGhlIGxhc3QgUngKLQkgKiBidWZmZXIgdGhhdCB0aGUgZHJpdmVyIG1heSBwcm9jZXNzIChsYXN0IGJ1ZmZlciBmaWxsZWQgYnkgdWNvZGUpLiAqLwotCXIgPSBsZTE2X3RvX2NwdShyeHEtPnJiX3N0dHMtPmNsb3NlZF9yYl9udW0pICYgIDB4MEZGRjsKLQlpID0gcnhxLT5yZWFkOwotCi0JLyogUnggaW50ZXJydXB0LCBidXQgbm90aGluZyBzZW50IGZyb20gdUNvZGUgKi8KLQlpZiAoaSA9PSByKQotCQlJV0xfREVCVUdfUlgocHJpdiwgInIgPSAlZCwgaSA9ICVkXG4iLCByLCBpKTsKLQotCS8qIGNhbGN1bGF0ZSB0b3RhbCBmcmFtZXMgbmVlZCB0byBiZSByZXN0b2NrIGFmdGVyIGhhbmRsaW5nIFJYICovCi0JdG90YWxfZW1wdHkgPSByIC0gcnhxLT53cml0ZV9hY3R1YWw7Ci0JaWYgKHRvdGFsX2VtcHR5IDwgMCkKLQkJdG90YWxfZW1wdHkgKz0gUlhfUVVFVUVfU0laRTsKLQotCWlmICh0b3RhbF9lbXB0eSA+IChSWF9RVUVVRV9TSVpFIC8gMikpCi0JCWZpbGxfcnggPSAxOwotCi0Jd2hpbGUgKGkgIT0gcikgewotCQlpbnQgbGVuOwotCi0JCXJ4YiA9IHJ4cS0+cXVldWVbaV07Ci0KLQkJLyogSWYgYW4gUlhCIGRvZXNuJ3QgaGF2ZSBhIFJ4IHF1ZXVlIHNsb3QgYXNzb2NpYXRlZCB3aXRoIGl0LAotCQkgKiB0aGVuIGEgYnVnIGhhcyBiZWVuIGludHJvZHVjZWQgaW4gdGhlIHF1ZXVlIHJlZmlsbGluZwotCQkgKiByb3V0aW5lcyAtLSBjYXRjaCBpdCBoZXJlICovCi0JCWlmIChXQVJOX09OKHJ4YiA9PSBOVUxMKSkgewotCQkJaSA9IChpICsgMSkgJiBSWF9RVUVVRV9NQVNLOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlyeHEtPnF1ZXVlW2ldID0gTlVMTDsKLQotCQlwY2lfdW5tYXBfcGFnZShwcml2LT5wY2lfZGV2LCByeGItPnBhZ2VfZG1hLAotCQkJICAgICAgIFBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQlwa3QgPSByeGJfYWRkcihyeGIpOwotCi0JCWxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgRkhfUlNDU1JfRlJBTUVfU0laRV9NU0s7Ci0JCWxlbiArPSBzaXplb2YodTMyKTsgLyogYWNjb3VudCBmb3Igc3RhdHVzIHdvcmQgKi8KLQkJdHJhY2VfaXdsd2lmaV9kZXZfcngocHJpdiwgcGt0LCBsZW4pOwotCi0JCS8qIFJlY2xhaW0gYSBjb21tYW5kIGJ1ZmZlciBvbmx5IGlmIHRoaXMgcGFja2V0IGlzIGEgcmVzcG9uc2UKLQkJICogICB0byBhIChkcml2ZXItb3JpZ2luYXRlZCkgY29tbWFuZC4KLQkJICogSWYgdGhlIHBhY2tldCAoZS5nLiBSeCBmcmFtZSkgb3JpZ2luYXRlZCBmcm9tIHVDb2RlLAotCQkgKiAgIHRoZXJlIGlzIG5vIGNvbW1hbmQgYnVmZmVyIHRvIHJlY2xhaW0uCi0JCSAqIFVjb2RlIHNob3VsZCBzZXQgU0VRX1JYX0ZSQU1FIGJpdCBpZiB1Y29kZS1vcmlnaW5hdGVkLAotCQkgKiAgIGJ1dCBhcHBhcmVudGx5IGEgZmV3IGRvbid0IGdldCBzZXQ7IGNhdGNoIHRoZW0gaGVyZS4gKi8KLQkJcmVjbGFpbSA9ICEocGt0LT5oZHIuc2VxdWVuY2UgJiBTRVFfUlhfRlJBTUUpICYmCi0JCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1JYX1BIWV9DTUQpICYmCi0JCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1JYKSAmJgotCQkJKHBrdC0+aGRyLmNtZCAhPSBSRVBMWV9SWF9NUERVX0NNRCkgJiYKLQkJCShwa3QtPmhkci5jbWQgIT0gUkVQTFlfQ09NUFJFU1NFRF9CQSkgJiYKLQkJCShwa3QtPmhkci5jbWQgIT0gU1RBVElTVElDU19OT1RJRklDQVRJT04pICYmCi0JCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1RYKTsKLQotCQkvKgotCQkgKiBEbyB0aGUgbm90aWZpY2F0aW9uIHdhaXQgYmVmb3JlIFJYIGhhbmRsZXJzIHNvCi0JCSAqIGV2ZW4gaWYgdGhlIFJYIGhhbmRsZXIgY29uc3VtZXMgdGhlIFJYQiB3ZSBoYXZlCi0JCSAqIGFjY2VzcyB0byBpdCBpbiB0aGUgbm90aWZpY2F0aW9uIHdhaXQgZW50cnkuCi0JCSAqLwotCQlpZiAoIWxpc3RfZW1wdHkoJnByaXYtPl9hZ24ubm90aWZfd2FpdHMpKSB7Ci0JCQlzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3OwotCi0JCQlzcGluX2xvY2soJnByaXYtPl9hZ24ubm90aWZfd2FpdF9sb2NrKTsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnByaXYtPl9hZ24ubm90aWZfd2FpdHMsIGxpc3QpIHsKLQkJCQlpZiAody0+Y21kID09IHBrdC0+aGRyLmNtZCkgewotCQkJCQl3LT50cmlnZ2VyZWQgPSB0cnVlOwotCQkJCQlpZiAody0+Zm4pCi0JCQkJCQl3LT5mbihwcml2LCBwa3QsIHctPmZuX2RhdGEpOwotCQkJCX0KLQkJCX0KLQkJCXNwaW5fdW5sb2NrKCZwcml2LT5fYWduLm5vdGlmX3dhaXRfbG9jayk7Ci0KLQkJCXdha2VfdXBfYWxsKCZwcml2LT5fYWduLm5vdGlmX3dhaXRxKTsKLQkJfQotCQlpZiAocHJpdi0+cHJlX3J4X2hhbmRsZXIpCi0JCQlwcml2LT5wcmVfcnhfaGFuZGxlcihwcml2LCByeGIpOwotCi0JCS8qIEJhc2VkIG9uIHR5cGUgb2YgY29tbWFuZCByZXNwb25zZSBvciBub3RpZmljYXRpb24sCi0JCSAqICAgaGFuZGxlIHRob3NlIHRoYXQgbmVlZCBoYW5kbGluZyB2aWEgZnVuY3Rpb24gaW4KLQkJICogICByeF9oYW5kbGVycyB0YWJsZS4gIFNlZSBpd2xfc2V0dXBfcnhfaGFuZGxlcnMoKSAqLwotCQlpZiAocHJpdi0+cnhfaGFuZGxlcnNbcGt0LT5oZHIuY21kXSkgewotCQkJSVdMX0RFQlVHX1JYKHByaXYsICJyID0gJWQsIGkgPSAlZCwgJXMsIDB4JTAyeFxuIiwgciwKLQkJCQlpLCBnZXRfY21kX3N0cmluZyhwa3QtPmhkci5jbWQpLCBwa3QtPmhkci5jbWQpOwotCQkJcHJpdi0+aXNyX3N0YXRzLnJ4X2hhbmRsZXJzW3BrdC0+aGRyLmNtZF0rKzsKLQkJCXByaXYtPnJ4X2hhbmRsZXJzW3BrdC0+aGRyLmNtZF0gKHByaXYsIHJ4Yik7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBObyBoYW5kbGluZyBuZWVkZWQgKi8KLQkJCUlXTF9ERUJVR19SWChwcml2LAotCQkJCSJyICVkIGkgJWQgTm8gaGFuZGxlciBuZWVkZWQgZm9yICVzLCAweCUwMnhcbiIsCi0JCQkJciwgaSwgZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSwKLQkJCQlwa3QtPmhkci5jbWQpOwotCQl9Ci0KLQkJLyoKLQkJICogWFhYOiBBZnRlciBoZXJlLCB3ZSBzaG91bGQgYWx3YXlzIGNoZWNrIHJ4Yi0+cGFnZQotCQkgKiBhZ2FpbnN0IE5VTEwgYmVmb3JlIHRvdWNoaW5nIGl0IG9yIGl0cyB2aXJ0dWFsCi0JCSAqIG1lbW9yeSAocGt0KS4gQmVjYXVzZSBzb21lIHJ4X2hhbmRsZXIgbWlnaHQgaGF2ZQotCQkgKiBhbHJlYWR5IHRha2VuIG9yIGZyZWVkIHRoZSBwYWdlcy4KLQkJICovCi0KLQkJaWYgKHJlY2xhaW0pIHsKLQkJCS8qIEludm9rZSBhbnkgY2FsbGJhY2tzLCB0cmFuc2ZlciB0aGUgYnVmZmVyIHRvIGNhbGxlciwKLQkJCSAqIGFuZCBmaXJlIG9mZiB0aGUgKHBvc3NpYmx5KSBibG9ja2luZyBpd2xfc2VuZF9jbWQoKQotCQkJICogYXMgd2UgcmVjbGFpbSB0aGUgZHJpdmVyIGNvbW1hbmQgcXVldWUgKi8KLQkJCWlmIChyeGItPnBhZ2UpCi0JCQkJaXdsX3R4X2NtZF9jb21wbGV0ZShwcml2LCByeGIpOwotCQkJZWxzZQotCQkJCUlXTF9XQVJOKHByaXYsICJDbGFpbSBudWxsIHJ4Yj9cbiIpOwotCQl9Ci0KLQkJLyogUmV1c2UgdGhlIHBhZ2UgaWYgcG9zc2libGUuIEZvciBub3RpZmljYXRpb24gcGFja2V0cyBhbmQKLQkJICogU0tCcyB0aGF0IGZhaWwgdG8gUnggY29ycmVjdGx5LCBhZGQgdGhlbSBiYWNrIGludG8gdGhlCi0JCSAqIHJ4X2ZyZWUgbGlzdCBmb3IgcmV1c2UgbGF0ZXIuICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKHJ4Yi0+cGFnZSAhPSBOVUxMKSB7Ci0JCQlyeGItPnBhZ2VfZG1hID0gcGNpX21hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4Yi0+cGFnZSwKLQkJCQkwLCBQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7Ci0JCQlyeHEtPmZyZWVfY291bnQrKzsKLQkJfSBlbHNlCi0JCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X3VzZWQpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWkgPSAoaSArIDEpICYgUlhfUVVFVUVfTUFTSzsKLQkJLyogSWYgdGhlcmUgYXJlIGEgbG90IG9mIHVudXNlZCBmcmFtZXMsCi0JCSAqIHJlc3RvY2sgdGhlIFJ4IHF1ZXVlIHNvIHVjb2RlIHdvbnQgYXNzZXJ0LiAqLwotCQlpZiAoZmlsbF9yeCkgewotCQkJY291bnQrKzsKLQkJCWlmIChjb3VudCA+PSA4KSB7Ci0JCQkJcnhxLT5yZWFkID0gaTsKLQkJCQlpd2xhZ25fcnhfcmVwbGVuaXNoX25vdyhwcml2KTsKLQkJCQljb3VudCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBCYWNrdHJhY2sgb25lIGVudHJ5ICovCi0JcnhxLT5yZWFkID0gaTsKLQlpZiAoZmlsbF9yeCkKLQkJaXdsYWduX3J4X3JlcGxlbmlzaF9ub3cocHJpdik7Ci0JZWxzZQotCQlpd2xhZ25fcnhfcXVldWVfcmVzdG9jayhwcml2KTsKLX0KLQotLyogdGFza2xldCBmb3IgaXdsYWduIGludGVycnVwdCAqLwotc3RhdGljIHZvaWQgaXdsX2lycV90YXNrbGV0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MzIgaW50YSA9IDA7Ci0JdTMyIGhhbmRsZWQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKLQl1MzIgaW50YV9tYXNrOwotI2VuZGlmCi0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQWNrL2NsZWFyL3Jlc2V0IHBlbmRpbmcgdUNvZGUgaW50ZXJydXB0cy4KLQkgKiBOb3RlOiAgU29tZSBiaXRzIGluIENTUl9JTlQgYXJlICJPUiIgb2YgYml0cyBpbiBDU1JfRkhfSU5UX1NUQVRVUywKLQkgKi8KLQkvKiBUaGVyZSBpcyBhIGhhcmR3YXJlIGJ1ZyBpbiB0aGUgaW50ZXJydXB0IG1hc2sgZnVuY3Rpb24gdGhhdCBzb21lCi0JICogaW50ZXJydXB0cyAoaS5lLiBDU1JfSU5UX0JJVF9TQ0QpIGNhbiBzdGlsbCBiZSBnZW5lcmF0ZWQgZXZlbiBpZgotCSAqIHRoZXkgYXJlIGRpc2FibGVkIGluIHRoZSBDU1JfSU5UX01BU0sgcmVnaXN0ZXIuIEZ1cnRoZXJtb3JlIHRoZQotCSAqIElDVCBpbnRlcnJ1cHQgaGFuZGxpbmcgbWVjaGFuaXNtIGhhcyBhbm90aGVyIGJ1ZyB0aGF0IG1pZ2h0IGNhdXNlCi0JICogdGhlc2UgdW5tYXNrZWQgaW50ZXJydXB0cyBmYWlsIHRvIGJlIGRldGVjdGVkLiBXZSB3b3JrYXJvdW5kIHRoZQotCSAqIGhhcmR3YXJlIGJ1Z3MgaGVyZSBieSBBQ0tpbmcgYWxsIHRoZSBwb3NzaWJsZSBpbnRlcnJ1cHRzIHNvIHRoYXQKLQkgKiBpbnRlcnJ1cHQgY29hbGVzY2luZyBjYW4gc3RpbGwgYmUgYWNoaWV2ZWQuCi0JICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVCwgcHJpdi0+X2Fnbi5pbnRhIHwgfnByaXYtPmludGFfbWFzayk7Ci0KLQlpbnRhID0gcHJpdi0+X2Fnbi5pbnRhOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKLQlpZiAoaXdsX2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIElXTF9ETF9JU1IpIHsKLQkJLyoganVzdCBmb3IgZGVidWcgKi8KLQkJaW50YV9tYXNrID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UX01BU0spOwotCQlJV0xfREVCVUdfSVNSKHByaXYsICJpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHhcbiAiLAotCQkJCWludGEsIGludGFfbWFzayk7Ci0JfQotI2VuZGlmCi0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBzYXZlZCBpbnRlcnJ1cHQgaW4gaW50YSB2YXJpYWJsZSBub3cgd2UgY2FuIHJlc2V0IHByaXYtPl9hZ24uaW50YSAqLwotCXByaXYtPl9hZ24uaW50YSA9IDA7Ci0KLQkvKiBOb3cgc2VydmljZSBhbGwgaW50ZXJydXB0IGJpdHMgZGlzY292ZXJlZCBhYm92ZS4gKi8KLQlpZiAoaW50YSAmIENTUl9JTlRfQklUX0hXX0VSUikgewotCQlJV0xfRVJSKHByaXYsICJIYXJkd2FyZSBlcnJvciBkZXRlY3RlZC4gIFJlc3RhcnRpbmcuXG4iKTsKLQotCQkvKiBUZWxsIHRoZSBkZXZpY2UgdG8gc3RvcCBzZW5kaW5nIGludGVycnVwdHMgKi8KLQkJaXdsX2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQotCQlwcml2LT5pc3Jfc3RhdHMuaHcrKzsKLQkJaXdsX2lycV9oYW5kbGVfZXJyb3IocHJpdik7Ci0KLQkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9IV19FUlI7Ci0KLQkJcmV0dXJuOwotCX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCi0JaWYgKGl3bF9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiAoSVdMX0RMX0lTUikpIHsKLQkJLyogTklDIGZpcmVzIHRoaXMsIGJ1dCB3ZSBkb24ndCB1c2UgaXQsIHJlZHVuZGFudCB3aXRoIFdBS0VVUCAqLwotCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1NDRCkgewotCQkJSVdMX0RFQlVHX0lTUihwcml2LCAiU2NoZWR1bGVyIGZpbmlzaGVkIHRvIHRyYW5zbWl0ICIKLQkJCQkgICAgICAidGhlIGZyYW1lL2ZyYW1lcy5cbiIpOwotCQkJcHJpdi0+aXNyX3N0YXRzLnNjaCsrOwotCQl9Ci0KLQkJLyogQWxpdmUgbm90aWZpY2F0aW9uIHZpYSBSeCBpbnRlcnJ1cHQgd2lsbCBkbyB0aGUgcmVhbCB3b3JrICovCi0JCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfQUxJVkUpIHsKLQkJCUlXTF9ERUJVR19JU1IocHJpdiwgIkFsaXZlIGludGVycnVwdFxuIik7Ci0JCQlwcml2LT5pc3Jfc3RhdHMuYWxpdmUrKzsKLQkJfQotCX0KLSNlbmRpZgotCS8qIFNhZmVseSBpZ25vcmUgdGhlc2UgYml0cyBmb3IgZGVidWcgY2hlY2tzIGJlbG93ICovCi0JaW50YSAmPSB+KENTUl9JTlRfQklUX1NDRCB8IENTUl9JTlRfQklUX0FMSVZFKTsKLQotCS8qIEhXIFJGIEtJTEwgc3dpdGNoIHRvZ2dsZWQgKi8KLQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1JGX0tJTEwpIHsKLQkJaW50IGh3X3JmX2tpbGwgPSAwOwotCQlpZiAoIShpd2xfcmVhZDMyKHByaXYsIENTUl9HUF9DTlRSTCkgJgotCQkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKSkKLQkJCWh3X3JmX2tpbGwgPSAxOwotCi0JCUlXTF9XQVJOKHByaXYsICJSRl9LSUxMIGJpdCB0b2dnbGVkIHRvICVzLlxuIiwKLQkJCQlod19yZl9raWxsID8gImRpc2FibGUgcmFkaW8iIDogImVuYWJsZSByYWRpbyIpOwotCi0JCXByaXYtPmlzcl9zdGF0cy5yZmtpbGwrKzsKLQotCQkvKiBkcml2ZXIgb25seSBsb2FkcyB1Y29kZSBvbmNlIHNldHRpbmcgdGhlIGludGVyZmFjZSB1cC4KLQkJICogdGhlIGRyaXZlciBhbGxvd3MgbG9hZGluZyB0aGUgdWNvZGUgZXZlbiBpZiB0aGUgcmFkaW8KLQkJICogaXMga2lsbGVkLiBIZW5jZSB1cGRhdGUgdGhlIGtpbGxzd2l0Y2ggc3RhdGUgaGVyZS4gVGhlCi0JCSAqIHJma2lsbCBoYW5kbGVyIHdpbGwgY2FyZSBhYm91dCByZXN0YXJ0aW5nIGlmIG5lZWRlZC4KLQkJICovCi0JCWlmICghdGVzdF9iaXQoU1RBVFVTX0FMSVZFLCAmcHJpdi0+c3RhdHVzKSkgewotCQkJaWYgKGh3X3JmX2tpbGwpCi0JCQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JCQllbHNlCi0JCQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQkJCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUocHJpdi0+aHctPndpcGh5LCBod19yZl9raWxsKTsKLQkJfQotCi0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfUkZfS0lMTDsKLQl9Ci0KLQkvKiBDaGlwIGdvdCB0b28gaG90IGFuZCBzdG9wcGVkIGl0c2VsZiAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfQ1RfS0lMTCkgewotCQlJV0xfRVJSKHByaXYsICJNaWNyb2NvZGUgQ1Qga2lsbCBlcnJvciBkZXRlY3RlZC5cbiIpOwotCQlwcml2LT5pc3Jfc3RhdHMuY3RraWxsKys7Ci0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfQ1RfS0lMTDsKLQl9Ci0KLQkvKiBFcnJvciBkZXRlY3RlZCBieSB1Q29kZSAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfU1dfRVJSKSB7Ci0JCUlXTF9FUlIocHJpdiwgIk1pY3JvY29kZSBTVyBlcnJvciBkZXRlY3RlZC4gIgotCQkJIiBSZXN0YXJ0aW5nIDB4JVguXG4iLCBpbnRhKTsKLQkJcHJpdi0+aXNyX3N0YXRzLnN3Kys7Ci0JCWl3bF9pcnFfaGFuZGxlX2Vycm9yKHByaXYpOwotCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX1NXX0VSUjsKLQl9Ci0KLQkvKiB1Q29kZSB3YWtlcyB1cCBhZnRlciBwb3dlci1kb3duIHNsZWVwICovCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9XQUtFVVApIHsKLQkJSVdMX0RFQlVHX0lTUihwcml2LCAiV2FrZXVwIGludGVycnVwdFxuIik7Ci0JCWl3bF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHByaXYsICZwcml2LT5yeHEpOwotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBpKyspCi0JCQlpd2xfdHhxX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgJnByaXYtPnR4cVtpXSk7Ci0KLQkJcHJpdi0+aXNyX3N0YXRzLndha2V1cCsrOwotCi0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfV0FLRVVQOwotCX0KLQotCS8qIEFsbCB1Q29kZSBjb21tYW5kIHJlc3BvbnNlcywgaW5jbHVkaW5nIFR4IGNvbW1hbmQgcmVzcG9uc2VzLAotCSAqIFJ4ICJyZXNwb25zZXMiIChmcmFtZS1yZWNlaXZlZCBub3RpZmljYXRpb24pLCBhbmQgb3RoZXIKLQkgKiBub3RpZmljYXRpb25zIGZyb20gdUNvZGUgY29tZSB0aHJvdWdoIGhlcmUqLwotCWlmIChpbnRhICYgKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlggfAotCQkJQ1NSX0lOVF9CSVRfUlhfUEVSSU9ESUMpKSB7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwgIlJ4IGludGVycnVwdFxuIik7Ci0JCWlmIChpbnRhICYgKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlgpKSB7Ci0JCQloYW5kbGVkIHw9IChDU1JfSU5UX0JJVF9GSF9SWCB8IENTUl9JTlRfQklUX1NXX1JYKTsKLQkJCWl3bF93cml0ZTMyKHByaXYsIENTUl9GSF9JTlRfU1RBVFVTLAotCQkJCQlDU1JfRkhfSU5UX1JYX01BU0spOwotCQl9Ci0JCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfUlhfUEVSSU9ESUMpIHsKLQkJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfUlhfUEVSSU9ESUM7Ci0JCQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCBDU1JfSU5UX0JJVF9SWF9QRVJJT0RJQyk7Ci0JCX0KLQkJLyogU2VuZGluZyBSWCBpbnRlcnJ1cHQgcmVxdWlyZSBtYW55IHN0ZXBzIHRvIGJlIGRvbmUgaW4gdGhlCi0JCSAqIHRoZSBkZXZpY2U6Ci0JCSAqIDEtIHdyaXRlIGludGVycnVwdCB0byBjdXJyZW50IGluZGV4IGluIElDVCB0YWJsZS4KLQkJICogMi0gZG1hIFJYIGZyYW1lLgotCQkgKiAzLSB1cGRhdGUgUlggc2hhcmVkIGRhdGEgdG8gaW5kaWNhdGUgbGFzdCB3cml0ZSBpbmRleC4KLQkJICogNC0gc2VuZCBpbnRlcnJ1cHQuCi0JCSAqIFRoaXMgY291bGQgbGVhZCB0byBSWCByYWNlLCBkcml2ZXIgY291bGQgcmVjZWl2ZSBSWCBpbnRlcnJ1cHQKLQkJICogYnV0IHRoZSBzaGFyZWQgZGF0YSBjaGFuZ2VzIGRvZXMgbm90IHJlZmxlY3QgdGhpczsKLQkJICogcGVyaW9kaWMgaW50ZXJydXB0IHdpbGwgZGV0ZWN0IGFueSBkYW5nbGluZyBSeCBhY3Rpdml0eS4KLQkJICovCi0KLQkJLyogRGlzYWJsZSBwZXJpb2RpYyBpbnRlcnJ1cHQ7IHdlIHVzZSBpdCBhcyBqdXN0IGEgb25lLXNob3QuICovCi0JCWl3bF93cml0ZTgocHJpdiwgQ1NSX0lOVF9QRVJJT0RJQ19SRUcsCi0JCQkgICAgQ1NSX0lOVF9QRVJJT0RJQ19ESVMpOwotCQlpd2xfcnhfaGFuZGxlKHByaXYpOwotCi0JCS8qCi0JCSAqIEVuYWJsZSBwZXJpb2RpYyBpbnRlcnJ1cHQgaW4gOCBtc2VjIG9ubHkgaWYgd2UgcmVjZWl2ZWQKLQkJICogcmVhbCBSWCBpbnRlcnJ1cHQgKGluc3RlYWQgb2YganVzdCBwZXJpb2RpYyBpbnQpLCB0byBjYXRjaAotCQkgKiBhbnkgZGFuZ2xpbmcgUnggaW50ZXJydXB0LiAgSWYgaXQgd2FzIGp1c3QgdGhlIHBlcmlvZGljCi0JCSAqIGludGVycnVwdCwgdGhlcmUgd2FzIG5vIGRhbmdsaW5nIFJ4IGFjdGl2aXR5LCBhbmQgbm8gbmVlZAotCQkgKiB0byBleHRlbmQgdGhlIHBlcmlvZGljIGludGVycnVwdDsgb25lLXNob3QgaXMgZW5vdWdoLgotCQkgKi8KLQkJaWYgKGludGEgJiAoQ1NSX0lOVF9CSVRfRkhfUlggfCBDU1JfSU5UX0JJVF9TV19SWCkpCi0JCQlpd2xfd3JpdGU4KHByaXYsIENTUl9JTlRfUEVSSU9ESUNfUkVHLAotCQkJCSAgICBDU1JfSU5UX1BFUklPRElDX0VOQSk7Ci0KLQkJcHJpdi0+aXNyX3N0YXRzLnJ4Kys7Ci0JfQotCi0JLyogVGhpcyAiVHgiIERNQSBjaGFubmVsIGlzIHVzZWQgb25seSBmb3IgbG9hZGluZyB1Q29kZSAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfRkhfVFgpIHsKLQkJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0ZIX0lOVF9TVEFUVVMsIENTUl9GSF9JTlRfVFhfTUFTSyk7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwgInVDb2RlIGxvYWQgaW50ZXJydXB0XG4iKTsKLQkJcHJpdi0+aXNyX3N0YXRzLnR4Kys7Ci0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfRkhfVFg7Ci0JCS8qIFdha2UgdXAgdUNvZGUgbG9hZCByb3V0aW5lLCBub3cgdGhhdCBsb2FkIGlzIGNvbXBsZXRlICovCi0JCXByaXYtPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOwotCX0KLQotCWlmIChpbnRhICYgfmhhbmRsZWQpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5oYW5kbGVkIElOVEEgYml0cyAweCUwOHhcbiIsIGludGEgJiB+aGFuZGxlZCk7Ci0JCXByaXYtPmlzcl9zdGF0cy51bmhhbmRsZWQrKzsKLQl9Ci0KLQlpZiAoaW50YSAmIH4ocHJpdi0+aW50YV9tYXNrKSkgewotCQlJV0xfV0FSTihwcml2LCAiRGlzYWJsZWQgSU5UQSBiaXRzIDB4JTA4eCB3ZXJlIHBlbmRpbmdcbiIsCi0JCQkgaW50YSAmIH5wcml2LT5pbnRhX21hc2spOwotCX0KLQotCS8qIFJlLWVuYWJsZSBhbGwgaW50ZXJydXB0cyAqLwotCS8qIG9ubHkgUmUtZW5hYmxlIGlmIGRpc2FibGVkIGJ5IGlycSAqLwotCWlmICh0ZXN0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZwcml2LT5zdGF0dXMpKQotCQlpd2xfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0JLyogUmUtZW5hYmxlIFJGX0tJTEwgaWYgaXQgb2NjdXJyZWQgKi8KLQllbHNlIGlmIChoYW5kbGVkICYgQ1NSX0lOVF9CSVRfUkZfS0lMTCkKLQkJaXdsX2VuYWJsZV9yZmtpbGxfaW50KHByaXYpOworCUlXTF9ERUJVR19JTkZPKHByaXYsICJkZXZpY2UgcmVxdWVzdDogZmx1c2ggYWxsIHR4IGZyYW1lc1xuIik7CisJaXdsYWduX2Rldl90eGZpZm9fZmx1c2gocHJpdiwgSVdMX0RST1BfQUxMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC05MzksMjIgKzU3NCwyOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIGl3bF9mcmVlX2Z3X2Rlc2Moc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHN0cnVjdCBmd19kZXNjICpkZXNjKQorc3RhdGljIHZvaWQgaXdsX2ZyZWVfZndfZGVzYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBmd19kZXNjICpkZXNjKQogewogCWlmIChkZXNjLT52X2FkZHIpCi0JCWRtYV9mcmVlX2NvaGVyZW50KCZwY2lfZGV2LT5kZXYsIGRlc2MtPmxlbiwKKwkJZG1hX2ZyZWVfY29oZXJlbnQocHJpdi0+YnVzLT5kZXYsIGRlc2MtPmxlbiwKIAkJCQkgIGRlc2MtPnZfYWRkciwgZGVzYy0+cF9hZGRyKTsKIAlkZXNjLT52X2FkZHIgPSBOVUxMOwogCWRlc2MtPmxlbiA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGl3bF9mcmVlX2Z3X2ltZyhzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldiwgc3RydWN0IGZ3X2ltZyAqaW1nKQorc3RhdGljIHZvaWQgaXdsX2ZyZWVfZndfaW1nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGZ3X2ltZyAqaW1nKQogewotCWl3bF9mcmVlX2Z3X2Rlc2MocGNpX2RldiwgJmltZy0+Y29kZSk7Ci0JaXdsX2ZyZWVfZndfZGVzYyhwY2lfZGV2LCAmaW1nLT5kYXRhKTsKKwlpd2xfZnJlZV9md19kZXNjKHByaXYsICZpbWctPmNvZGUpOworCWl3bF9mcmVlX2Z3X2Rlc2MocHJpdiwgJmltZy0+ZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQgaXdsX2FsbG9jX2Z3X2Rlc2Moc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHN0cnVjdCBmd19kZXNjICpkZXNjLAorc3RhdGljIHZvaWQgaXdsX2RlYWxsb2NfdWNvZGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCWl3bF9mcmVlX2Z3X2ltZyhwcml2LCAmcHJpdi0+dWNvZGVfcnQpOworCWl3bF9mcmVlX2Z3X2ltZyhwcml2LCAmcHJpdi0+dWNvZGVfaW5pdCk7CisJaXdsX2ZyZWVfZndfaW1nKHByaXYsICZwcml2LT51Y29kZV93b3dsYW4pOworfQorCitzdGF0aWMgaW50IGl3bF9hbGxvY19md19kZXNjKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGZ3X2Rlc2MgKmRlc2MsCiAJCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCiB7CiAJaWYgKCFsZW4pIHsKQEAgLTk2MiwyMSArNjA0LDE2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRlc2MtPnZfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGNpX2Rldi0+ZGV2LCBsZW4sCisJZGVzYy0+dl9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KHByaXYtPmJ1cy0+ZGV2LCBsZW4sCiAJCQkJCSAgJmRlc2MtPnBfYWRkciwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXNjLT52X2FkZHIpCiAJCXJldHVybiAtRU5PTUVNOworCiAJZGVzYy0+bGVuID0gbGVuOwogCW1lbWNweShkZXNjLT52X2FkZHIsIGRhdGEsIGxlbik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGl3bF9kZWFsbG9jX3Vjb2RlX3BjaShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaXdsX2ZyZWVfZndfaW1nKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9ydCk7Ci0JaXdsX2ZyZWVfZndfaW1nKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0KTsKLX0KLQogc3RydWN0IGl3bGFnbl91Y29kZV9jYXBhYmlsaXRpZXMgewogCXUzMiBtYXhfcHJvYmVfbGVuZ3RoOwogCXUzMiBzdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZTsKQEAgLTEwMjEsMTMgKzY1OCwxNCBAQAogCQkgICAgICAgcHJpdi0+ZmlybXdhcmVfbmFtZSk7CiAKIAlyZXR1cm4gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIDEsIHByaXYtPmZpcm13YXJlX25hbWUsCi0JCQkJICAgICAgICZwcml2LT5wY2lfZGV2LT5kZXYsIEdGUF9LRVJORUwsIHByaXYsCi0JCQkJICAgICAgIGl3bF91Y29kZV9jYWxsYmFjayk7CisJCQkJICAgICAgIHByaXYtPmJ1cy0+ZGV2LAorCQkJCSAgICAgICBHRlBfS0VSTkVMLCBwcml2LCBpd2xfdWNvZGVfY2FsbGJhY2spOwogfQogCiBzdHJ1Y3QgaXdsYWduX2Zpcm13YXJlX3BpZWNlcyB7Ci0JY29uc3Qgdm9pZCAqaW5zdCwgKmRhdGEsICppbml0LCAqaW5pdF9kYXRhOwotCXNpemVfdCBpbnN0X3NpemUsIGRhdGFfc2l6ZSwgaW5pdF9zaXplLCBpbml0X2RhdGFfc2l6ZTsKKwljb25zdCB2b2lkICppbnN0LCAqZGF0YSwgKmluaXQsICppbml0X2RhdGEsICp3b3dsYW5faW5zdCwgKndvd2xhbl9kYXRhOworCXNpemVfdCBpbnN0X3NpemUsIGRhdGFfc2l6ZSwgaW5pdF9zaXplLCBpbml0X2RhdGFfc2l6ZSwKKwkgICAgICAgd293bGFuX2luc3Rfc2l6ZSwgd293bGFuX2RhdGFfc2l6ZTsKIAogCXUzMiBidWlsZDsKIApAQCAtMTI2Niw2ICs5MDQsMTQgQEAKIAkJCQlnb3RvIGludmFsaWRfdGx2X2xlbjsKIAkJCXByaXYtPmVuaGFuY2Vfc2Vuc2l0aXZpdHlfdGFibGUgPSB0cnVlOwogCQkJYnJlYWs7CisJCWNhc2UgSVdMX1VDT0RFX1RMVl9XT1dMQU5fSU5TVDoKKwkJCXBpZWNlcy0+d293bGFuX2luc3QgPSB0bHZfZGF0YTsKKwkJCXBpZWNlcy0+d293bGFuX2luc3Rfc2l6ZSA9IHRsdl9sZW47CisJCQlicmVhazsKKwkJY2FzZSBJV0xfVUNPREVfVExWX1dPV0xBTl9EQVRBOgorCQkJcGllY2VzLT53b3dsYW5fZGF0YSA9IHRsdl9kYXRhOworCQkJcGllY2VzLT53b3dsYW5fZGF0YV9zaXplID0gdGx2X2xlbjsKKwkJCWJyZWFrOwogCQljYXNlIElXTF9VQ09ERV9UTFZfUEhZX0NBTElCUkFUSU9OX1NJWkU6CiAJCQlpZiAodGx2X2xlbiAhPSBzaXplb2YodTMyKSkKIAkJCQlnb3RvIGludmFsaWRfdGx2X2xlbjsKQEAgLTE0NDMsMjMgKzEwODksMzUgQEAKIAkvKiBSdW50aW1lIGluc3RydWN0aW9ucyBhbmQgMiBjb3BpZXMgb2YgZGF0YToKIAkgKiAxKSB1bm1vZGlmaWVkIGZyb20gZGlzawogCSAqIDIpIGJhY2t1cCBjYWNoZSBmb3Igc2F2ZS9yZXN0b3JlIGR1cmluZyBwb3dlci1kb3ducyAqLwotCWlmIChpd2xfYWxsb2NfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfcnQuY29kZSwKKwlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MocHJpdiwgJnByaXYtPnVjb2RlX3J0LmNvZGUsCiAJCQkgICAgICBwaWVjZXMuaW5zdCwgcGllY2VzLmluc3Rfc2l6ZSkpCiAJCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX3J0LmRhdGEsCisJaWYgKGl3bF9hbGxvY19md19kZXNjKHByaXYsICZwcml2LT51Y29kZV9ydC5kYXRhLAogCQkJICAgICAgcGllY2VzLmRhdGEsIHBpZWNlcy5kYXRhX3NpemUpKQogCQlnb3RvIGVycl9wY2lfYWxsb2M7CiAKIAkvKiBJbml0aWFsaXphdGlvbiBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgKi8KIAlpZiAocGllY2VzLmluaXRfc2l6ZSAmJiBwaWVjZXMuaW5pdF9kYXRhX3NpemUpIHsKLQkJaWYgKGl3bF9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0LmNvZGUsCisJCWlmIChpd2xfYWxsb2NfZndfZGVzYyhwcml2LCAmcHJpdi0+dWNvZGVfaW5pdC5jb2RlLAogCQkJCSAgICAgIHBpZWNlcy5pbml0LCBwaWVjZXMuaW5pdF9zaXplKSkKIAkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQkJaWYgKGl3bF9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0LmRhdGEsCisJCWlmIChpd2xfYWxsb2NfZndfZGVzYyhwcml2LCAmcHJpdi0+dWNvZGVfaW5pdC5kYXRhLAogCQkJCSAgICAgIHBpZWNlcy5pbml0X2RhdGEsIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSkpCiAJCQlnb3RvIGVycl9wY2lfYWxsb2M7CiAJfQogCisJLyogV29XTEFOIGluc3RydWN0aW9ucyBhbmQgZGF0YSAqLworCWlmIChwaWVjZXMud293bGFuX2luc3Rfc2l6ZSAmJiBwaWVjZXMud293bGFuX2RhdGFfc2l6ZSkgeworCQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MocHJpdiwgJnByaXYtPnVjb2RlX3dvd2xhbi5jb2RlLAorCQkJCSAgICAgIHBpZWNlcy53b3dsYW5faW5zdCwKKwkJCQkgICAgICBwaWVjZXMud293bGFuX2luc3Rfc2l6ZSkpCisJCQlnb3RvIGVycl9wY2lfYWxsb2M7CisJCWlmIChpd2xfYWxsb2NfZndfZGVzYyhwcml2LCAmcHJpdi0+dWNvZGVfd293bGFuLmRhdGEsCisJCQkJICAgICAgcGllY2VzLndvd2xhbl9kYXRhLAorCQkJCSAgICAgIHBpZWNlcy53b3dsYW5fZGF0YV9zaXplKSkKKwkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKKwl9CisKIAkvKiBOb3cgdGhhdCB3ZSBjYW4gbm8gbG9uZ2VyIGZhaWwsIGNvcHkgaW5mb3JtYXRpb24gKi8KIAogCS8qCkBAIC0xNDY3LDI1ICsxMTI1LDI2IEBACiAJICogZm9yIGVhY2ggZXZlbnQsIHdoaWNoIGlzIG9mIG1vZGUgMSAoaW5jbHVkaW5nIHRpbWVzdGFtcCkgZm9yIGFsbAogCSAqIG5ldyBtaWNyb2NvZGVzIHRoYXQgaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uLgogCSAqLwotCXByaXYtPl9hZ24uaW5pdF9ldnRsb2dfcHRyID0gcGllY2VzLmluaXRfZXZ0bG9nX3B0cjsKKwlwcml2LT5pbml0X2V2dGxvZ19wdHIgPSBwaWVjZXMuaW5pdF9ldnRsb2dfcHRyOwogCWlmIChwaWVjZXMuaW5pdF9ldnRsb2dfc2l6ZSkKLQkJcHJpdi0+X2Fnbi5pbml0X2V2dGxvZ19zaXplID0gKHBpZWNlcy5pbml0X2V2dGxvZ19zaXplIC0gMTYpLzEyOworCQlwcml2LT5pbml0X2V2dGxvZ19zaXplID0gKHBpZWNlcy5pbml0X2V2dGxvZ19zaXplIC0gMTYpLzEyOwogCWVsc2UKLQkJcHJpdi0+X2Fnbi5pbml0X2V2dGxvZ19zaXplID0KKwkJcHJpdi0+aW5pdF9ldnRsb2dfc2l6ZSA9CiAJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5tYXhfZXZlbnRfbG9nX3NpemU7Ci0JcHJpdi0+X2Fnbi5pbml0X2VycmxvZ19wdHIgPSBwaWVjZXMuaW5pdF9lcnJsb2dfcHRyOwotCXByaXYtPl9hZ24uaW5zdF9ldnRsb2dfcHRyID0gcGllY2VzLmluc3RfZXZ0bG9nX3B0cjsKKwlwcml2LT5pbml0X2VycmxvZ19wdHIgPSBwaWVjZXMuaW5pdF9lcnJsb2dfcHRyOworCXByaXYtPmluc3RfZXZ0bG9nX3B0ciA9IHBpZWNlcy5pbnN0X2V2dGxvZ19wdHI7CiAJaWYgKHBpZWNlcy5pbnN0X2V2dGxvZ19zaXplKQotCQlwcml2LT5fYWduLmluc3RfZXZ0bG9nX3NpemUgPSAocGllY2VzLmluc3RfZXZ0bG9nX3NpemUgLSAxNikvMTI7CisJCXByaXYtPmluc3RfZXZ0bG9nX3NpemUgPSAocGllY2VzLmluc3RfZXZ0bG9nX3NpemUgLSAxNikvMTI7CiAJZWxzZQotCQlwcml2LT5fYWduLmluc3RfZXZ0bG9nX3NpemUgPQorCQlwcml2LT5pbnN0X2V2dGxvZ19zaXplID0KIAkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm1heF9ldmVudF9sb2dfc2l6ZTsKLQlwcml2LT5fYWduLmluc3RfZXJybG9nX3B0ciA9IHBpZWNlcy5pbnN0X2VycmxvZ19wdHI7CisJcHJpdi0+aW5zdF9lcnJsb2dfcHRyID0gcGllY2VzLmluc3RfZXJybG9nX3B0cjsKIAogCXByaXYtPm5ld19zY2FuX3RocmVzaG9sZF9iZWhhdmlvdXIgPQogCQkhISh1Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19ORVdTQ0FOKTsKIAotCWlmICh1Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19QQU4pIHsKKwlpZiAoKHByaXYtPmNmZy0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfSVBBTl9FTkFCTEUpICYmCisJICAgICh1Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19QQU4pKSB7CiAJCXByaXYtPnZhbGlkX2NvbnRleHRzIHw9IEJJVChJV0xfUlhPTl9DVFhfUEFOKTsKIAkJcHJpdi0+c3RhX2tleV9tYXhfbnVtID0gU1RBX0tFWV9NQVhfTlVNX1BBTjsKIAl9IGVsc2UKQEAgLTE1MDUsOSArMTE2NCw5IEBACiAJCXVjb2RlX2NhcGEuc3RhbmRhcmRfcGh5X2NhbGlicmF0aW9uX3NpemUgPQogCQkJSVdMX01BWF9TVEFOREFSRF9QSFlfQ0FMSUJSQVRFX1RCTF9TSVpFOwogCi0JcHJpdi0+X2Fnbi5waHlfY2FsaWJfY2hhaW5fbm9pc2VfcmVzZXRfY21kID0KKwlwcml2LT5waHlfY2FsaWJfY2hhaW5fbm9pc2VfcmVzZXRfY21kID0KIAkJdWNvZGVfY2FwYS5zdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZTsKLQlwcml2LT5fYWduLnBoeV9jYWxpYl9jaGFpbl9ub2lzZV9nYWluX2NtZCA9CisJcHJpdi0+cGh5X2NhbGliX2NoYWluX25vaXNlX2dhaW5fY21kID0KIAkJdWNvZGVfY2FwYS5zdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZSArIDE7CiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1MjMsNyArMTE4Miw3IEBACiAJaWYgKGVycikKIAkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGZpbGVzLiBJZ25vcmluZyBlcnJvcjogJWRcbiIsIGVycik7CiAKLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnByaXYtPnBjaV9kZXYtPmRldi5rb2JqLAorCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmKHByaXYtPmJ1cy0+ZGV2LT5rb2JqKSwKIAkJCQkJJml3bF9hdHRyaWJ1dGVfZ3JvdXApOwogCWlmIChlcnIpIHsKIAkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBkZXZpY2UgYXR0cmlidXRlc1xuIik7CkBAIC0xNTMyLDcgKzExOTEsNyBAQAogCiAJLyogV2UgaGF2ZSBvdXIgY29waWVzIG5vdywgYWxsb3cgT1MgcmVsZWFzZSBpdHMgY29waWVzICovCiAJcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOwotCWNvbXBsZXRlKCZwcml2LT5fYWduLmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOworCWNvbXBsZXRlKCZwcml2LT5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKIAlyZXR1cm47CiAKICB0cnlfYWdhaW46CkBAIC0xNTQ0LDE0ICsxMjAzLDE0IEBACiAKICBlcnJfcGNpX2FsbG9jOgogCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKLQlpd2xfZGVhbGxvY191Y29kZV9wY2kocHJpdik7CisJaXdsX2RlYWxsb2NfdWNvZGUocHJpdik7CiAgb3V0X3VuYmluZDoKLQljb21wbGV0ZSgmcHJpdi0+X2Fnbi5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKLQlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoJnByaXYtPnBjaV9kZXYtPmRldik7CisJY29tcGxldGUoJnByaXYtPmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOworCWRldmljZV9yZWxlYXNlX2RyaXZlcihwcml2LT5idXMtPmRldik7CiAJcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqZGVzY19sb29rdXBfdGV4dFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZXNjX2xvb2t1cF90ZXh0W10gPSB7CiAJIk9LIiwKIAkiRkFJTCIsCiAJIkJBRF9QQVJBTSIsCkBAIC0xNTc1LDcgKzEyMzQsNyBAQAogCSJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwKIAkiTk1JX1RSTV9IV19FUiIsCiAJIk5NSV9JTlRFUlJVUFRfVFJNIiwKLQkiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIKKwkiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIsCiAJIkRFQlVHXzAiLAogCSJERUJVR18xIiwKIAkiREVCVUdfMiIsCkBAIC0xNjI2LDE5ICsxMjg1LDE5IEBACiAJc3RydWN0IGl3bF9lcnJvcl9ldmVudF90YWJsZSB0YWJsZTsKIAogCWJhc2UgPSBwcml2LT5kZXZpY2VfcG9pbnRlcnMuZXJyb3JfZXZlbnRfdGFibGU7Ci0JaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfU1VCVFlQRV9JTklUKSB7CisJaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX0lOSVQpIHsKIAkJaWYgKCFiYXNlKQotCQkJYmFzZSA9IHByaXYtPl9hZ24uaW5pdF9lcnJsb2dfcHRyOworCQkJYmFzZSA9IHByaXYtPmluaXRfZXJybG9nX3B0cjsKIAl9IGVsc2UgewogCQlpZiAoIWJhc2UpCi0JCQliYXNlID0gcHJpdi0+X2Fnbi5pbnN0X2VycmxvZ19wdHI7CisJCQliYXNlID0gcHJpdi0+aW5zdF9lcnJsb2dfcHRyOwogCX0KIAotCWlmICghcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+aXNfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgeworCWlmICghaXdsYWduX2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKIAkJSVdMX0VSUihwcml2LAogCQkJIk5vdCB2YWxpZCBlcnJvciBsb2cgcG9pbnRlciAweCUwOFggZm9yICVzIHVDb2RlXG4iLAogCQkJYmFzZSwKLQkJCShwcml2LT51Y29kZV90eXBlID09IFVDT0RFX1NVQlRZUEVfSU5JVCkKKwkJCShwcml2LT51Y29kZV90eXBlID09IElXTF9VQ09ERV9JTklUKQogCQkJCQk/ICJJbml0IiA6ICJSVCIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTcwMiwxMiArMTM2MSwxMiBAQAogCQlyZXR1cm4gcG9zOwogCiAJYmFzZSA9IHByaXYtPmRldmljZV9wb2ludGVycy5sb2dfZXZlbnRfdGFibGU7Ci0JaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfU1VCVFlQRV9JTklUKSB7CisJaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX0lOSVQpIHsKIAkJaWYgKCFiYXNlKQotCQkJYmFzZSA9IHByaXYtPl9hZ24uaW5pdF9ldnRsb2dfcHRyOworCQkJYmFzZSA9IHByaXYtPmluaXRfZXZ0bG9nX3B0cjsKIAl9IGVsc2UgewogCQlpZiAoIWJhc2UpCi0JCQliYXNlID0gcHJpdi0+X2Fnbi5pbnN0X2V2dGxvZ19wdHI7CisJCQliYXNlID0gcHJpdi0+aW5zdF9ldnRsb2dfcHRyOwogCX0KIAogCWlmIChtb2RlID09IDApCkBAIC0xODE1LDIxICsxNDc0LDIxIEBACiAJc2l6ZV90IGJ1ZnN6ID0gMDsKIAogCWJhc2UgPSBwcml2LT5kZXZpY2VfcG9pbnRlcnMubG9nX2V2ZW50X3RhYmxlOwotCWlmIChwcml2LT51Y29kZV90eXBlID09IFVDT0RFX1NVQlRZUEVfSU5JVCkgewotCQlsb2dzaXplID0gcHJpdi0+X2Fnbi5pbml0X2V2dGxvZ19zaXplOworCWlmIChwcml2LT51Y29kZV90eXBlID09IElXTF9VQ09ERV9JTklUKSB7CisJCWxvZ3NpemUgPSBwcml2LT5pbml0X2V2dGxvZ19zaXplOwogCQlpZiAoIWJhc2UpCi0JCQliYXNlID0gcHJpdi0+X2Fnbi5pbml0X2V2dGxvZ19wdHI7CisJCQliYXNlID0gcHJpdi0+aW5pdF9ldnRsb2dfcHRyOwogCX0gZWxzZSB7Ci0JCWxvZ3NpemUgPSBwcml2LT5fYWduLmluc3RfZXZ0bG9nX3NpemU7CisJCWxvZ3NpemUgPSBwcml2LT5pbnN0X2V2dGxvZ19zaXplOwogCQlpZiAoIWJhc2UpCi0JCQliYXNlID0gcHJpdi0+X2Fnbi5pbnN0X2V2dGxvZ19wdHI7CisJCQliYXNlID0gcHJpdi0+aW5zdF9ldnRsb2dfcHRyOwogCX0KIAotCWlmICghcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+aXNfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgeworCWlmICghaXdsYWduX2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKIAkJSVdMX0VSUihwcml2LAogCQkJIkludmFsaWQgZXZlbnQgbG9nIHBvaW50ZXIgMHglMDhYIGZvciAlcyB1Q29kZVxuIiwKIAkJCWJhc2UsCi0JCQkocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9TVUJUWVBFX0lOSVQpCisJCQkocHJpdi0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkKIAkJCQkJPyAiSW5pdCIgOiAiUlQiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTkyOCw4ICsxNTg3LDkgQEAKIAkJYWR2X2NtZC5jcml0aWNhbF90ZW1wZXJhdHVyZV9leGl0ID0KIAkJCWNwdV90b19sZTMyKHByaXYtPmh3X3BhcmFtcy5jdF9raWxsX2V4aXRfdGhyZXNob2xkKTsKIAotCQlyZXQgPSBpd2xfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX0NUX0tJTExfQ09ORklHX0NNRCwKLQkJCQkgICAgICAgc2l6ZW9mKGFkdl9jbWQpLCAmYWR2X2NtZCk7CisJCXJldCA9IHRyYW5zX3NlbmRfY21kX3BkdSgmcHJpdi0+dHJhbnMsCisJCQkJICAgICAgIFJFUExZX0NUX0tJTExfQ09ORklHX0NNRCwKKwkJCQkgICAgICAgQ01EX1NZTkMsIHNpemVvZihhZHZfY21kKSwgJmFkdl9jbWQpOwogCQlpZiAocmV0KQogCQkJSVdMX0VSUihwcml2LCAiUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01EIGZhaWxlZFxuIik7CiAJCWVsc2UKQEAgLTE5NDMsOCArMTYwMyw5IEBACiAJCWNtZC5jcml0aWNhbF90ZW1wZXJhdHVyZV9SID0KIAkJCWNwdV90b19sZTMyKHByaXYtPmh3X3BhcmFtcy5jdF9raWxsX3RocmVzaG9sZCk7CiAKLQkJcmV0ID0gaXdsX3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9DVF9LSUxMX0NPTkZJR19DTUQsCi0JCQkJICAgICAgIHNpemVvZihjbWQpLCAmY21kKTsKKwkJcmV0ID0gdHJhbnNfc2VuZF9jbWRfcGR1KCZwcml2LT50cmFucywKKwkJCQkgICAgICAgUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01ELAorCQkJCSAgICAgICBDTURfU1lOQywgc2l6ZW9mKGNtZCksICZjbWQpOwogCQlpZiAocmV0KQogCQkJSVdMX0VSUihwcml2LCAiUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01EIGZhaWxlZFxuIik7CiAJCWVsc2UKQEAgLTE5NjgsMTAgKzE2MjksMjkgQEAKIAljYWxpYl9jZmdfY21kLnVjZF9jYWxpYl9jZmcub25jZS5pc19lbmFibGUgPSBJV0xfQ0FMSUJfSU5JVF9DRkdfQUxMOwogCWNhbGliX2NmZ19jbWQudWNkX2NhbGliX2NmZy5vbmNlLnN0YXJ0ID0gY3B1X3RvX2xlMzIoY2ZnKTsKIAotCXJldHVybiBpd2xfc2VuZF9jbWQocHJpdiwgJmNtZCk7CisJcmV0dXJuIHRyYW5zX3NlbmRfY21kKCZwcml2LT50cmFucywgJmNtZCk7CiB9CiAKIAorc3RhdGljIGludCBpd2xhZ25fc2VuZF90eF9hbnRfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggdmFsaWRfdHhfYW50KQoreworCXN0cnVjdCBpd2xfdHhfYW50X2NvbmZpZ19jbWQgdHhfYW50X2NtZCA9IHsKKwkgIC52YWxpZCA9IGNwdV90b19sZTMyKHZhbGlkX3R4X2FudCksCisJfTsKKworCWlmIChJV0xfVUNPREVfQVBJKHByaXYtPnVjb2RlX3ZlcikgPiAxKSB7CisJCUlXTF9ERUJVR19IQyhwcml2LCAic2VsZWN0IHZhbGlkIHR4IGFudDogJXVcbiIsIHZhbGlkX3R4X2FudCk7CisJCXJldHVybiB0cmFuc19zZW5kX2NtZF9wZHUoJnByaXYtPnRyYW5zLAorCQkJCQlUWF9BTlRfQ09ORklHVVJBVElPTl9DTUQsCisJCQkJCUNNRF9TWU5DLAorCQkJCQlzaXplb2Yoc3RydWN0IGl3bF90eF9hbnRfY29uZmlnX2NtZCksCisJCQkJCSZ0eF9hbnRfY21kKTsKKwl9IGVsc2UgeworCQlJV0xfREVCVUdfSEMocHJpdiwgIlRYX0FOVF9DT05GSUdVUkFUSU9OX0NNRCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKwogLyoqCiAgKiBpd2xfYWxpdmVfc3RhcnQgLSBjYWxsZWQgYWZ0ZXIgUkVQTFlfQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCiAgKiAgICAgICAgICAgICAgICAgICBmcm9tIHByb3RvY29sL3J1bnRpbWUgdUNvZGUgKGluaXRpYWxpemF0aW9uIHVDb2RlJ3MKQEAgLTE5ODIsNiArMTY2Miw3IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKIAorCS8qVE9ETzogdGhpcyBzaG91bGQgZ28gdG8gdGhlIHRyYW5zcG9ydCBsYXllciAqLwogCWl3bF9yZXNldF9pY3QocHJpdik7CiAKIAlJV0xfREVCVUdfSU5GTyhwcml2LCAiUnVudGltZSBBbGl2ZSByZWNlaXZlZC5cbiIpOwpAQCAtMTk5OSwxMSArMTY4MCwxOCBAQAogCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgogCSAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgewogCQkvKiBDb25maWd1cmUgQmx1ZXRvb3RoIGRldmljZSBjb2V4aXN0ZW5jZSBzdXBwb3J0ICovCisJCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcy0+YnRfc2NvX2Rpc2FibGUpCisJCQlwcml2LT5idF9lbmFibGVfcHNwb2xsID0gZmFsc2U7CisJCWVsc2UKKwkJCXByaXYtPmJ0X2VuYWJsZV9wc3BvbGwgPSB0cnVlOworCiAJCXByaXYtPmJ0X3ZhbGlkID0gSVdMQUdOX0JUX0FMTF9WQUxJRF9NU0s7CiAJCXByaXYtPmtpbGxfYWNrX21hc2sgPSBJV0xBR05fQlRfS0lMTF9BQ0tfTUFTS19ERUZBVUxUOwogCQlwcml2LT5raWxsX2N0c19tYXNrID0gSVdMQUdOX0JUX0tJTExfQ1RTX01BU0tfREVGQVVMVDsKLQkJcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNlbmRfYnRfY29uZmlnKHByaXYpOworCQlpd2xhZ25fc2VuZF9hZHZhbmNlX2J0X2NvbmZpZyhwcml2KTsKIAkJcHJpdi0+YnRfdmFsaWQgPSBJV0xBR05fQlRfVkFMSURfRU5BQkxFX0ZMQUdTOworCQlwcml2LT5jdXJfcnNzaV9jdHggPSBOVUxMOworCiAJCWl3bGFnbl9zZW5kX3ByaW9fdGJsKHByaXYpOwogCiAJCS8qIEZJWE1FOiB3L2EgdG8gZm9yY2UgY2hhbmdlIHVDb2RlIEJUIHN0YXRlIG1hY2hpbmUgKi8KQEAgLTIwMTUsNyArMTcwMywxMyBAQAogCQkJCQkgQlRfQ09FWF9QUklPX1RCTF9FVlRfSU5JVF9DQUxJQjIpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBkZWZhdWx0IGlzIDItd2lyZSBCVCBjb2V4ZXhpc3RlbmNlIHN1cHBvcnQKKwkJICovCisJCWl3bF9zZW5kX2J0X2NvbmZpZyhwcml2KTsKIAl9CisKIAlpZiAocHJpdi0+aHdfcGFyYW1zLmNhbGliX3J0X2NmZykKIAkJaXdsYWduX3NlbmRfY2FsaWJfY2ZnX3J0KHByaXYsIHByaXYtPmh3X3BhcmFtcy5jYWxpYl9ydF9jZmcpOwogCkBAIC0yMDI0LDEwICsxNzE4LDkgQEAKIAlwcml2LT5hY3RpdmVfcmF0ZSA9IElXTF9SQVRFU19NQVNLOwogCiAJLyogQ29uZmlndXJlIFR4IGFudGVubmEgc2VsZWN0aW9uIGJhc2VkIG9uIEgvVyBjb25maWcgKi8KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF90eF9hbnQpCi0JCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfdHhfYW50KHByaXYsIHByaXYtPmNmZy0+dmFsaWRfdHhfYW50KTsKKwlpd2xhZ25fc2VuZF90eF9hbnRfY29uZmlnKHByaXYsIHByaXYtPmNmZy0+dmFsaWRfdHhfYW50KTsKIAotCWlmIChpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkgeworCWlmIChpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSAmJiAhcHJpdi0+d293bGFuKSB7CiAJCXN0cnVjdCBpd2xfcnhvbl9jbWQgKmFjdGl2ZV9yeG9uID0KIAkJCQkoc3RydWN0IGl3bF9yeG9uX2NtZCAqKSZjdHgtPmFjdGl2ZTsKIAkJLyogYXBwbHkgYW55IGNoYW5nZXMgaW4gc3RhZ2luZyAqLwpAQCAtMjAzOSwyNCArMTczMiwxOCBAQAogCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIHRtcCkKIAkJCWl3bF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHByaXYsIHRtcCk7CiAKLQkJaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOworCQlpd2xhZ25fc2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKIAl9CiAKLQlpZiAoIXByaXYtPmNmZy0+YnRfcGFyYW1zIHx8IChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCSAgICAhcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpKSB7Ci0JCS8qCi0JCSAqIGRlZmF1bHQgaXMgMi13aXJlIEJUIGNvZXhleGlzdGVuY2Ugc3VwcG9ydAotCQkgKi8KLQkJcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNlbmRfYnRfY29uZmlnKHByaXYpOworCWlmICghcHJpdi0+d293bGFuKSB7CisJCS8qIFdvV0xBTiB1Y29kZSB3aWxsIG5vdCByZXBseSBpbiB0aGUgc2FtZSB3YXksIHNraXAgaXQgKi8KKwkJaXdsX3Jlc2V0X3J1bl90aW1lX2NhbGliKHByaXYpOwogCX0KIAotCWl3bF9yZXNldF9ydW5fdGltZV9jYWxpYihwcml2KTsKLQogCXNldF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKTsKIAogCS8qIENvbmZpZ3VyZSB0aGUgYWRhcHRlciBmb3IgdW5hc3NvY2lhdGVkIG9wZXJhdGlvbiAqLwotCXJldCA9IGl3bGNvcmVfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKKwlyZXQgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0yMDkwLDYgKzE3NzcsOCBAQAogCiAJLyogcmVzZXQgQlQgY29leCBkYXRhICovCiAJcHJpdi0+YnRfc3RhdHVzID0gMDsKKwlwcml2LT5jdXJfcnNzaV9jdHggPSBOVUxMOworCXByaXYtPmJ0X2lzX3NjbyA9IDA7CiAJaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zKQogCQlwcml2LT5idF90cmFmZmljX2xvYWQgPQogCQkJIHByaXYtPmNmZy0+YnRfcGFyYW1zLT5idF9pbml0X3RyYWZmaWNfbG9hZDsKQEAgLTIxMTYsNyArMTgwNSw3IEBACiAJCSAgICAgICB0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSA8PAogCQkJCVNUQVRVU19FWElUX1BFTkRJTkc7CiAKLQlpd2xhZ25fc3RvcF9kZXZpY2UocHJpdik7CisJdHJhbnNfc3RvcF9kZXZpY2UoJnByaXYtPnRyYW5zKTsKIAogCWRldl9rZnJlZV9za2IocHJpdi0+YmVhY29uX3NrYik7CiAJcHJpdi0+YmVhY29uX3NrYiA9IE5VTEw7CkBAIC0yMTMxLDU1ICsxODIwLDYgQEAKIAlpd2xfY2FuY2VsX2RlZmVycmVkX3dvcmsocHJpdik7CiB9CiAKLSNkZWZpbmUgSFdfUkVBRFlfVElNRU9VVCAoNTApCi0KLS8qIE5vdGU6IHJldHVybnMgcG9sbF9iaXQgcmV0dXJuIHZhbHVlLCB3aGljaCBpcyA+PSAwIGlmIHN1Y2Nlc3MgKi8KLXN0YXRpYyBpbnQgaXdsX3NldF9od19yZWFkeShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldDsKLQotCWl3bF9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1JFQURZKTsKLQotCS8qIFNlZSBpZiB3ZSBnb3QgaXQgKi8KLQlyZXQgPSBpd2xfcG9sbF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19SRUFEWSwKLQkJCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1JFQURZLAotCQkJCUhXX1JFQURZX1RJTUVPVVQpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImhhcmR3YXJlJXMgcmVhZHlcbiIsIHJldCA8IDAgPyAiIG5vdCIgOiAiIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogTm90ZTogcmV0dXJucyBzdGFuZGFyZCAwLy1FUlJPUiBjb2RlICovCi1pbnQgaXdsX3ByZXBhcmVfY2FyZF9odyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldDsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJpd2xfcHJlcGFyZV9jYXJkX2h3IGVudGVyXG4iKTsKLQotCXJldCA9IGl3bF9zZXRfaHdfcmVhZHkocHJpdik7Ci0JaWYgKHJldCA+PSAwKQotCQlyZXR1cm4gMDsKLQotCS8qIElmIEhXIGlzIG5vdCByZWFkeSwgcHJlcGFyZSB0aGUgY29uZGl0aW9ucyB0byBjaGVjayBhZ2FpbiAqLwotCWl3bF9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfUFJFUEFSRSk7Ci0KLQlyZXQgPSBpd2xfcG9sbF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQl+Q1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUsCi0JCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1BSRVBBUkVfRE9ORSwgMTUwMDAwKTsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogSFcgc2hvdWxkIGJlIHJlYWR5IGJ5IG5vdywgY2hlY2sgYWdhaW4uICovCi0JcmV0ID0gaXdsX3NldF9od19yZWFkeShwcml2KTsKLQlpZiAocmV0ID49IDApCi0JCXJldHVybiAwOwotCXJldHVybiByZXQ7Ci19Ci0KICNkZWZpbmUgTUFYX0hXX1JFU1RBUlRTIDUKIAogc3RhdGljIGludCBfX2l3bF91cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCkBAIC0yMjEwLDggKzE4NTAsNyBAQAogCiAJcmV0ID0gaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShwcml2LAogCQkJCQkgICAmcHJpdi0+dWNvZGVfcnQsCi0JCQkJCSAgIFVDT0RFX1NVQlRZUEVfUkVHVUxBUiwKLQkJCQkJICAgVUNPREVfU1VCVFlQRV9SRUdVTEFSX05FVyk7CisJCQkJCSAgIElXTF9VQ09ERV9SRUdVTEFSKTsKIAlpZiAocmV0KSB7CiAJCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byBzdGFydCBSVCB1Y29kZTogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXJyb3I7CkBAIC0yMjY2LDYgKzE5MDUsNyBAQAogCXU4IGJ0X2NpX2NvbXBsaWFuY2U7CiAJdTggYnRfbG9hZDsKIAl1OCBidF9zdGF0dXM7CisJYm9vbCBidF9pc19zY287CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7CiAKQEAgLTIyODYsNiArMTkyNiw3IEBACiAJYnRfY2lfY29tcGxpYW5jZSA9IHByaXYtPmJ0X2NpX2NvbXBsaWFuY2U7CiAJYnRfbG9hZCA9IHByaXYtPmJ0X3RyYWZmaWNfbG9hZDsKIAlidF9zdGF0dXMgPSBwcml2LT5idF9zdGF0dXM7CisJYnRfaXNfc2NvID0gcHJpdi0+YnRfaXNfc2NvOwogCiAJX19pd2xfZG93bihwcml2KTsKIApAQCAtMjI5Myw2ICsxOTM0LDcgQEAKIAlwcml2LT5idF9jaV9jb21wbGlhbmNlID0gYnRfY2lfY29tcGxpYW5jZTsKIAlwcml2LT5idF90cmFmZmljX2xvYWQgPSBidF9sb2FkOwogCXByaXYtPmJ0X3N0YXR1cyA9IGJ0X3N0YXR1czsKKwlwcml2LT5idF9pc19zY28gPSBidF9pc19zY287CiB9CiAKIHN0YXRpYyB2b2lkIGl3bF9iZ19yZXN0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKQEAgLTIzMTMsMTkgKzE5NTUsNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaXdsX2JnX3J4X3JlcGxlbmlzaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0KLQkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2xfcHJpdiwgcnhfcmVwbGVuaXNoKTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWl3bGFnbl9yeF9yZXBsZW5pc2gocHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KIHN0YXRpYyBpbnQgaXdsX21hY19vZmZjaGFubmVsX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCiAJCQkJIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLApAQCAtMjM2MCw3ICsxOTg5LDcgQEAKIAogCS8qIFRPRE86IHF1ZXVlIHVwIGlmIHNjYW5uaW5nPyAqLwogCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgIHByaXYtPl9hZ24ub2ZmY2hhbl90eF9za2IpIHsKKwkgICAgcHJpdi0+b2ZmY2hhbl90eF9za2IpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMzc0LDE0ICsyMDAzLDE0IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXByaXYtPl9hZ24ub2ZmY2hhbl90eF9za2IgPSBza2I7Ci0JcHJpdi0+X2Fnbi5vZmZjaGFuX3R4X3RpbWVvdXQgPSB3YWl0OwotCXByaXYtPl9hZ24ub2ZmY2hhbl90eF9jaGFuID0gY2hhbjsKKwlwcml2LT5vZmZjaGFuX3R4X3NrYiA9IHNrYjsKKwlwcml2LT5vZmZjaGFuX3R4X3RpbWVvdXQgPSB3YWl0OworCXByaXYtPm9mZmNoYW5fdHhfY2hhbiA9IGNoYW47CiAKIAlyZXQgPSBpd2xfc2Nhbl9pbml0aWF0ZShwcml2LCBwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfUEFOXS52aWYsCiAJCQkJSVdMX1NDQU5fT0ZGQ0hfVFgsIGNoYW4tPmJhbmQpOwogCWlmIChyZXQpCi0JCXByaXYtPl9hZ24ub2ZmY2hhbl90eF9za2IgPSBOVUxMOworCQlwcml2LT5vZmZjaGFuX3R4X3NrYiA9IE5VTEw7CiAgb3V0OgogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogIGZyZWU6CkBAIC0yMzk4LDEyICsyMDI3LDEyIEBACiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CiAKLQlpZiAoIXByaXYtPl9hZ24ub2ZmY2hhbl90eF9za2IpIHsKKwlpZiAoIXByaXYtPm9mZmNoYW5fdHhfc2tiKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gdW5sb2NrOwogCX0KIAotCXByaXYtPl9hZ24ub2ZmY2hhbl90eF9za2IgPSBOVUxMOworCXByaXYtPm9mZmNoYW5fdHhfc2tiID0gTlVMTDsKIAogCXJldCA9IGl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDIwMCk7CiAJaWYgKHJldCkKQEAgLTI0MjAsNiArMjA0OSw3NyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQgaXdsYWduX3N0YV9hcF9saW1pdHNbXSA9IHsKKwl7CisJCS5tYXggPSAxLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTiksCisJfSwKKwl7CisJCS5tYXggPSAxLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfQVApLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBpd2xhZ25fMnN0YV9saW1pdHNbXSA9IHsKKwl7CisJCS5tYXggPSAyLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTiksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0IGl3bGFnbl9wMnBfc3RhX2dvX2xpbWl0c1tdID0geworCXsKKwkJLm1heCA9IDEsCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSwKKwl9LAorCXsKKwkJLm1heCA9IDEsCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pIHwKKwkJCSBCSVQoTkw4MDIxMV9JRlRZUEVfQVApLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBpd2xhZ25fcDJwXzJzdGFfbGltaXRzW10gPSB7CisJeworCQkubWF4ID0gMiwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pLAorCX0sCisJeworCQkubWF4ID0gMSwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9jb21iaW5hdGlvbgoraXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19kdWFsbW9kZVtdID0geworCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAorCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKKwkgIC5iZWFjb25faW50X2luZnJhX21hdGNoID0gdHJ1ZSwKKwkgIC5saW1pdHMgPSBpd2xhZ25fc3RhX2FwX2xpbWl0cywKKwkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduX3N0YV9hcF9saW1pdHMpLAorCX0sCisJeyAubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDEsCisJICAubWF4X2ludGVyZmFjZXMgPSAyLAorCSAgLmxpbWl0cyA9IGl3bGFnbl8yc3RhX2xpbWl0cywKKwkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduXzJzdGFfbGltaXRzKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfY29tYmluYXRpb24KK2l3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfcDJwW10gPSB7CisJeyAubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDEsCisJICAubWF4X2ludGVyZmFjZXMgPSAyLAorCSAgLmJlYWNvbl9pbnRfaW5mcmFfbWF0Y2ggPSB0cnVlLAorCSAgLmxpbWl0cyA9IGl3bGFnbl9wMnBfc3RhX2dvX2xpbWl0cywKKwkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduX3AycF9zdGFfZ29fbGltaXRzKSwKKwl9LAorCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAorCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKKwkgIC5saW1pdHMgPSBpd2xhZ25fcDJwXzJzdGFfbGltaXRzLAorCSAgLm5fbGltaXRzID0gQVJSQVlfU0laRShpd2xhZ25fcDJwXzJzdGFfbGltaXRzKSwKKwl9LAorfTsKKwogLyoKICAqIE5vdCBhIG1hYzgwMjExIGVudHJ5IHBvaW50IGZ1bmN0aW9uLCBidXQgaXQgZml0cyBpbiB3aXRoIGFsbCB0aGUKICAqIG90aGVyIG1hYzgwMjExIGZ1bmN0aW9ucyBncm91cGVkIGhlcmUuCkBAIC0yNDQ1LDcgKzIxNDUsNyBAQAogCWh3LT5mbGFncyB8PSBJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFMgfAogCQkgICAgIElFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1BTOwogCi0JaWYgKHByaXYtPmNmZy0+c2t1ICYgSVdMX1NLVV9OKQorCWlmIChwcml2LT5jZmctPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUpCiAJCWh3LT5mbGFncyB8PSBJRUVFODAyMTFfSFdfU1VQUE9SVFNfRFlOQU1JQ19TTVBTIHwKIAkJCSAgICAgSUVFRTgwMjExX0hXX1NVUFBPUlRTX1NUQVRJQ19TTVBTOwogCkBAIC0yNDYwLDE3ICsyMTYwLDQ1IEBACiAJCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKIAl9CiAKKwlCVUlMRF9CVUdfT04oTlVNX0lXTF9SWE9OX0NUWCAhPSAyKTsKKworCWlmIChody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSkgeworCQlody0+d2lwaHktPmlmYWNlX2NvbWJpbmF0aW9ucyA9IGl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfcDJwOworCQlody0+d2lwaHktPm5faWZhY2VfY29tYmluYXRpb25zID0KKwkJCUFSUkFZX1NJWkUoaXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19wMnApOworCX0gZWxzZSBpZiAoaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfQVApKSB7CisJCWh3LT53aXBoeS0+aWZhY2VfY29tYmluYXRpb25zID0gaXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19kdWFsbW9kZTsKKwkJaHctPndpcGh5LT5uX2lmYWNlX2NvbWJpbmF0aW9ucyA9CisJCQlBUlJBWV9TSVpFKGl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfZHVhbG1vZGUpOworCX0KKwogCWh3LT53aXBoeS0+bWF4X3JlbWFpbl9vbl9jaGFubmVsX2R1cmF0aW9uID0gMTAwMDsKIAogCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSB8CiAJCQkgICAgV0lQSFlfRkxBR19ESVNBQkxFX0JFQUNPTl9ISU5UUyB8CiAJCQkgICAgV0lQSFlfRkxBR19JQlNTX1JTTjsKIAotCS8qCi0JICogRm9yIG5vdywgZGlzYWJsZSBQUyBieSBkZWZhdWx0IGJlY2F1c2UgaXQgYWZmZWN0cwotCSAqIFJYIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuCi0JICovCi0JaHctPndpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOworCWlmIChwcml2LT51Y29kZV93b3dsYW4uY29kZS5sZW4gJiYgZGV2aWNlX2Nhbl93YWtldXAocHJpdi0+YnVzLT5kZXYpKSB7CisJCWh3LT53aXBoeS0+d293bGFuLmZsYWdzID0gV0lQSFlfV09XTEFOX01BR0lDX1BLVCB8CisJCQkJCSAgV0lQSFlfV09XTEFOX0RJU0NPTk5FQ1QgfAorCQkJCQkgIFdJUEhZX1dPV0xBTl9FQVBfSURFTlRJVFlfUkVRIHwKKwkJCQkJICBXSVBIWV9XT1dMQU5fUkZLSUxMX1JFTEVBU0U7CisJCWlmICghaXdsYWduX21vZF9wYXJhbXMuc3dfY3J5cHRvKQorCQkJaHctPndpcGh5LT53b3dsYW4uZmxhZ3MgfD0KKwkJCQlXSVBIWV9XT1dMQU5fU1VQUE9SVFNfR1RLX1JFS0VZIHwKKwkJCQlXSVBIWV9XT1dMQU5fR1RLX1JFS0VZX0ZBSUxVUkU7CisKKwkJaHctPndpcGh5LT53b3dsYW4ubl9wYXR0ZXJucyA9IElXTEFHTl9XT1dMQU5fTUFYX1BBVFRFUk5TOworCQlody0+d2lwaHktPndvd2xhbi5wYXR0ZXJuX21pbl9sZW4gPQorCQkJCQlJV0xBR05fV09XTEFOX01JTl9QQVRURVJOX0xFTjsKKwkJaHctPndpcGh5LT53b3dsYW4ucGF0dGVybl9tYXhfbGVuID0KKwkJCQkJSVdMQUdOX1dPV0xBTl9NQVhfUEFUVEVSTl9MRU47CisJfQorCisJaWYgKGl3bGFnbl9tb2RfcGFyYW1zLnBvd2VyX3NhdmUpCisJCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOworCWVsc2UKKwkJaHctPndpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwogCiAJaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFBST0JFX09QVElPTl9NQVg7CiAJLyogd2UgY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCBhIHplcm8tbGVuZ3RoIFNTSUQgZWxlbWVudCAqLwpAQCAtMjU1MSw2ICsyMjc5LDQ3MSBAQAogCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwogfQogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGl3bGFnbl9zZW5kX3BhdHRlcm5zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCQlzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3dsYW4pCit7CisJc3RydWN0IGl3bGFnbl93b3dsYW5fcGF0dGVybnNfY21kICpwYXR0ZXJuX2NtZDsKKwlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gUkVQTFlfV09XTEFOX1BBVFRFUk5TLAorCQkuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWSwKKwkJLmZsYWdzID0gQ01EX1NZTkMsCisJfTsKKwlpbnQgaSwgZXJyOworCisJaWYgKCF3b3dsYW4tPm5fcGF0dGVybnMpCisJCXJldHVybiAwOworCisJY21kLmxlblswXSA9IHNpemVvZigqcGF0dGVybl9jbWQpICsKKwkJCXdvd2xhbi0+bl9wYXR0ZXJucyAqIHNpemVvZihzdHJ1Y3QgaXdsYWduX3dvd2xhbl9wYXR0ZXJuKTsKKworCXBhdHRlcm5fY21kID0ga21hbGxvYyhjbWQubGVuWzBdLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhdHRlcm5fY21kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhdHRlcm5fY21kLT5uX3BhdHRlcm5zID0gY3B1X3RvX2xlMzIod293bGFuLT5uX3BhdHRlcm5zKTsKKworCWZvciAoaSA9IDA7IGkgPCB3b3dsYW4tPm5fcGF0dGVybnM7IGkrKykgeworCQlpbnQgbWFza19sZW4gPSBESVZfUk9VTkRfVVAod293bGFuLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX2xlbiwgOCk7CisKKwkJbWVtY3B5KCZwYXR0ZXJuX2NtZC0+cGF0dGVybnNbaV0ubWFzaywKKwkJCXdvd2xhbi0+cGF0dGVybnNbaV0ubWFzaywgbWFza19sZW4pOworCQltZW1jcHkoJnBhdHRlcm5fY21kLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuLAorCQkJd293bGFuLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuLAorCQkJd293bGFuLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX2xlbik7CisJCXBhdHRlcm5fY21kLT5wYXR0ZXJuc1tpXS5tYXNrX3NpemUgPSBtYXNrX2xlbjsKKwkJcGF0dGVybl9jbWQtPnBhdHRlcm5zW2ldLnBhdHRlcm5fc2l6ZSA9CisJCQl3b3dsYW4tPnBhdHRlcm5zW2ldLnBhdHRlcm5fbGVuOworCX0KKworCWNtZC5kYXRhWzBdID0gcGF0dGVybl9jbWQ7CisJZXJyID0gdHJhbnNfc2VuZF9jbWQoJnByaXYtPnRyYW5zLCAmY21kKTsKKwlrZnJlZShwYXR0ZXJuX2NtZCk7CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3NldF9yZWtleV9kYXRhKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgICAgc3RydWN0IGNmZzgwMjExX2d0a19yZWtleV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJaWYgKGl3bGFnbl9tb2RfcGFyYW1zLnN3X2NyeXB0bykKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOworCisJaWYgKHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnZpZiAhPSB2aWYpCisJCWdvdG8gb3V0OworCisJbWVtY3B5KHByaXYtPmtlaywgZGF0YS0+a2VrLCBOTDgwMjExX0tFS19MRU4pOworCW1lbWNweShwcml2LT5rY2ssIGRhdGEtPmtjaywgTkw4MDIxMV9LQ0tfTEVOKTsKKwlwcml2LT5yZXBsYXlfY3RyID0gY3B1X3RvX2xlNjQoYmU2NF90b19jcHVwKChfX2JlNjQgKikmZGF0YS0+cmVwbGF5X2N0cikpOworCXByaXYtPmhhdmVfcmVrZXlfZGF0YSA9IHRydWU7CisKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Cit9CisKK3N0cnVjdCB3b3dsYW5fa2V5X2RhdGEgeworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7CisJc3RydWN0IGl3bGFnbl93b3dsYW5fcnNjX3RzY19wYXJhbXNfY21kICpyc2NfdHNjOworCXN0cnVjdCBpd2xhZ25fd293bGFuX3RraXBfcGFyYW1zX2NtZCAqdGtpcDsKKwljb25zdCB1OCAqYnNzaWQ7CisJYm9vbCBlcnJvciwgdXNlX3JzY190c2MsIHVzZV90a2lwOworfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQgaXdsYWduX2NvbnZlcnRfcDFrKHUxNiAqcDFrLCBfX2xlMTYgKm91dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJV0xBR05fUDFLX1NJWkU7IGkrKykKKwkJb3V0W2ldID0gY3B1X3RvX2xlMTYocDFrW2ldKTsKK30KKworc3RhdGljIHZvaWQgaXdsYWduX3dvd2xhbl9wcm9ncmFtX2tleXMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwKKwkJCQkgICAgICAgdm9pZCAqX2RhdGEpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IHdvd2xhbl9rZXlfZGF0YSAqZGF0YSA9IF9kYXRhOworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBkYXRhLT5jdHg7CisJc3RydWN0IGFlc19zYyAqYWVzX3NjLCAqYWVzX3R4X3NjID0gTlVMTDsKKwlzdHJ1Y3QgdGtpcF9zYyAqdGtpcF9zYywgKnRraXBfdHhfc2MgPSBOVUxMOworCXN0cnVjdCBpd2xhZ25fcDFrX2NhY2hlICpyeF9wMWtzOworCXU4ICpyeF9taWNfa2V5OworCXN0cnVjdCBpZWVlODAyMTFfa2V5X3NlcSBzZXE7CisJdTMyIGN1cl9yeF9pdjMyID0gMDsKKwl1MTYgcDFrW0lXTEFHTl9QMUtfU0laRV07CisJaW50IHJldCwgaTsKKworCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKworCWlmICgoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKKwkgICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgJiYKKwkgICAgICFzdGEgJiYgIWN0eC0+a2V5X21hcHBpbmdfa2V5cykKKwkJcmV0ID0gaXdsX3NldF9kZWZhdWx0X3dlcF9rZXkocHJpdiwgY3R4LCBrZXkpOworCWVsc2UKKwkJcmV0ID0gaXdsX3NldF9keW5hbWljX2tleShwcml2LCBjdHgsIGtleSwgc3RhKTsKKworCWlmIChyZXQpIHsKKwkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2V0dGluZyBrZXkgZHVyaW5nIHN1c3BlbmQhXG4iKTsKKwkJZGF0YS0+ZXJyb3IgPSB0cnVlOworCX0KKworCXN3aXRjaCAoa2V5LT5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCWlmIChzdGEpIHsKKwkJCXRraXBfc2MgPSBkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy50a2lwLnVuaWNhc3RfcnNjOworCQkJdGtpcF90eF9zYyA9ICZkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy50a2lwLnRzYzsKKworCQkJcnhfcDFrcyA9IGRhdGEtPnRraXAtPnJ4X3VuaTsKKworCQkJaWVlZTgwMjExX2dldF9rZXlfdHhfc2VxKGtleSwgJnNlcSk7CisJCQl0a2lwX3R4X3NjLT5pdjE2ID0gY3B1X3RvX2xlMTYoc2VxLnRraXAuaXYxNik7CisJCQl0a2lwX3R4X3NjLT5pdjMyID0gY3B1X3RvX2xlMzIoc2VxLnRraXAuaXYzMik7CisKKwkJCWllZWU4MDIxMV9nZXRfdGtpcF9wMWtfaXYoa2V5LCBzZXEudGtpcC5pdjMyLCBwMWspOworCQkJaXdsYWduX2NvbnZlcnRfcDFrKHAxaywgZGF0YS0+dGtpcC0+dHgucDFrKTsKKworCQkJbWVtY3B5KGRhdGEtPnRraXAtPm1pY19rZXlzLnR4LAorCQkJICAgICAgICZrZXktPmtleVtOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfVFhfTUlDX0tFWV0sCisJCQkgICAgICAgSVdMQUdOX01JQ19LRVlfU0laRSk7CisKKwkJCXJ4X21pY19rZXkgPSBkYXRhLT50a2lwLT5taWNfa2V5cy5yeF91bmljYXN0OworCQl9IGVsc2UgeworCQkJdGtpcF9zYyA9IGRhdGEtPnJzY190c2MtPmFsbF90c2NfcnNjLnRraXAubXVsdGljYXN0X3JzYzsKKwkJCXJ4X3Axa3MgPSBkYXRhLT50a2lwLT5yeF9tdWx0aTsKKwkJCXJ4X21pY19rZXkgPSBkYXRhLT50a2lwLT5taWNfa2V5cy5yeF9tY2FzdDsKKwkJfQorCisJCS8qCisJCSAqIEZvciBub24tUW9TIHRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYm90aCB0aGUgdUNvZGUgYW5kCisJCSAqIG1hYzgwMjExIHVzZSBUSUQgMCAoYXMgdGhleSBuZWVkIHRvIHRvIGF2b2lkIHJlcGxheSBhdHRhY2tzKQorCQkgKiBmb3IgY2hlY2tpbmcgdGhlIElWIGluIHRoZSBmcmFtZXMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgSVdMQUdOX05VTV9SU0M7IGkrKykgeworCQkJaWVlZTgwMjExX2dldF9rZXlfcnhfc2VxKGtleSwgaSwgJnNlcSk7CisJCQl0a2lwX3NjW2ldLml2MTYgPSBjcHVfdG9fbGUxNihzZXEudGtpcC5pdjE2KTsKKwkJCXRraXBfc2NbaV0uaXYzMiA9IGNwdV90b19sZTMyKHNlcS50a2lwLml2MzIpOworCQkJLyogd3JhcHBpbmcgaXNuJ3QgYWxsb3dlZCwgQVAgbXVzdCByZWtleSAqLworCQkJaWYgKHNlcS50a2lwLml2MzIgPiBjdXJfcnhfaXYzMikKKwkJCQljdXJfcnhfaXYzMiA9IHNlcS50a2lwLml2MzI7CisJCX0KKworCQlpZWVlODAyMTFfZ2V0X3RraXBfcnhfcDFrKGtleSwgZGF0YS0+YnNzaWQsIGN1cl9yeF9pdjMyLCBwMWspOworCQlpd2xhZ25fY29udmVydF9wMWsocDFrLCByeF9wMWtzWzBdLnAxayk7CisJCWllZWU4MDIxMV9nZXRfdGtpcF9yeF9wMWsoa2V5LCBkYXRhLT5ic3NpZCwKKwkJCQkJICBjdXJfcnhfaXYzMiArIDEsIHAxayk7CisJCWl3bGFnbl9jb252ZXJ0X3AxayhwMWssIHJ4X3Axa3NbMV0ucDFrKTsKKworCQltZW1jcHkocnhfbWljX2tleSwKKwkJICAgICAgICZrZXktPmtleVtOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfUlhfTUlDX0tFWV0sCisJCSAgICAgICBJV0xBR05fTUlDX0tFWV9TSVpFKTsKKworCQlkYXRhLT51c2VfdGtpcCA9IHRydWU7CisJCWRhdGEtPnVzZV9yc2NfdHNjID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgorCQlpZiAoc3RhKSB7CisJCQl1OCAqcG4gPSBzZXEuY2NtcC5wbjsKKworCQkJYWVzX3NjID0gZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MuYWVzLnVuaWNhc3RfcnNjOworCQkJYWVzX3R4X3NjID0gJmRhdGEtPnJzY190c2MtPmFsbF90c2NfcnNjLmFlcy50c2M7CisKKwkJCWllZWU4MDIxMV9nZXRfa2V5X3R4X3NlcShrZXksICZzZXEpOworCQkJYWVzX3R4X3NjLT5wbiA9IGNwdV90b19sZTY0KAorCQkJCQkodTY0KXBuWzVdIHwKKwkJCQkJKCh1NjQpcG5bNF0gPDwgOCkgfAorCQkJCQkoKHU2NClwblszXSA8PCAxNikgfAorCQkJCQkoKHU2NClwblsyXSA8PCAyNCkgfAorCQkJCQkoKHU2NClwblsxXSA8PCAzMikgfAorCQkJCQkoKHU2NClwblswXSA8PCA0MCkpOworCQl9IGVsc2UKKwkJCWFlc19zYyA9IGRhdGEtPnJzY190c2MtPmFsbF90c2NfcnNjLmFlcy5tdWx0aWNhc3RfcnNjOworCisJCS8qCisJCSAqIEZvciBub24tUW9TIHRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYm90aCB0aGUgdUNvZGUgYW5kCisJCSAqIG1hYzgwMjExIHVzZSBUSUQgMCBmb3IgY2hlY2tpbmcgdGhlIElWIGluIHRoZSBmcmFtZXMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgSVdMQUdOX05VTV9SU0M7IGkrKykgeworCQkJdTggKnBuID0gc2VxLmNjbXAucG47CisKKwkJCWllZWU4MDIxMV9nZXRfa2V5X3J4X3NlcShrZXksIGksICZzZXEpOworCQkJYWVzX3NjLT5wbiA9IGNwdV90b19sZTY0KAorCQkJCQkodTY0KXBuWzVdIHwKKwkJCQkJKCh1NjQpcG5bNF0gPDwgOCkgfAorCQkJCQkoKHU2NClwblszXSA8PCAxNikgfAorCQkJCQkoKHU2NClwblsyXSA8PCAyNCkgfAorCQkJCQkoKHU2NClwblsxXSA8PCAzMikgfAorCQkJCQkoKHU2NClwblswXSA8PCA0MCkpOworCQl9CisJCWRhdGEtPnVzZV9yc2NfdHNjID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19zdXNwZW5kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xhZ25fd293bGFuX3dha2V1cF9maWx0ZXJfY21kIHdha2V1cF9maWx0ZXJfY21kOworCXN0cnVjdCBpd2xfcnhvbl9jbWQgcnhvbjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOworCXN0cnVjdCBpd2xhZ25fd293bGFuX2tla19rY2tfbWF0ZXJpYWxfY21kIGtla19rY2tfY21kOworCXN0cnVjdCBpd2xhZ25fd293bGFuX3RraXBfcGFyYW1zX2NtZCB0a2lwX2NtZCA9IHt9OworCXN0cnVjdCB3b3dsYW5fa2V5X2RhdGEga2V5X2RhdGEgPSB7CisJCS5jdHggPSBjdHgsCisJCS5ic3NpZCA9IGN0eC0+YWN0aXZlLmJzc2lkX2FkZHIsCisJCS51c2VfcnNjX3RzYyA9IGZhbHNlLAorCQkudGtpcCA9ICZ0a2lwX2NtZCwKKwkJLnVzZV90a2lwID0gZmFsc2UsCisJfTsKKwlpbnQgcmV0LCBpOworCXUxNiBzZXE7CisKKwlpZiAoV0FSTl9PTighd293bGFuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisKKwkvKiBEb24ndCBhdHRlbXB0IFdvV0xBTiB3aGVuIG5vdCBhc3NvY2lhdGVkLCB0ZWFyIGRvd24gaW5zdGVhZC4gKi8KKwlpZiAoIWN0eC0+dmlmIHx8IGN0eC0+dmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkgICAgIWl3bF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKSB7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWtleV9kYXRhLnJzY190c2MgPSBremFsbG9jKHNpemVvZigqa2V5X2RhdGEucnNjX3RzYyksIEdGUF9LRVJORUwpOworCWlmICgha2V5X2RhdGEucnNjX3RzYykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoJndha2V1cF9maWx0ZXJfY21kLCAwLCBzaXplb2Yod2FrZXVwX2ZpbHRlcl9jbWQpKTsKKworCS8qCisJICogV2Uga25vdyB0aGUgbGFzdCB1c2VkIHNlcW5vLCBhbmQgdGhlIHVDb2RlIGV4cGVjdHMgdG8ga25vdyB0aGF0CisJICogb25lLCBpdCB3aWxsIGluY3JlbWVudCBiZWZvcmUgVFguCisJICovCisJc2VxID0gbGUxNl90b19jcHUocHJpdi0+bGFzdF9zZXFfY3RsKSAmIElFRUU4MDIxMV9TQ1RMX1NFUTsKKwl3YWtldXBfZmlsdGVyX2NtZC5ub25fcW9zX3NlcSA9IGNwdV90b19sZTE2KHNlcSk7CisKKwkvKgorCSAqIEZvciBRb1MgY291bnRlcnMsIHdlIHN0b3JlIHRoZSBvbmUgdG8gdXNlIG5leHQsIHNvIHN1YnRyYWN0IDB4MTAKKwkgKiBzaW5jZSB0aGUgdUNvZGUgd2lsbCBhZGQgMHgxMCBiZWZvcmUgdXNpbmcgdGhlIHZhbHVlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJc2VxID0gcHJpdi0+c3RhdGlvbnNbSVdMX0FQX0lEXS50aWRbaV0uc2VxX251bWJlcjsKKwkJc2VxIC09IDB4MTA7CisJCXdha2V1cF9maWx0ZXJfY21kLnFvc19zZXFbaV0gPSBjcHVfdG9fbGUxNihzZXEpOworCX0KKworCWlmICh3b3dsYW4tPmRpc2Nvbm5lY3QpCisJCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KKwkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX0JFQUNPTl9NSVNTIHwKKwkJCQkgICAgSVdMQUdOX1dPV0xBTl9XQUtFVVBfTElOS19DSEFOR0UpOworCWlmICh3b3dsYW4tPm1hZ2ljX3BrdCkKKwkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQorCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfTUFHSUNfUEFDS0VUKTsKKwlpZiAod293bGFuLT5ndGtfcmVrZXlfZmFpbHVyZSkKKwkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQorCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfR1RLX1JFS0VZX0ZBSUwpOworCWlmICh3b3dsYW4tPmVhcF9pZGVudGl0eV9yZXEpCisJCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KKwkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX0VBUF9JREVOVF9SRVEpOworCWlmICh3b3dsYW4tPmZvdXJfd2F5X2hhbmRzaGFrZSkKKwkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQorCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfNFdBWV9IQU5EU0hBS0UpOworCWlmICh3b3dsYW4tPnJma2lsbF9yZWxlYXNlKQorCQl3YWtldXBfZmlsdGVyX2NtZC5lbmFibGVkIHw9CisJCQljcHVfdG9fbGUzMihJV0xBR05fV09XTEFOX1dBS0VVUF9SRktJTEwpOworCWlmICh3b3dsYW4tPm5fcGF0dGVybnMpCisJCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KKwkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX1BBVFRFUk5fTUFUQ0gpOworCisJaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKKworCW1lbWNweSgmcnhvbiwgJmN0eC0+YWN0aXZlLCBzaXplb2YocnhvbikpOworCisJdHJhbnNfc3RvcF9kZXZpY2UoJnByaXYtPnRyYW5zKTsKKworCXByaXYtPndvd2xhbiA9IHRydWU7CisKKwlyZXQgPSBpd2xhZ25fbG9hZF91Y29kZV93YWl0X2FsaXZlKHByaXYsICZwcml2LT51Y29kZV93b3dsYW4sCisJCQkJCSAgIElXTF9VQ09ERV9XT1dMQU4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBub3cgY29uZmlndXJlIFdvV0xBTiB1Y29kZSAqLworCXJldCA9IGl3bF9hbGl2ZV9zdGFydChwcml2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJbWVtY3B5KCZjdHgtPnN0YWdpbmcsICZyeG9uLCBzaXplb2YocnhvbikpOworCXJldCA9IGl3bGFnbl9jb21taXRfcnhvbihwcml2LCBjdHgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBpd2xfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWlmICghaXdsYWduX21vZF9wYXJhbXMuc3dfY3J5cHRvKSB7CisJCS8qIG1hcmsgYWxsIGtleXMgY2xlYXIgKi8KKwkJcHJpdi0+dWNvZGVfa2V5X3RhYmxlID0gMDsKKwkJY3R4LT5rZXlfbWFwcGluZ19rZXlzID0gMDsKKworCQkvKgorCQkgKiBUaGlzIG5lZWRzIHRvIGJlIHVubG9ja2VkIGR1ZSB0byBsb2NrIG9yZGVyaW5nCisJCSAqIGNvbnN0cmFpbnRzLiBTaW5jZSB3ZSdyZSBpbiB0aGUgc3VzcGVuZCBwYXRoCisJCSAqIHRoYXQgaXNuJ3QgcmVhbGx5IGEgcHJvYmxlbSB0aG91Z2guCisJCSAqLworCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKwkJaWVlZTgwMjExX2l0ZXJfa2V5cyhwcml2LT5odywgY3R4LT52aWYsCisJCQkJICAgIGl3bGFnbl93b3dsYW5fcHJvZ3JhbV9rZXlzLAorCQkJCSAgICAma2V5X2RhdGEpOworCQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisJCWlmIChrZXlfZGF0YS5lcnJvcikgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpZiAoa2V5X2RhdGEudXNlX3JzY190c2MpIHsKKwkJCXN0cnVjdCBpd2xfaG9zdF9jbWQgcnNjX3RzY19jbWQgPSB7CisJCQkJLmlkID0gUkVQTFlfV09XTEFOX1RTQ19SU0NfUEFSQU1TLAorCQkJCS5mbGFncyA9IENNRF9TWU5DLAorCQkJCS5kYXRhWzBdID0ga2V5X2RhdGEucnNjX3RzYywKKwkJCQkuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWSwKKwkJCQkubGVuWzBdID0gc2l6ZW9mKCprZXlfZGF0YS5yc2NfdHNjKSwKKwkJCX07CisKKwkJCXJldCA9IHRyYW5zX3NlbmRfY21kKCZwcml2LT50cmFucywgJnJzY190c2NfY21kKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlmIChrZXlfZGF0YS51c2VfdGtpcCkgeworCQkJcmV0ID0gdHJhbnNfc2VuZF9jbWRfcGR1KCZwcml2LT50cmFucywKKwkJCQkJCSBSRVBMWV9XT1dMQU5fVEtJUF9QQVJBTVMsCisJCQkJCQkgQ01EX1NZTkMsIHNpemVvZih0a2lwX2NtZCksCisJCQkJCQkgJnRraXBfY21kKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlmIChwcml2LT5oYXZlX3Jla2V5X2RhdGEpIHsKKwkJCW1lbXNldCgma2VrX2tja19jbWQsIDAsIHNpemVvZihrZWtfa2NrX2NtZCkpOworCQkJbWVtY3B5KGtla19rY2tfY21kLmtjaywgcHJpdi0+a2NrLCBOTDgwMjExX0tDS19MRU4pOworCQkJa2VrX2tja19jbWQua2NrX2xlbiA9IGNwdV90b19sZTE2KE5MODAyMTFfS0NLX0xFTik7CisJCQltZW1jcHkoa2VrX2tja19jbWQua2VrLCBwcml2LT5rZWssIE5MODAyMTFfS0VLX0xFTik7CisJCQlrZWtfa2NrX2NtZC5rZWtfbGVuID0gY3B1X3RvX2xlMTYoTkw4MDIxMV9LRUtfTEVOKTsKKwkJCWtla19rY2tfY21kLnJlcGxheV9jdHIgPSBwcml2LT5yZXBsYXlfY3RyOworCisJCQlyZXQgPSB0cmFuc19zZW5kX2NtZF9wZHUoJnByaXYtPnRyYW5zLAorCQkJCQkJIFJFUExZX1dPV0xBTl9LRUtfS0NLX01BVEVSSUFMLAorCQkJCQkJIENNRF9TWU5DLCBzaXplb2Yoa2VrX2tja19jbWQpLAorCQkJCQkJICZrZWtfa2NrX2NtZCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlyZXQgPSB0cmFuc19zZW5kX2NtZF9wZHUoJnByaXYtPnRyYW5zLCBSRVBMWV9XT1dMQU5fV0FLRVVQX0ZJTFRFUiwKKwkJCQkgQ01EX1NZTkMsIHNpemVvZih3YWtldXBfZmlsdGVyX2NtZCksCisJCQkJICZ3YWtldXBfZmlsdGVyX2NtZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGl3bGFnbl9zZW5kX3BhdHRlcm5zKHByaXYsIHdvd2xhbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShwcml2LT5idXMtPmRldiwgdHJ1ZSk7CisKKwkvKiBOb3cgbGV0IHRoZSB1Y29kZSBvcGVyYXRlIG9uIGl0cyBvd24gKi8KKwlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9TRVQsCisJCQkgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9EM19DRkdfQ09NUExFVEUpOworCisJZ290byBvdXQ7CisKKyBlcnJvcjoKKwlwcml2LT53b3dsYW4gPSBmYWxzZTsKKwlpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KHByaXYpOworCWllZWU4MDIxMV9yZXN0YXJ0X2h3KHByaXYtPmh3KTsKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CisJa2ZyZWUoa2V5X2RhdGEucnNjX3RzYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3Jlc3VtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgYmFzZSwgc3RhdHVzID0gMHhmZmZmZmZmZjsKKwlpbnQgcmV0ID0gLUVJTzsKKworCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKworCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwKKwkJCSAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0QzX0NGR19DT01QTEVURSk7CisKKwliYXNlID0gcHJpdi0+ZGV2aWNlX3BvaW50ZXJzLmVycm9yX2V2ZW50X3RhYmxlOworCWlmIChpd2xhZ25faHdfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJcmV0ID0gaXdsX2dyYWJfbmljX2FjY2Vzc19zaWxlbnQocHJpdik7CisJCWlmIChyZXQgPT0gMCkgeworCQkJaXdsX3dyaXRlMzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwgYmFzZSk7CisJCQlzdGF0dXMgPSBpd2xfcmVhZDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7CisJCQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCisJCWlmIChyZXQgPT0gMCkgeworCQkJaWYgKCFwcml2LT53b3dsYW5fc3JhbSkKKwkJCQlwcml2LT53b3dsYW5fc3JhbSA9CisJCQkJCWt6YWxsb2MocHJpdi0+dWNvZGVfd293bGFuLmRhdGEubGVuLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisKKwkJCWlmIChwcml2LT53b3dsYW5fc3JhbSkKKwkJCQlfaXdsX3JlYWRfdGFyZ19tZW1fd29yZHMoCisJCQkJCXByaXYsIDB4ODAwMDAwLCBwcml2LT53b3dsYW5fc3JhbSwKKwkJCQkJcHJpdi0+dWNvZGVfd293bGFuLmRhdGEubGVuIC8gNCk7CisJCX0KKyNlbmRpZgorCX0KKworCS8qIHdlJ2xsIGNsZWFyIGN0eC0+dmlmIGR1cmluZyBpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KCkgKi8KKwl2aWYgPSBjdHgtPnZpZjsKKworCXByaXYtPndvd2xhbiA9IGZhbHNlOworCisJZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKHByaXYtPmJ1cy0+ZGV2LCBmYWxzZSk7CisKKwlpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KHByaXYpOworCisJbWVtc2V0KCh2b2lkICopJmN0eC0+YWN0aXZlLCAwLCBzaXplb2YoY3R4LT5hY3RpdmUpKTsKKwlpd2xfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhwcml2LCBjdHgpOworCWl3bGFnbl9zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOworCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CisKKwlpZWVlODAyMTFfcmVzdW1lX2Rpc2Nvbm5lY3QodmlmKTsKKworCXJldHVybiAxOworfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIGl3bGFnbl9tYWNfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CkBAIC0yNTczLDE0ICsyNzY2LDggQEAKIAkJCQkgICAgICAgdTMyIGl2MzIsIHUxNiAqcGhhc2Uxa2V5KQogewogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwogCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlpd2xfdXBkYXRlX3RraXBfa2V5KHByaXYsIHZpZl9wcml2LT5jdHgsIGtleWNvbmYsIHN0YSwKLQkJCSAgICBpdjMyLCBwaGFzZTFrZXkpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisJaXdsX3VwZGF0ZV90a2lwX2tleShwcml2LCB2aWYsIGtleWNvbmYsIHN0YSwgaXYzMiwgcGhhc2Uxa2V5KTsKIH0KIAogc3RhdGljIGludCBpd2xhZ25fbWFjX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLApAQCAtMjU5Miw3ICsyNzc5LDYgQEAKIAlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gdmlmX3ByaXYtPmN0eDsKIAlpbnQgcmV0OwotCXU4IHN0YV9pZDsKIAlib29sIGlzX2RlZmF1bHRfd2VwX2tleSA9IGZhbHNlOwogCiAJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CkBAIC0yNjAzLDIwICsyNzg5LDI3IEBACiAJfQogCiAJLyoKLQkgKiBUbyBzdXBwb3J0IElCU1MgUlNOLCBkb24ndCBwcm9ncmFtIGdyb3VwIGtleXMgaW4gSUJTUywgdGhlCi0JICogaGFyZHdhcmUgd2lsbCB0aGVuIG5vdCBhdHRlbXB0IHRvIGRlY3J5cHQgdGhlIGZyYW1lcy4KKwkgKiBXZSBjb3VsZCBwcm9ncmFtIHRoZXNlIGtleXMgaW50byB0aGUgaGFyZHdhcmUgYXMgd2VsbCwgYnV0IHdlCisJICogZG9uJ3QgZXhwZWN0IG11Y2ggbXVsdGljYXN0IHRyYWZmaWMgaW4gSUJTUyBhbmQgaGF2aW5nIGtleXMKKwkgKiBmb3IgbW9yZSBzdGF0aW9ucyBpcyBwcm9iYWJseSBtb3JlIHVzZWZ1bC4KKwkgKgorCSAqIE1hcmsga2V5IFRYLW9ubHkgYW5kIHJldHVybiAwLgogCSAqLwogCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKLQkgICAgIShrZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCSAgICAhKGtleS0+ZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfUEFJUldJU0UpKSB7CisJCWtleS0+aHdfa2V5X2lkeCA9IFdFUF9JTlZBTElEX09GRlNFVDsKKwkJcmV0dXJuIDA7CisJfQogCi0Jc3RhX2lkID0gaXdsX3N0YV9pZF9vcl9icm9hZGNhc3QocHJpdiwgdmlmX3ByaXYtPmN0eCwgc3RhKTsKLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCi0JCXJldHVybiAtRUlOVkFMOworCS8qIElmIHRoZXkga2V5IHdhcyBUWC1vbmx5LCBhY2NlcHQgZGVsZXRpb24gKi8KKwlpZiAoY21kID09IERJU0FCTEVfS0VZICYmIGtleS0+aHdfa2V5X2lkeCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQpCisJCXJldHVybiAwOwogCiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwogCWl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDEwMCk7CiAKKwlCVUlMRF9CVUdfT04oV0VQX0lOVkFMSURfT0ZGU0VUID09IElXTEFHTl9IV19LRVlfREVGQVVMVCk7CisKIAkvKgogCSAqIElmIHdlIGFyZSBnZXR0aW5nIFdFUCBncm91cCBrZXkgYW5kIHdlIGRpZG4ndCByZWNlaXZlIGFueSBrZXkgbWFwcGluZwogCSAqIHNvIGZhciwgd2UgYXJlIGluIGxlZ2FjeSB3ZXAgbW9kZSAoZ3JvdXAga2V5IG9ubHkpLCBvdGhlcndpc2Ugd2UgYXJlCkBAIC0yNjI0LDIyICsyODE3LDMwIEBACiAJICogSW4gbGVnYWN5IHdlcCBtb2RlLCB3ZSB1c2UgYW5vdGhlciBob3N0IGNvbW1hbmQgdG8gdGhlIHVDb2RlLgogCSAqLwogCWlmICgoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkgICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgJiYKLQkgICAgIXN0YSkgeworCSAgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSAmJiAhc3RhKSB7CiAJCWlmIChjbWQgPT0gU0VUX0tFWSkKIAkJCWlzX2RlZmF1bHRfd2VwX2tleSA9ICFjdHgtPmtleV9tYXBwaW5nX2tleXM7CiAJCWVsc2UKIAkJCWlzX2RlZmF1bHRfd2VwX2tleSA9Ci0JCQkJCShrZXktPmh3X2tleV9pZHggPT0gSFdfS0VZX0RFRkFVTFQpOworCQkJCWtleS0+aHdfa2V5X2lkeCA9PSBJV0xBR05fSFdfS0VZX0RFRkFVTFQ7CiAJfQogCisKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0VUX0tFWToKLQkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkKKwkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkgewogCQkJcmV0ID0gaXdsX3NldF9kZWZhdWx0X3dlcF9rZXkocHJpdiwgdmlmX3ByaXYtPmN0eCwga2V5KTsKLQkJZWxzZQotCQkJcmV0ID0gaXdsX3NldF9keW5hbWljX2tleShwcml2LCB2aWZfcHJpdi0+Y3R4LAotCQkJCQkJICBrZXksIHN0YV9pZCk7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBpd2xfc2V0X2R5bmFtaWNfa2V5KHByaXYsIHZpZl9wcml2LT5jdHgsIGtleSwgc3RhKTsKKwkJaWYgKHJldCkgeworCQkJLyoKKwkJCSAqIGNhbid0IGFkZCBrZXkgZm9yIFJYLCBidXQgd2UgZG9uJ3QgbmVlZCBpdAorCQkJICogaW4gdGhlIGRldmljZSBmb3IgVFggc28gc3RpbGwgcmV0dXJuIDAKKwkJCSAqLworCQkJcmV0ID0gMDsKKwkJCWtleS0+aHdfa2V5X2lkeCA9IFdFUF9JTlZBTElEX09GRlNFVDsKKwkJfQogCiAJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW5hYmxlIGh3Y3J5cHRvIGtleVxuIik7CiAJCWJyZWFrOwpAQCAtMjY0Nyw3ICsyODQ4LDcgQEAKIAkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkKIAkJCXJldCA9IGl3bF9yZW1vdmVfZGVmYXVsdF93ZXBfa2V5KHByaXYsIGN0eCwga2V5KTsKIAkJZWxzZQotCQkJcmV0ID0gaXdsX3JlbW92ZV9keW5hbWljX2tleShwcml2LCBjdHgsIGtleSwgc3RhX2lkKTsKKwkJCXJldCA9IGl3bF9yZW1vdmVfZHluYW1pY19rZXkocHJpdiwgY3R4LCBrZXksIHN0YSk7CiAKIAkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJkaXNhYmxlIGh3Y3J5cHRvIGtleVxuIik7CiAJCWJyZWFrOwpAQCAtMjY3NCw3ICsyODc1LDcgQEAKIAlJV0xfREVCVUdfSFQocHJpdiwgIkEtTVBEVSBhY3Rpb24gb24gYWRkciAlcE0gdGlkICVkXG4iLAogCQkgICAgIHN0YS0+YWRkciwgdGlkKTsKIAotCWlmICghKHByaXYtPmNmZy0+c2t1ICYgSVdMX1NLVV9OKSkKKwlpZiAoIShwcml2LT5jZmctPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUpKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKQEAgLTI2OTQsMjkgKzI4OTUsMjYgQEAKIAkJSVdMX0RFQlVHX0hUKHByaXYsICJzdGFydCBUeFxuIik7CiAJCXJldCA9IGl3bGFnbl90eF9hZ2dfc3RhcnQocHJpdiwgdmlmLCBzdGEsIHRpZCwgc3NuKTsKIAkJaWYgKHJldCA9PSAwKSB7Ci0JCQlwcml2LT5fYWduLmFnZ190aWRzX2NvdW50Kys7Ci0JCQlJV0xfREVCVUdfSFQocHJpdiwgInByaXYtPl9hZ24uYWdnX3RpZHNfY291bnQgPSAldVxuIiwKLQkJCQkgICAgIHByaXYtPl9hZ24uYWdnX3RpZHNfY291bnQpOworCQkJcHJpdi0+YWdnX3RpZHNfY291bnQrKzsKKwkJCUlXTF9ERUJVR19IVChwcml2LCAicHJpdi0+YWdnX3RpZHNfY291bnQgPSAldVxuIiwKKwkJCQkgICAgIHByaXYtPmFnZ190aWRzX2NvdW50KTsKIAkJfQogCQlicmVhazsKIAljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QOgogCQlJV0xfREVCVUdfSFQocHJpdiwgInN0b3AgVHhcbiIpOwogCQlyZXQgPSBpd2xhZ25fdHhfYWdnX3N0b3AocHJpdiwgdmlmLCBzdGEsIHRpZCk7Ci0JCWlmICgocmV0ID09IDApICYmIChwcml2LT5fYWduLmFnZ190aWRzX2NvdW50ID4gMCkpIHsKLQkJCXByaXYtPl9hZ24uYWdnX3RpZHNfY291bnQtLTsKLQkJCUlXTF9ERUJVR19IVChwcml2LCAicHJpdi0+X2Fnbi5hZ2dfdGlkc19jb3VudCA9ICV1XG4iLAotCQkJCSAgICAgcHJpdi0+X2Fnbi5hZ2dfdGlkc19jb3VudCk7CisJCWlmICgocmV0ID09IDApICYmIChwcml2LT5hZ2dfdGlkc19jb3VudCA+IDApKSB7CisJCQlwcml2LT5hZ2dfdGlkc19jb3VudC0tOworCQkJSVdMX0RFQlVHX0hUKHByaXYsICJwcml2LT5hZ2dfdGlkc19jb3VudCA9ICV1XG4iLAorCQkJCSAgICAgcHJpdi0+YWdnX3RpZHNfY291bnQpOwogCQl9CiAJCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKIAkJCXJldCA9IDA7CiAJCWlmIChwcml2LT5jZmctPmh0X3BhcmFtcyAmJgogCQkgICAgcHJpdi0+Y2ZnLT5odF9wYXJhbXMtPnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uKSB7Ci0JCQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPQotCQkJCSh2b2lkICopIHN0YS0+ZHJ2X3ByaXY7CiAJCQkvKgogCQkJICogc3dpdGNoIG9mZiBSVFMvQ1RTIGlmIGl0IHdhcyBwcmV2aW91c2x5IGVuYWJsZWQKIAkJCSAqLwotCiAJCQlzdGFfcHJpdi0+bHFfc3RhLmxxLmdlbmVyYWxfcGFyYW1zLmZsYWdzICY9CiAJCQkJfkxJTktfUVVBTF9GTEFHU19TRVRfU1RBX1RMQ19SVFNfTVNLOwogCQkJaXdsX3NlbmRfbHFfY21kKHByaXYsIGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpLApAQCAtMjcyNiw3ICsyOTI0LDggQEAKIAljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTDoKIAkJYnVmX3NpemUgPSBtaW5fdChpbnQsIGJ1Zl9zaXplLCBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRik7CiAKLQkJaXdsYWduX3R4cV9hZ2dfcXVldWVfc2V0dXAocHJpdiwgc3RhLCB0aWQsIGJ1Zl9zaXplKTsKKwkJdHJhbnNfdHhxX2FnZ19zZXR1cCgmcHJpdi0+dHJhbnMsIGl3bF9zdGFfaWQoc3RhKSwgdGlkLAorCQkJCWJ1Zl9zaXplKTsKIAogCQkvKgogCQkgKiBJZiB0aGUgbGltaXQgaXMgMCwgdGhlbiBpdCB3YXNuJ3QgaW5pdGlhbGlzZWQgeWV0LApAQCAtMjc2NCw2ICsyOTYzLDkgQEAKIAogCQlpd2xfc2VuZF9scV9jbWQocHJpdiwgaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZiksCiAJCQkJJnN0YV9wcml2LT5scV9zdGEubHEsIENNRF9BU1lOQywgZmFsc2UpOworCisJCUlXTF9JTkZPKHByaXYsICJUeCBhZ2dyZWdhdGlvbiBlbmFibGVkIG9uIHJhID0gJXBNIHRpZCA9ICVkXG4iLAorCQkJIHN0YS0+YWRkciwgdGlkKTsKIAkJcmV0ID0gMDsKIAkJYnJlYWs7CiAJfQpAQCAtMjgzMyw3ICszMDM1LDYgQEAKIAkgKi8KIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwogCXUxNiBjaDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAogCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwogCkBAIC0yODQzLDczICszMDQ0LDczIEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpCisJICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlnb3RvIG91dDsKIAogCWlmICghaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCiAJCWdvdG8gb3V0OwogCi0JLyogY2hhbm5lbCBzd2l0Y2ggaW4gcHJvZ3Jlc3MgKi8KLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzID09IHRydWUpCisJaWYgKCFwcml2LT5jZmctPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKQogCQlnb3RvIG91dDsKIAotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gpIHsKKwljaCA9IGNoYW5uZWwtPmh3X3ZhbHVlOworCWlmIChsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSA9PSBjaCkKKwkJZ290byBvdXQ7CiAKLQkJY2ggPSBjaGFubmVsLT5od192YWx1ZTsKLQkJaWYgKGxlMTZfdG9fY3B1KGN0eC0+YWN0aXZlLmNoYW5uZWwpICE9IGNoKSB7Ci0JCQljaF9pbmZvID0gaXdsX2dldF9jaGFubmVsX2luZm8ocHJpdiwKLQkJCQkJCSAgICAgICBjaGFubmVsLT5iYW5kLAotCQkJCQkJICAgICAgIGNoKTsKLQkJCWlmICghaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkgewotCQkJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiaW52YWxpZCBjaGFubmVsXG4iKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkJCXByaXYtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPSBjb25mLT5zbXBzX21vZGU7Ci0KLQkJCS8qIENvbmZpZ3VyZSBIVDQwIGNoYW5uZWxzICovCi0JCQljdHgtPmh0LmVuYWJsZWQgPSBjb25mX2lzX2h0KGNvbmYpOwotCQkJaWYgKGN0eC0+aHQuZW5hYmxlZCkgewotCQkJCWlmIChjb25mX2lzX2h0NDBfbWludXMoY29uZikpIHsKLQkJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c7Ci0JCQkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKLQkJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU7Ci0JCQkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KLQkJCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU7Ci0JCQkJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7Ci0KLQkJCWlmICgobGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpICE9IGNoKSkKLQkJCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOwotCi0JCQlpd2xfc2V0X3J4b25fY2hhbm5lbChwcml2LCBjaGFubmVsLCBjdHgpOwotCQkJaXdsX3NldF9yeG9uX2h0KHByaXYsIGh0X2NvbmYpOwotCQkJaXdsX3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIGNoYW5uZWwtPmJhbmQsCi0JCQkJCSAgICAgICBjdHgtPnZpZik7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWl3bF9zZXRfcmF0ZShwcml2KTsKLQkJCS8qCi0JCQkgKiBhdCB0aGlzIHBvaW50LCBzdGFnaW5nX3J4b24gaGFzIHRoZQotCQkJICogY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbCBzd2l0Y2gKLQkJCSAqLwotCQkJaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChwcml2LAotCQkJCQkJCQkgICAgY2hfc3dpdGNoKSkKLQkJCQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLQkJfQorCWNoX2luZm8gPSBpd2xfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBjaGFubmVsLT5iYW5kLCBjaCk7CisJaWYgKCFpc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7CisJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiaW52YWxpZCBjaGFubmVsXG4iKTsKKwkJZ290byBvdXQ7CiAJfQorCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gY29uZi0+c21wc19tb2RlOworCisJLyogQ29uZmlndXJlIEhUNDAgY2hhbm5lbHMgKi8KKwljdHgtPmh0LmVuYWJsZWQgPSBjb25mX2lzX2h0KGNvbmYpOworCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKKwkJaWYgKGNvbmZfaXNfaHQ0MF9taW51cyhjb25mKSkgeworCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOworCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7CisJCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKKwkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKKwkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOworCQl9IGVsc2UgeworCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU7CisJCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7CisJCX0KKwl9IGVsc2UKKwkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOworCisJaWYgKChsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCkgIT0gY2gpKQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOworCisJaXdsX3NldF9yeG9uX2NoYW5uZWwocHJpdiwgY2hhbm5lbCwgY3R4KTsKKwlpd2xfc2V0X3J4b25faHQocHJpdiwgaHRfY29uZik7CisJaXdsX3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIGNoYW5uZWwtPmJhbmQsIGN0eC0+dmlmKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlpd2xfc2V0X3JhdGUocHJpdik7CisJLyoKKwkgKiBhdCB0aGlzIHBvaW50LCBzdGFnaW5nX3J4b24gaGFzIHRoZQorCSAqIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwgc3dpdGNoCisJICovCisJc2V0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cyk7CisJcHJpdi0+c3dpdGNoX2NoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7CisJaWYgKHByaXYtPmNmZy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gocHJpdiwgY2hfc3dpdGNoKSkgeworCQljbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOworCQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IDA7CisJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7CisJfQorCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKCFwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MpCi0JCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7CiAJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CiB9CiAKQEAgLTI5NzAsMTAgKzMxNzEsNiBAQAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKIAotCS8qIGRvIG5vdCBzdXBwb3J0ICJmbHVzaCIgKi8KLQlpZiAoIXByaXYtPmNmZy0+b3BzLT5saWItPnR4Zmlmb19mbHVzaCkKLQkJZ290byBkb25lOwotCiAJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKSB7CiAJCUlXTF9ERUJVR19UWChwcml2LCAiQWJvcnRpbmcgZmx1c2ggZHVlIHRvIGRldmljZSBzaHV0ZG93blxuIik7CiAJCWdvdG8gZG9uZTsKQEAgLTI5ODksNyArMzE4Niw3IEBACiAJICovCiAJaWYgKGRyb3ApIHsKIAkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJzZW5kIGZsdXNoIGNvbW1hbmRcbiIpOwotCQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhmaWZvX2ZsdXNoKHByaXYsIElXTF9EUk9QX0FMTCkpIHsKKwkJaWYgKGl3bGFnbl90eGZpZm9fZmx1c2gocHJpdiwgSVdMX0RST1BfQUxMKSkgewogCQkJSVdMX0VSUihwcml2LCAiZmx1c2ggcmVxdWVzdCBmYWlsXG4iKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQpAQCAtMzAxNiw5ICszMjEzLDkgQEAKIAlpd2xfc2V0X3J4b25fY2hhbm5lbChwcml2LCBjaGFuLCBjdHgpOwogCWl3bF9zZXRfZmxhZ3NfZm9yX2JhbmQocHJpdiwgY3R4LCBjaGFuLT5iYW5kLCBOVUxMKTsKIAotCXByaXYtPl9hZ24uaHdfcm9jX2NoYW5uZWwgPSBOVUxMOworCXByaXYtPmh3X3JvY19jaGFubmVsID0gTlVMTDsKIAotCWl3bGNvcmVfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKKwlpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKIAogCWN0eC0+aXNfYWN0aXZlID0gZmFsc2U7CiB9CkBAIC0zMDI2LDcgKzMyMjMsNyBAQAogc3RhdGljIHZvaWQgaXdsYWduX2JnX3JvY19kb25lKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGl3bF9wcml2LAotCQkJCQkgICAgIF9hZ24uaHdfcm9jX3dvcmsud29yayk7CisJCQkJCSAgICAgaHdfcm9jX3dvcmsud29yayk7CiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CiAJaWVlZTgwMjExX3JlbWFpbl9vbl9jaGFubmVsX2V4cGlyZWQocHJpdi0+aHcpOwpAQCAtMzA1OCwxMSArMzI1NSwxMSBAQAogCX0KIAogCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9QQU5dLmlzX2FjdGl2ZSA9IHRydWU7Ci0JcHJpdi0+X2Fnbi5od19yb2NfY2hhbm5lbCA9IGNoYW5uZWw7Ci0JcHJpdi0+X2Fnbi5od19yb2NfY2hhbnR5cGUgPSBjaGFubmVsX3R5cGU7Ci0JcHJpdi0+X2Fnbi5od19yb2NfZHVyYXRpb24gPSBESVZfUk9VTkRfVVAoZHVyYXRpb24gKiAxMDAwLCAxMDI0KTsKLQlpd2xjb3JlX2NvbW1pdF9yeG9uKHByaXYsICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfUEFOXSk7Ci0JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPl9hZ24uaHdfcm9jX3dvcmssCisJcHJpdi0+aHdfcm9jX2NoYW5uZWwgPSBjaGFubmVsOworCXByaXYtPmh3X3JvY19jaGFudHlwZSA9IGNoYW5uZWxfdHlwZTsKKwlwcml2LT5od19yb2NfZHVyYXRpb24gPSBESVZfUk9VTkRfVVAoZHVyYXRpb24gKiAxMDAwLCAxMDI0KTsKKwlpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9QQU5dKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+aHdfcm9jX3dvcmssCiAJCQkgICBtc2Vjc190b19qaWZmaWVzKGR1cmF0aW9uICsgMjApKTsKIAogCW1zbGVlcChJV0xfTUlOX1NMT1RfVElNRSk7IC8qIFRVIGlzIGFsbW9zdCBtcyAqLwpAQCAtMzA4MSw3ICszMjc4LDcgQEAKIAlpZiAoIShwcml2LT52YWxpZF9jb250ZXh0cyAmIEJJVChJV0xfUlhPTl9DVFhfUEFOKSkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+X2Fnbi5od19yb2Nfd29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5od19yb2Nfd29yayk7CiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CiAJaXdsYWduX2Rpc2FibGVfcm9jKHByaXYpOwpAQCAtMzEwMywxOCArMzMwMCwxNyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7CiAKIAlJTklUX1dPUksoJnByaXYtPnJlc3RhcnQsIGl3bF9iZ19yZXN0YXJ0KTsKLQlJTklUX1dPUksoJnByaXYtPnJ4X3JlcGxlbmlzaCwgaXdsX2JnX3J4X3JlcGxlbmlzaCk7CiAJSU5JVF9XT1JLKCZwcml2LT5iZWFjb25fdXBkYXRlLCBpd2xfYmdfYmVhY29uX3VwZGF0ZSk7CiAJSU5JVF9XT1JLKCZwcml2LT5ydW5fdGltZV9jYWxpYl93b3JrLCBpd2xfYmdfcnVuX3RpbWVfY2FsaWJfd29yayk7CiAJSU5JVF9XT1JLKCZwcml2LT50eF9mbHVzaCwgaXdsX2JnX3R4X2ZsdXNoKTsKIAlJTklUX1dPUksoJnByaXYtPmJ0X2Z1bGxfY29uY3VycmVuY3ksIGl3bF9iZ19idF9mdWxsX2NvbmN1cnJlbmN5KTsKIAlJTklUX1dPUksoJnByaXYtPmJ0X3J1bnRpbWVfY29uZmlnLCBpd2xfYmdfYnRfcnVudGltZV9jb25maWcpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5fYWduLmh3X3JvY193b3JrLCBpd2xhZ25fYmdfcm9jX2RvbmUpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5od19yb2Nfd29yaywgaXdsYWduX2JnX3JvY19kb25lKTsKIAogCWl3bF9zZXR1cF9zY2FuX2RlZmVycmVkX3dvcmsocHJpdik7CiAKLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0dXBfZGVmZXJyZWRfd29yaykKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0dXBfZGVmZXJyZWRfd29yayhwcml2KTsKKwlpZiAocHJpdi0+Y2ZnLT5saWItPmJ0X3NldHVwX2RlZmVycmVkX3dvcmspCisJCXByaXYtPmNmZy0+bGliLT5idF9zZXR1cF9kZWZlcnJlZF93b3JrKHByaXYpOwogCiAJaW5pdF90aW1lcigmcHJpdi0+c3RhdGlzdGljc19wZXJpb2RpYyk7CiAJcHJpdi0+c3RhdGlzdGljc19wZXJpb2RpYy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcHJpdjsKQEAgLTMxMjcsMTUgKzMzMjMsMTIgQEAKIAlpbml0X3RpbWVyKCZwcml2LT53YXRjaGRvZyk7CiAJcHJpdi0+d2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXByaXY7CiAJcHJpdi0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBpd2xfYmdfd2F0Y2hkb2c7Ci0KLQl0YXNrbGV0X2luaXQoJnByaXYtPmlycV90YXNrbGV0LCAodm9pZCAoKikodW5zaWduZWQgbG9uZykpCi0JCWl3bF9pcnFfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcHJpdik7CiB9CiAKIHN0YXRpYyB2b2lkIGl3bF9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPmNhbmNlbF9kZWZlcnJlZF93b3JrKQotCQlwcml2LT5jZmctPm9wcy0+bGliLT5jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKKwlpZiAocHJpdi0+Y2ZnLT5saWItPmNhbmNlbF9kZWZlcnJlZF93b3JrKQorCQlwcml2LT5jZmctPmxpYi0+Y2FuY2VsX2RlZmVycmVkX3dvcmsocHJpdik7CiAKIAljYW5jZWxfd29ya19zeW5jKCZwcml2LT5ydW5fdGltZV9jYWxpYl93b3JrKTsKIAljYW5jZWxfd29ya19zeW5jKCZwcml2LT5iZWFjb25fdXBkYXRlKTsKQEAgLTMxODYsNyArMzM3OSw3IEBACiAJcHJpdi0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CiAJcHJpdi0+Y3VycmVudF9odF9jb25maWcuc21wcyA9IElFRUU4MDIxMV9TTVBTX1NUQVRJQzsKIAlwcml2LT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCA9IElXTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9ERUY7Ci0JcHJpdi0+X2Fnbi5hZ2dfdGlkc19jb3VudCA9IDA7CisJcHJpdi0+YWdnX3RpZHNfY291bnQgPSAwOwogCiAJLyogaW5pdGlhbGl6ZSBmb3JjZSByZXNldCAqLwogCXByaXYtPmZvcmNlX3Jlc2V0W0lXTF9SRl9SRVNFVF0ucmVzZXRfZHVyYXRpb24gPQpAQCAtMzE5Nyw5ICszMzkwLDcgQEAKIAlwcml2LT5yeF9zdGF0aXN0aWNzX2ppZmZpZXMgPSBqaWZmaWVzOwogCiAJLyogQ2hvb3NlIHdoaWNoIHJlY2VpdmVycy9hbnRlbm5hcyB0byB1c2UgKi8KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQotCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwKLQkJCQkJJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKTsKKwlpd2xhZ25fc2V0X3J4b25fY2hhaW4ocHJpdiwgJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKTsKIAogCWl3bF9pbml0X3NjYW5fcGFyYW1zKHByaXYpOwogCkBAIC0zMjQyLDEyICszNDMzLDQyIEBACiAJaXdsX2ZyZWVfY2hhbm5lbF9tYXAocHJpdik7CiAJa2ZyZWUocHJpdi0+c2Nhbl9jbWQpOwogCWtmcmVlKHByaXYtPmJlYWNvbl9jbWQpOworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKKwlrZnJlZShwcml2LT53b3dsYW5fc3JhbSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgaXdsX21hY19yc3NpX2NhbGxiYWNrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgZW51bSBpZWVlODAyMTFfcnNzaV9ldmVudCByc3NpX2V2ZW50KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOworCisJaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCisJCQlwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgeworCQlpZiAocnNzaV9ldmVudCA9PSBSU1NJX0VWRU5UX0xPVykKKwkJCXByaXYtPmJ0X2VuYWJsZV9wc3BvbGwgPSB0cnVlOworCQllbHNlIGlmIChyc3NpX2V2ZW50ID09IFJTU0lfRVZFTlRfSElHSCkKKwkJCXByaXYtPmJ0X2VuYWJsZV9wc3BvbGwgPSBmYWxzZTsKKworCQlpd2xhZ25fc2VuZF9hZHZhbmNlX2J0X2NvbmZpZyhwcml2KTsKKwl9IGVsc2UgeworCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgIkFkdmFuY2VkIEJUIGNvZXggZGlzYWJsZWQsIgorCQkJCSJpZ25vcmluZyBSU1NJIGNhbGxiYWNrXG4iKTsKKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIH0KIAogc3RydWN0IGllZWU4MDIxMV9vcHMgaXdsYWduX2h3X29wcyA9IHsKIAkudHggPSBpd2xhZ25fbWFjX3R4LAogCS5zdGFydCA9IGl3bGFnbl9tYWNfc3RhcnQsCiAJLnN0b3AgPSBpd2xhZ25fbWFjX3N0b3AsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBpd2xhZ25fbWFjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGl3bGFnbl9tYWNfcmVzdW1lLAorI2VuZGlmCiAJLmFkZF9pbnRlcmZhY2UgPSBpd2xfbWFjX2FkZF9pbnRlcmZhY2UsCiAJLnJlbW92ZV9pbnRlcmZhY2UgPSBpd2xfbWFjX3JlbW92ZV9pbnRlcmZhY2UsCiAJLmNoYW5nZV9pbnRlcmZhY2UgPSBpd2xfbWFjX2NoYW5nZV9pbnRlcmZhY2UsCkBAIC0zMjU1LDYgKzM0NzYsNyBAQAogCS5jb25maWd1cmVfZmlsdGVyID0gaXdsYWduX2NvbmZpZ3VyZV9maWx0ZXIsCiAJLnNldF9rZXkgPSBpd2xhZ25fbWFjX3NldF9rZXksCiAJLnVwZGF0ZV90a2lwX2tleSA9IGl3bGFnbl9tYWNfdXBkYXRlX3RraXBfa2V5LAorCS5zZXRfcmVrZXlfZGF0YSA9IGl3bGFnbl9tYWNfc2V0X3Jla2V5X2RhdGEsCiAJLmNvbmZfdHggPSBpd2xfbWFjX2NvbmZfdHgsCiAJLmJzc19pbmZvX2NoYW5nZWQgPSBpd2xhZ25fYnNzX2luZm9fY2hhbmdlZCwKIAkuYW1wZHVfYWN0aW9uID0gaXdsYWduX21hY19hbXBkdV9hY3Rpb24sCkBAIC0zMjY5LDE1ICszNDkxLDEzIEBACiAJLmNhbmNlbF9yZW1haW5fb25fY2hhbm5lbCA9IGl3bF9tYWNfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsLAogCS5vZmZjaGFubmVsX3R4ID0gaXdsX21hY19vZmZjaGFubmVsX3R4LAogCS5vZmZjaGFubmVsX3R4X2NhbmNlbF93YWl0ID0gaXdsX21hY19vZmZjaGFubmVsX3R4X2NhbmNlbF93YWl0LAorCS5yc3NpX2NhbGxiYWNrID0gaXdsX21hY19yc3NpX2NhbGxiYWNrLAogCUNGRzgwMjExX1RFU1RNT0RFX0NNRChpd2xfdGVzdG1vZGVfY21kKQorCUNGRzgwMjExX1RFU1RNT0RFX0RVTVAoaXdsX3Rlc3Rtb2RlX2R1bXApCiB9OwogCiBzdGF0aWMgdTMyIGl3bF9od19kZXRlY3Qoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCXU4IHJldl9pZDsKLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHByaXYtPnBjaV9kZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldl9pZCk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkhXIFJldmlzaW9uIElEID0gMHglWFxuIiwgcmV2X2lkKTsKIAlyZXR1cm4gaXdsX3JlYWQzMihwcml2LCBDU1JfSFdfUkVWKTsKIH0KIApAQCAtMzI5MywxMCArMzUxMywxMCBAQAogCXByaXYtPmh3X3BhcmFtcy5tYXhfYmVhY29uX2l0cnZsID0gSVdMX01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUw7CiAKIAlpZiAoaXdsYWduX21vZF9wYXJhbXMuZGlzYWJsZV8xMW4pCi0JCXByaXYtPmNmZy0+c2t1ICY9IH5JV0xfU0tVX047CisJCXByaXYtPmNmZy0+c2t1ICY9IH5FRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFOwogCiAJLyogRGV2aWNlLXNwZWNpZmljIHNldHVwICovCi0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5saWItPnNldF9od19wYXJhbXMocHJpdik7CisJcmV0dXJuIHByaXYtPmNmZy0+bGliLT5zZXRfaHdfcGFyYW1zKHByaXYpOwogfQogCiBzdGF0aWMgY29uc3QgdTggaXdsYWduX2Jzc19hY190b19maWZvW10gPSB7CkBAIC0zMzQzLDI5ICszNTYzLDkgQEAKIAlyZXR1cm4gaHc7CiB9CiAKLXN0YXRpYyBpbnQgaXdsX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3N0YXRpYyB2b2lkIGl3bF9pbml0X2NvbnRleHQoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCWludCBlcnIgPSAwLCBpOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKLQlzdHJ1Y3QgaXdsX2NmZyAqY2ZnID0gKHN0cnVjdCBpd2xfY2ZnICopKGVudC0+ZHJpdmVyX2RhdGEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IHBjaV9jbWQsIG51bV9tYWM7Ci0JdTMyIGh3X3JldjsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAxLiBBbGxvY2F0aW5nIEhXIGRhdGEKLQkgKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JaHcgPSBpd2xfYWxsb2NfYWxsKGNmZyk7Ci0JaWYgKCFodykgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0JcHJpdiA9IGh3LT5wcml2OwotCS8qIEF0IHRoaXMgcG9pbnQgYm90aCBodyBhbmQgcHJpdiBhcmUgYWxsb2NhdGVkLiAqLwotCi0JcHJpdi0+dWNvZGVfdHlwZSA9IFVDT0RFX1NVQlRZUEVfTk9ORV9MT0FERUQ7CisJaW50IGk7CiAKIAkvKgogCSAqIFRoZSBkZWZhdWx0IGNvbnRleHQgaXMgYWx3YXlzIHZhbGlkLApAQCAtMzM5Nyw4ICszNTk3LDEwIEBACiAJcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10udW51c2VkX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0VTUzsKIAogCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9QQU5dLnJ4b25fY21kID0gUkVQTFlfV0lQQU5fUlhPTjsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfUEFOXS5yeG9uX3RpbWluZ19jbWQgPSBSRVBMWV9XSVBBTl9SWE9OX1RJTUlORzsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfUEFOXS5yeG9uX2Fzc29jX2NtZCA9IFJFUExZX1dJUEFOX1JYT05fQVNTT0M7CisJcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX1BBTl0ucnhvbl90aW1pbmdfY21kID0KKwkJUkVQTFlfV0lQQU5fUlhPTl9USU1JTkc7CisJcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX1BBTl0ucnhvbl9hc3NvY19jbWQgPQorCQlSRVBMWV9XSVBBTl9SWE9OX0FTU09DOwogCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9QQU5dLnFvc19jbWQgPSBSRVBMWV9XSVBBTl9RT1NfUEFSQU07CiAJcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX1BBTl0uYXBfc3RhX2lkID0gSVdMX0FQX0lEX1BBTjsKIAlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfUEFOXS53ZXBfa2V5X2NtZCA9IFJFUExZX1dJUEFOX1dFUEtFWTsKQEAgLTM0MTgsMTIgKzM2MjAsMzUgQEAKIAlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfUEFOXS51bnVzZWRfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfUDJQOwogCiAJQlVJTERfQlVHX09OKE5VTV9JV0xfUlhPTl9DVFggIT0gMik7Cit9CiAKLQlTRVRfSUVFRTgwMjExX0RFVihodywgJnBkZXYtPmRldik7CitpbnQgaXdsX3Byb2JlKHN0cnVjdCBpd2xfYnVzICpidXMsIHN0cnVjdCBpd2xfY2ZnICpjZmcpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGl3bF9wcml2ICpwcml2OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OworCXUxNiBudW1fbWFjOworCXUzMiBod19yZXY7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqCisJICogMS4gQWxsb2NhdGluZyBIVyBkYXRhCisJICoqKioqKioqKioqKioqKioqKioqKioqKi8KKwlodyA9IGl3bF9hbGxvY19hbGwoY2ZnKTsKKwlpZiAoIWh3KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXByaXYgPSBody0+cHJpdjsKKwlwcml2LT5idXMgPSBidXM7CisJYnVzX3NldF9kcnZfZGF0YShwcml2LT5idXMsIHByaXYpOworCisJLyogQXQgdGhpcyBwb2ludCBib3RoIGh3IGFuZCBwcml2IGFyZSBhbGxvY2F0ZWQuICovCisKKwlTRVRfSUVFRTgwMjExX0RFVihodywgcHJpdi0+YnVzLT5kZXYpOwogCiAJSVdMX0RFQlVHX0lORk8ocHJpdiwgIioqKiBMT0FEIERSSVZFUiAqKipcbiIpOwogCXByaXYtPmNmZyA9IGNmZzsKLQlwcml2LT5wY2lfZGV2ID0gcGRldjsKIAlwcml2LT5pbnRhX21hc2sgPSBDU1JfSU5JX1NFVF9NQVNLOwogCiAJLyogaXMgYW50ZW5uYSBjb3VwbGluZyBtb3JlIHRoYW4gMzVkQiA/ICovCkBAIC0zNDM5LDUzICszNjY0LDYgQEAKIAlpZiAoaXdsX2FsbG9jX3RyYWZmaWNfbWVtKHByaXYpKQogCQlJV0xfRVJSKHByaXYsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBnZW5lcmF0ZSB0cmFmZmljIGxvZ1xuIik7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAyLiBJbml0aWFsaXppbmcgUENJIGJ1cwotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlwY2lfZGlzYWJsZV9saW5rX3N0YXRlKHBkZXYsIFBDSUVfTElOS19TVEFURV9MMFMgfCBQQ0lFX0xJTktfU1RBVEVfTDEgfAotCQkJCVBDSUVfTElOS19TVEFURV9DTEtQTSk7Ci0KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXRfaWVlZTgwMjExX2ZyZWVfaHc7Ci0JfQotCi0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzNikpOwotCWlmICghZXJyKQotCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDM2KSk7Ci0JaWYgKGVycikgewotCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwotCQlpZiAoIWVycikKLQkJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKLQkJLyogYm90aCBhdHRlbXB0cyBmYWlsZWQ6ICovCi0JCWlmIChlcnIpIHsKLQkJCUlXTF9XQVJOKHByaXYsICJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7Ci0JCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7Ci0JCX0KLQl9Ci0KLQllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7Ci0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgcHJpdik7Ci0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDMuIFJlYWQgUkVWIHJlZ2lzdGVyCi0JICoqKioqKioqKioqKioqKioqKioqKioqLwotCXByaXYtPmh3X2Jhc2UgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7Ci0JaWYgKCFwcml2LT5od19iYXNlKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM7Ci0JfQotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInBjaV9yZXNvdXJjZV9sZW4gPSAweCUwOGxseFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInBjaV9yZXNvdXJjZV9iYXNlID0gJXBcbiIsIHByaXYtPmh3X2Jhc2UpOwotCiAJLyogdGhlc2Ugc3BpbiBsb2NrcyB3aWxsIGJlIHVzZWQgaW4gYXBtX29wcy5pbml0IGFuZCBFRVBST00gYWNjZXNzCiAJICogd2Ugc2hvdWxkIGluaXQgbm93CiAJICovCkBAIC0zNDk5LDE3ICszNjc3LDIxIEBACiAJICovCiAJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfTkVWT19SRVNFVCk7CiAKKwkvKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAzLiBSZWFkIFJFViByZWdpc3RlcgorCSAqKioqKioqKioqKioqKioqKioqKioqKi8KIAlod19yZXYgPSBpd2xfaHdfZGV0ZWN0KHByaXYpOwogCUlXTF9JTkZPKHByaXYsICJEZXRlY3RlZCAlcywgUkVWPTB4JVhcbiIsCiAJCXByaXYtPmNmZy0+bmFtZSwgaHdfcmV2KTsKIAotCS8qIFdlIGRpc2FibGUgdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgKDB4NDEpIHRvIGtlZXAKLQkgKiBQQ0kgVHggcmV0cmllcyBmcm9tIGludGVyZmVyaW5nIHdpdGggQzMgQ1BVIHN0YXRlICovCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DRkdfUkVUUllfVElNRU9VVCwgMHgwMCk7CisJZXJyID0gaXdsX3RyYW5zX3JlZ2lzdGVyKCZwcml2LT50cmFucywgcHJpdik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV90cmFmZmljX21lbTsKIAotCWlmIChpd2xfcHJlcGFyZV9jYXJkX2h3KHByaXYpKSB7CisJaWYgKHRyYW5zX3ByZXBhcmVfY2FyZF9odygmcHJpdi0+dHJhbnMpKSB7CisJCWVyciA9IC1FSU87CiAJCUlXTF9XQVJOKHByaXYsICJGYWlsZWQsIEhXIG5vdCByZWFkeVxuIik7Ci0JCWdvdG8gb3V0X2lvdW5tYXA7CisJCWdvdG8gb3V0X2ZyZWVfdHJhbnM7CiAJfQogCiAJLyoqKioqKioqKioqKioqKioqCkBAIC0zNTE5LDcgKzM3MDEsNyBAQAogCWVyciA9IGl3bF9lZXByb21faW5pdChwcml2LCBod19yZXYpOwogCWlmIChlcnIpIHsKIAkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXQgRUVQUk9NXG4iKTsKLQkJZ290byBvdXRfaW91bm1hcDsKKwkJZ290byBvdXRfZnJlZV90cmFuczsKIAl9CiAJZXJyID0gaXdsX2VlcHJvbV9jaGVja192ZXJzaW9uKHByaXYpOwogCWlmIChlcnIpCkBAIC0zNTQyLDEwICszNzI0LDE0IEBACiAJCXByaXYtPmh3LT53aXBoeS0+bl9hZGRyZXNzZXMrKzsKIAl9CiAKKwkvKiBpbml0aWFsaXplIGFsbCB2YWxpZCBjb250ZXh0cyAqLworCWl3bF9pbml0X2NvbnRleHQocHJpdik7CisKIAkvKioqKioqKioqKioqKioqKioqKioqKioqCiAJICogNS4gU2V0dXAgSFcgY29uc3RhbnRzCiAJICoqKioqKioqKioqKioqKioqKioqKioqKi8KIAlpZiAoaXdsX3NldF9od19wYXJhbXMocHJpdikpIHsKKwkJZXJyID0gLUVOT0VOVDsKIAkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNldCBodyBwYXJhbWV0ZXJzXG4iKTsKIAkJZ290byBvdXRfZnJlZV9lZXByb207CiAJfQpAQCAtMzU2MiwzNiArMzc0OCwxNCBAQAogCS8qKioqKioqKioqKioqKioqKioqKgogCSAqIDcuIFNldHVwIHNlcnZpY2VzCiAJICoqKioqKioqKioqKioqKioqKioqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaXdsX2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlwY2lfZW5hYmxlX21zaShwcml2LT5wY2lfZGV2KTsKLQotCWl3bF9hbGxvY19pc3JfaWN0KHByaXYpOwotCi0JZXJyID0gcmVxdWVzdF9pcnEocHJpdi0+cGNpX2Rldi0+aXJxLCBpd2xfaXNyX2ljdCwKLQkJCSAgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBwcml2KTsKLQlpZiAoZXJyKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkXG4iLCBwcml2LT5wY2lfZGV2LT5pcnEpOwotCQlnb3RvIG91dF9kaXNhYmxlX21zaTsKLQl9Ci0KIAlpd2xfc2V0dXBfZGVmZXJyZWRfd29yayhwcml2KTsKIAlpd2xfc2V0dXBfcnhfaGFuZGxlcnMocHJpdik7CiAJaXdsX3Rlc3Rtb2RlX2luaXQocHJpdik7CiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogOC4gRW5hYmxlIGludGVycnVwdHMgYW5kIHJlYWQgUkZLSUxMIHN0YXRlCisJICogOC4gRW5hYmxlIGludGVycnVwdHMKIAkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JLyogZW5hYmxlIHJma2lsbCBpbnRlcnJ1cHQ6IGh3IGJ1ZyB3L2EgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChwcml2LT5wY2lfZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOwotCWlmIChwY2lfY21kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7Ci0JCXBjaV9jbWQgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHByaXYtPnBjaV9kZXYsIFBDSV9DT01NQU5ELCBwY2lfY21kKTsKLQl9Ci0KIAlpd2xfZW5hYmxlX3Jma2lsbF9pbnQocHJpdik7CiAKIAkvKiBJZiBwbGF0Zm9ybSdzIFJGX0tJTEwgc3dpdGNoIGlzIE5PVCBzZXQgdG8gS0lMTCAqLwpAQCAtMzYwNiw3ICszNzcwLDcgQEAKIAlpd2xfcG93ZXJfaW5pdGlhbGl6ZShwcml2KTsKIAlpd2xfdHRfaW5pdGlhbGl6ZShwcml2KTsKIAotCWluaXRfY29tcGxldGlvbigmcHJpdi0+X2Fnbi5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKKwlpbml0X2NvbXBsZXRpb24oJnByaXYtPmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOwogCiAJZXJyID0gaXdsX3JlcXVlc3RfZmlybXdhcmUocHJpdiwgdHJ1ZSk7CiAJaWYgKGVycikKQEAgLTM2MTQsNDQgKzM3NzgsMzIgQEAKIAogCXJldHVybiAwOwogCi0gb3V0X2Rlc3Ryb3lfd29ya3F1ZXVlOgorb3V0X2Rlc3Ryb3lfd29ya3F1ZXVlOgogCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7CiAJcHJpdi0+d29ya3F1ZXVlID0gTlVMTDsKLQlmcmVlX2lycShwcml2LT5wY2lfZGV2LT5pcnEsIHByaXYpOwotCWl3bF9mcmVlX2lzcl9pY3QocHJpdik7Ci0gb3V0X2Rpc2FibGVfbXNpOgotCXBjaV9kaXNhYmxlX21zaShwcml2LT5wY2lfZGV2KTsKIAlpd2xfdW5pbml0X2Rydihwcml2KTsKLSBvdXRfZnJlZV9lZXByb206CitvdXRfZnJlZV9lZXByb206CiAJaXdsX2VlcHJvbV9mcmVlKHByaXYpOwotIG91dF9pb3VubWFwOgotCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmh3X2Jhc2UpOwotIG91dF9wY2lfcmVsZWFzZV9yZWdpb25zOgotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotIG91dF9pZWVlODAyMTFfZnJlZV9odzoKK291dF9mcmVlX3RyYW5zOgorCXRyYW5zX2ZyZWUoJnByaXYtPnRyYW5zKTsKK291dF9mcmVlX3RyYWZmaWNfbWVtOgogCWl3bF9mcmVlX3RyYWZmaWNfbWVtKHByaXYpOwogCWllZWU4MDIxMV9mcmVlX2h3KHByaXYtPmh3KTsKLSBvdXQ6CitvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZleGl0IGl3bF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQordm9pZCBfX2RldmV4aXQgaXdsX3JlbW92ZShzdHJ1Y3QgaXdsX3ByaXYgKiBwcml2KQogewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFwcml2KQotCQlyZXR1cm47Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwcml2LT5fYWduLmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnByaXYtPmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOwogCiAJSVdMX0RFQlVHX0lORk8ocHJpdiwgIioqKiBVTkxPQUQgRFJJVkVSICoqKlxuIik7CiAKIAlpd2xfZGJnZnNfdW5yZWdpc3Rlcihwcml2KTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaXdsX2F0dHJpYnV0ZV9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwcml2LT5idXMtPmRldi0+a29iaiwKKwkJCSAgICZpd2xfYXR0cmlidXRlX2dyb3VwKTsKIAogCS8qIGllZWU4MDIxMV91bnJlZ2lzdGVyX2h3IGNhbGwgd2lsIGNhdXNlIGl3bF9tYWNfc3RvcCB0bwogCSAqIHRvIGJlIGNhbGxlZCBhbmQgaXdsX2Rvd24gc2luY2Ugd2UgYXJlIHJlbW92aW5nIHRoZSBkZXZpY2UKQEAgLTM2NzksMTcgKzM4MzEsMTUgQEAKIAlpd2xfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWl3bF9zeW5jaHJvbml6ZV9pcnEocHJpdik7CisJdHJhbnNfc3luY19pcnEoJnByaXYtPnRyYW5zKTsKIAotCWl3bF9kZWFsbG9jX3Vjb2RlX3BjaShwcml2KTsKKwlpd2xfZGVhbGxvY191Y29kZShwcml2KTsKIAotCWlmIChwcml2LT5yeHEuYmQpCi0JCWl3bGFnbl9yeF9xdWV1ZV9mcmVlKHByaXYsICZwcml2LT5yeHEpOwotCWl3bGFnbl9od190eHFfY3R4X2ZyZWUocHJpdik7CisJdHJhbnNfcnhfZnJlZSgmcHJpdi0+dHJhbnMpOworCXRyYW5zX3R4X2ZyZWUoJnByaXYtPnRyYW5zKTsKIAogCWl3bF9lZXByb21fZnJlZShwcml2KTsKIAotCiAJLypuZXRpZl9zdG9wX3F1ZXVlKGRldik7ICovCiAJZmx1c2hfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7CiAKQEAgLTM3MDAsMTcgKzM4NTAsMTIgQEAKIAlwcml2LT53b3JrcXVldWUgPSBOVUxMOwogCWl3bF9mcmVlX3RyYWZmaWNfbWVtKHByaXYpOwogCi0JZnJlZV9pcnEocHJpdi0+cGNpX2Rldi0+aXJxLCBwcml2KTsKLQlwY2lfZGlzYWJsZV9tc2kocHJpdi0+cGNpX2Rldik7Ci0JcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+aHdfYmFzZSk7Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXRyYW5zX2ZyZWUoJnByaXYtPnRyYW5zKTsKKworCWJ1c19zZXRfZHJ2X2RhdGEocHJpdi0+YnVzLCBOVUxMKTsKIAogCWl3bF91bmluaXRfZHJ2KHByaXYpOwogCi0JaXdsX2ZyZWVfaXNyX2ljdChwcml2KTsKLQogCWRldl9rZnJlZV9za2IocHJpdi0+YmVhY29uX3NrYik7CiAKIAlpZWVlODAyMTFfZnJlZV9odyhwcml2LT5odyk7CkBAIC0zNzIyLDIwNiArMzg2Nyw2IEBACiAgKiBkcml2ZXIgYW5kIG1vZHVsZSBlbnRyeSBwb2ludAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSGFyZHdhcmUgc3BlY2lmaWMgZmlsZSBkZWZpbmVzIHRoZSBQQ0kgSURzIHRhYmxlIGZvciB0aGF0IGhhcmR3YXJlIG1vZHVsZSAqLwotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGl3bF9od19jYXJkX2lkcykgPSB7Ci0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMjAxLCBpd2w1MTAwX2Fnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMzAxLCBpd2w1MTAwX2Fnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjMyLCAweDEyMDQsIGl3bDUxMDBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjMyLCAweDEzMDQsIGl3bDUxMDBfYWduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzIsIDB4MTIwNSwgaXdsNTEwMF9iZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzIsIDB4MTMwNSwgaXdsNTEwMF9iZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMjA2LCBpd2w1MTAwX2FiZ19jZmcpfSwgLyogTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMzA2LCBpd2w1MTAwX2FiZ19jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjMyLCAweDEyMjEsIGl3bDUxMDBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjMyLCAweDEzMjEsIGl3bDUxMDBfYWduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzIsIDB4MTIyNCwgaXdsNTEwMF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzIsIDB4MTMyNCwgaXdsNTEwMF9hZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMjI1LCBpd2w1MTAwX2Jnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMzI1LCBpd2w1MTAwX2Jnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjMyLCAweDEyMjYsIGl3bDUxMDBfYWJnX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjMyLCAweDEzMjYsIGl3bDUxMDBfYWJnX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzcsIDB4MTIxMSwgaXdsNTEwMF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzcsIDB4MTMxMSwgaXdsNTEwMF9hZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzNywgMHgxMjE0LCBpd2w1MTAwX2Fnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzNywgMHgxMzE0LCBpd2w1MTAwX2Fnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM3LCAweDEyMTUsIGl3bDUxMDBfYmduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM3LCAweDEzMTUsIGl3bDUxMDBfYmduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzcsIDB4MTIxNiwgaXdsNTEwMF9hYmdfY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzcsIDB4MTMxNiwgaXdsNTEwMF9hYmdfY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCi0KLS8qIDUzMDAgU2VyaWVzIFdpRmkgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM1LCAweDEwMjEsIGl3bDUzMDBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM1LCAweDExMjEsIGl3bDUzMDBfYWduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzUsIDB4MTAyNCwgaXdsNTMwMF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzUsIDB4MTEyNCwgaXdsNTMwMF9hZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzNSwgMHgxMDAxLCBpd2w1MzAwX2Fnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzNSwgMHgxMTAxLCBpd2w1MzAwX2Fnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM1LCAweDEwMDQsIGl3bDUzMDBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM1LCAweDExMDQsIGl3bDUzMDBfYWduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzYsIDB4MTAxMSwgaXdsNTMwMF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyMzYsIDB4MTExMSwgaXdsNTMwMF9hZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzNiwgMHgxMDE0LCBpd2w1MzAwX2Fnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzNiwgMHgxMTE0LCBpd2w1MzAwX2Fnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KLQotLyogNTM1MCBTZXJpZXMgV2lGaS9XaU1heCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyM0EsIDB4MTAwMSwgaXdsNTM1MF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyM0EsIDB4MTAyMSwgaXdsNTM1MF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyM0IsIDB4MTAxMSwgaXdsNTM1MF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLwotCi0vKiA1MTUwIFNlcmllcyBXaWZpL1dpTWF4ICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzQywgMHgxMjAxLCBpd2w1MTUwX2Fnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzQywgMHgxMzAxLCBpd2w1MTUwX2Fnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNDLCAweDEyMDYsIGl3bDUxNTBfYWJnX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNDLCAweDEzMDYsIGl3bDUxNTBfYWJnX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyM0MsIDB4MTIyMSwgaXdsNTE1MF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyM0MsIDB4MTMyMSwgaXdsNTE1MF9hZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCi0KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNELCAweDEyMTEsIGl3bDUxNTBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNELCAweDEzMTEsIGl3bDUxNTBfYWduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyM0QsIDB4MTIxNiwgaXdsNTE1MF9hYmdfY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLwotCXtJV0xfUENJX0RFVklDRSgweDQyM0QsIDB4MTMxNiwgaXdsNTE1MF9hYmdfY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCi0KLS8qIDZ4MDAgU2VyaWVzICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIyQiwgMHgxMTAxLCBpd2w2MDAwXzNhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIyQiwgMHgxMTIxLCBpd2w2MDAwXzNhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIyQywgMHgxMzAxLCBpd2w2MDAwaV8yYWduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMkMsIDB4MTMwNiwgaXdsNjAwMGlfMmFiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjJDLCAweDEzMDcsIGl3bDYwMDBpXzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjJDLCAweDEzMjEsIGl3bDYwMDBpXzJhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIyQywgMHgxMzI2LCBpd2w2MDAwaV8yYWJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMzgsIDB4MTExMSwgaXdsNjAwMF8zYWduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMzksIDB4MTMxMSwgaXdsNjAwMGlfMmFnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM5LCAweDEzMTYsIGl3bDYwMDBpXzJhYmdfY2ZnKX0sCi0KLS8qIDZ4MDUgU2VyaWVzICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzAxLCBpd2w2MDA1XzJhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzA2LCBpd2w2MDA1XzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzA3LCBpd2w2MDA1XzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgyLCAweDEzMjEsIGl3bDYwMDVfMmFnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgyLCAweDEzMjYsIGl3bDYwMDVfMmFiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDg1LCAweDEzMTEsIGl3bDYwMDVfMmFnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDg1LCAweDEzMTYsIGl3bDYwMDVfMmFiZ19jZmcpfSwKLQotLyogNngzMCBTZXJpZXMgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDhBLCAweDUzMDUsIGl3bDEwMzBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDAwOEEsIDB4NTMwNywgaXdsMTAzMF9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDhBLCAweDUzMjUsIGl3bDEwMzBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDAwOEEsIDB4NTMyNywgaXdsMTAzMF9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDhCLCAweDUzMTUsIGl3bDEwMzBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDAwOEIsIDB4NTMxNywgaXdsMTAzMF9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDkwLCAweDUyMTEsIGl3bDYwMzBfMmFnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDkwLCAweDUyMTUsIGl3bDYwMzBfMmJnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDkwLCAweDUyMTYsIGl3bDYwMzBfMmFiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDkxLCAweDUyMDEsIGl3bDYwMzBfMmFnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDkxLCAweDUyMDUsIGl3bDYwMzBfMmJnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDkxLCAweDUyMDYsIGl3bDYwMzBfMmFiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDkxLCAweDUyMDcsIGl3bDYwMzBfMmJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDAwOTEsIDB4NTIyMSwgaXdsNjAzMF8yYWduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDAwOTEsIDB4NTIyNSwgaXdsNjAzMF8yYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDAwOTEsIDB4NTIyNiwgaXdsNjAzMF8yYWJnX2NmZyl9LAotCi0vKiA2eDUwIFdpRmkvV2lNYXggU2VyaWVzICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4NywgMHgxMzAxLCBpd2w2MDUwXzJhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4NywgMHgxMzA2LCBpd2w2MDUwXzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4NywgMHgxMzIxLCBpd2w2MDUwXzJhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4NywgMHgxMzI2LCBpd2w2MDUwXzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4OSwgMHgxMzExLCBpd2w2MDUwXzJhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4OSwgMHgxMzE2LCBpd2w2MDUwXzJhYmdfY2ZnKX0sCi0KLS8qIDYxNTAgV2lGaS9XaU1heCBTZXJpZXMgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODg1LCAweDEzMDUsIGl3bDYxNTBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4ODUsIDB4MTMwNywgaXdsNjE1MF9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODg1LCAweDEzMjUsIGl3bDYxNTBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4ODUsIDB4MTMyNywgaXdsNjE1MF9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODg2LCAweDEzMTUsIGl3bDYxNTBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4ODYsIDB4MTMxNywgaXdsNjE1MF9iZ19jZmcpfSwKLQotLyogMTAwMCBTZXJpZXMgV2lGaSAqLwotCXtJV0xfUENJX0RFVklDRSgweDAwODMsIDB4MTIwNSwgaXdsMTAwMF9iZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4MywgMHgxMzA1LCBpd2wxMDAwX2Jnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgzLCAweDEyMjUsIGl3bDEwMDBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDAwODMsIDB4MTMyNSwgaXdsMTAwMF9iZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4NCwgMHgxMjE1LCBpd2wxMDAwX2Jnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDg0LCAweDEzMTUsIGl3bDEwMDBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDAwODMsIDB4MTIwNiwgaXdsMTAwMF9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgzLCAweDEzMDYsIGl3bDEwMDBfYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4MywgMHgxMjI2LCBpd2wxMDAwX2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDAwODMsIDB4MTMyNiwgaXdsMTAwMF9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwMDg0LCAweDEyMTYsIGl3bDEwMDBfYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDA4NCwgMHgxMzE2LCBpd2wxMDAwX2JnX2NmZyl9LAotCi0vKiAxMDAgU2VyaWVzIFdpRmkgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHgwOEFFLCAweDEwMDUsIGl3bDEwMF9iZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDhBRSwgMHgxMDA3LCBpd2wxMDBfYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDhBRiwgMHgxMDE1LCBpd2wxMDBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4QUYsIDB4MTAxNywgaXdsMTAwX2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4QUUsIDB4MTAyNSwgaXdsMTAwX2Jnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwOEFFLCAweDEwMjcsIGl3bDEwMF9iZ19jZmcpfSwKLQotLyogMTMwIFNlcmllcyBXaUZpICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5NiwgMHg1MDA1LCBpd2wxMzBfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTYsIDB4NTAwNywgaXdsMTMwX2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTcsIDB4NTAxNSwgaXdsMTMwX2Jnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk3LCAweDUwMTcsIGl3bDEzMF9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk2LCAweDUwMjUsIGl3bDEzMF9iZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5NiwgMHg1MDI3LCBpd2wxMzBfYmdfY2ZnKX0sCi0KLS8qIDJ4MDAgU2VyaWVzICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5MCwgMHg0MDIyLCBpd2wyMDAwXzJiZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5MSwgMHg0MjIyLCBpd2wyMDAwXzJiZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5MCwgMHg0NDIyLCBpd2wyMDAwXzJiZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5MCwgMHg0MDI2LCBpd2wyMDAwXzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODkxLCAweDQyMjYsIGl3bDIwMDBfMmJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDQyNiwgaXdsMjAwMF8yYmdfY2ZnKX0sCi0KLS8qIDJ4MzAgU2VyaWVzICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4NywgMHg0MDYyLCBpd2wyMDMwXzJiZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4OCwgMHg0MjYyLCBpd2wyMDMwXzJiZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4NywgMHg0NDYyLCBpd2wyMDMwXzJiZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4NywgMHg0MDY2LCBpd2wyMDMwXzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODg4LCAweDQyNjYsIGl3bDIwMzBfMmJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4ODcsIDB4NDQ2NiwgaXdsMjAzMF8yYmdfY2ZnKX0sCi0KLS8qIDZ4MzUgU2VyaWVzICovCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0MDYwLCBpd2w2MDM1XzJhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RiwgMHg0MjYwLCBpd2w2MDM1XzJhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0NDYwLCBpd2w2MDM1XzJhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0MDY0LCBpd2w2MDM1XzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RiwgMHg0MjY0LCBpd2w2MDM1XzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0NDY0LCBpd2w2MDM1XzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0MDY2LCBpd2w2MDM1XzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODhGLCAweDQyNjYsIGl3bDYwMzVfMmJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OEUsIDB4NDQ2NiwgaXdsNjAzNV8yYmdfY2ZnKX0sCi0KLS8qIDEwNSBTZXJpZXMgKi8KLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDAwMjIsIGl3bDEwNV9iZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5NSwgMHgwMjIyLCBpd2wxMDVfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTQsIDB4MDQyMiwgaXdsMTA1X2Jnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDAwMjYsIGl3bDEwNV9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk1LCAweDAyMjYsIGl3bDEwNV9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDA0MjYsIGl3bDEwNV9iZ19jZmcpfSwKLQotLyogMTM1IFNlcmllcyAqLwotCXtJV0xfUENJX0RFVklDRSgweDA4OTIsIDB4MDA2MiwgaXdsMTM1X2Jnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODkzLCAweDAyNjIsIGl3bDEzNV9iZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5MiwgMHgwNDYyLCBpd2wxMzVfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTIsIDB4MDA2NiwgaXdsMTM1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTMsIDB4MDI2NiwgaXdsMTM1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTIsIDB4MDQ2NiwgaXdsMTM1X2JnX2NmZyl9LAotCi0JezB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGl3bF9od19jYXJkX2lkcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpd2xfZHJpdmVyID0gewotCS5uYW1lID0gRFJWX05BTUUsCi0JLmlkX3RhYmxlID0gaXdsX2h3X2NhcmRfaWRzLAotCS5wcm9iZSA9IGl3bF9wY2lfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGl3bF9wY2lfcmVtb3ZlKSwKLQkuZHJpdmVyLnBtID0gSVdMX1BNX09QUywKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IGl3bF9pbml0KHZvaWQpCiB7CiAKQEAgLTM5MzUsMTIgKzM4ODAsMTAgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpd2xfZHJpdmVyKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGluaXRpYWxpemUgUENJIG1vZHVsZVxuIik7Ci0JCWdvdG8gZXJyb3JfcmVnaXN0ZXI7Ci0JfQorCXJldCA9IGl3bF9wY2lfcmVnaXN0ZXJfZHJpdmVyKCk7CiAKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlZ2lzdGVyOwogCXJldHVybiByZXQ7CiAKIGVycm9yX3JlZ2lzdGVyOgpAQCAtMzk1MCw3ICszODkzLDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGl3bF9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpd2xfZHJpdmVyKTsKKwlpd2xfcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCk7CiAJaXdsYWduX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCk7CiB9CiAKQEAgLTM5OTIsMyArMzkzNSw1MSBAQAogCiBtb2R1bGVfcGFyYW1fbmFtZWQoYWNrX2NoZWNrLCBpd2xhZ25fbW9kX3BhcmFtcy5hY2tfY2hlY2ssIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhhY2tfY2hlY2ssICJDaGVjayBhY2sgaGVhbHRoIChkZWZhdWx0OiAwIFtkaXNhYmxlZF0pIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZCh3ZF9kaXNhYmxlLCBpd2xhZ25fbW9kX3BhcmFtcy53ZF9kaXNhYmxlLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Mod2RfZGlzYWJsZSwKKwkJIkRpc2FibGUgc3R1Y2sgcXVldWUgd2F0Y2hkb2cgdGltZXIgKGRlZmF1bHQ6IDAgW2VuYWJsZWRdKSIpOworCisvKgorICogc2V0IGJ0X2NvZXhfYWN0aXZlIHRvIHRydWUsIHVDb2RlIHdpbGwgZG8ga2lsbC9kZWZlcgorICogZXZlcnkgdGltZSB0aGUgcHJpb3JpdHkgbGluZSBpcyBhc3NlcnRlZCAoQlQgaXMgc2VuZGluZyBzaWduYWxzIG9uIHRoZQorICogcHJpb3JpdHkgbGluZSBpbiB0aGUgUENJeCkuCisgKiBzZXQgYnRfY29leF9hY3RpdmUgdG8gZmFsc2UsIHVDb2RlIHdpbGwgaWdub3JlIHRoZSBCVCBhY3Rpdml0eSBhbmQKKyAqIHBlcmZvcm0gdGhlIG5vcm1hbCBvcGVyYXRpb24KKyAqCisgKiBVc2VyIG1pZ2h0IGV4cGVyaWVuY2UgdHJhbnNtaXQgaXNzdWUgb24gc29tZSBwbGF0Zm9ybSBkdWUgdG8gV2lGaS9CVAorICogY28tZXhpc3QgcHJvYmxlbS4gVGhlIHBvc3NpYmxlIGJlaGF2aW9ycyBhcmU6CisgKiAgIEFibGUgdG8gc2NhbiBhbmQgZmluZGluZyBhbGwgdGhlIGF2YWlsYWJsZSBBUAorICogICBOb3QgYWJsZSB0byBhc3NvY2lhdGUgd2l0aCBhbnkgQVAKKyAqIE9uIHRob3NlIHBsYXRmb3JtcywgV2lGaSBjb21tdW5pY2F0aW9uIGNhbiBiZSByZXN0b3JlZCBieSBzZXQKKyAqICJidF9jb2V4X2FjdGl2ZSIgbW9kdWxlIHBhcmFtZXRlciB0byAiZmFsc2UiCisgKgorICogZGVmYXVsdDogYnRfY29leF9hY3RpdmUgPSB0cnVlIChCVF9DT0VYX0VOQUJMRSkKKyAqLworbW9kdWxlX3BhcmFtX25hbWVkKGJ0X2NvZXhfYWN0aXZlLCBpd2xhZ25fbW9kX3BhcmFtcy5idF9jb2V4X2FjdGl2ZSwKKwkJYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGJ0X2NvZXhfYWN0aXZlLCAiZW5hYmxlIHdpZmkvYnQgY28tZXhpc3QgKGRlZmF1bHQ6IGVuYWJsZSkiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGxlZF9tb2RlLCBpd2xhZ25fbW9kX3BhcmFtcy5sZWRfbW9kZSwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MobGVkX21vZGUsICIwPXN5c3RlbSBkZWZhdWx0LCAiCisJCSIxPU9uKFJGIE9uKS9PZmYoUkYgT2ZmKSwgMj1ibGlua2luZyAoZGVmYXVsdDogMCkiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKHBvd2VyX3NhdmUsIGl3bGFnbl9tb2RfcGFyYW1zLnBvd2VyX3NhdmUsCisJCWJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zYXZlLAorCQkgImVuYWJsZSBXaUZpIHBvd2VyIG1hbmFnZW1lbnQgKGRlZmF1bHQ6IGRpc2FibGUpIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChwb3dlcl9sZXZlbCwgaXdsYWduX21vZF9wYXJhbXMucG93ZXJfbGV2ZWwsCisJCWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX2xldmVsLAorCQkgImRlZmF1bHQgcG93ZXIgc2F2ZSBsZXZlbCAocmFuZ2UgZnJvbSAxIC0gNSwgZGVmYXVsdDogMSkiKTsKKworLyoKKyAqIEZvciBub3csIGtlZXAgdXNpbmcgcG93ZXIgbGV2ZWwgMSBpbnN0ZWFkIG9mIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdGluZyAuLi4KKyAqLworbW9kdWxlX3BhcmFtX25hbWVkKG5vX3NsZWVwX2F1dG9hZGp1c3QsIGl3bGFnbl9tb2RfcGFyYW1zLm5vX3NsZWVwX2F1dG9hZGp1c3QsCisJCWJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhub19zbGVlcF9hdXRvYWRqdXN0LAorCQkgImRvbid0IGF1dG9tYXRpY2FsbHkgYWRqdXN0IHNsZWVwIGxldmVsICIKKwkJICJhY2NvcmRpbmcgdG8gbWF4aW11bSBuZXR3b3JrIGxhdGVuY3kgKGRlZmF1bHQ6IHRydWUpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCmluZGV4IGQxNzE2ODQuLmQ5NDFjNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCkBAIC0xMDksNDIgKzEwOSwyNSBAQAogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEzNV9iZ25fY2ZnOwogCiBleHRlcm4gc3RydWN0IGl3bF9tb2RfcGFyYW1zIGl3bGFnbl9tb2RfcGFyYW1zOwotZXh0ZXJuIHN0cnVjdCBpd2xfaGNtZF9vcHMgaXdsYWduX2hjbWQ7Ci1leHRlcm4gc3RydWN0IGl3bF9oY21kX29wcyBpd2xhZ25fYnRfaGNtZDsKLWV4dGVybiBzdHJ1Y3QgaXdsX2hjbWRfdXRpbHNfb3BzIGl3bGFnbl9oY21kX3V0aWxzOwogCiBleHRlcm4gc3RydWN0IGllZWU4MDIxMV9vcHMgaXdsYWduX2h3X29wczsKIAogaW50IGl3bF9yZXNldF9pY3Qoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2Rpc2FibGVfaWN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2FsbG9jX2lzcl9pY3Qoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2ZyZWVfaXNyX2ljdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaXJxcmV0dXJuX3QgaXdsX2lzcl9pY3QoaW50IGlycSwgdm9pZCAqZGF0YSk7CiAKLS8qIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBmbHVzaCBhbnkgc2NoZWR1bGVkIHRhc2tsZXQgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfc3luY2hyb25pemVfaXJxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3N0YXRpYyBpbmxpbmUgdm9pZCBpd2xfc2V0X2NhbGliX2hkcihzdHJ1Y3QgaXdsX2NhbGliX2hkciAqaGRyLCB1OCBjbWQpCiB7Ci0JLyogd2FpdCB0byBtYWtlIHN1cmUgd2UgZmx1c2ggcGVuZGluZyB0YXNrbGV0Ki8KLQlzeW5jaHJvbml6ZV9pcnEocHJpdi0+cGNpX2Rldi0+aXJxKTsKLQl0YXNrbGV0X2tpbGwoJnByaXYtPmlycV90YXNrbGV0KTsKKwloZHItPm9wX2NvZGUgPSBjbWQ7CisJaGRyLT5maXJzdF9ncm91cCA9IDA7CisJaGRyLT5ncm91cHNfbnVtID0gMTsKKwloZHItPmRhdGFfdmFsaWQgPSAxOwogfQogCi1pbnQgaXdsX3ByZXBhcmVfY2FyZF9odyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi1pbnQgaXdsYWduX3N0YXJ0X2RldmljZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xhZ25fc3RvcF9kZXZpY2Uoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQogLyogdHggcXVldWUgKi8KLXZvaWQgaXdsYWduX3NldF93cl9wdHJzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJICAgICBpbnQgdHhxX2lkLCB1MzIgaW5kZXgpOwotdm9pZCBpd2xhZ25fdHhfcXVldWVfc2V0X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCSAgICAgaW50IHR4X2ZpZm9faWQsIGludCBzY2RfcmV0cnkpOwotdm9pZCBpd2xhZ25fdHhxX3NldF9zY2hlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBtYXNrKTsKIHZvaWQgaXdsX2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkgICAgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyZWVkKTsKIAogLyogUlhPTiAqLworaW50IGl3bGFnbl9zZXRfcGFuX3BhcmFtcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bGFnbl9jb21taXRfcnhvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwogdm9pZCBpd2xhZ25fc2V0X3J4b25fY2hhaW4oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKIGludCBpd2xhZ25fbWFjX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGNoYW5nZWQpOwpAQCAtMTYxLDQxICsxNDQsMjkgQEAKIGludCBpd2xhZ25fcnVuX2luaXRfdWNvZGUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGludCBpd2xhZ25fbG9hZF91Y29kZV93YWl0X2FsaXZlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCQkgc3RydWN0IGZ3X2ltZyAqaW1hZ2UsCi0JCQkJIGludCBzdWJ0eXBlLCBpbnQgYWx0ZXJuYXRlX3N1YnR5cGUpOworCQkJCSBlbnVtIGl3bGFnbl91Y29kZV90eXBlIHVjb2RlX3R5cGUpOwogCiAvKiBsaWIgKi8KIHZvaWQgaXdsX2NoZWNrX2Fib3J0X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkgICAgdTggZnJhbWVfY291bnQsIHUzMiBzdGF0dXMpOwotdm9pZCBpd2xhZ25fcnhfaGFuZGxlcl9zZXR1cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xhZ25fc2V0dXBfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bGFnbl9od192YWxpZF9ydGNfZGF0YV9hZGRyKHUzMiBhZGRyKTsKIGludCBpd2xhZ25fc2VuZF90eF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogdm9pZCBpd2xhZ25fdGVtcGVyYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHUxNiBpd2xhZ25fZWVwcm9tX2NhbGliX3ZlcnNpb24oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWNvbnN0IHU4ICppd2xhZ25fZWVwcm9tX3F1ZXJ5X2FkZHIoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHNpemVfdCBvZmZzZXQpOwotdm9pZCBpd2xhZ25fcnhfcXVldWVfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEpOwotaW50IGl3bGFnbl9yeF9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKTsKLWludCBpd2xhZ25faHdfbmljX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGludCBpd2xhZ25fd2FpdF90eF9xdWV1ZV9lbXB0eShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bGFnbl90eGZpZm9fZmx1c2goc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgZmx1c2hfY29udHJvbCk7CiB2b2lkIGl3bGFnbl9kZXZfdHhmaWZvX2ZsdXNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IGZsdXNoX2NvbnRyb2wpOworaW50IGl3bGFnbl9zZW5kX2JlYWNvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIAogLyogcnggKi8KLXZvaWQgaXdsYWduX3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsYWduX3J4X2FsbG9jYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgZ2ZwX3QgcHJpb3JpdHkpOwotdm9pZCBpd2xhZ25fcnhfcmVwbGVuaXNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bGFnbl9yeF9yZXBsZW5pc2hfbm93KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bGFnbl9yeF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKTsKLWludCBpd2xhZ25fcnhxX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGludCBpd2xhZ25faHdyYXRlX3RvX21hYzgwMjExX2lkeCh1MzIgcmF0ZV9uX2ZsYWdzLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpOwogdm9pZCBpd2xfc2V0dXBfcnhfaGFuZGxlcnMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK3ZvaWQgaXdsX3J4X2Rpc3BhdGNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOworCiAKIC8qIHR4ICovCi12b2lkIGl3bGFnbl90eHFfZnJlZV90ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpOwotaW50IGl3bGFnbl90eHFfYXR0YWNoX2J1Zl90b190ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQkJIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwgdTggcmVzZXQpOwordm9pZCBpd2xhZ25fdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAorCQkJCWludCBpbmRleCk7CiB2b2lkIGl3bGFnbl9od3JhdGVfdG9fdHhfY29udHJvbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByYXRlX25fZmxhZ3MsCiAJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8pOwogaW50IGl3bGFnbl90eF9za2Ioc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTIwMywxOCArMTc0LDEyIEBACiAJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbik7CiBpbnQgaXdsYWduX3R4X2FnZ19zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQpOwotdm9pZCBpd2xhZ25fdHhxX2FnZ19xdWV1ZV9zZXR1cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQlpbnQgdGlkLCBpbnQgZnJhbWVfbGltaXQpOwogaW50IGl3bGFnbl90eHFfY2hlY2tfZW1wdHkoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJICAgaW50IHN0YV9pZCwgdTggdGlkLCBpbnQgdHhxX2lkKTsKIHZvaWQgaXdsYWduX3J4X3JlcGx5X2NvbXByZXNzZWRfYmEoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKK3ZvaWQgaXdsYWduX3J4X3JlcGx5X3R4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwogaW50IGl3bGFnbl90eF9xdWV1ZV9yZWNsYWltKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHR4cV9pZCwgaW50IGluZGV4KTsKLXZvaWQgaXdsYWduX2h3X3R4cV9jdHhfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bGFnbl90eHFfY3R4X2FsbG9jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bGFnbl90eHFfY3R4X3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bGFnbl90eHFfY3R4X3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIAogc3RhdGljIGlubGluZSB1MzIgaXdsX3R4X3N0YXR1c190b19tYWM4MDIxMSh1MzIgc3RhdHVzKQogewpAQCAtMjQ5LDEwICsyMTQsNiBAQAogaW50IGl3bGFnbl9tYW5hZ2VfaWJzc19zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29sIGFkZCk7CiAKLS8qIGhjbWQgKi8KLWludCBpd2xhZ25fc2VuZF90eF9hbnRfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggdmFsaWRfdHhfYW50KTsKLWludCBpd2xhZ25fc2VuZF9iZWFjb25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KIC8qIGJ0IGNvZXggKi8KIHZvaWQgaXdsYWduX3NlbmRfYWR2YW5jZV9idF9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsYWduX2J0X2NvZXhfcHJvZmlsZV9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCkBAIC0yNjAsNiArMjIxLDggQEAKIHZvaWQgaXdsYWduX2J0X3J4X2hhbmRsZXJfc2V0dXAoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsYWduX2J0X3NldHVwX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsYWduX2J0X2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Cit2b2lkIGl3bGFnbl9idF9jb2V4X3Jzc2lfbW9uaXRvcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwordm9pZCBpd2xhZ25fYnRfYWRqdXN0X3Jzc2lfbW9uaXRvcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgcnNzaV9lbmEpOwogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKIGNvbnN0IGNoYXIgKml3bF9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cyk7CkBAIC0yODMsMTEgKzI0NiwxMyBAQAogaW50IGl3bF9yZXN0b3JlX2RlZmF1bHRfd2VwX2tleXMoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCSBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKIGludCBpd2xfc2V0X2R5bmFtaWNfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwgdTggc3RhX2lkKTsKKwkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwogaW50IGl3bF9yZW1vdmVfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5LCB1OCBzdGFfaWQpOworCQkJICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5LAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CiB2b2lkIGl3bF91cGRhdGVfdGtpcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCSBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAogCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUzMiBpdjMyLCB1MTYgKnBoYXNlMWtleSk7CiBpbnQgaXdsX3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBzdGFfaWQsIGludCB0aWQpOwpAQCAtMjk2LDYgKzI2MSw4IEBACiBpbnQgaXdsX3N0YV9yeF9hZ2dfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCiAJCQlpbnQgdGlkKTsKIHZvaWQgaXdsX3N0YV9tb2RpZnlfc2xlZXBfdHhfY291bnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLCBpbnQgY250KTsKK2ludCBpd2xfdXBkYXRlX2JjYXN0X3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKIGludCBpd2xfdXBkYXRlX2JjYXN0X3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiB2b2lkIGl3bGFnbl9tYWNfc3RhX25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCkBAIC0zNDMsNiArMzEwLDkgQEAKIC8qIHN2dG9vbCAqLwogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9TVlRPT0wKIGV4dGVybiBpbnQgaXdsX3Rlc3Rtb2RlX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdm9pZCAqZGF0YSwgaW50IGxlbik7CitleHRlcm4gaW50IGl3bF90ZXN0bW9kZV9kdW1wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQkgICAgIHZvaWQgKmRhdGEsIGludCBsZW4pOwogZXh0ZXJuIHZvaWQgaXdsX3Rlc3Rtb2RlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGV4dGVybiB2b2lkIGl3bF90ZXN0bW9kZV9jbGVhbnVwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAjZWxzZQpAQCAtMzUyLDYgKzMyMiwxMyBAQAogCXJldHVybiAtRU5PU1lTOwogfQogc3RhdGljIGlubGluZQoraW50IGl3bF90ZXN0bW9kZV9kdW1wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCSAgICAgIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CitzdGF0aWMgaW5saW5lCiB2b2lkIGl3bF90ZXN0bW9kZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWJ1cy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlZTFjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWJ1cy5oCkBAIC0wLDAgKzEsMTM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19pd2xfcGNpX2hfXworI2RlZmluZSBfX2l3bF9wY2lfaF9fCisKK3N0cnVjdCBpd2xfYnVzOworCisvKioKKyAqIHN0cnVjdCBpd2xfYnVzX29wcyAtIGJ1cyBzcGVjaWZpYyBvcGVyYXRpb25zCisgKiBAZ2V0X3BtX3N1cHBvcnQ6IG11c3QgcmV0dXJucyB0cnVlIGlmIHRoZSBidXMgY2FuIGdvIHRvIHNsZWVwCisgKiBAYXBtX2NvbmZpZzogd2lsbCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBjb25maWcgb2YgdGhlIEFQTSBjb25maWd1cmF0aW9uCisgKiBAc2V0X2Rydl9kYXRhOiBzZXQgdGhlIGRydl9kYXRhIHBvaW50ZXIgdG8gdGhlIGJ1cyBsYXllcgorICogQGdldF9od19pZDogcHJpbnRzIHRoZSBod19pZCBpbiB0aGUgcHJvdmlkZWQgYnVmZmVyCisgKiBAd3JpdGU4OiB3cml0ZSBhIGJ5dGUgdG8gcmVnaXN0ZXIgYXQgb2Zmc2V0IG9mcworICogQHdyaXRlMzI6IHdyaXRlIGEgZHdvcmQgdG8gcmVnaXN0ZXIgYXQgb2Zmc2V0IG9mcworICogQHdyZWFkMzI6IHJlYWQgYSBkd29yZCBhdCByZWdpc3RlciBhdCBvZmZzZXQgb2ZzCisgKi8KK3N0cnVjdCBpd2xfYnVzX29wcyB7CisJYm9vbCAoKmdldF9wbV9zdXBwb3J0KShzdHJ1Y3QgaXdsX2J1cyAqYnVzKTsKKwl2b2lkICgqYXBtX2NvbmZpZykoc3RydWN0IGl3bF9idXMgKmJ1cyk7CisJdm9pZCAoKnNldF9kcnZfZGF0YSkoc3RydWN0IGl3bF9idXMgKmJ1cywgdm9pZCAqZHJ2X2RhdGEpOworCXZvaWQgKCpnZXRfaHdfaWQpKHN0cnVjdCBpd2xfYnVzICpidXMsIGNoYXIgYnVmW10sIGludCBidWZfbGVuKTsKKwl2b2lkICgqd3JpdGU4KShzdHJ1Y3QgaXdsX2J1cyAqYnVzLCB1MzIgb2ZzLCB1OCB2YWwpOworCXZvaWQgKCp3cml0ZTMyKShzdHJ1Y3QgaXdsX2J1cyAqYnVzLCB1MzIgb2ZzLCB1MzIgdmFsKTsKKwl1MzIgKCpyZWFkMzIpKHN0cnVjdCBpd2xfYnVzICpidXMsIHUzMiBvZnMpOworfTsKKworc3RydWN0IGl3bF9idXMgeworCS8qIENvbW1vbiBkYXRhIHRvIGFsbCBidXNlcyAqLworCXZvaWQgKmRydl9kYXRhOyAvKiBkcml2ZXIncyBjb250ZXh0ICovCisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBpd2xfYnVzX29wcyAqb3BzOworCisJdW5zaWduZWQgaW50IGlycTsKKworCS8qIHBvaW50ZXIgdG8gYnVzIHNwZWNpZmljIHN0cnVjdCAqLworCS8qRW5zdXJlIHRoYXQgdGhpcyBwb2ludGVyIHdpbGwgYWx3YXlzIGJlIGFsaWduZWQgdG8gc2l6ZW9mIHBvaW50ZXIgKi8KKwljaGFyIGJ1c19zcGVjaWZpY1swXSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhzaXplb2Yodm9pZCAqKSkpKTsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBidXNfZ2V0X3BtX3N1cHBvcnQoc3RydWN0IGl3bF9idXMgKmJ1cykKK3sKKwlyZXR1cm4gYnVzLT5vcHMtPmdldF9wbV9zdXBwb3J0KGJ1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidXNfYXBtX2NvbmZpZyhzdHJ1Y3QgaXdsX2J1cyAqYnVzKQoreworCWJ1cy0+b3BzLT5hcG1fY29uZmlnKGJ1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidXNfc2V0X2Rydl9kYXRhKHN0cnVjdCBpd2xfYnVzICpidXMsIHZvaWQgKmRydl9kYXRhKQoreworCWJ1cy0+b3BzLT5zZXRfZHJ2X2RhdGEoYnVzLCBkcnZfZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidXNfZ2V0X2h3X2lkKHN0cnVjdCBpd2xfYnVzICpidXMsIGNoYXIgYnVmW10sIGludCBidWZfbGVuKQoreworCWJ1cy0+b3BzLT5nZXRfaHdfaWQoYnVzLCBidWYsIGJ1Zl9sZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnVzX3dyaXRlOChzdHJ1Y3QgaXdsX2J1cyAqYnVzLCB1MzIgb2ZzLCB1OCB2YWwpCit7CisJYnVzLT5vcHMtPndyaXRlOChidXMsIG9mcywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ1c193cml0ZTMyKHN0cnVjdCBpd2xfYnVzICpidXMsIHUzMiBvZnMsIHUzMiB2YWwpCit7CisJYnVzLT5vcHMtPndyaXRlMzIoYnVzLCBvZnMsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGJ1c19yZWFkMzIoc3RydWN0IGl3bF9idXMgKmJ1cywgdTMyIG9mcykKK3sKKwlyZXR1cm4gYnVzLT5vcHMtPnJlYWQzMihidXMsIG9mcyk7Cit9CisKK2ludCBfX211c3RfY2hlY2sgaXdsX3BjaV9yZWdpc3Rlcl9kcml2ZXIodm9pZCk7Cit2b2lkIGl3bF9wY2lfdW5yZWdpc3Rlcl9kcml2ZXIodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29tbWFuZHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbW1hbmRzLmgKaW5kZXggNmVlNWYxYS4uZTllOWQxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29tbWFuZHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb21tYW5kcy5oCkBAIC0xODgsNiArMTg4LDEzIEBACiAJUkVQTFlfV0lQQU5fTk9BX05PVElGSUNBVElPTiA9IDB4YmMsCiAJUkVQTFlfV0lQQU5fREVBQ1RJVkFUSU9OX0NPTVBMRVRFID0gMHhiZCwKIAorCVJFUExZX1dPV0xBTl9QQVRURVJOUyA9IDB4ZTAsCisJUkVQTFlfV09XTEFOX1dBS0VVUF9GSUxURVIgPSAweGUxLAorCVJFUExZX1dPV0xBTl9UU0NfUlNDX1BBUkFNUyA9IDB4ZTIsCisJUkVQTFlfV09XTEFOX1RLSVBfUEFSQU1TID0gMHhlMywKKwlSRVBMWV9XT1dMQU5fS0VLX0tDS19NQVRFUklBTCA9IDB4ZTQsCisJUkVQTFlfV09XTEFOX0dFVF9TVEFUVVMgPSAweGU1LAorCiAJUkVQTFlfTUFYID0gMHhmZgogfTsKIApAQCAtMzg0LDE4ICszOTEsNiBAQAogCiAjZGVmaW5lIFVDT0RFX1ZBTElEX09LCWNwdV90b19sZTMyKDB4MSkKIAotZW51bSBpd2xhZ25fdWNvZGVfc3VidHlwZSB7Ci0JVUNPREVfU1VCVFlQRV9SRUdVTEFSCT0gMCwKLQlVQ09ERV9TVUJUWVBFX1JFR1VMQVJfTkVXID0gMSwKLQlVQ09ERV9TVUJUWVBFX0lOSVQJPSA5LAotCi0JLyoKLQkgKiBOb3QgYSB2YWxpZCBzdWJ0eXBlLCB0aGUgdWNvZGUgaGFzIGp1c3QgYSB1OCwgc28KLQkgKiB3ZSBjYW4gdXNlIHNvbWV0aGluZyA+IDB4ZmYgZm9yIHRoaXMgdmFsdWUuCi0JICovCi0JVUNPREVfU1VCVFlQRV9OT05FX0xPQURFRCA9IDB4MTAwLAotfTsKLQogLyoqCiAgKiBSRVBMWV9BTElWRSA9IDB4MSAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKICAqCkBAIC04NDQsNiArODM5LDggQEAKICNkZWZpbmUgU1RBX0tFWV9NVUxUSUNBU1RfTVNLICAgICAgICBjcHVfdG9fbGUxNigweDQwMDApCiAjZGVmaW5lIFNUQV9LRVlfTUFYX05VTQkJOAogI2RlZmluZSBTVEFfS0VZX01BWF9OVU1fUEFOCTE2CisvKiBtdXN0IG5vdCBtYXRjaCBXRVBfSU5WQUxJRF9PRkZTRVQgKi8KKyNkZWZpbmUgSVdMQUdOX0hXX0tFWV9ERUZBVUxUCTB4ZmUKIAogLyogRmxhZ3MgaW5kaWNhdGUgd2hldGhlciB0byBtb2RpZnkgdnMuIGRvbid0IGNoYW5nZSB2YXJpb3VzIHN0YXRpb24gcGFyYW1zICovCiAjZGVmaW5lCVNUQV9NT0RJRllfS0VZX01BU0sJCTB4MDEKQEAgLTk4NCwxNSArOTgxLDI2IEBACiAJdTggcmVzZXJ2ZWQyWzJdOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBJV0xfVFhfRklGT19CS19NU0sJCWNwdV90b19sZTMyKEJJVCgwKSkKLSNkZWZpbmUgSVdMX1RYX0ZJRk9fQkVfTVNLCQljcHVfdG9fbGUzMihCSVQoMSkpCi0jZGVmaW5lIElXTF9UWF9GSUZPX1ZJX01TSwkJY3B1X3RvX2xlMzIoQklUKDIpKQotI2RlZmluZSBJV0xfVFhfRklGT19WT19NU0sJCWNwdV90b19sZTMyKEJJVCgzKSkKKworLyogV2lGaSBxdWV1ZXMgbWFzayAqLworI2RlZmluZSBJV0xfU0NEX0JLX01TSwkJCWNwdV90b19sZTMyKEJJVCgwKSkKKyNkZWZpbmUgSVdMX1NDRF9CRV9NU0sJCQljcHVfdG9fbGUzMihCSVQoMSkpCisjZGVmaW5lIElXTF9TQ0RfVklfTVNLCQkJY3B1X3RvX2xlMzIoQklUKDIpKQorI2RlZmluZSBJV0xfU0NEX1ZPX01TSwkJCWNwdV90b19sZTMyKEJJVCgzKSkKKyNkZWZpbmUgSVdMX1NDRF9NR01UX01TSwkJY3B1X3RvX2xlMzIoQklUKDMpKQorCisvKiBQQU4gcXVldWVzIG1hc2sgKi8KKyNkZWZpbmUgSVdMX1BBTl9TQ0RfQktfTVNLCQljcHVfdG9fbGUzMihCSVQoNCkpCisjZGVmaW5lIElXTF9QQU5fU0NEX0JFX01TSwkJY3B1X3RvX2xlMzIoQklUKDUpKQorI2RlZmluZSBJV0xfUEFOX1NDRF9WSV9NU0sJCWNwdV90b19sZTMyKEJJVCg2KSkKKyNkZWZpbmUgSVdMX1BBTl9TQ0RfVk9fTVNLCQljcHVfdG9fbGUzMihCSVQoNykpCisjZGVmaW5lIElXTF9QQU5fU0NEX01HTVRfTVNLCQljcHVfdG9fbGUzMihCSVQoNykpCisjZGVmaW5lIElXTF9QQU5fU0NEX01VTFRJQ0FTVF9NU0sJY3B1X3RvX2xlMzIoQklUKDgpKQorCiAjZGVmaW5lIElXTF9BR0dfVFhfUVVFVUVfTVNLCQljcHVfdG9fbGUzMigweGZmYzAwKQogCiAjZGVmaW5lIElXTF9EUk9QX1NJTkdMRQkJMAotI2RlZmluZSBJV0xfRFJPUF9TRUxFQ1RFRAkxCi0jZGVmaW5lIElXTF9EUk9QX0FMTAkJMgorI2RlZmluZSBJV0xfRFJPUF9BTEwJCShCSVQoSVdMX1JYT05fQ1RYX0JTUykgfCBCSVQoSVdMX1JYT05fQ1RYX1BBTikpCiAKIC8qCiAgKiBSRVBMWV9UWEZJRk9fRkxVU0ggPSAweDFlKGNvbW1hbmQgYW5kIHJlc3BvbnNlKQpAQCAtMTkzMiw2ICsxOTQwLDkgQEAKIC8qIERpc2FibGUgU3luYyBQU1BvbGwgb24gU0NPL2VTQ08gKi8KICNkZWZpbmUgSVdMQUdOX0JUX0ZMQUdfU1lOQ18yX0JUX0RJU0FCTEUJQklUKDcpCiAKKyNkZWZpbmUgSVdMQUdOX0JUX1BTUF9NSU5fUlNTSV9USFJFU0hPTEQJLTc1IC8qIGRCbSAqLworI2RlZmluZSBJV0xBR05fQlRfUFNQX01BWF9SU1NJX1RIUkVTSE9MRAktNjUgLyogZEJtICovCisKICNkZWZpbmUgSVdMQUdOX0JUX1BSSU9fQk9PU1RfTUFYCTB4RkYKICNkZWZpbmUgSVdMQUdOX0JUX1BSSU9fQk9PU1RfTUlOCTB4MDAKICNkZWZpbmUgSVdMQUdOX0JUX1BSSU9fQk9PU1RfREVGQVVMVAkweEYwCkBAIC0yNDU3LDggKzI0NjgsOCBAQAogCV9fbGUzMiBzdGF0dXM7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lICBTQ0FOX09XTkVSX1NUQVRVUyAweDE7Ci0jZGVmaW5lICBNRUFTVVJFX09XTkVSX1NUQVRVUyAweDI7CisjZGVmaW5lICBTQ0FOX09XTkVSX1NUQVRVUyAweDEKKyNkZWZpbmUgIE1FQVNVUkVfT1dORVJfU1RBVFVTIDB4MgogCiAjZGVmaW5lIElXTF9QUk9CRV9TVEFUVVNfT0sJCTAKICNkZWZpbmUgSVdMX1BST0JFX1NUQVRVU19UWF9GQUlMRUQJQklUKDApCkBAIC0zMTUzLDcgKzMxNjQsNiBAQAogLyogVGhlIGRlZmF1bHQgY2FsaWJyYXRlIHRhYmxlIHNpemUgaWYgbm90IHNwZWNpZmllZCBieSBmaXJtd2FyZSAqLwogI2RlZmluZSBJV0xfREVGQVVMVF9TVEFOREFSRF9QSFlfQ0FMSUJSQVRFX1RCTF9TSVpFCTE4CiBlbnVtIHsKLQlJV0xfUEhZX0NBTElCUkFURV9ESUZGX0dBSU5fQ01ECQk9IDcsCiAJSVdMX1BIWV9DQUxJQlJBVEVfRENfQ01ECQk9IDgsCiAJSVdMX1BIWV9DQUxJQlJBVEVfTE9fQ01ECQk9IDksCiAJSVdMX1BIWV9DQUxJQlJBVEVfVFhfSVFfQ01ECQk9IDExLApAQCAtMzE2NiwyMiArMzE3NiwzNiBAQAogCiAjZGVmaW5lIElXTF9NQVhfUEhZX0NBTElCUkFURV9UQkxfU0laRQkJKDI1MykKIAotI2RlZmluZSBJV0xfQ0FMSUJfSU5JVF9DRkdfQUxMCWNwdV90b19sZTMyKDB4ZmZmZmZmZmYpCi0KIC8qIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBiaXRtYXAgb2YgdmFyaW91cyBjYWxpYnJhdGlvbnMgdG8gZW5hYmxlIGluIGJvdGgKICAqIGluaXQgdWNvZGUgYW5kIHJ1bnRpbWUgdWNvZGUgdGhyb3VnaCBDQUxJQlJBVElPTl9DRkdfQ01ELgogICovCiBlbnVtIGl3bF91Y29kZV9jYWxpYl9jZmcgewotCUlXTF9DQUxJQl9DRkdfUlhfQkJfSURYLAotCUlXTF9DQUxJQl9DRkdfRENfSURYLAotCUlXTF9DQUxJQl9DRkdfVFhfSVFfSURYLAotCUlXTF9DQUxJQl9DRkdfUlhfSVFfSURYLAotCUlXTF9DQUxJQl9DRkdfTk9JU0VfSURYLAotCUlXTF9DQUxJQl9DRkdfQ1JZU1RBTF9JRFgsCi0JSVdMX0NBTElCX0NGR19URU1QRVJBVFVSRV9JRFgsCi0JSVdMX0NBTElCX0NGR19QQVBEX0lEWCwKKwlJV0xfQ0FMSUJfQ0ZHX1JYX0JCX0lEWAkJCT0gQklUKDApLAorCUlXTF9DQUxJQl9DRkdfRENfSURYCQkJPSBCSVQoMSksCisJSVdMX0NBTElCX0NGR19MT19JRFgJCQk9IEJJVCgyKSwKKwlJV0xfQ0FMSUJfQ0ZHX1RYX0lRX0lEWAkJCT0gQklUKDMpLAorCUlXTF9DQUxJQl9DRkdfUlhfSVFfSURYCQkJPSBCSVQoNCksCisJSVdMX0NBTElCX0NGR19OT0lTRV9JRFgJCQk9IEJJVCg1KSwKKwlJV0xfQ0FMSUJfQ0ZHX0NSWVNUQUxfSURYCQk9IEJJVCg2KSwKKwlJV0xfQ0FMSUJfQ0ZHX1RFTVBFUkFUVVJFX0lEWAkJPSBCSVQoNyksCisJSVdMX0NBTElCX0NGR19QQVBEX0lEWAkJCT0gQklUKDgpLAorCUlXTF9DQUxJQl9DRkdfU0VOU0lUSVZJVFlfSURYCQk9IEJJVCg5KSwKKwlJV0xfQ0FMSUJfQ0ZHX1RYX1BXUl9JRFgJCT0gQklUKDEwKSwKIH07CiAKKyNkZWZpbmUgSVdMX0NBTElCX0lOSVRfQ0ZHX0FMTAljcHVfdG9fbGUzMihJV0xfQ0FMSUJfQ0ZHX1JYX0JCX0lEWCB8CVwKKwkJCQkJSVdMX0NBTElCX0NGR19EQ19JRFggfAkJXAorCQkJCQlJV0xfQ0FMSUJfQ0ZHX0xPX0lEWCB8CQlcCisJCQkJCUlXTF9DQUxJQl9DRkdfVFhfSVFfSURYIHwJXAorCQkJCQlJV0xfQ0FMSUJfQ0ZHX1JYX0lRX0lEWCB8CVwKKwkJCQkJSVdMX0NBTElCX0NGR19OT0lTRV9JRFggfAlcCisJCQkJCUlXTF9DQUxJQl9DRkdfQ1JZU1RBTF9JRFggfAlcCisJCQkJCUlXTF9DQUxJQl9DRkdfVEVNUEVSQVRVUkVfSURYIHwJXAorCQkJCQlJV0xfQ0FMSUJfQ0ZHX1BBUERfSURYIHwJXAorCQkJCQlJV0xfQ0FMSUJfQ0ZHX1NFTlNJVElWSVRZX0lEWCB8CVwKKwkJCQkJSVdMX0NBTElCX0NGR19UWF9QV1JfSURYKQorCisjZGVmaW5lIElXTF9DQUxJQl9DRkdfRkxBR19TRU5EX0NPTVBMRVRFX05URllfTVNLCWNwdV90b19sZTMyKEJJVCgwKSkKIAogc3RydWN0IGl3bF9jYWxpYl9jZmdfZWxtbnRfcyB7CiAJX19sZTMyIGlzX2VuYWJsZTsKQEAgLTMyMTUsMTUgKzMyMzksNiBAQAogCXU4IGRhdGFbMF07CiB9IF9fcGFja2VkOwogCi0vKiBJV0xfUEhZX0NBTElCUkFURV9ESUZGX0dBSU5fQ01EICg3KSAqLwotc3RydWN0IGl3bF9jYWxpYl9kaWZmX2dhaW5fY21kIHsKLQlzdHJ1Y3QgaXdsX2NhbGliX2hkciBoZHI7Ci0JczggZGlmZl9nYWluX2E7CQkvKiBzZWUgYWJvdmUgKi8KLQlzOCBkaWZmX2dhaW5fYjsKLQlzOCBkaWZmX2dhaW5fYzsKLQl1OCByZXNlcnZlZDE7Ci19IF9fcGFja2VkOwotCiBzdHJ1Y3QgaXdsX2NhbGliX3h0YWxfZnJlcV9jbWQgewogCXN0cnVjdCBpd2xfY2FsaWJfaGRyIGhkcjsKIAl1OCBjYXBfcGluMTsKQEAgLTMyMzEsMTEgKzMyNDYsMTEgQEAKIAl1OCBwYWRbMl07CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIERFRkFVTFRfUkFESU9fU0VOU09SX09GRlNFVCAgICAyNzAwCisjZGVmaW5lIERFRkFVTFRfUkFESU9fU0VOU09SX09GRlNFVCAgICBjcHVfdG9fbGUxNigyNzAwKQogc3RydWN0IGl3bF9jYWxpYl90ZW1wZXJhdHVyZV9vZmZzZXRfY21kIHsKIAlzdHJ1Y3QgaXdsX2NhbGliX2hkciBoZHI7Ci0JczE2IHJhZGlvX3NlbnNvcl9vZmZzZXQ7Ci0JczE2IHJlc2VydmVkOworCV9fbGUxNiByYWRpb19zZW5zb3Jfb2Zmc2V0OworCV9fbGUxNiByZXNlcnZlZDsKIH0gX19wYWNrZWQ7CiAKIC8qIElXTF9QSFlfQ0FMSUJSQVRFX0NIQUlOX05PSVNFX1JFU0VUX0NNRCAqLwpAQCAtMzc1Niw2ICszNzcxLDEyNyBAQAogCXU4IHJlc2VydmVkWzJdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAorLyoKKyAqIFJFUExZX1dPV0xBTl9QQVRURVJOUworICovCisjZGVmaW5lIElXTEFHTl9XT1dMQU5fTUlOX1BBVFRFUk5fTEVOCTE2CisjZGVmaW5lIElXTEFHTl9XT1dMQU5fTUFYX1BBVFRFUk5fTEVOCTEyOAorCitzdHJ1Y3QgaXdsYWduX3dvd2xhbl9wYXR0ZXJuIHsKKwl1OCBtYXNrW0lXTEFHTl9XT1dMQU5fTUFYX1BBVFRFUk5fTEVOIC8gOF07CisJdTggcGF0dGVybltJV0xBR05fV09XTEFOX01BWF9QQVRURVJOX0xFTl07CisJdTggbWFza19zaXplOworCXU4IHBhdHRlcm5fc2l6ZTsKKwlfX2xlMTYgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIElXTEFHTl9XT1dMQU5fTUFYX1BBVFRFUk5TCTIwCisKK3N0cnVjdCBpd2xhZ25fd293bGFuX3BhdHRlcm5zX2NtZCB7CisJX19sZTMyIG5fcGF0dGVybnM7CisJc3RydWN0IGl3bGFnbl93b3dsYW5fcGF0dGVybiBwYXR0ZXJuc1tdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIFJFUExZX1dPV0xBTl9XQUtFVVBfRklMVEVSCisgKi8KK2VudW0gaXdsYWduX3dvd2xhbl93YWtldXBfZmlsdGVycyB7CisJSVdMQUdOX1dPV0xBTl9XQUtFVVBfTUFHSUNfUEFDS0VUCT0gQklUKDApLAorCUlXTEFHTl9XT1dMQU5fV0FLRVVQX1BBVFRFUk5fTUFUQ0gJPSBCSVQoMSksCisJSVdMQUdOX1dPV0xBTl9XQUtFVVBfQkVBQ09OX01JU1MJPSBCSVQoMiksCisJSVdMQUdOX1dPV0xBTl9XQUtFVVBfTElOS19DSEFOR0UJPSBCSVQoMyksCisJSVdMQUdOX1dPV0xBTl9XQUtFVVBfR1RLX1JFS0VZX0ZBSUwJPSBCSVQoNCksCisJSVdMQUdOX1dPV0xBTl9XQUtFVVBfUkZLSUxMCQk9IEJJVCg1KSwKKwlJV0xBR05fV09XTEFOX1dBS0VVUF9VQ09ERV9FUlJPUgk9IEJJVCg2KSwKKwlJV0xBR05fV09XTEFOX1dBS0VVUF9FQVBfSURFTlRfUkVRCT0gQklUKDcpLAorCUlXTEFHTl9XT1dMQU5fV0FLRVVQXzRXQVlfSEFORFNIQUtFCT0gQklUKDgpLAorCUlXTEFHTl9XT1dMQU5fV0FLRVVQX0FMV0FZUwkJPSBCSVQoOSksCisJSVdMQUdOX1dPV0xBTl9XQUtFVVBfRU5BQkxFX05FVF9ERVRFQ1QJPSBCSVQoMTApLAorfTsKKworc3RydWN0IGl3bGFnbl93b3dsYW5fd2FrZXVwX2ZpbHRlcl9jbWQgeworCV9fbGUzMiBlbmFibGVkOworCV9fbGUxNiBub25fcW9zX3NlcTsKKwl1OCBtaW5fc2xlZXBfc2Vjb25kczsKKwl1OCByZXNlcnZlZDsKKwlfX2xlMTYgcW9zX3NlcVs4XTsKK307CisKKy8qCisgKiBSRVBMWV9XT1dMQU5fVFNDX1JTQ19QQVJBTVMKKyAqLworI2RlZmluZSBJV0xBR05fTlVNX1JTQwkxNgorCitzdHJ1Y3QgdGtpcF9zYyB7CisJX19sZTE2IGl2MTY7CisJX19sZTE2IHBhZDsKKwlfX2xlMzIgaXYzMjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpd2xhZ25fdGtpcF9yc2NfdHNjIHsKKwlzdHJ1Y3QgdGtpcF9zYyB1bmljYXN0X3JzY1tJV0xBR05fTlVNX1JTQ107CisJc3RydWN0IHRraXBfc2MgbXVsdGljYXN0X3JzY1tJV0xBR05fTlVNX1JTQ107CisJc3RydWN0IHRraXBfc2MgdHNjOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFlc19zYyB7CisJX19sZTY0IHBuOworfSBfX3BhY2tlZDsKKworc3RydWN0IGl3bGFnbl9hZXNfcnNjX3RzYyB7CisJc3RydWN0IGFlc19zYyB1bmljYXN0X3JzY1tJV0xBR05fTlVNX1JTQ107CisJc3RydWN0IGFlc19zYyBtdWx0aWNhc3RfcnNjW0lXTEFHTl9OVU1fUlNDXTsKKwlzdHJ1Y3QgYWVzX3NjIHRzYzsKK30gX19wYWNrZWQ7CisKK3VuaW9uIGl3bGFnbl9hbGxfdHNjX3JzYyB7CisJc3RydWN0IGl3bGFnbl90a2lwX3JzY190c2MgdGtpcDsKKwlzdHJ1Y3QgaXdsYWduX2Flc19yc2NfdHNjIGFlczsKK307CisKK3N0cnVjdCBpd2xhZ25fd293bGFuX3JzY190c2NfcGFyYW1zX2NtZCB7CisJdW5pb24gaXdsYWduX2FsbF90c2NfcnNjIGFsbF90c2NfcnNjOworfSBfX3BhY2tlZDsKKworLyoKKyAqIFJFUExZX1dPV0xBTl9US0lQX1BBUkFNUworICovCisjZGVmaW5lIElXTEFHTl9NSUNfS0VZX1NJWkUJOAorI2RlZmluZSBJV0xBR05fUDFLX1NJWkUJCTUKK3N0cnVjdCBpd2xhZ25fbWljX2tleXMgeworCXU4IHR4W0lXTEFHTl9NSUNfS0VZX1NJWkVdOworCXU4IHJ4X3VuaWNhc3RbSVdMQUdOX01JQ19LRVlfU0laRV07CisJdTggcnhfbWNhc3RbSVdMQUdOX01JQ19LRVlfU0laRV07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaXdsYWduX3Axa19jYWNoZSB7CisJX19sZTE2IHAxa1tJV0xBR05fUDFLX1NJWkVdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBJV0xBR05fTlVNX1JYX1AxS19DQUNIRQkyCisKK3N0cnVjdCBpd2xhZ25fd293bGFuX3RraXBfcGFyYW1zX2NtZCB7CisJc3RydWN0IGl3bGFnbl9taWNfa2V5cyBtaWNfa2V5czsKKwlzdHJ1Y3QgaXdsYWduX3Axa19jYWNoZSB0eDsKKwlzdHJ1Y3QgaXdsYWduX3Axa19jYWNoZSByeF91bmlbSVdMQUdOX05VTV9SWF9QMUtfQ0FDSEVdOworCXN0cnVjdCBpd2xhZ25fcDFrX2NhY2hlIHJ4X211bHRpW0lXTEFHTl9OVU1fUlhfUDFLX0NBQ0hFXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBSRVBMWV9XT1dMQU5fS0VLX0tDS19NQVRFUklBTAorICovCisKKyNkZWZpbmUgSVdMQUdOX0tDS19NQVhfU0laRQkzMgorI2RlZmluZSBJV0xBR05fS0VLX01BWF9TSVpFCTMyCisKK3N0cnVjdCBpd2xhZ25fd293bGFuX2tla19rY2tfbWF0ZXJpYWxfY21kIHsKKwl1OAlrY2tbSVdMQUdOX0tDS19NQVhfU0laRV07CisJdTgJa2VrW0lXTEFHTl9LRUtfTUFYX1NJWkVdOworCV9fbGUxNglrY2tfbGVuOworCV9fbGUxNglrZWtfbGVuOworCV9fbGU2NAlyZXBsYXlfY3RyOworfSBfX3BhY2tlZDsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogKDEzKQogICogVW5pb24gb2YgYWxsIGV4cGVjdGVkIG5vdGlmaWNhdGlvbnMvcmVzcG9uc2VzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jCmluZGV4IDQ2NTNkZWEuLmNmMzc2ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmMKQEAgLTQyLDI3ICs0Miw3IEBACiAjaW5jbHVkZSAiaXdsLXN0YS5oIgogI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCiAjaW5jbHVkZSAiaXdsLWFnbi5oIgotCi0KLS8qCi0gKiBzZXQgYnRfY29leF9hY3RpdmUgdG8gdHJ1ZSwgdUNvZGUgd2lsbCBkbyBraWxsL2RlZmVyCi0gKiBldmVyeSB0aW1lIHRoZSBwcmlvcml0eSBsaW5lIGlzIGFzc2VydGVkIChCVCBpcyBzZW5kaW5nIHNpZ25hbHMgb24gdGhlCi0gKiBwcmlvcml0eSBsaW5lIGluIHRoZSBQQ0l4KS4KLSAqIHNldCBidF9jb2V4X2FjdGl2ZSB0byBmYWxzZSwgdUNvZGUgd2lsbCBpZ25vcmUgdGhlIEJUIGFjdGl2aXR5IGFuZAotICogcGVyZm9ybSB0aGUgbm9ybWFsIG9wZXJhdGlvbgotICoKLSAqIFVzZXIgbWlnaHQgZXhwZXJpZW5jZSB0cmFuc21pdCBpc3N1ZSBvbiBzb21lIHBsYXRmb3JtIGR1ZSB0byBXaUZpL0JUCi0gKiBjby1leGlzdCBwcm9ibGVtLiBUaGUgcG9zc2libGUgYmVoYXZpb3JzIGFyZToKLSAqICAgQWJsZSB0byBzY2FuIGFuZCBmaW5kaW5nIGFsbCB0aGUgYXZhaWxhYmxlIEFQCi0gKiAgIE5vdCBhYmxlIHRvIGFzc29jaWF0ZSB3aXRoIGFueSBBUAotICogT24gdGhvc2UgcGxhdGZvcm1zLCBXaUZpIGNvbW11bmljYXRpb24gY2FuIGJlIHJlc3RvcmVkIGJ5IHNldAotICogImJ0X2NvZXhfYWN0aXZlIiBtb2R1bGUgcGFyYW1ldGVyIHRvICJmYWxzZSIKLSAqCi0gKiBkZWZhdWx0OiBidF9jb2V4X2FjdGl2ZSA9IHRydWUgKEJUX0NPRVhfRU5BQkxFKQotICovCi1ib29sIGJ0X2NvZXhfYWN0aXZlID0gdHJ1ZTsKLW1vZHVsZV9wYXJhbShidF9jb2V4X2FjdGl2ZSwgYm9vbCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKGJ0X2NvZXhfYWN0aXZlLCAiZW5hYmxlIHdpZmkvYmx1ZXRvb3RoIGNvLWV4aXN0Iik7CisjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCiAKIHUzMiBpd2xfZGVidWdfbGV2ZWw7CiAKQEAgLTE2NCw3ICsxNDQsNyBAQAogCXNiYW5kLT5iaXRyYXRlcyA9ICZyYXRlc1tJV0xfRklSU1RfT0ZETV9SQVRFXTsKIAlzYmFuZC0+bl9iaXRyYXRlcyA9IElXTF9SQVRFX0NPVU5UX0xFR0FDWSAtIElXTF9GSVJTVF9PRkRNX1JBVEU7CiAKLQlpZiAocHJpdi0+Y2ZnLT5za3UgJiBJV0xfU0tVX04pCisJaWYgKHByaXYtPmNmZy0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRSkKIAkJaXdsY29yZV9pbml0X2h0X2h3X2NhcGFiKHByaXYsICZzYmFuZC0+aHRfY2FwLAogCQkJCQkgSUVFRTgwMjExX0JBTkRfNUdIWik7CiAKQEAgLTE3NCw3ICsxNTQsNyBAQAogCXNiYW5kLT5iaXRyYXRlcyA9IHJhdGVzOwogCXNiYW5kLT5uX2JpdHJhdGVzID0gSVdMX1JBVEVfQ09VTlRfTEVHQUNZOwogCi0JaWYgKHByaXYtPmNmZy0+c2t1ICYgSVdMX1NLVV9OKQorCWlmIChwcml2LT5jZmctPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUpCiAJCWl3bGNvcmVfaW5pdF9odF9od19jYXBhYihwcml2LCAmc2JhbmQtPmh0X2NhcCwKIAkJCQkJIElFRUU4MDIxMV9CQU5EXzJHSFopOwogCkBAIC0yMjksMTIgKzIwOSwxMiBAQAogCXByaXYtPnR4X3Bvd2VyX25leHQgPSBtYXhfdHhfcG93ZXI7CiAKIAlpZiAoKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fY2hhbm5lbHMgPT0gMCkgJiYKLQkgICAgIHByaXYtPmNmZy0+c2t1ICYgSVdMX1NLVV9BKSB7CisJICAgICBwcml2LT5jZmctPnNrdSAmIEVFUFJPTV9TS1VfQ0FQX0JBTkRfNTJHSFopIHsKKwkJY2hhciBidWZbMzJdOworCQlidXNfZ2V0X2h3X2lkKHByaXYtPmJ1cywgYnVmLCBzaXplb2YoYnVmKSk7CiAJCUlXTF9JTkZPKHByaXYsICJJbmNvcnJlY3RseSBkZXRlY3RlZCBCRyBjYXJkIGFzIEFCRy4gIgotCQkJIlBsZWFzZSBzZW5kIHlvdXIgUENJIElEIDB4JTA0WDoweCUwNFggdG8gbWFpbnRhaW5lci5cbiIsCi0JCQkgICBwcml2LT5wY2lfZGV2LT5kZXZpY2UsCi0JCQkgICBwcml2LT5wY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKLQkJcHJpdi0+Y2ZnLT5za3UgJj0gfklXTF9TS1VfQTsKKwkJCSJQbGVhc2Ugc2VuZCB5b3VyICVzIHRvIG1haW50YWluZXIuXG4iLCBidWYpOworCQlwcml2LT5jZmctPnNrdSAmPSB+RUVQUk9NX1NLVV9DQVBfQkFORF81MkdIWjsKIAl9CiAKIAlJV0xfSU5GTyhwcml2LCAiVHVuYWJsZSBjaGFubmVsczogJWQgODAyLjExYmcsICVkIDgwMi4xMWEgY2hhbm5lbHNcbiIsCkBAIC0zODMsNiArMzYzLDggQEAKIAkJY3R4LT50aW1pbmcuYmVhY29uX2ludGVydmFsID0gY3B1X3RvX2xlMTYoYmVhY29uX2ludCk7CiAJfQogCisJY3R4LT5iZWFjb25faW50ID0gYmVhY29uX2ludDsKKwogCXRzZiA9IHByaXYtPnRpbWVzdGFtcDsgLyogdHNmIGlzIG1vZGlmZWQgYnkgZG9fZGl2OiBjb3B5IGl0ICovCiAJaW50ZXJ2YWxfdG0gPSBiZWFjb25faW50ICogVElNRV9VTklUOwogCXJlbSA9IGRvX2Rpdih0c2YsIGludGVydmFsX3RtKTsKQEAgLTM5Niw4ICszNzgsOCBAQAogCQkJbGUzMl90b19jcHUoY3R4LT50aW1pbmcuYmVhY29uX2luaXRfdmFsKSwKIAkJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmF0aW1fd2luZG93KSk7CiAKLQlyZXR1cm4gaXdsX3NlbmRfY21kX3BkdShwcml2LCBjdHgtPnJ4b25fdGltaW5nX2NtZCwKLQkJCQlzaXplb2YoY3R4LT50aW1pbmcpLCAmY3R4LT50aW1pbmcpOworCXJldHVybiB0cmFuc19zZW5kX2NtZF9wZHUoJnByaXYtPnRyYW5zLCBjdHgtPnJ4b25fdGltaW5nX2NtZCwKKwkJCQlDTURfU1lOQywgc2l6ZW9mKGN0eC0+dGltaW5nKSwgJmN0eC0+dGltaW5nKTsKIH0KIAogdm9pZCBpd2xfc2V0X3J4b25faHdjcnlwdG8oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LApAQCAtNTQ3LDE5ICs1MjksNiBAQAogCXJldHVybiAwOwogfQogCi11OCBpd2xfcmF0ZV9nZXRfbG93ZXN0X3BsY3Aoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JLyoKLQkgKiBBc3NpZ24gdGhlIGxvd2VzdCByYXRlIC0tIHNob3VsZCByZWFsbHkgZ2V0IHRoaXMgZnJvbQotCSAqIHRoZSBiZWFjb24gc2tiIGZyb20gbWFjODAyMTEuCi0JICovCi0JaWYgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykKLQkJcmV0dXJuIElXTF9SQVRFXzFNX1BMQ1A7Ci0JZWxzZQotCQlyZXR1cm4gSVdMX1JBVEVfNk1fUExDUDsKLX0KLQogc3RhdGljIHZvaWQgX2l3bF9zZXRfcnhvbl9odChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkgICAgIHN0cnVjdCBpd2xfaHRfY29uZmlnICpodF9jb25mLAogCQkJICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQpAQCAtNjE5LDggKzU4OCw3IEBACiAJCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9MRUdBQ1k7CiAJfQogCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7CisJaXdsYWduX3NldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7CiAKIAlJV0xfREVCVUdfQVNTT0MocHJpdiwgInJ4b24gZmxhZ3MgMHglWCBvcGVyYXRpb24gbW9kZSA6MHglWCAiCiAJCQkiZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IDB4JXhcbiIsCkBAIC04NDMsMTIgKzgxMSw4IEBACiAJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlyZXR1cm47CiAKLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKSB7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCiAJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBpc19zdWNjZXNzKTsKLQkJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JfQogfQogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKQEAgLTg3OCwxMiArODQyLDEyIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3YWl0X2VudHJ5OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPl9hZ24ubm90aWZfd2FpdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3YWl0X2VudHJ5LCAmcHJpdi0+X2Fnbi5ub3RpZl93YWl0cywgbGlzdCkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bm90aWZfd2FpdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3YWl0X2VudHJ5LCAmcHJpdi0+bm90aWZfd2FpdHMsIGxpc3QpCiAJCXdhaXRfZW50cnktPmFib3J0ZWQgPSB0cnVlOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPl9hZ24ubm90aWZfd2FpdF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bm90aWZfd2FpdF9sb2NrLCBmbGFncyk7CiAKLQl3YWtlX3VwX2FsbCgmcHJpdi0+X2Fnbi5ub3RpZl93YWl0cSk7CisJd2FrZV91cF9hbGwoJnByaXYtPm5vdGlmX3dhaXRxKTsKIH0KIAogdm9pZCBpd2xhZ25fZndfZXJyb3Ioc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIG9uZGVtYW5kKQpAQCAtMTAyMiw4ICs5ODYsNiBAQAogaW50IGl3bF9hcG1faW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJaW50IHJldCA9IDA7Ci0JdTE2IGxjdGw7Ci0KIAlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW5pdCBjYXJkJ3MgYmFzaWMgZnVuY3Rpb25zXG4iKTsKIAogCS8qCkBAIC0xMDUyLDI3ICsxMDE0LDcgQEAKIAlpd2xfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKIAkJCQkgICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0hBUF9XQUtFX0wxQSk7CiAKLQkvKgotCSAqIEhXIGJ1ZyBXL0EgZm9yIGluc3RhYmlsaXR5IGluIFBDSWUgYnVzIEwwLT5MMFMtPkwxIHRyYW5zaXRpb24uCi0JICogQ2hlY2sgaWYgQklPUyAob3IgT1MpIGVuYWJsZWQgTDEtQVNQTSBvbiB0aGlzIGRldmljZS4KLQkgKiBJZiBzbyAobGlrZWx5KSwgZGlzYWJsZSBMMFMsIHNvIGRldmljZSBtb3ZlcyBkaXJlY3RseSBMMC0+TDE7Ci0JICogICAgY29zdHMgbmVnbGlnaWJsZSBhbW91bnQgb2YgcG93ZXIgc2F2aW5ncy4KLQkgKiBJZiBub3QgKHVubGlrZWx5KSwgZW5hYmxlIEwwUywgc28gdGhlcmUgaXMgYXQgbGVhc3Qgc29tZQotCSAqICAgIHBvd2VyIHNhdmluZ3MsIGV2ZW4gd2l0aG91dCBMMS4KLQkgKi8KLQlsY3RsID0gaXdsX3BjaWVfbGlua19jdGwocHJpdik7Ci0JaWYgKChsY3RsICYgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wxX0VOKSA9PQotCQkJCVBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTikgewotCQkvKiBMMS1BU1BNIGVuYWJsZWQ7IGRpc2FibGUoISkgTDBTICAqLwotCQlpd2xfc2V0X2JpdChwcml2LCBDU1JfR0lPX1JFRywKLQkJCQlDU1JfR0lPX1JFR19WQUxfTDBTX0VOQUJMRUQpOwotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkwxIEVuYWJsZWQ7IERpc2FibGluZyBMMFNcbiIpOwotCX0gZWxzZSB7Ci0JCS8qIEwxLUFTUE0gZGlzYWJsZWQ7IGVuYWJsZSghKSBMMFMgKi8KLQkJaXdsX2NsZWFyX2JpdChwcml2LCBDU1JfR0lPX1JFRywKLQkJCQlDU1JfR0lPX1JFR19WQUxfTDBTX0VOQUJMRUQpOwotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkwxIERpc2FibGVkOyBFbmFibGluZyBMMFNcbiIpOwotCX0KKwlidXNfYXBtX2NvbmZpZyhwcml2LT5idXMpOwogCiAJLyogQ29uZmlndXJlIGFuYWxvZyBwaGFzZS1sb2NrLWxvb3AgYmVmb3JlIGFjdGl2YXRpbmcgdG8gRDBBICovCiAJaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnBsbF9jZmdfdmFsKQpAQCAtMTEzMSw5ICsxMDczLDYgQEAKIAlpZiAocHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQgPT0gdHhfcG93ZXIgJiYgIWZvcmNlKQogCQlyZXR1cm4gMDsKIAotCWlmICghcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2VuZF90eF9wb3dlcikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCiAJaWYgKHR4X3Bvd2VyIDwgSVdMQUdOX1RYX1BPV0VSX1RBUkdFVF9QT1dFUl9NSU4pIHsKIAkJSVdMX1dBUk4ocHJpdiwKIAkJCSAiUmVxdWVzdGVkIHVzZXIgVFhQT1dFUiAlZCBiZWxvdyBsb3dlciBsaW1pdCAlZC5cbiIsCkBAIC0xMTY3LDcgKzExMDYsNyBAQAogCXByZXZfdHhfcG93ZXIgPSBwcml2LT50eF9wb3dlcl91c2VyX2xtdDsKIAlwcml2LT50eF9wb3dlcl91c2VyX2xtdCA9IHR4X3Bvd2VyOwogCi0JcmV0ID0gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2VuZF90eF9wb3dlcihwcml2KTsKKwlyZXQgPSBpd2xhZ25fc2VuZF90eF9wb3dlcihwcml2KTsKIAogCS8qIGlmIGZhaWwgdG8gc2V0IHR4X3Bvd2VyLCByZXN0b3JlIHRoZSBvcmlnLiB0eCBwb3dlciAqLwogCWlmIChyZXQpIHsKQEAgLTExODYsNyArMTEyNSw3IEBACiAJCS5raWxsX2N0c19tYXNrID0gMCwKIAl9OwogCi0JaWYgKCFidF9jb2V4X2FjdGl2ZSkKKwlpZiAoIWl3bGFnbl9tb2RfcGFyYW1zLmJ0X2NvZXhfYWN0aXZlKQogCQlidF9jbWQuZmxhZ3MgPSBCVF9DT0VYX0RJU0FCTEU7CiAJZWxzZQogCQlidF9jbWQuZmxhZ3MgPSBCVF9DT0VYX0VOQUJMRTsKQEAgLTExOTUsOCArMTEzNCw4IEBACiAJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJUIGNvZXggJXNcbiIsCiAJCShidF9jbWQuZmxhZ3MgPT0gQlRfQ09FWF9ESVNBQkxFKSA/ICJkaXNhYmxlIiA6ICJhY3RpdmUiKTsKIAotCWlmIChpd2xfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX0JUX0NPTkZJRywKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfYnRfY21kKSwgJmJ0X2NtZCkpCisJaWYgKHRyYW5zX3NlbmRfY21kX3BkdSgmcHJpdi0+dHJhbnMsIFJFUExZX0JUX0NPTkZJRywKKwkJCSAgICAgQ01EX1NZTkMsIHNpemVvZihzdHJ1Y3QgaXdsX2J0X2NtZCksICZidF9jbWQpKQogCQlJV0xfRVJSKHByaXYsICJmYWlsZWQgdG8gc2VuZCBCVCBDb2V4IENvbmZpZ1xuIik7CiB9CiAKQEAgLTEyMDgsMTEgKzExNDcsMTMgQEAKIAl9OwogCiAJaWYgKGZsYWdzICYgQ01EX0FTWU5DKQotCQlyZXR1cm4gaXdsX3NlbmRfY21kX3BkdV9hc3luYyhwcml2LCBSRVBMWV9TVEFUSVNUSUNTX0NNRCwKKwkJcmV0dXJuIHRyYW5zX3NlbmRfY21kX3BkdSgmcHJpdi0+dHJhbnMsIFJFUExZX1NUQVRJU1RJQ1NfQ01ELAorCQkJCQkgICAgICBDTURfQVNZTkMsCiAJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9zdGF0aXN0aWNzX2NtZCksCi0JCQkJCSAgICAgICAmc3RhdGlzdGljc19jbWQsIE5VTEwpOworCQkJCQkgICAgICAgJnN0YXRpc3RpY3NfY21kKTsKIAllbHNlCi0JCXJldHVybiBpd2xfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1NUQVRJU1RJQ1NfQ01ELAorCQlyZXR1cm4gdHJhbnNfc2VuZF9jbWRfcGR1KCZwcml2LT50cmFucywgUkVQTFlfU1RBVElTVElDU19DTUQsCisJCQkJCUNNRF9TWU5DLAogCQkJCQlzaXplb2Yoc3RydWN0IGl3bF9zdGF0aXN0aWNzX2NtZCksCiAJCQkJCSZzdGF0aXN0aWNzX2NtZCk7CiB9CkBAIC0xMjc5LDEwICsxMjIwLDkgQEAKIHsKIAlpd2xfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhwcml2LCBjdHgpOwogCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7CisJaXdsYWduX3NldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7CiAKLQlyZXR1cm4gaXdsY29yZV9jb21taXRfcnhvbihwcml2LCBjdHgpOworCXJldHVybiBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKIH0KIAogc3RhdGljIGludCBpd2xfc2V0dXBfaW50ZXJmYWNlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKQEAgLTE0MzUsMjYgKzEzNzUsNiBAQAogCiB9CiAKLWludCBpd2xfYWxsb2NfdHhxX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaWYgKCFwcml2LT50eHEpCi0JCXByaXYtPnR4cSA9IGt6YWxsb2MoCi0JCQlzaXplb2Yoc3RydWN0IGl3bF90eF9xdWV1ZSkgKgotCQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMsCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPnR4cSkgewotCQlJV0xfRVJSKHByaXYsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdHhxXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXJldHVybiAwOwotfQotCi12b2lkIGl3bF9mcmVlX3R4cV9tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWtmcmVlKHByaXYtPnR4cSk7Ci0JcHJpdi0+dHhxID0gTlVMTDsKLX0KLQogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKIAogI2RlZmluZSBJV0xfVFJBRkZJQ19EVU1QX1NJWkUJKElXTF9UUkFGRklDX0VOVFJZX1NJWkUgKiBJV0xfVFJBRkZJQ19FTlRSSUVTKQpAQCAtMTc2Nyw2ICsxNjg3LDcgQEAKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmJzc19jdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKnRtcDsKKwllbnVtIG5sODAyMTFfaWZ0eXBlIG5ld3ZpZnR5cGUgPSBuZXd0eXBlOwogCXUzMiBpbnRlcmZhY2VfbW9kZXM7CiAJaW50IGVycjsKIApAQCAtMTgyMiw3ICsxNzQzLDcgQEAKIAogCS8qIHN1Y2Nlc3MgKi8KIAlpd2xfdGVhcmRvd25faW50ZXJmYWNlKHByaXYsIHZpZiwgdHJ1ZSk7Ci0JdmlmLT50eXBlID0gbmV3dHlwZTsKKwl2aWYtPnR5cGUgPSBuZXd2aWZ0eXBlOwogCXZpZi0+cDJwID0gbmV3cDJwOwogCWVyciA9IGl3bF9zZXR1cF9pbnRlcmZhY2UocHJpdiwgY3R4KTsKIAlXQVJOX09OKGVycik7CkBAIC0xOTE1LDcgKzE4MzYsNyBAQAogewogCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dDsKIAotCWlmICh0aW1lb3V0KQorCWlmICh0aW1lb3V0ICYmICFpd2xhZ25fbW9kX3BhcmFtcy53ZF9kaXNhYmxlKQogCQltb2RfdGltZXIoJnByaXYtPndhdGNoZG9nLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhJV0xfV0RfVElDSyh0aW1lb3V0KSkpOwogCWVsc2UKQEAgLTE5NzYsMzUgKzE4OTcsMjggQEAKIAogI2lmZGVmIENPTkZJR19QTQogCi1pbnQgaXdsX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK2ludCBpd2xfc3VzcGVuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCiAJLyoKIAkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHN5c3RlbSBnb2VzIGludG8gc3VzcGVuZCBzdGF0ZQogCSAqIG1hYzgwMjExIHdpbGwgY2FsbCBpd2xfbWFjX3N0b3AoKSBmcm9tIHRoZSBtYWM4MDIxMSBzdXNwZW5kIGZ1bmN0aW9uCiAJICogZmlyc3QgYnV0IHNpbmNlIGl3bF9tYWNfc3RvcCgpIGhhcyBubyBrbm93bGVkZ2Ugb2Ygd2hvIHRoZSBjYWxsZXIgaXMsCiAJICogaXQgd2lsbCBub3QgY2FsbCBhcG1fb3BzLnN0b3AoKSB0byBzdG9wIHRoZSBETUEgb3BlcmF0aW9uLgogCSAqIENhbGxpbmcgYXBtX29wcy5zdG9wIGhlcmUgdG8gbWFrZSBzdXJlIHdlIHN0b3AgdGhlIERNQS4KKwkgKgorCSAqIEJ1dCBvZiBjb3Vyc2UgLi4uIGlmIHdlIGhhdmUgY29uZmlndXJlZCBXb1dMQU4gdGhlbiB3ZSBkaWQgb3RoZXIKKwkgKiB0aGluZ3MgYWxyZWFkeSA6LSkKIAkgKi8KLQlpd2xfYXBtX3N0b3AocHJpdik7CisJaWYgKCFwcml2LT53b3dsYW4pCisJCWl3bF9hcG1fc3RvcChwcml2KTsKIAogCXJldHVybiAwOwogfQogCi1pbnQgaXdsX3BjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoraW50IGl3bF9yZXN1bWUoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlib29sIGh3X3Jma2lsbCA9IGZhbHNlOwogCi0JLyoKLQkgKiBXZSBkaXNhYmxlIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyICgweDQxKSB0byBrZWVwCi0JICogUENJIFR4IHJldHJpZXMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIEMzIENQVSBzdGF0ZS4KLQkgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NGR19SRVRSWV9USU1FT1VULCAweDAwKTsKLQogCWl3bF9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKIAogCWlmICghKGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKSAmCkBAIC0yMDIxLDEzICsxOTM1LDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaXdsX3BtX29wcyA9IHsKLQkuc3VzcGVuZCA9IGl3bF9wY2lfc3VzcGVuZCwKLQkucmVzdW1lID0gaXdsX3BjaV9yZXN1bWUsCi0JLmZyZWV6ZSA9IGl3bF9wY2lfc3VzcGVuZCwKLQkudGhhdyA9IGl3bF9wY2lfcmVzdW1lLAotCS5wb3dlcm9mZiA9IGl3bF9wY2lfc3VzcGVuZCwKLQkucmVzdG9yZSA9IGl3bF9wY2lfcmVzdW1lLAotfTsKLQogI2VuZGlmIC8qIENPTkZJR19QTSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oCmluZGV4IDNiYjc2ZjYuLjNlNmJiNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKQEAgLTc2LDk1ICs3NiwyOSBAQAogI2RlZmluZSBEUlZfQ09QWVJJR0hUCSJDb3B5cmlnaHQoYykgMjAwMy0yMDExIEludGVsIENvcnBvcmF0aW9uIgogI2RlZmluZSBEUlZfQVVUSE9SICAgICAiPGlsd0BsaW51eC5pbnRlbC5jb20+IgogCi0jZGVmaW5lIElXTF9QQ0lfREVWSUNFKGRldiwgc3ViZGV2LCBjZmcpIFwKLQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwgIC5kZXZpY2UgPSAoZGV2KSwgXAotCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELCAuc3ViZGV2aWNlID0gKHN1YmRldiksIFwKLQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpJihjZmcpCi0KICNkZWZpbmUgVElNRV9VTklUCQkxMDI0CiAKLSNkZWZpbmUgSVdMX1NLVV9HICAgICAgIDB4MQotI2RlZmluZSBJV0xfU0tVX0EgICAgICAgMHgyCi0jZGVmaW5lIElXTF9TS1VfTiAgICAgICAweDgKLQogI2RlZmluZSBJV0xfQ01EKHgpIGNhc2UgeDogcmV0dXJuICN4CiAKLXN0cnVjdCBpd2xfaGNtZF9vcHMgewotCWludCAoKmNvbW1pdF9yeG9uKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotCXZvaWQgKCpzZXRfcnhvbl9jaGFpbikoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotCWludCAoKnNldF90eF9hbnQpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggdmFsaWRfdHhfYW50KTsKLQl2b2lkICgqc2VuZF9idF9jb25maWcpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0JaW50ICgqc2V0X3Bhbl9wYXJhbXMpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci19OwotCi1zdHJ1Y3QgaXdsX2hjbWRfdXRpbHNfb3BzIHsKLQl1MTYgKCpidWlsZF9hZGRzdGFfaGNtZCkoY29uc3Qgc3RydWN0IGl3bF9hZGRzdGFfY21kICpjbWQsIHU4ICpkYXRhKTsKLQl2b2lkICgqZ2Fpbl9jb21wdXRhdGlvbikoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJdTMyICphdmVyYWdlX25vaXNlLAotCQkJdTE2IG1pbl9hdmVyYWdlX25vaXNlX2FudGVubmF0X2ksCi0JCQl1MzIgbWluX2F2ZXJhZ2Vfbm9pc2UsCi0JCQl1OCBkZWZhdWx0X2NoYWluKTsKLQl2b2lkICgqY2hhaW5fbm9pc2VfcmVzZXQpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0Jdm9pZCAoKnR4X2NtZF9wcm90ZWN0aW9uKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJICBfX2xlMTYgZmMsIF9fbGUzMiAqdHhfZmxhZ3MpOwotCWludCAgKCpjYWxjX3Jzc2kpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgc3RydWN0IGl3bF9yeF9waHlfcmVzICpyeF9yZXNwKTsKLQlpbnQgKCpyZXF1ZXN0X3NjYW4pKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci0Jdm9pZCAoKnBvc3Rfc2Nhbikoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLX07Ci0KLXN0cnVjdCBpd2xfYXBtX29wcyB7Ci0JaW50ICgqaW5pdCkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQl2b2lkICgqY29uZmlnKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotfTsKLQotc3RydWN0IGl3bF90ZW1wX29wcyB7Ci0Jdm9pZCAoKnRlbXBlcmF0dXJlKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotfTsKLQogc3RydWN0IGl3bF9saWJfb3BzIHsKIAkvKiBzZXQgaHcgZGVwZW5kZW50IHBhcmFtZXRlcnMgKi8KIAlpbnQgKCpzZXRfaHdfcGFyYW1zKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCS8qIHNldHVwIFJ4IGhhbmRsZXIgKi8KLQl2b2lkICgqcnhfaGFuZGxlcl9zZXR1cCkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQkvKiBzZXR1cCBkZWZlcnJlZCB3b3JrICovCi0Jdm9pZCAoKnNldHVwX2RlZmVycmVkX3dvcmspKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisJLyogc2V0dXAgQlQgUnggaGFuZGxlciAqLworCXZvaWQgKCpidF9yeF9oYW5kbGVyX3NldHVwKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOworCS8qIHNldHVwIEJUIHJlbGF0ZWQgZGVmZXJyZWQgd29yayAqLworCXZvaWQgKCpidF9zZXR1cF9kZWZlcnJlZF93b3JrKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogCS8qIGNhbmNlbCBkZWZlcnJlZCB3b3JrICovCiAJdm9pZCAoKmNhbmNlbF9kZWZlcnJlZF93b3JrKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCS8qIGNoZWNrIHZhbGlkaXR5IG9mIHJ0YyBkYXRhIGFkZHJlc3MgKi8KLQlpbnQgKCppc192YWxpZF9ydGNfZGF0YV9hZGRyKSh1MzIgYWRkcik7CiAJaW50ICgqc2V0X2NoYW5uZWxfc3dpdGNoKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpOwotCS8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KLQlzdHJ1Y3QgaXdsX2FwbV9vcHMgYXBtX29wczsKLQotCS8qIHBvd2VyICovCi0JaW50ICgqc2VuZF90eF9wb3dlcikgKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0Jdm9pZCAoKnVwZGF0ZV9jaGFpbl9mbGFncykoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKKwkvKiBkZXZpY2Ugc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLworCXZvaWQgKCpuaWNfY29uZmlnKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogCiAJLyogZWVwcm9tIG9wZXJhdGlvbnMgKGFzIGRlZmluZWQgaW4gaXdsLWVlcHJvbS5oKSAqLwogCXN0cnVjdCBpd2xfZWVwcm9tX29wcyBlZXByb21fb3BzOwogCiAJLyogdGVtcGVyYXR1cmUgKi8KLQlzdHJ1Y3QgaXdsX3RlbXBfb3BzIHRlbXBfb3BzOwotCi0JaW50ICgqdHhmaWZvX2ZsdXNoKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiBmbHVzaF9jb250cm9sKTsKLQl2b2lkICgqZGV2X3R4Zmlmb19mbHVzaCkoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgZmx1c2hfY29udHJvbCk7Ci0KLX07Ci0KLS8qIE5JQyBzcGVjaWZpYyBvcHMgKi8KLXN0cnVjdCBpd2xfbmljX29wcyB7Ci0Jdm9pZCAoKmFkZGl0aW9uYWxfbmljX2NvbmZpZykoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLX07Ci0KLXN0cnVjdCBpd2xfb3BzIHsKLQljb25zdCBzdHJ1Y3QgaXdsX2xpYl9vcHMgKmxpYjsKLQljb25zdCBzdHJ1Y3QgaXdsX2hjbWRfb3BzICpoY21kOwotCWNvbnN0IHN0cnVjdCBpd2xfaGNtZF91dGlsc19vcHMgKnV0aWxzOwotCWNvbnN0IHN0cnVjdCBpd2xfbmljX29wcyAqbmljOworCXZvaWQgKCp0ZW1wZXJhdHVyZSkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIH07CiAKIHN0cnVjdCBpd2xfbW9kX3BhcmFtcyB7CkBAIC0xNzYsNiArMTEwLDEyIEBACiAJaW50IHJlc3RhcnRfZnc7CQkvKiBkZWY6IDEgPSByZXN0YXJ0IGZpcm13YXJlICovCiAJYm9vbCBwbGNwX2NoZWNrOwkvKiBkZWY6IHRydWUgPSBlbmFibGUgcGxjcCBoZWFsdGggY2hlY2sgKi8KIAlib29sIGFja19jaGVjazsJCS8qIGRlZjogZmFsc2UgPSBkaXNhYmxlIGFjayBoZWFsdGggY2hlY2sgKi8KKwlib29sIHdkX2Rpc2FibGU7CS8qIGRlZjogZmFsc2UgPSBlbmFibGUgc3R1Y2sgcXVldWUgY2hlY2sgKi8KKwlib29sIGJ0X2NvZXhfYWN0aXZlOwkvKiBkZWY6IHRydWUgPSBlbmFibGUgYnQgY29leCAqLworCWludCBsZWRfbW9kZTsJCS8qIGRlZjogMCA9IHN5c3RlbSBkZWZhdWx0ICovCisJYm9vbCBub19zbGVlcF9hdXRvYWRqdXN0OyAvKiBkZWY6IHRydWUgPSBkaXNhYmxlIGF1dG9hZGp1c3QgKi8KKwlib29sIHBvd2VyX3NhdmU7CS8qIGRlZjogZmFsc2UgPSBkaXNhYmxlIHBvd2VyIHNhdmUgKi8KKwlpbnQgcG93ZXJfbGV2ZWw7CS8qIGRlZjogMSA9IHBvd2VyIGxldmVsICovCiB9OwogCiAvKgpAQCAtMjI1LDcgKzE2NSw3IEBACiAgKiBAYW1wZHVfZmFjdG9yOiBNYXhpbXVtIEEtTVBEVSBsZW5ndGggZmFjdG9yCiAgKiBAYW1wZHVfZGVuc2l0eTogTWluaW11bSBBLU1QRFUgc3BhY2luZwogICogQGJ0X3Njb19kaXNhYmxlOiB1Q29kZSBzaG91bGQgbm90IHJlc3BvbnNlIHRvIEJUIGluIFNDTy9FU0NPIG1vZGUKLSovCisgKi8KIHN0cnVjdCBpd2xfYnRfcGFyYW1zIHsKIAlib29sIGFkdmFuY2VkX2J0X2NvZXhpc3Q7CiAJdTggYnRfaW5pdF90cmFmZmljX2xvYWQ7CkBAIC0yMzgsMTkgKzE3OCwzMSBAQAogfTsKIC8qCiAgKiBAdXNlX3J0c19mb3JfYWdncmVnYXRpb246IHVzZSBydHMvY3RzIHByb3RlY3Rpb24gZm9yIEhUIHRyYWZmaWMKLSovCisgKi8KIHN0cnVjdCBpd2xfaHRfcGFyYW1zIHsKIAljb25zdCBib29sIGh0X2dyZWVuZmllbGRfc3VwcG9ydDsgLyogaWYgdXNlZCBzZXQgdG8gdHJ1ZSAqLwogCWJvb2wgdXNlX3J0c19mb3JfYWdncmVnYXRpb247CisJZW51bSBpZWVlODAyMTFfc21wc19tb2RlIHNtcHNfbW9kZTsKIH07CiAKIC8qKgogICogc3RydWN0IGl3bF9jZmcKKyAqIEBuYW1lOiBPZmZpY2FsIG5hbWUgb2YgdGhlIGRldmljZQogICogQGZ3X25hbWVfcHJlOiBGaXJtd2FyZSBmaWxlbmFtZSBwcmVmaXguIFRoZSBhcGkgdmVyc2lvbiBhbmQgZXh0ZW5zaW9uCiAgKgkoLnVjb2RlKSB3aWxsIGJlIGFkZGVkIHRvIGZpbGVuYW1lIGJlZm9yZSBsb2FkaW5nIGZyb20gZGlzay4gVGhlCiAgKglmaWxlbmFtZSBpcyBjb25zdHJ1Y3RlZCBhcyBmd19uYW1lX3ByZTxhcGk+LnVjb2RlLgogICogQHVjb2RlX2FwaV9tYXg6IEhpZ2hlc3QgdmVyc2lvbiBvZiB1Q29kZSBBUEkgc3VwcG9ydGVkIGJ5IGRyaXZlci4KICAqIEB1Y29kZV9hcGlfbWluOiBMb3dlc3QgdmVyc2lvbiBvZiB1Q29kZSBBUEkgc3VwcG9ydGVkIGJ5IGRyaXZlci4KKyAqIEB2YWxpZF90eF9hbnQ6IHZhbGlkIHRyYW5zbWl0IGFudGVubmEKKyAqIEB2YWxpZF9yeF9hbnQ6IHZhbGlkIHJlY2VpdmUgYW50ZW5uYQorICogQHNrdTogc2t1IGluZm9ybWF0aW9uIGZyb20gRUVQUk9NCisgKiBAZWVwcm9tX3ZlcjogRUVQUk9NIHZlcnNpb24KKyAqIEBlZXByb21fY2FsaWJfdmVyOiBFRVBST00gY2FsaWJyYXRpb24gdmVyc2lvbgorICogQGxpYjogcG9pbnRlciB0byB0aGUgbGliIG9wcworICogQGFkZGl0aW9uYWxfbmljX2NvbmZpZzogYWRkaXRpb25hbCBuaWMgY29uZmlndXJhdGlvbgorICogQGJhc2VfcGFyYW1zOiBwb2ludGVyIHRvIGJhc2ljIHBhcmFtZXRlcnMKKyAqIEBodF9wYXJhbXM6IHBvaW50IHRvIGh0IHBhdGFtZXRlcnMKKyAqIEBidF9wYXJhbXM6IHBvaW50ZXIgdG8gYnQgcGFyYW1ldGVycwogICogQHBhX3R5cGU6IHVzZWQgYnkgNjAwMCBzZXJpZXMgb25seSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBQb3dlciBBbXBsaWZpZXIKICAqIEBuZWVkX2RjX2NhbGliOiBuZWVkIHRvIHBlcmZvcm0gaW5pdCBkYyBjYWxpYnJhdGlvbgogICogQG5lZWRfdGVtcF9vZmZzZXRfY2FsaWI6IG5lZWQgdG8gcGVyZm9ybSB0ZW1wZXJhdHVyZSBvZmZzZXQgY2FsaWJyYXRpb24KQEAgLTI2MCw3ICsyMTIsNiBAQAogICogQHJ4X3dpdGhfc2lzb19kaXZlcnNpdHk6IDF4MSBkZXZpY2Ugd2l0aCByeCBhbnRlbm5hIGRpdmVyc2l0eQogICogQGludGVybmFsX3dpbWF4X2NvZXg6IGludGVybmFsIHdpZmkvd2ltYXggY29tYm8gZGV2aWNlCiAgKiBAaXFfaW52ZXJ0OiBJL1EgaW52ZXJzaW9uCi0gKiBAZGlzYWJsZV9vdHBfcmVmcmVzaDogZGlzYWJsZSBPVFAgcmVmcmVzaCBjdXJyZW50IGxpbWl0CiAgKgogICogV2UgZW5hYmxlIHRoZSBkcml2ZXIgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3cnQgQVBJIHZlcnNpb24uIFRoZQogICogZHJpdmVyIHNwZWNpZmllcyB3aGljaCBBUElzIGl0IHN1cHBvcnRzICh3aXRoIEB1Y29kZV9hcGlfbWF4IGJlaW5nIHRoZQpAQCAtMjc3LDExICsyMjgsNyBAQAogICogfQogICoKICAqIFRoZSBpZGVhbCB1c2FnZSBvZiB0aGlzIGluZnJhc3RydWN0dXJlIGlzIHRvIHRyZWF0IGEgbmV3IHVjb2RlIEFQSQotICogcmVsZWFzZSBhcyBhIG5ldyBoYXJkd2FyZSByZXZpc2lvbi4gVGhhdCBpcywgdGhyb3VnaCB1dGlsaXppbmcgdGhlCi0gKiBpd2xfaGNtZF91dGlsc19vcHMgZXRjLiB3ZSBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgY29tbWFuZCBzdHJ1Y3R1cmVzCi0gKiBhbmQgZmxvd3MgYmV0d2VlbiBoYXJkd2FyZSB2ZXJzaW9ucyAoNDk2NS81MDAwKSBhcyB3ZWxsIGFzIHRoZWlyIEFQSQotICogdmVyc2lvbnMuCi0gKgorICogcmVsZWFzZSBhcyBhIG5ldyBoYXJkd2FyZSByZXZpc2lvbi4KICAqLwogc3RydWN0IGl3bF9jZmcgewogCS8qIHBhcmFtcyBzcGVjaWZpYyB0byBhbiBpbmRpdmlkdWFsIGRldmljZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCkBAIC0yOTEsMTAgKzIzOCwxMSBAQAogCWNvbnN0IHVuc2lnbmVkIGludCB1Y29kZV9hcGlfbWluOwogCXU4ICAgdmFsaWRfdHhfYW50OwogCXU4ICAgdmFsaWRfcnhfYW50OwotCXVuc2lnbmVkIGludCBza3U7CisJdTE2ICBza3U7CiAJdTE2ICBlZXByb21fdmVyOwogCXUxNiAgZWVwcm9tX2NhbGliX3ZlcjsKLQljb25zdCBzdHJ1Y3QgaXdsX29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBpd2xfbGliX29wcyAqbGliOworCXZvaWQgKCphZGRpdGlvbmFsX25pY19jb25maWcpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAJLyogcGFyYW1zIG5vdCBsaWtlbHkgdG8gY2hhbmdlIHdpdGhpbiBhIGRldmljZSBmYW1pbHkgKi8KIAlzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zICpiYXNlX3BhcmFtczsKIAkvKiBwYXJhbXMgbGlrZWx5IHRvIGNoYW5nZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCkBAIC0zMDksNyArMjU3LDYgQEAKIAljb25zdCBib29sIHJ4X3dpdGhfc2lzb19kaXZlcnNpdHk7CiAJY29uc3QgYm9vbCBpbnRlcm5hbF93aW1heF9jb2V4OwogCWNvbnN0IGJvb2wgaXFfaW52ZXJ0OwotCWNvbnN0IGJvb2wgZGlzYWJsZV9vdHBfcmVmcmVzaDsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM0Niw5ICsyOTMsNiBAQAogaW50IGl3bF9tYWNfY2hhbmdlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCSAgICAgZW51bSBubDgwMjExX2lmdHlwZSBuZXd0eXBlLCBib29sIG5ld3AycCk7Ci1pbnQgaXdsX2FsbG9jX3R4cV9tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2ZyZWVfdHhxX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwogaW50IGl3bF9hbGxvY190cmFmZmljX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogdm9pZCBpd2xfZnJlZV90cmFmZmljX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwpAQCAtMzkwLDI4ICszMzQsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJYCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGl3bF9jbWRfcXVldWVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfY21kX3F1ZXVlX3VubWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX3J4X3F1ZXVlX2FsbG9jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBpd2xfcnhfcXVldWUgKnEpOwotaW50IGl3bF9yeF9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpxKTsKLXZvaWQgaXdsX3R4X2NtZF9jb21wbGV0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLQogdm9pZCBpd2xfY2hzd2l0Y2hfZG9uZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgaXNfc3VjY2Vzcyk7CiAKLS8qIFRYIGhlbHBlcnMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFRYCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGl3bF90eHFfdXBkYXRlX3dyaXRlX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSk7Ci1pbnQgaXdsX3R4X3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCSAgICAgIGludCBzbG90c19udW0sIHUzMiB0eHFfaWQpOwotdm9pZCBpd2xfdHhfcXVldWVfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQlpbnQgc2xvdHNfbnVtLCB1MzIgdHhxX2lkKTsKLXZvaWQgaXdsX3R4X3F1ZXVlX2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKTsKLXZvaWQgaXdsX3R4X3F1ZXVlX3VubWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHR4cV9pZCk7CiB2b2lkIGl3bF9zZXR1cF93YXRjaGRvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBUWCBwb3dlcgpAQCAtNDE5LDEzICszNDMsNiBAQAogaW50IGl3bF9zZXRfdHhfcG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzOCB0eF9wb3dlciwgYm9vbCBmb3JjZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11OCBpd2xfcmF0ZV9nZXRfbG93ZXN0X3BsY3Aoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU2Nhbm5pbmcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIGl3bF9pbml0X3NjYW5fcGFyYW1zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CkBAIC00NjksNTEgKzM4NiwxOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBjb25zdCBjaGFyICpnZXRfY21kX3N0cmluZyh1OCBjbWQpOwotaW50IF9fbXVzdF9jaGVjayBpd2xfc2VuZF9jbWRfc3luYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGl3bF9ob3N0X2NtZCAqY21kKTsKLWludCBpd2xfc2VuZF9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpOwotaW50IF9fbXVzdF9jaGVjayBpd2xfc2VuZF9jbWRfcGR1KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggaWQsCi0JCQkJICB1MTYgbGVuLCBjb25zdCB2b2lkICpkYXRhKTsKLWludCBpd2xfc2VuZF9jbWRfcGR1X2FzeW5jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggaWQsIHUxNiBsZW4sCi0JCQkgICBjb25zdCB2b2lkICpkYXRhLAotCQkJICAgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCwKLQkJCQkJICAgIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QpKTsKLQotaW50IGl3bF9lbnF1ZXVlX2hjbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUENJCQkJCQkJICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbmxpbmUgdTE2IGl3bF9wY2llX2xpbmtfY3RsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcG9zOwotCXUxNiBwY2lfbG5rX2N0bDsKLQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHByaXYtPnBjaV9kZXYsIFBDSV9DQVBfSURfRVhQKTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwcml2LT5wY2lfZGV2LCBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgJnBjaV9sbmtfY3RsKTsKLQlyZXR1cm4gcGNpX2xua19jdGw7Ci19Ci0KIHZvaWQgaXdsX2JnX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiB1MzIgaXdsX3VzZWNzX3RvX2JlYWNvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgdXNlYywgdTMyIGJlYWNvbl9pbnRlcnZhbCk7CiBfX2xlMzIgaXdsX2FkZF9iZWFjb25fdGltZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBiYXNlLAogCQkJICAgdTMyIGFkZG9uLCB1MzIgYmVhY29uX2ludGVydmFsKTsKIAogI2lmZGVmIENPTkZJR19QTQotaW50IGl3bF9wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwotaW50IGl3bF9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaXdsX3BtX29wczsKLQotI2RlZmluZSBJV0xfUE1fT1BTCSgmaXdsX3BtX29wcykKLQotI2Vsc2UgLyogIUNPTkZJR19QTSAqLwotCi0jZGVmaW5lIElXTF9QTV9PUFMJTlVMTAotCitpbnQgaXdsX3N1c3BlbmQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK2ludCBpd2xfcmVzdW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAjZW5kaWYgLyogIUNPTkZJR19QTSAqLwogCitpbnQgaXdsX3Byb2JlKHN0cnVjdCBpd2xfYnVzICpidXMsIHN0cnVjdCBpd2xfY2ZnICpjZmcpOwordm9pZCBfX2RldmV4aXQgaXdsX3JlbW92ZShzdHJ1Y3QgaXdsX3ByaXYgKiBwcml2KTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBFcnJvciBIYW5kbGluZyBEZWJ1Z2dpbmcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU2MCw2ICs0NDUsNyBAQAogI2RlZmluZSBTVEFUVVNfUE9XRVJfUE1JCTE2CiAjZGVmaW5lIFNUQVRVU19GV19FUlJPUgkJMTcKICNkZWZpbmUgU1RBVFVTX0RFVklDRV9FTkFCTEVECTE4CisjZGVmaW5lIFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HIDE5CiAKIAogc3RhdGljIGlubGluZSBpbnQgaXdsX2lzX3JlYWR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKQEAgLTYxMiwxMSArNDk4LDcgQEAKIGludCBpd2xfYXBtX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIAogaW50IGl3bF9zZW5kX3J4b25fdGltaW5nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci1zdGF0aWMgaW5saW5lIGludCBpd2xjb3JlX2NvbW1pdF9yeG9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCXJldHVybiBwcml2LT5jZmctPm9wcy0+aGNtZC0+Y29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLX0KKwogc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICppd2xfZ2V0X2h3X21vZGUoCiAJCQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKIHsKQEAgLTYyOSw3ICs1MTEsNiBAQAogCSAgICAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdDsKIH0KIAotZXh0ZXJuIGJvb2wgYnRfY29leF9hY3RpdmU7CiBleHRlcm4gYm9vbCBidF9zaXNvX21vZGU7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY3NyLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jc3IuaAppbmRleCA1YWI5MGJhLi5kNmRiYjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jc3IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jc3IuaApAQCAtMzUxLDYgKzM1MSw3IEBACiAjZGVmaW5lIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCiAjZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCAgICAgICAgICAgKDB4MDAwMDAwMDQpCiAjZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxX1JFR19CSVRfQ1RfS0lMTF9FWElUICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9EM19DRkdfQ09NUExFVEUgICAgICAgKDB4MDAwMDAwMjApCiAKIC8qIEdQIERyaXZlciAqLwogI2RlZmluZSBDU1JfR1BfRFJJVkVSX1JFR19CSVRfUkFESU9fU0tVX01TSwkgICAgKDB4MDAwMDAwMDMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWcuaAppbmRleCAyODI0Y2NiLi5mOWE0MDdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnLmgKQEAgLTMyLDEwICszMiwxMCBAQAogc3RydWN0IGl3bF9wcml2OwogZXh0ZXJuIHUzMiBpd2xfZGVidWdfbGV2ZWw7CiAKLSNkZWZpbmUgSVdMX0VSUihwLCBmLCBhLi4uKSBkZXZfZXJyKCYoKHApLT5wY2lfZGV2LT5kZXYpLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfV0FSTihwLCBmLCBhLi4uKSBkZXZfd2FybigmKChwKS0+cGNpX2Rldi0+ZGV2KSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0lORk8ocCwgZiwgYS4uLikgZGV2X2luZm8oJigocCktPnBjaV9kZXYtPmRldiksIGYsICMjIGEpCi0jZGVmaW5lIElXTF9DUklUKHAsIGYsIGEuLi4pIGRldl9jcml0KCYoKHApLT5wY2lfZGV2LT5kZXYpLCBmLCAjIyBhKQorI2RlZmluZSBJV0xfRVJSKHAsIGYsIGEuLi4pIGRldl9lcnIocC0+YnVzLT5kZXYsIGYsICMjIGEpCisjZGVmaW5lIElXTF9XQVJOKHAsIGYsIGEuLi4pIGRldl93YXJuKHAtPmJ1cy0+ZGV2LCBmLCAjIyBhKQorI2RlZmluZSBJV0xfSU5GTyhwLCBmLCBhLi4uKSBkZXZfaW5mbyhwLT5idXMtPmRldiwgZiwgIyMgYSkKKyNkZWZpbmUgSVdMX0NSSVQocCwgZiwgYS4uLikgZGV2X2NyaXQocC0+YnVzLT5kZXYsIGYsICMjIGEpCiAKICNkZWZpbmUgaXdsX3ByaW50X2hleF9lcnJvcihwcml2LCBwLCBsZW4pIAkJCQlcCiBkbyB7CQkJCQkJCQkJXApAQCAtNzgsOCArNzgsNiBAQAogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKIGludCBpd2xfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCBjaGFyICpuYW1lKTsKIHZvaWQgaXdsX2RiZ2ZzX3VucmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsX2RiZ2ZzX3N0YXRpc3RpY3NfZmxhZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNoYXIgKmJ1ZiwKLQkJCQkgICAgIGludCBidWZzeik7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgaXdsX2RiZ2ZzX3JlZ2lzdGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTEyNSwxMyArMTIzLDEzIEBACiAvKiAweDAwMDAwRjAwIC0gMHgwMDAwMDEwMCAqLwogI2RlZmluZSBJV0xfRExfUE9XRVIJCSgxIDw8IDgpCiAjZGVmaW5lIElXTF9ETF9URU1QCQkoMSA8PCA5KQotI2RlZmluZSBJV0xfRExfTk9USUYJCSgxIDw8IDEwKQorLyogcmVzZXJ2ZWQgKDEgPDwgMTApICovCiAjZGVmaW5lIElXTF9ETF9TQ0FOCQkoMSA8PCAxMSkKIC8qIDB4MDAwMEYwMDAgLSAweDAwMDAxMDAwICovCiAjZGVmaW5lIElXTF9ETF9BU1NPQwkJKDEgPDwgMTIpCiAjZGVmaW5lIElXTF9ETF9EUk9QCQkoMSA8PCAxMykKLSNkZWZpbmUgSVdMX0RMX1RYUE9XRVIJCSgxIDw8IDE0KQotI2RlZmluZSBJV0xfRExfQVAJCSgxIDw8IDE1KQorLyogcmVzZXJ2ZWQgKDEgPDwgMTQpICovCisjZGVmaW5lIElXTF9ETF9DT0VYCQkoMSA8PCAxNSkKIC8qIDB4MDAwRjAwMDAgLSAweDAwMDEwMDAwICovCiAjZGVmaW5lIElXTF9ETF9GVwkJKDEgPDwgMTYpCiAjZGVmaW5lIElXTF9ETF9SRl9LSUxMCQkoMSA8PCAxNykKQEAgLTE3MSwxMiArMTY5LDEwIEBACiAjZGVmaW5lIElXTF9ERUJVR19EUk9QKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfRFJPUCwgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX0RST1BfTElNSVQocCwgZiwgYS4uLikJXAogCQlJV0xfREVCVUdfTElNSVQocCwgSVdMX0RMX0RST1AsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19BUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0FQLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfVFhQT1dFUihwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1RYUE9XRVIsIGYsICMjIGEpCisjZGVmaW5lIElXTF9ERUJVR19DT0VYKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfQ09FWCwgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX1JBVEUocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9SQVRFLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfUkFURV9MSU1JVChwLCBmLCBhLi4uKQlcCiAJCUlXTF9ERUJVR19MSU1JVChwLCBJV0xfRExfUkFURSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX05PVElGKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfTk9USUYsIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19BU1NPQyhwLCBmLCBhLi4uKQlcCiAJCUlXTF9ERUJVRyhwLCBJV0xfRExfQVNTT0MgfCBJV0xfRExfSU5GTywgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX0FTU09DX0xJTUlUKHAsIGYsIGEuLi4pCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnZnMuYwppbmRleCAwZTZhMDRiLi5lYzE0ODViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWdmcy5jCkBAIC0yMjcsNyArMjI3LDcgQEAKIAkvKiBkZWZhdWx0IGlzIHRvIGR1bXAgdGhlIGVudGlyZSBkYXRhIHNlZ21lbnQgKi8KIAlpZiAoIXByaXYtPmRiZ2ZzX3NyYW1fb2Zmc2V0ICYmICFwcml2LT5kYmdmc19zcmFtX2xlbikgewogCQlwcml2LT5kYmdmc19zcmFtX29mZnNldCA9IDB4ODAwMDAwOwotCQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9TVUJUWVBFX0lOSVQpCisJCWlmIChwcml2LT51Y29kZV90eXBlID09IElXTF9VQ09ERV9JTklUKQogCQkJcHJpdi0+ZGJnZnNfc3JhbV9sZW4gPSBwcml2LT51Y29kZV9pbml0LmRhdGEubGVuOwogCQllbHNlCiAJCQlwcml2LT5kYmdmc19zcmFtX2xlbiA9IHByaXYtPnVjb2RlX3J0LmRhdGEubGVuOwpAQCAtMzIyLDYgKzMyMiwxOSBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIHNzaXplX3QgaXdsX2RiZ2ZzX3dvd2xhbl9zcmFtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghcHJpdi0+d293bGFuX3NyYW0pCisJCXJldHVybiAtRU5PREFUQTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsCisJCQkJICAgICAgIHByaXYtPndvd2xhbl9zcmFtLAorCQkJCSAgICAgICBwcml2LT51Y29kZV93b3dsYW4uZGF0YS5sZW4pOworfQogc3RhdGljIHNzaXplX3QgaXdsX2RiZ2ZzX3N0YXRpb25zX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC04NTYsNiArODY5LDcgQEAKIH0KIAogREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHNyYW0pOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHdvd2xhbl9zcmFtKTsKIERFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhsb2dfZXZlbnQpOwogREVCVUdGU19SRUFEX0ZJTEVfT1BTKG52bSk7CiBERUJVR0ZTX1JFQURfRklMRV9PUFMoc3RhdGlvbnMpOwpAQCAtMTkxNSwxMjEgKzE5MjksMTIxIEBACiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU3RhdGlzdGljc19UWF9FcnJvcjpcbiIpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF90eF9mYWlsX3JlYXNvbihUWF9TVEFUVVNfUE9TVFBPTkVfREVMQVkpLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMucHBfZGVsYXkpOworCQkJIHByaXYtPnJlcGx5X3R4X3N0YXRzLnBwX2RlbGF5KTsKIAlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlczpcdFx0XHQldVxuIiwKIAkJCSBpd2xfZ2V0X3R4X2ZhaWxfcmVhc29uKFRYX1NUQVRVU19QT1NUUE9ORV9GRVdfQllURVMpLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMucHBfZmV3X2J5dGVzKTsKKwkJCSBwcml2LT5yZXBseV90eF9zdGF0cy5wcF9mZXdfYnl0ZXMpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHRcdCV1XG4iLAogCQkJIGl3bF9nZXRfdHhfZmFpbF9yZWFzb24oVFhfU1RBVFVTX1BPU1RQT05FX0JUX1BSSU8pLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMucHBfYnRfcHJpbyk7CisJCQkgcHJpdi0+cmVwbHlfdHhfc3RhdHMucHBfYnRfcHJpbyk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF90eF9mYWlsX3JlYXNvbihUWF9TVEFUVVNfUE9TVFBPTkVfUVVJRVRfUEVSSU9EKSwKLQkJCSBwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLnBwX3F1aWV0X3BlcmlvZCk7CisJCQkgcHJpdi0+cmVwbHlfdHhfc3RhdHMucHBfcXVpZXRfcGVyaW9kKTsKIAlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlczpcdFx0XHQldVxuIiwKIAkJCSBpd2xfZ2V0X3R4X2ZhaWxfcmVhc29uKFRYX1NUQVRVU19QT1NUUE9ORV9DQUxDX1RUQUspLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMucHBfY2FsY190dGFrKTsKKwkJCSBwcml2LT5yZXBseV90eF9zdGF0cy5wcF9jYWxjX3R0YWspOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHQldVxuIiwKIAkJCSBpd2xfZ2V0X3R4X2ZhaWxfcmVhc29uKAogCQkJCVRYX1NUQVRVU19GQUlMX0lOVEVSTkFMX0NST1NTRURfUkVUUlkpLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMuaW50X2Nyb3NzZWRfcmV0cnkpOworCQkJIHByaXYtPnJlcGx5X3R4X3N0YXRzLmludF9jcm9zc2VkX3JldHJ5KTsKIAlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlczpcdFx0XHQldVxuIiwKIAkJCSBpd2xfZ2V0X3R4X2ZhaWxfcmVhc29uKFRYX1NUQVRVU19GQUlMX1NIT1JUX0xJTUlUKSwKLQkJCSBwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLnNob3J0X2xpbWl0KTsKKwkJCSBwcml2LT5yZXBseV90eF9zdGF0cy5zaG9ydF9saW1pdCk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF90eF9mYWlsX3JlYXNvbihUWF9TVEFUVVNfRkFJTF9MT05HX0xJTUlUKSwKLQkJCSBwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLmxvbmdfbGltaXQpOworCQkJIHByaXYtPnJlcGx5X3R4X3N0YXRzLmxvbmdfbGltaXQpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHRcdCV1XG4iLAogCQkJIGl3bF9nZXRfdHhfZmFpbF9yZWFzb24oVFhfU1RBVFVTX0ZBSUxfRklGT19VTkRFUlJVTiksCi0JCQkgcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy5maWZvX3VuZGVycnVuKTsKKwkJCSBwcml2LT5yZXBseV90eF9zdGF0cy5maWZvX3VuZGVycnVuKTsKIAlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlczpcdFx0XHQldVxuIiwKIAkJCSBpd2xfZ2V0X3R4X2ZhaWxfcmVhc29uKFRYX1NUQVRVU19GQUlMX0RSQUlOX0ZMT1cpLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMuZHJhaW5fZmxvdyk7CisJCQkgcHJpdi0+cmVwbHlfdHhfc3RhdHMuZHJhaW5fZmxvdyk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF90eF9mYWlsX3JlYXNvbihUWF9TVEFUVVNfRkFJTF9SRktJTExfRkxVU0gpLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMucmZraWxsX2ZsdXNoKTsKKwkJCSBwcml2LT5yZXBseV90eF9zdGF0cy5yZmtpbGxfZmx1c2gpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHRcdCV1XG4iLAogCQkJIGl3bF9nZXRfdHhfZmFpbF9yZWFzb24oVFhfU1RBVFVTX0ZBSUxfTElGRV9FWFBJUkUpLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMubGlmZV9leHBpcmUpOworCQkJIHByaXYtPnJlcGx5X3R4X3N0YXRzLmxpZmVfZXhwaXJlKTsKIAlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlczpcdFx0XHQldVxuIiwKIAkJCSBpd2xfZ2V0X3R4X2ZhaWxfcmVhc29uKFRYX1NUQVRVU19GQUlMX0RFU1RfUFMpLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMuZGVzdF9wcyk7CisJCQkgcHJpdi0+cmVwbHlfdHhfc3RhdHMuZGVzdF9wcyk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF90eF9mYWlsX3JlYXNvbihUWF9TVEFUVVNfRkFJTF9IT1NUX0FCT1JURUQpLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMuaG9zdF9hYm9ydCk7CisJCQkgcHJpdi0+cmVwbHlfdHhfc3RhdHMuaG9zdF9hYm9ydCk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF90eF9mYWlsX3JlYXNvbihUWF9TVEFUVVNfRkFJTF9CVF9SRVRSWSksCi0JCQkgcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy5wcF9kZWxheSk7CisJCQkgcHJpdi0+cmVwbHlfdHhfc3RhdHMucHBfZGVsYXkpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHRcdCV1XG4iLAogCQkJIGl3bF9nZXRfdHhfZmFpbF9yZWFzb24oVFhfU1RBVFVTX0ZBSUxfU1RBX0lOVkFMSUQpLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMuc3RhX2ludmFsaWQpOworCQkJIHByaXYtPnJlcGx5X3R4X3N0YXRzLnN0YV9pbnZhbGlkKTsKIAlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlczpcdFx0XHQldVxuIiwKIAkJCSBpd2xfZ2V0X3R4X2ZhaWxfcmVhc29uKFRYX1NUQVRVU19GQUlMX0ZSQUdfRFJPUFBFRCksCi0JCQkgcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy5mcmFnX2Ryb3ApOworCQkJIHByaXYtPnJlcGx5X3R4X3N0YXRzLmZyYWdfZHJvcCk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF90eF9mYWlsX3JlYXNvbihUWF9TVEFUVVNfRkFJTF9USURfRElTQUJMRSksCi0JCQkgcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy50aWRfZGlzYWJsZSk7CisJCQkgcHJpdi0+cmVwbHlfdHhfc3RhdHMudGlkX2Rpc2FibGUpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHRcdCV1XG4iLAogCQkJIGl3bF9nZXRfdHhfZmFpbF9yZWFzb24oVFhfU1RBVFVTX0ZBSUxfRklGT19GTFVTSEVEKSwKLQkJCSBwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLmZpZm9fZmx1c2gpOworCQkJIHByaXYtPnJlcGx5X3R4X3N0YXRzLmZpZm9fZmx1c2gpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHQldVxuIiwKIAkJCSBpd2xfZ2V0X3R4X2ZhaWxfcmVhc29uKAogCQkJCVRYX1NUQVRVU19GQUlMX0lOU1VGRklDSUVOVF9DRl9QT0xMKSwKLQkJCSBwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLmluc3VmZl9jZl9wb2xsKTsKKwkJCSBwcml2LT5yZXBseV90eF9zdGF0cy5pbnN1ZmZfY2ZfcG9sbCk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF90eF9mYWlsX3JlYXNvbihUWF9TVEFUVVNfRkFJTF9QQVNTSVZFX05PX1JYKSwKLQkJCSBwcml2LT5fYWduLnJlcGx5X3R4X3N0YXRzLmZhaWxfaHdfZHJvcCk7CisJCQkgcHJpdi0+cmVwbHlfdHhfc3RhdHMuZmFpbF9od19kcm9wKTsKIAlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlczpcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF90eF9mYWlsX3JlYXNvbigKIAkJCQlUWF9TVEFUVVNfRkFJTF9OT19CRUFDT05fT05fUkFEQVIpLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfdHhfc3RhdHMuc3RhX2NvbG9yX21pc21hdGNoKTsKKwkJCSBwcml2LT5yZXBseV90eF9zdGF0cy5zdGFfY29sb3JfbWlzbWF0Y2gpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlVOS05PV046XHRcdFx0JXVcbiIsCi0JCQkgcHJpdi0+X2Fnbi5yZXBseV90eF9zdGF0cy51bmtub3duKTsKKwkJCSBwcml2LT5yZXBseV90eF9zdGF0cy51bmtub3duKTsKIAogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKIAkJCSAiXG5TdGF0aXN0aWNzX0FnZ19UWF9FcnJvcjpcbiIpOwogCiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF9hZ2dfdHhfZmFpbF9yZWFzb24oQUdHX1RYX1NUQVRFX1VOREVSUlVOX01TSyksCi0JCQkgcHJpdi0+X2Fnbi5yZXBseV9hZ2dfdHhfc3RhdHMudW5kZXJydW4pOworCQkJIHByaXYtPnJlcGx5X2FnZ190eF9zdGF0cy51bmRlcnJ1bik7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF9hZ2dfdHhfZmFpbF9yZWFzb24oQUdHX1RYX1NUQVRFX0JUX1BSSU9fTVNLKSwKLQkJCSBwcml2LT5fYWduLnJlcGx5X2FnZ190eF9zdGF0cy5idF9wcmlvKTsKKwkJCSBwcml2LT5yZXBseV9hZ2dfdHhfc3RhdHMuYnRfcHJpbyk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF9hZ2dfdHhfZmFpbF9yZWFzb24oQUdHX1RYX1NUQVRFX0ZFV19CWVRFU19NU0spLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfYWdnX3R4X3N0YXRzLmZld19ieXRlcyk7CisJCQkgcHJpdi0+cmVwbHlfYWdnX3R4X3N0YXRzLmZld19ieXRlcyk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdFx0JXVcbiIsCiAJCQkgaXdsX2dldF9hZ2dfdHhfZmFpbF9yZWFzb24oQUdHX1RYX1NUQVRFX0FCT1JUX01TSyksCi0JCQkgcHJpdi0+X2Fnbi5yZXBseV9hZ2dfdHhfc3RhdHMuYWJvcnQpOworCQkJIHByaXYtPnJlcGx5X2FnZ190eF9zdGF0cy5hYm9ydCk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdCV1XG4iLAogCQkJIGl3bF9nZXRfYWdnX3R4X2ZhaWxfcmVhc29uKAogCQkJCUFHR19UWF9TVEFURV9MQVNUX1NFTlRfVFRMX01TSyksCi0JCQkgcHJpdi0+X2Fnbi5yZXBseV9hZ2dfdHhfc3RhdHMubGFzdF9zZW50X3R0bCk7CisJCQkgcHJpdi0+cmVwbHlfYWdnX3R4X3N0YXRzLmxhc3Rfc2VudF90dGwpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHQldVxuIiwKIAkJCSBpd2xfZ2V0X2FnZ190eF9mYWlsX3JlYXNvbigKIAkJCQlBR0dfVFhfU1RBVEVfTEFTVF9TRU5UX1RSWV9DTlRfTVNLKSwKLQkJCSBwcml2LT5fYWduLnJlcGx5X2FnZ190eF9zdGF0cy5sYXN0X3NlbnRfdHJ5KTsKKwkJCSBwcml2LT5yZXBseV9hZ2dfdHhfc3RhdHMubGFzdF9zZW50X3RyeSk7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXM6XHRcdCV1XG4iLAogCQkJIGl3bF9nZXRfYWdnX3R4X2ZhaWxfcmVhc29uKAogCQkJCUFHR19UWF9TVEFURV9MQVNUX1NFTlRfQlRfS0lMTF9NU0spLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfYWdnX3R4X3N0YXRzLmxhc3Rfc2VudF9idF9raWxsKTsKKwkJCSBwcml2LT5yZXBseV9hZ2dfdHhfc3RhdHMubGFzdF9zZW50X2J0X2tpbGwpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHRcdCV1XG4iLAogCQkJIGl3bF9nZXRfYWdnX3R4X2ZhaWxfcmVhc29uKEFHR19UWF9TVEFURV9TQ0RfUVVFUllfTVNLKSwKLQkJCSBwcml2LT5fYWduLnJlcGx5X2FnZ190eF9zdGF0cy5zY2RfcXVlcnkpOworCQkJIHByaXYtPnJlcGx5X2FnZ190eF9zdGF0cy5zY2RfcXVlcnkpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHQldVxuIiwKIAkJCSBpd2xfZ2V0X2FnZ190eF9mYWlsX3JlYXNvbigKIAkJCQlBR0dfVFhfU1RBVEVfVEVTVF9CQURfQ1JDMzJfTVNLKSwKLQkJCSBwcml2LT5fYWduLnJlcGx5X2FnZ190eF9zdGF0cy5iYWRfY3JjMzIpOworCQkJIHByaXYtPnJlcGx5X2FnZ190eF9zdGF0cy5iYWRfY3JjMzIpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHRcdCV1XG4iLAogCQkJIGl3bF9nZXRfYWdnX3R4X2ZhaWxfcmVhc29uKEFHR19UWF9TVEFURV9SRVNQT05TRV9NU0spLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfYWdnX3R4X3N0YXRzLnJlc3BvbnNlKTsKKwkJCSBwcml2LT5yZXBseV9hZ2dfdHhfc3RhdHMucmVzcG9uc2UpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHRcdCV1XG4iLAogCQkJIGl3bF9nZXRfYWdnX3R4X2ZhaWxfcmVhc29uKEFHR19UWF9TVEFURV9EVU1QX1RYX01TSyksCi0JCQkgcHJpdi0+X2Fnbi5yZXBseV9hZ2dfdHhfc3RhdHMuZHVtcF90eCk7CisJCQkgcHJpdi0+cmVwbHlfYWdnX3R4X3N0YXRzLmR1bXBfdHgpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzOlx0XHRcdCV1XG4iLAogCQkJIGl3bF9nZXRfYWdnX3R4X2ZhaWxfcmVhc29uKEFHR19UWF9TVEFURV9ERUxBWV9UWF9NU0spLAotCQkJIHByaXYtPl9hZ24ucmVwbHlfYWdnX3R4X3N0YXRzLmRlbGF5X3R4KTsKKwkJCSBwcml2LT5yZXBseV9hZ2dfdHhfc3RhdHMuZGVsYXlfdHgpOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlVOS05PV046XHRcdFx0JXVcbiIsCi0JCQkgcHJpdi0+X2Fnbi5yZXBseV9hZ2dfdHhfc3RhdHMudW5rbm93bik7CisJCQkgcHJpdi0+cmVwbHlfYWdnX3R4X3N0YXRzLnVua25vd24pOwogCiAJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CiAJa2ZyZWUoYnVmKTsKQEAgLTI0OTMsNyArMjUwNyw3IEBACiAJaWYgKGl3bF9pc19yZmtpbGwocHJpdikpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZGV2X3R4Zmlmb19mbHVzaChwcml2LCBJV0xfRFJPUF9BTEwpOworCWl3bGFnbl9kZXZfdHhmaWZvX2ZsdXNoKHByaXYsIElXTF9EUk9QX0FMTCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0yNjY3LDYgKzI2ODEsNyBAQAogCiAJREVCVUdGU19BRERfRklMRShudm0sIGRpcl9kYXRhLCBTX0lSVVNSKTsKIAlERUJVR0ZTX0FERF9GSUxFKHNyYW0sIGRpcl9kYXRhLCBTX0lXVVNSIHwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRSh3b3dsYW5fc3JhbSwgZGlyX2RhdGEsIFNfSVJVU1IpOwogCURFQlVHRlNfQUREX0ZJTEUobG9nX2V2ZW50LCBkaXJfZGF0YSwgU19JV1VTUiB8IFNfSVJVU1IpOwogCURFQlVHRlNfQUREX0ZJTEUoc3RhdGlvbnMsIGRpcl9kYXRhLCBTX0lSVVNSKTsKIAlERUJVR0ZTX0FERF9GSUxFKGNoYW5uZWxzLCBkaXJfZGF0YSwgU19JUlVTUik7CkBAIC0yNjkzLDggKzI3MDgsNyBAQAogCURFQlVHRlNfQUREX0ZJTEUodWNvZGVfcnhfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CiAJREVCVUdGU19BRERfRklMRSh1Y29kZV90eF9zdGF0cywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKIAlERUJVR0ZTX0FERF9GSUxFKHVjb2RlX2dlbmVyYWxfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7Ci0JaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPmRldl90eGZpZm9fZmx1c2gpCi0JCURFQlVHRlNfQUREX0ZJTEUodHhmaWZvX2ZsdXNoLCBkaXJfZGVidWcsIFNfSVdVU1IpOworCURFQlVHRlNfQUREX0ZJTEUodHhmaWZvX2ZsdXNoLCBkaXJfZGVidWcsIFNfSVdVU1IpOwogCURFQlVHRlNfQUREX0ZJTEUocHJvdGVjdGlvbl9tb2RlLCBkaXJfZGVidWcsIFNfSVdVU1IgfCBTX0lSVVNSKTsKIAogCURFQlVHRlNfQUREX0ZJTEUoc2Vuc2l0aXZpdHksIGRpcl9kZWJ1ZywgU19JUlVTUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldi5oCmluZGV4IDIyYTZlM2UuLjZjOTc5MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldi5oCkBAIC0zMSw2ICszMSw3IEBACiAjaWZuZGVmIF9faXdsX2Rldl9oX18KICNkZWZpbmUgX19pd2xfZGV2X2hfXwogCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+IC8qIGZvciBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KQEAgLTQ3LDYgKzQ4LDEwIEBACiAjaW5jbHVkZSAiaXdsLXBvd2VyLmgiCiAjaW5jbHVkZSAiaXdsLWFnbi1ycy5oIgogI2luY2x1ZGUgIml3bC1hZ24tdHQuaCIKKyNpbmNsdWRlICJpd2wtYnVzLmgiCisjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgICAgICAgICJpd2xhZ24iCiAKIHN0cnVjdCBpd2xfdHhfcXVldWU7CiAKQEAgLTI1NywxMSArMjYyLDkgQEAKIAogZW51bSB7CiAJQ01EX1NZTkMgPSAwLAotCUNNRF9TSVpFX05PUk1BTCA9IDAsCi0JQ01EX05PX1NLQiA9IDAsCi0JQ01EX0FTWU5DID0gKDEgPDwgMSksCi0JQ01EX1dBTlRfU0tCID0gKDEgPDwgMiksCi0JQ01EX01BUFBFRCA9ICgxIDw8IDMpLAorCUNNRF9BU1lOQyA9IEJJVCgwKSwKKwlDTURfV0FOVF9TS0IgPSBCSVQoMSksCisJQ01EX09OX0RFTUFORCA9IEJJVCgyKSwKIH07CiAKICNkZWZpbmUgREVGX0NNRF9QQVlMT0FEX1NJWkUgMzIwCkBAIC0yOTQsNiArMjk3LDE2IEBACiAJSVdMX0hDTURfREZMX05PQ09QWQk9IEJJVCgwKSwKIH07CiAKKy8qKgorICogc3RydWN0IGl3bF9ob3N0X2NtZCAtIEhvc3QgY29tbWFuZCB0byB0aGUgdUNvZGUKKyAqIEBkYXRhOiBhcnJheSBvZiBjaHVua3MgdGhhdCBjb21wb3NlcyB0aGUgZGF0YSBvZiB0aGUgaG9zdCBjb21tYW5kCisgKiBAcmVwbHlfcGFnZTogcG9pbnRlciB0byB0aGUgcGFnZSB0aGF0IGhvbGRzIHRoZSByZXNwb25zZSB0byB0aGUgaG9zdCBjb21tYW5kCisgKiBAY2FsbGJhY2s6CisgKiBAZmxhZ3M6IGNhbiBiZSBDTURfKiBub3RlIENNRF9XQU5UX1NLQiBpcyBpbmNvbXBhdGlibGUgd2l0aGUgQ01EX0FTWU5DCisgKiBAbGVuOiBhcnJheSBvZiB0aGUgbGVudGhzIG9mIHRoZSBjaHVua3MgaW4gZGF0YQorICogQGRhdGFmbGFnczoKKyAqIEBpZDogaWQgb2YgdGhlIGhvc3QgY29tbWFuZAorICovCiBzdHJ1Y3QgaXdsX2hvc3RfY21kIHsKIAljb25zdCB2b2lkICpkYXRhW0lXTF9NQVhfQ01EX1RGRFNdOwogCXVuc2lnbmVkIGxvbmcgcmVwbHlfcGFnZTsKQEAgLTM4NSwxMyArMzk4LDYgQEAKIAlzdHJ1Y3QgaXdsX2h0X2FnZyBhZ2c7CiB9OwogCi1zdHJ1Y3QgaXdsX2h3X2tleSB7Ci0JdTMyIGNpcGhlcjsKLQlpbnQga2V5bGVuOwotCXU4IGtleWlkeDsKLQl1OCBrZXlbMzJdOwotfTsKLQogdW5pb24gaXdsX2h0X3JhdGVfc3VwcCB7CiAJdTE2IHJhdGVzOwogCXN0cnVjdCB7CkBAIC00NDQsNyArNDUwLDYgQEAKIAlzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgc3RhOwogCXN0cnVjdCBpd2xfdGlkX2RhdGEgdGlkW01BWF9USURfQ09VTlRdOwogCXU4IHVzZWQsIGN0eGlkOwotCXN0cnVjdCBpd2xfaHdfa2V5IGtleWluZm87CiAJc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICpscTsKIH07CiAKQEAgLTU0Nyw3ICs1NTIsOCBAQAogCUlXTF9VQ09ERV9UTFZfSU5JVF9FUlJMT0dfUFRSCT0gMTMsCiAJSVdMX1VDT0RFX1RMVl9FTkhBTkNFX1NFTlNfVEJMCT0gMTQsCiAJSVdMX1VDT0RFX1RMVl9QSFlfQ0FMSUJSQVRJT05fU0laRSA9IDE1LAotCS8qIDE2IGFuZCAxNyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCUlXTF9VQ09ERV9UTFZfV09XTEFOX0lOU1QJPSAxNiwKKwlJV0xfVUNPREVfVExWX1dPV0xBTl9EQVRBCT0gMTcsCiAJSVdMX1VDT0RFX1RMVl9GTEFHUwkJPSAxOCwKIH07CiAKQEAgLTYzMSw3ICs2MzcsNiBAQAogLyoqCiAgKiBzdHJ1Y3QgaXdsX2h3X3BhcmFtcwogICogQG1heF90eHFfbnVtOiBNYXggIyBUeCBxdWV1ZXMgc3VwcG9ydGVkCi0gKiBAZG1hX2NobmxfbnVtOiBOdW1iZXIgb2YgVHggRE1BL0ZJRk8gY2hhbm5lbHMKICAqIEBzY2RfYmNfdGJsc19zaXplOiBzaXplIG9mIHNjaGVkdWxlciBieXRlIGNvdW50IHRhYmxlcwogICogQHRmZF9zaXplOiBURkQgc2l6ZQogICogQHR4L3J4X2NoYWluc19udW06IE51bWJlciBvZiBUWC9SWCBjaGFpbnMKQEAgLTY1Myw3ICs2NTgsNiBAQAogICovCiBzdHJ1Y3QgaXdsX2h3X3BhcmFtcyB7CiAJdTggbWF4X3R4cV9udW07Ci0JdTggZG1hX2NobmxfbnVtOwogCXUxNiBzY2RfYmNfdGJsc19zaXplOwogCXUzMiB0ZmRfc2l6ZTsKIAl1OCAgdHhfY2hhaW5zX251bTsKQEAgLTY2Myw3ICs2NjcsNiBAQAogCXUxNiBtYXhfcnhxX3NpemU7CiAJdTE2IG1heF9yeHFfbG9nOwogCXUzMiByeF9wYWdlX29yZGVyOwotCXUzMiByeF93cnRfcHRyX3JlZzsKIAl1OCAgbWF4X3N0YXRpb25zOwogCXU4ICBodDQwX2NoYW5uZWw7CiAJdTggIG1heF9iZWFjb25faXRydmw7CS8qIGluIDEwMjQgbXMgKi8KQEAgLTY5NCw4ICs2OTcsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gdm9pZCBpd2xfdXBkYXRlX2NoYWluX2ZsYWdzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBleHRlcm4gY29uc3QgdTggaXdsX2JjYXN0X2FkZHJbRVRIX0FMRU5dOwotZXh0ZXJuIGludCBpd2xfcnhxX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGl3bF90eHFfY3R4X3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGV4dGVybiBpbnQgaXdsX3F1ZXVlX3NwYWNlKGNvbnN0IHN0cnVjdCBpd2xfcXVldWUgKnEpOwogc3RhdGljIGlubGluZSBpbnQgaXdsX3F1ZXVlX3VzZWQoY29uc3Qgc3RydWN0IGl3bF9xdWV1ZSAqcSwgaW50IGkpCiB7CkBAIC05ODIsMTcgKzk4Myw2IEBACiB9OwogCiAvKgotICogaXdsX3N3aXRjaF9yeG9uOiAiY2hhbm5lbCBzd2l0Y2giIHN0cnVjdHVyZQotICoKLSAqIEAgc3dpdGNoX2luX3Byb2dyZXNzOiBjaGFubmVsIHN3aXRjaCBpbiBwcm9ncmVzcwotICogQCBjaGFubmVsOiBuZXcgY2hhbm5lbAotICovCi1zdHJ1Y3QgaXdsX3N3aXRjaF9yeG9uIHsKLQlib29sIHN3aXRjaF9pbl9wcm9ncmVzczsKLQlfX2xlMTYgY2hhbm5lbDsKLX07Ci0KLS8qCiAgKiBzY2hlZHVsZSB0aGUgdGltZXIgdG8gd2FrZSB1cCBldmVyeSBVQ09ERV9UUkFDRV9QRVJJT0QgbWlsbGlzZWNvbmRzCiAgKiB0byBwZXJmb3JtIGNvbnRpbnVvdXMgdUNvZGUgZXZlbnQgbG9nZ2luZyBvcGVyYXRpb24gaWYgZW5hYmxlZAogICovCkBAIC0xMTYzLDYgKzExNTMsOCBAQAogCiAJX19sZTMyIHN0YXRpb25fZmxhZ3M7CiAKKwlpbnQgYmVhY29uX2ludDsKKwogCXN0cnVjdCB7CiAJCWJvb2wgbm9uX2dmX3N0YV9wcmVzZW50OwogCQl1OCBwcm90ZWN0aW9uOwpAQCAtMTE3OSwxNCArMTE3MSwyOSBAQAogCUlXTF9TQ0FOX09GRkNIX1RYLAogfTsKIAorZW51bSBpd2xhZ25fdWNvZGVfdHlwZSB7CisJSVdMX1VDT0RFX05PTkUsCisJSVdMX1VDT0RFX1JFR1VMQVIsCisJSVdMX1VDT0RFX0lOSVQsCisJSVdMX1VDT0RFX1dPV0xBTiwKK307CisKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfU1ZUT09MCiBzdHJ1Y3QgaXdsX3Rlc3Rtb2RlX3RyYWNlIHsKKwl1MzIgYnVmZl9zaXplOworCXUzMiB0b3RhbF9zaXplOworCXUzMiBudW1fY2h1bmtzOwogCXU4ICpjcHVfYWRkcjsKIAl1OCAqdHJhY2VfYWRkcjsKIAlkbWFfYWRkcl90IGRtYV9hZGRyOwogCWJvb2wgdHJhY2VfZW5hYmxlZDsKIH07CiAjZW5kaWYKKworLyogdUNvZGUgb3duZXJzaGlwICovCisjZGVmaW5lIElXTF9PV05FUlNISVBfRFJJVkVSCTAKKyNkZWZpbmUgSVdMX09XTkVSU0hJUF9UTQkxCisKIHN0cnVjdCBpd2xfcHJpdiB7CiAKIAkvKiBpZWVlIGRldmljZSB1c2VkIGJ5IGdlbmVyaWMgaWVlZSBwcm9jZXNzaW5nIGNvZGUgKi8KQEAgLTEyNTQsMTEgKzEyNjEsOCBAQAogCXNwaW5sb2NrX3QgcmVnX2xvY2s7CS8qIHByb3RlY3QgaHcgcmVnaXN0ZXIgYWNjZXNzICovCiAJc3RydWN0IG11dGV4IG11dGV4OwogCi0JLyogYmFzaWMgcGNpLW5ldHdvcmsgZHJpdmVyIHN0dWZmICovCi0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7Ci0KLQkvKiBwY2kgaGFyZHdhcmUgYWRkcmVzcyBzdXBwb3J0ICovCi0Jdm9pZCBfX2lvbWVtICpod19iYXNlOworCXN0cnVjdCBpd2xfYnVzICpidXM7CS8qIGJ1cyBzcGVjaWZpYyBkYXRhICovCisJc3RydWN0IGl3bF90cmFucyB0cmFuczsKIAogCS8qIG1pY3JvY29kZS9kZXZpY2Ugc3VwcG9ydHMgbXVsdGlwbGUgY29udGV4dHMgKi8KIAl1OCB2YWxpZF9jb250ZXh0czsKQEAgLTEyNzgsMTYgKzEyODIsMjEgQEAKIAlpbnQgZndfaW5kZXg7CQkJLyogZmlybXdhcmUgd2UncmUgdHJ5aW5nIHRvIGxvYWQgKi8KIAl1MzIgdWNvZGVfdmVyOwkJCS8qIHZlcnNpb24gb2YgdWNvZGUsIGNvcHkgb2YKIAkJCQkJICAgaXdsX3Vjb2RlLnZlciAqLworCisJLyogdUNvZGUgb3duZXI6IGRlZmF1bHQ6IElXTF9PV05FUlNISVBfRFJJVkVSICovCisJdTggdWNvZGVfb3duZXI7CisKIAlzdHJ1Y3QgZndfaW1nIHVjb2RlX3J0OwogCXN0cnVjdCBmd19pbWcgdWNvZGVfaW5pdDsKKwlzdHJ1Y3QgZndfaW1nIHVjb2RlX3dvd2xhbjsKIAotCWVudW0gaXdsYWduX3Vjb2RlX3N1YnR5cGUgdWNvZGVfdHlwZTsKKwllbnVtIGl3bGFnbl91Y29kZV90eXBlIHVjb2RlX3R5cGU7CiAJdTggdWNvZGVfd3JpdGVfY29tcGxldGU7CS8qIHRoZSBpbWFnZSB3cml0ZSBpcyBjb21wbGV0ZSAqLwogCWNoYXIgZmlybXdhcmVfbmFtZVsyNV07CiAKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCBjb250ZXh0c1tOVU1fSVdMX1JYT05fQ1RYXTsKIAotCXN0cnVjdCBpd2xfc3dpdGNoX3J4b24gc3dpdGNoX3J4b247CisJX19sZTE2IHN3aXRjaF9jaGFubmVsOwogCiAJc3RydWN0IHsKIAkJdTMyIGVycm9yX2V2ZW50X3RhYmxlOwpAQCAtMTM1Miw2ICsxMzYxLDggQEAKIAogCXU4IG1hYzgwMjExX3JlZ2lzdGVyZWQ7CiAKKwlib29sIHdvd2xhbjsKKwogCS8qIGVlcHJvbSAtLSB0aGlzIGlzIGluIHRoZSBjYXJkJ3MgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyICovCiAJdTggKmVlcHJvbTsKIAlpbnQgICAgbnZtX2RldmljZV90eXBlOwpAQCAtMTM4Nyw1NiArMTM5OCw1NCBAQAogCX0gYWNjdW1fc3RhdHMsIGRlbHRhX3N0YXRzLCBtYXhfZGVsdGFfc3RhdHM7CiAjZW5kaWYKIAotCXN0cnVjdCB7Ci0JCS8qIElOVCBJQ1QgVGFibGUgKi8KLQkJX19sZTMyICppY3RfdGJsOwotCQl2b2lkICppY3RfdGJsX3ZpcjsKLQkJZG1hX2FkZHJfdCBpY3RfdGJsX2RtYTsKLQkJZG1hX2FkZHJfdCBhbGlnbmVkX2ljdF90YmxfZG1hOwotCQlpbnQgaWN0X2luZGV4OwotCQl1MzIgaW50YTsKLQkJYm9vbCB1c2VfaWN0OwotCQkvKgotCQkgKiByZXBvcnRpbmcgdGhlIG51bWJlciBvZiB0aWRzIGhhcyBBR0cgb24uIDAgbWVhbnMKLQkJICogbm8gQUdHUkVHQVRJT04KLQkJICovCi0JCXU4IGFnZ190aWRzX2NvdW50OworCS8qIElOVCBJQ1QgVGFibGUgKi8KKwlfX2xlMzIgKmljdF90Ymw7CisJdm9pZCAqaWN0X3RibF92aXI7CisJZG1hX2FkZHJfdCBpY3RfdGJsX2RtYTsKKwlkbWFfYWRkcl90IGFsaWduZWRfaWN0X3RibF9kbWE7CisJaW50IGljdF9pbmRleDsKKwl1MzIgaW50YTsKKwlib29sIHVzZV9pY3Q7CisJLyoKKwkgKiByZXBvcnRpbmcgdGhlIG51bWJlciBvZiB0aWRzIGhhcyBBR0cgb24uIDAgbWVhbnMKKwkgKiBubyBBR0dSRUdBVElPTgorCSAqLworCXU4IGFnZ190aWRzX2NvdW50OwogCi0JCXN0cnVjdCBpd2xfcnhfcGh5X3JlcyBsYXN0X3BoeV9yZXM7Ci0JCWJvb2wgbGFzdF9waHlfcmVzX3ZhbGlkOworCXN0cnVjdCBpd2xfcnhfcGh5X3JlcyBsYXN0X3BoeV9yZXM7CisJYm9vbCBsYXN0X3BoeV9yZXNfdmFsaWQ7CiAKLQkJc3RydWN0IGNvbXBsZXRpb24gZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBmaXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlOwogCi0JCXUzMiBpbml0X2V2dGxvZ19wdHIsIGluaXRfZXZ0bG9nX3NpemUsIGluaXRfZXJybG9nX3B0cjsKLQkJdTMyIGluc3RfZXZ0bG9nX3B0ciwgaW5zdF9ldnRsb2dfc2l6ZSwgaW5zdF9lcnJsb2dfcHRyOworCXUzMiBpbml0X2V2dGxvZ19wdHIsIGluaXRfZXZ0bG9nX3NpemUsIGluaXRfZXJybG9nX3B0cjsKKwl1MzIgaW5zdF9ldnRsb2dfcHRyLCBpbnN0X2V2dGxvZ19zaXplLCBpbnN0X2VycmxvZ19wdHI7CiAKLQkJLyoKLQkJICogY2hhaW4gbm9pc2UgcmVzZXQgYW5kIGdhaW4gY29tbWFuZHMgYXJlIHRoZQotCQkgKiB0d28gZXh0cmEgY2FsaWJyYXRpb24gY29tbWFuZHMgZm9sbG93cyB0aGUgc3RhbmRhcmQKLQkJICogcGh5IGNhbGlicmF0aW9uIGNvbW1hbmRzCi0JCSAqLwotCQl1OCBwaHlfY2FsaWJfY2hhaW5fbm9pc2VfcmVzZXRfY21kOwotCQl1OCBwaHlfY2FsaWJfY2hhaW5fbm9pc2VfZ2Fpbl9jbWQ7CisJLyoKKwkgKiBjaGFpbiBub2lzZSByZXNldCBhbmQgZ2FpbiBjb21tYW5kcyBhcmUgdGhlCisJICogdHdvIGV4dHJhIGNhbGlicmF0aW9uIGNvbW1hbmRzIGZvbGxvd3MgdGhlIHN0YW5kYXJkCisJICogcGh5IGNhbGlicmF0aW9uIGNvbW1hbmRzCisJICovCisJdTggcGh5X2NhbGliX2NoYWluX25vaXNlX3Jlc2V0X2NtZDsKKwl1OCBwaHlfY2FsaWJfY2hhaW5fbm9pc2VfZ2Fpbl9jbWQ7CiAKLQkJLyogY291bnRzIHJlcGx5X3R4IGVycm9yICovCi0JCXN0cnVjdCByZXBseV90eF9lcnJvcl9zdGF0aXN0aWNzIHJlcGx5X3R4X3N0YXRzOwotCQlzdHJ1Y3QgcmVwbHlfYWdnX3R4X2Vycm9yX3N0YXRpc3RpY3MgcmVwbHlfYWdnX3R4X3N0YXRzOwotCQkvKiBub3RpZmljYXRpb24gd2FpdCBzdXBwb3J0ICovCi0JCXN0cnVjdCBsaXN0X2hlYWQgbm90aWZfd2FpdHM7Ci0JCXNwaW5sb2NrX3Qgbm90aWZfd2FpdF9sb2NrOwotCQl3YWl0X3F1ZXVlX2hlYWRfdCBub3RpZl93YWl0cTsKKwkvKiBjb3VudHMgcmVwbHlfdHggZXJyb3IgKi8KKwlzdHJ1Y3QgcmVwbHlfdHhfZXJyb3Jfc3RhdGlzdGljcyByZXBseV90eF9zdGF0czsKKwlzdHJ1Y3QgcmVwbHlfYWdnX3R4X2Vycm9yX3N0YXRpc3RpY3MgcmVwbHlfYWdnX3R4X3N0YXRzOworCS8qIG5vdGlmaWNhdGlvbiB3YWl0IHN1cHBvcnQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vdGlmX3dhaXRzOworCXNwaW5sb2NrX3Qgbm90aWZfd2FpdF9sb2NrOworCXdhaXRfcXVldWVfaGVhZF90IG5vdGlmX3dhaXRxOwogCi0JCS8qIHJlbWFpbi1vbi1jaGFubmVsIG9mZmxvYWQgc3VwcG9ydCAqLwotCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmh3X3JvY19jaGFubmVsOwotCQlzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X3JvY193b3JrOwotCQllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGh3X3JvY19jaGFudHlwZTsKLQkJaW50IGh3X3JvY19kdXJhdGlvbjsKLQkJYm9vbCBod19yb2Nfc2V0dXA7CisJLyogcmVtYWluLW9uLWNoYW5uZWwgb2ZmbG9hZCBzdXBwb3J0ICovCisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpod19yb2NfY2hhbm5lbDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X3JvY193b3JrOworCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgaHdfcm9jX2NoYW50eXBlOworCWludCBod19yb2NfZHVyYXRpb247CisJYm9vbCBod19yb2Nfc2V0dXA7CiAKLQkJc3RydWN0IHNrX2J1ZmYgKm9mZmNoYW5fdHhfc2tiOwotCQlpbnQgb2ZmY2hhbl90eF90aW1lb3V0OwotCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKm9mZmNoYW5fdHhfY2hhbjsKLQl9IF9hZ247CisJc3RydWN0IHNrX2J1ZmYgKm9mZmNoYW5fdHhfc2tiOworCWludCBvZmZjaGFuX3R4X3RpbWVvdXQ7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpvZmZjaGFuX3R4X2NoYW47CiAKIAkvKiBidCBjb2V4ICovCiAJdTggYnRfZW5hYmxlX2ZsYWc7CkBAIC0xNDUzLDYgKzE0NjIsOSBAQAogCXUxNiBkeW5hbWljX2ZyYWdfdGhyZXNoOwogCXU4IGJ0X2NpX2NvbXBsaWFuY2U7CiAJc3RydWN0IHdvcmtfc3RydWN0IGJ0X3RyYWZmaWNfY2hhbmdlX3dvcms7CisJYm9vbCBidF9lbmFibGVfcHNwb2xsOworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdXJfcnNzaV9jdHg7CisJYm9vbCBidF9pc19zY287CiAKIAlzdHJ1Y3QgaXdsX2h3X3BhcmFtcyBod19wYXJhbXM7CiAKQEAgLTE1MDMsNiArMTUxNSw3IEBACiAJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kaXI7CiAJdTMyIGRiZ2ZzX3NyYW1fb2Zmc2V0LCBkYmdmc19zcmFtX2xlbjsKIAlib29sIGRpc2FibGVfaHQ0MDsKKwl2b2lkICp3b3dsYW5fc3JhbTsKICNlbmRpZiAvKiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTICovCiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhwb3dlcl93b3JrOwpAQCAtMTUyMCw5ICsxNTMzLDE0IEBACiAJYm9vbCBsZWRfcmVnaXN0ZXJlZDsKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfU1ZUT09MCiAJc3RydWN0IGl3bF90ZXN0bW9kZV90cmFjZSB0ZXN0bW9kZV90cmFjZTsKKwl1MzIgdG1fZml4ZWRfcmF0ZTsKICNlbmRpZgotCXUzMiBkYmdfZml4ZWRfcmF0ZTsKIAorCS8qIFdvV0xBTiBHVEsgcmVrZXkgZGF0YSAqLworCXU4IGtja1tOTDgwMjExX0tDS19MRU5dLCBrZWtbTkw4MDIxMV9LRUtfTEVOXTsKKwlfX2xlNjQgcmVwbGF5X2N0cjsKKwlfX2xlMTYgbGFzdF9zZXFfY3RsOworCWJvb2wgaGF2ZV9yZWtleV9kYXRhOwogfTsgLyppd2xfcHJpdiAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXdsX3R4cV9jdHhfYWN0aXZhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1lZXByb20uYwppbmRleCA0N2E1NmJjLi4xOWQzMWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1lZXByb20uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1lZXByb20uYwpAQCAtNDA3LDExICs0MDcsNiBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1jb25zdCB1OCAqaXdsX2VlcHJvbV9xdWVyeV9hZGRyKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc2l6ZV90IG9mZnNldCkKLXsKLQlyZXR1cm4gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7Ci19Ci0KIHUxNiBpd2xfZWVwcm9tX3F1ZXJ5MTYoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCBzaXplX3Qgb2Zmc2V0KQogewogCWlmICghcHJpdi0+ZWVwcm9tKQpAQCAtNDQ5LDcgKzQ0NCw3IEBACiAJfQogCWUgPSAoX19sZTE2ICopcHJpdi0+ZWVwcm9tOwogCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KHByaXYpOworCWl3bF9hcG1faW5pdChwcml2KTsKIAogCXJldCA9IGl3bF9lZXByb21fdmVyaWZ5X3NpZ25hdHVyZShwcml2KTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNTQ4LDcgKzU0Myw3IEBACiAJCQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICoqZWVwcm9tX2NoX2luZm8sCiAJCQljb25zdCB1OCAqKmVlcHJvbV9jaF9pbmRleCkKIHsKLQl1MzIgb2Zmc2V0ID0gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+CisJdTMyIG9mZnNldCA9IHByaXYtPmNmZy0+bGliLT4KIAkJCWVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1tlZXBfYmFuZCAtIDFdOwogCXN3aXRjaCAoZWVwX2JhbmQpIHsKIAljYXNlIDE6CQkvKiAyLjRHSHogYmFuZCAqLwpAQCAtNzU0LDkgKzc0OSw5IEBACiAJfQogCiAJLyogQ2hlY2sgaWYgd2UgZG8gaGF2ZSBIVDQwIGNoYW5uZWxzICovCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1s1XSA9PQorCWlmIChwcml2LT5jZmctPmxpYi0+ZWVwcm9tX29wcy5yZWd1bGF0b3J5X2JhbmRzWzVdID09CiAJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCAmJgotCSAgICBwcml2LT5jZmctPm9wcy0+bGliLT5lZXByb21fb3BzLnJlZ3VsYXRvcnlfYmFuZHNbNl0gPT0KKwkgICAgcHJpdi0+Y2ZnLT5saWItPmVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1s2XSA9PQogCSAgICBFRVBST01fUkVHVUxBVE9SWV9CQU5EX05PX0hUNDApCiAJCXJldHVybiAwOwogCkBAIC03OTIsOCArNzg3LDggQEAKIAkgKiBkcml2ZXIgbmVlZCB0byBwcm9jZXNzIGFkZGl0aW9uIGluZm9ybWF0aW9uCiAJICogdG8gZGV0ZXJtaW5lIHRoZSBtYXggY2hhbm5lbCB0eCBwb3dlciBsaW1pdHMKIAkgKi8KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy51cGRhdGVfZW5oYW5jZWRfdHhwb3dlcikKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy51cGRhdGVfZW5oYW5jZWRfdHhwb3dlcihwcml2KTsKKwlpZiAocHJpdi0+Y2ZnLT5saWItPmVlcHJvbV9vcHMudXBkYXRlX2VuaGFuY2VkX3R4cG93ZXIpCisJCXByaXYtPmNmZy0+bGliLT5lZXByb21fb3BzLnVwZGF0ZV9lbmhhbmNlZF90eHBvd2VyKHByaXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04MzQsMyArODI5LDI4IEBACiAKIAlyZXR1cm4gTlVMTDsKIH0KKwordm9pZCBpd2xfcmZfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwl1MTYgcmFkaW9fY2ZnOworCisJcmFkaW9fY2ZnID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9SQURJT19DT05GSUcpOworCisJLyogd3JpdGUgcmFkaW8gY29uZmlnIHZhbHVlcyB0byByZWdpc3RlciAqLworCWlmIChFRVBST01fUkZfQ0ZHX1RZUEVfTVNLKHJhZGlvX2NmZykgPD0gRUVQUk9NX1JGX0NPTkZJR19UWVBFX01BWCkgeworCQlpd2xfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSAgICBFRVBST01fUkZfQ0ZHX1RZUEVfTVNLKHJhZGlvX2NmZykgfAorCQkJICAgIEVFUFJPTV9SRl9DRkdfU1RFUF9NU0socmFkaW9fY2ZnKSB8CisJCQkgICAgRUVQUk9NX1JGX0NGR19EQVNIX01TSyhyYWRpb19jZmcpKTsKKwkJSVdMX0lORk8ocHJpdiwgIlJhZGlvIHR5cGU9MHgleC0weCV4LTB4JXhcbiIsCisJCQkgRUVQUk9NX1JGX0NGR19UWVBFX01TSyhyYWRpb19jZmcpLAorCQkJIEVFUFJPTV9SRl9DRkdfU1RFUF9NU0socmFkaW9fY2ZnKSwKKwkJCSBFRVBST01fUkZfQ0ZHX0RBU0hfTVNLKHJhZGlvX2NmZykpOworCX0gZWxzZQorCQlXQVJOX09OKDEpOworCisJLyogc2V0IENTUl9IV19DT05GSUdfUkVHIGZvciB1Q29kZSB1c2UgKi8KKwlpd2xfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJICAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9SQURJT19TSSB8CisJCSAgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTUFDX1NJKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmgKaW5kZXggYzk2MGM2Zi4uZTRiZjhhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmgKQEAgLTExMCwxMiArMTEwLDEwIEBACiB9OwogCiAvKiBTS1UgQ2FwYWJpbGl0aWVzICovCi0vKiA1MDAwIGFuZCB1cCAqLwotI2RlZmluZSBFRVBST01fU0tVX0NBUF9CQU5EX1BPUwkJCQkoNCkKLSNkZWZpbmUgRUVQUk9NX1NLVV9DQVBfQkFORF9TRUxFQ1RJT04JICAgICAgICAgICAgICAgIFwKLQkJKDMgPDwgRUVQUk9NX1NLVV9DQVBfQkFORF9QT1MpCisjZGVmaW5lIEVFUFJPTV9TS1VfQ0FQX0JBTkRfMjRHSFoJCQkoMSA8PCA0KQorI2RlZmluZSBFRVBST01fU0tVX0NBUF9CQU5EXzUyR0haCQkJKDEgPDwgNSkKICNkZWZpbmUgRUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRQkgICAgICAgICAgICAgICAgKDEgPDwgNikKLSNkZWZpbmUgRUVQUk9NX1NLVV9DQVBfQU1UX0VOQUJMRQkgICAgICAgICAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgRUVQUk9NX1NLVV9DQVBfQU1UX0VOQUJMRQkJCSgxIDw8IDcpCiAjZGVmaW5lIEVFUFJPTV9TS1VfQ0FQX0lQQU5fRU5BQkxFCSAgICAgICAgICAgICAgICAoMSA8PCA4KQogCiAvKiAqcmVndWxhdG9yeSogY2hhbm5lbCBkYXRhIGZvcm1hdCBpbiBlZXByb20sIG9uZSBmb3IgZWFjaCBjaGFubmVsLgpAQCAtMTY0LDE2ICsxNjIsMTIgQEAKIAlzOCBtaW1vM19tYXg7CiB9IF9fcGFja2VkOwogCi0vKiA1MDAwIFNwZWNpZmljICovCi0jZGVmaW5lIEVFUFJPTV81MDAwX1RYX1BPV0VSX1ZFUlNJT04gICAgKDQpCi0jZGVmaW5lIEVFUFJPTV81MDAwX0VFUFJPTV9WRVJTSU9OCSgweDExQSkKLQotLyogNTAwMCBhbmQgdXAgY2FsaWJyYXRpb24gKi8KKy8qIGNhbGlicmF0aW9uICovCiAjZGVmaW5lIEVFUFJPTV9DQUxJQl9BTEwJKElORElSRUNUX0FERFJFU1MgfCBJTkRJUkVDVF9DQUxJQlJBVElPTikKICNkZWZpbmUgRUVQUk9NX1hUQUwJCSgoMioweDEyOCkgfCBFRVBST01fQ0FMSUJfQUxMKQogCi0vKiA1MDAwIHRlbXBlcmF0dXJlICovCi0jZGVmaW5lIEVFUFJPTV81MDAwX1RFTVBFUkFUVVJFICgoMioweDEyQSkgfCBFRVBST01fQ0FMSUJfQUxMKQorLyogdGVtcGVyYXR1cmUgKi8KKyNkZWZpbmUgRUVQUk9NX1RFTVBFUkFUVVJFICgoMioweDEyQSkgfCBFRVBST01fQ0FMSUJfQUxMKQogCiAvKiBhZ24gbGlua3MgKi8KICNkZWZpbmUgRUVQUk9NX0xJTktfSE9TVCAgICAgICAgICAgICAoMioweDY0KQpAQCAtMjA1LDYgKzE5OSwxMCBAQAogI2RlZmluZSBFRVBST01fNjAwMF9SRUdfQkFORF8yNF9IVDQwX0NIQU5ORUxTICAoKDB4ODApXAogCQl8IElORElSRUNUX0FERFJFU1MgfCBJTkRJUkVDVF9SRUdVTEFUT1JZKSAgIC8qIDE0ICBieXRlcyAqLwogCisvKiA1MDAwIFNwZWNpZmljICovCisjZGVmaW5lIEVFUFJPTV81MDAwX1RYX1BPV0VSX1ZFUlNJT04gICAgKDQpCisjZGVmaW5lIEVFUFJPTV81MDAwX0VFUFJPTV9WRVJTSU9OCSgweDExQSkKKwogLyogNTA1MCBTcGVjaWZpYyAqLwogI2RlZmluZSBFRVBST01fNTA1MF9UWF9QT1dFUl9WRVJTSU9OICAgICg0KQogI2RlZmluZSBFRVBST01fNTA1MF9FRVBST01fVkVSU0lPTgkoMHgyMUUpCkBAIC0yNzAsMTMgKzI2OCwxMyBAQAogCiAvKiBHZW5lcmFsICovCiAjZGVmaW5lIEVFUFJPTV9ERVZJQ0VfSUQgICAgICAgICAgICAgICAgICAgICgyKjB4MDgpCS8qIDIgYnl0ZXMgKi8KKyNkZWZpbmUgRUVQUk9NX1NVQlNZU1RFTV9JRAkJICAgICgyKjB4MEEpCS8qIDIgYnl0ZXMgKi8KICNkZWZpbmUgRUVQUk9NX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICAgKDIqMHgxNSkJLyogNiAgYnl0ZXMgKi8KICNkZWZpbmUgRUVQUk9NX0JPQVJEX1JFVklTSU9OICAgICAgICAgICAgICAgKDIqMHgzNSkJLyogMiAgYnl0ZXMgKi8KICNkZWZpbmUgRUVQUk9NX0JPQVJEX1BCQV9OVU1CRVIgICAgICAgICAgICAgKDIqMHgzQisxKQkvKiA5ICBieXRlcyAqLwogI2RlZmluZSBFRVBST01fVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAoMioweDQ0KQkvKiAyICBieXRlcyAqLwogI2RlZmluZSBFRVBST01fU0tVX0NBUCAgICAgICAgICAgICAgICAgICAgICAoMioweDQ1KQkvKiAyICBieXRlcyAqLwogI2RlZmluZSBFRVBST01fT0VNX01PREUgICAgICAgICAgICAgICAgICAgICAoMioweDQ2KQkvKiAyICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fV09XTEFOX01PREUgICAgICAgICAgICAgICAgICAoMioweDQ3KQkvKiAyICBieXRlcyAqLwogI2RlZmluZSBFRVBST01fUkFESU9fQ09ORklHICAgICAgICAgICAgICAgICAoMioweDQ4KQkvKiAyICBieXRlcyAqLwogI2RlZmluZSBFRVBST01fTlVNX01BQ19BRERSRVNTICAgICAgICAgICAgICAoMioweDRDKQkvKiAyICBieXRlcyAqLwogCkBAIC0yOTQsNyArMjkyLDYgQEAKIAogc3RydWN0IGl3bF9lZXByb21fb3BzIHsKIAljb25zdCB1MzIgcmVndWxhdG9yeV9iYW5kc1s3XTsKLQljb25zdCB1OCogKCpxdWVyeV9hZGRyKSAoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCBzaXplX3Qgb2Zmc2V0KTsKIAl2b2lkICgqdXBkYXRlX2VuaGFuY2VkX3R4cG93ZXIpIChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogfTsKIApAQCAtMzExLDUgKzMwOCw2IEBACiBjb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqaXdsX2dldF9jaGFubmVsX2luZm8oCiAJCWNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLCB1MTYgY2hhbm5lbCk7Cit2b2lkIGl3bF9yZl9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIAogI2VuZGlmICAvKiBfX2l3bF9lZXByb21faF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1maC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZmguaAppbmRleCA2ZGZhODA2Li4wYWQ2MGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1maC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWZoLmgKQEAgLTMyNiw3ICszMjYsNyBAQAogI2RlZmluZSBGSF9UQ1NSX1VQUEVSX0JPVU5EICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhFNjApCiAKIC8qIEZpbmQgQ29udHJvbC9TdGF0dXMgcmVnIGZvciBnaXZlbiBUeCBETUEvRklGTyBjaGFubmVsICovCi0jZGVmaW5lIEZINTBfVENTUl9DSE5MX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCkKKyNkZWZpbmUgRkhfVENTUl9DSE5MX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCkKIAogLyogVENTUjogdHhfY29uZmlnIHJlZ2lzdGVyIHZhbHVlcyAqLwogI2RlZmluZSBGSF9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhfY2hubCkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaGNtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaGNtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmY5OTY2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWhjbWQuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIgLyogRklYTUU6IHJlbW92ZSAqLwotI2luY2x1ZGUgIml3bC1kZWJ1Zy5oIgotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotCi0KLWNvbnN0IGNoYXIgKmdldF9jbWRfc3RyaW5nKHU4IGNtZCkKLXsKLQlzd2l0Y2ggKGNtZCkgewotCQlJV0xfQ01EKFJFUExZX0FMSVZFKTsKLQkJSVdMX0NNRChSRVBMWV9FUlJPUik7Ci0JCUlXTF9DTUQoUkVQTFlfUlhPTik7Ci0JCUlXTF9DTUQoUkVQTFlfUlhPTl9BU1NPQyk7Ci0JCUlXTF9DTUQoUkVQTFlfUU9TX1BBUkFNKTsKLQkJSVdMX0NNRChSRVBMWV9SWE9OX1RJTUlORyk7Ci0JCUlXTF9DTUQoUkVQTFlfQUREX1NUQSk7Ci0JCUlXTF9DTUQoUkVQTFlfUkVNT1ZFX1NUQSk7Ci0JCUlXTF9DTUQoUkVQTFlfUkVNT1ZFX0FMTF9TVEEpOwotCQlJV0xfQ01EKFJFUExZX1RYRklGT19GTFVTSCk7Ci0JCUlXTF9DTUQoUkVQTFlfV0VQS0VZKTsKLQkJSVdMX0NNRChSRVBMWV9UWCk7Ci0JCUlXTF9DTUQoUkVQTFlfTEVEU19DTUQpOwotCQlJV0xfQ01EKFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQpOwotCQlJV0xfQ01EKENPRVhfUFJJT1JJVFlfVEFCTEVfQ01EKTsKLQkJSVdMX0NNRChDT0VYX01FRElVTV9OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKENPRVhfRVZFTlRfQ01EKTsKLQkJSVdMX0NNRChSRVBMWV9RVUlFVF9DTUQpOwotCQlJV0xfQ01EKFJFUExZX0NIQU5ORUxfU1dJVENIKTsKLQkJSVdMX0NNRChDSEFOTkVMX1NXSVRDSF9OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKFJFUExZX1NQRUNUUlVNX01FQVNVUkVNRU5UX0NNRCk7Ci0JCUlXTF9DTUQoU1BFQ1RSVU1fTUVBU1VSRV9OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKFBPV0VSX1RBQkxFX0NNRCk7Ci0JCUlXTF9DTUQoUE1fU0xFRVBfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChQTV9ERUJVR19TVEFUSVNUSUNfTk9USUZJQyk7Ci0JCUlXTF9DTUQoUkVQTFlfU0NBTl9DTUQpOwotCQlJV0xfQ01EKFJFUExZX1NDQU5fQUJPUlRfQ01EKTsKLQkJSVdMX0NNRChTQ0FOX1NUQVJUX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoU0NBTl9SRVNVTFRTX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoU0NBTl9DT01QTEVURV9OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKEJFQUNPTl9OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKFJFUExZX1RYX0JFQUNPTik7Ci0JCUlXTF9DTUQoV0hPX0lTX0FXQUtFX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUVVJRVRfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChSRVBMWV9UWF9QV1JfVEFCTEVfQ01EKTsKLQkJSVdMX0NNRChNRUFTVVJFX0FCT1JUX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUkVQTFlfQlRfQ09ORklHKTsKLQkJSVdMX0NNRChSRVBMWV9TVEFUSVNUSUNTX0NNRCk7Ci0JCUlXTF9DTUQoU1RBVElTVElDU19OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKFJFUExZX0NBUkRfU1RBVEVfQ01EKTsKLQkJSVdMX0NNRChDQVJEX1NUQVRFX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoTUlTU0VEX0JFQUNPTlNfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChSRVBMWV9DVF9LSUxMX0NPTkZJR19DTUQpOwotCQlJV0xfQ01EKFNFTlNJVElWSVRZX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfUlhfUEhZX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfUlhfTVBEVV9DTUQpOwotCQlJV0xfQ01EKFJFUExZX1JYKTsKLQkJSVdMX0NNRChSRVBMWV9DT01QUkVTU0VEX0JBKTsKLQkJSVdMX0NNRChDQUxJQlJBVElPTl9DRkdfQ01EKTsKLQkJSVdMX0NNRChDQUxJQlJBVElPTl9SRVNfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChDQUxJQlJBVElPTl9DT01QTEVURV9OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKFJFUExZX1RYX1BPV0VSX0RCTV9DTUQpOwotCQlJV0xfQ01EKFRFTVBFUkFUVVJFX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoVFhfQU5UX0NPTkZJR1VSQVRJT05fQ01EKTsKLQkJSVdMX0NNRChSRVBMWV9CVF9DT0VYX1BST0ZJTEVfTk9USUYpOwotCQlJV0xfQ01EKFJFUExZX0JUX0NPRVhfUFJJT19UQUJMRSk7Ci0JCUlXTF9DTUQoUkVQTFlfQlRfQ09FWF9QUk9UX0VOVik7Ci0JCUlXTF9DTUQoUkVQTFlfV0lQQU5fUEFSQU1TKTsKLQkJSVdMX0NNRChSRVBMWV9XSVBBTl9SWE9OKTsKLQkJSVdMX0NNRChSRVBMWV9XSVBBTl9SWE9OX1RJTUlORyk7Ci0JCUlXTF9DTUQoUkVQTFlfV0lQQU5fUlhPTl9BU1NPQyk7Ci0JCUlXTF9DTUQoUkVQTFlfV0lQQU5fUU9TX1BBUkFNKTsKLQkJSVdMX0NNRChSRVBMWV9XSVBBTl9XRVBLRVkpOwotCQlJV0xfQ01EKFJFUExZX1dJUEFOX1AyUF9DSEFOTkVMX1NXSVRDSCk7Ci0JCUlXTF9DTUQoUkVQTFlfV0lQQU5fTk9BX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUkVQTFlfV0lQQU5fREVBQ1RJVkFUSU9OX0NPTVBMRVRFKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gIlVOS05PV04iOwotCi0JfQotfQotCi0jZGVmaW5lIEhPU1RfQ09NUExFVEVfVElNRU9VVCAoSFogLyAyKQotCi1zdGF0aWMgdm9pZCBpd2xfZ2VuZXJpY19jbWRfY2FsbGJhY2soc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KQotewotCWlmIChwa3QtPmhkci5mbGFncyAmIElXTF9DTURfRkFJTEVEX01TSykgewotCQlJV0xfRVJSKHByaXYsICJCYWQgcmV0dXJuIGZyb20gJXMgKDB4JTA4WClcbiIsCi0JCQlnZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpLCBwa3QtPmhkci5mbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRwotCXN3aXRjaCAoY21kLT5oZHIuY21kKSB7Ci0JY2FzZSBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EOgotCWNhc2UgU0VOU0lUSVZJVFlfQ01EOgotCQlJV0xfREVCVUdfSENfRFVNUChwcml2LCAiYmFjayBmcm9tICVzICgweCUwOFgpXG4iLAotCQkJCWdldF9jbWRfc3RyaW5nKGNtZC0+aGRyLmNtZCksIHBrdC0+aGRyLmZsYWdzKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJSVdMX0RFQlVHX0hDKHByaXYsICJiYWNrIGZyb20gJXMgKDB4JTA4WClcbiIsCi0JCQkJZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwgcGt0LT5oZHIuZmxhZ3MpOwotCX0KLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IGl3bF9zZW5kX2NtZF9hc3luYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKFdBUk5fT04oIShjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogQW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgY2FuIG5vdCBleHBlY3QgYW4gU0tCIHRvIGJlIHNldC4gKi8KLQlpZiAoV0FSTl9PTihjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBBc3NpZ24gYSBnZW5lcmljIGNhbGxiYWNrIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQgKi8KLQlpZiAoIWNtZC0+Y2FsbGJhY2spCi0JCWNtZC0+Y2FsbGJhY2sgPSBpd2xfZ2VuZXJpY19jbWRfY2FsbGJhY2s7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlyZXQgPSBpd2xfZW5xdWV1ZV9oY21kKHByaXYsIGNtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCi0JCQkgIGdldF9jbWRfc3RyaW5nKGNtZC0+aWQpLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bF9zZW5kX2NtZF9zeW5jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9ob3N0X2NtZCAqY21kKQotewotCWludCBjbWRfaWR4OwotCWludCByZXQ7Ci0KLQlpZiAoV0FSTl9PTihjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkgLyogQSBzeW5jaHJvbm91cyBjb21tYW5kIGNhbiBub3QgaGF2ZSBhIGNhbGxiYWNrIHNldC4gKi8KLQlpZiAoV0FSTl9PTihjbWQtPmNhbGxiYWNrKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQXR0ZW1wdGluZyB0byBzZW5kIHN5bmMgY29tbWFuZCAlc1xuIiwKLQkJCWdldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKLQotCXNldF9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2V0dGluZyBIQ01EX0FDVElWRSBmb3IgY29tbWFuZCAlc1xuIiwKLQkJCWdldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKLQotCWNtZF9pZHggPSBpd2xfZW5xdWV1ZV9oY21kKHByaXYsIGNtZCk7Ci0JaWYgKGNtZF9pZHggPCAwKSB7Ci0JCXJldCA9IGNtZF9pZHg7Ci0JCWNsZWFyX2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpOwotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZW5kaW5nICVzOiBlbnF1ZXVlX2hjbWQgZmFpbGVkOiAlZFxuIiwKLQkJCSAgZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlLAotCQkJIXRlc3RfYml0KFNUQVRVU19IQ01EX0FDVElWRSwgJnByaXYtPnN0YXR1cyksCi0JCQlIT1NUX0NPTVBMRVRFX1RJTUVPVVQpOwotCWlmICghcmV0KSB7Ci0JCWlmICh0ZXN0X2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpKSB7Ci0JCQlJV0xfRVJSKHByaXYsCi0JCQkJIkVycm9yIHNlbmRpbmcgJXM6IHRpbWUgb3V0IGFmdGVyICVkbXMuXG4iLAotCQkJCWdldF9jbWRfc3RyaW5nKGNtZC0+aWQpLAotCQkJCWppZmZpZXNfdG9fbXNlY3MoSE9TVF9DT01QTEVURV9USU1FT1VUKSk7Ci0KLQkJCWNsZWFyX2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpOwotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNsZWFyaW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLAotCQkJCSAgICAgICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7Ci0JCQlyZXQgPSAtRVRJTUVET1VUOwotCQkJZ290byBjYW5jZWw7Ci0JCX0KLQl9Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNvbW1hbmQgJXMgYWJvcnRlZDogUkYgS0lMTCBTd2l0Y2hcbiIsCi0JCQkgICAgICAgZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwotCQlyZXQgPSAtRUNBTkNFTEVEOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNvbW1hbmQgJXMgZmFpbGVkOiBGVyBFcnJvclxuIiwKLQkJCSAgICAgICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKChjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSAmJiAhY21kLT5yZXBseV9wYWdlKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yOiBSZXNwb25zZSBOVUxMIGluICclcydcbiIsCi0JCQkgIGdldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBjYW5jZWw7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWNhbmNlbDoKLQlpZiAoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikgewotCQkvKgotCQkgKiBDYW5jZWwgdGhlIENNRF9XQU5UX1NLQiBmbGFnIGZvciB0aGUgY21kIGluIHRoZQotCQkgKiBUWCBjbWQgcXVldWUuIE90aGVyd2lzZSBpbiBjYXNlIHRoZSBjbWQgY29tZXMKLQkJICogaW4gbGF0ZXIsIGl0IHdpbGwgcG9zc2libHkgc2V0IGFuIGludmFsaWQKLQkJICogYWRkcmVzcyAoY21kLT5tZXRhLnNvdXJjZSkuCi0JCSAqLwotCQlwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXS5tZXRhW2NtZF9pZHhdLmZsYWdzICY9Ci0JCQkJCQkJfkNNRF9XQU5UX1NLQjsKLQl9Ci1mYWlsOgotCWlmIChjbWQtPnJlcGx5X3BhZ2UpIHsKLQkJaXdsX2ZyZWVfcGFnZXMocHJpdiwgY21kLT5yZXBseV9wYWdlKTsKLQkJY21kLT5yZXBseV9wYWdlID0gMDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgaXdsX3NlbmRfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9ob3N0X2NtZCAqY21kKQotewotCWlmIChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKQotCQlyZXR1cm4gaXdsX3NlbmRfY21kX2FzeW5jKHByaXYsIGNtZCk7Ci0KLQlyZXR1cm4gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgY21kKTsKLX0KLQotaW50IGl3bF9zZW5kX2NtZF9wZHUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBpZCwgdTE2IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKLQkJLmlkID0gaWQsCi0JCS5sZW4gPSB7IGxlbiwgfSwKLQkJLmRhdGEgPSB7IGRhdGEsIH0sCi0JfTsKLQotCXJldHVybiBpd2xfc2VuZF9jbWRfc3luYyhwcml2LCAmY21kKTsKLX0KLQotaW50IGl3bF9zZW5kX2NtZF9wZHVfYXN5bmMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgdTggaWQsIHUxNiBsZW4sIGNvbnN0IHZvaWQgKmRhdGEsCi0JCQkgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJCQkgICAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkpCi17Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IGlkLAotCQkubGVuID0geyBsZW4sIH0sCi0JCS5kYXRhID0geyBkYXRhLCB9LAotCX07Ci0KLQljbWQuZmxhZ3MgfD0gQ01EX0FTWU5DOwotCWNtZC5jYWxsYmFjayA9IGNhbGxiYWNrOwotCi0JcmV0dXJuIGl3bF9zZW5kX2NtZF9hc3luYyhwcml2LCAmY21kKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWhlbHBlcnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWhlbHBlcnMuaAppbmRleCA0MTIwN2EzLi45ZDkxNTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1oZWxwZXJzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaGVscGVycy5oCkBAIC0xMjAsNyArMTIwLDE2IEBACiAJfQogfQogCisjaWZkZWYgaWVlZTgwMjExX3N0b3BfcXVldWUKKyN1bmRlZiBpZWVlODAyMTFfc3RvcF9xdWV1ZQorI2VuZGlmCisKICNkZWZpbmUgaWVlZTgwMjExX3N0b3BfcXVldWUgRE9fTk9UX1VTRV9pZWVlODAyMTFfc3RvcF9xdWV1ZQorCisjaWZkZWYgaWVlZTgwMjExX3dha2VfcXVldWUKKyN1bmRlZiBpZWVlODAyMTFfd2FrZV9xdWV1ZQorI2VuZGlmCisKICNkZWZpbmUgaWVlZTgwMjExX3dha2VfcXVldWUgRE9fTk9UX1VTRV9pZWVlODAyMTFfd2FrZV9xdWV1ZQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXdsX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaW8uaAppbmRleCA4NjllZGM1Li4xOWEwOTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmgKQEAgLTM0LDIyICszNCwyMyBAQAogI2luY2x1ZGUgIml3bC1kZXYuaCIKICNpbmNsdWRlICJpd2wtZGVidWcuaCIKICNpbmNsdWRlICJpd2wtZGV2dHJhY2UuaCIKKyNpbmNsdWRlICJpd2wtYnVzLmgiCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfd3JpdGU4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG9mcywgdTggdmFsKQogewogCXRyYWNlX2l3bHdpZmlfZGV2X2lvd3JpdGU4KHByaXYsIG9mcywgdmFsKTsKLQlpb3dyaXRlOCh2YWwsIHByaXYtPmh3X2Jhc2UgKyBvZnMpOworCWJ1c193cml0ZTgocHJpdi0+YnVzLCBvZnMsIHZhbCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfd3JpdGUzMihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZnMsIHUzMiB2YWwpCiB7CiAJdHJhY2VfaXdsd2lmaV9kZXZfaW93cml0ZTMyKHByaXYsIG9mcywgdmFsKTsKLQlpb3dyaXRlMzIodmFsLCBwcml2LT5od19iYXNlICsgb2ZzKTsKKwlidXNfd3JpdGUzMihwcml2LT5idXMsIG9mcywgdmFsKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgaXdsX3JlYWQzMihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZnMpCiB7Ci0JdTMyIHZhbCA9IGlvcmVhZDMyKHByaXYtPmh3X2Jhc2UgKyBvZnMpOworCXUzMiB2YWwgPSBidXNfcmVhZDMyKHByaXYtPmJ1cywgb2ZzKTsKIAl0cmFjZV9pd2x3aWZpX2Rldl9pb3JlYWQzMihwcml2LCBvZnMsIHZhbCk7CiAJcmV0dXJuIHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWxlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbGVkLmMKaW5kZXggN2MyM2JlYi4uYTY3YWU1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbGVkLmMKQEAgLTI4LDggKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpAQCAtNDAsMTMgKzM4LDkgQEAKIAogI2luY2x1ZGUgIml3bC1kZXYuaCIKICNpbmNsdWRlICJpd2wtY29yZS5oIgorI2luY2x1ZGUgIml3bC1hZ24uaCIKICNpbmNsdWRlICJpd2wtaW8uaCIKLQotLyogZGVmYXVsdDogSVdMX0xFRF9CTElOSygwKSB1c2luZyBibGlua2luZyBpbmRleCB0YWJsZSAqLwotc3RhdGljIGludCBsZWRfbW9kZTsKLW1vZHVsZV9wYXJhbShsZWRfbW9kZSwgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MobGVkX21vZGUsICIwPXN5c3RlbSBkZWZhdWx0LCAiCi0JCSIxPU9uKFJGIE9uKS9PZmYoUkYgT2ZmKSwgMj1ibGlua2luZyIpOworI2luY2x1ZGUgIml3bC10cmFucy5oIgogCiAvKiBUaHJvdWdocHV0CQlPRkYgdGltZShtcykJT04gdGltZSAobXMpCiAgKgk+MzAwCQkJMjUJCTI1CkBAIC0xMTgsNyArMTEyLDcgQEAKIAlpZiAocmVnICE9IChyZWcgJiBDU1JfTEVEX0JTTV9DVFJMX01TSykpCiAJCWl3bF93cml0ZTMyKHByaXYsIENTUl9MRURfUkVHLCByZWcgJiBDU1JfTEVEX0JTTV9DVFJMX01TSyk7CiAKLQlyZXR1cm4gaXdsX3NlbmRfY21kKHByaXYsICZjbWQpOworCXJldHVybiB0cmFuc19zZW5kX2NtZCgmcHJpdi0+dHJhbnMsICZjbWQpOwogfQogCiAvKiBTZXQgbGVkIHBhdHRlcm4gY29tbWFuZCAqLwpAQCAtMTgxLDcgKzE3NSw3IEBACiAKIHZvaWQgaXdsX2xlZHNfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JaW50IG1vZGUgPSBsZWRfbW9kZTsKKwlpbnQgbW9kZSA9IGl3bGFnbl9tb2RfcGFyYW1zLmxlZF9tb2RlOwogCWludCByZXQ7CiAKIAlpZiAobW9kZSA9PSBJV0xfTEVEX0RFRkFVTFQpCkBAIC0yMDksNyArMjAzLDggQEAKIAkJYnJlYWs7CiAJfQogCi0JcmV0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwcml2LT5wY2lfZGV2LT5kZXYsICZwcml2LT5sZWQpOworCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3Rlcihwcml2LT5idXMtPmRldiwKKwkJCQkgICAgJnByaXYtPmxlZCk7CiAJaWYgKHJldCkgewogCQlrZnJlZShwcml2LT5sZWQubmFtZSk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3ZTQzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBjaS5jCkBAIC0wLDAgKzEsNTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktYXNwbS5oPgorCisjaW5jbHVkZSAiaXdsLWJ1cy5oIgorI2luY2x1ZGUgIml3bC1hZ24uaCIKKyNpbmNsdWRlICJpd2wtY29yZS5oIgorI2luY2x1ZGUgIml3bC1pby5oIgorCisvKiBQQ0kgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBDSV9DRkdfUkVUUllfVElNRU9VVAkweDA0MQorI2RlZmluZSBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDBTX0VOCTB4MDEKKyNkZWZpbmUgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wxX0VOCTB4MDIKKworc3RydWN0IGl3bF9wY2lfYnVzIHsKKwkvKiBiYXNpYyBwY2ktbmV0d29yayBkcml2ZXIgc3R1ZmYgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKworCS8qIHBjaSBoYXJkd2FyZSBhZGRyZXNzIHN1cHBvcnQgKi8KKwl2b2lkIF9faW9tZW0gKmh3X2Jhc2U7Cit9OworCisjZGVmaW5lIElXTF9CVVNfR0VUX1BDSV9CVVMoX2l3bF9idXMpIFwKKwkJCSgoc3RydWN0IGl3bF9wY2lfYnVzICopICgoX2l3bF9idXMpLT5idXNfc3BlY2lmaWMpKQorCisjZGVmaW5lIElXTF9CVVNfR0VUX1BDSV9ERVYoX2l3bF9idXMpIFwKKwkJCSgoSVdMX0JVU19HRVRfUENJX0JVUyhfaXdsX2J1cykpLT5wY2lfZGV2KQorCitzdGF0aWMgdTE2IGl3bF9wY2lleHBfbGlua19jdHJsKHN0cnVjdCBpd2xfYnVzICpidXMpCit7CisJaW50IHBvczsKKwl1MTYgcGNpX2xua19jdGw7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBJV0xfQlVTX0dFVF9QQ0lfREVWKGJ1cyk7CisKKwlwb3MgPSBwY2lfcGNpZV9jYXAocGNpX2Rldik7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgcG9zICsgUENJX0VYUF9MTktDVEwsICZwY2lfbG5rX2N0bCk7CisJcmV0dXJuIHBjaV9sbmtfY3RsOworfQorCitzdGF0aWMgYm9vbCBpd2xfcGNpX2lzX3BtX3N1cHBvcnRlZChzdHJ1Y3QgaXdsX2J1cyAqYnVzKQoreworCXUxNiBsY3RsID0gaXdsX3BjaWV4cF9saW5rX2N0cmwoYnVzKTsKKworCXJldHVybiAhKGxjdGwgJiBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDBTX0VOKTsKK30KKworc3RhdGljIHZvaWQgaXdsX3BjaV9hcG1fY29uZmlnKHN0cnVjdCBpd2xfYnVzICpidXMpCit7CisJLyoKKwkgKiBIVyBidWcgVy9BIGZvciBpbnN0YWJpbGl0eSBpbiBQQ0llIGJ1cyBMMFMtPkwxIHRyYW5zaXRpb24uCisJICogQ2hlY2sgaWYgQklPUyAob3IgT1MpIGVuYWJsZWQgTDEtQVNQTSBvbiB0aGlzIGRldmljZS4KKwkgKiBJZiBzbyAobGlrZWx5KSwgZGlzYWJsZSBMMFMsIHNvIGRldmljZSBtb3ZlcyBkaXJlY3RseSBMMC0+TDE7CisJICogICAgY29zdHMgbmVnbGlnaWJsZSBhbW91bnQgb2YgcG93ZXIgc2F2aW5ncy4KKwkgKiBJZiBub3QgKHVubGlrZWx5KSwgZW5hYmxlIEwwUywgc28gdGhlcmUgaXMgYXQgbGVhc3Qgc29tZQorCSAqICAgIHBvd2VyIHNhdmluZ3MsIGV2ZW4gd2l0aG91dCBMMS4KKwkgKi8KKwl1MTYgbGN0bCA9IGl3bF9wY2lleHBfbGlua19jdHJsKGJ1cyk7CisKKwlpZiAoKGxjdGwgJiBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4pID09CisJCQkJUENJX0NGR19MSU5LX0NUUkxfVkFMX0wxX0VOKSB7CisJCS8qIEwxLUFTUE0gZW5hYmxlZDsgZGlzYWJsZSghKSBMMFMgKi8KKwkJaXdsX3NldF9iaXQoYnVzLT5kcnZfZGF0YSwgQ1NSX0dJT19SRUcsCisJCQkJQ1NSX0dJT19SRUdfVkFMX0wwU19FTkFCTEVEKTsKKwkJZGV2X3ByaW50ayhLRVJOX0lORk8sIGJ1cy0+ZGV2LCAiTDEgRW5hYmxlZDsgRGlzYWJsaW5nIEwwU1xuIik7CisJfSBlbHNlIHsKKwkJLyogTDEtQVNQTSBkaXNhYmxlZDsgZW5hYmxlKCEpIEwwUyAqLworCQlpd2xfY2xlYXJfYml0KGJ1cy0+ZHJ2X2RhdGEsIENTUl9HSU9fUkVHLAorCQkJCUNTUl9HSU9fUkVHX1ZBTF9MMFNfRU5BQkxFRCk7CisJCWRldl9wcmludGsoS0VSTl9JTkZPLCBidXMtPmRldiwgIkwxIERpc2FibGVkOyBFbmFibGluZyBMMFNcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgaXdsX3BjaV9zZXRfZHJ2X2RhdGEoc3RydWN0IGl3bF9idXMgKmJ1cywgdm9pZCAqZHJ2X2RhdGEpCit7CisJYnVzLT5kcnZfZGF0YSA9IGRydl9kYXRhOworfQorCitzdGF0aWMgdm9pZCBpd2xfcGNpX2dldF9od19pZChzdHJ1Y3QgaXdsX2J1cyAqYnVzLCBjaGFyIGJ1ZltdLAorCQkJICAgICAgaW50IGJ1Zl9sZW4pCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBJV0xfQlVTX0dFVF9QQ0lfREVWKGJ1cyk7CisKKwlzbnByaW50ZihidWYsIGJ1Zl9sZW4sICJQQ0kgSUQ6IDB4JTA0WDoweCUwNFgiLCBwY2lfZGV2LT5kZXZpY2UsCisJCSBwY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKK30KKworc3RhdGljIHZvaWQgaXdsX3BjaV93cml0ZTgoc3RydWN0IGl3bF9idXMgKmJ1cywgdTMyIG9mcywgdTggdmFsKQoreworCWlvd3JpdGU4KHZhbCwgSVdMX0JVU19HRVRfUENJX0JVUyhidXMpLT5od19iYXNlICsgb2ZzKTsKK30KKworc3RhdGljIHZvaWQgaXdsX3BjaV93cml0ZTMyKHN0cnVjdCBpd2xfYnVzICpidXMsIHUzMiBvZnMsIHUzMiB2YWwpCit7CisJaW93cml0ZTMyKHZhbCwgSVdMX0JVU19HRVRfUENJX0JVUyhidXMpLT5od19iYXNlICsgb2ZzKTsKK30KKworc3RhdGljIHUzMiBpd2xfcGNpX3JlYWQzMihzdHJ1Y3QgaXdsX2J1cyAqYnVzLCB1MzIgb2ZzKQoreworCXUzMiB2YWwgPSBpb3JlYWQzMihJV0xfQlVTX0dFVF9QQ0lfQlVTKGJ1cyktPmh3X2Jhc2UgKyBvZnMpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXdsX2J1c19vcHMgcGNpX29wcyA9IHsKKwkuZ2V0X3BtX3N1cHBvcnQgPSBpd2xfcGNpX2lzX3BtX3N1cHBvcnRlZCwKKwkuYXBtX2NvbmZpZyA9IGl3bF9wY2lfYXBtX2NvbmZpZywKKwkuc2V0X2Rydl9kYXRhID0gaXdsX3BjaV9zZXRfZHJ2X2RhdGEsCisJLmdldF9od19pZCA9IGl3bF9wY2lfZ2V0X2h3X2lkLAorCS53cml0ZTggPSBpd2xfcGNpX3dyaXRlOCwKKwkud3JpdGUzMiA9IGl3bF9wY2lfd3JpdGUzMiwKKwkucmVhZDMyID0gaXdsX3BjaV9yZWFkMzIsCit9OworCisjZGVmaW5lIElXTF9QQ0lfREVWSUNFKGRldiwgc3ViZGV2LCBjZmcpIFwKKwkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwgIC5kZXZpY2UgPSAoZGV2KSwgXAorCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELCAuc3ViZGV2aWNlID0gKHN1YmRldiksIFwKKwkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpJihjZmcpCisKKy8qIEhhcmR3YXJlIHNwZWNpZmljIGZpbGUgZGVmaW5lcyB0aGUgUENJIElEcyB0YWJsZSBmb3IgdGhhdCBoYXJkd2FyZSBtb2R1bGUgKi8KK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShpd2xfaHdfY2FyZF9pZHMpID0geworCXtJV0xfUENJX0RFVklDRSgweDQyMzIsIDB4MTIwMSwgaXdsNTEwMF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMzIsIDB4MTMwMSwgaXdsNTEwMF9hZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMjA0LCBpd2w1MTAwX2Fnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMzA0LCBpd2w1MTAwX2Fnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjMyLCAweDEyMDUsIGl3bDUxMDBfYmduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjMyLCAweDEzMDUsIGl3bDUxMDBfYmduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMzIsIDB4MTIwNiwgaXdsNTEwMF9hYmdfY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMzIsIDB4MTMwNiwgaXdsNTEwMF9hYmdfY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMjIxLCBpd2w1MTAwX2Fnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMzIxLCBpd2w1MTAwX2Fnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjMyLCAweDEyMjQsIGl3bDUxMDBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjMyLCAweDEzMjQsIGl3bDUxMDBfYWduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMzIsIDB4MTIyNSwgaXdsNTEwMF9iZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMzIsIDB4MTMyNSwgaXdsNTEwMF9iZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMjI2LCBpd2w1MTAwX2FiZ19jZmcpfSwgLyogTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzMiwgMHgxMzI2LCBpd2w1MTAwX2FiZ19jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM3LCAweDEyMTEsIGl3bDUxMDBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM3LCAweDEzMTEsIGl3bDUxMDBfYWduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMzcsIDB4MTIxNCwgaXdsNTEwMF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMzcsIDB4MTMxNCwgaXdsNTEwMF9hZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzNywgMHgxMjE1LCBpd2w1MTAwX2Jnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzNywgMHgxMzE1LCBpd2w1MTAwX2Jnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM3LCAweDEyMTYsIGl3bDUxMDBfYWJnX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM3LCAweDEzMTYsIGl3bDUxMDBfYWJnX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLworCisvKiA1MzAwIFNlcmllcyBXaUZpICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzNSwgMHgxMDIxLCBpd2w1MzAwX2Fnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzNSwgMHgxMTIxLCBpd2w1MzAwX2Fnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM1LCAweDEwMjQsIGl3bDUzMDBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM1LCAweDExMjQsIGl3bDUzMDBfYWduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMzUsIDB4MTAwMSwgaXdsNTMwMF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMzUsIDB4MTEwMSwgaXdsNTMwMF9hZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzNSwgMHgxMDA0LCBpd2w1MzAwX2Fnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzNSwgMHgxMTA0LCBpd2w1MzAwX2Fnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM2LCAweDEwMTEsIGl3bDUzMDBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM2LCAweDExMTEsIGl3bDUzMDBfYWduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMzYsIDB4MTAxNCwgaXdsNTMwMF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMzYsIDB4MTExNCwgaXdsNTMwMF9hZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCisKKy8qIDUzNTAgU2VyaWVzIFdpRmkvV2lNYXggKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNBLCAweDEwMDEsIGl3bDUzNTBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNBLCAweDEwMjEsIGl3bDUzNTBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNCLCAweDEwMTEsIGl3bDUzNTBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KKworLyogNTE1MCBTZXJpZXMgV2lmaS9XaU1heCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyM0MsIDB4MTIwMSwgaXdsNTE1MF9hZ25fY2ZnKX0sIC8qIE1pbmkgQ2FyZCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyM0MsIDB4MTMwMSwgaXdsNTE1MF9hZ25fY2ZnKX0sIC8qIEhhbGYgTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzQywgMHgxMjA2LCBpd2w1MTUwX2FiZ19jZmcpfSwgLyogTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzQywgMHgxMzA2LCBpd2w1MTUwX2FiZ19jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNDLCAweDEyMjEsIGl3bDUxNTBfYWduX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNDLCAweDEzMjEsIGl3bDUxNTBfYWduX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLworCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzRCwgMHgxMjExLCBpd2w1MTUwX2Fnbl9jZmcpfSwgLyogTWluaSBDYXJkICovCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzRCwgMHgxMzExLCBpd2w1MTUwX2Fnbl9jZmcpfSwgLyogSGFsZiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNELCAweDEyMTYsIGl3bDUxNTBfYWJnX2NmZyl9LCAvKiBNaW5pIENhcmQgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNELCAweDEzMTYsIGl3bDUxNTBfYWJnX2NmZyl9LCAvKiBIYWxmIE1pbmkgQ2FyZCAqLworCisvKiA2eDAwIFNlcmllcyAqLworCXtJV0xfUENJX0RFVklDRSgweDQyMkIsIDB4MTEwMSwgaXdsNjAwMF8zYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDQyMkIsIDB4MTEyMSwgaXdsNjAwMF8zYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDQyMkMsIDB4MTMwMSwgaXdsNjAwMGlfMmFnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjJDLCAweDEzMDYsIGl3bDYwMDBpXzJhYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIyQywgMHgxMzA3LCBpd2w2MDAwaV8yYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIyQywgMHgxMzIxLCBpd2w2MDAwaV8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDQyMkMsIDB4MTMyNiwgaXdsNjAwMGlfMmFiZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM4LCAweDExMTEsIGl3bDYwMDBfM2Fnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM5LCAweDEzMTEsIGl3bDYwMDBpXzJhZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzOSwgMHgxMzE2LCBpd2w2MDAwaV8yYWJnX2NmZyl9LAorCisvKiA2eDA1IFNlcmllcyAqLworCXtJV0xfUENJX0RFVklDRSgweDAwODIsIDB4MTMwMSwgaXdsNjAwNV8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODIsIDB4MTMwNiwgaXdsNjAwNV8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODIsIDB4MTMwNywgaXdsNjAwNV8yYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzIxLCBpd2w2MDA1XzJhZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzI2LCBpd2w2MDA1XzJhYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4NSwgMHgxMzExLCBpd2w2MDA1XzJhZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4NSwgMHgxMzE2LCBpd2w2MDA1XzJhYmdfY2ZnKX0sCisKKy8qIDZ4MzAgU2VyaWVzICovCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4QSwgMHg1MzA1LCBpd2wxMDMwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDhBLCAweDUzMDcsIGl3bDEwMzBfYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4QSwgMHg1MzI1LCBpd2wxMDMwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDhBLCAweDUzMjcsIGl3bDEwMzBfYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4QiwgMHg1MzE1LCBpd2wxMDMwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDhCLCAweDUzMTcsIGl3bDEwMzBfYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA5MCwgMHg1MjExLCBpd2w2MDMwXzJhZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA5MCwgMHg1MjE1LCBpd2w2MDMwXzJiZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA5MCwgMHg1MjE2LCBpd2w2MDMwXzJhYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA5MSwgMHg1MjAxLCBpd2w2MDMwXzJhZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA5MSwgMHg1MjA1LCBpd2w2MDMwXzJiZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA5MSwgMHg1MjA2LCBpd2w2MDMwXzJhYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA5MSwgMHg1MjA3LCBpd2w2MDMwXzJiZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDkxLCAweDUyMjEsIGl3bDYwMzBfMmFnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDkxLCAweDUyMjUsIGl3bDYwMzBfMmJnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDkxLCAweDUyMjYsIGl3bDYwMzBfMmFiZ19jZmcpfSwKKworLyogNng1MCBXaUZpL1dpTWF4IFNlcmllcyAqLworCXtJV0xfUENJX0RFVklDRSgweDAwODcsIDB4MTMwMSwgaXdsNjA1MF8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODcsIDB4MTMwNiwgaXdsNjA1MF8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODcsIDB4MTMyMSwgaXdsNjA1MF8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODcsIDB4MTMyNiwgaXdsNjA1MF8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODksIDB4MTMxMSwgaXdsNjA1MF8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODksIDB4MTMxNiwgaXdsNjA1MF8yYWJnX2NmZyl9LAorCisvKiA2MTUwIFdpRmkvV2lNYXggU2VyaWVzICovCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NSwgMHgxMzA1LCBpd2w2MTUwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODg1LCAweDEzMDcsIGl3bDYxNTBfYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NSwgMHgxMzI1LCBpd2w2MTUwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODg1LCAweDEzMjcsIGl3bDYxNTBfYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NiwgMHgxMzE1LCBpd2w2MTUwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODg2LCAweDEzMTcsIGl3bDYxNTBfYmdfY2ZnKX0sCisKKy8qIDEwMDAgU2VyaWVzIFdpRmkgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgzLCAweDEyMDUsIGl3bDEwMDBfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODMsIDB4MTMwNSwgaXdsMTAwMF9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MywgMHgxMjI1LCBpd2wxMDAwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgzLCAweDEzMjUsIGl3bDEwMDBfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODQsIDB4MTIxNSwgaXdsMTAwMF9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4NCwgMHgxMzE1LCBpd2wxMDAwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgzLCAweDEyMDYsIGl3bDEwMDBfYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MywgMHgxMzA2LCBpd2wxMDAwX2JnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODMsIDB4MTIyNiwgaXdsMTAwMF9iZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgzLCAweDEzMjYsIGl3bDEwMDBfYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4NCwgMHgxMjE2LCBpd2wxMDAwX2JnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDAwODQsIDB4MTMxNiwgaXdsMTAwMF9iZ19jZmcpfSwKKworLyogMTAwIFNlcmllcyBXaUZpICovCisJe0lXTF9QQ0lfREVWSUNFKDB4MDhBRSwgMHgxMDA1LCBpd2wxMDBfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4QUUsIDB4MTAwNywgaXdsMTAwX2JnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4QUYsIDB4MTAxNSwgaXdsMTAwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwOEFGLCAweDEwMTcsIGl3bDEwMF9iZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwOEFFLCAweDEwMjUsIGl3bDEwMF9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDhBRSwgMHgxMDI3LCBpd2wxMDBfYmdfY2ZnKX0sCisKKy8qIDEzMCBTZXJpZXMgV2lGaSAqLworCXtJV0xfUENJX0RFVklDRSgweDA4OTYsIDB4NTAwNSwgaXdsMTMwX2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODk2LCAweDUwMDcsIGl3bDEzMF9iZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODk3LCAweDUwMTUsIGl3bDEzMF9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg5NywgMHg1MDE3LCBpd2wxMzBfYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg5NiwgMHg1MDI1LCBpd2wxMzBfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OTYsIDB4NTAyNywgaXdsMTMwX2JnX2NmZyl9LAorCisvKiAyeDAwIFNlcmllcyAqLworCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDAyMiwgaXdsMjAwMF8yYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OTEsIDB4NDIyMiwgaXdsMjAwMF8yYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDQyMiwgaXdsMjAwMF8yYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDAyNiwgaXdsMjAwMF8yYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg5MSwgMHg0MjI2LCBpd2wyMDAwXzJiZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODkwLCAweDQ0MjYsIGl3bDIwMDBfMmJnX2NmZyl9LAorCisvKiAyeDMwIFNlcmllcyAqLworCXtJV0xfUENJX0RFVklDRSgweDA4ODcsIDB4NDA2MiwgaXdsMjAzMF8yYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4ODgsIDB4NDI2MiwgaXdsMjAzMF8yYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4ODcsIDB4NDQ2MiwgaXdsMjAzMF8yYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4ODcsIDB4NDA2NiwgaXdsMjAzMF8yYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg4OCwgMHg0MjY2LCBpd2wyMDMwXzJiZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODg3LCAweDQ0NjYsIGl3bDIwMzBfMmJnX2NmZyl9LAorCisvKiA2eDM1IFNlcmllcyAqLworCXtJV0xfUENJX0RFVklDRSgweDA4OEUsIDB4NDA2MCwgaXdsNjAzNV8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OEYsIDB4NDI2MCwgaXdsNjAzNV8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OEUsIDB4NDQ2MCwgaXdsNjAzNV8yYWduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OEUsIDB4NDA2NCwgaXdsNjAzNV8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OEYsIDB4NDI2NCwgaXdsNjAzNV8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OEUsIDB4NDQ2NCwgaXdsNjAzNV8yYWJnX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OEUsIDB4NDA2NiwgaXdsNjAzNV8yYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg4RiwgMHg0MjY2LCBpd2w2MDM1XzJiZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODhFLCAweDQ0NjYsIGl3bDYwMzVfMmJnX2NmZyl9LAorCisvKiAxMDUgU2VyaWVzICovCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg5NCwgMHgwMDIyLCBpd2wxMDVfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OTUsIDB4MDIyMiwgaXdsMTA1X2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDA0MjIsIGl3bDEwNV9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg5NCwgMHgwMDI2LCBpd2wxMDVfYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg5NSwgMHgwMjI2LCBpd2wxMDVfYmdfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg5NCwgMHgwNDI2LCBpd2wxMDVfYmdfY2ZnKX0sCisKKy8qIDEzNSBTZXJpZXMgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODkyLCAweDAwNjIsIGl3bDEzNV9iZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDg5MywgMHgwMjYyLCBpd2wxMzVfYmduX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDA4OTIsIDB4MDQ2MiwgaXdsMTM1X2Jnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODkyLCAweDAwNjYsIGl3bDEzNV9iZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODkzLCAweDAyNjYsIGl3bDEzNV9iZ19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwODkyLCAweDA0NjYsIGl3bDEzNV9iZ19jZmcpfSwKKworCXswfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpd2xfaHdfY2FyZF9pZHMpOworCitzdGF0aWMgaW50IGl3bF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGl3bF9jZmcgKmNmZyA9IChzdHJ1Y3QgaXdsX2NmZyAqKShlbnQtPmRyaXZlcl9kYXRhKTsKKwlzdHJ1Y3QgaXdsX2J1cyAqYnVzOworCXN0cnVjdCBpd2xfcGNpX2J1cyAqcGNpX2J1czsKKwl1MTYgcGNpX2NtZDsKKwlpbnQgZXJyOworCisJYnVzID0ga3phbGxvYyhzaXplb2YoKmJ1cykgKyBzaXplb2YoKnBjaV9idXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1cykgeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJICAgIkNvdWxkbid0IGFsbG9jYXRlIGl3bF9wY2lfYnVzIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX3BjaTsKKwl9CisKKwlwY2lfYnVzID0gSVdMX0JVU19HRVRfUENJX0JVUyhidXMpOworCXBjaV9idXMtPnBjaV9kZXYgPSBwZGV2OworCisJLyogVy9BIC0gc2VlbXMgdG8gc29sdmUgd2VpcmQgYmVoYXZpb3IuIFdlIG5lZWQgdG8gcmVtb3ZlIHRoaXMgaWYgd2UKKwkgKiBkb24ndCB3YW50IHRvIHN0YXkgaW4gTDEgYWxsIHRoZSB0aW1lLiBUaGlzIHdhc3RlcyBhIGxvdCBvZiBwb3dlciAqLworCXBjaV9kaXNhYmxlX2xpbmtfc3RhdGUocGRldiwgUENJRV9MSU5LX1NUQVRFX0wwUyB8IFBDSUVfTElOS19TVEFURV9MMSB8CisJCQkJUENJRV9MSU5LX1NUQVRFX0NMS1BNKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9ub19wY2k7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzNikpOworCWlmICghZXJyKQorCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDM2KSk7CisJaWYgKGVycikgeworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAoIWVycikKKwkJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LAorCQkJCQkJCURNQV9CSVRfTUFTSygzMikpOworCQkvKiBib3RoIGF0dGVtcHRzIGZhaWxlZDogKi8KKwkJaWYgKGVycikgeworCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgYnVzLT5kZXYsCisJCQkJICAgIk5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKKwkJCWdvdG8gb3V0X3BjaV9kaXNhYmxlX2RldmljZTsKKwkJfQorCX0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChlcnIpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgYnVzLT5kZXYsICJwY2lfcmVxdWVzdF9yZWdpb25zIGZhaWxlZCIpOworCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcGNpX2J1cy0+aHdfYmFzZSA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKKwlpZiAoIXBjaV9idXMtPmh3X2Jhc2UpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgYnVzLT5kZXYsICJwY2lfaW9tYXAgZmFpbGVkIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCisJCSJwY2lfcmVzb3VyY2VfbGVuID0gMHglMDhsbHhcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LAorCQkicGNpX3Jlc291cmNlX2Jhc2UgPSAlcFxuIiwgcGNpX2J1cy0+aHdfYmFzZSk7CisKKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwKKwkJIkhXIFJldmlzaW9uIElEID0gMHglWFxuIiwgcGRldi0+cmV2aXNpb24pOworCisJLyogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAorCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NGR19SRVRSWV9USU1FT1VULCAweDAwKTsKKworCWVyciA9IHBjaV9lbmFibGVfbXNpKHBkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwgInBjaV9lbmFibGVfbXNpIGZhaWxlZCIpOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKworCS8qIFRPRE86IE1vdmUgdGhpcyBhd2F5LCBub3QgbmVlZGVkIGlmIG5vdCBNU0kgKi8KKwkvKiBlbmFibGUgcmZraWxsIGludGVycnVwdDogaHcgYnVnIHcvYSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NtZCk7CisJaWYgKHBjaV9jbWQgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpIHsKKwkJcGNpX2NtZCAmPSB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHBjaV9jbWQpOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBidXMpOworCisJYnVzLT5kZXYgPSAmcGRldi0+ZGV2OworCWJ1cy0+aXJxID0gcGRldi0+aXJxOworCWJ1cy0+b3BzID0gJnBjaV9vcHM7CisKKwllcnIgPSBpd2xfcHJvYmUoYnVzLCBjZmcpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2Rpc2FibGVfbXNpOworCXJldHVybiAwOworCitvdXRfZGlzYWJsZV9tc2k6CisJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworb3V0X2lvdW5tYXA6CisJcGNpX2lvdW5tYXAocGRldiwgcGNpX2J1cy0+aHdfYmFzZSk7CitvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK291dF9wY2lfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0X25vX3BjaToKKwlrZnJlZShidXMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGl3bF9wY2lfZG93bihzdHJ1Y3QgaXdsX2J1cyAqYnVzKQoreworCXN0cnVjdCBpd2xfcGNpX2J1cyAqcGNpX2J1cyA9IChzdHJ1Y3QgaXdsX3BjaV9idXMgKikgYnVzLT5idXNfc3BlY2lmaWM7CisKKwlwY2lfZGlzYWJsZV9tc2kocGNpX2J1cy0+cGNpX2Rldik7CisJcGNpX2lvdW5tYXAocGNpX2J1cy0+cGNpX2RldiwgcGNpX2J1cy0+aHdfYmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2lfYnVzLT5wY2lfZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2J1cy0+cGNpX2Rldik7CisJcGNpX3NldF9kcnZkYXRhKHBjaV9idXMtPnBjaV9kZXYsIE5VTEwpOworCisJa2ZyZWUoYnVzKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGl3bF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpd2xfYnVzICpidXMgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpd2xfcmVtb3ZlKGJ1cy0+ZHJ2X2RhdGEpOworCisJaXdsX3BjaV9kb3duKGJ1cyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBpd2xfcGNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOworCXN0cnVjdCBpd2xfYnVzICpidXMgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwkvKiBCZWZvcmUgeW91IHB1dCBjb2RlIGhlcmUsIHRoaW5rIGFib3V0IFdvV0xBTi4gWW91IGNhbm5vdCBjaGVjayBoZXJlCisJICogd2hldGhlciBXb1dMQU4gaXMgZW5hYmxlZCBvciBub3QsIGFuZCB5b3VyIGNvZGUgd2lsbCBydW4gZXZlbiBpZgorCSAqIFdvV0xBTiBpcyBlbmFibGVkIC0gZG9uJ3Qga2lsbCB0aGUgTklDLCBzb21lb25lIG1heSBuZWVkIGl0IGluIFN4LgorCSAqLworCisJcmV0dXJuIGl3bF9zdXNwZW5kKGJ1cy0+ZHJ2X2RhdGEpOworfQorCitzdGF0aWMgaW50IGl3bF9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKKwlzdHJ1Y3QgaXdsX2J1cyAqYnVzID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyogQmVmb3JlIHlvdSBwdXQgY29kZSBoZXJlLCB0aGluayBhYm91dCBXb1dMQU4uIFlvdSBjYW5ub3QgY2hlY2sgaGVyZQorCSAqIHdoZXRoZXIgV29XTEFOIGlzIGVuYWJsZWQgb3Igbm90LCBhbmQgeW91ciBjb2RlIHdpbGwgcnVuIGV2ZW4gaWYKKwkgKiBXb1dMQU4gaXMgZW5hYmxlZCAtIHRoZSBOSUMgbWF5IGJlIGFsaXZlLgorCSAqLworCisJLyoKKwkgKiBXZSBkaXNhYmxlIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyICgweDQxKSB0byBrZWVwCisJICogUENJIFR4IHJldHJpZXMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIEMzIENQVSBzdGF0ZS4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NGR19SRVRSWV9USU1FT1VULCAweDAwKTsKKworCXJldHVybiBpd2xfcmVzdW1lKGJ1cy0+ZHJ2X2RhdGEpOworfQorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoaXdsX2Rldl9wbV9vcHMsIGl3bF9wY2lfc3VzcGVuZCwgaXdsX3BjaV9yZXN1bWUpOworCisjZGVmaW5lIElXTF9QTV9PUFMJKCZpd2xfZGV2X3BtX29wcykKKworI2Vsc2UKKworI2RlZmluZSBJV0xfUE1fT1BTCU5VTEwKKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpd2xfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5pZF90YWJsZSA9IGl3bF9od19jYXJkX2lkcywKKwkucHJvYmUgPSBpd2xfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpd2xfcGNpX3JlbW92ZSksCisJLmRyaXZlci5wbSA9IElXTF9QTV9PUFMsCit9OworCitpbnQgX19tdXN0X2NoZWNrIGl3bF9wY2lfcmVnaXN0ZXJfZHJpdmVyKHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpd2xfcGNpX2RyaXZlcik7CisJaWYgKHJldCkKKwkJcHJfZXJyKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBQQ0kgbW9kdWxlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaXdsX3BjaV91bnJlZ2lzdGVyX2RyaXZlcih2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXdsX3BjaV9kcml2ZXIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBvd2VyLmMKaW5kZXggNTk1YzkzMC4uM2VjNjE5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wb3dlci5jCkBAIC0zNiwxMSArMzYsMTMgQEAKIAogI2luY2x1ZGUgIml3bC1lZXByb20uaCIKICNpbmNsdWRlICJpd2wtZGV2LmgiCisjaW5jbHVkZSAiaXdsLWFnbi5oIgogI2luY2x1ZGUgIml3bC1jb3JlLmgiCiAjaW5jbHVkZSAiaXdsLWlvLmgiCiAjaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCiAjaW5jbHVkZSAiaXdsLWRlYnVnLmgiCiAjaW5jbHVkZSAiaXdsLXBvd2VyLmgiCisjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCiAKIC8qCiAgKiBTZXR0aW5nIHBvd2VyIGxldmVsIGFsbG93cyB0aGUgY2FyZCB0byBnbyB0byBzbGVlcCB3aGVuIG5vdCBidXN5LgpAQCAtNTEsMTYgKzUzLDYgQEAKICAqLwogCiAvKgotICogRm9yIG5vdywga2VlcCB1c2luZyBwb3dlciBsZXZlbCAxIGluc3RlYWQgb2YgYXV0b21hdGljYWxseQotICogYWRqdXN0aW5nIC4uLgotICovCi1ib29sIG5vX3NsZWVwX2F1dG9hZGp1c3QgPSB0cnVlOwotbW9kdWxlX3BhcmFtKG5vX3NsZWVwX2F1dG9hZGp1c3QsIGJvb2wsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhub19zbGVlcF9hdXRvYWRqdXN0LAotCQkgImRvbid0IGF1dG9tYXRpY2FsbHkgYWRqdXN0IHNsZWVwIGxldmVsICIKLQkJICJhY2NvcmRpbmcgdG8gbWF4aW11bSBuZXR3b3JrIGxhdGVuY3kiKTsKLQotLyoKICAqIFRoaXMgZGVmaW5lcyB0aGUgb2xkIHBvd2VyIGxldmVscy4gVGhleSBhcmUgc3RpbGwgdXNlZCBieSBkZWZhdWx0CiAgKiAobGV2ZWwgMSkgYW5kIGZvciB0aGVybWFsIHRocm90dGxlIChsZXZlbHMgMyB0aHJvdWdoIDUpCiAgKi8KQEAgLTI1NCw3ICsyNDYsNyBAQAogCQl9CiAJfQogCi0JaWYgKHByaXYtPnBvd2VyX2RhdGEucGNpX3BtKQorCWlmIChwcml2LT5wb3dlcl9kYXRhLmJ1c19wbSkKIAkJY21kLT5mbGFncyB8PSBJV0xfUE9XRVJfUENJX1BNX01TSzsKIAllbHNlCiAJCWNtZC0+ZmxhZ3MgJj0gfklXTF9QT1dFUl9QQ0lfUE1fTVNLOwpAQCAtMjY5LDcgKzI2MSw3IEBACiB7CiAJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKIAotCWlmIChwcml2LT5wb3dlcl9kYXRhLnBjaV9wbSkKKwlpZiAocHJpdi0+cG93ZXJfZGF0YS5idXNfcG0pCiAJCWNtZC0+ZmxhZ3MgfD0gSVdMX1BPV0VSX1BDSV9QTV9NU0s7CiAKIAlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlNsZWVwIGNvbW1hbmQgZm9yIENBTVxuIik7CkBAIC0zMDUsNyArMjk3LDcgQEAKIAljbWQtPmZsYWdzID0gSVdMX1BPV0VSX0RSSVZFUl9BTExPV19TTEVFUF9NU0sgfAogCQkgICAgIElXTF9QT1dFUl9GQVNUX1BEOyAvKiBubyB1c2Ugc2VlaW5nIGZyYW1lcyBmb3Igb3RoZXJzICovCiAKLQlpZiAocHJpdi0+cG93ZXJfZGF0YS5wY2lfcG0pCisJaWYgKHByaXYtPnBvd2VyX2RhdGEuYnVzX3BtKQogCQljbWQtPmZsYWdzIHw9IElXTF9QT1dFUl9QQ0lfUE1fTVNLOwogCiAJaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnNoYWRvd19yZWdfZW5hYmxlKQpAQCAtMzQzLDcgKzMzNSw3IEBACiAJCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzNdKSwKIAkJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbNF0pKTsKIAotCXJldHVybiBpd2xfc2VuZF9jbWRfcGR1KHByaXYsIFBPV0VSX1RBQkxFX0NNRCwKKwlyZXR1cm4gdHJhbnNfc2VuZF9jbWRfcGR1KCZwcml2LT50cmFucywgUE9XRVJfVEFCTEVfQ01ELCBDTURfU1lOQywKIAkJCQlzaXplb2Yoc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCksIGNtZCk7CiB9CiAKQEAgLTM1NSw3ICszNDcsOSBAQAogCiAJZHRpbXBlciA9IHByaXYtPmh3LT5jb25mLnBzX2R0aW1fcGVyaW9kID86IDE7CiAKLQlpZiAocHJpdi0+aHctPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9JRExFKQorCWlmIChwcml2LT53b3dsYW4pCisJCWl3bF9zdGF0aWNfc2xlZXBfY21kKHByaXYsIGNtZCwgSVdMX1BPV0VSX0lOREVYXzUsIGR0aW1wZXIpOworCWVsc2UgaWYgKHByaXYtPmh3LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0NPTkZfSURMRSkKIAkJaXdsX3N0YXRpY19zbGVlcF9jbWQocHJpdiwgY21kLCBJV0xfUE9XRVJfSU5ERVhfNSwgMjApOwogCWVsc2UgaWYgKGl3bF90dF9pc19sb3dfcG93ZXJfc3RhdGUocHJpdikpIHsKIAkJLyogaW4gdGhlcm1hbCB0aHJvdHRsaW5nIGxvdyBwb3dlciBzdGF0ZSAqLwpAQCAtMzY3LDkgKzM2MSwxNSBAQAogCQlpd2xfc3RhdGljX3NsZWVwX2NtZChwcml2LCBjbWQsCiAJCQkJICAgICBwcml2LT5wb3dlcl9kYXRhLmRlYnVnX3NsZWVwX2xldmVsX292ZXJyaWRlLAogCQkJCSAgICAgZHRpbXBlcik7Ci0JZWxzZSBpZiAobm9fc2xlZXBfYXV0b2FkanVzdCkKLQkJaXdsX3N0YXRpY19zbGVlcF9jbWQocHJpdiwgY21kLCBJV0xfUE9XRVJfSU5ERVhfMSwgZHRpbXBlcik7Ci0JZWxzZQorCWVsc2UgaWYgKGl3bGFnbl9tb2RfcGFyYW1zLm5vX3NsZWVwX2F1dG9hZGp1c3QpIHsKKwkJaWYgKGl3bGFnbl9tb2RfcGFyYW1zLnBvd2VyX2xldmVsID4gSVdMX1BPV0VSX0lOREVYXzEgJiYKKwkJICAgIGl3bGFnbl9tb2RfcGFyYW1zLnBvd2VyX2xldmVsIDw9IElXTF9QT1dFUl9JTkRFWF81KQorCQkJaXdsX3N0YXRpY19zbGVlcF9jbWQocHJpdiwgY21kLAorCQkJCWl3bGFnbl9tb2RfcGFyYW1zLnBvd2VyX2xldmVsLCBkdGltcGVyKTsKKwkJZWxzZQorCQkJaXdsX3N0YXRpY19zbGVlcF9jbWQocHJpdiwgY21kLAorCQkJCUlXTF9QT1dFUl9JTkRFWF8xLCBkdGltcGVyKTsKKwl9IGVsc2UKIAkJaXdsX3Bvd2VyX2ZpbGxfc2xlZXBfY21kKHByaXYsIGNtZCwKIAkJCQkJIHByaXYtPmh3LT5jb25mLmR5bmFtaWNfcHNfdGltZW91dCwKIAkJCQkJIHByaXYtPmh3LT5jb25mLm1heF9zbGVlcF9wZXJpb2QpOwpAQCAtNDA4LDkgKzQwOCw5IEBACiAJCWlmICghKGNtZC0+ZmxhZ3MgJiBJV0xfUE9XRVJfRFJJVkVSX0FMTE9XX1NMRUVQX01TSykpCiAJCQljbGVhcl9iaXQoU1RBVFVTX1BPV0VSX1BNSSwgJnByaXYtPnN0YXR1cyk7CiAKLQkJaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncyAmJiB1cGRhdGVfY2hhaW5zKQotCQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKHByaXYpOwotCQllbHNlIGlmIChwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MpCisJCWlmICh1cGRhdGVfY2hhaW5zKQorCQkJaXdsX3VwZGF0ZV9jaGFpbl9mbGFncyhwcml2KTsKKwkJZWxzZQogCQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsCiAJCQkJCSJDYW5ub3QgdXBkYXRlIHRoZSBwb3dlciwgY2hhaW4gbm9pc2UgIgogCQkJCQkiY2FsaWJyYXRpb24gcnVubmluZzogJWRcbiIsCkBAIC00MzQsOSArNDM0LDcgQEAKIC8qIGluaXRpYWxpemUgdG8gZGVmYXVsdCAqLwogdm9pZCBpd2xfcG93ZXJfaW5pdGlhbGl6ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JdTE2IGxjdGwgPSBpd2xfcGNpZV9saW5rX2N0bChwcml2KTsKLQotCXByaXYtPnBvd2VyX2RhdGEucGNpX3BtID0gIShsY3RsICYgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wwU19FTik7CisJcHJpdi0+cG93ZXJfZGF0YS5idXNfcG0gPSBidXNfZ2V0X3BtX3N1cHBvcnQocHJpdi0+YnVzKTsKIAogCXByaXYtPnBvd2VyX2RhdGEuZGVidWdfc2xlZXBfbGV2ZWxfb3ZlcnJpZGUgPSAtMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBvd2VyLmgKaW5kZXggNTk2MzVkNy4uNWY3YjcyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wb3dlci5oCkBAIC00Myw3ICs0Myw3IEBACiAJc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCBzbGVlcF9jbWQ7CiAJc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCBzbGVlcF9jbWRfbmV4dDsKIAlpbnQgZGVidWdfc2xlZXBfbGV2ZWxfb3ZlcnJpZGU7Ci0JYm9vbCBwY2lfcG07CisJYm9vbCBidXNfcG07CiB9OwogCiBpbnQgaXdsX3Bvd2VyX3NldF9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCAqY21kLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcHJwaC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcHJwaC5oCmluZGV4IGYwMGQxODguLjJmMjY3YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBycGguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wcnBoLmgKQEAgLTE2OCw2ICsxNjgsNyBAQAogICogdGhlIHNjaGVkdWxlciAoZXNwZWNpYWxseSBmb3IgcXVldWUgIzQvIzksIHRoZSBjb21tYW5kIHF1ZXVlLCBvdGhlcndpc2UKICAqIHRoZSBkcml2ZXIgY2FuJ3QgaXNzdWUgY29tbWFuZHMhKToKICAqLworI2RlZmluZSBTQ0RfTUVNX0xPV0VSX0JPVU5ECQkoMHgwMDAwKQogCiAvKioKICAqIE1heCBUeCB3aW5kb3cgc2l6ZSBpcyB0aGUgbWF4IG51bWJlciBvZiBjb250aWd1b3VzIFRGRHMgdGhhdCB0aGUgc2NoZWR1bGVyCkBAIC0xNzcsNTMgKzE3OCw2MSBAQAogI2RlZmluZSBTQ0RfV0lOX1NJWkUJCQkJNjQKICNkZWZpbmUgU0NEX0ZSQU1FX0xJTUlUCQkJCTY0CiAKLSNkZWZpbmUgSVdMX1NDRF9UWEZJRk9fUE9TX1RJRAkJCSgwKQotI2RlZmluZSBJV0xfU0NEX1RYRklGT19QT1NfUkEJCQkoNCkKLSNkZWZpbmUgSVdMX1NDRF9RVUVVRV9SQV9USURfTUFQX1JBVElEX01TSwkoMHgwMUZGKQorI2RlZmluZSBTQ0RfVFhGSUZPX1BPU19USUQJCQkoMCkKKyNkZWZpbmUgU0NEX1RYRklGT19QT1NfUkEJCQkoNCkKKyNkZWZpbmUgU0NEX1FVRVVFX1JBX1RJRF9NQVBfUkFUSURfTVNLCSgweDAxRkYpCiAKIC8qIGFnbiBTQ0QgKi8KLSNkZWZpbmUgSVdMQUdOX1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfVFhGCSgwKQotI2RlZmluZSBJV0xBR05fU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19BQ1RJVkUJKDMpCi0jZGVmaW5lIElXTEFHTl9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1dTTAkoNCkKLSNkZWZpbmUgSVdMQUdOX1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfU0NEX0FDVF9FTiAoMTkpCi0jZGVmaW5lIElXTEFHTl9TQ0RfUVVFVUVfU1RUU19SRUdfTVNLCQkoMHgwMEZGMDAwMCkKKyNkZWZpbmUgU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19UWEYJKDApCisjZGVmaW5lIFNDRF9RVUVVRV9TVFRTX1JFR19QT1NfQUNUSVZFCSgzKQorI2RlZmluZSBTQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1dTTAkoNCkKKyNkZWZpbmUgU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19TQ0RfQUNUX0VOICgxOSkKKyNkZWZpbmUgU0NEX1FVRVVFX1NUVFNfUkVHX01TSwkJKDB4MDBGRjAwMDApCiAKLSNkZWZpbmUgSVdMQUdOX1NDRF9RVUVVRV9DVFhfUkVHMV9DUkVESVRfUE9TCQkoOCkKLSNkZWZpbmUgSVdMQUdOX1NDRF9RVUVVRV9DVFhfUkVHMV9DUkVESVRfTVNLCQkoMHgwMEZGRkYwMCkKLSNkZWZpbmUgSVdMQUdOX1NDRF9RVUVVRV9DVFhfUkVHMV9TVVBFUl9DUkVESVRfUE9TCSgyNCkKLSNkZWZpbmUgSVdMQUdOX1NDRF9RVUVVRV9DVFhfUkVHMV9TVVBFUl9DUkVESVRfTVNLCSgweEZGMDAwMDAwKQotI2RlZmluZSBJV0xBR05fU0NEX1FVRVVFX0NUWF9SRUcyX1dJTl9TSVpFX1BPUwkJKDApCi0jZGVmaW5lIElXTEFHTl9TQ0RfUVVFVUVfQ1RYX1JFRzJfV0lOX1NJWkVfTVNLCQkoMHgwMDAwMDA3RikKLSNkZWZpbmUgSVdMQUdOX1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MJKDE2KQotI2RlZmluZSBJV0xBR05fU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX01TSwkoMHgwMDdGMDAwMCkKKyNkZWZpbmUgU0NEX1FVRVVFX0NUWF9SRUcxX0NSRURJVF9QT1MJCSg4KQorI2RlZmluZSBTQ0RfUVVFVUVfQ1RYX1JFRzFfQ1JFRElUX01TSwkJKDB4MDBGRkZGMDApCisjZGVmaW5lIFNDRF9RVUVVRV9DVFhfUkVHMV9TVVBFUl9DUkVESVRfUE9TCSgyNCkKKyNkZWZpbmUgU0NEX1FVRVVFX0NUWF9SRUcxX1NVUEVSX0NSRURJVF9NU0sJKDB4RkYwMDAwMDApCisjZGVmaW5lIFNDRF9RVUVVRV9DVFhfUkVHMl9XSU5fU0laRV9QT1MJCSgwKQorI2RlZmluZSBTQ0RfUVVFVUVfQ1RYX1JFRzJfV0lOX1NJWkVfTVNLCQkoMHgwMDAwMDA3RikKKyNkZWZpbmUgU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX1BPUwkoMTYpCisjZGVmaW5lIFNDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9NU0sJKDB4MDA3RjAwMDApCiAKLSNkZWZpbmUgSVdMQUdOX1NDRF9DT05URVhUX0RBVEFfT0ZGU0VUCQkoMHg2MDApCi0jZGVmaW5lIElXTEFHTl9TQ0RfVFhfU1RUU19CSVRNQVBfT0ZGU0VUCQkoMHg3QjEpCi0jZGVmaW5lIElXTEFHTl9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVQJCSgweDdFMCkKKy8qIENvbnRleHQgRGF0YSAqLworI2RlZmluZSBTQ0RfQ09OVEVYVF9NRU1fTE9XRVJfQk9VTkQJKFNDRF9NRU1fTE9XRVJfQk9VTkQgKyAweDYwMCkKKyNkZWZpbmUgU0NEX0NPTlRFWFRfTUVNX1VQUEVSX0JPVU5ECShTQ0RfTUVNX0xPV0VSX0JPVU5EICsgMHg2QTApCiAKLSNkZWZpbmUgSVdMQUdOX1NDRF9DT05URVhUX1FVRVVFX09GRlNFVCh4KVwKLQkoSVdMQUdOX1NDRF9DT05URVhUX0RBVEFfT0ZGU0VUICsgKCh4KSAqIDgpKQorLyogVHggc3RhdHVzICovCisjZGVmaW5lIFNDRF9UWF9TVFRTX01FTV9MT1dFUl9CT1VORAkoU0NEX01FTV9MT1dFUl9CT1VORCArIDB4NkEwKQorI2RlZmluZSBTQ0RfVFhfU1RUU19NRU1fVVBQRVJfQk9VTkQJKFNDRF9NRU1fTE9XRVJfQk9VTkQgKyAweDdFMCkKIAotI2RlZmluZSBJV0xBR05fU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUX1FVRVVFKHgpIFwKLQkoKElXTEFHTl9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVQgKyAoKHgpICogMikpICYgMHhmZmZjKQorLyogVHJhbnNsYXRpb24gRGF0YSAqLworI2RlZmluZSBTQ0RfVFJBTlNfVEJMX01FTV9MT1dFUl9CT1VORAkoU0NEX01FTV9MT1dFUl9CT1VORCArIDB4N0UwKQorI2RlZmluZSBTQ0RfVFJBTlNfVEJMX01FTV9VUFBFUl9CT1VORAkoU0NEX01FTV9MT1dFUl9CT1VORCArIDB4ODA4KQogCi0jZGVmaW5lIElXTEFHTl9TQ0RfUVVFVUVDSEFJTl9TRUxfQUxMKHByaXYpCVwKKyNkZWZpbmUgU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKHgpXAorCShTQ0RfQ09OVEVYVF9NRU1fTE9XRVJfQk9VTkQgKyAoKHgpICogOCkpCisKKyNkZWZpbmUgU0NEX1RSQU5TX1RCTF9PRkZTRVRfUVVFVUUoeCkgXAorCSgoU0NEX1RSQU5TX1RCTF9NRU1fTE9XRVJfQk9VTkQgKyAoKHgpICogMikpICYgMHhmZmZjKQorCisjZGVmaW5lIFNDRF9RVUVVRUNIQUlOX1NFTF9BTEwocHJpdikJXAogCSgoKDE8PChwcml2KS0+aHdfcGFyYW1zLm1heF90eHFfbnVtKSAtIDEpICZcCiAJKH4oMTw8KHByaXYpLT5jbWRfcXVldWUpKSkKIAotI2RlZmluZSBJV0xBR05fU0NEX0JBU0UJCQkoUFJQSF9CQVNFICsgMHhhMDJjMDApCisjZGVmaW5lIFNDRF9CQVNFCQkJKFBSUEhfQkFTRSArIDB4YTAyYzAwKQogCi0jZGVmaW5lIElXTEFHTl9TQ0RfU1JBTV9CQVNFX0FERFIJKElXTEFHTl9TQ0RfQkFTRSArIDB4MCkKLSNkZWZpbmUgSVdMQUdOX1NDRF9EUkFNX0JBU0VfQUREUgkoSVdMQUdOX1NDRF9CQVNFICsgMHg4KQotI2RlZmluZSBJV0xBR05fU0NEX0FJVAkJCShJV0xBR05fU0NEX0JBU0UgKyAweDBjKQotI2RlZmluZSBJV0xBR05fU0NEX1RYRkFDVAkJKElXTEFHTl9TQ0RfQkFTRSArIDB4MTApCi0jZGVmaW5lIElXTEFHTl9TQ0RfQUNUSVZFCQkoSVdMQUdOX1NDRF9CQVNFICsgMHgxNCkKLSNkZWZpbmUgSVdMQUdOX1NDRF9RVUVVRV9XUlBUUih4KQkoSVdMQUdOX1NDRF9CQVNFICsgMHgxOCArICh4KSAqIDQpCi0jZGVmaW5lIElXTEFHTl9TQ0RfUVVFVUVfUkRQVFIoeCkJKElXTEFHTl9TQ0RfQkFTRSArIDB4NjggKyAoeCkgKiA0KQotI2RlZmluZSBJV0xBR05fU0NEX1FVRVVFQ0hBSU5fU0VMCShJV0xBR05fU0NEX0JBU0UgKyAweGU4KQotI2RlZmluZSBJV0xBR05fU0NEX0FHR1JfU0VMCQkoSVdMQUdOX1NDRF9CQVNFICsgMHgyNDgpCi0jZGVmaW5lIElXTEFHTl9TQ0RfSU5URVJSVVBUX01BU0sJKElXTEFHTl9TQ0RfQkFTRSArIDB4MTA4KQotI2RlZmluZSBJV0xBR05fU0NEX1FVRVVFX1NUQVRVU19CSVRTKHgpCShJV0xBR05fU0NEX0JBU0UgKyAweDEwYyArICh4KSAqIDQpCisjZGVmaW5lIFNDRF9TUkFNX0JBU0VfQUREUgkoU0NEX0JBU0UgKyAweDApCisjZGVmaW5lIFNDRF9EUkFNX0JBU0VfQUREUgkoU0NEX0JBU0UgKyAweDgpCisjZGVmaW5lIFNDRF9BSVQJCQkoU0NEX0JBU0UgKyAweDBjKQorI2RlZmluZSBTQ0RfVFhGQUNUCQkoU0NEX0JBU0UgKyAweDEwKQorI2RlZmluZSBTQ0RfQUNUSVZFCQkoU0NEX0JBU0UgKyAweDE0KQorI2RlZmluZSBTQ0RfUVVFVUVfV1JQVFIoeCkJKFNDRF9CQVNFICsgMHgxOCArICh4KSAqIDQpCisjZGVmaW5lIFNDRF9RVUVVRV9SRFBUUih4KQkoU0NEX0JBU0UgKyAweDY4ICsgKHgpICogNCkKKyNkZWZpbmUgU0NEX1FVRVVFQ0hBSU5fU0VMCShTQ0RfQkFTRSArIDB4ZTgpCisjZGVmaW5lIFNDRF9BR0dSX1NFTAkJKFNDRF9CQVNFICsgMHgyNDgpCisjZGVmaW5lIFNDRF9JTlRFUlJVUFRfTUFTSwkoU0NEX0JBU0UgKyAweDEwOCkKKyNkZWZpbmUgU0NEX1FVRVVFX1NUQVRVU19CSVRTKHgpCShTQ0RfQkFTRSArIDB4MTBjICsgKHgpICogNCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqIEVORCBUWCBTQ0hFRFVMRVIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXJ4LmMKaW5kZXggMDA1M2U5ZS4uOGUzMTQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1yeC5jCkBAIC00MSwxODMgKzQxLDYgQEAKICNpbmNsdWRlICJpd2wtYWduLWNhbGliLmgiCiAjaW5jbHVkZSAiaXdsLWFnbi5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogUlggcGF0aCBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogUnggdGhlb3J5IG9mIG9wZXJhdGlvbgotICoKLSAqIERyaXZlciBhbGxvY2F0ZXMgYSBjaXJjdWxhciBidWZmZXIgb2YgUmVjZWl2ZSBCdWZmZXIgRGVzY3JpcHRvcnMgKFJCRHMpLAotICogZWFjaCBvZiB3aGljaCBwb2ludCB0byBSZWNlaXZlIEJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJ5IHRoZSBOSUMuICBUaGVzZSBnZXQKLSAqIHVzZWQgbm90IG9ubHkgZm9yIFJ4IGZyYW1lcywgYnV0IGZvciBhbnkgY29tbWFuZCByZXNwb25zZSBvciBub3RpZmljYXRpb24KLSAqIGZyb20gdGhlIE5JQy4gIFRoZSBkcml2ZXIgYW5kIE5JQyBtYW5hZ2UgdGhlIFJ4IGJ1ZmZlcnMgYnkgbWVhbnMKLSAqIG9mIGluZGV4ZXMgaW50byB0aGUgY2lyY3VsYXIgYnVmZmVyLgotICoKLSAqIFJ4IFF1ZXVlIEluZGV4ZXMKLSAqIFRoZSBob3N0L2Zpcm13YXJlIHNoYXJlIHR3byBpbmRleCByZWdpc3RlcnMgZm9yIG1hbmFnaW5nIHRoZSBSeCBidWZmZXJzLgotICoKLSAqIFRoZSBSRUFEIGluZGV4IG1hcHMgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIHRoYXQgdGhlIGZpcm13YXJlIG1heSBiZSB3cml0aW5nCi0gKiB0byAtLSB0aGUgZHJpdmVyIGNhbiByZWFkIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgdGhpcyBwb3NpdGlvbiBhbmQgZ2V0Ci0gKiBnb29kIGRhdGEuCi0gKiBUaGUgUkVBRCBpbmRleCBpcyBtYW5hZ2VkIGJ5IHRoZSBmaXJtd2FyZSBvbmNlIHRoZSBjYXJkIGlzIGVuYWJsZWQuCi0gKgotICogVGhlIFdSSVRFIGluZGV4IG1hcHMgdG8gdGhlIGxhc3QgcG9zaXRpb24gdGhlIGRyaXZlciBoYXMgcmVhZCBmcm9tIC0tIHRoZQotICogcG9zaXRpb24gcHJlY2VkaW5nIFdSSVRFIGlzIHRoZSBsYXN0IHNsb3QgdGhlIGZpcm13YXJlIGNhbiBwbGFjZSBhIHBhY2tldC4KLSAqCi0gKiBUaGUgcXVldWUgaXMgZW1wdHkgKG5vIGdvb2QgZGF0YSkgaWYgV1JJVEUgPSBSRUFEIC0gMSwgYW5kIGlzIGZ1bGwgaWYKLSAqIFdSSVRFID0gUkVBRC4KLSAqCi0gKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIHRoZSBob3N0IHNldHMgdXAgdGhlIFJFQUQgcXVldWUgcG9zaXRpb24gdG8gdGhlIGZpcnN0Ci0gKiBJTkRFWCBwb3NpdGlvbiwgYW5kIFdSSVRFIHRvIHRoZSBsYXN0IChSRUFEIC0gMSB3cmFwcGVkKQotICoKLSAqIFdoZW4gdGhlIGZpcm13YXJlIHBsYWNlcyBhIHBhY2tldCBpbiBhIGJ1ZmZlciwgaXQgd2lsbCBhZHZhbmNlIHRoZSBSRUFEIGluZGV4Ci0gKiBhbmQgZmlyZSB0aGUgUlggaW50ZXJydXB0LiAgVGhlIGRyaXZlciBjYW4gdGhlbiBxdWVyeSB0aGUgUkVBRCBpbmRleCBhbmQKLSAqIHByb2Nlc3MgYXMgbWFueSBwYWNrZXRzIGFzIHBvc3NpYmxlLCBtb3ZpbmcgdGhlIFdSSVRFIGluZGV4IGZvcndhcmQgYXMgaXQKLSAqIHJlc2V0cyB0aGUgUnggcXVldWUgYnVmZmVycyB3aXRoIG5ldyBtZW1vcnkuCi0gKgotICogVGhlIG1hbmFnZW1lbnQgaW4gdGhlIGRyaXZlciBpcyBhcyBmb2xsb3dzOgotICogKyBBIGxpc3Qgb2YgcHJlLWFsbG9jYXRlZCBTS0JzIGlzIHN0b3JlZCBpbiBpd2wtPnJ4cS0+cnhfZnJlZS4gIFdoZW4KLSAqICAgaXdsLT5yeHEtPmZyZWVfY291bnQgZHJvcHMgdG8gb3IgYmVsb3cgUlhfTE9XX1dBVEVSTUFSSywgd29yayBpcyBzY2hlZHVsZWQKLSAqICAgdG8gcmVwbGVuaXNoIHRoZSBpd2wtPnJ4cS0+cnhfZnJlZS4KLSAqICsgSW4gaXdsX3J4X3JlcGxlbmlzaCAoc2NoZWR1bGVkKSBpZiAncHJvY2Vzc2VkJyAhPSAncmVhZCcgdGhlbiB0aGUKLSAqICAgaXdsLT5yeHEgaXMgcmVwbGVuaXNoZWQgYW5kIHRoZSBSRUFEIElOREVYIGlzIHVwZGF0ZWQgKHVwZGF0aW5nIHRoZQotICogICAncHJvY2Vzc2VkJyBhbmQgJ3JlYWQnIGRyaXZlciBpbmRleGVzIGFzIHdlbGwpCi0gKiArIEEgcmVjZWl2ZWQgcGFja2V0IGlzIHByb2Nlc3NlZCBhbmQgaGFuZGVkIHRvIHRoZSBrZXJuZWwgbmV0d29yayBzdGFjaywKLSAqICAgZGV0YWNoZWQgZnJvbSB0aGUgaXdsLT5yeHEuICBUaGUgZHJpdmVyICdwcm9jZXNzZWQnIGluZGV4IGlzIHVwZGF0ZWQuCi0gKiArIFRoZSBIb3N0L0Zpcm13YXJlIGl3bC0+cnhxIGlzIHJlcGxlbmlzaGVkIGF0IHRhc2tsZXQgdGltZSBmcm9tIHRoZSByeF9mcmVlCi0gKiAgIGxpc3QuIElmIHRoZXJlIGFyZSBubyBhbGxvY2F0ZWQgYnVmZmVycyBpbiBpd2wtPnJ4cS0+cnhfZnJlZSwgdGhlIFJFQUQKLSAqICAgSU5ERVggaXMgbm90IGluY3JlbWVudGVkIGFuZCBpd2wtPnN0YXR1cyhSWF9TVEFMTEVEKSBpcyBzZXQuICBJZiB0aGVyZQotICogICB3ZXJlIGVub3VnaCBmcmVlIGJ1ZmZlcnMgYW5kIFJYX1NUQUxMRUQgaXMgc2V0IGl0IGlzIGNsZWFyZWQuCi0gKgotICoKLSAqIERyaXZlciBzZXF1ZW5jZToKLSAqCi0gKiBpd2xfcnhfcXVldWVfYWxsb2MoKSAgIEFsbG9jYXRlcyByeF9mcmVlCi0gKiBpd2xfcnhfcmVwbGVuaXNoKCkgICAgIFJlcGxlbmlzaGVzIHJ4X2ZyZWUgbGlzdCBmcm9tIHJ4X3VzZWQsIGFuZCBjYWxscwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXdsX3J4X3F1ZXVlX3Jlc3RvY2sKLSAqIGl3bF9yeF9xdWV1ZV9yZXN0b2NrKCkgTW92ZXMgYXZhaWxhYmxlIGJ1ZmZlcnMgZnJvbSByeF9mcmVlIGludG8gUngKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLCB1cGRhdGVzIGZpcm13YXJlIHBvaW50ZXJzLCBhbmQgdXBkYXRlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFdSSVRFIGluZGV4LiAgSWYgaW5zdWZmaWNpZW50IHJ4X2ZyZWUgYnVmZmVycwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGF2YWlsYWJsZSwgc2NoZWR1bGVzIGl3bF9yeF9yZXBsZW5pc2gKLSAqCi0gKiAtLSBlbmFibGUgaW50ZXJydXB0cyAtLQotICogSVNSIC0gaXdsX3J4KCkgICAgICAgICBEZXRhY2ggaXdsX3J4X21lbV9idWZmZXJzIGZyb20gcG9vbCB1cCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUQgSU5ERVgsIGRldGFjaGluZyB0aGUgU0tCIGZyb20gdGhlIHBvb2wuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZlcyB0aGUgcGFja2V0IGJ1ZmZlciBmcm9tIHF1ZXVlIHRvIHJ4X3VzZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxscyBpd2xfcnhfcXVldWVfcmVzdG9jayB0byByZWZpbGwgYW55IGVtcHR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90cy4KLSAqIC4uLgotICoKLSAqLwotCi0vKioKLSAqIGl3bF9yeF9xdWV1ZV9zcGFjZSAtIFJldHVybiBudW1iZXIgb2YgZnJlZSBzbG90cyBhdmFpbGFibGUgaW4gcXVldWUuCi0gKi8KLWludCBpd2xfcnhfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcSkKLXsKLQlpbnQgcyA9IHEtPnJlYWQgLSBxLT53cml0ZTsKLQlpZiAocyA8PSAwKQotCQlzICs9IFJYX1FVRVVFX1NJWkU7Ci0JLyoga2VlcCBzb21lIGJ1ZmZlciB0byBub3QgY29uZnVzZSBmdWxsIGFuZCBlbXB0eSBxdWV1ZSAqLwotCXMgLT0gMjsKLQlpZiAocyA8IDApCi0JCXMgPSAwOwotCXJldHVybiBzOwotfQotCi0vKioKLSAqIGl3bF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyIC0gVXBkYXRlIHRoZSB3cml0ZSBwb2ludGVyIGZvciB0aGUgUlggcXVldWUKLSAqLwotdm9pZCBpd2xfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgcnhfd3J0X3B0cl9yZWcgPSBwcml2LT5od19wYXJhbXMucnhfd3J0X3B0cl9yZWc7Ci0JdTMyIHJlZzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAocS0+bmVlZF91cGRhdGUgPT0gMCkKLQkJZ290byBleGl0X3VubG9jazsKLQotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5zaGFkb3dfcmVnX2VuYWJsZSkgewotCQkvKiBzaGFkb3cgcmVnaXN0ZXIgZW5hYmxlZCAqLwotCQkvKiBEZXZpY2UgZXhwZWN0cyBhIG11bHRpcGxlIG9mIDggKi8KLQkJcS0+d3JpdGVfYWN0dWFsID0gKHEtPndyaXRlICYgfjB4Nyk7Ci0JCWl3bF93cml0ZTMyKHByaXYsIHJ4X3dydF9wdHJfcmVnLCBxLT53cml0ZV9hY3R1YWwpOwotCX0gZWxzZSB7Ci0JCS8qIElmIHBvd2VyLXNhdmluZyBpcyBpbiB1c2UsIG1ha2Ugc3VyZSBkZXZpY2UgaXMgYXdha2UgKi8KLQkJaWYgKHRlc3RfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpKSB7Ci0JCQlyZWcgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxKTsKLQotCQkJaWYgKHJlZyAmIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVApIHsKLQkJCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCQkiUnggcXVldWUgcmVxdWVzdGluZyB3YWtldXAsIgotCQkJCQkiIEdQMSA9IDB4JXhcbiIsIHJlZyk7Ci0JCQkJaXdsX3NldF9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLAotCQkJCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOwotCQkJCWdvdG8gZXhpdF91bmxvY2s7Ci0JCQl9Ci0KLQkJCXEtPndyaXRlX2FjdHVhbCA9IChxLT53cml0ZSAmIH4weDcpOwotCQkJaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIHJ4X3dydF9wdHJfcmVnLAotCQkJCQlxLT53cml0ZV9hY3R1YWwpOwotCi0JCS8qIEVsc2UgZGV2aWNlIGlzIGFzc3VtZWQgdG8gYmUgYXdha2UgKi8KLQkJfSBlbHNlIHsKLQkJCS8qIERldmljZSBleHBlY3RzIGEgbXVsdGlwbGUgb2YgOCAqLwotCQkJcS0+d3JpdGVfYWN0dWFsID0gKHEtPndyaXRlICYgfjB4Nyk7Ci0JCQlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgcnhfd3J0X3B0cl9yZWcsCi0JCQkJcS0+d3JpdGVfYWN0dWFsKTsKLQkJfQotCX0KLQlxLT5uZWVkX3VwZGF0ZSA9IDA7Ci0KLSBleGl0X3VubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7Ci19Ci0KLWludCBpd2xfcnhfcXVldWVfYWxsb2Moc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnBjaV9kZXYtPmRldjsKLQlpbnQgaTsKLQotCXNwaW5fbG9ja19pbml0KCZyeHEtPmxvY2spOwotCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X2ZyZWUpOwotCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X3VzZWQpOwotCi0JLyogQWxsb2MgdGhlIGNpcmN1bGFyIGJ1ZmZlciBvZiBSZWFkIEJ1ZmZlciBEZXNjcmlwdG9ycyAoUkJEcykgKi8KLQlyeHEtPmJkID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgNCAqIFJYX1FVRVVFX1NJWkUsICZyeHEtPmJkX2RtYSwKLQkJCQkgICAgIEdGUF9LRVJORUwpOwotCWlmICghcnhxLT5iZCkKLQkJZ290byBlcnJfYmQ7Ci0KLQlyeHEtPnJiX3N0dHMgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplb2Yoc3RydWN0IGl3bF9yYl9zdGF0dXMpLAotCQkJCQkgICZyeHEtPnJiX3N0dHNfZG1hLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJ4cS0+cmJfc3R0cykKLQkJZ290byBlcnJfcmI7Ci0KLQkvKiBGaWxsIHRoZSByeF91c2VkIHF1ZXVlIHdpdGggX2FsbF8gb2YgdGhlIFJ4IGJ1ZmZlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgUlhfRlJFRV9CVUZGRVJTICsgUlhfUVVFVUVfU0laRTsgaSsrKQotCQlsaXN0X2FkZF90YWlsKCZyeHEtPnBvb2xbaV0ubGlzdCwgJnJ4cS0+cnhfdXNlZCk7Ci0KLQkvKiBTZXQgdXMgc28gdGhhdCB3ZSBoYXZlIHByb2Nlc3NlZCBhbmQgdXNlZCBhbGwgYnVmZmVycywgYnV0IGhhdmUKLQkgKiBub3QgcmVzdG9ja2VkIHRoZSBSeCBxdWV1ZSB3aXRoIGZyZXNoIGJ1ZmZlcnMgKi8KLQlyeHEtPnJlYWQgPSByeHEtPndyaXRlID0gMDsKLQlyeHEtPndyaXRlX2FjdHVhbCA9IDA7Ci0JcnhxLT5mcmVlX2NvdW50ID0gMDsKLQlyeHEtPm5lZWRfdXBkYXRlID0gMDsKLQlyZXR1cm4gMDsKLQotZXJyX3JiOgotCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsIDQgKiBSWF9RVUVVRV9TSVpFLCByeHEtPmJkLAotCQkJICByeHEtPmJkX2RtYSk7Ci1lcnJfYmQ6Ci0JcmV0dXJuIC1FTk9NRU07Ci19CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNTAsMTkgKzczLDE5IEBACiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKIAlzdHJ1Y3QgaXdsX3J4b25fY21kICpyeG9uID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7CiAKLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKSB7Ci0JCWlmICghbGUzMl90b19jcHUoY3NhLT5zdGF0dXMpICYmCi0JCSAgICAoY3NhLT5jaGFubmVsID09IHByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwpKSB7Ci0JCQlyeG9uLT5jaGFubmVsID0gY3NhLT5jaGFubmVsOwotCQkJY3R4LT5zdGFnaW5nLmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7Ci0JCQlJV0xfREVCVUdfMTFIKHByaXYsICJDU0Egbm90aWY6IGNoYW5uZWwgJWRcbiIsCisJaWYgKCF0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlmICghbGUzMl90b19jcHUoY3NhLT5zdGF0dXMpICYmIGNzYS0+Y2hhbm5lbCA9PSBwcml2LT5zd2l0Y2hfY2hhbm5lbCkgeworCQlyeG9uLT5jaGFubmVsID0gY3NhLT5jaGFubmVsOworCQljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKKwkJSVdMX0RFQlVHXzExSChwcml2LCAiQ1NBIG5vdGlmOiBjaGFubmVsICVkXG4iLAogCQkJICAgICAgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCQlpd2xfY2hzd2l0Y2hfZG9uZShwcml2LCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCUlXTF9FUlIocHJpdiwgIkNTQSBub3RpZiAoZmFpbCkgOiBjaGFubmVsICVkXG4iLAotCQkJICAgICAgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCQlpd2xfY2hzd2l0Y2hfZG9uZShwcml2LCBmYWxzZSk7Ci0JCX0KKwkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJSVdMX0VSUihwcml2LCAiQ1NBIG5vdGlmIChmYWlsKSA6IGNoYW5uZWwgJWRcbiIsCisJCQlsZTE2X3RvX2NwdShjc2EtPmNoYW5uZWwpKTsKKwkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwogCX0KIH0KIApAQCAtMzQ3LDcgKzE3MCw3IEBACiAJaW50IGFjdHVhbF9kZWx0YSwgZXhwZWN0ZWRfZGVsdGEsIGJhX3RpbWVvdXRfZGVsdGE7CiAJc3RydWN0IHN0YXRpc3RpY3NfdHggKm9sZDsKIAotCWlmIChwcml2LT5fYWduLmFnZ190aWRzX2NvdW50KQorCWlmIChwcml2LT5hZ2dfdGlkc19jb3VudCkKIAkJcmV0dXJuIHRydWU7CiAKIAlvbGQgPSAmcHJpdi0+c3RhdGlzdGljcy50eDsKQEAgLTY2NSw4ICs0ODgsOCBAQAogCQlpd2xfcnhfY2FsY19ub2lzZShwcml2KTsKIAkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5ydW5fdGltZV9jYWxpYl93b3JrKTsKIAl9Ci0JaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnRlbXBfb3BzLnRlbXBlcmF0dXJlICYmIGNoYW5nZSkKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dGVtcF9vcHMudGVtcGVyYXR1cmUocHJpdik7CisJaWYgKHByaXYtPmNmZy0+bGliLT50ZW1wZXJhdHVyZSAmJiBjaGFuZ2UpCisJCXByaXYtPmNmZy0+bGliLT50ZW1wZXJhdHVyZShwcml2KTsKIH0KIAogc3RhdGljIHZvaWQgaXdsX3J4X3JlcGx5X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LApAQCAtNzY5LDggKzU5Miw4IEBACiB7CiAJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CiAKLQlwcml2LT5fYWduLmxhc3RfcGh5X3Jlc192YWxpZCA9IHRydWU7Ci0JbWVtY3B5KCZwcml2LT5fYWduLmxhc3RfcGh5X3JlcywgcGt0LT51LnJhdywKKwlwcml2LT5sYXN0X3BoeV9yZXNfdmFsaWQgPSB0cnVlOworCW1lbWNweSgmcHJpdi0+bGFzdF9waHlfcmVzLCBwa3QtPnUucmF3LAogCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9yeF9waHlfcmVzKSk7CiB9CiAKQEAgLTk0Myw2ICs3NjYsNDcgQEAKIAlyZXR1cm4gZGVjcnlwdF9vdXQ7CiB9CiAKKy8qIENhbGMgbWF4IHNpZ25hbCBsZXZlbCAoZEJtKSBhbW9uZyAzIHBvc3NpYmxlIHJlY2VpdmVycyAqLworc3RhdGljIGludCBpd2xhZ25fY2FsY19yc3NpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCSAgICAgc3RydWN0IGl3bF9yeF9waHlfcmVzICpyeF9yZXNwKQoreworCS8qIGRhdGEgZnJvbSBQSFkvRFNQIHJlZ2FyZGluZyBzaWduYWwgc3RyZW5ndGgsIGV0Yy4sCisJICogICBjb250ZW50cyBhcmUgYWx3YXlzIHRoZXJlLCBub3QgY29uZmlndXJhYmxlIGJ5IGhvc3QKKwkgKi8KKwlzdHJ1Y3QgaXdsYWduX25vbl9jZmdfcGh5ICpuY3BoeSA9CisJCShzdHJ1Y3QgaXdsYWduX25vbl9jZmdfcGh5ICopcnhfcmVzcC0+bm9uX2NmZ19waHlfYnVmOworCXUzMiB2YWwsIHJzc2lfYSwgcnNzaV9iLCByc3NpX2MsIG1heF9yc3NpOworCXU4IGFnYzsKKworCXZhbCAgPSBsZTMyX3RvX2NwdShuY3BoeS0+bm9uX2NmZ19waHlbSVdMQUdOX1JYX1JFU19BR0NfSURYXSk7CisJYWdjID0gKHZhbCAmIElXTEFHTl9PRkRNX0FHQ19NU0spID4+IElXTEFHTl9PRkRNX0FHQ19CSVRfUE9TOworCisJLyogRmluZCBtYXggcnNzaSBhbW9uZyAzIHBvc3NpYmxlIHJlY2VpdmVycy4KKwkgKiBUaGVzZSB2YWx1ZXMgYXJlIG1lYXN1cmVkIGJ5IHRoZSBkaWdpdGFsIHNpZ25hbCBwcm9jZXNzb3IgKERTUCkuCisJICogVGhleSBzaG91bGQgc3RheSBmYWlybHkgY29uc3RhbnQgZXZlbiBhcyB0aGUgc2lnbmFsIHN0cmVuZ3RoIHZhcmllcywKKwkgKiAgIGlmIHRoZSByYWRpbydzIGF1dG9tYXRpYyBnYWluIGNvbnRyb2wgKEFHQykgaXMgd29ya2luZyByaWdodC4KKwkgKiBBR0MgdmFsdWUgKHNlZSBiZWxvdykgd2lsbCBwcm92aWRlIHRoZSAiaW50ZXJlc3RpbmciIGluZm8uCisJICovCisJdmFsID0gbGUzMl90b19jcHUobmNwaHktPm5vbl9jZmdfcGh5W0lXTEFHTl9SWF9SRVNfUlNTSV9BQl9JRFhdKTsKKwlyc3NpX2EgPSAodmFsICYgSVdMQUdOX09GRE1fUlNTSV9JTkJBTkRfQV9CSVRNU0spID4+CisJCUlXTEFHTl9PRkRNX1JTU0lfQV9CSVRfUE9TOworCXJzc2lfYiA9ICh2YWwgJiBJV0xBR05fT0ZETV9SU1NJX0lOQkFORF9CX0JJVE1TSykgPj4KKwkJSVdMQUdOX09GRE1fUlNTSV9CX0JJVF9QT1M7CisJdmFsID0gbGUzMl90b19jcHUobmNwaHktPm5vbl9jZmdfcGh5W0lXTEFHTl9SWF9SRVNfUlNTSV9DX0lEWF0pOworCXJzc2lfYyA9ICh2YWwgJiBJV0xBR05fT0ZETV9SU1NJX0lOQkFORF9DX0JJVE1TSykgPj4KKwkJSVdMQUdOX09GRE1fUlNTSV9DX0JJVF9QT1M7CisKKwltYXhfcnNzaSA9IG1heF90KHUzMiwgcnNzaV9hLCByc3NpX2IpOworCW1heF9yc3NpID0gbWF4X3QodTMyLCBtYXhfcnNzaSwgcnNzaV9jKTsKKworCUlXTF9ERUJVR19TVEFUUyhwcml2LCAiUnNzaSBJbiBBICVkIEIgJWQgQyAlZCBNYXggJWQgQUdDIGRCICVkXG4iLAorCQlyc3NpX2EsIHJzc2lfYiwgcnNzaV9jLCBtYXhfcnNzaSwgYWdjKTsKKworCS8qIGRCbSA9IG1heF9yc3NpIGRCIC0gYWdjIGRCIC0gY29uc3RhbnQuCisJICogSGlnaGVyIEFHQyAoaGlnaGVyIHJhZGlvIGdhaW4pIG1lYW5zIGxvd2VyIHNpZ25hbC4gKi8KKwlyZXR1cm4gbWF4X3Jzc2kgLSBhZ2MgLSBJV0xBR05fUlNTSV9PRkZTRVQ7Cit9CisKIC8qIENhbGxlZCBmb3IgUkVQTFlfUlggKGxlZ2FjeSBBQkcgZnJhbWVzKSwgb3IKICAqIFJFUExZX1JYX01QRFVfQ01EIChIVCBoaWdoLXRocm91Z2hwdXQgTiBmcmFtZXMpLiAqLwogc3RhdGljIHZvaWQgaXdsX3J4X3JlcGx5X3J4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKQEAgLTk3NywxMSArODQxLDExIEBACiAJCQkJcGh5X3Jlcy0+Y2ZnX3BoeV9jbnQgKyBsZW4pOwogCQlhbXBkdV9zdGF0dXMgPSBsZTMyX3RvX2NwdShyeF9wa3Rfc3RhdHVzKTsKIAl9IGVsc2UgewotCQlpZiAoIXByaXYtPl9hZ24ubGFzdF9waHlfcmVzX3ZhbGlkKSB7CisJCWlmICghcHJpdi0+bGFzdF9waHlfcmVzX3ZhbGlkKSB7CiAJCQlJV0xfRVJSKHByaXYsICJNUERVIGZyYW1lIHdpdGhvdXQgY2FjaGVkIFBIWSBkYXRhXG4iKTsKIAkJCXJldHVybjsKIAkJfQotCQlwaHlfcmVzID0gJnByaXYtPl9hZ24ubGFzdF9waHlfcmVzOworCQlwaHlfcmVzID0gJnByaXYtPmxhc3RfcGh5X3JlczsKIAkJYW1zZHUgPSAoc3RydWN0IGl3bF9yeF9tcGR1X3Jlc19zdGFydCAqKXBrdC0+dS5yYXc7CiAJCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShwa3QtPnUucmF3ICsgc2l6ZW9mKCphbXNkdSkpOwogCQlsZW4gPSBsZTE2X3RvX2NwdShhbXNkdS0+Ynl0ZV9jb3VudCk7CkBAIC0xMDI0LDcgKzg4OCw3IEBACiAJcHJpdi0+dWNvZGVfYmVhY29uX3RpbWUgPSBsZTMyX3RvX2NwdShwaHlfcmVzLT5iZWFjb25fdGltZV9zdGFtcCk7CiAKIAkvKiBGaW5kIG1heCBzaWduYWwgc3RyZW5ndGggKGRCbSkgYW1vbmcgMyBhbnRlbm5hL3JlY2VpdmVyIGNoYWlucyAqLwotCXJ4X3N0YXR1cy5zaWduYWwgPSBwcml2LT5jZmctPm9wcy0+dXRpbHMtPmNhbGNfcnNzaShwcml2LCBwaHlfcmVzKTsKKwlyeF9zdGF0dXMuc2lnbmFsID0gaXdsYWduX2NhbGNfcnNzaShwcml2LCBwaHlfcmVzKTsKIAogCWl3bF9kYmdfbG9nX3J4X2RhdGFfZnJhbWUocHJpdiwgbGVuLCBoZWFkZXIpOwogCUlXTF9ERUJVR19TVEFUU19MSU1JVChwcml2LCAiUnNzaSAlZCwgVFNGICVsbHVcbiIsCkBAIC0xMTAyLDYgKzk2Niw2NCBAQAogCS8qIGJsb2NrIGFjayAqLwogCWhhbmRsZXJzW1JFUExZX0NPTVBSRVNTRURfQkFdCQk9IGl3bGFnbl9yeF9yZXBseV9jb21wcmVzc2VkX2JhOwogCi0JLyogU2V0IHVwIGhhcmR3YXJlIHNwZWNpZmljIFJ4IGhhbmRsZXJzICovCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+cnhfaGFuZGxlcl9zZXR1cChwcml2KTsKKwkvKiBpbml0IGNhbGlicmF0aW9uIGhhbmRsZXJzICovCisJcHJpdi0+cnhfaGFuZGxlcnNbQ0FMSUJSQVRJT05fUkVTX05PVElGSUNBVElPTl0gPQorCQkJCQlpd2xhZ25fcnhfY2FsaWJfcmVzdWx0OworCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX1RYXSA9IGl3bGFnbl9yeF9yZXBseV90eDsKKworCS8qIHNldCB1cCBub3RpZmljYXRpb24gd2FpdCBzdXBwb3J0ICovCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPm5vdGlmX3dhaXRfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPm5vdGlmX3dhaXRzKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5ub3RpZl93YWl0cSk7CisKKwkvKiBTZXQgdXAgQlQgUnggaGFuZGxlcnMgKi8KKwlpZiAocHJpdi0+Y2ZnLT5saWItPmJ0X3J4X2hhbmRsZXJfc2V0dXApCisJCXByaXYtPmNmZy0+bGliLT5idF9yeF9oYW5kbGVyX3NldHVwKHByaXYpOworCit9CisKK3ZvaWQgaXdsX3J4X2Rpc3BhdGNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCit7CisJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisKKwkvKgorCSAqIERvIHRoZSBub3RpZmljYXRpb24gd2FpdCBiZWZvcmUgUlggaGFuZGxlcnMgc28KKwkgKiBldmVuIGlmIHRoZSBSWCBoYW5kbGVyIGNvbnN1bWVzIHRoZSBSWEIgd2UgaGF2ZQorCSAqIGFjY2VzcyB0byBpdCBpbiB0aGUgbm90aWZpY2F0aW9uIHdhaXQgZW50cnkuCisJICovCisJaWYgKCFsaXN0X2VtcHR5KCZwcml2LT5ub3RpZl93YWl0cykpIHsKKwkJc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqdzsKKworCQlzcGluX2xvY2soJnByaXYtPm5vdGlmX3dhaXRfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnByaXYtPm5vdGlmX3dhaXRzLCBsaXN0KSB7CisJCQlpZiAody0+Y21kICE9IHBrdC0+aGRyLmNtZCkKKwkJCQljb250aW51ZTsKKwkJCUlXTF9ERUJVR19SWChwcml2LAorCQkJCSJOb3RpZjogJXMsIDB4JTAyeCAtIHdha2UgdGhlIGNhbGxlcnMgdXBcbiIsCisJCQkJZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSwKKwkJCQlwa3QtPmhkci5jbWQpOworCQkJdy0+dHJpZ2dlcmVkID0gdHJ1ZTsKKwkJCWlmICh3LT5mbikKKwkJCQl3LT5mbihwcml2LCBwa3QsIHctPmZuX2RhdGEpOworCQl9CisJCXNwaW5fdW5sb2NrKCZwcml2LT5ub3RpZl93YWl0X2xvY2spOworCisJCXdha2VfdXBfYWxsKCZwcml2LT5ub3RpZl93YWl0cSk7CisJfQorCisJaWYgKHByaXYtPnByZV9yeF9oYW5kbGVyKQorCQlwcml2LT5wcmVfcnhfaGFuZGxlcihwcml2LCByeGIpOworCisJLyogQmFzZWQgb24gdHlwZSBvZiBjb21tYW5kIHJlc3BvbnNlIG9yIG5vdGlmaWNhdGlvbiwKKwkgKiAgIGhhbmRsZSB0aG9zZSB0aGF0IG5lZWQgaGFuZGxpbmcgdmlhIGZ1bmN0aW9uIGluCisJICogICByeF9oYW5kbGVycyB0YWJsZS4gIFNlZSBpd2xfc2V0dXBfcnhfaGFuZGxlcnMoKSAqLworCWlmIChwcml2LT5yeF9oYW5kbGVyc1twa3QtPmhkci5jbWRdKSB7CisJCXByaXYtPmlzcl9zdGF0cy5yeF9oYW5kbGVyc1twa3QtPmhkci5jbWRdKys7CisJCXByaXYtPnJ4X2hhbmRsZXJzW3BrdC0+aGRyLmNtZF0gKHByaXYsIHJ4Yik7CisJfSBlbHNlIHsKKwkJLyogTm8gaGFuZGxpbmcgbmVlZGVkICovCisJCUlXTF9ERUJVR19SWChwcml2LAorCQkJIk5vIGhhbmRsZXIgbmVlZGVkIGZvciAlcywgMHglMDJ4XG4iLAorCQkJZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSwgcGt0LT5oZHIuY21kKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zY2FuLmMKaW5kZXggZDYwZDYzMC4uZGQ2OTM3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNjYW4uYwpAQCAtMzYsNiArMzYsOCBAQAogI2luY2x1ZGUgIml3bC1zdGEuaCIKICNpbmNsdWRlICJpd2wtaW8uaCIKICNpbmNsdWRlICJpd2wtaGVscGVycy5oIgorI2luY2x1ZGUgIml3bC1hZ24uaCIKKyNpbmNsdWRlICJpd2wtdHJhbnMuaCIKIAogLyogRm9yIGFjdGl2ZSBzY2FuLCBsaXN0ZW4gQUNUSVZFX0RXRUxMX1RJTUUgKG1zZWMpIG9uIGVhY2ggY2hhbm5lbCBhZnRlcgogICogc2VuZGluZyBwcm9iZSByZXEuICBUaGlzIHNob3VsZCBiZSBzZXQgbG9uZyBlbm91Z2ggdG8gaGVhciBwcm9iZSByZXNwb25zZXMKQEAgLTYwLDcgKzYyLDcgQEAKIAlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0OwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBSRVBMWV9TQ0FOX0FCT1JUX0NNRCwKLQkJLmZsYWdzID0gQ01EX1dBTlRfU0tCLAorCQkuZmxhZ3MgPSBDTURfU1lOQyB8IENNRF9XQU5UX1NLQiwKIAl9OwogCiAJLyogRXhpdCBpbnN0YW50bHkgd2l0aCBlcnJvciB3aGVuIGRldmljZSBpcyBub3QgcmVhZHkKQEAgLTczLDcgKzc1LDcgQEAKIAkgICAgdGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCiAJCXJldHVybiAtRUlPOwogCi0JcmV0ID0gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgJmNtZCk7CisJcmV0ID0gdHJhbnNfc2VuZF9jbWQoJnByaXYtPnRyYW5zLCAmY21kKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0zNDgsOSArMzUwLDYgQEAKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKIAotCWlmIChXQVJOX09OKCFwcml2LT5jZmctPm9wcy0+dXRpbHMtPnJlcXVlc3Rfc2NhbikpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnNjYW5fY2hlY2spOwogCiAJaWYgKCFpd2xfaXNfcmVhZHlfcmYocHJpdikpIHsKQEAgLTM3OSw3ICszNzgsNyBAQAogCXByaXYtPnNjYW5fc3RhcnQgPSBqaWZmaWVzOwogCXByaXYtPnNjYW5fYmFuZCA9IGJhbmQ7CiAKLQlyZXQgPSBwcml2LT5jZmctPm9wcy0+dXRpbHMtPnJlcXVlc3Rfc2Nhbihwcml2LCB2aWYpOworCXJldCA9IGl3bGFnbl9yZXF1ZXN0X3NjYW4ocHJpdiwgdmlmKTsKIAlpZiAocmV0KSB7CiAJCWNsZWFyX2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpOwogCQlwcml2LT5zY2FuX3R5cGUgPSBJV0xfU0NBTl9OT1JNQUw7CkBAIC01NjYsMTAgKzU2NSwxMCBAQAogCQlnb3RvIG91dF9zZXR0aW5nczsKIAl9CiAKLQlpZiAocHJpdi0+c2Nhbl90eXBlID09IElXTF9TQ0FOX09GRkNIX1RYICYmIHByaXYtPl9hZ24ub2ZmY2hhbl90eF9za2IpIHsKKwlpZiAocHJpdi0+c2Nhbl90eXBlID09IElXTF9TQ0FOX09GRkNIX1RYICYmIHByaXYtPm9mZmNoYW5fdHhfc2tiKSB7CiAJCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShwcml2LT5odywKLQkJCQkJICAgIHByaXYtPl9hZ24ub2ZmY2hhbl90eF9za2IpOwotCQlwcml2LT5fYWduLm9mZmNoYW5fdHhfc2tiID0gTlVMTDsKKwkJCQkJICAgIHByaXYtPm9mZmNoYW5fdHhfc2tiKTsKKwkJcHJpdi0+b2ZmY2hhbl90eF9za2IgPSBOVUxMOwogCX0KIAogCWlmIChwcml2LT5zY2FuX3R5cGUgIT0gSVdMX1NDQU5fTk9STUFMICYmICFhYm9ydGVkKSB7CkBAIC02MDAsMTQgKzU5OSw3IEBACiAJaWYgKCFpd2xfaXNfcmVhZHlfcmYocHJpdikpCiAJCWdvdG8gb3V0OwogCi0JLyoKLQkgKiBXZSBkbyBub3QgY29tbWl0IHBvd2VyIHNldHRpbmdzIHdoaWxlIHNjYW4gaXMgcGVuZGluZywKLQkgKiBkbyBpdCBub3cgaWYgdGhlIHNldHRpbmdzIGNoYW5nZWQuCi0JICovCi0JaXdsX3Bvd2VyX3NldF9tb2RlKHByaXYsICZwcml2LT5wb3dlcl9kYXRhLnNsZWVwX2NtZF9uZXh0LCBmYWxzZSk7Ci0JaXdsX3NldF90eF9wb3dlcihwcml2LCBwcml2LT50eF9wb3dlcl9uZXh0LCBmYWxzZSk7Ci0KLQlwcml2LT5jZmctPm9wcy0+dXRpbHMtPnBvc3Rfc2Nhbihwcml2KTsKKwlpd2xhZ25fcG9zdF9zY2FuKHByaXYpOwogCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zdGEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN0YS5jCmluZGV4IDdkZjI4MTQuLjFlZjNiNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN0YS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN0YS5jCkBAIC0zNSw2ICszNSw4IEBACiAjaW5jbHVkZSAiaXdsLWRldi5oIgogI2luY2x1ZGUgIml3bC1jb3JlLmgiCiAjaW5jbHVkZSAiaXdsLXN0YS5oIgorI2luY2x1ZGUgIml3bC10cmFucy5oIgorI2luY2x1ZGUgIml3bC1hZ24uaCIKIAogLyogcHJpdi0+c3RhX2xvY2sgbXVzdCBiZSBoZWxkICovCiBzdGF0aWMgdm9pZCBpd2xfc3RhX3Vjb2RlX2FjdGl2YXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggc3RhX2lkKQpAQCAtMTMyLDYgKzEzNCwxNiBAQAogCiB9CiAKK3N0YXRpYyB1MTYgaXdsYWduX2J1aWxkX2FkZHN0YV9oY21kKGNvbnN0IHN0cnVjdCBpd2xfYWRkc3RhX2NtZCAqY21kLCB1OCAqZGF0YSkKK3sKKwl1MTYgc2l6ZSA9ICh1MTYpc2l6ZW9mKHN0cnVjdCBpd2xfYWRkc3RhX2NtZCk7CisJc3RydWN0IGl3bF9hZGRzdGFfY21kICphZGRzdGEgPSAoc3RydWN0IGl3bF9hZGRzdGFfY21kICopZGF0YTsKKwltZW1jcHkoYWRkc3RhLCBjbWQsIHNpemUpOworCS8qIHJlc3J2ZWQgaW4gNTAwMCAqLworCWFkZHN0YS0+cmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMTYoMCk7CisJcmV0dXJuIHNpemU7Cit9CisKIGludCBpd2xfc2VuZF9hZGRfc3RhKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJICAgICBzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgKnN0YSwgdTggZmxhZ3MpCiB7CkBAIC0xNTUsOCArMTY3LDggQEAKIAkJbWlnaHRfc2xlZXAoKTsKIAl9CiAKLQljbWQubGVuWzBdID0gcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5idWlsZF9hZGRzdGFfaGNtZChzdGEsIGRhdGEpOwotCXJldCA9IGl3bF9zZW5kX2NtZChwcml2LCAmY21kKTsKKwljbWQubGVuWzBdID0gaXdsYWduX2J1aWxkX2FkZHN0YV9oY21kKHN0YSwgZGF0YSk7CisJcmV0ID0gdHJhbnNfc2VuZF9jbWQoJnByaXYtPnRyYW5zLCAmY21kKTsKIAogCWlmIChyZXQgfHwgKGZsYWdzICYgQ01EX0FTWU5DKSkKIAkJcmV0dXJuIHJldDsKQEAgLTQxMiw3ICs0MjQsNyBAQAogCiAJY21kLmZsYWdzIHw9IENNRF9XQU5UX1NLQjsKIAotCXJldCA9IGl3bF9zZW5kX2NtZChwcml2LCAmY21kKTsKKwlyZXQgPSB0cmFuc19zZW5kX2NtZCgmcHJpdi0+dHJhbnMsICZjbWQpOwogCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTY1Nyw3ICs2NjksNyBAQAogCWl3bF9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscSwgQ01EX1NZTkMsIHRydWUpOwogfQogCi1pbnQgaXdsX2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCitpbnQgaXdsX2dldF9mcmVlX3Vjb2RlX2tleV9vZmZzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCWludCBpOwogCkBAIC03ODEsNyArNzkzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoaXNfbHFfdGFibGVfdmFsaWQocHJpdiwgY3R4LCBscSkpCi0JCXJldCA9IGl3bF9zZW5kX2NtZChwcml2LCAmY21kKTsKKwkJcmV0ID0gdHJhbnNfc2VuZF9jbWQoJnByaXYtPnRyYW5zLCAmY21kKTsKIAllbHNlCiAJCXJldCA9IC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN0YS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmgKaW5kZXggZmY2NDAyNy4uOWE2NzY4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmgKQEAgLTMxLDkgKzMxLDYgQEAKIAogI2luY2x1ZGUgIml3bC1kZXYuaCIKIAotI2RlZmluZSBIV19LRVlfRFlOQU1JQyAwCi0jZGVmaW5lIEhXX0tFWV9ERUZBVUxUIDEKLQogI2RlZmluZSBJV0xfU1RBX0RSSVZFUl9BQ1RJVkUgQklUKDApIC8qIGRyaXZlciBlbnRyeSBpcyBhY3RpdmUgKi8KICNkZWZpbmUgSVdMX1NUQV9VQ09ERV9BQ1RJVkUgIEJJVCgxKSAvKiB1Y29kZSBlbnRyeSBpcyBhY3RpdmUgKi8KICNkZWZpbmUgSVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTICBCSVQoMikgLyogdWNvZGUgZW50cnkgaXMgaW4gcHJvY2VzcyBvZgpAQCAtNDcsNyArNDQsNyBAQAogdm9pZCBpd2xfY2xlYXJfdWNvZGVfc3RhdGlvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7CiB2b2lkIGl3bF9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOworaW50IGl3bF9nZXRfZnJlZV91Y29kZV9rZXlfb2Zmc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBpbnQgaXdsX3NlbmRfYWRkX3N0YShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCSAgICAgc3RydWN0IGl3bF9hZGRzdGFfY21kICpzdGEsIHU4IGZsYWdzKTsKIGludCBpd2xfYWRkX3N0YXRpb25fY29tbW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN2LW9wZW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN2LW9wZW4uYwppbmRleCA2OWI3ZTZiLi5iMTFmNjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zdi1vcGVuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3Ytb3Blbi5jCkBAIC02OSw3ICs2OSw2IEBACiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KIAotCiAjaW5jbHVkZSAiaXdsLWRldi5oIgogI2luY2x1ZGUgIml3bC1jb3JlLmgiCiAjaW5jbHVkZSAiaXdsLWRlYnVnLmgiCkBAIC03Nyw3ICs3Niw3IEBACiAjaW5jbHVkZSAiaXdsLWlvLmgiCiAjaW5jbHVkZSAiaXdsLWFnbi5oIgogI2luY2x1ZGUgIml3bC10ZXN0bW9kZS5oIgotCisjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCiAKIC8qIFRoZSBUTFZzIHVzZWQgaW4gdGhlIGdubCBtZXNzYWdlIHBvbGljeSBiZXR3ZWVuIHRoZSBrZXJuZWwgbW9kdWxlIGFuZAogICogdXNlciBzcGFjZSBhcHBsaWNhdGlvbi4gaXdsX3Rlc3Rtb2RlX2dubF9tc2dfcG9saWN5IGlzIHRvIGJlIGNhcnJpZWQKQEAgLTEwMSw5ICsxMDAsMTIgQEAKIAlbSVdMX1RNX0FUVFJfRUVQUk9NXSA9IHsgLnR5cGUgPSBOTEFfVU5TUEVDLCB9LAogCiAJW0lXTF9UTV9BVFRSX1RSQUNFX0FERFJdID0geyAudHlwZSA9IE5MQV9VTlNQRUMsIH0sCi0JW0lXTF9UTV9BVFRSX1RSQUNFX0RBVEFdID0geyAudHlwZSA9IE5MQV9VTlNQRUMsIH0sCisJW0lXTF9UTV9BVFRSX1RSQUNFX0RVTVBdID0geyAudHlwZSA9IE5MQV9VTlNQRUMsIH0sCisJW0lXTF9UTV9BVFRSX1RSQUNFX1NJWkVdID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCiAKIAlbSVdMX1RNX0FUVFJfRklYUkFURV0gPSB7IC50eXBlID0gTkxBX1UzMiwgfSwKKworCVtJV0xfVE1fQVRUUl9VQ09ERV9PV05FUl0gPSB7IC50eXBlID0gTkxBX1U4LCB9LAogfTsKIAogLyoKQEAgLTE3OSwxOSArMTgxLDE5IEBACiAKIHN0YXRpYyB2b2lkIGl3bF90cmFjZV9jbGVhbnVwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+cGNpX2Rldi0+ZGV2OwotCiAJaWYgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2VuYWJsZWQpIHsKIAkJaWYgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLmNwdV9hZGRyICYmCiAJCSAgICBwcml2LT50ZXN0bW9kZV90cmFjZS5kbWFfYWRkcikKLQkJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwKLQkJCQkJVFJBQ0VfVE9UQUxfU0laRSwKKwkJCWRtYV9mcmVlX2NvaGVyZW50KHByaXYtPmJ1cy0+ZGV2LAorCQkJCQlwcml2LT50ZXN0bW9kZV90cmFjZS50b3RhbF9zaXplLAogCQkJCQlwcml2LT50ZXN0bW9kZV90cmFjZS5jcHVfYWRkciwKIAkJCQkJcHJpdi0+dGVzdG1vZGVfdHJhY2UuZG1hX2FkZHIpOwogCQlwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9lbmFibGVkID0gZmFsc2U7CiAJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmNwdV9hZGRyID0gTlVMTDsKIAkJcHJpdi0+dGVzdG1vZGVfdHJhY2UudHJhY2VfYWRkciA9IE5VTEw7CiAJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmRtYV9hZGRyID0gMDsKKwkJcHJpdi0+dGVzdG1vZGVfdHJhY2UuYnVmZl9zaXplID0gMDsKKwkJcHJpdi0+dGVzdG1vZGVfdHJhY2UudG90YWxfc2l6ZSA9IDA7CiAJfQogfQogCkBAIC0yMjksNiArMjMxLDcgQEAKIAkJcmV0dXJuIC1FTk9NU0c7CiAJfQogCisJY21kLmZsYWdzID0gQ01EX09OX0RFTUFORDsKIAljbWQuaWQgPSBubGFfZ2V0X3U4KHRiW0lXTF9UTV9BVFRSX1VDT0RFX0NNRF9JRF0pOwogCWNtZC5kYXRhWzBdID0gbmxhX2RhdGEodGJbSVdMX1RNX0FUVFJfVUNPREVfQ01EX0RBVEFdKTsKIAljbWQubGVuWzBdID0gbmxhX2xlbih0YltJV0xfVE1fQVRUUl9VQ09ERV9DTURfREFUQV0pOwpAQCAtMjM2LDcgKzIzOSw3IEBACiAJSVdMX0lORk8ocHJpdiwgInRlc3Rtb2RlIHVjb2RlIGNvbW1hbmQgSUQgMHgleCwgZmxhZ3MgMHgleCwiCiAJCQkJIiBsZW4gJWRcbiIsIGNtZC5pZCwgY21kLmZsYWdzLCBjbWQubGVuWzBdKTsKIAkvKiBvaywgbGV0J3Mgc3VibWl0IHRoZSBjb21tYW5kIHRvIHVjb2RlICovCi0JcmV0dXJuIGl3bF9zZW5kX2NtZChwcml2LCAmY21kKTsKKwlyZXR1cm4gdHJhbnNfc2VuZF9jbWQoJnByaXYtPnRyYW5zLCAmY21kKTsKIH0KIAogCkBAIC0zOTQsNyArMzk3LDcgQEAKIAogCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0xPQURfSU5JVF9GVzoKIAkJc3RhdHVzID0gaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShwcml2LCAmcHJpdi0+dWNvZGVfaW5pdCwKLQkJCQkJICAgVUNPREVfU1VCVFlQRV9JTklULCAtMSk7CisJCQkJCQkgICAgICBJV0xfVUNPREVfSU5JVCk7CiAJCWlmIChzdGF0dXMpCiAJCQlJV0xfREVCVUdfSU5GTyhwcml2LAogCQkJCSJFcnJvciBsb2FkaW5nIGluaXQgdWNvZGU6ICVkXG4iLCBzdGF0dXMpOwpAQCAtNDAyLDE0ICs0MDUsMTMgQEAKIAogCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0NGR19JTklUX0NBTElCOgogCQlpd2xfdGVzdG1vZGVfY2ZnX2luaXRfY2FsaWIocHJpdik7Ci0JCWl3bGFnbl9zdG9wX2RldmljZShwcml2KTsKKwkJdHJhbnNfc3RvcF9kZXZpY2UoJnByaXYtPnRyYW5zKTsKIAkJYnJlYWs7CiAKIAljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9MT0FEX1JVTlRJTUVfRlc6CiAJCXN0YXR1cyA9IGl3bGFnbl9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUocHJpdiwKIAkJCQkJICAgJnByaXYtPnVjb2RlX3J0LAotCQkJCQkgICBVQ09ERV9TVUJUWVBFX1JFR1VMQVIsCi0JCQkJCSAgIFVDT0RFX1NVQlRZUEVfUkVHVUxBUl9ORVcpOworCQkJCQkgICBJV0xfVUNPREVfUkVHVUxBUik7CiAJCWlmIChzdGF0dXMpIHsKIAkJCUlXTF9ERUJVR19JTkZPKHByaXYsCiAJCQkJIkVycm9yIGxvYWRpbmcgcnVudGltZSB1Y29kZTogJWRcbiIsIHN0YXR1cyk7CkBAIC00NTAsNyArNDUyLDcgQEAKIAkJCQkgICAgICAgIkVycm9yIGZpbmRpbmcgZml4cmF0ZSBzZXR0aW5nXG4iKTsKIAkJCXJldHVybiAtRU5PTVNHOwogCQl9Ci0JCXByaXYtPmRiZ19maXhlZF9yYXRlID0gbmxhX2dldF91MzIodGJbSVdMX1RNX0FUVFJfRklYUkFURV0pOworCQlwcml2LT50bV9maXhlZF9yYXRlID0gbmxhX2dldF91MzIodGJbSVdMX1RNX0FUVFJfRklYUkFURV0pOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC00ODIsMTYgKzQ4NCwyOSBAQAogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IHN0YXR1cyA9IDA7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnBjaV9kZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwcml2LT5idXMtPmRldjsKIAogCXN3aXRjaCAobmxhX2dldF91MzIodGJbSVdMX1RNX0FUVFJfQ09NTUFORF0pKSB7CiAJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfQkVHSU5fVFJBQ0U6CiAJCWlmIChwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9lbmFibGVkKQogCQkJcmV0dXJuIC1FQlVTWTsKIAorCQlpZiAoIXRiW0lXTF9UTV9BVFRSX1RSQUNFX1NJWkVdKQorCQkJcHJpdi0+dGVzdG1vZGVfdHJhY2UuYnVmZl9zaXplID0gVFJBQ0VfQlVGRl9TSVpFX0RFRjsKKwkJZWxzZQorCQkJcHJpdi0+dGVzdG1vZGVfdHJhY2UuYnVmZl9zaXplID0KKwkJCQlubGFfZ2V0X3UzMih0YltJV0xfVE1fQVRUUl9UUkFDRV9TSVpFXSk7CisJCWlmICghcHJpdi0+dGVzdG1vZGVfdHJhY2UuYnVmZl9zaXplKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUgPCBUUkFDRV9CVUZGX1NJWkVfTUlOIHx8CisJCSAgICBwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUgPiBUUkFDRV9CVUZGX1NJWkVfTUFYKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcHJpdi0+dGVzdG1vZGVfdHJhY2UudG90YWxfc2l6ZSA9CisJCQlwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUgKyBUUkFDRV9CVUZGX1BBREQ7CiAJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmNwdV9hZGRyID0KIAkJCWRtYV9hbGxvY19jb2hlcmVudChkZXYsCi0JCQkJCSAgIFRSQUNFX1RPVEFMX1NJWkUsCisJCQkJCSAgIHByaXYtPnRlc3Rtb2RlX3RyYWNlLnRvdGFsX3NpemUsCiAJCQkJCSAgICZwcml2LT50ZXN0bW9kZV90cmFjZS5kbWFfYWRkciwKIAkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghcHJpdi0+dGVzdG1vZGVfdHJhY2UuY3B1X2FkZHIpCkBAIC01MDAsNyArNTE1LDcgQEAKIAkJcHJpdi0+dGVzdG1vZGVfdHJhY2UudHJhY2VfYWRkciA9ICh1OCAqKVBUUl9BTElHTigKIAkJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmNwdV9hZGRyLCAweDEwMCk7CiAJCW1lbXNldChwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9hZGRyLCAweDAzQiwKLQkJCVRSQUNFX0JVRkZfU0laRSk7CisJCQlwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUpOwogCQlza2IgPSBjZmc4MDIxMV90ZXN0bW9kZV9hbGxvY19yZXBseV9za2IoaHctPndpcGh5LAogCQkJc2l6ZW9mKHByaXYtPnRlc3Rtb2RlX3RyYWNlLmRtYV9hZGRyKSArIDIwKTsKIAkJaWYgKCFza2IpIHsKQEAgLTUxOCwzNCArNTMzLDE0IEBACiAJCQkJICAgICAgICJFcnJvciBzZW5kaW5nIG1zZyA6ICVkXG4iLAogCQkJCSAgICAgICBzdGF0dXMpOwogCQl9CisJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLm51bV9jaHVua3MgPQorCQkJRElWX1JPVU5EX1VQKHByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSwKKwkJCQkgICAgIFRSQUNFX0NIVU5LX1NJWkUpOwogCQlicmVhazsKIAogCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0VORF9UUkFDRToKIAkJaXdsX3RyYWNlX2NsZWFudXAocHJpdik7CiAJCWJyZWFrOwotCi0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfUkVBRF9UUkFDRToKLQkJaWYgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2VuYWJsZWQgJiYKLQkJICAgIHByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2FkZHIpIHsKLQkJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYihody0+d2lwaHksCi0JCQkJMjAgKyBUUkFDRV9CVUZGX1NJWkUpOwotCQkJaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkJIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJCU5MQV9QVVQoc2tiLCBJV0xfVE1fQVRUUl9UUkFDRV9EQVRBLAotCQkJCVRSQUNFX0JVRkZfU0laRSwKLQkJCQlwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9hZGRyKTsKLQkJCXN0YXR1cyA9IGNmZzgwMjExX3Rlc3Rtb2RlX3JlcGx5KHNrYik7Ci0JCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJICAgICAgICJFcnJvciBzZW5kaW5nIG1zZyA6ICVkXG4iLCBzdGF0dXMpOwotCQkJfQotCQl9IGVsc2UKLQkJCXJldHVybiAtRUZBVUxUOwotCQlicmVhazsKLQogCWRlZmF1bHQ6CiAJCUlXTF9ERUJVR19JTkZPKHByaXYsICJVbmtub3duIHRlc3Rtb2RlIG1lbSBjb21tYW5kIElEXG4iKTsKIAkJcmV0dXJuIC1FTk9TWVM7CkBAIC01NjAsNiArNTU1LDczIEBACiAJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAorc3RhdGljIGludCBpd2xfdGVzdG1vZGVfdHJhY2VfZHVtcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IG5sYXR0ciAqKnRiLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWludCBpZHgsIGxlbmd0aDsKKworCWlmIChwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9lbmFibGVkICYmCisJICAgIHByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2FkZHIpIHsKKwkJaWR4ID0gY2ItPmFyZ3NbNF07CisJCWlmIChpZHggPj0gcHJpdi0+dGVzdG1vZGVfdHJhY2UubnVtX2NodW5rcykKKwkJCXJldHVybiAtRU5PRU5UOworCQlsZW5ndGggPSBUUkFDRV9DSFVOS19TSVpFOworCQlpZiAoKChpZHggKyAxKSA9PSBwcml2LT50ZXN0bW9kZV90cmFjZS5udW1fY2h1bmtzKSAmJgorCQkgICAgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSAlIFRSQUNFX0NIVU5LX1NJWkUpKQorCQkJbGVuZ3RoID0gcHJpdi0+dGVzdG1vZGVfdHJhY2UuYnVmZl9zaXplICUKKwkJCQlUUkFDRV9DSFVOS19TSVpFOworCisJCU5MQV9QVVQoc2tiLCBJV0xfVE1fQVRUUl9UUkFDRV9EVU1QLCBsZW5ndGgsCisJCQlwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9hZGRyICsKKwkJCShUUkFDRV9DSFVOS19TSVpFICogaWR4KSk7CisJCWlkeCsrOworCQljYi0+YXJnc1s0XSA9IGlkeDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiAtRUZBVUxUOworCisgbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtRU5PQlVGUzsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgdXNlciBhcHBsaWNhdGlvbiBzd2l0Y2ggdWNvZGUgb3duZXJzaGlwLgorICoKKyAqIEl0IHJldHJpZXZlcyB0aGUgbWFuZGF0b3J5IGZpZWxkcyBJV0xfVE1fQVRUUl9VQ09ERV9PV05FUiBhbmQKKyAqIGRlY2lkZSB3aG8gdGhlIGN1cnJlbnQgb3duZXIgb2YgdGhlIHVDb2RlCisgKgorICogSWYgdGhlIGN1cnJlbnQgb3duZXIgaXMgT1dORVJTSElQX1RNLCB0aGVuIHRoZSBvbmx5IGhvc3QgY29tbWFuZAorICogY2FuIGRlbGl2ZXIgdG8gdUNvZGUgaXMgZnJvbSB0ZXN0bW9kZSwgYWxsIHRoZSBvdGhlciBob3N0IGNvbW1hbmRzCisgKiB3aWxsIGRyb3BwZWQuCisgKgorICogZGVmYXVsdCBkcml2ZXIgaXMgdGhlIG93bmVyIG9mIHVDb2RlIGluIG5vcm1hbCBvcGVyYXRpb25hbCBtb2RlCisgKgorICogQGh3OiBpZWVlODAyMTFfaHcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZGV2aWNlCisgKiBAdGI6IGdubCBtZXNzYWdlIGZpZWxkcyBmcm9tIHRoZSB1c2VyIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgaXdsX3Rlc3Rtb2RlX293bmVyc2hpcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IG5sYXR0ciAqKnRiKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXU4IG93bmVyOworCisJaWYgKCF0YltJV0xfVE1fQVRUUl9VQ09ERV9PV05FUl0pIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGZpbmRpbmcgdWNvZGUgb3duZXJcbiIpOworCQlyZXR1cm4gLUVOT01TRzsKKwl9CisKKwlvd25lciA9IG5sYV9nZXRfdTgodGJbSVdMX1RNX0FUVFJfVUNPREVfT1dORVJdKTsKKwlpZiAoKG93bmVyID09IElXTF9PV05FUlNISVBfRFJJVkVSKSB8fCAob3duZXIgPT0gSVdMX09XTkVSU0hJUF9UTSkpCisJCXByaXYtPnVjb2RlX293bmVyID0gb3duZXI7CisJZWxzZSB7CisJCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbnZhbGlkIG93bmVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisKIC8qIFRoZSB0ZXN0bW9kZSBnbmwgbWVzc2FnZSBoYW5kbGVyIHRoYXQgdGFrZXMgdGhlIGdubCBtZXNzYWdlIGZyb20gdGhlCiAgKiB1c2VyIHNwYWNlIGFuZCBwYXJzZXMgaXQgcGVyIHRoZSBwb2xpY3kgaXdsX3Rlc3Rtb2RlX2dubF9tc2dfcG9saWN5LCB0aGVuCiAgKiBpbnZva2UgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlcnMuCkBAIC01ODEsNyArNjQzLDcgQEAKICAqLwogaW50IGl3bF90ZXN0bW9kZV9jbWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHZvaWQgKmRhdGEsIGludCBsZW4pCiB7Ci0Jc3RydWN0IG5sYXR0ciAqdGJbSVdMX1RNX0FUVFJfTUFYIC0gMV07CisJc3RydWN0IG5sYXR0ciAqdGJbSVdMX1RNX0FUVFJfTUFYXTsKIAlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAlpbnQgcmVzdWx0OwogCkBAIC02MjksNiArNjkxLDExIEBACiAJCXJlc3VsdCA9IGl3bF90ZXN0bW9kZV90cmFjZShodywgdGIpOwogCQlicmVhazsKIAorCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX09XTkVSU0hJUDoKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgInRlc3Rtb2RlIGNoYW5nZSB1Q29kZSBvd25lcnNoaXBcbiIpOworCQlyZXN1bHQgPSBpd2xfdGVzdG1vZGVfb3duZXJzaGlwKGh3LCB0Yik7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlVua25vd24gdGVzdG1vZGUgY29tbWFuZFxuIik7CiAJCXJlc3VsdCA9IC1FTk9TWVM7CkBAIC02MzgsMyArNzA1LDUwIEBACiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KKworaW50IGl3bF90ZXN0bW9kZV9kdW1wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCSAgICAgIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IG5sYXR0ciAqdGJbSVdMX1RNX0FUVFJfTUFYXTsKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmVzdWx0OworCXUzMiBjbWQ7CisKKwlpZiAoY2ItPmFyZ3NbM10pIHsKKwkJLyogb2Zmc2V0IGJ5IDEgc2luY2UgY29tbWFuZHMgc3RhcnQgYXQgMCAqLworCQljbWQgPSBjYi0+YXJnc1szXSAtIDE7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gbmxhX3BhcnNlKHRiLCBJV0xfVE1fQVRUUl9NQVggLSAxLCBkYXRhLCBsZW4sCisJCQkJaXdsX3Rlc3Rtb2RlX2dubF9tc2dfcG9saWN5KTsKKwkJaWYgKHJlc3VsdCkgeworCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJCSAgICAgICAiRXJyb3IgcGFyc2luZyB0aGUgZ25sIG1lc3NhZ2UgOiAlZFxuIiwgcmVzdWx0KTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQkvKiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIGFic29sdXRlbHkgbWFuZGF0b3J5ICovCisJCWlmICghdGJbSVdMX1RNX0FUVFJfQ09NTUFORF0pIHsKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkJIkVycm9yIGZpbmRpbmcgdGVzdG1vZGUgY29tbWFuZCB0eXBlXG4iKTsKKwkJCXJldHVybiAtRU5PTVNHOworCQl9CisJCWNtZCA9IG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX0NPTU1BTkRdKTsKKwkJY2ItPmFyZ3NbM10gPSBjbWQgKyAxOworCX0KKworCS8qIGluIGNhc2UgbXVsdGlwbGUgYWNjZXNzZXMgdG8gdGhlIGRldmljZSBoYXBwZW5zICovCisJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfUkVBRF9UUkFDRToKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgInVDb2RlIHRyYWNlIGNtZCB0byBkcml2ZXJcbiIpOworCQlyZXN1bHQgPSBpd2xfdGVzdG1vZGVfdHJhY2VfZHVtcChodywgdGIsIHNrYiwgY2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdGVzdG1vZGUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRlc3Rtb2RlLmgKaW5kZXggYTg4MDg1ZS4uYjk4MGJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdGVzdG1vZGUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10ZXN0bW9kZS5oCkBAIC02NiwxMjAgKzY2LDE2MSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIAotLyogQ29tbWFuZHMgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZShJV0xfVE1fQ01EX0lEX0FQUDJERVZfWFgpIGFuZAorLyoKKyAqIENvbW1hbmRzIGZyb20gdXNlciBzcGFjZSB0byBrZXJuZWwgc3BhY2UoSVdMX1RNX0NNRF9JRF9BUFAyREVWX1hYKSBhbmQKICAqIGZyb20gYW5kIGtlcm5lbCBzcGFjZSB0byB1c2VyIHNwYWNlKElXTF9UTV9DTURfSURfREVWMkFQUF9YWCkuCi0gKiBUaGUgY29tbWFuZCBJRCBpcyBjYXJyaWVkIHdpdGggSVdMX1RNX0FUVFJfQ09NTUFORC4gVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mCi0gKiBvZiBjb21tYW5kIGZyb20gdXNlciBzcGFjZSBhbmQgdHdvIHR5cGVzIG9mIGNvbW1hbmQgZnJvbSBrZXJuZWwgc3BhY2UuCi0gKiBTZWUgYmVsb3cuCisgKiBUaGUgY29tbWFuZCBJRCBpcyBjYXJyaWVkIHdpdGggSVdMX1RNX0FUVFJfQ09NTUFORC4KKyAqCisgKiBASVdMX1RNX0NNRF9BUFAyREVWX1VDT0RFOgorICoJY29tbWFuZHMgZnJvbSB1c2VyIGFwcGxpY2F0aW9uIHRvIHRoZSB1Q29kZSwKKyAqCXRoZSBhY3R1YWwgdUNvZGUgaG9zdCBjb21tYW5kIElEIGlzIGNhcnJpZWQgd2l0aAorICoJSVdMX1RNX0FUVFJfVUNPREVfQ01EX0lECisgKgorICogQElXTF9UTV9DTURfQVBQMkRFVl9SRUdfUkVBRDMyOgorICogQElXTF9UTV9DTURfQVBQMkRFVl9SRUdfV1JJVEUzMjoKKyAqIEBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1dSSVRFODoKKyAqCWNvbW1hbmRzIGZyb20gdXNlciBhcHBsaWNhaXRvbiB0byBhY2Nlc3MgcmVnaXN0ZXIKKyAqCisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0dFVF9ERVZJQ0VOQU1FOiByZXRyaWV2ZSBkZXZpY2UgbmFtZQorICogQElXTF9UTV9DTURfQVBQMkRFVl9MT0FEX0lOSVRfRlc6IGxvYWQgaW5pdGlhbCB1Q29kZSBpbWFnZQorICogQElXTF9UTV9DTURfQVBQMkRFVl9DRkdfSU5JVF9DQUxJQjogcGVyZm9ybSBjYWxpYnJhdGlvbgorICogQElXTF9UTV9DTURfQVBQMkRFVl9MT0FEX1JVTlRJTUVfRlc6IGxvYWQgcnVudGltZSB1Q29kZSBpbWFnZQorICogQElXTF9UTV9DTURfQVBQMkRFVl9HRVRfRUVQUk9NOiByZXF1ZXN0IEVFUFJPTSBkYXRhCisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0ZJWFJBVEVfUkVROiBzZXQgZml4IE1DUworICoJY29tbWFuZHMgZm9tIHVzZXIgc3BhY2UgZm9yIHB1cmUgZHJpdmVyIGxldmVsIG9wZXJhdGlvbnMKKyAqCisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0JFR0lOX1RSQUNFOgorICogQElXTF9UTV9DTURfQVBQMkRFVl9FTkRfVFJBQ0U6CisgKiBASVdMX1RNX0NNRF9BUFAyREVWX1JFQURfVFJBQ0U6CisgKgljb21tYW5kcyBmb20gdXNlciBzcGFjZSBmb3IgdUNvZGUgdHJhY2Ugb3BlcmF0aW9ucworICoKKyAqIEBJV0xfVE1fQ01EX0RFVjJBUFBfU1lOQ19SU1A6CisgKgljb21tYW5kcyBmcm9tIGtlcm5lbCBzcGFjZSB0byBjYXJyeSB0aGUgc3luY2hyb25vdXMgcmVzcG9uc2UKKyAqCXRvIHVzZXIgYXBwbGljYXRpb24KKyAqIEBJV0xfVE1fQ01EX0RFVjJBUFBfVUNPREVfUlhfUEtUOgorICoJY29tbWFuZHMgZnJvbSBrZXJuZWwgc3BhY2UgdG8gbXVsdGljYXN0IHRoZSBzcG9udGFuZW91cyBtZXNzYWdlcworICoJdG8gdXNlciBhcHBsaWNhdGlvbgorICogQElXTF9UTV9DTURfREVWMkFQUF9FRVBST01fUlNQOgorICoJY29tbWFuZHMgZnJvbSBrZXJuZWwgc3BhY2UgdG8gY2FycnkgdGhlIGVlcHJvbSByZXNwb25zZQorICoJdG8gdXNlciBhcHBsaWNhdGlvbgorICogQElXTF9UTV9DTURfQVBQMkRFVl9PV05FUlNISVA6CisgKgljb21tYW5kcyBmcm9tIHVzZXIgYXBwbGljYXRpb24gdG8gb3duIGNoYW5nZSB0aGUgb3duZXJzaGlwIG9mIHRoZSB1Q29kZQorICoJaWYgYXBwbGljYXRpb24gaGFzIHRoZSBvd25lcnNoaXAsIHRoZSBvbmx5IGhvc3QgY29tbWFuZCBmcm9tCisgKgl0ZXN0bW9kZSB3aWxsIGRlbGl2ZXIgdG8gdUNvZGUuIERlZmF1bHQgb3duZXIgaXMgZHJpdmVyCiAgKi8KIGVudW0gaXdsX3RtX2NtZF90IHsKLQkvKiBjb21tYW5kcyBmcm9tIHVzZXIgYXBwbGljYXRpb24gdG8gdGhlIHVDb2RlLAotCSAqIHRoZSBhY3R1YWwgdUNvZGUgaG9zdCBjb21tYW5kIElEIGlzIGNhcnJpZWQgd2l0aAotCSAqIElXTF9UTV9BVFRSX1VDT0RFX0NNRF9JRCAqLwotCUlXTF9UTV9DTURfQVBQMkRFVl9VQ09ERSA9IDEsCi0KLQkvKiBjb21tYW5kcyBmcm9tIHVzZXIgYXBwbGljYWl0b24gdG8gYWNjZXNzIHJlZ2lzdGVyICovCi0JSVdMX1RNX0NNRF9BUFAyREVWX1JFR19SRUFEMzIsCi0JSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTMyLAotCUlXTF9UTV9DTURfQVBQMkRFVl9SRUdfV1JJVEU4LAotCi0JLyogY29tbWFuZHMgZm9tIHVzZXIgc3BhY2UgZm9yIHB1cmUgZHJpdmVyIGxldmVsIG9wZXJhdGlvbnMgKi8KLQlJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0RFVklDRU5BTUUsCi0JSVdMX1RNX0NNRF9BUFAyREVWX0xPQURfSU5JVF9GVywKLQlJV0xfVE1fQ01EX0FQUDJERVZfQ0ZHX0lOSVRfQ0FMSUIsCi0JSVdMX1RNX0NNRF9BUFAyREVWX0xPQURfUlVOVElNRV9GVywKLQlJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0VFUFJPTSwKLQlJV0xfVE1fQ01EX0FQUDJERVZfRklYUkFURV9SRVEsCi0JLyogaWYgdGhlcmUgaXMgb3RoZXIgbmV3IGNvbW1hbmQgZm9yIHRoZSBkcml2ZXIgbGF5ZXIgb3BlcmF0aW9uLAotCSAqIGFwcGVuZCB0aGVtIGhlcmUgKi8KLQotCS8qIGNvbW1hbmRzIGZvbSB1c2VyIHNwYWNlIGZvciB1Q29kZSB0cmFjZSBvcGVyYXRpb25zICovCi0JSVdMX1RNX0NNRF9BUFAyREVWX0JFR0lOX1RSQUNFLAotCUlXTF9UTV9DTURfQVBQMkRFVl9FTkRfVFJBQ0UsCi0JSVdMX1RNX0NNRF9BUFAyREVWX1JFQURfVFJBQ0UsCi0KLQkvKiBjb21tYW5kcyBmcm9tIGtlcm5lbCBzcGFjZSB0byBjYXJyeSB0aGUgc3luY2hyb25vdXMgcmVzcG9uc2UKLQkgKiB0byB1c2VyIGFwcGxpY2F0aW9uICovCi0JSVdMX1RNX0NNRF9ERVYyQVBQX1NZTkNfUlNQLAotCi0JLyogY29tbWFuZHMgZnJvbSBrZXJuZWwgc3BhY2UgdG8gbXVsdGljYXN0IHRoZSBzcG9udGFuZW91cyBtZXNzYWdlcwotCSAqIHRvIHVzZXIgYXBwbGljYXRpb24gKi8KLQlJV0xfVE1fQ01EX0RFVjJBUFBfVUNPREVfUlhfUEtULAotCi0JLyogY29tbWFuZHMgZnJvbSBrZXJuZWwgc3BhY2UgdG8gY2FycnkgdGhlIGVlcHJvbSByZXNwb25zZQotCSAqIHRvIHVzZXIgYXBwbGljYXRpb24gKi8KLQlJV0xfVE1fQ01EX0RFVjJBUFBfRUVQUk9NX1JTUCwKLQotCUlXTF9UTV9DTURfTUFYLAorCUlXTF9UTV9DTURfQVBQMkRFVl9VQ09ERQkJPSAxLAorCUlXTF9UTV9DTURfQVBQMkRFVl9SRUdfUkVBRDMyCQk9IDIsCisJSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTMyCQk9IDMsCisJSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTgJCT0gNCwKKwlJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0RFVklDRU5BTUUJPSA1LAorCUlXTF9UTV9DTURfQVBQMkRFVl9MT0FEX0lOSVRfRlcJCT0gNiwKKwlJV0xfVE1fQ01EX0FQUDJERVZfQ0ZHX0lOSVRfQ0FMSUIJPSA3LAorCUlXTF9UTV9DTURfQVBQMkRFVl9MT0FEX1JVTlRJTUVfRlcJPSA4LAorCUlXTF9UTV9DTURfQVBQMkRFVl9HRVRfRUVQUk9NCQk9IDksCisJSVdMX1RNX0NNRF9BUFAyREVWX0ZJWFJBVEVfUkVRCQk9IDEwLAorCUlXTF9UTV9DTURfQVBQMkRFVl9CRUdJTl9UUkFDRQkJPSAxMSwKKwlJV0xfVE1fQ01EX0FQUDJERVZfRU5EX1RSQUNFCQk9IDEyLAorCUlXTF9UTV9DTURfQVBQMkRFVl9SRUFEX1RSQUNFCQk9IDEzLAorCUlXTF9UTV9DTURfREVWMkFQUF9TWU5DX1JTUAkJPSAxNCwKKwlJV0xfVE1fQ01EX0RFVjJBUFBfVUNPREVfUlhfUEtUCQk9IDE1LAorCUlXTF9UTV9DTURfREVWMkFQUF9FRVBST01fUlNQCQk9IDE2LAorCUlXTF9UTV9DTURfQVBQMkRFVl9PV05FUlNISVAJCT0gMTcsCisJSVdMX1RNX0NNRF9NQVgJCQkJPSAxOCwKIH07CiAKKy8qCisgKiBBdHJyaWJ1dGUgZmlsZWQgaW4gdGVzdG1vZGUgY29tbWFuZAorICogU2VlIGVudW0gaXdsX3RtX2NtZF90LgorICoKKyAqIEBJV0xfVE1fQVRUUl9OT1RfQVBQTElDQUJMRToKKyAqCVRoZSBhdHRyaWJ1dGUgaXMgbm90IGFwcGxpY2FibGUgb3IgaW52YWxpZAorICogQElXTF9UTV9BVFRSX0NPTU1BTkQ6CisgKglGcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlOgorICoJdGhlIGNvbW1hbmQgZWl0aGVyIGRlc3RpbmVzIHRvIHVjb2RlLCBkcml2ZXIsIG9yIHJlZ2lzdGVyOworICoJRnJvbSBrZXJuZWwgc3BhY2UgdG8gdXNlciBzcGFjZToKKyAqCXRoZSBjb21tYW5kIGVpdGhlciBjYXJyaWVzIHN5bmNocm9ub3VzIHJlc3BvbnNlLAorICoJb3IgdGhlIHNwb250YW5lb3VzIG1lc3NhZ2UgbXVsdGljYXN0IGZyb20gdGhlIGRldmljZTsKKyAqCisgKiBASVdMX1RNX0FUVFJfVUNPREVfQ01EX0lEOgorICogQElXTF9UTV9BVFRSX1VDT0RFX0NNRF9EQVRBOgorICoJV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfQVBQMkRFVl9VQ09ERSwKKyAqCVRoZSBtYW5kYXRvcnkgZmllbGRzIGFyZSA6CisgKglJV0xfVE1fQVRUUl9VQ09ERV9DTURfSUQgZm9yIHJlY29nbml6YWJsZSBjb21tYW5kIElEOworICoJSVdMX1RNX0FUVFJfQ09NTUFORF9GTEFHIGZvciB0aGUgZmxhZ3Mgb2YgdGhlIGNvbW1hbmRzOworICoJVGhlIG9wdGlvbmFsIGZpZWxkcyBhcmU6CisgKglJV0xfVE1fQVRUUl9VQ09ERV9DTURfREFUQSBmb3IgdGhlIGFjdHVhbCBjb21tYW5kIHBheWxvYWQKKyAqCXRvIHRoZSB1Y29kZQorICoKKyAqIEBJV0xfVE1fQVRUUl9SRUdfT0ZGU0VUOgorICogQElXTF9UTV9BVFRSX1JFR19WQUxVRTg6CisgKiBASVdMX1RNX0FUVFJfUkVHX1ZBTFVFMzI6CisgKglXaGVuIElXTF9UTV9BVFRSX0NPTU1BTkQgaXMgSVdMX1RNX0NNRF9BUFAyREVWX1JFR19YWFgsCisgKglUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6CisgKglJV0xfVE1fQVRUUl9SRUdfT0ZGU0VUIGZvciB0aGUgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgcmVnaXN0ZXI7CisgKglJV0xfVE1fQVRUUl9SRUdfVkFMVUU4IG9yIElXTF9UTV9BVFRSX1JFR19WQUxVRTMyIGZvciB2YWx1ZQorICoKKyAqIEBJV0xfVE1fQVRUUl9TWU5DX1JTUDoKKyAqCVdoZW4gSVdMX1RNX0FUVFJfQ09NTUFORCBpcyBJV0xfVE1fQ01EX0RFVjJBUFBfU1lOQ19SU1AsCisgKglUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6CisgKglJV0xfVE1fQVRUUl9TWU5DX1JTUCBmb3IgdGhlIGRhdGEgY29udGVudCByZXNwb25kaW5nIHRvIHRoZSB1c2VyCisgKglhcHBsaWNhdGlvbiBjb21tYW5kCisgKgorICogQElXTF9UTV9BVFRSX1VDT0RFX1JYX1BLVDoKKyAqCVdoZW4gSVdMX1RNX0FUVFJfQ09NTUFORCBpcyBJV0xfVE1fQ01EX0RFVjJBUFBfVUNPREVfUlhfUEtULAorICoJVGhlIG1hbmRhdG9yeSBmaWVsZHMgYXJlOgorICoJSVdMX1RNX0FUVFJfVUNPREVfUlhfUEtUIGZvciB0aGUgZGF0YSBjb250ZW50IG11bHRpY2FzdCB0byB0aGUgdXNlcgorICoJYXBwbGljYXRpb24KKyAqCisgKiBASVdMX1RNX0FUVFJfRUVQUk9NOgorICoJV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfREVWMkFQUF9FRVBST00sCisgKglUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6CisgKglJV0xfVE1fQVRUUl9FRVBST00gZm9yIHRoZSBkYXRhIGNvbnRlbnQgcmVzcG9uZ2luZyB0byB0aGUgdXNlcgorICoJYXBwbGljYXRpb24KKyAqCisgKiBASVdMX1RNX0FUVFJfVFJBQ0VfQUREUjoKKyAqIEBJV0xfVE1fQVRUUl9UUkFDRV9TSVpFOgorICogQElXTF9UTV9BVFRSX1RSQUNFX0RVTVA6CisgKglXaGVuIElXTF9UTV9BVFRSX0NPTU1BTkQgaXMgSVdMX1RNX0NNRF9BUFAyREVWX1hYWF9UUkFDRSwKKyAqCVRoZSBtYW5kYXRvcnkgZmllbGRzIGFyZToKKyAqCUlXTF9UTV9BVFRSX01FTV9UUkFDRV9BRERSIGZvciB0aGUgdHJhY2UgYWRkcmVzcworICoJSVdMX1RNX0FUVFJfTUVNX1RSQUNFX1NJWkUgZm9yIHRoZSB0cmFjZSBidWZmZXIgc2l6ZQorICoJSVdMX1RNX0FUVFJfTUVNX1RSQUNFX0RVTVAgZm9yIHRoZSB0cmFjZSBkdW1wCisgKgorICogQElXTF9UTV9BVFRSX0ZJWFJBVEU6CisgKglXaGVuIElXTF9UTV9BVFRSX0NPTU1BTkQgaXMgSVdMX1RNX0NNRF9BUFAyREVWX0ZJWFJBVEVfUkVRLAorICoJVGhlIG1hbmRhdG9yeSBmaWVsZHMgYXJlOgorICoJSVdMX1RNX0FUVFJfRklYUkFURSBmb3IgdGhlIGZpeGVkIHJhdGUKKyAqCisgKiBASVdMX1RNX0FUVFJfVUNPREVfT1dORVI6CisgKglXaGVuIElXTF9UTV9BVFRSX0NPTU1BTkQgaXMgSVdMX1RNX0NNRF9BUFAyREVWX09XTkVSU0hJUCwKKyAqCVRoZSBtYW5kYXRvcnkgZmllbGRzIGFyZToKKyAqCUlXTF9UTV9BVFRSX1VDT0RFX09XTkVSIGZvciB0aGUgbmV3IG93bmVyCisgKi8KIGVudW0gaXdsX3RtX2F0dHJfdCB7Ci0JSVdMX1RNX0FUVFJfTk9UX0FQUExJQ0FCTEUgPSAwLAotCi0JLyogRnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZToKLQkgKiB0aGUgY29tbWFuZCBlaXRoZXIgZGVzdGluZXMgdG8gdWNvZGUsIGRyaXZlciwgb3IgcmVnaXN0ZXI7Ci0JICogU2VlIGVudW0gaXdsX3RtX2NtZF90LgotCSAqCi0JICogRnJvbSBrZXJuZWwgc3BhY2UgdG8gdXNlciBzcGFjZToKLQkgKiB0aGUgY29tbWFuZCBlaXRoZXIgY2FycmllcyBzeW5jaHJvbm91cyByZXNwb25zZSwKLQkgKiBvciB0aGUgc3BvbnRhbmVvdXMgbWVzc2FnZSBtdWx0aWNhc3QgZnJvbSB0aGUgZGV2aWNlOwotCSAqIFNlZSBlbnVtIGl3bF90bV9jbWRfdC4gKi8KLQlJV0xfVE1fQVRUUl9DT01NQU5ELAotCi0JLyogV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfQVBQMkRFVl9VQ09ERSwKLQkgKiBUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmUgOgotCSAqIElXTF9UTV9BVFRSX1VDT0RFX0NNRF9JRCBmb3IgcmVjb2duaXphYmxlIGNvbW1hbmQgSUQ7Ci0JICogSVdMX1RNX0FUVFJfQ09NTUFORF9GTEFHIGZvciB0aGUgZmxhZ3Mgb2YgdGhlIGNvbW1hbmRzOwotCSAqIFRoZSBvcHRpb25hbCBmaWVsZHMgYXJlOgotCSAqIElXTF9UTV9BVFRSX1VDT0RFX0NNRF9EQVRBIGZvciB0aGUgYWN0dWFsIGNvbW1hbmQgcGF5bG9hZAotCSAqIHRvIHRoZSB1Y29kZSAqLwotCUlXTF9UTV9BVFRSX1VDT0RFX0NNRF9JRCwKLQlJV0xfVE1fQVRUUl9VQ09ERV9DTURfREFUQSwKLQotCS8qIFdoZW4gSVdMX1RNX0FUVFJfQ09NTUFORCBpcyBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1hYWCwKLQkgKiBUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6Ci0JICogSVdMX1RNX0FUVFJfUkVHX09GRlNFVCBmb3IgdGhlIG9mZnNldCBvZiB0aGUgdGFyZ2V0IHJlZ2lzdGVyOwotCSAqIElXTF9UTV9BVFRSX1JFR19WQUxVRTggb3IgSVdMX1RNX0FUVFJfUkVHX1ZBTFVFMzIgZm9yIHZhbHVlICovCi0JSVdMX1RNX0FUVFJfUkVHX09GRlNFVCwKLQlJV0xfVE1fQVRUUl9SRUdfVkFMVUU4LAotCUlXTF9UTV9BVFRSX1JFR19WQUxVRTMyLAotCi0JLyogV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfREVWMkFQUF9TWU5DX1JTUCwKLQkgKiBUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6Ci0JICogSVdMX1RNX0FUVFJfU1lOQ19SU1AgZm9yIHRoZSBkYXRhIGNvbnRlbnQgcmVzcG9uZGluZyB0byB0aGUgdXNlcgotCSAqIGFwcGxpY2F0aW9uIGNvbW1hbmQgKi8KLQlJV0xfVE1fQVRUUl9TWU5DX1JTUCwKLQkvKiBXaGVuIElXTF9UTV9BVFRSX0NPTU1BTkQgaXMgSVdMX1RNX0NNRF9ERVYyQVBQX1VDT0RFX1JYX1BLVCwKLQkgKiBUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6Ci0JICogSVdMX1RNX0FUVFJfVUNPREVfUlhfUEtUIGZvciB0aGUgZGF0YSBjb250ZW50IG11bHRpY2FzdCB0byB0aGUgdXNlcgotCSAqIGFwcGxpY2F0aW9uICovCi0JSVdMX1RNX0FUVFJfVUNPREVfUlhfUEtULAotCi0JLyogV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfREVWMkFQUF9FRVBST00sCi0JICogVGhlIG1hbmRhdG9yeSBmaWVsZHMgYXJlOgotCSAqIElXTF9UTV9BVFRSX0VFUFJPTSBmb3IgdGhlIGRhdGEgY29udGVudCByZXNwb25naW5nIHRvIHRoZSB1c2VyCi0JICogYXBwbGljYXRpb24gKi8KLQlJV0xfVE1fQVRUUl9FRVBST00sCi0KLQkvKiBXaGVuIElXTF9UTV9BVFRSX0NPTU1BTkQgaXMgSVdMX1RNX0NNRF9BUFAyREVWX1hYWF9UUkFDRSwKLQkgKiBUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6Ci0JICogSVdMX1RNX0FUVFJfTUVNX1RSQUNFX0FERFIgZm9yIHRoZSB0cmFjZSBhZGRyZXNzCi0JICovCi0JSVdMX1RNX0FUVFJfVFJBQ0VfQUREUiwKLQlJV0xfVE1fQVRUUl9UUkFDRV9EQVRBLAotCi0JLyogV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfQVBQMkRFVl9GSVhSQVRFX1JFUSwKLQkgKiBUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6Ci0JICogSVdMX1RNX0FUVFJfRklYUkFURSBmb3IgdGhlIGZpeGVkIHJhdGUKLQkgKi8KLQlJV0xfVE1fQVRUUl9GSVhSQVRFLAotCi0JSVdMX1RNX0FUVFJfTUFYLAorCUlXTF9UTV9BVFRSX05PVF9BUFBMSUNBQkxFCQk9IDAsCisJSVdMX1RNX0FUVFJfQ09NTUFORAkJCT0gMSwKKwlJV0xfVE1fQVRUUl9VQ09ERV9DTURfSUQJCT0gMiwKKwlJV0xfVE1fQVRUUl9VQ09ERV9DTURfREFUQQkJPSAzLAorCUlXTF9UTV9BVFRSX1JFR19PRkZTRVQJCQk9IDQsCisJSVdMX1RNX0FUVFJfUkVHX1ZBTFVFOAkJCT0gNSwKKwlJV0xfVE1fQVRUUl9SRUdfVkFMVUUzMgkJCT0gNiwKKwlJV0xfVE1fQVRUUl9TWU5DX1JTUAkJCT0gNywKKwlJV0xfVE1fQVRUUl9VQ09ERV9SWF9QS1QJCT0gOCwKKwlJV0xfVE1fQVRUUl9FRVBST00JCQk9IDksCisJSVdMX1RNX0FUVFJfVFJBQ0VfQUREUgkJCT0gMTAsCisJSVdMX1RNX0FUVFJfVFJBQ0VfU0laRQkJCT0gMTEsCisJSVdMX1RNX0FUVFJfVFJBQ0VfRFVNUAkJCT0gMTIsCisJSVdMX1RNX0FUVFJfRklYUkFURQkJCT0gMTMsCisJSVdMX1RNX0FUVFJfVUNPREVfT1dORVIJCQk9IDE0LAorCUlXTF9UTV9BVFRSX01BWAkJCQk9IDE1LAogfTsKIAogLyogdUNvZGUgdHJhY2UgYnVmZmVyICovCi0jZGVmaW5lIFRSQUNFX0JVRkZfU0laRQkJMHgyMDAwMAorI2RlZmluZSBUUkFDRV9CVUZGX1NJWkVfTUFYCTB4MjAwMDAwCisjZGVmaW5lIFRSQUNFX0JVRkZfU0laRV9NSU4JMHgyMDAwMAorI2RlZmluZSBUUkFDRV9CVUZGX1NJWkVfREVGCVRSQUNFX0JVRkZfU0laRV9NSU4KICNkZWZpbmUgVFJBQ0VfQlVGRl9QQURECQkweDIwMDAKLSNkZWZpbmUgVFJBQ0VfVE9UQUxfU0laRQkoVFJBQ0VfQlVGRl9TSVpFICsgVFJBQ0VfQlVGRl9QQUREKQorI2RlZmluZSBUUkFDRV9DSFVOS19TSVpFCShQQUdFX1NJWkUgLSAxMDI0KQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLWludC1wY2llLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1pbnQtcGNpZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OTMzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1pbnQtcGNpZS5oCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAorICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19pd2xfdHJhbnNfaW50X3BjaWVfaF9fCisjZGVmaW5lIF9faXdsX3RyYW5zX2ludF9wY2llX2hfXworCisvKlRoaXMgZmlsZSBpbmNsdWRlcyB0aGUgZGVjbGFyYXRpb24gdGhhdCBhcmUgaW50ZXJuYWwgdG8gdGhlCisgKiB0cmFuc19wY2llIGxheWVyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSWAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpd2xfYmdfcnhfcmVwbGVuaXNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSk7Cit2b2lkIGl3bF9pcnFfdGFza2xldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwordm9pZCBpd2xhZ25fcnhfcmVwbGVuaXNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Cit2b2lkIGl3bF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCXN0cnVjdCBpd2xfcnhfcXVldWUgKnEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSUNUCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaXdsX3Jlc2V0X2ljdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwordm9pZCBpd2xfZGlzYWJsZV9pY3Qoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK2ludCBpd2xfYWxsb2NfaXNyX2ljdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwordm9pZCBpd2xfZnJlZV9pc3JfaWN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CitpcnFyZXR1cm5fdCBpd2xfaXNyX2ljdChpbnQgaXJxLCB2b2lkICpkYXRhKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVFggLyBIQ01ECisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGl3bF90eHFfdXBkYXRlX3dyaXRlX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSk7Cit2b2lkIGl3bGFnbl90eHFfZnJlZV90ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCisJCQkJaW50IGluZGV4KTsKK2ludCBpd2xhZ25fdHhxX2F0dGFjaF9idWZfdG9fdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCQkgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAorCQkJCSBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4sIHU4IHJlc2V0KTsKK2ludCBpd2xfcXVldWVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcXVldWUgKnEsCisJCQkgIGludCBjb3VudCwgaW50IHNsb3RzX251bSwgdTMyIGlkKTsKK2ludCBpd2xfc2VuZF9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpOworaW50IF9fbXVzdF9jaGVjayBpd2xfc2VuZF9jbWRfcGR1KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggaWQsIHUzMiBmbGFncywKKwkJCXUxNiBsZW4sIGNvbnN0IHZvaWQgKmRhdGEpOwordm9pZCBpd2xfdHhfY21kX2NvbXBsZXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwordm9pZCBpd2xfdHJhbnNfdHhxX3VwZGF0ZV9ieXRlX2NudF90Ymwoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCQkgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCisJCQkJCSAgIHUxNiBieXRlX2NudCk7CitpbnQgaXdsX3RyYW5zX3R4cV9hZ2dfZGlzYWJsZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiB0eHFfaWQsCisJCQkJICB1MTYgc3NuX2lkeCwgdTggdHhfZmlmbyk7Cit2b2lkIGl3bF90cmFuc19zZXRfd3JfcHRycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCSAgICAgaW50IHR4cV9pZCwgdTMyIGluZGV4KTsKK3ZvaWQgaXdsX3RyYW5zX3R4X3F1ZXVlX3NldF9zdGF0dXMoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJICAgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCisJCQkgICAgIGludCB0eF9maWZvX2lkLCBpbnQgc2NkX3JldHJ5KTsKK3ZvaWQgaXdsX3RyYW5zX3R4cV9hZ2dfc2V0dXAoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLCBpbnQgdGlkLAorCQkJCQkJaW50IGZyYW1lX2xpbWl0KTsKKworI2VuZGlmIC8qIF9faXdsX3RyYW5zX2ludF9wY2llX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcngtcGNpZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcngtcGNpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NDg2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1yeC1wY2llLmMKQEAgLTAsMCArMSw5NzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAorICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKworI2luY2x1ZGUgIml3bC1kZXYuaCIKKyNpbmNsdWRlICJpd2wtYWduLmgiCisjaW5jbHVkZSAiaXdsLWNvcmUuaCIKKyNpbmNsdWRlICJpd2wtaW8uaCIKKyNpbmNsdWRlICJpd2wtaGVscGVycy5oIgorI2luY2x1ZGUgIml3bC10cmFucy1pbnQtcGNpZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUlggcGF0aCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUnggdGhlb3J5IG9mIG9wZXJhdGlvbgorICoKKyAqIERyaXZlciBhbGxvY2F0ZXMgYSBjaXJjdWxhciBidWZmZXIgb2YgUmVjZWl2ZSBCdWZmZXIgRGVzY3JpcHRvcnMgKFJCRHMpLAorICogZWFjaCBvZiB3aGljaCBwb2ludCB0byBSZWNlaXZlIEJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJ5IHRoZSBOSUMuICBUaGVzZSBnZXQKKyAqIHVzZWQgbm90IG9ubHkgZm9yIFJ4IGZyYW1lcywgYnV0IGZvciBhbnkgY29tbWFuZCByZXNwb25zZSBvciBub3RpZmljYXRpb24KKyAqIGZyb20gdGhlIE5JQy4gIFRoZSBkcml2ZXIgYW5kIE5JQyBtYW5hZ2UgdGhlIFJ4IGJ1ZmZlcnMgYnkgbWVhbnMKKyAqIG9mIGluZGV4ZXMgaW50byB0aGUgY2lyY3VsYXIgYnVmZmVyLgorICoKKyAqIFJ4IFF1ZXVlIEluZGV4ZXMKKyAqIFRoZSBob3N0L2Zpcm13YXJlIHNoYXJlIHR3byBpbmRleCByZWdpc3RlcnMgZm9yIG1hbmFnaW5nIHRoZSBSeCBidWZmZXJzLgorICoKKyAqIFRoZSBSRUFEIGluZGV4IG1hcHMgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIHRoYXQgdGhlIGZpcm13YXJlIG1heSBiZSB3cml0aW5nCisgKiB0byAtLSB0aGUgZHJpdmVyIGNhbiByZWFkIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgdGhpcyBwb3NpdGlvbiBhbmQgZ2V0CisgKiBnb29kIGRhdGEuCisgKiBUaGUgUkVBRCBpbmRleCBpcyBtYW5hZ2VkIGJ5IHRoZSBmaXJtd2FyZSBvbmNlIHRoZSBjYXJkIGlzIGVuYWJsZWQuCisgKgorICogVGhlIFdSSVRFIGluZGV4IG1hcHMgdG8gdGhlIGxhc3QgcG9zaXRpb24gdGhlIGRyaXZlciBoYXMgcmVhZCBmcm9tIC0tIHRoZQorICogcG9zaXRpb24gcHJlY2VkaW5nIFdSSVRFIGlzIHRoZSBsYXN0IHNsb3QgdGhlIGZpcm13YXJlIGNhbiBwbGFjZSBhIHBhY2tldC4KKyAqCisgKiBUaGUgcXVldWUgaXMgZW1wdHkgKG5vIGdvb2QgZGF0YSkgaWYgV1JJVEUgPSBSRUFEIC0gMSwgYW5kIGlzIGZ1bGwgaWYKKyAqIFdSSVRFID0gUkVBRC4KKyAqCisgKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIHRoZSBob3N0IHNldHMgdXAgdGhlIFJFQUQgcXVldWUgcG9zaXRpb24gdG8gdGhlIGZpcnN0CisgKiBJTkRFWCBwb3NpdGlvbiwgYW5kIFdSSVRFIHRvIHRoZSBsYXN0IChSRUFEIC0gMSB3cmFwcGVkKQorICoKKyAqIFdoZW4gdGhlIGZpcm13YXJlIHBsYWNlcyBhIHBhY2tldCBpbiBhIGJ1ZmZlciwgaXQgd2lsbCBhZHZhbmNlIHRoZSBSRUFEIGluZGV4CisgKiBhbmQgZmlyZSB0aGUgUlggaW50ZXJydXB0LiAgVGhlIGRyaXZlciBjYW4gdGhlbiBxdWVyeSB0aGUgUkVBRCBpbmRleCBhbmQKKyAqIHByb2Nlc3MgYXMgbWFueSBwYWNrZXRzIGFzIHBvc3NpYmxlLCBtb3ZpbmcgdGhlIFdSSVRFIGluZGV4IGZvcndhcmQgYXMgaXQKKyAqIHJlc2V0cyB0aGUgUnggcXVldWUgYnVmZmVycyB3aXRoIG5ldyBtZW1vcnkuCisgKgorICogVGhlIG1hbmFnZW1lbnQgaW4gdGhlIGRyaXZlciBpcyBhcyBmb2xsb3dzOgorICogKyBBIGxpc3Qgb2YgcHJlLWFsbG9jYXRlZCBTS0JzIGlzIHN0b3JlZCBpbiBpd2wtPnJ4cS0+cnhfZnJlZS4gIFdoZW4KKyAqICAgaXdsLT5yeHEtPmZyZWVfY291bnQgZHJvcHMgdG8gb3IgYmVsb3cgUlhfTE9XX1dBVEVSTUFSSywgd29yayBpcyBzY2hlZHVsZWQKKyAqICAgdG8gcmVwbGVuaXNoIHRoZSBpd2wtPnJ4cS0+cnhfZnJlZS4KKyAqICsgSW4gaXdsX3J4X3JlcGxlbmlzaCAoc2NoZWR1bGVkKSBpZiAncHJvY2Vzc2VkJyAhPSAncmVhZCcgdGhlbiB0aGUKKyAqICAgaXdsLT5yeHEgaXMgcmVwbGVuaXNoZWQgYW5kIHRoZSBSRUFEIElOREVYIGlzIHVwZGF0ZWQgKHVwZGF0aW5nIHRoZQorICogICAncHJvY2Vzc2VkJyBhbmQgJ3JlYWQnIGRyaXZlciBpbmRleGVzIGFzIHdlbGwpCisgKiArIEEgcmVjZWl2ZWQgcGFja2V0IGlzIHByb2Nlc3NlZCBhbmQgaGFuZGVkIHRvIHRoZSBrZXJuZWwgbmV0d29yayBzdGFjaywKKyAqICAgZGV0YWNoZWQgZnJvbSB0aGUgaXdsLT5yeHEuICBUaGUgZHJpdmVyICdwcm9jZXNzZWQnIGluZGV4IGlzIHVwZGF0ZWQuCisgKiArIFRoZSBIb3N0L0Zpcm13YXJlIGl3bC0+cnhxIGlzIHJlcGxlbmlzaGVkIGF0IHRhc2tsZXQgdGltZSBmcm9tIHRoZSByeF9mcmVlCisgKiAgIGxpc3QuIElmIHRoZXJlIGFyZSBubyBhbGxvY2F0ZWQgYnVmZmVycyBpbiBpd2wtPnJ4cS0+cnhfZnJlZSwgdGhlIFJFQUQKKyAqICAgSU5ERVggaXMgbm90IGluY3JlbWVudGVkIGFuZCBpd2wtPnN0YXR1cyhSWF9TVEFMTEVEKSBpcyBzZXQuICBJZiB0aGVyZQorICogICB3ZXJlIGVub3VnaCBmcmVlIGJ1ZmZlcnMgYW5kIFJYX1NUQUxMRUQgaXMgc2V0IGl0IGlzIGNsZWFyZWQuCisgKgorICoKKyAqIERyaXZlciBzZXF1ZW5jZToKKyAqCisgKiBpd2xfcnhfcXVldWVfYWxsb2MoKSAgIEFsbG9jYXRlcyByeF9mcmVlCisgKiBpd2xfcnhfcmVwbGVuaXNoKCkgICAgIFJlcGxlbmlzaGVzIHJ4X2ZyZWUgbGlzdCBmcm9tIHJ4X3VzZWQsIGFuZCBjYWxscworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXdsX3J4X3F1ZXVlX3Jlc3RvY2sKKyAqIGl3bF9yeF9xdWV1ZV9yZXN0b2NrKCkgTW92ZXMgYXZhaWxhYmxlIGJ1ZmZlcnMgZnJvbSByeF9mcmVlIGludG8gUngKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLCB1cGRhdGVzIGZpcm13YXJlIHBvaW50ZXJzLCBhbmQgdXBkYXRlcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFdSSVRFIGluZGV4LiAgSWYgaW5zdWZmaWNpZW50IHJ4X2ZyZWUgYnVmZmVycworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGF2YWlsYWJsZSwgc2NoZWR1bGVzIGl3bF9yeF9yZXBsZW5pc2gKKyAqCisgKiAtLSBlbmFibGUgaW50ZXJydXB0cyAtLQorICogSVNSIC0gaXdsX3J4KCkgICAgICAgICBEZXRhY2ggaXdsX3J4X21lbV9idWZmZXJzIGZyb20gcG9vbCB1cCB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUQgSU5ERVgsIGRldGFjaGluZyB0aGUgU0tCIGZyb20gdGhlIHBvb2wuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZlcyB0aGUgcGFja2V0IGJ1ZmZlciBmcm9tIHF1ZXVlIHRvIHJ4X3VzZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxscyBpd2xfcnhfcXVldWVfcmVzdG9jayB0byByZWZpbGwgYW55IGVtcHR5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90cy4KKyAqIC4uLgorICoKKyAqLworCisvKioKKyAqIGl3bF9yeF9xdWV1ZV9zcGFjZSAtIFJldHVybiBudW1iZXIgb2YgZnJlZSBzbG90cyBhdmFpbGFibGUgaW4gcXVldWUuCisgKi8KK3N0YXRpYyBpbnQgaXdsX3J4X3F1ZXVlX3NwYWNlKGNvbnN0IHN0cnVjdCBpd2xfcnhfcXVldWUgKnEpCit7CisJaW50IHMgPSBxLT5yZWFkIC0gcS0+d3JpdGU7CisJaWYgKHMgPD0gMCkKKwkJcyArPSBSWF9RVUVVRV9TSVpFOworCS8qIGtlZXAgc29tZSBidWZmZXIgdG8gbm90IGNvbmZ1c2UgZnVsbCBhbmQgZW1wdHkgcXVldWUgKi8KKwlzIC09IDI7CisJaWYgKHMgPCAwKQorCQlzID0gMDsKKwlyZXR1cm4gczsKK30KKworLyoqCisgKiBpd2xfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0ciAtIFVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlciBmb3IgdGhlIFJYIHF1ZXVlCisgKi8KK3ZvaWQgaXdsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJc3RydWN0IGl3bF9yeF9xdWV1ZSAqcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiByZWc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcS0+bG9jaywgZmxhZ3MpOworCisJaWYgKHEtPm5lZWRfdXBkYXRlID09IDApCisJCWdvdG8gZXhpdF91bmxvY2s7CisKKwlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+c2hhZG93X3JlZ19lbmFibGUpIHsKKwkJLyogc2hhZG93IHJlZ2lzdGVyIGVuYWJsZWQgKi8KKwkJLyogRGV2aWNlIGV4cGVjdHMgYSBtdWx0aXBsZSBvZiA4ICovCisJCXEtPndyaXRlX2FjdHVhbCA9IChxLT53cml0ZSAmIH4weDcpOworCQlpd2xfd3JpdGUzMihwcml2LCBGSF9SU0NTUl9DSE5MMF9XUFRSLCBxLT53cml0ZV9hY3R1YWwpOworCX0gZWxzZSB7CisJCS8qIElmIHBvd2VyLXNhdmluZyBpcyBpbiB1c2UsIG1ha2Ugc3VyZSBkZXZpY2UgaXMgYXdha2UgKi8KKwkJaWYgKHRlc3RfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpKSB7CisJCQlyZWcgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxKTsKKworCQkJaWYgKHJlZyAmIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVApIHsKKwkJCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJCQkiUnggcXVldWUgcmVxdWVzdGluZyB3YWtldXAsIgorCQkJCQkiIEdQMSA9IDB4JXhcbiIsIHJlZyk7CisJCQkJaXdsX3NldF9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLAorCQkJCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOworCQkJCWdvdG8gZXhpdF91bmxvY2s7CisJCQl9CisKKwkJCXEtPndyaXRlX2FjdHVhbCA9IChxLT53cml0ZSAmIH4weDcpOworCQkJaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX1JTQ1NSX0NITkwwX1dQVFIsCisJCQkJCXEtPndyaXRlX2FjdHVhbCk7CisKKwkJLyogRWxzZSBkZXZpY2UgaXMgYXNzdW1lZCB0byBiZSBhd2FrZSAqLworCQl9IGVsc2UgeworCQkJLyogRGV2aWNlIGV4cGVjdHMgYSBtdWx0aXBsZSBvZiA4ICovCisJCQlxLT53cml0ZV9hY3R1YWwgPSAocS0+d3JpdGUgJiB+MHg3KTsKKwkJCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9SU0NTUl9DSE5MMF9XUFRSLAorCQkJCXEtPndyaXRlX2FjdHVhbCk7CisJCX0KKwl9CisJcS0+bmVlZF91cGRhdGUgPSAwOworCisgZXhpdF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+bG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGl3bGFnbl9kbWFfYWRkcjJyYmRfcHRyIC0gY29udmVydCBhIERNQSBhZGRyZXNzIHRvIGEgdUNvZGUgcmVhZCBidWZmZXIgcHRyCisgKi8KK3N0YXRpYyBpbmxpbmUgX19sZTMyIGl3bGFnbl9kbWFfYWRkcjJyYmRfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCQkJICBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiBjcHVfdG9fbGUzMigodTMyKShkbWFfYWRkciA+PiA4KSk7Cit9CisKKy8qKgorICogaXdsYWduX3J4X3F1ZXVlX3Jlc3RvY2sgLSByZWZpbGwgUlggcXVldWUgZnJvbSBwcmUtYWxsb2NhdGVkIHBvb2wKKyAqCisgKiBJZiB0aGVyZSBhcmUgc2xvdHMgaW4gdGhlIFJYIHF1ZXVlIHRoYXQgbmVlZCB0byBiZSByZXN0b2NrZWQsCisgKiBhbmQgd2UgaGF2ZSBmcmVlIHByZS1hbGxvY2F0ZWQgYnVmZmVycywgZmlsbCB0aGUgcmFua3MgYXMgbXVjaAorICogYXMgd2UgY2FuLCBwdWxsaW5nIGZyb20gcnhfZnJlZS4KKyAqCisgKiBUaGlzIG1vdmVzIHRoZSAnd3JpdGUnIGluZGV4IGZvcndhcmQgdG8gY2F0Y2ggdXAgd2l0aCAncHJvY2Vzc2VkJywgYW5kCisgKiBhbHNvIHVwZGF0ZXMgdGhlIG1lbW9yeSBhZGRyZXNzIGluIHRoZSBmaXJtd2FyZSB0byByZWZlcmVuY2UgdGhlIG5ldworICogdGFyZ2V0IGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgaXdsYWduX3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKwlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCXdoaWxlICgoaXdsX3J4X3F1ZXVlX3NwYWNlKHJ4cSkgPiAwKSAmJiAocnhxLT5mcmVlX2NvdW50KSkgeworCQkvKiBUaGUgb3ZlcndyaXR0ZW4gcnhiIG11c3QgYmUgYSB1c2VkIG9uZSAqLworCQlyeGIgPSByeHEtPnF1ZXVlW3J4cS0+d3JpdGVdOworCQlCVUdfT04ocnhiICYmIHJ4Yi0+cGFnZSk7CisKKwkJLyogR2V0IG5leHQgZnJlZSBSeCBidWZmZXIsIHJlbW92ZSBmcm9tIGZyZWUgbGlzdCAqLworCQllbGVtZW50ID0gcnhxLT5yeF9mcmVlLm5leHQ7CisJCXJ4YiA9IGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyLCBsaXN0KTsKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisKKwkJLyogUG9pbnQgdG8gUnggYnVmZmVyIHZpYSBuZXh0IFJCRCBpbiBjaXJjdWxhciBidWZmZXIgKi8KKwkJcnhxLT5iZFtyeHEtPndyaXRlXSA9IGl3bGFnbl9kbWFfYWRkcjJyYmRfcHRyKHByaXYsCisJCQkJCQkJICAgICAgcnhiLT5wYWdlX2RtYSk7CisJCXJ4cS0+cXVldWVbcnhxLT53cml0ZV0gPSByeGI7CisJCXJ4cS0+d3JpdGUgPSAocnhxLT53cml0ZSArIDEpICYgUlhfUVVFVUVfTUFTSzsKKwkJcnhxLT5mcmVlX2NvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCS8qIElmIHRoZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlciBwb29sIGlzIGRyb3BwaW5nIGxvdywgc2NoZWR1bGUgdG8KKwkgKiByZWZpbGwgaXQgKi8KKwlpZiAocnhxLT5mcmVlX2NvdW50IDw9IFJYX0xPV19XQVRFUk1BUkspCisJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cnhfcmVwbGVuaXNoKTsKKworCisJLyogSWYgd2UndmUgYWRkZWQgbW9yZSBzcGFjZSBmb3IgdGhlIGZpcm13YXJlIHRvIHBsYWNlIGRhdGEsIHRlbGwgaXQuCisJICogSW5jcmVtZW50IGRldmljZSdzIHdyaXRlIHBvaW50ZXIgaW4gbXVsdGlwbGVzIG9mIDguICovCisJaWYgKHJ4cS0+d3JpdGVfYWN0dWFsICE9IChyeHEtPndyaXRlICYgfjB4NykpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQlyeHEtPm5lZWRfdXBkYXRlID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCWl3bF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHByaXYsIHJ4cSk7CisJfQorfQorCisvKioKKyAqIGl3bGFnbl9yeF9yZXBsZW5pc2ggLSBNb3ZlIGFsbCB1c2VkIHBhY2tldCBmcm9tIHJ4X3VzZWQgdG8gcnhfZnJlZQorICoKKyAqIFdoZW4gbW92aW5nIHRvIHJ4X2ZyZWUgYW4gU0tCIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNsb3QuCisgKgorICogQWxzbyByZXN0b2NrIHRoZSBSeCBxdWV1ZSB2aWEgaXdsX3J4X3F1ZXVlX3Jlc3RvY2suCisgKiBUaGlzIGlzIGNhbGxlZCBhcyBhIHNjaGVkdWxlZCB3b3JrIGl0ZW0gKGV4Y2VwdCBmb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uKQorICovCitzdGF0aWMgdm9pZCBpd2xhZ25fcnhfYWxsb2NhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBnZnBfdCBwcmlvcml0eSkKK3sKKwlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlnZnBfdCBnZnBfbWFzayA9IHByaW9yaXR5OworCisJd2hpbGUgKDEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQlpZiAobGlzdF9lbXB0eSgmcnhxLT5yeF91c2VkKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKHJ4cS0+ZnJlZV9jb3VudCA+IFJYX0xPV19XQVRFUk1BUkspCisJCQlnZnBfbWFzayB8PSBfX0dGUF9OT1dBUk47CisKKwkJaWYgKHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyID4gMCkKKwkJCWdmcF9tYXNrIHw9IF9fR0ZQX0NPTVA7CisKKwkJLyogQWxsb2MgYSBuZXcgcmVjZWl2ZSBidWZmZXIgKi8KKwkJcGFnZSA9IGFsbG9jX3BhZ2VzKGdmcF9tYXNrLCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7CisJCWlmICghcGFnZSkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiYWxsb2NfcGFnZXMgZmFpbGVkLCAiCisJCQkJCSAgICAgICAib3JkZXI6ICVkXG4iLAorCQkJCQkgICAgICAgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOworCisJCQlpZiAoKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLKSAmJgorCQkJICAgIG5ldF9yYXRlbGltaXQoKSkKKwkJCQlJV0xfQ1JJVChwcml2LCAiRmFpbGVkIHRvIGFsbG9jX3BhZ2VzIHdpdGggJXMuIgorCQkJCQkgIk9ubHkgJXUgZnJlZSBidWZmZXJzIHJlbWFpbmluZy5cbiIsCisJCQkJCSBwcmlvcml0eSA9PSBHRlBfQVRPTUlDID8KKwkJCQkJICJHRlBfQVRPTUlDIiA6ICJHRlBfS0VSTkVMIiwKKwkJCQkJIHJ4cS0+ZnJlZV9jb3VudCk7CisJCQkvKiBXZSBkb24ndCByZXNjaGVkdWxlIHJlcGxlbmlzaCB3b3JrIGhlcmUgLS0gd2Ugd2lsbAorCQkJICogY2FsbCB0aGUgcmVzdG9jayBtZXRob2QgYW5kIGlmIGl0IHN0aWxsIG5lZWRzCisJCQkgKiBtb3JlIGJ1ZmZlcnMgaXQgd2lsbCBzY2hlZHVsZSByZXBsZW5pc2ggKi8KKwkJCXJldHVybjsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAobGlzdF9lbXB0eSgmcnhxLT5yeF91c2VkKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCQlfX2ZyZWVfcGFnZXMocGFnZSwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOworCQkJcmV0dXJuOworCQl9CisJCWVsZW1lbnQgPSByeHEtPnJ4X3VzZWQubmV4dDsKKwkJcnhiID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIsIGxpc3QpOworCQlsaXN0X2RlbChlbGVtZW50KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCQlCVUdfT04ocnhiLT5wYWdlKTsKKwkJcnhiLT5wYWdlID0gcGFnZTsKKwkJLyogR2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFJCICovCisJCXJ4Yi0+cGFnZV9kbWEgPSBkbWFfbWFwX3BhZ2UocHJpdi0+YnVzLT5kZXYsIHBhZ2UsIDAsCisJCQkJUEFHRV9TSVpFIDw8IHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAorCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCS8qIGRtYSBhZGRyZXNzIG11c3QgYmUgbm8gbW9yZSB0aGFuIDM2IGJpdHMgKi8KKwkJQlVHX09OKHJ4Yi0+cGFnZV9kbWEgJiB+RE1BX0JJVF9NQVNLKDM2KSk7CisJCS8qIGFuZCBhbHNvIDI1NiBieXRlIGFsaWduZWQhICovCisJCUJVR19PTihyeGItPnBhZ2VfZG1hICYgRE1BX0JJVF9NQVNLKDgpKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkJbGlzdF9hZGRfdGFpbCgmcnhiLT5saXN0LCAmcnhxLT5yeF9mcmVlKTsKKwkJcnhxLT5mcmVlX2NvdW50Kys7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJfQorfQorCit2b2lkIGl3bGFnbl9yeF9yZXBsZW5pc2goc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpd2xhZ25fcnhfYWxsb2NhdGUocHJpdiwgR0ZQX0tFUk5FTCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWl3bGFnbl9yeF9xdWV1ZV9yZXN0b2NrKHByaXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgaXdsYWduX3J4X3JlcGxlbmlzaF9ub3coc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCWl3bGFnbl9yeF9hbGxvY2F0ZShwcml2LCBHRlBfQVRPTUlDKTsKKworCWl3bGFnbl9yeF9xdWV1ZV9yZXN0b2NrKHByaXYpOworfQorCit2b2lkIGl3bF9iZ19yeF9yZXBsZW5pc2goc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9CisJICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIHJ4X3JlcGxlbmlzaCk7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwlpd2xhZ25fcnhfcmVwbGVuaXNoKHByaXYpOworCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworfQorCisvKioKKyAqIGl3bF9yeF9oYW5kbGUgLSBNYWluIGVudHJ5IGZ1bmN0aW9uIGZvciByZWNlaXZpbmcgcmVzcG9uc2VzIGZyb20gdUNvZGUKKyAqCisgKiBVc2VzIHRoZSBwcml2LT5yeF9oYW5kbGVycyBjYWxsYmFjayBmdW5jdGlvbiBhcnJheSB0byBpbnZva2UKKyAqIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVycywgaW5jbHVkaW5nIGNvbW1hbmQgcmVzcG9uc2VzLAorICogZnJhbWUtcmVjZWl2ZWQgbm90aWZpY2F0aW9ucywgYW5kIG90aGVyIG5vdGlmaWNhdGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkIGl3bF9yeF9oYW5kbGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOworCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3Q7CisJc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKKwl1MzIgciwgaTsKKwlpbnQgcmVjbGFpbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGZpbGxfcnggPSAwOworCXUzMiBjb3VudCA9IDg7CisJaW50IHRvdGFsX2VtcHR5OworCisJLyogdUNvZGUncyByZWFkIGluZGV4IChzdG9yZWQgaW4gc2hhcmVkIERSQU0pIGluZGljYXRlcyB0aGUgbGFzdCBSeAorCSAqIGJ1ZmZlciB0aGF0IHRoZSBkcml2ZXIgbWF5IHByb2Nlc3MgKGxhc3QgYnVmZmVyIGZpbGxlZCBieSB1Y29kZSkuICovCisJciA9IGxlMTZfdG9fY3B1KHJ4cS0+cmJfc3R0cy0+Y2xvc2VkX3JiX251bSkgJiAgMHgwRkZGOworCWkgPSByeHEtPnJlYWQ7CisKKwkvKiBSeCBpbnRlcnJ1cHQsIGJ1dCBub3RoaW5nIHNlbnQgZnJvbSB1Q29kZSAqLworCWlmIChpID09IHIpCisJCUlXTF9ERUJVR19SWChwcml2LCAiciA9ICVkLCBpID0gJWRcbiIsIHIsIGkpOworCisJLyogY2FsY3VsYXRlIHRvdGFsIGZyYW1lcyBuZWVkIHRvIGJlIHJlc3RvY2sgYWZ0ZXIgaGFuZGxpbmcgUlggKi8KKwl0b3RhbF9lbXB0eSA9IHIgLSByeHEtPndyaXRlX2FjdHVhbDsKKwlpZiAodG90YWxfZW1wdHkgPCAwKQorCQl0b3RhbF9lbXB0eSArPSBSWF9RVUVVRV9TSVpFOworCisJaWYgKHRvdGFsX2VtcHR5ID4gKFJYX1FVRVVFX1NJWkUgLyAyKSkKKwkJZmlsbF9yeCA9IDE7CisKKwl3aGlsZSAoaSAhPSByKSB7CisJCWludCBsZW47CisKKwkJcnhiID0gcnhxLT5xdWV1ZVtpXTsKKworCQkvKiBJZiBhbiBSWEIgZG9lc24ndCBoYXZlIGEgUnggcXVldWUgc2xvdCBhc3NvY2lhdGVkIHdpdGggaXQsCisJCSAqIHRoZW4gYSBidWcgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiB0aGUgcXVldWUgcmVmaWxsaW5nCisJCSAqIHJvdXRpbmVzIC0tIGNhdGNoIGl0IGhlcmUgKi8KKwkJaWYgKFdBUk5fT04ocnhiID09IE5VTEwpKSB7CisJCQlpID0gKGkgKyAxKSAmIFJYX1FVRVVFX01BU0s7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJ4cS0+cXVldWVbaV0gPSBOVUxMOworCisJCWRtYV91bm1hcF9wYWdlKHByaXYtPmJ1cy0+ZGV2LCByeGItPnBhZ2VfZG1hLAorCQkJICAgICAgIFBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCQlwa3QgPSByeGJfYWRkcihyeGIpOworCisJCUlXTF9ERUJVR19SWChwcml2LCAiciA9ICVkLCBpID0gJWQsICVzLCAweCUwMnhcbiIsIHIsCisJCQlpLCBnZXRfY21kX3N0cmluZyhwa3QtPmhkci5jbWQpLCBwa3QtPmhkci5jbWQpOworCisJCWxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgRkhfUlNDU1JfRlJBTUVfU0laRV9NU0s7CisJCWxlbiArPSBzaXplb2YodTMyKTsgLyogYWNjb3VudCBmb3Igc3RhdHVzIHdvcmQgKi8KKwkJdHJhY2VfaXdsd2lmaV9kZXZfcngocHJpdiwgcGt0LCBsZW4pOworCisJCS8qIFJlY2xhaW0gYSBjb21tYW5kIGJ1ZmZlciBvbmx5IGlmIHRoaXMgcGFja2V0IGlzIGEgcmVzcG9uc2UKKwkJICogICB0byBhIChkcml2ZXItb3JpZ2luYXRlZCkgY29tbWFuZC4KKwkJICogSWYgdGhlIHBhY2tldCAoZS5nLiBSeCBmcmFtZSkgb3JpZ2luYXRlZCBmcm9tIHVDb2RlLAorCQkgKiAgIHRoZXJlIGlzIG5vIGNvbW1hbmQgYnVmZmVyIHRvIHJlY2xhaW0uCisJCSAqIFVjb2RlIHNob3VsZCBzZXQgU0VRX1JYX0ZSQU1FIGJpdCBpZiB1Y29kZS1vcmlnaW5hdGVkLAorCQkgKiAgIGJ1dCBhcHBhcmVudGx5IGEgZmV3IGRvbid0IGdldCBzZXQ7IGNhdGNoIHRoZW0gaGVyZS4gKi8KKwkJcmVjbGFpbSA9ICEocGt0LT5oZHIuc2VxdWVuY2UgJiBTRVFfUlhfRlJBTUUpICYmCisJCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1JYX1BIWV9DTUQpICYmCisJCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1JYKSAmJgorCQkJKHBrdC0+aGRyLmNtZCAhPSBSRVBMWV9SWF9NUERVX0NNRCkgJiYKKwkJCShwa3QtPmhkci5jbWQgIT0gUkVQTFlfQ09NUFJFU1NFRF9CQSkgJiYKKwkJCShwa3QtPmhkci5jbWQgIT0gU1RBVElTVElDU19OT1RJRklDQVRJT04pICYmCisJCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1RYKTsKKworCQlpd2xfcnhfZGlzcGF0Y2gocHJpdiwgcnhiKTsKKworCQkvKgorCQkgKiBYWFg6IEFmdGVyIGhlcmUsIHdlIHNob3VsZCBhbHdheXMgY2hlY2sgcnhiLT5wYWdlCisJCSAqIGFnYWluc3QgTlVMTCBiZWZvcmUgdG91Y2hpbmcgaXQgb3IgaXRzIHZpcnR1YWwKKwkJICogbWVtb3J5IChwa3QpLiBCZWNhdXNlIHNvbWUgcnhfaGFuZGxlciBtaWdodCBoYXZlCisJCSAqIGFscmVhZHkgdGFrZW4gb3IgZnJlZWQgdGhlIHBhZ2VzLgorCQkgKi8KKworCQlpZiAocmVjbGFpbSkgeworCQkJLyogSW52b2tlIGFueSBjYWxsYmFja3MsIHRyYW5zZmVyIHRoZSBidWZmZXIgdG8gY2FsbGVyLAorCQkJICogYW5kIGZpcmUgb2ZmIHRoZSAocG9zc2libHkpIGJsb2NraW5nCisJCQkgKiB0cmFuc19zZW5kX2NtZCgpCisJCQkgKiBhcyB3ZSByZWNsYWltIHRoZSBkcml2ZXIgY29tbWFuZCBxdWV1ZSAqLworCQkJaWYgKHJ4Yi0+cGFnZSkKKwkJCQlpd2xfdHhfY21kX2NvbXBsZXRlKHByaXYsIHJ4Yik7CisJCQllbHNlCisJCQkJSVdMX1dBUk4ocHJpdiwgIkNsYWltIG51bGwgcnhiP1xuIik7CisJCX0KKworCQkvKiBSZXVzZSB0aGUgcGFnZSBpZiBwb3NzaWJsZS4gRm9yIG5vdGlmaWNhdGlvbiBwYWNrZXRzIGFuZAorCQkgKiBTS0JzIHRoYXQgZmFpbCB0byBSeCBjb3JyZWN0bHksIGFkZCB0aGVtIGJhY2sgaW50byB0aGUKKwkJICogcnhfZnJlZSBsaXN0IGZvciByZXVzZSBsYXRlci4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQlpZiAocnhiLT5wYWdlICE9IE5VTEwpIHsKKwkJCXJ4Yi0+cGFnZV9kbWEgPSBkbWFfbWFwX3BhZ2UocHJpdi0+YnVzLT5kZXYsIHJ4Yi0+cGFnZSwKKwkJCQkwLCBQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCisJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7CisJCQlyeHEtPmZyZWVfY291bnQrKzsKKwkJfSBlbHNlCisJCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X3VzZWQpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWkgPSAoaSArIDEpICYgUlhfUVVFVUVfTUFTSzsKKwkJLyogSWYgdGhlcmUgYXJlIGEgbG90IG9mIHVudXNlZCBmcmFtZXMsCisJCSAqIHJlc3RvY2sgdGhlIFJ4IHF1ZXVlIHNvIHVjb2RlIHdvbnQgYXNzZXJ0LiAqLworCQlpZiAoZmlsbF9yeCkgeworCQkJY291bnQrKzsKKwkJCWlmIChjb3VudCA+PSA4KSB7CisJCQkJcnhxLT5yZWFkID0gaTsKKwkJCQlpd2xhZ25fcnhfcmVwbGVuaXNoX25vdyhwcml2KTsKKwkJCQljb3VudCA9IDA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBCYWNrdHJhY2sgb25lIGVudHJ5ICovCisJcnhxLT5yZWFkID0gaTsKKwlpZiAoZmlsbF9yeCkKKwkJaXdsYWduX3J4X3JlcGxlbmlzaF9ub3cocHJpdik7CisJZWxzZQorCQlpd2xhZ25fcnhfcXVldWVfcmVzdG9jayhwcml2KTsKK30KKworLyogdGFza2xldCBmb3IgaXdsYWduIGludGVycnVwdCAqLwordm9pZCBpd2xfaXJxX3Rhc2tsZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCXUzMiBpbnRhID0gMDsKKwl1MzIgaGFuZGxlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgaTsKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRworCXUzMiBpbnRhX21hc2s7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBBY2svY2xlYXIvcmVzZXQgcGVuZGluZyB1Q29kZSBpbnRlcnJ1cHRzLgorCSAqIE5vdGU6ICBTb21lIGJpdHMgaW4gQ1NSX0lOVCBhcmUgIk9SIiBvZiBiaXRzIGluIENTUl9GSF9JTlRfU1RBVFVTLAorCSAqLworCS8qIFRoZXJlIGlzIGEgaGFyZHdhcmUgYnVnIGluIHRoZSBpbnRlcnJ1cHQgbWFzayBmdW5jdGlvbiB0aGF0IHNvbWUKKwkgKiBpbnRlcnJ1cHRzIChpLmUuIENTUl9JTlRfQklUX1NDRCkgY2FuIHN0aWxsIGJlIGdlbmVyYXRlZCBldmVuIGlmCisJICogdGhleSBhcmUgZGlzYWJsZWQgaW4gdGhlIENTUl9JTlRfTUFTSyByZWdpc3Rlci4gRnVydGhlcm1vcmUgdGhlCisJICogSUNUIGludGVycnVwdCBoYW5kbGluZyBtZWNoYW5pc20gaGFzIGFub3RoZXIgYnVnIHRoYXQgbWlnaHQgY2F1c2UKKwkgKiB0aGVzZSB1bm1hc2tlZCBpbnRlcnJ1cHRzIGZhaWwgdG8gYmUgZGV0ZWN0ZWQuIFdlIHdvcmthcm91bmQgdGhlCisJICogaGFyZHdhcmUgYnVncyBoZXJlIGJ5IEFDS2luZyBhbGwgdGhlIHBvc3NpYmxlIGludGVycnVwdHMgc28gdGhhdAorCSAqIGludGVycnVwdCBjb2FsZXNjaW5nIGNhbiBzdGlsbCBiZSBhY2hpZXZlZC4KKwkgKi8KKwlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCBwcml2LT5pbnRhIHwgfnByaXYtPmludGFfbWFzayk7CisKKwlpbnRhID0gcHJpdi0+aW50YTsKKworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCisJaWYgKGl3bF9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiBJV0xfRExfSVNSKSB7CisJCS8qIGp1c3QgZm9yIGRlYnVnICovCisJCWludGFfbWFzayA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVF9NQVNLKTsKKwkJSVdMX0RFQlVHX0lTUihwcml2LCAiaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4XG4gIiwKKwkJCQlpbnRhLCBpbnRhX21hc2spOworCX0KKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogc2F2ZWQgaW50ZXJydXB0IGluIGludGEgdmFyaWFibGUgbm93IHdlIGNhbiByZXNldCBwcml2LT5pbnRhICovCisJcHJpdi0+aW50YSA9IDA7CisKKwkvKiBOb3cgc2VydmljZSBhbGwgaW50ZXJydXB0IGJpdHMgZGlzY292ZXJlZCBhYm92ZS4gKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX0hXX0VSUikgeworCQlJV0xfRVJSKHByaXYsICJIYXJkd2FyZSBlcnJvciBkZXRlY3RlZC4gIFJlc3RhcnRpbmcuXG4iKTsKKworCQkvKiBUZWxsIHRoZSBkZXZpY2UgdG8gc3RvcCBzZW5kaW5nIGludGVycnVwdHMgKi8KKwkJaXdsX2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKKworCQlwcml2LT5pc3Jfc3RhdHMuaHcrKzsKKwkJaXdsX2lycV9oYW5kbGVfZXJyb3IocHJpdik7CisKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9IV19FUlI7CisKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCisJaWYgKGl3bF9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiAoSVdMX0RMX0lTUikpIHsKKwkJLyogTklDIGZpcmVzIHRoaXMsIGJ1dCB3ZSBkb24ndCB1c2UgaXQsIHJlZHVuZGFudCB3aXRoIFdBS0VVUCAqLworCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1NDRCkgeworCQkJSVdMX0RFQlVHX0lTUihwcml2LCAiU2NoZWR1bGVyIGZpbmlzaGVkIHRvIHRyYW5zbWl0ICIKKwkJCQkgICAgICAidGhlIGZyYW1lL2ZyYW1lcy5cbiIpOworCQkJcHJpdi0+aXNyX3N0YXRzLnNjaCsrOworCQl9CisKKwkJLyogQWxpdmUgbm90aWZpY2F0aW9uIHZpYSBSeCBpbnRlcnJ1cHQgd2lsbCBkbyB0aGUgcmVhbCB3b3JrICovCisJCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfQUxJVkUpIHsKKwkJCUlXTF9ERUJVR19JU1IocHJpdiwgIkFsaXZlIGludGVycnVwdFxuIik7CisJCQlwcml2LT5pc3Jfc3RhdHMuYWxpdmUrKzsKKwkJfQorCX0KKyNlbmRpZgorCS8qIFNhZmVseSBpZ25vcmUgdGhlc2UgYml0cyBmb3IgZGVidWcgY2hlY2tzIGJlbG93ICovCisJaW50YSAmPSB+KENTUl9JTlRfQklUX1NDRCB8IENTUl9JTlRfQklUX0FMSVZFKTsKKworCS8qIEhXIFJGIEtJTEwgc3dpdGNoIHRvZ2dsZWQgKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX1JGX0tJTEwpIHsKKwkJaW50IGh3X3JmX2tpbGwgPSAwOworCQlpZiAoIShpd2xfcmVhZDMyKHByaXYsIENTUl9HUF9DTlRSTCkgJgorCQkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKSkKKwkJCWh3X3JmX2tpbGwgPSAxOworCisJCUlXTF9XQVJOKHByaXYsICJSRl9LSUxMIGJpdCB0b2dnbGVkIHRvICVzLlxuIiwKKwkJCQlod19yZl9raWxsID8gImRpc2FibGUgcmFkaW8iIDogImVuYWJsZSByYWRpbyIpOworCisJCXByaXYtPmlzcl9zdGF0cy5yZmtpbGwrKzsKKworCQkvKiBkcml2ZXIgb25seSBsb2FkcyB1Y29kZSBvbmNlIHNldHRpbmcgdGhlIGludGVyZmFjZSB1cC4KKwkJICogdGhlIGRyaXZlciBhbGxvd3MgbG9hZGluZyB0aGUgdWNvZGUgZXZlbiBpZiB0aGUgcmFkaW8KKwkJICogaXMga2lsbGVkLiBIZW5jZSB1cGRhdGUgdGhlIGtpbGxzd2l0Y2ggc3RhdGUgaGVyZS4gVGhlCisJCSAqIHJma2lsbCBoYW5kbGVyIHdpbGwgY2FyZSBhYm91dCByZXN0YXJ0aW5nIGlmIG5lZWRlZC4KKwkJICovCisJCWlmICghdGVzdF9iaXQoU1RBVFVTX0FMSVZFLCAmcHJpdi0+c3RhdHVzKSkgeworCQkJaWYgKGh3X3JmX2tpbGwpCisJCQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7CisJCQllbHNlCisJCQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKKwkJCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUocHJpdi0+aHctPndpcGh5LCBod19yZl9raWxsKTsKKwkJfQorCisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfUkZfS0lMTDsKKwl9CisKKwkvKiBDaGlwIGdvdCB0b28gaG90IGFuZCBzdG9wcGVkIGl0c2VsZiAqLworCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfQ1RfS0lMTCkgeworCQlJV0xfRVJSKHByaXYsICJNaWNyb2NvZGUgQ1Qga2lsbCBlcnJvciBkZXRlY3RlZC5cbiIpOworCQlwcml2LT5pc3Jfc3RhdHMuY3RraWxsKys7CisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfQ1RfS0lMTDsKKwl9CisKKwkvKiBFcnJvciBkZXRlY3RlZCBieSB1Q29kZSAqLworCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfU1dfRVJSKSB7CisJCUlXTF9FUlIocHJpdiwgIk1pY3JvY29kZSBTVyBlcnJvciBkZXRlY3RlZC4gIgorCQkJIiBSZXN0YXJ0aW5nIDB4JVguXG4iLCBpbnRhKTsKKwkJcHJpdi0+aXNyX3N0YXRzLnN3Kys7CisJCWl3bF9pcnFfaGFuZGxlX2Vycm9yKHByaXYpOworCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX1NXX0VSUjsKKwl9CisKKwkvKiB1Q29kZSB3YWtlcyB1cCBhZnRlciBwb3dlci1kb3duIHNsZWVwICovCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9XQUtFVVApIHsKKwkJSVdMX0RFQlVHX0lTUihwcml2LCAiV2FrZXVwIGludGVycnVwdFxuIik7CisJCWl3bF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHByaXYsICZwcml2LT5yeHEpOworCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBpKyspCisJCQlpd2xfdHhxX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgJnByaXYtPnR4cVtpXSk7CisKKwkJcHJpdi0+aXNyX3N0YXRzLndha2V1cCsrOworCisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfV0FLRVVQOworCX0KKworCS8qIEFsbCB1Q29kZSBjb21tYW5kIHJlc3BvbnNlcywgaW5jbHVkaW5nIFR4IGNvbW1hbmQgcmVzcG9uc2VzLAorCSAqIFJ4ICJyZXNwb25zZXMiIChmcmFtZS1yZWNlaXZlZCBub3RpZmljYXRpb24pLCBhbmQgb3RoZXIKKwkgKiBub3RpZmljYXRpb25zIGZyb20gdUNvZGUgY29tZSB0aHJvdWdoIGhlcmUqLworCWlmIChpbnRhICYgKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlggfAorCQkJQ1NSX0lOVF9CSVRfUlhfUEVSSU9ESUMpKSB7CisJCUlXTF9ERUJVR19JU1IocHJpdiwgIlJ4IGludGVycnVwdFxuIik7CisJCWlmIChpbnRhICYgKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlgpKSB7CisJCQloYW5kbGVkIHw9IChDU1JfSU5UX0JJVF9GSF9SWCB8IENTUl9JTlRfQklUX1NXX1JYKTsKKwkJCWl3bF93cml0ZTMyKHByaXYsIENTUl9GSF9JTlRfU1RBVFVTLAorCQkJCQlDU1JfRkhfSU5UX1JYX01BU0spOworCQl9CisJCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfUlhfUEVSSU9ESUMpIHsKKwkJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfUlhfUEVSSU9ESUM7CisJCQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCBDU1JfSU5UX0JJVF9SWF9QRVJJT0RJQyk7CisJCX0KKwkJLyogU2VuZGluZyBSWCBpbnRlcnJ1cHQgcmVxdWlyZSBtYW55IHN0ZXBzIHRvIGJlIGRvbmUgaW4gdGhlCisJCSAqIHRoZSBkZXZpY2U6CisJCSAqIDEtIHdyaXRlIGludGVycnVwdCB0byBjdXJyZW50IGluZGV4IGluIElDVCB0YWJsZS4KKwkJICogMi0gZG1hIFJYIGZyYW1lLgorCQkgKiAzLSB1cGRhdGUgUlggc2hhcmVkIGRhdGEgdG8gaW5kaWNhdGUgbGFzdCB3cml0ZSBpbmRleC4KKwkJICogNC0gc2VuZCBpbnRlcnJ1cHQuCisJCSAqIFRoaXMgY291bGQgbGVhZCB0byBSWCByYWNlLCBkcml2ZXIgY291bGQgcmVjZWl2ZSBSWCBpbnRlcnJ1cHQKKwkJICogYnV0IHRoZSBzaGFyZWQgZGF0YSBjaGFuZ2VzIGRvZXMgbm90IHJlZmxlY3QgdGhpczsKKwkJICogcGVyaW9kaWMgaW50ZXJydXB0IHdpbGwgZGV0ZWN0IGFueSBkYW5nbGluZyBSeCBhY3Rpdml0eS4KKwkJICovCisKKwkJLyogRGlzYWJsZSBwZXJpb2RpYyBpbnRlcnJ1cHQ7IHdlIHVzZSBpdCBhcyBqdXN0IGEgb25lLXNob3QuICovCisJCWl3bF93cml0ZTgocHJpdiwgQ1NSX0lOVF9QRVJJT0RJQ19SRUcsCisJCQkgICAgQ1NSX0lOVF9QRVJJT0RJQ19ESVMpOworCQlpd2xfcnhfaGFuZGxlKHByaXYpOworCisJCS8qCisJCSAqIEVuYWJsZSBwZXJpb2RpYyBpbnRlcnJ1cHQgaW4gOCBtc2VjIG9ubHkgaWYgd2UgcmVjZWl2ZWQKKwkJICogcmVhbCBSWCBpbnRlcnJ1cHQgKGluc3RlYWQgb2YganVzdCBwZXJpb2RpYyBpbnQpLCB0byBjYXRjaAorCQkgKiBhbnkgZGFuZ2xpbmcgUnggaW50ZXJydXB0LiAgSWYgaXQgd2FzIGp1c3QgdGhlIHBlcmlvZGljCisJCSAqIGludGVycnVwdCwgdGhlcmUgd2FzIG5vIGRhbmdsaW5nIFJ4IGFjdGl2aXR5LCBhbmQgbm8gbmVlZAorCQkgKiB0byBleHRlbmQgdGhlIHBlcmlvZGljIGludGVycnVwdDsgb25lLXNob3QgaXMgZW5vdWdoLgorCQkgKi8KKwkJaWYgKGludGEgJiAoQ1NSX0lOVF9CSVRfRkhfUlggfCBDU1JfSU5UX0JJVF9TV19SWCkpCisJCQlpd2xfd3JpdGU4KHByaXYsIENTUl9JTlRfUEVSSU9ESUNfUkVHLAorCQkJCSAgICBDU1JfSU5UX1BFUklPRElDX0VOQSk7CisKKwkJcHJpdi0+aXNyX3N0YXRzLnJ4Kys7CisJfQorCisJLyogVGhpcyAiVHgiIERNQSBjaGFubmVsIGlzIHVzZWQgb25seSBmb3IgbG9hZGluZyB1Q29kZSAqLworCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfRkhfVFgpIHsKKwkJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0ZIX0lOVF9TVEFUVVMsIENTUl9GSF9JTlRfVFhfTUFTSyk7CisJCUlXTF9ERUJVR19JU1IocHJpdiwgInVDb2RlIGxvYWQgaW50ZXJydXB0XG4iKTsKKwkJcHJpdi0+aXNyX3N0YXRzLnR4Kys7CisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfRkhfVFg7CisJCS8qIFdha2UgdXAgdUNvZGUgbG9hZCByb3V0aW5lLCBub3cgdGhhdCBsb2FkIGlzIGNvbXBsZXRlICovCisJCXByaXYtPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOworCX0KKworCWlmIChpbnRhICYgfmhhbmRsZWQpIHsKKwkJSVdMX0VSUihwcml2LCAiVW5oYW5kbGVkIElOVEEgYml0cyAweCUwOHhcbiIsIGludGEgJiB+aGFuZGxlZCk7CisJCXByaXYtPmlzcl9zdGF0cy51bmhhbmRsZWQrKzsKKwl9CisKKwlpZiAoaW50YSAmIH4ocHJpdi0+aW50YV9tYXNrKSkgeworCQlJV0xfV0FSTihwcml2LCAiRGlzYWJsZWQgSU5UQSBiaXRzIDB4JTA4eCB3ZXJlIHBlbmRpbmdcbiIsCisJCQkgaW50YSAmIH5wcml2LT5pbnRhX21hc2spOworCX0KKworCS8qIFJlLWVuYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCS8qIG9ubHkgUmUtZW5hYmxlIGlmIGRpc2FibGVkIGJ5IGlycSAqLworCWlmICh0ZXN0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZwcml2LT5zdGF0dXMpKQorCQlpd2xfZW5hYmxlX2ludGVycnVwdHMocHJpdik7CisJLyogUmUtZW5hYmxlIFJGX0tJTEwgaWYgaXQgb2NjdXJyZWQgKi8KKwllbHNlIGlmIChoYW5kbGVkICYgQ1NSX0lOVF9CSVRfUkZfS0lMTCkKKwkJaXdsX2VuYWJsZV9yZmtpbGxfaW50KHByaXYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSUNUIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElDVF9DT1VOVCAoUEFHRV9TSVpFL3NpemVvZih1MzIpKQorCisvKiBGcmVlIGRyYW0gdGFibGUgKi8KK3ZvaWQgaXdsX2ZyZWVfaXNyX2ljdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJaWYgKHByaXYtPmljdF90YmxfdmlyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KHByaXYtPmJ1cy0+ZGV2LAorCQkJCSAgKHNpemVvZih1MzIpICogSUNUX0NPVU5UKSArIFBBR0VfU0laRSwKKwkJCQkgIHByaXYtPmljdF90YmxfdmlyLAorCQkJCSAgcHJpdi0+aWN0X3RibF9kbWEpOworCQlwcml2LT5pY3RfdGJsX3ZpciA9IE5VTEw7CisJCW1lbXNldCgmcHJpdi0+aWN0X3RibF9kbWEsIDAsCisJCQlzaXplb2YocHJpdi0+aWN0X3RibF9kbWEpKTsKKwkJbWVtc2V0KCZwcml2LT5hbGlnbmVkX2ljdF90YmxfZG1hLCAwLAorCQkJc2l6ZW9mKHByaXYtPmFsaWduZWRfaWN0X3RibF9kbWEpKTsKKwl9Cit9CisKKworLyogYWxsb2NhdGUgZHJhbSBzaGFyZWQgdGFibGUgaXQgaXMgYSBQQUdFX1NJWkUgYWxpZ25lZAorICogYWxzbyByZXNldCBhbGwgZGF0YSByZWxhdGVkIHRvIElDVCB0YWJsZSBpbnRlcnJ1cHQuCisgKi8KK2ludCBpd2xfYWxsb2NfaXNyX2ljdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisKKwkvKiBhbGxvY2F0ZSBzaHJhcmVkIGRhdGEgdGFibGUgKi8KKwlwcml2LT5pY3RfdGJsX3ZpciA9CisJCWRtYV9hbGxvY19jb2hlcmVudChwcml2LT5idXMtPmRldiwKKwkJCQkgICAoc2l6ZW9mKHUzMikgKiBJQ1RfQ09VTlQpICsgUEFHRV9TSVpFLAorCQkJCSAgICZwcml2LT5pY3RfdGJsX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5pY3RfdGJsX3ZpcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBhbGlnbiB0YWJsZSB0byBQQUdFX1NJWkUgYm91bmRhcnkgKi8KKwlwcml2LT5hbGlnbmVkX2ljdF90YmxfZG1hID0KKwkJQUxJR04ocHJpdi0+aWN0X3RibF9kbWEsIFBBR0VfU0laRSk7CisKKwlJV0xfREVCVUdfSVNSKHByaXYsICJpY3QgZG1hIGFkZHIgJUx4IGRtYSBhbGlnbmVkICVMeCBkaWZmICVkXG4iLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXByaXYtPmljdF90YmxfZG1hLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXByaXYtPmFsaWduZWRfaWN0X3RibF9kbWEsCisJCQkgICAgIChpbnQpKHByaXYtPmFsaWduZWRfaWN0X3RibF9kbWEgLQorCQkJICAgICBwcml2LT5pY3RfdGJsX2RtYSkpOworCisJcHJpdi0+aWN0X3RibCA9ICBwcml2LT5pY3RfdGJsX3ZpciArCisJCQkgIChwcml2LT5hbGlnbmVkX2ljdF90YmxfZG1hIC0KKwkJCSAgcHJpdi0+aWN0X3RibF9kbWEpOworCisJSVdMX0RFQlVHX0lTUihwcml2LCAiaWN0IHZpciBhZGRyICVwIHZpciBhbGlnbmVkICVwIGRpZmYgJWRcbiIsCisJCQkgICAgIHByaXYtPmljdF90YmwsIHByaXYtPmljdF90YmxfdmlyLAorCQkJKGludCkocHJpdi0+YWxpZ25lZF9pY3RfdGJsX2RtYSAtCisJCQkgICAgcHJpdi0+aWN0X3RibF9kbWEpKTsKKworCS8qIHJlc2V0IHRhYmxlIGFuZCBpbmRleCB0byBhbGwgMCAqLworCW1lbXNldChwcml2LT5pY3RfdGJsX3ZpciwgMCwKKwkJKHNpemVvZih1MzIpICogSUNUX0NPVU5UKSArIFBBR0VfU0laRSk7CisJcHJpdi0+aWN0X2luZGV4ID0gMDsKKworCS8qIGFkZCBwZXJpb2RpYyBSWCBpbnRlcnJ1cHQgKi8KKwlwcml2LT5pbnRhX21hc2sgfD0gQ1NSX0lOVF9CSVRfUlhfUEVSSU9ESUM7CisJcmV0dXJuIDA7Cit9CisKKy8qIERldmljZSBpcyBnb2luZyB1cCBpbmZvcm0gaXQgYWJvdXQgdXNpbmcgSUNUIGludGVycnVwdCB0YWJsZSwKKyAqIGFsc28gd2UgbmVlZCB0byB0ZWxsIHRoZSBkcml2ZXIgdG8gc3RhcnQgdXNpbmcgSUNUIGludGVycnVwdC4KKyAqLworaW50IGl3bF9yZXNldF9pY3Qoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghcHJpdi0+aWN0X3RibF92aXIpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlpd2xfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOworCisJbWVtc2V0KCZwcml2LT5pY3RfdGJsWzBdLCAwLCBzaXplb2YodTMyKSAqIElDVF9DT1VOVCk7CisKKwl2YWwgPSBwcml2LT5hbGlnbmVkX2ljdF90YmxfZG1hID4+IFBBR0VfU0hJRlQ7CisKKwl2YWwgfD0gQ1NSX0RSQU1fSU5UX1RCTF9FTkFCTEU7CisJdmFsIHw9IENTUl9EUkFNX0lOSVRfVEJMX1dSQVBfQ0hFQ0s7CisKKwlJV0xfREVCVUdfSVNSKHByaXYsICJDU1JfRFJBTV9JTlRfVEJMX1JFRyA9MHglWCAiCisJCQkiYWxpZ25lZCBkbWEgYWRkcmVzcyAlTHhcbiIsCisJCQl2YWwsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXByaXYtPmFsaWduZWRfaWN0X3RibF9kbWEpOworCisJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0RSQU1fSU5UX1RCTF9SRUcsIHZhbCk7CisJcHJpdi0+dXNlX2ljdCA9IHRydWU7CisJcHJpdi0+aWN0X2luZGV4ID0gMDsKKwlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCBwcml2LT5pbnRhX21hc2spOworCWl3bF9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGV2aWNlIGlzIGdvaW5nIGRvd24gZGlzYWJsZSBpY3QgaW50ZXJydXB0IHVzYWdlICovCit2b2lkIGl3bF9kaXNhYmxlX2ljdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcHJpdi0+dXNlX2ljdCA9IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGl3bF9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkYXRhOworCXUzMiBpbnRhLCBpbnRhX21hc2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRworCXUzMiBpbnRhX2ZoOworI2VuZGlmCisJaWYgKCFwcml2KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogRGlzYWJsZSAoYnV0IGRvbid0IGNsZWFyISkgaW50ZXJydXB0cyBoZXJlIHRvIGF2b2lkCisJICogICAgYmFjay10by1iYWNrIElTUnMgYW5kIHNwb3JhZGljIGludGVycnVwdHMgZnJvbSBvdXIgTklDLgorCSAqIElmIHdlIGhhdmUgc29tZXRoaW5nIHRvIHNlcnZpY2UsIHRoZSB0YXNrbGV0IHdpbGwgcmUtZW5hYmxlIGludHMuCisJICogSWYgd2UgKmRvbid0KiBoYXZlIHNvbWV0aGluZywgd2UnbGwgcmUtZW5hYmxlIGJlZm9yZSBsZWF2aW5nIGhlcmUuICovCisJaW50YV9tYXNrID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UX01BU0spOyAgLyoganVzdCBmb3IgZGVidWcgKi8KKwlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5UX01BU0ssIDB4MDAwMDAwMDApOworCisJLyogRGlzY292ZXIgd2hpY2ggaW50ZXJydXB0cyBhcmUgYWN0aXZlL3BlbmRpbmcgKi8KKwlpbnRhID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UKTsKKworCS8qIElnbm9yZSBpbnRlcnJ1cHQgaWYgdGhlcmUncyBub3RoaW5nIGluIE5JQyB0byBzZXJ2aWNlLgorCSAqIFRoaXMgbWF5IGJlIGR1ZSB0byBJUlEgc2hhcmVkIHdpdGggYW5vdGhlciBkZXZpY2UsCisJICogb3IgZHVlIHRvIHNwb3JhZGljIGludGVycnVwdHMgdGhyb3duIGZyb20gb3VyIE5JQy4gKi8KKwlpZiAoIWludGEpIHsKKwkJSVdMX0RFQlVHX0lTUihwcml2LCAiSWdub3JlIGludGVycnVwdCwgaW50YSA9PSAwXG4iKTsKKwkJZ290byBub25lOworCX0KKworCWlmICgoaW50YSA9PSAweEZGRkZGRkZGKSB8fCAoKGludGEgJiAweEZGRkZGRkYwKSA9PSAweGE1YTVhNWEwKSkgeworCQkvKiBIYXJkd2FyZSBkaXNhcHBlYXJlZC4gSXQgbWlnaHQgaGF2ZSBhbHJlYWR5IHJhaXNlZAorCQkgKiBhbiBpbnRlcnJ1cHQgKi8KKwkJSVdMX1dBUk4ocHJpdiwgIkhBUkRXQVJFIEdPTkU/PyBJTlRBID09IDB4JTA4eFxuIiwgaW50YSk7CisJCWdvdG8gdW5wbHVnZ2VkOworCX0KKworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCisJaWYgKGl3bF9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiAoSVdMX0RMX0lTUikpIHsKKwkJaW50YV9maCA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0ZIX0lOVF9TVEFUVVMpOworCQlJV0xfREVCVUdfSVNSKHByaXYsICJJU1IgaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCAiCisJCQkgICAgICAiZmggMHglMDh4XG4iLCBpbnRhLCBpbnRhX21hc2ssIGludGFfZmgpOworCX0KKyNlbmRpZgorCisJcHJpdi0+aW50YSB8PSBpbnRhOworCS8qIGl3bF9pcnFfdGFza2xldCgpIHdpbGwgc2VydmljZSBpbnRlcnJ1cHRzIGFuZCByZS1lbmFibGUgdGhlbSAqLworCWlmIChsaWtlbHkoaW50YSkpCisJCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV90YXNrbGV0KTsKKwllbHNlIGlmICh0ZXN0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZwcml2LT5zdGF0dXMpICYmCisJCQkhcHJpdi0+aW50YSkKKwkJaXdsX2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOworCisgdW5wbHVnZ2VkOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKyBub25lOgorCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGhlcmUgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBzZXJ2aWNlLiAqLworCS8qIG9ubHkgUmUtZW5hYmxlIGlmIGRpc2FibGVkIGJ5IGlycSAgYW5kIG5vIHNjaGVkdWxlcyB0YXNrbGV0LiAqLworCWlmICh0ZXN0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZwcml2LT5zdGF0dXMpICYmICFwcml2LT5pbnRhKQorCQlpd2xfZW5hYmxlX2ludGVycnVwdHMocHJpdik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9OT05FOworfQorCisvKiBpbnRlcnJ1cHQgaGFuZGxlciB1c2luZyBpY3QgdGFibGUsIHdpdGggdGhpcyBpbnRlcnJ1cHQgZHJpdmVyIHdpbGwKKyAqIHN0b3AgdXNpbmcgSU5UQSByZWdpc3RlciB0byBnZXQgZGV2aWNlJ3MgaW50ZXJydXB0LCByZWFkaW5nIHRoaXMgcmVnaXN0ZXIKKyAqIGlzIGV4cGVuc2l2ZSwgZGV2aWNlIHdpbGwgd3JpdGUgaW50ZXJydXB0cyBpbiBJQ1QgZHJhbSB0YWJsZSwgaW5jcmVtZW50CisgKiBpbmRleCB0aGVuIHdpbGwgZmlyZSBpbnRlcnJ1cHQgdG8gZHJpdmVyLCBkcml2ZXIgd2lsbCBPUiBhbGwgSUNUIHRhYmxlCisgKiBlbnRyaWVzIGZyb20gY3VycmVudCBpbmRleCB1cCB0byB0YWJsZSBlbnRyeSB3aXRoIDAgdmFsdWUuIHRoZSByZXN1bHQgaXMKKyAqIHRoZSBpbnRlcnJ1cHQgd2UgbmVlZCB0byBzZXJ2aWNlLCBkcml2ZXIgd2lsbCBzZXQgdGhlIGVudHJpZXMgYmFjayB0byAwIGFuZAorICogc2V0IGluZGV4LgorICovCitpcnFyZXR1cm5fdCBpd2xfaXNyX2ljdChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRhdGE7CisJdTMyIGludGEsIGludGFfbWFzazsKKwl1MzIgdmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFwcml2KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBkcmFtIGludGVycnVwdCB0YWJsZSBub3Qgc2V0IHlldCwKKwkgKiB1c2UgbGVnYWN5IGludGVycnVwdC4KKwkgKi8KKwlpZiAoIXByaXYtPnVzZV9pY3QpCisJCXJldHVybiBpd2xfaXNyKGlycSwgZGF0YSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogRGlzYWJsZSAoYnV0IGRvbid0IGNsZWFyISkgaW50ZXJydXB0cyBoZXJlIHRvIGF2b2lkCisJICogYmFjay10by1iYWNrIElTUnMgYW5kIHNwb3JhZGljIGludGVycnVwdHMgZnJvbSBvdXIgTklDLgorCSAqIElmIHdlIGhhdmUgc29tZXRoaW5nIHRvIHNlcnZpY2UsIHRoZSB0YXNrbGV0IHdpbGwgcmUtZW5hYmxlIGludHMuCisJICogSWYgd2UgKmRvbid0KiBoYXZlIHNvbWV0aGluZywgd2UnbGwgcmUtZW5hYmxlIGJlZm9yZSBsZWF2aW5nIGhlcmUuCisJICovCisJaW50YV9tYXNrID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UX01BU0spOyAgLyoganVzdCBmb3IgZGVidWcgKi8KKwlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5UX01BU0ssIDB4MDAwMDAwMDApOworCisKKwkvKiBJZ25vcmUgaW50ZXJydXB0IGlmIHRoZXJlJ3Mgbm90aGluZyBpbiBOSUMgdG8gc2VydmljZS4KKwkgKiBUaGlzIG1heSBiZSBkdWUgdG8gSVJRIHNoYXJlZCB3aXRoIGFub3RoZXIgZGV2aWNlLAorCSAqIG9yIGR1ZSB0byBzcG9yYWRpYyBpbnRlcnJ1cHRzIHRocm93biBmcm9tIG91ciBOSUMuICovCisJaWYgKCFwcml2LT5pY3RfdGJsW3ByaXYtPmljdF9pbmRleF0pIHsKKwkJSVdMX0RFQlVHX0lTUihwcml2LCAiSWdub3JlIGludGVycnVwdCwgaW50YSA9PSAwXG4iKTsKKwkJZ290byBub25lOworCX0KKworCS8qIHJlYWQgYWxsIGVudHJpZXMgdGhhdCBub3QgMCBzdGFydCB3aXRoIGljdF9pbmRleCAqLworCXdoaWxlIChwcml2LT5pY3RfdGJsW3ByaXYtPmljdF9pbmRleF0pIHsKKworCQl2YWwgfD0gbGUzMl90b19jcHUocHJpdi0+aWN0X3RibFtwcml2LT5pY3RfaW5kZXhdKTsKKwkJSVdMX0RFQlVHX0lTUihwcml2LCAiSUNUIGluZGV4ICVkIHZhbHVlIDB4JTA4WFxuIiwKKwkJCQlwcml2LT5pY3RfaW5kZXgsCisJCQkJbGUzMl90b19jcHUoCisJCQkJICAgIHByaXYtPmljdF90YmxbcHJpdi0+aWN0X2luZGV4XSkpOworCQlwcml2LT5pY3RfdGJsW3ByaXYtPmljdF9pbmRleF0gPSAwOworCQlwcml2LT5pY3RfaW5kZXggPSBpd2xfcXVldWVfaW5jX3dyYXAocHJpdi0+aWN0X2luZGV4LAorCQkJCQkJICAgICBJQ1RfQ09VTlQpOworCisJfQorCisJLyogV2Ugc2hvdWxkIG5vdCBnZXQgdGhpcyB2YWx1ZSwganVzdCBpZ25vcmUgaXQuICovCisJaWYgKHZhbCA9PSAweGZmZmZmZmZmKQorCQl2YWwgPSAwOworCisJLyoKKwkgKiB0aGlzIGlzIGEgdy9hIGZvciBhIGgvdyBidWcuIHRoZSBoL3cgYnVnIG1heSBjYXVzZSB0aGUgUnggYml0CisJICogKGJpdCAxNSBiZWZvcmUgc2hpZnRpbmcgaXQgdG8gMzEpIHRvIGNsZWFyIHdoZW4gdXNpbmcgaW50ZXJydXB0CisJICogY29hbGVzY2luZy4gZm9ydHVuYXRlbHksIGJpdHMgMTggYW5kIDE5IHN0YXkgc2V0IHdoZW4gdGhpcyBoYXBwZW5zCisJICogc28gd2UgdXNlIHRoZW0gdG8gZGVjaWRlIG9uIHRoZSByZWFsIHN0YXRlIG9mIHRoZSBSeCBiaXQuCisJICogSW4gb3JkZXIgd29yZHMsIGJpdCAxNSBpcyBzZXQgaWYgYml0IDE4IG9yIGJpdCAxOSBhcmUgc2V0LgorCSAqLworCWlmICh2YWwgJiAweEMwMDAwKQorCQl2YWwgfD0gMHg4MDAwOworCisJaW50YSA9ICgweGZmICYgdmFsKSB8ICgoMHhmZjAwICYgdmFsKSA8PCAxNik7CisJSVdMX0RFQlVHX0lTUihwcml2LCAiSVNSIGludGEgMHglMDh4LCBlbmFibGVkIDB4JTA4eCBpY3QgMHglMDh4XG4iLAorCQkJaW50YSwgaW50YV9tYXNrLCB2YWwpOworCisJaW50YSAmPSBwcml2LT5pbnRhX21hc2s7CisJcHJpdi0+aW50YSB8PSBpbnRhOworCisJLyogaXdsX2lycV90YXNrbGV0KCkgd2lsbCBzZXJ2aWNlIGludGVycnVwdHMgYW5kIHJlLWVuYWJsZSB0aGVtICovCisJaWYgKGxpa2VseShpbnRhKSkKKwkJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3Rhc2tsZXQpOworCWVsc2UgaWYgKHRlc3RfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cykgJiYKKwkJCSFwcml2LT5pbnRhKSB7CisJCS8qIEFsbG93IGludGVycnVwdCBpZiB3YXMgZGlzYWJsZWQgYnkgdGhpcyBoYW5kbGVyIGFuZAorCQkgKiBubyB0YXNrbGV0IHdhcyBzY2hlZHVsZXMsIFdlIHNob3VsZCBub3QgZW5hYmxlIGludGVycnVwdCwKKwkJICogdGFza2xldCB3aWxsIGVuYWJsZSBpdC4KKwkJICovCisJCWl3bF9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworCisgbm9uZToKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBoZXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gc2VydmljZS4KKwkgKiBvbmx5IFJlLWVuYWJsZSBpZiBkaXNhYmxlZCBieSBpcnEuCisJICovCisJaWYgKHRlc3RfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cykgJiYgIXByaXYtPmludGEpCisJCWl3bF9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy10eC1wY2llLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy10eC1wY2llLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiMmIxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXR4LXBjaWUuYwpAQCAtMCwwICsxLDEwMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAorICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSAiaXdsLWFnbi5oIgorI2luY2x1ZGUgIml3bC1kZXYuaCIKKyNpbmNsdWRlICJpd2wtY29yZS5oIgorI2luY2x1ZGUgIml3bC1pby5oIgorI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCisjaW5jbHVkZSAiaXdsLXRyYW5zLWludC1wY2llLmgiCisKKy8qKgorICogaXdsX3RyYW5zX3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsIC0gU2V0IHVwIGVudHJ5IGluIFR4IGJ5dGUtY291bnQgYXJyYXkKKyAqLwordm9pZCBpd2xfdHJhbnNfdHhxX3VwZGF0ZV9ieXRlX2NudF90Ymwoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCQkgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCisJCQkJCSAgIHUxNiBieXRlX2NudCkKK3sKKwlzdHJ1Y3QgaXdsYWduX3NjZF9iY190YmwgKnNjZF9iY190YmwgPSBwcml2LT5zY2RfYmNfdGJscy5hZGRyOworCWludCB3cml0ZV9wdHIgPSB0eHEtPnEud3JpdGVfcHRyOworCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7CisJdTggc2VjX2N0bCA9IDA7CisJdTggc3RhX2lkID0gMDsKKwl1MTYgbGVuID0gYnl0ZV9jbnQgKyBJV0xfVFhfQ1JDX1NJWkUgKyBJV0xfVFhfREVMSU1JVEVSX1NJWkU7CisJX19sZTE2IGJjX2VudDsKKworCVdBUk5fT04obGVuID4gMHhGRkYgfHwgd3JpdGVfcHRyID49IFRGRF9RVUVVRV9TSVpFX01BWCk7CisKKwlzdGFfaWQgPSB0eHEtPmNtZFt0eHEtPnEud3JpdGVfcHRyXS0+Y21kLnR4LnN0YV9pZDsKKwlzZWNfY3RsID0gdHhxLT5jbWRbdHhxLT5xLndyaXRlX3B0cl0tPmNtZC50eC5zZWNfY3RsOworCisJc3dpdGNoIChzZWNfY3RsICYgVFhfQ01EX1NFQ19NU0spIHsKKwljYXNlIFRYX0NNRF9TRUNfQ0NNOgorCQlsZW4gKz0gQ0NNUF9NSUNfTEVOOworCQlicmVhazsKKwljYXNlIFRYX0NNRF9TRUNfVEtJUDoKKwkJbGVuICs9IFRLSVBfSUNWX0xFTjsKKwkJYnJlYWs7CisJY2FzZSBUWF9DTURfU0VDX1dFUDoKKwkJbGVuICs9IFdFUF9JVl9MRU4gKyBXRVBfSUNWX0xFTjsKKwkJYnJlYWs7CisJfQorCisJYmNfZW50ID0gY3B1X3RvX2xlMTYoKGxlbiAmIDB4RkZGKSB8IChzdGFfaWQgPDwgMTIpKTsKKworCXNjZF9iY190YmxbdHhxX2lkXS50ZmRfb2Zmc2V0W3dyaXRlX3B0cl0gPSBiY19lbnQ7CisKKwlpZiAod3JpdGVfcHRyIDwgVEZEX1FVRVVFX1NJWkVfQkNfRFVQKQorCQlzY2RfYmNfdGJsW3R4cV9pZF0uCisJCQl0ZmRfb2Zmc2V0W1RGRF9RVUVVRV9TSVpFX01BWCArIHdyaXRlX3B0cl0gPSBiY19lbnQ7Cit9CisKKy8qKgorICogaXdsX3R4cV91cGRhdGVfd3JpdGVfcHRyIC0gU2VuZCBuZXcgd3JpdGUgaW5kZXggdG8gaGFyZHdhcmUKKyAqLwordm9pZCBpd2xfdHhxX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpCit7CisJdTMyIHJlZyA9IDA7CisJaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKKworCWlmICh0eHEtPm5lZWRfdXBkYXRlID09IDApCisJCXJldHVybjsKKworCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5zaGFkb3dfcmVnX2VuYWJsZSkgeworCQkvKiBzaGFkb3cgcmVnaXN0ZXIgZW5hYmxlZCAqLworCQlpd2xfd3JpdGUzMihwcml2LCBIQlVTX1RBUkdfV1JQVFIsCisJCQkgICAgdHhxLT5xLndyaXRlX3B0ciB8ICh0eHFfaWQgPDwgOCkpOworCX0gZWxzZSB7CisJCS8qIGlmIHdlJ3JlIHRyeWluZyB0byBzYXZlIHBvd2VyICovCisJCWlmICh0ZXN0X2JpdChTVEFUVVNfUE9XRVJfUE1JLCAmcHJpdi0+c3RhdHVzKSkgeworCQkJLyogd2FrZSB1cCBuaWMgaWYgaXQncyBwb3dlcmVkIGRvd24gLi4uCisJCQkgKiB1Q29kZSB3aWxsIHdha2UgdXAsIGFuZCBpbnRlcnJ1cHQgdXMgYWdhaW4sIHNvIG5leHQKKwkJCSAqIHRpbWUgd2UnbGwgc2tpcCB0aGlzIHBhcnQuICovCisJCQlyZWcgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxKTsKKworCQkJaWYgKHJlZyAmIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVApIHsKKwkJCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJCQkiVHggcXVldWUgJWQgcmVxdWVzdGluZyB3YWtldXAsIgorCQkJCQkiIEdQMSA9IDB4JXhcbiIsIHR4cV9pZCwgcmVnKTsKKwkJCQlpd2xfc2V0X2JpdChwcml2LCBDU1JfR1BfQ05UUkwsCisJCQkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX1dSUFRSLAorCQkJCSAgICAgdHhxLT5xLndyaXRlX3B0ciB8ICh0eHFfaWQgPDwgOCkpOworCisJCS8qCisJCSAqIGVsc2Ugbm90IGluIHBvd2VyLXNhdmUgbW9kZSwKKwkJICogdUNvZGUgd2lsbCBuZXZlciBzbGVlcCB3aGVuIHdlJ3JlCisJCSAqIHRyeWluZyB0byB0eCAoZHVyaW5nIFJGS0lMTCwgd2UncmUgbm90IHRyeWluZyB0byB0eCkuCisJCSAqLworCQl9IGVsc2UKKwkJCWl3bF93cml0ZTMyKHByaXYsIEhCVVNfVEFSR19XUlBUUiwKKwkJCQkgICAgdHhxLT5xLndyaXRlX3B0ciB8ICh0eHFfaWQgPDwgOCkpOworCX0KKwl0eHEtPm5lZWRfdXBkYXRlID0gMDsKK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGl3bF90ZmRfdGJfZ2V0X2FkZHIoc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4KQoreworCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOworCisJZG1hX2FkZHJfdCBhZGRyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZ0Yi0+bG8pOworCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiBzaXplb2YodTMyKSkKKwkJYWRkciB8PQorCQkoKGRtYV9hZGRyX3QpKGxlMTZfdG9fY3B1KHRiLT5oaV9uX2xlbikgJiAweEYpIDw8IDE2KSA8PCAxNjsKKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBpd2xfdGZkX3RiX2dldF9sZW4oc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4KQoreworCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOworCisJcmV0dXJuIGxlMTZfdG9fY3B1KHRiLT5oaV9uX2xlbikgPj4gNDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGl3bF90ZmRfc2V0X3RiKHN0cnVjdCBpd2xfdGZkICp0ZmQsIHU4IGlkeCwKKwkJCQkgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbikKK3sKKwlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKKwl1MTYgaGlfbl9sZW4gPSBsZW4gPDwgNDsKKworCXB1dF91bmFsaWduZWRfbGUzMihhZGRyLCAmdGItPmxvKTsKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCisJCWhpX25fbGVuIHw9ICgoYWRkciA+PiAxNikgPj4gMTYpICYgMHhGOworCisJdGItPmhpX25fbGVuID0gY3B1X3RvX2xlMTYoaGlfbl9sZW4pOworCisJdGZkLT5udW1fdGJzID0gaWR4ICsgMTsKK30KKworc3RhdGljIGlubGluZSB1OCBpd2xfdGZkX2dldF9udW1fdGJzKHN0cnVjdCBpd2xfdGZkICp0ZmQpCit7CisJcmV0dXJuIHRmZC0+bnVtX3RicyAmIDB4MWY7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl91bm1hcF90ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2NtZF9tZXRhICptZXRhLAorCQkgICAgIHN0cnVjdCBpd2xfdGZkICp0ZmQsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRtYV9kaXIpCit7CisJaW50IGk7CisJaW50IG51bV90YnM7CisKKwkvKiBTYW5pdHkgY2hlY2sgb24gbnVtYmVyIG9mIGNodW5rcyAqLworCW51bV90YnMgPSBpd2xfdGZkX2dldF9udW1fdGJzKHRmZCk7CisKKwlpZiAobnVtX3RicyA+PSBJV0xfTlVNX09GX1RCUykgeworCQlJV0xfRVJSKHByaXYsICJUb28gbWFueSBjaHVua3M6ICVpXG4iLCBudW1fdGJzKTsKKwkJLyogQHRvZG8gaXNzdWUgZmF0YWwgZXJyb3IsIGl0IGlzIHF1aXRlIHNlcmlvdXMgc2l0dWF0aW9uICovCisJCXJldHVybjsKKwl9CisKKwkvKiBVbm1hcCB0eF9jbWQgKi8KKwlpZiAobnVtX3RicykKKwkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5idXMtPmRldiwKKwkJCQlkbWFfdW5tYXBfYWRkcihtZXRhLCBtYXBwaW5nKSwKKwkJCQlkbWFfdW5tYXBfbGVuKG1ldGEsIGxlbiksCisJCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCisJLyogVW5tYXAgY2h1bmtzLCBpZiBhbnkuICovCisJZm9yIChpID0gMTsgaSA8IG51bV90YnM7IGkrKykKKwkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5idXMtPmRldiwgaXdsX3RmZF90Yl9nZXRfYWRkcih0ZmQsIGkpLAorCQkJCWl3bF90ZmRfdGJfZ2V0X2xlbih0ZmQsIGkpLCBkbWFfZGlyKTsKK30KKworLyoqCisgKiBpd2xhZ25fdHhxX2ZyZWVfdGZkIC0gRnJlZSBhbGwgY2h1bmtzIHJlZmVyZW5jZWQgYnkgVEZEIFt0eHEtPnEucmVhZF9wdHJdCisgKiBAcHJpdiAtIGRyaXZlciBwcml2YXRlIGRhdGEKKyAqIEB0eHEgLSB0eCBxdWV1ZQorICogQGluZGV4IC0gdGhlIGluZGV4IG9mIHRoZSBURkQgdG8gYmUgZnJlZWQKKyAqCisgKiBEb2VzIE5PVCBhZHZhbmNlIGFueSBURkQgY2lyY3VsYXIgYnVmZmVyIHJlYWQvd3JpdGUgaW5kZXhlcworICogRG9lcyBOT1QgZnJlZSB0aGUgVEZEIGl0c2VsZiAod2hpY2ggaXMgd2l0aGluIGNpcmN1bGFyIGJ1ZmZlcikKKyAqLwordm9pZCBpd2xhZ25fdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAorCWludCBpbmRleCkKK3sKKwlzdHJ1Y3QgaXdsX3RmZCAqdGZkX3RtcCA9IHR4cS0+dGZkczsKKworCWl3bGFnbl91bm1hcF90ZmQocHJpdiwgJnR4cS0+bWV0YVtpbmRleF0sICZ0ZmRfdG1wW2luZGV4XSwKKwkJCSBETUFfVE9fREVWSUNFKTsKKworCS8qIGZyZWUgU0tCICovCisJaWYgKHR4cS0+dHhiKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gdHhxLT50eGJbaW5kZXhdLnNrYjsKKworCQkvKiBjYW4gYmUgY2FsbGVkIGZyb20gaXJxcy1kaXNhYmxlZCBjb250ZXh0ICovCisJCWlmIChza2IpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQl0eHEtPnR4YltpbmRleF0uc2tiID0gTlVMTDsKKwkJfQorCX0KK30KKworaW50IGl3bGFnbl90eHFfYXR0YWNoX2J1Zl90b190ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCSBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCisJCQkJIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwKKwkJCQkgdTggcmVzZXQpCit7CisJc3RydWN0IGl3bF9xdWV1ZSAqcTsKKwlzdHJ1Y3QgaXdsX3RmZCAqdGZkLCAqdGZkX3RtcDsKKwl1MzIgbnVtX3RiczsKKworCXEgPSAmdHhxLT5xOworCXRmZF90bXAgPSB0eHEtPnRmZHM7CisJdGZkID0gJnRmZF90bXBbcS0+d3JpdGVfcHRyXTsKKworCWlmIChyZXNldCkKKwkJbWVtc2V0KHRmZCwgMCwgc2l6ZW9mKCp0ZmQpKTsKKworCW51bV90YnMgPSBpd2xfdGZkX2dldF9udW1fdGJzKHRmZCk7CisKKwkvKiBFYWNoIFRGRCBjYW4gcG9pbnQgdG8gYSBtYXhpbXVtIDIwIFR4IGJ1ZmZlcnMgKi8KKwlpZiAobnVtX3RicyA+PSBJV0xfTlVNX09GX1RCUykgeworCQlJV0xfRVJSKHByaXYsICJFcnJvciBjYW4gbm90IHNlbmQgbW9yZSB0aGFuICVkIGNodW5rc1xuIiwKKwkJCSAgSVdMX05VTV9PRl9UQlMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoV0FSTl9PTihhZGRyICYgfkRNQV9CSVRfTUFTSygzNikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1bmxpa2VseShhZGRyICYgfklXTF9UWF9ETUFfTUFTSykpCisJCUlXTF9FUlIocHJpdiwgIlVuYWxpZ25lZCBhZGRyZXNzID0gJWxseFxuIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyKTsKKworCWl3bF90ZmRfc2V0X3RiKHRmZCwgbnVtX3RicywgYWRkciwgbGVuKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqIERNQS1RVUVVRS1HRU5FUkFMLUZVTkNUSU9OUyAgKioqKioKKyAqIERNQSBzZXJ2aWNlcworICoKKyAqIFRoZW9yeSBvZiBvcGVyYXRpb24KKyAqCisgKiBBIFR4IG9yIFJ4IHF1ZXVlIHJlc2lkZXMgaW4gaG9zdCBEUkFNLCBhbmQgaXMgY29tcHJpc2VkIG9mIGEgY2lyY3VsYXIgYnVmZmVyCisgKiBvZiBidWZmZXIgZGVzY3JpcHRvcnMsIGVhY2ggb2Ygd2hpY2ggcG9pbnRzIHRvIG9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyBmb3IKKyAqIHRoZSBkZXZpY2UgdG8gcmVhZCBmcm9tIG9yIGZpbGwuICBEcml2ZXIgYW5kIGRldmljZSBleGNoYW5nZSBzdGF0dXMgb2YgZWFjaAorICogcXVldWUgdmlhICJyZWFkIiBhbmQgIndyaXRlIiBwb2ludGVycy4gIERyaXZlciBrZWVwcyBtaW5pbXVtIG9mIDIgZW1wdHkKKyAqIGVudHJpZXMgaW4gZWFjaCBjaXJjdWxhciBidWZmZXIsIHRvIHByb3RlY3QgYWdhaW5zdCBjb25mdXNpbmcgZW1wdHkgYW5kIGZ1bGwKKyAqIHF1ZXVlIHN0YXRlcy4KKyAqCisgKiBUaGUgZGV2aWNlIHJlYWRzIG9yIHdyaXRlcyB0aGUgZGF0YSBpbiB0aGUgcXVldWVzIHZpYSB0aGUgZGV2aWNlJ3Mgc2V2ZXJhbAorICogRE1BL0ZJRk8gY2hhbm5lbHMuICBFYWNoIHF1ZXVlIGlzIG1hcHBlZCB0byBhIHNpbmdsZSBETUEgY2hhbm5lbC4KKyAqCisgKiBGb3IgVHggcXVldWUsIHRoZXJlIGFyZSBsb3cgbWFyayBhbmQgaGlnaCBtYXJrIGxpbWl0cy4gSWYsIGFmdGVyIHF1ZXVpbmcKKyAqIHRoZSBwYWNrZXQgZm9yIFR4LCBmcmVlIHNwYWNlIGJlY29tZSA8IGxvdyBtYXJrLCBUeCBxdWV1ZSBzdG9wcGVkLiBXaGVuCisgKiByZWNsYWltaW5nIHBhY2tldHMgKG9uICd0eCBkb25lIElSUSksIGlmIGZyZWUgc3BhY2UgYmVjb21lID4gaGlnaCBtYXJrLAorICogVHggcXVldWUgcmVzdW1lZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgaXdsX3F1ZXVlX3NwYWNlKGNvbnN0IHN0cnVjdCBpd2xfcXVldWUgKnEpCit7CisJaW50IHMgPSBxLT5yZWFkX3B0ciAtIHEtPndyaXRlX3B0cjsKKworCWlmIChxLT5yZWFkX3B0ciA+IHEtPndyaXRlX3B0cikKKwkJcyAtPSBxLT5uX2JkOworCisJaWYgKHMgPD0gMCkKKwkJcyArPSBxLT5uX3dpbmRvdzsKKwkvKiBrZWVwIHNvbWUgcmVzZXJ2ZSB0byBub3QgY29uZnVzZSBlbXB0eSBhbmQgZnVsbCBzaXR1YXRpb25zICovCisJcyAtPSAyOworCWlmIChzIDwgMCkKKwkJcyA9IDA7CisJcmV0dXJuIHM7Cit9CisKKy8qKgorICogaXdsX3F1ZXVlX2luaXQgLSBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgYW5kIHJlYWQvd3JpdGUgaW5kZXhlcworICovCitpbnQgaXdsX3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3F1ZXVlICpxLAorCQkJICBpbnQgY291bnQsIGludCBzbG90c19udW0sIHUzMiBpZCkKK3sKKwlxLT5uX2JkID0gY291bnQ7CisJcS0+bl93aW5kb3cgPSBzbG90c19udW07CisJcS0+aWQgPSBpZDsKKworCS8qIGNvdW50IG11c3QgYmUgcG93ZXItb2YtdHdvIHNpemUsIG90aGVyd2lzZSBpd2xfcXVldWVfaW5jX3dyYXAKKwkgKiBhbmQgaXdsX3F1ZXVlX2RlY193cmFwIGFyZSBicm9rZW4uICovCisJaWYgKFdBUk5fT04oIWlzX3Bvd2VyX29mXzIoY291bnQpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzbG90c19udW0gbXVzdCBiZSBwb3dlci1vZi10d28gc2l6ZSwgb3RoZXJ3aXNlCisJICogZ2V0X2NtZF9pbmRleCBpcyBicm9rZW4uICovCisJaWYgKFdBUk5fT04oIWlzX3Bvd2VyX29mXzIoc2xvdHNfbnVtKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcS0+bG93X21hcmsgPSBxLT5uX3dpbmRvdyAvIDQ7CisJaWYgKHEtPmxvd19tYXJrIDwgNCkKKwkJcS0+bG93X21hcmsgPSA0OworCisJcS0+aGlnaF9tYXJrID0gcS0+bl93aW5kb3cgLyA4OworCWlmIChxLT5oaWdoX21hcmsgPCAyKQorCQlxLT5oaWdoX21hcmsgPSAyOworCisJcS0+d3JpdGVfcHRyID0gcS0+cmVhZF9wdHIgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qVE9ETzogdGhpcyBmdW5jdGlvbnMgc2hvdWxkIE5PVCBiZSBleHBvcnRlZCBmcm9tIHRyYW5zIG1vZHVsZSAtIGV4cG9ydCBpdAorICogdW50aWwgdGhlIHJlY2xhaW0gZmxvdyB3aWxsIGJlIGJyb3VnaHQgdG8gdGhlIHRyYW5zcG9ydCBtb2R1bGUgdG9vLgorICogQWRkIGEgZGVjbGFyYXRpb24gdG8gbWFrZSBzcGFyc2UgaGFwcHkgKi8KK3ZvaWQgaXdsYWduX3R4cV9pbnZhbF9ieXRlX2NudF90Ymwoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCQkgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSk7CisKK3ZvaWQgaXdsYWduX3R4cV9pbnZhbF9ieXRlX2NudF90Ymwoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCQkgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKK3sKKwlzdHJ1Y3QgaXdsYWduX3NjZF9iY190YmwgKnNjZF9iY190YmwgPSBwcml2LT5zY2RfYmNfdGJscy5hZGRyOworCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7CisJaW50IHJlYWRfcHRyID0gdHhxLT5xLnJlYWRfcHRyOworCXU4IHN0YV9pZCA9IDA7CisJX19sZTE2IGJjX2VudDsKKworCVdBUk5fT04ocmVhZF9wdHIgPj0gVEZEX1FVRVVFX1NJWkVfTUFYKTsKKworCWlmICh0eHFfaWQgIT0gcHJpdi0+Y21kX3F1ZXVlKQorCQlzdGFfaWQgPSB0eHEtPmNtZFtyZWFkX3B0cl0tPmNtZC50eC5zdGFfaWQ7CisKKwliY19lbnQgPSBjcHVfdG9fbGUxNigxIHwgKHN0YV9pZCA8PCAxMikpOworCXNjZF9iY190YmxbdHhxX2lkXS50ZmRfb2Zmc2V0W3JlYWRfcHRyXSA9IGJjX2VudDsKKworCWlmIChyZWFkX3B0ciA8IFRGRF9RVUVVRV9TSVpFX0JDX0RVUCkKKwkJc2NkX2JjX3RibFt0eHFfaWRdLgorCQkJdGZkX29mZnNldFtURkRfUVVFVUVfU0laRV9NQVggKyByZWFkX3B0cl0gPSBiY19lbnQ7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX3R4X3F1ZXVlX3NldF9xMnJhdGlkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IHJhX3RpZCwKKwkJCQkJdTE2IHR4cV9pZCkKK3sKKwl1MzIgdGJsX2R3X2FkZHI7CisJdTMyIHRibF9kdzsKKwl1MTYgc2NkX3EycmF0aWQ7CisKKwlzY2RfcTJyYXRpZCA9IHJhX3RpZCAmIFNDRF9RVUVVRV9SQV9USURfTUFQX1JBVElEX01TSzsKKworCXRibF9kd19hZGRyID0gcHJpdi0+c2NkX2Jhc2VfYWRkciArCisJCQlTQ0RfVFJBTlNfVEJMX09GRlNFVF9RVUVVRSh0eHFfaWQpOworCisJdGJsX2R3ID0gaXdsX3JlYWRfdGFyZ19tZW0ocHJpdiwgdGJsX2R3X2FkZHIpOworCisJaWYgKHR4cV9pZCAmIDB4MSkKKwkJdGJsX2R3ID0gKHNjZF9xMnJhdGlkIDw8IDE2KSB8ICh0YmxfZHcgJiAweDAwMDBGRkZGKTsKKwllbHNlCisJCXRibF9kdyA9IHNjZF9xMnJhdGlkIHwgKHRibF9kdyAmIDB4RkZGRjAwMDApOworCisJaXdsX3dyaXRlX3RhcmdfbWVtKHByaXYsIHRibF9kd19hZGRyLCB0YmxfZHcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiB0eHFfaWQpCit7CisJLyogU2ltcGx5IHN0b3AgdGhlIHF1ZXVlLCBidXQgZG9uJ3QgY2hhbmdlIGFueSBjb25maWd1cmF0aW9uOworCSAqIHRoZSBTQ0RfQUNUX0VOIGJpdCBpcyB0aGUgd3JpdGUtZW5hYmxlIG1hc2sgZm9yIHRoZSBBQ1RJVkUgYml0LiAqLworCWl3bF93cml0ZV9wcnBoKHByaXYsCisJCVNDRF9RVUVVRV9TVEFUVVNfQklUUyh0eHFfaWQpLAorCQkoMCA8PCBTQ0RfUVVFVUVfU1RUU19SRUdfUE9TX0FDVElWRSl8CisJCSgxIDw8IFNDRF9RVUVVRV9TVFRTX1JFR19QT1NfU0NEX0FDVF9FTikpOworfQorCit2b2lkIGl3bF90cmFuc19zZXRfd3JfcHRycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJaW50IHR4cV9pZCwgdTMyIGluZGV4KQoreworCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfV1JQVFIsCisJCQkoaW5kZXggJiAweGZmKSB8ICh0eHFfaWQgPDwgOCkpOworCWl3bF93cml0ZV9wcnBoKHByaXYsIFNDRF9RVUVVRV9SRFBUUih0eHFfaWQpLCBpbmRleCk7Cit9CisKK3ZvaWQgaXdsX3RyYW5zX3R4X3F1ZXVlX3NldF9zdGF0dXMoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCisJCQkJCWludCB0eF9maWZvX2lkLCBpbnQgc2NkX3JldHJ5KQoreworCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7CisJaW50IGFjdGl2ZSA9IHRlc3RfYml0KHR4cV9pZCwgJnByaXYtPnR4cV9jdHhfYWN0aXZlX21zaykgPyAxIDogMDsKKworCWl3bF93cml0ZV9wcnBoKHByaXYsIFNDRF9RVUVVRV9TVEFUVVNfQklUUyh0eHFfaWQpLAorCQkJKGFjdGl2ZSA8PCBTQ0RfUVVFVUVfU1RUU19SRUdfUE9TX0FDVElWRSkgfAorCQkJKHR4X2ZpZm9faWQgPDwgU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19UWEYpIHwKKwkJCSgxIDw8IFNDRF9RVUVVRV9TVFRTX1JFR19QT1NfV1NMKSB8CisJCQlTQ0RfUVVFVUVfU1RUU19SRUdfTVNLKTsKKworCXR4cS0+c2NoZWRfcmV0cnkgPSBzY2RfcmV0cnk7CisKKwlJV0xfREVCVUdfSU5GTyhwcml2LCAiJXMgJXMgUXVldWUgJWQgb24gRklGTyAlZFxuIiwKKwkJICAgICAgIGFjdGl2ZSA/ICJBY3RpdmF0ZSIgOiAiRGVhY3RpdmF0ZSIsCisJCSAgICAgICBzY2RfcmV0cnkgPyAiQkEiIDogIkFDL0NNRCIsIHR4cV9pZCwgdHhfZmlmb19pZCk7Cit9CisKK3ZvaWQgaXdsX3RyYW5zX3R4cV9hZ2dfc2V0dXAoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLCBpbnQgdGlkLAorCQkJCQkJaW50IGZyYW1lX2xpbWl0KQoreworCWludCB0eF9maWZvLCB0eHFfaWQsIHNzbl9pZHg7CisJdTE2IHJhX3RpZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOworCisJaWYgKFdBUk5fT04oc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pKQorCQlyZXR1cm47CisJaWYgKFdBUk5fT04odGlkID49IE1BWF9USURfQ09VTlQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKKwl0aWRfZGF0YSA9ICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdOworCXNzbl9pZHggPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOworCXR4cV9pZCA9IHRpZF9kYXRhLT5hZ2cudHhxX2lkOworCXR4X2ZpZm8gPSB0aWRfZGF0YS0+YWdnLnR4X2ZpZm87CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJhX3RpZCA9IEJVSUxEX1JBeFRJRChzdGFfaWQsIHRpZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogU3RvcCB0aGlzIFR4IHF1ZXVlIGJlZm9yZSBjb25maWd1cmluZyBpdCAqLworCWl3bGFnbl90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlcihwcml2LCB0eHFfaWQpOworCisJLyogTWFwIHJlY2VpdmVyLWFkZHJlc3MgLyB0cmFmZmljLUlEIHRvIHRoaXMgcXVldWUgKi8KKwlpd2xhZ25fdHhfcXVldWVfc2V0X3EycmF0aWQocHJpdiwgcmFfdGlkLCB0eHFfaWQpOworCisJLyogU2V0IHRoaXMgcXVldWUgYXMgYSBjaGFpbi1idWlsZGluZyBxdWV1ZSAqLworCWl3bF9zZXRfYml0c19wcnBoKHByaXYsIFNDRF9RVUVVRUNIQUlOX1NFTCwgKDE8PHR4cV9pZCkpOworCisJLyogZW5hYmxlIGFnZ3JlZ2F0aW9ucyBmb3IgdGhlIHF1ZXVlICovCisJaXdsX3NldF9iaXRzX3BycGgocHJpdiwgU0NEX0FHR1JfU0VMLCAoMTw8dHhxX2lkKSk7CisKKwkvKiBQbGFjZSBmaXJzdCBURkQgYXQgaW5kZXggY29ycmVzcG9uZGluZyB0byBzdGFydCBzZXF1ZW5jZSBudW1iZXIuCisJICogQXNzdW1lcyB0aGF0IHNzbl9pZHggaXMgdmFsaWQgKCE9IDB4RkZGKSAqLworCXByaXYtPnR4cVt0eHFfaWRdLnEucmVhZF9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOworCXByaXYtPnR4cVt0eHFfaWRdLnEud3JpdGVfcHRyID0gKHNzbl9pZHggJiAweGZmKTsKKwlpd2xfdHJhbnNfc2V0X3dyX3B0cnMocHJpdiwgdHhxX2lkLCBzc25faWR4KTsKKworCS8qIFNldCB1cCBUeCB3aW5kb3cgc2l6ZSBhbmQgZnJhbWUgbGltaXQgZm9yIHRoaXMgcXVldWUgKi8KKwlpd2xfd3JpdGVfdGFyZ19tZW0ocHJpdiwgcHJpdi0+c2NkX2Jhc2VfYWRkciArCisJCQlTQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQodHhxX2lkKSArCisJCQlzaXplb2YodTMyKSwKKwkJCSgoZnJhbWVfbGltaXQgPDwKKwkJCVNDRF9RVUVVRV9DVFhfUkVHMl9XSU5fU0laRV9QT1MpICYKKwkJCVNDRF9RVUVVRV9DVFhfUkVHMl9XSU5fU0laRV9NU0spIHwKKwkJCSgoZnJhbWVfbGltaXQgPDwKKwkJCVNDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MpICYKKwkJCVNDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9NU0spKTsKKworCWl3bF9zZXRfYml0c19wcnBoKHByaXYsIFNDRF9JTlRFUlJVUFRfTUFTSywgKDEgPDwgdHhxX2lkKSk7CisKKwkvKiBTZXQgdXAgU3RhdHVzIGFyZWEgaW4gU1JBTSwgbWFwIHRvIFR4IERNQS9GSUZPLCBhY3RpdmF0ZSB0aGUgcXVldWUgKi8KKwlpd2xfdHJhbnNfdHhfcXVldWVfc2V0X3N0YXR1cyhwcml2LCAmcHJpdi0+dHhxW3R4cV9pZF0sIHR4X2ZpZm8sIDEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworfQorCitpbnQgaXdsX3RyYW5zX3R4cV9hZ2dfZGlzYWJsZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiB0eHFfaWQsCisJCQkJICB1MTYgc3NuX2lkeCwgdTggdHhfZmlmbykKK3sKKwlpZiAoKElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSA+IHR4cV9pZCkgfHwKKwkgICAgKElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSArCisJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9hbXBkdV9xdWV1ZXMgPD0gdHhxX2lkKSkgeworCQlJV0xfRVJSKHByaXYsCisJCQkicXVldWUgbnVtYmVyIG91dCBvZiByYW5nZTogJWQsIG11c3QgYmUgJWQgdG8gJWRcbiIsCisJCQl0eHFfaWQsIElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSwKKwkJCUlXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSArCisJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIC0gMSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWl3bGFnbl90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlcihwcml2LCB0eHFfaWQpOworCisJaXdsX2NsZWFyX2JpdHNfcHJwaChwcml2LCBTQ0RfQUdHUl9TRUwsICgxIDw8IHR4cV9pZCkpOworCisJcHJpdi0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0ciA9IChzc25faWR4ICYgMHhmZik7CisJcHJpdi0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOworCS8qIHN1cHBvc2VzIHRoYXQgc3NuX2lkeCBpcyB2YWxpZCAoIT0gMHhGRkYpICovCisJaXdsX3RyYW5zX3NldF93cl9wdHJzKHByaXYsIHR4cV9pZCwgc3NuX2lkeCk7CisKKwlpd2xfY2xlYXJfYml0c19wcnBoKHByaXYsIFNDRF9JTlRFUlJVUFRfTUFTSywgKDEgPDwgdHhxX2lkKSk7CisJaXdsX3R4cV9jdHhfZGVhY3RpdmF0ZShwcml2LCB0eHFfaWQpOworCWl3bF90cmFuc190eF9xdWV1ZV9zZXRfc3RhdHVzKHByaXYsICZwcml2LT50eHFbdHhxX2lkXSwgdHhfZmlmbywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKiBIT1NUIENPTU1BTkQgUVVFVUUgRlVOQ1RJT05TICAgKioqKiovCisKKy8qKgorICogaXdsX2VucXVldWVfaGNtZCAtIGVucXVldWUgYSB1Q29kZSBjb21tYW5kCisgKiBAcHJpdjogZGV2aWNlIHByaXZhdGUgZGF0YSBwb2ludAorICogQGNtZDogYSBwb2ludCB0byB0aGUgdWNvZGUgY29tbWFuZCBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyA8IDAgdmFsdWVzIHRvIGluZGljYXRlIHRoZSBvcGVyYXRpb24gaXMKKyAqIGZhaWxlZC4gT24gc3VjY2VzcywgaXQgdHVybnMgdGhlIGluZGV4ICg+IDApIG9mIGNvbW1hbmQgaW4gdGhlCisgKiBjb21tYW5kIHF1ZXVlLgorICovCitzdGF0aWMgaW50IGl3bF9lbnF1ZXVlX2hjbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpCit7CisJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVtwcml2LT5jbWRfcXVldWVdOworCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOworCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqb3V0X2NtZDsKKwlzdHJ1Y3QgaXdsX2NtZF9tZXRhICpvdXRfbWV0YTsKKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpZHg7CisJdTE2IGNvcHlfc2l6ZSwgY21kX3NpemU7CisJYm9vbCBpc19jdF9raWxsID0gZmFsc2U7CisJYm9vbCBoYWRfbm9jb3B5ID0gZmFsc2U7CisJaW50IGk7CisJdTggKmNtZF9kZXN0OworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9UUkFDSU5HCisJY29uc3Qgdm9pZCAqdHJhY2VfYnVmc1tJV0xfTUFYX0NNRF9URkRTICsgMV0gPSB7fTsKKwlpbnQgdHJhY2VfbGVuc1tJV0xfTUFYX0NNRF9URkRTICsgMV0gPSB7fTsKKwlpbnQgdHJhY2VfaWR4OworI2VuZGlmCisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKSkgeworCQlJV0xfV0FSTihwcml2LCAiZncgcmVjb3ZlcnksIG5vIGhjbWQgc2VuZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICgocHJpdi0+dWNvZGVfb3duZXIgPT0gSVdMX09XTkVSU0hJUF9UTSkgJiYKKwkgICAgIShjbWQtPmZsYWdzICYgQ01EX09OX0RFTUFORCkpIHsKKwkJSVdMX0RFQlVHX0hDKHByaXYsICJ0bSBvd24gdGhlIHVDb2RlLCBubyByZWd1bGFyIGhjbWQgc2VuZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWNvcHlfc2l6ZSA9IHNpemVvZihvdXRfY21kLT5oZHIpOworCWNtZF9zaXplID0gc2l6ZW9mKG91dF9jbWQtPmhkcik7CisKKwkvKiBuZWVkIG9uZSBmb3IgdGhlIGhlYWRlciBpZiB0aGUgZmlyc3QgaXMgTk9DT1BZICovCisJQlVJTERfQlVHX09OKElXTF9NQVhfQ01EX1RGRFMgPiBJV0xfTlVNX09GX1RCUyAtIDEpOworCisJZm9yIChpID0gMDsgaSA8IElXTF9NQVhfQ01EX1RGRFM7IGkrKykgeworCQlpZiAoIWNtZC0+bGVuW2ldKQorCQkJY29udGludWU7CisJCWlmIChjbWQtPmRhdGFmbGFnc1tpXSAmIElXTF9IQ01EX0RGTF9OT0NPUFkpIHsKKwkJCWhhZF9ub2NvcHkgPSB0cnVlOworCQl9IGVsc2UgeworCQkJLyogTk9DT1BZIG11c3Qgbm90IGJlIGZvbGxvd2VkIGJ5IG5vcm1hbCEgKi8KKwkJCWlmIChXQVJOX09OKGhhZF9ub2NvcHkpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJY29weV9zaXplICs9IGNtZC0+bGVuW2ldOworCQl9CisJCWNtZF9zaXplICs9IGNtZC0+bGVuW2ldOworCX0KKworCS8qCisJICogSWYgYW55IG9mIHRoZSBjb21tYW5kIHN0cnVjdHVyZXMgZW5kIHVwIGJlaW5nIGxhcmdlciB0aGFuCisJICogdGhlIFRGRF9NQVhfUEFZTE9BRF9TSVpFIGFuZCB0aGV5IGFyZW4ndCBkeW5hbWljYWxseQorCSAqIGFsbG9jYXRlZCBpbnRvIHNlcGFyYXRlIFRGRHMsIHRoZW4gd2Ugd2lsbCBuZWVkIHRvCisJICogaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcnMuCisJICovCisJaWYgKFdBUk5fT04oY29weV9zaXplID4gVEZEX01BWF9QQVlMT0FEX1NJWkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpd2xfaXNfcmZraWxsKHByaXYpIHx8IGl3bF9pc19jdGtpbGwocHJpdikpIHsKKwkJSVdMX1dBUk4ocHJpdiwgIk5vdCBzZW5kaW5nIGNvbW1hbmQgLSAlcyBLSUxMXG4iLAorCQkJIGl3bF9pc19yZmtpbGwocHJpdikgPyAiUkYiIDogIkNUIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5oY21kX2xvY2ssIGZsYWdzKTsKKworCWlmIChpd2xfcXVldWVfc3BhY2UocSkgPCAoKGNtZC0+ZmxhZ3MgJiBDTURfQVNZTkMpID8gMiA6IDEpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmhjbWRfbG9jaywgZmxhZ3MpOworCisJCUlXTF9FUlIocHJpdiwgIk5vIHNwYWNlIGluIGNvbW1hbmQgcXVldWVcbiIpOworCQlpc19jdF9raWxsID0gaXdsX2NoZWNrX2Zvcl9jdF9raWxsKHByaXYpOworCQlpZiAoIWlzX2N0X2tpbGwpIHsKKwkJCUlXTF9FUlIocHJpdiwgIlJlc3RhcnRpbmcgYWRhcHRlciBkdWUgdG8gcXVldWUgZnVsbFxuIik7CisJCQlpd2xhZ25fZndfZXJyb3IocHJpdiwgZmFsc2UpOworCQl9CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWlkeCA9IGdldF9jbWRfaW5kZXgocSwgcS0+d3JpdGVfcHRyKTsKKwlvdXRfY21kID0gdHhxLT5jbWRbaWR4XTsKKwlvdXRfbWV0YSA9ICZ0eHEtPm1ldGFbaWR4XTsKKworCW1lbXNldChvdXRfbWV0YSwgMCwgc2l6ZW9mKCpvdXRfbWV0YSkpOwkvKiByZS1pbml0aWFsaXplIHRvIE5VTEwgKi8KKwlpZiAoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikKKwkJb3V0X21ldGEtPnNvdXJjZSA9IGNtZDsKKwlpZiAoY21kLT5mbGFncyAmIENNRF9BU1lOQykKKwkJb3V0X21ldGEtPmNhbGxiYWNrID0gY21kLT5jYWxsYmFjazsKKworCS8qIHNldCB1cCB0aGUgaGVhZGVyICovCisKKwlvdXRfY21kLT5oZHIuY21kID0gY21kLT5pZDsKKwlvdXRfY21kLT5oZHIuZmxhZ3MgPSAwOworCW91dF9jbWQtPmhkci5zZXF1ZW5jZSA9IGNwdV90b19sZTE2KFFVRVVFX1RPX1NFUShwcml2LT5jbWRfcXVldWUpIHwKKwkJCQkJICAgIElOREVYX1RPX1NFUShxLT53cml0ZV9wdHIpKTsKKworCS8qIGFuZCBjb3B5IHRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgY29waWVkICovCisKKwljbWRfZGVzdCA9ICZvdXRfY21kLT5jbWQucGF5bG9hZFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgSVdMX01BWF9DTURfVEZEUzsgaSsrKSB7CisJCWlmICghY21kLT5sZW5baV0pCisJCQljb250aW51ZTsKKwkJaWYgKGNtZC0+ZGF0YWZsYWdzW2ldICYgSVdMX0hDTURfREZMX05PQ09QWSkKKwkJCWJyZWFrOworCQltZW1jcHkoY21kX2Rlc3QsIGNtZC0+ZGF0YVtpXSwgY21kLT5sZW5baV0pOworCQljbWRfZGVzdCArPSBjbWQtPmxlbltpXTsKKwl9CisKKwlJV0xfREVCVUdfSEMocHJpdiwgIlNlbmRpbmcgY29tbWFuZCAlcyAoIyV4KSwgc2VxOiAweCUwNFgsICIKKwkJCSIlZCBieXRlcyBhdCAlZFslZF06JWRcbiIsCisJCQlnZXRfY21kX3N0cmluZyhvdXRfY21kLT5oZHIuY21kKSwKKwkJCW91dF9jbWQtPmhkci5jbWQsCisJCQlsZTE2X3RvX2NwdShvdXRfY21kLT5oZHIuc2VxdWVuY2UpLCBjbWRfc2l6ZSwKKwkJCXEtPndyaXRlX3B0ciwgaWR4LCBwcml2LT5jbWRfcXVldWUpOworCisJcGh5c19hZGRyID0gZG1hX21hcF9zaW5nbGUocHJpdi0+YnVzLT5kZXYsICZvdXRfY21kLT5oZHIsIGNvcHlfc2l6ZSwKKwkJCQlETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHByaXYtPmJ1cy0+ZGV2LCBwaHlzX2FkZHIpKSkgeworCQlpZHggPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlkbWFfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHBoeXNfYWRkcik7CisJZG1hX3VubWFwX2xlbl9zZXQob3V0X21ldGEsIGxlbiwgY29weV9zaXplKTsKKworCWl3bGFnbl90eHFfYXR0YWNoX2J1Zl90b190ZmQocHJpdiwgdHhxLCBwaHlzX2FkZHIsIGNvcHlfc2l6ZSwgMSk7CisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1RSQUNJTkcKKwl0cmFjZV9idWZzWzBdID0gJm91dF9jbWQtPmhkcjsKKwl0cmFjZV9sZW5zWzBdID0gY29weV9zaXplOworCXRyYWNlX2lkeCA9IDE7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBJV0xfTUFYX0NNRF9URkRTOyBpKyspIHsKKwkJaWYgKCFjbWQtPmxlbltpXSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIShjbWQtPmRhdGFmbGFnc1tpXSAmIElXTF9IQ01EX0RGTF9OT0NPUFkpKQorCQkJY29udGludWU7CisJCXBoeXNfYWRkciA9IGRtYV9tYXBfc2luZ2xlKHByaXYtPmJ1cy0+ZGV2LCAodm9pZCAqKWNtZC0+ZGF0YVtpXSwKKwkJCQkJICAgY21kLT5sZW5baV0sIERNQV9CSURJUkVDVElPTkFMKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHByaXYtPmJ1cy0+ZGV2LCBwaHlzX2FkZHIpKSB7CisJCQlpd2xhZ25fdW5tYXBfdGZkKHByaXYsIG91dF9tZXRhLAorCQkJCQkgJnR4cS0+dGZkc1txLT53cml0ZV9wdHJdLAorCQkJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworCQkJaWR4ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaXdsYWduX3R4cV9hdHRhY2hfYnVmX3RvX3RmZChwcml2LCB0eHEsIHBoeXNfYWRkciwKKwkJCQkJICAgICBjbWQtPmxlbltpXSwgMCk7CisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1RSQUNJTkcKKwkJdHJhY2VfYnVmc1t0cmFjZV9pZHhdID0gY21kLT5kYXRhW2ldOworCQl0cmFjZV9sZW5zW3RyYWNlX2lkeF0gPSBjbWQtPmxlbltpXTsKKwkJdHJhY2VfaWR4Kys7CisjZW5kaWYKKwl9CisKKwlvdXRfbWV0YS0+ZmxhZ3MgPSBjbWQtPmZsYWdzOworCisJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7CisKKwkvKiBjaGVjayB0aGF0IHRyYWNpbmcgZ2V0cyBhbGwgcG9zc2libGUgYmxvY2tzICovCisJQlVJTERfQlVHX09OKElXTF9NQVhfQ01EX1RGRFMgKyAxICE9IDMpOworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9UUkFDSU5HCisJdHJhY2VfaXdsd2lmaV9kZXZfaGNtZChwcml2LCBjbWQtPmZsYWdzLAorCQkJICAgICAgIHRyYWNlX2J1ZnNbMF0sIHRyYWNlX2xlbnNbMF0sCisJCQkgICAgICAgdHJhY2VfYnVmc1sxXSwgdHJhY2VfbGVuc1sxXSwKKwkJCSAgICAgICB0cmFjZV9idWZzWzJdLCB0cmFjZV9sZW5zWzJdKTsKKyNlbmRpZgorCisJLyogSW5jcmVtZW50IGFuZCB1cGRhdGUgcXVldWUncyB3cml0ZSBpbmRleCAqLworCXEtPndyaXRlX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIsIHEtPm5fYmQpOworCWl3bF90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCB0eHEpOworCisgb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmhjbWRfbG9jaywgZmxhZ3MpOworCXJldHVybiBpZHg7Cit9CisKKy8qKgorICogaXdsX2hjbWRfcXVldWVfcmVjbGFpbSAtIFJlY2xhaW0gVFggY29tbWFuZCBxdWV1ZSBlbnRyaWVzIGFscmVhZHkgVHgnZAorICoKKyAqIFdoZW4gRlcgYWR2YW5jZXMgJ1InIGluZGV4LCBhbGwgZW50cmllcyBiZXR3ZWVuIG9sZCBhbmQgbmV3ICdSJyBpbmRleAorICogbmVlZCB0byBiZSByZWNsYWltZWQuIEFzIHJlc3VsdCwgc29tZSBmcmVlIHNwYWNlIGZvcm1zLiAgSWYgdGhlcmUgaXMKKyAqIGVub3VnaCBmcmVlIHNwYWNlICg+IGxvdyBtYXJrKSwgd2FrZSB0aGUgc3RhY2sgdGhhdCBmZWVkcyB1cy4KKyAqLworc3RhdGljIHZvaWQgaXdsX2hjbWRfcXVldWVfcmVjbGFpbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIGludCBpZHgpCit7CisJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOworCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOworCWludCBuZnJlZWQgPSAwOworCisJaWYgKChpZHggPj0gcS0+bl9iZCkgfHwgKGl3bF9xdWV1ZV91c2VkKHEsIGlkeCkgPT0gMCkpIHsKKwkJSVdMX0VSUihwcml2LCAiJXM6IFJlYWQgaW5kZXggZm9yIERNQSBxdWV1ZSB0eHEgaWQgKCVkKSwgIgorCQkJICAiaW5kZXggJWQgaXMgb3V0IG9mIHJhbmdlIFswLSVkXSAlZCAlZC5cbiIsIF9fZnVuY19fLAorCQkJICB0eHFfaWQsIGlkeCwgcS0+bl9iZCwgcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGlkeCA9IGl3bF9xdWV1ZV9pbmNfd3JhcChpZHgsIHEtPm5fYmQpOyBxLT5yZWFkX3B0ciAhPSBpZHg7CisJICAgICBxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCkpIHsKKworCQlpZiAobmZyZWVkKysgPiAwKSB7CisJCQlJV0xfRVJSKHByaXYsICJIQ01EIHNraXBwZWQ6IGluZGV4ICglZCkgJWQgJWRcbiIsIGlkeCwKKwkJCQkJcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7CisJCQlpd2xhZ25fZndfZXJyb3IocHJpdiwgZmFsc2UpOworCQl9CisKKwl9Cit9CisKKy8qKgorICogaXdsX3R4X2NtZF9jb21wbGV0ZSAtIFB1bGwgdW51c2VkIGJ1ZmZlcnMgb2ZmIHRoZSBxdWV1ZSBhbmQgcmVjbGFpbSB0aGVtCisgKiBAcnhiOiBSeCBidWZmZXIgdG8gcmVjbGFpbQorICoKKyAqIElmIGFuIFJ4IGJ1ZmZlciBoYXMgYW4gYXN5bmMgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIGl0IHRoZSBjYWxsYmFjaworICogd2lsbCBiZSBleGVjdXRlZC4gIFRoZSBhdHRhY2hlZCBza2IgKGlmIHByZXNlbnQpIHdpbGwgb25seSBiZSBmcmVlZAorICogaWYgdGhlIGNhbGxiYWNrIHJldHVybnMgMQorICovCit2b2lkIGl3bF90eF9jbWRfY29tcGxldGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKK3sKKwlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwl1MTYgc2VxdWVuY2UgPSBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSk7CisJaW50IHR4cV9pZCA9IFNFUV9UT19RVUVVRShzZXF1ZW5jZSk7CisJaW50IGluZGV4ID0gU0VRX1RPX0lOREVYKHNlcXVlbmNlKTsKKwlpbnQgY21kX2luZGV4OworCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kOworCXN0cnVjdCBpd2xfY21kX21ldGEgKm1ldGE7CisJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVtwcml2LT5jbWRfcXVldWVdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBJZiBhIFR4IGNvbW1hbmQgaXMgYmVpbmcgaGFuZGxlZCBhbmQgaXQgaXNuJ3QgaW4gdGhlIGFjdHVhbAorCSAqIGNvbW1hbmQgcXVldWUgdGhlbiB0aGVyZSBhIGNvbW1hbmQgcm91dGluZyBidWcgaGFzIGJlZW4gaW50cm9kdWNlZAorCSAqIGluIHRoZSBxdWV1ZSBtYW5hZ2VtZW50IGNvZGUuICovCisJaWYgKFdBUk4odHhxX2lkICE9IHByaXYtPmNtZF9xdWV1ZSwKKwkJICJ3cm9uZyBjb21tYW5kIHF1ZXVlICVkIChzaG91bGQgYmUgJWQpLCBzZXF1ZW5jZSAweCVYIHJlYWRwPSVkIHdyaXRlcD0lZFxuIiwKKwkJICB0eHFfaWQsIHByaXYtPmNtZF9xdWV1ZSwgc2VxdWVuY2UsCisJCSAgcHJpdi0+dHhxW3ByaXYtPmNtZF9xdWV1ZV0ucS5yZWFkX3B0ciwKKwkJICBwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXS5xLndyaXRlX3B0cikpIHsKKwkJaXdsX3ByaW50X2hleF9lcnJvcihwcml2LCBwa3QsIDMyKTsKKwkJcmV0dXJuOworCX0KKworCWNtZF9pbmRleCA9IGdldF9jbWRfaW5kZXgoJnR4cS0+cSwgaW5kZXgpOworCWNtZCA9IHR4cS0+Y21kW2NtZF9pbmRleF07CisJbWV0YSA9ICZ0eHEtPm1ldGFbY21kX2luZGV4XTsKKworCWl3bGFnbl91bm1hcF90ZmQocHJpdiwgbWV0YSwgJnR4cS0+dGZkc1tpbmRleF0sIERNQV9CSURJUkVDVElPTkFMKTsKKworCS8qIElucHV0IGVycm9yIGNoZWNraW5nIGlzIGRvbmUgd2hlbiBjb21tYW5kcyBhcmUgYWRkZWQgdG8gcXVldWUuICovCisJaWYgKG1ldGEtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSB7CisJCW1ldGEtPnNvdXJjZS0+cmVwbHlfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXJ4Yl9hZGRyKHJ4Yik7CisJCXJ4Yi0+cGFnZSA9IE5VTEw7CisJfSBlbHNlIGlmIChtZXRhLT5jYWxsYmFjaykKKwkJbWV0YS0+Y2FsbGJhY2socHJpdiwgY21kLCBwa3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmhjbWRfbG9jaywgZmxhZ3MpOworCisJaXdsX2hjbWRfcXVldWVfcmVjbGFpbShwcml2LCB0eHFfaWQsIGluZGV4KTsKKworCWlmICghKG1ldGEtPmZsYWdzICYgQ01EX0FTWU5DKSkgeworCQljbGVhcl9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKTsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNsZWFyaW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLAorCQkJICAgICAgIGdldF9jbWRfc3RyaW5nKGNtZC0+aGRyLmNtZCkpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisJfQorCisJbWV0YS0+ZmxhZ3MgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aGNtZF9sb2NrLCBmbGFncyk7Cit9CisKK2NvbnN0IGNoYXIgKmdldF9jbWRfc3RyaW5nKHU4IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCQlJV0xfQ01EKFJFUExZX0FMSVZFKTsKKwkJSVdMX0NNRChSRVBMWV9FUlJPUik7CisJCUlXTF9DTUQoUkVQTFlfUlhPTik7CisJCUlXTF9DTUQoUkVQTFlfUlhPTl9BU1NPQyk7CisJCUlXTF9DTUQoUkVQTFlfUU9TX1BBUkFNKTsKKwkJSVdMX0NNRChSRVBMWV9SWE9OX1RJTUlORyk7CisJCUlXTF9DTUQoUkVQTFlfQUREX1NUQSk7CisJCUlXTF9DTUQoUkVQTFlfUkVNT1ZFX1NUQSk7CisJCUlXTF9DTUQoUkVQTFlfUkVNT1ZFX0FMTF9TVEEpOworCQlJV0xfQ01EKFJFUExZX1RYRklGT19GTFVTSCk7CisJCUlXTF9DTUQoUkVQTFlfV0VQS0VZKTsKKwkJSVdMX0NNRChSRVBMWV9UWCk7CisJCUlXTF9DTUQoUkVQTFlfTEVEU19DTUQpOworCQlJV0xfQ01EKFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQpOworCQlJV0xfQ01EKENPRVhfUFJJT1JJVFlfVEFCTEVfQ01EKTsKKwkJSVdMX0NNRChDT0VYX01FRElVTV9OT1RJRklDQVRJT04pOworCQlJV0xfQ01EKENPRVhfRVZFTlRfQ01EKTsKKwkJSVdMX0NNRChSRVBMWV9RVUlFVF9DTUQpOworCQlJV0xfQ01EKFJFUExZX0NIQU5ORUxfU1dJVENIKTsKKwkJSVdMX0NNRChDSEFOTkVMX1NXSVRDSF9OT1RJRklDQVRJT04pOworCQlJV0xfQ01EKFJFUExZX1NQRUNUUlVNX01FQVNVUkVNRU5UX0NNRCk7CisJCUlXTF9DTUQoU1BFQ1RSVU1fTUVBU1VSRV9OT1RJRklDQVRJT04pOworCQlJV0xfQ01EKFBPV0VSX1RBQkxFX0NNRCk7CisJCUlXTF9DTUQoUE1fU0xFRVBfTk9USUZJQ0FUSU9OKTsKKwkJSVdMX0NNRChQTV9ERUJVR19TVEFUSVNUSUNfTk9USUZJQyk7CisJCUlXTF9DTUQoUkVQTFlfU0NBTl9DTUQpOworCQlJV0xfQ01EKFJFUExZX1NDQU5fQUJPUlRfQ01EKTsKKwkJSVdMX0NNRChTQ0FOX1NUQVJUX05PVElGSUNBVElPTik7CisJCUlXTF9DTUQoU0NBTl9SRVNVTFRTX05PVElGSUNBVElPTik7CisJCUlXTF9DTUQoU0NBTl9DT01QTEVURV9OT1RJRklDQVRJT04pOworCQlJV0xfQ01EKEJFQUNPTl9OT1RJRklDQVRJT04pOworCQlJV0xfQ01EKFJFUExZX1RYX0JFQUNPTik7CisJCUlXTF9DTUQoV0hPX0lTX0FXQUtFX05PVElGSUNBVElPTik7CisJCUlXTF9DTUQoUVVJRVRfTk9USUZJQ0FUSU9OKTsKKwkJSVdMX0NNRChSRVBMWV9UWF9QV1JfVEFCTEVfQ01EKTsKKwkJSVdMX0NNRChNRUFTVVJFX0FCT1JUX05PVElGSUNBVElPTik7CisJCUlXTF9DTUQoUkVQTFlfQlRfQ09ORklHKTsKKwkJSVdMX0NNRChSRVBMWV9TVEFUSVNUSUNTX0NNRCk7CisJCUlXTF9DTUQoU1RBVElTVElDU19OT1RJRklDQVRJT04pOworCQlJV0xfQ01EKFJFUExZX0NBUkRfU1RBVEVfQ01EKTsKKwkJSVdMX0NNRChDQVJEX1NUQVRFX05PVElGSUNBVElPTik7CisJCUlXTF9DTUQoTUlTU0VEX0JFQUNPTlNfTk9USUZJQ0FUSU9OKTsKKwkJSVdMX0NNRChSRVBMWV9DVF9LSUxMX0NPTkZJR19DTUQpOworCQlJV0xfQ01EKFNFTlNJVElWSVRZX0NNRCk7CisJCUlXTF9DTUQoUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRCk7CisJCUlXTF9DTUQoUkVQTFlfUlhfUEhZX0NNRCk7CisJCUlXTF9DTUQoUkVQTFlfUlhfTVBEVV9DTUQpOworCQlJV0xfQ01EKFJFUExZX1JYKTsKKwkJSVdMX0NNRChSRVBMWV9DT01QUkVTU0VEX0JBKTsKKwkJSVdMX0NNRChDQUxJQlJBVElPTl9DRkdfQ01EKTsKKwkJSVdMX0NNRChDQUxJQlJBVElPTl9SRVNfTk9USUZJQ0FUSU9OKTsKKwkJSVdMX0NNRChDQUxJQlJBVElPTl9DT01QTEVURV9OT1RJRklDQVRJT04pOworCQlJV0xfQ01EKFJFUExZX1RYX1BPV0VSX0RCTV9DTUQpOworCQlJV0xfQ01EKFRFTVBFUkFUVVJFX05PVElGSUNBVElPTik7CisJCUlXTF9DTUQoVFhfQU5UX0NPTkZJR1VSQVRJT05fQ01EKTsKKwkJSVdMX0NNRChSRVBMWV9CVF9DT0VYX1BST0ZJTEVfTk9USUYpOworCQlJV0xfQ01EKFJFUExZX0JUX0NPRVhfUFJJT19UQUJMRSk7CisJCUlXTF9DTUQoUkVQTFlfQlRfQ09FWF9QUk9UX0VOVik7CisJCUlXTF9DTUQoUkVQTFlfV0lQQU5fUEFSQU1TKTsKKwkJSVdMX0NNRChSRVBMWV9XSVBBTl9SWE9OKTsKKwkJSVdMX0NNRChSRVBMWV9XSVBBTl9SWE9OX1RJTUlORyk7CisJCUlXTF9DTUQoUkVQTFlfV0lQQU5fUlhPTl9BU1NPQyk7CisJCUlXTF9DTUQoUkVQTFlfV0lQQU5fUU9TX1BBUkFNKTsKKwkJSVdMX0NNRChSRVBMWV9XSVBBTl9XRVBLRVkpOworCQlJV0xfQ01EKFJFUExZX1dJUEFOX1AyUF9DSEFOTkVMX1NXSVRDSCk7CisJCUlXTF9DTUQoUkVQTFlfV0lQQU5fTk9BX05PVElGSUNBVElPTik7CisJCUlXTF9DTUQoUkVQTFlfV0lQQU5fREVBQ1RJVkFUSU9OX0NPTVBMRVRFKTsKKwkJSVdMX0NNRChSRVBMWV9XT1dMQU5fUEFUVEVSTlMpOworCQlJV0xfQ01EKFJFUExZX1dPV0xBTl9XQUtFVVBfRklMVEVSKTsKKwkJSVdMX0NNRChSRVBMWV9XT1dMQU5fVFNDX1JTQ19QQVJBTVMpOworCQlJV0xfQ01EKFJFUExZX1dPV0xBTl9US0lQX1BBUkFNUyk7CisJCUlXTF9DTUQoUkVQTFlfV09XTEFOX0tFS19LQ0tfTUFURVJJQUwpOworCQlJV0xfQ01EKFJFUExZX1dPV0xBTl9HRVRfU1RBVFVTKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCisJfQorfQorCisjZGVmaW5lIEhPU1RfQ09NUExFVEVfVElNRU9VVCAoMiAqIEhaKQorCitzdGF0aWMgdm9pZCBpd2xfZ2VuZXJpY19jbWRfY2FsbGJhY2soc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCSAgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCisJCQkJICAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KQoreworCWlmIChwa3QtPmhkci5mbGFncyAmIElXTF9DTURfRkFJTEVEX01TSykgeworCQlJV0xfRVJSKHByaXYsICJCYWQgcmV0dXJuIGZyb20gJXMgKDB4JTA4WClcbiIsCisJCQlnZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpLCBwa3QtPmhkci5mbGFncyk7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRworCXN3aXRjaCAoY21kLT5oZHIuY21kKSB7CisJY2FzZSBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EOgorCWNhc2UgU0VOU0lUSVZJVFlfQ01EOgorCQlJV0xfREVCVUdfSENfRFVNUChwcml2LCAiYmFjayBmcm9tICVzICgweCUwOFgpXG4iLAorCQkJCWdldF9jbWRfc3RyaW5nKGNtZC0+aGRyLmNtZCksIHBrdC0+aGRyLmZsYWdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVdMX0RFQlVHX0hDKHByaXYsICJiYWNrIGZyb20gJXMgKDB4JTA4WClcbiIsCisJCQkJZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwgcGt0LT5oZHIuZmxhZ3MpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGl3bF9zZW5kX2NtZF9hc3luYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCkKK3sKKwlpbnQgcmV0OworCisJLyogQW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgY2FuIG5vdCBleHBlY3QgYW4gU0tCIHRvIGJlIHNldC4gKi8KKwlpZiAoV0FSTl9PTihjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBBc3NpZ24gYSBnZW5lcmljIGNhbGxiYWNrIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQgKi8KKwlpZiAoIWNtZC0+Y2FsbGJhY2spCisJCWNtZC0+Y2FsbGJhY2sgPSBpd2xfZ2VuZXJpY19jbWRfY2FsbGJhY2s7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXQgPSBpd2xfZW5xdWV1ZV9oY21kKHByaXYsIGNtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCisJCQkgIGdldF9jbWRfc3RyaW5nKGNtZC0+aWQpLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd2xfc2VuZF9jbWRfc3luYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCkKK3sKKwlpbnQgY21kX2lkeDsKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOworCisJIC8qIEEgc3luY2hyb25vdXMgY29tbWFuZCBjYW4gbm90IGhhdmUgYSBjYWxsYmFjayBzZXQuICovCisJaWYgKFdBUk5fT04oY21kLT5jYWxsYmFjaykpCisJCXJldHVybiAtRUlOVkFMOworCisJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkF0dGVtcHRpbmcgdG8gc2VuZCBzeW5jIGNvbW1hbmQgJXNcbiIsCisJCQlnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisKKwlzZXRfYml0KFNUQVRVU19IQ01EX0FDVElWRSwgJnByaXYtPnN0YXR1cyk7CisJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlNldHRpbmcgSENNRF9BQ1RJVkUgZm9yIGNvbW1hbmQgJXNcbiIsCisJCQlnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisKKwljbWRfaWR4ID0gaXdsX2VucXVldWVfaGNtZChwcml2LCBjbWQpOworCWlmIChjbWRfaWR4IDwgMCkgeworCQlyZXQgPSBjbWRfaWR4OworCQljbGVhcl9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKTsKKwkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCisJCQkgIGdldF9jbWRfc3RyaW5nKGNtZC0+aWQpLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSwKKwkJCSF0ZXN0X2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpLAorCQkJSE9TVF9DT01QTEVURV9USU1FT1VUKTsKKwlpZiAoIXJldCkgeworCQlpZiAodGVzdF9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKSkgeworCQkJSVdMX0VSUihwcml2LAorCQkJCSJFcnJvciBzZW5kaW5nICVzOiB0aW1lIG91dCBhZnRlciAlZG1zLlxuIiwKKwkJCQlnZXRfY21kX3N0cmluZyhjbWQtPmlkKSwKKwkJCQlqaWZmaWVzX3RvX21zZWNzKEhPU1RfQ09NUExFVEVfVElNRU9VVCkpOworCisJCQljbGVhcl9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKTsKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJDbGVhcmluZyBIQ01EX0FDVElWRSBmb3IgY29tbWFuZCIKKwkJCQkgIiVzXG4iLCBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisJCQlyZXQgPSAtRVRJTUVET1VUOworCQkJZ290byBjYW5jZWw7CisJCX0KKwl9CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpKSB7CisJCUlXTF9FUlIocHJpdiwgIkNvbW1hbmQgJXMgYWJvcnRlZDogUkYgS0lMTCBTd2l0Y2hcbiIsCisJCQkgICAgICAgZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOworCQlyZXQgPSAtRUNBTkNFTEVEOworCQlnb3RvIGZhaWw7CisJfQorCWlmICh0ZXN0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpKSB7CisJCUlXTF9FUlIocHJpdiwgIkNvbW1hbmQgJXMgZmFpbGVkOiBGVyBFcnJvclxuIiwKKwkJCSAgICAgICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKChjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSAmJiAhY21kLT5yZXBseV9wYWdlKSB7CisJCUlXTF9FUlIocHJpdiwgIkVycm9yOiBSZXNwb25zZSBOVUxMIGluICclcydcbiIsCisJCQkgIGdldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBjYW5jZWw7CisJfQorCisJcmV0dXJuIDA7CisKK2NhbmNlbDoKKwlpZiAoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikgeworCQkvKgorCQkgKiBDYW5jZWwgdGhlIENNRF9XQU5UX1NLQiBmbGFnIGZvciB0aGUgY21kIGluIHRoZQorCQkgKiBUWCBjbWQgcXVldWUuIE90aGVyd2lzZSBpbiBjYXNlIHRoZSBjbWQgY29tZXMKKwkJICogaW4gbGF0ZXIsIGl0IHdpbGwgcG9zc2libHkgc2V0IGFuIGludmFsaWQKKwkJICogYWRkcmVzcyAoY21kLT5tZXRhLnNvdXJjZSkuCisJCSAqLworCQlwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXS5tZXRhW2NtZF9pZHhdLmZsYWdzICY9CisJCQkJCQkJfkNNRF9XQU5UX1NLQjsKKwl9CitmYWlsOgorCWlmIChjbWQtPnJlcGx5X3BhZ2UpIHsKKwkJaXdsX2ZyZWVfcGFnZXMocHJpdiwgY21kLT5yZXBseV9wYWdlKTsKKwkJY21kLT5yZXBseV9wYWdlID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaXdsX3NlbmRfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9ob3N0X2NtZCAqY21kKQoreworCWlmIChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKQorCQlyZXR1cm4gaXdsX3NlbmRfY21kX2FzeW5jKHByaXYsIGNtZCk7CisKKwlyZXR1cm4gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgY21kKTsKK30KKworaW50IGl3bF9zZW5kX2NtZF9wZHUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBpZCwgdTMyIGZsYWdzLCB1MTYgbGVuLAorCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IGlkLAorCQkubGVuID0geyBsZW4sIH0sCisJCS5kYXRhID0geyBkYXRhLCB9LAorCQkuZmxhZ3MgPSBmbGFncywKKwl9OworCisJcmV0dXJuIGl3bF9zZW5kX2NtZChwcml2LCAmY21kKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjBkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy5jCkBAIC0wLDAgKzEsMTE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAorICogVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiaXdsLWRldi5oIgorI2luY2x1ZGUgIml3bC10cmFucy5oIgorI2luY2x1ZGUgIml3bC1jb3JlLmgiCisjaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKKyNpbmNsdWRlICJpd2wtdHJhbnMtaW50LXBjaWUuaCIKKy8qVE9ETyByZW1vdmUgdW5lZWRlZCBpbmNsdWRlcyB3aGVuIHRoZSB0cmFuc3BvcnQgbGF5ZXIgdHhfZnJlZSB3aWxsIGJlIGhlcmUgKi8KKyNpbmNsdWRlICJpd2wtYWduLmgiCisjaW5jbHVkZSAiaXdsLWNvcmUuaCIKKworc3RhdGljIGludCBpd2xfdHJhbnNfcnhfYWxsb2Moc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcHJpdi0+YnVzLT5kZXY7CisKKwltZW1zZXQoJnByaXYtPnJ4cSwgMCwgc2l6ZW9mKHByaXYtPnJ4cSkpOworCisJc3Bpbl9sb2NrX2luaXQoJnJ4cS0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfZnJlZSk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfdXNlZCk7CisKKwlpZiAoV0FSTl9PTihyeHEtPmJkIHx8IHJ4cS0+cmJfc3R0cykpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQWxsb2NhdGUgdGhlIGNpcmN1bGFyIGJ1ZmZlciBvZiBSZWFkIEJ1ZmZlciBEZXNjcmlwdG9ycyAoUkJEcykgKi8KKwlyeHEtPmJkID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZW9mKF9fbGUzMikgKiBSWF9RVUVVRV9TSVpFLAorCQkJCSAgICAgJnJ4cS0+YmRfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ4cS0+YmQpCisJCWdvdG8gZXJyX2JkOworCW1lbXNldChyeHEtPmJkLCAwLCBzaXplb2YoX19sZTMyKSAqIFJYX1FVRVVFX1NJWkUpOworCisJLypBbGxvY2F0ZSB0aGUgZHJpdmVyJ3MgcG9pbnRlciB0byByZWNlaXZlIGJ1ZmZlciBzdGF0dXMgKi8KKwlyeHEtPnJiX3N0dHMgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplb2YoKnJ4cS0+cmJfc3R0cyksCisJCQkJCSAgJnJ4cS0+cmJfc3R0c19kbWEsIEdGUF9LRVJORUwpOworCWlmICghcnhxLT5yYl9zdHRzKQorCQlnb3RvIGVycl9yYl9zdHRzOworCW1lbXNldChyeHEtPnJiX3N0dHMsIDAsIHNpemVvZigqcnhxLT5yYl9zdHRzKSk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JiX3N0dHM6CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplb2YoX19sZTMyKSAqIFJYX1FVRVVFX1NJWkUsCisJCQlyeHEtPmJkLCByeHEtPmJkX2RtYSk7CisJbWVtc2V0KCZyeHEtPmJkX2RtYSwgMCwgc2l6ZW9mKHJ4cS0+YmRfZG1hKSk7CisJcnhxLT5iZCA9IE5VTEw7CitlcnJfYmQ6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIGl3bF90cmFuc19yeHFfZnJlZV9yeF9idWZzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOworCWludCBpOworCisJLyogRmlsbCB0aGUgcnhfdXNlZCBxdWV1ZSB3aXRoIF9hbGxfIG9mIHRoZSBSeCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IFJYX0ZSRUVfQlVGRkVSUyArIFJYX1FVRVVFX1NJWkU7IGkrKykgeworCQkvKiBJbiB0aGUgcmVzZXQgZnVuY3Rpb24sIHRoZXNlIGJ1ZmZlcnMgbWF5IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKwkJICogdG8gYW4gU0tCLCBzbyB3ZSBuZWVkIHRvIHVubWFwIGFuZCBmcmVlIHBvdGVudGlhbCBzdG9yYWdlICovCisJCWlmIChyeHEtPnBvb2xbaV0ucGFnZSAhPSBOVUxMKSB7CisJCQlkbWFfdW5tYXBfcGFnZShwcml2LT5idXMtPmRldiwgcnhxLT5wb29sW2ldLnBhZ2VfZG1hLAorCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQkJX19pd2xfZnJlZV9wYWdlcyhwcml2LCByeHEtPnBvb2xbaV0ucGFnZSk7CisJCQlyeHEtPnBvb2xbaV0ucGFnZSA9IE5VTEw7CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmcnhxLT5wb29sW2ldLmxpc3QsICZyeHEtPnJ4X3VzZWQpOworCX0KK30KKworc3RhdGljIHZvaWQgaXdsX3RyYW5zX3J4X2h3X2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCSBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEpCit7CisJdTMyIHJiX3NpemU7CisJY29uc3QgdTMyIHJmZG5sb2cgPSBSWF9RVUVVRV9TSVpFX0xPRzsgLyogMjU2IFJCRHMgKi8KKwl1MzIgcmJfdGltZW91dCA9IDA7IC8qIEZJWE1FOiBSWF9SQl9USU1FT1VUIGZvciBhbGwgZGV2aWNlcz8gKi8KKworCXJiX3RpbWVvdXQgPSBSWF9SQl9USU1FT1VUOworCisJaWYgKGl3bGFnbl9tb2RfcGFyYW1zLmFtc2R1X3NpemVfOEspCisJCXJiX3NpemUgPSBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfOEs7CisJZWxzZQorCQlyYl9zaXplID0gRkhfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzRLOworCisJLyogU3RvcCBSeCBETUEgKi8KKwlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRywgMCk7CisKKwkvKiBSZXNldCBkcml2ZXIncyBSeCBxdWV1ZSB3cml0ZSBpbmRleCAqLworCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9SU0NTUl9DSE5MMF9SQkRDQl9XUFRSX1JFRywgMCk7CisKKwkvKiBUZWxsIGRldmljZSB3aGVyZSB0byBmaW5kIFJCRCBjaXJjdWxhciBidWZmZXIgaW4gRFJBTSAqLworCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRywKKwkJCSAgICh1MzIpKHJ4cS0+YmRfZG1hID4+IDgpKTsKKworCS8qIFRlbGwgZGV2aWNlIHdoZXJlIGluIERSQU0gdG8gdXBkYXRlIGl0cyBSeCBzdGF0dXMgKi8KKwlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRywKKwkJCSAgIHJ4cS0+cmJfc3R0c19kbWEgPj4gNCk7CisKKwkvKiBFbmFibGUgUnggRE1BCisJICogRkhfUkNTUl9DSE5MMF9SWF9JR05PUkVfUlhGX0VNUFRZIGlzIHNldCBiZWNhdXNlIG9mIEhXIGJ1ZyBpbgorCSAqICAgICAgdGhlIGNyZWRpdCBtZWNoYW5pc20gaW4gNTAwMCBIVyBSWCBGSUZPCisJICogRGlyZWN0IHJ4IGludGVycnVwdHMgdG8gaG9zdHMKKwkgKiBSeCBidWZmZXIgc2l6ZSA0IG9yIDhrCisJICogUkIgdGltZW91dCAweDEwCisJICogMjU2IFJCRHMKKwkgKi8KKwlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRywKKwkJCSAgIEZIX1JDU1JfUlhfQ09ORklHX0NITkxfRU5fRU5BQkxFX1ZBTCB8CisJCQkgICBGSF9SQ1NSX0NITkwwX1JYX0lHTk9SRV9SWEZfRU1QVFkgfAorCQkJICAgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfSU5UX0hPU1RfVkFMIHwKKwkJCSAgIEZIX1JDU1JfQ0hOTDBfUlhfQ09ORklHX1NJTkdMRV9GUkFNRV9NU0sgfAorCQkJICAgcmJfc2l6ZXwKKwkJCSAgIChyYl90aW1lb3V0IDw8IEZIX1JDU1JfUlhfQ09ORklHX1JFR19JUlFfUkJUSF9QT1MpfAorCQkJICAgKHJmZG5sb2cgPDwgRkhfUkNTUl9SWF9DT05GSUdfUkJEQ0JfU0laRV9QT1MpKTsKKworCS8qIFNldCBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lciB0byBkZWZhdWx0ICgyMDQ4IHVzZWNzKSAqLworCWl3bF93cml0ZTgocHJpdiwgQ1NSX0lOVF9DT0FMRVNDSU5HLCBJV0xfSE9TVF9JTlRfVElNRU9VVF9ERUYpOworfQorCitzdGF0aWMgaW50IGl3bF9yeF9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOworCWludCBpLCBlcnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghcnhxLT5iZCkgeworCQllcnIgPSBpd2xfdHJhbnNfcnhfYWxsb2MocHJpdik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF9mcmVlKTsKKwlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF91c2VkKTsKKworCWl3bF90cmFuc19yeHFfZnJlZV9yeF9idWZzKHByaXYpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX1NJWkU7IGkrKykKKwkJcnhxLT5xdWV1ZVtpXSA9IE5VTEw7CisKKwkvKiBTZXQgdXMgc28gdGhhdCB3ZSBoYXZlIHByb2Nlc3NlZCBhbmQgdXNlZCBhbGwgYnVmZmVycywgYnV0IGhhdmUKKwkgKiBub3QgcmVzdG9ja2VkIHRoZSBSeCBxdWV1ZSB3aXRoIGZyZXNoIGJ1ZmZlcnMgKi8KKwlyeHEtPnJlYWQgPSByeHEtPndyaXRlID0gMDsKKwlyeHEtPndyaXRlX2FjdHVhbCA9IDA7CisJcnhxLT5mcmVlX2NvdW50ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCWl3bGFnbl9yeF9yZXBsZW5pc2gocHJpdik7CisKKwlpd2xfdHJhbnNfcnhfaHdfaW5pdChwcml2LCByeHEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlyeHEtPm5lZWRfdXBkYXRlID0gMTsKKwlpd2xfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihwcml2LCByeHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpd2xfdHJhbnNfcnhfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyppZiByeHEtPmJkIGlzIE5VTEwsIGl0IG1lYW5zIHRoYXQgbm90aGluZyBoYXMgYmVlbiBhbGxvY2F0ZWQsCisJICogZXhpdCBub3cgKi8KKwlpZiAoIXJ4cS0+YmQpIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkZyZWUgTlVMTCByeCBjb250ZXh0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwlpd2xfdHJhbnNfcnhxX2ZyZWVfcnhfYnVmcyhwcml2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCWRtYV9mcmVlX2NvaGVyZW50KHByaXYtPmJ1cy0+ZGV2LCBzaXplb2YoX19sZTMyKSAqIFJYX1FVRVVFX1NJWkUsCisJCQkgIHJ4cS0+YmQsIHJ4cS0+YmRfZG1hKTsKKwltZW1zZXQoJnJ4cS0+YmRfZG1hLCAwLCBzaXplb2YocnhxLT5iZF9kbWEpKTsKKwlyeHEtPmJkID0gTlVMTDsKKworCWlmIChyeHEtPnJiX3N0dHMpCisJCWRtYV9mcmVlX2NvaGVyZW50KHByaXYtPmJ1cy0+ZGV2LAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBpd2xfcmJfc3RhdHVzKSwKKwkJCQkgIHJ4cS0+cmJfc3R0cywgcnhxLT5yYl9zdHRzX2RtYSk7CisJZWxzZQorCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRnJlZSByeHEtPnJiX3N0dHMgd2hpY2ggaXMgTlVMTFxuIik7CisJbWVtc2V0KCZyeHEtPnJiX3N0dHNfZG1hLCAwLCBzaXplb2YocnhxLT5yYl9zdHRzX2RtYSkpOworCXJ4cS0+cmJfc3R0cyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaXdsX3RyYW5zX3J4X3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCisJLyogc3RvcCBSeCBETUEgKi8KKwlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRywgMCk7CisJcmV0dXJuIGl3bF9wb2xsX2RpcmVjdF9iaXQocHJpdiwgRkhfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRywKKwkJCSAgICBGSF9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUsIDEwMDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBpd2xhZ25fYWxsb2NfZG1hX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJICAgIHN0cnVjdCBpd2xfZG1hX3B0ciAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoV0FSTl9PTihwdHItPmFkZHIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB0ci0+YWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChwcml2LT5idXMtPmRldiwgc2l6ZSwKKwkJCQkgICAgICAgJnB0ci0+ZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0ci0+YWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisJcHRyLT5zaXplID0gc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGl3bGFnbl9mcmVlX2RtYV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCSAgICBzdHJ1Y3QgaXdsX2RtYV9wdHIgKnB0cikKK3sKKwlpZiAodW5saWtlbHkoIXB0ci0+YWRkcikpCisJCXJldHVybjsKKworCWRtYV9mcmVlX2NvaGVyZW50KHByaXYtPmJ1cy0+ZGV2LCBwdHItPnNpemUsIHB0ci0+YWRkciwgcHRyLT5kbWEpOworCW1lbXNldChwdHIsIDAsIHNpemVvZigqcHRyKSk7Cit9CisKK3N0YXRpYyBpbnQgaXdsX3RyYW5zX3R4cV9hbGxvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKKwkJICAgICAgaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCkKK3sKKwlzaXplX3QgdGZkX3N6ID0gcHJpdi0+aHdfcGFyYW1zLnRmZF9zaXplICogVEZEX1FVRVVFX1NJWkVfTUFYOworCWludCBpOworCisJaWYgKFdBUk5fT04odHhxLT5tZXRhIHx8IHR4cS0+Y21kIHx8IHR4cS0+dHhiIHx8IHR4cS0+dGZkcykpCisJCXJldHVybiAtRUlOVkFMOworCisJdHhxLT5xLm5fd2luZG93ID0gc2xvdHNfbnVtOworCisJdHhxLT5tZXRhID0ga3phbGxvYyhzaXplb2YodHhxLT5tZXRhWzBdKSAqIHNsb3RzX251bSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwl0eHEtPmNtZCA9IGt6YWxsb2Moc2l6ZW9mKHR4cS0+Y21kWzBdKSAqIHNsb3RzX251bSwKKwkJCSAgIEdGUF9LRVJORUwpOworCisJaWYgKCF0eHEtPm1ldGEgfHwgIXR4cS0+Y21kKQorCQlnb3RvIGVycm9yOworCisJZm9yIChpID0gMDsgaSA8IHNsb3RzX251bTsgaSsrKSB7CisJCXR4cS0+Y21kW2ldID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGl3bF9kZXZpY2VfY21kKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghdHhxLT5jbWRbaV0pCisJCQlnb3RvIGVycm9yOworCX0KKworCS8qIEFsbG9jIGRyaXZlciBkYXRhIGFycmF5IGFuZCBURkQgY2lyY3VsYXIgYnVmZmVyICovCisJLyogRHJpdmVyIHByaXZhdGUgZGF0YSwgb25seSBmb3IgVHggKG5vdCBjb21tYW5kKSBxdWV1ZXMsCisJICogbm90IHNoYXJlZCB3aXRoIGRldmljZS4gKi8KKwlpZiAodHhxX2lkICE9IHByaXYtPmNtZF9xdWV1ZSkgeworCQl0eHEtPnR4YiA9IGt6YWxsb2Moc2l6ZW9mKHR4cS0+dHhiWzBdKSAqCisJCQkJICAgVEZEX1FVRVVFX1NJWkVfTUFYLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0eHEtPnR4YikgeworCQkJSVdMX0VSUihwcml2LCAia21hbGxvYyBmb3IgYXV4aWxpYXJ5IEJEICIKKwkJCQkgICJzdHJ1Y3R1cmVzIGZhaWxlZFxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJfSBlbHNlIHsKKwkJdHhxLT50eGIgPSBOVUxMOworCX0KKworCS8qIENpcmN1bGFyIGJ1ZmZlciBvZiB0cmFuc21pdCBmcmFtZSBkZXNjcmlwdG9ycyAoVEZEcyksCisJICogc2hhcmVkIHdpdGggZGV2aWNlICovCisJdHhxLT50ZmRzID0gZG1hX2FsbG9jX2NvaGVyZW50KHByaXYtPmJ1cy0+ZGV2LCB0ZmRfc3osICZ0eHEtPnEuZG1hX2FkZHIsCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghdHhxLT50ZmRzKSB7CisJCUlXTF9FUlIocHJpdiwgImRtYV9hbGxvY19jb2hlcmVudCglemQpIGZhaWxlZFxuIiwgdGZkX3N6KTsKKwkJZ290byBlcnJvcjsKKwl9CisJdHhxLT5xLmlkID0gdHhxX2lkOworCisJcmV0dXJuIDA7CitlcnJvcjoKKwlrZnJlZSh0eHEtPnR4Yik7CisJdHhxLT50eGIgPSBOVUxMOworCS8qIHNpbmNlIHR4cS0+Y21kIGhhcyBiZWVuIHplcm9lZCwKKwkgKiBhbGwgbm9uIGFsbG9jYXRlZCBjbWRbaV0gd2lsbCBiZSBOVUxMICovCisJaWYgKHR4cS0+Y21kKQorCQlmb3IgKGkgPSAwOyBpIDwgc2xvdHNfbnVtOyBpKyspCisJCQlrZnJlZSh0eHEtPmNtZFtpXSk7CisJa2ZyZWUodHhxLT5tZXRhKTsKKwlrZnJlZSh0eHEtPmNtZCk7CisJdHhxLT5tZXRhID0gTlVMTDsKKwl0eHEtPmNtZCA9IE5VTEw7CisKKwlyZXR1cm4gLUVOT01FTTsKKworfQorCitzdGF0aWMgaW50IGl3bF90cmFuc190eHFfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKKwkJICAgICAgaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCkKK3sKKwlpbnQgcmV0OworCisJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7CisJbWVtc2V0KHR4cS0+bWV0YSwgMCwgc2l6ZW9mKHR4cS0+bWV0YVswXSkgKiBzbG90c19udW0pOworCisJLyoKKwkgKiBGb3IgdGhlIGRlZmF1bHQgcXVldWVzIDAtMywgc2V0IHVwIHRoZSBzd3FfaWQKKwkgKiBhbHJlYWR5IC0tIGFsbCBvdGhlcnMgbmVlZCB0byBnZXQgb25lIGxhdGVyCisJICogKGlmIHRoZXkgbmVlZCBvbmUgYXQgYWxsKS4KKwkgKi8KKwlpZiAodHhxX2lkIDwgNCkKKwkJaXdsX3NldF9zd3FfaWQodHhxLCB0eHFfaWQsIHR4cV9pZCk7CisKKwkvKiBURkRfUVVFVUVfU0laRV9NQVggbXVzdCBiZSBwb3dlci1vZi10d28gc2l6ZSwgb3RoZXJ3aXNlCisJICogaXdsX3F1ZXVlX2luY193cmFwIGFuZCBpd2xfcXVldWVfZGVjX3dyYXAgYXJlIGJyb2tlbi4gKi8KKwlCVUlMRF9CVUdfT04oVEZEX1FVRVVFX1NJWkVfTUFYICYgKFRGRF9RVUVVRV9TSVpFX01BWCAtIDEpKTsKKworCS8qIEluaXRpYWxpemUgcXVldWUncyBoaWdoL2xvdy13YXRlciBtYXJrcywgYW5kIGhlYWQvdGFpbCBpbmRleGVzICovCisJcmV0ID0gaXdsX3F1ZXVlX2luaXQocHJpdiwgJnR4cS0+cSwgVEZEX1FVRVVFX1NJWkVfTUFYLCBzbG90c19udW0sCisJCQl0eHFfaWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFRlbGwgbmljIHdoZXJlIHRvIGZpbmQgY2lyY3VsYXIgYnVmZmVyIG9mIFR4IEZyYW1lIERlc2NyaXB0b3JzIGZvcgorCSAqIGdpdmVuIFR4IHF1ZXVlLCBhbmQgZW5hYmxlIHRoZSBETUEgY2hhbm5lbCB1c2VkIGZvciB0aGF0IHF1ZXVlLgorCSAqIENpcmN1bGFyIGJ1ZmZlciAoVEZEIHF1ZXVlIGluIERSQU0pIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyAqLworCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9NRU1fQ0JCQ19RVUVVRSh0eHFfaWQpLAorCQkJICAgICB0eHEtPnEuZG1hX2FkZHIgPj4gOCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpd2xfdHhfcXVldWVfdW5tYXAgLSAgVW5tYXAgYW55IHJlbWFpbmluZyBETUEgbWFwcGluZ3MgYW5kIGZyZWUgc2tiJ3MKKyAqLworc3RhdGljIHZvaWQgaXdsX3R4X3F1ZXVlX3VubWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHR4cV9pZCkKK3sKKwlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07CisJc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CisKKwlpZiAoIXEtPm5fYmQpCisJCXJldHVybjsKKworCXdoaWxlIChxLT53cml0ZV9wdHIgIT0gcS0+cmVhZF9wdHIpIHsKKwkJLyogVGhlIHJlYWRfcHRyIG5lZWRzIHRvIGJvdW5kIGJ5IHEtPm5fd2luZG93ICovCisJCWl3bGFnbl90eHFfZnJlZV90ZmQocHJpdiwgdHhxLCBnZXRfY21kX2luZGV4KHEsIHEtPnJlYWRfcHRyKSk7CisJCXEtPnJlYWRfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKTsKKwl9Cit9CisKKy8qKgorICogaXdsX3R4X3F1ZXVlX2ZyZWUgLSBEZWFsbG9jYXRlIERNQSBxdWV1ZS4KKyAqIEB0eHE6IFRyYW5zbWl0IHF1ZXVlIHRvIGRlYWxsb2NhdGUuCisgKgorICogRW1wdHkgcXVldWUgYnkgcmVtb3ZpbmcgYW5kIGRlc3Ryb3lpbmcgYWxsIEJEJ3MuCisgKiBGcmVlIGFsbCBidWZmZXJzLgorICogMC1maWxsLCBidXQgZG8gbm90IGZyZWUgInR4cSIgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIGl3bF90eF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHR4cV9pZCkKK3sKKwlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07CisJc3RydWN0IGRldmljZSAqZGV2ID0gcHJpdi0+YnVzLT5kZXY7CisJaW50IGk7CisJaWYgKFdBUk5fT04oIXR4cSkpCisJCXJldHVybjsKKworCWl3bF90eF9xdWV1ZV91bm1hcChwcml2LCB0eHFfaWQpOworCisJLyogRGUtYWxsb2MgYXJyYXkgb2YgY29tbWFuZC90eCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IHR4cS0+cS5uX3dpbmRvdzsgaSsrKQorCQlrZnJlZSh0eHEtPmNtZFtpXSk7CisKKwkvKiBEZS1hbGxvYyBjaXJjdWxhciBidWZmZXIgb2YgVEZEcyAqLworCWlmICh0eHEtPnEubl9iZCkgeworCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHByaXYtPmh3X3BhcmFtcy50ZmRfc2l6ZSAqCisJCQkJICB0eHEtPnEubl9iZCwgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOworCQltZW1zZXQoJnR4cS0+cS5kbWFfYWRkciwgMCwgc2l6ZW9mKHR4cS0+cS5kbWFfYWRkcikpOworCX0KKworCS8qIERlLWFsbG9jIGFycmF5IG9mIHBlci1URkQgZHJpdmVyIGRhdGEgKi8KKwlrZnJlZSh0eHEtPnR4Yik7CisJdHhxLT50eGIgPSBOVUxMOworCisJLyogZGVhbGxvY2F0ZSBhcnJheXMgKi8KKwlrZnJlZSh0eHEtPmNtZCk7CisJa2ZyZWUodHhxLT5tZXRhKTsKKwl0eHEtPmNtZCA9IE5VTEw7CisJdHhxLT5tZXRhID0gTlVMTDsKKworCS8qIDAtZmlsbCBxdWV1ZSBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLworCW1lbXNldCh0eHEsIDAsIHNpemVvZigqdHhxKSk7Cit9CisKKy8qKgorICogaXdsX3RyYW5zX3R4X2ZyZWUgLSBGcmVlIFRYUSBDb250ZXh0CisgKgorICogRGVzdHJveSBhbGwgVFggRE1BIHF1ZXVlcyBhbmQgc3RydWN0dXJlcworICovCitzdGF0aWMgdm9pZCBpd2xfdHJhbnNfdHhfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJaW50IHR4cV9pZDsKKworCS8qIFR4IHF1ZXVlcyAqLworCWlmIChwcml2LT50eHEpIHsKKwkJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKQorCQkJaXdsX3R4X3F1ZXVlX2ZyZWUocHJpdiwgdHhxX2lkKTsKKwl9CisKKwlrZnJlZShwcml2LT50eHEpOworCXByaXYtPnR4cSA9IE5VTEw7CisKKwlpd2xhZ25fZnJlZV9kbWFfcHRyKHByaXYsICZwcml2LT5rdyk7CisKKwlpd2xhZ25fZnJlZV9kbWFfcHRyKHByaXYsICZwcml2LT5zY2RfYmNfdGJscyk7Cit9CisKKy8qKgorICogaXdsX3RyYW5zX3R4X2FsbG9jIC0gYWxsb2NhdGUgVFggY29udGV4dAorICogQWxsb2NhdGUgYWxsIFR4IERNQSBzdHJ1Y3R1cmVzIGFuZCBpbml0aWFsaXplIHRoZW0KKyAqCisgKiBAcGFyYW0gcHJpdgorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXdsX3RyYW5zX3R4X2FsbG9jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlpbnQgcmV0OworCWludCB0eHFfaWQsIHNsb3RzX251bTsKKworCS8qSXQgaXMgbm90IGFsbG93ZWQgdG8gYWxsb2MgdHdpY2UsIHNvIHdhcm4gd2hlbiB0aGlzIGhhcHBlbnMuCisJICogV2UgY2Fubm90IHJlbHkgb24gdGhlIHByZXZpb3VzIGFsbG9jYXRpb24sIHNvIGZyZWUgYW5kIGZhaWwgKi8KKwlpZiAoV0FSTl9PTihwcml2LT50eHEpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0ID0gaXdsYWduX2FsbG9jX2RtYV9wdHIocHJpdiwgJnByaXYtPnNjZF9iY190YmxzLAorCQkJCXByaXYtPmh3X3BhcmFtcy5zY2RfYmNfdGJsc19zaXplKTsKKwlpZiAocmV0KSB7CisJCUlXTF9FUlIocHJpdiwgIlNjaGVkdWxlciBCQyBUYWJsZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogQWxsb2Mga2VlcC13YXJtIGJ1ZmZlciAqLworCXJldCA9IGl3bGFnbl9hbGxvY19kbWFfcHRyKHByaXYsICZwcml2LT5rdywgSVdMX0tXX1NJWkUpOworCWlmIChyZXQpIHsKKwkJSVdMX0VSUihwcml2LCAiS2VlcCBXYXJtIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlwcml2LT50eHEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXdsX3R4X3F1ZXVlKSAqCisJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYtPnR4cSkgeworCQlJV0xfRVJSKHByaXYsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdHhxXG4iKTsKKwkJcmV0ID0gRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIEFsbG9jIGFuZCBpbml0IGFsbCBUeCBxdWV1ZXMsIGluY2x1ZGluZyB0aGUgY29tbWFuZCBxdWV1ZSAoIzQvIzkpICovCisJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKSB7CisJCXNsb3RzX251bSA9ICh0eHFfaWQgPT0gcHJpdi0+Y21kX3F1ZXVlKSA/CisJCQkJCVRGRF9DTURfU0xPVFMgOiBURkRfVFhfQ01EX1NMT1RTOworCQlyZXQgPSBpd2xfdHJhbnNfdHhxX2FsbG9jKHByaXYsICZwcml2LT50eHFbdHhxX2lkXSwgc2xvdHNfbnVtLAorCQkJCSAgICAgICB0eHFfaWQpOworCQlpZiAocmV0KSB7CisJCQlJV0xfRVJSKHByaXYsICJUeCAlZCBxdWV1ZSBhbGxvYyBmYWlsZWRcbiIsIHR4cV9pZCk7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXRyYW5zX3R4X2ZyZWUoJnByaXYtPnRyYW5zKTsKKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IGl3bF90eF9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlpbnQgcmV0OworCWludCB0eHFfaWQsIHNsb3RzX251bTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgYWxsb2MgPSBmYWxzZTsKKworCWlmICghcHJpdi0+dHhxKSB7CisJCXJldCA9IGl3bF90cmFuc190eF9hbGxvYyhwcml2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJCWFsbG9jID0gdHJ1ZTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogVHVybiBvZmYgYWxsIFR4IERNQSBmaWZvcyAqLworCWl3bF93cml0ZV9wcnBoKHByaXYsIFNDRF9UWEZBQ1QsIDApOworCisJLyogVGVsbCBOSUMgd2hlcmUgdG8gZmluZCB0aGUgImtlZXAgd2FybSIgYnVmZmVyICovCisJaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX0tXX01FTV9BRERSX1JFRywgcHJpdi0+a3cuZG1hID4+IDQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogQWxsb2MgYW5kIGluaXQgYWxsIFR4IHF1ZXVlcywgaW5jbHVkaW5nIHRoZSBjb21tYW5kIHF1ZXVlICgjNC8jOSkgKi8KKwlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IHByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspIHsKKwkJc2xvdHNfbnVtID0gKHR4cV9pZCA9PSBwcml2LT5jbWRfcXVldWUpID8KKwkJCQkJVEZEX0NNRF9TTE9UUyA6IFRGRF9UWF9DTURfU0xPVFM7CisJCXJldCA9IGl3bF90cmFuc190eHFfaW5pdChwcml2LCAmcHJpdi0+dHhxW3R4cV9pZF0sIHNsb3RzX251bSwKKwkJCQkgICAgICAgdHhxX2lkKTsKKwkJaWYgKHJldCkgeworCQkJSVdMX0VSUihwcml2LCAiVHggJWQgcXVldWUgaW5pdCBmYWlsZWRcbiIsIHR4cV9pZCk7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJcmV0dXJuIDA7CitlcnJvcjoKKwkvKlVwb24gZXJyb3IsIGZyZWUgb25seSBpZiB3ZSBhbGxvY2F0ZWQgc29tZXRoaW5nICovCisJaWYgKGFsbG9jKQorCQl0cmFuc190eF9mcmVlKCZwcml2LT50cmFucyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaXdsX3NldF9wd3Jfdm1haW4oc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworLyoKKyAqIChmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcykKKyAqIHRvIHNldCBwb3dlciB0byBWX0FVWCwgZG86CisKKwkJaWYgKHBjaV9wbWVfY2FwYWJsZShwcml2LT5wY2lfZGV2LCBQQ0lfRDNjb2xkKSkKKwkJCWl3bF9zZXRfYml0c19tYXNrX3BycGgocHJpdiwgQVBNR19QU19DVFJMX1JFRywKKwkJCQkJICAgICAgIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WQVVYLAorCQkJCQkgICAgICAgfkFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQyk7CisgKi8KKworCWl3bF9zZXRfYml0c19tYXNrX3BycGgocHJpdiwgQVBNR19QU19DVFJMX1JFRywKKwkJCSAgICAgICBBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfVk1BSU4sCisJCQkgICAgICAgfkFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQyk7Cit9CisKK3N0YXRpYyBpbnQgaXdsX25pY19pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogbmljX2luaXQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWl3bF9hcG1faW5pdChwcml2KTsKKworCS8qIFNldCBpbnRlcnJ1cHQgY29hbGVzY2luZyBjYWxpYnJhdGlvbiB0aW1lciB0byBkZWZhdWx0ICg1MTIgdXNlY3MpICovCisJaXdsX3dyaXRlOChwcml2LCBDU1JfSU5UX0NPQUxFU0NJTkcsIElXTF9IT1NUX0lOVF9DQUxJQl9USU1FT1VUX0RFRik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlpd2xfc2V0X3B3cl92bWFpbihwcml2KTsKKworCXByaXYtPmNmZy0+bGliLT5uaWNfY29uZmlnKHByaXYpOworCisJLyogQWxsb2NhdGUgdGhlIFJYIHF1ZXVlLCBvciByZXNldCBpZiBpdCBpcyBhbHJlYWR5IGFsbG9jYXRlZCAqLworCWl3bF9yeF9pbml0KHByaXYpOworCisJLyogQWxsb2NhdGUgb3IgcmVzZXQgYW5kIGluaXQgYWxsIFR4IGFuZCBDb21tYW5kIHF1ZXVlcyAqLworCWlmIChpd2xfdHhfaW5pdChwcml2KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+c2hhZG93X3JlZ19lbmFibGUpIHsKKwkJLyogZW5hYmxlIHNoYWRvdyByZWdzIGluIEhXICovCisJCWl3bF9zZXRfYml0KHByaXYsIENTUl9NQUNfU0hBRE9XX1JFR19DVFJMLAorCQkJMHg4MDBGRkZGRik7CisJfQorCisJc2V0X2JpdChTVEFUVVNfSU5JVCwgJnByaXYtPnN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBIV19SRUFEWV9USU1FT1VUICg1MCkKKworLyogTm90ZTogcmV0dXJucyBwb2xsX2JpdCByZXR1cm4gdmFsdWUsIHdoaWNoIGlzID49IDAgaWYgc3VjY2VzcyAqLworc3RhdGljIGludCBpd2xfc2V0X2h3X3JlYWR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlpbnQgcmV0OworCisJaXdsX3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCUNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUkVBRFkpOworCisJLyogU2VlIGlmIHdlIGdvdCBpdCAqLworCXJldCA9IGl3bF9wb2xsX2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1JFQURZLAorCQkJCUNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUkVBRFksCisJCQkJSFdfUkVBRFlfVElNRU9VVCk7CisKKwlJV0xfREVCVUdfSU5GTyhwcml2LCAiaGFyZHdhcmUlcyByZWFkeVxuIiwgcmV0IDwgMCA/ICIgbm90IiA6ICIiKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBOb3RlOiByZXR1cm5zIHN0YW5kYXJkIDAvLUVSUk9SIGNvZGUgKi8KK3N0YXRpYyBpbnQgaXdsX3RyYW5zX3ByZXBhcmVfY2FyZF9odyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJaW50IHJldDsKKworCUlXTF9ERUJVR19JTkZPKHByaXYsICJpd2xfdHJhbnNfcHJlcGFyZV9jYXJkX2h3IGVudGVyXG4iKTsKKworCXJldCA9IGl3bF9zZXRfaHdfcmVhZHkocHJpdik7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIElmIEhXIGlzIG5vdCByZWFkeSwgcHJlcGFyZSB0aGUgY29uZGl0aW9ucyB0byBjaGVjayBhZ2FpbiAqLworCWl3bF9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfUFJFUEFSRSk7CisKKwlyZXQgPSBpd2xfcG9sbF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCQl+Q1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUsCisJCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1BSRVBBUkVfRE9ORSwgMTUwMDAwKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogSFcgc2hvdWxkIGJlIHJlYWR5IGJ5IG5vdywgY2hlY2sgYWdhaW4uICovCisJcmV0ID0gaXdsX3NldF9od19yZWFkeShwcml2KTsKKwlpZiAocmV0ID49IDApCisJCXJldHVybiAwOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXdsX3RyYW5zX3N0YXJ0X2RldmljZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJaW50IHJldDsKKworCXByaXYtPnVjb2RlX293bmVyID0gSVdMX09XTkVSU0hJUF9EUklWRVI7CisKKwlpZiAoKHByaXYtPmNmZy0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfQU1UX0VOQUJMRSkgJiYKKwkgICAgIGl3bF90cmFuc19wcmVwYXJlX2NhcmRfaHcocHJpdikpIHsKKwkJSVdMX1dBUk4ocHJpdiwgIkV4aXQgSFcgbm90IHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogSWYgcGxhdGZvcm0ncyBSRl9LSUxMIHN3aXRjaCBpcyBOT1Qgc2V0IHRvIEtJTEwgKi8KKwlpZiAoaXdsX3JlYWQzMihwcml2LCBDU1JfR1BfQ05UUkwpICYKKwkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKQorCQljbGVhcl9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOworCWVsc2UKKwkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7CisKKwlpZiAoaXdsX2lzX3Jma2lsbChwcml2KSkgeworCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPmh3LT53aXBoeSwgdHJ1ZSk7CisJCWl3bF9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKKwkJcmV0dXJuIC1FUkZLSUxMOworCX0KKworCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlQsIDB4RkZGRkZGRkYpOworCisJcmV0ID0gaXdsX25pY19pbml0KHByaXYpOworCWlmIChyZXQpIHsKKwkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXQgbmljXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBtYWtlIHN1cmUgcmZraWxsIGhhbmRzaGFrZSBiaXRzIGFyZSBjbGVhcmVkICovCisJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7CisJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLAorCQkgICAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKKworCS8qIGNsZWFyIChhZ2FpbiksIHRoZW4gZW5hYmxlIGhvc3QgaW50ZXJydXB0cyAqLworCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlQsIDB4RkZGRkZGRkYpOworCWl3bF9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKKworCS8qIHJlYWxseSBtYWtlIHN1cmUgcmZraWxsIGhhbmRzaGFrZSBiaXRzIGFyZSBjbGVhcmVkICovCisJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7CisJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFjdGl2YXRlL0RlYWN0aXZhdGUgVHggRE1BL0ZJRk8gY2hhbm5lbHMgYWNjb3JkaW5nIHR4IGZpZm9zIG1hc2sKKyAqIG11c3QgYmUgY2FsbGVkIHVuZGVyIHByaXYtPmxvY2sgYW5kIG1hYyBhY2Nlc3MKKyAqLworc3RhdGljIHZvaWQgaXdsX3RyYW5zX3R4cV9zZXRfc2NoZWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgbWFzaykKK3sKKwlpd2xfd3JpdGVfcHJwaChwcml2LCBTQ0RfVFhGQUNULCBtYXNrKTsKK30KKworI2RlZmluZSBJV0xfQUNfVU5TRVQgLTEKKworc3RydWN0IHF1ZXVlX3RvX2ZpZm9fYWMgeworCXM4IGZpZm8sIGFjOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBxdWV1ZV90b19maWZvX2FjIGl3bGFnbl9kZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm9bXSA9IHsKKwl7IElXTF9UWF9GSUZPX1ZPLCBJRUVFODAyMTFfQUNfVk8sIH0sCisJeyBJV0xfVFhfRklGT19WSSwgSUVFRTgwMjExX0FDX1ZJLCB9LAorCXsgSVdMX1RYX0ZJRk9fQkUsIElFRUU4MDIxMV9BQ19CRSwgfSwKKwl7IElXTF9UWF9GSUZPX0JLLCBJRUVFODAyMTFfQUNfQkssIH0sCisJeyBJV0xBR05fQ01EX0ZJRk9fTlVNLCBJV0xfQUNfVU5TRVQsIH0sCisJeyBJV0xfVFhfRklGT19VTlVTRUQsIElXTF9BQ19VTlNFVCwgfSwKKwl7IElXTF9UWF9GSUZPX1VOVVNFRCwgSVdMX0FDX1VOU0VULCB9LAorCXsgSVdMX1RYX0ZJRk9fVU5VU0VELCBJV0xfQUNfVU5TRVQsIH0sCisJeyBJV0xfVFhfRklGT19VTlVTRUQsIElXTF9BQ19VTlNFVCwgfSwKKwl7IElXTF9UWF9GSUZPX1VOVVNFRCwgSVdMX0FDX1VOU0VULCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBxdWV1ZV90b19maWZvX2FjIGl3bGFnbl9pcGFuX3F1ZXVlX3RvX3R4X2ZpZm9bXSA9IHsKKwl7IElXTF9UWF9GSUZPX1ZPLCBJRUVFODAyMTFfQUNfVk8sIH0sCisJeyBJV0xfVFhfRklGT19WSSwgSUVFRTgwMjExX0FDX1ZJLCB9LAorCXsgSVdMX1RYX0ZJRk9fQkUsIElFRUU4MDIxMV9BQ19CRSwgfSwKKwl7IElXTF9UWF9GSUZPX0JLLCBJRUVFODAyMTFfQUNfQkssIH0sCisJeyBJV0xfVFhfRklGT19CS19JUEFOLCBJRUVFODAyMTFfQUNfQkssIH0sCisJeyBJV0xfVFhfRklGT19CRV9JUEFOLCBJRUVFODAyMTFfQUNfQkUsIH0sCisJeyBJV0xfVFhfRklGT19WSV9JUEFOLCBJRUVFODAyMTFfQUNfVkksIH0sCisJeyBJV0xfVFhfRklGT19WT19JUEFOLCBJRUVFODAyMTFfQUNfVk8sIH0sCisJeyBJV0xfVFhfRklGT19CRV9JUEFOLCAyLCB9LAorCXsgSVdMQUdOX0NNRF9GSUZPX05VTSwgSVdMX0FDX1VOU0VULCB9LAorfTsKK3N0YXRpYyB2b2lkIGl3bF90cmFuc190eF9zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJY29uc3Qgc3RydWN0IHF1ZXVlX3RvX2ZpZm9fYWMgKnF1ZXVlX3RvX2ZpZm87CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKKwl1MzIgYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBjaGFuOworCXUzMiByZWdfdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXByaXYtPnNjZF9iYXNlX2FkZHIgPSBpd2xfcmVhZF9wcnBoKHByaXYsIFNDRF9TUkFNX0JBU0VfQUREUik7CisJYSA9IHByaXYtPnNjZF9iYXNlX2FkZHIgKyBTQ0RfQ09OVEVYVF9NRU1fTE9XRVJfQk9VTkQ7CisJLyogcmVzZXQgY29uZXh0IGRhdGEgbWVtb3J5ICovCisJZm9yICg7IGEgPCBwcml2LT5zY2RfYmFzZV9hZGRyICsgU0NEX0NPTlRFWFRfTUVNX1VQUEVSX0JPVU5EOworCQlhICs9IDQpCisJCWl3bF93cml0ZV90YXJnX21lbShwcml2LCBhLCAwKTsKKwkvKiByZXNldCB0eCBzdGF0dXMgbWVtb3J5ICovCisJZm9yICg7IGEgPCBwcml2LT5zY2RfYmFzZV9hZGRyICsgU0NEX1RYX1NUVFNfTUVNX1VQUEVSX0JPVU5EOworCQlhICs9IDQpCisJCWl3bF93cml0ZV90YXJnX21lbShwcml2LCBhLCAwKTsKKwlmb3IgKDsgYSA8IHByaXYtPnNjZF9iYXNlX2FkZHIgKworCSAgICAgICBTQ0RfVFJBTlNfVEJMX09GRlNFVF9RVUVVRShwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0pOyBhICs9IDQpCisJCWl3bF93cml0ZV90YXJnX21lbShwcml2LCBhLCAwKTsKKworCWl3bF93cml0ZV9wcnBoKHByaXYsIFNDRF9EUkFNX0JBU0VfQUREUiwKKwkJICAgICAgIHByaXYtPnNjZF9iY190YmxzLmRtYSA+PiAxMCk7CisKKwkvKiBFbmFibGUgRE1BIGNoYW5uZWwgKi8KKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgRkhfVENTUl9DSE5MX05VTSA7IGNoYW4rKykKKwkJaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNoYW4pLAorCQkJCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFIHwKKwkJCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRU5BQkxFKTsKKworCS8qIFVwZGF0ZSBGSCBjaGlja2VuIGJpdHMgKi8KKwlyZWdfdmFsID0gaXdsX3JlYWRfZGlyZWN0MzIocHJpdiwgRkhfVFhfQ0hJQ0tFTl9CSVRTX1JFRyk7CisJaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX1RYX0NISUNLRU5fQklUU19SRUcsCisJCQkgICByZWdfdmFsIHwgRkhfVFhfQ0hJQ0tFTl9CSVRTX1NDRF9BVVRPX1JFVFJZX0VOKTsKKworCWl3bF93cml0ZV9wcnBoKHByaXYsIFNDRF9RVUVVRUNIQUlOX1NFTCwKKwkJU0NEX1FVRVVFQ0hBSU5fU0VMX0FMTChwcml2KSk7CisJaXdsX3dyaXRlX3BycGgocHJpdiwgU0NEX0FHR1JfU0VMLCAwKTsKKworCS8qIGluaXRpYXRlIHRoZSBxdWV1ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBpKyspIHsKKwkJaXdsX3dyaXRlX3BycGgocHJpdiwgU0NEX1FVRVVFX1JEUFRSKGkpLCAwKTsKKwkJaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19XUlBUUiwgMCB8IChpIDw8IDgpKTsKKwkJaXdsX3dyaXRlX3RhcmdfbWVtKHByaXYsIHByaXYtPnNjZF9iYXNlX2FkZHIgKworCQkJCVNDRF9DT05URVhUX1FVRVVFX09GRlNFVChpKSwgMCk7CisJCWl3bF93cml0ZV90YXJnX21lbShwcml2LCBwcml2LT5zY2RfYmFzZV9hZGRyICsKKwkJCQlTQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQoaSkgKworCQkJCXNpemVvZih1MzIpLAorCQkJCSgoU0NEX1dJTl9TSVpFIDw8CisJCQkJU0NEX1FVRVVFX0NUWF9SRUcyX1dJTl9TSVpFX1BPUykgJgorCQkJCVNDRF9RVUVVRV9DVFhfUkVHMl9XSU5fU0laRV9NU0spIHwKKwkJCQkoKFNDRF9GUkFNRV9MSU1JVCA8PAorCQkJCVNDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MpICYKKwkJCQlTQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfTVNLKSk7CisJfQorCisJaXdsX3dyaXRlX3BycGgocHJpdiwgU0NEX0lOVEVSUlVQVF9NQVNLLAorCQkJSVdMX01BU0soMCwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtKSk7CisKKwkvKiBBY3RpdmF0ZSBhbGwgVHggRE1BL0ZJRk8gY2hhbm5lbHMgKi8KKwlpd2xfdHJhbnNfdHhxX3NldF9zY2hlZChwcml2LCBJV0xfTUFTSygwLCA3KSk7CisKKwkvKiBtYXAgcXVldWVzIHRvIEZJRk9zICovCisJaWYgKHByaXYtPnZhbGlkX2NvbnRleHRzICE9IEJJVChJV0xfUlhPTl9DVFhfQlNTKSkKKwkJcXVldWVfdG9fZmlmbyA9IGl3bGFnbl9pcGFuX3F1ZXVlX3RvX3R4X2ZpZm87CisJZWxzZQorCQlxdWV1ZV90b19maWZvID0gaXdsYWduX2RlZmF1bHRfcXVldWVfdG9fdHhfZmlmbzsKKworCWl3bF90cmFuc19zZXRfd3JfcHRycyhwcml2LCBwcml2LT5jbWRfcXVldWUsIDApOworCisJLyogbWFrZSBzdXJlIGFsbCBxdWV1ZSBhcmUgbm90IHN0b3BwZWQgKi8KKwltZW1zZXQoJnByaXYtPnF1ZXVlX3N0b3BwZWRbMF0sIDAsIHNpemVvZihwcml2LT5xdWV1ZV9zdG9wcGVkKSk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJYXRvbWljX3NldCgmcHJpdi0+cXVldWVfc3RvcF9jb3VudFtpXSwgMCk7CisJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpCisJCWN0eC0+bGFzdF90eF9yZWplY3RlZCA9IGZhbHNlOworCisJLyogcmVzZXQgdG8gMCB0byBlbmFibGUgYWxsIHRoZSBxdWV1ZSBmaXJzdCAqLworCXByaXYtPnR4cV9jdHhfYWN0aXZlX21zayA9IDA7CisKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShpd2xhZ25fZGVmYXVsdF9xdWV1ZV90b190eF9maWZvKSAhPSAxMCk7CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoaXdsYWduX2lwYW5fcXVldWVfdG9fdHhfZmlmbykgIT0gMTApOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJaW50IGZpZm8gPSBxdWV1ZV90b19maWZvW2ldLmZpZm87CisJCWludCBhYyA9IHF1ZXVlX3RvX2ZpZm9baV0uYWM7CisKKwkJaXdsX3R4cV9jdHhfYWN0aXZhdGUocHJpdiwgaSk7CisKKwkJaWYgKGZpZm8gPT0gSVdMX1RYX0ZJRk9fVU5VU0VEKQorCQkJY29udGludWU7CisKKwkJaWYgKGFjICE9IElXTF9BQ19VTlNFVCkKKwkJCWl3bF9zZXRfc3dxX2lkKCZwcml2LT50eHFbaV0sIGFjLCBpKTsKKwkJaXdsX3RyYW5zX3R4X3F1ZXVlX3NldF9zdGF0dXMocHJpdiwgJnByaXYtPnR4cVtpXSwgZmlmbywgMCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogRW5hYmxlIEwxLUFjdGl2ZSAqLworCWl3bF9jbGVhcl9iaXRzX3BycGgocHJpdiwgQVBNR19QQ0lERVZfU1RUX1JFRywKKwkJCSAgQVBNR19QQ0lERVZfU1RUX1ZBTF9MMV9BQ1RfRElTKTsKK30KKworLyoqCisgKiBpd2xhZ25fdHhxX2N0eF9zdG9wIC0gU3RvcCBhbGwgVHggRE1BIGNoYW5uZWxzCisgKi8KK3N0YXRpYyBpbnQgaXdsX3RyYW5zX3R4X3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCWludCBjaCwgdHhxX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBUdXJuIG9mZiBhbGwgVHggRE1BIGZpZm9zICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWl3bF90cmFuc190eHFfc2V0X3NjaGVkKHByaXYsIDApOworCisJLyogU3RvcCBlYWNoIFR4IERNQSBjaGFubmVsLCBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgaWRsZSAqLworCWZvciAoY2ggPSAwOyBjaCA8IEZIX1RDU1JfQ0hOTF9OVU07IGNoKyspIHsKKwkJaXdsX3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNoKSwgMHgwKTsKKwkJaWYgKGl3bF9wb2xsX2RpcmVjdF9iaXQocHJpdiwgRkhfVFNTUl9UWF9TVEFUVVNfUkVHLAorCQkJCSAgICBGSF9UU1NSX1RYX1NUQVRVU19SRUdfTVNLX0NITkxfSURMRShjaCksCisJCQkJICAgIDEwMDApKQorCQkJSVdMX0VSUihwcml2LCAiRmFpbGluZyBvbiB0aW1lb3V0IHdoaWxlIHN0b3BwaW5nIgorCQkJICAgICIgRE1BIGNoYW5uZWwgJWQgWzB4JTA4eF0iLCBjaCwKKwkJCSAgICBpd2xfcmVhZF9kaXJlY3QzMihwcml2LCBGSF9UU1NSX1RYX1NUQVRVU19SRUcpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFwcml2LT50eHEpIHsKKwkJSVdMX1dBUk4ocHJpdiwgIlN0b3BwaW5nIHR4IHF1ZXVlcyB0aGF0IGFyZW4ndCBhbGxvY2F0ZWQuLi4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVW5tYXAgRE1BIGZyb20gaG9zdCBzeXN0ZW0gYW5kIGZyZWUgc2tiJ3MgKi8KKwlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IHByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspCisJCWl3bF90eF9xdWV1ZV91bm1hcChwcml2LCB0eHFfaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGl3bF90cmFuc19zdG9wX2RldmljZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHN0b3AgYW5kIHJlc2V0IHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IgKi8KKwlpd2xfd3JpdGUzMihwcml2LCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKKworCS8qIHRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJaXdsX2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJdHJhbnNfc3luY19pcnEoJnByaXYtPnRyYW5zKTsKKworCS8qIGRldmljZSBnb2luZyBkb3duLCBTdG9wIHVzaW5nIElDVCB0YWJsZSAqLworCWl3bF9kaXNhYmxlX2ljdChwcml2KTsKKworCS8qCisJICogSWYgYSBIVyByZXN0YXJ0IGhhcHBlbnMgZHVyaW5nIGZpcm13YXJlIGxvYWRpbmcsCisJICogdGhlbiB0aGUgZmlybXdhcmUgbG9hZGluZyBtaWdodCBjYWxsIHRoaXMgZnVuY3Rpb24KKwkgKiBhbmQgbGF0ZXIgaXQgbWlnaHQgYmUgY2FsbGVkIGFnYWluIGR1ZSB0byB0aGUKKwkgKiByZXN0YXJ0LiBTbyBkb24ndCBwcm9jZXNzIGFnYWluIGlmIHRoZSBkZXZpY2UgaXMKKwkgKiBhbHJlYWR5IGRlYWQuCisJICovCisJaWYgKHRlc3RfYml0KFNUQVRVU19ERVZJQ0VfRU5BQkxFRCwgJnByaXYtPnN0YXR1cykpIHsKKwkJaXdsX3RyYW5zX3R4X3N0b3AocHJpdik7CisJCWl3bF90cmFuc19yeF9zdG9wKHByaXYpOworCisJCS8qIFBvd2VyLWRvd24gZGV2aWNlJ3MgYnVzbWFzdGVyIERNQSBjbG9ja3MgKi8KKwkJaXdsX3dyaXRlX3BycGgocHJpdiwgQVBNR19DTEtfRElTX1JFRywKKwkJCSAgICAgICBBUE1HX0NMS19WQUxfRE1BX0NMS19SUVQpOworCQl1ZGVsYXkoNSk7CisJfQorCisJLyogTWFrZSBzdXJlIChyZWR1bmRhbnQpIHdlJ3ZlIHJlbGVhc2VkIG91ciByZXF1ZXN0IHRvIHN0YXkgYXdha2UgKi8KKwlpd2xfY2xlYXJfYml0KHByaXYsIENTUl9HUF9DTlRSTCwgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKKworCS8qIFN0b3AgdGhlIGRldmljZSwgYW5kIHB1dCBpdCBpbiBsb3cgcG93ZXIgc3RhdGUgKi8KKwlpd2xfYXBtX3N0b3AocHJpdik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXdsX3R4X2NtZCAqaXdsX3RyYW5zX2dldF90eF9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCQkJaW50IHR4cV9pZCkKK3sKKwlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07CisJc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CisJc3RydWN0IGl3bF9kZXZpY2VfY21kICpkZXZfY21kOworCisJaWYgKHVubGlrZWx5KGl3bF9xdWV1ZV9zcGFjZShxKSA8IHEtPmhpZ2hfbWFyaykpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIFR4LWNvbW1hbmQgKG5vdCBNQUMhKSBoZWFkZXIuCisJICogU3RvcmUgdGhlIGNob3NlbiBUeCBxdWV1ZSBhbmQgVEZEIGluZGV4IHdpdGhpbiB0aGUgc2VxdWVuY2UgZmllbGQ7CisJICogYWZ0ZXIgVHgsIHVDb2RlJ3MgVHggcmVzcG9uc2Ugd2lsbCByZXR1cm4gdGhpcyB2YWx1ZSBzbyBkcml2ZXIgY2FuCisJICogbG9jYXRlIHRoZSBmcmFtZSB3aXRoaW4gdGhlIHR4IHF1ZXVlIGFuZCBkbyBwb3N0LXR4IHByb2Nlc3NpbmcuCisJICovCisJZGV2X2NtZCA9IHR4cS0+Y21kW3EtPndyaXRlX3B0cl07CisJbWVtc2V0KGRldl9jbWQsIDAsIHNpemVvZigqZGV2X2NtZCkpOworCWRldl9jbWQtPmhkci5jbWQgPSBSRVBMWV9UWDsKKwlkZXZfY21kLT5oZHIuc2VxdWVuY2UgPSBjcHVfdG9fbGUxNigodTE2KShRVUVVRV9UT19TRVEodHhxX2lkKSB8CisJCQkJSU5ERVhfVE9fU0VRKHEtPndyaXRlX3B0cikpKTsKKwlyZXR1cm4gJmRldl9jbWQtPmNtZC50eDsKK30KKworc3RhdGljIGludCBpd2xfdHJhbnNfdHgoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlzdHJ1Y3QgaXdsX3R4X2NtZCAqdHhfY21kLCBpbnQgdHhxX2lkLCBfX2xlMTYgZmMsIGJvb2wgYW1wZHUsCisJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOworCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOworCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqZGV2X2NtZCA9IHR4cS0+Y21kW3EtPndyaXRlX3B0cl07CisJc3RydWN0IGl3bF9jbWRfbWV0YSAqb3V0X21ldGE7CisKKwlkbWFfYWRkcl90IHBoeXNfYWRkciA9IDA7CisJZG1hX2FkZHJfdCB0eGNtZF9waHlzOworCWRtYV9hZGRyX3Qgc2NyYXRjaF9waHlzOworCXUxNiBsZW4sIGZpcnN0bGVuLCBzZWNvbmRsZW47CisJdTggd2FpdF93cml0ZV9wdHIgPSAwOworCXU4IGhkcl9sZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjKTsKKworCS8qIFNldCB1cCBkcml2ZXIgZGF0YSBmb3IgdGhpcyBURkQgKi8KKwltZW1zZXQoJih0eHEtPnR4YltxLT53cml0ZV9wdHJdKSwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfdHhfaW5mbykpOworCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uc2tiID0gc2tiOworCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uY3R4ID0gY3R4OworCisJLyogU2V0IHVwIGZpcnN0IGVtcHR5IGVudHJ5IGluIHF1ZXVlJ3MgYXJyYXkgb2YgVHgvY21kIGJ1ZmZlcnMgKi8KKwlvdXRfbWV0YSA9ICZ0eHEtPm1ldGFbcS0+d3JpdGVfcHRyXTsKKworCS8qCisJICogVXNlIHRoZSBmaXJzdCBlbXB0eSBlbnRyeSBpbiB0aGlzIHF1ZXVlJ3MgY29tbWFuZCBidWZmZXIgYXJyYXkKKwkgKiB0byBjb250YWluIHRoZSBUeCBjb21tYW5kIGFuZCBNQUMgaGVhZGVyIGNvbmNhdGVuYXRlZCB0b2dldGhlcgorCSAqIChwYXlsb2FkIGRhdGEgd2lsbCBiZSBpbiBhbm90aGVyIGJ1ZmZlcikuCisJICogU2l6ZSBvZiB0aGlzIHZhcmllcywgZHVlIHRvIHZhcnlpbmcgTUFDIGhlYWRlciBsZW5ndGguCisJICogSWYgZW5kIGlzIG5vdCBkd29yZCBhbGlnbmVkLCB3ZSdsbCBoYXZlIDIgZXh0cmEgYnl0ZXMgYXQgdGhlIGVuZAorCSAqIG9mIHRoZSBNQUMgaGVhZGVyIChkZXZpY2UgcmVhZHMgb24gZHdvcmQgYm91bmRhcmllcykuCisJICogV2UnbGwgdGVsbCBkZXZpY2UgYWJvdXQgdGhpcyBwYWRkaW5nIGxhdGVyLgorCSAqLworCWxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3R4X2NtZCkgKworCQlzaXplb2Yoc3RydWN0IGl3bF9jbWRfaGVhZGVyKSArIGhkcl9sZW47CisJZmlyc3RsZW4gPSAobGVuICsgMykgJiB+MzsKKworCS8qIFRlbGwgTklDIGFib3V0IGFueSAyLWJ5dGUgcGFkZGluZyBhZnRlciBNQUMgaGVhZGVyICovCisJaWYgKGZpcnN0bGVuICE9IGxlbikKKwkJdHhfY21kLT50eF9mbGFncyB8PSBUWF9DTURfRkxHX01IX1BBRF9NU0s7CisKKwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgVHggY29tbWFuZCdzIGhlYWRlciAobm90IE1BQyBoZWFkZXIhKSwKKwkgKiB3aXRoaW4gY29tbWFuZCBidWZmZXIgYXJyYXkuICovCisJdHhjbWRfcGh5cyA9IGRtYV9tYXBfc2luZ2xlKHByaXYtPmJ1cy0+ZGV2LAorCQkJCSAgICAmZGV2X2NtZC0+aGRyLCBmaXJzdGxlbiwKKwkJCQkgICAgRE1BX0JJRElSRUNUSU9OQUwpOworCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihwcml2LT5idXMtPmRldiwgdHhjbWRfcGh5cykpKQorCQlyZXR1cm4gLTE7CisJZG1hX3VubWFwX2FkZHJfc2V0KG91dF9tZXRhLCBtYXBwaW5nLCB0eGNtZF9waHlzKTsKKwlkbWFfdW5tYXBfbGVuX3NldChvdXRfbWV0YSwgbGVuLCBmaXJzdGxlbik7CisKKwlpZiAoIWllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGZjKSkgeworCQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKKwl9IGVsc2UgeworCQl3YWl0X3dyaXRlX3B0ciA9IDE7CisJCXR4cS0+bmVlZF91cGRhdGUgPSAwOworCX0KKworCS8qIFNldCB1cCBURkQncyAybmQgZW50cnkgdG8gcG9pbnQgZGlyZWN0bHkgdG8gcmVtYWluZGVyIG9mIHNrYiwKKwkgKiBpZiBhbnkgKDgwMi4xMSBudWxsIGZyYW1lcyBoYXZlIG5vIHBheWxvYWQpLiAqLworCXNlY29uZGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlpZiAoc2Vjb25kbGVuID4gMCkgeworCQlwaHlzX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShwcml2LT5idXMtPmRldiwgc2tiLT5kYXRhICsgaGRyX2xlbiwKKwkJCQkJICAgc2Vjb25kbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHByaXYtPmJ1cy0+ZGV2LCBwaHlzX2FkZHIpKSkgeworCQkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5idXMtPmRldiwKKwkJCQkJIGRtYV91bm1hcF9hZGRyKG91dF9tZXRhLCBtYXBwaW5nKSwKKwkJCQkJIGRtYV91bm1hcF9sZW4ob3V0X21ldGEsIGxlbiksCisJCQkJCSBETUFfQklESVJFQ1RJT05BTCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiBBdHRhY2ggYnVmZmVycyB0byBURkQgKi8KKwlpd2xhZ25fdHhxX2F0dGFjaF9idWZfdG9fdGZkKHByaXYsIHR4cSwgdHhjbWRfcGh5cywgZmlyc3RsZW4sIDEpOworCWlmIChzZWNvbmRsZW4gPiAwKQorCQlpd2xhZ25fdHhxX2F0dGFjaF9idWZfdG9fdGZkKHByaXYsIHR4cSwgcGh5c19hZGRyLAorCQkJCQkgICAgIHNlY29uZGxlbiwgMCk7CisKKwlzY3JhdGNoX3BoeXMgPSB0eGNtZF9waHlzICsgc2l6ZW9mKHN0cnVjdCBpd2xfY21kX2hlYWRlcikgKworCQkJCW9mZnNldG9mKHN0cnVjdCBpd2xfdHhfY21kLCBzY3JhdGNoKTsKKworCS8qIHRha2UgYmFjayBvd25lcnNoaXAgb2YgRE1BIGJ1ZmZlciB0byBlbmFibGUgdXBkYXRlICovCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocHJpdi0+YnVzLT5kZXYsIHR4Y21kX3BoeXMsIGZpcnN0bGVuLAorCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCXR4X2NtZC0+ZHJhbV9sc2JfcHRyID0gY3B1X3RvX2xlMzIoc2NyYXRjaF9waHlzKTsKKwl0eF9jbWQtPmRyYW1fbXNiX3B0ciA9IGl3bF9nZXRfZG1hX2hpX2FkZHIoc2NyYXRjaF9waHlzKTsKKworCUlXTF9ERUJVR19UWChwcml2LCAic2VxdWVuY2UgbnIgPSAwWCV4XG4iLAorCQkgICAgIGxlMTZfdG9fY3B1KGRldl9jbWQtPmhkci5zZXF1ZW5jZSkpOworCUlXTF9ERUJVR19UWChwcml2LCAidHhfZmxhZ3MgPSAwWCV4XG4iLCBsZTMyX3RvX2NwdSh0eF9jbWQtPnR4X2ZsYWdzKSk7CisJaXdsX3ByaW50X2hleF9kdW1wKHByaXYsIElXTF9ETF9UWCwgKHU4ICopdHhfY21kLCBzaXplb2YoKnR4X2NtZCkpOworCWl3bF9wcmludF9oZXhfZHVtcChwcml2LCBJV0xfRExfVFgsICh1OCAqKXR4X2NtZC0+aGRyLCBoZHJfbGVuKTsKKworCS8qIFNldCB1cCBlbnRyeSBmb3IgdGhpcyBURkQgaW4gVHggYnl0ZS1jb3VudCBhcnJheSAqLworCWlmIChhbXBkdSkKKwkJaXdsX3RyYW5zX3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKHByaXYsIHR4cSwKKwkJCQkJICAgICAgIGxlMTZfdG9fY3B1KHR4X2NtZC0+bGVuKSk7CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShwcml2LT5idXMtPmRldiwgdHhjbWRfcGh5cywgZmlyc3RsZW4sCisJCQlETUFfQklESVJFQ1RJT05BTCk7CisKKwl0cmFjZV9pd2x3aWZpX2Rldl90eChwcml2LAorCQkJICAgICAmKChzdHJ1Y3QgaXdsX3RmZCAqKXR4cS0+dGZkcylbdHhxLT5xLndyaXRlX3B0cl0sCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgaXdsX3RmZCksCisJCQkgICAgICZkZXZfY21kLT5oZHIsIGZpcnN0bGVuLAorCQkJICAgICBza2ItPmRhdGEgKyBoZHJfbGVuLCBzZWNvbmRsZW4pOworCisJLyogVGVsbCBkZXZpY2UgdGhlIHdyaXRlIGluZGV4ICpqdXN0IHBhc3QqIHRoaXMgbGF0ZXN0IGZpbGxlZCBURkQgKi8KKwlxLT53cml0ZV9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyLCBxLT5uX2JkKTsKKwlpd2xfdHhxX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgdHhxKTsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCB0aGUgZnJhbWUgaXMgInRyYW5zbWl0dGVkIiBzdWNjZXNzZnVsbHkKKwkgKiBhbmQgd2Ugd2lsbCBnZXQgYSBUWCBzdGF0dXMgbm90aWZpY2F0aW9uIGV2ZW50dWFsbHksCisJICogcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgcmV0LiAicmV0IiBvbmx5IGluZGljYXRlcworCSAqIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCB1cGRhdGUgdGhlIHdyaXRlIHBvaW50ZXIuCisJICovCisJaWYgKChpd2xfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspICYmIHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQpIHsKKwkJaWYgKHdhaXRfd3JpdGVfcHRyKSB7CisJCQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKKwkJCWl3bF90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCB0eHEpOworCQl9IGVsc2UgeworCQkJaXdsX3N0b3BfcXVldWUocHJpdiwgdHhxKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXdsX3RyYW5zX2tpY2tfbmljKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwkvKiBSZW1vdmUgYWxsIHJlc2V0cyB0byBhbGxvdyBOSUMgdG8gb3BlcmF0ZSAqLworCWl3bF93cml0ZTMyKHByaXYsIENTUl9SRVNFVCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGl3bF90cmFuc19zeW5jX2lycShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJLyogd2FpdCB0byBtYWtlIHN1cmUgd2UgZmx1c2ggcGVuZGluZyB0YXNrbGV0Ki8KKwlzeW5jaHJvbml6ZV9pcnEocHJpdi0+YnVzLT5pcnEpOworCXRhc2tsZXRfa2lsbCgmcHJpdi0+aXJxX3Rhc2tsZXQpOworfQorCitzdGF0aWMgdm9pZCBpd2xfdHJhbnNfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJZnJlZV9pcnEocHJpdi0+YnVzLT5pcnEsIHByaXYpOworCWl3bF9mcmVlX2lzcl9pY3QocHJpdik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX3RyYW5zX29wcyB0cmFuc19vcHMgPSB7CisJLnN0YXJ0X2RldmljZSA9IGl3bF90cmFuc19zdGFydF9kZXZpY2UsCisJLnByZXBhcmVfY2FyZF9odyA9IGl3bF90cmFuc19wcmVwYXJlX2NhcmRfaHcsCisJLnN0b3BfZGV2aWNlID0gaXdsX3RyYW5zX3N0b3BfZGV2aWNlLAorCisJLnR4X3N0YXJ0ID0gaXdsX3RyYW5zX3R4X3N0YXJ0LAorCisJLnJ4X2ZyZWUgPSBpd2xfdHJhbnNfcnhfZnJlZSwKKwkudHhfZnJlZSA9IGl3bF90cmFuc190eF9mcmVlLAorCisJLnNlbmRfY21kID0gaXdsX3NlbmRfY21kLAorCS5zZW5kX2NtZF9wZHUgPSBpd2xfc2VuZF9jbWRfcGR1LAorCisJLmdldF90eF9jbWQgPSBpd2xfdHJhbnNfZ2V0X3R4X2NtZCwKKwkudHggPSBpd2xfdHJhbnNfdHgsCisKKwkudHhxX2FnZ19kaXNhYmxlID0gaXdsX3RyYW5zX3R4cV9hZ2dfZGlzYWJsZSwKKwkudHhxX2FnZ19zZXR1cCA9IGl3bF90cmFuc190eHFfYWdnX3NldHVwLAorCisJLmtpY2tfbmljID0gaXdsX3RyYW5zX2tpY2tfbmljLAorCisJLnN5bmNfaXJxID0gaXdsX3RyYW5zX3N5bmNfaXJxLAorCS5mcmVlID0gaXdsX3RyYW5zX2ZyZWUsCit9OworCitpbnQgaXdsX3RyYW5zX3JlZ2lzdGVyKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJaW50IGVycjsKKworCXByaXYtPnRyYW5zLm9wcyA9ICZ0cmFuc19vcHM7CisJcHJpdi0+dHJhbnMucHJpdiA9IHByaXY7CisKKwl0YXNrbGV0X2luaXQoJnByaXYtPmlycV90YXNrbGV0LCAodm9pZCAoKikodW5zaWduZWQgbG9uZykpCisJCWl3bF9pcnFfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcHJpdik7CisKKwlpd2xfYWxsb2NfaXNyX2ljdChwcml2KTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHByaXYtPmJ1cy0+aXJxLCBpd2xfaXNyX2ljdCwgSVJRRl9TSEFSRUQsCisJCURSVl9OQU1FLCBwcml2KTsKKwlpZiAoZXJyKSB7CisJCUlXTF9FUlIocHJpdiwgIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkXG4iLCBwcml2LT5idXMtPmlycSk7CisJCWl3bF9mcmVlX2lzcl9pY3QocHJpdik7CisJCXJldHVybiBlcnI7CisJfQorCisJSU5JVF9XT1JLKCZwcml2LT5yeF9yZXBsZW5pc2gsIGl3bF9iZ19yeF9yZXBsZW5pc2gpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTkzYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMuaApAQCAtMCwwICsxLDIyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAorICogVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9faXdsX3RyYW5zX2hfXworI2RlZmluZSBfX2l3bF90cmFuc19oX18KKworIC8qVGhpcyBmaWxlIGluY2x1ZGVzIHRoZSBkZWNsYXJhdGlvbiB0aGF0IGFyZSBleHBvcnRlZCBmcm9tIHRoZSB0cmFuc3BvcnQKKyAqIGxheWVyICovCisKK3N0cnVjdCBpd2xfcHJpdjsKK3N0cnVjdCBpd2xfcnhvbl9jb250ZXh0Oworc3RydWN0IGl3bF9ob3N0X2NtZDsKKworLyoqCisgKiBzdHJ1Y3QgaXdsX3RyYW5zX29wcyAtIHRyYW5zcG9ydCBzcGVjaWZpYyBvcGVyYXRpb25zCisgKiBAc3RhcnRfZGV2aWNlOiBhbGxvY2F0ZXMgYW5kIGluaXRzIGFsbCB0aGUgcmVzb3VyY2VzIGZvciB0aGUgdHJhbnNwb3J0CisgKiAgICAgICAgICAgICAgICBsYXllci4KKyAqIEBwcmVwYXJlX2NhcmRfaHc6IGNsYWltIHRoZSBvd25lcnNoaXAgb24gdGhlIEhXLiBXaWxsIGJlIGNhbGxlZCBkdXJpbmcKKyAqICAgICAgICAgICAgICAgICAgIHByb2JlLgorICogQHR4X3N0YXJ0OiBzdGFydHMgYW5kIGNvbmZpZ3VyZXMgYWxsIHRoZSBUeCBmaWZvIC0gdXN1YWxseSBkb25lIG9uY2UgdGhlIGZ3CisgKiAgICAgICAgICAgaXMgYWxpdmUuCisgKiBAc3RvcF9kZXZpY2U6c3RvcHMgdGhlIHdob2xlIGRldmljZSAoZW1iZWRkZWQgQ1BVIHB1dCB0byByZXNldCkKKyAqIEByeF9mcmVlOiBmcmVlcyB0aGUgcnggbWVtb3J5CisgKiBAdHhfZnJlZTogZnJlZXMgdGhlIHR4IG1lbW9yeQorICogQHNlbmRfY21kOnNlbmQgYSBob3N0IGNvbW1hbmQKKyAqIEBzZW5kX2NtZF9wZHU6c2VuZCBhIGhvc3QgY29tbWFuZDogZmxhZ3MgY2FuIGJlIENNRF8qCisgKiBAZ2V0X3R4X2NtZDogcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcgVHggY21kIGZvciB0aGUgdXBwZXIgbGF5ZXIgdXNlCisgKiBAdHg6IHNlbmQgYW4gc2tiCisgKiBAdHhxX2FnZ19zZXR1cDogc2V0dXAgYSB0eCBxdWV1ZSBmb3IgQU1QRFUgLSB3aWxsIGJlIGNhbGxlZCBvbmNlIHRoZSBIVyBpcworICogICAgICAgICAgICAgICAgIHJlYWR5IGFuZCBhIHN1Y2Nlc3NmdWwgQUREQkEgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQuCisgKiBAdHhxX2FnZ19kaXNhYmxlOiBkZS1jb25maWd1cmUgYSBUeCBxdWV1ZSB0byBzZW5kIEFNUERVcworICogQGtpY2tfbmljOiByZW1vdmUgdGhlIFJFU0VUIGZyb20gdGhlIGVtYmVkZGVkIENQVSBhbmQgbGV0IGl0IHJ1bgorICogQHN5bmNfaXJxOiB0aGUgdXBwZXIgbGF5ZXIgd2lsbCB0eXBpY2FsbHkgZGlzYWJsZSBpbnRlcnJ1cHQgYW5kIGNhbGwgdGhpcworICogICAgICAgICAgICBoYW5kbGVyLiBBZnRlciB0aGlzIGhhbmRsZXIgcmV0dXJucywgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IGFsbAorICogICAgICAgICAgICB0aGUgSVNSIC8gdGFza2xldCBldGMuLi4gaGF2ZSBmaW5pc2hlZCBydW5uaW5nIGFuZCB0aGUgdHJhbnNwb3J0CisgKiAgICAgICAgICAgIGxheWVyIHNoYWxsIG5vdCBwYXNzIGFueSBSeC4KKyAqIEBmcmVlOiByZWxlYXNlIGFsbCB0aGUgcmVzc291cmNlIGZvciB0aGUgdHJhbnNwb3J0IGxheWVyIGl0c2VsZiBzdWNoIGFzCisgKiAgICAgICAgaXJxLCB0YXNrbGV0IGV0Yy4uLgorICovCitzdHJ1Y3QgaXdsX3RyYW5zX29wcyB7CisKKwlpbnQgKCpzdGFydF9kZXZpY2UpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisJaW50ICgqcHJlcGFyZV9jYXJkX2h3KShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOworCXZvaWQgKCpzdG9wX2RldmljZSkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKKwl2b2lkICgqdHhfc3RhcnQpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisJdm9pZCAoKnR4X2ZyZWUpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisJdm9pZCAoKnJ4X2ZyZWUpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisKKwlpbnQgKCpzZW5kX2NtZCkoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpOworCisJaW50ICgqc2VuZF9jbWRfcGR1KShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IGlkLCB1MzIgZmxhZ3MsIHUxNiBsZW4sCisJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSk7CisJc3RydWN0IGl3bF90eF9jbWQgKiAoKmdldF90eF9jbWQpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHR4cV9pZCk7CisJaW50ICgqdHgpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGl3bF90eF9jbWQgKnR4X2NtZCwgaW50IHR4cV9pZCwgX19sZTE2IGZjLCBib29sIGFtcGR1LAorCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKKworCWludCAoKnR4cV9hZ2dfZGlzYWJsZSkoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgdHhxX2lkLAorCQkJCSAgdTE2IHNzbl9pZHgsIHU4IHR4X2ZpZm8pOworCXZvaWQgKCp0eHFfYWdnX3NldHVwKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBzdGFfaWQsIGludCB0aWQsCisJCQkJCQlpbnQgZnJhbWVfbGltaXQpOworCisJdm9pZCAoKmtpY2tfbmljKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOworCisJdm9pZCAoKnN5bmNfaXJxKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOworCXZvaWQgKCpmcmVlKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOworfTsKKworc3RydWN0IGl3bF90cmFucyB7CisJY29uc3Qgc3RydWN0IGl3bF90cmFuc19vcHMgKm9wczsKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Cit9OworCitzdGF0aWMgaW5saW5lIGludCB0cmFuc19zdGFydF9kZXZpY2Uoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJcmV0dXJuIHRyYW5zLT5vcHMtPnN0YXJ0X2RldmljZSh0cmFucy0+cHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRyYW5zX3ByZXBhcmVfY2FyZF9odyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlyZXR1cm4gdHJhbnMtPm9wcy0+cHJlcGFyZV9jYXJkX2h3KHRyYW5zLT5wcml2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zX3N0b3BfZGV2aWNlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXRyYW5zLT5vcHMtPnN0b3BfZGV2aWNlKHRyYW5zLT5wcml2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zX3R4X3N0YXJ0KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXRyYW5zLT5vcHMtPnR4X3N0YXJ0KHRyYW5zLT5wcml2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zX3J4X2ZyZWUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJdHJhbnMtPm9wcy0+cnhfZnJlZSh0cmFucy0+cHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc190eF9mcmVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXRyYW5zLT5vcHMtPnR4X2ZyZWUodHJhbnMtPnByaXYpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0cmFuc19zZW5kX2NtZChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKKwkJCQlzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpCit7CisJcmV0dXJuIHRyYW5zLT5vcHMtPnNlbmRfY21kKHRyYW5zLT5wcml2LCBjbWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0cmFuc19zZW5kX2NtZF9wZHUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHU4IGlkLCB1MzIgZmxhZ3MsCisJCQkJCXUxNiBsZW4sIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHRyYW5zLT5vcHMtPnNlbmRfY21kX3BkdSh0cmFucy0+cHJpdiwgaWQsIGZsYWdzLCBsZW4sIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpd2xfdHhfY21kICp0cmFuc19nZXRfdHhfY21kKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCQlpbnQgdHhxX2lkKQoreworCXJldHVybiB0cmFucy0+b3BzLT5nZXRfdHhfY21kKHRyYW5zLT5wcml2LCB0eHFfaWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0cmFuc190eChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGl3bF90eF9jbWQgKnR4X2NtZCwgaW50IHR4cV9pZCwgX19sZTE2IGZjLCBib29sIGFtcGR1LAorCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQoreworCXJldHVybiB0cmFucy0+b3BzLT50eCh0cmFucy0+cHJpdiwgc2tiLCB0eF9jbWQsIHR4cV9pZCwgZmMsIGFtcGR1LCBjdHgpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0cmFuc190eHFfYWdnX2Rpc2FibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHUxNiB0eHFfaWQsCisJCQkgIHUxNiBzc25faWR4LCB1OCB0eF9maWZvKQoreworCXJldHVybiB0cmFucy0+b3BzLT50eHFfYWdnX2Rpc2FibGUodHJhbnMtPnByaXYsIHR4cV9pZCwKKwkJCQkJICAgc3NuX2lkeCwgdHhfZmlmbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc190eHFfYWdnX3NldHVwKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgc3RhX2lkLAorCQkJCQkJaW50IHRpZCwgaW50IGZyYW1lX2xpbWl0KQoreworCXRyYW5zLT5vcHMtPnR4cV9hZ2dfc2V0dXAodHJhbnMtPnByaXYsIHN0YV9pZCwgdGlkLCBmcmFtZV9saW1pdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc19raWNrX25pYyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwl0cmFucy0+b3BzLT5raWNrX25pYyh0cmFucy0+cHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc19zeW5jX2lycShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwl0cmFucy0+b3BzLT5zeW5jX2lycSh0cmFucy0+cHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc19mcmVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXRyYW5zLT5vcHMtPmZyZWUodHJhbnMtPnByaXYpOworfQorCitpbnQgaXdsX3RyYW5zX3JlZ2lzdGVyKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOworCisvKlRPRE86IHRoaXMgZnVuY3Rpb25zIHNob3VsZCBOT1QgYmUgZXhwb3J0ZWQgZnJvbSB0cmFucyBtb2R1bGUgLSBleHBvcnQgaXQKKyAqIHVudGlsIHRoZSByZWNsYWltIGZsb3cgd2lsbCBiZSBicm91Z2h0IHRvIHRoZSB0cmFuc3BvcnQgbW9kdWxlIHRvbyAqLworCitzdHJ1Y3QgaXdsX3R4X3F1ZXVlOwordm9pZCBpd2xhZ25fdHhxX2ludmFsX2J5dGVfY250X3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJCSAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKTsKKworI2VuZGlmIC8qIF9faXdsX3RyYW5zX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NmUxNzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHguYworKysgL2Rldi9udWxsCkBAIC0xLDgzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtYWduLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLXN0YS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCi0KLS8qKgotICogaXdsX3R4cV91cGRhdGVfd3JpdGVfcHRyIC0gU2VuZCBuZXcgd3JpdGUgaW5kZXggdG8gaGFyZHdhcmUKLSAqLwotdm9pZCBpd2xfdHhxX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpCi17Ci0JdTMyIHJlZyA9IDA7Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKLQotCWlmICh0eHEtPm5lZWRfdXBkYXRlID09IDApCi0JCXJldHVybjsKLQotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5zaGFkb3dfcmVnX2VuYWJsZSkgewotCQkvKiBzaGFkb3cgcmVnaXN0ZXIgZW5hYmxlZCAqLwotCQlpd2xfd3JpdGUzMihwcml2LCBIQlVTX1RBUkdfV1JQVFIsCi0JCQkgICAgdHhxLT5xLndyaXRlX3B0ciB8ICh0eHFfaWQgPDwgOCkpOwotCX0gZWxzZSB7Ci0JCS8qIGlmIHdlJ3JlIHRyeWluZyB0byBzYXZlIHBvd2VyICovCi0JCWlmICh0ZXN0X2JpdChTVEFUVVNfUE9XRVJfUE1JLCAmcHJpdi0+c3RhdHVzKSkgewotCQkJLyogd2FrZSB1cCBuaWMgaWYgaXQncyBwb3dlcmVkIGRvd24gLi4uCi0JCQkgKiB1Q29kZSB3aWxsIHdha2UgdXAsIGFuZCBpbnRlcnJ1cHQgdXMgYWdhaW4sIHNvIG5leHQKLQkJCSAqIHRpbWUgd2UnbGwgc2tpcCB0aGlzIHBhcnQuICovCi0JCQlyZWcgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxKTsKLQotCQkJaWYgKHJlZyAmIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVApIHsKLQkJCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCQkiVHggcXVldWUgJWQgcmVxdWVzdGluZyB3YWtldXAsIgotCQkJCQkiIEdQMSA9IDB4JXhcbiIsIHR4cV9pZCwgcmVnKTsKLQkJCQlpd2xfc2V0X2JpdChwcml2LCBDU1JfR1BfQ05UUkwsCi0JCQkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX1dSUFRSLAotCQkJCSAgICAgdHhxLT5xLndyaXRlX3B0ciB8ICh0eHFfaWQgPDwgOCkpOwotCi0JCS8qCi0JCSAqIGVsc2Ugbm90IGluIHBvd2VyLXNhdmUgbW9kZSwKLQkJICogdUNvZGUgd2lsbCBuZXZlciBzbGVlcCB3aGVuIHdlJ3JlCi0JCSAqIHRyeWluZyB0byB0eCAoZHVyaW5nIFJGS0lMTCwgd2UncmUgbm90IHRyeWluZyB0byB0eCkuCi0JCSAqLwotCQl9IGVsc2UKLQkJCWl3bF93cml0ZTMyKHByaXYsIEhCVVNfVEFSR19XUlBUUiwKLQkJCQkgICAgdHhxLT5xLndyaXRlX3B0ciB8ICh0eHFfaWQgPDwgOCkpOwotCX0KLQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKLX0KLQotc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGl3bF90ZmRfdGJfZ2V0X2FkZHIoc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4KQotewotCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOwotCi0JZG1hX2FkZHJfdCBhZGRyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZ0Yi0+bG8pOwotCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiBzaXplb2YodTMyKSkKLQkJYWRkciB8PQotCQkoKGRtYV9hZGRyX3QpKGxlMTZfdG9fY3B1KHRiLT5oaV9uX2xlbikgJiAweEYpIDw8IDE2KSA8PCAxNjsKLQotCXJldHVybiBhZGRyOwotfQotCi1zdGF0aWMgaW5saW5lIHUxNiBpd2xfdGZkX3RiX2dldF9sZW4oc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4KQotewotCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOwotCi0JcmV0dXJuIGxlMTZfdG9fY3B1KHRiLT5oaV9uX2xlbikgPj4gNDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF90ZmRfc2V0X3RiKHN0cnVjdCBpd2xfdGZkICp0ZmQsIHU4IGlkeCwKLQkJCQkgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbikKLXsKLQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKLQl1MTYgaGlfbl9sZW4gPSBsZW4gPDwgNDsKLQotCXB1dF91bmFsaWduZWRfbGUzMihhZGRyLCAmdGItPmxvKTsKLQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCi0JCWhpX25fbGVuIHw9ICgoYWRkciA+PiAxNikgPj4gMTYpICYgMHhGOwotCi0JdGItPmhpX25fbGVuID0gY3B1X3RvX2xlMTYoaGlfbl9sZW4pOwotCi0JdGZkLT5udW1fdGJzID0gaWR4ICsgMTsKLX0KLQotc3RhdGljIGlubGluZSB1OCBpd2xfdGZkX2dldF9udW1fdGJzKHN0cnVjdCBpd2xfdGZkICp0ZmQpCi17Ci0JcmV0dXJuIHRmZC0+bnVtX3RicyAmIDB4MWY7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bGFnbl91bm1hcF90ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2NtZF9tZXRhICptZXRhLAotCQkJICAgICBzdHJ1Y3QgaXdsX3RmZCAqdGZkKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBwcml2LT5wY2lfZGV2OwotCWludCBpOwotCWludCBudW1fdGJzOwotCi0JLyogU2FuaXR5IGNoZWNrIG9uIG51bWJlciBvZiBjaHVua3MgKi8KLQludW1fdGJzID0gaXdsX3RmZF9nZXRfbnVtX3Ricyh0ZmQpOwotCi0JaWYgKG51bV90YnMgPj0gSVdMX05VTV9PRl9UQlMpIHsKLQkJSVdMX0VSUihwcml2LCAiVG9vIG1hbnkgY2h1bmtzOiAlaVxuIiwgbnVtX3Ricyk7Ci0JCS8qIEB0b2RvIGlzc3VlIGZhdGFsIGVycm9yLCBpdCBpcyBxdWl0ZSBzZXJpb3VzIHNpdHVhdGlvbiAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogVW5tYXAgdHhfY21kICovCi0JaWYgKG51bV90YnMpCi0JCXBjaV91bm1hcF9zaW5nbGUoZGV2LAotCQkJCWRtYV91bm1hcF9hZGRyKG1ldGEsIG1hcHBpbmcpLAotCQkJCWRtYV91bm1hcF9sZW4obWV0YSwgbGVuKSwKLQkJCQlQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCi0JLyogVW5tYXAgY2h1bmtzLCBpZiBhbnkuICovCi0JZm9yIChpID0gMTsgaSA8IG51bV90YnM7IGkrKykKLQkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGl3bF90ZmRfdGJfZ2V0X2FkZHIodGZkLCBpKSwKLQkJCQlpd2xfdGZkX3RiX2dldF9sZW4odGZkLCBpKSwgUENJX0RNQV9UT0RFVklDRSk7Ci19Ci0KLS8qKgotICogaXdsYWduX3R4cV9mcmVlX3RmZCAtIEZyZWUgYWxsIGNodW5rcyByZWZlcmVuY2VkIGJ5IFRGRCBbdHhxLT5xLnJlYWRfcHRyXQotICogQHByaXYgLSBkcml2ZXIgcHJpdmF0ZSBkYXRhCi0gKiBAdHhxIC0gdHggcXVldWUKLSAqCi0gKiBEb2VzIE5PVCBhZHZhbmNlIGFueSBURkQgY2lyY3VsYXIgYnVmZmVyIHJlYWQvd3JpdGUgaW5kZXhlcwotICogRG9lcyBOT1QgZnJlZSB0aGUgVEZEIGl0c2VsZiAod2hpY2ggaXMgd2l0aGluIGNpcmN1bGFyIGJ1ZmZlcikKLSAqLwotdm9pZCBpd2xhZ25fdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQotewotCXN0cnVjdCBpd2xfdGZkICp0ZmRfdG1wID0gdHhxLT50ZmRzOwotCWludCBpbmRleCA9IHR4cS0+cS5yZWFkX3B0cjsKLQotCWl3bGFnbl91bm1hcF90ZmQocHJpdiwgJnR4cS0+bWV0YVtpbmRleF0sICZ0ZmRfdG1wW2luZGV4XSk7Ci0KLQkvKiBmcmVlIFNLQiAqLwotCWlmICh0eHEtPnR4YikgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JCXNrYiA9IHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiOwotCi0JCS8qIGNhbiBiZSBjYWxsZWQgZnJvbSBpcnFzLWRpc2FibGVkIGNvbnRleHQgKi8KLQkJaWYgKHNrYikgewotCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJCXR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiID0gTlVMTDsKLQkJfQotCX0KLX0KLQotaW50IGl3bGFnbl90eHFfYXR0YWNoX2J1Zl90b190ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQkJIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwKLQkJCQkgdTggcmVzZXQpCi17Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcTsKLQlzdHJ1Y3QgaXdsX3RmZCAqdGZkLCAqdGZkX3RtcDsKLQl1MzIgbnVtX3RiczsKLQotCXEgPSAmdHhxLT5xOwotCXRmZF90bXAgPSB0eHEtPnRmZHM7Ci0JdGZkID0gJnRmZF90bXBbcS0+d3JpdGVfcHRyXTsKLQotCWlmIChyZXNldCkKLQkJbWVtc2V0KHRmZCwgMCwgc2l6ZW9mKCp0ZmQpKTsKLQotCW51bV90YnMgPSBpd2xfdGZkX2dldF9udW1fdGJzKHRmZCk7Ci0KLQkvKiBFYWNoIFRGRCBjYW4gcG9pbnQgdG8gYSBtYXhpbXVtIDIwIFR4IGJ1ZmZlcnMgKi8KLQlpZiAobnVtX3RicyA+PSBJV0xfTlVNX09GX1RCUykgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBjYW4gbm90IHNlbmQgbW9yZSB0aGFuICVkIGNodW5rc1xuIiwKLQkJCSAgSVdMX05VTV9PRl9UQlMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoV0FSTl9PTihhZGRyICYgfkRNQV9CSVRfTUFTSygzNikpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh1bmxpa2VseShhZGRyICYgfklXTF9UWF9ETUFfTUFTSykpCi0JCUlXTF9FUlIocHJpdiwgIlVuYWxpZ25lZCBhZGRyZXNzID0gJWxseFxuIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyKTsKLQotCWl3bF90ZmRfc2V0X3RiKHRmZCwgbnVtX3RicywgYWRkciwgbGVuKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogVGVsbCBuaWMgd2hlcmUgdG8gZmluZCBjaXJjdWxhciBidWZmZXIgb2YgVHggRnJhbWUgRGVzY3JpcHRvcnMgZm9yCi0gKiBnaXZlbiBUeCBxdWV1ZSwgYW5kIGVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgdXNlZCBmb3IgdGhhdCBxdWV1ZS4KLSAqCi0gKiBzdXBwb3J0cyB1cCB0byAxNiBUeCBxdWV1ZXMgaW4gRFJBTSwgbWFwcGVkIHRvIHVwIHRvIDggVHggRE1BCi0gKiBjaGFubmVscyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUuCi0gKi8KLXN0YXRpYyBpbnQgaXdsYWduX3R4X3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpCi17Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKLQotCS8qIENpcmN1bGFyIGJ1ZmZlciAoVEZEIHF1ZXVlIGluIERSQU0pIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyAqLwotCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9NRU1fQ0JCQ19RVUVVRSh0eHFfaWQpLAotCQkJICAgICB0eHEtPnEuZG1hX2FkZHIgPj4gOCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2xfdHhfcXVldWVfdW5tYXAgLSAgVW5tYXAgYW55IHJlbWFpbmluZyBETUEgbWFwcGluZ3MgYW5kIGZyZWUgc2tiJ3MKLSAqLwotdm9pZCBpd2xfdHhfcXVldWVfdW5tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKQotewotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbdHhxX2lkXTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gJnR4cS0+cTsKLQotCWlmIChxLT5uX2JkID09IDApCi0JCXJldHVybjsKLQotCSB3aGlsZSAocS0+d3JpdGVfcHRyICE9IHEtPnJlYWRfcHRyKSB7Ci0JCWl3bGFnbl90eHFfZnJlZV90ZmQocHJpdiwgdHhxKTsKLQkJcS0+cmVhZF9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIsIHEtPm5fYmQpOwotCX0KLX0KLQotLyoqCi0gKiBpd2xfdHhfcXVldWVfZnJlZSAtIERlYWxsb2NhdGUgRE1BIHF1ZXVlLgotICogQHR4cTogVHJhbnNtaXQgcXVldWUgdG8gZGVhbGxvY2F0ZS4KLSAqCi0gKiBFbXB0eSBxdWV1ZSBieSByZW1vdmluZyBhbmQgZGVzdHJveWluZyBhbGwgQkQncy4KLSAqIEZyZWUgYWxsIGJ1ZmZlcnMuCi0gKiAwLWZpbGwsIGJ1dCBkbyBub3QgZnJlZSAidHhxIiBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KLSAqLwotdm9pZCBpd2xfdHhfcXVldWVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwcml2LT5wY2lfZGV2LT5kZXY7Ci0JaW50IGk7Ci0KLQlpd2xfdHhfcXVldWVfdW5tYXAocHJpdiwgdHhxX2lkKTsKLQotCS8qIERlLWFsbG9jIGFycmF5IG9mIGNvbW1hbmQvdHggYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBURkRfVFhfQ01EX1NMT1RTOyBpKyspCi0JCWtmcmVlKHR4cS0+Y21kW2ldKTsKLQotCS8qIERlLWFsbG9jIGNpcmN1bGFyIGJ1ZmZlciBvZiBURkRzICovCi0JaWYgKHR4cS0+cS5uX2JkKQotCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHByaXYtPmh3X3BhcmFtcy50ZmRfc2l6ZSAqCi0JCQkJICB0eHEtPnEubl9iZCwgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOwotCi0JLyogRGUtYWxsb2MgYXJyYXkgb2YgcGVyLVRGRCBkcml2ZXIgZGF0YSAqLwotCWtmcmVlKHR4cS0+dHhiKTsKLQl0eHEtPnR4YiA9IE5VTEw7Ci0KLQkvKiBkZWFsbG9jYXRlIGFycmF5cyAqLwotCWtmcmVlKHR4cS0+Y21kKTsKLQlrZnJlZSh0eHEtPm1ldGEpOwotCXR4cS0+Y21kID0gTlVMTDsKLQl0eHEtPm1ldGEgPSBOVUxMOwotCi0JLyogMC1maWxsIHF1ZXVlIGRlc2NyaXB0b3Igc3RydWN0dXJlICovCi0JbWVtc2V0KHR4cSwgMCwgc2l6ZW9mKCp0eHEpKTsKLX0KLQotLyoqCi0gKiBpd2xfY21kX3F1ZXVlX3VubWFwIC0gVW5tYXAgYW55IHJlbWFpbmluZyBETUEgbWFwcGluZ3MgZnJvbSBjb21tYW5kIHF1ZXVlCi0gKi8KLXZvaWQgaXdsX2NtZF9xdWV1ZV91bm1hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVtwcml2LT5jbWRfcXVldWVdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCWludCBpOwotCi0JaWYgKHEtPm5fYmQgPT0gMCkKLQkJcmV0dXJuOwotCi0Jd2hpbGUgKHEtPnJlYWRfcHRyICE9IHEtPndyaXRlX3B0cikgewotCQlpID0gZ2V0X2NtZF9pbmRleChxLCBxLT5yZWFkX3B0cik7Ci0KLQkJaWYgKHR4cS0+bWV0YVtpXS5mbGFncyAmIENNRF9NQVBQRUQpIHsKLQkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwKLQkJCQkJIGRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaV0sIG1hcHBpbmcpLAotCQkJCQkgZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2ldLCBsZW4pLAotCQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQkJCXR4cS0+bWV0YVtpXS5mbGFncyA9IDA7Ci0JCX0KLQotCQlxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCk7Ci0JfQotfQotCi0vKioKLSAqIGl3bF9jbWRfcXVldWVfZnJlZSAtIERlYWxsb2NhdGUgRE1BIHF1ZXVlLgotICogQHR4cTogVHJhbnNtaXQgcXVldWUgdG8gZGVhbGxvY2F0ZS4KLSAqCi0gKiBFbXB0eSBxdWV1ZSBieSByZW1vdmluZyBhbmQgZGVzdHJveWluZyBhbGwgQkQncy4KLSAqIEZyZWUgYWxsIGJ1ZmZlcnMuCi0gKiAwLWZpbGwsIGJ1dCBkbyBub3QgZnJlZSAidHhxIiBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KLSAqLwotdm9pZCBpd2xfY21kX3F1ZXVlX2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+cGNpX2Rldi0+ZGV2OwotCWludCBpOwotCi0JaXdsX2NtZF9xdWV1ZV91bm1hcChwcml2KTsKLQotCS8qIERlLWFsbG9jIGFycmF5IG9mIGNvbW1hbmQvdHggYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBURkRfQ01EX1NMT1RTOyBpKyspCi0JCWtmcmVlKHR4cS0+Y21kW2ldKTsKLQotCS8qIERlLWFsbG9jIGNpcmN1bGFyIGJ1ZmZlciBvZiBURkRzICovCi0JaWYgKHR4cS0+cS5uX2JkKQotCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHByaXYtPmh3X3BhcmFtcy50ZmRfc2l6ZSAqIHR4cS0+cS5uX2JkLAotCQkJCSAgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOwotCi0JLyogZGVhbGxvY2F0ZSBhcnJheXMgKi8KLQlrZnJlZSh0eHEtPmNtZCk7Ci0Ja2ZyZWUodHhxLT5tZXRhKTsKLQl0eHEtPmNtZCA9IE5VTEw7Ci0JdHhxLT5tZXRhID0gTlVMTDsKLQotCS8qIDAtZmlsbCBxdWV1ZSBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLwotCW1lbXNldCh0eHEsIDAsIHNpemVvZigqdHhxKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKiogRE1BLVFVRVVFLUdFTkVSQUwtRlVOQ1RJT05TICAqKioqKgotICogRE1BIHNlcnZpY2VzCi0gKgotICogVGhlb3J5IG9mIG9wZXJhdGlvbgotICoKLSAqIEEgVHggb3IgUnggcXVldWUgcmVzaWRlcyBpbiBob3N0IERSQU0sIGFuZCBpcyBjb21wcmlzZWQgb2YgYSBjaXJjdWxhciBidWZmZXIKLSAqIG9mIGJ1ZmZlciBkZXNjcmlwdG9ycywgZWFjaCBvZiB3aGljaCBwb2ludHMgdG8gb25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIGZvcgotICogdGhlIGRldmljZSB0byByZWFkIGZyb20gb3IgZmlsbC4gIERyaXZlciBhbmQgZGV2aWNlIGV4Y2hhbmdlIHN0YXR1cyBvZiBlYWNoCi0gKiBxdWV1ZSB2aWEgInJlYWQiIGFuZCAid3JpdGUiIHBvaW50ZXJzLiAgRHJpdmVyIGtlZXBzIG1pbmltdW0gb2YgMiBlbXB0eQotICogZW50cmllcyBpbiBlYWNoIGNpcmN1bGFyIGJ1ZmZlciwgdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmZ1c2luZyBlbXB0eSBhbmQgZnVsbAotICogcXVldWUgc3RhdGVzLgotICoKLSAqIFRoZSBkZXZpY2UgcmVhZHMgb3Igd3JpdGVzIHRoZSBkYXRhIGluIHRoZSBxdWV1ZXMgdmlhIHRoZSBkZXZpY2UncyBzZXZlcmFsCi0gKiBETUEvRklGTyBjaGFubmVscy4gIEVhY2ggcXVldWUgaXMgbWFwcGVkIHRvIGEgc2luZ2xlIERNQSBjaGFubmVsLgotICoKLSAqIEZvciBUeCBxdWV1ZSwgdGhlcmUgYXJlIGxvdyBtYXJrIGFuZCBoaWdoIG1hcmsgbGltaXRzLiBJZiwgYWZ0ZXIgcXVldWluZwotICogdGhlIHBhY2tldCBmb3IgVHgsIGZyZWUgc3BhY2UgYmVjb21lIDwgbG93IG1hcmssIFR4IHF1ZXVlIHN0b3BwZWQuIFdoZW4KLSAqIHJlY2xhaW1pbmcgcGFja2V0cyAob24gJ3R4IGRvbmUgSVJRKSwgaWYgZnJlZSBzcGFjZSBiZWNvbWUgPiBoaWdoIG1hcmssCi0gKiBUeCBxdWV1ZSByZXN1bWVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCBpd2xfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGl3bF9xdWV1ZSAqcSkKLXsKLQlpbnQgcyA9IHEtPnJlYWRfcHRyIC0gcS0+d3JpdGVfcHRyOwotCi0JaWYgKHEtPnJlYWRfcHRyID4gcS0+d3JpdGVfcHRyKQotCQlzIC09IHEtPm5fYmQ7Ci0KLQlpZiAocyA8PSAwKQotCQlzICs9IHEtPm5fd2luZG93OwotCS8qIGtlZXAgc29tZSByZXNlcnZlIHRvIG5vdCBjb25mdXNlIGVtcHR5IGFuZCBmdWxsIHNpdHVhdGlvbnMgKi8KLQlzIC09IDI7Ci0JaWYgKHMgPCAwKQotCQlzID0gMDsKLQlyZXR1cm4gczsKLX0KLQotCi0vKioKLSAqIGl3bF9xdWV1ZV9pbml0IC0gSW5pdGlhbGl6ZSBxdWV1ZSdzIGhpZ2gvbG93LXdhdGVyIGFuZCByZWFkL3dyaXRlIGluZGV4ZXMKLSAqLwotc3RhdGljIGludCBpd2xfcXVldWVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcXVldWUgKnEsCi0JCQkgIGludCBjb3VudCwgaW50IHNsb3RzX251bSwgdTMyIGlkKQotewotCXEtPm5fYmQgPSBjb3VudDsKLQlxLT5uX3dpbmRvdyA9IHNsb3RzX251bTsKLQlxLT5pZCA9IGlkOwotCi0JLyogY291bnQgbXVzdCBiZSBwb3dlci1vZi10d28gc2l6ZSwgb3RoZXJ3aXNlIGl3bF9xdWV1ZV9pbmNfd3JhcAotCSAqIGFuZCBpd2xfcXVldWVfZGVjX3dyYXAgYXJlIGJyb2tlbi4gKi8KLQlpZiAoV0FSTl9PTighaXNfcG93ZXJfb2ZfMihjb3VudCkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIHNsb3RzX251bSBtdXN0IGJlIHBvd2VyLW9mLXR3byBzaXplLCBvdGhlcndpc2UKLQkgKiBnZXRfY21kX2luZGV4IGlzIGJyb2tlbi4gKi8KLQlpZiAoV0FSTl9PTighaXNfcG93ZXJfb2ZfMihzbG90c19udW0pKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlxLT5sb3dfbWFyayA9IHEtPm5fd2luZG93IC8gNDsKLQlpZiAocS0+bG93X21hcmsgPCA0KQotCQlxLT5sb3dfbWFyayA9IDQ7Ci0KLQlxLT5oaWdoX21hcmsgPSBxLT5uX3dpbmRvdyAvIDg7Ci0JaWYgKHEtPmhpZ2hfbWFyayA8IDIpCi0JCXEtPmhpZ2hfbWFyayA9IDI7Ci0KLQlxLT53cml0ZV9wdHIgPSBxLT5yZWFkX3B0ciA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2xfdHhfcXVldWVfYWxsb2MgLSBBbGxvYyBkcml2ZXIgZGF0YSBhbmQgVEZEIENCIGZvciBvbmUgVHgvY21kIHF1ZXVlCi0gKi8KLXN0YXRpYyBpbnQgaXdsX3R4X3F1ZXVlX2FsbG9jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwgdTMyIGlkKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwcml2LT5wY2lfZGV2LT5kZXY7Ci0Jc2l6ZV90IHRmZF9zeiA9IHByaXYtPmh3X3BhcmFtcy50ZmRfc2l6ZSAqIFRGRF9RVUVVRV9TSVpFX01BWDsKLQotCS8qIERyaXZlciBwcml2YXRlIGRhdGEsIG9ubHkgZm9yIFR4IChub3QgY29tbWFuZCkgcXVldWVzLAotCSAqIG5vdCBzaGFyZWQgd2l0aCBkZXZpY2UuICovCi0JaWYgKGlkICE9IHByaXYtPmNtZF9xdWV1ZSkgewotCQl0eHEtPnR4YiA9IGt6YWxsb2Moc2l6ZW9mKHR4cS0+dHhiWzBdKSAqCi0JCQkJICAgVEZEX1FVRVVFX1NJWkVfTUFYLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF0eHEtPnR4YikgewotCQkJSVdMX0VSUihwcml2LCAia21hbGxvYyBmb3IgYXV4aWxpYXJ5IEJEICIKLQkJCQkgICJzdHJ1Y3R1cmVzIGZhaWxlZFxuIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfSBlbHNlIHsKLQkJdHhxLT50eGIgPSBOVUxMOwotCX0KLQotCS8qIENpcmN1bGFyIGJ1ZmZlciBvZiB0cmFuc21pdCBmcmFtZSBkZXNjcmlwdG9ycyAoVEZEcyksCi0JICogc2hhcmVkIHdpdGggZGV2aWNlICovCi0JdHhxLT50ZmRzID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgdGZkX3N6LCAmdHhxLT5xLmRtYV9hZGRyLAotCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXR4cS0+dGZkcykgewotCQlJV0xfRVJSKHByaXYsICJwY2lfYWxsb2NfY29uc2lzdGVudCglemQpIGZhaWxlZFxuIiwgdGZkX3N6KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JdHhxLT5xLmlkID0gaWQ7Ci0KLQlyZXR1cm4gMDsKLQotIGVycm9yOgotCWtmcmVlKHR4cS0+dHhiKTsKLQl0eHEtPnR4YiA9IE5VTEw7Ci0KLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotLyoqCi0gKiBpd2xfdHhfcXVldWVfaW5pdCAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG9uZSB0eC9jbWQgcXVldWUKLSAqLwotaW50IGl3bF90eF9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAotCQkgICAgICBpbnQgc2xvdHNfbnVtLCB1MzIgdHhxX2lkKQotewotCWludCBpLCBsZW47Ci0JaW50IHJldDsKLQotCXR4cS0+bWV0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpd2xfY21kX21ldGEpICogc2xvdHNfbnVtLAotCQkJICAgIEdGUF9LRVJORUwpOwotCXR4cS0+Y21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl3bF9kZXZpY2VfY21kICopICogc2xvdHNfbnVtLAotCQkJICAgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXR4cS0+bWV0YSB8fCAhdHhxLT5jbWQpCi0JCWdvdG8gb3V0X2ZyZWVfYXJyYXlzOwotCi0JbGVuID0gc2l6ZW9mKHN0cnVjdCBpd2xfZGV2aWNlX2NtZCk7Ci0JZm9yIChpID0gMDsgaSA8IHNsb3RzX251bTsgaSsrKSB7Ci0JCXR4cS0+Y21kW2ldID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoIXR4cS0+Y21kW2ldKQotCQkJZ290byBlcnI7Ci0JfQotCi0JLyogQWxsb2MgZHJpdmVyIGRhdGEgYXJyYXkgYW5kIFRGRCBjaXJjdWxhciBidWZmZXIgKi8KLQlyZXQgPSBpd2xfdHhfcXVldWVfYWxsb2MocHJpdiwgdHhxLCB0eHFfaWQpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JdHhxLT5uZWVkX3VwZGF0ZSA9IDA7Ci0KLQkvKgotCSAqIEZvciB0aGUgZGVmYXVsdCBxdWV1ZXMgMC0zLCBzZXQgdXAgdGhlIHN3cV9pZAotCSAqIGFscmVhZHkgLS0gYWxsIG90aGVycyBuZWVkIHRvIGdldCBvbmUgbGF0ZXIKLQkgKiAoaWYgdGhleSBuZWVkIG9uZSBhdCBhbGwpLgotCSAqLwotCWlmICh0eHFfaWQgPCA0KQotCQlpd2xfc2V0X3N3cV9pZCh0eHEsIHR4cV9pZCwgdHhxX2lkKTsKLQotCS8qIFRGRF9RVUVVRV9TSVpFX01BWCBtdXN0IGJlIHBvd2VyLW9mLXR3byBzaXplLCBvdGhlcndpc2UKLQkgKiBpd2xfcXVldWVfaW5jX3dyYXAgYW5kIGl3bF9xdWV1ZV9kZWNfd3JhcCBhcmUgYnJva2VuLiAqLwotCUJVSUxEX0JVR19PTihURkRfUVVFVUVfU0laRV9NQVggJiAoVEZEX1FVRVVFX1NJWkVfTUFYIC0gMSkpOwotCi0JLyogSW5pdGlhbGl6ZSBxdWV1ZSdzIGhpZ2gvbG93LXdhdGVyIG1hcmtzLCBhbmQgaGVhZC90YWlsIGluZGV4ZXMgKi8KLQlyZXQgPSBpd2xfcXVldWVfaW5pdChwcml2LCAmdHhxLT5xLCBURkRfUVVFVUVfU0laRV9NQVgsIHNsb3RzX251bSwgdHhxX2lkKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgdG8gZmluZCBxdWV1ZSAqLwotCWl3bGFnbl90eF9xdWV1ZV9pbml0KHByaXYsIHR4cSk7Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQlmb3IgKGkgPSAwOyBpIDwgc2xvdHNfbnVtOyBpKyspCi0JCWtmcmVlKHR4cS0+Y21kW2ldKTsKLW91dF9mcmVlX2FycmF5czoKLQlrZnJlZSh0eHEtPm1ldGEpOwotCWtmcmVlKHR4cS0+Y21kKTsKLQotCXJldHVybiAtRU5PTUVNOwotfQotCi12b2lkIGl3bF90eF9xdWV1ZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCWludCBzbG90c19udW0sIHUzMiB0eHFfaWQpCi17Ci0JaW50IGFjdHVhbF9zbG90cyA9IHNsb3RzX251bTsKLQotCWlmICh0eHFfaWQgPT0gcHJpdi0+Y21kX3F1ZXVlKQotCQlhY3R1YWxfc2xvdHMrKzsKLQotCW1lbXNldCh0eHEtPm1ldGEsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX2NtZF9tZXRhKSAqIGFjdHVhbF9zbG90cyk7Ci0KLQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKLQotCS8qIEluaXRpYWxpemUgcXVldWUncyBoaWdoL2xvdy13YXRlciBtYXJrcywgYW5kIGhlYWQvdGFpbCBpbmRleGVzICovCi0JaXdsX3F1ZXVlX2luaXQocHJpdiwgJnR4cS0+cSwgVEZEX1FVRVVFX1NJWkVfTUFYLCBzbG90c19udW0sIHR4cV9pZCk7Ci0KLQkvKiBUZWxsIGRldmljZSB3aGVyZSB0byBmaW5kIHF1ZXVlICovCi0JaXdsYWduX3R4X3F1ZXVlX2luaXQocHJpdiwgdHhxKTsKLX0KLQotLyoqKioqKioqKioqKioqKiBIT1NUIENPTU1BTkQgUVVFVUUgRlVOQ1RJT05TICAgKioqKiovCi0KLS8qKgotICogaXdsX2VucXVldWVfaGNtZCAtIGVucXVldWUgYSB1Q29kZSBjb21tYW5kCi0gKiBAcHJpdjogZGV2aWNlIHByaXZhdGUgZGF0YSBwb2ludAotICogQGNtZDogYSBwb2ludCB0byB0aGUgdWNvZGUgY29tbWFuZCBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyA8IDAgdmFsdWVzIHRvIGluZGljYXRlIHRoZSBvcGVyYXRpb24gaXMKLSAqIGZhaWxlZC4gT24gc3VjY2VzcywgaXQgdHVybnMgdGhlIGluZGV4ICg+IDApIG9mIGNvbW1hbmQgaW4gdGhlCi0gKiBjb21tYW5kIHF1ZXVlLgotICovCi1pbnQgaXdsX2VucXVldWVfaGNtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3ByaXYtPmNtZF9xdWV1ZV07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7Ci0Jc3RydWN0IGl3bF9kZXZpY2VfY21kICpvdXRfY21kOwotCXN0cnVjdCBpd2xfY21kX21ldGEgKm91dF9tZXRhOwotCWRtYV9hZGRyX3QgcGh5c19hZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGlkeDsKLQl1MTYgY29weV9zaXplLCBjbWRfc2l6ZTsKLQlib29sIGlzX2N0X2tpbGwgPSBmYWxzZTsKLQlib29sIGhhZF9ub2NvcHkgPSBmYWxzZTsKLQlpbnQgaTsKLQl1OCAqY21kX2Rlc3Q7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1RSQUNJTkcKLQljb25zdCB2b2lkICp0cmFjZV9idWZzW0lXTF9NQVhfQ01EX1RGRFMgKyAxXSA9IHt9OwotCWludCB0cmFjZV9sZW5zW0lXTF9NQVhfQ01EX1RGRFMgKyAxXSA9IHt9OwotCWludCB0cmFjZV9pZHg7Ci0jZW5kaWYKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJmdyByZWNvdmVyeSwgbm8gaGNtZCBzZW5kXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JY29weV9zaXplID0gc2l6ZW9mKG91dF9jbWQtPmhkcik7Ci0JY21kX3NpemUgPSBzaXplb2Yob3V0X2NtZC0+aGRyKTsKLQotCS8qIG5lZWQgb25lIGZvciB0aGUgaGVhZGVyIGlmIHRoZSBmaXJzdCBpcyBOT0NPUFkgKi8KLQlCVUlMRF9CVUdfT04oSVdMX01BWF9DTURfVEZEUyA+IElXTF9OVU1fT0ZfVEJTIC0gMSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSVdMX01BWF9DTURfVEZEUzsgaSsrKSB7Ci0JCWlmICghY21kLT5sZW5baV0pCi0JCQljb250aW51ZTsKLQkJaWYgKGNtZC0+ZGF0YWZsYWdzW2ldICYgSVdMX0hDTURfREZMX05PQ09QWSkgewotCQkJaGFkX25vY29weSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBOT0NPUFkgbXVzdCBub3QgYmUgZm9sbG93ZWQgYnkgbm9ybWFsISAqLwotCQkJaWYgKFdBUk5fT04oaGFkX25vY29weSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQljb3B5X3NpemUgKz0gY21kLT5sZW5baV07Ci0JCX0KLQkJY21kX3NpemUgKz0gY21kLT5sZW5baV07Ci0JfQotCi0JLyoKLQkgKiBJZiBhbnkgb2YgdGhlIGNvbW1hbmQgc3RydWN0dXJlcyBlbmQgdXAgYmVpbmcgbGFyZ2VyIHRoYW4KLQkgKiB0aGUgVEZEX01BWF9QQVlMT0FEX1NJWkUgYW5kIHRoZXkgYXJlbid0IGR5bmFtaWNhbGx5Ci0JICogYWxsb2NhdGVkIGludG8gc2VwYXJhdGUgVEZEcywgdGhlbiB3ZSB3aWxsIG5lZWQgdG8KLQkgKiBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVycy4KLQkgKi8KLQlpZiAoV0FSTl9PTihjb3B5X3NpemUgPiBURkRfTUFYX1BBWUxPQURfU0laRSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGl3bF9pc19yZmtpbGwocHJpdikgfHwgaXdsX2lzX2N0a2lsbChwcml2KSkgewotCQlJV0xfV0FSTihwcml2LCAiTm90IHNlbmRpbmcgY29tbWFuZCAtICVzIEtJTExcbiIsCi0JCQkgaXdsX2lzX3Jma2lsbChwcml2KSA/ICJSRiIgOiAiQ1QiKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmhjbWRfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGl3bF9xdWV1ZV9zcGFjZShxKSA8ICgoY21kLT5mbGFncyAmIENNRF9BU1lOQykgPyAyIDogMSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aGNtZF9sb2NrLCBmbGFncyk7Ci0KLQkJSVdMX0VSUihwcml2LCAiTm8gc3BhY2UgaW4gY29tbWFuZCBxdWV1ZVxuIik7Ci0JCWlzX2N0X2tpbGwgPSBpd2xfY2hlY2tfZm9yX2N0X2tpbGwocHJpdik7Ci0JCWlmICghaXNfY3Rfa2lsbCkgewotCQkJSVdMX0VSUihwcml2LCAiUmVzdGFydGluZyBhZGFwdGVyIGR1ZSB0byBxdWV1ZSBmdWxsXG4iKTsKLQkJCWl3bGFnbl9md19lcnJvcihwcml2LCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIC1FTk9TUEM7Ci0JfQotCi0JaWR4ID0gZ2V0X2NtZF9pbmRleChxLCBxLT53cml0ZV9wdHIpOwotCW91dF9jbWQgPSB0eHEtPmNtZFtpZHhdOwotCW91dF9tZXRhID0gJnR4cS0+bWV0YVtpZHhdOwotCi0JaWYgKFdBUk5fT04ob3V0X21ldGEtPmZsYWdzICYgQ01EX01BUFBFRCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aGNtZF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRU5PU1BDOwotCX0KLQotCW1lbXNldChvdXRfbWV0YSwgMCwgc2l6ZW9mKCpvdXRfbWV0YSkpOwkvKiByZS1pbml0aWFsaXplIHRvIE5VTEwgKi8KLQlpZiAoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikKLQkJb3V0X21ldGEtPnNvdXJjZSA9IGNtZDsKLQlpZiAoY21kLT5mbGFncyAmIENNRF9BU1lOQykKLQkJb3V0X21ldGEtPmNhbGxiYWNrID0gY21kLT5jYWxsYmFjazsKLQotCS8qIHNldCB1cCB0aGUgaGVhZGVyICovCi0KLQlvdXRfY21kLT5oZHIuY21kID0gY21kLT5pZDsKLQlvdXRfY21kLT5oZHIuZmxhZ3MgPSAwOwotCW91dF9jbWQtPmhkci5zZXF1ZW5jZSA9IGNwdV90b19sZTE2KFFVRVVFX1RPX1NFUShwcml2LT5jbWRfcXVldWUpIHwKLQkJCQkJICAgIElOREVYX1RPX1NFUShxLT53cml0ZV9wdHIpKTsKLQotCS8qIGFuZCBjb3B5IHRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgY29waWVkICovCi0KLQljbWRfZGVzdCA9ICZvdXRfY21kLT5jbWQucGF5bG9hZFswXTsKLQlmb3IgKGkgPSAwOyBpIDwgSVdMX01BWF9DTURfVEZEUzsgaSsrKSB7Ci0JCWlmICghY21kLT5sZW5baV0pCi0JCQljb250aW51ZTsKLQkJaWYgKGNtZC0+ZGF0YWZsYWdzW2ldICYgSVdMX0hDTURfREZMX05PQ09QWSkKLQkJCWJyZWFrOwotCQltZW1jcHkoY21kX2Rlc3QsIGNtZC0+ZGF0YVtpXSwgY21kLT5sZW5baV0pOwotCQljbWRfZGVzdCArPSBjbWQtPmxlbltpXTsKLQl9Ci0KLQlJV0xfREVCVUdfSEMocHJpdiwgIlNlbmRpbmcgY29tbWFuZCAlcyAoIyV4KSwgc2VxOiAweCUwNFgsICIKLQkJCSIlZCBieXRlcyBhdCAlZFslZF06JWRcbiIsCi0JCQlnZXRfY21kX3N0cmluZyhvdXRfY21kLT5oZHIuY21kKSwKLQkJCW91dF9jbWQtPmhkci5jbWQsCi0JCQlsZTE2X3RvX2NwdShvdXRfY21kLT5oZHIuc2VxdWVuY2UpLCBjbWRfc2l6ZSwKLQkJCXEtPndyaXRlX3B0ciwgaWR4LCBwcml2LT5jbWRfcXVldWUpOwotCi0JcGh5c19hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwgJm91dF9jbWQtPmhkciwKLQkJCQkgICBjb3B5X3NpemUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JaWYgKHVubGlrZWx5KHBjaV9kbWFfbWFwcGluZ19lcnJvcihwcml2LT5wY2lfZGV2LCBwaHlzX2FkZHIpKSkgewotCQlpZHggPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlkbWFfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHBoeXNfYWRkcik7Ci0JZG1hX3VubWFwX2xlbl9zZXQob3V0X21ldGEsIGxlbiwgY29weV9zaXplKTsKLQotCWl3bGFnbl90eHFfYXR0YWNoX2J1Zl90b190ZmQocHJpdiwgdHhxLCBwaHlzX2FkZHIsIGNvcHlfc2l6ZSwgMSk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1RSQUNJTkcKLQl0cmFjZV9idWZzWzBdID0gJm91dF9jbWQtPmhkcjsKLQl0cmFjZV9sZW5zWzBdID0gY29weV9zaXplOwotCXRyYWNlX2lkeCA9IDE7Ci0jZW5kaWYKLQotCWZvciAoaSA9IDA7IGkgPCBJV0xfTUFYX0NNRF9URkRTOyBpKyspIHsKLQkJaWYgKCFjbWQtPmxlbltpXSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIShjbWQtPmRhdGFmbGFnc1tpXSAmIElXTF9IQ01EX0RGTF9OT0NPUFkpKQotCQkJY29udGludWU7Ci0JCXBoeXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsICh2b2lkICopY21kLT5kYXRhW2ldLAotCQkJCQkgICBjbWQtPmxlbltpXSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+cGNpX2RldiwgcGh5c19hZGRyKSkgewotCQkJaXdsYWduX3VubWFwX3RmZChwcml2LCBvdXRfbWV0YSwKLQkJCQkJICZ0eHEtPnRmZHNbcS0+d3JpdGVfcHRyXSk7Ci0JCQlpZHggPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpd2xhZ25fdHhxX2F0dGFjaF9idWZfdG9fdGZkKHByaXYsIHR4cSwgcGh5c19hZGRyLAotCQkJCQkgICAgIGNtZC0+bGVuW2ldLCAwKTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVFJBQ0lORwotCQl0cmFjZV9idWZzW3RyYWNlX2lkeF0gPSBjbWQtPmRhdGFbaV07Ci0JCXRyYWNlX2xlbnNbdHJhY2VfaWR4XSA9IGNtZC0+bGVuW2ldOwotCQl0cmFjZV9pZHgrKzsKLSNlbmRpZgotCX0KLQotCW91dF9tZXRhLT5mbGFncyA9IGNtZC0+ZmxhZ3MgfCBDTURfTUFQUEVEOwotCi0JdHhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0KLQkvKiBjaGVjayB0aGF0IHRyYWNpbmcgZ2V0cyBhbGwgcG9zc2libGUgYmxvY2tzICovCi0JQlVJTERfQlVHX09OKElXTF9NQVhfQ01EX1RGRFMgKyAxICE9IDMpOwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9UUkFDSU5HCi0JdHJhY2VfaXdsd2lmaV9kZXZfaGNtZChwcml2LCBjbWQtPmZsYWdzLAotCQkJICAgICAgIHRyYWNlX2J1ZnNbMF0sIHRyYWNlX2xlbnNbMF0sCi0JCQkgICAgICAgdHJhY2VfYnVmc1sxXSwgdHJhY2VfbGVuc1sxXSwKLQkJCSAgICAgICB0cmFjZV9idWZzWzJdLCB0cmFjZV9sZW5zWzJdKTsKLSNlbmRpZgotCi0JLyogSW5jcmVtZW50IGFuZCB1cGRhdGUgcXVldWUncyB3cml0ZSBpbmRleCAqLwotCXEtPndyaXRlX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIsIHEtPm5fYmQpOwotCWl3bF90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCB0eHEpOwotCi0gb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmhjbWRfbG9jaywgZmxhZ3MpOwotCXJldHVybiBpZHg7Ci19Ci0KLS8qKgotICogaXdsX2hjbWRfcXVldWVfcmVjbGFpbSAtIFJlY2xhaW0gVFggY29tbWFuZCBxdWV1ZSBlbnRyaWVzIGFscmVhZHkgVHgnZAotICoKLSAqIFdoZW4gRlcgYWR2YW5jZXMgJ1InIGluZGV4LCBhbGwgZW50cmllcyBiZXR3ZWVuIG9sZCBhbmQgbmV3ICdSJyBpbmRleAotICogbmVlZCB0byBiZSByZWNsYWltZWQuIEFzIHJlc3VsdCwgc29tZSBmcmVlIHNwYWNlIGZvcm1zLiAgSWYgdGhlcmUgaXMKLSAqIGVub3VnaCBmcmVlIHNwYWNlICg+IGxvdyBtYXJrKSwgd2FrZSB0aGUgc3RhY2sgdGhhdCBmZWVkcyB1cy4KLSAqLwotc3RhdGljIHZvaWQgaXdsX2hjbWRfcXVldWVfcmVjbGFpbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIGludCBpZHgpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCWludCBuZnJlZWQgPSAwOwotCi0JaWYgKChpZHggPj0gcS0+bl9iZCkgfHwgKGl3bF9xdWV1ZV91c2VkKHEsIGlkeCkgPT0gMCkpIHsKLQkJSVdMX0VSUihwcml2LCAiUmVhZCBpbmRleCBmb3IgRE1BIHF1ZXVlIHR4cSBpZCAoJWQpLCBpbmRleCAlZCwgIgotCQkJICAiaXMgb3V0IG9mIHJhbmdlIFswLSVkXSAlZCAlZC5cbiIsIHR4cV9pZCwKLQkJCSAgaWR4LCBxLT5uX2JkLCBxLT53cml0ZV9wdHIsIHEtPnJlYWRfcHRyKTsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAoaWR4ID0gaXdsX3F1ZXVlX2luY193cmFwKGlkeCwgcS0+bl9iZCk7IHEtPnJlYWRfcHRyICE9IGlkeDsKLQkgICAgIHEtPnJlYWRfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgewotCi0JCWlmIChuZnJlZWQrKyA+IDApIHsKLQkJCUlXTF9FUlIocHJpdiwgIkhDTUQgc2tpcHBlZDogaW5kZXggKCVkKSAlZCAlZFxuIiwgaWR4LAotCQkJCQlxLT53cml0ZV9wdHIsIHEtPnJlYWRfcHRyKTsKLQkJCWl3bGFnbl9md19lcnJvcihwcml2LCBmYWxzZSk7Ci0JCX0KLQotCX0KLX0KLQotLyoqCi0gKiBpd2xfdHhfY21kX2NvbXBsZXRlIC0gUHVsbCB1bnVzZWQgYnVmZmVycyBvZmYgdGhlIHF1ZXVlIGFuZCByZWNsYWltIHRoZW0KLSAqIEByeGI6IFJ4IGJ1ZmZlciB0byByZWNsYWltCi0gKgotICogSWYgYW4gUnggYnVmZmVyIGhhcyBhbiBhc3luYyBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggaXQgdGhlIGNhbGxiYWNrCi0gKiB3aWxsIGJlIGV4ZWN1dGVkLiAgVGhlIGF0dGFjaGVkIHNrYiAoaWYgcHJlc2VudCkgd2lsbCBvbmx5IGJlIGZyZWVkCi0gKiBpZiB0aGUgY2FsbGJhY2sgcmV0dXJucyAxCi0gKi8KLXZvaWQgaXdsX3R4X2NtZF9jb21wbGV0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXUxNiBzZXF1ZW5jZSA9IGxlMTZfdG9fY3B1KHBrdC0+aGRyLnNlcXVlbmNlKTsKLQlpbnQgdHhxX2lkID0gU0VRX1RPX1FVRVVFKHNlcXVlbmNlKTsKLQlpbnQgaW5kZXggPSBTRVFfVE9fSU5ERVgoc2VxdWVuY2UpOwotCWludCBjbWRfaW5kZXg7Ci0Jc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQ7Ci0Jc3RydWN0IGl3bF9jbWRfbWV0YSAqbWV0YTsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3ByaXYtPmNtZF9xdWV1ZV07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIElmIGEgVHggY29tbWFuZCBpcyBiZWluZyBoYW5kbGVkIGFuZCBpdCBpc24ndCBpbiB0aGUgYWN0dWFsCi0JICogY29tbWFuZCBxdWV1ZSB0aGVuIHRoZXJlIGEgY29tbWFuZCByb3V0aW5nIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkCi0JICogaW4gdGhlIHF1ZXVlIG1hbmFnZW1lbnQgY29kZS4gKi8KLQlpZiAoV0FSTih0eHFfaWQgIT0gcHJpdi0+Y21kX3F1ZXVlLAotCQkgIndyb25nIGNvbW1hbmQgcXVldWUgJWQgKHNob3VsZCBiZSAlZCksIHNlcXVlbmNlIDB4JVggcmVhZHA9JWQgd3JpdGVwPSVkXG4iLAotCQkgIHR4cV9pZCwgcHJpdi0+Y21kX3F1ZXVlLCBzZXF1ZW5jZSwKLQkJICBwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXS5xLnJlYWRfcHRyLAotCQkgIHByaXYtPnR4cVtwcml2LT5jbWRfcXVldWVdLnEud3JpdGVfcHRyKSkgewotCQlpd2xfcHJpbnRfaGV4X2Vycm9yKHByaXYsIHBrdCwgMzIpOwotCQlyZXR1cm47Ci0JfQotCi0JY21kX2luZGV4ID0gZ2V0X2NtZF9pbmRleCgmdHhxLT5xLCBpbmRleCk7Ci0JY21kID0gdHhxLT5jbWRbY21kX2luZGV4XTsKLQltZXRhID0gJnR4cS0+bWV0YVtjbWRfaW5kZXhdOwotCi0JaXdsYWduX3VubWFwX3RmZChwcml2LCBtZXRhLCAmdHhxLT50ZmRzW2luZGV4XSk7Ci0KLQkvKiBJbnB1dCBlcnJvciBjaGVja2luZyBpcyBkb25lIHdoZW4gY29tbWFuZHMgYXJlIGFkZGVkIHRvIHF1ZXVlLiAqLwotCWlmIChtZXRhLT5mbGFncyAmIENNRF9XQU5UX1NLQikgewotCQltZXRhLT5zb3VyY2UtPnJlcGx5X3BhZ2UgPSAodW5zaWduZWQgbG9uZylyeGJfYWRkcihyeGIpOwotCQlyeGItPnBhZ2UgPSBOVUxMOwotCX0gZWxzZSBpZiAobWV0YS0+Y2FsbGJhY2spCi0JCW1ldGEtPmNhbGxiYWNrKHByaXYsIGNtZCwgcGt0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5oY21kX2xvY2ssIGZsYWdzKTsKLQotCWl3bF9oY21kX3F1ZXVlX3JlY2xhaW0ocHJpdiwgdHhxX2lkLCBpbmRleCk7Ci0KLQlpZiAoIShtZXRhLT5mbGFncyAmIENNRF9BU1lOQykpIHsKLQkJY2xlYXJfYml0KFNUQVRVU19IQ01EX0FDVElWRSwgJnByaXYtPnN0YXR1cyk7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJDbGVhcmluZyBIQ01EX0FDVElWRSBmb3IgY29tbWFuZCAlc1xuIiwKLQkJCSAgICAgICBnZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpKTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOwotCX0KLQotCS8qIE1hcmsgYXMgdW5tYXBwZWQgKi8KLQltZXRhLT5mbGFncyA9IDA7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5oY21kX2xvY2ssIGZsYWdzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9mdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2Z3LmMKaW5kZXggNDkwNjcwOS4uNmYxYWZlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2Z3LmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZXJyX3JlbGVhc2VfZnc7CiAJCW9wY29kZV9pZHgrKzsKLQl9OworCX0KIAogCS8qIFJlYWQgZmlybXdhcmUgdmVyc2lvbiAqLwogCWZ3X29mZnNldCA9IGl3bV9md19vcF9vZmZzZXQoaXdtLCBmdywgSVdNX0hEUl9SRUNfT1BfU1dfVkVSLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmMKaW5kZXggNWQ2MzdhZi4uYjQ1NmE1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmMKQEAgLTgsNiArOCw3IEBACiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCmluZGV4IDcxYzhmM2YuLmRiZDI0YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCkBAIC0zLDYgKzMsNyBAQAogICogSXQgcHJlcGFyZXMgY29tbWFuZCBhbmQgc2VuZHMgaXQgdG8gZmlybXdhcmUgd2hlbiBpdCBpcyByZWFkeS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC04NzMsNiArODc0LDcgQEAKIAltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKIAljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9HRVQpOworCWNtZC5vZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOwogCiAJaWYgKHJlZyAhPSBDTURfTUFDX1JFR19BQ0NFU1MgJiYKIAkgICAgcmVnICE9IENNRF9CQlBfUkVHX0FDQ0VTUyAmJgpAQCAtODgyLDcgKzg4NCw3IEBACiAJfQogCiAJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIHJlZywgJmNtZCk7Ci0JaWYgKHJldCkgeworCWlmICghcmV0KSB7CiAJCWlmIChyZWcgPT0gQ01EX0JCUF9SRUdfQUNDRVNTIHx8IHJlZyA9PSBDTURfUkZfUkVHX0FDQ0VTUykKIAkJCSp2YWx1ZSA9IGNtZC52YWx1ZS5iYnBfcmY7CiAJCWVsc2UgaWYgKHJlZyA9PSBDTURfTUFDX1JFR19BQ0NFU1MpCkBAIC05MTUsNiArOTE3LDcgQEAKIAltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKIAljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9TRVQpOworCWNtZC5vZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOwogCiAJaWYgKHJlZyA9PSBDTURfQkJQX1JFR19BQ0NFU1MgfHwgcmVnID09IENNRF9SRl9SRUdfQUNDRVNTKQogCQljbWQudmFsdWUuYmJwX3JmID0gKHU4KSAodmFsdWUgJiAweEZGKTsKQEAgLTEwNjcsMTYgKzEwNzAsMzQgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOwogfQogCi12b2lkIGxic19jb21wbGV0ZV9jb21tYW5kKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZCwKLQkJCSAgaW50IHJlc3VsdCkKK3ZvaWQgX19sYnNfY29tcGxldGVfY29tbWFuZChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWQsCisJCQkgICAgaW50IHJlc3VsdCkKIHsKKwkvKgorCSAqIE5vcm1hbGx5LCBjb21tYW5kcyBhcmUgcmVtb3ZlZCBmcm9tIGNtZHBlbmRpbmdxIGJlZm9yZSBiZWluZworCSAqIHN1Ym1pdHRlZC4gSG93ZXZlciwgd2UgY2FuIGFycml2ZSBoZXJlIG9uIGFsdGVybmF0aXZlIGNvZGVwYXRocworCSAqIHdoZXJlIHRoZSBjb21tYW5kIGlzIHN0aWxsIHBlbmRpbmcuIE1ha2Ugc3VyZSB0aGUgY29tbWFuZCByZWFsbHkKKwkgKiBpc24ndCBwYXJ0IG9mIGEgbGlzdCBhdCB0aGlzIHBvaW50LgorCSAqLworCWxpc3RfZGVsX2luaXQoJmNtZC0+bGlzdCk7CisKIAljbWQtPnJlc3VsdCA9IHJlc3VsdDsKIAljbWQtPmNtZHdhaXRxd29rZW4gPSAxOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY21kLT5jbWR3YWl0X3EpOworCXdha2VfdXAoJmNtZC0+Y21kd2FpdF9xKTsKIAogCWlmICghY21kLT5jYWxsYmFjayB8fCBjbWQtPmNhbGxiYWNrID09IGxic19jbWRfYXN5bmNfY2FsbGJhY2spCiAJCV9fbGJzX2NsZWFudXBfYW5kX2luc2VydF9jbWQocHJpdiwgY21kKTsKIAlwcml2LT5jdXJfY21kID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPndhaXRxKTsKK30KKwordm9pZCBsYnNfY29tcGxldGVfY29tbWFuZChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWQsCisJCQkgIGludCByZXN1bHQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlfX2xic19jb21wbGV0ZV9jb21tYW5kKHByaXYsIGNtZCwgcmVzdWx0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOwogfQogCiBpbnQgbGJzX3NldF9yYWRpbyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHU4IHByZWFtYmxlLCB1OCByYWRpb19vbikKQEAgLTEyNDgsNyArMTI2OSw3IEBACiAJaWYgKCFsaXN0X2VtcHR5KCZwcml2LT5jbWRmcmVlcSkpIHsKIAkJdGVtcG5vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwcml2LT5jbWRmcmVlcSwKIAkJCQkJICAgIHN0cnVjdCBjbWRfY3RybF9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJnRlbXBub2RlLT5saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmdGVtcG5vZGUtPmxpc3QpOwogCX0gZWxzZSB7CiAJCWxic19kZWJfaG9zdCgiR0VUX0NNRF9OT0RFOiBjbWRfY3RybF9ub2RlIGlzIG5vdCBhdmFpbGFibGVcbiIpOwogCQl0ZW1wbm9kZSA9IE5VTEw7CkBAIC0xMzU2LDEwICsxMzc3LDcgQEAKIAkJCQkgICAgY3B1X3RvX2xlMTYoUFNfTU9ERV9BQ1RJT05fRVhJVF9QUykpIHsKIAkJCQkJbGJzX2RlYl9ob3N0KAogCQkJCQkgICAgICAgIkVYRUNfTkVYVF9DTUQ6IGlnbm9yZSBFTlRFUl9QUyBjbWRcbiIpOwotCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKLQkJCQkJbGlzdF9kZWwoJmNtZG5vZGUtPmxpc3QpOwogCQkJCQlsYnNfY29tcGxldGVfY29tbWFuZChwcml2LCBjbWRub2RlLCAwKTsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAogCQkJCQlyZXQgPSAwOwogCQkJCQlnb3RvIGRvbmU7CkBAIC0xMzY5LDEwICsxMzg3LDcgQEAKIAkJCQkgICAgKHByaXYtPnBzc3RhdGUgPT0gUFNfU1RBVEVfUFJFX1NMRUVQKSkgewogCQkJCQlsYnNfZGViX2hvc3QoCiAJCQkJCSAgICAgICAiRVhFQ19ORVhUX0NNRDogaWdub3JlIEVYSVRfUFMgY21kIGluIHNsZWVwXG4iKTsKLQkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7Ci0JCQkJCWxpc3RfZGVsKCZjbWRub2RlLT5saXN0KTsKIAkJCQkJbGJzX2NvbXBsZXRlX2NvbW1hbmQocHJpdiwgY21kbm9kZSwgMCk7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CiAJCQkJCXByaXYtPm5lZWR0b3dha2V1cCA9IDE7CiAKIAkJCQkJcmV0ID0gMDsKQEAgLTEzODQsNyArMTM5OSw3IEBACiAJCQl9CiAJCX0KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfZGVsKCZjbWRub2RlLT5saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmY21kbm9kZS0+bGlzdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CiAJCWxic19kZWJfaG9zdCgiRVhFQ19ORVhUX0NNRDogc2VuZGluZyBjb21tYW5kIDB4JTA0eFxuIiwKIAkJCSAgICBsZTE2X3RvX2NwdShjbWQtPmNvbW1hbmQpKTsKQEAgLTE2NjcsNyArMTY4MiwxMyBAQAogCX0KIAogCW1pZ2h0X3NsZWVwKCk7Ci0Jd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNtZG5vZGUtPmNtZHdhaXRfcSwgY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CisKKwkvKgorCSAqIEJlIGNhcmVmdWwgd2l0aCBzaWduYWxzIGhlcmUuIEEgc2lnbmFsIG1heSBiZSByZWNlaXZlZCBhcyB0aGUgc3lzdGVtCisJICogZ29lcyBpbnRvIHN1c3BlbmQgb3IgcmVzdW1lLiBXZSBkbyBub3Qgd2FudCB0aGlzIHRvIGludGVycnVwdCB0aGUKKwkgKiBjb21tYW5kLCBzbyB3ZSBwZXJmb3JtIGFuIHVuaW50ZXJydXB0aWJsZSBzbGVlcC4KKwkgKi8KKwl3YWl0X2V2ZW50KGNtZG5vZGUtPmNtZHdhaXRfcSwgY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAlyZXQgPSBjbWRub2RlLT5yZXN1bHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5oCmluZGV4IDcxMDlkNmIuLmIyODBlZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5oCkBAIC01OSw2ICs1OSw4IEBACiBpbnQgbGJzX2ZyZWVfY21kX2J1ZmZlcihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpOwogCiBpbnQgbGJzX2V4ZWN1dGVfbmV4dF9jb21tYW5kKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdik7Cit2b2lkIF9fbGJzX2NvbXBsZXRlX2NvbW1hbmQoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kLAorCQkJICAgIGludCByZXN1bHQpOwogdm9pZCBsYnNfY29tcGxldGVfY29tbWFuZChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWQsCiAJCQkgIGludCByZXN1bHQpOwogaW50IGxic19wcm9jZXNzX2NvbW1hbmRfcmVzcG9uc2Uoc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1OCAqZGF0YSwgdTMyIGxlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWRyZXNwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWRyZXNwLmMKaW5kZXggMjA3ZmMzNi4uMTc4YjIyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kcmVzcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZHJlc3AuYwpAQCAtMyw2ICszLDcgQEAKICAqIHJlc3BvbnNlcyBhcyB3ZWxsIGFzIGV2ZW50cyBnZW5lcmF0ZWQgYnkgZmlybXdhcmUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtMTY1LDcgKzE2Niw3IEBACiAJCQlsYnNfZGViX2hvc3QoIkNNRF9SRVNQOiBQUyBhY3Rpb24gMHglWFxuIiwgYWN0aW9uKTsKIAkJfQogCi0JCWxic19jb21wbGV0ZV9jb21tYW5kKHByaXYsIHByaXYtPmN1cl9jbWQsIHJlc3VsdCk7CisJCV9fbGJzX2NvbXBsZXRlX2NvbW1hbmQocHJpdiwgcHJpdi0+Y3VyX2NtZCwgcmVzdWx0KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAogCQlyZXQgPSAwOwpAQCAtMTg2LDcgKzE4Nyw3IEBACiAJCQlicmVhazsKIAogCQl9Ci0JCWxic19jb21wbGV0ZV9jb21tYW5kKHByaXYsIHByaXYtPmN1cl9jbWQsIHJlc3VsdCk7CisJCV9fbGJzX2NvbXBsZXRlX2NvbW1hbmQocHJpdiwgcHJpdi0+Y3VyX2NtZCwgcmVzdWx0KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAogCQlyZXQgPSAtMTsKQEAgLTIwNCw3ICsyMDUsNyBAQAogCiAJaWYgKHByaXYtPmN1cl9jbWQpIHsKIAkJLyogQ2xlYW4gdXAgYW5kIFB1dCBjdXJyZW50IGNvbW1hbmQgYmFjayB0byBjbWRmcmVlcSAqLwotCQlsYnNfY29tcGxldGVfY29tbWFuZChwcml2LCBwcml2LT5jdXJfY21kLCByZXN1bHQpOworCQlfX2xic19jb21wbGV0ZV9jb21tYW5kKHByaXYsIHByaXYtPmN1cl9jbWQsIHJlc3VsdCk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlYnVnZnMuYwppbmRleCAyMzI1MGY2Li4xYWYxODI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Rldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGV2LmgKaW5kZXggNzZkMDE4Yi4uYWRiMzQ5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGV2LmgKQEAgLTQ0LDkgKzQ0LDcgQEAKIAkvKiBNZXNoICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm1lc2hfZGV2OyAvKiBWaXJ0dWFsIGRldmljZSAqLwogI2lmZGVmIENPTkZJR19MSUJFUlRBU19NRVNICi0JdTMyIG1lc2hfY29ubmVjdF9zdGF0dXM7CiAJc3RydWN0IGxic19tZXNoX3N0YXRzIG1zdGF0czsKLQlpbnQgbWVzaF9vcGVuOwogCXVpbnQxNl90IG1lc2hfdGx2OwogCXU4IG1lc2hfc3NpZFtJRUVFODAyMTFfTUFYX1NTSURfTEVOICsgMV07CiAJdTggbWVzaF9zc2lkX2xlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2V0aHRvb2wuYwppbmRleCAyOWRiY2U0Li40ZGZiM2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZXRodG9vbC5jCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NkaW8uYwppbmRleCBhN2I1Y2IwLi4zODc3ODZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc2Rpby5jCkBAIC04OTIsNiArODkyLDM3IEBACiAKIH0KIAorc3RhdGljIHN0cnVjdCBtbWNfaG9zdCAqcmVzZXRfaG9zdDsKKworc3RhdGljIHZvaWQgaWZfc2Rpb19yZXNldF9jYXJkX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJLyoKKwkgKiBUaGUgYWN0dWFsIHJlc2V0IG9wZXJhdGlvbiBtdXN0IGJlIHJ1biBvdXRzaWRlIG9mIGxic190aHJlYWQuIFRoaXMKKwkgKiBpcyBiZWNhdXNlIG1tY19yZW1vdmVfaG9zdCgpIHdpbGwgY2F1c2UgdGhlIGRldmljZSB0byBiZSBpbnN0YW50bHkKKwkgKiBkZXN0cm95ZWQsIGFuZCB0aGUgbGliZXJ0YXMgZHJpdmVyIHRoZW4gbmVlZHMgdG8gZW5kIGxic190aHJlYWQsCisJICogbGVhZGluZyB0byBhIGRlYWRsb2NrLgorCSAqCisJICogV2UgcnVuIGl0IGluIGEgd29ya3F1ZXVlIHRvdGFsbHkgaW5kZXBlbmRlbnQgZnJvbSB0aGUgaWZfc2Rpb19jYXJkCisJICogaW5zdGFuY2UgZm9yIHRoYXQgcmVhc29uLgorCSAqLworCisJcHJfaW5mbygiUmVzZXR0aW5nIGNhcmQuLi4iKTsKKwltbWNfcmVtb3ZlX2hvc3QocmVzZXRfaG9zdCk7CisJbW1jX2FkZF9ob3N0KHJlc2V0X2hvc3QpOworfQorc3RhdGljIERFQ0xBUkVfV09SSyhjYXJkX3Jlc2V0X3dvcmssIGlmX3NkaW9fcmVzZXRfY2FyZF93b3JrZXIpOworCitzdGF0aWMgdm9pZCBpZl9zZGlvX3Jlc2V0X2NhcmQoc3RydWN0IGxic19wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBpZl9zZGlvX2NhcmQgKmNhcmQgPSBwcml2LT5jYXJkOworCisJaWYgKHdvcmtfcGVuZGluZygmY2FyZF9yZXNldF93b3JrKSkKKwkJcmV0dXJuOworCisJcmVzZXRfaG9zdCA9IGNhcmQtPmZ1bmMtPmNhcmQtPmhvc3Q7CisJc2NoZWR1bGVfd29yaygmY2FyZF9yZXNldF93b3JrKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBTRElPIGNhbGxiYWNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTA3LDcgKzkzOCw3IEBACiAJY2FyZCA9IHNkaW9fZ2V0X2RydmRhdGEoZnVuYyk7CiAKIAljYXVzZSA9IHNkaW9fcmVhZGIoY2FyZC0+ZnVuYywgSUZfU0RJT19IX0lOVF9TVEFUVVMsICZyZXQpOwotCWlmIChyZXQpCisJaWYgKHJldCB8fCAhY2F1c2UpCiAJCWdvdG8gb3V0OwogCiAJbGJzX2RlYl9zZGlvKCJpbnRlcnJ1cHQ6IDB4JVhcbiIsICh1bnNpZ25lZCljYXVzZSk7CkBAIC0xMDA4LDEwICsxMDM5LDYgQEAKIAlpZiAocmV0KQogCQlnb3RvIHJlbGVhc2U7CiAKLQlyZXQgPSBzZGlvX2NsYWltX2lycShmdW5jLCBpZl9zZGlvX2ludGVycnVwdCk7Ci0JaWYgKHJldCkKLQkJZ290byBkaXNhYmxlOwotCiAJLyogRm9yIDEtYml0IHRyYW5zZmVycyB0byB0aGUgODY4NiBtb2RlbCwgd2UgbmVlZCB0byBlbmFibGUgdGhlCiAJICogaW50ZXJydXB0IGZsYWcgaW4gdGhlIENDQ1IgcmVnaXN0ZXIuIFNldCB0aGUgTU1DX1FVSVJLX0xFTklFTlRfRk4wCiAJICogYml0IHRvIGFsbG93IGFjY2VzcyB0byBub24tdmVuZG9yIHJlZ2lzdGVycy4gKi8KQEAgLTEwNjksNiArMTA5Niw3IEBACiAJcHJpdi0+ZW50ZXJfZGVlcF9zbGVlcCA9IGlmX3NkaW9fZW50ZXJfZGVlcF9zbGVlcDsKIAlwcml2LT5leGl0X2RlZXBfc2xlZXAgPSBpZl9zZGlvX2V4aXRfZGVlcF9zbGVlcDsKIAlwcml2LT5yZXNldF9kZWVwX3NsZWVwX3dha2V1cCA9IGlmX3NkaW9fcmVzZXRfZGVlcF9zbGVlcF93YWtldXA7CisJcHJpdi0+cmVzZXRfY2FyZCA9IGlmX3NkaW9fcmVzZXRfY2FyZDsKIAogCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKIApAQCAtMTA4Myw2ICsxMTExLDIxIEBACiAJCWNhcmQtPnJ4X3VuaXQgPSAwOwogCiAJLyoKKwkgKiBTZXQgdXAgdGhlIGludGVycnVwdCBoYW5kbGVyIGxhdGUuCisJICoKKwkgKiBJZiB3ZSBzZXQgaXQgdXAgZWFybGllciwgdGhlIChidWdneSkgaGFyZHdhcmUgZ2VuZXJhdGVzIGEgc3B1cmlvdXMKKwkgKiBpbnRlcnJ1cHQsIGV2ZW4gYmVmb3JlIHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4gZW5hYmxlZCwgd2l0aAorCSAqIENDQ1JfSU5UeCA9IDAuCisJICoKKwkgKiBXZSByZWdpc3RlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgbGF0ZSBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgYW55CisJICogc3B1cmlvdXMgaW50ZXJydXB0cywgYW5kIGFsc28gdG8gYXZvaWQgZ2VuZXJhdGlvbiBvZiB0aGF0IGtub3duCisJICogc3B1cmlvdXMgaW50ZXJydXB0IGluIHRoZSBmaXJzdCBwbGFjZS4KKwkgKi8KKwlyZXQgPSBzZGlvX2NsYWltX2lycShmdW5jLCBpZl9zZGlvX2ludGVycnVwdCk7CisJaWYgKHJldCkKKwkJZ290byBkaXNhYmxlOworCisJLyoKIAkgKiBFbmFibGUgaW50ZXJydXB0cyBub3cgdGhhdCBldmVyeXRoaW5nIGlzIHNldCB1cAogCSAqLwogCXNkaW9fd3JpdGViKGZ1bmMsIDB4MGYsIElGX1NESU9fSF9JTlRfTUFTSywgJnJldCk7CkBAIC0xMjkwLDYgKzEzMzMsOCBAQAogCS8qIFNldCB0aGUgZmxhZyBhcyB1c2VyIGlzIHJlbW92aW5nIHRoaXMgbW9kdWxlLiAqLwogCXVzZXJfcm1tb2QgPSAxOwogCisJY2FuY2VsX3dvcmtfc3luYygmY2FyZF9yZXNldF93b3JrKTsKKwogCXNkaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmlmX3NkaW9fZHJpdmVyKTsKIAogCWxic19kZWJfbGVhdmUoTEJTX0RFQl9TRElPKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NwaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc3BpLmMKaW5kZXggNDYzMzUyYy4uZTAyODZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc3BpLmMKQEAgLTE5LDYgKzE5LDggQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CkBAIC0xMDMyLDcgKzEwMzQsNiBAQAogc3RhdGljIGludCBpZl9zcGlfaW5pdF9jYXJkKHN0cnVjdCBpZl9zcGlfY2FyZCAqY2FyZCkKIHsKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBjYXJkLT5wcml2OwotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBjYXJkLT5zcGk7CiAJaW50IGVyciwgaTsKIAl1MzIgc2NyYXRjaDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmhlbHBlciA9IE5VTEw7CkBAIC0xMDgwLDggKzEwODEsOSBAQAogCQkJCSJhdHRhY2hlZCB0byBTUEkgYnVzX251bSAlZCwgY2hpcF9zZWxlY3QgJWQuICIKIAkJCQkic3BpLT5tYXhfc3BlZWRfaHo9JWRcbiIsCiAJCQkJY2FyZC0+Y2FyZF9pZCwgY2FyZC0+Y2FyZF9yZXYsCi0JCQkJc3BpLT5tYXN0ZXItPmJ1c19udW0sIHNwaS0+Y2hpcF9zZWxlY3QsCi0JCQkJc3BpLT5tYXhfc3BlZWRfaHopOworCQkJCWNhcmQtPnNwaS0+bWFzdGVyLT5idXNfbnVtLAorCQkJCWNhcmQtPnNwaS0+Y2hpcF9zZWxlY3QsCisJCQkJY2FyZC0+c3BpLT5tYXhfc3BlZWRfaHopOwogCQllcnIgPSBpZl9zcGlfcHJvZ19oZWxwZXJfZmlybXdhcmUoY2FyZCwgaGVscGVyKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCmluZGV4IDhjNDA5NDkuLjk0NjUyYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KQEAgLTUxMSw3ICs1MTIsNyBAQAogCQkJCWlmIChwcml2LT5jb25uZWN0X3N0YXR1cyA9PSBMQlNfQ09OTkVDVEVEKQogCQkJCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPmRldik7CiAJCQkJaWYgKHByaXYtPm1lc2hfZGV2ICYmCi0JCQkJICAgIGxic19tZXNoX2Nvbm5lY3RlZChwcml2KSkKKwkJCQkgICAgbmV0aWZfcnVubmluZyhwcml2LT5tZXNoX2RldikpCiAJCQkJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+bWVzaF9kZXYpOwogCQkJfQogCQl9CkBAIC02MzgsNiArNjM5LDE0IEBACiAJCSAgICBsZTE2X3RvX2NwdShwcml2LT5jdXJfY21kLT5jbWRidWYtPmNvbW1hbmQpKTsKIAogCXByaXYtPmNtZF90aW1lZF9vdXQgPSAxOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGRpZG4ndCBldmVuIGFja25vd2xlZGdlIHRoZSBjb21tYW5kLCByZXNldCB0aGUgc3RhdGUKKwkgKiBzbyB0aGF0IHdlIGRvbid0IGJsb2NrIGFsbCBmdXR1cmUgY29tbWFuZHMgZHVlIHRvIHRoaXMgb25lIHRpbWVvdXQuCisJICovCisJaWYgKHByaXYtPmRubGRfc2VudCA9PSBETkxEX0NNRF9TRU5UKQorCQlwcml2LT5kbmxkX3NlbnQgPSBETkxEX1JFU19SRUNFSVZFRDsKKwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+d2FpdHEpOwogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CkBAIC05OTQsNyArMTAwMyw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjbWRub2RlLCAmcHJpdi0+Y21kcGVuZGluZ3EsIGxpc3QpIHsKIAkJY21kbm9kZS0+cmVzdWx0ID0gLUVOT0VOVDsKIAkJY21kbm9kZS0+Y21kd2FpdHF3b2tlbiA9IDE7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY21kbm9kZS0+Y21kd2FpdF9xKTsKKwkJd2FrZV91cCgmY21kbm9kZS0+Y21kd2FpdF9xKTsKIAl9CiAKIAkvKiBGbHVzaCB0aGUgY29tbWFuZCB0aGUgY2FyZCBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyAqLwpAQCAtMTAwMiw3ICsxMDExLDcgQEAKIAkJbGJzX2RlYl9tYWluKCJjbGVhcmluZyBjdXJyZW50IGNvbW1hbmRcbiIpOwogCQlwcml2LT5jdXJfY21kLT5yZXN1bHQgPSAtRU5PRU5UOwogCQlwcml2LT5jdXJfY21kLT5jbWR3YWl0cXdva2VuID0gMTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5jdXJfY21kLT5jbWR3YWl0X3EpOworCQl3YWtlX3VwKCZwcml2LT5jdXJfY21kLT5jbWR3YWl0X3EpOwogCX0KIAlsYnNfZGViX21haW4oImRvbmUgY2xlYXJpbmcgY29tbWFuZHNcbiIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tZXNoLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tZXNoLmMKaW5kZXggMjRjZjA2Ni4uYmU3MmMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWVzaC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21lc2guYwpAQCAtMiw2ICsyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KQEAgLTE0LDYgKzE1LDEyMSBAQAogI2luY2x1ZGUgImNtZC5oIgogCiAKK3N0YXRpYyBpbnQgbGJzX2FkZF9tZXNoKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1lc2ggY29tbWFuZCBoYW5kbGluZworICovCisKK3N0YXRpYyBpbnQgbGJzX21lc2hfYWNjZXNzKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdWludDE2X3QgY21kX2FjdGlvbiwKKwkJICAgIHN0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3MgKmNtZCkKK3sKKwlpbnQgcmV0OworCisJbGJzX2RlYl9lbnRlcl9hcmdzKExCU19ERUJfQ01ELCAiYWN0aW9uICVkIiwgY21kX2FjdGlvbik7CisKKwljbWQtPmhkci5jb21tYW5kID0gY3B1X3RvX2xlMTYoQ01EX01FU0hfQUNDRVNTKTsKKwljbWQtPmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpjbWQpKTsKKwljbWQtPmhkci5yZXN1bHQgPSAwOworCisJY21kLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKworCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfTUVTSF9BQ0NFU1MsIGNtZCk7CisKKwlsYnNfZGViX2xlYXZlKExCU19ERUJfQ01EKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fbGJzX21lc2hfY29uZmlnX3NlbmQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAorCQkJCSAgc3RydWN0IGNtZF9kc19tZXNoX2NvbmZpZyAqY21kLAorCQkJCSAgdWludDE2X3QgYWN0aW9uLCB1aW50MTZfdCB0eXBlKQoreworCWludCByZXQ7CisJdTE2IGNvbW1hbmQgPSBDTURfTUVTSF9DT05GSUdfT0xEOworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7CisKKwkvKgorCSAqIENvbW1hbmQgaWQgaXMgMHhhYyBmb3IgdjEwIEZXIGFsb25nIHdpdGggbWVzaCBpbnRlcmZhY2UKKwkgKiBpZCBpbiBiaXRzIDE0LTEzLTEyLgorCSAqLworCWlmIChwcml2LT5tZXNoX3RsdiA9PSBUTFZfVFlQRV9NRVNIX0lEKQorCQljb21tYW5kID0gQ01EX01FU0hfQ09ORklHIHwKKwkJCSAgKE1FU0hfSUZBQ0VfSUQgPDwgTUVTSF9JRkFDRV9CSVRfT0ZGU0VUKTsKKworCWNtZC0+aGRyLmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjb21tYW5kKTsKKwljbWQtPmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfbWVzaF9jb25maWcpKTsKKwljbWQtPmhkci5yZXN1bHQgPSAwOworCisJY21kLT50eXBlID0gY3B1X3RvX2xlMTYodHlwZSk7CisJY21kLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihhY3Rpb24pOworCisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIGNvbW1hbmQsIGNtZCk7CisKKwlsYnNfZGViX2xlYXZlKExCU19ERUJfQ01EKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxic19tZXNoX2NvbmZpZ19zZW5kKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKKwkJCSBzdHJ1Y3QgY21kX2RzX21lc2hfY29uZmlnICpjbWQsCisJCQkgdWludDE2X3QgYWN0aW9uLCB1aW50MTZfdCB0eXBlKQoreworCWludCByZXQ7CisKKwlpZiAoIShwcml2LT5md2NhcGluZm8gJiBGV19DQVBJTkZPX1BFUlNJU1RFTlRfQ09ORklHKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0ID0gX19sYnNfbWVzaF9jb25maWdfc2VuZChwcml2LCBjbWQsIGFjdGlvbiwgdHlwZSk7CisJcmV0dXJuIHJldDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB0aGUgQ01EX01FU0hfQ09ORklHIGxlZ2FjeSBmdW5jdGlvbi4gIEl0IG9ubHkgaGFuZGxlcyB0aGUKKyAqIFNUQVJUIGFuZCBTVE9QIGFjdGlvbnMuICBUaGUgZXh0ZW5kZWQgYWN0aW9ucyBzdXBwb3J0ZWQgYnkgQ01EX01FU0hfQ09ORklHCisgKiBhcmUgYWxsIGhhbmRsZWQgYnkgcHJlcGFyaW5nIGEgc3RydWN0IGNtZF9kc19tZXNoX2NvbmZpZyBhbmQgcGFzc2luZyBpdCB0bworICogbGJzX21lc2hfY29uZmlnX3NlbmQuCisgKi8KK3N0YXRpYyBpbnQgbGJzX21lc2hfY29uZmlnKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdWludDE2X3QgYWN0aW9uLAorCQl1aW50MTZfdCBjaGFuKQoreworCXN0cnVjdCBjbWRfZHNfbWVzaF9jb25maWcgY21kOworCXN0cnVjdCBtcnZsX21lc2hpZSAqaWU7CisJREVDTEFSRV9TU0lEX0JVRihzc2lkKTsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaGFuKTsKKwlpZSA9IChzdHJ1Y3QgbXJ2bF9tZXNoaWUgKiljbWQuZGF0YTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDTURfQUNUX01FU0hfQ09ORklHX1NUQVJUOgorCQlpZS0+aWQgPSBXTEFOX0VJRF9HRU5FUklDOworCQlpZS0+dmFsLm91aVswXSA9IDB4MDA7CisJCWllLT52YWwub3VpWzFdID0gMHg1MDsKKwkJaWUtPnZhbC5vdWlbMl0gPSAweDQzOworCQlpZS0+dmFsLnR5cGUgPSBNQVJWRUxMX01FU0hfSUVfVFlQRTsKKwkJaWUtPnZhbC5zdWJ0eXBlID0gTUFSVkVMTF9NRVNIX0lFX1NVQlRZUEU7CisJCWllLT52YWwudmVyc2lvbiA9IE1BUlZFTExfTUVTSF9JRV9WRVJTSU9OOworCQlpZS0+dmFsLmFjdGl2ZV9wcm90b2NvbF9pZCA9IE1BUlZFTExfTUVTSF9QUk9UT19JRF9IV01QOworCQlpZS0+dmFsLmFjdGl2ZV9tZXRyaWNfaWQgPSBNQVJWRUxMX01FU0hfTUVUUklDX0lEOworCQlpZS0+dmFsLm1lc2hfY2FwYWJpbGl0eSA9IE1BUlZFTExfTUVTSF9DQVBBQklMSVRZOworCQlpZS0+dmFsLm1lc2hfaWRfbGVuID0gcHJpdi0+bWVzaF9zc2lkX2xlbjsKKwkJbWVtY3B5KGllLT52YWwubWVzaF9pZCwgcHJpdi0+bWVzaF9zc2lkLCBwcml2LT5tZXNoX3NzaWRfbGVuKTsKKwkJaWUtPmxlbiA9IHNpemVvZihzdHJ1Y3QgbXJ2bF9tZXNoaWVfdmFsKSAtCisJCQlJRUVFODAyMTFfTUFYX1NTSURfTEVOICsgcHJpdi0+bWVzaF9zc2lkX2xlbjsKKwkJY21kLmxlbmd0aCA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgbXJ2bF9tZXNoaWVfdmFsKSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0FDVF9NRVNIX0NPTkZJR19TVE9QOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCWxic19kZWJfY21kKCJtZXNoIGNvbmZpZyBhY3Rpb24gJWQgdHlwZSAleCBjaGFubmVsICVkIFNTSUQgJXNcbiIsCisJCSAgICBhY3Rpb24sIHByaXYtPm1lc2hfdGx2LCBjaGFuLAorCQkgICAgcHJpbnRfc3NpZChzc2lkLCBwcml2LT5tZXNoX3NzaWQsIHByaXYtPm1lc2hfc3NpZF9sZW4pKTsKKworCXJldHVybiBfX2xic19tZXNoX2NvbmZpZ19zZW5kKHByaXYsICZjbWQsIGFjdGlvbiwgcHJpdi0+bWVzaF90bHYpOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1lc2ggc3lzZnMgc3VwcG9ydAogICovCkBAIC0xNTQsMTcgKzI3MCwxMSBAQAogewogCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IHRvX25ldF9kZXYoZGV2KS0+bWxfcHJpdjsKIAlpbnQgZW5hYmxlOwotCWludCByZXQsIGFjdGlvbiA9IENNRF9BQ1RfTUVTSF9DT05GSUdfU1RPUDsKIAogCXNzY2FuZihidWYsICIleCIsICZlbmFibGUpOwogCWVuYWJsZSA9ICEhZW5hYmxlOwogCWlmIChlbmFibGUgPT0gISFwcml2LT5tZXNoX2RldikKIAkJcmV0dXJuIGNvdW50OwotCWlmIChlbmFibGUpCi0JCWFjdGlvbiA9IENNRF9BQ1RfTUVTSF9DT05GSUdfU1RBUlQ7Ci0JcmV0ID0gbGJzX21lc2hfY29uZmlnKHByaXYsIGFjdGlvbiwgcHJpdi0+Y2hhbm5lbCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKIAogCWlmIChlbmFibGUpCiAJCWxic19hZGRfbWVzaChwcml2KTsKQEAgLTE5OSw1ODIgKzMwOSwxMSBAQAogCU5VTEwsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsYnNfbWVzaF9hdHRyX2dyb3VwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbGJzX21lc2hfYXR0cl9ncm91cCA9IHsKIAkuYXR0cnMgPSBsYnNfbWVzaF9zeXNmc19lbnRyaWVzLAogfTsKIAogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluaXRpYWxpemluZyBhbmQgc3RhcnRpbmcsIHN0b3BwaW5nIG1lc2gKLSAqLwotCi0vKgotICogQ2hlY2sgbWVzaCBGVyB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZWx5IHNlbmQgdGhlIG1lc2ggc3RhcnQKLSAqIGNvbW1hbmQKLSAqLwotaW50IGxic19pbml0X21lc2goc3RydWN0IGxic19wcml2YXRlICpwcml2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7Ci0JaW50IHJldCA9IDA7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfTUVTSCk7Ci0KLQlwcml2LT5tZXNoX2Nvbm5lY3Rfc3RhdHVzID0gTEJTX0RJU0NPTk5FQ1RFRDsKLQotCS8qIERldGVybWluZSBtZXNoX2Z3X3ZlciBmcm9tIGZ3cmVsZWFzZSBhbmQgZndjYXBpbmZvICovCi0JLyogNS4wLjE2cDAgOS4wLjAucDAgaXMga25vd24gdG8gTk9UIHN1cHBvcnQgYW55IG1lc2ggKi8KLQkvKiA1LjExMC4yMiBoYXZlIG1lc2ggY29tbWFuZCB3aXRoIDB4YTMgY29tbWFuZCBpZCAqLwotCS8qIDEwLjAuMC5wMCBGVyBicmluZ3MgaW4gbWVzaCBjb25maWcgY29tbWFuZCB3aXRoIGRpZmZlcmVudCBpZCAqLwotCS8qIENoZWNrIEZXIHZlcnNpb24gTVNCIGFuZCBpbml0aWFsaXplIG1lc2hfZndfdmVyICovCi0JaWYgKE1SVkxfRldfTUFKT1JfUkVWKHByaXYtPmZ3cmVsZWFzZSkgPT0gTVJWTF9GV19WNSkgewotCQkvKiBFbmFibGUgbWVzaCwgaWYgc3VwcG9ydGVkLCBhbmQgd29yayBvdXQgd2hpY2ggVExWIGl0IHVzZXMuCi0JCSAgIDB4MTAwICsgMjkxIGlzIGFuIHVub2ZmaWNpYWwgdmFsdWUgdXNlZCBpbiA1LjExMC4yMC5wWFgKLQkJICAgMHgxMDAgKyAzNyBpcyB0aGUgb2ZmaWNpYWwgdmFsdWUgdXNlZCBpbiA1LjExMC4yMS5wWFgKLQkJICAgYnV0IHdlIGNoZWNrIHRoZW0gaW4gdGhhdCBvcmRlciBiZWNhdXNlIDIwLnBYWCBkb2Vzbid0Ci0JCSAgIGdpdmUgYW4gZXJyb3IgLS0gaXQganVzdCBzaWxlbnRseSBmYWlscy4gKi8KLQotCQkvKiA1LjExMC4yMC5wWFggZmlybXdhcmUgd2lsbCBmYWlsIHRoZSBjb21tYW5kIGlmIHRoZSBjaGFubmVsCi0JCSAgIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4aXN0aW5nIGNoYW5uZWwuIEJ1dCBvbmx5IGlmIHRoZSBUTFYKLQkJICAgaXMgY29ycmVjdC4gSWYgdGhlIGNoYW5uZWwgaXMgd3JvbmcsIF9CT1RIXyB2ZXJzaW9ucyB3aWxsCi0JCSAgIGdpdmUgYW4gZXJyb3IgdG8gMHgxMDArMjkxLCBhbmQgYWxsb3cgMHgxMDArMzcgdG8gc3VjY2VlZC4KLQkJICAgSXQncyBqdXN0IHRoYXQgNS4xMTAuMjAucFhYIHdpbGwgbm90IGhhdmUgZG9uZSBhbnl0aGluZwotCQkgICB1c2VmdWwgKi8KLQotCQlwcml2LT5tZXNoX3RsdiA9IFRMVl9UWVBFX09MRF9NRVNIX0lEOwotCQlpZiAobGJzX21lc2hfY29uZmlnKHByaXYsIENNRF9BQ1RfTUVTSF9DT05GSUdfU1RBUlQsCi0JCQkJICAgIHByaXYtPmNoYW5uZWwpKSB7Ci0JCQlwcml2LT5tZXNoX3RsdiA9IFRMVl9UWVBFX01FU0hfSUQ7Ci0JCQlpZiAobGJzX21lc2hfY29uZmlnKHByaXYsIENNRF9BQ1RfTUVTSF9DT05GSUdfU1RBUlQsCi0JCQkJCSAgICBwcml2LT5jaGFubmVsKSkKLQkJCQlwcml2LT5tZXNoX3RsdiA9IDA7Ci0JCX0KLQl9IGVsc2UKLQlpZiAoKE1SVkxfRldfTUFKT1JfUkVWKHByaXYtPmZ3cmVsZWFzZSkgPj0gTVJWTF9GV19WMTApICYmCi0JCShwcml2LT5md2NhcGluZm8gJiBNRVNIX0NBUElORk9fRU5BQkxFX01BU0spKSB7Ci0JCS8qIDEwLjAuMC5wWFggbmV3IGZpcm13YXJlcyBzaG91bGQgc3VjY2VlZCB3aXRoIFRMVgotCQkgKiAweDEwMCszNzsgRG8gbm90IGludm9rZSBjb21tYW5kIHdpdGggb2xkIFRMVi4KLQkJICovCi0JCXByaXYtPm1lc2hfdGx2ID0gVExWX1RZUEVfTUVTSF9JRDsKLQkJaWYgKGxic19tZXNoX2NvbmZpZyhwcml2LCBDTURfQUNUX01FU0hfQ09ORklHX1NUQVJULAotCQkJCSAgICBwcml2LT5jaGFubmVsKSkKLQkJCXByaXYtPm1lc2hfdGx2ID0gMDsKLQl9Ci0KLQotCWlmIChwcml2LT5tZXNoX3RsdikgewotCQlzcHJpbnRmKHByaXYtPm1lc2hfc3NpZCwgIm1lc2giKTsKLQkJcHJpdi0+bWVzaF9zc2lkX2xlbiA9IDQ7Ci0KLQkJbGJzX2FkZF9tZXNoKHByaXYpOwotCi0JCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfbGJzX21lc2gpKQotCQkJbmV0ZGV2X2VycihkZXYsICJjYW5ub3QgcmVnaXN0ZXIgbGJzX21lc2ggYXR0cmlidXRlXG4iKTsKLQotCQlyZXQgPSAxOwotCX0KLQotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX01FU0gsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotaW50IGxic19kZWluaXRfbWVzaChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmRldjsKLQlpbnQgcmV0ID0gMDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9NRVNIKTsKLQotCWlmIChwcml2LT5tZXNoX3RsdikgewotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfbGJzX21lc2gpOwotCQlyZXQgPSAxOwotCX0KLQotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX01FU0gsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoqCi0gKiBsYnNfbWVzaF9zdG9wIC0gY2xvc2UgdGhlIG1zaFggaW50ZXJmYWNlCi0gKgotICogQGRldjoJQSBwb2ludGVyIHRvICZuZXRfZGV2aWNlIHN0cnVjdHVyZQotICogcmV0dXJuczoJMAotICovCi1zdGF0aWMgaW50IGxic19tZXNoX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfTUVTSCk7Ci0Jc3Bpbl9sb2NrX2lycSgmcHJpdi0+ZHJpdmVyX2xvY2spOwotCi0JcHJpdi0+bWVzaF9vcGVuID0gMDsKLQlwcml2LT5tZXNoX2Nvbm5lY3Rfc3RhdHVzID0gTEJTX0RJU0NPTk5FQ1RFRDsKLQotCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5kcml2ZXJfbG9jayk7Ci0KLQlzY2hlZHVsZV93b3JrKCZwcml2LT5tY2FzdF93b3JrKTsKLQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9NRVNIKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBsYnNfbWVzaF9kZXZfb3BlbiAtIG9wZW4gdGhlIG1zaFggaW50ZXJmYWNlCi0gKgotICogQGRldjoJQSBwb2ludGVyIHRvICZuZXRfZGV2aWNlIHN0cnVjdHVyZQotICogcmV0dXJuczoJMCBvciAtRUJVU1kgaWYgbW9uaXRvciBtb2RlIGFjdGl2ZQotICovCi1zdGF0aWMgaW50IGxic19tZXNoX2Rldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwotCWludCByZXQgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX05FVCk7Ci0KLQlzcGluX2xvY2tfaXJxKCZwcml2LT5kcml2ZXJfbG9jayk7Ci0KLQlpZiAocHJpdi0+d2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwcml2LT5tZXNoX29wZW4gPSAxOwotCXByaXYtPm1lc2hfY29ubmVjdF9zdGF0dXMgPSBMQlNfQ09OTkVDVEVEOwotCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKLQotCWlmICghcHJpdi0+dHhfcGVuZGluZ19sZW4pCi0JCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLSBvdXQ6Ci0KLQlzcGluX3VubG9ja19pcnEoJnByaXYtPmRyaXZlcl9sb2NrKTsKLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9ORVQsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbWVzaF9uZXRkZXZfb3BzID0gewotCS5uZG9fb3BlbgkJPSBsYnNfbWVzaF9kZXZfb3BlbiwKLQkubmRvX3N0b3AgCQk9IGxic19tZXNoX3N0b3AsCi0JLm5kb19zdGFydF94bWl0CQk9IGxic19oYXJkX3N0YXJ0X3htaXQsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBsYnNfc2V0X21hY19hZGRyZXNzLAotCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gbGJzX3NldF9tdWx0aWNhc3RfbGlzdCwKLX07Ci0KLS8qKgotICogbGJzX2FkZF9tZXNoIC0gYWRkIG1zaFggaW50ZXJmYWNlCi0gKgotICogQHByaXY6CUEgcG9pbnRlciB0byB0aGUgJnN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqIHJldHVybnM6CTAgaWYgc3VjY2Vzc2Z1bCwgLVggb3RoZXJ3aXNlCi0gKi8KLWludCBsYnNfYWRkX21lc2goc3RydWN0IGxic19wcml2YXRlICpwcml2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICptZXNoX2RldiA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfTUVTSCk7Ci0KLQkvKiBBbGxvY2F0ZSBhIHZpcnR1YWwgbWVzaCBkZXZpY2UgKi8KLQltZXNoX2RldiA9IGFsbG9jX25ldGRldigwLCAibXNoJWQiLCBldGhlcl9zZXR1cCk7Ci0JaWYgKCFtZXNoX2RldikgewotCQlsYnNfZGViX21lc2goImluaXQgbXNoWCBkZXZpY2UgZmFpbGVkXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQltZXNoX2Rldi0+bWxfcHJpdiA9IHByaXY7Ci0JcHJpdi0+bWVzaF9kZXYgPSBtZXNoX2RldjsKLQotCW1lc2hfZGV2LT5uZXRkZXZfb3BzID0gJm1lc2hfbmV0ZGV2X29wczsKLQltZXNoX2Rldi0+ZXRodG9vbF9vcHMgPSAmbGJzX2V0aHRvb2xfb3BzOwotCW1lbWNweShtZXNoX2Rldi0+ZGV2X2FkZHIsIHByaXYtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQotCVNFVF9ORVRERVZfREVWKHByaXYtPm1lc2hfZGV2LCBwcml2LT5kZXYtPmRldi5wYXJlbnQpOwotCi0JbWVzaF9kZXYtPmZsYWdzIHw9IElGRl9CUk9BRENBU1QgfCBJRkZfTVVMVElDQVNUOwotCS8qIFJlZ2lzdGVyIHZpcnR1YWwgbWVzaCBpbnRlcmZhY2UgKi8KLQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobWVzaF9kZXYpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgbXNoWCB2aXJ0dWFsIGludGVyZmFjZVxuIik7Ci0JCWdvdG8gZXJyX2ZyZWU7Ci0JfQotCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCYobWVzaF9kZXYtPmRldi5rb2JqKSwgJmxic19tZXNoX2F0dHJfZ3JvdXApOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3VucmVnaXN0ZXI7Ci0KLQlsYnNfcGVyc2lzdF9jb25maWdfaW5pdChtZXNoX2Rldik7Ci0KLQkvKiBFdmVyeXRoaW5nIHN1Y2Nlc3NmdWwgKi8KLQlyZXQgPSAwOwotCWdvdG8gZG9uZTsKLQotZXJyX3VucmVnaXN0ZXI6Ci0JdW5yZWdpc3Rlcl9uZXRkZXYobWVzaF9kZXYpOwotCi1lcnJfZnJlZToKLQlmcmVlX25ldGRldihtZXNoX2Rldik7Ci0KLWRvbmU6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfTUVTSCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBsYnNfcmVtb3ZlX21lc2goc3RydWN0IGxic19wcml2YXRlICpwcml2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICptZXNoX2RldjsKLQotCW1lc2hfZGV2ID0gcHJpdi0+bWVzaF9kZXY7Ci0JaWYgKCFtZXNoX2RldikKLQkJcmV0dXJuOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX01FU0gpOwotCW5ldGlmX3N0b3BfcXVldWUobWVzaF9kZXYpOwotCW5ldGlmX2NhcnJpZXJfb2ZmKG1lc2hfZGV2KTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJihtZXNoX2Rldi0+ZGV2LmtvYmopLCAmbGJzX21lc2hfYXR0cl9ncm91cCk7Ci0JbGJzX3BlcnNpc3RfY29uZmlnX3JlbW92ZShtZXNoX2Rldik7Ci0JdW5yZWdpc3Rlcl9uZXRkZXYobWVzaF9kZXYpOwotCXByaXYtPm1lc2hfZGV2ID0gTlVMTDsKLQlmcmVlX25ldGRldihtZXNoX2Rldik7Ci0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX01FU0gpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2VuZGluZyBhbmQgcmVjZWl2aW5nCi0gKi8KLXN0cnVjdCBuZXRfZGV2aWNlICpsYnNfbWVzaF9zZXRfZGV2KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnhwZCAqcnhwZCkKLXsKLQlpZiAocHJpdi0+bWVzaF9kZXYpIHsKLQkJaWYgKHByaXYtPm1lc2hfdGx2ID09IFRMVl9UWVBFX09MRF9NRVNIX0lEKSB7Ci0JCQlpZiAocnhwZC0+cnhfY29udHJvbCAmIFJ4UERfTUVTSF9GUkFNRSkKLQkJCQlkZXYgPSBwcml2LT5tZXNoX2RldjsKLQkJfSBlbHNlIGlmIChwcml2LT5tZXNoX3RsdiA9PSBUTFZfVFlQRV9NRVNIX0lEKSB7Ci0JCQlpZiAocnhwZC0+dS5ic3MuYnNzX251bSA9PSBNRVNIX0lGQUNFX0lEKQotCQkJCWRldiA9IHByaXYtPm1lc2hfZGV2OwotCQl9Ci0JfQotCXJldHVybiBkZXY7Ci19Ci0KLQotdm9pZCBsYnNfbWVzaF9zZXRfdHhwZChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHR4cGQgKnR4cGQpCi17Ci0JaWYgKGRldiA9PSBwcml2LT5tZXNoX2RldikgewotCQlpZiAocHJpdi0+bWVzaF90bHYgPT0gVExWX1RZUEVfT0xEX01FU0hfSUQpCi0JCQl0eHBkLT50eF9jb250cm9sIHw9IGNwdV90b19sZTMyKFR4UERfTUVTSF9GUkFNRSk7Ci0JCWVsc2UgaWYgKHByaXYtPm1lc2hfdGx2ID09IFRMVl9UWVBFX01FU0hfSUQpCi0JCQl0eHBkLT51LmJzcy5ic3NfbnVtID0gTUVTSF9JRkFDRV9JRDsKLQl9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTWVzaCBjb21tYW5kIGhhbmRsaW5nCi0gKi8KLQotLyoqCi0gKiBsYnNfbWVzaF9idF9hZGRfZGVsIC0gQWRkIG9yIGRlbGV0ZSBNZXNoIEJsaW5kaW5nIFRhYmxlIGVudHJpZXMKLSAqCi0gKiBAcHJpdjoJQSBwb2ludGVyIHRvICZzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCi0gKiBAYWRkOglUUlVFIHRvIGFkZCB0aGUgZW50cnksIEZBTFNFIHRvIGRlbGV0ZSBpdAotICogQGFkZHIxOglEZXN0aW5hdGlvbiBhZGRyZXNzIHRvIGJsaW5kIG9yIHVuYmxpbmQKLSAqCi0gKiByZXR1cm5zOgkwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUKLSAqLwotaW50IGxic19tZXNoX2J0X2FkZF9kZWwoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBib29sIGFkZCwgdTggKmFkZHIxKQotewotCXN0cnVjdCBjbWRfZHNfYnRfYWNjZXNzIGNtZDsKLQlpbnQgcmV0ID0gMDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCi0JQlVHX09OKGFkZHIxID09IE5VTEwpOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7Ci0JbWVtY3B5KGNtZC5hZGRyMSwgYWRkcjEsIEVUSF9BTEVOKTsKLQlpZiAoYWRkKSB7Ci0JCWNtZC5hY3Rpb24gPSBjcHVfdG9fbGUxNihDTURfQUNUX0JUX0FDQ0VTU19BREQpOwotCQlsYnNfZGViX2hleChMQlNfREVCX01FU0gsICJCVF9BREQ6IGJsaW5kZWQgTUFDIGFkZHIiLAotCQkJYWRkcjEsIEVUSF9BTEVOKTsKLQl9IGVsc2UgewotCQljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9CVF9BQ0NFU1NfREVMKTsKLQkJbGJzX2RlYl9oZXgoTEJTX0RFQl9NRVNILCAiQlRfREVMOiBibGluZGVkIE1BQyBhZGRyIiwKLQkJCWFkZHIxLCBFVEhfQUxFTik7Ci0JfQotCi0JcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF9CVF9BQ0NFU1MsICZjbWQpOwotCi0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ01ELCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGxic19tZXNoX2J0X3Jlc2V0IC0gUmVzZXQvY2xlYXIgdGhlIG1lc2ggYmxpbmRpbmcgdGFibGUKLSAqCi0gKiBAcHJpdjoJQSBwb2ludGVyIHRvICZzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCi0gKgotICogcmV0dXJuczoJMCBvbiBzdWNjZXNzLCBlcnJvciBvbiBmYWlsdXJlCi0gKi8KLWludCBsYnNfbWVzaF9idF9yZXNldChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCi17Ci0Jc3RydWN0IGNtZF9kc19idF9hY2Nlc3MgY21kOwotCWludCByZXQgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKLQljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9CVF9BQ0NFU1NfUkVTRVQpOwotCi0JcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF9CVF9BQ0NFU1MsICZjbWQpOwotCi0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQ01ELCAicmV0ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGxic19tZXNoX2J0X2dldF9pbnZlcnRlZCAtIEdldHMgdGhlIGludmVydGVkIHN0YXR1cyBvZiB0aGUgbWVzaAotICogYmxpbmRpbmcgdGFibGUKLSAqCi0gKiBOb3JtYWxseSB0aGUgZmlybXdhcmUgImJsaW5kcyIgb3IgaWdub3JlcyB0cmFmZmljIGZyb20gbWVzaCBub2RlcyBpbiB0aGUKLSAqIHRhYmxlLCBidXQgYW4gaW52ZXJ0ZWQgdGFibGUgYWxsb3dzICpvbmx5KiB0cmFmZmljIGZyb20gbm9kZXMgbGlzdGVkIGluCi0gKiB0aGUgdGFibGUuCi0gKgotICogQHByaXY6CUEgcG9pbnRlciB0byAmc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQotICogQGludmVydGVkOiAgCU9uIHN1Y2Nlc3MsIFRSVUUgaWYgdGhlIGJsaW5kaW5nIHRhYmxlIGlzIGludmVydGVkLAotICoJCUZBTFNFIGlmIGl0IGlzIG5vdCBpbnZlcnRlZAotICoKLSAqIHJldHVybnM6CTAgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZQotICovCi1pbnQgbGJzX21lc2hfYnRfZ2V0X2ludmVydGVkKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgYm9vbCAqaW52ZXJ0ZWQpCi17Ci0Jc3RydWN0IGNtZF9kc19idF9hY2Nlc3MgY21kOwotCWludCByZXQgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7Ci0KLQlCVUdfT04oaW52ZXJ0ZWQgPT0gTlVMTCk7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKLQljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9CVF9BQ0NFU1NfR0VUX0lOVkVSVCk7Ci0KLQlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EX0JUX0FDQ0VTUywgJmNtZCk7Ci0JaWYgKHJldCA9PSAwKQotCQkqaW52ZXJ0ZWQgPSAhIWNtZC5pZDsKLQotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NNRCwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBsYnNfbWVzaF9idF9zZXRfaW52ZXJ0ZWQgLSBTZXRzIHRoZSBpbnZlcnRlZCBzdGF0dXMgb2YgdGhlIG1lc2gKLSAqIGJsaW5kaW5nIHRhYmxlCi0gKgotICogTm9ybWFsbHkgdGhlIGZpcm13YXJlICJibGluZHMiIG9yIGlnbm9yZXMgdHJhZmZpYyBmcm9tIG1lc2ggbm9kZXMgaW4gdGhlCi0gKiB0YWJsZSwgYnV0IGFuIGludmVydGVkIHRhYmxlIGFsbG93cyAqb25seSogdHJhZmZpYyBmcm9tIG5vZGVzIGxpc3RlZCBpbgotICogdGhlIHRhYmxlLgotICoKLSAqIEBwcml2OglBIHBvaW50ZXIgdG8gJnN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqIEBpbnZlcnRlZDoJVFJVRSB0byBpbnZlcnQgdGhlIGJsaW5kaW5nIHRhYmxlIChvbmx5IHRyYWZmaWMgZnJvbQotICoJCWxpc3RlZCBub2RlcyBhbGxvd2VkKSwgRkFMU0UgdG8gcmV0dXJuIGl0Ci0gKgkJdG8gbm9ybWFsIHN0YXRlIChsaXN0ZWQgbm9kZXMgaWdub3JlZCkKLSAqCi0gKiByZXR1cm5zOgkwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUKLSAqLwotaW50IGxic19tZXNoX2J0X3NldF9pbnZlcnRlZChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIGJvb2wgaW52ZXJ0ZWQpCi17Ci0Jc3RydWN0IGNtZF9kc19idF9hY2Nlc3MgY21kOwotCWludCByZXQgPSAwOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKLQljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9CVF9BQ0NFU1NfU0VUX0lOVkVSVCk7Ci0JY21kLmlkID0gY3B1X3RvX2xlMzIoISFpbnZlcnRlZCk7Ci0KLQlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EX0JUX0FDQ0VTUywgJmNtZCk7Ci0KLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9DTUQsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogbGJzX21lc2hfYnRfZ2V0X2VudHJ5IC0gTGlzdCBhbiBlbnRyeSBpbiB0aGUgbWVzaCBibGluZGluZyB0YWJsZQotICoKLSAqIEBwcml2OglBIHBvaW50ZXIgdG8gJnN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqIEBpZDoJCVRoZSBJRCBvZiB0aGUgZW50cnkgdG8gbGlzdAotICogQGFkZHIxOglNQUMgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhYmxlIGVudHJ5Ci0gKgotICogcmV0dXJuczogCSAgIAkwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUKLSAqLwotaW50IGxic19tZXNoX2J0X2dldF9lbnRyeShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHUzMiBpZCwgdTggKmFkZHIxKQotewotCXN0cnVjdCBjbWRfZHNfYnRfYWNjZXNzIGNtZDsKLQlpbnQgcmV0ID0gMDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCi0JQlVHX09OKGFkZHIxID09IE5VTEwpOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7Ci0JY21kLmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9BQ1RfQlRfQUNDRVNTX1NFVF9JTlZFUlQpOwotCWNtZC5pZCA9IGNwdV90b19sZTMyKGlkKTsKLQotCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfQlRfQUNDRVNTLCAmY21kKTsKLQlpZiAocmV0ID09IDApCi0JCW1lbWNweShhZGRyMSwgY21kLmFkZHIxLCBzaXplb2YoY21kLmFkZHIxKSk7Ci0KLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9DTUQsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogbGJzX2NtZF9md3RfYWNjZXNzIC0gQWNjZXNzIHRoZSBtZXNoIGZvcndhcmRpbmcgdGFibGUKLSAqCi0gKiBAcHJpdjoJQSBwb2ludGVyIHRvICZzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCi0gKiBAY21kX2FjdGlvbjoJVGhlIGZvcndhcmRpbmcgdGFibGUgYWN0aW9uIHRvIHBlcmZvcm0KLSAqIEBjbWQ6CVRoZSBwcmUtZmlsbGVkIEZXVF9BQ0NFU1MgY29tbWFuZAotICoKLSAqIHJldHVybnM6CTAgb24gc3VjY2VzcyBhbmQgJ2NtZCcgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUKLSAqCQlmaXJtd2FyZSdzIHJlc3BvbnNlCi0gKi8KLWludCBsYnNfY21kX2Z3dF9hY2Nlc3Moc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1MTYgY21kX2FjdGlvbiwKLQkJCXN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyAqY21kKQotewotCWludCByZXQ7Ci0KLQlsYnNfZGViX2VudGVyX2FyZ3MoTEJTX0RFQl9DTUQsICJhY3Rpb24gJWQiLCBjbWRfYWN0aW9uKTsKLQotCWNtZC0+aGRyLmNvbW1hbmQgPSBjcHVfdG9fbGUxNihDTURfRldUX0FDQ0VTUyk7Ci0JY21kLT5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MpKTsKLQljbWQtPmhkci5yZXN1bHQgPSAwOwotCWNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7Ci0KLQlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EX0ZXVF9BQ0NFU1MsIGNtZCk7Ci0KLQlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9DTUQsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiAwOwotfQotCi1pbnQgbGJzX21lc2hfYWNjZXNzKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdWludDE2X3QgY21kX2FjdGlvbiwKLQkJICAgIHN0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3MgKmNtZCkKLXsKLQlpbnQgcmV0OwotCi0JbGJzX2RlYl9lbnRlcl9hcmdzKExCU19ERUJfQ01ELCAiYWN0aW9uICVkIiwgY21kX2FjdGlvbik7Ci0KLQljbWQtPmhkci5jb21tYW5kID0gY3B1X3RvX2xlMTYoQ01EX01FU0hfQUNDRVNTKTsKLQljbWQtPmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpjbWQpKTsKLQljbWQtPmhkci5yZXN1bHQgPSAwOwotCi0JY21kLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKLQotCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfTUVTSF9BQ0NFU1MsIGNtZCk7Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfQ01EKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fbGJzX21lc2hfY29uZmlnX3NlbmQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCQkJCSAgc3RydWN0IGNtZF9kc19tZXNoX2NvbmZpZyAqY21kLAotCQkJCSAgdWludDE2X3QgYWN0aW9uLCB1aW50MTZfdCB0eXBlKQotewotCWludCByZXQ7Ci0JdTE2IGNvbW1hbmQgPSBDTURfTUVTSF9DT05GSUdfT0xEOwotCi0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7Ci0KLQkvKgotCSAqIENvbW1hbmQgaWQgaXMgMHhhYyBmb3IgdjEwIEZXIGFsb25nIHdpdGggbWVzaCBpbnRlcmZhY2UKLQkgKiBpZCBpbiBiaXRzIDE0LTEzLTEyLgotCSAqLwotCWlmIChwcml2LT5tZXNoX3RsdiA9PSBUTFZfVFlQRV9NRVNIX0lEKQotCQljb21tYW5kID0gQ01EX01FU0hfQ09ORklHIHwKLQkJCSAgKE1FU0hfSUZBQ0VfSUQgPDwgTUVTSF9JRkFDRV9CSVRfT0ZGU0VUKTsKLQotCWNtZC0+aGRyLmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjb21tYW5kKTsKLQljbWQtPmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfbWVzaF9jb25maWcpKTsKLQljbWQtPmhkci5yZXN1bHQgPSAwOwotCi0JY21kLT50eXBlID0gY3B1X3RvX2xlMTYodHlwZSk7Ci0JY21kLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihhY3Rpb24pOwotCi0JcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIGNvbW1hbmQsIGNtZCk7Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfQ01EKTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgbGJzX21lc2hfY29uZmlnX3NlbmQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCQkJIHN0cnVjdCBjbWRfZHNfbWVzaF9jb25maWcgKmNtZCwKLQkJCSB1aW50MTZfdCBhY3Rpb24sIHVpbnQxNl90IHR5cGUpCi17Ci0JaW50IHJldDsKLQotCWlmICghKHByaXYtPmZ3Y2FwaW5mbyAmIEZXX0NBUElORk9fUEVSU0lTVEVOVF9DT05GSUcpKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlyZXQgPSBfX2xic19tZXNoX2NvbmZpZ19zZW5kKHByaXYsIGNtZCwgYWN0aW9uLCB0eXBlKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBDTURfTUVTSF9DT05GSUcgbGVnYWN5IGZ1bmN0aW9uLiAgSXQgb25seSBoYW5kbGVzIHRoZQotICogU1RBUlQgYW5kIFNUT1AgYWN0aW9ucy4gIFRoZSBleHRlbmRlZCBhY3Rpb25zIHN1cHBvcnRlZCBieSBDTURfTUVTSF9DT05GSUcKLSAqIGFyZSBhbGwgaGFuZGxlZCBieSBwcmVwYXJpbmcgYSBzdHJ1Y3QgY21kX2RzX21lc2hfY29uZmlnIGFuZCBwYXNzaW5nIGl0IHRvCi0gKiBsYnNfbWVzaF9jb25maWdfc2VuZC4KLSAqLwotaW50IGxic19tZXNoX2NvbmZpZyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVpbnQxNl90IGFjdGlvbiwgdWludDE2X3QgY2hhbikKLXsKLQlzdHJ1Y3QgY21kX2RzX21lc2hfY29uZmlnIGNtZDsKLQlzdHJ1Y3QgbXJ2bF9tZXNoaWUgKmllOwotCURFQ0xBUkVfU1NJRF9CVUYoc3NpZCk7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hhbik7Ci0JaWUgPSAoc3RydWN0IG1ydmxfbWVzaGllICopY21kLmRhdGE7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ01EX0FDVF9NRVNIX0NPTkZJR19TVEFSVDoKLQkJaWUtPmlkID0gV0xBTl9FSURfR0VORVJJQzsKLQkJaWUtPnZhbC5vdWlbMF0gPSAweDAwOwotCQlpZS0+dmFsLm91aVsxXSA9IDB4NTA7Ci0JCWllLT52YWwub3VpWzJdID0gMHg0MzsKLQkJaWUtPnZhbC50eXBlID0gTUFSVkVMTF9NRVNIX0lFX1RZUEU7Ci0JCWllLT52YWwuc3VidHlwZSA9IE1BUlZFTExfTUVTSF9JRV9TVUJUWVBFOwotCQlpZS0+dmFsLnZlcnNpb24gPSBNQVJWRUxMX01FU0hfSUVfVkVSU0lPTjsKLQkJaWUtPnZhbC5hY3RpdmVfcHJvdG9jb2xfaWQgPSBNQVJWRUxMX01FU0hfUFJPVE9fSURfSFdNUDsKLQkJaWUtPnZhbC5hY3RpdmVfbWV0cmljX2lkID0gTUFSVkVMTF9NRVNIX01FVFJJQ19JRDsKLQkJaWUtPnZhbC5tZXNoX2NhcGFiaWxpdHkgPSBNQVJWRUxMX01FU0hfQ0FQQUJJTElUWTsKLQkJaWUtPnZhbC5tZXNoX2lkX2xlbiA9IHByaXYtPm1lc2hfc3NpZF9sZW47Ci0JCW1lbWNweShpZS0+dmFsLm1lc2hfaWQsIHByaXYtPm1lc2hfc3NpZCwgcHJpdi0+bWVzaF9zc2lkX2xlbik7Ci0JCWllLT5sZW4gPSBzaXplb2Yoc3RydWN0IG1ydmxfbWVzaGllX3ZhbCkgLQotCQkJSUVFRTgwMjExX01BWF9TU0lEX0xFTiArIHByaXYtPm1lc2hfc3NpZF9sZW47Ci0JCWNtZC5sZW5ndGggPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IG1ydmxfbWVzaGllX3ZhbCkpOwotCQlicmVhazsKLQljYXNlIENNRF9BQ1RfTUVTSF9DT05GSUdfU1RPUDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLQlsYnNfZGViX2NtZCgibWVzaCBjb25maWcgYWN0aW9uICVkIHR5cGUgJXggY2hhbm5lbCAlZCBTU0lEICVzXG4iLAotCQkgICAgYWN0aW9uLCBwcml2LT5tZXNoX3RsdiwgY2hhbiwKLQkJICAgIHByaW50X3NzaWQoc3NpZCwgcHJpdi0+bWVzaF9zc2lkLCBwcml2LT5tZXNoX3NzaWRfbGVuKSk7Ci0KLQlyZXR1cm4gX19sYnNfbWVzaF9jb25maWdfc2VuZChwcml2LCAmY21kLCBhY3Rpb24sIHByaXYtPm1lc2hfdGx2KTsKLX0KLQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFBlcnNpc3RlbnQgY29uZmlndXJhdGlvbiBzdXBwb3J0CiAgKi8KQEAgLTEyMzEsNyArNzcwLDcgQEAKIAlOVUxMCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBib290X29wdHNfZ3JvdXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBib290X29wdHNfZ3JvdXAgPSB7CiAJLm5hbWUgPSAiYm9vdF9vcHRpb25zIiwKIAkuYXR0cnMgPSBib290X29wdHNfYXR0cnMsCiB9OwpAQCAtMTI0NCwzMSArNzgzLDI5OSBAQAogCU5VTEwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1lc2hfaWVfZ3JvdXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtZXNoX2llX2dyb3VwID0gewogCS5uYW1lID0gIm1lc2hfaWUiLAogCS5hdHRycyA9IG1lc2hfaWVfYXR0cnMsCiB9OwogCi12b2lkIGxic19wZXJzaXN0X2NvbmZpZ19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBsYnNfcGVyc2lzdF9jb25maWdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCByZXQ7CiAJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCYoZGV2LT5kZXYua29iaiksICZib290X29wdHNfZ3JvdXApOwogCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmKGRldi0+ZGV2LmtvYmopLCAmbWVzaF9pZV9ncm91cCk7CiB9CiAKLXZvaWQgbGJzX3BlcnNpc3RfY29uZmlnX3JlbW92ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbGJzX3BlcnNpc3RfY29uZmlnX3JlbW92ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN5c2ZzX3JlbW92ZV9ncm91cCgmKGRldi0+ZGV2LmtvYmopLCAmYm9vdF9vcHRzX2dyb3VwKTsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJihkZXYtPmRldi5rb2JqKSwgJm1lc2hfaWVfZ3JvdXApOwogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRpYWxpemluZyBhbmQgc3RhcnRpbmcsIHN0b3BwaW5nIG1lc2gKKyAqLworCisvKgorICogQ2hlY2sgbWVzaCBGVyB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZWx5IHNlbmQgdGhlIG1lc2ggc3RhcnQKKyAqIGNvbW1hbmQKKyAqLworaW50IGxic19pbml0X21lc2goc3RydWN0IGxic19wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CisJaW50IHJldCA9IDA7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfTUVTSCk7CisKKwkvKiBEZXRlcm1pbmUgbWVzaF9md192ZXIgZnJvbSBmd3JlbGVhc2UgYW5kIGZ3Y2FwaW5mbyAqLworCS8qIDUuMC4xNnAwIDkuMC4wLnAwIGlzIGtub3duIHRvIE5PVCBzdXBwb3J0IGFueSBtZXNoICovCisJLyogNS4xMTAuMjIgaGF2ZSBtZXNoIGNvbW1hbmQgd2l0aCAweGEzIGNvbW1hbmQgaWQgKi8KKwkvKiAxMC4wLjAucDAgRlcgYnJpbmdzIGluIG1lc2ggY29uZmlnIGNvbW1hbmQgd2l0aCBkaWZmZXJlbnQgaWQgKi8KKwkvKiBDaGVjayBGVyB2ZXJzaW9uIE1TQiBhbmQgaW5pdGlhbGl6ZSBtZXNoX2Z3X3ZlciAqLworCWlmIChNUlZMX0ZXX01BSk9SX1JFVihwcml2LT5md3JlbGVhc2UpID09IE1SVkxfRldfVjUpIHsKKwkJLyogRW5hYmxlIG1lc2gsIGlmIHN1cHBvcnRlZCwgYW5kIHdvcmsgb3V0IHdoaWNoIFRMViBpdCB1c2VzLgorCQkgICAweDEwMCArIDI5MSBpcyBhbiB1bm9mZmljaWFsIHZhbHVlIHVzZWQgaW4gNS4xMTAuMjAucFhYCisJCSAgIDB4MTAwICsgMzcgaXMgdGhlIG9mZmljaWFsIHZhbHVlIHVzZWQgaW4gNS4xMTAuMjEucFhYCisJCSAgIGJ1dCB3ZSBjaGVjayB0aGVtIGluIHRoYXQgb3JkZXIgYmVjYXVzZSAyMC5wWFggZG9lc24ndAorCQkgICBnaXZlIGFuIGVycm9yIC0tIGl0IGp1c3Qgc2lsZW50bHkgZmFpbHMuICovCisKKwkJLyogNS4xMTAuMjAucFhYIGZpcm13YXJlIHdpbGwgZmFpbCB0aGUgY29tbWFuZCBpZiB0aGUgY2hhbm5lbAorCQkgICBkb2Vzbid0IG1hdGNoIHRoZSBleGlzdGluZyBjaGFubmVsLiBCdXQgb25seSBpZiB0aGUgVExWCisJCSAgIGlzIGNvcnJlY3QuIElmIHRoZSBjaGFubmVsIGlzIHdyb25nLCBfQk9USF8gdmVyc2lvbnMgd2lsbAorCQkgICBnaXZlIGFuIGVycm9yIHRvIDB4MTAwKzI5MSwgYW5kIGFsbG93IDB4MTAwKzM3IHRvIHN1Y2NlZWQuCisJCSAgIEl0J3MganVzdCB0aGF0IDUuMTEwLjIwLnBYWCB3aWxsIG5vdCBoYXZlIGRvbmUgYW55dGhpbmcKKwkJICAgdXNlZnVsICovCisKKwkJcHJpdi0+bWVzaF90bHYgPSBUTFZfVFlQRV9PTERfTUVTSF9JRDsKKwkJaWYgKGxic19tZXNoX2NvbmZpZyhwcml2LCBDTURfQUNUX01FU0hfQ09ORklHX1NUQVJULAorCQkJCSAgICBwcml2LT5jaGFubmVsKSkgeworCQkJcHJpdi0+bWVzaF90bHYgPSBUTFZfVFlQRV9NRVNIX0lEOworCQkJaWYgKGxic19tZXNoX2NvbmZpZyhwcml2LCBDTURfQUNUX01FU0hfQ09ORklHX1NUQVJULAorCQkJCQkgICAgcHJpdi0+Y2hhbm5lbCkpCisJCQkJcHJpdi0+bWVzaF90bHYgPSAwOworCQl9CisJfSBlbHNlCisJaWYgKChNUlZMX0ZXX01BSk9SX1JFVihwcml2LT5md3JlbGVhc2UpID49IE1SVkxfRldfVjEwKSAmJgorCQkocHJpdi0+ZndjYXBpbmZvICYgTUVTSF9DQVBJTkZPX0VOQUJMRV9NQVNLKSkgeworCQkvKiAxMC4wLjAucFhYIG5ldyBmaXJtd2FyZXMgc2hvdWxkIHN1Y2NlZWQgd2l0aCBUTFYKKwkJICogMHgxMDArMzc7IERvIG5vdCBpbnZva2UgY29tbWFuZCB3aXRoIG9sZCBUTFYuCisJCSAqLworCQlwcml2LT5tZXNoX3RsdiA9IFRMVl9UWVBFX01FU0hfSUQ7CisJCWlmIChsYnNfbWVzaF9jb25maWcocHJpdiwgQ01EX0FDVF9NRVNIX0NPTkZJR19TVEFSVCwKKwkJCQkgICAgcHJpdi0+Y2hhbm5lbCkpCisJCQlwcml2LT5tZXNoX3RsdiA9IDA7CisJfQorCisJLyogU3RvcCBtZXNoaW5nIHVudGlsIGludGVyZmFjZSBpcyBicm91Z2h0IHVwICovCisJbGJzX21lc2hfY29uZmlnKHByaXYsIENNRF9BQ1RfTUVTSF9DT05GSUdfU1RPUCwgcHJpdi0+Y2hhbm5lbCk7CisKKwlpZiAocHJpdi0+bWVzaF90bHYpIHsKKwkJc3ByaW50Zihwcml2LT5tZXNoX3NzaWQsICJtZXNoIik7CisJCXByaXYtPm1lc2hfc3NpZF9sZW4gPSA0OworCisJCWxic19hZGRfbWVzaChwcml2KTsKKworCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2xic19tZXNoKSkKKwkJCW5ldGRldl9lcnIoZGV2LCAiY2Fubm90IHJlZ2lzdGVyIGxic19tZXNoIGF0dHJpYnV0ZVxuIik7CisKKwkJcmV0ID0gMTsKKwl9CisKKwlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9NRVNILCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBsYnNfZGVpbml0X21lc2goc3RydWN0IGxic19wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CisJaW50IHJldCA9IDA7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfTUVTSCk7CisKKwlpZiAocHJpdi0+bWVzaF90bHYpIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2xic19tZXNoKTsKKwkJcmV0ID0gMTsKKwl9CisKKwlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9NRVNILCAicmV0ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogbGJzX21lc2hfc3RvcCAtIGNsb3NlIHRoZSBtc2hYIGludGVyZmFjZQorICoKKyAqIEBkZXY6CUEgcG9pbnRlciB0byAmbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqIHJldHVybnM6CTAKKyAqLworc3RhdGljIGludCBsYnNfbWVzaF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX01FU0gpOworCWxic19tZXNoX2NvbmZpZyhwcml2LCBDTURfQUNUX01FU0hfQ09ORklHX1NUT1AsIHByaXYtPmNoYW5uZWwpOworCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+ZHJpdmVyX2xvY2spOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmRyaXZlcl9sb2NrKTsKKworCXNjaGVkdWxlX3dvcmsoJnByaXYtPm1jYXN0X3dvcmspOworCisJbGJzX2RlYl9sZWF2ZShMQlNfREVCX01FU0gpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGxic19tZXNoX2Rldl9vcGVuIC0gb3BlbiB0aGUgbXNoWCBpbnRlcmZhY2UKKyAqCisgKiBAZGV2OglBIHBvaW50ZXIgdG8gJm5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiByZXR1cm5zOgkwIG9yIC1FQlVTWSBpZiBtb25pdG9yIG1vZGUgYWN0aXZlCisgKi8KK3N0YXRpYyBpbnQgbGJzX21lc2hfZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7CisJaW50IHJldCA9IDA7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfTkVUKTsKKworCXNwaW5fbG9ja19pcnEoJnByaXYtPmRyaXZlcl9sb2NrKTsKKworCWlmIChwcml2LT53ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikgeworCQlyZXQgPSAtRUJVU1k7CisJCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+ZHJpdmVyX2xvY2spOworCQlnb3RvIG91dDsKKwl9CisKKwluZXRpZl9jYXJyaWVyX29uKGRldik7CisKKwlpZiAoIXByaXYtPnR4X3BlbmRpbmdfbGVuKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmRyaXZlcl9sb2NrKTsKKworCXJldCA9IGxic19tZXNoX2NvbmZpZyhwcml2LCBDTURfQUNUX01FU0hfQ09ORklHX1NUQVJULCBwcml2LT5jaGFubmVsKTsKKworb3V0OgorCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX05FVCwgInJldCAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBtZXNoX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGxic19tZXNoX2Rldl9vcGVuLAorCS5uZG9fc3RvcCAJCT0gbGJzX21lc2hfc3RvcCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gbGJzX2hhcmRfc3RhcnRfeG1pdCwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGxic19zZXRfbWFjX2FkZHJlc3MsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBsYnNfc2V0X211bHRpY2FzdF9saXN0LAorfTsKKworLyoqCisgKiBsYnNfYWRkX21lc2ggLSBhZGQgbXNoWCBpbnRlcmZhY2UKKyAqCisgKiBAcHJpdjoJQSBwb2ludGVyIHRvIHRoZSAmc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQorICogcmV0dXJuczoJMCBpZiBzdWNjZXNzZnVsLCAtWCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBsYnNfYWRkX21lc2goc3RydWN0IGxic19wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICptZXNoX2RldiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfTUVTSCk7CisKKwkvKiBBbGxvY2F0ZSBhIHZpcnR1YWwgbWVzaCBkZXZpY2UgKi8KKwltZXNoX2RldiA9IGFsbG9jX25ldGRldigwLCAibXNoJWQiLCBldGhlcl9zZXR1cCk7CisJaWYgKCFtZXNoX2RldikgeworCQlsYnNfZGViX21lc2goImluaXQgbXNoWCBkZXZpY2UgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKwltZXNoX2Rldi0+bWxfcHJpdiA9IHByaXY7CisJcHJpdi0+bWVzaF9kZXYgPSBtZXNoX2RldjsKKworCW1lc2hfZGV2LT5uZXRkZXZfb3BzID0gJm1lc2hfbmV0ZGV2X29wczsKKwltZXNoX2Rldi0+ZXRodG9vbF9vcHMgPSAmbGJzX2V0aHRvb2xfb3BzOworCW1lbWNweShtZXNoX2Rldi0+ZGV2X2FkZHIsIHByaXYtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCVNFVF9ORVRERVZfREVWKHByaXYtPm1lc2hfZGV2LCBwcml2LT5kZXYtPmRldi5wYXJlbnQpOworCisJbWVzaF9kZXYtPmZsYWdzIHw9IElGRl9CUk9BRENBU1QgfCBJRkZfTVVMVElDQVNUOworCS8qIFJlZ2lzdGVyIHZpcnR1YWwgbWVzaCBpbnRlcmZhY2UgKi8KKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobWVzaF9kZXYpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgbXNoWCB2aXJ0dWFsIGludGVyZmFjZVxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCYobWVzaF9kZXYtPmRldi5rb2JqKSwgJmxic19tZXNoX2F0dHJfZ3JvdXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisKKwlsYnNfcGVyc2lzdF9jb25maWdfaW5pdChtZXNoX2Rldik7CisKKwkvKiBFdmVyeXRoaW5nIHN1Y2Nlc3NmdWwgKi8KKwlyZXQgPSAwOworCWdvdG8gZG9uZTsKKworZXJyX3VucmVnaXN0ZXI6CisJdW5yZWdpc3Rlcl9uZXRkZXYobWVzaF9kZXYpOworCitlcnJfZnJlZToKKwlmcmVlX25ldGRldihtZXNoX2Rldik7CisKK2RvbmU6CisJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfTUVTSCwgInJldCAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBsYnNfcmVtb3ZlX21lc2goc3RydWN0IGxic19wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICptZXNoX2RldjsKKworCW1lc2hfZGV2ID0gcHJpdi0+bWVzaF9kZXY7CisJaWYgKCFtZXNoX2RldikKKwkJcmV0dXJuOworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX01FU0gpOworCW5ldGlmX3N0b3BfcXVldWUobWVzaF9kZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKG1lc2hfZGV2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJihtZXNoX2Rldi0+ZGV2LmtvYmopLCAmbGJzX21lc2hfYXR0cl9ncm91cCk7CisJbGJzX3BlcnNpc3RfY29uZmlnX3JlbW92ZShtZXNoX2Rldik7CisJdW5yZWdpc3Rlcl9uZXRkZXYobWVzaF9kZXYpOworCXByaXYtPm1lc2hfZGV2ID0gTlVMTDsKKwlmcmVlX25ldGRldihtZXNoX2Rldik7CisJbGJzX2RlYl9sZWF2ZShMQlNfREVCX01FU0gpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNlbmRpbmcgYW5kIHJlY2VpdmluZworICovCitzdHJ1Y3QgbmV0X2RldmljZSAqbGJzX21lc2hfc2V0X2RldihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHJ4cGQgKnJ4cGQpCit7CisJaWYgKHByaXYtPm1lc2hfZGV2KSB7CisJCWlmIChwcml2LT5tZXNoX3RsdiA9PSBUTFZfVFlQRV9PTERfTUVTSF9JRCkgeworCQkJaWYgKHJ4cGQtPnJ4X2NvbnRyb2wgJiBSeFBEX01FU0hfRlJBTUUpCisJCQkJZGV2ID0gcHJpdi0+bWVzaF9kZXY7CisJCX0gZWxzZSBpZiAocHJpdi0+bWVzaF90bHYgPT0gVExWX1RZUEVfTUVTSF9JRCkgeworCQkJaWYgKHJ4cGQtPnUuYnNzLmJzc19udW0gPT0gTUVTSF9JRkFDRV9JRCkKKwkJCQlkZXYgPSBwcml2LT5tZXNoX2RldjsKKwkJfQorCX0KKwlyZXR1cm4gZGV2OworfQorCisKK3ZvaWQgbGJzX21lc2hfc2V0X3R4cGQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB0eHBkICp0eHBkKQoreworCWlmIChkZXYgPT0gcHJpdi0+bWVzaF9kZXYpIHsKKwkJaWYgKHByaXYtPm1lc2hfdGx2ID09IFRMVl9UWVBFX09MRF9NRVNIX0lEKQorCQkJdHhwZC0+dHhfY29udHJvbCB8PSBjcHVfdG9fbGUzMihUeFBEX01FU0hfRlJBTUUpOworCQllbHNlIGlmIChwcml2LT5tZXNoX3RsdiA9PSBUTFZfVFlQRV9NRVNIX0lEKQorCQkJdHhwZC0+dS5ic3MuYnNzX251bSA9IE1FU0hfSUZBQ0VfSUQ7CisJfQorfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV0aHRvb2wgcmVsYXRlZAogICovCiAKLXN0YXRpYyBjb25zdCBjaGFyICptZXNoX3N0YXRfc3RyaW5nc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtZXNoX3N0YXRfc3RyaW5nc1tdID0gewogCQkJImRyb3BfZHVwbGljYXRlX2JjYXN0IiwKIAkJCSJkcm9wX3R0bF96ZXJvIiwKIAkJCSJkcm9wX25vX2Z3ZF9yb3V0ZSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tZXNoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tZXNoLmgKaW5kZXggZWU5NWM3My4uNTAxNDQ5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWVzaC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21lc2guaApAQCAtMzEsNyArMzEsNiBAQAogaW50IGxic19pbml0X21lc2goc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKIGludCBsYnNfZGVpbml0X21lc2goc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKIAotaW50IGxic19hZGRfbWVzaChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpOwogdm9pZCBsYnNfcmVtb3ZlX21lc2goc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKIAogCkBAIC01MiwyOSArNTEsNiBAQAogc3RydWN0IGNtZF9kc19tZXNoX2FjY2VzczsKIHN0cnVjdCBjbWRfZHNfbWVzaF9jb25maWc7CiAKLWludCBsYnNfbWVzaF9idF9hZGRfZGVsKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgYm9vbCBhZGQsIHU4ICphZGRyMSk7Ci1pbnQgbGJzX21lc2hfYnRfcmVzZXQoc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKLWludCBsYnNfbWVzaF9idF9nZXRfaW52ZXJ0ZWQoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBib29sICppbnZlcnRlZCk7Ci1pbnQgbGJzX21lc2hfYnRfc2V0X2ludmVydGVkKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgYm9vbCBpbnZlcnRlZCk7Ci1pbnQgbGJzX21lc2hfYnRfZ2V0X2VudHJ5KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTMyIGlkLCB1OCAqYWRkcjEpOwotCi1pbnQgbGJzX2NtZF9md3RfYWNjZXNzKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTE2IGNtZF9hY3Rpb24sCi0JCQlzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgKmNtZCk7Ci0KLWludCBsYnNfbWVzaF9hY2Nlc3Moc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1aW50MTZfdCBjbWRfYWN0aW9uLAotCQkgICAgc3RydWN0IGNtZF9kc19tZXNoX2FjY2VzcyAqY21kKTsKLWludCBsYnNfbWVzaF9jb25maWdfc2VuZChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkgc3RydWN0IGNtZF9kc19tZXNoX2NvbmZpZyAqY21kLAotCQkJIHVpbnQxNl90IGFjdGlvbiwgdWludDE2X3QgdHlwZSk7Ci1pbnQgbGJzX21lc2hfY29uZmlnKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdWludDE2X3QgZW5hYmxlLCB1aW50MTZfdCBjaGFuKTsKLQotCi0KLS8qIFBlcnNpc3RlbnQgY29uZmlndXJhdGlvbiAqLwotCi12b2lkIGxic19wZXJzaXN0X2NvbmZpZ19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpOwotdm9pZCBsYnNfcGVyc2lzdF9jb25maWdfcmVtb3ZlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpOwotCiAKIC8qIEV0aHRvb2wgc3RhdGlzdGljcyAqLwogCkBAIC04NywxMSArNjMsNiBAQAogCXVpbnQzMl90IHN0cmluZ3NldCwgdWludDhfdCAqcyk7CiAKIAotLyogQWNjZXNzb3JzICovCi0KLSNkZWZpbmUgbGJzX21lc2hfb3Blbihwcml2KSAocHJpdi0+bWVzaF9vcGVuKQotI2RlZmluZSBsYnNfbWVzaF9jb25uZWN0ZWQocHJpdikgKHByaXYtPm1lc2hfY29ubmVjdF9zdGF0dXMgPT0gTEJTX0NPTk5FQ1RFRCkKLQogI2Vsc2UKIAogI2RlZmluZSBsYnNfaW5pdF9tZXNoKHByaXYpCkBAIC0xMDEsOCArNzIsNiBAQAogI2RlZmluZSBsYnNfbWVzaF9zZXRfZGV2KHByaXYsIGRldiwgcnhwZCkgKGRldikKICNkZWZpbmUgbGJzX21lc2hfc2V0X3R4cGQocHJpdiwgZGV2LCB0eHBkKQogI2RlZmluZSBsYnNfbWVzaF9jb25maWcocHJpdiwgZW5hYmxlLCBjaGFuKQotI2RlZmluZSBsYnNfbWVzaF9vcGVuKHByaXYpICgwKQotI2RlZmluZSBsYnNfbWVzaF9jb25uZWN0ZWQocHJpdikgKDApCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYwppbmRleCBmZGIwNDQ4Li5iZmI4ODk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMKQEAgLTUsNiArNSw3IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eC5jCmluZGV4IGJiYjk1ZjguLmE2ZTg1MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdHguYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGhhbmRsaW5nIG9mIFRYIGluIHdsYW4gZHJpdmVyLgogICovCisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTE5OCw3ICsxOTksNyBAQAogCWlmIChwcml2LT5jb25uZWN0X3N0YXR1cyA9PSBMQlNfQ09OTkVDVEVEKQogCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPmRldik7CiAKLQlpZiAocHJpdi0+bWVzaF9kZXYgJiYgbGJzX21lc2hfY29ubmVjdGVkKHByaXYpKQorCWlmIChwcml2LT5tZXNoX2RldiAmJiBuZXRpZl9ydW5uaW5nKHByaXYtPm1lc2hfZGV2KSkKIAkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5tZXNoX2Rldik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsYnNfc2VuZF90eF9mZWVkYmFjayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2NtZC5jCmluZGV4IDg5NDVhZmQuLjEzNTU3ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2NtZC5jCkBAIC05LDYgKzksNyBAQAogICovCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAibGliZXJ0YXNfdGYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL21haW4uYwppbmRleCBkNDAwNTA4Li5hY2M0NjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jCkBAIC05LDYgKzksNyBAQAogICovCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KQEAgLTU4NSw3ICs1ODYsNyBAQAogCW5lZWRfcGFkZGluZyBePSBpZWVlODAyMTFfaGFzX2E0KGhkci0+ZnJhbWVfY29udHJvbCk7CiAJbmVlZF9wYWRkaW5nIF49IGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpICYmCiAJCQkoKmllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpICYKLQkJCSBJRUVFODAyMTFfUU9TX0NPTlRST0xfQV9NU0RVX1BSRVNFTlQpOworCQkJIElFRUU4MDIxMV9RT1NfQ1RMX0FfTVNEVV9QUkVTRU5UKTsKIAogCWlmIChuZWVkX3BhZGRpbmcpIHsKIAkJbWVtbW92ZShza2ItPmRhdGEgKyAyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCmluZGV4IDlkNGE0MGUuLjAzMWNkODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBtYWM4MDIxMV9od3NpbSAtIHNvZnR3YXJlIHNpbXVsYXRvciBvZiA4MDIuMTEgcmFkaW8ocykgZm9yIG1hYzgwMjExCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEphdmllciBMb3BleiA8amxvcGV4QGdtYWlsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTI1LDExICsyNiwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlICJtYWM4MDIxMV9od3NpbS5oIgorCisjZGVmaW5lIFdBUk5fUVVFVUUgMTAwCisjZGVmaW5lIE1BWF9RVUVVRSAyMDAKIAogTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTb2Z0d2FyZSBzaW11bGF0b3Igb2YgODAyLjExIHJhZGlvKHMpIGZvciBtYWM4MDIxMSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCitpbnQgd21lZGl1bWRfcGlkOwogc3RhdGljIGludCByYWRpb3MgPSAyOwogbW9kdWxlX3BhcmFtKHJhZGlvcywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocmFkaW9zLCAiTnVtYmVyIG9mIHNpbXVsYXRlZCByYWRpb3MiKTsKQEAgLTMwMiw2ICszMDksNyBAQAogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnM7CiAJc3RydWN0IGRlbnRyeSAqZGVidWdmc19wczsKIAorCXN0cnVjdCBza19idWZmX2hlYWQgcGVuZGluZzsJLyogcGFja2V0cyBwZW5kaW5nICovCiAJLyoKIAkgKiBPbmx5IHJhZGlvcyBpbiB0aGUgc2FtZSBncm91cCBjYW4gY29tbXVuaWNhdGUgdG9nZXRoZXIgKHRoZQogCSAqIGNoYW5uZWwgaGFzIHRvIG1hdGNoIHRvbykuIEVhY2ggYml0IHJlcHJlc2VudHMgYSBncm91cC4gQQpAQCAtMzIyLDYgKzMzMCwzMiBAQAogCV9fbGUxNiBydF9jaGJpdG1hc2s7CiB9IF9fcGFja2VkOwogCisvKiBNQUM4MDIxMV9IV1NJTSBuZXRsaW5mIGZhbWlseSAqLworc3RhdGljIHN0cnVjdCBnZW5sX2ZhbWlseSBod3NpbV9nZW5sX2ZhbWlseSA9IHsKKwkuaWQgPSBHRU5MX0lEX0dFTkVSQVRFLAorCS5oZHJzaXplID0gMCwKKwkubmFtZSA9ICJNQUM4MDIxMV9IV1NJTSIsCisJLnZlcnNpb24gPSAxLAorCS5tYXhhdHRyID0gSFdTSU1fQVRUUl9NQVgsCit9OworCisvKiBNQUM4MDIxMV9IV1NJTSBuZXRsaW5rIHBvbGljeSAqLworCitzdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgaHdzaW1fZ2VubF9wb2xpY3lbSFdTSU1fQVRUUl9NQVggKyAxXSA9IHsKKwlbSFdTSU1fQVRUUl9BRERSX1JFQ0VJVkVSXSA9IHsgLnR5cGUgPSBOTEFfVU5TUEVDLAorCQkJCSAgICAgICAubGVuID0gNipzaXplb2YodTgpIH0sCisJW0hXU0lNX0FUVFJfQUREUl9UUkFOU01JVFRFUl0gPSB7IC50eXBlID0gTkxBX1VOU1BFQywKKwkJCQkJICAubGVuID0gNipzaXplb2YodTgpIH0sCisJW0hXU0lNX0FUVFJfRlJBTUVdID0geyAudHlwZSA9IE5MQV9CSU5BUlksCisJCQkgICAgICAgLmxlbiA9IElFRUU4MDIxMV9NQVhfREFUQV9MRU4gfSwKKwlbSFdTSU1fQVRUUl9GTEFHU10gPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtIV1NJTV9BVFRSX1JYX1JBVEVdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbSFdTSU1fQVRUUl9TSUdOQUxdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbSFdTSU1fQVRUUl9UWF9JTkZPXSA9IHsgLnR5cGUgPSBOTEFfVU5TUEVDLAorCQkJCSAubGVuID0gSUVFRTgwMjExX1RYX01BWF9SQVRFUypzaXplb2YoCisJCQkJCXN0cnVjdCBod3NpbV90eF9yYXRlKX0sCisJW0hXU0lNX0FUVFJfQ09PS0lFXSA9IHsgLnR5cGUgPSBOTEFfVTY0IH0sCit9OwogCiBzdGF0aWMgbmV0ZGV2X3R4X3QgaHdzaW1fbW9uX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTQ3OCw5ICs1MTIsODkgQEAKIAlyZXR1cm4gbWQucmV0OwogfQogCitzdGF0aWMgdm9pZCBtYWM4MDIxMV9od3NpbV90eF9mcmFtZV9ubChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKm15X3NrYiwKKwkJCQkgICAgICAgaW50IGRzdF9waWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbWFjODAyMTFfaHdzaW1fZGF0YSAqZGF0YSA9IGh3LT5wcml2OworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgbXlfc2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IobXlfc2tiKTsKKwl2b2lkICptc2dfaGVhZDsKKwl1bnNpZ25lZCBpbnQgaHdzaW1fZmxhZ3MgPSAwOworCWludCBpOworCXN0cnVjdCBod3NpbV90eF9yYXRlIHR4X2F0dGVtcHRzW0lFRUU4MDIxMV9UWF9NQVhfUkFURVNdOwogCi1zdGF0aWMgYm9vbCBtYWM4MDIxMV9od3NpbV90eF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKKwlpZiAoZGF0YS0+aWRsZSkgeworCQl3aXBoeV9kZWJ1Zyhody0+d2lwaHksICJUcnlpbmcgdG8gVFggd2hlbiBpZGxlIC0gcmVqZWN0XG4iKTsKKwkJZGV2X2tmcmVlX3NrYihteV9za2IpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRhdGEtPnBzICE9IFBTX0RJU0FCTEVEKQorCQloZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfUE0pOworCS8qIElmIHRoZSBxdWV1ZSBjb250YWlucyBNQVhfUVVFVUUgc2tiJ3MgZHJvcCBzb21lICovCisJaWYgKHNrYl9xdWV1ZV9sZW4oJmRhdGEtPnBlbmRpbmcpID49IE1BWF9RVUVVRSkgeworCQkvKiBEcm9waW5nIHVudGlsIFdBUk5fUVVFVUUgbGV2ZWwgKi8KKwkJd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJmRhdGEtPnBlbmRpbmcpID49IFdBUk5fUVVFVUUpCisJCQlza2JfZGVxdWV1ZSgmZGF0YS0+cGVuZGluZyk7CisJfQorCisJc2tiID0gZ2VubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwltc2dfaGVhZCA9IGdlbmxtc2dfcHV0KHNrYiwgMCwgMCwgJmh3c2ltX2dlbmxfZmFtaWx5LCAwLAorCQkJICAgICAgIEhXU0lNX0NNRF9GUkFNRSk7CisJaWYgKG1zZ19oZWFkID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1hYzgwMjExX2h3c2ltOiBwcm9ibGVtIHdpdGggbXNnX2hlYWRcbiIpOworCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwl9CisKKwlOTEFfUFVUKHNrYiwgSFdTSU1fQVRUUl9BRERSX1RSQU5TTUlUVEVSLAorCQkgICAgIHNpemVvZihzdHJ1Y3QgbWFjX2FkZHJlc3MpLCBkYXRhLT5hZGRyZXNzZXNbMV0uYWRkcik7CisKKwkvKiBXZSBnZXQgdGhlIHNrYi0+ZGF0YSAqLworCU5MQV9QVVQoc2tiLCBIV1NJTV9BVFRSX0ZSQU1FLCBteV9za2ItPmxlbiwgbXlfc2tiLT5kYXRhKTsKKworCS8qIFdlIGdldCB0aGUgZmxhZ3MgZm9yIHRoaXMgdHJhbnNtaXNzaW9uLCBhbmQgd2UgdHJhbnNsYXRlIHRoZW0gdG8KKwkgICB3bWVkaXVtZCBmbGFncyAgKi8KKworCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUykKKwkJaHdzaW1fZmxhZ3MgfD0gSFdTSU1fVFhfQ1RMX1JFUV9UWF9TVEFUVVM7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykKKwkJaHdzaW1fZmxhZ3MgfD0gSFdTSU1fVFhfQ1RMX05PX0FDSzsKKworCU5MQV9QVVRfVTMyKHNrYiwgSFdTSU1fQVRUUl9GTEFHUywgaHdzaW1fZmxhZ3MpOworCisJLyogV2UgZ2V0IHRoZSB0eCBjb250cm9sIChyYXRlIGFuZCByZXRyaWVzKSBpbmZvKi8KKworCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfVFhfTUFYX1JBVEVTOyBpKyspIHsKKwkJdHhfYXR0ZW1wdHNbaV0uaWR4ID0gaW5mby0+c3RhdHVzLnJhdGVzW2ldLmlkeDsKKwkJdHhfYXR0ZW1wdHNbaV0uY291bnQgPSBpbmZvLT5zdGF0dXMucmF0ZXNbaV0uY291bnQ7CisJfQorCisJTkxBX1BVVChza2IsIEhXU0lNX0FUVFJfVFhfSU5GTywKKwkJICAgICBzaXplb2Yoc3RydWN0IGh3c2ltX3R4X3JhdGUpKklFRUU4MDIxMV9UWF9NQVhfUkFURVMsCisJCSAgICAgdHhfYXR0ZW1wdHMpOworCisJLyogV2UgY3JlYXRlIGEgY29va2llIHRvIGlkZW50aWZ5IHRoaXMgc2tiICovCisJTkxBX1BVVF9VNjQoc2tiLCBIV1NJTV9BVFRSX0NPT0tJRSwgKHVuc2lnbmVkIGxvbmcpIG15X3NrYik7CisKKwlnZW5sbXNnX2VuZChza2IsIG1zZ19oZWFkKTsKKwlnZW5sbXNnX3VuaWNhc3QoJmluaXRfbmV0LCBza2IsIGRzdF9waWQpOworCisJLyogRW5xdWV1ZSB0aGUgcGFja2V0ICovCisJc2tiX3F1ZXVlX3RhaWwoJmRhdGEtPnBlbmRpbmcsIG15X3NrYik7CisJcmV0dXJuOworCitubGFfcHV0X2ZhaWx1cmU6CisJcHJpbnRrKEtFUk5fREVCVUcgIm1hYzgwMjExX2h3c2ltOiBlcnJvciBvY2N1cmVkIGluICVzXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBib29sIG1hYzgwMjExX2h3c2ltX3R4X2ZyYW1lX25vX25sKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG1hYzgwMjExX2h3c2ltX2RhdGEgKmRhdGEgPSBody0+cHJpdiwgKmRhdGEyOwogCWJvb2wgYWNrID0gZmFsc2U7CkBAIC01NDAsMTEgKzY1NCwxMSBAQAogCXJldHVybiBhY2s7CiB9CiAKLQogc3RhdGljIHZvaWQgbWFjODAyMTFfaHdzaW1fdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJYm9vbCBhY2s7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eGk7CisJaW50IF9waWQ7CiAKIAltYWM4MDIxMV9od3NpbV9tb25pdG9yX3J4KGh3LCBza2IpOwogCkBAIC01NTQsNyArNjY4LDE1IEBACiAJCXJldHVybjsKIAl9CiAKLQlhY2sgPSBtYWM4MDIxMV9od3NpbV90eF9mcmFtZShodywgc2tiKTsKKwkvKiB3bWVkaXVtZCBtb2RlIGNoZWNrICovCisJX3BpZCA9IHdtZWRpdW1kX3BpZDsKKworCWlmIChfcGlkKQorCQlyZXR1cm4gbWFjODAyMTFfaHdzaW1fdHhfZnJhbWVfbmwoaHcsIHNrYiwgX3BpZCk7CisKKwkvKiBOTyB3bWVkaXVtZCBkZXRlY3RlZCwgcGVyZmVjdCBtZWRpdW0gc2ltdWxhdGlvbiAqLworCWFjayA9IG1hYzgwMjExX2h3c2ltX3R4X2ZyYW1lX25vX25sKGh3LCBza2IpOworCiAJaWYgKGFjayAmJiBza2ItPmxlbiA+PSAxNikgewogCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKIAkJbWFjODAyMTFfaHdzaW1fbW9uaXRvcl9hY2soaHcsIGhkci0+YWRkcjIpOwpAQCAtNjM1LDYgKzc1Nyw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBhcmc7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJaW50IF9waWQ7CiAKIAlod3NpbV9jaGVja19tYWdpYyh2aWYpOwogCkBAIC02NDksNyArNzcyLDE0IEBACiAJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAogCW1hYzgwMjExX2h3c2ltX21vbml0b3JfcngoaHcsIHNrYik7Ci0JbWFjODAyMTFfaHdzaW1fdHhfZnJhbWUoaHcsIHNrYik7CisKKwkvKiB3bWVkaXVtZCBtb2RlIGNoZWNrICovCisJX3BpZCA9IHdtZWRpdW1kX3BpZDsKKworCWlmIChfcGlkKQorCQlyZXR1cm4gbWFjODAyMTFfaHdzaW1fdHhfZnJhbWVfbmwoaHcsIHNrYiwgX3BpZCk7CisKKwltYWM4MDIxMV9od3NpbV90eF9mcmFtZV9ub19ubChodywgc2tiKTsKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiB9CiAKQEAgLTk2NiwxMiArMTA5Niw3IEBACiAKIHN0YXRpYyB2b2lkIG1hYzgwMjExX2h3c2ltX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGRyb3ApCiB7Ci0JLyoKLQkgKiBJbiB0aGlzIHNwZWNpYWwgY2FzZSwgdGhlcmUncyBub3RoaW5nIHdlIG5lZWQgdG8KLQkgKiBkbyBiZWNhdXNlIGh3c2ltIGRvZXMgdHJhbnNtaXNzaW9uIHN5bmNocm9ub3VzbHkuCi0JICogSW4gdGhlIGZ1dHVyZSwgd2hlbiBpdCBkb2VzIHRyYW5zbWlzc2lvbnMgdmlhCi0JICogdXNlcnNwYWNlLCB3ZSBtYXkgbmVlZCB0byBkbyBzb21ldGhpbmcuCi0JICovCisJLyogTm90IGltcGxlbWVudGVkLCBxdWV1ZXMgb25seSBvbiBrZXJuZWwgc2lkZSAqLwogfQogCiBzdHJ1Y3QgaHdfc2Nhbl9kb25lIHsKQEAgLTEwMDUsNiArMTEzMCw4IEBACiAJZm9yIChpID0gMDsgaSA8IHJlcS0+bl9jaGFubmVsczsgaSsrKQogCQlwcmludGsoS0VSTl9ERUJVRyAiaHdzaW0gaHdfc2NhbiBmcmVxICVkXG4iLAogCQkJcmVxLT5jaGFubmVsc1tpXS0+Y2VudGVyX2ZyZXEpOworCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJzY2FuIElFczogIiwgRFVNUF9QUkVGSVhfT0ZGU0VULAorCQkJMTYsIDEsIHJlcS0+aWUsIHJlcS0+aWVfbGVuLCAxKTsKIAogCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoaHcsICZoc2QtPncsIDIgKiBIWik7CiAKQEAgLTExMTksNiArMTI0Niw3IEBACiAJc3RydWN0IGh3c2ltX3ZpZl9wcml2ICp2cCA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfcHNwb2xsICpwc3BvbGw7CisJaW50IF9waWQ7CiAKIAlpZiAoIXZwLT5hc3NvYykKIAkJcmV0dXJuOwpAQCAtMTEzNyw4ICsxMjY1LDE1IEBACiAJcHNwb2xsLT5haWQgPSBjcHVfdG9fbGUxNigweGMwMDAgfCB2cC0+YWlkKTsKIAltZW1jcHkocHNwb2xsLT5ic3NpZCwgdnAtPmJzc2lkLCBFVEhfQUxFTik7CiAJbWVtY3B5KHBzcG9sbC0+dGEsIG1hYywgRVRIX0FMRU4pOwotCWlmICghbWFjODAyMTFfaHdzaW1fdHhfZnJhbWUoZGF0YS0+aHcsIHNrYikpCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogUFMtUG9sbCBmcmFtZSBub3QgYWNrJ2VkXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiB3bWVkaXVtZCBtb2RlIGNoZWNrICovCisJX3BpZCA9IHdtZWRpdW1kX3BpZDsKKworCWlmIChfcGlkKQorCQlyZXR1cm4gbWFjODAyMTFfaHdzaW1fdHhfZnJhbWVfbmwoZGF0YS0+aHcsIHNrYiwgX3BpZCk7CisKKwlpZiAoIW1hYzgwMjExX2h3c2ltX3R4X2ZyYW1lX25vX25sKGRhdGEtPmh3LCBza2IpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFBTLXBvbGwgZnJhbWUgbm90IGFjaydlZFxuIiwgX19mdW5jX18pOwogCWRldl9rZnJlZV9za2Ioc2tiKTsKIH0KIApAQCAtMTE0OSw2ICsxMjg0LDcgQEAKIAlzdHJ1Y3QgaHdzaW1fdmlmX3ByaXYgKnZwID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlpbnQgX3BpZDsKIAogCWlmICghdnAtPmFzc29jKQogCQlyZXR1cm47CkBAIC0xMTY4LDcgKzEzMDQsMTQgQEAKIAltZW1jcHkoaGRyLT5hZGRyMSwgdnAtPmJzc2lkLCBFVEhfQUxFTik7CiAJbWVtY3B5KGhkci0+YWRkcjIsIG1hYywgRVRIX0FMRU4pOwogCW1lbWNweShoZHItPmFkZHIzLCB2cC0+YnNzaWQsIEVUSF9BTEVOKTsKLQlpZiAoIW1hYzgwMjExX2h3c2ltX3R4X2ZyYW1lKGRhdGEtPmh3LCBza2IpKQorCisJLyogd21lZGl1bWQgbW9kZSBjaGVjayAqLworCV9waWQgPSB3bWVkaXVtZF9waWQ7CisKKwlpZiAoX3BpZCkKKwkJcmV0dXJuIG1hYzgwMjExX2h3c2ltX3R4X2ZyYW1lX25sKGRhdGEtPmh3LCBza2IsIF9waWQpOworCisJaWYgKCFtYWM4MDIxMV9od3NpbV90eF9mcmFtZV9ub19ubChkYXRhLT5odywgc2tiKSkKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudWxsZnVuYyBmcmFtZSBub3QgYWNrJ2VkXG4iLCBfX2Z1bmNfXyk7CiAJZGV2X2tmcmVlX3NrYihza2IpOwogfQpAQCAtMTI0OCw2ICsxMzkxLDI3MyBAQAogCQkJaHdzaW1fZm9wc19ncm91cF9yZWFkLCBod3NpbV9mb3BzX2dyb3VwX3dyaXRlLAogCQkJIiVsbHhcbiIpOwogCitzdHJ1Y3QgbWFjODAyMTFfaHdzaW1fZGF0YSAqZ2V0X2h3c2ltX2RhdGFfcmVmX2Zyb21fYWRkcigKKwkJCSAgICAgc3RydWN0IG1hY19hZGRyZXNzICphZGRyKQoreworCXN0cnVjdCBtYWM4MDIxMV9od3NpbV9kYXRhICpkYXRhOworCWJvb2wgX2ZvdW5kID0gZmFsc2U7CisKKwlzcGluX2xvY2tfYmgoJmh3c2ltX3JhZGlvX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGF0YSwgJmh3c2ltX3JhZGlvcywgbGlzdCkgeworCQlpZiAobWVtY21wKGRhdGEtPmFkZHJlc3Nlc1sxXS5hZGRyLCBhZGRyLAorCQkJICBzaXplb2Yoc3RydWN0IG1hY19hZGRyZXNzKSkgPT0gMCkgeworCQkJX2ZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZod3NpbV9yYWRpb19sb2NrKTsKKworCWlmICghX2ZvdW5kKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IGh3c2ltX3R4X2luZm9fZnJhbWVfcmVjZWl2ZWRfbmwoc3RydWN0IHNrX2J1ZmYgKnNrYl8yLAorCQkJCQkgICBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlzdHJ1Y3QgbWFjODAyMTFfaHdzaW1fZGF0YSAqZGF0YTI7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eGk7CisJc3RydWN0IGh3c2ltX3R4X3JhdGUgKnR4X2F0dGVtcHRzOworCXN0cnVjdCBza19idWZmIF9fdXNlciAqcmV0X3NrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOworCXN0cnVjdCBtYWNfYWRkcmVzcyAqc3JjOworCXVuc2lnbmVkIGludCBod3NpbV9mbGFnczsKKworCWludCBpOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCWlmICghaW5mby0+YXR0cnNbSFdTSU1fQVRUUl9BRERSX1RSQU5TTUlUVEVSXSB8fAorCSAgICFpbmZvLT5hdHRyc1tIV1NJTV9BVFRSX0ZMQUdTXSB8fAorCSAgICFpbmZvLT5hdHRyc1tIV1NJTV9BVFRSX0NPT0tJRV0gfHwKKwkgICAhaW5mby0+YXR0cnNbSFdTSU1fQVRUUl9UWF9JTkZPXSkKKwkJZ290byBvdXQ7CisKKwlzcmMgPSAoc3RydWN0IG1hY19hZGRyZXNzICopbmxhX2RhdGEoCisJCQkJICAgaW5mby0+YXR0cnNbSFdTSU1fQVRUUl9BRERSX1RSQU5TTUlUVEVSXSk7CisJaHdzaW1fZmxhZ3MgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tIV1NJTV9BVFRSX0ZMQUdTXSk7CisKKwlyZXRfc2tiID0gKHN0cnVjdCBza19idWZmIF9fdXNlciAqKQorCQkgICh1bnNpZ25lZCBsb25nKSBubGFfZ2V0X3U2NChpbmZvLT5hdHRyc1tIV1NJTV9BVFRSX0NPT0tJRV0pOworCisJZGF0YTIgPSBnZXRfaHdzaW1fZGF0YV9yZWZfZnJvbV9hZGRyKHNyYyk7CisKKwlpZiAoZGF0YTIgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwkvKiBsb29rIGZvciB0aGUgc2tiIG1hdGNoaW5nIHRoZSBjb29raWUgcGFzc2VkIGJhY2sgZnJvbSB1c2VyICovCisJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmZGF0YTItPnBlbmRpbmcsIHNrYiwgdG1wKSB7CisJCWlmIChza2IgPT0gcmV0X3NrYikgeworCQkJc2tiX3VubGluayhza2IsICZkYXRhMi0+cGVuZGluZyk7CisJCQlmb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIG5vdCBmb3VuZCAqLworCWlmICghZm91bmQpCisJCWdvdG8gb3V0OworCisJLyogVHggaW5mbyByZWNlaXZlZCBiZWNhdXNlIHRoZSBmcmFtZSB3YXMgYnJvYWRjYXN0ZWQgb24gdXNlciBzcGFjZSwKKwkgc28gd2UgZ2V0IGFsbCB0aGUgbmVjZXNzYXJ5IGluZm86IHR4IGF0dGVtcHRzIGFuZCBza2IgY29udHJvbCBidWZmICovCisKKwl0eF9hdHRlbXB0cyA9IChzdHJ1Y3QgaHdzaW1fdHhfcmF0ZSAqKW5sYV9kYXRhKAorCQkgICAgICAgaW5mby0+YXR0cnNbSFdTSU1fQVRUUl9UWF9JTkZPXSk7CisKKwkvKiBub3cgc2VuZCBiYWNrIFRYIHN0YXR1cyAqLworCXR4aSA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKworCWlmICh0eGktPmNvbnRyb2wudmlmKQorCQlod3NpbV9jaGVja19tYWdpYyh0eGktPmNvbnRyb2wudmlmKTsKKwlpZiAodHhpLT5jb250cm9sLnN0YSkKKwkJaHdzaW1fY2hlY2tfc3RhX21hZ2ljKHR4aS0+Y29udHJvbC5zdGEpOworCisJaWVlZTgwMjExX3R4X2luZm9fY2xlYXJfc3RhdHVzKHR4aSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX1RYX01BWF9SQVRFUzsgaSsrKSB7CisJCXR4aS0+c3RhdHVzLnJhdGVzW2ldLmlkeCA9IHR4X2F0dGVtcHRzW2ldLmlkeDsKKwkJdHhpLT5zdGF0dXMucmF0ZXNbaV0uY291bnQgPSB0eF9hdHRlbXB0c1tpXS5jb3VudDsKKwkJLyp0eGktPnN0YXR1cy5yYXRlc1tpXS5mbGFncyA9IDA7Ki8KKwl9CisKKwl0eGktPnN0YXR1cy5hY2tfc2lnbmFsID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbSFdTSU1fQVRUUl9TSUdOQUxdKTsKKworCWlmICghKGh3c2ltX2ZsYWdzICYgSFdTSU1fVFhfQ1RMX05PX0FDSykgJiYKKwkgICAoaHdzaW1fZmxhZ3MgJiBIV1NJTV9UWF9TVEFUX0FDSykpIHsKKwkJaWYgKHNrYi0+bGVuID49IDE2KSB7CisJCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCQkJbWFjODAyMTFfaHdzaW1fbW9uaXRvcl9hY2soZGF0YTItPmh3LCBoZHItPmFkZHIyKTsKKwkJfQorCX0KKwlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUoZGF0YTItPmh3LCBza2IpOworCXJldHVybiAwOworb3V0OgorCXJldHVybiAtRUlOVkFMOworCit9CisKK3N0YXRpYyBpbnQgaHdzaW1fY2xvbmVkX2ZyYW1lX3JlY2VpdmVkX25sKHN0cnVjdCBza19idWZmICpza2JfMiwKKwkJCQkJICBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCisJc3RydWN0IG1hYzgwMjExX2h3c2ltX2RhdGEgICpkYXRhMjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXM7CisJc3RydWN0IG1hY19hZGRyZXNzICpkc3Q7CisJaW50IGZyYW1lX2RhdGFfbGVuOworCWNoYXIgKmZyYW1lX2RhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisKKwlpZiAoIWluZm8tPmF0dHJzW0hXU0lNX0FUVFJfQUREUl9SRUNFSVZFUl0gfHwKKwkgICAhaW5mby0+YXR0cnNbSFdTSU1fQVRUUl9GUkFNRV0gfHwKKwkgICAhaW5mby0+YXR0cnNbSFdTSU1fQVRUUl9SWF9SQVRFXSB8fAorCSAgICFpbmZvLT5hdHRyc1tIV1NJTV9BVFRSX1NJR05BTF0pCisJCWdvdG8gb3V0OworCisJZHN0ID0gKHN0cnVjdCBtYWNfYWRkcmVzcyAqKW5sYV9kYXRhKAorCQkJCSAgIGluZm8tPmF0dHJzW0hXU0lNX0FUVFJfQUREUl9SRUNFSVZFUl0pOworCisJZnJhbWVfZGF0YV9sZW4gPSBubGFfbGVuKGluZm8tPmF0dHJzW0hXU0lNX0FUVFJfRlJBTUVdKTsKKwlmcmFtZV9kYXRhID0gKGNoYXIgKilubGFfZGF0YShpbmZvLT5hdHRyc1tIV1NJTV9BVFRSX0ZSQU1FXSk7CisKKwkvKiBBbGxvY2F0ZSBuZXcgc2tiIGhlcmUgKi8KKwlza2IgPSBhbGxvY19za2IoZnJhbWVfZGF0YV9sZW4sIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlpZiAoZnJhbWVfZGF0YV9sZW4gPD0gSUVFRTgwMjExX01BWF9EQVRBX0xFTikgeworCQkvKiBDb3B5IHRoZSBkYXRhICovCisJCW1lbWNweShza2JfcHV0KHNrYiwgZnJhbWVfZGF0YV9sZW4pLCBmcmFtZV9kYXRhLAorCQkgICAgICAgZnJhbWVfZGF0YV9sZW4pOworCX0gZWxzZQorCQlnb3RvIGVycjsKKworCWRhdGEyID0gZ2V0X2h3c2ltX2RhdGFfcmVmX2Zyb21fYWRkcihkc3QpOworCisJaWYgKGRhdGEyID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJLyogY2hlY2sgaWYgcmFkaW8gaXMgY29uZmlndXJlZCBwcm9wZXJseSAqLworCisJaWYgKGRhdGEyLT5pZGxlIHx8ICFkYXRhMi0+c3RhcnRlZCB8fCAhZGF0YTItPmNoYW5uZWwpCisJCWdvdG8gb3V0OworCisJLypBIGZyYW1lIGlzIHJlY2VpdmVkIGZyb20gdXNlciBzcGFjZSovCisJbWVtc2V0KCZyeF9zdGF0dXMsIDAsIHNpemVvZihyeF9zdGF0dXMpKTsKKwlyeF9zdGF0dXMuZnJlcSA9IGRhdGEyLT5jaGFubmVsLT5jZW50ZXJfZnJlcTsKKwlyeF9zdGF0dXMuYmFuZCA9IGRhdGEyLT5jaGFubmVsLT5iYW5kOworCXJ4X3N0YXR1cy5yYXRlX2lkeCA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW0hXU0lNX0FUVFJfUlhfUkFURV0pOworCXJ4X3N0YXR1cy5zaWduYWwgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tIV1NJTV9BVFRSX1NJR05BTF0pOworCisJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCAmcnhfc3RhdHVzLCBzaXplb2Yocnhfc3RhdHVzKSk7CisJaWVlZTgwMjExX3J4X2lycXNhZmUoZGF0YTItPmh3LCBza2IpOworCisJcmV0dXJuIDA7CitlcnI6CisJcHJpbnRrKEtFUk5fREVCVUcgIm1hYzgwMjExX2h3c2ltOiBlcnJvciBvY2N1cmVkIGluICVzXG4iLCBfX2Z1bmNfXyk7CisJZ290byBvdXQ7CitvdXQ6CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGh3c2ltX3JlZ2lzdGVyX3JlY2VpdmVkX25sKHN0cnVjdCBza19idWZmICpza2JfMiwKKwkJCQkgICAgICBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCWlmIChpbmZvID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJd21lZGl1bWRfcGlkID0gaW5mby0+c25kX3BpZDsKKworCXByaW50ayhLRVJOX0RFQlVHICJtYWM4MDIxMV9od3NpbTogcmVjZWl2ZWQgYSBSRUdJU1RFUiwgIgorCSJzd2l0Y2hpbmcgdG8gd21lZGl1bWQgbW9kZSB3aXRoIHBpZCAlZFxuIiwgaW5mby0+c25kX3BpZCk7CisKKwlyZXR1cm4gMDsKK291dDoKKwlwcmludGsoS0VSTl9ERUJVRyAibWFjODAyMTFfaHdzaW06IGVycm9yIG9jY3VyZWQgaW4gJXNcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogR2VuZXJpYyBOZXRsaW5rIG9wZXJhdGlvbnMgYXJyYXkgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2VubF9vcHMgaHdzaW1fb3BzW10gPSB7CisJeworCQkuY21kID0gSFdTSU1fQ01EX1JFR0lTVEVSLAorCQkucG9saWN5ID0gaHdzaW1fZ2VubF9wb2xpY3ksCisJCS5kb2l0ID0gaHdzaW1fcmVnaXN0ZXJfcmVjZWl2ZWRfbmwsCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwl9LAorCXsKKwkJLmNtZCA9IEhXU0lNX0NNRF9GUkFNRSwKKwkJLnBvbGljeSA9IGh3c2ltX2dlbmxfcG9saWN5LAorCQkuZG9pdCA9IGh3c2ltX2Nsb25lZF9mcmFtZV9yZWNlaXZlZF9ubCwKKwl9LAorCXsKKwkJLmNtZCA9IEhXU0lNX0NNRF9UWF9JTkZPX0ZSQU1FLAorCQkucG9saWN5ID0gaHdzaW1fZ2VubF9wb2xpY3ksCisJCS5kb2l0ID0gaHdzaW1fdHhfaW5mb19mcmFtZV9yZWNlaXZlZF9ubCwKKwl9LAorfTsKKworc3RhdGljIGludCBtYWM4MDIxMV9od3NpbV9uZXRsaW5rX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCQkgdW5zaWduZWQgbG9uZyBzdGF0ZSwKKwkJCQkJIHZvaWQgKl9ub3RpZnkpCit7CisJc3RydWN0IG5ldGxpbmtfbm90aWZ5ICpub3RpZnkgPSBfbm90aWZ5OworCisJaWYgKHN0YXRlICE9IE5FVExJTktfVVJFTEVBU0UpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCWlmIChub3RpZnktPnBpZCA9PSB3bWVkaXVtZF9waWQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibWFjODAyMTFfaHdzaW06IHdtZWRpdW1kIHJlbGVhc2VkIG5ldGxpbmsiCisJCSAgICAgICAiIHNvY2tldCwgc3dpdGNoaW5nIHRvIHBlcmZlY3QgY2hhbm5lbCBtZWRpdW1cbiIpOworCQl3bWVkaXVtZF9waWQgPSAwOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7CisKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBod3NpbV9uZXRsaW5rX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gbWFjODAyMTFfaHdzaW1fbmV0bGlua19ub3RpZnksCit9OworCitzdGF0aWMgaW50IGh3c2ltX2luaXRfbmV0bGluayh2b2lkKQoreworCWludCByYzsKKwlwcmludGsoS0VSTl9JTkZPICJtYWM4MDIxMV9od3NpbTogaW5pdGlhbGl6aW5nIG5ldGxpbmtcbiIpOworCisJd21lZGl1bWRfcGlkID0gMDsKKworCXJjID0gZ2VubF9yZWdpc3Rlcl9mYW1pbHlfd2l0aF9vcHMoJmh3c2ltX2dlbmxfZmFtaWx5LAorCQlod3NpbV9vcHMsIEFSUkFZX1NJWkUoaHdzaW1fb3BzKSk7CisJaWYgKHJjKQorCQlnb3RvIGZhaWx1cmU7CisKKwlyYyA9IG5ldGxpbmtfcmVnaXN0ZXJfbm90aWZpZXIoJmh3c2ltX25ldGxpbmtfbm90aWZpZXIpOworCWlmIChyYykKKwkJZ290byBmYWlsdXJlOworCisJcmV0dXJuIDA7CisKK2ZhaWx1cmU6CisJcHJpbnRrKEtFUk5fREVCVUcgIm1hYzgwMjExX2h3c2ltOiBlcnJvciBvY2N1cmVkIGluICVzXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGh3c2ltX2V4aXRfbmV0bGluayh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJtYWM4MDIxMV9od3NpbTogY2xvc2luZyBuZXRsaW5rXG4iKTsKKwkvKiB1bnJlZ2lzdGVyIHRoZSBub3RpZmllciAqLworCW5ldGxpbmtfdW5yZWdpc3Rlcl9ub3RpZmllcigmaHdzaW1fbmV0bGlua19ub3RpZmllcik7CisJLyogdW5yZWdpc3RlciB0aGUgZmFtaWx5ICovCisJcmV0ID0gZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmaHdzaW1fZ2VubF9mYW1pbHkpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0RFQlVHICJtYWM4MDIxMV9od3NpbTogIgorCQkgICAgICAgInVucmVnaXN0ZXIgZmFtaWx5ICVpXG4iLCByZXQpOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X21hYzgwMjExX2h3c2ltKHZvaWQpCiB7CiAJaW50IGksIGVyciA9IDA7CkBAIC0xMjk4LDYgKzE3MDgsNyBAQAogCQkJZ290byBmYWlsZWRfZHJ2ZGF0YTsKIAkJfQogCQlkYXRhLT5kZXYtPmRyaXZlciA9ICZtYWM4MDIxMV9od3NpbV9kcml2ZXI7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmRhdGEtPnBlbmRpbmcpOwogCiAJCVNFVF9JRUVFODAyMTFfREVWKGh3LCBkYXRhLT5kZXYpOwogCQlhZGRyWzNdID0gaSA+PiA4OwpAQCAtMTM3OSw2ICsxNzkwLDEwIEBACiAJCWRhdGEtPmdyb3VwID0gMTsKIAkJbXV0ZXhfaW5pdCgmZGF0YS0+bXV0ZXgpOwogCisJCS8qIEVuYWJsZSBmcmFtZSByZXRyYW5zbWlzc2lvbnMgZm9yIGxvc3N5IGNoYW5uZWxzICovCisJCWh3LT5tYXhfcmF0ZXMgPSA0OworCQlody0+bWF4X3JhdGVfdHJpZXMgPSAxMTsKKwogCQkvKiBXb3JrIHRvIGJlIGRvbmUgcHJpb3IgdG8gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KCkgKi8KIAkJc3dpdGNoIChyZWd0ZXN0KSB7CiAJCWNhc2UgSFdTSU1fUkVHVEVTVF9ESVNBQkxFRDoKQEAgLTE1MTUsMTIgKzE5MzAsMjkgQEAKIAlpZiAoaHdzaW1fbW9uID09IE5VTEwpCiAJCWdvdG8gZmFpbGVkOwogCi0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGh3c2ltX21vbik7CisJcnRubF9sb2NrKCk7CisKKwllcnIgPSBkZXZfYWxsb2NfbmFtZShod3NpbV9tb24sIGh3c2ltX21vbi0+bmFtZSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZmFpbGVkX21vbjsKIAorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKGh3c2ltX21vbik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZmFpbGVkX21vbjsKKworCXJ0bmxfdW5sb2NrKCk7CisKKwllcnIgPSBod3NpbV9pbml0X25ldGxpbmsoKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsZWRfbmw7CisKIAlyZXR1cm4gMDsKIAorZmFpbGVkX25sOgorCXByaW50ayhLRVJOX0RFQlVHICJtYWNfODAyMTFfaHdzaW06IGZhaWxlZCBpbml0aWFsaXppbmcgbmV0bGlua1xuIik7CisJcmV0dXJuIGVycjsKKwogZmFpbGVkX21vbjoKIAlydG5sX3VubG9jaygpOwogCWZyZWVfbmV0ZGV2KGh3c2ltX21vbik7CkBAIC0xNTQxLDYgKzE5NzMsOCBAQAogewogCXByaW50ayhLRVJOX0RFQlVHICJtYWM4MDIxMV9od3NpbTogdW5yZWdpc3RlciByYWRpb3NcbiIpOwogCisJaHdzaW1fZXhpdF9uZXRsaW5rKCk7CisKIAltYWM4MDIxMV9od3NpbV9mcmVlKCk7CiAJdW5yZWdpc3Rlcl9uZXRkZXYoaHdzaW1fbW9uKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWFkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogbWFjODAyMTFfaHdzaW0gLSBzb2Z0d2FyZSBzaW11bGF0b3Igb2YgODAyLjExIHJhZGlvKHMpIGZvciBtYWM4MDIxMQorICogQ29weXJpZ2h0IChjKSAyMDA4LCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgorICogQ29weXJpZ2h0IChjKSAyMDExLCBKYXZpZXIgTG9wZXogPGpsb3BleEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTUFDODAyMTFfSFdTSU1fSAorI2RlZmluZSBfX01BQzgwMjExX0hXU0lNX0gKKworLyoqCisgKiBlbnVtIGh3c2ltX3R4X2NvbnRyb2xfZmxhZ3MgLSBmbGFncyB0byBkZXNjcmliZSB0cmFuc21pc3Npb24gaW5mby9zdGF0dXMKKyAqCisgKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB0byBnaXZlIHRoZSB3bWVkaXVtZCBleHRyYSBpbmZvcm1hdGlvbiBpbiBvcmRlciB0bworICogbW9kaWZ5IGl0cyBiZWhhdmlvciBmb3IgZWFjaCBmcmFtZQorICoKKyAqIEBIV1NJTV9UWF9DVExfUkVRX1RYX1NUQVRVUzogcmVxdWlyZSBUWCBzdGF0dXMgY2FsbGJhY2sgZm9yIHRoaXMgZnJhbWUuCisgKiBASFdTSU1fVFhfQ1RMX05PX0FDSzogdGVsbCB0aGUgd21lZGl1bWQgbm90IHRvIHdhaXQgZm9yIGFuIGFjaworICogQEhXU0lNX1RYX1NUQVRfQUNLOiBGcmFtZSB3YXMgYWNrbm93bGVkZ2VkCisgKgorICovCitlbnVtIGh3c2ltX3R4X2NvbnRyb2xfZmxhZ3MgeworCUhXU0lNX1RYX0NUTF9SRVFfVFhfU1RBVFVTCQk9IEJJVCgwKSwKKwlIV1NJTV9UWF9DVExfTk9fQUNLCQkJPSBCSVQoMSksCisJSFdTSU1fVFhfU1RBVF9BQ0sJCQk9IEJJVCgyKSwKK307CisKKy8qKgorICogRE9DOiBGcmFtZSB0cmFuc21pc3Npb24vcmVnaXN0cmF0aW9uIHN1cHBvcnQKKyAqCisgKiBGcmFtZSB0cmFuc21pc3Npb24gYW5kIHJlZ2lzdHJhdGlvbiBzdXBwb3J0IGV4aXN0cyB0byBhbGxvdyB1c2Vyc3BhY2UKKyAqIGVudGl0aWVzIHN1Y2ggYXMgd21lZGl1bWQgdG8gcmVjZWl2ZSBhbmQgcHJvY2VzcyBhbGwgYnJvYWRjYXN0ZWQKKyAqIGZyYW1lcyBmcm9tIGEgbWFjODAyMTFfaHdzaW0gcmFkaW8gZGV2aWNlLgorICoKKyAqIFRoaXMgYWxsb3cgdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgdG8gZGVjaWRlIGlmIHRoZSBmcmFtZSBzaG91bGQgYmUKKyAqIGRyb3BwZWQgb3Igbm90IGFuZCBpbXBsZW1lbnQgYSB3aXJlbGVzcyBtZWRpdW0gc2ltdWxhdG9yIGF0IHVzZXIgc3BhY2UuCisgKgorICogUmVnaXN0cmF0aW9uIGlzIGRvbmUgYnkgc2VuZGluZyBhIHJlZ2lzdGVyIG1lc3NhZ2UgdG8gdGhlIGRyaXZlciBhbmQKKyAqIHdpbGwgYmUgYXV0b21hdGljYWxseSB1bnJlZ2lzdGVyZWQgaWYgdGhlIHVzZXIgYXBwbGljYXRpb24gZG9lc24ndAorICogcmVzcG9uZHMgdG8gc2VudCBmcmFtZXMuCisgKiBPbmNlIHJlZ2lzdGVyZWQgdGhlIHVzZXIgYXBwbGljYXRpb24gaGFzIHRvIHRha2UgcmVzcG9uc2liaWxpdHkgb2YKKyAqIGJyb2FkY2FzdGluZyB0aGUgZnJhbWVzIHRvIGFsbCBsaXN0ZW5pbmcgbWFjODAyMTFfaHdzaW0gcmFkaW8KKyAqIGludGVyZmFjZXMuCisgKgorICogRm9yIG1vcmUgdGVjaG5pY2FsIGRldGFpbHMsIHNlZSB0aGUgY29ycmVzcG9uZGluZyBjb21tYW5kIGRlc2NyaXB0aW9ucworICogYmVsb3cuCisgKi8KKworLyoqCisgKiBlbnVtIGh3c2ltX2NvbW1hbmRzIC0gc3VwcG9ydGVkIGh3c2ltIGNvbW1hbmRzCisgKgorICogQEhXU0lNX0NNRF9VTlNQRUM6IHVuc3BlY2lmaWVkIGNvbW1hbmQgdG8gY2F0Y2ggZXJyb3JzCisgKgorICogQEhXU0lNX0NNRF9SRUdJU1RFUjogcmVxdWVzdCB0byByZWdpc3RlciBhbmQgcmVjZWl2ZWQgYWxsIGJyb2FkY2FzdGVkCisgKglmcmFtZXMgYnkgYW55IG1hYzgwMjExX2h3c2ltIHJhZGlvIGRldmljZS4KKyAqIEBIV1NJTV9DTURfRlJBTUU6IHNlbmQvcmVjZWl2ZSBhIGJyb2FkY2FzdGVkIGZyYW1lIGZyb20vdG8ga2VybmVsL3VzZXIKKyAqIHNwYWNlLCB1c2VzOgorICoJJUhXU0lNX0FUVFJfQUREUl9UUkFOU01JVFRFUiwgJUhXU0lNX0FUVFJfQUREUl9SRUNFSVZFUiwKKyAqCSVIV1NJTV9BVFRSX0ZSQU1FLCAlSFdTSU1fQVRUUl9GTEFHUywgJUhXU0lNX0FUVFJfUlhfUkFURSwKKyAqCSVIV1NJTV9BVFRSX1NJR05BTCwgJUhXU0lNX0FUVFJfQ09PS0lFCisgKiBASFdTSU1fQ01EX1RYX0lORk9fRlJBTUU6IFRyYW5zbWlzc2lvbiBpbmZvIHJlcG9ydCBmcm9tIHVzZXIgc3BhY2UgdG8KKyAqIGtlcm5lbCwgdXNlczoKKyAqCSVIV1NJTV9BVFRSX0FERFJfVFJBTlNNSVRURVIsICVIV1NJTV9BVFRSX0ZMQUdTLAorICoJJUhXU0lNX0FUVFJfVFhfSU5GTywgJUhXU0lNX0FUVFJfU0lHTkFMLCAlSFdTSU1fQVRUUl9DT09LSUUKKyAqIEBfX0hXU0lNX0NNRF9NQVg6IGVudW0gbGltaXQKKyAqLworZW51bSB7CisJSFdTSU1fQ01EX1VOU1BFQywKKwlIV1NJTV9DTURfUkVHSVNURVIsCisJSFdTSU1fQ01EX0ZSQU1FLAorCUhXU0lNX0NNRF9UWF9JTkZPX0ZSQU1FLAorCV9fSFdTSU1fQ01EX01BWCwKK307CisjZGVmaW5lIEhXU0lNX0NNRF9NQVggKF9IV1NJTV9DTURfTUFYIC0gMSkKKworLyoqCisgKiBlbnVtIGh3c2ltX2F0dHJzIC0gaHdzaW0gbmV0bGluayBhdHRyaWJ1dGVzCisgKgorICogQEhXU0lNX0FUVFJfVU5TUEVDOiB1bnNwZWNpZmllZCBhdHRyaWJ1dGUgdG8gY2F0Y2ggZXJyb3JzCisgKgorICogQEhXU0lNX0FUVFJfQUREUl9SRUNFSVZFUjogTUFDIGFkZHJlc3Mgb2YgdGhlIHJhZGlvIGRldmljZSB0aGF0CisgKgl0aGUgZnJhbWUgaXMgYnJvYWRjYXN0ZWQgdG8KKyAqIEBIV1NJTV9BVFRSX0FERFJfVFJBTlNNSVRURVI6IE1BQyBhZGRyZXNzIG9mIHRoZSByYWRpbyBkZXZpY2UgdGhhdAorICoJdGhlIGZyYW1lIHdhcyBicm9hZGNhc3RlZCBmcm9tCisgKiBASFdTSU1fQVRUUl9GUkFNRTogRGF0YSBhcnJheQorICogQEhXU0lNX0FUVFJfRkxBR1M6IG1hYzgwMjExIHRyYW5zbWlzc2lvbiBmbGFncywgdXNlZCB0byBwcm9jZXNzCisJcHJvcGVybHkgdGhlIGZyYW1lIGF0IHVzZXIgc3BhY2UKKyAqIEBIV1NJTV9BVFRSX1JYX1JBVEU6IGVzdGltYXRlZCByeCByYXRlIGluZGV4IGZvciB0aGlzIGZyYW1lIGF0IHVzZXIKKwlzcGFjZQorICogQEhXU0lNX0FUVFJfU0lHTkFMOiBlc3RpbWF0ZWQgUlggc2lnbmFsIGZvciB0aGlzIGZyYW1lIGF0IHVzZXIKKwlzcGFjZQorICogQEhXU0lNX0FUVFJfVFhfSU5GTzogaWVlZTgwMjExX3R4X3JhdGUgYXJyYXkKKyAqIEBIV1NJTV9BVFRSX0NPT0tJRTogc2tfYnVmZiBjb29raWUgdG8gaWRlbnRpZnkgdGhlIGZyYW1lCisgKiBAX19IV1NJTV9BVFRSX01BWDogZW51bSBsaW1pdAorICovCisKKworZW51bSB7CisJSFdTSU1fQVRUUl9VTlNQRUMsCisJSFdTSU1fQVRUUl9BRERSX1JFQ0VJVkVSLAorCUhXU0lNX0FUVFJfQUREUl9UUkFOU01JVFRFUiwKKwlIV1NJTV9BVFRSX0ZSQU1FLAorCUhXU0lNX0FUVFJfRkxBR1MsCisJSFdTSU1fQVRUUl9SWF9SQVRFLAorCUhXU0lNX0FUVFJfU0lHTkFMLAorCUhXU0lNX0FUVFJfVFhfSU5GTywKKwlIV1NJTV9BVFRSX0NPT0tJRSwKKwlfX0hXU0lNX0FUVFJfTUFYLAorfTsKKyNkZWZpbmUgSFdTSU1fQVRUUl9NQVggKF9fSFdTSU1fQVRUUl9NQVggLSAxKQorCisvKioKKyAqIHN0cnVjdCBod3NpbV90eF9yYXRlIC0gcmF0ZSBzZWxlY3Rpb24vc3RhdHVzCisgKgorICogQGlkeDogcmF0ZSBpbmRleCB0byBhdHRlbXB0IHRvIHNlbmQgd2l0aAorICogQGNvdW50OiBudW1iZXIgb2YgdHJpZXMgaW4gdGhpcyByYXRlIGJlZm9yZSBnb2luZyB0byB0aGUgbmV4dCByYXRlCisgKgorICogQSB2YWx1ZSBvZiAtMSBmb3IgQGlkeCBpbmRpY2F0ZXMgYW4gaW52YWxpZCByYXRlIGFuZCwgaWYgdXNlZAorICogaW4gYW4gYXJyYXkgb2YgcmV0cnkgcmF0ZXMsIHRoYXQgbm8gbW9yZSByYXRlcyBzaG91bGQgYmUgdHJpZWQuCisgKgorICogV2hlbiB1c2VkIGZvciB0cmFuc21pdCBzdGF0dXMgcmVwb3J0aW5nLCB0aGUgZHJpdmVyIHNob3VsZAorICogYWx3YXlzIHJlcG9ydCB0aGUgcmF0ZSBhbmQgbnVtYmVyIG9mIHJldHJpZXMgdXNlZC4KKyAqCisgKi8KK3N0cnVjdCBod3NpbV90eF9yYXRlIHsKKwlzOCBpZHg7CisJdTggY291bnQ7Cit9IF9fcGFja2VkOworCisjZW5kaWYgLyogX19NQUM4MDIxMV9IV1NJTV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW4uYwppbmRleCA5MTYxODNkLi4zNGJiYTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuLmMKQEAgLTE4NSwxMyArMTg1LDEyIEBACiAgKgogICogSGFuZGxpbmcgaW5jbHVkZXMgY2hhbmdpbmcgdGhlIGhlYWRlciBmaWVsZHMgaW50byBDUFUgZm9ybWF0LgogICovCi1pbnQgbXdpZmlleF9yZXRfMTFuX2NmZyhzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqcmVzcCwgdm9pZCAqZGF0YV9idWYpCitpbnQgbXdpZmlleF9yZXRfMTFuX2NmZyhzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqcmVzcCwKKwkJCXN0cnVjdCBtd2lmaWV4X2RzXzExbl90eF9jZmcgKnR4X2NmZykKIHsKLQlzdHJ1Y3QgbXdpZmlleF9kc18xMW5fdHhfY2ZnICp0eF9jZmc7CiAJc3RydWN0IGhvc3RfY21kX2RzXzExbl9jZmcgKmh0Y2ZnID0gJnJlc3AtPnBhcmFtcy5odGNmZzsKIAotCWlmIChkYXRhX2J1ZikgewotCQl0eF9jZmcgPSAoc3RydWN0IG13aWZpZXhfZHNfMTFuX3R4X2NmZyAqKSBkYXRhX2J1ZjsKKwlpZiAodHhfY2ZnKSB7CiAJCXR4X2NmZy0+dHhfaHRjYXAgPSBsZTE2X3RvX2NwdShodGNmZy0+aHRfdHhfY2FwKTsKIAkJdHhfY2ZnLT50eF9odGluZm8gPSBsZTE2X3RvX2NwdShodGNmZy0+aHRfdHhfaW5mbyk7CiAJfQpAQCAtMjA4LDExICsyMDcsMTAgQEAKICAqLwogaW50IG13aWZpZXhfY21kX3JlY2ZnX3R4X2J1ZihzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJICAgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLCBpbnQgY21kX2FjdGlvbiwKLQkJCSAgICAgdm9pZCAqZGF0YV9idWYpCisJCQkgICAgIHUxNiAqYnVmX3NpemUpCiB7CiAJc3RydWN0IGhvc3RfY21kX2RzX3R4YnVmX2NmZyAqdHhfYnVmID0gJmNtZC0+cGFyYW1zLnR4X2J1ZjsKIAl1MTYgYWN0aW9uID0gKHUxNikgY21kX2FjdGlvbjsKLQl1MTYgYnVmX3NpemUgPSAqKCh1MTYgKikgZGF0YV9idWYpOwogCiAJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoSG9zdENtZF9DTURfUkVDT05GSUdVUkVfVFhfQlVGRik7CiAJY21kLT5zaXplID0KQEAgLTIyMCw4ICsyMTgsOCBAQAogCXR4X2J1Zi0+YWN0aW9uID0gY3B1X3RvX2xlMTYoYWN0aW9uKTsKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgSG9zdENtZF9BQ1RfR0VOX1NFVDoKLQkJZGV2X2RiZyhwcml2LT5hZGFwdGVyLT5kZXYsICJjbWQ6IHNldCB0eF9idWY9JWRcbiIsIGJ1Zl9zaXplKTsKLQkJdHhfYnVmLT5idWZmX3NpemUgPSBjcHVfdG9fbGUxNihidWZfc2l6ZSk7CisJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LCAiY21kOiBzZXQgdHhfYnVmPSVkXG4iLCAqYnVmX3NpemUpOworCQl0eF9idWYtPmJ1ZmZfc2l6ZSA9IGNwdV90b19sZTE2KCpidWZfc2l6ZSk7CiAJCWJyZWFrOwogCWNhc2UgSG9zdENtZF9BQ1RfR0VOX0dFVDoKIAlkZWZhdWx0OgpAQCAtMjQwLDEzICsyMzgsMTIgQEAKICAqICAgICAgLSBFbnN1cmluZyBjb3JyZWN0IGVuZGlhbi1uZXNzCiAgKi8KIGludCBtd2lmaWV4X2NtZF9hbXNkdV9hZ2dyX2N0cmwoc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKLQkJCQlpbnQgY21kX2FjdGlvbiwgdm9pZCAqZGF0YV9idWYpCisJCQkJaW50IGNtZF9hY3Rpb24sCisJCQkJc3RydWN0IG13aWZpZXhfZHNfMTFuX2Ftc2R1X2FnZ3JfY3RybCAqYWFfY3RybCkKIHsKIAlzdHJ1Y3QgaG9zdF9jbWRfZHNfYW1zZHVfYWdncl9jdHJsICphbXNkdV9jdHJsID0KIAkJJmNtZC0+cGFyYW1zLmFtc2R1X2FnZ3JfY3RybDsKIAl1MTYgYWN0aW9uID0gKHUxNikgY21kX2FjdGlvbjsKLQlzdHJ1Y3QgbXdpZmlleF9kc18xMW5fYW1zZHVfYWdncl9jdHJsICphYV9jdHJsID0KLQkJKHN0cnVjdCBtd2lmaWV4X2RzXzExbl9hbXNkdV9hZ2dyX2N0cmwgKikgZGF0YV9idWY7CiAKIAljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihIb3N0Q21kX0NNRF9BTVNEVV9BR0dSX0NUUkwpOwogCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgaG9zdF9jbWRfZHNfYW1zZHVfYWdncl9jdHJsKQpAQCAtMjcyLDE1ICsyNjksMTMgQEAKICAqIEhhbmRsaW5nIGluY2x1ZGVzIGNoYW5naW5nIHRoZSBoZWFkZXIgZmllbGRzIGludG8gQ1BVIGZvcm1hdC4KICAqLwogaW50IG13aWZpZXhfcmV0X2Ftc2R1X2FnZ3JfY3RybChzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqcmVzcCwKLQkJCQl2b2lkICpkYXRhX2J1ZikKKwkJCQlzdHJ1Y3QgbXdpZmlleF9kc18xMW5fYW1zZHVfYWdncl9jdHJsCisJCQkJKmFtc2R1X2FnZ3JfY3RybCkKIHsKLQlzdHJ1Y3QgbXdpZmlleF9kc18xMW5fYW1zZHVfYWdncl9jdHJsICphbXNkdV9hZ2dyX2N0cmw7CiAJc3RydWN0IGhvc3RfY21kX2RzX2Ftc2R1X2FnZ3JfY3RybCAqYW1zZHVfY3RybCA9CiAJCSZyZXNwLT5wYXJhbXMuYW1zZHVfYWdncl9jdHJsOwogCi0JaWYgKGRhdGFfYnVmKSB7Ci0JCWFtc2R1X2FnZ3JfY3RybCA9Ci0JCQkoc3RydWN0IG13aWZpZXhfZHNfMTFuX2Ftc2R1X2FnZ3JfY3RybCAqKSBkYXRhX2J1ZjsKKwlpZiAoYW1zZHVfYWdncl9jdHJsKSB7CiAJCWFtc2R1X2FnZ3JfY3RybC0+ZW5hYmxlID0gbGUxNl90b19jcHUoYW1zZHVfY3RybC0+ZW5hYmxlKTsKIAkJYW1zZHVfYWdncl9jdHJsLT5jdXJyX2J1Zl9zaXplID0KIAkJCWxlMTZfdG9fY3B1KGFtc2R1X2N0cmwtPmN1cnJfYnVmX3NpemUpOwpAQCAtMjk2LDEyICsyOTEsMTAgQEAKICAqICAgICAgLSBTZXR0aW5nIEhUIFR4IGNhcGFiaWxpdHkgYW5kIEhUIFR4IGluZm9ybWF0aW9uIGZpZWxkcwogICogICAgICAtIEVuc3VyaW5nIGNvcnJlY3QgZW5kaWFuLW5lc3MKICAqLwotaW50IG13aWZpZXhfY21kXzExbl9jZmcoc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKLQkJCXUxNiBjbWRfYWN0aW9uLCB2b2lkICpkYXRhX2J1ZikKK2ludCBtd2lmaWV4X2NtZF8xMW5fY2ZnKHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpjbWQsIHUxNiBjbWRfYWN0aW9uLAorCQkJc3RydWN0IG13aWZpZXhfZHNfMTFuX3R4X2NmZyAqdHhjZmcpCiB7CiAJc3RydWN0IGhvc3RfY21kX2RzXzExbl9jZmcgKmh0Y2ZnID0gJmNtZC0+cGFyYW1zLmh0Y2ZnOwotCXN0cnVjdCBtd2lmaWV4X2RzXzExbl90eF9jZmcgKnR4Y2ZnID0KLQkJKHN0cnVjdCBtd2lmaWV4X2RzXzExbl90eF9jZmcgKikgZGF0YV9idWY7CiAKIAljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihIb3N0Q21kX0NNRF8xMU5fQ0ZHKTsKIAljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGhvc3RfY21kX2RzXzExbl9jZmcpICsgU19EU19HRU4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuLmgKaW5kZXggYTQzOTBhMS4uOTBiNDIxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbi5oCkBAIC0yOSw5ICsyOSw5IEBACiBpbnQgbXdpZmlleF9yZXRfMTFuX2FkZGJhX3JlcShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJICAgICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3ApOwogaW50IG13aWZpZXhfcmV0XzExbl9jZmcoc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3AsCi0JCQl2b2lkICpkYXRhX2J1Zik7Ci1pbnQgbXdpZmlleF9jbWRfMTFuX2NmZyhzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAotCQkJdTE2IGNtZF9hY3Rpb24sIHZvaWQgKmRhdGFfYnVmKTsKKwkJCXN0cnVjdCBtd2lmaWV4X2RzXzExbl90eF9jZmcgKnR4X2NmZyk7CitpbnQgbXdpZmlleF9jbWRfMTFuX2NmZyhzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLCB1MTYgY21kX2FjdGlvbiwKKwkJCXN0cnVjdCBtd2lmaWV4X2RzXzExbl90eF9jZmcgKnR4Y2ZnKTsKIAogaW50IG13aWZpZXhfY21kX2FwcGVuZF8xMW5fdGx2KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkgICAgICAgc3RydWN0IG13aWZpZXhfYnNzZGVzY3JpcHRvciAqYnNzX2Rlc2MsCkBAIC02MiwxMiArNjIsMTQgQEAKIGludCBtd2lmaWV4X2dldF90eF9iYV9zdHJlYW1fdGJsKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkgICAgICAgc3RydWN0IG13aWZpZXhfZHNfdHhfYmFfc3RyZWFtX3RibCAqYnVmKTsKIGludCBtd2lmaWV4X3JldF9hbXNkdV9hZ2dyX2N0cmwoc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3AsCi0JCQkJdm9pZCAqZGF0YV9idWYpOworCQkJCXN0cnVjdCBtd2lmaWV4X2RzXzExbl9hbXNkdV9hZ2dyX2N0cmwKKwkJCQkqYW1zZHVfYWdncl9jdHJsKTsKIGludCBtd2lmaWV4X2NtZF9yZWNmZ190eF9idWYoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCSAgICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKLQkJCSAgICAgaW50IGNtZF9hY3Rpb24sIHZvaWQgKmRhdGFfYnVmKTsKKwkJCSAgICAgaW50IGNtZF9hY3Rpb24sIHUxNiAqYnVmX3NpemUpOwogaW50IG13aWZpZXhfY21kX2Ftc2R1X2FnZ3JfY3RybChzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAotCQkJCWludCBjbWRfYWN0aW9uLCB2b2lkICpkYXRhX2J1Zik7CisJCQkJaW50IGNtZF9hY3Rpb24sCisJCQkJc3RydWN0IG13aWZpZXhfZHNfMTFuX2Ftc2R1X2FnZ3JfY3RybCAqYWFfY3RybCk7CiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIEFNUERVIGlzIGFsbG93ZWQgb3Igbm90IGZvciBhIHBhcnRpY3VsYXIgVElELgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW5fYWdnci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW5fYWdnci5jCmluZGV4IGY4MDc0NDcuLjFhNDUzYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX2FnZ3IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbl9hZ2dyLmMKQEAgLTE2NCwxMiArMTY0LDEzIEBACiAJc3RydWN0IG13aWZpZXhfdHhfcGFyYW0gdHhfcGFyYW07CiAJc3RydWN0IHR4cGQgKnB0eF9wZCA9IE5VTEw7CiAKLQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZwcmFfbGlzdC0+c2tiX2hlYWQpKSB7CisJc2tiX3NyYyA9IHNrYl9wZWVrKCZwcmFfbGlzdC0+c2tiX2hlYWQpOworCWlmICghc2tiX3NyYykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT53bW0ucmFfbGlzdF9zcGlubG9jaywKIAkJCQkgICAgICAgcmFfbGlzdF9mbGFncyk7CiAJCXJldHVybiAwOwogCX0KLQlza2Jfc3JjID0gc2tiX3BlZWsoJnByYV9saXN0LT5za2JfaGVhZCk7CisKIAl0eF9pbmZvX3NyYyA9IE1XSUZJRVhfU0tCX1RYQ0Ioc2tiX3NyYyk7CiAJc2tiX2FnZ3IgPSBkZXZfYWxsb2Nfc2tiKGFkYXB0ZXItPnR4X2J1Zl9zaXplKTsKIAlpZiAoIXNrYl9hZ2dyKSB7CkBAIC0xODQsMTcgKzE4NSwxNSBAQAogCXR4X2luZm9fYWdnci0+YnNzX2luZGV4ID0gdHhfaW5mb19zcmMtPmJzc19pbmRleDsKIAlza2JfYWdnci0+cHJpb3JpdHkgPSBza2Jfc3JjLT5wcmlvcml0eTsKIAotCXdoaWxlIChza2Jfc3JjICYmICgoc2tiX2hlYWRyb29tKHNrYl9hZ2dyKSArIHNrYl9zcmMtPmxlbgotCQkJCQkrIExMQ19TTkFQX0xFTikKLQkJCQk8PSBhZGFwdGVyLT50eF9idWZfc2l6ZSkpIHsKKwlkbyB7CisJCS8qIENoZWNrIGlmIEFNU0RVIGNhbiBhY2NvbW1vZGF0ZSB0aGlzIE1TRFUgKi8KKwkJaWYgKHNrYl90YWlscm9vbShza2JfYWdncikgPCAoc2tiX3NyYy0+bGVuICsgTExDX1NOQVBfTEVOKSkKKwkJCWJyZWFrOwogCi0JCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZwcmFfbGlzdC0+c2tiX2hlYWQpKQotCQkJc2tiX3NyYyA9IHNrYl9kZXF1ZXVlKCZwcmFfbGlzdC0+c2tiX2hlYWQpOwotCQllbHNlCi0JCQlza2Jfc3JjID0gTlVMTDsKKwkJc2tiX3NyYyA9IHNrYl9kZXF1ZXVlKCZwcmFfbGlzdC0+c2tiX2hlYWQpOwogCi0JCWlmIChza2Jfc3JjKQotCQkJcHJhX2xpc3QtPnRvdGFsX3BrdHNfc2l6ZSAtPSBza2Jfc3JjLT5sZW47CisJCXByYV9saXN0LT50b3RhbF9wa3RzX3NpemUgLT0gc2tiX3NyYy0+bGVuOworCQlwcmFfbGlzdC0+dG90YWxfcGt0cy0tOwogCiAJCWF0b21pY19kZWMoJnByaXYtPndtbS50eF9wa3RzX3F1ZXVlZCk7CiAKQEAgLTIxMiwxMSArMjExLDE1IEBACiAJCQlyZXR1cm4gLTE7CiAJCX0KIAotCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmcHJhX2xpc3QtPnNrYl9oZWFkKSkKLQkJCXNrYl9zcmMgPSBza2JfcGVlaygmcHJhX2xpc3QtPnNrYl9oZWFkKTsKLQkJZWxzZQotCQkJc2tiX3NyYyA9IE5VTEw7Ci0JfQorCQlpZiAoc2tiX3RhaWxyb29tKHNrYl9hZ2dyKSA8IHBhZCkgeworCQkJcGFkID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXNrYl9wdXQoc2tiX2FnZ3IsIHBhZCk7CisKKwkJc2tiX3NyYyA9IHNrYl9wZWVrKCZwcmFfbGlzdC0+c2tiX2hlYWQpOworCisJfSB3aGlsZSAoc2tiX3NyYyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT53bW0ucmFfbGlzdF9zcGlubG9jaywgcmFfbGlzdF9mbGFncyk7CiAKQEAgLTIzMCwxMSArMjMzLDE5IEBACiAKIAlza2JfcHVzaChza2JfYWdnciwgaGVhZHJvb20pOwogCi0JdHhfcGFyYW0ubmV4dF9wa3RfbGVuID0gKChwcmFfbGlzdC0+dG90YWxfcGt0c19zaXplKSA/Ci0JCQkJICgoKHByYV9saXN0LT50b3RhbF9wa3RzX3NpemUpID4KLQkJCQkgICBhZGFwdGVyLT50eF9idWZfc2l6ZSkgPyBhZGFwdGVyLT4KLQkJCQkgIHR4X2J1Zl9zaXplIDogcHJhX2xpc3QtPnRvdGFsX3BrdHNfc2l6ZSArCi0JCQkJICBMTENfU05BUF9MRU4gKyBzaXplb2Yoc3RydWN0IHR4cGQpKSA6IDApOworCS8qCisJICogUGFkZGluZyBwZXIgTVNEVSB3aWxsIGFmZmVjdCB0aGUgbGVuZ3RoIG9mIG5leHQKKwkgKiBwYWNrZXQgYW5kIGhlbmNlIHRoZSBleGFjdCBsZW5ndGggb2YgbmV4dCBwYWNrZXQKKwkgKiBpcyB1bmNlcnRhaW4gaGVyZS4KKwkgKgorCSAqIEFsc28sIGFnZ3JlZ2F0aW9uIG9mIHRyYW5zbWlzc2lvbiBidWZmZXIsIHdoaWxlCisJICogZG93bmxvYWRpbmcgdGhlIGRhdGEgdG8gdGhlIGNhcmQsIHdvbnQgZ2FpbiBtdWNoCisJICogb24gdGhlIEFNU0RVIHBhY2tldHMgYXMgdGhlIEFNU0RVIHBhY2tldHMgdXRpbGl6ZXMKKwkgKiB0aGUgdHJhbnNtaXNzaW9uIGJ1ZmZlciBzcGFjZSB0byB0aGUgbWF4aW11bQorCSAqIChhZGFwdGVyLT50eF9idWZfc2l6ZSkuCisJICovCisJdHhfcGFyYW0ubmV4dF9wa3RfbGVuID0gMDsKKwogCXJldCA9IGFkYXB0ZXItPmlmX29wcy5ob3N0X3RvX2NhcmQoYWRhcHRlciwgTVdJRklFWF9UWVBFX0RBVEEsCiAJCQkJCSAgICAgc2tiX2FnZ3ItPmRhdGEsCiAJCQkJCSAgICAgc2tiX2FnZ3ItPmxlbiwgJnR4X3BhcmFtKTsKQEAgLTI1OCw2ICsyNjksNyBAQAogCQlza2JfcXVldWVfdGFpbCgmcHJhX2xpc3QtPnNrYl9oZWFkLCBza2JfYWdncik7CiAKIAkJcHJhX2xpc3QtPnRvdGFsX3BrdHNfc2l6ZSArPSBza2JfYWdnci0+bGVuOworCQlwcmFfbGlzdC0+dG90YWxfcGt0cysrOwogCiAJCWF0b21pY19pbmMoJnByaXYtPndtbS50eF9wa3RzX3F1ZXVlZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX3J4cmVvcmRlci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmMKaW5kZXggZTVkZmRjMy4uN2FhOWFhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmMKQEAgLTMyOCwxMyArMzI4LDEyIEBACiAgKi8KIGludCBtd2lmaWV4X2NtZF8xMW5fYWRkYmFfcnNwX2dlbihzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJCSAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKLQkJCQkgIHZvaWQgKmRhdGFfYnVmKQorCQkJCSAgc3RydWN0IGhvc3RfY21kX2RzXzExbl9hZGRiYV9yZXEKKwkJCQkgICpjbWRfYWRkYmFfcmVxKQogewogCXN0cnVjdCBob3N0X2NtZF9kc18xMW5fYWRkYmFfcnNwICphZGRfYmFfcnNwID0KIAkJKHN0cnVjdCBob3N0X2NtZF9kc18xMW5fYWRkYmFfcnNwICopCiAJCSZjbWQtPnBhcmFtcy5hZGRfYmFfcnNwOwotCXN0cnVjdCBob3N0X2NtZF9kc18xMW5fYWRkYmFfcmVxICpjbWRfYWRkYmFfcmVxID0KLQkJKHN0cnVjdCBob3N0X2NtZF9kc18xMW5fYWRkYmFfcmVxICopIGRhdGFfYnVmOwogCXU4IHRpZDsKIAlpbnQgd2luX3NpemU7CiAJdWludDE2X3QgYmxvY2tfYWNrX3BhcmFtX3NldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX3J4cmVvcmRlci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmgKaW5kZXggZjNjYThjOC4uMDMzYzhhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmgKQEAgLTUyLDggKzUyLDkgQEAKIGludCBtd2lmaWV4X2NtZF8xMW5fZGVsYmEoc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKIAkJCSAgdm9pZCAqZGF0YV9idWYpOwogaW50IG13aWZpZXhfY21kXzExbl9hZGRiYV9yc3BfZ2VuKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZAotCQkJCSAgKmNtZCwgdm9pZCAqZGF0YV9idWYpOworCQkJCSAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkgIHN0cnVjdCBob3N0X2NtZF9kc18xMW5fYWRkYmFfcmVxCisJCQkJICAqY21kX2FkZGJhX3JlcSk7CiBpbnQgbXdpZmlleF9jbWRfMTFuX2FkZGJhX3JlcShzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAogCQkJICAgICAgdm9pZCAqZGF0YV9idWYpOwogdm9pZCBtd2lmaWV4XzExbl9jbGVhbnVwX3Jlb3JkZXJfdGJsKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jCmluZGV4IDY2MDgzMWMuLjM1MmQyYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmMKQEAgLTY3Miw2ICs2NzIsNTkgQEAKIH07CiAKIC8qCisgKiBDRkc4MDIuMTEgb3BlcmF0aW9uIGhhbmRsZXIgZm9yIHNldHRpbmcgYml0IHJhdGVzLgorICoKKyAqIEZ1bmN0aW9uIHNlbGVjdHMgbGVnYWN5IGJhbmcgQi9HL0JHIGZyb20gY29ycmVzcG9uZGluZyBiaXRyYXRlcyBzZWxlY3Rpb24uCisgKiBDdXJyZW50bHkgb25seSAyLjRHSHogYmFuZCBpcyBzdXBwb3J0ZWQuCisgKi8KK3N0YXRpYyBpbnQgbXdpZmlleF9jZmc4MDIxMV9zZXRfYml0cmF0ZV9tYXNrKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQljb25zdCB1OCAqcGVlciwKKwkJCQljb25zdCBzdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrICptYXNrKQoreworCXN0cnVjdCBtd2lmaWV4X2RzX2JhbmRfY2ZnIGJhbmRfY2ZnOworCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPSBtd2lmaWV4X25ldGRldl9nZXRfcHJpdihkZXYpOworCWludCBpbmRleCA9IDAsIG1vZGUgPSAwLCBpOworCisJLyogQ3VycmVudGx5IG9ubHkgMi40R0h6IGlzIHN1cHBvcnRlZCAqLworCWZvciAoaSA9IDA7IGkgPCBtd2lmaWV4X2JhbmRfMmdoei5uX2JpdHJhdGVzOyBpKyspIHsKKwkJLyoKKwkJICogUmF0ZXMgYmVsb3cgNiBNYnBzIGluIHRoZSB0YWJsZSBhcmUgQ0NLIHJhdGVzOyA4MDIuMTFiCisJCSAqIGFuZCBmcm9tIDYgdGhleSBhcmUgT0ZETTsgODAyLjExRworCQkgKi8KKwkJaWYgKG13aWZpZXhfcmF0ZXNbaV0uYml0cmF0ZSA9PSA2MCkgeworCQkJaW5kZXggPSAxIDw8IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChtYXNrLT5jb250cm9sW0lFRUU4MDIxMV9CQU5EXzJHSFpdLmxlZ2FjeSA8IGluZGV4KSB7CisJCW1vZGUgPSBCQU5EX0I7CisJfSBlbHNlIHsKKwkJbW9kZSA9IEJBTkRfRzsKKwkJaWYgKG1hc2stPmNvbnRyb2xbSUVFRTgwMjExX0JBTkRfMkdIWl0ubGVnYWN5ICUgaW5kZXgpCisJCQltb2RlIHw9ICBCQU5EX0I7CisJfQorCisJbWVtc2V0KCZiYW5kX2NmZywgMCwgc2l6ZW9mKGJhbmRfY2ZnKSk7CisJYmFuZF9jZmcuY29uZmlnX2JhbmRzID0gbW9kZTsKKworCWlmIChwcml2LT5ic3NfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJYmFuZF9jZmcuYWRob2Nfc3RhcnRfYmFuZCA9IG1vZGU7CisKKwliYW5kX2NmZy5zZWNfY2hhbl9vZmZzZXQgPSBOT19TRUNfQ0hBTk5FTDsKKworCWlmIChtd2lmaWV4X3NldF9yYWRpb19iYW5kX2NmZyhwcml2LCAmYmFuZF9jZmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXdpcGh5X2RlYnVnKHdpcGh5LCAiaW5mbzogZGV2aWNlIGNvbmZpZ3VyZWQgaW4gODAyLjExJXMlcyBtb2RlXG4iLAorCQkJCShtb2RlICYgQkFORF9CKSA/ICJiIiA6ICIiLAorCQkJCShtb2RlICYgQkFORF9HKSA/ICJnIiA6ICIiKTsKKworCXJldHVybiAwOworfQorCisvKgogICogQ0ZHODAyLjExIG9wZXJhdGlvbiBoYW5kbGVyIGZvciBkaXNjb25uZWN0aW9uIHJlcXVlc3QuCiAgKgogICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3b3JrIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhIGRpc2Nvbm5lY3Rpb24KQEAgLTk2MCw3ICsxMDEzLDcgQEAKIAkJcmV0ID0gbXdpZmlleF9zZXRfZ2VuX2llKHByaXYsIHNtZS0+aWUsIHNtZS0+aWVfbGVuKTsKIAogCWlmIChzbWUtPmtleSkgewotCQlpZiAobXdpZmlleF9pc19hbGdfd2VwKDApIHwgbXdpZmlleF9pc19hbGdfd2VwKDApKSB7CisJCWlmIChtd2lmaWV4X2lzX2FsZ193ZXAocHJpdi0+c2VjX2luZm8uZW5jcnlwdGlvbl9tb2RlKSkgewogCQkJZGV2X2RiZyhwcml2LT5hZGFwdGVyLT5kZXYsCiAJCQkJImluZm86IHNldHRpbmcgd2VwIGVuY3J5cHRpb24iCiAJCQkJIiB3aXRoIGtleSBsZW4gJWRcbiIsIHNtZS0+a2V5X2xlbik7CkBAIC0xMjI1LDYgKzEyNzgsNyBAQAogCS5zZXRfZGVmYXVsdF9rZXkgPSBtd2lmaWV4X2NmZzgwMjExX3NldF9kZWZhdWx0X2tleSwKIAkuc2V0X3Bvd2VyX21nbXQgPSBtd2lmaWV4X2NmZzgwMjExX3NldF9wb3dlcl9tZ210LAogCS5zZXRfdHhfcG93ZXIgPSBtd2lmaWV4X2NmZzgwMjExX3NldF90eF9wb3dlciwKKwkuc2V0X2JpdHJhdGVfbWFzayA9IG13aWZpZXhfY2ZnODAyMTFfc2V0X2JpdHJhdGVfbWFzaywKIH07CiAKIC8qCkBAIC0xMjg4LDYgKzEzNDIsOCBAQAogCiAJKih1bnNpZ25lZCBsb25nICopIHdkZXZfcHJpdiA9ICh1bnNpZ25lZCBsb25nKSBwcml2OwogCisJc2V0X3dpcGh5X2Rldih3ZGV2LT53aXBoeSwgKHN0cnVjdCBkZXZpY2UgKikgcHJpdi0+YWRhcHRlci0+ZGV2KTsKKwogCXJldCA9IHdpcGh5X3JlZ2lzdGVyKHdkZXYtPndpcGh5KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHByaXYtPmFkYXB0ZXItPmRldiwgIiVzOiByZWdpc3RlcmluZyBjZmc4MDIxMSBkZXZpY2VcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NtZGV2dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jbWRldnQuYwppbmRleCBjZDg5ZmVkLi5iNTM1MmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NtZGV2dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY21kZXZ0LmMKQEAgLTEwNCwxMyArMTA0LDExIEBACiAgKiBtYWluIHRocmVhZC4KICAqLwogc3RhdGljIGludCBtd2lmaWV4X2NtZF9ob3N0X2NtZChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAotCQkJCXN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpjbWQsIHZvaWQgKmRhdGFfYnVmKQorCQkJCXN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpjbWQsCisJCQkJc3RydWN0IG13aWZpZXhfZHNfbWlzY19jbWQgKnBjbWRfcHRyKQogewotCXN0cnVjdCBtd2lmaWV4X2RzX21pc2NfY21kICpwY21kX3B0ciA9Ci0JCShzdHJ1Y3QgbXdpZmlleF9kc19taXNjX2NtZCAqKSBkYXRhX2J1ZjsKLQogCS8qIENvcHkgdGhlIEhPU1QgY29tbWFuZCB0byBjb21tYW5kIGJ1ZmZlciAqLwotCW1lbWNweSgodm9pZCAqKSBjbWQsIHBjbWRfcHRyLT5jbWQsIHBjbWRfcHRyLT5sZW4pOworCW1lbWNweShjbWQsIHBjbWRfcHRyLT5jbWQsIHBjbWRfcHRyLT5sZW4pOwogCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LCAiY21kOiBob3N0IGNtZCBzaXplID0gJWRcbiIsIHBjbWRfcHRyLT5sZW4pOwogCXJldHVybiAwOwogfQpAQCAtNzA3LDE1ICs3MDUsMTQgQEAKIAogCWlmIChhZGFwdGVyLT5jdXJyX2NtZC0+Y21kX2ZsYWcgJiBDTURfRl9IT1NUQ01EKSB7CiAJCS8qIENvcHkgb3JpZ2luYWwgcmVzcG9uc2UgYmFjayB0byByZXNwb25zZSBidWZmZXIgKi8KLQkJc3RydWN0IG13aWZpZXhfZHNfbWlzY19jbWQgKmhvc3RjbWQgPSBOVUxMOworCQlzdHJ1Y3QgbXdpZmlleF9kc19taXNjX2NtZCAqaG9zdGNtZDsKIAkJdWludDE2X3Qgc2l6ZSA9IGxlMTZfdG9fY3B1KHJlc3AtPnNpemUpOwogCQlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImluZm86IGhvc3QgY21kIHJlc3Agc2l6ZSA9ICVkXG4iLCBzaXplKTsKIAkJc2l6ZSA9IG1pbl90KHUxNiwgc2l6ZSwgTVdJRklFWF9TSVpFX09GX0NNRF9CVUZGRVIpOwogCQlpZiAoYWRhcHRlci0+Y3Vycl9jbWQtPmRhdGFfYnVmKSB7Ci0JCQlob3N0Y21kID0gKHN0cnVjdCBtd2lmaWV4X2RzX21pc2NfY21kICopCi0JCQkJCQlhZGFwdGVyLT5jdXJyX2NtZC0+ZGF0YV9idWY7CisJCQlob3N0Y21kID0gYWRhcHRlci0+Y3Vycl9jbWQtPmRhdGFfYnVmOwogCQkJaG9zdGNtZC0+bGVuID0gc2l6ZTsKLQkJCW1lbWNweShob3N0Y21kLT5jbWQsICh2b2lkICopIHJlc3AsIHNpemUpOworCQkJbWVtY3B5KGhvc3RjbWQtPmNtZCwgcmVzcCwgc2l6ZSk7CiAJCX0KIAl9CiAJb3JpZ19jbWRyZXNwX25vID0gbGUxNl90b19jcHUocmVzcC0+Y29tbWFuZCk7CkBAIC0xMTU1LDcgKzExNTIsNyBAQAogaW50IG13aWZpZXhfY21kX2VuaF9wb3dlcl9tb2RlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkgICAgICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKIAkJCSAgICAgICB1MTYgY21kX2FjdGlvbiwgdWludDE2X3QgcHNfYml0bWFwLAotCQkJICAgICAgIHZvaWQgKmRhdGFfYnVmKQorCQkJICAgICAgIHN0cnVjdCBtd2lmaWV4X2RzX2F1dG9fZHMgKmF1dG9fZHMpCiB7CiAJc3RydWN0IGhvc3RfY21kX2RzXzgwMl8xMV9wc19tb2RlX2VuaCAqcHNtb2RlX2VuaCA9CiAJCSZjbWQtPnBhcmFtcy5wc21vZGVfZW5oOwpAQCAtMTIxOCw5ICsxMjE1LDggQEAKIAkJCQkJc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2hlYWRlcikpOwogCQkJY21kX3NpemUgKz0gc2l6ZW9mKCphdXRvX2RzX3Rsdik7CiAJCQl0bHYgKz0gc2l6ZW9mKCphdXRvX2RzX3Rsdik7Ci0JCQlpZiAoZGF0YV9idWYpCi0JCQkJaWRsZXRpbWUgPSAoKHN0cnVjdCBtd2lmaWV4X2RzX2F1dG9fZHMgKikKLQkJCQkJICAgICBkYXRhX2J1ZiktPmlkbGVfdGltZTsKKwkJCWlmIChhdXRvX2RzKQorCQkJCWlkbGV0aW1lID0gYXV0b19kcy0+aWRsZV90aW1lOwogCQkJZGV2X2RiZyhwcml2LT5hZGFwdGVyLT5kZXYsCiAJCQkJCSJjbWQ6IFBTIENvbW1hbmQ6IEVudGVyIEF1dG8gRGVlcCBTbGVlcFxuIik7CiAJCQlhdXRvX2RzX3Rsdi0+ZGVlcF9zbGVlcF90aW1lb3V0ID0gY3B1X3RvX2xlMTYoaWRsZXRpbWUpOwpAQCAtMTIzOSw3ICsxMjM1LDcgQEAKICAqLwogaW50IG13aWZpZXhfcmV0X2VuaF9wb3dlcl9tb2RlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkgICAgICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3AsCi0JCQkgICAgICAgdm9pZCAqZGF0YV9idWYpCisJCQkgICAgICAgc3RydWN0IG13aWZpZXhfZHNfcG1fY2ZnICpwbV9jZmcpCiB7CiAJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CiAJc3RydWN0IGhvc3RfY21kX2RzXzgwMl8xMV9wc19tb2RlX2VuaCAqcHNfbW9kZSA9CkBAIC0xMjgyLDEwICsxMjc4LDggQEAKIAogCQlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImNtZDogcHNfYml0bWFwPSUjeFxuIiwgcHNfYml0bWFwKTsKIAotCQlpZiAoZGF0YV9idWYpIHsKKwkJaWYgKHBtX2NmZykgewogCQkJLyogVGhpcyBzZWN0aW9uIGlzIGZvciBnZXQgcG93ZXIgc2F2ZSBtb2RlICovCi0JCQlzdHJ1Y3QgbXdpZmlleF9kc19wbV9jZmcgKnBtX2NmZyA9Ci0JCQkJCShzdHJ1Y3QgbXdpZmlleF9kc19wbV9jZmcgKilkYXRhX2J1ZjsKIAkJCWlmIChwc19iaXRtYXAgJiBCSVRNQVBfU1RBX1BTKQogCQkJCXBtX2NmZy0+cGFyYW0ucHNfbW9kZSA9IDE7CiAJCQllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZGVidWdmcy5jCmluZGV4IDQ2ZDY1ZTAuLmQyNmE3OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZGVidWdmcy5jCkBAIC0yNyw4ICsyNyw4IEBACiAKIHN0YXRpYyBjaGFyICpic3NfbW9kZXNbXSA9IHsKIAkiVW5rbm93biIsCi0JIk1hbmFnZWQiLAogCSJBZC1ob2MiLAorCSJNYW5hZ2VkIiwKIAkiQXV0byIKIH07CiAKQEAgLTIxNiwyOCArMjE2LDE5IEBACiAJcCArPSBzcHJpbnRmKHAsICJic3NfbW9kZT1cIiVzXCJcbiIsIGJzc19tb2Rlc1tpbmZvLmJzc19tb2RlXSk7CiAJcCArPSBzcHJpbnRmKHAsICJtZWRpYV9zdGF0ZT1cIiVzXCJcbiIsCiAJCSAgICAgKCFwcml2LT5tZWRpYV9jb25uZWN0ZWQgPyAiRGlzY29ubmVjdGVkIiA6ICJDb25uZWN0ZWQiKSk7Ci0JcCArPSBzcHJpbnRmKHAsICJtYWNfYWRkcmVzcz1cIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XCJcbiIsCi0JCSAgICAgbmV0ZGV2LT5kZXZfYWRkclswXSwgbmV0ZGV2LT5kZXZfYWRkclsxXSwKLQkJICAgICBuZXRkZXYtPmRldl9hZGRyWzJdLCBuZXRkZXYtPmRldl9hZGRyWzNdLAotCQkgICAgIG5ldGRldi0+ZGV2X2FkZHJbNF0sIG5ldGRldi0+ZGV2X2FkZHJbNV0pOworCXAgKz0gc3ByaW50ZihwLCAibWFjX2FkZHJlc3M9XCIlcE1cIlxuIiwgbmV0ZGV2LT5kZXZfYWRkcik7CiAKIAlpZiAoR0VUX0JTU19ST0xFKHByaXYpID09IE1XSUZJRVhfQlNTX1JPTEVfU1RBKSB7CiAJCXAgKz0gc3ByaW50ZihwLCAibXVsdGljYXN0X2NvdW50PVwiJWRcIlxuIiwKIAkJCSAgICAgbmV0ZGV2X21jX2NvdW50KG5ldGRldikpOwogCQlwICs9IHNwcmludGYocCwgImVzc2lkPVwiJXNcIlxuIiwgaW5mby5zc2lkLnNzaWQpOwotCQlwICs9IHNwcmludGYocCwgImJzc2lkPVwiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcIlxuIiwKLQkJCSAgICAgaW5mby5ic3NpZFswXSwgaW5mby5ic3NpZFsxXSwKLQkJCSAgICAgaW5mby5ic3NpZFsyXSwgaW5mby5ic3NpZFszXSwKLQkJCSAgICAgaW5mby5ic3NpZFs0XSwgaW5mby5ic3NpZFs1XSk7CisJCXAgKz0gc3ByaW50ZihwLCAiYnNzaWQ9XCIlcE1cIlxuIiwgaW5mby5ic3NpZCk7CiAJCXAgKz0gc3ByaW50ZihwLCAiY2hhbm5lbD1cIiVkXCJcbiIsIChpbnQpIGluZm8uYnNzX2NoYW4pOwogCQlwICs9IHNwcmludGYocCwgInJlZ2lvbl9jb2RlID0gXCIlMDJ4XCJcbiIsIGluZm8ucmVnaW9uX2NvZGUpOwogCiAJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBuZXRkZXYpCi0JCQlwICs9IHNwcmludGYocCwgIm11bHRpY2FzdF9hZGRyZXNzWyVkXT0iCi0JCQkJICAgICAiXCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFwiXG4iLCBpKyssCi0JCQkJICAgICBoYS0+YWRkclswXSwgaGEtPmFkZHJbMV0sCi0JCQkJICAgICBoYS0+YWRkclsyXSwgaGEtPmFkZHJbM10sCi0JCQkJICAgICBoYS0+YWRkcls0XSwgaGEtPmFkZHJbNV0pOworCQkJcCArPSBzcHJpbnRmKHAsICJtdWx0aWNhc3RfYWRkcmVzc1slZF09XCIlcE1cIlxuIiwKKwkJCQkJaSsrLCBoYS0+YWRkcik7CiAJfQogCiAJcCArPSBzcHJpbnRmKHAsICJudW1fdHhfYnl0ZXMgPSAlbHVcbiIsIHByaXYtPnN0YXRzLnR4X2J5dGVzKTsKQEAgLTQ1MSwyNiArNDQyLDE4IEBACiAJaWYgKGluZm8udHhfdGJsX251bSkgewogCQlwICs9IHNwcmludGYocCwgIlR4IEJBIHN0cmVhbSB0YWJsZTpcbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgaW5mby50eF90YmxfbnVtOyBpKyspCi0JCQlwICs9IHNwcmludGYocCwgInRpZCA9ICVkLCAiCi0JCQkJICAgICAicmEgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkgICAgIGluZm8udHhfdGJsW2ldLnRpZCwgaW5mby50eF90YmxbaV0ucmFbMF0sCi0JCQkJICAgICBpbmZvLnR4X3RibFtpXS5yYVsxXSwgaW5mby50eF90YmxbaV0ucmFbMl0sCi0JCQkJICAgICBpbmZvLnR4X3RibFtpXS5yYVszXSwgaW5mby50eF90YmxbaV0ucmFbNF0sCi0JCQkJICAgICBpbmZvLnR4X3RibFtpXS5yYVs1XSk7CisJCQlwICs9IHNwcmludGYocCwgInRpZCA9ICVkLCByYSA9ICVwTVxuIiwKKwkJCQkgICAgIGluZm8udHhfdGJsW2ldLnRpZCwgaW5mby50eF90YmxbaV0ucmEpOwogCX0KIAogCWlmIChpbmZvLnJ4X3RibF9udW0pIHsKIAkJcCArPSBzcHJpbnRmKHAsICJSeCByZW9yZGVyIHRhYmxlOlxuIik7CiAJCWZvciAoaSA9IDA7IGkgPCBpbmZvLnJ4X3RibF9udW07IGkrKykgewotCi0JCQlwICs9IHNwcmludGYocCwgInRpZCA9ICVkLCAiCi0JCQkJICAgICAidGEgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCwgIgorCQkJcCArPSBzcHJpbnRmKHAsICJ0aWQgPSAlZCwgdGEgPSAlcE0sICIKIAkJCQkgICAgICJzdGFydF93aW4gPSAlZCwgIgogCQkJCSAgICAgIndpbl9zaXplID0gJWQsIGJ1ZmZlcjogIiwKIAkJCQkgICAgIGluZm8ucnhfdGJsW2ldLnRpZCwKLQkJCQkgICAgIGluZm8ucnhfdGJsW2ldLnRhWzBdLCBpbmZvLnJ4X3RibFtpXS50YVsxXSwKLQkJCQkgICAgIGluZm8ucnhfdGJsW2ldLnRhWzJdLCBpbmZvLnJ4X3RibFtpXS50YVszXSwKLQkJCQkgICAgIGluZm8ucnhfdGJsW2ldLnRhWzRdLCBpbmZvLnJ4X3RibFtpXS50YVs1XSwKKwkJCQkgICAgIGluZm8ucnhfdGJsW2ldLnRhLAogCQkJCSAgICAgaW5mby5yeF90YmxbaV0uc3RhcnRfd2luLAogCQkJCSAgICAgaW5mby5yeF90YmxbaV0ud2luX3NpemUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2RlY2wuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZGVjbC5oCmluZGV4IDBlOTBiMDkuLjk0ZGRjOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZGVjbC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZGVjbC5oCkBAIC0zMCw3ICszMCw5IEBACiAKICNkZWZpbmUgTVdJRklFWF9NQVhfQlNTX05VTSAgICAgICAgICgxKQogCi0jZGVmaW5lIE1XSUZJRVhfTUlOX0RBVEFfSEVBREVSX0xFTiAzMgkvKiAoc2l6ZW9mKG13aWZpZXhfdHhwZCkpICovCisjZGVmaW5lIE1XSUZJRVhfTUlOX0RBVEFfSEVBREVSX0xFTiAzNgkvKiBzaXplb2YobXdpZmlleF90eHBkKQorCQkJCQkgKiAgICsgNCBieXRlIGFsaWdubWVudAorCQkJCQkgKi8KIAogI2RlZmluZSBNV0lGSUVYX01BWF9UWF9CQVNUUkVBTV9TVVBQT1JURUQJMgogI2RlZmluZSBNV0lGSUVYX01BWF9SWF9CQVNUUkVBTV9TVVBQT1JURUQJMTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZncuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZncuaAppbmRleCBhZmRkMTQ1Li40ZmVlMDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2Z3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9mdy5oCkBAIC0xNTcsNiArMTU3LDE3IEBACiAjZGVmaW5lIElTU1VQUF9SWFNUQkMoRG90MTFuRGV2Q2FwKSAoRG90MTFuRGV2Q2FwICYgQklUKDI2KSkKICNkZWZpbmUgSVNTVVBQX0dSRUVORklFTEQoRG90MTFuRGV2Q2FwKSAoRG90MTFuRGV2Q2FwICYgQklUKDI5KSkKIAorLyogaHR0eGNmZyBiaXRtYXAKKyAqIDAJCXJlc2VydmVkCisgKiAxCQkyMC80MCBNaHogZW5hYmxlKDEpL2Rpc2FibGUoMCkKKyAqIDItMwkJcmVzZXJ2ZWQKKyAqIDQJCWdyZWVuIGZpZWxkIGVuYWJsZSgxKS9kaXNhYmxlKDApCisgKiA1CQlzaG9ydCBHSSBpbiAyMCBNaHogZW5hYmxlKDEpL2Rpc2FibGUoMCkKKyAqIDYJCXNob3J0IEdJIGluIDQwIE1oeiBlbmFibGUoMSkvZGlzYWJsZSgwKQorICogNy0xNQkJcmVzZXJ2ZWQKKyAqLworI2RlZmluZSBNV0lGSUVYX0ZXX0RFRl9IVFRYQ0ZHIChCSVQoMSkgfCBCSVQoNCkgfCBCSVQoNSkgfCBCSVQoNikpCisKICNkZWZpbmUgR0VUX1JYTUNTU1VQUChEZXZNQ1NTdXBwb3J0ZWQpIChEZXZNQ1NTdXBwb3J0ZWQgJiAweDBmKQogI2RlZmluZSBTRVRIVF9NQ1MzMih4KSAoeFs0XSB8PSAxKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2lvY3RsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2lvY3RsLmgKaW5kZXggN2MxYzVlZS4uZjZiY2M4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9pb2N0bC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvaW9jdGwuaApAQCAtMjQ5LDYgKzI0OSw3IEBACiB9OwogCiAjZGVmaW5lIERFRVBfU0xFRVBfT04gIDEKKyNkZWZpbmUgREVFUF9TTEVFUF9PRkYgMAogI2RlZmluZSBERUVQX1NMRUVQX0lETEVfVElNRQkxMDAKICNkZWZpbmUgUFNfTU9ERV9BVVRPCQkxCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvam9pbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9qb2luLmMKaW5kZXggNWVhYjNkYy4uNjQ0ZTJlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9qb2luLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9qb2luLmMKQEAgLTM2NCwxMCArMzY0LDkgQEAKICAqLwogaW50IG13aWZpZXhfY21kXzgwMl8xMV9hc3NvY2lhdGUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCQkgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKLQkJCQkgdm9pZCAqZGF0YV9idWYpCisJCQkJIHN0cnVjdCBtd2lmaWV4X2Jzc2Rlc2NyaXB0b3IgKmJzc19kZXNjKQogewogCXN0cnVjdCBob3N0X2NtZF9kc184MDJfMTFfYXNzb2NpYXRlICphc3NvYyA9ICZjbWQtPnBhcmFtcy5hc3NvY2lhdGU7Ci0Jc3RydWN0IG13aWZpZXhfYnNzZGVzY3JpcHRvciAqYnNzX2Rlc2M7CiAJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfc3NpZF9wYXJhbV9zZXQgKnNzaWRfdGx2OwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3BoeV9wYXJhbV9zZXQgKnBoeV90bHY7CiAJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfc3NfcGFyYW1fc2V0ICpzc190bHY7CkBAIC0zODAsNyArMzc5LDYgQEAKIAl1OCAqcG9zOwogCWludCByc25faWVfbGVuID0gMDsKIAotCWJzc19kZXNjID0gKHN0cnVjdCBtd2lmaWV4X2Jzc2Rlc2NyaXB0b3IgKikgZGF0YV9idWY7CiAJcG9zID0gKHU4ICopIGFzc29jOwogCiAJbXdpZmlleF9jZmdfdHhfYnVmKHByaXYsIGJzc19kZXNjKTsKQEAgLTc0OCw3ICs3NDYsOCBAQAogICovCiBpbnQKIG13aWZpZXhfY21kXzgwMl8xMV9hZF9ob2Nfc3RhcnQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKLQkJCQlzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLCB2b2lkICpkYXRhX2J1ZikKKwkJCQlzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCXN0cnVjdCBtd2lmaWV4XzgwMl8xMV9zc2lkICpyZXFfc3NpZCkKIHsKIAlpbnQgcnNuX2llX2xlbiA9IDA7CiAJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CkBAIC03ODYsMjAgKzc4NSwxNSBAQAogCiAJbWVtc2V0KGFkaG9jX3N0YXJ0LT5zc2lkLCAwLCBJRUVFODAyMTFfTUFYX1NTSURfTEVOKTsKIAotCW1lbWNweShhZGhvY19zdGFydC0+c3NpZCwKLQkgICAgICAgKChzdHJ1Y3QgbXdpZmlleF84MDJfMTFfc3NpZCAqKSBkYXRhX2J1ZiktPnNzaWQsCi0JICAgICAgICgoc3RydWN0IG13aWZpZXhfODAyXzExX3NzaWQgKikgZGF0YV9idWYpLT5zc2lkX2xlbik7CisJbWVtY3B5KGFkaG9jX3N0YXJ0LT5zc2lkLCByZXFfc3NpZC0+c3NpZCwgcmVxX3NzaWQtPnNzaWRfbGVuKTsKIAogCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiaW5mbzogQURIT0NfU19DTUQ6IFNTSUQgPSAlc1xuIiwKIAkJCQlhZGhvY19zdGFydC0+c3NpZCk7CiAKIAltZW1zZXQoYnNzX2Rlc2MtPnNzaWQuc3NpZCwgMCwgSUVFRTgwMjExX01BWF9TU0lEX0xFTik7Ci0JbWVtY3B5KGJzc19kZXNjLT5zc2lkLnNzaWQsCi0JICAgICAgICgoc3RydWN0IG13aWZpZXhfODAyXzExX3NzaWQgKikgZGF0YV9idWYpLT5zc2lkLAotCSAgICAgICAoKHN0cnVjdCBtd2lmaWV4XzgwMl8xMV9zc2lkICopIGRhdGFfYnVmKS0+c3NpZF9sZW4pOworCW1lbWNweShic3NfZGVzYy0+c3NpZC5zc2lkLCByZXFfc3NpZC0+c3NpZCwgcmVxX3NzaWQtPnNzaWRfbGVuKTsKIAotCWJzc19kZXNjLT5zc2lkLnNzaWRfbGVuID0KLQkJKChzdHJ1Y3QgbXdpZmlleF84MDJfMTFfc3NpZCAqKSBkYXRhX2J1ZiktPnNzaWRfbGVuOworCWJzc19kZXNjLT5zc2lkLnNzaWRfbGVuID0gcmVxX3NzaWQtPnNzaWRfbGVuOwogCiAJLyogU2V0IHRoZSBCU1MgbW9kZSAqLwogCWFkaG9jX3N0YXJ0LT5ic3NfbW9kZSA9IEhvc3RDbWRfQlNTX01PREVfSUJTUzsKQEAgLTEwMzYsMTMgKzEwMzAsMTIgQEAKICAqLwogaW50CiBtd2lmaWV4X2NtZF84MDJfMTFfYWRfaG9jX2pvaW4oc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLCB2b2lkICpkYXRhX2J1ZikKKwkJCSAgICAgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAorCQkJICAgICAgIHN0cnVjdCBtd2lmaWV4X2Jzc2Rlc2NyaXB0b3IgKmJzc19kZXNjKQogewogCWludCByc25faWVfbGVuID0gMDsKIAlzdHJ1Y3QgaG9zdF9jbWRfZHNfODAyXzExX2FkX2hvY19qb2luICphZGhvY19qb2luID0KIAkJJmNtZC0+cGFyYW1zLmFkaG9jX2pvaW47Ci0Jc3RydWN0IG13aWZpZXhfYnNzZGVzY3JpcHRvciAqYnNzX2Rlc2MgPQotCQkoc3RydWN0IG13aWZpZXhfYnNzZGVzY3JpcHRvciAqKSBkYXRhX2J1ZjsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19jaGFuX2xpc3RfcGFyYW1fc2V0ICpjaGFuX3RsdjsKIAl1MzIgY21kX2FwcGVuZF9zaXplID0gMDsKIAl1MTYgdG1wX2NhcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9tYWluLmMKaW5kZXggZjA1ODIyNS4uZTVmYzUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9tYWluLmMKQEAgLTI2LDE3ICsyNiwxMiBAQAogCiBjb25zdCBjaGFyIGRyaXZlcl92ZXJzaW9uW10gPSAibXdpZmlleCAiIFZFUlNJT04gIiAoJXMpICI7CiAKLXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmdfYWRhcHRlcjsKLUVYUE9SVF9TWU1CT0xfR1BMKGdfYWRhcHRlcik7Ci0KIHN0YXRpYyBzdHJ1Y3QgbXdpZmlleF9ic3NfYXR0ciBtd2lmaWV4X2Jzc19zdGFbXSA9IHsKIAl7TVdJRklFWF9CU1NfVFlQRV9TVEEsIE1XSUZJRVhfREFUQV9GUkFNRV9UWVBFX0VUSF9JSSwgdHJ1ZSwgMCwgMH0sCiB9OwogCiBzdGF0aWMgaW50IGRydl9tb2RlID0gRFJWX01PREVfU1RBOwogCi1zdGF0aWMgY2hhciBmd19uYW1lWzMyXSA9IERFRkFVTFRfRldfTkFNRTsKLQogLyogU3VwcG9ydGVkIGRydl9tb2RlIHRhYmxlICovCiBzdGF0aWMgc3RydWN0IG13aWZpZXhfZHJ2X21vZGUgbXdpZmlleF9kcnZfbW9kZV90YmxbXSA9IHsKIAl7CkBAIC02Miw3ICs1Nyw4IEBACiAgKiBwcm9wZXIgY2xlYW51cCBiZWZvcmUgZXhpdGluZy4KICAqLwogc3RhdGljIGludCBtd2lmaWV4X3JlZ2lzdGVyKHZvaWQgKmNhcmQsIHN0cnVjdCBtd2lmaWV4X2lmX29wcyAqaWZfb3BzLAotCQkJICAgIHN0cnVjdCBtd2lmaWV4X2Rydl9tb2RlICpkcnZfbW9kZV9wdHIpCisJCQkgICAgc3RydWN0IG13aWZpZXhfZHJ2X21vZGUgKmRydl9tb2RlX3B0ciwKKwkJCSAgICB2b2lkICoqcGFkYXB0ZXIpCiB7CiAJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcjsKIAlpbnQgaTsKQEAgLTcxLDcgKzY3LDcgQEAKIAlpZiAoIWFkYXB0ZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZ19hZGFwdGVyID0gYWRhcHRlcjsKKwkqcGFkYXB0ZXIgPSBhZGFwdGVyOwogCWFkYXB0ZXItPmNhcmQgPSBjYXJkOwogCiAJLyogU2F2ZSBpbnRlcmZhY2Ugc3BlY2lmaWMgb3BlcmF0aW9ucyBpbiBhZGFwdGVyICovCkBAIC0zMjYsNyArMzIyLDcgQEAKICAqIGFuZCBpbml0aWFsaXppbmcgdGhlIHByaXZhdGUgc3RydWN0dXJlcy4KICAqLwogc3RhdGljIGludAotbXdpZmlleF9pbml0X3N3KHZvaWQgKmNhcmQsIHN0cnVjdCBtd2lmaWV4X2lmX29wcyAqaWZfb3BzKQorbXdpZmlleF9pbml0X3N3KHZvaWQgKmNhcmQsIHN0cnVjdCBtd2lmaWV4X2lmX29wcyAqaWZfb3BzLCB2b2lkICoqcGFkYXB0ZXIpCiB7CiAJaW50IGk7CiAJc3RydWN0IG13aWZpZXhfZHJ2X21vZGUgKmRydl9tb2RlX3B0cjsKQEAgLTM0NSw3ICszNDEsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKG13aWZpZXhfcmVnaXN0ZXIoY2FyZCwgaWZfb3BzLCBkcnZfbW9kZV9wdHIpKQorCWlmIChtd2lmaWV4X3JlZ2lzdGVyKGNhcmQsIGlmX29wcywgZHJ2X21vZGVfcHRyLCBwYWRhcHRlcikpCiAJCXJldHVybiAtMTsKIAogCXJldHVybiAwOwpAQCAtMzg0LDIwICszODAsOCBAQAogCiAJbWVtc2V0KCZmdywgMCwgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2Z3X2ltYWdlKSk7CiAKLQlzd2l0Y2ggKGFkYXB0ZXItPnJldmlzaW9uX2lkKSB7Ci0JY2FzZSBTRDg3ODdfVzA6Ci0JY2FzZSBTRDg3ODdfVzE6Ci0JCXN0cmNweShmd19uYW1lLCBTRDg3ODdfVzFfRldfTkFNRSk7Ci0JCWJyZWFrOwotCWNhc2UgU0Q4Nzg3X0EwOgotCWNhc2UgU0Q4Nzg3X0ExOgotCQlzdHJjcHkoZndfbmFtZSwgU0Q4Nzg3X0FYX0ZXX05BTUUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZhZGFwdGVyLT5maXJtd2FyZSwgZndfbmFtZSwgYWRhcHRlci0+ZGV2KTsKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZhZGFwdGVyLT5maXJtd2FyZSwgYWRhcHRlci0+ZndfbmFtZSwKKwkJCSAgICAgICBhZGFwdGVyLT5kZXYpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAicmVxdWVzdF9maXJtd2FyZSgpIHJldHVybmVkIgogCQkJCSIgZXJyb3IgY29kZSAlI3hcbiIsIGVycik7CkBAIC01NjksNyArNTUzLDcgQEAKIG13aWZpZXhfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCiB7CiAJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiA9IG13aWZpZXhfbmV0ZGV2X2dldF9wcml2KGRldik7Ci0Jc3RydWN0IHNvY2thZGRyICpod19hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSBhZGRyOworCXN0cnVjdCBzb2NrYWRkciAqaHdfYWRkciA9IGFkZHI7CiAJaW50IHJldDsKIAogCW1lbWNweShwcml2LT5jdXJyX2FkZHIsIGh3X2FkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKQEAgLTg2OSwxMyArODUzLDExIEBACiAJaWYgKGRvd25faW50ZXJydXB0aWJsZShzZW0pKQogCQlnb3RvIGV4aXRfc2VtX2VycjsKIAotCWlmIChtd2lmaWV4X2luaXRfc3coY2FyZCwgaWZfb3BzKSkgeworCWlmIChtd2lmaWV4X2luaXRfc3coY2FyZCwgaWZfb3BzLCAodm9pZCAqKikmYWRhcHRlcikpIHsKIAkJcHJfZXJyKCIlczogc29mdHdhcmUgaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJZ290byBlcnJfaW5pdF9zdzsKIAl9CiAKLQlhZGFwdGVyID0gZ19hZGFwdGVyOwotCiAJYWRhcHRlci0+aHdfc3RhdHVzID0gTVdJRklFWF9IV19TVEFUVVNfSU5JVElBTElaSU5HOwogCWFkYXB0ZXItPnN1cnByaXNlX3JlbW92ZWQgPSBmYWxzZTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhZGFwdGVyLT5pbml0X3dhaXRfcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCmluZGV4IDgzMTZiM2MuLjIyMTVjM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSAiZncuaCIKIAogZXh0ZXJuIGNvbnN0IGNoYXIgZHJpdmVyX3ZlcnNpb25bXTsKLWV4dGVybiBzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICpnX2FkYXB0ZXI7CiAKIGVudW0gewogCU1XSUZJRVhfQVNZTkNfQ01ELApAQCAtNDgsMTUgKzQ3LDYgQEAKIAogI2RlZmluZSBEUlZfTU9ERV9TVEEgICAgICAgMHgxCiAKLSNkZWZpbmUgU0Q4Nzg3X1cwICAgMHgzMAotI2RlZmluZSBTRDg3ODdfVzEgICAweDMxCi0jZGVmaW5lIFNEODc4N19BMCAgIDB4NDAKLSNkZWZpbmUgU0Q4Nzg3X0ExICAgMHg0MQotCi0jZGVmaW5lIERFRkFVTFRfRldfTkFNRSAibXJ2bC9zZDg3ODdfdWFwc3RhLmJpbiIKLSNkZWZpbmUgU0Q4Nzg3X1cxX0ZXX05BTUUgIm1ydmwvc2Q4Nzg3X3VhcHN0YV93MS5iaW4iCi0jZGVmaW5lIFNEODc4N19BWF9GV19OQU1FICJtcnZsL3NkODc4N191YXBzdGEuYmluIgotCiBzdHJ1Y3QgbXdpZmlleF9kcnZfbW9kZSB7CiAJdTE2IGRydl9tb2RlOwogCXUxNiBpbnRmX251bTsKQEAgLTE5MCw2ICsxODAsNyBAQAogCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX2hlYWQ7CiAJdTggcmFbRVRIX0FMRU5dOwogCXUzMiB0b3RhbF9wa3RzX3NpemU7CisJdTMyIHRvdGFsX3BrdHM7CiAJdTMyIGlzXzExbl9lbmFibGVkOwogfTsKIApAQCAtNTc2LDEwICs1NjcsMTAgQEAKIAl1OCBwcml2X251bTsKIAlzdHJ1Y3QgbXdpZmlleF9kcnZfbW9kZSAqZHJ2X21vZGU7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKKwljaGFyIGZ3X25hbWVbMzJdOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlib29sIHN1cnByaXNlX3JlbW92ZWQ7CiAJdTMyIGZ3X3JlbGVhc2VfbnVtYmVyOwotCXUzMiByZXZpc2lvbl9pZDsKIAl1MTYgaW5pdF93YWl0X3Ffd29rZW47CiAJd2FpdF9xdWV1ZV9oZWFkX3QgaW5pdF93YWl0X3E7CiAJdm9pZCAqY2FyZDsKQEAgLTc0NSwxMCArNzM2LDEwIEBACiBpbnQgbXdpZmlleF9jbWRfZW5oX3Bvd2VyX21vZGUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCSAgICAgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAogCQkJICAgICAgIHUxNiBjbWRfYWN0aW9uLCB1aW50MTZfdCBwc19iaXRtYXAsCi0JCQkgICAgICAgdm9pZCAqZGF0YV9idWYpOworCQkJICAgICAgIHN0cnVjdCBtd2lmaWV4X2RzX2F1dG9fZHMgKmF1dG9fZHMpOwogaW50IG13aWZpZXhfcmV0X2VuaF9wb3dlcl9tb2RlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkgICAgICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3AsCi0JCQkgICAgICAgdm9pZCAqZGF0YV9idWYpOworCQkJICAgICAgIHN0cnVjdCBtd2lmaWV4X2RzX3BtX2NmZyAqcG1fY2ZnKTsKIHZvaWQgbXdpZmlleF9wcm9jZXNzX2hzX2NvbmZpZyhzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgbXdpZmlleF9oc19hY3RpdmF0ZWRfZXZlbnQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJdTggYWN0aXZhdGVkKTsKQEAgLTc2MCw3ICs3NTEsNyBAQAogCQkJICAgIHUxNiBjbWRfYWN0aW9uLCB1MzIgY21kX29pZCwKIAkJCSAgICB2b2lkICpkYXRhX2J1Ziwgdm9pZCAqY21kX2J1Zik7CiBpbnQgbXdpZmlleF9wcm9jZXNzX3N0YV9jbWRyZXNwKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKiwgdTE2IGNtZHJlc3Bfbm8sCi0JCQkJdm9pZCAqY21kX2J1Zik7CisJCQkJc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3ApOwogaW50IG13aWZpZXhfcHJvY2Vzc19zdGFfcnhfcGFja2V0KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKiwKIAkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwogaW50IG13aWZpZXhfcHJvY2Vzc19zdGFfZXZlbnQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqKTsKQEAgLTc2OSw3ICs3NjAsNyBAQAogaW50IG13aWZpZXhfc2Nhbl9uZXR3b3JrcyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJICBjb25zdCBzdHJ1Y3QgbXdpZmlleF91c2VyX3NjYW5fY2ZnICp1c2VyX3NjYW5faW4pOwogaW50IG13aWZpZXhfY21kXzgwMl8xMV9zY2FuKHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpjbWQsCi0JCQkgICAgdm9pZCAqZGF0YV9idWYpOworCQkJICAgIHN0cnVjdCBtd2lmaWV4X3NjYW5fY21kX2NvbmZpZyAqc2Nhbl9jZmcpOwogdm9pZCBtd2lmaWV4X3F1ZXVlX3NjYW5fY21kKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkgICAgc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZF9ub2RlKTsKIGludCBtd2lmaWV4X3JldF84MDJfMTFfc2NhbihzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LApAQCAtNzg2LDggKzc3Nyw4IEBACiBpbnQgbXdpZmlleF9hc3NvY2lhdGUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJICAgICAgc3RydWN0IG13aWZpZXhfYnNzZGVzY3JpcHRvciAqYnNzX2Rlc2MpOwogaW50IG13aWZpZXhfY21kXzgwMl8xMV9hc3NvY2lhdGUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKLQkJCQkgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQKLQkJCQkgKmNtZCwgdm9pZCAqZGF0YV9idWYpOworCQkJCSBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCSBzdHJ1Y3QgbXdpZmlleF9ic3NkZXNjcmlwdG9yICpic3NfZGVzYyk7CiBpbnQgbXdpZmlleF9yZXRfODAyXzExX2Fzc29jaWF0ZShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJCSBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqcmVzcCk7CiB2b2lkIG13aWZpZXhfcmVzZXRfY29ubmVjdF9zdGF0ZShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2KTsKQEAgLTgwMCwxMCArNzkxLDEwIEBACiAJCSAgICAgICBzdHJ1Y3QgbXdpZmlleF9ic3NkZXNjcmlwdG9yICpic3NfZGVzYyk7CiBpbnQgbXdpZmlleF9jbWRfODAyXzExX2FkX2hvY19zdGFydChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJCSAgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAotCQkJCSAgICB2b2lkICpkYXRhX2J1Zik7CisJCQkJICAgIHN0cnVjdCBtd2lmaWV4XzgwMl8xMV9zc2lkICpyZXFfc3NpZCk7CiBpbnQgbXdpZmlleF9jbWRfODAyXzExX2FkX2hvY19qb2luKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkJICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKLQkJCQkgICB2b2lkICpkYXRhX2J1Zik7CisJCQkJICAgc3RydWN0IG13aWZpZXhfYnNzZGVzY3JpcHRvciAqYnNzX2Rlc2MpOwogaW50IG13aWZpZXhfcmV0XzgwMl8xMV9hZF9ob2Moc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCSAgICAgIHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpyZXNwKTsKIGludCBtd2lmaWV4X2NtZF84MDJfMTFfYmdfc2Nhbl9xdWVyeShzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kKTsKQEAgLTkzOCw2ICs5MjksNyBAQAogCQkJICAgICAgc3RydWN0IG13aWZpZXhfZHNfaHNfY2ZnICpoc2NmZyk7CiBpbnQgbXdpZmlleF9jYW5jZWxfaHMoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgaW50IGNtZF90eXBlKTsKIGludCBtd2lmaWV4X2VuYWJsZV9ocyhzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBtd2lmaWV4X2Rpc2FibGVfYXV0b19kcyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2KTsKIGludCBtd2lmaWV4X2dldF9zaWduYWxfaW5mbyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJICAgIHN0cnVjdCBtd2lmaWV4X2RzX2dldF9zaWduYWwgKnNpZ25hbCk7CiBpbnQgbXdpZmlleF9kcnZfZ2V0X2RhdGFfcmF0ZShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NjYW4uYwppbmRleCA1YzIyODYwLi42Zjg4YzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NjYW4uYwpAQCAtMjM1NywxMiArMjM1NywxMCBAQAogICogICAgICAtIFNldHRpbmcgY29tbWFuZCBJRCwgYW5kIHByb3BlciBzaXplCiAgKiAgICAgIC0gRW5zdXJpbmcgY29ycmVjdCBlbmRpYW4tbmVzcwogICovCi1pbnQgbXdpZmlleF9jbWRfODAyXzExX3NjYW4oc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwgdm9pZCAqZGF0YV9idWYpCitpbnQgbXdpZmlleF9jbWRfODAyXzExX3NjYW4oc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCSAgICBzdHJ1Y3QgbXdpZmlleF9zY2FuX2NtZF9jb25maWcgKnNjYW5fY2ZnKQogewogCXN0cnVjdCBob3N0X2NtZF9kc184MDJfMTFfc2NhbiAqc2Nhbl9jbWQgPSAmY21kLT5wYXJhbXMuc2NhbjsKLQlzdHJ1Y3QgbXdpZmlleF9zY2FuX2NtZF9jb25maWcgKnNjYW5fY2ZnOwotCi0Jc2Nhbl9jZmcgPSAoc3RydWN0IG13aWZpZXhfc2Nhbl9jbWRfY29uZmlnICopIGRhdGFfYnVmOwogCiAJLyogU2V0IGZpeGVkIGZpZWxkIHZhcmlhYmxlcyBpbiBzY2FuIGNvbW1hbmQgKi8KIAlzY2FuX2NtZC0+YnNzX21vZGUgPSBzY2FuX2NmZy0+YnNzX21vZGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5jCmluZGV4IGQ0MjVkYmQuLjgyMDk4YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5jCkBAIC0zMSwxMCArMzEsMjcgQEAKIAogI2RlZmluZSBTRElPX1ZFUlNJT04JIjEuMCIKIAorLyogVGhlIG13aWZpZXhfc2Rpb19yZW1vdmUoKSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbgorICogdXNlciByZW1vdmVzIHRoaXMgbW9kdWxlIGZyb20ga2VybmVsIHNwYWNlIG9yIGVqZWN0cworICogdGhlIGNhcmQgZnJvbSB0aGUgc2xvdC4gVGhlIGRyaXZlciBoYW5kbGVzIHRoZXNlIDIgY2FzZXMKKyAqIGRpZmZlcmVudGx5LgorICogSWYgdGhlIHVzZXIgaXMgcmVtb3ZpbmcgdGhlIG1vZHVsZSwgdGhlIGZldyBjb21tYW5kcyAoRlVOQ19TSFVURE9XTiwKKyAqIEhTX0NBTkNFTCBldGMuKSBhcmUgc2VudCB0byB0aGUgZmlybXdhcmUuCisgKiBJZiB0aGUgY2FyZCBpcyByZW1vdmVkLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgdGhlc2UgY29tbWFuZC4KKyAqCisgKiBUaGUgdmFyaWFibGUgJ3VzZXJfcm1tb2QnIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgdHdvCisgKiBzY2VuYXJpb3MuIFRoaXMgZmxhZyBpcyBpbml0aWFsaXplZCBhcyBGQUxTRSBpbiBjYXNlIHRoZSBjYXJkCisgKiBpcyByZW1vdmVkLCBhbmQgd2lsbCBiZSBzZXQgdG8gVFJVRSBmb3IgbW9kdWxlIHJlbW92YWwgd2hlbgorICogbW9kdWxlX2V4aXQgZnVuY3Rpb24gaXMgY2FsbGVkLgorICovCitzdGF0aWMgdTggdXNlcl9ybW1vZDsKKwogc3RhdGljIHN0cnVjdCBtd2lmaWV4X2lmX29wcyBzZGlvX29wczsKIAogc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgYWRkX3JlbW92ZV9jYXJkX3NlbTsKIAorc3RhdGljIGludCBtd2lmaWV4X3NkaW9fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CisKIC8qCiAgKiBTRElPIHByb2JlLgogICoKQEAgLTkzLDE3ICsxMTAsMzkgQEAKIG13aWZpZXhfc2Rpb19yZW1vdmUoc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKIHsKIAlzdHJ1Y3Qgc2Rpb19tbWNfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyOworCWludCBpOwogCiAJcHJfZGVidWcoImluZm86IFNESU8gZnVuYyBudW09JWRcbiIsIGZ1bmMtPm51bSk7CiAKLQlpZiAoZnVuYykgewotCQljYXJkID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKLQkJaWYgKGNhcmQpIHsKLQkJCW13aWZpZXhfcmVtb3ZlX2NhcmQoY2FyZC0+YWRhcHRlciwKLQkJCQkJJmFkZF9yZW1vdmVfY2FyZF9zZW0pOwotCQkJa2ZyZWUoY2FyZCk7Ci0JCX0KKwljYXJkID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKKwlpZiAoIWNhcmQpCisJCXJldHVybjsKKworCWFkYXB0ZXIgPSBjYXJkLT5hZGFwdGVyOworCWlmICghYWRhcHRlciB8fCAhYWRhcHRlci0+cHJpdl9udW0pCisJCXJldHVybjsKKworCWlmICh1c2VyX3JtbW9kKSB7CisJCWlmIChhZGFwdGVyLT5pc19zdXNwZW5kZWQpCisJCQltd2lmaWV4X3NkaW9fcmVzdW1lKGFkYXB0ZXItPmRldik7CisKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnByaXZfbnVtOyBpKyspCisJCQlpZiAoKEdFVF9CU1NfUk9MRShhZGFwdGVyLT5wcml2W2ldKSA9PQorCQkJCQkJTVdJRklFWF9CU1NfUk9MRV9TVEEpICYmCisJCQkJCWFkYXB0ZXItPnByaXZbaV0tPm1lZGlhX2Nvbm5lY3RlZCkKKwkJCQltd2lmaWV4X2RlYXV0aGVudGljYXRlKGFkYXB0ZXItPnByaXZbaV0sIE5VTEwpOworCisJCW13aWZpZXhfZGlzYWJsZV9hdXRvX2RzKG13aWZpZXhfZ2V0X3ByaXYoYWRhcHRlciwKKwkJCQkJCQkgTVdJRklFWF9CU1NfUk9MRV9BTlkpKTsKKworCQltd2lmaWV4X2luaXRfc2h1dGRvd25fZncobXdpZmlleF9nZXRfcHJpdihhZGFwdGVyLAorCQkJCQkJTVdJRklFWF9CU1NfUk9MRV9BTlkpLAorCQkJCQkgTVdJRklFWF9GVU5DX1NIVVRET1dOKTsKIAl9CisKKwltd2lmaWV4X3JlbW92ZV9jYXJkKGNhcmQtPmFkYXB0ZXIsICZhZGRfcmVtb3ZlX2NhcmRfc2VtKTsKKwlrZnJlZShjYXJkKTsKIH0KIAogLyoKQEAgLTEyODMsNyArMTMyMiw3IEBACiAJCQkJaWYgKCEoY2FyZC0+bXBfd3JfYml0bWFwICYKIAkJCQkJCSgxIDw8IGNhcmQtPmN1cnJfd3JfcG9ydCkpCiAJCQkJCQl8fCAhTVBfVFhfQUdHUl9CVUZfSEFTX1JPT00oCi0JCQkJCQkJY2FyZCwgbmV4dF9wa3RfbGVuKSkKKwkJCQkJCWNhcmQsIHBrdF9sZW4gKyBuZXh0X3BrdF9sZW4pKQogCQkJCQlmX3NlbmRfYWdncl9idWYgPSAxOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBObyByb29tIGluIEFnZ3IgYnVmLCBzZW5kIGl0ICovCkBAIC0xNTMxLDYgKzE1NzAsNyBAQAogCXNkaW9fc2V0X2RydmRhdGEoZnVuYywgY2FyZCk7CiAKIAlhZGFwdGVyLT5kZXYgPSAmZnVuYy0+ZGV2OworCXN0cmNweShhZGFwdGVyLT5md19uYW1lLCBTRDg3ODdfREVGQVVMVF9GV19OQU1FKTsKIAogCXJldHVybiAwOwogCkBAIC0xNTUyLDcgKzE1OTIsNiBAQAogICogICAgICAgIHRoZSBmaXJzdCBpbnRlcnJ1cHQgZ290IGZyb20gYm9vdGxvYWRlcgogICogICAgICAtIERpc2FibGUgaG9zdCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgogICogICAgICAtIEdldCBTRElPIHBvcnQKLSAqICAgICAgLSBHZXQgcmV2aXNpb24gSUQKICAqICAgICAgLSBJbml0aWFsaXplIFNESU8gdmFyaWFibGVzIGluIGNhcmQKICAqICAgICAgLSBBbGxvY2F0ZSBNUCByZWdpc3RlcnMKICAqICAgICAgLSBBbGxvY2F0ZSBNUEEgVHggYW5kIFJ4IGJ1ZmZlcnMKQEAgLTE1NzYsMTAgKzE2MTUsNiBAQAogCS8qIEdldCBTRElPIGlvcG9ydCAqLwogCW13aWZpZXhfaW5pdF9zZGlvX2lvcG9ydChhZGFwdGVyKTsKIAotCS8qIEdldCByZXZpc2lvbiBJRCAqLwotI2RlZmluZSBSRVZfSURfUkVHCTB4NWMKLQltd2lmaWV4X3JlYWRfcmVnKGFkYXB0ZXIsIFJFVl9JRF9SRUcsICZhZGFwdGVyLT5yZXZpc2lvbl9pZCk7Ci0KIAkvKiBJbml0aWFsaXplIFNESU8gdmFyaWFibGVzIGluIGNhcmQgKi8KIAljYXJkLT5tcF9yZF9iaXRtYXAgPSAwOwogCWNhcmQtPm1wX3dyX2JpdG1hcCA9IDA7CkBAIC0xNzAwLDYgKzE3MzUsOSBAQAogewogCXNlbWFfaW5pdCgmYWRkX3JlbW92ZV9jYXJkX3NlbSwgMSk7CiAKKwkvKiBDbGVhciB0aGUgZmxhZyBpbiBjYXNlIHVzZXIgcmVtb3ZlcyB0aGUgY2FyZC4gKi8KKwl1c2VyX3JtbW9kID0gMDsKKwogCXJldHVybiBzZGlvX3JlZ2lzdGVyX2RyaXZlcigmbXdpZmlleF9zZGlvKTsKIH0KIApAQCAtMTcxNSwzMiArMTc1MywxMiBAQAogc3RhdGljIHZvaWQKIG13aWZpZXhfc2Rpb19jbGVhbnVwX21vZHVsZSh2b2lkKQogewotCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBnX2FkYXB0ZXI7Ci0JaW50IGk7CisJaWYgKCFkb3duX2ludGVycnVwdGlibGUoJmFkZF9yZW1vdmVfY2FyZF9zZW0pKQorCQl1cCgmYWRkX3JlbW92ZV9jYXJkX3NlbSk7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhZGRfcmVtb3ZlX2NhcmRfc2VtKSkKLQkJZ290byBleGl0X3NlbV9lcnI7CisJLyogU2V0IHRoZSBmbGFnIGFzIHVzZXIgaXMgcmVtb3ZpbmcgdGhpcyBtb2R1bGUuICovCisJdXNlcl9ybW1vZCA9IDE7CiAKLQlpZiAoIWFkYXB0ZXIgfHwgIWFkYXB0ZXItPnByaXZfbnVtKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAoYWRhcHRlci0+aXNfc3VzcGVuZGVkKQotCQltd2lmaWV4X3NkaW9fcmVzdW1lKGFkYXB0ZXItPmRldik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cHJpdl9udW07IGkrKykKLQkJaWYgKChHRVRfQlNTX1JPTEUoYWRhcHRlci0+cHJpdltpXSkgPT0gTVdJRklFWF9CU1NfUk9MRV9TVEEpICYmCi0JCSAgICBhZGFwdGVyLT5wcml2W2ldLT5tZWRpYV9jb25uZWN0ZWQpCi0JCQltd2lmaWV4X2RlYXV0aGVudGljYXRlKGFkYXB0ZXItPnByaXZbaV0sIE5VTEwpOwotCi0JaWYgKCFhZGFwdGVyLT5zdXJwcmlzZV9yZW1vdmVkKQotCQltd2lmaWV4X2luaXRfc2h1dGRvd25fZncobXdpZmlleF9nZXRfcHJpdihhZGFwdGVyLAotCQkJCQkJCSAgTVdJRklFWF9CU1NfUk9MRV9BTlkpLAotCQkJCQkgTVdJRklFWF9GVU5DX1NIVVRET1dOKTsKLQotZXhpdDoKLQl1cCgmYWRkX3JlbW92ZV9jYXJkX3NlbSk7Ci0KLWV4aXRfc2VtX2VycjoKIAlzZGlvX3VucmVnaXN0ZXJfZHJpdmVyKCZtd2lmaWV4X3NkaW8pOwogfQogCkBAIC0xNzUxLDQgKzE3NjksNCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXJ2ZWxsIFdpRmktRXggU0RJTyBEcml2ZXIgdmVyc2lvbiAiIFNESU9fVkVSU0lPTik7CiBNT0RVTEVfVkVSU0lPTihTRElPX1ZFUlNJT04pOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0ZJUk1XQVJFKCJzZDg3ODcuYmluIik7CitNT0RVTEVfRklSTVdBUkUoIm1ydmwvc2Q4Nzg3X3VhcHN0YS5iaW4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKaW5kZXggNGU5N2U5MC4uNTI0Zjc4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKQEAgLTI4LDYgKzI4LDggQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAorI2RlZmluZSBTRDg3ODdfREVGQVVMVF9GV19OQU1FICJtcnZsL3NkODc4N191YXBzdGEuYmluIgorCiAjZGVmaW5lIEJMT0NLX01PREUJMQogI2RlZmluZSBCWVRFX01PREUJMAogCkBAIC01MiwxMCArNTQsMTAgQEAKIAogI2RlZmluZSBTRElPX01QX0FHR1JfREVGX1BLVF9MSU1JVAk4CiAKLSNkZWZpbmUgU0RJT19NUF9UWF9BR0dSX0RFRl9CVUZfU0laRSAgICAgICAgKDQwOTYpCS8qIDRLICovCisjZGVmaW5lIFNESU9fTVBfVFhfQUdHUl9ERUZfQlVGX1NJWkUgICAgICAgICg4MTkyKQkvKiA4SyAqLwogCiAvKiBNdWx0aSBwb3J0IFJYIGFnZ3JlZ2F0aW9uIGJ1ZmZlciBzaXplICovCi0jZGVmaW5lIFNESU9fTVBfUlhfQUdHUl9ERUZfQlVGX1NJWkUgICAgICAgICg0MDk2KQkvKiA0SyAqLworI2RlZmluZSBTRElPX01QX1JYX0FHR1JfREVGX0JVRl9TSVpFICAgICAgICAoMTYzODQpCS8qIDE2SyAqLwogCiAvKiBNaXNjLiBDb25maWcgUmVnaXN0ZXIgOiBBdXRvIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCiAjZGVmaW5lIEFVVE9fUkVfRU5BQkxFX0lOVCAgICAgICAgICAgICAgQklUKDQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZC5jCmluZGV4IDhhZjNhNzguLmM1NGVlMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZC5jCkBAIC02NywxMCArNjcsOSBAQAogICovCiBzdGF0aWMgaW50IG13aWZpZXhfY21kX21hY19jb250cm9sKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkJICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKLQkJCQkgICB1MTYgY21kX2FjdGlvbiwgdm9pZCAqZGF0YV9idWYpCisJCQkJICAgdTE2IGNtZF9hY3Rpb24sIHUxNiAqYWN0aW9uKQogewogCXN0cnVjdCBob3N0X2NtZF9kc19tYWNfY29udHJvbCAqbWFjX2N0cmwgPSAmY21kLT5wYXJhbXMubWFjX2N0cmw7Ci0JdTE2IGFjdGlvbiA9ICooKHUxNiAqKSBkYXRhX2J1Zik7CiAKIAlpZiAoY21kX2FjdGlvbiAhPSBIb3N0Q21kX0FDVF9HRU5fU0VUKSB7CiAJCWRldl9lcnIocHJpdi0+YWRhcHRlci0+ZGV2LApAQCAtODEsNyArODAsNyBAQAogCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KEhvc3RDbWRfQ01EX01BQ19DT05UUk9MKTsKIAljbWQtPnNpemUgPQogCQljcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGhvc3RfY21kX2RzX21hY19jb250cm9sKSArIFNfRFNfR0VOKTsKLQltYWNfY3RybC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoYWN0aW9uKTsKKwltYWNfY3RybC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoKmFjdGlvbik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNCwxMCArMTAzLDkgQEAKIHN0YXRpYyBpbnQgbXdpZmlleF9jbWRfODAyXzExX3NubXBfbWliKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkJICAgICAgIHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpjbWQsCiAJCQkJICAgICAgIHUxNiBjbWRfYWN0aW9uLCB1MzIgY21kX29pZCwKLQkJCQkgICAgICAgdm9pZCAqZGF0YV9idWYpCisJCQkJICAgICAgIHUzMiAqdWxfdGVtcCkKIHsKIAlzdHJ1Y3QgaG9zdF9jbWRfZHNfODAyXzExX3NubXBfbWliICpzbm1wX21pYiA9ICZjbWQtPnBhcmFtcy5zbWliOwotCXUzMiB1bF90ZW1wOwogCiAJZGV2X2RiZyhwcml2LT5hZGFwdGVyLT5kZXYsICJjbWQ6IFNOTVBfQ01EOiBjbWRfb2lkID0gMHgleFxuIiwgY21kX29pZCk7CiAJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoSG9zdENtZF9DTURfODAyXzExX1NOTVBfTUlCKTsKQEAgLTEyNyw5ICsxMjUsOCBAQAogCQlpZiAoY21kX2FjdGlvbiA9PSBIb3N0Q21kX0FDVF9HRU5fU0VUKSB7CiAJCQlzbm1wX21pYi0+cXVlcnlfdHlwZSA9IGNwdV90b19sZTE2KEhvc3RDbWRfQUNUX0dFTl9TRVQpOwogCQkJc25tcF9taWItPmJ1Zl9zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHUxNikpOwotCQkJdWxfdGVtcCA9ICooKHUzMiAqKSBkYXRhX2J1Zik7CiAJCQkqKChfX2xlMTYgKikgKHNubXBfbWliLT52YWx1ZSkpID0KLQkJCQljcHVfdG9fbGUxNigodTE2KSB1bF90ZW1wKTsKKwkJCQljcHVfdG9fbGUxNigodTE2KSAqdWxfdGVtcCk7CiAJCQljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShjbWQtPnNpemUpCiAJCQkJKyBzaXplb2YodTE2KSk7CiAJCX0KQEAgLTEzOSw5ICsxMzYsOCBAQAogCQlpZiAoY21kX2FjdGlvbiA9PSBIb3N0Q21kX0FDVF9HRU5fU0VUKSB7CiAJCQlzbm1wX21pYi0+cXVlcnlfdHlwZSA9IGNwdV90b19sZTE2KEhvc3RDbWRfQUNUX0dFTl9TRVQpOwogCQkJc25tcF9taWItPmJ1Zl9zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHUxNikpOwotCQkJdWxfdGVtcCA9ICooKHUzMiAqKSBkYXRhX2J1Zik7CiAJCQkqKF9fbGUxNiAqKSAoc25tcF9taWItPnZhbHVlKSA9Ci0JCQkJY3B1X3RvX2xlMTYoKHUxNikgdWxfdGVtcCk7CisJCQkJY3B1X3RvX2xlMTYoKHUxNikgKnVsX3RlbXApOwogCQkJY21kLT5zaXplID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoY21kLT5zaXplKQogCQkJCSsgc2l6ZW9mKHUxNikpOwogCQl9CkBAIC0xNTIsOSArMTQ4LDggQEAKIAkJaWYgKGNtZF9hY3Rpb24gPT0gSG9zdENtZF9BQ1RfR0VOX1NFVCkgewogCQkJc25tcF9taWItPnF1ZXJ5X3R5cGUgPSBjcHVfdG9fbGUxNihIb3N0Q21kX0FDVF9HRU5fU0VUKTsKIAkJCXNubXBfbWliLT5idWZfc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZih1MTYpKTsKLQkJCXVsX3RlbXAgPSAoKih1MzIgKikgZGF0YV9idWYpOwogCQkJKigoX19sZTE2ICopIChzbm1wX21pYi0+dmFsdWUpKSA9Ci0JCQkJY3B1X3RvX2xlMTYoKHUxNikgdWxfdGVtcCk7CisJCQkJY3B1X3RvX2xlMTYoKHUxNikgKnVsX3RlbXApOwogCQkJY21kLT5zaXplID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoY21kLT5zaXplKQogCQkJCSsgc2l6ZW9mKHUxNikpOwogCQl9CkBAIC0xNjQsOSArMTU5LDggQEAKIAkJaWYgKGNtZF9hY3Rpb24gPT0gSG9zdENtZF9BQ1RfR0VOX1NFVCkgewogCQkJc25tcF9taWItPnF1ZXJ5X3R5cGUgPSBjcHVfdG9fbGUxNihIb3N0Q21kX0FDVF9HRU5fU0VUKTsKIAkJCXNubXBfbWliLT5idWZfc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZih1MTYpKTsKLQkJCXVsX3RlbXAgPSAqKHUzMiAqKSBkYXRhX2J1ZjsKIAkJCSooKF9fbGUxNiAqKSAoc25tcF9taWItPnZhbHVlKSkgPQotCQkJCWNwdV90b19sZTE2KCh1MTYpIHVsX3RlbXApOworCQkJCWNwdV90b19sZTE2KCh1MTYpICp1bF90ZW1wKTsKIAkJCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGNtZC0+c2l6ZSkKIAkJCQkrIHNpemVvZih1MTYpKTsKIAkJfQpAQCAtMjA5LDEzICsyMDMsMTEgQEAKICAqLwogc3RhdGljIGludCBtd2lmaWV4X2NtZF90eF9yYXRlX2NmZyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJCSAgIHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpjbWQsCi0JCQkJICAgdTE2IGNtZF9hY3Rpb24sIHZvaWQgKmRhdGFfYnVmKQorCQkJCSAgIHUxNiBjbWRfYWN0aW9uLCB1MTYgKnBiaXRtYXBfcmF0ZXMpCiB7CiAJc3RydWN0IGhvc3RfY21kX2RzX3R4X3JhdGVfY2ZnICpyYXRlX2NmZyA9ICZjbWQtPnBhcmFtcy50eF9yYXRlX2NmZzsKIAlzdHJ1Y3QgbXdpZmlleF9yYXRlX3Njb3BlICpyYXRlX3Njb3BlOwogCXN0cnVjdCBtd2lmaWV4X3JhdGVfZHJvcF9wYXR0ZXJuICpyYXRlX2Ryb3A7Ci0JdTE2ICpwYml0bWFwX3JhdGVzID0gKHUxNiAqKSBkYXRhX2J1ZjsKLQogCXUzMiBpOwogCiAJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoSG9zdENtZF9DTURfVFhfUkFURV9DRkcpOwpAQCAtMjcyLDEwICsyNjQsMTAgQEAKICAqICAgICAgLSBFbnN1cmluZyBjb3JyZWN0IGVuZGlhbi1uZXNzCiAgKi8KIHN0YXRpYyBpbnQgbXdpZmlleF9jbWRfdHhfcG93ZXJfY2ZnKHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpjbWQsCi0JCQkJICAgIHUxNiBjbWRfYWN0aW9uLCB2b2lkICpkYXRhX2J1ZikKKwkJCQkgICAgdTE2IGNtZF9hY3Rpb24sCisJCQkJICAgIHN0cnVjdCBob3N0X2NtZF9kc190eHB3cl9jZmcgKnR4cCkKIHsKIAlzdHJ1Y3QgbXdpZmlleF90eXBlc19wb3dlcl9ncm91cCAqcGdfdGx2OwotCXN0cnVjdCBob3N0X2NtZF9kc190eHB3cl9jZmcgKnR4cDsKIAlzdHJ1Y3QgaG9zdF9jbWRfZHNfdHhwd3JfY2ZnICpjbWRfdHhwX2NmZyA9ICZjbWQtPnBhcmFtcy50eHBfY2ZnOwogCiAJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoSG9zdENtZF9DTURfVFhQV1JfQ0ZHKTsKQEAgLTI4MywxMiArMjc1LDExIEBACiAJCWNwdV90b19sZTE2KFNfRFNfR0VOICsgc2l6ZW9mKHN0cnVjdCBob3N0X2NtZF9kc190eHB3cl9jZmcpKTsKIAlzd2l0Y2ggKGNtZF9hY3Rpb24pIHsKIAljYXNlIEhvc3RDbWRfQUNUX0dFTl9TRVQ6Ci0JCXR4cCA9IChzdHJ1Y3QgaG9zdF9jbWRfZHNfdHhwd3JfY2ZnICopIGRhdGFfYnVmOwogCQlpZiAodHhwLT5tb2RlKSB7CiAJCQlwZ190bHYgPSAoc3RydWN0IG13aWZpZXhfdHlwZXNfcG93ZXJfZ3JvdXAKLQkJCQkgICopICgodW5zaWduZWQgbG9uZykgZGF0YV9idWYgKworCQkJCSAgKikgKCh1bnNpZ25lZCBsb25nKSB0eHAgKwogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBob3N0X2NtZF9kc190eHB3cl9jZmcpKTsKLQkJCW1lbW1vdmUoY21kX3R4cF9jZmcsIGRhdGFfYnVmLAorCQkJbWVtbW92ZShjbWRfdHhwX2NmZywgdHhwLAogCQkJCXNpemVvZihzdHJ1Y3QgaG9zdF9jbWRfZHNfdHhwd3JfY2ZnKSArCiAJCQkJc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X3R5cGVzX3Bvd2VyX2dyb3VwKSArCiAJCQkJcGdfdGx2LT5sZW5ndGgpOwpAQCAtMzAwLDggKzI5MSw3IEBACiAJCQkJICBzaXplb2Yoc3RydWN0IG13aWZpZXhfdHlwZXNfcG93ZXJfZ3JvdXApICsKIAkJCQkgIHBnX3Rsdi0+bGVuZ3RoKTsKIAkJfSBlbHNlIHsKLQkJCW1lbW1vdmUoY21kX3R4cF9jZmcsIGRhdGFfYnVmLAotCQkJCXNpemVvZihzdHJ1Y3QgaG9zdF9jbWRfZHNfdHhwd3JfY2ZnKSk7CisJCQltZW1tb3ZlKGNtZF90eHBfY2ZnLCB0eHAsIHNpemVvZigqdHhwKSk7CiAJCX0KIAkJY21kX3R4cF9jZmctPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOwogCQlicmVhazsKQEAgLTMyMiwyMiArMzEyLDIzIEBACiAgKiAgICAgICAgKGFzIHJlcXVpcmVkKQogICogICAgICAtIEVuc3VyaW5nIGNvcnJlY3QgZW5kaWFuLW5lc3MKICAqLwotc3RhdGljIGludCBtd2lmaWV4X2NtZF84MDJfMTFfaHNfY2ZnKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCi0JCQkJICAgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAotCQkJCSAgICAgdTE2IGNtZF9hY3Rpb24sCi0JCQkJICAgICBzdHJ1Y3QgbXdpZmlleF9oc19jb25maWdfcGFyYW0gKmRhdGFfYnVmKQorc3RhdGljIGludAorbXdpZmlleF9jbWRfODAyXzExX2hzX2NmZyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAorCQkJICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAorCQkJICB1MTYgY21kX2FjdGlvbiwKKwkJCSAgc3RydWN0IG13aWZpZXhfaHNfY29uZmlnX3BhcmFtICpoc2NmZ19wYXJhbSkKIHsKIAlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKIAlzdHJ1Y3QgaG9zdF9jbWRfZHNfODAyXzExX2hzX2NmZ19lbmggKmhzX2NmZyA9ICZjbWQtPnBhcmFtcy5vcHRfaHNfY2ZnOwogCXUxNiBoc19hY3RpdmF0ZSA9IGZhbHNlOwogCi0JaWYgKGRhdGFfYnVmID09IE5VTEwpCisJaWYgKCFoc2NmZ19wYXJhbSkKIAkJLyogTmV3IEFjdGl2YXRlIGNvbW1hbmQgKi8KIAkJaHNfYWN0aXZhdGUgPSB0cnVlOwogCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KEhvc3RDbWRfQ01EXzgwMl8xMV9IU19DRkdfRU5IKTsKIAogCWlmICghaHNfYWN0aXZhdGUgJiYKLQkgICAgKGRhdGFfYnVmLT5jb25kaXRpb25zCisJICAgIChoc2NmZ19wYXJhbS0+Y29uZGl0aW9ucwogCSAgICAhPSBjcHVfdG9fbGUzMihIT1NUX1NMRUVQX0NGR19DQU5DRUwpKQogCSAgICAmJiAoKGFkYXB0ZXItPmFycF9maWx0ZXJfc2l6ZSA+IDApCiAJCSYmIChhZGFwdGVyLT5hcnBfZmlsdGVyX3NpemUgPD0gQVJQX0ZJTFRFUl9NQVhfQlVGX1NJWkUpKSkgewpAQCAtMzU5LDkgKzM1MCw5IEBACiAJCWhzX2NmZy0+cGFyYW1zLmhzX2FjdGl2YXRlLnJlc3BfY3RybCA9IFJFU1BfTkVFREVEOwogCX0gZWxzZSB7CiAJCWhzX2NmZy0+YWN0aW9uID0gY3B1X3RvX2xlMTYoSFNfQ09ORklHVVJFKTsKLQkJaHNfY2ZnLT5wYXJhbXMuaHNfY29uZmlnLmNvbmRpdGlvbnMgPSBkYXRhX2J1Zi0+Y29uZGl0aW9uczsKLQkJaHNfY2ZnLT5wYXJhbXMuaHNfY29uZmlnLmdwaW8gPSBkYXRhX2J1Zi0+Z3BpbzsKLQkJaHNfY2ZnLT5wYXJhbXMuaHNfY29uZmlnLmdhcCA9IGRhdGFfYnVmLT5nYXA7CisJCWhzX2NmZy0+cGFyYW1zLmhzX2NvbmZpZy5jb25kaXRpb25zID0gaHNjZmdfcGFyYW0tPmNvbmRpdGlvbnM7CisJCWhzX2NmZy0+cGFyYW1zLmhzX2NvbmZpZy5ncGlvID0gaHNjZmdfcGFyYW0tPmdwaW87CisJCWhzX2NmZy0+cGFyYW1zLmhzX2NvbmZpZy5nYXAgPSBoc2NmZ19wYXJhbS0+Z2FwOwogCQlkZXZfZGJnKGFkYXB0ZXItPmRldiwKIAkJCSJjbWQ6IEhTX0NGR19DTUQ6IGNvbmRpdGlvbjoweCV4IGdwaW86MHgleCBnYXA6MHgleFxuIiwKIAkJICAgICAgIGhzX2NmZy0+cGFyYW1zLmhzX2NvbmZpZy5jb25kaXRpb25zLApAQCAtNDA1LDExICszOTYsMTEgQEAKICAqICAgICAgLSBTZXR0aW5nIE1BQyBtdWx0aWNhc3QgYWRkcmVzcwogICogICAgICAtIEVuc3VyaW5nIGNvcnJlY3QgZW5kaWFuLW5lc3MKICAqLwotc3RhdGljIGludCBtd2lmaWV4X2NtZF9tYWNfbXVsdGljYXN0X2FkcihzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAotCQkJCQkgdTE2IGNtZF9hY3Rpb24sIHZvaWQgKmRhdGFfYnVmKQorc3RhdGljIGludAorbXdpZmlleF9jbWRfbWFjX211bHRpY2FzdF9hZHIoc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCSAgICAgIHUxNiBjbWRfYWN0aW9uLAorCQkJICAgICAgc3RydWN0IG13aWZpZXhfbXVsdGljYXN0X2xpc3QgKm1jYXN0X2xpc3QpCiB7Ci0Jc3RydWN0IG13aWZpZXhfbXVsdGljYXN0X2xpc3QgKm1jYXN0X2xpc3QgPQotCQkoc3RydWN0IG13aWZpZXhfbXVsdGljYXN0X2xpc3QgKikgZGF0YV9idWY7CiAJc3RydWN0IGhvc3RfY21kX2RzX21hY19tdWx0aWNhc3RfYWRyICptY2FzdF9hZGRyID0gJmNtZC0+cGFyYW1zLm1jX2FkZHI7CiAKIAljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGhvc3RfY21kX2RzX21hY19tdWx0aWNhc3RfYWRyKSArCkBAIC00MzUsNyArNDI2LDcgQEAKICAqLwogc3RhdGljIGludCBtd2lmaWV4X2NtZF84MDJfMTFfZGVhdXRoZW50aWNhdGUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJICAgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAotCQkJCQkgICAgIHZvaWQgKmRhdGFfYnVmKQorCQkJCQkgICAgIHU4ICptYWMpCiB7CiAJc3RydWN0IGhvc3RfY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSAqZGVhdXRoID0gJmNtZC0+cGFyYW1zLmRlYXV0aDsKIApAQCAtNDQ0LDcgKzQzNSw3IEBACiAJCQkJKyBTX0RTX0dFTik7CiAKIAkvKiBTZXQgQVAgTUFDIGFkZHJlc3MgKi8KLQltZW1jcHkoZGVhdXRoLT5tYWNfYWRkciwgKHU4ICopIGRhdGFfYnVmLCBFVEhfQUxFTik7CisJbWVtY3B5KGRlYXV0aC0+bWFjX2FkZHIsIG1hYywgRVRIX0FMRU4pOwogCiAJZGV2X2RiZyhwcml2LT5hZGFwdGVyLT5kZXYsICJjbWQ6IERlYXV0aDogJXBNXG4iLCBkZWF1dGgtPm1hY19hZGRyKTsKIApAQCAtNTQzLDE1ICs1MzQsMTQgQEAKICAqICAgICAgICBlbmNyeXB0aW9uIChUS0lQLCBBRVMpIChhcyByZXF1aXJlZCkKICAqICAgICAgLSBFbnN1cmluZyBjb3JyZWN0IGVuZGlhbi1uZXNzCiAgKi8KLXN0YXRpYyBpbnQgbXdpZmlleF9jbWRfODAyXzExX2tleV9tYXRlcmlhbChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAotCQkJCQkgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAotCQkJCQkgICB1MTYgY21kX2FjdGlvbiwKLQkJCQkJICAgdTMyIGNtZF9vaWQsIHZvaWQgKmRhdGFfYnVmKQorc3RhdGljIGludAorbXdpZmlleF9jbWRfODAyXzExX2tleV9tYXRlcmlhbChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAorCQkJCXN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpjbWQsCisJCQkJdTE2IGNtZF9hY3Rpb24sIHUzMiBjbWRfb2lkLAorCQkJCXN0cnVjdCBtd2lmaWV4X2RzX2VuY3J5cHRfa2V5ICplbmNfa2V5KQogewogCXN0cnVjdCBob3N0X2NtZF9kc184MDJfMTFfa2V5X21hdGVyaWFsICprZXlfbWF0ZXJpYWwgPQogCQkmY21kLT5wYXJhbXMua2V5X21hdGVyaWFsOwotCXN0cnVjdCBtd2lmaWV4X2RzX2VuY3J5cHRfa2V5ICplbmNfa2V5ID0KLQkJKHN0cnVjdCBtd2lmaWV4X2RzX2VuY3J5cHRfa2V5ICopIGRhdGFfYnVmOwogCXUxNiBrZXlfcGFyYW1fbGVuID0gMDsKIAlpbnQgcmV0ID0gMDsKIAljb25zdCB1OCBiY19tYWNbXSA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OwpAQCAtNzQxLDcgKzczMSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgbXdpZmlleF9jbWRfODAyXzExX3JmX2NoYW5uZWwoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJIHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpjbWQsCi0JCQkJCSB1MTYgY21kX2FjdGlvbiwgdm9pZCAqZGF0YV9idWYpCisJCQkJCSB1MTYgY21kX2FjdGlvbiwgdTE2ICpjaGFubmVsKQogewogCXN0cnVjdCBob3N0X2NtZF9kc184MDJfMTFfcmZfY2hhbm5lbCAqcmZfY2hhbiA9CiAJCSZjbWQtPnBhcmFtcy5yZl9jaGFubmVsOwpAQCAtNzU5LDcgKzc0OSw3IEBACiAKIAkJcmZfdHlwZSA9IGxlMTZfdG9fY3B1KHJmX2NoYW4tPnJmX3R5cGUpOwogCQlTRVRfU0VDT05EQVJZQ0hBTihyZl90eXBlLCBwcml2LT5hZGFwdGVyLT5jaGFuX29mZnNldCk7Ci0JCXJmX2NoYW4tPmN1cnJlbnRfY2hhbm5lbCA9IGNwdV90b19sZTE2KCooKHUxNiAqKSBkYXRhX2J1ZikpOworCQlyZl9jaGFuLT5jdXJyZW50X2NoYW5uZWwgPSBjcHVfdG9fbGUxNigqY2hhbm5lbCk7CiAJfQogCXJmX2NoYW4tPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOwogCXJldHVybiAwOwpAQCAtNzc0LDExICs3NjQsMTAgQEAKICAqICAgICAgLSBFbnN1cmluZyBjb3JyZWN0IGVuZGlhbi1uZXNzCiAgKi8KIHN0YXRpYyBpbnQgbXdpZmlleF9jbWRfaWJzc19jb2FsZXNjaW5nX3N0YXR1cyhzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kLAotCQkJCQkgICAgICB1MTYgY21kX2FjdGlvbiwgdm9pZCAqZGF0YV9idWYpCisJCQkJCSAgICAgIHUxNiBjbWRfYWN0aW9uLCB1MTYgKmVuYWJsZSkKIHsKIAlzdHJ1Y3QgaG9zdF9jbWRfZHNfODAyXzExX2lic3Nfc3RhdHVzICppYnNzX2NvYWwgPQogCQkmKGNtZC0+cGFyYW1zLmlic3NfY29hbGVzY2luZyk7Ci0JdTE2IGVuYWJsZSA9IDA7CiAKIAljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihIb3N0Q21kX0NNRF84MDJfMTFfSUJTU19DT0FMRVNDSU5HX1NUQVRVUyk7CiAJY21kLT5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBob3N0X2NtZF9kc184MDJfMTFfaWJzc19zdGF0dXMpICsKQEAgLTc4OCw5ICs3NzcsMTAgQEAKIAogCXN3aXRjaCAoY21kX2FjdGlvbikgewogCWNhc2UgSG9zdENtZF9BQ1RfR0VOX1NFVDoKLQkJaWYgKGRhdGFfYnVmICE9IE5VTEwpCi0JCQllbmFibGUgPSAqKHUxNiAqKSBkYXRhX2J1ZjsKLQkJaWJzc19jb2FsLT5lbmFibGUgPSBjcHVfdG9fbGUxNihlbmFibGUpOworCQlpZiAoZW5hYmxlKQorCQkJaWJzc19jb2FsLT5lbmFibGUgPSBjcHVfdG9fbGUxNigqZW5hYmxlKTsKKwkJZWxzZQorCQkJaWJzc19jb2FsLT5lbmFibGUgPSAwOwogCQlicmVhazsKIAogCQkvKiBJbiBvdGhlciBjYXNlLi4gTm90aGluZyB0byBkbyAqLwpAQCAtODIyLDkgKzgxMiw4IEBACiBzdGF0aWMgaW50IG13aWZpZXhfY21kX3JlZ19hY2Nlc3Moc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKIAkJCQkgIHUxNiBjbWRfYWN0aW9uLCB2b2lkICpkYXRhX2J1ZikKIHsKLQlzdHJ1Y3QgbXdpZmlleF9kc19yZWdfcncgKnJlZ19ydzsKKwlzdHJ1Y3QgbXdpZmlleF9kc19yZWdfcncgKnJlZ19ydyA9IGRhdGFfYnVmOwogCi0JcmVnX3J3ID0gKHN0cnVjdCBtd2lmaWV4X2RzX3JlZ19ydyAqKSBkYXRhX2J1ZjsKIAlzd2l0Y2ggKGxlMTZfdG9fY3B1KGNtZC0+Y29tbWFuZCkpIHsKIAljYXNlIEhvc3RDbWRfQ01EX01BQ19SRUdfQUNDRVNTOgogCXsKQEAgLTg5Myw4ICs4ODIsNyBAQAogCX0KIAljYXNlIEhvc3RDbWRfQ01EXzgwMl8xMV9FRVBST01fQUNDRVNTOgogCXsKLQkJc3RydWN0IG13aWZpZXhfZHNfcmVhZF9lZXByb20gKnJkX2VlcHJvbSA9Ci0JCQkoc3RydWN0IG13aWZpZXhfZHNfcmVhZF9lZXByb20gKikgZGF0YV9idWY7CisJCXN0cnVjdCBtd2lmaWV4X2RzX3JlYWRfZWVwcm9tICpyZF9lZXByb20gPSBkYXRhX2J1ZjsKIAkJc3RydWN0IGhvc3RfY21kX2RzXzgwMl8xMV9lZXByb21fYWNjZXNzICpjbWRfZWVwcm9tID0KIAkJCShzdHJ1Y3QgaG9zdF9jbWRfZHNfODAyXzExX2VlcHJvbV9hY2Nlc3MgKikKIAkJCSZjbWQtPnBhcmFtcy5lZXByb207CkBAIC05MjMsOCArOTExLDcgQEAKIAkJCSAgICB1MTYgY21kX2FjdGlvbiwgdTMyIGNtZF9vaWQsCiAJCQkgICAgdm9pZCAqZGF0YV9idWYsIHZvaWQgKmNtZF9idWYpCiB7Ci0Jc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZF9wdHIgPQotCQkoc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKikgY21kX2J1ZjsKKwlzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqY21kX3B0ciA9IGNtZF9idWY7CiAJaW50IHJldCA9IDA7CiAKIAkvKiBQcmVwYXJlIGNvbW1hbmQgKi8KQEAgLTExMjYsNiArMTExMyw3IEBACiAJc3RydWN0IG13aWZpZXhfZHNfMTFuX2Ftc2R1X2FnZ3JfY3RybCBhbXNkdV9hZ2dyX2N0cmw7CiAJc3RydWN0IG13aWZpZXhfZHNfYXV0b19kcyBhdXRvX2RzOwogCWVudW0gc3RhdGVfMTFkX3Qgc3RhdGVfMTFkOworCXN0cnVjdCBtd2lmaWV4X2RzXzExbl90eF9jZmcgdHhfY2ZnOwogCiAJaWYgKGZpcnN0X3N0YSkgewogCkBAIC0xMTgxLDcgKzExNjksNyBAQAogCS8qIFNlbmQgcmVxdWVzdCB0byBmaXJtd2FyZSAqLwogCXJldCA9IG13aWZpZXhfc2VuZF9jbWRfYXN5bmMocHJpdiwgSG9zdENtZF9DTURfQU1TRFVfQUdHUl9DVFJMLAogCQkJCSAgICAgSG9zdENtZF9BQ1RfR0VOX1NFVCwgMCwKLQkJCQkgICAgICh2b2lkICopICZhbXNkdV9hZ2dyX2N0cmwpOworCQkJCSAgICAgJmFtc2R1X2FnZ3JfY3RybCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIC0xOwogCS8qIE1BQyBDb250cm9sIG11c3QgYmUgdGhlIGxhc3QgY29tbWFuZCBpbiBpbml0X2Z3ICovCkBAIC0xMjExLDggKzExOTksMTUgQEAKIAlpZiAocmV0KQogCQlkZXZfZXJyKHByaXYtPmFkYXB0ZXItPmRldiwgIjExRDogZmFpbGVkIHRvIGVuYWJsZSAxMURcbiIpOwogCisJLyogU2VuZCBjbWQgdG8gRlcgdG8gY29uZmlndXJlIDExbiBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisJICogKFNob3J0IEdJLCBDaGFubmVsIEJXLCBHcmVlbiBmaWVsZCBzdXBwb3J0IGV0Yy4pIGZvciB0cmFuc21pdAorCSAqLworCXR4X2NmZy50eF9odGNhcCA9IE1XSUZJRVhfRldfREVGX0hUVFhDRkc7CisJcmV0ID0gbXdpZmlleF9zZW5kX2NtZF9hc3luYyhwcml2LCBIb3N0Q21kX0NNRF8xMU5fQ0ZHLAorCQkJCSAgICAgSG9zdENtZF9BQ1RfR0VOX1NFVCwgMCwgJnR4X2NmZyk7CisKIAkvKiBzZXQgbGFzdF9pbml0X2NtZCAqLwotCXByaXYtPmFkYXB0ZXItPmxhc3RfaW5pdF9jbWQgPSBIb3N0Q21kX0NNRF84MDJfMTFfU05NUF9NSUI7CisJcHJpdi0+YWRhcHRlci0+bGFzdF9pbml0X2NtZCA9IEhvc3RDbWRfQ01EXzExTl9DRkc7CiAJcmV0ID0gLUVJTlBST0dSRVNTOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZHJlc3AuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZHJlc3AuYwppbmRleCBkMDhmNzY0Li42ODA0MjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9jbWRyZXNwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfY21kcmVzcC5jCkBAIC0xMjAsMTEgKzEyMCwxMCBAQAogICovCiBzdGF0aWMgaW50IG13aWZpZXhfcmV0XzgwMl8xMV9yc3NpX2luZm8oc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3AsCi0JCQkJCXZvaWQgKmRhdGFfYnVmKQorCQkJCQlzdHJ1Y3QgbXdpZmlleF9kc19nZXRfc2lnbmFsICpzaWduYWwpCiB7CiAJc3RydWN0IGhvc3RfY21kX2RzXzgwMl8xMV9yc3NpX2luZm9fcnNwICpyc3NpX2luZm9fcnNwID0KIAkJJnJlc3AtPnBhcmFtcy5yc3NpX2luZm9fcnNwOwotCXN0cnVjdCBtd2lmaWV4X2RzX2dldF9zaWduYWwgKnNpZ25hbDsKIAogCXByaXYtPmRhdGFfcnNzaV9sYXN0ID0gbGUxNl90b19jcHUocnNzaV9pbmZvX3JzcC0+ZGF0YV9yc3NpX2xhc3QpOwogCXByaXYtPmRhdGFfbmZfbGFzdCA9IGxlMTZfdG9fY3B1KHJzc2lfaW5mb19yc3AtPmRhdGFfbmZfbGFzdCk7CkBAIC0xMzksOSArMTM4LDggQEAKIAlwcml2LT5iY25fbmZfYXZnID0gbGUxNl90b19jcHUocnNzaV9pbmZvX3JzcC0+YmNuX25mX2F2Zyk7CiAKIAkvKiBOZWVkIHRvIGluZGljYXRlIElPQ1RMIGNvbXBsZXRlICovCi0JaWYgKGRhdGFfYnVmKSB7Ci0JCXNpZ25hbCA9IChzdHJ1Y3QgbXdpZmlleF9kc19nZXRfc2lnbmFsICopIGRhdGFfYnVmOwotCQltZW1zZXQoc2lnbmFsLCAwLCBzaXplb2Yoc3RydWN0IG13aWZpZXhfZHNfZ2V0X3NpZ25hbCkpOworCWlmIChzaWduYWwpIHsKKwkJbWVtc2V0KHNpZ25hbCwgMCwgc2l6ZW9mKCpzaWduYWwpKTsKIAogCQlzaWduYWwtPnNlbGVjdG9yID0gQUxMX1JTU0lfSU5GT19NQVNLOwogCkBAIC0xODUsNyArMTgzLDcgQEAKICAqLwogc3RhdGljIGludCBtd2lmaWV4X3JldF84MDJfMTFfc25tcF9taWIoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCQkgICAgICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3AsCi0JCQkJICAgICAgIHZvaWQgKmRhdGFfYnVmKQorCQkJCSAgICAgICB1MzIgKmRhdGFfYnVmKQogewogCXN0cnVjdCBob3N0X2NtZF9kc184MDJfMTFfc25tcF9taWIgKnNtaWIgPSAmcmVzcC0+cGFyYW1zLnNtaWI7CiAJdTE2IG9pZCA9IGxlMTZfdG9fY3B1KHNtaWItPm9pZCk7CkBAIC0xOTgsNyArMTk2LDcgQEAKIAlpZiAocXVlcnlfdHlwZSA9PSBIb3N0Q21kX0FDVF9HRU5fR0VUKSB7CiAJCXVsX3RlbXAgPSBsZTE2X3RvX2NwdSgqKChfX2xlMTYgKikgKHNtaWItPnZhbHVlKSkpOwogCQlpZiAoZGF0YV9idWYpCi0JCQkqKHUzMiAqKWRhdGFfYnVmID0gdWxfdGVtcDsKKwkJCSpkYXRhX2J1ZiA9IHVsX3RlbXA7CiAJCXN3aXRjaCAob2lkKSB7CiAJCWNhc2UgRlJBR19USFJFU0hfSToKIAkJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LApAQCAtMjI4LDE0ICsyMjYsMTIgQEAKICAqLwogc3RhdGljIGludCBtd2lmaWV4X3JldF9nZXRfbG9nKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkgICAgICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3AsCi0JCQkgICAgICAgdm9pZCAqZGF0YV9idWYpCisJCQkgICAgICAgc3RydWN0IG13aWZpZXhfZHNfZ2V0X3N0YXRzICpzdGF0cykKIHsKIAlzdHJ1Y3QgaG9zdF9jbWRfZHNfODAyXzExX2dldF9sb2cgKmdldF9sb2cgPQogCQkoc3RydWN0IGhvc3RfY21kX2RzXzgwMl8xMV9nZXRfbG9nICopICZyZXNwLT5wYXJhbXMuZ2V0X2xvZzsKLQlzdHJ1Y3QgbXdpZmlleF9kc19nZXRfc3RhdHMgKnN0YXRzOwogCi0JaWYgKGRhdGFfYnVmKSB7Ci0JCXN0YXRzID0gKHN0cnVjdCBtd2lmaWV4X2RzX2dldF9zdGF0cyAqKSBkYXRhX2J1ZjsKKwlpZiAoc3RhdHMpIHsKIAkJc3RhdHMtPm1jYXN0X3R4X2ZyYW1lID0gbGUzMl90b19jcHUoZ2V0X2xvZy0+bWNhc3RfdHhfZnJhbWUpOwogCQlzdGF0cy0+ZmFpbGVkID0gbGUzMl90b19jcHUoZ2V0X2xvZy0+ZmFpbGVkKTsKIAkJc3RhdHMtPnJldHJ5ID0gbGUzMl90b19jcHUoZ2V0X2xvZy0+cmV0cnkpOwpAQCAtMjc4LDkgKzI3NCw4IEBACiAgKi8KIHN0YXRpYyBpbnQgbXdpZmlleF9yZXRfdHhfcmF0ZV9jZmcoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCQkgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqcmVzcCwKLQkJCQkgICB2b2lkICpkYXRhX2J1ZikKKwkJCQkgICBzdHJ1Y3QgbXdpZmlleF9yYXRlX2NmZyAqZHNfcmF0ZSkKIHsKLQlzdHJ1Y3QgbXdpZmlleF9yYXRlX2NmZyAqZHNfcmF0ZTsKIAlzdHJ1Y3QgaG9zdF9jbWRfZHNfdHhfcmF0ZV9jZmcgKnJhdGVfY2ZnID0gJnJlc3AtPnBhcmFtcy50eF9yYXRlX2NmZzsKIAlzdHJ1Y3QgbXdpZmlleF9yYXRlX3Njb3BlICpyYXRlX3Njb3BlOwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2hlYWRlciAqaGVhZDsKQEAgLTMyOSw4ICszMjQsNyBAQAogCQkJCQkgIEhvc3RDbWRfQ01EXzgwMl8xMV9UWF9SQVRFX1FVRVJZLAogCQkJCQkgIEhvc3RDbWRfQUNUX0dFTl9HRVQsIDAsIE5VTEwpOwogCi0JaWYgKGRhdGFfYnVmKSB7Ci0JCWRzX3JhdGUgPSAoc3RydWN0IG13aWZpZXhfcmF0ZV9jZmcgKikgZGF0YV9idWY7CisJaWYgKGRzX3JhdGUpIHsKIAkJaWYgKGxlMTZfdG9fY3B1KHJhdGVfY2ZnLT5hY3Rpb24pID09IEhvc3RDbWRfQUNUX0dFTl9HRVQpIHsKIAkJCWlmIChwcml2LT5pc19kYXRhX3JhdGVfYXV0bykgewogCQkJCWRzX3JhdGUtPmlzX3JhdGVfYXV0byA9IDE7CkBAIC00MTMsOCArNDA3LDcgQEAKICAqIGFuZCBzYXZpbmcgdGhlIGN1cnJlbnQgVHggcG93ZXIgbGV2ZWwgaW4gZHJpdmVyLgogICovCiBzdGF0aWMgaW50IG13aWZpZXhfcmV0X3R4X3Bvd2VyX2NmZyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqcmVzcCwKLQkJCQkgICAgdm9pZCAqZGF0YV9idWYpCisJCQkJICAgIHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpyZXNwKQogewogCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwogCXN0cnVjdCBob3N0X2NtZF9kc190eHB3cl9jZmcgKnR4cF9jZmcgPSAmcmVzcC0+cGFyYW1zLnR4cF9jZmc7CkBAIC02MzEsNyArNjI0LDcgQEAKICAqLwogc3RhdGljIGludCBtd2lmaWV4X3JldF84MDJfMTFfcmZfY2hhbm5lbChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJCQkgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3AsCi0JCQkJCSB2b2lkICpkYXRhX2J1ZikKKwkJCQkJIHUxNiAqZGF0YV9idWYpCiB7CiAJc3RydWN0IGhvc3RfY21kX2RzXzgwMl8xMV9yZl9jaGFubmVsICpyZl9jaGFubmVsID0KIAkJJnJlc3AtPnBhcmFtcy5yZl9jaGFubmVsOwpAQCAtNjQ0LDggKzYzNyw5IEBACiAJCS8qIFVwZGF0ZSB0aGUgY2hhbm5lbCBhZ2FpbiAqLwogCQlwcml2LT5jdXJyX2Jzc19wYXJhbXMuYnNzX2Rlc2NyaXB0b3IuY2hhbm5lbCA9IG5ld19jaGFubmVsOwogCX0KKwogCWlmIChkYXRhX2J1ZikKLQkJKigodTE2ICopZGF0YV9idWYpID0gbmV3X2NoYW5uZWw7CisJCSpkYXRhX2J1ZiA9IG5ld19jaGFubmVsOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NTgsMTMgKzY1MiwxMSBAQAogICovCiBzdGF0aWMgaW50IG13aWZpZXhfcmV0X3Zlcl9leHQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCSAgICAgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqcmVzcCwKLQkJCSAgICAgICB2b2lkICpkYXRhX2J1ZikKKwkJCSAgICAgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfdmVyc2lvbl9leHQgKnZlcnNpb25fZXh0KQogewogCXN0cnVjdCBob3N0X2NtZF9kc192ZXJzaW9uX2V4dCAqdmVyX2V4dCA9ICZyZXNwLT5wYXJhbXMudmVyZXh0OwotCXN0cnVjdCBob3N0X2NtZF9kc192ZXJzaW9uX2V4dCAqdmVyc2lvbl9leHQ7CiAKLQlpZiAoZGF0YV9idWYpIHsKLQkJdmVyc2lvbl9leHQgPSAoc3RydWN0IGhvc3RfY21kX2RzX3ZlcnNpb25fZXh0ICopZGF0YV9idWY7CisJaWYgKHZlcnNpb25fZXh0KSB7CiAJCXZlcnNpb25fZXh0LT52ZXJzaW9uX3N0cl9zZWwgPSB2ZXJfZXh0LT52ZXJzaW9uX3N0cl9zZWw7CiAJCW1lbWNweSh2ZXJzaW9uX2V4dC0+dmVyc2lvbl9zdHIsIHZlcl9leHQtPnZlcnNpb25fc3RyLAogCQkgICAgICAgc2l6ZW9mKGNoYXIpICogMTI4KTsKQEAgLTY4Niw4ICs2NzgsOCBAQAogCXN0cnVjdCBtd2lmaWV4X2RzX3JlYWRfZWVwcm9tICplZXByb207CiAKIAlpZiAoZGF0YV9idWYpIHsKLQkJcmVnX3J3ID0gKHN0cnVjdCBtd2lmaWV4X2RzX3JlZ19ydyAqKSBkYXRhX2J1ZjsKLQkJZWVwcm9tID0gKHN0cnVjdCBtd2lmaWV4X2RzX3JlYWRfZWVwcm9tICopIGRhdGFfYnVmOworCQlyZWdfcncgPSBkYXRhX2J1ZjsKKwkJZWVwcm9tID0gZGF0YV9idWY7CiAJCXN3aXRjaCAodHlwZSkgewogCQljYXNlIEhvc3RDbWRfQ01EX01BQ19SRUdfQUNDRVNTOgogCQkJewpAQCAtODI1LDEzICs4MTcsMTEgQEAKICAqIFRoaXMgaXMgYSBnZW5lcmljIGZ1bmN0aW9uLCB3aGljaCBjYWxscyBjb21tYW5kIHNwZWNpZmljCiAgKiByZXNwb25zZSBoYW5kbGVycyBiYXNlZCBvbiB0aGUgY29tbWFuZCBJRC4KICAqLwotaW50IG13aWZpZXhfcHJvY2Vzc19zdGFfY21kcmVzcChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAotCQkJCXUxNiBjbWRyZXNwX25vLCB2b2lkICpjbWRfYnVmKQoraW50IG13aWZpZXhfcHJvY2Vzc19zdGFfY21kcmVzcChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1MTYgY21kcmVzcF9ubywKKwkJCQlzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqcmVzcCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKLQlzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqcmVzcCA9Ci0JCShzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCAqKSBjbWRfYnVmOwogCXZvaWQgKmRhdGFfYnVmID0gYWRhcHRlci0+Y3Vycl9jbWQtPmRhdGFfYnVmOwogCiAJLyogSWYgdGhlIGNvbW1hbmQgaXMgbm90IHN1Y2Nlc3NmdWwsIGNsZWFudXAgYW5kIHJldHVybiBmYWlsdXJlICovCkBAIC04NjUsNyArODU1LDcgQEAKIAkJCSJpbmZvOiBDTURfUkVTUDogQkdfU0NBTiByZXN1bHQgaXMgcmVhZHkhXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBIb3N0Q21kX0NNRF9UWFBXUl9DRkc6Ci0JCXJldCA9IG13aWZpZXhfcmV0X3R4X3Bvd2VyX2NmZyhwcml2LCByZXNwLCBkYXRhX2J1Zik7CisJCXJldCA9IG13aWZpZXhfcmV0X3R4X3Bvd2VyX2NmZyhwcml2LCByZXNwKTsKIAkJYnJlYWs7CiAJY2FzZSBIb3N0Q21kX0NNRF84MDJfMTFfUFNfTU9ERV9FTkg6CiAJCXJldCA9IG13aWZpZXhfcmV0X2VuaF9wb3dlcl9tb2RlKHByaXYsIHJlc3AsIGRhdGFfYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9pb2N0bC5jCmluZGV4IGQwNTkwN2QuLmMzNGZmOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfaW9jdGwuYwpAQCAtNDg3LDYgKzQ4NywyMCBAQAogfQogCiAvKgorICogVGhlIGZ1bmN0aW9uIGRpc2FibGVzIGF1dG8gZGVlcCBzbGVlcCBtb2RlLgorICovCitpbnQgbXdpZmlleF9kaXNhYmxlX2F1dG9fZHMoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgbXdpZmlleF9kc19hdXRvX2RzIGF1dG9fZHM7CisKKwlhdXRvX2RzLmF1dG9fZHMgPSBERUVQX1NMRUVQX09GRjsKKworCXJldHVybiBtd2lmaWV4X3NlbmRfY21kX3N5bmMocHJpdiwgSG9zdENtZF9DTURfODAyXzExX1BTX01PREVfRU5ILAorCQkJCSAgICAgRElTX0FVVE9fUFMsIEJJVE1BUF9BVVRPX0RTLCAmYXV0b19kcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtd2lmaWV4X2Rpc2FibGVfYXV0b19kcyk7CisKKy8qCiAgKiBJT0NUTCByZXF1ZXN0IGhhbmRsZXIgdG8gc2V0L2dldCBhY3RpdmUgY2hhbm5lbC4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHZhbGlkaXR5IGNoZWNraW5nIG9uIGNoYW5uZWwvZnJlcXVlbmN5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfcnguYwppbmRleCAxZmRkZGVjLi4yNzQzMDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX3J4LmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCXJldCA9IG13aWZpZXhfMTFuX3J4X3Jlb3JkZXJfcGt0KHByaXYsIGxvY2FsX3J4X3BkLT5zZXFfbnVtLAogCQkJCQkgICAgIGxvY2FsX3J4X3BkLT5wcmlvcml0eSwgdGEsCiAJCQkJCSAgICAgKHU4KSBsb2NhbF9yeF9wZC0+cnhfcGt0X3R5cGUsCi0JCQkJCQkodm9pZCAqKSBza2IpOworCQkJCQkgICAgIHNrYik7CiAKIAlpZiAocmV0IHx8IChyeF9wa3RfdHlwZSA9PSBQS1RfVFlQRV9CQVIpKSB7CiAJCWlmIChwcml2ICYmIChyZXQgPT0gLTEpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX3R4LmMKaW5kZXggZmE2MjIxYi4uMTgyMmJmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV90eC5jCkBAIC00Nyw2ICs0Nyw3IEBACiAJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CiAJc3RydWN0IHR4cGQgKmxvY2FsX3R4X3BkOwogCXN0cnVjdCBtd2lmaWV4X3R4aW5mbyAqdHhfaW5mbyA9IE1XSUZJRVhfU0tCX1RYQ0Ioc2tiKTsKKwl1OCBwYWQ7CiAKIAlpZiAoIXNrYi0+bGVuKSB7CiAJCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAiVHg6IGJhZCBwYWNrZXQgbGVuZ3RoOiAlZFxuIiwKQEAgLTU1LDE1ICs1NiwxOSBAQAogCQlyZXR1cm4gc2tiLT5kYXRhOwogCX0KIAotCUJVR19PTihza2JfaGVhZHJvb20oc2tiKSA8IChzaXplb2YoKmxvY2FsX3R4X3BkKSArIElOVEZfSEVBREVSX0xFTikpOwotCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCpsb2NhbF90eF9wZCkpOworCS8qIElmIHNrYi0+ZGF0YSBpcyBub3QgYWxpZ25lZDsgYWRkIHBhZGRpbmcgKi8KKwlwYWQgPSAoNCAtICgoKHZvaWQgKilza2ItPmRhdGEgLSBOVUxMKSAmIDB4MykpICUgNDsKKworCUJVR19PTihza2JfaGVhZHJvb20oc2tiKSA8IChzaXplb2YoKmxvY2FsX3R4X3BkKSArIElOVEZfSEVBREVSX0xFTgorCQkJCQkJCQkrIHBhZCkpOworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCpsb2NhbF90eF9wZCkgKyBwYWQpOwogCiAJbG9jYWxfdHhfcGQgPSAoc3RydWN0IHR4cGQgKikgc2tiLT5kYXRhOwogCW1lbXNldChsb2NhbF90eF9wZCwgMCwgc2l6ZW9mKHN0cnVjdCB0eHBkKSk7CiAJbG9jYWxfdHhfcGQtPmJzc19udW0gPSBwcml2LT5ic3NfbnVtOwogCWxvY2FsX3R4X3BkLT5ic3NfdHlwZSA9IHByaXYtPmJzc190eXBlOwogCWxvY2FsX3R4X3BkLT50eF9wa3RfbGVuZ3RoID0gY3B1X3RvX2xlMTYoKHUxNikgKHNrYi0+bGVuIC0KLQkJCQkJCQlzaXplb2Yoc3RydWN0IHR4cGQpKSk7CisJCQkJCQkoc2l6ZW9mKHN0cnVjdCB0eHBkKSArIHBhZCkpKTsKIAogCWxvY2FsX3R4X3BkLT5wcmlvcml0eSA9ICh1OCkgc2tiLT5wcmlvcml0eTsKIAlsb2NhbF90eF9wZC0+cGt0X2RlbGF5XzJtcyA9CkBAIC04OCw3ICs5Myw3IEBACiAJfQogCiAJLyogT2Zmc2V0IG9mIGFjdHVhbCBkYXRhICovCi0JbG9jYWxfdHhfcGQtPnR4X3BrdF9vZmZzZXQgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IHR4cGQpKTsKKwlsb2NhbF90eF9wZC0+dHhfcGt0X29mZnNldCA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgdHhwZCkgKyBwYWQpOwogCiAJLyogbWFrZSBzcGFjZSBmb3IgSU5URl9IRUFERVJfTEVOICovCiAJc2tiX3B1c2goc2tiLCBJTlRGX0hFQURFUl9MRU4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC90eHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3R4cnguYwppbmRleCBhYWE1MGMwLi42MTkwYjJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3R4cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3R4cnguYwpAQCAtNzEsNyArNzEsNyBAQAogCXU4ICpoZWFkX3B0cjsKIAlzdHJ1Y3QgdHhwZCAqbG9jYWxfdHhfcGQgPSBOVUxMOwogCi0JaGVhZF9wdHIgPSAodTggKikgbXdpZmlleF9wcm9jZXNzX3N0YV90eHBkKHByaXYsIHNrYik7CisJaGVhZF9wdHIgPSBtd2lmaWV4X3Byb2Nlc3Nfc3RhX3R4cGQocHJpdiwgc2tiKTsKIAlpZiAoaGVhZF9wdHIpIHsKIAkJaWYgKEdFVF9CU1NfUk9MRShwcml2KSA9PSBNV0lGSUVYX0JTU19ST0xFX1NUQSkKIAkJCWxvY2FsX3R4X3BkID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvd21tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3dtbS5jCmluZGV4IDkxNjM0ZGEuLjY5ZTI2MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvd21tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC93bW0uYwpAQCAtMTIxLDYgKzEyMSw3IEBACiAJbWVtY3B5KHJhX2xpc3QtPnJhLCByYSwgRVRIX0FMRU4pOwogCiAJcmFfbGlzdC0+dG90YWxfcGt0c19zaXplID0gMDsKKwlyYV9saXN0LT50b3RhbF9wa3RzID0gMDsKIAogCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiaW5mbzogYWxsb2NhdGVkIHJhX2xpc3QgJXBcbiIsIHJhX2xpc3QpOwogCkBAIC02MzMsNiArNjM0LDggQEAKIAkJCXJhX2xpc3QgPSBOVUxMOwogCX0gZWxzZSB7CiAJCW1lbWNweShyYSwgc2tiLT5kYXRhLCBFVEhfQUxFTik7CisJCWlmIChyYVswXSAmIDB4MDEpCisJCQltZW1zZXQocmEsIDB4ZmYsIEVUSF9BTEVOKTsKIAkJcmFfbGlzdCA9IG13aWZpZXhfd21tX2dldF9xdWV1ZV9yYXB0cihwcml2LCB0aWRfZG93biwgcmEpOwogCX0KIApAQCAtNjQ1LDYgKzY0OCw3IEBACiAJc2tiX3F1ZXVlX3RhaWwoJnJhX2xpc3QtPnNrYl9oZWFkLCBza2IpOwogCiAJcmFfbGlzdC0+dG90YWxfcGt0c19zaXplICs9IHNrYi0+bGVuOworCXJhX2xpc3QtPnRvdGFsX3BrdHMrKzsKIAogCWF0b21pY19pbmMoJnByaXYtPndtbS50eF9wa3RzX3F1ZXVlZCk7CiAKQEAgLTk3MSwyOCArOTc1LDYgQEAKIH0KIAogLyoKLSAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgaW4gdGhlIFR4IHF1ZXVlIG9mIGEKLSAqIHBhcnRpY3VsYXIgUkEgbGlzdC4KLSAqLwotc3RhdGljIGludAotbXdpZmlleF9udW1fcGt0c19pbl90eHEoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKLQkJCXN0cnVjdCBtd2lmaWV4X3JhX2xpc3RfdGJsICpwdHIsIGludCBtYXhfYnVmX3NpemUpCi17Ci0JaW50IGNvdW50ID0gMCwgdG90YWxfc2l6ZSA9IDA7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKLQotCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnB0ci0+c2tiX2hlYWQsIHNrYiwgdG1wKSB7Ci0JCXRvdGFsX3NpemUgKz0gc2tiLT5sZW47Ci0JCWlmICh0b3RhbF9zaXplIDwgbWF4X2J1Zl9zaXplKQotCQkJKytjb3VudDsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi0vKgogICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHNpbmdsZSBwYWNrZXQgdG8gZmlybXdhcmUgZm9yIHRyYW5zbWlzc2lvbi4KICAqLwogc3RhdGljIHZvaWQKQEAgLTEwMTksNiArMTAwMSw3IEBACiAJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJkYXRhOiBkZXF1ZXVpbmcgdGhlIHBhY2tldCAlcCAlcFxuIiwgcHRyLCBza2IpOwogCiAJcHRyLT50b3RhbF9wa3RzX3NpemUgLT0gc2tiLT5sZW47CisJcHRyLT50b3RhbF9wa3RzLS07CiAKIAlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmcHRyLT5za2JfaGVhZCkpCiAJCXNrYl9uZXh0ID0gc2tiX3BlZWsoJnB0ci0+c2tiX2hlYWQpOwpAQCAtMTA0NCw2ICsxMDI3LDcgQEAKIAkJc2tiX3F1ZXVlX3RhaWwoJnB0ci0+c2tiX2hlYWQsIHNrYik7CiAKIAkJcHRyLT50b3RhbF9wa3RzX3NpemUgKz0gc2tiLT5sZW47CisJCXB0ci0+dG90YWxfcGt0cysrOwogCQl0eF9pbmZvLT5mbGFncyB8PSBNV0lGSUVYX0JVRl9GTEFHX1JFUVVFVUVEX1BLVDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+d21tLnJhX2xpc3Rfc3BpbmxvY2ssCiAJCQkJICAgICAgIHJhX2xpc3RfZmxhZ3MpOwpAQCAtMTIzMSw5ICsxMjE1LDkgQEAKIAkJfQogLyogTWluaW11bSBudW1iZXIgb2YgQU1TRFUgKi8KICNkZWZpbmUgTUlOX05VTV9BTVNEVSAyCisKIAkJaWYgKG13aWZpZXhfaXNfYW1zZHVfYWxsb3dlZChwcml2LCB0aWQpICYmCi0JCSAgICAobXdpZmlleF9udW1fcGt0c19pbl90eHEocHJpdiwgcHRyLCBhZGFwdGVyLT50eF9idWZfc2l6ZSkgPj0KLQkJICAgICBNSU5fTlVNX0FNU0RVKSkKKwkJCQkocHRyLT50b3RhbF9wa3RzID49IE1JTl9OVU1fQU1TRFUpKQogCQkJbXdpZmlleF8xMW5fYWdncmVnYXRlX3BrdChwcml2LCBwdHIsIElOVEZfSEVBREVSX0xFTiwKIAkJCQkJCSAgcHRyX2luZGV4LCBmbGFncyk7CiAJCQkvKiByYV9saXN0X3NwaW5sb2NrIGhhcyBiZWVuIGZyZWVkIGluCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2w4ay5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYwppbmRleCAzMjI2MTE4Li5kYTM2ZGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2w4ay5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213bDhrLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC0xODkxLDkgKzE4OTIsOSBAQAogCiAJdHhwcmlvcml0eSA9IGluZGV4OwogCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhX3Fvcyh3aC0+ZnJhbWVfY29udHJvbCkgJiYKLQkgICAgc2tiLT5wcm90b2NvbCAhPSBjcHVfdG9fYmUxNihFVEhfUF9QQUUpICYmCi0JICAgIHN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCAmJiBwcml2LT5hcF9mdykgeworCWlmIChwcml2LT5hcF9mdyAmJiBzdGEgJiYgc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkCisJCQkmJiBza2ItPnByb3RvY29sICE9IGNwdV90b19iZTE2KEVUSF9QX1BBRSkKKwkJCSYmIGllZWU4MDIxMV9pc19kYXRhX3Fvcyh3aC0+ZnJhbWVfY29udHJvbCkpIHsKIAkJdGlkID0gcW9zICYgMHhmOwogCQltd2w4a190eF9jb3VudF9wYWNrZXQoc3RhLCB0aWQpOwogCQlzcGluX2xvY2soJnByaXYtPnN0cmVhbV9sb2NrKTsKQEAgLTI0NzQsNiArMjQ3NSw3IEBACiAgKiBmYXN0ZXIgY2xpZW50LgogICovCiAjZGVmaW5lIE1XTDhLX1NFVF9IV19TUEVDX0ZMQUdfRU5BQkxFX0xJRkVfVElNRV9FWFBJUlkJMHgwMDAwMDQwMAorI2RlZmluZSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0dFTkVSQVRFX0NDTVBfSERSCTB4MDAwMDAyMDAKICNkZWZpbmUgTVdMOEtfU0VUX0hXX1NQRUNfRkxBR19IT1NUX0RFQ1JfTUdNVAkJMHgwMDAwMDA4MAogI2RlZmluZSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0hPU1RGT1JNX1BST0JFUkVTUAkweDAwMDAwMDIwCiAjZGVmaW5lIE1XTDhLX1NFVF9IV19TUEVDX0ZMQUdfSE9TVEZPUk1fQkVBQ09OCQkweDAwMDAwMDEwCkBAIC0yNTEwLDcgKzI1MTIsOCBAQAogCWNtZC0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0hPU1RfREVDUl9NR01UIHwKIAkJCQkgTVdMOEtfU0VUX0hXX1NQRUNfRkxBR19IT1NURk9STV9QUk9CRVJFU1AgfAogCQkJCSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0hPU1RGT1JNX0JFQUNPTiB8Ci0JCQkJIE1XTDhLX1NFVF9IV19TUEVDX0ZMQUdfRU5BQkxFX0xJRkVfVElNRV9FWFBJUlkpOworCQkJCSBNV0w4S19TRVRfSFdfU1BFQ19GTEFHX0VOQUJMRV9MSUZFX1RJTUVfRVhQSVJZIHwKKwkJCQkgTVdMOEtfU0VUX0hXX1NQRUNfRkxBR19HRU5FUkFURV9DQ01QX0hEUik7CiAJY21kLT5udW1fdHhfZGVzY19wZXJfcXVldWUgPSBjcHVfdG9fbGUzMihNV0w4S19UWF9ERVNDUyk7CiAJY21kLT50b3RhbF9yeGQgPSBjcHVfdG9fbGUzMihNV0w4S19SWF9ERVNDUyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vYWlycG9ydC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9haXJwb3J0LmMKaW5kZXggNGEwYTBlNS4uMGNhOGIxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9haXJwb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9haXJwb3J0LmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXY7CiAJc3RydWN0IGFpcnBvcnQgKmNhcmQ7CiAJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7Ci0JaGVybWVzX3QgKmh3OworCXN0cnVjdCBoZXJtZXMgKmh3OwogCiAJaWYgKG1hY2lvX3Jlc291cmNlX2NvdW50KG1kZXYpIDwgMSB8fCBtYWNpb19pcnFfY291bnQobWRldikgPCAxKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIldyb25nIGludGVycnVwdC9hZGRyZXNzZXMgaW4gT0YgdHJlZVxuIik7CkBAIC0yMjgsMTAgKzIyOCw5IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIEFwcGxlIEFpcnBvcnQgd2lyZWxlc3MgY2FyZC4iKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYWlycG9ydF9tYXRjaFtdID0KLXsKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFpcnBvcnRfbWF0Y2hbXSA9IHsKIAl7Ci0JLm5hbWUgCQk9ICJyYWRpbyIsCisJLm5hbWUJCT0gInJhZGlvIiwKIAl9LAogCXt9LAogfTsKQEAgLTI0MCw3ICsyMzksNyBAQAogCiBzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBhaXJwb3J0X2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSAJCT0gRFJJVkVSX05BTUUsCisJCS5uYW1lCQk9IERSSVZFUl9OQU1FLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZQk9IGFpcnBvcnRfbWF0Y2gsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vY2ZnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2NmZy5jCmluZGV4IDczNmJiYjkuLmY3YjE1YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vY2ZnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9jZmcuYwpAQCAtNTksNyArNTksNyBAQAogCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgewogCQlpZiAocHJpdi0+Y2hhbm5lbF9tYXNrICYgKDEgPDwgaSkpIHsKIAkJCXByaXYtPmNoYW5uZWxzW2ldLmNlbnRlcl9mcmVxID0KLQkJCQlpZWVlODAyMTFfZHNzc19jaGFuX3RvX2ZyZXEoaSsxKTsKKwkJCQlpZWVlODAyMTFfZHNzc19jaGFuX3RvX2ZyZXEoaSArIDEpOwogCQkJY2hhbm5lbHMrKzsKIAkJfQogCX0KQEAgLTE4Miw3ICsxODIsNyBAQAogCWNoYW5uZWwgPSBpZWVlODAyMTFfZnJlcV90b19kc3NzX2NoYW4oY2hhbi0+Y2VudGVyX2ZyZXEpOwogCiAJaWYgKChjaGFubmVsIDwgMSkgfHwgKGNoYW5uZWwgPiBOVU1fQ0hBTk5FTFMpIHx8Ci0JICAgICAhKHByaXYtPmNoYW5uZWxfbWFzayAmICgxIDw8IChjaGFubmVsLTEpKSkpCisJICAgICAhKHByaXYtPmNoYW5uZWxfbWFzayAmICgxIDw8IChjaGFubmVsIC0gMSkpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKQEAgLTE5MSw3ICsxOTEsNyBAQAogCXByaXYtPmNoYW5uZWwgPSBjaGFubmVsOwogCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHsKIAkJLyogRmFzdCBjaGFubmVsIGNoYW5nZSAtIG5vIGNvbW1pdCBpZiBzdWNjZXNzZnVsICovCi0JCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwkJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJCWVyciA9IGh3LT5vcHMtPmNtZF93YWl0KGh3LCBIRVJNRVNfQ01EX1RFU1QgfAogCQkJCQkgICAgSEVSTUVTX1RFU1RfU0VUX0NIQU5ORUwsCiAJCQkJCWNoYW5uZWwsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9mdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9mdy5jCmluZGV4IDI1OWQ3NTguLjUyN2NmNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vZncuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2Z3LmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCS8qIFBsdWcgRGF0YSBBcmVhIChQREEpICovCiAJX19sZTE2ICpwZGE7CiAKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeTsKIAljb25zdCBzdHJ1Y3Qgb3Jpbm9jb19md19oZWFkZXIgKmhkcjsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpmaXJzdF9ibG9jazsKQEAgLTIwNSw3ICsyMDUsNyBAQAogCQljb25zdCB1bnNpZ25lZCBjaGFyICppbWFnZSwgY29uc3Qgdm9pZCAqZW5kLAogCQlpbnQgc2Vjb25kYXJ5KQogewotCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKIAlpbnQgcmV0ID0gMDsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpwdHI7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqZmlyc3RfYmxvY2s7CkBAIC0zMjIsOSArMzIyLDggQEAKIAkJCSAgICAgIGZ3X2VudHJ5LT5kYXRhICsgZndfZW50cnktPnNpemUsIDEpOwogCWlmICghb3Jpbm9jb19jYWNoZWRfZndfZ2V0KHByaXYsIGZhbHNlKSkKIAkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7Ci0JaWYgKHJldCkgeworCWlmIChyZXQpCiAJCWRldl9lcnIoZGV2LCAiU2Vjb25kYXJ5IGZpcm13YXJlIGRvd25sb2FkIGZhaWxlZFxuIik7Ci0JfQogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vZncuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vZncuaAppbmRleCA4OWZjMjZkLi5hY2E2M2UzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2Z3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9mdy5oCkBAIC0xNCw3ICsxNCw3IEBACiB2b2lkIG9yaW5vY29fY2FjaGVfZncoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwgaW50IGFwKTsKIHZvaWQgb3Jpbm9jb191bmNhY2hlX2Z3KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpOwogI2Vsc2UKLSNkZWZpbmUgb3Jpbm9jb19jYWNoZV9mdyhwcml2LCBhcCkgZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIG9yaW5vY29fY2FjaGVfZncocHJpdiwgYXApIGRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgb3Jpbm9jb191bmNhY2hlX2Z3KHByaXYpIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2hlcm1lcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXMuYwppbmRleCA2YzZhMjNlLi43NWMxNWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2hlcm1lcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaGVybWVzLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAgICBDYWxsYWJsZSBmcm9tIGFueSBjb250ZXh0LgogKi8KLXN0YXRpYyBpbnQgaGVybWVzX2lzc3VlX2NtZChoZXJtZXNfdCAqaHcsIHUxNiBjbWQsIHUxNiBwYXJhbTAsCitzdGF0aWMgaW50IGhlcm1lc19pc3N1ZV9jbWQoc3RydWN0IGhlcm1lcyAqaHcsIHUxNiBjbWQsIHUxNiBwYXJhbTAsCiAJCQkgICAgdTE2IHBhcmFtMSwgdTE2IHBhcmFtMikKIHsKIAlpbnQgayA9IENNRF9CVVNZX1RJTUVPVVQ7CkBAIC0xMzIsNyArMTMyLDcgQEAKICAqLwogCiAvKiBGb3IgZG9pbmcgY21kcyB0aGF0IHdpcGUgdGhlIG1hZ2ljIGNvbnN0YW50IGluIFNXU1VQUE9SVDAgKi8KLXN0YXRpYyBpbnQgaGVybWVzX2RvaWNtZF93YWl0KGhlcm1lc190ICpodywgdTE2IGNtZCwKK3N0YXRpYyBpbnQgaGVybWVzX2RvaWNtZF93YWl0KHN0cnVjdCBoZXJtZXMgKmh3LCB1MTYgY21kLAogCQkJICAgICAgdTE2IHBhcm0wLCB1MTYgcGFybTEsIHUxNiBwYXJtMiwKIAkJCSAgICAgIHN0cnVjdCBoZXJtZXNfcmVzcG9uc2UgKnJlc3ApCiB7CkBAIC0xODUsNyArMTg1LDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi12b2lkIGhlcm1lc19zdHJ1Y3RfaW5pdChoZXJtZXNfdCAqaHcsIHZvaWQgX19pb21lbSAqYWRkcmVzcywgaW50IHJlZ19zcGFjaW5nKQordm9pZCBoZXJtZXNfc3RydWN0X2luaXQoc3RydWN0IGhlcm1lcyAqaHcsIHZvaWQgX19pb21lbSAqYWRkcmVzcywKKwkJCWludCByZWdfc3BhY2luZykKIHsKIAlody0+aW9iYXNlID0gYWRkcmVzczsKIAlody0+cmVnX3NwYWNpbmcgPSByZWdfc3BhY2luZzsKQEAgLTE5NSw3ICsxOTYsNyBAQAogfQogRVhQT1JUX1NZTUJPTChoZXJtZXNfc3RydWN0X2luaXQpOwogCi1zdGF0aWMgaW50IGhlcm1lc19pbml0KGhlcm1lc190ICpodykKK3N0YXRpYyBpbnQgaGVybWVzX2luaXQoc3RydWN0IGhlcm1lcyAqaHcpCiB7CiAJdTE2IHJlZzsKIAlpbnQgZXJyID0gMDsKQEAgLTI0OSw3ICsyNTAsNyBAQAogICogICAgID4gMCBvbiBlcnJvciByZXR1cm5lZCBieSB0aGUgZmlybXdhcmUKICAqCiAgKiBDYWxsYWJsZSBmcm9tIGFueSBjb250ZXh0LCBidXQgbG9ja2luZyBpcyB5b3VyIHByb2JsZW0uICovCi1zdGF0aWMgaW50IGhlcm1lc19kb2NtZF93YWl0KGhlcm1lc190ICpodywgdTE2IGNtZCwgdTE2IHBhcm0wLAorc3RhdGljIGludCBoZXJtZXNfZG9jbWRfd2FpdChzdHJ1Y3QgaGVybWVzICpodywgdTE2IGNtZCwgdTE2IHBhcm0wLAogCQkJICAgICBzdHJ1Y3QgaGVybWVzX3Jlc3BvbnNlICpyZXNwKQogewogCWludCBlcnI7CkBAIC0zMTMsNyArMzE0LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGhlcm1lc19hbGxvY2F0ZShoZXJtZXNfdCAqaHcsIHUxNiBzaXplLCB1MTYgKmZpZCkKK3N0YXRpYyBpbnQgaGVybWVzX2FsbG9jYXRlKHN0cnVjdCBoZXJtZXMgKmh3LCB1MTYgc2l6ZSwgdTE2ICpmaWQpCiB7CiAJaW50IGVyciA9IDA7CiAJaW50IGs7CkBAIC0zNjMsNyArMzY0LDcgQEAKICAqIGZyb20gZmlybXdhcmUKICAqCiAgKiBDYWxsYWJsZSBmcm9tIGFueSBjb250ZXh0ICovCi1zdGF0aWMgaW50IGhlcm1lc19iYXBfc2VlayhoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiBpZCwgdTE2IG9mZnNldCkKK3N0YXRpYyBpbnQgaGVybWVzX2JhcF9zZWVrKHN0cnVjdCBoZXJtZXMgKmh3LCBpbnQgYmFwLCB1MTYgaWQsIHUxNiBvZmZzZXQpCiB7CiAJaW50IHNyZWcgPSBiYXAgPyBIRVJNRVNfU0VMRUNUMSA6IEhFUk1FU19TRUxFQ1QwOwogCWludCBvcmVnID0gYmFwID8gSEVSTUVTX09GRlNFVDEgOiBIRVJNRVNfT0ZGU0VUMDsKQEAgLTQyMiw3ICs0MjMsNyBAQAogICogICAgICAgMCBvbiBzdWNjZXNzCiAgKiAgICAgPiAwIG9uIGVycm9yIGZyb20gZmlybXdhcmUKICAqLwotc3RhdGljIGludCBoZXJtZXNfYmFwX3ByZWFkKGhlcm1lc190ICpodywgaW50IGJhcCwgdm9pZCAqYnVmLCBpbnQgbGVuLAorc3RhdGljIGludCBoZXJtZXNfYmFwX3ByZWFkKHN0cnVjdCBoZXJtZXMgKmh3LCBpbnQgYmFwLCB2b2lkICpidWYsIGludCBsZW4sCiAJCQkgICAgdTE2IGlkLCB1MTYgb2Zmc2V0KQogewogCWludCBkcmVnID0gYmFwID8gSEVSTUVTX0RBVEExIDogSEVSTUVTX0RBVEEwOwpAQCAtNDM2LDcgKzQzNyw3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogQWN0dWFsbHkgZG8gdGhlIHRyYW5zZmVyICovCi0JaGVybWVzX3JlYWRfd29yZHMoaHcsIGRyZWcsIGJ1ZiwgbGVuLzIpOworCWhlcm1lc19yZWFkX3dvcmRzKGh3LCBkcmVnLCBidWYsIGxlbiAvIDIpOwogCiAgb3V0OgogCXJldHVybiBlcnI7CkBAIC00NTAsOCArNDUxLDggQEAKICAqICAgICAgIDAgb24gc3VjY2VzcwogICogICAgID4gMCBvbiBlcnJvciBmcm9tIGZpcm13YXJlCiAgKi8KLXN0YXRpYyBpbnQgaGVybWVzX2JhcF9wd3JpdGUoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4sCi0JCQkgICAgIHUxNiBpZCwgdTE2IG9mZnNldCkKK3N0YXRpYyBpbnQgaGVybWVzX2JhcF9wd3JpdGUoc3RydWN0IGhlcm1lcyAqaHcsIGludCBiYXAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCSAgICAgaW50IGxlbiwgdTE2IGlkLCB1MTYgb2Zmc2V0KQogewogCWludCBkcmVnID0gYmFwID8gSEVSTUVTX0RBVEExIDogSEVSTUVTX0RBVEEwOwogCWludCBlcnIgPSAwOwpAQCAtNDc4LDggKzQ3OSw4IEBACiAgKiBwcmFjdGljZS4KICAqCiAgKiBDYWxsYWJsZSBmcm9tIHVzZXIgb3IgYmggY29udGV4dC4gICovCi1zdGF0aWMgaW50IGhlcm1lc19yZWFkX2x0dihoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiByaWQsIHVuc2lnbmVkIGJ1ZnNpemUsCi0JCQkgICB1MTYgKmxlbmd0aCwgdm9pZCAqYnVmKQorc3RhdGljIGludCBoZXJtZXNfcmVhZF9sdHYoc3RydWN0IGhlcm1lcyAqaHcsIGludCBiYXAsIHUxNiByaWQsCisJCQkgICB1bnNpZ25lZCBidWZzaXplLCB1MTYgKmxlbmd0aCwgdm9pZCAqYnVmKQogewogCWludCBlcnIgPSAwOwogCWludCBkcmVnID0gYmFwID8gSEVSTUVTX0RBVEExIDogSEVSTUVTX0RBVEEwOwpAQCAtNTIzLDcgKzUyNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGVybWVzX3dyaXRlX2x0dihoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiByaWQsCitzdGF0aWMgaW50IGhlcm1lc193cml0ZV9sdHYoc3RydWN0IGhlcm1lcyAqaHcsIGludCBiYXAsIHUxNiByaWQsCiAJCQkgICAgdTE2IGxlbmd0aCwgY29uc3Qgdm9pZCAqdmFsdWUpCiB7CiAJaW50IGRyZWcgPSBiYXAgPyBIRVJNRVNfREFUQTEgOiBIRVJNRVNfREFUQTA7CkBAIC01NTMsMTQgKzU1NCwxNCBAQAogLyoqKiBIZXJtZXMgQVVYIGNvbnRyb2wgKioqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQKLWhlcm1lc19hdXhfc2V0YWRkcihoZXJtZXNfdCAqaHcsIHUzMiBhZGRyKQoraGVybWVzX2F1eF9zZXRhZGRyKHN0cnVjdCBoZXJtZXMgKmh3LCB1MzIgYWRkcikKIHsKIAloZXJtZXNfd3JpdGVfcmVnKGh3LCBIRVJNRVNfQVVYUEFHRSwgKHUxNikgKGFkZHIgPj4gNykpOwogCWhlcm1lc193cml0ZV9yZWcoaHcsIEhFUk1FU19BVVhPRkZTRVQsICh1MTYpIChhZGRyICYgMHg3RikpOwogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGVybWVzX2F1eF9jb250cm9sKGhlcm1lc190ICpodywgaW50IGVuYWJsZWQpCitoZXJtZXNfYXV4X2NvbnRyb2woc3RydWN0IGhlcm1lcyAqaHcsIGludCBlbmFibGVkKQogewogCWludCBkZXNpcmVkX3N0YXRlID0gZW5hYmxlZCA/IEhFUk1FU19BVVhfRU5BQkxFRCA6IEhFUk1FU19BVVhfRElTQUJMRUQ7CiAJaW50IGFjdGlvbiA9IGVuYWJsZWQgPyBIRVJNRVNfQVVYX0VOQUJMRSA6IEhFUk1FU19BVVhfRElTQUJMRTsKQEAgLTU5NCw3ICs1OTUsNyBAQAogICogd2xfbGttIEFnZXJlIGZ3IGRvZXMKICAqIERvbid0IGtub3cgYWJvdXQgaW50ZXJzaWwKICAqLwotc3RhdGljIGludCBoZXJtZXNpX3Byb2dyYW1faW5pdChoZXJtZXNfdCAqaHcsIHUzMiBvZmZzZXQpCitzdGF0aWMgaW50IGhlcm1lc2lfcHJvZ3JhbV9pbml0KHN0cnVjdCBoZXJtZXMgKmh3LCB1MzIgb2Zmc2V0KQogewogCWludCBlcnI7CiAKQEAgLTY0Myw3ICs2NDQsNyBAQAogICogd2xfbGttIEFnZXJlIGZ3IGRvZXMKICAqIERvbid0IGtub3cgYWJvdXQgaW50ZXJzaWwKICAqLwotc3RhdGljIGludCBoZXJtZXNpX3Byb2dyYW1fZW5kKGhlcm1lc190ICpodykKK3N0YXRpYyBpbnQgaGVybWVzaV9wcm9ncmFtX2VuZChzdHJ1Y3QgaGVybWVzICpodykKIHsKIAlzdHJ1Y3QgaGVybWVzX3Jlc3BvbnNlIHJlc3A7CiAJaW50IHJjID0gMDsKQEAgLTY4NCw3ICs2ODUsOCBAQAogfQogCiAvKiBSZWFkIFBEQSBmcm9tIHRoZSBhZGFwdGVyICovCi1zdGF0aWMgaW50IGhlcm1lc19yZWFkX3BkYShoZXJtZXNfdCAqaHcsIF9fbGUxNiAqcGRhLCB1MzIgcGRhX2FkZHIsIHUxNiBwZGFfbGVuKQorc3RhdGljIGludCBoZXJtZXNfcmVhZF9wZGEoc3RydWN0IGhlcm1lcyAqaHcsIF9fbGUxNiAqcGRhLCB1MzIgcGRhX2FkZHIsCisJCQkgICB1MTYgcGRhX2xlbikKIHsKIAlpbnQgcmV0OwogCXUxNiBwZGFfc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaGVybWVzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2hlcm1lcy5oCmluZGV4IGQ5ZjE4YzEuLjI4YTQyNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaGVybWVzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXMuaApAQCAtMjgsNyArMjgsNyBAQAogICoKICAqIEFzIGEgbW9kdWxlIG9mIGxvdyBsZXZlbCBoYXJkd2FyZSBhY2Nlc3Mgcm91dGluZXMsIHRoZXJlIGlzIG5vCiAgKiBsb2NraW5nLiBVc2VycyBvZiB0aGlzIG1vZHVsZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhleSBzZXJpYWxpemUKLSAqIGFjY2VzcyB0byB0aGUgaGVybWVzX3Qgc3RydWN0dXJlLCBhbmQgdG8gdGhlIGhhcmR3YXJlCisgKiBhY2Nlc3MgdG8gdGhlIGhlcm1lcyBzdHJ1Y3R1cmUsIGFuZCB0byB0aGUgaGFyZHdhcmUKICovCiAKICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgpAQCAtNDMsNyArNDMsNyBAQAogI2RlZmluZQkJSEVSTUVTX0JBUF9EQVRBTEVOX01BWAkJKDQwOTYpCiAjZGVmaW5lCQlIRVJNRVNfQkFQX09GRlNFVF9NQVgJCSg0MDk2KQogI2RlZmluZQkJSEVSTUVTX1BPUlRJRF9NQVgJCSg3KQotI2RlZmluZQkJSEVSTUVTX05VTVBPUlRTX01BWAkJKEhFUk1FU19QT1JUSURfTUFYKzEpCisjZGVmaW5lCQlIRVJNRVNfTlVNUE9SVFNfTUFYCQkoSEVSTUVTX1BPUlRJRF9NQVggKyAxKQogI2RlZmluZQkJSEVSTUVTX1BEUl9MRU5fTUFYCQkoMjYwKQkvKiBpbiBieXRlcywgZnJvbSBFSyAqLwogI2RlZmluZQkJSEVSTUVTX1BEQV9SRUNTX01BWAkJKDIwMCkJLyogYSBndWVzcyAqLwogI2RlZmluZQkJSEVSTUVTX1BEQV9MRU5fTUFYCQkoMTAyNCkJLyogaW4gYnl0ZXMsIGZyb20gRUsgKi8KQEAgLTE0OCw3ICsxNDgsNyBAQAogI2RlZmluZQkJSEVSTUVTX0NNRF9XUklURU1JRgkJKDB4MDAzMSkKIAogLyotLS0gRGVidWdnaW5nIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgCUhFUk1FU19DTURfVEVTVAkJCSgweDAwMzgpCisjZGVmaW5lCQlIRVJNRVNfQ01EX1RFU1QJCQkoMHgwMDM4KQogCiAKIC8qIFRlc3QgY29tbWFuZCBhcmd1bWVudHMgKi8KQEAgLTE3OCw4ICsxNzgsOCBAQAogCiAjZGVmaW5lIEhFUk1FU19ERVNDUklQVE9SX09GRlNFVAkwCiAjZGVmaW5lIEhFUk1FU184MDJfMTFfT0ZGU0VUCQkoMTQpCi0jZGVmaW5lIEhFUk1FU184MDJfM19PRkZTRVQJCSgxNCszMikKLSNkZWZpbmUgSEVSTUVTXzgwMl8yX09GRlNFVAkJKDE0KzMyKzE0KQorI2RlZmluZSBIRVJNRVNfODAyXzNfT0ZGU0VUCQkoMTQgKyAzMikKKyNkZWZpbmUgSEVSTUVTXzgwMl8yX09GRlNFVAkJKDE0ICsgMzIgKyAxNCkKICNkZWZpbmUgSEVSTUVTX1RYQ05UTDJfT0ZGU0VUCQkoSEVSTUVTXzgwMl8zX09GRlNFVCAtIDIpCiAKICNkZWZpbmUgSEVSTUVTX1JYU1RBVF9FUlIJCSgweDAwMDMpCkBAIC00MDYsNyArNDA2LDcgQEAKIH07CiAKIC8qIEJhc2ljIGNvbnRyb2wgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBoZXJtZXMgeworc3RydWN0IGhlcm1lcyB7CiAJdm9pZCBfX2lvbWVtICppb2Jhc2U7CiAJaW50IHJlZ19zcGFjaW5nOwogI2RlZmluZSBIRVJNRVNfMTZCSVRfUkVHU1BBQ0lORwkwCkBAIC00MTUsNyArNDE1LDcgQEAKIAlib29sIGVlcHJvbV9wZGE7CiAJY29uc3Qgc3RydWN0IGhlcm1lc19vcHMgKm9wczsKIAl2b2lkICpwcml2OwotfSBoZXJtZXNfdDsKK307CiAKIC8qIFJlZ2lzdGVyIGFjY2VzcyBjb252ZW5pZW5jZSBtYWNyb3MgKi8KICNkZWZpbmUgaGVybWVzX3JlYWRfcmVnKGh3LCBvZmYpIFwKQEAgLTQyNywyOCArNDI3LDI5IEBACiAJaGVybWVzX3dyaXRlX3JlZygoaHcpLCBIRVJNRVNfIyNuYW1lLCAodmFsKSkKIAogLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLwotdm9pZCBoZXJtZXNfc3RydWN0X2luaXQoaGVybWVzX3QgKmh3LCB2b2lkIF9faW9tZW0gKmFkZHJlc3MsIGludCByZWdfc3BhY2luZyk7Cit2b2lkIGhlcm1lc19zdHJ1Y3RfaW5pdChzdHJ1Y3QgaGVybWVzICpodywgdm9pZCBfX2lvbWVtICphZGRyZXNzLAorCQkJaW50IHJlZ19zcGFjaW5nKTsKIAogLyogSW5saW5lIGZ1bmN0aW9ucyAqLwogCi1zdGF0aWMgaW5saW5lIGludCBoZXJtZXNfcHJlc2VudChoZXJtZXNfdCAqaHcpCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfcHJlc2VudChzdHJ1Y3QgaGVybWVzICpodykKIHsKIAlyZXR1cm4gaGVybWVzX3JlYWRfcmVnbihodywgU1dTVVBQT1JUMCkgPT0gSEVSTUVTX01BR0lDOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaGVybWVzX3NldF9pcnFtYXNrKGhlcm1lc190ICpodywgdTE2IGV2ZW50cykKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZXJtZXNfc2V0X2lycW1hc2soc3RydWN0IGhlcm1lcyAqaHcsIHUxNiBldmVudHMpCiB7CiAJaHctPmludGVuID0gZXZlbnRzOwogCWhlcm1lc193cml0ZV9yZWduKGh3LCBJTlRFTiwgZXZlbnRzKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaGVybWVzX2VuYWJsZV9wb3J0KGhlcm1lc190ICpodywgaW50IHBvcnQpCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfZW5hYmxlX3BvcnQoc3RydWN0IGhlcm1lcyAqaHcsIGludCBwb3J0KQogewogCXJldHVybiBody0+b3BzLT5jbWRfd2FpdChodywgSEVSTUVTX0NNRF9FTkFCTEUgfCAocG9ydCA8PCA4KSwKIAkJCQkgMCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19kaXNhYmxlX3BvcnQoaGVybWVzX3QgKmh3LCBpbnQgcG9ydCkKK3N0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19kaXNhYmxlX3BvcnQoc3RydWN0IGhlcm1lcyAqaHcsIGludCBwb3J0KQogewogCXJldHVybiBody0+b3BzLT5jbWRfd2FpdChodywgSEVSTUVTX0NNRF9ESVNBQkxFIHwgKHBvcnQgPDwgOCksCiAJCQkJIDAsIE5VTEwpOwpAQCAtNDU2LDEzICs0NTcsMTMgQEAKIAogLyogSW5pdGlhdGUgYW4gSU5RVUlSRSBjb21tYW5kICh0YWxsaWVzIG9yIHNjYW4pLiAgVGhlIHJlc3VsdCB3aWxsIGNvbWUgYXMgYW4KICAqIGluZm9ybWF0aW9uIGZyYW1lIGluIF9fb3Jpbm9jb19ldl9pbmZvKCkgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19pbnF1aXJlKGhlcm1lc190ICpodywgdTE2IHJpZCkKK3N0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19pbnF1aXJlKHN0cnVjdCBoZXJtZXMgKmh3LCB1MTYgcmlkKQogewogCXJldHVybiBody0+b3BzLT5jbWRfd2FpdChodywgSEVSTUVTX0NNRF9JTlFVSVJFLCByaWQsIE5VTEwpOwogfQogCi0jZGVmaW5lIEhFUk1FU19CWVRFU19UT19SRUNMRU4obikgKCgoKG4pKzEpLzIpICsgMSkKLSNkZWZpbmUgSEVSTUVTX1JFQ0xFTl9UT19CWVRFUyhuKSAoKChuKS0xKSAqIDIpCisjZGVmaW5lIEhFUk1FU19CWVRFU19UT19SRUNMRU4obikgKCgoKG4pICsgMSkgLyAyKSArIDEpCisjZGVmaW5lIEhFUk1FU19SRUNMRU5fVE9fQllURVMobikgKCgobikgLSAxKSAqIDIpCiAKIC8qIE5vdGUgdGhhdCBmb3IgdGhlIG5leHQgdHdvLCB0aGUgY291bnQgaXMgaW4gMTYtYml0IHdvcmRzLCBub3QgYnl0ZXMgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBoZXJtZXNfcmVhZF93b3JkcyhzdHJ1Y3QgaGVybWVzICpodywgaW50IG9mZiwKQEAgLTQ5OCw3ICs0OTksOCBAQAogCShody0+b3BzLT53cml0ZV9sdHYoKGh3KSwgKGJhcCksIChyaWQpLCBcCiAJCQkgICAgSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihzaXplb2YoKmJ1ZikpLCAoYnVmKSkpCiAKLXN0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19yZWFkX3dvcmRyZWMoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLCB1MTYgKndvcmQpCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfcmVhZF93b3JkcmVjKHN0cnVjdCBoZXJtZXMgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLAorCQkJCSAgICAgIHUxNiAqd29yZCkKIHsKIAlfX2xlMTYgcmVjOwogCWludCBlcnI7CkBAIC01MDgsNyArNTEwLDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBoZXJtZXNfd3JpdGVfd29yZHJlYyhoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiByaWQsIHUxNiB3b3JkKQorc3RhdGljIGlubGluZSBpbnQgaGVybWVzX3dyaXRlX3dvcmRyZWMoc3RydWN0IGhlcm1lcyAqaHcsIGludCBiYXAsIHUxNiByaWQsCisJCQkJICAgICAgIHUxNiB3b3JkKQogewogCV9fbGUxNiByZWMgPSBjcHVfdG9fbGUxNih3b3JkKTsKIAlyZXR1cm4gSEVSTUVTX1dSSVRFX1JFQ09SRChodywgYmFwLCByaWQsICZyZWMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXNfZGxkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2hlcm1lc19kbGQuYwppbmRleCAyYjJiOWExLi40YTEwYjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2hlcm1lc19kbGQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2hlcm1lc19kbGQuYwpAQCAtMTkzLDcgKzE5Myw3IEBACiAKIC8qIFByb2Nlc3Mgb25lIFBsdWcgRGF0YSBJdGVtIC0gZmluZCBjb3JyZXNwb25kaW5nIFBEUiBhbmQgcGx1ZyBpdCAqLwogc3RhdGljIGludAotaGVybWVzX3BsdWdfcGRpKGhlcm1lc190ICpodywgY29uc3Qgc3RydWN0IHBkciAqZmlyc3RfcGRyLAoraGVybWVzX3BsdWdfcGRpKHN0cnVjdCBoZXJtZXMgKmh3LCBjb25zdCBzdHJ1Y3QgcGRyICpmaXJzdF9wZHIsCiAJCWNvbnN0IHN0cnVjdCBwZGkgKnBkaSwgY29uc3Qgdm9pZCAqcGRyX2VuZCkKIHsKIAljb25zdCBzdHJ1Y3QgcGRyICpwZHI7CkBAIC0yMjAsNyArMjIwLDcgQEAKICAqIEF0dGVtcHQgdG8gd3JpdGUgZXZlcnkgcmVjb3JkcyB0aGF0IGlzIGluIHRoZSBzcGVjaWZpZWQgcGRhCiAgKiB3aGljaCBhbHNvIGhhcyBhIHZhbGlkIHByb2R1Y3Rpb24gZGF0YSByZWNvcmQgZm9yIHRoZSBmaXJtd2FyZS4KICAqLwotaW50IGhlcm1lc19hcHBseV9wZGEoaGVybWVzX3QgKmh3LAoraW50IGhlcm1lc19hcHBseV9wZGEoc3RydWN0IGhlcm1lcyAqaHcsCiAJCSAgICAgY29uc3QgY2hhciAqZmlyc3RfcGRyLAogCQkgICAgIGNvbnN0IHZvaWQgKnBkcl9lbmQsCiAJCSAgICAgY29uc3QgX19sZTE2ICpwZGEsCkBAIC0yNzQsNyArMjc0LDcgQEAKIC8qKiogSGVybWVzIHByb2dyYW1taW5nICoqKi8KIAogLyogUHJvZ3JhbSB0aGUgZGF0YSBibG9ja3MgKi8KLWludCBoZXJtZXNfcHJvZ3JhbShoZXJtZXNfdCAqaHcsIGNvbnN0IGNoYXIgKmZpcnN0X2Jsb2NrLCBjb25zdCB2b2lkICplbmQpCitpbnQgaGVybWVzX3Byb2dyYW0oc3RydWN0IGhlcm1lcyAqaHcsIGNvbnN0IGNoYXIgKmZpcnN0X2Jsb2NrLCBjb25zdCB2b2lkICplbmQpCiB7CiAJY29uc3Qgc3RydWN0IGRibG9jayAqYmxrOwogCXUzMiBibGthZGRyOwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAgKgogICogRm9yIGNlcnRhaW4gcmVjb3JkcywgdXNlIGRlZmF1bHRzIGlmIHRoZXkgYXJlIG5vdCBmb3VuZCBpbiBwZGEuCiAgKi8KLWludCBoZXJtZXNfYXBwbHlfcGRhX3dpdGhfZGVmYXVsdHMoaGVybWVzX3QgKmh3LAoraW50IGhlcm1lc19hcHBseV9wZGFfd2l0aF9kZWZhdWx0cyhzdHJ1Y3QgaGVybWVzICpodywKIAkJCQkgICBjb25zdCBjaGFyICpmaXJzdF9wZHIsCiAJCQkJICAgY29uc3Qgdm9pZCAqcGRyX2VuZCwKIAkJCQkgICBjb25zdCBfX2xlMTYgKnBkYSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaGVybWVzX2RsZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXNfZGxkLmgKaW5kZXggNTgzYTViYy4uYjUzNzdlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXNfZGxkLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXNfZGxkLmgKQEAgLTI3LDIxICsyNywyMSBAQAogCiAjaW5jbHVkZSAiaGVybWVzLmgiCiAKLWludCBoZXJtZXNpX3Byb2dyYW1faW5pdChoZXJtZXNfdCAqaHcsIHUzMiBvZmZzZXQpOwotaW50IGhlcm1lc2lfcHJvZ3JhbV9lbmQoaGVybWVzX3QgKmh3KTsKLWludCBoZXJtZXNfcHJvZ3JhbShoZXJtZXNfdCAqaHcsIGNvbnN0IGNoYXIgKmZpcnN0X2Jsb2NrLCBjb25zdCB2b2lkICplbmQpOworaW50IGhlcm1lc2lfcHJvZ3JhbV9pbml0KHN0cnVjdCBoZXJtZXMgKmh3LCB1MzIgb2Zmc2V0KTsKK2ludCBoZXJtZXNpX3Byb2dyYW1fZW5kKHN0cnVjdCBoZXJtZXMgKmh3KTsKK2ludCBoZXJtZXNfcHJvZ3JhbShzdHJ1Y3QgaGVybWVzICpodywgY29uc3QgY2hhciAqZmlyc3RfYmxvY2ssIGNvbnN0IHZvaWQgKmVuZCk7CiAKLWludCBoZXJtZXNfcmVhZF9wZGEoaGVybWVzX3QgKmh3LAoraW50IGhlcm1lc19yZWFkX3BkYShzdHJ1Y3QgaGVybWVzICpodywKIAkJICAgIF9fbGUxNiAqcGRhLAogCQkgICAgdTMyIHBkYV9hZGRyLAogCQkgICAgdTE2IHBkYV9sZW4sCiAJCSAgICBpbnQgdXNlX2VlcHJvbSk7Ci1pbnQgaGVybWVzX2FwcGx5X3BkYShoZXJtZXNfdCAqaHcsCitpbnQgaGVybWVzX2FwcGx5X3BkYShzdHJ1Y3QgaGVybWVzICpodywKIAkJICAgICBjb25zdCBjaGFyICpmaXJzdF9wZHIsCiAJCSAgICAgY29uc3Qgdm9pZCAqcGRyX2VuZCwKIAkJICAgICBjb25zdCBfX2xlMTYgKnBkYSwKIAkJICAgICBjb25zdCB2b2lkICpwZGFfZW5kKTsKLWludCBoZXJtZXNfYXBwbHlfcGRhX3dpdGhfZGVmYXVsdHMoaGVybWVzX3QgKmh3LAoraW50IGhlcm1lc19hcHBseV9wZGFfd2l0aF9kZWZhdWx0cyhzdHJ1Y3QgaGVybWVzICpodywKIAkJCQkgICBjb25zdCBjaGFyICpmaXJzdF9wZHIsCiAJCQkJICAgY29uc3Qgdm9pZCAqcGRyX2VuZCwKIAkJCQkgICBjb25zdCBfX2xlMTYgKnBkYSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaHcuYwppbmRleCAzYzc4NzdhLi5jMDljODQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9ody5jCkBAIC00Nyw3ICs0Nyw3IEBACiAJdTE2IGlkLCB2YXJpYW50LCBtYWpvciwgbWlub3I7CiB9IF9fcGFja2VkOwogCi1zdGF0aWMgaW5saW5lIGZ3dHlwZV90IGRldGVybWluZV9maXJtd2FyZV90eXBlKHN0cnVjdCBjb21wX2lkICpuaWNfaWQpCitzdGF0aWMgaW5saW5lIGVudW0gZnd0eXBlIGRldGVybWluZV9maXJtd2FyZV90eXBlKHN0cnVjdCBjb21wX2lkICpuaWNfaWQpCiB7CiAJaWYgKG5pY19pZC0+aWQgPCAweDgwMDApCiAJCXJldHVybiBGSVJNV0FSRV9UWVBFX0FHRVJFOwpAQCAtNzEsMTEgKzcxLDExIEBACiAJCQkgICAgICB1MzIgKmh3X3ZlcikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCBlcnI7CiAJc3RydWN0IGNvbXBfaWQgbmljX2lkLCBzdGFfaWQ7CiAJdW5zaWduZWQgaW50IGZpcm12ZXI7Ci0JY2hhciB0bXBbU1lNQk9MX01BWF9WRVJfTEVOKzFdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMikpKTsKKwljaGFyIHRtcFtTWU1CT0xfTUFYX1ZFUl9MRU4gKyAxXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDIpKSk7CiAKIAkvKiBHZXQgdGhlIGhhcmR3YXJlIHZlcnNpb24gKi8KIAllcnIgPSBIRVJNRVNfUkVBRF9SRUNPUkQoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX05JQ0lELCAmbmljX2lkKTsKQEAgLTI4MCw3ICsyODAsNyBAQAogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHByaXYtPmRldjsKIAlzdHJ1Y3QgaGVybWVzX2lkc3RyaW5nIG5pY2tidWY7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCBsZW47CiAJaW50IGVycjsKIAl1MTYgcmVjbGVuOwpAQCAtNDU4LDcgKzQ1OCw3IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5kZXY7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IG5ldGRldl9wcml2KGRldik7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCBlcnI7CiAJc3RydWN0IGhlcm1lc19pZHN0cmluZyBpZGJ1ZjsKIApAQCAtNTI5LDcgKzUyOSw3IEBACiAJbWVtY3B5KCZpZGJ1Zi52YWwsIHByaXYtPmRlc2lyZWRfZXNzaWQsIHNpemVvZihpZGJ1Zi52YWwpKTsKIAkvKiBXaW5YUCB3YW50cyBwYXJ0bmVyIHRvIGNvbmZpZ3VyZSBPV05TU0lEIGV2ZW4gaW4gSUJTUyBtb2RlLiAoamltYykgKi8KIAllcnIgPSBody0+b3BzLT53cml0ZV9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORk9XTlNTSUQsCi0JCQlIRVJNRVNfQllURVNfVE9fUkVDTEVOKHN0cmxlbihwcml2LT5kZXNpcmVkX2Vzc2lkKSsyKSwKKwkJCUhFUk1FU19CWVRFU19UT19SRUNMRU4oc3RybGVuKHByaXYtPmRlc2lyZWRfZXNzaWQpICsgMiksCiAJCQkmaWRidWYpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBPV05TU0lEXG4iLApAQCAtNTM3LDcgKzUzNyw3IEBACiAJCXJldHVybiBlcnI7CiAJfQogCWVyciA9IGh3LT5vcHMtPndyaXRlX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GREVTSVJFRFNTSUQsCi0JCQlIRVJNRVNfQllURVNfVE9fUkVDTEVOKHN0cmxlbihwcml2LT5kZXNpcmVkX2Vzc2lkKSsyKSwKKwkJCUhFUk1FU19CWVRFU19UT19SRUNMRU4oc3RybGVuKHByaXYtPmRlc2lyZWRfZXNzaWQpICsgMiksCiAJCQkmaWRidWYpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBERVNJUkVEU1NJRFxuIiwKQEAgLTU0OSw3ICs1NDksNyBAQAogCWlkYnVmLmxlbiA9IGNwdV90b19sZTE2KHN0cmxlbihwcml2LT5uaWNrKSk7CiAJbWVtY3B5KCZpZGJ1Zi52YWwsIHByaXYtPm5pY2ssIHNpemVvZihpZGJ1Zi52YWwpKTsKIAllcnIgPSBody0+b3BzLT53cml0ZV9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORk9XTk5BTUUsCi0JCQkJIEhFUk1FU19CWVRFU19UT19SRUNMRU4oc3RybGVuKHByaXYtPm5pY2spKzIpLAorCQkJCSBIRVJNRVNfQllURVNfVE9fUkVDTEVOKHN0cmxlbihwcml2LT5uaWNrKSArIDIpLAogCQkJCSAmaWRidWYpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBuaWNrbmFtZVxuIiwKQEAgLTY4OSw3ICs2ODksNyBAQAogLyogR2V0IHRzYyBmcm9tIHRoZSBmaXJtd2FyZSAqLwogaW50IG9yaW5vY29faHdfZ2V0X3RraXBfaXYoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwgaW50IGtleSwgdTggKnRzYykKIHsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJaW50IGVyciA9IDA7CiAJdTggdHNjX2Fycls0XVtPUklOT0NPX1NFUV9MRU5dOwogCkBAIC03MDYsNyArNzA2LDcgQEAKIAogaW50IF9fb3Jpbm9jb19od19zZXRfYml0cmF0ZShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQogewotCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKIAlpbnQgcmF0ZW1vZGUgPSBwcml2LT5iaXRyYXRlbW9kZTsKIAlpbnQgZXJyID0gMDsKIApAQCAtNzM3LDcgKzczNyw3IEBACiAKIGludCBvcmlub2NvX2h3X2dldF9hY3RfYml0cmF0ZShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LCBpbnQgKmJpdHJhdGUpCiB7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCBpOwogCWludCBlcnIgPSAwOwogCXUxNiB2YWw7CkBAIC03ODYsNyArNzg2LDcgQEAKIHsKIAlpbnQgcm9hbWluZ19mbGFnOwogCWludCBlcnIgPSAwOwotCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKIAogCXN3aXRjaCAocHJpdi0+ZmlybXdhcmVfdHlwZSkgewogCWNhc2UgRklSTVdBUkVfVFlQRV9BR0VSRToKQEAgLTgxOCw3ICs4MTgsNyBAQAogICogd2hpY2ggaXMgbmVlZGVkIGZvciA4MDIuMXggaW1wbGVtZW50YXRpb25zLiAqLwogaW50IF9fb3Jpbm9jb19od19zZXR1cF93ZXBrZXlzKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCiB7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCBlcnIgPSAwOwogCWludCBpOwogCkBAIC05MDIsNyArOTAyLDcgQEAKIAogaW50IF9fb3Jpbm9jb19od19zZXR1cF9lbmMoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKIHsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJaW50IGVyciA9IDA7CiAJaW50IG1hc3Rlcl93ZXBfZmxhZzsKIAlpbnQgYXV0aF9mbGFnOwpAQCAtOTk5LDcgKzk5OSw3IEBACiAJCXU4IHJ4X21pY1tNSUNfS0VZTEVOXTsKIAkJdTggdHNjW09SSU5PQ09fU0VRX0xFTl07CiAJfSBfX3BhY2tlZCBidWY7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCByZXQ7CiAJaW50IGVycjsKIAlpbnQgazsKQEAgLTEwNTIsNyArMTA1Miw3IEBACiAKIGludCBvcmlub2NvX2NsZWFyX3RraXBfa2V5KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsIGludCBrZXlfaWR4KQogewotCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKIAlpbnQgZXJyOwogCiAJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLApAQCAtMTA2OCw3ICsxMDY4LDcgQEAKIAkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgaW50IG1jX2NvdW50LCBpbnQgcHJvbWlzYykKIHsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJaW50IGVyciA9IDA7CiAKIAlpZiAocHJvbWlzYyAhPSBwcml2LT5wcm9taXNjdW91cykgewpAQCAtMTExMSw5ICsxMTExLDkgQEAKIAogLyogUmV0dXJuIDogPCAwIC0+IGVycm9yIGNvZGUgOyA+PSAwIC0+IGxlbmd0aCAqLwogaW50IG9yaW5vY29faHdfZ2V0X2Vzc2lkKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsIGludCAqYWN0aXZlLAotCQkJIGNoYXIgYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdKQorCQkJIGNoYXIgYnVmW0lXX0VTU0lEX01BWF9TSVpFICsgMV0pCiB7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCBlcnIgPSAwOwogCXN0cnVjdCBoZXJtZXNfaWRzdHJpbmcgZXNzaWRidWY7CiAJY2hhciAqcCA9IChjaGFyICopKCZlc3NpZGJ1Zi52YWwpOwpAQCAtMTE2Niw3ICsxMTY2LDcgQEAKIAogaW50IG9yaW5vY29faHdfZ2V0X2ZyZXEoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKIHsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJaW50IGVyciA9IDA7CiAJdTE2IGNoYW5uZWw7CiAJaW50IGZyZXEgPSAwOwpAQCAtMTIwNiw3ICsxMjA2LDcgQEAKIGludCBvcmlub2NvX2h3X2dldF9iaXRyYXRlbGlzdChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LAogCQkJICAgICAgIGludCAqbnVtcmF0ZXMsIHMzMiAqcmF0ZXMsIGludCBtYXgpCiB7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCXN0cnVjdCBoZXJtZXNfaWRzdHJpbmcgbGlzdDsKIAl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikmbGlzdC52YWw7CiAJaW50IGVyciA9IDA7CkBAIC0xMjM4LDcgKzEyMzgsNyBAQAogCQkJICAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9zc2lkICpzc2lkKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5uZGV2OwotCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnIgPSAwOwogCkBAIC0xMzIzLDcgKzEzMjMsNyBAQAogaW50IG9yaW5vY29faHdfZGlzYXNzb2NpYXRlKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCiAJCQkgICAgdTggKmFkZHIsIHUxNiByZWFzb25fY29kZSkKIHsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJaW50IGVycjsKIAogCXN0cnVjdCB7CkBAIC0xMzQ2LDcgKzEzNDYsNyBAQAogaW50IG9yaW5vY29faHdfZ2V0X2N1cnJlbnRfYnNzaWQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwKIAkJCQkgdTggKmFkZHIpCiB7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCBlcnI7CiAKIAllcnIgPSBody0+b3BzLT5yZWFkX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ1VSUkVOVEJTU0lELApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9ody5oCmluZGV4IDk3YWY3MWUuLjhmNjgzMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaHcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2h3LmgKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgaW50IG1jX2NvdW50LCBpbnQgcHJvbWlzYyk7CiBpbnQgb3Jpbm9jb19od19nZXRfZXNzaWQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwgaW50ICphY3RpdmUsCi0JCQkgY2hhciBidWZbSVdfRVNTSURfTUFYX1NJWkUrMV0pOworCQkJIGNoYXIgYnVmW0lXX0VTU0lEX01BWF9TSVpFICsgMV0pOwogaW50IG9yaW5vY29faHdfZ2V0X2ZyZXEoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdik7CiBpbnQgb3Jpbm9jb19od19nZXRfYml0cmF0ZWxpc3Qoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwKIAkJCSAgICAgICBpbnQgKm51bXJhdGVzLCBzMzIgKnJhdGVzLCBpbnQgbWF4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9tYWluLmMKaW5kZXggNjJjNmIyYi4uZWY3ZWZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9tYWluLmMKQEAgLTQsNyArNCw3IEBACiAgKiBhZGFwdG9ycywgd2l0aCBMdWNlbnQvQWdlcmUsIEludGVyc2lsIG9yIFN5bWJvbCBmaXJtd2FyZS4KICAqCiAgKiBDdXJyZW50IG1haW50YWluZXJzIChhcyBvZiAyOSBTZXB0ZW1iZXIgMjAwMykgYXJlOgotICogCVBhdmVsIFJvc2tpbiA8cHJvc2tpIEFUIGdudS5vcmc+CisgKglQYXZlbCBSb3NraW4gPHByb3NraSBBVCBnbnUub3JnPgogICogYW5kCURhdmlkIEdpYnNvbiA8aGVybWVzIEFUIGdpYnNvbi5kcm9wYmVhci5pZC5hdT4KICAqCiAgKiAoQykgQ29weXJpZ2h0IERhdmlkIEdpYnNvbiwgSUJNIENvcnBvcmF0aW9uIDIwMDEtMjAwMy4KQEAgLTE0NiwxMCArMTQ2LDEwIEBACiAjZGVmaW5lIE9SSU5PQ09fTUFYX01UVQkJKElFRUU4MDIxMV9NQVhfREFUQV9MRU4gLSBFTkNBUFNfT1ZFUkhFQUQpCiAKICNkZWZpbmUgTUFYX0lSUUxPT1BTX1BFUl9JUlEJMTAKLSNkZWZpbmUgTUFYX0lSUUxPT1BTX1BFUl9KSUZGWQkoMjAwMDAvSFopIC8qIEJhc2VkIG9uIGEgZ3Vlc3RpbWF0ZSBvZgotCQkJCQkgICAgKiBob3cgbWFueSBldmVudHMgdGhlCi0JCQkJCSAgICAqIGRldmljZSBjb3VsZAotCQkJCQkgICAgKiBsZWdpdGltYXRlbHkgZ2VuZXJhdGUgKi8KKyNkZWZpbmUgTUFYX0lSUUxPT1BTX1BFUl9KSUZGWQkoMjAwMDAgLyBIWikJLyogQmFzZWQgb24gYSBndWVzdGltYXRlIG9mCisJCQkJCQkgKiBob3cgbWFueSBldmVudHMgdGhlCisJCQkJCQkgKiBkZXZpY2UgY291bGQKKwkJCQkJCSAqIGxlZ2l0aW1hdGVseSBnZW5lcmF0ZSAqLwogCiAjZGVmaW5lIERVTU1ZX0ZJRAkJMHhGRkZGCiAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICBIRVJNRVNfTUFYX01VTFRJQ0FTVCA6IDApKi8KICNkZWZpbmUgTUFYX01VTFRJQ0FTVChwcml2KQkoSEVSTUVTX01BWF9NVUxUSUNBU1QpCiAKLSNkZWZpbmUgT1JJTk9DT19JTlRFTgkgCShIRVJNRVNfRVZfUlggfCBIRVJNRVNfRVZfQUxMT0MgXAorI2RlZmluZSBPUklOT0NPX0lOVEVOCQkoSEVSTUVTX0VWX1JYIHwgSEVSTUVTX0VWX0FMTE9DIFwKIAkJCQkgfCBIRVJNRVNfRVZfVFggfCBIRVJNRVNfRVZfVFhFWEMgXAogCQkJCSB8IEhFUk1FU19FVl9XVEVSUiB8IEhFUk1FU19FVl9JTkZPIFwKIAkJCQkgfCBIRVJNRVNfRVZfSU5GRFJPUCkKQEAgLTQzNywxMiArNDM3LDEyIEBACiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5kZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJaW50IGVyciA9IDA7CiAJdTE2IHR4ZmlkID0gcHJpdi0+dHhmaWQ7CiAJaW50IHR4X2NvbnRyb2w7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCBtaWNfYnVmW01JQ0hBRUxfTUlDX0xFTisxXTsKKwl1OCBtaWNfYnVmW01JQ0hBRUxfTUlDX0xFTiArIDFdOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogVHggb24gc3RvcHBlZCBkZXZpY2UhXG4iLApAQCAtNTc5LDcgKzU3OSw3IEBACiAJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogfQogCi1zdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQorc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X2FsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBoZXJtZXMgKmh3KQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZGV2X3ByaXYoZGV2KTsKIAl1MTYgZmlkID0gaGVybWVzX3JlYWRfcmVnbihodywgQUxMT0NGSUQpOwpAQCAtNTk0LDcgKzU5NCw3IEBACiAJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEFMTE9DRklELCBEVU1NWV9GSUQpOwogfQogCi1zdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQorc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBoZXJtZXMgKmh3KQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CkBAIC02MDYsNyArNjA2LDcgQEAKIAloZXJtZXNfd3JpdGVfcmVnbihodywgVFhDT01QTEZJRCwgRFVNTVlfRklEKTsKIH0KIAotc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3R4ZXhjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl90eGV4YyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaGVybWVzICpodykKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOwpAQCAtNzUzLDcgKzc1Myw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOwotCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKIAogCWxlbiA9IGxlMTZfdG9fY3B1KGRlc2MtPmRhdGFfbGVuKTsKIApAQCAtODQwLDcgKzg0MCw3IEBACiAJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKIH0KIAotdm9pZCBfX29yaW5vY29fZXZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQordm9pZCBfX29yaW5vY29fZXZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGhlcm1lcyAqaHcpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5kZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKQEAgLTkxOCw3ICs5MTgsNyBAQAogCSAgIDMyYml0IGJvdW5kYXJ5LCBwbHVzIDEgYnl0ZSBzbyB3ZSBjYW4gcmVhZCBpbiBvZGQgbGVuZ3RoCiAJICAgcGFja2V0cyBmcm9tIHRoZSBjYXJkLCB3aGljaCBoYXMgYW4gSU8gZ3JhbnVsYXJpdHkgb2YgMTYKIAkgICBiaXRzICovCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGgrRVRIX0hMRU4rMisxKTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbmd0aCArIEVUSF9ITEVOICsgMiArIDEpOwogCWlmICghc2tiKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBhbGxvY2F0ZSBza2IgZm9yIFJ4XG4iLAogCQkgICAgICAgZGV2LT5uYW1lKTsKQEAgLTE0MDIsNyArMTQwMiw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2Nhbl9sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQgX19vcmlub2NvX2V2X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQordm9pZCBfX29yaW5vY29fZXZfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaGVybWVzICpodykKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmRldl9wcml2KGRldik7CiAJdTE2IGluZm9maWQ7CkBAIC0xNjIwLDcgKzE2MjAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChfX29yaW5vY29fZXZfaW5mbyk7CiAKLXN0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl9pbmZkcm9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl9pbmZkcm9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBoZXJtZXMgKmh3KQogewogCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW5mb3JtYXRpb24gZnJhbWUgbG9zdC5cbiIsIGRldi0+bmFtZSk7CkBAIC0xODMxLDcgKzE4MzEsNyBAQAogaW50IG9yaW5vY29fY29tbWl0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5kZXY7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCBlcnI7CiAKIAlpZiAocHJpdi0+YnJva2VuX2Rpc2FibGVwb3J0KSB7CkBAIC0xODc0LDEyICsxODc0LDEyIEBACiAvKiBJbnRlcnJ1cHQgaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl90aWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl90aWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBoZXJtZXMgKmh3KQogewogCXByaW50ayhLRVJOX0RFQlVHICIlczogVElDS1xuIiwgZGV2LT5uYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3d0ZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl93dGVycihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaGVybWVzICpodykKIHsKIAkvKiBUaGlzIHNlZW1zIHRvIGhhcHBlbiBhIGZhaXIgYml0IHVuZGVyIGxvYWQsIGJ1dCBpZ25vcmluZyBpdAogCSAgIHNlZW1zIHRvIHdvcmsgZmluZS4uLiovCkBAIC0xODkxLDcgKzE4OTEsNyBAQAogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBkZXZfaWQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5kZXY7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCBjb3VudCA9IE1BWF9JUlFMT09QU19QRVJfSVJROwogCXUxNiBldnN0YXQsIGV2ZW50czsKIAkvKiBUaGVzZSBhcmUgdXNlZCB0byBkZXRlY3QgYSBydW5hd2F5IGludGVycnVwdCBzaXR1YXRpb24uCkBAIC0xOTU4LDcgKzE5NTgsNyBAQAogCiAJCWV2c3RhdCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CiAJCWV2ZW50cyA9IGV2c3RhdCAmIGh3LT5pbnRlbjsKLQl9OworCX0KIAogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMjAxNyw4ICsyMDE3LDggQEAKIAl1bnJlZ2lzdGVyX3BtX25vdGlmaWVyKCZwcml2LT5wbV9ub3RpZmllcik7CiB9CiAjZWxzZSAvKiAhUE1fU0xFRVAgfHwgSEVSTUVTX0NBQ0hFX0ZXX09OX0lOSVQgKi8KLSNkZWZpbmUgb3Jpbm9jb19yZWdpc3Rlcl9wbV9ub3RpZmllcihwcml2KSBkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgb3Jpbm9jb191bnJlZ2lzdGVyX3BtX25vdGlmaWVyKHByaXYpIGRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBvcmlub2NvX3JlZ2lzdGVyX3BtX25vdGlmaWVyKHByaXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgb3Jpbm9jb191bnJlZ2lzdGVyX3BtX25vdGlmaWVyKHByaXYpIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMDI5LDcgKzIwMjksNyBAQAogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHByaXYtPmRldjsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gcHJpdl90b193aXBoeShwcml2KTsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJaW50IGVyciA9IDA7CiAKIAkvKiBObyBuZWVkIHRvIGxvY2ssIHRoZSBod191bmF2YWlsYWJsZSBmbGFnIGlzIGFscmVhZHkgc2V0IGluCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL21pYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9taWMuYwppbmRleCBjMDNlN2Y1Li5mY2U0YTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL21pYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vbWljLmMKQEAgLTU5LDEwICs1OSwxMCBAQAogCS8qIENvcHkgaGVhZGVyIGludG8gYnVmZmVyLiBXZSBuZWVkIHRoZSBwYWRkaW5nIG9uIHRoZSBlbmQgemVyb2VkICovCiAJbWVtY3B5KCZoZHJbMF0sIGRhLCBFVEhfQUxFTik7CiAJbWVtY3B5KCZoZHJbRVRIX0FMRU5dLCBzYSwgRVRIX0FMRU4pOwotCWhkcltFVEhfQUxFTioyXSA9IHByaW9yaXR5OwotCWhkcltFVEhfQUxFTioyKzFdID0gMDsKLQloZHJbRVRIX0FMRU4qMisyXSA9IDA7Ci0JaGRyW0VUSF9BTEVOKjIrM10gPSAwOworCWhkcltFVEhfQUxFTiAqIDJdID0gcHJpb3JpdHk7CisJaGRyW0VUSF9BTEVOICogMiArIDFdID0gMDsKKwloZHJbRVRIX0FMRU4gKiAyICsgMl0gPSAwOworCWhkcltFVEhfQUxFTiAqIDIgKyAzXSA9IDA7CiAKIAkvKiBVc2Ugc2NhdHRlciBnYXRoZXIgdG8gTUlDIGhlYWRlciBhbmQgZGF0YSBpbiBvbmUgZ28gKi8KIAlzZ19pbml0X3RhYmxlKHNnLCAyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvLmgKaW5kZXggMjU1NzEwZS4uM2JiOTM2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvLmgKQEAgLTQ5LDExICs0OSwxMSBAQAogCU9SSU5PQ09fQUxHX1RLSVAKIH07CiAKLXR5cGVkZWYgZW51bSB7CitlbnVtIGZ3dHlwZSB7CiAJRklSTVdBUkVfVFlQRV9BR0VSRSwKIAlGSVJNV0FSRV9UWVBFX0lOVEVSU0lMLAogCUZJUk1XQVJFX1RZUEVfU1lNQk9MCi19IGZ3dHlwZV90OworfTsKIAogc3RydWN0IGZpcm13YXJlOwogCkBAIC04OCwxMSArODgsMTEgQEAKIAlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CiAKIAkvKiBIYXJkd2FyZSBjb250cm9sIHZhcmlhYmxlcyAqLwotCWhlcm1lc190IGh3OworCXN0cnVjdCBoZXJtZXMgaHc7CiAJdTE2IHR4ZmlkOwogCiAJLyogQ2FwYWJpbGl0aWVzIG9mIHRoZSBoYXJkd2FyZS9maXJtd2FyZSAqLwotCWZ3dHlwZV90IGZpcm13YXJlX3R5cGU7CisJZW51bSBmd3R5cGUgZmlybXdhcmVfdHlwZTsKIAlpbnQgaWJzc19wb3J0OwogCWludCBuaWNidWZfc2l6ZTsKIAl1MTYgY2hhbm5lbF9tYXNrOwpAQCAtMTIyLDggKzEyMiw4IEBACiAJc3RydWN0IGtleV9wYXJhbXMga2V5c1tPUklOT0NPX01BWF9LRVlTXTsKIAogCWludCBiaXRyYXRlbW9kZTsKLQljaGFyIG5pY2tbSVdfRVNTSURfTUFYX1NJWkUrMV07Ci0JY2hhciBkZXNpcmVkX2Vzc2lkW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCWNoYXIgbmlja1tJV19FU1NJRF9NQVhfU0laRSArIDFdOworCWNoYXIgZGVzaXJlZF9lc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOwogCWNoYXIgZGVzaXJlZF9ic3NpZFtFVEhfQUxFTl07CiAJaW50IGJzc2lkX2ZpeGVkOwogCXUxNiBmcmFnX3RocmVzaCwgbXdvX3JvYnVzdDsKQEAgLTE5Nyw4ICsxOTcsOCBAQAogZXh0ZXJuIHZvaWQgb3Jpbm9jb19kb3duKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpOwogZXh0ZXJuIGlycXJldHVybl90IG9yaW5vY29faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiAKLWV4dGVybiB2b2lkIF9fb3Jpbm9jb19ldl9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodyk7Ci1leHRlcm4gdm9pZCBfX29yaW5vY29fZXZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KTsKK2V4dGVybiB2b2lkIF9fb3Jpbm9jb19ldl9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBoZXJtZXMgKmh3KTsKK2V4dGVybiB2b2lkIF9fb3Jpbm9jb19ldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaGVybWVzICpodyk7CiAKIGludCBvcmlub2NvX3Byb2Nlc3NfeG1pdF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX2NzLmMKaW5kZXggODhlM2MwZS4uM2Y3ZmM0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX2NzLmMKQEAgLTY1LDcgKzY1LDcgQEAKIHN0YXRpYyB2b2lkIG9yaW5vY29fY3NfZGV0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERldmljZSBtZXRob2RzICAgICAJCQkJCQkgICAgKi8KKy8qIERldmljZSBtZXRob2RzCQkJCQkJICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpbnQKQEAgLTg5LDcgKzg5LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUENNQ0lBIHN0dWZmICAgICAJCQkJCQkgICAgKi8KKy8qIFBDTUNJQSBzdHVmZgkJCQkJCQkgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGludApAQCAtMTM0LDcgKzEzNCw3IEBACiBvcmlub2NvX2NzX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbGluay0+cHJpdjsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJaW50IHJldDsKIAl2b2lkIF9faW9tZW0gKm1lbTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX25vcnRlbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX25vcnRlbC5jCmluZGV4IGJjM2VhMGIuLjMyNjM5NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19ub3J0ZWwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fbm9ydGVsLmMKQEAgLTI5Niw4ICsyOTYsNyBAQAogc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSBEUklWRVJfTkFNRSAiICIgRFJJVkVSX1ZFUlNJT04KIAkiIChUb2JpYXMgSG9mZm1hbm4gJiBDaHJpc3RvcGggSnVuZ2VnZ2VyIDxkaXNkb3NAdHJhdW00MDQuZGU+KSI7CiBNT0RVTEVfQVVUSE9SKCJDaHJpc3RvcGggSnVuZ2VnZ2VyIDxkaXNkb3NAdHJhdW00MDQuZGU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04KLSAgICAoIkRyaXZlciBmb3Igd2lyZWxlc3MgTEFOIGNhcmRzIHVzaW5nIHRoZSBOb3J0ZWwgUENJIGJyaWRnZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHdpcmVsZXNzIExBTiBjYXJkcyB1c2luZyB0aGUgTm9ydGVsIFBDSSBicmlkZ2UiKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKIAogc3RhdGljIGludCBfX2luaXQgb3Jpbm9jb19ub3J0ZWxfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX3BjaS5jCmluZGV4IDQ2ODE5N2YuLjYwNThjNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fcGNpLmMKQEAgLTYsNyArNiw3IEBACiAgKiBoZXJtZXMgcmVnaXN0ZXJzLCBhcyB3ZWxsIGFzIHRoZSBDT1IgcmVnaXN0ZXIuCiAgKgogICogQ3VycmVudCBtYWludGFpbmVycyBhcmU6Ci0gKiAJUGF2ZWwgUm9za2luIDxwcm9za2kgQVQgZ251Lm9yZz4KKyAqCVBhdmVsIFJvc2tpbiA8cHJvc2tpIEFUIGdudS5vcmc+CiAgKiBhbmQJRGF2aWQgR2lic29uIDxoZXJtZXMgQVQgZ2lic29uLmRyb3BiZWFyLmlkLmF1PgogICoKICAqIFNvbWUgb2YgdGhpcyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gb3Jpbm9jb19wbHguYwpAQCAtODEsNyArODEsNyBAQAogICovCiBzdGF0aWMgaW50IG9yaW5vY29fcGNpX2Nvcl9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQogewotCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJdTE2IHJlZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX3BseC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX3BseC5jCmluZGV4IDkzNThmNGQuLjJiYWM4MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19wbHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fcGx4LmMKQEAgLTQsNyArNCw3IEBACiAgKiBidXQgYXJlIGNvbm5lY3RlZCB0byB0aGUgUENJIGJ1cyBieSBhIFBMWDkwNTIuCiAgKgogICogQ3VycmVudCBtYWludGFpbmVycyBhcmU6Ci0gKiAJUGF2ZWwgUm9za2luIDxwcm9za2kgQVQgZ251Lm9yZz4KKyAqCVBhdmVsIFJvc2tpbiA8cHJvc2tpIEFUIGdudS5vcmc+CiAgKiBhbmQJRGF2aWQgR2lic29uIDxoZXJtZXMgQVQgZ2lic29uLmRyb3BiZWFyLmlkLmF1PgogICoKICAqIChDKSBDb3B5cmlnaHQgRGF2aWQgR2lic29uLCBJQk0gQ29ycC4gMjAwMS0yMDAzLgpAQCAtMTAyLDE0ICsxMDIsMTQgQEAKICNkZWZpbmUgUExYX1JFU0VUX1RJTUUJKDUwMCkJLyogbWlsbGlzZWNvbmRzICovCiAKICNkZWZpbmUgUExYX0lOVENTUgkJMHg0YyAvKiBJbnRlcnJ1cHQgQ29udHJvbCAmIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBQTFhfSU5UQ1NSX0lOVEVOCSgxPDw2KSAvKiBJbnRlcnJ1cHQgRW5hYmxlIGJpdCAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0lOVEVOCSgxIDw8IDYpIC8qIEludGVycnVwdCBFbmFibGUgYml0ICovCiAKIC8qCiAgKiBEbyBhIHNvZnQgcmVzZXQgb2YgdGhlIGNhcmQgdXNpbmcgdGhlIENvbmZpZ3VyYXRpb24gT3B0aW9uIFJlZ2lzdGVyCiAgKi8KIHN0YXRpYyBpbnQgb3Jpbm9jb19wbHhfY29yX3Jlc2V0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCiB7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCXN0cnVjdCBvcmlub2NvX3BjaV9jYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJdTE2IHJlZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb190bWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb190bWQuYwppbmRleCA3ODQ2MDVmLi45MzE1OWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fdG1kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX3RtZC5jCkBAIC01OSw3ICs1OSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgb3Jpbm9jb190bWRfY29yX3Jlc2V0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCiB7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCXN0cnVjdCBvcmlub2NvX3BjaV9jYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJdTE2IHJlZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb191c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb191c2IuYwppbmRleCBiOWFlZGYxLi44MTFlODdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX3VzYi5jCkBAIC0xOTksNyArMTk5LDcgQEAKICNkZWZpbmUgRVpVU0JfRlJBTUVfREFUQQkJMQogI2RlZmluZSBFWlVTQl9GUkFNRV9DT05UUk9MCQkyCiAKLSNkZWZpbmUgREVGX1RJTUVPVVQJCQkoMypIWikKKyNkZWZpbmUgREVGX1RJTUVPVVQJCQkoMyAqIEhaKQogCiAjZGVmaW5lIEJVTEtfQlVGX1NJWkUJCQkyMDQ4CiAKQEAgLTk1OSw3ICs5NTksNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgZXp1c2Jfd3JpdGVfbHR2KGhlcm1lc190ICpodywgaW50IGJhcCwgdTE2IHJpZCwKK3N0YXRpYyBpbnQgZXp1c2Jfd3JpdGVfbHR2KHN0cnVjdCBoZXJtZXMgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLAogCQkJICAgdTE2IGxlbmd0aCwgY29uc3Qgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZXp1c2JfcHJpdiAqdXByaXYgPSBody0+cHJpdjsKQEAgLTk4OSw3ICs5ODksNyBAQAogCQkJCU5VTEwsIDAsIE5VTEwpOwogfQogCi1zdGF0aWMgaW50IGV6dXNiX3JlYWRfbHR2KGhlcm1lc190ICpodywgaW50IGJhcCwgdTE2IHJpZCwKK3N0YXRpYyBpbnQgZXp1c2JfcmVhZF9sdHYoc3RydWN0IGhlcm1lcyAqaHcsIGludCBiYXAsIHUxNiByaWQsCiAJCQkgIHVuc2lnbmVkIGJ1ZnNpemUsIHUxNiAqbGVuZ3RoLCB2b2lkICpidWYpCiB7CiAJc3RydWN0IGV6dXNiX3ByaXYgKnVwcml2ID0gaHctPnByaXY7CkBAIC0xMDA2LDcgKzEwMDYsNyBAQAogCQkJCWJ1ZiwgYnVmc2l6ZSwgbGVuZ3RoKTsKIH0KIAotc3RhdGljIGludCBlenVzYl9kb2ljbWRfd2FpdChoZXJtZXNfdCAqaHcsIHUxNiBjbWQsIHUxNiBwYXJtMCwgdTE2IHBhcm0xLAorc3RhdGljIGludCBlenVzYl9kb2ljbWRfd2FpdChzdHJ1Y3QgaGVybWVzICpodywgdTE2IGNtZCwgdTE2IHBhcm0wLCB1MTYgcGFybTEsCiAJCQkgICAgIHUxNiBwYXJtMiwgc3RydWN0IGhlcm1lc19yZXNwb25zZSAqcmVzcCkKIHsKIAlzdHJ1Y3QgZXp1c2JfcHJpdiAqdXByaXYgPSBody0+cHJpdjsKQEAgLTEwMjgsNyArMTAyOCw3IEBACiAJCQkJRVpVU0JfRlJBTUVfQ09OVFJPTCwgTlVMTCwgMCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBpbnQgZXp1c2JfZG9jbWRfd2FpdChoZXJtZXNfdCAqaHcsIHUxNiBjbWQsIHUxNiBwYXJtMCwKK3N0YXRpYyBpbnQgZXp1c2JfZG9jbWRfd2FpdChzdHJ1Y3QgaGVybWVzICpodywgdTE2IGNtZCwgdTE2IHBhcm0wLAogCQkJICAgIHN0cnVjdCBoZXJtZXNfcmVzcG9uc2UgKnJlc3ApCiB7CiAJc3RydWN0IGV6dXNiX3ByaXYgKnVwcml2ID0gaHctPnByaXY7CkBAIC0xMTk2LDcgKzExOTYsNyBAQAogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CiAJc3RydWN0IGV6dXNiX3ByaXYgKnVwcml2ID0gcHJpdi0+Y2FyZDsKLQl1OCBtaWNbTUlDSEFFTF9NSUNfTEVOKzFdOworCXU4IG1pY1tNSUNIQUVMX01JQ19MRU4gKyAxXTsKIAlpbnQgZXJyID0gMDsKIAlpbnQgdHhfY29udHJvbDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTM1Niw3ICsxMzU2LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGV6dXNiX2luaXQoaGVybWVzX3QgKmh3KQorc3RhdGljIGludCBlenVzYl9pbml0KHN0cnVjdCBoZXJtZXMgKmh3KQogewogCXN0cnVjdCBlenVzYl9wcml2ICp1cHJpdiA9IGh3LT5wcml2OwogCWludCByZXR2YWw7CkBAIC0xNDM4LDcgKzE0MzgsNyBAQAogCX0gZWxzZSBpZiAodXByaXYtPmRldikgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdXByaXYtPmRldjsKIAkJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5kZXZfcHJpdihkZXYpOwotCQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCiAJCWlmIChoZXJtZXNfcmlkID09IEVaVVNCX1JJRF9SWCkgewogCQkJX19vcmlub2NvX2V2X3J4KGRldiwgaHcpOwpAQCAtMTU3NSw3ICsxNTc1LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2OwotCWhlcm1lc190ICpodzsKKwlzdHJ1Y3QgaGVybWVzICpodzsKIAlzdHJ1Y3QgZXp1c2JfcHJpdiAqdXByaXYgPSBOVUxMOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKmlmYWNlX2Rlc2M7CiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcDsKQEAgLTE3NTcsNyArMTc1Nyw3IEBACiAvKiBDYW4ndCBiZSBkZWNsYXJlZCAiY29uc3QiIG9yIHRoZSB3aG9sZSBfX2luaXRkYXRhIHNlY3Rpb24gd2lsbAogICogYmVjb21lIGNvbnN0ICovCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9IERSSVZFUl9OQU1FICIgIiBEUklWRVJfVkVSU0lPTgotICAgICIgKE1hbnVlbCBFc3RyYWRhIFNhaW56KSI7CisJIiAoTWFudWVsIEVzdHJhZGEgU2FpbnopIjsKIAogc3RhdGljIGludCBfX2luaXQgZXp1c2JfbW9kdWxlX2luaXQodm9pZCkKIHsKQEAgLTE3ODcsNiArMTc4Nyw1IEBACiBtb2R1bGVfZXhpdChlenVzYl9tb2R1bGVfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIk1hbnVlbCBFc3RyYWRhIFNhaW56Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04KLSAgICAoIkRyaXZlciBmb3IgT3Jpbm9jbyB3aXJlbGVzcyBMQU4gY2FyZHMgdXNpbmcgRVpVU0IgYnJpZGdlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgT3Jpbm9jbyB3aXJlbGVzcyBMQU4gY2FyZHMgdXNpbmcgRVpVU0IgYnJpZGdlIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3NwZWN0cnVtX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3NwZWN0cnVtX2NzLmMKaW5kZXggODFmMzY3My4uNmUyOGVlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9zcGVjdHJ1bV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vc3BlY3RydW1fY3MuYwpAQCAtMTEsOSArMTEsOSBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CiAgKiBQb3J0aW9ucyBiYXNlZCBvbiBvcmlub2NvX2NzLmM6Ci0gKiAJQ29weXJpZ2h0IChDKSBEYXZpZCBHaWJzb24sIExpbnV4Y2FyZSBBdXN0cmFsaWEKKyAqCUNvcHlyaWdodCAoQykgRGF2aWQgR2lic29uLCBMaW51eGNhcmUgQXVzdHJhbGlhCiAgKiBQb3J0aW9ucyBiYXNlZCBvbiBTcGVjdHJ1bTI0dERubGQuYyBmcm9tIG9yaWdpbmFsIHNwZWN0cnVtMjQgZHJpdmVyOgotICogCUNvcHlyaWdodCAoQykgU3ltYm9sIFRlY2hub2xvZ2llcy4KKyAqCUNvcHlyaWdodCAoQykgU3ltYm9sIFRlY2hub2xvZ2llcy4KICAqCiAgKiBTZWUgY29weXJpZ2h0IG5vdGljZSBpbiBmaWxlIG1haW4uYy4KICAqLwpAQCAtMTI1LDcgKzEyNSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERldmljZSBtZXRob2RzICAgICAJCQkJCQkgICAgKi8KKy8qIERldmljZSBtZXRob2RzCQkJCQkJICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpbnQKQEAgLTE1MCw3ICsxNTAsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBQQ01DSUEgc3R1ZmYgICAgIAkJCQkJCSAgICAqLworLyogUENNQ0lBIHN0dWZmCQkJCQkJCSAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgaW50CkBAIC0xOTcsNyArMTk3LDcgQEAKIHNwZWN0cnVtX2NzX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbGluay0+cHJpdjsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJaW50IHJldDsKIAl2b2lkIF9faW9tZW0gKm1lbTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby93ZXh0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3dleHQuYwppbmRleCBlNzkzNjc5Li5iYmI5YmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3dleHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3dleHQuYwpAQCAtODcsNyArODcsNyBAQAogc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICpvcmlub2NvX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZGV2X3ByaXYoZGV2KTsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJc3RydWN0IGl3X3N0YXRpc3RpY3MgKndzdGF0cyA9ICZwcml2LT53c3RhdHM7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNDQ4LDcgKzQ0OCw3IEBACiAJfQogCiAJaWYgKChjaGFuIDwgMSkgfHwgKGNoYW4gPiBOVU1fQ0hBTk5FTFMpIHx8Ci0JICAgICAhKHByaXYtPmNoYW5uZWxfbWFzayAmICgxIDw8IChjaGFuLTEpKSkpCisJICAgICAhKHByaXYtPmNoYW5uZWxfbWFzayAmICgxIDw8IChjaGFuIC0gMSkpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCXByaXYtPmNoYW5uZWwgPSBjaGFuOwogCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHsKIAkJLyogRmFzdCBjaGFubmVsIGNoYW5nZSAtIG5vIGNvbW1pdCBpZiBzdWNjZXNzZnVsICovCi0JCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwkJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJCWVyciA9IGh3LT5vcHMtPmNtZF93YWl0KGh3LCBIRVJNRVNfQ01EX1RFU1QgfAogCQkJCQkgICAgSEVSTUVTX1RFU1RfU0VUX0NIQU5ORUwsCiAJCQkJCWNoYW4sIE5VTEwpOwpAQCAtNDkyLDcgKzQ5Miw3IEBACiAJCQkJIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZGV2X3ByaXYoZGV2KTsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJdTE2IHZhbDsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC02NjgsNyArNjY4LDcgQEAKIAkJCQkgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZGV2X3ByaXYoZGV2KTsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CiAJaW50IGVyciA9IDA7CiAJdTE2IGVuYWJsZSwgcGVyaW9kLCB0aW1lb3V0LCBtY2FzdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtODczLDcgKzg3Myw3IEBACiAJCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmRldl9wcml2KGRldik7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0ID0gLUVJTlBST0dSRVNTOwpAQCAtMTI2OSw3ICsxMjY5LDcgQEAKIAkJCQljaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmRldl9wcml2KGRldik7Ci0JaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCByaWQgPSBkYXRhLT5mbGFnczsKIAl1MTYgbGVuZ3RoOwogCWludCBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0cGNpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0cGNpLmgKaW5kZXggZWU5YmM2Mi4uN2FhNTA5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHBjaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRwY2kuaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgUDU0UENJX0gKICNkZWZpbmUgUDU0UENJX0gKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogLyoKICAqIERlZmluZXMgZm9yIFBDSSBiYXNlZCBtYWM4MDIxMSBQcmlzbTU0IGRyaXZlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYwppbmRleCBlYzJjNzVkLi41ZDBmNjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYwpAQCAtMTgsNiArMTgsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuaAppbmRleCBjNGQwZjE5Li5jNDA0MDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuaApAQCAtMjIsNiArMjIsNyBAQAogI2lmbmRlZiBfSVNMUENJX0RFVl9ICiAjZGVmaW5lIF9JU0xQQ0lfREVWX0gKIAorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYwppbmRleCBiNWU2NGQ3Li45ZTY4ZTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvS2NvbmZpZwppbmRleCBiMmY4YjhmLi5hMGE3ODU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvS2NvbmZpZwpAQCAtODMsMTQgKzgzLDEyIEBACiBjb25maWcgUlQyODAwUENJX1JUMzVYWAogCWJvb2wgInJ0MjgwMHBjaSAtIEluY2x1ZGUgc3VwcG9ydCBmb3IgcnQzNXh4IGRldmljZXMgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQlkZWZhdWx0IG4KKwlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgcnQzNXh4IHdpcmVsZXNzIGNoaXBzZXQgZmFtaWx5IHRvIHRoZQogCSAgcnQyODAwcGNpIGRyaXZlci4KIAkgIFN1cHBvcnRlZCBjaGlwczogUlQzMDYwLCBSVDMwNjIsIFJUMzU2MiwgUlQzNTkyCiAKLQkgIFN1cHBvcnQgZm9yIHRoZXNlIGRldmljZXMgaXMgbm9uLWZ1bmN0aW9uYWwgYXQgdGhlIG1vbWVudCBhbmQgaXMKLQkgIGludGVuZGVkIGZvciB0ZXN0ZXJzIGFuZCBkZXZlbG9wZXJzLgogCiBjb25maWcgUlQyODAwUENJX1JUNTNYWAogICAgICAgIGJvb2wgInJ0MjgwMHBjaSAtIEluY2x1ZGUgc3VwcG9ydCBmb3IgcnQ1M3h4IGRldmljZXMgKEVYUEVSSU1FTlRBTCkiCkBAIC0xNTQsMTUgKzE1MiwxMiBAQAogY29uZmlnIFJUMjgwMFVTQl9SVDM1WFgKIAlib29sICJydDI4MDB1c2IgLSBJbmNsdWRlIHN1cHBvcnQgZm9yIHJ0MzV4eCBkZXZpY2VzIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JZGVmYXVsdCBuCisJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHJ0MzV4eCB3aXJlbGVzcyBjaGlwc2V0IGZhbWlseSB0byB0aGUKIAkgIHJ0MjgwMHVzYiBkcml2ZXIuCiAJICBTdXBwb3J0ZWQgY2hpcHM6IFJUMzU3MgogCi0JICBTdXBwb3J0IGZvciB0aGVzZSBkZXZpY2VzIGlzIG5vbi1mdW5jdGlvbmFsIGF0IHRoZSBtb21lbnQgYW5kIGlzCi0JICBpbnRlbmRlZCBmb3IgdGVzdGVycyBhbmQgZGV2ZWxvcGVycy4KLQogY29uZmlnIFJUMjgwMFVTQl9SVDUzWFgKICAgICAgICBib29sICJydDI4MDB1c2IgLSBJbmNsdWRlIHN1cHBvcnQgZm9yIHJ0NTN4eCBkZXZpY2VzIChFWFBFUklNRU5UQUwpIgogICAgICAgIGRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNDAwcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNDAwcGNpLmMKaW5kZXggOTM3ZjllOC4uNzZiY2MzNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI0MDBwY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNDAwcGNpLmMKQEAgLTE3MjMsNiArMTcyMyw3IEBACiAJLnNldF9hbnRlbm5hCQk9IHJ0MngwMG1hY19zZXRfYW50ZW5uYSwKIAkuZ2V0X2FudGVubmEJCT0gcnQyeDAwbWFjX2dldF9hbnRlbm5hLAogCS5nZXRfcmluZ3BhcmFtCQk9IHJ0MngwMG1hY19nZXRfcmluZ3BhcmFtLAorCS50eF9mcmFtZXNfcGVuZGluZwk9IHJ0MngwMG1hY190eF9mcmFtZXNfcGVuZGluZywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnQyeDAwbGliX29wcyBydDI0MDBwY2lfcnQyeDAwX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDBwY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDBwY2kuYwppbmRleCBkMjdkN2I4Li5jMjg4ZDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHBjaS5jCkBAIC0yMDE2LDYgKzIwMTYsNyBAQAogCS5zZXRfYW50ZW5uYQkJPSBydDJ4MDBtYWNfc2V0X2FudGVubmEsCiAJLmdldF9hbnRlbm5hCQk9IHJ0MngwMG1hY19nZXRfYW50ZW5uYSwKIAkuZ2V0X3JpbmdwYXJhbQkJPSBydDJ4MDBtYWNfZ2V0X3JpbmdwYXJhbSwKKwkudHhfZnJhbWVzX3BlbmRpbmcJPSBydDJ4MDBtYWNfdHhfZnJhbWVzX3BlbmRpbmcsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0MngwMGxpYl9vcHMgcnQyNTAwcGNpX3J0MngwMF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwdXNiLmMKaW5kZXggMTUyMzdjMi4uNTNjNWY4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDB1c2IuYwpAQCAtMTgyNyw2ICsxODI3LDcgQEAKIAkuc2V0X2FudGVubmEJCT0gcnQyeDAwbWFjX3NldF9hbnRlbm5hLAogCS5nZXRfYW50ZW5uYQkJPSBydDJ4MDBtYWNfZ2V0X2FudGVubmEsCiAJLmdldF9yaW5ncGFyYW0JCT0gcnQyeDAwbWFjX2dldF9yaW5ncGFyYW0sCisJLnR4X2ZyYW1lc19wZW5kaW5nCT0gcnQyeDAwbWFjX3R4X2ZyYW1lc19wZW5kaW5nLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBydDJ4MDBsaWJfb3BzIHJ0MjUwMHVzYl9ydDJ4MDBfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMC5oCmluZGV4IGY2N2JjOWIuLmM2OWE3ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwLmgKQEAgLTE3NDAsNiArMTc0MCw3IEBACiAvKgogICogQkJQIDM6IFJYIEFudGVubmEKICAqLworI2RlZmluZSBCQlAzX1JYX0FEQwkJCQlGSUVMRDgoMHgwMykKICNkZWZpbmUgQkJQM19SWF9BTlRFTk5BCQkJRklFTEQ4KDB4MTgpCiAjZGVmaW5lIEJCUDNfSFQ0MF9NSU5VUwkJCUZJRUxEOCgweDIwKQogCkBAIC0xNzgzLDYgKzE3ODQsOCBAQAogI2RlZmluZSBSRkNTUjFfVFgwX1BECQkJRklFTEQ4KDB4MDgpCiAjZGVmaW5lIFJGQ1NSMV9SWDFfUEQJCQlGSUVMRDgoMHgxMCkKICNkZWZpbmUgUkZDU1IxX1RYMV9QRAkJCUZJRUxEOCgweDIwKQorI2RlZmluZSBSRkNTUjFfUlgyX1BECQkJRklFTEQ4KDB4NDApCisjZGVmaW5lIFJGQ1NSMV9UWDJfUEQJCQlGSUVMRDgoMHg4MCkKIAogLyoKICAqIFJGQ1NSIDI6CkBAIC0xNzkwLDE1ICsxNzkzLDI1IEBACiAjZGVmaW5lIFJGQ1NSMl9SRVNDQUxfRU4JCUZJRUxEOCgweDgwKQogCiAvKgorICogRlJDU1IgNToKKyAqLworI2RlZmluZSBSRkNTUjVfUjEJCQlGSUVMRDgoMHgwYykKKworLyoKICAqIFJGQ1NSIDY6CiAgKi8KICNkZWZpbmUgUkZDU1I2X1IxCQkJRklFTEQ4KDB4MDMpCiAjZGVmaW5lIFJGQ1NSNl9SMgkJCUZJRUxEOCgweDQwKQorI2RlZmluZSBSRkNTUjZfVFhESVYJCUZJRUxEOCgweDBjKQogCiAvKgogICogUkZDU1IgNzoKICAqLwogI2RlZmluZSBSRkNTUjdfUkZfVFVOSU5HCQlGSUVMRDgoMHgwMSkKKyNkZWZpbmUgUkZDU1I3X1IwMgkJCQlGSUVMRDgoMHgwNykKKyNkZWZpbmUgUkZDU1I3X1IzCQkJCUZJRUxEOCgweDA4KQorI2RlZmluZSBSRkNTUjdfUjQ1CQkJCUZJRUxEOCgweDMwKQorI2RlZmluZSBSRkNTUjdfUjY3CQkJCUZJRUxEOCgweGMwKQogCiAvKgogICogUkZDU1IgMTE6CkBAIC0xODA5LDExICsxODIyLDEzIEBACiAgKiBSRkNTUiAxMjoKICAqLwogI2RlZmluZSBSRkNTUjEyX1RYX1BPV0VSCQlGSUVMRDgoMHgxZikKKyNkZWZpbmUgUkZDU1IxMl9EUjAJCQkJRklFTEQ4KDB4ZTApCiAKIC8qCiAgKiBSRkNTUiAxMzoKICAqLwogI2RlZmluZSBSRkNTUjEzX1RYX1BPV0VSCQlGSUVMRDgoMHgxZikKKyNkZWZpbmUgUkZDU1IxM19EUjAJCQkJRklFTEQ4KDB4ZTApCiAKIC8qCiAgKiBSRkNTUiAxNToKQEAgLTIyNTYsNiArMjI3MSw3IEBACiAjZGVmaW5lIE1DVV9BTlRfU0VMRUNUCQkJMFg3MwogI2RlZmluZSBNQ1VfQkJQX1NJR05BTAkJCTB4ODAKICNkZWZpbmUgTUNVX1BPV0VSX1NBVkUJCQkweDgzCisjZGVmaW5lIE1DVV9CQU5EX1NFTEVDVAkJMHg5MQogCiAvKgogICogTUNVIG1haWxib3ggdG9rZW5zCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMKaW5kZXggMmE2YWE4NS4uODRhYjdkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYwpAQCAtNDAxLDcgKzQwMSw4IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlpZiAocnQyeDAwX2lzX3BjaShydDJ4MDBkZXYpKSB7Ci0JCWlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKSB7CisJCWlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDM1NzIpIHx8CisJCSAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKSB7CiAJCQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIEFVWF9DVFJMLCAmcmVnKTsKIAkJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBBVVhfQ1RSTF9GT1JDRV9QQ0lFX0NMSywgMSk7CiAJCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQVVYX0NUUkxfV0FLRV9QQ0lFX0VOLCAxKTsKQEAgLTYwMCw0OSArNjAxLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0MjgwMF9wcm9jZXNzX3J4d2kpOwogCi1zdGF0aWMgYm9vbCBydDI4MDBfdHhkb25lX2VudHJ5X2NoZWNrKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksIHUzMiByZWcpCi17Ci0JX19sZTMyICp0eHdpOwotCXUzMiB3b3JkOwotCWludCB3Y2lkLCBhY2ssIHBpZDsKLQlpbnQgdHhfd2NpZCwgdHhfYWNrLCB0eF9waWQ7Ci0KLQl3Y2lkCT0gcnQyeDAwX2dldF9maWVsZDMyKHJlZywgVFhfU1RBX0ZJRk9fV0NJRCk7Ci0JYWNrCT0gcnQyeDAwX2dldF9maWVsZDMyKHJlZywgVFhfU1RBX0ZJRk9fVFhfQUNLX1JFUVVJUkVEKTsKLQlwaWQJPSBydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBUWF9TVEFfRklGT19QSURfVFlQRSk7Ci0KLQkvKgotCSAqIFRoaXMgZnJhbWVzIGhhcyByZXR1cm5lZCB3aXRoIGFuIElPIGVycm9yLAotCSAqIHNvIHRoZSBzdGF0dXMgcmVwb3J0IGlzIG5vdCBpbnRlbmRlZCBmb3IgdGhpcwotCSAqIGZyYW1lLgotCSAqLwotCWlmICh0ZXN0X2JpdChFTlRSWV9EQVRBX0lPX0ZBSUxFRCwgJmVudHJ5LT5mbGFncykpIHsKLQkJcnQyeDAwbGliX3R4ZG9uZV9ub2luZm8oZW50cnksIFRYRE9ORV9GQUlMVVJFKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogVmFsaWRhdGUgaWYgdGhpcyBUWCBzdGF0dXMgcmVwb3J0IGlzIGludGVuZGVkIGZvcgotCSAqIHRoaXMgZW50cnkgYnkgY29tcGFyaW5nIHRoZSBXQ0lEL0FDSy9QSUQgZmllbGRzLgotCSAqLwotCXR4d2kgPSBydDI4MDBfZHJ2X2dldF90eHdpKGVudHJ5KTsKLQotCXJ0MngwMF9kZXNjX3JlYWQodHh3aSwgMSwgJndvcmQpOwotCXR4X3djaWQgPSBydDJ4MDBfZ2V0X2ZpZWxkMzIod29yZCwgVFhXSV9XMV9XSVJFTEVTU19DTElfSUQpOwotCXR4X2FjayAgPSBydDJ4MDBfZ2V0X2ZpZWxkMzIod29yZCwgVFhXSV9XMV9BQ0spOwotCXR4X3BpZCAgPSBydDJ4MDBfZ2V0X2ZpZWxkMzIod29yZCwgVFhXSV9XMV9QQUNLRVRJRCk7Ci0KLQlpZiAoKHdjaWQgIT0gdHhfd2NpZCkgfHwgKGFjayAhPSB0eF9hY2spIHx8IChwaWQgIT0gdHhfcGlkKSkgewotCQlXQVJOSU5HKGVudHJ5LT5xdWV1ZS0+cnQyeDAwZGV2LAotCQkJIlRYIHN0YXR1cyByZXBvcnQgbWlzc2VkIGZvciBxdWV1ZSAlZCBlbnRyeSAlZFxuIiwKLQkJZW50cnktPnF1ZXVlLT5xaWQsIGVudHJ5LT5lbnRyeV9pZHgpOwotCQlydDJ4MDBsaWJfdHhkb25lX25vaW5mbyhlbnRyeSwgVFhET05FX1VOS05PV04pOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KIHZvaWQgcnQyODAwX3R4ZG9uZV9lbnRyeShzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LCB1MzIgc3RhdHVzKQogewogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBlbnRyeS0+cXVldWUtPnJ0MngwMGRldjsKQEAgLTcyNSw0NSArNjgzLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0MjgwMF90eGRvbmVfZW50cnkpOwogCi12b2lkIHJ0MjgwMF90eGRvbmUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKLXsKLQlzdHJ1Y3QgZGF0YV9xdWV1ZSAqcXVldWU7Ci0Jc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeTsKLQl1MzIgcmVnOwotCXU4IHFpZDsKLQotCXdoaWxlIChrZmlmb19nZXQoJnJ0MngwMGRldi0+dHhzdGF0dXNfZmlmbywgJnJlZykpIHsKLQotCQkvKiBUWF9TVEFfRklGT19QSURfUVVFVUUgaXMgYSAyLWJpdCBmaWVsZCwgdGh1cwotCQkgKiBxaWQgaXMgZ3VhcmFudGVlZCB0byBiZSBvbmUgb2YgdGhlIFRYIFFJRHMKLQkJICovCi0JCXFpZCA9IHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIFRYX1NUQV9GSUZPX1BJRF9RVUVVRSk7Ci0JCXF1ZXVlID0gcnQyeDAwcXVldWVfZ2V0X3R4X3F1ZXVlKHJ0MngwMGRldiwgcWlkKTsKLQkJaWYgKHVubGlrZWx5KCFxdWV1ZSkpIHsKLQkJCVdBUk5JTkcocnQyeDAwZGV2LCAiR290IFRYIHN0YXR1cyBmb3IgYW4gdW5hdmFpbGFibGUgIgotCQkJCQkgICAicXVldWUgJXUsIGRyb3BwaW5nXG4iLCBxaWQpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKgotCQkgKiBJbnNpZGUgZWFjaCBxdWV1ZSwgd2UgcHJvY2VzcyBlYWNoIGVudHJ5IGluIGEgY2hyb25vbG9naWNhbAotCQkgKiBvcmRlci4gV2UgZmlyc3QgY2hlY2sgdGhhdCB0aGUgcXVldWUgaXMgbm90IGVtcHR5LgotCQkgKi8KLQkJZW50cnkgPSBOVUxMOwotCQl3aGlsZSAoIXJ0MngwMHF1ZXVlX2VtcHR5KHF1ZXVlKSkgewotCQkJZW50cnkgPSBydDJ4MDBxdWV1ZV9nZXRfZW50cnkocXVldWUsIFFfSU5ERVhfRE9ORSk7Ci0JCQlpZiAocnQyODAwX3R4ZG9uZV9lbnRyeV9jaGVjayhlbnRyeSwgcmVnKSkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmICghZW50cnkgfHwgcnQyeDAwcXVldWVfZW1wdHkocXVldWUpKQotCQkJYnJlYWs7Ci0KLQkJcnQyODAwX3R4ZG9uZV9lbnRyeShlbnRyeSwgcmVnKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChydDI4MDBfdHhkb25lKTsKLQogdm9pZCBydDI4MDBfd3JpdGVfYmVhY29uKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKIHsKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gZW50cnktPnF1ZXVlLT5ydDJ4MDBkZXY7CkBAIC0xMzU1LDcgKzEyNzQsNyBAQAogCQkJZ2YyMF9yYXRlID0gZ2Y0MF9yYXRlID0gMHgwMDAzOwogCQl9CiAJCWJyZWFrOwotCX07CisJfQogCiAJLyogY2hlY2sgZm9yIFNUQXMgbm90IHN1cHBvcnRpbmcgZ3JlZW5maWVsZCBtb2RlICovCiAJaWYgKGFueV9zdGFfbm9uZ2YpCkBAIC0xNDMzLDYgKzEzNTIsNDAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0MjgwMF9jb25maWdfZXJwKTsKIAorc3RhdGljIHZvaWQgcnQyODAwX2NvbmZpZ18zNTcyYnRfYW50KHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCit7CisJdTMyIHJlZzsKKwl1MTYgZWVwcm9tOworCXU4IGxlZF9jdHJsLCBsZWRfZ19tb2RlLCBsZWRfcl9tb2RlOworCisJcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBHUElPX1NXSVRDSCwgJnJlZyk7CisJaWYgKHJ0MngwMGRldi0+Y3Vycl9iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEdQSU9fU1dJVENIXzAsIDEpOworCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgR1BJT19TV0lUQ0hfMSwgMSk7CisJfSBlbHNlIHsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEdQSU9fU1dJVENIXzAsIDApOworCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgR1BJT19TV0lUQ0hfMSwgMCk7CisJfQorCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEdQSU9fU1dJVENILCByZWcpOworCisJcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBMRURfQ0ZHLCAmcmVnKTsKKwlsZWRfZ19tb2RlID0gcnQyeDAwX2dldF9maWVsZDMyKHJlZywgTEVEX0NGR19MRURfUE9MQVIpID8gMyA6IDA7CisJbGVkX3JfbW9kZSA9IHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIExFRF9DRkdfTEVEX1BPTEFSKSA/IDAgOiAzOworCWlmIChsZWRfZ19tb2RlICE9IHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIExFRF9DRkdfR19MRURfTU9ERSkgfHwKKwkgICAgbGVkX3JfbW9kZSAhPSBydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBMRURfQ0ZHX1JfTEVEX01PREUpKSB7CisJCXJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYsIEVFUFJPTV9GUkVRLCAmZWVwcm9tKTsKKwkJbGVkX2N0cmwgPSBydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLCBFRVBST01fRlJFUV9MRURfTU9ERSk7CisJCWlmIChsZWRfY3RybCA9PSAwIHx8IGxlZF9jdHJsID4gMHg0MCkgeworCQkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIExFRF9DRkdfR19MRURfTU9ERSwgbGVkX2dfbW9kZSk7CisJCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgTEVEX0NGR19SX0xFRF9NT0RFLCBsZWRfcl9tb2RlKTsKKwkJCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIExFRF9DRkcsIHJlZyk7CisJCX0gZWxzZSB7CisJCQlydDI4MDBfbWN1X3JlcXVlc3QocnQyeDAwZGV2LCBNQ1VfQkFORF9TRUxFQ1QsIDB4ZmYsCisJCQkJCSAgIChsZWRfZ19tb2RlIDw8IDIpIHwgbGVkX3JfbW9kZSwgMSk7CisJCX0KKwl9Cit9CisKIHN0YXRpYyB2b2lkIHJ0MjgwMF9zZXRfYW50X2RpdmVyc2l0eShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAogCQkJCSAgICAgZW51bSBhbnRlbm5hIGFudCkKIHsKQEAgLTE0NjMsNiArMTQxNiwxMCBAQAogCXJ0MjgwMF9iYnBfcmVhZChydDJ4MDBkZXYsIDEsICZyMSk7CiAJcnQyODAwX2JicF9yZWFkKHJ0MngwMGRldiwgMywgJnIzKTsKIAorCWlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDM1NzIpICYmCisJICAgIHRlc3RfYml0KENBUEFCSUxJVFlfQlRfQ09FWElTVCwgJnJ0MngwMGRldi0+Y2FwX2ZsYWdzKSkKKwkJcnQyODAwX2NvbmZpZ18zNTcyYnRfYW50KHJ0MngwMGRldik7CisKIAkvKgogCSAqIENvbmZpZ3VyZSB0aGUgVFggYW50ZW5uYS4KIAkgKi8KQEAgLTE0NzEsNyArMTQyOCwxMSBAQAogCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcjEsIEJCUDFfVFhfQU5URU5OQSwgMCk7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJcnQyeDAwX3NldF9maWVsZDgoJnIxLCBCQlAxX1RYX0FOVEVOTkEsIDIpOworCQlpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzNTcyKSAmJgorCQkgICAgdGVzdF9iaXQoQ0FQQUJJTElUWV9CVF9DT0VYSVNULCAmcnQyeDAwZGV2LT5jYXBfZmxhZ3MpKQorCQkJcnQyeDAwX3NldF9maWVsZDgoJnIxLCBCQlAxX1RYX0FOVEVOTkEsIDEpOworCQllbHNlCisJCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcjEsIEJCUDFfVFhfQU5URU5OQSwgMik7CiAJCWJyZWFrOwogCWNhc2UgMzoKIAkJcnQyeDAwX3NldF9maWVsZDgoJnIxLCBCQlAxX1RYX0FOVEVOTkEsIDApOwpAQCAtMTQ5Niw3ICsxNDU3LDE1IEBACiAJCXJ0MngwMF9zZXRfZmllbGQ4KCZyMywgQkJQM19SWF9BTlRFTk5BLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSAyOgotCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcjMsIEJCUDNfUlhfQU5URU5OQSwgMSk7CisJCWlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDM1NzIpICYmCisJCSAgICB0ZXN0X2JpdChDQVBBQklMSVRZX0JUX0NPRVhJU1QsICZydDJ4MDBkZXYtPmNhcF9mbGFncykpIHsKKwkJCXJ0MngwMF9zZXRfZmllbGQ4KCZyMywgQkJQM19SWF9BREMsIDEpOworCQkJcnQyeDAwX3NldF9maWVsZDgoJnIzLCBCQlAzX1JYX0FOVEVOTkEsCisJCQkJcnQyeDAwZGV2LT5jdXJyX2JhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWik7CisJCQlydDI4MDBfc2V0X2FudF9kaXZlcnNpdHkocnQyeDAwZGV2LCBBTlRFTk5BX0IpOworCQl9IGVsc2UgeworCQkJcnQyeDAwX3NldF9maWVsZDgoJnIzLCBCQlAzX1JYX0FOVEVOTkEsIDEpOworCQl9CiAJCWJyZWFrOwogCWNhc2UgMzoKIAkJcnQyeDAwX3NldF9maWVsZDgoJnIzLCBCQlAzX1JYX0FOVEVOTkEsIDIpOwpAQCAtMTYzMCw2ICsxNTk5LDE2MSBAQAogCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDcsIHJmY3NyKTsKIH0KIAorc3RhdGljIHZvaWQgcnQyODAwX2NvbmZpZ19jaGFubmVsX3JmMzA1MihzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAorCQkJCQkgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAorCQkJCQkgc3RydWN0IHJmX2NoYW5uZWwgKnJmLAorCQkJCQkgc3RydWN0IGNoYW5uZWxfaW5mbyAqaW5mbykKK3sKKwl1OCByZmNzcjsKKwl1MzIgcmVnOworCisJaWYgKHJmLT5jaGFubmVsIDw9IDE0KSB7CisJCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCAyNSwgMHgxNSk7CisJCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCAyNiwgMHg4NSk7CisJfSBlbHNlIHsKKwkJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDI1LCAweDA5KTsKKwkJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDI2LCAweGZmKTsKKwl9CisKKwlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAyLCByZi0+cmYxKTsKKwlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAzLCByZi0+cmYzKTsKKworCXJ0MjgwMF9yZmNzcl9yZWFkKHJ0MngwMGRldiwgNiwgJnJmY3NyKTsKKwlydDJ4MDBfc2V0X2ZpZWxkOCgmcmZjc3IsIFJGQ1NSNl9SMSwgcmYtPnJmMik7CisJaWYgKHJmLT5jaGFubmVsIDw9IDE0KQorCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcmZjc3IsIFJGQ1NSNl9UWERJViwgMik7CisJZWxzZQorCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcmZjc3IsIFJGQ1NSNl9UWERJViwgMSk7CisJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgNiwgcmZjc3IpOworCisJcnQyODAwX3JmY3NyX3JlYWQocnQyeDAwZGV2LCA1LCAmcmZjc3IpOworCWlmIChyZi0+Y2hhbm5lbCA8PSAxNCkKKwkJcnQyeDAwX3NldF9maWVsZDgoJnJmY3NyLCBSRkNTUjVfUjEsIDEpOworCWVsc2UKKwkJcnQyeDAwX3NldF9maWVsZDgoJnJmY3NyLCBSRkNTUjVfUjEsIDIpOworCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDUsIHJmY3NyKTsKKworCXJ0MjgwMF9yZmNzcl9yZWFkKHJ0MngwMGRldiwgMTIsICZyZmNzcik7CisJaWYgKHJmLT5jaGFubmVsIDw9IDE0KSB7CisJCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IxMl9EUjAsIDMpOworCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcmZjc3IsIFJGQ1NSMTJfVFhfUE9XRVIsCisJCQkJKGluZm8tPmRlZmF1bHRfcG93ZXIxICYgMHgzKSB8CisJCQkJKChpbmZvLT5kZWZhdWx0X3Bvd2VyMSAmIDB4QykgPDwgMSkpOworCX0gZWxzZSB7CisJCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IxMl9EUjAsIDcpOworCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcmZjc3IsIFJGQ1NSMTJfVFhfUE9XRVIsCisJCQkJKGluZm8tPmRlZmF1bHRfcG93ZXIxICYgMHgzKSB8CisJCQkJKChpbmZvLT5kZWZhdWx0X3Bvd2VyMSAmIDB4QykgPDwgMSkpOworCX0KKwlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAxMiwgcmZjc3IpOworCisJcnQyODAwX3JmY3NyX3JlYWQocnQyeDAwZGV2LCAxMywgJnJmY3NyKTsKKwlpZiAocmYtPmNoYW5uZWwgPD0gMTQpIHsKKwkJcnQyeDAwX3NldF9maWVsZDgoJnJmY3NyLCBSRkNTUjEzX0RSMCwgMyk7CisJCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IxM19UWF9QT1dFUiwKKwkJCQkoaW5mby0+ZGVmYXVsdF9wb3dlcjIgJiAweDMpIHwKKwkJCQkoKGluZm8tPmRlZmF1bHRfcG93ZXIyICYgMHhDKSA8PCAxKSk7CisJfSBlbHNlIHsKKwkJcnQyeDAwX3NldF9maWVsZDgoJnJmY3NyLCBSRkNTUjEzX0RSMCwgNyk7CisJCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IxM19UWF9QT1dFUiwKKwkJCQkoaW5mby0+ZGVmYXVsdF9wb3dlcjIgJiAweDMpIHwKKwkJCQkoKGluZm8tPmRlZmF1bHRfcG93ZXIyICYgMHhDKSA8PCAxKSk7CisJfQorCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDEzLCByZmNzcik7CisKKwlydDI4MDBfcmZjc3JfcmVhZChydDJ4MDBkZXYsIDEsICZyZmNzcik7CisJcnQyeDAwX3NldF9maWVsZDgoJnJmY3NyLCBSRkNTUjFfUkZfQkxPQ0tfRU4sIDEpOworCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IxX1JYMF9QRCwgMCk7CisJcnQyeDAwX3NldF9maWVsZDgoJnJmY3NyLCBSRkNTUjFfVFgwX1BELCAwKTsKKwlydDJ4MDBfc2V0X2ZpZWxkOCgmcmZjc3IsIFJGQ1NSMV9SWDFfUEQsIDApOworCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IxX1RYMV9QRCwgMCk7CisJaWYgKHRlc3RfYml0KENBUEFCSUxJVFlfQlRfQ09FWElTVCwgJnJ0MngwMGRldi0+Y2FwX2ZsYWdzKSkgeworCQlpZiAocmYtPmNoYW5uZWwgPD0gMTQpIHsKKwkJCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IxX1JYMF9QRCwgMSk7CisJCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcmZjc3IsIFJGQ1NSMV9UWDBfUEQsIDEpOworCQl9CisJCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IxX1JYMl9QRCwgMSk7CisJCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IxX1RYMl9QRCwgMSk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChydDJ4MDBkZXYtPmRlZmF1bHRfYW50LnR4X2NoYWluX251bSkgeworCQljYXNlIDE6CisJCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcmZjc3IsIFJGQ1NSMV9UWDFfUEQsIDEpOworCQljYXNlIDI6CisJCQlydDJ4MDBfc2V0X2ZpZWxkOCgmcmZjc3IsIFJGQ1NSMV9UWDJfUEQsIDEpOworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKHJ0MngwMGRldi0+ZGVmYXVsdF9hbnQucnhfY2hhaW5fbnVtKSB7CisJCWNhc2UgMToKKwkJCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IxX1JYMV9QRCwgMSk7CisJCWNhc2UgMjoKKwkJCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IxX1JYMl9QRCwgMSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAxLCByZmNzcik7CisKKwlydDI4MDBfcmZjc3JfcmVhZChydDJ4MDBkZXYsIDIzLCAmcmZjc3IpOworCXJ0MngwMF9zZXRfZmllbGQ4KCZyZmNzciwgUkZDU1IyM19GUkVRX09GRlNFVCwgcnQyeDAwZGV2LT5mcmVxX29mZnNldCk7CisJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMjMsIHJmY3NyKTsKKworCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDI0LAorCQkJICAgICAgcnQyeDAwZGV2LT5jYWxpYnJhdGlvbltjb25mX2lzX2h0NDAoY29uZildKTsKKwlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAzMSwKKwkJCSAgICAgIHJ0MngwMGRldi0+Y2FsaWJyYXRpb25bY29uZl9pc19odDQwKGNvbmYpXSk7CisKKwlpZiAocmYtPmNoYW5uZWwgPD0gMTQpIHsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgNywgMHhkOCk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDksIDB4YzMpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAxMCwgMHhmMSk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDExLCAweGI5KTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMTUsIDB4NTMpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAxNiwgMHg0Yyk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDE3LCAweDIzKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMTksIDB4OTMpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAyMCwgMHhiMyk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDI1LCAweDE1KTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMjYsIDB4ODUpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAyNywgMHgwMCk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDI5LCAweDliKTsKKwl9IGVsc2UgeworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCA3LCAweDE0KTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgOSwgMHhjMCk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDEwLCAweGYxKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMTEsIDB4MDApOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAxNSwgMHg0Myk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDE2LCAweDdhKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMTcsIDB4MjMpOworCQlpZiAocmYtPmNoYW5uZWwgPD0gNjQpIHsKKwkJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDE5LCAweGI3KTsKKwkJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDIwLCAweGY2KTsKKwkJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDI1LCAweDNkKTsKKwkJfSBlbHNlIGlmIChyZi0+Y2hhbm5lbCA8PSAxMjgpIHsKKwkJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDE5LCAweDc0KTsKKwkJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDIwLCAweGY0KTsKKwkJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDI1LCAweDAxKTsKKwkJfSBlbHNlIHsKKwkJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDE5LCAweDcyKTsKKwkJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDIwLCAweGYzKTsKKwkJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDI1LCAweDAxKTsKKwkJfQorCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAyNiwgMHg4Nyk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDI3LCAweDAxKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMjksIDB4OWYpOworCX0KKworCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgR1BJT19DVFJMX0NGRywgJnJlZyk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEdQSU9fQ1RSTF9DRkdfR1BJT0RfQklUNywgMCk7CisJaWYgKHJmLT5jaGFubmVsIDw9IDE0KQorCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgR1BJT19DVFJMX0NGR19CSVQ3LCAxKTsKKwllbHNlCisJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBHUElPX0NUUkxfQ0ZHX0JJVDcsIDApOworCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEdQSU9fQ1RSTF9DRkcsIHJlZyk7CisKKwlydDI4MDBfcmZjc3JfcmVhZChydDJ4MDBkZXYsIDcsICZyZmNzcik7CisJcnQyeDAwX3NldF9maWVsZDgoJnJmY3NyLCBSRkNTUjdfUkZfVFVOSU5HLCAxKTsKKwlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCA3LCByZmNzcik7Cit9CiAKICNkZWZpbmUgUlQ1MzkwX1BPV0VSX0JPVU5EICAgICAweDI3CiAjZGVmaW5lIFJUNTM5MF9GUkVRX09GRlNFVF9CT1VORCAgICAgICAweDVmCkBAIC0xNzQ4LDkgKzE4NzIsMTAgQEAKIAkgICAgcnQyeDAwX3JmKHJ0MngwMGRldiwgUkYzMDIwKSB8fAogCSAgICBydDJ4MDBfcmYocnQyeDAwZGV2LCBSRjMwMjEpIHx8CiAJICAgIHJ0MngwMF9yZihydDJ4MDBkZXYsIFJGMzAyMikgfHwKLQkgICAgcnQyeDAwX3JmKHJ0MngwMGRldiwgUkYzMDUyKSB8fAogCSAgICBydDJ4MDBfcmYocnQyeDAwZGV2LCBSRjMzMjApKQogCQlydDI4MDBfY29uZmlnX2NoYW5uZWxfcmYzeHh4KHJ0MngwMGRldiwgY29uZiwgcmYsIGluZm8pOworCWVsc2UgaWYgKHJ0MngwMF9yZihydDJ4MDBkZXYsIFJGMzA1MikpCisJCXJ0MjgwMF9jb25maWdfY2hhbm5lbF9yZjMwNTIocnQyeDAwZGV2LCBjb25mLCByZiwgaW5mbyk7CiAJZWxzZSBpZiAocnQyeDAwX3JmKHJ0MngwMGRldiwgUkY1MzcwKSB8fAogCQkgcnQyeDAwX3JmKHJ0MngwMGRldiwgUkY1MzkwKSkKIAkJcnQyODAwX2NvbmZpZ19jaGFubmVsX3JmNTN4eChydDJ4MDBkZXYsIGNvbmYsIHJmLCBpbmZvKTsKQEAgLTE3NzcsNyArMTkwMiwxMCBAQAogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDgyLCAweGYyKTsKKwkJaWYgKHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzU3MikpCisJCQlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgODIsIDB4OTQpOworCQllbHNlCisJCQlydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgODIsIDB4ZjIpOwogCiAJCWlmICh0ZXN0X2JpdChDQVBBQklMSVRZX0VYVEVSTkFMX0xOQV9BLCAmcnQyeDAwZGV2LT5jYXBfZmxhZ3MpKQogCQkJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDc1LCAweDQ2KTsKQEAgLTE3OTEsMTIgKzE5MTksMTcgQEAKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgVFhfQkFORF9DRkdfQkcsIHJmLT5jaGFubmVsIDw9IDE0KTsKIAlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9CQU5EX0NGRywgcmVnKTsKIAorCWlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDM1NzIpKQorCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCA4LCAwKTsKKwogCXR4X3BpbiA9IDA7CiAKIAkvKiBUdXJuIG9uIHVudXNlZCBQQSBvciBMTkEgd2hlbiBub3QgdXNpbmcgMVQgb3IgMVIgKi8KIAlpZiAocnQyeDAwZGV2LT5kZWZhdWx0X2FudC50eF9jaGFpbl9udW0gPT0gMikgewotCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnR4X3BpbiwgVFhfUElOX0NGR19QQV9QRV9BMV9FTiwgMSk7Ci0JCXJ0MngwMF9zZXRfZmllbGQzMigmdHhfcGluLCBUWF9QSU5fQ0ZHX1BBX1BFX0cxX0VOLCAxKTsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZ0eF9waW4sIFRYX1BJTl9DRkdfUEFfUEVfQTFfRU4sCisJCQkJICAgcmYtPmNoYW5uZWwgPiAxNCk7CisJCXJ0MngwMF9zZXRfZmllbGQzMigmdHhfcGluLCBUWF9QSU5fQ0ZHX1BBX1BFX0cxX0VOLAorCQkJCSAgIHJmLT5jaGFubmVsIDw9IDE0KTsKIAl9CiAKIAkvKiBUdXJuIG9uIHVudXNlZCBQQSBvciBMTkEgd2hlbiBub3QgdXNpbmcgMVQgb3IgMVIgKi8KQEAgLTE4MDksMTEgKzE5NDIsMTggQEAKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJnR4X3BpbiwgVFhfUElOX0NGR19MTkFfUEVfRzBfRU4sIDEpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmdHhfcGluLCBUWF9QSU5fQ0ZHX1JGVFJfRU4sIDEpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmdHhfcGluLCBUWF9QSU5fQ0ZHX1RSU1dfRU4sIDEpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmdHhfcGluLCBUWF9QSU5fQ0ZHX1BBX1BFX0cwX0VOLCByZi0+Y2hhbm5lbCA8PSAxNCk7CisJaWYgKHRlc3RfYml0KENBUEFCSUxJVFlfQlRfQ09FWElTVCwgJnJ0MngwMGRldi0+Y2FwX2ZsYWdzKSkKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZ0eF9waW4sIFRYX1BJTl9DRkdfUEFfUEVfRzBfRU4sIDEpOworCWVsc2UKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZ0eF9waW4sIFRYX1BJTl9DRkdfUEFfUEVfRzBfRU4sCisJCQkJICAgcmYtPmNoYW5uZWwgPD0gMTQpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmdHhfcGluLCBUWF9QSU5fQ0ZHX1BBX1BFX0EwX0VOLCByZi0+Y2hhbm5lbCA+IDE0KTsKIAogCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFRYX1BJTl9DRkcsIHR4X3Bpbik7CiAKKwlpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzNTcyKSkKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgOCwgMHg4MCk7CisKIAlydDI4MDBfYmJwX3JlYWQocnQyeDAwZGV2LCA0LCAmYmJwKTsKIAlydDJ4MDBfc2V0X2ZpZWxkOCgmYmJwLCBCQlA0X0JBTkRXSURUSCwgMiAqIGNvbmZfaXNfaHQ0MChjb25mKSk7CiAJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDQsIGJicCk7CkBAIC0yNDEzLDYgKzI1NTMsOSBAQAogCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9TV19DRkcwLCAweDAwMDAwNDAwKTsKIAkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhfU1dfQ0ZHMSwgMHgwMDAwMDAwMCk7CiAJCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFRYX1NXX0NGRzIsIDB4MDAwMDAwMzApOworCX0gZWxzZSBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzNTcyKSkgeworCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9TV19DRkcwLCAweDAwMDAwNDAwKTsKKwkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhfU1dfQ0ZHMSwgMHgwMDA4MDYwNik7CiAJfSBlbHNlIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKSB7CiAJCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFRYX1NXX0NGRzAsIDB4MDAwMDA0MDQpOwogCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9TV19DRkcxLCAweDAwMDgwNjA2KTsKQEAgLTI3OTksNiArMjk0Miw3IEBACiAJfQogCiAJaWYgKHJ0MjgwMF9pc18zMDV4X3NvYyhydDJ4MDBkZXYpIHx8CisJICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzU3MikgfHwKIAkgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSkKIAkJcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDMxLCAweDA4KTsKIApAQCAtMjgyOCw2ICsyOTcyLDcgQEAKIAkgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzMDcxKSB8fAogCSAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDMwOTApIHx8CiAJICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzM5MCkgfHwKKwkgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzNTcyKSB8fAogCSAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKSB7CiAJCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA3OSwgMHgxMyk7CiAJCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA4MCwgMHgwNSk7CkBAIC0yODY4LDYgKzMwMTMsNyBAQAogCSAgICBydDJ4MDBfcnRfcmV2X2d0ZShydDJ4MDBkZXYsIFJUMzA3MSwgUkVWX1JUMzA3MUUpIHx8CiAJICAgIHJ0MngwMF9ydF9yZXZfZ3RlKHJ0MngwMGRldiwgUlQzMDkwLCBSRVZfUlQzMDkwRSkgfHwKIAkgICAgcnQyeDAwX3J0X3Jldl9ndGUocnQyeDAwZGV2LCBSVDMzOTAsIFJFVl9SVDMzOTBFKSB8fAorCSAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDM1NzIpIHx8CiAJICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MCkgfHwKIAkgICAgcnQyODAwX2lzXzMwNXhfc29jKHJ0MngwMGRldikpCiAJCXJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCAxMDMsIDB4YzApOwpAQCAtMjg5NSw2ICszMDQxLDcgQEAKIAlpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzMDcxKSB8fAogCSAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDMwOTApIHx8CiAJICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzM5MCkgfHwKKwkgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzNTcyKSB8fAogCSAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKSB7CiAJCXJ0MjgwMF9iYnBfcmVhZChydDJ4MDBkZXYsIDEzOCwgJnZhbHVlKTsKIApAQCAtMzAzMSw2ICszMTc4LDcgQEAKIAkgICAgIXJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzA3MSkgJiYKIAkgICAgIXJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzA5MCkgJiYKIAkgICAgIXJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzM5MCkgJiYKKwkgICAgIXJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzU3MikgJiYKIAkgICAgIXJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MCkgJiYKIAkgICAgIXJ0MjgwMF9pc18zMDV4X3NvYyhydDJ4MDBkZXYpKQogCQlyZXR1cm4gMDsKQEAgLTMxMDksNiArMzI1NywzOCBAQAogCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAyOSwgMHg4Zik7CiAJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDMwLCAweDIwKTsKIAkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMzEsIDB4MGYpOworCX0gZWxzZSBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzNTcyKSkgeworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAwLCAweDcwKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMSwgMHg4MSk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDIsIDB4ZjEpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAzLCAweDAyKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgNCwgMHg0Yyk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDUsIDB4MDUpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCA2LCAweDRhKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgNywgMHhkOCk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDksIDB4YzMpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAxMCwgMHhmMSk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDExLCAweGI5KTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMTIsIDB4NzApOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAxMywgMHg2NSk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDE0LCAweGEwKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMTUsIDB4NTMpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAxNiwgMHg0Yyk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDE3LCAweDIzKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMTgsIDB4YWMpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAxOSwgMHg5Myk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDIwLCAweGIzKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMjEsIDB4ZDApOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAyMiwgMHgwMCk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDIzLCAweDNjKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMjQsIDB4MTYpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAyNSwgMHgxNSk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDI2LCAweDg1KTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMjcsIDB4MDApOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAyOCwgMHgwMCk7CisJCXJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDI5LCAweDliKTsKKwkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMzAsIDB4MDkpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAzMSwgMHgxMCk7CiAJfSBlbHNlIGlmIChydDI4MDBfaXNfMzA1eF9zb2MocnQyeDAwZGV2KSkgewogCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAwLCAweDUwKTsKIAkJcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMSwgMHgwMSk7CkBAIC0zMjU4LDYgKzM0MzgsMTkgQEAKIAkJcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBHUElPX1NXSVRDSCwgJnJlZyk7CiAJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBHUElPX1NXSVRDSF81LCAwKTsKIAkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgR1BJT19TV0lUQ0gsIHJlZyk7CisJfSBlbHNlIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDM1NzIpKSB7CisJCXJ0MjgwMF9yZmNzcl9yZWFkKHJ0MngwMGRldiwgNiwgJnJmY3NyKTsKKwkJcnQyeDAwX3NldF9maWVsZDgoJnJmY3NyLCBSRkNTUjZfUjIsIDEpOworCQlydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCA2LCByZmNzcik7CisKKwkJcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBMRE9fQ0ZHMCwgJnJlZyk7CisJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBMRE9fQ0ZHMF9MRE9fQ09SRV9WTEVWRUwsIDMpOworCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgTERPX0NGRzBfQkdTRUwsIDEpOworCQlydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBMRE9fQ0ZHMCwgcmVnKTsKKwkJbXNsZWVwKDEpOworCQlydDI4MDBfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIExET19DRkcwLCAmcmVnKTsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIExET19DRkcwX0JHU0VMLCAxKTsKKwkJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgTERPX0NGRzAsIHJlZyk7CiAJfQogCiAJLyoKQEAgLTMyNzAsNyArMzQ2Myw4IEBACiAJCQlydDI4MDBfaW5pdF9yeF9maWx0ZXIocnQyeDAwZGV2LCB0cnVlLCAweDI3LCAweDE5KTsKIAl9IGVsc2UgaWYgKHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzA3MSkgfHwKIAkJICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzMDkwKSB8fAotCQkgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDMzOTApKSB7CisJCSAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzM5MCkgfHwKKwkJICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzNTcyKSkgewogCQlydDJ4MDBkZXYtPmNhbGlicmF0aW9uWzBdID0KIAkJCXJ0MjgwMF9pbml0X3J4X2ZpbHRlcihydDJ4MDBkZXYsIGZhbHNlLCAweDA3LCAweDEzKTsKIAkJcnQyeDAwZGV2LT5jYWxpYnJhdGlvblsxXSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmgKaW5kZXggZjJkMTU5NC4uNjlkZWIzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuaApAQCAtMTUyLDcgKzE1Miw2IEBACiAJCQkgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYyk7CiB2b2lkIHJ0MjgwMF9wcm9jZXNzX3J4d2koc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSwgc3RydWN0IHJ4ZG9uZV9lbnRyeV9kZXNjICp0eGRlc2MpOwogCi12b2lkIHJ0MjgwMF90eGRvbmUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldik7CiB2b2lkIHJ0MjgwMF90eGRvbmVfZW50cnkoc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSwgdTMyIHN0YXR1cyk7CiAKIHZvaWQgcnQyODAwX3dyaXRlX2JlYWNvbihzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHBjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHBjaS5jCmluZGV4IGNjNGE1NGYuLmViYzE3YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBwY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwcGNpLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKLQl9OworCX0KIH0KIAogc3RhdGljIHZvaWQgcnQyODAwcGNpX2tpY2tfcXVldWUoc3RydWN0IGRhdGFfcXVldWUgKnF1ZXVlKQpAQCAtNTAxLDcgKzUwMSw5IEBACiAJcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgUEJGX1NZU19DVFJMLCAweDAwMDAwZTFmKTsKIAlydDJ4MDBwY2lfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBQQkZfU1lTX0NUUkwsIDB4MDAwMDBlMDApOwogCi0JaWYgKHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MCkpIHsKKwlpZiAocnQyeDAwX2lzX3BjaWUocnQyeDAwZGV2KSAmJgorCSAgICAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzNTcyKSB8fAorCSAgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSkpIHsKIAkJcnQyeDAwcGNpX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBBVVhfQ1RSTCwgJnJlZyk7CiAJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBBVVhfQ1RSTF9GT1JDRV9QQ0lFX0NMSywgMSk7CiAJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBBVVhfQ1RSTF9XQUtFX1BDSUVfRU4sIDEpOwpAQCAtMTAyOSw2ICsxMDMxLDcgQEAKIAkuZmx1c2gJCQk9IHJ0MngwMG1hY19mbHVzaCwKIAkuZ2V0X3N1cnZleQkJPSBydDI4MDBfZ2V0X3N1cnZleSwKIAkuZ2V0X3JpbmdwYXJhbQkJPSBydDJ4MDBtYWNfZ2V0X3JpbmdwYXJhbSwKKwkudHhfZnJhbWVzX3BlbmRpbmcJPSBydDJ4MDBtYWNfdHhfZnJhbWVzX3BlbmRpbmcsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0MjgwMF9vcHMgcnQyODAwcGNpX3J0MjgwMF9vcHMgPSB7CkBAIC0xMTU4LDYgKzExNjEsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1JUMjgwMFBDSV9SVDUzWFgKIAl7IFBDSV9ERVZJQ0UoMHgxODE0LCAweDUzOTApIH0sCisJeyBQQ0lfREVWSUNFKDB4MTgxNCwgMHg1MzlmKSB9LAogI2VuZGlmCiAJeyAwLCB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVzYi5jCmluZGV4IGJhODJjOTcuLjUwNzU1OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMKQEAgLTQ1Nyw2ICs0NTcsODcgQEAKIC8qCiAgKiBUWCBjb250cm9sIGhhbmRsZXJzCiAgKi8KK3N0YXRpYyBib29sIHJ0MjgwMHVzYl90eGRvbmVfZW50cnlfY2hlY2soc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSwgdTMyIHJlZykKK3sKKwlfX2xlMzIgKnR4d2k7CisJdTMyIHdvcmQ7CisJaW50IHdjaWQsIGFjaywgcGlkOworCWludCB0eF93Y2lkLCB0eF9hY2ssIHR4X3BpZDsKKworCXdjaWQJPSBydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBUWF9TVEFfRklGT19XQ0lEKTsKKwlhY2sJPSBydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBUWF9TVEFfRklGT19UWF9BQ0tfUkVRVUlSRUQpOworCXBpZAk9IHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIFRYX1NUQV9GSUZPX1BJRF9UWVBFKTsKKworCS8qCisJICogVGhpcyBmcmFtZXMgaGFzIHJldHVybmVkIHdpdGggYW4gSU8gZXJyb3IsCisJICogc28gdGhlIHN0YXR1cyByZXBvcnQgaXMgbm90IGludGVuZGVkIGZvciB0aGlzCisJICogZnJhbWUuCisJICovCisJaWYgKHRlc3RfYml0KEVOVFJZX0RBVEFfSU9fRkFJTEVELCAmZW50cnktPmZsYWdzKSkgeworCQlydDJ4MDBsaWJfdHhkb25lX25vaW5mbyhlbnRyeSwgVFhET05FX0ZBSUxVUkUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBWYWxpZGF0ZSBpZiB0aGlzIFRYIHN0YXR1cyByZXBvcnQgaXMgaW50ZW5kZWQgZm9yCisJICogdGhpcyBlbnRyeSBieSBjb21wYXJpbmcgdGhlIFdDSUQvQUNLL1BJRCBmaWVsZHMuCisJICovCisJdHh3aSA9IHJ0MjgwMHVzYl9nZXRfdHh3aShlbnRyeSk7CisKKwlydDJ4MDBfZGVzY19yZWFkKHR4d2ksIDEsICZ3b3JkKTsKKwl0eF93Y2lkID0gcnQyeDAwX2dldF9maWVsZDMyKHdvcmQsIFRYV0lfVzFfV0lSRUxFU1NfQ0xJX0lEKTsKKwl0eF9hY2sgID0gcnQyeDAwX2dldF9maWVsZDMyKHdvcmQsIFRYV0lfVzFfQUNLKTsKKwl0eF9waWQgID0gcnQyeDAwX2dldF9maWVsZDMyKHdvcmQsIFRYV0lfVzFfUEFDS0VUSUQpOworCisJaWYgKCh3Y2lkICE9IHR4X3djaWQpIHx8IChhY2sgIT0gdHhfYWNrKSB8fCAocGlkICE9IHR4X3BpZCkpIHsKKwkJV0FSTklORyhlbnRyeS0+cXVldWUtPnJ0MngwMGRldiwKKwkJCSJUWCBzdGF0dXMgcmVwb3J0IG1pc3NlZCBmb3IgcXVldWUgJWQgZW50cnkgJWRcbiIsCisJCWVudHJ5LT5xdWV1ZS0+cWlkLCBlbnRyeS0+ZW50cnlfaWR4KTsKKwkJcnQyeDAwbGliX3R4ZG9uZV9ub2luZm8oZW50cnksIFRYRE9ORV9VTktOT1dOKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBydDI4MDB1c2JfdHhkb25lKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCit7CisJc3RydWN0IGRhdGFfcXVldWUgKnF1ZXVlOworCXN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnk7CisJdTMyIHJlZzsKKwl1OCBxaWQ7CisKKwl3aGlsZSAoa2ZpZm9fZ2V0KCZydDJ4MDBkZXYtPnR4c3RhdHVzX2ZpZm8sICZyZWcpKSB7CisKKwkJLyogVFhfU1RBX0ZJRk9fUElEX1FVRVVFIGlzIGEgMi1iaXQgZmllbGQsIHRodXMKKwkJICogcWlkIGlzIGd1YXJhbnRlZWQgdG8gYmUgb25lIG9mIHRoZSBUWCBRSURzCisJCSAqLworCQlxaWQgPSBydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBUWF9TVEFfRklGT19QSURfUVVFVUUpOworCQlxdWV1ZSA9IHJ0MngwMHF1ZXVlX2dldF90eF9xdWV1ZShydDJ4MDBkZXYsIHFpZCk7CisJCWlmICh1bmxpa2VseSghcXVldWUpKSB7CisJCQlXQVJOSU5HKHJ0MngwMGRldiwgIkdvdCBUWCBzdGF0dXMgZm9yIGFuIHVuYXZhaWxhYmxlICIKKwkJCQkJICAgInF1ZXVlICV1LCBkcm9wcGluZ1xuIiwgcWlkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogSW5zaWRlIGVhY2ggcXVldWUsIHdlIHByb2Nlc3MgZWFjaCBlbnRyeSBpbiBhIGNocm9ub2xvZ2ljYWwKKwkJICogb3JkZXIuIFdlIGZpcnN0IGNoZWNrIHRoYXQgdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eS4KKwkJICovCisJCWVudHJ5ID0gTlVMTDsKKwkJd2hpbGUgKCFydDJ4MDBxdWV1ZV9lbXB0eShxdWV1ZSkpIHsKKwkJCWVudHJ5ID0gcnQyeDAwcXVldWVfZ2V0X2VudHJ5KHF1ZXVlLCBRX0lOREVYX0RPTkUpOworCQkJaWYgKHJ0MjgwMHVzYl90eGRvbmVfZW50cnlfY2hlY2soZW50cnksIHJlZykpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWVudHJ5IHx8IHJ0MngwMHF1ZXVlX2VtcHR5KHF1ZXVlKSkKKwkJCWJyZWFrOworCisJCXJ0MjgwMF90eGRvbmVfZW50cnkoZW50cnksIHJlZyk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBydDI4MDB1c2Jfd29ya190eGRvbmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPQpAQCAtNDY0LDcgKzU0NSw3IEBACiAJc3RydWN0IGRhdGFfcXVldWUgKnF1ZXVlOwogCXN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnk7CiAKLQlydDI4MDBfdHhkb25lKHJ0MngwMGRldik7CisJcnQyODAwdXNiX3R4ZG9uZShydDJ4MDBkZXYpOwogCiAJLyoKIAkgKiBQcm9jZXNzIGFueSB0cmFpbGluZyBUWCBzdGF0dXMgcmVwb3J0cyBmb3IgSU8gZmFpbHVyZXMsCkBAIC02NzYsNiArNzU3LDcgQEAKIAkuZmx1c2gJCQk9IHJ0MngwMG1hY19mbHVzaCwKIAkuZ2V0X3N1cnZleQkJPSBydDI4MDBfZ2V0X3N1cnZleSwKIAkuZ2V0X3JpbmdwYXJhbQkJPSBydDJ4MDBtYWNfZ2V0X3JpbmdwYXJhbSwKKwkudHhfZnJhbWVzX3BlbmRpbmcJPSBydDJ4MDBtYWNfdHhfZnJhbWVzX3BlbmRpbmcsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0MjgwMF9vcHMgcnQyODAwdXNiX3J0MjgwMF9vcHMgPSB7CkBAIC05MzksNiArMTAyMSw3IEBACiAJeyBVU0JfREVWSUNFKDB4MGRmNiwgMHgwMDQ4KSB9LAogCXsgVVNCX0RFVklDRSgweDBkZjYsIDB4MDA1MSkgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwZGY2LCAweDAwNWYpIH0sCisJeyBVU0JfREVWSUNFKDB4MGRmNiwgMHgwMDYwKSB9LAogCS8qIFNNQyAqLwogCXsgVVNCX0RFVklDRSgweDA4M2EsIDB4NjYxOCkgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwODNhLCAweDc1MTEpIH0sCkBAIC05NzEsNiArMTA1NCw4IEBACiAJeyBVU0JfREVWSUNFKDB4MDU4NiwgMHgzNDFlKSB9LAogCXsgVVNCX0RFVklDRSgweDA1ODYsIDB4MzQzZSkgfSwKICNpZmRlZiBDT05GSUdfUlQyODAwVVNCX1JUMzNYWAorCS8qIEJlbGtpbiAqLworCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4OTQ1YikgfSwKIAkvKiBSYWxpbmsgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxNDhmLCAweDMzNzApIH0sCiAJeyBVU0JfREVWSUNFKDB4MTQ4ZiwgMHg4MDcwKSB9LApAQCAtOTk1LDYgKzEwODAsNyBAQAogCXsgVVNCX0RFVklDRSgweDE0OGYsIDB4MzU3MikgfSwKIAkvKiBTaXRlY29tICovCiAJeyBVU0JfREVWSUNFKDB4MGRmNiwgMHgwMDQxKSB9LAorCXsgVVNCX0RFVklDRSgweDBkZjYsIDB4MDA2MikgfSwKIAkvKiBUb3NoaWJhICovCiAJeyBVU0JfREVWSUNFKDB4MDkzMCwgMHgwYTA3KSB9LAogCS8qIFppbndlbGwgKi8KQEAgLTEwOTMsOCArMTE3OSw2IEBACiAJeyBVU0JfREVWSUNFKDB4MGRmNiwgMHgwMDRhKSB9LAogCXsgVVNCX0RFVklDRSgweDBkZjYsIDB4MDA0ZCkgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwZGY2LCAweDAwNTMpIH0sCi0JeyBVU0JfREVWSUNFKDB4MGRmNiwgMHgwMDYwKSB9LAotCXsgVVNCX0RFVklDRSgweDBkZjYsIDB4MDA2MikgfSwKIAkvKiBTTUMgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwODNhLCAweGE1MTIpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDgzYSwgMHhjNTIyKSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oCmluZGV4IGM0NDZkYjYuLmY4MmJmZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNkZWZpbmUgUlQyWDAwX0gKIAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CkBAIC0xMjc2LDYgKzEyNzcsNyBAQAogaW50IHJ0MngwMG1hY19nZXRfYW50ZW5uYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyICp0eF9hbnQsIHUzMiAqcnhfYW50KTsKIHZvaWQgcnQyeDAwbWFjX2dldF9yaW5ncGFyYW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgICAgIHUzMiAqdHgsIHUzMiAqdHhfbWF4LCB1MzIgKnJ4LCB1MzIgKnJ4X21heCk7Citib29sIHJ0MngwMG1hY190eF9mcmFtZXNfcGVuZGluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAKIC8qCiAgKiBEcml2ZXIgYWxsb2NhdGlvbiBoYW5kbGVycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjb25maWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjb25maWcuYwppbmRleCA1NTUxODBkLi5iNzA0ZTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY29uZmlnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNvbmZpZy5jCkBAIC0yNTAsNyArMjUwLDggQEAKIAlpZiAoaWVlZTgwMjExX2ZsYWdzICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpCiAJCXJ0MngwMGxpbmtfcmVzZXRfdHVuZXIocnQyeDAwZGV2LCBmYWxzZSk7CiAKLQlpZiAodGVzdF9iaXQoUkVRVUlSRV9QU19BVVRPV0FLRSwgJnJ0MngwMGRldi0+Y2FwX2ZsYWdzKSAmJgorCWlmICh0ZXN0X2JpdChERVZJQ0VfU1RBVEVfUFJFU0VOVCwgJnJ0MngwMGRldi0+ZmxhZ3MpICYmCisJICAgIHRlc3RfYml0KFJFUVVJUkVfUFNfQVVUT1dBS0UsICZydDJ4MDBkZXYtPmNhcF9mbGFncykgJiYKIAkgICAgKGllZWU4MDIxMV9mbGFncyAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUykgJiYKIAkgICAgKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfUFMpKSB7CiAJCWJlYWNvbl9kaWZmID0gKGxvbmcpamlmZmllcyAtIChsb25nKXJ0MngwMGRldi0+bGFzdF9iZWFjb247CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY3J5cHRvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY3J5cHRvLmMKaW5kZXggMWJiOWQ0Ni4uMWNhNGM3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNyeXB0by5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjcnlwdG8uYwpAQCAtNDUsMTEgKzQ1LDExIEBACiAJfQogfQogCi12b2lkIHJ0MngwMGNyeXB0b19jcmVhdGVfdHhfZGVzY3JpcHRvcihzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAordm9pZCBydDJ4MDBjcnlwdG9fY3JlYXRlX3R4X2Rlc2NyaXB0b3Ioc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICAgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjKQogewotCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBlbnRyeS0+cXVldWUtPnJ0MngwMGRldjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKGVudHJ5LT5za2IpOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICpod19rZXkgPSB0eF9pbmZvLT5jb250cm9sLmh3X2tleTsKIAogCWlmICghdGVzdF9iaXQoQ0FQQUJJTElUWV9IV19DUllQVE8sICZydDJ4MDBkZXYtPmNhcF9mbGFncykgfHwgIWh3X2tleSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZXYuYwppbmRleCBjMDE4ZDY3Li4wOTU1Yzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRldi5jCkBAIC0xNDYsNiArMTQ2LDkgQEAKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0KIAkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydDJ4MDBfZGV2LCBhdXRvd2FrZXVwX3dvcmsud29yayk7CiAKKwlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncykpCisJCXJldHVybjsKKwogCWlmIChydDJ4MDBkZXYtPm9wcy0+bGliLT5zZXRfZGV2aWNlX3N0YXRlKHJ0MngwMGRldiwgU1RBVEVfQVdBS0UpKQogCQlFUlJPUihydDJ4MDBkZXYsICJEZXZpY2UgZmFpbGVkIHRvIHdha2V1cC5cbiIpOwogCWNsZWFyX2JpdChDT05GSUdfUE9XRVJTQVZJTkcsICZydDJ4MDBkZXYtPmZsYWdzKTsKQEAgLTU4MCw2ICs1ODMsMTggQEAKIAlydDJ4MDBkZXYtPm9wcy0+bGliLT5maWxsX3J4ZG9uZShlbnRyeSwgJnJ4ZGVzYyk7CiAKIAkvKgorCSAqIENoZWNrIGZvciB2YWxpZCBzaXplIGluIGNhc2Ugd2UgZ2V0IGNvcnJ1cHRlZCBkZXNjcmlwdG9yIGZyb20KKwkgKiBoYXJkd2FyZS4KKwkgKi8KKwlpZiAodW5saWtlbHkocnhkZXNjLnNpemUgPT0gMCB8fAorCQkgICAgIHJ4ZGVzYy5zaXplID4gZW50cnktPnF1ZXVlLT5kYXRhX3NpemUpKSB7CisJCVdBUk5JTkcocnQyeDAwZGV2LCAiV3JvbmcgZnJhbWUgc2l6ZSAlZCBtYXggJWQuXG4iLAorCQkJcnhkZXNjLnNpemUsIGVudHJ5LT5xdWV1ZS0+ZGF0YV9zaXplKTsKKwkJZGV2X2tmcmVlX3NrYihlbnRyeS0+c2tiKTsKKwkJZ290byByZW5ld19za2I7CisJfQorCisJLyoKIAkgKiBUaGUgZGF0YSBiZWhpbmQgdGhlIGllZWU4MDIxMSBoZWFkZXIgbXVzdCBiZQogCSAqIGFsaWduZWQgb24gYSA0IGJ5dGUgYm91bmRhcnkuCiAJICovCkBAIC02MzksNiArNjU0LDcgQEAKIAogCWllZWU4MDIxMV9yeF9uaShydDJ4MDBkZXYtPmh3LCBlbnRyeS0+c2tiKTsKIAorcmVuZXdfc2tiOgogCS8qCiAJICogUmVwbGFjZSB0aGUgc2tiIHdpdGggdGhlIGZyZXNobHkgYWxsb2NhdGVkIG9uZS4KIAkgKi8KQEAgLTExNjAsNiArMTE3Niw3IEBACiAJICogU3RvcCBhbGwgd29yay4KIAkgKi8KIAljYW5jZWxfd29ya19zeW5jKCZydDJ4MDBkZXYtPmludGZfd29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZydDJ4MDBkZXYtPmF1dG93YWtldXBfd29yayk7CiAJaWYgKHJ0MngwMF9pc191c2IocnQyeDAwZGV2KSkgewogCQlkZWxfdGltZXJfc3luYygmcnQyeDAwZGV2LT50eHN0YXR1c190aW1lcik7CiAJCWNhbmNlbF93b3JrX3N5bmMoJnJ0MngwMGRldi0+cnhkb25lX3dvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGxpYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGxpYi5oCmluZGV4IDMyMmNjNGYuLjE1Y2RjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsaWIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGliLmgKQEAgLTMzNiw3ICszMzYsOCBAQAogICovCiAjaWZkZWYgQ09ORklHX1JUMlgwMF9MSUJfQ1JZUFRPCiBlbnVtIGNpcGhlciBydDJ4MDBjcnlwdG9fa2V5X3RvX2NpcGhlcihzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpOwotdm9pZCBydDJ4MDBjcnlwdG9fY3JlYXRlX3R4X2Rlc2NyaXB0b3Ioc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSwKK3ZvaWQgcnQyeDAwY3J5cHRvX2NyZWF0ZV90eF9kZXNjcmlwdG9yKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYyk7CiB1bnNpZ25lZCBpbnQgcnQyeDAwY3J5cHRvX3R4X292ZXJoZWFkKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbWFjLmMKaW5kZXggOTNiZWMxNC4uOGVmYWIzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMG1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYwpAQCAtODE4LDMgKzgxOCwxNyBAQAogCSpyeF9tYXggPSBydDJ4MDBkZXYtPnJ4LT5saW1pdDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0MngwMG1hY19nZXRfcmluZ3BhcmFtKTsKKworYm9vbCBydDJ4MDBtYWNfdHhfZnJhbWVzX3BlbmRpbmcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGh3LT5wcml2OworCXN0cnVjdCBkYXRhX3F1ZXVlICpxdWV1ZTsKKworCXR4X3F1ZXVlX2Zvcl9lYWNoKHJ0MngwMGRldiwgcXVldWUpIHsKKwkJaWYgKCFydDJ4MDBxdWV1ZV9lbXB0eShxdWV1ZSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydDJ4MDBtYWNfdHhfZnJhbWVzX3BlbmRpbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHF1ZXVlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcXVldWUuYwppbmRleCBhYjhjMTZmLi4yOWVkYjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcXVldWUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcXVldWUuYwpAQCAtMjAwLDIwICsyMDAsMjAgQEAKIAlza2JfcHVsbChza2IsIGwycGFkKTsKIH0KIAotc3RhdGljIHZvaWQgcnQyeDAwcXVldWVfY3JlYXRlX3R4X2Rlc2NyaXB0b3Jfc2VxKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksCitzdGF0aWMgdm9pZCBydDJ4MDBxdWV1ZV9jcmVhdGVfdHhfZGVzY3JpcHRvcl9zZXEoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkJIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKGVudHJ5LT5za2IpOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKillbnRyeS0+c2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCXN0cnVjdCBydDJ4MDBfaW50ZiAqaW50ZiA9IHZpZl90b19pbnRmKHR4X2luZm8tPmNvbnRyb2wudmlmKTsKLQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCiAJaWYgKCEodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FTU0lHTl9TRVEpKQogCQlyZXR1cm47CiAKIAlfX3NldF9iaXQoRU5UUllfVFhEX0dFTkVSQVRFX1NFUSwgJnR4ZGVzYy0+ZmxhZ3MpOwogCi0JaWYgKCF0ZXN0X2JpdChSRVFVSVJFX1NXX1NFUU5PLCAmZW50cnktPnF1ZXVlLT5ydDJ4MDBkZXYtPmNhcF9mbGFncykpCisJaWYgKCF0ZXN0X2JpdChSRVFVSVJFX1NXX1NFUU5PLCAmcnQyeDAwZGV2LT5jYXBfZmxhZ3MpKQogCQlyZXR1cm47CiAKIAkvKgpAQCAtMjI3LDIzICsyMjcsMjMgQEAKIAkgKiBzZXF1ZW5jZSBjb3VudGluZyBwZXItZnJhbWUsIHNpbmNlIHRob3NlIHdpbGwgb3ZlcnJpZGUgdGhlCiAJICogc2VxdWVuY2UgY291bnRlciBnaXZlbiBieSBtYWM4MDIxMS4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+c2VxbG9jaywgaXJxZmxhZ3MpOworCXNwaW5fbG9jaygmaW50Zi0+c2VxbG9jayk7CiAKIAlpZiAodGVzdF9iaXQoRU5UUllfVFhEX0ZJUlNUX0ZSQUdNRU5ULCAmdHhkZXNjLT5mbGFncykpCiAJCWludGYtPnNlcW5vICs9IDB4MTA7CiAJaGRyLT5zZXFfY3RybCAmPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU0NUTF9GUkFHKTsKIAloZHItPnNlcV9jdHJsIHw9IGNwdV90b19sZTE2KGludGYtPnNlcW5vKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPnNlcWxvY2ssIGlycWZsYWdzKTsKKwlzcGluX3VubG9jaygmaW50Zi0+c2VxbG9jayk7CiAKIH0KIAotc3RhdGljIHZvaWQgcnQyeDAwcXVldWVfY3JlYXRlX3R4X2Rlc2NyaXB0b3JfcGxjcChzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAorc3RhdGljIHZvaWQgcnQyeDAwcXVldWVfY3JlYXRlX3R4X2Rlc2NyaXB0b3JfcGxjcChzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAorCQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkJICBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MsCiAJCQkJCQkgIGNvbnN0IHN0cnVjdCBydDJ4MDBfcmF0ZSAqaHdyYXRlKQogewotCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBlbnRyeS0+cXVldWUtPnJ0MngwMGRldjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKGVudHJ5LT5za2IpOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnR4cmF0ZSA9ICZ0eF9pbmZvLT5jb250cm9sLnJhdGVzWzBdOwogCXVuc2lnbmVkIGludCBkYXRhX2xlbmd0aDsKIAl1bnNpZ25lZCBpbnQgZHVyYXRpb247CkBAIC0yNjAsOCArMjYwLDggQEAKIAkJdHhkZXNjLT51LnBsY3AuaWZzID0gSUZTX1NJRlM7CiAKIAkvKiBEYXRhIGxlbmd0aCArIENSQyArIENyeXB0byBvdmVyaGVhZCAoSVYvRUlWL0lDVi9NSUMpICovCi0JZGF0YV9sZW5ndGggPSBlbnRyeS0+c2tiLT5sZW4gKyA0OwotCWRhdGFfbGVuZ3RoICs9IHJ0MngwMGNyeXB0b190eF9vdmVyaGVhZChydDJ4MDBkZXYsIGVudHJ5LT5za2IpOworCWRhdGFfbGVuZ3RoID0gc2tiLT5sZW4gKyA0OworCWRhdGFfbGVuZ3RoICs9IHJ0MngwMGNyeXB0b190eF9vdmVyaGVhZChydDJ4MDBkZXYsIHNrYik7CiAKIAkvKgogCSAqIFBMQ1Agc2V0dXAKQEAgLTMwMiwxMyArMzAyLDE0IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBydDJ4MDBxdWV1ZV9jcmVhdGVfdHhfZGVzY3JpcHRvcl9odChzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAorc3RhdGljIHZvaWQgcnQyeDAwcXVldWVfY3JlYXRlX3R4X2Rlc2NyaXB0b3JfaHQoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCQkJCXN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCQlzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MsCiAJCQkJCQljb25zdCBzdHJ1Y3QgcnQyeDAwX3JhdGUgKmh3cmF0ZSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKGVudHJ5LT5za2IpOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnR4cmF0ZSA9ICZ0eF9pbmZvLT5jb250cm9sLnJhdGVzWzBdOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKillbnRyeS0+c2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAKIAlpZiAodHhfaW5mby0+Y29udHJvbC5zdGEpCiAJCXR4ZGVzYy0+dS5odC5tcGR1X2RlbnNpdHkgPQpAQCAtMzgxLDEyICszODIsMTIgQEAKIAkJdHhkZXNjLT51Lmh0LnR4b3AgPSBUWE9QX0hUVFhPUDsKIH0KIAotc3RhdGljIHZvaWQgcnQyeDAwcXVldWVfY3JlYXRlX3R4X2Rlc2NyaXB0b3Ioc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSwKK3N0YXRpYyB2b2lkIHJ0MngwMHF1ZXVlX2NyZWF0ZV90eF9kZXNjcmlwdG9yKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCisJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgICBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MpCiB7Ci0Jc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGVudHJ5LT5xdWV1ZS0+cnQyeDAwZGV2OwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IoZW50cnktPnNrYik7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWVudHJ5LT5za2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICp0eHJhdGUgPSAmdHhfaW5mby0+Y29udHJvbC5yYXRlc1swXTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGU7CiAJY29uc3Qgc3RydWN0IHJ0MngwMF9yYXRlICpod3JhdGUgPSBOVUxMOwpAQCAtMzk2LDggKzM5Nyw4IEBACiAJLyoKIAkgKiBIZWFkZXIgYW5kIGZyYW1lIGluZm9ybWF0aW9uLgogCSAqLwotCXR4ZGVzYy0+bGVuZ3RoID0gZW50cnktPnNrYi0+bGVuOwotCXR4ZGVzYy0+aGVhZGVyX2xlbmd0aCA9IGllZWU4MDIxMV9nZXRfaGRybGVuX2Zyb21fc2tiKGVudHJ5LT5za2IpOworCXR4ZGVzYy0+bGVuZ3RoID0gc2tiLT5sZW47CisJdHhkZXNjLT5oZWFkZXJfbGVuZ3RoID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKIAogCS8qCiAJICogQ2hlY2sgd2hldGhlciB0aGlzIGZyYW1lIGlzIHRvIGJlIGFja2VkLgpAQCAtNDcyLDEzICs0NzMsMTUgQEAKIAkvKgogCSAqIEFwcGx5IFRYIGRlc2NyaXB0b3IgaGFuZGxpbmcgYnkgY29tcG9uZW50cwogCSAqLwotCXJ0MngwMGNyeXB0b19jcmVhdGVfdHhfZGVzY3JpcHRvcihlbnRyeSwgdHhkZXNjKTsKLQlydDJ4MDBxdWV1ZV9jcmVhdGVfdHhfZGVzY3JpcHRvcl9zZXEoZW50cnksIHR4ZGVzYyk7CisJcnQyeDAwY3J5cHRvX2NyZWF0ZV90eF9kZXNjcmlwdG9yKHJ0MngwMGRldiwgc2tiLCB0eGRlc2MpOworCXJ0MngwMHF1ZXVlX2NyZWF0ZV90eF9kZXNjcmlwdG9yX3NlcShydDJ4MDBkZXYsIHNrYiwgdHhkZXNjKTsKIAogCWlmICh0ZXN0X2JpdChSRVFVSVJFX0hUX1RYX0RFU0MsICZydDJ4MDBkZXYtPmNhcF9mbGFncykpCi0JCXJ0MngwMHF1ZXVlX2NyZWF0ZV90eF9kZXNjcmlwdG9yX2h0KGVudHJ5LCB0eGRlc2MsIGh3cmF0ZSk7CisJCXJ0MngwMHF1ZXVlX2NyZWF0ZV90eF9kZXNjcmlwdG9yX2h0KHJ0MngwMGRldiwgc2tiLCB0eGRlc2MsCisJCQkJCQkgICAgaHdyYXRlKTsKIAllbHNlCi0JCXJ0MngwMHF1ZXVlX2NyZWF0ZV90eF9kZXNjcmlwdG9yX3BsY3AoZW50cnksIHR4ZGVzYywgaHdyYXRlKTsKKwkJcnQyeDAwcXVldWVfY3JlYXRlX3R4X2Rlc2NyaXB0b3JfcGxjcChydDJ4MDBkZXYsIHNrYiwgdHhkZXNjLAorCQkJCQkJICAgICAgaHdyYXRlKTsKIH0KIAogc3RhdGljIGludCBydDJ4MDBxdWV1ZV93cml0ZV90eF9kYXRhKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksCkBAIC01NTYsMzMgKzU1OSwxOCBAQAogCQkJICAgICAgIGJvb2wgbG9jYWwpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvOwotCXN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnkgPSBydDJ4MDBxdWV1ZV9nZXRfZW50cnkocXVldWUsIFFfSU5ERVgpOworCXN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnk7CiAJc3RydWN0IHR4ZW50cnlfZGVzYyB0eGRlc2M7CiAJc3RydWN0IHNrYl9mcmFtZV9kZXNjICpza2JkZXNjOwogCXU4IHJhdGVfaWR4LCByYXRlX2ZsYWdzOwotCi0JaWYgKHVubGlrZWx5KHJ0MngwMHF1ZXVlX2Z1bGwocXVldWUpKSkgewotCQlFUlJPUihxdWV1ZS0+cnQyeDAwZGV2LAotCQkgICAgICAiRHJvcHBpbmcgZnJhbWUgZHVlIHRvIGZ1bGwgdHggcXVldWUgJWQuXG4iLCBxdWV1ZS0+cWlkKTsKLQkJcmV0dXJuIC1FTk9CVUZTOwotCX0KLQotCWlmICh1bmxpa2VseSh0ZXN0X2FuZF9zZXRfYml0KEVOVFJZX09XTkVSX0RFVklDRV9EQVRBLAotCQkJCSAgICAgICZlbnRyeS0+ZmxhZ3MpKSkgewotCQlFUlJPUihxdWV1ZS0+cnQyeDAwZGV2LAotCQkgICAgICAiQXJyaXZlZCBhdCBub24tZnJlZSBlbnRyeSBpbiB0aGUgbm9uLWZ1bGwgcXVldWUgJWQuXG4iCi0JCSAgICAgICJQbGVhc2UgZmlsZSBidWcgcmVwb3J0IHRvICVzLlxuIiwKLQkJICAgICAgcXVldWUtPnFpZCwgRFJWX1BST0pFQ1QpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaW50IHJldCA9IDA7CiAKIAkvKgogCSAqIENvcHkgYWxsIFRYIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24gaW50byB0eGRlc2MsCiAJICogYWZ0ZXIgdGhhdCB3ZSBhcmUgZnJlZSB0byB1c2UgdGhlIHNrYi0+Y2IgYXJyYXkKIAkgKiBmb3Igb3VyIGluZm9ybWF0aW9uLgogCSAqLwotCWVudHJ5LT5za2IgPSBza2I7Ci0JcnQyeDAwcXVldWVfY3JlYXRlX3R4X2Rlc2NyaXB0b3IoZW50cnksICZ0eGRlc2MpOworCXJ0MngwMHF1ZXVlX2NyZWF0ZV90eF9kZXNjcmlwdG9yKHF1ZXVlLT5ydDJ4MDBkZXYsIHNrYiwgJnR4ZGVzYyk7CiAKIAkvKgogCSAqIEFsbCBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgc2tiLT5jYiBhcnJheSwKQEAgLTU5NCw3ICs1ODIsNiBAQAogCXJhdGVfZmxhZ3MgPSB0eF9pbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzOwogCXNrYmRlc2MgPSBnZXRfc2tiX2ZyYW1lX2Rlc2Moc2tiKTsKIAltZW1zZXQoc2tiZGVzYywgMCwgc2l6ZW9mKCpza2JkZXNjKSk7Ci0Jc2tiZGVzYy0+ZW50cnkgPSBlbnRyeTsKIAlza2JkZXNjLT50eF9yYXRlX2lkeCA9IHJhdGVfaWR4OwogCXNrYmRlc2MtPnR4X3JhdGVfZmxhZ3MgPSByYXRlX2ZsYWdzOwogCkBAIC02MjMsOSArNjEwLDMzIEBACiAJICogZm9yIFBDSSBkZXZpY2VzLgogCSAqLwogCWlmICh0ZXN0X2JpdChSRVFVSVJFX0wyUEFELCAmcXVldWUtPnJ0MngwMGRldi0+Y2FwX2ZsYWdzKSkKLQkJcnQyeDAwcXVldWVfaW5zZXJ0X2wycGFkKGVudHJ5LT5za2IsIHR4ZGVzYy5oZWFkZXJfbGVuZ3RoKTsKKwkJcnQyeDAwcXVldWVfaW5zZXJ0X2wycGFkKHNrYiwgdHhkZXNjLmhlYWRlcl9sZW5ndGgpOwogCWVsc2UgaWYgKHRlc3RfYml0KFJFUVVJUkVfRE1BLCAmcXVldWUtPnJ0MngwMGRldi0+Y2FwX2ZsYWdzKSkKLQkJcnQyeDAwcXVldWVfYWxpZ25fZnJhbWUoZW50cnktPnNrYik7CisJCXJ0MngwMHF1ZXVlX2FsaWduX2ZyYW1lKHNrYik7CisKKwlzcGluX2xvY2soJnF1ZXVlLT50eF9sb2NrKTsKKworCWlmICh1bmxpa2VseShydDJ4MDBxdWV1ZV9mdWxsKHF1ZXVlKSkpIHsKKwkJRVJST1IocXVldWUtPnJ0MngwMGRldiwKKwkJICAgICAgIkRyb3BwaW5nIGZyYW1lIGR1ZSB0byBmdWxsIHR4IHF1ZXVlICVkLlxuIiwgcXVldWUtPnFpZCk7CisJCXJldCA9IC1FTk9CVUZTOworCQlnb3RvIG91dDsKKwl9CisKKwllbnRyeSA9IHJ0MngwMHF1ZXVlX2dldF9lbnRyeShxdWV1ZSwgUV9JTkRFWCk7CisKKwlpZiAodW5saWtlbHkodGVzdF9hbmRfc2V0X2JpdChFTlRSWV9PV05FUl9ERVZJQ0VfREFUQSwKKwkJCQkgICAgICAmZW50cnktPmZsYWdzKSkpIHsKKwkJRVJST1IocXVldWUtPnJ0MngwMGRldiwKKwkJICAgICAgIkFycml2ZWQgYXQgbm9uLWZyZWUgZW50cnkgaW4gdGhlIG5vbi1mdWxsIHF1ZXVlICVkLlxuIgorCQkgICAgICAiUGxlYXNlIGZpbGUgYnVnIHJlcG9ydCB0byAlcy5cbiIsCisJCSAgICAgIHF1ZXVlLT5xaWQsIERSVl9QUk9KRUNUKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJc2tiZGVzYy0+ZW50cnkgPSBlbnRyeTsKKwllbnRyeS0+c2tiID0gc2tiOwogCiAJLyoKIAkgKiBJdCBjb3VsZCBiZSBwb3NzaWJsZSB0aGF0IHRoZSBxdWV1ZSB3YXMgY29ycnVwdGVkIGFuZCB0aGlzCkBAIC02MzUsNyArNjQ2LDggQEAKIAlpZiAodW5saWtlbHkocnQyeDAwcXVldWVfd3JpdGVfdHhfZGF0YShlbnRyeSwgJnR4ZGVzYykpKSB7CiAJCWNsZWFyX2JpdChFTlRSWV9PV05FUl9ERVZJQ0VfREFUQSwgJmVudHJ5LT5mbGFncyk7CiAJCWVudHJ5LT5za2IgPSBOVUxMOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CiAJfQogCiAJc2V0X2JpdChFTlRSWV9EQVRBX1BFTkRJTkcsICZlbnRyeS0+ZmxhZ3MpOwpAQCAtNjQ0LDcgKzY1Niw5IEBACiAJcnQyeDAwcXVldWVfd3JpdGVfdHhfZGVzY3JpcHRvcihlbnRyeSwgJnR4ZGVzYyk7CiAJcnQyeDAwcXVldWVfa2lja190eF9xdWV1ZShxdWV1ZSwgJnR4ZGVzYyk7CiAKLQlyZXR1cm4gMDsKK291dDoKKwlzcGluX3VubG9jaygmcXVldWUtPnR4X2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIGludCBydDJ4MDBxdWV1ZV9jbGVhcl9iZWFjb24oc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKQEAgLTY5OCw3ICs3MTIsNyBAQAogCSAqIGFmdGVyIHRoYXQgd2UgYXJlIGZyZWUgdG8gdXNlIHRoZSBza2ItPmNiIGFycmF5CiAJICogZm9yIG91ciBpbmZvcm1hdGlvbi4KIAkgKi8KLQlydDJ4MDBxdWV1ZV9jcmVhdGVfdHhfZGVzY3JpcHRvcihpbnRmLT5iZWFjb24sICZ0eGRlc2MpOworCXJ0MngwMHF1ZXVlX2NyZWF0ZV90eF9kZXNjcmlwdG9yKHJ0MngwMGRldiwgaW50Zi0+YmVhY29uLT5za2IsICZ0eGRlc2MpOwogCiAJLyoKIAkgKiBGaWxsIGluIHNrYiBkZXNjcmlwdG9yCkBAIC0xMTg1LDYgKzExOTksNyBAQAogCQkJICAgICBzdHJ1Y3QgZGF0YV9xdWV1ZSAqcXVldWUsIGVudW0gZGF0YV9xdWV1ZV9xaWQgcWlkKQogewogCW11dGV4X2luaXQoJnF1ZXVlLT5zdGF0dXNfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnF1ZXVlLT50eF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmluZGV4X2xvY2spOwogCiAJcXVldWUtPnJ0MngwMGRldiA9IHJ0MngwMGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHF1ZXVlLmgKaW5kZXggMTY3ZDQ1OC4uZjIxMDBmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHF1ZXVlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHF1ZXVlLmgKQEAgLTU0LDcgKzU0LDcgQEAKICAqIEBRSURfUlg6IFJYIHF1ZXVlCiAgKiBAUUlEX09USEVSOiBOb25lIG9mIHRoZSBhYm92ZSAoZG9uJ3QgdXNlLCBvbmx5IHByZXNlbnQgZm9yIGNvbXBsZXRlbmVzcykKICAqIEBRSURfQkVBQ09OOiBCZWFjb24gcXVldWUgKHZhbHVlIHVuc3BlY2lmaWVkLCBkb24ndCBzZW5kIGl0IHRvIGRldmljZSkKLSAqIEBRSURfQVRJTTogQXRpbSBxdWV1ZSAodmFsdWUgdW5zcGVmaWNpZWQsIGRvbid0IHNlbmQgaXQgdG8gZGV2aWNlKQorICogQFFJRF9BVElNOiBBdGltIHF1ZXVlICh2YWx1ZSB1bnNwZWNpZmllZCwgZG9uJ3Qgc2VuZCBpdCB0byBkZXZpY2UpCiAgKi8KIGVudW0gZGF0YV9xdWV1ZV9xaWQgewogCVFJRF9BQ19WTyA9IDAsCkBAIC00MzIsNiArNDMyLDcgQEAKICAqIEBmbGFnczogRW50cnkgZmxhZ3MsIHNlZSAmZW51bSBxdWV1ZV9lbnRyeV9mbGFncy4KICAqIEBzdGF0dXNfbG9jazogVGhlIG11dGV4IGZvciBwcm90ZWN0aW5nIHRoZSBzdGFydC9zdG9wL2ZsdXNoCiAgKgloYW5kbGluZyBvbiB0aGlzIHF1ZXVlLgorICogQHR4X2xvY2s6IFNwaW5sb2NrIHRvIHNlcmlhbGl6ZSB0eCBvcGVyYXRpb25zIG9uIHRoaXMgcXVldWUuCiAgKiBAaW5kZXhfbG9jazogU3BpbmxvY2sgdG8gcHJvdGVjdCBpbmRleCBoYW5kbGluZy4gV2hlbmV2ZXIgQGluZGV4LCBAaW5kZXhfZG9uZSBvcgogICoJQGluZGV4X2NyeXB0IG5lZWRzIHRvIGJlIGNoYW5nZWQgdGhpcyBsb2NrIHNob3VsZCBiZSBncmFiYmVkIHRvIHByZXZlbnQKICAqCWluZGV4IGNvcnJ1cHRpb24gZHVlIHRvIGNvbmN1cnJlbmN5LgpAQCAtNDU4LDYgKzQ1OSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXN0cnVjdCBtdXRleCBzdGF0dXNfbG9jazsKKwlzcGlubG9ja190IHR4X2xvY2s7CiAJc3BpbmxvY2tfdCBpbmRleF9sb2NrOwogCiAJdW5zaWduZWQgaW50IGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHVzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHVzYi5jCmluZGV4IDhmOTBmNjIuLmI2YjQ1NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDB1c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwdXNiLmMKQEAgLTgwMiw2ICs4MDIsNyBAQAogCWludCByZXR2YWw7CiAKIAl1c2JfZGV2ID0gdXNiX2dldF9kZXYodXNiX2Rldik7CisJdXNiX3Jlc2V0X2RldmljZSh1c2JfZGV2KTsKIAogCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZihzdHJ1Y3QgcnQyeDAwX2RldiksIG9wcy0+aHcpOwogCWlmICghaHcpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDYxcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5jCmluZGV4IDlkMzVlYzEuLjUzMTEwYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDYxcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NjFwY2kuYwpAQCAtMjk4Miw2ICsyOTgyLDcgQEAKIAkuc2V0X2FudGVubmEJCT0gcnQyeDAwbWFjX3NldF9hbnRlbm5hLAogCS5nZXRfYW50ZW5uYQkJPSBydDJ4MDBtYWNfZ2V0X2FudGVubmEsCiAJLmdldF9yaW5ncGFyYW0JCT0gcnQyeDAwbWFjX2dldF9yaW5ncGFyYW0sCisJLnR4X2ZyYW1lc19wZW5kaW5nCT0gcnQyeDAwbWFjX3R4X2ZyYW1lc19wZW5kaW5nLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBydDJ4MDBsaWJfb3BzIHJ0NjFwY2lfcnQyeDAwX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5jCmluZGV4IGFkMjA5NTMuLjZhOTM5MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuYwpAQCAtMjMxNCw2ICsyMzE0LDcgQEAKIAkuc2V0X2FudGVubmEJCT0gcnQyeDAwbWFjX3NldF9hbnRlbm5hLAogCS5nZXRfYW50ZW5uYQkJPSBydDJ4MDBtYWNfZ2V0X2FudGVubmEsCiAJLmdldF9yaW5ncGFyYW0JCT0gcnQyeDAwbWFjX2dldF9yaW5ncGFyYW0sCisJLnR4X2ZyYW1lc19wZW5kaW5nCT0gcnQyeDAwbWFjX3R4X2ZyYW1lc19wZW5kaW5nLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBydDJ4MDBsaWJfb3BzIHJ0NzN1c2JfcnQyeDAwX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC9kZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC9kZXYuYwppbmRleCA4MGRiNWNhLi42NmIyOWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODAvZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwL2Rldi5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvS2NvbmZpZwppbmRleCA1YWVlOGIyLi40NWUxNDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9LY29uZmlnCkBAIC0yMSw2ICsyMSwxNyBAQAogCiAJSWYgeW91IGNob29zZSB0byBidWlsZCBpdCBhcyBhIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgcnRsODE5MnNlCiAKK2NvbmZpZyBSVEw4MTkyREUKKwl0cmlzdGF0ZSAiUmVhbHRlayBSVEw4MTkyREUvUlRMODE4OERFIFBDSWUgV2lyZWxlc3MgTmV0d29yayBBZGFwdGVyIgorCWRlcGVuZHMgb24gTUFDODAyMTEgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEZXX0xPQURFUgorCXNlbGVjdCBSVExXSUZJCisJLS0taGVscC0tLQorCVRoaXMgaXMgdGhlIGRyaXZlciBmb3IgUmVhbHRlayBSVEw4MTkyREUvUlRMODE4OERFIDgwMi4xMW4gUENJZQorCXdpcmVsZXNzIG5ldHdvcmsgYWRhcHRlcnMuCisKKwlJZiB5b3UgY2hvb3NlIHRvIGJ1aWxkIGl0IGFzIGEgbW9kdWxlLCBpdCB3aWxsIGJlIGNhbGxlZCBydGw4MTkyZGUKKwogY29uZmlnIFJUTDgxOTJDVQogCXRyaXN0YXRlICJSZWFsdGVrIFJUTDgxOTJDVS9SVEw4MTg4Q1UgVVNCIFdpcmVsZXNzIE5ldHdvcmsgQWRhcHRlciIKIAlkZXBlbmRzIG9uIE1BQzgwMjExICYmIFVTQiAmJiBFWFBFUklNRU5UQUwKQEAgLTM1LDEwICs0NiwxMCBAQAogCiBjb25maWcgUlRMV0lGSQogCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBSVEw4MTkyQ0UgfHwgUlRMODE5MkNVIHx8IFJUTDgxOTJTRQorCWRlcGVuZHMgb24gUlRMODE5MkNFIHx8IFJUTDgxOTJDVSB8fCBSVEw4MTkyU0UgfHwgUlRMODE5MkRFCiAJZGVmYXVsdCBtCiAKIGNvbmZpZyBSVEw4MTkyQ19DT01NT04KIAl0cmlzdGF0ZQotCWRlcGVuZHMgb24gUlRMODE5MkNFIHx8IFJUTDgxOTJDVSB8fCBSVEw4MTkyU0UKKwlkZXBlbmRzIG9uIFJUTDgxOTJDRSB8fCBSVEw4MTkyQ1UKIAlkZWZhdWx0IG0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL01ha2VmaWxlCmluZGV4IDdhY2NlODMuLjk3OTM1YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9NYWtlZmlsZQpAQCAtMjMsNSArMjMsNiBAQAogb2JqLSQoQ09ORklHX1JUTDgxOTJDRSkJCSs9IHJ0bDgxOTJjZS8KIG9iai0kKENPTkZJR19SVEw4MTkyQ1UpCQkrPSBydGw4MTkyY3UvCiBvYmotJChDT05GSUdfUlRMODE5MlNFKQkJKz0gcnRsODE5MnNlLworb2JqLSQoQ09ORklHX1JUTDgxOTJERSkJCSs9IHJ0bDgxOTJkZS8KIAogY2NmbGFncy15ICs9IC1EX19DSEVDS19FTkRJQU5fXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9iYXNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuYwppbmRleCBjY2I2ZGEzLi4wYjU5OGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuYwpAQCAtMjcsNiArMjcsOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlICJ3aWZpLmgiCiAjaW5jbHVkZSAicmMuaCIKQEAgLTM5Nyw4ICszOTksOCBAQAogCXJhZGlvX3N0YXRlID0gcnRscHJpdi0+Y2ZnLT5vcHMtPnJhZGlvX29ub2ZmX2NoZWNraW5nKGh3LCAmdmFsaWQpOwogCiAJaWYgKHZhbGlkKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInJ0bHdpZmk6IHdpcmVsZXNzIHN3aXRjaCBpcyAlc1xuIiwKLQkJCQlydGxwcml2LT5yZmtpbGwucmZraWxsX3N0YXRlID8gIm9uIiA6ICJvZmYiKTsKKwkJcHJfaW5mbygid2lyZWxlc3Mgc3dpdGNoIGlzICVzXG4iLAorCQkJcnRscHJpdi0+cmZraWxsLnJma2lsbF9zdGF0ZSA/ICJvbiIgOiAib2ZmIik7CiAKIAkJcnRscHJpdi0+cmZraWxsLnJma2lsbF9zdGF0ZSA9IHJhZGlvX3N0YXRlOwogCkBAIC01MjMsNyArNTI1LDcgQEAKIAkJbWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCiAJCWJ3XzQwID0gc3RhLT5odF9jYXAuY2FwICYgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDA7CiAKLQlpZiAoKGJ3XzQwID09IHRydWUpICYmIHNnaV80MCkKKwlpZiAoYndfNDAgJiYgc2dpXzQwKQogCQl0Y2JfZGVzYy0+dXNlX3Nob3J0Z2kgPSB0cnVlOwogCWVsc2UgaWYgKChid180MCA9PSBmYWxzZSkgJiYgc2dpXzIwKQogCQl0Y2JfZGVzYy0+dXNlX3Nob3J0Z2kgPSB0cnVlOwpAQCAtNzU2LDE4ICs3NTgsMTcgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIChDT01QX1NFTkQgfCBDT01QX1JFQ1YpLCBEQkdfRE1FU0csCi0JCQkJICgiJXMgQUNUX0FEREJBUkVRIEZyb20gOiIgTUFDX0ZNVCAiXG4iLAotCQkJCSAgaXNfdHggPyAiVHgiIDogIlJ4IiwgTUFDX0FSRyhoZHItPmFkZHIyKSkpOworCQkJCSAoIiVzIEFDVF9BRERCQVJFUSBGcm9tIDolcE1cbiIsCisJCQkJICBpc190eCA/ICJUeCIgOiAiUngiLCBoZHItPmFkZHIyKSk7CiAJCQlicmVhazsKIAkJY2FzZSBBQ1RfQUREQkFSU1A6CiAJCQlSVF9UUkFDRShydGxwcml2LCAoQ09NUF9TRU5EIHwgQ09NUF9SRUNWKSwgREJHX0RNRVNHLAotCQkJCSAoIiVzIEFDVF9BRERCQVJTUCBGcm9tIDoiIE1BQ19GTVQgIlxuIiwKLQkJCQkgIGlzX3R4ID8gIlR4IiA6ICJSeCIsIE1BQ19BUkcoaGRyLT5hZGRyMikpKTsKKwkJCQkgKCIlcyBBQ1RfQUREQkFSU1AgRnJvbSA6JXBNXG4iLAorCQkJCSAgaXNfdHggPyAiVHgiIDogIlJ4IiwgaGRyLT5hZGRyMikpOwogCQkJYnJlYWs7CiAJCWNhc2UgQUNUX0RFTEJBOgogCQkJUlRfVFJBQ0UocnRscHJpdiwgKENPTVBfU0VORCB8IENPTVBfUkVDViksIERCR19ETUVTRywKLQkJCQkgKCJBQ1RfQUREQkFERUwgRnJvbSA6IiBNQUNfRk1UICJcbiIsCi0JCQkJICBNQUNfQVJHKGhkci0+YWRkcjIpKSk7CisJCQkJICgiQUNUX0FEREJBREVMIEZyb20gOiVwTVxuIiwgaGRyLT5hZGRyMikpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC04ODgsNyArODg5LDYgQEAKIHsKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKLQlzdHJ1Y3QgcnRsX3RpZF9kYXRhICp0aWRfZGF0YTsKIAlzdHJ1Y3QgcnRsX3N0YV9pbmZvICpzdGFfZW50cnkgPSBOVUxMOwogCiAJaWYgKHN0YSA9PSBOVUxMKQpAQCAtOTA2LDcgKzkwNiw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3RhX2VudHJ5ID0gKHN0cnVjdCBydGxfc3RhX2luZm8gKilzdGEtPmRydl9wcml2OwotCXRpZF9kYXRhID0gJnN0YV9lbnRyeS0+dGlkc1t0aWRdOwogCXN0YV9lbnRyeS0+dGlkc1t0aWRdLmFnZy5hZ2dfc3RhdGUgPSBSVExfQUdHX1NUT1A7CiAKIAlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKG1hYy0+dmlmLCBzdGEtPmFkZHIsIHRpZCk7CkBAIC05MTgsNyArOTE3LDYgQEAKIAkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCkKIHsKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7Ci0Jc3RydWN0IHJ0bF90aWRfZGF0YSAqdGlkX2RhdGE7CiAJc3RydWN0IHJ0bF9zdGFfaW5mbyAqc3RhX2VudHJ5ID0gTlVMTDsKIAogCWlmIChzdGEgPT0gTlVMTCkKQEAgLTkzNiw3ICs5MzQsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXN0YV9lbnRyeSA9IChzdHJ1Y3QgcnRsX3N0YV9pbmZvICopc3RhLT5kcnZfcHJpdjsKLQl0aWRfZGF0YSA9ICZzdGFfZW50cnktPnRpZHNbdGlkXTsKIAlzdGFfZW50cnktPnRpZHNbdGlkXS5hZ2cuYWdnX3N0YXRlID0gUlRMX0FHR19PUEVSQVRJT05BTDsKIAogCXJldHVybiAwOwpAQCAtMTQwNiw4ICsxNDAzLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IHJ0bF9jb3JlX21vZHVsZV9pbml0KHZvaWQpCiB7CiAJaWYgKHJ0bF9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoKSkKLQkJcHJpbnRrKEtFUk5fRVJSICJydGx3aWZpOiBVbmFibGUgdG8gcmVnaXN0ZXIgcnRsX3JjLCIKLQkJICAgICAgICJ1c2UgZGVmYXVsdCBSQyAhIVxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIHJ0bF9yYywgdXNlIGRlZmF1bHQgUkMgISFcbiIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NhbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jYW0uYwppbmRleCA3Mjk1YWYwLi43YmFiYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NhbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvY2FtLmMKQEAgLTI3LDYgKzI3LDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgIndpZmkuaCIKICNpbmNsdWRlICJjYW0uaCIKIApAQCAtMTMxLDkgKzEzMyw5IEBACiAKIAlSVF9UUkFDRShydGxwcml2LCBDT01QX1NFQywgREJHX0RNRVNHLAogCQkgKCJFbnRyeU5vOiV4LCB1bEtleUlkPSV4LCB1bEVuY0FsZz0leCwgIgotCQkgICJ1bFVzZURLPSV4IE1hY0FkZHIiIE1BQ19GTVQgIlxuIiwKKwkJICAidWxVc2VESz0leCBNYWNBZGRyICVwTVxuIiwKIAkJICB1bF9lbnRyeV9pZHgsIHVsX2tleV9pZCwgdWxfZW5jX2FsZywKLQkJICB1bF9kZWZhdWx0X2tleSwgTUFDX0FSRyhtYWNfYWRkcikpKTsKKwkJICB1bF9kZWZhdWx0X2tleSwgbWFjX2FkZHIpKTsKIAogCWlmICh1bF9rZXlfaWQgPT0gVE9UQUxfQ0FNX0VOVFJZKSB7CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfV0FSTklORywKQEAgLTM0Nyw3ICszNDksNyBAQAogCQkJLyogUmVtb3ZlIGZyb20gSFcgU2VjdXJpdHkgQ0FNICovCiAJCQltZW1zZXQocnRscHJpdi0+c2VjLmh3c2VjX2NhbV9zdGFfYWRkcltpXSwgMCwgRVRIX0FMRU4pOwogCQkJcnRscHJpdi0+c2VjLmh3c2VjX2NhbV9iaXRtYXAgJj0gfihCSVQoMCkgPDwgaSk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICImJiYmJiYmJiZkZWwgZW50cnkgJWRcbiIsIGkpOworCQkJcHJfaW5mbygiJiYmJiYmJiYmZGVsIGVudHJ5ICVkXG4iLCBpKTsKIAkJfQogCX0KIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvY29yZS5jCmluZGV4IGQyZWMyNTMuLjFiZGMxYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvY29yZS5jCkBAIC0zMzUsOCArMzM1LDggQEAKIAkJICogYmVmb3JlIGdvaW5nIG9mZmNoYW5uZWwsIG9yIGRpcy1hc3NvY2lhdGlvbiBvciBkZWxldGUgQkEgd2lsbAogCQkgKiBoYXBwZW4gYnkgQVAKIAkJICovCi0JCWlmIChydGxwcml2LT5tYWM4MDIxMS5vZmZjaGFuX2RlbGV5KSB7Ci0JCQlydGxwcml2LT5tYWM4MDIxMS5vZmZjaGFuX2RlbGV5ID0gZmFsc2U7CisJCWlmIChydGxwcml2LT5tYWM4MDIxMS5vZmZjaGFuX2RlbGF5KSB7CisJCQlydGxwcml2LT5tYWM4MDIxMS5vZmZjaGFuX2RlbGF5ID0gZmFsc2U7CiAJCQltZGVsYXkoNTApOwogCQl9CiAJCXJ0bHBoeS0+Y3VycmVudF9jaGFubmVsID0gd2lkZV9jaGFuOwpAQCAtNDQzLDExICs0NDMsMTEgQEAKIAkJCXN0YV9lbnRyeS0+d2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfRzsKIAkJCWlmIChzdGEtPnN1cHBfcmF0ZXNbMF0gPD0gMHhmKQogCQkJCXN0YV9lbnRyeS0+d2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfQjsKLQkJCWlmIChzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQgPT0gdHJ1ZSkKKwkJCWlmIChzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQpCiAJCQkJc3RhX2VudHJ5LT53aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9OXzI0RzsKIAkJfSBlbHNlIGlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81RykgewogCQkJc3RhX2VudHJ5LT53aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9BOwotCQkJaWYgKHN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCA9PSB0cnVlKQorCQkJaWYgKHN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCkKIAkJCQlzdGFfZW50cnktPndpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX05fMjRHOwogCQl9CiAKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCQkJc3RhX2VudHJ5LT53aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9HOwogCiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfTUFDODAyMTEsIERCR19ETUVTRywKLQkJCSgiQWRkIHN0YSBhZGRyIGlzICJNQUNfRk1UIlxuIiwgTUFDX0FSRyhzdGEtPmFkZHIpKSk7CisJCQkoIkFkZCBzdGEgYWRkciBpcyAlcE1cbiIsIHN0YS0+YWRkcikpOwogCQlydGxwcml2LT5jZmctPm9wcy0+dXBkYXRlX3JhdGVfdGJsKGh3LCBzdGEsIDApOwogCX0KIAlyZXR1cm4gMDsKQEAgLTQ2OSw3ICs0NjksNyBAQAogCXN0cnVjdCBydGxfc3RhX2luZm8gKnN0YV9lbnRyeTsKIAlpZiAoc3RhKSB7CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfTUFDODAyMTEsIERCR19ETUVTRywKLQkJCSgiUmVtb3ZlIHN0YSBhZGRyIGlzICJNQUNfRk1UIlxuIiwgTUFDX0FSRyhzdGEtPmFkZHIpKSk7CisJCQkoIlJlbW92ZSBzdGEgYWRkciBpcyAlcE1cbiIsIHN0YS0+YWRkcikpOwogCQlzdGFfZW50cnkgPSAoc3RydWN0IHJ0bF9zdGFfaW5mbyAqKSBzdGEtPmRydl9wcml2OwogCQlzdGFfZW50cnktPndpcmVsZXNzX21vZGUgPSAwOwogCQlzdGFfZW50cnktPnJhdHJfaW5kZXggPSAwOwpAQCAtNjUwLDcgKzY1MCw3IEBACiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfTUFDODAyMTEsIERCR19UUkFDRSwKIAkJCSAoIkJTU19DSEFOR0VEX0hUXG4iKSk7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJc3RhID0gZ2V0X3N0YShodywgdmlmLCAodTggKilic3NfY29uZi0+YnNzaWQpOworCQlzdGEgPSBnZXRfc3RhKGh3LCB2aWYsIGJzc19jb25mLT5ic3NpZCk7CiAJCWlmIChzdGEpIHsKIAkJCWlmIChzdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5ID4KIAkJCSAgICBtYWMtPmN1cnJlbnRfYW1wZHVfZGVuc2l0eSkKQEAgLTY3OCwxNCArNjc4LDE0IEBACiAJCQkJCSAgICAgICh1OCAqKSBic3NfY29uZi0+YnNzaWQpOwogCiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfTUFDODAyMTEsIERCR19ETUVTRywKLQkJCSAoTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGJzc19jb25mLT5ic3NpZCkpKTsKKwkJCSAoIiVwTVxuIiwgYnNzX2NvbmYtPmJzc2lkKSk7CiAKIAkJbWFjLT52ZW5kb3IgPSBQRUVSX1VOS05PV047CiAJCW1lbWNweShtYWMtPmJzc2lkLCBic3NfY29uZi0+YnNzaWQsIDYpOwogCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X25ldHdvcmtfdHlwZShodywgdmlmLT50eXBlKTsKIAogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXN0YSA9IGdldF9zdGEoaHcsIHZpZiwgKHU4ICopYnNzX2NvbmYtPmJzc2lkKTsKKwkJc3RhID0gZ2V0X3N0YShodywgdmlmLCBic3NfY29uZi0+YnNzaWQpOwogCQlpZiAoIXN0YSkgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jb3JlLmgKaW5kZXggNGIyNDdkYi4uZjAyODI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jb3JlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jb3JlLmgKQEAgLTMwLDYgKzMwLDggQEAKICNpZm5kZWYgX19SVExfQ09SRV9IX18KICNkZWZpbmUgX19SVExfQ09SRV9IX18KIAorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCiAjZGVmaW5lIFJUTF9TVVBQT1JURURfRklMVEVSUwkJXAogCShGSUZfUFJPTUlTQ19JTl9CU1MgfCBcCiAJRklGX0FMTE1VTFRJIHwgRklGX0NPTlRST0wgfCBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2RlYnVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2RlYnVnLmgKaW5kZXggZTRhYTg2OC4uMTYwZGQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvZGVidWcuaApAQCAtMjA0LDEwICsyMDQsNSBAQAogCQl9IFwKIAl9IHdoaWxlICgwKTsKIAotI2RlZmluZSBNQUNfRk1UICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKLSNkZWZpbmUgTUFDX0FSRyh4KSBcCi0JKCh1OCAqKSh4KSlbMF0sICgodTggKikoeCkpWzFdLCAoKHU4ICopKHgpKVsyXSxcCi0JKCh1OCAqKSh4KSlbM10sICgodTggKikoeCkpWzRdLCAoKHU4ICopKHgpKVs1XQotCiB2b2lkIHJ0bF9kYmdwX2ZsYWdfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvZWZ1c2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvZWZ1c2UuYwppbmRleCA1MGRlNmY1Li4zZmMyMWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2VmdXNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9lZnVzZS5jCkBAIC0zODIsNyArMzgyLDcgQEAKIAkJCX0KIAkJfQogCi0JCWlmICh3b3JkY2hhbmdlZCA9PSB0cnVlKQorCQlpZiAod29yZGNoYW5nZWQpCiAJCQloZHJfbnVtKys7CiAJfQogCkBAIC00NTMsNyArNDUzLDcgQEAKIAkJYmFzZSA9IG9mZnNldCAqIDg7CiAKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkJaWYgKGZpcnN0X3BnID09IHRydWUpIHsKKwkJCWlmIChmaXJzdF9wZykgewogCiAJCQkJd29yZF9lbiAmPSB+KEJJVChpIC8gMikpOwogCkBAIC01MDUsNyArNTA1LDcgQEAKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKIAotCWlmIChydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcgPT0gdHJ1ZSkKKwlpZiAocnRsZWZ1c2UtPmF1dG9sb2FkX2ZhaWxmbGFnKQogCQltZW1zZXQoJnJ0bGVmdXNlLT5lZnVzZV9tYXBbRUZVU0VfSU5JVF9NQVBdWzBdLCAweEZGLAogCQkJcnRscHJpdi0+Y2ZnLT5tYXBzW0VGVVNFX0hXU0VUX01BWF9TSVpFXSk7CiAJZWxzZQpAQCAtNjkwLDcgKzY5MCw3IEBACiAJCQl9CiAJCX0KIAotCQlpZiAoZGF0YWVtcHR5ID09IHRydWUpIHsKKwkJaWYgKGRhdGFlbXB0eSkgewogCQkJKnJlYWRzdGF0ZSA9IFBHX1NUQVRFX0RBVEE7CiAJCX0gZWxzZSB7CiAJCQkqZWZ1c2VfYWRkciA9ICplZnVzZV9hZGRyICsgKHdvcmRfY250cyAqIDIpICsgMTsKQEAgLTkyNSw3ICs5MjUsNyBAQAogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAlzdHJ1Y3QgcGdwa3Rfc3RydWN0IHRhcmdldF9wa3Q7CiAJdTggd3JpdGVfc3RhdGUgPSBQR19TVEFURV9IRUFERVI7Ci0JaW50IGNvbnRpbnVhbCA9IHRydWUsIGRhdGFlbXB0eSA9IHRydWUsIHJlc3VsdCA9IHRydWU7CisJaW50IGNvbnRpbnVhbCA9IHRydWUsIHJlc3VsdCA9IHRydWU7CiAJdTE2IGVmdXNlX2FkZHIgPSAwOwogCXU4IGVmdXNlX2RhdGE7CiAJdTggdGFyZ2V0X3dvcmRfY250cyA9IDA7CkBAIC05NTMsNyArOTUzLDYgQEAKIAkgICAgICAgKEVGVVNFX01BWF9TSVpFIC0gRUZVU0VfT09CX1BST1RFQ1RfQllURVMpKSkgewogCiAJCWlmICh3cml0ZV9zdGF0ZSA9PSBQR19TVEFURV9IRUFERVIpIHsKLQkJCWRhdGFlbXB0eSA9IHRydWU7CiAJCQliYWR3b3JkZW4gPSAweDBGOwogCQkJUlRQUklOVChydGxwcml2LCBGRUVQUk9NLCBFRlVTRV9QRywKIAkJCQkoImVmdXNlIFBHX1NUQVRFX0hFQURFUlxuIikpOwpAQCAtMTE3NiwxMyArMTE3NSwxMiBAQAogewogCWludCBjb250aW51YWwgPSB0cnVlOwogCXUxNiBlZnVzZV9hZGRyID0gMDsKLQl1OCBob2Zmc2V0LCBod29yZGVuOworCXU4IGh3b3JkZW47CiAJdTggZWZ1c2VfZGF0YSwgd29yZF9jbnRzOwogCiAJd2hpbGUgKGNvbnRpbnVhbCAmJiBlZnVzZV9vbmVfYnl0ZV9yZWFkKGh3LCBlZnVzZV9hZGRyLCAmZWZ1c2VfZGF0YSkKIAkgICAgICAgJiYgKGVmdXNlX2FkZHIgPCBFRlVTRV9NQVhfU0laRSkpIHsKIAkJaWYgKGVmdXNlX2RhdGEgIT0gMHhGRikgewotCQkJaG9mZnNldCA9IChlZnVzZV9kYXRhID4+IDQpICYgMHgwRjsKIAkJCWh3b3JkZW4gPSBlZnVzZV9kYXRhICYgMHgwRjsKIAkJCXdvcmRfY250cyA9IGVmdXNlX2NhbGN1bGF0ZV93b3JkX2NudHMoaHdvcmRlbik7CiAJCQllZnVzZV9hZGRyID0gZWZ1c2VfYWRkciArICh3b3JkX2NudHMgKiAyKSArIDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuYwppbmRleCA4OTEwMGU3Li41ZWZkNTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcGNpLmMKQEAgLTM1LDEwICszNSwxMCBAQAogI2luY2x1ZGUgImVmdXNlLmgiCiAKIHN0YXRpYyBjb25zdCB1MTYgcGNpYnJpZGdlX3ZlbmRvcnNbUENJX0JSSURHRV9WRU5ET1JfTUFYXSA9IHsKLQlJTlRFTF9WRU5ET1JfSUQsCi0JQVRJX1ZFTkRPUl9JRCwKLQlBTURfVkVORE9SX0lELAotCVNJU19WRU5ET1JfSUQKKwlQQ0lfVkVORE9SX0lEX0lOVEVMLAorCVBDSV9WRU5ET1JfSURfQVRJLAorCVBDSV9WRU5ET1JfSURfQU1ELAorCVBDSV9WRU5ET1JfSURfU0kKIH07CiAKIHN0YXRpYyBjb25zdCB1OCBhY190b19od3FbXSA9IHsKQEAgLTM5MCw3ICszOTAsNyBAQAogCXU4IGxpbmtjdHJsX3JlZzsKIAogCS8qTGluayBDb250cm9sIFJlZ2lzdGVyICovCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJcG9zID0gcGNpX3BjaWVfY2FwKHBkZXYpOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIHBvcyArIFBDSV9FWFBfTE5LQ1RMLCAmbGlua2N0cmxfcmVnKTsKIAlwY2lwcml2LT5uZGlzX2FkYXB0ZXIubGlua2N0cmxfcmVnID0gbGlua2N0cmxfcmVnOwogCkBAIC01ODEsNyArNTgxLDcgQEAKIAkJZmMgPSBydGxfZ2V0X2ZjKHNrYik7CiAJCWlmIChpZWVlODAyMTFfaXNfbnVsbGZ1bmMoZmMpKSB7CiAJCQlpZiAoaWVlZTgwMjExX2hhc19wbShmYykpIHsKLQkJCQlydGxwcml2LT5tYWM4MDIxMS5vZmZjaGFuX2RlbGV5ID0gdHJ1ZTsKKwkJCQlydGxwcml2LT5tYWM4MDIxMS5vZmZjaGFuX2RlbGF5ID0gdHJ1ZTsKIAkJCQlydGxwcml2LT5wc2Muc3RhdGVfaW5hcCA9IDE7CiAJCQl9IGVsc2UgewogCQkJCXJ0bHByaXYtPnBzYy5zdGF0ZV9pbmFwID0gMDsKQEAgLTYyMiwxMCArNjIyLDYwIEBACiAJaWYgKCgocnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbnBlcmlvZCArCiAJCXJ0bHByaXYtPmxpbmtfaW5mby5udW1fdHhfaW5wZXJpb2QpID4gOCkgfHwKIAkJKHJ0bHByaXYtPmxpbmtfaW5mby5udW1fcnhfaW5wZXJpb2QgPiAyKSkgewotCQlydGxfbHBzX2xlYXZlKGh3KTsKKwkJdGFza2xldF9zY2hlZHVsZSgmcnRscHJpdi0+d29ya3MuaXBzX2xlYXZlX3Rhc2tsZXQpOwogCX0KIH0KIAorc3RhdGljIHZvaWQgX3J0bF9yZWNlaXZlX29uZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gcnRsX2dldF9oZHIoc2tiKTsKKwlfX2xlMTYgZmMgPSBydGxfZ2V0X2ZjKHNrYik7CisJYm9vbCB1bmljYXN0ID0gZmFsc2U7CisJc3RydWN0IHNrX2J1ZmYgKnVza2IgPSBOVUxMOworCXU4ICpwZGF0YTsKKworCisJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCAmcnhfc3RhdHVzLCBzaXplb2Yocnhfc3RhdHVzKSk7CisKKwlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpIHsKKwkJOy8qVE9ETyovCisJfSBlbHNlIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkgeworCQk7LypUT0RPKi8KKwl9IGVsc2UgeworCQl1bmljYXN0ID0gdHJ1ZTsKKwkJcnRscHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3QgKz0gc2tiLT5sZW47CisJfQorCisJcnRsX2lzX3NwZWNpYWxfZGF0YShodywgc2tiLCBmYWxzZSk7CisKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGEoZmMpKSB7CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywgTEVEX0NUTF9SWCk7CisKKwkJaWYgKHVuaWNhc3QpCisJCQlydGxwcml2LT5saW5rX2luZm8ubnVtX3J4X2lucGVyaW9kKys7CisJfQorCisJLyogZm9yIHN3IGxwcyAqLworCXJ0bF9zd2xwc19iZWFjb24oaHcsICh2b2lkICopc2tiLT5kYXRhLCBza2ItPmxlbik7CisJcnRsX3JlY29nbml6ZV9wZWVyKGh3LCAodm9pZCAqKXNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCWlmICgocnRscHJpdi0+bWFjODAyMTEub3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSAmJgorCSAgICAocnRscHJpdi0+cnRsaGFsLmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSAmJgorCSAgICAgKGllZWU4MDIxMV9pc19iZWFjb24oZmMpIHx8IGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSkpCisJCXJldHVybjsKKworCWlmICh1bmxpa2VseSghcnRsX2FjdGlvbl9wcm9jKGh3LCBza2IsIGZhbHNlKSkpCisJCXJldHVybjsKKworCXVza2IgPSBkZXZfYWxsb2Nfc2tiKHNrYi0+bGVuICsgMTI4KTsKKwltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHVza2IpLCAmcnhfc3RhdHVzLCBzaXplb2Yocnhfc3RhdHVzKSk7CisJcGRhdGEgPSAodTggKilza2JfcHV0KHVza2IsIHNrYi0+bGVuKTsKKwltZW1jcHkocGRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJaWVlZTgwMjExX3J4X2lycXNhZmUoaHcsIHVza2IpOworfQorCiBzdGF0aWMgdm9pZCBfcnRsX3BjaV9yeF9pbnRlcnJ1cHQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwpAQCAtNjM3LDE4NyArNjg3LDExMiBAQAogCXU4IG93bjsKIAl1OCB0bXBfb25lOwogCXUzMiBidWZmZXJhZGRyZXNzOwotCWJvb2wgdW5pY2FzdCA9IGZhbHNlOwogCiAJc3RydWN0IHJ0bF9zdGF0cyBzdGF0cyA9IHsKIAkJLnNpZ25hbCA9IDAsCiAJCS5ub2lzZSA9IC05OCwKIAkJLnJhdGUgPSAwLAogCX07CisJaW50IGluZGV4ID0gcnRscGNpLT5yeF9yaW5nW3J4X3F1ZXVlX2lkeF0uaWR4OwogCiAJLypSWCBOT1JNQUwgUEtUICovCiAJd2hpbGUgKGNvdW50LS0pIHsKIAkJLypyeCBkZXNjcmlwdG9yICovCiAJCXN0cnVjdCBydGxfcnhfZGVzYyAqcGRlc2MgPSAmcnRscGNpLT5yeF9yaW5nW3J4X3F1ZXVlX2lkeF0uZGVzY1sKLQkJCQlydGxwY2ktPnJ4X3JpbmdbcnhfcXVldWVfaWR4XS5pZHhdOworCQkJCWluZGV4XTsKIAkJLypyeCBwa3QgKi8KIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ0bHBjaS0+cnhfcmluZ1tyeF9xdWV1ZV9pZHhdLnJ4X2J1ZlsKLQkJCQlydGxwY2ktPnJ4X3JpbmdbcnhfcXVldWVfaWR4XS5pZHhdOworCQkJCWluZGV4XTsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPSBOVUxMOwogCiAJCW93biA9ICh1OCkgcnRscHJpdi0+Y2ZnLT5vcHMtPmdldF9kZXNjKCh1OCAqKSBwZGVzYywKIAkJCQkJCSAgICAgICBmYWxzZSwgSFdfREVTQ19PV04pOwogCi0JCWlmIChvd24pIHsKLQkJCS8qd2FpdCBkYXRhIHRvIGJlIGZpbGxlZCBieSBoYXJkd2FyZSAqLwotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQkJCV9fbGUxNiBmYzsKLQkJCXN0cnVjdCBza19idWZmICpuZXdfc2tiID0gTlVMTDsKKwkJLyp3YWl0IGRhdGEgdG8gYmUgZmlsbGVkIGJ5IGhhcmR3YXJlICovCisJCWlmIChvd24pCisJCQlicmVhazsKIAotCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnF1ZXJ5X3J4X2Rlc2MoaHcsICZzdGF0cywKLQkJCQkJCQkgJnJ4X3N0YXR1cywKLQkJCQkJCQkgKHU4ICopIHBkZXNjLCBza2IpOworCQlydGxwcml2LT5jZmctPm9wcy0+cXVlcnlfcnhfZGVzYyhodywgJnN0YXRzLAorCQkJCQkJICZyeF9zdGF0dXMsCisJCQkJCQkgKHU4ICopIHBkZXNjLCBza2IpOwogCi0JCQlza2JfcHV0KHNrYiwgcnRscHJpdi0+Y2ZnLT5vcHMtPmdldF9kZXNjKCh1OCAqKSBwZGVzYywKLQkJCQkJCQkgZmFsc2UsCi0JCQkJCQkJIEhXX0RFU0NfUlhQS1RfTEVOKSk7Ci0JCQlza2JfcmVzZXJ2ZShza2IsCi0JCQkJICAgIHN0YXRzLnJ4X2RydmluZm9fc2l6ZSArIHN0YXRzLnJ4X2J1ZnNoaWZ0KTsKKwkJaWYgKHN0YXRzLmNyYyB8fCBzdGF0cy5od2Vycm9yKQorCQkJZ290byBkb25lOwogCi0JCQkvKgotCQkJICpOT1RJQ0UgVGhpcyBjYW4gbm90IGJlIHVzZSBmb3IgbWFjODAyMTEsCi0JCQkgKnRoaXMgaXMgZG9uZSBpbiBtYWM4MDIxMSBjb2RlLAotCQkJICppZiB5b3UgZG9uZSBoZXJlIHNlYyBESENQIHdpbGwgZmFpbAotCQkJICpza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNCk7Ci0JCQkgKi8KKwkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IocnRscGNpLT5yeGJ1ZmZlcnNpemUpOworCQlpZiAodW5saWtlbHkoIW5ld19za2IpKSB7CisJCQlSVF9UUkFDRShydGxwcml2LCAoQ09NUF9JTlRSIHwgQ09NUF9SRUNWKSwKKwkJCQkgREJHX0RNRVNHLAorCQkJCSAoImNhbid0IGFsbG9jIHNrYiBmb3IgcnhcbiIpKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQogCi0JCQloZHIgPSBydGxfZ2V0X2hkcihza2IpOwotCQkJZmMgPSBydGxfZ2V0X2ZjKHNrYik7CisJCXBjaV91bm1hcF9zaW5nbGUocnRscGNpLT5wZGV2LAorCQkJCSAqKChkbWFfYWRkcl90ICopIHNrYi0+Y2IpLAorCQkJCSBydGxwY2ktPnJ4YnVmZmVyc2l6ZSwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAotCQkJLyogdHJ5IGZvciBuZXcgYnVmZmVyIC0gaWYgYWxsb2NhdGlvbiBmYWlscywgZHJvcAotCQkJICogZnJhbWUgYW5kIHJldXNlIG9sZCBidWZmZXIKLQkJCSAqLwotCQkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IocnRscGNpLT5yeGJ1ZmZlcnNpemUpOwotCQkJaWYgKHVubGlrZWx5KCFuZXdfc2tiKSkgewotCQkJCVJUX1RSQUNFKHJ0bHByaXYsIChDT01QX0lOVFIgfCBDT01QX1JFQ1YpLAotCQkJCQkgREJHX0RNRVNHLAotCQkJCQkgKCJjYW4ndCBhbGxvYyBza2IgZm9yIHJ4XG4iKSk7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCQkJcGNpX3VubWFwX3NpbmdsZShydGxwY2ktPnBkZXYsCi0JCQkJCSAqKChkbWFfYWRkcl90ICopIHNrYi0+Y2IpLAotCQkJCQkgcnRscGNpLT5yeGJ1ZmZlcnNpemUsCi0JCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlza2JfcHV0KHNrYiwgcnRscHJpdi0+Y2ZnLT5vcHMtPmdldF9kZXNjKCh1OCAqKSBwZGVzYywgZmFsc2UsCisJCQlIV19ERVNDX1JYUEtUX0xFTikpOworCQlza2JfcmVzZXJ2ZShza2IsIHN0YXRzLnJ4X2RydmluZm9fc2l6ZSArIHN0YXRzLnJ4X2J1ZnNoaWZ0KTsKIAotCQkJaWYgKCFzdGF0cy5jcmMgfHwgIXN0YXRzLmh3ZXJyb3IpIHsKLQkJCQltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHNrYiksICZyeF9zdGF0dXMsCi0JCQkJICAgICAgIHNpemVvZihyeF9zdGF0dXMpKTsKKwkJLyoKKwkJICogTk9USUNFIFRoaXMgY2FuIG5vdCBiZSB1c2UgZm9yIG1hYzgwMjExLAorCQkgKiB0aGlzIGlzIGRvbmUgaW4gbWFjODAyMTEgY29kZSwKKwkJICogaWYgeW91IGRvbmUgaGVyZSBzZWMgREhDUCB3aWxsIGZhaWwKKwkJICogc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQpOworCQkgKi8KIAotCQkJCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkgewotCQkJCQk7LypUT0RPKi8KLQkJCQl9IGVsc2UgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKSB7Ci0JCQkJCTsvKlRPRE8qLwotCQkJCX0gZWxzZSB7Ci0JCQkJCXVuaWNhc3QgPSB0cnVlOwotCQkJCQlydGxwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCArPQotCQkJCQkgICAgc2tiLT5sZW47Ci0JCQkJfQorCQlfcnRsX3JlY2VpdmVfb25lKGh3LCBza2IsIHJ4X3N0YXR1cyk7CiAKLQkJCQlydGxfaXNfc3BlY2lhbF9kYXRhKGh3LCBza2IsIGZhbHNlKTsKKwkJaWYgKCgocnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbnBlcmlvZCArCisJCQlydGxwcml2LT5saW5rX2luZm8ubnVtX3R4X2lucGVyaW9kKSA+IDgpIHx8CisJCQkocnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbnBlcmlvZCA+IDIpKSB7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZydGxwcml2LT53b3Jrcy5pcHNfbGVhdmVfdGFza2xldCk7CisJCX0KIAotCQkJCWlmIChpZWVlODAyMTFfaXNfZGF0YShmYykpIHsKLQkJCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPmxlZF9jb250cm9sKGh3LAotCQkJCQkJCSAgICAgICBMRURfQ1RMX1JYKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJc2tiID0gbmV3X3NrYjsKIAotCQkJCQlpZiAodW5pY2FzdCkKLQkJCQkJCXJ0bHByaXYtPmxpbmtfaW5mby4KLQkJCQkJCSAgICBudW1fcnhfaW5wZXJpb2QrKzsKLQkJCQl9Ci0KLQkJCQkvKiBmb3Igc3cgbHBzICovCi0JCQkJcnRsX3N3bHBzX2JlYWNvbihodywgKHZvaWQgKilza2ItPmRhdGEsCi0JCQkJCQkgc2tiLT5sZW4pOwotCQkJCXJ0bF9yZWNvZ25pemVfcGVlcihodywgKHZvaWQgKilza2ItPmRhdGEsCi0JCQkJCQkgICBza2ItPmxlbik7Ci0JCQkJaWYgKChydGxwcml2LT5tYWM4MDIxMS5vcG1vZGUgPT0KLQkJCQkgICAgIE5MODAyMTFfSUZUWVBFX0FQKSAmJgotCQkJCSAgICAocnRscHJpdi0+cnRsaGFsLmN1cnJlbnRfYmFuZHR5cGUgPT0KLQkJCQkgICAgIEJBTkRfT05fMl80RykgJiYKLQkJCQkgICAgIChpZWVlODAyMTFfaXNfYmVhY29uKGZjKSB8fAotCQkJCSAgICAgaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoZmMpKSkgewotCQkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh1bmxpa2VseSghcnRsX2FjdGlvbl9wcm9jKGh3LCBza2IsCi0JCQkJCSAgICBmYWxzZSkpKSB7Ci0JCQkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnVza2IgPSBOVUxMOwotCQkJCQkJdTggKnBkYXRhOwotCQkJCQkJdXNrYiA9IGRldl9hbGxvY19za2Ioc2tiLT5sZW4KLQkJCQkJCQkJICAgICArIDEyOCk7Ci0JCQkJCQltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHVza2IpLAotCQkJCQkJICAgICAgICZyeF9zdGF0dXMsCi0JCQkJCQkgICAgICAgc2l6ZW9mKHJ4X3N0YXR1cykpOwotCQkJCQkJcGRhdGEgPSAodTggKilza2JfcHV0KHVza2IsCi0JCQkJCQkJc2tiLT5sZW4pOwotCQkJCQkJbWVtY3B5KHBkYXRhLCBza2ItPmRhdGEsCi0JCQkJCQkgICAgICAgc2tiLT5sZW4pOwotCQkJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQotCQkJCQkJaWVlZTgwMjExX3J4X2lycXNhZmUoaHcsIHVza2IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJfQotCi0JCQlpZiAoKChydGxwcml2LT5saW5rX2luZm8ubnVtX3J4X2lucGVyaW9kICsKLQkJCQlydGxwcml2LT5saW5rX2luZm8ubnVtX3R4X2lucGVyaW9kKSA+IDgpIHx8Ci0JCQkJKHJ0bHByaXYtPmxpbmtfaW5mby5udW1fcnhfaW5wZXJpb2QgPiAyKSkgewotCQkJCXJ0bF9scHNfbGVhdmUoaHcpOwotCQkJfQotCi0JCQlza2IgPSBuZXdfc2tiOwotCi0JCQlydGxwY2ktPnJ4X3JpbmdbcnhfcXVldWVfaWR4XS5yeF9idWZbcnRscGNpLT4KLQkJCQkJCQkgICAgIHJ4X3JpbmcKLQkJCQkJCQkgICAgIFtyeF9xdWV1ZV9pZHhdLgotCQkJCQkJCSAgICAgaWR4XSA9IHNrYjsKLQkJCSooKGRtYV9hZGRyX3QgKikgc2tiLT5jYikgPQorCQlydGxwY2ktPnJ4X3JpbmdbcnhfcXVldWVfaWR4XS5yeF9idWZbaW5kZXhdID0gc2tiOworCQkqKChkbWFfYWRkcl90ICopIHNrYi0+Y2IpID0KIAkJCSAgICBwY2lfbWFwX3NpbmdsZShydGxwY2ktPnBkZXYsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKIAkJCQkJICAgcnRscGNpLT5yeGJ1ZmZlcnNpemUsCiAJCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKLQkJfQogZG9uZToKIAkJYnVmZmVyYWRkcmVzcyA9ICgqKChkbWFfYWRkcl90ICopc2tiLT5jYikpOwogCQl0bXBfb25lID0gMTsKIAkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKCh1OCAqKSBwZGVzYywgZmFsc2UsCiAJCQkJCSAgICBIV19ERVNDX1JYQlVGRl9BRERSLAogCQkJCQkgICAgKHU4ICopJmJ1ZmZlcmFkZHJlc3MpOwotCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoKHU4ICopcGRlc2MsIGZhbHNlLCBIV19ERVNDX1JYT1dOLAotCQkJCQkgICAgKHU4ICopJnRtcF9vbmUpOwogCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoKHU4ICopcGRlc2MsIGZhbHNlLAogCQkJCQkgICAgSFdfREVTQ19SWFBLVF9MRU4sCiAJCQkJCSAgICAodTggKikmcnRscGNpLT5yeGJ1ZmZlcnNpemUpOwogCi0JCWlmIChydGxwY2ktPnJ4X3JpbmdbcnhfcXVldWVfaWR4XS5pZHggPT0KLQkJICAgIHJ0bHBjaS0+cnhyaW5nY291bnQgLSAxKQorCQlpZiAoaW5kZXggPT0gcnRscGNpLT5yeHJpbmdjb3VudCAtIDEpCiAJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2Rlc2MoKHU4ICopcGRlc2MsIGZhbHNlLAogCQkJCQkJICAgIEhXX0RFU0NfUlhFUk8sCiAJCQkJCQkgICAgKHU4ICopJnRtcF9vbmUpOwogCi0JCXJ0bHBjaS0+cnhfcmluZ1tyeF9xdWV1ZV9pZHhdLmlkeCA9Ci0JCSAgICAocnRscGNpLT5yeF9yaW5nW3J4X3F1ZXVlX2lkeF0uaWR4ICsgMSkgJQotCQkgICAgcnRscGNpLT5yeHJpbmdjb3VudDsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9kZXNjKCh1OCAqKXBkZXNjLCBmYWxzZSwgSFdfREVTQ19SWE9XTiwKKwkJCQkJICAgICh1OCAqKSZ0bXBfb25lKTsKKworCQlpbmRleCA9IChpbmRleCArIDEpICUgcnRscGNpLT5yeHJpbmdjb3VudDsKIAl9CiAKKwlydGxwY2ktPnJ4X3JpbmdbcnhfcXVldWVfaWR4XS5pZHggPSBpbmRleDsKIH0KIAogc3RhdGljIGlycXJldHVybl90IF9ydGxfcGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBkZXZfaWQ7CiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwotCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CiAJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBpbnRhID0gMDsKIAl1MzIgaW50YiA9IDA7CiAKLQlpZiAocnRscGNpLT5pcnFfZW5hYmxlZCA9PSAwKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MuaXJxX3RoX2xvY2ssIGZsYWdzKTsKIAogCS8qcmVhZCBJU1I6IDQvOGJ5dGVzICovCkBAIC05NDAsNiArOTE1LDExIEBACiAJX3J0bF9wY2lfdHhfY2hrX3dhaXRxKGh3KTsKIH0KIAorc3RhdGljIHZvaWQgX3J0bF9wY2lfaXBzX2xlYXZlX3Rhc2tsZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJcnRsX2xwc19sZWF2ZShodyk7Cit9CisKIHN0YXRpYyB2b2lkIF9ydGxfcGNpX3ByZXBhcmVfYmNuX3Rhc2tsZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwpAQCAtMTAzOCw2ICsxMDE4LDkgQEAKIAl0YXNrbGV0X2luaXQoJnJ0bHByaXYtPndvcmtzLmlycV9wcmVwYXJlX2Jjbl90YXNrbGV0LAogCQkgICAgICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlfcnRsX3BjaV9wcmVwYXJlX2Jjbl90YXNrbGV0LAogCQkgICAgICh1bnNpZ25lZCBsb25nKWh3KTsKKwl0YXNrbGV0X2luaXQoJnJ0bHByaXYtPndvcmtzLmlwc19sZWF2ZV90YXNrbGV0LAorCQkgICAgICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlfcnRsX3BjaV9pcHNfbGVhdmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylodyk7CiB9CiAKIHN0YXRpYyBpbnQgX3J0bF9wY2lfaW5pdF90eF9yaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMTUwNyw2ICsxNDkwLDcgQEAKIAogCXN5bmNocm9uaXplX2lycShydGxwY2ktPnBkZXYtPmlycSk7CiAJdGFza2xldF9raWxsKCZydGxwcml2LT53b3Jrcy5pcnFfdGFza2xldCk7CisJdGFza2xldF9raWxsKCZydGxwcml2LT53b3Jrcy5pcHNfbGVhdmVfdGFza2xldCk7CiAKIAlmbHVzaF93b3JrcXVldWUocnRscHJpdi0+d29ya3MucnRsX3dxKTsKIAlkZXN0cm95X3dvcmtxdWV1ZShydGxwcml2LT53b3Jrcy5ydGxfd3EpOwpAQCAtMTU4MSw2ICsxNTY1LDcgQEAKIAlzZXRfaGFsX3N0b3AocnRsaGFsKTsKIAogCXJ0bHByaXYtPmNmZy0+b3BzLT5kaXNhYmxlX2ludGVycnVwdChodyk7CisJdGFza2xldF9raWxsKCZydGxwcml2LT53b3Jrcy5pcHNfbGVhdmVfdGFza2xldCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jaywgZmxhZ3MpOwogCXdoaWxlIChwcHNjLT5yZmNoYW5nZV9pbnByb2dyZXNzKSB7CkBAIC0xNjI2LDYgKzE2MTEsMTYgQEAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDgsICZyZXZpc2lvbmlkKTsKIAlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCAweDNDLCAmaXJxbGluZSk7CiAKKwkvKiBQQ0kgSUQgMHgxMGVjOjB4ODE5MiBvY2N1cnMgZm9yIGJvdGggUlRMODE5MkUsIHdoaWNoIHVzZXMKKwkgKiByODE5MmVfcGNpLCBhbmQgUlRMODE5MlNFLCB3aGljaCB1c2VzIHRoaXMgZHJpdmVyLiBJZiB0aGUKKwkgKiByZXZpc2lvbiBJRCBpcyBSVExfUENJX1JFVklTSU9OX0lEXzgxOTJQQ0lFICgweDAxKSwgdGhlbgorCSAqIHRoZSBjb3JyZWN0IGRyaXZlciBpcyByODE5MmVfcGNpLCB0aHVzIHRoaXMgcm91dGluZSBzaG91bGQKKwkgKiByZXR1cm4gZmFsc2UuCisJICovCisJaWYgKGRldmljZWlkID09IFJUTF9QQ0lfODE5MlNFX0RJRCAmJgorCSAgICByZXZpc2lvbmlkID09IFJUTF9QQ0lfUkVWSVNJT05fSURfODE5MlBDSUUpCisJCXJldHVybiBmYWxzZTsKKwogCWlmIChkZXZpY2VpZCA9PSBSVExfUENJXzgxOTJfRElEIHx8CiAJICAgIGRldmljZWlkID09IFJUTF9QQ0lfMDA0NF9ESUQgfHwKIAkgICAgZGV2aWNlaWQgPT0gUlRMX1BDSV8wMDQ3X0RJRCB8fApAQCAtMTg1OCw3ICsxODUzLDggQEAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHgwNCwgMHgwNyk7CiAKIAkvKiBmaW5kIGFkYXB0ZXIgKi8KLQlfcnRsX3BjaV9maW5kX2FkYXB0ZXIocGRldiwgaHcpOworCWlmICghX3J0bF9wY2lfZmluZF9hZGFwdGVyKHBkZXYsIGh3KSkKKwkJZ290byBmYWlsMzsKIAogCS8qIEluaXQgSU8gaGFuZGxlciAqLwogCV9ydGxfcGNpX2lvX2hhbmRsZXJfaW5pdCgmcGRldi0+ZGV2LCBodyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuaAppbmRleCA2NzFiMWY1Li5jNTNjNjIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcGNpLmgKQEAgLTYyLDEyICs2Miw2IEBACiAJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsXAogCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkmKGNmZykKIAotI2RlZmluZSBJTlRFTF9WRU5ET1JfSUQJCQkJMHg4MDg2Ci0jZGVmaW5lIFNJU19WRU5ET1JfSUQJCQkJMHgxMDM5Ci0jZGVmaW5lIEFUSV9WRU5ET1JfSUQJCQkJMHgxMDAyCi0jZGVmaW5lIEFUSV9ERVZJQ0VfSUQJCQkJMHg3OTE0Ci0jZGVmaW5lIEFNRF9WRU5ET1JfSUQJCQkJMHgxMDIyCi0KICNkZWZpbmUgUENJX01BWF9CUklER0VfTlVNQkVSCQkJMjU1CiAjZGVmaW5lIFBDSV9NQVhfREVWSUNFUwkJCQkzMgogI2RlZmluZSBQQ0lfTUFYX0ZVTkNUSU9OCQkJOApAQCAtNzUsMTEgKzY5LDYgQEAKICNkZWZpbmUgUENJX0NPTkZfQUREUkVTUwkweDBDRjgJLypQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSBBZGRyZXNzICovCiAjZGVmaW5lIFBDSV9DT05GX0RBVEEJCTB4MENGQwkvKlBDSSBDb25maWd1cmF0aW9uIFNwYWNlIERhdGEgKi8KIAotI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX0RFVgkJMHgwNgotI2RlZmluZSBQQ0lfU1VCQ0xBU1NfQlJfUENJX1RPX1BDSQkweDA0Ci0jZGVmaW5lIFBDSV9DQVBBQklMSVRZX0lEX1BDSV9FWFBSRVNTCTB4MTAKLSNkZWZpbmUgUENJX0NBUF9JRF9FWFAJCQkweDEwCi0KICNkZWZpbmUgVTFET05UQ0FSRQkJCTB4RkYKICNkZWZpbmUgVTJET05UQ0FSRQkJCTB4RkZGRgogI2RlZmluZSBVNERPTlRDQVJFCQkJMHhGRkZGRkZGRgpAQCAtMTY5LDcgKzE1OCw2IEBACiAJYm9vbCBmaXJzdF9pbml0OwogCWJvb2wgYmVpbmdfaW5pdF9hZGFwdGVyOwogCWJvb2wgaW5pdF9yZWFkeTsKLQlib29sIGlycV9lbmFibGVkOwogCiAJLypUeCAqLwogCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgdHhfcmluZ1tSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BzLmMKaW5kZXggMzliMDI5Ny4uYTY5M2ZlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcHMuYwpAQCAtNjgsNiArNjgsNyBAQAogCiAJLyo8Mj4gRGlzYWJsZSBJbnRlcnJ1cHQgKi8KIAlydGxwcml2LT5jZmctPm9wcy0+ZGlzYWJsZV9pbnRlcnJ1cHQoaHcpOworCXRhc2tsZXRfa2lsbCgmcnRscHJpdi0+d29ya3MuaXJxX3Rhc2tsZXQpOwogCiAJLyo8Mz4gRGlzYWJsZSBBZGFwdGVyICovCiAJcnRscHJpdi0+Y2ZnLT5vcHMtPmh3X2Rpc2FibGUoaHcpOwpAQCAtNzgsNjUgKzc5LDE4IEBACiAKIGJvb2wgcnRsX3BzX3NldF9yZl9zdGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCSBlbnVtIHJmX3B3cnN0YXRlIHN0YXRlX3Rvc2V0LAotCQkJIHUzMiBjaGFuZ2Vzb3VyY2UsIGJvb2wgcHJvdGVjdF9vcl9ub3QpCisJCQkgdTMyIGNoYW5nZXNvdXJjZSkKIHsKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7Ci0JZW51bSByZl9wd3JzdGF0ZSBydHN0YXRlOwogCWJvb2wgYWN0aW9uYWxsb3dlZCA9IGZhbHNlOwotCXUxNiByZndhaXRfY250ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWc7Ci0KLQkvKnByb3RlY3Rfb3Jfbm90ID0gdHJ1ZTsgKi8KLQotCWlmIChwcm90ZWN0X29yX25vdCkKLQkJZ290byBub19wcm90ZWN0OwotCi0JLyoKLQkgKk9ubHkgb25lIHRocmVhZCBjYW4gY2hhbmdlCi0JICp0aGUgUkYgc3RhdGUgYXQgb25lIHRpbWUsIGFuZCBvdGhlcnMKLQkgKnNob3VsZCB3YWl0IHRvIGJlIGV4ZWN1dGVkLgotCSAqLwotCXdoaWxlICh0cnVlKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrLCBmbGFnKTsKLQkJaWYgKHBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2ssCi0JCQkJCSAgICAgICBmbGFnKTsKLQotCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19XQVJOSU5HLAotCQkJCSAoIlJGIENoYW5nZSBpbiBwcm9ncmVzcyEiCi0JCQkJICAiV2FpdCB0byBzZXQuLnN0YXRlX3Rvc2V0KCVkKS5cbiIsCi0JCQkJICBzdGF0ZV90b3NldCkpOwotCi0JCQkvKiBTZXQgUkYgYWZ0ZXIgdGhlIHByZXZpb3VzIGFjdGlvbiBpcyBkb25lLiAgKi8KLQkJCXdoaWxlIChwcHNjLT5yZmNoYW5nZV9pbnByb2dyZXNzKSB7Ci0JCQkJcmZ3YWl0X2NudCsrOwotCQkJCW1kZWxheSgxKTsKLQotCQkJCS8qCi0JCQkJICpXYWl0IHRvbyBsb25nLCByZXR1cm4gZmFsc2UgdG8gYXZvaWQKLQkJCQkgKnRvIGJlIHN0dWNrIGhlcmUuCi0JCQkJICovCi0JCQkJaWYgKHJmd2FpdF9jbnQgPiAxMDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MgPSB0cnVlOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jaywKLQkJCQkJICAgICAgIGZsYWcpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLW5vX3Byb3RlY3Q6Ci0JcnRzdGF0ZSA9IHBwc2MtPnJmcHdyX3N0YXRlOwogCiAJc3dpdGNoIChzdGF0ZV90b3NldCkgewogCWNhc2UgRVJGT046CiAJCXBwc2MtPnJmb2ZmX3JlYXNvbiAmPSAofmNoYW5nZXNvdXJjZSk7CiAKIAkJaWYgKChjaGFuZ2Vzb3VyY2UgPT0gUkZfQ0hBTkdFX0JZX0hXKSAmJgotCQkgICAgKHBwc2MtPmh3cmFkaW9vZmYgPT0gdHJ1ZSkpIHsKKwkJICAgIChwcHNjLT5od3JhZGlvb2ZmKSkgewogCQkJcHBzYy0+aHdyYWRpb29mZiA9IGZhbHNlOwogCQl9CiAKQEAgLTE3MiwxMiArMTI2LDYgQEAKIAlpZiAoYWN0aW9uYWxsb3dlZCkKIAkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9yZl9wb3dlcl9zdGF0ZShodywgc3RhdGVfdG9zZXQpOwogCi0JaWYgKCFwcm90ZWN0X29yX25vdCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jaywgZmxhZyk7Ci0JCXBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MgPSBmYWxzZTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jaywgZmxhZyk7Ci0JfQotCiAJcmV0dXJuIGFjdGlvbmFsbG93ZWQ7CiB9CiBFWFBPUlRfU1lNQk9MKHJ0bF9wc19zZXRfcmZfc3RhdGUpOwpAQCAtMjAwLDggKzE0OCw3IEBACiAJCX0KIAl9CiAKLQlydGxfcHNfc2V0X3JmX3N0YXRlKGh3LCBwcHNjLT5pbmFjdGl2ZV9wd3JzdGF0ZSwKLQkJCSAgICBSRl9DSEFOR0VfQllfSVBTLCBmYWxzZSk7CisJcnRsX3BzX3NldF9yZl9zdGF0ZShodywgcHBzYy0+aW5hY3RpdmVfcHdyc3RhdGUsIFJGX0NIQU5HRV9CWV9JUFMpOwogCiAJaWYgKHBwc2MtPmluYWN0aXZlX3B3cnN0YXRlID09IEVSRk9GRiAmJgogCSAgICBydGxoYWwtPmludGVyZmFjZSA9PSBJTlRGX1BDSSkgewpAQCAtMjg5LDEyICsyMzYsMTEgQEAKIAlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOwogCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOwogCWVudW0gcmZfcHdyc3RhdGUgcnRzdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKG1hYy0+b3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCXJldHVybjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5pcHNfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MuaXBzX2xvY2spOwogCiAJaWYgKHBwc2MtPmluYWN0aXZlcHMpIHsKIAkJcnRzdGF0ZSA9IHBwc2MtPnJmcHdyX3N0YXRlOwpAQCAtMzEwLDcgKzI1Niw3IEBACiAJCX0KIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcHNfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5pcHNfbG9jayk7CiB9CiAKIC8qZm9yIEZXIExQUyovCkBAIC00MjgsNyArMzc0LDYgQEAKIAlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOwogCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOwogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKLQl1bnNpZ25lZCBsb25nIGZsYWc7CiAKIAlpZiAoIXBwc2MtPmZ3Y3RybF9scHMpCiAJCXJldHVybjsKQEAgLTQ0OSw3ICszOTQsNyBAQAogCWlmIChtYWMtPmxpbmtfc3RhdGUgIT0gTUFDODAyMTFfTElOS0VEKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MubHBzX2xvY2ssIGZsYWcpOworCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MubHBzX2xvY2spOwogCiAJLyogSWRsZSBmb3IgYSB3aGlsZSBpZiB3ZSBjb25uZWN0IHRvIEFQIGEgd2hpbGUgYWdvLiAqLwogCWlmIChtYWMtPmNudF9hZnRlcl9saW5rZWQgPj0gMikgewpAQCAtNDYxLDcgKzQwNiw3IEBACiAJCX0KIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jaywgZmxhZyk7CisJc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLmxwc19sb2NrKTsKIH0KIAogLypMZWF2ZSB0aGUgbGVpc3VyZSBwb3dlciBzYXZlIG1vZGUuKi8KQEAgLTQ3MCw5ICs0MTUsOCBAQAogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKIAlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jaywgZmxhZyk7CisJc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CiAKIAlpZiAocHBzYy0+ZndjdHJsX2xwcykgewogCQlpZiAocHBzYy0+ZG90MTFfcHNtb2RlICE9IEVBQ1RJVkUpIHsKQEAgLTQ5Myw3ICs0MzcsNyBAQAogCQkJcnRsX2xwc19zZXRfcHNtb2RlKGh3LCBFQUNUSVZFKTsKIAkJfQogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jaywgZmxhZyk7CisJc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLmxwc19sb2NrKTsKIH0KIAogLyogRm9yIHN3IExQUyovCkBAIC01ODIsNyArNTI2LDYgQEAKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CiAJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKLQl1bnNpZ25lZCBsb25nIGZsYWc7CiAKIAlpZiAoIXJ0bHByaXYtPnBzYy5zd2N0cmxfbHBzKQogCQlyZXR1cm47CkBAIC01OTUsOSArNTM4LDkgQEAKIAkJUlRfQ0xFQVJfUFNfTEVWRUwocHBzYywgUlRfUFNfTEVWRUxfQVNQTSk7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLmxwc19sb2NrLCBmbGFnKTsKLQlydGxfcHNfc2V0X3JmX3N0YXRlKGh3LCBFUkZPTiwgUkZfQ0hBTkdFX0JZX1BTLCBmYWxzZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MubHBzX2xvY2ssIGZsYWcpOworCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MubHBzX2xvY2spOworCXJ0bF9wc19zZXRfcmZfc3RhdGUoaHcsIEVSRk9OLCBSRl9DSEFOR0VfQllfUFMpOworCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CiB9CiAKIHZvaWQgcnRsX3N3bHBzX3Jmb25fd3FfY2FsbGJhY2sodm9pZCAqZGF0YSkKQEAgLTYxNCw3ICs1NTcsNiBAQAogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOwogCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAl1OCBzbGVlcF9pbnR2OwogCiAJaWYgKCFydGxwcml2LT5wc2Muc3dfcHNfZW5hYmxlZCkKQEAgLTYzMSwxNiArNTczLDkgQEAKIAlpZiAocnRscHJpdi0+bGlua19pbmZvLmJ1c3l0cmFmZmljKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jaywgZmxhZyk7Ci0JaWYgKHJ0bHByaXYtPnBzYy5yZmNoYW5nZV9pbnByb2dyZXNzKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2ssIGZsYWcpOwotCQlyZXR1cm47Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2ssIGZsYWcpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLmxwc19sb2NrLCBmbGFnKTsKLQlydGxfcHNfc2V0X3JmX3N0YXRlKGh3LCBFUkZTTEVFUCwgUkZfQ0hBTkdFX0JZX1BTLCBmYWxzZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MubHBzX2xvY2ssIGZsYWcpOworCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MubHBzX2xvY2spOworCXJ0bF9wc19zZXRfcmZfc3RhdGUoaHcsIEVSRlNMRUVQLCBSRl9DSEFOR0VfQllfUFMpOworCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CiAKIAlpZiAocHBzYy0+cmVnX3JmcHNfbGV2ZWwgJiBSVF9SRl9PRkZfTEVWTF9BU1BNICYmCiAJCSFSVF9JTl9QU19MRVZFTChwcHNjLCBSVF9QU19MRVZFTF9BU1BNKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wcy5oCmluZGV4IGUzYmY4OTguLjg0NjI4ZTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wcy5oCkBAIC0zMyw4ICszMyw3IEBACiAjZGVmaW5lIE1BWF9TV19MUFNfU0xFRVBfSU5UVgk1CiAKIGJvb2wgcnRsX3BzX3NldF9yZl9zdGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSBlbnVtIHJmX3B3cnN0YXRlIHN0YXRlX3Rvc2V0LCB1MzIgY2hhbmdlc291cmNlLAotCQkJIGJvb2wgcHJvdGVjdF9vcl9ub3QpOworCQkJIGVudW0gcmZfcHdyc3RhdGUgc3RhdGVfdG9zZXQsIHUzMiBjaGFuZ2Vzb3VyY2UpOwogYm9vbCBydGxfcHNfZW5hYmxlX25pYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiBib29sIHJ0bF9wc19kaXNhYmxlX25pYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiB2b2lkIHJ0bF9pcHNfbmljX29mZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3JjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3JjLmMKaW5kZXggMzBkYTY4YS4uNTM5ZGY2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9yYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcmMuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJaWYgKHN0YSkgewogCQkvKiBDaGVjayBpZiBhZ2dyZWdhdGlvbiBoYXMgdG8gYmUgZW5hYmxlZCBmb3IgdGhpcyB0aWQgKi8KIAkJc3RhX2VudHJ5ID0gKHN0cnVjdCBydGxfc3RhX2luZm8gKikgc3RhLT5kcnZfcHJpdjsKLQkJaWYgKChzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQgPT0gdHJ1ZSkgJiYKKwkJaWYgKChzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQpICYmCiAJCQkJIShza2ItPnByb3RvY29sID09IGNwdV90b19iZTE2KEVUSF9QX1BBRSkpKSB7CiAJCQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgewogCQkJCXU4IHRpZCA9IHJ0bF9nZXRfdGlkKHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3JlZ2QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcmVnZC5jCmluZGV4IDhmNjcxOGYuLjlmZWRiMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcmVnZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcmVnZC5jCkBAIC0zMDMsMjIgKzMwMyw2IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBfcnRsX2R1bXBfY2hhbm5lbF9tYXAoc3RydWN0IHdpcGh5ICp3aXBoeSkKLXsKLQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoYmFuZCA9IDA7IGJhbmQgPCBJRUVFODAyMTFfTlVNX0JBTkRTOyBiYW5kKyspIHsKLQkJaWYgKCF3aXBoeS0+YmFuZHNbYmFuZF0pCi0JCQljb250aW51ZTsKLQkJc2JhbmQgPSB3aXBoeS0+YmFuZHNbYmFuZF07Ci0JCWZvciAoaSA9IDA7IGkgPCBzYmFuZC0+bl9jaGFubmVsczsgaSsrKQotCQkJY2ggPSAmc2JhbmQtPmNoYW5uZWxzW2ldOwotCX0KLX0KLQogc3RhdGljIGludCBfcnRsX3JlZ19ub3RpZmllcl9hcHBseShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgIHN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKnJlcXVlc3QsCiAJCQkJICAgc3RydWN0IHJ0bF9yZWd1bGF0b3J5ICpyZWcpCkBAIC0zMzYsOCArMzIwLDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JX3J0bF9kdW1wX2NoYW5uZWxfbWFwKHdpcGh5KTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2RtX2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9kbV9jb21tb24uYwppbmRleCA5NzE4MzgyLi5hMDA3NzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2RtX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZG1fY29tbW9uLmMKQEAgLTQ3NCw3ICs0NzQsNyBAQAogewogCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CiAKLQlpZiAobWFjLT5hY3Rfc2Nhbm5pbmcgPT0gdHJ1ZSkKKwlpZiAobWFjLT5hY3Rfc2Nhbm5pbmcpCiAJCXJldHVybjsKIAogCWlmIChtYWMtPmxpbmtfc3RhdGUgPj0gTUFDODAyMTFfTElOS0VEKQpAQCAtNjcwLDcgKzY3MCw3IEBACiAJdTggb2ZkbV9pbmRleFsyXSwgY2NrX2luZGV4ID0gMCwgb2ZkbV9pbmRleF9vbGRbMl0sIGNja19pbmRleF9vbGQgPSAwOwogCWludCBpOwogCWJvb2wgaXMydCA9IElTXzkyQ19TRVJJQUwocnRsaGFsLT52ZXJzaW9uKTsKLQl1OCB0eHB3cl9sZXZlbFsyXSA9IHswLCAwfTsKKwlzOCB0eHB3cl9sZXZlbFsyXSA9IHswLCAwfTsKIAl1OCBvZmRtX21pbl9pbmRleCA9IDYsIHJmOwogCiAJcnRscHJpdi0+ZG0udHhwb3dlcl90cmFja2luZ2luaXQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmMKaW5kZXggNTAzMDNlMS4uNDlhMDY0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5jCkBAIC0yNyw2ICsyNyw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgIi4uL3dpZmkuaCIKICNpbmNsdWRlICIuLi9wY2kuaCIKQEAgLTIyNCw4ICsyMjYsNyBAQAogCXUzMiBmd3NpemU7CiAJZW51bSB2ZXJzaW9uXzgxOTJjIHZlcnNpb24gPSBydGxoYWwtPnZlcnNpb247CiAKLQlwcmludGsoS0VSTl9JTkZPICJydGw4MTkyYzogTG9hZGluZyBmaXJtd2FyZSBmaWxlICVzXG4iLAotCSAgICAgICBydGxwcml2LT5jZmctPmZ3X25hbWUpOworCXByX2luZm8oIkxvYWRpbmcgZmlybXdhcmUgZmlsZSAlc1xuIiwgcnRscHJpdi0+Y2ZnLT5md19uYW1lKTsKIAlpZiAoIXJ0bGhhbC0+cGZpcm13YXJlKQogCQlyZXR1cm4gMTsKIApAQCAtNTQ2LDcgKzU0Nyw2IEBACiAJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKIAlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nOwogCXN0cnVjdCBydGxfdHhfZGVzYyAqcGRlc2M7Ci0JdTggb3duOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHNrX2J1ZmYgKnBza2IgPSBOVUxMOwogCkBAIC01NTksNyArNTU5LDYgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MuaXJxX3RoX2xvY2ssIGZsYWdzKTsKIAogCXBkZXNjID0gJnJpbmctPmRlc2NbMF07Ci0Jb3duID0gKHU4KSBydGxwcml2LT5jZmctPm9wcy0+Z2V0X2Rlc2MoKHU4ICopIHBkZXNjLCB0cnVlLCBIV19ERVNDX09XTik7CiAKIAlydGxwcml2LT5jZmctPm9wcy0+ZmlsbF90eF9jbWRkZXNjKGh3LCAodTggKikgcGRlc2MsIDEsIDEsIHNrYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvcGh5X2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9waHlfY29tbW9uLmMKaW5kZXggZDJjYzgxNS4uM2IxMTY0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9waHlfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9waHlfY29tbW9uLmMKQEAgLTEyNTMsMTAgKzEyNTMsOSBAQAogCiAJY29uc3QgdTMyIHJldHJ5Y291bnQgPSAyOwogCi0JdTMyIGJidmFsdWU7Ci0KIAlpZiAodCA9PSAwKSB7Ci0JCWJidmFsdWUgPSBydGxfZ2V0X2JicmVnKGh3LCAweDgwMCwgTUFTS0RXT1JEKTsKKwkJLyogZHVtbXkgcmVhZCAqLworCQlydGxfZ2V0X2JicmVnKGh3LCAweDgwMCwgTUFTS0RXT1JEKTsKIAogCQlfcnRsOTJjX3BoeV9zYXZlX2FkZGFfcmVnaXN0ZXJzKGh3LCBhZGRhX3JlZywKIAkJCQkJCXJ0bHBoeS0+YWRkYV9iYWNrdXAsIDE2KTsKQEAgLTE3NjIsOCArMTc2MSw3IEBACiAJbG9uZyByZXN1bHRbNF1bOF07CiAJdTggaSwgZmluYWxfY2FuZGlkYXRlOwogCWJvb2wgcGF0aGFfb2ssIHBhdGhiX29rOwotCWxvbmcgcmVnX2U5NCwgcmVnX2U5YywgcmVnX2VhNCwgcmVnX2VhYywgcmVnX2ViNCwgcmVnX2ViYywgcmVnX2VjNCwKLQkgICAgcmVnX2VjYywgcmVnX3RtcCA9IDA7CisJbG9uZyByZWdfZTk0LCByZWdfZTljLCByZWdfZWE0LCByZWdfZWI0LCByZWdfZWJjLCByZWdfZWM0LCByZWdfdG1wID0gMDsKIAlib29sIGlzMTJzaW11bGFyLCBpczEzc2ltdWxhciwgaXMyM3NpbXVsYXI7CiAJYm9vbCBzdGFydF9jb250dHggPSBmYWxzZSwgc2luZ2xldG9uZSA9IGZhbHNlOwogCXUzMiBpcWtfYmJfcmVnWzEwXSA9IHsKQEAgLTE4NDEsMjEgKzE4MzksMTcgQEAKIAkJcmVnX2U5NCA9IHJlc3VsdFtpXVswXTsKIAkJcmVnX2U5YyA9IHJlc3VsdFtpXVsxXTsKIAkJcmVnX2VhNCA9IHJlc3VsdFtpXVsyXTsKLQkJcmVnX2VhYyA9IHJlc3VsdFtpXVszXTsKIAkJcmVnX2ViNCA9IHJlc3VsdFtpXVs0XTsKIAkJcmVnX2ViYyA9IHJlc3VsdFtpXVs1XTsKIAkJcmVnX2VjNCA9IHJlc3VsdFtpXVs2XTsKLQkJcmVnX2VjYyA9IHJlc3VsdFtpXVs3XTsKIAl9CiAJaWYgKGZpbmFsX2NhbmRpZGF0ZSAhPSAweGZmKSB7CiAJCXJ0bHBoeS0+cmVnX2U5NCA9IHJlZ19lOTQgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVswXTsKIAkJcnRscGh5LT5yZWdfZTljID0gcmVnX2U5YyA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzFdOwogCQlyZWdfZWE0ID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bMl07Ci0JCXJlZ19lYWMgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVszXTsKIAkJcnRscGh5LT5yZWdfZWI0ID0gcmVnX2ViNCA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzRdOwogCQlydGxwaHktPnJlZ19lYmMgPSByZWdfZWJjID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNV07CiAJCXJlZ19lYzQgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs2XTsKLQkJcmVnX2VjYyA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzddOwogCQlwYXRoYV9vayA9IHBhdGhiX29rID0gdHJ1ZTsKIAl9IGVsc2UgewogCQlydGxwaHktPnJlZ19lOTQgPSBydGxwaHktPnJlZ19lYjQgPSAweDEwMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9ody5jCmluZGV4IGRlZmI0MzcuLmEzZGVhZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvaHcuYwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAJY2FzZSBIV19WQVJfQ09SUkVDVF9UU0Y6ewogCQkJdTggYnR5cGVfaWJzcyA9ICgodTggKikgKHZhbCkpWzBdOwogCi0JCQlpZiAoYnR5cGVfaWJzcyA9PSB0cnVlKQorCQkJaWYgKGJ0eXBlX2lic3MpCiAJCQkJX3J0bDkyY2Vfc3RvcF90eF9iZWFjb24oaHcpOwogCiAJCQlfcnRsOTJjZV9zZXRfYmNuX2N0cmxfcmVnKGh3LCAwLCBCSVQoMykpOwpAQCAtNTAwLDcgKzUwMCw3IEBACiAKIAkJCV9ydGw5MmNlX3NldF9iY25fY3RybF9yZWcoaHcsIEJJVCgzKSwgMCk7CiAKLQkJCWlmIChidHlwZV9pYnNzID09IHRydWUpCisJCQlpZiAoYnR5cGVfaWJzcykKIAkJCQlfcnRsOTJjZV9yZXN1bWVfdHhfYmVhY29uKGh3KTsKIAogCQkJYnJlYWs7CkBAIC03NjMsMTEgKzc2Myw5IEBACiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwogCXN0cnVjdCBydGxfcGNpX3ByaXYgKnJ0bHBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CiAJdTggcmVnX2J3X29wbW9kZTsKLQl1MzIgcmVnX3JhdHIsIHJlZ19wcnNyOworCXUzMiByZWdfcHJzcjsKIAogCXJlZ19id19vcG1vZGUgPSBCV19PUE1PREVfMjBNSFo7Ci0JcmVnX3JhdHIgPSBSQVRFX0FMTF9DQ0sgfCBSQVRFX0FMTF9PRkRNX0FHIHwKLQkgICAgUkFURV9BTExfT0ZETV8xU1MgfCBSQVRFX0FMTF9PRkRNXzJTUzsKIAlyZWdfcHJzciA9IFJBVEVfQUxMX0NDSyB8IFJBVEVfQUxMX09GRE1fQUc7CiAKIAlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfSU5JUlRTX1JBVEVfU0VMLCAweDgpOwpAQCAtMTEyMyw3ICsxMTIxLDcgQEAKIAlpZiAocnRscHJpdi0+cHNjLnJmcHdyX3N0YXRlICE9IEVSRk9OKQogCQlyZXR1cm47CiAKLQlpZiAoY2hlY2tfYnNzaWQgPT0gdHJ1ZSkgeworCWlmIChjaGVja19ic3NpZCkgewogCQlyZWdfcmNyIHw9IChSQ1JfQ0JTU0lEX0RBVEEgfCBSQ1JfQ0JTU0lEX0JDTik7CiAJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfUkNSLAogCQkJCQkgICAgICAodTggKikgKCZyZWdfcmNyKSk7CkBAIC0xMTg1LDcgKzExODMsNiBAQAogCiAJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19ISU1SLCBydGxwY2ktPmlycV9tYXNrWzBdICYgMHhGRkZGRkZGRik7CiAJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19ISU1SRSwgcnRscGNpLT5pcnFfbWFza1sxXSAmIDB4RkZGRkZGRkYpOwotCXJ0bHBjaS0+aXJxX2VuYWJsZWQgPSB0cnVlOwogfQogCiB2b2lkIHJ0bDkyY2VfZGlzYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCkBAIC0xMTk1LDcgKzExOTIsNyBAQAogCiAJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19ISU1SLCBJTVI4MTkwX0RJU0FCTEVEKTsKIAlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0hJTVJFLCBJTVI4MTkwX0RJU0FCTEVEKTsKLQlydGxwY2ktPmlycV9lbmFibGVkID0gZmFsc2U7CisJc3luY2hyb25pemVfaXJxKHJ0bHBjaS0+cGRldi0+aXJxKTsKIH0KIAogc3RhdGljIHZvaWQgX3J0bDkyY2VfcG93ZXJvZmZfYWRhcHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKQEAgLTE1ODYsNyArMTU4Myw3IEBACiAJCXJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZyA9IGZhbHNlOwogCX0KIAotCWlmIChydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcgPT0gdHJ1ZSkKKwlpZiAocnRsZWZ1c2UtPmF1dG9sb2FkX2ZhaWxmbGFnKQogCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKSB7CkBAIC0xNTk1LDcgKzE1OTIsNyBAQAogCX0KIAogCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0RNRVNHLAotCQkgKE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhydGxlZnVzZS0+ZGV2X2FkZHIpKSk7CisJCSAoIiVwTVxuIiwgcnRsZWZ1c2UtPmRldl9hZGRyKSk7CiAKIAlfcnRsOTJjZV9yZWFkX3R4cG93ZXJfaW5mb19mcm9tX2h3cGcoaHcsCiAJCQkJCSAgICAgcnRsZWZ1c2UtPmF1dG9sb2FkX2ZhaWxmbGFnLApAQCAtMTk2OSw3ICsxOTY2LDcgQEAKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CiAJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKLQllbnVtIHJmX3B3cnN0YXRlIGVfcmZwb3dlcnN0YXRlX3Rvc2V0LCBjdXJfcmZzdGF0ZTsKKwllbnVtIHJmX3B3cnN0YXRlIGVfcmZwb3dlcnN0YXRlX3Rvc2V0OwogCXU4IHUxdG1wOwogCWJvb2wgYWN0dWFsbHlzZXQgPSBmYWxzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWc7CkBAIC0xOTg5LDE1ICsxOTg2LDEzIEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2ssIGZsYWcpOwogCX0KIAotCWN1cl9yZnN0YXRlID0gcHBzYy0+cmZwd3Jfc3RhdGU7Ci0KIAlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTUFDX1BJTk1VWF9DRkcsIHJ0bF9yZWFkX2J5dGUocnRscHJpdiwKIAkJICAgICAgIFJFR19NQUNfUElOTVVYX0NGRykmfihCSVQoMykpKTsKIAogCXUxdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfR1BJT19JT19TRUwpOwogCWVfcmZwb3dlcnN0YXRlX3Rvc2V0ID0gKHUxdG1wICYgQklUKDMpKSA/IEVSRk9OIDogRVJGT0ZGOwogCi0JaWYgKChwcHNjLT5od3JhZGlvb2ZmID09IHRydWUpICYmIChlX3JmcG93ZXJzdGF0ZV90b3NldCA9PSBFUkZPTikpIHsKKwlpZiAoKHBwc2MtPmh3cmFkaW9vZmYpICYmIChlX3JmcG93ZXJzdGF0ZV90b3NldCA9PSBFUkZPTikpIHsKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX0RNRVNHLAogCQkJICgiR1BJT0NoYW5nZVJGICAtIEhXIFJhZGlvIE9OLCBSRiBPTlxuIikpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL2xlZC5jCmluZGV4IDlkZDFlZDcuLjI4YTFhNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL2xlZC5jCkBAIC04NCw3ICs4NCw3IEBACiAJCWJyZWFrOwogCWNhc2UgTEVEX1BJTl9MRUQwOgogCQlsZWRjZmcgJj0gMHhmMDsKLQkJaWYgKHBjaXByaXYtPmxlZGN0bC5sZWRfb3BlbmRyYWluID09IHRydWUpCisJCWlmIChwY2lwcml2LT5sZWRjdGwubGVkX29wZW5kcmFpbikKIAkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19MRURDRkcyLAogCQkJCSAgICAgICAobGVkY2ZnIHwgQklUKDEpIHwgQklUKDUpIHwgQklUKDYpKSk7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvcGh5LmMKaW5kZXggYWJlMGZjYy4uNTkyYTEwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvcGh5LmMKQEAgLTQ2LDEzICs0NiwxMiBAQAogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAl1MzIgb3JpZ2luYWxfdmFsdWUsIHJlYWRiYWNrX3ZhbHVlLCBiaXRzaGlmdDsKIAlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlSVF9UUkFDRShydGxwcml2LCBDT01QX1JGLCBEQkdfVFJBQ0UsICgicmVnYWRkciglI3gpLCAiCiAJCQkJCSAgICAgICAicmZwYXRoKCUjeCksIGJpdG1hc2soJSN4KVxuIiwKIAkJCQkJICAgICAgIHJlZ2FkZHIsIHJmcGF0aCwgYml0bWFzaykpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLnJmX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnJ0bHByaXYtPmxvY2tzLnJmX2xvY2spOwogCiAJaWYgKHJ0bHBoeS0+cmZfbW9kZSAhPSBSRl9PUF9CWV9GVykgewogCQlvcmlnaW5hbF92YWx1ZSA9IF9ydGw5MmNfcGh5X3JmX3NlcmlhbF9yZWFkKGh3LApAQCAtNjUsNyArNjQsNyBAQAogCWJpdHNoaWZ0ID0gX3J0bDkyY19waHlfY2FsY3VsYXRlX2JpdF9zaGlmdChiaXRtYXNrKTsKIAlyZWFkYmFja192YWx1ZSA9IChvcmlnaW5hbF92YWx1ZSAmIGJpdG1hc2spID4+IGJpdHNoaWZ0OwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MucmZfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9sb2NrKTsKIAogCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19UUkFDRSwKIAkJICgicmVnYWRkciglI3gpLCByZnBhdGgoJSN4KSwgIgpAQCAtMTIwLDEzICsxMTksMTIgQEAKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKIAl1MzIgb3JpZ2luYWxfdmFsdWUsIGJpdHNoaWZ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlSVF9UUkFDRShydGxwcml2LCBDT01QX1JGLCBEQkdfVFJBQ0UsCiAJCSAoInJlZ2FkZHIoJSN4KSwgYml0bWFzayglI3gpLCBkYXRhKCUjeCksIHJmcGF0aCglI3gpXG4iLAogCQkgIHJlZ2FkZHIsIGJpdG1hc2ssIGRhdGEsIHJmcGF0aCkpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLnJmX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnJ0bHByaXYtPmxvY2tzLnJmX2xvY2spOwogCiAJaWYgKHJ0bHBoeS0+cmZfbW9kZSAhPSBSRl9PUF9CWV9GVykgewogCQlpZiAoYml0bWFzayAhPSBSRlJFR19PRkZTRVRfTUFTSykgewpAQCAtMTUzLDcgKzE1MSw3IEBACiAJCV9ydGw5MmNfcGh5X2Z3X3JmX3NlcmlhbF93cml0ZShodywgcmZwYXRoLCByZWdhZGRyLCBkYXRhKTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5yZl9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLnJmX2xvY2spOwogCiAJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX1RSQUNFLCAoInJlZ2FkZHIoJSN4KSwgIgogCQkJCQkgICAgICAgImJpdG1hc2soJSN4KSwgZGF0YSglI3gpLCAiCkBAIC0yODEsNyArMjc5LDYgQEAKIHsKIAogCWludCBpOwotCWJvb2wgcnRzdGF0dXMgPSB0cnVlOwogCXUzMiAqcmFkaW9hX2FycmF5X3RhYmxlOwogCXUzMiAqcmFkaW9iX2FycmF5X3RhYmxlOwogCXUxNiByYWRpb2FfYXJyYXlsZW4sIHJhZGlvYl9hcnJheWxlbjsKQEAgLTMwOCw3ICszMDUsNiBAQAogCQkJICgiUmFkaW9fQjpSVEw4MTkyQ0VfUkFESU9CXzFUQVJSQVlcbiIpKTsKIAl9CiAJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsICgiUmFkaW8gTm8gJXhcbiIsIHJmcGF0aCkpOwotCXJ0c3RhdHVzID0gdHJ1ZTsKIAlzd2l0Y2ggKHJmcGF0aCkgewogCWNhc2UgUkY5MF9QQVRIX0E6CiAJCWZvciAoaSA9IDA7IGkgPCByYWRpb2FfYXJyYXlsZW47IGkgPSBpICsgMikgewpAQCAtNTIxLDcgKzUxNyw2IEBACiAJdTggaSwgcXVldWVfaWQ7CiAJc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZyA9IE5VTEw7CiAKLQlwcHNjLT5zZXRfcmZwb3dlcnN0YXRlX2lucHJvZ3Jlc3MgPSB0cnVlOwogCXN3aXRjaCAocmZwd3Jfc3RhdGUpIHsKIAljYXNlIEVSRk9OOnsKIAkJCWlmICgocHBzYy0+cmZwd3Jfc3RhdGUgPT0gRVJGT0ZGKSAmJgpAQCAtNjE3LDcgKzYxMiw2IEBACiAJfQogCWlmIChicmVzdWx0KQogCQlwcHNjLT5yZnB3cl9zdGF0ZSA9IHJmcHdyX3N0YXRlOwotCXBwc2MtPnNldF9yZnBvd2Vyc3RhdGVfaW5wcm9ncmVzcyA9IGZhbHNlOwogCXJldHVybiBicmVzdWx0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9yZWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3JlZy5oCmluZGV4IDU5OGNlY2MuLmJhNWZmMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3JlZy5oCkBAIC0xMDc0LDEwICsxMDc0LDEwIEBACiAjZGVmaW5lIF9TUkwoeCkJCQkJCSgoKHgpICYgMHgzRikgPDwgOCkKIAogI2RlZmluZSBfU0lGU19DQ0tfQ1RYKHgpCQkJKCh4KSAmIDB4RkYpCi0jZGVmaW5lIF9TSUZTX0NDS19UUlgoeCkJCQkoKCh4KSAmIDB4RkYpIDw8IDgpOworI2RlZmluZSBfU0lGU19DQ0tfVFJYKHgpCQkJKCgoeCkgJiAweEZGKSA8PCA4KQogCiAjZGVmaW5lIF9TSUZTX09GRE1fQ1RYKHgpCQkJKCh4KSAmIDB4RkYpCi0jZGVmaW5lIF9TSUZTX09GRE1fVFJYKHgpCQkJKCgoeCkgJiAweEZGKSA8PCA4KTsKKyNkZWZpbmUgX1NJRlNfT0ZETV9UUlgoeCkJCQkoKCh4KSAmIDB4RkYpIDw8IDgpCiAKICNkZWZpbmUgX1RCVFRfUFJPSElCSVRfSE9MRCh4KQkJCSgoKHgpICYgMHhGRikgPDwgOCkKIApAQCAtMTIwMyw3ICsxMjAzLDkgQEAKICNkZWZpbmUgRVBST01fQ01EX0NPTkZJRwkJCTB4MwogI2RlZmluZSBFUFJPTV9DTURfTE9BRAkJCQkxCiAKKyNkZWZpbmUgSFdTRVRfTUFYX1NJWkUJCQkJMTI4CiAjZGVmaW5lCUhXU0VUX01BWF9TSVpFXzkyUwkJCUhXU0VUX01BWF9TSVpFCisjZGVmaW5lIEVGVVNFX01BWF9TRUNUSU9OCQkJMTYKIAogI2RlZmluZQlXTF9IV1BETl9FTgkJCQlCSVQoMCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvcmYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3JmLmMKaW5kZXggOTBkMGYyYy4uZDNiMDFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvcmYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9yZi5jCkBAIC03Niw3ICs3Niw3IEBACiAJaWYgKHJ0bGVmdXNlLT5lZXByb21fcmVndWxhdG9yeSAhPSAwKQogCQl0dXJib19zY2Fub2ZmID0gdHJ1ZTsKIAotCWlmIChtYWMtPmFjdF9zY2FubmluZyA9PSB0cnVlKSB7CisJaWYgKG1hYy0+YWN0X3NjYW5uaW5nKSB7CiAJCXR4X2FnY1tSRjkwX1BBVEhfQV0gPSAweDNmM2YzZjNmOwogCQl0eF9hZ2NbUkY5MF9QQVRIX0JdID0gMHgzZjNmM2YzZjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvdHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS90cnguYwppbmRleCA1NGIyYmQ1Li4yMzBiYmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS90cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS90cnguYwpAQCAtMjI1LDcgKzIyNSw3IEBACiB7CiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwogCXN0cnVjdCBwaHlfc3RzX2Nja184MTkyc190ICpjY2tfYnVmOwotCXM4IHJ4X3B3cl9hbGwsIHJ4X3B3cls0XTsKKwlzOCByeF9wd3JfYWxsID0gMCwgcnhfcHdyWzRdOwogCXU4IGV2bSwgcHdkYl9hbGwsIHJmX3J4X251bSA9IDA7CiAJdTggaSwgbWF4X3NwYXRpYWxfc3RyZWFtOwogCXUzMiByc3NpLCB0b3RhbF9yc3NpID0gMDsKQEAgLTU5Miw3ICs1OTIsNiBAQAogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJdTggKnRtcF9idWY7CiAJdTggKnByYWRkcjsKLQl1OCAqcHNhZGRyOwogCV9fbGUxNiBmYzsKIAl1MTYgdHlwZSwgY19mYzsKIAlib29sIHBhY2tldF9tYXRjaGJzc2lkLCBwYWNrZXRfdG9zZWxmLCBwYWNrZXRfYmVhY29uOwpAQCAtNjA0LDcgKzYwMyw2IEBACiAJY19mYyA9IGxlMTZfdG9fY3B1KGZjKTsKIAl0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CiAJcHJhZGRyID0gaGRyLT5hZGRyMTsKLQlwc2FkZHIgPSBoZHItPmFkZHIyOwogCiAJcGFja2V0X21hdGNoYnNzaWQgPQogCSAgICAoKElFRUU4MDIxMV9GVFlQRV9DVEwgIT0gdHlwZSkgJiYKQEAgLTY4MCw3ICs2NzgsNyBAQAogCQkJCQkJICAgIEdFVF9SWF9ERVNDX1BBR0dSKHBkZXNjKSk7CiAKIAlyeF9zdGF0dXMtPm1hY3RpbWUgPSBHRVRfUlhfREVTQ19UU0ZMKHBkZXNjKTsKLQlpZiAocGh5c3RhdHVzID09IHRydWUpIHsKKwlpZiAocGh5c3RhdHVzKSB7CiAJCXBfZHJ2aW5mbyA9IChzdHJ1Y3QgcnhfZndpbmZvXzkyYyAqKShza2ItPmRhdGEgKwogCQkJCQkJICAgICBzdGF0cy0+cnhfYnVmc2hpZnQpOwogCkBAIC05MjksOSArOTI3LDEwIEBACiAKIHZvaWQgcnRsOTJjZV9zZXRfZGVzYyh1OCAqcGRlc2MsIGJvb2wgaXN0eCwgdTggZGVzY19uYW1lLCB1OCAqdmFsKQogewotCWlmIChpc3R4ID09IHRydWUpIHsKKwlpZiAoaXN0eCkgewogCQlzd2l0Y2ggKGRlc2NfbmFtZSkgewogCQljYXNlIEhXX0RFU0NfT1dOOgorCQkJd21iKCk7CiAJCQlTRVRfVFhfREVTQ19PV04ocGRlc2MsIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgSFdfREVTQ19UWF9ORVhUREVTQ19BRERSOgpAQCAtOTQ1LDYgKzk0NCw3IEBACiAJfSBlbHNlIHsKIAkJc3dpdGNoIChkZXNjX25hbWUpIHsKIAkJY2FzZSBIV19ERVNDX1JYT1dOOgorCQkJd21iKCk7CiAJCQlTRVRfUlhfREVTQ19PV04ocGRlc2MsIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgSFdfREVTQ19SWEJVRkZfQUREUjoKQEAgLTk2OCw3ICs5NjgsNyBAQAogewogCXUzMiByZXQgPSAwOwogCi0JaWYgKGlzdHggPT0gdHJ1ZSkgeworCWlmIChpc3R4KSB7CiAJCXN3aXRjaCAoZGVzY19uYW1lKSB7CiAJCWNhc2UgSFdfREVTQ19PV046CiAJCQlyZXQgPSBHRVRfVFhfREVTQ19PV04ocF9kZXNjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9ody5jCmluZGV4IDUyZTJhZjUuLjgxNGMwNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvaHcuYwpAQCAtMjcsNiArMjcsOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSAiLi4vd2lmaS5oIgogI2luY2x1ZGUgIi4uL2VmdXNlLmgiCiAjaW5jbHVkZSAiLi4vYmFzZS5oIgpAQCAtMzM3LDcgKzMzOSw3IEBACiAJcnRsZWZ1c2UtPmJvYXJkX3R5cGUgPSBib2FyZFR5cGU7CiAJaWYgKElTX0hJR0hUX1BBKHJ0bGVmdXNlLT5ib2FyZF90eXBlKSkKIAkJcnRsZWZ1c2UtPmV4dGVybmFsX3BhID0gMTsKLQlwcmludGsoS0VSTl9JTkZPICJydGw4MTkyY3U6IEJvYXJkIFR5cGUgJXhcbiIsIHJ0bGVmdXNlLT5ib2FyZF90eXBlKTsKKwlwcl9pbmZvKCJCb2FyZCBUeXBlICV4XG4iLCBydGxlZnVzZS0+Ym9hcmRfdHlwZSk7CiAKICNpZmRlZiBDT05GSUdfQU5URU5OQV9ESVZFUlNJVFkKIAkvKiBBbnRlbm5hIERpdmVyc2l0eSBzZXR0aW5nLiAqLwpAQCAtMzQ2LDggKzM0OCw3IEBACiAJZWxzZQogCQlydGxfZWZ1c2UtPmFudGVubmFfY2ZnID0gcmVnaXN0cnlfcGFyLT5hbnRkaXZfY2ZnOyAvKiAwOk9GRiwgKi8KIAotCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQW50ZW5uYSBDb25maWcgJXhcbiIsCi0JICAgICAgIHJ0bF9lZnVzZS0+YW50ZW5uYV9jZmcpOworCXByX2luZm8oIkFudGVubmEgQ29uZmlnICV4XG4iLCBydGxfZWZ1c2UtPmFudGVubmFfY2ZnKTsKICNlbmRpZgogfQogCkBAIC0zODQsNzEgKzM4NSw1NyBAQAogCXBidHByaXYtPmJCVE5vblRyYWZmaWNNb2RlU2V0ID0gX0ZBTFNFOwogCXBidHByaXYtPkN1cnJlbnRTdGF0ZSA9IDA7CiAJcGJ0cHJpdi0+UHJldmlvdXNTdGF0ZSA9IDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyAicnRsODE5MmN1OiBCVCBDb2V4aXN0YW5jZSA9ICVzXG4iLAotCSAgICAgICAocGJ0cHJpdi0+QlRfQ29leGlzdCA9PSBfVFJVRSkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJcHJfaW5mbygiQlQgQ29leGlzdGFuY2UgPSAlc1xuIiwKKwkJKHBidHByaXYtPkJUX0NvZXhpc3QgPT0gX1RSVUUpID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOwogCWlmIChwYnRwcml2LT5CVF9Db2V4aXN0KSB7CiAJCWlmIChwYnRwcml2LT5CVF9BbnRfTnVtID09IEFudF94MikKLQkJCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQmx1ZVRvb3RoIEJUXyIKLQkJCSAgICAgICAiQW50X051bSA9IEFudHgyXG4iKTsKKwkJCXByX2luZm8oIkJsdWVUb290aCBCVF9BbnRfTnVtID0gQW50eDJcbiIpOwogCQllbHNlIGlmIChwYnRwcml2LT5CVF9BbnRfTnVtID09IEFudF94MSkKLQkJCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQmx1ZVRvb3RoIEJUXyIKLQkJCSAgICAgICAiQW50X051bSA9IEFudHgxXG4iKTsKKwkJCXByX2luZm8oIkJsdWVUb290aCBCVF9BbnRfTnVtID0gQW50eDFcbiIpOwogCQlzd2l0Y2ggKHBidHByaXYtPkJUX0NvZXhpc3RUeXBlKSB7CiAJCWNhc2UgQlRfMldpcmU6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJydGw4MTkyY3U6IEJsdWVUb290aCBCVF8iCi0JCQkgICAgICAgIkNvZXhpc3RUeXBlID0gQlRfMldpcmVcbiIpOworCQkJcHJfaW5mbygiQmx1ZVRvb3RoIEJUX0NvZXhpc3RUeXBlID0gQlRfMldpcmVcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgQlRfSVNTQ18zV2lyZToKLQkJCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQmx1ZVRvb3RoIEJUXyIKLQkJCSAgICAgICAiQ29leGlzdFR5cGUgPSBCVF9JU1NDXzNXaXJlXG4iKTsKKwkJCXByX2luZm8oIkJsdWVUb290aCBCVF9Db2V4aXN0VHlwZSA9IEJUX0lTU0NfM1dpcmVcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgQlRfQWNjZWw6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJydGw4MTkyY3U6IEJsdWVUb290aCBCVF8iCi0JCQkgICAgICAgIkNvZXhpc3RUeXBlID0gQlRfQWNjZWxcbiIpOworCQkJcHJfaW5mbygiQmx1ZVRvb3RoIEJUX0NvZXhpc3RUeXBlID0gQlRfQWNjZWxcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgQlRfQ1NSX0JDNDoKLQkJCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQmx1ZVRvb3RoIEJUXyIKLQkJCSAgICAgICAiQ29leGlzdFR5cGUgPSBCVF9DU1JfQkM0XG4iKTsKKwkJCXByX2luZm8oIkJsdWVUb290aCBCVF9Db2V4aXN0VHlwZSA9IEJUX0NTUl9CQzRcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgQlRfQ1NSX0JDODoKLQkJCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQmx1ZVRvb3RoIEJUXyIKLQkJCSAgICAgICAiQ29leGlzdFR5cGUgPSBCVF9DU1JfQkM4XG4iKTsKKwkJCXByX2luZm8oIkJsdWVUb290aCBCVF9Db2V4aXN0VHlwZSA9IEJUX0NTUl9CQzhcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgQlRfUlRMODc1NjoKLQkJCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQmx1ZVRvb3RoIEJUXyIKLQkJCSAgICAgICAiQ29leGlzdFR5cGUgPSBCVF9SVEw4NzU2XG4iKTsKKwkJCXByX2luZm8oIkJsdWVUb290aCBCVF9Db2V4aXN0VHlwZSA9IEJUX1JUTDg3NTZcbiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJydGw4MTkyY3U6IEJsdWVUb290aCBCVF8iCi0JCQkgICAgICAgIkNvZXhpc3RUeXBlID0gVW5rbm93blxuIik7CisJCQlwcl9pbmZvKCJCbHVlVG9vdGggQlRfQ29leGlzdFR5cGUgPSBVbmtub3duXG4iKTsKIAkJCWJyZWFrOwogCQl9Ci0JCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQmx1ZVRvb3RoIEJUX0FudF9pc29sYXRpb24gPSAlZFxuIiwKLQkJICAgICAgIHBidHByaXYtPkJUX0FudF9pc29sYXRpb24pOworCQlwcl9pbmZvKCJCbHVlVG9vdGggQlRfQW50X2lzb2xhdGlvbiA9ICVkXG4iLAorCQkJcGJ0cHJpdi0+QlRfQW50X2lzb2xhdGlvbik7CiAJCXN3aXRjaCAocGJ0cHJpdi0+QlRfU2VydmljZSkgewogCQljYXNlIEJUX090aGVyQWN0aW9uOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAicnRsODE5MmN1OiBCbHVlVG9vdGggQlRfU2VydmljZSA9ICIKLQkJCSAgICAgICAiQlRfT3RoZXJBY3Rpb25cbiIpOworCQkJcHJfaW5mbygiQmx1ZVRvb3RoIEJUX1NlcnZpY2UgPSBCVF9PdGhlckFjdGlvblxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBCVF9TQ086Ci0JCQlwcmludGsoS0VSTl9JTkZPICJydGw4MTkyY3U6IEJsdWVUb290aCBCVF9TZXJ2aWNlID0gIgotCQkJICAgICAgICJCVF9TQ09cbiIpOworCQkJcHJfaW5mbygiQmx1ZVRvb3RoIEJUX1NlcnZpY2UgPSBCVF9TQ09cbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgQlRfQnVzeToKLQkJCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQmx1ZVRvb3RoIEJUX1NlcnZpY2UgPSAiCi0JCQkgICAgICAgIkJUX0J1c3lcbiIpOworCQkJcHJfaW5mbygiQmx1ZVRvb3RoIEJUX1NlcnZpY2UgPSBCVF9CdXN5XG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIEJUX090aGVyQnVzeToKLQkJCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQmx1ZVRvb3RoIEJUX1NlcnZpY2UgPSAiCi0JCQkgICAgICAgIkJUX090aGVyQnVzeVxuIik7CisJCQlwcl9pbmZvKCJCbHVlVG9vdGggQlRfU2VydmljZSA9IEJUX090aGVyQnVzeVxuIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQmx1ZVRvb3RoIEJUX1NlcnZpY2UgPSAiCi0JCQkgICAgICAgIkJUX0lkbGVcbiIpOworCQkJcHJfaW5mbygiQmx1ZVRvb3RoIEJUX1NlcnZpY2UgPSBCVF9JZGxlXG4iKTsKIAkJCWJyZWFrOwogCQl9Ci0JCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogQlRfUmFkaW9TaGFyZWRUeXBlID0gMHgleFxuIiwKLQkJICAgICAgIHBidHByaXYtPkJUX1JhZGlvU2hhcmVkVHlwZSk7CisJCXByX2luZm8oIkJUX1JhZGlvU2hhcmVkVHlwZSA9IDB4JXhcbiIsCisJCQlwYnRwcml2LT5CVF9SYWRpb1NoYXJlZFR5cGUpOwogCX0KIH0KIApAQCAtNTIwLDEzICs1MDcsMTMgQEAKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwgKCJBdXRvbG9hZCBPS1xuIikpOwogCQlydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcgPSBmYWxzZTsKIAl9Ci0JaWYgKHJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZyA9PSB0cnVlKQorCWlmIChydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcpCiAJCXJldHVybjsKIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKSB7CiAJCXVzdmFsdWUgPSAqKHUxNiAqKSZod2luZm9bRUVQUk9NX01BQ19BRERSICsgaV07CiAJCSooKHUxNiAqKSAoJnJ0bGVmdXNlLT5kZXZfYWRkcltpXSkpID0gdXN2YWx1ZTsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAicnRsODE5MmN1OiBNQUMgYWRkcmVzczogJXBNXG4iLCBydGxlZnVzZS0+ZGV2X2FkZHIpOworCXByX2luZm8oIk1BQyBhZGRyZXNzOiAlcE1cbiIsIHJ0bGVmdXNlLT5kZXZfYWRkcik7CiAJX3J0bDkyY3VfcmVhZF90eHBvd2VyX2luZm9fZnJvbV9od3BnKGh3LAogCQkJCQkgICBydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcsIGh3aW5mbyk7CiAJcnRsZWZ1c2UtPmVlcHJvbV92aWQgPSAqKHUxNiAqKSZod2luZm9bRUVQUk9NX1ZJRF07CkBAIC02NjUsNyArNjUyLDcgQEAKIAlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfQVBTX0ZTTUNPLCB2YWx1ZTE2KTsKIAlkbyB7CiAJCWlmICghKHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgUkVHX0FQU19GU01DTykgJiBBUEZNX09OTUFDKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAicnRsODE5MmN1OiBNQUMgYXV0byBPTiBva2F5IVxuIik7CisJCQlwcl9pbmZvKCJNQUMgYXV0byBPTiBva2F5IVxuIik7CiAJCQlicmVhazsKIAkJfQogCQlpZiAocG9sbGluZ0NvdW50KysgPiAxMDApIHsKQEAgLTgxOSw3ICs4MDYsNyBAQAogCX0KIAlfcnRsOTJjX2luaXRfY2hpcE5fcmVnX3ByaW9yaXR5KGh3LCB2YWx1ZSwgdmFsdWUsIHZhbHVlLCB2YWx1ZSwKIAkJCQkJdmFsdWUsIHZhbHVlKTsKLQlwcmludGsoS0VSTl9JTkZPICJydGw4MTkyY3U6IFR4IHF1ZXVlIHNlbGVjdDogMHglMDJ4XG4iLCBxdWV1ZV9zZWwpOworCXByX2luZm8oIlR4IHF1ZXVlIHNlbGVjdDogMHglMDJ4XG4iLCBxdWV1ZV9zZWwpOwogfQogCiBzdGF0aWMgdm9pZCBfcnRsOTJjdV9pbml0X2NoaXBOX3R3b19vdXRfZXBfcHJpb3JpdHkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC04NjMsNyArODUwLDcgQEAKIAkJaGlRID0gdmFsdWVIaTsKIAl9CiAJX3J0bDkyY19pbml0X2NoaXBOX3JlZ19wcmlvcml0eShodywgYmVRLCBia1EsIHZpUSwgdm9RLCBtZ3RRLCBoaVEpOwotCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogVHggcXVldWUgc2VsZWN0OiAweCUwMnhcbiIsIHF1ZXVlX3NlbCk7CisJcHJfaW5mbygiVHggcXVldWUgc2VsZWN0OiAweCUwMnhcbiIsIHF1ZXVlX3NlbCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9ydGw5MmN1X2luaXRfY2hpcE5fdGhyZWVfb3V0X2VwX3ByaW9yaXR5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMTU5NCw3ICsxNTgxLDcgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0JaWYgKGZpbHRlcm91dF9ub25fYXNzb2NpYXRlZF9ic3NpZCA9PSB0cnVlKSB7CisJaWYgKGZpbHRlcm91dF9ub25fYXNzb2NpYXRlZF9ic3NpZCkgewogCQlpZiAoSVNfTk9STUFMX0NISVAocnRsaGFsLT52ZXJzaW9uKSkgewogCQkJc3dpdGNoIChydGxwaHktPmN1cnJlbnRfaW9fdHlwZSkgewogCQkJY2FzZSBJT19DTURfUkVTVU1FX0RNX0JZX1NDQU46CkBAIC0yMTU1LDcgKzIxNDIsNyBAQAogCWNhc2UgSFdfVkFSX0NPUlJFQ1RfVFNGOnsKIAkJCXU4IGJ0eXBlX2lic3MgPSAoKHU4ICopICh2YWwpKVswXTsKIAotCQkJaWYgKGJ0eXBlX2lic3MgPT0gdHJ1ZSkKKwkJCWlmIChidHlwZV9pYnNzKQogCQkJCV9ydGw5MmN1X3N0b3BfdHhfYmVhY29uKGh3KTsKIAkJCV9ydGw5MmN1X3NldF9iY25fY3RybF9yZWcoaHcsIDAsIEJJVCgzKSk7CiAJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX1RTRlRSLCAodTMyKShtYWMtPnRzZiAmCkBAIC0yMTYzLDcgKzIxNTAsNyBAQAogCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19UU0ZUUiArIDQsCiAJCQkJCSh1MzIpKChtYWMtPnRzZiA+PiAzMikgJiAweGZmZmZmZmZmKSk7CiAJCQlfcnRsOTJjdV9zZXRfYmNuX2N0cmxfcmVnKGh3LCBCSVQoMyksIDApOwotCQkJaWYgKGJ0eXBlX2lic3MgPT0gdHJ1ZSkKKwkJCWlmIChidHlwZV9pYnNzKQogCQkJCV9ydGw5MmN1X3Jlc3VtZV90eF9iZWFjb24oaHcpOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvbGVkLmMKaW5kZXggMzMyYzc0My4uMmZmOWQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvbGVkLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBMRURfUElOX0xFRDA6CiAJCWxlZGNmZyAmPSAweGYwOwotCQlpZiAodXNicHJpdi0+bGVkY3RsLmxlZF9vcGVuZHJhaW4gPT0gdHJ1ZSkKKwkJaWYgKHVzYnByaXYtPmxlZGN0bC5sZWRfb3BlbmRyYWluKQogCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0xFRENGRzIsCiAJCQkJICAgICAgIChsZWRjZmcgfCBCSVQoMSkgfCBCSVQoNSkgfCBCSVQoNikpKTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9tYWMuYwppbmRleCBmODUxNGNiLi4xOTRmYzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9tYWMuYwpAQCAtMjYsNiArMjYsOSBAQAogICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgogICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vd2lmaS5oIgpAQCAtMjEzLDE0ICsyMTYsMTQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgKGJvdW5kYXJ5IC0gMSk7IGkrKykgewogCQlyc3QgPSBydGw5MmNfbGx0X3dyaXRlKGh3LCBpICwgaSArIDEpOwogCQlpZiAodHJ1ZSAhPSByc3QpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiPT09PiAlcyAjMSBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCQlwcl9lcnIoIj09PT4gJXMgIzEgZmFpbFxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIHJzdDsKIAkJfQogCX0KIAkvKiBlbmQgb2YgbGlzdCAqLwogCXJzdCA9IHJ0bDkyY19sbHRfd3JpdGUoaHcsIChib3VuZGFyeSAtIDEpLCAweEZGKTsKIAlpZiAodHJ1ZSAhPSByc3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICI9PT0+ICVzICMyIGZhaWxcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCI9PT0+ICVzICMyIGZhaWxcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJzdDsKIAl9CiAJLyogTWFrZSB0aGUgb3RoZXIgcGFnZXMgYXMgcmluZyBidWZmZXIKQEAgLTIzMSwxNCArMjM0LDE0IEBACiAJZm9yIChpID0gYm91bmRhcnk7IGkgPCBMTFRfTEFTVF9FTlRSWV9PRl9UWF9QS1RfQlVGRkVSOyBpKyspIHsKIAkJcnN0ID0gcnRsOTJjX2xsdF93cml0ZShodywgaSwgKGkgKyAxKSk7CiAJCWlmICh0cnVlICE9IHJzdCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICI9PT0+ICVzICMzIGZhaWxcbiIsIF9fZnVuY19fKTsKKwkJCXByX2VycigiPT09PiAlcyAjMyBmYWlsXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gcnN0OwogCQl9CiAJfQogCS8qIExldCBsYXN0IGVudHJ5IHBvaW50IHRvIHRoZSBzdGFydCBlbnRyeSBvZiByaW5nIGJ1ZmZlciAqLwogCXJzdCA9IHJ0bDkyY19sbHRfd3JpdGUoaHcsIExMVF9MQVNUX0VOVFJZX09GX1RYX1BLVF9CVUZGRVIsIGJvdW5kYXJ5KTsKIAlpZiAodHJ1ZSAhPSByc3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICI9PT0+ICVzICM0IGZhaWxcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCI9PT0+ICVzICM0IGZhaWxcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJzdDsKIAl9CiAJcmV0dXJuIHJzdDsKQEAgLTM4MCwxMyArMzgzLDExIEBACiAJCQkJMHhGRkZGRkZGRik7CiAJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfSElNUkUsIHJ0bHBjaS0+aXJxX21hc2tbMV0gJgogCQkJCTB4RkZGRkZGRkYpOwotCQlydGxwY2ktPmlycV9lbmFibGVkID0gdHJ1ZTsKIAl9IGVsc2UgewogCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0hJTVIsIHJ0bHVzYi0+aXJxX21hc2tbMF0gJgogCQkJCTB4RkZGRkZGRkYpOwogCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0hJTVJFLCBydGx1c2ItPmlycV9tYXNrWzFdICYKIAkJCQkweEZGRkZGRkZGKTsKLQkJcnRsdXNiLT5pcnFfZW5hYmxlZCA9IHRydWU7CiAJfQogfQogCkBAIC0zOTgsMTYgKzM5OSw5IEBACiB2b2lkIHJ0bDkyY19kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7Ci0Jc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKLQlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOwotCXN0cnVjdCBydGxfdXNiICpydGx1c2IgPSBydGxfdXNiZGV2KHJ0bF91c2Jwcml2KGh3KSk7CiAKIAlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0hJTVIsIElNUjgxOTBfRElTQUJMRUQpOwogCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfSElNUkUsIElNUjgxOTBfRElTQUJMRUQpOwotCWlmIChJU19IQVJEV0FSRV9UWVBFXzgxOTJDRShydGxoYWwpKQotCQlydGxwY2ktPmlycV9lbmFibGVkID0gZmFsc2U7Ci0JZWxzZSBpZiAoSVNfSEFSRFdBUkVfVFlQRV84MTkyQ1UocnRsaGFsKSkKLQkJcnRsdXNiLT5pcnFfZW5hYmxlZCA9IGZhbHNlOwogfQogCiB2b2lkIHJ0bDkyY19zZXRfcW9zKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgYWNpKQpAQCAtMTExMyw3ICsxMTA3LDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCXU4ICp0bXBfYnVmOwogCXU4ICpwcmFkZHI7Ci0JdTggKnBzYWRkcjsKIAlfX2xlMTYgZmM7CiAJdTE2IHR5cGUsIGNwdV9mYzsKIAlib29sIHBhY2tldF9tYXRjaGJzc2lkLCBwYWNrZXRfdG9zZWxmLCBwYWNrZXRfYmVhY29uOwpAQCAtMTEyNCw3ICsxMTE3LDYgQEAKIAljcHVfZmMgPSBsZTE2X3RvX2NwdShmYyk7CiAJdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOwogCXByYWRkciA9IGhkci0+YWRkcjE7Ci0JcHNhZGRyID0gaGRyLT5hZGRyMjsKIAlwYWNrZXRfbWF0Y2hic3NpZCA9CiAJICAgICgoSUVFRTgwMjExX0ZUWVBFX0NUTCAhPSB0eXBlKSAmJgogCSAgICAgKCFjb21wYXJlX2V0aGVyX2FkZHIobWFjLT5ic3NpZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMKaW5kZXggOWEzZDAyMy4uNzI4NTI5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMKQEAgLTQ3MCw3ICs0NzAsNiBAQAogCXU4IGksIHF1ZXVlX2lkOwogCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmcgPSBOVUxMOwogCi0JcHBzYy0+c2V0X3JmcG93ZXJzdGF0ZV9pbnByb2dyZXNzID0gdHJ1ZTsKIAlzd2l0Y2ggKHJmcHdyX3N0YXRlKSB7CiAJY2FzZSBFUkZPTjoKIAkJaWYgKChwcHNjLT5yZnB3cl9zdGF0ZSA9PSBFUkZPRkYpICYmCkBAIC01OTAsNyArNTg5LDYgQEAKIAl9CiAJaWYgKGJyZXN1bHQpCiAJCXBwc2MtPnJmcHdyX3N0YXRlID0gcmZwd3Jfc3RhdGU7Ci0JcHBzYy0+c2V0X3JmcG93ZXJzdGF0ZV9pbnByb2dyZXNzID0gZmFsc2U7CiAJcmV0dXJuIGJyZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3JmLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9yZi5jCmluZGV4IGM3NTc2ZWMuLjE3YThlOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3JmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvcmYuYwpAQCAtODIsNyArODIsNyBAQAogCQkgICAgKHJ0bGVmdXNlLT5leHRlcm5hbF9wYSkpCiAJCQl0dXJib19zY2Fub2ZmID0gdHJ1ZTsKIAl9Ci0JaWYgKG1hYy0+YWN0X3NjYW5uaW5nID09IHRydWUpIHsKKwlpZiAobWFjLT5hY3Rfc2Nhbm5pbmcpIHsKIAkJdHhfYWdjW1JGOTBfUEFUSF9BXSA9IDB4M2YzZjNmM2Y7CiAJCXR4X2FnY1tSRjkwX1BBVEhfQl0gPSAweDNmM2YzZjNmOwogCQlpZiAodHVyYm9fc2Nhbm9mZikgewpAQCAtMTA0LDcgKzEwNCw3IEBACiAJCQl0eF9hZ2NbUkY5MF9QQVRIX0FdID0gMHgxMDEwMTAxMDsKIAkJCXR4X2FnY1tSRjkwX1BBVEhfQl0gPSAweDEwMTAxMDEwOwogCQl9IGVsc2UgaWYgKHJ0bHByaXYtPmRtLmR5bmFtaWNfdHhoaWdocG93ZXJfbHZsID09Ci0JCQkgICBUWEhJR0hQV1JMRVZFTF9MRVZFTDEpIHsKKwkJCSAgIFRYSElHSFBXUkxFVkVMX0xFVkVMMikgewogCQkJdHhfYWdjW1JGOTBfUEFUSF9BXSA9IDB4MDAwMDAwMDA7CiAJCQl0eF9hZ2NbUkY5MF9QQVRIX0JdID0gMHgwMDAwMDAwMDsKIAkJfSBlbHNlewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMKaW5kZXggYmVlN2MxNC4uOTQyZjdhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9zdy5jCkBAIC01Myw2ICs1Myw4IEBACiBzdGF0aWMgaW50IHJ0bDkyY3VfaW5pdF9zd192YXJzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOworCWludCBlcnI7CiAKIAlydGxwcml2LT5kbS5kbV9pbml0aWFsZ2Fpbl9lbmFibGUgPSAxOwogCXJ0bHByaXYtPmRtLmRtX2ZsYWcgPSAwOwpAQCAtNjQsNiArNjYsMjQgQEAKIAkJCSAoIkNhbid0IGFsbG9jIGJ1ZmZlciBmb3IgZncuXG4iKSk7CiAJCXJldHVybiAxOwogCX0KKwkvKiByZXF1ZXN0IGZ3ICovCisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIHJ0bHByaXYtPmNmZy0+ZndfbmFtZSwKKwkJCXJ0bHByaXYtPmlvLmRldik7CisJaWYgKGVycikgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiRmFpbGVkIHRvIHJlcXVlc3QgZmlybXdhcmUhXG4iKSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoZmlybXdhcmUtPnNpemUgPiAweDQwMDApIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoIkZpcm13YXJlIGlzIHRvbyBiaWchXG4iKSk7CisJCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworCQlyZXR1cm4gMTsKKwl9CisJbWVtY3B5KHJ0bHByaXYtPnJ0bGhhbC5wZmlybXdhcmUsIGZpcm13YXJlLT5kYXRhLCBmaXJtd2FyZS0+c2l6ZSk7CisJcnRscHJpdi0+cnRsaGFsLmZ3c2l6ZSA9IGZpcm13YXJlLT5zaXplOworCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3OCw2ICsyOTgsNyBAQAogCXtSVExfVVNCX0RFVklDRSgweDA2ZjgsIDB4ZTAzMywgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qSGVyY3VsZXMgLSBFZGltYXgqLwogCXtSVExfVVNCX0RFVklDRSgweDA3YjgsIDB4ODE4OCwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qQWJvY29tIC0gQWJvY29tKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwN2I4LCAweDgxODksIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkZ1bmFpIC0gQWJvY29tKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwODQ2LCAweDkwNDEsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKk5ldEdlYXIgV05BMTAwME0qLwogCXtSVExfVVNCX0RFVklDRSgweDBEZjYsIDB4MDA1MiwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qU2l0ZWNvbSAtIEVkaW1heCovCiAJe1JUTF9VU0JfREVWSUNFKDB4MGViMCwgMHg5MDcxLCBydGw5MmN1X2hhbF9jZmcpfSwgLypOTyBCcmFuZCAtIEV0b3AqLwogCS8qIEhQIC0gTGl0ZS1PbiAsODE4OENVUyBTbGltIENvbWJvICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS90cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3RyeC5jCmluZGV4IDNhOTJiYTMuLjkwNmU3YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3RyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3RyeC5jCkBAIC0zNDIsNyArMzQyLDcgQEAKIAkJCQkJCSh1OClHRVRfUlhfREVTQ19SWF9NQ1MocGRlc2MpLAogCQkJCQkJKGJvb2wpR0VUX1JYX0RFU0NfUEFHR1IocGRlc2MpKTsKIAlyeF9zdGF0dXMtPm1hY3RpbWUgPSBHRVRfUlhfREVTQ19UU0ZMKHBkZXNjKTsKLQlpZiAocGh5c3RhdHVzID09IHRydWUpIHsKKwlpZiAocGh5c3RhdHVzKSB7CiAJCXBfZHJ2aW5mbyA9IChzdHJ1Y3QgcnhfZndpbmZvXzkyYyAqKShwZGVzYyArIFJUTF9SWF9ERVNDX1NJWkUpOwogCQlydGw5MmNfdHJhbnNsYXRlX3J4X3NpZ25hbF9zdHVmZihodywgc2tiLCBzdGF0cywgcGRlc2MsCiAJCQkJCQkgcF9kcnZpbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyMTNjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKK3J0bDgxOTJkZS1vYmpzIDo9CQlcCisJCWRtLm8JCVwKKwkJZncubwkJXAorCQlody5vCQlcCisJCWxlZC5vCQlcCisJCXBoeS5vCQlcCisJCXJmLm8JCVwKKwkJc3cubwkJXAorCQl0YWJsZS5vCQlcCisJCXRyeC5vCisKK29iai0kKENPTkZJR19SVEw4MTkyREUpICs9IHJ0bDgxOTJkZS5vCisKK2NjZmxhZ3MteSArPSAtRF9fQ0hFQ0tfRU5ESUFOX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2RlZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmNWY5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2RlZi5oCkBAIC0wLDAgKzEsMjY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDkyRF9ERUZfSF9fCisjZGVmaW5lIF9fUlRMOTJEX0RFRl9IX18KKworLyogTWluIFNwYWNpbmcgcmVsYXRlZCBzZXR0aW5ncy4gKi8KKyNkZWZpbmUJTUFYX01TU19ERU5TSVRZXzJUCQkJCTB4MTMKKyNkZWZpbmUJTUFYX01TU19ERU5TSVRZXzFUCQkJCTB4MEEKKworI2RlZmluZSBSRjYwNTJfTUFYX1RYX1BXUgkJCQkweDNGCisjZGVmaW5lIFJGNjA1Ml9NQVhfUkVHCQkJCQkweDNGCisjZGVmaW5lIFJGNjA1Ml9NQVhfUEFUSAkJCQkJMgorCisjZGVmaW5lIEhBTF9SRVRSWV9MSU1JVF9JTkZSQQkJCQk0OAorI2RlZmluZSBIQUxfUkVUUllfTElNSVRfQVBfQURIT0MJCQk3CisKKyNkZWZpbmUJUEhZX1JTU0lfU0xJRF9XSU5fTUFYCQkJCTEwMAorI2RlZmluZQlQSFlfTElOS1FVQUxJVFlfU0xJRF9XSU5fTUFYCQkJMjAKKyNkZWZpbmUJUEhZX0JFQUNPTl9SU1NJX1NMSURfV0lOX01BWAkJCTEwCisKKyNkZWZpbmUgUkVTRVRfREVMQVlfODE4NQkJCQkyMAorCisjZGVmaW5lIFJUX0lCU1NfSU5UX01BU0tTCShJTVJfQkNOSU5UIHwgSU1SX1RCRE9LIHwgSU1SX1RCREVSKQorI2RlZmluZSBSVF9BQ19JTlRfTUFTS1MJCShJTVJfVklET0sgfCBJTVJfVk9ET0sgfCBJTVJfQkVET0t8SU1SX0JLRE9LKQorCisjZGVmaW5lIE5VTV9PRl9GSVJNV0FSRV9RVUVVRQkJCQkxMAorI2RlZmluZSBOVU1fT0ZfUEFHRVNfSU5fRlcJCQkJMHgxMDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQksJCQkweDA3CisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JFCQkJMHgwNworI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WSQkJCTB4MDcKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk8JCQkweDA3CisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hDQ0EJCQkweDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQ01ECQkJMHgwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX01HTlQJCQkweDAyCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hJR0gJCQkweDAyCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JDTgkJCTB4MgorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9QVUIJCQkweEExCisKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQktfRFRNCQkJMHgwMjYKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkVfRFRNCQkJMHgwNDgKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVklfRFRNCQkJMHgwNDgKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk9fRFRNCQkJMHgwMjYKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfUFVCX0RUTQkJCTB4MDAKKworI2RlZmluZSBNQVhfTElORVNfSFdDT05GSUdfVFhUCQkJCTEwMDAKKyNkZWZpbmUgTUFYX0JZVEVTX0xJTkVfSFdDT05GSUdfVFhUCQkJMjU2CisKKyNkZWZpbmUgU1dfVEhSRUVfV0lSRQkJCQkJMAorI2RlZmluZSBIV19USFJFRV9XSVJFCQkJCQkyCisKKyNkZWZpbmUgQlRfREVNT19CT0FSRAkJCQkJMAorI2RlZmluZSBCVF9RQV9CT0FSRAkJCQkJMQorI2RlZmluZSBCVF9GUEdBCQkJCQkJMgorCisjZGVmaW5lIFJYX1NNT09USF9GQUNUT1IJCQkJMjAKKworI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFCQkJMAorI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIJCQkxCisjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUgkJCTIKKworI2RlZmluZSBNQVhfSDJDX1FVRVVFX05VTQkJCQkxMAorCisjZGVmaW5lIFJYX01QRFVfUVVFVUUJCQkJCTAKKyNkZWZpbmUgUlhfQ01EX1FVRVVFCQkJCQkxCisjZGVmaW5lIFJYX01BWF9RVUVVRQkJCQkJMgorCisjZGVmaW5lCUMySF9SWF9DTURfSERSX0xFTgkJCQk4CisjZGVmaW5lCUdFVF9DMkhfQ01EX0NNRF9MRU4oX19wcnhoZHIpCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoKF9fcHJ4aGRyKSwgMCwgMTYpCisjZGVmaW5lCUdFVF9DMkhfQ01EX0VMRU1FTlRfSUQoX19wcnhoZHIpCQlcCisJTEVfQklUU19UT180QllURSgoX19wcnhoZHIpLCAxNiwgOCkKKyNkZWZpbmUJR0VUX0MySF9DTURfQ01EX1NFUShfX3ByeGhkcikJCQlcCisJTEVfQklUU19UT180QllURSgoX19wcnhoZHIpLCAyNCwgNykKKyNkZWZpbmUJR0VUX0MySF9DTURfQ09OVElOVUUoX19wcnhoZHIpCQkJXAorCUxFX0JJVFNfVE9fNEJZVEUoKF9fcHJ4aGRyKSwgMzEsIDEpCisjZGVmaW5lCUdFVF9DMkhfQ01EX0NPTlRFTlQoX19wcnhoZHIpCQkJXAorCSgodTggKikoX19wcnhoZHIpICsgQzJIX1JYX0NNRF9IRFJfTEVOKQorCisjZGVmaW5lCUdFVF9DMkhfQ01EX0ZFRURCQUNLX0VMRU1FTlRfSUQoX19wY21kZmJoZHIpCVwKKwlMRV9CSVRTX1RPXzRCWVRFKChfX3BjbWRmYmhkciksIDAsIDgpCisjZGVmaW5lCUdFVF9DMkhfQ01EX0ZFRURCQUNLX0NDWF9MRU4oX19wY21kZmJoZHIpCVwKKwlMRV9CSVRTX1RPXzRCWVRFKChfX3BjbWRmYmhkciksIDgsIDgpCisjZGVmaW5lCUdFVF9DMkhfQ01EX0ZFRURCQUNLX0NDWF9DTURfQ05UKF9fcGNtZGZiaGRyKQlcCisJTEVfQklUU19UT180QllURSgoX19wY21kZmJoZHIpLCAxNiwgMTYpCisjZGVmaW5lCUdFVF9DMkhfQ01EX0ZFRURCQUNLX0NDWF9NQUNfSUQoX19wY21kZmJoZHIpCVwKKwlMRV9CSVRTX1RPXzRCWVRFKCgoX19wY21kZmJoZHIpICsgNCksIDAsIDUpCisjZGVmaW5lCUdFVF9DMkhfQ01EX0ZFRURCQUNLX0NDWF9WQUxJRChfX3BjbWRmYmhkcikJXAorCUxFX0JJVFNfVE9fNEJZVEUoKChfX3BjbWRmYmhkcikgKyA0KSwgNywgMSkKKyNkZWZpbmUJR0VUX0MySF9DTURfRkVFREJBQ0tfQ0NYX1JFVFJZX0NOVChfX3BjbWRmYmhkcikJXAorCUxFX0JJVFNfVE9fNEJZVEUoKChfX3BjbWRmYmhkcikgKyA0KSwgOCwgNSkKKyNkZWZpbmUJR0VUX0MySF9DTURfRkVFREJBQ0tfQ0NYX1RPSyhfX3BjbWRmYmhkcikJXAorCUxFX0JJVFNfVE9fNEJZVEUoKChfX3BjbWRmYmhkcikgKyA0KSwgMTUsIDEpCisjZGVmaW5lCUdFVF9DMkhfQ01EX0ZFRURCQUNLX0NDWF9RU0VMKF9fcGNtZGZiaGRyKQlcCisJTEVfQklUU19UT180QllURSgoKF9fcGNtZGZiaGRyKSArIDQpLCAxNiwgNCkKKyNkZWZpbmUJR0VUX0MySF9DTURfRkVFREJBQ0tfQ0NYX1NFUShfX3BjbWRmYmhkcikJXAorCUxFX0JJVFNfVE9fNEJZVEUoKChfX3BjbWRmYmhkcikgKyA0KSwgMjAsIDEyKQorCisvKgorICogOTJEIGNoaXAgdmVyOgorICogQklUODogSVMgOTJECisgKiBCSVQ5OiBzaW5nbGUgcGh5CisgKiBCSVQxMDogQy1jdXQKKyAqIEJJVDExOiBELWN1dAorICovCisKKy8qIENoaXAgc3BlY2lmaWMgKi8KKyNkZWZpbmUgQ0hJUF85MkMJCQlCSVQoMCkKKyNkZWZpbmUgQ0hJUF85MkNfMVQyUgkJCUJJVCgxKQorI2RlZmluZSBDSElQXzg3MjMJCQlCSVQoMikgLyogUlRMODcyMyBXaXRoIEJUIGZlYXR1cmUgKi8KKyNkZWZpbmUgQ0hJUF84NzIzX0RSVl9SRVYJCUJJVCgzKSAvKiBSVEw4NzIzIERyaXZlciBSZXZpc2VkICovCisjZGVmaW5lIE5PUk1BTF9DSElQCQkJQklUKDQpCisjZGVmaW5lIENISVBfVkVORE9SX1VNQwkJCUJJVCg1KQorI2RlZmluZSBDSElQX1ZFTkRPUl9VTUNfQl9DVVQJCUJJVCg2KSAvKiBDaGlwIHZlcnNpb24gZm9yIEVDTyAqLworCisvKiBmb3IgOTJEICovCisjZGVmaW5lIENISVBfOTJECQkJQklUKDgpCisjZGVmaW5lIENISVBfOTJEX1NJTkdMRVBIWQkJQklUKDkpCisjZGVmaW5lIENISVBfOTJEX0NfQ1VUCQkJQklUKDEwKQorI2RlZmluZSBDSElQXzkyRF9EX0NVVAkJCUJJVCgxMSkKKworZW51bSB2ZXJzaW9uXzgxOTJkIHsKKwlWRVJTSU9OX1RFU1RfQ0hJUF84OEMgPSAweDAwLAorCVZFUlNJT05fVEVTVF9DSElQXzkyQyA9IDB4MDEsCisJVkVSU0lPTl9OT1JNQUxfVFNNQ19DSElQXzg4QyA9IDB4MTAsCisJVkVSU0lPTl9OT1JNQUxfVFNNQ19DSElQXzkyQyA9IDB4MTEsCisJVkVSU0lPTl9OT1JNQUxfVFNNQ19DSElQXzkyQ18xVDJSID0gMHgxMywKKwlWRVJTSU9OX05PUk1BTF9VTUNfQ0hJUF84OENfQV9DVVQgPSAweDMwLAorCVZFUlNJT05fTk9STUFMX1VNQ19DSElQXzkyQ19BX0NVVCA9IDB4MzEsCisJVkVSU0lPTl9OT1JNQUxfVU1DX0NISVBfOTJDXzFUMlJfQV9DVVQgPSAweDMzLAorCVZFUlNJT05fTk9STUFfVU1DX0NISVBfODcyM18xVDFSX0FfQ1VUID0gMHgzNCwKKwlWRVJTSU9OX05PUk1BX1VNQ19DSElQXzg3MjNfMVQxUl9CX0NVVCA9IDB4M2MsCisJVkVSU0lPTl9OT1JNQUxfVU1DX0NISVBfODhDX0JfQ1VUID0gMHg3MCwKKwlWRVJTSU9OX05PUk1BTF9VTUNfQ0hJUF85MkNfQl9DVVQgPSAweDcxLAorCVZFUlNJT05fTk9STUFMX1VNQ19DSElQXzkyQ18xVDJSX0JfQ1VUID0gMHg3MywKKwlWRVJTSU9OX1RFU1RfQ0hJUF85MkRfU0lOR0xFUEhZID0gMHgzMDAsCisJVkVSU0lPTl9URVNUX0NISVBfOTJEX0RVQUxQSFkgPSAweDEwMCwKKwlWRVJTSU9OX05PUk1BTF9DSElQXzkyRF9TSU5HTEVQSFkgPSAweDMxMCwKKwlWRVJTSU9OX05PUk1BTF9DSElQXzkyRF9EVUFMUEhZID0gMHgxMTAsCisJVkVSU0lPTl9OT1JNQUxfQ0hJUF85MkRfQ19DVVRfU0lOR0xFUEhZID0gMHg3MTAsCisJVkVSU0lPTl9OT1JNQUxfQ0hJUF85MkRfQ19DVVRfRFVBTFBIWSA9IDB4NTEwLAorCVZFUlNJT05fTk9STUFMX0NISVBfOTJEX0RfQ1VUX1NJTkdMRVBIWSA9IDB4QjEwLAorCVZFUlNJT05fTk9STUFMX0NISVBfOTJEX0RfQ1VUX0RVQUxQSFkgPSAweDkxMCwKK307CisKKyNkZWZpbmUgSVNfOTJEX1NJTkdMRVBIWSh2ZXJzaW9uKQkJXAorCSgodmVyc2lvbiAmIENISVBfOTJEX1NJTkdMRVBIWSkgPyB0cnVlIDogZmFsc2UpCisjZGVmaW5lIElTXzkyRF9DX0NVVCh2ZXJzaW9uKQkJCVwKKwkoKHZlcnNpb24gJiBDSElQXzkyRF9DX0NVVCkgPyB0cnVlIDogZmFsc2UpCisjZGVmaW5lIElTXzkyRF9EX0NVVCh2ZXJzaW9uKQkJCVwKKwkoKHZlcnNpb24gJiBDSElQXzkyRF9EX0NVVCkgPyB0cnVlIDogZmFsc2UpCisKK2VudW0gcmZfb3B0eXBlIHsKKwlSRl9PUF9CWV9TV18zV0lSRSA9IDAsCisJUkZfT1BfQllfRlcsCisJUkZfT1BfTUFYCit9OworCitlbnVtIHJ0bF9kZXNjX3FzZWwgeworCVFTTFRfQksgPSAweDIsCisJUVNMVF9CRSA9IDB4MCwKKwlRU0xUX1ZJID0gMHg1LAorCVFTTFRfVk8gPSAweDcsCisJUVNMVF9CRUFDT04gPSAweDEwLAorCVFTTFRfSElHSCA9IDB4MTEsCisJUVNMVF9NR05UID0gMHgxMiwKKwlRU0xUX0NNRCA9IDB4MTMsCit9OworCitlbnVtIHJ0bF9kZXNjOTJkX3JhdGUgeworCURFU0M5MkRfUkFURTFNID0gMHgwMCwKKwlERVNDOTJEX1JBVEUyTSA9IDB4MDEsCisJREVTQzkyRF9SQVRFNV81TSA9IDB4MDIsCisJREVTQzkyRF9SQVRFMTFNID0gMHgwMywKKworCURFU0M5MkRfUkFURTZNID0gMHgwNCwKKwlERVNDOTJEX1JBVEU5TSA9IDB4MDUsCisJREVTQzkyRF9SQVRFMTJNID0gMHgwNiwKKwlERVNDOTJEX1JBVEUxOE0gPSAweDA3LAorCURFU0M5MkRfUkFURTI0TSA9IDB4MDgsCisJREVTQzkyRF9SQVRFMzZNID0gMHgwOSwKKwlERVNDOTJEX1JBVEU0OE0gPSAweDBhLAorCURFU0M5MkRfUkFURTU0TSA9IDB4MGIsCisKKwlERVNDOTJEX1JBVEVNQ1MwID0gMHgwYywKKwlERVNDOTJEX1JBVEVNQ1MxID0gMHgwZCwKKwlERVNDOTJEX1JBVEVNQ1MyID0gMHgwZSwKKwlERVNDOTJEX1JBVEVNQ1MzID0gMHgwZiwKKwlERVNDOTJEX1JBVEVNQ1M0ID0gMHgxMCwKKwlERVNDOTJEX1JBVEVNQ1M1ID0gMHgxMSwKKwlERVNDOTJEX1JBVEVNQ1M2ID0gMHgxMiwKKwlERVNDOTJEX1JBVEVNQ1M3ID0gMHgxMywKKwlERVNDOTJEX1JBVEVNQ1M4ID0gMHgxNCwKKwlERVNDOTJEX1JBVEVNQ1M5ID0gMHgxNSwKKwlERVNDOTJEX1JBVEVNQ1MxMCA9IDB4MTYsCisJREVTQzkyRF9SQVRFTUNTMTEgPSAweDE3LAorCURFU0M5MkRfUkFURU1DUzEyID0gMHgxOCwKKwlERVNDOTJEX1JBVEVNQ1MxMyA9IDB4MTksCisJREVTQzkyRF9SQVRFTUNTMTQgPSAweDFhLAorCURFU0M5MkRfUkFURU1DUzE1ID0gMHgxYiwKKwlERVNDOTJEX1JBVEVNQ1MxNV9TRyA9IDB4MWMsCisJREVTQzkyRF9SQVRFTUNTMzIgPSAweDIwLAorfTsKKworZW51bSBjaGFubmVsX3BsYW4geworCUNIUExfRkNDCT0gMCwKKwlDSFBMX0lDCQk9IDEsCisJQ0hQTF9FVFNJCT0gMiwKKwlDSFBMX1NQQUlOCT0gMywKKwlDSFBMX0ZSQU5DRQk9IDQsCisJQ0hQTF9NS0sJPSA1LAorCUNIUExfTUtLMQk9IDYsCisJQ0hQTF9JU1JBRUwJPSA3LAorCUNIUExfVEVMRUMJPSA4LAorCUNIUExfR0xPQkFMCT0gOSwKKwlDSFBMX1dPUkxECT0gMTAsCit9OworCitzdHJ1Y3QgcGh5X3N0c19jY2tfODE5MmQgeworCXU4IGFkY19wd2RiX1hbNF07CisJdTggc3FfcnB0OworCXU4IGNja19hZ2NfcnB0OworfTsKKworc3RydWN0IGgyY19jbWRfODE5MmMgeworCXU4IGVsZW1lbnRfaWQ7CisJdTMyIGNtZF9sZW47CisJdTggKnBfY21kYnVmZmVyOworfTsKKworc3RydWN0IHR4cG93ZXJfaW5mbyB7CisJdTggY2NrX2luZGV4W1JGNjA1Ml9NQVhfUEFUSF1bQ0hBTk5FTF9HUk9VUF9NQVhdOworCXU4IGh0NDBfMXNpbmRleFtSRjYwNTJfTUFYX1BBVEhdW0NIQU5ORUxfR1JPVVBfTUFYXTsKKwl1OCBodDQwXzJzaW5kZXhkaWZmW1JGNjA1Ml9NQVhfUEFUSF1bQ0hBTk5FTF9HUk9VUF9NQVhdOworCXU4IGh0MjBpbmRleGRpZmZbUkY2MDUyX01BWF9QQVRIXVtDSEFOTkVMX0dST1VQX01BWF07CisJdTggb2ZkbWluZGV4ZGlmZltSRjYwNTJfTUFYX1BBVEhdW0NIQU5ORUxfR1JPVVBfTUFYXTsKKwl1OCBodDQwbWF4b2Zmc2V0W1JGNjA1Ml9NQVhfUEFUSF1bQ0hBTk5FTF9HUk9VUF9NQVhdOworCXU4IGh0MjBtYXhvZmZzZXRbUkY2MDUyX01BWF9QQVRIXVtDSEFOTkVMX0dST1VQX01BWF07CisJdTggdHNzaV9hWzNdOwkJLyogNUdMLzVHTS81R0ggKi8KKwl1OCB0c3NpX2JbM107Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2RtLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9kbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDA3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9kbS5jCkBAIC0wLDAgKzEsMTM1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi93aWZpLmgiCisjaW5jbHVkZSAiLi4vYmFzZS5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImRlZi5oIgorI2luY2x1ZGUgInBoeS5oIgorI2luY2x1ZGUgImRtLmgiCisjaW5jbHVkZSAiZncuaCIKKworI2RlZmluZSBVTkRFQ19TTV9QV0RCCWVudHJ5X21pbl91bmRlY29yYXRlZHNtb290aGVkX3B3ZGIKKworc3RydWN0IGRpZ190IGRlX2RpZ3RhYmxlOworCitzdGF0aWMgY29uc3QgdTMyIG9mZG1zd2luZ190YWJsZVtPRkRNX1RBQkxFX1NJWkVfOTJEXSA9IHsKKwkweDdmODAwMWZlLAkJLyogMCwgKzYuMGRCICovCisJMHg3ODgwMDFlMiwJCS8qIDEsICs1LjVkQiAqLworCTB4NzFjMDAxYzcsCQkvKiAyLCArNS4wZEIgKi8KKwkweDZiODAwMWFlLAkJLyogMywgKzQuNWRCICovCisJMHg2NTQwMDE5NSwJCS8qIDQsICs0LjBkQiAqLworCTB4NWZjMDAxN2YsCQkvKiA1LCArMy41ZEIgKi8KKwkweDVhNDAwMTY5LAkJLyogNiwgKzMuMGRCICovCisJMHg1NTQwMDE1NSwJCS8qIDcsICsyLjVkQiAqLworCTB4NTA4MDAxNDIsCQkvKiA4LCArMi4wZEIgKi8KKwkweDRjMDAwMTMwLAkJLyogOSwgKzEuNWRCICovCisJMHg0N2MwMDExZiwJCS8qIDEwLCArMS4wZEIgKi8KKwkweDQzYzAwMTBmLAkJLyogMTEsICswLjVkQiAqLworCTB4NDAwMDAxMDAsCQkvKiAxMiwgKzBkQiAqLworCTB4M2M4MDAwZjIsCQkvKiAxMywgLTAuNWRCICovCisJMHgzOTAwMDBlNCwJCS8qIDE0LCAtMS4wZEIgKi8KKwkweDM1YzAwMGQ3LAkJLyogMTUsIC0xLjVkQiAqLworCTB4MzJjMDAwY2IsCQkvKiAxNiwgLTIuMGRCICovCisJMHgzMDAwMDBjMCwJCS8qIDE3LCAtMi41ZEIgKi8KKwkweDJkNDAwMGI1LAkJLyogMTgsIC0zLjBkQiAqLworCTB4MmFjMDAwYWIsCQkvKiAxOSwgLTMuNWRCICovCisJMHgyODgwMDBhMiwJCS8qIDIwLCAtNC4wZEIgKi8KKwkweDI2MDAwMDk4LAkJLyogMjEsIC00LjVkQiAqLworCTB4MjQwMDAwOTAsCQkvKiAyMiwgLTUuMGRCICovCisJMHgyMjAwMDA4OCwJCS8qIDIzLCAtNS41ZEIgKi8KKwkweDIwMDAwMDgwLAkJLyogMjQsIC02LjBkQiAqLworCTB4MWU0MDAwNzksCQkvKiAyNSwgLTYuNWRCICovCisJMHgxYzgwMDA3MiwJCS8qIDI2LCAtNy4wZEIgKi8KKwkweDFiMDAwMDZjLAkJLyogMjcuIC03LjVkQiAqLworCTB4MTk4MDAwNjYsCQkvKiAyOCwgLTguMGRCICovCisJMHgxODAwMDA2MCwJCS8qIDI5LCAtOC41ZEIgKi8KKwkweDE2YzAwMDViLAkJLyogMzAsIC05LjBkQiAqLworCTB4MTU4MDAwNTYsCQkvKiAzMSwgLTkuNWRCICovCisJMHgxNDQwMDA1MSwJCS8qIDMyLCAtMTAuMGRCICovCisJMHgxMzAwMDA0YywJCS8qIDMzLCAtMTAuNWRCICovCisJMHgxMjAwMDA0OCwJCS8qIDM0LCAtMTEuMGRCICovCisJMHgxMTAwMDA0NCwJCS8qIDM1LCAtMTEuNWRCICovCisJMHgxMDAwMDA0MCwJCS8qIDM2LCAtMTIuMGRCICovCisJMHgwZjAwMDAzYywJCS8qIDM3LCAtMTIuNWRCICovCisJMHgwZTQwMDAzOSwJCS8qIDM4LCAtMTMuMGRCICovCisJMHgwZDgwMDAzNiwJCS8qIDM5LCAtMTMuNWRCICovCisJMHgwY2MwMDAzMywJCS8qIDQwLCAtMTQuMGRCICovCisJMHgwYzAwMDAzMCwJCS8qIDQxLCAtMTQuNWRCICovCisJMHgwYjQwMDAyZCwJCS8qIDQyLCAtMTUuMGRCICovCit9OworCitzdGF0aWMgY29uc3QgdTggY2Nrc3dpbmdfdGFibGVfY2gxY2gxM1tDQ0tfVEFCTEVfU0laRV1bOF0gPSB7CisJezB4MzYsIDB4MzUsIDB4MmUsIDB4MjUsIDB4MWMsIDB4MTIsIDB4MDksIDB4MDR9LCAgICAvKiAwLCArMGRCICovCisJezB4MzMsIDB4MzIsIDB4MmIsIDB4MjMsIDB4MWEsIDB4MTEsIDB4MDgsIDB4MDR9LCAgICAvKiAxLCAtMC41ZEIgKi8KKwl7MHgzMCwgMHgyZiwgMHgyOSwgMHgyMSwgMHgxOSwgMHgxMCwgMHgwOCwgMHgwM30sICAgIC8qIDIsIC0xLjBkQiAqLworCXsweDJkLCAweDJkLCAweDI3LCAweDFmLCAweDE4LCAweDBmLCAweDA4LCAweDAzfSwgICAgLyogMywgLTEuNWRCICovCisJezB4MmIsIDB4MmEsIDB4MjUsIDB4MWUsIDB4MTYsIDB4MGUsIDB4MDcsIDB4MDN9LCAgICAvKiA0LCAtMi4wZEIgKi8KKwl7MHgyOCwgMHgyOCwgMHgyMiwgMHgxYywgMHgxNSwgMHgwZCwgMHgwNywgMHgwM30sICAgIC8qIDUsIC0yLjVkQiAqLworCXsweDI2LCAweDI1LCAweDIxLCAweDFiLCAweDE0LCAweDBkLCAweDA2LCAweDAzfSwgICAgLyogNiwgLTMuMGRCICovCisJezB4MjQsIDB4MjMsIDB4MWYsIDB4MTksIDB4MTMsIDB4MGMsIDB4MDYsIDB4MDN9LCAgICAvKiA3LCAtMy41ZEIgKi8KKwl7MHgyMiwgMHgyMSwgMHgxZCwgMHgxOCwgMHgxMSwgMHgwYiwgMHgwNiwgMHgwMn0sICAgIC8qIDgsIC00LjBkQiAqLworCXsweDIwLCAweDIwLCAweDFiLCAweDE2LCAweDExLCAweDA4LCAweDA1LCAweDAyfSwgICAgLyogOSwgLTQuNWRCICovCisJezB4MWYsIDB4MWUsIDB4MWEsIDB4MTUsIDB4MTAsIDB4MGEsIDB4MDUsIDB4MDJ9LCAgICAvKiAxMCwgLTUuMGRCICovCisJezB4MWQsIDB4MWMsIDB4MTgsIDB4MTQsIDB4MGYsIDB4MGEsIDB4MDUsIDB4MDJ9LCAgICAvKiAxMSwgLTUuNWRCICovCisJezB4MWIsIDB4MWEsIDB4MTcsIDB4MTMsIDB4MGUsIDB4MDksIDB4MDQsIDB4MDJ9LCAgICAvKiAxMiwgLTYuMGRCICovCisJezB4MWEsIDB4MTksIDB4MTYsIDB4MTIsIDB4MGQsIDB4MDksIDB4MDQsIDB4MDJ9LCAgICAvKiAxMywgLTYuNWRCICovCisJezB4MTgsIDB4MTcsIDB4MTUsIDB4MTEsIDB4MGMsIDB4MDgsIDB4MDQsIDB4MDJ9LCAgICAvKiAxNCwgLTcuMGRCICovCisJezB4MTcsIDB4MTYsIDB4MTMsIDB4MTAsIDB4MGMsIDB4MDgsIDB4MDQsIDB4MDJ9LCAgICAvKiAxNSwgLTcuNWRCICovCisJezB4MTYsIDB4MTUsIDB4MTIsIDB4MGYsIDB4MGIsIDB4MDcsIDB4MDQsIDB4MDF9LCAgICAvKiAxNiwgLTguMGRCICovCisJezB4MTQsIDB4MTQsIDB4MTEsIDB4MGUsIDB4MGIsIDB4MDcsIDB4MDMsIDB4MDJ9LCAgICAvKiAxNywgLTguNWRCICovCisJezB4MTMsIDB4MTMsIDB4MTAsIDB4MGQsIDB4MGEsIDB4MDYsIDB4MDMsIDB4MDF9LCAgICAvKiAxOCwgLTkuMGRCICovCisJezB4MTIsIDB4MTIsIDB4MGYsIDB4MGMsIDB4MDksIDB4MDYsIDB4MDMsIDB4MDF9LCAgICAvKiAxOSwgLTkuNWRCICovCisJezB4MTEsIDB4MTEsIDB4MGYsIDB4MGMsIDB4MDksIDB4MDYsIDB4MDMsIDB4MDF9LCAgICAvKiAyMCwgLTEwLjBkQiAqLworCXsweDEwLCAweDEwLCAweDBlLCAweDBiLCAweDA4LCAweDA1LCAweDAzLCAweDAxfSwgICAgLyogMjEsIC0xMC41ZEIgKi8KKwl7MHgwZiwgMHgwZiwgMHgwZCwgMHgwYiwgMHgwOCwgMHgwNSwgMHgwMywgMHgwMX0sICAgIC8qIDIyLCAtMTEuMGRCICovCisJezB4MGUsIDB4MGUsIDB4MGMsIDB4MGEsIDB4MDgsIDB4MDUsIDB4MDIsIDB4MDF9LCAgICAvKiAyMywgLTExLjVkQiAqLworCXsweDBkLCAweDBkLCAweDBjLCAweDBhLCAweDA3LCAweDA1LCAweDAyLCAweDAxfSwgICAgLyogMjQsIC0xMi4wZEIgKi8KKwl7MHgwZCwgMHgwYywgMHgwYiwgMHgwOSwgMHgwNywgMHgwNCwgMHgwMiwgMHgwMX0sICAgIC8qIDI1LCAtMTIuNWRCICovCisJezB4MGMsIDB4MGMsIDB4MGEsIDB4MDksIDB4MDYsIDB4MDQsIDB4MDIsIDB4MDF9LCAgICAvKiAyNiwgLTEzLjBkQiAqLworCXsweDBiLCAweDBiLCAweDBhLCAweDA4LCAweDA2LCAweDA0LCAweDAyLCAweDAxfSwgICAgLyogMjcsIC0xMy41ZEIgKi8KKwl7MHgwYiwgMHgwYSwgMHgwOSwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMiwgMHgwMX0sICAgIC8qIDI4LCAtMTQuMGRCICovCisJezB4MGEsIDB4MGEsIDB4MDksIDB4MDcsIDB4MDUsIDB4MDMsIDB4MDIsIDB4MDF9LCAgICAvKiAyOSwgLTE0LjVkQiAqLworCXsweDBhLCAweDA5LCAweDA4LCAweDA3LCAweDA1LCAweDAzLCAweDAyLCAweDAxfSwgICAgLyogMzAsIC0xNS4wZEIgKi8KKwl7MHgwOSwgMHgwOSwgMHgwOCwgMHgwNiwgMHgwNSwgMHgwMywgMHgwMSwgMHgwMX0sICAgIC8qIDMxLCAtMTUuNWRCICovCisJezB4MDksIDB4MDgsIDB4MDcsIDB4MDYsIDB4MDQsIDB4MDMsIDB4MDEsIDB4MDF9ICAgICAvKiAzMiwgLTE2LjBkQiAqLworfTsKKworc3RhdGljIGNvbnN0IHU4IGNja3N3aW5nX3RhYmxlX2NoMTRbQ0NLX1RBQkxFX1NJWkVdWzhdID0geworCXsweDM2LCAweDM1LCAweDJlLCAweDFiLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMCwgKzBkQiAqLworCXsweDMzLCAweDMyLCAweDJiLCAweDE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMSwgLTAuNWRCICovCisJezB4MzAsIDB4MmYsIDB4MjksIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAgICAvKiAyLCAtMS4wZEIgKi8KKwl7MHgyZCwgMHgyZCwgMHgxNywgMHgxNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sICAgIC8qIDMsIC0xLjVkQiAqLworCXsweDJiLCAweDJhLCAweDI1LCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogNCwgLTIuMGRCICovCisJezB4MjgsIDB4MjgsIDB4MjQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAgICAvKiA1LCAtMi41ZEIgKi8KKwl7MHgyNiwgMHgyNSwgMHgyMSwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sICAgIC8qIDYsIC0zLjBkQiAqLworCXsweDI0LCAweDIzLCAweDFmLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogNywgLTMuNWRCICovCisJezB4MjIsIDB4MjEsIDB4MWQsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAgICAvKiA4LCAtNC4wZEIgKi8KKwl7MHgyMCwgMHgyMCwgMHgxYiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sICAgIC8qIDksIC00LjVkQiAqLworCXsweDFmLCAweDFlLCAweDFhLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMTAsIC01LjBkQiAqLworCXsweDFkLCAweDFjLCAweDE4LCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMTEsIC01LjVkQiAqLworCXsweDFiLCAweDFhLCAweDE3LCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMTIsIC02LjBkQiAqLworCXsweDFhLCAweDE5LCAweDE2LCAweDBkLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMTMsIC02LjVkQiAqLworCXsweDE4LCAweDE3LCAweDE1LCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMTQsIC03LjBkQiAqLworCXsweDE3LCAweDE2LCAweDEzLCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMTUsIC03LjVkQiAqLworCXsweDE2LCAweDE1LCAweDEyLCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMTYsIC04LjBkQiAqLworCXsweDE0LCAweDE0LCAweDExLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMTcsIC04LjVkQiAqLworCXsweDEzLCAweDEzLCAweDEwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMTgsIC05LjBkQiAqLworCXsweDEyLCAweDEyLCAweDBmLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMTksIC05LjVkQiAqLworCXsweDExLCAweDExLCAweDBmLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMjAsIC0xMC4wZEIgKi8KKwl7MHgxMCwgMHgxMCwgMHgwZSwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sICAgIC8qIDIxLCAtMTAuNWRCICovCisJezB4MGYsIDB4MGYsIDB4MGQsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAgICAvKiAyMiwgLTExLjBkQiAqLworCXsweDBlLCAweDBlLCAweDBjLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMjMsIC0xMS41ZEIgKi8KKwl7MHgwZCwgMHgwZCwgMHgwYywgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sICAgIC8qIDI0LCAtMTIuMGRCICovCisJezB4MGQsIDB4MGMsIDB4MGIsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAgICAvKiAyNSwgLTEyLjVkQiAqLworCXsweDBjLCAweDBjLCAweDBhLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMjYsIC0xMy4wZEIgKi8KKwl7MHgwYiwgMHgwYiwgMHgwYSwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sICAgIC8qIDI3LCAtMTMuNWRCICovCisJezB4MGIsIDB4MGEsIDB4MDksIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAgICAvKiAyOCwgLTE0LjBkQiAqLworCXsweDBhLCAweDBhLCAweDA5LCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgICAgLyogMjksIC0xNC41ZEIgKi8KKwl7MHgwYSwgMHgwOSwgMHgwOCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sICAgIC8qIDMwLCAtMTUuMGRCICovCisJezB4MDksIDB4MDksIDB4MDgsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAgICAvKiAzMSwgLTE1LjVkQiAqLworCXsweDA5LCAweDA4LCAweDA3LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSAgICAgLyogMzIsIC0xNi4wZEIgKi8KK307CisKK3N0YXRpYyB2b2lkIHJ0bDkyZF9kbV9kaWdpbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCWRlX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZyA9IHRydWU7CisJZGVfZGlndGFibGUuZGlnX2V4dF9wb3J0X3N0YWdlID0gRElHX0VYVF9QT1JUX1NUQUdFX01BWDsKKwlkZV9kaWd0YWJsZS5jdXJfaWd2YWx1ZSA9IDB4MjA7CisJZGVfZGlndGFibGUucHJlX2lndmFsdWUgPSAweDA7CisJZGVfZGlndGFibGUuY3Vyc3RhX2Nvbm5lY3RjdGF0ZSA9IERJR19TVEFfRElTQ09OTkVDVDsKKwlkZV9kaWd0YWJsZS5wcmVzdGFfY29ubmVjdHN0YXRlID0gRElHX1NUQV9ESVNDT05ORUNUOworCWRlX2RpZ3RhYmxlLmN1cm11bHRpc3RhX2Nvbm5lY3RzdGF0ZSA9IERJR19NVUxUSVNUQV9ESVNDT05ORUNUOworCWRlX2RpZ3RhYmxlLnJzc2lfbG93dGhyZXNoID0gRE1fRElHX1RIUkVTSF9MT1c7CisJZGVfZGlndGFibGUucnNzaV9oaWdodGhyZXNoID0gRE1fRElHX1RIUkVTSF9ISUdIOworCWRlX2RpZ3RhYmxlLmZhX2xvd3RocmVzaCA9IERNX0ZBTFNFQUxBUk1fVEhSRVNIX0xPVzsKKwlkZV9kaWd0YWJsZS5mYV9oaWdodGhyZXNoID0gRE1fRkFMU0VBTEFSTV9USFJFU0hfSElHSDsKKwlkZV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21heCA9IERNX0RJR19GQV9VUFBFUjsKKwlkZV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbiA9IERNX0RJR19GQV9MT1dFUjsKKwlkZV9kaWd0YWJsZS5iYWNrb2ZmX3ZhbCA9IERNX0RJR19CQUNLT0ZGX0RFRkFVTFQ7CisJZGVfZGlndGFibGUuYmFja29mZl92YWxfcmFuZ2VfbWF4ID0gRE1fRElHX0JBQ0tPRkZfTUFYOworCWRlX2RpZ3RhYmxlLmJhY2tvZmZfdmFsX3JhbmdlX21pbiA9IERNX0RJR19CQUNLT0ZGX01JTjsKKwlkZV9kaWd0YWJsZS5wcmVfY2NrX3BkX3N0YXRlID0gQ0NLX1BEX1NUQUdFX0xPV1JTU0k7CisJZGVfZGlndGFibGUuY3VyX2Nja19wZF9zdGF0ZSA9IENDS19QRF9TVEFHRV9NQVg7CisJZGVfZGlndGFibGUubGFyZ2VfZmFfaGl0ID0gMDsKKwlkZV9kaWd0YWJsZS5yZWNvdmVyX2NudCA9IDA7CisJZGVfZGlndGFibGUuZm9yYmlkZGVuX2lnaSA9IERNX0RJR19GQV9MT1dFUjsKK30KKworc3RhdGljIHZvaWQgcnRsOTJkX2RtX2ZhbHNlX2FsYXJtX2NvdW50ZXJfc3RhdGlzdGljcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwl1MzIgcmV0X3ZhbHVlOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdGlzdGljcyAqZmFsc2VhbG1fY250ID0gJihydGxwcml2LT5mYWxzZWFsbV9jbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZyA9IDA7CisKKwkvKiBob2xkIG9mZG0gY291bnRlciAqLworCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9MU1RGLCBCSVQoMzEpLCAxKTsgLyogaG9sZCBwYWdlIEMgY291bnRlciAqLworCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMV9MU1RGLCBCSVQoMzEpLCAxKTsgLypob2xkIHBhZ2UgRCBjb3VudGVyICovCisKKwlyZXRfdmFsdWUgPSBydGxfZ2V0X2JicmVnKGh3LCBST0ZETTBfRlJBTUVTWU5DLCBCTUFTS0RXT1JEKTsKKwlmYWxzZWFsbV9jbnQtPmNudF9mYXN0X2ZzeW5jX2ZhaWwgPSAocmV0X3ZhbHVlICYgMHhmZmZmKTsKKwlmYWxzZWFsbV9jbnQtPmNudF9zYl9zZWFyY2hfZmFpbCA9ICgocmV0X3ZhbHVlICYgMHhmZmZmMDAwMCkgPj4gMTYpOworCXJldF92YWx1ZSA9IHJ0bF9nZXRfYmJyZWcoaHcsIFJPRkRNX1BIWUNPVU5URVIxLCBCTUFTS0RXT1JEKTsKKwlmYWxzZWFsbV9jbnQtPmNudF9wYXJpdHlfZmFpbCA9ICgocmV0X3ZhbHVlICYgMHhmZmZmMDAwMCkgPj4gMTYpOworCXJldF92YWx1ZSA9IHJ0bF9nZXRfYmJyZWcoaHcsIFJPRkRNX1BIWUNPVU5URVIyLCBCTUFTS0RXT1JEKTsKKwlmYWxzZWFsbV9jbnQtPmNudF9yYXRlX2lsbGVnYWwgPSAocmV0X3ZhbHVlICYgMHhmZmZmKTsKKwlmYWxzZWFsbV9jbnQtPmNudF9jcmM4X2ZhaWwgPSAoKHJldF92YWx1ZSAmIDB4ZmZmZjAwMDApID4+IDE2KTsKKwlyZXRfdmFsdWUgPSBydGxfZ2V0X2JicmVnKGh3LCBST0ZETV9QSFlDT1VOVEVSMywgQk1BU0tEV09SRCk7CisJZmFsc2VhbG1fY250LT5jbnRfbWNzX2ZhaWwgPSAocmV0X3ZhbHVlICYgMHhmZmZmKTsKKwlmYWxzZWFsbV9jbnQtPmNudF9vZmRtX2ZhaWwgPSBmYWxzZWFsbV9jbnQtPmNudF9wYXJpdHlfZmFpbCArCisJCQkJICAgICAgZmFsc2VhbG1fY250LT5jbnRfcmF0ZV9pbGxlZ2FsICsKKwkJCQkgICAgICBmYWxzZWFsbV9jbnQtPmNudF9jcmM4X2ZhaWwgKworCQkJCSAgICAgIGZhbHNlYWxtX2NudC0+Y250X21jc19mYWlsICsKKwkJCQkgICAgICBmYWxzZWFsbV9jbnQtPmNudF9mYXN0X2ZzeW5jX2ZhaWwgKworCQkJCSAgICAgIGZhbHNlYWxtX2NudC0+Y250X3NiX3NlYXJjaF9mYWlsOworCisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5jdXJyZW50X2JhbmR0eXBlICE9IEJBTkRfT05fNUcpIHsKKwkJLyogaG9sZCBjY2sgY291bnRlciAqLworCQlydGw5MmRfYWNxdWlyZV9jY2thbmRyd19wYWdlYV9jdGwoaHcsICZmbGFnKTsKKwkJcmV0X3ZhbHVlID0gcnRsX2dldF9iYnJlZyhodywgUkNDSzBfRkFDT1VOVEVSTE9XRVIsIEJNQVNLQllURTApOworCQlmYWxzZWFsbV9jbnQtPmNudF9jY2tfZmFpbCA9IHJldF92YWx1ZTsKKwkJcmV0X3ZhbHVlID0gcnRsX2dldF9iYnJlZyhodywgUkNDSzBfRkFDT1VOVEVSVVBQRVIsIEJNQVNLQllURTMpOworCQlmYWxzZWFsbV9jbnQtPmNudF9jY2tfZmFpbCArPSAocmV0X3ZhbHVlICYgMHhmZikgPDwgODsKKwkJcnRsOTJkX3JlbGVhc2VfY2NrYW5kcndfcGFnZWFfY3RsKGh3LCAmZmxhZyk7CisJfSBlbHNlIHsKKwkJZmFsc2VhbG1fY250LT5jbnRfY2NrX2ZhaWwgPSAwOworCX0KKworCS8qIHJlc2V0IGZhbHNlIGFsYXJtIGNvdW50ZXIgcmVnaXN0ZXJzICovCisJZmFsc2VhbG1fY250LT5jbnRfYWxsID0gZmFsc2VhbG1fY250LT5jbnRfZmFzdF9mc3luY19mYWlsICsKKwkJCQlmYWxzZWFsbV9jbnQtPmNudF9zYl9zZWFyY2hfZmFpbCArCisJCQkJZmFsc2VhbG1fY250LT5jbnRfcGFyaXR5X2ZhaWwgKworCQkJCWZhbHNlYWxtX2NudC0+Y250X3JhdGVfaWxsZWdhbCArCisJCQkJZmFsc2VhbG1fY250LT5jbnRfY3JjOF9mYWlsICsKKwkJCQlmYWxzZWFsbV9jbnQtPmNudF9tY3NfZmFpbCArCisJCQkJZmFsc2VhbG1fY250LT5jbnRfY2NrX2ZhaWw7CisKKwlydGxfc2V0X2JicmVnKGh3LCBST0ZETTFfTFNURiwgMHgwODAwMDAwMCwgMSk7CisJLyogdXBkYXRlIG9mZG0gY291bnRlciAqLworCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMV9MU1RGLCAweDA4MDAwMDAwLCAwKTsKKwkvKiB1cGRhdGUgcGFnZSBDIGNvdW50ZXIgKi8KKwlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfTFNURiwgQklUKDMxKSwgMCk7CisJLyogdXBkYXRlIHBhZ2UgRCBjb3VudGVyICovCisJcnRsX3NldF9iYnJlZyhodywgUk9GRE0xX0xTVEYsIEJJVCgzMSksIDApOworCWlmIChydGxwcml2LT5ydGxoYWwuY3VycmVudF9iYW5kdHlwZSAhPSBCQU5EX09OXzVHKSB7CisJCS8qIHJlc2V0IGNjayBjb3VudGVyICovCisJCXJ0bDkyZF9hY3F1aXJlX2Nja2FuZHJ3X3BhZ2VhX2N0bChodywgJmZsYWcpOworCQlydGxfc2V0X2JicmVnKGh3LCBSQ0NLMF9GQUxTRUFMQVJNUkVQT1JULCAweDAwMDBjMDAwLCAwKTsKKwkJLyogZW5hYmxlIGNjayBjb3VudGVyICovCisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJDQ0swX0ZBTFNFQUxBUk1SRVBPUlQsIDB4MDAwMGMwMDAsIDIpOworCQlydGw5MmRfcmVsZWFzZV9jY2thbmRyd19wYWdlYV9jdGwoaHcsICZmbGFnKTsKKwl9CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9ESUcsIERCR19MT1VELCAoIkNudF9GYXN0X0ZzeW5jX2ZhaWwgPSAleCwgIgorCQkgIkNudF9TQl9TZWFyY2hfZmFpbCA9ICV4XG4iLAorCQkgZmFsc2VhbG1fY250LT5jbnRfZmFzdF9mc3luY19mYWlsLAorCQkgZmFsc2VhbG1fY250LT5jbnRfc2Jfc2VhcmNoX2ZhaWwpKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0RJRywgREJHX0xPVUQsICgiQ250X1Bhcml0eV9GYWlsID0gJXgsICIKKwkJICJDbnRfUmF0ZV9JbGxlZ2FsID0gJXgsIENudF9DcmM4X2ZhaWwgPSAleCwgIgorCQkgIkNudF9NY3NfZmFpbCA9ICV4XG4iLAorCQkgZmFsc2VhbG1fY250LT5jbnRfcGFyaXR5X2ZhaWwsCisJCSBmYWxzZWFsbV9jbnQtPmNudF9yYXRlX2lsbGVnYWwsCisJCSBmYWxzZWFsbV9jbnQtPmNudF9jcmM4X2ZhaWwsCisJCSBmYWxzZWFsbV9jbnQtPmNudF9tY3NfZmFpbCkpOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRElHLCBEQkdfTE9VRCwKKwkJICgiQ250X09mZG1fZmFpbCA9ICV4LCAiICJDbnRfQ2NrX2ZhaWwgPSAleCwgIgorCQkgIkNudF9hbGwgPSAleFxuIiwKKwkJIGZhbHNlYWxtX2NudC0+Y250X29mZG1fZmFpbCwKKwkJIGZhbHNlYWxtX2NudC0+Y250X2Nja19mYWlsLAorCQkgZmFsc2VhbG1fY250LT5jbnRfYWxsKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDkyZF9kbV9maW5kX21pbmltdW1fcnNzaShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRscHJpdik7CisKKwkvKiBEZXRlcm1pbmUgdGhlIG1pbmltdW0gUlNTSSAgKi8KKwlpZiAoKG1hYy0+bGlua19zdGF0ZSA8IE1BQzgwMjExX0xJTktFRCkgJiYKKwkgICAgKHJ0bHByaXYtPmRtLlVOREVDX1NNX1BXREIgPT0gMCkpIHsKKwkJZGVfZGlndGFibGUubWluX3VuZGVjb3JhdGVkX3B3ZGJfZm9yX2RtID0gMDsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9CQl9QT1dFUlNBVklORywgREJHX0xPVUQsCisJCQkgKCJOb3QgY29ubmVjdGVkIHRvIGFueVxuIikpOworCX0KKwlpZiAobWFjLT5saW5rX3N0YXRlID49IE1BQzgwMjExX0xJTktFRCkgeworCQlpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkJICAgIG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CisJCQlkZV9kaWd0YWJsZS5taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG0gPQorCQkJICAgIHJ0bHByaXYtPmRtLlVOREVDX1NNX1BXREI7CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0JCX1BPV0VSU0FWSU5HLCBEQkdfTE9VRCwKKwkJCQkgKCJBUCBDbGllbnQgUFdEQiA9IDB4JWx4XG4iLAorCQkJCSAgcnRscHJpdi0+ZG0uVU5ERUNfU01fUFdEQikpOworCQl9IGVsc2UgeworCQkJZGVfZGlndGFibGUubWluX3VuZGVjb3JhdGVkX3B3ZGJfZm9yX2RtID0KKwkJCSAgICBydGxwcml2LT5kbS51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9CQl9QT1dFUlNBVklORywgREJHX0xPVUQsCisJCQkJICgiU1RBIERlZmF1bHQgUG9ydCBQV0RCID0gMHgleFxuIiwKKwkJCQkgIGRlX2RpZ3RhYmxlLm1pbl91bmRlY29yYXRlZF9wd2RiX2Zvcl9kbSkpOworCQl9CisJfSBlbHNlIHsKKwkJZGVfZGlndGFibGUubWluX3VuZGVjb3JhdGVkX3B3ZGJfZm9yX2RtID0KKwkJICAgIHJ0bHByaXYtPmRtLlVOREVDX1NNX1BXREI7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQkJfUE9XRVJTQVZJTkcsIERCR19MT1VELAorCQkJICgiQVAgRXh0IFBvcnQgb3IgZGlzY29ubmV0IFBXREIgPSAweCV4XG4iLAorCQkJICBkZV9kaWd0YWJsZS5taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG0pKTsKKwl9CisKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0RJRywgREJHX0xPVUQsICgiTWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0gPSVkXG4iLAorCQkJZGVfZGlndGFibGUubWluX3VuZGVjb3JhdGVkX3B3ZGJfZm9yX2RtKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDkyZF9kbV9jY2tfcGFja2V0X2RldGVjdGlvbl90aHJlc2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXVuc2lnbmVkIGxvbmcgZmxhZyA9IDA7CisKKwlpZiAoZGVfZGlndGFibGUuY3Vyc3RhX2Nvbm5lY3RjdGF0ZSA9PSBESUdfU1RBX0NPTk5FQ1QpIHsKKwkJaWYgKGRlX2RpZ3RhYmxlLnByZV9jY2tfcGRfc3RhdGUgPT0gQ0NLX1BEX1NUQUdFX0xPV1JTU0kpIHsKKwkJCWlmIChkZV9kaWd0YWJsZS5taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG0gPD0gMjUpCisJCQkJZGVfZGlndGFibGUuY3VyX2Nja19wZF9zdGF0ZSA9CisJCQkJCQkJIENDS19QRF9TVEFHRV9MT1dSU1NJOworCQkJZWxzZQorCQkJCWRlX2RpZ3RhYmxlLmN1cl9jY2tfcGRfc3RhdGUgPQorCQkJCQkJCSBDQ0tfUERfU1RBR0VfSElHSFJTU0k7CisJCX0gZWxzZSB7CisJCQlpZiAoZGVfZGlndGFibGUubWluX3VuZGVjb3JhdGVkX3B3ZGJfZm9yX2RtIDw9IDIwKQorCQkJCWRlX2RpZ3RhYmxlLmN1cl9jY2tfcGRfc3RhdGUgPQorCQkJCQkJCSBDQ0tfUERfU1RBR0VfTE9XUlNTSTsKKwkJCWVsc2UKKwkJCQlkZV9kaWd0YWJsZS5jdXJfY2NrX3BkX3N0YXRlID0KKwkJCQkJCQkgQ0NLX1BEX1NUQUdFX0hJR0hSU1NJOworCQl9CisJfSBlbHNlIHsKKwkJZGVfZGlndGFibGUuY3VyX2Nja19wZF9zdGF0ZSA9IENDS19QRF9TVEFHRV9MT1dSU1NJOworCX0KKwlpZiAoZGVfZGlndGFibGUucHJlX2Nja19wZF9zdGF0ZSAhPSBkZV9kaWd0YWJsZS5jdXJfY2NrX3BkX3N0YXRlKSB7CisJCWlmIChkZV9kaWd0YWJsZS5jdXJfY2NrX3BkX3N0YXRlID09IENDS19QRF9TVEFHRV9MT1dSU1NJKSB7CisJCQlydGw5MmRfYWNxdWlyZV9jY2thbmRyd19wYWdlYV9jdGwoaHcsICZmbGFnKTsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJDQ0swX0NDQSwgQk1BU0tCWVRFMiwgMHg4Myk7CisJCQlydGw5MmRfcmVsZWFzZV9jY2thbmRyd19wYWdlYV9jdGwoaHcsICZmbGFnKTsKKwkJfSBlbHNlIHsKKwkJCXJ0bDkyZF9hY3F1aXJlX2Nja2FuZHJ3X3BhZ2VhX2N0bChodywgJmZsYWcpOworCQkJcnRsX3NldF9iYnJlZyhodywgUkNDSzBfQ0NBLCBCTUFTS0JZVEUyLCAweGNkKTsKKwkJCXJ0bDkyZF9yZWxlYXNlX2Nja2FuZHJ3X3BhZ2VhX2N0bChodywgJmZsYWcpOworCQl9CisJCWRlX2RpZ3RhYmxlLnByZV9jY2tfcGRfc3RhdGUgPSBkZV9kaWd0YWJsZS5jdXJfY2NrX3BkX3N0YXRlOworCX0KKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0RJRywgREJHX0xPVUQsICgiQ3VyU1RBQ29ubmVjdFN0YXRlPSVzXG4iLAorCQkgKGRlX2RpZ3RhYmxlLmN1cnN0YV9jb25uZWN0Y3RhdGUgPT0gRElHX1NUQV9DT05ORUNUID8KKwkJICJESUdfU1RBX0NPTk5FQ1QgIiA6ICJESUdfU1RBX0RJU0NPTk5FQ1QiKSkpOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRElHLCBEQkdfTE9VRCwgKCJDQ0tQRFN0YWdlPSVzXG4iLAorCQkgKGRlX2RpZ3RhYmxlLmN1cl9jY2tfcGRfc3RhdGUgPT0gQ0NLX1BEX1NUQUdFX0xPV1JTU0kgPworCQkgIkxvdyBSU1NJICIgOiAiSGlnaCBSU1NJICIpKSk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9ESUcsIERCR19MT1VELCAoImlzOTJkIHNpbmdsZSBwaHkgPSV4XG4iLAorCQkgSVNfOTJEX1NJTkdMRVBIWShydGxwcml2LT5ydGxoYWwudmVyc2lvbikpKTsKKworfQorCit2b2lkIHJ0bDkyZF9kbV93cml0ZV9kaWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9ESUcsIERCR19MT1VELCAoImN1cl9pZ3ZhbHVlID0gMHgleCwgIgorCQkgInByZV9pZ3ZhbHVlID0gMHgleCwgYmFja29mZl92YWwgPSAlZFxuIiwKKwkJIGRlX2RpZ3RhYmxlLmN1cl9pZ3ZhbHVlLCBkZV9kaWd0YWJsZS5wcmVfaWd2YWx1ZSwKKwkJIGRlX2RpZ3RhYmxlLmJhY2tvZmZfdmFsKSk7CisJaWYgKGRlX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZyA9PSBmYWxzZSkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0RJRywgREJHX0xPVUQsICgiRElHIGlzIGRpc2FibGVkXG4iKSk7CisJCWRlX2RpZ3RhYmxlLnByZV9pZ3ZhbHVlID0gMHgxNzsKKwkJcmV0dXJuOworCX0KKwlpZiAoZGVfZGlndGFibGUucHJlX2lndmFsdWUgIT0gZGVfZGlndGFibGUuY3VyX2lndmFsdWUpIHsKKwkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1hBQUdDQ09SRTEsIDB4N2YsCisJCQkgICAgICBkZV9kaWd0YWJsZS5jdXJfaWd2YWx1ZSk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQkFHQ0NPUkUxLCAweDdmLAorCQkJICAgICAgZGVfZGlndGFibGUuY3VyX2lndmFsdWUpOworCQlkZV9kaWd0YWJsZS5wcmVfaWd2YWx1ZSA9IGRlX2RpZ3RhYmxlLmN1cl9pZ3ZhbHVlOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsOTJkX2Vhcmx5X21vZGVfZW5hYmxlZChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpCit7CisJaWYgKChydGxwcml2LT5tYWM4MDIxMS5saW5rX3N0YXRlID49IE1BQzgwMjExX0xJTktFRCkgJiYKKwkgICAgKHJ0bHByaXYtPm1hYzgwMjExLnZlbmRvciA9PSBQRUVSX0NJU0NPKSkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0RJRywgREJHX0xPVUQsCisJCQkgKCJJT1RfUEVFUiA9IENJU0NPXG4iKSk7CisJCWlmIChkZV9kaWd0YWJsZS5sYXN0X21pbl91bmRlY29yYXRlZF9wd2RiX2Zvcl9kbSA+PSA1MAorCQkgICAgJiYgZGVfZGlndGFibGUubWluX3VuZGVjb3JhdGVkX3B3ZGJfZm9yX2RtIDwgNTApIHsKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19FQVJMWV9NT0RFX0NPTlRST0wsIDB4MDApOworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9ESUcsIERCR19MT1VELAorCQkJCSAoIkVhcmx5IE1vZGUgT2ZmXG4iKSk7CisJCX0gZWxzZSBpZiAoZGVfZGlndGFibGUubGFzdF9taW5fdW5kZWNvcmF0ZWRfcHdkYl9mb3JfZG0gPD0gNTUgJiYKKwkJCSAgIGRlX2RpZ3RhYmxlLm1pbl91bmRlY29yYXRlZF9wd2RiX2Zvcl9kbSA+IDU1KSB7CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfRUFSTFlfTU9ERV9DT05UUk9MLCAweDBmKTsKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRElHLCBEQkdfTE9VRCwKKwkJCQkgKCJFYXJseSBNb2RlIE9uXG4iKSk7CisJCX0KKwl9IGVsc2UgaWYgKCEocnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfRUFSTFlfTU9ERV9DT05UUk9MKSAmIDB4ZikpIHsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0VBUkxZX01PREVfQ09OVFJPTCwgMHgwZik7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRElHLCBEQkdfTE9VRCwgKCJFYXJseSBNb2RlIE9uXG4iKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBydGw5MmRfZG1fZGlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCB2YWx1ZV9pZ2kgPSBkZV9kaWd0YWJsZS5jdXJfaWd2YWx1ZTsKKwlzdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdGlzdGljcyAqZmFsc2VhbG1fY250ID0gJihydGxwcml2LT5mYWxzZWFsbV9jbnQpOworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9ESUcsIERCR19MT1VELCAoIj09PlxuIikpOworCWlmIChydGxwcml2LT5ydGxoYWwuZWFybHltb2RlX2VuYWJsZSkgeworCQlydGw5MmRfZWFybHlfbW9kZV9lbmFibGVkKHJ0bHByaXYpOworCQlkZV9kaWd0YWJsZS5sYXN0X21pbl91bmRlY29yYXRlZF9wd2RiX2Zvcl9kbSA9CisJCQkJIGRlX2RpZ3RhYmxlLm1pbl91bmRlY29yYXRlZF9wd2RiX2Zvcl9kbTsKKwl9CisJaWYgKHJ0bHByaXYtPmRtLmRtX2luaXRpYWxnYWluX2VuYWJsZSA9PSBmYWxzZSkKKwkJcmV0dXJuOworCisJLyogYmVjYXVzZSB3ZSB3aWxsIHNlbmQgZGF0YSBwa3Qgd2hlbiBzY2FubmluZworCSAqIHRoaXMgd2lsbCBjYXVzZSBzb21lIGFwIGxpa2UgZ2Vhci0zNzAwIHdlcCBUUAorCSAqIGxvd2VyIGlmIHdlIHJldHJ1biBoZXJlLCB0aGlzIGlzIHRoZSBkaWZmIG9mCisJICogbWFjODAyMTEgZHJpdmVyIHZzIGllZWU4MDIxMSBkcml2ZXIgKi8KKwkvKiBpZiAocnRscHJpdi0+bWFjODAyMTEuYWN0X3NjYW5uaW5nKQorCSAqICAgICAgcmV0dXJuOyAqLworCisJLyogTm90IFNUQSBtb2RlIHJldHVybiB0bXAgKi8KKwlpZiAocnRscHJpdi0+bWFjODAyMTEub3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCXJldHVybjsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0RJRywgREJHX0xPVUQsICgicHJvZ3Jlc3NcbiIpKTsKKwkvKiBEZWNpZGUgdGhlIGN1cnJlbnQgc3RhdHVzIGFuZCBpZiBtb2RpZnkgaW5pdGlhbCBnYWluIG9yIG5vdCAqLworCWlmIChydGxwcml2LT5tYWM4MDIxMS5saW5rX3N0YXRlID49IE1BQzgwMjExX0xJTktFRCkKKwkJZGVfZGlndGFibGUuY3Vyc3RhX2Nvbm5lY3RjdGF0ZSA9IERJR19TVEFfQ09OTkVDVDsKKwllbHNlCisJCWRlX2RpZ3RhYmxlLmN1cnN0YV9jb25uZWN0Y3RhdGUgPSBESUdfU1RBX0RJU0NPTk5FQ1Q7CisKKwkvKiBhZGp1c3QgaW5pdGlhbCBnYWluIGFjY29yZGluZyB0byBmYWxzZSBhbGFybSBjb3VudGVyICovCisJaWYgKGZhbHNlYWxtX2NudC0+Y250X2FsbCA8IERNX0RJR19GQV9USDApCisJCXZhbHVlX2lnaS0tOworCWVsc2UgaWYgKGZhbHNlYWxtX2NudC0+Y250X2FsbCA8IERNX0RJR19GQV9USDEpCisJCXZhbHVlX2lnaSArPSAwOworCWVsc2UgaWYgKGZhbHNlYWxtX2NudC0+Y250X2FsbCA8IERNX0RJR19GQV9USDIpCisJCXZhbHVlX2lnaSsrOworCWVsc2UgaWYgKGZhbHNlYWxtX2NudC0+Y250X2FsbCA+PSBETV9ESUdfRkFfVEgyKQorCQl2YWx1ZV9pZ2kgKz0gMjsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0RJRywgREJHX0xPVUQsCisJCSAoImRtX0RJRygpIEJlZm9yZTogbGFyZ2VfZmFfaGl0PSVkLCBmb3JiaWRkZW5faWdpPSV4XG4iLAorCQkgZGVfZGlndGFibGUubGFyZ2VfZmFfaGl0LCBkZV9kaWd0YWJsZS5mb3JiaWRkZW5faWdpKSk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9ESUcsIERCR19MT1VELAorCQkgKCJkbV9ESUcoKSBCZWZvcmU6IFJlY292ZXJfY250PSVkLCByeF9nYWluX3JhbmdlX21pbj0leFxuIiwKKwkJIGRlX2RpZ3RhYmxlLnJlY292ZXJfY250LCBkZV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbikpOworCisJLyogZGVhbCB3aXRoIGFibm9yYWxseSBsYXJnZSBmYWxzZSBhbGFybSAqLworCWlmIChmYWxzZWFsbV9jbnQtPmNudF9hbGwgPiAxMDAwMCkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0RJRywgREJHX0xPVUQsCisJCQkgKCJkbV9ESUcoKTogQWJub3JuYWxseSBmYWxzZSBhbGFybSBjYXNlLlxuIikpOworCisJCWRlX2RpZ3RhYmxlLmxhcmdlX2ZhX2hpdCsrOworCQlpZiAoZGVfZGlndGFibGUuZm9yYmlkZGVuX2lnaSA8IGRlX2RpZ3RhYmxlLmN1cl9pZ3ZhbHVlKSB7CisJCQlkZV9kaWd0YWJsZS5mb3JiaWRkZW5faWdpID0gZGVfZGlndGFibGUuY3VyX2lndmFsdWU7CisJCQlkZV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQgPSAxOworCQl9CisJCWlmIChkZV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQgPj0gMykgeworCQkJaWYgKChkZV9kaWd0YWJsZS5mb3JiaWRkZW5faWdpICsgMSkgPiBETV9ESUdfTUFYKQorCQkJCWRlX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWluID0gRE1fRElHX01BWDsKKwkJCWVsc2UKKwkJCQlkZV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbiA9CisJCQkJICAgIChkZV9kaWd0YWJsZS5mb3JiaWRkZW5faWdpICsgMSk7CisJCQlkZV9kaWd0YWJsZS5yZWNvdmVyX2NudCA9IDM2MDA7CS8qIDM2MDA9MmhyICovCisJCX0KKwl9IGVsc2UgeworCQkvKiBSZWNvdmVyeSBtZWNoYW5pc20gZm9yIElHSSBsb3dlciBib3VuZCAqLworCQlpZiAoZGVfZGlndGFibGUucmVjb3Zlcl9jbnQgIT0gMCkgeworCQkJZGVfZGlndGFibGUucmVjb3Zlcl9jbnQtLTsKKwkJfSBlbHNlIHsKKwkJCWlmIChkZV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQgPT0gMCkgeworCQkJCWlmICgoZGVfZGlndGFibGUuZm9yYmlkZGVuX2lnaSAtIDEpIDwKKwkJCQkgICAgRE1fRElHX0ZBX0xPV0VSKSB7CisJCQkJCWRlX2RpZ3RhYmxlLmZvcmJpZGRlbl9pZ2kgPQorCQkJCQkJCSBETV9ESUdfRkFfTE9XRVI7CisJCQkJCWRlX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWluID0KKwkJCQkJCQkgRE1fRElHX0ZBX0xPV0VSOworCisJCQkJfSBlbHNlIHsKKwkJCQkJZGVfZGlndGFibGUuZm9yYmlkZGVuX2lnaS0tOworCQkJCQlkZV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbiA9CisJCQkJCSAgICAoZGVfZGlndGFibGUuZm9yYmlkZGVuX2lnaSArIDEpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoZGVfZGlndGFibGUubGFyZ2VfZmFfaGl0ID09IDMpIHsKKwkJCQlkZV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQgPSAwOworCQkJfQorCQl9CisJfQorCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRElHLCBEQkdfTE9VRCwKKwkJICgiZG1fRElHKCkgQWZ0ZXI6IGxhcmdlX2ZhX2hpdD0lZCwgZm9yYmlkZGVuX2lnaT0leFxuIiwKKwkJICBkZV9kaWd0YWJsZS5sYXJnZV9mYV9oaXQsIGRlX2RpZ3RhYmxlLmZvcmJpZGRlbl9pZ2kpKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0RJRywgREJHX0xPVUQsCisJCSAoImRtX0RJRygpIEFmdGVyOiByZWNvdmVyX2NudD0lZCwgcnhfZ2Fpbl9yYW5nZV9taW49JXhcbiIsCisJCSAgZGVfZGlndGFibGUucmVjb3Zlcl9jbnQsIGRlX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWluKSk7CisKKwlpZiAodmFsdWVfaWdpID4gRE1fRElHX01BWCkKKwkJdmFsdWVfaWdpID0gRE1fRElHX01BWDsKKwllbHNlIGlmICh2YWx1ZV9pZ2kgPCBkZV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbikKKwkJdmFsdWVfaWdpID0gZGVfZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW47CisJZGVfZGlndGFibGUuY3VyX2lndmFsdWUgPSB2YWx1ZV9pZ2k7CisJcnRsOTJkX2RtX3dyaXRlX2RpZyhodyk7CisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5jdXJyZW50X2JhbmR0eXBlICE9IEJBTkRfT05fNUcpCisJCXJ0bDkyZF9kbV9jY2tfcGFja2V0X2RldGVjdGlvbl90aHJlc2goaHcpOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRElHLCBEQkdfTE9VRCwgKCI8PD09XG4iKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDkyZF9kbV9pbml0X2R5bmFtaWNfdHhwb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxwcml2LT5kbS5keW5hbWljX3R4cG93ZXJfZW5hYmxlID0gdHJ1ZTsKKwlydGxwcml2LT5kbS5sYXN0X2R0cF9sdmwgPSBUWEhJR0hQV1JMRVZFTF9OT1JNQUw7CisJcnRscHJpdi0+ZG0uZHluYW1pY190eGhpZ2hwb3dlcl9sdmwgPSBUWEhJR0hQV1JMRVZFTF9OT1JNQUw7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDkyZF9kbV9keW5hbWljX3R4cG93ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRscHJpdik7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlsb25nIHVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CisKKwlpZiAoKCFydGxwcml2LT5kbS5keW5hbWljX3R4cG93ZXJfZW5hYmxlKQorCSAgICB8fCBydGxwcml2LT5kbS5kbV9mbGFnICYgSEFMX0RNX0hJUFdSX0RJU0FCTEUpIHsKKwkJcnRscHJpdi0+ZG0uZHluYW1pY190eGhpZ2hwb3dlcl9sdmwgPSBUWEhJR0hQV1JMRVZFTF9OT1JNQUw7CisJCXJldHVybjsKKwl9CisJaWYgKChtYWMtPmxpbmtfc3RhdGUgPCBNQUM4MDIxMV9MSU5LRUQpICYmCisJICAgIChydGxwcml2LT5kbS5VTkRFQ19TTV9QV0RCID09IDApKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVIsIERCR19UUkFDRSwKKwkJCSAoIk5vdCBjb25uZWN0ZWQgdG8gYW55XG4iKSk7CisJCXJ0bHByaXYtPmRtLmR5bmFtaWNfdHhoaWdocG93ZXJfbHZsID0gVFhISUdIUFdSTEVWRUxfTk9STUFMOworCQlydGxwcml2LT5kbS5sYXN0X2R0cF9sdmwgPSBUWEhJR0hQV1JMRVZFTF9OT1JNQUw7CisJCXJldHVybjsKKwl9CisJaWYgKG1hYy0+bGlua19zdGF0ZSA+PSBNQUM4MDIxMV9MSU5LRUQpIHsKKwkJaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CisJCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0KKwkJCSAgICBydGxwcml2LT5kbS5VTkRFQ19TTV9QV0RCOworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9QT1dFUiwgREJHX0xPVUQsCisJCQkJICgiSUJTUyBDbGllbnQgUFdEQiA9IDB4JWx4XG4iLAorCQkJCSAgdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYikpOworCQl9IGVsc2UgeworCQkJdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9CisJCQkgICAgcnRscHJpdi0+ZG0udW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVIsIERCR19MT1VELAorCQkJCSAoIlNUQSBEZWZhdWx0IFBvcnQgUFdEQiA9IDB4JWx4XG4iLAorCQkJCSAgdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYikpOworCQl9CisJfSBlbHNlIHsKKwkJdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9CisJCSAgICBydGxwcml2LT5kbS5VTkRFQ19TTV9QV0RCOworCisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVIsIERCR19MT1VELAorCQkJICgiQVAgRXh0IFBvcnQgUFdEQiA9IDB4JWx4XG4iLAorCQkJICB1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiKSk7CisJfQorCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81RykgeworCQlpZiAodW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSAweDMzKSB7CisJCQlydGxwcml2LT5kbS5keW5hbWljX3R4aGlnaHBvd2VyX2x2bCA9CisJCQkJCQkgVFhISUdIUFdSTEVWRUxfTEVWRUwyOworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9ISVBXUiwgREJHX0xPVUQsCisJCQkJICgiNUc6VHhIaWdoUHdyTGV2ZWxfTGV2ZWwyIChUeFB3cj0weDApXG4iKSk7CisJCX0gZWxzZSBpZiAoKHVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAweDMzKQorCQkJICAgJiYgKHVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gMHgyYikpIHsKKwkJCXJ0bHByaXYtPmRtLmR5bmFtaWNfdHhoaWdocG93ZXJfbHZsID0KKwkJCQkJCSBUWEhJR0hQV1JMRVZFTF9MRVZFTDE7CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0hJUFdSLCBEQkdfTE9VRCwKKwkJCQkgKCI1RzpUeEhpZ2hQd3JMZXZlbF9MZXZlbDEgKFR4UHdyPTB4MTApXG4iKSk7CisJCX0gZWxzZSBpZiAodW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IDB4MmIpIHsKKwkJCXJ0bHByaXYtPmRtLmR5bmFtaWNfdHhoaWdocG93ZXJfbHZsID0KKwkJCQkJCSBUWEhJR0hQV1JMRVZFTF9OT1JNQUw7CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0hJUFdSLCBEQkdfTE9VRCwKKwkJCQkgKCI1RzpUeEhpZ2hQd3JMZXZlbF9Ob3JtYWxcbiIpKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49CisJCSAgICBUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9MVkwyKSB7CisJCQlydGxwcml2LT5kbS5keW5hbWljX3R4aGlnaHBvd2VyX2x2bCA9CisJCQkJCQkgVFhISUdIUFdSTEVWRUxfTEVWRUwyOworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9QT1dFUiwgREJHX0xPVUQsCisJCQkJICgiVFhISUdIUFdSTEVWRUxfTEVWRUwxIChUeFB3cj0weDApXG4iKSk7CisJCX0gZWxzZQorCQkgICAgaWYgKCh1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwKKwkJCSAoVFhfUE9XRVJfTkVBUl9GSUVMRF9USFJFU0hfTFZMMiAtIDMpKQorCQkJJiYgKHVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0KKwkJCSAgICBUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9MVkwxKSkgeworCisJCQlydGxwcml2LT5kbS5keW5hbWljX3R4aGlnaHBvd2VyX2x2bCA9CisJCQkJCQkgVFhISUdIUFdSTEVWRUxfTEVWRUwxOworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9QT1dFUiwgREJHX0xPVUQsCisJCQkJICgiVFhISUdIUFdSTEVWRUxfTEVWRUwxIChUeFB3cj0weDEwKVxuIikpOworCQl9IGVsc2UgaWYgKHVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPAorCQkJICAgKFRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0xWTDEgLSA1KSkgeworCQkJcnRscHJpdi0+ZG0uZHluYW1pY190eGhpZ2hwb3dlcl9sdmwgPQorCQkJCQkJIFRYSElHSFBXUkxFVkVMX05PUk1BTDsKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVIsIERCR19MT1VELAorCQkJCSAoIlRYSElHSFBXUkxFVkVMX05PUk1BTFxuIikpOworCQl9CisJfQorCWlmICgocnRscHJpdi0+ZG0uZHluYW1pY190eGhpZ2hwb3dlcl9sdmwgIT0gcnRscHJpdi0+ZG0ubGFzdF9kdHBfbHZsKSkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1BPV0VSLCBEQkdfTE9VRCwKKwkJCSAoIlBIWV9TZXRUeFBvd2VyTGV2ZWw4MTkyUygpIENoYW5uZWwgPSAlZFxuIiwKKwkJCSAgcnRscGh5LT5jdXJyZW50X2NoYW5uZWwpKTsKKwkJcnRsOTJkX3BoeV9zZXRfdHhwb3dlcl9sZXZlbChodywgcnRscGh5LT5jdXJyZW50X2NoYW5uZWwpOworCX0KKwlydGxwcml2LT5kbS5sYXN0X2R0cF9sdmwgPSBydGxwcml2LT5kbS5keW5hbWljX3R4aGlnaHBvd2VyX2x2bDsKK30KKworc3RhdGljIHZvaWQgcnRsOTJkX2RtX3B3ZGJfbW9uaXRvcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwkvKiBBUCAmIEFESE9DICYgTUVTSCB3aWxsIHJldHVybiB0bXAgKi8KKwlpZiAocnRscHJpdi0+bWFjODAyMTEub3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCXJldHVybjsKKwkvKiBJbmRpY2F0ZSBSeCBzaWduYWwgc3RyZW5ndGggdG8gRlcuICovCisJaWYgKHJ0bHByaXYtPmRtLnVzZXJhbWFzaykgeworCQl1MzIgdGVtcCA9IHJ0bHByaXYtPmRtLnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CisKKwkJdGVtcCA8PD0gMTY7CisJCXRlbXAgfD0gMHgxMDA7CisJCS8qIGZ3IHYxMiBjbWRpZCA1OnVzZSBtYXggbWFjaWQgLGZvciBuaWMgLAorCQkgKiBkZWZhdWx0IG1hY2lkIGlzIDAgLG1heCBtYWNpZCBpcyAxICovCisJCXJ0bDkyZF9maWxsX2gyY19jbWQoaHcsIEgyQ19SU1NJX1JFUE9SVCwgMywgKHU4ICopICgmdGVtcCkpOworCX0gZWxzZSB7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4NGZlLAorCQkJICAgICAgICh1OCkgcnRscHJpdi0+ZG0udW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYik7CisJfQorfQorCit2b2lkIHJ0bDkyZF9kbV9pbml0X2VkY2FfdHVyYm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJcnRscHJpdi0+ZG0uY3VycmVudF90dXJib19lZGNhID0gZmFsc2U7CisJcnRscHJpdi0+ZG0uaXNfYW55X25vbmJlcGt0cyA9IGZhbHNlOworCXJ0bHByaXYtPmRtLmlzX2N1cl9yZGxzdGF0ZSA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBydGw5MmRfZG1fY2hlY2tfZWRjYV90dXJibyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdGF0aWMgdTY0IGxhc3RfdHhva19jbnQ7CisJc3RhdGljIHU2NCBsYXN0X3J4b2tfY250OworCXU2NCBjdXJfdHhva19jbnQ7CisJdTY0IGN1cl9yeG9rX2NudDsKKwl1MzIgZWRjYV9iZV91bCA9IDB4NWVhNDJiOworCXUzMiBlZGNhX2JlX2RsID0gMHg1ZWE0MmI7CisKKwlpZiAobWFjLT5saW5rX3N0YXRlICE9IE1BQzgwMjExX0xJTktFRCkgeworCQlydGxwcml2LT5kbS5jdXJyZW50X3R1cmJvX2VkY2EgPSBmYWxzZTsKKwkJZ290byBleGl0OworCX0KKworCS8qIEVuYWJsZSBCRVEgVHhPUCBsaW1pdCBjb25maWd1cmF0aW9uIGluIHdpcmVsZXNzIEctbW9kZS4gKi8KKwkvKiBUbyBjaGVjayB3aGV0aGVyIHdlIHNoYWxsIGZvcmNlIHR1cm4gb24gVFhPUCBjb25maWd1cmF0aW9uLiAqLworCWlmICgoIXJ0bHByaXYtPmRtLmRpc2FibGVfZnJhbWVidXJzdGluZykgJiYKKwkgICAgKHJ0bHByaXYtPnNlYy5wYWlyd2lzZV9lbmNfYWxnb3JpdGhtID09IFdFUDQwX0VOQ1JZUFRJT04gfHwKKwkgICAgcnRscHJpdi0+c2VjLnBhaXJ3aXNlX2VuY19hbGdvcml0aG0gPT0gV0VQMTA0X0VOQ1JZUFRJT04gfHwKKwkgICAgcnRscHJpdi0+c2VjLnBhaXJ3aXNlX2VuY19hbGdvcml0aG0gPT0gVEtJUF9FTkNSWVBUSU9OKSkgeworCQkvKiBGb3JjZSBUeE9QIGxpbWl0IHRvIDB4MDA1ZSBmb3IgVUwuICovCisJCWlmICghKGVkY2FfYmVfdWwgJiAweGZmZmYwMDAwKSkKKwkJCWVkY2FfYmVfdWwgfD0gMHgwMDVlMDAwMDsKKwkJLyogRm9yY2UgVHhPUCBsaW1pdCB0byAweDAwNWUgZm9yIERMLiAqLworCQlpZiAoIShlZGNhX2JlX2RsICYgMHhmZmZmMDAwMCkpCisJCQllZGNhX2JlX2RsIHw9IDB4MDA1ZTAwMDA7CisJfQorCisJaWYgKCghcnRscHJpdi0+ZG0uaXNfYW55X25vbmJlcGt0cykgJiYKKwkgICAgKCFydGxwcml2LT5kbS5kaXNhYmxlX2ZyYW1lYnVyc3RpbmcpKSB7CisJCWN1cl90eG9rX2NudCA9IHJ0bHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0IC0gbGFzdF90eG9rX2NudDsKKwkJY3VyX3J4b2tfY250ID0gcnRscHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3QgLSBsYXN0X3J4b2tfY250OworCQlpZiAoY3VyX3J4b2tfY250ID4gNCAqIGN1cl90eG9rX2NudCkgeworCQkJaWYgKCFydGxwcml2LT5kbS5pc19jdXJfcmRsc3RhdGUgfHwKKwkJCSAgICAhcnRscHJpdi0+ZG0uY3VycmVudF90dXJib19lZGNhKSB7CisJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19FRENBX0JFX1BBUkFNLAorCQkJCQkJZWRjYV9iZV9kbCk7CisJCQkJcnRscHJpdi0+ZG0uaXNfY3VyX3JkbHN0YXRlID0gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChydGxwcml2LT5kbS5pc19jdXJfcmRsc3RhdGUgfHwKKwkJCSAgICAhcnRscHJpdi0+ZG0uY3VycmVudF90dXJib19lZGNhKSB7CisJCQkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19FRENBX0JFX1BBUkFNLAorCQkJCQkJZWRjYV9iZV91bCk7CisJCQkJcnRscHJpdi0+ZG0uaXNfY3VyX3JkbHN0YXRlID0gZmFsc2U7CisJCQl9CisJCX0KKwkJcnRscHJpdi0+ZG0uY3VycmVudF90dXJib19lZGNhID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAocnRscHJpdi0+ZG0uY3VycmVudF90dXJib19lZGNhKSB7CisJCQl1OCB0bXAgPSBBQzBfQkU7CisJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywgSFdfVkFSX0FDX1BBUkFNLAorCQkJCQkJICAgICAgKHU4ICopICgmdG1wKSk7CisJCQlydGxwcml2LT5kbS5jdXJyZW50X3R1cmJvX2VkY2EgPSBmYWxzZTsKKwkJfQorCX0KKworZXhpdDoKKwlydGxwcml2LT5kbS5pc19hbnlfbm9uYmVwa3RzID0gZmFsc2U7CisJbGFzdF90eG9rX2NudCA9IHJ0bHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0OworCWxhc3Rfcnhva19jbnQgPSBydGxwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdDsKK30KKworc3RhdGljIHZvaWQgcnRsOTJkX2RtX3J4Z2Fpbl90cmFja2luZ190aGVybWFsbWV0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IGluZGV4X21hcHBpbmdbUlhfSU5ERVhfTUFQUElOR19OVU1dID0geworCQkweDBmLCAweDBmLCAweDBkLCAweDBjLCAweDBiLAorCQkweDBhLCAweDA5LCAweDA4LCAweDA3LCAweDA2LAorCQkweDA1LCAweDA0LCAweDA0LCAweDAzLCAweDAyCisJfTsKKwlpbnQgaTsKKwl1MzIgdTR0bXA7CisKKwl1NHRtcCA9IChpbmRleF9tYXBwaW5nWyhydGxwcml2LT5lZnVzZS5lZXByb21fdGhlcm1hbG1ldGVyIC0KKwkJCQlydGxwcml2LT5kbS50aGVybWFsdmFsdWVfcnhnYWluKV0pIDw8IDEyOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkgKCI9PT0+IFJ4IEdhaW4gJXhcbiIsIHU0dG1wKSk7CisJZm9yIChpID0gUkY5MF9QQVRIX0E7IGkgPCBydGxwcml2LT5waHkubnVtX3RvdGFsX3JmcGF0aDsgaSsrKQorCQlydGxfc2V0X3JmcmVnKGh3LCBpLCAweDNDLCBCUkZSRUdPRkZTRVRNQVNLLAorCQkJICAgICAgKHJ0bHByaXYtPnBoeS5yZWdfcmYzY1tpXSAmICh+KDB4RjAwMCkpKSB8IHU0dG1wKTsKK30KKworc3RhdGljIHZvaWQgcnRsOTJkX2JhbmR0eXBlXzJfNEcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGxvbmcgKnRlbXBfY2NrZywKKwkJCQkgdTggKmNja19pbmRleF9vbGQpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZyA9IDA7CisJbG9uZyB0ZW1wX2NjazsKKworCS8qIFF1ZXJ5IENDSyBkZWZhdWx0IHNldHRpbmcgRnJvbSAweGEyNCAqLworCXJ0bDkyZF9hY3F1aXJlX2Nja2FuZHJ3X3BhZ2VhX2N0bChodywgJmZsYWcpOworCXRlbXBfY2NrID0gcnRsX2dldF9iYnJlZyhodywgUkNDSzBfVFhGSUxURVIyLAorCQkJCSBCTUFTS0RXT1JEKSAmIEJNQVNLQ0NLOworCXJ0bDkyZF9yZWxlYXNlX2Nja2FuZHJ3X3BhZ2VhX2N0bChodywgJmZsYWcpOworCWZvciAoaSA9IDA7IGkgPCBDQ0tfVEFCTEVfTEVOR1RIOyBpKyspIHsKKwkJaWYgKHJ0bHByaXYtPmRtLmNja19pbmNoMTQpIHsKKwkJCWlmICghbWVtY21wKCh2b2lkICopJnRlbXBfY2NrLAorCQkJICAgICh2b2lkICopJmNja3N3aW5nX3RhYmxlX2NoMTRbaV1bMl0sIDQpKSB7CisJCQkJKmNja19pbmRleF9vbGQgPSAodTgpIGk7CisJCQkJUlRfVFJBQ0UocnRscHJpdiwKKwkJCQkJIENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJCSBEQkdfTE9VRCwKKwkJCQkJICgiSW5pdGlhbCByZWcweCV4ID0gMHglbHgsICIKKwkJCQkJICAiY2NrX2luZGV4PTB4JXgsIGNoIDE0ICVkXG4iLAorCQkJCQkgIFJDQ0swX1RYRklMVEVSMiwKKwkJCQkJICB0ZW1wX2NjaywgKmNja19pbmRleF9vbGQsCisJCQkJCSAgcnRscHJpdi0+ZG0uY2NrX2luY2gxNCkpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFtZW1jbXAoKHZvaWQgKikgJnRlbXBfY2NrLAorCQkJICAgICZjY2tzd2luZ190YWJsZV9jaDFjaDEzW2ldWzJdLCA0KSkgeworCQkJCSpjY2tfaW5kZXhfb2xkID0gKHU4KSBpOworCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJCSBEQkdfTE9VRCwKKwkJCQkJICgiSW5pdGlhbCByZWcweCV4ID0gMHglbHgsICIKKwkJCQkJICJjY2tfaW5kZXggPSAweCV4LCBjaDE0ICVkXG4iLAorCQkJCQkgUkNDSzBfVFhGSUxURVIyLAorCQkJCQkgdGVtcF9jY2ssICpjY2tfaW5kZXhfb2xkLAorCQkJCQkgcnRscHJpdi0+ZG0uY2NrX2luY2gxNCkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCSp0ZW1wX2Nja2cgPSB0ZW1wX2NjazsKK30KKworc3RhdGljIHZvaWQgcnRsOTJkX2JhbmR0eXBlXzVHKHN0cnVjdCBydGxfaGFsICpydGxoYWwsIHU4ICpvZmRtX2luZGV4LAorCQkJICAgICAgIGJvb2wgKmludGVybmFsX3BhLCB1OCB0aGVybWFsdmFsdWUsIHU4IGRlbHRhLAorCQkJICAgICAgIHU4IHJmLCBzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSwKKwkJCSAgICAgICBzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHN0cnVjdCBydGxfcGh5ICpydGxwaHksCisJCQkgICAgICAgdTggaW5kZXhfbWFwcGluZ1s1XVtJTkRFWF9NQVBQSU5HX05VTV0sCisJCQkgICAgICAgdTggaW5kZXhfbWFwcGluZ19wYVs4XVtJTkRFWF9NQVBQSU5HX05VTV0pCit7CisJaW50IGk7CisJdTggaW5kZXg7CisJdTggb2Zmc2V0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCByZjsgaSsrKSB7CisJCWlmIChydGxoYWwtPm1hY3BoeW1vZGUgPT0gRFVBTE1BQ19EVUFMUEhZICYmCisJCSAgICBydGxoYWwtPmludGVyZmFjZWluZGV4ID09IDEpCS8qIE1BQyAxIDVHICovCisJCQkqaW50ZXJuYWxfcGEgPSBydGxlZnVzZS0+aW50ZXJuYWxfcGFfNWdbMV07CisJCWVsc2UKKwkJCSppbnRlcm5hbF9wYSA9IHJ0bGVmdXNlLT5pbnRlcm5hbF9wYV81Z1tpXTsKKwkJaWYgKCppbnRlcm5hbF9wYSkgeworCQkJaWYgKHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPT0gMSB8fCBpID09IHJmKQorCQkJCW9mZnNldCA9IDQ7CisJCQllbHNlCisJCQkJb2Zmc2V0ID0gMDsKKwkJCWlmIChydGxwaHktPmN1cnJlbnRfY2hhbm5lbCA+PSAxMDAgJiYKKwkJCQlydGxwaHktPmN1cnJlbnRfY2hhbm5lbCA8PSAxNjUpCisJCQkJb2Zmc2V0ICs9IDI7CisJCX0gZWxzZSB7CisJCQlpZiAocnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9PSAxIHx8IGkgPT0gcmYpCisJCQkJb2Zmc2V0ID0gMjsKKwkJCWVsc2UKKwkJCQlvZmZzZXQgPSAwOworCQl9CisJCWlmICh0aGVybWFsdmFsdWUgPiBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcikKKwkJCW9mZnNldCsrOworCQlpZiAoKmludGVybmFsX3BhKSB7CisJCQlpZiAoZGVsdGEgPiBJTkRFWF9NQVBQSU5HX05VTSAtIDEpCisJCQkJaW5kZXggPSBpbmRleF9tYXBwaW5nX3BhW29mZnNldF0KKwkJCQkJCSAgICBbSU5ERVhfTUFQUElOR19OVU0gLSAxXTsKKwkJCWVsc2UKKwkJCQlpbmRleCA9CisJCQkJICAgICBpbmRleF9tYXBwaW5nX3BhW29mZnNldF1bZGVsdGFdOworCQl9IGVsc2UgeworCQkJaWYgKGRlbHRhID4gSU5ERVhfTUFQUElOR19OVU0gLSAxKQorCQkJCWluZGV4ID0KKwkJCQkgICBpbmRleF9tYXBwaW5nW29mZnNldF1bSU5ERVhfTUFQUElOR19OVU0gLSAxXTsKKwkJCWVsc2UKKwkJCQlpbmRleCA9IGluZGV4X21hcHBpbmdbb2Zmc2V0XVtkZWx0YV07CisJCX0KKwkJaWYgKHRoZXJtYWx2YWx1ZSA+IHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyKSB7CisJCQlpZiAoKmludGVybmFsX3BhICYmIHRoZXJtYWx2YWx1ZSA+IDB4MTIpIHsKKwkJCQlvZmRtX2luZGV4W2ldID0gcnRscHJpdi0+ZG0ub2ZkbV9pbmRleFtpXSAtCisJCQkJCQkoKGRlbHRhIC8gMikgKiAzICsgKGRlbHRhICUgMikpOworCQkJfSBlbHNlIHsKKwkJCQlvZmRtX2luZGV4W2ldIC09IGluZGV4OworCQkJfQorCQl9IGVsc2UgeworCQkJb2ZkbV9pbmRleFtpXSArPSBpbmRleDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcnRsOTJkX2RtX3R4cG93ZXJfdHJhY2tpbmdfY2FsbGJhY2tfdGhlcm1hbG1ldGVyKAorCQkJc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOworCXU4IHRoZXJtYWx2YWx1ZSwgZGVsdGEsIGRlbHRhX2xjaywgZGVsdGFfaXFrLCBkZWx0YV9yeGdhaW47CisJdTggb2Zmc2V0LCB0aGVybWFsdmFsdWVfYXZnX2NvdW50ID0gMDsKKwl1MzIgdGhlcm1hbHZhbHVlX2F2ZyA9IDA7CisJYm9vbCBpbnRlcm5hbF9wYSA9IGZhbHNlOworCWxvbmcgZWxlX2EgPSAwLCBlbGVfZCwgdGVtcF9jY2ssIHZhbF94LCB2YWx1ZTMyOworCWxvbmcgdmFsX3ksIGVsZV9jID0gMDsKKwl1OCBvZmRtX2luZGV4WzJdOworCXU4IGNja19pbmRleCA9IDA7CisJdTggb2ZkbV9pbmRleF9vbGRbMl07CisJdTggY2NrX2luZGV4X29sZCA9IDA7CisJdTggaW5kZXg7CisJaW50IGk7CisJYm9vbCBpczJ0ID0gSVNfOTJEX1NJTkdMRVBIWShydGxoYWwtPnZlcnNpb24pOworCXU4IG9mZG1fbWluX2luZGV4ID0gNiwgb2ZkbV9taW5faW5kZXhfaW50ZXJuYWxfcGEgPSAzLCByZjsKKwl1OCBpbmRleGZvcmNoYW5uZWwgPQorCSAgICBydGw5MmRfZ2V0X3JpZ2h0Y2hubHBsYWNlX2Zvcl9pcWsocnRscGh5LT5jdXJyZW50X2NoYW5uZWwpOworCXU4IGluZGV4X21hcHBpbmdbNV1bSU5ERVhfTUFQUElOR19OVU1dID0geworCQkvKiA1RywgcGF0aCBBL01BQyAwLCBkZWNyZWFzZSBwb3dlciAgKi8KKwkJezAsIDEsIDMsIDYsIDgsIDksCTExLCAxMywgMTQsIDE2LCAxNywgMTgsIDE4fSwKKwkJLyogNUcsIHBhdGggQS9NQUMgMCwgaW5jcmVhc2UgcG93ZXIgICovCisJCXswLCAyLCA0LCA1LCA3LCAxMCwJMTIsIDE0LCAxNiwgMTgsIDE4LCAxOCwgMTh9LAorCQkvKiA1RywgcGF0aCBCL01BQyAxLCBkZWNyZWFzZSBwb3dlciAqLworCQl7MCwgMiwgMywgNiwgOCwgOSwJMTEsIDEzLCAxNCwgMTYsIDE3LCAxOCwgMTh9LAorCQkvKiA1RywgcGF0aCBCL01BQyAxLCBpbmNyZWFzZSBwb3dlciAqLworCQl7MCwgMiwgNCwgNSwgNywgMTAsCTEzLCAxNiwgMTYsIDE4LCAxOCwgMTgsIDE4fSwKKwkJLyogMi40RywgZm9yIGRlY3JlYXMgcG93ZXIgKi8KKwkJezAsIDEsIDIsIDMsIDQsIDUsCTYsIDcsIDcsIDgsIDksIDEwLCAxMH0sCisJfTsKKwl1OCBpbmRleF9tYXBwaW5nX2ludGVybmFsX3BhWzhdW0lOREVYX01BUFBJTkdfTlVNXSA9IHsKKwkJLyogNUcsIHBhdGggQS9NQUMgMCwgY2gzNi02NCwgZGVjcmVhc2UgcG93ZXIgICovCisJCXswLCAxLCAyLCA0LCA2LCA3LAk5LCAxMSwgMTIsIDE0LCAxNSwgMTYsIDE2fSwKKwkJLyogNUcsIHBhdGggQS9NQUMgMCwgY2gzNi02NCwgaW5jcmVhc2UgcG93ZXIgICovCisJCXswLCAyLCA0LCA1LCA3LCAxMCwJMTIsIDE0LCAxNiwgMTgsIDE4LCAxOCwgMTh9LAorCQkvKiA1RywgcGF0aCBBL01BQyAwLCBjaDEwMC0xNjUsIGRlY3JlYXNlIHBvd2VyICAqLworCQl7MCwgMSwgMiwgMywgNSwgNiwJOCwgMTAsIDExLCAxMywgMTQsIDE1LCAxNX0sCisJCS8qIDVHLCBwYXRoIEEvTUFDIDAsIGNoMTAwLTE2NSwgaW5jcmVhc2UgcG93ZXIgICovCisJCXswLCAyLCA0LCA1LCA3LCAxMCwJMTIsIDE0LCAxNiwgMTgsIDE4LCAxOCwgMTh9LAorCQkvKiA1RywgcGF0aCBCL01BQyAxLCBjaDM2LTY0LCBkZWNyZWFzZSBwb3dlciAqLworCQl7MCwgMSwgMiwgNCwgNiwgNywJOSwgMTEsIDEyLCAxNCwgMTUsIDE2LCAxNn0sCisJCS8qIDVHLCBwYXRoIEIvTUFDIDEsIGNoMzYtNjQsIGluY3JlYXNlIHBvd2VyICovCisJCXswLCAyLCA0LCA1LCA3LCAxMCwJMTMsIDE2LCAxNiwgMTgsIDE4LCAxOCwgMTh9LAorCQkvKiA1RywgcGF0aCBCL01BQyAxLCBjaDEwMC0xNjUsIGRlY3JlYXNlIHBvd2VyICovCisJCXswLCAxLCAyLCAzLCA1LCA2LAk4LCA5LCAxMCwgMTIsIDEzLCAxNCwgMTR9LAorCQkvKiA1RywgcGF0aCBCL01BQyAxLCBjaDEwMC0xNjUsIGluY3JlYXNlIHBvd2VyICovCisJCXswLCAyLCA0LCA1LCA3LCAxMCwJMTMsIDE2LCAxNiwgMTgsIDE4LCAxOCwgMTh9LAorCX07CisKKwlydGxwcml2LT5kbS50eHBvd2VyX3RyYWNraW5naW5pdCA9IHRydWU7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsICgiXG4iKSk7CisJdGhlcm1hbHZhbHVlID0gKHU4KSBydGxfZ2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgUkZfVF9NRVRFUiwgMHhmODAwKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJICgiUmVhZGJhY2sgVGhlcm1hbCBNZXRlciA9IDB4JXggcHJlIHRoZXJtYWwgbWV0ZXIgMHgleCAiCisJCSAiZWVwcm9tX3RoZXJtYWxtZXRlciAweCV4XG4iLCB0aGVybWFsdmFsdWUsCisJCSBydGxwcml2LT5kbS50aGVybWFsdmFsdWUsIHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyKSk7CisJcnRsOTJkX3BoeV9hcF9jYWxpYnJhdGUoaHcsICh0aGVybWFsdmFsdWUgLQorCQkJCSAgICAgcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpKTsKKwlpZiAoaXMydCkKKwkJcmYgPSAyOworCWVsc2UKKwkJcmYgPSAxOworCWlmICh0aGVybWFsdmFsdWUpIHsKKwkJZWxlX2QgPSBydGxfZ2V0X2JicmVnKGh3LCBST0ZETTBfWEFUeElRSU1CQUxBTkNFLAorCQkJCSAgICAgIEJNQVNLRFdPUkQpICYgQk1BU0tPRkRNX0Q7CisJCWZvciAoaSA9IDA7IGkgPCBPRkRNX1RBQkxFX1NJWkVfOTJEOyBpKyspIHsKKwkJCWlmIChlbGVfZCA9PSAob2ZkbXN3aW5nX3RhYmxlW2ldICYgQk1BU0tPRkRNX0QpKSB7CisJCQkJb2ZkbV9pbmRleF9vbGRbMF0gPSAodTgpIGk7CisKKwkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkJICgiSW5pdGlhbCBwYXRoQSBlbGVfZCByZWcweCV4ID0gMHglbHgsIgorCQkJCQkgIiBvZmRtX2luZGV4PTB4JXhcbiIsCisJCQkJCSBST0ZETTBfWEFUeElRSU1CQUxBTkNFLAorCQkJCQkgZWxlX2QsIG9mZG1faW5kZXhfb2xkWzBdKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGlzMnQpIHsKKwkJCWVsZV9kID0gcnRsX2dldF9iYnJlZyhodywgUk9GRE0wX1hCVHhJUUlNQkFMQU5DRSwKKwkJCQkJICAgICAgQk1BU0tEV09SRCkgJiBCTUFTS09GRE1fRDsKKwkJCWZvciAoaSA9IDA7IGkgPCBPRkRNX1RBQkxFX1NJWkVfOTJEOyBpKyspIHsKKwkJCQlpZiAoZWxlX2QgPT0KKwkJCQkgICAgKG9mZG1zd2luZ190YWJsZVtpXSAmIEJNQVNLT0ZETV9EKSkgeworCQkJCQlvZmRtX2luZGV4X29sZFsxXSA9ICh1OCkgaTsKKwkJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkJCSBEQkdfTE9VRCwKKwkJCQkJCSAoIkluaXRpYWwgcGF0aEIgZWxlX2QgcmVnICIKKwkJCQkJCSAiMHgleCA9IDB4JWx4LCBvZmRtX2luZGV4ICIKKwkJCQkJCSAiPSAweCV4XG4iLAorCQkJCQkJIFJPRkRNMF9YQlR4SVFJTUJBTEFOQ0UsIGVsZV9kLAorCQkJCQkJIG9mZG1faW5kZXhfb2xkWzFdKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAocnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fMl80RykgeworCQkJcnRsOTJkX2JhbmR0eXBlXzJfNEcoaHcsICZ0ZW1wX2NjaywgJmNja19pbmRleF9vbGQpOworCQl9IGVsc2UgeworCQkJdGVtcF9jY2sgPSAweDA5MGUxMzE3OworCQkJY2NrX2luZGV4X29sZCA9IDEyOworCQl9CisKKwkJaWYgKCFydGxwcml2LT5kbS50aGVybWFsdmFsdWUpIHsKKwkJCXJ0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZSA9CisJCQkJIHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyOworCQkJcnRscHJpdi0+ZG0udGhlcm1hbHZhbHVlX2xjayA9IHRoZXJtYWx2YWx1ZTsKKwkJCXJ0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZV9pcWsgPSB0aGVybWFsdmFsdWU7CisJCQlydGxwcml2LT5kbS50aGVybWFsdmFsdWVfcnhnYWluID0KKwkJCQkJIHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyOworCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspCisJCQkJcnRscHJpdi0+ZG0ub2ZkbV9pbmRleFtpXSA9IG9mZG1faW5kZXhfb2xkW2ldOworCQkJcnRscHJpdi0+ZG0uY2NrX2luZGV4ID0gY2NrX2luZGV4X29sZDsKKwkJfQorCQlpZiAocnRsaGFsLT5yZWxvYWR0eHBvd2VyaW5kZXgpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCByZjsgaSsrKQorCQkJCXJ0bHByaXYtPmRtLm9mZG1faW5kZXhbaV0gPSBvZmRtX2luZGV4X29sZFtpXTsKKwkJCXJ0bHByaXYtPmRtLmNja19pbmRleCA9IGNja19pbmRleF9vbGQ7CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkgKCJyZWxvYWQgb2ZkbSBpbmRleCBmb3IgYmFuZCBzd2l0Y2hcbiIpKTsKKwkJfQorCQlydGxwcml2LT5kbS50aGVybWFsdmFsdWVfYXZnCisJCQkgICAgW3J0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZV9hdmdfaW5kZXhdID0gdGhlcm1hbHZhbHVlOworCQlydGxwcml2LT5kbS50aGVybWFsdmFsdWVfYXZnX2luZGV4Kys7CisJCWlmIChydGxwcml2LT5kbS50aGVybWFsdmFsdWVfYXZnX2luZGV4ID09IEFWR19USEVSTUFMX05VTSkKKwkJCXJ0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZV9hdmdfaW5kZXggPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgQVZHX1RIRVJNQUxfTlVNOyBpKyspIHsKKwkJCWlmIChydGxwcml2LT5kbS50aGVybWFsdmFsdWVfYXZnW2ldKSB7CisJCQkJdGhlcm1hbHZhbHVlX2F2ZyArPQorCQkJCQkgcnRscHJpdi0+ZG0udGhlcm1hbHZhbHVlX2F2Z1tpXTsKKwkJCQl0aGVybWFsdmFsdWVfYXZnX2NvdW50Kys7CisJCQl9CisJCX0KKwkJaWYgKHRoZXJtYWx2YWx1ZV9hdmdfY291bnQpCisJCQl0aGVybWFsdmFsdWUgPSAodTgpICh0aGVybWFsdmFsdWVfYXZnIC8KKwkJCQkJdGhlcm1hbHZhbHVlX2F2Z19jb3VudCk7CisJCWlmIChydGxoYWwtPnJlbG9hZHR4cG93ZXJpbmRleCkgeworCQkJZGVsdGEgPSAodGhlcm1hbHZhbHVlID4gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpID8KKwkJCSAgICAodGhlcm1hbHZhbHVlIC0gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpIDoKKwkJCSAgICAocnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgLSB0aGVybWFsdmFsdWUpOworCQkJcnRsaGFsLT5yZWxvYWR0eHBvd2VyaW5kZXggPSBmYWxzZTsKKwkJCXJ0bHByaXYtPmRtLmRvbmVfdHhwb3dlciA9IGZhbHNlOworCQl9IGVsc2UgaWYgKHJ0bHByaXYtPmRtLmRvbmVfdHhwb3dlcikgeworCQkJZGVsdGEgPSAodGhlcm1hbHZhbHVlID4gcnRscHJpdi0+ZG0udGhlcm1hbHZhbHVlKSA/CisJCQkgICAgKHRoZXJtYWx2YWx1ZSAtIHJ0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZSkgOgorCQkJICAgIChydGxwcml2LT5kbS50aGVybWFsdmFsdWUgLSB0aGVybWFsdmFsdWUpOworCQl9IGVsc2UgeworCQkJZGVsdGEgPSAodGhlcm1hbHZhbHVlID4gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpID8KKwkJCSAgICAodGhlcm1hbHZhbHVlIC0gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpIDoKKwkJCSAgICAocnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgLSB0aGVybWFsdmFsdWUpOworCQl9CisJCWRlbHRhX2xjayA9ICh0aGVybWFsdmFsdWUgPiBydGxwcml2LT5kbS50aGVybWFsdmFsdWVfbGNrKSA/CisJCSAgICAodGhlcm1hbHZhbHVlIC0gcnRscHJpdi0+ZG0udGhlcm1hbHZhbHVlX2xjaykgOgorCQkgICAgKHJ0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZV9sY2sgLSB0aGVybWFsdmFsdWUpOworCQlkZWx0YV9pcWsgPSAodGhlcm1hbHZhbHVlID4gcnRscHJpdi0+ZG0udGhlcm1hbHZhbHVlX2lxaykgPworCQkgICAgKHRoZXJtYWx2YWx1ZSAtIHJ0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZV9pcWspIDoKKwkJICAgIChydGxwcml2LT5kbS50aGVybWFsdmFsdWVfaXFrIC0gdGhlcm1hbHZhbHVlKTsKKwkJZGVsdGFfcnhnYWluID0KKwkJCSh0aGVybWFsdmFsdWUgPiBydGxwcml2LT5kbS50aGVybWFsdmFsdWVfcnhnYWluKSA/CisJCQkodGhlcm1hbHZhbHVlIC0gcnRscHJpdi0+ZG0udGhlcm1hbHZhbHVlX3J4Z2FpbikgOgorCQkJKHJ0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZV9yeGdhaW4gLSB0aGVybWFsdmFsdWUpOworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCSAoIlJlYWRiYWNrIFRoZXJtYWwgTWV0ZXIgPSAweCV4IHByZSB0aGVybWFsIG1ldGVyIDB4JXgiCisJCQkgICIgZWVwcm9tX3RoZXJtYWxtZXRlciAweCV4IGRlbHRhIDB4JXggIgorCQkJICAiZGVsdGFfbGNrIDB4JXggZGVsdGFfaXFrIDB4JXhcbiIsCisJCQkgIHRoZXJtYWx2YWx1ZSwgcnRscHJpdi0+ZG0udGhlcm1hbHZhbHVlLAorCQkJICBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciwgZGVsdGEsIGRlbHRhX2xjaywKKwkJCSAgZGVsdGFfaXFrKSk7CisJCWlmICgoZGVsdGFfbGNrID4gcnRsZWZ1c2UtPmRlbHRhX2xjaykgJiYKKwkJICAgIChydGxlZnVzZS0+ZGVsdGFfbGNrICE9IDApKSB7CisJCQlydGxwcml2LT5kbS50aGVybWFsdmFsdWVfbGNrID0gdGhlcm1hbHZhbHVlOworCQkJcnRsOTJkX3BoeV9sY19jYWxpYnJhdGUoaHcpOworCQl9CisJCWlmIChkZWx0YSA+IDAgJiYgcnRscHJpdi0+ZG0udHhwb3dlcl90cmFja19jb250cm9sKSB7CisJCQlydGxwcml2LT5kbS5kb25lX3R4cG93ZXIgPSB0cnVlOworCQkJZGVsdGEgPSAodGhlcm1hbHZhbHVlID4gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpID8KKwkJCSAgICAodGhlcm1hbHZhbHVlIC0gcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpIDoKKwkJCSAgICAocnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgLSB0aGVybWFsdmFsdWUpOworCQkJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzJfNEcpIHsKKwkJCQlvZmZzZXQgPSA0OworCQkJCWlmIChkZWx0YSA+IElOREVYX01BUFBJTkdfTlVNIC0gMSkKKwkJCQkJaW5kZXggPSBpbmRleF9tYXBwaW5nW29mZnNldF0KKwkJCQkJCVtJTkRFWF9NQVBQSU5HX05VTSAtIDFdOworCQkJCWVsc2UKKwkJCQkJaW5kZXggPSBpbmRleF9tYXBwaW5nW29mZnNldF1bZGVsdGFdOworCQkJCWlmICh0aGVybWFsdmFsdWUgPiBydGxwcml2LT5kbS50aGVybWFsdmFsdWUpIHsKKwkJCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspCisJCQkJCQlvZmRtX2luZGV4W2ldIC09IGRlbHRhOworCQkJCQljY2tfaW5kZXggLT0gZGVsdGE7CisJCQkJfSBlbHNlIHsKKwkJCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspCisJCQkJCQlvZmRtX2luZGV4W2ldICs9IGluZGV4OworCQkJCQljY2tfaW5kZXggKz0gaW5kZXg7CisJCQkJfQorCQkJfSBlbHNlIGlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81RykgeworCQkJCXJ0bDkyZF9iYW5kdHlwZV81RyhydGxoYWwsIG9mZG1faW5kZXgsCisJCQkJCQkgICAmaW50ZXJuYWxfcGEsIHRoZXJtYWx2YWx1ZSwKKwkJCQkJCSAgIGRlbHRhLCByZiwgcnRsZWZ1c2UsIHJ0bHByaXYsCisJCQkJCQkgICBydGxwaHksIGluZGV4X21hcHBpbmcsCisJCQkJCQkgICBpbmRleF9tYXBwaW5nX2ludGVybmFsX3BhKTsKKwkJCX0KKwkJCWlmIChpczJ0KSB7CisJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJCSAoInRlbXAgT0ZETV9BX2luZGV4PTB4JXgsIE9GRE1fQl9pbmRleCIKKwkJCQkJICIgPSAweCV4LGNja19pbmRleD0weCV4XG4iLAorCQkJCQkgIHJ0bHByaXYtPmRtLm9mZG1faW5kZXhbMF0sCisJCQkJCSAgcnRscHJpdi0+ZG0ub2ZkbV9pbmRleFsxXSwKKwkJCQkJICBydGxwcml2LT5kbS5jY2tfaW5kZXgpKTsKKwkJCX0gZWxzZSB7CisJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkJCSAoInRlbXAgT0ZETV9BX2luZGV4PTB4JXgsY2NrX2luZGV4ID0gIgorCQkJCQkgIjB4JXhcbiIsCisJCQkJCSAgcnRscHJpdi0+ZG0ub2ZkbV9pbmRleFswXSwKKwkJCQkJCQlydGxwcml2LT5kbS5jY2tfaW5kZXgpKTsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCByZjsgaSsrKSB7CisJCQkJaWYgKG9mZG1faW5kZXhbaV0gPiBPRkRNX1RBQkxFX1NJWkVfOTJEIC0gMSkKKwkJCQkJb2ZkbV9pbmRleFtpXSA9IE9GRE1fVEFCTEVfU0laRV85MkQgLSAxOworCQkJCWVsc2UgaWYgKG9mZG1faW5kZXhbaV0gPCBvZmRtX21pbl9pbmRleCkKKwkJCQkJb2ZkbV9pbmRleFtpXSA9IG9mZG1fbWluX2luZGV4OworCQkJfQorCQkJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzJfNEcpIHsKKwkJCQlpZiAoY2NrX2luZGV4ID4gQ0NLX1RBQkxFX1NJWkUgLSAxKSB7CisJCQkJCWNja19pbmRleCA9IENDS19UQUJMRV9TSVpFIC0gMTsKKwkJCQl9IGVsc2UgaWYgKGludGVybmFsX3BhIHx8CisJCQkJCSAgIHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PQorCQkJCQkgICBCQU5EX09OXzJfNEcpIHsKKwkJCQkJaWYgKG9mZG1faW5kZXhbaV0gPAorCQkJCQkgICAgb2ZkbV9taW5faW5kZXhfaW50ZXJuYWxfcGEpCisJCQkJCQlvZmRtX2luZGV4W2ldID0KKwkJCQkJCSAgICAgb2ZkbV9taW5faW5kZXhfaW50ZXJuYWxfcGE7CisJCQkJfSBlbHNlIGlmIChjY2tfaW5kZXggPCAwKSB7CisJCQkJCWNja19pbmRleCA9IDA7CisJCQkJfQorCQkJfQorCQkJaWYgKGlzMnQpIHsKKwkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkJICgibmV3IE9GRE1fQV9pbmRleD0weCV4LCBPRkRNX0JfaW5kZXggIgorCQkJCQkgIj0gMHgleCwgY2NrX2luZGV4PTB4JXhcbiIsCisJCQkJCSBvZmRtX2luZGV4WzBdLCBvZmRtX2luZGV4WzFdLAorCQkJCQkgY2NrX2luZGV4KSk7CisJCQl9IGVsc2UgeworCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCQkgKCJuZXcgT0ZETV9BX2luZGV4PTB4JXgsY2NrX2luZGV4ID0gIgorCQkJCQkgIjB4JXhcbiIsCisJCQkJCSAgb2ZkbV9pbmRleFswXSwgY2NrX2luZGV4KSk7CisJCQl9CisJCQllbGVfZCA9IChvZmRtc3dpbmdfdGFibGVbKHU4KSBvZmRtX2luZGV4WzBdXSAmCisJCQkJCQkgMHhGRkMwMDAwMCkgPj4gMjI7CisJCQl2YWxfeCA9IHJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nCisJCQkJCQlbaW5kZXhmb3JjaGFubmVsXS52YWx1ZVswXVswXTsKKwkJCXZhbF95ID0gcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmcKKwkJCQkJCVtpbmRleGZvcmNoYW5uZWxdLnZhbHVlWzBdWzFdOworCQkJaWYgKHZhbF94ICE9IDApIHsKKwkJCQlpZiAoKHZhbF94ICYgMHgwMDAwMDIwMCkgIT0gMCkKKwkJCQkJdmFsX3ggPSB2YWxfeCB8IDB4RkZGRkZDMDA7CisJCQkJZWxlX2EgPQorCQkJCSAgICAoKHZhbF94ICogZWxlX2QpID4+IDgpICYgMHgwMDAwMDNGRjsKKworCQkJCS8qIG5ldyBlbGVtZW50IEMgPSBlbGVtZW50IEQgeCBZICovCisJCQkJaWYgKCh2YWxfeSAmIDB4MDAwMDAyMDApICE9IDApCisJCQkJCXZhbF95ID0gdmFsX3kgfCAweEZGRkZGQzAwOworCQkJCWVsZV9jID0gKCh2YWxfeSAqIGVsZV9kKSA+PiA4KSAmIDB4MDAwMDAzRkY7CisKKwkJCQkvKiB3aXJ0ZSBuZXcgZWxlbWVudHMgQSwgQywgRCB0byByZWdDODAgYW5kCisJCQkJICogcmVnQzk0LCBlbGVtZW50IEIgaXMgYWx3YXlzIDAgKi8KKwkJCQl2YWx1ZTMyID0gKGVsZV9kIDw8IDIyKSB8ICgoZWxlX2MgJiAweDNGKSA8PAorCQkJCQkgIDE2KSB8IGVsZV9hOworCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQVR4SVFJTUJBTEFOQ0UsCisJCQkJCSAgICAgIEJNQVNLRFdPUkQsIHZhbHVlMzIpOworCisJCQkJdmFsdWUzMiA9IChlbGVfYyAmIDB4MDAwMDAzQzApID4+IDY7CisJCQkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1hDVHhBRkUsIEJNQVNLSDRCSVRTLAorCQkJCQkgICAgICB2YWx1ZTMyKTsKKworCQkJCXZhbHVlMzIgPSAoKHZhbF94ICogZWxlX2QpID4+IDcpICYgMHgwMTsKKwkJCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfRUNDQVRIUkVTSE9MRCwgQklUKDI0KSwKKwkJCQkJICAgICAgdmFsdWUzMik7CisKKwkJCX0gZWxzZSB7CisJCQkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1hBVHhJUUlNQkFMQU5DRSwKKwkJCQkJICAgICAgQk1BU0tEV09SRCwKKwkJCQkJICAgICAgb2ZkbXN3aW5nX3RhYmxlCisJCQkJCSAgICAgIFsodTgpb2ZkbV9pbmRleFswXV0pOworCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQ1R4QUZFLCBCTUFTS0g0QklUUywKKwkJCQkJICAgICAgMHgwMCk7CisJCQkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX0VDQ0FUSFJFU0hPTEQsCisJCQkJCSAgICAgIEJJVCgyNCksIDB4MDApOworCQkJfQorCisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1BPV0VSX1RSQUNLSU5HLCBEQkdfTE9VRCwKKwkJCQkgKCJUeFB3clRyYWNraW5nIGZvciBpbnRlcmZhY2UgJWQgcGF0aCBBOiBYID0iCisJCQkJICIgMHglbHgsIFkgPSAweCVseCBlbGVfQSA9IDB4JWx4IGVsZV9DID0gIgorCQkJCSAiMHglbHggZWxlX0QgPSAweCVseCAweGU5NCA9IDB4JWx4IDB4ZTljID0gIgorCQkJCSAiMHglbHhcbiIsIHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXgsCisJCQkJIHZhbF94LCB2YWxfeSwgZWxlX2EsIGVsZV9jLCBlbGVfZCwKKwkJCQkgdmFsX3gsIHZhbF95KSk7CisKKwkJCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCQkJLyogQWRqdXN0IENDSyBhY2NvcmRpbmcgdG8gSVFLIHJlc3VsdCAqLworCQkJCWlmICghcnRscHJpdi0+ZG0uY2NrX2luY2gxNCkgeworCQkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweGEyMiwKKwkJCQkJCSAgICAgICBjY2tzd2luZ190YWJsZV9jaDFjaDEzCisJCQkJCQkgICAgICAgWyh1OCljY2tfaW5kZXhdWzBdKTsKKwkJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHhhMjMsCisJCQkJCQkgICAgICAgY2Nrc3dpbmdfdGFibGVfY2gxY2gxMworCQkJCQkJICAgICAgIFsodTgpY2NrX2luZGV4XVsxXSk7CisJCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4YTI0LAorCQkJCQkJICAgICAgIGNja3N3aW5nX3RhYmxlX2NoMWNoMTMKKwkJCQkJCSAgICAgICBbKHU4KWNja19pbmRleF1bMl0pOworCQkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweGEyNSwKKwkJCQkJCSAgICAgICBjY2tzd2luZ190YWJsZV9jaDFjaDEzCisJCQkJCQkgICAgICAgWyh1OCljY2tfaW5kZXhdWzNdKTsKKwkJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHhhMjYsCisJCQkJCQkgICAgICAgY2Nrc3dpbmdfdGFibGVfY2gxY2gxMworCQkJCQkJICAgICAgIFsodTgpY2NrX2luZGV4XVs0XSk7CisJCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4YTI3LAorCQkJCQkJICAgICAgIGNja3N3aW5nX3RhYmxlX2NoMWNoMTMKKwkJCQkJCSAgICAgICBbKHU4KWNja19pbmRleF1bNV0pOworCQkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweGEyOCwKKwkJCQkJCSAgICAgICBjY2tzd2luZ190YWJsZV9jaDFjaDEzCisJCQkJCQkgICAgICAgWyh1OCljY2tfaW5kZXhdWzZdKTsKKwkJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHhhMjksCisJCQkJCQkgICAgICAgY2Nrc3dpbmdfdGFibGVfY2gxY2gxMworCQkJCQkJICAgICAgIFsodTgpY2NrX2luZGV4XVs3XSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHhhMjIsCisJCQkJCQkgICAgICAgY2Nrc3dpbmdfdGFibGVfY2gxNAorCQkJCQkJICAgICAgIFsodTgpY2NrX2luZGV4XVswXSk7CisJCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4YTIzLAorCQkJCQkJICAgICAgIGNja3N3aW5nX3RhYmxlX2NoMTQKKwkJCQkJCSAgICAgICBbKHU4KWNja19pbmRleF1bMV0pOworCQkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweGEyNCwKKwkJCQkJCSAgICAgICBjY2tzd2luZ190YWJsZV9jaDE0CisJCQkJCQkgICAgICAgWyh1OCljY2tfaW5kZXhdWzJdKTsKKwkJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHhhMjUsCisJCQkJCQkgICAgICAgY2Nrc3dpbmdfdGFibGVfY2gxNAorCQkJCQkJICAgICAgIFsodTgpY2NrX2luZGV4XVszXSk7CisJCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4YTI2LAorCQkJCQkJICAgICAgIGNja3N3aW5nX3RhYmxlX2NoMTQKKwkJCQkJCSAgICAgICBbKHU4KWNja19pbmRleF1bNF0pOworCQkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweGEyNywKKwkJCQkJCSAgICAgICBjY2tzd2luZ190YWJsZV9jaDE0CisJCQkJCQkgICAgICAgWyh1OCljY2tfaW5kZXhdWzVdKTsKKwkJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHhhMjgsCisJCQkJCQkgICAgICAgY2Nrc3dpbmdfdGFibGVfY2gxNAorCQkJCQkJICAgICAgIFsodTgpY2NrX2luZGV4XVs2XSk7CisJCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4YTI5LAorCQkJCQkJICAgICAgIGNja3N3aW5nX3RhYmxlX2NoMTQKKwkJCQkJCSAgICAgICBbKHU4KWNja19pbmRleF1bN10pOworCQkJCX0KKwkJCX0KKwkJCWlmIChpczJ0KSB7CisJCQkJZWxlX2QgPSAob2ZkbXN3aW5nX3RhYmxlWyh1OCkgb2ZkbV9pbmRleFsxXV0gJgorCQkJCQkJMHhGRkMwMDAwMCkgPj4gMjI7CisJCQkJdmFsX3ggPSBydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZworCQkJCQkJW2luZGV4Zm9yY2hhbm5lbF0udmFsdWVbMF1bNF07CisJCQkJdmFsX3kgPSBydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZworCQkJCQkJW2luZGV4Zm9yY2hhbm5lbF0udmFsdWVbMF1bNV07CisJCQkJaWYgKHZhbF94ICE9IDApIHsKKwkJCQkJaWYgKCh2YWxfeCAmIDB4MDAwMDAyMDApICE9IDApCisJCQkJCQkvKiBjb25zaWRlciBtaW51cyAqLworCQkJCQkJdmFsX3ggPSB2YWxfeCB8IDB4RkZGRkZDMDA7CisJCQkJCWVsZV9hID0gKCh2YWxfeCAqIGVsZV9kKSA+PiA4KSAmCisJCQkJCQkweDAwMDAwM0ZGOworCQkJCQkvKiBuZXcgZWxlbWVudCBDID0gZWxlbWVudCBEIHggWSAqLworCQkJCQlpZiAoKHZhbF95ICYgMHgwMDAwMDIwMCkgIT0gMCkKKwkJCQkJCXZhbF95ID0KKwkJCQkJCSAgICB2YWxfeSB8IDB4RkZGRkZDMDA7CisJCQkJCWVsZV9jID0KKwkJCQkJICAgICgodmFsX3kgKgorCQkJCQkgICAgICBlbGVfZCkgPj4gOCkgJiAweDAwMDAzRkY7CisJCQkJCS8qIHdyaXRlIG5ldyBlbGVtZW50cyBBLCBDLCBEIHRvIHJlZ0M4OAorCQkJCQkgKiBhbmQgcmVnQzlDLCBlbGVtZW50IEIgaXMgYWx3YXlzIDAKKwkJCQkJICovCisJCQkJCXZhbHVlMzIgPSAoZWxlX2QgPDwgMjIpIHwKKwkJCQkJCSAgKChlbGVfYyAmIDB4M0YpIDw8IDE2KSB8CisJCQkJCQkgIGVsZV9hOworCQkJCQlydGxfc2V0X2JicmVnKGh3LAorCQkJCQkJICAgICAgUk9GRE0wX1hCVHhJUUlNQkFMQU5DRSwKKwkJCQkJCSAgICAgIEJNQVNLRFdPUkQsIHZhbHVlMzIpOworCQkJCQl2YWx1ZTMyID0gKGVsZV9jICYgMHgwMDAwMDNDMCkgPj4gNjsKKwkJCQkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1hEVHhBRkUsCisJCQkJCQkgICAgICBCTUFTS0g0QklUUywgdmFsdWUzMik7CisJCQkJCXZhbHVlMzIgPSAoKHZhbF94ICogZWxlX2QpID4+IDcpICYgMHgwMTsKKwkJCQkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX0VDQ0FUSFJFU0hPTEQsCisJCQkJCQkgICAgICBCSVQoMjgpLCB2YWx1ZTMyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlydGxfc2V0X2JicmVnKGh3LAorCQkJCQkJICAgICAgUk9GRE0wX1hCVHhJUUlNQkFMQU5DRSwKKwkJCQkJCSAgICAgIEJNQVNLRFdPUkQsCisJCQkJCQkgICAgICBvZmRtc3dpbmdfdGFibGUKKwkJCQkJCSAgICAgIFsodTgpIG9mZG1faW5kZXhbMV1dKTsKKwkJCQkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1hEVHhBRkUsCisJCQkJCQkgICAgICBCTUFTS0g0QklUUywgMHgwMCk7CisJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9FQ0NBVEhSRVNIT0xELAorCQkJCQkJICAgICAgQklUKDI4KSwgMHgwMCk7CisJCQkJfQorCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCQkgKCJUeFB3clRyYWNraW5nIHBhdGggQjogWCA9IDB4JWx4LCAiCisJCQkJCSAiWSA9IDB4JWx4IGVsZV9BID0gMHglbHggZWxlX0MgPSAweCIKKwkJCQkJICIlbHggZWxlX0QgPSAweCVseCAweGViNCA9IDB4JWx4ICIKKwkJCQkJICIweGViYyA9IDB4JWx4XG4iLAorCQkJCQkgIHZhbF94LCB2YWxfeSwgZWxlX2EsIGVsZV9jLAorCQkJCQkgIGVsZV9kLCB2YWxfeCwgdmFsX3kpKTsKKwkJCX0KKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJCSAoIlR4UHdyVHJhY2tpbmcgMHhjODAgPSAweCV4LCAweGM5NCA9ICIKKwkJCQkgIjB4JXggUkYgMHgyNCA9IDB4JXhcbiIsCisJCQkJIHJ0bF9nZXRfYmJyZWcoaHcsIDB4YzgwLCBCTUFTS0RXT1JEKSwKKwkJCQkgcnRsX2dldF9iYnJlZyhodywgMHhjOTQsIEJNQVNLRFdPUkQpLAorCQkJCSBydGxfZ2V0X3JmcmVnKGh3LCBSRjkwX1BBVEhfQSwgMHgyNCwKKwkJCQkgQlJGUkVHT0ZGU0VUTUFTSykpKTsKKwkJfQorCQlpZiAoKGRlbHRhX2lxayA+IHJ0bGVmdXNlLT5kZWx0YV9pcWspICYmCisJCSAgICAocnRsZWZ1c2UtPmRlbHRhX2lxayAhPSAwKSkgeworCQkJcnRsOTJkX3BoeV9yZXNldF9pcWtfcmVzdWx0KGh3KTsKKwkJCXJ0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZV9pcWsgPSB0aGVybWFsdmFsdWU7CisJCQlydGw5MmRfcGh5X2lxX2NhbGlicmF0ZShodyk7CisJCX0KKwkJaWYgKGRlbHRhX3J4Z2FpbiA+IDAgJiYgcnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fNUcKKwkJICAgICYmIHRoZXJtYWx2YWx1ZSA8PSBydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlcikgeworCQkJcnRscHJpdi0+ZG0udGhlcm1hbHZhbHVlX3J4Z2FpbiA9IHRoZXJtYWx2YWx1ZTsKKwkJCXJ0bDkyZF9kbV9yeGdhaW5fdHJhY2tpbmdfdGhlcm1hbG1ldGVyKGh3KTsKKwkJfQorCQlpZiAocnRscHJpdi0+ZG0udHhwb3dlcl90cmFja19jb250cm9sKQorCQkJcnRscHJpdi0+ZG0udGhlcm1hbHZhbHVlID0gdGhlcm1hbHZhbHVlOworCX0KKworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELCAoIjw9PT1cbiIpKTsKK30KKworc3RhdGljIHZvaWQgcnRsOTJkX2RtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxwcml2LT5kbS50eHBvd2VyX3RyYWNraW5nID0gdHJ1ZTsKKwlydGxwcml2LT5kbS50eHBvd2VyX3RyYWNraW5naW5pdCA9IGZhbHNlOworCXJ0bHByaXYtPmRtLnR4cG93ZXJfdHJhY2tfY29udHJvbCA9IHRydWU7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCSAoInBNZ250SW5mby0+dHhwb3dlcl90cmFja2luZyA9ICVkXG4iLAorCQkgcnRscHJpdi0+ZG0udHhwb3dlcl90cmFja2luZykpOworfQorCit2b2lkIHJ0bDkyZF9kbV9jaGVja190eHBvd2VyX3RyYWNraW5nX3RoZXJtYWxfbWV0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0YXRpYyB1OCB0bV90cmlnZ2VyOworCisJaWYgKCFydGxwcml2LT5kbS50eHBvd2VyX3RyYWNraW5nKQorCQlyZXR1cm47CisKKwlpZiAoIXRtX3RyaWdnZXIpIHsKKwkJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIFJGX1RfTUVURVIsIEJJVCgxNykgfAorCQkJICAgICAgQklUKDE2KSwgMHgwMyk7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVJfVFJBQ0tJTkcsIERCR19MT1VELAorCQkJICgiVHJpZ2dlciA5MlMgVGhlcm1hbCBNZXRlciEhXG4iKSk7CisJCXRtX3RyaWdnZXIgPSAxOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9QT1dFUl9UUkFDS0lORywgREJHX0xPVUQsCisJCQkgKCJTY2hlZHVsZSBUeFBvd2VyVHJhY2tpbmcgZGlyZWN0IGNhbGwhIVxuIikpOworCQlydGw5MmRfZG1fdHhwb3dlcl90cmFja2luZ19jYWxsYmFja190aGVybWFsbWV0ZXIoaHcpOworCQl0bV90cmlnZ2VyID0gMDsKKwl9Cit9CisKK3ZvaWQgcnRsOTJkX2RtX2luaXRfcmF0ZV9hZGFwdGl2ZV9tYXNrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcmF0ZV9hZGFwdGl2ZSAqcmEgPSAmKHJ0bHByaXYtPnJhKTsKKworCXJhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfSU5JVDsKKwlyYS0+cHJlX3JhdHJfc3RhdGUgPSBETV9SQVRSX1NUQV9JTklUOworCWlmIChydGxwcml2LT5kbS5kbV90eXBlID09IERNX1RZUEVfQllEUklWRVIpCisJCXJ0bHByaXYtPmRtLnVzZXJhbWFzayA9IHRydWU7CisJZWxzZQorCQlydGxwcml2LT5kbS51c2VyYW1hc2sgPSBmYWxzZTsKK30KKwordm9pZCBydGw5MmRfZG1faW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxwcml2LT5kbS5kbV90eXBlID0gRE1fVFlQRV9CWURSSVZFUjsKKwlydGw5MmRfZG1fZGlnaW5pdChodyk7CisJcnRsOTJkX2RtX2luaXRfZHluYW1pY190eHBvd2VyKGh3KTsKKwlydGw5MmRfZG1faW5pdF9lZGNhX3R1cmJvKGh3KTsKKwlydGw5MmRfZG1faW5pdF9yYXRlX2FkYXB0aXZlX21hc2soaHcpOworCXJ0bDkyZF9kbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoaHcpOworfQorCit2b2lkIHJ0bDkyZF9kbV93YXRjaGRvZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlib29sIGZ3X2N1cnJlbnRfaW5wc21vZGUgPSBmYWxzZTsKKwlib29sIGZ3cHNfYXdha2UgPSB0cnVlOworCisJLyogMS4gUkYgaXMgT0ZGLiAoTm8gbmVlZCB0byBkbyBETS4pCisJICogMi4gRncgaXMgdW5kZXIgcG93ZXIgc2F2aW5nIG1vZGUgZm9yIEZ3TFBTLgorCSAqICAgIChQcmV2ZW50IGZyb20gU1cvRlcgSS9PIHJhY2luZy4pCisJICogMy4gSVBTIHdvcmtpdGVtIGlzIHNjaGVkdWxlZC4gKFByZXZlbnQgZnJvbSBJUFMgc2VxdWVuY2UKKwkgKiAgICB0byBiZSBzd2FwcGVkIHdpdGggRE0uCisJICogNC4gUkZDaGFuZ2VJblByb2dyZXNzIGlzIFRSVUUuCisJICogICAgKFByZXZlbnQgZnJvbSBicm9rZW4gYnkgSVBTL0hXL1NXIFJmIG9mZi4pICovCisKKwlpZiAoKHBwc2MtPnJmcHdyX3N0YXRlID09IEVSRk9OKSAmJiAoKCFmd19jdXJyZW50X2lucHNtb2RlKSAmJgorCSAgICBmd3BzX2F3YWtlKSAmJiAoIXBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MpKSB7CisJCXJ0bDkyZF9kbV9wd2RiX21vbml0b3IoaHcpOworCQlydGw5MmRfZG1fZmFsc2VfYWxhcm1fY291bnRlcl9zdGF0aXN0aWNzKGh3KTsKKwkJcnRsOTJkX2RtX2ZpbmRfbWluaW11bV9yc3NpKGh3KTsKKwkJcnRsOTJkX2RtX2RpZyhodyk7CisJCS8qIHJ0bDkyZF9kbV9keW5hbWljX2JiX3Bvd2Vyc2F2aW5nKGh3KTsgKi8KKwkJcnRsOTJkX2RtX2R5bmFtaWNfdHhwb3dlcihodyk7CisJCS8qIHJ0bDkyZF9kbV9jaGVja190eHBvd2VyX3RyYWNraW5nX3RoZXJtYWxfbWV0ZXIoaHcpOyAqLworCQkvKiBydGw5MmRfZG1fcmVmcmVzaF9yYXRlX2FkYXB0aXZlX21hc2soaHcpOyAqLworCQkvKiBydGw5MmRfZG1faW50ZXJydXB0X21pZ3JhdGlvbihodyk7ICovCisJCXJ0bDkyZF9kbV9jaGVja19lZGNhX3R1cmJvKGh3KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9kbS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvZG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTM1NDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvZG0uaApAQCAtMCwwICsxLDIxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYJX19SVEw5MkNfRE1fSF9fCisjZGVmaW5lIF9fUlRMOTJDX0RNX0hfXworCisjZGVmaW5lIEhBTF9ETV9ESUdfRElTQUJMRQkJCUJJVCgwKQorI2RlZmluZSBIQUxfRE1fSElQV1JfRElTQUJMRQkJCUJJVCgxKQorCisjZGVmaW5lIE9GRE1fVEFCTEVfTEVOR1RICQkJMzcKKyNkZWZpbmUgT0ZETV9UQUJMRV9TSVpFXzkyRAkJCTQzCisjZGVmaW5lIENDS19UQUJMRV9MRU5HVEgJCQkzMworCisjZGVmaW5lIENDS19UQUJMRV9TSVpFCQkJCTMzCisKKyNkZWZpbmUgQldfQVVUT19TV0lUQ0hfSElHSF9MT1cJCQkyNQorI2RlZmluZSBCV19BVVRPX1NXSVRDSF9MT1dfSElHSAkJCTMwCisKKyNkZWZpbmUgRE1fRElHX1RIUkVTSF9ISUdICQkJNDAKKyNkZWZpbmUgRE1fRElHX1RIUkVTSF9MT1cJCQkzNQorCisjZGVmaW5lIERNX0ZBTFNFQUxBUk1fVEhSRVNIX0xPVwkJNDAwCisjZGVmaW5lIERNX0ZBTFNFQUxBUk1fVEhSRVNIX0hJR0gJCTEwMDAKKworI2RlZmluZSBETV9ESUdfTUFYCQkJCTB4M2UKKyNkZWZpbmUgRE1fRElHX01JTgkJCQkweDFjCisKKyNkZWZpbmUgRE1fRElHX0ZBX1VQUEVSCQkJCTB4MzIKKyNkZWZpbmUgRE1fRElHX0ZBX0xPV0VSCQkJCTB4MjAKKyNkZWZpbmUgRE1fRElHX0ZBX1RIMAkJCQkweDEwMAorI2RlZmluZSBETV9ESUdfRkFfVEgxCQkJCTB4NDAwCisjZGVmaW5lIERNX0RJR19GQV9USDIJCQkJMHg2MDAKKworI2RlZmluZSBETV9ESUdfQkFDS09GRl9NQVgJCQkxMgorI2RlZmluZSBETV9ESUdfQkFDS09GRl9NSU4JCQktNAorI2RlZmluZSBETV9ESUdfQkFDS09GRl9ERUZBVUxUCQkJMTAKKworI2RlZmluZSBSWFBBVEhTRUxFQ1RJT05fU1NfVEhfbE9XCQkzMAorI2RlZmluZSBSWFBBVEhTRUxFQ1RJT05fRElGRl9USAkJCTE4CisKKyNkZWZpbmUgRE1fUkFUUl9TVEFfSU5JVAkJCTAKKyNkZWZpbmUgRE1fUkFUUl9TVEFfSElHSAkJCTEKKyNkZWZpbmUgRE1fUkFUUl9TVEFfTUlERExFCQkJMgorI2RlZmluZSBETV9SQVRSX1NUQV9MT1cJCQkJMworCisjZGVmaW5lIENUUzJTRUxGX1RIVkFMCQkJCTMwCisjZGVmaW5lIFJFR0MzOF9USAkJCQkyMAorCisjZGVmaW5lIFdBSU9UVEhWQUwJCQkJMjUKKworI2RlZmluZSBUWEhJR0hQV1JMRVZFTF9OT1JNQUwJCQkwCisjZGVmaW5lIFRYSElHSFBXUkxFVkVMX0xFVkVMMQkJCTEKKyNkZWZpbmUgVFhISUdIUFdSTEVWRUxfTEVWRUwyCQkJMgorI2RlZmluZSBUWEhJR0hQV1JMRVZFTF9CVDEJCQkzCisjZGVmaW5lIFRYSElHSFBXUkxFVkVMX0JUMgkJCTQKKworI2RlZmluZSBETV9UWVBFX0JZRlcJCQkJMAorI2RlZmluZSBETV9UWVBFX0JZRFJJVkVSCQkJMQorCisjZGVmaW5lIFRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0xWTDIJCTc0CisjZGVmaW5lIFRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0xWTDEJCTY3CisjZGVmaW5lIElOREVYX01BUFBJTkdfTlVNCQkJMTMKKworc3RydWN0IHBzX3QgeworCXU4IHByZV9jY2FzdGF0ZTsKKwl1OCBjdXJfY2Nhc2F0ZTsKKworCXU4IHByZV9yZnN0YXRlOworCXU4IGN1cl9yZnN0YXRlOworCisJbG9uZyByc3NpX3ZhbF9taW47Cit9OworCitzdHJ1Y3QgZGlnX3QgeworCXU4IGRpZ19lbmFibGVfZmxhZzsKKwl1OCBkaWdfZXh0X3BvcnRfc3RhZ2U7CisKKwl1MzIgcnNzaV9sb3d0aHJlc2g7CisJdTMyIHJzc2lfaGlnaHRocmVzaDsKKworCXUzMiBmYV9sb3d0aHJlc2g7CisJdTMyIGZhX2hpZ2h0aHJlc2g7CisKKwl1OCBjdXJzdGFfY29ubmVjdGN0YXRlOworCXU4IHByZXN0YV9jb25uZWN0c3RhdGU7CisJdTggY3VybXVsdGlzdGFfY29ubmVjdHN0YXRlOworCisJdTggcHJlX2lndmFsdWU7CisJdTggY3VyX2lndmFsdWU7CisKKwljaGFyIGJhY2tvZmZfdmFsOworCWNoYXIgYmFja29mZl92YWxfcmFuZ2VfbWF4OworCWNoYXIgYmFja29mZl92YWxfcmFuZ2VfbWluOworCXU4IHJ4X2dhaW5fcmFuZ2VfbWF4OworCXU4IHJ4X2dhaW5fcmFuZ2VfbWluOworCXU4IG1pbl91bmRlY29yYXRlZF9wd2RiX2Zvcl9kbTsKKwlsb25nIGxhc3RfbWluX3VuZGVjb3JhdGVkX3B3ZGJfZm9yX2RtOworCisJdTggcHJlX2Nja19wZF9zdGF0ZTsKKwl1OCBjdXJfY2NrX3BkX3N0YXRlOworCisJdTggcHJlX2Nja19mYV9zdGF0ZTsKKwl1OCBjdXJfY2NrX2ZhX3N0YXRlOworCisJdTggcHJlX2NjYXN0YXRlOworCXU4IGN1cl9jY2FzYXRlOworCisJdTggbGFyZ2VfZmFfaGl0OworCXU4IGZvcmJpZGRlbl9pZ2k7CisJdTMyIHJlY292ZXJfY250OworfTsKKworc3RydWN0IHN3YXQgeworCXU4IGZhaWx1cmVfY250OworCXU4IHRyeV9mbGFnOworCXU4IHN0b3BfdHJ5aW5nOworCWxvbmcgcHJlX3Jzc2k7CisJbG9uZyB0cnlpbmdfdGhyZXNob2xkOworCXU4IGN1cl9hbnRlbm5hOworCXU4IHByZV9hbnRlbm5hOworfTsKKworZW51bSB0YWdfZHluYW1pY19pbml0X2dhaW5fb3BlcmF0aW9uX3R5cGVfZGVmaW5pdGlvbiB7CisJRElHX1RZUEVfVEhSRVNIX0hJR0ggPSAwLAorCURJR19UWVBFX1RIUkVTSF9MT1cgPSAxLAorCURJR19UWVBFX0JBQ0tPRkYgPSAyLAorCURJR19UWVBFX1JYX0dBSU5fTUlOID0gMywKKwlESUdfVFlQRV9SWF9HQUlOX01BWCA9IDQsCisJRElHX1RZUEVfRU5BQkxFID0gNSwKKwlESUdfVFlQRV9ESVNBQkxFID0gNiwKKwlESUdfT1BfVFlQRV9NQVgKK307CisKK2VudW0gdGFnX2Nja19wYWNrZXRfZGV0ZWN0aW9uX3RocmVzaG9sZF90eXBlX2RlZmluaXRpb24geworCUNDS19QRF9TVEFHRV9MT1dSU1NJID0gMCwKKwlDQ0tfUERfU1RBR0VfSElHSFJTU0kgPSAxLAorCUNDS19GQV9TVEFHRV9MT1cgPSAyLAorCUNDS19GQV9TVEFHRV9ISUdIID0gMywKKwlDQ0tfUERfU1RBR0VfTUFYID0gNCwKK307CisKK2VudW0gZG1fMXJfY2NhIHsKKwlDQ0FfMVIgPSAwLAorCUNDQV8yUiA9IDEsCisJQ0NBX01BWCA9IDIsCit9OworCitlbnVtIGRtX3JmIHsKKwlSRl9TQVZFID0gMCwKKwlSRl9OT1JNQUwgPSAxLAorCVJGX01BWCA9IDIsCit9OworCitlbnVtIGRtX3N3X2FudF9zd2l0Y2ggeworCUFOU19BTlRFTk5BX0IgPSAxLAorCUFOU19BTlRFTk5BX0EgPSAyLAorCUFOU19BTlRFTk5BX01BWCA9IDMsCit9OworCitlbnVtIGRtX2RpZ19leHRfcG9ydF9hbGcgeworCURJR19FWFRfUE9SVF9TVEFHRV8wID0gMCwKKwlESUdfRVhUX1BPUlRfU1RBR0VfMSA9IDEsCisJRElHX0VYVF9QT1JUX1NUQUdFXzIgPSAyLAorCURJR19FWFRfUE9SVF9TVEFHRV8zID0gMywKKwlESUdfRVhUX1BPUlRfU1RBR0VfTUFYID0gNCwKK307CisKK2VudW0gZG1fZGlnX2Nvbm5lY3QgeworCURJR19TVEFfRElTQ09OTkVDVCA9IDAsCisJRElHX1NUQV9DT05ORUNUID0gMSwKKwlESUdfU1RBX0JFRk9SRV9DT05ORUNUID0gMiwKKwlESUdfTVVMVElTVEFfRElTQ09OTkVDVCA9IDMsCisJRElHX01VTFRJU1RBX0NPTk5FQ1QgPSA0LAorCURJR19DT05ORUNUX01BWAorfTsKKworZXh0ZXJuIHN0cnVjdCBkaWdfdCBkZV9kaWd0YWJsZTsKKwordm9pZCBydGw5MmRfZG1faW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDkyZF9kbV93YXRjaGRvZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDkyZF9kbV9pbml0X2VkY2FfdHVyYm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw5MmRfZG1fd3JpdGVfZGlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsOTJkX2RtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmdfdGhlcm1hbF9tZXRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDkyZF9kbV9pbml0X3JhdGVfYWRhcHRpdmVfbWFzayhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmMDYwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2Z3LmMKQEAgLTAsMCArMSw3OTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vd2lmaS5oIgorI2luY2x1ZGUgIi4uL3BjaS5oIgorI2luY2x1ZGUgIi4uL2Jhc2UuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJkZWYuaCIKKyNpbmNsdWRlICJmdy5oIgorI2luY2x1ZGUgInN3LmgiCisKK3N0YXRpYyBib29sIF9ydGw5MmRfaXNfZndfZG93bmxvYWRlZChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYpCit7CisJcmV0dXJuIChydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfTUNVRldETCkgJiBNQ1VGV0RMX1JEWSkgPworCQl0cnVlIDogZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfZW5hYmxlX2Z3X2Rvd25sb2FkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggdG1wOworCisJaWYgKGVuYWJsZSkgeworCQl0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTiArIDEpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4gKyAxLCB0bXAgfCAweDA0KTsKKwkJdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTUNVRldETCk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19NQ1VGV0RMLCB0bXAgfCAweDAxKTsKKwkJdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTUNVRldETCArIDIpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTUNVRldETCArIDIsIHRtcCAmIDB4ZjcpOworCX0gZWxzZSB7CisJCXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX01DVUZXREwpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTUNVRldETCwgdG1wICYgMHhmZSk7CisJCS8qIFJlc2VydmVkIGZvciBmdyBleHRlbnNpb24uCisJCSAqIDB4ODFbN10gaXMgdXNlZCBmb3IgbWFjMCBzdGF0dXMgLAorCQkgKiBzbyBkb24ndCB3cml0ZSB0aGlzIHJlZyBoZXJlCisJCSAqIHJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19NQ1VGV0RMICsgMSwgMHgwMCk7Ki8KKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfZndfYmxvY2tfd3JpdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgY29uc3QgdTggKmJ1ZmZlciwgdTMyIHNpemUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBibG9ja3NpemUgPSBzaXplb2YodTMyKTsKKwl1OCAqYnVmZmVycHRyID0gKHU4ICopIGJ1ZmZlcjsKKwl1MzIgKnB1NEJ5dGVQdHIgPSAodTMyICopIGJ1ZmZlcjsKKwl1MzIgaSwgb2Zmc2V0LCBibG9ja0NvdW50LCByZW1haW5TaXplOworCisJYmxvY2tDb3VudCA9IHNpemUgLyBibG9ja3NpemU7CisJcmVtYWluU2l6ZSA9IHNpemUgJSBibG9ja3NpemU7CisJZm9yIChpID0gMDsgaSA8IGJsb2NrQ291bnQ7IGkrKykgeworCQlvZmZzZXQgPSBpICogYmxvY2tzaXplOworCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgKEZXXzgxOTJEX1NUQVJUX0FERFJFU1MgKyBvZmZzZXQpLAorCQkJCSoocHU0Qnl0ZVB0ciArIGkpKTsKKwl9CisJaWYgKHJlbWFpblNpemUpIHsKKwkJb2Zmc2V0ID0gYmxvY2tDb3VudCAqIGJsb2Nrc2l6ZTsKKwkJYnVmZmVycHRyICs9IG9mZnNldDsKKwkJZm9yIChpID0gMDsgaSA8IHJlbWFpblNpemU7IGkrKykgeworCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgKEZXXzgxOTJEX1NUQVJUX0FERFJFU1MgKworCQkJCQkJIG9mZnNldCArIGkpLCAqKGJ1ZmZlcnB0ciArIGkpKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF9md19wYWdlX3dyaXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgdTMyIHBhZ2UsIGNvbnN0IHU4ICpidWZmZXIsIHUzMiBzaXplKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCB2YWx1ZTg7CisJdTggdThwYWdlID0gKHU4KSAocGFnZSAmIDB4MDcpOworCisJdmFsdWU4ID0gKHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX01DVUZXREwgKyAyKSAmIDB4RjgpIHwgdThwYWdlOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIChSRUdfTUNVRldETCArIDIpLCB2YWx1ZTgpOworCV9ydGw5MmRfZndfYmxvY2tfd3JpdGUoaHcsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfZmlsbF9kdW1teSh1OCAqcGZ3YnVmLCB1MzIgKnBmd2xlbikKK3sKKwl1MzIgZndsZW4gPSAqcGZ3bGVuOworCXU4IHJlbWFpbiA9ICh1OCkgKGZ3bGVuICUgNCk7CisKKwlyZW1haW4gPSAocmVtYWluID09IDApID8gMCA6ICg0IC0gcmVtYWluKTsKKwl3aGlsZSAocmVtYWluID4gMCkgeworCQlwZndidWZbZndsZW5dID0gMDsKKwkJZndsZW4rKzsKKwkJcmVtYWluLS07CisJfQorCSpwZndsZW4gPSBmd2xlbjsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF93cml0ZV9mdyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgZW51bSB2ZXJzaW9uXzgxOTJkIHZlcnNpb24sIHU4ICpidWZmZXIsIHUzMiBzaXplKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXU4ICpidWZmZXJQdHIgPSAodTggKikgYnVmZmVyOworCXUzMiBwYWdlbnVtcywgcmVtYWluU2l6ZTsKKwl1MzIgcGFnZSwgb2Zmc2V0OworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9GVywgREJHX1RSQUNFLCAoIkZXIHNpemUgaXMgJWQgYnl0ZXMsXG4iLCBzaXplKSk7CisJaWYgKHJ0bGhhbC0+aHdfdHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTJERSkKKwkJX3J0bDkyZF9maWxsX2R1bW15KGJ1ZmZlclB0ciwgJnNpemUpOworCXBhZ2VudW1zID0gc2l6ZSAvIEZXXzgxOTJEX1BBR0VfU0laRTsKKwlyZW1haW5TaXplID0gc2l6ZSAlIEZXXzgxOTJEX1BBR0VfU0laRTsKKwlpZiAocGFnZW51bXMgPiA4KSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJQYWdlIG51bWJlcnMgc2hvdWxkIG5vdCBncmVhdGVyIHRoZW4gOFxuIikpOworCX0KKwlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgcGFnZW51bXM7IHBhZ2UrKykgeworCQlvZmZzZXQgPSBwYWdlICogRldfODE5MkRfUEFHRV9TSVpFOworCQlfcnRsOTJkX2Z3X3BhZ2Vfd3JpdGUoaHcsIHBhZ2UsIChidWZmZXJQdHIgKyBvZmZzZXQpLAorCQkJCSAgICAgIEZXXzgxOTJEX1BBR0VfU0laRSk7CisJfQorCWlmIChyZW1haW5TaXplKSB7CisJCW9mZnNldCA9IHBhZ2VudW1zICogRldfODE5MkRfUEFHRV9TSVpFOworCQlwYWdlID0gcGFnZW51bXM7CisJCV9ydGw5MmRfZndfcGFnZV93cml0ZShodywgcGFnZSwgKGJ1ZmZlclB0ciArIG9mZnNldCksCisJCQkJICAgICAgcmVtYWluU2l6ZSk7CisJfQorfQorCitzdGF0aWMgaW50IF9ydGw5MmRfZndfZnJlZV90b19nbyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIGNvdW50ZXIgPSAwOworCXUzMiB2YWx1ZTMyOworCisJZG8geworCQl2YWx1ZTMyID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgUkVHX01DVUZXREwpOworCX0gd2hpbGUgKChjb3VudGVyKysgPCBGV184MTkyRF9QT0xMSU5HX1RJTUVPVVRfQ09VTlQpICYmCisJCSAoISh2YWx1ZTMyICYgRldETF9DaGtTdW1fcnB0KSkpOworCWlmIChjb3VudGVyID49IEZXXzgxOTJEX1BPTExJTkdfVElNRU9VVF9DT1VOVCkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiY2hrc3VtIHJlcG9ydCBmYWlsbCAhIFJFR19NQ1VGV0RMOjB4JTA4eCAuXG4iLAorCQkJIHZhbHVlMzIpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRlcsIERCR19UUkFDRSwKKwkJICgiQ2hlY2tzdW0gcmVwb3J0IE9LICEgUkVHX01DVUZXREw6MHglMDh4IC5cbiIsIHZhbHVlMzIpKTsKKwl2YWx1ZTMyID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgUkVHX01DVUZXREwpOworCXZhbHVlMzIgfD0gTUNVRldETF9SRFk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19NQ1VGV0RMLCB2YWx1ZTMyKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBydGw5MmRfZmlybXdhcmVfc2VsZnJlc2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCB1MWJfdG1wOworCXU4IGRlbGF5ID0gMTAwOworCisJLyogU2V0IChSRUdfSE1FVEZSICsgMykgdG8gIDB4MjAgaXMgcmVzZXQgODA1MSAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19ITUVURlIgKyAzLCAweDIwKTsKKwl1MWJfdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4gKyAxKTsKKwl3aGlsZSAodTFiX3RtcCAmIEJJVCgyKSkgeworCQlkZWxheS0tOworCQlpZiAoZGVsYXkgPT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoNTApOworCQl1MWJfdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4gKyAxKTsKKwl9CisJUlRfQVNTRVJUKChkZWxheSA+IDApLCAoIjgwNTEgcmVzZXQgZmFpbGVkIVxuIikpOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRlcsIERCR19ETUVTRywKKwkJICgiPT09PT0+IDgwNTEgcmVzZXQgc3VjY2VzcyAoJWQpIC5cbiIsIGRlbGF5KSk7Cit9CisKK3N0YXRpYyBpbnQgX3J0bDkyZF9md19pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXUzMiBjb3VudGVyOworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9GVywgREJHX0RNRVNHLCAoIkZXIGFscmVhZHkgaGF2ZSBkb3dubG9hZFxuIikpOworCS8qIHBvbGxpbmcgZm9yIEZXIHJlYWR5ICovCisJY291bnRlciA9IDA7CisJZG8geworCQlpZiAocnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9PSAwKSB7CisJCQlpZiAocnRsX3JlYWRfYnl0ZShydGxwcml2LCBGV19NQUMwX1JFQURZKSAmCisJCQkgICAgTUFDMF9SRUFEWSkgeworCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRlcsIERCR19ETUVTRywKKwkJCQkJICgiUG9sbGluZyBGVyByZWFkeSBzdWNjZXNzISEgIgorCQkJCQkgIlJFR19NQ1VGV0RMOiAweCV4IC5cbiIsCisJCQkJCSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsCisJCQkJCSBGV19NQUMwX1JFQURZKSkpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJdWRlbGF5KDUpOworCQl9IGVsc2UgeworCQkJaWYgKHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgRldfTUFDMV9SRUFEWSkgJgorCQkJICAgIE1BQzFfUkVBRFkpIHsKKwkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0ZXLCBEQkdfRE1FU0csCisJCQkJCSAoIlBvbGxpbmcgRlcgcmVhZHkgc3VjY2VzcyEhICIKKwkJCQkJICJSRUdfTUNVRldETDogMHgleCAuXG4iLAorCQkJCQkgcnRsX3JlYWRfYnl0ZShydGxwcml2LAorCQkJCQkJICAgICAgIEZXX01BQzFfUkVBRFkpKSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQl1ZGVsYXkoNSk7CisJCX0KKwl9IHdoaWxlIChjb3VudGVyKysgPCBQT0xMSU5HX1JFQURZX1RJTUVPVVRfQ09VTlQpOworCisJaWYgKHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPT0gMCkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0ZXLCBEQkdfRE1FU0csCisJCQkgKCJQb2xsaW5nIEZXIHJlYWR5IGZhaWwhISBNQUMwIEZXIGluaXQgbm90IHJlYWR5OiAiCisJCQkgIjB4JXggLlxuIiwKKwkJCSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIEZXX01BQzBfUkVBRFkpKSk7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9GVywgREJHX0RNRVNHLAorCQkJICgiUG9sbGluZyBGVyByZWFkeSBmYWlsISEgTUFDMSBGVyBpbml0IG5vdCByZWFkeTogIgorCQkJICIweCV4IC5cbiIsCisJCQkgcnRsX3JlYWRfYnl0ZShydGxwcml2LCBGV19NQUMxX1JFQURZKSkpOworCX0KKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0ZXLCBEQkdfRE1FU0csCisJCSAoIlBvbGxpbmcgRlcgcmVhZHkgZmFpbCEhIFJFR19NQ1VGV0RMOjB4JTA4dWwgLlxuIiwKKwkJIHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIFJFR19NQ1VGV0RMKSkpOworCXJldHVybiAtMTsKK30KKworaW50IHJ0bDkyZF9kb3dubG9hZF9mdyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1OCAqcGZ3aGVhZGVyOworCXU4ICpwZndkYXRhOworCXUzMiBmd3NpemU7CisJaW50IGVycjsKKwllbnVtIHZlcnNpb25fODE5MmQgdmVyc2lvbiA9IHJ0bGhhbC0+dmVyc2lvbjsKKwl1OCB2YWx1ZTsKKwl1MzIgY291bnQ7CisJYm9vbCBmd19kb3dubG9hZGVkID0gZmFsc2UsIGZ3ZGxfaW5fcHJvY2VzcyA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXJ0bGhhbC0+cGZpcm13YXJlKQorCQlyZXR1cm4gMTsKKwlmd3NpemUgPSBydGxoYWwtPmZ3c2l6ZTsKKwlwZndoZWFkZXIgPSAodTggKikgcnRsaGFsLT5wZmlybXdhcmU7CisJcGZ3ZGF0YSA9ICh1OCAqKSBydGxoYWwtPnBmaXJtd2FyZTsKKwlydGxoYWwtPmZ3X3ZlcnNpb24gPSAodTE2KSBHRVRfRklSTVdBUkVfSERSX1ZFUlNJT04ocGZ3aGVhZGVyKTsKKwlydGxoYWwtPmZ3X3N1YnZlcnNpb24gPSAodTE2KSBHRVRfRklSTVdBUkVfSERSX1NVQl9WRVIocGZ3aGVhZGVyKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELCAoIiBGaXJtd2FyZVZlcnNpb24oJWQpLCIKKwkJICJGaXJtd2FyZVN1YlZlcnNpb24oJWQpLCBTaWduYXR1cmUoJSN4KVxuIiwKKwkJIHJ0bGhhbC0+ZndfdmVyc2lvbiwJcnRsaGFsLT5md19zdWJ2ZXJzaW9uLAorCQkgR0VUX0ZJUk1XQVJFX0hEUl9TSUdOQVRVUkUocGZ3aGVhZGVyKSkpOworCWlmIChJU19GV19IRUFERVJfRVhJU1QocGZ3aGVhZGVyKSkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELAorCQkJICgiU2hpZnQgMzIgYnl0ZXMgZm9yIEZXIGhlYWRlciEhXG4iKSk7CisJCXBmd2RhdGEgPSBwZndkYXRhICsgMzI7CisJCWZ3c2l6ZSA9IGZ3c2l6ZSAtIDMyOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZnbG9iYWxtdXRleF9mb3JfZndkb3dubG9hZCwgZmxhZ3MpOworCWZ3X2Rvd25sb2FkZWQgPSBfcnRsOTJkX2lzX2Z3X2Rvd25sb2FkZWQocnRscHJpdik7CisJaWYgKChydGxfcmVhZF9ieXRlKHJ0bHByaXYsIDB4MWYpICYgQklUKDUpKSA9PSBCSVQoNSkpCisJCWZ3ZGxfaW5fcHJvY2VzcyA9IHRydWU7CisJZWxzZQorCQlmd2RsX2luX3Byb2Nlc3MgPSBmYWxzZTsKKwlpZiAoZndfZG93bmxvYWRlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnbG9iYWxtdXRleF9mb3JfZndkb3dubG9hZCwgZmxhZ3MpOworCQlnb3RvIGV4aXQ7CisJfSBlbHNlIGlmIChmd2RsX2luX3Byb2Nlc3MpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2xvYmFsbXV0ZXhfZm9yX2Z3ZG93bmxvYWQsIGZsYWdzKTsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgNTAwMDsgY291bnQrKykgeworCQkJdWRlbGF5KDUwMCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2xvYmFsbXV0ZXhfZm9yX2Z3ZG93bmxvYWQsIGZsYWdzKTsKKwkJCWZ3X2Rvd25sb2FkZWQgPSBfcnRsOTJkX2lzX2Z3X2Rvd25sb2FkZWQocnRscHJpdik7CisJCQlpZiAoKHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgMHgxZikgJiBCSVQoNSkpID09IEJJVCg1KSkKKwkJCQlmd2RsX2luX3Byb2Nlc3MgPSB0cnVlOworCQkJZWxzZQorCQkJCWZ3ZGxfaW5fcHJvY2VzcyA9IGZhbHNlOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2xvYmFsbXV0ZXhfZm9yX2Z3ZG93bmxvYWQsCisJCQkJCSAgICAgICBmbGFncyk7CisJCQlpZiAoZndfZG93bmxvYWRlZCkKKwkJCQlnb3RvIGV4aXQ7CisJCQllbHNlIGlmICghZndkbF9pbl9wcm9jZXNzKQorCQkJCWJyZWFrOworCQkJZWxzZQorCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRlcsIERCR19ETUVTRywKKwkJCQkJICgiV2FpdCBmb3IgYW5vdGhlciBtYWMgIgorCQkJCQkgImRvd25sb2FkIGZ3XG4iKSk7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdsb2JhbG11dGV4X2Zvcl9md2Rvd25sb2FkLCBmbGFncyk7CisJCXZhbHVlID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCAweDFmKTsKKwkJdmFsdWUgfD0gQklUKDUpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDFmLCB2YWx1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdsb2JhbG11dGV4X2Zvcl9md2Rvd25sb2FkLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJdmFsdWUgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIDB4MWYpOworCQl2YWx1ZSB8PSBCSVQoNSk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4MWYsIHZhbHVlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2xvYmFsbXV0ZXhfZm9yX2Z3ZG93bmxvYWQsIGZsYWdzKTsKKwl9CisKKwkvKiBJZiA4MDUxIGlzIHJ1bm5pbmcgaW4gUkFNIGNvZGUsIGRyaXZlciBzaG91bGQKKwkgKiBpbmZvcm0gRncgdG8gcmVzZXQgYnkgaXRzZWxmLCBvciBpdCB3aWxsIGNhdXNlCisJICogZG93bmxvYWQgRncgZmFpbC4qLworCS8qIDgwNTEgUkFNIGNvZGUgKi8KKwlpZiAocnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTUNVRldETCkgJiBCSVQoNykpIHsKKwkJcnRsOTJkX2Zpcm13YXJlX3NlbGZyZXNldChodyk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19NQ1VGV0RMLCAweDAwKTsKKwl9CisJX3J0bDkyZF9lbmFibGVfZndfZG93bmxvYWQoaHcsIHRydWUpOworCV9ydGw5MmRfd3JpdGVfZncoaHcsIHZlcnNpb24sIHBmd2RhdGEsIGZ3c2l6ZSk7CisJX3J0bDkyZF9lbmFibGVfZndfZG93bmxvYWQoaHcsIGZhbHNlKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2xvYmFsbXV0ZXhfZm9yX2Z3ZG93bmxvYWQsIGZsYWdzKTsKKwllcnIgPSBfcnRsOTJkX2Z3X2ZyZWVfdG9fZ28oaHcpOworCS8qIGRvd25sb2FkIGZ3IG92ZXIsY2xlYXIgMHgxZls1XSAqLworCXZhbHVlID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCAweDFmKTsKKwl2YWx1ZSAmPSAofkJJVCg1KSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHgxZiwgdmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdsb2JhbG11dGV4X2Zvcl9md2Rvd25sb2FkLCBmbGFncyk7CisJaWYgKGVycikgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiZncgaXMgbm90IHJlYWR5IHRvIHJ1biFcbiIpKTsKKwkJZ290byBleGl0OworCX0gZWxzZSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRlcsIERCR19UUkFDRSwKKwkJCSAoImZ3IGlzIHJlYWR5IHRvIHJ1biFcbiIpKTsKKwl9CitleGl0OgorCWVyciA9IF9ydGw5MmRfZndfaW5pdChodyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJvb2wgX3J0bDkyZF9jaGVja19md19yZWFkX2xhc3RfaDJjKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBib3hudW0pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IHZhbF9obWV0ZnI7CisJYm9vbCByZXN1bHQgPSBmYWxzZTsKKworCXZhbF9obWV0ZnIgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19ITUVURlIpOworCWlmICgoKHZhbF9obWV0ZnIgPj4gYm94bnVtKSAmIEJJVCgwKSkgPT0gMCkKKwkJcmVzdWx0ID0gdHJ1ZTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkX2ZpbGxfaDJjX2NvbW1hbmQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICB1OCBlbGVtZW50X2lkLCB1MzIgY21kX2xlbiwgdTggKmNtZGJ1ZmZlcikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwl1OCBib3hudW07CisJdTE2IGJveF9yZWcgPSAwLCBib3hfZXh0cmVnID0gMDsKKwl1OCB1MWJfdG1wOworCWJvb2wgaXNmd19yZWFkID0gZmFsc2U7CisJdTggYnVmX2luZGV4ID0gMDsKKwlib29sIGJ3cml0ZV9zdWNlc3MgPSBmYWxzZTsKKwl1OCB3YWl0X2gyY19saW1taXQgPSAxMDA7CisJdTggd2FpdF93cml0ZWgyY19saW1taXQgPSAxMDA7CisJdTggYm94Y29udGVudFs0XSwgYm94ZXh0Y29udGVudFsyXTsKKwl1MzIgaDJjX3dhaXRjb3VudGVyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJdTggaWR4OworCisJaWYgKHBwc2MtPnJmcHdyX3N0YXRlID09IEVSRk9GRiB8fCBwcHNjLT5pbmFjdGl2ZV9wd3JzdGF0ZSA9PSBFUkZPRkYpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELAorCQkJICgiUmV0dXJuIGFzIFJGIGlzIG9mZiEhIVxuIikpOworCQlyZXR1cm47CisJfQorCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfTE9VRCwgKCJjb21lIGluXG4iKSk7CisJd2hpbGUgKHRydWUpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLmgyY19sb2NrLCBmbGFnKTsKKwkJaWYgKHJ0bGhhbC0+aDJjX3NldGlucHJvZ3Jlc3MpIHsKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfTE9VRCwKKwkJCQkgKCJIMkMgc2V0IGluIHByb2dyZXNzISBXYWl0IHRvIHNldC4uIgorCQkJCSAiZWxlbWVudF9pZCglZCkuXG4iLCBlbGVtZW50X2lkKSk7CisKKwkJCXdoaWxlIChydGxoYWwtPmgyY19zZXRpbnByb2dyZXNzKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MuaDJjX2xvY2ssCisJCQkJCQkgICAgICAgZmxhZyk7CisJCQkJaDJjX3dhaXRjb3VudGVyKys7CisJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELAorCQkJCQkgKCJXYWl0IDEwMCB1cyAoJWQgdGltZXMpLi4uXG4iLAorCQkJCQkgaDJjX3dhaXRjb3VudGVyKSk7CisJCQkJdWRlbGF5KDEwMCk7CisKKwkJCQlpZiAoaDJjX3dhaXRjb3VudGVyID4gMTAwMCkKKwkJCQkJcmV0dXJuOworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLmgyY19sb2NrLAorCQkJCQkJICBmbGFnKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLmgyY19sb2NrLCBmbGFnKTsKKwkJfSBlbHNlIHsKKwkJCXJ0bGhhbC0+aDJjX3NldGlucHJvZ3Jlc3MgPSB0cnVlOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MuaDJjX2xvY2ssIGZsYWcpOworCQkJYnJlYWs7CisJCX0KKwl9CisJd2hpbGUgKCFid3JpdGVfc3VjZXNzKSB7CisJCXdhaXRfd3JpdGVoMmNfbGltbWl0LS07CisJCWlmICh3YWl0X3dyaXRlaDJjX2xpbW1pdCA9PSAwKSB7CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJCSAoIldyaXRlIEgyQyBmYWlsIGJlY2F1c2Ugbm8gdHJpZ2dlciAiCisJCQkJICJmb3IgRlcgSU5UIVxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJYm94bnVtID0gcnRsaGFsLT5sYXN0X2htZWJveG51bTsKKwkJc3dpdGNoIChib3hudW0pIHsKKwkJY2FzZSAwOgorCQkJYm94X3JlZyA9IFJFR19ITUVCT1hfMDsKKwkJCWJveF9leHRyZWcgPSBSRUdfSE1FQk9YX0VYVF8wOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWJveF9yZWcgPSBSRUdfSE1FQk9YXzE7CisJCQlib3hfZXh0cmVnID0gUkVHX0hNRUJPWF9FWFRfMTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlib3hfcmVnID0gUkVHX0hNRUJPWF8yOworCQkJYm94X2V4dHJlZyA9IFJFR19ITUVCT1hfRVhUXzI7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJYm94X3JlZyA9IFJFR19ITUVCT1hfMzsKKwkJCWJveF9leHRyZWcgPSBSRUdfSE1FQk9YX0VYVF8zOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJCSAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKSk7CisJCQlicmVhazsKKwkJfQorCQlpc2Z3X3JlYWQgPSBfcnRsOTJkX2NoZWNrX2Z3X3JlYWRfbGFzdF9oMmMoaHcsIGJveG51bSk7CisJCXdoaWxlICghaXNmd19yZWFkKSB7CisJCQl3YWl0X2gyY19saW1taXQtLTsKKwkJCWlmICh3YWl0X2gyY19saW1taXQgPT0gMCkgeworCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfTE9VRCwKKwkJCQkJICgiV2F0aW5nIHRvbyBsb25nIGZvciBGVyByZWFkICIKKwkJCQkJICJjbGVhciBITUVCb3goJWQpIVxuIiwgYm94bnVtKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoMTApOworCQkJaXNmd19yZWFkID0gX3J0bDkyZF9jaGVja19md19yZWFkX2xhc3RfaDJjKGh3LCBib3hudW0pOworCQkJdTFiX3RtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgMHgxQkYpOworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELAorCQkJCSAoIldhdGluZyBmb3IgRlcgcmVhZCBjbGVhciBITUVCb3goJWQpISEhICIKKwkJCQkgIjB4MUJGID0gJTJ4XG4iLCBib3hudW0sIHUxYl90bXApKTsKKwkJfQorCQlpZiAoIWlzZndfcmVhZCkgeworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELAorCQkJCSAoIldyaXRlIEgyQyByZWdpc3RlciBCT1hbJWRdIGZhaWwhISEhISAiCisJCQkJICJGdyBkbyBub3QgcmVhZC5cbiIsIGJveG51bSkpOworCQkJYnJlYWs7CisJCX0KKwkJbWVtc2V0KGJveGNvbnRlbnQsIDAsIHNpemVvZihib3hjb250ZW50KSk7CisJCW1lbXNldChib3hleHRjb250ZW50LCAwLCBzaXplb2YoYm94ZXh0Y29udGVudCkpOworCQlib3hjb250ZW50WzBdID0gZWxlbWVudF9pZDsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELAorCQkJICgiV3JpdGUgZWxlbWVudF9pZCBib3hfcmVnKCU0eCkgPSAlMnhcbiIsCisJCQkgYm94X3JlZywgZWxlbWVudF9pZCkpOworCQlzd2l0Y2ggKGNtZF9sZW4pIHsKKwkJY2FzZSAxOgorCQkJYm94Y29udGVudFswXSAmPSB+KEJJVCg3KSk7CisJCQltZW1jcHkoYm94Y29udGVudCArIDEsIGNtZGJ1ZmZlciArIGJ1Zl9pbmRleCwgMSk7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDQ7IGlkeCsrKQorCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIGJveF9yZWcgKyBpZHgsCisJCQkJCSAgICAgICBib3hjb250ZW50W2lkeF0pOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWJveGNvbnRlbnRbMF0gJj0gfihCSVQoNykpOworCQkJbWVtY3B5KGJveGNvbnRlbnQgKyAxLCBjbWRidWZmZXIgKyBidWZfaW5kZXgsIDIpOworCQkJZm9yIChpZHggPSAwOyBpZHggPCA0OyBpZHgrKykKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBib3hfcmVnICsgaWR4LAorCQkJCQkgICAgICAgYm94Y29udGVudFtpZHhdKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlib3hjb250ZW50WzBdICY9IH4oQklUKDcpKTsKKwkJCW1lbWNweShib3hjb250ZW50ICsgMSwgY21kYnVmZmVyICsgYnVmX2luZGV4LCAzKTsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgNDsgaWR4KyspCisJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgYm94X3JlZyArIGlkeCwKKwkJCQkJICAgICAgIGJveGNvbnRlbnRbaWR4XSk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJYm94Y29udGVudFswXSB8PSAoQklUKDcpKTsKKwkJCW1lbWNweShib3hleHRjb250ZW50LCBjbWRidWZmZXIgKyBidWZfaW5kZXgsIDIpOworCQkJbWVtY3B5KGJveGNvbnRlbnQgKyAxLCBjbWRidWZmZXIgKyBidWZfaW5kZXggKyAyLCAyKTsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgMjsgaWR4KyspCisJCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgYm94X2V4dHJlZyArIGlkeCwKKwkJCQkJICAgICAgIGJveGV4dGNvbnRlbnRbaWR4XSk7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDQ7IGlkeCsrKQorCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIGJveF9yZWcgKyBpZHgsCisJCQkJCSAgICAgICBib3hjb250ZW50W2lkeF0pOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWJveGNvbnRlbnRbMF0gfD0gKEJJVCg3KSk7CisJCQltZW1jcHkoYm94ZXh0Y29udGVudCwgY21kYnVmZmVyICsgYnVmX2luZGV4LCAyKTsKKwkJCW1lbWNweShib3hjb250ZW50ICsgMSwgY21kYnVmZmVyICsgYnVmX2luZGV4ICsgMiwgMyk7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDI7IGlkeCsrKQorCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIGJveF9leHRyZWcgKyBpZHgsCisJCQkJCSAgICAgICBib3hleHRjb250ZW50W2lkeF0pOworCQkJZm9yIChpZHggPSAwOyBpZHggPCA0OyBpZHgrKykKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBib3hfcmVnICsgaWR4LAorCQkJCQkgICAgICAgYm94Y29udGVudFtpZHhdKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCQkoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKSk7CisJCQlicmVhazsKKwkJfQorCQlid3JpdGVfc3VjZXNzID0gdHJ1ZTsKKwkJcnRsaGFsLT5sYXN0X2htZWJveG51bSA9IGJveG51bSArIDE7CisJCWlmIChydGxoYWwtPmxhc3RfaG1lYm94bnVtID09IDQpCisJCQlydGxoYWwtPmxhc3RfaG1lYm94bnVtID0gMDsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELAorCQkJICgicEhhbERhdGEtPmxhc3RfaG1lYm94bnVtICA9ICVkXG4iLAorCQkJICBydGxoYWwtPmxhc3RfaG1lYm94bnVtKSk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5oMmNfbG9jaywgZmxhZyk7CisJcnRsaGFsLT5oMmNfc2V0aW5wcm9ncmVzcyA9IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLmgyY19sb2NrLCBmbGFnKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0NNRCwgREJHX0xPVUQsICgiZ28gb3V0XG4iKSk7Cit9CisKK3ZvaWQgcnRsOTJkX2ZpbGxfaDJjX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSB1OCBlbGVtZW50X2lkLCB1MzIgY21kX2xlbiwgdTggKmNtZGJ1ZmZlcikKK3sKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXUzMiB0bXBfY21kYnVmWzJdOworCisJaWYgKHJ0bGhhbC0+ZndfcmVhZHkgPT0gZmFsc2UpIHsKKwkJUlRfQVNTRVJUKGZhbHNlLCAoInJldHVybiBIMkMgY21kIGJlY2F1c2Ugb2YgRncgIgorCQkJCSAgImRvd25sb2FkIGZhaWwhISFcbiIpKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQodG1wX2NtZGJ1ZiwgMCwgOCk7CisJbWVtY3B5KHRtcF9jbWRidWYsIGNtZGJ1ZmZlciwgY21kX2xlbik7CisJX3J0bDkyZF9maWxsX2gyY19jb21tYW5kKGh3LCBlbGVtZW50X2lkLCBjbWRfbGVuLCAodTggKikmdG1wX2NtZGJ1Zik7CisJcmV0dXJuOworfQorCit2b2lkIHJ0bDkyZF9zZXRfZndfcHdybW9kZV9jbWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IG1vZGUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXU4IHUxX2gyY19zZXRfcHdybW9kZVszXSA9IHsgMCB9OworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9QT1dFUiwgREJHX0xPVUQsICgiRlcgTFBTIG1vZGUgPSAlZFxuIiwgbW9kZSkpOworCVNFVF9IMkNDTURfUFdSTU9ERV9QQVJNX01PREUodTFfaDJjX3NldF9wd3Jtb2RlLCBtb2RlKTsKKwlTRVRfSDJDQ01EX1BXUk1PREVfUEFSTV9TTUFSVF9QUyh1MV9oMmNfc2V0X3B3cm1vZGUsIDEpOworCVNFVF9IMkNDTURfUFdSTU9ERV9QQVJNX0JDTl9QQVNTX1RJTUUodTFfaDJjX3NldF9wd3Jtb2RlLAorCQkJCQkgICAgICBwcHNjLT5yZWdfbWF4X2xwc19hd2FrZWludHZsKTsKKwlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfRE1FU0csCisJCSAgICAgICJydGw5MmRfc2V0X2Z3X3JzdmRwYWdlcGt0KCk6IHUxX2gyY19zZXRfcHdybW9kZVxuIiwKKwkJICAgICAgdTFfaDJjX3NldF9wd3Jtb2RlLCAzKTsKKwlydGw5MmRfZmlsbF9oMmNfY21kKGh3LCBIMkNfU0VUUFdSTU9ERSwgMywgdTFfaDJjX3NldF9wd3Jtb2RlKTsKK30KKworc3RhdGljIGJvb2wgX3J0bDkyZF9jbWRfc2VuZF9wYWNrZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZzsKKwlzdHJ1Y3QgcnRsX3R4X2Rlc2MgKnBkZXNjOworCXU4IGlkeCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcHNrYjsKKworCXJpbmcgPSAmcnRscGNpLT50eF9yaW5nW0JFQUNPTl9RVUVVRV07CisJcHNrYiA9IF9fc2tiX2RlcXVldWUoJnJpbmctPnF1ZXVlKTsKKwlpZiAocHNrYikKKwkJa2ZyZWVfc2tiKHBza2IpOworCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOworCXBkZXNjID0gJnJpbmctPmRlc2NbaWR4XTsKKwkvKiBkaXNjYXJkIG91dHB1dCBmcm9tIGNhbGwgYmVsb3cgKi8KKwlydGxwcml2LT5jZmctPm9wcy0+Z2V0X2Rlc2MoKHU4ICopIHBkZXNjLCB0cnVlLCBIV19ERVNDX09XTik7CisJcnRscHJpdi0+Y2ZnLT5vcHMtPmZpbGxfdHhfY21kZGVzYyhodywgKHU4ICopIHBkZXNjLCAxLCAxLCBza2IpOworCV9fc2tiX3F1ZXVlX3RhaWwoJnJpbmctPnF1ZXVlLCBza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLmlycV90aF9sb2NrLCBmbGFncyk7CisJcnRscHJpdi0+Y2ZnLT5vcHMtPnR4X3BvbGxpbmcoaHcsIEJFQUNPTl9RVUVVRSk7CisJcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgQkVBQ09OX1BHCQkwCS8qLT4xICovCisjZGVmaW5lIFBTUE9MTF9QRwkJMgorI2RlZmluZSBOVUxMX1BHCQkJMworI2RlZmluZSBQUk9CRVJTUF9QRwkJNAkvKi0+NSAqLworI2RlZmluZSBUT1RBTF9SRVNFUlZFRF9QS1RfTEVOCTc2OAorCitzdGF0aWMgdTggcmVzZXJ2ZWRfcGFnZV9wYWNrZXRbVE9UQUxfUkVTRVJWRURfUEtUX0xFTl0gPSB7CisJLyogcGFnZSAwIGJlYWNvbiAqLworCTB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHhGRiwgMHgwMCwgMHhFMCwgMHg0QywgMHg3NiwgMHgwMCwgMHg0MiwKKwkweDAwLCAweDQwLCAweDEwLCAweDEwLCAweDAwLCAweDAzLCAweDUwLCAweDA4LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHg2NCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwQywgMHg2QywgMHg2OSwKKwkweDZFLCAweDZCLCAweDczLCAweDc5LCAweDczLCAweDVGLCAweDc3LCAweDZDLAorCTB4NjEsIDB4NkUsIDB4MDEsIDB4MDQsIDB4ODIsIDB4ODQsIDB4OEIsIDB4OTYsCisJMHgwMywgMHgwMSwgMHgwMSwgMHgwNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgyQSwKKwkweDAxLCAweDAwLCAweDMyLCAweDA4LCAweDI0LCAweDMwLCAweDQ4LCAweDZDLAorCTB4MEMsIDB4MTIsIDB4MTgsIDB4NjAsIDB4MkQsIDB4MUEsIDB4NkMsIDB4MTgsCisJMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgzRCwgMHgwMCwgMHhERCwgMHgwNiwgMHgwMCwgMHhFMCwgMHg0QywgMHgwMiwKKwkweDAxLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKKwkvKiBwYWdlIDEgYmVhY29uICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgxMCwgMHgwMCwgMHgyMCwgMHg4QywgMHgwMCwgMHgxMiwgMHgxMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworCS8qIHBhZ2UgMiAgcHMtcG9sbCAqLworCTB4QTQsIDB4MTAsIDB4MDEsIDB4QzAsIDB4MDAsIDB4NDAsIDB4MTAsIDB4MTAsCisJMHgwMCwgMHgwMywgMHgwMCwgMHhFMCwgMHg0QywgMHg3NiwgMHgwMCwgMHg0MiwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MTgsIDB4MDAsIDB4MjAsIDB4OEMsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwKKwkweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKKwkvKiBwYWdlIDMgIG51bGwgKi8KKwkweDQ4LCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDEwLCAweDEwLAorCTB4MDAsIDB4MDMsIDB4MDAsIDB4RTAsIDB4NEMsIDB4NzYsIDB4MDAsIDB4NDIsCisJMHgwMCwgMHg0MCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDcyLCAweDAwLCAweDIwLCAweDhDLCAweDAwLCAweDEyLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsCisJMHg4MCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCisJLyogcGFnZSA0ICBwcm9iZV9yZXNwICovCisJMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgxMCwgMHgxMCwKKwkweDAwLCAweDAzLCAweDAwLCAweEUwLCAweDRDLCAweDc2LCAweDAwLCAweDQyLAorCTB4MDAsIDB4NDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsCisJMHg5RSwgMHg0NiwgMHgxNSwgMHgzMiwgMHgyNywgMHhGMiwgMHgyRCwgMHgwMCwKKwkweDY0LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDBDLCAweDZDLCAweDY5LAorCTB4NkUsIDB4NkIsIDB4NzMsIDB4NzksIDB4NzMsIDB4NUYsIDB4NzcsIDB4NkMsCisJMHg2MSwgMHg2RSwgMHgwMSwgMHgwNCwgMHg4MiwgMHg4NCwgMHg4QiwgMHg5NiwKKwkweDAzLCAweDAxLCAweDAxLCAweDA2LCAweDAyLCAweDAwLCAweDAwLCAweDJBLAorCTB4MDEsIDB4MDAsIDB4MzIsIDB4MDgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NkMsCisJMHgwQywgMHgxMiwgMHgxOCwgMHg2MCwgMHgyRCwgMHgxQSwgMHg2QywgMHgxOCwKKwkweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDNELCAweDAwLCAweERELCAweDA2LCAweDAwLCAweEUwLCAweDRDLCAweDAyLAorCTB4MDEsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworCS8qIHBhZ2UgNSAgcHJvYmVfcmVzcCAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCit9OworCit2b2lkIHJ0bDkyZF9zZXRfZndfcnN2ZHBhZ2Vwa3Qoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgZGxfZmluaXNoZWQpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdTMyIHRvdGFscGFja2V0bGVuOworCWJvb2wgcnRzdGF0dXM7CisJdTggdTFSc3ZkUGFnZUxvY1szXSA9IHsgMCB9OworCWJvb2wgZGxvayA9IGZhbHNlOworCXU4ICpiZWFjb247CisJdTggKnBfcHNwb2xsOworCXU4ICpudWxsZnVuYzsKKwl1OCAqcF9wcm9iZXJzcDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkJKDEpIGJlYWNvbgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJYmVhY29uID0gJnJlc2VydmVkX3BhZ2VfcGFja2V0W0JFQUNPTl9QRyAqIDEyOF07CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMihiZWFjb24sIG1hYy0+bWFjX2FkZHIpOworCVNFVF84MDIxMV9IRFJfQUREUkVTUzMoYmVhY29uLCBtYWMtPmJzc2lkKTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJCSgyKSBwcy1wb2xsCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXBfcHNwb2xsID0gJnJlc2VydmVkX3BhZ2VfcGFja2V0W1BTUE9MTF9QRyAqIDEyOF07CisJU0VUXzgwMjExX1BTX1BPTExfQUlEKHBfcHNwb2xsLCAobWFjLT5hc3NvY19pZCB8IDB4YzAwMCkpOworCVNFVF84MDIxMV9QU19QT0xMX0JTU0lEKHBfcHNwb2xsLCBtYWMtPmJzc2lkKTsKKwlTRVRfODAyMTFfUFNfUE9MTF9UQShwX3BzcG9sbCwgbWFjLT5tYWNfYWRkcik7CisJU0VUX0gyQ0NNRF9SU1ZEUEFHRV9MT0NfUFNQT0xMKHUxUnN2ZFBhZ2VMb2MsIFBTUE9MTF9QRyk7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkJKDMpIG51bGwgZGF0YQorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbnVsbGZ1bmMgPSAmcmVzZXJ2ZWRfcGFnZV9wYWNrZXRbTlVMTF9QRyAqIDEyOF07CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMShudWxsZnVuYywgbWFjLT5ic3NpZCk7CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMihudWxsZnVuYywgbWFjLT5tYWNfYWRkcik7CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMyhudWxsZnVuYywgbWFjLT5ic3NpZCk7CisJU0VUX0gyQ0NNRF9SU1ZEUEFHRV9MT0NfTlVMTF9EQVRBKHUxUnN2ZFBhZ2VMb2MsIE5VTExfUEcpOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCQkoNCkgcHJvYmUgcmVzcG9uc2UKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlwX3Byb2JlcnNwID0gJnJlc2VydmVkX3BhZ2VfcGFja2V0W1BST0JFUlNQX1BHICogMTI4XTsKKwlTRVRfODAyMTFfSERSX0FERFJFU1MxKHBfcHJvYmVyc3AsIG1hYy0+YnNzaWQpOworCVNFVF84MDIxMV9IRFJfQUREUkVTUzIocF9wcm9iZXJzcCwgbWFjLT5tYWNfYWRkcik7CisJU0VUXzgwMjExX0hEUl9BRERSRVNTMyhwX3Byb2JlcnNwLCBtYWMtPmJzc2lkKTsKKwlTRVRfSDJDQ01EX1JTVkRQQUdFX0xPQ19QUk9CRV9SU1AodTFSc3ZkUGFnZUxvYywgUFJPQkVSU1BfUEcpOworCXRvdGFscGFja2V0bGVuID0gVE9UQUxfUkVTRVJWRURfUEtUX0xFTjsKKwlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfTE9VRCwKKwkJICAgICAgInJ0bDkyZF9zZXRfZndfcnN2ZHBhZ2Vwa3QoKTogSFdfVkFSX1NFVF9UWF9DTUQ6IEFMTFxuIiwKKwkJICAgICAgJnJlc2VydmVkX3BhZ2VfcGFja2V0WzBdLCB0b3RhbHBhY2tldGxlbik7CisJUlRfUFJJTlRfREFUQShydGxwcml2LCBDT01QX0NNRCwgREJHX0RNRVNHLAorCQkgICAgICAicnRsOTJkX3NldF9md19yc3ZkcGFnZXBrdCgpOiBIV19WQVJfU0VUX1RYX0NNRDogQUxMXG4iLAorCQkgICAgICB1MVJzdmRQYWdlTG9jLCAzKTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHRvdGFscGFja2V0bGVuKTsKKwltZW1jcHkoKHU4ICopIHNrYl9wdXQoc2tiLCB0b3RhbHBhY2tldGxlbiksICZyZXNlcnZlZF9wYWdlX3BhY2tldCwKKwkJdG90YWxwYWNrZXRsZW4pOworCXJ0c3RhdHVzID0gX3J0bDkyZF9jbWRfc2VuZF9wYWNrZXQoaHcsIHNrYik7CisKKwlpZiAocnRzdGF0dXMpCisJCWRsb2sgPSB0cnVlOworCWlmIChkbG9rKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVIsIERCR19MT1VELAorCQkJKCJTZXQgUlNWRCBwYWdlIGxvY2F0aW9uIHRvIEZ3LlxuIikpOworCQlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfRE1FU0csCisJCQkgICAgICAiSDJDX1JTVkRQQUdFOlxuIiwgdTFSc3ZkUGFnZUxvYywgMyk7CisJCXJ0bDkyZF9maWxsX2gyY19jbWQoaHcsIEgyQ19SU1ZEUEFHRSwKKwkJCXNpemVvZih1MVJzdmRQYWdlTG9jKSwgdTFSc3ZkUGFnZUxvYyk7CisJfSBlbHNlCisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCSgiU2V0IFJTVkQgcGFnZSBsb2NhdGlvbiB0byBGdyBGQUlMISEhISEhLlxuIikpOworfQorCit2b2lkIHJ0bDkyZF9zZXRfZndfam9pbmJzc19yZXBvcnRfY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBtc3RhdHVzKQoreworCXU4IHUxX2pvaW5ic3NycHRfcGFybVsxXSA9IHswfTsKKworCVNFVF9IMkNDTURfSk9JTkJTU1JQVF9QQVJNX09QTU9ERSh1MV9qb2luYnNzcnB0X3Bhcm0sIG1zdGF0dXMpOworCXJ0bDkyZF9maWxsX2gyY19jbWQoaHcsIEgyQ19KT0lOQlNTUlBULCAxLCB1MV9qb2luYnNzcnB0X3Bhcm0pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvZncuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2Z3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM0ZDQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2Z3LmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMOTJEX19GV19fSF9fCisjZGVmaW5lIF9fUlRMOTJEX19GV19fSF9fCisKKyNkZWZpbmUgRldfODE5MkRfU1RBUlRfQUREUkVTUwkJCTB4MTAwMAorI2RlZmluZSBGV184MTkyRF9QQUdFX1NJWkUJCQkJNDA5NgorI2RlZmluZSBGV184MTkyRF9QT0xMSU5HX1RJTUVPVVRfQ09VTlQJMTAwMAorCisjZGVmaW5lIElTX0ZXX0hFQURFUl9FWElTVChfcGZ3aGRyKQlcCisJCSgoR0VUX0ZJUk1XQVJFX0hEUl9TSUdOQVRVUkUoX3Bmd2hkcikgJiAweEZGRjApID09IDB4OTJDMCB8fCBcCisJCShHRVRfRklSTVdBUkVfSERSX1NJR05BVFVSRShfcGZ3aGRyKSAmIDB4RkZGMCkgPT0gMHg4OEMwIHx8ICBcCisJCShHRVRfRklSTVdBUkVfSERSX1NJR05BVFVSRShfcGZ3aGRyKSAmIDB4RkZGRikgPT0gMHg5MkQwIHx8ICBcCisJCShHRVRfRklSTVdBUkVfSERSX1NJR05BVFVSRShfcGZ3aGRyKSAmIDB4RkZGRikgPT0gMHg5MkQxIHx8ICBcCisJCShHRVRfRklSTVdBUkVfSERSX1NJR05BVFVSRShfcGZ3aGRyKSAmIDB4RkZGRikgPT0gMHg5MkQyIHx8ICBcCisJCShHRVRfRklSTVdBUkVfSERSX1NJR05BVFVSRShfcGZ3aGRyKSAmIDB4RkZGRikgPT0gMHg5MkQzKQorCisvKiBEZWZpbmUgYSBtYWNybyB0aGF0IHRha2VzIGFuIGxlMzIgd29yZCwgY29udmVydHMgaXQgdG8gaG9zdCBvcmRlcmluZywKKyAqIHJpZ2h0IHNoaWZ0cyBieSBhIHNwZWNpZmllZCBjb3VudCwgY3JlYXRlcyBhIG1hc2sgb2YgdGhlIHNwZWNpZmllZAorICogYml0IGNvdW50LCBhbmQgZXh0cmFjdHMgdGhhdCBudW1iZXIgb2YgYml0cy4KKyAqLworCisjZGVmaW5lIFNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MsIF9fc2hpZnQsIF9fbWFzaykJCVwKKwkoKGxlMzJfdG9fY3B1KCooKChfX2xlMzIgKikoX19wZGVzYykpKSkgPj4gKF9fc2hpZnQpKSAmCVwKKwlCSVRfTEVOX01BU0tfMzIoX19tYXNrKSkKKworLyogRmlybXdhcmUgSGVhZGVyKDgtYnl0ZSBhbGlubWVudCByZXF1aXJlZCkgKi8KKy8qIC0tLSBMT05HIFdPUkQgMCAtLS0tICovCisjZGVmaW5lIEdFVF9GSVJNV0FSRV9IRFJfU0lHTkFUVVJFKF9fZndoZHIpCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19md2hkciwgMCwgMTYpCisjZGVmaW5lIEdFVF9GSVJNV0FSRV9IRFJfQ0FURUdPUlkoX19md2hkcikJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX2Z3aGRyLCAxNiwgOCkKKyNkZWZpbmUgR0VUX0ZJUk1XQVJFX0hEUl9GVU5DVElPTihfX2Z3aGRyKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fZndoZHIsIDI0LCA4KQorI2RlZmluZSBHRVRfRklSTVdBUkVfSERSX1ZFUlNJT04oX19md2hkcikJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX2Z3aGRyICsgNCwgMCwgMTYpCisjZGVmaW5lIEdFVF9GSVJNV0FSRV9IRFJfU1VCX1ZFUihfX2Z3aGRyKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fZndoZHIgKyA0LCAxNiwgOCkKKyNkZWZpbmUgR0VUX0ZJUk1XQVJFX0hEUl9SU1ZEMShfX2Z3aGRyKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX2Z3aGRyICsgNCwgMjQsIDgpCisKKy8qIC0tLSBMT05HIFdPUkQgMSAtLS0tICovCisjZGVmaW5lIEdFVF9GSVJNV0FSRV9IRFJfTU9OVEgoX19md2hkcikJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19md2hkciArIDgsIDAsIDgpCisjZGVmaW5lIEdFVF9GSVJNV0FSRV9IRFJfREFURShfX2Z3aGRyKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX2Z3aGRyICsgOCwgOCwgOCkKKyNkZWZpbmUgR0VUX0ZJUk1XQVJFX0hEUl9IT1VSKF9fZndoZHIpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fZndoZHIgKyA4LCAxNiwgOCkKKyNkZWZpbmUgR0VUX0ZJUk1XQVJFX0hEUl9NSU5VVEUoX19md2hkcikJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX2Z3aGRyICsgOCwgMjQsIDgpCisjZGVmaW5lIEdFVF9GSVJNV0FSRV9IRFJfUk9NQ09ERV9TSVpFKF9fZndoZHIpCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19md2hkciArIDEyLCAwLCAxNikKKyNkZWZpbmUgR0VUX0ZJUk1XQVJFX0hEUl9SU1ZEMihfX2Z3aGRyKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX2Z3aGRyICsgMTIsIDE2LCAxNikKKworLyogLS0tIExPTkcgV09SRCAyIC0tLS0gKi8KKyNkZWZpbmUgR0VUX0ZJUk1XQVJFX0hEUl9TVk5fSURYKF9fZndoZHIpCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19md2hkciArIDE2LCAwLCAzMikKKyNkZWZpbmUgR0VUX0ZJUk1XQVJFX0hEUl9SU1ZEMyhfX2Z3aGRyKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX2Z3aGRyICsgMjAsIDAsIDMyKQorCisvKiAtLS0gTE9ORyBXT1JEIDMgLS0tLSAqLworI2RlZmluZSBHRVRfRklSTVdBUkVfSERSX1JTVkQ0KF9fZndoZHIpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fZndoZHIgKyAyNCwgMCwgMzIpCisjZGVmaW5lIEdFVF9GSVJNV0FSRV9IRFJfUlNWRDUoX19md2hkcikJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19md2hkciArIDI4LCAwLCAzMikKKworI2RlZmluZSBwYWdlbnVtXzEyOChfbGVuKSBcCisJKHUzMikoKChfbGVuKSA+PiA3KSArICgoX2xlbikgJiAweDdGID8gMSA6IDApKQorCisjZGVmaW5lIFNFVF9IMkNDTURfUFdSTU9ERV9QQVJNX01PREUoX19waDJjY21kLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19UT19MRV8xQllURShfX3BoMmNjbWQsIDAsIDgsIF9fdmFsKQorI2RlZmluZSBTRVRfSDJDQ01EX1BXUk1PREVfUEFSTV9TTUFSVF9QUyhfX3BoMmNjbWQsIF9fdmFsKQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoKF9fcGgyY2NtZCkgKyAxLCAwLCA4LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX0gyQ0NNRF9QV1JNT0RFX1BBUk1fQkNOX1BBU1NfVElNRShfX3BoMmNjbWQsIF9fdmFsKQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoKF9fcGgyY2NtZCkgKyAyLCAwLCA4LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX0gyQ0NNRF9KT0lOQlNTUlBUX1BBUk1fT1BNT0RFKF9fcGgyY2NtZCwgX192YWwpCVwKKwlTRVRfQklUU19UT19MRV8xQllURShfX3BoMmNjbWQsIDAsIDgsIF9fdmFsKQorI2RlZmluZSBTRVRfSDJDQ01EX1JTVkRQQUdFX0xPQ19QUk9CRV9SU1AoX19waDJjY21kLCBfX3ZhbCkJXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcGgyY2NtZCwgMCwgOCwgX192YWwpCisjZGVmaW5lIFNFVF9IMkNDTURfUlNWRFBBR0VfTE9DX1BTUE9MTChfX3BoMmNjbWQsIF9fdmFsKQlcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoKF9fcGgyY2NtZCkgKyAxLCAwLCA4LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX0gyQ0NNRF9SU1ZEUEFHRV9MT0NfTlVMTF9EQVRBKF9fcGgyY2NtZCwgX192YWwpCVwKKwlTRVRfQklUU19UT19MRV8xQllURSgoX19waDJjY21kKSArIDIsIDAsIDgsIF9fdmFsKQorCitzdHJ1Y3QgcnRsOTJkX2Zpcm13YXJlX2hlYWRlciB7CisJdTE2IHNpZ25hdHVyZTsKKwl1OCBjYXRlZ29yeTsKKwl1OCBmdW5jdGlvbjsKKwl1MTYgdmVyc2lvbjsKKwl1OCBzdWJ2ZXJzaW9uOworCXU4IHJzdmQxOworCisJdTggbW9udGg7CisJdTggZGF0ZTsKKwl1OCBob3VyOworCXU4IG1pbnV0ZTsKKwl1MTYgcmFtY29kZVNpemU7CisJdTE2IHJzdmQyOworCisJdTMyIHN2bmluZGV4OworCXUzMiByc3ZkMzsKKworCXUzMiByc3ZkNDsKKwl1MzIgcnN2ZDU7Cit9OworCitlbnVtIHJ0bDgxOTJkX2gyY19jbWQgeworCUgyQ19BUF9PRkZMT0FEID0gMCwKKwlIMkNfU0VUUFdSTU9ERSA9IDEsCisJSDJDX0pPSU5CU1NSUFQgPSAyLAorCUgyQ19SU1ZEUEFHRSA9IDMsCisJSDJDX1JTU0lfUkVQT1JUID0gNSwKKwlIMkNfUkFfTUFTSyA9IDYsCisJSDJDX01BQ19NT0RFX1NFTCA9IDksCisJSDJDX1BXUk0gPSAxNSwKKwlNQVhfSDJDQ01ECit9OworCitpbnQgcnRsOTJkX2Rvd25sb2FkX2Z3KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsOTJkX2ZpbGxfaDJjX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggZWxlbWVudF9pZCwKKwkJCSB1MzIgY21kX2xlbiwgdTggKnBfY21kYnVmZmVyKTsKK3ZvaWQgcnRsOTJkX2Zpcm13YXJlX3NlbGZyZXNldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDkyZF9zZXRfZndfcHdybW9kZV9jbWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IG1vZGUpOwordm9pZCBydGw5MmRfc2V0X2Z3X3JzdmRwYWdlcGt0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGJfZGxfZmluaXNoZWQpOwordm9pZCBydGw5MmRfc2V0X2Z3X2pvaW5ic3NfcmVwb3J0X2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggbXN0YXR1cyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2h3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3M2NmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2h3LmMKQEAgLTAsMCArMSwyMzI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL3dpZmkuaCIKKyNpbmNsdWRlICIuLi9lZnVzZS5oIgorI2luY2x1ZGUgIi4uL2Jhc2UuaCIKKyNpbmNsdWRlICIuLi9yZWdkLmgiCisjaW5jbHVkZSAiLi4vY2FtLmgiCisjaW5jbHVkZSAiLi4vcHMuaCIKKyNpbmNsdWRlICIuLi9wY2kuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJkZWYuaCIKKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJkbS5oIgorI2luY2x1ZGUgImZ3LmgiCisjaW5jbHVkZSAibGVkLmgiCisjaW5jbHVkZSAic3cuaCIKKyNpbmNsdWRlICJody5oIgorCit1MzIgcnRsOTJkZV9yZWFkX2R3b3JkX2RiaShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IG9mZnNldCwgdTggZGlyZWN0KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgdmFsdWU7CisKKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfREJJX0NUUkwsIChvZmZzZXQgJiAweEZGQykpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19EQklfRkxBRywgQklUKDEpIHwgZGlyZWN0KTsKKwl1ZGVsYXkoMTApOworCXZhbHVlID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgUkVHX0RCSV9SREFUQSk7CisJcmV0dXJuIHZhbHVlOworfQorCit2b2lkIHJ0bDkyZGVfd3JpdGVfZHdvcmRfZGJpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICB1MTYgb2Zmc2V0LCB1MzIgdmFsdWUsIHU4IGRpcmVjdCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfREJJX0NUUkwsICgob2Zmc2V0ICYgMHhGRkMpIHwgMHhGMDAwKSk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19EQklfV0RBVEEsIHZhbHVlKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfREJJX0ZMQUcsIEJJVCgwKSB8IGRpcmVjdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRlX3NldF9iY25fY3RybF9yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgdTggc2V0X2JpdHMsIHU4IGNsZWFyX2JpdHMpCit7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlydGxwY2ktPnJlZ19iY25fY3RybF92YWwgfD0gc2V0X2JpdHM7CisJcnRscGNpLT5yZWdfYmNuX2N0cmxfdmFsICY9IH5jbGVhcl9iaXRzOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05fQ1RSTCwgKHU4KSBydGxwY2ktPnJlZ19iY25fY3RybF92YWwpOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkZV9zdG9wX3R4X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggdG1wMWJ5dGU7CisKKwl0bXAxYnl0ZSA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfRldIV19UWFFfQ1RSTCArIDIsIHRtcDFieXRlICYgKH5CSVQoNikpKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQkNOX01BWF9FUlIsIDB4ZmYpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19UQlRUX1BST0hJQklUICsgMSwgMHg2NCk7CisJdG1wMWJ5dGUgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19UQlRUX1BST0hJQklUICsgMik7CisJdG1wMWJ5dGUgJj0gfihCSVQoMCkpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19UQlRUX1BST0hJQklUICsgMiwgdG1wMWJ5dGUpOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkZV9yZXN1bWVfdHhfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCB0bXAxYnl0ZTsKKworCXRtcDFieXRlID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfRldIV19UWFFfQ1RSTCArIDIpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19GV0hXX1RYUV9DVFJMICsgMiwgdG1wMWJ5dGUgfCBCSVQoNikpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05fTUFYX0VSUiwgMHgwYSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1RCVFRfUFJPSElCSVQgKyAxLCAweGZmKTsKKwl0bXAxYnl0ZSA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1RCVFRfUFJPSElCSVQgKyAyKTsKKwl0bXAxYnl0ZSB8PSBCSVQoMCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1RCVFRfUFJPSElCSVQgKyAyLCB0bXAxYnl0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRlX2VuYWJsZV9iY25fc3ViX2Z1bmMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJX3J0bDkyZGVfc2V0X2Jjbl9jdHJsX3JlZyhodywgMCwgQklUKDEpKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZGVfZGlzYWJsZV9iY25fc3ViX2Z1bmMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJX3J0bDkyZGVfc2V0X2Jjbl9jdHJsX3JlZyhodywgQklUKDEpLCAwKTsKK30KKwordm9pZCBydGw5MmRlX2dldF9od19yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCisJc3dpdGNoICh2YXJpYWJsZSkgeworCWNhc2UgSFdfVkFSX1JDUjoKKwkJKigodTMyICopICh2YWwpKSA9IHJ0bHBjaS0+cmVjZWl2ZV9jb25maWc7CisJCWJyZWFrOworCWNhc2UgSFdfVkFSX1JGX1NUQVRFOgorCQkqKChlbnVtIHJmX3B3cnN0YXRlICopKHZhbCkpID0gcHBzYy0+cmZwd3Jfc3RhdGU7CisJCWJyZWFrOworCWNhc2UgSFdfVkFSX0ZXTFBTX1JGX09OOnsKKwkJZW51bSByZl9wd3JzdGF0ZSByZlN0YXRlOworCQl1MzIgdmFsX3JjcjsKKworCQlydGxwcml2LT5jZmctPm9wcy0+Z2V0X2h3X3JlZyhodywgSFdfVkFSX1JGX1NUQVRFLAorCQkJCQkgICAgICAodTggKikgKCZyZlN0YXRlKSk7CisJCWlmIChyZlN0YXRlID09IEVSRk9GRikgeworCQkJKigoYm9vbCAqKSAodmFsKSkgPSB0cnVlOworCQl9IGVsc2UgeworCQkJdmFsX3JjciA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIFJFR19SQ1IpOworCQkJdmFsX3JjciAmPSAweDAwMDcwMDAwOworCQkJaWYgKHZhbF9yY3IpCisJCQkJKigoYm9vbCAqKSAodmFsKSkgPSBmYWxzZTsKKwkJCWVsc2UKKwkJCQkqKChib29sICopICh2YWwpKSA9IHRydWU7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgSFdfVkFSX0ZXX1BTTU9ERV9TVEFUVVM6CisJCSooKGJvb2wgKikgKHZhbCkpID0gcHBzYy0+ZndfY3VycmVudF9pbnBzbW9kZTsKKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfQ09SUkVDVF9UU0Y6eworCQl1NjQgdHNmOworCQl1MzIgKnB0c2ZfbG93ID0gKHUzMiAqKSZ0c2Y7CisJCXUzMiAqcHRzZl9oaWdoID0gKCh1MzIgKikmdHNmKSArIDE7CisKKwkJKnB0c2ZfaGlnaCA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIChSRUdfVFNGVFIgKyA0KSk7CisJCSpwdHNmX2xvdyA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIFJFR19UU0ZUUik7CisJCSooKHU2NCAqKSAodmFsKSkgPSB0c2Y7CisJCWJyZWFrOworCX0KKwljYXNlIEhXX1ZBUl9JTlRfTUlHUkFUSU9OOgorCQkqKChib29sICopKHZhbCkpID0gcnRscHJpdi0+ZG0uaW50ZXJydXB0X21pZ3JhdGlvbjsKKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfSU5UX0FDOgorCQkqKChib29sICopKHZhbCkpID0gcnRscHJpdi0+ZG0uZGlzYWJsZV90eF9pbnQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIikpOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgcnRsOTJkZV9zZXRfaHdfcmVnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCB2YXJpYWJsZSwgdTggKnZhbCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwl1OCBpZHg7CisKKwlzd2l0Y2ggKHZhcmlhYmxlKSB7CisJY2FzZSBIV19WQVJfRVRIRVJfQUREUjoKKwkJZm9yIChpZHggPSAwOyBpZHggPCBFVEhfQUxFTjsgaWR4KyspIHsKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIChSRUdfTUFDSUQgKyBpZHgpLAorCQkJCSAgICAgICB2YWxbaWR4XSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfQkFTSUNfUkFURTogeworCQl1MTYgcmF0ZV9jZmcgPSAoKHUxNiAqKSB2YWwpWzBdOworCQl1OCByYXRlX2luZGV4ID0gMDsKKworCQlyYXRlX2NmZyA9IHJhdGVfY2ZnICYgMHgxNWY7CisJCWlmIChtYWMtPnZlbmRvciA9PSBQRUVSX0NJU0NPICYmCisJCSAgICAoKHJhdGVfY2ZnICYgMHgxNTApID09IDApKQorCQkJcmF0ZV9jZmcgfD0gMHgwMTsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JSU1IsIHJhdGVfY2ZnICYgMHhmZik7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19SUlNSICsgMSwKKwkJCSAgICAgICAocmF0ZV9jZmcgPj4gOCkgJiAweGZmKTsKKwkJd2hpbGUgKHJhdGVfY2ZnID4gMHgxKSB7CisJCQlyYXRlX2NmZyA9IChyYXRlX2NmZyA+PiAxKTsKKwkJCXJhdGVfaW5kZXgrKzsKKwkJfQorCQlpZiAocnRsaGFsLT5md192ZXJzaW9uID4gMHhlKQorCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0lOSVJUU19SQVRFX1NFTCwKKwkJCQkgICAgICAgcmF0ZV9pbmRleCk7CisJCWJyZWFrOworCX0KKwljYXNlIEhXX1ZBUl9CU1NJRDoKKwkJZm9yIChpZHggPSAwOyBpZHggPCBFVEhfQUxFTjsgaWR4KyspIHsKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIChSRUdfQlNTSUQgKyBpZHgpLAorCQkJCSAgICAgICB2YWxbaWR4XSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfU0lGUzoKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NJRlNfQ1RYICsgMSwgdmFsWzBdKTsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NJRlNfVFJYICsgMSwgdmFsWzFdKTsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NQRUNfU0lGUyArIDEsIHZhbFswXSk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19NQUNfU1BFQ19TSUZTICsgMSwgdmFsWzBdKTsKKwkJaWYgKCFtYWMtPmh0X2VuYWJsZSkKKwkJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19SRVNQX1NJRlNfT0ZETSwKKwkJCQkgICAgICAgMHgwZTBlKTsKKwkJZWxzZQorCQkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX1JFU1BfU0lGU19PRkRNLAorCQkJCSAgICAgICAqKCh1MTYgKikgdmFsKSk7CisJCWJyZWFrOworCWNhc2UgSFdfVkFSX1NMT1RfVElNRTogeworCQl1OCBlX2FjaTsKKworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX01MTUUsIERCR19MT1VELAorCQkJICgiSFdfVkFSX1NMT1RfVElNRSAleFxuIiwgdmFsWzBdKSk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TTE9ULCB2YWxbMF0pOworCQlmb3IgKGVfYWNpID0gMDsgZV9hY2kgPCBBQ19NQVg7IGVfYWNpKyspCisJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywKKwkJCQkJCSAgICAgIEhXX1ZBUl9BQ19QQVJBTSwKKwkJCQkJCSAgICAgICh1OCAqKSAoJmVfYWNpKSk7CisJCWJyZWFrOworCX0KKwljYXNlIEhXX1ZBUl9BQ0tfUFJFQU1CTEU6IHsKKwkJdTggcmVnX3RtcDsKKwkJdTggc2hvcnRfcHJlYW1ibGUgPSAoYm9vbCkgKCoodTggKikgdmFsKTsKKworCQlyZWdfdG1wID0gKG1hYy0+Y3VyXzQwX3ByaW1lX3NjKSA8PCA1OworCQlpZiAoc2hvcnRfcHJlYW1ibGUpCisJCQlyZWdfdG1wIHw9IDB4ODA7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19SUlNSICsgMiwgcmVnX3RtcCk7CisJCWJyZWFrOworCX0KKwljYXNlIEhXX1ZBUl9BTVBEVV9NSU5fU1BBQ0U6IHsKKwkJdTggbWluX3NwYWNpbmdfdG9fc2V0OworCQl1OCBzZWNfbWluX3NwYWNlOworCisJCW1pbl9zcGFjaW5nX3RvX3NldCA9ICooKHU4ICopIHZhbCk7CisJCWlmIChtaW5fc3BhY2luZ190b19zZXQgPD0gNykgeworCQkJc2VjX21pbl9zcGFjZSA9IDA7CisJCQlpZiAobWluX3NwYWNpbmdfdG9fc2V0IDwgc2VjX21pbl9zcGFjZSkKKwkJCQltaW5fc3BhY2luZ190b19zZXQgPSBzZWNfbWluX3NwYWNlOworCQkJbWFjLT5taW5fc3BhY2VfY2ZnID0gKChtYWMtPm1pbl9zcGFjZV9jZmcgJiAweGY4KSB8CisJCQkJCSAgICAgIG1pbl9zcGFjaW5nX3RvX3NldCk7CisJCQkqdmFsID0gbWluX3NwYWNpbmdfdG9fc2V0OworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9NTE1FLCBEQkdfTE9VRCwKKwkJCQkgKCJTZXQgSFdfVkFSX0FNUERVX01JTl9TUEFDRTogJSN4XG4iLAorCQkJCSBtYWMtPm1pbl9zcGFjZV9jZmcpKTsKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19BTVBEVV9NSU5fU1BBQ0UsCisJCQkJICAgICAgIG1hYy0+bWluX3NwYWNlX2NmZyk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgSFdfVkFSX1NIT1JUR0lfREVOU0lUWTogeworCQl1OCBkZW5zaXR5X3RvX3NldDsKKworCQlkZW5zaXR5X3RvX3NldCA9ICooKHU4ICopIHZhbCk7CisJCW1hYy0+bWluX3NwYWNlX2NmZyA9IHJ0bHByaXYtPnJ0bGhhbC5taW5zcGFjZV9jZmc7CisJCW1hYy0+bWluX3NwYWNlX2NmZyB8PSAoZGVuc2l0eV90b19zZXQgPDwgMyk7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfTUxNRSwgREJHX0xPVUQsCisJCQkgKCJTZXQgSFdfVkFSX1NIT1JUR0lfREVOU0lUWTogJSN4XG4iLAorCQkJIG1hYy0+bWluX3NwYWNlX2NmZykpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQU1QRFVfTUlOX1NQQUNFLAorCQkJICAgICAgIG1hYy0+bWluX3NwYWNlX2NmZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEhXX1ZBUl9BTVBEVV9GQUNUT1I6IHsKKwkJdTggZmFjdG9yX3Rvc2V0OworCQl1MzIgcmVndG9TZXQ7CisJCXU4ICpwdG1wX2J5dGUgPSBOVUxMOworCQl1OCBpbmRleDsKKworCQlpZiAocnRsaGFsLT5tYWNwaHltb2RlID09IERVQUxNQUNfRFVBTFBIWSkKKwkJCXJlZ3RvU2V0ID0gMHhiOTcyNjY0MTsKKwkJZWxzZSBpZiAocnRsaGFsLT5tYWNwaHltb2RlID09IERVQUxNQUNfU0lOR0xFUEhZKQorCQkJcmVndG9TZXQgPSAweDY2NjI2NjQxOworCQllbHNlCisJCQlyZWd0b1NldCA9IDB4Yjk3MmE4NDE7CisJCWZhY3Rvcl90b3NldCA9ICooKHU4ICopIHZhbCk7CisJCWlmIChmYWN0b3JfdG9zZXQgPD0gMykgeworCQkJZmFjdG9yX3Rvc2V0ID0gKDEgPDwgKGZhY3Rvcl90b3NldCArIDIpKTsKKwkJCWlmIChmYWN0b3JfdG9zZXQgPiAweGYpCisJCQkJZmFjdG9yX3Rvc2V0ID0gMHhmOworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykgeworCQkJCXB0bXBfYnl0ZSA9ICh1OCAqKSAoJnJlZ3RvU2V0KSArIGluZGV4OworCQkJCWlmICgoKnB0bXBfYnl0ZSAmIDB4ZjApID4KKwkJCQkgICAgKGZhY3Rvcl90b3NldCA8PCA0KSkKKwkJCQkJKnB0bXBfYnl0ZSA9ICgqcHRtcF9ieXRlICYgMHgwZikKKwkJCQkJCSB8IChmYWN0b3JfdG9zZXQgPDwgNCk7CisJCQkJaWYgKCgqcHRtcF9ieXRlICYgMHgwZikgPiBmYWN0b3JfdG9zZXQpCisJCQkJCSpwdG1wX2J5dGUgPSAoKnB0bXBfYnl0ZSAmIDB4ZjApCisJCQkJCQkgICAgIHwgKGZhY3Rvcl90b3NldCk7CisJCQl9CisJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0FHR0xFTl9MTVQsIHJlZ3RvU2V0KTsKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfTUxNRSwgREJHX0xPVUQsCisJCQkJICgiU2V0IEhXX1ZBUl9BTVBEVV9GQUNUT1I6ICUjeFxuIiwKKwkJCQkgZmFjdG9yX3Rvc2V0KSk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgSFdfVkFSX0FDX1BBUkFNOiB7CisJCXU4IGVfYWNpID0gKigodTggKikgdmFsKTsKKwkJcnRsOTJkX2RtX2luaXRfZWRjYV90dXJibyhodyk7CisJCWlmIChydGxwY2ktPmFjbV9tZXRob2QgIT0gZUFjbVdheTJfU1cpCisJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywgSFdfVkFSX0FDTV9DVFJMLAorCQkJCQkJICAgICAgKHU4ICopICgmZV9hY2kpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSFdfVkFSX0FDTV9DVFJMOiB7CisJCXU4IGVfYWNpID0gKigodTggKikgdmFsKTsKKwkJdW5pb24gYWNpX2FpZnNuICpwX2FjaV9haWZzbiA9CisJCSAgICAodW5pb24gYWNpX2FpZnNuICopKCYobWFjLT5hY1swXS5haWZzKSk7CisJCXU4IGFjbSA9IHBfYWNpX2FpZnNuLT5mLmFjbTsKKwkJdTggYWNtX2N0cmwgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19BQ01IV0NUUkwpOworCisJCWFjbV9jdHJsID0gYWNtX2N0cmwgfCAoKHJ0bHBjaS0+YWNtX21ldGhvZCA9PSAyKSA/ICAweDAgOiAweDEpOworCQlpZiAoYWNtKSB7CisJCQlzd2l0Y2ggKGVfYWNpKSB7CisJCQljYXNlIEFDMF9CRToKKwkJCQlhY21fY3RybCB8PSBBQ01IV19CRVFFTjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUMyX1ZJOgorCQkJCWFjbV9jdHJsIHw9IEFDTUhXX1ZJUUVOOworCQkJCWJyZWFrOworCQkJY2FzZSBBQzNfVk86CisJCQkJYWNtX2N0cmwgfD0gQUNNSFdfVk9RRU47CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCQkJICgiSFdfVkFSX0FDTV9DVFJMIGFjbSBzZXQgIgorCQkJCQkgImZhaWxlZDogZUFDSSBpcyAlZFxuIiwgYWNtKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKGVfYWNpKSB7CisJCQljYXNlIEFDMF9CRToKKwkJCQlhY21fY3RybCAmPSAofkFDTUhXX0JFUUVOKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUMyX1ZJOgorCQkJCWFjbV9jdHJsICY9ICh+QUNNSFdfVklRRU4pOworCQkJCWJyZWFrOworCQkJY2FzZSBBQzNfVk86CisJCQkJYWNtX2N0cmwgJj0gKH5BQ01IV19WT1FFTik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkJCSAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9RT1MsIERCR19UUkFDRSwKKwkJCSAoIlNldEh3UmVnODE5MHBjaSgpOiBbSFdfVkFSX0FDTV9DVFJMXSAiCisJCQkgIldyaXRlIDB4JVhcbiIsIGFjbV9jdHJsKSk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19BQ01IV0NUUkwsIGFjbV9jdHJsKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSFdfVkFSX1JDUjoKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19SQ1IsICgodTMyICopICh2YWwpKVswXSk7CisJCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgPSAoKHUzMiAqKSAodmFsKSlbMF07CisJCWJyZWFrOworCWNhc2UgSFdfVkFSX1JFVFJZX0xJTUlUOiB7CisJCXU4IHJldHJ5X2xpbWl0ID0gKCh1OCAqKSAodmFsKSlbMF07CisKKwkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX1JMLAorCQkJICAgICAgIHJldHJ5X2xpbWl0IDw8IFJFVFJZX0xJTUlUX1NIT1JUX1NISUZUIHwKKwkJCSAgICAgICByZXRyeV9saW1pdCA8PCBSRVRSWV9MSU1JVF9MT05HX1NISUZUKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSFdfVkFSX0RVQUxfVFNGX1JTVDoKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0RVQUxfVFNGX1JTVCwgKEJJVCgwKSB8IEJJVCgxKSkpOworCQlicmVhazsKKwljYXNlIEhXX1ZBUl9FRlVTRV9CWVRFUzoKKwkJcnRsZWZ1c2UtPmVmdXNlX3VzZWRieXRlcyA9ICooKHUxNiAqKSB2YWwpOworCQlicmVhazsKKwljYXNlIEhXX1ZBUl9FRlVTRV9VU0FHRToKKwkJcnRsZWZ1c2UtPmVmdXNlX3VzZWRwZXJjZW50YWdlID0gKigodTggKikgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfSU9fQ01EOgorCQlydGw5MmRfcGh5X3NldF9pb19jbWQoaHcsICgqKGVudW0gaW9fdHlwZSAqKXZhbCkpOworCQlicmVhazsKKwljYXNlIEhXX1ZBUl9XUEFfQ09ORklHOgorCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU0VDQ0ZHLCAqKCh1OCAqKSB2YWwpKTsKKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfU0VUX1JQV006CisJCXJ0bDkyZF9maWxsX2gyY19jbWQoaHcsIEgyQ19QV1JNLCAxLCAodTggKikgKHZhbCkpOworCQlicmVhazsKKwljYXNlIEhXX1ZBUl9IMkNfRldfUFdSTU9ERToKKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfRldfUFNNT0RFX1NUQVRVUzoKKwkJcHBzYy0+ZndfY3VycmVudF9pbnBzbW9kZSA9ICooKGJvb2wgKikgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBIV19WQVJfSDJDX0ZXX0pPSU5CU1NSUFQ6IHsKKwkJdTggbXN0YXR1cyA9ICgqKHU4ICopIHZhbCk7CisJCXU4IHRtcF9yZWdjciwgdG1wX3JlZzQyMjsKKwkJYm9vbCByZWNvdmVyID0gZmFsc2U7CisKKwkJaWYgKG1zdGF0dXMgPT0gUlRfTUVESUFfQ09OTkVDVCkgeworCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsCisJCQkJCQkgICAgICBIV19WQVJfQUlELCBOVUxMKTsKKwkJCXRtcF9yZWdjciA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0NSICsgMSk7CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQ1IgKyAxLAorCQkJCSAgICAgICAodG1wX3JlZ2NyIHwgQklUKDApKSk7CisJCQlfcnRsOTJkZV9zZXRfYmNuX2N0cmxfcmVnKGh3LCAwLCBCSVQoMykpOworCQkJX3J0bDkyZGVfc2V0X2Jjbl9jdHJsX3JlZyhodywgQklUKDQpLCAwKTsKKwkJCXRtcF9yZWc0MjIgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsCisJCQkJCQkgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyKTsKKwkJCWlmICh0bXBfcmVnNDIyICYgQklUKDYpKQorCQkJCXJlY292ZXIgPSB0cnVlOworCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAorCQkJCSAgICAgICB0bXBfcmVnNDIyICYgKH5CSVQoNikpKTsKKwkJCXJ0bDkyZF9zZXRfZndfcnN2ZHBhZ2Vwa3QoaHcsIDApOworCQkJX3J0bDkyZGVfc2V0X2Jjbl9jdHJsX3JlZyhodywgQklUKDMpLCAwKTsKKwkJCV9ydGw5MmRlX3NldF9iY25fY3RybF9yZWcoaHcsIDAsIEJJVCg0KSk7CisJCQlpZiAocmVjb3ZlcikKKwkJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LAorCQkJCQkgICAgICAgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAorCQkJCQkgICAgICAgdG1wX3JlZzQyMik7CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQ1IgKyAxLAorCQkJCSAgICAgICAodG1wX3JlZ2NyICYgfihCSVQoMCkpKSk7CisJCX0KKwkJcnRsOTJkX3NldF9md19qb2luYnNzX3JlcG9ydF9jbWQoaHcsICgqKHU4ICopIHZhbCkpOworCQlicmVhazsKKwl9CisJY2FzZSBIV19WQVJfQUlEOiB7CisJCXUxNiB1MmJ0bXA7CisJCXUyYnRtcCA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgUkVHX0JDTl9QU1JfUlBUKTsKKwkJdTJidG1wICY9IDB4QzAwMDsKKwkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX0JDTl9QU1JfUlBULCAodTJidG1wIHwKKwkJCSAgICAgICBtYWMtPmFzc29jX2lkKSk7CisJCWJyZWFrOworCX0KKwljYXNlIEhXX1ZBUl9DT1JSRUNUX1RTRjogeworCQl1OCBidHlwZV9pYnNzID0gKCh1OCAqKSAodmFsKSlbMF07CisKKwkJaWYgKGJ0eXBlX2lic3MpCisJCQlfcnRsOTJkZV9zdG9wX3R4X2JlYWNvbihodyk7CisJCV9ydGw5MmRlX3NldF9iY25fY3RybF9yZWcoaHcsIDAsIEJJVCgzKSk7CisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfVFNGVFIsCisJCQkJKHUzMikgKG1hYy0+dHNmICYgMHhmZmZmZmZmZikpOworCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX1RTRlRSICsgNCwKKwkJCQkodTMyKSAoKG1hYy0+dHNmID4+IDMyKSAmIDB4ZmZmZmZmZmYpKTsKKwkJX3J0bDkyZGVfc2V0X2Jjbl9jdHJsX3JlZyhodywgQklUKDMpLCAwKTsKKwkJaWYgKGJ0eXBlX2lic3MpCisJCQlfcnRsOTJkZV9yZXN1bWVfdHhfYmVhY29uKGh3KTsKKworCQlicmVhazsKKwl9CisJY2FzZSBIV19WQVJfSU5UX01JR1JBVElPTjogeworCQlib29sIGludF9taWdyYXRpb24gPSAqKGJvb2wgKikgKHZhbCk7CisKKwkJaWYgKGludF9taWdyYXRpb24pIHsKKwkJCS8qIFNldCBpbnRlcnJydXB0IG1pZ3JhdGlvbiB0aW1lciBhbmQKKwkJCSAqIGNvcnJlc3BvbmdpbmcgVHgvUnggY291bnRlci4KKwkJCSAqIHRpbWVyIDI1bnMqMHhmYTA9MTAwdXMgZm9yIDB4ZiBwYWNrZXRzLgorCQkJICogMHgzMDY6UngsIDB4MzA3OlR4ICovCisJCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0lOVF9NSUcsIDB4ZmUwMDBmYTApOworCQkJcnRscHJpdi0+ZG0uaW50ZXJydXB0X21pZ3JhdGlvbiA9IGludF9taWdyYXRpb247CisJCX0gZWxzZSB7CisJCQkvKiBSZXNldCBhbGwgaW50ZXJydXB0IG1pZ3JhdGlvbiBzZXR0aW5ncy4gKi8KKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfSU5UX01JRywgMCk7CisJCQlydGxwcml2LT5kbS5pbnRlcnJ1cHRfbWlncmF0aW9uID0gaW50X21pZ3JhdGlvbjsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBIV19WQVJfSU5UX0FDOiB7CisJCWJvb2wgZGlzYWJsZV9hY19pbnQgPSAqKChib29sICopIHZhbCk7CisKKwkJLyogRGlzYWJsZSBmb3VyIEFDcyBpbnRlcnJ1cHRzLiAqLworCQlpZiAoZGlzYWJsZV9hY19pbnQpIHsKKwkJCS8qIERpc2FibGUgVk8sIFZJLCBCRSBhbmQgQksgZm91ciBBQyBpbnRlcnJ1cHRzCisJCQkgKiB0byBnYWluIG1vcmUgZWZmaWNpZW50IENQVSB1dGlsaXphdGlvbi4KKwkJCSAqIFdoZW4gZXh0cmVtZWx5IGhpZ2hseSBSeCBPSyBvY2N1cnMsCisJCQkgKiB3ZSB3aWxsIGRpc2FibGUgVHggaW50ZXJydXB0cy4KKwkJCSAqLworCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnVwZGF0ZV9pbnRlcnJ1cHRfbWFzayhodywgMCwKKwkJCQkJCSBSVF9BQ19JTlRfTUFTS1MpOworCQkJcnRscHJpdi0+ZG0uZGlzYWJsZV90eF9pbnQgPSBkaXNhYmxlX2FjX2ludDsKKwkJLyogRW5hYmxlIGZvdXIgQUNzIGludGVycnVwdHMuICovCisJCX0gZWxzZSB7CisJCQlydGxwcml2LT5jZmctPm9wcy0+dXBkYXRlX2ludGVycnVwdF9tYXNrKGh3LAorCQkJCQkJIFJUX0FDX0lOVF9NQVNLUywgMCk7CisJCQlydGxwcml2LT5kbS5kaXNhYmxlX3R4X2ludCA9IGRpc2FibGVfYWNfaW50OworCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgYm9vbCBfcnRsOTJkZV9sbHRfd3JpdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBhZGRyZXNzLCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJYm9vbCBzdGF0dXMgPSB0cnVlOworCWxvbmcgY291bnQgPSAwOworCXUzMiB2YWx1ZSA9IF9MTFRfSU5JVF9BRERSKGFkZHJlc3MpIHwKKwkgICAgX0xMVF9JTklUX0RBVEEoZGF0YSkgfCBfTExUX09QKF9MTFRfV1JJVEVfQUNDRVNTKTsKKworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfTExUX0lOSVQsIHZhbHVlKTsKKwlkbyB7CisJCXZhbHVlID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgUkVHX0xMVF9JTklUKTsKKwkJaWYgKF9MTFRfTk9fQUNUSVZFID09IF9MTFRfT1BfVkFMVUUodmFsdWUpKQorCQkJYnJlYWs7CisJCWlmIChjb3VudCA+IFBPTExJTkdfTExUX1RIUkVTSE9MRCkgeworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCQkgKCJGYWlsZWQgdG8gcG9sbGluZyB3cml0ZSBMTFQgZG9uZSBhdCAiCisJCQkJICAiYWRkcmVzcyAlZCFcbiIsIGFkZHJlc3MpKTsKKwkJCXN0YXR1cyA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgrK2NvdW50KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgYm9vbCBfcnRsOTJkZV9sbHRfdGFibGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdW5zaWduZWQgc2hvcnQgaTsKKwl1OCB0eHBrdGJ1Zl9ibmR5OworCXU4IG1heFBhZ2U7CisJYm9vbCBzdGF0dXM7CisJdTMyIHZhbHVlMzI7IC8qIEhpZ2grbG93IHBhZ2UgbnVtYmVyICovCisJdTggdmFsdWU4OwkgLyogbm9ybWFsIHBhZ2UgbnVtYmVyICovCisKKwlpZiAocnRscHJpdi0+cnRsaGFsLm1hY3BoeW1vZGUgPT0gU0lOR0xFTUFDX1NJTkdMRVBIWSkgeworCQltYXhQYWdlID0gMjU1OworCQl0eHBrdGJ1Zl9ibmR5ID0gMjQ2OworCQl2YWx1ZTggPSAwOworCQl2YWx1ZTMyID0gMHg4MGJmMGQyOTsKKwl9IGVsc2UgaWYgKHJ0bHByaXYtPnJ0bGhhbC5tYWNwaHltb2RlICE9IFNJTkdMRU1BQ19TSU5HTEVQSFkpIHsKKwkJbWF4UGFnZSA9IDEyNzsKKwkJdHhwa3RidWZfYm5keSA9IDEyMzsKKwkJdmFsdWU4ID0gMDsKKwkJdmFsdWUzMiA9IDB4ODA3NTAwMDU7CisJfQorCisJLyogU2V0IHJlc2VydmVkIHBhZ2UgZm9yIGVhY2ggcXVldWUgKi8KKwkvKiAxMS4gIFJRUE4gMHgyMDBbMzE6MF0gPSAweDgwQkQxQzFDICovCisJLyogbG9hZCBSUVBOICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JRUE5fTlBRLCB2YWx1ZTgpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfUlFQTiwgdmFsdWUzMik7CisKKwkvKiAxMi4gIFRYUktUQlVHX1BHX0JORFkgMHgxMTRbMzE6MF0gPSAweDI3RkYwMEY2ICovCisJLyogVFhSS1RCVUdfUEdfQk5EWSAqLworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfVFJYRkZfQk5EWSwKKwkJCShydGxfcmVhZF93b3JkKHJ0bHByaXYsIFJFR19UUlhGRl9CTkRZICsgMikgPDwgMTYgfAorCQkJdHhwa3RidWZfYm5keSkpOworCisJLyogMTMuICBUREVDVFJMWzE1OjhdIDB4MjA5Wzc6MF0gPSAweEY2ICovCisJLyogQmVhY29uIEhlYWQgZm9yIFRYRE1BICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1RERUNUUkwgKyAxLCB0eHBrdGJ1Zl9ibmR5KTsKKworCS8qIDE0LiAgQkNOUV9QR0JORFkgMHg0MjRbNzowXSA9ICAweEY2ICovCisJLyogQkNOUV9QR0JORFkgKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVFhQS1RCVUZfQkNOUV9CRE5ZLCB0eHBrdGJ1Zl9ibmR5KTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVFhQS1RCVUZfTUdRX0JETlksIHR4cGt0YnVmX2JuZHkpOworCisJLyogMTUuICBXTUFDX0xCS19CRl9IRCAweDQ1RFs3OjBdID0gIDB4RjYgKi8KKwkvKiBXTUFDX0xCS19CRl9IRCAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4NDVELCB0eHBrdGJ1Zl9ibmR5KTsKKworCS8qIFNldCBUeC9SeCBwYWdlIHNpemUgKFR4IG11c3QgYmUgMTI4IEJ5dGVzLCAqLworCS8qIFJ4IGNhbiBiZSA2NCwxMjgsMjU2LDUxMiwxMDI0IGJ5dGVzKSAqLworCS8qIDE2LiAgUEJQIFs3OjBdID0gMHgxMSAqLworCS8qIFRSWCBwYWdlIHNpemUgKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUEJQLCAweDExKTsKKworCS8qIDE3LiAgRFJWX0lORk9fU1ogPSAweDA0ICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JYX0RSVklORk9fU1osIDB4NCk7CisKKwkvKiAxOC4gIExMVF90YWJsZV9pbml0KEFkYXB0ZXIpOyAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKHR4cGt0YnVmX2JuZHkgLSAxKTsgaSsrKSB7CisJCXN0YXR1cyA9IF9ydGw5MmRlX2xsdF93cml0ZShodywgaSwgaSArIDEpOworCQlpZiAodHJ1ZSAhPSBzdGF0dXMpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIGVuZCBvZiBsaXN0ICovCisJc3RhdHVzID0gX3J0bDkyZGVfbGx0X3dyaXRlKGh3LCAodHhwa3RidWZfYm5keSAtIDEpLCAweEZGKTsKKwlpZiAodHJ1ZSAhPSBzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBNYWtlIHRoZSBvdGhlciBwYWdlcyBhcyByaW5nIGJ1ZmZlciAqLworCS8qIFRoaXMgcmluZyBidWZmZXIgaXMgdXNlZCBhcyBiZWFjb24gYnVmZmVyIGlmIHdlICovCisJLyogY29uZmlnIHRoaXMgTUFDIGFzIHR3byBNQUMgdHJhbnNmZXIuICovCisJLyogT3RoZXJ3aXNlIHVzZWQgYXMgbG9jYWwgbG9vcGJhY2sgYnVmZmVyLiAgKi8KKwlmb3IgKGkgPSB0eHBrdGJ1Zl9ibmR5OyBpIDwgbWF4UGFnZTsgaSsrKSB7CisJCXN0YXR1cyA9IF9ydGw5MmRlX2xsdF93cml0ZShodywgaSwgKGkgKyAxKSk7CisJCWlmICh0cnVlICE9IHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogTGV0IGxhc3QgZW50cnkgcG9pbnQgdG8gdGhlIHN0YXJ0IGVudHJ5IG9mIHJpbmcgYnVmZmVyICovCisJc3RhdHVzID0gX3J0bDkyZGVfbGx0X3dyaXRlKGh3LCBtYXhQYWdlLCB0eHBrdGJ1Zl9ibmR5KTsKKwlpZiAodHJ1ZSAhPSBzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZGVfZ2VuX3JlZnJlc2hfbGVkX3N0YXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2xlZCAqcExlZDAgPSAmKHBjaXByaXYtPmxlZGN0bC5zd19sZWQwKTsKKworCWlmIChydGxwY2ktPnVwX2ZpcnN0X3RpbWUpCisJCXJldHVybjsKKwlpZiAocHBzYy0+cmZvZmZfcmVhc29uID09IFJGX0NIQU5HRV9CWV9JUFMpCisJCXJ0bDkyZGVfc3dfbGVkX29uKGh3LCBwTGVkMCk7CisJZWxzZSBpZiAocHBzYy0+cmZvZmZfcmVhc29uID09IFJGX0NIQU5HRV9CWV9JTklUKQorCQlydGw5MmRlX3N3X2xlZF9vbihodywgcExlZDApOworCWVsc2UKKwkJcnRsOTJkZV9zd19sZWRfb2ZmKGh3LCBwTGVkMCk7Cit9CisKK3N0YXRpYyBib29sIF9ydGw5MmRlX2luaXRfbWFjKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCXVuc2lnbmVkIGNoYXIgYnl0ZXRtcDsKKwl1bnNpZ25lZCBzaG9ydCB3b3JkdG1wOworCXUxNiByZXRyeTsKKworCXJ0bDkyZF9waHlfc2V0X3Bvd2Vyb24oaHcpOworCS8qIEFkZCBmb3IgcmVzdW1lIHNlcXVlbmNlIG9mIHBvd2VyIGRvbWFpbiBhY2NvcmRpbmcKKwkgKiB0byBwb3dlciBkb2N1bWVudCBWMTEuIENoYXB0ZXIgVi4xMS4uLi4gICovCisJLyogMC4gICBSU1ZfQ1RSTCAweDFDWzc6MF0gPSAweDAwICAqLworCS8qIHVubG9jayBJU08vQ0xLL1Bvd2VyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlNWX0NUUkwsIDB4MDApOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19MRE9BMTVfQ1RSTCwgMHgwNSk7CisKKwkvKiAxLiAgIEFGRV9YVEFMX0NUUkwgWzc6MF0gPSAweDBGICBlbmFibGUgWFRBTCAqLworCS8qIDIuICAgU1BTMF9DVFJMIDB4MTFbNzowXSA9IDB4MmIgIGVuYWJsZSBTUFMgaW50byBQV00gbW9kZSAgKi8KKwkvKiAzLiAgIGRlbGF5ICgxbXMpIHRoaXMgaXMgbm90IG5lY2Vzc2FyeSB3aGVuIGluaXRpYWxseSBwb3dlciBvbiAqLworCisJLyogQy4gICBSZXN1bWUgU2VxdWVuY2UgKi8KKwkvKiBhLiAgIFNQUzBfQ1RSTCAweDExWzc6MF0gPSAweDJiICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NQUzBfQ1RSTCwgMHgyYik7CisKKwkvKiBiLiAgIEFGRV9YVEFMX0NUUkwgWzc6MF0gPSAweDBGICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0FGRV9YVEFMX0NUUkwsIDB4MEYpOworCisJLyogYy4gICBEUlYgcnVucyBwb3dlciBvbiBpbml0IGZsb3cgKi8KKworCS8qIGF1dG8gZW5hYmxlIFdMQU4gKi8KKwkvKiA0LiAgIEFQU19GU01DTyAweDA0WzhdID0gMTsgd2FpdCB0aWxsIDB4MDRbOF0gPSAwICAgKi8KKwkvKiBQb3dlciBPbiBSZXNldCBmb3IgTUFDIEJsb2NrICovCisJYnl0ZXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0FQU19GU01DTyArIDEpIHwgQklUKDApOworCXVkZWxheSgyKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQVBTX0ZTTUNPICsgMSwgYnl0ZXRtcCk7CisJdWRlbGF5KDIpOworCisJLyogNS4gICBXYWl0IHdoaWxlIDB4MDRbOF0gPT0gMCBnb3RvIDIsIG90aGVyd2lzZSBnb3RvIDEgKi8KKwlieXRldG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfQVBTX0ZTTUNPICsgMSk7CisJdWRlbGF5KDUwKTsKKwlyZXRyeSA9IDA7CisJd2hpbGUgKChieXRldG1wICYgQklUKDApKSAmJiByZXRyeSA8IDEwMDApIHsKKwkJcmV0cnkrKzsKKwkJYnl0ZXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0FQU19GU01DTyArIDEpOworCQl1ZGVsYXkoNTApOworCX0KKworCS8qIEVuYWJsZSBSYWRpbyBvZmYsIEdQSU8sIGFuZCBMRUQgZnVuY3Rpb24gKi8KKwkvKiA2LiAgIEFQU19GU01DTyAweDA0WzE1OjBdID0gMHgwMDEyICB3aGVuIGVuYWJsZSBIV1BETiAqLworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19BUFNfRlNNQ08sIDB4MTAxMik7CisKKwkvKiByZWxlYXNlIFJGIGRpZ2l0YWwgaXNvbGF0aW9uICAqLworCS8qIDcuICBTWVNfSVNPX0NUUkwgMHgwMVsxXSAgICA9IDB4MDsgICovCisJLypTZXQgUkVHX1NZU19JU09fQ1RSTCAweDE9MHg4MiB0byBwcmV2ZW50IHdha2UjIHByb2JsZW0uICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NZU19JU09fQ1RSTCArIDEsIDB4ODIpOworCXVkZWxheSgyKTsKKworCS8qIG1ha2Ugc3VyZSB0aGF0IEJCIHJlc2V0IE9LLiAqLworCS8qIHJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTiwgMHhFMyk7ICovCisKKwkvKiBEaXNhYmxlIFJFR19DUiBiZWZvcmUgZW5hYmxlIGl0IHRvIGFzc3VyZSByZXNldCAqLworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19DUiwgMHgwKTsKKworCS8qIFJlbGVhc2UgTUFDIElPIHJlZ2lzdGVyIHJlc2V0ICovCisJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX0NSLCAweDJmZik7CisKKwkvKiBjbGVhciBzdG9wcGluZyB0eC9yeCBkbWEgICAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19QQ0lFX0NUUkxfUkVHICsgMSwgMHgwKTsKKworCS8qIHJ0bF93cml0ZV93b3JkKHJ0bHByaXYsUkVHX0NSKzIsIDB4Mik7ICovCisKKwkvKiBTeXN0ZW0gaW5pdCAqLworCS8qIDE4LiAgTExUX3RhYmxlX2luaXQoQWRhcHRlcik7ICAqLworCWlmIChfcnRsOTJkZV9sbHRfdGFibGVfaW5pdChodykgPT0gZmFsc2UpCisJCXJldHVybiBmYWxzZTsKKworCS8qIENsZWFyIGludGVycnVwdCBhbmQgZW5hYmxlIGludGVycnVwdCAqLworCS8qIDE5LiAgSElTUiAweDEyNFszMTowXSA9IDB4ZmZmZmZmZmY7ICAqLworCS8qICAgICAgSElTUkUgMHgxMkNbNzowXSA9IDB4RkYgKi8KKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0hJU1IsIDB4ZmZmZmZmZmYpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19ISVNSRSwgMHhmZik7CisKKwkvKiAyMC4gIEhJTVIgMHgxMjBbMzE6MF0gfD0gW2VuYWJsZSBJTlQgbWFzayBiaXQgbWFwXTsgICovCisJLyogMjEuICBISU1SRSAweDEyOFs3OjBdID0gW2VuYWJsZSBJTlQgbWFzayBiaXQgbWFwXSAqLworCS8qIFRoZSBJTVIgc2hvdWxkIGJlIGVuYWJsZWQgbGF0ZXIgYWZ0ZXIgYWxsIGluaXQgc2VxdWVuY2UKKwkgKiBpcyBmaW5pc2hlZC4gKi8KKworCS8qIDIyLiAgUENJRSBjb25maWd1cmF0aW9uIHNwYWNlIGNvbmZpZ3VyYXRpb24gKi8KKwkvKiAyMy4gIEVuc3VyZSBQQ0llIERldmljZSAweDgwWzE1OjBdID0gMHgwMTQzIChBU1BNK0NMS1JFUSksICAqLworCS8qICAgICAgYW5kIFBDSWUgZ2F0ZWQgY2xvY2sgZnVuY3Rpb24gaXMgZW5hYmxlZC4gICAgKi8KKwkvKiBQQ0lFIGNvbmZpZ3VyYXRpb24gc3BhY2Ugd2lsbCBiZSB3cml0dGVuIGFmdGVyCisJICogYWxsIGluaXQgc2VxdWVuY2UuKE9yIGJ5IEJJT1MpICovCisKKwlydGw5MmRfcGh5X2NvbmZpZ19tYWNjb2V4aXN0X3JmcGFnZShodyk7CisKKwkvKiBUSGUgYmVsb3cgc2VjdGlvbiBpcyBub3QgcmVsYXRlZCB0byBwb3dlciBkb2N1bWVudCBWeHggLiAqLworCS8qIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGRyaXZlciBhbmQgT1Mgc2V0dGluZy4gKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tU29mdHdhcmUgUmVsYXRpdmUgU2V0dGluZy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwl3b3JkdG1wID0gcnRsX3JlYWRfd29yZChydGxwcml2LCBSRUdfVFJYRE1BX0NUUkwpOworCXdvcmR0bXAgJj0gMHhmOworCXdvcmR0bXAgfD0gMHhGNzcxOworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19UUlhETUFfQ1RSTCwgd29yZHRtcCk7CisKKwkvKiBSZXBvcnRlZCBUeCBzdGF0dXMgZnJvbSBIVyBmb3IgcmF0ZSBhZGFwdGl2ZS4gKi8KKwkvKiBUaGlzIHNob3VsZCBiZSByZWFsdGl2ZSB0byBwb3dlciBvbiBzdGVwIDE0LiBCdXQgaW4gZG9jdW1lbnQgVjExICAqLworCS8qIHN0aWxsIG5vdCBjb250YWluIHRoZSBkZXNjcmlwdGlvbi4hISEgKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfRldIV19UWFFfQ1RSTCArIDEsIDB4MUYpOworCisJLyogU2V0IFR4L1J4IHBhZ2Ugc2l6ZSAoVHggbXVzdCBiZSAxMjggQnl0ZXMsCisJICogUnggY2FuIGJlIDY0LDEyOCwyNTYsNTEyLDEwMjQgYnl0ZXMpICovCisJLyogcnRsX3dyaXRlX2J5dGUocnRscHJpdixSRUdfUEJQLCAweDExKTsgKi8KKworCS8qIFNldCBSQ1IgcmVnaXN0ZXIgKi8KKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX1JDUiwgcnRscGNpLT5yZWNlaXZlX2NvbmZpZyk7CisJLyogcnRsX3dyaXRlX2J5dGUocnRscHJpdixSRUdfUlhfRFJWSU5GT19TWiwgNCk7ICovCisKKwkvKiAgU2V0IFRDUiByZWdpc3RlciAqLworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfVENSLCBydGxwY2ktPnRyYW5zbWl0X2NvbmZpZyk7CisKKwkvKiBkaXNhYmxlIGVhcmx5bW9kZSAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4NGQwLCAweDApOworCisJLyogU2V0IFRYL1JYIGRlc2NyaXB0b3IgcGh5c2ljYWwgYWRkcmVzcyhmcm9tIE9TIEFQSSkuICovCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19CQ05RX0RFU0EsCisJCQlydGxwY2ktPnR4X3JpbmdbQkVBQ09OX1FVRVVFXS5kbWEpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfTUdRX0RFU0EsIHJ0bHBjaS0+dHhfcmluZ1tNR05UX1FVRVVFXS5kbWEpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfVk9RX0RFU0EsIHJ0bHBjaS0+dHhfcmluZ1tWT19RVUVVRV0uZG1hKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX1ZJUV9ERVNBLCBydGxwY2ktPnR4X3JpbmdbVklfUVVFVUVdLmRtYSk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19CRVFfREVTQSwgcnRscGNpLT50eF9yaW5nW0JFX1FVRVVFXS5kbWEpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfQktRX0RFU0EsIHJ0bHBjaS0+dHhfcmluZ1tCS19RVUVVRV0uZG1hKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0hRX0RFU0EsIHJ0bHBjaS0+dHhfcmluZ1tISUdIX1FVRVVFXS5kbWEpOworCS8qIFNldCBSWCBEZXNjIEFkZHJlc3MgKi8KKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX1JYX0RFU0EsCisJCQlydGxwY2ktPnJ4X3JpbmdbUlhfTVBEVV9RVUVVRV0uZG1hKTsKKworCS8qIGlmIHdlIHdhbnQgdG8gc3VwcG9ydCA2NCBiaXQgRE1BLCB3ZSBzaG91bGQgc2V0IGl0IGhlcmUsCisJICogYnV0IG5vdyB3ZSBkbyBub3Qgc3VwcG9ydCA2NCBiaXQgRE1BKi8KKworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19QQ0lFX0NUUkxfUkVHICsgMywgMHgzMyk7CisKKwkvKiBSZXNldCBpbnRlcnJ1cHQgbWlncmF0aW9uIHNldHRpbmcgd2hlbiBpbml0aWFsaXphdGlvbiAqLworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfSU5UX01JRywgMCk7CisKKwkvKiBSZWNvbnNpZGVyIHdoZW4gdG8gZG8gdGhpcyBvcGVyYXRpb24gYWZ0ZXIgYXNraW5nIEhXU0QuICovCisJYnl0ZXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0FQU0RfQ1RSTCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0FQU0RfQ1RSTCwgYnl0ZXRtcCAmIH5CSVQoNikpOworCWRvIHsKKwkJcmV0cnkrKzsKKwkJYnl0ZXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0FQU0RfQ1RSTCk7CisJfSB3aGlsZSAoKHJldHJ5IDwgMjAwKSAmJiAhKGJ5dGV0bXAgJiBCSVQoNykpKTsKKworCS8qIEFmdGVyIE1BQ0lPIHJlc2V0LHdlIG11c3QgcmVmcmVzaCBMRUQgc3RhdGUuICovCisJX3J0bDkyZGVfZ2VuX3JlZnJlc2hfbGVkX3N0YXRlKGh3KTsKKworCS8qIFJlc2V0IEgyQyBwcm90ZWN0aW9uIHJlZ2lzdGVyICovCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19NQ1VUU1RfMSwgMHgwKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkZV9od19jb25maWd1cmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1OCByZWdfYndfb3Btb2RlID0gQldfT1BNT0RFXzIwTUhaOworCXUzMiByZWdfcnJzcjsKKworCXJlZ19ycnNyID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfSU5JUlRTX1JBVEVfU0VMLCAweDgpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CV09QTU9ERSwgcmVnX2J3X29wbW9kZSk7CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19SUlNSLCByZWdfcnJzcik7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NMT1QsIDB4MDkpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19BTVBEVV9NSU5fU1BBQ0UsIDB4MCk7CisJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX0ZXSFdfVFhRX0NUUkwsIDB4MUY4MCk7CisJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX1JMLCAweDA3MDcpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfQkFSX01PREVfQ1RSTCwgMHgwMjAxMjgwMik7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0hXU0VRX0NUUkwsIDB4RkYpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfREFSRlJDLCAweDAxMDAwMDAwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0RBUkZSQyArIDQsIDB4MDcwNjA1MDQpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfUkFSRlJDLCAweDAxMDAwMDAwKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX1JBUkZSQyArIDQsIDB4MDcwNjA1MDQpOworCS8qIEFnZ3JlZ2F0aW9uIHRocmVzaG9sZCAqLworCWlmIChydGxoYWwtPm1hY3BoeW1vZGUgPT0gRFVBTE1BQ19EVUFMUEhZKQorCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0FHR0xFTl9MTVQsIDB4Yjk3MjY2NDEpOworCWVsc2UgaWYgKHJ0bGhhbC0+bWFjcGh5bW9kZSA9PSBEVUFMTUFDX1NJTkdMRVBIWSkKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19BR0dMRU5fTE1ULCAweDY2NjI2NjQxKTsKKwllbHNlCisJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfQUdHTEVOX0xNVCwgMHhiOTcyYTg0MSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0FUSU1XTkQsIDB4Mik7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0JDTl9NQVhfRVJSLCAweDBhKTsKKwlydGxwY2ktPnJlZ19iY25fY3RybF92YWwgPSAweDFmOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05fQ1RSTCwgcnRscGNpLT5yZWdfYmNuX2N0cmxfdmFsKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVEJUVF9QUk9ISUJJVCArIDEsIDB4ZmYpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19QSUZTLCAweDFDKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQUdHUl9CUkVBS19USU1FLCAweDE2KTsKKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfTkFWX1BST1RfTEVOLCAweDAwMjApOworCS8qIEZvciB0aHJvdWdocHV0ICovCisJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX0ZBU1RfRURDQV9DVFJMLCAweDY2NjYpOworCS8qIEFDS1RPIGZvciBJT1QgaXNzdWUuICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0FDS1RPLCAweDQwKTsKKwkvKiBTZXQgU3BlYyBTSUZTICh1c2VkIGluIE5BVikgKi8KKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfU1BFQ19TSUZTLCAweDEwMTApOworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19NQUNfU1BFQ19TSUZTLCAweDEwMTApOworCS8qIFNldCBTSUZTIGZvciBDQ0sgKi8KKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfU0lGU19DVFgsIDB4MTAxMCk7CisJLyogU2V0IFNJRlMgZm9yIE9GRE0gKi8KKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfU0lGU19UUlgsIDB4MTAxMCk7CisJLyogU2V0IE11bHRpY2FzdCBBZGRyZXNzLiAqLworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfTUFSLCAweGZmZmZmZmZmKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX01BUiArIDQsIDB4ZmZmZmZmZmYpOworCXN3aXRjaCAocnRscHJpdi0+cGh5LnJmX3R5cGUpIHsKKwljYXNlIFJGXzFUMlI6CisJY2FzZSBSRl8xVDFSOgorCQlydGxoYWwtPm1pbnNwYWNlX2NmZyA9IChNQVhfTVNTX0RFTlNJVFlfMVQgPDwgMyk7CisJCWJyZWFrOworCWNhc2UgUkZfMlQyUjoKKwljYXNlIFJGXzJUMlJfR1JFRU46CisJCXJ0bGhhbC0+bWluc3BhY2VfY2ZnID0gKE1BWF9NU1NfREVOU0lUWV8yVCA8PCAzKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkZV9lbmFibGVfYXNwbV9iYWNrX2Rvb3Ioc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHgzNGIsIDB4OTMpOworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIDB4MzUwLCAweDg3MGMpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4MzUyLCAweDEpOworCWlmIChwcHNjLT5zdXBwb3J0X2JhY2tkb29yKQorCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDM0OSwgMHgxYik7CisJZWxzZQorCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDM0OSwgMHgwMyk7CisJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgMHgzNTAsIDB4MjcxOCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHgzNTIsIDB4MSk7Cit9CisKK3ZvaWQgcnRsOTJkZV9lbmFibGVfaHdfc2VjdXJpdHlfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCBzZWNfcmVnX3ZhbHVlOworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiUGFpcndpc2VFbmNBbGdvcml0aG0gPSAlZCBHcm91cEVuY0FsZ29yaXRobSA9ICVkXG4iLAorCQkgIHJ0bHByaXYtPnNlYy5wYWlyd2lzZV9lbmNfYWxnb3JpdGhtLAorCQkgIHJ0bHByaXYtPnNlYy5ncm91cF9lbmNfYWxnb3JpdGhtKSk7CisJaWYgKHJ0bHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+c3dfY3J5cHRvIHx8IHJ0bHByaXYtPnNlYy51c2Vfc3dfc2VjKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfU0VDLCBEQkdfRE1FU0csCisJCQkgKCJub3Qgb3BlbiBodyBlbmNyeXB0aW9uXG4iKSk7CisJCXJldHVybjsKKwl9CisJc2VjX3JlZ192YWx1ZSA9IFNDUl9UWEVOQ0VOQUJMRSB8IFNDUl9SWEVOQ0VOQUJMRTsKKwlpZiAocnRscHJpdi0+c2VjLnVzZV9kZWZhdWx0a2V5KSB7CisJCXNlY19yZWdfdmFsdWUgfD0gU0NSX1RYVVNFREs7CisJCXNlY19yZWdfdmFsdWUgfD0gU0NSX1JYVVNFREs7CisJfQorCXNlY19yZWdfdmFsdWUgfD0gKFNDUl9SWEJDVVNFREsgfCBTQ1JfVFhCQ1VTRURLKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQ1IgKyAxLCAweDAyKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX1NFQywgREJHX0xPVUQsCisJCSAoIlRoZSBTRUNSLXZhbHVlICV4XG4iLCBzZWNfcmVnX3ZhbHVlKSk7CisJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9XUEFfQ09ORklHLCAmc2VjX3JlZ192YWx1ZSk7Cit9CisKK2ludCBydGw5MmRlX2h3X2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CisJYm9vbCBydHN0YXR1cyA9IHRydWU7CisJdTggdG1wX3UxYjsKKwlpbnQgaTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlydGxwY2ktPmJlaW5nX2luaXRfYWRhcHRlciA9IHRydWU7CisJcnRscGNpLT5pbml0X3JlYWR5ID0gZmFsc2U7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmdsb2JhbG11dGV4X2Zvcl9wb3dlcl9hbmRfZWZ1c2UsIGZsYWdzKTsKKwkvKiB3ZSBzaG91bGQgZG8gaXFrIGFmdGVyIGRpc2FibGUvZW5hYmxlICovCisJcnRsOTJkX3BoeV9yZXNldF9pcWtfcmVzdWx0KGh3KTsKKwkvKiBydGxwcml2LT5pbnRmX29wcy0+ZGlzYWJsZV9hc3BtKGh3KTsgKi8KKwlydHN0YXR1cyA9IF9ydGw5MmRlX2luaXRfbWFjKGh3KTsKKwlpZiAocnRzdGF0dXMgIT0gdHJ1ZSkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLCAoIkluaXQgTUFDIGZhaWxlZFxuIikpOworCQllcnIgPSAxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnbG9iYWxtdXRleF9mb3JfcG93ZXJfYW5kX2VmdXNlLCBmbGFncyk7CisJCXJldHVybiBlcnI7CisJfQorCWVyciA9IHJ0bDkyZF9kb3dubG9hZF9mdyhodyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2xvYmFsbXV0ZXhfZm9yX3Bvd2VyX2FuZF9lZnVzZSwgZmxhZ3MpOworCWlmIChlcnIpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19XQVJOSU5HLAorCQkJICgiRmFpbGVkIHRvIGRvd25sb2FkIEZXLiBJbml0IEhXICIKKwkJCSAid2l0aG91dCBGVy4uXG4iKSk7CisJCXJ0bGhhbC0+ZndfcmVhZHkgPSBmYWxzZTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcnRsaGFsLT5md19yZWFkeSA9IHRydWU7CisJfQorCXJ0bGhhbC0+bGFzdF9obWVib3hudW0gPSAwOworCXJ0bHByaXYtPnBzYy5md19jdXJyZW50X2lucHNtb2RlID0gZmFsc2U7CisKKwl0bXBfdTFiID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCAweDYwNSk7CisJdG1wX3UxYiA9IHRtcF91MWIgfCAweDMwOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4NjA1LCB0bXBfdTFiKTsKKworCWlmIChydGxoYWwtPmVhcmx5bW9kZV9lbmFibGUpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCSAoIkVhcmx5TW9kZSBFbmFibGVkISEhXG4iKSk7CisKKwkJdG1wX3UxYiA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgMHg0ZDApOworCQl0bXBfdTFiID0gdG1wX3UxYiB8IDB4MWY7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4NGQwLCB0bXBfdTFiKTsKKworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAweDRkMywgMHg4MCk7CisKKwkJdG1wX3UxYiA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgMHg2MDUpOworCQl0bXBfdTFiID0gdG1wX3UxYiB8IDB4NDA7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4NjA1LCB0bXBfdTFiKTsKKwl9CisKKwlpZiAobWFjLT5yZGdfZW4pIHsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JEX0NUUkwsIDB4ZmYpOworCQlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfUkRfTkFWX05YVCwgMHgyMDApOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUkRfUkVTUF9QS1RfVEgsIDB4MDUpOworCX0KKworCXJ0bDkyZF9waHlfbWFjX2NvbmZpZyhodyk7CisJLyogYmVjYXVzZSBsYXN0IGZ1bmN0aW9uIG1vZGlmeSBSQ1IsIHNvIHdlIHVwZGF0ZQorCSAqIHJjciB2YXIgaGVyZSwgb3IgVFAgd2lsbCB1bnN0YWJsZSBmb3IgcmVjZWl2ZV9jb25maWcKKwkgKiBpcyB3cm9uZywgUlggUkNSX0FDUkMzMiB3aWxsIGNhdXNlIFRQIHVuc3RhYmVsICYgUngKKwkgKiBSQ1JfQVBQX0lDViB3aWxsIGNhdXNlIG1hYzgwMjExIHVuYXNzb2MgZm9yIGNpc2NvIDEyNTIqLworCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgPSBydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfUkNSKTsKKwlydGxwY2ktPnJlY2VpdmVfY29uZmlnICY9IH4oUkNSX0FDUkMzMiB8IFJDUl9BSUNWKTsKKworCXJ0bDkyZF9waHlfYmJfY29uZmlnKGh3KTsKKworCXJ0bHBoeS0+cmZfbW9kZSA9IFJGX09QX0JZX1NXXzNXSVJFOworCS8qIHNldCBiZWZvcmUgaW5pdGlhbGl6ZSBSRiAqLworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9BTkFMT0dQQVJBTUVURVI0LCAweDAwZjAwMDAwLCAweGYpOworCisJLyogY29uZmlnIFJGICovCisJcnRsOTJkX3BoeV9yZl9jb25maWcoaHcpOworCisJLyogQWZ0ZXIgcmVhZCBwcmVkZWZpbmVkIFRYVCwgd2UgbXVzdCBzZXQgQkIvTUFDL1JGCisJICogcmVnaXN0ZXIgYXMgb3VyIHJlcXVpcmVtZW50ICovCisJLyogQWZ0ZXIgbG9hZCBCQixSRiBwYXJhbXMsd2UgbmVlZCBkbyBtb3JlIGZvciA5MkQuICovCisJcnRsOTJkX3VwZGF0ZV9iYnJmX2NvbmZpZ3VyYXRpb24oaHcpOworCS8qIHNldCBkZWZhdWx0IHZhbHVlIGFmdGVyIGluaXRpYWxpemUgUkYsICAqLworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9BTkFMT0dQQVJBTUVURVI0LCAweDAwZjAwMDAwLCAwKTsKKwlydGxwaHktPnJmcmVnX2Nobmx2YWxbMF0gPSBydGxfZ2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKTAsCisJCQlSRl9DSE5MQlcsIEJSRlJFR09GRlNFVE1BU0spOworCXJ0bHBoeS0+cmZyZWdfY2hubHZhbFsxXSA9IHJ0bF9nZXRfcmZyZWcoaHcsIChlbnVtIHJhZGlvX3BhdGgpMSwKKwkJCVJGX0NITkxCVywgQlJGUkVHT0ZGU0VUTUFTSyk7CisKKwkvKi0tLS0gU2V0IENDSyBhbmQgT0ZETSBCbG9jayAiT04iLS0tLSovCisJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzJfNEcpCisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9SRk1PRCwgQkNDS0VOLCAweDEpOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9SRk1PRCwgQk9GRE1FTiwgMHgxKTsKKwlpZiAocnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9PSAwKSB7CisJCS8qIFJGUEdBMF9BTkFMT0dQQVJBTUVURVIyOiBjY2sgY2xvY2sgc2VsZWN0LAorCQkgKiAgc2V0IHRvIDIwTUh6IGJ5IGRlZmF1bHQgKi8KKwkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX0FOQUxPR1BBUkFNRVRFUjIsIEJJVCgxMCkgfAorCQkJICAgICAgQklUKDExKSwgMyk7CisJfSBlbHNlIHsKKwkJLyogTWFjMSAqLworCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfQU5BTE9HUEFSQU1FVEVSMiwgQklUKDExKSB8CisJCQkgICAgICBCSVQoMTApLCAzKTsKKwl9CisKKwlfcnRsOTJkZV9od19jb25maWd1cmUoaHcpOworCisJLyogcmVzZXQgaHcgc2VjICovCisJcnRsX2NhbV9yZXNldF9hbGxfZW50cnkoaHcpOworCXJ0bDkyZGVfZW5hYmxlX2h3X3NlY3VyaXR5X2NvbmZpZyhodyk7CisKKwkvKiBSZWFkIEVFUFJPTSBUWCBwb3dlciBpbmRleCBhbmQgUEhZX1JFR19QRy50eHQgdG8gY2FwdHVyZSBjb3JyZWN0ICovCisJLyogVFggcG93ZXIgaW5kZXggZm9yIGRpZmZlcmVudCByYXRlIHNldC4gKi8KKwlydGw5MmRfcGh5X2dldF9od19yZWdfb3JpZ2luYWx2YWx1ZShodyk7CisJcnRsOTJkX3BoeV9zZXRfdHhwb3dlcl9sZXZlbChodywgcnRscGh5LT5jdXJyZW50X2NoYW5uZWwpOworCisJcHBzYy0+cmZwd3Jfc3RhdGUgPSBFUkZPTjsKKworCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfRVRIRVJfQUREUiwgbWFjLT5tYWNfYWRkcik7CisKKwlfcnRsOTJkZV9lbmFibGVfYXNwbV9iYWNrX2Rvb3IoaHcpOworCS8qIHJ0bHByaXYtPmludGZfb3BzLT5lbmFibGVfYXNwbShodyk7ICovCisKKwlydGw5MmRfZG1faW5pdChodyk7CisJcnRscGNpLT5iZWluZ19pbml0X2FkYXB0ZXIgPSBmYWxzZTsKKworCWlmIChwcHNjLT5yZnB3cl9zdGF0ZSA9PSBFUkZPTikgeworCQlydGw5MmRfcGh5X2xjX2NhbGlicmF0ZShodyk7CisJCS8qIDVHIGFuZCAyLjRHIG11c3Qgd2FpdCBzb21ldGltZSB0byBsZXQgUkYgTE8gcmVhZHkgKi8KKwkJaWYgKHJ0bGhhbC0+bWFjcGh5bW9kZSA9PSBEVUFMTUFDX0RVQUxQSFkpIHsKKwkJCXUzMiB0bXBfcmVnYTsKKwkJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCQkJdWRlbGF5KE1BWF9TVEFMTF9USU1FKTsKKworCQkJCXRtcF9yZWdhID0gcnRsX2dldF9yZnJlZyhodywKKwkJCQkJCSAgKGVudW0gcmFkaW9fcGF0aClSRjkwX1BBVEhfQSwKKwkJCQkJCSAgMHgyYSwgQk1BU0tEV09SRCk7CisKKwkJCQlpZiAoKCh0bXBfcmVnYSAmIEJJVCgxMSkpID09IEJJVCgxMSkpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGNoZWNrIHRoYXQgbG9vcCB3YXMgc3VjY2Vzc2Z1bC4gSWYgbm90LCBleGl0IG5vdyAqLworCQkJaWYgKGkgPT0gMTAwMDApIHsKKwkJCQlydGxwY2ktPmluaXRfcmVhZHkgPSBmYWxzZTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlydGxwY2ktPmluaXRfcmVhZHkgPSB0cnVlOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBlbnVtIHZlcnNpb25fODE5MmQgX3J0bDkyZGVfcmVhZF9jaGlwX3ZlcnNpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCWVudW0gdmVyc2lvbl84MTkyZCB2ZXJzaW9uID0gVkVSU0lPTl9OT1JNQUxfQ0hJUF85MkRfU0lOR0xFUEhZOworCXUzMiB2YWx1ZTMyOworCisJdmFsdWUzMiA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIFJFR19TWVNfQ0ZHKTsKKwlpZiAoISh2YWx1ZTMyICYgMHgwMDBmMDAwMCkpIHsKKwkJdmVyc2lvbiA9IFZFUlNJT05fVEVTVF9DSElQXzkyRF9TSU5HTEVQSFk7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsICgiVEVTVCBDSElQISEhXG4iKSk7CisJfSBlbHNlIHsKKwkJdmVyc2lvbiA9IFZFUlNJT05fTk9STUFMX0NISVBfOTJEX1NJTkdMRVBIWTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwgKCJOb3JtYWwgQ0hJUCEhIVxuIikpOworCX0KKwlyZXR1cm4gdmVyc2lvbjsKK30KKworc3RhdGljIGludCBfcnRsOTJkZV9zZXRfbWVkaWFfc3RhdHVzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCBidF9tc3IgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIE1TUik7CisJZW51bSBsZWRfY3RsX21vZGUgbGVkYWN0aW9uID0gTEVEX0NUTF9OT19MSU5LOworCXU4IGJjbmZ1bmNfZW5hYmxlOworCisJYnRfbXNyICY9IDB4ZmM7CisKKwlpZiAodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRCB8fAorCSAgICB0eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKKwkJX3J0bDkyZGVfc3RvcF90eF9iZWFjb24oaHcpOworCQlfcnRsOTJkZV9lbmFibGVfYmNuX3N1Yl9mdW5jKGh3KTsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwKKwkJdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgeworCQlfcnRsOTJkZV9yZXN1bWVfdHhfYmVhY29uKGh3KTsKKwkJX3J0bDkyZGVfZGlzYWJsZV9iY25fc3ViX2Z1bmMoaHcpOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCSAoIlNldCBIV19WQVJfTUVESUFfU1RBVFVTOiBObyBzdWNoIG1lZGlhICIKKwkJCSAic3RhdHVzKCV4KS5cbiIsIHR5cGUpKTsKKwl9CisJYmNuZnVuY19lbmFibGUgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19CQ05fQ1RSTCk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDoKKwkJYnRfbXNyIHw9IE1TUl9OT0xJTks7CisJCWxlZGFjdGlvbiA9IExFRF9DVExfTElOSzsKKwkJYmNuZnVuY19lbmFibGUgJj0gMHhGNzsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkgKCJTZXQgTmV0d29yayB0eXBlIHRvIE5PIExJTkshXG4iKSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCWJ0X21zciB8PSBNU1JfQURIT0M7CisJCWJjbmZ1bmNfZW5hYmxlIHw9IDB4MDg7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLAorCQkJICgiU2V0IE5ldHdvcmsgdHlwZSB0byBBZCBIb2MhXG4iKSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJYnRfbXNyIHw9IE1TUl9JTkZSQTsKKwkJbGVkYWN0aW9uID0gTEVEX0NUTF9MSU5LOworCQliY25mdW5jX2VuYWJsZSAmPSAweEY3OworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJCSAoIlNldCBOZXR3b3JrIHR5cGUgdG8gU1RBIVxuIikpOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQlidF9tc3IgfD0gTVNSX0FQOworCQliY25mdW5jX2VuYWJsZSB8PSAweDA4OworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJCSAoIlNldCBOZXR3b3JrIHR5cGUgdG8gQVAhXG4iKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJOZXR3b3JrIHR5cGUgJWQgbm90IHN1cHBvcnQhXG4iLCB0eXBlKSk7CisJCXJldHVybiAxOworCQlicmVhazsKKworCX0KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQ1IgKyAyLCBidF9tc3IpOworCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywgbGVkYWN0aW9uKTsKKwlpZiAoKGJ0X21zciAmIDB4ZmMpID09IE1TUl9BUCkKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0JDTlRDRkcgKyAxLCAweDAwKTsKKwllbHNlCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05UQ0ZHICsgMSwgMHg2Nik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnRsOTJkZV9zZXRfY2hlY2tfYnNzaWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgY2hlY2tfYnNzaWQpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJdTMyIHJlZ19yY3IgPSBydGxwY2ktPnJlY2VpdmVfY29uZmlnOworCisJaWYgKHJ0bHByaXYtPnBzYy5yZnB3cl9zdGF0ZSAhPSBFUkZPTikKKwkJcmV0dXJuOworCWlmIChjaGVja19ic3NpZCkgeworCQlyZWdfcmNyIHw9IChSQ1JfQ0JTU0lEX0RBVEEgfCBSQ1JfQ0JTU0lEX0JDTik7CisJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfUkNSLCAodTggKikoJnJlZ19yY3IpKTsKKwkJX3J0bDkyZGVfc2V0X2Jjbl9jdHJsX3JlZyhodywgMCwgQklUKDQpKTsKKwl9IGVsc2UgaWYgKGNoZWNrX2Jzc2lkID09IGZhbHNlKSB7CisJCXJlZ19yY3IgJj0gKH4oUkNSX0NCU1NJRF9EQVRBIHwgUkNSX0NCU1NJRF9CQ04pKTsKKwkJX3J0bDkyZGVfc2V0X2Jjbl9jdHJsX3JlZyhodywgQklUKDQpLCAwKTsKKwkJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9SQ1IsICh1OCAqKSgmcmVnX3JjcikpOworCX0KK30KKworaW50IHJ0bDkyZGVfc2V0X25ldHdvcmtfdHlwZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCWlmIChfcnRsOTJkZV9zZXRfbWVkaWFfc3RhdHVzKGh3LCB0eXBlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogY2hlY2sgYnNzaWQgKi8KKwlpZiAocnRscHJpdi0+bWFjODAyMTEubGlua19zdGF0ZSA9PSBNQUM4MDIxMV9MSU5LRUQpIHsKKwkJaWYgKHR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCQlydGw5MmRlX3NldF9jaGVja19ic3NpZChodywgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJcnRsOTJkZV9zZXRfY2hlY2tfYnNzaWQoaHcsIGZhbHNlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGRvIGlxayBvciByZWxvYWQgaXFrICovCisvKiB3aW5kb3dzIGp1c3QgcnRsOTJkX3BoeV9yZWxvYWRfaXFrX3NldHRpbmcgaW4gc2V0IGNoYW5uZWwsCisgKiBidXQgaXQncyB2ZXJ5IHN0cmljdCBmb3IgdGltZSBzZXF1ZW5jZSBzbyB3ZSBhZGQKKyAqIHJ0bDkyZF9waHlfcmVsb2FkX2lxa19zZXR0aW5nIGhlcmUgKi8KK3ZvaWQgcnRsOTJkX2xpbmtlZF9zZXRfcmVnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXU4IGluZGV4Zm9yY2hhbm5lbDsKKwl1OCBjaGFubmVsID0gcnRscGh5LT5jdXJyZW50X2NoYW5uZWw7CisKKwlpbmRleGZvcmNoYW5uZWwgPSBydGw5MmRfZ2V0X3JpZ2h0Y2hubHBsYWNlX2Zvcl9pcWsoY2hhbm5lbCk7CisJaWYgKCFydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZ1tpbmRleGZvcmNoYW5uZWxdLmlxa19kb25lKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfU0NBTiB8IENPTVBfSU5JVCwgREJHX0RNRVNHLAorCQkJCSgiRG8gSVFLIGZvciBjaGFubmVsOiVkLlxuIiwgY2hhbm5lbCkpOworCQlydGw5MmRfcGh5X2lxX2NhbGlicmF0ZShodyk7CisJfQorfQorCisvKiBkb24ndCBzZXQgUkVHX0VEQ0FfQkVfUEFSQU0gaGVyZSBiZWNhdXNlCisgKiBtYWM4MDIxMSB3aWxsIHNlbmQgcGt0IHdoZW4gc2NhbiAqLwordm9pZCBydGw5MmRlX3NldF9xb3Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCBhY2kpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXJ0bDkyZF9kbV9pbml0X2VkY2FfdHVyYm8oaHcpOworCXJldHVybjsKKwlzd2l0Y2ggKGFjaSkgeworCWNhc2UgQUMxX0JLOgorCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0VEQ0FfQktfUEFSQU0sIDB4YTQ0Zik7CisJCWJyZWFrOworCWNhc2UgQUMwX0JFOgorCQlicmVhazsKKwljYXNlIEFDMl9WSToKKwkJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19FRENBX1ZJX1BBUkFNLCAweDVlNDMyMik7CisJCWJyZWFrOworCWNhc2UgQUMzX1ZPOgorCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0VEQ0FfVk9fUEFSQU0sIDB4MmYzMjIyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlRfQVNTRVJUKGZhbHNlLCAoImludmFsaWQgYWNpOiAlZCAhXG4iLCBhY2kpKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIHJ0bDkyZGVfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfSElNUiwgcnRscGNpLT5pcnFfbWFza1swXSAmIDB4RkZGRkZGRkYpOworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfSElNUkUsIHJ0bHBjaS0+aXJxX21hc2tbMV0gJiAweEZGRkZGRkZGKTsKK30KKwordm9pZCBydGw5MmRlX2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19ISU1SLCBJTVI4MTkwX0RJU0FCTEVEKTsKKwlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0hJTVJFLCBJTVI4MTkwX0RJU0FCTEVEKTsKKwlzeW5jaHJvbml6ZV9pcnEocnRscGNpLT5wZGV2LT5pcnEpOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkZV9wb3dlcm9mZl9hZGFwdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1OCB1MWJfdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlydGxwcml2LT5pbnRmX29wcy0+ZW5hYmxlX2FzcG0oaHcpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19SRl9DVFJMLCAweDAwKTsKKwlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWENEX1JGUEFSQU1FVEVSLCBCSVQoMyksIDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQ0RfUkZQQVJBTUVURVIsIEJJVCgxNSksIDApOworCisJLyogMHgyMDp2YWx1ZSAwNS0tPjA0ICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0xET0ExNV9DVFJMLCAweDA0KTsKKworCS8qICA9PT09IFJlc2V0IGRpZ2l0YWwgc2VxdWVuY2UgICA9PT09PT0gKi8KKwlydGw5MmRfZmlybXdhcmVfc2VsZnJlc2V0KGh3KTsKKworCS8qIGYuICAgU1lTX0ZVTkNfRU4gMHgwM1s3OjBdPTB4NTEgcmVzZXQgTUNVLCBNQUMgcmVnaXN0ZXIsIERDT1JFICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOICsgMSwgMHg1MSk7CisKKwkvKiBnLiAgIE1DVUZXREwgMHg4MFsxOjBdPTAgcmVzZXQgTUNVIHJlYWR5IHN0YXR1cyAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19NQ1VGV0RMLCAweDAwKTsKKworCS8qICA9PT09IFB1bGwgR1BJTyBQSU4gdG8gYmFsYW5jZSBsZXZlbCBhbmQgTEVEIGNvbnRyb2wgPT09PT09ICovCisKKwkvKiBoLiAgICAgR1BJT19QSU5fQ1RSTCAweDQ0WzMxOjBdPTB4MDAwICAqLworCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfR1BJT19QSU5fQ1RSTCwgMHgwMDAwMDAwMCk7CisKKwkvKiBpLiAgICBWYWx1ZSA9IEdQSU9fUElOX0NUUkxbNzowXSAqLworCXUxYl90bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19HUElPX1BJTl9DVFJMKTsKKworCS8qIGouICAgIEdQSU9fUElOX0NUUkwgMHg0NFszMTowXSA9IDB4MDBGRjAwMDAgfCAodmFsdWUgPDw4KTsgKi8KKwkvKiB3cml0ZSBleHRlcm5hbCBQSU4gbGV2ZWwgICovCisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIFJFR19HUElPX1BJTl9DVFJMLAorCQkJMHgwMEZGMDAwMCB8ICh1MWJfdG1wIDw8IDgpKTsKKworCS8qIGsuICAgR1BJT19NVVhDRkcgMHg0MiBbMTU6MF0gPSAweDA3ODAgKi8KKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfR1BJT19JT19TRUwsIDB4MDc5MCk7CisKKwkvKiBsLiAgIExFRENGRyAweDRDWzE1OjBdID0gMHg4MDgwICovCisJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX0xFRENGRzAsIDB4ODA4MCk7CisKKwkvKiAgPT09PSBEaXNhYmxlIGFuYWxvZyBzZXF1ZW5jZSA9PT0gKi8KKworCS8qIG0uICAgQUZFX1BMTF9DVFJMWzc6MF0gPSAweDgwICBkaXNhYmxlIFBMTCAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19BRkVfUExMX0NUUkwsIDB4ODApOworCisJLyogbi4gICBTUFMwX0NUUkwgMHgxMVs3OjBdID0gMHgyMiAgZW50ZXIgUEZNIG1vZGUgKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU1BTMF9DVFJMLCAweDIzKTsKKworCS8qIG8uICAgQUZFX1hUQUxfQ1RSTCAweDI0Wzc6MF0gPSAweDBFICBkaXNhYmxlIFhUQUwsIGlmIE5vIEJUIENPRVggKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQUZFX1hUQUxfQ1RSTCwgMHgwZSk7CisKKwkvKiBwLiAgIFJTVl9DVFJMIDB4MUNbNzowXSA9IDB4MEUgbG9jayBJU08vQ0xLL1Bvd2VyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlNWX0NUUkwsIDB4MGUpOworCisJLyogID09PT0gaW50ZXJmYWNlIGludG8gc3VzcGVuZCA9PT0gKi8KKworCS8qIHEuICAgQVBTX0ZTTUNPWzE1OjhdID0gMHg1OCBQQ0llIHN1c3BlbmQgbW9kZSAqLworCS8qIEFjY29yZGluZyB0byBwb3dlciBkb2N1bWVudCBWMTEsIHdlIG5lZWQgdG8gc2V0IHRoaXMgKi8KKwkvKiB2YWx1ZSBhcyAweDE4LiBPdGhlcndpc2UsIHdlIG1heSBub3QgTDBzIHNvbWV0aW1lcy4gKi8KKwkvKiBUaGlzIGluZGx1ZW5jZXMgcG93ZXIgY29uc3VtcHRpb24uIEJhc2VzIG9uIFNEMSdzIHRlc3QsICovCisJLyogc2V0IGFzIDB4MDAgZG8gbm90IGFmZmVjdCBwb3dlciBjdXJyZW50LiBBbmQgaWYgaXQgKi8KKwkvKiBpcyBzZXQgYXMgMHgxOCwgdGhleSBoYWQgZXZlciBtZXQgYXV0byBsb2FkIGZhaWwgcHJvYmxlbS4gKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQVBTX0ZTTUNPICsgMSwgMHgxMCk7CisKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJJbiBQb3dlck9mZixyZWcweCV4PSVYXG4iLCBSRUdfU1BTMF9DVFJMLAorCQkgIHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1NQUzBfQ1RSTCkpKTsKKwkvKiByLiAgIE5vdGU6IGZvciBQQ0llIGludGVyZmFjZSwgUE9OIHdpbGwgbm90IHR1cm4gKi8KKwkvKiBvZmYgbS1iaWFzIGFuZCBCYW5kR2FwIGluIFBDSWUgc3VzcGVuZCBtb2RlLiAgKi8KKworCS8qIDB4MTdbN10gMWInOiBwb3dlciBvZmYgaW4gcHJvY2VzcyAgMGInIDogcG93ZXIgb2ZmIG92ZXIgKi8KKwlpZiAocnRscHJpdi0+cnRsaGFsLm1hY3BoeW1vZGUgIT0gU0lOR0xFTUFDX1NJTkdMRVBIWSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2xvYmFsbXV0ZXhfcG93ZXIsIGZsYWdzKTsKKwkJdTFiX3RtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1BPV0VSX09GRl9JTl9QUk9DRVNTKTsKKwkJdTFiX3RtcCAmPSAofkJJVCg3KSk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19QT1dFUl9PRkZfSU5fUFJPQ0VTUywgdTFiX3RtcCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdsb2JhbG11dGV4X3Bvd2VyLCBmbGFncyk7CisJfQorCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwgKCI8PT09PT09PVxuIikpOworfQorCit2b2lkIHJ0bDkyZGVfY2FyZF9kaXNhYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJZW51bSBubDgwMjExX2lmdHlwZSBvcG1vZGU7CisKKwltYWMtPmxpbmtfc3RhdGUgPSBNQUM4MDIxMV9OT0xJTks7CisJb3Btb2RlID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ7CisJX3J0bDkyZGVfc2V0X21lZGlhX3N0YXR1cyhodywgb3Btb2RlKTsKKworCWlmIChydGxwY2ktPmRyaXZlcl9pc19nb2luZ3RvX3VubG9hZCB8fAorCSAgICBwcHNjLT5yZm9mZl9yZWFzb24gPiBSRl9DSEFOR0VfQllfUFMpCisJCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywgTEVEX0NUTF9QT1dFUl9PRkYpOworCVJUX1NFVF9QU19MRVZFTChwcHNjLCBSVF9SRl9PRkZfTEVWTF9IQUxUX05JQyk7CisJLyogUG93ZXIgc2VxdWVuY2UgZm9yIGVhY2ggTUFDLiAqLworCS8qIGEuIHN0b3AgdHggRE1BICAqLworCS8qIGIuIGNsb3NlIFJGICovCisJLyogYy4gY2xlYXIgcnggYnVmICovCisJLyogZC4gc3RvcCByeCBETUEgKi8KKwkvKiBlLiAgcmVzZXQgTUFDICovCisKKwkvKiBhLiBzdG9wIHR4IERNQSAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19QQ0lFX0NUUkxfUkVHICsgMSwgMHhGRSk7CisJdWRlbGF5KDUwKTsKKworCS8qIGIuIFRYUEFVU0UgMHg1MjJbNzowXSA9IDB4RkYgUGF1c2UgTUFDIFRYIHF1ZXVlICovCisKKwkvKiBjLiA9PT09PT09PVJGIE9GRiBzZXF1ZW5jZT09PT09PT09PT0gICovCisJLyogMHg4OGNbMjM6MjBdID0gMHhmLiAqLworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9BTkFMT0dQQVJBTUVURVI0LCAweDAwZjAwMDAwLCAweGYpOworCXJ0bF9zZXRfcmZyZWcoaHcsIFJGOTBfUEFUSF9BLCAweDAwLCBCUkZSRUdPRkZTRVRNQVNLLCAweDAwKTsKKworCS8qIEFQU0RfQ1RSTCAweDYwMFs3OjBdID0gMHg0MCAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19BUFNEX0NUUkwsIDB4NDApOworCisJLyogQ2xvc2UgYW50ZW5uYSAwLDB4YzA0LDB4ZDA0ICovCisJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1RSWFBBVEhFTkFCTEUsIEJNQVNLQllURTAsIDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMV9UUlhQQVRIRU5BQkxFLCBCRFdPUkQsIDApOworCisJLyogIFNZU19GVU5DX0VOIDB4MDJbNzowXSA9IDB4RTIgICByZXNldCBCQiBzdGF0ZSBtYWNoaW5lICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOLCAweEUyKTsKKworCS8qIE1hYzAgY2FuIG5vdCBkbyBHbG9iYWwgcmVzZXQuIE1hYzEgY2FuIGRvLiAqLworCS8qIFNZU19GVU5DX0VOIDB4MDJbNzowXSA9IDB4RTAgIHJlc2V0IEJCIHN0YXRlIG1hY2hpbmUgICovCisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5pbnRlcmZhY2VpbmRleCA9PSAxKQorCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfU1lTX0ZVTkNfRU4sIDB4RTApOworCXVkZWxheSg1MCk7CisKKwkvKiBkLiAgc3RvcCB0eC9yeCBkbWEgYmVmb3JlIGRpc2FibGUgUkVHX0NSICgweDEwMCkgdG8gZml4ICovCisJLyogZG1hIGhhbmcgaXNzdWUgd2hlbiBkaXNhYmxlL2VuYWJsZSBkZXZpY2UuICAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19QQ0lFX0NUUkxfUkVHICsgMSwgMHhmZik7CisJdWRlbGF5KDUwKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQ1IsIDB4MCk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwgKCI9PT4gRG8gcG93ZXIgb2ZmLi4uLi4uLlxuIikpOworCWlmIChydGw5MmRfcGh5X2NoZWNrX3Bvd2Vyb2ZmKGh3KSkKKwkJX3J0bDkyZGVfcG93ZXJvZmZfYWRhcHRlcihodyk7CisJcmV0dXJuOworfQorCit2b2lkIHJ0bDkyZGVfaW50ZXJydXB0X3JlY29nbml6ZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICB1MzIgKnBfaW50YSwgdTMyICpwX2ludGIpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisKKwkqcF9pbnRhID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgSVNSKSAmIHJ0bHBjaS0+aXJxX21hc2tbMF07CisJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIElTUiwgKnBfaW50YSk7CisKKwkvKgorCSAqICpwX2ludGIgPSBydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfSElTUkUpICYgcnRscGNpLT5pcnFfbWFza1sxXTsKKwkgKiBydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgSVNSICsgNCwgKnBfaW50Yik7CisJICovCit9CisKK3ZvaWQgcnRsOTJkZV9zZXRfYmVhY29uX3JlbGF0ZWRfcmVnaXN0ZXJzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXUxNiBiY25faW50ZXJ2YWwsIGF0aW1fd2luZG93OworCisJYmNuX2ludGVydmFsID0gbWFjLT5iZWFjb25faW50ZXJ2YWw7CisJYXRpbV93aW5kb3cgPSAyOworCS8qcnRsOTJkZV9kaXNhYmxlX2ludGVycnVwdChodyk7ICAqLworCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19BVElNV05ELCBhdGltX3dpbmRvdyk7CisJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX0JDTl9JTlRFUlZBTCwgYmNuX2ludGVydmFsKTsKKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfQkNOVENGRywgMHg2NjBmKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlhUU0ZfT0ZGU0VUX0NDSywgMHgyMCk7CisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fNUcpCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19SWFRTRl9PRkZTRVRfT0ZETSwgMHgzMCk7CisJZWxzZQorCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlhUU0ZfT0ZGU0VUX09GRE0sIDB4MjApOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4NjA2LCAweDMwKTsKK30KKwordm9pZCBydGw5MmRlX3NldF9iZWFjb25faW50ZXJ2YWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJdTE2IGJjbl9pbnRlcnZhbCA9IG1hYy0+YmVhY29uX2ludGVydmFsOworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9CRUFDT04sIERCR19ETUVTRywKKwkJICgiYmVhY29uX2ludGVydmFsOiVkXG4iLCBiY25faW50ZXJ2YWwpKTsKKwkvKiBydGw5MmRlX2Rpc2FibGVfaW50ZXJydXB0KGh3KTsgKi8KKwlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfQkNOX0lOVEVSVkFMLCBiY25faW50ZXJ2YWwpOworCS8qIHJ0bDkyZGVfZW5hYmxlX2ludGVycnVwdChodyk7ICovCit9CisKK3ZvaWQgcnRsOTJkZV91cGRhdGVfaW50ZXJydXB0X21hc2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgdTMyIGFkZF9tc3IsIHUzMiBybV9tc3IpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOVFIsIERCR19MT1VELAorCQkgKCJhZGRfbXNyOiV4LCBybV9tc3I6JXhcbiIsIGFkZF9tc3IsIHJtX21zcikpOworCWlmIChhZGRfbXNyKQorCQlydGxwY2ktPmlycV9tYXNrWzBdIHw9IGFkZF9tc3I7CisJaWYgKHJtX21zcikKKwkJcnRscGNpLT5pcnFfbWFza1swXSAmPSAofnJtX21zcik7CisJcnRsOTJkZV9kaXNhYmxlX2ludGVycnVwdChodyk7CisJcnRsOTJkZV9lbmFibGVfaW50ZXJydXB0KGh3KTsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZGVfcmVhZHBvd2VydmFsdWVfZnJvbXByb20oc3RydWN0IHR4cG93ZXJfaW5mbyAqcHdyaW5mbywKKwkJCQkgdTggKnJvbV9jb250ZW50LCBib29sIGF1dG9Mb2FkZmFpbCkKK3sKKwl1MzIgcmZwYXRoLCBlZWFkZHIsIGdyb3VwLCBvZmZzZXQxLCBvZmZzZXQyOworCXU4IGk7CisKKwltZW1zZXQocHdyaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCB0eHBvd2VyX2luZm8pKTsKKwlpZiAoYXV0b0xvYWRmYWlsKSB7CisJCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IENIQU5ORUxfR1JPVVBfTUFYOyBncm91cCsrKSB7CisJCQlmb3IgKHJmcGF0aCA9IDA7IHJmcGF0aCA8IFJGNjA1Ml9NQVhfUEFUSDsgcmZwYXRoKyspIHsKKwkJCQlpZiAoZ3JvdXAgPCBDSEFOTkVMX0dST1VQX01BWF8yRykgeworCQkJCQlwd3JpbmZvLT5jY2tfaW5kZXhbcmZwYXRoXVtncm91cF0gPQorCQkJCQkgICAgRUVQUk9NX0RFRkFVTFRfVFhQT1dFUkxFVkVMXzJHOworCQkJCQlwd3JpbmZvLT5odDQwXzFzaW5kZXhbcmZwYXRoXVtncm91cF0gPQorCQkJCQkgICAgRUVQUk9NX0RFRkFVTFRfVFhQT1dFUkxFVkVMXzJHOworCQkJCX0gZWxzZSB7CisJCQkJCXB3cmluZm8tPmh0NDBfMXNpbmRleFtyZnBhdGhdW2dyb3VwXSA9CisJCQkJCSAgICBFRVBST01fREVGQVVMVF9UWFBPV0VSTEVWRUxfNUc7CisJCQkJfQorCQkJCXB3cmluZm8tPmh0NDBfMnNpbmRleGRpZmZbcmZwYXRoXVtncm91cF0gPQorCQkJCSAgICBFRVBST01fREVGQVVMVF9IVDQwXzJTRElGRjsKKwkJCQlwd3JpbmZvLT5odDIwaW5kZXhkaWZmW3JmcGF0aF1bZ3JvdXBdID0KKwkJCQkgICAgRUVQUk9NX0RFRkFVTFRfSFQyMF9ESUZGOworCQkJCXB3cmluZm8tPm9mZG1pbmRleGRpZmZbcmZwYXRoXVtncm91cF0gPQorCQkJCSAgICBFRVBST01fREVGQVVMVF9MRUdBQ1lIVFRYUE9XRVJESUZGOworCQkJCXB3cmluZm8tPmh0NDBtYXhvZmZzZXRbcmZwYXRoXVtncm91cF0gPQorCQkJCSAgICBFRVBST01fREVGQVVMVF9IVDQwX1BXUk1BWE9GRlNFVDsKKwkJCQlwd3JpbmZvLT5odDIwbWF4b2Zmc2V0W3JmcGF0aF1bZ3JvdXBdID0KKwkJCQkgICAgRUVQUk9NX0RFRkFVTFRfSFQyMF9QV1JNQVhPRkZTRVQ7CisJCQl9CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJcHdyaW5mby0+dHNzaV9hW2ldID0gRUVQUk9NX0RFRkFVTFRfVFNTSTsKKwkJCXB3cmluZm8tPnRzc2lfYltpXSA9IEVFUFJPTV9ERUZBVUxUX1RTU0k7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIE1heWJlIGF1dG9sb2FkIE9LLGJ1ZiB0aGUgdHggcG93ZXIgaW5kZXggdmFsdWUgaXMgbm90IGZpbGxlZC4KKwkgKiBJZiB3ZSBmaW5kIGl0LCB3ZSBzZXQgaXQgdG8gZGVmYXVsdCB2YWx1ZS4gKi8KKwlmb3IgKHJmcGF0aCA9IDA7IHJmcGF0aCA8IFJGNjA1Ml9NQVhfUEFUSDsgcmZwYXRoKyspIHsKKwkJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgQ0hBTk5FTF9HUk9VUF9NQVhfMkc7IGdyb3VwKyspIHsKKwkJCWVlYWRkciA9IEVFUFJPTV9DQ0tfVFhfUFdSX0lOWF8yRyArIChyZnBhdGggKiAzKQorCQkJCSArIGdyb3VwOworCQkJcHdyaW5mby0+Y2NrX2luZGV4W3JmcGF0aF1bZ3JvdXBdID0KKwkJCQkJKHJvbV9jb250ZW50W2VlYWRkcl0gPT0gMHhGRikgPworCQkJCQkgICAgIChlZWFkZHIgPiAweDdCID8KKwkJCQkJICAgICBFRVBST01fREVGQVVMVF9UWFBPV0VSTEVWRUxfNUcgOgorCQkJCQkgICAgIEVFUFJPTV9ERUZBVUxUX1RYUE9XRVJMRVZFTF8yRykgOgorCQkJCQkgICAgIHJvbV9jb250ZW50W2VlYWRkcl07CisJCX0KKwl9CisJZm9yIChyZnBhdGggPSAwOyByZnBhdGggPCBSRjYwNTJfTUFYX1BBVEg7IHJmcGF0aCsrKSB7CisJCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IENIQU5ORUxfR1JPVVBfTUFYOyBncm91cCsrKSB7CisJCQlvZmZzZXQxID0gZ3JvdXAgLyAzOworCQkJb2Zmc2V0MiA9IGdyb3VwICUgMzsKKwkJCWVlYWRkciA9IEVFUFJPTV9IVDQwXzFTX1RYX1BXUl9JTlhfMkcgKyAocmZwYXRoICogMykgKworCQkJICAgIG9mZnNldDIgKyBvZmZzZXQxICogMjE7CisJCQlwd3JpbmZvLT5odDQwXzFzaW5kZXhbcmZwYXRoXVtncm91cF0gPQorCQkJICAgIChyb21fY29udGVudFtlZWFkZHJdID09IDB4RkYpID8gKGVlYWRkciA+IDB4N0IgPworCQkJCQkgICAgIEVFUFJPTV9ERUZBVUxUX1RYUE9XRVJMRVZFTF81RyA6CisJCQkJCSAgICAgRUVQUk9NX0RFRkFVTFRfVFhQT1dFUkxFVkVMXzJHKSA6CisJCQkJCQkgcm9tX2NvbnRlbnRbZWVhZGRyXTsKKwkJfQorCX0KKwkvKiBUaGVzZSBqdXN0IGZvciA5MkQgZWZ1c2Ugb2Zmc2V0LiAqLworCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IENIQU5ORUxfR1JPVVBfTUFYOyBncm91cCsrKSB7CisJCWZvciAocmZwYXRoID0gMDsgcmZwYXRoIDwgUkY2MDUyX01BWF9QQVRIOyByZnBhdGgrKykgeworCQkJaW50IGJhc2UxID0gRUVQUk9NX0hUNDBfMlNfVFhfUFdSX0lOWF9ESUZGXzJHOworCisJCQlvZmZzZXQxID0gZ3JvdXAgLyAzOworCQkJb2Zmc2V0MiA9IGdyb3VwICUgMzsKKworCQkJaWYgKHJvbV9jb250ZW50W2Jhc2UxICsgb2Zmc2V0MiArIG9mZnNldDEgKiAyMV0gIT0gMHhGRikKKwkJCQlwd3JpbmZvLT5odDQwXzJzaW5kZXhkaWZmW3JmcGF0aF1bZ3JvdXBdID0KKwkJCQkgICAgKHJvbV9jb250ZW50W2Jhc2UxICsKKwkJCQkgICAgIG9mZnNldDIgKyBvZmZzZXQxICogMjFdID4+IChyZnBhdGggKiA0KSkKKwkJCQkgICAgICYgMHhGOworCQkJZWxzZQorCQkJCXB3cmluZm8tPmh0NDBfMnNpbmRleGRpZmZbcmZwYXRoXVtncm91cF0gPQorCQkJCSAgICBFRVBST01fREVGQVVMVF9IVDQwXzJTRElGRjsKKwkJCWlmIChyb21fY29udGVudFtFRVBST01fSFQyMF9UWF9QV1JfSU5YX0RJRkZfMkcgKyBvZmZzZXQyCisJCQkgICAgKyBvZmZzZXQxICogMjFdICE9IDB4RkYpCisJCQkJcHdyaW5mby0+aHQyMGluZGV4ZGlmZltyZnBhdGhdW2dyb3VwXSA9CisJCQkJICAgIChyb21fY29udGVudFtFRVBST01fSFQyMF9UWF9QV1JfSU5YX0RJRkZfMkcKKwkJCQkgICAgKyBvZmZzZXQyICsgb2Zmc2V0MSAqIDIxXSA+PiAocmZwYXRoICogNCkpCisJCQkJICAgICYgMHhGOworCQkJZWxzZQorCQkJCXB3cmluZm8tPmh0MjBpbmRleGRpZmZbcmZwYXRoXVtncm91cF0gPQorCQkJCSAgICBFRVBST01fREVGQVVMVF9IVDIwX0RJRkY7CisJCQlpZiAocm9tX2NvbnRlbnRbRUVQUk9NX09GRE1fVFhfUFdSX0lOWF9ESUZGXzJHICsgb2Zmc2V0MgorCQkJICAgICsgb2Zmc2V0MSAqIDIxXSAhPSAweEZGKQorCQkJCXB3cmluZm8tPm9mZG1pbmRleGRpZmZbcmZwYXRoXVtncm91cF0gPQorCQkJCSAgICAocm9tX2NvbnRlbnRbRUVQUk9NX09GRE1fVFhfUFdSX0lOWF9ESUZGXzJHCisJCQkJICAgICArIG9mZnNldDIgKyBvZmZzZXQxICogMjFdID4+IChyZnBhdGggKiA0KSkKKwkJCQkgICAgICYgMHhGOworCQkJZWxzZQorCQkJCXB3cmluZm8tPm9mZG1pbmRleGRpZmZbcmZwYXRoXVtncm91cF0gPQorCQkJCSAgICBFRVBST01fREVGQVVMVF9MRUdBQ1lIVFRYUE9XRVJESUZGOworCQkJaWYgKHJvbV9jb250ZW50W0VFUFJPTV9IVDQwX01BWF9QV1JfT0ZGU0VUXzJHICsgb2Zmc2V0MgorCQkJICAgICsgb2Zmc2V0MSAqIDIxXSAhPSAweEZGKQorCQkJCXB3cmluZm8tPmh0NDBtYXhvZmZzZXRbcmZwYXRoXVtncm91cF0gPQorCQkJCSAgICAocm9tX2NvbnRlbnRbRUVQUk9NX0hUNDBfTUFYX1BXUl9PRkZTRVRfMkcKKwkJCQkgICAgKyBvZmZzZXQyICsgb2Zmc2V0MSAqIDIxXSA+PiAocmZwYXRoICogNCkpCisJCQkJICAgICYgMHhGOworCQkJZWxzZQorCQkJCXB3cmluZm8tPmh0NDBtYXhvZmZzZXRbcmZwYXRoXVtncm91cF0gPQorCQkJCSAgICBFRVBST01fREVGQVVMVF9IVDQwX1BXUk1BWE9GRlNFVDsKKwkJCWlmIChyb21fY29udGVudFtFRVBST01fSFQyMF9NQVhfUFdSX09GRlNFVF8yRyArIG9mZnNldDIKKwkJCSAgICArIG9mZnNldDEgKiAyMV0gIT0gMHhGRikKKwkJCQlwd3JpbmZvLT5odDIwbWF4b2Zmc2V0W3JmcGF0aF1bZ3JvdXBdID0KKwkJCQkgICAgKHJvbV9jb250ZW50W0VFUFJPTV9IVDIwX01BWF9QV1JfT0ZGU0VUXzJHICsKKwkJCQkgICAgIG9mZnNldDIgKyBvZmZzZXQxICogMjFdID4+IChyZnBhdGggKiA0KSkgJgorCQkJCSAgICAgMHhGOworCQkJZWxzZQorCQkJCXB3cmluZm8tPmh0MjBtYXhvZmZzZXRbcmZwYXRoXVtncm91cF0gPQorCQkJCSAgICBFRVBST01fREVGQVVMVF9IVDIwX1BXUk1BWE9GRlNFVDsKKwkJfQorCX0KKwlpZiAocm9tX2NvbnRlbnRbRUVQUk9NX1RTU0lfQV81R10gIT0gMHhGRikgeworCQkvKiA1R0wgKi8KKwkJcHdyaW5mby0+dHNzaV9hWzBdID0gcm9tX2NvbnRlbnRbRUVQUk9NX1RTU0lfQV81R10gJiAweDNGOworCQlwd3JpbmZvLT50c3NpX2JbMF0gPSByb21fY29udGVudFtFRVBST01fVFNTSV9CXzVHXSAmIDB4M0Y7CisJCS8qIDVHTSAqLworCQlwd3JpbmZvLT50c3NpX2FbMV0gPSByb21fY29udGVudFtFRVBST01fVFNTSV9BQl81R10gJiAweDNGOworCQlwd3JpbmZvLT50c3NpX2JbMV0gPQorCQkgICAgKHJvbV9jb250ZW50W0VFUFJPTV9UU1NJX0FCXzVHXSAmIDB4QzApID4+IDYgfAorCQkgICAgKHJvbV9jb250ZW50W0VFUFJPTV9UU1NJX0FCXzVHICsgMV0gJiAweDBGKSA8PCAyOworCQkvKiA1R0ggKi8KKwkJcHdyaW5mby0+dHNzaV9hWzJdID0gKHJvbV9jb250ZW50W0VFUFJPTV9UU1NJX0FCXzVHICsgMV0gJgorCQkJCSAgICAgIDB4RjApID4+IDQgfAorCQkgICAgKHJvbV9jb250ZW50W0VFUFJPTV9UU1NJX0FCXzVHICsgMl0gJiAweDAzKSA8PCA0OworCQlwd3JpbmZvLT50c3NpX2JbMl0gPSAocm9tX2NvbnRlbnRbRUVQUk9NX1RTU0lfQUJfNUcgKyAyXSAmCisJCQkJICAgICAgMHhGQykgPj4gMjsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlwd3JpbmZvLT50c3NpX2FbaV0gPSBFRVBST01fREVGQVVMVF9UU1NJOworCQkJcHdyaW5mby0+dHNzaV9iW2ldID0gRUVQUk9NX0RFRkFVTFRfVFNTSTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX3J0bDkyZGVfcmVhZF90eHBvd2VyX2luZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgIGJvb2wgYXV0b2xvYWRfZmFpbCwgdTggKmh3aW5mbykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgdHhwb3dlcl9pbmZvIHB3cmluZm87CisJdTggdGVtcHZhbFsyXSwgaSwgcHdyLCBkaWZmOworCXUzMiBjaCwgcmZQYXRoLCBncm91cDsKKworCV9ydGw5MmRlX3JlYWRwb3dlcnZhbHVlX2Zyb21wcm9tKCZwd3JpbmZvLCBod2luZm8sIGF1dG9sb2FkX2ZhaWwpOworCWlmICghYXV0b2xvYWRfZmFpbCkgeworCQkvKiBiaXQwfjIgKi8KKwkJcnRsZWZ1c2UtPmVlcHJvbV9yZWd1bGF0b3J5ID0gKGh3aW5mb1tFRVBST01fUkZfT1BUMV0gJiAweDcpOworCQlydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciA9CisJCQkgaHdpbmZvW0VFUFJPTV9USEVSTUFMX01FVEVSXSAmIDB4MWY7CisJCXJ0bGVmdXNlLT5jcnlzdGFsY2FwID0gaHdpbmZvW0VFUFJPTV9YVEFMX0tdOworCQl0ZW1wdmFsWzBdID0gaHdpbmZvW0VFUFJPTV9JUUtfREVMVEFdICYgMHgwMzsKKwkJdGVtcHZhbFsxXSA9IChod2luZm9bRUVQUk9NX0xDS19ERUxUQV0gJiAweDBDKSA+PiAyOworCQlydGxlZnVzZS0+dHhwd3JfZnJvbWVwcm9tID0gdHJ1ZTsKKwkJaWYgKElTXzkyRF9EX0NVVChydGxwcml2LT5ydGxoYWwudmVyc2lvbikpIHsKKwkJCXJ0bGVmdXNlLT5pbnRlcm5hbF9wYV81Z1swXSA9CisJCQkJICEoKGh3aW5mb1tFRVBST01fVFNTSV9BXzVHXSAmCisJCQkJIEJJVCg2KSkgPj4gNik7CisJCQlydGxlZnVzZS0+aW50ZXJuYWxfcGFfNWdbMV0gPQorCQkJCSAhKChod2luZm9bRUVQUk9NX1RTU0lfQl81R10gJgorCQkJCSBCSVQoNikpID4+IDYpOworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCQkgKCJJcyBEIGN1dCxJbnRlcm5hbCBQQTAgJWQgSW50ZXJuYWwgUEExICVkXG4iLAorCQkJCSAgcnRsZWZ1c2UtPmludGVybmFsX3BhXzVnWzBdLAorCQkJCSAgcnRsZWZ1c2UtPmludGVybmFsX3BhXzVnWzFdKSkKKwkJfQorCQlydGxlZnVzZS0+ZWVwcm9tX2M5ID0gaHdpbmZvW0VFUFJPTV9SRl9PUFQ2XTsKKwkJcnRsZWZ1c2UtPmVlcHJvbV9jYyA9IGh3aW5mb1tFRVBST01fUkZfT1BUN107CisJfSBlbHNlIHsKKwkJcnRsZWZ1c2UtPmVlcHJvbV9yZWd1bGF0b3J5ID0gMDsKKwkJcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgPSBFRVBST01fREVGQVVMVF9USEVSTUFMTUVURVI7CisJCXJ0bGVmdXNlLT5jcnlzdGFsY2FwID0gRUVQUk9NX0RFRkFVTFRfQ1JZU1RBTENBUDsKKwkJdGVtcHZhbFswXSA9IHRlbXB2YWxbMV0gPSAzOworCX0KKworCS8qIFVzZSBkZWZhdWx0IHZhbHVlIHRvIGZpbGwgcGFyYW1ldGVycyBpZgorCSAqIGVmdXNlIGlzIG5vdCBmaWxsZWQgb24gc29tZSBwbGFjZS4gKi8KKworCS8qIFRoZXJtYWxNZXRlciBmcm9tIEVFUFJPTSAqLworCWlmIChydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciA8IDB4MDYgfHwKKwkgICAgcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIgPiAweDFjKQorCQlydGxlZnVzZS0+ZWVwcm9tX3RoZXJtYWxtZXRlciA9IDB4MTI7CisJcnRsZWZ1c2UtPnRoZXJtYWxtZXRlclswXSA9IHJ0bGVmdXNlLT5lZXByb21fdGhlcm1hbG1ldGVyOworCisJLyogY2hlY2sgWFRBTF9LICovCisJaWYgKHJ0bGVmdXNlLT5jcnlzdGFsY2FwID09IDB4RkYpCisJCXJ0bGVmdXNlLT5jcnlzdGFsY2FwID0gMDsKKwlpZiAocnRsZWZ1c2UtPmVlcHJvbV9yZWd1bGF0b3J5ID4gMykKKwkJcnRsZWZ1c2UtPmVlcHJvbV9yZWd1bGF0b3J5ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJc3dpdGNoICh0ZW1wdmFsW2ldKSB7CisJCWNhc2UgMDoKKwkJCXRlbXB2YWxbaV0gPSA1OworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXRlbXB2YWxbaV0gPSA0OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXRlbXB2YWxbaV0gPSAzOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJZGVmYXVsdDoKKwkJCXRlbXB2YWxbaV0gPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlydGxlZnVzZS0+ZGVsdGFfaXFrID0gdGVtcHZhbFswXTsKKwlpZiAodGVtcHZhbFsxXSA+IDApCisJCXJ0bGVmdXNlLT5kZWx0YV9sY2sgPSB0ZW1wdmFsWzFdIC0gMTsKKwlpZiAocnRsZWZ1c2UtPmVlcHJvbV9jOSA9PSAweEZGKQorCQlydGxlZnVzZS0+ZWVwcm9tX2M5ID0gMHgwMDsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOVFIsIERCR19MT1VELAorCQkgKCJFRVBST01SZWd1bGF0b3J5ID0gMHgleFxuIiwgcnRsZWZ1c2UtPmVlcHJvbV9yZWd1bGF0b3J5KSk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTlRSLCBEQkdfTE9VRCwKKwkJICgiVGhlcm1hbE1ldGVyID0gMHgleFxuIiwgcnRsZWZ1c2UtPmVlcHJvbV90aGVybWFsbWV0ZXIpKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOVFIsIERCR19MT1VELAorCQkgKCJDcnlzdGFsQ2FwID0gMHgleFxuIiwgcnRsZWZ1c2UtPmNyeXN0YWxjYXApKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOVFIsIERCR19MT1VELAorCQkgKCJEZWx0YV9JUUsgPSAweCV4IERlbHRhX0xDSyA9IDB4JXhcbiIsIHJ0bGVmdXNlLT5kZWx0YV9pcWssCisJCSBydGxlZnVzZS0+ZGVsdGFfbGNrKSk7CisKKwlmb3IgKHJmUGF0aCA9IDA7IHJmUGF0aCA8IFJGNjA1Ml9NQVhfUEFUSDsgcmZQYXRoKyspIHsKKwkJZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKSB7CisJCQlncm91cCA9IHJ0bDkyZF9nZXRfY2hubGdyb3VwX2Zyb21hcnJheSgodTgpIGNoKTsKKwkJCWlmIChjaCA8IENIQU5ORUxfTUFYX05VTUJFUl8yRykKKwkJCQlydGxlZnVzZS0+dHhwd3JsZXZlbF9jY2tbcmZQYXRoXVtjaF0gPQorCQkJCSAgICBwd3JpbmZvLmNja19pbmRleFtyZlBhdGhdW2dyb3VwXTsKKwkJCXJ0bGVmdXNlLT50eHB3cmxldmVsX2h0NDBfMXNbcmZQYXRoXVtjaF0gPQorCQkJCSAgICBwd3JpbmZvLmh0NDBfMXNpbmRleFtyZlBhdGhdW2dyb3VwXTsKKwkJCXJ0bGVmdXNlLT50eHB3cl9odDIwZGlmZltyZlBhdGhdW2NoXSA9CisJCQkJICAgIHB3cmluZm8uaHQyMGluZGV4ZGlmZltyZlBhdGhdW2dyb3VwXTsKKwkJCXJ0bGVmdXNlLT50eHB3cl9sZWdhY3lodGRpZmZbcmZQYXRoXVtjaF0gPQorCQkJCSAgICBwd3JpbmZvLm9mZG1pbmRleGRpZmZbcmZQYXRoXVtncm91cF07CisJCQlydGxlZnVzZS0+cHdyZ3JvdXBfaHQyMFtyZlBhdGhdW2NoXSA9CisJCQkJICAgIHB3cmluZm8uaHQyMG1heG9mZnNldFtyZlBhdGhdW2dyb3VwXTsKKwkJCXJ0bGVmdXNlLT5wd3Jncm91cF9odDQwW3JmUGF0aF1bY2hdID0KKwkJCQkgICAgcHdyaW5mby5odDQwbWF4b2Zmc2V0W3JmUGF0aF1bZ3JvdXBdOworCQkJcHdyID0gcHdyaW5mby5odDQwXzFzaW5kZXhbcmZQYXRoXVtncm91cF07CisJCQlkaWZmID0gcHdyaW5mby5odDQwXzJzaW5kZXhkaWZmW3JmUGF0aF1bZ3JvdXBdOworCQkJcnRsZWZ1c2UtPnR4cHdybGV2ZWxfaHQ0MF8yc1tyZlBhdGhdW2NoXSA9CisJCQkJICAgIChwd3IgPiBkaWZmKSA/IChwd3IgLSBkaWZmKSA6IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRlX3JlYWRfbWFjcGh5bW9kZV9mcm9tX3Byb20oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICAgICB1OCAqY29udGVudCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1OCBtYWNwaHlfY3J2YWx1ZSA9IGNvbnRlbnRbRUVQUk9NX01BQ19GVU5DVElPTl07CisKKwlpZiAobWFjcGh5X2NydmFsdWUgJiBCSVQoMykpIHsKKwkJcnRsaGFsLT5tYWNwaHltb2RlID0gU0lOR0xFTUFDX1NJTkdMRVBIWTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCSAoIk1hY1BoeU1vZGUgU0lOR0xFTUFDX1NJTkdMRVBIWVxuIikpOworCX0gZWxzZSB7CisJCXJ0bGhhbC0+bWFjcGh5bW9kZSA9IERVQUxNQUNfRFVBTFBIWTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCSAoIk1hY1BoeU1vZGUgRFVBTE1BQ19EVUFMUEhZXG4iKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkZV9yZWFkX21hY3BoeW1vZGVfYW5kX2JhbmR0eXBlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJICB1OCAqY29udGVudCkKK3sKKwlfcnRsOTJkZV9yZWFkX21hY3BoeW1vZGVfZnJvbV9wcm9tKGh3LCBjb250ZW50KTsKKwlydGw5MmRfcGh5X2NvbmZpZ19tYWNwaHltb2RlKGh3KTsKKwlydGw5MmRfcGh5X2NvbmZpZ19tYWNwaHltb2RlX2luZm8oaHcpOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkZV9lZnVzZV91cGRhdGVfY2hpcF92ZXJzaW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwllbnVtIHZlcnNpb25fODE5MmQgY2hpcHZlciA9IHJ0bHByaXYtPnJ0bGhhbC52ZXJzaW9uOworCXU4IGN1dHZhbHVlWzJdOworCXUxNiBjaGlwdmFsdWU7CisKKwlydGxwcml2LT5pbnRmX29wcy0+cmVhZF9lZnVzZV9ieXRlKGh3LCBFRVBST01FX0NISVBfVkVSU0lPTl9ILAorCQkJCQkgICAmY3V0dmFsdWVbMV0pOworCXJ0bHByaXYtPmludGZfb3BzLT5yZWFkX2VmdXNlX2J5dGUoaHcsIEVFUFJPTUVfQ0hJUF9WRVJTSU9OX0wsCisJCQkJCSAgICZjdXR2YWx1ZVswXSk7CisJY2hpcHZhbHVlID0gKGN1dHZhbHVlWzFdIDw8IDgpIHwgY3V0dmFsdWVbMF07CisJc3dpdGNoIChjaGlwdmFsdWUpIHsKKwljYXNlIDB4QUE1NToKKwkJY2hpcHZlciB8PSBDSElQXzkyRF9DX0NVVDsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwgKCJDLUNVVCEhIVxuIikpOworCQlicmVhazsKKwljYXNlIDB4OTk2NjoKKwkJY2hpcHZlciB8PSBDSElQXzkyRF9EX0NVVDsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwgKCJELUNVVCEhIVxuIikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljaGlwdmVyIHw9IENISVBfOTJEX0RfQ1VUOworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19FTUVSRywgKCJVbmtvd24gQ1VUIVxuIikpOworCQlicmVhazsKKwl9CisJcnRscHJpdi0+cnRsaGFsLnZlcnNpb24gPSBjaGlwdmVyOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkZV9yZWFkX2FkYXB0ZXJfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXUxNiBpLCB1c3ZhbHVlOworCXU4IGh3aW5mb1tIV1NFVF9NQVhfU0laRV07CisJdTE2IGVlcHJvbV9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJ0bGVmdXNlLT5lcHJvbXR5cGUgPT0gRUVQUk9NX0JPT1RfRUZVU0UpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdsb2JhbG11dGV4X2Zvcl9wb3dlcl9hbmRfZWZ1c2UsIGZsYWdzKTsKKwkJcnRsX2VmdXNlX3NoYWRvd19tYXBfdXBkYXRlKGh3KTsKKwkJX3J0bDkyZGVfZWZ1c2VfdXBkYXRlX2NoaXBfdmVyc2lvbihodyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdsb2JhbG11dGV4X2Zvcl9wb3dlcl9hbmRfZWZ1c2UsIGZsYWdzKTsKKwkJbWVtY3B5KCh2b2lkICopaHdpbmZvLCAodm9pZCAqKSZydGxlZnVzZS0+ZWZ1c2VfbWFwCisJCSAgICAgICBbRUZVU0VfSU5JVF9NQVBdWzBdLAorCQkgICAgICAgSFdTRVRfTUFYX1NJWkUpOworCX0gZWxzZSBpZiAocnRsZWZ1c2UtPmVwcm9tdHlwZSA9PSBFRVBST01fOTNDNDYpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoIlJUTDgxOVggTm90IGJvb3QgZnJvbSBlZXByb20sIGNoZWNrIGl0ICEhIikpOworCX0KKwlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0RNRVNHLCAoIk1BUFxuIiksCisJCSAgICAgIGh3aW5mbywgSFdTRVRfTUFYX1NJWkUpOworCisJZWVwcm9tX2lkID0gKigodTE2ICopJmh3aW5mb1swXSk7CisJaWYgKGVlcHJvbV9pZCAhPSBSVEw4MTkwX0VFUFJPTV9JRCkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX1dBUk5JTkcsCisJCQkgKCJFRVBST00gSUQoJSN4KSBpcyBpbnZhbGlkISFcbiIsIGVlcHJvbV9pZCkpOworCQlydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcgPSB0cnVlOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsICgiQXV0b2xvYWQgT0tcbiIpKTsKKwkJcnRsZWZ1c2UtPmF1dG9sb2FkX2ZhaWxmbGFnID0gZmFsc2U7CisJfQorCWlmIChydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoIlJUTDgxOVggTm90IGJvb3QgZnJvbSBlZXByb20sIGNoZWNrIGl0ICEhIikpOworCQlyZXR1cm47CisJfQorCXJ0bGVmdXNlLT5lZXByb21fb2VtaWQgPSAqKHU4ICopJmh3aW5mb1tFRVBST01fQ1VTVE9NRVJfSURdOworCV9ydGw5MmRlX3JlYWRfbWFjcGh5bW9kZV9hbmRfYmFuZHR5cGUoaHcsIGh3aW5mbyk7CisKKwkvKiBWSUQsIERJRCAgU0UgICAgIDB4QS1EICovCisJcnRsZWZ1c2UtPmVlcHJvbV92aWQgPSAqKHUxNiAqKSZod2luZm9bRUVQUk9NX1ZJRF07CisJcnRsZWZ1c2UtPmVlcHJvbV9kaWQgPSAqKHUxNiAqKSZod2luZm9bRUVQUk9NX0RJRF07CisJcnRsZWZ1c2UtPmVlcHJvbV9zdmlkID0gKih1MTYgKikmaHdpbmZvW0VFUFJPTV9TVklEXTsKKwlydGxlZnVzZS0+ZWVwcm9tX3NtaWQgPSAqKHUxNiAqKSZod2luZm9bRUVQUk9NX1NNSURdOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsCisJCSAoIkVFUFJPTUlkID0gMHglNHhcbiIsIGVlcHJvbV9pZCkpOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsCisJCSAoIkVFUFJPTSBWSUQgPSAweCU0eFxuIiwgcnRsZWZ1c2UtPmVlcHJvbV92aWQpKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELAorCQkgKCJFRVBST00gRElEID0gMHglNHhcbiIsIHJ0bGVmdXNlLT5lZXByb21fZGlkKSk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiRUVQUk9NIFNWSUQgPSAweCU0eFxuIiwgcnRsZWZ1c2UtPmVlcHJvbV9zdmlkKSk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiRUVQUk9NIFNNSUQgPSAweCU0eFxuIiwgcnRsZWZ1c2UtPmVlcHJvbV9zbWlkKSk7CisKKwkvKiBSZWFkIFBlcm1hbmVudCBNQUMgYWRkcmVzcyAqLworCWlmIChydGxoYWwtPmludGVyZmFjZWluZGV4ID09IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikgeworCQkJdXN2YWx1ZSA9ICoodTE2ICopJmh3aW5mb1tFRVBST01fTUFDX0FERFJfTUFDMF85MkQgKyBpXTsKKwkJCSooKHUxNiAqKSAoJnJ0bGVmdXNlLT5kZXZfYWRkcltpXSkpID0gdXN2YWx1ZTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpICs9IDIpIHsKKwkJCXVzdmFsdWUgPSAqKHUxNiAqKSZod2luZm9bRUVQUk9NX01BQ19BRERSX01BQzFfOTJEICsgaV07CisJCQkqKCh1MTYgKikgKCZydGxlZnVzZS0+ZGV2X2FkZHJbaV0pKSA9IHVzdmFsdWU7CisJCX0KKwl9CisJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9FVEhFUl9BRERSLAorCQkJCSAgICAgIHJ0bGVmdXNlLT5kZXZfYWRkcik7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfRE1FU0csCisJCSAoIiVwTVxuIiwgcnRsZWZ1c2UtPmRldl9hZGRyKSk7CisJX3J0bDkyZGVfcmVhZF90eHBvd2VyX2luZm8oaHcsIHJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZywgaHdpbmZvKTsKKworCS8qIFJlYWQgQ2hhbm5lbCBQbGFuICovCisJc3dpdGNoIChydGxoYWwtPmJhbmRzZXQpIHsKKwljYXNlIEJBTkRfT05fMl80RzoKKwkJcnRsZWZ1c2UtPmNoYW5uZWxfcGxhbiA9IENPVU5UUllfQ09ERV9URUxFQzsKKwkJYnJlYWs7CisJY2FzZSBCQU5EX09OXzVHOgorCQlydGxlZnVzZS0+Y2hhbm5lbF9wbGFuID0gQ09VTlRSWV9DT0RFX0ZDQzsKKwkJYnJlYWs7CisJY2FzZSBCQU5EX09OX0JPVEg6CisJCXJ0bGVmdXNlLT5jaGFubmVsX3BsYW4gPSBDT1VOVFJZX0NPREVfRkNDOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlydGxlZnVzZS0+Y2hhbm5lbF9wbGFuID0gQ09VTlRSWV9DT0RFX0ZDQzsKKwkJYnJlYWs7CisJfQorCXJ0bGVmdXNlLT5lZXByb21fdmVyc2lvbiA9ICoodTE2ICopJmh3aW5mb1tFRVBST01fVkVSU0lPTl07CisJcnRsZWZ1c2UtPnR4cHdyX2Zyb21lcHJvbSA9IHRydWU7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiRUVQUk9NIEN1c3RvbWVyIElEOiAweCUyeFxuIiwgcnRsZWZ1c2UtPmVlcHJvbV9vZW1pZCkpOworfQorCit2b2lkIHJ0bDkyZGVfcmVhZF9lZXByb21faW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXU4IHRtcF91MWI7CisKKwlydGxoYWwtPnZlcnNpb24gPSBfcnRsOTJkZV9yZWFkX2NoaXBfdmVyc2lvbihodyk7CisJdG1wX3UxYiA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHXzkzNDZDUik7CisJcnRsZWZ1c2UtPmF1dG9sb2FkX3N0YXR1cyA9IHRtcF91MWI7CisJaWYgKHRtcF91MWIgJiBCSVQoNCkpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfRE1FU0csICgiQm9vdCBmcm9tIEVFUFJPTVxuIikpOworCQlydGxlZnVzZS0+ZXByb210eXBlID0gRUVQUk9NXzkzQzQ2OworCX0gZWxzZSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0RNRVNHLCAoIkJvb3QgZnJvbSBFRlVTRVxuIikpOworCQlydGxlZnVzZS0+ZXByb210eXBlID0gRUVQUk9NX0JPT1RfRUZVU0U7CisJfQorCWlmICh0bXBfdTFiICYgQklUKDUpKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsICgiQXV0b2xvYWQgT0tcbiIpKTsKKworCQlydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcgPSBmYWxzZTsKKwkJX3J0bDkyZGVfcmVhZF9hZGFwdGVyX2luZm8oaHcpOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsICgiQXV0b2xvYWQgRVJSISFcbiIpKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBydGw5MmRlX3VwZGF0ZV9oYWxfcmF0ZV90YWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1MzIgcmF0cl92YWx1ZTsKKwl1OCByYXRyX2luZGV4ID0gMDsKKwl1OCBubW9kZSA9IG1hYy0+aHRfZW5hYmxlOworCXU4IG1pbW9fcHMgPSBJRUVFODAyMTFfU01QU19PRkY7CisJdTE2IHNob3J0Z2lfcmF0ZTsKKwl1MzIgdG1wX3JhdHJfdmFsdWU7CisJdTggY3VydHhid180MG1oeiA9IG1hYy0+YndfNDA7CisJdTggY3Vyc2hvcnRnaV80MG1oeiA9IChzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkgPworCQkJCQkJCTEgOiAwOworCXU4IGN1cnNob3J0Z2lfMjBtaHogPSAoc3RhLT5odF9jYXAuY2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjApID8KKwkJCQkJCQkxIDogMDsKKwllbnVtIHdpcmVsZXNzX21vZGUgd2lyZWxlc3Ntb2RlID0gbWFjLT5tb2RlOworCisJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzVHKQorCQlyYXRyX3ZhbHVlID0gc3RhLT5zdXBwX3JhdGVzWzFdIDw8IDQ7CisJZWxzZQorCQlyYXRyX3ZhbHVlID0gc3RhLT5zdXBwX3JhdGVzWzBdOworCXJhdHJfdmFsdWUgfD0gKHN0YS0+aHRfY2FwLm1jcy5yeF9tYXNrWzFdIDw8IDIwIHwKKwkJICAgICAgIHN0YS0+aHRfY2FwLm1jcy5yeF9tYXNrWzBdIDw8IDEyKTsKKwlzd2l0Y2ggKHdpcmVsZXNzbW9kZSkgeworCWNhc2UgV0lSRUxFU1NfTU9ERV9BOgorCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDBGRjA7CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9COgorCQlpZiAocmF0cl92YWx1ZSAmIDB4MDAwMDAwMGMpCisJCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDAwMGQ7CisJCWVsc2UKKwkJCXJhdHJfdmFsdWUgJj0gMHgwMDAwMDAwZjsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX0c6CisJCXJhdHJfdmFsdWUgJj0gMHgwMDAwMEZGNTsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX05fMjRHOgorCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzVHOgorCQlubW9kZSA9IDE7CisJCWlmIChtaW1vX3BzID09IElFRUU4MDIxMV9TTVBTX1NUQVRJQykgeworCQkJcmF0cl92YWx1ZSAmPSAweDAwMDdGMDA1OworCQl9IGVsc2UgeworCQkJdTMyIHJhdHJfbWFzazsKKworCQkJaWYgKGdldF9yZl90eXBlKHJ0bHBoeSkgPT0gUkZfMVQyUiB8fAorCQkJICAgIGdldF9yZl90eXBlKHJ0bHBoeSkgPT0gUkZfMVQxUikgeworCQkJCXJhdHJfbWFzayA9IDB4MDAwZmYwMDU7CisJCQl9IGVsc2UgeworCQkJCXJhdHJfbWFzayA9IDB4MGYwZmYwMDU7CisJCQl9CisKKwkJCXJhdHJfdmFsdWUgJj0gcmF0cl9tYXNrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChydGxwaHktPnJmX3R5cGUgPT0gUkZfMVQyUikKKwkJCXJhdHJfdmFsdWUgJj0gMHgwMDBmZjBmZjsKKwkJZWxzZQorCQkJcmF0cl92YWx1ZSAmPSAweDBmMGZmMGZmOworCisJCWJyZWFrOworCX0KKwlyYXRyX3ZhbHVlICY9IDB4MEZGRkZGRkY7CisJaWYgKG5tb2RlICYmICgoY3VydHhid180MG1oeiAmJiBjdXJzaG9ydGdpXzQwbWh6KSB8fAorCSAgICAoIWN1cnR4YndfNDBtaHogJiYgY3Vyc2hvcnRnaV8yMG1oeikpKSB7CisJCXJhdHJfdmFsdWUgfD0gMHgxMDAwMDAwMDsKKwkJdG1wX3JhdHJfdmFsdWUgPSAocmF0cl92YWx1ZSA+PiAxMik7CisJCWZvciAoc2hvcnRnaV9yYXRlID0gMTU7IHNob3J0Z2lfcmF0ZSA+IDA7IHNob3J0Z2lfcmF0ZS0tKSB7CisJCQlpZiAoKDEgPDwgc2hvcnRnaV9yYXRlKSAmIHRtcF9yYXRyX3ZhbHVlKQorCQkJCWJyZWFrOworCQl9CisJCXNob3J0Z2lfcmF0ZSA9IChzaG9ydGdpX3JhdGUgPDwgMTIpIHwgKHNob3J0Z2lfcmF0ZSA8PCA4KSB8CisJCSAgICAoc2hvcnRnaV9yYXRlIDw8IDQpIHwgKHNob3J0Z2lfcmF0ZSk7CisJfQorCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBSRUdfQVJGUjAgKyByYXRyX2luZGV4ICogNCwgcmF0cl92YWx1ZSk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SQVRSLCBEQkdfRE1FU0csCisJCSAoIiV4XG4iLCBydGxfcmVhZF9kd29yZChydGxwcml2LCBSRUdfQVJGUjApKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDkyZGVfdXBkYXRlX2hhbF9yYXRlX21hc2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHJzc2lfbGV2ZWwpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfc3RhX2luZm8gKnN0YV9lbnRyeSA9IE5VTEw7CisJdTMyIHJhdHJfYml0bWFwOworCXU4IHJhdHJfaW5kZXg7CisJdTggY3VydHhid180MG1oeiA9IChzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkKKwkJCQkJCQk/IDEgOiAwOworCXU4IGN1cnNob3J0Z2lfNDBtaHogPSAoc3RhLT5odF9jYXAuY2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApID8KKwkJCQkJCQkxIDogMDsKKwl1OCBjdXJzaG9ydGdpXzIwbWh6ID0gKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwKSA/CisJCQkJCQkJMSA6IDA7CisJZW51bSB3aXJlbGVzc19tb2RlIHdpcmVsZXNzbW9kZSA9IDA7CisJYm9vbCBzaG9ydGdpID0gZmFsc2U7CisJdTMyIHZhbHVlWzJdOworCXU4IG1hY2lkID0gMDsKKwl1OCBtaW1vX3BzID0gSUVFRTgwMjExX1NNUFNfT0ZGOworCisJc3RhX2VudHJ5ID0gKHN0cnVjdCBydGxfc3RhX2luZm8gKikgc3RhLT5kcnZfcHJpdjsKKwltaW1vX3BzID0gc3RhX2VudHJ5LT5taW1vX3BzOworCXdpcmVsZXNzbW9kZSA9IHN0YV9lbnRyeS0+d2lyZWxlc3NfbW9kZTsKKwlpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKKwkJY3VydHhid180MG1oeiA9IG1hYy0+YndfNDA7CisJZWxzZSBpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkJbWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCW1hY2lkID0gc3RhLT5haWQgKyAxOworCisJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzVHKQorCQlyYXRyX2JpdG1hcCA9IHN0YS0+c3VwcF9yYXRlc1sxXSA8PCA0OworCWVsc2UKKwkJcmF0cl9iaXRtYXAgPSBzdGEtPnN1cHBfcmF0ZXNbMF07CisJcmF0cl9iaXRtYXAgfD0gKHN0YS0+aHRfY2FwLm1jcy5yeF9tYXNrWzFdIDw8IDIwIHwKKwkJCXN0YS0+aHRfY2FwLm1jcy5yeF9tYXNrWzBdIDw8IDEyKTsKKwlzd2l0Y2ggKHdpcmVsZXNzbW9kZSkgeworCWNhc2UgV0lSRUxFU1NfTU9ERV9COgorCQlyYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfQjsKKwkJaWYgKHJhdHJfYml0bWFwICYgMHgwMDAwMDAwYykKKwkJCXJhdHJfYml0bWFwICY9IDB4MDAwMDAwMGQ7CisJCWVsc2UKKwkJCXJhdHJfYml0bWFwICY9IDB4MDAwMDAwMGY7CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9HOgorCQlyYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfR0I7CisKKwkJaWYgKHJzc2lfbGV2ZWwgPT0gMSkKKwkJCXJhdHJfYml0bWFwICY9IDB4MDAwMDBmMDA7CisJCWVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gMikKKwkJCXJhdHJfYml0bWFwICY9IDB4MDAwMDBmZjA7CisJCWVsc2UKKwkJCXJhdHJfYml0bWFwICY9IDB4MDAwMDBmZjU7CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9BOgorCQlyYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfRzsKKwkJcmF0cl9iaXRtYXAgJj0gMHgwMDAwMGZmMDsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX05fMjRHOgorCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzVHOgorCQlpZiAod2lyZWxlc3Ntb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcpCisJCQlyYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfTkdCOworCQllbHNlCisJCQlyYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfTkc7CisJCWlmIChtaW1vX3BzID09IElFRUU4MDIxMV9TTVBTX1NUQVRJQykgeworCQkJaWYgKHJzc2lfbGV2ZWwgPT0gMSkKKwkJCQlyYXRyX2JpdG1hcCAmPSAweDAwMDcwMDAwOworCQkJZWxzZSBpZiAocnNzaV9sZXZlbCA9PSAyKQorCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwN2YwMDA7CisJCQllbHNlCisJCQkJcmF0cl9iaXRtYXAgJj0gMHgwMDA3ZjAwNTsKKwkJfSBlbHNlIHsKKwkJCWlmIChydGxwaHktPnJmX3R5cGUgPT0gUkZfMVQyUiB8fAorCQkJICAgIHJ0bHBoeS0+cmZfdHlwZSA9PSBSRl8xVDFSKSB7CisJCQkJaWYgKGN1cnR4YndfNDBtaHopIHsKKwkJCQkJaWYgKHJzc2lfbGV2ZWwgPT0gMSkKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZjAwMDA7CisJCQkJCWVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gMikKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZmYwMDA7CisJCQkJCWVsc2UKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZmYwMTU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHJzc2lfbGV2ZWwgPT0gMSkKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZjAwMDA7CisJCQkJCWVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gMikKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZmYwMDA7CisJCQkJCWVsc2UKKwkJCQkJCXJhdHJfYml0bWFwICY9IDB4MDAwZmYwMDU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoY3VydHhid180MG1oeikgeworCQkJCQlpZiAocnNzaV9sZXZlbCA9PSAxKQorCQkJCQkJcmF0cl9iaXRtYXAgJj0gMHgwZjBmMDAwMDsKKwkJCQkJZWxzZSBpZiAocnNzaV9sZXZlbCA9PSAyKQorCQkJCQkJcmF0cl9iaXRtYXAgJj0gMHgwZjBmZjAwMDsKKwkJCQkJZWxzZQorCQkJCQkJcmF0cl9iaXRtYXAgJj0gMHgwZjBmZjAxNTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocnNzaV9sZXZlbCA9PSAxKQorCQkJCQkJcmF0cl9iaXRtYXAgJj0gMHgwZjBmMDAwMDsKKwkJCQkJZWxzZSBpZiAocnNzaV9sZXZlbCA9PSAyKQorCQkJCQkJcmF0cl9iaXRtYXAgJj0gMHgwZjBmZjAwMDsKKwkJCQkJZWxzZQorCQkJCQkJcmF0cl9iaXRtYXAgJj0gMHgwZjBmZjAwNTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKChjdXJ0eGJ3XzQwbWh6ICYmIGN1cnNob3J0Z2lfNDBtaHopIHx8CisJCSAgICAoIWN1cnR4YndfNDBtaHogJiYgY3Vyc2hvcnRnaV8yMG1oeikpIHsKKworCQkJaWYgKG1hY2lkID09IDApCisJCQkJc2hvcnRnaSA9IHRydWU7CisJCQllbHNlIGlmIChtYWNpZCA9PSAxKQorCQkJCXNob3J0Z2kgPSBmYWxzZTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYXRyX2luZGV4ID0gUkFUUl9JTlhfV0lSRUxFU1NfTkdCOworCisJCWlmIChydGxwaHktPnJmX3R5cGUgPT0gUkZfMVQyUikKKwkJCXJhdHJfYml0bWFwICY9IDB4MDAwZmYwZmY7CisJCWVsc2UKKwkJCXJhdHJfYml0bWFwICY9IDB4MGYwZmYwZmY7CisJCWJyZWFrOworCX0KKworCXZhbHVlWzBdID0gKHJhdHJfYml0bWFwICYgMHgwZmZmZmZmZikgfCAocmF0cl9pbmRleCA8PCAyOCk7CisJdmFsdWVbMV0gPSBtYWNpZCB8IChzaG9ydGdpID8gMHgyMCA6IDB4MDApIHwgMHg4MDsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX1JBVFIsIERCR19ETUVTRywKKwkJICgicmF0cl9iaXRtYXAgOiV4IHZhbHVlMDoleCB2YWx1ZTE6JXhcbiIsCisJCSAgcmF0cl9iaXRtYXAsIHZhbHVlWzBdLCB2YWx1ZVsxXSkpOworCXJ0bDkyZF9maWxsX2gyY19jbWQoaHcsIEgyQ19SQV9NQVNLLCA1LCAodTggKikgdmFsdWUpOworCWlmIChtYWNpZCAhPSAwKQorCQlzdGFfZW50cnktPnJhdHJfaW5kZXggPSByYXRyX2luZGV4OworfQorCit2b2lkIHJ0bDkyZGVfdXBkYXRlX2hhbF9yYXRlX3RibChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggcnNzaV9sZXZlbCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlpZiAocnRscHJpdi0+ZG0udXNlcmFtYXNrKQorCQlydGw5MmRlX3VwZGF0ZV9oYWxfcmF0ZV9tYXNrKGh3LCBzdGEsIHJzc2lfbGV2ZWwpOworCWVsc2UKKwkJcnRsOTJkZV91cGRhdGVfaGFsX3JhdGVfdGFibGUoaHcsIHN0YSk7Cit9CisKK3ZvaWQgcnRsOTJkZV91cGRhdGVfY2hhbm5lbF9hY2Nlc3Nfc2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwl1MTYgc2lmc190aW1lcjsKKworCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfU0xPVF9USU1FLAorCQkJCSAgICAgICh1OCAqKSZtYWMtPnNsb3RfdGltZSk7CisJaWYgKCFtYWMtPmh0X2VuYWJsZSkKKwkJc2lmc190aW1lciA9IDB4MGEwYTsKKwllbHNlCisJCXNpZnNfdGltZXIgPSAweDEwMTA7CisJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9od19yZWcoaHcsIEhXX1ZBUl9TSUZTLCAodTggKikmc2lmc190aW1lcik7Cit9CisKK2Jvb2wgcnRsOTJkZV9ncGlvX3JhZGlvX29uX29mZl9jaGVja2luZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKnZhbGlkKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCWVudW0gcmZfcHdyc3RhdGUgZV9yZnBvd2Vyc3RhdGVfdG9zZXQ7CisJdTggdTF0bXA7CisJYm9vbCBhY3R1YWxseXNldCA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKworCWlmIChydGxwY2ktPmJlaW5nX2luaXRfYWRhcHRlcikKKwkJcmV0dXJuIGZhbHNlOworCWlmIChwcHNjLT5zd3JmX3Byb2Nlc3NpbmcpCisJCXJldHVybiBmYWxzZTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jaywgZmxhZyk7CisJaWYgKHBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jaywgZmxhZyk7CisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQlwcHNjLT5yZmNoYW5nZV9pbnByb2dyZXNzID0gdHJ1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jaywgZmxhZyk7CisJfQorCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19NQUNfUElOTVVYX0NGRywgcnRsX3JlYWRfYnl0ZShydGxwcml2LAorCQkJICBSRUdfTUFDX1BJTk1VWF9DRkcpICYgfihCSVQoMykpKTsKKwl1MXRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0dQSU9fSU9fU0VMKTsKKwllX3JmcG93ZXJzdGF0ZV90b3NldCA9ICh1MXRtcCAmIEJJVCgzKSkgPyBFUkZPTiA6IEVSRk9GRjsKKwlpZiAocHBzYy0+aHdyYWRpb29mZiAmJiAoZV9yZnBvd2Vyc3RhdGVfdG9zZXQgPT0gRVJGT04pKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19ETUVTRywKKwkJCSAoIkdQSU9DaGFuZ2VSRiAgLSBIVyBSYWRpbyBPTiwgUkYgT05cbiIpKTsKKwkJZV9yZnBvd2Vyc3RhdGVfdG9zZXQgPSBFUkZPTjsKKwkJcHBzYy0+aHdyYWRpb29mZiA9IGZhbHNlOworCQlhY3R1YWxseXNldCA9IHRydWU7CisJfSBlbHNlIGlmICgocHBzYy0+aHdyYWRpb29mZiA9PSBmYWxzZSkKKwkJJiYgKGVfcmZwb3dlcnN0YXRlX3Rvc2V0ID09IEVSRk9GRikpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX0RNRVNHLAorCQkJICgiR1BJT0NoYW5nZVJGICAtIEhXIFJhZGlvIE9GRiwgUkYgT0ZGXG4iKSk7CisJCWVfcmZwb3dlcnN0YXRlX3Rvc2V0ID0gRVJGT0ZGOworCQlwcHNjLT5od3JhZGlvb2ZmID0gdHJ1ZTsKKwkJYWN0dWFsbHlzZXQgPSB0cnVlOworCX0KKwlpZiAoYWN0dWFsbHlzZXQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2ssIGZsYWcpOworCQlwcHNjLT5yZmNoYW5nZV9pbnByb2dyZXNzID0gZmFsc2U7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2ssIGZsYWcpOworCX0gZWxzZSB7CisJCWlmIChwcHNjLT5yZWdfcmZwc19sZXZlbCAmIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKQorCQkJUlRfU0VUX1BTX0xFVkVMKHBwc2MsIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2ssIGZsYWcpOworCQlwcHNjLT5yZmNoYW5nZV9pbnByb2dyZXNzID0gZmFsc2U7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2ssIGZsYWcpOworCX0KKwkqdmFsaWQgPSAxOworCXJldHVybiAhcHBzYy0+aHdyYWRpb29mZjsKK30KKwordm9pZCBydGw5MmRlX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBrZXlfaW5kZXgsCisJCSAgICAgdTggKnBfbWFjYWRkciwgYm9vbCBpc19ncm91cCwgdTggZW5jX2FsZ28sCisJCSAgICAgYm9vbCBpc193ZXBrZXksIGJvb2wgY2xlYXJfYWxsKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJdTggKm1hY2FkZHIgPSBwX21hY2FkZHI7CisJdTMyIGVudHJ5X2lkOworCWJvb2wgaXNfcGFpcndpc2UgPSBmYWxzZTsKKwlzdGF0aWMgdTggY2FtX2NvbnN0X2FkZHJbNF1bNl0gPSB7CisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDF9LAorCQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMn0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzfQorCX07CisJc3RhdGljIHU4IGNhbV9jb25zdF9icm9hZFtdID0geworCQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCisJfTsKKworCWlmIChjbGVhcl9hbGwpIHsKKwkJdTggaWR4OworCQl1OCBjYW1fb2Zmc2V0ID0gMDsKKwkJdTggY2xlYXJfbnVtYmVyID0gNTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9TRUMsIERCR19ETUVTRywgKCJjbGVhcl9hbGxcbiIpKTsKKwkJZm9yIChpZHggPSAwOyBpZHggPCBjbGVhcl9udW1iZXI7IGlkeCsrKSB7CisJCQlydGxfY2FtX21hcmtfaW52YWxpZChodywgY2FtX29mZnNldCArIGlkeCk7CisJCQlydGxfY2FtX2VtcHR5X2VudHJ5KGh3LCBjYW1fb2Zmc2V0ICsgaWR4KTsKKworCQkJaWYgKGlkeCA8IDUpIHsKKwkJCQltZW1zZXQocnRscHJpdi0+c2VjLmtleV9idWZbaWR4XSwgMCwKKwkJCQkgICAgICAgTUFYX0tFWV9MRU4pOworCQkJCXJ0bHByaXYtPnNlYy5rZXlfbGVuW2lkeF0gPSAwOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChlbmNfYWxnbykgeworCQljYXNlIFdFUDQwX0VOQ1JZUFRJT046CisJCQllbmNfYWxnbyA9IENBTV9XRVA0MDsKKwkJCWJyZWFrOworCQljYXNlIFdFUDEwNF9FTkNSWVBUSU9OOgorCQkJZW5jX2FsZ28gPSBDQU1fV0VQMTA0OworCQkJYnJlYWs7CisJCWNhc2UgVEtJUF9FTkNSWVBUSU9OOgorCQkJZW5jX2FsZ28gPSBDQU1fVEtJUDsKKwkJCWJyZWFrOworCQljYXNlIEFFU0NDTVBfRU5DUllQVElPTjoKKwkJCWVuY19hbGdvID0gQ0FNX0FFUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywgKCJzd2l0Y2ggY2FzZSAiCisJCQkJCQkibm90IHByb2Nlc3NcbiIpKTsKKwkJCWVuY19hbGdvID0gQ0FNX1RLSVA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoaXNfd2Vwa2V5IHx8IHJ0bHByaXYtPnNlYy51c2VfZGVmYXVsdGtleSkgeworCQkJbWFjYWRkciA9IGNhbV9jb25zdF9hZGRyW2tleV9pbmRleF07CisJCQllbnRyeV9pZCA9IGtleV9pbmRleDsKKwkJfSBlbHNlIHsKKwkJCWlmIChpc19ncm91cCkgeworCQkJCW1hY2FkZHIgPSBjYW1fY29uc3RfYnJvYWQ7CisJCQkJZW50cnlfaWQgPSBrZXlfaW5kZXg7CisJCQl9IGVsc2UgeworCQkJCWlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgeworCQkJCQllbnRyeV9pZCA9IHJ0bF9jYW1fZ2V0X2ZyZWVfZW50cnkoaHcsCisJCQkJCQkJCSBwX21hY2FkZHIpOworCQkJCQlpZiAoZW50cnlfaWQgPj0gIFRPVEFMX0NBTV9FTlRSWSkgeworCQkJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9TRUMsCisJCQkJCQkJIERCR19FTUVSRywgKCJDYW4gbm90ICIKKwkJCQkJCQkgImZpbmQgZnJlZSBodyBzZWN1cml0eSIKKwkJCQkJCQkgIiBjYW0gZW50cnlcbiIpKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWVudHJ5X2lkID0gQ0FNX1BBSVJXSVNFX0tFWV9QT1NJVElPTjsKKwkJCQl9CisJCQkJa2V5X2luZGV4ID0gUEFJUldJU0VfS0VZSURYOworCQkJCWlzX3BhaXJ3aXNlID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlpZiAocnRscHJpdi0+c2VjLmtleV9sZW5ba2V5X2luZGV4XSA9PSAwKSB7CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1NFQywgREJHX0RNRVNHLAorCQkJCSAoImRlbGV0ZSBvbmUgZW50cnksIGVudHJ5X2lkIGlzICVkXG4iLAorCQkJCSBlbnRyeV9pZCkpOworCQkJaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKQorCQkJCXJ0bF9jYW1fZGVsX2VudHJ5KGh3LCBwX21hY2FkZHIpOworCQkJcnRsX2NhbV9kZWxldGVfb25lX2VudHJ5KGh3LCBwX21hY2FkZHIsIGVudHJ5X2lkKTsKKwkJfSBlbHNlIHsKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfU0VDLCBEQkdfTE9VRCwKKwkJCQkgKCJUaGUgaW5zZXJ0IEtFWSBsZW5ndGggaXMgJWRcbiIsCisJCQkJICBydGxwcml2LT5zZWMua2V5X2xlbltQQUlSV0lTRV9LRVlJRFhdKSk7CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1NFQywgREJHX0xPVUQsCisJCQkJICgiVGhlIGluc2VydCBLRVkgIGlzICV4ICV4XG4iLAorCQkJCSAgcnRscHJpdi0+c2VjLmtleV9idWZbMF1bMF0sCisJCQkJICBydGxwcml2LT5zZWMua2V5X2J1ZlswXVsxXSkpOworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9TRUMsIERCR19ETUVTRywKKwkJCQkgKCJhZGQgb25lIGVudHJ5XG4iKSk7CisJCQlpZiAoaXNfcGFpcndpc2UpIHsKKwkJCQlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfU0VDLCBEQkdfTE9VRCwKKwkJCQkJICAgICAgIlBhaXJ3aWFzZSBLZXkgY29udGVudCA6IiwKKwkJCQkJICAgICAgcnRscHJpdi0+c2VjLnBhaXJ3aXNlX2tleSwKKwkJCQkJICAgICAgcnRscHJpdi0+CisJCQkJCSAgICAgIHNlYy5rZXlfbGVuW1BBSVJXSVNFX0tFWUlEWF0pOworCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfU0VDLCBEQkdfRE1FU0csCisJCQkJCSAoInNldCBQYWlyd2lhc2Uga2V5XG4iKSk7CisJCQkJcnRsX2NhbV9hZGRfb25lX2VudHJ5KGh3LCBtYWNhZGRyLCBrZXlfaW5kZXgsCisJCQkJCQkgICAgICBlbnRyeV9pZCwgZW5jX2FsZ28sCisJCQkJCQkgICAgICBDQU1fQ09ORklHX05PX1VTRURLLAorCQkJCQkJICAgICAgcnRscHJpdi0+CisJCQkJCQkgICAgICBzZWMua2V5X2J1ZltrZXlfaW5kZXhdKTsKKwkJCX0gZWxzZSB7CisJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9TRUMsIERCR19ETUVTRywKKwkJCQkJICgic2V0IGdyb3VwIGtleVxuIikpOworCQkJCWlmIChtYWMtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCQkJCQlydGxfY2FtX2FkZF9vbmVfZW50cnkoaHcsCisJCQkJCQlydGxlZnVzZS0+ZGV2X2FkZHIsCisJCQkJCQlQQUlSV0lTRV9LRVlJRFgsCisJCQkJCQlDQU1fUEFJUldJU0VfS0VZX1BPU0lUSU9OLAorCQkJCQkJZW5jX2FsZ28sIENBTV9DT05GSUdfTk9fVVNFREssCisJCQkJCQlydGxwcml2LT5zZWMua2V5X2J1ZltlbnRyeV9pZF0pOworCQkJCX0KKwkJCQlydGxfY2FtX2FkZF9vbmVfZW50cnkoaHcsIG1hY2FkZHIsIGtleV9pbmRleCwKKwkJCQkJCWVudHJ5X2lkLCBlbmNfYWxnbywKKwkJCQkJCUNBTV9DT05GSUdfTk9fVVNFREssCisJCQkJCQlydGxwcml2LT5zZWMua2V5X2J1ZgorCQkJCQkJW2VudHJ5X2lkXSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgcnRsOTJkZV9zdXNwZW5kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCXJ0bHByaXYtPnJ0bGhhbC5tYWNwaHljdGxfcmVnID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LAorCQlSRUdfTUFDX1BIWV9DVFJMX05PUk1BTCk7Cit9CisKK3ZvaWQgcnRsOTJkZV9yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX01BQ19QSFlfQ1RSTF9OT1JNQUwsCisJCSAgICAgICBydGxwcml2LT5ydGxoYWwubWFjcGh5Y3RsX3JlZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDQ0ZmZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvaHcuaApAQCAtMCwwICsxLDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDkyREVfSFdfSF9fCisjZGVmaW5lIF9fUlRMOTJERV9IV19IX18KKwordm9pZCBydGw5MmRlX2dldF9od19yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKTsKK3ZvaWQgcnRsOTJkZV9yZWFkX2VlcHJvbV9pbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsOTJkZV9pbnRlcnJ1cHRfcmVjb2duaXplZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgIHUzMiAqcF9pbnRhLCB1MzIgKnBfaW50Yik7CitpbnQgcnRsOTJkZV9od19pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsOTJkZV9jYXJkX2Rpc2FibGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw5MmRlX2VuYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw5MmRlX2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK2ludCBydGw5MmRlX3NldF9uZXR3b3JrX3R5cGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSk7Cit2b2lkIHJ0bDkyZGVfc2V0X2NoZWNrX2Jzc2lkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGNoZWNrX2Jzc2lkKTsKK3ZvaWQgcnRsOTJkZV9zZXRfcW9zKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgYWNpKTsKK3ZvaWQgcnRsOTJkZV9zZXRfYmVhY29uX3JlbGF0ZWRfcmVnaXN0ZXJzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsOTJkZV9zZXRfYmVhY29uX2ludGVydmFsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsOTJkZV91cGRhdGVfaW50ZXJydXB0X21hc2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgdTMyIGFkZF9tc3IsIHUzMiBybV9tc3IpOwordm9pZCBydGw5MmRlX3NldF9od19yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKTsKK3ZvaWQgcnRsOTJkZV91cGRhdGVfaGFsX3JhdGVfdGJsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCByc3NpX2xldmVsKTsKK3ZvaWQgcnRsOTJkZV91cGRhdGVfY2hhbm5lbF9hY2Nlc3Nfc2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Citib29sIHJ0bDkyZGVfZ3Bpb19yYWRpb19vbl9vZmZfY2hlY2tpbmcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICp2YWxpZCk7Cit2b2lkIHJ0bDkyZGVfZW5hYmxlX2h3X3NlY3VyaXR5X2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDkyZGVfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGtleV9pbmRleCwKKwkJICAgICB1OCAqcF9tYWNhZGRyLCBib29sIGlzX2dyb3VwLCB1OCBlbmNfYWxnbywKKwkJICAgICBib29sIGlzX3dlcGtleSwgYm9vbCBjbGVhcl9hbGwpOworCitleHRlcm4gdm9pZCBydGw5MmRlX3dyaXRlX2R3b3JkX2RiaShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IG9mZnNldCwKKwkJCQkgICAgdTMyIHZhbHVlLCB1OCBkaXJlY3QpOworZXh0ZXJuIHUzMiBydGw5MmRlX3JlYWRfZHdvcmRfZGJpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgb2Zmc2V0LAorCQkJCSAgdTggZGlyZWN0KTsKK3ZvaWQgcnRsOTJkZV9zdXNwZW5kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsOTJkZV9yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw5MmRfbGlua2VkX3NldF9yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvbGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1NTJmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2xlZC5jCkBAIC0wLDAgKzEsMTU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL3dpZmkuaCIKKyNpbmNsdWRlICIuLi9wY2kuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJsZWQuaCIKKworc3RhdGljIHZvaWQgX3J0bDkyY2VfaW5pdF9sZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBzdHJ1Y3QgcnRsX2xlZCAqcGxlZCwgZW51bSBydGxfbGVkX3BpbiBsZWRwaW4pCit7CisJcGxlZC0+aHcgPSBodzsKKwlwbGVkLT5sZWRwaW4gPSBsZWRwaW47CisJcGxlZC0+bGVkb24gPSBmYWxzZTsKK30KKwordm9pZCBydGw5MmRlX3N3X2xlZF9vbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHJ0bF9sZWQgKnBsZWQpCit7CisJdTggbGVkY2ZnOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfTEVELCBEQkdfTE9VRCwKKwkJICgiTGVkQWRkcjolWCBsZWRwaW49JWRcbiIsIFJFR19MRURDRkcyLCBwbGVkLT5sZWRwaW4pKTsKKworCXN3aXRjaCAocGxlZC0+bGVkcGluKSB7CisJY2FzZSBMRURfUElOX0dQSU8wOgorCQlicmVhazsKKwljYXNlIExFRF9QSU5fTEVEMDoKKwkJbGVkY2ZnID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTEVEQ0ZHMik7CisKKwkJaWYgKChydGxwcml2LT5lZnVzZS5lZXByb21fZGlkID09IDB4ODE3NikgfHwKKwkJCShydGxwcml2LT5lZnVzZS5lZXByb21fZGlkID09IDB4ODE5MykpCisJCQkvKiBCSVQ3IG9mIFJFR19MRURDRkcyIHNob3VsZCBiZSBzZXQgdG8KKwkJCSAqIG1ha2Ugc3VyZSB3ZSBjb3VsZCBlbWl0IHRoZSBsZWQyLiAqLworCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0xFRENGRzIsIChsZWRjZmcgJiAweGYwKSB8CisJCQkJICAgICAgIEJJVCg3KSB8IEJJVCg1KSB8IEJJVCg2KSk7CisJCWVsc2UKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19MRURDRkcyLCAobGVkY2ZnICYgMHhmMCkgfAorCQkJCSAgICAgICBCSVQoNykgfCBCSVQoNSkpOworCQlicmVhazsKKwljYXNlIExFRF9QSU5fTEVEMToKKwkJbGVkY2ZnID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTEVEQ0ZHMSk7CisKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0xFRENGRzIsIChsZWRjZmcgJiAweDBmKSB8IEJJVCg1KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIikpOworCQlicmVhazsKKwl9CisJcGxlZC0+bGVkb24gPSB0cnVlOworfQorCit2b2lkIHJ0bDkyZGVfc3dfbGVkX29mZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHJ0bF9sZWQgKnBsZWQpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGNpX3ByaXYgKnBjaXByaXYgPSBydGxfcGNpcHJpdihodyk7CisJdTggbGVkY2ZnOworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9MRUQsIERCR19MT1VELAorCQkgKCJMZWRBZGRyOiVYIGxlZHBpbj0lZFxuIiwgUkVHX0xFRENGRzIsIHBsZWQtPmxlZHBpbikpOworCisJbGVkY2ZnID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTEVEQ0ZHMik7CisKKwlzd2l0Y2ggKHBsZWQtPmxlZHBpbikgeworCWNhc2UgTEVEX1BJTl9HUElPMDoKKwkJYnJlYWs7CisJY2FzZSBMRURfUElOX0xFRDA6CisJCWxlZGNmZyAmPSAweGYwOworCQlpZiAocGNpcHJpdi0+bGVkY3RsLmxlZF9vcGVuZHJhaW4pCisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTEVEQ0ZHMiwKKwkJCQkgICAgICAgKGxlZGNmZyB8IEJJVCgxKSB8IEJJVCg1KSB8IEJJVCg2KSkpOworCQllbHNlCisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTEVEQ0ZHMiwKKwkJCQkgICAgICAgKGxlZGNmZyB8IEJJVCgzKSB8IEJJVCg1KSB8IEJJVCg2KSkpOworCQlicmVhazsKKwljYXNlIExFRF9QSU5fTEVEMToKKwkJbGVkY2ZnICY9IDB4MGY7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19MRURDRkcyLCAobGVkY2ZnIHwgQklUKDMpKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIikpOworCQlicmVhazsKKwl9CisJcGxlZC0+bGVkb24gPSBmYWxzZTsKK30KKwordm9pZCBydGw5MmRlX2luaXRfc3dfbGVkcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3BjaV9wcml2ICpwY2lwcml2ID0gcnRsX3BjaXByaXYoaHcpOworCV9ydGw5MmNlX2luaXRfbGVkKGh3LCAmKHBjaXByaXYtPmxlZGN0bC5zd19sZWQwKSwgTEVEX1BJTl9MRUQwKTsKKwlfcnRsOTJjZV9pbml0X2xlZChodywgJihwY2lwcml2LT5sZWRjdGwuc3dfbGVkMSksIExFRF9QSU5fTEVEMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmNlX3N3X2xlZF9jb250cm9sKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICBlbnVtIGxlZF9jdGxfbW9kZSBsZWRhY3Rpb24pCit7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2xlZCAqcExlZDAgPSAmKHBjaXByaXYtPmxlZGN0bC5zd19sZWQwKTsKKwlzd2l0Y2ggKGxlZGFjdGlvbikgeworCWNhc2UgTEVEX0NUTF9QT1dFUl9PTjoKKwljYXNlIExFRF9DVExfTElOSzoKKwljYXNlIExFRF9DVExfTk9fTElOSzoKKwkJcnRsOTJkZV9zd19sZWRfb24oaHcsIHBMZWQwKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfQ1RMX1BPV0VSX09GRjoKKwkJcnRsOTJkZV9zd19sZWRfb2ZmKGh3LCBwTGVkMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwordm9pZCBydGw5MmRlX2xlZF9jb250cm9sKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIGxlZF9jdGxfbW9kZSBsZWRhY3Rpb24pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCisJaWYgKChwcHNjLT5yZm9mZl9yZWFzb24gPiBSRl9DSEFOR0VfQllfUFMpICYmCisJICAgIChsZWRhY3Rpb24gPT0gTEVEX0NUTF9UWCB8fAorCSAgICAgbGVkYWN0aW9uID09IExFRF9DVExfUlggfHwKKwkgICAgIGxlZGFjdGlvbiA9PSBMRURfQ1RMX1NJVEVfU1VSVkVZIHx8CisJICAgICBsZWRhY3Rpb24gPT0gTEVEX0NUTF9MSU5LIHx8CisJICAgICBsZWRhY3Rpb24gPT0gTEVEX0NUTF9OT19MSU5LIHx8CisJICAgICBsZWRhY3Rpb24gPT0gTEVEX0NUTF9TVEFSVF9UT19MSU5LIHx8CisJICAgICBsZWRhY3Rpb24gPT0gTEVEX0NUTF9QT1dFUl9PTikpIHsKKwkJcmV0dXJuOworCX0KKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0xFRCwgREJHX0xPVUQsICgibGVkYWN0aW9uICVkLFxuIiwgbGVkYWN0aW9uKSk7CisKKwlfcnRsOTJjZV9zd19sZWRfY29udHJvbChodywgbGVkYWN0aW9uKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2xlZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvbGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmNGEzYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2xlZC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMOTJDRV9MRURfSF9fCisjZGVmaW5lIF9fUlRMOTJDRV9MRURfSF9fCisKK3ZvaWQgcnRsOTJkZV9pbml0X3N3X2xlZHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw5MmRlX3N3X2xlZF9vbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHJ0bF9sZWQgKnBsZWQpOwordm9pZCBydGw5MmRlX3N3X2xlZF9vZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBydGxfbGVkICpwbGVkKTsKK3ZvaWQgcnRsOTJkZV9sZWRfY29udHJvbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBsZWRfY3RsX21vZGUgbGVkYWN0aW9uKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3BoeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzdhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9waHkuYwpAQCAtMCwwICsxLDM4MzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vd2lmaS5oIgorI2luY2x1ZGUgIi4uL3BjaS5oIgorI2luY2x1ZGUgIi4uL3BzLmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiZGVmLmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAicmYuaCIKKyNpbmNsdWRlICJkbS5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAic3cuaCIKKyNpbmNsdWRlICJody5oIgorCisjZGVmaW5lIE1BWF9SRl9JTVJfSU5ERVgJCQkxMgorI2RlZmluZSBNQVhfUkZfSU1SX0lOREVYX05PUk1BTAkJCTEzCisjZGVmaW5lIFJGX1JFR19OVU1fRk9SX0NfQ1VUXzVHCQkJNgorI2RlZmluZSBSRl9SRUdfTlVNX0ZPUl9DX0NVVF81R19JTlRFUk5BTFBBCTcKKyNkZWZpbmUgUkZfUkVHX05VTV9GT1JfQ19DVVRfMkcJCQk1CisjZGVmaW5lIFJGX0NITkxfTlVNXzVHCQkJCTE5CisjZGVmaW5lIFJGX0NITkxfTlVNXzVHXzQwTQkJCTE3CisjZGVmaW5lIFRBUkdFVF9DSE5MX05VTV81RwkJCTIyMQorI2RlZmluZSBUQVJHRVRfQ0hOTF9OVU1fMkcJCQkxNAorI2RlZmluZSBDVl9DVVJWRV9DTlQJCQkJNjQKKworc3RhdGljIHUzMiByZl9yZWdfZm9yXzVnX3N3Y2hubF9ub3JtYWxbTUFYX1JGX0lNUl9JTkRFWF9OT1JNQUxdID0geworCTAsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4MAorfTsKKworc3RhdGljIHU4IHJmX3JlZ19mb3JfY19jdXRfNWdbUkZfUkVHX05VTV9GT1JfQ19DVVRfNUddID0geworCVJGX1NZTl9HMSwgUkZfU1lOX0cyLCBSRl9TWU5fRzMsIFJGX1NZTl9HNCwgUkZfU1lOX0c1LCBSRl9TWU5fRzYKK307CisKK3N0YXRpYyB1OCByZl9yZWdfZm9yX2NfY3V0XzJnW1JGX1JFR19OVU1fRk9SX0NfQ1VUXzJHXSA9IHsKKwlSRl9TWU5fRzEsIFJGX1NZTl9HMiwgUkZfU1lOX0czLCBSRl9TWU5fRzcsIFJGX1NZTl9HOAorfTsKKworc3RhdGljIHU4IHJmX2Zvcl9jX2N1dF81Z19pbnRlcm5hbF9wYVtSRl9SRUdfTlVNX0ZPUl9DX0NVVF81R19JTlRFUk5BTFBBXSA9IHsKKwkweDBCLCAweDQ4LCAweDQ5LCAweDRCLCAweDAzLCAweDA0LCAweDBFCit9OworCitzdGF0aWMgdTMyIHJmX3JlZ19tYXNrX2Zvcl9jX2N1dF8yZ1tSRl9SRUdfTlVNX0ZPUl9DX0NVVF8yR10gPSB7CisJQklUKDE5KSB8IEJJVCgxOCkgfCBCSVQoMTcpIHwgQklUKDE0KSB8IEJJVCgxKSwKKwlCSVQoMTApIHwgQklUKDkpLAorCUJJVCgxOCkgfCBCSVQoMTcpIHwgQklUKDE2KSB8IEJJVCgxKSwKKwlCSVQoMikgfCBCSVQoMSksCisJQklUKDE1KSB8IEJJVCgxNCkgfCBCSVQoMTMpIHwgQklUKDEyKSB8IEJJVCgxMSkKK307CisKK3N0YXRpYyB1OCByZl9jaG5sXzVnW1JGX0NITkxfTlVNXzVHXSA9IHsKKwkzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsCisJMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAKK307CisKK3N0YXRpYyB1OCByZl9jaG5sXzVnXzQwbVtSRl9DSE5MX05VTV81R180ME1dID0geworCTM4LCA0MiwgNDYsIDUwLCA1NCwgNTgsIDYyLCAxMDIsIDEwNiwgMTEwLCAxMTQsCisJMTE4LCAxMjIsIDEyNiwgMTMwLCAxMzQsIDEzOAorfTsKK3N0YXRpYyB1MzIgcmZfcmVnX3ByYW1fY181Z1s1XVtSRl9SRUdfTlVNX0ZPUl9DX0NVVF81R10gPSB7CisJezB4RTQzQkUsIDB4RkM2MzgsIDB4NzdDMEEsIDB4REU0NzEsIDB4ZDcxMTAsIDB4OEVCMDR9LAorCXsweEU0M0JFLCAweEZDMDc4LCAweEY3QzFBLCAweEUwQzcxLCAweEQ3NTUwLCAweEFFQjA0fSwKKwl7MHhFNDNCRiwgMHhGRjAzOCwgMHhGN0MwQSwgMHhERTQ3MSwgMHhFNTU1MCwgMHhBRUIwNH0sCisJezB4RTQzQkYsIDB4RkYwNzksIDB4RjdDMUEsIDB4REU0NzEsIDB4RTU1NTAsIDB4QUVCMDR9LAorCXsweEU0M0JGLCAweEZGMDM4LCAweEY3QzFBLCAweERFNDcxLCAweGQ3NTUwLCAweEFFQjA0fQorfTsKKworc3RhdGljIHUzMiByZl9yZWdfcGFyYW1fZm9yX2NfY3V0XzJnWzNdW1JGX1JFR19OVU1fRk9SX0NfQ1VUXzJHXSA9IHsKKwl7MHg2NDNCQywgMHhGQzAzOCwgMHg3N0MxQSwgMHg0MTI4OSwgMHgwMTg0MH0sCisJezB4NjQzQkMsIDB4RkMwMzgsIDB4MDdDMUEsIDB4NDEyODksIDB4MDE4NDB9LAorCXsweDI0M0JDLCAweEZDNDM4LCAweDA3QzFBLCAweDQxMjhCLCAweDBGQzQxfQorfTsKKworc3RhdGljIHUzMiByZl9zeW5fZzRfZm9yX2NfY3V0XzJnID0gMHhEMUMzMSAmIDB4N0ZGOworCitzdGF0aWMgdTMyIHJmX3ByYW1fY181Z19pbnRfcGFbM11bUkZfUkVHX05VTV9GT1JfQ19DVVRfNUdfSU5URVJOQUxQQV0gPSB7CisJezB4MDFhMDAsIDB4NDA0NDMsIDB4MDBlYjUsIDB4ODliZWMsIDB4OTRhMTIsIDB4OTRhMTIsIDB4OTRhMTJ9LAorCXsweDAxODAwLCAweGMwNDQzLCAweDAwNzMwLCAweDg5NmVlLCAweDk0YTUyLCAweDk0YTUyLCAweDk0YTUyfSwKKwl7MHgwMTgwMCwgMHhjMDQ0MywgMHgwMDczMCwgMHg4OTZlZSwgMHg5NGExMiwgMHg5NGExMiwgMHg5NGExMn0KK307CisKKy8qIFttb2RlXVtwYXRoYStiXVtyZWddICovCitzdGF0aWMgdTMyIHJmX2ltcl9wYXJhbV9ub3JtYWxbMV1bM11bTUFYX1JGX0lNUl9JTkRFWF9OT1JNQUxdID0geworCXsKKwkJLyogY2hhbm5lbCAxLTE0LiAqLworCQl7CisJCQkweDcwMDAwLCAweDAwZmYwLCAweDQ0MDBmLCAweDAwZmYwLCAweDAsIDB4MCwgMHgwLAorCQkJMHgwLCAweDAsIDB4NjQ4ODgsIDB4ZTI2NmMsIDB4MDAwOTAsIDB4MjJmZmYKKwkJfSwKKwkJLyogcGF0aCAzNi02NCAqLworCQl7CisJCQkweDcwMDAwLCAweDIyODgwLCAweDQ0NzBmLCAweDU1ODgwLCAweDAwMDcwLCAweDg4MDAwLAorCQkJMHgwLCAweDg4MDgwLCAweDcwMDAwLCAweDY0YTgyLCAweGU0NjZjLCAweDAwMDkwLAorCQkJMHgzMmM5YQorCQl9LAorCQkvKiAxMDAgLTE2NSAqLworCQl7CisJCQkweDcwMDAwLCAweDQ0ODgwLCAweDQ0NzdmLCAweDc3ODgwLCAweDAwMDcwLCAweDg4MDAwLAorCQkJMHgwLCAweDg4MGIwLCAweDAsIDB4NjRiODIsIDB4ZTQ2NmMsIDB4MDAwOTAsIDB4MzJjOWEKKwkJfQorCX0KK307CisKK3N0YXRpYyB1MzIgY3VydmVpbmRleF81Z1tUQVJHRVRfQ0hOTF9OVU1fNUddID0gezB9OworCitzdGF0aWMgdTMyIGN1cnZlaW5kZXhfMmdbVEFSR0VUX0NITkxfTlVNXzJHXSA9IHswfTsKKworc3RhdGljIHUzMiB0YXJnZXRjaG5sXzVnW1RBUkdFVF9DSE5MX05VTV81R10gPSB7CisJMjUxNDEsIDI1MTE2LCAyNTA5MSwgMjUwNjYsIDI1MDQxLAorCTI1MDE2LCAyNDk5MSwgMjQ5NjYsIDI0OTQxLCAyNDkxNywKKwkyNDg5MiwgMjQ4NjcsIDI0ODQzLCAyNDgxOCwgMjQ3OTQsCisJMjQ3NzAsIDI0NzY1LCAyNDcyMSwgMjQ2OTcsIDI0NjcyLAorCTI0NjQ4LCAyNDYyNCwgMjQ2MDAsIDI0NTc2LCAyNDU1MiwKKwkyNDUyOCwgMjQ1MDQsIDI0NDgwLCAyNDQ1NywgMjQ0MzMsCisJMjQ0MDksIDI0Mzg1LCAyNDM2MiwgMjQzMzgsIDI0MzE1LAorCTI0MjkxLCAyNDI2OCwgMjQyNDUsIDI0MjIxLCAyNDE5OCwKKwkyNDE3NSwgMjQxNTEsIDI0MTI4LCAyNDEwNSwgMjQwODIsCisJMjQwNTksIDI0MDM2LCAyNDAxMywgMjM5OTAsIDIzOTY3LAorCTIzOTQ1LCAyMzkyMiwgMjM4OTksIDIzODc2LCAyMzg1NCwKKwkyMzgzMSwgMjM4MDksIDIzNzg2LCAyMzc2NCwgMjM3NDEsCisJMjM3MTksIDIzNjk3LCAyMzY3NCwgMjM2NTIsIDIzNjMwLAorCTIzNjA4LCAyMzU4NiwgMjM1NjQsIDIzNTQxLCAyMzUxOSwKKwkyMzQ5OCwgMjM0NzYsIDIzNDU0LCAyMzQzMiwgMjM0MTAsCisJMjMzODgsIDIzMzY3LCAyMzM0NSwgMjMzMjMsIDIzMzAyLAorCTIzMjgwLCAyMzI1OSwgMjMyMzcsIDIzMjE2LCAyMzE5NCwKKwkyMzE3MywgMjMxNTIsIDIzMTMwLCAyMzEwOSwgMjMwODgsCisJMjMwNjcsIDIzMDQ2LCAyMzAyNSwgMjMwMDMsIDIyOTgyLAorCTIyOTYyLCAyMjk0MSwgMjI5MjAsIDIyODk5LCAyMjg3OCwKKwkyMjg1NywgMjI4MzcsIDIyODE2LCAyMjc5NSwgMjI3NzUsCisJMjI3NTQsIDIyNzMzLCAyMjcxMywgMjI2OTIsIDIyNjcyLAorCTIyNjUyLCAyMjYzMSwgMjI2MTEsIDIyNTkxLCAyMjU3MCwKKwkyMjU1MCwgMjI1MzAsIDIyNTEwLCAyMjQ5MCwgMjI0NjksCisJMjI0NDksIDIyNDI5LCAyMjQwOSwgMjIzOTAsIDIyMzcwLAorCTIyMzUwLCAyMjMzNiwgMjIzMTAsIDIyMjkwLCAyMjI3MSwKKwkyMjI1MSwgMjIyMzEsIDIyMjEyLCAyMjE5MiwgMjIxNzMsCisJMjIxNTMsIDIyMTM0LCAyMjExNCwgMjIwOTUsIDIyMDc1LAorCTIyMDU2LCAyMjAzNywgMjIwMTcsIDIxOTk4LCAyMTk3OSwKKwkyMTk2MCwgMjE5NDEsIDIxOTIxLCAyMTkwMiwgMjE4ODMsCisJMjE4NjQsIDIxODQ1LCAyMTgyNiwgMjE4MDcsIDIxNzg5LAorCTIxNzcwLCAyMTc1MSwgMjE3MzIsIDIxNzEzLCAyMTY5NSwKKwkyMTY3NiwgMjE2NTcsIDIxNjM5LCAyMTYyMCwgMjE2MDIsCisJMjE1ODMsIDIxNTY1LCAyMTU0NiwgMjE1MjgsIDIxNTA5LAorCTIxNDkxLCAyMTQ3MywgMjE0NTQsIDIxNDM2LCAyMTQxOCwKKwkyMTQwMCwgMjEzODEsIDIxMzYzLCAyMTM0NSwgMjEzMjcsCisJMjEzMDksIDIxMjkxLCAyMTI3MywgMjEyNTUsIDIxMjM3LAorCTIxMjE5LCAyMTIwMSwgMjExODMsIDIxMTY2LCAyMTE0OCwKKwkyMTEzMCwgMjExMTIsIDIxMDk1LCAyMTA3NywgMjEwNTksCisJMjEwNDIsIDIxMDI0LCAyMTAwNywgMjA5ODksIDIwOTcyLAorCTI1Njc5LCAyNTY1MywgMjU2MjcsIDI1NjAxLCAyNTU3NSwKKwkyNTU0OSwgMjU1MjMsIDI1NDk3LCAyNTQ3MSwgMjU0NDYsCisJMjU0MjAsIDI1Mzk0LCAyNTM2OSwgMjUzNDMsIDI1MzE4LAorCTI1MjkyLCAyNTI2NywgMjUyNDIsIDI1MjE2LCAyNTE5MSwKKwkyNTE2NgorfTsKKworLyogY2hhbm5lbCAxfjE0ICovCitzdGF0aWMgdTMyIHRhcmdldGNobmxfMmdbVEFSR0VUX0NITkxfTlVNXzJHXSA9IHsKKwkyNjA4NCwgMjYwMzAsIDI1OTc2LCAyNTkyMywgMjU4NjksIDI1ODE2LCAyNTc2NCwKKwkyNTcxMSwgMjU2NTgsIDI1NjA2LCAyNTU1NCwgMjU1MDIsIDI1NDUxLCAyNTMyOAorfTsKKworc3RhdGljIHUzMiBfcnRsOTJkX3BoeV9jYWxjdWxhdGVfYml0X3NoaWZ0KHUzMiBiaXRtYXNrKQoreworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8PSAzMTsgaSsrKSB7CisJCWlmICgoKGJpdG1hc2sgPj4gaSkgJiAweDEpID09IDEpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaTsKK30KKwordTMyIHJ0bDkyZF9waHlfcXVlcnlfYmJfcmVnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2spCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bHByaXYpOworCXUzMiByZXR1cm52YWx1ZSwgb3JpZ2luYWx2YWx1ZSwgYml0c2hpZnQ7CisJdTggZGJpX2RpcmVjdDsKKworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19UUkFDRSwgKCJyZWdhZGRyKCUjeCksICIKKwkJImJpdG1hc2soJSN4KVxuIiwgcmVnYWRkciwgYml0bWFzaykpOworCWlmIChydGxoYWwtPmR1cmluZ19tYWMxaW5pdF9yYWRpb2EgfHwgcnRsaGFsLT5kdXJpbmdfbWFjMGluaXRfcmFkaW9iKSB7CisJCS8qIG1hYzEgdXNlIHBoeTAgcmVhZCByYWRpb19iLiAqLworCQkvKiBtYWMwIHVzZSBwaHkxIHJlYWQgcmFkaW9fYi4gKi8KKwkJaWYgKHJ0bGhhbC0+ZHVyaW5nX21hYzFpbml0X3JhZGlvYSkKKwkJCWRiaV9kaXJlY3QgPSBCSVQoMyk7CisJCWVsc2UgaWYgKHJ0bGhhbC0+ZHVyaW5nX21hYzBpbml0X3JhZGlvYikKKwkJCWRiaV9kaXJlY3QgPSBCSVQoMykgfCBCSVQoMik7CisJCW9yaWdpbmFsdmFsdWUgPSBydGw5MmRlX3JlYWRfZHdvcmRfZGJpKGh3LCAodTE2KXJlZ2FkZHIsCisJCQlkYmlfZGlyZWN0KTsKKwl9IGVsc2UgeworCQlvcmlnaW5hbHZhbHVlID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgcmVnYWRkcik7CisJfQorCWJpdHNoaWZ0ID0gX3J0bDkyZF9waHlfY2FsY3VsYXRlX2JpdF9zaGlmdChiaXRtYXNrKTsKKwlyZXR1cm52YWx1ZSA9IChvcmlnaW5hbHZhbHVlICYgYml0bWFzaykgPj4gYml0c2hpZnQ7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX1RSQUNFLCAoIkJCUiBNQVNLPTB4JXggIgorCQkiQWRkclsweCV4XT0weCV4XG4iLCBiaXRtYXNrLCByZWdhZGRyLCBvcmlnaW5hbHZhbHVlKSk7CisJcmV0dXJuIHJldHVybnZhbHVlOworfQorCit2b2lkIHJ0bDkyZF9waHlfc2V0X2JiX3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzaywgdTMyIGRhdGEpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bHByaXYpOworCXU4IGRiaV9kaXJlY3QgPSAwOworCXUzMiBvcmlnaW5hbHZhbHVlLCBiaXRzaGlmdDsKKworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19UUkFDRSwgKCJyZWdhZGRyKCUjeCksIGJpdG1hc2soJSN4KSwiCisJCSIgZGF0YSglI3gpXG4iLCByZWdhZGRyLCBiaXRtYXNrLCBkYXRhKSk7CisJaWYgKHJ0bGhhbC0+ZHVyaW5nX21hYzFpbml0X3JhZGlvYSkKKwkJZGJpX2RpcmVjdCA9IEJJVCgzKTsKKwllbHNlIGlmIChydGxoYWwtPmR1cmluZ19tYWMwaW5pdF9yYWRpb2IpCisJCS8qIG1hYzAgdXNlIHBoeTEgd3JpdGUgcmFkaW9fYi4gKi8KKwkJZGJpX2RpcmVjdCA9IEJJVCgzKSB8IEJJVCgyKTsKKwlpZiAoYml0bWFzayAhPSBCTUFTS0RXT1JEKSB7CisJCWlmIChydGxoYWwtPmR1cmluZ19tYWMxaW5pdF9yYWRpb2EgfHwKKwkJICAgIHJ0bGhhbC0+ZHVyaW5nX21hYzBpbml0X3JhZGlvYikKKwkJCW9yaWdpbmFsdmFsdWUgPSBydGw5MmRlX3JlYWRfZHdvcmRfZGJpKGh3LAorCQkJCQkodTE2KSByZWdhZGRyLAorCQkJCQlkYmlfZGlyZWN0KTsKKwkJZWxzZQorCQkJb3JpZ2luYWx2YWx1ZSA9IHJ0bF9yZWFkX2R3b3JkKHJ0bHByaXYsIHJlZ2FkZHIpOworCQliaXRzaGlmdCA9IF9ydGw5MmRfcGh5X2NhbGN1bGF0ZV9iaXRfc2hpZnQoYml0bWFzayk7CisJCWRhdGEgPSAoKG9yaWdpbmFsdmFsdWUgJiAofmJpdG1hc2spKSB8IChkYXRhIDw8IGJpdHNoaWZ0KSk7CisJfQorCWlmIChydGxoYWwtPmR1cmluZ19tYWMxaW5pdF9yYWRpb2EgfHwgcnRsaGFsLT5kdXJpbmdfbWFjMGluaXRfcmFkaW9iKQorCQlydGw5MmRlX3dyaXRlX2R3b3JkX2RiaShodywgKHUxNikgcmVnYWRkciwgZGF0YSwgZGJpX2RpcmVjdCk7CisJZWxzZQorCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgcmVnYWRkciwgZGF0YSk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX1RSQUNFLCAoInJlZ2FkZHIoJSN4KSwgYml0bWFzayglI3gpLCIKKwkJICIgZGF0YSglI3gpXG4iLCByZWdhZGRyLCBiaXRtYXNrLCBkYXRhKSk7Cit9CisKK3N0YXRpYyB1MzIgX3J0bDkyZF9waHlfcmZfc2VyaWFsX3JlYWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgZW51bSByYWRpb19wYXRoIHJmcGF0aCwgdTMyIG9mZnNldCkKK3sKKworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBiYl9yZWdfZGVmICpwcGh5cmVnID0gJnJ0bHBoeS0+cGh5cmVnX2RlZltyZnBhdGhdOworCXUzMiBuZXdvZmZzZXQ7CisJdTMyIHRtcGxvbmcsIHRtcGxvbmcyOworCXU4IHJmcGlfZW5hYmxlID0gMDsKKwl1MzIgcmV0dmFsdWU7CisKKwluZXdvZmZzZXQgPSBvZmZzZXQ7CisJdG1wbG9uZyA9IHJ0bF9nZXRfYmJyZWcoaHcsIFJGUEdBMF9YQV9IU1NJUEFSQU1FVEVSMiwgQk1BU0tEV09SRCk7CisJaWYgKHJmcGF0aCA9PSBSRjkwX1BBVEhfQSkKKwkJdG1wbG9uZzIgPSB0bXBsb25nOworCWVsc2UKKwkJdG1wbG9uZzIgPSBydGxfZ2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmhzc2lfcGFyYTIsIEJNQVNLRFdPUkQpOworCXRtcGxvbmcyID0gKHRtcGxvbmcyICYgKH5CTFNTSVJFQURBRERSRVNTKSkgfAorCQkobmV3b2Zmc2V0IDw8IDIzKSB8IEJMU1NJUkVBREVER0U7CisJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBX0hTU0lQQVJBTUVURVIyLCBCTUFTS0RXT1JELAorCQl0bXBsb25nICYgKH5CTFNTSVJFQURFREdFKSk7CisJdWRlbGF5KDEwKTsKKwlydGxfc2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmhzc2lfcGFyYTIsIEJNQVNLRFdPUkQsIHRtcGxvbmcyKTsKKwl1ZGVsYXkoNTApOworCXVkZWxheSg1MCk7CisJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBX0hTU0lQQVJBTUVURVIyLCBCTUFTS0RXT1JELAorCQl0bXBsb25nIHwgQkxTU0lSRUFERURHRSk7CisJdWRlbGF5KDEwKTsKKwlpZiAocmZwYXRoID09IFJGOTBfUEFUSF9BKQorCQlyZnBpX2VuYWJsZSA9ICh1OCkgcnRsX2dldF9iYnJlZyhodywgUkZQR0EwX1hBX0hTU0lQQVJBTUVURVIxLAorCQkJICAgICAgQklUKDgpKTsKKwllbHNlIGlmIChyZnBhdGggPT0gUkY5MF9QQVRIX0IpCisJCXJmcGlfZW5hYmxlID0gKHU4KSBydGxfZ2V0X2JicmVnKGh3LCBSRlBHQTBfWEJfSFNTSVBBUkFNRVRFUjEsCisJCQkgICAgICBCSVQoOCkpOworCWlmIChyZnBpX2VuYWJsZSkKKwkJcmV0dmFsdWUgPSBydGxfZ2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmxzc2lfcmVhZGJhY2twaSwKKwkJCUJMU1NJUkVBREJBQ0tEQVRBKTsKKwllbHNlCisJCXJldHZhbHVlID0gcnRsX2dldF9iYnJlZyhodywgcHBoeXJlZy0+cmZsc3NpX3JlYWRiYWNrLAorCQkJQkxTU0lSRUFEQkFDS0RBVEEpOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19UUkFDRSwgKCJSRlItJWQgQWRkclsweCV4XSA9IDB4JXhcbiIsCisJCSByZnBhdGgsIHBwaHlyZWctPnJmbHNzaV9yZWFkYmFjaywgcmV0dmFsdWUpKTsKKwlyZXR1cm4gcmV0dmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X3JmX3NlcmlhbF93cml0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJZW51bSByYWRpb19wYXRoIHJmcGF0aCwKKwkJCQkJdTMyIG9mZnNldCwgdTMyIGRhdGEpCit7CisJdTMyIGRhdGFfYW5kX2FkZHI7CisJdTMyIG5ld29mZnNldDsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgYmJfcmVnX2RlZiAqcHBoeXJlZyA9ICZydGxwaHktPnBoeXJlZ19kZWZbcmZwYXRoXTsKKworCW5ld29mZnNldCA9IG9mZnNldDsKKwkvKiBUNjUgUkYgKi8KKwlkYXRhX2FuZF9hZGRyID0gKChuZXdvZmZzZXQgPDwgMjApIHwgKGRhdGEgJiAweDAwMGZmZmZmKSkgJiAweDBmZmZmZmZmOworCXJ0bF9zZXRfYmJyZWcoaHcsIHBwaHlyZWctPnJmM3dpcmVfb2Zmc2V0LCBCTUFTS0RXT1JELCBkYXRhX2FuZF9hZGRyKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX1JGLCBEQkdfVFJBQ0UsICgiUkZXLSVkIEFkZHJbMHgleF09MHgleFxuIiwKKwkJcmZwYXRoLCBwcGh5cmVnLT5yZjN3aXJlX29mZnNldCwgZGF0YV9hbmRfYWRkcikpOworfQorCit1MzIgcnRsOTJkX3BoeV9xdWVyeV9yZl9yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgZW51bSByYWRpb19wYXRoIHJmcGF0aCwgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgb3JpZ2luYWxfdmFsdWUsIHJlYWRiYWNrX3ZhbHVlLCBiaXRzaGlmdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX1RSQUNFLCAoInJlZ2FkZHIoJSN4KSwgIgorCQkicmZwYXRoKCUjeCksIGJpdG1hc2soJSN4KVxuIiwKKwkJcmVnYWRkciwgcmZwYXRoLCBiaXRtYXNrKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLnJmX2xvY2ssIGZsYWdzKTsKKwlvcmlnaW5hbF92YWx1ZSA9IF9ydGw5MmRfcGh5X3JmX3NlcmlhbF9yZWFkKGh3LCByZnBhdGgsIHJlZ2FkZHIpOworCWJpdHNoaWZ0ID0gX3J0bDkyZF9waHlfY2FsY3VsYXRlX2JpdF9zaGlmdChiaXRtYXNrKTsKKwlyZWFkYmFja192YWx1ZSA9IChvcmlnaW5hbF92YWx1ZSAmIGJpdG1hc2spID4+IGJpdHNoaWZ0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLnJmX2xvY2ssIGZsYWdzKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX1JGLCBEQkdfVFJBQ0UsICgicmVnYWRkciglI3gpLCByZnBhdGgoJSN4KSwgIgorCQkiYml0bWFzayglI3gpLCBvcmlnaW5hbF92YWx1ZSglI3gpXG4iLAorCQlyZWdhZGRyLCByZnBhdGgsIGJpdG1hc2ssIG9yaWdpbmFsX3ZhbHVlKSk7CisJcmV0dXJuIHJlYWRiYWNrX3ZhbHVlOworfQorCit2b2lkIHJ0bDkyZF9waHlfc2V0X3JmX3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSByYWRpb19wYXRoIHJmcGF0aCwKKwl1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssIHUzMiBkYXRhKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXUzMiBvcmlnaW5hbF92YWx1ZSwgYml0c2hpZnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19UUkFDRSwKKwkJKCJyZWdhZGRyKCUjeCksIGJpdG1hc2soJSN4KSwgZGF0YSglI3gpLCByZnBhdGgoJSN4KVxuIiwKKwkJcmVnYWRkciwgYml0bWFzaywgZGF0YSwgcmZwYXRoKSk7CisJaWYgKGJpdG1hc2sgPT0gMCkKKwkJcmV0dXJuOworCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5yZl9sb2NrLCBmbGFncyk7CisJaWYgKHJ0bHBoeS0+cmZfbW9kZSAhPSBSRl9PUF9CWV9GVykgeworCQlpZiAoYml0bWFzayAhPSBCUkZSRUdPRkZTRVRNQVNLKSB7CisJCQlvcmlnaW5hbF92YWx1ZSA9IF9ydGw5MmRfcGh5X3JmX3NlcmlhbF9yZWFkKGh3LAorCQkJCXJmcGF0aCwgcmVnYWRkcik7CisJCQliaXRzaGlmdCA9IF9ydGw5MmRfcGh5X2NhbGN1bGF0ZV9iaXRfc2hpZnQoYml0bWFzayk7CisJCQlkYXRhID0gKChvcmlnaW5hbF92YWx1ZSAmICh+Yml0bWFzaykpIHwKKwkJCQkoZGF0YSA8PCBiaXRzaGlmdCkpOworCQl9CisJCV9ydGw5MmRfcGh5X3JmX3NlcmlhbF93cml0ZShodywgcmZwYXRoLCByZWdhZGRyLCBkYXRhKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MucmZfbG9jaywgZmxhZ3MpOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19UUkFDRSwgKCJyZWdhZGRyKCUjeCksICIKKwkJImJpdG1hc2soJSN4KSwgZGF0YSglI3gpLCByZnBhdGgoJSN4KVxuIiwKKwkJcmVnYWRkciwgYml0bWFzaywgZGF0YSwgcmZwYXRoKSk7Cit9CisKK2Jvb2wgcnRsOTJkX3BoeV9tYWNfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgaTsKKwl1MzIgYXJyYXlsZW5ndGg7CisJdTMyICpwdHJhcnJheTsKKworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLCAoIlJlYWQgUnRsODE5WE1BQ1BIWV9BcnJheVxuIikpOworCWFycmF5bGVuZ3RoID0gTUFDXzJUX0FSUkFZTEVOR1RIOworCXB0cmFycmF5ID0gcnRsODE5MmRlX21hY18ydGFycmF5OworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLCAoIkltZzpSdGw4MTlYTUFDX0FycmF5XG4iKSk7CisJZm9yIChpID0gMDsgaSA8IGFycmF5bGVuZ3RoOyBpID0gaSArIDIpCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIHB0cmFycmF5W2ldLCAodTgpIHB0cmFycmF5W2kgKyAxXSk7CisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5tYWNwaHltb2RlID09IFNJTkdMRU1BQ19TSU5HTEVQSFkpIHsKKwkJLyogaW1wcm92ZSAyLXN0cmVhbSBUWCBFVk0gKi8KKwkJLyogcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHgxNCwweDcxKTsgKi8KKwkJLyogQU1QRFUgYWdncmVnYXRpb24gbnVtYmVyIDkgKi8KKwkJLyogcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX01BWF9BR0dSX05VTSwgTUFYX0FHR1JfTlVNKTsgKi8KKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX01BWF9BR0dSX05VTSwgMHgwQik7CisJfSBlbHNlIHsKKwkJLyogOTJEIG5lZWQgdG8gdGVzdCB0byBkZWNpZGUgdGhlIG51bS4gKi8KKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX01BWF9BR0dSX05VTSwgMHgwNyk7CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkX3BoeV9pbml0X2JiX3JmX3JlZ2lzdGVyX2RlZmluaXRpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisKKwkvKiBSRiBJbnRlcmZhY2UgU293cnR3YXJlIENvbnRyb2wgKi8KKwkvKiAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NzAgKi8KKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0FdLnJmaW50ZnMgPSBSRlBHQTBfWEFCX1JGSU5URVJGQUNFU1c7CisJLyogMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODcwICgxNi1iaXQgZm9yIDB4ODcyKSAqLworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQl0ucmZpbnRmcyA9IFJGUEdBMF9YQUJfUkZJTlRFUkZBQ0VTVzsKKwkvKiAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NzQgKi8KKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0NdLnJmaW50ZnMgPSBSRlBHQTBfWENEX1JGSU5URVJGQUNFU1c7CisJLyogMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODc0ICgxNi1iaXQgZm9yIDB4ODc2KSAqLworCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9EXS5yZmludGZzID0gUkZQR0EwX1hDRF9SRklOVEVSRkFDRVNXOworCS8qIFJGIEludGVyZmFjZSBSZWFkYmFjayBWYWx1ZSAqLworCS8qIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDhFMCAqLworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQV0ucmZpbnRmaSA9IFJGUEdBMF9YQUJfUkZJTlRFUkZBQ0VSQjsKKwkvKiAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4RTAgKDE2LWJpdCBmb3IgMHg4RTIpICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9CXS5yZmludGZpID0gUkZQR0EwX1hBQl9SRklOVEVSRkFDRVJCOworCS8qIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDhFNCAqLworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQ10ucmZpbnRmaSA9IFJGUEdBMF9YQ0RfUkZJTlRFUkZBQ0VSQjsKKwkvKiAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4RTQgKDE2LWJpdCBmb3IgMHg4RTYpICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9EXS5yZmludGZpID0gUkZQR0EwX1hDRF9SRklOVEVSRkFDRVJCOworCisJLyogUkYgSW50ZXJmYWNlIE91dHB1dCAoYW5kIEVuYWJsZSkgKi8KKwkvKiAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjAgKi8KKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0FdLnJmaW50Zm8gPSBSRlBHQTBfWEFfUkZJTlRFUkZBQ0VPRTsKKwkvKiAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjQgKi8KKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0JdLnJmaW50Zm8gPSBSRlBHQTBfWEJfUkZJTlRFUkZBQ0VPRTsKKworCS8qIFJGIEludGVyZmFjZSAoT3V0cHV0IGFuZCkgIEVuYWJsZSAqLworCS8qIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2MCAoMTYtYml0IGZvciAweDg2MikgKi8KKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0FdLnJmaW50ZmUgPSBSRlBHQTBfWEFfUkZJTlRFUkZBQ0VPRTsKKwkvKiAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjQgKDE2LWJpdCBmb3IgMHg4NjYpICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9CXS5yZmludGZlID0gUkZQR0EwX1hCX1JGSU5URVJGQUNFT0U7CisKKwkvKiBBZGRyIG9mIExTU0kuIFdpcnRlIFJGIHJlZ2lzdGVyIGJ5IGRyaXZlciAqLworCS8qIExTU0kgUGFyYW1ldGVyICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9BXS5yZjN3aXJlX29mZnNldCA9CisJCQkJIFJGUEdBMF9YQV9MU1NJUEFSQU1FVEVSOworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQl0ucmYzd2lyZV9vZmZzZXQgPQorCQkJCSBSRlBHQTBfWEJfTFNTSVBBUkFNRVRFUjsKKworCS8qIFJGIHBhcmFtZXRlciAqLworCS8qIEJCIEJhbmQgU2VsZWN0ICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9BXS5yZmxzc2lfc2VsZWN0ID0gUkZQR0EwX1hBQl9SRlBBUkFNRVRFUjsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0JdLnJmbHNzaV9zZWxlY3QgPSBSRlBHQTBfWEFCX1JGUEFSQU1FVEVSOworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQ10ucmZsc3NpX3NlbGVjdCA9IFJGUEdBMF9YQ0RfUkZQQVJBTUVURVI7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9EXS5yZmxzc2lfc2VsZWN0ID0gUkZQR0EwX1hDRF9SRlBBUkFNRVRFUjsKKworCS8qIFR4IEFHQyBHYWluIFN0YWdlIChzYW1lIGZvciBhbGwgcGF0aC4gU2hvdWxkIHdlIHJlbW92ZSB0aGlzPykgKi8KKwkvKiBUeCBnYWluIHN0YWdlICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9BXS5yZnR4Z2Fpbl9zdGFnZSA9IFJGUEdBMF9UWEdBSU5TVEFHRTsKKwkvKiBUeCBnYWluIHN0YWdlICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9CXS5yZnR4Z2Fpbl9zdGFnZSA9IFJGUEdBMF9UWEdBSU5TVEFHRTsKKwkvKiBUeCBnYWluIHN0YWdlICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9DXS5yZnR4Z2Fpbl9zdGFnZSA9IFJGUEdBMF9UWEdBSU5TVEFHRTsKKwkvKiBUeCBnYWluIHN0YWdlICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9EXS5yZnR4Z2Fpbl9zdGFnZSA9IFJGUEdBMF9UWEdBSU5TVEFHRTsKKworCS8qIFRyYW5jZWl2ZXIgQX5EIEhTU0kgUGFyYW1ldGVyLTEgKi8KKwkvKiB3aXJlIGNvbnRyb2wgcGFyYW1ldGVyMSAqLworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQV0ucmZoc3NpX3BhcmExID0gUkZQR0EwX1hBX0hTU0lQQVJBTUVURVIxOworCS8qIHdpcmUgY29udHJvbCBwYXJhbWV0ZXIxICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9CXS5yZmhzc2lfcGFyYTEgPSBSRlBHQTBfWEJfSFNTSVBBUkFNRVRFUjE7CisKKwkvKiBUcmFuY2VpdmVyIEF+RCBIU1NJIFBhcmFtZXRlci0yICovCisJLyogd2lyZSBjb250cm9sIHBhcmFtZXRlcjIgKi8KKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0FdLnJmaHNzaV9wYXJhMiA9IFJGUEdBMF9YQV9IU1NJUEFSQU1FVEVSMjsKKwkvKiB3aXJlIGNvbnRyb2wgcGFyYW1ldGVyMiAqLworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQl0ucmZoc3NpX3BhcmEyID0gUkZQR0EwX1hCX0hTU0lQQVJBTUVURVIyOworCisJLyogUkYgc3dpdGNoIENvbnRyb2wgKi8KKwkvKiBUUi9BbnQgc3dpdGNoIGNvbnRyb2wgKi8KKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0FdLnJmc3dpdGNoX2NvbnRyb2wgPQorCQlSRlBHQTBfWEFCX1NXSVRDSENPTlRST0w7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9CXS5yZnN3aXRjaF9jb250cm9sID0KKwkgICAgUkZQR0EwX1hBQl9TV0lUQ0hDT05UUk9MOworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQ10ucmZzd2l0Y2hfY29udHJvbCA9CisJICAgIFJGUEdBMF9YQ0RfU1dJVENIQ09OVFJPTDsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0RdLnJmc3dpdGNoX2NvbnRyb2wgPQorCSAgICBSRlBHQTBfWENEX1NXSVRDSENPTlRST0w7CisKKwkvKiBBR0MgY29udHJvbCAxICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9BXS5yZmFnY19jb250cm9sMSA9IFJPRkRNMF9YQUFHQ0NPUkUxOworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQl0ucmZhZ2NfY29udHJvbDEgPSBST0ZETTBfWEJBR0NDT1JFMTsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0NdLnJmYWdjX2NvbnRyb2wxID0gUk9GRE0wX1hDQUdDQ09SRTE7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9EXS5yZmFnY19jb250cm9sMSA9IFJPRkRNMF9YREFHQ0NPUkUxOworCisJLyogQUdDIGNvbnRyb2wgMiAgKi8KKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0FdLnJmYWdjX2NvbnRyb2wyID0gUk9GRE0wX1hBQUdDQ09SRTI7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9CXS5yZmFnY19jb250cm9sMiA9IFJPRkRNMF9YQkFHQ0NPUkUyOworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQ10ucmZhZ2NfY29udHJvbDIgPSBST0ZETTBfWENBR0NDT1JFMjsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0RdLnJmYWdjX2NvbnRyb2wyID0gUk9GRE0wX1hEQUdDQ09SRTI7CisKKwkvKiBSWCBBRkUgY29udHJvbCAxICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9BXS5yZnJ4aXFfaW1iYWxhbmNlID0KKwkgICAgUk9GRE0wX1hBUlhJUUlNQkFMQU5DRTsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0JdLnJmcnhpcV9pbWJhbGFuY2UgPQorCSAgICBST0ZETTBfWEJSWElRSU1CQUxBTkNFOworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQ10ucmZyeGlxX2ltYmFsYW5jZSA9CisJICAgIFJPRkRNMF9YQ1JYSVFJTUJBTEFOQ0U7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9EXS5yZnJ4aXFfaW1iYWxhbmNlID0KKwkgICAgUk9GRE0wX1hEUlhJUUlNQkFMQU5DRTsKKworCS8qUlggQUZFIGNvbnRyb2wgMSAqLworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQV0ucmZyeF9hZmUgPSBST0ZETTBfWEFSWEFGRTsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0JdLnJmcnhfYWZlID0gUk9GRE0wX1hCUlhBRkU7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9DXS5yZnJ4X2FmZSA9IFJPRkRNMF9YQ1JYQUZFOworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfRF0ucmZyeF9hZmUgPSBST0ZETTBfWERSWEFGRTsKKworCS8qIFR4IEFGRSBjb250cm9sIDEgKi8KKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0FdLnJmdHhpcV9pbWJhbGFuY2UgPQorCSAgICBST0ZETTBfWEFUeElRSU1CQUxBTkNFOworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQl0ucmZ0eGlxX2ltYmFsYW5jZSA9CisJICAgIFJPRkRNMF9YQlR4SVFJTUJBTEFOQ0U7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9DXS5yZnR4aXFfaW1iYWxhbmNlID0KKwkgICAgUk9GRE0wX1hDVHhJUUlNQkFMQU5DRTsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0RdLnJmdHhpcV9pbWJhbGFuY2UgPQorCSAgICBST0ZETTBfWERUeElRSU1CQUxBTkNFOworCisJLyogVHggQUZFIGNvbnRyb2wgMiAqLworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQV0ucmZ0eF9hZmUgPSBST0ZETTBfWEFUeEFGRTsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0JdLnJmdHhfYWZlID0gUk9GRE0wX1hCVHhBRkU7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9DXS5yZnR4X2FmZSA9IFJPRkRNMF9YQ1R4QUZFOworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfRF0ucmZ0eF9hZmUgPSBST0ZETTBfWERUeEFGRTsKKworCS8qIFRyYW5jZWl2ZXIgTFNTSSBSZWFkYmFjayBTSSBtb2RlICovCisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9BXS5yZmxzc2lfcmVhZGJhY2sgPQorCSAgICBSRlBHQTBfWEFfTFNTSVJFQURCQUNLOworCXJ0bHBoeS0+cGh5cmVnX2RlZltSRjkwX1BBVEhfQl0ucmZsc3NpX3JlYWRiYWNrID0KKwkgICAgUkZQR0EwX1hCX0xTU0lSRUFEQkFDSzsKKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0NdLnJmbHNzaV9yZWFkYmFjayA9CisJICAgIFJGUEdBMF9YQ19MU1NJUkVBREJBQ0s7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9EXS5yZmxzc2lfcmVhZGJhY2sgPQorCSAgICBSRlBHQTBfWERfTFNTSVJFQURCQUNLOworCisJLyogVHJhbmNlaXZlciBMU1NJIFJlYWRiYWNrIFBJIG1vZGUgKi8KKwlydGxwaHktPnBoeXJlZ19kZWZbUkY5MF9QQVRIX0FdLnJmbHNzaV9yZWFkYmFja3BpID0KKwkgICAgVFJBTlNDRUlWRVJBX0hTUElfUkVBREJBQ0s7CisJcnRscGh5LT5waHlyZWdfZGVmW1JGOTBfUEFUSF9CXS5yZmxzc2lfcmVhZGJhY2twaSA9CisJICAgIFRSQU5TQ0VJVkVSQl9IU1BJX1JFQURCQUNLOworfQorCitzdGF0aWMgYm9vbCBfcnRsOTJkX3BoeV9jb25maWdfYmJfd2l0aF9oZWFkZXJmaWxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCXU4IGNvbmZpZ3R5cGUpCit7CisJaW50IGk7CisJdTMyICpwaHlfcmVnYXJyYXlfdGFibGU7CisJdTMyICphZ2N0YWJfYXJyYXlfdGFibGUgPSBOVUxMOworCXUzMiAqYWdjdGFiXzVnYXJyYXlfdGFibGU7CisJdTE2IHBoeV9yZWdfYXJyYXlsZW4sIGFnY3RhYl9hcnJheWxlbiA9IDAsIGFnY3RhYl81Z2FycmF5bGVuOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCisJLyogTm9ybWFsIGNoaXAsTWFjMCB1c2UgQUdDX1RBQi50eHQgZm9yIDJHIGFuZCA1RyBiYW5kLiAqLworCWlmIChydGxoYWwtPmludGVyZmFjZWluZGV4ID09IDApIHsKKwkJYWdjdGFiX2FycmF5bGVuID0gQUdDVEFCX0FSUkFZTEVOR1RIOworCQlhZ2N0YWJfYXJyYXlfdGFibGUgPSBydGw4MTkyZGVfYWdjdGFiX2FycmF5OworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELAorCQkJICgiID09PT4gcGh5Ok1BQzAsIFJ0bDgxOVhBR0NUQUJfQXJyYXlcbiIpKTsKKwl9IGVsc2UgeworCQlpZiAocnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fMl80RykgeworCQkJYWdjdGFiX2FycmF5bGVuID0gQUdDVEFCXzJHX0FSUkFZTEVOR1RIOworCQkJYWdjdGFiX2FycmF5X3RhYmxlID0gcnRsODE5MmRlX2FnY3RhYl8yZ2FycmF5OworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCQkgKCIgPT09PiBwaHk6TUFDMSwgUnRsODE5WEFHQ1RBQl8yR0FycmF5XG4iKSk7CisJCX0gZWxzZSB7CisJCQlhZ2N0YWJfNWdhcnJheWxlbiA9IEFHQ1RBQl81R19BUlJBWUxFTkdUSDsKKwkJCWFnY3RhYl81Z2FycmF5X3RhYmxlID0gcnRsODE5MmRlX2FnY3RhYl81Z2FycmF5OworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCQkgKCIgPT09PiBwaHk6TUFDMSwgUnRsODE5WEFHQ1RBQl81R0FycmF5XG4iKSk7CisKKwkJfQorCX0KKwlwaHlfcmVnX2FycmF5bGVuID0gUEhZX1JFR18yVF9BUlJBWUxFTkdUSDsKKwlwaHlfcmVnYXJyYXlfdGFibGUgPSBydGw4MTkyZGVfcGh5X3JlZ18ydGFycmF5OworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsCisJCSAoIiA9PT0+IHBoeTpSdGw4MTlYUEhZX1JFR19BcnJheV9QR1xuIikpOworCWlmIChjb25maWd0eXBlID09IEJBU0VCQU5EX0NPTkZJR19QSFlfUkVHKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwaHlfcmVnX2FycmF5bGVuOyBpID0gaSArIDIpIHsKKwkJCWlmIChwaHlfcmVnYXJyYXlfdGFibGVbaV0gPT0gMHhmZSkKKwkJCQltZGVsYXkoNTApOworCQkJZWxzZSBpZiAocGh5X3JlZ2FycmF5X3RhYmxlW2ldID09IDB4ZmQpCisJCQkJbWRlbGF5KDUpOworCQkJZWxzZSBpZiAocGh5X3JlZ2FycmF5X3RhYmxlW2ldID09IDB4ZmMpCisJCQkJbWRlbGF5KDEpOworCQkJZWxzZSBpZiAocGh5X3JlZ2FycmF5X3RhYmxlW2ldID09IDB4ZmIpCisJCQkJdWRlbGF5KDUwKTsKKwkJCWVsc2UgaWYgKHBoeV9yZWdhcnJheV90YWJsZVtpXSA9PSAweGZhKQorCQkJCXVkZWxheSg1KTsKKwkJCWVsc2UgaWYgKHBoeV9yZWdhcnJheV90YWJsZVtpXSA9PSAweGY5KQorCQkJCXVkZWxheSgxKTsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIHBoeV9yZWdhcnJheV90YWJsZVtpXSwgQk1BU0tEV09SRCwKKwkJCQkgICAgICBwaHlfcmVnYXJyYXlfdGFibGVbaSArIDFdKTsKKwkJCXVkZWxheSgxKTsKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLAorCQkJCSAoIlRoZSBwaHlfcmVnYXJyYXlfdGFibGVbMF0gaXMgJXgiCisJCQkJICAiIFJ0bDgxOVhQSFlfUkVHQXJyYXlbMV0gaXMgJXhcbiIsCisJCQkJICBwaHlfcmVnYXJyYXlfdGFibGVbaV0sCisJCQkJICBwaHlfcmVnYXJyYXlfdGFibGVbaSArIDFdKSk7CisJCX0KKwl9IGVsc2UgaWYgKGNvbmZpZ3R5cGUgPT0gQkFTRUJBTkRfQ09ORklHX0FHQ19UQUIpIHsKKwkJaWYgKHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPT0gMCkgeworCQkJZm9yIChpID0gMDsgaSA8IGFnY3RhYl9hcnJheWxlbjsgaSA9IGkgKyAyKSB7CisJCQkJcnRsX3NldF9iYnJlZyhodywgYWdjdGFiX2FycmF5X3RhYmxlW2ldLAorCQkJCQlCTUFTS0RXT1JELAorCQkJCQlhZ2N0YWJfYXJyYXlfdGFibGVbaSArIDFdKTsKKwkJCQkvKiBBZGQgMXVzIGRlbGF5IGJldHdlZW4gQkIvUkYgcmVnaXN0ZXIKKwkJCQkgKiBzZXR0aW5nLiAqLworCQkJCXVkZWxheSgxKTsKKwkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJCQkJICgiVGhlIFJ0bDgxOVhBR0NUQUJfQXJyYXlfIgorCQkJCQkgIlRhYmxlWzBdIGlzICV1bCAiCisJCQkJCSAiUnRsODE5WFBIWV9SRUdBcnJheVsxXSBpcyAldWxcbiIsCisJCQkJCSBhZ2N0YWJfYXJyYXlfdGFibGVbaV0sCisJCQkJCSBhZ2N0YWJfYXJyYXlfdGFibGVbaSArIDFdKSk7CisJCQl9CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELAorCQkJCSAoIk5vcm1hbCBDaGlwLCBNQUMwLCBsb2FkICIKKwkJCQkgIlJ0bDgxOVhBR0NUQUJfQXJyYXlcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCQkJZm9yIChpID0gMDsgaSA8IGFnY3RhYl9hcnJheWxlbjsgaSA9IGkgKyAyKSB7CisJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsIGFnY3RhYl9hcnJheV90YWJsZVtpXSwKKwkJCQkJCUJNQVNLRFdPUkQsCisJCQkJCQlhZ2N0YWJfYXJyYXlfdGFibGVbaSArIDFdKTsKKwkJCQkJLyogQWRkIDF1cyBkZWxheSBiZXR3ZWVuIEJCL1JGIHJlZ2lzdGVyCisJCQkJCSAqIHNldHRpbmcuICovCisJCQkJCXVkZWxheSgxKTsKKwkJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkJCQkgKCJUaGUgUnRsODE5WEFHQ1RBQl9BcnJheV8iCisJCQkJCQkgIlRhYmxlWzBdIGlzICV1bCBSdGw4MTlYUEhZXyIKKwkJCQkJCSAiUkVHQXJyYXlbMV0gaXMgJXVsXG4iLAorCQkJCQkJIGFnY3RhYl9hcnJheV90YWJsZVtpXSwKKwkJCQkJCSBhZ2N0YWJfYXJyYXlfdGFibGVbaSArIDFdKSk7CisJCQkJfQorCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkJCSAoIkxvYWQgUnRsODE5WEFHQ1RBQl8yR0FycmF5XG4iKSk7CisJCQl9IGVsc2UgeworCQkJCWZvciAoaSA9IDA7IGkgPCBhZ2N0YWJfNWdhcnJheWxlbjsgaSA9IGkgKyAyKSB7CisJCQkJCXJ0bF9zZXRfYmJyZWcoaHcsCisJCQkJCQlhZ2N0YWJfNWdhcnJheV90YWJsZVtpXSwKKwkJCQkJCUJNQVNLRFdPUkQsCisJCQkJCQlhZ2N0YWJfNWdhcnJheV90YWJsZVtpICsgMV0pOworCQkJCQkvKiBBZGQgMXVzIGRlbGF5IGJldHdlZW4gQkIvUkYgcmVnaXN0ZXJpCisJCQkJCSAqIHNldHRpbmcuICovCisJCQkJCXVkZWxheSgxKTsKKwkJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkJCQkgKCJUaGUgUnRsODE5WEFHQ1RBQl81R0FycmF5XyIKKwkJCQkJCSAiVGFibGVbMF0gaXMgJXVsIFJ0bDgxOVhQSFlfIgorCQkJCQkJICJSRUdBcnJheVsxXSBpcyAldWxcbiIsCisJCQkJCQkgYWdjdGFiXzVnYXJyYXlfdGFibGVbaV0sCisJCQkJCQkgYWdjdGFiXzVnYXJyYXlfdGFibGVbaSArIDFdKSk7CisJCQkJfQorCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkJCSgiTG9hZCBSdGw4MTlYQUdDVEFCXzVHQXJyYXlcbiIpKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF9zdG9yZV9wd3JpbmRleF9kaWZmcmF0ZV9vZmZzZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkgICB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssCisJCQkJCQkgICB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKworCWlmIChyZWdhZGRyID09IFJUWEFHQ19BX1JBVEUxOF8wNikgeworCQlydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXRbcnRscGh5LT5wd3Jncm91cF9jbnRdWzBdID0KKwkJCQkJCQkJCSBkYXRhOworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJCSAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVswXSA9IDB4JXVseFxuIiwKKwkJCSBydGxwaHktPnB3cmdyb3VwX2NudCwKKwkJCSBydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXQKKwkJCSBbcnRscGh5LT5wd3Jncm91cF9jbnRdWzBdKSk7CisJfQorCWlmIChyZWdhZGRyID09IFJUWEFHQ19BX1JBVEU1NF8yNCkgeworCQlydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXRbcnRscGh5LT5wd3Jncm91cF9jbnRdWzFdID0KKwkJCQkJCQkJCSBkYXRhOworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJCSAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVsxXSA9IDB4JXVseFxuIiwKKwkJCSBydGxwaHktPnB3cmdyb3VwX2NudCwKKwkJCSBydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXQKKwkJCSBbcnRscGh5LT5wd3Jncm91cF9jbnRdWzFdKSk7CisJfQorCWlmIChyZWdhZGRyID09IFJUWEFHQ19BX0NDSzFfTUNTMzIpIHsKKwkJcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0W3J0bHBoeS0+cHdyZ3JvdXBfY250XVs2XSA9CisJCQkJCQkJCQkgZGF0YTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bNl0gPSAweCV1bHhcbiIsCisJCQkgcnRscGh5LT5wd3Jncm91cF9jbnQsCisJCQkgcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0CisJCQkgW3J0bHBoeS0+cHdyZ3JvdXBfY250XVs2XSkpOworCX0KKwlpZiAocmVnYWRkciA9PSBSVFhBR0NfQl9DQ0sxMV9BX0NDSzJfMTEgJiYgYml0bWFzayA9PSAweGZmZmZmZjAwKSB7CisJCXJ0bHBoeS0+bWNzX3R4cHdybGV2ZWxfb3JpZ29mZnNldFtydGxwaHktPnB3cmdyb3VwX2NudF1bN10gPQorCQkJCQkJCQkJIGRhdGE7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLAorCQkJICgiTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbJWRdWzddID0gMHgldWx4XG4iLAorCQkJIHJ0bHBoeS0+cHdyZ3JvdXBfY250LAorCQkJIHJ0bHBoeS0+bWNzX3R4cHdybGV2ZWxfb3JpZ29mZnNldAorCQkJIFtydGxwaHktPnB3cmdyb3VwX2NudF1bN10pKTsKKwl9CisJaWYgKHJlZ2FkZHIgPT0gUlRYQUdDX0FfTUNTMDNfTUNTMDApIHsKKwkJcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0W3J0bHBoeS0+cHdyZ3JvdXBfY250XVsyXSA9CisJCQkJCQkJCQkgZGF0YTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bMl0gPSAweCV1bHhcbiIsCisJCQkgcnRscGh5LT5wd3Jncm91cF9jbnQsCisJCQkgcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0CisJCQkgW3J0bHBoeS0+cHdyZ3JvdXBfY250XVsyXSkpOworCX0KKwlpZiAocmVnYWRkciA9PSBSVFhBR0NfQV9NQ1MwN19NQ1MwNCkgeworCQlydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXRbcnRscGh5LT5wd3Jncm91cF9jbnRdWzNdID0KKwkJCQkJCQkJCSBkYXRhOworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJCSAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVszXSA9IDB4JXVseFxuIiwKKwkJCSBydGxwaHktPnB3cmdyb3VwX2NudCwKKwkJCSBydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXQKKwkJCSBbcnRscGh5LT5wd3Jncm91cF9jbnRdWzNdKSk7CisJfQorCWlmIChyZWdhZGRyID09IFJUWEFHQ19BX01DUzExX01DUzA4KSB7CisJCXJ0bHBoeS0+bWNzX3R4cHdybGV2ZWxfb3JpZ29mZnNldFtydGxwaHktPnB3cmdyb3VwX2NudF1bNF0gPQorCQkJCQkJCQkJIGRhdGE7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLAorCQkJICgiTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbJWRdWzRdID0gMHgldWx4XG4iLAorCQkJIHJ0bHBoeS0+cHdyZ3JvdXBfY250LAorCQkJIHJ0bHBoeS0+bWNzX3R4cHdybGV2ZWxfb3JpZ29mZnNldAorCQkJIFtydGxwaHktPnB3cmdyb3VwX2NudF1bNF0pKTsKKwl9CisJaWYgKHJlZ2FkZHIgPT0gUlRYQUdDX0FfTUNTMTVfTUNTMTIpIHsKKwkJcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0W3J0bHBoeS0+cHdyZ3JvdXBfY250XVs1XSA9CisJCQkJCQkJCQkgZGF0YTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bNV0gPSAweCV1bHhcbiIsCisJCQkgcnRscGh5LT5wd3Jncm91cF9jbnQsCisJCQkgcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0CisJCQkgW3J0bHBoeS0+cHdyZ3JvdXBfY250XVs1XSkpOworCX0KKwlpZiAocmVnYWRkciA9PSBSVFhBR0NfQl9SQVRFMThfMDYpIHsKKwkJcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0W3J0bHBoeS0+cHdyZ3JvdXBfY250XVs4XSA9CisJCQkJCQkJCQkgZGF0YTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bOF0gPSAweCV1bHhcbiIsCisJCQkgcnRscGh5LT5wd3Jncm91cF9jbnQsCisJCQkgcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0CisJCQkgW3J0bHBoeS0+cHdyZ3JvdXBfY250XVs4XSkpOworCX0KKwlpZiAocmVnYWRkciA9PSBSVFhBR0NfQl9SQVRFNTRfMjQpIHsKKwkJcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0W3J0bHBoeS0+cHdyZ3JvdXBfY250XVs5XSA9CisJCQkJCQkJCQkgZGF0YTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bOV0gPSAweCV1bHhcbiIsCisJCQkgcnRscGh5LT5wd3Jncm91cF9jbnQsCisJCQkgcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0CisJCQkgW3J0bHBoeS0+cHdyZ3JvdXBfY250XVs5XSkpOworCX0KKwlpZiAocmVnYWRkciA9PSBSVFhBR0NfQl9DQ0sxXzU1X01DUzMyKSB7CisJCXJ0bHBoeS0+bWNzX3R4cHdybGV2ZWxfb3JpZ29mZnNldFtydGxwaHktPnB3cmdyb3VwX2NudF1bMTRdID0KKwkJCQkJCQkJCSBkYXRhOworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJCSAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVsxNF0gPSAweCV1bHhcbiIsCisJCQkgcnRscGh5LT5wd3Jncm91cF9jbnQsCisJCQkgcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0CisJCQkgW3J0bHBoeS0+cHdyZ3JvdXBfY250XVsxNF0pKTsKKwl9CisJaWYgKHJlZ2FkZHIgPT0gUlRYQUdDX0JfQ0NLMTFfQV9DQ0syXzExICYmIGJpdG1hc2sgPT0gMHgwMDAwMDBmZikgeworCQlydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXRbcnRscGh5LT5wd3Jncm91cF9jbnRdWzE1XSA9CisJCQkJCQkJCQkgZGF0YTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bMTVdID0gMHgldWx4XG4iLAorCQkJIHJ0bHBoeS0+cHdyZ3JvdXBfY250LAorCQkJIHJ0bHBoeS0+bWNzX3R4cHdybGV2ZWxfb3JpZ29mZnNldAorCQkJIFtydGxwaHktPnB3cmdyb3VwX2NudF1bMTVdKSk7CisJfQorCWlmIChyZWdhZGRyID09IFJUWEFHQ19CX01DUzAzX01DUzAwKSB7CisJCXJ0bHBoeS0+bWNzX3R4cHdybGV2ZWxfb3JpZ29mZnNldFtydGxwaHktPnB3cmdyb3VwX2NudF1bMTBdID0KKwkJCQkJCQkJCSBkYXRhOworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJCSAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVsxMF0gPSAweCV1bHhcbiIsCisJCQkgcnRscGh5LT5wd3Jncm91cF9jbnQsCisJCQkgcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0CisJCQkgW3J0bHBoeS0+cHdyZ3JvdXBfY250XVsxMF0pKTsKKwl9CisJaWYgKHJlZ2FkZHIgPT0gUlRYQUdDX0JfTUNTMDdfTUNTMDQpIHsKKwkJcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0W3J0bHBoeS0+cHdyZ3JvdXBfY250XVsxMV0gPQorCQkJCQkJCQkJIGRhdGE7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLAorCQkJICgiTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbJWRdWzExXSA9IDB4JXVseFxuIiwKKwkJCSBydGxwaHktPnB3cmdyb3VwX2NudCwKKwkJCSBydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXQKKwkJCSBbcnRscGh5LT5wd3Jncm91cF9jbnRdWzExXSkpOworCX0KKwlpZiAocmVnYWRkciA9PSBSVFhBR0NfQl9NQ1MxMV9NQ1MwOCkgeworCQlydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXRbcnRscGh5LT5wd3Jncm91cF9jbnRdWzEyXSA9CisJCQkJCQkJCQkgZGF0YTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCQkgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bMTJdID0gMHgldWx4XG4iLAorCQkJICBydGxwaHktPnB3cmdyb3VwX2NudCwKKwkJCSAgcnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0CisJCQkJCVtydGxwaHktPnB3cmdyb3VwX2NudF1bMTJdKSk7CisJfQorCWlmIChyZWdhZGRyID09IFJUWEFHQ19CX01DUzE1X01DUzEyKSB7CisJCXJ0bHBoeS0+bWNzX3R4cHdybGV2ZWxfb3JpZ29mZnNldFtydGxwaHktPnB3cmdyb3VwX2NudF1bMTNdID0KKwkJCQkJCQkJCSBkYXRhOworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJCSAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVsxM10gPSAweCV1bHhcbiIsCisJCQkgIHJ0bHBoeS0+cHdyZ3JvdXBfY250LAorCQkJICBydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXQKKwkJCQkJW3J0bHBoeS0+cHdyZ3JvdXBfY250XVsxM10pKTsKKwkJcnRscGh5LT5wd3Jncm91cF9jbnQrKzsKKwl9Cit9CisKK3N0YXRpYyBib29sIF9ydGw5MmRfcGh5X2NvbmZpZ19iYl93aXRoX3BnaGVhZGVyZmlsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1OCBjb25maWd0eXBlKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlpbnQgaTsKKwl1MzIgKnBoeV9yZWdhcnJheV90YWJsZV9wZzsKKwl1MTYgcGh5X3JlZ2FycmF5X3BnX2xlbjsKKworCXBoeV9yZWdhcnJheV9wZ19sZW4gPSBQSFlfUkVHX0FSUkFZX1BHX0xFTkdUSDsKKwlwaHlfcmVnYXJyYXlfdGFibGVfcGcgPSBydGw4MTkyZGVfcGh5X3JlZ19hcnJheV9wZzsKKwlpZiAoY29uZmlndHlwZSA9PSBCQVNFQkFORF9DT05GSUdfUEhZX1JFRykgeworCQlmb3IgKGkgPSAwOyBpIDwgcGh5X3JlZ2FycmF5X3BnX2xlbjsgaSA9IGkgKyAzKSB7CisJCQlpZiAocGh5X3JlZ2FycmF5X3RhYmxlX3BnW2ldID09IDB4ZmUpCisJCQkJbWRlbGF5KDUwKTsKKwkJCWVsc2UgaWYgKHBoeV9yZWdhcnJheV90YWJsZV9wZ1tpXSA9PSAweGZkKQorCQkJCW1kZWxheSg1KTsKKwkJCWVsc2UgaWYgKHBoeV9yZWdhcnJheV90YWJsZV9wZ1tpXSA9PSAweGZjKQorCQkJCW1kZWxheSgxKTsKKwkJCWVsc2UgaWYgKHBoeV9yZWdhcnJheV90YWJsZV9wZ1tpXSA9PSAweGZiKQorCQkJCXVkZWxheSg1MCk7CisJCQllbHNlIGlmIChwaHlfcmVnYXJyYXlfdGFibGVfcGdbaV0gPT0gMHhmYSkKKwkJCQl1ZGVsYXkoNSk7CisJCQllbHNlIGlmIChwaHlfcmVnYXJyYXlfdGFibGVfcGdbaV0gPT0gMHhmOSkKKwkJCQl1ZGVsYXkoMSk7CisJCQlfcnRsOTJkX3N0b3JlX3B3cmluZGV4X2RpZmZyYXRlX29mZnNldChodywKKwkJCQlwaHlfcmVnYXJyYXlfdGFibGVfcGdbaV0sCisJCQkJcGh5X3JlZ2FycmF5X3RhYmxlX3BnW2kgKyAxXSwKKwkJCQlwaHlfcmVnYXJyYXlfdGFibGVfcGdbaSArIDJdKTsKKwkJfQorCX0gZWxzZSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfU0VORCwgREJHX1RSQUNFLAorCQkJICgiY29uZmlndHlwZSAhPSBCYXNlQmFuZF9Db25maWdfUEhZX1JFR1xuIikpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgX3J0bDkyZF9waHlfYmJfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJYm9vbCBydHN0YXR1cyA9IHRydWU7CisKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwgKCI9PT5cbiIpKTsKKwlydHN0YXR1cyA9IF9ydGw5MmRfcGh5X2NvbmZpZ19iYl93aXRoX2hlYWRlcmZpbGUoaHcsCisJCUJBU0VCQU5EX0NPTkZJR19QSFlfUkVHKTsKKwlpZiAocnRzdGF0dXMgIT0gdHJ1ZSkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLCAoIldyaXRlIEJCIFJlZyBGYWlsISEiKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBpZiAocnRscGh5LT5yZl90eXBlID09IFJGXzFUMlIpIHsKKwkgKiAgICAgIF9ydGw5MmNfcGh5X2JiX2NvbmZpZ18xdChodyk7CisJICogICAgIFJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLCAoIkNvbmZpZyB0byAxVCEhXG4iKSk7CisJICp9ICovCisKKwlpZiAocnRsZWZ1c2UtPmF1dG9sb2FkX2ZhaWxmbGFnID09IGZhbHNlKSB7CisJCXJ0bHBoeS0+cHdyZ3JvdXBfY250ID0gMDsKKwkJcnRzdGF0dXMgPSBfcnRsOTJkX3BoeV9jb25maWdfYmJfd2l0aF9wZ2hlYWRlcmZpbGUoaHcsCisJCQlCQVNFQkFORF9DT05GSUdfUEhZX1JFRyk7CisJfQorCWlmIChydHN0YXR1cyAhPSB0cnVlKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsICgiQkJfUEcgUmVnIEZhaWwhISIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlydHN0YXR1cyA9IF9ydGw5MmRfcGh5X2NvbmZpZ19iYl93aXRoX2hlYWRlcmZpbGUoaHcsCisJCUJBU0VCQU5EX0NPTkZJR19BR0NfVEFCKTsKKwlpZiAocnRzdGF0dXMgIT0gdHJ1ZSkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLCAoIkFHQyBUYWJsZSBGYWlsXG4iKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcnRscGh5LT5jY2tfaGlnaF9wb3dlciA9IChib29sKSAocnRsX2dldF9iYnJlZyhodywKKwkJUkZQR0EwX1hBX0hTU0lQQVJBTUVURVIyLCAweDIwMCkpOworCisJcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcnRsOTJkX3BoeV9iYl9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUxNiByZWd2YWw7CisJdTMyIHJlZ3ZhbGR3OworCXU4IHZhbHVlOworCisJX3J0bDkyZF9waHlfaW5pdF9iYl9yZl9yZWdpc3Rlcl9kZWZpbml0aW9uKGh3KTsKKwlyZWd2YWwgPSBydGxfcmVhZF93b3JkKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTik7CisJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOLAorCQkgICAgICAgcmVndmFsIHwgQklUKDEzKSB8IEJJVCgwKSB8IEJJVCgxKSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0FGRV9QTExfQ1RSTCwgMHg4Myk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0FGRV9QTExfQ1RSTCArIDEsIDB4ZGIpOworCS8qIDB4MWYgYml0NyBiaXQ2IHJlcHJlc2VudCBmb3IgbWFjMC9tYWMxIGRyaXZlciByZWFkeSAqLworCXZhbHVlID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfUkZfQ1RSTCk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JGX0NUUkwsIHZhbHVlIHwgUkZfRU4gfCBSRl9SU1RCIHwKKwkJUkZfU0RNUlNUQik7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOLCBGRU5fUFBMTCB8IEZFTl9QQ0lFQSB8CisJCUZFTl9ESU9fUENJRSB8IEZFTl9CQl9HTEJfUlNUbiB8IEZFTl9CQlJTVEIpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19BRkVfWFRBTF9DVFJMICsgMSwgMHg4MCk7CisJaWYgKCEoSVNfOTJEX1NJTkdMRVBIWShydGxwcml2LT5ydGxoYWwudmVyc2lvbikpKSB7CisJCXJlZ3ZhbGR3ID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgUkVHX0xFRENGRzApOworCQlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgUkVHX0xFRENGRzAsIHJlZ3ZhbGR3IHwgQklUKDIzKSk7CisJfQorCisJcmV0dXJuIF9ydGw5MmRfcGh5X2JiX2NvbmZpZyhodyk7Cit9CisKK2Jvb2wgcnRsOTJkX3BoeV9yZl9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJcmV0dXJuIHJ0bDkyZF9waHlfcmY2MDUyX2NvbmZpZyhodyk7Cit9CisKK2Jvb2wgcnRsOTJkX3BoeV9jb25maWdfcmZfd2l0aF9oZWFkZXJmaWxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgIGVudW0gcmZfY29udGVudCBjb250ZW50LAorCQkJCQkgIGVudW0gcmFkaW9fcGF0aCByZnBhdGgpCit7CisJaW50IGk7CisJdTMyICpyYWRpb2FfYXJyYXlfdGFibGU7CisJdTMyICpyYWRpb2JfYXJyYXlfdGFibGU7CisJdTE2IHJhZGlvYV9hcnJheWxlbiwgcmFkaW9iX2FycmF5bGVuOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKworCXJhZGlvYV9hcnJheWxlbiA9IFJBRElPQV8yVF9BUlJBWUxFTkdUSDsKKwlyYWRpb2FfYXJyYXlfdGFibGUgPSBydGw4MTkyZGVfcmFkaW9hXzJ0YXJyYXk7CisJcmFkaW9iX2FycmF5bGVuID0gUkFESU9CXzJUX0FSUkFZTEVOR1RIOworCXJhZGlvYl9hcnJheV90YWJsZSA9IHJ0bDgxOTJkZV9yYWRpb2JfMnRhcnJheTsKKwlpZiAocnRscHJpdi0+ZWZ1c2UuaW50ZXJuYWxfcGFfNWdbMF0pIHsKKwkJcmFkaW9hX2FycmF5bGVuID0gUkFESU9BXzJUX0lOVF9QQV9BUlJBWUxFTkdUSDsKKwkJcmFkaW9hX2FycmF5X3RhYmxlID0gcnRsODE5MmRlX3JhZGlvYV8ydF9pbnRfcGFhcnJheTsKKwl9CisJaWYgKHJ0bHByaXYtPmVmdXNlLmludGVybmFsX3BhXzVnWzFdKSB7CisJCXJhZGlvYl9hcnJheWxlbiA9IFJBRElPQl8yVF9JTlRfUEFfQVJSQVlMRU5HVEg7CisJCXJhZGlvYl9hcnJheV90YWJsZSA9IHJ0bDgxOTJkZV9yYWRpb2JfMnRfaW50X3BhYXJyYXk7CisJfQorCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsCisJCSAoIlBIWV9Db25maWdSRldpdGhIZWFkZXJGaWxlKCkgIgorCQkgIlJhZGlvX0E6UnRsODE5WFJhZGlvQV8xVEFycmF5XG4iKSk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJICgiUEhZX0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoKSAiCisJCSAiUmFkaW9fQjpSdGw4MTlYUmFkaW9CXzFUQXJyYXlcbiIpKTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwgKCJSYWRpbyBObyAleFxuIiwgcmZwYXRoKSk7CisKKwkvKiB0aGlzIG9ubHkgaGFwcGVucyB3aGVuIERNRFAsIG1hYzAgc3RhcnQgb24gMi40RywKKwkgKiBtYWMxIHN0YXJ0IG9uIDVHLCBtYWMgMCBoYXMgdG8gc2V0IHBoeTAmcGh5MQorCSAqIHBhdGhBIG9yIG1hYzEgaGFzIHRvIHNldCBwaHkwJnBoeTEgcGF0aEEgKi8KKwlpZiAoKGNvbnRlbnQgPT0gcmFkaW9iX3R4dCkgJiYgKHJmcGF0aCA9PSBSRjkwX1BBVEhfQSkpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCSAoIiA9PT0+IGFsdGhvdWd0aCBQYXRoIEEsIHdlIGxvYWQgcmFkaW9iLnR4dFxuIikpOworCQlyYWRpb2FfYXJyYXlsZW4gPSByYWRpb2JfYXJyYXlsZW47CisJCXJhZGlvYV9hcnJheV90YWJsZSA9IHJhZGlvYl9hcnJheV90YWJsZTsKKwl9CisJc3dpdGNoIChyZnBhdGgpIHsKKwljYXNlIFJGOTBfUEFUSF9BOgorCQlmb3IgKGkgPSAwOyBpIDwgcmFkaW9hX2FycmF5bGVuOyBpID0gaSArIDIpIHsKKwkJCWlmIChyYWRpb2FfYXJyYXlfdGFibGVbaV0gPT0gMHhmZSkgeworCQkJCW1kZWxheSg1MCk7CisJCQl9IGVsc2UgaWYgKHJhZGlvYV9hcnJheV90YWJsZVtpXSA9PSAweGZkKSB7CisJCQkJLyogZGVsYXlfbXMoNSk7ICovCisJCQkJbWRlbGF5KDUpOworCQkJfSBlbHNlIGlmIChyYWRpb2FfYXJyYXlfdGFibGVbaV0gPT0gMHhmYykgeworCQkJCS8qIGRlbGF5X21zKDEpOyAqLworCQkJCW1kZWxheSgxKTsKKwkJCX0gZWxzZSBpZiAocmFkaW9hX2FycmF5X3RhYmxlW2ldID09IDB4ZmIpIHsKKwkJCQl1ZGVsYXkoNTApOworCQkJfSBlbHNlIGlmIChyYWRpb2FfYXJyYXlfdGFibGVbaV0gPT0gMHhmYSkgeworCQkJCXVkZWxheSg1KTsKKwkJCX0gZWxzZSBpZiAocmFkaW9hX2FycmF5X3RhYmxlW2ldID09IDB4ZjkpIHsKKwkJCQl1ZGVsYXkoMSk7CisJCQl9IGVsc2UgeworCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHJmcGF0aCwgcmFkaW9hX2FycmF5X3RhYmxlW2ldLAorCQkJCQkgICAgICBCUkZSRUdPRkZTRVRNQVNLLAorCQkJCQkgICAgICByYWRpb2FfYXJyYXlfdGFibGVbaSArIDFdKTsKKwkJCQkvKiAgQWRkIDF1cyBkZWxheSBiZXR3ZWVuIEJCL1JGIHJlZ2lzdGVyIHNldC4gKi8KKwkJCQl1ZGVsYXkoMSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSRjkwX1BBVEhfQjoKKwkJZm9yIChpID0gMDsgaSA8IHJhZGlvYl9hcnJheWxlbjsgaSA9IGkgKyAyKSB7CisJCQlpZiAocmFkaW9iX2FycmF5X3RhYmxlW2ldID09IDB4ZmUpIHsKKwkJCQkvKiBEZWxheSBzcGVjaWZpYyBtcy4gT25seSBSRiBjb25maWd1cmF0aW9uCisJCQkJICogcmVxdWlyZXMgZGVsYXkuICovCisJCQkJbWRlbGF5KDUwKTsKKwkJCX0gZWxzZSBpZiAocmFkaW9iX2FycmF5X3RhYmxlW2ldID09IDB4ZmQpIHsKKwkJCQkvKiBkZWxheV9tcyg1KTsgKi8KKwkJCQltZGVsYXkoNSk7CisJCQl9IGVsc2UgaWYgKHJhZGlvYl9hcnJheV90YWJsZVtpXSA9PSAweGZjKSB7CisJCQkJLyogZGVsYXlfbXMoMSk7ICovCisJCQkJbWRlbGF5KDEpOworCQkJfSBlbHNlIGlmIChyYWRpb2JfYXJyYXlfdGFibGVbaV0gPT0gMHhmYikgeworCQkJCXVkZWxheSg1MCk7CisJCQl9IGVsc2UgaWYgKHJhZGlvYl9hcnJheV90YWJsZVtpXSA9PSAweGZhKSB7CisJCQkJdWRlbGF5KDUpOworCQkJfSBlbHNlIGlmIChyYWRpb2JfYXJyYXlfdGFibGVbaV0gPT0gMHhmOSkgeworCQkJCXVkZWxheSgxKTsKKwkJCX0gZWxzZSB7CisJCQkJcnRsX3NldF9yZnJlZyhodywgcmZwYXRoLCByYWRpb2JfYXJyYXlfdGFibGVbaV0sCisJCQkJCSAgICAgIEJSRlJFR09GRlNFVE1BU0ssCisJCQkJCSAgICAgIHJhZGlvYl9hcnJheV90YWJsZVtpICsgMV0pOworCQkJCS8qICBBZGQgMXVzIGRlbGF5IGJldHdlZW4gQkIvUkYgcmVnaXN0ZXIgc2V0LiAqLworCQkJCXVkZWxheSgxKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFJGOTBfUEFUSF9DOgorCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBSRjkwX1BBVEhfRDoKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBydGw5MmRfcGh5X2dldF9od19yZWdfb3JpZ2luYWx2YWx1ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKworCXJ0bHBoeS0+ZGVmYXVsdF9pbml0aWFsZ2FpblswXSA9CisJICAgICh1OCkgcnRsX2dldF9iYnJlZyhodywgUk9GRE0wX1hBQUdDQ09SRTEsIEJNQVNLQllURTApOworCXJ0bHBoeS0+ZGVmYXVsdF9pbml0aWFsZ2FpblsxXSA9CisJICAgICh1OCkgcnRsX2dldF9iYnJlZyhodywgUk9GRE0wX1hCQUdDQ09SRTEsIEJNQVNLQllURTApOworCXJ0bHBoeS0+ZGVmYXVsdF9pbml0aWFsZ2FpblsyXSA9CisJICAgICh1OCkgcnRsX2dldF9iYnJlZyhodywgUk9GRE0wX1hDQUdDQ09SRTEsIEJNQVNLQllURTApOworCXJ0bHBoeS0+ZGVmYXVsdF9pbml0aWFsZ2FpblszXSA9CisJICAgICh1OCkgcnRsX2dldF9iYnJlZyhodywgUk9GRE0wX1hEQUdDQ09SRTEsIEJNQVNLQllURTApOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLAorCQkgKCJEZWZhdWx0IGluaXRpYWwgZ2FpbiAoYzUwPTB4JXgsICIKKwkJICAiYzU4PTB4JXgsIGM2MD0weCV4LCBjNjg9MHgleFxuIiwKKwkJICBydGxwaHktPmRlZmF1bHRfaW5pdGlhbGdhaW5bMF0sCisJCSAgcnRscGh5LT5kZWZhdWx0X2luaXRpYWxnYWluWzFdLAorCQkgIHJ0bHBoeS0+ZGVmYXVsdF9pbml0aWFsZ2FpblsyXSwKKwkJICBydGxwaHktPmRlZmF1bHRfaW5pdGlhbGdhaW5bM10pKTsKKwlydGxwaHktPmZyYW1lc3luYyA9ICh1OClydGxfZ2V0X2JicmVnKGh3LCBST0ZETTBfUlhERVRFQ1RPUjMsCisJCQkJCSAgICAgIEJNQVNLQllURTApOworCXJ0bHBoeS0+ZnJhbWVzeW5jX2MzNCA9IHJ0bF9nZXRfYmJyZWcoaHcsIFJPRkRNMF9SWERFVEVDVE9SMiwKKwkJCQkJICAgICAgQk1BU0tEV09SRCk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCisJCSAoIkRlZmF1bHQgZnJhbWVzeW5jICgweCV4KSA9IDB4JXhcbiIsCisJCSAgUk9GRE0wX1JYREVURUNUT1IzLCBydGxwaHktPmZyYW1lc3luYykpOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkX2dldF90eHBvd2VyX2luZGV4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBjaGFubmVsLAorCXU4ICpjY2twb3dlcmxldmVsLCB1OCAqb2ZkbXBvd2VybGV2ZWwpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9ICYocnRscHJpdi0+cnRsaGFsKTsKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOworCXU4IGluZGV4ID0gKGNoYW5uZWwgLSAxKTsKKworCS8qIDEuIENDSyAqLworCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCS8qIFJGLUEgKi8KKwkJY2NrcG93ZXJsZXZlbFtSRjkwX1BBVEhfQV0gPQorCQkJCSBydGxlZnVzZS0+dHhwd3JsZXZlbF9jY2tbUkY5MF9QQVRIX0FdW2luZGV4XTsKKwkJLyogUkYtQiAqLworCQljY2twb3dlcmxldmVsW1JGOTBfUEFUSF9CXSA9CisJCQkJIHJ0bGVmdXNlLT50eHB3cmxldmVsX2Nja1tSRjkwX1BBVEhfQl1baW5kZXhdOworCX0gZWxzZSB7CisJCWNja3Bvd2VybGV2ZWxbUkY5MF9QQVRIX0FdID0gMDsKKwkJY2NrcG93ZXJsZXZlbFtSRjkwX1BBVEhfQl0gPSAwOworCX0KKwkvKiAyLiBPRkRNIGZvciAxUyBvciAyUyAqLworCWlmIChydGxwaHktPnJmX3R5cGUgPT0gUkZfMVQyUiB8fCBydGxwaHktPnJmX3R5cGUgPT0gUkZfMVQxUikgeworCQkvKiAgUmVhZCBIVCA0MCBPRkRNIFRYIHBvd2VyICovCisJCW9mZG1wb3dlcmxldmVsW1JGOTBfUEFUSF9BXSA9CisJCSAgICBydGxlZnVzZS0+dHhwd3JsZXZlbF9odDQwXzFzW1JGOTBfUEFUSF9BXVtpbmRleF07CisJCW9mZG1wb3dlcmxldmVsW1JGOTBfUEFUSF9CXSA9CisJCSAgICBydGxlZnVzZS0+dHhwd3JsZXZlbF9odDQwXzFzW1JGOTBfUEFUSF9CXVtpbmRleF07CisJfSBlbHNlIGlmIChydGxwaHktPnJmX3R5cGUgPT0gUkZfMlQyUikgeworCQkvKiBSZWFkIEhUIDQwIE9GRE0gVFggcG93ZXIgKi8KKwkJb2ZkbXBvd2VybGV2ZWxbUkY5MF9QQVRIX0FdID0KKwkJICAgIHJ0bGVmdXNlLT50eHB3cmxldmVsX2h0NDBfMnNbUkY5MF9QQVRIX0FdW2luZGV4XTsKKwkJb2ZkbXBvd2VybGV2ZWxbUkY5MF9QQVRIX0JdID0KKwkJICAgIHJ0bGVmdXNlLT50eHB3cmxldmVsX2h0NDBfMnNbUkY5MF9QQVRIX0JdW2luZGV4XTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfY2N4cG93ZXJfaW5kZXhfY2hlY2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTggY2hhbm5lbCwgdTggKmNja3Bvd2VybGV2ZWwsIHU4ICpvZmRtcG93ZXJsZXZlbCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKworCXJ0bHBoeS0+Y3VyX2Nja190eHB3cmlkeCA9IGNja3Bvd2VybGV2ZWxbMF07CisJcnRscGh5LT5jdXJfb2ZkbTI0Z190eHB3cmlkeCA9IG9mZG1wb3dlcmxldmVsWzBdOworfQorCitzdGF0aWMgdTggX3J0bDkyY19waHlfZ2V0X3JpZ2h0Y2hubHBsYWNlKHU4IGNobmwpCit7CisJdTggY2hhbm5lbF81Z1s1OV0gPSB7CisJCTEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKwkJMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUwLCA1MiwgNTQsIDU2LCA1OCwKKwkJNjAsIDYyLCA2NCwgMTAwLCAxMDIsIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLAorCQkxMTQsIDExNiwgMTE4LCAxMjAsIDEyMiwgMTI0LCAxMjYsIDEyOCwKKwkJMTMwLCAxMzIsIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQ5LCAxNTEsCisJCTE1MywgMTU1LCAxNTcsIDE1OSwgMTYxLCAxNjMsIDE2NQorCX07CisJdTggcGxhY2UgPSBjaG5sOworCisJaWYgKGNobmwgPiAxNCkgeworCQlmb3IgKHBsYWNlID0gMTQ7IHBsYWNlIDwgc2l6ZW9mKGNoYW5uZWxfNWcpOyBwbGFjZSsrKSB7CisJCQlpZiAoY2hhbm5lbF81Z1twbGFjZV0gPT0gY2hubCkgeworCQkJCXBsYWNlKys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHBsYWNlOworfQorCit2b2lkIHJ0bDkyZF9waHlfc2V0X3R4cG93ZXJfbGV2ZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGNoYW5uZWwpCit7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggY2NrcG93ZXJsZXZlbFsyXSwgb2ZkbXBvd2VybGV2ZWxbMl07CisKKwlpZiAocnRsZWZ1c2UtPnR4cHdyX2Zyb21lcHJvbSA9PSBmYWxzZSkKKwkJcmV0dXJuOworCWNoYW5uZWwgPSBfcnRsOTJjX3BoeV9nZXRfcmlnaHRjaG5scGxhY2UoY2hhbm5lbCk7CisJX3J0bDkyZF9nZXRfdHhwb3dlcl9pbmRleChodywgY2hhbm5lbCwgJmNja3Bvd2VybGV2ZWxbMF0sCisJCSZvZmRtcG93ZXJsZXZlbFswXSk7CisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fMl80RykKKwkJX3J0bDkyZF9jY3hwb3dlcl9pbmRleF9jaGVjayhodywgY2hhbm5lbCwgJmNja3Bvd2VybGV2ZWxbMF0sCisJCQkJJm9mZG1wb3dlcmxldmVsWzBdKTsKKwlpZiAocnRscHJpdi0+cnRsaGFsLmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKQorCQlydGw5MmRfcGh5X3JmNjA1Ml9zZXRfY2NrX3R4cG93ZXIoaHcsICZjY2twb3dlcmxldmVsWzBdKTsKKwlydGw5MmRfcGh5X3JmNjA1Ml9zZXRfb2ZkbV90eHBvd2VyKGh3LCAmb2ZkbXBvd2VybGV2ZWxbMF0sIGNoYW5uZWwpOworfQorCit2b2lkIHJ0bDkyZF9waHlfc2Nhbl9vcGVyYXRpb25fYmFja3VwKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBvcGVyYXRpb24pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJZW51bSBpb190eXBlIGlvdHlwZTsKKworCWlmICghaXNfaGFsX3N0b3AocnRsaGFsKSkgeworCQlzd2l0Y2ggKG9wZXJhdGlvbikgeworCQljYXNlIFNDQU5fT1BUX0JBQ0tVUDoKKwkJCXJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZWJhY2t1cCA9CisJCQkJCQkgcnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlOworCQkJaW90eXBlID0gSU9fQ01EX1BBVVNFX0RNX0JZX1NDQU47CisJCQlydGxwcml2LT5jZmctPm9wcy0+c2V0X2h3X3JlZyhodywgSFdfVkFSX0lPX0NNRCwKKwkJCQkJCSAgICAgICh1OCAqKSZpb3R5cGUpOworCQkJYnJlYWs7CisJCWNhc2UgU0NBTl9PUFRfUkVTVE9SRToKKwkJCWlvdHlwZSA9IElPX0NNRF9SRVNVTUVfRE1fQllfU0NBTjsKKwkJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfSU9fQ01ELAorCQkJCQkJICAgICAgKHU4ICopJmlvdHlwZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkJICgiVW5rbm93biBTY2FuIEJhY2t1cCBvcGVyYXRpb24uXG4iKSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwordm9pZCBydGw5MmRfcGh5X3NldF9id19tb2RlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hfdHlwZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJdW5zaWduZWQgbG9uZyBmbGFnID0gMDsKKwl1OCByZWdfcHJzcl9yc2M7CisJdTggcmVnX2J3X29wbW9kZTsKKworCWlmIChydGxwaHktPnNldF9id21vZGVfaW5wcm9ncmVzcykKKwkJcmV0dXJuOworCWlmICgoaXNfaGFsX3N0b3AocnRsaGFsKSkgfHwgKFJUX0NBTk5PVF9JTyhodykpKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCSAoIkZBTFNFIGRyaXZlciBzbGVlcCBvciB1bmxvYWRcbiIpKTsKKwkJcmV0dXJuOworCX0KKwlydGxwaHktPnNldF9id21vZGVfaW5wcm9ncmVzcyA9IHRydWU7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9TQ0FOLCBEQkdfVFJBQ0UsCisJCSAoIlN3aXRjaCB0byAlcyBiYW5kd2lkdGhcbiIsCisJCSAgcnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCA/CisJCSAgIjIwTUh6IiA6ICI0ME1IeiIpKTsKKwlyZWdfYndfb3Btb2RlID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfQldPUE1PREUpOworCXJlZ19wcnNyX3JzYyA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX1JSU1IgKyAyKTsKKwlzd2l0Y2ggKHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3KSB7CisJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgorCQlyZWdfYndfb3Btb2RlIHw9IEJXX09QTU9ERV8yME1IWjsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0JXT1BNT0RFLCByZWdfYndfb3Btb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwOgorCQlyZWdfYndfb3Btb2RlICY9IH5CV19PUE1PREVfMjBNSFo7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CV09QTU9ERSwgcmVnX2J3X29wbW9kZSk7CisKKwkJcmVnX3Byc3JfcnNjID0gKHJlZ19wcnNyX3JzYyAmIDB4OTApIHwKKwkJCShtYWMtPmN1cl80MF9wcmltZV9zYyA8PCA1KTsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1JSU1IgKyAyLCByZWdfcHJzcl9yc2MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgidW5rbm93biBiYW5kd2lkdGg6ICUjWFxuIiwgcnRscGh5LT5jdXJyZW50X2NoYW5fYncpKTsKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAocnRscGh5LT5jdXJyZW50X2NoYW5fYncpIHsKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9SRk1PRCwgQlJGTU9ELCAweDApOworCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTFfUkZNT0QsIEJSRk1PRCwgMHgwKTsKKwkJLyogU0VUIEJJVDEwIEJJVDExICBmb3IgcmVjZWl2ZSBjY2sgKi8KKwkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX0FOQUxPR1BBUkFNRVRFUjIsIEJJVCgxMCkgfAorCQkJICAgICAgQklUKDExKSwgMyk7CisJCWJyZWFrOworCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKKwkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1JGTU9ELCBCUkZNT0QsIDB4MSk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMV9SRk1PRCwgQlJGTU9ELCAweDEpOworCQkvKiBTZXQgQ29udHJvbCBjaGFubmVsIHRvIHVwcGVyIG9yIGxvd2VyLgorCQkgKiBUaGVzZSBzZXR0aW5ncyBhcmUgcmVxdWlyZWQgb25seSBmb3IgNDBNSHogKi8KKwkJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzJfNEcpIHsKKwkJCXJ0bDkyZF9hY3F1aXJlX2Nja2FuZHJ3X3BhZ2VhX2N0bChodywgJmZsYWcpOworCQkJcnRsX3NldF9iYnJlZyhodywgUkNDSzBfU1lTVEVNLCBCQ0NLU0lERUJBTkQsCisJCQkJKG1hYy0+Y3VyXzQwX3ByaW1lX3NjID4+IDEpKTsKKwkJCXJ0bDkyZF9yZWxlYXNlX2Nja2FuZHJ3X3BhZ2VhX2N0bChodywgJmZsYWcpOworCQl9CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMV9MU1RGLCAweEMwMCwgbWFjLT5jdXJfNDBfcHJpbWVfc2MpOworCQkvKiBTRVQgQklUMTAgQklUMTEgIGZvciByZWNlaXZlIGNjayAqLworCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfQU5BTE9HUEFSQU1FVEVSMiwgQklUKDEwKSB8CisJCQkgICAgICBCSVQoMTEpLCAwKTsKKwkJcnRsX3NldF9iYnJlZyhodywgMHg4MTgsIChCSVQoMjYpIHwgQklUKDI3KSksCisJCQkobWFjLT5jdXJfNDBfcHJpbWVfc2MgPT0KKwkJCUhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUikgPyAyIDogMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJ1bmtub3duIGJhbmR3aWR0aDogJSNYXG4iLCBydGxwaHktPmN1cnJlbnRfY2hhbl9idykpOworCQlicmVhazsKKworCX0KKwlydGw5MmRfcGh5X3JmNjA1Ml9zZXRfYmFuZHdpZHRoKGh3LCBydGxwaHktPmN1cnJlbnRfY2hhbl9idyk7CisJcnRscGh5LT5zZXRfYndtb2RlX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX1NDQU4sIERCR19UUkFDRSwgKCI8PT1cbiIpKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF9waHlfc3RvcF90cnhfYmVmb3JlX2NoYW5nZWJhbmQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1JGTU9ELCBCQ0NLRU4sIDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9SRk1PRCwgQk9GRE1FTiwgMCk7CisJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1RSWFBBVEhFTkFCTEUsIEJNQVNLQllURTAsIDB4MDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMV9UUlhQQVRIRU5BQkxFLCBCRFdPUkQsIDB4MCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDkyZF9waHlfc3dpdGNoX3dpcmVsZXNzYmFuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggYmFuZCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1OCB2YWx1ZTg7CisKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELCAoIj09PlxuIikpOworCXJ0bGhhbC0+YmFuZHNldCA9IGJhbmQ7CisJcnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID0gYmFuZDsKKwlpZiAoSVNfOTJEX1NJTkdMRVBIWShydGxoYWwtPnZlcnNpb24pKQorCQlydGxoYWwtPmJhbmRzZXQgPSBCQU5EX09OX0JPVEg7CisJLyogc3RvcCBSWC9UeCAqLworCV9ydGw5MmRfcGh5X3N0b3BfdHJ4X2JlZm9yZV9jaGFuZ2ViYW5kKGh3KTsKKwkvKiByZWNvbmZpZyBCQi9SRiBhY2NvcmRpbmcgdG8gd2lyZWxlc3MgbW9kZSAqLworCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCS8qIEJCICYgUkYgQ29uZmlnICovCisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfRE1FU0csICgiPT09PT4yLjRHXG4iKSk7CisJCWlmIChydGxoYWwtPmludGVyZmFjZWluZGV4ID09IDEpCisJCQlfcnRsOTJkX3BoeV9jb25maWdfYmJfd2l0aF9oZWFkZXJmaWxlKGh3LAorCQkJCUJBU0VCQU5EX0NPTkZJR19BR0NfVEFCKTsKKwl9IGVsc2UgeworCQkvKiA1RyBiYW5kICovCisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfRE1FU0csICgiPT09PT41R1xuIikpOworCQlpZiAocnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9PSAxKQorCQkJX3J0bDkyZF9waHlfY29uZmlnX2JiX3dpdGhfaGVhZGVyZmlsZShodywKKwkJCQlCQVNFQkFORF9DT05GSUdfQUdDX1RBQik7CisJfQorCXJ0bDkyZF91cGRhdGVfYmJyZl9jb25maWd1cmF0aW9uKGh3KTsKKwlpZiAocnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fMl80RykKKwkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1JGTU9ELCBCQ0NLRU4sIDB4MSk7CisJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1JGTU9ELCBCT0ZETUVOLCAweDEpOworCisJLyogMjBNIEJXLiAqLworCS8qIHJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9BTkFMT0dQQVJBTUVURVIyLCBCSVQoMTApLCAxKTsgKi8KKwlydGxoYWwtPnJlbG9hZHR4cG93ZXJpbmRleCA9IHRydWU7CisJLyogbm90aWNlIGZ3IGtub3cgYmFuZCBzdGF0dXMgIDB4ODFbMV0vMHg1M1sxXSA9IDA6IDVHLCAxOiAyRyAqLworCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCXZhbHVlOCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwJKHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPT0KKwkJCTAgPyBSRUdfTUFDMCA6IFJFR19NQUMxKSk7CisJCXZhbHVlOCB8PSBCSVQoMSk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIChydGxoYWwtPmludGVyZmFjZWluZGV4ID09CisJCQkwID8gUkVHX01BQzAgOiBSRUdfTUFDMSksIHZhbHVlOCk7CisJfSBlbHNlIHsKKwkJdmFsdWU4ID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCAocnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9PQorCQkJMCA/IFJFR19NQUMwIDogUkVHX01BQzEpKTsKKwkJdmFsdWU4ICY9ICh+QklUKDEpKTsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgKHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPT0KKwkJCTAgPyBSRUdfTUFDMCA6IFJFR19NQUMxKSwgdmFsdWU4KTsKKwl9CisJbWRlbGF5KDEpOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsICgiPD09U3dpdGNoIEJhbmQgT0suXG4iKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X3JlbG9hZF9pbXJfc2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1OCBjaGFubmVsLCB1OCByZnBhdGgpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBpbXJfbnVtID0gTUFYX1JGX0lNUl9JTkRFWDsKKwl1MzIgcmZtYXNrID0gQlJGUkVHT0ZGU0VUTUFTSzsKKwl1OCBncm91cCwgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWcgPSAwOworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELCAoIj09PT0+cGF0aCAlZFxuIiwgcmZwYXRoKSk7CisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fNUcpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELCAoIj09PT0+NUdcbiIpKTsKKwkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1JGTU9ELCBCSVQoMjUpIHwgQklUKDI0KSwgMCk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9BTkFMT0dQQVJBTUVURVI0LCAweDAwZjAwMDAwLCAweGYpOworCQkvKiBmYyBhcmVhIDB4ZDJjICovCisJCWlmIChjaGFubmVsID4gOTkpCisJCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTFfQ0ZPVFJBQ0tJTkcsIEJJVCgxMykgfAorCQkJCSAgICAgIEJJVCgxNCksIDIpOworCQllbHNlCisJCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTFfQ0ZPVFJBQ0tJTkcsIEJJVCgxMykgfAorCQkJCSAgICAgIEJJVCgxNCksIDEpOworCQkvKiBsZWF2ZSAwIGZvciBjaGFubmVsMS0xNC4gKi8KKwkJZ3JvdXAgPSBjaGFubmVsIDw9IDY0ID8gMSA6IDI7CisJCWltcl9udW0gPSBNQVhfUkZfSU1SX0lOREVYX05PUk1BTDsKKwkJZm9yIChpID0gMDsgaSA8IGltcl9udW07IGkrKykKKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIChlbnVtIHJhZGlvX3BhdGgpcmZwYXRoLAorCQkJCSAgICAgIHJmX3JlZ19mb3JfNWdfc3djaG5sX25vcm1hbFtpXSwgcmZtYXNrLAorCQkJCSAgICAgIHJmX2ltcl9wYXJhbV9ub3JtYWxbMF1bZ3JvdXBdW2ldKTsKKwkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX0FOQUxPR1BBUkFNRVRFUjQsIDB4MDBmMDAwMDAsIDApOworCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfUkZNT0QsIEJPRkRNRU4sIDEpOworCX0gZWxzZSB7CisJCS8qIEcgYmFuZC4gKi8KKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9TQ0FOLCBEQkdfTE9VRCwKKwkJCSAoIkxvYWQgUkYgSU1SIHBhcmFtZXRlcnMgZm9yIEcgYmFuZC4gSU1SIGFscmVhZHkgIgorCQkJICJzZXR0aW5nICVkXG4iLAorCQkJICBydGxwcml2LT5ydGxoYWwubG9hZF9pbXJhbmRpcWtfc2V0dGluZ19mb3IyZykpOworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0NNRCwgREJHX0xPVUQsICgiPT09PT4yLjRHXG4iKSk7CisJCWlmICghcnRscHJpdi0+cnRsaGFsLmxvYWRfaW1yYW5kaXFrX3NldHRpbmdfZm9yMmcpIHsKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfU0NBTiwgREJHX0xPVUQsCisJCQkJKCJMb2FkIFJGIElNUiBwYXJhbWV0ZXJzICIKKwkJCQkiZm9yIEcgYmFuZC4gJWRcbiIsIHJmcGF0aCkpOworCQkJcnRsOTJkX2FjcXVpcmVfY2NrYW5kcndfcGFnZWFfY3RsKGh3LCAmZmxhZyk7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfUkZNT0QsIEJJVCgyNSkgfCBCSVQoMjQpLCAwKTsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9BTkFMT0dQQVJBTUVURVI0LAorCQkJCSAgICAgIDB4MDBmMDAwMDAsIDB4Zik7CisJCQlpbXJfbnVtID0gTUFYX1JGX0lNUl9JTkRFWF9OT1JNQUw7CisJCQlmb3IgKGkgPSAwOyBpIDwgaW1yX251bTsgaSsrKSB7CisJCQkJcnRsX3NldF9yZnJlZyhodywgKGVudW0gcmFkaW9fcGF0aClyZnBhdGgsCisJCQkJCSAgICAgIHJmX3JlZ19mb3JfNWdfc3djaG5sX25vcm1hbFtpXSwKKwkJCQkJICAgICAgQlJGUkVHT0ZGU0VUTUFTSywKKwkJCQkJICAgICAgcmZfaW1yX3BhcmFtX25vcm1hbFswXVswXVtpXSk7CisJCQl9CisJCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfQU5BTE9HUEFSQU1FVEVSNCwKKwkJCQkgICAgICAweDAwZjAwMDAwLCAwKTsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9SRk1PRCwgQk9GRE1FTiB8IEJDQ0tFTiwgMyk7CisJCQlydGw5MmRfcmVsZWFzZV9jY2thbmRyd19wYWdlYV9jdGwoaHcsICZmbGFnKTsKKwkJfQorCX0KKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0NNRCwgREJHX0xPVUQsICgiPD09PT1cbiIpKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF9waHlfZW5hYmxlX3JmX2VudihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwl1OCByZnBhdGgsIHUzMiAqcHU0X3JlZ3ZhbCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgYmJfcmVnX2RlZiAqcHBoeXJlZyA9ICZydGxwaHktPnBoeXJlZ19kZWZbcmZwYXRoXTsKKworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19MT1VELCAoIj09PT0+XG4iKSk7CisJLyotLS0tU3RvcmUgb3JpZ2luYWwgUkZFTlYgY29udHJvbCB0eXBlLS0tLSovCisJc3dpdGNoIChyZnBhdGgpIHsKKwljYXNlIFJGOTBfUEFUSF9BOgorCWNhc2UgUkY5MF9QQVRIX0M6CisJCSpwdTRfcmVndmFsID0gcnRsX2dldF9iYnJlZyhodywgcHBoeXJlZy0+cmZpbnRmcywgQlJGU0lfUkZFTlYpOworCQlicmVhazsKKwljYXNlIFJGOTBfUEFUSF9COgorCWNhc2UgUkY5MF9QQVRIX0Q6CisJCSpwdTRfcmVndmFsID0KKwkJICAgIHJ0bF9nZXRfYmJyZWcoaHcsIHBwaHlyZWctPnJmaW50ZnMsIEJSRlNJX1JGRU5WIDw8IDE2KTsKKwkJYnJlYWs7CisJfQorCS8qLS0tLVNldCBSRl9FTlYgZW5hYmxlLS0tLSovCisJcnRsX3NldF9iYnJlZyhodywgcHBoeXJlZy0+cmZpbnRmZSwgQlJGU0lfUkZFTlYgPDwgMTYsIDB4MSk7CisJdWRlbGF5KDEpOworCS8qLS0tLVNldCBSRl9FTlYgb3V0cHV0IGhpZ2gtLS0tKi8KKwlydGxfc2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmludGZvLCBCUkZTSV9SRkVOViwgMHgxKTsKKwl1ZGVsYXkoMSk7CisJLyogU2V0IGJpdCBudW1iZXIgb2YgQWRkcmVzcyBhbmQgRGF0YSBmb3IgUkYgcmVnaXN0ZXIgKi8KKwkvKiBTZXQgMSB0byA0IGJpdHMgZm9yIDgyNTUgKi8KKwlydGxfc2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmhzc2lfcGFyYTIsIEIzV0lSRUFERFJFU1NMRU5HVEgsIDB4MCk7CisJdWRlbGF5KDEpOworCS8qU2V0IDAgdG8gMTIgYml0cyBmb3IgODI1NSAqLworCXJ0bF9zZXRfYmJyZWcoaHcsIHBwaHlyZWctPnJmaHNzaV9wYXJhMiwgQjNXSVJFREFUQUxFTkdUSCwgMHgwKTsKKwl1ZGVsYXkoMSk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX0xPVUQsICgiPD09PT1cbiIpKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF9waHlfcmVzdG9yZV9yZl9lbnYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHJmcGF0aCwKKwkJCQkgICAgICAgdTMyICpwdTRfcmVndmFsKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBiYl9yZWdfZGVmICpwcGh5cmVnID0gJnJ0bHBoeS0+cGh5cmVnX2RlZltyZnBhdGhdOworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX0xPVUQsICgiPT09PT0+XG4iKSk7CisJLyotLS0tUmVzdG9yZSBSRkVOViBjb250cm9sIHR5cGUtLS0tKi8gOworCXN3aXRjaCAocmZwYXRoKSB7CisJY2FzZSBSRjkwX1BBVEhfQToKKwljYXNlIFJGOTBfUEFUSF9DOgorCQlydGxfc2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmludGZzLCBCUkZTSV9SRkVOViwgKnB1NF9yZWd2YWwpOworCQlicmVhazsKKwljYXNlIFJGOTBfUEFUSF9COgorCWNhc2UgUkY5MF9QQVRIX0Q6CisJCXJ0bF9zZXRfYmJyZWcoaHcsIHBwaHlyZWctPnJmaW50ZnMsIEJSRlNJX1JGRU5WIDw8IDE2LAorCQkJICAgICAgKnB1NF9yZWd2YWwpOworCQlicmVhazsKKwl9CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX0xPVUQsICgiPD09PT09XG4iKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X3N3aXRjaF9yZl9zZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBjaGFubmVsKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSAmKHJ0bHByaXYtPnJ0bGhhbCk7CisJdTggcGF0aCA9IHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PQorCSAgICBCQU5EX09OXzVHID8gUkY5MF9QQVRIX0EgOiBSRjkwX1BBVEhfQjsKKwl1OCBpbmRleCA9IDAsIGkgPSAwLCByZnBhdGggPSBSRjkwX1BBVEhfQTsKKwlib29sIG5lZWRfcHdyX2Rvd24gPSBmYWxzZSwgaW50ZXJuYWxfcGEgPSBmYWxzZTsKKwl1MzIgdTRyZWd2YWx1ZSwgbWFzayA9IDB4MUMwMDAsIHZhbHVlID0gMCwgdTR0bXAsIHU0dG1wMjsKKworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfTE9VRCwgKCI9PT09PlxuIikpOworCS8qIGNvbmZpZyBwYXRoIEEgZm9yIDVHICovCisJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzVHKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfTE9VRCwgKCI9PT09PjVHXG4iKSk7CisJCXU0dG1wID0gY3VydmVpbmRleF81Z1tjaGFubmVsIC0gMV07CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoInZlciAxIHNldCBSRi1BLCA1RywgIgorCQkJIjB4MjggPSAweCV4ICEhXG4iLCB1NHRtcCkpOworCQlmb3IgKGkgPSAwOyBpIDwgUkZfQ0hOTF9OVU1fNUc7IGkrKykgeworCQkJaWYgKGNoYW5uZWwgPT0gcmZfY2hubF81Z1tpXSAmJiBjaGFubmVsIDw9IDE0MCkKKwkJCQlpbmRleCA9IDA7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IFJGX0NITkxfTlVNXzVHXzQwTTsgaSsrKSB7CisJCQlpZiAoY2hhbm5lbCA9PSByZl9jaG5sXzVnXzQwbVtpXSAmJiBjaGFubmVsIDw9IDE0MCkKKwkJCQlpbmRleCA9IDE7CisJCX0KKwkJaWYgKGNoYW5uZWwgPT0gMTQ5IHx8IGNoYW5uZWwgPT0gMTU1IHx8IGNoYW5uZWwgPT0gMTYxKQorCQkJaW5kZXggPSAyOworCQllbHNlIGlmIChjaGFubmVsID09IDE1MSB8fCBjaGFubmVsID09IDE1MyB8fCBjaGFubmVsID09IDE2MworCQkJIHx8IGNoYW5uZWwgPT0gMTY1KQorCQkJaW5kZXggPSAzOworCQllbHNlIGlmIChjaGFubmVsID09IDE1NyB8fCBjaGFubmVsID09IDE1OSkKKwkJCWluZGV4ID0gNDsKKworCQlpZiAocnRsaGFsLT5tYWNwaHltb2RlID09IERVQUxNQUNfRFVBTFBIWQorCQkgICAgJiYgcnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9PSAxKSB7CisJCQluZWVkX3B3cl9kb3duID0gcnRsOTJkX3BoeV9lbmFibGVfYW5vdGhlcnBoeShodywgZmFsc2UpOworCQkJcnRsaGFsLT5kdXJpbmdfbWFjMWluaXRfcmFkaW9hID0gdHJ1ZTsKKwkJCS8qIGFzdW1lIG5vIHRoaXMgY2FzZSAqLworCQkJaWYgKG5lZWRfcHdyX2Rvd24pCisJCQkJX3J0bDkyZF9waHlfZW5hYmxlX3JmX2VudihodywgcGF0aCwKKwkJCQkJCQkgICZ1NHJlZ3ZhbHVlKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgUkZfUkVHX05VTV9GT1JfQ19DVVRfNUc7IGkrKykgeworCQkJaWYgKGkgPT0gMCAmJiAocnRsaGFsLT5tYWNwaHltb2RlID09IERVQUxNQUNfRFVBTFBIWSkpIHsKKwkJCQlydGxfc2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKXBhdGgsCisJCQkJCSAgICAgIHJmX3JlZ19mb3JfY19jdXRfNWdbaV0sCisJCQkJCSAgICAgIEJSRlJFR09GRlNFVE1BU0ssIDB4RTQzOUQpOworCQkJfSBlbHNlIGlmIChyZl9yZWdfZm9yX2NfY3V0XzVnW2ldID09IFJGX1NZTl9HNCkgeworCQkJCXU0dG1wMiA9IChyZl9yZWdfcHJhbV9jXzVnW2luZGV4XVtpXSAmCisJCQkJICAgICAweDdGRikgfCAodTR0bXAgPDwgMTEpOworCQkJCWlmIChjaGFubmVsID09IDM2KQorCQkJCQl1NHRtcDIgJj0gfihCSVQoNykgfCBCSVQoNikpOworCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIChlbnVtIHJhZGlvX3BhdGgpcGF0aCwKKwkJCQkJICAgICAgcmZfcmVnX2Zvcl9jX2N1dF81Z1tpXSwKKwkJCQkJICAgICAgQlJGUkVHT0ZGU0VUTUFTSywgdTR0bXAyKTsKKwkJCX0gZWxzZSB7CisJCQkJcnRsX3NldF9yZnJlZyhodywgKGVudW0gcmFkaW9fcGF0aClwYXRoLAorCQkJCQkgICAgICByZl9yZWdfZm9yX2NfY3V0XzVnW2ldLAorCQkJCQkgICAgICBCUkZSRUdPRkZTRVRNQVNLLAorCQkJCQkgICAgICByZl9yZWdfcHJhbV9jXzVnW2luZGV4XVtpXSk7CisJCQl9CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1JGLCBEQkdfVFJBQ0UsCisJCQkJKCJvZmZzZXQgMHgleCB2YWx1ZSAweCV4ICIKKwkJCQkicGF0aCAlZCBpbmRleCAlZCByZWFkYmFjayAweCV4XG4iLAorCQkJCXJmX3JlZ19mb3JfY19jdXRfNWdbaV0sCisJCQkJcmZfcmVnX3ByYW1fY181Z1tpbmRleF1baV0sIHBhdGgsCisJCQkJaW5kZXgsIHJ0bF9nZXRfcmZyZWcoaHcsIChlbnVtIHJhZGlvX3BhdGgpcGF0aCwKKwkJCQlyZl9yZWdfZm9yX2NfY3V0XzVnW2ldLCBCUkZSRUdPRkZTRVRNQVNLKSkpOworCQl9CisJCWlmIChuZWVkX3B3cl9kb3duKQorCQkJX3J0bDkyZF9waHlfcmVzdG9yZV9yZl9lbnYoaHcsIHBhdGgsICZ1NHJlZ3ZhbHVlKTsKKwkJaWYgKHJ0bGhhbC0+ZHVyaW5nX21hYzFpbml0X3JhZGlvYSkKKwkJCXJ0bDkyZF9waHlfcG93ZXJkb3duX2Fub3RoZXJwaHkoaHcsIGZhbHNlKTsKKwkJaWYgKGNoYW5uZWwgPCAxNDkpCisJCQl2YWx1ZSA9IDB4MDc7CisJCWVsc2UgaWYgKGNoYW5uZWwgPj0gMTQ5KQorCQkJdmFsdWUgPSAweDAyOworCQlpZiAoY2hhbm5lbCA+PSAzNiAmJiBjaGFubmVsIDw9IDY0KQorCQkJaW5kZXggPSAwOworCQllbHNlIGlmIChjaGFubmVsID49IDEwMCAmJiBjaGFubmVsIDw9IDE0MCkKKwkJCWluZGV4ID0gMTsKKwkJZWxzZQorCQkJaW5kZXggPSAyOworCQlmb3IgKHJmcGF0aCA9IFJGOTBfUEFUSF9BOyByZnBhdGggPCBydGxwaHktPm51bV90b3RhbF9yZnBhdGg7CisJCQlyZnBhdGgrKykgeworCQkJaWYgKHJ0bGhhbC0+bWFjcGh5bW9kZSA9PSBEVUFMTUFDX0RVQUxQSFkgJiYKKwkJCQlydGxoYWwtPmludGVyZmFjZWluZGV4ID09IDEpCS8qIE1BQyAxIDVHICovCisJCQkJaW50ZXJuYWxfcGEgPSBydGxwcml2LT5lZnVzZS5pbnRlcm5hbF9wYV81Z1sxXTsKKwkJCWVsc2UKKwkJCQlpbnRlcm5hbF9wYSA9CisJCQkJCSBydGxwcml2LT5lZnVzZS5pbnRlcm5hbF9wYV81Z1tyZnBhdGhdOworCQkJaWYgKGludGVybmFsX3BhKSB7CisJCQkJZm9yIChpID0gMDsKKwkJCQkgICAgIGkgPCBSRl9SRUdfTlVNX0ZPUl9DX0NVVF81R19JTlRFUk5BTFBBOworCQkJCSAgICAgaSsrKSB7CisJCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIHJmcGF0aCwKKwkJCQkJCXJmX2Zvcl9jX2N1dF81Z19pbnRlcm5hbF9wYVtpXSwKKwkJCQkJCUJSRlJFR09GRlNFVE1BU0ssCisJCQkJCQlyZl9wcmFtX2NfNWdfaW50X3BhW2luZGV4XVtpXSk7CisJCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19MT1VELAorCQkJCQkJICgib2Zmc2V0IDB4JXggdmFsdWUgMHgleCAiCisJCQkJCQkgInBhdGggJWQgaW5kZXggJWRcbiIsCisJCQkJCQkgcmZfZm9yX2NfY3V0XzVnX2ludGVybmFsX3BhW2ldLAorCQkJCQkJIHJmX3ByYW1fY181Z19pbnRfcGFbaW5kZXhdW2ldLAorCQkJCQkJIHJmcGF0aCwgaW5kZXgpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJ0bF9zZXRfcmZyZWcoaHcsIChlbnVtIHJhZGlvX3BhdGgpcmZwYXRoLCAweDBCLAorCQkJCQkgICAgICBtYXNrLCB2YWx1ZSk7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzJfNEcpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELCAoIj09PT0+Mi40R1xuIikpOworCQl1NHRtcCA9IGN1cnZlaW5kZXhfMmdbY2hhbm5lbCAtIDFdOworCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJ2ZXIgMyBzZXQgUkYtQiwgMkcsICIKKwkJCSIweDI4ID0gMHgleCAhIVxuIiwgdTR0bXApKTsKKwkJaWYgKGNoYW5uZWwgPT0gMSB8fCBjaGFubmVsID09IDIgfHwgY2hhbm5lbCA9PSA0IHx8IGNoYW5uZWwgPT0gOQorCQkgICAgfHwgY2hhbm5lbCA9PSAxMCB8fCBjaGFubmVsID09IDExIHx8IGNoYW5uZWwgPT0gMTIpCisJCQlpbmRleCA9IDA7CisJCWVsc2UgaWYgKGNoYW5uZWwgPT0gMyB8fCBjaGFubmVsID09IDEzIHx8IGNoYW5uZWwgPT0gMTQpCisJCQlpbmRleCA9IDE7CisJCWVsc2UgaWYgKGNoYW5uZWwgPj0gNSAmJiBjaGFubmVsIDw9IDgpCisJCQlpbmRleCA9IDI7CisJCWlmIChydGxoYWwtPm1hY3BoeW1vZGUgPT0gRFVBTE1BQ19EVUFMUEhZKSB7CisJCQlwYXRoID0gUkY5MF9QQVRIX0E7CisJCQlpZiAocnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9PSAwKSB7CisJCQkJbmVlZF9wd3JfZG93biA9CisJCQkJCSBydGw5MmRfcGh5X2VuYWJsZV9hbm90aGVycGh5KGh3LCB0cnVlKTsKKwkJCQlydGxoYWwtPmR1cmluZ19tYWMwaW5pdF9yYWRpb2IgPSB0cnVlOworCisJCQkJaWYgKG5lZWRfcHdyX2Rvd24pCisJCQkJCV9ydGw5MmRfcGh5X2VuYWJsZV9yZl9lbnYoaHcsIHBhdGgsCisJCQkJCQkJCSAgJnU0cmVndmFsdWUpOworCQkJfQorCQl9CisJCWZvciAoaSA9IDA7IGkgPCBSRl9SRUdfTlVNX0ZPUl9DX0NVVF8yRzsgaSsrKSB7CisJCQlpZiAocmZfcmVnX2Zvcl9jX2N1dF8yZ1tpXSA9PSBSRl9TWU5fRzcpCisJCQkJcnRsX3NldF9yZnJlZyhodywgKGVudW0gcmFkaW9fcGF0aClwYXRoLAorCQkJCQlyZl9yZWdfZm9yX2NfY3V0XzJnW2ldLAorCQkJCQlCUkZSRUdPRkZTRVRNQVNLLAorCQkJCQkocmZfcmVnX3BhcmFtX2Zvcl9jX2N1dF8yZ1tpbmRleF1baV0gfAorCQkJCQlCSVQoMTcpKSk7CisJCQllbHNlCisJCQkJcnRsX3NldF9yZnJlZyhodywgKGVudW0gcmFkaW9fcGF0aClwYXRoLAorCQkJCQkgICAgICByZl9yZWdfZm9yX2NfY3V0XzJnW2ldLAorCQkJCQkgICAgICBCUkZSRUdPRkZTRVRNQVNLLAorCQkJCQkgICAgICByZl9yZWdfcGFyYW1fZm9yX2NfY3V0XzJnCisJCQkJCSAgICAgIFtpbmRleF1baV0pOworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX1RSQUNFLAorCQkJCSgib2Zmc2V0IDB4JXggdmFsdWUgMHgleCBtYWsgMHgleCBwYXRoICVkICIKKwkJCQkiaW5kZXggJWQgcmVhZGJhY2sgMHgleFxuIiwKKwkJCQlyZl9yZWdfZm9yX2NfY3V0XzJnW2ldLAorCQkJCXJmX3JlZ19wYXJhbV9mb3JfY19jdXRfMmdbaW5kZXhdW2ldLAorCQkJCXJmX3JlZ19tYXNrX2Zvcl9jX2N1dF8yZ1tpXSwgcGF0aCwgaW5kZXgsCisJCQkJcnRsX2dldF9yZnJlZyhodywgKGVudW0gcmFkaW9fcGF0aClwYXRoLAorCQkJCXJmX3JlZ19mb3JfY19jdXRfMmdbaV0sCisJCQkJQlJGUkVHT0ZGU0VUTUFTSykpKTsKKwkJfQorCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywKKwkJCSgiY29zYSB2ZXIgMyBzZXQgUkYtQiwgMkcsIDB4MjggPSAweCV4ICEhXG4iLAorCQkJcmZfc3luX2c0X2Zvcl9jX2N1dF8yZyB8ICh1NHRtcCA8PCAxMSkpKTsKKworCQlydGxfc2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKXBhdGgsIFJGX1NZTl9HNCwKKwkJCSAgICAgIEJSRlJFR09GRlNFVE1BU0ssCisJCQkgICAgICByZl9zeW5fZzRfZm9yX2NfY3V0XzJnIHwgKHU0dG1wIDw8IDExKSk7CisJCWlmIChuZWVkX3B3cl9kb3duKQorCQkJX3J0bDkyZF9waHlfcmVzdG9yZV9yZl9lbnYoaHcsIHBhdGgsICZ1NHJlZ3ZhbHVlKTsKKwkJaWYgKHJ0bGhhbC0+ZHVyaW5nX21hYzBpbml0X3JhZGlvYikKKwkJCXJ0bDkyZF9waHlfcG93ZXJkb3duX2Fub3RoZXJwaHkoaHcsIHRydWUpOworCX0KKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0NNRCwgREJHX0xPVUQsICgiPD09PT1cbiIpKTsKK30KKwordTggcnRsOTJkX2dldF9yaWdodGNobmxwbGFjZV9mb3JfaXFrKHU4IGNobmwpCit7CisJdTggY2hhbm5lbF9hbGxbNTldID0geworCQkxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsCisJCTM2LCAzOCwgNDAsIDQyLCA0NCwgNDYsIDQ4LCA1MCwgNTIsIDU0LCA1NiwgNTgsCisJCTYwLCA2MiwgNjQsIDEwMCwgMTAyLCAxMDQsIDEwNiwgMTA4LCAxMTAsIDExMiwKKwkJMTE0LCAxMTYsIDExOCwgMTIwLCAxMjIsIDEyNCwgMTI2LCAxMjgsCTEzMCwKKwkJMTMyLCAxMzQsIDEzNiwgMTM4LCAxNDAsIDE0OSwgMTUxLCAxNTMsIDE1NSwKKwkJMTU3LCAxNTksIDE2MSwgMTYzLCAxNjUKKwl9OworCXU4IHBsYWNlID0gY2hubDsKKworCWlmIChjaG5sID4gMTQpIHsKKwkJZm9yIChwbGFjZSA9IDE0OyBwbGFjZSA8IHNpemVvZihjaGFubmVsX2FsbCk7IHBsYWNlKyspIHsKKwkJCWlmIChjaGFubmVsX2FsbFtwbGFjZV0gPT0gY2hubCkKKwkJCQlyZXR1cm4gcGxhY2UgLSAxMzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9UT0xFUkFOQ0UJCTUKKyNkZWZpbmUgSVFLX0RFTEFZX1RJTUUJCTEJLyogbXMgKi8KKyNkZWZpbmUgTUFYX1RPTEVSQU5DRV85MkQJMworCisvKiBiaXQwID0gMSA9PiBUeCBPSywgYml0MSA9IDEgPT4gUnggT0sgKi8KK3N0YXRpYyB1OCBfcnRsOTJkX3BoeV9wYXRoYV9pcWsoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgY29uZmlncGF0aGIpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJdTMyIHJlZ2VhYywgcmVnZTk0LCByZWdlOWMsIHJlZ2VhNDsKKwl1OCByZXN1bHQgPSAwOworCisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiUGF0aCBBIElRSyFcbiIpKTsKKwkvKiBwYXRoLUEgSVFLIHNldHRpbmcgKi8KKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJQYXRoLUEgSVFLIHNldHRpbmchXG4iKSk7CisJaWYgKHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPT0gMCkgeworCQlydGxfc2V0X2JicmVnKGh3LCAweGUzMCwgQk1BU0tEV09SRCwgMHgxMDAwOGMxZik7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTM0LCBCTUFTS0RXT1JELCAweDEwMDA4YzFmKTsKKwl9IGVsc2UgeworCQlydGxfc2V0X2JicmVnKGh3LCAweGUzMCwgQk1BU0tEV09SRCwgMHgxMDAwOGMyMik7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTM0LCBCTUFTS0RXT1JELCAweDEwMDA4YzIyKTsKKwl9CisJcnRsX3NldF9iYnJlZyhodywgMHhlMzgsIEJNQVNLRFdPUkQsIDB4ODIxNDAxMDIpOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTNjLCBCTUFTS0RXT1JELCAweDI4MTYwMjA2KTsKKwkvKiBwYXRoLUIgSVFLIHNldHRpbmcgKi8KKwlpZiAoY29uZmlncGF0aGIpIHsKKwkJcnRsX3NldF9iYnJlZyhodywgMHhlNTAsIEJNQVNLRFdPUkQsIDB4MTAwMDhjMjIpOworCQlydGxfc2V0X2JicmVnKGh3LCAweGU1NCwgQk1BU0tEV09SRCwgMHgxMDAwOGMyMik7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTU4LCBCTUFTS0RXT1JELCAweDgyMTQwMTAyKTsKKwkJcnRsX3NldF9iYnJlZyhodywgMHhlNWMsIEJNQVNLRFdPUkQsIDB4MjgxNjAyMDYpOworCX0KKwkvKiBMTyBjYWxpYnJhdGlvbiBzZXR0aW5nICovCisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiTE8gY2FsaWJyYXRpb24gc2V0dGluZyFcbiIpKTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGU0YywgQk1BU0tEV09SRCwgMHgwMDQ2MjkxMSk7CisJLyogT25lIHNob3QsIHBhdGggQSBMT0sgJiBJUUsgKi8KKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJPbmUgc2hvdCwgcGF0aCBBIExPSyAmIElRSyFcbiIpKTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGU0OCwgQk1BU0tEV09SRCwgMHhmOTAwMDAwMCk7CisJcnRsX3NldF9iYnJlZyhodywgMHhlNDgsIEJNQVNLRFdPUkQsIDB4ZjgwMDAwMDApOworCS8qIGRlbGF5IHggbXMgKi8KKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywKKwkJKCJEZWxheSAlZCBtcyBmb3IgT25lIHNob3QsIHBhdGggQSBMT0sgJiBJUUsuXG4iLAorCQlJUUtfREVMQVlfVElNRSkpOworCW1kZWxheShJUUtfREVMQVlfVElNRSk7CisJLyogQ2hlY2sgZmFpbGVkICovCisJcmVnZWFjID0gcnRsX2dldF9iYnJlZyhodywgMHhlYWMsIEJNQVNLRFdPUkQpOworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIjB4ZWFjID0gMHgleFxuIiwgcmVnZWFjKSk7CisJcmVnZTk0ID0gcnRsX2dldF9iYnJlZyhodywgMHhlOTQsIEJNQVNLRFdPUkQpOworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIjB4ZTk0ID0gMHgleFxuIiwgcmVnZTk0KSk7CisJcmVnZTljID0gcnRsX2dldF9iYnJlZyhodywgMHhlOWMsIEJNQVNLRFdPUkQpOworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIjB4ZTljID0gMHgleFxuIiwgcmVnZTljKSk7CisJcmVnZWE0ID0gcnRsX2dldF9iYnJlZyhodywgMHhlYTQsIEJNQVNLRFdPUkQpOworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIjB4ZWE0ID0gMHgleFxuIiwgcmVnZWE0KSk7CisJaWYgKCEocmVnZWFjICYgQklUKDI4KSkgJiYgKCgocmVnZTk0ICYgMHgwM0ZGMDAwMCkgPj4gMTYpICE9IDB4MTQyKSAmJgorCSAgICAoKChyZWdlOWMgJiAweDAzRkYwMDAwKSA+PiAxNikgIT0gMHg0MikpCisJCXJlc3VsdCB8PSAweDAxOworCWVsc2UJCQkvKiBpZiBUeCBub3QgT0ssIGlnbm9yZSBSeCAqLworCQlyZXR1cm4gcmVzdWx0OworCS8qIGlmIFR4IGlzIE9LLCBjaGVjayB3aGV0aGVyIFJ4IGlzIE9LICovCisJaWYgKCEocmVnZWFjICYgQklUKDI3KSkgJiYgKCgocmVnZWE0ICYgMHgwM0ZGMDAwMCkgPj4gMTYpICE9IDB4MTMyKSAmJgorCSAgICAoKChyZWdlYWMgJiAweDAzRkYwMDAwKSA+PiAxNikgIT0gMHgzNikpCisJCXJlc3VsdCB8PSAweDAyOworCWVsc2UKKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiUGF0aCBBIFJ4IElRSyBmYWlsISFcbiIpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBiaXQwID0gMSA9PiBUeCBPSywgYml0MSA9IDEgPT4gUnggT0sgKi8KK3N0YXRpYyB1OCBfcnRsOTJkX3BoeV9wYXRoYV9pcWtfNWdfbm9ybWFsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgIGJvb2wgY29uZmlncGF0aGIpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwl1MzIgcmVnZWFjLCByZWdlOTQsIHJlZ2U5YywgcmVnZWE0OworCXU4IHJlc3VsdCA9IDA7CisJdTggaTsKKwl1OCByZXRyeWNvdW50ID0gMjsKKwl1MzIgVHhPS0JpdCA9IEJJVCgyOCksIFJ4T0tCaXQgPSBCSVQoMjcpOworCisJaWYgKHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPT0gMSkgewkvKiBQSFkxICovCisJCVR4T0tCaXQgPSBCSVQoMzEpOworCQlSeE9LQml0ID0gQklUKDMwKTsKKwl9CisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiUGF0aCBBIElRSyFcbiIpKTsKKwkvKiBwYXRoLUEgSVFLIHNldHRpbmcgKi8KKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJQYXRoLUEgSVFLIHNldHRpbmchXG4iKSk7CisJcnRsX3NldF9iYnJlZyhodywgMHhlMzAsIEJNQVNLRFdPUkQsIDB4MTgwMDhjMWYpOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTM0LCBCTUFTS0RXT1JELCAweDE4MDA4YzFmKTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGUzOCwgQk1BU0tEV09SRCwgMHg4MjE0MDMwNyk7CisJcnRsX3NldF9iYnJlZyhodywgMHhlM2MsIEJNQVNLRFdPUkQsIDB4NjgxNjA5NjApOworCS8qIHBhdGgtQiBJUUsgc2V0dGluZyAqLworCWlmIChjb25maWdwYXRoYikgeworCQlydGxfc2V0X2JicmVnKGh3LCAweGU1MCwgQk1BU0tEV09SRCwgMHgxODAwOGMyZik7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTU0LCBCTUFTS0RXT1JELCAweDE4MDA4YzJmKTsKKwkJcnRsX3NldF9iYnJlZyhodywgMHhlNTgsIEJNQVNLRFdPUkQsIDB4ODIxMTAwMDApOworCQlydGxfc2V0X2JicmVnKGh3LCAweGU1YywgQk1BU0tEV09SRCwgMHg2ODExMDAwMCk7CisJfQorCS8qIExPIGNhbGlicmF0aW9uIHNldHRpbmcgKi8KKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJMTyBjYWxpYnJhdGlvbiBzZXR0aW5nIVxuIikpOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTRjLCBCTUFTS0RXT1JELCAweDAwNDYyOTExKTsKKwkvKiBwYXRoLUEgUEEgb24gKi8KKwlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFCX1JGSU5URVJGQUNFU1csIEJNQVNLRFdPUkQsIDB4MDcwMDBmNjApOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQV9SRklOVEVSRkFDRU9FLCBCTUFTS0RXT1JELCAweDY2ZTYwZTMwKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmV0cnljb3VudDsgaSsrKSB7CisJCS8qIE9uZSBzaG90LCBwYXRoIEEgTE9LICYgSVFLICovCisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJKCJPbmUgc2hvdCwgcGF0aCBBIExPSyAmIElRSyFcbiIpKTsKKwkJcnRsX3NldF9iYnJlZyhodywgMHhlNDgsIEJNQVNLRFdPUkQsIDB4ZjkwMDAwMDApOworCQlydGxfc2V0X2JicmVnKGh3LCAweGU0OCwgQk1BU0tEV09SRCwgMHhmODAwMDAwMCk7CisJCS8qIGRlbGF5IHggbXMgKi8KKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCQkoIkRlbGF5ICVkIG1zIGZvciBPbmUgc2hvdCwgcGF0aCBBIExPSyAmIElRSy5cbiIsCisJCQlJUUtfREVMQVlfVElNRSkpOworCQltZGVsYXkoSVFLX0RFTEFZX1RJTUUgKiAxMCk7CisJCS8qIENoZWNrIGZhaWxlZCAqLworCQlyZWdlYWMgPSBydGxfZ2V0X2JicmVnKGh3LCAweGVhYywgQk1BU0tEV09SRCk7CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIjB4ZWFjID0gMHgleFxuIiwgcmVnZWFjKSk7CisJCXJlZ2U5NCA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZTk0LCBCTUFTS0RXT1JEKTsKKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiMHhlOTQgPSAweCV4XG4iLCByZWdlOTQpKTsKKwkJcmVnZTljID0gcnRsX2dldF9iYnJlZyhodywgMHhlOWMsIEJNQVNLRFdPUkQpOworCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCIweGU5YyA9IDB4JXhcbiIsIHJlZ2U5YykpOworCQlyZWdlYTQgPSBydGxfZ2V0X2JicmVnKGh3LCAweGVhNCwgQk1BU0tEV09SRCk7CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIjB4ZWE0ID0gMHgleFxuIiwgcmVnZWE0KSk7CisJCWlmICghKHJlZ2VhYyAmIFR4T0tCaXQpICYmCisJCSAgICAgKCgocmVnZTk0ICYgMHgwM0ZGMDAwMCkgPj4gMTYpICE9IDB4MTQyKSkgeworCQkJcmVzdWx0IHw9IDB4MDE7CisJCX0gZWxzZSB7IC8qIGlmIFR4IG5vdCBPSywgaWdub3JlIFJ4ICovCisJCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywKKwkJCQkoIlBhdGggQSBUeCBJUUsgZmFpbCEhXG4iKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGlmIFR4IGlzIE9LLCBjaGVjayB3aGV0aGVyIFJ4IGlzIE9LICovCisJCWlmICghKHJlZ2VhYyAmIFJ4T0tCaXQpICYmCisJCSAgICAoKChyZWdlYTQgJiAweDAzRkYwMDAwKSA+PiAxNikgIT0gMHgxMzIpKSB7CisJCQlyZXN1bHQgfD0gMHgwMjsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCQkJKCJQYXRoIEEgUnggSVFLIGZhaWwhIVxuIikpOworCQl9CisJfQorCS8qIHBhdGggQSBQQSBvZmYgKi8KKwlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFCX1JGSU5URVJGQUNFU1csIEJNQVNLRFdPUkQsCisJCSAgICAgIHJ0bHBoeS0+aXFrX2JiX2JhY2t1cFswXSk7CisJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBX1JGSU5URVJGQUNFT0UsIEJNQVNLRFdPUkQsCisJCSAgICAgIHJ0bHBoeS0+aXFrX2JiX2JhY2t1cFsxXSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogYml0MCA9IDEgPT4gVHggT0ssIGJpdDEgPSAxID0+IFJ4IE9LICovCitzdGF0aWMgdTggX3J0bDkyZF9waHlfcGF0aGJfaXFrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgcmVnZWFjLCByZWdlYjQsIHJlZ2ViYywgcmVnZWM0LCByZWdlY2M7CisJdTggcmVzdWx0ID0gMDsKKworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIlBhdGggQiBJUUshXG4iKSk7CisJLyogT25lIHNob3QsIHBhdGggQiBMT0sgJiBJUUsgKi8KKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJPbmUgc2hvdCwgcGF0aCBBIExPSyAmIElRSyFcbiIpKTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGU2MCwgQk1BU0tEV09SRCwgMHgwMDAwMDAwMik7CisJcnRsX3NldF9iYnJlZyhodywgMHhlNjAsIEJNQVNLRFdPUkQsIDB4MDAwMDAwMDApOworCS8qIGRlbGF5IHggbXMgICovCisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCSgiRGVsYXkgJWQgbXMgZm9yIE9uZSBzaG90LCBwYXRoIEIgTE9LICYgSVFLLlxuIiwKKwkJSVFLX0RFTEFZX1RJTUUpKTsKKwltZGVsYXkoSVFLX0RFTEFZX1RJTUUpOworCS8qIENoZWNrIGZhaWxlZCAqLworCXJlZ2VhYyA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWFjLCBCTUFTS0RXT1JEKTsKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCIweGVhYyA9IDB4JXhcbiIsIHJlZ2VhYykpOworCXJlZ2ViNCA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWI0LCBCTUFTS0RXT1JEKTsKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCIweGViNCA9IDB4JXhcbiIsIHJlZ2ViNCkpOworCXJlZ2ViYyA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWJjLCBCTUFTS0RXT1JEKTsKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCIweGViYyA9IDB4JXhcbiIsIHJlZ2ViYykpOworCXJlZ2VjNCA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWM0LCBCTUFTS0RXT1JEKTsKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCIweGVjNCA9IDB4JXhcbiIsIHJlZ2VjNCkpOworCXJlZ2VjYyA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWNjLCBCTUFTS0RXT1JEKTsKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCIweGVjYyA9IDB4JXhcbiIsIHJlZ2VjYykpOworCWlmICghKHJlZ2VhYyAmIEJJVCgzMSkpICYmICgoKHJlZ2ViNCAmIDB4MDNGRjAwMDApID4+IDE2KSAhPSAweDE0MikgJiYKKwkgICAgKCgocmVnZWJjICYgMHgwM0ZGMDAwMCkgPj4gMTYpICE9IDB4NDIpKQorCQlyZXN1bHQgfD0gMHgwMTsKKwllbHNlCisJCXJldHVybiByZXN1bHQ7CisJaWYgKCEocmVnZWFjICYgQklUKDMwKSkgJiYgKCgocmVnZWM0ICYgMHgwM0ZGMDAwMCkgPj4gMTYpICE9IDB4MTMyKSAmJgorCSAgICAoKChyZWdlY2MgJiAweDAzRkYwMDAwKSA+PiAxNikgIT0gMHgzNikpCisJCXJlc3VsdCB8PSAweDAyOworCWVsc2UKKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiUGF0aCBCIFJ4IElRSyBmYWlsISFcbiIpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBiaXQwID0gMSA9PiBUeCBPSywgYml0MSA9IDEgPT4gUnggT0sgKi8KK3N0YXRpYyB1OCBfcnRsOTJkX3BoeV9wYXRoYl9pcWtfNWdfbm9ybWFsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXUzMiByZWdlYWMsIHJlZ2ViNCwgcmVnZWJjLCByZWdlYzQsIHJlZ2VjYzsKKwl1OCByZXN1bHQgPSAwOworCXU4IGk7CisJdTggcmV0cnljb3VudCA9IDI7CisKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJQYXRoIEIgSVFLIVxuIikpOworCS8qIHBhdGgtQSBJUUsgc2V0dGluZyAqLworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIlBhdGgtQSBJUUsgc2V0dGluZyFcbiIpKTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGUzMCwgQk1BU0tEV09SRCwgMHgxODAwOGMxZik7CisJcnRsX3NldF9iYnJlZyhodywgMHhlMzQsIEJNQVNLRFdPUkQsIDB4MTgwMDhjMWYpOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTM4LCBCTUFTS0RXT1JELCAweDgyMTEwMDAwKTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGUzYywgQk1BU0tEV09SRCwgMHg2ODExMDAwMCk7CisKKwkvKiBwYXRoLUIgSVFLIHNldHRpbmcgKi8KKwlydGxfc2V0X2JicmVnKGh3LCAweGU1MCwgQk1BU0tEV09SRCwgMHgxODAwOGMyZik7CisJcnRsX3NldF9iYnJlZyhodywgMHhlNTQsIEJNQVNLRFdPUkQsIDB4MTgwMDhjMmYpOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTU4LCBCTUFTS0RXT1JELCAweDgyMTQwMzA3KTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGU1YywgQk1BU0tEV09SRCwgMHg2ODE2MDk2MCk7CisKKwkvKiBMTyBjYWxpYnJhdGlvbiBzZXR0aW5nICovCisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiTE8gY2FsaWJyYXRpb24gc2V0dGluZyFcbiIpKTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGU0YywgQk1BU0tEV09SRCwgMHgwMDQ2MjkxMSk7CisKKwkvKiBwYXRoLUIgUEEgb24gKi8KKwlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFCX1JGSU5URVJGQUNFU1csIEJNQVNLRFdPUkQsIDB4MGY2MDA3MDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQl9SRklOVEVSRkFDRU9FLCBCTUFTS0RXT1JELCAweDA2MWYwZDMwKTsKKworCWZvciAoaSA9IDA7IGkgPCByZXRyeWNvdW50OyBpKyspIHsKKwkJLyogT25lIHNob3QsIHBhdGggQiBMT0sgJiBJUUsgKi8KKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCQkoIk9uZSBzaG90LCBwYXRoIEEgTE9LICYgSVFLIVxuIikpOworCQlydGxfc2V0X2JicmVnKGh3LCAweGU0OCwgQk1BU0tEV09SRCwgMHhmYTAwMDAwMCk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTQ4LCBCTUFTS0RXT1JELCAweGY4MDAwMDAwKTsKKworCQkvKiBkZWxheSB4IG1zICovCisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJKCJEZWxheSAlZCBtcyBmb3IgT25lIHNob3QsIHBhdGggQiBMT0sgJiBJUUsuXG4iLCAxMCkpOworCQltZGVsYXkoSVFLX0RFTEFZX1RJTUUgKiAxMCk7CisKKwkJLyogQ2hlY2sgZmFpbGVkICovCisJCXJlZ2VhYyA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWFjLCBCTUFTS0RXT1JEKTsKKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiMHhlYWMgPSAweCV4XG4iLCByZWdlYWMpKTsKKwkJcmVnZWI0ID0gcnRsX2dldF9iYnJlZyhodywgMHhlYjQsIEJNQVNLRFdPUkQpOworCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCIweGViNCA9IDB4JXhcbiIsIHJlZ2ViNCkpOworCQlyZWdlYmMgPSBydGxfZ2V0X2JicmVnKGh3LCAweGViYywgQk1BU0tEV09SRCk7CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIjB4ZWJjID0gMHgleFxuIiwgcmVnZWJjKSk7CisJCXJlZ2VjNCA9IHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWM0LCBCTUFTS0RXT1JEKTsKKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiMHhlYzQgPSAweCV4XG4iLCByZWdlYzQpKTsKKwkJcmVnZWNjID0gcnRsX2dldF9iYnJlZyhodywgMHhlY2MsIEJNQVNLRFdPUkQpOworCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCIweGVjYyA9IDB4JXhcbiIsIHJlZ2VjYykpOworCQlpZiAoIShyZWdlYWMgJiBCSVQoMzEpKSAmJgorCQkgICAgKCgocmVnZWI0ICYgMHgwM0ZGMDAwMCkgPj4gMTYpICE9IDB4MTQyKSkKKwkJCXJlc3VsdCB8PSAweDAxOworCQllbHNlCisJCQljb250aW51ZTsKKwkJaWYgKCEocmVnZWFjICYgQklUKDMwKSkgJiYKKwkJICAgICgoKHJlZ2VjNCAmIDB4MDNGRjAwMDApID4+IDE2KSAhPSAweDEzMikpIHsKKwkJCXJlc3VsdCB8PSAweDAyOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywKKwkJCQkoIlBhdGggQiBSeCBJUUsgZmFpbCEhXG4iKSk7CisJCX0KKwl9CisKKwkvKiBwYXRoIEIgUEEgb2ZmICovCisJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBQl9SRklOVEVSRkFDRVNXLCBCTUFTS0RXT1JELAorCQkgICAgICBydGxwaHktPmlxa19iYl9iYWNrdXBbMF0pOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQl9SRklOVEVSRkFDRU9FLCBCTUFTS0RXT1JELAorCQkgICAgICBydGxwaHktPmlxa19iYl9iYWNrdXBbMl0pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X3NhdmVfYWRkYV9yZWdpc3RlcnMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICB1MzIgKmFkZGFfcmVnLCB1MzIgKmFkZGFfYmFja3VwLAorCQkJCQkgICAgdTMyIHJlZ251bSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIGk7CisKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJTYXZlIEFEREEgcGFyYW1ldGVycy5cbiIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVnbnVtOyBpKyspCisJCWFkZGFfYmFja3VwW2ldID0gcnRsX2dldF9iYnJlZyhodywgYWRkYV9yZWdbaV0sIEJNQVNLRFdPUkQpOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkX3BoeV9zYXZlX21hY19yZWdpc3RlcnMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJdTMyICptYWNyZWcsIHUzMiAqbWFjYmFja3VwKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgaTsKKworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIlNhdmUgTUFDIHBhcmFtZXRlcnMuXG4iKSk7CisJZm9yIChpID0gMDsgaSA8IChJUUtfTUFDX1JFR19OVU0gLSAxKTsgaSsrKQorCQltYWNiYWNrdXBbaV0gPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIG1hY3JlZ1tpXSk7CisJbWFjYmFja3VwW2ldID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgbWFjcmVnW2ldKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF9waHlfcmVsb2FkX2FkZGFfcmVnaXN0ZXJzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgICAgICB1MzIgKmFkZGFfcmVnLCB1MzIgKmFkZGFfYmFja3VwLAorCQkJCQkgICAgICB1MzIgcmVnbnVtKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgaTsKKworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkoIlJlbG9hZCBBRERBIHBvd2VyIHNhdmluZyBwYXJhbWV0ZXJzICFcbiIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVnbnVtOyBpKyspCisJCXJ0bF9zZXRfYmJyZWcoaHcsIGFkZGFfcmVnW2ldLCBCTUFTS0RXT1JELCBhZGRhX2JhY2t1cFtpXSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X3JlbG9hZF9tYWNfcmVnaXN0ZXJzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgICAgIHUzMiAqbWFjcmVnLCB1MzIgKm1hY2JhY2t1cCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIGk7CisKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJSZWxvYWQgTUFDIHBhcmFtZXRlcnMgIVxuIikpOworCWZvciAoaSA9IDA7IGkgPCAoSVFLX01BQ19SRUdfTlVNIC0gMSk7IGkrKykKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgbWFjcmVnW2ldLCAodTgpIG1hY2JhY2t1cFtpXSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgbWFjcmVnW2ldLCBtYWNiYWNrdXBbaV0pOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkX3BoeV9wYXRoX2FkZGFfb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCXUzMiAqYWRkYV9yZWcsIGJvb2wgcGF0aGFfb24sIGJvb2wgaXMydCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIHBhdGhvbjsKKwl1MzIgaTsKKworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIkFEREEgT04uXG4iKSk7CisJcGF0aG9uID0gcGF0aGFfb24gPyAweDA0ZGIyNWE0IDogMHgwYjFiMjVhNDsKKwlpZiAocGF0aGFfb24pCisJCXBhdGhvbiA9IHJ0bHByaXYtPnJ0bGhhbC5pbnRlcmZhY2VpbmRleCA9PSAwID8KKwkJICAgIDB4MDRkYjI1YTQgOiAweDBiMWIyNWE0OworCWZvciAoaSA9IDA7IGkgPCBJUUtfQUREQV9SRUdfTlVNOyBpKyspCisJCXJ0bF9zZXRfYmJyZWcoaHcsIGFkZGFfcmVnW2ldLCBCTUFTS0RXT1JELCBwYXRob24pOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkX3BoeV9tYWNfc2V0dGluZ19jYWxpYnJhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJCXUzMiAqbWFjcmVnLCB1MzIgKm1hY2JhY2t1cCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTMyIGk7CisKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJNQUMgc2V0dGluZ3MgZm9yIENhbGlicmF0aW9uLlxuIikpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIG1hY3JlZ1swXSwgMHgzRik7CisKKwlmb3IgKGkgPSAxOyBpIDwgKElRS19NQUNfUkVHX05VTSAtIDEpOyBpKyspCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIG1hY3JlZ1tpXSwgKHU4KShtYWNiYWNrdXBbaV0gJgorCQkJICAgICAgICh+QklUKDMpKSkpOworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIG1hY3JlZ1tpXSwgKHU4KSAobWFjYmFja3VwW2ldICYgKH5CSVQoNSkpKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X3BhdGhhX3N0YW5kYnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIlBhdGgtQSBzdGFuZGJ5IG1vZGUhXG4iKSk7CisKKwlydGxfc2V0X2JicmVnKGh3LCAweGUyOCwgQk1BU0tEV09SRCwgMHgwKTsKKwlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFfTFNTSVBBUkFNRVRFUiwgQk1BU0tEV09SRCwgMHgwMDAxMDAwMCk7CisJcnRsX3NldF9iYnJlZyhodywgMHhlMjgsIEJNQVNLRFdPUkQsIDB4ODA4MDAwMDApOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkX3BoeV9waW1vZGVfc3dpdGNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIHBpX21vZGUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBtb2RlOworCisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCSgiQkIgU3dpdGNoIHRvICVzIG1vZGUhXG4iLCAocGlfbW9kZSA/ICJQSSIgOiAiU0kiKSkpOworCW1vZGUgPSBwaV9tb2RlID8gMHgwMTAwMDEwMCA6IDB4MDEwMDAwMDA7CisJcnRsX3NldF9iYnJlZyhodywgMHg4MjAsIEJNQVNLRFdPUkQsIG1vZGUpOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ODI4LCBCTUFTS0RXT1JELCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF9waHlfaXFfY2FsaWJyYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBsb25nIHJlc3VsdFtdWzhdLAorCQkJCSAgICAgdTggdCwgYm9vbCBpczJ0KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXUzMiBpOworCXU4IHBhdGhhX29rLCBwYXRoYl9vazsKKwlzdGF0aWMgdTMyIGFkZGFfcmVnW0lRS19BRERBX1JFR19OVU1dID0geworCQlSRlBHQTBfWENEX1NXSVRDSENPTlRST0wsIDB4ZTZjLCAweGU3MCwgMHhlNzQsCisJCTB4ZTc4LCAweGU3YywgMHhlODAsIDB4ZTg0LAorCQkweGU4OCwgMHhlOGMsIDB4ZWQwLCAweGVkNCwKKwkJMHhlZDgsIDB4ZWRjLCAweGVlMCwgMHhlZWMKKwl9OworCXN0YXRpYyB1MzIgaXFrX21hY19yZWdbSVFLX01BQ19SRUdfTlVNXSA9IHsKKwkJMHg1MjIsIDB4NTUwLCAweDU1MSwgMHgwNDAKKwl9OworCXN0YXRpYyB1MzIgaXFrX2JiX3JlZ1tJUUtfQkJfUkVHX05VTV0gPSB7CisJCVJGUEdBMF9YQUJfUkZJTlRFUkZBQ0VTVywgUkZQR0EwX1hBX1JGSU5URVJGQUNFT0UsCisJCVJGUEdBMF9YQl9SRklOVEVSRkFDRU9FLCBST0ZETTBfVFJNVVhQQVIsCisJCVJGUEdBMF9YQ0RfUkZJTlRFUkZBQ0VTVywgUk9GRE0wX1RSWFBBVEhFTkFCTEUsCisJCVJGUEdBMF9SRk1PRCwgUkZQR0EwX0FOQUxPR1BBUkFNRVRFUjQsCisJCVJPRkRNMF9YQUFHQ0NPUkUxLCBST0ZETTBfWEJBR0NDT1JFMQorCX07CisJY29uc3QgdTMyIHJldHJ5Y291bnQgPSAyOworCXUzMiBiYnZhbHVlOworCisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiSVFLIGZvciAyLjRHIDpTdGFydCEhIVxuIikpOworCWlmICh0ID09IDApIHsKKwkJYmJ2YWx1ZSA9IHJ0bF9nZXRfYmJyZWcoaHcsIFJGUEdBMF9SRk1PRCwgQk1BU0tEV09SRCk7CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIj09PjB4JTA4eFxuIiwgYmJ2YWx1ZSkpOworCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJJUSBDYWxpYnJhdGlvbiBmb3IgJXNcbiIsCisJCQkoaXMydCA/ICIyVDJSIiA6ICIxVDFSIikpKTsKKworCQkvKiAgU2F2ZSBBRERBIHBhcmFtZXRlcnMsIHR1cm4gUGF0aCBBIEFEREEgb24gKi8KKwkJX3J0bDkyZF9waHlfc2F2ZV9hZGRhX3JlZ2lzdGVycyhodywgYWRkYV9yZWcsCisJCQlydGxwaHktPmFkZGFfYmFja3VwLCBJUUtfQUREQV9SRUdfTlVNKTsKKwkJX3J0bDkyZF9waHlfc2F2ZV9tYWNfcmVnaXN0ZXJzKGh3LCBpcWtfbWFjX3JlZywKKwkJCXJ0bHBoeS0+aXFrX21hY19iYWNrdXApOworCQlfcnRsOTJkX3BoeV9zYXZlX2FkZGFfcmVnaXN0ZXJzKGh3LCBpcWtfYmJfcmVnLAorCQkJcnRscGh5LT5pcWtfYmJfYmFja3VwLCBJUUtfQkJfUkVHX05VTSk7CisJfQorCV9ydGw5MmRfcGh5X3BhdGhfYWRkYV9vbihodywgYWRkYV9yZWcsIHRydWUsIGlzMnQpOworCWlmICh0ID09IDApCisJCXJ0bHBoeS0+cmZwaV9lbmFibGUgPSAodTgpIHJ0bF9nZXRfYmJyZWcoaHcsCisJCQkJUkZQR0EwX1hBX0hTU0lQQVJBTUVURVIxLCBCSVQoOCkpOworCisJLyogIFN3aXRjaCBCQiB0byBQSSBtb2RlIHRvIGRvIElRIENhbGlicmF0aW9uLiAqLworCWlmICghcnRscGh5LT5yZnBpX2VuYWJsZSkKKwkJX3J0bDkyZF9waHlfcGltb2RlX3N3aXRjaChodywgdHJ1ZSk7CisKKwlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfUkZNT0QsIEJJVCgyNCksIDB4MDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9UUlhQQVRIRU5BQkxFLCBCTUFTS0RXT1JELCAweDAzYTA1NjAwKTsKKwlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfVFJNVVhQQVIsIEJNQVNLRFdPUkQsIDB4MDAwODAwZTQpOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQ0RfUkZJTlRFUkZBQ0VTVywgQk1BU0tEV09SRCwgMHgyMjIwNDAwMCk7CisJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX0FOQUxPR1BBUkFNRVRFUjQsIDB4ZjAwMDAwLCAweDBmKTsKKwlpZiAoaXMydCkgeworCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFfTFNTSVBBUkFNRVRFUiwgQk1BU0tEV09SRCwKKwkJCSAgICAgIDB4MDAwMTAwMDApOworCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEJfTFNTSVBBUkFNRVRFUiwgQk1BU0tEV09SRCwKKwkJCSAgICAgIDB4MDAwMTAwMDApOworCX0KKwkvKiBNQUMgc2V0dGluZ3MgKi8KKwlfcnRsOTJkX3BoeV9tYWNfc2V0dGluZ19jYWxpYnJhdGlvbihodywgaXFrX21hY19yZWcsCisJCQkJCSAgICBydGxwaHktPmlxa19tYWNfYmFja3VwKTsKKwkvKiBQYWdlIEIgaW5pdCAqLworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4YjY4LCBCTUFTS0RXT1JELCAweDBmNjAwMDAwKTsKKwlpZiAoaXMydCkKKwkJcnRsX3NldF9iYnJlZyhodywgMHhiNmMsIEJNQVNLRFdPUkQsIDB4MGY2MDAwMDApOworCS8qIElRIGNhbGlicmF0aW9uIHNldHRpbmcgKi8KKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJJUUsgc2V0dGluZyFcbiIpKTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGUyOCwgQk1BU0tEV09SRCwgMHg4MDgwMDAwMCk7CisJcnRsX3NldF9iYnJlZyhodywgMHhlNDAsIEJNQVNLRFdPUkQsIDB4MDEwMDdjMDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTQ0LCBCTUFTS0RXT1JELCAweDAxMDA0ODAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmV0cnljb3VudDsgaSsrKSB7CisJCXBhdGhhX29rID0gX3J0bDkyZF9waHlfcGF0aGFfaXFrKGh3LCBpczJ0KTsKKwkJaWYgKHBhdGhhX29rID09IDB4MDMpIHsKKwkJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJCSgiUGF0aCBBIElRSyBTdWNjZXNzISFcbiIpKTsKKwkJCXJlc3VsdFt0XVswXSA9IChydGxfZ2V0X2JicmVnKGh3LCAweGU5NCwgQk1BU0tEV09SRCkgJgorCQkJCQkweDNGRjAwMDApID4+IDE2OworCQkJcmVzdWx0W3RdWzFdID0gKHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZTljLCBCTUFTS0RXT1JEKSAmCisJCQkJCTB4M0ZGMDAwMCkgPj4gMTY7CisJCQlyZXN1bHRbdF1bMl0gPSAocnRsX2dldF9iYnJlZyhodywgMHhlYTQsIEJNQVNLRFdPUkQpICYKKwkJCQkJMHgzRkYwMDAwKSA+PiAxNjsKKwkJCXJlc3VsdFt0XVszXSA9IChydGxfZ2V0X2JicmVnKGh3LCAweGVhYywgQk1BU0tEV09SRCkgJgorCQkJCQkweDNGRjAwMDApID4+IDE2OworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoaSA9PSAocmV0cnljb3VudCAtIDEpICYmIHBhdGhhX29rID09IDB4MDEpIHsKKwkJCS8qIFR4IElRSyBPSyAqLworCQkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCQkJKCJQYXRoIEEgSVFLIE9ubHkgIFR4IFN1Y2Nlc3MhIVxuIikpOworCisJCQlyZXN1bHRbdF1bMF0gPSAocnRsX2dldF9iYnJlZyhodywgMHhlOTQsIEJNQVNLRFdPUkQpICYKKwkJCQkJMHgzRkYwMDAwKSA+PiAxNjsKKwkJCXJlc3VsdFt0XVsxXSA9IChydGxfZ2V0X2JicmVnKGh3LCAweGU5YywgQk1BU0tEV09SRCkgJgorCQkJCQkweDNGRjAwMDApID4+IDE2OworCQl9CisJfQorCWlmICgweDAwID09IHBhdGhhX29rKQorCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJQYXRoIEEgSVFLIGZhaWxlZCEhXG4iKSk7CisJaWYgKGlzMnQpIHsKKwkJX3J0bDkyZF9waHlfcGF0aGFfc3RhbmRieShodyk7CisJCS8qIFR1cm4gUGF0aCBCIEFEREEgb24gKi8KKwkJX3J0bDkyZF9waHlfcGF0aF9hZGRhX29uKGh3LCBhZGRhX3JlZywgZmFsc2UsIGlzMnQpOworCQlmb3IgKGkgPSAwOyBpIDwgcmV0cnljb3VudDsgaSsrKSB7CisJCQlwYXRoYl9vayA9IF9ydGw5MmRfcGh5X3BhdGhiX2lxayhodyk7CisJCQlpZiAocGF0aGJfb2sgPT0gMHgwMykgeworCQkJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJCQkoIlBhdGggQiBJUUsgU3VjY2VzcyEhXG4iKSk7CisJCQkJcmVzdWx0W3RdWzRdID0gKHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWI0LAorCQkJCQkgICAgICAgQk1BU0tEV09SRCkgJiAweDNGRjAwMDApID4+IDE2OworCQkJCXJlc3VsdFt0XVs1XSA9IChydGxfZ2V0X2JicmVnKGh3LCAweGViYywKKwkJCQkJICAgICAgIEJNQVNLRFdPUkQpICYgMHgzRkYwMDAwKSA+PiAxNjsKKwkJCQlyZXN1bHRbdF1bNl0gPSAocnRsX2dldF9iYnJlZyhodywgMHhlYzQsCisJCQkJCSAgICAgICBCTUFTS0RXT1JEKSAmIDB4M0ZGMDAwMCkgPj4gMTY7CisJCQkJcmVzdWx0W3RdWzddID0gKHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWNjLAorCQkJCQkgICAgICAgQk1BU0tEV09SRCkgJiAweDNGRjAwMDApID4+IDE2OworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChpID09IChyZXRyeWNvdW50IC0gMSkgJiYgcGF0aGJfb2sgPT0gMHgwMSkgeworCQkJCS8qIFR4IElRSyBPSyAqLworCQkJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJCQkoIlBhdGggQiBPbmx5IFR4IElRSyBTdWNjZXNzISFcbiIpKTsKKwkJCQlyZXN1bHRbdF1bNF0gPSAocnRsX2dldF9iYnJlZyhodywgMHhlYjQsCisJCQkJCSAgICAgICBCTUFTS0RXT1JEKSAmIDB4M0ZGMDAwMCkgPj4gMTY7CisJCQkJcmVzdWx0W3RdWzVdID0gKHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWJjLAorCQkJCQkgICAgICAgQk1BU0tEV09SRCkgJiAweDNGRjAwMDApID4+IDE2OworCQkJfQorCQl9CisJCWlmICgweDAwID09IHBhdGhiX29rKQorCQkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCQkJKCJQYXRoIEIgSVFLIGZhaWxlZCEhXG4iKSk7CisJfQorCisJLyogQmFjayB0byBCQiBtb2RlLCBsb2FkIG9yaWdpbmFsIHZhbHVlICovCisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCSgiSVFLOkJhY2sgdG8gQkIgbW9kZSwgbG9hZCBvcmlnaW5hbCB2YWx1ZSFcbiIpKTsKKworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTI4LCBCTUFTS0RXT1JELCAwKTsKKwlpZiAodCAhPSAwKSB7CisJCS8qIFN3aXRjaCBiYWNrIEJCIHRvIFNJIG1vZGUgYWZ0ZXIgZmluaXNoIElRIENhbGlicmF0aW9uLiAqLworCQlpZiAoIXJ0bHBoeS0+cmZwaV9lbmFibGUpCisJCQlfcnRsOTJkX3BoeV9waW1vZGVfc3dpdGNoKGh3LCBmYWxzZSk7CisJCS8qIFJlbG9hZCBBRERBIHBvd2VyIHNhdmluZyBwYXJhbWV0ZXJzICovCisJCV9ydGw5MmRfcGh5X3JlbG9hZF9hZGRhX3JlZ2lzdGVycyhodywgYWRkYV9yZWcsCisJCQkJcnRscGh5LT5hZGRhX2JhY2t1cCwgSVFLX0FEREFfUkVHX05VTSk7CisJCS8qIFJlbG9hZCBNQUMgcGFyYW1ldGVycyAqLworCQlfcnRsOTJkX3BoeV9yZWxvYWRfbWFjX3JlZ2lzdGVycyhodywgaXFrX21hY19yZWcsCisJCQkJCXJ0bHBoeS0+aXFrX21hY19iYWNrdXApOworCQlpZiAoaXMydCkKKwkJCV9ydGw5MmRfcGh5X3JlbG9hZF9hZGRhX3JlZ2lzdGVycyhodywgaXFrX2JiX3JlZywKKwkJCQkJCQkgIHJ0bHBoeS0+aXFrX2JiX2JhY2t1cCwKKwkJCQkJCQkgIElRS19CQl9SRUdfTlVNKTsKKwkJZWxzZQorCQkJX3J0bDkyZF9waHlfcmVsb2FkX2FkZGFfcmVnaXN0ZXJzKGh3LCBpcWtfYmJfcmVnLAorCQkJCQkJCSAgcnRscGh5LT5pcWtfYmJfYmFja3VwLAorCQkJCQkJCSAgSVFLX0JCX1JFR19OVU0gLSAxKTsKKwkJLyogbG9hZCAweGUzMCBJUUMgZGVmYXVsdCB2YWx1ZSAqLworCQlydGxfc2V0X2JicmVnKGh3LCAweGUzMCwgQk1BU0tEV09SRCwgMHgwMTAwOGMwMCk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTM0LCBCTUFTS0RXT1JELCAweDAxMDA4YzAwKTsKKwl9CisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiPD09XG4iKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X2lxX2NhbGlicmF0ZV81Z19ub3JtYWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICAgICBsb25nIHJlc3VsdFtdWzhdLCB1OCB0KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSAmKHJ0bHByaXYtPnJ0bGhhbCk7CisJdTggcGF0aGFfb2ssIHBhdGhiX29rOworCXN0YXRpYyB1MzIgYWRkYV9yZWdbSVFLX0FEREFfUkVHX05VTV0gPSB7CisJCVJGUEdBMF9YQ0RfU1dJVENIQ09OVFJPTCwgMHhlNmMsIDB4ZTcwLCAweGU3NCwKKwkJMHhlNzgsIDB4ZTdjLCAweGU4MCwgMHhlODQsCisJCTB4ZTg4LCAweGU4YywgMHhlZDAsIDB4ZWQ0LAorCQkweGVkOCwgMHhlZGMsIDB4ZWUwLCAweGVlYworCX07CisJc3RhdGljIHUzMiBpcWtfbWFjX3JlZ1tJUUtfTUFDX1JFR19OVU1dID0geworCQkweDUyMiwgMHg1NTAsIDB4NTUxLCAweDA0MAorCX07CisJc3RhdGljIHUzMiBpcWtfYmJfcmVnW0lRS19CQl9SRUdfTlVNXSA9IHsKKwkJUkZQR0EwX1hBQl9SRklOVEVSRkFDRVNXLCBSRlBHQTBfWEFfUkZJTlRFUkZBQ0VPRSwKKwkJUkZQR0EwX1hCX1JGSU5URVJGQUNFT0UsIFJPRkRNMF9UUk1VWFBBUiwKKwkJUkZQR0EwX1hDRF9SRklOVEVSRkFDRVNXLCBST0ZETTBfVFJYUEFUSEVOQUJMRSwKKwkJUkZQR0EwX1JGTU9ELCBSRlBHQTBfQU5BTE9HUEFSQU1FVEVSNCwKKwkJUk9GRE0wX1hBQUdDQ09SRTEsIFJPRkRNMF9YQkFHQ0NPUkUxCisJfTsKKwl1MzIgYmJ2YWx1ZTsKKwlib29sIGlzMnQgPSBJU185MkRfU0lOR0xFUEhZKHJ0bGhhbC0+dmVyc2lvbik7CisKKwkvKiBOb3RlOiBJUSBjYWxpYnJhdGlvbiBtdXN0IGJlIHBlcmZvcm1lZCBhZnRlciBsb2FkaW5nCisJICogUEhZX1JFRy50eHQgLCBhbmQgcmFkaW9fYSwgcmFkaW9fYi50eHQgKi8KKworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIklRSyBmb3IgNUcgTk9STUFMOlN0YXJ0ISEhXG4iKSk7CisJbWRlbGF5KElRS19ERUxBWV9USU1FICogMjApOworCWlmICh0ID09IDApIHsKKwkJYmJ2YWx1ZSA9IHJ0bF9nZXRfYmJyZWcoaHcsIFJGUEdBMF9SRk1PRCwgQk1BU0tEV09SRCk7CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIj09PjB4JTA4eFxuIiwgYmJ2YWx1ZSkpOworCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJJUSBDYWxpYnJhdGlvbiBmb3IgJXNcbiIsCisJCQkoaXMydCA/ICIyVDJSIiA6ICIxVDFSIikpKTsKKwkJLyogU2F2ZSBBRERBIHBhcmFtZXRlcnMsIHR1cm4gUGF0aCBBIEFEREEgb24gKi8KKwkJX3J0bDkyZF9waHlfc2F2ZV9hZGRhX3JlZ2lzdGVycyhodywgYWRkYV9yZWcsCisJCQkJCQlydGxwaHktPmFkZGFfYmFja3VwLAorCQkJCQkJSVFLX0FEREFfUkVHX05VTSk7CisJCV9ydGw5MmRfcGh5X3NhdmVfbWFjX3JlZ2lzdGVycyhodywgaXFrX21hY19yZWcsCisJCQkJCSAgICAgICBydGxwaHktPmlxa19tYWNfYmFja3VwKTsKKwkJaWYgKGlzMnQpCisJCQlfcnRsOTJkX3BoeV9zYXZlX2FkZGFfcmVnaXN0ZXJzKGh3LCBpcWtfYmJfcmVnLAorCQkJCQkJCXJ0bHBoeS0+aXFrX2JiX2JhY2t1cCwKKwkJCQkJCQlJUUtfQkJfUkVHX05VTSk7CisJCWVsc2UKKwkJCV9ydGw5MmRfcGh5X3NhdmVfYWRkYV9yZWdpc3RlcnMoaHcsIGlxa19iYl9yZWcsCisJCQkJCQkJcnRscGh5LT5pcWtfYmJfYmFja3VwLAorCQkJCQkJCUlRS19CQl9SRUdfTlVNIC0gMSk7CisJfQorCV9ydGw5MmRfcGh5X3BhdGhfYWRkYV9vbihodywgYWRkYV9yZWcsIHRydWUsIGlzMnQpOworCS8qIE1BQyBzZXR0aW5ncyAqLworCV9ydGw5MmRfcGh5X21hY19zZXR0aW5nX2NhbGlicmF0aW9uKGh3LCBpcWtfbWFjX3JlZywKKwkJCXJ0bHBoeS0+aXFrX21hY19iYWNrdXApOworCWlmICh0ID09IDApCisJCXJ0bHBoeS0+cmZwaV9lbmFibGUgPSAodTgpIHJ0bF9nZXRfYmJyZWcoaHcsCisJCQlSRlBHQTBfWEFfSFNTSVBBUkFNRVRFUjEsIEJJVCg4KSk7CisJLyogIFN3aXRjaCBCQiB0byBQSSBtb2RlIHRvIGRvIElRIENhbGlicmF0aW9uLiAqLworCWlmICghcnRscGh5LT5yZnBpX2VuYWJsZSkKKwkJX3J0bDkyZF9waHlfcGltb2RlX3N3aXRjaChodywgdHJ1ZSk7CisJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1JGTU9ELCBCSVQoMjQpLCAweDAwKTsKKwlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfVFJYUEFUSEVOQUJMRSwgQk1BU0tEV09SRCwgMHgwM2EwNTYwMCk7CisJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1RSTVVYUEFSLCBCTUFTS0RXT1JELCAweDAwMDgwMGU0KTsKKwlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWENEX1JGSU5URVJGQUNFU1csIEJNQVNLRFdPUkQsIDB4MjIyMDgwMDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9BTkFMT0dQQVJBTUVURVI0LCAweGYwMDAwMCwgMHgwZik7CisKKwkvKiBQYWdlIEIgaW5pdCAqLworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4YjY4LCBCTUFTS0RXT1JELCAweDBmNjAwMDAwKTsKKwlpZiAoaXMydCkKKwkJcnRsX3NldF9iYnJlZyhodywgMHhiNmMsIEJNQVNLRFdPUkQsIDB4MGY2MDAwMDApOworCS8qIElRIGNhbGlicmF0aW9uIHNldHRpbmcgICovCisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiSVFLIHNldHRpbmchXG4iKSk7CisJcnRsX3NldF9iYnJlZyhodywgMHhlMjgsIEJNQVNLRFdPUkQsIDB4ODA4MDAwMDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4ZTQwLCBCTUFTS0RXT1JELCAweDEwMDA3YzAwKTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGU0NCwgQk1BU0tEV09SRCwgMHgwMTAwNDgwMCk7CisJcGF0aGFfb2sgPSBfcnRsOTJkX3BoeV9wYXRoYV9pcWtfNWdfbm9ybWFsKGh3LCBpczJ0KTsKKwlpZiAocGF0aGFfb2sgPT0gMHgwMykgeworCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJQYXRoIEEgSVFLIFN1Y2Nlc3MhIVxuIikpOworCQlyZXN1bHRbdF1bMF0gPSAocnRsX2dldF9iYnJlZyhodywgMHhlOTQsIEJNQVNLRFdPUkQpICYKKwkJCQkweDNGRjAwMDApID4+IDE2OworCQlyZXN1bHRbdF1bMV0gPSAocnRsX2dldF9iYnJlZyhodywgMHhlOWMsIEJNQVNLRFdPUkQpICYKKwkJCQkweDNGRjAwMDApID4+IDE2OworCQlyZXN1bHRbdF1bMl0gPSAocnRsX2dldF9iYnJlZyhodywgMHhlYTQsIEJNQVNLRFdPUkQpICYKKwkJCQkweDNGRjAwMDApID4+IDE2OworCQlyZXN1bHRbdF1bM10gPSAocnRsX2dldF9iYnJlZyhodywgMHhlYWMsIEJNQVNLRFdPUkQpICYKKwkJCQkweDNGRjAwMDApID4+IDE2OworCX0gZWxzZSBpZiAocGF0aGFfb2sgPT0gMHgwMSkgewkvKiBUeCBJUUsgT0sgKi8KKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCQkoIlBhdGggQSBJUUsgT25seSAgVHggU3VjY2VzcyEhXG4iKSk7CisKKwkJcmVzdWx0W3RdWzBdID0gKHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZTk0LCBCTUFTS0RXT1JEKSAmCisJCQkJMHgzRkYwMDAwKSA+PiAxNjsKKwkJcmVzdWx0W3RdWzFdID0gKHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZTljLCBCTUFTS0RXT1JEKSAmCisJCQkJMHgzRkYwMDAwKSA+PiAxNjsKKwl9IGVsc2UgeworCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJQYXRoIEEgSVFLIEZhaWwhIVxuIikpOworCX0KKwlpZiAoaXMydCkgeworCQkvKiBfcnRsOTJkX3BoeV9wYXRoYV9zdGFuZGJ5KGh3KTsgKi8KKwkJLyogVHVybiBQYXRoIEIgQUREQSBvbiAgKi8KKwkJX3J0bDkyZF9waHlfcGF0aF9hZGRhX29uKGh3LCBhZGRhX3JlZywgZmFsc2UsIGlzMnQpOworCQlwYXRoYl9vayA9IF9ydGw5MmRfcGh5X3BhdGhiX2lxa181Z19ub3JtYWwoaHcpOworCQlpZiAocGF0aGJfb2sgPT0gMHgwMykgeworCQkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCQkJKCJQYXRoIEIgSVFLIFN1Y2Nlc3MhIVxuIikpOworCQkJcmVzdWx0W3RdWzRdID0gKHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWI0LCBCTUFTS0RXT1JEKSAmCisJCQkgICAgIDB4M0ZGMDAwMCkgPj4gMTY7CisJCQlyZXN1bHRbdF1bNV0gPSAocnRsX2dldF9iYnJlZyhodywgMHhlYmMsIEJNQVNLRFdPUkQpICYKKwkJCSAgICAgMHgzRkYwMDAwKSA+PiAxNjsKKwkJCXJlc3VsdFt0XVs2XSA9IChydGxfZ2V0X2JicmVnKGh3LCAweGVjNCwgQk1BU0tEV09SRCkgJgorCQkJICAgICAweDNGRjAwMDApID4+IDE2OworCQkJcmVzdWx0W3RdWzddID0gKHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWNjLCBCTUFTS0RXT1JEKSAmCisJCQkgICAgIDB4M0ZGMDAwMCkgPj4gMTY7CisJCX0gZWxzZSBpZiAocGF0aGJfb2sgPT0gMHgwMSkgeyAvKiBUeCBJUUsgT0sgKi8KKwkJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJCSgiUGF0aCBCIE9ubHkgVHggSVFLIFN1Y2Nlc3MhIVxuIikpOworCQkJcmVzdWx0W3RdWzRdID0gKHJ0bF9nZXRfYmJyZWcoaHcsIDB4ZWI0LCBCTUFTS0RXT1JEKSAmCisJCQkgICAgIDB4M0ZGMDAwMCkgPj4gMTY7CisJCQlyZXN1bHRbdF1bNV0gPSAocnRsX2dldF9iYnJlZyhodywgMHhlYmMsIEJNQVNLRFdPUkQpICYKKwkJCSAgICAgMHgzRkYwMDAwKSA+PiAxNjsKKwkJfSBlbHNlIHsKKwkJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJCSgiUGF0aCBCIElRSyBmYWlsZWQhIVxuIikpOworCQl9CisJfQorCisJLyogQmFjayB0byBCQiBtb2RlLCBsb2FkIG9yaWdpbmFsIHZhbHVlICovCisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCSgiSVFLOkJhY2sgdG8gQkIgbW9kZSwgbG9hZCBvcmlnaW5hbCB2YWx1ZSFcbiIpKTsKKwlydGxfc2V0X2JicmVnKGh3LCAweGUyOCwgQk1BU0tEV09SRCwgMCk7CisJaWYgKHQgIT0gMCkgeworCQlpZiAoaXMydCkKKwkJCV9ydGw5MmRfcGh5X3JlbG9hZF9hZGRhX3JlZ2lzdGVycyhodywgaXFrX2JiX3JlZywKKwkJCQkJCQkgIHJ0bHBoeS0+aXFrX2JiX2JhY2t1cCwKKwkJCQkJCQkgIElRS19CQl9SRUdfTlVNKTsKKwkJZWxzZQorCQkJX3J0bDkyZF9waHlfcmVsb2FkX2FkZGFfcmVnaXN0ZXJzKGh3LCBpcWtfYmJfcmVnLAorCQkJCQkJCSAgcnRscGh5LT5pcWtfYmJfYmFja3VwLAorCQkJCQkJCSAgSVFLX0JCX1JFR19OVU0gLSAxKTsKKwkJLyogUmVsb2FkIE1BQyBwYXJhbWV0ZXJzICovCisJCV9ydGw5MmRfcGh5X3JlbG9hZF9tYWNfcmVnaXN0ZXJzKGh3LCBpcWtfbWFjX3JlZywKKwkJCQlydGxwaHktPmlxa19tYWNfYmFja3VwKTsKKwkJLyogIFN3aXRjaCBiYWNrIEJCIHRvIFNJIG1vZGUgYWZ0ZXIgZmluaXNoIElRIENhbGlicmF0aW9uLiAqLworCQlpZiAoIXJ0bHBoeS0+cmZwaV9lbmFibGUpCisJCQlfcnRsOTJkX3BoeV9waW1vZGVfc3dpdGNoKGh3LCBmYWxzZSk7CisJCS8qIFJlbG9hZCBBRERBIHBvd2VyIHNhdmluZyBwYXJhbWV0ZXJzICovCisJCV9ydGw5MmRfcGh5X3JlbG9hZF9hZGRhX3JlZ2lzdGVycyhodywgYWRkYV9yZWcsCisJCQkJCQkgIHJ0bHBoeS0+YWRkYV9iYWNrdXAsCisJCQkJCQkgIElRS19BRERBX1JFR19OVU0pOworCX0KKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCI8PT1cbiIpKTsKK30KKworc3RhdGljIGJvb2wgX3J0bDkyZF9waHlfc2ltdWxhcml0eV9jb21wYXJlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCWxvbmcgcmVzdWx0W11bOF0sIHU4IGMxLCB1OCBjMikKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9ICYocnRscHJpdi0+cnRsaGFsKTsKKwl1MzIgaSwgaiwgZGlmZiwgc2ltX2JpdG1hcCwgYm91bmQ7CisJdTggZmluYWxfY2FuZGlkYXRlWzJdID0gezB4RkYsIDB4RkZ9OwkvKiBmb3IgcGF0aCBBIGFuZCBwYXRoIEIgKi8KKwlib29sIGJyZXN1bHQgPSB0cnVlOworCWJvb2wgaXMydCA9IElTXzkyRF9TSU5HTEVQSFkocnRsaGFsLT52ZXJzaW9uKTsKKworCWlmIChpczJ0KQorCQlib3VuZCA9IDg7CisJZWxzZQorCQlib3VuZCA9IDQ7CisJc2ltX2JpdG1hcCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGJvdW5kOyBpKyspIHsKKwkJZGlmZiA9IChyZXN1bHRbYzFdW2ldID4gcmVzdWx0W2MyXVtpXSkgPyAocmVzdWx0W2MxXVtpXSAtCisJCSAgICAgICByZXN1bHRbYzJdW2ldKSA6IChyZXN1bHRbYzJdW2ldIC0gcmVzdWx0W2MxXVtpXSk7CisJCWlmIChkaWZmID4gTUFYX1RPTEVSQU5DRV85MkQpIHsKKwkJCWlmICgoaSA9PSAyIHx8IGkgPT0gNikgJiYgIXNpbV9iaXRtYXApIHsKKwkJCQlpZiAocmVzdWx0W2MxXVtpXSArIHJlc3VsdFtjMV1baSArIDFdID09IDApCisJCQkJCWZpbmFsX2NhbmRpZGF0ZVsoaSAvIDQpXSA9IGMyOworCQkJCWVsc2UgaWYgKHJlc3VsdFtjMl1baV0gKyByZXN1bHRbYzJdW2kgKyAxXSA9PSAwKQorCQkJCQlmaW5hbF9jYW5kaWRhdGVbKGkgLyA0KV0gPSBjMTsKKwkJCQllbHNlCisJCQkJCXNpbV9iaXRtYXAgPSBzaW1fYml0bWFwIHwgKDEgPDwgaSk7CisJCQl9IGVsc2UgeworCQkJCXNpbV9iaXRtYXAgPSBzaW1fYml0bWFwIHwgKDEgPDwgaSk7CisJCQl9CisJCX0KKwl9CisJaWYgKHNpbV9iaXRtYXAgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgKGJvdW5kIC8gNCk7IGkrKykgeworCQkJaWYgKGZpbmFsX2NhbmRpZGF0ZVtpXSAhPSAweEZGKSB7CisJCQkJZm9yIChqID0gaSAqIDQ7IGogPCAoaSArIDEpICogNCAtIDI7IGorKykKKwkJCQkJcmVzdWx0WzNdW2pdID0KKwkJCQkJCSByZXN1bHRbZmluYWxfY2FuZGlkYXRlW2ldXVtqXTsKKwkJCQlicmVzdWx0ID0gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJyZXN1bHQ7CisJfQorCWlmICghKHNpbV9iaXRtYXAgJiAweDBGKSkgeyAvKiBwYXRoIEEgT0sgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCXJlc3VsdFszXVtpXSA9IHJlc3VsdFtjMV1baV07CisJfSBlbHNlIGlmICghKHNpbV9iaXRtYXAgJiAweDAzKSkgeyAvKiBwYXRoIEEsIFR4IE9LICovCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCQlyZXN1bHRbM11baV0gPSByZXN1bHRbYzFdW2ldOworCX0KKwlpZiAoIShzaW1fYml0bWFwICYgMHhGMCkgJiYgaXMydCkgeyAvKiBwYXRoIEIgT0sgKi8KKwkJZm9yIChpID0gNDsgaSA8IDg7IGkrKykKKwkJCXJlc3VsdFszXVtpXSA9IHJlc3VsdFtjMV1baV07CisJfSBlbHNlIGlmICghKHNpbV9iaXRtYXAgJiAweDMwKSkgeyAvKiBwYXRoIEIsIFR4IE9LICovCisJCWZvciAoaSA9IDQ7IGkgPCA2OyBpKyspCisJCQlyZXN1bHRbM11baV0gPSByZXN1bHRbYzFdW2ldOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X3BhdGhhX2ZpbGxfaXFrX21hdHJpeChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgICAgYm9vbCBpcWtfb2ssIGxvbmcgcmVzdWx0W11bOF0sCisJCQkJCSAgICAgIHU4IGZpbmFsX2NhbmRpZGF0ZSwgYm9vbCB0eG9ubHkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSAmKHJ0bHByaXYtPnJ0bGhhbCk7CisJdTMyIG9sZHZhbF8wLCB2YWxfeCwgdHgwX2EsIHJlZzsKKwlsb25nIHZhbF95LCB0eDBfYzsKKwlib29sIGlzMnQgPSBJU185MkRfU0lOR0xFUEhZKHJ0bGhhbC0+dmVyc2lvbikgfHwKKwkgICAgcnRsaGFsLT5tYWNwaHltb2RlID09IERVQUxNQUNfRFVBTFBIWTsKKworCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkoIlBhdGggQSBJUSBDYWxpYnJhdGlvbiAlcyAhXG4iLAorCQkoaXFrX29rKSA/ICJTdWNjZXNzIiA6ICJGYWlsZWQiKSk7CisJaWYgKGZpbmFsX2NhbmRpZGF0ZSA9PSAweEZGKSB7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGlxa19vaykgeworCQlvbGR2YWxfMCA9IChydGxfZ2V0X2JicmVnKGh3LCBST0ZETTBfWEFUeElRSU1CQUxBTkNFLAorCQkJQk1BU0tEV09SRCkgPj4gMjIpICYgMHgzRkY7CS8qIE9GRE0wX0QgKi8KKwkJdmFsX3ggPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVswXTsKKwkJaWYgKCh2YWxfeCAmIDB4MDAwMDAyMDApICE9IDApCisJCQl2YWxfeCA9IHZhbF94IHwgMHhGRkZGRkMwMDsKKwkJdHgwX2EgPSAodmFsX3ggKiBvbGR2YWxfMCkgPj4gODsKKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiWCA9IDB4JXgsIHR4MF9hID0gMHgleCwiCisJCQkiIG9sZHZhbF8wIDB4JXhcbiIsCXZhbF94LCB0eDBfYSwgb2xkdmFsXzApKTsKKwkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1hBVHhJUUlNQkFMQU5DRSwgMHgzRkYsIHR4MF9hKTsKKwkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX0VDQ0FUSFJFU0hPTEQsIEJJVCgyNCksCisJCQkgICAgICAoKHZhbF94ICogb2xkdmFsXzAgPj4gNykgJiAweDEpKTsKKwkJdmFsX3kgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVsxXTsKKwkJaWYgKCh2YWxfeSAmIDB4MDAwMDAyMDApICE9IDApCisJCQl2YWxfeSA9IHZhbF95IHwgMHhGRkZGRkMwMDsKKwkJLyogcGF0aCBCIElRSyByZXN1bHQgKyAzICovCisJCWlmIChydGxoYWwtPmludGVyZmFjZWluZGV4ID09IDEgJiYKKwkJCXJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzVHKQorCQkJdmFsX3kgKz0gMzsKKwkJdHgwX2MgPSAodmFsX3kgKiBvbGR2YWxfMCkgPj4gODsKKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiWSA9IDB4JWx4LCB0eDBfYyA9IDB4JWx4XG4iLAorCQkJdmFsX3ksIHR4MF9jKSk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQ1R4QUZFLCAweEYwMDAwMDAwLAorCQkJICAgICAgKCh0eDBfYyAmIDB4M0MwKSA+PiA2KSk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQVR4SVFJTUJBTEFOQ0UsIDB4MDAzRjAwMDAsCisJCQkgICAgICAodHgwX2MgJiAweDNGKSk7CisJCWlmIChpczJ0KQorCQkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX0VDQ0FUSFJFU0hPTEQsIEJJVCgyNiksCisJCQkJICAgICAgKCh2YWxfeSAqIG9sZHZhbF8wID4+IDcpICYgMHgxKSk7CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIjB4QzgwID0gMHgleFxuIiwKKwkJCSBydGxfZ2V0X2JicmVnKGh3LCBST0ZETTBfWEFUeElRSU1CQUxBTkNFLAorCQkJCSAgICAgICBCTUFTS0RXT1JEKSkpOworCQlpZiAodHhvbmx5KSB7CisJCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJvbmx5IFR4IE9LXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKwkJcmVnID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bMl07CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQVJYSVFJTUJBTEFOQ0UsIDB4M0ZGLCByZWcpOworCQlyZWcgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVszXSAmIDB4M0Y7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQVJYSVFJTUJBTEFOQ0UsIDB4RkMwMCwgcmVnKTsKKwkJcmVnID0gKHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzNdID4+IDYpICYgMHhGOworCQlydGxfc2V0X2JicmVnKGh3LCAweGNhMCwgMHhGMDAwMDAwMCwgcmVnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X3BhdGhiX2ZpbGxfaXFrX21hdHJpeChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwlib29sIGlxa19vaywgbG9uZyByZXN1bHRbXVs4XSwgdTggZmluYWxfY2FuZGlkYXRlLCBib29sIHR4b25seSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9ICYocnRscHJpdi0+cnRsaGFsKTsKKwl1MzIgb2xkdmFsXzEsIHZhbF94LCB0eDFfYSwgcmVnOworCWxvbmcgdmFsX3ksIHR4MV9jOworCisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiUGF0aCBCIElRIENhbGlicmF0aW9uICVzICFcbiIsCisJCSAoaXFrX29rKSA/ICJTdWNjZXNzIiA6ICJGYWlsZWQiKSk7CisJaWYgKGZpbmFsX2NhbmRpZGF0ZSA9PSAweEZGKSB7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGlxa19vaykgeworCQlvbGR2YWxfMSA9IChydGxfZ2V0X2JicmVnKGh3LCBST0ZETTBfWEJUeElRSU1CQUxBTkNFLAorCQkJCQkgIEJNQVNLRFdPUkQpID4+IDIyKSAmIDB4M0ZGOworCQl2YWxfeCA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzRdOworCQlpZiAoKHZhbF94ICYgMHgwMDAwMDIwMCkgIT0gMCkKKwkJCXZhbF94ID0gdmFsX3ggfCAweEZGRkZGQzAwOworCQl0eDFfYSA9ICh2YWxfeCAqIG9sZHZhbF8xKSA+PiA4OworCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJYID0gMHgleCwgdHgxX2EgPSAweCV4XG4iLAorCQkJdmFsX3gsIHR4MV9hKSk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQlR4SVFJTUJBTEFOQ0UsIDB4M0ZGLCB0eDFfYSk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9FQ0NBVEhSRVNIT0xELCBCSVQoMjgpLAorCQkJICAgICAgKCh2YWxfeCAqIG9sZHZhbF8xID4+IDcpICYgMHgxKSk7CisJCXZhbF95ID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNV07CisJCWlmICgodmFsX3kgJiAweDAwMDAwMjAwKSAhPSAwKQorCQkJdmFsX3kgPSB2YWxfeSB8IDB4RkZGRkZDMDA7CisJCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81RykKKwkJCXZhbF95ICs9IDM7CisJCXR4MV9jID0gKHZhbF95ICogb2xkdmFsXzEpID4+IDg7CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLCAoIlkgPSAweCVseCwgdHgxX2MgPSAweCVseFxuIiwKKwkJCXZhbF95LCB0eDFfYykpOworCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfWERUeEFGRSwgMHhGMDAwMDAwMCwKKwkJCSAgICAgICgodHgxX2MgJiAweDNDMCkgPj4gNikpOworCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfWEJUeElRSU1CQUxBTkNFLCAweDAwM0YwMDAwLAorCQkJICAgICAgKHR4MV9jICYgMHgzRikpOworCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfRUNDQVRIUkVTSE9MRCwgQklUKDMwKSwKKwkJCSAgICAgICgodmFsX3kgKiBvbGR2YWxfMSA+PiA3KSAmIDB4MSkpOworCQlpZiAodHhvbmx5KQorCQkJcmV0dXJuOworCQlyZWcgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs2XTsKKwkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1hCUlhJUUlNQkFMQU5DRSwgMHgzRkYsIHJlZyk7CisJCXJlZyA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzddICYgMHgzRjsKKwkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1hCUlhJUUlNQkFMQU5DRSwgMHhGQzAwLCByZWcpOworCQlyZWcgPSAocmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bN10gPj4gNikgJiAweEY7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9BR0NSU1NJVEFCTEUsIDB4MDAwMEYwMDAsIHJlZyk7CisJfQorfQorCit2b2lkIHJ0bDkyZF9waHlfaXFfY2FsaWJyYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSAmKHJ0bHByaXYtPnJ0bGhhbCk7CisJbG9uZyByZXN1bHRbNF1bOF07CisJdTggaSwgZmluYWxfY2FuZGlkYXRlLCBpbmRleGZvcmNoYW5uZWw7CisJYm9vbCBwYXRoYV9vaywgcGF0aGJfb2s7CisJbG9uZyByZWdlOTQsIHJlZ2U5YywgcmVnZWE0LCByZWdlYWMsIHJlZ2ViNDsKKwlsb25nIHJlZ2ViYywgcmVnZWM0LCByZWdlY2MsIHJlZ3RtcCA9IDA7CisJYm9vbCBpczEyc2ltdWxhciwgaXMxM3NpbXVsYXIsIGlzMjNzaW11bGFyOworCXVuc2lnbmVkIGxvbmcgZmxhZyA9IDA7CisKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywKKwkJKCJJUUs6U3RhcnQhISFjaGFubmVsICVkXG4iLCBydGxwaHktPmN1cnJlbnRfY2hhbm5lbCkpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJcmVzdWx0WzBdW2ldID0gMDsKKwkJcmVzdWx0WzFdW2ldID0gMDsKKwkJcmVzdWx0WzJdW2ldID0gMDsKKwkJcmVzdWx0WzNdW2ldID0gMDsKKwl9CisJZmluYWxfY2FuZGlkYXRlID0gMHhmZjsKKwlwYXRoYV9vayA9IGZhbHNlOworCXBhdGhiX29rID0gZmFsc2U7CisJaXMxMnNpbXVsYXIgPSBmYWxzZTsKKwlpczIzc2ltdWxhciA9IGZhbHNlOworCWlzMTNzaW11bGFyID0gZmFsc2U7CisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCSgiSVFLICEhIWN1cnJlbnRiYW5kICVkXG4iLCBydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUpKTsKKwlydGw5MmRfYWNxdWlyZV9jY2thbmRyd19wYWdlYV9jdGwoaHcsICZmbGFnKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81RykgeworCQkJX3J0bDkyZF9waHlfaXFfY2FsaWJyYXRlXzVnX25vcm1hbChodywgcmVzdWx0LCBpKTsKKwkJfSBlbHNlIGlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCQlpZiAoSVNfOTJEX1NJTkdMRVBIWShydGxoYWwtPnZlcnNpb24pKQorCQkJCV9ydGw5MmRfcGh5X2lxX2NhbGlicmF0ZShodywgcmVzdWx0LCBpLCB0cnVlKTsKKwkJCWVsc2UKKwkJCQlfcnRsOTJkX3BoeV9pcV9jYWxpYnJhdGUoaHcsIHJlc3VsdCwgaSwgZmFsc2UpOworCQl9CisJCWlmIChpID09IDEpIHsKKwkJCWlzMTJzaW11bGFyID0gX3J0bDkyZF9waHlfc2ltdWxhcml0eV9jb21wYXJlKGh3LCByZXN1bHQsCisJCQkJCQkJCSAgICAgMCwgMSk7CisJCQlpZiAoaXMxMnNpbXVsYXIpIHsKKwkJCQlmaW5hbF9jYW5kaWRhdGUgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChpID09IDIpIHsKKwkJCWlzMTNzaW11bGFyID0gX3J0bDkyZF9waHlfc2ltdWxhcml0eV9jb21wYXJlKGh3LCByZXN1bHQsCisJCQkJCQkJCSAgICAgMCwgMik7CisJCQlpZiAoaXMxM3NpbXVsYXIpIHsKKwkJCQlmaW5hbF9jYW5kaWRhdGUgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaXMyM3NpbXVsYXIgPSBfcnRsOTJkX3BoeV9zaW11bGFyaXR5X2NvbXBhcmUoaHcsIHJlc3VsdCwKKwkJCQkJCQkJICAgICAxLCAyKTsKKwkJCWlmIChpczIzc2ltdWxhcikgeworCQkJCWZpbmFsX2NhbmRpZGF0ZSA9IDE7CisJCQl9IGVsc2UgeworCQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQkJCXJlZ3RtcCArPSByZXN1bHRbM11baV07CisKKwkJCQlpZiAocmVndG1wICE9IDApCisJCQkJCWZpbmFsX2NhbmRpZGF0ZSA9IDM7CisJCQkJZWxzZQorCQkJCQlmaW5hbF9jYW5kaWRhdGUgPSAweEZGOworCQkJfQorCQl9CisJfQorCXJ0bDkyZF9yZWxlYXNlX2Nja2FuZHJ3X3BhZ2VhX2N0bChodywgJmZsYWcpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcmVnZTk0ID0gcmVzdWx0W2ldWzBdOworCQlyZWdlOWMgPSByZXN1bHRbaV1bMV07CisJCXJlZ2VhNCA9IHJlc3VsdFtpXVsyXTsKKwkJcmVnZWFjID0gcmVzdWx0W2ldWzNdOworCQlyZWdlYjQgPSByZXN1bHRbaV1bNF07CisJCXJlZ2ViYyA9IHJlc3VsdFtpXVs1XTsKKwkJcmVnZWM0ID0gcmVzdWx0W2ldWzZdOworCQlyZWdlY2MgPSByZXN1bHRbaV1bN107CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJKCJJUUs6IHJlZ2U5ND0lbHggcmVnZTljPSVseCByZWdlYTQ9JWx4IHJlZ2VhYz0lbHggIgorCQkJInJlZ2ViND0lbHggcmVnZWJjPSVseCByZWdlYzQ9JWx4IHJlZ2VjYz0lbHhcbiAiLAorCQkJcmVnZTk0LCByZWdlOWMsIHJlZ2VhNCwgcmVnZWFjLCByZWdlYjQsIHJlZ2ViYywgcmVnZWM0LAorCQkJcmVnZWNjKSk7CisJfQorCWlmIChmaW5hbF9jYW5kaWRhdGUgIT0gMHhmZikgeworCQlydGxwaHktPnJlZ19lOTQgPSByZWdlOTQgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVswXTsKKwkJcnRscGh5LT5yZWdfZTljID0gcmVnZTljID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bMV07CisJCXJlZ2VhNCA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzJdOworCQlyZWdlYWMgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVszXTsKKwkJcnRscGh5LT5yZWdfZWI0ID0gcmVnZWI0ID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNF07CisJCXJ0bHBoeS0+cmVnX2ViYyA9IHJlZ2ViYyA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzVdOworCQlyZWdlYzQgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs2XTsKKwkJcmVnZWNjID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bN107CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJKCJJUUs6IGZpbmFsX2NhbmRpZGF0ZSBpcyAleFxuIiwgZmluYWxfY2FuZGlkYXRlKSk7CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJKCJJUUs6IHJlZ2U5ND0lbHggcmVnZTljPSVseCByZWdlYTQ9JWx4IHJlZ2VhYz0lbHggIgorCQkJInJlZ2ViND0lbHggcmVnZWJjPSVseCByZWdlYzQ9JWx4IHJlZ2VjYz0lbHhcbiAiLAorCQkJcmVnZTk0LCByZWdlOWMsIHJlZ2VhNCwgcmVnZWFjLCByZWdlYjQsIHJlZ2ViYywgcmVnZWM0LAorCQkJcmVnZWNjKSk7CisJCXBhdGhhX29rID0gcGF0aGJfb2sgPSB0cnVlOworCX0gZWxzZSB7CisJCXJ0bHBoeS0+cmVnX2U5NCA9IHJ0bHBoeS0+cmVnX2ViNCA9IDB4MTAwOyAvKiBYIGRlZmF1bHQgdmFsdWUgKi8KKwkJcnRscGh5LT5yZWdfZTljID0gcnRscGh5LT5yZWdfZWJjID0gMHgwOyAgIC8qIFkgZGVmYXVsdCB2YWx1ZSAqLworCX0KKwlpZiAoKHJlZ2U5NCAhPSAwKSAvKiYmKHJlZ2VhNCAhPSAwKSAqLykKKwkJX3J0bDkyZF9waHlfcGF0aGFfZmlsbF9pcWtfbWF0cml4KGh3LCBwYXRoYV9vaywgcmVzdWx0LAorCQkJCWZpbmFsX2NhbmRpZGF0ZSwgKHJlZ2VhNCA9PSAwKSk7CisJaWYgKElTXzkyRF9TSU5HTEVQSFkocnRsaGFsLT52ZXJzaW9uKSkgeworCQlpZiAoKHJlZ2ViNCAhPSAwKSAvKiYmKHJlZ2VjNCAhPSAwKSAqLykKKwkJCV9ydGw5MmRfcGh5X3BhdGhiX2ZpbGxfaXFrX21hdHJpeChodywgcGF0aGJfb2ssIHJlc3VsdCwKKwkJCQkJCWZpbmFsX2NhbmRpZGF0ZSwgKHJlZ2VjNCA9PSAwKSk7CisJfQorCWlmIChmaW5hbF9jYW5kaWRhdGUgIT0gMHhGRikgeworCQlpbmRleGZvcmNoYW5uZWwgPSBydGw5MmRfZ2V0X3JpZ2h0Y2hubHBsYWNlX2Zvcl9pcWsoCisJCQkJICBydGxwaHktPmN1cnJlbnRfY2hhbm5lbCk7CisKKwkJZm9yIChpID0gMDsgaSA8IElRS19NQVRSSVhfUkVHX05VTTsgaSsrKQorCQkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaW5kZXhmb3JjaGFubmVsXS4KKwkJCQl2YWx1ZVswXVtpXSA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdW2ldOworCQlydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZ1tpbmRleGZvcmNoYW5uZWxdLmlxa19kb25lID0KKwkJCXRydWU7CisKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9TQ0FOIHwgQ09NUF9NTE1FLCBEQkdfTE9VRCwKKwkJCSAoIlxuSVFLIE9LIGluZGV4Zm9yY2hhbm5lbCAlZC5cbiIsIGluZGV4Zm9yY2hhbm5lbCkpOworCX0KK30KKwordm9pZCBydGw5MmRfcGh5X3JlbG9hZF9pcWtfc2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gJihydGxwcml2LT5ydGxoYWwpOworCXU4IGluZGV4Zm9yY2hhbm5lbDsKKworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfTE9VRCwgKCJjaGFubmVsICVkXG4iLCBjaGFubmVsKSk7CisJLyotLS0tLS1EbyBJUUsgZm9yIG5vcm1hbCBjaGlwIGFuZCB0ZXN0IGNoaXAgNUcgYmFuZC0tLS0tLS0gKi8KKwlpbmRleGZvcmNoYW5uZWwgPSBydGw5MmRfZ2V0X3JpZ2h0Y2hubHBsYWNlX2Zvcl9pcWsoY2hhbm5lbCk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELAorCQkoImluZGV4Zm9yY2hhbm5lbCAlZCBkb25lICVkXG4iLCBpbmRleGZvcmNoYW5uZWwsCisJCXJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nW2luZGV4Zm9yY2hhbm5lbF0uaXFrX2RvbmUpKTsKKwlpZiAoMCAmJiAhcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaW5kZXhmb3JjaGFubmVsXS5pcWtfZG9uZSAmJgorCQlydGxwaHktPm5lZWRfaXFrKSB7CisJCS8qIFJlIERvIElRSy4gKi8KKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9TQ0FOIHwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCSAoIkRvIElRSyBNYXRyaXggcmVnIGZvciBjaGFubmVsOiVkLi4uLlxuIiwgY2hhbm5lbCkpOworCQlydGw5MmRfcGh5X2lxX2NhbGlicmF0ZShodyk7CisJfSBlbHNlIHsKKwkJLyogSnVzdCBsb2FkIHRoZSB2YWx1ZS4gKi8KKwkJLyogMkcgYmFuZCBqdXN0IGxvYWQgb25jZS4gKi8KKwkJaWYgKCgoIXJ0bGhhbC0+bG9hZF9pbXJhbmRpcWtfc2V0dGluZ19mb3IyZykgJiYKKwkJICAgIGluZGV4Zm9yY2hhbm5lbCA9PSAwKSB8fCBpbmRleGZvcmNoYW5uZWwgPiAwKSB7CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1NDQU4sIERCR19MT1VELAorCQkJCSAoIkp1c3QgUmVhZCBJUUsgTWF0cml4IHJlZyBmb3IgY2hhbm5lbDolZCIKKwkJCQkgIi4uLi5cbiIsIGNoYW5uZWwpKTsKKwkJCWlmICgocnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaW5kZXhmb3JjaGFubmVsXS4KKwkJCSAgICAgdmFsdWVbMF0gIT0gTlVMTCkKKwkJCQkvKiYmKHJlZ2VhNCAhPSAwKSAqLykKKwkJCQlfcnRsOTJkX3BoeV9wYXRoYV9maWxsX2lxa19tYXRyaXgoaHcsIHRydWUsCisJCQkJCXJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nWworCQkJCQlpbmRleGZvcmNoYW5uZWxdLnZhbHVlLAkwLAorCQkJCQkocnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbCisJCQkJCWluZGV4Zm9yY2hhbm5lbF0udmFsdWVbMF1bMl0gPT0gMCkpOworCQkJaWYgKElTXzkyRF9TSU5HTEVQSFkocnRsaGFsLT52ZXJzaW9uKSkgeworCQkJCWlmICgocnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbCisJCQkJCWluZGV4Zm9yY2hhbm5lbF0udmFsdWVbMF1bNF0gIT0gMCkKKwkJCQkJLyomJihyZWdlYzQgIT0gMCkgKi8pCisJCQkJCV9ydGw5MmRfcGh5X3BhdGhiX2ZpbGxfaXFrX21hdHJpeChodywKKwkJCQkJCXRydWUsCisJCQkJCQlydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZ1sKKwkJCQkJCWluZGV4Zm9yY2hhbm5lbF0udmFsdWUsIDAsCisJCQkJCQkocnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbCisJCQkJCQlpbmRleGZvcmNoYW5uZWxdLnZhbHVlWzBdWzZdCisJCQkJCQk9PSAwKSk7CisJCQl9CisJCX0KKwl9CisJcnRscGh5LT5uZWVkX2lxayA9IGZhbHNlOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfTE9VRCwgKCI8PT09PVxuIikpOworfQorCitzdGF0aWMgdTMyIF9ydGw5MmRfcGh5X2dldF9hYnModTMyIHZhbDEsIHUzMiB2YWwyKQoreworCXUzMiByZXQ7CisKKwlpZiAodmFsMSA+PSB2YWwyKQorCQlyZXQgPSB2YWwxIC0gdmFsMjsKKwllbHNlCisJCXJldCA9IHZhbDIgLSB2YWwxOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIF9ydGw5MmRfaXNfbGVnYWxfNWdfY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggY2hhbm5lbCkKK3sKKworCWludCBpOworCXU4IGNoYW5uZWxfNWdbNDVdID0geworCQkzNiwgMzgsIDQwLCA0MiwgNDQsIDQ2LCA0OCwgNTAsIDUyLCA1NCwgNTYsIDU4LAorCQk2MCwgNjIsIDY0LCAxMDAsIDEwMiwgMTA0LCAxMDYsIDEwOCwgMTEwLCAxMTIsCisJCTExNCwgMTE2LCAxMTgsIDEyMCwgMTIyLCAxMjQsIDEyNiwgMTI4LCAxMzAsIDEzMiwKKwkJMTM0LCAxMzYsIDEzOCwgMTQwLCAxNDksIDE1MSwgMTUzLCAxNTUsIDE1NywgMTU5LAorCQkxNjEsIDE2MywgMTY1CisJfTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF81Zyk7IGkrKykKKwkJaWYgKGNoYW5uZWwgPT0gY2hhbm5lbF81Z1tpXSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF9waHlfY2FsY19jdXJ2aW5kZXgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgIHUzMiAqdGFyZ2V0Y2hubCwgdTMyICogY3VydmVjb3VudF92YWwsCisJCQkJICAgICAgIGJvb2wgaXM1ZywgdTMyICpjdXJ2ZWluZGV4KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgc21hbGxlc3RfYWJzX3ZhbCA9IDB4ZmZmZmZmZmYsIHU0dG1wOworCXU4IGksIGo7CisJdTggY2hubF9udW0gPSBpczVnID8gVEFSR0VUX0NITkxfTlVNXzVHIDogVEFSR0VUX0NITkxfTlVNXzJHOworCisJZm9yIChpID0gMDsgaSA8IGNobmxfbnVtOyBpKyspIHsKKwkJaWYgKGlzNWcgJiYgIV9ydGw5MmRfaXNfbGVnYWxfNWdfY2hhbm5lbChodywgaSArIDEpKQorCQkJY29udGludWU7CisJCWN1cnZlaW5kZXhbaV0gPSAwOworCQlmb3IgKGogPSAwOyBqIDwgKENWX0NVUlZFX0NOVCAqIDIpOyBqKyspIHsKKwkJCXU0dG1wID0gX3J0bDkyZF9waHlfZ2V0X2Ficyh0YXJnZXRjaG5sW2ldLAorCQkJCWN1cnZlY291bnRfdmFsW2pdKTsKKworCQkJaWYgKHU0dG1wIDwgc21hbGxlc3RfYWJzX3ZhbCkgeworCQkJCWN1cnZlaW5kZXhbaV0gPSBqOworCQkJCXNtYWxsZXN0X2Fic192YWwgPSB1NHRtcDsKKwkJCX0KKwkJfQorCQlzbWFsbGVzdF9hYnNfdmFsID0gMHhmZmZmZmZmZjsKKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiY3VydmVpbmRleFslZF0gPSAleFxuIiwgaSwKKwkJCWN1cnZlaW5kZXhbaV0pKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X3JlbG9hZF9sY2tfc2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJdTggY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggZXJmcGF0aCA9IHJ0bHByaXYtPnJ0bGhhbC5jdXJyZW50X2JhbmR0eXBlID09CisJCUJBTkRfT05fNUcgPyBSRjkwX1BBVEhfQSA6CisJCUlTXzkyRF9TSU5HTEVQSFkocnRscHJpdi0+cnRsaGFsLnZlcnNpb24pID8KKwkJUkY5MF9QQVRIX0IgOiBSRjkwX1BBVEhfQTsKKwl1MzIgdTR0bXAgPSAwLCB1NHJlZ3ZhbHVlID0gMDsKKwlib29sIGJuZWVkX3Bvd2VyZG93bl9yYWRpbyA9IGZhbHNlOworCisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELCAoInBhdGggJWRcbiIsIGVyZnBhdGgpKTsKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJiYW5kIHR5cGUgPSAlZFxuIiwKKwkJcnRscHJpdi0+cnRsaGFsLmN1cnJlbnRfYmFuZHR5cGUpKTsKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJjaGFubmVsID0gJWRcbiIsIGNoYW5uZWwpKTsKKwlpZiAocnRscHJpdi0+cnRsaGFsLmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81Rykgey8qIFBhdGgtQSBmb3IgNUcgKi8KKwkJdTR0bXAgPSBjdXJ2ZWluZGV4XzVnW2NoYW5uZWwtMV07CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJKCJ2ZXIgMSBzZXQgUkYtQSwgNUcsCTB4MjggPSAweCV1bHggISFcbiIsIHU0dG1wKSk7CisJCWlmIChydGxwcml2LT5ydGxoYWwubWFjcGh5bW9kZSA9PSBEVUFMTUFDX0RVQUxQSFkgJiYKKwkJCXJ0bHByaXYtPnJ0bGhhbC5pbnRlcmZhY2VpbmRleCA9PSAxKSB7CisJCQlibmVlZF9wb3dlcmRvd25fcmFkaW8gPQorCQkJCXJ0bDkyZF9waHlfZW5hYmxlX2Fub3RoZXJwaHkoaHcsIGZhbHNlKTsKKwkJCXJ0bHByaXYtPnJ0bGhhbC5kdXJpbmdfbWFjMWluaXRfcmFkaW9hID0gdHJ1ZTsKKwkJCS8qIGFzdW1lIG5vIHRoaXMgY2FzZSAqLworCQkJaWYgKGJuZWVkX3Bvd2VyZG93bl9yYWRpbykKKwkJCQlfcnRsOTJkX3BoeV9lbmFibGVfcmZfZW52KGh3LCBlcmZwYXRoLAorCQkJCQkJCSAgJnU0cmVndmFsdWUpOworCQl9CisJCXJ0bF9zZXRfcmZyZWcoaHcsIGVyZnBhdGgsIFJGX1NZTl9HNCwgMHgzZjgwMCwgdTR0bXApOworCQlpZiAoYm5lZWRfcG93ZXJkb3duX3JhZGlvKQorCQkJX3J0bDkyZF9waHlfcmVzdG9yZV9yZl9lbnYoaHcsIGVyZnBhdGgsICZ1NHJlZ3ZhbHVlKTsKKwkJaWYgKHJ0bHByaXYtPnJ0bGhhbC5kdXJpbmdfbWFjMWluaXRfcmFkaW9hKQorCQkJcnRsOTJkX3BoeV9wb3dlcmRvd25fYW5vdGhlcnBoeShodywgZmFsc2UpOworCX0gZWxzZSBpZiAocnRscHJpdi0+cnRsaGFsLmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCXU0dG1wID0gY3VydmVpbmRleF8yZ1tjaGFubmVsLTFdOworCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywKKwkJCSgidmVyIDMgc2V0IFJGLUIsIDJHLCAweDI4ID0gMHgldWx4ICEhXG4iLCB1NHRtcCkpOworCQlpZiAocnRscHJpdi0+cnRsaGFsLm1hY3BoeW1vZGUgPT0gRFVBTE1BQ19EVUFMUEhZICYmCisJCQlydGxwcml2LT5ydGxoYWwuaW50ZXJmYWNlaW5kZXggPT0gMCkgeworCQkJYm5lZWRfcG93ZXJkb3duX3JhZGlvID0KKwkJCQlydGw5MmRfcGh5X2VuYWJsZV9hbm90aGVycGh5KGh3LCB0cnVlKTsKKwkJCXJ0bHByaXYtPnJ0bGhhbC5kdXJpbmdfbWFjMGluaXRfcmFkaW9iID0gdHJ1ZTsKKwkJCWlmIChibmVlZF9wb3dlcmRvd25fcmFkaW8pCisJCQkJX3J0bDkyZF9waHlfZW5hYmxlX3JmX2VudihodywgZXJmcGF0aCwKKwkJCQkJCQkgICZ1NHJlZ3ZhbHVlKTsKKwkJfQorCQlydGxfc2V0X3JmcmVnKGh3LCBlcmZwYXRoLCBSRl9TWU5fRzQsIDB4M2Y4MDAsIHU0dG1wKTsKKwkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCQkoInZlciAzIHNldCBSRi1CLCAyRywgMHgyOCA9IDB4JXVseCAhIVxuIiwKKwkJCXJ0bF9nZXRfcmZyZWcoaHcsICBlcmZwYXRoLCBSRl9TWU5fRzQsIDB4M2Y4MDApKSk7CisJCWlmIChibmVlZF9wb3dlcmRvd25fcmFkaW8pCisJCQlfcnRsOTJkX3BoeV9yZXN0b3JlX3JmX2VudihodywgZXJmcGF0aCwgJnU0cmVndmFsdWUpOworCQlpZiAocnRscHJpdi0+cnRsaGFsLmR1cmluZ19tYWMwaW5pdF9yYWRpb2IpCisJCQlydGw5MmRfcGh5X3Bvd2VyZG93bl9hbm90aGVycGh5KGh3LCB0cnVlKTsKKwl9CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELCAoIjw9PT09XG4iKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X2xjX2NhbGlicmF0ZV9zdyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBpczJ0KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gJihydGxwcml2LT5ydGxoYWwpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJdTggdG1wcmVnLCBpbmRleCwgcmZfbW9kZVsyXTsKKwl1OCBwYXRoID0gaXMydCA/IDIgOiAxOworCXU4IGk7CisJdTMyIHU0dG1wLCBvZmZzZXQ7CisJdTMyIGN1cnZlY291bnRfdmFsW0NWX0NVUlZFX0NOVCAqIDJdID0gezB9OworCXUxNiB0aW1lb3V0ID0gODAwLCB0aW1lY291bnQgPSAwOworCisJLyogQ2hlY2sgY29udGludW91cyBUWCBhbmQgUGFja2V0IFRYICovCisJdG1wcmVnID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCAweGQwMyk7CisJLyogaWYgRGVhbCB3aXRoIGNvbnRpc3VvdXMgVFggY2FzZSwgZGlzYWJsZSBhbGwgY29udGludW91cyBUWCAqLworCS8qIGlmIERlYWwgd2l0aCBQYWNrZXQgVFggY2FzZSwgYmxvY2sgYWxsIHF1ZXVlcyAqLworCWlmICgodG1wcmVnICYgMHg3MCkgIT0gMCkKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgMHhkMDMsIHRtcHJlZyAmIDB4OEYpOworCWVsc2UKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1RYUEFVU0UsIDB4RkYpOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9BTkFMT0dQQVJBTUVURVI0LCAweEYwMDAwMCwgMHgwRik7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGF0aDsgaW5kZXgrKykgeworCQkvKiAxLiBSZWFkIG9yaWdpbmFsIFJGIG1vZGUgKi8KKwkJb2Zmc2V0ID0gaW5kZXggPT0gMCA/IFJPRkRNMF9YQUFHQ0NPUkUxIDogUk9GRE0wX1hCQUdDQ09SRTE7CisJCXJmX21vZGVbaW5kZXhdID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBvZmZzZXQpOworCQkvKiAyLiBTZXQgUkYgbW9kZSA9IHN0YW5kYnkgbW9kZSAqLworCQlydGxfc2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKWluZGV4LCBSRl9BQywKKwkJCSAgICAgIEJSRlJFR09GRlNFVE1BU0ssIDB4MDEwMDAwKTsKKwkJaWYgKHJ0bHBjaS0+aW5pdF9yZWFkeSkgeworCQkJLyogc3dpdGNoIENWLWN1cnZlIGNvbnRyb2wgYnkgTEMtY2FsaWJyYXRpb24gKi8KKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIChlbnVtIHJhZGlvX3BhdGgpaW5kZXgsIFJGX1NZTl9HNywKKwkJCQkgICAgICBCSVQoMTcpLCAweDApOworCQkJLyogNC4gU2V0IExDIGNhbGlicmF0aW9uIGJlZ2luICovCisJCQlydGxfc2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKWluZGV4LCBSRl9DSE5MQlcsCisJCQkJICAgICAgMHgwODAwMCwgMHgwMSk7CisJCX0KKwkJdTR0bXAgPSBydGxfZ2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKWluZGV4LCBSRl9TWU5fRzYsCisJCQkJICBCUkZSRUdPRkZTRVRNQVNLKTsKKwkJd2hpbGUgKCghKHU0dG1wICYgQklUKDExKSkpICYmIHRpbWVjb3VudCA8PSB0aW1lb3V0KSB7CisJCQltZGVsYXkoNTApOworCQkJdGltZWNvdW50ICs9IDUwOworCQkJdTR0bXAgPSBydGxfZ2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKWluZGV4LAorCQkJCQkgICAgICBSRl9TWU5fRzYsIEJSRlJFR09GRlNFVE1BU0spOworCQl9CisJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJKCJQSFlfTENLIGZpbmlzaCBkZWxheSBmb3IgJWQgbXM9MlxuIiwgdGltZWNvdW50KSk7CisJCXU0dG1wID0gcnRsX2dldF9yZnJlZyhodywgaW5kZXgsIFJGX1NZTl9HNCwgQlJGUkVHT0ZGU0VUTUFTSyk7CisJCWlmIChpbmRleCA9PSAwICYmIHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPT0gMCkgeworCQkJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCQkJKCJwYXRoLUEgLyA1RyBMQ0tcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCVJUUFJJTlQocnRscHJpdiwgRklOSVQsIElOSVRfSVFLLAorCQkJCSgicGF0aC1CIC8gMi40RyBMQ0tcbiIpKTsKKwkJfQorCQltZW1zZXQoJmN1cnZlY291bnRfdmFsWzBdLCAwLCBDVl9DVVJWRV9DTlQgKiAyKTsKKwkJLyogU2V0IExDIGNhbGlicmF0aW9uIG9mZiAqLworCQlydGxfc2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKWluZGV4LCBSRl9DSE5MQlcsCisJCQkgICAgICAweDA4MDAwLCAweDApOworCQlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJzZXQgUkYgMHgxOFsxNV0gPSAwXG4iKSk7CisJCS8qIHNhdmUgQ3VydmUtY291bnRpbmcgbnVtYmVyICovCisJCWZvciAoaSA9IDA7IGkgPCBDVl9DVVJWRV9DTlQ7IGkrKykgeworCQkJdTMyIHJlYWR2YWwgPSAwLCByZWFkdmFsMiA9IDA7CisJCQlydGxfc2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKWluZGV4LCAweDNGLAorCQkJCSAgICAgIDB4N2YsIGkpOworCisJCQlydGxfc2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKWluZGV4LCAweDRELAorCQkJCUJSRlJFR09GRlNFVE1BU0ssIDB4MCk7CisJCQlyZWFkdmFsID0gcnRsX2dldF9yZnJlZyhodywgKGVudW0gcmFkaW9fcGF0aClpbmRleCwKKwkJCQkJICAweDRGLCBCUkZSRUdPRkZTRVRNQVNLKTsKKwkJCWN1cnZlY291bnRfdmFsWzIgKiBpICsgMV0gPSAocmVhZHZhbCAmIDB4ZmZmZTApID4+IDU7CisJCQkvKiByZWcgMHg0ZiBbNDowXSAqLworCQkJLyogcmVnIDB4NTAgWzE5OjEwXSAqLworCQkJcmVhZHZhbDIgPSBydGxfZ2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKWluZGV4LAorCQkJCQkJIDB4NTAsIDB4ZmZjMDApOworCQkJY3VydmVjb3VudF92YWxbMiAqIGldID0gKCgocmVhZHZhbCAmIDB4MUYpIDw8IDEwKSB8CisJCQkJCQkgcmVhZHZhbDIpOworCQl9CisJCWlmIChpbmRleCA9PSAwICYmIHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPT0gMCkKKwkJCV9ydGw5MmRfcGh5X2NhbGNfY3VydmluZGV4KGh3LCB0YXJnZXRjaG5sXzVnLAorCQkJCQkJICAgY3VydmVjb3VudF92YWwsCisJCQkJCQkgICB0cnVlLCBjdXJ2ZWluZGV4XzVnKTsKKwkJZWxzZQorCQkJX3J0bDkyZF9waHlfY2FsY19jdXJ2aW5kZXgoaHcsIHRhcmdldGNobmxfMmcsCisJCQkJCQkgICBjdXJ2ZWNvdW50X3ZhbCwKKwkJCQkJCSAgIGZhbHNlLCBjdXJ2ZWluZGV4XzJnKTsKKwkJLyogc3dpdGNoIENWLWN1cnZlIGNvbnRyb2wgbW9kZSAqLworCQlydGxfc2V0X3JmcmVnKGh3LCAoZW51bSByYWRpb19wYXRoKWluZGV4LCBSRl9TWU5fRzcsCisJCQkgICAgICBCSVQoMTcpLCAweDEpOworCX0KKworCS8qIFJlc3RvcmUgb3JpZ2luYWwgc2l0dWF0aW9uICAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBhdGg7IGluZGV4KyspIHsKKwkJb2Zmc2V0ID0gaW5kZXggPT0gMCA/IFJPRkRNMF9YQUFHQ0NPUkUxIDogUk9GRE0wX1hCQUdDQ09SRTE7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIG9mZnNldCwgMHg1MCk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIG9mZnNldCwgcmZfbW9kZVtpbmRleF0pOworCX0KKwlpZiAoKHRtcHJlZyAmIDB4NzApICE9IDApCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIDB4ZDAzLCB0bXByZWcpOworCWVsc2UgLypEZWFsIHdpdGggUGFja2V0IFRYIGNhc2UgKi8KKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1RYUEFVU0UsIDB4MDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9BTkFMT0dQQVJBTUVURVI0LCAweEYwMDAwMCwgMHgwMCk7CisJX3J0bDkyZF9waHlfcmVsb2FkX2xja19zZXR0aW5nKGh3LCBydGxwcml2LT5waHkuY3VycmVudF9jaGFubmVsKTsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF9waHlfbGNfY2FsaWJyYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGlzMnQpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssICgiY29zYSBQSFlfTENLIHZlcj0yXG4iKSk7CisJX3J0bDkyZF9waHlfbGNfY2FsaWJyYXRlX3N3KGh3LCBpczJ0KTsKK30KKwordm9pZCBydGw5MmRfcGh5X2xjX2NhbGlicmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gJihydGxwcml2LT5ydGxoYWwpOworCXUzMiB0aW1lb3V0ID0gMjAwMCwgdGltZWNvdW50ID0gMDsKKworCXdoaWxlIChydGxwcml2LT5tYWM4MDIxMS5hY3Rfc2Nhbm5pbmcgJiYgdGltZWNvdW50IDwgdGltZW91dCkgeworCQl1ZGVsYXkoNTApOworCQl0aW1lY291bnQgKz0gNTA7CisJfQorCisJcnRscGh5LT5sY2tfaW5wcm9ncmVzcyA9IHRydWU7CisJUlRQUklOVChydGxwcml2LCBGSU5JVCwgSU5JVF9JUUssCisJCSgiTENLOlN0YXJ0ISEhIGN1cnJlbnRiYW5kICV4IGRlbGF5ICVkIG1zXG4iLAorCQkgcnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlLCB0aW1lY291bnQpKTsKKwlpZiAoSVNfOTJEX1NJTkdMRVBIWShydGxoYWwtPnZlcnNpb24pKSB7CisJCV9ydGw5MmRfcGh5X2xjX2NhbGlicmF0ZShodywgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJLyogRm9yIDFUMVIgKi8KKwkJX3J0bDkyZF9waHlfbGNfY2FsaWJyYXRlKGh3LCBmYWxzZSk7CisJfQorCXJ0bHBoeS0+bGNrX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKwlSVFBSSU5UKHJ0bHByaXYsIEZJTklULCBJTklUX0lRSywgKCJMQ0s6RmluaXNoISEhXG4iKSk7Cit9CisKK3ZvaWQgcnRsOTJkX3BoeV9hcF9jYWxpYnJhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNoYXIgZGVsdGEpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgYm9vbCBfcnRsOTJkX3BoeV9zZXRfc3dfY2hubF9jbWRhcnJheShzdHJ1Y3Qgc3djaG5sY21kICpjbWR0YWJsZSwKKwkJdTMyIGNtZHRhYmxlaWR4LCB1MzIgY21kdGFibGVzeiwgZW51bSBzd2NobmxjbWRfaWQgY21kaWQsCisJCXUzMiBwYXJhMSwgdTMyIHBhcmEyLCB1MzIgbXNkZWxheSkKK3sKKwlzdHJ1Y3Qgc3djaG5sY21kICpwY21kOworCisJaWYgKGNtZHRhYmxlID09IE5VTEwpIHsKKwkJUlRfQVNTRVJUKGZhbHNlLCAoImNtZHRhYmxlIGNhbm5vdCBiZSBOVUxMLlxuIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChjbWR0YWJsZWlkeCA+PSBjbWR0YWJsZXN6KQorCQlyZXR1cm4gZmFsc2U7CisKKwlwY21kID0gY21kdGFibGUgKyBjbWR0YWJsZWlkeDsKKwlwY21kLT5jbWRpZCA9IGNtZGlkOworCXBjbWQtPnBhcmExID0gcGFyYTE7CisJcGNtZC0+cGFyYTIgPSBwYXJhMjsKKwlwY21kLT5tc2RlbGF5ID0gbXNkZWxheTsKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBydGw5MmRfcGh5X3Jlc2V0X2lxa19yZXN1bHQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJdTggaTsKKworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsCisJCQkoInNldHRpbmdzIHJlZ3MgJWQgZGVmYXVsdCByZWdzICVkXG4iLAorCQkJKGludCkoc2l6ZW9mKHJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nKSAvCisJCQlzaXplb2Yoc3RydWN0IGlxa19tYXRyaXhfcmVncykpLAorCQkJSVFLX01BVFJJWF9SRUdfTlVNKSk7CisJLyogMHhlOTQsIDB4ZTljLCAweGVhNCwgMHhlYWMsIDB4ZWI0LCAweGViYywgMHhlYzQsIDB4ZWNjICovCisJZm9yIChpID0gMDsgaSA8IElRS19NQVRSSVhfU0VUVElOR1NfTlVNOyBpKyspIHsKKwkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaV0udmFsdWVbMF1bMF0gPSAweDEwMDsKKwkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaV0udmFsdWVbMF1bMl0gPSAweDEwMDsKKwkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaV0udmFsdWVbMF1bNF0gPSAweDEwMDsKKwkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaV0udmFsdWVbMF1bNl0gPSAweDEwMDsKKwkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaV0udmFsdWVbMF1bMV0gPSAweDA7CisJCXJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nW2ldLnZhbHVlWzBdWzNdID0gMHgwOworCQlydGxwaHktPmlxa19tYXRyaXhfcmVnc2V0dGluZ1tpXS52YWx1ZVswXVs1XSA9IDB4MDsKKwkJcnRscGh5LT5pcWtfbWF0cml4X3JlZ3NldHRpbmdbaV0udmFsdWVbMF1bN10gPSAweDA7CisJCXJ0bHBoeS0+aXFrX21hdHJpeF9yZWdzZXR0aW5nW2ldLmlxa19kb25lID0gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBfcnRsOTJkX3BoeV9zd19jaG5sX3N0ZXBfYnlfc3RlcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgICB1OCBjaGFubmVsLCB1OCAqc3RhZ2UsIHU4ICpzdGVwLAorCQkJCQkgICAgIHUzMiAqZGVsYXkpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHN3Y2hubGNtZCBwcmVjb21tb25jbWRbTUFYX1BSRUNNRF9DTlRdOworCXUzMiBwcmVjb21tb25jbWRjbnQ7CisJc3RydWN0IHN3Y2hubGNtZCBwb3N0Y29tbW9uY21kW01BWF9QT1NUQ01EX0NOVF07CisJdTMyIHBvc3Rjb21tb25jbWRjbnQ7CisJc3RydWN0IHN3Y2hubGNtZCByZmRlcGVuZGNtZFtNQVhfUkZERVBFTkRDTURfQ05UXTsKKwl1MzIgcmZkZXBlbmRjbWRjbnQ7CisJc3RydWN0IHN3Y2hubGNtZCAqY3VycmVudGNtZCA9IE5VTEw7CisJdTggcmZwYXRoOworCXU4IG51bV90b3RhbF9yZnBhdGggPSBydGxwaHktPm51bV90b3RhbF9yZnBhdGg7CisKKwlwcmVjb21tb25jbWRjbnQgPSAwOworCV9ydGw5MmRfcGh5X3NldF9zd19jaG5sX2NtZGFycmF5KHByZWNvbW1vbmNtZCwgcHJlY29tbW9uY21kY250KyssCisJCQkJCSBNQVhfUFJFQ01EX0NOVCwKKwkJCQkJIENNRElEX1NFVF9UWFBPV0VST1dFUl9MRVZFTCwgMCwgMCwgMCk7CisJX3J0bDkyZF9waHlfc2V0X3N3X2NobmxfY21kYXJyYXkocHJlY29tbW9uY21kLCBwcmVjb21tb25jbWRjbnQrKywKKwkJCQkJIE1BWF9QUkVDTURfQ05ULCBDTURJRF9FTkQsIDAsIDAsIDApOworCXBvc3Rjb21tb25jbWRjbnQgPSAwOworCV9ydGw5MmRfcGh5X3NldF9zd19jaG5sX2NtZGFycmF5KHBvc3Rjb21tb25jbWQsIHBvc3Rjb21tb25jbWRjbnQrKywKKwkJCQkJIE1BWF9QT1NUQ01EX0NOVCwgQ01ESURfRU5ELCAwLCAwLCAwKTsKKwlyZmRlcGVuZGNtZGNudCA9IDA7CisJX3J0bDkyZF9waHlfc2V0X3N3X2NobmxfY21kYXJyYXkocmZkZXBlbmRjbWQsIHJmZGVwZW5kY21kY250KyssCisJCQkJCSBNQVhfUkZERVBFTkRDTURfQ05ULCBDTURJRF9SRl9XUklURVJFRywKKwkJCQkJIFJGX0NITkxCVywgY2hhbm5lbCwgMCk7CisJX3J0bDkyZF9waHlfc2V0X3N3X2NobmxfY21kYXJyYXkocmZkZXBlbmRjbWQsIHJmZGVwZW5kY21kY250KyssCisJCQkJCSBNQVhfUkZERVBFTkRDTURfQ05ULCBDTURJRF9FTkQsCisJCQkJCSAwLCAwLCAwKTsKKworCWRvIHsKKwkJc3dpdGNoICgqc3RhZ2UpIHsKKwkJY2FzZSAwOgorCQkJY3VycmVudGNtZCA9ICZwcmVjb21tb25jbWRbKnN0ZXBdOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWN1cnJlbnRjbWQgPSAmcmZkZXBlbmRjbWRbKnN0ZXBdOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWN1cnJlbnRjbWQgPSAmcG9zdGNvbW1vbmNtZFsqc3RlcF07CisJCQlicmVhazsKKwkJfQorCQlpZiAoY3VycmVudGNtZC0+Y21kaWQgPT0gQ01ESURfRU5EKSB7CisJCQlpZiAoKCpzdGFnZSkgPT0gMikgeworCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQkoKnN0YWdlKSsrOworCQkJCSgqc3RlcCkgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXN3aXRjaCAoY3VycmVudGNtZC0+Y21kaWQpIHsKKwkJY2FzZSBDTURJRF9TRVRfVFhQT1dFUk9XRVJfTEVWRUw6CisJCQlydGw5MmRfcGh5X3NldF90eHBvd2VyX2xldmVsKGh3LCBjaGFubmVsKTsKKwkJCWJyZWFrOworCQljYXNlIENNRElEX1dSSVRFUE9SVF9VTE9ORzoKKwkJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBjdXJyZW50Y21kLT5wYXJhMSwKKwkJCQkJY3VycmVudGNtZC0+cGFyYTIpOworCQkJYnJlYWs7CisJCWNhc2UgQ01ESURfV1JJVEVQT1JUX1VTSE9SVDoKKwkJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIGN1cnJlbnRjbWQtPnBhcmExLAorCQkJCSAgICAgICAodTE2KWN1cnJlbnRjbWQtPnBhcmEyKTsKKwkJCWJyZWFrOworCQljYXNlIENNRElEX1dSSVRFUE9SVF9VQ0hBUjoKKwkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIGN1cnJlbnRjbWQtPnBhcmExLAorCQkJCSAgICAgICAodTgpY3VycmVudGNtZC0+cGFyYTIpOworCQkJYnJlYWs7CisJCWNhc2UgQ01ESURfUkZfV1JJVEVSRUc6CisJCQlmb3IgKHJmcGF0aCA9IDA7IHJmcGF0aCA8IG51bV90b3RhbF9yZnBhdGg7IHJmcGF0aCsrKSB7CisJCQkJcnRscGh5LT5yZnJlZ19jaG5sdmFsW3JmcGF0aF0gPQorCQkJCQkoKHJ0bHBoeS0+cmZyZWdfY2hubHZhbFtyZnBhdGhdICYKKwkJCQkJMHhmZmZmZmYwMCkgfCBjdXJyZW50Y21kLT5wYXJhMik7CisJCQkJaWYgKHJ0bHByaXYtPnJ0bGhhbC5jdXJyZW50X2JhbmR0eXBlID09CisJCQkJICAgIEJBTkRfT05fNUcpIHsKKwkJCQkJaWYgKGN1cnJlbnRjbWQtPnBhcmEyID4gOTkpCisJCQkJCQlydGxwaHktPnJmcmVnX2Nobmx2YWxbcmZwYXRoXSA9CisJCQkJCQkgICAgcnRscGh5LT5yZnJlZ19jaG5sdmFsCisJCQkJCQkgICAgW3JmcGF0aF0gfCAoQklUKDE4KSk7CisJCQkJCWVsc2UKKwkJCQkJCXJ0bHBoeS0+cmZyZWdfY2hubHZhbFtyZnBhdGhdID0KKwkJCQkJCSAgICBydGxwaHktPnJmcmVnX2Nobmx2YWwKKwkJCQkJCSAgICBbcmZwYXRoXSAmICh+QklUKDE4KSk7CisJCQkJCXJ0bHBoeS0+cmZyZWdfY2hubHZhbFtyZnBhdGhdIHw9CisJCQkJCQkgKEJJVCgxNikgfCBCSVQoOCkpOworCQkJCX0gZWxzZSB7CisJCQkJCXJ0bHBoeS0+cmZyZWdfY2hubHZhbFtyZnBhdGhdICY9CisJCQkJCQl+KEJJVCg4KSB8IEJJVCgxNikgfCBCSVQoMTgpKTsKKwkJCQl9CisJCQkJcnRsX3NldF9yZnJlZyhodywgKGVudW0gcmFkaW9fcGF0aClyZnBhdGgsCisJCQkJCSAgICAgIGN1cnJlbnRjbWQtPnBhcmExLAorCQkJCQkgICAgICBCUkZSRUdPRkZTRVRNQVNLLAorCQkJCQkgICAgICBydGxwaHktPnJmcmVnX2Nobmx2YWxbcmZwYXRoXSk7CisJCQkJX3J0bDkyZF9waHlfcmVsb2FkX2ltcl9zZXR0aW5nKGh3LCBjaGFubmVsLAorCQkJCQkJCSAgICAgICByZnBhdGgpOworCQkJfQorCQkJX3J0bDkyZF9waHlfc3dpdGNoX3JmX3NldHRpbmcoaHcsIGNoYW5uZWwpOworCQkJLyogZG8gSVFLIHdoZW4gYWxsIHBhcmFtZXRlcnMgYXJlIHJlYWR5ICovCisJCQlydGw5MmRfcGh5X3JlbG9hZF9pcWtfc2V0dGluZyhodywgY2hhbm5lbCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkJICgic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0gd2hpbGUgKHRydWUpOworCSgqZGVsYXkpID0gY3VycmVudGNtZC0+bXNkZWxheTsKKwkoKnN0ZXApKys7CisJcmV0dXJuIGZhbHNlOworfQorCit1OCBydGw5MmRfcGh5X3N3X2Nobmwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1MzIgZGVsYXk7CisJdTMyIHRpbWVvdXQgPSAxMDAwLCB0aW1lY291bnQgPSAwOworCXU4IGNoYW5uZWwgPSBydGxwaHktPmN1cnJlbnRfY2hhbm5lbDsKKwl1MzIgcmV0X3ZhbHVlOworCisJaWYgKHJ0bHBoeS0+c3dfY2hubF9pbnByb2dyZXNzKQorCQlyZXR1cm4gMDsKKwlpZiAocnRscGh5LT5zZXRfYndtb2RlX2lucHJvZ3Jlc3MpCisJCXJldHVybiAwOworCisJaWYgKChpc19oYWxfc3RvcChydGxoYWwpKSB8fCAoUlRfQ0FOTk9UX0lPKGh3KSkpIHsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DSEFOLCBEQkdfTE9VRCwKKwkJCSAoInN3X2NobmxfaW5wcm9ncmVzcyBmYWxzZSBkcml2ZXIgc2xlZXAgb3IgdW5sb2FkXG4iKSk7CisJCXJldHVybiAwOworCX0KKwl3aGlsZSAocnRscGh5LT5sY2tfaW5wcm9ncmVzcyAmJiB0aW1lY291bnQgPCB0aW1lb3V0KSB7CisJCW1kZWxheSg1MCk7CisJCXRpbWVjb3VudCArPSA1MDsKKwl9CisJaWYgKHJ0bGhhbC0+bWFjcGh5bW9kZSA9PSBTSU5HTEVNQUNfU0lOR0xFUEhZICYmCisJICAgIHJ0bGhhbC0+YmFuZHNldCA9PSBCQU5EX09OX0JPVEgpIHsKKwkJcmV0X3ZhbHVlID0gcnRsX2dldF9iYnJlZyhodywgUkZQR0EwX1hBQl9SRlBBUkFNRVRFUiwKKwkJCQkJICBCTUFTS0RXT1JEKTsKKwkJaWYgKHJ0bHBoeS0+Y3VycmVudF9jaGFubmVsID4gMTQgJiYgIShyZXRfdmFsdWUgJiBCSVQoMCkpKQorCQkJcnRsOTJkX3BoeV9zd2l0Y2hfd2lyZWxlc3NiYW5kKGh3LCBCQU5EX09OXzVHKTsKKwkJZWxzZSBpZiAocnRscGh5LT5jdXJyZW50X2NoYW5uZWwgPD0gMTQgJiYgKHJldF92YWx1ZSAmIEJJVCgwKSkpCisJCQlydGw5MmRfcGh5X3N3aXRjaF93aXJlbGVzc2JhbmQoaHcsIEJBTkRfT05fMl80Ryk7CisJfQorCXN3aXRjaCAocnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlKSB7CisJY2FzZSBCQU5EX09OXzVHOgorCQkvKiBHZXQgZmlyc3QgY2hhbm5lbCBlcnJvciB3aGVuIGNoYW5nZSBiZXR3ZWVuCisJCSAqIDVHIGFuZCAyLjRHIGJhbmQuICovCisJCWlmIChjaGFubmVsIDw9IDE0KQorCQkJcmV0dXJuIDA7CisJCVJUX0FTU0VSVCgoY2hhbm5lbCA+IDE0KSwgKCI1RyBidXQgY2hhbm5lbDw9MTQiKSk7CisJCWJyZWFrOworCWNhc2UgQkFORF9PTl8yXzRHOgorCQkvKiBHZXQgZmlyc3QgY2hhbm5lbCBlcnJvciB3aGVuIGNoYW5nZSBiZXR3ZWVuCisJCSAqIDVHIGFuZCAyLjRHIGJhbmQuICovCisJCWlmIChjaGFubmVsID4gMTQpCisJCQlyZXR1cm4gMDsKKwkJUlRfQVNTRVJUKChjaGFubmVsIDw9IDE0KSwgKCIyRyBidXQgY2hhbm5lbD4xNCIpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlRfQVNTRVJUKGZhbHNlLAorCQkJICAoIkludmFsaWQgV2lyZWxlc3NNb2RlKCUjeCkhIVxuIiwKKwkJCSAgIHJ0bHByaXYtPm1hYzgwMjExLm1vZGUpKTsKKwkJYnJlYWs7CisJfQorCXJ0bHBoeS0+c3dfY2hubF9pbnByb2dyZXNzID0gdHJ1ZTsKKwlpZiAoY2hhbm5lbCA9PSAwKQorCQljaGFubmVsID0gMTsKKwlydGxwaHktPnN3X2Nobmxfc3RhZ2UgPSAwOworCXJ0bHBoeS0+c3dfY2hubF9zdGVwID0gMDsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX1NDQU4sIERCR19UUkFDRSwKKwkJICgic3dpdGNoIHRvIGNoYW5uZWwlZFxuIiwgcnRscGh5LT5jdXJyZW50X2NoYW5uZWwpKTsKKworCWRvIHsKKwkJaWYgKCFydGxwaHktPnN3X2NobmxfaW5wcm9ncmVzcykKKwkJCWJyZWFrOworCQlpZiAoIV9ydGw5MmRfcGh5X3N3X2Nobmxfc3RlcF9ieV9zdGVwKGh3LAorCQkJCQkJICAgICAgcnRscGh5LT5jdXJyZW50X2NoYW5uZWwsCisJCSAgICAmcnRscGh5LT5zd19jaG5sX3N0YWdlLCAmcnRscGh5LT5zd19jaG5sX3N0ZXAsICZkZWxheSkpIHsKKwkJCWlmIChkZWxheSA+IDApCisJCQkJbWRlbGF5KGRlbGF5KTsKKwkJCWVsc2UKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCXJ0bHBoeS0+c3dfY2hubF9pbnByb2dyZXNzID0gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJfSB3aGlsZSAodHJ1ZSk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9TQ0FOLCBEQkdfVFJBQ0UsICgiPD09XG4iKSk7CisJcnRscGh5LT5zd19jaG5sX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcnRsOTJkX3BoeV9zZXRfaW8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0NNRCwgREJHX1RSQUNFLAorCQkgKCItLS0+Q21kKCUjeCksIHNldF9pb19pbnByb2dyZXNzKCVkKVxuIiwKKwkJIHJ0bHBoeS0+Y3VycmVudF9pb190eXBlLCBydGxwaHktPnNldF9pb19pbnByb2dyZXNzKSk7CisJc3dpdGNoIChydGxwaHktPmN1cnJlbnRfaW9fdHlwZSkgeworCWNhc2UgSU9fQ01EX1JFU1VNRV9ETV9CWV9TQ0FOOgorCQlkZV9kaWd0YWJsZS5jdXJfaWd2YWx1ZSA9IHJ0bHBoeS0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTE7CisJCXJ0bDkyZF9kbV93cml0ZV9kaWcoaHcpOworCQlydGw5MmRfcGh5X3NldF90eHBvd2VyX2xldmVsKGh3LCBydGxwaHktPmN1cnJlbnRfY2hhbm5lbCk7CisJCWJyZWFrOworCWNhc2UgSU9fQ01EX1BBVVNFX0RNX0JZX1NDQU46CisJCXJ0bHBoeS0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEgPSBkZV9kaWd0YWJsZS5jdXJfaWd2YWx1ZTsKKwkJZGVfZGlndGFibGUuY3VyX2lndmFsdWUgPSAweDE3OworCQlydGw5MmRfZG1fd3JpdGVfZGlnKGh3KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKSk7CisJCWJyZWFrOworCX0KKwlydGxwaHktPnNldF9pb19pbnByb2dyZXNzID0gZmFsc2U7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19UUkFDRSwKKwkJICgiPC0tLSglI3gpXG4iLCBydGxwaHktPmN1cnJlbnRfaW9fdHlwZSkpOworfQorCitib29sIHJ0bDkyZF9waHlfc2V0X2lvX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBpb190eXBlIGlvdHlwZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlib29sIHBvc3Rwcm9jZXNzaW5nID0gZmFsc2U7CisKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0NNRCwgREJHX1RSQUNFLAorCQkgKCItLT5JTyBDbWQoJSN4KSwgc2V0X2lvX2lucHJvZ3Jlc3MoJWQpXG4iLAorCQkgaW90eXBlLCBydGxwaHktPnNldF9pb19pbnByb2dyZXNzKSk7CisJZG8geworCQlzd2l0Y2ggKGlvdHlwZSkgeworCQljYXNlIElPX0NNRF9SRVNVTUVfRE1fQllfU0NBTjoKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfVFJBQ0UsCisJCQkJICgiW0lPIENNRF0gUmVzdW1lIERNIGFmdGVyIHNjYW4uXG4iKSk7CisJCQlwb3N0cHJvY2Vzc2luZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBJT19DTURfUEFVU0VfRE1fQllfU0NBTjoKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfQ01ELCBEQkdfVFJBQ0UsCisJCQkJICgiW0lPIENNRF0gUGF1c2UgRE0gYmVmb3JlIHNjYW4uXG4iKSk7CisJCQlwb3N0cHJvY2Vzc2luZyA9IHRydWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkJICgic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoZmFsc2UpOworCWlmIChwb3N0cHJvY2Vzc2luZyAmJiAhcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcykgeworCQlydGxwaHktPnNldF9pb19pbnByb2dyZXNzID0gdHJ1ZTsKKwkJcnRscGh5LT5jdXJyZW50X2lvX3R5cGUgPSBpb3R5cGU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlydGw5MmRfcGh5X3NldF9pbyhodyk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9DTUQsIERCR19UUkFDRSwgKCI8LS1JTyBUeXBlKCUjeClcbiIsIGlvdHlwZSkpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkX3BoeV9zZXRfcmZvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwkvKiBhLiAgU1lTX0NMS1IgMHgwOFsxMV0gPSAxICByZXN0b3JlIE1BQyBjbG9jayAqLworCS8qIGIuICBTUFNfQ1RSTCAweDExWzc6MF0gPSAweDJiICovCisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5tYWNwaHltb2RlID09IFNJTkdMRU1BQ19TSU5HTEVQSFkpCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TUFMwX0NUUkwsIDB4MmIpOworCS8qIGMuICBGb3IgUENJRTogU1lTX0ZVTkNfRU4gMHgwMls3OjBdID0gMHhFMyBlbmFibGUgQkIgVFJYIGZ1bmN0aW9uICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOLCAweEUzKTsKKwkvKiBSRl9PTl9FWENFUChkfmcpOiAqLworCS8qIGQuICBBUFNEX0NUUkwgMHg2MDBbNzowXSA9IDB4MDAgKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQVBTRF9DVFJMLCAweDAwKTsKKwkvKiBlLiAgU1lTX0ZVTkNfRU4gMHgwMls3OjBdID0gMHhFMiAgcmVzZXQgQkIgVFJYIGZ1bmN0aW9uIGFnYWluICovCisJLyogZi4gIFNZU19GVU5DX0VOIDB4MDJbNzowXSA9IDB4RTMgIGVuYWJsZSBCQiBUUlggZnVuY3Rpb24qLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTiwgMHhFMik7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOLCAweEUzKTsKKwkvKiBnLiAgIHR4cGF1c2UgMHg1MjJbNzowXSA9IDB4MDAgIGVuYWJsZSBtYWMgdHggcXVldWUgKi8KKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfVFhQQVVTRSwgMHgwMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X3NldF9yZnNsZWVwKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgdTRidG1wOworCXU4IGRlbGF5ID0gNTsKKworCS8qIGEuICAgVFhQQVVTRSAweDUyMls3OjBdID0gMHhGRiAgUGF1c2UgTUFDIFRYIHF1ZXVlICAqLworCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19UWFBBVVNFLCAweEZGKTsKKwkvKiBiLiAgIFJGIHBhdGggMCBvZmZzZXQgMHgwMCA9IDB4MDAgIGRpc2FibGUgUkYgICovCisJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIDB4MDAsIEJSRlJFR09GRlNFVE1BU0ssIDB4MDApOworCS8qIGMuICAgQVBTRF9DVFJMIDB4NjAwWzc6MF0gPSAweDQwICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0FQU0RfQ1RSTCwgMHg0MCk7CisJLyogZC4gQVBTRF9DVFJMIDB4NjAwWzc6MF0gPSAweDAwCisJICogQVBTRF9DVFJMIDB4NjAwWzc6MF0gPSAweDAwCisJICogUkYgcGF0aCAwIG9mZnNldCAweDAwID0gMHgwMAorCSAqIEFQU0RfQ1RSTCAweDYwMFs3OjBdID0gMHg0MAorCSAqICovCisJdTRidG1wID0gcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIDAsIEJSRlJFR09GRlNFVE1BU0spOworCXdoaWxlICh1NGJ0bXAgIT0gMCAmJiBkZWxheSA+IDApIHsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0FQU0RfQ1RSTCwgMHgwKTsKKwkJcnRsX3NldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIDB4MDAsIEJSRlJFR09GRlNFVE1BU0ssIDB4MDApOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQVBTRF9DVFJMLCAweDQwKTsKKwkJdTRidG1wID0gcnRsX2dldF9yZnJlZyhodywgUkY5MF9QQVRIX0EsIDAsIEJSRlJFR09GRlNFVE1BU0spOworCQlkZWxheS0tOworCX0KKwlpZiAoZGVsYXkgPT0gMCkgeworCQkvKiBKdW1wIG91dCB0aGUgTFBTIHR1cm4gb2ZmIHNlcXVlbmNlIHRvIFJGX09OX0VYQ0VQICovCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19BUFNEX0NUUkwsIDB4MDApOworCisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTiwgMHhFMik7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19TWVNfRlVOQ19FTiwgMHhFMyk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19UWFBBVVNFLCAweDAwKTsKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9QT1dFUiwgREJHX0xPVUQsCisJCQkoIkZhaWwgISEhIFN3aXRjaCBSRiB0aW1lb3V0LlxuIikpOworCQlyZXR1cm47CisJfQorCS8qIGUuICAgRm9yIFBDSUU6IFNZU19GVU5DX0VOIDB4MDJbNzowXSA9IDB4RTIgcmVzZXQgQkIgVFJYIGZ1bmN0aW9uICovCisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NZU19GVU5DX0VOLCAweEUyKTsKKwkvKiBmLiAgIFNQU19DVFJMIDB4MTFbNzowXSA9IDB4MjIgKi8KKwlpZiAocnRscHJpdi0+cnRsaGFsLm1hY3BoeW1vZGUgPT0gU0lOR0xFTUFDX1NJTkdMRVBIWSkKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX1NQUzBfQ1RSTCwgMHgyMik7CisJLyogZy4gICAgU1lTX0NMS1IgMHgwOFsxMV0gPSAwICBnYXRlZCBNQUMgY2xvY2sgKi8KK30KKworYm9vbCBydGw5MmRfcGh5X3NldF9yZl9wb3dlcl9zdGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBlbnVtIHJmX3B3cnN0YXRlIHJmcHdyX3N0YXRlKQoreworCisJYm9vbCBicmVzdWx0ID0gdHJ1ZTsKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9wY2lfcHJpdiAqcGNpcHJpdiA9IHJ0bF9wY2lwcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcGNpICpydGxwY2kgPSBydGxfcGNpZGV2KHJ0bF9wY2lwcml2KGh3KSk7CisJdTggaSwgcXVldWVfaWQ7CisJc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZyA9IE5VTEw7CisKKwlpZiAocmZwd3Jfc3RhdGUgPT0gcHBzYy0+cmZwd3Jfc3RhdGUpCisJCXJldHVybiBmYWxzZTsKKwlzd2l0Y2ggKHJmcHdyX3N0YXRlKSB7CisJY2FzZSBFUkZPTjoKKwkJaWYgKChwcHNjLT5yZnB3cl9zdGF0ZSA9PSBFUkZPRkYpICYmCisJCSAgICBSVF9JTl9QU19MRVZFTChwcHNjLCBSVF9SRl9PRkZfTEVWTF9IQUxUX05JQykpIHsKKwkJCWJvb2wgcnRzdGF0dXM7CisJCQl1MzIgSW5pdGlhbGl6ZUNvdW50ID0gMDsKKwkJCWRvIHsKKwkJCQlJbml0aWFsaXplQ291bnQrKzsKKwkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1JGLCBEQkdfRE1FU0csCisJCQkJCSAoIklQUyBTZXQgZVJmIG5pYyBlbmFibGVcbiIpKTsKKwkJCQlydHN0YXR1cyA9IHJ0bF9wc19lbmFibGVfbmljKGh3KTsKKwkJCX0gd2hpbGUgKChydHN0YXR1cyAhPSB0cnVlKSAmJgorCQkJCSAoSW5pdGlhbGl6ZUNvdW50IDwgMTApKTsKKworCQkJUlRfQ0xFQVJfUFNfTEVWRUwocHBzYywKKwkJCQkJICBSVF9SRl9PRkZfTEVWTF9IQUxUX05JQyk7CisJCX0gZWxzZSB7CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1BPV0VSLCBEQkdfRE1FU0csCisJCQkJICgiYXdha2UsIHNsZWVwZWQ6JWQgbXMgc3RhdGVfIgorCQkJCSAiaW5hcDoleFxuIiwKKwkJCQkgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0KKwkJCQkgcHBzYy0+bGFzdF9zbGVlcF9qaWZmaWVzKSwKKwkJCQkgcnRscHJpdi0+cHNjLnN0YXRlX2luYXApKTsKKwkJCXBwc2MtPmxhc3RfYXdha2VfamlmZmllcyA9IGppZmZpZXM7CisJCQlfcnRsOTJkX3BoeV9zZXRfcmZvbihodyk7CisJCX0KKworCQlpZiAobWFjLT5saW5rX3N0YXRlID09IE1BQzgwMjExX0xJTktFRCkKKwkJCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywKKwkJCQkJIExFRF9DVExfTElOSyk7CisJCWVsc2UKKwkJCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywKKwkJCQkJIExFRF9DVExfTk9fTElOSyk7CisJCWJyZWFrOworCWNhc2UgRVJGT0ZGOgorCQlpZiAocHBzYy0+cmVnX3JmcHNfbGV2ZWwgJiBSVF9SRl9PRkZfTEVWTF9IQUxUX05JQykgeworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX0RNRVNHLAorCQkJCSAoIklQUyBTZXQgZVJmIG5pYyBkaXNhYmxlXG4iKSk7CisJCQlydGxfcHNfZGlzYWJsZV9uaWMoaHcpOworCQkJUlRfU0VUX1BTX0xFVkVMKHBwc2MsIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwcHNjLT5yZm9mZl9yZWFzb24gPT0gUkZfQ0hBTkdFX0JZX0lQUykKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+bGVkX2NvbnRyb2woaHcsCisJCQkJCQkgTEVEX0NUTF9OT19MSU5LKTsKKwkJCWVsc2UKKwkJCQlydGxwcml2LT5jZmctPm9wcy0+bGVkX2NvbnRyb2woaHcsCisJCQkJCQkgTEVEX0NUTF9QT1dFUl9PRkYpOworCQl9CisJCWJyZWFrOworCWNhc2UgRVJGU0xFRVA6CisJCWlmIChwcHNjLT5yZnB3cl9zdGF0ZSA9PSBFUkZPRkYpCisJCQlicmVhazsKKworCQlmb3IgKHF1ZXVlX2lkID0gMCwgaSA9IDA7CisJCSAgICAgcXVldWVfaWQgPCBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVDspIHsKKwkJCXJpbmcgPSAmcGNpcHJpdi0+ZGV2LnR4X3JpbmdbcXVldWVfaWRdOworCQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSA9PSAwIHx8CisJCQkgICAgcXVldWVfaWQgPT0gQkVBQ09OX1FVRVVFKSB7CisJCQkJcXVldWVfaWQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAocnRscGNpLT5wZGV2LT5jdXJyZW50X3N0YXRlICE9IFBDSV9EMCkgeworCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVIsIERCR19MT1VELAorCQkJCQkgKCJlUmYgT2ZmL1NsZWVwOiAlZCB0aW1lcyBUY2JCdXN5UXVldSIKKwkJCQkJICJlWyVkXSAhPTAgYnV0IGxvd2VyIHBvd2VyIHN0YXRlIVxuIiwKKwkJCQkJIChpICsgMSksIHF1ZXVlX2lkKSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfV0FSTklORywKKwkJCQkJICgiZVJmIE9mZi9TbGVlcDogJWQgdGltZXMgVGNiQnVzeVF1ZXUiCisJCQkJCSAiZVslZF0gPSVkICIKKwkJCQkJICJiZWZvcmUgZG96ZSFcbiIsIChpICsgMSksIHF1ZXVlX2lkLAorCQkJCQkgIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSkpOworCQkJCXVkZWxheSgxMCk7CisJCQkJaSsrOworCQkJfQorCisJCQlpZiAoaSA+PSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzl4KSB7CisJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19XQVJOSU5HLAorCQkJCQkgKCJcbkVSRk9GRjogJWQgdGltZXMgVGNiQnVzeVF1ZXVlWyVkXSAiCisJCQkJCSAiPSAlZCAhXG4iLAorCQkJCQkgIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfOXgsIHF1ZXVlX2lkLAorCQkJCQkgIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVIsIERCR19ETUVTRywKKwkJCSAoIlNldCByZnNsZWVwIGF3YWtlZDolZCBtc1xuIiwKKwkJCSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBwcHNjLT5sYXN0X2F3YWtlX2ppZmZpZXMpKSk7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUE9XRVIsIERCR19ETUVTRywgKCJzbGVlcCBhd2FrZWQ6JWQgbXMgIgorCQkJICJzdGF0ZV9pbmFwOiV4XG4iLCBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLQorCQkJIHBwc2MtPmxhc3RfYXdha2VfamlmZmllcyksIHJ0bHByaXYtPnBzYy5zdGF0ZV9pbmFwKSk7CisJCXBwc2MtPmxhc3Rfc2xlZXBfamlmZmllcyA9IGppZmZpZXM7CisJCV9ydGw5MmRfcGh5X3NldF9yZnNsZWVwKGh3KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKKwkJCSAoInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKSk7CisJCWJyZXN1bHQgPSBmYWxzZTsKKwkJYnJlYWs7CisJfQorCWlmIChicmVzdWx0KQorCQlwcHNjLT5yZnB3cl9zdGF0ZSA9IHJmcHdyX3N0YXRlOworCXJldHVybiBicmVzdWx0OworfQorCit2b2lkIHJ0bDkyZF9waHlfY29uZmlnX21hY3BoeW1vZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJdTggb2Zmc2V0ID0gUkVHX01BQ19QSFlfQ1RSTF9OT1JNQUw7CisKKwlzd2l0Y2ggKHJ0bGhhbC0+bWFjcGh5bW9kZSkgeworCWNhc2UgRFVBTE1BQ19EVUFMUEhZOgorCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELAorCQkJICgiTWFjUGh5TW9kZTogRFVBTE1BQ19EVUFMUEhZXG4iKSk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIG9mZnNldCwgMHhGMyk7CisJCWJyZWFrOworCWNhc2UgU0lOR0xFTUFDX1NJTkdMRVBIWToKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCSAoIk1hY1BoeU1vZGU6IFNJTkdMRU1BQ19TSU5HTEVQSFlcbiIpKTsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgb2Zmc2V0LCAweEY0KTsKKwkJYnJlYWs7CisJY2FzZSBEVUFMTUFDX1NJTkdMRVBIWToKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCSAoIk1hY1BoeU1vZGU6IERVQUxNQUNfU0lOR0xFUEhZXG4iKSk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIG9mZnNldCwgMHhGMSk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBydGw5MmRfcGh5X2NvbmZpZ19tYWNwaHltb2RlX2luZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSBydGxfaGFsKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKworCXN3aXRjaCAocnRsaGFsLT5tYWNwaHltb2RlKSB7CisJY2FzZSBEVUFMTUFDX1NJTkdMRVBIWToKKwkJcnRscGh5LT5yZl90eXBlID0gUkZfMlQyUjsKKwkJcnRsaGFsLT52ZXJzaW9uIHw9IENISVBfOTJEX1NJTkdMRVBIWTsKKwkJcnRsaGFsLT5iYW5kc2V0ID0gQkFORF9PTl9CT1RIOworCQlydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPSBCQU5EX09OXzJfNEc7CisJCWJyZWFrOworCisJY2FzZSBTSU5HTEVNQUNfU0lOR0xFUEhZOgorCQlydGxwaHktPnJmX3R5cGUgPSBSRl8yVDJSOworCQlydGxoYWwtPnZlcnNpb24gfD0gQ0hJUF85MkRfU0lOR0xFUEhZOworCQlydGxoYWwtPmJhbmRzZXQgPSBCQU5EX09OX0JPVEg7CisJCXJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9IEJBTkRfT05fMl80RzsKKwkJYnJlYWs7CisKKwljYXNlIERVQUxNQUNfRFVBTFBIWToKKwkJcnRscGh5LT5yZl90eXBlID0gUkZfMVQxUjsKKwkJcnRsaGFsLT52ZXJzaW9uICY9ICh+Q0hJUF85MkRfU0lOR0xFUEhZKTsKKwkJLyogTm93IHdlIGxldCBNQUMwIHJ1biBvbiA1RyBiYW5kLiAqLworCQlpZiAocnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9PSAwKSB7CisJCQlydGxoYWwtPmJhbmRzZXQgPSBCQU5EX09OXzVHOworCQkJcnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID0gQkFORF9PTl81RzsKKwkJfSBlbHNlIHsKKwkJCXJ0bGhhbC0+YmFuZHNldCA9IEJBTkRfT05fMl80RzsKKwkJCXJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9IEJBTkRfT05fMl80RzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3U4IHJ0bDkyZF9nZXRfY2hubGdyb3VwX2Zyb21hcnJheSh1OCBjaG5sKQoreworCXU4IGdyb3VwOworCXU4IGNoYW5uZWxfaW5mb1s1OV0gPSB7CisJCTEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKwkJMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUwLCA1MiwgNTQsIDU2LAorCQk1OCwgNjAsIDYyLCA2NCwgMTAwLCAxMDIsIDEwNCwgMTA2LCAxMDgsCisJCTExMCwgMTEyLCAxMTQsIDExNiwgMTE4LCAxMjAsIDEyMiwgMTI0LAorCQkxMjYsIDEyOCwgMTMwLCAxMzIsIDEzNCwgMTM2LCAxMzgsIDE0MCwKKwkJMTQ5LCAxNTEsIDE1MywgMTU1LCAxNTcsIDE1OSwgMTYxLCAxNjMsCisJCTE2NQorCX07CisKKwlpZiAoY2hhbm5lbF9pbmZvW2NobmxdIDw9IDMpCisJCWdyb3VwID0gMDsKKwllbHNlIGlmIChjaGFubmVsX2luZm9bY2hubF0gPD0gOSkKKwkJZ3JvdXAgPSAxOworCWVsc2UgaWYgKGNoYW5uZWxfaW5mb1tjaG5sXSA8PSAxNCkKKwkJZ3JvdXAgPSAyOworCWVsc2UgaWYgKGNoYW5uZWxfaW5mb1tjaG5sXSA8PSA0NCkKKwkJZ3JvdXAgPSAzOworCWVsc2UgaWYgKGNoYW5uZWxfaW5mb1tjaG5sXSA8PSA1NCkKKwkJZ3JvdXAgPSA0OworCWVsc2UgaWYgKGNoYW5uZWxfaW5mb1tjaG5sXSA8PSA2NCkKKwkJZ3JvdXAgPSA1OworCWVsc2UgaWYgKGNoYW5uZWxfaW5mb1tjaG5sXSA8PSAxMTIpCisJCWdyb3VwID0gNjsKKwllbHNlIGlmIChjaGFubmVsX2luZm9bY2hubF0gPD0gMTI2KQorCQlncm91cCA9IDc7CisJZWxzZSBpZiAoY2hhbm5lbF9pbmZvW2NobmxdIDw9IDE0MCkKKwkJZ3JvdXAgPSA4OworCWVsc2UgaWYgKGNoYW5uZWxfaW5mb1tjaG5sXSA8PSAxNTMpCisJCWdyb3VwID0gOTsKKwllbHNlIGlmIChjaGFubmVsX2luZm9bY2hubF0gPD0gMTU5KQorCQlncm91cCA9IDEwOworCWVsc2UKKwkJZ3JvdXAgPSAxMTsKKwlyZXR1cm4gZ3JvdXA7Cit9CisKK3ZvaWQgcnRsOTJkX3BoeV9zZXRfcG93ZXJvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHZhbHVlODsKKwl1MTYgaTsKKwl1MzIgbWFjX3JlZyA9IChydGxoYWwtPmludGVyZmFjZWluZGV4ID09IDAgPyBSRUdfTUFDMCA6IFJFR19NQUMxKTsKKworCS8qIG5vdGljZSBmdyBrbm93IGJhbmQgc3RhdHVzICAweDgxWzFdLzB4NTNbMV0gPSAwOiA1RywgMTogMkcgKi8KKwlpZiAocnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fMl80RykgeworCQl2YWx1ZTggPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIG1hY19yZWcpOworCQl2YWx1ZTggfD0gQklUKDEpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBtYWNfcmVnLCB2YWx1ZTgpOworCX0gZWxzZSB7CisJCXZhbHVlOCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgbWFjX3JlZyk7CisJCXZhbHVlOCAmPSAofkJJVCgxKSk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIG1hY19yZWcsIHZhbHVlOCk7CisJfQorCisJaWYgKHJ0bGhhbC0+bWFjcGh5bW9kZSA9PSBTSU5HTEVNQUNfU0lOR0xFUEhZKSB7CisJCXZhbHVlOCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX01BQzApOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTUFDMCwgdmFsdWU4IHwgTUFDMF9PTik7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdsb2JhbG11dGV4X3Bvd2VyLCBmbGFncyk7CisJCWlmIChydGxoYWwtPmludGVyZmFjZWluZGV4ID09IDApIHsKKwkJCXZhbHVlOCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX01BQzApOworCQkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX01BQzAsIHZhbHVlOCB8IE1BQzBfT04pOworCQl9IGVsc2UgeworCQkJdmFsdWU4ID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfTUFDMSk7CisJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTUFDMSwgdmFsdWU4IHwgTUFDMV9PTik7CisJCX0KKwkJdmFsdWU4ID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBSRUdfUE9XRVJfT0ZGX0lOX1BST0NFU1MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnbG9iYWxtdXRleF9wb3dlciwgZmxhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKKwkJCWlmICgodmFsdWU4ICYgQklUKDcpKSA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXVkZWxheSg1MDApOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZnbG9iYWxtdXRleF9wb3dlciwgZmxhZ3MpOworCQkJCXZhbHVlOCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwKKwkJCQkJCSAgICBSRUdfUE9XRVJfT0ZGX0lOX1BST0NFU1MpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdsb2JhbG11dGV4X3Bvd2VyLAorCQkJCQkJICAgICAgIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlpZiAoaSA9PSAyMDApCisJCQlSVF9BU1NFUlQoZmFsc2UsICgiQW5vdGhlciBtYWMgcG93ZXIgb2ZmIG92ZXIgdGltZVxuIikpOworCX0KK30KKwordm9pZCBydGw5MmRfcGh5X2NvbmZpZ19tYWNjb2V4aXN0X3JmcGFnZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisKKwlzd2l0Y2ggKHJ0bHByaXYtPnJ0bGhhbC5tYWNwaHltb2RlKSB7CisJY2FzZSBEVUFMTUFDX0RVQUxQSFk6CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19ETUMsIDB4MCk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19SWF9QS1RfTElNSVQsIDB4MDgpOworCQlydGxfd3JpdGVfd29yZChydGxwcml2LCBSRUdfVFJYRkZfQk5EWSArIDIsIDB4MTNmZik7CisJCWJyZWFrOworCWNhc2UgRFVBTE1BQ19TSU5HTEVQSFk6CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19ETUMsIDB4ZjgpOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlhfUEtUX0xJTUlULCAweDA4KTsKKwkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX1RSWEZGX0JORFkgKyAyLCAweDEzZmYpOworCQlicmVhazsKKwljYXNlIFNJTkdMRU1BQ19TSU5HTEVQSFk6CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19ETUMsIDB4MCk7CisJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19SWF9QS1RfTElNSVQsIDB4MTApOworCQlydGxfd3JpdGVfd29yZChydGxwcml2LCAoUkVHX1RSWEZGX0JORFkgKyAyKSwgMHgyN0ZGKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIHJ0bDkyZF91cGRhdGVfYmJyZl9jb25maWd1cmF0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJc3RydWN0IHJ0bF9lZnVzZSAqcnRsZWZ1c2UgPSBydGxfZWZ1c2UocnRsX3ByaXYoaHcpKTsKKwl1OCByZnBhdGgsIGk7CisKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELCAoIj09PlxuIikpOworCS8qIHJfc2VsZWN0XzVHIGZvciBwYXRoX0EvQiAwIGZvciAyLjRHLCAxIGZvciA1RyAqLworCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCS8qIHJfc2VsZWN0XzVHIGZvciBwYXRoX0EvQiwweDg3OCAqLworCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFCX1JGUEFSQU1FVEVSLCBCSVQoMCksIDB4MCk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQUJfUkZQQVJBTUVURVIsIEJJVCgxNSksIDB4MCk7CisJCWlmIChydGxoYWwtPm1hY3BoeW1vZGUgIT0gRFVBTE1BQ19EVUFMUEhZKSB7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFCX1JGUEFSQU1FVEVSLCBCSVQoMTYpLCAweDApOworCQkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBQl9SRlBBUkFNRVRFUiwgQklUKDMxKSwgMHgwKTsKKwkJfQorCQkvKiByc3NpX3RhYmxlX3NlbGVjdDppbmRleCAwIGZvciAyLjRHLjF+MyBmb3IgNUcsMHhjNzggKi8KKwkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX0FHQ1JTU0lUQUJMRSwgQklUKDYpIHwgQklUKDcpLCAweDApOworCQkvKiBmY19hcmVhICAweGQyYyAqLworCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTFfQ0ZPVFJBQ0tJTkcsIEJJVCgxNCkgfCBCSVQoMTMpLCAweDApOworCQkvKiA1RyBMQU4gT04gKi8KKwkJcnRsX3NldF9iYnJlZyhodywgMHhCMzAsIDB4MDBGMDAwMDAsIDB4YSk7CisJCS8qIFRYIEJCIGdhaW4gc2hpZnQqMSxKdXN0IGZvciB0ZXN0Y2hpcCwweGM4MCwweGM4OCAqLworCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfWEFUeElRSU1CQUxBTkNFLCBCTUFTS0RXT1JELAorCQkJICAgICAgMHg0MDAwMDEwMCk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQlR4SVFJTUJBTEFOQ0UsIEJNQVNLRFdPUkQsCisJCQkgICAgICAweDQwMDAwMTAwKTsKKwkJaWYgKHJ0bGhhbC0+bWFjcGh5bW9kZSA9PSBEVUFMTUFDX0RVQUxQSFkpIHsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQUJfUkZJTlRFUkZBQ0VTVywKKwkJCQkgICAgICBCSVQoMTApIHwgQklUKDYpIHwgQklUKDUpLAorCQkJCSAgICAgICgocnRsZWZ1c2UtPmVlcHJvbV9jOSAmIEJJVCgzKSkgPj4gMykgfAorCQkJCSAgICAgIChydGxlZnVzZS0+ZWVwcm9tX2M5ICYgQklUKDEpKSB8CisJCQkJICAgICAgKChydGxlZnVzZS0+ZWVwcm9tX2NjICYgQklUKDEpKSA8PCA0KSk7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFfUkZJTlRFUkZBQ0VPRSwKKwkJCQkgICAgICBCSVQoMTApIHwgQklUKDYpIHwgQklUKDUpLAorCQkJCSAgICAgICgocnRsZWZ1c2UtPmVlcHJvbV9jOSAmIEJJVCgyKSkgPj4gMikgfAorCQkJCSAgICAgICgocnRsZWZ1c2UtPmVlcHJvbV9jOSAmIEJJVCgwKSkgPDwgMSkgfAorCQkJCSAgICAgICgocnRsZWZ1c2UtPmVlcHJvbV9jYyAmIEJJVCgwKSkgPDwgNSkpOworCQkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBQl9SRlBBUkFNRVRFUiwgQklUKDE1KSwgMCk7CisJCX0gZWxzZSB7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFCX1JGSU5URVJGQUNFU1csCisJCQkJICAgICAgQklUKDI2KSB8IEJJVCgyMikgfCBCSVQoMjEpIHwgQklUKDEwKSB8CisJCQkJICAgICAgQklUKDYpIHwgQklUKDUpLAorCQkJCSAgICAgICgocnRsZWZ1c2UtPmVlcHJvbV9jOSAmIEJJVCgzKSkgPj4gMykgfAorCQkJCSAgICAgIChydGxlZnVzZS0+ZWVwcm9tX2M5ICYgQklUKDEpKSB8CisJCQkJICAgICAgKChydGxlZnVzZS0+ZWVwcm9tX2NjICYgQklUKDEpKSA8PCA0KSB8CisJCQkJICAgICAgKChydGxlZnVzZS0+ZWVwcm9tX2M5ICYgQklUKDcpKSA8PCA5KSB8CisJCQkJICAgICAgKChydGxlZnVzZS0+ZWVwcm9tX2M5ICYgQklUKDUpKSA8PCAxMikgfAorCQkJCSAgICAgICgocnRsZWZ1c2UtPmVlcHJvbV9jYyAmIEJJVCgzKSkgPDwgMTgpKTsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQV9SRklOVEVSRkFDRU9FLAorCQkJCSAgICAgIEJJVCgxMCkgfCBCSVQoNikgfCBCSVQoNSksCisJCQkJICAgICAgKChydGxlZnVzZS0+ZWVwcm9tX2M5ICYgQklUKDIpKSA+PiAyKSB8CisJCQkJICAgICAgKChydGxlZnVzZS0+ZWVwcm9tX2M5ICYgQklUKDApKSA8PCAxKSB8CisJCQkJICAgICAgKChydGxlZnVzZS0+ZWVwcm9tX2NjICYgQklUKDApKSA8PCA1KSk7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEJfUkZJTlRFUkZBQ0VPRSwKKwkJCQkgICAgICBCSVQoMTApIHwgQklUKDYpIHwgQklUKDUpLAorCQkJCSAgICAgICgocnRsZWZ1c2UtPmVlcHJvbV9jOSAmIEJJVCg2KSkgPj4gNikgfAorCQkJCSAgICAgICgocnRsZWZ1c2UtPmVlcHJvbV9jOSAmIEJJVCg0KSkgPj4gMykgfAorCQkJCSAgICAgICgocnRsZWZ1c2UtPmVlcHJvbV9jYyAmIEJJVCgyKSkgPDwgMykpOworCQkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBQl9SRlBBUkFNRVRFUiwKKwkJCQkgICAgICBCSVQoMzEpIHwgQklUKDE1KSwgMCk7CisJCX0KKwkJLyogMS41Vl9MRE8gKi8KKwl9IGVsc2UgeworCQkvKiByX3NlbGVjdF81RyBmb3IgcGF0aF9BL0IgKi8KKwkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBQl9SRlBBUkFNRVRFUiwgQklUKDApLCAweDEpOworCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFCX1JGUEFSQU1FVEVSLCBCSVQoMTUpLCAweDEpOworCQlpZiAocnRsaGFsLT5tYWNwaHltb2RlICE9IERVQUxNQUNfRFVBTFBIWSkgeworCQkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBQl9SRlBBUkFNRVRFUiwgQklUKDE2KSwgMHgxKTsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQUJfUkZQQVJBTUVURVIsIEJJVCgzMSksIDB4MSk7CisJCX0KKwkJLyogcnNzaV90YWJsZV9zZWxlY3Q6aW5kZXggMCBmb3IgMi40Ry4xfjMgZm9yIDVHICovCisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9BR0NSU1NJVEFCTEUsIEJJVCg2KSB8IEJJVCg3KSwgMHgxKTsKKwkJLyogZmNfYXJlYSAqLworCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTFfQ0ZPVFJBQ0tJTkcsIEJJVCgxNCkgfCBCSVQoMTMpLCAweDEpOworCQkvKiA1RyBMQU4gT04gKi8KKwkJcnRsX3NldF9iYnJlZyhodywgMHhCMzAsIDB4MDBGMDAwMDAsIDB4MCk7CisJCS8qIFRYIEJCIGdhaW4gc2hpZnQsSnVzdCBmb3IgdGVzdGNoaXAsMHhjODAsMHhjODggKi8KKwkJaWYgKHJ0bGVmdXNlLT5pbnRlcm5hbF9wYV81Z1swXSkKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQVR4SVFJTUJBTEFOQ0UsIEJNQVNLRFdPUkQsCisJCQkJICAgICAgMHgyZDQwMDBiNSk7CisJCWVsc2UKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQVR4SVFJTUJBTEFOQ0UsIEJNQVNLRFdPUkQsCisJCQkJICAgICAgMHgyMDAwMDA4MCk7CisJCWlmIChydGxlZnVzZS0+aW50ZXJuYWxfcGFfNWdbMV0pCisJCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfWEJUeElRSU1CQUxBTkNFLCBCTUFTS0RXT1JELAorCQkJCSAgICAgIDB4MmQ0MDAwYjUpOworCQllbHNlCisJCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfWEJUeElRSU1CQUxBTkNFLCBCTUFTS0RXT1JELAorCQkJCSAgICAgIDB4MjAwMDAwODApOworCQlpZiAocnRsaGFsLT5tYWNwaHltb2RlID09IERVQUxNQUNfRFVBTFBIWSkgeworCQkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBQl9SRklOVEVSRkFDRVNXLAorCQkJCSAgICAgIEJJVCgxMCkgfCBCSVQoNikgfCBCSVQoNSksCisJCQkJICAgICAgKHJ0bGVmdXNlLT5lZXByb21fY2MgJiBCSVQoNSkpKTsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQV9SRklOVEVSRkFDRU9FLCBCSVQoMTApLAorCQkJCSAgICAgICgocnRsZWZ1c2UtPmVlcHJvbV9jYyAmIEJJVCg0KSkgPj4gNCkpOworCQkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBQl9SRlBBUkFNRVRFUiwgQklUKDE1KSwKKwkJCQkgICAgICAocnRsZWZ1c2UtPmVlcHJvbV9jYyAmIEJJVCg0KSkgPj4gNCk7CisJCX0gZWxzZSB7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEFCX1JGSU5URVJGQUNFU1csCisJCQkJICAgICAgQklUKDI2KSB8IEJJVCgyMikgfCBCSVQoMjEpIHwgQklUKDEwKSB8CisJCQkJICAgICAgQklUKDYpIHwgQklUKDUpLAorCQkJCSAgICAgIChydGxlZnVzZS0+ZWVwcm9tX2NjICYgQklUKDUpKSB8CisJCQkJICAgICAgKChydGxlZnVzZS0+ZWVwcm9tX2NjICYgQklUKDcpKSA8PCAxNCkpOworCQkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX1hBX1JGSU5URVJGQUNFT0UsIEJJVCgxMCksCisJCQkJICAgICAgKChydGxlZnVzZS0+ZWVwcm9tX2NjICYgQklUKDQpKSA+PiA0KSk7CisJCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfWEJfUkZJTlRFUkZBQ0VPRSwgQklUKDEwKSwKKwkJCQkgICAgICAoKHJ0bGVmdXNlLT5lZXByb21fY2MgJiBCSVQoNikpID4+IDYpKTsKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIFJGUEdBMF9YQUJfUkZQQVJBTUVURVIsCisJCQkJICAgICAgQklUKDMxKSB8IEJJVCgxNSksCisJCQkJICAgICAgKChydGxlZnVzZS0+ZWVwcm9tX2NjICYgQklUKDQpKSA+PiA0KSB8CisJCQkJICAgICAgKChydGxlZnVzZS0+ZWVwcm9tX2NjICYgQklUKDYpKSA8PCAxMCkpOworCQl9CisJfQorCS8qIHVwZGF0ZSBJUUsgcmVsYXRlZCBzZXR0aW5ncyAqLworCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQVJYSVFJTUJBTEFOQ0UsIEJNQVNLRFdPUkQsIDB4NDAwMDAxMDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQlJYSVFJTUJBTEFOQ0UsIEJNQVNLRFdPUkQsIDB4NDAwMDAxMDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMF9YQ1R4QUZFLCAweEYwMDAwMDAwLCAweDAwKTsKKwlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfRUNDQVRIUkVTSE9MRCwgQklUKDMwKSB8IEJJVCgyOCkgfAorCQkgICAgICBCSVQoMjYpIHwgQklUKDI0KSwgMHgwMCk7CisJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1hEVHhBRkUsIDB4RjAwMDAwMDAsIDB4MDApOworCXJ0bF9zZXRfYmJyZWcoaHcsIDB4Y2EwLCAweEYwMDAwMDAwLCAweDAwKTsKKwlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfQUdDUlNTSVRBQkxFLCAweDAwMDBGMDAwLCAweDAwKTsKKworCS8qIFVwZGF0ZSBSRiAqLworCWZvciAocmZwYXRoID0gUkY5MF9QQVRIX0E7IHJmcGF0aCA8IHJ0bHBoeS0+bnVtX3RvdGFsX3JmcGF0aDsKKwkgICAgIHJmcGF0aCsrKSB7CisJCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CisJCQkvKiBNT0RfQUcgZm9yIFJGIHBhaHRfQSAweDE4IEJJVDgsQklUMTYgKi8KKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIHJmcGF0aCwgUkZfQ0hOTEJXLCBCSVQoOCkgfCBCSVQoMTYpIHwKKwkJCQkgICAgICBCSVQoMTgpLCAwKTsKKwkJCS8qIFJGMHgwYlsxNjoxNF0gPTNiJzExMSAqLworCQkJcnRsX3NldF9yZnJlZyhodywgKGVudW0gcmFkaW9fcGF0aClyZnBhdGgsIDB4MEIsCisJCQkJICAgICAgMHgxYzAwMCwgMHgwNyk7CisJCX0gZWxzZSB7CisJCQkvKiBNT0RfQUcgZm9yIFJGIHBhaHRfQSAweDE4IEJJVDgsQklUMTYgKi8KKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIHJmcGF0aCwgUkZfQ0hOTEJXLCBCSVQoOCkgfAorCQkJCSAgICAgIEJJVCgxNikgfCBCSVQoMTgpLAorCQkJCSAgICAgIChCSVQoMTYpIHwgQklUKDgpKSA+PiA4KTsKKwkJfQorCX0KKwkvKiBVcGRhdGUgZm9yIGFsbCBiYW5kLiAqLworCS8qIERNRFAgKi8KKwlpZiAocnRscGh5LT5yZl90eXBlID09IFJGXzFUMVIpIHsKKwkJLyogVXNlIGFudGVubmEgMCwweGMwNCwweGQwNCAqLworCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTBfVFJYUEFUSEVOQUJMRSwgQk1BU0tCWVRFMCwgMHgxMSk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIFJPRkRNMV9UUlhQQVRIRU5BQkxFLCBCRFdPUkQsIDB4MSk7CisKKwkJLyogZW5hYmxlIGFkL2RhIGNsb2NrMSBmb3IgZHVhbC1waHkgcmVnMHg4ODggKi8KKwkJaWYgKHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPT0gMCkgeworCQkJcnRsX3NldF9iYnJlZyhodywgUkZQR0EwX0FEREFMTE9DS0VOLCBCSVQoMTIpIHwKKwkJCQkgICAgICBCSVQoMTMpLCAweDMpOworCQl9IGVsc2UgeworCQkJcnRsOTJkX3BoeV9lbmFibGVfYW5vdGhlcnBoeShodywgZmFsc2UpOworCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKKwkJCQkgKCJNQUMxIHVzZSBEQkkgdG8gdXBkYXRlIDB4ODg4IikpOworCQkJLyogMHg4ODggKi8KKwkJCXJ0bDkyZGVfd3JpdGVfZHdvcmRfZGJpKGh3LCBSRlBHQTBfQUREQUxMT0NLRU4sCisJCQkJCQlydGw5MmRlX3JlYWRfZHdvcmRfZGJpKGh3LAorCQkJCQkJUkZQR0EwX0FEREFMTE9DS0VOLAorCQkJCQkJQklUKDMpKSB8IEJJVCgxMikgfCBCSVQoMTMpLAorCQkJCQkJQklUKDMpKTsKKwkJCXJ0bDkyZF9waHlfcG93ZXJkb3duX2Fub3RoZXJwaHkoaHcsIGZhbHNlKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNpbmdsZSBQSFkgKi8KKwkJLyogVXNlIGFudGVubmEgMCAmIDEsMHhjMDQsMHhkMDQgKi8KKwkJcnRsX3NldF9iYnJlZyhodywgUk9GRE0wX1RSWFBBVEhFTkFCTEUsIEJNQVNLQllURTAsIDB4MzMpOworCQlydGxfc2V0X2JicmVnKGh3LCBST0ZETTFfVFJYUEFUSEVOQUJMRSwgQkRXT1JELCAweDMpOworCQkvKiBkaXNhYmxlIGFkL2RhIGNsb2NrMSwweDg4OCAqLworCQlydGxfc2V0X2JicmVnKGh3LCBSRlBHQTBfQUREQUxMT0NLRU4sIEJJVCgxMikgfCBCSVQoMTMpLCAwKTsKKwl9CisJZm9yIChyZnBhdGggPSBSRjkwX1BBVEhfQTsgcmZwYXRoIDwgcnRscGh5LT5udW1fdG90YWxfcmZwYXRoOworCSAgICAgcmZwYXRoKyspIHsKKwkJcnRscGh5LT5yZnJlZ19jaG5sdmFsW3JmcGF0aF0gPSBydGxfZ2V0X3JmcmVnKGh3LCByZnBhdGgsCisJCQkJCQlSRl9DSE5MQlcsIEJSRlJFR09GRlNFVE1BU0spOworCQlydGxwaHktPnJlZ19yZjNjW3JmcGF0aF0gPSBydGxfZ2V0X3JmcmVnKGh3LCByZnBhdGgsIDB4M0MsCisJCQlCUkZSRUdPRkZTRVRNQVNLKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX0xPVUQsICgiUkYgMHgxOCA9IDB4JXhcbiIsCisJCQkgIHJ0bHBoeS0+cmZyZWdfY2hubHZhbFtpXSkpOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsICgiPD09XG4iKSk7CisKK30KKworYm9vbCBydGw5MmRfcGh5X2NoZWNrX3Bvd2Vyb2ZmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOworCXU4IHUxYnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJ0bGhhbC0+bWFjcGh5bW9kZSA9PSBTSU5HTEVNQUNfU0lOR0xFUEhZKSB7CisJCXUxYnRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX01BQzApOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTUFDMCwgdTFidG1wICYgKH5NQUMwX09OKSk7CisJCXJldHVybiB0cnVlOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2xvYmFsbXV0ZXhfcG93ZXIsIGZsYWdzKTsKKwlpZiAocnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9PSAwKSB7CisJCXUxYnRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX01BQzApOworCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfTUFDMCwgdTFidG1wICYgKH5NQUMwX09OKSk7CisJCXUxYnRtcCA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX01BQzEpOworCQl1MWJ0bXAgJj0gTUFDMV9PTjsKKwl9IGVsc2UgeworCQl1MWJ0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19NQUMxKTsKKwkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX01BQzEsIHUxYnRtcCAmICh+TUFDMV9PTikpOworCQl1MWJ0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19NQUMwKTsKKwkJdTFidG1wICY9IE1BQzBfT047CisJfQorCWlmICh1MWJ0bXApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2xvYmFsbXV0ZXhfcG93ZXIsIGZsYWdzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwl1MWJ0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJFR19QT1dFUl9PRkZfSU5fUFJPQ0VTUyk7CisJdTFidG1wIHw9IEJJVCg3KTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUE9XRVJfT0ZGX0lOX1BST0NFU1MsIHUxYnRtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2xvYmFsbXV0ZXhfcG93ZXIsIGZsYWdzKTsKKwlyZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3BoeS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyYzgyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3BoeS5oCkBAIC0wLDAgKzEsMTc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDkyRF9QSFlfSF9fCisjZGVmaW5lIF9fUlRMOTJEX1BIWV9IX18KKworI2RlZmluZSBNQVhfUFJFQ01EX0NOVAkJCQkxNgorI2RlZmluZSBNQVhfUkZERVBFTkRDTURfQ05UCQkJMTYKKyNkZWZpbmUgTUFYX1BPU1RDTURfQ05UCQkJCTE2CisKKyNkZWZpbmUgTUFYX0RPWkVfV0FJVElOR19USU1FU185eAkJNjQKKworI2RlZmluZSBSVF9DQU5OT1RfSU8oaHcpCQkJZmFsc2UKKyNkZWZpbmUgSElHSFBPV0VSX1JBRElPQV9BUlJBWUxFTgkJMjIKKworI2RlZmluZSBJUUtfQUREQV9SRUdfTlVNCQkJMTYKKyNkZWZpbmUgTUFYX1RPTEVSQU5DRQkJCQk1CisjZGVmaW5lCUlRS19ERUxBWV9USU1FCQkJCTEKKworI2RlZmluZQlBUEtfQkJfUkVHX05VTQkJCQk1CisjZGVmaW5lCUFQS19BRkVfUkVHX05VTQkJCQkxNgorI2RlZmluZQlBUEtfQ1VSVkVfUkVHX05VTQkJCTQKKyNkZWZpbmUJUEFUSF9OVU0JCQkJMgorCisjZGVmaW5lIExPT1BfTElNSVQJCQkJNQorI2RlZmluZSBNQVhfU1RBTExfVElNRQkJCQk1MAorI2RlZmluZSBBTlRFTk5BX0RJVkVSU0lUWV9WQUxVRQkJCTB4ODAKKyNkZWZpbmUgTUFYX1RYUFdSX0lEWF9OTU9ERV85MlMJCQk2MworI2RlZmluZSBSRVNFVF9DTlRfTElNSVQJCQkJMworCisjZGVmaW5lIElRS19BRERBX1JFR19OVU0JCQkxNgorI2RlZmluZSBJUUtfQkJfUkVHX05VTQkJCQkxMAorI2RlZmluZSBJUUtfQkJfUkVHX05VTV90ZXN0CQkJNgorI2RlZmluZSBJUUtfTUFDX1JFR19OVU0JCQkJNAorI2RlZmluZSBSWF9JTkRFWF9NQVBQSU5HX05VTQkJCTE1CisKKyNkZWZpbmUgSVFLX0RFTEFZX1RJTUUJCQkJMQorCisjZGVmaW5lIENUX09GRlNFVF9NQUNfQUREUgkJCTBYMTYKKworI2RlZmluZSBDVF9PRkZTRVRfQ0NLX1RYX1BXUl9JRFgJCTB4NUEKKyNkZWZpbmUgQ1RfT0ZGU0VUX0hUNDAxU19UWF9QV1JfSURYCQkweDYwCisjZGVmaW5lIENUX09GRlNFVF9IVDQwMlNfVFhfUFdSX0lEWF9ESUZGCTB4NjYKKyNkZWZpbmUgQ1RfT0ZGU0VUX0hUMjBfVFhfUFdSX0lEWF9ESUZGCQkweDY5CisjZGVmaW5lIENUX09GRlNFVF9PRkRNX1RYX1BXUl9JRFhfRElGRgkJMHg2QworCisjZGVmaW5lIENUX09GRlNFVF9IVDQwX01BWF9QV1JfT0ZGU0VUCQkweDZGCisjZGVmaW5lIENUX09GRlNFVF9IVDIwX01BWF9QV1JfT0ZGU0VUCQkweDcyCisKKyNkZWZpbmUgQ1RfT0ZGU0VUX0NIQU5ORUxfUExBSAkJCTB4NzUKKyNkZWZpbmUgQ1RfT0ZGU0VUX1RIRVJNQUxfTUVURVIJCQkweDc4CisjZGVmaW5lIENUX09GRlNFVF9SRl9PUFRJT04JCQkweDc5CisjZGVmaW5lIENUX09GRlNFVF9WRVJTSU9OCQkJMHg3RQorI2RlZmluZSBDVF9PRkZTRVRfQ1VTVE9NRVJfSUQJCQkweDdGCisKK2VudW0gc3djaG5sY21kX2lkIHsKKwlDTURJRF9FTkQsCisJQ01ESURfU0VUX1RYUE9XRVJPV0VSX0xFVkVMLAorCUNNRElEX0JCUkVHV1JJVEUxMCwKKwlDTURJRF9XUklURVBPUlRfVUxPTkcsCisJQ01ESURfV1JJVEVQT1JUX1VTSE9SVCwKKwlDTURJRF9XUklURVBPUlRfVUNIQVIsCisJQ01ESURfUkZfV1JJVEVSRUcsCit9OworCitzdHJ1Y3Qgc3djaG5sY21kIHsKKwllbnVtIHN3Y2hubGNtZF9pZCBjbWRpZDsKKwl1MzIgcGFyYTE7CisJdTMyIHBhcmEyOworCXUzMiBtc2RlbGF5OworfTsKKworZW51bSBiYXNlYmFuZF9jb25maWdfdHlwZSB7CisJQkFTRUJBTkRfQ09ORklHX1BIWV9SRUcgPSAwLAorCUJBU0VCQU5EX0NPTkZJR19BR0NfVEFCID0gMSwKK307CisKK2VudW0gcmZfY29udGVudCB7CisJcmFkaW9hX3R4dCA9IDAsCisJcmFkaW9iX3R4dCA9IDEsCisJcmFkaW9jX3R4dCA9IDIsCisJcmFkaW9kX3R4dCA9IDMKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw5MmRfYWNxdWlyZV9jY2thbmRyd19wYWdlYV9jdGwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmZsYWcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5pbnRlcmZhY2VpbmRleCA9PSAxKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MuY2NrX2FuZF9yd19wYWdlYV9sb2NrLCAqZmxhZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw5MmRfcmVsZWFzZV9jY2thbmRyd19wYWdlYV9jdGwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmZsYWcpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5pbnRlcmZhY2VpbmRleCA9PSAxKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5jY2tfYW5kX3J3X3BhZ2VhX2xvY2ssCisJCQkqZmxhZyk7Cit9CisKK2V4dGVybiB1MzIgcnRsOTJkX3BoeV9xdWVyeV9iYl9yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKTsKK2V4dGVybiB2b2lkIHJ0bDkyZF9waHlfc2V0X2JiX3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzaywgdTMyIGRhdGEpOworZXh0ZXJuIHUzMiBydGw5MmRfcGh5X3F1ZXJ5X3JmX3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLCB1MzIgcmVnYWRkciwKKwkJCQkgICB1MzIgYml0bWFzayk7CitleHRlcm4gdm9pZCBydGw5MmRfcGh5X3NldF9yZl9yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICBlbnVtIHJhZGlvX3BhdGggcmZwYXRoLCB1MzIgcmVnYWRkciwKKwkJCQkgIHUzMiBiaXRtYXNrLCB1MzIgZGF0YSk7CitleHRlcm4gYm9vbCBydGw5MmRfcGh5X21hY19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIGJvb2wgcnRsOTJkX3BoeV9iYl9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIGJvb2wgcnRsOTJkX3BoeV9yZl9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIGJvb2wgcnRsOTJjX3BoeV9jb25maWdfcmZfd2l0aF9mZWFkZXJmaWxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJIGVudW0gcmFkaW9fcGF0aCByZnBhdGgpOworZXh0ZXJuIHZvaWQgcnRsOTJkX3BoeV9nZXRfaHdfcmVnX29yaWdpbmFsdmFsdWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIHZvaWQgcnRsOTJkX3BoeV9zZXRfdHhwb3dlcl9sZXZlbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggY2hhbm5lbCk7CitleHRlcm4gdm9pZCBydGw5MmRfcGh5X3NjYW5fb3BlcmF0aW9uX2JhY2t1cChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgICB1OCBvcGVyYXRpb24pOworZXh0ZXJuIHZvaWQgcnRsOTJkX3BoeV9zZXRfYndfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoX3R5cGUpOworZXh0ZXJuIHU4IHJ0bDkyZF9waHlfc3dfY2hubChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Citib29sIHJ0bDkyZF9waHlfY29uZmlnX3JmX3dpdGhfaGVhZGVyZmlsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICBlbnVtIHJmX2NvbnRlbnQgY29udGVudCwKKwkJCQkJICBlbnVtIHJhZGlvX3BhdGggcmZwYXRoKTsKK2Jvb2wgcnRsOTJkX3BoeV9zZXRfaW9fY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIGlvX3R5cGUgaW90eXBlKTsKK2V4dGVybiBib29sIHJ0bDkyZF9waHlfc2V0X3JmX3Bvd2VyX3N0YXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgIGVudW0gcmZfcHdyc3RhdGUgcmZwd3Jfc3RhdGUpOworCit2b2lkIHJ0bDkyZF9waHlfY29uZmlnX21hY3BoeW1vZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw5MmRfcGh5X2NvbmZpZ19tYWNwaHltb2RlX2luZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordTggcnRsOTJkX2dldF9jaG5sZ3JvdXBfZnJvbWFycmF5KHU4IGNobmwpOwordm9pZCBydGw5MmRfcGh5X3NldF9wb3dlcm9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsOTJkX3BoeV9jb25maWdfbWFjY29leGlzdF9yZnBhZ2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworYm9vbCBydGw5MmRfcGh5X2NoZWNrX3Bvd2Vyb2ZmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgcnRsOTJkX3BoeV9sY19jYWxpYnJhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw5MmRfdXBkYXRlX2JicmZfY29uZmlndXJhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIHJ0bDkyZF9waHlfYXBfY2FsaWJyYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBjaGFyIGRlbHRhKTsKK3ZvaWQgcnRsOTJkX3BoeV9pcV9jYWxpYnJhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw5MmRfcGh5X3Jlc2V0X2lxa19yZXN1bHQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBydGw5MmRfcmVsZWFzZV9jY2thbmRyd19wYWdlYV9jdGwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmZsYWcpOwordm9pZCBydGw5MmRfYWNxdWlyZV9jY2thbmRyd19wYWdlYV9jdGwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmZsYWcpOwordTggcnRsOTJkX2dldF9yaWdodGNobmxwbGFjZV9mb3JfaXFrKHU4IGNobmwpOwordm9pZCBydGw5MmRfcGh5X3JlbG9hZF9pcWtfc2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggY2hhbm5lbCk7Cit2b2lkIHJ0bDkyZF9waHlfaXFfY2FsaWJyYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9yZWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWFjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9yZWcuaApAQCAtMCwwICsxLDEzMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMOTJEX1JFR19IX18KKyNkZWZpbmUgX19SVEw5MkRfUkVHX0hfXworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogMHgwMDAwaCB+IDB4MDBGRmggU3lzdGVtIENvbmZpZ3VyYXRpb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJFR19TWVNfSVNPX0NUUkwJCTB4MDAwMAorI2RlZmluZSBSRUdfU1lTX0ZVTkNfRU4JCQkweDAwMDIKKyNkZWZpbmUgUkVHX0FQU19GU01DTwkJCTB4MDAwNAorI2RlZmluZSBSRUdfU1lTX0NMS1IJCQkweDAwMDgKKyNkZWZpbmUgUkVHXzkzNDZDUgkJCTB4MDAwQQorI2RlZmluZSBSRUdfRUVfVlBECQkJMHgwMDBDCisjZGVmaW5lIFJFR19BRkVfTUlTQwkJCTB4MDAxMAorI2RlZmluZSBSRUdfU1BTMF9DVFJMCQkJMHgwMDExCisjZGVmaW5lIFJFR19QT1dFUl9PRkZfSU5fUFJPQ0VTUwkweDAwMTcKKyNkZWZpbmUgUkVHX1NQU19PQ1BfQ0ZHCQkJMHgwMDE4CisjZGVmaW5lIFJFR19SU1ZfQ1RSTAkJCTB4MDAxQworI2RlZmluZSBSRUdfUkZfQ1RSTAkJCTB4MDAxRgorI2RlZmluZSBSRUdfTERPQTE1X0NUUkwJCQkweDAwMjAKKyNkZWZpbmUgUkVHX0xET1YxMkRfQ1RSTAkJMHgwMDIxCisjZGVmaW5lIFJFR19MRE9IQ0kxMl9DVFJMCQkweDAwMjIKKyNkZWZpbmUgUkVHX0xQTERPX0NUUkwJCQkweDAwMjMKKyNkZWZpbmUgUkVHX0FGRV9YVEFMX0NUUkwJCTB4MDAyNAorI2RlZmluZSBSRUdfQUZFX1BMTF9DVFJMCQkweDAwMjgKKy8qIGZvciA5MmQsIERNRFAsU01TUCxETVNQIGNvbnRybCAqLworI2RlZmluZSBSRUdfTUFDX1BIWV9DVFJMCQkweDAwMmMKKyNkZWZpbmUgUkVHX0VGVVNFX0NUUkwJCQkweDAwMzAKKyNkZWZpbmUgUkVHX0VGVVNFX1RFU1QJCQkweDAwMzQKKyNkZWZpbmUgUkVHX1BXUl9EQVRBCQkJMHgwMDM4CisjZGVmaW5lIFJFR19DQUxfVElNRVIJCQkweDAwM0MKKyNkZWZpbmUgUkVHX0FDTEtfTU9OCQkJMHgwMDNFCisjZGVmaW5lIFJFR19HUElPX01VWENGRwkJCTB4MDA0MAorI2RlZmluZSBSRUdfR1BJT19JT19TRUwJCQkweDAwNDIKKyNkZWZpbmUgUkVHX01BQ19QSU5NVVhfQ0ZHCQkweDAwNDMKKyNkZWZpbmUgUkVHX0dQSU9fUElOX0NUUkwJCTB4MDA0NAorI2RlZmluZSBSRUdfR1BJT19JTlRNCQkJMHgwMDQ4CisjZGVmaW5lIFJFR19MRURDRkcwCQkJMHgwMDRDCisjZGVmaW5lIFJFR19MRURDRkcxCQkJMHgwMDRECisjZGVmaW5lIFJFR19MRURDRkcyCQkJMHgwMDRFCisjZGVmaW5lIFJFR19MRURDRkczCQkJMHgwMDRGCisjZGVmaW5lIFJFR19GU0lNUgkJCTB4MDA1MAorI2RlZmluZSBSRUdfRlNJU1IJCQkweDAwNTQKKworI2RlZmluZSBSRUdfTUNVRldETAkJCTB4MDA4MAorCisjZGVmaW5lIFJFR19ITUVCT1hfRVhUXzAJCTB4MDA4OAorI2RlZmluZSBSRUdfSE1FQk9YX0VYVF8xCQkweDAwOEEKKyNkZWZpbmUgUkVHX0hNRUJPWF9FWFRfMgkJMHgwMDhDCisjZGVmaW5lIFJFR19ITUVCT1hfRVhUXzMJCTB4MDA4RQorCisjZGVmaW5lIFJFR19CSVNUX1NDQU4JCQkweDAwRDAKKyNkZWZpbmUgUkVHX0JJU1RfUlBUCQkJMHgwMEQ0CisjZGVmaW5lIFJFR19CSVNUX1JPTV9SUFQJCTB4MDBEOAorI2RlZmluZSBSRUdfVVNCX1NJRV9JTlRGCQkweDAwRTAKKyNkZWZpbmUgUkVHX1BDSUVfTUlPX0lOVEYJCTB4MDBFNAorI2RlZmluZSBSRUdfUENJRV9NSU9fSU5URAkJMHgwMEU4CisjZGVmaW5lIFJFR19IUE9OX0ZTTQkJCTB4MDBFQworI2RlZmluZSBSRUdfU1lTX0NGRwkJCTB4MDBGMAorI2RlZmluZSBSRUdfTUFDX1BIWV9DVFJMX05PUk1BTAkJMHgwMGY4CisKKyNkZWZpbmUgIFJFR19NQUMwCQkJMHgwMDgxCisjZGVmaW5lICBSRUdfTUFDMQkJCTB4MDA1MworI2RlZmluZSAgRldfTUFDMF9SRUFEWQkJCTB4MTgKKyNkZWZpbmUgIEZXX01BQzFfUkVBRFkJCQkweDFBCisjZGVmaW5lICBNQUMwX09OCQkJQklUKDcpCisjZGVmaW5lICBNQUMxX09OCQkJQklUKDApCisjZGVmaW5lICBNQUMwX1JFQURZCQkJQklUKDApCisjZGVmaW5lICBNQUMxX1JFQURZCQkJQklUKDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAweDAxMDBoIH4gMHgwMUZGaAlNQUNUT1AgR2VuZXJhbCBDb25maWd1cmF0aW9uICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSRUdfQ1IJCQkJMHgwMTAwCisjZGVmaW5lIFJFR19QQlAJCQkJMHgwMTA0CisjZGVmaW5lIFJFR19UUlhETUFfQ1RSTAkJCTB4MDEwQworI2RlZmluZSBSRUdfVFJYRkZfQk5EWQkJCTB4MDExNAorI2RlZmluZSBSRUdfVFJYRkZfU1RBVFVTCQkweDAxMTgKKyNkZWZpbmUgUkVHX1JYRkZfUFRSCQkJMHgwMTFDCisjZGVmaW5lIFJFR19ISU1SCQkJMHgwMTIwCisjZGVmaW5lIFJFR19ISVNSCQkJMHgwMTI0CisjZGVmaW5lIFJFR19ISU1SRQkJCTB4MDEyOAorI2RlZmluZSBSRUdfSElTUkUJCQkweDAxMkMKKyNkZWZpbmUgUkVHX0NQV00JCQkweDAxMkYKKyNkZWZpbmUgUkVHX0ZXSU1SCQkJMHgwMTMwCisjZGVmaW5lIFJFR19GV0lTUgkJCTB4MDEzNAorI2RlZmluZSBSRUdfUEtUQlVGX0RCR19DVFJMCQkweDAxNDAKKyNkZWZpbmUgUkVHX1BLVEJVRl9EQkdfREFUQV9MCQkweDAxNDQKKyNkZWZpbmUgUkVHX1BLVEJVRl9EQkdfREFUQV9ICQkweDAxNDgKKworI2RlZmluZSBSRUdfVEMwX0NUUkwJCQkweDAxNTAKKyNkZWZpbmUgUkVHX1RDMV9DVFJMCQkJMHgwMTU0CisjZGVmaW5lIFJFR19UQzJfQ1RSTAkJCTB4MDE1OAorI2RlZmluZSBSRUdfVEMzX0NUUkwJCQkweDAxNUMKKyNkZWZpbmUgUkVHX1RDNF9DVFJMCQkJMHgwMTYwCisjZGVmaW5lIFJFR19UQ1VOSVRfQkFTRQkJCTB4MDE2NAorI2RlZmluZSBSRUdfTUJJU1RfU1RBUlQJCQkweDAxNzQKKyNkZWZpbmUgUkVHX01CSVNUX0RPTkUJCQkweDAxNzgKKyNkZWZpbmUgUkVHX01CSVNUX0ZBSUwJCQkweDAxN0MKKyNkZWZpbmUgUkVHX0MySEVWVF9NU0dfTk9STUFMCQkweDAxQTAKKyNkZWZpbmUgUkVHX0MySEVWVF9NU0dfVEVTVAkJMHgwMUI4CisjZGVmaW5lIFJFR19DMkhFVlRfQ0xFQVIJCTB4MDFCRgorI2RlZmluZSBSRUdfTUNVVFNUXzEJCQkweDAxYzAKKyNkZWZpbmUgUkVHX0ZNRVRIUgkJCTB4MDFDOAorI2RlZmluZSBSRUdfSE1FVEZSCQkJMHgwMUNDCisjZGVmaW5lIFJFR19ITUVCT1hfMAkJCTB4MDFEMAorI2RlZmluZSBSRUdfSE1FQk9YXzEJCQkweDAxRDQKKyNkZWZpbmUgUkVHX0hNRUJPWF8yCQkJMHgwMUQ4CisjZGVmaW5lIFJFR19ITUVCT1hfMwkJCTB4MDFEQworCisjZGVmaW5lIFJFR19MTFRfSU5JVAkJCTB4MDFFMAorI2RlZmluZSBSRUdfQkJfQUNDRUVTU19DVFJMCQkweDAxRTgKKyNkZWZpbmUgUkVHX0JCX0FDQ0VTU19EQVRBCQkweDAxRUMKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoJMHgwMjAwaCB+IDB4MDI3RmgJVFhETUEgQ29uZmlndXJhdGlvbiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUkVHX1JRUE4JCQkweDAyMDAKKyNkZWZpbmUgUkVHX0ZJRk9QQUdFCQkJMHgwMjA0CisjZGVmaW5lIFJFR19UREVDVFJMCQkJMHgwMjA4CisjZGVmaW5lIFJFR19UWERNQV9PRkZTRVRfQ0hLCQkweDAyMEMKKyNkZWZpbmUgUkVHX1RYRE1BX1NUQVRVUwkJMHgwMjEwCisjZGVmaW5lIFJFR19SUVBOX05QUQkJCTB4MDIxNAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoJMHgwMjgwaCB+IDB4MDJGRmgJUlhETUEgQ29uZmlndXJhdGlvbiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUkVHX1JYRE1BX0FHR19QR19USAkJMHgwMjgwCisjZGVmaW5lIFJFR19SWFBLVF9OVU0JCQkweDAyODQKKyNkZWZpbmUgUkVHX1JYRE1BX1NUQVRVUwkJMHgwMjg4CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgkweDAzMDBoIH4gMHgwM0ZGaAlQQ0llICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUJUkVHX1BDSUVfQ1RSTF9SRUcJCTB4MDMwMAorI2RlZmluZQlSRUdfSU5UX01JRwkJCTB4MDMwNAorI2RlZmluZQlSRUdfQkNOUV9ERVNBCQkJMHgwMzA4CisjZGVmaW5lCVJFR19IUV9ERVNBCQkJMHgwMzEwCisjZGVmaW5lCVJFR19NR1FfREVTQQkJCTB4MDMxOAorI2RlZmluZQlSRUdfVk9RX0RFU0EJCQkweDAzMjAKKyNkZWZpbmUJUkVHX1ZJUV9ERVNBCQkJMHgwMzI4CisjZGVmaW5lCVJFR19CRVFfREVTQQkJCTB4MDMzMAorI2RlZmluZQlSRUdfQktRX0RFU0EJCQkweDAzMzgKKyNkZWZpbmUJUkVHX1JYX0RFU0EJCQkweDAzNDAKKyNkZWZpbmUJUkVHX0RCSQkJCQkweDAzNDgKKyNkZWZpbmUJUkVHX0RCSV9XREFUQQkJCTB4MDM0OAorI2RlZmluZSBSRUdfREJJX1JEQVRBCQkJMHgwMzRDCisjZGVmaW5lIFJFR19EQklfQ1RSTAkJCTB4MDM1MAorI2RlZmluZSBSRUdfREJJX0ZMQUcJCQkweDAzNTIKKyNkZWZpbmUJUkVHX01ESU8JCQkweDAzNTQKKyNkZWZpbmUJUkVHX0RCR19TRUwJCQkweDAzNjAKKyNkZWZpbmUJUkVHX1BDSUVfSFJQV00JCQkweDAzNjEKKyNkZWZpbmUJUkVHX1BDSUVfSENQV00JCQkweDAzNjMKKyNkZWZpbmUJUkVHX1VBUlRfQ1RSTAkJCTB4MDM2NAorI2RlZmluZQlSRUdfVUFSVF9UWF9ERVNBCQkweDAzNzAKKyNkZWZpbmUJUkVHX1VBUlRfUlhfREVTQQkJMHgwMzc4CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgkweDA0MDBoIH4gMHgwNDdGaAlQcm90b2NvbCBDb25maWd1cmF0aW9uICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUkVHX1ZPUV9JTkZPUk1BVElPTgkJMHgwNDAwCisjZGVmaW5lIFJFR19WSVFfSU5GT1JNQVRJT04JCTB4MDQwNAorI2RlZmluZSBSRUdfQkVRX0lORk9STUFUSU9OCQkweDA0MDgKKyNkZWZpbmUgUkVHX0JLUV9JTkZPUk1BVElPTgkJMHgwNDBDCisjZGVmaW5lIFJFR19NR1FfSU5GT1JNQVRJT04JCTB4MDQxMAorI2RlZmluZSBSRUdfSEdRX0lORk9STUFUSU9OCQkweDA0MTQKKyNkZWZpbmUgUkVHX0JDTlFfSU5GT1JNQVRJT04JCTB4MDQxOAorCisKKyNkZWZpbmUgUkVHX0NQVV9NR1FfSU5GT1JNQVRJT04JCTB4MDQxQworI2RlZmluZSBSRUdfRldIV19UWFFfQ1RSTAkJMHgwNDIwCisjZGVmaW5lIFJFR19IV1NFUV9DVFJMCQkJMHgwNDIzCisjZGVmaW5lIFJFR19UWFBLVEJVRl9CQ05RX0JETlkJCTB4MDQyNAorI2RlZmluZSBSRUdfVFhQS1RCVUZfTUdRX0JETlkJCTB4MDQyNQorI2RlZmluZSBSRUdfTVVMVElfQkNOUV9FTgkJMHgwNDI2CisjZGVmaW5lIFJFR19NVUxUSV9CQ05RX09GRlNFVAkJMHgwNDI3CisjZGVmaW5lIFJFR19TUEVDX1NJRlMJCQkweDA0MjgKKyNkZWZpbmUgUkVHX1JMCQkJCTB4MDQyQQorI2RlZmluZSBSRUdfREFSRlJDCQkJMHgwNDMwCisjZGVmaW5lIFJFR19SQVJGUkMJCQkweDA0MzgKKyNkZWZpbmUgUkVHX1JSU1IJCQkweDA0NDAKKyNkZWZpbmUgUkVHX0FSRlIwCQkJMHgwNDQ0CisjZGVmaW5lIFJFR19BUkZSMQkJCTB4MDQ0OAorI2RlZmluZSBSRUdfQVJGUjIJCQkweDA0NEMKKyNkZWZpbmUgUkVHX0FSRlIzCQkJMHgwNDUwCisjZGVmaW5lIFJFR19BR0dMRU5fTE1UCQkJMHgwNDU4CisjZGVmaW5lIFJFR19BTVBEVV9NSU5fU1BBQ0UJCTB4MDQ1QworI2RlZmluZSBSRUdfVFhQS1RCVUZfV01BQ19MQktfQkZfSEQJMHgwNDVECisjZGVmaW5lIFJFR19GQVNUX0VEQ0FfQ1RSTAkJMHgwNDYwCisjZGVmaW5lIFJFR19SRF9SRVNQX1BLVF9USAkJMHgwNDYzCisjZGVmaW5lIFJFR19JTklSVFNfUkFURV9TRUwJCTB4MDQ4MAorI2RlZmluZSBSRUdfSU5JREFUQV9SQVRFX1NFTAkJMHgwNDg0CisjZGVmaW5lIFJFR19QT1dFUl9TVEFUVVMJCTB4MDRBNAorI2RlZmluZSBSRUdfUE9XRVJfU1RBR0UxCQkweDA0QjQKKyNkZWZpbmUgUkVHX1BPV0VSX1NUQUdFMgkJMHgwNEI4CisjZGVmaW5lIFJFR19QS1RfTElGRV9USU1FCQkweDA0QzAKKyNkZWZpbmUgUkVHX1NUQkNfU0VUVElORwkJMHgwNEM0CisjZGVmaW5lIFJFR19QUk9UX01PREVfQ1RSTAkJMHgwNEM4CisjZGVmaW5lIFJFR19NQVhfQUdHUl9OVU0JCTB4MDRDQQorI2RlZmluZSBSRUdfUlRTX01BWF9BR0dSX05VTQkJMHgwNENCCisjZGVmaW5lIFJFR19CQVJfTU9ERV9DVFJMCQkweDA0Q0MKKyNkZWZpbmUgUkVHX1JBX1RSWV9SQVRFX0FHR19MTVQJCTB4MDRDRgorI2RlZmluZSBSRUdfRUFSTFlfTU9ERV9DT05UUk9MCQkweDREMAorI2RlZmluZSBSRUdfTlFPU19TRVEJCQkweDA0REMKKyNkZWZpbmUgUkVHX1FPU19TRVEJCQkweDA0REUKKyNkZWZpbmUgUkVHX05FRURfQ1BVX0hBTkRMRQkJMHgwNEUwCisjZGVmaW5lIFJFR19QS1RfTE9TRV9SUFQJCTB4MDRFMQorI2RlZmluZSBSRUdfUFRDTF9FUlJfU1RBVFVTCQkweDA0RTIKKyNkZWZpbmUgUkVHX0RVTU1ZCQkJMHgwNEZDCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgkweDA1MDBoIH4gMHgwNUZGaAlFRENBIENvbmZpZ3VyYXRpb24gICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUkVHX0VEQ0FfVk9fUEFSQU0JCTB4MDUwMAorI2RlZmluZSBSRUdfRURDQV9WSV9QQVJBTQkJMHgwNTA0CisjZGVmaW5lIFJFR19FRENBX0JFX1BBUkFNCQkweDA1MDgKKyNkZWZpbmUgUkVHX0VEQ0FfQktfUEFSQU0JCTB4MDUwQworI2RlZmluZSBSRUdfQkNOVENGRwkJCTB4MDUxMAorI2RlZmluZSBSRUdfUElGUwkJCTB4MDUxMgorI2RlZmluZSBSRUdfUkRHX1BJRlMJCQkweDA1MTMKKyNkZWZpbmUgUkVHX1NJRlNfQ1RYCQkJMHgwNTE0CisjZGVmaW5lIFJFR19TSUZTX1RSWAkJCTB4MDUxNgorI2RlZmluZSBSRUdfQUdHUl9CUkVBS19USU1FCQkweDA1MUEKKyNkZWZpbmUgUkVHX1NMT1QJCQkweDA1MUIKKyNkZWZpbmUgUkVHX1RYX1BUQ0xfQ1RSTAkJMHgwNTIwCisjZGVmaW5lIFJFR19UWFBBVVNFCQkJMHgwNTIyCisjZGVmaW5lIFJFR19ESVNfVFhSRVFfQ0xSCQkweDA1MjMKKyNkZWZpbmUgUkVHX1JEX0NUUkwJCQkweDA1MjQKKyNkZWZpbmUgUkVHX1RCVFRfUFJPSElCSVQJCTB4MDU0MAorI2RlZmluZSBSRUdfUkRfTkFWX05YVAkJCTB4MDU0NAorI2RlZmluZSBSRUdfTkFWX1BST1RfTEVOCQkweDA1NDYKKyNkZWZpbmUgUkVHX0JDTl9DVFJMCQkJMHgwNTUwCisjZGVmaW5lIFJFR19VU1RJTUVfVFNGCQkJMHgwNTUxCisjZGVmaW5lIFJFR19NQklEX05VTQkJCTB4MDU1MgorI2RlZmluZSBSRUdfRFVBTF9UU0ZfUlNUCQkweDA1NTMKKyNkZWZpbmUgUkVHX0JDTl9JTlRFUlZBTAkJMHgwNTU0CisjZGVmaW5lIFJFR19NQlNTSURfQkNOX1NQQUNFCQkweDA1NTQKKyNkZWZpbmUgUkVHX0RSVkVSTFlJTlQJCQkweDA1NTgKKyNkZWZpbmUgUkVHX0JDTkRNQVRJTQkJCTB4MDU1OQorI2RlZmluZSBSRUdfQVRJTVdORAkJCTB4MDU1QQorI2RlZmluZSBSRUdfQkNOX01BWF9FUlIJCQkweDA1NUQKKyNkZWZpbmUgUkVHX1JYVFNGX09GRlNFVF9DQ0sJCTB4MDU1RQorI2RlZmluZSBSRUdfUlhUU0ZfT0ZGU0VUX09GRE0JCTB4MDU1RgorI2RlZmluZSBSRUdfVFNGVFIJCQkweDA1NjAKKyNkZWZpbmUgUkVHX0lOSVRfVFNGVFIJCQkweDA1NjQKKyNkZWZpbmUgUkVHX1BTVElNRVIJCQkweDA1ODAKKyNkZWZpbmUgUkVHX1RJTUVSMAkJCTB4MDU4NAorI2RlZmluZSBSRUdfVElNRVIxCQkJMHgwNTg4CisjZGVmaW5lIFJFR19BQ01IV0NUUkwJCQkweDA1QzAKKyNkZWZpbmUgUkVHX0FDTVJTVENUUkwJCQkweDA1QzEKKyNkZWZpbmUgUkVHX0FDTUFWRwkJCTB4MDVDMgorI2RlZmluZSBSRUdfVk9fQURNVElNRQkJCTB4MDVDNAorI2RlZmluZSBSRUdfVklfQURNVElNRQkJCTB4MDVDNgorI2RlZmluZSBSRUdfQkVfQURNVElNRQkJCTB4MDVDOAorI2RlZmluZSBSRUdfRURDQV9SQU5ET01fR0VOCQkweDA1Q0MKKyNkZWZpbmUgUkVHX1NDSF9UWENNRAkJCTB4MDVEMAorCisvKiBEdWFsIE1BQyBDby1FeGlzdGVuY2UgUmVnaXN0ZXIgICovCisjZGVmaW5lIFJFR19ETUMJCQkJMHgwNUYwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgkweDA2MDBoIH4gMHgwN0ZGaAlXTUFDIENvbmZpZ3VyYXRpb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJFR19BUFNEX0NUUkwJCQkweDA2MDAKKyNkZWZpbmUgUkVHX0JXT1BNT0RFCQkJMHgwNjAzCisjZGVmaW5lIFJFR19UQ1IJCQkJMHgwNjA0CisjZGVmaW5lIFJFR19SQ1IJCQkJMHgwNjA4CisjZGVmaW5lIFJFR19SWF9QS1RfTElNSVQJCTB4MDYwQworI2RlZmluZSBSRUdfUlhfRExLX1RJTUUJCQkweDA2MEQKKyNkZWZpbmUgUkVHX1JYX0RSVklORk9fU1oJCTB4MDYwRgorCisjZGVmaW5lIFJFR19NQUNJRAkJCTB4MDYxMAorI2RlZmluZSBSRUdfQlNTSUQJCQkweDA2MTgKKyNkZWZpbmUgUkVHX01BUgkJCQkweDA2MjAKKyNkZWZpbmUgUkVHX01CSURDQU1DRkcJCQkweDA2MjgKKworI2RlZmluZSBSRUdfVVNUSU1FX0VEQ0EJCQkweDA2MzgKKyNkZWZpbmUgUkVHX01BQ19TUEVDX1NJRlMJCTB4MDYzQQorI2RlZmluZSBSRUdfUkVTUF9TSUZTX0NDSwkJMHgwNjNDCisjZGVmaW5lIFJFR19SRVNQX1NJRlNfT0ZETQkJMHgwNjNFCisjZGVmaW5lIFJFR19BQ0tUTwkJCTB4MDY0MAorI2RlZmluZSBSRUdfQ1RTMlRPCQkJMHgwNjQxCisjZGVmaW5lIFJFR19FSUZTCQkJMHgwNjQyCisKKworLyogV01BLCBCQSwgQ0NYICovCisjZGVmaW5lIFJFR19OQVZfQ1RSTAkJCTB4MDY1MAorI2RlZmluZSBSRUdfQkFDQU1DTUQJCQkweDA2NTQKKyNkZWZpbmUgUkVHX0JBQ0FNQ09OVEVOVAkJMHgwNjU4CisjZGVmaW5lIFJFR19MQkRMWQkJCTB4MDY2MAorI2RlZmluZSBSRUdfRldETFkJCQkweDA2NjEKKyNkZWZpbmUgUkVHX1JYRVJSX1JQVAkJCTB4MDY2NAorI2RlZmluZSBSRUdfV01BQ19UUlhQVENMX0NUTAkJMHgwNjY4CisKKworLyogU2VjdXJpdHkgICovCisjZGVmaW5lIFJFR19DQU1DTUQJCQkweDA2NzAKKyNkZWZpbmUgUkVHX0NBTVdSSVRFCQkJMHgwNjc0CisjZGVmaW5lIFJFR19DQU1SRUFECQkJMHgwNjc4CisjZGVmaW5lIFJFR19DQU1EQkcJCQkweDA2N0MKKyNkZWZpbmUgUkVHX1NFQ0NGRwkJCTB4MDY4MAorCisvKiBQb3dlciAgKi8KKyNkZWZpbmUgUkVHX1dPV19DVFJMCQkJMHgwNjkwCisjZGVmaW5lIFJFR19QU1NUQVRVUwkJCTB4MDY5MQorI2RlZmluZSBSRUdfUFNfUlhfSU5GTwkJCTB4MDY5MgorI2RlZmluZSBSRUdfTFBOQVZfQ1RSTAkJCTB4MDY5NAorI2RlZmluZSBSRUdfV0tGTUNBTV9DTUQJCQkweDA2OTgKKyNkZWZpbmUgUkVHX1dLRk1DQU1fUldECQkJMHgwNjlDCisjZGVmaW5lIFJFR19SWEZMVE1BUDAJCQkweDA2QTAKKyNkZWZpbmUgUkVHX1JYRkxUTUFQMQkJCTB4MDZBMgorI2RlZmluZSBSRUdfUlhGTFRNQVAyCQkJMHgwNkE0CisjZGVmaW5lIFJFR19CQ05fUFNSX1JQVAkJCTB4MDZBOAorI2RlZmluZSBSRUdfQ0FMQjMyS19DVFJMCQkweDA2QUMKKyNkZWZpbmUgUkVHX1BLVF9NT05fQ1RSTAkJMHgwNkI0CisjZGVmaW5lIFJFR19CVF9DT0VYX1RBQkxFCQkweDA2QzAKKyNkZWZpbmUgUkVHX1dNQUNfUkVTUF9UWElORk8JCTB4MDZEOAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKglSZWRpZmluZSA4MTkyQyByZWdpc3RlciBkZWZpbml0aW9uIGZvciBjb21wYXRpYmlsaXR5ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZQlDUjkzNDYJCQkJUkVHXzkzNDZDUgorI2RlZmluZQlNU1IJCQkJKFJFR19DUiArIDIpCisjZGVmaW5lCUlTUgkJCQlSRUdfSElTUgorI2RlZmluZQlUU0ZSCQkJCVJFR19UU0ZUUgorCisjZGVmaW5lCU1BQ0lEUjAJCQkJUkVHX01BQ0lECisjZGVmaW5lCU1BQ0lEUjQJCQkJKFJFR19NQUNJRCArIDQpCisKKyNkZWZpbmUgUEJQCQkJCVJFR19QQlAKKworI2RlZmluZQlJRFIwCQkJCU1BQ0lEUjAKKyNkZWZpbmUJSURSNAkJCQlNQUNJRFI0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiA4MTkyQyAoTVNSKSBNZWRpYSBTdGF0dXMgUmVnaXN0ZXIoT2Zmc2V0IDB4NEMsIDggYml0cykqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUJTVNSX05PTElOSwkJCTB4MDAKKyNkZWZpbmUJTVNSX0FESE9DCQkJMHgwMQorI2RlZmluZQlNU1JfSU5GUkEJCQkweDAyCisjZGVmaW5lCU1TUl9BUAkJCQkweDAzCisKKy8qIDYuIEFkYXB0aXZlIENvbnRyb2wgUmVnaXN0ZXJzICAoT2Zmc2V0OiAweDAxNjAgLSAweDAxQ0YpICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogODE5MkMgUmVzcG9uc2UgUmF0ZSBTZXQgUmVnaXN0ZXIob2Zmc2V0IDB4MTgxLCAyNGJpdHMpKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lCVJSU1JfUlNDX09GRlNFVAkJCTIxCisjZGVmaW5lCVJSU1JfU0hPUlRfT0ZGU0VUCQkyMworI2RlZmluZQlSUlNSX1JTQ19CV180ME0JCQkweDYwMDAwMAorI2RlZmluZQlSUlNSX1JTQ19VUFNVQkNITkwJCTB4NDAwMDAwCisjZGVmaW5lCVJSU1JfUlNDX0xPV1NVQkNITkwJCTB4MjAwMDAwCisjZGVmaW5lCVJSU1JfU0hPUlQJCQkweDgwMDAwMAorI2RlZmluZQlSUlNSXzFNCQkJCUJJVDAKKyNkZWZpbmUJUlJTUl8yTQkJCQlCSVQxCisjZGVmaW5lCVJSU1JfNV81TQkJCUJJVDIKKyNkZWZpbmUJUlJTUl8xMU0JCQlCSVQzCisjZGVmaW5lCVJSU1JfNk0JCQkJQklUNAorI2RlZmluZQlSUlNSXzlNCQkJCUJJVDUKKyNkZWZpbmUJUlJTUl8xMk0JCQlCSVQ2CisjZGVmaW5lCVJSU1JfMThNCQkJQklUNworI2RlZmluZQlSUlNSXzI0TQkJCUJJVDgKKyNkZWZpbmUJUlJTUl8zNk0JCQlCSVQ5CisjZGVmaW5lCVJSU1JfNDhNCQkJQklUMTAKKyNkZWZpbmUJUlJTUl81NE0JCQlCSVQxMQorI2RlZmluZQlSUlNSX01DUzAJCQlCSVQxMgorI2RlZmluZQlSUlNSX01DUzEJCQlCSVQxMworI2RlZmluZQlSUlNSX01DUzIJCQlCSVQxNAorI2RlZmluZQlSUlNSX01DUzMJCQlCSVQxNQorI2RlZmluZQlSUlNSX01DUzQJCQlCSVQxNgorI2RlZmluZQlSUlNSX01DUzUJCQlCSVQxNworI2RlZmluZQlSUlNSX01DUzYJCQlCSVQxOAorI2RlZmluZQlSUlNSX01DUzcJCQlCSVQxOQorI2RlZmluZQlCUlNSX0FDS1NIT1JUUE1CCQlCSVQyMworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICAgODE5MkMgUmF0ZSBEZWZpbml0aW9uICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIENDSyAqLworI2RlZmluZQlSQVRSXzFNCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUJUkFUUl8yTQkJCQkweDAwMDAwMDAyCisjZGVmaW5lCVJBVFJfNTVNCQkJMHgwMDAwMDAwNAorI2RlZmluZQlSQVRSXzExTQkJCTB4MDAwMDAwMDgKKy8qIE9GRE0gKi8KKyNkZWZpbmUJUkFUUl82TQkJCQkweDAwMDAwMDEwCisjZGVmaW5lCVJBVFJfOU0JCQkJMHgwMDAwMDAyMAorI2RlZmluZQlSQVRSXzEyTQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUJUkFUUl8xOE0JCQkweDAwMDAwMDgwCisjZGVmaW5lCVJBVFJfMjRNCQkJMHgwMDAwMDEwMAorI2RlZmluZQlSQVRSXzM2TQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUJUkFUUl80OE0JCQkweDAwMDAwNDAwCisjZGVmaW5lCVJBVFJfNTRNCQkJMHgwMDAwMDgwMAorLyogTUNTIDEgU3BhdGlhbCBTdHJlYW0JKi8KKyNkZWZpbmUJUkFUUl9NQ1MwCQkJMHgwMDAwMTAwMAorI2RlZmluZQlSQVRSX01DUzEJCQkweDAwMDAyMDAwCisjZGVmaW5lCVJBVFJfTUNTMgkJCTB4MDAwMDQwMDAKKyNkZWZpbmUJUkFUUl9NQ1MzCQkJMHgwMDAwODAwMAorI2RlZmluZQlSQVRSX01DUzQJCQkweDAwMDEwMDAwCisjZGVmaW5lCVJBVFJfTUNTNQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUJUkFUUl9NQ1M2CQkJMHgwMDA0MDAwMAorI2RlZmluZQlSQVRSX01DUzcJCQkweDAwMDgwMDAwCisvKiBNQ1MgMiBTcGF0aWFsIFN0cmVhbSAqLworI2RlZmluZQlSQVRSX01DUzgJCQkweDAwMTAwMDAwCisjZGVmaW5lCVJBVFJfTUNTOQkJCTB4MDAyMDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxMAkJCTB4MDA0MDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxMQkJCTB4MDA4MDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxMgkJCTB4MDEwMDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxMwkJCTB4MDIwMDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxNAkJCTB4MDQwMDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxNQkJCTB4MDgwMDAwMDAKKworLyogQ0NLICovCisjZGVmaW5lIFJBVEVfMU0JCQkJQklUKDApCisjZGVmaW5lIFJBVEVfMk0JCQkJQklUKDEpCisjZGVmaW5lIFJBVEVfNV81TQkJCUJJVCgyKQorI2RlZmluZSBSQVRFXzExTQkJCUJJVCgzKQorLyogT0ZETSAgKi8KKyNkZWZpbmUgUkFURV82TQkJCQlCSVQoNCkKKyNkZWZpbmUgUkFURV85TQkJCQlCSVQoNSkKKyNkZWZpbmUgUkFURV8xMk0JCQlCSVQoNikKKyNkZWZpbmUgUkFURV8xOE0JCQlCSVQoNykKKyNkZWZpbmUgUkFURV8yNE0JCQlCSVQoOCkKKyNkZWZpbmUgUkFURV8zNk0JCQlCSVQoOSkKKyNkZWZpbmUgUkFURV80OE0JCQlCSVQoMTApCisjZGVmaW5lIFJBVEVfNTRNCQkJQklUKDExKQorLyogTUNTIDEgU3BhdGlhbCBTdHJlYW0gKi8KKyNkZWZpbmUgUkFURV9NQ1MwCQkJQklUKDEyKQorI2RlZmluZSBSQVRFX01DUzEJCQlCSVQoMTMpCisjZGVmaW5lIFJBVEVfTUNTMgkJCUJJVCgxNCkKKyNkZWZpbmUgUkFURV9NQ1MzCQkJQklUKDE1KQorI2RlZmluZSBSQVRFX01DUzQJCQlCSVQoMTYpCisjZGVmaW5lIFJBVEVfTUNTNQkJCUJJVCgxNykKKyNkZWZpbmUgUkFURV9NQ1M2CQkJQklUKDE4KQorI2RlZmluZSBSQVRFX01DUzcJCQlCSVQoMTkpCisvKiBNQ1MgMiBTcGF0aWFsIFN0cmVhbSAqLworI2RlZmluZSBSQVRFX01DUzgJCQlCSVQoMjApCisjZGVmaW5lIFJBVEVfTUNTOQkJCUJJVCgyMSkKKyNkZWZpbmUgUkFURV9NQ1MxMAkJCUJJVCgyMikKKyNkZWZpbmUgUkFURV9NQ1MxMQkJCUJJVCgyMykKKyNkZWZpbmUgUkFURV9NQ1MxMgkJCUJJVCgyNCkKKyNkZWZpbmUgUkFURV9NQ1MxMwkJCUJJVCgyNSkKKyNkZWZpbmUgUkFURV9NQ1MxNAkJCUJJVCgyNikKKyNkZWZpbmUgUkFURV9NQ1MxNQkJCUJJVCgyNykKKworLyogQUxMIENDSyBSYXRlICovCisjZGVmaW5lCVJBVEVfQUxMX0NDSwkJCShSQVRSXzFNIHwgUkFUUl8yTSB8IFJBVFJfNTVNIHwgXAorCQkJCQlSQVRSXzExTSkKKyNkZWZpbmUJUkFURV9BTExfT0ZETV9BRwkJKFJBVFJfNk0gfCBSQVRSXzlNIHwgUkFUUl8xMk0gfCBcCisJCQkJCVJBVFJfMThNIHwgUkFUUl8yNE0gfCBcCisJCQkJCVJBVFJfMzZNIHwgUkFUUl80OE0gfCBSQVRSXzU0TSkKKyNkZWZpbmUJUkFURV9BTExfT0ZETV8xU1MJCShSQVRSX01DUzAgfCBSQVRSX01DUzEgfCBSQVRSX01DUzIgfCBcCisJCQkJCVJBVFJfTUNTMyB8IFJBVFJfTUNTNCB8IFJBVFJfTUNTNSB8IFwKKwkJCQkJUkFUUl9NQ1M2IHwgUkFUUl9NQ1M3KQorI2RlZmluZQlSQVRFX0FMTF9PRkRNXzJTUwkJKFJBVFJfTUNTOCB8IFJBVFJfTUNTOSB8IFJBVFJfTUNTMTAgfCBcCisJCQkJCVJBVFJfTUNTMTEgfCBSQVRSX01DUzEyIHwgUkFUUl9NQ1MxMyB8IFwKKwkJCQkJUkFUUl9NQ1MxNCB8IFJBVFJfTUNTMTUpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICA4MTkyQyBCV19PUE1PREUgYml0cwkJKE9mZnNldCAweDIwMywgOGJpdCkgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZQlCV19PUE1PREVfMjBNSFoJCQlCSVQoMikKKyNkZWZpbmUJQldfT1BNT0RFXzVHCQkJQklUKDEpCisjZGVmaW5lCUJXX09QTU9ERV8xMUoJCQlCSVQoMCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgIDgxOTJDIENBTSBDb25maWcgU2V0dGluZyAob2Zmc2V0IDB4MjUwLCAxIGJ5dGUpICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lCUNBTV9WQUxJRAkJCUJJVCgxNSkKKyNkZWZpbmUJQ0FNX05PVFZBTElECQkJMHgwMDAwCisjZGVmaW5lCUNBTV9VU0VESwkJCUJJVCg1KQorCisjZGVmaW5lCUNBTV9OT05FCQkJMHgwCisjZGVmaW5lCUNBTV9XRVA0MAkJCTB4MDEKKyNkZWZpbmUJQ0FNX1RLSVAJCQkweDAyCisjZGVmaW5lCUNBTV9BRVMJCQkJMHgwNAorI2RlZmluZQlDQU1fV0VQMTA0CQkJMHgwNQorI2RlZmluZQlDQU1fU01TNAkJCTB4NgorCisKKyNkZWZpbmUJVE9UQUxfQ0FNX0VOVFJZCQkJMzIKKyNkZWZpbmUJSEFMRl9DQU1fRU5UUlkJCQkxNgorCisjZGVmaW5lCUNBTV9XUklURQkJCUJJVCgxNikKKyNkZWZpbmUJQ0FNX1JFQUQJCQkweDAwMDAwMDAwCisjZGVmaW5lCUNBTV9QT0xMSU5JRwkJCUJJVCgzMSkKKworLyogMTAuIFBvd2VyIFNhdmUgQ29udHJvbCBSZWdpc3RlcnMJIChPZmZzZXQ6IDB4MDI2MCAtIDB4MDJERikgKi8KKyNkZWZpbmUJV09XX1BNRU4JCQlCSVQwIC8qIFBvd2VyIG1hbmFnZW1lbnQgRW5hYmxlLiAqLworI2RlZmluZQlXT1dfV09NRU4JCQlCSVQxIC8qIFdvVyBmdW5jdGlvbiBvbiBvciBvZmYuICovCisjZGVmaW5lCVdPV19NQUdJQwkJCUJJVDIgLyogTWFnaWMgcGFja2V0ICovCisjZGVmaW5lCVdPV19VV0YJCQkJQklUMyAvKiBVbmljYXN0IFdha2V1cCBmcmFtZS4gKi8KKworLyogMTIuIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcnMJIChPZmZzZXQ6IDB4MDMwMCAtIDB4MDMwRikgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIDgxOTAgSU1SL0lTUiBiaXRzCShvZmZzZXQgMHhmZCwgIDhiaXRzKSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUJSU1SODE5MF9ESVNBQkxFRAkJMHgwCisjZGVmaW5lCUlNUl9CQ05ETUFJTlQ2CQkJQklUKDMxKQorI2RlZmluZQlJTVJfQkNORE1BSU5UNQkJCUJJVCgzMCkKKyNkZWZpbmUJSU1SX0JDTkRNQUlOVDQJCQlCSVQoMjkpCisjZGVmaW5lCUlNUl9CQ05ETUFJTlQzCQkJQklUKDI4KQorI2RlZmluZQlJTVJfQkNORE1BSU5UMgkJCUJJVCgyNykKKyNkZWZpbmUJSU1SX0JDTkRNQUlOVDEJCQlCSVQoMjYpCisjZGVmaW5lCUlNUl9CQ05ET0s4CQkJQklUKDI1KQorI2RlZmluZQlJTVJfQkNORE9LNwkJCUJJVCgyNCkKKyNkZWZpbmUJSU1SX0JDTkRPSzYJCQlCSVQoMjMpCisjZGVmaW5lCUlNUl9CQ05ET0s1CQkJQklUKDIyKQorI2RlZmluZQlJTVJfQkNORE9LNAkJCUJJVCgyMSkKKyNkZWZpbmUJSU1SX0JDTkRPSzMJCQlCSVQoMjApCisjZGVmaW5lCUlNUl9CQ05ET0syCQkJQklUKDE5KQorI2RlZmluZQlJTVJfQkNORE9LMQkJCUJJVCgxOCkKKyNkZWZpbmUJSU1SX1RJTUVPVVQyCQkJQklUKDE3KQorI2RlZmluZQlJTVJfVElNRU9VVDEJCQlCSVQoMTYpCisjZGVmaW5lCUlNUl9UWEZPVlcJCQlCSVQoMTUpCisjZGVmaW5lCUlNUl9QU1RJTUVPVVQJCQlCSVQoMTQpCisjZGVmaW5lCUlNUl9CY25JbnQJCQlCSVQoMTMpCisjZGVmaW5lCUlNUl9SWEZPVlcJCQlCSVQoMTIpCisjZGVmaW5lCUlNUl9SRFUJCQkJQklUKDExKQorI2RlZmluZQlJTVJfQVRJTUVORAkJCUJJVCgxMCkKKyNkZWZpbmUJSU1SX0JET0sJCQlCSVQoOSkKKyNkZWZpbmUJSU1SX0hJR0hET0sJCQlCSVQoOCkKKyNkZWZpbmUJSU1SX1RCRE9LCQkJQklUKDcpCisjZGVmaW5lCUlNUl9NR05URE9LCQkJQklUKDYpCisjZGVmaW5lCUlNUl9UQkRFUgkJCUJJVCg1KQorI2RlZmluZQlJTVJfQktET0sJCQlCSVQoNCkKKyNkZWZpbmUJSU1SX0JFRE9LCQkJQklUKDMpCisjZGVmaW5lCUlNUl9WSURPSwkJCUJJVCgyKQorI2RlZmluZQlJTVJfVk9ET0sJCQlCSVQoMSkKKyNkZWZpbmUJSU1SX1JPSwkJCQlCSVQoMCkKKworI2RlZmluZQlJTVJfVFhFUlIJCQlCSVQoMTEpCisjZGVmaW5lCUlNUl9SWEVSUgkJCUJJVCgxMCkKKyNkZWZpbmUJSU1SX0MySENNRAkJCUJJVCg5KQorI2RlZmluZQlJTVJfQ1BXTQkJCUJJVCg4KQorI2RlZmluZQlJTVJfT0NQSU5UCQkJQklUKDEpCisjZGVmaW5lCUlNUl9XTEFOT0ZGCQkJQklUKDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiA4MTkyQyBFRlVTRSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUJSFdTRVRfTUFYX1NJWkUJCQkyNTYKKyNkZWZpbmUgRUZVU0VfTUFYX1NFQ1RJT04JCTMyCisjZGVmaW5lIEVGVVNFX1JFQUxfQ09OVEVOVF9MRU4JCTUxMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgIDgxOTJDIEVFUFJPTS9FRlVTRSBzaGFyZSByZWdpc3RlciBkZWZpbml0aW9uLiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUJRUVQUk9NX0RFRkFVTFRfVFNTSQkJCTB4MAorI2RlZmluZSBFRVBST01fREVGQVVMVF9DUllTVEFMQ0FQCQkweDAKKyNkZWZpbmUJRUVQUk9NX0RFRkFVTFRfVEhFUk1BTE1FVEVSCQkweDEyCisKKyNkZWZpbmUJRUVQUk9NX0RFRkFVTFRfVFhQT1dFUkxFVkVMXzJHCQkweDJDCisjZGVmaW5lCUVFUFJPTV9ERUZBVUxUX1RYUE9XRVJMRVZFTF81RwkJMHgyMgorCisjZGVmaW5lCUVFUFJPTV9ERUZBVUxUX0hUNDBfMlNESUZGCQkweDAKKy8qIEhUMjA8LT40MCBkZWZhdWx0IFR4IFBvd2VyIEluZGV4IERpZmZlcmVuY2UgKi8KKyNkZWZpbmUgRUVQUk9NX0RFRkFVTFRfSFQyMF9ESUZGCQkyCisvKiBPRkRNIFR4IFBvd2VyIGluZGV4IGRpZmYgKi8KKyNkZWZpbmUJRUVQUk9NX0RFRkFVTFRfTEVHQUNZSFRUWFBPV0VSRElGRgkweDQKKyNkZWZpbmUgRUVQUk9NX0RFRkFVTFRfSFQ0MF9QV1JNQVhPRkZTRVQJMAorI2RlZmluZSBFRVBST01fREVGQVVMVF9IVDIwX1BXUk1BWE9GRlNFVAkwCisKKyNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9GQ0MJCQkweDAKKyNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9JQwkJCTB4MQorI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX0VUU0kJCTB4MgorI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX1NQQUlOCQkweDMKKyNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9GUkFOQ0UJCTB4NAorI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX01LSwkJCTB4NQorI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX01LSzEJCTB4NgorI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX0lTUkFFTAkJMHg3CisjZGVmaW5lCUVFUFJPTV9DSEFOTkVMX1BMQU5fVEVMRUMJCTB4OAorI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX0dMT0JBTF9ET01BSU4JMHg5CisjZGVmaW5lCUVFUFJPTV9DSEFOTkVMX1BMQU5fV09STERfV0lERV8xMwkweEEKKyNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9OQ0MJCQkweEIKKyNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9CWV9IV19NQVNLCQkweDgwCisKKyNkZWZpbmUgRUVQUk9NX0NJRF9ERUZBVUxUCQkJMHgwCisjZGVmaW5lIEVFUFJPTV9DSURfVE9TSElCQQkJCTB4NAorI2RlZmluZQlFRVBST01fQ0lEX0NDWAkJCQkweDEwCisjZGVmaW5lCUVFUFJPTV9DSURfUU1JCQkJCTB4MEQKKyNkZWZpbmUgRUVQUk9NX0NJRF9XSFFMCQkJCTB4RkUKKworCisjZGVmaW5lCVJUTDgxOTJfRUVQUk9NX0lECQkJMHg4MTI5CisjZGVmaW5lCUVFUFJPTV9XQVBJX1NVUFBPUlQJCQkweDc4CisKKworI2RlZmluZSBSVEw4MTkwX0VFUFJPTV9JRAkJMHg4MTI5CS8qIDAtMSAqLworI2RlZmluZSBFRVBST01fSFBPTgkJCTB4MDIgLyogTERPIHNldHRpbmdzLjItNSAqLworI2RlZmluZSBFRVBST01fQ0xLCQkJMHgwNiAvKiBDbG9jayBzZXR0aW5ncy42LTcgKi8KKyNkZWZpbmUgRUVQUk9NX01BQ19GVU5DVElPTgkJMHgwOCAvKiBTRSBUZXN0IG1vZGUuOCAqLworCisjZGVmaW5lIEVFUFJPTV9WSUQJCQkweDI4IC8qIFNFIFZlbmRvciBJRC5BLUIgKi8KKyNkZWZpbmUgRUVQUk9NX0RJRAkJCTB4MkEgLyogU0UgRGV2aWNlIElELiBDLUQgKi8KKyNkZWZpbmUgRUVQUk9NX1NWSUQJCQkweDJDIC8qIFNFIFZlbmRvciBJRC5FLUYgKi8KKyNkZWZpbmUgRUVQUk9NX1NNSUQJCQkweDJFIC8qIFNFIFBDSSBTdWJzeXN0ZW0gSUQuIDEwLTExICovCisKKyNkZWZpbmUgRUVQUk9NX01BQ19BRERSCQkJMHgxNiAvKiBTRU1BQyBBZGRyZXNzLiAxMi0xNyAqLworI2RlZmluZSBFRVBST01fTUFDX0FERFJfTUFDMF85MkQJMHg1NQorI2RlZmluZSBFRVBST01fTUFDX0FERFJfTUFDMV85MkQJMHg1QgorCisvKiAyLjRHIGJhbmQgVHggcG93ZXIgaW5kZXggc2V0dGluZyAqLworI2RlZmluZSBFRVBST01fQ0NLX1RYX1BXUl9JTlhfMkcJMHg2MQorI2RlZmluZSBFRVBST01fSFQ0MF8xU19UWF9QV1JfSU5YXzJHCTB4NjcKKyNkZWZpbmUgRUVQUk9NX0hUNDBfMlNfVFhfUFdSX0lOWF9ESUZGXzJHCTB4NkQKKyNkZWZpbmUgRUVQUk9NX0hUMjBfVFhfUFdSX0lOWF9ESUZGXzJHCQkweDcwCisjZGVmaW5lIEVFUFJPTV9PRkRNX1RYX1BXUl9JTlhfRElGRl8yRwkJMHg3MworI2RlZmluZSBFRVBST01fSFQ0MF9NQVhfUFdSX09GRlNFVF8yRwkJMHg3NgorI2RlZmluZSBFRVBST01fSFQyMF9NQVhfUFdSX09GRlNFVF8yRwkJMHg3OQorCisvKjVHTCBjaGFubmVsIDMyLTY0ICovCisjZGVmaW5lIEVFUFJPTV9IVDQwXzFTX1RYX1BXUl9JTlhfNUdMCQkweDdDCisjZGVmaW5lIEVFUFJPTV9IVDQwXzJTX1RYX1BXUl9JTlhfRElGRl81R0wJMHg4MgorI2RlZmluZSBFRVBST01fSFQyMF9UWF9QV1JfSU5YX0RJRkZfNUdMCQkweDg1CisjZGVmaW5lIEVFUFJPTV9PRkRNX1RYX1BXUl9JTlhfRElGRl81R0wJCTB4ODgKKyNkZWZpbmUgRUVQUk9NX0hUNDBfTUFYX1BXUl9PRkZTRVRfNUdMCQkweDhCCisjZGVmaW5lIEVFUFJPTV9IVDIwX01BWF9QV1JfT0ZGU0VUXzVHTAkJMHg4RQorCisvKiA1R00gY2hhbm5lbCAxMDAtMTQwICovCisjZGVmaW5lIEVFUFJPTV9IVDQwXzFTX1RYX1BXUl9JTlhfNUdNCQkweDkxCisjZGVmaW5lIEVFUFJPTV9IVDQwXzJTX1RYX1BXUl9JTlhfRElGRl81R00JMHg5NworI2RlZmluZSBFRVBST01fSFQyMF9UWF9QV1JfSU5YX0RJRkZfNUdNCQkweDlBCisjZGVmaW5lIEVFUFJPTV9PRkRNX1RYX1BXUl9JTlhfRElGRl81R00JCTB4OUQKKyNkZWZpbmUgRUVQUk9NX0hUNDBfTUFYX1BXUl9PRkZTRVRfNUdNCQkweEEwCisjZGVmaW5lIEVFUFJPTV9IVDIwX01BWF9QV1JfT0ZGU0VUXzVHTQkJMHhBMworCisvKiA1R0ggY2hhbm5lbCAxNDktMTY1ICovCisjZGVmaW5lIEVFUFJPTV9IVDQwXzFTX1RYX1BXUl9JTlhfNUdICQkweEE2CisjZGVmaW5lIEVFUFJPTV9IVDQwXzJTX1RYX1BXUl9JTlhfRElGRl81R0gJMHhBQworI2RlZmluZSBFRVBST01fSFQyMF9UWF9QV1JfSU5YX0RJRkZfNUdICQkweEFGCisjZGVmaW5lIEVFUFJPTV9PRkRNX1RYX1BXUl9JTlhfRElGRl81R0gJCTB4QjIKKyNkZWZpbmUgRUVQUk9NX0hUNDBfTUFYX1BXUl9PRkZTRVRfNUdICQkweEI1CisjZGVmaW5lIEVFUFJPTV9IVDIwX01BWF9QV1JfT0ZGU0VUXzVHSAkJMHhCOAorCisvKiBNYXAgb2Ygc3VwcG9ydGVkIGNoYW5uZWxzLiAqLworI2RlZmluZSBFRVBST01fQ0hBTk5FTF9QTEFOCQkJMHhCQgorI2RlZmluZSBFRVBST01fSVFLX0RFTFRBCQkJMHhCQworI2RlZmluZSBFRVBST01fTENLX0RFTFRBCQkJMHhCQworI2RlZmluZSBFRVBST01fWFRBTF9LCQkJCTB4QkQJLyogWzc6NV0gKi8KKyNkZWZpbmUgRUVQUk9NX1RTU0lfQV81RwkJCTB4QkUKKyNkZWZpbmUgRUVQUk9NX1RTU0lfQl81RwkJCTB4QkYKKyNkZWZpbmUgRUVQUk9NX1RTU0lfQUJfNUcJCQkweEMwCisjZGVmaW5lIEVFUFJPTV9USEVSTUFMX01FVEVSCQkJMHhDMwkvKiBbNDowXSAqLworI2RlZmluZSBFRVBST01fUkZfT1BUMQkJCQkweEM0CisjZGVmaW5lIEVFUFJPTV9SRl9PUFQyCQkJCTB4QzUKKyNkZWZpbmUgRUVQUk9NX1JGX09QVDMJCQkJMHhDNgorI2RlZmluZSBFRVBST01fUkZfT1BUNAkJCQkweEM3CisjZGVmaW5lIEVFUFJPTV9SRl9PUFQ1CQkJCTB4QzgKKyNkZWZpbmUgRUVQUk9NX1JGX09QVDYJCQkJMHhDOQorI2RlZmluZSBFRVBST01fVkVSU0lPTgkJCQkweENBCisjZGVmaW5lIEVFUFJPTV9DVVNUT01FUl9JRAkJCTB4Q0IKKyNkZWZpbmUgRUVQUk9NX1JGX09QVDcJCQkJMHhDQworCisjZGVmaW5lIEVFUFJPTV9ERUZfUEFSVF9OTwkJCTB4M0ZEICAgIC8qIEJ5dGUgKi8KKyNkZWZpbmUgRUVQUk9NRV9DSElQX1ZFUlNJT05fTAkJCTB4M0ZGCisjZGVmaW5lIEVFUFJPTUVfQ0hJUF9WRVJTSU9OX0gJCQkweDNGRQorCisvKgorICogQ3VycmVudCBJT1JFRyBNQVAKKyAqIDB4MDAwMGggfiAweDAwRkZoICAgU3lzdGVtIENvbmZpZ3VyYXRpb24gKDI1NiBCeXRlcykKKyAqIDB4MDEwMGggfiAweDAxRkZoICAgTUFDVE9QIEdlbmVyYWwgQ29uZmlndXJhdGlvbiAoMjU2IEJ5dGVzKQorICogMHgwMjAwaCB+IDB4MDI3RmggICBUWERNQSBDb25maWd1cmF0aW9uICgxMjggQnl0ZXMpCisgKiAweDAyODBoIH4gMHgwMkZGaCAgIFJYRE1BIENvbmZpZ3VyYXRpb24gKDEyOCBCeXRlcykKKyAqIDB4MDMwMGggfiAweDAzRkZoICAgUENJRSBFTUFDIFJlc2VydmVkIFJlZ2lvbiAoMjU2IEJ5dGVzKQorICogMHgwNDAwaCB+IDB4MDRGRmggICBQcm90b2NvbCBDb25maWd1cmF0aW9uICgyNTYgQnl0ZXMpCisgKiAweDA1MDBoIH4gMHgwNUZGaCAgIEVEQ0EgQ29uZmlndXJhdGlvbiAoMjU2IEJ5dGVzKQorICogMHgwNjAwaCB+IDB4MDdGRmggICBXTUFDIENvbmZpZ3VyYXRpb24gKDUxMiBCeXRlcykKKyAqIDB4MjAwMGggfiAweDNGRkZoICAgODA1MSBGVyBEb3dubG9hZCBSZWdpb24gKDgxOTYgQnl0ZXMpCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIDgxOTJDIChSQ1IpCShPZmZzZXQgMHg2MDgsIDMyIGJpdHMpICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZQlSQ1JfQVBQRkNTCQkJCUJJVCgzMSkKKyNkZWZpbmUJUkNSX0FQUF9NSUMJCQkJQklUKDMwKQorI2RlZmluZQlSQ1JfQVBQX0lDVgkJCQlCSVQoMjkpCisjZGVmaW5lCVJDUl9BUFBfUEhZU1RfUlhGRgkJCUJJVCgyOCkKKyNkZWZpbmUJUkNSX0FQUF9CQV9TU04JCQkJQklUKDI3KQorI2RlZmluZQlSQ1JfRU5NQklECQkJCUJJVCgyNCkKKyNkZWZpbmUJUkNSX0xTSUdFTgkJCQlCSVQoMjMpCisjZGVmaW5lCVJDUl9NRkJFTgkJCQlCSVQoMjIpCisjZGVmaW5lCVJDUl9IVENfTE9DX0NUUkwJCQlCSVQoMTQpCisjZGVmaW5lCVJDUl9BTUYJCQkJCUJJVCgxMykKKyNkZWZpbmUJUkNSX0FDRgkJCQkJQklUKDEyKQorI2RlZmluZQlSQ1JfQURGCQkJCQlCSVQoMTEpCisjZGVmaW5lCVJDUl9BSUNWCQkJCUJJVCg5KQorI2RlZmluZQlSQ1JfQUNSQzMyCQkJCUJJVCg4KQorI2RlZmluZQlSQ1JfQ0JTU0lEX0JDTgkJCQlCSVQoNykKKyNkZWZpbmUJUkNSX0NCU1NJRF9EQVRBCQkJCUJJVCg2KQorI2RlZmluZQlSQ1JfQVBXUk1HVAkJCQlCSVQoNSkKKyNkZWZpbmUJUkNSX0FERDMJCQkJQklUKDQpCisjZGVmaW5lCVJDUl9BQgkJCQkJQklUKDMpCisjZGVmaW5lCVJDUl9BTQkJCQkJQklUKDIpCisjZGVmaW5lCVJDUl9BUE0JCQkJCUJJVCgxKQorI2RlZmluZQlSQ1JfQUFQCQkJCQlCSVQoMCkKKyNkZWZpbmUJUkNSX01YRE1BX09GRlNFVAkJCTgKKyNkZWZpbmUJUkNSX0ZJRk9fT0ZGU0VUCQkJCTEzCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgICA4MTkyQyBSZWdzaXRlciBCaXQgYW5kIENvbnRlbnQgZGVmaW5pdGlvbgkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoJMHgwMDAwaCB+IDB4MDBGRmgJU3lzdGVtIENvbmZpZ3VyYXRpb24gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFNQUzBfQ1RSTCAqLworI2RlZmluZSBTVzE4X0ZQV00JCQkJQklUKDMpCisKKworLyogU1lTX0lTT19DVFJMICovCisjZGVmaW5lIElTT19NRDJQUAkJCQlCSVQoMCkKKyNkZWZpbmUgSVNPX1VBMlVTQgkJCQlCSVQoMSkKKyNkZWZpbmUgSVNPX1VEMkNPUkUJCQkJQklUKDIpCisjZGVmaW5lIElTT19QQTJQQ0lFCQkJCUJJVCgzKQorI2RlZmluZSBJU09fUEQyQ09SRQkJCQlCSVQoNCkKKyNkZWZpbmUgSVNPX0lQMk1BQwkJCQlCSVQoNSkKKyNkZWZpbmUgSVNPX0RJT1AJCQkJQklUKDYpCisjZGVmaW5lIElTT19ESU9FCQkJCUJJVCg3KQorI2RlZmluZSBJU09fRUIyQ09SRQkJCQlCSVQoOCkKKyNkZWZpbmUgSVNPX0RJT1IJCQkJQklUKDkpCisKKyNkZWZpbmUgUFdDX0VWMjVWCQkJCUJJVCgxNCkKKyNkZWZpbmUgUFdDX0VWMTJWCQkJCUJJVCgxNSkKKworCisvKiBTWVNfRlVOQ19FTiAqLworI2RlZmluZSBGRU5fQkJSU1RCCQkJCUJJVCgwKQorI2RlZmluZSBGRU5fQkJfR0xCX1JTVG4JCQkJQklUKDEpCisjZGVmaW5lIEZFTl9VU0JBCQkJCUJJVCgyKQorI2RlZmluZSBGRU5fVVBMTAkJCQlCSVQoMykKKyNkZWZpbmUgRkVOX1VTQkQJCQkJQklUKDQpCisjZGVmaW5lIEZFTl9ESU9fUENJRQkJCQlCSVQoNSkKKyNkZWZpbmUgRkVOX1BDSUVBCQkJCUJJVCg2KQorI2RlZmluZSBGRU5fUFBMTAkJCQlCSVQoNykKKyNkZWZpbmUgRkVOX1BDSUVECQkJCUJJVCg4KQorI2RlZmluZSBGRU5fRElPRQkJCQlCSVQoOSkKKyNkZWZpbmUgRkVOX0NQVUVOCQkJCUJJVCgxMCkKKyNkZWZpbmUgRkVOX0RDT1JFCQkJCUJJVCgxMSkKKyNkZWZpbmUgRkVOX0VMRFIJCQkJQklUKDEyKQorI2RlZmluZSBGRU5fRElPX1JGCQkJCUJJVCgxMykKKyNkZWZpbmUgRkVOX0hXUEROCQkJCUJJVCgxNCkKKyNkZWZpbmUgRkVOX01SRUdFTgkJCQlCSVQoMTUpCisKKy8qIEFQU19GU01DTyAqLworI2RlZmluZSBQRk1fTERBTEwJCQkJQklUKDApCisjZGVmaW5lIFBGTV9BTEROCQkJCUJJVCgxKQorI2RlZmluZSBQRk1fTERLUAkJCQlCSVQoMikKKyNkZWZpbmUgUEZNX1dPV0wJCQkJQklUKDMpCisjZGVmaW5lIEVuUEROCQkJCQlCSVQoNCkKKyNkZWZpbmUgUEROX1BMCQkJCQlCSVQoNSkKKyNkZWZpbmUgQVBGTV9PTk1BQwkJCQlCSVQoOCkKKyNkZWZpbmUgQVBGTV9PRkYJCQkJQklUKDkpCisjZGVmaW5lIEFQRk1fUlNNCQkJCUJJVCgxMCkKKyNkZWZpbmUgQUZTTV9IU1VTCQkJCUJJVCgxMSkKKyNkZWZpbmUgQUZTTV9QQ0lFCQkJCUJJVCgxMikKKyNkZWZpbmUgQVBETV9NQUMJCQkJQklUKDEzKQorI2RlZmluZSBBUERNX0hPU1QJCQkJQklUKDE0KQorI2RlZmluZSBBUERNX0hQRE4JCQkJQklUKDE1KQorI2RlZmluZSBSRFlfTUFDT04JCQkJQklUKDE2KQorI2RlZmluZSBTVVNfSE9TVAkJCQlCSVQoMTcpCisjZGVmaW5lIFJPUF9BTEQJCQkJCUJJVCgyMCkKKyNkZWZpbmUgUk9QX1BXUgkJCQkJQklUKDIxKQorI2RlZmluZSBST1BfU1BTCQkJCQlCSVQoMjIpCisjZGVmaW5lIFNPUF9NUlNUCQkJCUJJVCgyNSkKKyNkZWZpbmUgU09QX0ZVU0UJCQkJQklUKDI2KQorI2RlZmluZSBTT1BfQUJHCQkJCQlCSVQoMjcpCisjZGVmaW5lIFNPUF9BTUIJCQkJCUJJVCgyOCkKKyNkZWZpbmUgU09QX1JDSwkJCQkJQklUKDI5KQorI2RlZmluZSBTT1BfQThNCQkJCQlCSVQoMzApCisjZGVmaW5lIFhPUF9CVENLCQkJCUJJVCgzMSkKKworLyogU1lTX0NMS1IgKi8KKyNkZWZpbmUgQU5BRDE2Vl9FTgkJCQlCSVQoMCkKKyNkZWZpbmUgQU5BOE0JCQkJCUJJVCgxKQorI2RlZmluZSBNQUNTTFAJCQkJCUJJVCg0KQorI2RlZmluZSBMT0FERVJfQ0xLX0VOCQkJCUJJVCg1KQorI2RlZmluZSBfODBNX1NTQ19ESVMJCQkJQklUKDcpCisjZGVmaW5lIF84ME1fU1NDX0VOX0hPCQkJCUJJVCg4KQorI2RlZmluZSBQSFlfU1NDX1JTVEIJCQkJQklUKDkpCisjZGVmaW5lIFNFQ19DTEtfRU4JCQkJQklUKDEwKQorI2RlZmluZSBNQUNfQ0xLX0VOCQkJCUJJVCgxMSkKKyNkZWZpbmUgU1lTX0NMS19FTgkJCQlCSVQoMTIpCisjZGVmaW5lIFJJTkdfQ0xLX0VOCQkJCUJJVCgxMykKKworCisvKiA5MzQ2Q1IgKi8KKyNkZWZpbmUJQk9PVF9GUk9NX0VFUFJPTQkJCUJJVCg0KQorI2RlZmluZQlFRVBST01fRU4JCQkJQklUKDUpCisKKy8qIEFGRV9NSVNDICovCisjZGVmaW5lIEFGRV9CR0VOCQkJCUJJVCgwKQorI2RlZmluZSBBRkVfTUJFTgkJCQlCSVQoMSkKKyNkZWZpbmUgTUFDX0lEX0VOCQkJCUJJVCg3KQorCisvKiBSU1ZfQ1RSTCAqLworI2RlZmluZSBXTE9DS19BTEwJCQkJQklUKDApCisjZGVmaW5lIFdMT0NLXzAwCQkJCUJJVCgxKQorI2RlZmluZSBXTE9DS18wNAkJCQlCSVQoMikKKyNkZWZpbmUgV0xPQ0tfMDgJCQkJQklUKDMpCisjZGVmaW5lIFdMT0NLXzQwCQkJCUJJVCg0KQorI2RlZmluZSBSX0RJU19QUlNUXzAJCQkJQklUKDUpCisjZGVmaW5lIFJfRElTX1BSU1RfMQkJCQlCSVQoNikKKyNkZWZpbmUgTE9DS19BTExfRU4JCQkJQklUKDcpCisKKy8qIFJGX0NUUkwgKi8KKyNkZWZpbmUgUkZfRU4JCQkJCUJJVCgwKQorI2RlZmluZSBSRl9SU1RCCQkJCQlCSVQoMSkKKyNkZWZpbmUgUkZfU0RNUlNUQgkJCQlCSVQoMikKKworCisKKy8qIExET0ExNV9DVFJMICovCisjZGVmaW5lIExEQTE1X0VOCQkJCUJJVCgwKQorI2RlZmluZSBMREExNV9TVEJZCQkJCUJJVCgxKQorI2RlZmluZSBMREExNV9PQlVGCQkJCUJJVCgyKQorI2RlZmluZSBMREExNV9SRUdfVk9TCQkJCUJJVCgzKQorI2RlZmluZSBfTERBMTVfVk9BREooeCkJCQkJKCgoeCkgJiAweDcpIDw8IDQpCisKKworCisvKiBMRE9WMTJEX0NUUkwgKi8KKyNkZWZpbmUgTERWMTJfRU4JCQkJQklUKDApCisjZGVmaW5lIExEVjEyX1NEQlkJCQkJQklUKDEpCisjZGVmaW5lIExQTERPX0hTTQkJCQlCSVQoMikKKyNkZWZpbmUgTFBMRE9fTFNNX0RJUwkJCQlCSVQoMykKKyNkZWZpbmUgX0xEVjEyX1ZBREooeCkJCQkJKCgoeCkgJiAweEYpIDw8IDQpCisKKworLyogQUZFX1hUQUxfQ1RSTCAqLworI2RlZmluZSBYVEFMX0VOCQkJCQlCSVQoMCkKKyNkZWZpbmUgWFRBTF9CU0VMCQkJCUJJVCgxKQorI2RlZmluZSBfWFRBTF9CT1NDKHgpCQkJCSgoKHgpICYgMHgzKSA8PCAyKQorI2RlZmluZSBfWFRBTF9DQURKKHgpCQkJCSgoKHgpICYgMHhGKSA8PCA0KQorI2RlZmluZSBYVEFMX0dBVEVfVVNCCQkJCUJJVCg4KQorI2RlZmluZSBfWFRBTF9VU0JfRFJWKHgpCQkJKCgoeCkgJiAweDMpIDw8IDkpCisjZGVmaW5lIFhUQUxfR0FURV9BRkUJCQkJQklUKDExKQorI2RlZmluZSBfWFRBTF9BRkVfRFJWKHgpCQkJKCgoeCkgJiAweDMpIDw8IDEyKQorI2RlZmluZSBYVEFMX1JGX0dBVEUJCQkJQklUKDE0KQorI2RlZmluZSBfWFRBTF9SRl9EUlYoeCkJCQkJKCgoeCkgJiAweDMpIDw8IDE1KQorI2RlZmluZSBYVEFMX0dBVEVfRElHCQkJCUJJVCgxNykKKyNkZWZpbmUgX1hUQUxfRElHX0RSVih4KQkJCSgoKHgpICYgMHgzKSA8PCAxOCkKKyNkZWZpbmUgWFRBTF9CVF9HQVRFCQkJCUJJVCgyMCkKKyNkZWZpbmUgX1hUQUxfQlRfRFJWKHgpCQkJCSgoKHgpICYgMHgzKSA8PCAyMSkKKyNkZWZpbmUgX1hUQUxfR1BJTyh4KQkJCQkoKCh4KSAmIDB4NykgPDwgMjMpCisKKworI2RlZmluZSBDS0RMWV9BRkUJCQkJQklUKDI2KQorI2RlZmluZSBDS0RMWV9VU0IJCQkJQklUKDI3KQorI2RlZmluZSBDS0RMWV9ESUcJCQkJQklUKDI4KQorI2RlZmluZSBDS0RMWV9CVAkJCQlCSVQoMjkpCisKKworLyogQUZFX1BMTF9DVFJMICovCisjZGVmaW5lIEFQTExfRU4JCQkJCUJJVCgwKQorI2RlZmluZSBBUExMXzMyMF9FTgkJCQlCSVQoMSkKKyNkZWZpbmUgQVBMTF9GUkVGX1NFTAkJCQlCSVQoMikKKyNkZWZpbmUgQVBMTF9FREdFX1NFTAkJCQlCSVQoMykKKyNkZWZpbmUgQVBMTF9XRE9HQgkJCQlCSVQoNCkKKyNkZWZpbmUgQVBMTF9MUEZFTgkJCQlCSVQoNSkKKworI2RlZmluZSBBUExMX1JFRl9DTEtfMTNNSFoJCQkweDEKKyNkZWZpbmUgQVBMTF9SRUZfQ0xLXzE5XzJNSFoJCQkweDIKKyNkZWZpbmUgQVBMTF9SRUZfQ0xLXzIwTUhaCQkJMHgzCisjZGVmaW5lIEFQTExfUkVGX0NMS18yNU1IWgkJCTB4NAorI2RlZmluZSBBUExMX1JFRl9DTEtfMjZNSFoJCQkweDUKKyNkZWZpbmUgQVBMTF9SRUZfQ0xLXzM4XzRNSFoJCQkweDYKKyNkZWZpbmUgQVBMTF9SRUZfQ0xLXzQwTUhaCQkJMHg3CisKKyNkZWZpbmUgQVBMTF8zMjBFTgkJCQlCSVQoMTQpCisjZGVmaW5lIEFQTExfODBFTgkJCQlCSVQoMTUpCisjZGVmaW5lIEFQTExfMU1FTgkJCQlCSVQoMjQpCisKKworLyogRUZVU0VfQ1RSTCAqLworI2RlZmluZSBBTERfRU4JCQkJCUJJVCgxOCkKKyNkZWZpbmUgRUZfUEQJCQkJCUJJVCgxOSkKKyNkZWZpbmUgRUZfRkxBRwkJCQkJQklUKDMxKQorCisvKiBFRlVTRV9URVNUICAqLworI2RlZmluZSBFRl9UUlBUCQkJCQlCSVQoNykKKyNkZWZpbmUgTERPRTI1X0VOCQkJCUJJVCgzMSkKKworLyogTUNVRldETCAgKi8KKyNkZWZpbmUgTUNVRldETF9FTgkJCQlCSVQoMCkKKyNkZWZpbmUgTUNVRldETF9SRFkJCQkJQklUKDEpCisjZGVmaW5lIEZXRExfQ2hrU3VtX3JwdAkJCQlCSVQoMikKKyNkZWZpbmUgTUFDSU5JX1JEWQkJCQlCSVQoMykKKyNkZWZpbmUgQkJJTklfUkRZCQkJCUJJVCg0KQorI2RlZmluZSBSRklOSV9SRFkJCQkJQklUKDUpCisjZGVmaW5lIFdJTlRJTklfUkRZCQkJCUJJVCg2KQorI2RlZmluZSBNQUMxX1dJTlRJTklfUkRZCQkJQklUKDExKQorI2RlZmluZSBDUFJTVAkJCQkJQklUKDIzKQorCisvKiAgUkVHX1NZU19DRkcgKi8KKyNkZWZpbmUgWENMS19WTEQJCQkJQklUKDApCisjZGVmaW5lIEFDTEtfVkxECQkJCUJJVCgxKQorI2RlZmluZSBVQ0xLX1ZMRAkJCQlCSVQoMikKKyNkZWZpbmUgUENMS19WTEQJCQkJQklUKDMpCisjZGVmaW5lIFBDSVJTVEIJCQkJCUJJVCg0KQorI2RlZmluZSBWMTVfVkxECQkJCQlCSVQoNSkKKyNkZWZpbmUgVFJQX0IxNVZfRU4JCQkJQklUKDcpCisjZGVmaW5lIFNJQ19JRExFCQkJCUJJVCg4KQorI2RlZmluZSBCRF9NQUMyCQkJCQlCSVQoOSkKKyNkZWZpbmUgQkRfTUFDMQkJCQkJQklUKDEwKQorI2RlZmluZSBJQ19NQUNQSFlfTU9ERQkJCQlCSVQoMTEpCisjZGVmaW5lIFBBRF9IV1BEX0lETgkJCQlCSVQoMjIpCisjZGVmaW5lIFRSUF9WQVVYX0VOCQkJCUJJVCgyMykKKyNkZWZpbmUgVFJQX0JUX0VOCQkJCUJJVCgyNCkKKyNkZWZpbmUgQkRfUEtHX1NFTAkJCQlCSVQoMjUpCisjZGVmaW5lIEJEX0hDSV9TRUwJCQkJQklUKDI2KQorI2RlZmluZSBUWVBFX0lECQkJCQlCSVQoMjcpCisKKy8qIExMVF9JTklUICovCisjZGVmaW5lIF9MTFRfTk9fQUNUSVZFCQkJCTB4MAorI2RlZmluZSBfTExUX1dSSVRFX0FDQ0VTUwkJCTB4MQorI2RlZmluZSBfTExUX1JFQURfQUNDRVNTCQkJMHgyCisKKyNkZWZpbmUgX0xMVF9JTklUX0RBVEEoeCkJCQkoKHgpICYgMHhGRikKKyNkZWZpbmUgX0xMVF9JTklUX0FERFIoeCkJCQkoKCh4KSAmIDB4RkYpIDw8IDgpCisjZGVmaW5lIF9MTFRfT1AoeCkJCQkJKCgoeCkgJiAweDMpIDw8IDMwKQorI2RlZmluZSBfTExUX09QX1ZBTFVFKHgpCQkJKCgoeCkgPj4gMzApICYgMHgzKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgkweDA0MDBoIH4gMHgwNDdGaAlQcm90b2NvbCBDb25maWd1cmF0aW9uCSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUJUkVUUllfTElNSVRfU0hPUlRfU0hJRlQJCQk4CisjZGVmaW5lCVJFVFJZX0xJTUlUX0xPTkdfU0hJRlQJCQkwCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCTB4MDUwMGggfiAweDA1RkZoCUVEQ0EgQ29uZmlndXJhdGlvbiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEVEQ0Egc2V0dGluZyAqLworI2RlZmluZSBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVAkJMTYKKyNkZWZpbmUgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQJCQkxMgorI2RlZmluZSBBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVAkJCTgKKyNkZWZpbmUgQUNfUEFSQU1fQUlGU19PRkZTRVQJCQkwCisKKy8qIEFDTUhXQ1RSTCAqLworI2RlZmluZQlBQ01IV19IV0VOCQkJCUJJVCgwKQorI2RlZmluZQlBQ01IV19CRVFFTgkJCQlCSVQoMSkKKyNkZWZpbmUJQUNNSFdfVklRRU4JCQkJQklUKDIpCisjZGVmaW5lCUFDTUhXX1ZPUUVOCQkJCUJJVCgzKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoJMHgwNjAwaCB+IDB4MDdGRmgJV01BQyBDb25maWd1cmF0aW9uICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUQ1IgKi8KKyNkZWZpbmUgVFNGUlNUCQkJCQlCSVQoMCkKKyNkZWZpbmUgRElTX0dDTEsJCQkJQklUKDEpCisjZGVmaW5lIFBBRF9TRUwJCQkJCUJJVCgyKQorI2RlZmluZSBQV1JfU1QJCQkJCUJJVCg2KQorI2RlZmluZSBQV1JCSVRfT1dfRU4JCQkJQklUKDcpCisjZGVmaW5lIEFDUkMJCQkJCUJJVCg4KQorI2RlZmluZSBDRkVOREZPUk0JCQkJQklUKDkpCisjZGVmaW5lIElDVgkJCQkJQklUKDEwKQorCisvKiBTRUNDRkcgKi8KKyNkZWZpbmUJU0NSX1RYVVNFREsJCQkJQklUKDApCisjZGVmaW5lCVNDUl9SWFVTRURLCQkJCUJJVCgxKQorI2RlZmluZQlTQ1JfVFhFTkNFTkFCTEUJCQkJQklUKDIpCisjZGVmaW5lCVNDUl9SWEVOQ0VOQUJMRQkJCQlCSVQoMykKKyNkZWZpbmUJU0NSX1NLQllBMgkJCQlCSVQoNCkKKyNkZWZpbmUJU0NSX05PU0tNQwkJCQlCSVQoNSkKKyNkZWZpbmUgU0NSX1RYQkNVU0VESwkJCQlCSVQoNikKKyNkZWZpbmUgU0NSX1JYQkNVU0VESwkJCQlCSVQoNykKKworLyogR2VuZXJhbCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBNQUNfQUREUl9MRU4JCQkJNgorI2RlZmluZSBMQVNUX0VOVFJZX09GX1RYX1BLVF9CVUZGRVIJCTI1NQorI2RlZmluZSBMQVNUX0VOVFJZX09GX1RYX1BLVF9CVUZGRVJfRFVBTF9NQUMJMTI3CisKKyNkZWZpbmUgUE9MTElOR19MTFRfVEhSRVNIT0xECQkJMjAKKyNkZWZpbmUgUE9MTElOR19SRUFEWV9USU1FT1VUX0NPVU5UCQkxMDAwCisKKy8qIE1pbiBTcGFjaW5nIHJlbGF0ZWQgc2V0dGluZ3MuICovCisjZGVmaW5lCU1BWF9NU1NfREVOU0lUWV8yVAkJCTB4MTMKKyNkZWZpbmUJTUFYX01TU19ERU5TSVRZXzFUCQkJMHgwQQorCisKKy8qIEJCLVBIWSByZWdpc3RlciBQTUFDIDB4MTAwIFBIWSAweDgwMCAtIDB4RUZGICovCisvKiAxLiBQTUFDIGR1cGxpY2F0ZSByZWdpc3RlciBkdWUgdG8gY29ubmVjdGlvbjogKi8KKy8qICAgIFJGX01vZGUsIFRSeFJOLCBOdW1PZiBMLVNURiAqLworLyogMi4gMHg4MDAvMHg5MDAvMHhBMDAvMHhDMDAvMHhEMDAvMHhFMDAgKi8KKy8qIDMuIFJGIHJlZ2lzdGVyIDB4MDAtMkUgKi8KKy8qIDQuIEJpdCBNYXNrIGZvciBCQi9SRiByZWdpc3RlciAqLworLyogNS4gT3RoZXIgZGVmaW50aW9uIGZvciBCQi9SRiBSL1cgKi8KKworLyogMy4gUGFnZTgoMHg4MDApICovCisjZGVmaW5lCVJGUEdBMF9SRk1PRAkJCQkweDgwMAorCisjZGVmaW5lCVJGUEdBMF9UWElORk8JCQkJMHg4MDQKKyNkZWZpbmUJUkZQR0EwX1BTREZVTkNUSU9OCQkJMHg4MDgKKworI2RlZmluZQlSRlBHQTBfVFhHQUlOU1RBR0UJCQkweDgwYworCisjZGVmaW5lCVJGUEdBMF9SRlRJTUlORzEJCQkweDgxMAorI2RlZmluZQlSRlBHQTBfUkZUSU1JTkcyCQkJMHg4MTQKKworI2RlZmluZQlSRlBHQTBfWEFfSFNTSVBBUkFNRVRFUjEJCTB4ODIwCisjZGVmaW5lCVJGUEdBMF9YQV9IU1NJUEFSQU1FVEVSMgkJMHg4MjQKKyNkZWZpbmUJUkZQR0EwX1hCX0hTU0lQQVJBTUVURVIxCQkweDgyOAorI2RlZmluZQlSRlBHQTBfWEJfSFNTSVBBUkFNRVRFUjIJCTB4ODJjCisKKyNkZWZpbmUJUkZQR0EwX1hBX0xTU0lQQVJBTUVURVIJCQkweDg0MAorI2RlZmluZQlSRlBHQTBfWEJfTFNTSVBBUkFNRVRFUgkJCTB4ODQ0CisKKyNkZWZpbmUJUkZQR0EwX1JGV0FrRVVQUEFSQU1FVEVSCQkweDg1MAorI2RlZmluZQlSRlBHQTBfUkZTTEVFUFVQUEFSQU1FVEVSCQkweDg1NAorCisjZGVmaW5lCVJGUEdBMF9YQUJfU1dJVENIQ09OVFJPTAkJMHg4NTgKKyNkZWZpbmUJUkZQR0EwX1hDRF9TV0lUQ0hDT05UUk9MCQkweDg1YworCisjZGVmaW5lCVJGUEdBMF9YQV9SRklOVEVSRkFDRU9FCQkJMHg4NjAKKyNkZWZpbmUJUkZQR0EwX1hCX1JGSU5URVJGQUNFT0UJCQkweDg2NAorCisjZGVmaW5lCVJGUEdBMF9YQUJfUkZJTlRFUkZBQ0VTVwkJMHg4NzAKKyNkZWZpbmUJUkZQR0EwX1hDRF9SRklOVEVSRkFDRVNXCQkweDg3NAorCisjZGVmaW5lCVJGUEdBMF9YQUJfUkZQQVJBTUVURVIJCQkweDg3OAorI2RlZmluZQlSRlBHQTBfWENEX1JGUEFSQU1FVEVSCQkJMHg4N2MKKworI2RlZmluZQlSRlBHQTBfQU5BTE9HUEFSQU1FVEVSMQkJCTB4ODgwCisjZGVmaW5lCVJGUEdBMF9BTkFMT0dQQVJBTUVURVIyCQkJMHg4ODQKKyNkZWZpbmUJUkZQR0EwX0FOQUxPR1BBUkFNRVRFUjMJCQkweDg4OAorI2RlZmluZQlSRlBHQTBfQUREQUxMT0NLRU4JCQkweDg4OAorI2RlZmluZQlSRlBHQTBfQU5BTE9HUEFSQU1FVEVSNAkJCTB4ODhjCisKKyNkZWZpbmUJUkZQR0EwX1hBX0xTU0lSRUFEQkFDSwkJCTB4OGEwCisjZGVmaW5lCVJGUEdBMF9YQl9MU1NJUkVBREJBQ0sJCQkweDhhNAorI2RlZmluZQlSRlBHQTBfWENfTFNTSVJFQURCQUNLCQkJMHg4YTgKKyNkZWZpbmUJUkZQR0EwX1hEX0xTU0lSRUFEQkFDSwkJCTB4OGFjCisKKyNkZWZpbmUJUkZQR0EwX1BTRFJFUE9SVAkJCTB4OGI0CisjZGVmaW5lCVRSQU5TQ0VJVkVSQV9IU1BJX1JFQURCQUNLCQkweDhiOAorI2RlZmluZQlUUkFOU0NFSVZFUkJfSFNQSV9SRUFEQkFDSwkJMHg4YmMKKyNkZWZpbmUJUkZQR0EwX1hBQl9SRklOVEVSRkFDRVJCCQkweDhlMAorI2RlZmluZQlSRlBHQTBfWENEX1JGSU5URVJGQUNFUkIJCTB4OGU0CisKKy8qIDQuIFBhZ2U5KDB4OTAwKSAqLworI2RlZmluZQlSRlBHQTFfUkZNT0QJCQkJMHg5MDAKKworI2RlZmluZQlSRlBHQTFfVFhCTE9DSwkJCQkweDkwNAorI2RlZmluZQlSRlBHQTFfREVCVUdTRUxFQ1QJCQkweDkwOAorI2RlZmluZQlSRlBHQTFfVFhJTkZPCQkJCTB4OTBjCisKKy8qIDUuIFBhZ2VBKDB4QTAwKSAgKi8KKyNkZWZpbmUJUkNDSzBfU1lTVEVNCQkJCTB4YTAwCisKKyNkZWZpbmUJUkNDSzBfQUZFU1NUVElORwkJCTB4YTA0CisjZGVmaW5lCVJDQ0swX0NDQQkJCQkweGEwOAorCisjZGVmaW5lCVJDQ0swX1JYQUdDMQkJCQkweGEwYworI2RlZmluZQlSQ0NLMF9SWEFHQzIJCQkJMHhhMTAKKworI2RlZmluZQlSQ0NLMF9SWEhQCQkJCTB4YTE0CisKKyNkZWZpbmUJUkNDSzBfRFNQUEFSQU1FVEVSMQkJCTB4YTE4CisjZGVmaW5lCVJDQ0swX0RTUFBBUkFNRVRFUjIJCQkweGExYworCisjZGVmaW5lCVJDQ0swX1RYRklMVEVSMQkJCQkweGEyMAorI2RlZmluZQlSQ0NLMF9UWEZJTFRFUjIJCQkJMHhhMjQKKyNkZWZpbmUJUkNDSzBfREVCVUdQT1JUCQkJCTB4YTI4CisjZGVmaW5lCVJDQ0swX0ZBTFNFQUxBUk1SRVBPUlQJCQkweGEyYworI2RlZmluZQlSQ0NLMF9UUlNTSVJFUE9SVAkJCTB4YTUwCisjZGVmaW5lCVJDQ0swX1JYUkVQT1JUCQkJCTB4YTU0CisjZGVmaW5lCVJDQ0swX0ZBQ09VTlRFUkxPV0VSCQkJMHhhNWMKKyNkZWZpbmUJUkNDSzBfRkFDT1VOVEVSVVBQRVIJCQkweGE1OAorCisvKiA2LiBQYWdlQygweEMwMCkgKi8KKyNkZWZpbmUJUk9GRE0wX0xTVEYJCQkJMHhjMDAKKworI2RlZmluZQlST0ZETTBfVFJYUEFUSEVOQUJMRQkJCTB4YzA0CisjZGVmaW5lCVJPRkRNMF9UUk1VWFBBUgkJCQkweGMwOAorI2RlZmluZQlST0ZETTBfVFJTV0lTT0xBVElPTgkJCTB4YzBjCisKKyNkZWZpbmUJUk9GRE0wX1hBUlhBRkUJCQkJMHhjMTAKKyNkZWZpbmUJUk9GRE0wX1hBUlhJUUlNQkFMQU5DRQkJCTB4YzE0CisjZGVmaW5lCVJPRkRNMF9YQlJYQUZFCQkJCTB4YzE4CisjZGVmaW5lCVJPRkRNMF9YQlJYSVFJTUJBTEFOQ0UJCQkweGMxYworI2RlZmluZQlST0ZETTBfWENSWEFGRQkJCQkweGMyMAorI2RlZmluZQlST0ZETTBfWENSWElRSU1CQUxBTkNFCQkJMHhjMjQKKyNkZWZpbmUJUk9GRE0wX1hEUlhBRkUJCQkJMHhjMjgKKyNkZWZpbmUJUk9GRE0wX1hEUlhJUUlNQkFMQU5DRQkJCTB4YzJjCisKKyNkZWZpbmUJUk9GRE0wX1JYREVURUNUT1IxCQkJMHhjMzAKKyNkZWZpbmUJUk9GRE0wX1JYREVURUNUT1IyCQkJMHhjMzQKKyNkZWZpbmUJUk9GRE0wX1JYREVURUNUT1IzCQkJMHhjMzgKKyNkZWZpbmUJUk9GRE0wX1JYREVURUNUT1I0CQkJMHhjM2MKKworI2RlZmluZQlST0ZETTBfUlhEU1AJCQkJMHhjNDAKKyNkZWZpbmUJUk9GRE0wX0NGT0FORERBR0MJCQkweGM0NAorI2RlZmluZQlST0ZETTBfQ0NBRFJPUFRIUkVTSE9MRAkJCTB4YzQ4CisjZGVmaW5lCVJPRkRNMF9FQ0NBVEhSRVNIT0xECQkJMHhjNGMKKworI2RlZmluZQlST0ZETTBfWEFBR0NDT1JFMQkJCTB4YzUwCisjZGVmaW5lCVJPRkRNMF9YQUFHQ0NPUkUyCQkJMHhjNTQKKyNkZWZpbmUJUk9GRE0wX1hCQUdDQ09SRTEJCQkweGM1OAorI2RlZmluZQlST0ZETTBfWEJBR0NDT1JFMgkJCTB4YzVjCisjZGVmaW5lCVJPRkRNMF9YQ0FHQ0NPUkUxCQkJMHhjNjAKKyNkZWZpbmUJUk9GRE0wX1hDQUdDQ09SRTIJCQkweGM2NAorI2RlZmluZQlST0ZETTBfWERBR0NDT1JFMQkJCTB4YzY4CisjZGVmaW5lCVJPRkRNMF9YREFHQ0NPUkUyCQkJMHhjNmMKKworI2RlZmluZQlST0ZETTBfQUdDUEFSQU1FVEVSMQkJCTB4YzcwCisjZGVmaW5lCVJPRkRNMF9BR0NQQVJBTUVURVIyCQkJMHhjNzQKKyNkZWZpbmUJUk9GRE0wX0FHQ1JTU0lUQUJMRQkJCTB4Yzc4CisjZGVmaW5lCVJPRkRNMF9IVFNURkFHQwkJCQkweGM3YworCisjZGVmaW5lCVJPRkRNMF9YQVR4SVFJTUJBTEFOQ0UJCQkweGM4MAorI2RlZmluZQlST0ZETTBfWEFUeEFGRQkJCQkweGM4NAorI2RlZmluZQlST0ZETTBfWEJUeElRSU1CQUxBTkNFCQkJMHhjODgKKyNkZWZpbmUJUk9GRE0wX1hCVHhBRkUJCQkJMHhjOGMKKyNkZWZpbmUJUk9GRE0wX1hDVHhJUUlNQkFMQU5DRQkJCTB4YzkwCisjZGVmaW5lCVJPRkRNMF9YQ1R4QUZFCQkJCTB4Yzk0CisjZGVmaW5lCVJPRkRNMF9YRFR4SVFJTUJBTEFOQ0UJCQkweGM5OAorI2RlZmluZQlST0ZETTBfWERUeEFGRQkJCQkweGM5YworCisjZGVmaW5lCVJPRkRNMF9SWEhQUEFSQU1FVEVSCQkJMHhjZTAKKyNkZWZpbmUJUk9GRE0wX1RYUFNFVURPTk9JU0VXR1QJCQkweGNlNAorI2RlZmluZQlST0ZETTBfRlJBTUVTWU5DCQkJMHhjZjAKKyNkZWZpbmUJUk9GRE0wX0RGU1JFUE9SVAkJCTB4Y2Y0CisjZGVmaW5lCVJPRkRNMF9UWENPRUZGMQkJCQkweGNhNAorI2RlZmluZQlST0ZETTBfVFhDT0VGRjIJCQkJMHhjYTgKKyNkZWZpbmUJUk9GRE0wX1RYQ09FRkYzCQkJCTB4Y2FjCisjZGVmaW5lCVJPRkRNMF9UWENPRUZGNAkJCQkweGNiMAorI2RlZmluZQlST0ZETTBfVFhDT0VGRjUJCQkJMHhjYjQKKyNkZWZpbmUJUk9GRE0wX1RYQ09FRkY2CQkJCTB4Y2I4CisKKy8qIDcuIFBhZ2VEKDB4RDAwKSAqLworI2RlZmluZQlST0ZETTFfTFNURgkJCQkweGQwMAorI2RlZmluZQlST0ZETTFfVFJYUEFUSEVOQUJMRQkJCTB4ZDA0CisKKyNkZWZpbmUJUk9GRE0xX0NGTwkJCQkweGQwOAorI2RlZmluZQlST0ZETTFfQ1NJMQkJCQkweGQxMAorI2RlZmluZQlST0ZETTFfU0JECQkJCTB4ZDE0CisjZGVmaW5lCVJPRkRNMV9DU0kyCQkJCTB4ZDE4CisjZGVmaW5lCVJPRkRNMV9DRk9UUkFDS0lORwkJCTB4ZDJjCisjZGVmaW5lCVJPRkRNMV9UUlhNRVNBVVJFMQkJCTB4ZDM0CisjZGVmaW5lCVJPRkRNMV9JTlRGREVUCQkJCTB4ZDNjCisjZGVmaW5lCVJPRkRNMV9QU0VVRE9OT0lTRVNUQVRFQUIJCTB4ZDUwCisjZGVmaW5lCVJPRkRNMV9QU0VVRE9OT0lTRVNUQVRFQ0QJCTB4ZDU0CisjZGVmaW5lCVJPRkRNMV9SWFBTRVVET05PSVNFV0dUCQkJMHhkNTgKKworI2RlZmluZQlST0ZETV9QSFlDT1VOVEVSMQkJCTB4ZGEwCisjZGVmaW5lCVJPRkRNX1BIWUNPVU5URVIyCQkJMHhkYTQKKyNkZWZpbmUJUk9GRE1fUEhZQ09VTlRFUjMJCQkweGRhOAorCisjZGVmaW5lCVJPRkRNX1NIT1JUQ0ZPQUIJCQkweGRhYworI2RlZmluZQlST0ZETV9TSE9SVENGT0NECQkJMHhkYjAKKyNkZWZpbmUJUk9GRE1fTE9OR0NGT0FCCQkJCTB4ZGI0CisjZGVmaW5lCVJPRkRNX0xPTkdDRk9DRAkJCQkweGRiOAorI2RlZmluZQlST0ZETV9UQUlMQ0ZPQUIJCQkJMHhkYmMKKyNkZWZpbmUJUk9GRE1fVEFJTENGT0NECQkJCTB4ZGMwCisjZGVmaW5lCVJPRkRNX1BXTUVBU1VSRTEJCQkweGRjNAorI2RlZmluZQlST0ZETV9QV01FQVNVUkUyCQkJMHhkYzgKKyNkZWZpbmUJUk9GRE1fQldSRVBPUlQJCQkJMHhkY2MKKyNkZWZpbmUJUk9GRE1fQUdDUkVQT1JUCQkJCTB4ZGQwCisjZGVmaW5lCVJPRkRNX1JYU05SCQkJCTB4ZGQ0CisjZGVmaW5lCVJPRkRNX1JYRVZNQ1NJCQkJCTB4ZGQ4CisjZGVmaW5lCVJPRkRNX1NJR1JlcG9ydAkJCQkweGRkYworCisvKiA4LiBQYWdlRSgweEUwMCkgKi8KKyNkZWZpbmUJUlRYQUdDX0FfUkFURTE4XzA2CQkJMHhlMDAKKyNkZWZpbmUJUlRYQUdDX0FfUkFURTU0XzI0CQkJMHhlMDQKKyNkZWZpbmUJUlRYQUdDX0FfQ0NLMV9NQ1MzMgkJCTB4ZTA4CisjZGVmaW5lCVJUWEFHQ19BX01DUzAzX01DUzAwCQkJMHhlMTAKKyNkZWZpbmUJUlRYQUdDX0FfTUNTMDdfTUNTMDQJCQkweGUxNAorI2RlZmluZQlSVFhBR0NfQV9NQ1MxMV9NQ1MwOAkJCTB4ZTE4CisjZGVmaW5lCVJUWEFHQ19BX01DUzE1X01DUzEyCQkJMHhlMWMKKworI2RlZmluZQlSVFhBR0NfQl9SQVRFMThfMDYJCQkweDgzMAorI2RlZmluZQlSVFhBR0NfQl9SQVRFNTRfMjQJCQkweDgzNAorI2RlZmluZQlSVFhBR0NfQl9DQ0sxXzU1X01DUzMyCQkJMHg4MzgKKyNkZWZpbmUJUlRYQUdDX0JfTUNTMDNfTUNTMDAJCQkweDgzYworI2RlZmluZQlSVFhBR0NfQl9NQ1MwN19NQ1MwNAkJCTB4ODQ4CisjZGVmaW5lCVJUWEFHQ19CX01DUzExX01DUzA4CQkJMHg4NGMKKyNkZWZpbmUJUlRYQUdDX0JfTUNTMTVfTUNTMTIJCQkweDg2OAorI2RlZmluZQlSVFhBR0NfQl9DQ0sxMV9BX0NDSzJfMTEJCTB4ODZjCisKKy8qIFJMNjA1MiBSZWdpc3RlciBkZWZpbml0aW9uICovCisjZGVmaW5lCVJGX0FDCQkJCQkweDAwCisKKyNkZWZpbmUJUkZfSVFBREpfRzEJCQkJMHgwMQorI2RlZmluZQlSRl9JUUFESl9HMgkJCQkweDAyCisjZGVmaW5lCVJGX1BPV19UUlNXCQkJCTB4MDUKKworI2RlZmluZQlSRl9HQUlOX1JYCQkJCTB4MDYKKyNkZWZpbmUJUkZfR0FJTl9UWAkJCQkweDA3CisKKyNkZWZpbmUJUkZfVFhNX0lEQUMJCQkJMHgwOAorI2RlZmluZQlSRl9CU19JUUdFTgkJCQkweDBGCisKKyNkZWZpbmUJUkZfTU9ERTEJCQkJMHgxMAorI2RlZmluZQlSRl9NT0RFMgkJCQkweDExCisKKyNkZWZpbmUJUkZfUlhfQUdDX0hQCQkJCTB4MTIKKyNkZWZpbmUJUkZfVFhfQUdDCQkJCTB4MTMKKyNkZWZpbmUJUkZfQklBUwkJCQkJMHgxNAorI2RlZmluZQlSRl9JUEEJCQkJCTB4MTUKKyNkZWZpbmUJUkZfUE9XX0FCSUxJVFkJCQkJMHgxNworI2RlZmluZQlSRl9NT0RFX0FHCQkJCTB4MTgKKyNkZWZpbmUJclJmQ2hhbm5lbAkJCQkweDE4CisjZGVmaW5lCVJGX0NITkxCVwkJCQkweDE4CisjZGVmaW5lCVJGX1RPUAkJCQkJMHgxOQorCisjZGVmaW5lCVJGX1JYX0cxCQkJCTB4MUEKKyNkZWZpbmUJUkZfUlhfRzIJCQkJMHgxQgorCisjZGVmaW5lCVJGX1JYX0JCMgkJCQkweDFDCisjZGVmaW5lCVJGX1JYX0JCMQkJCQkweDFECisKKyNkZWZpbmUJUkZfUkNLMQkJCQkJMHgxRQorI2RlZmluZQlSRl9SQ0syCQkJCQkweDFGCisKKyNkZWZpbmUJUkZfVFhfRzEJCQkJMHgyMAorI2RlZmluZQlSRl9UWF9HMgkJCQkweDIxCisjZGVmaW5lCVJGX1RYX0czCQkJCTB4MjIKKworI2RlZmluZQlSRl9UWF9CQjEJCQkJMHgyMworCisjZGVmaW5lCVJGX1RfTUVURVIJCQkJMHg0MgorCisjZGVmaW5lCVJGX1NZTl9HMQkJCQkweDI1CisjZGVmaW5lCVJGX1NZTl9HMgkJCQkweDI2CisjZGVmaW5lCVJGX1NZTl9HMwkJCQkweDI3CisjZGVmaW5lCVJGX1NZTl9HNAkJCQkweDI4CisjZGVmaW5lCVJGX1NZTl9HNQkJCQkweDI5CisjZGVmaW5lCVJGX1NZTl9HNgkJCQkweDJBCisjZGVmaW5lCVJGX1NZTl9HNwkJCQkweDJCCisjZGVmaW5lCVJGX1NZTl9HOAkJCQkweDJDCisKKyNkZWZpbmUJUkZfUkNLX09TCQkJCTB4MzAKKworI2RlZmluZQlSRl9UWFBBX0cxCQkJCTB4MzEKKyNkZWZpbmUJUkZfVFhQQV9HMgkJCQkweDMyCisjZGVmaW5lCVJGX1RYUEFfRzMJCQkJMHgzMworCisvKiBCaXQgTWFzayAqLworCisvKiAyLiBQYWdlOCgweDgwMCkgKi8KKyNkZWZpbmUJQlJGTU9ECQkJCQkweDEKKyNkZWZpbmUJQkNDS1RYU0MJCQkJMHgzMAorI2RlZmluZQlCQ0NLRU4JCQkJCTB4MTAwMDAwMAorI2RlZmluZQlCT0ZETUVOCQkJCQkweDIwMDAwMDAKKworI2RlZmluZQlCM1dJUkVEQVRBTEVOR1RICQkJMHg4MDAKKyNkZWZpbmUJQjNXSVJFQUREUkVTU0xFTkdUSAkJCTB4NDAwCisKKyNkZWZpbmUJQlJGU0lfUkZFTlYJCQkJMHgxMAorCisjZGVmaW5lCUJMU1NJUkVBREFERFJFU1MJCQkweDdmODAwMDAwCisjZGVmaW5lCUJMU1NJUkVBREVER0UJCQkJMHg4MDAwMDAwMAorI2RlZmluZQlCTFNTSVJFQURCQUNLREFUQQkJCTB4ZmZmZmYKKy8qIDQuIFBhZ2VBKDB4QTAwKSAqLworI2RlZmluZSBCQ0NLU0lERUJBTkQJCQkJMHgxMAorCisvKiBPdGhlciBEZWZpbml0aW9uICovCisjZGVmaW5lCUJCWVRFMAkJCQkJMHgxCisjZGVmaW5lCUJCWVRFMQkJCQkJMHgyCisjZGVmaW5lCUJCWVRFMgkJCQkJMHg0CisjZGVmaW5lCUJCWVRFMwkJCQkJMHg4CisjZGVmaW5lCUJXT1JEMAkJCQkJMHgzCisjZGVmaW5lCUJXT1JEMQkJCQkJMHhjCisjZGVmaW5lCUJEV09SRAkJCQkJMHhmCisKKyNkZWZpbmUJQk1BU0tCWVRFMAkJCQkweGZmCisjZGVmaW5lCUJNQVNLQllURTEJCQkJMHhmZjAwCisjZGVmaW5lCUJNQVNLQllURTIJCQkJMHhmZjAwMDAKKyNkZWZpbmUJQk1BU0tCWVRFMwkJCQkweGZmMDAwMDAwCisjZGVmaW5lCUJNQVNLSFdPUkQJCQkJMHhmZmZmMDAwMAorI2RlZmluZQlCTUFTS0xXT1JECQkJCTB4MDAwMGZmZmYKKyNkZWZpbmUJQk1BU0tEV09SRAkJCQkweGZmZmZmZmZmCisjZGVmaW5lCUJNQVNLMTJCSVRTCQkJCTB4ZmZmCisjZGVmaW5lCUJNQVNLSDRCSVRTCQkJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgQk1BU0tPRkRNX0QJCQkJMHhmZmMwMDAwMAorI2RlZmluZQlCTUFTS0NDSwkJCQkweDNmM2YzZjNmCisKKyNkZWZpbmUgQlJGUkVHT0ZGU0VUTUFTSwkJCTB4ZmZmZmYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9yZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjI3Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvcmYuYwpAQCAtMCwwICsxLDYyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi93aWZpLmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiZGVmLmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAicmYuaCIKKyNpbmNsdWRlICJkbS5oIgorI2luY2x1ZGUgImh3LmgiCisKK3ZvaWQgcnRsOTJkX3BoeV9yZjYwNTJfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggYmFuZHdpZHRoKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXU4IHJmcGF0aDsKKworCXN3aXRjaCAoYmFuZHdpZHRoKSB7CisJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgorCQlmb3IgKHJmcGF0aCA9IDA7IHJmcGF0aCA8IHJ0bHBoeS0+bnVtX3RvdGFsX3JmcGF0aDsgcmZwYXRoKyspIHsKKwkJCXJ0bHBoeS0+cmZyZWdfY2hubHZhbFtyZnBhdGhdID0gKChydGxwaHktPnJmcmVnX2Nobmx2YWwKKwkJCQkJW3JmcGF0aF0gJiAweGZmZmZmM2ZmKSB8IDB4MDQwMCk7CisJCQlydGxfc2V0X3JmcmVnKGh3LCByZnBhdGgsIFJGX0NITkxCVywgQklUKDEwKSB8CisJCQkJICAgICAgQklUKDExKSwgMHgwMSk7CisKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19MT1VELAorCQkJCSAoIjIwTSBSRiAweDE4ID0gMHgleFxuIiwKKwkJCQkgcnRscGh5LT5yZnJlZ19jaG5sdmFsW3JmcGF0aF0pKTsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKKwkJZm9yIChyZnBhdGggPSAwOyByZnBhdGggPCBydGxwaHktPm51bV90b3RhbF9yZnBhdGg7IHJmcGF0aCsrKSB7CisJCQlydGxwaHktPnJmcmVnX2Nobmx2YWxbcmZwYXRoXSA9CisJCQkgICAgKChydGxwaHktPnJmcmVnX2Nobmx2YWxbcmZwYXRoXSAmIDB4ZmZmZmYzZmYpKTsKKwkJCXJ0bF9zZXRfcmZyZWcoaHcsIHJmcGF0aCwgUkZfQ0hOTEJXLCBCSVQoMTApIHwgQklUKDExKSwKKwkJCQkgICAgICAweDAwKTsKKwkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19MT1VELAorCQkJCSAoIjQwTSBSRiAweDE4ID0gMHgleFxuIiwKKwkJCQkgcnRscGh5LT5yZnJlZ19jaG5sdmFsW3JmcGF0aF0pKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgidW5rbm93biBiYW5kd2lkdGg6ICUjWFxuIiwgYmFuZHdpZHRoKSk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBydGw5MmRfcGh5X3JmNjA1Ml9zZXRfY2NrX3R4cG93ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgIHU4ICpwcG93ZXJsZXZlbCkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX21hYyAqbWFjID0gcnRsX21hYyhydGxfcHJpdihodykpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJdTMyIHR4X2FnY1syXSA9IHswLCAwfSwgdG1wdmFsOworCWJvb2wgdHVyYm9fc2Nhbm9mZiA9IGZhbHNlOworCXU4IGlkeDEsIGlkeDI7CisJdTggKnB0cjsKKworCWlmIChydGxlZnVzZS0+ZWVwcm9tX3JlZ3VsYXRvcnkgIT0gMCkKKwkJdHVyYm9fc2Nhbm9mZiA9IHRydWU7CisJaWYgKG1hYy0+YWN0X3NjYW5uaW5nKSB7CisJCXR4X2FnY1tSRjkwX1BBVEhfQV0gPSAweDNmM2YzZjNmOworCQl0eF9hZ2NbUkY5MF9QQVRIX0JdID0gMHgzZjNmM2YzZjsKKwkJaWYgKHR1cmJvX3NjYW5vZmYpIHsKKwkJCWZvciAoaWR4MSA9IFJGOTBfUEFUSF9BOyBpZHgxIDw9IFJGOTBfUEFUSF9COyBpZHgxKyspIHsKKwkJCQl0eF9hZ2NbaWR4MV0gPSBwcG93ZXJsZXZlbFtpZHgxXSB8CisJCQkJICAgIChwcG93ZXJsZXZlbFtpZHgxXSA8PCA4KSB8CisJCQkJICAgIChwcG93ZXJsZXZlbFtpZHgxXSA8PCAxNikgfAorCQkJCSAgICAocHBvd2VybGV2ZWxbaWR4MV0gPDwgMjQpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpZHgxID0gUkY5MF9QQVRIX0E7IGlkeDEgPD0gUkY5MF9QQVRIX0I7IGlkeDErKykgeworCQkJdHhfYWdjW2lkeDFdID0gcHBvd2VybGV2ZWxbaWR4MV0gfAorCQkJICAgIChwcG93ZXJsZXZlbFtpZHgxXSA8PCA4KSB8CisJCQkgICAgKHBwb3dlcmxldmVsW2lkeDFdIDw8IDE2KSB8CisJCQkgICAgKHBwb3dlcmxldmVsW2lkeDFdIDw8IDI0KTsKKwkJfQorCQlpZiAocnRsZWZ1c2UtPmVlcHJvbV9yZWd1bGF0b3J5ID09IDApIHsKKwkJCXRtcHZhbCA9IChydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXRbMF1bNl0pICsKKwkJCSAgICAocnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0WzBdWzddIDw8IDgpOworCQkJdHhfYWdjW1JGOTBfUEFUSF9BXSArPSB0bXB2YWw7CisJCQl0bXB2YWwgPSAocnRscGh5LT5tY3NfdHhwd3JsZXZlbF9vcmlnb2Zmc2V0WzBdWzE0XSkgKworCQkJICAgIChydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXRbMF1bMTVdIDw8IDI0KTsKKwkJCXR4X2FnY1tSRjkwX1BBVEhfQl0gKz0gdG1wdmFsOworCQl9CisJfQorCisJZm9yIChpZHgxID0gUkY5MF9QQVRIX0E7IGlkeDEgPD0gUkY5MF9QQVRIX0I7IGlkeDErKykgeworCQlwdHIgPSAodTggKikgKCYodHhfYWdjW2lkeDFdKSk7CisJCWZvciAoaWR4MiA9IDA7IGlkeDIgPCA0OyBpZHgyKyspIHsKKwkJCWlmICgqcHRyID4gUkY2MDUyX01BWF9UWF9QV1IpCisJCQkJKnB0ciA9IFJGNjA1Ml9NQVhfVFhfUFdSOworCQkJcHRyKys7CisJCX0KKwl9CisKKwl0bXB2YWwgPSB0eF9hZ2NbUkY5MF9QQVRIX0FdICYgMHhmZjsKKwlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQV9DQ0sxX01DUzMyLCBCTUFTS0JZVEUxLCB0bXB2YWwpOworCVJUUFJJTlQocnRscHJpdiwgRlBIWSwgUEhZX1RYUFdSLAorCQkoIkNDSyBQV1IgMU0gKHJmLUEpID0gMHgleCAocmVnIDB4JXgpXG4iLCB0bXB2YWwsCisJCVJUWEFHQ19BX0NDSzFfTUNTMzIpKTsKKwl0bXB2YWwgPSB0eF9hZ2NbUkY5MF9QQVRIX0FdID4+IDg7CisJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfQ0NLMTFfQV9DQ0syXzExLCAweGZmZmZmZjAwLCB0bXB2YWwpOworCVJUUFJJTlQocnRscHJpdiwgRlBIWSwgUEhZX1RYUFdSLAorCQkoIkNDSyBQV1IgMn4xMU0gKHJmLUEpID0gMHgleCAocmVnIDB4JXgpXG4iLCB0bXB2YWwsCisJCVJUWEFHQ19CX0NDSzExX0FfQ0NLMl8xMSkpOworCXRtcHZhbCA9IHR4X2FnY1tSRjkwX1BBVEhfQl0gPj4gMjQ7CisJcnRsX3NldF9iYnJlZyhodywgUlRYQUdDX0JfQ0NLMTFfQV9DQ0syXzExLCBCTUFTS0JZVEUwLCB0bXB2YWwpOworCVJUUFJJTlQocnRscHJpdiwgRlBIWSwgUEhZX1RYUFdSLAorCQkoIkNDSyBQV1IgMTFNIChyZi1CKSA9IDB4JXggKHJlZyAweCV4KVxuIiwgdG1wdmFsLAorCQlSVFhBR0NfQl9DQ0sxMV9BX0NDSzJfMTEpKTsKKwl0bXB2YWwgPSB0eF9hZ2NbUkY5MF9QQVRIX0JdICYgMHgwMGZmZmZmZjsKKwlydGxfc2V0X2JicmVnKGh3LCBSVFhBR0NfQl9DQ0sxXzU1X01DUzMyLCAweGZmZmZmZjAwLCB0bXB2YWwpOworCVJUUFJJTlQocnRscHJpdiwgRlBIWSwgUEhZX1RYUFdSLAorCQkoIkNDSyBQV1IgMX41LjVNIChyZi1CKSA9IDB4JXggKHJlZyAweCV4KVxuIiwgdG1wdmFsLAorCQlSVFhBR0NfQl9DQ0sxXzU1X01DUzMyKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRfcGh5X2dldF9wb3dlcl9iYXNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgICB1OCAqcHBvd2VybGV2ZWwsIHU4IGNoYW5uZWwsCisJCQkJICAgICAgIHUzMiAqb2ZkbWJhc2UsIHUzMiAqbWNzYmFzZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOworCXUzMiBwb3dlcmJhc2UwLCBwb3dlcmJhc2UxOworCXU4IGxlZ2FjeV9wd3JkaWZmLCBodDIwX3B3cmRpZmY7CisJdTggaSwgcG93ZXJsZXZlbFsyXTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJcG93ZXJsZXZlbFtpXSA9IHBwb3dlcmxldmVsW2ldOworCQlsZWdhY3lfcHdyZGlmZiA9IHJ0bGVmdXNlLT50eHB3cl9sZWdhY3lodGRpZmZbaV1bY2hhbm5lbCAtIDFdOworCQlwb3dlcmJhc2UwID0gcG93ZXJsZXZlbFtpXSArIGxlZ2FjeV9wd3JkaWZmOworCQlwb3dlcmJhc2UwID0gKHBvd2VyYmFzZTAgPDwgMjQpIHwgKHBvd2VyYmFzZTAgPDwgMTYpIHwKKwkJICAgIChwb3dlcmJhc2UwIDw8IDgpIHwgcG93ZXJiYXNlMDsKKwkJKihvZmRtYmFzZSArIGkpID0gcG93ZXJiYXNlMDsKKwkJUlRQUklOVChydGxwcml2LCBGUEhZLCBQSFlfVFhQV1IsCisJCQkoIiBbT0ZETSBwb3dlciBiYXNlIGluZGV4IHJmKCVjKSA9IDB4JXhdXG4iLAorCQkJKChpID09IDApID8gJ0EnIDogJ0InKSwgKihvZmRtYmFzZSArIGkpKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkgeworCQkJaHQyMF9wd3JkaWZmID0gcnRsZWZ1c2UtPnR4cHdyX2h0MjBkaWZmW2ldW2NoYW5uZWwgLSAxXTsKKwkJCXBvd2VybGV2ZWxbaV0gKz0gaHQyMF9wd3JkaWZmOworCQl9CisJCXBvd2VyYmFzZTEgPSBwb3dlcmxldmVsW2ldOworCQlwb3dlcmJhc2UxID0gKHBvd2VyYmFzZTEgPDwgMjQpIHwgKHBvd2VyYmFzZTEgPDwgMTYpIHwKKwkJCSAgICAgKHBvd2VyYmFzZTEgPDwgOCkgfCBwb3dlcmJhc2UxOworCQkqKG1jc2Jhc2UgKyBpKSA9IHBvd2VyYmFzZTE7CisJCVJUUFJJTlQocnRscHJpdiwgRlBIWSwgUEhZX1RYUFdSLAorCQkJKCIgW01DUyBwb3dlciBiYXNlIGluZGV4IHJmKCVjKSA9IDB4JXhdXG4iLAorCQkJKChpID09IDApID8gJ0EnIDogJ0InKSwgKihtY3NiYXNlICsgaSkpKTsKKwl9Cit9CisKK3N0YXRpYyB1OCBfcnRsOTJkX3BoeV9nZXRfY2hubGdyb3VwX2J5cGcodTggY2hubGluZGV4KQoreworCXU4IGdyb3VwOworCXU4IGNoYW5uZWxfaW5mb1s1OV0gPSB7CisJCTEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKwkJMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUwLCA1MiwgNTQsIDU2LCA1OCwKKwkJNjAsIDYyLCA2NCwgMTAwLCAxMDIsIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLAorCQkxMTQsIDExNiwgMTE4LCAxMjAsIDEyMiwgMTI0LCAxMjYsIDEyOCwJMTMwLCAxMzIsCisJCTEzNCwgMTM2LCAxMzgsIDE0MCwgMTQ5LCAxNTEsIDE1MywgMTU1LCAxNTcsIDE1OSwKKwkJMTYxLCAxNjMsIDE2NQorCX07CisKKwlpZiAoY2hhbm5lbF9pbmZvW2NobmxpbmRleF0gPD0gMykJLyogQ2hhbmVsIDEtMyAqLworCQlncm91cCA9IDA7CisJZWxzZSBpZiAoY2hhbm5lbF9pbmZvW2NobmxpbmRleF0gPD0gOSkJLyogQ2hhbm5lbCA0LTkgKi8KKwkJZ3JvdXAgPSAxOworCWVsc2UgaWYgKGNoYW5uZWxfaW5mb1tjaG5saW5kZXhdIDw9IDE0KQkvKiBDaGFubmVsIDEwLTE0ICovCisJCWdyb3VwID0gMjsKKwllbHNlIGlmIChjaGFubmVsX2luZm9bY2hubGluZGV4XSA8PSA2NCkKKwkJZ3JvdXAgPSA2OworCWVsc2UgaWYgKGNoYW5uZWxfaW5mb1tjaG5saW5kZXhdIDw9IDE0MCkKKwkJZ3JvdXAgPSA3OworCWVsc2UKKwkJZ3JvdXAgPSA4OworCXJldHVybiBncm91cDsKK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF9nZXRfdHhwb3dlcl93cml0ZXZhbF9ieV9yZWd1bGF0b3J5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkJICAgICAgIHU4IGNoYW5uZWwsIHU4IGluZGV4LAorCQkJCQkJICAgICAgIHUzMiAqcG93ZXJiYXNlMCwKKwkJCQkJCSAgICAgICB1MzIgKnBvd2VyYmFzZTEsCisJCQkJCQkgICAgICAgdTMyICpwX291dHdyaXRldmFsKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCXN0cnVjdCBydGxfZWZ1c2UgKnJ0bGVmdXNlID0gcnRsX2VmdXNlKHJ0bF9wcml2KGh3KSk7CisJdTggaSwgY2hubGdyb3VwID0gMCwgcHdyX2RpZmZfbGltaXRbNF07CisJdTMyIHdyaXRldmFsID0gMCwgY3VzdG9tZXJfbGltaXQsIHJmOworCisJZm9yIChyZiA9IDA7IHJmIDwgMjsgcmYrKykgeworCQlzd2l0Y2ggKHJ0bGVmdXNlLT5lZXByb21fcmVndWxhdG9yeSkgeworCQljYXNlIDA6CisJCQljaG5sZ3JvdXAgPSAwOworCQkJd3JpdGV2YWwgPSBydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXQKKwkJCQkJW2Nobmxncm91cF1baW5kZXggKworCQkJCQkocmYgPyA4IDogMCldICsgKChpbmRleCA8IDIpID8KKwkJCQkJcG93ZXJiYXNlMFtyZl0gOgorCQkJCQlwb3dlcmJhc2UxW3JmXSk7CisJCQlSVFBSSU5UKHJ0bHByaXYsIEZQSFksIFBIWV9UWFBXUiwgKCJSVEsgYmV0dGVyICIKKwkJCQkicGVyZm9ybWFuY2UsIHdyaXRldmFsKCVjKSA9IDB4JXhcbiIsCisJCQkJKChyZiA9PSAwKSA/ICdBJyA6ICdCJyksIHdyaXRldmFsKSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKHJ0bHBoeS0+cHdyZ3JvdXBfY250ID09IDEpCisJCQkJY2hubGdyb3VwID0gMDsKKwkJCWlmIChydGxwaHktPnB3cmdyb3VwX2NudCA+PSBNQVhfUEdfR1JPVVApIHsKKwkJCQljaG5sZ3JvdXAgPSBfcnRsOTJkX3BoeV9nZXRfY2hubGdyb3VwX2J5cGcoCisJCQkJCQkJCWNoYW5uZWwgLSAxKTsKKwkJCQlpZiAocnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0KKwkJCQkgICAgSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJCQkJY2hubGdyb3VwKys7CisJCQkJZWxzZQorCQkJCQljaG5sZ3JvdXAgKz0gNDsKKwkJCQl3cml0ZXZhbCA9IHJ0bHBoeS0+bWNzX3R4cHdybGV2ZWxfb3JpZ29mZnNldAorCQkJCQkJW2Nobmxncm91cF1baW5kZXggKworCQkJCQkJKHJmID8gOCA6IDApXSArICgoaW5kZXggPCAyKSA/CisJCQkJCQlwb3dlcmJhc2UwW3JmXSA6CisJCQkJCQlwb3dlcmJhc2UxW3JmXSk7CisJCQkJUlRQUklOVChydGxwcml2LCBGUEhZLCBQSFlfVFhQV1IsCisJCQkJCSgiUmVhbHRlayByZWd1bGF0b3J5LCAiCisJCQkJCSIyME1Ieiwgd3JpdGV2YWwoJWMpID0gMHgleFxuIiwKKwkJCQkJKChyZiA9PSAwKSA/ICdBJyA6ICdCJyksCisJCQkJCXdyaXRldmFsKSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJd3JpdGV2YWwgPSAoKGluZGV4IDwgMikgPyBwb3dlcmJhc2UwW3JmXSA6CisJCQkJICAgcG93ZXJiYXNlMVtyZl0pOworCQkJUlRQUklOVChydGxwcml2LCBGUEhZLCBQSFlfVFhQV1IsICgiQmV0dGVyIHJlZ3VsYXRvcnksICIKKwkJCQkid3JpdGV2YWwoJWMpID0gMHgleFxuIiwKKwkJCQkoKHJmID09IDApID8gJ0EnIDogJ0InKSwgd3JpdGV2YWwpKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQljaG5sZ3JvdXAgPSAwOworCQkJaWYgKHJ0bHBoeS0+Y3VycmVudF9jaGFuX2J3ID09IEhUX0NIQU5ORUxfV0lEVEhfMjBfNDApIHsKKwkJCQlSVFBSSU5UKHJ0bHByaXYsIEZQSFksIFBIWV9UWFBXUiwKKwkJCQkJKCJjdXN0b21lcidzIGxpbWl0LCA0ME1IeiByZiglYykgPSAiCisJCQkJCSIweCV4XG4iLCAoKHJmID09IDApID8gJ0EnIDogJ0InKSwKKwkJCQkJcnRsZWZ1c2UtPnB3cmdyb3VwX2h0NDBbcmZdCisJCQkJCVtjaGFubmVsIC0gMV0pKTsKKwkJCX0gZWxzZSB7CisJCQkJUlRQUklOVChydGxwcml2LCBGUEhZLCBQSFlfVFhQV1IsCisJCQkJCSgiY3VzdG9tZXIncyBsaW1pdCwgMjBNSHogcmYoJWMpID0gIgorCQkJCQkiMHgleFxuIiwgKChyZiA9PSAwKSA/ICdBJyA6ICdCJyksCisJCQkJCXJ0bGVmdXNlLT5wd3Jncm91cF9odDIwW3JmXQorCQkJCQlbY2hhbm5lbCAtIDFdKSk7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJcHdyX2RpZmZfbGltaXRbaV0gPQorCQkJCQkodTgpKChydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXQKKwkJCQkJW2Nobmxncm91cF1baW5kZXggKyAocmYgPyA4IDogMCldICYKKwkJCQkJKDB4N2YgPDwgKGkgKiA4KSkpID4+IChpICogOCkpOworCQkJCWlmIChydGxwaHktPmN1cnJlbnRfY2hhbl9idyA9PQorCQkJCSAgICBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwKSB7CisJCQkJCWlmIChwd3JfZGlmZl9saW1pdFtpXSA+CisJCQkJCSAgICBydGxlZnVzZS0+cHdyZ3JvdXBfaHQ0MFtyZl0KKwkJCQkJICAgW2NoYW5uZWwgLSAxXSkKKwkJCQkJCXB3cl9kaWZmX2xpbWl0W2ldID0KKwkJCQkJCQlydGxlZnVzZS0+cHdyZ3JvdXBfaHQ0MAorCQkJCQkJCVtyZl1bY2hhbm5lbCAtIDFdOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChwd3JfZGlmZl9saW1pdFtpXSA+CisJCQkJCSAgICBydGxlZnVzZS0+cHdyZ3JvdXBfaHQyMFtyZl1bCisJCQkJCQljaGFubmVsIC0gMV0pCisJCQkJCQlwd3JfZGlmZl9saW1pdFtpXSA9CisJCQkJCQkgICBydGxlZnVzZS0+cHdyZ3JvdXBfaHQyMFtyZl0KKwkJCQkJCSAgIFtjaGFubmVsIC0gMV07CisJCQkJfQorCQkJfQorCQkJY3VzdG9tZXJfbGltaXQgPSAocHdyX2RpZmZfbGltaXRbM10gPDwgMjQpIHwKKwkJCQkJIChwd3JfZGlmZl9saW1pdFsyXSA8PCAxNikgfAorCQkJCQkgKHB3cl9kaWZmX2xpbWl0WzFdIDw8IDgpIHwKKwkJCQkJIChwd3JfZGlmZl9saW1pdFswXSk7CisJCQlSVFBSSU5UKHJ0bHByaXYsIEZQSFksIFBIWV9UWFBXUiwKKwkJCQkoIkN1c3RvbWVyJ3MgbGltaXQgcmYoJWMpID0gMHgleFxuIiwKKwkJCQkoKHJmID09IDApID8gJ0EnIDogJ0InKSwgY3VzdG9tZXJfbGltaXQpKTsKKwkJCXdyaXRldmFsID0gY3VzdG9tZXJfbGltaXQgKyAoKGluZGV4IDwgMikgPworCQkJCSAgIHBvd2VyYmFzZTBbcmZdIDogcG93ZXJiYXNlMVtyZl0pOworCQkJUlRQUklOVChydGxwcml2LCBGUEhZLCBQSFlfVFhQV1IsCisJCQkJKCJDdXN0b21lciwgd3JpdGV2YWwgcmYoJWMpPSAweCV4XG4iLAorCQkJCSgocmYgPT0gMCkgPyAnQScgOiAnQicpLCB3cml0ZXZhbCkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljaG5sZ3JvdXAgPSAwOworCQkJd3JpdGV2YWwgPSBydGxwaHktPm1jc190eHB3cmxldmVsX29yaWdvZmZzZXQKKwkJCQkgICBbY2hubGdyb3VwXVtpbmRleCArCisJCQkJICAgKHJmID8gOCA6IDApXSArICgoaW5kZXggPCAyKSA/CisJCQkJICAgcG93ZXJiYXNlMFtyZl0gOiBwb3dlcmJhc2UxW3JmXSk7CisJCQlSVFBSSU5UKHJ0bHByaXYsIEZQSFksIFBIWV9UWFBXUiwKKwkJCQkoIlJUSyBiZXR0ZXIgcGVyZm9ybWFuY2UsIHdyaXRldmFsICIKKwkJCQkicmYoJWMpID0gMHgleFxuIiwKKwkJCQkoKHJmID09IDApID8gJ0EnIDogJ0InKSwgd3JpdGV2YWwpKTsKKwkJCWJyZWFrOworCQl9CisJCSoocF9vdXR3cml0ZXZhbCArIHJmKSA9IHdyaXRldmFsOworCX0KK30KKworc3RhdGljIHZvaWQgX3J0bDkyZF93cml0ZV9vZmRtX3Bvd2VyX3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJIHU4IGluZGV4LCB1MzIgKnB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJc3RydWN0IHJ0bF9waHkgKnJ0bHBoeSA9ICYocnRscHJpdi0+cGh5KTsKKwlzdGF0aWMgdTE2IHJlZ29mZnNldF9hWzZdID0geworCQlSVFhBR0NfQV9SQVRFMThfMDYsIFJUWEFHQ19BX1JBVEU1NF8yNCwKKwkJUlRYQUdDX0FfTUNTMDNfTUNTMDAsIFJUWEFHQ19BX01DUzA3X01DUzA0LAorCQlSVFhBR0NfQV9NQ1MxMV9NQ1MwOCwgUlRYQUdDX0FfTUNTMTVfTUNTMTIKKwl9OworCXN0YXRpYyB1MTYgcmVnb2Zmc2V0X2JbNl0gPSB7CisJCVJUWEFHQ19CX1JBVEUxOF8wNiwgUlRYQUdDX0JfUkFURTU0XzI0LAorCQlSVFhBR0NfQl9NQ1MwM19NQ1MwMCwgUlRYQUdDX0JfTUNTMDdfTUNTMDQsCisJCVJUWEFHQ19CX01DUzExX01DUzA4LCBSVFhBR0NfQl9NQ1MxNV9NQ1MxMgorCX07CisJdTggaSwgcmYsIHB3cl92YWxbNF07CisJdTMyIHdyaXRldmFsOworCXUxNiByZWdvZmZzZXQ7CisKKwlmb3IgKHJmID0gMDsgcmYgPCAyOyByZisrKSB7CisJCXdyaXRldmFsID0gcHZhbHVlW3JmXTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJcHdyX3ZhbFtpXSA9ICh1OCkgKCh3cml0ZXZhbCAmICgweDdmIDw8CisJCQkJICAgICAoaSAqIDgpKSkgPj4gKGkgKiA4KSk7CisJCQlpZiAocHdyX3ZhbFtpXSA+IFJGNjA1Ml9NQVhfVFhfUFdSKQorCQkJCXB3cl92YWxbaV0gPSBSRjYwNTJfTUFYX1RYX1BXUjsKKwkJfQorCQl3cml0ZXZhbCA9IChwd3JfdmFsWzNdIDw8IDI0KSB8IChwd3JfdmFsWzJdIDw8IDE2KSB8CisJCQkgICAocHdyX3ZhbFsxXSA8PCA4KSB8IHB3cl92YWxbMF07CisJCWlmIChyZiA9PSAwKQorCQkJcmVnb2Zmc2V0ID0gcmVnb2Zmc2V0X2FbaW5kZXhdOworCQllbHNlCisJCQlyZWdvZmZzZXQgPSByZWdvZmZzZXRfYltpbmRleF07CisJCXJ0bF9zZXRfYmJyZWcoaHcsIHJlZ29mZnNldCwgQk1BU0tEV09SRCwgd3JpdGV2YWwpOworCQlSVFBSSU5UKHJ0bHByaXYsIEZQSFksIFBIWV9UWFBXUiwKKwkJCSgiU2V0IDB4JXggPSAlMDh4XG4iLCByZWdvZmZzZXQsIHdyaXRldmFsKSk7CisJCWlmICgoKGdldF9yZl90eXBlKHJ0bHBoeSkgPT0gUkZfMlQyUikgJiYKKwkJICAgIChyZWdvZmZzZXQgPT0gUlRYQUdDX0FfTUNTMTVfTUNTMTIgfHwKKwkJICAgIHJlZ29mZnNldCA9PSBSVFhBR0NfQl9NQ1MxNV9NQ1MxMikpIHx8CisJCSAgICAoKGdldF9yZl90eXBlKHJ0bHBoeSkgIT0gUkZfMlQyUikgJiYKKwkJICAgIChyZWdvZmZzZXQgPT0gUlRYQUdDX0FfTUNTMDdfTUNTMDQgfHwKKwkJICAgIHJlZ29mZnNldCA9PSBSVFhBR0NfQl9NQ1MwN19NQ1MwNCkpKSB7CisJCQl3cml0ZXZhbCA9IHB3cl92YWxbM107CisJCQlpZiAocmVnb2Zmc2V0ID09IFJUWEFHQ19BX01DUzE1X01DUzEyIHx8CisJCQkgICAgcmVnb2Zmc2V0ID09IFJUWEFHQ19BX01DUzA3X01DUzA0KQorCQkJCXJlZ29mZnNldCA9IDB4YzkwOworCQkJaWYgKHJlZ29mZnNldCA9PSBSVFhBR0NfQl9NQ1MxNV9NQ1MxMiB8fAorCQkJICAgIHJlZ29mZnNldCA9PSBSVFhBR0NfQl9NQ1MwN19NQ1MwNCkKKwkJCQlyZWdvZmZzZXQgPSAweGM5ODsKKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQlpZiAoaSAhPSAyKQorCQkJCQl3cml0ZXZhbCA9ICh3cml0ZXZhbCA+IDgpID8KKwkJCQkJCSAgICh3cml0ZXZhbCAtIDgpIDogMDsKKwkJCQllbHNlCisJCQkJCXdyaXRldmFsID0gKHdyaXRldmFsID4gNikgPworCQkJCQkJICAgKHdyaXRldmFsIC0gNikgOiAwOworCQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsICh1MzIpIChyZWdvZmZzZXQgKyBpKSwKKwkJCQkJICAgICAgICh1OCkgd3JpdGV2YWwpOworCQkJfQorCQl9CisJfQorfQorCit2b2lkIHJ0bDkyZF9waHlfcmY2MDUyX3NldF9vZmRtX3R4cG93ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCXU4ICpwcG93ZXJsZXZlbCwgdTggY2hhbm5lbCkKK3sKKwl1MzIgd3JpdGV2YWxbMl0sIHBvd2VyYmFzZTBbMl0sIHBvd2VyYmFzZTFbMl07CisJdTggaW5kZXg7CisKKwlfcnRsOTJkX3BoeV9nZXRfcG93ZXJfYmFzZShodywgcHBvd2VybGV2ZWwsIGNoYW5uZWwsCisJCQkmcG93ZXJiYXNlMFswXSwJJnBvd2VyYmFzZTFbMF0pOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDY7IGluZGV4KyspIHsKKwkJX3J0bDkyZF9nZXRfdHhwb3dlcl93cml0ZXZhbF9ieV9yZWd1bGF0b3J5KGh3LAorCQkJCWNoYW5uZWwsIGluZGV4LAkmcG93ZXJiYXNlMFswXSwKKwkJCQkmcG93ZXJiYXNlMVswXSwJJndyaXRldmFsWzBdKTsKKwkJX3J0bDkyZF93cml0ZV9vZmRtX3Bvd2VyX3JlZyhodywgaW5kZXgsICZ3cml0ZXZhbFswXSk7CisJfQorfQorCitib29sIHJ0bDkyZF9waHlfZW5hYmxlX2Fub3RoZXJwaHkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgYm1hYzApCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSAmKHJ0bHByaXYtPnJ0bGhhbCk7CisJdTggdTFidG1wOworCXU4IGRpcmVjdCA9IGJtYWMwID8gQklUKDMpIHwgQklUKDIpIDogQklUKDMpOworCXU4IG1hY19yZWcgPSBibWFjMCA/IFJFR19NQUMxIDogUkVHX01BQzA7CisJdTggbWFjX29uX2JpdCA9IGJtYWMwID8gTUFDMV9PTiA6IE1BQzBfT047CisJYm9vbCBicmVzdWx0ID0gdHJ1ZTsgLyogdHJ1ZTogbmVlZCB0byBlbmFibGUgQkIvUkYgcG93ZXIgKi8KKworCXJ0bGhhbC0+ZHVyaW5nX21hYzBpbml0X3JhZGlvYiA9IGZhbHNlOworCXJ0bGhhbC0+ZHVyaW5nX21hYzFpbml0X3JhZGlvYSA9IGZhbHNlOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19MT1VELCAoIj09PT5cbiIpKTsKKwkvKiBNQUMwIE5lZWQgUEhZMSBsb2FkIHJhZGlvX2IudHh0IC4gRHJpdmVyIHVzZSBEQkkgdG8gd3JpdGUuICovCisJdTFidG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBtYWNfcmVnKTsKKwlpZiAoISh1MWJ0bXAgJiBtYWNfb25fYml0KSkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELCAoImVuYWJsZSBCQiAmIFJGXG4iKSk7CisJCS8qIEVuYWJsZSBCQiBhbmQgUkYgcG93ZXIgKi8KKwkJcnRsOTJkZV93cml0ZV9kd29yZF9kYmkoaHcsIFJFR19TWVNfSVNPX0NUUkwsCisJCQlydGw5MmRlX3JlYWRfZHdvcmRfZGJpKGh3LCBSRUdfU1lTX0lTT19DVFJMLCBkaXJlY3QpIHwKKwkJCQlCSVQoMjkpIHwgQklUKDE2KSB8IEJJVCgxNyksIGRpcmVjdCk7CisJfSBlbHNlIHsKKwkJLyogV2UgdGhpbmsgaWYgTUFDMSBpcyBPTix0aGVuIHJhZGlvX2EudHh0CisJCSAqIGFuZCByYWRpb19iLnR4dCBoYXMgYmVlbiBsb2FkLiAqLworCQlicmVzdWx0ID0gZmFsc2U7CisJfQorCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19MT1VELCAoIjw9PT1cbiIpKTsKKwlyZXR1cm4gYnJlc3VsdDsKKworfQorCit2b2lkIHJ0bDkyZF9waHlfcG93ZXJkb3duX2Fub3RoZXJwaHkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgYm1hYzApCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSAmKHJ0bHByaXYtPnJ0bGhhbCk7CisJdTggdTFidG1wOworCXU4IGRpcmVjdCA9IGJtYWMwID8gQklUKDMpIHwgQklUKDIpIDogQklUKDMpOworCXU4IG1hY19yZWcgPSBibWFjMCA/IFJFR19NQUMxIDogUkVHX01BQzA7CisJdTggbWFjX29uX2JpdCA9IGJtYWMwID8gTUFDMV9PTiA6IE1BQzBfT047CisKKwlydGxoYWwtPmR1cmluZ19tYWMwaW5pdF9yYWRpb2IgPSBmYWxzZTsKKwlydGxoYWwtPmR1cmluZ19tYWMxaW5pdF9yYWRpb2EgPSBmYWxzZTsKKwlSVF9UUkFDRShydGxwcml2LCBDT01QX1JGLCBEQkdfTE9VRCwgKCI9PT09PlxuIikpOworCS8qIGNoZWNrIE1BQzAgZW5hYmxlIG9yIG5vdCBhZ2FpbiBub3csIGlmCisJICogZW5hYmxlZCwgbm90IHBvd2VyIGRvd24gcmFkaW8gQS4gKi8KKwl1MWJ0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIG1hY19yZWcpOworCWlmICghKHUxYnRtcCAmIG1hY19vbl9iaXQpKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsICgicG93ZXIgZG93blxuIikpOworCQkvKiBwb3dlciBkb3duIFJGIHJhZGlvIEEgYWNjb3JkaW5nIHRvIFl1TmFuJ3MgYWR2aWNlLiAqLworCQlydGw5MmRlX3dyaXRlX2R3b3JkX2RiaShodywgUkZQR0EwX1hBX0xTU0lQQVJBTUVURVIsCisJCQkJCTB4MDAwMDAwMDAsIGRpcmVjdCk7CisJfQorCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19MT1VELCAoIjw9PT09XG4iKSk7Cit9CisKK2Jvb2wgcnRsOTJkX3BoeV9yZjYwNTJfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BoeSAqcnRscGh5ID0gJihydGxwcml2LT5waHkpOworCWJvb2wgcnRzdGF0dXMgPSB0cnVlOworCXN0cnVjdCBydGxfaGFsICpydGxoYWwgPSAmKHJ0bHByaXYtPnJ0bGhhbCk7CisJdTMyIHU0X3JlZ3ZhbHVlID0gMDsKKwl1OCByZnBhdGg7CisJc3RydWN0IGJiX3JlZ19kZWYgKnBwaHlyZWc7CisJYm9vbCBtYWMxX2luaXRyYWRpb2FfZmlyc3QgPSBmYWxzZSwgbWFjMF9pbml0cmFkaW9iX2ZpcnN0ID0gZmFsc2U7CisJYm9vbCBuZWVkX3B3cmRvd25fcmFkaW9hID0gZmFsc2UsIG5lZWRfcHdyZG93bl9yYWRpb2IgPSBmYWxzZTsKKwlib29sIHRydWVfYnBhdGggPSBmYWxzZTsKKworCWlmIChydGxwaHktPnJmX3R5cGUgPT0gUkZfMVQxUikKKwkJcnRscGh5LT5udW1fdG90YWxfcmZwYXRoID0gMTsKKwllbHNlCisJCXJ0bHBoeS0+bnVtX3RvdGFsX3JmcGF0aCA9IDI7CisKKwkvKiBTaW5nbGUgcGh5IG1vZGU6IHVzZSByYWRpb19hIHJhZGlvX2IgY29uZmlnIHBhdGhfQSBwYXRoX0IgKi8KKwkvKiBzZXBlcmF0ZWx5IGJ5IE1BQzAsIGFuZCBNQUMxIG5lZWRuJ3QgY29uZmlndXJlIFJGOyAqLworCS8qIER1YWwgUEhZIG1vZGU6TUFDMCB1c2UgcmFkaW9fYSBjb25maWcgMXN0IHBoeSBwYXRoX0EsICovCisJLyogTUFDMSB1c2UgcmFkaW9fYiBjb25maWcgMm5kIFBIWSBwYXRoX0EuICovCisJLyogRE1EUCxNQUMwIG9uIEcgYmFuZCxNQUMxIG9uIEEgYmFuZC4gKi8KKwlpZiAocnRsaGFsLT5tYWNwaHltb2RlID09IERVQUxNQUNfRFVBTFBIWSkgeworCQlpZiAocnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fMl80RyAmJgorCQkgICAgcnRsaGFsLT5pbnRlcmZhY2VpbmRleCA9PSAwKSB7CisJCQkvKiBNQUMwIG5lZWRzIFBIWTEgbG9hZCByYWRpb19iLnR4dC4KKwkJCSAqIERyaXZlciB1c2UgREJJIHRvIHdyaXRlLiAqLworCQkJaWYgKHJ0bDkyZF9waHlfZW5hYmxlX2Fub3RoZXJwaHkoaHcsIHRydWUpKSB7CisJCQkJcnRscGh5LT5udW1fdG90YWxfcmZwYXRoID0gMjsKKwkJCQltYWMwX2luaXRyYWRpb2JfZmlyc3QgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXZSB0aGluayBpZiBNQUMxIGlzIE9OLHRoZW4gcmFkaW9fYS50eHQgYW5kCisJCQkJICogcmFkaW9fYi50eHQgaGFzIGJlZW4gbG9hZC4gKi8KKwkJCQlyZXR1cm4gcnRzdGF0dXM7CisJCQl9CisJCX0gZWxzZSBpZiAocnRsaGFsLT5jdXJyZW50X2JhbmR0eXBlID09IEJBTkRfT05fNUcgJiYKKwkJCSAgIHJ0bGhhbC0+aW50ZXJmYWNlaW5kZXggPT0gMSkgeworCQkJLyogTUFDMSBuZWVkcyBQSFkwIGxvYWQgcmFkaW9fYS50eHQuCisJCQkgKiBEcml2ZXIgdXNlIERCSSB0byB3cml0ZS4gKi8KKwkJCWlmIChydGw5MmRfcGh5X2VuYWJsZV9hbm90aGVycGh5KGh3LCBmYWxzZSkpIHsKKwkJCQlydGxwaHktPm51bV90b3RhbF9yZnBhdGggPSAyOworCQkJCW1hYzFfaW5pdHJhZGlvYV9maXJzdCA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCS8qIFdlIHRoaW5rIGlmIE1BQzAgaXMgT04sdGhlbiByYWRpb19hLnR4dCBhbmQKKwkJCQkgKiByYWRpb19iLnR4dCBoYXMgYmVlbiBsb2FkLiAqLworCQkJCXJldHVybiBydHN0YXR1czsKKwkJCX0KKwkJfSBlbHNlIGlmIChydGxoYWwtPmludGVyZmFjZWluZGV4ID09IDEpIHsKKwkJCS8qIE1BQzAgZW5hYmxlZCwgb25seSBpbml0IHJhZGlhIEIuICAgKi8KKwkJCXRydWVfYnBhdGggPSB0cnVlOworCQl9CisJfQorCisJZm9yIChyZnBhdGggPSAwOyByZnBhdGggPCBydGxwaHktPm51bV90b3RhbF9yZnBhdGg7IHJmcGF0aCsrKSB7CisJCS8qIE1hYzEgdXNlIFBIWTAgd3JpdGUgKi8KKwkJaWYgKG1hYzFfaW5pdHJhZGlvYV9maXJzdCkgeworCQkJaWYgKHJmcGF0aCA9PSBSRjkwX1BBVEhfQSkgeworCQkJCXJ0bGhhbC0+ZHVyaW5nX21hYzFpbml0X3JhZGlvYSA9IHRydWU7CisJCQkJbmVlZF9wd3Jkb3duX3JhZGlvYSA9IHRydWU7CisJCQl9IGVsc2UgaWYgKHJmcGF0aCA9PSBSRjkwX1BBVEhfQikgeworCQkJCXJ0bGhhbC0+ZHVyaW5nX21hYzFpbml0X3JhZGlvYSA9IGZhbHNlOworCQkJCW1hYzFfaW5pdHJhZGlvYV9maXJzdCA9IGZhbHNlOworCQkJCXJmcGF0aCA9IFJGOTBfUEFUSF9BOworCQkJCXRydWVfYnBhdGggPSB0cnVlOworCQkJCXJ0bHBoeS0+bnVtX3RvdGFsX3JmcGF0aCA9IDE7CisJCQl9CisJCX0gZWxzZSBpZiAobWFjMF9pbml0cmFkaW9iX2ZpcnN0KSB7CisJCQkvKiBNYWMwIHVzZSBQSFkxIHdyaXRlICovCisJCQlpZiAocmZwYXRoID09IFJGOTBfUEFUSF9BKQorCQkJCXJ0bGhhbC0+ZHVyaW5nX21hYzBpbml0X3JhZGlvYiA9IGZhbHNlOworCQkJaWYgKHJmcGF0aCA9PSBSRjkwX1BBVEhfQikgeworCQkJCXJ0bGhhbC0+ZHVyaW5nX21hYzBpbml0X3JhZGlvYiA9IHRydWU7CisJCQkJbWFjMF9pbml0cmFkaW9iX2ZpcnN0ID0gZmFsc2U7CisJCQkJbmVlZF9wd3Jkb3duX3JhZGlvYiA9IHRydWU7CisJCQkJcmZwYXRoID0gUkY5MF9QQVRIX0E7CisJCQkJdHJ1ZV9icGF0aCA9IHRydWU7CisJCQkJcnRscGh5LT5udW1fdG90YWxfcmZwYXRoID0gMTsKKwkJCX0KKwkJfQorCQlwcGh5cmVnID0gJnJ0bHBoeS0+cGh5cmVnX2RlZltyZnBhdGhdOworCQlzd2l0Y2ggKHJmcGF0aCkgeworCQljYXNlIFJGOTBfUEFUSF9BOgorCQljYXNlIFJGOTBfUEFUSF9DOgorCQkJdTRfcmVndmFsdWUgPSBydGxfZ2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmludGZzLAorCQkJCQkJICAgIEJSRlNJX1JGRU5WKTsKKwkJCWJyZWFrOworCQljYXNlIFJGOTBfUEFUSF9COgorCQljYXNlIFJGOTBfUEFUSF9EOgorCQkJdTRfcmVndmFsdWUgPSBydGxfZ2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmludGZzLAorCQkJCUJSRlNJX1JGRU5WIDw8IDE2KTsKKwkJCWJyZWFrOworCQl9CisJCXJ0bF9zZXRfYmJyZWcoaHcsIHBwaHlyZWctPnJmaW50ZmUsIEJSRlNJX1JGRU5WIDw8IDE2LCAweDEpOworCQl1ZGVsYXkoMSk7CisJCXJ0bF9zZXRfYmJyZWcoaHcsIHBwaHlyZWctPnJmaW50Zm8sIEJSRlNJX1JGRU5WLCAweDEpOworCQl1ZGVsYXkoMSk7CisJCS8qIFNldCBiaXQgbnVtYmVyIG9mIEFkZHJlc3MgYW5kIERhdGEgZm9yIFJGIHJlZ2lzdGVyICovCisJCS8qIFNldCAxIHRvIDQgYml0cyBmb3IgODI1NSAqLworCQlydGxfc2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmhzc2lfcGFyYTIsCisJCQkgICAgICBCM1dJUkVBRERSRVNTTEVOR1RILCAweDApOworCQl1ZGVsYXkoMSk7CisJCS8qIFNldCAwIHRvIDEyICBiaXRzIGZvciA4MjU1ICovCisJCXJ0bF9zZXRfYmJyZWcoaHcsIHBwaHlyZWctPnJmaHNzaV9wYXJhMiwgQjNXSVJFREFUQUxFTkdUSCwgMHgwKTsKKwkJdWRlbGF5KDEpOworCQlzd2l0Y2ggKHJmcGF0aCkgeworCQljYXNlIFJGOTBfUEFUSF9BOgorCQkJaWYgKHRydWVfYnBhdGgpCisJCQkJcnRzdGF0dXMgPSBydGw5MmRfcGh5X2NvbmZpZ19yZl93aXRoX2hlYWRlcmZpbGUoCisJCQkJCQlodywgcmFkaW9iX3R4dCwKKwkJCQkJCShlbnVtIHJhZGlvX3BhdGgpcmZwYXRoKTsKKwkJCWVsc2UKKwkJCQlydHN0YXR1cyA9IHJ0bDkyZF9waHlfY29uZmlnX3JmX3dpdGhfaGVhZGVyZmlsZSgKKwkJCQkJICAgICBodywgcmFkaW9hX3R4dCwKKwkJCQkJICAgICAoZW51bSByYWRpb19wYXRoKXJmcGF0aCk7CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfQjoKKwkJCXJ0c3RhdHVzID0KKwkJCSAgICBydGw5MmRfcGh5X2NvbmZpZ19yZl93aXRoX2hlYWRlcmZpbGUoaHcsIHJhZGlvYl90eHQsCisJCQkJCQkoZW51bSByYWRpb19wYXRoKSByZnBhdGgpOworCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0M6CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfRDoKKwkJCWJyZWFrOworCQl9CisJCXN3aXRjaCAocmZwYXRoKSB7CisJCWNhc2UgUkY5MF9QQVRIX0E6CisJCWNhc2UgUkY5MF9QQVRIX0M6CisJCQlydGxfc2V0X2JicmVnKGh3LCBwcGh5cmVnLT5yZmludGZzLCBCUkZTSV9SRkVOViwKKwkJCQkgICAgICB1NF9yZWd2YWx1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfQjoKKwkJY2FzZSBSRjkwX1BBVEhfRDoKKwkJCXJ0bF9zZXRfYmJyZWcoaHcsIHBwaHlyZWctPnJmaW50ZnMsIEJSRlNJX1JGRU5WIDw8IDE2LAorCQkJCSAgICAgIHU0X3JlZ3ZhbHVlKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChydHN0YXR1cyAhPSB0cnVlKSB7CisJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKKwkJCQkoIlJhZGlvWyVkXSBGYWlsISEiLCByZnBhdGgpKTsKKwkJCWdvdG8gcGh5X3JmX2NmZ19mYWlsOworCQl9CisKKwl9CisKKwkvKiBjaGVjayBNQUMwIGVuYWJsZSBvciBub3QgYWdhaW4sIGlmIGVuYWJsZWQsCisJICogbm90IHBvd2VyIGRvd24gcmFkaW8gQS4gKi8KKwkvKiBjaGVjayBNQUMxIGVuYWJsZSBvciBub3QgYWdhaW4sIGlmIGVuYWJsZWQsCisJICogbm90IHBvd2VyIGRvd24gcmFkaW8gQi4gKi8KKwlpZiAobmVlZF9wd3Jkb3duX3JhZGlvYSkKKwkJcnRsOTJkX3BoeV9wb3dlcmRvd25fYW5vdGhlcnBoeShodywgZmFsc2UpOworCWVsc2UgaWYgKG5lZWRfcHdyZG93bl9yYWRpb2IpCisJCXJ0bDkyZF9waHlfcG93ZXJkb3duX2Fub3RoZXJwaHkoaHcsIHRydWUpOworCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLCAoIjwtLS1cbiIpKTsKKwlyZXR1cm4gcnRzdGF0dXM7CisKK3BoeV9yZl9jZmdfZmFpbDoKKwlyZXR1cm4gcnRzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9yZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGI5Y2ZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvcmYuaApAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMCAgUmVhbHRlayBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBSZWFsdGVrIENvcnBvcmF0aW9uLCBOby4gMiwgSW5ub3ZhdGlvbiBSb2FkIElJLCBIc2luY2h1IFNjaWVuY2UgUGFyaywKKyAqIEhzaW5jaHUgMzAwLCBUYWl3YW4uCisgKgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDkyRF9SRl9IX18KKyNkZWZpbmUgX19SVEw5MkRfUkZfSF9fCisKK2V4dGVybiB2b2lkIHJ0bDkyZF9waHlfcmY2MDUyX3NldF9iYW5kd2lkdGgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICB1OCBiYW5kd2lkdGgpOworZXh0ZXJuIHZvaWQgcnRsOTJkX3BoeV9yZjYwNTJfc2V0X2Nja190eHBvd2VyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgICAgICB1OCAqcHBvd2VybGV2ZWwpOworZXh0ZXJuIHZvaWQgcnRsOTJkX3BoeV9yZjYwNTJfc2V0X29mZG1fdHhwb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgICAgIHU4ICpwcG93ZXJsZXZlbCwgdTggY2hhbm5lbCk7CitleHRlcm4gYm9vbCBydGw5MmRfcGh5X3JmNjA1Ml9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworZXh0ZXJuIGJvb2wgcnRsOTJkX3BoeV9lbmFibGVfYW5vdGhlcnBoeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBibWFjMCk7CitleHRlcm4gdm9pZCBydGw5MmRfcGh5X3Bvd2VyZG93bl9hbm90aGVycGh5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQkgICAgYm9vbCBibWFjMCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3N3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxNzY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3N3LmMKQEAgLTAsMCArMSw0MjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlICIuLi93aWZpLmgiCisjaW5jbHVkZSAiLi4vY29yZS5oIgorI2luY2x1ZGUgIi4uL3BjaS5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImRlZi5oIgorI2luY2x1ZGUgInBoeS5oIgorI2luY2x1ZGUgImRtLmgiCisjaW5jbHVkZSAiaHcuaCIKKyNpbmNsdWRlICJzdy5oIgorI2luY2x1ZGUgInRyeC5oIgorI2luY2x1ZGUgImxlZC5oIgorCitzdGF0aWMgdm9pZCBydGw5MmRfaW5pdF9hc3BtX3ZhcnMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKworCS8qY2xvc2UgQVNQTSBmb3IgQU1EIGRlZmF1bHRseSAqLworCXJ0bHBjaS0+Y29uc3RfYW1kcGNpX2FzcG0gPSAwOworCisJLyoKKwkgKiBBU1BNIFBTIG1vZGUuCisJICogMCAtIERpc2FibGUgQVNQTSwKKwkgKiAxIC0gRW5hYmxlIEFTUE0gd2l0aG91dCBDbG9jayBSZXEsCisJICogMiAtIEVuYWJsZSBBU1BNIHdpdGggQ2xvY2sgUmVxLAorCSAqIDMgLSBBbHd5YXMgRW5hYmxlIEFTUE0gd2l0aCBDbG9jayBSZXEsCisJICogNCAtIEFsd2F5cyBFbmFibGUgQVNQTSB3aXRob3V0IENsb2NrIFJlcS4KKwkgKiBzZXQgZGVmdWx0IHRvIFJUTDgxOTJDRTozIFJUTDgxOTJFOjIKKwkgKiAqLworCXJ0bHBjaS0+Y29uc3RfcGNpX2FzcG0gPSAzOworCisJLypTZXR0aW5nIGZvciBQQ0ktRSBkZXZpY2UgKi8KKwlydGxwY2ktPmNvbnN0X2RldmljZXBjaV9hc3BtX3NldHRpbmcgPSAweDAzOworCisJLypTZXR0aW5nIGZvciBQQ0ktRSBicmlkZ2UgKi8KKwlydGxwY2ktPmNvbnN0X2hvc3RwY2lfYXNwbV9zZXR0aW5nID0gMHgwMjsKKworCS8qCisJICogSW4gSHcvU3cgUmFkaW8gT2ZmIHNpdHVhdGlvbi4KKwkgKiAwIC0gRGVmYXVsdCwKKwkgKiAxIC0gRnJvbSBBU1BNIHNldHRpbmcgd2l0aG91dCBsb3cgTWFjIFB3ciwKKwkgKiAyIC0gRnJvbSBBU1BNIHNldHRpbmcgd2l0aCBsb3cgTWFjIFB3ciwKKwkgKiAzIC0gQnVzIEQzCisJICogc2V0IGRlZmF1bHQgdG8gUlRMODE5MkNFOjAgUlRMODE5MlNFOjIKKwkgKi8KKwlydGxwY2ktPmNvbnN0X2h3c3dfcmZvZmZfZDMgPSAwOworCisJLyoKKwkgKiBUaGlzIHNldHRpbmcgd29ya3MgZm9yIHRob3NlIGRldmljZSB3aXRoCisJICogYmFja2Rvb3IgQVNQTSBzZXR0aW5nIHN1Y2ggYXMgRVBIWSBzZXR0aW5nLgorCSAqIDAgLSBOb3Qgc3VwcG9ydCBBU1BNLAorCSAqIDEgLSBTdXBwb3J0IEFTUE0sCisJICogMiAtIEFjY29yZGluZyB0byBjaGlwc2V0LgorCSAqLworCXJ0bHBjaS0+Y29uc3Rfc3VwcG9ydF9wY2lhc3BtID0gMTsKK30KKworc3RhdGljIGludCBydGw5MmRfaW5pdF9zd192YXJzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCWludCBlcnI7CisJdTggdGlkOworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmU7CisJc3RhdGljIGludCBoZWFkZXJfcHJpbnQ7CisKKwlydGxwcml2LT5kbS5kbV9pbml0aWFsZ2Fpbl9lbmFibGUgPSB0cnVlOworCXJ0bHByaXYtPmRtLmRtX2ZsYWcgPSAwOworCXJ0bHByaXYtPmRtLmRpc2FibGVfZnJhbWVidXJzdGluZyA9IDA7CisJcnRscHJpdi0+ZG0udGhlcm1hbHZhbHVlID0gMDsKKwlydGxwcml2LT5kbS51c2VyYW1hc2sgPSAxOworCisJLyogZHVhbCBtYWMgKi8KKwlpZiAocnRscHJpdi0+cnRsaGFsLmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81RykKKwkJcnRscHJpdi0+cGh5LmN1cnJlbnRfY2hhbm5lbCA9IDM2OworCWVsc2UKKwkJcnRscHJpdi0+cGh5LmN1cnJlbnRfY2hhbm5lbCA9IDE7CisKKwlpZiAocnRscHJpdi0+cnRsaGFsLm1hY3BoeW1vZGUgIT0gU0lOR0xFTUFDX1NJTkdMRVBIWSkgeworCQlydGxwcml2LT5ydGxoYWwuZGlzYWJsZV9hbXNkdV84ayA9IHRydWU7CisJCS8qIE5vIGxvbmcgUlggLSByZWR1Y2UgZnJhZ21lbnRhdGlvbiAqLworCQlydGxwY2ktPnJ4YnVmZmVyc2l6ZSA9IDQwOTY7CisJfQorCisJcnRscGNpLT50cmFuc21pdF9jb25maWcgPSBDRkVOREZPUk0gfCBCSVQoMTIpIHwgQklUKDEzKTsKKworCXJ0bHBjaS0+cmVjZWl2ZV9jb25maWcgPSAoCisJCQlSQ1JfQVBQRkNTCisJCQl8IFJDUl9BTUYKKwkJCXwgUkNSX0FERgorCQkJfCBSQ1JfQVBQX01JQworCQkJfCBSQ1JfQVBQX0lDVgorCQkJfCBSQ1JfQUlDVgorCQkJfCBSQ1JfQUNSQzMyCisJCQl8IFJDUl9BQgorCQkJfCBSQ1JfQU0KKwkJCXwgUkNSX0FQTQorCQkJfCBSQ1JfQVBQX1BIWVNUX1JYRkYKKwkJCXwgUkNSX0hUQ19MT0NfQ1RSTAorCSk7CisKKwlydGxwY2ktPmlycV9tYXNrWzBdID0gKHUzMikgKAorCQkJSU1SX1JPSworCQkJfCBJTVJfVk9ET0sKKwkJCXwgSU1SX1ZJRE9LCisJCQl8IElNUl9CRURPSworCQkJfCBJTVJfQktET0sKKwkJCXwgSU1SX01HTlRET0sKKwkJCXwgSU1SX0hJR0hET0sKKwkJCXwgSU1SX0JET0sKKwkJCXwgSU1SX1JEVQorCQkJfCBJTVJfUlhGT1ZXCisJKTsKKworCXJ0bHBjaS0+aXJxX21hc2tbMV0gPSAodTMyKSAoSU1SX0NQV00gfCBJTVJfQzJIQ01EKTsKKworCS8qIGZvciBMUFMgJiBJUFMgKi8KKwlydGxwcml2LT5wc2MuaW5hY3RpdmVwcyA9IHJ0bHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+aW5hY3RpdmVwczsKKwlydGxwcml2LT5wc2Muc3djdHJsX2xwcyA9IHJ0bHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+c3djdHJsX2xwczsKKwlydGxwcml2LT5wc2MuZndjdHJsX2xwcyA9IHJ0bHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+ZndjdHJsX2xwczsKKwlydGxwcml2LT5wc2MucmVnX2Z3Y3RybF9scHMgPSAzOworCXJ0bHByaXYtPnBzYy5yZWdfbWF4X2xwc19hd2FrZWludHZsID0gNTsKKwkvKiBmb3IgQVNQTSwgeW91IGNhbiBjbG9zZSBhc3BtIHRocm91Z2gKKwkgKiBzZXQgY29uc3Rfc3VwcG9ydF9wY2lhc3BtID0gMCAqLworCXJ0bDkyZF9pbml0X2FzcG1fdmFycyhodyk7CisKKwlpZiAocnRscHJpdi0+cHNjLnJlZ19md2N0cmxfbHBzID09IDEpCisJCXJ0bHByaXYtPnBzYy5md2N0cmxfcHNtb2RlID0gRldfUFNfTUlOX01PREU7CisJZWxzZSBpZiAocnRscHJpdi0+cHNjLnJlZ19md2N0cmxfbHBzID09IDIpCisJCXJ0bHByaXYtPnBzYy5md2N0cmxfcHNtb2RlID0gRldfUFNfTUFYX01PREU7CisJZWxzZSBpZiAocnRscHJpdi0+cHNjLnJlZ19md2N0cmxfbHBzID09IDMpCisJCXJ0bHByaXYtPnBzYy5md2N0cmxfcHNtb2RlID0gRldfUFNfRFRJTV9NT0RFOworCisJLyogZm9yIGZpcm13YXJlIGJ1ZiAqLworCXJ0bHByaXYtPnJ0bGhhbC5wZmlybXdhcmUgPSB2emFsbG9jKDB4ODAwMCk7CisJaWYgKCFydGxwcml2LT5ydGxoYWwucGZpcm13YXJlKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJDYW4ndCBhbGxvYyBidWZmZXIgZm9yIGZ3LlxuIikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIWhlYWRlcl9wcmludCkgeworCQlwcl9pbmZvKCJEcml2ZXIgZm9yIFJlYWx0ZWsgUlRMODE5MkRFIFdMQU4gaW50ZXJmYWNlXG4iKTsKKwkJcHJfaW5mbygiTG9hZGluZyBmaXJtd2FyZSBmaWxlICVzXG4iLCBydGxwcml2LT5jZmctPmZ3X25hbWUpOworCQloZWFkZXJfcHJpbnQrKzsKKwl9CisJLyogcmVxdWVzdCBmdyAqLworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBydGxwcml2LT5jZmctPmZ3X25hbWUsCisJCQkgICAgICAgcnRscHJpdi0+aW8uZGV2KTsKKwlpZiAoZXJyKSB7CisJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCisJCQkgKCJGYWlsZWQgdG8gcmVxdWVzdCBmaXJtd2FyZSFcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChmaXJtd2FyZS0+c2l6ZSA+IDB4ODAwMCkgeworCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAorCQkJICgiRmlybXdhcmUgaXMgdG9vIGJpZyFcbiIpKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CisJCXJldHVybiAxOworCX0KKwltZW1jcHkocnRscHJpdi0+cnRsaGFsLnBmaXJtd2FyZSwgZmlybXdhcmUtPmRhdGEsIGZpcm13YXJlLT5zaXplKTsKKwlydGxwcml2LT5ydGxoYWwuZndzaXplID0gZmlybXdhcmUtPnNpemU7CisJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CisKKwkvKiBmb3IgZWFybHkgbW9kZSAqLworCXJ0bHByaXYtPnJ0bGhhbC5lYXJseW1vZGVfZW5hYmxlID0gdHJ1ZTsKKwlmb3IgKHRpZCA9IDA7IHRpZCA8IDg7IHRpZCsrKQorCQlza2JfcXVldWVfaGVhZF9pbml0KCZydGxwcml2LT5tYWM4MDIxMS5za2Jfd2FpdHFbdGlkXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDkyZF9kZWluaXRfc3dfdmFycyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CisJdTggdGlkOworCisJaWYgKHJ0bHByaXYtPnJ0bGhhbC5wZmlybXdhcmUpIHsKKwkJdmZyZWUocnRscHJpdi0+cnRsaGFsLnBmaXJtd2FyZSk7CisJCXJ0bHByaXYtPnJ0bGhhbC5wZmlybXdhcmUgPSBOVUxMOworCX0KKwlmb3IgKHRpZCA9IDA7IHRpZCA8IDg7IHRpZCsrKQorCQlza2JfcXVldWVfcHVyZ2UoJnJ0bHByaXYtPm1hYzgwMjExLnNrYl93YWl0cVt0aWRdKTsKK30KKworc3RhdGljIHN0cnVjdCBydGxfaGFsX29wcyBydGw4MTkyZGVfaGFsX29wcyA9IHsKKwkuaW5pdF9zd192YXJzID0gcnRsOTJkX2luaXRfc3dfdmFycywKKwkuZGVpbml0X3N3X3ZhcnMgPSBydGw5MmRfZGVpbml0X3N3X3ZhcnMsCisJLnJlYWRfZWVwcm9tX2luZm8gPSBydGw5MmRlX3JlYWRfZWVwcm9tX2luZm8sCisJLmludGVycnVwdF9yZWNvZ25pemVkID0gcnRsOTJkZV9pbnRlcnJ1cHRfcmVjb2duaXplZCwKKwkuaHdfaW5pdCA9IHJ0bDkyZGVfaHdfaW5pdCwKKwkuaHdfZGlzYWJsZSA9IHJ0bDkyZGVfY2FyZF9kaXNhYmxlLAorCS5od19zdXNwZW5kID0gcnRsOTJkZV9zdXNwZW5kLAorCS5od19yZXN1bWUgPSBydGw5MmRlX3Jlc3VtZSwKKwkuZW5hYmxlX2ludGVycnVwdCA9IHJ0bDkyZGVfZW5hYmxlX2ludGVycnVwdCwKKwkuZGlzYWJsZV9pbnRlcnJ1cHQgPSBydGw5MmRlX2Rpc2FibGVfaW50ZXJydXB0LAorCS5zZXRfbmV0d29ya190eXBlID0gcnRsOTJkZV9zZXRfbmV0d29ya190eXBlLAorCS5zZXRfY2hrX2Jzc2lkID0gcnRsOTJkZV9zZXRfY2hlY2tfYnNzaWQsCisJLnNldF9xb3MgPSBydGw5MmRlX3NldF9xb3MsCisJLnNldF9iY25fcmVnID0gcnRsOTJkZV9zZXRfYmVhY29uX3JlbGF0ZWRfcmVnaXN0ZXJzLAorCS5zZXRfYmNuX2ludHYgPSBydGw5MmRlX3NldF9iZWFjb25faW50ZXJ2YWwsCisJLnVwZGF0ZV9pbnRlcnJ1cHRfbWFzayA9IHJ0bDkyZGVfdXBkYXRlX2ludGVycnVwdF9tYXNrLAorCS5nZXRfaHdfcmVnID0gcnRsOTJkZV9nZXRfaHdfcmVnLAorCS5zZXRfaHdfcmVnID0gcnRsOTJkZV9zZXRfaHdfcmVnLAorCS51cGRhdGVfcmF0ZV90YmwgPSBydGw5MmRlX3VwZGF0ZV9oYWxfcmF0ZV90YmwsCisJLmZpbGxfdHhfZGVzYyA9IHJ0bDkyZGVfdHhfZmlsbF9kZXNjLAorCS5maWxsX3R4X2NtZGRlc2MgPSBydGw5MmRlX3R4X2ZpbGxfY21kZGVzYywKKwkucXVlcnlfcnhfZGVzYyA9IHJ0bDkyZGVfcnhfcXVlcnlfZGVzYywKKwkuc2V0X2NoYW5uZWxfYWNjZXNzID0gcnRsOTJkZV91cGRhdGVfY2hhbm5lbF9hY2Nlc3Nfc2V0dGluZywKKwkucmFkaW9fb25vZmZfY2hlY2tpbmcgPSBydGw5MmRlX2dwaW9fcmFkaW9fb25fb2ZmX2NoZWNraW5nLAorCS5zZXRfYndfbW9kZSA9IHJ0bDkyZF9waHlfc2V0X2J3X21vZGUsCisJLnN3aXRjaF9jaGFubmVsID0gcnRsOTJkX3BoeV9zd19jaG5sLAorCS5kbV93YXRjaGRvZyA9IHJ0bDkyZF9kbV93YXRjaGRvZywKKwkuc2Nhbl9vcGVyYXRpb25fYmFja3VwID0gcnRsOTJkX3BoeV9zY2FuX29wZXJhdGlvbl9iYWNrdXAsCisJLnNldF9yZl9wb3dlcl9zdGF0ZSA9IHJ0bDkyZF9waHlfc2V0X3JmX3Bvd2VyX3N0YXRlLAorCS5sZWRfY29udHJvbCA9IHJ0bDkyZGVfbGVkX2NvbnRyb2wsCisJLnNldF9kZXNjID0gcnRsOTJkZV9zZXRfZGVzYywKKwkuZ2V0X2Rlc2MgPSBydGw5MmRlX2dldF9kZXNjLAorCS50eF9wb2xsaW5nID0gcnRsOTJkZV90eF9wb2xsaW5nLAorCS5lbmFibGVfaHdfc2VjID0gcnRsOTJkZV9lbmFibGVfaHdfc2VjdXJpdHlfY29uZmlnLAorCS5zZXRfa2V5ID0gcnRsOTJkZV9zZXRfa2V5LAorCS5pbml0X3N3X2xlZHMgPSBydGw5MmRlX2luaXRfc3dfbGVkcywKKwkuZ2V0X2JicmVnID0gcnRsOTJkX3BoeV9xdWVyeV9iYl9yZWcsCisJLnNldF9iYnJlZyA9IHJ0bDkyZF9waHlfc2V0X2JiX3JlZywKKwkuZ2V0X3JmcmVnID0gcnRsOTJkX3BoeV9xdWVyeV9yZl9yZWcsCisJLnNldF9yZnJlZyA9IHJ0bDkyZF9waHlfc2V0X3JmX3JlZywKKwkubGlua2VkX3NldF9yZWcgPSBydGw5MmRfbGlua2VkX3NldF9yZWcsCit9OworCitzdGF0aWMgc3RydWN0IHJ0bF9tb2RfcGFyYW1zIHJ0bDkyZGVfbW9kX3BhcmFtcyA9IHsKKwkuc3dfY3J5cHRvID0gZmFsc2UsCisJLmluYWN0aXZlcHMgPSB0cnVlLAorCS5zd2N0cmxfbHBzID0gdHJ1ZSwKKwkuZndjdHJsX2xwcyA9IGZhbHNlLAorfTsKKworc3RhdGljIHN0cnVjdCBydGxfaGFsX2NmZyBydGw5MmRlX2hhbF9jZmcgPSB7CisJLmJhcl9pZCA9IDIsCisJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKKwkubmFtZSA9ICJydGw4MTkyZGUiLAorCS5md19uYW1lID0gInJ0bHdpZmkvcnRsODE5MmRlZncuYmluIiwKKwkub3BzID0gJnJ0bDgxOTJkZV9oYWxfb3BzLAorCS5tb2RfcGFyYW1zID0gJnJ0bDkyZGVfbW9kX3BhcmFtcywKKworCS5tYXBzW1NZU19JU09fQ1RSTF0gPSBSRUdfU1lTX0lTT19DVFJMLAorCS5tYXBzW1NZU19GVU5DX0VOXSA9IFJFR19TWVNfRlVOQ19FTiwKKwkubWFwc1tTWVNfQ0xLXSA9IFJFR19TWVNfQ0xLUiwKKwkubWFwc1tNQUNfUkNSX0FNXSA9IFJDUl9BTSwKKwkubWFwc1tNQUNfUkNSX0FCXSA9IFJDUl9BQiwKKwkubWFwc1tNQUNfUkNSX0FDUkMzMl0gPSBSQ1JfQUNSQzMyLAorCS5tYXBzW01BQ19SQ1JfQUNGXSA9IFJDUl9BQ0YsCisJLm1hcHNbTUFDX1JDUl9BQVBdID0gUkNSX0FBUCwKKworCS5tYXBzW0VGVVNFX1RFU1RdID0gUkVHX0VGVVNFX1RFU1QsCisJLm1hcHNbRUZVU0VfQ1RSTF0gPSBSRUdfRUZVU0VfQ1RSTCwKKwkubWFwc1tFRlVTRV9DTEtdID0gMCwJLyoganVzdCBmb3IgOTJzZSAqLworCS5tYXBzW0VGVVNFX0NMS19DVFJMXSA9IFJFR19FRlVTRV9DVFJMLAorCS5tYXBzW0VGVVNFX1BXQ19FVjEyVl0gPSBQV0NfRVYxMlYsCisJLm1hcHNbRUZVU0VfRkVOX0VMRFJdID0gRkVOX0VMRFIsCisJLm1hcHNbRUZVU0VfTE9BREVSX0NMS19FTl0gPSBMT0FERVJfQ0xLX0VOLAorCS5tYXBzW0VGVVNFX0FOQThNXSA9IDAsCS8qIGp1c3QgZm9yIDkyc2UgKi8KKwkubWFwc1tFRlVTRV9IV1NFVF9NQVhfU0laRV0gPSBIV1NFVF9NQVhfU0laRSwKKwkubWFwc1tFRlVTRV9NQVhfU0VDVElPTl9NQVBdID0gRUZVU0VfTUFYX1NFQ1RJT04sCisJLm1hcHNbRUZVU0VfUkVBTF9DT05URU5UX1NJWkVdID0gRUZVU0VfUkVBTF9DT05URU5UX0xFTiwKKworCS5tYXBzW1JXQ0FNXSA9IFJFR19DQU1DTUQsCisJLm1hcHNbV0NBTUldID0gUkVHX0NBTVdSSVRFLAorCS5tYXBzW1JDQU1PXSA9IFJFR19DQU1SRUFELAorCS5tYXBzW0NBTURCR10gPSBSRUdfQ0FNREJHLAorCS5tYXBzW1NFQ1JdID0gUkVHX1NFQ0NGRywKKwkubWFwc1tTRUNfQ0FNX05PTkVdID0gQ0FNX05PTkUsCisJLm1hcHNbU0VDX0NBTV9XRVA0MF0gPSBDQU1fV0VQNDAsCisJLm1hcHNbU0VDX0NBTV9US0lQXSA9IENBTV9US0lQLAorCS5tYXBzW1NFQ19DQU1fQUVTXSA9IENBTV9BRVMsCisJLm1hcHNbU0VDX0NBTV9XRVAxMDRdID0gQ0FNX1dFUDEwNCwKKworCS5tYXBzW1JUTF9JTVJfQkNORE1BSU5UNl0gPSBJTVJfQkNORE1BSU5UNiwKKwkubWFwc1tSVExfSU1SX0JDTkRNQUlOVDVdID0gSU1SX0JDTkRNQUlOVDUsCisJLm1hcHNbUlRMX0lNUl9CQ05ETUFJTlQ0XSA9IElNUl9CQ05ETUFJTlQ0LAorCS5tYXBzW1JUTF9JTVJfQkNORE1BSU5UM10gPSBJTVJfQkNORE1BSU5UMywKKwkubWFwc1tSVExfSU1SX0JDTkRNQUlOVDJdID0gSU1SX0JDTkRNQUlOVDIsCisJLm1hcHNbUlRMX0lNUl9CQ05ETUFJTlQxXSA9IElNUl9CQ05ETUFJTlQxLAorCS5tYXBzW1JUTF9JTVJfQkNORE9LOF0gPSBJTVJfQkNORE9LOCwKKwkubWFwc1tSVExfSU1SX0JDTkRPSzddID0gSU1SX0JDTkRPSzcsCisJLm1hcHNbUlRMX0lNUl9CQ05ET0s2XSA9IElNUl9CQ05ET0s2LAorCS5tYXBzW1JUTF9JTVJfQkNORE9LNV0gPSBJTVJfQkNORE9LNSwKKwkubWFwc1tSVExfSU1SX0JDTkRPSzRdID0gSU1SX0JDTkRPSzQsCisJLm1hcHNbUlRMX0lNUl9CQ05ET0szXSA9IElNUl9CQ05ET0szLAorCS5tYXBzW1JUTF9JTVJfQkNORE9LMl0gPSBJTVJfQkNORE9LMiwKKwkubWFwc1tSVExfSU1SX0JDTkRPSzFdID0gSU1SX0JDTkRPSzEsCisJLm1hcHNbUlRMX0lNUl9USU1FT1VUMl0gPSBJTVJfVElNRU9VVDIsCisJLm1hcHNbUlRMX0lNUl9USU1FT1VUMV0gPSBJTVJfVElNRU9VVDEsCisKKwkubWFwc1tSVExfSU1SX1RYRk9WV10gPSBJTVJfVFhGT1ZXLAorCS5tYXBzW1JUTF9JTVJfUFNUSU1FT1VUXSA9IElNUl9QU1RJTUVPVVQsCisJLm1hcHNbUlRMX0lNUl9CY25JbnRdID0gSU1SX0JjbkludCwKKwkubWFwc1tSVExfSU1SX1JYRk9WV10gPSBJTVJfUlhGT1ZXLAorCS5tYXBzW1JUTF9JTVJfUkRVXSA9IElNUl9SRFUsCisJLm1hcHNbUlRMX0lNUl9BVElNRU5EXSA9IElNUl9BVElNRU5ELAorCS5tYXBzW1JUTF9JTVJfQkRPS10gPSBJTVJfQkRPSywKKwkubWFwc1tSVExfSU1SX01HTlRET0tdID0gSU1SX01HTlRET0ssCisJLm1hcHNbUlRMX0lNUl9UQkRFUl0gPSBJTVJfVEJERVIsCisJLm1hcHNbUlRMX0lNUl9ISUdIRE9LXSA9IElNUl9ISUdIRE9LLAorCS5tYXBzW1JUTF9JTVJfVEJET0tdID0gSU1SX1RCRE9LLAorCS5tYXBzW1JUTF9JTVJfQktET0tdID0gSU1SX0JLRE9LLAorCS5tYXBzW1JUTF9JTVJfQkVET0tdID0gSU1SX0JFRE9LLAorCS5tYXBzW1JUTF9JTVJfVklET0tdID0gSU1SX1ZJRE9LLAorCS5tYXBzW1JUTF9JTVJfVk9ET0tdID0gSU1SX1ZPRE9LLAorCS5tYXBzW1JUTF9JTVJfUk9LXSA9IElNUl9ST0ssCisJLm1hcHNbUlRMX0lCU1NfSU5UX01BU0tTXSA9IChJTVJfQmNuSW50IHwgSU1SX1RCRE9LIHwgSU1SX1RCREVSKSwKKworCS5tYXBzW1JUTF9SQ19DQ0tfUkFURTFNXSA9IERFU0M5MkRfUkFURTFNLAorCS5tYXBzW1JUTF9SQ19DQ0tfUkFURTJNXSA9IERFU0M5MkRfUkFURTJNLAorCS5tYXBzW1JUTF9SQ19DQ0tfUkFURTVfNU1dID0gREVTQzkyRF9SQVRFNV81TSwKKwkubWFwc1tSVExfUkNfQ0NLX1JBVEUxMU1dID0gREVTQzkyRF9SQVRFMTFNLAorCS5tYXBzW1JUTF9SQ19PRkRNX1JBVEU2TV0gPSBERVNDOTJEX1JBVEU2TSwKKwkubWFwc1tSVExfUkNfT0ZETV9SQVRFOU1dID0gREVTQzkyRF9SQVRFOU0sCisJLm1hcHNbUlRMX1JDX09GRE1fUkFURTEyTV0gPSBERVNDOTJEX1JBVEUxMk0sCisJLm1hcHNbUlRMX1JDX09GRE1fUkFURTE4TV0gPSBERVNDOTJEX1JBVEUxOE0sCisJLm1hcHNbUlRMX1JDX09GRE1fUkFURTI0TV0gPSBERVNDOTJEX1JBVEUyNE0sCisJLm1hcHNbUlRMX1JDX09GRE1fUkFURTM2TV0gPSBERVNDOTJEX1JBVEUzNk0sCisJLm1hcHNbUlRMX1JDX09GRE1fUkFURTQ4TV0gPSBERVNDOTJEX1JBVEU0OE0sCisJLm1hcHNbUlRMX1JDX09GRE1fUkFURTU0TV0gPSBERVNDOTJEX1JBVEU1NE0sCisKKwkubWFwc1tSVExfUkNfSFRfUkFURU1DUzddID0gREVTQzkyRF9SQVRFTUNTNywKKwkubWFwc1tSVExfUkNfSFRfUkFURU1DUzE1XSA9IERFU0M5MkRfUkFURU1DUzE1LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0bDkyZGVfcGNpX2lkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1JUTF9QQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywgMHg4MTkzLCBydGw5MmRlX2hhbF9jZmcpfSwKKwl7UlRMX1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLCAweDAwMkIsIHJ0bDkyZGVfaGFsX2NmZyl9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0bDkyZGVfcGNpX2lkcyk7CisKK01PRFVMRV9BVVRIT1IoImxpemhhb21pbmcJPGNoYW9taW5nX2xpQHJlYWxzaWwuY29tLmNuPiIpOworTU9EVUxFX0FVVEhPUigiUmVhbHRlayBXbGFuRkFFCTx3bGFuZmFlQHJlYWx0ZWsuY29tPiIpOworTU9EVUxFX0FVVEhPUigiTGFycnkgRmluZ2VyCTxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWFsdGVrIDgxOTJERSA4MDIuMTFuIER1YWwgTWFjIFBDSSB3aXJlbGVzcyIpOworTU9EVUxFX0ZJUk1XQVJFKCJydGx3aWZpL3J0bDgxOTJkZWZ3LmJpbiIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoc3dlbmMsIHJ0bDkyZGVfbW9kX3BhcmFtcy5zd19jcnlwdG8sIGJvb2wsIDA0NDQpOworbW9kdWxlX3BhcmFtX25hbWVkKGlwcywgcnRsOTJkZV9tb2RfcGFyYW1zLmluYWN0aXZlcHMsIGJvb2wsIDA0NDQpOworbW9kdWxlX3BhcmFtX25hbWVkKHN3bHBzLCBydGw5MmRlX21vZF9wYXJhbXMuc3djdHJsX2xwcywgYm9vbCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZndscHMsIHJ0bDkyZGVfbW9kX3BhcmFtcy5md2N0cmxfbHBzLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3dlbmMsICJ1c2luZyBoYXJkd2FyZSBjcnlwdG8gKGRlZmF1bHQgMCBbaGFyZHdhcmVdKVxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGlwcywgInVzaW5nIG5vIGxpbmsgcG93ZXIgc2F2ZSAoZGVmYXVsdCAxIGlzIG9wZW4pXG4iKTsKK01PRFVMRV9QQVJNX0RFU0Moc3dscHMsICJ1c2luZyBsaW5rZWQgc3cgY29udHJvbCBwb3dlciBzYXZlIChkZWZhdWx0IDEiCisJCSAiIGlzIG9wZW4pXG4iKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJ0bDkyZGVfZHJpdmVyID0geworCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJLmlkX3RhYmxlID0gcnRsOTJkZV9wY2lfaWRzLAorCS5wcm9iZSA9IHJ0bF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IHJ0bF9wY2lfZGlzY29ubmVjdCwKKworI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gcnRsX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUgPSBydGxfcGNpX3Jlc3VtZSwKKyNlbmRpZgorCit9OworCisvKiBhZGQgZ2xvYmFsIHNwaW4gbG9jayB0byBzb2x2ZSB0aGUgcHJvYmxlbSB0aGF0CisgKiBEdWwgbWFjIHJlZ2lzdGVyIG9wZXJhdGlvbiBvbiB0aGUgc2FtZSB0aW1lICovCitzcGlubG9ja190IGdsb2JhbG11dGV4X3Bvd2VyOworc3BpbmxvY2tfdCBnbG9iYWxtdXRleF9mb3JfZndkb3dubG9hZDsKK3NwaW5sb2NrX3QgZ2xvYmFsbXV0ZXhfZm9yX3Bvd2VyX2FuZF9lZnVzZTsKKworc3RhdGljIGludCBfX2luaXQgcnRsOTJkZV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2luaXQoJmdsb2JhbG11dGV4X3Bvd2VyKTsKKwlzcGluX2xvY2tfaW5pdCgmZ2xvYmFsbXV0ZXhfZm9yX2Z3ZG93bmxvYWQpOworCXNwaW5fbG9ja19pbml0KCZnbG9iYWxtdXRleF9mb3JfcG93ZXJfYW5kX2VmdXNlKTsKKworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnJ0bDkyZGVfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlSVF9BU1NFUlQoZmFsc2UsICgiOiBObyBkZXZpY2UgZm91bmRcbiIpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRsOTJkZV9tb2R1bGVfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcnRsOTJkZV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChydGw5MmRlX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHJ0bDkyZGVfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvc3cuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3N3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1ZTQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3N3LmgKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19SVEw5MkRFX1NXX0hfXworI2RlZmluZSBfX1JUTDkyREVfU1dfSF9fCisKK2V4dGVybiBzcGlubG9ja190IGdsb2JhbG11dGV4X3Bvd2VyOworZXh0ZXJuIHNwaW5sb2NrX3QgZ2xvYmFsbXV0ZXhfZm9yX2Z3ZG93bmxvYWQ7CitleHRlcm4gc3BpbmxvY2tfdCBnbG9iYWxtdXRleF9mb3JfcG93ZXJfYW5kX2VmdXNlOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3RhYmxlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZDdmOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS90YWJsZS5jCkBAIC0wLDAgKzEsMTY5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5LTIwMTAgIFJlYWx0ZWsgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogUmVhbHRlayBDb3Jwb3JhdGlvbiwgTm8uIDIsIElubm92YXRpb24gUm9hZCBJSSwgSHNpbmNodSBTY2llbmNlIFBhcmssCisgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgorICoKKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKiBDcmVhdGVkIG9uICAyMDEwLzEyLzIzLCAgNjozOAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgInRhYmxlLmgiCisKK3UzMiBydGw4MTkyZGVfcGh5X3JlZ18ydGFycmF5W1BIWV9SRUdfMlRfQVJSQVlMRU5HVEhdID0geworCTB4MDI0LCAweDAwMTE4MDBkLAorCTB4MDI4LCAweDAwZmZkYjgzLAorCTB4MDE0LCAweDA4OGJhOTU1LAorCTB4MDEwLCAweDQ5MDIyYjAzLAorCTB4ODAwLCAweDgwMDQwMDAyLAorCTB4ODA0LCAweDAwMDAwMDAzLAorCTB4ODA4LCAweDAwMDBmYzAwLAorCTB4ODBjLCAweDAwMDAwMDBhLAorCTB4ODEwLCAweDgwNzA2Mzg4LAorCTB4ODE0LCAweDAyMGMzZDEwLAorCTB4ODE4LCAweDAyMjAwMzg1LAorCTB4ODFjLCAweDAwMDAwMDAwLAorCTB4ODIwLCAweDAxMDAwMTAwLAorCTB4ODI0LCAweDAwMzkwMDA0LAorCTB4ODI4LCAweDAxMDAwMTAwLAorCTB4ODJjLCAweDAwMzkwMDA0LAorCTB4ODMwLCAweDI3MjcyNzI3LAorCTB4ODM0LCAweDI3MjcyNzI3LAorCTB4ODM4LCAweDI3MjcyNzI3LAorCTB4ODNjLCAweDI3MjcyNzI3LAorCTB4ODQwLCAweDAwMDEwMDAwLAorCTB4ODQ0LCAweDAwMDEwMDAwLAorCTB4ODQ4LCAweDI3MjcyNzI3LAorCTB4ODRjLCAweDI3MjcyNzI3LAorCTB4ODUwLCAweDAwMDAwMDAwLAorCTB4ODU0LCAweDAwMDAwMDAwLAorCTB4ODU4LCAweDU2OWE1NjlhLAorCTB4ODVjLCAweDBjMWIyNWE0LAorCTB4ODYwLCAweDY2ZTYwMjMwLAorCTB4ODY0LCAweDA2MWYwMTMwLAorCTB4ODY4LCAweDI3MjcyNzI3LAorCTB4ODZjLCAweDI3MmIyYjJiLAorCTB4ODcwLCAweDA3MDAwNzAwLAorCTB4ODc0LCAweDIyMTg4MDAwLAorCTB4ODc4LCAweDA4MDgwODA4LAorCTB4ODdjLCAweDAwMDA3ZmY4LAorCTB4ODgwLCAweGMwMDgzMDcwLAorCTB4ODg0LCAweDAwMDAwY2Q1LAorCTB4ODg4LCAweDAwMDAwMDAwLAorCTB4ODhjLCAweGNjMDAwMGMwLAorCTB4ODkwLCAweDAwMDAwODAwLAorCTB4ODk0LCAweGZmZmZmZmZlLAorCTB4ODk4LCAweDQwMzAyMDEwLAorCTB4ODljLCAweDAwNzA2MDUwLAorCTB4OTAwLCAweDAwMDAwMDAwLAorCTB4OTA0LCAweDAwMDAwMDIzLAorCTB4OTA4LCAweDAwMDAwMDAwLAorCTB4OTBjLCAweDgxMTIxMzEzLAorCTB4YTAwLCAweDAwZDA0N2M4LAorCTB4YTA0LCAweDgwZmYwMDBjLAorCTB4YTA4LCAweDhjODM4MzAwLAorCTB4YTBjLCAweDJlNjgxMjBmLAorCTB4YTEwLCAweDk1MDBiYjc4LAorCTB4YTE0LCAweDExMTQ0MDI4LAorCTB4YTE4LCAweDAwODgxMTE3LAorCTB4YTFjLCAweDg5MTQwZjAwLAorCTB4YTIwLCAweDFhMWIwMDAwLAorCTB4YTI0LCAweDA5MGUxMzE3LAorCTB4YTI4LCAweDAwMDAwMjA0LAorCTB4YTJjLCAweDAwZDMwMDAwLAorCTB4YTcwLCAweDEwMWZiZjAwLAorCTB4YTc0LCAweDAwMDAwMDA3LAorCTB4YzAwLCAweDQwMDcxZDQwLAorCTB4YzA0LCAweDAzYTA1NjMzLAorCTB4YzA4LCAweDAwMTAwMGU0LAorCTB4YzBjLCAweDZjNmM2YzZjLAorCTB4YzEwLCAweDA4ODAwMDAwLAorCTB4YzE0LCAweDQwMDAwMTAwLAorCTB4YzE4LCAweDA4ODAwMDAwLAorCTB4YzFjLCAweDQwMDAwMTAwLAorCTB4YzIwLCAweDAwMDAwMDAwLAorCTB4YzI0LCAweDAwMDAwMDAwLAorCTB4YzI4LCAweDAwMDAwMDAwLAorCTB4YzJjLCAweDAwMDAwMDAwLAorCTB4YzMwLCAweDY5ZTlhYzQ0LAorCTB4YzM0LCAweDQ2OTY1MmNmLAorCTB4YzM4LCAweDQ5Nzk1OTk0LAorCTB4YzNjLCAweDBhOTc5NzE4LAorCTB4YzQwLCAweDFmN2M0MDNmLAorCTB4YzQ0LCAweDAwMDEwMGI3LAorCTB4YzQ4LCAweGVjMDIwMTA3LAorCTB4YzRjLCAweDAwN2YwMzdmLAorCTB4YzUwLCAweDY5NTQzNDIwLAorCTB4YzU0LCAweDQzYmMwMDllLAorCTB4YzU4LCAweDY5NTQzNDIwLAorCTB4YzVjLCAweDQzM2MwMGE4LAorCTB4YzYwLCAweDAwMDAwMDAwLAorCTB4YzY0LCAweDUxMTY4NDhiLAorCTB4YzY4LCAweDQ3YzAwYmZmLAorCTB4YzZjLCAweDAwMDAwMDM2LAorCTB4YzcwLCAweDJjN2YwMDBkLAorCTB4Yzc0LCAweDA1ODYxMGRiLAorCTB4Yzc4LCAweDAwMDAwMDFmLAorCTB4YzdjLCAweDQwYjk1NjEyLAorCTB4YzgwLCAweDQwMDAwMTAwLAorCTB4Yzg0LCAweDIwZjYwMDAwLAorCTB4Yzg4LCAweDQwMDAwMTAwLAorCTB4YzhjLCAweDIwZTAwMDAwLAorCTB4YzkwLCAweDAwMTIxODIwLAorCTB4Yzk0LCAweDAwMDAwMDA3LAorCTB4Yzk4LCAweDAwMTIxODIwLAorCTB4YzljLCAweDAwMDA3ZjdmLAorCTB4Y2EwLCAweDAwMDAwMDAwLAorCTB4Y2E0LCAweDAwMDAwMDgwLAorCTB4Y2E4LCAweDAwMDAwMDAwLAorCTB4Y2FjLCAweDAwMDAwMDAwLAorCTB4Y2IwLCAweDAwMDAwMDAwLAorCTB4Y2I0LCAweDAwMDAwMDAwLAorCTB4Y2I4LCAweDAwMDAwMDAwLAorCTB4Y2JjLCAweDI4MDAwMDAwLAorCTB4Y2MwLCAweDAwMDAwMDAwLAorCTB4Y2M0LCAweDAwMDAwMDAwLAorCTB4Y2M4LCAweDAwMDAwMDAwLAorCTB4Y2NjLCAweDAwMDAwMDAwLAorCTB4Y2QwLCAweDAwMDAwMDAwLAorCTB4Y2Q0LCAweDAwMDAwMDAwLAorCTB4Y2Q4LCAweDY0YjExZTIwLAorCTB4Y2RjLCAweGU4NzY3NTMzLAorCTB4Y2UwLCAweDAwMjIyMjIyLAorCTB4Y2U0LCAweDAwMDAwMDAwLAorCTB4Y2U4LCAweDM3NjQ0MzAyLAorCTB4Y2VjLCAweDJmOTdkNDBjLAorCTB4ZDAwLCAweDAwMDgwNzQwLAorCTB4ZDA0LCAweDAwMDIwNDAzLAorCTB4ZDA4LCAweDAwMDA5MDdmLAorCTB4ZDBjLCAweDIwMDEwMjAxLAorCTB4ZDEwLCAweGEwNjMzMzMzLAorCTB4ZDE0LCAweDMzMzNiYzQzLAorCTB4ZDE4LCAweDdhOGY1YjZiLAorCTB4ZDJjLCAweGNjOTc5OTc1LAorCTB4ZDMwLCAweDAwMDAwMDAwLAorCTB4ZDM0LCAweDgwNjA4NDA0LAorCTB4ZDM4LCAweDAwMDAwMDAwLAorCTB4ZDNjLCAweDAwMDI3MjkzLAorCTB4ZDQwLCAweDAwMDAwMDAwLAorCTB4ZDQ0LCAweDAwMDAwMDAwLAorCTB4ZDQ4LCAweDAwMDAwMDAwLAorCTB4ZDRjLCAweDAwMDAwMDAwLAorCTB4ZDUwLCAweDY0MzcxNDBhLAorCTB4ZDU0LCAweDAwMDAwMDAwLAorCTB4ZDU4LCAweDAwMDAwMDAwLAorCTB4ZDVjLCAweDMwMDMyMDY0LAorCTB4ZDYwLCAweDQ2NTNkZTY4LAorCTB4ZDY0LCAweDA0NTE4YTNjLAorCTB4ZDY4LCAweDAwMDAyMTAxLAorCTB4ZDZjLCAweDJhMjAxYzE2LAorCTB4ZDcwLCAweDE4MTIzNjJlLAorCTB4ZDc0LCAweDMyMmMyMjIwLAorCTB4ZDc4LCAweDAwMGUzYzI0LAorCTB4ZTAwLCAweDJhMmEyYTJhLAorCTB4ZTA0LCAweDJhMmEyYTJhLAorCTB4ZTA4LCAweDAzOTAyYTJhLAorCTB4ZTEwLCAweDJhMmEyYTJhLAorCTB4ZTE0LCAweDJhMmEyYTJhLAorCTB4ZTE4LCAweDJhMmEyYTJhLAorCTB4ZTFjLCAweDJhMmEyYTJhLAorCTB4ZTI4LCAweDAwMDAwMDAwLAorCTB4ZTMwLCAweDEwMDBkYzFmLAorCTB4ZTM0LCAweDEwMDA4YzFmLAorCTB4ZTM4LCAweDAyMTQwMTAyLAorCTB4ZTNjLCAweDY4MTYwNGMyLAorCTB4ZTQwLCAweDAxMDA3YzAwLAorCTB4ZTQ0LCAweDAxMDA0ODAwLAorCTB4ZTQ4LCAweGZiMDAwMDAwLAorCTB4ZTRjLCAweDAwMDAyOGQxLAorCTB4ZTUwLCAweDEwMDBkYzFmLAorCTB4ZTU0LCAweDEwMDA4YzFmLAorCTB4ZTU4LCAweDAyMTQwMTAyLAorCTB4ZTVjLCAweDI4MTYwZDA1LAorCTB4ZTYwLCAweDAwMDAwMDEwLAorCTB4ZTY4LCAweDAwMWIyNWE0LAorCTB4ZTZjLCAweDYzZGIyNWE0LAorCTB4ZTcwLCAweDYzZGIyNWE0LAorCTB4ZTc0LCAweDBjMTI2ZGE0LAorCTB4ZTc4LCAweDBjMTI2ZGE0LAorCTB4ZTdjLCAweDBjMTI2ZGE0LAorCTB4ZTgwLCAweDBjMTI2ZGE0LAorCTB4ZTg0LCAweDYzZGIyNWE0LAorCTB4ZTg4LCAweDBjMTI2ZGE0LAorCTB4ZThjLCAweDYzZGIyNWE0LAorCTB4ZWQwLCAweDYzZGIyNWE0LAorCTB4ZWQ0LCAweDYzZGIyNWE0LAorCTB4ZWQ4LCAweDYzZGIyNWE0LAorCTB4ZWRjLCAweDAwMWIyNWE0LAorCTB4ZWUwLCAweDAwMWIyNWE0LAorCTB4ZWVjLCAweDZmZGIyNWE0LAorCTB4ZjE0LCAweDAwMDAwMDAzLAorCTB4ZjFjLCAweDAwMDAwMDY0LAorCTB4ZjRjLCAweDAwMDAwMDA0LAorCTB4ZjAwLCAweDAwMDAwMzAwLAorfTsKKwordTMyIHJ0bDgxOTJkZV9waHlfcmVnX2FycmF5X3BnW1BIWV9SRUdfQVJSQVlfUEdfTEVOR1RIXSA9IHsKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwNzA5MGMwYywKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMTAyMDQwNSwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwYjBjMGMwZSwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMTAzMDUwNiwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwYjBjMGQwZSwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMTAzMDUwOSwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwNzA5MGMwYywKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMTAyMDQwNSwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwYjBjMGMwZSwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMTAzMDUwNiwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwYjBjMGQwZSwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMTAzMDUwOSwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwNjA2MDYwNiwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDQwNiwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwNjA2MDYwNiwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAyMDQwNiwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUwMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDgzMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKKwkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKKwkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKKwkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKKwkweDgzYywgMHhmZmZmZmZmZiwgMHgwODA4MDgwOCwKKwkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDA0MDQwOCwKKwkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKKwkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKK307CisKK3UzMiBydGw4MTkyZGVfcmFkaW9hXzJ0YXJyYXlbUkFESU9BXzJUX0FSUkFZTEVOR1RIXSA9IHsKKwkweDAwMCwgMHgwMDAzMDAwMCwKKwkweDAwMSwgMHgwMDAzMDAwMCwKKwkweDAwMiwgMHgwMDAwMDAwMCwKKwkweDAwMywgMHgwMDAxOGM2MywKKwkweDAwNCwgMHgwMDAxOGM2MywKKwkweDAwOCwgMHgwMDA4NDAwMCwKKwkweDAwYiwgMHgwMDAxYzAwMCwKKwkweDAwZSwgMHgwMDAxOGM2NywKKwkweDAwZiwgMHgwMDAwMDg1MSwKKwkweDAxNCwgMHgwMDAyMTQ0MCwKKwkweDAxOCwgMHgwMDAxNzUyNCwKKwkweDAxOSwgMHgwMDAwMDAwMCwKKwkweDAxZCwgMHgwMDBhMTI5MCwKKwkweDAyMywgMHgwMDAwMTU1OCwKKwkweDAxYSwgMHgwMDAzMGE5OSwKKwkweDAxYiwgMHgwMDA0MGIwMCwKKwkweDAxYywgMHgwMDBmYzMzOSwKKwkweDAzYSwgMHgwMDBhNTdlYiwKKwkweDAzYiwgMHgwMDAyMDAwMCwKKwkweDAzYywgMHgwMDBmZjQ1NCwKKwkweDAyMCwgMHgwMDAwYWE1MiwKKwkweDAyMSwgMHgwMDA1NDAwMCwKKwkweDA0MCwgMHgwMDAwYWE1MiwKKwkweDA0MSwgMHgwMDAxNDAwMCwKKwkweDAyNSwgMHgwMDA4MDNiZSwKKwkweDAyNiwgMHgwMDBmYzYzOCwKKwkweDAyNywgMHgwMDA3N2MxOCwKKwkweDAyOCwgMHgwMDBkZTQ3MSwKKwkweDAyOSwgMHgwMDBkNzExMCwKKwkweDAyYSwgMHgwMDA4Y2IwNCwKKwkweDAyYiwgMHgwMDA0MTI4YiwKKwkweDAyYywgMHgwMDAwMTg0MCwKKwkweDA0MywgMHgwMDAyNDQ0ZiwKKwkweDA0NCwgMHgwMDAxYWRiMCwKKwkweDA0NSwgMHgwMDA1NjQ2NywKKwkweDA0NiwgMHgwMDA4OTkyYywKKwkweDA0NywgMHgwMDAwNDUyYywKKwkweDA0OCwgMHgwMDBmOWM0MywKKwkweDA0OSwgMHgwMDAwMmUwYywKKwkweDA0YSwgMHgwMDA1NDZlYiwKKwkweDA0YiwgMHgwMDA4OTY2YywKKwkweDA0YywgMHgwMDAwZGRlOSwKKwkweDAxOCwgMHgwMDAwNzQwMSwKKwkweDAwMCwgMHgwMDA3MDAwMCwKKwkweDAxMiwgMHgwMDBkYzAwMCwKKwkweDAxMiwgMHgwMDA5MDAwMCwKKwkweDAxMiwgMHgwMDA1MTAwMCwKKwkweDAxMiwgMHgwMDAxMjAwMCwKKwkweDAxMywgMHgwMDAyODdiNywKKwkweDAxMywgMHgwMDAyNDdhYiwKKwkweDAxMywgMHgwMDAyMDc5ZiwKKwkweDAxMywgMHgwMDAxYzc5MywKKwkweDAxMywgMHgwMDAxODM5YiwKKwkweDAxMywgMHgwMDAxNDM5MiwKKwkweDAxMywgMHgwMDAxMDE5YSwKKwkweDAxMywgMHgwMDAwYzE5MSwKKwkweDAxMywgMHgwMDAwODE5NCwKKwkweDAxMywgMHgwMDAwNDBhMCwKKwkweDAxMywgMHgwMDAwMDAxOCwKKwkweDAxNSwgMHgwMDAwZjQyNCwKKwkweDAxNSwgMHgwMDA0ZjQyNCwKKwkweDAxNSwgMHgwMDA4ZjQyNCwKKwkweDAxNiwgMHgwMDBlMTMzMCwKKwkweDAxNiwgMHgwMDBhMTMzMCwKKwkweDAxNiwgMHgwMDA2MTMzMCwKKwkweDAxNiwgMHgwMDAyMTMzMCwKKwkweDAxOCwgMHgwMDAxNzUyNCwKKwkweDAwMCwgMHgwMDA3MDAwMCwKKwkweDAxMiwgMHgwMDBjZjAwMCwKKwkweDAxMiwgMHgwMDBiYzAwMCwKKwkweDAxMiwgMHgwMDA3ODAwMCwKKwkweDAxMiwgMHgwMDAwMDAwMCwKKwkweDAxMywgMHgwMDAyODdiYywKKwkweDAxMywgMHgwMDAyNDdiMCwKKwkweDAxMywgMHgwMDAyMDNiNCwKKwkweDAxMywgMHgwMDAxYzNhOCwKKwkweDAxMywgMHgwMDAxODFiNCwKKwkweDAxMywgMHgwMDAxNDFhOCwKKwkweDAxMywgMHgwMDAxMDBiMCwKKwkweDAxMywgMHgwMDAwYzBhNCwKKwkweDAxMywgMHgwMDAwYjAyYywKKwkweDAxMywgMHgwMDAwNDAyMCwKKwkweDAxMywgMHgwMDAwMDAxNCwKKwkweDAxNSwgMHgwMDAwZjRjMywKKwkweDAxNSwgMHgwMDA0ZjRjMywKKwkweDAxNSwgMHgwMDA4ZjRjMywKKwkweDAxNiwgMHgwMDBlMDg1ZiwKKwkweDAxNiwgMHgwMDBhMDg1ZiwKKwkweDAxNiwgMHgwMDA2MDg1ZiwKKwkweDAxNiwgMHgwMDAyMDg1ZiwKKwkweDAxOCwgMHgwMDAzNzUyNCwKKwkweDAwMCwgMHgwMDA3MDAwMCwKKwkweDAxMiwgMHgwMDBjZjAwMCwKKwkweDAxMiwgMHgwMDBiYzAwMCwKKwkweDAxMiwgMHgwMDA3ODAwMCwKKwkweDAxMiwgMHgwMDAwMDAwMCwKKwkweDAxMywgMHgwMDAyODdiYywKKwkweDAxMywgMHgwMDAyNDdiMCwKKwkweDAxMywgMHgwMDAyMDNiNCwKKwkweDAxMywgMHgwMDAxYzNhOCwKKwkweDAxMywgMHgwMDAxODFiNCwKKwkweDAxMywgMHgwMDAxNDFhOCwKKwkweDAxMywgMHgwMDAxMDBiMCwKKwkweDAxMywgMHgwMDAwYzBhNCwKKwkweDAxMywgMHgwMDAwYjAyYywKKwkweDAxMywgMHgwMDAwNDAyMCwKKwkweDAxMywgMHgwMDAwMDAxNCwKKwkweDAxNSwgMHgwMDAwZjRjMywKKwkweDAxNSwgMHgwMDA0ZjRjMywKKwkweDAxNSwgMHgwMDA4ZjRjMywKKwkweDAxNiwgMHgwMDBlMDg1ZiwKKwkweDAxNiwgMHgwMDBhMDg1ZiwKKwkweDAxNiwgMHgwMDA2MDg1ZiwKKwkweDAxNiwgMHgwMDAyMDg1ZiwKKwkweDAxOCwgMHgwMDA1NzU2OCwKKwkweDAwMCwgMHgwMDA3MDAwMCwKKwkweDAxMiwgMHgwMDBjZjAwMCwKKwkweDAxMiwgMHgwMDBiYzAwMCwKKwkweDAxMiwgMHgwMDA3ODAwMCwKKwkweDAxMiwgMHgwMDAwMDAwMCwKKwkweDAxMywgMHgwMDAyODdiYywKKwkweDAxMywgMHgwMDAyNDdiMCwKKwkweDAxMywgMHgwMDAyMDNiNCwKKwkweDAxMywgMHgwMDAxYzNhOCwKKwkweDAxMywgMHgwMDAxODFiNCwKKwkweDAxMywgMHgwMDAxNDFhOCwKKwkweDAxMywgMHgwMDAxMDBiMCwKKwkweDAxMywgMHgwMDAwYzBhNCwKKwkweDAxMywgMHgwMDAwYjAyYywKKwkweDAxMywgMHgwMDAwNDAyMCwKKwkweDAxMywgMHgwMDAwMDAxNCwKKwkweDAxNSwgMHgwMDAwZjRjMywKKwkweDAxNSwgMHgwMDA0ZjRjMywKKwkweDAxNSwgMHgwMDA4ZjRjMywKKwkweDAxNiwgMHgwMDBlMDg1ZiwKKwkweDAxNiwgMHgwMDBhMDg1ZiwKKwkweDAxNiwgMHgwMDA2MDg1ZiwKKwkweDAxNiwgMHgwMDAyMDg1ZiwKKwkweDAzMCwgMHgwMDA0NDcwZiwKKwkweDAzMSwgMHgwMDA0NGZmMCwKKwkweDAzMiwgMHgwMDAwMDA3MCwKKwkweDAzMywgMHgwMDBkZDQ4MCwKKwkweDAzNCwgMHgwMDBmZmFjMCwKKwkweDAzNSwgMHgwMDBiODBjMCwKKwkweDAzNiwgMHgwMDA3NzAwMCwKKwkweDAzNywgMHgwMDA2NGZmMiwKKwkweDAzOCwgMHgwMDBlNzY2MSwKKwkweDAzOSwgMHgwMDAwMGU5MCwKKwkweDAwMCwgMHgwMDAzMDAwMCwKKwkweDAxOCwgMHgwMDAwZjQwMSwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDAxZSwgMHgwMDA4ODAwOSwKKwkweDAxZiwgMHgwMDA4MDAwMywKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDAxZSwgMHgwMDA4ODAwMSwKKwkweDAxZiwgMHgwMDA4MDAwMCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDAxOCwgMHgwMDA5NzUyNCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDAyYiwgMHgwMDA0MTI4OSwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDAyZCwgMHgwMDA2YWFhYSwKKwkweDAyZSwgMHgwMDBiNGQwMSwKKwkweDAyZCwgMHgwMDA4MDAwMCwKKwkweDAyZSwgMHgwMDAwNGQwMiwKKwkweDAyZCwgMHgwMDA5NTU1NSwKKwkweDAyZSwgMHgwMDA1NGQwMywKKwkweDAyZCwgMHgwMDBhYWFhYSwKKwkweDAyZSwgMHgwMDBiNGQwNCwKKwkweDAyZCwgMHgwMDBjMDAwMCwKKwkweDAyZSwgMHgwMDAwNGQwNSwKKwkweDAyZCwgMHgwMDBkNTU1NSwKKwkweDAyZSwgMHgwMDA1NGQwNiwKKwkweDAyZCwgMHgwMDBlYWFhYSwKKwkweDAyZSwgMHgwMDBiNGQwNywKKwkweDAyZCwgMHgwMDAwMDAwMCwKKwkweDAyZSwgMHgwMDAwNTEwOCwKKwkweDAyZCwgMHgwMDAxNTU1NSwKKwkweDAyZSwgMHgwMDA1NTEwOSwKKwkweDAyZCwgMHgwMDAyYWFhYSwKKwkweDAyZSwgMHgwMDBiNTEwYSwKKwkweDAyZCwgMHgwMDA0MDAwMCwKKwkweDAyZSwgMHgwMDAwNTEwYiwKKwkweDAyZCwgMHgwMDA1NTU1NSwKKwkweDAyZSwgMHgwMDA1NTEwYywKK307CisKK3UzMiBydGw4MTkyZGVfcmFkaW9iXzJ0YXJyYXlbUkFESU9CXzJUX0FSUkFZTEVOR1RIXSA9IHsKKwkweDAwMCwgMHgwMDAzMDAwMCwKKwkweDAwMSwgMHgwMDAzMDAwMCwKKwkweDAwMiwgMHgwMDAwMDAwMCwKKwkweDAwMywgMHgwMDAxOGM2MywKKwkweDAwNCwgMHgwMDAxOGM2MywKKwkweDAwOCwgMHgwMDA4NDAwMCwKKwkweDAwYiwgMHgwMDAxYzAwMCwKKwkweDAwZSwgMHgwMDAxOGM2NywKKwkweDAwZiwgMHgwMDAwMDg1MSwKKwkweDAxNCwgMHgwMDAyMTQ0MCwKKwkweDAxOCwgMHgwMDAwNzQwMSwKKwkweDAxOSwgMHgwMDAwMDA2MCwKKwkweDAxZCwgMHgwMDBhMTI5MCwKKwkweDAyMywgMHgwMDAwMTU1OCwKKwkweDAxYSwgMHgwMDAzMGE5OSwKKwkweDAxYiwgMHgwMDA0MGIwMCwKKwkweDAxYywgMHgwMDBmYzMzOSwKKwkweDAzYSwgMHgwMDBhNTdlYiwKKwkweDAzYiwgMHgwMDAyMDAwMCwKKwkweDAzYywgMHgwMDBmZjQ1NCwKKwkweDAyMCwgMHgwMDAwYWE1MiwKKwkweDAyMSwgMHgwMDA1NDAwMCwKKwkweDA0MCwgMHgwMDAwYWE1MiwKKwkweDA0MSwgMHgwMDAxNDAwMCwKKwkweDAyNSwgMHgwMDA4MDNiZSwKKwkweDAyNiwgMHgwMDBmYzYzOCwKKwkweDAyNywgMHgwMDA3N2MxOCwKKwkweDAyOCwgMHgwMDBkMWMzMSwKKwkweDAyOSwgMHgwMDBkNzExMCwKKwkweDAyYSwgMHgwMDBhZWIwNCwKKwkweDAyYiwgMHgwMDA0MTI4YiwKKwkweDAyYywgMHgwMDAwMTg0MCwKKwkweDA0MywgMHgwMDAyNDQ0ZiwKKwkweDA0NCwgMHgwMDAxYWRiMCwKKwkweDA0NSwgMHgwMDA1NjQ2NywKKwkweDA0NiwgMHgwMDA4OTkyYywKKwkweDA0NywgMHgwMDAwNDUyYywKKwkweDA0OCwgMHgwMDBmOWM0MywKKwkweDA0OSwgMHgwMDAwMmUwYywKKwkweDA0YSwgMHgwMDA1NDZlYiwKKwkweDA0YiwgMHgwMDA4OTY2YywKKwkweDA0YywgMHgwMDAwZGRlOSwKKwkweDAxOCwgMHgwMDAwNzQwMSwKKwkweDAwMCwgMHgwMDA3MDAwMCwKKwkweDAxMiwgMHgwMDBkYzAwMCwKKwkweDAxMiwgMHgwMDA5MDAwMCwKKwkweDAxMiwgMHgwMDA1MTAwMCwKKwkweDAxMiwgMHgwMDAxMjAwMCwKKwkweDAxMywgMHgwMDAyODdiNywKKwkweDAxMywgMHgwMDAyNDdhYiwKKwkweDAxMywgMHgwMDAyMDc5ZiwKKwkweDAxMywgMHgwMDAxYzc5MywKKwkweDAxMywgMHgwMDAxODM5YiwKKwkweDAxMywgMHgwMDAxNDM5MiwKKwkweDAxMywgMHgwMDAxMDE5YSwKKwkweDAxMywgMHgwMDAwYzE5MSwKKwkweDAxMywgMHgwMDAwODE5NCwKKwkweDAxMywgMHgwMDAwNDBhMCwKKwkweDAxMywgMHgwMDAwMDAxOCwKKwkweDAxNSwgMHgwMDAwZjQyNCwKKwkweDAxNSwgMHgwMDA0ZjQyNCwKKwkweDAxNSwgMHgwMDA4ZjQyNCwKKwkweDAxNiwgMHgwMDBlMTMzMCwKKwkweDAxNiwgMHgwMDBhMTMzMCwKKwkweDAxNiwgMHgwMDA2MTMzMCwKKwkweDAxNiwgMHgwMDAyMTMzMCwKKwkweDAxOCwgMHgwMDAxNzUyNCwKKwkweDAwMCwgMHgwMDA3MDAwMCwKKwkweDAxMiwgMHgwMDBjZjAwMCwKKwkweDAxMiwgMHgwMDBiYzAwMCwKKwkweDAxMiwgMHgwMDA3ODAwMCwKKwkweDAxMiwgMHgwMDAwMDAwMCwKKwkweDAxMywgMHgwMDAyODdiYywKKwkweDAxMywgMHgwMDAyNDdiMCwKKwkweDAxMywgMHgwMDAyMDNiNCwKKwkweDAxMywgMHgwMDAxYzNhOCwKKwkweDAxMywgMHgwMDAxODFiNCwKKwkweDAxMywgMHgwMDAxNDFhOCwKKwkweDAxMywgMHgwMDAxMDBiMCwKKwkweDAxMywgMHgwMDAwYzBhNCwKKwkweDAxMywgMHgwMDAwYjAyYywKKwkweDAxMywgMHgwMDAwNDAyMCwKKwkweDAxMywgMHgwMDAwMDAxNCwKKwkweDAxNSwgMHgwMDAwZjRjMywKKwkweDAxNSwgMHgwMDA0ZjRjMywKKwkweDAxNSwgMHgwMDA4ZjRjMywKKwkweDAxNiwgMHgwMDBlMDg1ZiwKKwkweDAxNiwgMHgwMDBhMDg1ZiwKKwkweDAxNiwgMHgwMDA2MDg1ZiwKKwkweDAxNiwgMHgwMDAyMDg1ZiwKKwkweDAxOCwgMHgwMDAzNzUyNCwKKwkweDAwMCwgMHgwMDA3MDAwMCwKKwkweDAxMiwgMHgwMDBjZjAwMCwKKwkweDAxMiwgMHgwMDBiYzAwMCwKKwkweDAxMiwgMHgwMDA3ODAwMCwKKwkweDAxMiwgMHgwMDAwMDAwMCwKKwkweDAxMywgMHgwMDAyODdiYywKKwkweDAxMywgMHgwMDAyNDdiMCwKKwkweDAxMywgMHgwMDAyMDNiNCwKKwkweDAxMywgMHgwMDAxYzNhOCwKKwkweDAxMywgMHgwMDAxODFiNCwKKwkweDAxMywgMHgwMDAxNDFhOCwKKwkweDAxMywgMHgwMDAxMDBiMCwKKwkweDAxMywgMHgwMDAwYzBhNCwKKwkweDAxMywgMHgwMDAwYjAyYywKKwkweDAxMywgMHgwMDAwNDAyMCwKKwkweDAxMywgMHgwMDAwMDAxNCwKKwkweDAxNSwgMHgwMDAwZjRjMywKKwkweDAxNSwgMHgwMDA0ZjRjMywKKwkweDAxNSwgMHgwMDA4ZjRjMywKKwkweDAxNiwgMHgwMDBlMDg1ZiwKKwkweDAxNiwgMHgwMDBhMDg1ZiwKKwkweDAxNiwgMHgwMDA2MDg1ZiwKKwkweDAxNiwgMHgwMDAyMDg1ZiwKKwkweDAxOCwgMHgwMDA1NzUyNCwKKwkweDAwMCwgMHgwMDA3MDAwMCwKKwkweDAxMiwgMHgwMDBjZjAwMCwKKwkweDAxMiwgMHgwMDBiYzAwMCwKKwkweDAxMiwgMHgwMDA3ODAwMCwKKwkweDAxMiwgMHgwMDAwMDAwMCwKKwkweDAxMywgMHgwMDAyODdiYywKKwkweDAxMywgMHgwMDAyNDdiMCwKKwkweDAxMywgMHgwMDAyMDNiNCwKKwkweDAxMywgMHgwMDAxYzNhOCwKKwkweDAxMywgMHgwMDAxODFiNCwKKwkweDAxMywgMHgwMDAxNDFhOCwKKwkweDAxMywgMHgwMDAxMDBiMCwKKwkweDAxMywgMHgwMDAwYzBhNCwKKwkweDAxMywgMHgwMDAwYjAyYywKKwkweDAxMywgMHgwMDAwNDAyMCwKKwkweDAxMywgMHgwMDAwMDAxNCwKKwkweDAxNSwgMHgwMDAwZjRjMywKKwkweDAxNSwgMHgwMDA0ZjRjMywKKwkweDAxNSwgMHgwMDA4ZjRjMywKKwkweDAxNiwgMHgwMDBlMDg1ZiwKKwkweDAxNiwgMHgwMDBhMDg1ZiwKKwkweDAxNiwgMHgwMDA2MDg1ZiwKKwkweDAxNiwgMHgwMDAyMDg1ZiwKKwkweDAzMCwgMHgwMDA0NDcwZiwKKwkweDAzMSwgMHgwMDA0NGZmMCwKKwkweDAzMiwgMHgwMDAwMDA3MCwKKwkweDAzMywgMHgwMDBkZDQ4MCwKKwkweDAzNCwgMHgwMDBmZmFjMCwKKwkweDAzNSwgMHgwMDBiODBjMCwKKwkweDAzNiwgMHgwMDA3NzAwMCwKKwkweDAzNywgMHgwMDA2NGZmMiwKKwkweDAzOCwgMHgwMDBlNzY2MSwKKwkweDAzOSwgMHgwMDAwMGU5MCwKKwkweDAwMCwgMHgwMDAzMDAwMCwKKwkweDAxOCwgMHgwMDAwZjQwMSwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDAxZSwgMHgwMDA4ODAwOSwKKwkweDAxZiwgMHgwMDA4MDAwMywKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDAxZSwgMHgwMDA4ODAwMSwKKwkweDAxZiwgMHgwMDA4MDAwMCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDAxOCwgMHgwMDA4NzQwMSwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDAyYiwgMHgwMDA0MTI4OSwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDAyZCwgMHgwMDA2NjY2NiwKKwkweDAyZSwgMHgwMDA2NDAwMSwKKwkweDAyZCwgMHgwMDA5MTExMSwKKwkweDAyZSwgMHgwMDAxNDAwMiwKKwkweDAyZCwgMHgwMDBiYmJiYiwKKwkweDAyZSwgMHgwMDBiNDAwMywKKwkweDAyZCwgMHgwMDBlNjY2NiwKKwkweDAyZSwgMHgwMDA2NDAwNCwKKwkweDAyZCwgMHgwMDA4ODg4OCwKKwkweDAyZSwgMHgwMDA4NDAwNSwKKwkweDAyZCwgMHgwMDA5ZGRkZCwKKwkweDAyZSwgMHgwMDBkNDAwNiwKKwkweDAyZCwgMHgwMDBiMzMzMywKKwkweDAyZSwgMHgwMDAzNDAwNywKKwkweDAyZCwgMHgwMDA0ODg4OCwKKwkweDAyZSwgMHgwMDA4NDQwOCwKKwkweDAyZCwgMHgwMDBiYmJiYiwKKwkweDAyZSwgMHgwMDBiNDQwOSwKKwkweDAyZCwgMHgwMDBlNjY2NiwKKwkweDAyZSwgMHgwMDA2NDQwYSwKKwkweDAyZCwgMHgwMDAxMTExMSwKKwkweDAyZSwgMHgwMDAxNDgwYiwKKwkweDAyZCwgMHgwMDAzYmJiYiwKKwkweDAyZSwgMHgwMDBiNDgwYywKKwkweDAyZCwgMHgwMDA2NjY2NiwKKwkweDAyZSwgMHgwMDA2NDgwZCwKKwkweDAyZCwgMHgwMDBjY2NjYywKKwkweDAyZSwgMHgwMDBjNDgwZSwKK307CisKK3UzMiBydGw4MTkyZGVfcmFkaW9hXzJ0X2ludF9wYWFycmF5W1JBRElPQV8yVF9JTlRfUEFfQVJSQVlMRU5HVEhdID0geworCTB4MDAwLCAweDAwMDMwMDAwLAorCTB4MDAxLCAweDAwMDMwMDAwLAorCTB4MDAyLCAweDAwMDAwMDAwLAorCTB4MDAzLCAweDAwMDE4YzYzLAorCTB4MDA0LCAweDAwMDE4YzYzLAorCTB4MDA4LCAweDAwMDg0MDAwLAorCTB4MDBiLCAweDAwMDFjMDAwLAorCTB4MDBlLCAweDAwMDE4YzY3LAorCTB4MDBmLCAweDAwMDAwODUxLAorCTB4MDE0LCAweDAwMDIxNDQwLAorCTB4MDE4LCAweDAwMDE3NTI0LAorCTB4MDE5LCAweDAwMDAwMDAwLAorCTB4MDFkLCAweDAwMGExMjkwLAorCTB4MDIzLCAweDAwMDAxNTU4LAorCTB4MDFhLCAweDAwMDMwYTk5LAorCTB4MDFiLCAweDAwMDQwYjAwLAorCTB4MDFjLCAweDAwMGZjMzM5LAorCTB4MDNhLCAweDAwMGE1N2ViLAorCTB4MDNiLCAweDAwMDIwMDAwLAorCTB4MDNjLCAweDAwMGZmNDU0LAorCTB4MDIwLCAweDAwMDBhYTUyLAorCTB4MDIxLCAweDAwMDU0MDAwLAorCTB4MDQwLCAweDAwMDBhYTUyLAorCTB4MDQxLCAweDAwMDE0MDAwLAorCTB4MDI1LCAweDAwMDgwM2JlLAorCTB4MDI2LCAweDAwMGZjNjM4LAorCTB4MDI3LCAweDAwMDc3YzE4LAorCTB4MDI4LCAweDAwMGRlNDcxLAorCTB4MDI5LCAweDAwMGQ3MTEwLAorCTB4MDJhLCAweDAwMDhlYjA0LAorCTB4MDJiLCAweDAwMDQxMjhiLAorCTB4MDJjLCAweDAwMDAxODQwLAorCTB4MDQzLCAweDAwMDI0NDRmLAorCTB4MDQ0LCAweDAwMDFhZGIwLAorCTB4MDQ1LCAweDAwMDU2NDY3LAorCTB4MDQ2LCAweDAwMDg5OTJjLAorCTB4MDQ3LCAweDAwMDA0NTJjLAorCTB4MDQ4LCAweDAwMGMwNDQzLAorCTB4MDQ5LCAweDAwMDAwNzMwLAorCTB4MDRhLCAweDAwMDUwZjBmLAorCTB4MDRiLCAweDAwMDg5NmVlLAorCTB4MDRjLCAweDAwMDBkZGVlLAorCTB4MDE4LCAweDAwMDA3NDAxLAorCTB4MDAwLCAweDAwMDcwMDAwLAorCTB4MDEyLCAweDAwMGRjMDAwLAorCTB4MDEyLCAweDAwMDkwMDAwLAorCTB4MDEyLCAweDAwMDUxMDAwLAorCTB4MDEyLCAweDAwMDEyMDAwLAorCTB4MDEzLCAweDAwMDI4N2I3LAorCTB4MDEzLCAweDAwMDI0N2FiLAorCTB4MDEzLCAweDAwMDIwNzlmLAorCTB4MDEzLCAweDAwMDFjNzkzLAorCTB4MDEzLCAweDAwMDE4MzliLAorCTB4MDEzLCAweDAwMDE0MzkyLAorCTB4MDEzLCAweDAwMDEwMTlhLAorCTB4MDEzLCAweDAwMDBjMTkxLAorCTB4MDEzLCAweDAwMDA4MTk0LAorCTB4MDEzLCAweDAwMDA0MGEwLAorCTB4MDEzLCAweDAwMDAwMDE4LAorCTB4MDE1LCAweDAwMDBmNDI0LAorCTB4MDE1LCAweDAwMDRmNDI0LAorCTB4MDE1LCAweDAwMDhmNDI0LAorCTB4MDE2LCAweDAwMGUxMzMwLAorCTB4MDE2LCAweDAwMGExMzMwLAorCTB4MDE2LCAweDAwMDYxMzMwLAorCTB4MDE2LCAweDAwMDIxMzMwLAorCTB4MDE4LCAweDAwMDE3NTI0LAorCTB4MDAwLCAweDAwMDcwMDAwLAorCTB4MDEyLCAweDAwMGNmMDAwLAorCTB4MDEyLCAweDAwMGJjMDAwLAorCTB4MDEyLCAweDAwMDc4MDAwLAorCTB4MDEyLCAweDAwMDAwMDAwLAorCTB4MDEzLCAweDAwMDI4N2JmLAorCTB4MDEzLCAweDAwMDI0N2IzLAorCTB4MDEzLCAweDAwMDIwN2E3LAorCTB4MDEzLCAweDAwMDFjNzliLAorCTB4MDEzLCAweDAwMDE4MzlmLAorCTB4MDEzLCAweDAwMDE0MzkzLAorCTB4MDEzLCAweDAwMDEwMzk5LAorCTB4MDEzLCAweDAwMDBjMzhkLAorCTB4MDEzLCAweDAwMDA4MTk5LAorCTB4MDEzLCAweDAwMDA0MThkLAorCTB4MDEzLCAweDAwMDAwMDk5LAorCTB4MDE1LCAweDAwMDBmNDk1LAorCTB4MDE1LCAweDAwMDRmNDk1LAorCTB4MDE1LCAweDAwMDhmNDk1LAorCTB4MDE2LCAweDAwMGUxODc0LAorCTB4MDE2LCAweDAwMGExODc0LAorCTB4MDE2LCAweDAwMDYxODc0LAorCTB4MDE2LCAweDAwMDIxODc0LAorCTB4MDE4LCAweDAwMDM3NTY0LAorCTB4MDAwLCAweDAwMDcwMDAwLAorCTB4MDEyLCAweDAwMGNmMDAwLAorCTB4MDEyLCAweDAwMGJjMDAwLAorCTB4MDEyLCAweDAwMDc4MDAwLAorCTB4MDEyLCAweDAwMDAwMDAwLAorCTB4MDEzLCAweDAwMDI4N2JmLAorCTB4MDEzLCAweDAwMDI0N2IzLAorCTB4MDEzLCAweDAwMDIwN2E3LAorCTB4MDEzLCAweDAwMDFjNzliLAorCTB4MDEzLCAweDAwMDE4MzlmLAorCTB4MDEzLCAweDAwMDE0MzkzLAorCTB4MDEzLCAweDAwMDEwMzk5LAorCTB4MDEzLCAweDAwMDBjMzhkLAorCTB4MDEzLCAweDAwMDA4MTk5LAorCTB4MDEzLCAweDAwMDA0MThkLAorCTB4MDEzLCAweDAwMDAwMDk5LAorCTB4MDE1LCAweDAwMDBmNDk1LAorCTB4MDE1LCAweDAwMDRmNDk1LAorCTB4MDE1LCAweDAwMDhmNDk1LAorCTB4MDE2LCAweDAwMGUxODc0LAorCTB4MDE2LCAweDAwMGExODc0LAorCTB4MDE2LCAweDAwMDYxODc0LAorCTB4MDE2LCAweDAwMDIxODc0LAorCTB4MDE4LCAweDAwMDU3NTk1LAorCTB4MDAwLCAweDAwMDcwMDAwLAorCTB4MDEyLCAweDAwMGNmMDAwLAorCTB4MDEyLCAweDAwMGJjMDAwLAorCTB4MDEyLCAweDAwMDc4MDAwLAorCTB4MDEyLCAweDAwMDAwMDAwLAorCTB4MDEzLCAweDAwMDI4N2JmLAorCTB4MDEzLCAweDAwMDI0N2IzLAorCTB4MDEzLCAweDAwMDIwN2E3LAorCTB4MDEzLCAweDAwMDFjNzliLAorCTB4MDEzLCAweDAwMDE4MzlmLAorCTB4MDEzLCAweDAwMDE0MzkzLAorCTB4MDEzLCAweDAwMDEwMzk5LAorCTB4MDEzLCAweDAwMDBjMzhkLAorCTB4MDEzLCAweDAwMDA4MTk5LAorCTB4MDEzLCAweDAwMDA0MThkLAorCTB4MDEzLCAweDAwMDAwMDk5LAorCTB4MDE1LCAweDAwMDBmNDk1LAorCTB4MDE1LCAweDAwMDRmNDk1LAorCTB4MDE1LCAweDAwMDhmNDk1LAorCTB4MDE2LCAweDAwMGUxODc0LAorCTB4MDE2LCAweDAwMGExODc0LAorCTB4MDE2LCAweDAwMDYxODc0LAorCTB4MDE2LCAweDAwMDIxODc0LAorCTB4MDMwLCAweDAwMDQ0NzBmLAorCTB4MDMxLCAweDAwMDQ0ZmYwLAorCTB4MDMyLCAweDAwMDAwMDcwLAorCTB4MDMzLCAweDAwMGRkNDgwLAorCTB4MDM0LCAweDAwMGZmYWMwLAorCTB4MDM1LCAweDAwMGI4MGMwLAorCTB4MDM2LCAweDAwMDc3MDAwLAorCTB4MDM3LCAweDAwMDY0ZmYyLAorCTB4MDM4LCAweDAwMGU3NjYxLAorCTB4MDM5LCAweDAwMDAwZTkwLAorCTB4MDAwLCAweDAwMDMwMDAwLAorCTB4MDE4LCAweDAwMDBmNDAxLAorCTB4MGZlLCAweDAwMDAwMDAwLAorCTB4MGZlLCAweDAwMDAwMDAwLAorCTB4MDFlLCAweDAwMDg4MDA5LAorCTB4MDFmLCAweDAwMDgwMDAzLAorCTB4MGZlLCAweDAwMDAwMDAwLAorCTB4MDFlLCAweDAwMDg4MDAxLAorCTB4MDFmLCAweDAwMDgwMDAwLAorCTB4MGZlLCAweDAwMDAwMDAwLAorCTB4MDE4LCAweDAwMDk3NTI0LAorCTB4MGZlLCAweDAwMDAwMDAwLAorCTB4MGZlLCAweDAwMDAwMDAwLAorCTB4MGZlLCAweDAwMDAwMDAwLAorCTB4MGZlLCAweDAwMDAwMDAwLAorCTB4MDJiLCAweDAwMDQxMjg5LAorCTB4MGZlLCAweDAwMDAwMDAwLAorCTB4MDJkLCAweDAwMDZhYWFhLAorCTB4MDJlLCAweDAwMGI0ZDAxLAorCTB4MDJkLCAweDAwMDgwMDAwLAorCTB4MDJlLCAweDAwMDA0ZDAyLAorCTB4MDJkLCAweDAwMDk1NTU1LAorCTB4MDJlLCAweDAwMDU0ZDAzLAorCTB4MDJkLCAweDAwMGFhYWFhLAorCTB4MDJlLCAweDAwMGI0ZDA0LAorCTB4MDJkLCAweDAwMGMwMDAwLAorCTB4MDJlLCAweDAwMDA0ZDA1LAorCTB4MDJkLCAweDAwMGQ1NTU1LAorCTB4MDJlLCAweDAwMDU0ZDA2LAorCTB4MDJkLCAweDAwMGVhYWFhLAorCTB4MDJlLCAweDAwMGI0ZDA3LAorCTB4MDJkLCAweDAwMDAwMDAwLAorCTB4MDJlLCAweDAwMDA1MTA4LAorCTB4MDJkLCAweDAwMDE1NTU1LAorCTB4MDJlLCAweDAwMDU1MTA5LAorCTB4MDJkLCAweDAwMDJhYWFhLAorCTB4MDJlLCAweDAwMGI1MTBhLAorCTB4MDJkLCAweDAwMDQwMDAwLAorCTB4MDJlLCAweDAwMDA1MTBiLAorCTB4MDJkLCAweDAwMDU1NTU1LAorCTB4MDJlLCAweDAwMDU1MTBjLAorfTsKKwordTMyIHJ0bDgxOTJkZV9yYWRpb2JfMnRfaW50X3BhYXJyYXlbUkFESU9CXzJUX0lOVF9QQV9BUlJBWUxFTkdUSF0gPSB7CisJMHgwMDAsIDB4MDAwMzAwMDAsCisJMHgwMDEsIDB4MDAwMzAwMDAsCisJMHgwMDIsIDB4MDAwMDAwMDAsCisJMHgwMDMsIDB4MDAwMThjNjMsCisJMHgwMDQsIDB4MDAwMThjNjMsCisJMHgwMDgsIDB4MDAwODQwMDAsCisJMHgwMGIsIDB4MDAwMWMwMDAsCisJMHgwMGUsIDB4MDAwMThjNjcsCisJMHgwMGYsIDB4MDAwMDA4NTEsCisJMHgwMTQsIDB4MDAwMjE0NDAsCisJMHgwMTgsIDB4MDAwMDc0MDEsCisJMHgwMTksIDB4MDAwMDAwNjAsCisJMHgwMWQsIDB4MDAwYTEyOTAsCisJMHgwMjMsIDB4MDAwMDE1NTgsCisJMHgwMWEsIDB4MDAwMzBhOTksCisJMHgwMWIsIDB4MDAwNDBiMDAsCisJMHgwMWMsIDB4MDAwZmMzMzksCisJMHgwM2EsIDB4MDAwYTU3ZWIsCisJMHgwM2IsIDB4MDAwMjAwMDAsCisJMHgwM2MsIDB4MDAwZmY0NTQsCisJMHgwMjAsIDB4MDAwMGFhNTIsCisJMHgwMjEsIDB4MDAwNTQwMDAsCisJMHgwNDAsIDB4MDAwMGFhNTIsCisJMHgwNDEsIDB4MDAwMTQwMDAsCisJMHgwMjUsIDB4MDAwODAzYmUsCisJMHgwMjYsIDB4MDAwZmM2MzgsCisJMHgwMjcsIDB4MDAwNzdjMTgsCisJMHgwMjgsIDB4MDAwZDFjMzEsCisJMHgwMjksIDB4MDAwZDcxMTAsCisJMHgwMmEsIDB4MDAwYWViMDQsCisJMHgwMmIsIDB4MDAwNDEyOGIsCisJMHgwMmMsIDB4MDAwMDE4NDAsCisJMHgwNDMsIDB4MDAwMjQ0NGYsCisJMHgwNDQsIDB4MDAwMWFkYjAsCisJMHgwNDUsIDB4MDAwNTY0NjcsCisJMHgwNDYsIDB4MDAwODk5MmMsCisJMHgwNDcsIDB4MDAwMDQ1MmMsCisJMHgwNDgsIDB4MDAwYzA0NDMsCisJMHgwNDksIDB4MDAwMDA3MzAsCisJMHgwNGEsIDB4MDAwNTBmMGYsCisJMHgwNGIsIDB4MDAwODk2ZWUsCisJMHgwNGMsIDB4MDAwMGRkZWUsCisJMHgwMTgsIDB4MDAwMDc0MDEsCisJMHgwMDAsIDB4MDAwNzAwMDAsCisJMHgwMTIsIDB4MDAwZGMwMDAsCisJMHgwMTIsIDB4MDAwOTAwMDAsCisJMHgwMTIsIDB4MDAwNTEwMDAsCisJMHgwMTIsIDB4MDAwMTIwMDAsCisJMHgwMTMsIDB4MDAwMjg3YjcsCisJMHgwMTMsIDB4MDAwMjQ3YWIsCisJMHgwMTMsIDB4MDAwMjA3OWYsCisJMHgwMTMsIDB4MDAwMWM3OTMsCisJMHgwMTMsIDB4MDAwMTgzOWIsCisJMHgwMTMsIDB4MDAwMTQzOTIsCisJMHgwMTMsIDB4MDAwMTAxOWEsCisJMHgwMTMsIDB4MDAwMGMxOTEsCisJMHgwMTMsIDB4MDAwMDgxOTQsCisJMHgwMTMsIDB4MDAwMDQwYTAsCisJMHgwMTMsIDB4MDAwMDAwMTgsCisJMHgwMTUsIDB4MDAwMGY0MjQsCisJMHgwMTUsIDB4MDAwNGY0MjQsCisJMHgwMTUsIDB4MDAwOGY0MjQsCisJMHgwMTYsIDB4MDAwZTEzMzAsCisJMHgwMTYsIDB4MDAwYTEzMzAsCisJMHgwMTYsIDB4MDAwNjEzMzAsCisJMHgwMTYsIDB4MDAwMjEzMzAsCisJMHgwMTgsIDB4MDAwMTc1MjQsCisJMHgwMDAsIDB4MDAwNzAwMDAsCisJMHgwMTIsIDB4MDAwY2YwMDAsCisJMHgwMTIsIDB4MDAwYmMwMDAsCisJMHgwMTIsIDB4MDAwNzgwMDAsCisJMHgwMTIsIDB4MDAwMDAwMDAsCisJMHgwMTMsIDB4MDAwMjg3YmYsCisJMHgwMTMsIDB4MDAwMjQ3YjMsCisJMHgwMTMsIDB4MDAwMjA3YTcsCisJMHgwMTMsIDB4MDAwMWM3OWIsCisJMHgwMTMsIDB4MDAwMTgzOWYsCisJMHgwMTMsIDB4MDAwMTQzOTMsCisJMHgwMTMsIDB4MDAwMTAzOTksCisJMHgwMTMsIDB4MDAwMGMzOGQsCisJMHgwMTMsIDB4MDAwMDgxOTksCisJMHgwMTMsIDB4MDAwMDQxOGQsCisJMHgwMTMsIDB4MDAwMDAwOTksCisJMHgwMTUsIDB4MDAwMGY0OTUsCisJMHgwMTUsIDB4MDAwNGY0OTUsCisJMHgwMTUsIDB4MDAwOGY0OTUsCisJMHgwMTYsIDB4MDAwZTE4NzQsCisJMHgwMTYsIDB4MDAwYTE4NzQsCisJMHgwMTYsIDB4MDAwNjE4NzQsCisJMHgwMTYsIDB4MDAwMjE4NzQsCisJMHgwMTgsIDB4MDAwMzc1NjQsCisJMHgwMDAsIDB4MDAwNzAwMDAsCisJMHgwMTIsIDB4MDAwY2YwMDAsCisJMHgwMTIsIDB4MDAwYmMwMDAsCisJMHgwMTIsIDB4MDAwNzgwMDAsCisJMHgwMTIsIDB4MDAwMDAwMDAsCisJMHgwMTMsIDB4MDAwMjg3YmYsCisJMHgwMTMsIDB4MDAwMjQ3YjMsCisJMHgwMTMsIDB4MDAwMjA3YTcsCisJMHgwMTMsIDB4MDAwMWM3OWIsCisJMHgwMTMsIDB4MDAwMTgzOWYsCisJMHgwMTMsIDB4MDAwMTQzOTMsCisJMHgwMTMsIDB4MDAwMTAzOTksCisJMHgwMTMsIDB4MDAwMGMzOGQsCisJMHgwMTMsIDB4MDAwMDgxOTksCisJMHgwMTMsIDB4MDAwMDQxOGQsCisJMHgwMTMsIDB4MDAwMDAwOTksCisJMHgwMTUsIDB4MDAwMGY0OTUsCisJMHgwMTUsIDB4MDAwNGY0OTUsCisJMHgwMTUsIDB4MDAwOGY0OTUsCisJMHgwMTYsIDB4MDAwZTE4NzQsCisJMHgwMTYsIDB4MDAwYTE4NzQsCisJMHgwMTYsIDB4MDAwNjE4NzQsCisJMHgwMTYsIDB4MDAwMjE4NzQsCisJMHgwMTgsIDB4MDAwNTc1OTUsCisJMHgwMDAsIDB4MDAwNzAwMDAsCisJMHgwMTIsIDB4MDAwY2YwMDAsCisJMHgwMTIsIDB4MDAwYmMwMDAsCisJMHgwMTIsIDB4MDAwNzgwMDAsCisJMHgwMTIsIDB4MDAwMDAwMDAsCisJMHgwMTMsIDB4MDAwMjg3YmYsCisJMHgwMTMsIDB4MDAwMjQ3YjMsCisJMHgwMTMsIDB4MDAwMjA3YTcsCisJMHgwMTMsIDB4MDAwMWM3OWIsCisJMHgwMTMsIDB4MDAwMTgzOWYsCisJMHgwMTMsIDB4MDAwMTQzOTMsCisJMHgwMTMsIDB4MDAwMTAzOTksCisJMHgwMTMsIDB4MDAwMGMzOGQsCisJMHgwMTMsIDB4MDAwMDgxOTksCisJMHgwMTMsIDB4MDAwMDQxOGQsCisJMHgwMTMsIDB4MDAwMDAwOTksCisJMHgwMTUsIDB4MDAwMGY0OTUsCisJMHgwMTUsIDB4MDAwNGY0OTUsCisJMHgwMTUsIDB4MDAwOGY0OTUsCisJMHgwMTYsIDB4MDAwZTE4NzQsCisJMHgwMTYsIDB4MDAwYTE4NzQsCisJMHgwMTYsIDB4MDAwNjE4NzQsCisJMHgwMTYsIDB4MDAwMjE4NzQsCisJMHgwMzAsIDB4MDAwNDQ3MGYsCisJMHgwMzEsIDB4MDAwNDRmZjAsCisJMHgwMzIsIDB4MDAwMDAwNzAsCisJMHgwMzMsIDB4MDAwZGQ0ODAsCisJMHgwMzQsIDB4MDAwZmZhYzAsCisJMHgwMzUsIDB4MDAwYjgwYzAsCisJMHgwMzYsIDB4MDAwNzcwMDAsCisJMHgwMzcsIDB4MDAwNjRmZjIsCisJMHgwMzgsIDB4MDAwZTc2NjEsCisJMHgwMzksIDB4MDAwMDBlOTAsCisJMHgwMDAsIDB4MDAwMzAwMDAsCisJMHgwMTgsIDB4MDAwMGY0MDEsCisJMHgwZmUsIDB4MDAwMDAwMDAsCisJMHgwZmUsIDB4MDAwMDAwMDAsCisJMHgwMWUsIDB4MDAwODgwMDksCisJMHgwMWYsIDB4MDAwODAwMDMsCisJMHgwZmUsIDB4MDAwMDAwMDAsCisJMHgwMWUsIDB4MDAwODgwMDEsCisJMHgwMWYsIDB4MDAwODAwMDAsCisJMHgwZmUsIDB4MDAwMDAwMDAsCisJMHgwMTgsIDB4MDAwODc0MDEsCisJMHgwZmUsIDB4MDAwMDAwMDAsCisJMHgwZmUsIDB4MDAwMDAwMDAsCisJMHgwZmUsIDB4MDAwMDAwMDAsCisJMHgwMmIsIDB4MDAwNDEyODksCisJMHgwZmUsIDB4MDAwMDAwMDAsCisJMHgwMmQsIDB4MDAwNjY2NjYsCisJMHgwMmUsIDB4MDAwNjQwMDEsCisJMHgwMmQsIDB4MDAwOTExMTEsCisJMHgwMmUsIDB4MDAwMTQwMDIsCisJMHgwMmQsIDB4MDAwYmJiYmIsCisJMHgwMmUsIDB4MDAwYjQwMDMsCisJMHgwMmQsIDB4MDAwZTY2NjYsCisJMHgwMmUsIDB4MDAwNjQwMDQsCisJMHgwMmQsIDB4MDAwODg4ODgsCisJMHgwMmUsIDB4MDAwODQwMDUsCisJMHgwMmQsIDB4MDAwOWRkZGQsCisJMHgwMmUsIDB4MDAwZDQwMDYsCisJMHgwMmQsIDB4MDAwYjMzMzMsCisJMHgwMmUsIDB4MDAwMzQwMDcsCisJMHgwMmQsIDB4MDAwNDg4ODgsCisJMHgwMmUsIDB4MDAwODQ0MDgsCisJMHgwMmQsIDB4MDAwYmJiYmIsCisJMHgwMmUsIDB4MDAwYjQ0MDksCisJMHgwMmQsIDB4MDAwZTY2NjYsCisJMHgwMmUsIDB4MDAwNjQ0MGEsCisJMHgwMmQsIDB4MDAwMTExMTEsCisJMHgwMmUsIDB4MDAwMTQ4MGIsCisJMHgwMmQsIDB4MDAwM2JiYmIsCisJMHgwMmUsIDB4MDAwYjQ4MGMsCisJMHgwMmQsIDB4MDAwNjY2NjYsCisJMHgwMmUsIDB4MDAwNjQ4MGQsCisJMHgwMmQsIDB4MDAwY2NjY2MsCisJMHgwMmUsIDB4MDAwYzQ4MGUsCit9OworCit1MzIgcnRsODE5MmRlX21hY18ydGFycmF5W01BQ18yVF9BUlJBWUxFTkdUSF0gPSB7CisJMHg0MjAsIDB4MDAwMDAwODAsCisJMHg0MjMsIDB4MDAwMDAwMDAsCisJMHg0MzAsIDB4MDAwMDAwMDAsCisJMHg0MzEsIDB4MDAwMDAwMDAsCisJMHg0MzIsIDB4MDAwMDAwMDAsCisJMHg0MzMsIDB4MDAwMDAwMDEsCisJMHg0MzQsIDB4MDAwMDAwMDQsCisJMHg0MzUsIDB4MDAwMDAwMDUsCisJMHg0MzYsIDB4MDAwMDAwMDYsCisJMHg0MzcsIDB4MDAwMDAwMDcsCisJMHg0MzgsIDB4MDAwMDAwMDAsCisJMHg0MzksIDB4MDAwMDAwMDAsCisJMHg0M2EsIDB4MDAwMDAwMDAsCisJMHg0M2IsIDB4MDAwMDAwMDEsCisJMHg0M2MsIDB4MDAwMDAwMDQsCisJMHg0M2QsIDB4MDAwMDAwMDUsCisJMHg0M2UsIDB4MDAwMDAwMDYsCisJMHg0M2YsIDB4MDAwMDAwMDcsCisJMHg0NDAsIDB4MDAwMDAwNTAsCisJMHg0NDEsIDB4MDAwMDAwMDEsCisJMHg0NDIsIDB4MDAwMDAwMDAsCisJMHg0NDQsIDB4MDAwMDAwMTUsCisJMHg0NDUsIDB4MDAwMDAwZjAsCisJMHg0NDYsIDB4MDAwMDAwMGYsCisJMHg0NDcsIDB4MDAwMDAwMDAsCisJMHg0NjIsIDB4MDAwMDAwMDgsCisJMHg0NjMsIDB4MDAwMDAwMDMsCisJMHg0YzgsIDB4MDAwMDAwZmYsCisJMHg0YzksIDB4MDAwMDAwMDgsCisJMHg0Y2MsIDB4MDAwMDAwZmYsCisJMHg0Y2QsIDB4MDAwMDAwZmYsCisJMHg0Y2UsIDB4MDAwMDAwMDEsCisJMHg1MDAsIDB4MDAwMDAwMjYsCisJMHg1MDEsIDB4MDAwMDAwYTIsCisJMHg1MDIsIDB4MDAwMDAwMmYsCisJMHg1MDMsIDB4MDAwMDAwMDAsCisJMHg1MDQsIDB4MDAwMDAwMjgsCisJMHg1MDUsIDB4MDAwMDAwYTMsCisJMHg1MDYsIDB4MDAwMDAwNWUsCisJMHg1MDcsIDB4MDAwMDAwMDAsCisJMHg1MDgsIDB4MDAwMDAwMmIsCisJMHg1MDksIDB4MDAwMDAwYTQsCisJMHg1MGEsIDB4MDAwMDAwNWUsCisJMHg1MGIsIDB4MDAwMDAwMDAsCisJMHg1MGMsIDB4MDAwMDAwNGYsCisJMHg1MGQsIDB4MDAwMDAwYTQsCisJMHg1MGUsIDB4MDAwMDAwMDAsCisJMHg1MGYsIDB4MDAwMDAwMDAsCisJMHg1MTIsIDB4MDAwMDAwMWMsCisJMHg1MTQsIDB4MDAwMDAwMGEsCisJMHg1MTUsIDB4MDAwMDAwMTAsCisJMHg1MTYsIDB4MDAwMDAwMGEsCisJMHg1MTcsIDB4MDAwMDAwMTAsCisJMHg1MWEsIDB4MDAwMDAwMTYsCisJMHg1MjQsIDB4MDAwMDAwMGYsCisJMHg1MjUsIDB4MDAwMDAwNGYsCisJMHg1NDYsIDB4MDAwMDAwNDAsCisJMHg1NDcsIDB4MDAwMDAwMDAsCisJMHg1NTAsIDB4MDAwMDAwMTAsCisJMHg1NTEsIDB4MDAwMDAwMTAsCisJMHg1NTksIDB4MDAwMDAwMDIsCisJMHg1NWEsIDB4MDAwMDAwMDIsCisJMHg1NWQsIDB4MDAwMDAwZmYsCisJMHg2MDUsIDB4MDAwMDAwMzAsCisJMHg2MDgsIDB4MDAwMDAwMGUsCisJMHg2MDksIDB4MDAwMDAwMmEsCisJMHg2NTIsIDB4MDAwMDAwMjAsCisJMHg2M2MsIDB4MDAwMDAwMGEsCisJMHg2M2QsIDB4MDAwMDAwMGEsCisJMHg2M2UsIDB4MDAwMDAwMGUsCisJMHg2M2YsIDB4MDAwMDAwMGUsCisJMHg2NmUsIDB4MDAwMDAwMDUsCisJMHg3MDAsIDB4MDAwMDAwMjEsCisJMHg3MDEsIDB4MDAwMDAwNDMsCisJMHg3MDIsIDB4MDAwMDAwNjUsCisJMHg3MDMsIDB4MDAwMDAwODcsCisJMHg3MDgsIDB4MDAwMDAwMjEsCisJMHg3MDksIDB4MDAwMDAwNDMsCisJMHg3MGEsIDB4MDAwMDAwNjUsCisJMHg3MGIsIDB4MDAwMDAwODcsCit9OworCit1MzIgcnRsODE5MmRlX2FnY3RhYl9hcnJheVtBR0NUQUJfQVJSQVlMRU5HVEhdID0geworCTB4Yzc4LCAweDdiMDAwMDAxLAorCTB4Yzc4LCAweDdiMDEwMDAxLAorCTB4Yzc4LCAweDdiMDIwMDAxLAorCTB4Yzc4LCAweDdiMDMwMDAxLAorCTB4Yzc4LCAweDdiMDQwMDAxLAorCTB4Yzc4LCAweDdiMDUwMDAxLAorCTB4Yzc4LCAweDdiMDYwMDAxLAorCTB4Yzc4LCAweDdhMDcwMDAxLAorCTB4Yzc4LCAweDc5MDgwMDAxLAorCTB4Yzc4LCAweDc4MDkwMDAxLAorCTB4Yzc4LCAweDc3MGEwMDAxLAorCTB4Yzc4LCAweDc2MGIwMDAxLAorCTB4Yzc4LCAweDc1MGMwMDAxLAorCTB4Yzc4LCAweDc0MGQwMDAxLAorCTB4Yzc4LCAweDczMGUwMDAxLAorCTB4Yzc4LCAweDcyMGYwMDAxLAorCTB4Yzc4LCAweDcxMTAwMDAxLAorCTB4Yzc4LCAweDcwMTEwMDAxLAorCTB4Yzc4LCAweDZmMTIwMDAxLAorCTB4Yzc4LCAweDZlMTMwMDAxLAorCTB4Yzc4LCAweDZkMTQwMDAxLAorCTB4Yzc4LCAweDZjMTUwMDAxLAorCTB4Yzc4LCAweDZiMTYwMDAxLAorCTB4Yzc4LCAweDZhMTcwMDAxLAorCTB4Yzc4LCAweDY5MTgwMDAxLAorCTB4Yzc4LCAweDY4MTkwMDAxLAorCTB4Yzc4LCAweDY3MWEwMDAxLAorCTB4Yzc4LCAweDY2MWIwMDAxLAorCTB4Yzc4LCAweDY1MWMwMDAxLAorCTB4Yzc4LCAweDY0MWQwMDAxLAorCTB4Yzc4LCAweDYzMWUwMDAxLAorCTB4Yzc4LCAweDYyMWYwMDAxLAorCTB4Yzc4LCAweDYxMjAwMDAxLAorCTB4Yzc4LCAweDYwMjEwMDAxLAorCTB4Yzc4LCAweDQ5MjIwMDAxLAorCTB4Yzc4LCAweDQ4MjMwMDAxLAorCTB4Yzc4LCAweDQ3MjQwMDAxLAorCTB4Yzc4LCAweDQ2MjUwMDAxLAorCTB4Yzc4LCAweDQ1MjYwMDAxLAorCTB4Yzc4LCAweDQ0MjcwMDAxLAorCTB4Yzc4LCAweDQzMjgwMDAxLAorCTB4Yzc4LCAweDQyMjkwMDAxLAorCTB4Yzc4LCAweDQxMmEwMDAxLAorCTB4Yzc4LCAweDQwMmIwMDAxLAorCTB4Yzc4LCAweDI2MmMwMDAxLAorCTB4Yzc4LCAweDI1MmQwMDAxLAorCTB4Yzc4LCAweDI0MmUwMDAxLAorCTB4Yzc4LCAweDIzMmYwMDAxLAorCTB4Yzc4LCAweDIyMzAwMDAxLAorCTB4Yzc4LCAweDIxMzEwMDAxLAorCTB4Yzc4LCAweDIwMzIwMDAxLAorCTB4Yzc4LCAweDA2MzMwMDAxLAorCTB4Yzc4LCAweDA1MzQwMDAxLAorCTB4Yzc4LCAweDA0MzUwMDAxLAorCTB4Yzc4LCAweDAzMzYwMDAxLAorCTB4Yzc4LCAweDAyMzcwMDAxLAorCTB4Yzc4LCAweDAxMzgwMDAxLAorCTB4Yzc4LCAweDAwMzkwMDAxLAorCTB4Yzc4LCAweDAwM2EwMDAxLAorCTB4Yzc4LCAweDAwM2IwMDAxLAorCTB4Yzc4LCAweDAwM2MwMDAxLAorCTB4Yzc4LCAweDAwM2QwMDAxLAorCTB4Yzc4LCAweDAwM2UwMDAxLAorCTB4Yzc4LCAweDAwM2YwMDAxLAorCTB4Yzc4LCAweDdiNDAwMDAxLAorCTB4Yzc4LCAweDdiNDEwMDAxLAorCTB4Yzc4LCAweDdhNDIwMDAxLAorCTB4Yzc4LCAweDc5NDMwMDAxLAorCTB4Yzc4LCAweDc4NDQwMDAxLAorCTB4Yzc4LCAweDc3NDUwMDAxLAorCTB4Yzc4LCAweDc2NDYwMDAxLAorCTB4Yzc4LCAweDc1NDcwMDAxLAorCTB4Yzc4LCAweDc0NDgwMDAxLAorCTB4Yzc4LCAweDczNDkwMDAxLAorCTB4Yzc4LCAweDcyNGEwMDAxLAorCTB4Yzc4LCAweDcxNGIwMDAxLAorCTB4Yzc4LCAweDcwNGMwMDAxLAorCTB4Yzc4LCAweDZmNGQwMDAxLAorCTB4Yzc4LCAweDZlNGUwMDAxLAorCTB4Yzc4LCAweDZkNGYwMDAxLAorCTB4Yzc4LCAweDZjNTAwMDAxLAorCTB4Yzc4LCAweDZiNTEwMDAxLAorCTB4Yzc4LCAweDZhNTIwMDAxLAorCTB4Yzc4LCAweDY5NTMwMDAxLAorCTB4Yzc4LCAweDY4NTQwMDAxLAorCTB4Yzc4LCAweDY3NTUwMDAxLAorCTB4Yzc4LCAweDY2NTYwMDAxLAorCTB4Yzc4LCAweDY1NTcwMDAxLAorCTB4Yzc4LCAweDY0NTgwMDAxLAorCTB4Yzc4LCAweDYzNTkwMDAxLAorCTB4Yzc4LCAweDYyNWEwMDAxLAorCTB4Yzc4LCAweDYxNWIwMDAxLAorCTB4Yzc4LCAweDYwNWMwMDAxLAorCTB4Yzc4LCAweDQ4NWQwMDAxLAorCTB4Yzc4LCAweDQ3NWUwMDAxLAorCTB4Yzc4LCAweDQ2NWYwMDAxLAorCTB4Yzc4LCAweDQ1NjAwMDAxLAorCTB4Yzc4LCAweDQ0NjEwMDAxLAorCTB4Yzc4LCAweDQzNjIwMDAxLAorCTB4Yzc4LCAweDQyNjMwMDAxLAorCTB4Yzc4LCAweDQxNjQwMDAxLAorCTB4Yzc4LCAweDQwNjUwMDAxLAorCTB4Yzc4LCAweDI3NjYwMDAxLAorCTB4Yzc4LCAweDI2NjcwMDAxLAorCTB4Yzc4LCAweDI1NjgwMDAxLAorCTB4Yzc4LCAweDI0NjkwMDAxLAorCTB4Yzc4LCAweDIzNmEwMDAxLAorCTB4Yzc4LCAweDIyNmIwMDAxLAorCTB4Yzc4LCAweDIxNmMwMDAxLAorCTB4Yzc4LCAweDIwNmQwMDAxLAorCTB4Yzc4LCAweDIwNmUwMDAxLAorCTB4Yzc4LCAweDIwNmYwMDAxLAorCTB4Yzc4LCAweDIwNzAwMDAxLAorCTB4Yzc4LCAweDIwNzEwMDAxLAorCTB4Yzc4LCAweDIwNzIwMDAxLAorCTB4Yzc4LCAweDIwNzMwMDAxLAorCTB4Yzc4LCAweDIwNzQwMDAxLAorCTB4Yzc4LCAweDIwNzUwMDAxLAorCTB4Yzc4LCAweDIwNzYwMDAxLAorCTB4Yzc4LCAweDIwNzcwMDAxLAorCTB4Yzc4LCAweDIwNzgwMDAxLAorCTB4Yzc4LCAweDIwNzkwMDAxLAorCTB4Yzc4LCAweDIwN2EwMDAxLAorCTB4Yzc4LCAweDIwN2IwMDAxLAorCTB4Yzc4LCAweDIwN2MwMDAxLAorCTB4Yzc4LCAweDIwN2QwMDAxLAorCTB4Yzc4LCAweDIwN2UwMDAxLAorCTB4Yzc4LCAweDIwN2YwMDAxLAorCTB4Yzc4LCAweDM4MDAwMDAyLAorCTB4Yzc4LCAweDM4MDEwMDAyLAorCTB4Yzc4LCAweDM4MDIwMDAyLAorCTB4Yzc4LCAweDM4MDMwMDAyLAorCTB4Yzc4LCAweDM4MDQwMDAyLAorCTB4Yzc4LCAweDM4MDUwMDAyLAorCTB4Yzc4LCAweDM4MDYwMDAyLAorCTB4Yzc4LCAweDM4MDcwMDAyLAorCTB4Yzc4LCAweDM4MDgwMDAyLAorCTB4Yzc4LCAweDNjMDkwMDAyLAorCTB4Yzc4LCAweDNlMGEwMDAyLAorCTB4Yzc4LCAweDQwMGIwMDAyLAorCTB4Yzc4LCAweDQ0MGMwMDAyLAorCTB4Yzc4LCAweDQ4MGQwMDAyLAorCTB4Yzc4LCAweDRjMGUwMDAyLAorCTB4Yzc4LCAweDUwMGYwMDAyLAorCTB4Yzc4LCAweDUyMTAwMDAyLAorCTB4Yzc4LCAweDU2MTEwMDAyLAorCTB4Yzc4LCAweDVhMTIwMDAyLAorCTB4Yzc4LCAweDVlMTMwMDAyLAorCTB4Yzc4LCAweDYwMTQwMDAyLAorCTB4Yzc4LCAweDYwMTUwMDAyLAorCTB4Yzc4LCAweDYwMTYwMDAyLAorCTB4Yzc4LCAweDYyMTcwMDAyLAorCTB4Yzc4LCAweDYyMTgwMDAyLAorCTB4Yzc4LCAweDYyMTkwMDAyLAorCTB4Yzc4LCAweDYyMWEwMDAyLAorCTB4Yzc4LCAweDYyMWIwMDAyLAorCTB4Yzc4LCAweDYyMWMwMDAyLAorCTB4Yzc4LCAweDYyMWQwMDAyLAorCTB4Yzc4LCAweDYyMWUwMDAyLAorCTB4Yzc4LCAweDYyMWYwMDAyLAorCTB4Yzc4LCAweDMyMDAwMDQ0LAorCTB4Yzc4LCAweDMyMDEwMDQ0LAorCTB4Yzc4LCAweDMyMDIwMDQ0LAorCTB4Yzc4LCAweDMyMDMwMDQ0LAorCTB4Yzc4LCAweDMyMDQwMDQ0LAorCTB4Yzc4LCAweDMyMDUwMDQ0LAorCTB4Yzc4LCAweDMyMDYwMDQ0LAorCTB4Yzc4LCAweDMyMDcwMDQ0LAorCTB4Yzc4LCAweDMyMDgwMDQ0LAorCTB4Yzc4LCAweDM0MDkwMDQ0LAorCTB4Yzc4LCAweDM1MGEwMDQ0LAorCTB4Yzc4LCAweDM2MGIwMDQ0LAorCTB4Yzc4LCAweDM3MGMwMDQ0LAorCTB4Yzc4LCAweDM4MGQwMDQ0LAorCTB4Yzc4LCAweDM5MGUwMDQ0LAorCTB4Yzc4LCAweDNhMGYwMDQ0LAorCTB4Yzc4LCAweDNlMTAwMDQ0LAorCTB4Yzc4LCAweDQyMTEwMDQ0LAorCTB4Yzc4LCAweDQ0MTIwMDQ0LAorCTB4Yzc4LCAweDQ2MTMwMDQ0LAorCTB4Yzc4LCAweDRhMTQwMDQ0LAorCTB4Yzc4LCAweDRlMTUwMDQ0LAorCTB4Yzc4LCAweDUwMTYwMDQ0LAorCTB4Yzc4LCAweDU1MTcwMDQ0LAorCTB4Yzc4LCAweDVhMTgwMDQ0LAorCTB4Yzc4LCAweDVlMTkwMDQ0LAorCTB4Yzc4LCAweDY0MWEwMDQ0LAorCTB4Yzc4LCAweDZlMWIwMDQ0LAorCTB4Yzc4LCAweDZlMWMwMDQ0LAorCTB4Yzc4LCAweDZlMWQwMDQ0LAorCTB4Yzc4LCAweDZlMWUwMDQ0LAorCTB4Yzc4LCAweDZlMWYwMDQ0LAorCTB4Yzc4LCAweDZlMWYwMDAwLAorfTsKKwordTMyIHJ0bDgxOTJkZV9hZ2N0YWJfNWdhcnJheVtBR0NUQUJfNUdfQVJSQVlMRU5HVEhdID0geworCTB4Yzc4LCAweDdiMDAwMDAxLAorCTB4Yzc4LCAweDdiMDEwMDAxLAorCTB4Yzc4LCAweDdhMDIwMDAxLAorCTB4Yzc4LCAweDc5MDMwMDAxLAorCTB4Yzc4LCAweDc4MDQwMDAxLAorCTB4Yzc4LCAweDc3MDUwMDAxLAorCTB4Yzc4LCAweDc2MDYwMDAxLAorCTB4Yzc4LCAweDc1MDcwMDAxLAorCTB4Yzc4LCAweDc0MDgwMDAxLAorCTB4Yzc4LCAweDczMDkwMDAxLAorCTB4Yzc4LCAweDcyMGEwMDAxLAorCTB4Yzc4LCAweDcxMGIwMDAxLAorCTB4Yzc4LCAweDcwMGMwMDAxLAorCTB4Yzc4LCAweDZmMGQwMDAxLAorCTB4Yzc4LCAweDZlMGUwMDAxLAorCTB4Yzc4LCAweDZkMGYwMDAxLAorCTB4Yzc4LCAweDZjMTAwMDAxLAorCTB4Yzc4LCAweDZiMTEwMDAxLAorCTB4Yzc4LCAweDZhMTIwMDAxLAorCTB4Yzc4LCAweDY5MTMwMDAxLAorCTB4Yzc4LCAweDY4MTQwMDAxLAorCTB4Yzc4LCAweDY3MTUwMDAxLAorCTB4Yzc4LCAweDY2MTYwMDAxLAorCTB4Yzc4LCAweDY1MTcwMDAxLAorCTB4Yzc4LCAweDY0MTgwMDAxLAorCTB4Yzc4LCAweDYzMTkwMDAxLAorCTB4Yzc4LCAweDYyMWEwMDAxLAorCTB4Yzc4LCAweDYxMWIwMDAxLAorCTB4Yzc4LCAweDYwMWMwMDAxLAorCTB4Yzc4LCAweDQ4MWQwMDAxLAorCTB4Yzc4LCAweDQ3MWUwMDAxLAorCTB4Yzc4LCAweDQ2MWYwMDAxLAorCTB4Yzc4LCAweDQ1MjAwMDAxLAorCTB4Yzc4LCAweDQ0MjEwMDAxLAorCTB4Yzc4LCAweDQzMjIwMDAxLAorCTB4Yzc4LCAweDQyMjMwMDAxLAorCTB4Yzc4LCAweDQxMjQwMDAxLAorCTB4Yzc4LCAweDQwMjUwMDAxLAorCTB4Yzc4LCAweDI3MjYwMDAxLAorCTB4Yzc4LCAweDI2MjcwMDAxLAorCTB4Yzc4LCAweDI1MjgwMDAxLAorCTB4Yzc4LCAweDI0MjkwMDAxLAorCTB4Yzc4LCAweDIzMmEwMDAxLAorCTB4Yzc4LCAweDIyMmIwMDAxLAorCTB4Yzc4LCAweDIxMmMwMDAxLAorCTB4Yzc4LCAweDIwMmQwMDAxLAorCTB4Yzc4LCAweDIwMmUwMDAxLAorCTB4Yzc4LCAweDIwMmYwMDAxLAorCTB4Yzc4LCAweDIwMzAwMDAxLAorCTB4Yzc4LCAweDIwMzEwMDAxLAorCTB4Yzc4LCAweDIwMzIwMDAxLAorCTB4Yzc4LCAweDIwMzMwMDAxLAorCTB4Yzc4LCAweDIwMzQwMDAxLAorCTB4Yzc4LCAweDIwMzUwMDAxLAorCTB4Yzc4LCAweDIwMzYwMDAxLAorCTB4Yzc4LCAweDIwMzcwMDAxLAorCTB4Yzc4LCAweDIwMzgwMDAxLAorCTB4Yzc4LCAweDIwMzkwMDAxLAorCTB4Yzc4LCAweDIwM2EwMDAxLAorCTB4Yzc4LCAweDIwM2IwMDAxLAorCTB4Yzc4LCAweDIwM2MwMDAxLAorCTB4Yzc4LCAweDIwM2QwMDAxLAorCTB4Yzc4LCAweDIwM2UwMDAxLAorCTB4Yzc4LCAweDIwM2YwMDAxLAorCTB4Yzc4LCAweDMyMDAwMDQ0LAorCTB4Yzc4LCAweDMyMDEwMDQ0LAorCTB4Yzc4LCAweDMyMDIwMDQ0LAorCTB4Yzc4LCAweDMyMDMwMDQ0LAorCTB4Yzc4LCAweDMyMDQwMDQ0LAorCTB4Yzc4LCAweDMyMDUwMDQ0LAorCTB4Yzc4LCAweDMyMDYwMDQ0LAorCTB4Yzc4LCAweDMyMDcwMDQ0LAorCTB4Yzc4LCAweDMyMDgwMDQ0LAorCTB4Yzc4LCAweDM0MDkwMDQ0LAorCTB4Yzc4LCAweDM1MGEwMDQ0LAorCTB4Yzc4LCAweDM2MGIwMDQ0LAorCTB4Yzc4LCAweDM3MGMwMDQ0LAorCTB4Yzc4LCAweDM4MGQwMDQ0LAorCTB4Yzc4LCAweDM5MGUwMDQ0LAorCTB4Yzc4LCAweDNhMGYwMDQ0LAorCTB4Yzc4LCAweDNlMTAwMDQ0LAorCTB4Yzc4LCAweDQyMTEwMDQ0LAorCTB4Yzc4LCAweDQ0MTIwMDQ0LAorCTB4Yzc4LCAweDQ2MTMwMDQ0LAorCTB4Yzc4LCAweDRhMTQwMDQ0LAorCTB4Yzc4LCAweDRlMTUwMDQ0LAorCTB4Yzc4LCAweDUwMTYwMDQ0LAorCTB4Yzc4LCAweDU1MTcwMDQ0LAorCTB4Yzc4LCAweDVhMTgwMDQ0LAorCTB4Yzc4LCAweDVlMTkwMDQ0LAorCTB4Yzc4LCAweDY0MWEwMDQ0LAorCTB4Yzc4LCAweDZlMWIwMDQ0LAorCTB4Yzc4LCAweDZlMWMwMDQ0LAorCTB4Yzc4LCAweDZlMWQwMDQ0LAorCTB4Yzc4LCAweDZlMWUwMDQ0LAorCTB4Yzc4LCAweDZlMWYwMDQ0LAorCTB4Yzc4LCAweDZlMWYwMDAwLAorfTsKKwordTMyIHJ0bDgxOTJkZV9hZ2N0YWJfMmdhcnJheVtBR0NUQUJfMkdfQVJSQVlMRU5HVEhdID0geworCTB4Yzc4LCAweDdiMDAwMDAxLAorCTB4Yzc4LCAweDdiMDEwMDAxLAorCTB4Yzc4LCAweDdiMDIwMDAxLAorCTB4Yzc4LCAweDdiMDMwMDAxLAorCTB4Yzc4LCAweDdiMDQwMDAxLAorCTB4Yzc4LCAweDdiMDUwMDAxLAorCTB4Yzc4LCAweDdiMDYwMDAxLAorCTB4Yzc4LCAweDdhMDcwMDAxLAorCTB4Yzc4LCAweDc5MDgwMDAxLAorCTB4Yzc4LCAweDc4MDkwMDAxLAorCTB4Yzc4LCAweDc3MGEwMDAxLAorCTB4Yzc4LCAweDc2MGIwMDAxLAorCTB4Yzc4LCAweDc1MGMwMDAxLAorCTB4Yzc4LCAweDc0MGQwMDAxLAorCTB4Yzc4LCAweDczMGUwMDAxLAorCTB4Yzc4LCAweDcyMGYwMDAxLAorCTB4Yzc4LCAweDcxMTAwMDAxLAorCTB4Yzc4LCAweDcwMTEwMDAxLAorCTB4Yzc4LCAweDZmMTIwMDAxLAorCTB4Yzc4LCAweDZlMTMwMDAxLAorCTB4Yzc4LCAweDZkMTQwMDAxLAorCTB4Yzc4LCAweDZjMTUwMDAxLAorCTB4Yzc4LCAweDZiMTYwMDAxLAorCTB4Yzc4LCAweDZhMTcwMDAxLAorCTB4Yzc4LCAweDY5MTgwMDAxLAorCTB4Yzc4LCAweDY4MTkwMDAxLAorCTB4Yzc4LCAweDY3MWEwMDAxLAorCTB4Yzc4LCAweDY2MWIwMDAxLAorCTB4Yzc4LCAweDY1MWMwMDAxLAorCTB4Yzc4LCAweDY0MWQwMDAxLAorCTB4Yzc4LCAweDYzMWUwMDAxLAorCTB4Yzc4LCAweDYyMWYwMDAxLAorCTB4Yzc4LCAweDYxMjAwMDAxLAorCTB4Yzc4LCAweDYwMjEwMDAxLAorCTB4Yzc4LCAweDQ5MjIwMDAxLAorCTB4Yzc4LCAweDQ4MjMwMDAxLAorCTB4Yzc4LCAweDQ3MjQwMDAxLAorCTB4Yzc4LCAweDQ2MjUwMDAxLAorCTB4Yzc4LCAweDQ1MjYwMDAxLAorCTB4Yzc4LCAweDQ0MjcwMDAxLAorCTB4Yzc4LCAweDQzMjgwMDAxLAorCTB4Yzc4LCAweDQyMjkwMDAxLAorCTB4Yzc4LCAweDQxMmEwMDAxLAorCTB4Yzc4LCAweDQwMmIwMDAxLAorCTB4Yzc4LCAweDI2MmMwMDAxLAorCTB4Yzc4LCAweDI1MmQwMDAxLAorCTB4Yzc4LCAweDI0MmUwMDAxLAorCTB4Yzc4LCAweDIzMmYwMDAxLAorCTB4Yzc4LCAweDIyMzAwMDAxLAorCTB4Yzc4LCAweDIxMzEwMDAxLAorCTB4Yzc4LCAweDIwMzIwMDAxLAorCTB4Yzc4LCAweDA2MzMwMDAxLAorCTB4Yzc4LCAweDA1MzQwMDAxLAorCTB4Yzc4LCAweDA0MzUwMDAxLAorCTB4Yzc4LCAweDAzMzYwMDAxLAorCTB4Yzc4LCAweDAyMzcwMDAxLAorCTB4Yzc4LCAweDAxMzgwMDAxLAorCTB4Yzc4LCAweDAwMzkwMDAxLAorCTB4Yzc4LCAweDAwM2EwMDAxLAorCTB4Yzc4LCAweDAwM2IwMDAxLAorCTB4Yzc4LCAweDAwM2MwMDAxLAorCTB4Yzc4LCAweDAwM2QwMDAxLAorCTB4Yzc4LCAweDAwM2UwMDAxLAorCTB4Yzc4LCAweDAwM2YwMDAxLAorCTB4Yzc4LCAweDM4MDAwMDAyLAorCTB4Yzc4LCAweDM4MDEwMDAyLAorCTB4Yzc4LCAweDM4MDIwMDAyLAorCTB4Yzc4LCAweDM4MDMwMDAyLAorCTB4Yzc4LCAweDM4MDQwMDAyLAorCTB4Yzc4LCAweDM4MDUwMDAyLAorCTB4Yzc4LCAweDM4MDYwMDAyLAorCTB4Yzc4LCAweDM4MDcwMDAyLAorCTB4Yzc4LCAweDM4MDgwMDAyLAorCTB4Yzc4LCAweDNjMDkwMDAyLAorCTB4Yzc4LCAweDNlMGEwMDAyLAorCTB4Yzc4LCAweDQwMGIwMDAyLAorCTB4Yzc4LCAweDQ0MGMwMDAyLAorCTB4Yzc4LCAweDQ4MGQwMDAyLAorCTB4Yzc4LCAweDRjMGUwMDAyLAorCTB4Yzc4LCAweDUwMGYwMDAyLAorCTB4Yzc4LCAweDUyMTAwMDAyLAorCTB4Yzc4LCAweDU2MTEwMDAyLAorCTB4Yzc4LCAweDVhMTIwMDAyLAorCTB4Yzc4LCAweDVlMTMwMDAyLAorCTB4Yzc4LCAweDYwMTQwMDAyLAorCTB4Yzc4LCAweDYwMTUwMDAyLAorCTB4Yzc4LCAweDYwMTYwMDAyLAorCTB4Yzc4LCAweDYyMTcwMDAyLAorCTB4Yzc4LCAweDYyMTgwMDAyLAorCTB4Yzc4LCAweDYyMTkwMDAyLAorCTB4Yzc4LCAweDYyMWEwMDAyLAorCTB4Yzc4LCAweDYyMWIwMDAyLAorCTB4Yzc4LCAweDYyMWMwMDAyLAorCTB4Yzc4LCAweDYyMWQwMDAyLAorCTB4Yzc4LCAweDYyMWUwMDAyLAorCTB4Yzc4LCAweDYyMWYwMDAyLAorCTB4Yzc4LCAweDZlMWYwMDAwLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3RhYmxlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZjMwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS90YWJsZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICogQ3JlYXRlZCBvbiAgMjAxMC8gNS8xOCwgIDE6NDEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1JUTDkyREVfVEFCTEVfX0hfCisjZGVmaW5lIF9fUlRMOTJERV9UQUJMRV9fSF8KKworLypDcmVhdGVkIG9uICAyMDExLyAxLzE0LCAgMTozNSovCisKKyNkZWZpbmUgUEhZX1JFR18yVF9BUlJBWUxFTkdUSCAzODAKK2V4dGVybiB1MzIgcnRsODE5MmRlX3BoeV9yZWdfMnRhcnJheVtQSFlfUkVHXzJUX0FSUkFZTEVOR1RIXTsKKyNkZWZpbmUgUEhZX1JFR19BUlJBWV9QR19MRU5HVEggNjI0CitleHRlcm4gdTMyIHJ0bDgxOTJkZV9waHlfcmVnX2FycmF5X3BnW1BIWV9SRUdfQVJSQVlfUEdfTEVOR1RIXTsKKyNkZWZpbmUgUkFESU9BXzJUX0FSUkFZTEVOR1RIIDM3OAorZXh0ZXJuIHUzMiBydGw4MTkyZGVfcmFkaW9hXzJ0YXJyYXlbUkFESU9BXzJUX0FSUkFZTEVOR1RIXTsKKyNkZWZpbmUgUkFESU9CXzJUX0FSUkFZTEVOR1RIIDM4NAorZXh0ZXJuIHUzMiBydGw4MTkyZGVfcmFkaW9iXzJ0YXJyYXlbUkFESU9CXzJUX0FSUkFZTEVOR1RIXTsKKyNkZWZpbmUgUkFESU9BXzJUX0lOVF9QQV9BUlJBWUxFTkdUSCAzNzgKK2V4dGVybiB1MzIgcnRsODE5MmRlX3JhZGlvYV8ydF9pbnRfcGFhcnJheVtSQURJT0FfMlRfSU5UX1BBX0FSUkFZTEVOR1RIXTsKKyNkZWZpbmUgUkFESU9CXzJUX0lOVF9QQV9BUlJBWUxFTkdUSCAzODQKK2V4dGVybiB1MzIgcnRsODE5MmRlX3JhZGlvYl8ydF9pbnRfcGFhcnJheVtSQURJT0JfMlRfSU5UX1BBX0FSUkFZTEVOR1RIXTsKKyNkZWZpbmUgTUFDXzJUX0FSUkFZTEVOR1RIIDE2MAorZXh0ZXJuIHUzMiBydGw4MTkyZGVfbWFjXzJ0YXJyYXlbTUFDXzJUX0FSUkFZTEVOR1RIXTsKKyNkZWZpbmUgQUdDVEFCX0FSUkFZTEVOR1RIIDM4NgorZXh0ZXJuIHUzMiBydGw4MTkyZGVfYWdjdGFiX2FycmF5W0FHQ1RBQl9BUlJBWUxFTkdUSF07CisjZGVmaW5lIEFHQ1RBQl81R19BUlJBWUxFTkdUSCAxOTQKK2V4dGVybiB1MzIgcnRsODE5MmRlX2FnY3RhYl81Z2FycmF5W0FHQ1RBQl81R19BUlJBWUxFTkdUSF07CisjZGVmaW5lIEFHQ1RBQl8yR19BUlJBWUxFTkdUSCAxOTQKK2V4dGVybiB1MzIgcnRsODE5MmRlX2FnY3RhYl8yZ2FycmF5W0FHQ1RBQl8yR19BUlJBWUxFTkdUSF07CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvdHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS90cnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzg2ZmNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvdHJ4LmMKQEAgLTAsMCArMSw5NTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vd2lmaS5oIgorI2luY2x1ZGUgIi4uL3BjaS5oIgorI2luY2x1ZGUgIi4uL2Jhc2UuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJkZWYuaCIKKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJ0cnguaCIKKyNpbmNsdWRlICJsZWQuaCIKKworc3RhdGljIHU4IF9ydGw5MmRlX21hcF9od3F1ZXVlX3RvX2Z3cXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggaHdfcXVldWUpCit7CisJX19sZTE2IGZjID0gcnRsX2dldF9mYyhza2IpOworCisJaWYgKHVubGlrZWx5KGllZWU4MDIxMV9pc19iZWFjb24oZmMpKSkKKwkJcmV0dXJuIFFTTFRfQkVBQ09OOworCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpCisJCXJldHVybiBRU0xUX01HTlQ7CisKKwlyZXR1cm4gc2tiLT5wcmlvcml0eTsKK30KKworc3RhdGljIGludCBfcnRsOTJkZV9yYXRlX21hcHBpbmcoYm9vbCBpc2h0LCB1OCBkZXNjX3JhdGUpCit7CisJaW50IHJhdGVfaWR4OworCisJaWYgKGZhbHNlID09IGlzaHQpIHsKKwkJc3dpdGNoIChkZXNjX3JhdGUpIHsKKwkJY2FzZSBERVNDOTJEX1JBVEUxTToKKwkJCXJhdGVfaWR4ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MkRfUkFURTJNOgorCQkJcmF0ZV9pZHggPSAxOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkyRF9SQVRFNV81TToKKwkJCXJhdGVfaWR4ID0gMjsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MkRfUkFURTExTToKKwkJCXJhdGVfaWR4ID0gMzsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MkRfUkFURTZNOgorCQkJcmF0ZV9pZHggPSA0OworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkyRF9SQVRFOU06CisJCQlyYXRlX2lkeCA9IDU7CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTJEX1JBVEUxMk06CisJCQlyYXRlX2lkeCA9IDY7CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTJEX1JBVEUxOE06CisJCQlyYXRlX2lkeCA9IDc7CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTJEX1JBVEUyNE06CisJCQlyYXRlX2lkeCA9IDg7CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTJEX1JBVEUzNk06CisJCQlyYXRlX2lkeCA9IDk7CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTJEX1JBVEU0OE06CisJCQlyYXRlX2lkeCA9IDEwOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkyRF9SQVRFNTRNOgorCQkJcmF0ZV9pZHggPSAxMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmF0ZV9pZHggPSAwOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHJhdGVfaWR4OworCX0gZWxzZSB7CisJCXN3aXRjaCAoZGVzY19yYXRlKSB7CisJCWNhc2UgREVTQzkyRF9SQVRFMU06CisJCQlyYXRlX2lkeCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTJEX1JBVEUyTToKKwkJCXJhdGVfaWR4ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MkRfUkFURTVfNU06CisJCQlyYXRlX2lkeCA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTJEX1JBVEUxMU06CisJCQlyYXRlX2lkeCA9IDM7CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTJEX1JBVEU2TToKKwkJCXJhdGVfaWR4ID0gNDsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MkRfUkFURTlNOgorCQkJcmF0ZV9pZHggPSA1OworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkyRF9SQVRFMTJNOgorCQkJcmF0ZV9pZHggPSA2OworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkyRF9SQVRFMThNOgorCQkJcmF0ZV9pZHggPSA3OworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkyRF9SQVRFMjRNOgorCQkJcmF0ZV9pZHggPSA4OworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkyRF9SQVRFMzZNOgorCQkJcmF0ZV9pZHggPSA5OworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkyRF9SQVRFNDhNOgorCQkJcmF0ZV9pZHggPSAxMDsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MkRfUkFURTU0TToKKwkJCXJhdGVfaWR4ID0gMTE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJhdGVfaWR4ID0gMTE7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gcmF0ZV9pZHg7CisJfQorfQorCitzdGF0aWMgdTggX3J0bDkyZF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UoY2hhciBhbnRwb3dlcikKK3sKKwlpZiAoKGFudHBvd2VyIDw9IC0xMDApIHx8IChhbnRwb3dlciA+PSAyMCkpCisJCXJldHVybiAwOworCWVsc2UgaWYgKGFudHBvd2VyID49IDApCisJCXJldHVybiAxMDA7CisJZWxzZQorCQlyZXR1cm4gMTAwICsgYW50cG93ZXI7Cit9CisKK3N0YXRpYyB1OCBfcnRsOTJkX2V2bV9kYl90b19wZXJjZW50YWdlKGNoYXIgdmFsdWUpCit7CisJY2hhciByZXRfdmFsID0gdmFsdWU7CisKKwlpZiAocmV0X3ZhbCA+PSAwKQorCQlyZXRfdmFsID0gMDsKKwlpZiAocmV0X3ZhbCA8PSAtMzMpCisJCXJldF92YWwgPSAtMzM7CisJcmV0X3ZhbCA9IDAgLSByZXRfdmFsOworCXJldF92YWwgKj0gMzsKKwlpZiAocmV0X3ZhbCA9PSA5OSkKKwkJcmV0X3ZhbCA9IDEwMDsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGxvbmcgX3J0bDkyZGVfdHJhbnNsYXRlX3RvZGJtKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgdTggc2lnbmFsX3N0cmVuZ3RoX2luZGV4KQoreworCWxvbmcgc2lnbmFsX3Bvd2VyOworCisJc2lnbmFsX3Bvd2VyID0gKGxvbmcpKChzaWduYWxfc3RyZW5ndGhfaW5kZXggKyAxKSA+PiAxKTsKKwlzaWduYWxfcG93ZXIgLT0gOTU7CisJcmV0dXJuIHNpZ25hbF9wb3dlcjsKK30KKworc3RhdGljIGxvbmcgX3J0bDkyZGVfc2lnbmFsX3NjYWxlX21hcHBpbmcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGxvbmcgY3VycnNpZykKK3sKKwlsb25nIHJldHNpZzsKKworCWlmIChjdXJyc2lnID49IDYxICYmIGN1cnJzaWcgPD0gMTAwKQorCQlyZXRzaWcgPSA5MCArICgoY3VycnNpZyAtIDYwKSAvIDQpOworCWVsc2UgaWYgKGN1cnJzaWcgPj0gNDEgJiYgY3VycnNpZyA8PSA2MCkKKwkJcmV0c2lnID0gNzggKyAoKGN1cnJzaWcgLSA0MCkgLyAyKTsKKwllbHNlIGlmIChjdXJyc2lnID49IDMxICYmIGN1cnJzaWcgPD0gNDApCisJCXJldHNpZyA9IDY2ICsgKGN1cnJzaWcgLSAzMCk7CisJZWxzZSBpZiAoY3VycnNpZyA+PSAyMSAmJiBjdXJyc2lnIDw9IDMwKQorCQlyZXRzaWcgPSA1NCArIChjdXJyc2lnIC0gMjApOworCWVsc2UgaWYgKGN1cnJzaWcgPj0gNSAmJiBjdXJyc2lnIDw9IDIwKQorCQlyZXRzaWcgPSA0MiArICgoKGN1cnJzaWcgLSA1KSAqIDIpIC8gMyk7CisJZWxzZSBpZiAoY3VycnNpZyA9PSA0KQorCQlyZXRzaWcgPSAzNjsKKwllbHNlIGlmIChjdXJyc2lnID09IDMpCisJCXJldHNpZyA9IDI3OworCWVsc2UgaWYgKGN1cnJzaWcgPT0gMikKKwkJcmV0c2lnID0gMTg7CisJZWxzZSBpZiAoY3VycnNpZyA9PSAxKQorCQlyZXRzaWcgPSA5OworCWVsc2UKKwkJcmV0c2lnID0gY3VycnNpZzsKKwlyZXR1cm4gcmV0c2lnOworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkZV9xdWVyeV9yeHBoeXN0YXR1cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICAgc3RydWN0IHJ0bF9zdGF0cyAqcHN0YXRzLAorCQkJCSAgICAgICBzdHJ1Y3QgcnhfZGVzY185MmQgKnBkZXNjLAorCQkJCSAgICAgICBzdHJ1Y3QgcnhfZndpbmZvXzkyZCAqcF9kcnZpbmZvLAorCQkJCSAgICAgICBib29sIHBhY2tldF9tYXRjaF9ic3NpZCwKKwkJCQkgICAgICAgYm9vbCBwYWNrZXRfdG9zZWxmLAorCQkJCSAgICAgICBib29sIHBhY2tldF9iZWFjb24pCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxwcml2KTsKKwlzdHJ1Y3QgcGh5X3N0c19jY2tfODE5MmQgKmNja19idWY7CisJczggcnhfcHdyX2FsbCwgcnhfcHdyWzRdOworCXU4IHJmX3J4X251bSA9IDAsIGV2bSwgcHdkYl9hbGw7CisJdTggaSwgbWF4X3NwYXRpYWxfc3RyZWFtOworCXUzMiByc3NpLCB0b3RhbF9yc3NpID0gMDsKKwlib29sIGlzX2Nja19yYXRlOworCisJaXNfY2NrX3JhdGUgPSBSWF9IQUxfSVNfQ0NLX1JBVEUocGRlc2MpOworCXBzdGF0cy0+cGFja2V0X21hdGNoYnNzaWQgPSBwYWNrZXRfbWF0Y2hfYnNzaWQ7CisJcHN0YXRzLT5wYWNrZXRfdG9zZWxmID0gcGFja2V0X3Rvc2VsZjsKKwlwc3RhdHMtPnBhY2tldF9iZWFjb24gPSBwYWNrZXRfYmVhY29uOworCXBzdGF0cy0+aXNfY2NrID0gaXNfY2NrX3JhdGU7CisJcHN0YXRzLT5yeF9taW1vX3NpZ25hbHF1YWxpdHlbMF0gPSAtMTsKKwlwc3RhdHMtPnJ4X21pbW9fc2lnbmFscXVhbGl0eVsxXSA9IC0xOworCisJaWYgKGlzX2Nja19yYXRlKSB7CisJCXU4IHJlcG9ydCwgY2NrX2hpZ2hwd3I7CisJCWNja19idWYgPSAoc3RydWN0IHBoeV9zdHNfY2NrXzgxOTJkICopcF9kcnZpbmZvOworCQlpZiAocHBzYy0+cmZwd3Jfc3RhdGUgPT0gRVJGT04pCisJCQljY2tfaGlnaHB3ciA9ICh1OCkgcnRsX2dldF9iYnJlZyhodywKKwkJCQkJCSBSRlBHQTBfWEFfSFNTSVBBUkFNRVRFUjIsCisJCQkJCQkgQklUKDkpKTsKKwkJZWxzZQorCQkJY2NrX2hpZ2hwd3IgPSBmYWxzZTsKKwkJaWYgKCFjY2tfaGlnaHB3cikgeworCQkJdTggY2NrX2FnY19ycHQgPSBjY2tfYnVmLT5jY2tfYWdjX3JwdDsKKwkJCXJlcG9ydCA9IGNja19idWYtPmNja19hZ2NfcnB0ICYgMHhjMDsKKwkJCXJlcG9ydCA9IHJlcG9ydCA+PiA2OworCQkJc3dpdGNoIChyZXBvcnQpIHsKKwkJCWNhc2UgMHgzOgorCQkJCXJ4X3B3cl9hbGwgPSAtNDYgLSAoY2NrX2FnY19ycHQgJiAweDNlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgyOgorCQkJCXJ4X3B3cl9hbGwgPSAtMjYgLSAoY2NrX2FnY19ycHQgJiAweDNlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgxOgorCQkJCXJ4X3B3cl9hbGwgPSAtMTIgLSAoY2NrX2FnY19ycHQgJiAweDNlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwOgorCQkJCXJ4X3B3cl9hbGwgPSAxNiAtIChjY2tfYWdjX3JwdCAmIDB4M2UpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJdTggY2NrX2FnY19ycHQgPSBjY2tfYnVmLT5jY2tfYWdjX3JwdDsKKwkJCXJlcG9ydCA9IHBfZHJ2aW5mby0+Y2Zvc2hvWzBdICYgMHg2MDsKKwkJCXJlcG9ydCA9IHJlcG9ydCA+PiA1OworCQkJc3dpdGNoIChyZXBvcnQpIHsKKwkJCWNhc2UgMHgzOgorCQkJCXJ4X3B3cl9hbGwgPSAtNDYgLSAoKGNja19hZ2NfcnB0ICYgMHgxZikgPDwgMSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MjoKKwkJCQlyeF9wd3JfYWxsID0gLTI2IC0gKChjY2tfYWdjX3JwdCAmIDB4MWYpIDw8IDEpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDE6CisJCQkJcnhfcHdyX2FsbCA9IC0xMiAtICgoY2NrX2FnY19ycHQgJiAweDFmKSA8PCAxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwOgorCQkJCXJ4X3B3cl9hbGwgPSAxNiAtICgoY2NrX2FnY19ycHQgJiAweDFmKSA8PCAxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwd2RiX2FsbCA9IF9ydGw5MmRfcXVlcnlfcnhwd3JwZXJjZW50YWdlKHJ4X3B3cl9hbGwpOworCQkvKiBDQ0sgZ2FpbiBpcyBzbWFsbGVyIHRoYW4gT0ZETS9NQ1MgZ2FpbiwgICovCisJCS8qIHNvIHdlIGFkZCBnYWluIGRpZmYgYnkgZXhwZXJpZW5jZXMsIHRoZSB2YWwgaXMgNiAqLworCQlwd2RiX2FsbCArPSA2OworCQlpZiAocHdkYl9hbGwgPiAxMDApCisJCQlwd2RiX2FsbCA9IDEwMDsKKwkJLyogbW9kaWZ5IHRoZSBvZmZzZXQgdG8gbWFrZSB0aGUgc2FtZSBnYWluIGluZGV4IHdpdGggT0ZETS4gKi8KKwkJaWYgKHB3ZGJfYWxsID4gMzQgJiYgcHdkYl9hbGwgPD0gNDIpCisJCQlwd2RiX2FsbCAtPSAyOworCQllbHNlIGlmIChwd2RiX2FsbCA+IDI2ICYmIHB3ZGJfYWxsIDw9IDM0KQorCQkJcHdkYl9hbGwgLT0gNjsKKwkJZWxzZSBpZiAocHdkYl9hbGwgPiAxNCAmJiBwd2RiX2FsbCA8PSAyNikKKwkJCXB3ZGJfYWxsIC09IDg7CisJCWVsc2UgaWYgKHB3ZGJfYWxsID4gNCAmJiBwd2RiX2FsbCA8PSAxNCkKKwkJCXB3ZGJfYWxsIC09IDQ7CisJCXBzdGF0cy0+cnhfcHdkYl9hbGwgPSBwd2RiX2FsbDsKKwkJcHN0YXRzLT5yZWN2c2lnbmFscG93ZXIgPSByeF9wd3JfYWxsOworCQlpZiAocGFja2V0X21hdGNoX2Jzc2lkKSB7CisJCQl1OCBzcTsKKwkJCWlmIChwc3RhdHMtPnJ4X3B3ZGJfYWxsID4gNDApIHsKKwkJCQlzcSA9IDEwMDsKKwkJCX0gZWxzZSB7CisJCQkJc3EgPSBjY2tfYnVmLT5zcV9ycHQ7CisJCQkJaWYgKHNxID4gNjQpCisJCQkJCXNxID0gMDsKKwkJCQllbHNlIGlmIChzcSA8IDIwKQorCQkJCQlzcSA9IDEwMDsKKwkJCQllbHNlCisJCQkJCXNxID0gKCg2NCAtIHNxKSAqIDEwMCkgLyA0NDsKKwkJCX0KKwkJCXBzdGF0cy0+c2lnbmFscXVhbGl0eSA9IHNxOworCQkJcHN0YXRzLT5yeF9taW1vX3NpZ25hbHF1YWxpdHlbMF0gPSBzcTsKKwkJCXBzdGF0cy0+cnhfbWltb19zaWduYWxxdWFsaXR5WzFdID0gLTE7CisJCX0KKwl9IGVsc2UgeworCQlydGxwcml2LT5kbS5yZnBhdGhfcnhlbmFibGVbMF0gPSB0cnVlOworCQlydGxwcml2LT5kbS5yZnBhdGhfcnhlbmFibGVbMV0gPSB0cnVlOworCQlmb3IgKGkgPSBSRjkwX1BBVEhfQTsgaSA8IFJGNjA1Ml9NQVhfUEFUSDsgaSsrKSB7CisJCQlpZiAocnRscHJpdi0+ZG0ucmZwYXRoX3J4ZW5hYmxlW2ldKQorCQkJCXJmX3J4X251bSsrOworCQkJcnhfcHdyW2ldID0gKChwX2RydmluZm8tPmdhaW5fdHJzd1tpXSAmIDB4M2YpICogMikKKwkJCQkgICAgLSAxMTA7CisJCQlyc3NpID0gX3J0bDkyZF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UocnhfcHdyW2ldKTsKKwkJCXRvdGFsX3Jzc2kgKz0gcnNzaTsKKwkJCXJ0bHByaXYtPnN0YXRzLnJ4X3Nucl9kYltpXSA9CisJCQkJCSAobG9uZykocF9kcnZpbmZvLT5yeHNucltpXSAvIDIpOworCQkJaWYgKHBhY2tldF9tYXRjaF9ic3NpZCkKKwkJCQlwc3RhdHMtPnJ4X21pbW9fc2lnbmFsc3RyZW5ndGhbaV0gPSAodTgpIHJzc2k7CisJCX0KKwkJcnhfcHdyX2FsbCA9ICgocF9kcnZpbmZvLT5wd2RiX2FsbCA+PiAxKSAmIDB4N2YpIC0gMTA2OworCQlwd2RiX2FsbCA9IF9ydGw5MmRfcXVlcnlfcnhwd3JwZXJjZW50YWdlKHJ4X3B3cl9hbGwpOworCQlwc3RhdHMtPnJ4X3B3ZGJfYWxsID0gcHdkYl9hbGw7CisJCXBzdGF0cy0+cnhwb3dlciA9IHJ4X3B3cl9hbGw7CisJCXBzdGF0cy0+cmVjdnNpZ25hbHBvd2VyID0gcnhfcHdyX2FsbDsKKwkJaWYgKHBkZXNjLT5yeGh0ICYmIHBkZXNjLT5yeG1jcyA+PSBERVNDOTJEX1JBVEVNQ1M4ICYmCisJCSAgICBwZGVzYy0+cnhtY3MgPD0gREVTQzkyRF9SQVRFTUNTMTUpCisJCQltYXhfc3BhdGlhbF9zdHJlYW0gPSAyOworCQllbHNlCisJCQltYXhfc3BhdGlhbF9zdHJlYW0gPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgbWF4X3NwYXRpYWxfc3RyZWFtOyBpKyspIHsKKwkJCWV2bSA9IF9ydGw5MmRfZXZtX2RiX3RvX3BlcmNlbnRhZ2UocF9kcnZpbmZvLT5yeGV2bVtpXSk7CisJCQlpZiAocGFja2V0X21hdGNoX2Jzc2lkKSB7CisJCQkJaWYgKGkgPT0gMCkKKwkJCQkJcHN0YXRzLT5zaWduYWxxdWFsaXR5ID0KKwkJCQkJCSAodTgpKGV2bSAmIDB4ZmYpOworCQkJCXBzdGF0cy0+cnhfbWltb19zaWduYWxxdWFsaXR5W2ldID0KKwkJCQkJCSAodTgpKGV2bSAmIDB4ZmYpOworCQkJfQorCQl9CisJfQorCWlmIChpc19jY2tfcmF0ZSkKKwkJcHN0YXRzLT5zaWduYWxzdHJlbmd0aCA9ICh1OCkoX3J0bDkyZGVfc2lnbmFsX3NjYWxlX21hcHBpbmcoaHcsCisJCQkJcHdkYl9hbGwpKTsKKwllbHNlIGlmIChyZl9yeF9udW0gIT0gMCkKKwkJcHN0YXRzLT5zaWduYWxzdHJlbmd0aCA9ICh1OCkoX3J0bDkyZGVfc2lnbmFsX3NjYWxlX21hcHBpbmcoaHcsCisJCQkJdG90YWxfcnNzaSAvPSByZl9yeF9udW0pKTsKK30KKworc3RhdGljIHZvaWQgcnRsOTJkX2xvb3Bfb3Zlcl9wYXRocyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBzdHJ1Y3QgcnRsX3N0YXRzICpwc3RhdHMpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CisJdTggcmZwYXRoOworCisJZm9yIChyZnBhdGggPSBSRjkwX1BBVEhfQTsgcmZwYXRoIDwgcnRscGh5LT5udW1fdG90YWxfcmZwYXRoOworCSAgICAgcmZwYXRoKyspIHsKKwkJaWYgKHJ0bHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID09IDApIHsKKwkJCXJ0bHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID0KKwkJCSAgICBwc3RhdHMtPnJ4X21pbW9fc2lnbmFsc3RyZW5ndGhbcmZwYXRoXTsKKworCQl9CisJCWlmIChwc3RhdHMtPnJ4X21pbW9fc2lnbmFsc3RyZW5ndGhbcmZwYXRoXSA+CisJCSAgICBydGxwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSkgeworCQkJcnRscHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPQorCQkJICAgICgocnRscHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gKgorCQkJICAgICAgKFJYX1NNT09USF9GQUNUT1IgLSAxKSkgKworCQkJICAgICAocHN0YXRzLT5yeF9taW1vX3NpZ25hbHN0cmVuZ3RoW3JmcGF0aF0pKSAvCisJCQkgICAgKFJYX1NNT09USF9GQUNUT1IpOworCQkJcnRscHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPQorCQkJICAgIHJ0bHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdICsgMTsKKwkJfSBlbHNlIHsKKwkJCXJ0bHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID0KKwkJCSAgICAoKHJ0bHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdICoKKwkJCSAgICAgIChSWF9TTU9PVEhfRkFDVE9SIC0gMSkpICsKKwkJCSAgICAgKHBzdGF0cy0+cnhfbWltb19zaWduYWxzdHJlbmd0aFtyZnBhdGhdKSkgLworCQkJICAgIChSWF9TTU9PVEhfRkFDVE9SKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX3J0bDkyZGVfcHJvY2Vzc191aV9yc3NpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgc3RydWN0IHJ0bF9zdGF0cyAqcHN0YXRzKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgbGFzdF9yc3NpLCB0bXB2YWw7CisKKwlpZiAocHN0YXRzLT5wYWNrZXRfdG9zZWxmIHx8IHBzdGF0cy0+cGFja2V0X2JlYWNvbikgeworCQlydGxwcml2LT5zdGF0cy5yc3NpX2NhbGN1bGF0ZV9jbnQrKzsKKwkJaWYgKHJ0bHByaXYtPnN0YXRzLnVpX3Jzc2kudG90YWxfbnVtKysgPj0KKwkJICAgIFBIWV9SU1NJX1NMSURfV0lOX01BWCkgeworCQkJcnRscHJpdi0+c3RhdHMudWlfcnNzaS50b3RhbF9udW0gPQorCQkJCQkJIFBIWV9SU1NJX1NMSURfV0lOX01BWDsKKwkJCWxhc3RfcnNzaSA9IHJ0bHByaXYtPnN0YXRzLnVpX3Jzc2kuZWxlbWVudHNbCisJCQkJcnRscHJpdi0+c3RhdHMudWlfcnNzaS5pbmRleF07CisJCQlydGxwcml2LT5zdGF0cy51aV9yc3NpLnRvdGFsX3ZhbCAtPSBsYXN0X3Jzc2k7CisJCX0KKwkJcnRscHJpdi0+c3RhdHMudWlfcnNzaS50b3RhbF92YWwgKz0gcHN0YXRzLT5zaWduYWxzdHJlbmd0aDsKKwkJcnRscHJpdi0+c3RhdHMudWlfcnNzaS5lbGVtZW50cworCQkJW3J0bHByaXYtPnN0YXRzLnVpX3Jzc2kuaW5kZXgrK10gPQorCQkJcHN0YXRzLT5zaWduYWxzdHJlbmd0aDsKKwkJaWYgKHJ0bHByaXYtPnN0YXRzLnVpX3Jzc2kuaW5kZXggPj0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYKQorCQkJcnRscHJpdi0+c3RhdHMudWlfcnNzaS5pbmRleCA9IDA7CisJCXRtcHZhbCA9IHJ0bHByaXYtPnN0YXRzLnVpX3Jzc2kudG90YWxfdmFsIC8KKwkJCXJ0bHByaXYtPnN0YXRzLnVpX3Jzc2kudG90YWxfbnVtOworCQlydGxwcml2LT5zdGF0cy5zaWduYWxfc3RyZW5ndGggPSBfcnRsOTJkZV90cmFuc2xhdGVfdG9kYm0oaHcsCisJCQkodTgpIHRtcHZhbCk7CisJCXBzdGF0cy0+cnNzaSA9IHJ0bHByaXYtPnN0YXRzLnNpZ25hbF9zdHJlbmd0aDsKKwl9CisJaWYgKCFwc3RhdHMtPmlzX2NjayAmJiBwc3RhdHMtPnBhY2tldF90b3NlbGYpCisJCXJ0bDkyZF9sb29wX292ZXJfcGF0aHMoaHcsIHBzdGF0cyk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRlX3VwZGF0ZV9yeHNpZ25hbHN0YXRpc3RpY3Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICAgICBzdHJ1Y3QgcnRsX3N0YXRzICpwc3RhdHMpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCWludCB3ZWlnaHRpbmcgPSAwOworCisJaWYgKHJ0bHByaXYtPnN0YXRzLnJlY3Zfc2lnbmFsX3Bvd2VyID09IDApCisJCXJ0bHByaXYtPnN0YXRzLnJlY3Zfc2lnbmFsX3Bvd2VyID0gcHN0YXRzLT5yZWN2c2lnbmFscG93ZXI7CisJaWYgKHBzdGF0cy0+cmVjdnNpZ25hbHBvd2VyID4gcnRscHJpdi0+c3RhdHMucmVjdl9zaWduYWxfcG93ZXIpCisJCXdlaWdodGluZyA9IDU7CisJZWxzZSBpZiAocHN0YXRzLT5yZWN2c2lnbmFscG93ZXIgPCBydGxwcml2LT5zdGF0cy5yZWN2X3NpZ25hbF9wb3dlcikKKwkJd2VpZ2h0aW5nID0gKC01KTsKKwlydGxwcml2LT5zdGF0cy5yZWN2X3NpZ25hbF9wb3dlciA9IChydGxwcml2LT5zdGF0cy5yZWN2X3NpZ25hbF9wb3dlciAqCisJCTUgKyBwc3RhdHMtPnJlY3ZzaWduYWxwb3dlciArIHdlaWdodGluZykgLyA2OworfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkZV9wcm9jZXNzX3B3ZGIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICBzdHJ1Y3QgcnRsX3N0YXRzICpwc3RhdHMpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJbG9uZyB1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOworCisJaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DCXx8CisJCW1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKQorCQlyZXR1cm47CisJZWxzZQorCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0KKwkJICAgIHJ0bHByaXYtPmRtLnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CisKKwlpZiAocHN0YXRzLT5wYWNrZXRfdG9zZWxmIHx8IHBzdGF0cy0+cGFja2V0X2JlYWNvbikgeworCQlpZiAodW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IDApCisJCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gcHN0YXRzLT5yeF9wd2RiX2FsbDsKKwkJaWYgKHBzdGF0cy0+cnhfcHdkYl9hbGwgPiAodTMyKSB1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiKSB7CisJCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0KKwkJCSAgICAgICgoKHVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIpICoKKwkJCSAgICAgIChSWF9TTU9PVEhfRkFDVE9SIC0gMSkpICsKKwkJCSAgICAgIChwc3RhdHMtPnJ4X3B3ZGJfYWxsKSkgLyAoUlhfU01PT1RIX0ZBQ1RPUik7CisJCQl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0KKwkJCSAgICAgIHVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgKyAxOworCQl9IGVsc2UgeworCQkJdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9CisJCQkgICAgICAoKCh1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiKSAqCisJCQkgICAgICAoUlhfU01PT1RIX0ZBQ1RPUiAtIDEpKSArCisJCQkgICAgICAocHN0YXRzLT5yeF9wd2RiX2FsbCkpIC8gKFJYX1NNT09USF9GQUNUT1IpOworCQl9CisJCXJ0bHByaXYtPmRtLnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPQorCQkJCSB1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOworCQlfcnRsOTJkZV91cGRhdGVfcnhzaWduYWxzdGF0aXN0aWNzKGh3LCBwc3RhdHMpOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsOTJkX2xvb3Bfb3Zlcl9zdHJlYW1zKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgc3RydWN0IHJ0bF9zdGF0cyAqcHN0YXRzKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlpbnQgc3RyZWFtOworCisJZm9yIChzdHJlYW0gPSAwOyBzdHJlYW0gPCAyOyBzdHJlYW0rKykgeworCQlpZiAocHN0YXRzLT5yeF9taW1vX3NpZ25hbHF1YWxpdHlbc3RyZWFtXSAhPSAtMSkgeworCQkJaWYgKHJ0bHByaXYtPnN0YXRzLnJ4X2V2bV9wZXJjZW50YWdlW3N0cmVhbV0gPT0gMCkgeworCQkJCXJ0bHByaXYtPnN0YXRzLnJ4X2V2bV9wZXJjZW50YWdlW3N0cmVhbV0gPQorCQkJCSAgICBwc3RhdHMtPnJ4X21pbW9fc2lnbmFscXVhbGl0eVtzdHJlYW1dOworCQkJfQorCQkJcnRscHJpdi0+c3RhdHMucnhfZXZtX3BlcmNlbnRhZ2Vbc3RyZWFtXSA9CisJCQkgICAgKChydGxwcml2LT5zdGF0cy5yeF9ldm1fcGVyY2VudGFnZVtzdHJlYW1dCisJCQkgICAgICAqIChSWF9TTU9PVEhfRkFDVE9SIC0gMSkpICsKKwkJCSAgICAgKHBzdGF0cy0+cnhfbWltb19zaWduYWxxdWFsaXR5W3N0cmVhbV0gKiAxKSkgLworCQkJICAgIChSWF9TTU9PVEhfRkFDVE9SKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX3J0bDkyZGVfcHJvY2Vzc191aV9saW5rX3F1YWxpdHkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICAgc3RydWN0IHJ0bF9zdGF0cyAqcHN0YXRzKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwl1MzIgbGFzdF9ldm0sIHRtcHZhbDsKKworCWlmIChwc3RhdHMtPnNpZ25hbHF1YWxpdHkgPT0gMCkKKwkJcmV0dXJuOworCWlmIChwc3RhdHMtPnBhY2tldF90b3NlbGYgfHwgcHN0YXRzLT5wYWNrZXRfYmVhY29uKSB7CisJCWlmIChydGxwcml2LT5zdGF0cy51aV9saW5rX3F1YWxpdHkudG90YWxfbnVtKysgPj0KKwkJICAgIFBIWV9MSU5LUVVBTElUWV9TTElEX1dJTl9NQVgpIHsKKwkJCXJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS50b3RhbF9udW0gPQorCQkJICAgIFBIWV9MSU5LUVVBTElUWV9TTElEX1dJTl9NQVg7CisJCQlsYXN0X2V2bSA9IHJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS5lbGVtZW50c1sKKwkJCQlydGxwcml2LT5zdGF0cy51aV9saW5rX3F1YWxpdHkuaW5kZXhdOworCQkJcnRscHJpdi0+c3RhdHMudWlfbGlua19xdWFsaXR5LnRvdGFsX3ZhbCAtPSBsYXN0X2V2bTsKKwkJfQorCQlydGxwcml2LT5zdGF0cy51aV9saW5rX3F1YWxpdHkudG90YWxfdmFsICs9CisJCQkJCQkgcHN0YXRzLT5zaWduYWxxdWFsaXR5OworCQlydGxwcml2LT5zdGF0cy51aV9saW5rX3F1YWxpdHkuZWxlbWVudHNbCisJCQlydGxwcml2LT5zdGF0cy51aV9saW5rX3F1YWxpdHkuaW5kZXgrK10gPQorCQkJCQkJIHBzdGF0cy0+c2lnbmFscXVhbGl0eTsKKwkJaWYgKHJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS5pbmRleCA+PQorCQkgICAgUEhZX0xJTktRVUFMSVRZX1NMSURfV0lOX01BWCkKKwkJCXJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS5pbmRleCA9IDA7CisJCXRtcHZhbCA9IHJ0bHByaXYtPnN0YXRzLnVpX2xpbmtfcXVhbGl0eS50b3RhbF92YWwgLworCQkgICAgcnRscHJpdi0+c3RhdHMudWlfbGlua19xdWFsaXR5LnRvdGFsX251bTsKKwkJcnRscHJpdi0+c3RhdHMuc2lnbmFsX3F1YWxpdHkgPSB0bXB2YWw7CisJCXJ0bHByaXYtPnN0YXRzLmxhc3Rfc2lnc3RyZW5ndGhfaW5wZXJjZW50ID0gdG1wdmFsOworCQlydGw5MmRfbG9vcF9vdmVyX3N0cmVhbXMoaHcsIHBzdGF0cyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfcnRsOTJkZV9wcm9jZXNzX3BoeWluZm8oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICB1OCAqYnVmZmVyLAorCQkJCSAgICAgc3RydWN0IHJ0bF9zdGF0cyAqcGN1cnJlbnRfc3RhdHMpCit7CisKKwlpZiAoIXBjdXJyZW50X3N0YXRzLT5wYWNrZXRfbWF0Y2hic3NpZCAmJgorCSAgICAhcGN1cnJlbnRfc3RhdHMtPnBhY2tldF9iZWFjb24pCisJCXJldHVybjsKKworCV9ydGw5MmRlX3Byb2Nlc3NfdWlfcnNzaShodywgcGN1cnJlbnRfc3RhdHMpOworCV9ydGw5MmRlX3Byb2Nlc3NfcHdkYihodywgcGN1cnJlbnRfc3RhdHMpOworCV9ydGw5MmRlX3Byb2Nlc3NfdWlfbGlua19xdWFsaXR5KGh3LCBwY3VycmVudF9zdGF0cyk7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRlX3RyYW5zbGF0ZV9yeF9zaWduYWxfc3R1ZmYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgICAgc3RydWN0IHJ0bF9zdGF0cyAqcHN0YXRzLAorCQkJCQkgICAgICAgc3RydWN0IHJ4X2Rlc2NfOTJkICpwZGVzYywKKwkJCQkJICAgICAgIHN0cnVjdCByeF9md2luZm9fOTJkICpwX2RydmluZm8pCit7CisJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2VmdXNlICpydGxlZnVzZSA9IHJ0bF9lZnVzZShydGxfcHJpdihodykpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJdTggKnRtcF9idWY7CisJdTggKnByYWRkcjsKKwl1MTYgdHlwZSwgY2ZjOworCV9fbGUxNiBmYzsKKwlib29sIHBhY2tldF9tYXRjaGJzc2lkLCBwYWNrZXRfdG9zZWxmLCBwYWNrZXRfYmVhY29uOworCisJdG1wX2J1ZiA9IHNrYi0+ZGF0YSArIHBzdGF0cy0+cnhfZHJ2aW5mb19zaXplICsgcHN0YXRzLT5yeF9idWZzaGlmdDsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKil0bXBfYnVmOworCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOworCWNmYyA9IGxlMTZfdG9fY3B1KGZjKTsKKwl0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CisJcHJhZGRyID0gaGRyLT5hZGRyMTsKKwlwYWNrZXRfbWF0Y2hic3NpZCA9ICgoSUVFRTgwMjExX0ZUWVBFX0NUTCAhPSB0eXBlKSAmJgorCSAgICAgKCFjb21wYXJlX2V0aGVyX2FkZHIobWFjLT5ic3NpZCwgKGNmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpID8KKwkJICBoZHItPmFkZHIxIDogKGNmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykgPworCQkgIGhkci0+YWRkcjIgOiBoZHItPmFkZHIzKSkgJiYgKCFwc3RhdHMtPmh3ZXJyb3IpICYmCisJCSAgKCFwc3RhdHMtPmNyYykgJiYgKCFwc3RhdHMtPmljdikpOworCXBhY2tldF90b3NlbGYgPSBwYWNrZXRfbWF0Y2hic3NpZCAmJgorCQkJKCFjb21wYXJlX2V0aGVyX2FkZHIocHJhZGRyLCBydGxlZnVzZS0+ZGV2X2FkZHIpKTsKKwlpZiAoaWVlZTgwMjExX2lzX2JlYWNvbihmYykpCisJCXBhY2tldF9iZWFjb24gPSB0cnVlOworCV9ydGw5MmRlX3F1ZXJ5X3J4cGh5c3RhdHVzKGh3LCBwc3RhdHMsIHBkZXNjLCBwX2RydmluZm8sCisJCQkJICAgcGFja2V0X21hdGNoYnNzaWQsIHBhY2tldF90b3NlbGYsCisJCQkJICAgcGFja2V0X2JlYWNvbik7CisJX3J0bDkyZGVfcHJvY2Vzc19waHlpbmZvKGh3LCB0bXBfYnVmLCBwc3RhdHMpOworfQorCitib29sIHJ0bDkyZGVfcnhfcXVlcnlfZGVzYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywJc3RydWN0IHJ0bF9zdGF0cyAqc3RhdHMsCisJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMsCisJCXU4ICpwX2Rlc2MsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ4X2Z3aW5mb185MmQgKnBfZHJ2aW5mbzsKKwlzdHJ1Y3QgcnhfZGVzY185MmQgKnBkZXNjID0gKHN0cnVjdCByeF9kZXNjXzkyZCAqKXBfZGVzYzsKKwl1MzIgcGh5c3RhdHVzID0gR0VUX1JYX0RFU0NfUEhZU1QocGRlc2MpOworCisJc3RhdHMtPmxlbmd0aCA9ICh1MTYpIEdFVF9SWF9ERVNDX1BLVF9MRU4ocGRlc2MpOworCXN0YXRzLT5yeF9kcnZpbmZvX3NpemUgPSAodTgpIEdFVF9SWF9ERVNDX0RSVl9JTkZPX1NJWkUocGRlc2MpICoKKwkJCQkgUlhfRFJWX0lORk9fU0laRV9VTklUOworCXN0YXRzLT5yeF9idWZzaGlmdCA9ICh1OCkgKEdFVF9SWF9ERVNDX1NISUZUKHBkZXNjKSAmIDB4MDMpOworCXN0YXRzLT5pY3YgPSAodTE2KSBHRVRfUlhfREVTQ19JQ1YocGRlc2MpOworCXN0YXRzLT5jcmMgPSAodTE2KSBHRVRfUlhfREVTQ19DUkMzMihwZGVzYyk7CisJc3RhdHMtPmh3ZXJyb3IgPSAoc3RhdHMtPmNyYyB8IHN0YXRzLT5pY3YpOworCXN0YXRzLT5kZWNyeXB0ZWQgPSAhR0VUX1JYX0RFU0NfU1dERUMocGRlc2MpOworCXN0YXRzLT5yYXRlID0gKHU4KSBHRVRfUlhfREVTQ19SWE1DUyhwZGVzYyk7CisJc3RhdHMtPnNob3J0cHJlYW1ibGUgPSAodTE2KSBHRVRfUlhfREVTQ19TUExDUChwZGVzYyk7CisJc3RhdHMtPmlzYW1wZHUgPSAoYm9vbCkgKEdFVF9SWF9ERVNDX1BBR0dSKHBkZXNjKSA9PSAxKTsKKwlzdGF0cy0+aXNmaXJzdF9hbXBkdSA9IChib29sKSAoKEdFVF9SWF9ERVNDX1BBR0dSKHBkZXNjKSA9PSAxKQorCQkJCQkgJiYgKEdFVF9SWF9ERVNDX0ZBR0dSKHBkZXNjKSA9PSAxKSk7CisJc3RhdHMtPnRpbWVzdGFtcF9sb3cgPSBHRVRfUlhfREVTQ19UU0ZMKHBkZXNjKTsKKwlzdGF0cy0+cnhfaXM0ME1oenBhY2tldCA9IChib29sKSBHRVRfUlhfREVTQ19CVyhwZGVzYyk7CisJcnhfc3RhdHVzLT5mcmVxID0gaHctPmNvbmYuY2hhbm5lbC0+Y2VudGVyX2ZyZXE7CisJcnhfc3RhdHVzLT5iYW5kID0gaHctPmNvbmYuY2hhbm5lbC0+YmFuZDsKKwlpZiAoR0VUX1JYX0RFU0NfQ1JDMzIocGRlc2MpKQorCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19GQUlMRURfRkNTX0NSQzsKKwlpZiAoIUdFVF9SWF9ERVNDX1NXREVDKHBkZXNjKSkKKwkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfREVDUllQVEVEOworCWlmIChHRVRfUlhfREVTQ19CVyhwZGVzYykpCisJCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHXzQwTUhaOworCWlmIChHRVRfUlhfREVTQ19SWEhUKHBkZXNjKSkKKwkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfSFQ7CisJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfTUFDVElNRV9NUERVOworCWlmIChzdGF0cy0+ZGVjcnlwdGVkKQorCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19ERUNSWVBURUQ7CisJcnhfc3RhdHVzLT5yYXRlX2lkeCA9IF9ydGw5MmRlX3JhdGVfbWFwcGluZygoYm9vbCkKKwkJCQkJCSAgICBHRVRfUlhfREVTQ19SWEhUKHBkZXNjKSwKKwkJCQkJCSAgICAodTgpCisJCQkJCQkgICAgR0VUX1JYX0RFU0NfUlhNQ1MocGRlc2MpKTsKKwlyeF9zdGF0dXMtPm1hY3RpbWUgPSBHRVRfUlhfREVTQ19UU0ZMKHBkZXNjKTsKKwlpZiAocGh5c3RhdHVzKSB7CisJCXBfZHJ2aW5mbyA9IChzdHJ1Y3QgcnhfZndpbmZvXzkyZCAqKShza2ItPmRhdGEgKworCQkJCQkJICAgICBzdGF0cy0+cnhfYnVmc2hpZnQpOworCQlfcnRsOTJkZV90cmFuc2xhdGVfcnhfc2lnbmFsX3N0dWZmKGh3LAorCQkJCQkJICAgc2tiLCBzdGF0cywgcGRlc2MsCisJCQkJCQkgICBwX2RydmluZm8pOworCX0KKwkvKnJ4X3N0YXR1cy0+cXVhbCA9IHN0YXRzLT5zaWduYWw7ICovCisJcnhfc3RhdHVzLT5zaWduYWwgPSBzdGF0cy0+cnNzaSArIDEwOworCS8qcnhfc3RhdHVzLT5ub2lzZSA9IC1zdGF0cy0+bm9pc2U7ICovCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIF9ydGw5MmRlX2luc2VydF9lbWNvbnRlbnQoc3RydWN0IHJ0bF90Y2JfZGVzYyAqcHRjYl9kZXNjLAorCQkJCSAgICAgIHU4ICp2aXJ0dWFsYWRkcmVzcykKK3sKKwltZW1zZXQodmlydHVhbGFkZHJlc3MsIDAsIDgpOworCisJU0VUX0VBUkxZTU9ERV9QS1ROVU0odmlydHVhbGFkZHJlc3MsIHB0Y2JfZGVzYy0+ZW1wa3RfbnVtKTsKKwlTRVRfRUFSTFlNT0RFX0xFTjAodmlydHVhbGFkZHJlc3MsIHB0Y2JfZGVzYy0+ZW1wa3RfbGVuWzBdKTsKKwlTRVRfRUFSTFlNT0RFX0xFTjEodmlydHVhbGFkZHJlc3MsIHB0Y2JfZGVzYy0+ZW1wa3RfbGVuWzFdKTsKKwlTRVRfRUFSTFlNT0RFX0xFTjJfMSh2aXJ0dWFsYWRkcmVzcywgcHRjYl9kZXNjLT5lbXBrdF9sZW5bMl0gJiAweEYpOworCVNFVF9FQVJMWU1PREVfTEVOMl8yKHZpcnR1YWxhZGRyZXNzLCBwdGNiX2Rlc2MtPmVtcGt0X2xlblsyXSA+PiA0KTsKKwlTRVRfRUFSTFlNT0RFX0xFTjModmlydHVhbGFkZHJlc3MsIHB0Y2JfZGVzYy0+ZW1wa3RfbGVuWzNdKTsKKwlTRVRfRUFSTFlNT0RFX0xFTjQodmlydHVhbGFkZHJlc3MsIHB0Y2JfZGVzYy0+ZW1wa3RfbGVuWzRdKTsKK30KKwordm9pZCBydGw5MmRlX3R4X2ZpbGxfZGVzYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwgdTggKnBkZXNjX3R4LAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHU4IGh3X3F1ZXVlLCBzdHJ1Y3QgcnRsX3RjYl9kZXNjICpwdGNiX2Rlc2MpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CisJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxwcml2KTsKKwlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhID0gaW5mby0+Y29udHJvbC5zdGE7CisJdTggKnBkZXNjID0gKHU4ICopIHBkZXNjX3R4OworCXUxNiBzZXFfbnVtYmVyOworCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKKwl1bnNpZ25lZCBpbnQgYnVmX2xlbiA9IDA7CisJdW5zaWduZWQgaW50IHNrYl9sZW4gPSBza2ItPmxlbjsKKwl1OCBmd19xc2VsID0gX3J0bDkyZGVfbWFwX2h3cXVldWVfdG9fZndxdWV1ZShza2IsIGh3X3F1ZXVlKTsKKwlib29sIGZpcnN0c2VnID0gKChoZHItPnNlcV9jdHJsICYKKwkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9TQ1RMX0ZSQUcpKSA9PSAwKTsKKwlib29sIGxhc3RzZWcgPSAoKGhkci0+ZnJhbWVfY29udHJvbCAmCisJCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpKSA9PSAwKTsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJdTggYndfNDAgPSAwOworCisJaWYgKG1hYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKKwkJYndfNDAgPSBtYWMtPmJ3XzQwOworCX0gZWxzZSBpZiAobWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkJbWFjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKKwkJaWYgKHN0YSkKKwkJCWJ3XzQwID0gc3RhLT5odF9jYXAuY2FwICYKKwkJCQlJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MDsKKwl9CisJc2VxX251bWJlciA9IChsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNDsKKwlydGxfZ2V0X3RjYl9kZXNjKGh3LCBpbmZvLCBzdGEsIHNrYiwgcHRjYl9kZXNjKTsKKwkvKiByZXNlcnZlIDggYnl0ZSBmb3IgQU1QRFUgZWFybHkgbW9kZSAqLworCWlmIChydGxoYWwtPmVhcmx5bW9kZV9lbmFibGUpIHsKKwkJc2tiX3B1c2goc2tiLCBFTV9IRFJfTEVOKTsKKwkJbWVtc2V0KHNrYi0+ZGF0YSwgMCwgRU1fSERSX0xFTik7CisJfQorCWJ1Zl9sZW4gPSBza2ItPmxlbjsKKwltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocnRscGNpLT5wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwlDTEVBUl9QQ0lfVFhfREVTQ19DT05URU5UKHBkZXNjLCBzaXplb2Yoc3RydWN0IHR4X2Rlc2NfOTJkKSk7CisJaWYgKGllZWU4MDIxMV9pc19udWxsZnVuYyhmYykgfHwgaWVlZTgwMjExX2lzX2N0bChmYykpIHsKKwkJZmlyc3RzZWcgPSB0cnVlOworCQlsYXN0c2VnID0gdHJ1ZTsKKwl9CisJaWYgKGZpcnN0c2VnKSB7CisJCWlmIChydGxoYWwtPmVhcmx5bW9kZV9lbmFibGUpIHsKKwkJCVNFVF9UWF9ERVNDX1BLVF9PRkZTRVQocGRlc2MsIDEpOworCQkJU0VUX1RYX0RFU0NfT0ZGU0VUKHBkZXNjLCBVU0JfSFdERVNDX0hFQURFUl9MRU4gKworCQkJCQkgICBFTV9IRFJfTEVOKTsKKwkJCWlmIChwdGNiX2Rlc2MtPmVtcGt0X251bSkgeworCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfU0VORCwgREJHX0xPVUQsCisJCQkJCSAoIkluc2VydCA4IGJ5dGUucFRjYi0+RU1Qa3ROdW06JWRcbiIsCisJCQkJCSAgcHRjYl9kZXNjLT5lbXBrdF9udW0pKTsKKwkJCQlfcnRsOTJkZV9pbnNlcnRfZW1jb250ZW50KHB0Y2JfZGVzYywKKwkJCQkJCQkgICh1OCAqKShza2ItPmRhdGEpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVNFVF9UWF9ERVNDX09GRlNFVChwZGVzYywgVVNCX0hXREVTQ19IRUFERVJfTEVOKTsKKwkJfQorCQkvKiA1RyBoYXZlIG5vIENDSyByYXRlICovCisJCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81RykKKwkJCWlmIChwdGNiX2Rlc2MtPmh3X3JhdGUgPCBERVNDOTJEX1JBVEU2TSkKKwkJCQlwdGNiX2Rlc2MtPmh3X3JhdGUgPSBERVNDOTJEX1JBVEU2TTsKKwkJU0VUX1RYX0RFU0NfVFhfUkFURShwZGVzYywgcHRjYl9kZXNjLT5od19yYXRlKTsKKwkJaWYgKHB0Y2JfZGVzYy0+dXNlX3Nob3J0Z2kgfHwgcHRjYl9kZXNjLT51c2Vfc2hvcnRwcmVhbWJsZSkKKwkJCVNFVF9UWF9ERVNDX0RBVEFfU0hPUlRHSShwZGVzYywgMSk7CisKKwkJaWYgKHJ0bGhhbC0+bWFjcGh5bW9kZSA9PSBEVUFMTUFDX0RVQUxQSFkgJiYKKwkJCXB0Y2JfZGVzYy0+aHdfcmF0ZSA9PSBERVNDOTJEX1JBVEVNQ1M3KQorCQkJU0VUX1RYX0RFU0NfREFUQV9TSE9SVEdJKHBkZXNjLCAxKTsKKworCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSB7CisJCQlTRVRfVFhfREVTQ19BR0dfRU5BQkxFKHBkZXNjLCAxKTsKKwkJCVNFVF9UWF9ERVNDX01BWF9BR0dfTlVNKHBkZXNjLCAweDE0KTsKKwkJfQorCQlTRVRfVFhfREVTQ19TRVEocGRlc2MsIHNlcV9udW1iZXIpOworCQlTRVRfVFhfREVTQ19SVFNfRU5BQkxFKHBkZXNjLCAoKHB0Y2JfZGVzYy0+cnRzX2VuYWJsZSAmJgorCQkJCSAgICAgICAhcHRjYl9kZXNjLT5jdHNfZW5hYmxlKSA/IDEgOiAwKSk7CisJCVNFVF9UWF9ERVNDX0hXX1JUU19FTkFCTEUocGRlc2MsICgocHRjYl9kZXNjLT5ydHNfZW5hYmxlCisJCQkJCSAgfHwgcHRjYl9kZXNjLT5jdHNfZW5hYmxlKSA/IDEgOiAwKSk7CisJCVNFVF9UWF9ERVNDX0NUUzJTRUxGKHBkZXNjLCAoKHB0Y2JfZGVzYy0+Y3RzX2VuYWJsZSkgPyAxIDogMCkpOworCQlTRVRfVFhfREVTQ19SVFNfU1RCQyhwZGVzYywgKChwdGNiX2Rlc2MtPnJ0c19zdGJjKSA/IDEgOiAwKSk7CisJCS8qIDVHIGhhdmUgbm8gQ0NLIHJhdGUgKi8KKwkJaWYgKHJ0bGhhbC0+Y3VycmVudF9iYW5kdHlwZSA9PSBCQU5EX09OXzVHKQorCQkJaWYgKHB0Y2JfZGVzYy0+cnRzX3JhdGUgPCBERVNDOTJEX1JBVEU2TSkKKwkJCQlwdGNiX2Rlc2MtPnJ0c19yYXRlID0gREVTQzkyRF9SQVRFNk07CisJCVNFVF9UWF9ERVNDX1JUU19SQVRFKHBkZXNjLCBwdGNiX2Rlc2MtPnJ0c19yYXRlKTsKKwkJU0VUX1RYX0RFU0NfUlRTX0JXKHBkZXNjLCAwKTsKKwkJU0VUX1RYX0RFU0NfUlRTX1NDKHBkZXNjLCBwdGNiX2Rlc2MtPnJ0c19zYyk7CisJCVNFVF9UWF9ERVNDX1JUU19TSE9SVChwZGVzYywgKChwdGNiX2Rlc2MtPnJ0c19yYXRlIDw9CisJCQlERVNDOTJEX1JBVEU1NE0pID8KKwkJCShwdGNiX2Rlc2MtPnJ0c191c2Vfc2hvcnRwcmVhbWJsZSA/IDEgOiAwKSA6CisJCQkocHRjYl9kZXNjLT5ydHNfdXNlX3Nob3J0Z2kgPyAxIDogMCkpKTsKKwkJaWYgKGJ3XzQwKSB7CisJCQlpZiAocHRjYl9kZXNjLT5wYWNrZXRfYncpIHsKKwkJCQlTRVRfVFhfREVTQ19EQVRBX0JXKHBkZXNjLCAxKTsKKwkJCQlTRVRfVFhfREVTQ19UWF9TVUJfQ0FSUklFUihwZGVzYywgMyk7CisJCQl9IGVsc2UgeworCQkJCVNFVF9UWF9ERVNDX0RBVEFfQlcocGRlc2MsIDApOworCQkJCVNFVF9UWF9ERVNDX1RYX1NVQl9DQVJSSUVSKHBkZXNjLAorCQkJCQkJCW1hYy0+Y3VyXzQwX3ByaW1lX3NjKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVNFVF9UWF9ERVNDX0RBVEFfQlcocGRlc2MsIDApOworCQkJU0VUX1RYX0RFU0NfVFhfU1VCX0NBUlJJRVIocGRlc2MsIDApOworCQl9CisJCVNFVF9UWF9ERVNDX0xJTklQKHBkZXNjLCAwKTsKKwkJU0VUX1RYX0RFU0NfUEtUX1NJWkUocGRlc2MsICh1MTYpIHNrYl9sZW4pOworCQlpZiAoc3RhKSB7CisJCQl1OCBhbXBkdV9kZW5zaXR5ID0gc3RhLT5odF9jYXAuYW1wZHVfZGVuc2l0eTsKKwkJCVNFVF9UWF9ERVNDX0FNUERVX0RFTlNJVFkocGRlc2MsIGFtcGR1X2RlbnNpdHkpOworCQl9CisJCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSkgeworCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZjsKKworCQkJa2V5Y29uZiA9IGluZm8tPmNvbnRyb2wuaHdfa2V5OworCQkJc3dpdGNoIChrZXljb25mLT5jaXBoZXIpIHsKKwkJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CisJCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKKwkJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKKwkJCQlTRVRfVFhfREVTQ19TRUNfVFlQRShwZGVzYywgMHgxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKwkJCQlTRVRfVFhfREVTQ19TRUNfVFlQRShwZGVzYywgMHgzKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJU0VUX1RYX0RFU0NfU0VDX1RZUEUocGRlc2MsIDB4MCk7CisJCQkJYnJlYWs7CisKKwkJCX0KKwkJfQorCQlTRVRfVFhfREVTQ19QS1RfSUQocGRlc2MsIDApOworCQlTRVRfVFhfREVTQ19RVUVVRV9TRUwocGRlc2MsIGZ3X3FzZWwpOworCQlTRVRfVFhfREVTQ19EQVRBX1JBVEVfRkJfTElNSVQocGRlc2MsIDB4MUYpOworCQlTRVRfVFhfREVTQ19SVFNfUkFURV9GQl9MSU1JVChwZGVzYywgMHhGKTsKKwkJU0VUX1RYX0RFU0NfRElTQUJMRV9GQihwZGVzYywgcHRjYl9kZXNjLT5kaXNhYmxlX3JhdGVmYWxsYmFjayA/CisJCQkJICAgICAgIDEgOiAwKTsKKwkJU0VUX1RYX0RFU0NfVVNFX1JBVEUocGRlc2MsIHB0Y2JfZGVzYy0+dXNlX2RyaXZlcl9yYXRlID8gMSA6IDApOworCisJCS8qIFNldCBUeFJhdGUgYW5kIFJUU1JhdGUgaW4gVHhEZXNjICAqLworCQkvKiBUaGlzIHByZXZlbnQgVHggaW5pdGlhbCByYXRlIG9mIG5ldy1jb21pbmcgcGFja2V0cyAqLworCQkvKiBmcm9tIGJlaW5nIG92ZXJ3cml0dGVuIGJ5IHJldHJpZWQgIHBhY2tldCByYXRlLiovCisJCWlmICghcHRjYl9kZXNjLT51c2VfZHJpdmVyX3JhdGUpIHsKKwkJCVNFVF9UWF9ERVNDX1JUU19SQVRFKHBkZXNjLCAweDA4KTsKKwkJCS8qIFNFVF9UWF9ERVNDX1RYX1JBVEUocGRlc2MsIDB4MGIpOyAqLworCQl9CisJCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CisJCQlpZiAobWFjLT5yZGdfZW4pIHsKKwkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1NFTkQsIERCR19UUkFDRSwKKwkJCQkJKCJFbmFibGUgUkRHIGZ1bmN0aW9uLlxuIikpOworCQkJCVNFVF9UWF9ERVNDX1JER19FTkFCTEUocGRlc2MsIDEpOworCQkJCVNFVF9UWF9ERVNDX0hUQyhwZGVzYywgMSk7CisJCQl9CisJCX0KKwl9CisKKwlTRVRfVFhfREVTQ19GSVJTVF9TRUcocGRlc2MsIChmaXJzdHNlZyA/IDEgOiAwKSk7CisJU0VUX1RYX0RFU0NfTEFTVF9TRUcocGRlc2MsIChsYXN0c2VnID8gMSA6IDApKTsKKwlTRVRfVFhfREVTQ19UWF9CVUZGRVJfU0laRShwZGVzYywgKHUxNikgYnVmX2xlbik7CisJU0VUX1RYX0RFU0NfVFhfQlVGRkVSX0FERFJFU1MocGRlc2MsIG1hcHBpbmcpOworCWlmIChydGxwcml2LT5kbS51c2VyYW1hc2spIHsKKwkJU0VUX1RYX0RFU0NfUkFURV9JRChwZGVzYywgcHRjYl9kZXNjLT5yYXRyX2luZGV4KTsKKwkJU0VUX1RYX0RFU0NfTUFDSUQocGRlc2MsIHB0Y2JfZGVzYy0+bWFjX2lkKTsKKwl9IGVsc2UgeworCQlTRVRfVFhfREVTQ19SQVRFX0lEKHBkZXNjLCAweEMgKyBwdGNiX2Rlc2MtPnJhdHJfaW5kZXgpOworCQlTRVRfVFhfREVTQ19NQUNJRChwZGVzYywgcHRjYl9kZXNjLT5yYXRyX2luZGV4KTsKKwl9CisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpCisJCVNFVF9UWF9ERVNDX1FPUyhwZGVzYywgMSk7CisKKwlpZiAoKCFpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSAmJiBwcHNjLT5md2N0cmxfbHBzKSB7CisJCVNFVF9UWF9ERVNDX0hXU0VRX0VOKHBkZXNjLCAxKTsKKwkJU0VUX1RYX0RFU0NfUEtUX0lEKHBkZXNjLCA4KTsKKwl9CisJU0VUX1RYX0RFU0NfTU9SRV9GUkFHKHBkZXNjLCAobGFzdHNlZyA/IDAgOiAxKSk7CisJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9TRU5ELCBEQkdfVFJBQ0UsICgiXG4iKSk7Cit9CisKK3ZvaWQgcnRsOTJkZV90eF9maWxsX2NtZGRlc2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgIHU4ICpwZGVzYywgYm9vbCBmaXJzdHNlZywKKwkJCSAgICAgYm9vbCBsYXN0c2VnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKKwlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOworCXN0cnVjdCBydGxfcHNfY3RsICpwcHNjID0gcnRsX3BzYyhydGxwcml2KTsKKwlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxwcml2KTsKKwl1OCBmd19xdWV1ZSA9IFFTTFRfQkVBQ09OOworCWRtYV9hZGRyX3QgbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHJ0bHBjaS0+cGRldiwKKwkJICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikoc2tiLT5kYXRhKTsKKwlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CisKKwlDTEVBUl9QQ0lfVFhfREVTQ19DT05URU5UKHBkZXNjLCBUWF9ERVNDX1NJWkUpOworCWlmIChmaXJzdHNlZykKKwkJU0VUX1RYX0RFU0NfT0ZGU0VUKHBkZXNjLCBVU0JfSFdERVNDX0hFQURFUl9MRU4pOworCS8qIDVHIGhhdmUgbm8gQ0NLIHJhdGUKKwkgKiBDYXV0aW9uOiBUaGUgbWFjcm9zIGJlbG93IGFyZSBtdWx0aS1saW5lIGV4cGFuc2lvbnMuCisJICogVGhlIGJyYWNlcyBhcmUgbmVlZGVkIG5vIG1hdHRlciB3aGF0IGNoZWNrcGF0Y2ggc2F5cworCSAqLworCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81RykgeworCQlTRVRfVFhfREVTQ19UWF9SQVRFKHBkZXNjLCBERVNDOTJEX1JBVEU2TSk7CisJfSBlbHNlIHsKKwkJU0VUX1RYX0RFU0NfVFhfUkFURShwZGVzYywgREVTQzkyRF9SQVRFMU0pOworCX0KKwlTRVRfVFhfREVTQ19TRVEocGRlc2MsIDApOworCVNFVF9UWF9ERVNDX0xJTklQKHBkZXNjLCAwKTsKKwlTRVRfVFhfREVTQ19RVUVVRV9TRUwocGRlc2MsIGZ3X3F1ZXVlKTsKKwlTRVRfVFhfREVTQ19GSVJTVF9TRUcocGRlc2MsIDEpOworCVNFVF9UWF9ERVNDX0xBU1RfU0VHKHBkZXNjLCAxKTsKKwlTRVRfVFhfREVTQ19UWF9CVUZGRVJfU0laRShwZGVzYywgKHUxNikgKHNrYi0+bGVuKSk7CisJU0VUX1RYX0RFU0NfVFhfQlVGRkVSX0FERFJFU1MocGRlc2MsIG1hcHBpbmcpOworCVNFVF9UWF9ERVNDX1JBVEVfSUQocGRlc2MsIDcpOworCVNFVF9UWF9ERVNDX01BQ0lEKHBkZXNjLCAwKTsKKwlTRVRfVFhfREVTQ19QS1RfU0laRSgodTggKikgcGRlc2MsICh1MTYpIChza2ItPmxlbikpOworCVNFVF9UWF9ERVNDX0ZJUlNUX1NFRyhwZGVzYywgMSk7CisJU0VUX1RYX0RFU0NfTEFTVF9TRUcocGRlc2MsIDEpOworCVNFVF9UWF9ERVNDX09GRlNFVChwZGVzYywgMHgyMCk7CisJU0VUX1RYX0RFU0NfVVNFX1JBVEUocGRlc2MsIDEpOworCisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpICYmIHBwc2MtPmZ3Y3RybF9scHMpIHsKKwkJU0VUX1RYX0RFU0NfSFdTRVFfRU4ocGRlc2MsIDEpOworCQlTRVRfVFhfREVTQ19QS1RfSUQocGRlc2MsIDgpOworCX0KKworCVJUX1BSSU5UX0RBVEEocnRscHJpdiwgQ09NUF9DTUQsIERCR19MT1VELAorCQkgICAgICAiSDJDIFR4IENtZCBDb250ZW50XG4iLCBwZGVzYywgVFhfREVTQ19TSVpFKTsKKwl3bWIoKTsKKwlTRVRfVFhfREVTQ19PV04ocGRlc2MsIDEpOworfQorCit2b2lkIHJ0bDkyZGVfc2V0X2Rlc2ModTggKnBkZXNjLCBib29sIGlzdHgsIHU4IGRlc2NfbmFtZSwgdTggKnZhbCkKK3sKKwlpZiAoaXN0eCkgeworCQlzd2l0Y2ggKGRlc2NfbmFtZSkgeworCQljYXNlIEhXX0RFU0NfT1dOOgorCQkJd21iKCk7CisJCQlTRVRfVFhfREVTQ19PV04ocGRlc2MsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgSFdfREVTQ19UWF9ORVhUREVTQ19BRERSOgorCQkJU0VUX1RYX0RFU0NfTkVYVF9ERVNDX0FERFJFU1MocGRlc2MsICoodTMyICopIHZhbCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX0FTU0VSVChmYWxzZSwgKCJFUlIgdHhkZXNjIDolZCIKKwkJCQkJICAiIG5vdCBwcm9jZXNzXG4iLCBkZXNjX25hbWUpKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChkZXNjX25hbWUpIHsKKwkJY2FzZSBIV19ERVNDX1JYT1dOOgorCQkJd21iKCk7CisJCQlTRVRfUlhfREVTQ19PV04ocGRlc2MsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgSFdfREVTQ19SWEJVRkZfQUREUjoKKwkJCVNFVF9SWF9ERVNDX0JVRkZfQUREUihwZGVzYywgKih1MzIgKikgdmFsKTsKKwkJCWJyZWFrOworCQljYXNlIEhXX0RFU0NfUlhQS1RfTEVOOgorCQkJU0VUX1JYX0RFU0NfUEtUX0xFTihwZGVzYywgKih1MzIgKikgdmFsKTsKKwkJCWJyZWFrOworCQljYXNlIEhXX0RFU0NfUlhFUk86CisJCQlTRVRfUlhfREVTQ19FT1IocGRlc2MsIDEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9BU1NFUlQoZmFsc2UsICgiRVJSIHJ4ZGVzYyA6JWQgIgorCQkJCQkgICJub3QgcHJvY2Vzc1xuIiwgZGVzY19uYW1lKSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwordTMyIHJ0bDkyZGVfZ2V0X2Rlc2ModTggKnBfZGVzYywgYm9vbCBpc3R4LCB1OCBkZXNjX25hbWUpCit7CisJdTMyIHJldCA9IDA7CisKKwlpZiAoaXN0eCkgeworCQlzd2l0Y2ggKGRlc2NfbmFtZSkgeworCQljYXNlIEhXX0RFU0NfT1dOOgorCQkJcmV0ID0gR0VUX1RYX0RFU0NfT1dOKHBfZGVzYyk7CisJCQlicmVhazsKKwkJY2FzZSBIV19ERVNDX1RYQlVGRl9BRERSOgorCQkJcmV0ID0gR0VUX1RYX0RFU0NfVFhfQlVGRkVSX0FERFJFU1MocF9kZXNjKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUlRfQVNTRVJUKGZhbHNlLCAoIkVSUiB0eGRlc2MgOiVkICIKKwkJCQkJICAibm90IHByb2Nlc3NcbiIsIGRlc2NfbmFtZSkpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgcnhfZGVzY185MmMgKnBkZXNjID0gKHN0cnVjdCByeF9kZXNjXzkyYyAqKXBfZGVzYzsKKwkJc3dpdGNoIChkZXNjX25hbWUpIHsKKwkJY2FzZSBIV19ERVNDX09XTjoKKwkJCXJldCA9IEdFVF9SWF9ERVNDX09XTihwZGVzYyk7CisJCQlicmVhazsKKwkJY2FzZSBIV19ERVNDX1JYUEtUX0xFTjoKKwkJCXJldCA9IEdFVF9SWF9ERVNDX1BLVF9MRU4ocGRlc2MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9BU1NFUlQoZmFsc2UsICgiRVJSIHJ4ZGVzYyA6JWQgIgorCQkJCQkgICJub3QgcHJvY2Vzc1xuIiwgZGVzY19uYW1lKSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHJ0bDkyZGVfdHhfcG9sbGluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggaHdfcXVldWUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCWlmIChod19xdWV1ZSA9PSBCRUFDT05fUVVFVUUpCisJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19QQ0lFX0NUUkxfUkVHLCBCSVQoNCkpOworCWVsc2UKKwkJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX1BDSUVfQ1RSTF9SRUcsCisJCQkgICAgICAgQklUKDApIDw8IChod19xdWV1ZSkpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvdHJ4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS90cnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJkNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvdHJ4LmgKQEAgLTAsMCArMSw3NTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEwICBSZWFsdGVrIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIFJlYWx0ZWsgQ29ycG9yYXRpb24sIE5vLiAyLCBJbm5vdmF0aW9uIFJvYWQgSUksIEhzaW5jaHUgU2NpZW5jZSBQYXJrLAorICogSHNpbmNodSAzMDAsIFRhaXdhbi4KKyAqCisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUlRMOTJERV9UUlhfSF9fCisjZGVmaW5lIF9fUlRMOTJERV9UUlhfSF9fCisKKyNkZWZpbmUgVFhfREVTQ19TSVpFCQkJCTY0CisjZGVmaW5lIFRYX0RFU0NfQUdHUl9TVUJGUkFNRV9TSVpFCQkzMgorCisjZGVmaW5lIFJYX0RFU0NfU0laRQkJCQkzMgorI2RlZmluZSBSWF9EUlZfSU5GT19TSVpFX1VOSVQJCQk4CisKKyNkZWZpbmUJVFhfREVTQ19ORVhUX0RFU0NfT0ZGU0VUCQk0MAorI2RlZmluZSBVU0JfSFdERVNDX0hFQURFUl9MRU4JCQkzMgorI2RlZmluZSBDUkNMRU5HVEgJCQkJNAorCisvKiBEZWZpbmUgYSBtYWNybyB0aGF0IHRha2VzIGEgbGUzMiB3b3JkLCBjb252ZXJ0cyBpdCB0byBob3N0IG9yZGVyaW5nLAorICogcmlnaHQgc2hpZnRzIGJ5IGEgc3BlY2lmaWVkIGNvdW50LCBjcmVhdGVzIGEgbWFzayBvZiB0aGUgc3BlY2lmaWVkCisgKiBiaXQgY291bnQsIGFuZCBleHRyYWN0cyB0aGF0IG51bWJlciBvZiBiaXRzLgorICovCisKKyNkZWZpbmUgU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYywgX19zaGlmdCwgX19tYXNrKQkJXAorCSgobGUzMl90b19jcHUoKigoKF9fbGUzMiAqKShfX3BkZXNjKSkpKSA+PiAoX19zaGlmdCkpICYJXAorCUJJVF9MRU5fTUFTS18zMihfX21hc2spKQorCisvKiBEZWZpbmUgYSBtYWNybyB0aGF0IGNsZWFycyBhIGJpdCBmaWVsZCBpbiBhbiBsZTMyIHdvcmQgYW5kCisgKiBzZXRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW50byB0aGF0IGJpdCBmaWVsZC4gVGhlIHJlc3VsdGluZworICogdmFsdWUgcmVtYWlucyBpbiBsZTMyIG9yZGVyaW5nOyBob3dldmVyLCBpdCBpcyBwcm9wZXJseSBjb252ZXJ0ZWQKKyAqIHRvIGhvc3Qgb3JkZXJpbmcgZm9yIHRoZSBjbGVhciBhbmQgc2V0IG9wZXJhdGlvbnMgYmVmb3JlIGNvbnZlcnNpb24KKyAqIGJhY2sgdG8gbGUzMi4KKyAqLworCisjZGVmaW5lIFNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjLCBfX3NoaWZ0LCBfX2xlbiwgX192YWwpCVwKKwkoKihfX2xlMzIgKikoX19wZGVzYykgPQkJCQkJXAorCShjcHVfdG9fbGUzMigobGUzMl90b19jcHUoKigoX19sZTMyICopKF9fcGRlc2MpKSkgJglcCisJKH4oQklUX09GRlNFVF9MRU5fTUFTS18zMigoX19zaGlmdCksIF9fbGVuKSkpKSB8CQlcCisJKCgodTMyKShfX3ZhbCkgJiBCSVRfTEVOX01BU0tfMzIoX19sZW4pKSA8PCAoX19zaGlmdCkpKSkpOworCisvKiBtYWNyb3MgdG8gcmVhZC93cml0ZSB2YXJpb3VzIGZpZWxkcyBpbiBSWCBvciBUWCBkZXNjcmlwdG9ycyAqLworCisjZGVmaW5lIFNFVF9UWF9ERVNDX1BLVF9TSVpFKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjLCAwLCAxNiwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX09GRlNFVChfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYywgMTYsIDgsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19CTUMoX19wZGVzYywgX192YWwpCQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjLCAyNCwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0hUQyhfX3BkZXNjLCBfX3ZhbCkJCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MsIDI1LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTEFTVF9TRUcoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MsIDI2LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfRklSU1RfU0VHKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjLCAyNywgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0xJTklQKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjLCAyOCwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX05PX0FDTShfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYywgMjksIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19HRihfX3BkZXNjLCBfX3ZhbCkJCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MsIDMwLCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfT1dOKF9fcGRlc2MsIF9fdmFsKQkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYywgMzEsIDEsIF9fdmFsKQorCisjZGVmaW5lIEdFVF9UWF9ERVNDX1BLVF9TSVpFKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MsIDAsIDE2KQorI2RlZmluZSBHRVRfVFhfREVTQ19PRkZTRVQoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYywgMTYsIDgpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0JNQyhfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjLCAyNCwgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfSFRDKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MsIDI1LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19MQVNUX1NFRyhfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjLCAyNiwgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfRklSU1RfU0VHKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MsIDI3LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19MSU5JUChfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjLCAyOCwgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfTk9fQUNNKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MsIDI5LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19HRihfX3BkZXNjKQkJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYywgMzAsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX09XTihfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjLCAzMSwgMSkKKworI2RlZmluZSBTRVRfVFhfREVTQ19NQUNJRChfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYys0LCAwLCA1LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQUdHX0VOQUJMRShfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYys0LCA1LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQksoX19wZGVzYywgX192YWwpCQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzQsIDYsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19SREdfRU5BQkxFKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzQsIDcsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19RVUVVRV9TRUwoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrNCwgOCwgNSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1JER19OQVZfRVhUKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzQsIDEzLCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTFNJR19UWE9QX0VOKF9fcGRlc2MsIF9fdmFsKQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrNCwgMTQsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19QSUZTKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzQsIDE1LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUkFURV9JRChfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYys0LCAxNiwgNCwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX05BVl9VU0VfSERSKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzQsIDIwLCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfRU5fREVTQ19JRChfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYys0LCAyMSwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1NFQ19UWVBFKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzQsIDIyLCAyLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUEtUX09GRlNFVChfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYys0LCAyNiwgOCwgX192YWwpCisKKyNkZWZpbmUgR0VUX1RYX0RFU0NfTUFDSUQoX19wZGVzYykJCQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzQsIDAsIDUpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0FHR19FTkFCTEUoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys0LCA1LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19BR0dfQlJFQUsoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys0LCA2LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19SREdfRU5BQkxFKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNCwgNywgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfUVVFVUVfU0VMKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNCwgOCwgNSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfUkRHX05BVl9FWFQoX19wZGVzYykJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzQsIDEzLCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19MU0lHX1RYT1BfRU4oX19wZGVzYykJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzQsIDE0LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19QSUZTKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNCwgMTUsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX1JBVEVfSUQoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys0LCAxNiwgNCkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfTkFWX1VTRV9IRFIoX19wZGVzYykJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzQsIDIwLCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19FTl9ERVNDX0lEKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNCwgMjEsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX1NFQ19UWVBFKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNCwgMjIsIDIpCisjZGVmaW5lIEdFVF9UWF9ERVNDX1BLVF9PRkZTRVQoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys0LCAyNCwgOCkKKworI2RlZmluZSBTRVRfVFhfREVTQ19SVFNfUkMoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrOCwgMCwgNiwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0RBVEFfUkMoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrOCwgNiwgNiwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0JBUl9SVFlfVEgoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrOCwgMTQsIDIsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19NT1JFX0ZSQUcoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrOCwgMTcsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19SQVcoX19wZGVzYywgX192YWwpCQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzgsIDE4LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQ0NYKF9fcGRlc2MsIF9fdmFsKQkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYys4LCAxOSwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0FNUERVX0RFTlNJVFkoX19wZGVzYywgX192YWwpCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYys4LCAyMCwgMywgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0FOVFNFTF9BKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzgsIDI0LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQU5UU0VMX0IoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrOCwgMjUsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19UWF9BTlRfQ0NLKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzgsIDI2LCAyLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfVFhfQU5UTChfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYys4LCAyOCwgMiwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1RYX0FOVF9IVChfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYys4LCAzMCwgMiwgX192YWwpCisKKyNkZWZpbmUgR0VUX1RYX0RFU0NfUlRTX1JDKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrOCwgMCwgNikKKyNkZWZpbmUgR0VUX1RYX0RFU0NfREFUQV9SQyhfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzgsIDYsIDYpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0JBUl9SVFlfVEgoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys4LCAxNCwgMikKKyNkZWZpbmUgR0VUX1RYX0RFU0NfTU9SRV9GUkFHKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrOCwgMTcsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX1JBVyhfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzgsIDE4LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19DQ1goX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys4LCAxOSwgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfQU1QRFVfREVOU0lUWShfX3BkZXNjKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrOCwgMjAsIDMpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0FOVFNFTF9BKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrOCwgMjQsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0FOVFNFTF9CKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrOCwgMjUsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX1RYX0FOVF9DQ0soX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys4LCAyNiwgMikKKyNkZWZpbmUgR0VUX1RYX0RFU0NfVFhfQU5UTChfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzgsIDI4LCAyKQorI2RlZmluZSBHRVRfVFhfREVTQ19UWF9BTlRfSFQoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys4LCAzMCwgMikKKworI2RlZmluZSBTRVRfVFhfREVTQ19ORVhUX0hFQVBfUEFHRShfX3BkZXNjLCBfX3ZhbCkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzEyLCAwLCA4LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfVEFJTF9QQUdFKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzEyLCA4LCA4LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfU0VRKF9fcGRlc2MsIF9fdmFsKQkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYysxMiwgMTYsIDEyLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUEtUX0lEKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzEyLCAyOCwgNCwgX192YWwpCisKKyNkZWZpbmUgR0VUX1RYX0RFU0NfTkVYVF9IRUFQX1BBR0UoX19wZGVzYykJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzEyLCAwLCA4KQorI2RlZmluZSBHRVRfVFhfREVTQ19UQUlMX1BBR0UoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysxMiwgOCwgOCkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfU0VRKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTIsIDE2LCAxMikKKyNkZWZpbmUgR0VUX1RYX0RFU0NfUEtUX0lEKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTIsIDI4LCA0KQorCisjZGVmaW5lIFNFVF9UWF9ERVNDX1JUU19SQVRFKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzE2LCAwLCA1LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQVBfRENGRShfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYysxNiwgNSwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1FPUyhfX3BkZXNjLCBfX3ZhbCkJCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMTYsIDYsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19IV1NFUV9FTihfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYysxNiwgNywgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1VTRV9SQVRFKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzE2LCA4LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfRElTQUJMRV9SVFNfRkIoX19wZGVzYywgX192YWwpCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYysxNiwgOSwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0RJU0FCTEVfRkIoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMTYsIDEwLCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQ1RTMlNFTEYoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMTYsIDExLCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUlRTX0VOQUJMRShfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYysxNiwgMTIsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19IV19SVFNfRU5BQkxFKF9fcGRlc2MsIF9fdmFsKQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMTYsIDEzLCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUE9SVF9JRChfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYysxNiwgMTQsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19XQUlUX0RDVFMoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMTYsIDE4LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfQ1RTMkFQX0VOKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzE2LCAxOSwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1RYX1NVQl9DQVJSSUVSKF9fcGRlc2MsIF9fdmFsKQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMTYsIDIwLCAyLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfVFhfU1RCQyhfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYysxNiwgMjIsIDIsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19EQVRBX1NIT1JUKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzE2LCAyNCwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0RBVEFfQlcoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMTYsIDI1LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUlRTX1NIT1JUKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzE2LCAyNiwgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1JUU19CVyhfX3BkZXNjLCBfX3ZhbCkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYysxNiwgMjcsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19SVFNfU0MoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMTYsIDI4LCAyLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfUlRTX1NUQkMoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMTYsIDMwLCAyLCBfX3ZhbCkKKworI2RlZmluZSBHRVRfVFhfREVTQ19SVFNfUkFURShfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzE2LCAwLCA1KQorI2RlZmluZSBHRVRfVFhfREVTQ19BUF9EQ0ZFKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTYsIDUsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX1FPUyhfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzE2LCA2LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19IV1NFUV9FTihfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzE2LCA3LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19VU0VfUkFURShfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzE2LCA4LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19ESVNBQkxFX1JUU19GQihfX3BkZXNjKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTYsIDksIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0RJU0FCTEVfRkIoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysxNiwgMTAsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0NUUzJTRUxGKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTYsIDExLCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19SVFNfRU5BQkxFKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTYsIDEyLCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19IV19SVFNfRU5BQkxFKF9fcGRlc2MpCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysxNiwgMTMsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX1BPUlRfSUQoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysxNiwgMTQsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX1dBSVRfRENUUyhfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzE2LCAxOCwgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfQ1RTMkFQX0VOKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTYsIDE5LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19UWF9TVUJfQ0FSUklFUihfX3BkZXNjKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTYsIDIwLCAyKQorI2RlZmluZSBHRVRfVFhfREVTQ19UWF9TVEJDKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTYsIDIyLCAyKQorI2RlZmluZSBHRVRfVFhfREVTQ19EQVRBX1NIT1JUKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTYsIDI0LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19EQVRBX0JXKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTYsIDI1LCAxKQorI2RlZmluZSBHRVRfVFhfREVTQ19SVFNfU0hPUlQoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysxNiwgMjYsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX1JUU19CVyhfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzE2LCAyNywgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfUlRTX1NDKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTYsIDI4LCAyKQorI2RlZmluZSBHRVRfVFhfREVTQ19SVFNfU1RCQyhfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzE2LCAzMCwgMikKKworI2RlZmluZSBTRVRfVFhfREVTQ19UWF9SQVRFKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzIwLCAwLCA2LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfREFUQV9TSE9SVEdJKF9fcGRlc2MsIF9fdmFsKQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMjAsIDYsIDEsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19DQ1hfVEFHKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzIwLCA3LCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfREFUQV9SQVRFX0ZCX0xJTUlUKF9fcGRlc2MsIF9fdmFsKQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMjAsIDgsIDUsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19SVFNfUkFURV9GQl9MSU1JVChfX3BkZXNjLCBfX3ZhbCkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzIwLCAxMywgNCwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX1JFVFJZX0xJTUlUX0VOQUJMRShfX3BkZXNjLCBfX3ZhbCkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzIwLCAxNywgMSwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX0RBVEFfUkVUUllfTElNSVQoX19wZGVzYywgX192YWwpCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYysyMCwgMTgsIDYsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19VU0JfVFhBR0dfTlVNKF9fcGRlc2MsIF9fdmFsKQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMjAsIDI0LCA4LCBfX3ZhbCkKKworI2RlZmluZSBHRVRfVFhfREVTQ19UWF9SQVRFKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMjAsIDAsIDYpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0RBVEFfU0hPUlRHSShfX3BkZXNjKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMjAsIDYsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0NDWF9UQUcoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysyMCwgNywgMSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfREFUQV9SQVRFX0ZCX0xJTUlUKF9fcGRlc2MpCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysyMCwgOCwgNSkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfUlRTX1JBVEVfRkJfTElNSVQoX19wZGVzYykJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzIwLCAxMywgNCkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfUkVUUllfTElNSVRfRU5BQkxFKF9fcGRlc2MpCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysyMCwgMTcsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX0RBVEFfUkVUUllfTElNSVQoX19wZGVzYykJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzIwLCAxOCwgNikKKyNkZWZpbmUgR0VUX1RYX0RFU0NfVVNCX1RYQUdHX05VTShfX3BkZXNjKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMjAsIDI0LCA4KQorCisjZGVmaW5lIFNFVF9UWF9ERVNDX1RYQUdDX0EoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMjQsIDAsIDUsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19UWEFHQ19CKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzI0LCA1LCA1LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfVVNFX01BWF9MRU4oX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMjQsIDEwLCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTUFYX0FHR19OVU0oX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMjQsIDExLCA1LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTUNTRzFfTUFYX0xFTihfX3BkZXNjLCBfX3ZhbCkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzI0LCAxNiwgNCwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX01DU0cyX01BWF9MRU4oX19wZGVzYywgX192YWwpCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYysyNCwgMjAsIDQsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19NQ1NHM19NQVhfTEVOKF9fcGRlc2MsIF9fdmFsKQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMjQsIDI0LCA0LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTUNTN19TR0lfTUFYX0xFTihfX3BkZXNjLCBfX3ZhbCkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzI0LCAyOCwgNCwgX192YWwpCisKKyNkZWZpbmUgR0VUX1RYX0RFU0NfVFhBR0NfQShfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzI0LCAwLCA1KQorI2RlZmluZSBHRVRfVFhfREVTQ19UWEFHQ19CKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMjQsIDUsIDUpCisjZGVmaW5lIEdFVF9UWF9ERVNDX1VTRV9NQVhfTEVOKF9fcGRlc2MpCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysyNCwgMTAsIDEpCisjZGVmaW5lIEdFVF9UWF9ERVNDX01BWF9BR0dfTlVNKF9fcGRlc2MpCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysyNCwgMTEsIDUpCisjZGVmaW5lIEdFVF9UWF9ERVNDX01DU0cxX01BWF9MRU4oX19wZGVzYykJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzI0LCAxNiwgNCkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfTUNTRzJfTUFYX0xFTihfX3BkZXNjKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMjQsIDIwLCA0KQorI2RlZmluZSBHRVRfVFhfREVTQ19NQ1NHM19NQVhfTEVOKF9fcGRlc2MpCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysyNCwgMjQsIDQpCisjZGVmaW5lIEdFVF9UWF9ERVNDX01DUzdfU0dJX01BWF9MRU4oX19wZGVzYykJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzI0LCAyOCwgNCkKKworI2RlZmluZSBTRVRfVFhfREVTQ19UWF9CVUZGRVJfU0laRShfX3BkZXNjLCBfX3ZhbCkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzI4LCAwLCAxNiwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX01DU0c0X01BWF9MRU4oX19wZGVzYywgX192YWwpCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYysyOCwgMTYsIDQsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19NQ1NHNV9NQVhfTEVOKF9fcGRlc2MsIF9fdmFsKQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMjgsIDIwLCA0LCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTUNTRzZfTUFYX0xFTihfX3BkZXNjLCBfX3ZhbCkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzI4LCAyNCwgNCwgX192YWwpCisjZGVmaW5lIFNFVF9UWF9ERVNDX01DUzE1X1NHSV9NQVhfTEVOKF9fcGRlc2MsIF9fdmFsKQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMjgsIDI4LCA0LCBfX3ZhbCkKKworI2RlZmluZSBHRVRfVFhfREVTQ19UWF9CVUZGRVJfU0laRShfX3BkZXNjKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMjgsIDAsIDE2KQorI2RlZmluZSBHRVRfVFhfREVTQ19NQ1NHNF9NQVhfTEVOKF9fcGRlc2MpCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysyOCwgMTYsIDQpCisjZGVmaW5lIEdFVF9UWF9ERVNDX01DU0c1X01BWF9MRU4oX19wZGVzYykJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzI4LCAyMCwgNCkKKyNkZWZpbmUgR0VUX1RYX0RFU0NfTUNTRzZfTUFYX0xFTihfX3BkZXNjKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMjgsIDI0LCA0KQorI2RlZmluZSBHRVRfVFhfREVTQ19NQ1MxNV9TR0lfTUFYX0xFTihfX3BkZXNjKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMjgsIDI4LCA0KQorCisjZGVmaW5lIFNFVF9UWF9ERVNDX1RYX0JVRkZFUl9BRERSRVNTKF9fcGRlc2MsIF9fdmFsKQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMzIsIDAsIDMyLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1RYX0RFU0NfVFhfQlVGRkVSX0FERFJFU1M2NChfX3BkZXNjLCBfX3ZhbCkgXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjKzM2LCAwLCAzMiwgX192YWwpCisKKyNkZWZpbmUgR0VUX1RYX0RFU0NfVFhfQlVGRkVSX0FERFJFU1MoX19wZGVzYykJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzMyLCAwLCAzMikKKyNkZWZpbmUgR0VUX1RYX0RFU0NfVFhfQlVGRkVSX0FERFJFU1M2NChfX3BkZXNjKQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYyszNiwgMCwgMzIpCisKKyNkZWZpbmUgU0VUX1RYX0RFU0NfTkVYVF9ERVNDX0FERFJFU1MoX19wZGVzYywgX192YWwpCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYys0MCwgMCwgMzIsIF9fdmFsKQorI2RlZmluZSBTRVRfVFhfREVTQ19ORVhUX0RFU0NfQUREUkVTUzY0KF9fcGRlc2MsIF9fdmFsKSBcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrNDQsIDAsIDMyLCBfX3ZhbCkKKworI2RlZmluZSBHRVRfVFhfREVTQ19ORVhUX0RFU0NfQUREUkVTUyhfX3BkZXNjKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNDAsIDAsIDMyKQorI2RlZmluZSBHRVRfVFhfREVTQ19ORVhUX0RFU0NfQUREUkVTUzY0KF9fcGRlc2MpCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzQ0LCAwLCAzMikKKworI2RlZmluZSBHRVRfUlhfREVTQ19QS1RfTEVOKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MsIDAsIDE0KQorI2RlZmluZSBHRVRfUlhfREVTQ19DUkMzMihfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjLCAxNCwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfSUNWKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MsIDE1LCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19EUlZfSU5GT19TSVpFKF9fcGRlc2MpCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYywgMTYsIDQpCisjZGVmaW5lIEdFVF9SWF9ERVNDX1NFQ1VSSVRZKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MsIDIwLCAzKQorI2RlZmluZSBHRVRfUlhfREVTQ19RT1MoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYywgMjMsIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX1NISUZUKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MsIDI0LCAyKQorI2RlZmluZSBHRVRfUlhfREVTQ19QSFlTVChfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjLCAyNiwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfU1dERUMoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYywgMjcsIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX0xTKF9fcGRlc2MpCQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjLCAyOCwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfRlMoX19wZGVzYykJCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MsIDI5LCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19FT1IoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYywgMzAsIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX09XTihfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjLCAzMSwgMSkKKworI2RlZmluZSBTRVRfUlhfREVTQ19QS1RfTEVOKF9fcGRlc2MsIF9fdmFsKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BkZXNjLCAwLCAxNCwgX192YWwpCisjZGVmaW5lIFNFVF9SWF9ERVNDX0VPUihfX3BkZXNjLCBfX3ZhbCkJCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MsIDMwLCAxLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1JYX0RFU0NfT1dOKF9fcGRlc2MsIF9fdmFsKQkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wZGVzYywgMzEsIDEsIF9fdmFsKQorCisjZGVmaW5lIEdFVF9SWF9ERVNDX01BQ0lEKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNCwgMCwgNSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfVElEKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNCwgNSwgNCkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfSFdSU1ZEKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNCwgOSwgNSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfUEFHR1IoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys0LCAxNCwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfRkFHR1IoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys0LCAxNSwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfQTFfRklUKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNCwgMTYsIDQpCisjZGVmaW5lIEdFVF9SWF9ERVNDX0EyX0ZJVChfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzQsIDIwLCA0KQorI2RlZmluZSBHRVRfUlhfREVTQ19QQU0oX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys0LCAyNCwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfUFdSKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNCwgMjUsIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX01EKF9fcGRlc2MpCQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzQsIDI2LCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19NRihfX3BkZXNjKQkJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys0LCAyNywgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfVFlQRShfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzQsIDI4LCAyKQorI2RlZmluZSBHRVRfUlhfREVTQ19NQyhfX3BkZXNjKQkJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYys0LCAzMCwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfQkMoX19wZGVzYykJCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrNCwgMzEsIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX1NFUShfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzgsIDAsIDEyKQorI2RlZmluZSBHRVRfUlhfREVTQ19GUkFHKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrOCwgMTIsIDQpCisjZGVmaW5lIEdFVF9SWF9ERVNDX05FWFRfUEtUX0xFTihfX3BkZXNjKQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrOCwgMTYsIDE0KQorI2RlZmluZSBHRVRfUlhfREVTQ19ORVhUX0lORChfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzgsIDMwLCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19SU1ZEKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrOCwgMzEsIDEpCisKKyNkZWZpbmUgR0VUX1JYX0RFU0NfUlhNQ1MoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysxMiwgMCwgNikKKyNkZWZpbmUgR0VUX1JYX0RFU0NfUlhIVChfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzEyLCA2LCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19TUExDUChfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzEyLCA4LCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19CVyhfX3BkZXNjKQkJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysxMiwgOSwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfSFRDKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTIsIDEwLCAxKQorI2RlZmluZSBHRVRfUlhfREVTQ19IV1BDX0VSUihfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzEyLCAxNCwgMSkKKyNkZWZpbmUgR0VUX1JYX0RFU0NfSFdQQ19JTkQoX19wZGVzYykJCQlcCisJU0hJRlRfQU5EX01BU0tfTEUoX19wZGVzYysxMiwgMTUsIDEpCisjZGVmaW5lIEdFVF9SWF9ERVNDX0lWMChfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzEyLCAxNiwgMTYpCisKKyNkZWZpbmUgR0VUX1JYX0RFU0NfSVYxKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMTYsIDAsIDMyKQorI2RlZmluZSBHRVRfUlhfREVTQ19UU0ZMKF9fcGRlc2MpCQkJXAorCVNISUZUX0FORF9NQVNLX0xFKF9fcGRlc2MrMjAsIDAsIDMyKQorCisjZGVmaW5lIEdFVF9SWF9ERVNDX0JVRkZfQUREUihfX3BkZXNjKQkJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzI0LCAwLCAzMikKKyNkZWZpbmUgR0VUX1JYX0RFU0NfQlVGRl9BRERSNjQoX19wZGVzYykJCVwKKwlTSElGVF9BTkRfTUFTS19MRShfX3BkZXNjKzI4LCAwLCAzMikKKworI2RlZmluZSBTRVRfUlhfREVTQ19CVUZGX0FERFIoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMjQsIDAsIDMyLCBfX3ZhbCkKKyNkZWZpbmUgU0VUX1JYX0RFU0NfQlVGRl9BRERSNjQoX19wZGVzYywgX192YWwpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGRlc2MrMjgsIDAsIDMyLCBfX3ZhbCkKKworI2RlZmluZSBDTEVBUl9QQ0lfVFhfREVTQ19DT05URU5UKF9fcGRlc2MsIF9zaXplKQlcCitkbyB7CQkJCQkJCVwKKwlpZiAoX3NpemUgPiBUWF9ERVNDX05FWFRfREVTQ19PRkZTRVQpCQlcCisJCW1lbXNldCgodm9pZCAqKV9fcGRlc2MsIDAsIFRYX0RFU0NfTkVYVF9ERVNDX09GRlNFVCk7CVwKKwllbHNlCQkJCQkJXAorCQltZW1zZXQoKHZvaWQgKilfX3BkZXNjLCAwLCBfc2l6ZSk7CVwKK30gd2hpbGUgKDApOworCisjZGVmaW5lIFJYX0hBTF9JU19DQ0tfUkFURShfcGRlc2MpXAorCShfcGRlc2MtPnJ4bWNzID09IERFU0M5MkRfUkFURTFNIHx8CQlcCisJIF9wZGVzYy0+cnhtY3MgPT0gREVTQzkyRF9SQVRFMk0gfHwJCVwKKwkgX3BkZXNjLT5yeG1jcyA9PSBERVNDOTJEX1JBVEU1XzVNIHx8CQlcCisJIF9wZGVzYy0+cnhtY3MgPT0gREVTQzkyRF9SQVRFMTFNKQorCisvKiBGb3IgOTJEIGVhcmx5IG1vZGUgKi8KKyNkZWZpbmUgU0VUX0VBUkxZTU9ERV9QS1ROVU0oX19wYWRkciwgX192YWx1ZSkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wYWRkciwgMCwgMywgX192YWx1ZSkKKyNkZWZpbmUgU0VUX0VBUkxZTU9ERV9MRU4wKF9fcGFkZHIsIF9fdmFsdWUpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGFkZHIsIDQsIDEyLCBfX3ZhbHVlKQorI2RlZmluZSBTRVRfRUFSTFlNT0RFX0xFTjEoX19wYWRkciwgX192YWx1ZSkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wYWRkciwgMTYsIDEyLCBfX3ZhbHVlKQorI2RlZmluZSBTRVRfRUFSTFlNT0RFX0xFTjJfMShfX3BhZGRyLCBfX3ZhbHVlKQkJXAorCVNFVF9CSVRTX09GRlNFVF9MRShfX3BhZGRyLCAyOCwgNCwgX192YWx1ZSkKKyNkZWZpbmUgU0VUX0VBUkxZTU9ERV9MRU4yXzIoX19wYWRkciwgX192YWx1ZSkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wYWRkcis0LCAwLCA4LCBfX3ZhbHVlKQorI2RlZmluZSBTRVRfRUFSTFlNT0RFX0xFTjMoX19wYWRkciwgX192YWx1ZSkJCVwKKwlTRVRfQklUU19PRkZTRVRfTEUoX19wYWRkcis0LCA4LCAxMiwgX192YWx1ZSkKKyNkZWZpbmUgU0VUX0VBUkxZTU9ERV9MRU40KF9fcGFkZHIsIF9fdmFsdWUpCQlcCisJU0VUX0JJVFNfT0ZGU0VUX0xFKF9fcGFkZHIrNCwgMjAsIDEyLCBfX3ZhbHVlKQorCitzdHJ1Y3QgcnhfZndpbmZvXzkyZCB7CisJdTggZ2Fpbl90cnN3WzRdOworCXU4IHB3ZGJfYWxsOworCXU4IGNmb3Nob1s0XTsKKwl1OCBjZm90YWlsWzRdOworCWNoYXIgcnhldm1bMl07CisJY2hhciByeHNucls0XTsKKwl1OCBwZHNuclsyXTsKKwl1OCBjc2lfY3VycmVudFsyXTsKKwl1OCBjc2lfdGFyZ2V0WzJdOworCXU4IHNpZ2V2bTsKKwl1OCBtYXhfZXhfcHdyOworCXU4IGV4X2ludGZfZmxhZzoxOworCXU4IHNnaV9lbjoxOworCXU4IHJ4c2M6MjsKKwl1OCByZXNlcnZlOjQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgdHhfZGVzY185MmQgeworCXUzMiBwa3RzaXplOjE2OworCXUzMiBvZmZzZXQ6ODsKKwl1MzIgYm1jOjE7CisJdTMyIGh0YzoxOworCXUzMiBsYXN0c2VnOjE7CisJdTMyIGZpcnN0c2VnOjE7CisJdTMyIGxpbmlwOjE7CisJdTMyIG5vYWNtOjE7CisJdTMyIGdmOjE7CisJdTMyIG93bjoxOworCisJdTMyIG1hY2lkOjU7CisJdTMyIGFnZ19lbjoxOworCXUzMiBiazoxOworCXUzMiByZGdfZW46MTsKKwl1MzIgcXVldWVzZWw6NTsKKwl1MzIgcmRfbmF2X2V4dDoxOworCXUzMiBsc2lnX3R4b3BfZW46MTsKKwl1MzIgcGlmczoxOworCXUzMiByYXRlaWQ6NDsKKwl1MzIgbmF2X3VzZWhkcjoxOworCXUzMiBlbl9kZXNjaWQ6MTsKKwl1MzIgc2VjdHlwZToyOworCXUzMiBwa3RvZmZzZXQ6ODsKKworCXUzMiBydHNfcmM6NjsKKwl1MzIgZGF0YV9yYzo2OworCXUzMiByc3ZkMDoyOworCXUzMiBiYXJfcmV0cnlodDoyOworCXUzMiByc3ZkMToxOworCXUzMiBtb3JlZnJhZzoxOworCXUzMiByYXc6MTsKKwl1MzIgY2N4OjE7CisJdTMyIGFtcGR1ZGVuc2l0eTozOworCXUzMiByc3ZkMjoxOworCXUzMiBhbnRfc2VsYToxOworCXUzMiBhbnRfc2VsYjoxOworCXUzMiB0eGFudF9jY2s6MjsKKwl1MzIgdHhhbnRfbDoyOworCXUzMiB0eGFudF9odDoyOworCisJdTMyIG5leHRoZWFkcGFnZTo4OworCXUzMiB0YWlscGFnZTo4OworCXUzMiBzZXE6MTI7CisJdTMyIHBrdGlkOjQ7CisKKwl1MzIgcnRzcmF0ZTo1OworCXUzMiBhcGRjZmU6MTsKKwl1MzIgcW9zOjE7CisJdTMyIGh3c2VxX2VuYWJsZToxOworCXUzMiB1c2VycmF0ZToxOworCXUzMiBkaXNfcnRzZmI6MTsKKwl1MzIgZGlzX2RhdGFmYjoxOworCXUzMiBjdHMyc2VsZjoxOworCXUzMiBydHNfZW46MTsKKwl1MzIgaHdydHNfZW46MTsKKwl1MzIgcG9ydGlkOjE7CisJdTMyIHJzdmQzOjM7CisJdTMyIHdhaXRkY3RzOjE7CisJdTMyIGN0czJhcF9lbjoxOworCXUzMiB0eHNjOjI7CisJdTMyIHN0YmM6MjsKKwl1MzIgdHhzaG9ydDoxOworCXUzMiB0eGJ3OjE7CisJdTMyIHJ0c3Nob3J0OjE7CisJdTMyIHJ0c2J3OjE7CisJdTMyIHJ0c3NjOjI7CisJdTMyIHJ0c3N0YmM6MjsKKworCXUzMiB0eHJhdGU6NjsKKwl1MzIgc2hvcnRnaToxOworCXUzMiBjY3h0OjE7CisJdTMyIHR4cmF0ZV9mYl9sbXQ6NTsKKwl1MzIgcnRzcmF0ZV9mYl9sbXQ6NDsKKwl1MzIgcmV0cnlsbXRfZW46MTsKKwl1MzIgdHhyZXRyeWxtdDo2OworCXUzMiB1c2JfdHhhZ2dudW06ODsKKworCXUzMiB0eGFnY2E6NTsKKwl1MzIgdHhhZ2NiOjU7CisJdTMyIHVzZW1heGxlbjoxOworCXUzMiBtYXhhZ2dudW06NTsKKwl1MzIgbWNzZzFtYXhsZW46NDsKKwl1MzIgbWNzZzJtYXhsZW46NDsKKwl1MzIgbWNzZzNtYXhsZW46NDsKKwl1MzIgbWNzN3NnaW1heGxlbjo0OworCisJdTMyIHR4YnVmZmVyc2l6ZToxNjsKKwl1MzIgbWNzZzRtYXhsZW46NDsKKwl1MzIgbWNzZzVtYXhsZW46NDsKKwl1MzIgbWNzZzZtYXhsZW46NDsKKwl1MzIgbWNzZzE1c2dpbWF4bGVuOjQ7CisKKwl1MzIgdHhidWZmYWRkcjsKKwl1MzIgdHhidWZmZXJhZGRyNjQ7CisJdTMyIG5leHRkZXNjYWRkcmVzczsKKwl1MzIgbmV4dGRlc2NhZGRyZXNzNjQ7CisKKwl1MzIgcmVzZXJ2ZV9wYXNzX3BjaWVfbW1fbGltaXRbNF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnhfZGVzY185MmQgeworCXUzMiBsZW5ndGg6MTQ7CisJdTMyIGNyYzMyOjE7CisJdTMyIGljdmVycm9yOjE7CisJdTMyIGRydl9pbmZvc2l6ZTo0OworCXUzMiBzZWN1cml0eTozOworCXUzMiBxb3M6MTsKKwl1MzIgc2hpZnQ6MjsKKwl1MzIgcGh5c3RhdHVzOjE7CisJdTMyIHN3ZGVjOjE7CisJdTMyIGxhc3RzZWc6MTsKKwl1MzIgZmlyc3RzZWc6MTsKKwl1MzIgZW9yOjE7CisJdTMyIG93bjoxOworCisJdTMyIG1hY2lkOjU7CisJdTMyIHRpZDo0OworCXUzMiBod3JzdmQ6NTsKKwl1MzIgcGFnZ3I6MTsKKwl1MzIgZmFnZ3I6MTsKKwl1MzIgYTFfZml0OjQ7CisJdTMyIGEyX2ZpdDo0OworCXUzMiBwYW06MTsKKwl1MzIgcHdyOjE7CisJdTMyIG1vcmVkYXRhOjE7CisJdTMyIG1vcmVmcmFnOjE7CisJdTMyIHR5cGU6MjsKKwl1MzIgbWM6MTsKKwl1MzIgYmM6MTsKKworCXUzMiBzZXE6MTI7CisJdTMyIGZyYWc6NDsKKwl1MzIgbmV4dHBrdGxlbjoxNDsKKwl1MzIgbmV4dGluZDoxOworCXUzMiByc3ZkOjE7CisKKwl1MzIgcnhtY3M6NjsKKwl1MzIgcnhodDoxOworCXUzMiBhbXNkdToxOworCXUzMiBzcGxjcDoxOworCXUzMiBiYW5kd2lkdGg6MTsKKwl1MzIgaHRjOjE7CisJdTMyIHRjcGNoa19ycHQ6MTsKKwl1MzIgaXBjY2hrX3JwdDoxOworCXUzMiB0Y3BjaGtfdmFsaWQ6MTsKKwl1MzIgaHdwY2VycjoxOworCXUzMiBod3BjaW5kOjE7CisJdTMyIGl2MDoxNjsKKworCXUzMiBpdjE7CisKKwl1MzIgdHNmbDsKKworCXUzMiBidWZmZXJhZGRyZXNzOworCXUzMiBidWZmZXJhZGRyZXNzNjQ7CisKK30gX19wYWNrZWQ7CisKK3ZvaWQgcnRsOTJkZV90eF9maWxsX2Rlc2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkgIHU4ICpwZGVzYywgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBod19xdWV1ZSwKKwkJCSAgc3RydWN0IHJ0bF90Y2JfZGVzYyAqcHRjYl9kZXNjKTsKK2Jvb2wgcnRsOTJkZV9yeF9xdWVyeV9kZXNjKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgc3RydWN0IHJ0bF9zdGF0cyAqc3RhdHMsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzLAorCQkJICAgdTggKnBkZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgcnRsOTJkZV9zZXRfZGVzYyh1OCAqcGRlc2MsIGJvb2wgaXN0eCwgdTggZGVzY19uYW1lLCB1OCAqdmFsKTsKK3UzMiBydGw5MmRlX2dldF9kZXNjKHU4ICpwZGVzYywgYm9vbCBpc3R4LCB1OCBkZXNjX25hbWUpOwordm9pZCBydGw5MmRlX3R4X3BvbGxpbmcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGh3X3F1ZXVlKTsKK3ZvaWQgcnRsOTJkZV90eF9maWxsX2NtZGRlc2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpwZGVzYywKKwkJCSAgICAgYm9vbCBiX2ZpcnN0c2VnLCBib29sIGJfbGFzdHNlZywKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvZG0uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2RtLmMKaW5kZXggZGE4NmRiOC4uNDIwM2E4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvZG0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9kbS5jCkBAIC0yMjIsNyArMjIyLDYgQEAKIAl1MzIgbG93X3Jzc2lfdGhyZXNoID0gMDsKIAl1MzIgbWlkZGxlX3Jzc2lfdGhyZXNoID0gMDsKIAl1MzIgaGlnaF9yc3NpX3RocmVzaCA9IDA7Ci0JdTggcnNzaV9sZXZlbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhID0gTlVMTDsKIAogCWlmIChpc19oYWxfc3RvcChydGxoYWwpKQpAQCAtMjcyLDE4ICsyNzEsMTQgQEAKIAkJaWYgKHJ0bHByaXYtPmRtLnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPgogCQkgICAgKGxvbmcpaGlnaF9yc3NpX3RocmVzaCkgewogCQkJcmEtPnJhdHJfc3RhdGUgPSBETV9SQVRSX1NUQV9ISUdIOwotCQkJcnNzaV9sZXZlbCA9IDE7CiAJCX0gZWxzZSBpZiAocnRscHJpdi0+ZG0udW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+CiAJCQkgICAobG9uZyltaWRkbGVfcnNzaV90aHJlc2gpIHsKIAkJCXJhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfTE9XOwotCQkJcnNzaV9sZXZlbCA9IDM7CiAJCX0gZWxzZSBpZiAocnRscHJpdi0+ZG0udW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+CiAJCQkgICAobG9uZylsb3dfcnNzaV90aHJlc2gpIHsKIAkJCXJhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfTE9XOwotCQkJcnNzaV9sZXZlbCA9IDU7CiAJCX0gZWxzZSB7CiAJCQlyYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX1VMVFJBTE9XOwotCQkJcnNzaV9sZXZlbCA9IDY7CiAJCX0KIAogCQlpZiAocmEtPnByZV9yYXRyX3N0YXRlICE9IHJhLT5yYXRyX3N0YXRlKSB7CkBAIC00NTcsNyArNDUyLDcgQEAKIAkJCWlmIChydGxwcml2LT5wc2MucmZwd3Jfc3RhdGUgIT0gRVJGT04pCiAJCQkJcmV0dXJuOwogCi0JCQlpZiAoZGlndGFibGUuYmFja29mZl9lbmFibGVfZmxhZyA9PSB0cnVlKQorCQkJaWYgKGRpZ3RhYmxlLmJhY2tvZmZfZW5hYmxlX2ZsYWcpCiAJCQkJcnRsOTJzX2JhY2tvZmZfZW5hYmxlX2ZsYWcoaHcpOwogCQkJZWxzZQogCQkJCWRpZ3RhYmxlLmJhY2tvZmZfdmFsID0gRE1fRElHX0JBQ0tPRkY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9mdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvZncuYwppbmRleCAzYjVhZjAxLi42ZjkxYTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2Z3LmMKQEAgLTM1OCw3ICszNTgsNiBAQAogCXN0cnVjdCBmd19wcml2ICpwZndfcHJpdiA9IE5VTEw7CiAJdTggKnB1Y19tYXBwZWRmaWxlID0gTlVMTDsKIAl1MzIgdWxfZmlsZWxlbmd0aCA9IDA7Ci0JdTMyIGZpbGVfbGVuZ3RoID0gMDsKIAl1OCBmd2hkcl9zaXplID0gUlRfODE5MlNfRklSTVdBUkVfSERSX1NJWkU7CiAJdTggZndzdGF0dXMgPSBGV19TVEFUVVNfSU5JVDsKIAlib29sIHJ0c3RhdHVzID0gdHJ1ZTsKQEAgLTM3MCw3ICszNjksNiBAQAogCWZpcm13YXJlLT5md3N0YXR1cyA9IEZXX1NUQVRVU19JTklUOwogCiAJcHVjX21hcHBlZGZpbGUgPSBmaXJtd2FyZS0+c3pfZndfdG1wYnVmZmVyOwotCWZpbGVfbGVuZ3RoID0gZmlybXdhcmUtPnN6X2Z3X3RtcGJ1ZmZlcmxlbjsKIAogCS8qIDEuIFJldHJpZXZlIEZXIGhlYWRlci4gKi8KIAlmaXJtd2FyZS0+cGZ3aGVhZGVyID0gKHN0cnVjdCBmd19oZHIgKikgcHVjX21hcHBlZGZpbGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvaHcuYwppbmRleCAyZTkwMDVkLi5kNTlmNjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2h3LmMKQEAgLTI3LDYgKzI3LDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgIi4uL3dpZmkuaCIKICNpbmNsdWRlICIuLi9lZnVzZS5oIgogI2luY2x1ZGUgIi4uL2Jhc2UuaCIKQEAgLTQ2NSw4ICs0NjcsNyBAQAogCQkJaWYgKCh0bXB2YWx1ZSAmIEJJVCg2KSkpCiAJCQkJYnJlYWs7CiAKLQkJCXByaW50ayhLRVJOX0VSUiAid2FpdCBmb3IgQklUKDYpIHJldHVybiB2YWx1ZSAleFxuIiwKLQkJCSAgICAgICB0bXB2YWx1ZSk7CisJCQlwcl9lcnIoIndhaXQgZm9yIEJJVCg2KSByZXR1cm4gdmFsdWUgJXhcbiIsIHRtcHZhbHVlKTsKIAkJCWlmICh3YWl0Y291bnQgPT0gMCkKIAkJCQlicmVhazsKIApAQCAtNTE2LDcgKzUxNyw3IEBACiAJbWRlbGF5KDEwKTsKIAogCS8qIGNoZWNrIEdQSU8zICovCi0JdTF0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIEdQSU9fSU4pOworCXUxdG1wID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBHUElPX0lOX1NFKTsKIAlyZXR2YWwgPSAodTF0bXAgJiBIQUxfODE5MlNfSFdfR1BJT19PRkZfQklUKSA/IEVSRk9OIDogRVJGT0ZGOwogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTg4NCwxMiArODg1LDEwIEBACiAJc3RydWN0IHJ0bF9oYWwgKnJ0bGhhbCA9IHJ0bF9oYWwocnRsX3ByaXYoaHcpKTsKIAogCXU4IHJlZ19id19vcG1vZGUgPSAwOwotCXUzMiByZWdfcmF0ciA9IDAsIHJlZ19ycnNyID0gMDsKKwl1MzIgcmVnX3Jyc3IgPSAwOwogCXU4IHJlZ3RtcCA9IDA7CiAKIAlyZWdfYndfb3Btb2RlID0gQldfT1BNT0RFXzIwTUhaOwotCXJlZ19yYXRyID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRyB8IFJBVEVfQUxMX09GRE1fMVNTIHwKLQkJCQlSQVRFX0FMTF9PRkRNXzJTUzsKIAlyZWdfcnJzciA9IFJBVEVfQUxMX0NDSyB8IFJBVEVfQUxMX09GRE1fQUc7CiAKIAlyZWd0bXAgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIElOSVJUU01DU19TRUwpOwpAQCAtOTk2LDcgKzk5NSw4IEBACiAKIAkJcnRscHJpdi0+cHNjLnJmb2ZmX3JlYXNvbiA9IFJGX0NIQU5HRV9CWV9JTklUOwogCQlydGxwcml2LT5wc2MucmZwd3Jfc3RhdGUgPSBFUkZPTjsKLQkJcnRsX3BzX3NldF9yZl9zdGF0ZShodywgRVJGT0ZGLCByZm9mZnJlYXNvbiwgdHJ1ZSk7CisJCS8qIEZJWE1FOiBjaGVjayBzcGlubG9ja3MgaWYgdGhpcyBibG9jayBpcyB1bmNvbW1lbnRlZCAqLworCQlydGxfcHNfc2V0X3JmX3N0YXRlKGh3LCBFUkZPRkYsIHJmb2ZmcmVhc29uKTsKIAl9IGVsc2UgewogCQkvKiBncGlvIHJhZGlvIG9uL29mZiBpcyBvdXQgb2YgYWRhcHRlciBzdGFydCAqLwogCQlpZiAocnRscHJpdi0+cHNjLmh3cmFkaW9vZmYgPT0gZmFsc2UpIHsKQEAgLTExMDcsNyArMTEwNyw3IEBACiAJaWYgKHJ0bHByaXYtPnBzYy5yZnB3cl9zdGF0ZSAhPSBFUkZPTikKIAkJcmV0dXJuOwogCi0JaWYgKGNoZWNrX2Jzc2lkID09IHRydWUpIHsKKwlpZiAoY2hlY2tfYnNzaWQpIHsKIAkJcmVnX3JjciB8PSAoUkNSX0NCU1NJRCk7CiAJCXJ0bHByaXYtPmNmZy0+b3BzLT5zZXRfaHdfcmVnKGh3LCBIV19WQVJfUkNSLCAodTggKikoJnJlZ19yY3IpKTsKIAl9IGVsc2UgaWYgKGNoZWNrX2Jzc2lkID09IGZhbHNlKSB7CkBAIC0xMTIyLDE0ICsxMTIyLDEyIEBACiB7CiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwogCXU4IGJ0X21zciA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgTVNSKTsKLQllbnVtIGxlZF9jdGxfbW9kZSBsZWRhY3Rpb24gPSBMRURfQ1RMX05PX0xJTks7CiAJdTMyIHRlbXA7CiAJYnRfbXNyICY9IH5NU1JfTElOS19NQVNLOwogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDoKIAkJYnRfbXNyIHw9IChNU1JfTElOS19OT05FIDw8IE1TUl9MSU5LX1NISUZUKTsKLQkJbGVkYWN0aW9uID0gTEVEX0NUTF9MSU5LOwogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKIAkJCSAoIlNldCBOZXR3b3JrIHR5cGUgdG8gTk8gTElOSyFcbiIpKTsKIAkJYnJlYWs7CkBAIC0xMTQwLDcgKzExMzgsNiBAQAogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCWJ0X21zciB8PSAoTVNSX0xJTktfTUFOQUdFRCA8PCBNU1JfTElOS19TSElGVCk7Ci0JCWxlZGFjdGlvbiA9IExFRF9DVExfTElOSzsKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCiAJCQkgKCJTZXQgTmV0d29yayB0eXBlIHRvIFNUQSFcbiIpKTsKIAkJYnJlYWs7CkBAIC0xMjE4LDggKzEyMTUsNiBAQAogCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCBJTlRBX01BU0ssIHJ0bHBjaS0+aXJxX21hc2tbMF0pOwogCS8qIFN1cHBvcnQgQml0IDMyLTM3KEFzc2lnbiBhcyBCaXQgMC01KSBpbnRlcnJ1cHQgc2V0dGluZyBub3cgKi8KIAlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgSU5UQV9NQVNLICsgNCwgcnRscGNpLT5pcnFfbWFza1sxXSAmIDB4M0YpOwotCi0JcnRscGNpLT5pcnFfZW5hYmxlZCA9IHRydWU7CiB9CiAKIHZvaWQgcnRsOTJzZV9kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKQEAgLTEyMzAsNyArMTIyNSw3IEBACiAJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIElOVEFfTUFTSywgMCk7CiAJcnRsX3dyaXRlX2R3b3JkKHJ0bHByaXYsIElOVEFfTUFTSyArIDQsIDApOwogCi0JcnRscGNpLT5pcnFfZW5hYmxlZCA9IGZhbHNlOworCXN5bmNocm9uaXplX2lycShydGxwY2ktPnBkZXYtPmlycSk7CiB9CiAKIApAQCAtMTI2MSw4ICsxMjU2LDcgQEAKIAkJCWlmICgodG1wICYgQklUKDYpKSkKIAkJCQlicmVhazsKIAotCQkJcHJpbnRrKEtFUk5fRVJSICJ3YWl0IGZvciBCSVQoNikgcmV0dXJuIHZhbHVlICV4XG4iLAotCQkJICAgICAgIHRtcCk7CisJCQlwcl9lcnIoIndhaXQgZm9yIEJJVCg2KSByZXR1cm4gdmFsdWUgJXhcbiIsIHRtcCk7CiAKIAkJCWlmICh3YWl0Y250ID09IDApCiAJCQkJYnJlYWs7CkBAIC0xMzIxLDcgKzEzMTUsNyBAQAogCWlmICh1MWJ0bXAgJiBCSVQoNykpIHsKIAkJdTFidG1wICY9IH4oQklUKDYpIHwgQklUKDcpKTsKIAkJaWYgKCFfcnRsOTJzX3NldF9zeXNjbGsoaHcsIHUxYnRtcCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiU3dpdGNoIGN0cmwgcGF0aCBmYWlsXG4iKTsKKwkJCXByX2VycigiU3dpdGNoIGN0cmwgcGF0aCBmYWlsXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCX0KQEAgLTE2NTUsNyArMTY0OSw3IEBACiAJCXJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZyA9IGZhbHNlOwogCX0KIAotCWlmIChydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcgPT0gdHJ1ZSkKKwlpZiAocnRsZWZ1c2UtPmF1dG9sb2FkX2ZhaWxmbGFnKQogCQlyZXR1cm47CiAKIAlfcnRsODE5MnNlX2dldF9JQ19JbmZlcmlvcml0eShodyk7CkBAIC0xNjg4LDcgKzE2ODIsNyBAQAogCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBNQUNJRFIwICsgaSwgcnRsZWZ1c2UtPmRldl9hZGRyW2ldKTsKIAogCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0RNRVNHLAotCQkgKE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhydGxlZnVzZS0+ZGV2X2FkZHIpKSk7CisJCSAoIiVwTVxuIiwgcnRsZWZ1c2UtPmRldl9hZGRyKSk7CiAKIAkvKiBHZXQgVHggUG93ZXIgTGV2ZWwgYnkgQ2hhbm5lbCAqLwogCS8qIFJlYWQgVHggcG93ZXIgb2YgQ2hhbm5lbCAxIH4gMTQgZnJvbSBFRVBST00uICovCkBAIC0yMjcxLDcgKzIyNjUsNyBAQAogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKIAlzdHJ1Y3QgcnRsX3BjaSAqcnRscGNpID0gcnRsX3BjaWRldihydGxfcGNpcHJpdihodykpOwotCWVudW0gcmZfcHdyc3RhdGUgcmZwd3JfdG9zZXQsIGN1cl9yZnN0YXRlOworCWVudW0gcmZfcHdyc3RhdGUgcmZwd3JfdG9zZXQgLyosIGN1cl9yZnN0YXRlICovOwogCXVuc2lnbmVkIGxvbmcgZmxhZyA9IDA7CiAJYm9vbCBhY3R1YWxseXNldCA9IGZhbHNlOwogCWJvb2wgdHVybm9uYnlwb3dlcmRvbWFpbiA9IGZhbHNlOwpAQCAtMjI5Miw3ICsyMjg2LDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jaywgZmxhZyk7CiAJfQogCi0JY3VyX3Jmc3RhdGUgPSBwcHNjLT5yZnB3cl9zdGF0ZTsKKwkvKiBjdXJfcmZzdGF0ZSA9IHBwc2MtPnJmcHdyX3N0YXRlOyovCiAKIAkvKiBiZWNhdXNlIGFmdGVyIF9ydGw5MnNfcGh5X3NldF9yZmhhbHQsIGFsbCBwb3dlcgogCSAqIGNsb3NlZCwgc28gd2UgbXVzdCBvcGVuIHNvbWUgcG93ZXIgZm9yIEdQSU8gY2hlY2ssCkBAIC0yMzA1LDcgKzIyOTksNyBAQAogCiAJcmZwd3JfdG9zZXQgPSBfcnRsOTJzZV9yZl9vbm9mZl9kZXRlY3QoaHcpOwogCi0JaWYgKChwcHNjLT5od3JhZGlvb2ZmID09IHRydWUpICYmIChyZnB3cl90b3NldCA9PSBFUkZPTikpIHsKKwlpZiAoKHBwc2MtPmh3cmFkaW9vZmYpICYmIChyZnB3cl90b3NldCA9PSBFUkZPTikpIHsKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX0RNRVNHLAogCQkJICgiUkZLSUxMLUhXIFJhZGlvIE9OLCBSRiBPTlxuIikpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2xlZC5jCmluZGV4IDZkNGY2NjYuLmUzZmU3YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2xlZC5jCkBAIC05MCw3ICs5MCw3IEBACiAJCWJyZWFrOwogCWNhc2UgTEVEX1BJTl9MRUQwOgogCQlsZWRjZmcgJj0gMHhmMDsKLQkJaWYgKHBjaXByaXYtPmxlZGN0bC5sZWRfb3BlbmRyYWluID09IHRydWUpCisJCWlmIChwY2lwcml2LT5sZWRjdGwubGVkX29wZW5kcmFpbikKIAkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIExFRENGRywgKGxlZGNmZyB8IEJJVCgxKSkpOwogCQllbHNlCiAJCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBMRURDRkcsIChsZWRjZmcgfCBCSVQoMykpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMKaW5kZXggNjNiNDVlNi4uZjI3MTcxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMKQEAgLTI3LDYgKzI3LDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgIi4uL3dpZmkuaCIKICNpbmNsdWRlICIuLi9wY2kuaCIKICNpbmNsdWRlICIuLi9wcy5oIgpAQCAtMTgwLDE5ICsxODIsMTggQEAKIHsKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAJdTMyIG9yaWdpbmFsX3ZhbHVlLCByZWFkYmFja192YWx1ZSwgYml0c2hpZnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfUkYsIERCR19UUkFDRSwgKCJyZWdhZGRyKCUjeCksIHJmcGF0aCglI3gpLCAiCiAJCSAiYml0bWFzayglI3gpXG4iLCByZWdhZGRyLCByZnBhdGgsIGJpdG1hc2spKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5yZl9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5yZl9sb2NrKTsKIAogCW9yaWdpbmFsX3ZhbHVlID0gX3J0bDkyc19waHlfcmZfc2VyaWFsX3JlYWQoaHcsIHJmcGF0aCwgcmVnYWRkcik7CiAKIAliaXRzaGlmdCA9IF9ydGw5MnNfcGh5X2NhbGN1bGF0ZV9iaXRfc2hpZnQoYml0bWFzayk7CiAJcmVhZGJhY2tfdmFsdWUgPSAob3JpZ2luYWxfdmFsdWUgJiBiaXRtYXNrKSA+PiBiaXRzaGlmdDsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLnJmX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9jaygmcnRscHJpdi0+bG9ja3MucmZfbG9jayk7CiAKIAlSVF9UUkFDRShydGxwcml2LCBDT01QX1JGLCBEQkdfVFJBQ0UsICgicmVnYWRkciglI3gpLCByZnBhdGgoJSN4KSwgIgogCQkgImJpdG1hc2soJSN4KSwgb3JpZ2luYWxfdmFsdWUoJSN4KVxuIiwgcmVnYWRkciwgcmZwYXRoLApAQCAtMjA3LDcgKzIwOCw2IEBACiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwogCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CiAJdTMyIG9yaWdpbmFsX3ZhbHVlLCBiaXRzaGlmdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCEoKHJ0bHBoeS0+cmZfcGF0aG1hcCA+PiByZnBhdGgpICYgMHgxKSkKIAkJcmV0dXJuOwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9SRiwgREJHX1RSQUNFLCAoInJlZ2FkZHIoJSN4KSwgYml0bWFzayglI3gpLCIKIAkJICIgZGF0YSglI3gpLCByZnBhdGgoJSN4KVxuIiwgcmVnYWRkciwgYml0bWFzaywgZGF0YSwgcmZwYXRoKSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRscHJpdi0+bG9ja3MucmZfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MucmZfbG9jayk7CiAKIAlpZiAoYml0bWFzayAhPSBSRlJFR19PRkZTRVRfTUFTSykgewogCQlvcmlnaW5hbF92YWx1ZSA9IF9ydGw5MnNfcGh5X3JmX3NlcmlhbF9yZWFkKGh3LCByZnBhdGgsCkBAIC0yMjYsNyArMjI2LDcgQEAKIAogCV9ydGw5MnNfcGh5X3JmX3NlcmlhbF93cml0ZShodywgcmZwYXRoLCByZWdhZGRyLCBkYXRhKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0bHByaXYtPmxvY2tzLnJmX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9jaygmcnRscHJpdi0+bG9ja3MucmZfbG9jayk7CiAKIAlSVF9UUkFDRShydGxwcml2LCBDT01QX1JGLCBEQkdfVFJBQ0UsICgicmVnYWRkciglI3gpLCBiaXRtYXNrKCUjeCksICIKIAkJICJkYXRhKCUjeCksIHJmcGF0aCglI3gpXG4iLCByZWdhZGRyLCBiaXRtYXNrLCBkYXRhLCByZnBhdGgpKTsKQEAgLTI2Myw3ICsyNjMsNiBAQAogCXN0cnVjdCBydGxfcGh5ICpydGxwaHkgPSAmKHJ0bHByaXYtPnBoeSk7CiAJc3RydWN0IHJ0bF9tYWMgKm1hYyA9IHJ0bF9tYWMocnRsX3ByaXYoaHcpKTsKIAl1OCByZWdfYndfb3Btb2RlOwotCXU4IHJlZ19wcnNyX3JzYzsKIAogCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfU0NBTiwgREJHX1RSQUNFLCAoIlN3aXRjaCB0byAlcyBiYW5kd2lkdGhcbiIsCiAJCSAgcnRscGh5LT5jdXJyZW50X2NoYW5fYncgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCA/CkBAIC0yNzcsNyArMjc2LDggQEAKIAlydGxwaHktPnNldF9id21vZGVfaW5wcm9ncmVzcyA9IHRydWU7CiAKIAlyZWdfYndfb3Btb2RlID0gcnRsX3JlYWRfYnl0ZShydGxwcml2LCBCV19PUE1PREUpOwotCXJlZ19wcnNyX3JzYyA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUlJTUiArIDIpOworCS8qIGR1bW15IHJlYWQgKi8KKwlydGxfcmVhZF9ieXRlKHJ0bHByaXYsIFJSU1IgKyAyKTsKIAogCXN3aXRjaCAocnRscGh5LT5jdXJyZW50X2NoYW5fYncpIHsKIAljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CkBAIC01NDYsOCArNTQ2LDYgQEAKIAlpZiAocmZwd3Jfc3RhdGUgPT0gcHBzYy0+cmZwd3Jfc3RhdGUpCiAJCXJldHVybiBmYWxzZTsKIAotCXBwc2MtPnNldF9yZnBvd2Vyc3RhdGVfaW5wcm9ncmVzcyA9IHRydWU7Ci0KIAlzd2l0Y2ggKHJmcHdyX3N0YXRlKSB7CiAJY2FzZSBFUkZPTjp7CiAJCQlpZiAoKHBwc2MtPnJmcHdyX3N0YXRlID09IEVSRk9GRikgJiYKQEAgLTY1OSw4ICs2NTcsNiBAQAogCWlmIChicmVzdWx0KQogCQlwcHNjLT5yZnB3cl9zdGF0ZSA9IHJmcHdyX3N0YXRlOwogCi0JcHBzYy0+c2V0X3JmcG93ZXJzdGF0ZV9pbnByb2dyZXNzID0gZmFsc2U7Ci0KIAlyZXR1cm4gYnJlc3VsdDsKIH0KIApAQCAtMTAyMiw4ICsxMDE4LDcgQEAKIAlydHN0YXR1cyA9IF9ydGw5MnNfcGh5X2NvbmZpZ19iYihodywgQkFTRUJBTkRfQ09ORklHX0FHQ19UQUIpOwogCiAJaWYgKHJ0c3RhdHVzICE9IHRydWUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICAiX3J0bDkyc19waHlfYmJfY29uZmlnX3BhcmFmaWxlKCk6ICIKLQkJICAgICAgICJBR0MgVGFibGUgRmFpbFxuIik7CisJCXByX2VycigiJXMoKTogQUdDIFRhYmxlIEZhaWxcbiIsIF9fZnVuY19fKTsKIAkJZ290byBwaHlfQkI4MTkwX0NvbmZpZ19QYXJhRmlsZV9GYWlsOwogCX0KIApAQCAtMTQyMiw3ICsxNDE3LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBGV19DTURfSElHSF9QV1JfRU5BQkxFOgogCQlpZiAoKHJ0bHByaXYtPmRtLmRtX2ZsYWcgJiBIQUxfRE1fSElQV1JfRElTQUJMRSkgfHwKLQkJCShydGxwcml2LT5kbS5keW5hbWljX3R4cG93ZXJfZW5hYmxlID09IHRydWUpKQorCQkJcnRscHJpdi0+ZG0uZHluYW1pY190eHBvd2VyX2VuYWJsZSkKIAkJCWJyZWFrOwogCiAJCS8qIENDQSB0aHJlc2hvbGQgKi8KQEAgLTE2MTQsNyArMTYwOSw3IEBACiAJCQkJZndfY21kbWFwICY9IH5GV19ESUdfRU5BQkxFX0NUTDsKIAogCQkJaWYgKChydGxwcml2LT5kbS5kbV9mbGFnICYgSEFMX0RNX0hJUFdSX0RJU0FCTEUpIHx8Ci0JCQkgICAgKHJ0bHByaXYtPmRtLmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPT0gdHJ1ZSkpCisJCQkgICAgcnRscHJpdi0+ZG0uZHluYW1pY190eHBvd2VyX2VuYWJsZSkKIAkJCQlmd19jbWRtYXAgJj0gfkZXX0hJR0hfUFdSX0VOQUJMRV9DVEw7CiAKIAkJCWlmICgoZGlndGFibGUuZGlnX2V4dF9wb3J0X3N0YWdlID09CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9yZWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3JlZy5oCmluZGV4IDAxMTZlYWQuLmVhMzJlZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3JlZy5oCkBAIC0yNDgsMTIgKzI0OCw4IEBACiAjZGVmaW5lCVBTVElNRQkJCQkJMHgwMkUwCiAjZGVmaW5lCVRJTUVSMAkJCQkJMHgwMkU0CiAjZGVmaW5lCVRJTUVSMQkJCQkJMHgwMkU4Ci0jZGVmaW5lCUdQSU9fQ1RSTAkJCQkweDAyRUMKLSNkZWZpbmUJR1BJT19JTgkJCQkJMHgwMkVDCi0jZGVmaW5lCUdQSU9fT1VUCQkJCTB4MDJFRAorI2RlZmluZQlHUElPX0lOX1NFCQkJCTB4MDJFQwogI2RlZmluZQlHUElPX0lPX1NFTAkJCQkweDAyRUUKLSNkZWZpbmUJR1BJT19NT0QJCQkJMHgwMkVGCi0jZGVmaW5lCUdQSU9fSU5UQ1RSTAkJCQkweDAyRjAKICNkZWZpbmUJTUFDX1BJTk1VWF9DRkcJCQkJMHgwMkYxCiAjZGVmaW5lCUxFRENGRwkJCQkJMHgwMkYyCiAjZGVmaW5lCVBIWV9SRUcJCQkJCTB4MDJGMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvcmYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3JmLmMKaW5kZXggMWQzYTQ4My4uMGFkNTBmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvcmYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9yZi5jCkBAIC0yNyw2ICsyNyw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlICIuLi93aWZpLmgiCiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiZGVmLmgiCkBAIC00MTAsNyArNDEyLDcgQEAKIAkgICAgICAocnRsZWZ1c2UtPmVlcHJvbV9yZWd1bGF0b3J5ICE9IDApKSkKIAkJZG9udF9pbmNfY2NrX29yX3R1cmJvc2Nhbm9mZiA9IHRydWU7CiAKLQlpZiAobWFjLT5hY3Rfc2Nhbm5pbmcgPT0gdHJ1ZSkgeworCWlmIChtYWMtPmFjdF9zY2FubmluZykgewogCQl0eGFnYyA9IDB4M2Y7CiAJCWlmIChkb250X2luY19jY2tfb3JfdHVyYm9zY2Fub2ZmKQogCQkJdHhhZ2MgPSBwd3JsZXZlbDsKQEAgLTUwNyw3ICs1MDksNyBAQAogCQl9CiAKIAkJaWYgKHJ0c3RhdHVzICE9IHRydWUpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiUmFkaW9bJWRdIEZhaWwhISIsIHJmcGF0aCk7CisJCQlwcl9lcnIoIlJhZGlvWyVkXSBGYWlsISFcbiIsIHJmcGF0aCk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3N3LmMKaW5kZXggMWM2Y2IxZC4uMzg3NjA3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9zdy5jCkBAIC0yNyw2ICsyNyw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKICNpbmNsdWRlICIuLi93aWZpLmgiCkBAIC0xODMsOCArMTg1LDggQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAicnRsODE5MnNlOiBEcml2ZXIgZm9yIFJlYWx0ZWsgUlRMODE5MlNFL1JUTDgxOTFTRVxuIgotCSAgICAgICAiICAgICAgICAgICBMb2FkaW5nIGZpcm13YXJlICVzXG4iLCBydGxwcml2LT5jZmctPmZ3X25hbWUpOworCXByX2luZm8oIkRyaXZlciBmb3IgUmVhbHRlayBSVEw4MTkyU0UvUlRMODE5MVNFXG4iCisJCSJMb2FkaW5nIGZpcm13YXJlICVzXG4iLCBydGxwcml2LT5jZmctPmZ3X25hbWUpOwogCS8qIHJlcXVlc3QgZncgKi8KIAllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZmaXJtd2FyZSwgcnRscHJpdi0+Y2ZnLT5md19uYW1lLAogCQkJcnRscHJpdi0+aW8uZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3RyeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvdHJ4LmMKaW5kZXggNWNmNDQyMy4uY2ZmZTMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvdHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvdHJ4LmMKQEAgLTU4MSw3ICs1ODEsNiBAQAogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJdTggKnRtcF9idWY7CiAJdTggKnByYWRkcjsKLQl1OCAqcHNhZGRyOwogCV9fbGUxNiBmYzsKIAl1MTYgdHlwZSwgY2ZjOwogCWJvb2wgcGFja2V0X21hdGNoYnNzaWQsIHBhY2tldF90b3NlbGYsIHBhY2tldF9iZWFjb247CkBAIC01OTMsNyArNTkyLDYgQEAKIAljZmMgPSBsZTE2X3RvX2NwdShmYyk7CiAJdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOwogCXByYWRkciA9IGhkci0+YWRkcjE7Ci0JcHNhZGRyID0gaGRyLT5hZGRyMjsKIAogCXBhY2tldF9tYXRjaGJzc2lkID0gKChJRUVFODAyMTFfRlRZUEVfQ1RMICE9IHR5cGUpICYmCiAJICAgICAoIWNvbXBhcmVfZXRoZXJfYWRkcihtYWMtPmJzc2lkLCAoY2ZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykgPwpAQCAtNjYzLDcgKzY2MSw3IEBACiAKIAogCXJ4X3N0YXR1cy0+bWFjdGltZSA9IEdFVF9SWF9TVEFUVVNfREVTQ19UU0ZMKHBkZXNjKTsKLQlpZiAocGh5c3RhdHVzID09IHRydWUpIHsKKwlpZiAocGh5c3RhdHVzKSB7CiAJCXBfZHJ2aW5mbyA9IChzdHJ1Y3QgcnhfZndpbmZvICopKHNrYi0+ZGF0YSArCiAJCQkJCQkgc3RhdHMtPnJ4X2J1ZnNoaWZ0KTsKIAkJX3J0bDkyc2VfdHJhbnNsYXRlX3J4X3NpZ25hbF9zdHVmZihodywgc2tiLCBzdGF0cywgcGRlc2MsCkBAIC04NzUsNiArODczLDcgQEAKIAkJU0VUX1RYX0RFU0NfVFhfQlVGRkVSX1NJWkUocGRlc2MsICh1MTYpKHNrYi0+bGVuKSk7CiAJCVNFVF9UWF9ERVNDX1RYX0JVRkZFUl9BRERSRVNTKHBkZXNjLCBjcHVfdG9fbGUzMihtYXBwaW5nKSk7CiAKKwkJd21iKCk7CiAJCVNFVF9UWF9ERVNDX09XTihwZGVzYywgMSk7CiAJfSBlbHNlIHsgLyogSDJDIENvbW1hbmQgRGVzYyBmb3JtYXQgKEhvc3QgVFhDTUQpICovCiAJCS8qIDkyU0UgbXVzdCBzZXQgYXMgMSBmb3IgZmlybXdhcmUgZG93bmxvYWQgSFcgRE1BIGVycm9yICovCkBAIC04OTMsNiArODkyLDcgQEAKIAkJU0VUX1RYX0RFU0NfVFhfQlVGRkVSX1NJWkUocGRlc2MsICh1MTYpKHNrYi0+bGVuKSk7CiAJCVNFVF9UWF9ERVNDX1RYX0JVRkZFUl9BRERSRVNTKHBkZXNjLCBjcHVfdG9fbGUzMihtYXBwaW5nKSk7CiAKKwkJd21iKCk7CiAJCVNFVF9UWF9ERVNDX09XTihwZGVzYywgMSk7CiAKIAl9CkBAIC05MDAsOSArOTAwLDEwIEBACiAKIHZvaWQgcnRsOTJzZV9zZXRfZGVzYyh1OCAqcGRlc2MsIGJvb2wgaXN0eCwgdTggZGVzY19uYW1lLCB1OCAqdmFsKQogewotCWlmIChpc3R4ID09IHRydWUpIHsKKwlpZiAoaXN0eCkgewogCQlzd2l0Y2ggKGRlc2NfbmFtZSkgewogCQljYXNlIEhXX0RFU0NfT1dOOgorCQkJd21iKCk7CiAJCQlTRVRfVFhfREVTQ19PV04ocGRlc2MsIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgSFdfREVTQ19UWF9ORVhUREVTQ19BRERSOgpAQCAtOTE2LDYgKzkxNyw3IEBACiAJfSBlbHNlIHsKIAkJc3dpdGNoIChkZXNjX25hbWUpIHsKIAkJY2FzZSBIV19ERVNDX1JYT1dOOgorCQkJd21iKCk7CiAJCQlTRVRfUlhfU1RBVFVTX0RFU0NfT1dOKHBkZXNjLCAxKTsKIAkJCWJyZWFrOwogCQljYXNlIEhXX0RFU0NfUlhCVUZGX0FERFI6CkBAIC05MzksNyArOTQxLDcgQEAKIHsKIAl1MzIgcmV0ID0gMDsKIAotCWlmIChpc3R4ID09IHRydWUpIHsKKwlpZiAoaXN0eCkgewogCQlzd2l0Y2ggKGRlc2NfbmFtZSkgewogCQljYXNlIEhXX0RFU0NfT1dOOgogCQkJcmV0ID0gR0VUX1RYX0RFU0NfT1dOKGRlc2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvdXNiLmMKaW5kZXggYTkzNjdlYi4uOGIxY2VmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3VzYi5jCkBAIC0yNCw2ICsyNCw5IEBACiAgKiBIc2luY2h1IDMwMCwgVGFpd2FuLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgIndpZmkuaCIKQEAgLTEwNCw5ICsxMDcsOCBAQAogCQkJCSBwZGF0YSwgbGVuLCAwKTsgLyogbWF4LiB0aW1lb3V0ICovCiAKIAlpZiAoc3RhdHVzIDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJyZWcgMHgleCwgdXNiY3RybF92ZW5kb3JyZXEgVGltZU91dCEgIgotCQkgICAgICAgInN0YXR1czoweCV4IHZhbHVlPTB4JXhcbiIsIHZhbHVlLCBzdGF0dXMsCi0JCSAgICAgICAqKHUzMiAqKXBkYXRhKTsKKwkJcHJfZXJyKCJyZWcgMHgleCwgdXNiY3RybF92ZW5kb3JyZXEgVGltZU91dCEgc3RhdHVzOjB4JXggdmFsdWU9MHgleFxuIiwKKwkJICAgICAgIHZhbHVlLCBzdGF0dXMsICoodTMyICopcGRhdGEpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTMxNiw3ICszMTgsNyBAQAogCXJ0bHVzYi0+dXNiX3J4X3NlZ3JlZ2F0ZV9oZGwgPQogCQlydGxwcml2LT5jZmctPnVzYl9pbnRlcmZhY2VfY2ZnLT51c2Jfcnhfc2VncmVnYXRlX2hkbDsKIAotCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOTJjdTogcnhfbWF4X3NpemUgJWQsIHJ4X3VyYl9udW0gJWQsIGluX2VwICVkXG4iLAorCXByX2luZm8oInJ4X21heF9zaXplICVkLCByeF91cmJfbnVtICVkLCBpbl9lcCAlZFxuIiwKIAkJcnRsdXNiLT5yeF9tYXhfc2l6ZSwgcnRsdXNiLT5yeF91cmJfbnVtLCBydGx1c2ItPmluX2VwKTsKIAlpbml0X3VzYl9hbmNob3IoJnJ0bHVzYi0+cnhfc3VibWl0dGVkKTsKIAlyZXR1cm4gMDsKQEAgLTU4MCw3ICs1ODIsNyBAQAogCQl9IGVsc2V7CiAJCQkvKiBUTyBETyAqLwogCQkJX3J0bF9yeF9wcmVfcHJvY2Vzcyhodywgc2tiKTsKLQkJCXByaW50ayhLRVJOX0VSUiAicnRsd2lmaTogcnggYWdnIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJcHJfZXJyKCJyeCBhZ2cgbm90IHN1cHBvcnRlZFxuIik7CiAJCX0KIAkJZ290byByZXN1Ym1pdDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3dpZmkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvd2lmaS5oCmluZGV4IDY5MzM5NWUuLmQzYzNmZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvd2lmaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvd2lmaS5oCkBAIC0zMiw3ICszMiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgpAQCAtMzAzLDkgKzMwMiw2IEBACiAJSFdfVkFSX0RBVEFfRklMVEVSLAogfTsKIAotI2RlZmluZSBIV1NFVF9NQVhfU0laRQkJCQkxMjgKLSNkZWZpbmUgRUZVU0VfTUFYX1NFQ1RJT04JCQkxNgotCiBlbnVtIF9SVF9NRURJQV9TVEFUVVMgewogCVJUX01FRElBX0RJU0NPTk5FQ1QgPSAwLAogCVJUX01FRElBX0NPTk5FQ1QgPSAxCkBAIC05MzgsNyArOTM0LDcgQEAKIAlpbnQgbl9jaGFubmVsczsKIAlpbnQgbl9iaXRyYXRlczsKIAotCWJvb2wgb2ZmY2hhbl9kZWxleTsKKwlib29sIG9mZmNoYW5fZGVsYXk7CiAKIAkvKmZpbHRlcnMgKi8KIAl1MzIgcnhfY29uZjsKQEAgLTExODgsNyArMTE4NCw2IEBACiAKIHN0cnVjdCBydGxfcHNfY3RsIHsKIAlib29sIHB3cmRvbWFpbl9wcm90ZWN0OwotCWJvb2wgc2V0X3JmcG93ZXJzdGF0ZV9pbnByb2dyZXNzOwogCWJvb2wgaW5fcG93ZXJzYXZlbW9kZTsKIAlib29sIHJmY2hhbmdlX2lucHJvZ3Jlc3M7CiAJYm9vbCBzd3JmX3Byb2Nlc3Npbmc7CkBAIC0xNTM2LDYgKzE1MzEsNyBAQAogCS8qIEZvciBTVyBMUFMgKi8KIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHBzX3dvcms7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBwc19yZm9uX3dxOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcHNfbGVhdmVfdGFza2xldDsKIH07CiAKIHN0cnVjdCBydGxfZGVidWcgewpAQCAtMTk4Myw3ICsxOTc5LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqZ2V0X3N0YShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkJCSAgICB1OCAqYnNzaWQpCisJCQkJCSAgICBjb25zdCB1OCAqYnNzaWQpCiB7CiAJcmV0dXJuIGllZWU4MDIxMV9maW5kX3N0YSh2aWYsIGJzc2lkKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyNTEvc2Rpby5jCmluZGV4IGY1MWEwMjQuLmY3ODY5NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMjUxL3NkaW8uYwpAQCAtMTksNiArMTksNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMKICAqIENvcHlyaWdodCAoQykgMjAwOSBCb2IgQ29wZWxhbmQgKG1lQGJvYmNvcGVsYW5kLmNvbSkKICAqLworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS9zcGkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS9zcGkuYwppbmRleCBhZjY0NDhjLi5lYWE1Zjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyNTEvc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMjUxL3NwaS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9LY29uZmlnCmluZGV4IDM1Y2U3YjAuLjA3YmNiMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9LY29uZmlnCkBAIC0xMSw3ICsxMSw2IEBACiAJZGVwZW5kcyBvbiBXTDEyWFhfTUVOVSAmJiBHRU5FUklDX0hBUkRJUlFTCiAJZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IEZXX0xPQURFUgotCXNlbGVjdCBDUkM3CiAJLS0taGVscC0tLQogCSAgVGhpcyBtb2R1bGUgYWRkcyBzdXBwb3J0IGZvciB3aXJlbGVzcyBhZGFwdGVycyBiYXNlZCBvbiBUSSB3bDEyNzEgYW5kCiAJICBUSSB3bDEyNzMgY2hpcHNldHMuIFRoaXMgbW9kdWxlIGRvZXMgKm5vdCogaW5jbHVkZSBzdXBwb3J0IGZvciB3bDEyNTEuCkBAIC0zMyw2ICszMiw3IEBACiBjb25maWcgV0wxMlhYX1NQSQogCXRyaXN0YXRlICJUSSB3bDEyeHggU1BJIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBXTDEyWFggJiYgU1BJX01BU1RFUgorCXNlbGVjdCBDUkM3CiAJLS0taGVscC0tLQogCSAgVGhpcyBtb2R1bGUgYWRkcyBzdXBwb3J0IGZvciB0aGUgU1BJIGludGVyZmFjZSBvZiBhZGFwdGVycyB1c2luZwogCSAgVEkgd2wxMnh4IGNoaXBzZXRzLiAgU2VsZWN0IHRoaXMgaWYgeW91ciBwbGF0Zm9ybSBpcyB1c2luZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2FjeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2FjeC5jCmluZGV4IGM2ZWU1MzAuLjdlMzNmMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9hY3guYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYWN4LmMKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzcuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCkBAIC05MSw3ICs5MCw3IEBACiAJc3RydWN0IGFjeF9jdXJyZW50X3R4X3Bvd2VyICphY3g7CiAJaW50IHJldDsKIAotCXdsMTI3MV9kZWJ1ZyhERUJVR19BQ1gsICJhY3ggZG90MTFfY3VyX3R4X3B3ciIpOworCXdsMTI3MV9kZWJ1ZyhERUJVR19BQ1gsICJhY3ggZG90MTFfY3VyX3R4X3B3ciAlZCIsIHBvd2VyKTsKIAogCWlmIChwb3dlciA8IDAgfHwgcG93ZXIgPiAyNSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDY4LDYgKzEwNjcsNyBAQAogCW1lbV9jb25mLT50eF9mcmVlX3JlcSA9IG1lbS0+bWluX3JlcV90eF9ibG9ja3M7CiAJbWVtX2NvbmYtPnJ4X2ZyZWVfcmVxID0gbWVtLT5taW5fcmVxX3J4X2Jsb2NrczsKIAltZW1fY29uZi0+dHhfbWluID0gbWVtLT50eF9taW47CisJbWVtX2NvbmYtPmZ3bG9nX2Jsb2NrcyA9IHdsLT5jb25mLmZ3bG9nLm1lbV9ibG9ja3M7CiAKIAlyZXQgPSB3bDEyNzFfY21kX2NvbmZpZ3VyZSh3bCwgQUNYX01FTV9DRkcsIG1lbV9jb25mLAogCQkJCSAgIHNpemVvZigqbWVtX2NvbmYpKTsKQEAgLTE1NzcsMjIgKzE1NzcsNjkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9tYXhfdHhfcmV0cnkoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2FjeF9wc19yeF9zdHJlYW1pbmcoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQogewotCXN0cnVjdCB3bDEyNzFfYWN4X21heF90eF9yZXRyeSAqYWN4ID0gTlVMTDsKKwlzdHJ1Y3Qgd2wxMjcxX2FjeF9wc19yeF9zdHJlYW1pbmcgKnJ4X3N0cmVhbWluZzsKKwl1MzIgY29uZl9xdWV1ZXMsIGVuYWJsZV9xdWV1ZXM7CisJaW50IGksIHJldCA9IDA7CisKKwl3bDEyNzFfZGVidWcoREVCVUdfQUNYLCAiYWN4IHBzIHJ4IHN0cmVhbWluZyIpOworCisJcnhfc3RyZWFtaW5nID0ga3phbGxvYyhzaXplb2YoKnJ4X3N0cmVhbWluZyksIEdGUF9LRVJORUwpOworCWlmICghcnhfc3RyZWFtaW5nKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWNvbmZfcXVldWVzID0gd2wtPmNvbmYucnhfc3RyZWFtaW5nLnF1ZXVlczsKKwlpZiAoZW5hYmxlKQorCQllbmFibGVfcXVldWVzID0gY29uZl9xdWV1ZXM7CisJZWxzZQorCQllbmFibGVfcXVldWVzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJLyoKKwkJICogU2tpcCBub24tY2hhbmdlZCBxdWV1ZXMsIHRvIGF2b2lkIHJlZHVuZGFudCBhY3hzLgorCQkgKiB0aGlzIGNoZWNrIGFzc3VtZXMgY29uZi5yeF9zdHJlYW1pbmcucXVldWVzIGNhbid0CisJCSAqIGJlIGNoYW5nZWQgd2hpbGUgcnhfc3RyZWFtaW5nIGlzIGVuYWJsZWQuCisJCSAqLworCQlpZiAoIShjb25mX3F1ZXVlcyAmIEJJVChpKSkpCisJCQljb250aW51ZTsKKworCQlyeF9zdHJlYW1pbmctPnRpZCA9IGk7CisJCXJ4X3N0cmVhbWluZy0+ZW5hYmxlID0gZW5hYmxlX3F1ZXVlcyAmIEJJVChpKTsKKwkJcnhfc3RyZWFtaW5nLT5wZXJpb2QgPSB3bC0+Y29uZi5yeF9zdHJlYW1pbmcuaW50ZXJ2YWw7CisJCXJ4X3N0cmVhbWluZy0+dGltZW91dCA9IHdsLT5jb25mLnJ4X3N0cmVhbWluZy5pbnRlcnZhbDsKKworCQlyZXQgPSB3bDEyNzFfY21kX2NvbmZpZ3VyZSh3bCwgQUNYX1BTX1JYX1NUUkVBTUlORywKKwkJCQkJICAgcnhfc3RyZWFtaW5nLAorCQkJCQkgICBzaXplb2YoKnJ4X3N0cmVhbWluZykpOworCQlpZiAocmV0IDwgMCkgeworCQkJd2wxMjcxX3dhcm5pbmcoImFjeCBwcyByeCBzdHJlYW1pbmcgZmFpbGVkOiAlZCIsIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlrZnJlZShyeF9zdHJlYW1pbmcpOworCXJldHVybiByZXQ7Cit9CisKK2ludCB3bDEyNzFfYWN4X2FwX21heF90eF9yZXRyeShzdHJ1Y3Qgd2wxMjcxICp3bCkKK3sKKwlzdHJ1Y3Qgd2wxMjcxX2FjeF9hcF9tYXhfdHhfcmV0cnkgKmFjeCA9IE5VTEw7CiAJaW50IHJldDsKIAotCXdsMTI3MV9kZWJ1ZyhERUJVR19BQ1gsICJhY3ggbWF4IHR4IHJldHJ5Iik7CisJd2wxMjcxX2RlYnVnKERFQlVHX0FDWCwgImFjeCBhcCBtYXggdHggcmV0cnkiKTsKIAogCWFjeCA9IGt6YWxsb2Moc2l6ZW9mKCphY3gpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFjeCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlhY3gtPm1heF90eF9yZXRyeSA9IGNwdV90b19sZTE2KHdsLT5jb25mLnR4LmFwX21heF90eF9yZXRyaWVzKTsKKwlhY3gtPm1heF90eF9yZXRyeSA9IGNwdV90b19sZTE2KHdsLT5jb25mLnR4Lm1heF90eF9yZXRyaWVzKTsKIAogCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfTUFYX1RYX0ZBSUxVUkUsIGFjeCwgc2l6ZW9mKCphY3gpKTsKIAlpZiAocmV0IDwgMCkgewotCQl3bDEyNzFfd2FybmluZygiYWN4IG1heCB0eCByZXRyeSBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJd2wxMjcxX3dhcm5pbmcoImFjeCBhcCBtYXggdHggcmV0cnkgZmFpbGVkOiAlZCIsIHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2FjeC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2FjeC5oCmluZGV4IDlhODk1ZTMuLmQyZWI4NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9hY3guaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYWN4LmgKQEAgLTgyOCw2ICs4MjgsOCBAQAogCXU4IHR4X2ZyZWVfcmVxOwogCXU4IHJ4X2ZyZWVfcmVxOwogCXU4IHR4X21pbjsKKwl1OCBmd2xvZ19ibG9ja3M7CisJdTggcGFkZGluZ1szXTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyNzFfYWN4X21lbV9tYXAgewpAQCAtMTE1Myw3ICsxMTU1LDIwIEBACiAJdTggcGFkZGluZ1szXTsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCB3bDEyNzFfYWN4X21heF90eF9yZXRyeSB7CitzdHJ1Y3Qgd2wxMjcxX2FjeF9wc19yeF9zdHJlYW1pbmcgeworCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKKworCXU4IHRpZDsKKwl1OCBlbmFibGU7CisKKwkvKiBpbnRlcnZhbCBiZXR3ZWVuIHRyaWdnZXJzICgxMC0xMDAgbXNlYykgKi8KKwl1OCBwZXJpb2Q7CisKKwkvKiB0aW1lb3V0IGJlZm9yZSBmaXJzdCB0cmlnZ2VyICgwLTIwMCBtc2VjKSAqLworCXU4IHRpbWVvdXQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd2wxMjcxX2FjeF9hcF9tYXhfdHhfcmV0cnkgewogCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKIAogCS8qCkBAIC0xMzg0LDcgKzEzOTksOCBAQAogaW50IHdsMTI3MV9hY3hfc2V0X2JhX3JlY2VpdmVyX3Nlc3Npb24oc3RydWN0IHdsMTI3MSAqd2wsIHU4IHRpZF9pbmRleCwgdTE2IHNzbiwKIAkJCQkgICAgICAgYm9vbCBlbmFibGUpOwogaW50IHdsMTI3MV9hY3hfdHNmX2luZm8oc3RydWN0IHdsMTI3MSAqd2wsIHU2NCAqbWFjdGltZSk7Ci1pbnQgd2wxMjcxX2FjeF9tYXhfdHhfcmV0cnkoc3RydWN0IHdsMTI3MSAqd2wpOworaW50IHdsMTI3MV9hY3hfcHNfcnhfc3RyZWFtaW5nKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSk7CitpbnQgd2wxMjcxX2FjeF9hcF9tYXhfdHhfcmV0cnkoc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV9hY3hfY29uZmlnX3BzKHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyNzFfYWN4X3NldF9pbmNvbm5lY3Rpb25fc3RhKHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqYWRkcik7CiBpbnQgd2wxMjcxX2FjeF9zZXRfYXBfYmVhY29uX2ZpbHRlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2Jvb3QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ib290LmMKaW5kZXggYjA3ZjhiNy4uNWViYzY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2Jvb3QuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYm9vdC5jCkBAIC0xMDIsNiArMTAyLDMzIEBACiAJd2wxMjcxX3dyaXRlMzIod2wsIEFDWF9SRUdfRUNQVV9DT05UUk9MLCBjcHVfY3RybCk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2wxMnh4X2dldF9md192ZXJfcXVpcmtzKHN0cnVjdCB3bDEyNzEgKndsKQoreworCXVuc2lnbmVkIGludCBxdWlya3MgPSAwOworCXVuc2lnbmVkIGludCAqZndfdmVyID0gd2wtPmNoaXAuZndfdmVyOworCisJLyogT25seSBmb3Igd2wxMjd4ICovCisJaWYgKChmd192ZXJbRldfVkVSX0NISVBdID09IEZXX1ZFUl9DSElQX1dMMTI3WCkgJiYKKwkgICAgLyogQ2hlY2sgU1RBIHZlcnNpb24gKi8KKwkgICAgKCgoZndfdmVyW0ZXX1ZFUl9JRl9UWVBFXSA9PSBGV19WRVJfSUZfVFlQRV9TVEEpICYmCisJICAgICAgKGZ3X3ZlcltGV19WRVJfTUlOT1JdIDwgRldfVkVSX01JTk9SXzFfU1BBUkVfU1RBX01JTikpIHx8CisJICAgICAvKiBDaGVjayBBUCB2ZXJzaW9uICovCisJICAgICAoKGZ3X3ZlcltGV19WRVJfSUZfVFlQRV0gPT0gRldfVkVSX0lGX1RZUEVfQVApICYmCisJICAgICAgKGZ3X3ZlcltGV19WRVJfTUlOT1JdIDwgRldfVkVSX01JTk9SXzFfU1BBUkVfQVBfTUlOKSkpKQorCQlxdWlya3MgfD0gV0wxMlhYX1FVSVJLX1VTRV8yX1NQQVJFX0JMT0NLUzsKKworCS8qIE9ubHkgbmV3IHN0YXRpb24gZmlybXdhcmVzIHN1cHBvcnQgcm91dGluZyBmdyBsb2dzIHRvIHRoZSBob3N0ICovCisJaWYgKChmd192ZXJbRldfVkVSX0lGX1RZUEVdID09IEZXX1ZFUl9JRl9UWVBFX1NUQSkgJiYKKwkgICAgKGZ3X3ZlcltGV19WRVJfTUlOT1JdIDwgRldfVkVSX01JTk9SX0ZXTE9HX1NUQV9NSU4pKQorCQlxdWlya3MgfD0gV0wxMlhYX1FVSVJLX0ZXTE9HX05PVF9JTVBMRU1FTlRFRDsKKworCS8qIFRoaXMgZmVhdHVyZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgQVAgbW9kZSAqLworCWlmIChmd192ZXJbRldfVkVSX0lGX1RZUEVdID09IEZXX1ZFUl9JRl9UWVBFX0FQKQorCQlxdWlya3MgfD0gV0wxMlhYX1FVSVJLX0ZXTE9HX05PVF9JTVBMRU1FTlRFRDsKKworCXJldHVybiBxdWlya3M7Cit9CisKIHN0YXRpYyB2b2lkIHdsMTI3MV9wYXJzZV9md192ZXIoc3RydWN0IHdsMTI3MSAqd2wpCiB7CiAJaW50IHJldDsKQEAgLTExNiw2ICsxNDMsOSBAQAogCQltZW1zZXQod2wtPmNoaXAuZndfdmVyLCAwLCBzaXplb2Yod2wtPmNoaXAuZndfdmVyKSk7CiAJCXJldHVybjsKIAl9CisKKwkvKiBDaGVjayBpZiBhbnkgcXVpcmtzIGFyZSBuZWVkZWQgd2l0aCBvbGRlciBmdyB2ZXJzaW9ucyAqLworCXdsLT5xdWlya3MgfD0gd2wxMnh4X2dldF9md192ZXJfcXVpcmtzKHdsKTsKIH0KIAogc3RhdGljIHZvaWQgd2wxMjcxX2Jvb3RfZndfdmVyc2lvbihzdHJ1Y3Qgd2wxMjcxICp3bCkKQEAgLTQ4Myw5ICs1MTMsMTIgQEAKIAkJUEVSSU9ESUNfU0NBTl9DT01QTEVURV9FVkVOVF9JRDsKIAogCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKQotCQl3bC0+ZXZlbnRfbWFzayB8PSBTVEFfUkVNT1ZFX0NPTVBMRVRFX0VWRU5UX0lEOworCQl3bC0+ZXZlbnRfbWFzayB8PSBTVEFfUkVNT1ZFX0NPTVBMRVRFX0VWRU5UX0lEIHwKKwkJCQkgIElOQUNUSVZFX1NUQV9FVkVOVF9JRCB8CisJCQkJICBNQVhfVFhfUkVUUllfRVZFTlRfSUQ7CiAJZWxzZQotCQl3bC0+ZXZlbnRfbWFzayB8PSBEVU1NWV9QQUNLRVRfRVZFTlRfSUQ7CisJCXdsLT5ldmVudF9tYXNrIHw9IERVTU1ZX1BBQ0tFVF9FVkVOVF9JRCB8CisJCQlCQV9TRVNTSU9OX1JYX0NPTlNUUkFJTlRfRVZFTlRfSUQ7CiAKIAlyZXQgPSB3bDEyNzFfZXZlbnRfdW5tYXNrKHdsKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNzQ4LDYgKzc4MSw5IEBACiAJCWNsayB8PSAod2wtPnJlZl9jbG9jayA8PCAxKSA8PCA0OwogCX0KIAorCWlmICh3bC0+cXVpcmtzICYgV0wxMlhYX1FVSVJLX0xQRF9NT0RFKQorCQljbGsgfD0gU0NSQVRDSF9FTkFCTEVfTFBEOworCiAJd2wxMjcxX3dyaXRlMzIod2wsIERSUFdfU0NSQVRDSF9TVEFSVCwgY2xrKTsKIAogCXdsMTI3MV9zZXRfcGFydGl0aW9uKHdsLCAmcGFydF90YWJsZVtQQVJUX1dPUktdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jbWQuYwppbmRleCA0MjkzNWFjLi45N2RkMjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NtZC5jCkBAIC0yMyw3ICsyMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jcmM3Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CkBAIC0xMDYsNyArMTA1LDcgQEAKIAogZmFpbDoKIAlXQVJOX09OKDEpOwotCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywgJndsLT5yZWNvdmVyeV93b3JrKTsKKwl3bDEyeHhfcXVldWVfcmVjb3Zlcnlfd29yayh3bCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTM1LDYgKzEzNCwxMSBAQAogCS8qIE92ZXJyaWRlIHRoZSBSRUYgQ0xLIGZyb20gdGhlIE5WUyB3aXRoIHRoZSBvbmUgZnJvbSBwbGF0Zm9ybSBkYXRhICovCiAJZ2VuX3Bhcm1zLT5nZW5lcmFsX3BhcmFtcy5yZWZfY2xvY2sgPSB3bC0+cmVmX2Nsb2NrOwogCisJLyogTFBEIG1vZGUgZW5hYmxlIChiaXRzIDYtNykgaW4gV0wxMjcxIEFQIG1vZGUgb25seSAqLworCWlmICh3bC0+cXVpcmtzICYgV0wxMlhYX1FVSVJLX0xQRF9NT0RFKQorCQlnZW5fcGFybXMtPmdlbmVyYWxfcGFyYW1zLmdlbmVyYWxfc2V0dGluZ3MgfD0KKwkJCUdFTkVSQUxfU0VUVElOR1NfRFJQV19MUEQ7CisKIAlyZXQgPSB3bDEyNzFfY21kX3Rlc3Qod2wsIGdlbl9wYXJtcywgc2l6ZW9mKCpnZW5fcGFybXMpLCBhbnN3ZXIpOwogCWlmIChyZXQgPCAwKSB7CiAJCXdsMTI3MV93YXJuaW5nKCJDTURfSU5JX0ZJTEVfR0VORVJBTF9QQVJBTSBmYWlsZWQiKTsKQEAgLTM1Miw3ICszNTYsNyBAQAogCiAJcmV0ID0gd2wxMjcxX2NtZF93YWl0X2Zvcl9ldmVudF9vcl90aW1lb3V0KHdsLCBtYXNrKTsKIAlpZiAocmV0ICE9IDApIHsKLQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsod2wtPmh3LCAmd2wtPnJlY292ZXJ5X3dvcmspOworCQl3bDEyeHhfcXVldWVfcmVjb3Zlcnlfd29yayh3bCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zOTYsMTAgKzQwMCw2IEBACiAKIAlqb2luLT5jdHJsIHw9IHdsLT5zZXNzaW9uX2NvdW50ZXIgPDwgV0wxMjcxX0pPSU5fQ01EX1RYX1NFU1NJT05fT0ZGU0VUOwogCi0JLyogcmVzZXQgVFggc2VjdXJpdHkgY291bnRlcnMgKi8KLQl3bC0+dHhfc2VjdXJpdHlfbGFzdF9zZXEgPSAwOwotCXdsLT50eF9zZWN1cml0eV9zZXEgPSAwOwotCiAJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCBqb2luOiBiYXNpY19yYXRlX3NldD0weCV4LCByYXRlX3NldD0weCV4IiwKIAkJam9pbi0+YmFzaWNfcmF0ZV9zZXQsIGpvaW4tPnN1cHBvcnRlZF9yYXRlX3NldCk7CiAKQEAgLTEwODAsNyArMTA4MCw3IEBACiAKIAltZW1jcHkoY21kLT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTik7CiAKLQljbWQtPmFnaW5nX3BlcmlvZCA9IGNwdV90b19sZTE2KFdMMTI3MV9BUF9ERUZfSU5BQ1RJVl9TRUMpOworCWNtZC0+YWdpbmdfcGVyaW9kID0gY3B1X3RvX2xlMTYod2wtPmNvbmYudHguYXBfYWdpbmdfcGVyaW9kKTsKIAljbWQtPmJzc19pbmRleCA9IFdMMTI3MV9BUF9CU1NfSU5ERVg7CiAJY21kLT5nbG9iYWxfaGxpZCA9IFdMMTI3MV9BUF9HTE9CQUxfSExJRDsKIAljbWQtPmJyb2FkY2FzdF9obGlkID0gV0wxMjcxX0FQX0JST0FEQ0FTVF9ITElEOwpAQCAtMTE2NywxNCArMTE2Nyw3IEBACiAJY21kLT5ic3NfaW5kZXggPSBXTDEyNzFfQVBfQlNTX0lOREVYOwogCWNtZC0+YWlkID0gc3RhLT5haWQ7CiAJY21kLT5obGlkID0gaGxpZDsKLQotCS8qCi0JICogRklYTUU6IERvZXMgU1RBIHN1cHBvcnQgUU9TPyBXZSBuZWVkIHRvIHByb3BhZ2F0ZSB0aGlzIGluZm8gZnJvbQotCSAqIGhvc3RhcGQuIEN1cnJlbnRseSBub3QgdGhhdCBpbXBvcnRhbnQgc2luY2UgdGhpcyBpcyBvbmx5IHVzZWQgZm9yCi0JICogc2VuZGluZyB0aGUgY29ycmVjdCBmbGF2b3Igb2YgbnVsbC1kYXRhIHBhY2tldCBpbiByZXNwb25zZSB0byBhCi0JICogdHJpZ2dlci4KLQkgKi8KLQljbWQtPndtbSA9IDA7CisJY21kLT53bW0gPSBzdGEtPndtZSA/IDEgOiAwOwogCiAJY21kLT5zdXBwb3J0ZWRfcmF0ZXMgPSBjcHVfdG9fbGUzMih3bDEyNzFfdHhfZW5hYmxlZF9yYXRlc19nZXQod2wsCiAJCQkJCQlzdGEtPnN1cHBfcmF0ZXNbd2wtPmJhbmRdKSk7CkBAIC0xMjMwLDMgKzEyMjMsODcgQEAKIG91dDoKIAlyZXR1cm4gcmV0OwogfQorCitpbnQgd2wxMnh4X2NtZF9jb25maWdfZndsb2coc3RydWN0IHdsMTI3MSAqd2wpCit7CisJc3RydWN0IHdsMTJ4eF9jbWRfY29uZmlnX2Z3bG9nICpjbWQ7CisJaW50IHJldCA9IDA7CisKKwl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAiY21kIGNvbmZpZyBmaXJtd2FyZSBsb2dnZXIiKTsKKworCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtZCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwljbWQtPmxvZ2dlcl9tb2RlID0gd2wtPmNvbmYuZndsb2cubW9kZTsKKwljbWQtPmxvZ19zZXZlcml0eSA9IHdsLT5jb25mLmZ3bG9nLnNldmVyaXR5OworCWNtZC0+dGltZXN0YW1wID0gd2wtPmNvbmYuZndsb2cudGltZXN0YW1wOworCWNtZC0+b3V0cHV0ID0gd2wtPmNvbmYuZndsb2cub3V0cHV0OworCWNtZC0+dGhyZXNob2xkID0gd2wtPmNvbmYuZndsb2cudGhyZXNob2xkOworCisJcmV0ID0gd2wxMjcxX2NtZF9zZW5kKHdsLCBDTURfQ09ORklHX0ZXTE9HR0VSLCBjbWQsIHNpemVvZigqY21kKSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJd2wxMjcxX2Vycm9yKCJmYWlsZWQgdG8gc2VuZCBjb25maWcgZmlybXdhcmUgbG9nZ2VyIGNvbW1hbmQiKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKK291dF9mcmVlOgorCWtmcmVlKGNtZCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgd2wxMnh4X2NtZF9zdGFydF9md2xvZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK3sKKwlzdHJ1Y3Qgd2wxMnh4X2NtZF9zdGFydF9md2xvZyAqY21kOworCWludCByZXQgPSAwOworCisJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCBzdGFydCBmaXJtd2FyZSBsb2dnZXIiKTsKKworCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtZCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSB3bDEyNzFfY21kX3NlbmQod2wsIENNRF9TVEFSVF9GV0xPR0dFUiwgY21kLCBzaXplb2YoKmNtZCksIDApOworCWlmIChyZXQgPCAwKSB7CisJCXdsMTI3MV9lcnJvcigiZmFpbGVkIHRvIHNlbmQgc3RhcnQgZmlybXdhcmUgbG9nZ2VyIGNvbW1hbmQiKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKK291dF9mcmVlOgorCWtmcmVlKGNtZCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgd2wxMnh4X2NtZF9zdG9wX2Z3bG9nKHN0cnVjdCB3bDEyNzEgKndsKQoreworCXN0cnVjdCB3bDEyeHhfY21kX3N0b3BfZndsb2cgKmNtZDsKKwlpbnQgcmV0ID0gMDsKKworCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgc3RvcCBmaXJtd2FyZSBsb2dnZXIiKTsKKworCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtZCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSB3bDEyNzFfY21kX3NlbmQod2wsIENNRF9TVE9QX0ZXTE9HR0VSLCBjbWQsIHNpemVvZigqY21kKSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJd2wxMjcxX2Vycm9yKCJmYWlsZWQgdG8gc2VuZCBzdG9wIGZpcm13YXJlIGxvZ2dlciBjb21tYW5kIik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCitvdXRfZnJlZToKKwlrZnJlZShjbWQpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jbWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jbWQuaAppbmRleCA1Y2FjOTVkLi4xZjcwMzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY21kLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NtZC5oCkBAIC03MCw2ICs3MCw5IEBACiBpbnQgd2wxMjcxX2NtZF9zdG9wX2JzcyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMjcxX2NtZF9hZGRfc3RhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCBobGlkKTsKIGludCB3bDEyNzFfY21kX3JlbW92ZV9zdGEoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGhsaWQpOworaW50IHdsMTJ4eF9jbWRfY29uZmlnX2Z3bG9nKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyeHhfY21kX3N0YXJ0X2Z3bG9nKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyeHhfY21kX3N0b3BfZndsb2coc3RydWN0IHdsMTI3MSAqd2wpOwogCiBlbnVtIHdsMTI3MV9jb21tYW5kcyB7CiAJQ01EX0lOVEVSUk9HQVRFICAgICA9IDEsICAgIC8qdXNlIHRoaXMgdG8gcmVhZCBpbmZvcm1hdGlvbiBlbGVtZW50cyovCkBAIC0xMDcsNiArMTEwLDkgQEAKIAlDTURfU1RBUlRfUEVSSU9ESUNfU0NBTiAgICAgID0gNTAsCiAJQ01EX1NUT1BfUEVSSU9ESUNfU0NBTiAgICAgICA9IDUxLAogCUNNRF9TRVRfU1RBX1NUQVRFICAgICAgICAgICAgPSA1MiwKKwlDTURfQ09ORklHX0ZXTE9HR0VSICAgICAgICAgID0gNTMsCisJQ01EX1NUQVJUX0ZXTE9HR0VSICAgICAgICAgICA9IDU0LAorCUNNRF9TVE9QX0ZXTE9HR0VSICAgICAgICAgICAgPSA1NSwKIAogCS8qIEFQIG1vZGUgY29tbWFuZHMgKi8KIAlDTURfQlNTX1NUQVJUICAgICAgICAgICAgICAgID0gNjAsCkBAIC01NzUsNCArNTgxLDYwIEBACiAJdTggcGFkZGluZzE7CiB9IF9fcGFja2VkOwogCisvKgorICogQ29udGludW91cyBtb2RlIC0gcGFja2V0cyBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIGhvc3QgcGVyaW9kaWNhbGx5CisgKiB2aWEgdGhlIGRhdGEgcGF0aC4KKyAqIE9uIGRlbWFuZCAtIExvZyBtZXNzYWdlcyBhcmUgc3RvcmVkIGluIGEgY3ljbGljIGJ1ZmZlciBpbiB0aGUKKyAqIGZpcm13YXJlLCBhbmQgb25seSB0cmFuc2ZlcnJlZCB0byB0aGUgaG9zdCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgKi8KK2VudW0gd2wxMnh4X2Z3bG9nZ2VyX2xvZ19tb2RlIHsKKwlXTDEyWFhfRldMT0dfQ09OVElOVU9VUywKKwlXTDEyWFhfRldMT0dfT05fREVNQU5ECit9OworCisvKiBJbmNsdWRlL2V4Y2x1ZGUgdGltZXN0YW1wcyBmcm9tIHRoZSBsb2cgbWVzc2FnZXMgKi8KK2VudW0gd2wxMnh4X2Z3bG9nZ2VyX3RpbWVzdGFtcCB7CisJV0wxMlhYX0ZXTE9HX1RJTUVTVEFNUF9ESVNBQkxFRCwKKwlXTDEyWFhfRldMT0dfVElNRVNUQU1QX0VOQUJMRUQKK307CisKKy8qCisgKiBMb2dzIGNhbiBiZSByb3V0ZWQgdG8gdGhlIGRlYnVnIHBpbm91dHMgKHdoZXJlIGF2YWlsYWJsZSksIHRvIHRoZSBob3N0IGJ1cworICogKFNESU8vU1BJKSwgb3IgZHJvcHBlZAorICovCitlbnVtIHdsMTJ4eF9md2xvZ2dlcl9vdXRwdXQgeworCVdMMTJYWF9GV0xPR19PVVRQVVRfTk9ORSwKKwlXTDEyWFhfRldMT0dfT1VUUFVUX0RCR19QSU5TLAorCVdMMTJYWF9GV0xPR19PVVRQVVRfSE9TVCwKK307CisKK3N0cnVjdCB3bDEyeHhfY21kX2NvbmZpZ19md2xvZyB7CisJc3RydWN0IHdsMTI3MV9jbWRfaGVhZGVyIGhlYWRlcjsKKworCS8qIFNlZSBlbnVtIHdsMTJ4eF9md2xvZ2dlcl9sb2dfbW9kZSAqLworCXU4IGxvZ2dlcl9tb2RlOworCisJLyogTWluaW11bSBsb2cgbGV2ZWwgdGhyZXNob2xkICovCisJdTggbG9nX3NldmVyaXR5OworCisJLyogSW5jbHVkZS9leGNsdWRlIHRpbWVzdGFtcHMgZnJvbSB0aGUgbG9nIG1lc3NhZ2VzICovCisJdTggdGltZXN0YW1wOworCisJLyogU2VlIGVudW0gd2wxMjcxX2Z3bG9nZ2VyX291dHB1dCAqLworCXU4IG91dHB1dDsKKworCS8qIFJlZ3VsYXRlcyB0aGUgZnJlcXVlbmN5IG9mIGxvZyBtZXNzYWdlcyAqLworCXU4IHRocmVzaG9sZDsKKworCXU4IHBhZGRpbmdbM107Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd2wxMnh4X2NtZF9zdGFydF9md2xvZyB7CisJc3RydWN0IHdsMTI3MV9jbWRfaGVhZGVyIGhlYWRlcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3bDEyeHhfY21kX3N0b3BfZndsb2cgeworCXN0cnVjdCB3bDEyNzFfY21kX2hlYWRlciBoZWFkZXI7Cit9IF9fcGFja2VkOworCiAjZW5kaWYgLyogX19XTDEyNzFfQ01EX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NvbmYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jb25mLmgKaW5kZXggYzgzZmVmYi4uNjA4MGUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NvbmYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY29uZi5oCkBAIC03MTMsOCArNzEzLDE2IEBACiAJLyoKIAkgKiBBUC1tb2RlIC0gYWxsb3cgdGhpcyBudW1iZXIgb2YgVFggcmV0cmllcyB0byBhIHN0YXRpb24gYmVmb3JlIGFuCiAJICogZXZlbnQgaXMgdHJpZ2dlcmVkIGZyb20gRlcuCisJICogSW4gQVAtbW9kZSB0aGUgaGxpZHMgb2YgdW5yZWFjaGFibGUgc3RhdGlvbnMgYXJlIGdpdmVuIGluIHRoZQorCSAqICJzdGFfdHhfcmV0cnlfZXhjZWVkZWQiIG1lbWJlciBpbiB0aGUgZXZlbnQgbWFpbGJveC4KIAkgKi8KLQl1MTYgYXBfbWF4X3R4X3JldHJpZXM7CisJdTggbWF4X3R4X3JldHJpZXM7CisKKwkvKgorCSAqIEFQLW1vZGUgLSBhZnRlciB0aGlzIG51bWJlciBvZiBzZWNvbmRzIGEgY29ubmVjdGVkIHN0YXRpb24gaXMKKwkgKiBjb25zaWRlcmVkIGluYWN0aXZlLgorCSAqLworCXUxNiBhcF9hZ2luZ19wZXJpb2Q7CiAKIAkvKgogCSAqIENvbmZpZ3VyYXRpb24gZm9yIFRJRCBwYXJhbWV0ZXJzLgpAQCAtMTI0OCw2ICsxMjU2LDU5IEBACiAJdTggc3dhbGxvd19jbGtfZGlmZjsKIH07CiAKK3N0cnVjdCBjb25mX3J4X3N0cmVhbWluZ19zZXR0aW5ncyB7CisJLyoKKwkgKiBSWCBTdHJlYW1pbmcgZHVyYXRpb24gKGluIG1zZWMpIGZyb20gbGFzdCB0eC9yeAorCSAqCisJICogUmFuZ2U6IHUzMgorCSAqLworCXUzMiBkdXJhdGlvbjsKKworCS8qCisJICogQml0bWFwIG9mIHRpZHMgdG8gYmUgcG9sbGVkIGR1cmluZyBSWCBzdHJlYW1pbmcuCisJICogKE5vdGU6IGl0IGRvZXNuJ3QgbG9vayBsaWtlIGl0IHJlYWxseSBtYXR0ZXJzKQorCSAqCisJICogUmFuZ2U6IDB4MS0weGZmCisJICovCisJdTggcXVldWVzOworCisJLyoKKwkgKiBSWCBTdHJlYW1pbmcgaW50ZXJ2YWwuCisJICogKE5vdGU6dGhpcyB2YWx1ZSBpcyBhbHNvIHVzZWQgYXMgdGhlIHJ4IHN0cmVhbWluZyB0aW1lb3V0KQorCSAqIFJhbmdlOiAwIChkaXNhYmxlZCksIDEwIC0gMTAwCisJICovCisJdTggaW50ZXJ2YWw7CisKKwkvKgorCSAqIGVuYWJsZSByeCBzdHJlYW1pbmcgYWxzbyB3aGVuIHRoZXJlIGlzIG5vIGNvZXggYWN0aXZpdHkKKwkgKi8KKwl1OCBhbHdheXM7Cit9OworCitzdHJ1Y3QgY29uZl9md2xvZyB7CisJLyogQ29udGludW91cyBvciBvbi1kZW1hbmQgKi8KKwl1OCBtb2RlOworCisJLyoKKwkgKiBOdW1iZXIgb2YgbWVtb3J5IGJsb2NrcyBkZWRpY2F0ZWQgZm9yIHRoZSBGVyBsb2dnZXIKKwkgKgorCSAqIFJhbmdlOiAxLTMsIG9yIDAgdG8gZGlzYWJsZSB0aGUgRlcgbG9nZ2VyCisJICovCisJdTggbWVtX2Jsb2NrczsKKworCS8qIE1pbmltdW0gbG9nIGxldmVsIHRocmVzaG9sZCAqLworCXU4IHNldmVyaXR5OworCisJLyogSW5jbHVkZS9leGNsdWRlIHRpbWVzdGFtcHMgZnJvbSB0aGUgbG9nIG1lc3NhZ2VzICovCisJdTggdGltZXN0YW1wOworCisJLyogU2VlIGVudW0gd2wxMjcxX2Z3bG9nZ2VyX291dHB1dCAqLworCXU4IG91dHB1dDsKKworCS8qIFJlZ3VsYXRlcyB0aGUgZnJlcXVlbmN5IG9mIGxvZyBtZXNzYWdlcyAqLworCXU4IHRocmVzaG9sZDsKK307CisKIHN0cnVjdCBjb25mX2Rydl9zZXR0aW5ncyB7CiAJc3RydWN0IGNvbmZfc2dfc2V0dGluZ3Mgc2c7CiAJc3RydWN0IGNvbmZfcnhfc2V0dGluZ3Mgcng7CkBAIC0xMjYzLDYgKzEzMjQsOCBAQAogCXN0cnVjdCBjb25mX21lbW9yeV9zZXR0aW5ncyBtZW1fd2wxMjd4OwogCXN0cnVjdCBjb25mX21lbW9yeV9zZXR0aW5ncyBtZW1fd2wxMjh4OwogCXN0cnVjdCBjb25mX2ZtX2NvZXggZm1fY29leDsKKwlzdHJ1Y3QgY29uZl9yeF9zdHJlYW1pbmdfc2V0dGluZ3Mgcnhfc3RyZWFtaW5nOworCXN0cnVjdCBjb25mX2Z3bG9nIGZ3bG9nOwogCXU4IGhjaV9pb19kczsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZGVidWdmcy5jCmluZGV4IGYxZjhkZjkuLjM3OTM0YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2RlYnVnZnMuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgImFjeC5oIgogI2luY2x1ZGUgInBzLmgiCiAjaW5jbHVkZSAiaW8uaCIKKyNpbmNsdWRlICJ0eC5oIgogCiAvKiBtcyAqLwogI2RlZmluZSBXTDEyNzFfREVCVUdGU19TVEFUU19MSUZFVElNRSAxMDAwCkBAIC03MSw2ICs3MiwxNCBAQAogCWlmICghZW50cnkgfHwgSVNfRVJSKGVudHJ5KSkJCQkJCVwKIAkJZ290byBlcnI7CQkJCQkJXAogCisjZGVmaW5lIERFQlVHRlNfQUREX1BSRUZJWChwcmVmaXgsIG5hbWUsIHBhcmVudCkJCQlcCisJZG8gewkJCQkJCQkJXAorCQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoI25hbWUsIDA0MDAsIHBhcmVudCwJXAorCQkJCSAgICB3bCwgJnByZWZpeCMjIF8jIyBuYW1lIyMgX29wcyk7CVwKKwkJaWYgKCFlbnRyeSB8fCBJU19FUlIoZW50cnkpKQkJCQlcCisJCQlnb3RvIGVycjsJCQkJCVwKKwl9IHdoaWxlICgwKTsKKwogI2RlZmluZSBERUJVR0ZTX0ZXU1RBVFNfRklMRShzdWIsIG5hbWUsIGZtdCkJCQkJXAogc3RhdGljIHNzaXplX3Qgc3ViIyMgXyAjI25hbWUjIyBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwJCVwKIAkJCQkgICAgICBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwJCVwKQEAgLTIyNSw3ICsyMzQsNyBAQAogCWNoYXIgYnVmWzIwXTsKIAlpbnQgcmVzOwogCi0JcXVldWVfbGVuID0gd2wtPnR4X3F1ZXVlX2NvdW50OworCXF1ZXVlX2xlbiA9IHdsMTI3MV90eF90b3RhbF9xdWV1ZV9jb3VudCh3bCk7CiAKIAlyZXMgPSBzY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1XG4iLCBxdWV1ZV9sZW4pOwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCByZXMpOwpAQCAtMjk4LDcgKzMwNyw3IEBACiAJc3RydWN0IHdsMTI3MSAqd2wgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwotCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywgJndsLT5yZWNvdmVyeV93b3JrKTsKKwl3bDEyeHhfcXVldWVfcmVjb3Zlcnlfd29yayh3bCk7CiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtMzMwLDEwICszMzksMTYgQEAKICNkZWZpbmUgRFJJVkVSX1NUQVRFX1BSSU5UX0hFWCh4KSAgRFJJVkVSX1NUQVRFX1BSSU5UKHgsICIweCV4IikKIAogCURSSVZFUl9TVEFURV9QUklOVF9JTlQodHhfYmxvY2tzX2F2YWlsYWJsZSk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0lOVCh0eF9hbGxvY2F0ZWRfYmxvY2tzKTsKKwlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHR4X2FsbG9jYXRlZF9ibG9ja3NbMF0pOworCURSSVZFUl9TVEFURV9QUklOVF9JTlQodHhfYWxsb2NhdGVkX2Jsb2Nrc1sxXSk7CisJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVCh0eF9hbGxvY2F0ZWRfYmxvY2tzWzJdKTsKKwlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHR4X2FsbG9jYXRlZF9ibG9ja3NbM10pOwogCURSSVZFUl9TVEFURV9QUklOVF9JTlQodHhfZnJhbWVzX2NudCk7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0xIRVgodHhfZnJhbWVzX21hcFswXSk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0lOVCh0eF9xdWV1ZV9jb3VudCk7CisJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVCh0eF9xdWV1ZV9jb3VudFswXSk7CisJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVCh0eF9xdWV1ZV9jb3VudFsxXSk7CisJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVCh0eF9xdWV1ZV9jb3VudFsyXSk7CisJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVCh0eF9xdWV1ZV9jb3VudFszXSk7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVCh0eF9wYWNrZXRzX2NvdW50KTsKIAlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHR4X3Jlc3VsdHNfY291bnQpOwogCURSSVZFUl9TVEFURV9QUklOVF9MSEVYKGZsYWdzKTsKQEAgLTM0MSw3ICszNTYsNyBAQAogCURSSVZFUl9TVEFURV9QUklOVF9JTlQodHhfYmxvY2tzX2ZyZWVkWzFdKTsKIAlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHR4X2Jsb2Nrc19mcmVlZFsyXSk7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVCh0eF9ibG9ja3NfZnJlZWRbM10pOwotCURSSVZFUl9TVEFURV9QUklOVF9JTlQodHhfc2VjdXJpdHlfbGFzdF9zZXEpOworCURSSVZFUl9TVEFURV9QUklOVF9JTlQodHhfc2VjdXJpdHlfbGFzdF9zZXFfbHNiKTsKIAlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHJ4X2NvdW50ZXIpOwogCURSSVZFUl9TVEFURV9QUklOVF9JTlQoc2Vzc2lvbl9jb3VudGVyKTsKIAlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHN0YXRlKTsKQEAgLTUyNywxMSArNTQyLDEyOSBAQAogCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKIH07CiAKK3N0YXRpYyBzc2l6ZV90IHJ4X3N0cmVhbWluZ19pbnRlcnZhbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB3bDEyNzEgKndsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzEwXTsKKwlzaXplX3QgbGVuOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKworCWxlbiA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2xlbl0gPSAnXDAnOworCisJcmV0ID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsdWUpOworCWlmIChyZXQgPCAwKSB7CisJCXdsMTI3MV93YXJuaW5nKCJpbGxlZ2FsIHZhbHVlIGluIHJ4X3N0cmVhbWluZ19pbnRlcnZhbCEiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogdmFsaWQgdmFsdWVzOiAwLCAxMC0xMDAgKi8KKwlpZiAodmFsdWUgJiYgKHZhbHVlIDwgMTAgfHwgdmFsdWUgPiAxMDApKSB7CisJCXdsMTI3MV93YXJuaW5nKCJ2YWx1ZSBpcyBub3QgaW4gcmFuZ2UhIik7CisJCXJldHVybiAtRVJBTkdFOworCX0KKworCW11dGV4X2xvY2soJndsLT5tdXRleCk7CisKKwl3bC0+Y29uZi5yeF9zdHJlYW1pbmcuaW50ZXJ2YWwgPSB2YWx1ZTsKKworCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwl3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyh3bCk7CisKKwl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKK291dDoKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCByeF9zdHJlYW1pbmdfaW50ZXJ2YWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gd2wxMjcxX2Zvcm1hdF9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsCisJCQkJICAgICIlZFxuIiwgd2wtPmNvbmYucnhfc3RyZWFtaW5nLmludGVydmFsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnhfc3RyZWFtaW5nX2ludGVydmFsX29wcyA9IHsKKwkucmVhZCA9IHJ4X3N0cmVhbWluZ19pbnRlcnZhbF9yZWFkLAorCS53cml0ZSA9IHJ4X3N0cmVhbWluZ19pbnRlcnZhbF93cml0ZSwKKwkub3BlbiA9IHdsMTI3MV9vcGVuX2ZpbGVfZ2VuZXJpYywKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCByeF9zdHJlYW1pbmdfYWx3YXlzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbMTBdOworCXNpemVfdCBsZW47CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0OworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbbGVuXSA9ICdcMCc7CisKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZ2YWx1ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJd2wxMjcxX3dhcm5pbmcoImlsbGVnYWwgdmFsdWUgaW4gcnhfc3RyZWFtaW5nX3dyaXRlISIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB2YWxpZCB2YWx1ZXM6IDAsIDEwLTEwMCAqLworCWlmICghKHZhbHVlID09IDAgfHwgdmFsdWUgPT0gMSkpIHsKKwkJd2wxMjcxX3dhcm5pbmcoInZhbHVlIGlzIG5vdCBpbiB2YWxpZCEiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKKworCXdsLT5jb25mLnJ4X3N0cmVhbWluZy5hbHdheXMgPSB2YWx1ZTsKKworCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwl3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyh3bCk7CisKKwl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKK291dDoKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCByeF9zdHJlYW1pbmdfYWx3YXlzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIHdsMTI3MV9mb3JtYXRfYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLAorCQkJCSAgICAiJWRcbiIsIHdsLT5jb25mLnJ4X3N0cmVhbWluZy5hbHdheXMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeF9zdHJlYW1pbmdfYWx3YXlzX29wcyA9IHsKKwkucmVhZCA9IHJ4X3N0cmVhbWluZ19hbHdheXNfcmVhZCwKKwkud3JpdGUgPSByeF9zdHJlYW1pbmdfYWx3YXlzX3dyaXRlLAorCS5vcGVuID0gd2wxMjcxX29wZW5fZmlsZV9nZW5lcmljLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKIHN0YXRpYyBpbnQgd2wxMjcxX2RlYnVnZnNfYWRkX2ZpbGVzKHN0cnVjdCB3bDEyNzEgKndsLAogCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqcm9vdGRpcikKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgKnN0YXRzOworCXN0cnVjdCBkZW50cnkgKmVudHJ5LCAqc3RhdHMsICpzdHJlYW1pbmc7CiAKIAlzdGF0cyA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZnctc3RhdGlzdGljcyIsIHJvb3RkaXIpOwogCWlmICghc3RhdHMgfHwgSVNfRVJSKHN0YXRzKSkgewpAQCAtNjQwLDYgKzc3MywxNCBAQAogCURFQlVHRlNfQUREKGR0aW1faW50ZXJ2YWwsIHJvb3RkaXIpOwogCURFQlVHRlNfQUREKGJlYWNvbl9pbnRlcnZhbCwgcm9vdGRpcik7CiAKKwlzdHJlYW1pbmcgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInJ4X3N0cmVhbWluZyIsIHJvb3RkaXIpOworCWlmICghc3RyZWFtaW5nIHx8IElTX0VSUihzdHJlYW1pbmcpKQorCQlnb3RvIGVycjsKKworCURFQlVHRlNfQUREX1BSRUZJWChyeF9zdHJlYW1pbmcsIGludGVydmFsLCBzdHJlYW1pbmcpOworCURFQlVHRlNfQUREX1BSRUZJWChyeF9zdHJlYW1pbmcsIGFsd2F5cywgc3RyZWFtaW5nKTsKKworCiAJcmV0dXJuIDA7CiAKIGVycjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ldmVudC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2V2ZW50LmMKaW5kZXggYzNjNTU0Yy4uMzA0YWFhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2V2ZW50LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2V2ZW50LmMKQEAgLTEzMywxMCArMTMzLDEzIEBACiAJCWlmIChyZXQgPCAwKQogCQkJYnJlYWs7CiAKLQkJLyogZW5hYmxlIGJlYWNvbiBlYXJseSB0ZXJtaW5hdGlvbiAqLwotCQlyZXQgPSB3bDEyNzFfYWN4X2JldF9lbmFibGUod2wsIHRydWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOworCQkvKgorCQkgKiBCRVQgaGFzIG9ubHkgYSBtaW5vciBlZmZlY3QgaW4gNUdIeiBhbmQgbWFza3MKKwkJICogY2hhbm5lbCBzd2l0Y2ggSUVzLCBzbyB3ZSBvbmx5IGVuYWJsZSBCRVQgb24gMi40R0h6CisJCSovCisJCWlmICh3bC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQorCQkJLyogZW5hYmxlIGJlYWNvbiBlYXJseSB0ZXJtaW5hdGlvbiAqLworCQkJcmV0ID0gd2wxMjcxX2FjeF9iZXRfZW5hYmxlKHdsLCB0cnVlKTsKIAogCQlpZiAod2wtPnBzX2NvbXBsKSB7CiAJCQljb21wbGV0ZSh3bC0+cHNfY29tcGwpOwpAQCAtMTY4LDYgKzE3MSwzNiBAQAogCXdsLT5sYXN0X3Jzc2lfZXZlbnQgPSBldmVudDsKIH0KIAorc3RhdGljIHZvaWQgd2wxMjcxX3N0b3BfYmFfZXZlbnQoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGJhX2FsbG93ZWQpCit7CisJLyogQ29udmVydCB0aGUgdmFsdWUgdG8gYm9vbCAqLworCXdsLT5iYV9hbGxvd2VkID0gISFiYV9hbGxvd2VkOworCisJLyoKKwkgKiBSZXR1cm4gaW4gY2FzZToKKwkgKiB0aGVyZSBhcmUgbm90IEJBIG9wZW4gb3IgdGhlIGV2ZW50IGluZGljYXRpb24gaXMgdG8gYWxsb3dlZCBCQQorCSAqLworCWlmICgoIXdsLT5iYV9yeF9iaXRtYXApIHx8ICh3bC0+YmFfYWxsb3dlZCkpCisJCXJldHVybjsKKworCWllZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24od2wtPnZpZiwgd2wtPmJhX3J4X2JpdG1hcCwgd2wtPmJzc2lkKTsKK30KKworc3RhdGljIHZvaWQgd2wxMnh4X2V2ZW50X3NvZnRfZ2VtaW5pX3NlbnNlKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgICAgICAgdTggZW5hYmxlKQoreworCWlmIChlbmFibGUpIHsKKwkJLyogZGlzYWJsZSBkeW5hbWljIFBTIHdoZW4gcmVxdWVzdGVkIGJ5IHRoZSBmaXJtd2FyZSAqLworCQlpZWVlODAyMTFfZGlzYWJsZV9keW5fcHMod2wtPnZpZik7CisJCXNldF9iaXQoV0wxMjcxX0ZMQUdfU09GVF9HRU1JTkksICZ3bC0+ZmxhZ3MpOworCX0gZWxzZSB7CisJCWllZWU4MDIxMV9lbmFibGVfZHluX3BzKHdsLT52aWYpOworCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfU09GVF9HRU1JTkksICZ3bC0+ZmxhZ3MpOworCQl3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyh3bCk7CisJfQorCit9CisKIHN0YXRpYyB2b2lkIHdsMTI3MV9ldmVudF9tYm94X2R1bXAoc3RydWN0IGV2ZW50X21haWxib3ggKm1ib3gpCiB7CiAJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiTUJPWCBEVU1QOiIpOwpAQCAtMTgxLDYgKzIxNCw4IEBACiAJdTMyIHZlY3RvcjsKIAlib29sIGJlYWNvbl9sb3NzID0gZmFsc2U7CiAJYm9vbCBpc19hcCA9ICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKKwlib29sIGRpc2Nvbm5lY3Rfc3RhID0gZmFsc2U7CisJdW5zaWduZWQgbG9uZyBzdGFfYml0bWFwID0gMDsKIAogCXdsMTI3MV9ldmVudF9tYm94X2R1bXAobWJveCk7CiAKQEAgLTIxMSwxNCArMjQ2LDEwIEBACiAJCX0KIAl9CiAKLQkvKiBkaXNhYmxlIGR5bmFtaWMgUFMgd2hlbiByZXF1ZXN0ZWQgYnkgdGhlIGZpcm13YXJlICovCiAJaWYgKHZlY3RvciAmIFNPRlRfR0VNSU5JX1NFTlNFX0VWRU5UX0lEICYmCi0JICAgIHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKSB7Ci0JCWlmIChtYm94LT5zb2Z0X2dlbWluaV9zZW5zZV9pbmZvKQotCQkJaWVlZTgwMjExX2Rpc2FibGVfZHluX3BzKHdsLT52aWYpOwotCQllbHNlCi0JCQlpZWVlODAyMTFfZW5hYmxlX2R5bl9wcyh3bC0+dmlmKTsKLQl9CisJICAgIHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKQorCQl3bDEyeHhfZXZlbnRfc29mdF9nZW1pbmlfc2Vuc2Uod2wsCisJCQkJCSAgICAgICBtYm94LT5zb2Z0X2dlbWluaV9zZW5zZV9pbmZvKTsKIAogCS8qCiAJICogVGhlIEJTU19MT1NFX0VWRU5UX0lEIGlzIG9ubHkgbmVlZGVkIHdoaWxlIHBzbSAoYW5kIGhlbmNlIGJlYWNvbgpAQCAtMjUyLDEyICsyODMsNjAgQEAKIAkJCXdsMTI3MV9ldmVudF9yc3NpX3RyaWdnZXIod2wsIG1ib3gpOwogCX0KIAorCWlmICgodmVjdG9yICYgQkFfU0VTU0lPTl9SWF9DT05TVFJBSU5UX0VWRU5UX0lEKSAmJiAhaXNfYXApIHsKKwkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiQkFfU0VTU0lPTl9SWF9DT05TVFJBSU5UX0VWRU5UX0lELiAiCisJCQkgICAgICJiYV9hbGxvd2VkID0gMHgleCIsIG1ib3gtPmJhX2FsbG93ZWQpOworCisJCWlmICh3bC0+dmlmKQorCQkJd2wxMjcxX3N0b3BfYmFfZXZlbnQod2wsIG1ib3gtPmJhX2FsbG93ZWQpOworCX0KKwogCWlmICgodmVjdG9yICYgRFVNTVlfUEFDS0VUX0VWRU5UX0lEKSAmJiAhaXNfYXApIHsKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiRFVNTVlfUEFDS0VUX0lEX0VWRU5UX0lEIik7CiAJCWlmICh3bC0+dmlmKQogCQkJd2wxMjcxX3R4X2R1bW15X3BhY2tldCh3bCk7CiAJfQogCisJLyoKKwkgKiAiVFggcmV0cmllcyBleGNlZWRlZCIgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgYWNjb3JkaW5nIHRvIG1vZGUuCisJICogSW4gQVAgbW9kZSB0aGUgb2ZmZW5kaW5nIHN0YXRpb24gaXMgZGlzY29ubmVjdGVkLgorCSAqLworCWlmICgodmVjdG9yICYgTUFYX1RYX1JFVFJZX0VWRU5UX0lEKSAmJiBpc19hcCkgeworCQl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJNQVhfVFhfUkVUUllfRVZFTlRfSUQiKTsKKwkJc3RhX2JpdG1hcCB8PSBsZTE2X3RvX2NwdShtYm94LT5zdGFfdHhfcmV0cnlfZXhjZWVkZWQpOworCQlkaXNjb25uZWN0X3N0YSA9IHRydWU7CisJfQorCisJaWYgKCh2ZWN0b3IgJiBJTkFDVElWRV9TVEFfRVZFTlRfSUQpICYmIGlzX2FwKSB7CisJCXdsMTI3MV9kZWJ1ZyhERUJVR19FVkVOVCwgIklOQUNUSVZFX1NUQV9FVkVOVF9JRCIpOworCQlzdGFfYml0bWFwIHw9IGxlMTZfdG9fY3B1KG1ib3gtPnN0YV9hZ2luZ19zdGF0dXMpOworCQlkaXNjb25uZWN0X3N0YSA9IHRydWU7CisJfQorCisJaWYgKGlzX2FwICYmIGRpc2Nvbm5lY3Rfc3RhKSB7CisJCXUzMiBudW1fcGFja2V0cyA9IHdsLT5jb25mLnR4Lm1heF90eF9yZXRyaWVzOworCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOworCQljb25zdCB1OCAqYWRkcjsKKwkJaW50IGg7CisKKwkJZm9yIChoID0gZmluZF9maXJzdF9iaXQoJnN0YV9iaXRtYXAsIEFQX01BWF9MSU5LUyk7CisJCSAgICAgaCA8IEFQX01BWF9MSU5LUzsKKwkJICAgICBoID0gZmluZF9uZXh0X2JpdCgmc3RhX2JpdG1hcCwgQVBfTUFYX0xJTktTLCBoKzEpKSB7CisJCQlpZiAoIXdsMTI3MV9pc19hY3RpdmVfc3RhKHdsLCBoKSkKKwkJCQljb250aW51ZTsKKworCQkJYWRkciA9IHdsLT5saW5rc1toXS5hZGRyOworCisJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEod2wtPnZpZiwgYWRkcik7CisJCQlpZiAoc3RhKSB7CisJCQkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAicmVtb3ZlIHN0YSAlZCIsIGgpOworCQkJCWllZWU4MDIxMV9yZXBvcnRfbG93X2FjayhzdGEsIG51bV9wYWNrZXRzKTsKKwkJCX0KKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQl9CisJfQorCiAJaWYgKHdsLT52aWYgJiYgYmVhY29uX2xvc3MpCiAJCWllZWU4MDIxMV9jb25uZWN0aW9uX2xvc3Mod2wtPnZpZik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ldmVudC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2V2ZW50LmgKaW5kZXggYjZjZjA2ZS4uZTUyNGFkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2V2ZW50LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2V2ZW50LmgKQEAgLTU4LDIwICs1OCwyMyBAQAogCUNIQU5ORUxfU1dJVENIX0NPTVBMRVRFX0VWRU5UX0lECSA9IEJJVCgxNyksCiAJQlNTX0xPU0VfRVZFTlRfSUQJCQkgPSBCSVQoMTgpLAogCVJFR0FJTkVEX0JTU19FVkVOVF9JRAkJCSA9IEJJVCgxOSksCi0JUk9BTUlOR19UUklHR0VSX01BWF9UWF9SRVRSWV9FVkVOVF9JRAkgPSBCSVQoMjApLAorCU1BWF9UWF9SRVRSWV9FVkVOVF9JRAkJCSA9IEJJVCgyMCksCiAJLyogU1RBOiBkdW1teSBwYWtldCBmb3IgZHluYW1pYyBtZW0gYmxvY2tzICovCiAJRFVNTVlfUEFDS0VUX0VWRU5UX0lEICAgICAgICAgICAgICAgICAgICA9IEJJVCgyMSksCiAJLyogQVA6IFNUQSByZW1vdmUgY29tcGxldGUgKi8KIAlTVEFfUkVNT1ZFX0NPTVBMRVRFX0VWRU5UX0lEICAgICAgICAgICAgID0gQklUKDIxKSwKIAlTT0ZUX0dFTUlOSV9TRU5TRV9FVkVOVF9JRAkJID0gQklUKDIyKSwKKwkvKiBTVEE6IFNHIHByZWRpY3Rpb24gKi8KIAlTT0ZUX0dFTUlOSV9QUkVESUNUSU9OX0VWRU5UX0lECQkgPSBCSVQoMjMpLAorCS8qIEFQOiBJbmFjdGl2ZSBTVEEgKi8KKwlJTkFDVElWRV9TVEFfRVZFTlRfSUQJCQkgPSBCSVQoMjMpLAogCVNPRlRfR0VNSU5JX0FWQUxBTkNIRV9FVkVOVF9JRAkJID0gQklUKDI0KSwKIAlQTFRfUlhfQ0FMSUJSQVRJT05fQ09NUExFVEVfRVZFTlRfSUQJID0gQklUKDI1KSwKIAlEQkdfRVZFTlRfSUQJCQkJID0gQklUKDI2KSwKIAlIRUFMVEhfQ0hFQ0tfUkVQTFlfRVZFTlRfSUQJCSA9IEJJVCgyNyksCiAJUEVSSU9ESUNfU0NBTl9DT01QTEVURV9FVkVOVF9JRAkJID0gQklUKDI4KSwKIAlQRVJJT0RJQ19TQ0FOX1JFUE9SVF9FVkVOVF9JRAkJID0gQklUKDI5KSwKLQlCQV9TRVNTSU9OX1RFQVJfRE9XTl9FVkVOVF9JRAkJID0gQklUKDMwKSwKKwlCQV9TRVNTSU9OX1JYX0NPTlNUUkFJTlRfRVZFTlRfSUQJID0gQklUKDMwKSwKIAlFVkVOVF9NQk9YX0FMTF9FVkVOVF9JRAkJCSA9IDB4N2ZmZmZmZmYsCiB9OwogCkBAIC0xMTksMTAgKzEyMiwyNyBAQAogCiAJLyogQVAgRlcgb25seSAqLwogCXU4IGhsaWRfcmVtb3ZlZDsKKworCS8qIGEgYml0bWFwIG9mIGhsaWRzIGZvciBzdGF0aW9ucyB0aGF0IGhhdmUgYmVlbiBpbmFjdGl2ZSB0b28gbG9uZyAqLwogCV9fbGUxNiBzdGFfYWdpbmdfc3RhdHVzOworCisJLyogYSBiaXRtYXAgb2YgaGxpZHMgZm9yIHN0YXRpb25zIHdoaWNoIGRpZG4ndCByZXNwb25kIHRvIFRYICovCiAJX19sZTE2IHN0YV90eF9yZXRyeV9leGNlZWRlZDsKIAotCXU4IHJlc2VydmVkXzVbMjRdOworCS8qCisJICogQml0bWFwLCBFYWNoIGJpdCBzZXQgcmVwcmVzZW50cyB0aGUgUm9sZSBJRCBmb3Igd2hpY2ggdGhpcyBjb25zdHJhaW50CisJICogaXMgc2V0LiBSYW5nZTogMCAtIEZGLCBGRiBtZWFucyBBTlkgcm9sZQorCSAqLworCXU4IGJhX3JvbGVfaWQ7CisJLyoKKwkgKiBCaXRtYXAsIEVhY2ggYml0IHNldCByZXByZXNlbnRzIHRoZSBMaW5rIElEIGZvciB3aGljaCB0aGlzIGNvbnN0cmFpbnQKKwkgKiBpcyBzZXQuIE5vdCBhcHBsaWNhYmxlIGlmIGJhX3JvbGVfaWQgaXMgc2V0IHRvIEFOWSByb2xlIChGRikuCisJICogUmFuZ2U6IDAgLSBGRkZGLCBGRkZGIG1lYW5zIEFOWSBsaW5rIGluIHRoYXQgcm9sZQorCSAqLworCXU4IGJhX2xpbmtfaWQ7CisJdTggYmFfYWxsb3dlZDsKKworCXU4IHJlc2VydmVkXzVbMjFdOwogfSBfX3BhY2tlZDsKIAogaW50IHdsMTI3MV9ldmVudF91bm1hc2soc3RydWN0IHdsMTI3MSAqd2wpOwpAQCAtMTMwLDQgKzE1MCw3IEBACiBpbnQgd2wxMjcxX2V2ZW50X2hhbmRsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggbWJveCk7CiB2b2lkIHdsMTI3MV9wc3BvbGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCisvKiBGdW5jdGlvbnMgZnJvbSBtYWluLmMgKi8KK2Jvb2wgd2wxMjcxX2lzX2FjdGl2ZV9zdGEoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGhsaWQpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pbmkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pbmkuaAppbmRleCAxNDIwYzg0Li40Y2Y5ZWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW5pLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2luaS5oCkBAIC0yNCw2ICsyNCw5IEBACiAjaWZuZGVmIF9fSU5JX0hfXwogI2RlZmluZSBfX0lOSV9IX18KIAorI2RlZmluZSBHRU5FUkFMX1NFVFRJTkdTX0RSUFdfTFBEIDB4YzAKKyNkZWZpbmUgU0NSQVRDSF9FTkFCTEVfTFBEICAgICAgICBCSVQoMjUpCisKICNkZWZpbmUgV0wxMjcxX0lOSV9NQVhfU01BUlRfUkVGTEVYX1BBUkFNIDE2CiAKIHN0cnVjdCB3bDEyNzFfaW5pX2dlbmVyYWxfcGFyYW1zIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pbml0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW5pdC5jCmluZGV4IGE4ZjRmMTUuLmMzZTlhMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2luaXQuYwpAQCAtMzIxLDYgKzMyMSwyMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHdsMTJ4eF9pbml0X2Z3bG9nKHN0cnVjdCB3bDEyNzEgKndsKQoreworCWludCByZXQ7CisKKwlpZiAod2wtPnF1aXJrcyAmIFdMMTJYWF9RVUlSS19GV0xPR19OT1RfSU1QTEVNRU5URUQpCisJCXJldHVybiAwOworCisJcmV0ID0gd2wxMnh4X2NtZF9jb25maWdfZndsb2cod2wpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgd2wxMjcxX3N0YV9od19pbml0KHN0cnVjdCB3bDEyNzEgKndsKQogewogCWludCByZXQ7CkBAIC0zODIsNiArMzk2LDExIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKKwkvKiBDb25maWd1cmUgdGhlIEZXIGxvZ2dlciAqLworCXJldCA9IHdsMTJ4eF9pbml0X2Z3bG9nKHdsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCXJldHVybiAwOwogfQogCkBAIC00MjgsNyArNDQ3LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHdsMTI3MV9hY3hfbWF4X3R4X3JldHJ5KHdsKTsKKwlyZXQgPSB3bDEyNzFfYWN4X2FwX21heF90eF9yZXRyeSh3bCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTQzNiw2ICs0NTUsMTEgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAorCS8qIGluaXRpYWxpemUgVHggcG93ZXIgKi8KKwlyZXQgPSB3bDEyNzFfYWN4X3R4X3Bvd2VyKHdsLCB3bC0+cG93ZXJfbGV2ZWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU0MSw2ICs1NjUsNyBAQAogCiAJLyogUmVzZXQgdGhlIEJBIFJYIGluZGljYXRvcnMgKi8KIAl3bC0+YmFfcnhfYml0bWFwID0gMDsKKwl3bC0+YmFfYWxsb3dlZCA9IHRydWU7CiAKIAkvKiB2YWxpZGF0ZSB0aGF0IEZXIHN1cHBvcnQgQkEgKi8KIAl3bDEyNzFfY2hlY2tfYmFfc3VwcG9ydCh3bCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pby5jCmluZGV4IGRhNWMxYWQuLmMyZGE2NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pby5jCkBAIC0yMyw3ICsyMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jcmM3Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAjaW5jbHVkZSAid2wxMnh4LmgiCkBAIC0xMjgsMTIgKzEyNywxNCBAQAogCiB2b2lkIHdsMTI3MV9pb19yZXNldChzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKLQl3bC0+aWZfb3BzLT5yZXNldCh3bCk7CisJaWYgKHdsLT5pZl9vcHMtPnJlc2V0KQorCQl3bC0+aWZfb3BzLT5yZXNldCh3bCk7CiB9CiAKIHZvaWQgd2wxMjcxX2lvX2luaXQoc3RydWN0IHdsMTI3MSAqd2wpCiB7Ci0Jd2wtPmlmX29wcy0+aW5pdCh3bCk7CisJaWYgKHdsLT5pZl9vcHMtPmluaXQpCisJCXdsLT5pZl9vcHMtPmluaXQod2wpOwogfQogCiB2b2lkIHdsMTI3MV90b3BfcmVnX3dyaXRlKHN0cnVjdCB3bDEyNzEgKndsLCBpbnQgYWRkciwgdTE2IHZhbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2lvLmgKaW5kZXggYmVlZDYyMS4uYTJmZTRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2lvLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2lvLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpZm5kZWYgX19JT19IX18KICNkZWZpbmUgX19JT19IX18KIAorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogI2luY2x1ZGUgInJlZy5oIgogCiAjZGVmaW5lIEhXX0FDQ0VTU19NRU1PUllfTUFYX1JBTkdFCTB4MUZGQzAKQEAgLTEyOCw2ICsxMjksMjAgQEAKIAl3bDEyNzFfcmF3X3dyaXRlKHdsLCBwaHlzaWNhbCwgYnVmLCBsZW4sIGZpeGVkKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHdsMTI3MV9yZWFkX2h3YWRkcihzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGh3YWRkciwKKwkJCQkgICAgICB2b2lkICpidWYsIHNpemVfdCBsZW4sIGJvb2wgZml4ZWQpCit7CisJaW50IHBoeXNpY2FsOworCWludCBhZGRyOworCisJLyogQWRkcmVzc2VzIGFyZSBzdG9yZWQgaW50ZXJuYWxseSBhcyBhZGRyZXNzZXMgdG8gMzIgYnl0ZXMgYmxvY2tzICovCisJYWRkciA9IGh3YWRkciA8PCA1OworCisJcGh5c2ljYWwgPSB3bDEyNzFfdHJhbnNsYXRlX2FkZHIod2wsIGFkZHIpOworCisJd2wxMjcxX3Jhd19yZWFkKHdsLCBwaHlzaWNhbCwgYnVmLCBsZW4sIGZpeGVkKTsKK30KKwogc3RhdGljIGlubGluZSB1MzIgd2wxMjcxX3JlYWQzMihzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIpCiB7CiAJcmV0dXJuIHdsMTI3MV9yYXdfcmVhZDMyKHdsLCB3bDEyNzFfdHJhbnNsYXRlX2FkZHIod2wsIGFkZHIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvbWFpbi5jCmluZGV4IGU2NDk3ZGMuLmU1OGMyMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L21haW4uYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93bDEyeHguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSAid2wxMnh4LmgiCiAjaW5jbHVkZSAid2wxMnh4XzgwMjExLmgiCkBAIC0yMDksNyArMjEwLDggQEAKIAkJCQkudHhfb3BfbGltaXQgPSAxNTA0LAogCQkJfSwKIAkJfSwKLQkJLmFwX21heF90eF9yZXRyaWVzID0gMTAwLAorCQkubWF4X3R4X3JldHJpZXMgPSAxMDAsCisJCS5hcF9hZ2luZ19wZXJpb2QgPSAzMDAsCiAJCS50aWRfY29uZl9jb3VudCA9IDQsCiAJCS50aWRfY29uZiA9IHsKIAkJCVtDT05GX1RYX0FDX0JFXSA9IHsKQEAgLTM2Miw5ICszNjQsMjUgQEAKIAkJLmZtX2Rpc3R1cmJlZF9iYW5kX21hcmdpbiAgICAgPSAweGZmLCAgICAgICAvKiBkZWZhdWx0ICovCiAJCS5zd2FsbG93X2Nsa19kaWZmICAgICAgICAgICAgID0gMHhmZiwgICAgICAgLyogZGVmYXVsdCAqLwogCX0sCisJLnJ4X3N0cmVhbWluZyA9IHsKKwkJLmR1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgID0gMTUwLAorCQkucXVldWVzICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEsCisJCS5pbnRlcnZhbCAgICAgICAgICAgICAgICAgICAgICA9IDIwLAorCQkuYWx3YXlzICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCX0sCisJLmZ3bG9nID0geworCQkubW9kZSAgICAgICAgICAgICAgICAgICAgICAgICA9IFdMMTJYWF9GV0xPR19PTl9ERU1BTkQsCisJCS5tZW1fYmxvY2tzICAgICAgICAgICAgICAgICAgID0gMiwKKwkJLnNldmVyaXR5ICAgICAgICAgICAgICAgICAgICAgPSAwLAorCQkudGltZXN0YW1wICAgICAgICAgICAgICAgICAgICA9IFdMMTJYWF9GV0xPR19USU1FU1RBTVBfRElTQUJMRUQsCisJCS5vdXRwdXQgICAgICAgICAgICAgICAgICAgICAgID0gV0wxMlhYX0ZXTE9HX09VVFBVVF9IT1NULAorCQkudGhyZXNob2xkICAgICAgICAgICAgICAgICAgICA9IDAsCisJfSwKIAkuaGNpX2lvX2RzID0gSENJX0lPX0RTXzZNQSwKIH07CiAKK3N0YXRpYyBjaGFyICpmd2xvZ19wYXJhbTsKKwogc3RhdGljIHZvaWQgX193bDEyNzFfb3BfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3Qgd2wxMjcxICp3bCwKIAkJCQkJIGJvb2wgcmVzZXRfdHhfcXVldWVzKTsKIHN0YXRpYyB2b2lkIHdsMTI3MV9mcmVlX2FwX2tleXMoc3RydWN0IHdsMTI3MSAqd2wpOwpAQCAtMzg4LDYgKzQwNiwyMiBAQAogc3RhdGljIERFRklORV9NVVRFWCh3bF9saXN0X211dGV4KTsKIHN0YXRpYyBMSVNUX0hFQUQod2xfbGlzdCk7CiAKK3N0YXRpYyBpbnQgd2wxMjcxX2NoZWNrX29wZXJzdGF0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwgdW5zaWduZWQgY2hhciBvcGVyc3RhdGUpCit7CisJaW50IHJldDsKKwlpZiAob3BlcnN0YXRlICE9IElGX09QRVJfVVApCisJCXJldHVybiAwOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoV0wxMjcxX0ZMQUdfU1RBX1NUQVRFX1NFTlQsICZ3bC0+ZmxhZ3MpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHdsMTI3MV9jbWRfc2V0X3N0YV9zdGF0ZSh3bCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl3bDEyNzFfaW5mbygiQXNzb2NpYXRpb24gY29tcGxldGVkLiIpOworCXJldHVybiAwOworfQogc3RhdGljIGludCB3bDEyNzFfZGV2X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm1lLCB1bnNpZ25lZCBsb25nIHdoYXQsCiAJCQkgICAgIHZvaWQgKmFyZykKIHsKQEAgLTQzNywxMSArNDcxLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlpZiAoKGRldi0+b3BlcnN0YXRlID09IElGX09QRVJfVVApICYmCi0JICAgICF0ZXN0X2FuZF9zZXRfYml0KFdMMTI3MV9GTEFHX1NUQV9TVEFURV9TRU5ULCAmd2wtPmZsYWdzKSkgewotCQl3bDEyNzFfY21kX3NldF9zdGFfc3RhdGUod2wpOwotCQl3bDEyNzFfaW5mbygiQXNzb2NpYXRpb24gY29tcGxldGVkLiIpOwotCX0KKwl3bDEyNzFfY2hlY2tfb3BlcnN0YXRlKHdsLCBkZXYtPm9wZXJzdGF0ZSk7CiAKIAl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKIApAQCAtNDczLDYgKzUwMywxMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldCA9IDA7CisKKwkvKiB3ZSBzaG91bGQgaG9sZCB3bC0+bXV0ZXggKi8KKwlyZXQgPSB3bDEyNzFfYWN4X3BzX3J4X3N0cmVhbWluZyh3bCwgZW5hYmxlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZW5hYmxlKQorCQlzZXRfYml0KFdMMTI3MV9GTEFHX1JYX1NUUkVBTUlOR19TVEFSVEVELCAmd2wtPmZsYWdzKTsKKwllbHNlCisJCWNsZWFyX2JpdChXTDEyNzFfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsLT5mbGFncyk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIHdoZW4gdGhlIHJ4X3N0cmVhbWluZyBpbnRlcnZhbAorICogaGFzIGJlZWQgY2hhbmdlZCBvciByeF9zdHJlYW1pbmcgc2hvdWxkIGJlIGRpc2FibGVkCisgKi8KK2ludCB3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcGVyaW9kID0gd2wtPmNvbmYucnhfc3RyZWFtaW5nLmludGVydmFsOworCisJLyogZG9uJ3QgcmVjb25maWd1cmUgaWYgcnhfc3RyZWFtaW5nIGlzIGRpc2FibGVkICovCisJaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsLT5mbGFncykpCisJCWdvdG8gb3V0OworCisJLyogcmVjb25maWd1cmUvZGlzYWJsZSBhY2NvcmRpbmcgdG8gbmV3IHN0cmVhbWluZ19wZXJpb2QgKi8KKwlpZiAocGVyaW9kICYmCisJICAgIHRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSAmJgorCSAgICAod2wtPmNvbmYucnhfc3RyZWFtaW5nLmFsd2F5cyB8fAorCSAgICAgdGVzdF9iaXQoV0wxMjcxX0ZMQUdfU09GVF9HRU1JTkksICZ3bC0+ZmxhZ3MpKSkKKwkJcmV0ID0gd2wxMjcxX3NldF9yeF9zdHJlYW1pbmcod2wsIHRydWUpOworCWVsc2UgeworCQlyZXQgPSB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyh3bCwgZmFsc2UpOworCQkvKiBkb24ndCBjYW5jZWxfd29ya19zeW5jIHNpbmNlIHdlIG1pZ2h0IGRlYWRsb2NrICovCisJCWRlbF90aW1lcl9zeW5jKCZ3bC0+cnhfc3RyZWFtaW5nX3RpbWVyKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgd2wxMjcxX3J4X3N0cmVhbWluZ19lbmFibGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgd2wxMjcxICp3bCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2wxMjcxLCByeF9zdHJlYW1pbmdfZW5hYmxlX3dvcmspOworCisJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKKworCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsLT5mbGFncykgfHwKKwkgICAgIXRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSB8fAorCSAgICAoIXdsLT5jb25mLnJ4X3N0cmVhbWluZy5hbHdheXMgJiYKKwkgICAgICF0ZXN0X2JpdChXTDEyNzFfRkxBR19TT0ZUX0dFTUlOSSwgJndsLT5mbGFncykpKQorCQlnb3RvIG91dDsKKworCWlmICghd2wtPmNvbmYucnhfc3RyZWFtaW5nLmludGVydmFsKQorCQlnb3RvIG91dDsKKworCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyh3bCwgdHJ1ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X3NsZWVwOworCisJLyogc3RvcCBpdCBhZnRlciBzb21lIHRpbWUgb2YgaW5hY3Rpdml0eSAqLworCW1vZF90aW1lcigmd2wtPnJ4X3N0cmVhbWluZ190aW1lciwKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh3bC0+Y29uZi5yeF9zdHJlYW1pbmcuZHVyYXRpb24pKTsKKworb3V0X3NsZWVwOgorCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOworb3V0OgorCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgd2wxMjcxX3J4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCByZXQ7CisJc3RydWN0IHdsMTI3MSAqd2wgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHdsMTI3MSwgcnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yayk7CisKKwltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCisJaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsLT5mbGFncykpCisJCWdvdG8gb3V0OworCisJcmV0ID0gd2wxMjcxX3BzX2VscF93YWtldXAod2wpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IHdsMTI3MV9zZXRfcnhfc3RyZWFtaW5nKHdsLCBmYWxzZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfc2xlZXA7CisKK291dF9zbGVlcDoKKwl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKK291dDoKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHdsMTI3MV9yeF9zdHJlYW1pbmdfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB3bDEyNzEgKndsID0gKHN0cnVjdCB3bDEyNzEgKilkYXRhOworCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywgJndsLT5yeF9zdHJlYW1pbmdfZGlzYWJsZV93b3JrKTsKK30KKwogc3RhdGljIHZvaWQgd2wxMjcxX2NvbmZfaW5pdChzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIApAQCAtNDg4LDggKzYyOSwyNCBAQAogCiAJLyogYXBwbHkgZHJpdmVyIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLwogCW1lbWNweSgmd2wtPmNvbmYsICZkZWZhdWx0X2NvbmYsIHNpemVvZihkZWZhdWx0X2NvbmYpKTsKLX0KIAorCS8qIEFkanVzdCBzZXR0aW5ncyBhY2NvcmRpbmcgdG8gb3B0aW9uYWwgbW9kdWxlIHBhcmFtZXRlcnMgKi8KKwlpZiAoZndsb2dfcGFyYW0pIHsKKwkJaWYgKCFzdHJjbXAoZndsb2dfcGFyYW0sICJjb250aW51b3VzIikpIHsKKwkJCXdsLT5jb25mLmZ3bG9nLm1vZGUgPSBXTDEyWFhfRldMT0dfQ09OVElOVU9VUzsKKwkJfSBlbHNlIGlmICghc3RyY21wKGZ3bG9nX3BhcmFtLCAib25kZW1hbmQiKSkgeworCQkJd2wtPmNvbmYuZndsb2cubW9kZSA9IFdMMTJYWF9GV0xPR19PTl9ERU1BTkQ7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChmd2xvZ19wYXJhbSwgImRiZ3BpbnMiKSkgeworCQkJd2wtPmNvbmYuZndsb2cubW9kZSA9IFdMMTJYWF9GV0xPR19DT05USU5VT1VTOworCQkJd2wtPmNvbmYuZndsb2cub3V0cHV0ID0gV0wxMlhYX0ZXTE9HX09VVFBVVF9EQkdfUElOUzsKKwkJfSBlbHNlIGlmICghc3RyY21wKGZ3bG9nX3BhcmFtLCAiZGlzYWJsZSIpKSB7CisJCQl3bC0+Y29uZi5md2xvZy5tZW1fYmxvY2tzID0gMDsKKwkJCXdsLT5jb25mLmZ3bG9nLm91dHB1dCA9IFdMMTJYWF9GV0xPR19PVVRQVVRfTk9ORTsKKwkJfSBlbHNlIHsKKwkJCXdsMTI3MV9lcnJvcigiVW5rbm93biBmd2xvZyBwYXJhbWV0ZXIgJXMiLCBmd2xvZ19wYXJhbSk7CisJCX0KKwl9Cit9CiAKIHN0YXRpYyBpbnQgd2wxMjcxX3BsdF9pbml0KHN0cnVjdCB3bDEyNzEgKndsKQogewpAQCAtNjY3LDEzICs4MjQsMjQgQEAKIAl9CiB9CiAKK3N0YXRpYyB1MzIgd2wxMjcxX3R4X2FsbG9jYXRlZF9ibG9ja3Moc3RydWN0IHdsMTI3MSAqd2wpCit7CisJaW50IGk7CisJdTMyIHRvdGFsX2FsbG9jX2Jsb2NrcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKQorCQl0b3RhbF9hbGxvY19ibG9ja3MgKz0gd2wtPnR4X2FsbG9jYXRlZF9ibG9ja3NbaV07CisKKwlyZXR1cm4gdG90YWxfYWxsb2NfYmxvY2tzOworfQorCiBzdGF0aWMgdm9pZCB3bDEyNzFfZndfc3RhdHVzKHN0cnVjdCB3bDEyNzEgKndsLAogCQkJICAgICBzdHJ1Y3Qgd2wxMjcxX2Z3X2Z1bGxfc3RhdHVzICpmdWxsX3N0YXR1cykKIHsKIAlzdHJ1Y3Qgd2wxMjcxX2Z3X2NvbW1vbl9zdGF0dXMgKnN0YXR1cyA9ICZmdWxsX3N0YXR1cy0+Y29tbW9uOwogCXN0cnVjdCB0aW1lc3BlYyB0czsKIAl1MzIgb2xkX3R4X2Jsa19jb3VudCA9IHdsLT50eF9ibG9ja3NfYXZhaWxhYmxlOwotCXUzMiBmcmVlZF9ibG9ja3MgPSAwOworCXUzMiBmcmVlZF9ibG9ja3MgPSAwLCBhY19mcmVlZF9ibG9ja3M7CiAJaW50IGk7CiAKIAlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykgewpAQCAtNjkzLDIxICs4NjEsMjMgQEAKIAogCS8qIHVwZGF0ZSBudW1iZXIgb2YgYXZhaWxhYmxlIFRYIGJsb2NrcyAqLwogCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpKyspIHsKLQkJZnJlZWRfYmxvY2tzICs9IGxlMzJfdG9fY3B1KHN0YXR1cy0+dHhfcmVsZWFzZWRfYmxrc1tpXSkgLQotCQkJCXdsLT50eF9ibG9ja3NfZnJlZWRbaV07CisJCWFjX2ZyZWVkX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KHN0YXR1cy0+dHhfcmVsZWFzZWRfYmxrc1tpXSkgLQorCQkJCSAgd2wtPnR4X2Jsb2Nrc19mcmVlZFtpXTsKKwkJZnJlZWRfYmxvY2tzICs9IGFjX2ZyZWVkX2Jsb2NrczsKKworCQl3bC0+dHhfYWxsb2NhdGVkX2Jsb2Nrc1tpXSAtPSBhY19mcmVlZF9ibG9ja3M7CiAKIAkJd2wtPnR4X2Jsb2Nrc19mcmVlZFtpXSA9CiAJCQlsZTMyX3RvX2NwdShzdGF0dXMtPnR4X3JlbGVhc2VkX2Jsa3NbaV0pOwogCX0KIAotCXdsLT50eF9hbGxvY2F0ZWRfYmxvY2tzIC09IGZyZWVkX2Jsb2NrczsKLQogCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKSB7CiAJCS8qIFVwZGF0ZSBudW0gb2YgYWxsb2NhdGVkIFRYIGJsb2NrcyBwZXIgbGluayBhbmQgcHMgc3RhdHVzICovCiAJCXdsMTI3MV9pcnFfdXBkYXRlX2xpbmtzX3N0YXR1cyh3bCwgJmZ1bGxfc3RhdHVzLT5hcCk7CiAJCXdsLT50eF9ibG9ja3NfYXZhaWxhYmxlICs9IGZyZWVkX2Jsb2NrczsKIAl9IGVsc2UgewotCQlpbnQgYXZhaWwgPSBmdWxsX3N0YXR1cy0+c3RhLnR4X3RvdGFsIC0gd2wtPnR4X2FsbG9jYXRlZF9ibG9ja3M7CisJCWludCBhdmFpbCA9IGZ1bGxfc3RhdHVzLT5zdGEudHhfdG90YWwgLQorCQkJICAgIHdsMTI3MV90eF9hbGxvY2F0ZWRfYmxvY2tzKHdsKTsKIAogCQkvKgogCQkgKiBUaGUgRlcgbWlnaHQgY2hhbmdlIHRoZSB0b3RhbCBudW1iZXIgb2YgVFggbWVtYmxvY2tzIGJlZm9yZQpAQCAtNzQxLDcgKzkxMSw3IEBACiAKIAkvKiBSZXR1cm4gc2VudCBza2JzIHRvIHRoZSBuZXR3b3JrIHN0YWNrICovCiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmd2wtPmRlZmVycmVkX3R4X3F1ZXVlKSkpCi0JCWllZWU4MDIxMV90eF9zdGF0dXMod2wtPmh3LCBza2IpOworCQlpZWVlODAyMTFfdHhfc3RhdHVzX25pKHdsLT5odywgc2tiKTsKIH0KIAogc3RhdGljIHZvaWQgd2wxMjcxX25ldHN0YWNrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtODA4LDcgKzk3OCw3IEBACiAJCWlmICh1bmxpa2VseShpbnRyICYgV0wxMjcxX0FDWF9JTlRSX1dBVENIRE9HKSkgewogCQkJd2wxMjcxX2Vycm9yKCJ3YXRjaGRvZyBpbnRlcnJ1cHQgcmVjZWl2ZWQhICIKIAkJCQkgICAgICJzdGFydGluZyByZWNvdmVyeS4iKTsKLQkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywgJndsLT5yZWNvdmVyeV93b3JrKTsKKwkJCXdsMTJ4eF9xdWV1ZV9yZWNvdmVyeV93b3JrKHdsKTsKIAogCQkJLyogcmVzdGFydGluZyB0aGUgY2hpcC4gaWdub3JlIGFueSBvdGhlciBpbnRlcnJ1cHQuICovCiAJCQlnb3RvIG91dDsKQEAgLTgyMiw3ICs5OTIsNyBAQAogCQkJLyogQ2hlY2sgaWYgYW55IHR4IGJsb2NrcyB3ZXJlIGZyZWVkICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKIAkJCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfRldfVFhfQlVTWSwgJndsLT5mbGFncykgJiYKLQkJCSAgICB3bC0+dHhfcXVldWVfY291bnQpIHsKKwkJCSAgICB3bDEyNzFfdHhfdG90YWxfcXVldWVfY291bnQod2wpID4gMCkgewogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsLT53bF9sb2NrLCBmbGFncyk7CiAJCQkJLyoKIAkJCQkgKiBJbiBvcmRlciB0byBhdm9pZCBzdGFydmF0aW9uIG9mIHRoZSBUWCBwYXRoLApAQCAtODcwLDcgKzEwNDAsNyBAQAogCS8qIEluIGNhc2UgVFggd2FzIG5vdCBoYW5kbGVkIGhlcmUsIHF1ZXVlIFRYIHdvcmsgKi8KIAljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfVFhfUEVORElORywgJndsLT5mbGFncyk7CiAJaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19GV19UWF9CVVNZLCAmd2wtPmZsYWdzKSAmJgotCSAgICB3bC0+dHhfcXVldWVfY291bnQpCisJICAgIHdsMTI3MV90eF90b3RhbF9xdWV1ZV9jb3VudCh3bCkgPiAwKQogCQlpZWVlODAyMTFfcXVldWVfd29yayh3bC0+aHcsICZ3bC0+dHhfd29yayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKIApAQCAtOTcwLDYgKzExNDAsODkgQEAKIAlyZXR1cm4gcmV0OwogfQogCit2b2lkIHdsMTJ4eF9xdWV1ZV9yZWNvdmVyeV93b3JrKHN0cnVjdCB3bDEyNzEgKndsKQoreworCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfUkVDT1ZFUllfSU5fUFJPR1JFU1MsICZ3bC0+ZmxhZ3MpKQorCQlpZWVlODAyMTFfcXVldWVfd29yayh3bC0+aHcsICZ3bC0+cmVjb3Zlcnlfd29yayk7Cit9CisKK3NpemVfdCB3bDEyeHhfY29weV9md2xvZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggKm1lbWJsb2NrLCBzaXplX3QgbWF4bGVuKQoreworCXNpemVfdCBsZW4gPSAwOworCisJLyogVGhlIEZXIGxvZyBpcyBhIGxlbmd0aC12YWx1ZSBsaXN0LCBmaW5kIHdoZXJlIHRoZSBsb2cgZW5kICovCisJd2hpbGUgKGxlbiA8IG1heGxlbikgeworCQlpZiAobWVtYmxvY2tbbGVuXSA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChsZW4gKyBtZW1ibG9ja1tsZW5dICsgMSA+IG1heGxlbikKKwkJCWJyZWFrOworCQlsZW4gKz0gbWVtYmxvY2tbbGVuXSArIDE7CisJfQorCisJLyogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHJvb20gKi8KKwlsZW4gPSBtaW4obGVuLCAoc2l6ZV90KShQQUdFX1NJWkUgLSB3bC0+Zndsb2dfc2l6ZSkpOworCisJLyogRmlsbCB0aGUgRlcgbG9nIGZpbGUsIGNvbnN1bWVkIGJ5IHRoZSBzeXNmcyBmd2xvZyBlbnRyeSAqLworCW1lbWNweSh3bC0+Zndsb2cgKyB3bC0+Zndsb2dfc2l6ZSwgbWVtYmxvY2ssIGxlbik7CisJd2wtPmZ3bG9nX3NpemUgKz0gbGVuOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQgd2wxMnh4X3JlYWRfZndsb2dfcGFuaWMoc3RydWN0IHdsMTI3MSAqd2wpCit7CisJdTMyIGFkZHI7CisJdTMyIGZpcnN0X2FkZHI7CisJdTggKmJsb2NrOworCisJaWYgKCh3bC0+cXVpcmtzICYgV0wxMlhYX1FVSVJLX0ZXTE9HX05PVF9JTVBMRU1FTlRFRCkgfHwKKwkgICAgKHdsLT5jb25mLmZ3bG9nLm1vZGUgIT0gV0wxMlhYX0ZXTE9HX09OX0RFTUFORCkgfHwKKwkgICAgKHdsLT5jb25mLmZ3bG9nLm1lbV9ibG9ja3MgPT0gMCkpCisJCXJldHVybjsKKworCXdsMTI3MV9pbmZvKCJSZWFkaW5nIEZXIHBhbmljIGxvZyIpOworCisJYmxvY2sgPSBrbWFsbG9jKFdMMTJYWF9IV19CTE9DS19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgY2hpcCBpcyBhd2FrZSBhbmQgdGhlIGxvZ2dlciBpc24ndCBhY3RpdmUuCisJICogVGhpcyBtaWdodCBmYWlsIGlmIHRoZSBmaXJtd2FyZSBoYW5nZWQuCisJICovCisJaWYgKCF3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCkpCisJCXdsMTJ4eF9jbWRfc3RvcF9md2xvZyh3bCk7CisKKwkvKiBSZWFkIHRoZSBmaXJzdCBtZW1vcnkgYmxvY2sgYWRkcmVzcyAqLworCXdsMTI3MV9md19zdGF0dXMod2wsIHdsLT5md19zdGF0dXMpOworCWZpcnN0X2FkZHIgPSBfX2xlMzJfdG9fY3B1KHdsLT5md19zdGF0dXMtPnN0YS5sb2dfc3RhcnRfYWRkcik7CisJaWYgKCFmaXJzdF9hZGRyKQorCQlnb3RvIG91dDsKKworCS8qIFRyYXZlcnNlIHRoZSBtZW1vcnkgYmxvY2tzIGxpbmtlZCBsaXN0ICovCisJYWRkciA9IGZpcnN0X2FkZHI7CisJZG8geworCQltZW1zZXQoYmxvY2ssIDAsIFdMMTJYWF9IV19CTE9DS19TSVpFKTsKKwkJd2wxMjcxX3JlYWRfaHdhZGRyKHdsLCBhZGRyLCBibG9jaywgV0wxMlhYX0hXX0JMT0NLX1NJWkUsCisJCQkJICAgZmFsc2UpOworCisJCS8qCisJCSAqIE1lbW9yeSBibG9ja3MgYXJlIGxpbmtlZCB0byBvbmUgYW5vdGhlci4gVGhlIGZpcnN0IDQgYnl0ZXMKKwkJICogb2YgZWFjaCBtZW1vcnkgYmxvY2sgaG9sZCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvZiB0aGUgbmV4dAorCQkgKiBvbmUuIFRoZSBsYXN0IG1lbW9yeSBibG9jayBwb2ludHMgdG8gdGhlIGZpcnN0IG9uZS4KKwkJICovCisJCWFkZHIgPSBfX2xlMzJfdG9fY3B1cCgoX19sZTMyICopYmxvY2spOworCQlpZiAoIXdsMTJ4eF9jb3B5X2Z3bG9nKHdsLCBibG9jayArIHNpemVvZihhZGRyKSwKKwkJCQkgICAgICAgV0wxMlhYX0hXX0JMT0NLX1NJWkUgLSBzaXplb2YoYWRkcikpKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoYWRkciAmJiAoYWRkciAhPSBmaXJzdF9hZGRyKSk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJndsLT5md2xvZ193YWl0cSk7CisKK291dDoKKwlrZnJlZShibG9jayk7Cit9CisKIHN0YXRpYyB2b2lkIHdsMTI3MV9yZWNvdmVyeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9CkBAIC05ODAsOSArMTIzMywyMyBAQAogCWlmICh3bC0+c3RhdGUgIT0gV0wxMjcxX1NUQVRFX09OKQogCQlnb3RvIG91dDsKIAorCS8qIEF2b2lkIGEgcmVjdXJzaXZlIHJlY292ZXJ5ICovCisJc2V0X2JpdChXTDEyNzFfRkxBR19SRUNPVkVSWV9JTl9QUk9HUkVTUywgJndsLT5mbGFncyk7CisKKwl3bDEyeHhfcmVhZF9md2xvZ19wYW5pYyh3bCk7CisKIAl3bDEyNzFfaW5mbygiSGFyZHdhcmUgcmVjb3ZlcnkgaW4gcHJvZ3Jlc3MuIEZXIHZlcjogJXMgcGM6IDB4JXgiLAogCQkgICAgd2wtPmNoaXAuZndfdmVyX3N0ciwgd2wxMjcxX3JlYWQzMih3bCwgU0NSX1BBRDQpKTsKIAorCS8qCisJICogQWR2YW5jZSBzZWN1cml0eSBzZXF1ZW5jZSBudW1iZXIgdG8gb3ZlcmNvbWUgcG90ZW50aWFsIHByb2dyZXNzCisJICogaW4gdGhlIGZpcm13YXJlIGR1cmluZyByZWNvdmVyeS4gVGhpcyBkb2Vucyd0IGh1cnQgaWYgdGhlIG5ldHdvcmsgaXMKKwkgKiBub3QgZW5jcnlwdGVkLgorCSAqLworCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoV0wxMjcxX0ZMQUdfQVBfU1RBUlRFRCwgJndsLT5mbGFncykpCisJCXdsLT50eF9zZWN1cml0eV9zZXEgKz0gV0wxMjcxX1RYX1NRTl9QT1NUX1JFQ09WRVJZX1BBRERJTkc7CisKIAlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpKQogCQlpZWVlODAyMTFfY29ubmVjdGlvbl9sb3NzKHdsLT52aWYpOwogCkBAIC05OTYsNiArMTI2Myw5IEBACiAKIAkvKiByZWJvb3QgdGhlIGNoaXBzZXQgKi8KIAlfX3dsMTI3MV9vcF9yZW1vdmVfaW50ZXJmYWNlKHdsLCBmYWxzZSk7CisKKwljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfUkVDT1ZFUllfSU5fUFJPR1JFU1MsICZ3bC0+ZmxhZ3MpOworCiAJaWVlZTgwMjExX3Jlc3RhcnRfaHcod2wtPmh3KTsKIAogCS8qCkBAIC0xMDc0LDkgKzEzNDQsMTMgQEAKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0JPT1QsICJjaGlwIGlkIDB4JXggKDEyNzEgUEcyMCkiLAogCQkJICAgICB3bC0+Y2hpcC5pZCk7CiAKLQkJLyogZW5kLW9mLXRyYW5zYWN0aW9uIGZsYWcgc2hvdWxkIGJlIHNldCBpbiB3bDEyN3ggQVAgbW9kZSAqLworCQkvKgorCQkgKiAnZW5kLW9mLXRyYW5zYWN0aW9uIGZsYWcnIGFuZCAnTFBEIG1vZGUgZmxhZycKKwkJICogc2hvdWxkIGJlIHNldCBpbiB3bDEyN3ggQVAgbW9kZSBvbmx5CisJCSAqLwogCQlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykKLQkJCXdsLT5xdWlya3MgfD0gV0wxMlhYX1FVSVJLX0VORF9PRl9UUkFOU0FDVElPTjsKKwkJCXdsLT5xdWlya3MgfD0gKFdMMTJYWF9RVUlSS19FTkRfT0ZfVFJBTlNBQ1RJT04gfAorCQkJCSAgICAgICBXTDEyWFhfUVVJUktfTFBEX01PREUpOwogCiAJCXJldCA9IHdsMTI3MV9zZXR1cCh3bCk7CiAJCWlmIChyZXQgPCAwKQpAQCAtMTA4OSw2ICsxMzYzLDcgQEAKIAkJcmV0ID0gd2wxMjcxX3NldHVwKHdsKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKKwogCQlpZiAod2wxMjcxX3NldF9ibG9ja19zaXplKHdsKSkKIAkJCXdsLT5xdWlya3MgfD0gV0wxMlhYX1FVSVJLX0JMT0NLU0laRV9BTElHTk1FTlQ7CiAJCWJyZWFrOwpAQCAtMTExNywyNCArMTM5Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCB3bDEyNzFfZ2V0X2Z3X3Zlcl9xdWlya3Moc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JdW5zaWduZWQgaW50IHF1aXJrcyA9IDA7Ci0JdW5zaWduZWQgaW50ICpmd192ZXIgPSB3bC0+Y2hpcC5md192ZXI7Ci0KLQkvKiBPbmx5IGZvciB3bDEyN3ggKi8KLQlpZiAoKGZ3X3ZlcltGV19WRVJfQ0hJUF0gPT0gRldfVkVSX0NISVBfV0wxMjdYKSAmJgotCSAgICAvKiBDaGVjayBTVEEgdmVyc2lvbiAqLwotCSAgICAoKChmd192ZXJbRldfVkVSX0lGX1RZUEVdID09IEZXX1ZFUl9JRl9UWVBFX1NUQSkgJiYKLQkgICAgICAoZndfdmVyW0ZXX1ZFUl9NSU5PUl0gPCBGV19WRVJfTUlOT1JfMV9TUEFSRV9TVEFfTUlOKSkgfHwKLQkgICAgIC8qIENoZWNrIEFQIHZlcnNpb24gKi8KLQkgICAgICgoZndfdmVyW0ZXX1ZFUl9JRl9UWVBFXSA9PSBGV19WRVJfSUZfVFlQRV9BUCkgJiYKLQkgICAgICAoZndfdmVyW0ZXX1ZFUl9NSU5PUl0gPCBGV19WRVJfTUlOT1JfMV9TUEFSRV9BUF9NSU4pKSkpCi0JCXF1aXJrcyB8PSBXTDEyWFhfUVVJUktfVVNFXzJfU1BBUkVfQkxPQ0tTOwotCi0JcmV0dXJuIHF1aXJrczsKLX0KLQogaW50IHdsMTI3MV9wbHRfc3RhcnQoc3RydWN0IHdsMTI3MSAqd2wpCiB7CiAJaW50IHJldHJpZXMgPSBXTDEyNzFfQk9PVF9SRVRSSUVTOwpAQCAtMTE3MSw4ICsxNDI4LDYgQEAKIAkJd2wxMjcxX25vdGljZSgiZmlybXdhcmUgYm9vdGVkIGluIFBMVCBtb2RlICglcykiLAogCQkJICAgICAgd2wtPmNoaXAuZndfdmVyX3N0cik7CiAKLQkJLyogQ2hlY2sgaWYgYW55IHF1aXJrcyBhcmUgbmVlZGVkIHdpdGggb2xkZXIgZncgdmVyc2lvbnMgKi8KLQkJd2wtPnF1aXJrcyB8PSB3bDEyNzFfZ2V0X2Z3X3Zlcl9xdWlya3Mod2wpOwogCQlnb3RvIG91dDsKIAogaXJxX2Rpc2FibGU6CkBAIC0xMjQyLDI2ICsxNDk3LDI3IEBACiB7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBxOworCWludCBxLCBtYXBwaW5nOwogCXU4IGhsaWQgPSAwOwogCi0JcSA9IHdsMTI3MV90eF9nZXRfcXVldWUoc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOworCW1hcHBpbmcgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKKwlxID0gd2wxMjcxX3R4X2dldF9xdWV1ZShtYXBwaW5nKTsKIAogCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKQogCQlobGlkID0gd2wxMjcxX3R4X2dldF9obGlkKHNrYik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKIAotCXdsLT50eF9xdWV1ZV9jb3VudCsrOworCXdsLT50eF9xdWV1ZV9jb3VudFtxXSsrOwogCiAJLyoKIAkgKiBUaGUgd29ya3F1ZXVlIGlzIHNsb3cgdG8gcHJvY2VzcyB0aGUgdHhfcXVldWUgYW5kIHdlIG5lZWQgc3RvcAogCSAqIHRoZSBxdWV1ZSBoZXJlLCBvdGhlcndpc2UgdGhlIHF1ZXVlIHdpbGwgZ2V0IHRvbyBsb25nLgogCSAqLwotCWlmICh3bC0+dHhfcXVldWVfY291bnQgPj0gV0wxMjcxX1RYX1FVRVVFX0hJR0hfV0FURVJNQVJLKSB7Ci0JCXdsMTI3MV9kZWJ1ZyhERUJVR19UWCwgIm9wX3R4OiBzdG9wcGluZyBxdWV1ZXMiKTsKLQkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHdsLT5odyk7Ci0JCXNldF9iaXQoV0wxMjcxX0ZMQUdfVFhfUVVFVUVfU1RPUFBFRCwgJndsLT5mbGFncyk7CisJaWYgKHdsLT50eF9xdWV1ZV9jb3VudFtxXSA+PSBXTDEyNzFfVFhfUVVFVUVfSElHSF9XQVRFUk1BUkspIHsKKwkJd2wxMjcxX2RlYnVnKERFQlVHX1RYLCAib3BfdHg6IHN0b3BwaW5nIHF1ZXVlcyBmb3IgcSAlZCIsIHEpOworCQlpZWVlODAyMTFfc3RvcF9xdWV1ZSh3bC0+aHcsIG1hcHBpbmcpOworCQlzZXRfYml0KHEsICZ3bC0+c3RvcHBlZF9xdWV1ZXNfbWFwKTsKIAl9CiAKIAkvKiBxdWV1ZSB0aGUgcGFja2V0ICovCkBAIC0xMjg3LDEwICsxNTQzLDExIEBACiBpbnQgd2wxMjcxX3R4X2R1bW15X3BhY2tldChzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBxID0gd2wxMjcxX3R4X2dldF9xdWV1ZShza2JfZ2V0X3F1ZXVlX21hcHBpbmcod2wtPmR1bW15X3BhY2tldCkpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndsLT53bF9sb2NrLCBmbGFncyk7CiAJc2V0X2JpdChXTDEyNzFfRkxBR19EVU1NWV9QQUNLRVRfUEVORElORywgJndsLT5mbGFncyk7Ci0Jd2wtPnR4X3F1ZXVlX2NvdW50Kys7CisJd2wtPnR4X3F1ZXVlX2NvdW50W3FdKys7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKIAogCS8qIFRoZSBGVyBpcyBsb3cgb24gUlggbWVtb3J5IGJsb2Nrcywgc28gc2VuZCB0aGUgZHVtbXkgcGFja2V0IGFzYXAgKi8KQEAgLTEzNTIsMTUgKzE2MDksMTUgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfY29uZmlndXJlX3N1c3BlbmRfc3RhKHN0cnVjdCB3bDEyNzEgKndsKQogewotCWludCByZXQ7Ci0KLQlpZiAod2wtPmJzc190eXBlICE9IEJTU19UWVBFX1NUQV9CU1MpCi0JCXJldHVybiAwOworCWludCByZXQgPSAwOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAorCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpKQorCQlnb3RvIG91dF91bmxvY2s7CisKIAlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTE0MDMsMTEgKzE2NjAsNDQgQEAKIAogfQogCitzdGF0aWMgaW50IHdsMTI3MV9jb25maWd1cmVfc3VzcGVuZF9hcChzdHJ1Y3Qgd2wxMjcxICp3bCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJndsLT5tdXRleCk7CisKKwlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX0FQX1NUQVJURUQsICZ3bC0+ZmxhZ3MpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X3VubG9jazsKKworCXJldCA9IHdsMTI3MV9hY3hfc2V0X2FwX2JlYWNvbl9maWx0ZXIod2wsIHRydWUpOworCisJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBpbnQgd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kKHN0cnVjdCB3bDEyNzEgKndsKQoreworCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUykKKwkJcmV0dXJuIHdsMTI3MV9jb25maWd1cmVfc3VzcGVuZF9zdGEod2wpOworCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKQorCQlyZXR1cm4gd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kX2FwKHdsKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgd2wxMjcxX2NvbmZpZ3VyZV9yZXN1bWUoc3RydWN0IHdsMTI3MSAqd2wpCiB7CiAJaW50IHJldDsKKwlib29sIGlzX3N0YSA9IHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTOworCWJvb2wgaXNfYXAgPSB3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTOwogCi0JaWYgKHdsLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9TVEFfQlNTKQorCWlmICghaXNfc3RhICYmICFpc19hcCkKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKQEAgLTE0MTUsMTAgKzE3MDUsMTQgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQkvKiBleGl0IHBzbSBpZiBpdCB3YXNuJ3QgY29uZmlndXJlZCAqLwotCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfUFNNX1JFUVVFU1RFRCwgJndsLT5mbGFncykpCi0JCXdsMTI3MV9wc19zZXRfbW9kZSh3bCwgU1RBVElPTl9BQ1RJVkVfTU9ERSwKLQkJCQkgICB3bC0+YmFzaWNfcmF0ZSwgdHJ1ZSk7CisJaWYgKGlzX3N0YSkgeworCQkvKiBleGl0IHBzbSBpZiBpdCB3YXNuJ3QgY29uZmlndXJlZCAqLworCQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bC0+ZmxhZ3MpKQorCQkJd2wxMjcxX3BzX3NldF9tb2RlKHdsLCBTVEFUSU9OX0FDVElWRV9NT0RFLAorCQkJCQkgICB3bC0+YmFzaWNfcmF0ZSwgdHJ1ZSk7CisJfSBlbHNlIGlmIChpc19hcCkgeworCQl3bDEyNzFfYWN4X3NldF9hcF9iZWFjb25fZmlsdGVyKHdsLCBmYWxzZSk7CisJfQogCiAJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CiBvdXQ6CkBAIC0xNDI5LDY5ICsxNzIzLDY4IEBACiAJCQkgICAgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293KQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJaW50IHJldDsKKwogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIHN1c3BlbmQgd293PSVkIiwgISF3b3cpOwotCXdsLT53b3dfZW5hYmxlZCA9ICEhd293OwotCWlmICh3bC0+d293X2VuYWJsZWQpIHsKLQkJaW50IHJldDsKLQkJcmV0ID0gd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kKHdsKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXdsMTI3MV93YXJuaW5nKCJjb3VsZG4ndCBwcmVwYXJlIGRldmljZSB0byBzdXNwZW5kIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCS8qIGZsdXNoIGFueSByZW1haW5pbmcgd29yayAqLwotCQl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsICJmbHVzaGluZyByZW1haW5pbmcgd29ya3MiKTsKLQkJZmx1c2hfZGVsYXllZF93b3JrKCZ3bC0+c2Nhbl9jb21wbGV0ZV93b3JrKTsKKwlXQVJOX09OKCF3b3cgfHwgIXdvdy0+YW55KTsKIAotCQkvKgotCQkgKiBkaXNhYmxlIGFuZCByZS1lbmFibGUgaW50ZXJydXB0cyBpbiBvcmRlciB0byBmbHVzaAotCQkgKiB0aGUgdGhyZWFkZWRfaXJxCi0JCSAqLwotCQl3bDEyNzFfZGlzYWJsZV9pbnRlcnJ1cHRzKHdsKTsKLQotCQkvKgotCQkgKiBzZXQgc3VzcGVuZGVkIGZsYWcgdG8gYXZvaWQgdHJpZ2dlcmluZyBhIG5ldyB0aHJlYWRlZF9pcnEKLQkJICogd29yay4gbm8gbmVlZCBmb3Igc3BpbmxvY2sgYXMgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCi0JCSAqLwotCQlzZXRfYml0KFdMMTI3MV9GTEFHX1NVU1BFTkRFRCwgJndsLT5mbGFncyk7Ci0KLQkJd2wxMjcxX2VuYWJsZV9pbnRlcnJ1cHRzKHdsKTsKLQkJZmx1c2hfd29yaygmd2wtPnR4X3dvcmspOwotCQlmbHVzaF9kZWxheWVkX3dvcmsoJndsLT5wc3BvbGxfd29yayk7Ci0JCWZsdXNoX2RlbGF5ZWRfd29yaygmd2wtPmVscF93b3JrKTsKKwl3bC0+d293X2VuYWJsZWQgPSB0cnVlOworCXJldCA9IHdsMTI3MV9jb25maWd1cmVfc3VzcGVuZCh3bCk7CisJaWYgKHJldCA8IDApIHsKKwkJd2wxMjcxX3dhcm5pbmcoImNvdWxkbid0IHByZXBhcmUgZGV2aWNlIHRvIHN1c3BlbmQiKTsKKwkJcmV0dXJuIHJldDsKIAl9CisJLyogZmx1c2ggYW55IHJlbWFpbmluZyB3b3JrICovCisJd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLCAiZmx1c2hpbmcgcmVtYWluaW5nIHdvcmtzIik7CisKKwkvKgorCSAqIGRpc2FibGUgYW5kIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGluIG9yZGVyIHRvIGZsdXNoCisJICogdGhlIHRocmVhZGVkX2lycQorCSAqLworCXdsMTI3MV9kaXNhYmxlX2ludGVycnVwdHMod2wpOworCisJLyoKKwkgKiBzZXQgc3VzcGVuZGVkIGZsYWcgdG8gYXZvaWQgdHJpZ2dlcmluZyBhIG5ldyB0aHJlYWRlZF9pcnEKKwkgKiB3b3JrLiBubyBuZWVkIGZvciBzcGlubG9jayBhcyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KKwkgKi8KKwlzZXRfYml0KFdMMTI3MV9GTEFHX1NVU1BFTkRFRCwgJndsLT5mbGFncyk7CisKKwl3bDEyNzFfZW5hYmxlX2ludGVycnVwdHMod2wpOworCWZsdXNoX3dvcmsoJndsLT50eF93b3JrKTsKKwlmbHVzaF9kZWxheWVkX3dvcmsoJndsLT5wc3BvbGxfd29yayk7CisJZmx1c2hfZGVsYXllZF93b3JrKCZ3bC0+ZWxwX3dvcmspOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgd2wxMjcxX29wX3Jlc3VtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGh3LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBydW5faXJxX3dvcmsgPSBmYWxzZTsKKwogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIHJlc3VtZSB3b3c9JWQiLAogCQkgICAgIHdsLT53b3dfZW5hYmxlZCk7CisJV0FSTl9PTighd2wtPndvd19lbmFibGVkKTsKIAogCS8qCiAJICogcmUtZW5hYmxlIGlycV93b3JrIGVucXVldWluZywgYW5kIGNhbGwgaXJxX3dvcmsgZGlyZWN0bHkgaWYKIAkgKiB0aGVyZSBpcyBhIHBlbmRpbmcgd29yay4KIAkgKi8KLQlpZiAod2wtPndvd19lbmFibGVkKSB7Ci0JCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCWJvb2wgcnVuX2lycV93b3JrID0gZmFsc2U7CisJc3Bpbl9sb2NrX2lycXNhdmUoJndsLT53bF9sb2NrLCBmbGFncyk7CisJY2xlYXJfYml0KFdMMTI3MV9GTEFHX1NVU1BFTkRFRCwgJndsLT5mbGFncyk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXTDEyNzFfRkxBR19QRU5ESU5HX1dPUkssICZ3bC0+ZmxhZ3MpKQorCQlydW5faXJxX3dvcmsgPSB0cnVlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsLT53bF9sb2NrLCBmbGFncyk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndsLT53bF9sb2NrLCBmbGFncyk7Ci0JCWNsZWFyX2JpdChXTDEyNzFfRkxBR19TVVNQRU5ERUQsICZ3bC0+ZmxhZ3MpOwotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdMMTI3MV9GTEFHX1BFTkRJTkdfV09SSywgJndsLT5mbGFncykpCi0JCQlydW5faXJxX3dvcmsgPSB0cnVlOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwotCi0JCWlmIChydW5faXJxX3dvcmspIHsKLQkJCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwKLQkJCQkgICAgICJydW4gcG9zdHBvbmVkIGlycV93b3JrIGRpcmVjdGx5Iik7Ci0JCQl3bDEyNzFfaXJxKDAsIHdsKTsKLQkJCXdsMTI3MV9lbmFibGVfaW50ZXJydXB0cyh3bCk7Ci0JCX0KLQotCQl3bDEyNzFfY29uZmlndXJlX3Jlc3VtZSh3bCk7CisJaWYgKHJ1bl9pcnFfd29yaykgeworCQl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsCisJCQkgICAgICJydW4gcG9zdHBvbmVkIGlycV93b3JrIGRpcmVjdGx5Iik7CisJCXdsMTI3MV9pcnEoMCwgd2wpOworCQl3bDEyNzFfZW5hYmxlX2ludGVycnVwdHMod2wpOwogCX0KKwl3bDEyNzFfY29uZmlndXJlX3Jlc3VtZSh3bCk7CisJd2wtPndvd19lbmFibGVkID0gZmFsc2U7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2MjksOSArMTkyMiw2IEBACiAJc3RybmNweSh3aXBoeS0+ZndfdmVyc2lvbiwgd2wtPmNoaXAuZndfdmVyX3N0ciwKIAkJc2l6ZW9mKHdpcGh5LT5md192ZXJzaW9uKSk7CiAKLQkvKiBDaGVjayBpZiBhbnkgcXVpcmtzIGFyZSBuZWVkZWQgd2l0aCBvbGRlciBmdyB2ZXJzaW9ucyAqLwotCXdsLT5xdWlya3MgfD0gd2wxMjcxX2dldF9md192ZXJfcXVpcmtzKHdsKTsKLQogCS8qCiAJICogTm93IHdlIGtub3cgaWYgMTFhIGlzIHN1cHBvcnRlZCAoaW5mbyBmcm9tIHRoZSBOVlMpLCBzbyBkaXNhYmxlCiAJICogMTFhIGNoYW5uZWxzIGlmIG5vdCBzdXBwb3J0ZWQKQEAgLTE2OTQsNiArMTk4NCw5IEBACiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3bC0+c2Nhbl9jb21wbGV0ZV93b3JrKTsKIAljYW5jZWxfd29ya19zeW5jKCZ3bC0+bmV0c3RhY2tfd29yayk7CiAJY2FuY2VsX3dvcmtfc3luYygmd2wtPnR4X3dvcmspOworCWRlbF90aW1lcl9zeW5jKCZ3bC0+cnhfc3RyZWFtaW5nX3RpbWVyKTsKKwljYW5jZWxfd29ya19zeW5jKCZ3bC0+cnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZ3bC0+cnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3bC0+cHNwb2xsX3dvcmspOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmd2wtPmVscF93b3JrKTsKIApAQCAtMTcxNCwxMSArMjAwNyw4IEBACiAJd2wtPnBzbV9lbnRyeV9yZXRyeSA9IDA7CiAJd2wtPnBvd2VyX2xldmVsID0gV0wxMjcxX0RFRkFVTFRfUE9XRVJfTEVWRUw7CiAJd2wtPnR4X2Jsb2Nrc19hdmFpbGFibGUgPSAwOwotCXdsLT50eF9hbGxvY2F0ZWRfYmxvY2tzID0gMDsKIAl3bC0+dHhfcmVzdWx0c19jb3VudCA9IDA7CiAJd2wtPnR4X3BhY2tldHNfY291bnQgPSAwOwotCXdsLT50eF9zZWN1cml0eV9sYXN0X3NlcSA9IDA7Ci0Jd2wtPnR4X3NlY3VyaXR5X3NlcSA9IDA7CiAJd2wtPnRpbWVfb2Zmc2V0ID0gMDsKIAl3bC0+c2Vzc2lvbl9jb3VudGVyID0gMDsKIAl3bC0+cmF0ZV9zZXQgPSBDT05GX1RYX1JBVEVfTUFTS19CQVNJQzsKQEAgLTE3MzcsOCArMjAyNywxMCBAQAogCSAqLwogCXdsLT5mbGFncyA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpKyspIHsKIAkJd2wtPnR4X2Jsb2Nrc19mcmVlZFtpXSA9IDA7CisJCXdsLT50eF9hbGxvY2F0ZWRfYmxvY2tzW2ldID0gMDsKKwl9CiAKIAl3bDEyNzFfZGVidWdmc19yZXNldCh3bCk7CiAKQEAgLTE4OTEsNiArMjE4MywxMCBAQAogCWNsZWFyX2JpdChXTDEyNzFfRkxBR19KT0lORUQsICZ3bC0+ZmxhZ3MpOwogCW1lbXNldCh3bC0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKIAorCS8qIHJlc2V0IFRYIHNlY3VyaXR5IGNvdW50ZXJzIG9uIGEgY2xlYW4gZGlzY29ubmVjdCAqLworCXdsLT50eF9zZWN1cml0eV9sYXN0X3NlcV9sc2IgPSAwOworCXdsLT50eF9zZWN1cml0eV9zZXEgPSAwOworCiAJLyogc3RvcCBmaWx0ZXJpbmcgcGFja2V0cyBiYXNlZCBvbiBic3NpZCAqLwogCXdsMTI3MV9jb25maWd1cmVfZmlsdGVycyh3bCwgRklGX09USEVSX0JTUyk7CiAKQEAgLTE5ODMsNiArMjI3OSw5IEBACiAJCQl3bC0+Y2hhbm5lbCA9IGNoYW5uZWw7CiAJCX0KIAorCQlpZiAoKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUE9XRVIpKQorCQkJd2wtPnBvd2VyX2xldmVsID0gY29uZi0+cG93ZXJfbGV2ZWw7CisKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0yNDkwLDYgKzI3ODksNDQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCB3bDEyNzFfb3BfY2FuY2VsX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJaW50IHJldDsKKworCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIGNhbmNlbCBodyBzY2FuIik7CisKKwltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCisJaWYgKHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGKQorCQlnb3RvIG91dDsKKworCWlmICh3bC0+c2Nhbi5zdGF0ZSA9PSBXTDEyNzFfU0NBTl9TVEFURV9JRExFKQorCQlnb3RvIG91dDsKKworCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAod2wtPnNjYW4uc3RhdGUgIT0gV0wxMjcxX1NDQU5fU1RBVEVfRE9ORSkgeworCQlyZXQgPSB3bDEyNzFfc2Nhbl9zdG9wKHdsKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF9zbGVlcDsKKwl9CisJd2wtPnNjYW4uc3RhdGUgPSBXTDEyNzFfU0NBTl9TVEFURV9JRExFOworCW1lbXNldCh3bC0+c2Nhbi5zY2FubmVkX2NoLCAwLCBzaXplb2Yod2wtPnNjYW4uc2Nhbm5lZF9jaCkpOworCXdsLT5zY2FuLnJlcSA9IE5VTEw7CisJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKHdsLT5odywgdHJ1ZSk7CisKK291dF9zbGVlcDoKKwl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKK291dDoKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJndsLT5zY2FuX2NvbXBsZXRlX3dvcmspOworfQorCiBzdGF0aWMgaW50IHdsMTI3MV9vcF9zY2hlZF9zY2FuX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJICAgICAgc3RydWN0IGNmZzgwMjExX3NjaGVkX3NjYW5fcmVxdWVzdCAqcmVxLApAQCAtMjc4MCwyNCArMzExNyw2IEBACiAJCX0KIAl9CiAKLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0lCU1MpIHsKLQkJd2wxMjcxX2RlYnVnKERFQlVHX0FESE9DLCAiaWJzc19qb2luZWQ6ICVkIiwKLQkJCSAgICAgYnNzX2NvbmYtPmlic3Nfam9pbmVkKTsKLQotCQlpZiAoYnNzX2NvbmYtPmlic3Nfam9pbmVkKSB7Ci0JCQl1MzIgcmF0ZXMgPSBic3NfY29uZi0+YmFzaWNfcmF0ZXM7Ci0JCQl3bC0+YmFzaWNfcmF0ZV9zZXQgPSB3bDEyNzFfdHhfZW5hYmxlZF9yYXRlc19nZXQod2wsCi0JCQkJCQkJCQkgcmF0ZXMpOwotCQkJd2wtPmJhc2ljX3JhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsKTsKLQotCQkJLyogYnkgZGVmYXVsdCwgdXNlIDExYiByYXRlcyAqLwotCQkJd2wtPnJhdGVfc2V0ID0gQ09ORl9UWF9JQlNTX0RFRkFVTFRfUkFURVM7Ci0JCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCiAJcmV0ID0gd2wxMjcxX2Jzc19lcnBfaW5mb19jaGFuZ2VkKHdsLCBic3NfY29uZiwgY2hhbmdlZCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMzAyMyw2ICszMzQyLDI0IEBACiAJCX0KIAl9CiAKKwlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0lCU1MpIHsKKwkJd2wxMjcxX2RlYnVnKERFQlVHX0FESE9DLCAiaWJzc19qb2luZWQ6ICVkIiwKKwkJCSAgICAgYnNzX2NvbmYtPmlic3Nfam9pbmVkKTsKKworCQlpZiAoYnNzX2NvbmYtPmlic3Nfam9pbmVkKSB7CisJCQl1MzIgcmF0ZXMgPSBic3NfY29uZi0+YmFzaWNfcmF0ZXM7CisJCQl3bC0+YmFzaWNfcmF0ZV9zZXQgPSB3bDEyNzFfdHhfZW5hYmxlZF9yYXRlc19nZXQod2wsCisJCQkJCQkJCQkgcmF0ZXMpOworCQkJd2wtPmJhc2ljX3JhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsKTsKKworCQkJLyogYnkgZGVmYXVsdCwgdXNlIDExYiByYXRlcyAqLworCQkJd2wtPnJhdGVfc2V0ID0gQ09ORl9UWF9JQlNTX0RFRkFVTFRfUkFURVM7CisJCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorCiAJcmV0ID0gd2wxMjcxX2Jzc19lcnBfaW5mb19jaGFuZ2VkKHdsLCBic3NfY29uZiwgY2hhbmdlZCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMzA2MSw2ICszMzk4LDcgQEAKIAkJCXdsMTI3MV93YXJuaW5nKCJjbWQgam9pbiBmYWlsZWQgJWQiLCByZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJd2wxMjcxX2NoZWNrX29wZXJzdGF0ZSh3bCwgaWVlZTgwMjExX2dldF9vcGVyc3RhdGUodmlmKSk7CiAJfQogCiBvdXQ6CkBAIC0zMjUxLDYgKzM1ODksMTIgQEAKIAlfX2NsZWFyX2JpdChobGlkLCAodW5zaWduZWQgbG9uZyAqKSZ3bC0+YXBfZndfcHNfbWFwKTsKIH0KIAorYm9vbCB3bDEyNzFfaXNfYWN0aXZlX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaGxpZCkKK3sKKwlpbnQgaWQgPSBobGlkIC0gV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUOworCXJldHVybiB0ZXN0X2JpdChpZCwgd2wtPmFwX2hsaWRfbWFwKTsKK30KKwogc3RhdGljIGludCB3bDEyNzFfb3Bfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKQEAgLTMzNTQsOSArMzY5OCwxMiBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAorCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIGFtcGR1OiBSeCB0aWQgJWQgYWN0aW9uICVkIiwKKwkJICAgICB0aWQsIGFjdGlvbik7CisKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUOgotCQlpZiAod2wtPmJhX3N1cHBvcnQpIHsKKwkJaWYgKCh3bC0+YmFfc3VwcG9ydCkgJiYgKHdsLT5iYV9hbGxvd2VkKSkgewogCQkJcmV0ID0gd2wxMjcxX2FjeF9zZXRfYmFfcmVjZWl2ZXJfc2Vzc2lvbih3bCwgdGlkLCAqc3NuLAogCQkJCQkJCQkgdHJ1ZSk7CiAJCQlpZiAoIXJldCkKQEAgLTM0MDYsNyArMzc1Myw3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogcGFja2V0cyBhcmUgY29uc2lkZXJlZCBwZW5kaW5nIGlmIGluIHRoZSBUWCBxdWV1ZSBvciB0aGUgRlcgKi8KLQlyZXQgPSAod2wtPnR4X3F1ZXVlX2NvdW50ID4gMCkgfHwgKHdsLT50eF9mcmFtZXNfY250ID4gMCk7CisJcmV0ID0gKHdsMTI3MV90eF90b3RhbF9xdWV1ZV9jb3VudCh3bCkgPiAwKSB8fCAod2wtPnR4X2ZyYW1lc19jbnQgPiAwKTsKIAogCS8qIHRoZSBhYm92ZSBpcyBhcHByb3ByaWF0ZSBmb3IgU1RBIG1vZGUgZm9yIFBTIHB1cnBvc2VzICovCiAJV0FSTl9PTih3bC0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfU1RBX0JTUyk7CkBAIC0zNTY5LDQwICszOTE2LDQwIEBACiAKIC8qIDUgR0h6IGJhbmQgY2hhbm5lbHMgZm9yIFdMMTI3MyAqLwogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCB3bDEyNzFfY2hhbm5lbHNfNWdoeltdID0gewotCXsgLmh3X3ZhbHVlID0gNywgLmNlbnRlcl9mcmVxID0gNTAzNX0sCi0JeyAuaHdfdmFsdWUgPSA4LCAuY2VudGVyX2ZyZXEgPSA1MDQwfSwKLQl7IC5od192YWx1ZSA9IDksIC5jZW50ZXJfZnJlcSA9IDUwNDV9LAotCXsgLmh3X3ZhbHVlID0gMTEsIC5jZW50ZXJfZnJlcSA9IDUwNTV9LAotCXsgLmh3X3ZhbHVlID0gMTIsIC5jZW50ZXJfZnJlcSA9IDUwNjB9LAotCXsgLmh3X3ZhbHVlID0gMTYsIC5jZW50ZXJfZnJlcSA9IDUwODB9LAotCXsgLmh3X3ZhbHVlID0gMzQsIC5jZW50ZXJfZnJlcSA9IDUxNzB9LAotCXsgLmh3X3ZhbHVlID0gMzYsIC5jZW50ZXJfZnJlcSA9IDUxODB9LAotCXsgLmh3X3ZhbHVlID0gMzgsIC5jZW50ZXJfZnJlcSA9IDUxOTB9LAotCXsgLmh3X3ZhbHVlID0gNDAsIC5jZW50ZXJfZnJlcSA9IDUyMDB9LAotCXsgLmh3X3ZhbHVlID0gNDIsIC5jZW50ZXJfZnJlcSA9IDUyMTB9LAotCXsgLmh3X3ZhbHVlID0gNDQsIC5jZW50ZXJfZnJlcSA9IDUyMjB9LAotCXsgLmh3X3ZhbHVlID0gNDYsIC5jZW50ZXJfZnJlcSA9IDUyMzB9LAotCXsgLmh3X3ZhbHVlID0gNDgsIC5jZW50ZXJfZnJlcSA9IDUyNDB9LAotCXsgLmh3X3ZhbHVlID0gNTIsIC5jZW50ZXJfZnJlcSA9IDUyNjB9LAotCXsgLmh3X3ZhbHVlID0gNTYsIC5jZW50ZXJfZnJlcSA9IDUyODB9LAotCXsgLmh3X3ZhbHVlID0gNjAsIC5jZW50ZXJfZnJlcSA9IDUzMDB9LAotCXsgLmh3X3ZhbHVlID0gNjQsIC5jZW50ZXJfZnJlcSA9IDUzMjB9LAotCXsgLmh3X3ZhbHVlID0gMTAwLCAuY2VudGVyX2ZyZXEgPSA1NTAwfSwKLQl7IC5od192YWx1ZSA9IDEwNCwgLmNlbnRlcl9mcmVxID0gNTUyMH0sCi0JeyAuaHdfdmFsdWUgPSAxMDgsIC5jZW50ZXJfZnJlcSA9IDU1NDB9LAotCXsgLmh3X3ZhbHVlID0gMTEyLCAuY2VudGVyX2ZyZXEgPSA1NTYwfSwKLQl7IC5od192YWx1ZSA9IDExNiwgLmNlbnRlcl9mcmVxID0gNTU4MH0sCi0JeyAuaHdfdmFsdWUgPSAxMjAsIC5jZW50ZXJfZnJlcSA9IDU2MDB9LAotCXsgLmh3X3ZhbHVlID0gMTI0LCAuY2VudGVyX2ZyZXEgPSA1NjIwfSwKLQl7IC5od192YWx1ZSA9IDEyOCwgLmNlbnRlcl9mcmVxID0gNTY0MH0sCi0JeyAuaHdfdmFsdWUgPSAxMzIsIC5jZW50ZXJfZnJlcSA9IDU2NjB9LAotCXsgLmh3X3ZhbHVlID0gMTM2LCAuY2VudGVyX2ZyZXEgPSA1NjgwfSwKLQl7IC5od192YWx1ZSA9IDE0MCwgLmNlbnRlcl9mcmVxID0gNTcwMH0sCi0JeyAuaHdfdmFsdWUgPSAxNDksIC5jZW50ZXJfZnJlcSA9IDU3NDV9LAotCXsgLmh3X3ZhbHVlID0gMTUzLCAuY2VudGVyX2ZyZXEgPSA1NzY1fSwKLQl7IC5od192YWx1ZSA9IDE1NywgLmNlbnRlcl9mcmVxID0gNTc4NX0sCi0JeyAuaHdfdmFsdWUgPSAxNjEsIC5jZW50ZXJfZnJlcSA9IDU4MDV9LAotCXsgLmh3X3ZhbHVlID0gMTY1LCAuY2VudGVyX2ZyZXEgPSA1ODI1fSwKKwl7IC5od192YWx1ZSA9IDcsIC5jZW50ZXJfZnJlcSA9IDUwMzUsIC5tYXhfcG93ZXIgPSAyNSB9LAorCXsgLmh3X3ZhbHVlID0gOCwgLmNlbnRlcl9mcmVxID0gNTA0MCwgLm1heF9wb3dlciA9IDI1IH0sCisJeyAuaHdfdmFsdWUgPSA5LCAuY2VudGVyX2ZyZXEgPSA1MDQ1LCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDExLCAuY2VudGVyX2ZyZXEgPSA1MDU1LCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDEyLCAuY2VudGVyX2ZyZXEgPSA1MDYwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDE2LCAuY2VudGVyX2ZyZXEgPSA1MDgwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDM0LCAuY2VudGVyX2ZyZXEgPSA1MTcwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDM2LCAuY2VudGVyX2ZyZXEgPSA1MTgwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDM4LCAuY2VudGVyX2ZyZXEgPSA1MTkwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDQwLCAuY2VudGVyX2ZyZXEgPSA1MjAwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDQyLCAuY2VudGVyX2ZyZXEgPSA1MjEwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDQ0LCAuY2VudGVyX2ZyZXEgPSA1MjIwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDQ2LCAuY2VudGVyX2ZyZXEgPSA1MjMwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDQ4LCAuY2VudGVyX2ZyZXEgPSA1MjQwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDUyLCAuY2VudGVyX2ZyZXEgPSA1MjYwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDU2LCAuY2VudGVyX2ZyZXEgPSA1MjgwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDYwLCAuY2VudGVyX2ZyZXEgPSA1MzAwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDY0LCAuY2VudGVyX2ZyZXEgPSA1MzIwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDEwMCwgLmNlbnRlcl9mcmVxID0gNTUwMCwgLm1heF9wb3dlciA9IDI1IH0sCisJeyAuaHdfdmFsdWUgPSAxMDQsIC5jZW50ZXJfZnJlcSA9IDU1MjAsIC5tYXhfcG93ZXIgPSAyNSB9LAorCXsgLmh3X3ZhbHVlID0gMTA4LCAuY2VudGVyX2ZyZXEgPSA1NTQwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDExMiwgLmNlbnRlcl9mcmVxID0gNTU2MCwgLm1heF9wb3dlciA9IDI1IH0sCisJeyAuaHdfdmFsdWUgPSAxMTYsIC5jZW50ZXJfZnJlcSA9IDU1ODAsIC5tYXhfcG93ZXIgPSAyNSB9LAorCXsgLmh3X3ZhbHVlID0gMTIwLCAuY2VudGVyX2ZyZXEgPSA1NjAwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDEyNCwgLmNlbnRlcl9mcmVxID0gNTYyMCwgLm1heF9wb3dlciA9IDI1IH0sCisJeyAuaHdfdmFsdWUgPSAxMjgsIC5jZW50ZXJfZnJlcSA9IDU2NDAsIC5tYXhfcG93ZXIgPSAyNSB9LAorCXsgLmh3X3ZhbHVlID0gMTMyLCAuY2VudGVyX2ZyZXEgPSA1NjYwLCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDEzNiwgLmNlbnRlcl9mcmVxID0gNTY4MCwgLm1heF9wb3dlciA9IDI1IH0sCisJeyAuaHdfdmFsdWUgPSAxNDAsIC5jZW50ZXJfZnJlcSA9IDU3MDAsIC5tYXhfcG93ZXIgPSAyNSB9LAorCXsgLmh3X3ZhbHVlID0gMTQ5LCAuY2VudGVyX2ZyZXEgPSA1NzQ1LCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDE1MywgLmNlbnRlcl9mcmVxID0gNTc2NSwgLm1heF9wb3dlciA9IDI1IH0sCisJeyAuaHdfdmFsdWUgPSAxNTcsIC5jZW50ZXJfZnJlcSA9IDU3ODUsIC5tYXhfcG93ZXIgPSAyNSB9LAorCXsgLmh3X3ZhbHVlID0gMTYxLCAuY2VudGVyX2ZyZXEgPSA1ODA1LCAubWF4X3Bvd2VyID0gMjUgfSwKKwl7IC5od192YWx1ZSA9IDE2NSwgLmNlbnRlcl9mcmVxID0gNTgyNSwgLm1heF9wb3dlciA9IDI1IH0sCiB9OwogCiAvKiBtYXBwaW5nIHRvIGluZGV4ZXMgZm9yIHdsMTI3MV9yYXRlc181Z2h6ICovCkBAIC0zNjYzLDYgKzQwMTAsNyBAQAogCS50eCA9IHdsMTI3MV9vcF90eCwKIAkuc2V0X2tleSA9IHdsMTI3MV9vcF9zZXRfa2V5LAogCS5od19zY2FuID0gd2wxMjcxX29wX2h3X3NjYW4sCisJLmNhbmNlbF9od19zY2FuID0gd2wxMjcxX29wX2NhbmNlbF9od19zY2FuLAogCS5zY2hlZF9zY2FuX3N0YXJ0ID0gd2wxMjcxX29wX3NjaGVkX3NjYW5fc3RhcnQsCiAJLnNjaGVkX3NjYW5fc3RvcCA9IHdsMTI3MV9vcF9zY2hlZF9zY2FuX3N0b3AsCiAJLmJzc19pbmZvX2NoYW5nZWQgPSB3bDEyNzFfb3BfYnNzX2luZm9fY2hhbmdlZCwKQEAgLTM3ODEsNiArNDEyOSw2OSBAQAogc3RhdGljIERFVklDRV9BVFRSKGh3X3BnX3ZlciwgU19JUlVHTyB8IFNfSVdVU1IsCiAJCSAgIHdsMTI3MV9zeXNmc19zaG93X2h3X3BnX3ZlciwgTlVMTCk7CiAKK3N0YXRpYyBzc2l6ZV90IHdsMTI3MV9zeXNmc19yZWFkX2Z3bG9nKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJCSAgICAgICBjaGFyICpidWZmZXIsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzc2l6ZV90IGxlbjsKKwlpbnQgcmV0OworCisJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ3bC0+bXV0ZXgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJLyogTGV0IG9ubHkgb25lIHRocmVhZCByZWFkIHRoZSBsb2cgYXQgYSB0aW1lLCBibG9ja2luZyBvdGhlcnMgKi8KKwl3aGlsZSAod2wtPmZ3bG9nX3NpemUgPT0gMCkgeworCQlERUZJTkVfV0FJVCh3YWl0KTsKKworCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKCZ3bC0+Zndsb2dfd2FpdHEsCisJCQkJCSAgJndhaXQsCisJCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlpZiAod2wtPmZ3bG9nX3NpemUgIT0gMCkgeworCQkJZmluaXNoX3dhaXQoJndsLT5md2xvZ193YWl0cSwgJndhaXQpOworCQkJYnJlYWs7CisJCX0KKworCQltdXRleF91bmxvY2soJndsLT5tdXRleCk7CisKKwkJc2NoZWR1bGUoKTsKKwkJZmluaXNoX3dhaXQoJndsLT5md2xvZ193YWl0cSwgJndhaXQpOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ3bC0+bXV0ZXgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJLyogQ2hlY2sgaWYgdGhlIGZ3bG9nIGlzIHN0aWxsIHZhbGlkICovCisJaWYgKHdsLT5md2xvZ19zaXplIDwgMCkgeworCQltdXRleF91bmxvY2soJndsLT5tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCS8qIFNlZWtpbmcgaXMgbm90IHN1cHBvcnRlZCAtIG9sZCBsb2dzIGFyZSBub3Qga2VwdC4gRGlzcmVnYXJkIHBvcy4gKi8KKwlsZW4gPSBtaW4oY291bnQsIChzaXplX3Qpd2wtPmZ3bG9nX3NpemUpOworCXdsLT5md2xvZ19zaXplIC09IGxlbjsKKwltZW1jcHkoYnVmZmVyLCB3bC0+Zndsb2csIGxlbik7CisKKwkvKiBNYWtlIHJvb20gZm9yIG5ldyBtZXNzYWdlcyAqLworCW1lbW1vdmUod2wtPmZ3bG9nLCB3bC0+Zndsb2cgKyBsZW4sIHdsLT5md2xvZ19zaXplKTsKKworCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBmd2xvZ19hdHRyID0geworCS5hdHRyID0gey5uYW1lID0gImZ3bG9nIiwgLm1vZGUgPSBTX0lSVVNSfSwKKwkucmVhZCA9IHdsMTI3MV9zeXNmc19yZWFkX2Z3bG9nLAorfTsKKwogaW50IHdsMTI3MV9yZWdpc3Rlcl9odyhzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAlpbnQgcmV0OwpAQCAtMzk2MSw2ICs0MzcyLDE3IEBACiAJSU5JVF9XT1JLKCZ3bC0+dHhfd29yaywgd2wxMjcxX3R4X3dvcmspOwogCUlOSVRfV09SSygmd2wtPnJlY292ZXJ5X3dvcmssIHdsMTI3MV9yZWNvdmVyeV93b3JrKTsKIAlJTklUX0RFTEFZRURfV09SSygmd2wtPnNjYW5fY29tcGxldGVfd29yaywgd2wxMjcxX3NjYW5fY29tcGxldGVfd29yayk7CisJSU5JVF9XT1JLKCZ3bC0+cnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrLAorCQkgIHdsMTI3MV9yeF9zdHJlYW1pbmdfZW5hYmxlX3dvcmspOworCUlOSVRfV09SSygmd2wtPnJ4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmssCisJCSAgd2wxMjcxX3J4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmspOworCisJd2wtPmZyZWV6YWJsZV93cSA9IGNyZWF0ZV9mcmVlemFibGVfd29ya3F1ZXVlKCJ3bDEyeHhfd3EiKTsKKwlpZiAoIXdsLT5mcmVlemFibGVfd3EpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaHc7CisJfQorCiAJd2wtPmNoYW5uZWwgPSBXTDEyNzFfREVGQVVMVF9DSEFOTkVMOwogCXdsLT5iZWFjb25faW50ID0gV0wxMjcxX0RFRkFVTFRfQkVBQ09OX0lOVDsKIAl3bC0+ZGVmYXVsdF9rZXkgPSAwOwpAQCAtMzk4Niw2ICs0NDA4LDEzIEBACiAJd2wtPnF1aXJrcyA9IDA7CiAJd2wtPnBsYXRmb3JtX3F1aXJrcyA9IDA7CiAJd2wtPnNjaGVkX3NjYW5uaW5nID0gZmFsc2U7CisJd2wtPnR4X3NlY3VyaXR5X3NlcSA9IDA7CisJd2wtPnR4X3NlY3VyaXR5X2xhc3Rfc2VxX2xzYiA9IDA7CisKKwlzZXR1cF90aW1lcigmd2wtPnJ4X3N0cmVhbWluZ190aW1lciwgd2wxMjcxX3J4X3N0cmVhbWluZ190aW1lciwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB3bCk7CisJd2wtPmZ3bG9nX3NpemUgPSAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndsLT5md2xvZ193YWl0cSk7CiAKIAltZW1zZXQod2wtPnR4X2ZyYW1lc19tYXAsIDAsIHNpemVvZih3bC0+dHhfZnJhbWVzX21hcCkpOwogCWZvciAoaSA9IDA7IGkgPCBBQ1hfVFhfREVTQ1JJUFRPUlM7IGkrKykKQEAgLTQwMDMsNyArNDQzMiw3IEBACiAJd2wtPmFnZ3JfYnVmID0gKHU4ICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CiAJaWYgKCF3bC0+YWdncl9idWYpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfaHc7CisJCWdvdG8gZXJyX3dxOwogCX0KIAogCXdsLT5kdW1teV9wYWNrZXQgPSB3bDEyeHhfYWxsb2NfZHVtbXlfcGFja2V0KHdsKTsKQEAgLTQwMTIsMTEgKzQ0NDEsMTggQEAKIAkJZ290byBlcnJfYWdncjsKIAl9CiAKKwkvKiBBbGxvY2F0ZSBvbmUgcGFnZSBmb3IgdGhlIEZXIGxvZyAqLworCXdsLT5md2xvZyA9ICh1OCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXdsLT5md2xvZykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kdW1teV9wYWNrZXQ7CisJfQorCiAJLyogUmVnaXN0ZXIgcGxhdGZvcm0gZGV2aWNlICovCiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHdsLT5wbGF0X2Rldik7CiAJaWYgKHJldCkgewogCQl3bDEyNzFfZXJyb3IoImNvdWxkbid0IHJlZ2lzdGVyIHBsYXRmb3JtIGRldmljZSIpOwotCQlnb3RvIGVycl9kdW1teV9wYWNrZXQ7CisJCWdvdG8gZXJyX2Z3bG9nOwogCX0KIAlkZXZfc2V0X2RydmRhdGEoJndsLT5wbGF0X2Rldi0+ZGV2LCB3bCk7CiAKQEAgLTQwMzQsMjAgKzQ0NzAsMzYgQEAKIAkJZ290byBlcnJfYnRfY29leF9zdGF0ZTsKIAl9CiAKKwkvKiBDcmVhdGUgc3lzZnMgZmlsZSBmb3IgdGhlIEZXIGxvZyAqLworCXJldCA9IGRldmljZV9jcmVhdGVfYmluX2ZpbGUoJndsLT5wbGF0X2Rldi0+ZGV2LCAmZndsb2dfYXR0cik7CisJaWYgKHJldCA8IDApIHsKKwkJd2wxMjcxX2Vycm9yKCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGUgZndsb2ciKTsKKwkJZ290byBlcnJfaHdfcGdfdmVyOworCX0KKwogCXJldHVybiBodzsKIAorZXJyX2h3X3BnX3ZlcjoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJndsLT5wbGF0X2Rldi0+ZGV2LCAmZGV2X2F0dHJfaHdfcGdfdmVyKTsKKwogZXJyX2J0X2NvZXhfc3RhdGU6CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZ3bC0+cGxhdF9kZXYtPmRldiwgJmRldl9hdHRyX2J0X2NvZXhfc3RhdGUpOwogCiBlcnJfcGxhdGZvcm06CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod2wtPnBsYXRfZGV2KTsKIAorZXJyX2Z3bG9nOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl3bC0+Zndsb2cpOworCiBlcnJfZHVtbXlfcGFja2V0OgogCWRldl9rZnJlZV9za2Iod2wtPmR1bW15X3BhY2tldCk7CiAKIGVycl9hZ2dyOgogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpd2wtPmFnZ3JfYnVmLCBvcmRlcik7CiAKK2Vycl93cToKKwlkZXN0cm95X3dvcmtxdWV1ZSh3bC0+ZnJlZXphYmxlX3dxKTsKKwogZXJyX2h3OgogCXdsMTI3MV9kZWJ1Z2ZzX2V4aXQod2wpOwogCWtmcmVlKHBsYXRfZGV2KTsKQEAgLTQwNjMsNyArNDUxNSwxNSBAQAogCiBpbnQgd2wxMjcxX2ZyZWVfaHcoc3RydWN0IHdsMTI3MSAqd2wpCiB7CisJLyogVW5ibG9jayBhbnkgZndsb2cgcmVhZGVycyAqLworCW11dGV4X2xvY2soJndsLT5tdXRleCk7CisJd2wtPmZ3bG9nX3NpemUgPSAtMTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZ3bC0+Zndsb2dfd2FpdHEpOworCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKKworCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoJndsLT5wbGF0X2Rldi0+ZGV2LCAmZndsb2dfYXR0cik7CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod2wtPnBsYXRfZGV2KTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpd2wtPmZ3bG9nKTsKIAlkZXZfa2ZyZWVfc2tiKHdsLT5kdW1teV9wYWNrZXQpOwogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpd2wtPmFnZ3JfYnVmLAogCQkJZ2V0X29yZGVyKFdMMTI3MV9BR0dSX0JVRkZFUl9TSVpFKSk7CkBAIC00MDc4LDYgKzQ1MzgsNyBAQAogCiAJa2ZyZWUod2wtPmZ3X3N0YXR1cyk7CiAJa2ZyZWUod2wtPnR4X3Jlc19pZik7CisJZGVzdHJveV93b3JrcXVldWUod2wtPmZyZWV6YWJsZV93cSk7CiAKIAlpZWVlODAyMTFfZnJlZV9odyh3bC0+aHcpOwogCkBAIC00MDkwLDYgKzQ1NTEsMTAgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19sZXZlbCwgd2wxMnh4X2RlYnVnX2xldmVsLCB1aW50LCBTX0lSVVNSIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2xldmVsLCAid2wxMnh4IGRlYnVnZ2luZyBsZXZlbCIpOwogCittb2R1bGVfcGFyYW1fbmFtZWQoZndsb2csIGZ3bG9nX3BhcmFtLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGtleW1hcCwKKwkJICJGVyBsb2dnZXIgb3B0aW9uczogY29udGludW91cywgb25kZW1hbmQsIGRiZ3BpbnMgb3IgZGlzYWJsZSIpOworCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJMdWNpYW5vIENvZWxobyA8Y29lbGhvQHRpLmNvbT4iKTsKIE1PRFVMRV9BVVRIT1IoIkp1dXNvIE9pa2FyaW5lbiA8anV1c28ub2lrYXJpbmVuQG5va2lhLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9wcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3BzLmMKaW5kZXggYjU5YjY3Ny4uMzU0ODM3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3BzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3BzLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCQkJJmNvbXBsLCBtc2Vjc190b19qaWZmaWVzKFdMMTI3MV9XQUtFVVBfVElNRU9VVCkpOwogCQlpZiAocmV0ID09IDApIHsKIAkJCXdsMTI3MV9lcnJvcigiRUxQIHdha2V1cCB0aW1lb3V0ISIpOwotCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsod2wtPmh3LCAmd2wtPnJlY292ZXJ5X3dvcmspOworCQkJd2wxMnh4X3F1ZXVlX3JlY292ZXJ5X3dvcmsod2wpOwogCQkJcmV0ID0gLUVUSU1FRE9VVDsKIAkJCWdvdG8gZXJyOwogCQl9IGVsc2UgaWYgKHJldCA8IDApIHsKQEAgLTE2OSw5ICsxNjksMTEgQEAKIAkJd2wxMjcxX2RlYnVnKERFQlVHX1BTTSwgImxlYXZpbmcgcHNtIik7CiAKIAkJLyogZGlzYWJsZSBiZWFjb24gZWFybHkgdGVybWluYXRpb24gKi8KLQkJcmV0ID0gd2wxMjcxX2FjeF9iZXRfZW5hYmxlKHdsLCBmYWxzZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJaWYgKHdsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKKwkJCXJldCA9IHdsMTI3MV9hY3hfYmV0X2VuYWJsZSh3bCwgZmFsc2UpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQogCiAJCS8qIGRpc2FibGUgYmVhY29uIGZpbHRlcmluZyAqLwogCQlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHdsLCBmYWxzZSk7CkBAIC0xOTEsMjQgKzE5MywyNyBAQAogCiBzdGF0aWMgdm9pZCB3bDEyNzFfcHNfZmlsdGVyX2ZyYW1lcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaGxpZCkKIHsKLQlpbnQgaSwgZmlsdGVyZWQgPSAwOworCWludCBpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGZpbHRlcmVkW05VTV9UWF9RVUVVRVNdOwogCiAJLyogZmlsdGVyIGFsbCBmcmFtZXMgY3VycmVudGx5IHRoZSBsb3cgbGV2ZWwgcXVldXMgZm9yIHRoaXMgaGxpZCAqLwogCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpKyspIHsKKwkJZmlsdGVyZWRbaV0gPSAwOwogCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZ3bC0+bGlua3NbaGxpZF0udHhfcXVldWVbaV0pKSkgewogCQkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX1RYX0ZJTFRFUkVEOwogCQkJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeCA9IC0xOwotCQkJaWVlZTgwMjExX3R4X3N0YXR1cyh3bC0+aHcsIHNrYik7Ci0JCQlmaWx0ZXJlZCsrOworCQkJaWVlZTgwMjExX3R4X3N0YXR1c19uaSh3bC0+aHcsIHNrYik7CisJCQlmaWx0ZXJlZFtpXSsrOwogCQl9CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndsLT53bF9sb2NrLCBmbGFncyk7Ci0Jd2wtPnR4X3F1ZXVlX2NvdW50IC09IGZpbHRlcmVkOworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpKyspCisJCXdsLT50eF9xdWV1ZV9jb3VudFtpXSAtPSBmaWx0ZXJlZFtpXTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwogCiAJd2wxMjcxX2hhbmRsZV90eF9sb3dfd2F0ZXJtYXJrKHdsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3J4LmMKaW5kZXggNzAwOTEwMy4uMDQ1MGZiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3J4LmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgIndsMTJ4eC5oIgogI2luY2x1ZGUgImFjeC5oIgpAQCAtOTUsNiArOTYsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJdTggKmJ1ZjsKIAl1OCBiZWFjb24gPSAwOworCXU4IGlzX2RhdGEgPSAwOwogCiAJLyoKIAkgKiBJbiBQTFQgbW9kZSB3ZSBzZWVtIHRvIGdldCBmcmFtZXMgYW5kIG1hYzgwMjExIHdhcm5zIGFib3V0IHRoZW0sCkBAIC0xMDYsNiArMTA4LDEzIEBACiAJLyogdGhlIGRhdGEgcmVhZCBzdGFydHMgd2l0aCB0aGUgZGVzY3JpcHRvciAqLwogCWRlc2MgPSAoc3RydWN0IHdsMTI3MV9yeF9kZXNjcmlwdG9yICopIGRhdGE7CiAKKwlpZiAoZGVzYy0+cGFja2V0X2NsYXNzID09IFdMMTJYWF9SWF9DTEFTU19MT0dHRVIpIHsKKwkJc2l6ZV90IGxlbiA9IGxlbmd0aCAtIHNpemVvZigqZGVzYyk7CisJCXdsMTJ4eF9jb3B5X2Z3bG9nKHdsLCBkYXRhICsgc2l6ZW9mKCpkZXNjKSwgbGVuKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3bC0+Zndsb2dfd2FpdHEpOworCQlyZXR1cm4gMDsKKwl9CisKIAlzd2l0Y2ggKGRlc2MtPnN0YXR1cyAmIFdMMTI3MV9SWF9ERVNDX1NUQVRVU19NQVNLKSB7CiAJLyogZGlzY2FyZCBjb3JydXB0ZWQgcGFja2V0cyAqLwogCWNhc2UgV0wxMjcxX1JYX0RFU0NfRFJJVkVSX1JYX1FfRkFJTDoKQEAgLTEzNyw2ICsxNDYsOCBAQAogCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKIAlpZiAoaWVlZTgwMjExX2lzX2JlYWNvbihoZHItPmZyYW1lX2NvbnRyb2wpKQogCQliZWFjb24gPSAxOworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9wcmVzZW50KGhkci0+ZnJhbWVfY29udHJvbCkpCisJCWlzX2RhdGEgPSAxOwogCiAJd2wxMjcxX3J4X3N0YXR1cyh3bCwgZGVzYywgSUVFRTgwMjExX1NLQl9SWENCKHNrYiksIGJlYWNvbik7CiAKQEAgLTE0Nyw5ICsxNTgsOSBAQAogCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBkZXNjLT5wYWRfbGVuKTsKIAogCXNrYl9xdWV1ZV90YWlsKCZ3bC0+ZGVmZXJyZWRfcnhfcXVldWUsIHNrYik7Ci0JaWVlZTgwMjExX3F1ZXVlX3dvcmsod2wtPmh3LCAmd2wtPm5ldHN0YWNrX3dvcmspOworCXF1ZXVlX3dvcmsod2wtPmZyZWV6YWJsZV93cSwgJndsLT5uZXRzdGFja193b3JrKTsKIAotCXJldHVybiAwOworCXJldHVybiBpc19kYXRhOwogfQogCiB2b2lkIHdsMTI3MV9yeChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTI3MV9md19jb21tb25fc3RhdHVzICpzdGF0dXMpCkBAIC0xNjIsNiArMTczLDggQEAKIAl1MzIgbWVtX2Jsb2NrOwogCXUzMiBwa3RfbGVuZ3RoOwogCXUzMiBwa3Rfb2Zmc2V0OworCWJvb2wgaXNfYXAgPSAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyk7CisJYm9vbCBoYWRfZGF0YSA9IGZhbHNlOwogCiAJd2hpbGUgKGRydl9yeF9jb3VudGVyICE9IGZ3X3J4X2NvdW50ZXIpIHsKIAkJYnVmX3NpemUgPSAwOwpAQCAtMjE0LDkgKzIyNywxMSBAQAogCQkJICogY29uZGl0aW9ucywgaW4gdGhhdCBjYXNlIHRoZSByZWNlaXZlZCBmcmFtZSB3aWxsIGp1c3QKIAkJCSAqIGJlIGRyb3BwZWQuCiAJCQkgKi8KLQkJCXdsMTI3MV9yeF9oYW5kbGVfZGF0YSh3bCwKLQkJCQkJICAgICAgd2wtPmFnZ3JfYnVmICsgcGt0X29mZnNldCwKLQkJCQkJICAgICAgcGt0X2xlbmd0aCk7CisJCQlpZiAod2wxMjcxX3J4X2hhbmRsZV9kYXRhKHdsLAorCQkJCQkJICB3bC0+YWdncl9idWYgKyBwa3Rfb2Zmc2V0LAorCQkJCQkJICBwa3RfbGVuZ3RoKSA9PSAxKQorCQkJCWhhZF9kYXRhID0gdHJ1ZTsKKwogCQkJd2wtPnJ4X2NvdW50ZXIrKzsKIAkJCWRydl9yeF9jb3VudGVyKys7CiAJCQlkcnZfcnhfY291bnRlciAmPSBOVU1fUlhfUEtUX0RFU0NfTU9EX01BU0s7CkBAIC0yMzAsNiArMjQ1LDIwIEBACiAJICovCiAJaWYgKHdsLT5xdWlya3MgJiBXTDEyWFhfUVVJUktfRU5EX09GX1RSQU5TQUNUSU9OKQogCQl3bDEyNzFfd3JpdGUzMih3bCwgUlhfRFJJVkVSX0NPVU5URVJfQUREUkVTUywgd2wtPnJ4X2NvdW50ZXIpOworCisJaWYgKCFpc19hcCAmJiB3bC0+Y29uZi5yeF9zdHJlYW1pbmcuaW50ZXJ2YWwgJiYgaGFkX2RhdGEgJiYKKwkgICAgKHdsLT5jb25mLnJ4X3N0cmVhbWluZy5hbHdheXMgfHwKKwkgICAgIHRlc3RfYml0KFdMMTI3MV9GTEFHX1NPRlRfR0VNSU5JLCAmd2wtPmZsYWdzKSkpIHsKKwkJdTMyIHRpbWVvdXQgPSB3bC0+Y29uZi5yeF9zdHJlYW1pbmcuZHVyYXRpb247CisKKwkJLyogcmVzdGFydCByeCBzdHJlYW1pbmcgKi8KKwkJaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsLT5mbGFncykpCisJCQlpZWVlODAyMTFfcXVldWVfd29yayh3bC0+aHcsCisJCQkJCSAgICAgJndsLT5yeF9zdHJlYW1pbmdfZW5hYmxlX3dvcmspOworCisJCW1vZF90aW1lcigmd2wtPnJ4X3N0cmVhbWluZ190aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOworCX0KIH0KIAogdm9pZCB3bDEyNzFfc2V0X2RlZmF1bHRfZmlsdGVycyhzdHJ1Y3Qgd2wxMjcxICp3bCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9yeC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3J4LmgKaW5kZXggNzVmYWJmOC4uYzg4ZTNmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3J4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3J4LmgKQEAgLTk3LDYgKzk3LDE4IEBACiAjZGVmaW5lIFJYX0JVRl9TSVpFX01BU0sgICAgICAweEZGRjAwCiAjZGVmaW5lIFJYX0JVRl9TSVpFX1NISUZUX0RJViA2CiAKK2VudW0geworCVdMMTJYWF9SWF9DTEFTU19VTktOT1dOLAorCVdMMTJYWF9SWF9DTEFTU19NQU5BR0VNRU5ULAorCVdMMTJYWF9SWF9DTEFTU19EQVRBLAorCVdMMTJYWF9SWF9DTEFTU19RT1NfREFUQSwKKwlXTDEyWFhfUlhfQ0xBU1NfQkNOX1BSQlJTUCwKKwlXTDEyWFhfUlhfQ0xBU1NfRUFQT0wsCisJV0wxMlhYX1JYX0NMQVNTX0JBX0VWRU5ULAorCVdMMTJYWF9SWF9DTEFTU19BTVNEVSwKKwlXTDEyWFhfUlhfQ0xBU1NfTE9HR0VSLAorfTsKKwogc3RydWN0IHdsMTI3MV9yeF9kZXNjcmlwdG9yIHsKIAlfX2xlMTYgbGVuZ3RoOwogCXU4ICBzdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uYwppbmRleCA1NmY3NmFiLi5lZGZlMDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zY2FuLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAogCWlmICh3bC0+c2Nhbi5mYWlsZWQpIHsKIAkJd2wxMjcxX2luZm8oIlNjYW4gY29tcGxldGVkIGR1ZSB0byBlcnJvci4iKTsKLQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsod2wtPmh3LCAmd2wtPnJlY292ZXJ5X3dvcmspOworCQl3bDEyeHhfcXVldWVfcmVjb3Zlcnlfd29yayh3bCk7CiAJfQogCiBvdXQ6CkBAIC0zMjEsMTIgKzMyMSwzOSBAQAogCXJldHVybiAwOwogfQogCitpbnQgd2wxMjcxX3NjYW5fc3RvcChzdHJ1Y3Qgd2wxMjcxICp3bCkKK3sKKwlzdHJ1Y3Qgd2wxMjcxX2NtZF9oZWFkZXIgKmNtZCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoV0FSTl9PTih3bC0+c2Nhbi5zdGF0ZSA9PSBXTDEyNzFfU0NBTl9TVEFURV9JRExFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAiY21kIHNjYW4gc3RvcCIpOworCisJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmICghY21kKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHdsMTI3MV9jbWRfc2VuZCh3bCwgQ01EX1NUT1BfU0NBTiwgY21kLAorCQkJICAgICAgc2l6ZW9mKCpjbWQpLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQl3bDEyNzFfZXJyb3IoImNtZCBzdG9wX3NjYW4gZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlrZnJlZShjbWQpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQKIHdsMTI3MV9zY2FuX2dldF9zY2hlZF9zY2FuX2NoYW5uZWxzKHN0cnVjdCB3bDEyNzEgKndsLAogCQkJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXEsCiAJCQkJICAgIHN0cnVjdCBjb25uX3NjYW5fY2hfcGFyYW1zICpjaGFubmVscywKIAkJCQkgICAgdTMyIGJhbmQsIGJvb2wgcmFkYXIsIGJvb2wgcGFzc2l2ZSwKLQkJCQkgICAgaW50IHN0YXJ0KQorCQkJCSAgICBpbnQgc3RhcnQsIGludCBtYXhfY2hhbm5lbHMpCiB7CiAJc3RydWN0IGNvbmZfc2NoZWRfc2Nhbl9zZXR0aW5ncyAqYyA9ICZ3bC0+Y29uZi5zY2hlZF9zY2FuOwogCWludCBpLCBqOwpAQCAtMzM0LDcgKzM2MSw3IEBACiAJYm9vbCBmb3JjZV9wYXNzaXZlID0gIXJlcS0+bl9zc2lkczsKIAogCWZvciAoaSA9IDAsIGogPSBzdGFydDsKLQkgICAgIGkgPCByZXEtPm5fY2hhbm5lbHMgJiYgaiA8IE1BWF9DSEFOTkVMU19BTExfQkFORFM7CisJICAgICBpIDwgcmVxLT5uX2NoYW5uZWxzICYmIGogPCBtYXhfY2hhbm5lbHM7CiAJICAgICBpKyspIHsKIAkJZmxhZ3MgPSByZXEtPmNoYW5uZWxzW2ldLT5mbGFnczsKIApAQCAtMzgwLDQ2ICs0MDcsNDIgQEAKIAlyZXR1cm4gaiAtIHN0YXJ0OwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgYm9vbAogd2wxMjcxX3NjYW5fc2NoZWRfc2Nhbl9jaGFubmVscyhzdHJ1Y3Qgd2wxMjcxICp3bCwKIAkJCQlzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXEsCiAJCQkJc3RydWN0IHdsMTI3MV9jbWRfc2NoZWRfc2Nhbl9jb25maWcgKmNmZykKIHsKLQlpbnQgaWR4ID0gMDsKLQogCWNmZy0+cGFzc2l2ZVswXSA9Ci0JCXdsMTI3MV9zY2FuX2dldF9zY2hlZF9zY2FuX2NoYW5uZWxzKHdsLCByZXEsIGNmZy0+Y2hhbm5lbHMsCisJCXdsMTI3MV9zY2FuX2dldF9zY2hlZF9zY2FuX2NoYW5uZWxzKHdsLCByZXEsIGNmZy0+Y2hhbm5lbHNfMiwKIAkJCQkJCSAgICBJRUVFODAyMTFfQkFORF8yR0haLAotCQkJCQkJICAgIGZhbHNlLCB0cnVlLCBpZHgpOwotCWlkeCArPSBjZmctPnBhc3NpdmVbMF07Ci0KKwkJCQkJCSAgICBmYWxzZSwgdHJ1ZSwgMCwKKwkJCQkJCSAgICBNQVhfQ0hBTk5FTFNfMkdIWik7CiAJY2ZnLT5hY3RpdmVbMF0gPQotCQl3bDEyNzFfc2Nhbl9nZXRfc2NoZWRfc2Nhbl9jaGFubmVscyh3bCwgcmVxLCBjZmctPmNoYW5uZWxzLAorCQl3bDEyNzFfc2Nhbl9nZXRfc2NoZWRfc2Nhbl9jaGFubmVscyh3bCwgcmVxLCBjZmctPmNoYW5uZWxzXzIsCiAJCQkJCQkgICAgSUVFRTgwMjExX0JBTkRfMkdIWiwKLQkJCQkJCSAgICBmYWxzZSwgZmFsc2UsIGlkeCk7Ci0JLyoKLQkgKiA1R0h6IGNoYW5uZWxzIGFsd2F5cyBzdGFydCBhdCBwb3NpdGlvbiAxNCwgbm90IGltbWVkaWF0ZWx5Ci0JICogYWZ0ZXIgdGhlIGxhc3QgMi40R0h6IGNoYW5uZWwKLQkgKi8KLQlpZHggPSAxNDsKLQorCQkJCQkJICAgIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgICBjZmctPnBhc3NpdmVbMF0sCisJCQkJCQkgICAgTUFYX0NIQU5ORUxTXzJHSFopOwogCWNmZy0+cGFzc2l2ZVsxXSA9Ci0JCXdsMTI3MV9zY2FuX2dldF9zY2hlZF9zY2FuX2NoYW5uZWxzKHdsLCByZXEsIGNmZy0+Y2hhbm5lbHMsCisJCXdsMTI3MV9zY2FuX2dldF9zY2hlZF9zY2FuX2NoYW5uZWxzKHdsLCByZXEsIGNmZy0+Y2hhbm5lbHNfNSwKIAkJCQkJCSAgICBJRUVFODAyMTFfQkFORF81R0haLAotCQkJCQkJICAgIGZhbHNlLCB0cnVlLCBpZHgpOwotCWlkeCArPSBjZmctPnBhc3NpdmVbMV07Ci0KKwkJCQkJCSAgICBmYWxzZSwgdHJ1ZSwgMCwKKwkJCQkJCSAgICBNQVhfQ0hBTk5FTFNfNUdIWik7CiAJY2ZnLT5kZnMgPQotCQl3bDEyNzFfc2Nhbl9nZXRfc2NoZWRfc2Nhbl9jaGFubmVscyh3bCwgcmVxLCBjZmctPmNoYW5uZWxzLAorCQl3bDEyNzFfc2Nhbl9nZXRfc2NoZWRfc2Nhbl9jaGFubmVscyh3bCwgcmVxLCBjZmctPmNoYW5uZWxzXzUsCiAJCQkJCQkgICAgSUVFRTgwMjExX0JBTkRfNUdIWiwKLQkJCQkJCSAgICB0cnVlLCB0cnVlLCBpZHgpOwotCWlkeCArPSBjZmctPmRmczsKLQorCQkJCQkJICAgIHRydWUsIHRydWUsCisJCQkJCQkgICAgY2ZnLT5wYXNzaXZlWzFdLAorCQkJCQkJICAgIE1BWF9DSEFOTkVMU181R0haKTsKIAljZmctPmFjdGl2ZVsxXSA9Ci0JCXdsMTI3MV9zY2FuX2dldF9zY2hlZF9zY2FuX2NoYW5uZWxzKHdsLCByZXEsIGNmZy0+Y2hhbm5lbHMsCisJCXdsMTI3MV9zY2FuX2dldF9zY2hlZF9zY2FuX2NoYW5uZWxzKHdsLCByZXEsIGNmZy0+Y2hhbm5lbHNfNSwKIAkJCQkJCSAgICBJRUVFODAyMTFfQkFORF81R0haLAotCQkJCQkJICAgIGZhbHNlLCBmYWxzZSwgaWR4KTsKLQlpZHggKz0gY2ZnLT5hY3RpdmVbMV07CisJCQkJCQkgICAgZmFsc2UsIGZhbHNlLAorCQkJCQkJICAgIGNmZy0+cGFzc2l2ZVsxXSArIGNmZy0+ZGZzLAorCQkJCQkJICAgIE1BWF9DSEFOTkVMU181R0haKTsKKwkvKiA4MDIuMTFqIGNoYW5uZWxzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCAqLworCWNmZy0+cGFzc2l2ZVsyXSA9IDA7CisJY2ZnLT5hY3RpdmVbMl0gPSAwOwogCiAJd2wxMjcxX2RlYnVnKERFQlVHX1NDQU4sICIgICAgMi40R0h6OiBhY3RpdmUgJWQgcGFzc2l2ZSAlZCIsCiAJCSAgICAgY2ZnLT5hY3RpdmVbMF0sIGNmZy0+cGFzc2l2ZVswXSk7CkBAIC00MjcsNyArNDUwLDkgQEAKIAkJICAgICBjZmctPmFjdGl2ZVsxXSwgY2ZnLT5wYXNzaXZlWzFdKTsKIAl3bDEyNzFfZGVidWcoREVCVUdfU0NBTiwgIiAgICBERlM6ICVkIiwgY2ZnLT5kZnMpOwogCi0JcmV0dXJuIGlkeDsKKwlyZXR1cm4gIGNmZy0+cGFzc2l2ZVswXSB8fCBjZmctPmFjdGl2ZVswXSB8fAorCQljZmctPnBhc3NpdmVbMV0gfHwgY2ZnLT5hY3RpdmVbMV0gfHwgY2ZnLT5kZnMgfHwKKwkJY2ZnLT5wYXNzaXZlWzJdIHx8IGNmZy0+YWN0aXZlWzJdOwogfQogCiBpbnQgd2wxMjcxX3NjYW5fc2NoZWRfc2Nhbl9jb25maWcoc3RydWN0IHdsMTI3MSAqd2wsCkBAIC00MzYsNyArNDYxLDcgQEAKIHsKIAlzdHJ1Y3Qgd2wxMjcxX2NtZF9zY2hlZF9zY2FuX2NvbmZpZyAqY2ZnID0gTlVMTDsKIAlzdHJ1Y3QgY29uZl9zY2hlZF9zY2FuX3NldHRpbmdzICpjID0gJndsLT5jb25mLnNjaGVkX3NjYW47Ci0JaW50IGksIHRvdGFsX2NoYW5uZWxzLCByZXQ7CisJaW50IGksIHJldDsKIAlib29sIGZvcmNlX3Bhc3NpdmUgPSAhcmVxLT5uX3NzaWRzOwogCiAJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCBzY2hlZF9zY2FuIHNjYW4gY29uZmlnIik7CkBAIC00NzEsOCArNDk2LDcgQEAKIAkJY2ZnLT5zc2lkX2xlbiA9IDA7CiAJfQogCi0JdG90YWxfY2hhbm5lbHMgPSB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX2NoYW5uZWxzKHdsLCByZXEsIGNmZyk7Ci0JaWYgKHRvdGFsX2NoYW5uZWxzID09IDApIHsKKwlpZiAoIXdsMTI3MV9zY2FuX3NjaGVkX3NjYW5fY2hhbm5lbHMod2wsIHJlcSwgY2ZnKSkgewogCQl3bDEyNzFfZXJyb3IoInNjYW4gY2hhbm5lbCBsaXN0IGlzIGVtcHR5Iik7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zY2FuLmgKaW5kZXggYTBiNmM1ZC4uZDg4MmU0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5oCkBAIC0yOCw2ICsyOCw3IEBACiAKIGludCB3bDEyNzFfc2NhbihzdHJ1Y3Qgd2wxMjcxICp3bCwgY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKIAkJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKTsKK2ludCB3bDEyNzFfc2Nhbl9zdG9wKHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyNzFfc2Nhbl9idWlsZF9wcm9iZV9yZXEoc3RydWN0IHdsMTI3MSAqd2wsCiAJCQkJY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKIAkJCQljb25zdCB1OCAqaWUsIHNpemVfdCBpZV9sZW4sIHU4IGJhbmQpOwpAQCAtMTEyLDE5ICsxMTMsMTQgQEAKIAlfX2xlMzIgdGltZW91dDsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTUFYX0NIQU5ORUxTX0FMTF9CQU5EUyA0MQorI2RlZmluZSBNQVhfQ0hBTk5FTFNfMkdIWgkxNAorI2RlZmluZSBNQVhfQ0hBTk5FTFNfNUdIWgkyMworI2RlZmluZSBNQVhfQ0hBTk5FTFNfNEdIWgk0CisKICNkZWZpbmUgU0NBTl9NQVhfQ1lDTEVfSU5URVJWQUxTIDE2CiAjZGVmaW5lIFNDQU5fTUFYX0JBTkRTIDMKIAogZW51bSB7Ci0JU0NBTl9DSEFOTkVMX1RZUEVfMkdIWl9QQVNTSVZFLAotCVNDQU5fQ0hBTk5FTF9UWVBFXzJHSFpfQUNUSVZFLAotCVNDQU5fQ0hBTk5FTF9UWVBFXzVHSFpfUEFTU0lWRSwKLQlTQ0FOX0NIQU5ORUxfVFlQRV81R0haX0FDVElWRSwKLQlTQ0FOX0NIQU5ORUxfVFlQRV81R0haX0RGUywKLX07Ci0KLWVudW0gewogCVNDQU5fU1NJRF9GSUxURVJfQU5ZICAgICAgPSAwLAogCVNDQU5fU1NJRF9GSUxURVJfU1BFQ0lGSUMgPSAxLAogCVNDQU5fU1NJRF9GSUxURVJfTElTVCAgICAgPSAyLApAQCAtMTgyLDcgKzE3OCw5IEBACiAKIAl1OCBwYWRkaW5nWzNdOwogCi0Jc3RydWN0IGNvbm5fc2Nhbl9jaF9wYXJhbXMgY2hhbm5lbHNbTUFYX0NIQU5ORUxTX0FMTF9CQU5EU107CisJc3RydWN0IGNvbm5fc2Nhbl9jaF9wYXJhbXMgY2hhbm5lbHNfMltNQVhfQ0hBTk5FTFNfMkdIWl07CisJc3RydWN0IGNvbm5fc2Nhbl9jaF9wYXJhbXMgY2hhbm5lbHNfNVtNQVhfQ0hBTk5FTFNfNUdIWl07CisJc3RydWN0IGNvbm5fc2Nhbl9jaF9wYXJhbXMgY2hhbm5lbHNfNFtNQVhfQ0hBTk5FTFNfNEdIWl07CiB9IF9fcGFja2VkOwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Rpby5jCmluZGV4IDUzNmU1MDYuLjVjZjE4YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NkaW8uYwpAQCAtMjMsNyArMjMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvY3JjNy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9faWRzLmg+CkBAIC00NSw3ICs0NCw3IEBACiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX1RJX1dMMTI3MQkweDQwNzYKICNlbmRpZgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkIHdsMTI3MV9kZXZpY2VzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkIHdsMTI3MV9kZXZpY2VzW10gX19kZXZpbml0Y29uc3QgPSB7CiAJeyBTRElPX0RFVklDRShTRElPX1ZFTkRPUl9JRF9USSwgU0RJT19ERVZJQ0VfSURfVElfV0wxMjcxKSB9LAogCXt9CiB9OwpAQCAtMTA3LDE0ICsxMDYsNiBAQAogCWVuYWJsZV9pcnEod2wtPmlycSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsMTI3MV9zZGlvX3Jlc2V0KHN0cnVjdCB3bDEyNzEgKndsKQotewotfQotCi1zdGF0aWMgdm9pZCB3bDEyNzFfc2Rpb19pbml0KHN0cnVjdCB3bDEyNzEgKndsKQotewotfQotCiBzdGF0aWMgdm9pZCB3bDEyNzFfc2Rpb19yYXdfcmVhZChzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1ZiwKIAkJCQkgc2l6ZV90IGxlbiwgYm9vbCBmaXhlZCkKIHsKQEAgLTE3MCwxNSArMTYxLDE3IEBACiAJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IHdsX3RvX2Z1bmMod2wpOwogCWludCByZXQ7CiAKLQkvKiBNYWtlIHN1cmUgdGhlIGNhcmQgd2lsbCBub3QgYmUgcG93ZXJlZCBvZmYgYnkgcnVudGltZSBQTSAqLwotCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJmZ1bmMtPmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JLyogUnVudGltZSBQTSBtaWdodCBiZSBkaXNhYmxlZCwgc28gcG93ZXIgdXAgdGhlIGNhcmQgbWFudWFsbHkgKi8KLQlyZXQgPSBtbWNfcG93ZXJfcmVzdG9yZV9ob3N0KGZ1bmMtPmNhcmQtPmhvc3QpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKKwkvKiBJZiBlbmFibGVkLCB0ZWxsIHJ1bnRpbWUgUE0gbm90IHRvIHBvd2VyIG9mZiB0aGUgY2FyZCAqLworCWlmIChwbV9ydW50aW1lX2VuYWJsZWQoJmZ1bmMtPmRldikpIHsKKwkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmZnVuYy0+ZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCS8qIFJ1bnRpbWUgUE0gaXMgZGlzYWJsZWQ6IHBvd2VyIHVwIHRoZSBjYXJkIG1hbnVhbGx5ICovCisJCXJldCA9IG1tY19wb3dlcl9yZXN0b3JlX2hvc3QoZnVuYy0+Y2FyZC0+aG9zdCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQogCiAJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOwogCXNkaW9fZW5hYmxlX2Z1bmMoZnVuYyk7CkBAIC0xOTUsMTMgKzE4OCwxNiBAQAogCXNkaW9fZGlzYWJsZV9mdW5jKGZ1bmMpOwogCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOwogCi0JLyogUnVudGltZSBQTSBtaWdodCBiZSBkaXNhYmxlZCwgc28gcG93ZXIgb2ZmIHRoZSBjYXJkIG1hbnVhbGx5ICovCisJLyogUG93ZXIgb2ZmIHRoZSBjYXJkIG1hbnVhbGx5LCBldmVuIGlmIHJ1bnRpbWUgUE0gaXMgZW5hYmxlZC4gKi8KIAlyZXQgPSBtbWNfcG93ZXJfc2F2ZV9ob3N0KGZ1bmMtPmNhcmQtPmhvc3QpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JLyogTGV0IHJ1bnRpbWUgUE0ga25vdyB0aGUgY2FyZCBpcyBwb3dlcmVkIG9mZiAqLwotCXJldHVybiBwbV9ydW50aW1lX3B1dF9zeW5jKCZmdW5jLT5kZXYpOworCS8qIElmIGVuYWJsZWQsIGxldCBydW50aW1lIFBNIGtub3cgdGhlIGNhcmQgaXMgcG93ZXJlZCBvZmYgKi8KKwlpZiAocG1fcnVudGltZV9lbmFibGVkKCZmdW5jLT5kZXYpKQorCQlyZXQgPSBwbV9ydW50aW1lX3B1dF9zeW5jKCZmdW5jLT5kZXYpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCB3bDEyNzFfc2Rpb19zZXRfcG93ZXIoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQpAQCAtMjE1LDggKzIxMSw2IEBACiBzdGF0aWMgc3RydWN0IHdsMTI3MV9pZl9vcGVyYXRpb25zIHNkaW9fb3BzID0gewogCS5yZWFkCQk9IHdsMTI3MV9zZGlvX3Jhd19yZWFkLAogCS53cml0ZQkJPSB3bDEyNzFfc2Rpb19yYXdfd3JpdGUsCi0JLnJlc2V0CQk9IHdsMTI3MV9zZGlvX3Jlc2V0LAotCS5pbml0CQk9IHdsMTI3MV9zZGlvX2luaXQsCiAJLnBvd2VyCQk9IHdsMTI3MV9zZGlvX3NldF9wb3dlciwKIAkuZGV2CQk9IHdsMTI3MV9zZGlvX3dsX3RvX2RldiwKIAkuZW5hYmxlX2lycQk9IHdsMTI3MV9zZGlvX2VuYWJsZV9pbnRlcnJ1cHRzLApAQCAtMjc4LDE4ICsyNzIsMjAgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQllbmFibGVfaXJxX3dha2Uod2wtPmlycSk7Ci0JZGV2aWNlX2luaXRfd2FrZXVwKHdsMTI3MV9zZGlvX3dsX3RvX2Rldih3bCksIDEpOworCXJldCA9IGVuYWJsZV9pcnFfd2FrZSh3bC0+aXJxKTsKKwlpZiAoIXJldCkgeworCQl3bC0+aXJxX3dha2VfZW5hYmxlZCA9IHRydWU7CisJCWRldmljZV9pbml0X3dha2V1cCh3bDEyNzFfc2Rpb193bF90b19kZXYod2wpLCAxKTsKIAorCQkvKiBpZiBzZGlvIGNhbiBrZWVwIHBvd2VyIHdoaWxlIGhvc3QgaXMgc3VzcGVuZGVkLCBlbmFibGUgd293ICovCisJCW1tY2ZsYWdzID0gc2Rpb19nZXRfaG9zdF9wbV9jYXBzKGZ1bmMpOworCQl3bDEyNzFfZGVidWcoREVCVUdfU0RJTywgInNkaW8gUE0gY2FwcyA9IDB4JXgiLCBtbWNmbGFncyk7CisKKwkJaWYgKG1tY2ZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpCisJCQlody0+d2lwaHktPndvd2xhbi5mbGFncyA9IFdJUEhZX1dPV0xBTl9BTlk7CisJfQogCWRpc2FibGVfaXJxKHdsLT5pcnEpOwogCi0JLyogaWYgc2RpbyBjYW4ga2VlcCBwb3dlciB3aGlsZSBob3N0IGlzIHN1c3BlbmRlZCwgZW5hYmxlIHdvdyAqLwotCW1tY2ZsYWdzID0gc2Rpb19nZXRfaG9zdF9wbV9jYXBzKGZ1bmMpOwotCXdsMTI3MV9kZWJ1ZyhERUJVR19TRElPLCAic2RpbyBQTSBjYXBzID0gMHgleCIsIG1tY2ZsYWdzKTsKLQotCWlmIChtbWNmbGFncyAmIE1NQ19QTV9LRUVQX1BPV0VSKQotCQlody0+d2lwaHktPndvd2xhbi5mbGFncyA9IFdJUEhZX1dPV0xBTl9BTlk7Ci0KIAlyZXQgPSB3bDEyNzFfaW5pdF9pZWVlODAyMTEod2wpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2lycTsKQEAgLTMwMyw4ICsyOTksNiBAQAogCS8qIFRlbGwgUE0gY29yZSB0aGF0IHdlIGRvbid0IG5lZWQgdGhlIGNhcmQgdG8gYmUgcG93ZXJlZCBub3cgKi8KIAlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJmZ1bmMtPmRldik7CiAKLQl3bDEyNzFfbm90aWNlKCJpbml0aWFsaXplZCIpOwotCiAJcmV0dXJuIDA7CiAKICBvdXRfaXJxOgpAQCAtMzI0LDggKzMxOCwxMCBAQAogCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKCZmdW5jLT5kZXYpOwogCiAJd2wxMjcxX3VucmVnaXN0ZXJfaHcod2wpOwotCWRldmljZV9pbml0X3dha2V1cCh3bDEyNzFfc2Rpb193bF90b19kZXYod2wpLCAwKTsKLQlkaXNhYmxlX2lycV93YWtlKHdsLT5pcnEpOworCWlmICh3bC0+aXJxX3dha2VfZW5hYmxlZCkgeworCQlkZXZpY2VfaW5pdF93YWtldXAod2wxMjcxX3NkaW9fd2xfdG9fZGV2KHdsKSwgMCk7CisJCWRpc2FibGVfaXJxX3dha2Uod2wtPmlycSk7CisJfQogCWZyZWVfaXJxKHdsLT5pcnEsIHdsKTsKIAl3bDEyNzFfZnJlZV9odyh3bCk7CiB9CkBAIC00MDIsMjMgKzM5OCwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB3bDEyNzFfaW5pdCh2b2lkKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBzZGlvX3JlZ2lzdGVyX2RyaXZlcigmd2wxMjcxX3NkaW9fZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkgewotCQl3bDEyNzFfZXJyb3IoImZhaWxlZCB0byByZWdpc3RlciBzZGlvIGRyaXZlcjogJWQiLCByZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLW91dDoKLQlyZXR1cm4gcmV0OworCXJldHVybiBzZGlvX3JlZ2lzdGVyX2RyaXZlcigmd2wxMjcxX3NkaW9fZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHdsMTI3MV9leGl0KHZvaWQpCiB7CiAJc2Rpb191bnJlZ2lzdGVyX2RyaXZlcigmd2wxMjcxX3NkaW9fZHJpdmVyKTsKLQotCXdsMTI3MV9ub3RpY2UoInVubG9hZGVkIik7CiB9CiAKIG1vZHVsZV9pbml0KHdsMTI3MV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zcGkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zcGkuYwppbmRleCA1MTY2MmJiLi5lMGIzNzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NwaS5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcmM3Lmg+CkBAIC00MzUsOCArNDM2LDYgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF9pcnE7CiAKLQl3bDEyNzFfbm90aWNlKCJpbml0aWFsaXplZCIpOwotCiAJcmV0dXJuIDA7CiAKICBvdXRfaXJxOgpAQCAtNDczLDIzICs0NzIsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgd2wxMjcxX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmd2wxMjcxX3NwaV9kcml2ZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigiZmFpbGVkIHRvIHJlZ2lzdGVyIHNwaSBkcml2ZXI6ICVkIiwgcmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmd2wxMjcxX3NwaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgd2wxMjcxX2V4aXQodm9pZCkKIHsKIAlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJndsMTI3MV9zcGlfZHJpdmVyKTsKLQotCXdsMTI3MV9ub3RpY2UoInVubG9hZGVkIik7CiB9CiAKIG1vZHVsZV9pbml0KHdsMTI3MV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90ZXN0bW9kZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3Rlc3Rtb2RlLmMKaW5kZXggZGEzNTFkNy4uNWQ1ZTFlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3Rlc3Rtb2RlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3Rlc3Rtb2RlLmMKQEAgLTI2MCw3ICsyNjAsNyBAQAogewogCXdsMTI3MV9kZWJ1ZyhERUJVR19URVNUTU9ERSwgInRlc3Rtb2RlIGNtZCByZWNvdmVyIik7CiAKLQlpZWVlODAyMTFfcXVldWVfd29yayh3bC0+aHcsICZ3bC0+cmVjb3Zlcnlfd29yayk7CisJd2wxMnh4X3F1ZXVlX3JlY292ZXJ5X3dvcmsod2wpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90eC5jCmluZGV4IGNhM2FiMWMuLjQ4ZmRlOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90eC5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAl1MzIgdG90YWxfbGVuID0gc2tiLT5sZW4gKyBzaXplb2Yoc3RydWN0IHdsMTI3MV90eF9od19kZXNjcikgKyBleHRyYTsKIAl1MzIgbGVuOwogCXUzMiB0b3RhbF9ibG9ja3M7Ci0JaW50IGlkLCByZXQgPSAtRUJVU1k7CisJaW50IGlkLCByZXQgPSAtRUJVU1ksIGFjOwogCXUzMiBzcGFyZV9ibG9ja3M7CiAKIAlpZiAodW5saWtlbHkod2wtPnF1aXJrcyAmIFdMMTJYWF9RVUlSS19VU0VfMl9TUEFSRV9CTE9DS1MpKQpAQCAtMjA2LDcgKzIwNiw5IEBACiAJCWRlc2MtPmlkID0gaWQ7CiAKIAkJd2wtPnR4X2Jsb2Nrc19hdmFpbGFibGUgLT0gdG90YWxfYmxvY2tzOwotCQl3bC0+dHhfYWxsb2NhdGVkX2Jsb2NrcyArPSB0b3RhbF9ibG9ja3M7CisKKwkJYWMgPSB3bDEyNzFfdHhfZ2V0X3F1ZXVlKHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKKwkJd2wtPnR4X2FsbG9jYXRlZF9ibG9ja3NbYWNdICs9IHRvdGFsX2Jsb2NrczsKIAogCQlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykKIAkJCXdsLT5saW5rc1tobGlkXS5hbGxvY2F0ZWRfYmxrcyArPSB0b3RhbF9ibG9ja3M7CkBAIC0zODMsNiArMzg1LDggQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAorCXdsMTI3MV90eF9maWxsX2hkcih3bCwgc2tiLCBleHRyYSwgaW5mbywgaGxpZCk7CisKIAlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykgewogCQl3bDEyNzFfdHhfYXBfdXBkYXRlX2luY29ubmVjdGlvbl9zdGEod2wsIHNrYik7CiAJCXdsMTI3MV90eF9yZWd1bGF0ZV9saW5rKHdsLCBobGlkKTsKQEAgLTM5MCw4ICszOTQsNiBAQAogCQl3bDEyNzFfdHhfdXBkYXRlX2ZpbHRlcnMod2wsIHNrYik7CiAJfQogCi0Jd2wxMjcxX3R4X2ZpbGxfaGRyKHdsLCBza2IsIGV4dHJhLCBpbmZvLCBobGlkKTsKLQogCS8qCiAJICogVGhlIGxlbmd0aCBvZiBlYWNoIHBhY2tldCBpcyBzdG9yZWQgaW4gdGVybXMgb2YKIAkgKiB3b3Jkcy4gVGh1cywgd2UgbXVzdCBwYWQgdGhlIHNrYiBkYXRhIHRvIG1ha2Ugc3VyZSBpdHMKQEAgLTQ0MiwzNyArNDQ0LDYyIEBACiB2b2lkIHdsMTI3MV9oYW5kbGVfdHhfbG93X3dhdGVybWFyayhzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOwogCi0JaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX1RYX1FVRVVFX1NUT1BQRUQsICZ3bC0+ZmxhZ3MpICYmCi0JICAgIHdsLT50eF9xdWV1ZV9jb3VudCA8PSBXTDEyNzFfVFhfUVVFVUVfTE9XX1dBVEVSTUFSSykgewotCQkvKiBmaXJtd2FyZSBidWZmZXIgaGFzIHNwYWNlLCByZXN0YXJ0IHF1ZXVlcyAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQkJaWVlZTgwMjExX3dha2VfcXVldWVzKHdsLT5odyk7Ci0JCWNsZWFyX2JpdChXTDEyNzFfRkxBR19UWF9RVUVVRV9TVE9QUEVELCAmd2wtPmZsYWdzKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKSB7CisJCWlmICh0ZXN0X2JpdChpLCAmd2wtPnN0b3BwZWRfcXVldWVzX21hcCkgJiYKKwkJICAgIHdsLT50eF9xdWV1ZV9jb3VudFtpXSA8PSBXTDEyNzFfVFhfUVVFVUVfTE9XX1dBVEVSTUFSSykgeworCQkJLyogZmlybXdhcmUgYnVmZmVyIGhhcyBzcGFjZSwgcmVzdGFydCBxdWV1ZXMgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOworCQkJaWVlZTgwMjExX3dha2VfcXVldWUod2wtPmh3LAorCQkJCQkgICAgIHdsMTI3MV90eF9nZXRfbWFjODAyMTFfcXVldWUoaSkpOworCQkJY2xlYXJfYml0KGksICZ3bC0+c3RvcHBlZF9xdWV1ZXNfbWFwKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsLT53bF9sb2NrLCBmbGFncyk7CisJCX0KIAl9CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp3bDEyNzFfc2VsZWN0X3F1ZXVlKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWVzKQoreworCWludCBpLCBxID0gLTE7CisJdTMyIG1pbl9ibGtzID0gMHhmZmZmZmZmZjsKKworCS8qCisJICogRmluZCBhIG5vbi1lbXB0eSBhYyB3aGVyZToKKwkgKiAxLiBUaGVyZSBhcmUgcGFja2V0cyB0byB0cmFuc21pdAorCSAqIDIuIFRoZSBGVyBoYXMgdGhlIGxlYXN0IGFsbG9jYXRlZCBibG9ja3MKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKQorCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmcXVldWVzW2ldKSAmJgorCQkgICAgKHdsLT50eF9hbGxvY2F0ZWRfYmxvY2tzW2ldIDwgbWluX2Jsa3MpKSB7CisJCQlxID0gaTsKKwkJCW1pbl9ibGtzID0gd2wtPnR4X2FsbG9jYXRlZF9ibG9ja3NbcV07CisJCX0KKworCWlmIChxID09IC0xKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmcXVldWVzW3FdOworfQorCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKndsMTI3MV9zdGFfc2tiX2RlcXVldWUoc3RydWN0IHdsMTI3MSAqd2wpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxdWV1ZTsKIAotCXNrYiA9IHNrYl9kZXF1ZXVlKCZ3bC0+dHhfcXVldWVbQ09ORl9UWF9BQ19WT10pOwotCWlmIChza2IpCisJcXVldWUgPSB3bDEyNzFfc2VsZWN0X3F1ZXVlKHdsLCB3bC0+dHhfcXVldWUpOworCWlmICghcXVldWUpCiAJCWdvdG8gb3V0OwotCXNrYiA9IHNrYl9kZXF1ZXVlKCZ3bC0+dHhfcXVldWVbQ09ORl9UWF9BQ19WSV0pOwotCWlmIChza2IpCi0JCWdvdG8gb3V0OwotCXNrYiA9IHNrYl9kZXF1ZXVlKCZ3bC0+dHhfcXVldWVbQ09ORl9UWF9BQ19CRV0pOwotCWlmIChza2IpCi0JCWdvdG8gb3V0OwotCXNrYiA9IHNrYl9kZXF1ZXVlKCZ3bC0+dHhfcXVldWVbQ09ORl9UWF9BQ19CS10pOworCisJc2tiID0gc2tiX2RlcXVldWUocXVldWUpOwogCiBvdXQ6CiAJaWYgKHNrYikgeworCQlpbnQgcSA9IHdsMTI3MV90eF9nZXRfcXVldWUoc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQkJd2wtPnR4X3F1ZXVlX2NvdW50LS07CisJCXdsLT50eF9xdWV1ZV9jb3VudFtxXS0tOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwogCX0KIApAQCAtNDg0LDYgKzUxMSw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaSwgaCwgc3RhcnRfaGxpZDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxdWV1ZTsKIAogCS8qIHN0YXJ0IGZyb20gdGhlIGxpbmsgYWZ0ZXIgdGhlIGxhc3Qgb25lICovCiAJc3RhcnRfaGxpZCA9ICh3bC0+bGFzdF90eF9obGlkICsgMSkgJSBBUF9NQVhfTElOS1M7CkBAIC00OTIsMjUgKzUyMCwyNSBAQAogCWZvciAoaSA9IDA7IGkgPCBBUF9NQVhfTElOS1M7IGkrKykgewogCQloID0gKHN0YXJ0X2hsaWQgKyBpKSAlIEFQX01BWF9MSU5LUzsKIAotCQlza2IgPSBza2JfZGVxdWV1ZSgmd2wtPmxpbmtzW2hdLnR4X3F1ZXVlW0NPTkZfVFhfQUNfVk9dKTsKKwkJLyogb25seSBjb25zaWRlciBjb25uZWN0ZWQgc3RhdGlvbnMgKi8KKwkJaWYgKGggPj0gV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUICYmCisJCSAgICAhdGVzdF9iaXQoaCAtIFdMMTI3MV9BUF9TVEFfSExJRF9TVEFSVCwgd2wtPmFwX2hsaWRfbWFwKSkKKwkJCWNvbnRpbnVlOworCisJCXF1ZXVlID0gd2wxMjcxX3NlbGVjdF9xdWV1ZSh3bCwgd2wtPmxpbmtzW2hdLnR4X3F1ZXVlKTsKKwkJaWYgKCFxdWV1ZSkKKwkJCWNvbnRpbnVlOworCisJCXNrYiA9IHNrYl9kZXF1ZXVlKHF1ZXVlKTsKIAkJaWYgKHNrYikKLQkJCWdvdG8gb3V0OwotCQlza2IgPSBza2JfZGVxdWV1ZSgmd2wtPmxpbmtzW2hdLnR4X3F1ZXVlW0NPTkZfVFhfQUNfVkldKTsKLQkJaWYgKHNrYikKLQkJCWdvdG8gb3V0OwotCQlza2IgPSBza2JfZGVxdWV1ZSgmd2wtPmxpbmtzW2hdLnR4X3F1ZXVlW0NPTkZfVFhfQUNfQkVdKTsKLQkJaWYgKHNrYikKLQkJCWdvdG8gb3V0OwotCQlza2IgPSBza2JfZGVxdWV1ZSgmd2wtPmxpbmtzW2hdLnR4X3F1ZXVlW0NPTkZfVFhfQUNfQktdKTsKLQkJaWYgKHNrYikKLQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CiAJfQogCi1vdXQ6CiAJaWYgKHNrYikgeworCQlpbnQgcSA9IHdsMTI3MV90eF9nZXRfcXVldWUoc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOwogCQl3bC0+bGFzdF90eF9obGlkID0gaDsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJndsLT53bF9sb2NrLCBmbGFncyk7Ci0JCXdsLT50eF9xdWV1ZV9jb3VudC0tOworCQl3bC0+dHhfcXVldWVfY291bnRbcV0tLTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKIAl9IGVsc2UgewogCQl3bC0+bGFzdF90eF9obGlkID0gMDsKQEAgLTUzMSw5ICs1NTksMTIgQEAKIAogCWlmICghc2tiICYmCiAJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChXTDEyNzFfRkxBR19EVU1NWV9QQUNLRVRfUEVORElORywgJndsLT5mbGFncykpIHsKKwkJaW50IHE7CisKIAkJc2tiID0gd2wtPmR1bW15X3BhY2tldDsKKwkJcSA9IHdsMTI3MV90eF9nZXRfcXVldWUoc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQkJd2wtPnR4X3F1ZXVlX2NvdW50LS07CisJCXdsLT50eF9xdWV1ZV9jb3VudFtxXS0tOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwogCX0KIApAQCAtNTU4LDIxICs1ODksMzMgQEAKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQl3bC0+dHhfcXVldWVfY291bnQrKzsKKwl3bC0+dHhfcXVldWVfY291bnRbcV0rKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgYm9vbCB3bDEyNzFfdHhfaXNfZGF0YV9wcmVzZW50KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShza2ItPmRhdGEpOworCisJcmV0dXJuIGllZWU4MDIxMV9pc19kYXRhX3ByZXNlbnQoaGRyLT5mcmFtZV9jb250cm9sKTsKK30KKwogdm9pZCB3bDEyNzFfdHhfd29ya19sb2NrZWQoc3RydWN0IHdsMTI3MSAqd2wpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1MzIgYnVmX29mZnNldCA9IDA7CiAJYm9vbCBzZW50X3BhY2tldHMgPSBmYWxzZTsKKwlib29sIGhhZF9kYXRhID0gZmFsc2U7CisJYm9vbCBpc19hcCA9ICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKIAlpbnQgcmV0OwogCiAJaWYgKHVubGlrZWx5KHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGKSkKIAkJcmV0dXJuOwogCiAJd2hpbGUgKChza2IgPSB3bDEyNzFfc2tiX2RlcXVldWUod2wpKSkgeworCQlpZiAod2wxMjcxX3R4X2lzX2RhdGFfcHJlc2VudChza2IpKQorCQkJaGFkX2RhdGEgPSB0cnVlOworCiAJCXJldCA9IHdsMTI3MV9wcmVwYXJlX3R4X2ZyYW1lKHdsLCBza2IsIGJ1Zl9vZmZzZXQpOwogCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKIAkJCS8qCkBAIC02MTksNiArNjYyLDE5IEBACiAKIAkJd2wxMjcxX2hhbmRsZV90eF9sb3dfd2F0ZXJtYXJrKHdsKTsKIAl9CisJaWYgKCFpc19hcCAmJiB3bC0+Y29uZi5yeF9zdHJlYW1pbmcuaW50ZXJ2YWwgJiYgaGFkX2RhdGEgJiYKKwkgICAgKHdsLT5jb25mLnJ4X3N0cmVhbWluZy5hbHdheXMgfHwKKwkgICAgIHRlc3RfYml0KFdMMTI3MV9GTEFHX1NPRlRfR0VNSU5JLCAmd2wtPmZsYWdzKSkpIHsKKwkJdTMyIHRpbWVvdXQgPSB3bC0+Y29uZi5yeF9zdHJlYW1pbmcuZHVyYXRpb247CisKKwkJLyogZW5hYmxlIHJ4IHN0cmVhbWluZyAqLworCQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1JYX1NUUkVBTUlOR19TVEFSVEVELCAmd2wtPmZsYWdzKSkKKwkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywKKwkJCQkJICAgICAmd2wtPnJ4X3N0cmVhbWluZ19lbmFibGVfd29yayk7CisKKwkJbW9kX3RpbWVyKCZ3bC0+cnhfc3RyZWFtaW5nX3RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7CisJfQogfQogCiB2b2lkIHdsMTI3MV90eF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTY3OSwxMCArNzM1LDI0IEBACiAKIAl3bC0+c3RhdHMucmV0cnlfY291bnQgKz0gcmVzdWx0LT5hY2tfZmFpbHVyZXM7CiAKLQkvKiB1cGRhdGUgc2VjdXJpdHkgc2VxdWVuY2UgbnVtYmVyICovCi0Jd2wtPnR4X3NlY3VyaXR5X3NlcSArPSAocmVzdWx0LT5sc2Jfc2VjdXJpdHlfc2VxdWVuY2VfbnVtYmVyIC0KLQkJCQl3bC0+dHhfc2VjdXJpdHlfbGFzdF9zZXEpOwotCXdsLT50eF9zZWN1cml0eV9sYXN0X3NlcSA9IHJlc3VsdC0+bHNiX3NlY3VyaXR5X3NlcXVlbmNlX251bWJlcjsKKwkvKgorCSAqIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgb25seSB3aGVuIHJlbGV2YW50LCBpLmUuIG9ubHkgaW4KKwkgKiBzZXNzaW9ucyBvZiBUS0lQLCBBRVMgYW5kIEdFTSAobm90IGluIG9wZW4gb3IgV0VQIHNlc3Npb25zKQorCSAqLworCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSAmJgorCSAgICAoaW5mby0+Y29udHJvbC5od19rZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQIHx8CisJICAgICBpbmZvLT5jb250cm9sLmh3X2tleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVAgfHwKKwkgICAgIGluZm8tPmNvbnRyb2wuaHdfa2V5LT5jaXBoZXIgPT0gV0wxMjcxX0NJUEhFUl9TVUlURV9HRU0pKSB7CisJCXU4IGZ3X2xzYiA9IHJlc3VsdC0+dHhfc2VjdXJpdHlfc2VxdWVuY2VfbnVtYmVyX2xzYjsKKwkJdTggY3VyX2xzYiA9IHdsLT50eF9zZWN1cml0eV9sYXN0X3NlcV9sc2I7CisKKwkJLyoKKwkJICogdXBkYXRlIHNlY3VyaXR5IHNlcXVlbmNlIG51bWJlciwgdGFraW5nIGNhcmUgb2YgcG90ZW50aWFsCisJCSAqIHdyYXAtYXJvdW5kCisJCSAqLworCQl3bC0+dHhfc2VjdXJpdHlfc2VxICs9IChmd19sc2IgLSBjdXJfbHNiICsgMjU2KSAlIDI1NjsKKwkJd2wtPnR4X3NlY3VyaXR5X2xhc3Rfc2VxX2xzYiA9IGZ3X2xzYjsKKwl9CiAKIAkvKiByZW1vdmUgcHJpdmF0ZSBoZWFkZXIgZnJvbSBwYWNrZXQgKi8KIAlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3Qgd2wxMjcxX3R4X2h3X2Rlc2NyKSk7CkBAIC03MDIsNyArNzcyLDcgQEAKIAogCS8qIHJldHVybiB0aGUgcGFja2V0IHRvIHRoZSBzdGFjayAqLwogCXNrYl9xdWV1ZV90YWlsKCZ3bC0+ZGVmZXJyZWRfdHhfcXVldWUsIHNrYik7Ci0JaWVlZTgwMjExX3F1ZXVlX3dvcmsod2wtPmh3LCAmd2wtPm5ldHN0YWNrX3dvcmspOworCXF1ZXVlX3dvcmsod2wtPmZyZWV6YWJsZV93cSwgJndsLT5uZXRzdGFja193b3JrKTsKIAl3bDEyNzFfZnJlZV90eF9pZCh3bCwgcmVzdWx0LT5pZCk7CiB9CiAKQEAgLTc0NywyMyArODE3LDI2IEBACiB2b2lkIHdsMTI3MV90eF9yZXNldF9saW5rX3F1ZXVlcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaGxpZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBpLCB0b3RhbCA9IDA7CisJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJaW50IHRvdGFsW05VTV9UWF9RVUVVRVNdOwogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9RVUVVRVM7IGkrKykgeworCQl0b3RhbFtpXSA9IDA7CiAJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJndsLT5saW5rc1tobGlkXS50eF9xdWV1ZVtpXSkpKSB7CiAJCQl3bDEyNzFfZGVidWcoREVCVUdfVFgsICJsaW5rIGZyZWVpbmcgc2tiIDB4JXAiLCBza2IpOwogCQkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAkJCWluZm8tPnN0YXR1cy5yYXRlc1swXS5pZHggPSAtMTsKIAkJCWluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCA9IDA7Ci0JCQlpZWVlODAyMTFfdHhfc3RhdHVzKHdsLT5odywgc2tiKTsKLQkJCXRvdGFsKys7CisJCQlpZWVlODAyMTFfdHhfc3RhdHVzX25pKHdsLT5odywgc2tiKTsKKwkJCXRvdGFsW2ldKys7CiAJCX0KIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQl3bC0+dHhfcXVldWVfY291bnQgLT0gdG90YWw7CisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9RVUVVRVM7IGkrKykKKwkJd2wtPnR4X3F1ZXVlX2NvdW50W2ldIC09IHRvdGFsW2ldOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsLT53bF9sb2NrLCBmbGFncyk7CiAKIAl3bDEyNzFfaGFuZGxlX3R4X2xvd193YXRlcm1hcmsod2wpOwpAQCAtNzk1LDEzICs4NjgsMTQgQEAKIAkJCQkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAkJCQkJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeCA9IC0xOwogCQkJCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSAwOwotCQkJCQlpZWVlODAyMTFfdHhfc3RhdHVzKHdsLT5odywgc2tiKTsKKwkJCQkJaWVlZTgwMjExX3R4X3N0YXR1c19uaSh3bC0+aHcsIHNrYik7CiAJCQkJfQogCQkJfQorCQkJd2wtPnR4X3F1ZXVlX2NvdW50W2ldID0gMDsKIAkJfQogCX0KIAotCXdsLT50eF9xdWV1ZV9jb3VudCA9IDA7CisJd2wtPnN0b3BwZWRfcXVldWVzX21hcCA9IDA7CiAKIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGUgZHJpdmVyIGlzIGF0IGEgY29uc2lzdGVudCBzdGF0ZSwgaW4gY2FzZSB0aGlzCkBAIC04MzgsNyArOTEyLDcgQEAKIAkJCWluZm8tPnN0YXR1cy5yYXRlc1swXS5pZHggPSAtMTsKIAkJCWluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCA9IDA7CiAKLQkJCWllZWU4MDIxMV90eF9zdGF0dXMod2wtPmh3LCBza2IpOworCQkJaWVlZTgwMjExX3R4X3N0YXR1c19uaSh3bC0+aHcsIHNrYik7CiAJCX0KIAl9CiB9CkBAIC04NTQsOCArOTI4LDEwIEBACiAJd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAJCXdsMTI3MV9kZWJ1ZyhERUJVR19UWCwgImZsdXNoaW5nIHR4IGJ1ZmZlcjogJWQgJWQiLAotCQkJICAgICB3bC0+dHhfZnJhbWVzX2NudCwgd2wtPnR4X3F1ZXVlX2NvdW50KTsKLQkJaWYgKCh3bC0+dHhfZnJhbWVzX2NudCA9PSAwKSAmJiAod2wtPnR4X3F1ZXVlX2NvdW50ID09IDApKSB7CisJCQkgICAgIHdsLT50eF9mcmFtZXNfY250LAorCQkJICAgICB3bDEyNzFfdHhfdG90YWxfcXVldWVfY291bnQod2wpKTsKKwkJaWYgKCh3bC0+dHhfZnJhbWVzX2NudCA9PSAwKSAmJgorCQkgICAgKHdsMTI3MV90eF90b3RhbF9xdWV1ZV9jb3VudCh3bCkgPT0gMCkpIHsKIAkJCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIAkJCXJldHVybjsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3R4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdHguaAppbmRleCA4MzJmOTI1Li41ZDcxOWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdHguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdHguaApAQCAtMTUwLDcgKzE1MCw3IEBACiAJICAgKGZyb20gMXN0IEVEQ0EgQUlGUyBjb3VudGVyIHVudGlsIFRYIENvbXBsZXRlKS4gKi8KIAlfX2xlMzIgbWVkaXVtX2RlbGF5OwogCS8qIExTLWJ5dGUgb2YgbGFzdCBUS0lQIHNlcS1udW0gKHNhdmVkIHBlciBBQyBmb3IgcmVjb3ZlcnkpLiAqLwotCXU4IGxzYl9zZWN1cml0eV9zZXF1ZW5jZV9udW1iZXI7CisJdTggdHhfc2VjdXJpdHlfc2VxdWVuY2VfbnVtYmVyX2xzYjsKIAkvKiBSZXRyeSBjb3VudCAtIG51bWJlciBvZiB0cmFuc21pc3Npb25zIHdpdGhvdXQgc3VjY2Vzc2Z1bCBBQ0suKi8KIAl1OCBhY2tfZmFpbHVyZXM7CiAJLyogVGhlIHJhdGUgdGhhdCBzdWNjZWVkZWQgZ2V0dGluZyBBQ0sKQEAgLTE4Miw2ICsxODIsMzIgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHdsMTI3MV90eF9nZXRfbWFjODAyMTFfcXVldWUoaW50IHF1ZXVlKQoreworCXN3aXRjaCAocXVldWUpIHsKKwljYXNlIENPTkZfVFhfQUNfVk86CisJCXJldHVybiAwOworCWNhc2UgQ09ORl9UWF9BQ19WSToKKwkJcmV0dXJuIDE7CisJY2FzZSBDT05GX1RYX0FDX0JFOgorCQlyZXR1cm4gMjsKKwljYXNlIENPTkZfVFhfQUNfQks6CisJCXJldHVybiAzOworCWRlZmF1bHQ6CisJCXJldHVybiAyOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgd2wxMjcxX3R4X3RvdGFsX3F1ZXVlX2NvdW50KHN0cnVjdCB3bDEyNzEgKndsKQoreworCWludCBpLCBjb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKQorCQljb3VudCArPSB3bC0+dHhfcXVldWVfY291bnRbaV07CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIHZvaWQgd2wxMjcxX3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgd2wxMjcxX3R4X3dvcmtfbG9ja2VkKHN0cnVjdCB3bDEyNzEgKndsKTsKIHZvaWQgd2wxMjcxX3R4X2NvbXBsZXRlKHN0cnVjdCB3bDEyNzEgKndsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHguaAppbmRleCBmYmU4ZjQ2Li4xYTg3NTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMnh4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTJ4eC5oCkBAIC0xNDQsNiArMTQ0LDcgQEAKIAogI2RlZmluZSBXTDEyNzFfVFhfU0VDVVJJVFlfTE8xNihzKSAoKHUxNikoKHMpICYgMHhmZmZmKSkKICNkZWZpbmUgV0wxMjcxX1RYX1NFQ1VSSVRZX0hJMzIocykgKCh1MzIpKCgocykgPj4gMTYpICYgMHhmZmZmZmZmZikpCisjZGVmaW5lIFdMMTI3MV9UWF9TUU5fUE9TVF9SRUNPVkVSWV9QQURESU5HIDB4ZmYKIAogI2RlZmluZSBXTDEyNzFfQ0lQSEVSX1NVSVRFX0dFTSAweDAwMTQ3MjAxCiAKQEAgLTE3Miw3ICsxNzMsNiBAQAogI2RlZmluZSBXTDEyNzFfUFNfU1RBX01BWF9CTE9DS1MgICgyICogOSkKIAogI2RlZmluZSBXTDEyNzFfQVBfQlNTX0lOREVYICAgICAgICAwCi0jZGVmaW5lIFdMMTI3MV9BUF9ERUZfSU5BQ1RJVl9TRUMgIDMwMAogI2RlZmluZSBXTDEyNzFfQVBfREVGX0JFQUNPTl9FWFAgICAyMAogCiAjZGVmaW5lIEFDWF9UWF9ERVNDUklQVE9SUyAgICAgICAgIDMyCkBAIC0yMjYsNiArMjI2LDggQEAKICNkZWZpbmUgRldfVkVSX01JTk9SXzFfU1BBUkVfU1RBX01JTiA1OAogI2RlZmluZSBGV19WRVJfTUlOT1JfMV9TUEFSRV9BUF9NSU4gIDQ3CiAKKyNkZWZpbmUgRldfVkVSX01JTk9SX0ZXTE9HX1NUQV9NSU4gNzAKKwogc3RydWN0IHdsMTI3MV9jaGlwIHsKIAl1MzIgaWQ7CiAJY2hhciBmd192ZXJfc3RyW0VUSFRPT0xfQlVTSU5GT19MRU5dOwpAQCAtMjg0LDggKzI4Niw3IEBACiAJdTggIHR4X3RvdGFsOwogCXU4ICByZXNlcnZlZDE7CiAJX19sZTE2IHJlc2VydmVkMjsKLQkvKiBUb3RhbCBzdHJ1Y3R1cmUgc2l6ZSBpcyA2OCBieXRlcyAqLwotCXUzMiBwYWRkaW5nOworCV9fbGUzMiBsb2dfc3RhcnRfYWRkcjsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB3bDEyNzFfZndfZnVsbF9zdGF0dXMgewpAQCAtMzU5LDYgKzM2MCw5IEBACiAJV0wxMjcxX0ZMQUdfRFVNTVlfUEFDS0VUX1BFTkRJTkcsCiAJV0wxMjcxX0ZMQUdfU1VTUEVOREVELAogCVdMMTI3MV9GTEFHX1BFTkRJTkdfV09SSywKKwlXTDEyNzFfRkxBR19TT0ZUX0dFTUlOSSwKKwlXTDEyNzFfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwKKwlXTDEyNzFfRkxBR19SRUNPVkVSWV9JTl9QUk9HUkVTUywKIH07CiAKIHN0cnVjdCB3bDEyNzFfbGluayB7CkBAIC00MjAsNyArNDI0LDcgQEAKIAkvKiBBY2NvdW50aW5nIGZvciBhbGxvY2F0ZWQgLyBhdmFpbGFibGUgVFggYmxvY2tzIG9uIEhXICovCiAJdTMyIHR4X2Jsb2Nrc19mcmVlZFtOVU1fVFhfUVVFVUVTXTsKIAl1MzIgdHhfYmxvY2tzX2F2YWlsYWJsZTsKLQl1MzIgdHhfYWxsb2NhdGVkX2Jsb2NrczsKKwl1MzIgdHhfYWxsb2NhdGVkX2Jsb2Nrc1tOVU1fVFhfUVVFVUVTXTsKIAl1MzIgdHhfcmVzdWx0c19jb3VudDsKIAogCS8qIFRyYW5zbWl0dGVkIFRYIHBhY2tldHMgY291bnRlciBmb3IgY2hpcHNldCBpbnRlcmZhY2UgKi8KQEAgLTQzNCw3ICs0MzgsOCBAQAogCiAJLyogRnJhbWVzIHNjaGVkdWxlZCBmb3IgdHJhbnNtaXNzaW9uLCBub3QgaGFuZGxlZCB5ZXQgKi8KIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3F1ZXVlW05VTV9UWF9RVUVVRVNdOwotCWludCB0eF9xdWV1ZV9jb3VudDsKKwlpbnQgdHhfcXVldWVfY291bnRbTlVNX1RYX1FVRVVFU107CisJbG9uZyBzdG9wcGVkX3F1ZXVlc19tYXA7CiAKIAkvKiBGcmFtZXMgcmVjZWl2ZWQsIG5vdCBoYW5kbGVkIHlldCBieSBtYWM4MDIxMSAqLwogCXN0cnVjdCBza19idWZmX2hlYWQgZGVmZXJyZWRfcnhfcXVldWU7CkBAIC00NDMsMTUgKzQ0OCwyMyBAQAogCXN0cnVjdCBza19idWZmX2hlYWQgZGVmZXJyZWRfdHhfcXVldWU7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfd29yazsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZnJlZXphYmxlX3dxOwogCiAJLyogUGVuZGluZyBUWCBmcmFtZXMgKi8KIAl1bnNpZ25lZCBsb25nIHR4X2ZyYW1lc19tYXBbQklUU19UT19MT05HUyhBQ1hfVFhfREVTQ1JJUFRPUlMpXTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqdHhfZnJhbWVzW0FDWF9UWF9ERVNDUklQVE9SU107CiAJaW50IHR4X2ZyYW1lc19jbnQ7CiAKLQkvKiBTZWN1cml0eSBzZXF1ZW5jZSBudW1iZXIgY291bnRlcnMgKi8KLQl1OCB0eF9zZWN1cml0eV9sYXN0X3NlcTsKLQlzNjQgdHhfc2VjdXJpdHlfc2VxOworCS8qCisJICogU2VjdXJpdHkgc2VxdWVuY2UgbnVtYmVyCisJICogICAgIGJpdHMgMC0xNTogbG93ZXIgMTYgYml0cyBwYXJ0IG9mIHNlcXVlbmNlIG51bWJlcgorCSAqICAgICBiaXRzIDE2LTQ3OiBoaWdoZXIgMzIgYml0cyBwYXJ0IG9mIHNlcXVlbmNlIG51bWJlcgorCSAqICAgICBiaXRzIDQ4LTYzOiBub3QgaW4gdXNlCisJICovCisJdTY0IHR4X3NlY3VyaXR5X3NlcTsKKworCS8qIDggYml0cyBvZiB0aGUgbGFzdCBzZXF1ZW5jZSBudW1iZXIgaW4gdXNlICovCisJdTggdHhfc2VjdXJpdHlfbGFzdF9zZXFfbHNiOwogCiAJLyogRlcgUnggY291bnRlciAqLwogCXUzMiByeF9jb3VudGVyOwpAQCAtNDY4LDYgKzQ4MSwxNSBAQAogCS8qIE5ldHdvcmsgc3RhY2sgd29yayAgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbmV0c3RhY2tfd29yazsKIAorCS8qIEZXIGxvZyBidWZmZXIgKi8KKwl1OCAqZndsb2c7CisKKwkvKiBOdW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gdGhlIEZXIGxvZyBidWZmZXIgKi8KKwlzc2l6ZV90IGZ3bG9nX3NpemU7CisKKwkvKiBTeXNmcyBGVyBsb2cgZW50cnkgcmVhZGVycyB3YWl0IHF1ZXVlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgZndsb2dfd2FpdHE7CisKIAkvKiBIYXJkd2FyZSByZWNvdmVyeSB3b3JrICovCiAJc3RydWN0IHdvcmtfc3RydWN0IHJlY292ZXJ5X3dvcms7CiAKQEAgLTUwOCw2ICs1MzAsMTEgQEAKIAkvKiBEZWZhdWx0IGtleSAoZm9yIFdFUCkgKi8KIAl1MzIgZGVmYXVsdF9rZXk7CiAKKwkvKiBSeCBTdHJlYW1pbmcgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgcnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCByeF9zdHJlYW1pbmdfZGlzYWJsZV93b3JrOworCXN0cnVjdCB0aW1lcl9saXN0IHJ4X3N0cmVhbWluZ190aW1lcjsKKwogCXVuc2lnbmVkIGludCBmaWx0ZXJzOwogCXVuc2lnbmVkIGludCByeF9jb25maWc7CiAJdW5zaWduZWQgaW50IHJ4X2ZpbHRlcjsKQEAgLTU2NCw2ICs1OTEsNyBAQAogCS8qIFJYIEJBIGNvbnN0cmFpbnQgdmFsdWUgKi8KIAlib29sIGJhX3N1cHBvcnQ7CiAJdTggYmFfcnhfYml0bWFwOworCWJvb2wgYmFfYWxsb3dlZDsKIAogCWludCB0Y3hvX2Nsb2NrOwogCkBAIC01NzIsNiArNjAwLDcgQEAKIAkgKiAoY3VycmVudGx5LCBvbmx5ICJBTlkiIHRyaWdnZXIgaXMgc3VwcG9ydGVkKQogCSAqLwogCWJvb2wgd293X2VuYWJsZWQ7CisJYm9vbCBpcnFfd2FrZV9lbmFibGVkOwogCiAJLyoKIAkgKiBBUC1tb2RlIC0gbGlua3MgaW5kZXhlZCBieSBITElELiBUaGUgZ2xvYmFsIGFuZCBicm9hZGNhc3QgbGlua3MKQEAgLTYwMSw2ICs2MzAsOSBAQAogCiBpbnQgd2wxMjcxX3BsdF9zdGFydChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMjcxX3BsdF9zdG9wKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyhzdHJ1Y3Qgd2wxMjcxICp3bCk7Cit2b2lkIHdsMTJ4eF9xdWV1ZV9yZWNvdmVyeV93b3JrKHN0cnVjdCB3bDEyNzEgKndsKTsKK3NpemVfdCB3bDEyeHhfY29weV9md2xvZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggKm1lbWJsb2NrLCBzaXplX3QgbWF4bGVuKTsKIAogI2RlZmluZSBKT0lOX1RJTUVPVVQgNTAwMCAvKiA1MDAwIG1pbGxpc2Vjb25kcyB0byBqb2luICovCiAKQEAgLTYwOCw4ICs2NDAsOCBAQAogCiAjZGVmaW5lIFdMMTI3MV9ERUZBVUxUX1BPV0VSX0xFVkVMIDAKIAotI2RlZmluZSBXTDEyNzFfVFhfUVVFVUVfTE9XX1dBVEVSTUFSSyAgMTAKLSNkZWZpbmUgV0wxMjcxX1RYX1FVRVVFX0hJR0hfV0FURVJNQVJLIDI1CisjZGVmaW5lIFdMMTI3MV9UWF9RVUVVRV9MT1dfV0FURVJNQVJLICAzMgorI2RlZmluZSBXTDEyNzFfVFhfUVVFVUVfSElHSF9XQVRFUk1BUksgMjU2CiAKICNkZWZpbmUgV0wxMjcxX0RFRkVSUkVEX1FVRVVFX0xJTUlUICAgIDY0CiAKQEAgLTYzNiw0ICs2NjgsMTUgQEAKIC8qIFdMMTI4WCByZXF1aXJlcyBhZ2dyZWdhdGVkIHBhY2tldHMgdG8gYmUgYWxpZ25lZCB0byB0aGUgU0RJTyBibG9jayBzaXplICovCiAjZGVmaW5lIFdMMTJYWF9RVUlSS19CTE9DS1NJWkVfQUxJR05NRU5UCUJJVCgyKQogCisvKgorICogV0wxMjdYIEFQIG1vZGUgcmVxdWlyZXMgTG93IFBvd2VyIERSUHcgKExQRCkgZW5hYmxlIHRvIHJlZHVjZSBwb3dlcgorICogY29uc3VtcHRpb24KKyAqLworI2RlZmluZSBXTDEyWFhfUVVJUktfTFBEX01PREUgICAgICAgICAgICAgICAgICAgQklUKDMpCisKKy8qIE9sZGVyIGZpcm13YXJlcyBkaWQgbm90IGltcGxlbWVudCB0aGUgRlcgbG9nZ2VyIG92ZXIgYnVzIGZlYXR1cmUgKi8KKyNkZWZpbmUgV0wxMlhYX1FVSVJLX0ZXTE9HX05PVF9JTVBMRU1FTlRFRAlCSVQoNCkKKworI2RlZmluZSBXTDEyWFhfSFdfQkxPQ0tfU0laRQkyNTYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmgKaW5kZXggNGJlN2MzYi4uMTE3YzQxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaApAQCAtMjEsNiArMjEsOCBAQAogI2lmbmRlZiBfWkRfQ0hJUF9ICiAjZGVmaW5lIF9aRF9DSElQX0gKIAorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCiAjaW5jbHVkZSAiemRfcmYuaCIKICNpbmNsdWRlICJ6ZF91c2IuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfZGVmLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9kZWYuaAppbmRleCA1NDYzY2E5Li45YTFiMDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9kZWYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9kZWYuaApAQCAtMzcsOSArMzcsMTUgQEAKIAlpZiAobmV0X3JhdGVsaW1pdCgpKSBcCiAJCWRldl9wcmludGtfZihLRVJOX0RFQlVHLCBkZXYsIGZtdCwgIyMgYXJncyk7IFwKIH0gd2hpbGUgKDApCisjICBkZWZpbmUgZGV2X2RiZ19mX2NvbmQoZGV2LCBjb25kLCBmbXQsIGFyZ3MuLi4pICh7IFwKKwlib29sIF9fY29uZCA9ICEhKGNvbmQpOyBcCisJaWYgKHVubGlrZWx5KF9fY29uZCkpIFwKKwkJZGV2X3ByaW50a19mKEtFUk5fREVCVUcsIGRldiwgZm10LCAjIyBhcmdzKTsgXAorfSkKICNlbHNlCiAjICBkZWZpbmUgZGV2X2RiZ19mKGRldiwgZm10LCBhcmdzLi4uKSBkbyB7ICh2b2lkKShkZXYpOyB9IHdoaWxlICgwKQogIyAgZGVmaW5lIGRldl9kYmdfZl9saW1pdChkZXYsIGZtdCwgYXJncy4uLikgZG8geyAodm9pZCkoZGV2KTsgfSB3aGlsZSAoMCkKKyMgIGRlZmluZSBkZXZfZGJnX2ZfY29uZChkZXYsIGNvbmQsIGZtdCwgYXJncy4uLikgZG8geyAodm9pZCkoZGV2KTsgfSB3aGlsZSAoMCkKICNlbmRpZiAvKiBERUJVRyAqLwogCiAjaWZkZWYgREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKaW5kZXggNTAzN2M4Yi4uY2FiZmFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogc3RhdGljIHZvaWQgYmVhY29uX2Rpc2FibGUoc3RydWN0IHpkX21hYyAqbWFjKTsKIHN0YXRpYyB2b2lkIHNldF9ydHNfY3RzKHN0cnVjdCB6ZF9tYWMgKm1hYywgdW5zaWduZWQgaW50IHNob3J0X3ByZWFtYmxlKTsKIHN0YXRpYyBpbnQgemRfbWFjX2NvbmZpZ19iZWFjb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJc3RydWN0IHNrX2J1ZmYgKmJlYWNvbik7CisJCQkJc3RydWN0IHNrX2J1ZmYgKmJlYWNvbiwgYm9vbCBpbl9pbnRyKTsKIAogc3RhdGljIGludCB6ZF9yZWcyYWxwaGEyKHU4IHJlZ2RvbWFpbiwgY2hhciAqYWxwaGEyKQogewpAQCAtMTYwLDYgKzE2MCwyMiBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgaW50IHpkX2NoZWNrX3NpZ25hbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IHNpZ25hbCkKK3sKKwlzdHJ1Y3QgemRfbWFjICptYWMgPSB6ZF9od19tYWMoaHcpOworCisJZGV2X2RiZ19mX2NvbmQoemRfbWFjX2RldihtYWMpLCBzaWduYWwgPCAwIHx8IHNpZ25hbCA+IDEwMCwKKwkJCSIlczogc2lnbmFsIHZhbHVlIGZyb20gZGV2aWNlIG5vdCBpbiByYW5nZSAwLi4xMDAsICIKKwkJCSJidXQgJWQuXG4iLCBfX2Z1bmNfXywgc2lnbmFsKTsKKworCWlmIChzaWduYWwgPCAwKQorCQlzaWduYWwgPSAwOworCWVsc2UgaWYgKHNpZ25hbCA+IDEwMCkKKwkJc2lnbmFsID0gMTAwOworCisJcmV0dXJuIHNpZ25hbDsKK30KKwogaW50IHpkX21hY19wcmVpbml0X2h3KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCWludCByOwpAQCAtMzg3LDEwICs0MDMsOCBAQAogCSAgICBtYWMtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKIAkJaWYgKG1hYy0+dmlmICE9IE5VTEwpIHsKIAkJCWJlYWNvbiA9IGllZWU4MDIxMV9iZWFjb25fZ2V0KG1hYy0+aHcsIG1hYy0+dmlmKTsKLQkJCWlmIChiZWFjb24pIHsKLQkJCQl6ZF9tYWNfY29uZmlnX2JlYWNvbihtYWMtPmh3LCBiZWFjb24pOwotCQkJCWtmcmVlX3NrYihiZWFjb24pOwotCQkJfQorCQkJaWYgKGJlYWNvbikKKwkJCQl6ZF9tYWNfY29uZmlnX2JlYWNvbihtYWMtPmh3LCBiZWFjb24sIGZhbHNlKTsKIAkJfQogCiAJCXpkX3NldF9iZWFjb25faW50ZXJ2YWwoJm1hYy0+Y2hpcCwgYmVhY29uX2ludGVydmFsLApAQCAtNDYxLDcgKzQ3NSw3IEBACiAJaWYgKGk8SUVFRTgwMjExX1RYX01BWF9SQVRFUykKIAkJaW5mby0+c3RhdHVzLnJhdGVzW2ldLmlkeCA9IC0xOyAvKiB0ZXJtaW5hdGUgKi8KIAotCWluZm8tPnN0YXR1cy5hY2tfc2lnbmFsID0gYWNrc3NpOworCWluZm8tPnN0YXR1cy5hY2tfc2lnbmFsID0gemRfY2hlY2tfc2lnbmFsKGh3LCBhY2tzc2kpOwogCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShodywgc2tiKTsKIH0KIApAQCAtNjY0LDcgKzY3OCwzNCBAQAogCS8qIEZJWE1FOiBNYW5hZ2VtZW50IGZyYW1lPyAqLwogfQogCi1zdGF0aWMgaW50IHpkX21hY19jb25maWdfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqYmVhY29uKQorc3RhdGljIGJvb2wgemRfbWFjX21hdGNoX2N1cl9iZWFjb24oc3RydWN0IHpkX21hYyAqbWFjLCBzdHJ1Y3Qgc2tfYnVmZiAqYmVhY29uKQoreworCWlmICghbWFjLT5iZWFjb24uY3VyX2JlYWNvbikKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKG1hYy0+YmVhY29uLmN1cl9iZWFjb24tPmxlbiAhPSBiZWFjb24tPmxlbikKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuICFtZW1jbXAoYmVhY29uLT5kYXRhLCBtYWMtPmJlYWNvbi5jdXJfYmVhY29uLT5kYXRhLCBiZWFjb24tPmxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHpkX21hY19mcmVlX2N1cl9iZWFjb25fbG9ja2VkKHN0cnVjdCB6ZF9tYWMgKm1hYykKK3sKKwlaRF9BU1NFUlQobXV0ZXhfaXNfbG9ja2VkKCZtYWMtPmNoaXAubXV0ZXgpKTsKKworCWtmcmVlX3NrYihtYWMtPmJlYWNvbi5jdXJfYmVhY29uKTsKKwltYWMtPmJlYWNvbi5jdXJfYmVhY29uID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgemRfbWFjX2ZyZWVfY3VyX2JlYWNvbihzdHJ1Y3QgemRfbWFjICptYWMpCit7CisJbXV0ZXhfbG9jaygmbWFjLT5jaGlwLm11dGV4KTsKKwl6ZF9tYWNfZnJlZV9jdXJfYmVhY29uX2xvY2tlZChtYWMpOworCW11dGV4X3VubG9jaygmbWFjLT5jaGlwLm11dGV4KTsKK30KKworc3RhdGljIGludCB6ZF9tYWNfY29uZmlnX2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKmJlYWNvbiwKKwkJCQlib29sIGluX2ludHIpCiB7CiAJc3RydWN0IHpkX21hYyAqbWFjID0gemRfaHdfbWFjKGh3KTsKIAlpbnQgciwgcmV0LCBudW1fY21kcywgcmVxX3BvcyA9IDA7CkBAIC02NzQsMTMgKzcxNSwyMSBAQAogCXVuc2lnbmVkIGxvbmcgZW5kX2ppZmZpZXMsIG1lc3NhZ2VfamlmZmllczsKIAlzdHJ1Y3QgemRfaW9yZXEzMiAqaW9yZXFzOwogCisJbXV0ZXhfbG9jaygmbWFjLT5jaGlwLm11dGV4KTsKKworCS8qIENoZWNrIGlmIGh3IGFscmVhZHkgaGFzIHRoaXMgYmVhY29uLiAqLworCWlmICh6ZF9tYWNfbWF0Y2hfY3VyX2JlYWNvbihtYWMsIGJlYWNvbikpIHsKKwkJciA9IDA7CisJCWdvdG8gb3V0X25vZnJlZTsKKwl9CisKIAkvKiBBbGxvYyBtZW1vcnkgZm9yIGZ1bGwgYmVhY29uIHdyaXRlIGF0IG9uY2UuICovCiAJbnVtX2NtZHMgPSAxICsgemRfY2hpcF9pc196ZDEyMTFiKCZtYWMtPmNoaXApICsgZnVsbF9sZW47CiAJaW9yZXFzID0ga21hbGxvYyhudW1fY21kcyAqIHNpemVvZihzdHJ1Y3QgemRfaW9yZXEzMiksIEdGUF9LRVJORUwpOwotCWlmICghaW9yZXFzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW11dGV4X2xvY2soJm1hYy0+Y2hpcC5tdXRleCk7CisJaWYgKCFpb3JlcXMpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vZnJlZTsKKwl9CiAKIAlyID0gemRfaW93cml0ZTMyX2xvY2tlZCgmbWFjLT5jaGlwLCAwLCBDUl9CQ05fRklGT19TRU1BUEhPUkUpOwogCWlmIChyIDwgMCkKQEAgLTY4OCw2ICs3MzcsMTAgQEAKIAlyID0gemRfaW9yZWFkMzJfbG9ja2VkKCZtYWMtPmNoaXAsICZ0bXAsIENSX0JDTl9GSUZPX1NFTUFQSE9SRSk7CiAJaWYgKHIgPCAwKQogCQlnb3RvIHJlbGVhc2Vfc2VtYTsKKwlpZiAoaW5faW50ciAmJiB0bXAgJiAweDIpIHsKKwkJciA9IC1FQlVTWTsKKwkJZ290byByZWxlYXNlX3NlbWE7CisJfQogCiAJZW5kX2ppZmZpZXMgPSBqaWZmaWVzICsgSFogLyAyOyAvKn41MDBtcyovCiAJbWVzc2FnZV9qaWZmaWVzID0gamlmZmllcyArIEhaIC8gMTA7IC8qfjEwMG1zKi8KQEAgLTc0Miw3ICs3OTUsNyBAQAogCWVuZF9qaWZmaWVzID0gamlmZmllcyArIEhaIC8gMjsgLyp+NTAwbXMqLwogCXJldCA9IHpkX2lvd3JpdGUzMl9sb2NrZWQoJm1hYy0+Y2hpcCwgMSwgQ1JfQkNOX0ZJRk9fU0VNQVBIT1JFKTsKIAl3aGlsZSAocmV0IDwgMCkgewotCQlpZiAodGltZV9pc19iZWZvcmVfZXFfamlmZmllcyhlbmRfamlmZmllcykpIHsKKwkJaWYgKGluX2ludHIgfHwgdGltZV9pc19iZWZvcmVfZXFfamlmZmllcyhlbmRfamlmZmllcykpIHsKIAkJCXJldCA9IC1FVElNRURPVVQ7CiAJCQlicmVhazsKIAkJfQpAQCAtNzU3LDkgKzgxMCwxOSBAQAogCWlmIChyIDwgMCB8fCByZXQgPCAwKSB7CiAJCWlmIChyID49IDApCiAJCQlyID0gcmV0OworCisJCS8qIFdlIGRvbid0IGtub3cgaWYgYmVhY29uIHdhcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSBvciBub3QsCisJCSAqIHNvIGNsZWFyIGN1cnJlbnQuICovCisJCXpkX21hY19mcmVlX2N1cl9iZWFjb25fbG9ja2VkKG1hYyk7CisKIAkJZ290byBvdXQ7CiAJfQogCisJLyogQmVhY29uIGhhcyBub3cgYmVlbiB3cml0dGVuIHN1Y2Nlc3NmdWxseSwgdXBkYXRlIGN1cnJlbnQuICovCisJemRfbWFjX2ZyZWVfY3VyX2JlYWNvbl9sb2NrZWQobWFjKTsKKwltYWMtPmJlYWNvbi5jdXJfYmVhY29uID0gYmVhY29uOworCWJlYWNvbiA9IE5VTEw7CisKIAkvKiA4MDIuMTFiL2cgMi40RyBDQ0sgMU1iCiAJICogODAyLjExYSwgbm90IHlldCBpbXBsZW1lbnRlZCwgdXNlcyBkaWZmZXJlbnQgdmFsdWVzIChzZWUgR1BMIHZlbmRvcgogCSAqIGRyaXZlcikKQEAgLTc2NywxMSArODMwLDE3IEBACiAJciA9IHpkX2lvd3JpdGUzMl9sb2NrZWQoJm1hYy0+Y2hpcCwgMHgwMDAwMDQwMCB8IChmdWxsX2xlbiA8PCAxOSksCiAJCQkJQ1JfQkNOX1BMQ1BfQ0ZHKTsKIG91dDoKLQltdXRleF91bmxvY2soJm1hYy0+Y2hpcC5tdXRleCk7CiAJa2ZyZWUoaW9yZXFzKTsKK291dF9ub2ZyZWU6CisJa2ZyZWVfc2tiKGJlYWNvbik7CisJbXV0ZXhfdW5sb2NrKCZtYWMtPmNoaXAubXV0ZXgpOworCiAJcmV0dXJuIHI7CiAKIHJlc2V0X2RldmljZToKKwl6ZF9tYWNfZnJlZV9jdXJfYmVhY29uX2xvY2tlZChtYWMpOworCWtmcmVlX3NrYihiZWFjb24pOworCiAJbXV0ZXhfdW5sb2NrKCZtYWMtPmNoaXAubXV0ZXgpOwogCWtmcmVlKGlvcmVxcyk7CiAKQEAgLTk4Miw3ICsxMDUxLDcgQEAKIAogCXN0YXRzLmZyZXEgPSB6ZF9jaGFubmVsc1tfemRfY2hpcF9nZXRfY2hhbm5lbCgmbWFjLT5jaGlwKSAtIDFdLmNlbnRlcl9mcmVxOwogCXN0YXRzLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwotCXN0YXRzLnNpZ25hbCA9IHN0YXR1cy0+c2lnbmFsX3N0cmVuZ3RoOworCXN0YXRzLnNpZ25hbCA9IHpkX2NoZWNrX3NpZ25hbChodywgc3RhdHVzLT5zaWduYWxfc3RyZW5ndGgpOwogCiAJcmF0ZSA9IHpkX3J4X3JhdGUoYnVmZmVyLCBzdGF0dXMpOwogCkBAIC0xMDU3LDYgKzExMjYsOCBAQAogCW1hYy0+dmlmID0gTlVMTDsKIAl6ZF9zZXRfYmVhY29uX2ludGVydmFsKCZtYWMtPmNoaXAsIDAsIDAsIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEKTsKIAl6ZF93cml0ZV9tYWNfYWRkcigmbWFjLT5jaGlwLCBOVUxMKTsKKworCXpkX21hY19mcmVlX2N1cl9iZWFjb24obWFjKTsKIH0KIAogc3RhdGljIGludCB6ZF9vcF9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKQpAQCAtMTA5NCwxMCArMTE2NSw4IEBACiAJICogRmV0Y2ggbmV4dCBiZWFjb24gc28gdGhhdCB0aW1fY291bnQgaXMgdXBkYXRlZC4KIAkgKi8KIAliZWFjb24gPSBpZWVlODAyMTFfYmVhY29uX2dldChtYWMtPmh3LCBtYWMtPnZpZik7Ci0JaWYgKGJlYWNvbikgewotCQl6ZF9tYWNfY29uZmlnX2JlYWNvbihtYWMtPmh3LCBiZWFjb24pOwotCQlrZnJlZV9za2IoYmVhY29uKTsKLQl9CisJaWYgKGJlYWNvbikKKwkJemRfbWFjX2NvbmZpZ19iZWFjb24obWFjLT5odywgYmVhY29uLCB0cnVlKTsKIAogCXNwaW5fbG9ja19pcnEoJm1hYy0+bG9jayk7CiAJbWFjLT5iZWFjb24ubGFzdF91cGRhdGUgPSBqaWZmaWVzOwpAQCAtMTIyMiw5ICsxMjkxLDggQEAKIAogCQkJaWYgKGJlYWNvbikgewogCQkJCXpkX2NoaXBfZGlzYWJsZV9od2ludCgmbWFjLT5jaGlwKTsKLQkJCQl6ZF9tYWNfY29uZmlnX2JlYWNvbihodywgYmVhY29uKTsKKwkJCQl6ZF9tYWNfY29uZmlnX2JlYWNvbihodywgYmVhY29uLCBmYWxzZSk7CiAJCQkJemRfY2hpcF9lbmFibGVfaHdpbnQoJm1hYy0+Y2hpcCk7Ci0JCQkJa2ZyZWVfc2tiKGJlYWNvbik7CiAJCQl9CiAJCX0KIApAQCAtMTM2MSw3ICsxNDI5LDggQEAKIAlzcGluX2xvY2tfaXJxKCZtYWMtPmxvY2spOwogCWludGVydmFsID0gbWFjLT5iZWFjb24uaW50ZXJ2YWw7CiAJcGVyaW9kID0gbWFjLT5iZWFjb24ucGVyaW9kOwotCXRpbWVvdXQgPSBtYWMtPmJlYWNvbi5sYXN0X3VwZGF0ZSArIG1zZWNzX3RvX2ppZmZpZXMoaW50ZXJ2YWwpICsgSFo7CisJdGltZW91dCA9IG1hYy0+YmVhY29uLmxhc3RfdXBkYXRlICsKKwkJCW1zZWNzX3RvX2ppZmZpZXMoaW50ZXJ2YWwgKiAxMDI0IC8gMTAwMCkgKiAzOwogCXNwaW5fdW5sb2NrX2lycSgmbWFjLT5sb2NrKTsKIAogCWlmIChpbnRlcnZhbCA+IDAgJiYgdGltZV9pc19iZWZvcmVfamlmZmllcyh0aW1lb3V0KSkgewpAQCAtMTM3NCw4ICsxNDQzLDkgQEAKIAogCQliZWFjb24gPSBpZWVlODAyMTFfYmVhY29uX2dldChtYWMtPmh3LCBtYWMtPnZpZik7CiAJCWlmIChiZWFjb24pIHsKLQkJCXpkX21hY19jb25maWdfYmVhY29uKG1hYy0+aHcsIGJlYWNvbik7Ci0JCQlrZnJlZV9za2IoYmVhY29uKTsKKwkJCXpkX21hY19mcmVlX2N1cl9iZWFjb24obWFjKTsKKworCQkJemRfbWFjX2NvbmZpZ19iZWFjb24obWFjLT5odywgYmVhY29uLCBmYWxzZSk7CiAJCX0KIAogCQl6ZF9zZXRfYmVhY29uX2ludGVydmFsKCZtYWMtPmNoaXAsIGludGVydmFsLCBwZXJpb2QsIG1hYy0+dHlwZSk7CkBAIC0xNDEwLDYgKzE0ODAsOCBAQAogewogCWRldl9kYmdfZih6ZF9tYWNfZGV2KG1hYyksICJcbiIpOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbWFjLT5iZWFjb24ud2F0Y2hkb2dfd29yayk7CisKKwl6ZF9tYWNfZnJlZV9jdXJfYmVhY29uKG1hYyk7CiB9CiAKICNkZWZpbmUgTElOS19MRURfV09SS19ERUxBWSBIWgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaAppbmRleCBmOGM5M2MzLi5jMDFlY2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaApAQCAtMTY1LDYgKzE2NSw3IEBACiAKIHN0cnVjdCBiZWFjb24gewogCXN0cnVjdCBkZWxheWVkX3dvcmsgd2F0Y2hkb2dfd29yazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqY3VyX2JlYWNvbjsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlOwogCXUxNiBpbnRlcnZhbDsKIAl1OCBwZXJpb2Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCmluZGV4IDYzMTE5NGQuLmNmMGQ2OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCkBAIC0xMTEsNiArMTExLDkgQEAKICNkZWZpbmUgRldfWkQxMjExX1BSRUZJWAkiemQxMjExL3pkMTIxMV8iCiAjZGVmaW5lIEZXX1pEMTIxMUJfUFJFRklYCSJ6ZDEyMTEvemQxMjExYl8iCiAKK3N0YXRpYyBib29sIGNoZWNrX3JlYWRfcmVncyhzdHJ1Y3QgemRfdXNiICp1c2IsIHN0cnVjdCB1c2JfcmVxX3JlYWRfcmVncyAqcmVxLAorCQkJICAgIHVuc2lnbmVkIGludCBjb3VudCk7CisKIC8qIFVTQiBkZXZpY2UgaW5pdGlhbGl6YXRpb24gKi8KIHN0YXRpYyB2b2lkIGludF91cmJfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKTsKIApAQCAtMzY1LDYgKzM2OCwyMCBAQAogCiAjZGVmaW5lIHVyYl9kZXYodXJiKSAoJih1cmIpLT5kZXYtPmRldikKIAorc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9yZWdzX2ludF9vdmVycmlkZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHpkX3VzYiAqdXNiID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCB6ZF91c2JfaW50ZXJydXB0ICppbnRyID0gJnVzYi0+aW50cjsKKworCXNwaW5fbG9jaygmaW50ci0+bG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZpbnRyLT5yZWFkX3JlZ3NfZW5hYmxlZCkpIHsKKwkJYXRvbWljX3NldCgmaW50ci0+cmVhZF9yZWdzX2VuYWJsZWQsIDApOworCQlpbnRyLT5yZWFkX3JlZ3NfaW50X292ZXJyaWRkZW4gPSAxOworCQljb21wbGV0ZSgmaW50ci0+cmVhZF9yZWdzLmNvbXBsZXRpb24pOworCX0KKwlzcGluX3VubG9jaygmaW50ci0+bG9jayk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfcmVnc19pbnQoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCB6ZF91c2IgKnVzYiA9IHVyYi0+Y29udGV4dDsKQEAgLTM4MywyNSArNDAwLDQ1IEBACiAJCQkJVVNCX01BWF9FUF9JTlRfQlVGRkVSKTsKIAkJc3Bpbl91bmxvY2soJm1hYy0+bG9jayk7CiAJCXNjaGVkdWxlX3dvcmsoJm1hYy0+cHJvY2Vzc19pbnRyKTsKLQl9IGVsc2UgaWYgKGludHItPnJlYWRfcmVnc19lbmFibGVkKSB7Ci0JCWludHItPnJlYWRfcmVncy5sZW5ndGggPSBsZW4gPSB1cmItPmFjdHVhbF9sZW5ndGg7Ci0KKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZpbnRyLT5yZWFkX3JlZ3NfZW5hYmxlZCkpIHsKKwkJbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCQlpbnRyLT5yZWFkX3JlZ3MubGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCQlpZiAobGVuID4gc2l6ZW9mKGludHItPnJlYWRfcmVncy5idWZmZXIpKQogCQkJbGVuID0gc2l6ZW9mKGludHItPnJlYWRfcmVncy5idWZmZXIpOworCiAJCW1lbWNweShpbnRyLT5yZWFkX3JlZ3MuYnVmZmVyLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwgbGVuKTsKLQkJaW50ci0+cmVhZF9yZWdzX2VuYWJsZWQgPSAwOworCisJCS8qIFNvbWV0aW1lcyBVU0JfSU5UX0lEX1JFR1MgaXMgbm90IG92ZXJyaWRkZW4sIGJ1dCBjb21lcyBhZnRlcgorCQkgKiBVU0JfSU5UX0lEX1JFVFJZX0ZBSUxFRC4gUmVhZC1yZWcgcmV0cnkgdGhlbiBnZXRzIHRoaXMKKwkJICogZGVsYXllZCBVU0JfSU5UX0lEX1JFR1MsIGJ1dCBsZWF2ZXMgVVNCX0lOVF9JRF9SRUdTIG9mCisJCSAqIHJldHJ5IHVuaGFuZGxlZC4gTmV4dCByZWFkLXJlZyBjb21tYW5kIHRoZW4gbWlnaHQgY2F0Y2gKKwkJICogdGhpcyB3cm9uZyBVU0JfSU5UX0lEX1JFR1MuIEZpeCBieSBpZ25vcmluZyB3cm9uZyByZWFkcy4KKwkJICovCisJCWlmICghY2hlY2tfcmVhZF9yZWdzKHVzYiwgaW50ci0+cmVhZF9yZWdzLnJlcSwKKwkJCQkJCWludHItPnJlYWRfcmVncy5yZXFfY291bnQpKQorCQkJZ290byBvdXQ7CisKKwkJYXRvbWljX3NldCgmaW50ci0+cmVhZF9yZWdzX2VuYWJsZWQsIDApOworCQlpbnRyLT5yZWFkX3JlZ3NfaW50X292ZXJyaWRkZW4gPSAwOwogCQljb21wbGV0ZSgmaW50ci0+cmVhZF9yZWdzLmNvbXBsZXRpb24pOworCiAJCWdvdG8gb3V0OwogCX0KIAogb3V0OgogCXNwaW5fdW5sb2NrKCZpbnRyLT5sb2NrKTsKKworCS8qIENSX0lOVEVSUlVQVCBtaWdodCBvdmVycmlkZSByZWFkX3JlZyB0b28uICovCisJaWYgKGludF9udW0gPT0gQ1JfSU5URVJSVVBUICYmIGF0b21pY19yZWFkKCZpbnRyLT5yZWFkX3JlZ3NfZW5hYmxlZCkpCisJCWhhbmRsZV9yZWdzX2ludF9vdmVycmlkZSh1cmIpOwogfQogCiBzdGF0aWMgdm9pZCBpbnRfdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlpbnQgcjsKIAlzdHJ1Y3QgdXNiX2ludF9oZWFkZXIgKmhkcjsKKwlzdHJ1Y3QgemRfdXNiICp1c2I7CisJc3RydWN0IHpkX3VzYl9pbnRlcnJ1cHQgKmludHI7CiAKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJY2FzZSAwOgpAQCAtNDMwLDYgKzQ2NywxNCBAQAogCQlnb3RvIHJlc3VibWl0OwogCX0KIAorCS8qIFVTQl9JTlRfSURfUkVUUllfRkFJTEVEIHRyaWdnZXJlZCBieSB0eC11cmIgc3VibWl0IGNhbiBvdmVycmlkZQorCSAqIHBlbmRpbmcgVVNCX0lOVF9JRF9SRUdTIGNhdXNpbmcgcmVhZCBjb21tYW5kIHRpbWVvdXQuCisJICovCisJdXNiID0gdXJiLT5jb250ZXh0OworCWludHIgPSAmdXNiLT5pbnRyOworCWlmIChoZHItPmlkICE9IFVTQl9JTlRfSURfUkVHUyAmJiBhdG9taWNfcmVhZCgmaW50ci0+cmVhZF9yZWdzX2VuYWJsZWQpKQorCQloYW5kbGVfcmVnc19pbnRfb3ZlcnJpZGUodXJiKTsKKwogCXN3aXRjaCAoaGRyLT5pZCkgewogCWNhc2UgVVNCX0lOVF9JRF9SRUdTOgogCQloYW5kbGVfcmVnc19pbnQodXJiKTsKQEAgLTU3OSw4ICs2MjQsOCBAQAogCiAJaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgcnhfbGVuZ3RoX2luZm8pKSB7CiAJCS8qIEl0J3Mgbm90IGEgY29tcGxldGUgcGFja2V0IGFueWhvdy4gKi8KLQkJcHJpbnRrKCIlczogaW52YWxpZCwgc21hbGwgUlggcGFja2V0IDogJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgbGVuZ3RoKTsKKwkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwgImludmFsaWQsIHNtYWxsIFJYIHBhY2tldCA6ICVkXG4iLAorCQkJCQkgICBsZW5ndGgpOwogCQlyZXR1cm47CiAJfQogCWxlbmd0aF9pbmZvID0gKHN0cnVjdCByeF9sZW5ndGhfaW5mbyAqKQpAQCAtMTEyOSw2ICsxMTc0LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmaW50ci0+bG9jayk7CiAJaW50ci0+aW50ZXJ2YWwgPSBpbnRfdXJiX2ludGVydmFsKHpkX3VzYl90b191c2JkZXYodXNiKSk7CiAJaW5pdF9jb21wbGV0aW9uKCZpbnRyLT5yZWFkX3JlZ3MuY29tcGxldGlvbik7CisJYXRvbWljX3NldCgmaW50ci0+cmVhZF9yZWdzX2VuYWJsZWQsIDApOwogCWludHItPnJlYWRfcmVncy5jcl9pbnRfYWRkciA9IGNwdV90b19sZTE2KCh1MTYpQ1JfSU5URVJSVVBUKTsKIH0KIApAQCAtMTU2MywxMiArMTYwOSwxNiBAQAogCXJldHVybiBzaXplb2Yoc3RydWN0IHVzYl9pbnRfcmVncykgKyBjb3VudCAqIHNpemVvZihzdHJ1Y3QgcmVnX2RhdGEpOwogfQogCi1zdGF0aWMgdm9pZCBwcmVwYXJlX3JlYWRfcmVnc19pbnQoc3RydWN0IHpkX3VzYiAqdXNiKQorc3RhdGljIHZvaWQgcHJlcGFyZV9yZWFkX3JlZ3NfaW50KHN0cnVjdCB6ZF91c2IgKnVzYiwKKwkJCQkgIHN0cnVjdCB1c2JfcmVxX3JlYWRfcmVncyAqcmVxLAorCQkJCSAgdW5zaWduZWQgaW50IGNvdW50KQogewogCXN0cnVjdCB6ZF91c2JfaW50ZXJydXB0ICppbnRyID0gJnVzYi0+aW50cjsKIAogCXNwaW5fbG9ja19pcnEoJmludHItPmxvY2spOwotCWludHItPnJlYWRfcmVnc19lbmFibGVkID0gMTsKKwlhdG9taWNfc2V0KCZpbnRyLT5yZWFkX3JlZ3NfZW5hYmxlZCwgMSk7CisJaW50ci0+cmVhZF9yZWdzLnJlcSA9IHJlcTsKKwlpbnRyLT5yZWFkX3JlZ3MucmVxX2NvdW50ID0gY291bnQ7CiAJSU5JVF9DT01QTEVUSU9OKGludHItPnJlYWRfcmVncy5jb21wbGV0aW9uKTsKIAlzcGluX3VubG9ja19pcnEoJmludHItPmxvY2spOwogfQpAQCAtMTU3OCwxMiArMTYyOCw1MiBAQAogCXN0cnVjdCB6ZF91c2JfaW50ZXJydXB0ICppbnRyID0gJnVzYi0+aW50cjsKIAogCXNwaW5fbG9ja19pcnEoJmludHItPmxvY2spOwotCWludHItPnJlYWRfcmVnc19lbmFibGVkID0gMDsKKwlhdG9taWNfc2V0KCZpbnRyLT5yZWFkX3JlZ3NfZW5hYmxlZCwgMCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZpbnRyLT5sb2NrKTsKIH0KIAorc3RhdGljIGJvb2wgY2hlY2tfcmVhZF9yZWdzKHN0cnVjdCB6ZF91c2IgKnVzYiwgc3RydWN0IHVzYl9yZXFfcmVhZF9yZWdzICpyZXEsCisJCQkgICAgdW5zaWduZWQgaW50IGNvdW50KQoreworCWludCBpOworCXN0cnVjdCB6ZF91c2JfaW50ZXJydXB0ICppbnRyID0gJnVzYi0+aW50cjsKKwlzdHJ1Y3QgcmVhZF9yZWdzX2ludCAqcnIgPSAmaW50ci0+cmVhZF9yZWdzOworCXN0cnVjdCB1c2JfaW50X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHVzYl9pbnRfcmVncyAqKXJyLT5idWZmZXI7CisKKwkvKiBUaGUgY3JlYXRlZCBibG9jayBzaXplIHNlZW1zIHRvIGJlIGxhcmdlciB0aGFuIGV4cGVjdGVkLgorCSAqIEhvd2V2ZXIgcmVzdWx0cyBhcHBlYXIgdG8gYmUgY29ycmVjdC4KKwkgKi8KKwlpZiAocnItPmxlbmd0aCA8IHVzYl9pbnRfcmVnc19sZW5ndGgoY291bnQpKSB7CisJCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksCisJCQkgImVycm9yOiBhY3R1YWwgbGVuZ3RoICVkIGxlc3MgdGhhbiBleHBlY3RlZCAlZFxuIiwKKwkJCSByci0+bGVuZ3RoLCB1c2JfaW50X3JlZ3NfbGVuZ3RoKGNvdW50KSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAocnItPmxlbmd0aCA+IHNpemVvZihyci0+YnVmZmVyKSkgeworCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLAorCQkJICJlcnJvcjogYWN0dWFsIGxlbmd0aCAlZCBleGNlZWRzIGJ1ZmZlciBzaXplICV6dVxuIiwKKwkJCSByci0+bGVuZ3RoLCBzaXplb2YocnItPmJ1ZmZlcikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc3RydWN0IHJlZ19kYXRhICpyZCA9ICZyZWdzLT5yZWdzW2ldOworCQlpZiAocmQtPmFkZHIgIT0gcmVxLT5hZGRyW2ldKSB7CisJCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLAorCQkJCSAicmRbJWRdIGFkZHIgJSMwNmh4IGV4cGVjdGVkICUjMDZoeFxuIiwgaSwKKwkJCQkgbGUxNl90b19jcHUocmQtPmFkZHIpLAorCQkJCSBsZTE2X3RvX2NwdShyZXEtPmFkZHJbaV0pKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgaW50IGdldF9yZXN1bHRzKHN0cnVjdCB6ZF91c2IgKnVzYiwgdTE2ICp2YWx1ZXMsCi0JICAgICAgICAgICAgICAgc3RydWN0IHVzYl9yZXFfcmVhZF9yZWdzICpyZXEsIHVuc2lnbmVkIGludCBjb3VudCkKKwkJICAgICAgIHN0cnVjdCB1c2JfcmVxX3JlYWRfcmVncyAqcmVxLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgICAgICBib29sICpyZXRyeSkKIHsKIAlpbnQgcjsKIAlpbnQgaTsKQEAgLTE1OTQsMzEgKzE2ODQsMTkgQEAKIAlzcGluX2xvY2tfaXJxKCZpbnRyLT5sb2NrKTsKIAogCXIgPSAtRUlPOwotCS8qIFRoZSBjcmVhdGVkIGJsb2NrIHNpemUgc2VlbXMgdG8gYmUgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQuCi0JICogSG93ZXZlciByZXN1bHRzIGFwcGVhciB0byBiZSBjb3JyZWN0LgotCSAqLwotCWlmIChyci0+bGVuZ3RoIDwgdXNiX2ludF9yZWdzX2xlbmd0aChjb3VudCkpIHsKLQkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwKLQkJCSAiZXJyb3I6IGFjdHVhbCBsZW5ndGggJWQgbGVzcyB0aGFuIGV4cGVjdGVkICVkXG4iLAotCQkJIHJyLT5sZW5ndGgsIHVzYl9pbnRfcmVnc19sZW5ndGgoY291bnQpKTsKKworCS8qIFJlYWQgZmFpbGVkIGJlY2F1c2UgZmlybXdhcmUgYnVnPyAqLworCSpyZXRyeSA9ICEhaW50ci0+cmVhZF9yZWdzX2ludF9vdmVycmlkZGVuOworCWlmICgqcmV0cnkpCiAJCWdvdG8gZXJyb3JfdW5sb2NrOwotCX0KLQlpZiAocnItPmxlbmd0aCA+IHNpemVvZihyci0+YnVmZmVyKSkgewotCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLAotCQkJICJlcnJvcjogYWN0dWFsIGxlbmd0aCAlZCBleGNlZWRzIGJ1ZmZlciBzaXplICV6dVxuIiwKLQkJCSByci0+bGVuZ3RoLCBzaXplb2YocnItPmJ1ZmZlcikpOworCisJaWYgKCFjaGVja19yZWFkX3JlZ3ModXNiLCByZXEsIGNvdW50KSkgeworCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLCAiZXJyb3I6IGludmFsaWQgcmVhZCByZWdzXG4iKTsKIAkJZ290byBlcnJvcl91bmxvY2s7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJc3RydWN0IHJlZ19kYXRhICpyZCA9ICZyZWdzLT5yZWdzW2ldOwotCQlpZiAocmQtPmFkZHIgIT0gcmVxLT5hZGRyW2ldKSB7Ci0JCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLAotCQkJCSAicmRbJWRdIGFkZHIgJSMwNmh4IGV4cGVjdGVkICUjMDZoeFxuIiwgaSwKLQkJCQkgbGUxNl90b19jcHUocmQtPmFkZHIpLAotCQkJCSBsZTE2X3RvX2NwdShyZXEtPmFkZHJbaV0pKTsKLQkJCWdvdG8gZXJyb3JfdW5sb2NrOwotCQl9CiAJCXZhbHVlc1tpXSA9IGxlMTZfdG9fY3B1KHJkLT52YWx1ZSk7CiAJfQogCkBAIC0xNjMxLDExICsxNzA5LDExIEBACiBpbnQgemRfdXNiX2lvcmVhZDE2dihzdHJ1Y3QgemRfdXNiICp1c2IsIHUxNiAqdmFsdWVzLAogCSAgICAgICAgICAgICBjb25zdCB6ZF9hZGRyX3QgKmFkZHJlc3NlcywgdW5zaWduZWQgaW50IGNvdW50KQogewotCWludCByOwotCWludCBpLCByZXFfbGVuLCBhY3R1YWxfcmVxX2xlbjsKKwlpbnQgciwgaSwgcmVxX2xlbiwgYWN0dWFsX3JlcV9sZW4sIHRyeV9jb3VudCA9IDA7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IHVzYl9yZXFfcmVhZF9yZWdzICpyZXEgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlib29sIHJldHJ5ID0gZmFsc2U7CiAKIAlpZiAoY291bnQgPCAxKSB7CiAJCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksICJlcnJvcjogY291bnQgaXMgemVyb1xuIik7CkBAIC0xNjcxLDggKzE3NDksMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKIAkJcmVxLT5hZGRyW2ldID0gY3B1X3RvX2xlMTYoKHUxNilhZGRyZXNzZXNbaV0pOwogCityZXRyeV9yZWFkOgorCXRyeV9jb3VudCsrOwogCXVkZXYgPSB6ZF91c2JfdG9fdXNiZGV2KHVzYik7Ci0JcHJlcGFyZV9yZWFkX3JlZ3NfaW50KHVzYik7CisJcHJlcGFyZV9yZWFkX3JlZ3NfaW50KHVzYiwgcmVxLCBjb3VudCk7CiAJciA9IHpkX2VwX3JlZ3Nfb3V0X21zZyh1ZGV2LCByZXEsIHJlcV9sZW4sICZhY3R1YWxfcmVxX2xlbiwgNTAgLyptcyovKTsKIAlpZiAocikgewogCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLApAQCAtMTY5Niw3ICsxNzc2LDEyIEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JciA9IGdldF9yZXN1bHRzKHVzYiwgdmFsdWVzLCByZXEsIGNvdW50KTsKKwlyID0gZ2V0X3Jlc3VsdHModXNiLCB2YWx1ZXMsIHJlcSwgY291bnQsICZyZXRyeSk7CisJaWYgKHJldHJ5ICYmIHRyeV9jb3VudCA8IDIwKSB7CisJCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksICJyZWFkIHJldHJ5LCB0cmllcyBzbyBmYXI6ICVkXG4iLAorCQkJCXRyeV9jb3VudCk7CisJCWdvdG8gcmV0cnlfcmVhZDsKKwl9CiBlcnJvcjoKIAlyZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKaW5kZXggYmY5NDI4NC4uOTkxOTNiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKQEAgLTE0NCw2ICsxNDQsOCBAQAogCiBzdHJ1Y3QgcmVhZF9yZWdzX2ludCB7CiAJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbjsKKwlzdHJ1Y3QgdXNiX3JlcV9yZWFkX3JlZ3MgKnJlcTsKKwl1bnNpZ25lZCBpbnQgcmVxX2NvdW50OwogCS8qIFN0b3JlcyB0aGUgVVNCIGludCBzdHJ1Y3R1cmUgYW5kIGNvbnRhaW5zIHRoZSBVU0IgYWRkcmVzcyBvZiB0aGUKIAkgKiBmaXJzdCByZXF1ZXN0ZWQgcmVnaXN0ZXIgYmVmb3JlIHJlcXVlc3QuCiAJICovCkBAIC0xNjksNyArMTcxLDggQEAKIAl2b2lkICpidWZmZXI7CiAJZG1hX2FkZHJfdCBidWZmZXJfZG1hOwogCWludCBpbnRlcnZhbDsKLQl1OCByZWFkX3JlZ3NfZW5hYmxlZDoxOworCWF0b21pY190IHJlYWRfcmVnc19lbmFibGVkOworCXU4IHJlYWRfcmVnc19pbnRfb3ZlcnJpZGRlbjoxOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX2ludF9yZWdzICpnZXRfcmVhZF9yZWdzKHN0cnVjdCB6ZF91c2JfaW50ZXJydXB0ICppbnRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCmluZGV4IDBlNDg1MWIuLmZkMDBmMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKQEAgLTE3NDMsMyArMTc0Myw0IEBACiBtb2R1bGVfaW5pdChuZXRiYWNrX2luaXQpOwogCiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQUxJQVMoInhlbi1iYWNrZW5kOnZpZiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYwppbmRleCBkMjkzNjVhLi5kN2M4YTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYwpAQCAtNzAsNiArNzAsMTQgQEAKICNkZWZpbmUgTkVUX1JYX1JJTkdfU0laRSBfX0NPTlNUX1JJTkdfU0laRSh4ZW5fbmV0aWZfcngsIFBBR0VfU0laRSkKICNkZWZpbmUgVFhfTUFYX1RBUkdFVCBtaW5fdChpbnQsIE5FVF9SWF9SSU5HX1NJWkUsIDI1NikKIAorc3RydWN0IG5ldGZyb250X3N0YXRzIHsKKwl1NjQJCQlyeF9wYWNrZXRzOworCXU2NAkJCXR4X3BhY2tldHM7CisJdTY0CQkJcnhfYnl0ZXM7CisJdTY0CQkJdHhfYnl0ZXM7CisJc3RydWN0IHU2NF9zdGF0c19zeW5jCXN5bmNwOworfTsKKwogc3RydWN0IG5ldGZyb250X2luZm8gewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwpAQCAtMTIyLDYgKzEzMCw4IEBACiAJc3RydWN0IG1tdV91cGRhdGUgcnhfbW11W05FVF9SWF9SSU5HX1NJWkVdOwogCiAJLyogU3RhdGlzdGljcyAqLworCXN0cnVjdCBuZXRmcm9udF9zdGF0cyBfX3BlcmNwdSAqc3RhdHM7CisKIAl1bnNpZ25lZCBsb25nIHJ4X2dzb19jaGVja3N1bV9maXh1cDsKIH07CiAKQEAgLTQ2OCw2ICs0NzgsNyBAQAogewogCXVuc2lnbmVkIHNob3J0IGlkOwogCXN0cnVjdCBuZXRmcm9udF9pbmZvICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldGZyb250X3N0YXRzICpzdGF0cyA9IHRoaXNfY3B1X3B0cihucC0+c3RhdHMpOwogCXN0cnVjdCB4ZW5fbmV0aWZfdHhfcmVxdWVzdCAqdHg7CiAJc3RydWN0IHhlbl9uZXRpZl9leHRyYV9pbmZvICpleHRyYTsKIAljaGFyICpkYXRhID0gc2tiLT5kYXRhOwpAQCAtNTUyLDggKzU2MywxMCBAQAogCWlmIChub3RpZnkpCiAJCW5vdGlmeV9yZW1vdGVfdmlhX2lycShucC0+bmV0ZGV2LT5pcnEpOwogCi0JZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKLQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzdGF0cy0+c3luY3ApOworCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlzdGF0cy0+dHhfcGFja2V0cysrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZzdGF0cy0+c3luY3ApOwogCiAJLyogTm90ZTogSXQgaXMgbm90IHNhZmUgdG8gYWNjZXNzIHNrYiBhZnRlciB4ZW5uZXRfdHhfYnVmX2djKCkhICovCiAJeGVubmV0X3R4X2J1Zl9nYyhkZXYpOwpAQCAtODQ3LDYgKzg2MCw4IEBACiBzdGF0aWMgaW50IGhhbmRsZV9pbmNvbWluZ19xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpyeHEpCiB7CisJc3RydWN0IG5ldGZyb250X2luZm8gKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0ZnJvbnRfc3RhdHMgKnN0YXRzID0gdGhpc19jcHVfcHRyKG5wLT5zdGF0cyk7CiAJaW50IHBhY2tldHNfZHJvcHBlZCA9IDA7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtODcxLDggKzg4NiwxMCBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmc3RhdHMtPnN5bmNwKTsKKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmc3RhdHMtPnN5bmNwKTsKIAogCQkvKiBQYXNzIGl0IHVwLiAqLwogCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwpAQCAtMTAzNCw2ICsxMDUxLDM4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnhlbm5ldF9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqdG90KQoreworCXN0cnVjdCBuZXRmcm9udF9pbmZvICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3RydWN0IG5ldGZyb250X3N0YXRzICpzdGF0cyA9IHBlcl9jcHVfcHRyKG5wLT5zdGF0cywgY3B1KTsKKwkJdTY0IHJ4X3BhY2tldHMsIHJ4X2J5dGVzLCB0eF9wYWNrZXRzLCB0eF9ieXRlczsKKwkJdW5zaWduZWQgaW50IHN0YXJ0OworCisJCWRvIHsKKwkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2JoKCZzdGF0cy0+c3luY3ApOworCisJCQlyeF9wYWNrZXRzID0gc3RhdHMtPnJ4X3BhY2tldHM7CisJCQl0eF9wYWNrZXRzID0gc3RhdHMtPnR4X3BhY2tldHM7CisJCQlyeF9ieXRlcyA9IHN0YXRzLT5yeF9ieXRlczsKKwkJCXR4X2J5dGVzID0gc3RhdHMtPnR4X2J5dGVzOworCQl9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnlfYmgoJnN0YXRzLT5zeW5jcCwgc3RhcnQpKTsKKworCQl0b3QtPnJ4X3BhY2tldHMgKz0gcnhfcGFja2V0czsKKwkJdG90LT50eF9wYWNrZXRzICs9IHR4X3BhY2tldHM7CisJCXRvdC0+cnhfYnl0ZXMgICArPSByeF9ieXRlczsKKwkJdG90LT50eF9ieXRlcyAgICs9IHR4X2J5dGVzOworCX0KKworCXRvdC0+cnhfZXJyb3JzICA9IGRldi0+c3RhdHMucnhfZXJyb3JzOworCXRvdC0+dHhfZHJvcHBlZCA9IGRldi0+c3RhdHMudHhfZHJvcHBlZDsKKworCXJldHVybiB0b3Q7Cit9CisKIHN0YXRpYyB2b2lkIHhlbm5ldF9yZWxlYXNlX3R4X2J1ZnMoc3RydWN0IG5ldGZyb250X2luZm8gKm5wKQogewogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xMTgyLDYgKzEyMzEsNyBAQAogCS5uZG9fc3RvcCAgICAgICAgICAgID0geGVubmV0X2Nsb3NlLAogCS5uZG9fc3RhcnRfeG1pdCAgICAgID0geGVubmV0X3N0YXJ0X3htaXQsCiAJLm5kb19jaGFuZ2VfbXR1CSAgICAgPSB4ZW5uZXRfY2hhbmdlX210dSwKKwkubmRvX2dldF9zdGF0czY0ICAgICA9IHhlbm5ldF9nZXRfc3RhdHM2NCwKIAkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGV0aF9tYWNfYWRkciwKIAkubmRvX3ZhbGlkYXRlX2FkZHIgICA9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fZml4X2ZlYXR1cmVzICAgID0geGVubmV0X2ZpeF9mZWF0dXJlcywKQEAgLTEyMTYsNiArMTI2NiwxMSBAQAogCW5wLT5yeF9yZWZpbGxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKW5ldGRldjsKIAlucC0+cnhfcmVmaWxsX3RpbWVyLmZ1bmN0aW9uID0gcnhfcmVmaWxsX3RpbWVvdXQ7CiAKKwllcnIgPSAtRU5PTUVNOworCW5wLT5zdGF0cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgbmV0ZnJvbnRfc3RhdHMpOworCWlmIChucC0+c3RhdHMgPT0gTlVMTCkKKwkJZ290byBleGl0OworCiAJLyogSW5pdGlhbGlzZSB0eF9za2JzIGFzIGEgZnJlZSBjaGFpbiBjb250YWluaW5nIGV2ZXJ5IGVudHJ5LiAqLwogCW5wLT50eF9za2JfZnJlZWxpc3QgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBORVRfVFhfUklOR19TSVpFOyBpKyspIHsKQEAgLTEyMzQsNyArMTI4OSw3IEBACiAJCQkJCSAgJm5wLT5ncmVmX3R4X2hlYWQpIDwgMCkgewogCQlwcmludGsoS0VSTl9BTEVSVCAiIyMjIyBuZXRmcm9udCBjYW4ndCBhbGxvYyB0eCBncmFudCByZWZzXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKLQkJZ290byBleGl0OworCQlnb3RvIGV4aXRfZnJlZV9zdGF0czsKIAl9CiAJLyogQSBncmFudCBmb3IgZXZlcnkgcnggcmluZyBzbG90ICovCiAJaWYgKGdudHRhYl9hbGxvY19ncmFudF9yZWZlcmVuY2VzKFJYX01BWF9UQVJHRVQsCkBAIC0xMjcwLDYgKzEzMjUsOCBAQAogCiAgZXhpdF9mcmVlX3R4OgogCWdudHRhYl9mcmVlX2dyYW50X3JlZmVyZW5jZXMobnAtPmdyZWZfdHhfaGVhZCk7CisgZXhpdF9mcmVlX3N0YXRzOgorCWZyZWVfcGVyY3B1KG5wLT5zdGF0cyk7CiAgZXhpdDoKIAlmcmVlX25ldGRldihuZXRkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0xODY5LDYgKzE5MjYsOCBAQAogCiAJeGVubmV0X3N5c2ZzX2RlbGlmKGluZm8tPm5ldGRldik7CiAKKwlmcmVlX3BlcmNwdShpbmZvLT5zdGF0cyk7CisKIAlmcmVlX25ldGRldihpbmZvLT5uZXRkZXYpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94aWxpbnhfZW1hY2xpdGUuYyBiL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jCmluZGV4IDM3MjU3MmMuLjgwMThkN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jCisrKyBiL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJ4aWxpbnhfZW1hY2xpdGUiCiAKQEAgLTI1MSwxMSArMjUyLDExIEBACiAJdTE2ICpmcm9tX3UxNl9wdHIsICp0b191MTZfcHRyOwogCiAJdG9fdTMyX3B0ciA9IGRlc3RfcHRyOwotCWZyb21fdTE2X3B0ciA9ICh1MTYgKikgc3JjX3B0cjsKKwlmcm9tX3UxNl9wdHIgPSBzcmNfcHRyOwogCWFsaWduX2J1ZmZlciA9IDA7CiAKIAlmb3IgKDsgbGVuZ3RoID4gMzsgbGVuZ3RoIC09IDQpIHsKLQkJdG9fdTE2X3B0ciA9ICh1MTYgKikgKCh2b2lkICopICZhbGlnbl9idWZmZXIpOworCQl0b191MTZfcHRyID0gKHUxNiAqKSZhbGlnbl9idWZmZXI7CiAJCSp0b191MTZfcHRyKysgPSAqZnJvbV91MTZfcHRyKys7CiAJCSp0b191MTZfcHRyKysgPSAqZnJvbV91MTZfcHRyKys7CiAKQEAgLTY0Nyw3ICs2NDgsOCBAQAogCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCi0JbmV0aWZfcngoc2tiKTsJCS8qIFNlbmQgdGhlIHBhY2tldCB1cHN0cmVhbSAqLworCWlmICghc2tiX2RlZmVyX3J4X3RpbWVzdGFtcChza2IpKQorCQluZXRpZl9yeChza2IpOwkvKiBTZW5kIHRoZSBwYWNrZXQgdXBzdHJlYW0gKi8KIH0KIAogLyoqCkBAIC0xMDI5LDE1ICsxMDMxLDE5IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5yZXNldF9sb2NrLCBmbGFncyk7CiAJaWYgKHhlbWFjbGl0ZV9zZW5kX2RhdGEobHAsICh1OCAqKSBuZXdfc2tiLT5kYXRhLCBsZW4pICE9IDApIHsKIAkJLyogSWYgdGhlIEVtYWNsaXRlIFR4IGJ1ZmZlciBpcyBidXN5LCBzdG9wIHRoZSBUeCBxdWV1ZSBhbmQKLQkJICogZGVmZXIgdGhlIHNrYiBmb3IgdHJhbnNtaXNzaW9uIGF0IGEgbGF0ZXIgcG9pbnQgd2hlbiB0aGUKKwkJICogZGVmZXIgdGhlIHNrYiBmb3IgdHJhbnNtaXNzaW9uIGR1cmluZyB0aGUgSVNSLCBhZnRlciB0aGUKIAkJICogY3VycmVudCB0cmFuc21pc3Npb24gaXMgY29tcGxldGUgKi8KIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCQlscC0+ZGVmZXJyZWRfc2tiID0gbmV3X3NrYjsKKwkJLyogVGFrZSB0aGUgdGltZSBzdGFtcCBub3csIHNpbmNlIHdlIGNhbid0IGRvIHRoaXMgaW4gYW4gSVNSLiAqLworCQlza2JfdHhfdGltZXN0YW1wKG5ld19za2IpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+cmVzZXRfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnJlc2V0X2xvY2ssIGZsYWdzKTsKIAorCXNrYl90eF90aW1lc3RhbXAobmV3X3NrYik7CisKIAlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKIAlkZXZfa2ZyZWVfc2tiKG5ld19za2IpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC95ZWxsb3dmaW4uYyBiL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCmluZGV4IGVjNDdlMjIuLjNlNWFjNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCkBAIC00NDIsMTkgKzQ0MiwxOSBAQAogCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOwogCWlmICghcmluZ19zcGFjZSkKIAkJZ290byBlcnJfb3V0X2NsZWFyZGV2OwotCW5wLT50eF9yaW5nID0gKHN0cnVjdCB5ZWxsb3dmaW5fZGVzYyAqKXJpbmdfc3BhY2U7CisJbnAtPnR4X3JpbmcgPSByaW5nX3NwYWNlOwogCW5wLT50eF9yaW5nX2RtYSA9IHJpbmdfZG1hOwogCiAJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CiAJaWYgKCFyaW5nX3NwYWNlKQogCQlnb3RvIGVycl9vdXRfdW5tYXBfdHg7Ci0JbnAtPnJ4X3JpbmcgPSAoc3RydWN0IHllbGxvd2Zpbl9kZXNjICopcmluZ19zcGFjZTsKKwlucC0+cnhfcmluZyA9IHJpbmdfc3BhY2U7CiAJbnAtPnJ4X3JpbmdfZG1hID0gcmluZ19kbWE7CiAKIAlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgU1RBVFVTX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CiAJaWYgKCFyaW5nX3NwYWNlKQogCQlnb3RvIGVycl9vdXRfdW5tYXBfcng7Ci0JbnAtPnR4X3N0YXR1cyA9IChzdHJ1Y3QgdHhfc3RhdHVzX3dvcmRzICopcmluZ19zcGFjZTsKKwlucC0+dHhfc3RhdHVzID0gcmluZ19zcGFjZTsKIAlucC0+dHhfc3RhdHVzX2RtYSA9IHJpbmdfZG1hOwogCiAJaWYgKGRldi0+bWVtX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvem5ldC5jIGIvZHJpdmVycy9uZXQvem5ldC5jCmluZGV4IGVjMjgwMGYuLjhiODg4MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3puZXQuYworKysgYi9kcml2ZXJzL25ldC96bmV0LmMKQEAgLTczMSw3ICs3MzEsNyBAQAogCQljdXJfZnJhbWVfZW5kX29mZnNldCAtPSAoKGNvdW50ICsgMSk+PjEpICsgMzsKIAkJaWYgKGN1cl9mcmFtZV9lbmRfb2Zmc2V0IDwgMCkKIAkJICBjdXJfZnJhbWVfZW5kX29mZnNldCArPSBSWF9CVUZfU0laRS8yOwotCX07CisJfQogCiAJLyogTm93IHN0ZXAgIGZvcndhcmQgdGhyb3VnaCB0aGUgbGlzdC4gKi8KIAlkbyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC96b3JybzgzOTAuYyBiL2RyaXZlcnMvbmV0L3pvcnJvODM5MC5jCmluZGV4IDhjN2M1MjIuLjE1ZTc3NTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC96b3JybzgzOTAuYworKysgYi9kcml2ZXJzL25ldC96b3JybzgzOTAuYwpAQCAtMTksNiArMTksOCBAQAogICogIEV0aGVybmV0IENvbnRyb2xsZXJzLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC0zNCwxMTUgKzM2LDI0MiBAQAogI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KICNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgogCi0jZGVmaW5lIEVJX1NISUZUKHgpCShlaV9sb2NhbC0+cmVnX29mZnNldFt4XSkKLSNkZWZpbmUgZWlfaW5iKHBvcnQpICAgaW5fOChwb3J0KQotI2RlZmluZSBlaV9vdXRiKHZhbCxwb3J0KSAgb3V0XzgocG9ydCx2YWwpCi0jZGVmaW5lIGVpX2luYl9wKHBvcnQpICAgaW5fOChwb3J0KQotI2RlZmluZSBlaV9vdXRiX3AodmFsLHBvcnQpICBvdXRfOChwb3J0LHZhbCkKKyNkZWZpbmUgRUlfU0hJRlQoeCkJCShlaV9sb2NhbC0+cmVnX29mZnNldFt4XSkKKyNkZWZpbmUgZWlfaW5iKHBvcnQpCQlpbl84KHBvcnQpCisjZGVmaW5lIGVpX291dGIodmFsLCBwb3J0KQlvdXRfOChwb3J0LCB2YWwpCisjZGVmaW5lIGVpX2luYl9wKHBvcnQpCQlpbl84KHBvcnQpCisjZGVmaW5lIGVpX291dGJfcCh2YWwsIHBvcnQpCW91dF84KHBvcnQsIHZhbCkKIAogc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KLSAgICAiODM5MC5jOnYxLjEwY3ZzIDkvMjMvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKKwkiODM5MC5jOnYxLjEwY3ZzIDkvMjMvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKIAogI2luY2x1ZGUgImxpYjgzOTAuYyIKIAogI2RlZmluZSBEUlZfTkFNRQkiem9ycm84MzkwIgogCiAjZGVmaW5lIE5FX0JBU0UJCShkZXYtPmJhc2VfYWRkcikKLSNkZWZpbmUgTkVfQ01ECQkoMHgwMCoyKQotI2RlZmluZSBORV9EQVRBUE9SVAkoMHgxMCoyKQkvKiBOYXRTZW1pLWRlZmluZWQgcG9ydCB3aW5kb3cgb2Zmc2V0LiAqLwotI2RlZmluZSBORV9SRVNFVAkoMHgxZioyKQkvKiBJc3N1ZSBhIHJlYWQgdG8gcmVzZXQsIGEgd3JpdGUgdG8gY2xlYXIuICovCi0jZGVmaW5lIE5FX0lPX0VYVEVOVAkoMHgyMCoyKQorI2RlZmluZSBORV9DTUQJCSgweDAwICogMikKKyNkZWZpbmUgTkVfREFUQVBPUlQJKDB4MTAgKiAyKQkvKiBOYXRTZW1pLWRlZmluZWQgcG9ydCB3aW5kb3cgb2Zmc2V0ICovCisjZGVmaW5lIE5FX1JFU0VUCSgweDFmICogMikJLyogSXNzdWUgYSByZWFkIHRvIHJlc2V0LAorCQkJCQkgKiBhIHdyaXRlIHRvIGNsZWFyLiAqLworI2RlZmluZSBORV9JT19FWFRFTlQJKDB4MjAgKiAyKQogCi0jZGVmaW5lIE5FX0VOMF9JU1IJKDB4MDcqMikKLSNkZWZpbmUgTkVfRU4wX0RDRkcJKDB4MGUqMikKKyNkZWZpbmUgTkVfRU4wX0lTUgkoMHgwNyAqIDIpCisjZGVmaW5lIE5FX0VOMF9EQ0ZHCSgweDBlICogMikKIAotI2RlZmluZSBORV9FTjBfUlNBUkxPCSgweDA4KjIpCi0jZGVmaW5lIE5FX0VOMF9SU0FSSEkJKDB4MDkqMikKLSNkZWZpbmUgTkVfRU4wX1JDTlRMTwkoMHgwYSoyKQotI2RlZmluZSBORV9FTjBfUlhDUgkoMHgwYyoyKQotI2RlZmluZSBORV9FTjBfVFhDUgkoMHgwZCoyKQotI2RlZmluZSBORV9FTjBfUkNOVEhJCSgweDBiKjIpCi0jZGVmaW5lIE5FX0VOMF9JTVIJKDB4MGYqMikKKyNkZWZpbmUgTkVfRU4wX1JTQVJMTwkoMHgwOCAqIDIpCisjZGVmaW5lIE5FX0VOMF9SU0FSSEkJKDB4MDkgKiAyKQorI2RlZmluZSBORV9FTjBfUkNOVExPCSgweDBhICogMikKKyNkZWZpbmUgTkVfRU4wX1JYQ1IJKDB4MGMgKiAyKQorI2RlZmluZSBORV9FTjBfVFhDUgkoMHgwZCAqIDIpCisjZGVmaW5lIE5FX0VOMF9SQ05USEkJKDB4MGIgKiAyKQorI2RlZmluZSBORV9FTjBfSU1SCSgweDBmICogMikKIAogI2RlZmluZSBORVNNX1NUQVJUX1BHCTB4NDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KICNkZWZpbmUgTkVTTV9TVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KIAotCi0jZGVmaW5lIFdPUkRTV0FQKGEpCSgoKChhKT4+OCkmMHhmZikgfCAoKGEpPDw4KSkKLQorI2RlZmluZSBXT1JEU1dBUChhKQkoKCgoYSkgPj4gOCkgJiAweGZmKSB8ICgoYSkgPDwgOCkpCiAKIHN0YXRpYyBzdHJ1Y3QgY2FyZF9pbmZvIHsKLSAgICB6b3Jyb19pZCBpZDsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisJem9ycm9faWQgaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwogfSBjYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Ci0gICAgeyBaT1JST19QUk9EX1ZJTExBR0VfVFJPTklDX0FSSUFETkUyLCAiQXJpYWRuZSBJSSIsIDB4MDYwMCB9LAotICAgIHsgWk9SUk9fUFJPRF9JTkRJVklEVUFMX0NPTVBVVEVSU19YX1NVUkYsICJYLVN1cmYiLCAweDg2MDAgfSwKKwl7IFpPUlJPX1BST0RfVklMTEFHRV9UUk9OSUNfQVJJQURORTIsICJBcmlhZG5lIElJIiwgMHgwNjAwIH0sCisJeyBaT1JST19QUk9EX0lORElWSURVQUxfQ09NUFVURVJTX1hfU1VSRiwgIlgtU3VyZiIsIDB4ODYwMCB9LAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgem9ycm84MzkwX2luaXRfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnosCi0JCQkJCWNvbnN0IHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgKmVudCk7Ci1zdGF0aWMgaW50IF9fZGV2aW5pdCB6b3JybzgzOTBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGJvYXJkLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGlvYWRkcik7Ci1zdGF0aWMgaW50IHpvcnJvODM5MF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCB6b3JybzgzOTBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCB6b3JybzgzOTBfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8qIEhhcmQgcmVzZXQgdGhlIGNhcmQuICBUaGlzIHVzZWQgdG8gcGF1c2UgZm9yIHRoZSBzYW1lIHBlcmlvZCB0aGF0IGEKKyAqIDgzOTAgcmVzZXQgY29tbWFuZCByZXF1aXJlZCwgYnV0IHRoYXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIHZvaWQgem9ycm84MzkwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJaWYgKGVpX2RlYnVnID4gMSkKKwkJbmV0ZGV2X2RiZyhkZXYsICJyZXNldHRpbmcgLSB0PSVsZC4uLlxuIiwgamlmZmllcyk7CisKKwl6X3dyaXRlYih6X3JlYWRiKE5FX0JBU0UgKyBORV9SRVNFVCksIE5FX0JBU0UgKyBORV9SRVNFVCk7CisKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCWVpX3N0YXR1cy5kbWFpbmcgPSAwOworCisJLyogVGhpcyBjaGVjayBfc2hvdWxkX25vdF8gYmUgbmVjZXNzYXJ5LCBvbWl0IGV2ZW50dWFsbHkuICovCisJd2hpbGUgKCh6X3JlYWRiKE5FX0JBU0UgKyBORV9FTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSA9PSAwKQorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCByZXNldF9zdGFydF90aW1lICsgMiAqIEhaIC8gMTAwKSkgeworCQkJbmV0ZGV2X3dhcm4oZGV2LCAiJXM6IGRpZCBub3QgY29tcGxldGVcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJel93cml0ZWIoRU5JU1JfUkVTRVQsIE5FX0JBU0UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIgKi8KK30KKworLyogR3JhYiB0aGUgODM5MCBzcGVjaWZpYyBoZWFkZXIuIFNpbWlsYXIgdG8gdGhlIGJsb2NrX2lucHV0IHJvdXRpbmUsIGJ1dAorICogd2UgZG9uJ3QgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aCByaW5nIHdyYXAgYXMgdGhlIGhlYWRlciB3aWxsIGJlIGF0CisgKiB0aGUgc3RhcnQgb2YgYSBwYWdlLCBzbyB3ZSBvcHRpbWl6ZSBhY2NvcmRpbmdseS4KKyAqLwogc3RhdGljIHZvaWQgem9ycm84MzkwX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpOworCQkJCSAgIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCit7CisJaW50IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGNudDsKKwlzaG9ydCAqcHRyczsKKworCS8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLgorCSAqIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZQorCSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiJXM6IERNQWluZyBjb25mbGljdCBbRE1Bc3RhdDolZF1baXJxbG9jazolZF1cbiIsCisJCQkgICBfX2Z1bmNfXywgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCQlyZXR1cm47CisJfQorCisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCXpfd3JpdGViKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAgKyBFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCXpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsKKwl6X3dyaXRlYihzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpLCBuaWNfYmFzZSArIE5FX0VOMF9SQ05UTE8pOworCXpfd3JpdGViKDAsIG5pY19iYXNlICsgTkVfRU4wX1JDTlRISSk7CisJel93cml0ZWIoMCwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkxPKTsJCS8qIE9uIHBhZ2UgYm91bmRhcnkgKi8KKwl6X3dyaXRlYihyaW5nX3BhZ2UsIG5pY19iYXNlICsgTkVfRU4wX1JTQVJISSk7CisJel93cml0ZWIoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKworCXB0cnMgPSAoc2hvcnQgKiloZHI7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpID4+IDE7IGNudCsrKQorCQkqcHRycysrID0gel9yZWFkdyhORV9CQVNFICsgTkVfREFUQVBPUlQpOworCisJel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOwkvKiBBY2sgaW50ciAqLworCisJaGRyLT5jb3VudCA9IFdPUkRTV0FQKGhkci0+Y291bnQpOworCisJZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCwgc2ltaWxhciB0byB0aGUgQ3J5bndyIHBhY2tldCBkcml2ZXIuCisgKiBJZiB5b3UgYXJlIHBvcnRpbmcgdG8gYSBuZXcgZXRoZXJjYXJkLCBsb29rIGF0IHRoZSBwYWNrZXQgZHJpdmVyIHNvdXJjZQorICogZm9yIGhpbnRzLiBUaGUgTkV4MDAwIGRvZXNuJ3Qgc2hhcmUgdGhlIG9uLWJvYXJkIHBhY2tldCBtZW1vcnkgLS0KKyAqIHlvdSBoYXZlIHRvIHB1dCB0aGUgcGFja2V0IG91dCB0aHJvdWdoIHRoZSAicmVtb3RlIERNQSIgZGF0YXBvcnQKKyAqIHVzaW5nIHpfd3JpdGViLgorICovCiBzdGF0aWMgdm9pZCB6b3JybzgzOTBfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAotCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKLXN0YXRpYyB2b2lkIHpvcnJvODM5MF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgaW50IGNvdW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworCWludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKwlzaG9ydCAqcHRyczsKKwlpbnQgY250OworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uCisJICogSWYgaXQgZG9lcywgaXQncyB0aGUgbGFzdCB0aGluZyB5b3UnbGwgc2VlCisJICovCisJaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwkJbmV0ZGV2X2VycihkZXYsICIlczogRE1BaW5nIGNvbmZsaWN0IFtETUFzdGF0OiVkXVtpcnFsb2NrOiVkXVxuIiwKKwkJCSAgIF9fZnVuY19fLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CisJCXJldHVybjsKKwl9CisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCXpfd3JpdGViKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAgKyBFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCXpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsKKwl6X3dyaXRlYihjb3VudCAmIDB4ZmYsIG5pY19iYXNlICsgTkVfRU4wX1JDTlRMTyk7CisJel93cml0ZWIoY291bnQgPj4gOCwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVEhJKTsKKwl6X3dyaXRlYihyaW5nX29mZnNldCAmIDB4ZmYsIG5pY19iYXNlICsgTkVfRU4wX1JTQVJMTyk7CisJel93cml0ZWIocmluZ19vZmZzZXQgPj4gOCwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkhJKTsKKwl6X3dyaXRlYihFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCXB0cnMgPSAoc2hvcnQgKilidWY7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBjb3VudCA+PiAxOyBjbnQrKykKKwkJKnB0cnMrKyA9IHpfcmVhZHcoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKwlpZiAoY291bnQgJiAweDAxKQorCQlidWZbY291bnQgLSAxXSA9IHpfcmVhZGIoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKworCXpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIgKi8KKwllaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworfQorCitzdGF0aWMgdm9pZCB6b3JybzgzOTBfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKIAkJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCi0JCQkJICAgY29uc3QgaW50IHN0YXJ0X3BhZ2UpOwotc3RhdGljIHZvaWQgX19kZXZleGl0IHpvcnJvODM5MF9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopOworCQkJCSAgIGNvbnN0IGludCBzdGFydF9wYWdlKQoreworCWludCBuaWNfYmFzZSA9IE5FX0JBU0U7CisJdW5zaWduZWQgbG9uZyBkbWFfc3RhcnQ7CisJc2hvcnQgKnB0cnM7CisJaW50IGNudDsKKworCS8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuICBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/CisJICogV2hhdCBlZmZlY3Qgd2lsbCBhbiBvZGQgYnl0ZSBjb3VudCBoYXZlIG9uIHRoZSA4MzkwPworCSAqIEkgc2hvdWxkIGNoZWNrIHNvbWVkYXkuCisJICovCisJaWYgKGNvdW50ICYgMHgwMSkKKwkJY291bnQrKzsKKworCS8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLgorCSAqIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZQorCSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiJXM6IERNQWluZyBjb25mbGljdCBbRE1Bc3RhdDolZF1baXJxbG9jazolZF1cbiIsCisJCQkgICBfX2Z1bmNfXywgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCQlyZXR1cm47CisJfQorCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwkvKiBXZSBzaG91bGQgYWxyZWFkeSBiZSBpbiBwYWdlIDAsIGJ1dCB0byBiZSBzYWZlLi4uICovCisJel93cml0ZWIoRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQrRTgzOTBfTk9ETUEsIG5pY19iYXNlICsgTkVfQ01EKTsKKworCXpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsKKworCS8qIE5vdyB0aGUgbm9ybWFsIG91dHB1dC4gKi8KKwl6X3dyaXRlYihjb3VudCAmIDB4ZmYsIG5pY19iYXNlICsgTkVfRU4wX1JDTlRMTyk7CisJel93cml0ZWIoY291bnQgPj4gOCwgICBuaWNfYmFzZSArIE5FX0VOMF9SQ05USEkpOworCXpfd3JpdGViKDB4MDAsIG5pY19iYXNlICsgTkVfRU4wX1JTQVJMTyk7CisJel93cml0ZWIoc3RhcnRfcGFnZSwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkhJKTsKKworCXpfd3JpdGViKEU4MzkwX1JXUklURSArIEU4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisJcHRycyA9IChzaG9ydCAqKWJ1ZjsKKwlmb3IgKGNudCA9IDA7IGNudCA8IGNvdW50ID4+IDE7IGNudCsrKQorCQl6X3dyaXRldygqcHRycysrLCBORV9CQVNFICsgTkVfREFUQVBPUlQpOworCisJZG1hX3N0YXJ0ID0gamlmZmllczsKKworCXdoaWxlICgoel9yZWFkYihORV9CQVNFICsgTkVfRU4wX0lTUikgJiBFTklTUl9SREMpID09IDApCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRtYV9zdGFydCArIDIgKiBIWiAvIDEwMCkpIHsKKwkJCQkJLyogMjBtcyAqLworCQkJbmV0ZGV2X2VycihkZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIFR4IFJEQ1xuIik7CisJCQl6b3JybzgzOTBfcmVzZXRfODM5MChkZXYpOworCQkJX19OUzgzOTBfaW5pdChkZXYsIDEpOworCQkJYnJlYWs7CisJCX0KKworCXpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIgKi8KKwllaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworfQorCitzdGF0aWMgaW50IHpvcnJvODM5MF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJX19laV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgem9ycm84MzkwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGVpX2RlYnVnID4gMSkKKwkJbmV0ZGV2X2RiZyhkZXYsICJTaHV0dGluZyBkb3duIGV0aGVyY2FyZFxuIik7CisJX19laV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgem9ycm84MzkwX3JlbW92ZV9vbmUoc3RydWN0IHpvcnJvX2RldiAqeikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gem9ycm9fZ2V0X2RydmRhdGEoeik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgZGV2KTsKKwlyZWxlYXNlX21lbV9yZWdpb24oWlRXT19QQUREUihkZXYtPmJhc2VfYWRkciksIE5FX0lPX0VYVEVOVCAqIDIpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CiAKIHN0YXRpYyBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkIHpvcnJvODM5MF96b3Jyb190YmxbXSBfX2RldmluaXRkYXRhID0gewotICAgIHsgWk9SUk9fUFJPRF9WSUxMQUdFX1RST05JQ19BUklBRE5FMiwgfSwKLSAgICB7IFpPUlJPX1BST0RfSU5ESVZJRFVBTF9DT01QVVRFUlNfWF9TVVJGLCB9LAotICAgIHsgMCB9CisJeyBaT1JST19QUk9EX1ZJTExBR0VfVFJPTklDX0FSSUFETkUyLCB9LAorCXsgWk9SUk9fUFJPRF9JTkRJVklEVUFMX0NPTVBVVEVSU19YX1NVUkYsIH0sCisJeyAwIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHpvcnJvLCB6b3JybzgzOTBfem9ycm9fdGJsKTsKIAotc3RhdGljIHN0cnVjdCB6b3Jyb19kcml2ZXIgem9ycm84MzkwX2RyaXZlciA9IHsKLSAgICAubmFtZQk9ICJ6b3JybzgzOTAiLAotICAgIC5pZF90YWJsZQk9IHpvcnJvODM5MF96b3Jyb190YmwsCi0gICAgLnByb2JlCT0gem9ycm84MzkwX2luaXRfb25lLAotICAgIC5yZW1vdmUJPSBfX2RldmV4aXRfcCh6b3JybzgzOTBfcmVtb3ZlX29uZSksCi19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCB6b3JybzgzOTBfaW5pdF9vbmUoc3RydWN0IHpvcnJvX2RldiAqeiwKLQkJCQkJY29uc3Qgc3RydWN0IHpvcnJvX2RldmljZV9pZCAqZW50KQotewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0gICAgdW5zaWduZWQgbG9uZyBib2FyZCwgaW9hZGRyOwotICAgIGludCBlcnIsIGk7Ci0KLSAgICBmb3IgKGkgPSBBUlJBWV9TSVpFKGNhcmRzKS0xOyBpID49IDA7IGktLSkKLQlpZiAoei0+aWQgPT0gY2FyZHNbaV0uaWQpCi0JICAgIGJyZWFrOwotICAgIGlmIChpIDwgMCkKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OwotICAgIGlvYWRkciA9IGJvYXJkK2NhcmRzW2ldLm9mZnNldDsKLSAgICBkZXYgPSBfX19fYWxsb2NfZWlfbmV0ZGV2KDApOwotICAgIGlmICghZGV2KQotCXJldHVybiAtRU5PTUVNOwotICAgIGlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGlvYWRkciwgTkVfSU9fRVhURU5UKjIsIERSVl9OQU1FKSkgewotCWZyZWVfbmV0ZGV2KGRldik7Ci0JcmV0dXJuIC1FQlVTWTsKLSAgICB9Ci0gICAgaWYgKChlcnIgPSB6b3JybzgzOTBfaW5pdChkZXYsIGJvYXJkLCBjYXJkc1tpXS5uYW1lLAotCQkJICAgICAgWlRXT19WQUREUihpb2FkZHIpKSkpIHsKLQlyZWxlYXNlX21lbV9yZWdpb24oaW9hZGRyLCBORV9JT19FWFRFTlQqMik7Ci0JZnJlZV9uZXRkZXYoZGV2KTsKLQlyZXR1cm4gZXJyOwotICAgIH0KLSAgICB6b3Jyb19zZXRfZHJ2ZGF0YSh6LCBkZXYpOwotICAgIHJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHpvcnJvODM5MF9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbgkJPSB6b3JybzgzOTBfb3BlbiwKIAkubmRvX3N0b3AJCT0gem9ycm84MzkwX2Nsb3NlLApAQCAtMTUxLDcgKzI4MCw3IEBACiAJLm5kb19nZXRfc3RhdHMJCT0gX19laV9nZXRfc3RhdHMsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBfX2VpX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLQkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBfX2VpX3BvbGwsCkBAIC0xNjIsMjk1ICsyOTEsMTU5IEBACiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgYm9hcmQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyKQogewotICAgIGludCBpOwotICAgIGludCBlcnI7Ci0gICAgdW5zaWduZWQgY2hhciBTQV9wcm9tWzMyXTsKLSAgICBpbnQgc3RhcnRfcGFnZSwgc3RvcF9wYWdlOwotICAgIHN0YXRpYyB1MzIgem9ycm84MzkwX29mZnNldHNbMTZdID0gewotCTB4MDAsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MGEsIDB4MGMsIDB4MGUsCi0JMHgxMCwgMHgxMiwgMHgxNCwgMHgxNiwgMHgxOCwgMHgxYSwgMHgxYywgMHgxZSwKLSAgICB9OwotCi0gICAgLyogUmVzZXQgY2FyZC4gV2hvIGtub3dzIHdoYXQgZGFpbi1icmFtYWdlZCBzdGF0ZSBpdCB3YXMgbGVmdCBpbi4gKi8KLSAgICB7Ci0JdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKLQotCXpfd3JpdGViKHpfcmVhZGIoaW9hZGRyICsgTkVfUkVTRVQpLCBpb2FkZHIgKyBORV9SRVNFVCk7Ci0KLQl3aGlsZSAoKHpfcmVhZGIoaW9hZGRyICsgTkVfRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkKLQkgICAgaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcmVzZXRfc3RhcnRfdGltZSArIDIqSFovMTAwKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIgbm90IGZvdW5kIChubyByZXNldCBhY2spLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCSAgICB9Ci0KLQl6X3dyaXRlYigweGZmLCBpb2FkZHIgKyBORV9FTjBfSVNSKTsJCS8qIEFjayBhbGwgaW50ci4gKi8KLSAgICB9Ci0KLSAgICAvKiBSZWFkIHRoZSAxNiBieXRlcyBvZiBzdGF0aW9uIGFkZHJlc3MgUFJPTS4KLSAgICAgICBXZSBtdXN0IGZpcnN0IGluaXRpYWxpemUgcmVnaXN0ZXJzLCBzaW1pbGFyIHRvIE5TODM5MF9pbml0KGVpZmRldiwgMCkuCi0gICAgICAgV2UgY2FuJ3QgcmVsaWFibHkgcmVhZCB0aGUgU0FQUk9NIGFkZHJlc3Mgd2l0aG91dCB0aGlzLgotICAgICAgIChJIGxlYXJuZWQgdGhlIGhhcmQgd2F5ISkuICovCi0gICAgewotCXN0cnVjdCB7Ci0JICAgIHUzMiB2YWx1ZTsKLQkgICAgdTMyIG9mZnNldDsKLQl9IHByb2dyYW1fc2VxW10gPSB7Ci0JICAgIHtFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBORV9DTUR9LCAvKiBTZWxlY3QgcGFnZSAwKi8KLQkgICAgezB4NDgsCU5FX0VOMF9EQ0ZHfSwJLyogU2V0IGJ5dGUtd2lkZSAoMHg0OCkgYWNjZXNzLiAqLwotCSAgICB7MHgwMCwJTkVfRU4wX1JDTlRMT30sCS8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLwotCSAgICB7MHgwMCwJTkVfRU4wX1JDTlRISX0sCi0JICAgIHsweDAwLAlORV9FTjBfSU1SfSwJLyogTWFzayBjb21wbGV0aW9uIGlycS4gKi8KLQkgICAgezB4RkYsCU5FX0VOMF9JU1J9LAotCSAgICB7RTgzOTBfUlhPRkYsIE5FX0VOMF9SWENSfSwJLyogMHgyMCAgU2V0IHRvIG1vbml0b3IgKi8KLQkgICAge0U4MzkwX1RYT0ZGLCBORV9FTjBfVFhDUn0sCS8qIDB4MDIgIGFuZCBsb29wYmFjayBtb2RlLiAqLwotCSAgICB7MzIsCU5FX0VOMF9SQ05UTE99LAotCSAgICB7MHgwMCwJTkVfRU4wX1JDTlRISX0sCi0JICAgIHsweDAwLAlORV9FTjBfUlNBUkxPfSwJLyogRE1BIHN0YXJ0aW5nIGF0IDB4MDAwMC4gKi8KLQkgICAgezB4MDAsCU5FX0VOMF9SU0FSSEl9LAotCSAgICB7RTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIE5FX0NNRH0sCisJaW50IGk7CisJaW50IGVycjsKKwl1bnNpZ25lZCBjaGFyIFNBX3Byb21bMzJdOworCWludCBzdGFydF9wYWdlLCBzdG9wX3BhZ2U7CisJc3RhdGljIHUzMiB6b3JybzgzOTBfb2Zmc2V0c1sxNl0gPSB7CisJCTB4MDAsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MGEsIDB4MGMsIDB4MGUsCisJCTB4MTAsIDB4MTIsIDB4MTQsIDB4MTYsIDB4MTgsIDB4MWEsIDB4MWMsIDB4MWUsCiAJfTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcm9ncmFtX3NlcSk7IGkrKykgewotCSAgICB6X3dyaXRlYihwcm9ncmFtX3NlcVtpXS52YWx1ZSwgaW9hZGRyICsgcHJvZ3JhbV9zZXFbaV0ub2Zmc2V0KTsKLQl9Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JU0FfcHJvbVtpXSA9IHpfcmVhZGIoaW9hZGRyICsgTkVfREFUQVBPUlQpOwotCSh2b2lkKXpfcmVhZGIoaW9hZGRyICsgTkVfREFUQVBPUlQpOwotICAgIH0KIAotICAgIC8qIFdlIG11c3Qgc2V0IHRoZSA4MzkwIGZvciB3b3JkIG1vZGUuICovCi0gICAgel93cml0ZWIoMHg0OSwgaW9hZGRyICsgTkVfRU4wX0RDRkcpOwotICAgIHN0YXJ0X3BhZ2UgPSBORVNNX1NUQVJUX1BHOwotICAgIHN0b3BfcGFnZSA9IE5FU01fU1RPUF9QRzsKKwkvKiBSZXNldCBjYXJkLiBXaG8ga25vd3Mgd2hhdCBkYWluLWJyYW1hZ2VkIHN0YXRlIGl0IHdhcyBsZWZ0IGluLiAqLworCXsKKwkJdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKIAotICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOwotICAgIGRldi0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOworCQl6X3dyaXRlYih6X3JlYWRiKGlvYWRkciArIE5FX1JFU0VUKSwgaW9hZGRyICsgTkVfUkVTRVQpOwogCi0gICAgLyogSW5zdGFsbCB0aGUgSW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBpID0gcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBfX2VpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBkZXYpOwotICAgIGlmIChpKSByZXR1cm4gaTsKKwkJd2hpbGUgKCh6X3JlYWRiKGlvYWRkciArIE5FX0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLAorCQkJCSAgICAgICByZXNldF9zdGFydF90aW1lICsgMiAqIEhaIC8gMTAwKSkgeworCQkJCW5ldGRldl93YXJuKGRldiwgIm5vdCBmb3VuZCAobm8gcmVzZXQgYWNrKVxuIik7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CiAKLSAgICBmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQotCWRldi0+ZGV2X2FkZHJbaV0gPSBTQV9wcm9tW2ldOwotCi0jaWZkZWYgREVCVUcKLSAgICBwcmludGsoIiVwTSIsIGRldi0+ZGV2X2FkZHIpOwotI2VuZGlmCi0KLSAgICBlaV9zdGF0dXMubmFtZSA9IG5hbWU7Ci0gICAgZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlOwotICAgIGVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBzdG9wX3BhZ2U7Ci0gICAgZWlfc3RhdHVzLndvcmQxNiA9IDE7Ci0KLSAgICBlaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IHN0YXJ0X3BhZ2UgKyBUWF9QQUdFUzsKLQotICAgIGVpX3N0YXR1cy5yZXNldF84MzkwID0gJnpvcnJvODM5MF9yZXNldF84MzkwOwotICAgIGVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZ6b3JybzgzOTBfYmxvY2tfaW5wdXQ7Ci0gICAgZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZ6b3JybzgzOTBfYmxvY2tfb3V0cHV0OwotICAgIGVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmem9ycm84MzkwX2dldF84MzkwX2hkcjsKLSAgICBlaV9zdGF0dXMucmVnX29mZnNldCA9IHpvcnJvODM5MF9vZmZzZXRzOwotCi0gICAgZGV2LT5uZXRkZXZfb3BzID0gJnpvcnJvODM5MF9uZXRkZXZfb3BzOwotICAgIF9fTlM4MzkwX2luaXQoZGV2LCAwKTsKLSAgICBlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLSAgICBpZiAoZXJyKSB7Ci0JZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBkZXYpOwotCXJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0IDB4JTA4bHgsIEV0aGVybmV0IEFkZHJlc3MgJXBNXG4iLAotCSAgIGRldi0+bmFtZSwgbmFtZSwgYm9hcmQsIGRldi0+ZGV2X2FkZHIpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgem9ycm84MzkwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICBfX2VpX29wZW4oZGV2KTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB6b3JybzgzOTBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICBpZiAoZWlfZGVidWcgPiAxKQotCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOwotICAgIF9fZWlfY2xvc2UoZGV2KTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogSGFyZCByZXNldCB0aGUgY2FyZC4gIFRoaXMgdXNlZCB0byBwYXVzZSBmb3IgdGhlIHNhbWUgcGVyaW9kIHRoYXQgYQotICAgODM5MCByZXNldCBjb21tYW5kIHJlcXVpcmVkLCBidXQgdGhhdCBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LiAqLwotc3RhdGljIHZvaWQgem9ycm84MzkwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICB1bnNpZ25lZCBsb25nIHJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOwotCi0gICAgaWYgKGVpX2RlYnVnID4gMSkKLQlwcmludGsoS0VSTl9ERUJVRyAicmVzZXR0aW5nIHRoZSA4MzkwIHQ9JWxkLi4uXG4iLCBqaWZmaWVzKTsKLQotICAgIHpfd3JpdGViKHpfcmVhZGIoTkVfQkFTRSArIE5FX1JFU0VUKSwgTkVfQkFTRSArIE5FX1JFU0VUKTsKLQotICAgIGVpX3N0YXR1cy50eGluZyA9IDA7Ci0gICAgZWlfc3RhdHVzLmRtYWluZyA9IDA7Ci0KLSAgICAvKiBUaGlzIGNoZWNrIF9zaG91bGRfbm90XyBiZSBuZWNlc3NhcnksIG9taXQgZXZlbnR1YWxseS4gKi8KLSAgICB3aGlsZSAoKHpfcmVhZGIoTkVfQkFTRStORV9FTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSA9PSAwKQotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHJlc2V0X3N0YXJ0X3RpbWUgKyAyKkhaLzEwMCkpIHsKLQkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5lX3Jlc2V0XzgzOTAoKSBkaWQgbm90IGNvbXBsZXRlLlxuIiwKLQkJICAgZGV2LT5uYW1lKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIHpfd3JpdGViKEVOSVNSX1JFU0VULCBORV9CQVNFICsgTkVfRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLwotfQotCi0vKiBHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0Ci0gICB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKLSAgIHRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LiAqLwotCi1zdGF0aWMgdm9pZCB6b3JybzgzOTBfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKLXsKLSAgICBpbnQgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKLSAgICBpbnQgY250OwotICAgIHNob3J0ICpwdHJzOwotCi0gICAgLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLwotICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7Ci0JcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2dldF84MzkwX2hkciAiCi0JICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsIGRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywKLQkgICBlaV9zdGF0dXMuaXJxbG9jayk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKLSAgICB6X3dyaXRlYihFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7Ci0gICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOwotICAgIHpfd3JpdGViKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkciksIG5pY19iYXNlICsgTkVfRU4wX1JDTlRMTyk7Ci0gICAgel93cml0ZWIoMCwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVEhJKTsKLSAgICB6X3dyaXRlYigwLCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLwotICAgIHpfd3JpdGViKHJpbmdfcGFnZSwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkhJKTsKLSAgICB6X3dyaXRlYihFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOwotCi0gICAgcHRycyA9IChzaG9ydCopaGRyOwotICAgIGZvciAoY250ID0gMDsgY250IDwgKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik+PjEpOyBjbnQrKykKLQkqcHRycysrID0gel9yZWFkdyhORV9CQVNFICsgTkVfREFUQVBPUlQpOwotCi0gICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KLQotICAgIGhkci0+Y291bnQgPSBXT1JEU1dBUChoZHItPmNvdW50KTsKLQotICAgIGVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Ci19Ci0KLS8qIEJsb2NrIGlucHV0IGFuZCBvdXRwdXQsIHNpbWlsYXIgdG8gdGhlIENyeW53ciBwYWNrZXQgZHJpdmVyLiAgSWYgeW91Ci0gICBhcmUgcG9ydGluZyB0byBhIG5ldyBldGhlcmNhcmQsIGxvb2sgYXQgdGhlIHBhY2tldCBkcml2ZXIgc291cmNlIGZvciBoaW50cy4KLSAgIFRoZSBORXgwMDAgZG9lc24ndCBzaGFyZSB0aGUgb24tYm9hcmQgcGFja2V0IG1lbW9yeSAtLSB5b3UgaGF2ZSB0byBwdXQKLSAgIHRoZSBwYWNrZXQgb3V0IHRocm91Z2ggdGhlICJyZW1vdGUgRE1BIiBkYXRhcG9ydCB1c2luZyB6X3dyaXRlYi4gKi8KLQotc3RhdGljIHZvaWQgem9ycm84MzkwX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKLQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQotewotICAgIGludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOwotICAgIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKLSAgICBzaG9ydCAqcHRyczsKLSAgICBpbnQgY250OwotCi0gICAgLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLwotICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7Ci0JcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2Jsb2NrX2lucHV0ICIKLQkgICAiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdLlxuIiwKLQkgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKLSAgICB6X3dyaXRlYihFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7Ci0gICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOwotICAgIHpfd3JpdGViKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVExPKTsKLSAgICB6X3dyaXRlYihjb3VudCA+PiA4LCBuaWNfYmFzZSArIE5FX0VOMF9SQ05USEkpOwotICAgIHpfd3JpdGViKHJpbmdfb2Zmc2V0ICYgMHhmZiwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkxPKTsKLSAgICB6X3dyaXRlYihyaW5nX29mZnNldCA+PiA4LCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSSEkpOwotICAgIHpfd3JpdGViKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7Ci0gICAgcHRycyA9IChzaG9ydCopYnVmOwotICAgIGZvciAoY250ID0gMDsgY250IDwgKGNvdW50Pj4xKTsgY250KyspCi0JKnB0cnMrKyA9IHpfcmVhZHcoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKLSAgICBpZiAoY291bnQgJiAweDAxKQotCWJ1Zltjb3VudC0xXSA9IHpfcmVhZGIoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKLQotICAgIHpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIuICovCi0gICAgZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKLX0KLQotc3RhdGljIHZvaWQgem9ycm84MzkwX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCi0JCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAotCQkJCSAgIGNvbnN0IGludCBzdGFydF9wYWdlKQotewotICAgIGludCBuaWNfYmFzZSA9IE5FX0JBU0U7Ci0gICAgdW5zaWduZWQgbG9uZyBkbWFfc3RhcnQ7Ci0gICAgc2hvcnQgKnB0cnM7Ci0gICAgaW50IGNudDsKLQotICAgIC8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuICBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/Ci0gICAgICAgV2hhdCBlZmZlY3Qgd2lsbCBhbiBvZGQgYnl0ZSBjb3VudCBoYXZlIG9uIHRoZSA4MzkwPwotICAgICAgIEkgc2hvdWxkIGNoZWNrIHNvbWVkYXkuICovCi0gICAgaWYgKGNvdW50ICYgMHgwMSkKLQljb3VudCsrOwotCi0gICAgLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLwotICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7Ci0JcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2Jsb2NrX291dHB1dC4iCi0JICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXVxuIiwgZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLAotCSAgIGVpX3N0YXR1cy5pcnFsb2NrKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKLSAgICAvKiBXZSBzaG91bGQgYWxyZWFkeSBiZSBpbiBwYWdlIDAsIGJ1dCB0byBiZSBzYWZlLi4uICovCi0gICAgel93cml0ZWIoRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQrRTgzOTBfTk9ETUEsIG5pY19iYXNlICsgTkVfQ01EKTsKLQotICAgIHpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsKLQotICAgLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLwotICAgIHpfd3JpdGViKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVExPKTsKLSAgICB6X3dyaXRlYihjb3VudCA+PiA4LCAgIG5pY19iYXNlICsgTkVfRU4wX1JDTlRISSk7Ci0gICAgel93cml0ZWIoMHgwMCwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkxPKTsKLSAgICB6X3dyaXRlYihzdGFydF9wYWdlLCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSSEkpOwotCi0gICAgel93cml0ZWIoRTgzOTBfUldSSVRFK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7Ci0gICAgcHRycyA9IChzaG9ydCopYnVmOwotICAgIGZvciAoY250ID0gMDsgY250IDwgY291bnQ+PjE7IGNudCsrKQotCXpfd3JpdGV3KCpwdHJzKyssIE5FX0JBU0UrTkVfREFUQVBPUlQpOwotCi0gICAgZG1hX3N0YXJ0ID0gamlmZmllczsKLQotICAgIHdoaWxlICgoel9yZWFkYihORV9CQVNFICsgTkVfRU4wX0lTUikgJiBFTklTUl9SREMpID09IDApCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZG1hX3N0YXJ0ICsgMipIWi8xMDApKSB7CS8qIDIwbXMgKi8KLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJem9ycm84MzkwX3Jlc2V0XzgzOTAoZGV2KTsKLQkJX19OUzgzOTBfaW5pdChkZXYsMSk7Ci0JCWJyZWFrOworCQl6X3dyaXRlYigweGZmLCBpb2FkZHIgKyBORV9FTjBfSVNSKTsJLyogQWNrIGFsbCBpbnRyLiAqLwogCX0KIAotICAgIHpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIuICovCi0gICAgZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKKwkvKiBSZWFkIHRoZSAxNiBieXRlcyBvZiBzdGF0aW9uIGFkZHJlc3MgUFJPTS4KKwkgKiBXZSBtdXN0IGZpcnN0IGluaXRpYWxpemUgcmVnaXN0ZXJzLAorCSAqIHNpbWlsYXIgdG8gTlM4MzkwX2luaXQoZWlmZGV2LCAwKS4KKwkgKiBXZSBjYW4ndCByZWxpYWJseSByZWFkIHRoZSBTQVBST00gYWRkcmVzcyB3aXRob3V0IHRoaXMuCisJICogKEkgbGVhcm5lZCB0aGUgaGFyZCB3YXkhKS4KKwkgKi8KKwl7CisJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQkJdTMyIHZhbHVlOworCQkJdTMyIG9mZnNldDsKKwkJfSBwcm9ncmFtX3NlcVtdID0geworCQkJe0U4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAgKyBFODM5MF9TVE9QLCBORV9DTUR9LAorCQkJCQkJLyogU2VsZWN0IHBhZ2UgMCAqLworCQkJezB4NDgsCU5FX0VOMF9EQ0ZHfSwJLyogMHg0ODogU2V0IGJ5dGUtd2lkZSBhY2Nlc3MgKi8KKwkJCXsweDAwLAlORV9FTjBfUkNOVExPfSwJLyogQ2xlYXIgdGhlIGNvdW50IHJlZ3MgKi8KKwkJCXsweDAwLAlORV9FTjBfUkNOVEhJfSwKKwkJCXsweDAwLAlORV9FTjBfSU1SfSwJLyogTWFzayBjb21wbGV0aW9uIGlycSAqLworCQkJezB4RkYsCU5FX0VOMF9JU1J9LAorCQkJe0U4MzkwX1JYT0ZGLCBORV9FTjBfUlhDUn0sIC8qIDB4MjAgU2V0IHRvIG1vbml0b3IgKi8KKwkJCXtFODM5MF9UWE9GRiwgTkVfRU4wX1RYQ1J9LCAvKiAweDAyIGFuZCBsb29wYmFjayBtb2RlICovCisJCQl7MzIsCU5FX0VOMF9SQ05UTE99LAorCQkJezB4MDAsCU5FX0VOMF9SQ05USEl9LAorCQkJezB4MDAsCU5FX0VOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwMDAwICovCisJCQl7MHgwMCwJTkVfRU4wX1JTQVJISX0sCisJCQl7RTgzOTBfUlJFQUQgKyBFODM5MF9TVEFSVCwgTkVfQ01EfSwKKwkJfTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJvZ3JhbV9zZXEpOyBpKyspCisJCQl6X3dyaXRlYihwcm9ncmFtX3NlcVtpXS52YWx1ZSwKKwkJCQkgaW9hZGRyICsgcHJvZ3JhbV9zZXFbaV0ub2Zmc2V0KTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJU0FfcHJvbVtpXSA9IHpfcmVhZGIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworCQkodm9pZCl6X3JlYWRiKGlvYWRkciArIE5FX0RBVEFQT1JUKTsKKwl9CisKKwkvKiBXZSBtdXN0IHNldCB0aGUgODM5MCBmb3Igd29yZCBtb2RlLiAqLworCXpfd3JpdGViKDB4NDksIGlvYWRkciArIE5FX0VOMF9EQ0ZHKTsKKwlzdGFydF9wYWdlID0gTkVTTV9TVEFSVF9QRzsKKwlzdG9wX3BhZ2UgPSBORVNNX1NUT1BfUEc7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IElSUV9BTUlHQV9QT1JUUzsKKworCS8qIEluc3RhbGwgdGhlIEludGVycnVwdCBoYW5kbGVyICovCisJaSA9IHJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgX19laV9pbnRlcnJ1cHQsCisJCQlJUlFGX1NIQVJFRCwgRFJWX05BTUUsIGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJZm9yIChpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBTQV9wcm9tW2ldOworCisJcHJfZGVidWcoIkZvdW5kIGV0aGVybmV0IGFkZHJlc3M6ICVwTVxuIiwgZGV2LT5kZXZfYWRkcik7CisKKwllaV9zdGF0dXMubmFtZSA9IG5hbWU7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBzdG9wX3BhZ2U7CisJZWlfc3RhdHVzLndvcmQxNiA9IDE7CisKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IHN0YXJ0X3BhZ2UgKyBUWF9QQUdFUzsKKworCWVpX3N0YXR1cy5yZXNldF84MzkwID0gem9ycm84MzkwX3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gem9ycm84MzkwX2Jsb2NrX2lucHV0OworCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSB6b3JybzgzOTBfYmxvY2tfb3V0cHV0OworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSB6b3JybzgzOTBfZ2V0XzgzOTBfaGRyOworCWVpX3N0YXR1cy5yZWdfb2Zmc2V0ID0gem9ycm84MzkwX29mZnNldHM7CisKKwlkZXYtPm5ldGRldl9vcHMgPSAmem9ycm84MzkwX25ldGRldl9vcHM7CisJX19OUzgzOTBfaW5pdChkZXYsIDApOworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKworCW5ldGRldl9pbmZvKGRldiwgIiVzIGF0IDB4JTA4bHgsIEV0aGVybmV0IEFkZHJlc3MgJXBNXG4iLAorCQkgICAgbmFtZSwgYm9hcmQsIGRldi0+ZGV2X2FkZHIpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB6b3JybzgzOTBfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KQorc3RhdGljIGludCBfX2RldmluaXQgem9ycm84MzkwX2luaXRfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnosCisJCQkJCWNvbnN0IHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgKmVudCkKIHsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gem9ycm9fZ2V0X2RydmRhdGEoeik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIGJvYXJkLCBpb2FkZHI7CisJaW50IGVyciwgaTsKIAotICAgIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0gICAgZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBkZXYpOwotICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihaVFdPX1BBRERSKGRldi0+YmFzZV9hZGRyKSwgTkVfSU9fRVhURU5UKjIpOwotICAgIGZyZWVfbmV0ZGV2KGRldik7CisJZm9yIChpID0gQVJSQVlfU0laRShjYXJkcykgLSAxOyBpID49IDA7IGktLSkKKwkJaWYgKHotPmlkID09IGNhcmRzW2ldLmlkKQorCQkJYnJlYWs7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CisJaW9hZGRyID0gYm9hcmQgKyBjYXJkc1tpXS5vZmZzZXQ7CisJZGV2ID0gX19fX2FsbG9jX2VpX25ldGRldigwKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW9hZGRyLCBORV9JT19FWFRFTlQgKiAyLCBEUlZfTkFNRSkpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJZXJyID0gem9ycm84MzkwX2luaXQoZGV2LCBib2FyZCwgY2FyZHNbaV0ubmFtZSwgWlRXT19WQUREUihpb2FkZHIpKTsKKwlpZiAoZXJyKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpb2FkZHIsIE5FX0lPX0VYVEVOVCAqIDIpOworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKwl6b3Jyb19zZXRfZHJ2ZGF0YSh6LCBkZXYpOworCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHpvcnJvX2RyaXZlciB6b3JybzgzOTBfZHJpdmVyID0geworCS5uYW1lCQk9ICJ6b3JybzgzOTAiLAorCS5pZF90YWJsZQk9IHpvcnJvODM5MF96b3Jyb190YmwsCisJLnByb2JlCQk9IHpvcnJvODM5MF9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHpvcnJvODM5MF9yZW1vdmVfb25lKSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHpvcnJvODM5MF9pbml0X21vZHVsZSh2b2lkKQogewotICAgIHJldHVybiB6b3Jyb19yZWdpc3Rlcl9kcml2ZXIoJnpvcnJvODM5MF9kcml2ZXIpOworCXJldHVybiB6b3Jyb19yZWdpc3Rlcl9kcml2ZXIoJnpvcnJvODM5MF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgem9ycm84MzkwX2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7Ci0gICAgem9ycm9fdW5yZWdpc3Rlcl9kcml2ZXIoJnpvcnJvODM5MF9kcml2ZXIpOworCXpvcnJvX3VucmVnaXN0ZXJfZHJpdmVyKCZ6b3JybzgzOTBfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoem9ycm84MzkwX2luaXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL0tjb25maWcgYi9kcml2ZXJzL25mYy9LY29uZmlnCmluZGV4IGVhMTU4MDAuLjJhY2ZmNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmZjL0tjb25maWcKKysrIGIvZHJpdmVycy9uZmMvS2NvbmZpZwpAQCAtMiwxNyArMiw4IEBACiAjIE5lYXIgRmllbGQgQ29tbXVuaWNhdGlvbiAoTkZDKSBkZXZpY2VzCiAjCiAKLW1lbnVjb25maWcgTkZDX0RFVklDRVMKLQlib29sICJOZWFyIEZpZWxkIENvbW11bmljYXRpb24gKE5GQykgZGV2aWNlcyIKLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCi0JICBZb3UnbGwgaGF2ZSB0byBzYXkgWSBpZiB5b3VyIGNvbXB1dGVyIGNvbnRhaW5zIGFuIE5GQyBkZXZpY2UgdGhhdAotCSAgeW91IHdhbnQgdG8gdXNlIHVuZGVyIExpbnV4LgotCi0JICBZb3UgY2FuIHNheSBOIGhlcmUgaWYgeW91IGRvbid0IGhhdmUgYW55IE5lYXIgRmllbGQgQ29tbXVuaWNhdGlvbgotCSAgZGV2aWNlcyBjb25uZWN0ZWQgdG8geW91ciBjb21wdXRlci4KLQotaWYgTkZDX0RFVklDRVMKK21lbnUgIk5lYXIgRmllbGQgQ29tbXVuaWNhdGlvbiAoTkZDKSBkZXZpY2VzIgorCWRlcGVuZHMgb24gTkZDCiAKIGNvbmZpZyBQTjU0NF9ORkMKIAl0cmlzdGF0ZSAiUE41NDQgTkZDIGRyaXZlciIKQEAgLTI2LDUgKzE3LDE0IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgbSBoZXJlLiBUaGUgbW9kdWxlIHdpbGwKIAkgIGJlIGNhbGxlZCBwbjU0NC4KIAorY29uZmlnIE5GQ19QTjUzMworCXRyaXN0YXRlICJOWFAgUE41MzMgVVNCIGRyaXZlciIKKwlkZXBlbmRzIG9uIFVTQgorCWhlbHAKKwkgIE5YUCBQTjUzMyBVU0IgZHJpdmVyLgorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgTkZDIE5YUCBQTjUzMyBkZXZpY2VzLgogCi1lbmRpZiAjIE5GQ19ERVZJQ0VTCisJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgc3VwcG9ydCBmb3IgUE41MzMgZGV2aWNlcyBpbnRvIHRoZQorCSAga2VybmVsIG9yIHNheSBNIHRvIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChwbjUzMykuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL01ha2VmaWxlIGIvZHJpdmVycy9uZmMvTWFrZWZpbGUKaW5kZXggYTRlZmIxNi4uOGVmNDQ2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZmMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZmMvTWFrZWZpbGUKQEAgLTMsMyArMyw2IEBACiAjCiAKIG9iai0kKENPTkZJR19QTjU0NF9ORkMpCQkrPSBwbjU0NC5vCitvYmotJChDT05GSUdfTkZDX1BONTMzKQkJKz0gcG41MzMubworCitjY2ZsYWdzLSQoQ09ORklHX05GQ19ERUJVRykgOj0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvcG41MzMuYyBiL2RyaXZlcnMvbmZjL3BuNTMzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3MjMxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmZjL3BuNTMzLmMKQEAgLTAsMCArMSwxNjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhCisgKgorICogQXV0aG9yczoKKyAqICAgIExhdXJvIFJhbW9zIFZlbmFuY2lvIDxsYXVyby52ZW5hbmNpb0BvcGVuYm9zc2Eub3JnPgorICogICAgQWxvaXNpbyBBbG1laWRhIEpyIDxhbG9pc2lvLmFsbWVpZGFAb3BlbmJvc3NhLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbmZjLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L25mYy5oPgorCisjZGVmaW5lIFZFUlNJT04gIjAuMSIKKworI2RlZmluZSBQTjUzM19WRU5ET1JfSUQgMHg0Q0MKKyNkZWZpbmUgUE41MzNfUFJPRFVDVF9JRCAweDI1MzMKKworI2RlZmluZSBTQ01fVkVORE9SX0lEIDB4NEU2CisjZGVmaW5lIFNDTDM3MTFfUFJPRFVDVF9JRCAweDU1OTEKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHBuNTMzX3RhYmxlW10gPSB7CisJeyBVU0JfREVWSUNFKFBONTMzX1ZFTkRPUl9JRCwgUE41MzNfUFJPRFVDVF9JRCkgfSwKKwl7IFVTQl9ERVZJQ0UoU0NNX1ZFTkRPUl9JRCwgU0NMMzcxMV9QUk9EVUNUX0lEKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwbjUzM190YWJsZSk7CisKKy8qIGZyYW1lIGRlZmluaXRpb25zICovCisjZGVmaW5lIFBONTMzX0ZSQU1FX1RBSUxfU0laRSAyCisjZGVmaW5lIFBONTMzX0ZSQU1FX1NJWkUoZikgKHNpemVvZihzdHJ1Y3QgcG41MzNfZnJhbWUpICsgZi0+ZGF0YWxlbiArIFwKKwkJCQlQTjUzM19GUkFNRV9UQUlMX1NJWkUpCisjZGVmaW5lIFBONTMzX0ZSQU1FX0FDS19TSVpFIChzaXplb2Yoc3RydWN0IHBuNTMzX2ZyYW1lKSArIDEpCisjZGVmaW5lIFBONTMzX0ZSQU1FX0NIRUNLU1VNKGYpIChmLT5kYXRhW2YtPmRhdGFsZW5dKQorI2RlZmluZSBQTjUzM19GUkFNRV9QT1NUQU1CTEUoZikgKGYtPmRhdGFbZi0+ZGF0YWxlbiArIDFdKQorCisvKiBzdGFydCBvZiBmcmFtZSAqLworI2RlZmluZSBQTjUzM19TT0YgMHgwMEZGCisKKy8qIGZyYW1lIGlkZW50aWZpZXI6IGluL291dC9lcnJvciAqLworI2RlZmluZSBQTjUzM19GUkFNRV9JREVOVElGSUVSKGYpIChmLT5kYXRhWzBdKQorI2RlZmluZSBQTjUzM19ESVJfT1VUIDB4RDQKKyNkZWZpbmUgUE41MzNfRElSX0lOIDB4RDUKKworLyogUE41MzMgQ29tbWFuZHMgKi8KKyNkZWZpbmUgUE41MzNfRlJBTUVfQ01EKGYpIChmLT5kYXRhWzFdKQorI2RlZmluZSBQTjUzM19GUkFNRV9DTURfUEFSQU1TX1BUUihmKSAoJmYtPmRhdGFbMl0pCisjZGVmaW5lIFBONTMzX0ZSQU1FX0NNRF9QQVJBTVNfTEVOKGYpIChmLT5kYXRhbGVuIC0gMikKKworI2RlZmluZSBQTjUzM19DTURfR0VUX0ZJUk1XQVJFX1ZFUlNJT04gMHgwMgorI2RlZmluZSBQTjUzM19DTURfUkZfQ09ORklHVVJBVElPTiAweDMyCisjZGVmaW5lIFBONTMzX0NNRF9JTl9EQVRBX0VYQ0hBTkdFIDB4NDAKKyNkZWZpbmUgUE41MzNfQ01EX0lOX0xJU1RfUEFTU0lWRV9UQVJHRVQgMHg0QQorI2RlZmluZSBQTjUzM19DTURfSU5fQVRSIDB4NTAKKyNkZWZpbmUgUE41MzNfQ01EX0lOX1JFTEVBU0UgMHg1MgorCisjZGVmaW5lIFBONTMzX0NNRF9SRVNQT05TRShjbWQpIChjbWQgKyAxKQorCisvKiBQTjUzMyBSZXR1cm4gY29kZXMgKi8KKyNkZWZpbmUgUE41MzNfQ01EX1JFVF9NQVNLIDB4M0YKKyNkZWZpbmUgUE41MzNfQ01EX01JX01BU0sgMHg0MAorI2RlZmluZSBQTjUzM19DTURfUkVUX1NVQ0NFU1MgMHgwMAorCitzdHJ1Y3QgcG41MzM7CisKK3R5cGVkZWYgaW50ICgqcG41MzNfY21kX2NvbXBsZXRlX3QpIChzdHJ1Y3QgcG41MzMgKmRldiwgdm9pZCAqYXJnLAorCQkJCQl1OCAqcGFyYW1zLCBpbnQgcGFyYW1zX2xlbik7CisKKy8qIHN0cnVjdHMgZm9yIHBuNTMzIGNvbW1hbmRzICovCisKKy8qIFBONTMzX0NNRF9HRVRfRklSTVdBUkVfVkVSU0lPTiAqLworc3RydWN0IHBuNTMzX2Z3X3ZlcnNpb24geworCXU4IGljOworCXU4IHZlcjsKKwl1OCByZXY7CisJdTggc3VwcG9ydDsKK307CisKKy8qIFBONTMzX0NNRF9SRl9DT05GSUdVUkFUSU9OICovCisjZGVmaW5lIFBONTMzX0NGR0lURU1fTUFYX1JFVFJJRVMgMHgwNQorCisjZGVmaW5lIFBONTMzX0NPTkZJR19NQVhfUkVUUklFU19OT19SRVRSWSAweDAwCisjZGVmaW5lIFBONTMzX0NPTkZJR19NQVhfUkVUUklFU19FTkRMRVNTIDB4RkYKKworc3RydWN0IHBuNTMzX2NvbmZpZ19tYXhfcmV0cmllcyB7CisJdTggbXhfcnR5X2F0cjsKKwl1OCBteF9ydHlfcHNsOworCXU4IG14X3J0eV9wYXNzaXZlX2FjdDsKK30gX19wYWNrZWQ7CisKKy8qIFBONTMzX0NNRF9JTl9MSVNUX1BBU1NJVkVfVEFSR0VUICovCisKKy8qIGZlbGljYSBjb21tYW5kcyBvcGNvZGUgKi8KKyNkZWZpbmUgUE41MzNfRkVMSUNBX09QQ19TRU5TRl9SRVEgMAorI2RlZmluZSBQTjUzM19GRUxJQ0FfT1BDX1NFTlNGX1JFUyAxCisvKiBmZWxpY2EgU0VOU0ZfUkVRIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgUE41MzNfRkVMSUNBX1NFTlNGX1NDX0FMTCAweEZGRkYKKyNkZWZpbmUgUE41MzNfRkVMSUNBX1NFTlNGX1JDX05PX1NZU1RFTV9DT0RFIDAKKyNkZWZpbmUgUE41MzNfRkVMSUNBX1NFTlNGX1JDX1NZU1RFTV9DT0RFIDEKKyNkZWZpbmUgUE41MzNfRkVMSUNBX1NFTlNGX1JDX0FEVkFOQ0VEX1BST1RPQ09MIDIKKworLyogdHlwZSBCIGluaXRpYXRvcl9kYXRhIHZhbHVlcyAqLworI2RlZmluZSBQTjUzM19UWVBFX0JfQUZJX0FMTF9GQU1JTElFUyAwCisjZGVmaW5lIFBONTMzX1RZUEVfQl9QT0xMX01FVEhPRF9USU1FU0xPVCAwCisjZGVmaW5lIFBONTMzX1RZUEVfQl9QT0xMX01FVEhPRF9QUk9CQUJJTElTVElDIDEKKwordW5pb24gcG41MzNfY21kX3BvbGxfaW5pdGRhdGEgeworCXN0cnVjdCB7CisJCXU4IGFmaTsKKwkJdTggcG9sbGluZ19tZXRob2Q7CisJfSBfX3BhY2tlZCB0eXBlX2I7CisJc3RydWN0IHsKKwkJdTggb3Bjb2RlOworCQlfX2JlMTYgc2M7CisJCXU4IHJjOworCQl1OCB0c247CisJfSBfX3BhY2tlZCBmZWxpY2E7Cit9OworCisvKiBQb2xsIG1vZHVsYXRpb25zICovCitlbnVtIHsKKwlQTjUzM19QT0xMX01PRF8xMDZLQlBTX0EsCisJUE41MzNfUE9MTF9NT0RfMjEyS0JQU19GRUxJQ0EsCisJUE41MzNfUE9MTF9NT0RfNDI0S0JQU19GRUxJQ0EsCisJUE41MzNfUE9MTF9NT0RfMTA2S0JQU19KRVdFTCwKKwlQTjUzM19QT0xMX01PRF84NDdLQlBTX0IsCisKKwlfX1BONTMzX1BPTExfTU9EX0FGVEVSX0xBU1QsCit9OworI2RlZmluZSBQTjUzM19QT0xMX01PRF9NQVggKF9fUE41MzNfUE9MTF9NT0RfQUZURVJfTEFTVCAtIDEpCisKK3N0cnVjdCBwbjUzM19wb2xsX21vZHVsYXRpb25zIHsKKwlzdHJ1Y3QgeworCQl1OCBtYXh0ZzsKKwkJdTggYnJ0eTsKKwkJdW5pb24gcG41MzNfY21kX3BvbGxfaW5pdGRhdGEgaW5pdGlhdG9yX2RhdGE7CisJfSBfX3BhY2tlZCBkYXRhOworCXU4IGxlbjsKK307CisKK2NvbnN0IHN0cnVjdCBwbjUzM19wb2xsX21vZHVsYXRpb25zIHBvbGxfbW9kW10gPSB7CisJW1BONTMzX1BPTExfTU9EXzEwNktCUFNfQV0gPSB7CisJCS5kYXRhID0geworCQkJLm1heHRnID0gMSwKKwkJCS5icnR5ID0gMCwKKwkJfSwKKwkJLmxlbiA9IDIsCisJfSwKKwlbUE41MzNfUE9MTF9NT0RfMjEyS0JQU19GRUxJQ0FdID0geworCQkuZGF0YSA9IHsKKwkJCS5tYXh0ZyA9IDEsCisJCQkuYnJ0eSA9IDEsCisJCQkuaW5pdGlhdG9yX2RhdGEuZmVsaWNhID0geworCQkJCS5vcGNvZGUgPSBQTjUzM19GRUxJQ0FfT1BDX1NFTlNGX1JFUSwKKwkJCQkuc2MgPSBQTjUzM19GRUxJQ0FfU0VOU0ZfU0NfQUxMLAorCQkJCS5yYyA9IFBONTMzX0ZFTElDQV9TRU5TRl9SQ19OT19TWVNURU1fQ09ERSwKKwkJCQkudHNuID0gMCwKKwkJCX0sCisJCX0sCisJCS5sZW4gPSA3LAorCX0sCisJW1BONTMzX1BPTExfTU9EXzQyNEtCUFNfRkVMSUNBXSA9IHsKKwkJLmRhdGEgPSB7CisJCQkubWF4dGcgPSAxLAorCQkJLmJydHkgPSAyLAorCQkJLmluaXRpYXRvcl9kYXRhLmZlbGljYSA9IHsKKwkJCQkub3Bjb2RlID0gUE41MzNfRkVMSUNBX09QQ19TRU5TRl9SRVEsCisJCQkJLnNjID0gUE41MzNfRkVMSUNBX1NFTlNGX1NDX0FMTCwKKwkJCQkucmMgPSBQTjUzM19GRUxJQ0FfU0VOU0ZfUkNfTk9fU1lTVEVNX0NPREUsCisJCQkJLnRzbiA9IDAsCisJCQl9LAorCQkgfSwKKwkJLmxlbiA9IDcsCisJfSwKKwlbUE41MzNfUE9MTF9NT0RfMTA2S0JQU19KRVdFTF0gPSB7CisJCS5kYXRhID0geworCQkJLm1heHRnID0gMSwKKwkJCS5icnR5ID0gNCwKKwkJfSwKKwkJLmxlbiA9IDIsCisJfSwKKwlbUE41MzNfUE9MTF9NT0RfODQ3S0JQU19CXSA9IHsKKwkJLmRhdGEgPSB7CisJCQkubWF4dGcgPSAxLAorCQkJLmJydHkgPSA4LAorCQkJLmluaXRpYXRvcl9kYXRhLnR5cGVfYiA9IHsKKwkJCQkuYWZpID0gUE41MzNfVFlQRV9CX0FGSV9BTExfRkFNSUxJRVMsCisJCQkJLnBvbGxpbmdfbWV0aG9kID0KKwkJCQkJUE41MzNfVFlQRV9CX1BPTExfTUVUSE9EX1RJTUVTTE9ULAorCQkJfSwKKwkJfSwKKwkJLmxlbiA9IDMsCisJfSwKK307CisKKy8qIFBONTMzX0NNRF9JTl9BVFIgKi8KKworc3RydWN0IHBuNTMzX2NtZF9hY3RpdmF0ZV9wYXJhbSB7CisJdTggdGc7CisJdTggbmV4dDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwbjUzM19jbWRfYWN0aXZhdGVfcmVzcG9uc2UgeworCXU4IHN0YXR1czsKKwl1OCBuZmNpZDN0WzEwXTsKKwl1OCBkaWR0OworCXU4IGJzdDsKKwl1OCBicnQ7CisJdTggdG87CisJdTggcHB0OworCS8qIG9wdGlvbmFsICovCisJdTggZ3RbXTsKK30gX19wYWNrZWQ7CisKKworc3RydWN0IHBuNTMzIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCBuZmNfZGV2ICpuZmNfZGV2OworCisJc3RydWN0IHVyYiAqb3V0X3VyYjsKKwlpbnQgb3V0X21heGxlbjsKKwlzdHJ1Y3QgcG41MzNfZnJhbWUgKm91dF9mcmFtZTsKKworCXN0cnVjdCB1cmIgKmluX3VyYjsKKwlpbnQgaW5fbWF4bGVuOworCXN0cnVjdCBwbjUzM19mcmFtZSAqaW5fZnJhbWU7CisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKKwlzdHJ1Y3QgcG41MzNfZnJhbWUgKnRrbHRfaW5fZnJhbWU7CisJaW50IHRrbHRfaW5fZXJyb3I7CisKKwlwbjUzM19jbWRfY29tcGxldGVfdCBjbWRfY29tcGxldGU7CisJdm9pZCAqY21kX2NvbXBsZXRlX2FyZzsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGNtZF9sb2NrOworCXU4IGNtZDsKKworCXN0cnVjdCBwbjUzM19wb2xsX21vZHVsYXRpb25zICpwb2xsX21vZF9hY3RpdmVbUE41MzNfUE9MTF9NT0RfTUFYICsgMV07CisJdTggcG9sbF9tb2RfY291bnQ7CisJdTggcG9sbF9tb2RfY3VycjsKKwl1MzIgcG9sbF9wcm90b2NvbHM7CisKKwl1OCB0Z3RfYXZhaWxhYmxlX3Byb3RzOworCXU4IHRndF9hY3RpdmVfcHJvdDsKK307CisKK3N0cnVjdCBwbjUzM19mcmFtZSB7CisJdTggcHJlYW1ibGU7CisJX19iZTE2IHN0YXJ0X2ZyYW1lOworCXU4IGRhdGFsZW47CisJdTggZGF0YWxlbl9jaGVja3N1bTsKKwl1OCBkYXRhW107Cit9IF9fcGFja2VkOworCisvKiBUaGUgcnVsZTogdmFsdWUgKyBjaGVja3N1bSA9IDAgKi8KK3N0YXRpYyBpbmxpbmUgdTggcG41MzNfY2hlY2tzdW0odTggdmFsdWUpCit7CisJcmV0dXJuIH52YWx1ZSArIDE7Cit9CisKKy8qIFRoZSBydWxlOiBzdW0oZGF0YSBlbGVtZW50cykgKyBjaGVja3N1bSA9IDAgKi8KK3N0YXRpYyB1OCBwbjUzM19kYXRhX2NoZWNrc3VtKHU4ICpkYXRhLCBpbnQgZGF0YWxlbikKK3sKKwl1OCBzdW0gPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRhdGFsZW47IGkrKykKKwkJc3VtICs9IGRhdGFbaV07CisKKwlyZXR1cm4gcG41MzNfY2hlY2tzdW0oc3VtKTsKK30KKworLyoqCisgKiBwbjUzM190eF9mcmFtZV9hY2sgLSBjcmVhdGUgYSBhY2sgZnJhbWUKKyAqIEBmcmFtZToJVGhlIGZyYW1lIHRvIGJlIHNldCBhcyBhY2sKKyAqCisgKiBBY2sgaXMgZGlmZmVyZW50IHR5cGUgb2Ygc3RhbmRhcmQgZnJhbWUuIEFzIGEgc3RhbmRhcmQgZnJhbWUsIGl0IGhhcworICogcHJlYW1ibGUgYW5kIHN0YXJ0X2ZyYW1lLiBIb3dldmVyIHRoZSBjaGVja3N1bSBvZiB0aGlzIGZyYW1lIG11c3QgZmFpbCwKKyAqIGkuZS4gZGF0YWxlbiArIGRhdGFsZW5fY2hlY2tzdW0gbXVzdCBOT1QgYmUgemVyby4gV2hlbiB0aGUgY2hlY2tzdW0gdGVzdAorICogZmFpbHMgYW5kIGRhdGFsZW4gPSAwIGFuZCBkYXRhbGVuX2NoZWNrc3VtID0gMHhGRiwgdGhlIGZyYW1lIGlzIGEgYWNrLgorICogQWZ0ZXIgZGF0YWxlbl9jaGVja3N1bSBmaWVsZCwgdGhlIHBvc3RhbWJsZSBpcyBwbGFjZWQuCisgKi8KK3N0YXRpYyB2b2lkIHBuNTMzX3R4X2ZyYW1lX2FjayhzdHJ1Y3QgcG41MzNfZnJhbWUgKmZyYW1lKQoreworCWZyYW1lLT5wcmVhbWJsZSA9IDA7CisJZnJhbWUtPnN0YXJ0X2ZyYW1lID0gY3B1X3RvX2JlMTYoUE41MzNfU09GKTsKKwlmcmFtZS0+ZGF0YWxlbiA9IDA7CisJZnJhbWUtPmRhdGFsZW5fY2hlY2tzdW0gPSAweEZGOworCS8qIGRhdGFbMF0gaXMgdXNlZCBhcyBwb3N0YW1ibGUgKi8KKwlmcmFtZS0+ZGF0YVswXSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHBuNTMzX3R4X2ZyYW1lX2luaXQoc3RydWN0IHBuNTMzX2ZyYW1lICpmcmFtZSwgdTggY21kKQoreworCWZyYW1lLT5wcmVhbWJsZSA9IDA7CisJZnJhbWUtPnN0YXJ0X2ZyYW1lID0gY3B1X3RvX2JlMTYoUE41MzNfU09GKTsKKwlQTjUzM19GUkFNRV9JREVOVElGSUVSKGZyYW1lKSA9IFBONTMzX0RJUl9PVVQ7CisJUE41MzNfRlJBTUVfQ01EKGZyYW1lKSA9IGNtZDsKKwlmcmFtZS0+ZGF0YWxlbiA9IDI7Cit9CisKK3N0YXRpYyB2b2lkIHBuNTMzX3R4X2ZyYW1lX2ZpbmlzaChzdHJ1Y3QgcG41MzNfZnJhbWUgKmZyYW1lKQoreworCWZyYW1lLT5kYXRhbGVuX2NoZWNrc3VtID0gcG41MzNfY2hlY2tzdW0oZnJhbWUtPmRhdGFsZW4pOworCisJUE41MzNfRlJBTUVfQ0hFQ0tTVU0oZnJhbWUpID0KKwkJcG41MzNfZGF0YV9jaGVja3N1bShmcmFtZS0+ZGF0YSwgZnJhbWUtPmRhdGFsZW4pOworCisJUE41MzNfRlJBTUVfUE9TVEFNQkxFKGZyYW1lKSA9IDA7Cit9CisKK3N0YXRpYyBib29sIHBuNTMzX3J4X2ZyYW1lX2lzX3ZhbGlkKHN0cnVjdCBwbjUzM19mcmFtZSAqZnJhbWUpCit7CisJdTggY2hlY2tzdW07CisKKwlpZiAoZnJhbWUtPnN0YXJ0X2ZyYW1lICE9IGNwdV90b19iZTE2KFBONTMzX1NPRikpCisJCXJldHVybiBmYWxzZTsKKworCWNoZWNrc3VtID0gcG41MzNfY2hlY2tzdW0oZnJhbWUtPmRhdGFsZW4pOworCWlmIChjaGVja3N1bSAhPSBmcmFtZS0+ZGF0YWxlbl9jaGVja3N1bSkKKwkJcmV0dXJuIGZhbHNlOworCisJY2hlY2tzdW0gPSBwbjUzM19kYXRhX2NoZWNrc3VtKGZyYW1lLT5kYXRhLCBmcmFtZS0+ZGF0YWxlbik7CisJaWYgKGNoZWNrc3VtICE9IFBONTMzX0ZSQU1FX0NIRUNLU1VNKGZyYW1lKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHBuNTMzX3J4X2ZyYW1lX2lzX2FjayhzdHJ1Y3QgcG41MzNfZnJhbWUgKmZyYW1lKQoreworCWlmIChmcmFtZS0+c3RhcnRfZnJhbWUgIT0gY3B1X3RvX2JlMTYoUE41MzNfU09GKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGZyYW1lLT5kYXRhbGVuICE9IDAgfHwgZnJhbWUtPmRhdGFsZW5fY2hlY2tzdW0gIT0gMHhGRikKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHBuNTMzX3J4X2ZyYW1lX2lzX2NtZF9yZXNwb25zZShzdHJ1Y3QgcG41MzNfZnJhbWUgKmZyYW1lLCB1OCBjbWQpCit7CisJcmV0dXJuIChQTjUzM19GUkFNRV9DTUQoZnJhbWUpID09IFBONTMzX0NNRF9SRVNQT05TRShjbWQpKTsKK30KKworc3RhdGljIHZvaWQgcG41MzNfdGFza2xldF9jbWRfY29tcGxldGUodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHBuNTMzICpkZXYgPSAoc3RydWN0IHBuNTMzICopIGFyZzsKKwlzdHJ1Y3QgcG41MzNfZnJhbWUgKmluX2ZyYW1lID0gZGV2LT50a2x0X2luX2ZyYW1lOworCWludCByYzsKKworCWlmIChkZXYtPnRrbHRfaW5fZXJyb3IpCisJCXJjID0gZGV2LT5jbWRfY29tcGxldGUoZGV2LCBkZXYtPmNtZF9jb21wbGV0ZV9hcmcsIE5VTEwsCisJCQkJCQkJZGV2LT50a2x0X2luX2Vycm9yKTsKKwllbHNlCisJCXJjID0gZGV2LT5jbWRfY29tcGxldGUoZGV2LCBkZXYtPmNtZF9jb21wbGV0ZV9hcmcsCisJCQkJCVBONTMzX0ZSQU1FX0NNRF9QQVJBTVNfUFRSKGluX2ZyYW1lKSwKKwkJCQkJUE41MzNfRlJBTUVfQ01EX1BBUkFNU19MRU4oaW5fZnJhbWUpKTsKKworCWlmIChyYyAhPSAtRUlOUFJPR1JFU1MpCisJCXVwKCZkZXYtPmNtZF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcG41MzNfcmVjdl9yZXNwb25zZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHBuNTMzICpkZXYgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHBuNTMzX2ZyYW1lICppbl9mcmFtZTsKKworCWRldi0+dGtsdF9pbl9mcmFtZSA9IE5VTEw7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJVcmIgc2h1dHRpbmcgZG93biB3aXRoIgorCQkJCQkJIiBzdGF0dXM6ICVkIiwgdXJiLT5zdGF0dXMpOworCQlkZXYtPnRrbHRfaW5fZXJyb3IgPSB1cmItPnN0YXR1czsKKwkJZ290byBzY2hlZF90YXNrbGV0OworCWRlZmF1bHQ6CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiTm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiIKKwkJCQkJCQkiICVkIiwgdXJiLT5zdGF0dXMpOworCQlkZXYtPnRrbHRfaW5fZXJyb3IgPSB1cmItPnN0YXR1czsKKwkJZ290byBzY2hlZF90YXNrbGV0OworCX0KKworCWluX2ZyYW1lID0gZGV2LT5pbl91cmItPnRyYW5zZmVyX2J1ZmZlcjsKKworCWlmICghcG41MzNfcnhfZnJhbWVfaXNfdmFsaWQoaW5fZnJhbWUpKSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiUmVjZWl2ZWQgYW4gaW52YWxpZCBmcmFtZSIpOworCQlkZXYtPnRrbHRfaW5fZXJyb3IgPSAtRUlPOworCQlnb3RvIHNjaGVkX3Rhc2tsZXQ7CisJfQorCisJaWYgKCFwbjUzM19yeF9mcmFtZV9pc19jbWRfcmVzcG9uc2UoaW5fZnJhbWUsIGRldi0+Y21kKSkgeworCQluZmNfZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlRoZSByZWNlaXZlZCBmcmFtZSBpcyBub3QgIgorCQkJCQkJInJlc3BvbnNlIHRvIHRoZSBsYXN0IGNvbW1hbmQiKTsKKwkJZGV2LT50a2x0X2luX2Vycm9yID0gLUVJTzsKKwkJZ290byBzY2hlZF90YXNrbGV0OworCX0KKworCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiUmVjZWl2ZWQgYSB2YWxpZCBmcmFtZSIpOworCWRldi0+dGtsdF9pbl9lcnJvciA9IDA7CisJZGV2LT50a2x0X2luX2ZyYW1lID0gaW5fZnJhbWU7CisKK3NjaGVkX3Rhc2tsZXQ6CisJdGFza2xldF9zY2hlZHVsZSgmZGV2LT50YXNrbGV0KTsKK30KKworc3RhdGljIGludCBwbjUzM19zdWJtaXRfdXJiX2Zvcl9yZXNwb25zZShzdHJ1Y3QgcG41MzMgKmRldiwgZ2ZwX3QgZmxhZ3MpCit7CisJZGV2LT5pbl91cmItPmNvbXBsZXRlID0gcG41MzNfcmVjdl9yZXNwb25zZTsKKworCXJldHVybiB1c2Jfc3VibWl0X3VyYihkZXYtPmluX3VyYiwgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwbjUzM19yZWN2X2FjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHBuNTMzICpkZXYgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHBuNTMzX2ZyYW1lICppbl9mcmFtZTsKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJVcmIgc2h1dHRpbmcgZG93biB3aXRoIgorCQkJCQkJIiBzdGF0dXM6ICVkIiwgdXJiLT5zdGF0dXMpOworCQlkZXYtPnRrbHRfaW5fZXJyb3IgPSB1cmItPnN0YXR1czsKKwkJZ290byBzY2hlZF90YXNrbGV0OworCWRlZmF1bHQ6CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiTm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiIKKwkJCQkJCQkiICVkIiwgdXJiLT5zdGF0dXMpOworCQlkZXYtPnRrbHRfaW5fZXJyb3IgPSB1cmItPnN0YXR1czsKKwkJZ290byBzY2hlZF90YXNrbGV0OworCX0KKworCWluX2ZyYW1lID0gZGV2LT5pbl91cmItPnRyYW5zZmVyX2J1ZmZlcjsKKworCWlmICghcG41MzNfcnhfZnJhbWVfaXNfYWNrKGluX2ZyYW1lKSkgeworCQluZmNfZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlJlY2VpdmVkIGFuIGludmFsaWQgYWNrIik7CisJCWRldi0+dGtsdF9pbl9lcnJvciA9IC1FSU87CisJCWdvdG8gc2NoZWRfdGFza2xldDsKKwl9CisKKwluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlJlY2VpdmVkIGEgdmFsaWQgYWNrIik7CisKKwlyYyA9IHBuNTMzX3N1Ym1pdF91cmJfZm9yX3Jlc3BvbnNlKGRldiwgR0ZQX0FUT01JQyk7CisJaWYgKHJjKSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAidXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGgiCisJCQkJCQkJIiByZXN1bHQgJWQiLCByYyk7CisJCWRldi0+dGtsdF9pbl9lcnJvciA9IHJjOworCQlnb3RvIHNjaGVkX3Rhc2tsZXQ7CisJfQorCisJcmV0dXJuOworCitzY2hlZF90YXNrbGV0OgorCWRldi0+dGtsdF9pbl9mcmFtZSA9IE5VTEw7CisJdGFza2xldF9zY2hlZHVsZSgmZGV2LT50YXNrbGV0KTsKK30KKworc3RhdGljIGludCBwbjUzM19zdWJtaXRfdXJiX2Zvcl9hY2soc3RydWN0IHBuNTMzICpkZXYsIGdmcF90IGZsYWdzKQoreworCWRldi0+aW5fdXJiLT5jb21wbGV0ZSA9IHBuNTMzX3JlY3ZfYWNrOworCisJcmV0dXJuIHVzYl9zdWJtaXRfdXJiKGRldi0+aW5fdXJiLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcG41MzNfc2VuZF9hY2soc3RydWN0IHBuNTMzICpkZXYsIGdmcF90IGZsYWdzKQoreworCWludCByYzsKKworCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlwbjUzM190eF9mcmFtZV9hY2soZGV2LT5vdXRfZnJhbWUpOworCisJZGV2LT5vdXRfdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBkZXYtPm91dF9mcmFtZTsKKwlkZXYtPm91dF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBQTjUzM19GUkFNRV9BQ0tfU0laRTsKKwlyYyA9IHVzYl9zdWJtaXRfdXJiKGRldi0+b3V0X3VyYiwgZmxhZ3MpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9fcG41MzNfc2VuZF9jbWRfZnJhbWVfYXN5bmMoc3RydWN0IHBuNTMzICpkZXYsCisJCQkJCXN0cnVjdCBwbjUzM19mcmFtZSAqb3V0X2ZyYW1lLAorCQkJCQlzdHJ1Y3QgcG41MzNfZnJhbWUgKmluX2ZyYW1lLAorCQkJCQlpbnQgaW5fZnJhbWVfbGVuLAorCQkJCQlwbjUzM19jbWRfY29tcGxldGVfdCBjbWRfY29tcGxldGUsCisJCQkJCXZvaWQgKmFyZywgZ2ZwX3QgZmxhZ3MpCit7CisJaW50IHJjOworCisJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJTZW5kaW5nIGNvbW1hbmQgMHgleCIsCisJCQkJCQlQTjUzM19GUkFNRV9DTUQob3V0X2ZyYW1lKSk7CisKKwlkZXYtPmNtZCA9IFBONTMzX0ZSQU1FX0NNRChvdXRfZnJhbWUpOworCWRldi0+Y21kX2NvbXBsZXRlID0gY21kX2NvbXBsZXRlOworCWRldi0+Y21kX2NvbXBsZXRlX2FyZyA9IGFyZzsKKworCWRldi0+b3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gb3V0X2ZyYW1lOworCWRldi0+b3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9CisJCQkJUE41MzNfRlJBTUVfU0laRShvdXRfZnJhbWUpOworCisJZGV2LT5pbl91cmItPnRyYW5zZmVyX2J1ZmZlciA9IGluX2ZyYW1lOworCWRldi0+aW5fdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gaW5fZnJhbWVfbGVuOworCisJcmMgPSB1c2Jfc3VibWl0X3VyYihkZXYtPm91dF91cmIsIGZsYWdzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcG41MzNfc3VibWl0X3VyYl9mb3JfYWNrKGRldiwgZmxhZ3MpOworCWlmIChyYykKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwl1c2JfdW5saW5rX3VyYihkZXYtPm91dF91cmIpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwbjUzM19zZW5kX2NtZF9mcmFtZV9hc3luYyhzdHJ1Y3QgcG41MzMgKmRldiwKKwkJCQkJc3RydWN0IHBuNTMzX2ZyYW1lICpvdXRfZnJhbWUsCisJCQkJCXN0cnVjdCBwbjUzM19mcmFtZSAqaW5fZnJhbWUsCisJCQkJCWludCBpbl9mcmFtZV9sZW4sCisJCQkJCXBuNTMzX2NtZF9jb21wbGV0ZV90IGNtZF9jb21wbGV0ZSwKKwkJCQkJdm9pZCAqYXJnLCBnZnBfdCBmbGFncykKK3sKKwlpbnQgcmM7CisKKwluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCisJaWYgKGRvd25fdHJ5bG9jaygmZGV2LT5jbWRfbG9jaykpCisJCXJldHVybiAtRUJVU1k7CisKKwlyYyA9IF9fcG41MzNfc2VuZF9jbWRfZnJhbWVfYXN5bmMoZGV2LCBvdXRfZnJhbWUsIGluX2ZyYW1lLAorCQkJCQlpbl9mcmFtZV9sZW4sIGNtZF9jb21wbGV0ZSwgYXJnLCBmbGFncyk7CisJaWYgKHJjKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CitlcnJvcjoKKwl1cCgmZGV2LT5jbWRfbG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgcG41MzNfc3luY19jbWRfcmVzcG9uc2UgeworCWludCByYzsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworfTsKKworc3RhdGljIGludCBwbjUzM19zeW5jX2NtZF9jb21wbGV0ZShzdHJ1Y3QgcG41MzMgKmRldiwgdm9pZCAqX2FyZywKKwkJCQkJdTggKnBhcmFtcywgaW50IHBhcmFtc19sZW4pCit7CisJc3RydWN0IHBuNTMzX3N5bmNfY21kX3Jlc3BvbnNlICphcmcgPSBfYXJnOworCisJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKworCWFyZy0+cmMgPSAwOworCisJaWYgKHBhcmFtc19sZW4gPCAwKSAvKiBlcnJvciAqLworCQlhcmctPnJjID0gcGFyYW1zX2xlbjsKKworCWNvbXBsZXRlKCZhcmctPmRvbmUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG41MzNfc2VuZF9jbWRfZnJhbWVfc3luYyhzdHJ1Y3QgcG41MzMgKmRldiwKKwkJCQkJCXN0cnVjdCBwbjUzM19mcmFtZSAqb3V0X2ZyYW1lLAorCQkJCQkJc3RydWN0IHBuNTMzX2ZyYW1lICppbl9mcmFtZSwKKwkJCQkJCWludCBpbl9mcmFtZV9sZW4pCit7CisJaW50IHJjOworCXN0cnVjdCBwbjUzM19zeW5jX2NtZF9yZXNwb25zZSBhcmc7CisKKwluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOworCisJaW5pdF9jb21wbGV0aW9uKCZhcmcuZG9uZSk7CisKKwlyYyA9IHBuNTMzX3NlbmRfY21kX2ZyYW1lX2FzeW5jKGRldiwgb3V0X2ZyYW1lLCBpbl9mcmFtZSwgaW5fZnJhbWVfbGVuLAorCQkJCXBuNTMzX3N5bmNfY21kX2NvbXBsZXRlLCAmYXJnLCBHRlBfS0VSTkVMKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFyZy5kb25lKTsKKworCXJldHVybiBhcmcucmM7Cit9CisKK3N0YXRpYyB2b2lkIHBuNTMzX3NlbmRfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBwbjUzMyAqZGV2ID0gdXJiLT5jb250ZXh0OworCisJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlVyYiBzaHV0dGluZyBkb3duIHdpdGgiCisJCQkJCQkiIHN0YXR1czogJWQiLCB1cmItPnN0YXR1cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiTm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiIKKwkJCQkJCQkiICVkIiwgdXJiLT5zdGF0dXMpOworCX0KK30KKworc3RydWN0IHBuNTMzX3RhcmdldF90eXBlX2EgeworCV9fYmUxNiBzZW5zX3JlczsKKwl1OCBzZWxfcmVzOworCXU4IG5mY2lkX2xlbjsKKwl1OCBuZmNpZF9kYXRhW107Cit9IF9fcGFja2VkOworCisKKyNkZWZpbmUgUE41MzNfVFlQRV9BX1NFTlNfUkVTX05GQ0lEMSh4KSAoKHU4KSgoYmUxNl90b19jcHUoeCkgJiAweDAwQzApID4+IDYpKQorI2RlZmluZSBQTjUzM19UWVBFX0FfU0VOU19SRVNfU1NEKHgpICgodTgpKChiZTE2X3RvX2NwdSh4KSAmIDB4MDAxRikgPj4gMCkpCisjZGVmaW5lIFBONTMzX1RZUEVfQV9TRU5TX1JFU19QTEFUQ09ORih4KSAoKHU4KSgoYmUxNl90b19jcHUoeCkgJiAweDBGMDApID4+IDgpKQorCisjZGVmaW5lIFBONTMzX1RZUEVfQV9TRU5TX1JFU19TU0RfSkVXRUwgMHgwMAorI2RlZmluZSBQTjUzM19UWVBFX0FfU0VOU19SRVNfUExBVENPTkZfSkVXRUwgMHgwQworCisjZGVmaW5lIFBONTMzX1RZUEVfQV9TRUxfUFJPVCh4KSAoKCh4KSAmIDB4NjApID4+IDUpCisjZGVmaW5lIFBONTMzX1RZUEVfQV9TRUxfQ0FTQ0FERSh4KSAoKCh4KSAmIDB4MDQpID4+IDIpCisKKyNkZWZpbmUgUE41MzNfVFlQRV9BX1NFTF9QUk9UX01JRkFSRSAwCisjZGVmaW5lIFBONTMzX1RZUEVfQV9TRUxfUFJPVF9JU08xNDQ0MyAxCisjZGVmaW5lIFBONTMzX1RZUEVfQV9TRUxfUFJPVF9ERVAgMgorI2RlZmluZSBQTjUzM19UWVBFX0FfU0VMX1BST1RfSVNPMTQ0NDNfREVQIDMKKworc3RhdGljIGJvb2wgcG41MzNfdGFyZ2V0X3R5cGVfYV9pc192YWxpZChzdHJ1Y3QgcG41MzNfdGFyZ2V0X3R5cGVfYSAqdHlwZV9hLAorCQkJCQkJCWludCB0YXJnZXRfZGF0YV9sZW4pCit7CisJdTggc3NkOworCXU4IHBsYXRjb25mOworCisJaWYgKHRhcmdldF9kYXRhX2xlbiA8IHNpemVvZihzdHJ1Y3QgcG41MzNfdGFyZ2V0X3R5cGVfYSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFRoZSBsZW5naHQgY2hlY2sgb2YgbmZjaWRbXSBhbmQgYXRzW10gYXJlIG5vdCBiZWluZyBwZXJmb3JtZWQgYmVjYXVzZQorCSAgIHRoZSB2YWx1ZXMgYXJlIG5vdCBiZWluZyB1c2VkICovCisKKwkvKiBSZXF1aXJlbWVudCA0LjYuMy4zIGZyb20gTkZDIEZvcnVtIERpZ2l0YWwgU3BlYyAqLworCXNzZCA9IFBONTMzX1RZUEVfQV9TRU5TX1JFU19TU0QodHlwZV9hLT5zZW5zX3Jlcyk7CisJcGxhdGNvbmYgPSBQTjUzM19UWVBFX0FfU0VOU19SRVNfUExBVENPTkYodHlwZV9hLT5zZW5zX3Jlcyk7CisKKwlpZiAoKHNzZCA9PSBQTjUzM19UWVBFX0FfU0VOU19SRVNfU1NEX0pFV0VMICYmCisJCQlwbGF0Y29uZiAhPSBQTjUzM19UWVBFX0FfU0VOU19SRVNfUExBVENPTkZfSkVXRUwpIHx8CisJCQkoc3NkICE9IFBONTMzX1RZUEVfQV9TRU5TX1JFU19TU0RfSkVXRUwgJiYKKwkJCXBsYXRjb25mID09IFBONTMzX1RZUEVfQV9TRU5TX1JFU19QTEFUQ09ORl9KRVdFTCkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFJlcXVpcmVtZW50cyA0LjguMi4xLCA0LjguMi4zLCA0LjguMi41IGFuZCA0LjguMi43IGZyb20gTkZDIEZvcnVtICovCisJaWYgKFBONTMzX1RZUEVfQV9TRUxfQ0FTQ0FERSh0eXBlX2EtPnNlbF9yZXMpICE9IDApCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IHBuNTMzX3RhcmdldF9mb3VuZF90eXBlX2Eoc3RydWN0IG5mY190YXJnZXQgKm5mY190Z3QsIHU4ICp0Z3RfZGF0YSwKKwkJCQkJCQlpbnQgdGd0X2RhdGFfbGVuKQoreworCXN0cnVjdCBwbjUzM190YXJnZXRfdHlwZV9hICp0Z3RfdHlwZV9hOworCisJdGd0X3R5cGVfYSA9IChzdHJ1Y3QgcG41MzNfdGFyZ2V0X3R5cGVfYSAqKSB0Z3RfZGF0YTsKKworCWlmICghcG41MzNfdGFyZ2V0X3R5cGVfYV9pc192YWxpZCh0Z3RfdHlwZV9hLCB0Z3RfZGF0YV9sZW4pKQorCQlyZXR1cm4gLUVQUk9UTzsKKworCXN3aXRjaCAoUE41MzNfVFlQRV9BX1NFTF9QUk9UKHRndF90eXBlX2EtPnNlbF9yZXMpKSB7CisJY2FzZSBQTjUzM19UWVBFX0FfU0VMX1BST1RfTUlGQVJFOgorCQluZmNfdGd0LT5zdXBwb3J0ZWRfcHJvdG9jb2xzID0gTkZDX1BST1RPX01JRkFSRV9NQVNLOworCQlicmVhazsKKwljYXNlIFBONTMzX1RZUEVfQV9TRUxfUFJPVF9JU08xNDQ0MzoKKwkJbmZjX3RndC0+c3VwcG9ydGVkX3Byb3RvY29scyA9IE5GQ19QUk9UT19JU08xNDQ0M19NQVNLOworCQlicmVhazsKKwljYXNlIFBONTMzX1RZUEVfQV9TRUxfUFJPVF9ERVA6CisJCW5mY190Z3QtPnN1cHBvcnRlZF9wcm90b2NvbHMgPSBORkNfUFJPVE9fTkZDX0RFUF9NQVNLOworCQlicmVhazsKKwljYXNlIFBONTMzX1RZUEVfQV9TRUxfUFJPVF9JU08xNDQ0M19ERVA6CisJCW5mY190Z3QtPnN1cHBvcnRlZF9wcm90b2NvbHMgPSBORkNfUFJPVE9fSVNPMTQ0NDNfTUFTSyB8CisJCQkJCQkJTkZDX1BST1RPX05GQ19ERVBfTUFTSzsKKwkJYnJlYWs7CisJfQorCisJbmZjX3RndC0+c2Vuc19yZXMgPSBiZTE2X3RvX2NwdSh0Z3RfdHlwZV9hLT5zZW5zX3Jlcyk7CisJbmZjX3RndC0+c2VsX3JlcyA9IHRndF90eXBlX2EtPnNlbF9yZXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBuNTMzX3RhcmdldF9mZWxpY2EgeworCXU4IHBvbF9yZXM7CisJdTggb3Bjb2RlOworCXU4IG5mY2lkMls4XTsKKwl1OCBwYWRbOF07CisJLyogb3B0aW9uYWwgKi8KKwl1OCBzeXN0X2NvZGVbXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgUE41MzNfRkVMSUNBX1NFTlNGX05GQ0lEMl9ERVBfQjEgMHgwMQorI2RlZmluZSBQTjUzM19GRUxJQ0FfU0VOU0ZfTkZDSUQyX0RFUF9CMiAweEZFCisKK3N0YXRpYyBib29sIHBuNTMzX3RhcmdldF9mZWxpY2FfaXNfdmFsaWQoc3RydWN0IHBuNTMzX3RhcmdldF9mZWxpY2EgKmZlbGljYSwKKwkJCQkJCQlpbnQgdGFyZ2V0X2RhdGFfbGVuKQoreworCWlmICh0YXJnZXRfZGF0YV9sZW4gPCBzaXplb2Yoc3RydWN0IHBuNTMzX3RhcmdldF9mZWxpY2EpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoZmVsaWNhLT5vcGNvZGUgIT0gUE41MzNfRkVMSUNBX09QQ19TRU5TRl9SRVMpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IHBuNTMzX3RhcmdldF9mb3VuZF9mZWxpY2Eoc3RydWN0IG5mY190YXJnZXQgKm5mY190Z3QsIHU4ICp0Z3RfZGF0YSwKKwkJCQkJCQlpbnQgdGd0X2RhdGFfbGVuKQoreworCXN0cnVjdCBwbjUzM190YXJnZXRfZmVsaWNhICp0Z3RfZmVsaWNhOworCisJdGd0X2ZlbGljYSA9IChzdHJ1Y3QgcG41MzNfdGFyZ2V0X2ZlbGljYSAqKSB0Z3RfZGF0YTsKKworCWlmICghcG41MzNfdGFyZ2V0X2ZlbGljYV9pc192YWxpZCh0Z3RfZmVsaWNhLCB0Z3RfZGF0YV9sZW4pKQorCQlyZXR1cm4gLUVQUk9UTzsKKworCWlmICh0Z3RfZmVsaWNhLT5uZmNpZDJbMF0gPT0gUE41MzNfRkVMSUNBX1NFTlNGX05GQ0lEMl9ERVBfQjEgJiYKKwkJCQkJdGd0X2ZlbGljYS0+bmZjaWQyWzFdID09CisJCQkJCVBONTMzX0ZFTElDQV9TRU5TRl9ORkNJRDJfREVQX0IyKQorCQluZmNfdGd0LT5zdXBwb3J0ZWRfcHJvdG9jb2xzID0gTkZDX1BST1RPX05GQ19ERVBfTUFTSzsKKwllbHNlCisJCW5mY190Z3QtPnN1cHBvcnRlZF9wcm90b2NvbHMgPSBORkNfUFJPVE9fRkVMSUNBX01BU0s7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBuNTMzX3RhcmdldF9qZXdlbCB7CisJX19iZTE2IHNlbnNfcmVzOworCXU4IGpld2VsaWRbNF07Cit9IF9fcGFja2VkOworCitzdGF0aWMgYm9vbCBwbjUzM190YXJnZXRfamV3ZWxfaXNfdmFsaWQoc3RydWN0IHBuNTMzX3RhcmdldF9qZXdlbCAqamV3ZWwsCisJCQkJCQkJaW50IHRhcmdldF9kYXRhX2xlbikKK3sKKwl1OCBzc2Q7CisJdTggcGxhdGNvbmY7CisKKwlpZiAodGFyZ2V0X2RhdGFfbGVuIDwgc2l6ZW9mKHN0cnVjdCBwbjUzM190YXJnZXRfamV3ZWwpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBSZXF1aXJlbWVudCA0LjYuMy4zIGZyb20gTkZDIEZvcnVtIERpZ2l0YWwgU3BlYyAqLworCXNzZCA9IFBONTMzX1RZUEVfQV9TRU5TX1JFU19TU0QoamV3ZWwtPnNlbnNfcmVzKTsKKwlwbGF0Y29uZiA9IFBONTMzX1RZUEVfQV9TRU5TX1JFU19QTEFUQ09ORihqZXdlbC0+c2Vuc19yZXMpOworCisJaWYgKChzc2QgPT0gUE41MzNfVFlQRV9BX1NFTlNfUkVTX1NTRF9KRVdFTCAmJgorCQkJcGxhdGNvbmYgIT0gUE41MzNfVFlQRV9BX1NFTlNfUkVTX1BMQVRDT05GX0pFV0VMKSB8fAorCQkJKHNzZCAhPSBQTjUzM19UWVBFX0FfU0VOU19SRVNfU1NEX0pFV0VMICYmCisJCQlwbGF0Y29uZiA9PSBQTjUzM19UWVBFX0FfU0VOU19SRVNfUExBVENPTkZfSkVXRUwpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBwbjUzM190YXJnZXRfZm91bmRfamV3ZWwoc3RydWN0IG5mY190YXJnZXQgKm5mY190Z3QsIHU4ICp0Z3RfZGF0YSwKKwkJCQkJCQlpbnQgdGd0X2RhdGFfbGVuKQoreworCXN0cnVjdCBwbjUzM190YXJnZXRfamV3ZWwgKnRndF9qZXdlbDsKKworCXRndF9qZXdlbCA9IChzdHJ1Y3QgcG41MzNfdGFyZ2V0X2pld2VsICopIHRndF9kYXRhOworCisJaWYgKCFwbjUzM190YXJnZXRfamV3ZWxfaXNfdmFsaWQodGd0X2pld2VsLCB0Z3RfZGF0YV9sZW4pKQorCQlyZXR1cm4gLUVQUk9UTzsKKworCW5mY190Z3QtPnN1cHBvcnRlZF9wcm90b2NvbHMgPSBORkNfUFJPVE9fSkVXRUxfTUFTSzsKKwluZmNfdGd0LT5zZW5zX3JlcyA9IGJlMTZfdG9fY3B1KHRndF9qZXdlbC0+c2Vuc19yZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbjUzM190eXBlX2JfcHJvdF9pbmZvIHsKKwl1OCBiaXRyYXRlOworCXU4IGZzY2lfdHlwZTsKKwl1OCBmd2lfYWRjX2ZvOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBQTjUzM19UWVBFX0JfUFJPVF9GQ1NJKHgpICgoKHgpICYgMHhGMCkgPj4gNCkKKyNkZWZpbmUgUE41MzNfVFlQRV9CX1BST1RfVFlQRSh4KSAoKCh4KSAmIDB4MEYpID4+IDApCisjZGVmaW5lIFBONTMzX1RZUEVfQl9QUk9UX1RZUEVfUkZVX01BU0sgMHg4CisKK3N0cnVjdCBwbjUzM190eXBlX2Jfc2Vuc19yZXMgeworCXU4IG9wY29kZTsKKwl1OCBuZmNpZFs0XTsKKwl1OCBhcHBkYXRhWzRdOworCXN0cnVjdCBwbjUzM190eXBlX2JfcHJvdF9pbmZvIHByb3RfaW5mbzsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgUE41MzNfVFlQRV9CX09QQ19TRU5TQl9SRVMgMHg1MAorCitzdHJ1Y3QgcG41MzNfdGFyZ2V0X3R5cGVfYiB7CisJc3RydWN0IHBuNTMzX3R5cGVfYl9zZW5zX3JlcyBzZW5zYl9yZXM7CisJdTggYXR0cmliX3Jlc19sZW47CisJdTggYXR0cmliX3Jlc1tdOworfSBfX3BhY2tlZDsKKworc3RhdGljIGJvb2wgcG41MzNfdGFyZ2V0X3R5cGVfYl9pc192YWxpZChzdHJ1Y3QgcG41MzNfdGFyZ2V0X3R5cGVfYiAqdHlwZV9iLAorCQkJCQkJCWludCB0YXJnZXRfZGF0YV9sZW4pCit7CisJaWYgKHRhcmdldF9kYXRhX2xlbiA8IHNpemVvZihzdHJ1Y3QgcG41MzNfdGFyZ2V0X3R5cGVfYikpCisJCXJldHVybiBmYWxzZTsKKworCWlmICh0eXBlX2ItPnNlbnNiX3Jlcy5vcGNvZGUgIT0gUE41MzNfVFlQRV9CX09QQ19TRU5TQl9SRVMpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChQTjUzM19UWVBFX0JfUFJPVF9UWVBFKHR5cGVfYi0+c2Vuc2JfcmVzLnByb3RfaW5mby5mc2NpX3R5cGUpICYKKwkJCQkJCVBONTMzX1RZUEVfQl9QUk9UX1RZUEVfUkZVX01BU0spCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IHBuNTMzX3RhcmdldF9mb3VuZF90eXBlX2Ioc3RydWN0IG5mY190YXJnZXQgKm5mY190Z3QsIHU4ICp0Z3RfZGF0YSwKKwkJCQkJCQlpbnQgdGd0X2RhdGFfbGVuKQoreworCXN0cnVjdCBwbjUzM190YXJnZXRfdHlwZV9iICp0Z3RfdHlwZV9iOworCisJdGd0X3R5cGVfYiA9IChzdHJ1Y3QgcG41MzNfdGFyZ2V0X3R5cGVfYiAqKSB0Z3RfZGF0YTsKKworCWlmICghcG41MzNfdGFyZ2V0X3R5cGVfYl9pc192YWxpZCh0Z3RfdHlwZV9iLCB0Z3RfZGF0YV9sZW4pKQorCQlyZXR1cm4gLUVQUk9UTzsKKworCW5mY190Z3QtPnN1cHBvcnRlZF9wcm90b2NvbHMgPSBORkNfUFJPVE9fSVNPMTQ0NDNfTUFTSzsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcG41MzNfcG9sbF9yZXNwb25zZSB7CisJdTggbmJ0ZzsKKwl1OCB0ZzsKKwl1OCB0YXJnZXRfZGF0YVtdOworfSBfX3BhY2tlZDsKKworc3RhdGljIGludCBwbjUzM190YXJnZXRfZm91bmQoc3RydWN0IHBuNTMzICpkZXYsCisJCQlzdHJ1Y3QgcG41MzNfcG9sbF9yZXNwb25zZSAqcmVzcCwgaW50IHJlc3BfbGVuKQoreworCWludCB0YXJnZXRfZGF0YV9sZW47CisJc3RydWN0IG5mY190YXJnZXQgbmZjX3RndDsKKwlpbnQgcmM7CisKKwluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIiVzIC0gbW9kdWxhdGlvbj0lZCIsIF9fZnVuY19fLAorCQkJCQkJCWRldi0+cG9sbF9tb2RfY3Vycik7CisKKwlpZiAocmVzcC0+dGcgIT0gMSkKKwkJcmV0dXJuIC1FUFJPVE87CisKKwl0YXJnZXRfZGF0YV9sZW4gPSByZXNwX2xlbiAtIHNpemVvZihzdHJ1Y3QgcG41MzNfcG9sbF9yZXNwb25zZSk7CisKKwlzd2l0Y2ggKGRldi0+cG9sbF9tb2RfY3VycikgeworCWNhc2UgUE41MzNfUE9MTF9NT0RfMTA2S0JQU19BOgorCQlyYyA9IHBuNTMzX3RhcmdldF9mb3VuZF90eXBlX2EoJm5mY190Z3QsIHJlc3AtPnRhcmdldF9kYXRhLAorCQkJCQkJCXRhcmdldF9kYXRhX2xlbik7CisJCWJyZWFrOworCWNhc2UgUE41MzNfUE9MTF9NT0RfMjEyS0JQU19GRUxJQ0E6CisJY2FzZSBQTjUzM19QT0xMX01PRF80MjRLQlBTX0ZFTElDQToKKwkJcmMgPSBwbjUzM190YXJnZXRfZm91bmRfZmVsaWNhKCZuZmNfdGd0LCByZXNwLT50YXJnZXRfZGF0YSwKKwkJCQkJCQl0YXJnZXRfZGF0YV9sZW4pOworCQlicmVhazsKKwljYXNlIFBONTMzX1BPTExfTU9EXzEwNktCUFNfSkVXRUw6CisJCXJjID0gcG41MzNfdGFyZ2V0X2ZvdW5kX2pld2VsKCZuZmNfdGd0LCByZXNwLT50YXJnZXRfZGF0YSwKKwkJCQkJCQl0YXJnZXRfZGF0YV9sZW4pOworCQlicmVhazsKKwljYXNlIFBONTMzX1BPTExfTU9EXzg0N0tCUFNfQjoKKwkJcmMgPSBwbjUzM190YXJnZXRfZm91bmRfdHlwZV9iKCZuZmNfdGd0LCByZXNwLT50YXJnZXRfZGF0YSwKKwkJCQkJCQl0YXJnZXRfZGF0YV9sZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluZmNfZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlVua25vd24gY3VycmVudCBwb2xsIgorCQkJCQkJCQkiIG1vZHVsYXRpb24iKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoIShuZmNfdGd0LnN1cHBvcnRlZF9wcm90b2NvbHMgJiBkZXYtPnBvbGxfcHJvdG9jb2xzKSkgeworCQluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlRoZSB0YXJnZXQgZm91bmQgZG9lcyBub3QiCisJCQkJCQkiIGhhdmUgdGhlIGRlc2lyZWQgcHJvdG9jb2wiKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJUYXJnZXQgZm91bmQgLSBzdXBwb3J0ZWQgcHJvdG9jb2xzOiAiCisJCQkJCSIweCV4IiwgbmZjX3RndC5zdXBwb3J0ZWRfcHJvdG9jb2xzKTsKKworCWRldi0+dGd0X2F2YWlsYWJsZV9wcm90cyA9IG5mY190Z3Quc3VwcG9ydGVkX3Byb3RvY29sczsKKworCW5mY190YXJnZXRzX2ZvdW5kKGRldi0+bmZjX2RldiwgJm5mY190Z3QsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBuNTMzX3BvbGxfcmVzZXRfbW9kX2xpc3Qoc3RydWN0IHBuNTMzICpkZXYpCit7CisJZGV2LT5wb2xsX21vZF9jb3VudCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHBuNTMzX3BvbGxfYWRkX21vZChzdHJ1Y3QgcG41MzMgKmRldiwgdTggbW9kX2luZGV4KQoreworCWRldi0+cG9sbF9tb2RfYWN0aXZlW2Rldi0+cG9sbF9tb2RfY291bnRdID0KKwkJKHN0cnVjdCBwbjUzM19wb2xsX21vZHVsYXRpb25zICopICZwb2xsX21vZFttb2RfaW5kZXhdOworCWRldi0+cG9sbF9tb2RfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQgcG41MzNfcG9sbF9jcmVhdGVfbW9kX2xpc3Qoc3RydWN0IHBuNTMzICpkZXYsIHUzMiBwcm90b2NvbHMpCit7CisJcG41MzNfcG9sbF9yZXNldF9tb2RfbGlzdChkZXYpOworCisJaWYgKHByb3RvY29scyAmIE5GQ19QUk9UT19NSUZBUkVfTUFTSworCQkJCQl8fCBwcm90b2NvbHMgJiBORkNfUFJPVE9fSVNPMTQ0NDNfTUFTSworCQkJCQl8fCBwcm90b2NvbHMgJiBORkNfUFJPVE9fTkZDX0RFUF9NQVNLKQorCQlwbjUzM19wb2xsX2FkZF9tb2QoZGV2LCBQTjUzM19QT0xMX01PRF8xMDZLQlBTX0EpOworCisJaWYgKHByb3RvY29scyAmIE5GQ19QUk9UT19GRUxJQ0FfTUFTSworCQkJCQl8fCBwcm90b2NvbHMgJiBORkNfUFJPVE9fTkZDX0RFUF9NQVNLKSB7CisJCXBuNTMzX3BvbGxfYWRkX21vZChkZXYsIFBONTMzX1BPTExfTU9EXzIxMktCUFNfRkVMSUNBKTsKKwkJcG41MzNfcG9sbF9hZGRfbW9kKGRldiwgUE41MzNfUE9MTF9NT0RfNDI0S0JQU19GRUxJQ0EpOworCX0KKworCWlmIChwcm90b2NvbHMgJiBORkNfUFJPVE9fSkVXRUxfTUFTSykKKwkJcG41MzNfcG9sbF9hZGRfbW9kKGRldiwgUE41MzNfUE9MTF9NT0RfMTA2S0JQU19KRVdFTCk7CisKKwlpZiAocHJvdG9jb2xzICYgTkZDX1BST1RPX0lTTzE0NDQzX01BU0spCisJCXBuNTMzX3BvbGxfYWRkX21vZChkZXYsIFBONTMzX1BPTExfTU9EXzg0N0tCUFNfQik7Cit9CisKK3N0YXRpYyB2b2lkIHBuNTMzX3N0YXJ0X3BvbGxfZnJhbWUoc3RydWN0IHBuNTMzX2ZyYW1lICpmcmFtZSwKKwkJCQkJc3RydWN0IHBuNTMzX3BvbGxfbW9kdWxhdGlvbnMgKm1vZCkKK3sKKworCXBuNTMzX3R4X2ZyYW1lX2luaXQoZnJhbWUsIFBONTMzX0NNRF9JTl9MSVNUX1BBU1NJVkVfVEFSR0VUKTsKKworCW1lbWNweShQTjUzM19GUkFNRV9DTURfUEFSQU1TX1BUUihmcmFtZSksICZtb2QtPmRhdGEsIG1vZC0+bGVuKTsKKwlmcmFtZS0+ZGF0YWxlbiArPSBtb2QtPmxlbjsKKworCXBuNTMzX3R4X2ZyYW1lX2ZpbmlzaChmcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcG41MzNfc3RhcnRfcG9sbF9jb21wbGV0ZShzdHJ1Y3QgcG41MzMgKmRldiwgdm9pZCAqYXJnLAorCQkJCQkJdTggKnBhcmFtcywgaW50IHBhcmFtc19sZW4pCit7CisJc3RydWN0IHBuNTMzX3BvbGxfcmVzcG9uc2UgKnJlc3A7CisJc3RydWN0IHBuNTMzX3BvbGxfbW9kdWxhdGlvbnMgKm5leHRfbW9kOworCWludCByYzsKKworCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlpZiAocGFyYW1zX2xlbiA9PSAtRU5PRU5UKSB7CisJCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiUG9sbGluZyBvcGVyYXRpb24gaGFzIGJlZW4iCisJCQkJCQkJCSIgc3RvcHBlZCIpOworCQlnb3RvIHN0b3BfcG9sbDsKKwl9CisKKwlpZiAocGFyYW1zX2xlbiA8IDApIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJFcnJvciAlZCB3aGVuIHJ1bm5pbmcgcG9sbCIsCisJCQkJCQkJCXBhcmFtc19sZW4pOworCQlnb3RvIHN0b3BfcG9sbDsKKwl9CisKKwlyZXNwID0gKHN0cnVjdCBwbjUzM19wb2xsX3Jlc3BvbnNlICopIHBhcmFtczsKKwlpZiAocmVzcC0+bmJ0ZykgeworCQlyYyA9IHBuNTMzX3RhcmdldF9mb3VuZChkZXYsIHJlc3AsIHBhcmFtc19sZW4pOworCisJCS8qIFdlIG11c3Qgc3RvcCB0aGUgcG9sbCBhZnRlciBhIHZhbGlkIHRhcmdldCBmb3VuZCAqLworCQlpZiAocmMgPT0gMCkKKwkJCWdvdG8gc3RvcF9wb2xsOworCisJCWlmIChyYyAhPSAtRUFHQUlOKQorCQkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJUaGUgdGFyZ2V0IGZvdW5kIGlzIgorCQkJCQkiIG5vdCB2YWxpZCAtIGNvbnRpbnVpbmcgdG8gcG9sbCIpOworCX0KKworCWRldi0+cG9sbF9tb2RfY3VyciA9IChkZXYtPnBvbGxfbW9kX2N1cnIgKyAxKSAlIGRldi0+cG9sbF9tb2RfY291bnQ7CisKKwluZXh0X21vZCA9IGRldi0+cG9sbF9tb2RfYWN0aXZlW2Rldi0+cG9sbF9tb2RfY3Vycl07CisKKwluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlBvbGxpbmcgbmV4dCBtb2R1bGF0aW9uICgweCV4KSIsCisJCQkJCQkJZGV2LT5wb2xsX21vZF9jdXJyKTsKKworCXBuNTMzX3N0YXJ0X3BvbGxfZnJhbWUoZGV2LT5vdXRfZnJhbWUsIG5leHRfbW9kKTsKKworCS8qIERvbid0IG5lZWQgdG8gZG93biB0aGUgc2VtYXBob3JlIGFnYWluICovCisJcmMgPSBfX3BuNTMzX3NlbmRfY21kX2ZyYW1lX2FzeW5jKGRldiwgZGV2LT5vdXRfZnJhbWUsIGRldi0+aW5fZnJhbWUsCisJCQkJZGV2LT5pbl9tYXhsZW4sIHBuNTMzX3N0YXJ0X3BvbGxfY29tcGxldGUsCisJCQkJTlVMTCwgR0ZQX0FUT01JQyk7CisKKwlpZiAocmMgPT0gLUVQRVJNKSB7CisJCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiQ2Fubm90IHBvbGwgbmV4dCBtb2R1bGF0aW9uIgorCQkJCQkiIGJlY2F1c2UgcG9sbCBoYXMgYmVlbiBzdG9wcGVkIik7CisJCWdvdG8gc3RvcF9wb2xsOworCX0KKworCWlmIChyYykgeworCQluZmNfZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIkVycm9yICVkIHdoZW4gdHJ5aW5nIHRvIHBvbGwiCisJCQkJCQkJIiBuZXh0IG1vZHVsYXRpb24iLCByYyk7CisJCWdvdG8gc3RvcF9wb2xsOworCX0KKworCS8qIEluZm9ybSBjYWxsZXIgZnVuY3Rpb24gdG8gZG8gbm90IHVwIHRoZSBzZW1hcGhvcmUgKi8KKwlyZXR1cm4gLUVJTlBST0dSRVNTOworCitzdG9wX3BvbGw6CisJcG41MzNfcG9sbF9yZXNldF9tb2RfbGlzdChkZXYpOworCWRldi0+cG9sbF9wcm90b2NvbHMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBuNTMzX3N0YXJ0X3BvbGwoc3RydWN0IG5mY19kZXYgKm5mY19kZXYsIHUzMiBwcm90b2NvbHMpCit7CisJc3RydWN0IHBuNTMzICpkZXYgPSBuZmNfZ2V0X2RydmRhdGEobmZjX2Rldik7CisJc3RydWN0IHBuNTMzX3BvbGxfbW9kdWxhdGlvbnMgKnN0YXJ0X21vZDsKKwlpbnQgcmM7CisKKwluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIiVzIC0gcHJvdG9jb2xzPTB4JXgiLCBfX2Z1bmNfXywKKwkJCQkJCQkJcHJvdG9jb2xzKTsKKworCWlmIChkZXYtPnBvbGxfbW9kX2NvdW50KSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiUG9sbGluZyBvcGVyYXRpb24gYWxyZWFkeSIKKwkJCQkJCQkJIiBhY3RpdmUiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoZGV2LT50Z3RfYWN0aXZlX3Byb3QpIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJDYW5ub3QgcG9sbCB3aXRoIGEgdGFyZ2V0IgorCQkJCQkJCSIgYWxyZWFkeSBhY3RpdmF0ZWQiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlwbjUzM19wb2xsX2NyZWF0ZV9tb2RfbGlzdChkZXYsIHByb3RvY29scyk7CisKKwlpZiAoIWRldi0+cG9sbF9tb2RfY291bnQpIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJObyB2YWxpZCBwcm90b2NvbHMiCisJCQkJCQkJCSIgc3BlY2lmaWVkIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIkl0IHdpbGwgcG9sbCAlZCBtb2R1bGF0aW9ucyB0eXBlcyIsCisJCQkJCQkJZGV2LT5wb2xsX21vZF9jb3VudCk7CisKKwlkZXYtPnBvbGxfbW9kX2N1cnIgPSAwOworCXN0YXJ0X21vZCA9IGRldi0+cG9sbF9tb2RfYWN0aXZlW2Rldi0+cG9sbF9tb2RfY3Vycl07CisKKwlwbjUzM19zdGFydF9wb2xsX2ZyYW1lKGRldi0+b3V0X2ZyYW1lLCBzdGFydF9tb2QpOworCisJcmMgPSBwbjUzM19zZW5kX2NtZF9mcmFtZV9hc3luYyhkZXYsIGRldi0+b3V0X2ZyYW1lLCBkZXYtPmluX2ZyYW1lLAorCQkJCWRldi0+aW5fbWF4bGVuLAlwbjUzM19zdGFydF9wb2xsX2NvbXBsZXRlLAorCQkJCU5VTEwsIEdGUF9LRVJORUwpOworCisJaWYgKHJjKSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiRXJyb3IgJWQgd2hlbiB0cnlpbmcgdG8iCisJCQkJCQkJIiBzdGFydCBwb2xsIiwgcmMpOworCQlnb3RvIGVycm9yOworCX0KKworCWRldi0+cG9sbF9wcm90b2NvbHMgPSBwcm90b2NvbHM7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcG41MzNfcG9sbF9yZXNldF9tb2RfbGlzdChkZXYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgcG41MzNfc3RvcF9wb2xsKHN0cnVjdCBuZmNfZGV2ICpuZmNfZGV2KQoreworCXN0cnVjdCBwbjUzMyAqZGV2ID0gbmZjX2dldF9kcnZkYXRhKG5mY19kZXYpOworCisJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKworCWlmICghZGV2LT5wb2xsX21vZF9jb3VudCkgeworCQluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlBvbGxpbmcgb3BlcmF0aW9uIHdhcyBub3QiCisJCQkJCQkJCSIgcnVubmluZyIpOworCQlyZXR1cm47CisJfQorCisJLyogQW4gYWNrIHdpbGwgY2FuY2VsIHRoZSBsYXN0IGlzc3VlZCBjb21tYW5kIChwb2xsKSAqLworCXBuNTMzX3NlbmRfYWNrKGRldiwgR0ZQX0tFUk5FTCk7CisKKwkvKiBwcmV2ZW50IHBuNTMzX3N0YXJ0X3BvbGxfY29tcGxldGUgdG8gaXNzdWUgYSBuZXcgcG9sbCBtZWFud2hpbGUgKi8KKwl1c2Jfa2lsbF91cmIoZGV2LT5pbl91cmIpOworfQorCitzdGF0aWMgaW50IHBuNTMzX2FjdGl2YXRlX3RhcmdldF9uZmNkZXAoc3RydWN0IHBuNTMzICpkZXYpCit7CisJc3RydWN0IHBuNTMzX2NtZF9hY3RpdmF0ZV9wYXJhbSBwYXJhbTsKKwlzdHJ1Y3QgcG41MzNfY21kX2FjdGl2YXRlX3Jlc3BvbnNlICpyZXNwOworCWludCByYzsKKworCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlwbjUzM190eF9mcmFtZV9pbml0KGRldi0+b3V0X2ZyYW1lLCBQTjUzM19DTURfSU5fQVRSKTsKKworCXBhcmFtLnRnID0gMTsKKwlwYXJhbS5uZXh0ID0gMDsKKwltZW1jcHkoUE41MzNfRlJBTUVfQ01EX1BBUkFNU19QVFIoZGV2LT5vdXRfZnJhbWUpLCAmcGFyYW0sCisJCQkJc2l6ZW9mKHN0cnVjdCBwbjUzM19jbWRfYWN0aXZhdGVfcGFyYW0pKTsKKwlkZXYtPm91dF9mcmFtZS0+ZGF0YWxlbiArPSBzaXplb2Yoc3RydWN0IHBuNTMzX2NtZF9hY3RpdmF0ZV9wYXJhbSk7CisKKwlwbjUzM190eF9mcmFtZV9maW5pc2goZGV2LT5vdXRfZnJhbWUpOworCisJcmMgPSBwbjUzM19zZW5kX2NtZF9mcmFtZV9zeW5jKGRldiwgZGV2LT5vdXRfZnJhbWUsIGRldi0+aW5fZnJhbWUsCisJCQkJCQkJCWRldi0+aW5fbWF4bGVuKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJlc3AgPSAoc3RydWN0IHBuNTMzX2NtZF9hY3RpdmF0ZV9yZXNwb25zZSAqKQorCQkJCVBONTMzX0ZSQU1FX0NNRF9QQVJBTVNfUFRSKGRldi0+aW5fZnJhbWUpOworCXJjID0gcmVzcC0+c3RhdHVzICYgUE41MzNfQ01EX1JFVF9NQVNLOworCWlmIChyYyAhPSBQTjUzM19DTURfUkVUX1NVQ0NFU1MpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG41MzNfYWN0aXZhdGVfdGFyZ2V0KHN0cnVjdCBuZmNfZGV2ICpuZmNfZGV2LCB1MzIgdGFyZ2V0X2lkeCwKKwkJCQkJCQkJdTMyIHByb3RvY29sKQoreworCXN0cnVjdCBwbjUzMyAqZGV2ID0gbmZjX2dldF9kcnZkYXRhKG5mY19kZXYpOworCWludCByYzsKKworCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiJXMgLSBwcm90b2NvbD0ldSIsIF9fZnVuY19fLAorCQkJCQkJCQlwcm90b2NvbCk7CisKKwlpZiAoZGV2LT5wb2xsX21vZF9jb3VudCkgeworCQluZmNfZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIkNhbm5vdCBhY3RpdmF0ZSB3aGlsZSIKKwkJCQkJCQkJIiBwb2xsaW5nIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKGRldi0+dGd0X2FjdGl2ZV9wcm90KSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiVGhlcmUgaXMgYWxyZWFkeSBhbiBhY3RpdmUiCisJCQkJCQkJCSIgdGFyZ2V0Iik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKCFkZXYtPnRndF9hdmFpbGFibGVfcHJvdHMpIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJUaGVyZSBpcyBubyBhdmFpbGFibGUgdGFyZ2V0IgorCQkJCQkJCQkiIHRvIGFjdGl2YXRlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghKGRldi0+dGd0X2F2YWlsYWJsZV9wcm90cyAmICgxIDw8IHByb3RvY29sKSkpIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJUaGUgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQiCisJCQkJCSIgdGhlIHJlcXVlc3RlZCBwcm90b2NvbCAldSIsIHByb3RvY29sKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHByb3RvY29sID09IE5GQ19QUk9UT19ORkNfREVQKSB7CisJCXJjID0gcG41MzNfYWN0aXZhdGVfdGFyZ2V0X25mY2RlcChkZXYpOworCQlpZiAocmMpIHsKKwkJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiRXJyb3IgJWQgd2hlbiIKKwkJCQkJCSIgYWN0aXZhdGluZyB0YXJnZXQgd2l0aCIKKwkJCQkJCSIgTkZDX0RFUCBwcm90b2NvbCIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCWRldi0+dGd0X2FjdGl2ZV9wcm90ID0gcHJvdG9jb2w7CisJZGV2LT50Z3RfYXZhaWxhYmxlX3Byb3RzID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwbjUzM19kZWFjdGl2YXRlX3RhcmdldChzdHJ1Y3QgbmZjX2RldiAqbmZjX2RldiwgdTMyIHRhcmdldF9pZHgpCit7CisJc3RydWN0IHBuNTMzICpkZXYgPSBuZmNfZ2V0X2RydmRhdGEobmZjX2Rldik7CisJdTggdGc7CisJdTggc3RhdHVzOworCWludCByYzsKKworCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlpZiAoIWRldi0+dGd0X2FjdGl2ZV9wcm90KSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiVGhlcmUgaXMgbm8gYWN0aXZlIHRhcmdldCIpOworCQlyZXR1cm47CisJfQorCisJZGV2LT50Z3RfYWN0aXZlX3Byb3QgPSAwOworCisJcG41MzNfdHhfZnJhbWVfaW5pdChkZXYtPm91dF9mcmFtZSwgUE41MzNfQ01EX0lOX1JFTEVBU0UpOworCisJdGcgPSAxOworCW1lbWNweShQTjUzM19GUkFNRV9DTURfUEFSQU1TX1BUUihkZXYtPm91dF9mcmFtZSksICZ0Zywgc2l6ZW9mKHU4KSk7CisJZGV2LT5vdXRfZnJhbWUtPmRhdGFsZW4gKz0gc2l6ZW9mKHU4KTsKKworCXBuNTMzX3R4X2ZyYW1lX2ZpbmlzaChkZXYtPm91dF9mcmFtZSk7CisKKwlyYyA9IHBuNTMzX3NlbmRfY21kX2ZyYW1lX3N5bmMoZGV2LCBkZXYtPm91dF9mcmFtZSwgZGV2LT5pbl9mcmFtZSwKKwkJCQkJCQkJZGV2LT5pbl9tYXhsZW4pOworCWlmIChyYykgeworCQluZmNfZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIkVycm9yIHdoZW4gc2VuZGluZyByZWxlYXNlIgorCQkJCQkJIiBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyIik7CisJCXJldHVybjsKKwl9CisKKwlzdGF0dXMgPSBQTjUzM19GUkFNRV9DTURfUEFSQU1TX1BUUihkZXYtPmluX2ZyYW1lKVswXTsKKwlyYyA9IHN0YXR1cyAmIFBONTMzX0NNRF9SRVRfTUFTSzsKKwlpZiAocmMgIT0gUE41MzNfQ01EX1JFVF9TVUNDRVNTKQorCQluZmNfZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIkVycm9yIDB4JXggd2hlbiByZWxlYXNpbmciCisJCQkJCQkJIiB0aGUgdGFyZ2V0IiwgcmMpOworCisJcmV0dXJuOworfQorCisjZGVmaW5lIFBONTMzX0NNRF9EQVRBRVhDSF9IRUFEX0xFTiAoc2l6ZW9mKHN0cnVjdCBwbjUzM19mcmFtZSkgKyAzKQorI2RlZmluZSBQTjUzM19DTURfREFUQUVYQ0hfREFUQV9NQVhMRU4gMjYyCisKK3N0YXRpYyBpbnQgcG41MzNfZGF0YV9leGNoYW5nZV90eF9mcmFtZShzdHJ1Y3QgcG41MzMgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcGF5bG9hZF9sZW4gPSBza2ItPmxlbjsKKwlzdHJ1Y3QgcG41MzNfZnJhbWUgKm91dF9mcmFtZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZGlzY2FyZGVkOworCXU4IHRnOworCisJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICIlcyAtIFNlbmRpbmcgJWQgYnl0ZXMiLCBfX2Z1bmNfXywKKwkJCQkJCQkJcGF5bG9hZF9sZW4pOworCisJaWYgKHBheWxvYWRfbGVuID4gUE41MzNfQ01EX0RBVEFFWENIX0RBVEFfTUFYTEVOKSB7CisJCS8qIFRPRE86IEltcGxlbWVudCBzdXBwb3J0IHRvIG11bHRpLXBhcnQgZGF0YSBleGNoYW5nZSAqLworCQluZmNfZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIkRhdGEgbGVuZ3RoIGdyZWF0ZXIgdGhhbiB0aGUiCisJCQkJCQkiIG1heCBhbGxvd2VkOiAlZCIsCisJCQkJCQlQTjUzM19DTURfREFUQUVYQ0hfREFUQV9NQVhMRU4pOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwkvKiBSZXNlcnZpbmcgaGVhZGVyIHNwYWNlICovCisJaWYgKHNrYl9jb3dfaGVhZChza2IsIFBONTMzX0NNRF9EQVRBRVhDSF9IRUFEX0xFTikpIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJFcnJvciB0byBhZGQgaGVhZGVyIGRhdGEiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUmVzZXJ2aW5nIHRhaWwgc3BhY2UsIHNlZSBwbjUzM190eF9mcmFtZV9maW5pc2ggKi8KKwlpZiAoc2tiX2Nvd19kYXRhKHNrYiwgUE41MzNfRlJBTUVfVEFJTF9TSVpFLCAmZGlzY2FyZGVkKSA8IDApIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJFcnJvciB0byBhZGQgdGFpbCBkYXRhIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNrYl9wdXNoKHNrYiwgUE41MzNfQ01EX0RBVEFFWENIX0hFQURfTEVOKTsKKwlvdXRfZnJhbWUgPSAoc3RydWN0IHBuNTMzX2ZyYW1lICopIHNrYi0+ZGF0YTsKKworCXBuNTMzX3R4X2ZyYW1lX2luaXQob3V0X2ZyYW1lLCBQTjUzM19DTURfSU5fREFUQV9FWENIQU5HRSk7CisKKwl0ZyA9IDE7CisJbWVtY3B5KFBONTMzX0ZSQU1FX0NNRF9QQVJBTVNfUFRSKG91dF9mcmFtZSksICZ0Zywgc2l6ZW9mKHU4KSk7CisJb3V0X2ZyYW1lLT5kYXRhbGVuICs9IHNpemVvZih1OCk7CisKKwkvKiBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBvdXRfZnJhbWUsIGp1c3QgdXBkYXRlIHRoZSBkYXRhbGVuICovCisJb3V0X2ZyYW1lLT5kYXRhbGVuICs9IHBheWxvYWRfbGVuOworCisJcG41MzNfdHhfZnJhbWVfZmluaXNoKG91dF9mcmFtZSk7CisJc2tiX3B1dChza2IsIFBONTMzX0ZSQU1FX1RBSUxfU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBuNTMzX2RhdGFfZXhjaGFuZ2VfYXJnIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3Jlc3A7CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9vdXQ7CisJZGF0YV9leGNoYW5nZV9jYl90IGNiOworCXZvaWQgKmNiX2NvbnRleHQ7Cit9OworCitzdGF0aWMgaW50IHBuNTMzX2RhdGFfZXhjaGFuZ2VfY29tcGxldGUoc3RydWN0IHBuNTMzICpkZXYsIHZvaWQgKl9hcmcsCisJCQkJCQl1OCAqcGFyYW1zLCBpbnQgcGFyYW1zX2xlbikKK3sKKwlzdHJ1Y3QgcG41MzNfZGF0YV9leGNoYW5nZV9hcmcgKmFyZyA9IF9hcmc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9yZXNwID0gYXJnLT5za2JfcmVzcDsKKwlzdHJ1Y3QgcG41MzNfZnJhbWUgKmluX2ZyYW1lID0gKHN0cnVjdCBwbjUzM19mcmFtZSAqKSBza2JfcmVzcC0+ZGF0YTsKKwlpbnQgZXJyID0gMDsKKwl1OCBzdGF0dXM7CisJdTggY21kX3JldDsKKworCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlkZXZfa2ZyZWVfc2tiX2lycShhcmctPnNrYl9vdXQpOworCisJaWYgKHBhcmFtc19sZW4gPCAwKSB7IC8qIGVycm9yICovCisJCWVyciA9IHBhcmFtc19sZW47CisJCWdvdG8gZXJyb3I7CisJfQorCisJc2tiX3B1dChza2JfcmVzcCwgUE41MzNfRlJBTUVfU0laRShpbl9mcmFtZSkpOworCisJc3RhdHVzID0gcGFyYW1zWzBdOworCisJY21kX3JldCA9IHN0YXR1cyAmIFBONTMzX0NNRF9SRVRfTUFTSzsKKwlpZiAoY21kX3JldCAhPSBQTjUzM19DTURfUkVUX1NVQ0NFU1MpIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJQTjUzMyByZXBvcnRlZCBlcnJvciAlZCB3aGVuIgorCQkJCQkJIiBleGNoYW5naW5nIGRhdGEiLCBjbWRfcmV0KTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoc3RhdHVzICYgUE41MzNfQ01EX01JX01BU0spIHsKKwkJLyogVE9ETzogSW1wbGVtZW50IHN1cHBvcnQgdG8gbXVsdGktcGFydCBkYXRhIGV4Y2hhbmdlICovCisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiTXVsdGktcGFydCBtZXNzYWdlIG5vdCB5ZXQiCisJCQkJCQkJCSIgc3VwcG9ydGVkIik7CisJCS8qIFByZXZlbnQgdGhlIG90aGVyIG1lc3NhZ2VzIGZyb20gY29udHJvbGxlciAqLworCQlwbjUzM19zZW5kX2FjayhkZXYsIEdGUF9BVE9NSUMpOworCQllcnIgPSAtRU5PU1lTOworCQlnb3RvIGVycm9yOworCX0KKworCXNrYl9wdWxsKHNrYl9yZXNwLCBQTjUzM19DTURfREFUQUVYQ0hfSEVBRF9MRU4pOworCXNrYl90cmltKHNrYl9yZXNwLCBza2JfcmVzcC0+bGVuIC0gUE41MzNfRlJBTUVfVEFJTF9TSVpFKTsKKworCWFyZy0+Y2IoYXJnLT5jYl9jb250ZXh0LCBza2JfcmVzcCwgMCk7CisJa2ZyZWUoYXJnKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZGV2X2tmcmVlX3NrYl9pcnEoc2tiX3Jlc3ApOworCWFyZy0+Y2IoYXJnLT5jYl9jb250ZXh0LCBOVUxMLCBlcnIpOworCWtmcmVlKGFyZyk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwbjUzM19kYXRhX2V4Y2hhbmdlKHN0cnVjdCBuZmNfZGV2ICpuZmNfZGV2LCB1MzIgdGFyZ2V0X2lkeCwKKwkJCQkJCXN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQlkYXRhX2V4Y2hhbmdlX2NiX3QgY2IsCisJCQkJCQl2b2lkICpjYl9jb250ZXh0KQoreworCXN0cnVjdCBwbjUzMyAqZGV2ID0gbmZjX2dldF9kcnZkYXRhKG5mY19kZXYpOworCXN0cnVjdCBwbjUzM19mcmFtZSAqb3V0X2ZyYW1lLCAqaW5fZnJhbWU7CisJc3RydWN0IHBuNTMzX2RhdGFfZXhjaGFuZ2VfYXJnICphcmc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9yZXNwOworCWludCBza2JfcmVzcF9sZW47CisJaW50IHJjOworCisJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKworCWlmICghZGV2LT50Z3RfYWN0aXZlX3Byb3QpIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJDYW5ub3QgZXhjaGFuZ2UgZGF0YSBpZiIKKwkJCQkJCSIgdGhlcmUgaXMgbm8gYWN0aXZlIHRhcmdldCIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmMgPSBwbjUzM19kYXRhX2V4Y2hhbmdlX3R4X2ZyYW1lKGRldiwgc2tiKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyb3I7CisKKwlza2JfcmVzcF9sZW4gPSBQTjUzM19DTURfREFUQUVYQ0hfSEVBRF9MRU4gKworCQkJUE41MzNfQ01EX0RBVEFFWENIX0RBVEFfTUFYTEVOICsKKwkJCVBONTMzX0ZSQU1FX1RBSUxfU0laRTsKKworCXNrYl9yZXNwID0gbmZjX2FsbG9jX3NrYihza2JfcmVzcF9sZW4sIEdGUF9LRVJORUwpOworCWlmICghc2tiX3Jlc3ApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCWluX2ZyYW1lID0gKHN0cnVjdCBwbjUzM19mcmFtZSAqKSBza2JfcmVzcC0+ZGF0YTsKKwlvdXRfZnJhbWUgPSAoc3RydWN0IHBuNTMzX2ZyYW1lICopIHNrYi0+ZGF0YTsKKworCWFyZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbjUzM19kYXRhX2V4Y2hhbmdlX2FyZyksIEdGUF9LRVJORUwpOworCWlmICghYXJnKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmcmVlX3NrYl9yZXNwOworCX0KKworCWFyZy0+c2tiX3Jlc3AgPSBza2JfcmVzcDsKKwlhcmctPnNrYl9vdXQgPSBza2I7CisJYXJnLT5jYiA9IGNiOworCWFyZy0+Y2JfY29udGV4dCA9IGNiX2NvbnRleHQ7CisKKwlyYyA9IHBuNTMzX3NlbmRfY21kX2ZyYW1lX2FzeW5jKGRldiwgb3V0X2ZyYW1lLCBpbl9mcmFtZSwgc2tiX3Jlc3BfbGVuLAorCQkJCQlwbjUzM19kYXRhX2V4Y2hhbmdlX2NvbXBsZXRlLCBhcmcsCisJCQkJCUdGUF9LRVJORUwpOworCWlmIChyYykgeworCQluZmNfZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIkVycm9yICVkIHdoZW4gdHJ5aW5nIHRvIgorCQkJCQkJIiBwZXJmb3JtIGRhdGFfZXhjaGFuZ2UiLCByYyk7CisJCWdvdG8gZnJlZV9hcmc7CisJfQorCisJcmV0dXJuIDA7CisKK2ZyZWVfYXJnOgorCWtmcmVlKGFyZyk7CitmcmVlX3NrYl9yZXNwOgorCWtmcmVlX3NrYihza2JfcmVzcCk7CitlcnJvcjoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcG41MzNfc2V0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBuNTMzICpkZXYsIHU4IGNmZ2l0ZW0sIHU4ICpjZmdkYXRhLAorCQkJCQkJCQl1OCBjZmdkYXRhX2xlbikKK3sKKwlpbnQgcmM7CisJdTggKnBhcmFtczsKKworCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlwbjUzM190eF9mcmFtZV9pbml0KGRldi0+b3V0X2ZyYW1lLCBQTjUzM19DTURfUkZfQ09ORklHVVJBVElPTik7CisKKwlwYXJhbXMgPSBQTjUzM19GUkFNRV9DTURfUEFSQU1TX1BUUihkZXYtPm91dF9mcmFtZSk7CisJcGFyYW1zWzBdID0gY2ZnaXRlbTsKKwltZW1jcHkoJnBhcmFtc1sxXSwgY2ZnZGF0YSwgY2ZnZGF0YV9sZW4pOworCWRldi0+b3V0X2ZyYW1lLT5kYXRhbGVuICs9ICgxICsgY2ZnZGF0YV9sZW4pOworCisJcG41MzNfdHhfZnJhbWVfZmluaXNoKGRldi0+b3V0X2ZyYW1lKTsKKworCXJjID0gcG41MzNfc2VuZF9jbWRfZnJhbWVfc3luYyhkZXYsIGRldi0+b3V0X2ZyYW1lLCBkZXYtPmluX2ZyYW1lLAorCQkJCQkJCQlkZXYtPmluX21heGxlbik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0cnVjdCBuZmNfb3BzIHBuNTMzX25mY19vcHMgPSB7CisJLnN0YXJ0X3BvbGwgPSBwbjUzM19zdGFydF9wb2xsLAorCS5zdG9wX3BvbGwgPSBwbjUzM19zdG9wX3BvbGwsCisJLmFjdGl2YXRlX3RhcmdldCA9IHBuNTMzX2FjdGl2YXRlX3RhcmdldCwKKwkuZGVhY3RpdmF0ZV90YXJnZXQgPSBwbjUzM19kZWFjdGl2YXRlX3RhcmdldCwKKwkuZGF0YV9leGNoYW5nZSA9IHBuNTMzX2RhdGFfZXhjaGFuZ2UsCit9OworCitzdGF0aWMgaW50IHBuNTMzX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHBuNTMzX2Z3X3ZlcnNpb24gKmZ3X3ZlcjsKKwlzdHJ1Y3QgcG41MzMgKmRldjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJc3RydWN0IHBuNTMzX2NvbmZpZ19tYXhfcmV0cmllcyBtYXhfcmV0cmllczsKKwlpbnQgaW5fZW5kcG9pbnQgPSAwOworCWludCBvdXRfZW5kcG9pbnQgPSAwOworCWludCByYyA9IC1FTk9NRU07CisJaW50IGk7CisJdTMyIHByb3RvY29sczsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYtPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOworCWRldi0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOworCXNlbWFfaW5pdCgmZGV2LT5jbWRfbG9jaywgMSk7CisKKwlpZmFjZV9kZXNjID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKworCQlpZiAoIWluX2VuZHBvaW50ICYmIHVzYl9lbmRwb2ludF9pc19idWxrX2luKGVuZHBvaW50KSkgeworCQkJZGV2LT5pbl9tYXhsZW4gPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJaW5fZW5kcG9pbnQgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJfQorCisJCWlmICghb3V0X2VuZHBvaW50ICYmIHVzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKKwkJCWRldi0+b3V0X21heGxlbiA9CisJCQkJbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCW91dF9lbmRwb2ludCA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQl9CisJfQorCisJaWYgKCFpbl9lbmRwb2ludCB8fCAhb3V0X2VuZHBvaW50KSB7CisJCW5mY19kZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBmaW5kIGJ1bGstaW4gb3IiCisJCQkJCQkJIiBidWxrLW91dCBlbmRwb2ludCIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2LT5pbl9mcmFtZSA9IGttYWxsb2MoZGV2LT5pbl9tYXhsZW4sIEdGUF9LRVJORUwpOworCWRldi0+aW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlkZXYtPm91dF9mcmFtZSA9IGttYWxsb2MoZGV2LT5vdXRfbWF4bGVuLCBHRlBfS0VSTkVMKTsKKwlkZXYtPm91dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCisJaWYgKCFkZXYtPmluX2ZyYW1lIHx8ICFkZXYtPm91dF9mcmFtZSB8fAorCQkhZGV2LT5pbl91cmIgfHwgIWRldi0+b3V0X3VyYikKKwkJZ290byBlcnJvcjsKKworCXVzYl9maWxsX2J1bGtfdXJiKGRldi0+aW5fdXJiLCBkZXYtPnVkZXYsCisJCQl1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LCBpbl9lbmRwb2ludCksCisJCQlOVUxMLCAwLCBOVUxMLCBkZXYpOworCXVzYl9maWxsX2J1bGtfdXJiKGRldi0+b3V0X3VyYiwgZGV2LT51ZGV2LAorCQkJdXNiX3NuZGJ1bGtwaXBlKGRldi0+dWRldiwgb3V0X2VuZHBvaW50KSwKKwkJCU5VTEwsIDAsCisJCQlwbjUzM19zZW5kX2NvbXBsZXRlLCBkZXYpOworCisJdGFza2xldF9pbml0KCZkZXYtPnRhc2tsZXQsIHBuNTMzX3Rhc2tsZXRfY21kX2NvbXBsZXRlLCAodWxvbmcpZGV2KTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBkZXYpOworCisJcG41MzNfdHhfZnJhbWVfaW5pdChkZXYtPm91dF9mcmFtZSwgUE41MzNfQ01EX0dFVF9GSVJNV0FSRV9WRVJTSU9OKTsKKwlwbjUzM190eF9mcmFtZV9maW5pc2goZGV2LT5vdXRfZnJhbWUpOworCisJcmMgPSBwbjUzM19zZW5kX2NtZF9mcmFtZV9zeW5jKGRldiwgZGV2LT5vdXRfZnJhbWUsIGRldi0+aW5fZnJhbWUsCisJCQkJCQkJCWRldi0+aW5fbWF4bGVuKTsKKwlpZiAocmMpCisJCWdvdG8ga2lsbF90YXNrbGV0OworCisJZndfdmVyID0gKHN0cnVjdCBwbjUzM19md192ZXJzaW9uICopCisJCQkJUE41MzNfRlJBTUVfQ01EX1BBUkFNU19QVFIoZGV2LT5pbl9mcmFtZSk7CisJbmZjX2Rldl9pbmZvKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiTlhQIFBONTMzIGZpcm13YXJlIHZlciAlZC4lZCBub3ciCisJCQkJCSIgYXR0YWNoZWQiLCBmd192ZXItPnZlciwgZndfdmVyLT5yZXYpOworCisJcHJvdG9jb2xzID0gTkZDX1BST1RPX0pFV0VMX01BU0sKKwkJCXwgTkZDX1BST1RPX01JRkFSRV9NQVNLIHwgTkZDX1BST1RPX0ZFTElDQV9NQVNLCisJCQl8IE5GQ19QUk9UT19JU08xNDQ0M19NQVNLCisJCQl8IE5GQ19QUk9UT19ORkNfREVQX01BU0s7CisKKwlkZXYtPm5mY19kZXYgPSBuZmNfYWxsb2NhdGVfZGV2aWNlKCZwbjUzM19uZmNfb3BzLCBwcm90b2NvbHMpOworCWlmICghZGV2LT5uZmNfZGV2KQorCQlnb3RvIGtpbGxfdGFza2xldDsKKworCW5mY19zZXRfcGFyZW50X2RldihkZXYtPm5mY19kZXYsICZpbnRlcmZhY2UtPmRldik7CisJbmZjX3NldF9kcnZkYXRhKGRldi0+bmZjX2RldiwgZGV2KTsKKworCXJjID0gbmZjX3JlZ2lzdGVyX2RldmljZShkZXYtPm5mY19kZXYpOworCWlmIChyYykKKwkJZ290byBmcmVlX25mY19kZXY7CisKKwltYXhfcmV0cmllcy5teF9ydHlfYXRyID0gUE41MzNfQ09ORklHX01BWF9SRVRSSUVTX0VORExFU1M7CisJbWF4X3JldHJpZXMubXhfcnR5X3BzbCA9IDI7CisJbWF4X3JldHJpZXMubXhfcnR5X3Bhc3NpdmVfYWN0ID0gUE41MzNfQ09ORklHX01BWF9SRVRSSUVTX05PX1JFVFJZOworCisJcmMgPSBwbjUzM19zZXRfY29uZmlndXJhdGlvbihkZXYsIFBONTMzX0NGR0lURU1fTUFYX1JFVFJJRVMsCisJCQkJKHU4ICopICZtYXhfcmV0cmllcywgc2l6ZW9mKG1heF9yZXRyaWVzKSk7CisKKwlpZiAocmMpIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJFcnJvciBvbiBzZXR0aW5nIE1BWF9SRVRSSUVTIgorCQkJCQkJCQkiIGNvbmZpZyIpOworCQlnb3RvIGZyZWVfbmZjX2RldjsKKwl9CisKKwlyZXR1cm4gMDsKKworZnJlZV9uZmNfZGV2OgorCW5mY19mcmVlX2RldmljZShkZXYtPm5mY19kZXYpOwora2lsbF90YXNrbGV0OgorCXRhc2tsZXRfa2lsbCgmZGV2LT50YXNrbGV0KTsKK2Vycm9yOgorCWtmcmVlKGRldi0+aW5fZnJhbWUpOworCXVzYl9mcmVlX3VyYihkZXYtPmluX3VyYik7CisJa2ZyZWUoZGV2LT5vdXRfZnJhbWUpOworCXVzYl9mcmVlX3VyYihkZXYtPm91dF91cmIpOworCWtmcmVlKGRldik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBwbjUzM19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IHBuNTMzICpkZXY7CisKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCisJbmZjX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+bmZjX2Rldik7CisJbmZjX2ZyZWVfZGV2aWNlKGRldi0+bmZjX2Rldik7CisKKwl1c2Jfa2lsbF91cmIoZGV2LT5pbl91cmIpOworCXVzYl9raWxsX3VyYihkZXYtPm91dF91cmIpOworCisJdGFza2xldF9raWxsKCZkZXYtPnRhc2tsZXQpOworCisJa2ZyZWUoZGV2LT5pbl9mcmFtZSk7CisJdXNiX2ZyZWVfdXJiKGRldi0+aW5fdXJiKTsKKwlrZnJlZShkZXYtPm91dF9mcmFtZSk7CisJdXNiX2ZyZWVfdXJiKGRldi0+b3V0X3VyYik7CisJa2ZyZWUoZGV2KTsKKworCW5mY19kZXZfaW5mbygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIk5YUCBQTjUzMyBORkMgZGV2aWNlIGRpc2Nvbm5lY3RlZCIpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgcG41MzNfZHJpdmVyID0geworCS5uYW1lID0JCSJwbjUzMyIsCisJLnByb2JlID0JcG41MzNfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQlwbjUzM19kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CXBuNTMzX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcG41MzNfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCXJjID0gdXNiX3JlZ2lzdGVyKCZwbjUzM19kcml2ZXIpOworCWlmIChyYykKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwbjUzM19leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnBuNTMzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBuNTMzX2luaXQpOworbW9kdWxlX2V4aXQocG41MzNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkxhdXJvIFJhbW9zIFZlbmFuY2lvIDxsYXVyby52ZW5hbmNpb0BvcGVuYm9zc2Eub3JnPiwiCisJCQkiIEFsb2lzaW8gQWxtZWlkYSBKciA8YWxvaXNpby5hbG1laWRhQG9wZW5ib3NzYS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBONTMzIHVzYiBkcml2ZXIgdmVyICIgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvS2NvbmZpZyBiL2RyaXZlcnMvb2YvS2NvbmZpZwppbmRleCBkMDZhNjM3Li5jYWM2M2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL0tjb25maWcKKysrIGIvZHJpdmVycy9vZi9LY29uZmlnCkBAIC03MSw4ICs3MSwxNCBAQAogCiBjb25maWcgT0ZfUENJCiAJZGVmX3RyaXN0YXRlIFBDSQotCWRlcGVuZHMgb24gUENJICYmIChQUEMgfHwgTUlDUk9CTEFaRSB8fCBYODYpCisJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCiAJICBPcGVuRmlybXdhcmUgUENJIGJ1cyBhY2Nlc3NvcnMKIAorY29uZmlnIE9GX1BDSV9JUlEKKwlkZWZfdHJpc3RhdGUgUENJCisJZGVwZW5kcyBvbiBPRl9QQ0kgJiYgT0ZfSVJRCisJaGVscAorCSAgT3BlbkZpcm13YXJlIFBDSSBJUlEgcm91dGluZyBoZWxwZXJzCisKIGVuZG1lbnUgIyBPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9NYWtlZmlsZSBiL2RyaXZlcnMvb2YvTWFrZWZpbGUKaW5kZXggZjc4NjFlZC4uZGNjYjExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL29mL01ha2VmaWxlCkBAIC0xMCwzICsxMCw0IEBACiBvYmotJChDT05GSUdfT0ZfU1BJKQkrPSBvZl9zcGkubwogb2JqLSQoQ09ORklHX09GX01ESU8pCSs9IG9mX21kaW8ubwogb2JqLSQoQ09ORklHX09GX1BDSSkJKz0gb2ZfcGNpLm8KK29iai0kKENPTkZJR19PRl9QQ0lfSVJRKSAgKz0gb2ZfcGNpX2lycS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2FkZHJlc3MuYyBiL2RyaXZlcnMvb2YvYWRkcmVzcy5jCmluZGV4IGI0NTU5YzUuLmRhMWY0YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvYWRkcmVzcy5jCisrKyBiL2RyaXZlcnMvb2YvYWRkcmVzcy5jCkBAIC01NzcsNiArNTc3LDI0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKTsKIAorc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX21hdGNoaW5nX25vZGVfYnlfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmZyb20sCisJCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCisJCQkJCXU2NCBiYXNlX2FkZHJlc3MpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShmcm9tLCBtYXRjaGVzKTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCisJd2hpbGUgKGRuKSB7CisJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRuLCAwLCAmcmVzKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocmVzLnN0YXJ0ID09IGJhc2VfYWRkcmVzcykKKwkJCXJldHVybiBkbjsKKwkJZG4gPSBvZl9maW5kX21hdGNoaW5nX25vZGUoZG4sIG1hdGNoZXMpOworCX0KKworCXJldHVybiBOVUxMOworfQorCiAKIC8qKgogICogb2ZfaW9tYXAgLSBNYXBzIHRoZSBtZW1vcnkgbWFwcGVkIElPIGZvciBhIGdpdmVuIGRldmljZV9ub2RlCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2Jhc2UuYyBiL2RyaXZlcnMvb2YvYmFzZS5jCmluZGV4IDYzMmViYWUuLjAyZWQzNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvYmFzZS5jCisrKyBiL2RyaXZlcnMvb2YvYmFzZS5jCkBAIC01OTYsNiArNTk2LDcxIEBACiBFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKTsKIAogLyoqCisgKiBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgMzIgYml0IGludGVnZXJzCisgKiBmcm9tIGEgcHJvcGVydHkuCisgKgorICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KKyAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCisgKiBAb3V0X3ZhbHVlOglwb2ludGVyIHRvIHJldHVybiB2YWx1ZSwgbW9kaWZpZWQgb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMC4KKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCAzMi1iaXQgdmFsdWUocykgZnJvbQorICogaXQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwKKyAqIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCisgKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqCisgKiBUaGUgb3V0X3ZhbHVlIGlzIG1vZGlmaWVkIG9ubHkgaWYgYSB2YWxpZCB1MzIgdmFsdWUgY2FuIGJlIGRlY29kZWQuCisgKi8KK2ludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjaGFyICpwcm9wbmFtZSwKKwkJCSAgICAgICB1MzIgKm91dF92YWx1ZXMsIHNpemVfdCBzeikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBwcm9wbmFtZSwgTlVMTCk7CisJY29uc3QgX19iZTMyICp2YWw7CisKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghcHJvcC0+dmFsdWUpCisJCXJldHVybiAtRU5PREFUQTsKKwlpZiAoKHN6ICogc2l6ZW9mKCpvdXRfdmFsdWVzKSkgPiBwcm9wLT5sZW5ndGgpCisJCXJldHVybiAtRU9WRVJGTE9XOworCisJdmFsID0gcHJvcC0+dmFsdWU7CisJd2hpbGUgKHN6LS0pCisJCSpvdXRfdmFsdWVzKysgPSBiZTMyX3RvX2NwdXAodmFsKyspOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkpOworCisvKioKKyAqIG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nIC0gRmluZCBhbmQgcmVhZCBhIHN0cmluZyBmcm9tIGEgcHJvcGVydHkKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICogQG91dF9zdHJpbmc6CXBvaW50ZXIgdG8gbnVsbCB0ZXJtaW5hdGVkIHJldHVybiBzdHJpbmcsIG1vZGlmaWVkIG9ubHkgaWYKKyAqCQlyZXR1cm4gdmFsdWUgaXMgMC4KKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2UgdHJlZSBub2RlIGFuZCByZXRyaWV2ZSBhIG51bGwKKyAqIHRlcm1pbmF0ZWQgc3RyaW5nIHZhbHVlIChwb2ludGVyIHRvIGRhdGEsIG5vdCBhIGNvcHkpLiBSZXR1cm5zIDAgb24KKyAqIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LCAtRU5PREFUQSBpZiBwcm9wZXJ0eQorICogZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVJTFNFUSBpZiB0aGUgc3RyaW5nIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQKKyAqIHdpdGhpbiB0aGUgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSBkYXRhLgorICoKKyAqIFRoZSBvdXRfc3RyaW5nIHBvaW50ZXIgaXMgbW9kaWZpZWQgb25seSBpZiBhIHZhbGlkIHN0cmluZyBjYW4gYmUgZGVjb2RlZC4KKyAqLworaW50IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNoYXIgKnByb3BuYW1lLAorCQkJCWNvbnN0IGNoYXIgKipvdXRfc3RyaW5nKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIHByb3BuYW1lLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghcHJvcC0+dmFsdWUpCisJCXJldHVybiAtRU5PREFUQTsKKwlpZiAoc3Rybmxlbihwcm9wLT52YWx1ZSwgcHJvcC0+bGVuZ3RoKSA+PSBwcm9wLT5sZW5ndGgpCisJCXJldHVybiAtRUlMU0VROworCSpvdXRfc3RyaW5nID0gcHJvcC0+dmFsdWU7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyk7CisKKy8qKgogICogb2ZfcGFyc2VfcGhhbmRsZSAtIFJlc29sdmUgYSBwaGFuZGxlIHByb3BlcnR5IHRvIGEgZGV2aWNlX25vZGUgcG9pbnRlcgogICogQG5wOiBQb2ludGVyIHRvIGRldmljZSBub2RlIGhvbGRpbmcgcGhhbmRsZSBwcm9wZXJ0eQogICogQHBoYW5kbGVfbmFtZTogTmFtZSBvZiBwcm9wZXJ0eSBob2xkaW5nIGEgcGhhbmRsZSB2YWx1ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9ncGlvLmMgYi9kcml2ZXJzL29mL2dwaW8uYwppbmRleCA5MDU5NjAzLi4zMDA3NjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2dwaW8uYworKysgYi9kcml2ZXJzL29mL2dwaW8uYwpAQCAtMjEsOCArMjEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyoqCi0gKiBvZl9nZXRfZ3Bpb19mbGFncyAtIEdldCBhIEdQSU8gbnVtYmVyIGFuZCBmbGFncyB0byB1c2Ugd2l0aCBHUElPIEFQSQorICogb2ZfZ2V0X25hbWVkX2dwaW9fZmxhZ3MoKSAtIEdldCBhIEdQSU8gbnVtYmVyIGFuZCBmbGFncyB0byB1c2Ugd2l0aCBHUElPIEFQSQogICogQG5wOgkJZGV2aWNlIG5vZGUgdG8gZ2V0IEdQSU8gZnJvbQorICogQHByb3BuYW1lOglwcm9wZXJ0eSBuYW1lIGNvbnRhaW5pbmcgZ3BpbyBzcGVjaWZpZXIocykKICAqIEBpbmRleDoJaW5kZXggb2YgdGhlIEdQSU8KICAqIEBmbGFnczoJYSBmbGFncyBwb2ludGVyIHRvIGZpbGwgaW4KICAqCkBAIC0zMCw4ICszMSw4IEBACiAgKiB2YWx1ZSBvbiB0aGUgZXJyb3IgY29uZGl0aW9uLiBJZiBAZmxhZ3MgaXMgbm90IE5VTEwgdGhlIGZ1bmN0aW9uIGFsc28gZmlsbHMKICAqIGluIGZsYWdzIGZvciB0aGUgR1BJTy4KICAqLwotaW50IG9mX2dldF9ncGlvX2ZsYWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpbmRleCwKLQkJICAgICAgZW51bSBvZl9ncGlvX2ZsYWdzICpmbGFncykKK2ludCBvZl9nZXRfbmFtZWRfZ3Bpb19mbGFncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgZW51bSBvZl9ncGlvX2ZsYWdzICpmbGFncykKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZ3Bpb19ucDsKQEAgLTQwLDcgKzQxLDcgQEAKIAljb25zdCB2b2lkICpncGlvX3NwZWM7CiAJY29uc3QgX19iZTMyICpncGlvX2NlbGxzOwogCi0JcmV0ID0gb2ZfcGFyc2VfcGhhbmRsZXNfd2l0aF9hcmdzKG5wLCAiZ3Bpb3MiLCAiI2dwaW8tY2VsbHMiLCBpbmRleCwKKwlyZXQgPSBvZl9wYXJzZV9waGFuZGxlc193aXRoX2FyZ3MobnAsIHByb3BuYW1lLCAiI2dwaW8tY2VsbHMiLCBpbmRleCwKIAkJCQkJICAmZ3Bpb19ucCwgJmdwaW9fc3BlYyk7CiAJaWYgKHJldCkgewogCQlwcl9kZWJ1ZygiJXM6IGNhbid0IHBhcnNlIGdwaW9zIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CkBAIC03OSw3ICs4MCw3IEBACiAJcHJfZGVidWcoIiVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0wob2ZfZ2V0X2dwaW9fZmxhZ3MpOworRVhQT1JUX1NZTUJPTChvZl9nZXRfbmFtZWRfZ3Bpb19mbGFncyk7CiAKIC8qKgogICogb2ZfZ3Bpb19jb3VudCAtIENvdW50IEdQSU9zIGZvciBhIGRldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9vZl9wY2kuYyBiL2RyaXZlcnMvb2Yvb2ZfcGNpLmMKaW5kZXggYWMxZWM1NC4uMzcwMWI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9vZl9wY2kuYworKysgYi9kcml2ZXJzL29mL29mX3BjaS5jCkBAIC0xLDkyICsxLDQxIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCi0vKioKLSAqIG9mX2lycV9tYXBfcGNpIC0gUmVzb2x2ZSB0aGUgaW50ZXJydXB0IGZvciBhIFBDSSBkZXZpY2UKLSAqIEBwZGV2OiAgICAgICB0aGUgZGV2aWNlIHdob3NlIGludGVycnVwdCBpcyB0byBiZSByZXNvbHZlZAotICogQG91dF9pcnE6ICAgIHN0cnVjdHVyZSBvZl9pcnEgZmlsbGVkIGJ5IHRoaXMgZnVuY3Rpb24KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBQQ0kgaW50ZXJydXB0IGZvciBhIGdpdmVuIFBDSSBkZXZpY2UuIElmIGEKLSAqIGRldmljZS1ub2RlIGV4aXN0cyBmb3IgYSBnaXZlbiBwY2lfZGV2LCBpdCB3aWxsIHVzZSBub3JtYWwgT0YgdHJlZQotICogd2Fsa2luZy4gSWYgbm90LCBpdCB3aWxsIGltcGxlbWVudCBzdGFuZGFyZCBzd2l6emxpbmcgYW5kIHdhbGsgdXAgdGhlCi0gKiBQQ0kgdHJlZSB1bnRpbCBhbiBkZXZpY2Utbm9kZSBpcyBmb3VuZCwgYXQgd2hpY2ggcG9pbnQgaXQgd2lsbCBmaW5pc2gKLSAqIHJlc29sdmluZyB1c2luZyB0aGUgT0YgdHJlZSB3YWxraW5nLgotICovCi1pbnQgb2ZfaXJxX21hcF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCitzdGF0aWMgaW5saW5lIGludCBfX29mX3BjaV9wY2lfY29tcGFyZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBkZXZmbikKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCAqcHBub2RlOwotCXN0cnVjdCBwY2lfZGV2ICpwcGRldjsKLQl1MzIgbHNwZWM7Ci0JX19iZTMyIGxzcGVjX2JlOwotCV9fYmUzMiBsYWRkclszXTsKLQl1OCBwaW47Ci0JaW50IHJjOworCXVuc2lnbmVkIGludCBzaXplOworCWNvbnN0IF9fYmUzMiAqcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJyZWciLCAmc2l6ZSk7CiAKLQkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgZGV2aWNlIG5vZGUsIGlmIHllcywgZmFsbGJhY2sgdG8gc3RhbmRhcmQKLQkgKiBkZXZpY2UgdHJlZSBwYXJzaW5nCi0JICovCi0JZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7Ci0JaWYgKGRuKSB7Ci0JCXJjID0gb2ZfaXJxX21hcF9vbmUoZG4sIDAsIG91dF9pcnEpOwotCQlpZiAoIXJjKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIE9rLCB3ZSBkb24ndCwgdGltZSB0byBoYXZlIGZ1bi4gTGV0J3Mgc3RhcnQgYnkgYnVpbGRpbmcgdXAgYW4KLQkgKiBpbnRlcnJ1cHQgc3BlYy4gIHdlIGFzc3VtZSAjaW50ZXJydXB0LWNlbGxzIGlzIDEsIHdoaWNoIGlzIHN0YW5kYXJkCi0JICogZm9yIFBDSS4gSWYgeW91IGRvIGRpZmZlcmVudCwgdGhlbiBkb24ndCB1c2UgdGhhdCByb3V0aW5lLgotCSAqLwotCXJjID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOwotCWlmIChyYyAhPSAwKQotCQlyZXR1cm4gcmM7Ci0JLyogTm8gcGluLCBleGl0ICovCi0JaWYgKHBpbiA9PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIE5vdyB3ZSB3YWxrIHVwIHRoZSBQQ0kgdHJlZSAqLwotCWxzcGVjID0gcGluOwotCWZvciAoOzspIHsKLQkJLyogR2V0IHRoZSBwY2lfZGV2IG9mIG91ciBwYXJlbnQgKi8KLQkJcHBkZXYgPSBwZGV2LT5idXMtPnNlbGY7Ci0KLQkJLyogT3VjaCwgaXQncyBhIGhvc3QgYnJpZGdlLi4uICovCi0JCWlmIChwcGRldiA9PSBOVUxMKSB7Ci0JCQlwcG5vZGUgPSBwY2lfYnVzX3RvX09GX25vZGUocGRldi0+YnVzKTsKLQotCQkJLyogTm8gbm9kZSBmb3IgaG9zdCBicmlkZ2UgPyBnaXZlIHVwICovCi0JCQlpZiAocHBub2RlID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBXZSBmb3VuZCBhIFAyUCBicmlkZ2UsIGNoZWNrIGlmIGl0IGhhcyBhIG5vZGUgKi8KLQkJCXBwbm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwcGRldik7Ci0JCX0KLQotCQkvKiBPaywgd2UgaGF2ZSBmb3VuZCBhIHBhcmVudCB3aXRoIGEgZGV2aWNlLW5vZGUsIGhhbmQgb3ZlciB0bwotCQkgKiB0aGUgT0YgcGFyc2luZyBjb2RlLgotCQkgKiBXZSBidWlsZCBhIHVuaXQgYWRkcmVzcyBmcm9tIHRoZSBsaW51eCBkZXZpY2UgdG8gYmUgdXNlZCBmb3IKLQkJICogcmVzb2x1dGlvbi4gTm90ZSB0aGF0IHdlIHVzZSB0aGUgbGludXggYnVzIG51bWJlciB3aGljaCBtYXkKLQkJICogbm90IG1hdGNoIHlvdXIgZmlybXdhcmUgYnVzIG51bWJlcmluZy4KLQkJICogRm9ydHVuYXRlbHksIGluIG1vc3QgY2FzZXMsIGludGVycnVwdC1tYXAtbWFzayBkb2Vzbid0Ci0JCSAqIGluY2x1ZGUgdGhlIGJ1cyBudW1iZXIgYXMgcGFydCBvZiB0aGUgbWF0Y2hpbmcuCi0JCSAqIFlvdSBzaG91bGQgc3RpbGwgYmUgY2FyZWZ1bCBhYm91dCB0aGF0IHRob3VnaCBpZiB5b3UgaW50ZW5kCi0JCSAqIHRvIHJlbHkgb24gdGhpcyBmdW5jdGlvbiAoeW91IHNoaXAgIGEgZmlybXdhcmUgdGhhdCBkb2Vzbid0Ci0JCSAqIGNyZWF0ZSBkZXZpY2Ugbm9kZXMgZm9yIGFsbCBQQ0kgZGV2aWNlcykuCi0JCSAqLwotCQlpZiAocHBub2RlKQotCQkJYnJlYWs7Ci0KLQkJLyogV2UgY2FuIG9ubHkgZ2V0IGhlcmUgaWYgd2UgaGl0IGEgUDJQIGJyaWRnZSB3aXRoIG5vIG5vZGUsCi0JCSAqIGxldCdzIGRvIHN0YW5kYXJkIHN3aXp6bGluZyBhbmQgdHJ5IGFnYWluCi0JCSAqLwotCQlsc3BlYyA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4ocGRldiwgbHNwZWMpOwotCQlwZGV2ID0gcHBkZXY7Ci0JfQotCi0JbHNwZWNfYmUgPSBjcHVfdG9fYmUzMihsc3BlYyk7Ci0JbGFkZHJbMF0gPSBjcHVfdG9fYmUzMigocGRldi0+YnVzLT5udW1iZXIgPDwgMTYpIHwgKHBkZXYtPmRldmZuIDw8IDgpKTsKLQlsYWRkclsxXSAgPSBsYWRkclsyXSA9IGNwdV90b19iZTMyKDApOwotCXJldHVybiBvZl9pcnFfbWFwX3JhdyhwcG5vZGUsICZsc3BlY19iZSwgMSwgbGFkZHIsIG91dF9pcnEpOworCWlmICghcmVnIHx8IHNpemUgPCA1ICogc2l6ZW9mKF9fYmUzMikpCisJCXJldHVybiAwOworCXJldHVybiAoKGJlMzJfdG9fY3B1cCgmcmVnWzBdKSA+PiA4KSAmIDB4ZmYpID09IGRldmZuOwogfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfaXJxX21hcF9wY2kpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX3BjaV9maW5kX2NoaWxkX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZGV2Zm4pCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlLCAqbm9kZTI7CisKKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHBhcmVudCwgbm9kZSkgeworCQlpZiAoX19vZl9wY2lfcGNpX2NvbXBhcmUobm9kZSwgZGV2Zm4pKQorCQkJcmV0dXJuIG5vZGU7CisJCS8qCisJCSAqIFNvbWUgT0ZzIGNyZWF0ZSBhIHBhcmVudCBub2RlICJtdWx0aWZ1bmMtZGV2aWNlIiBhcworCQkgKiBhIGZha2Ugcm9vdCBmb3IgYWxsIGZ1bmN0aW9ucyBvZiBhIG11bHRpLWZ1bmN0aW9uCisJCSAqIGRldmljZSB3ZSBnbyBkb3duIHRoZW0gYXMgd2VsbC4KKwkJICovCisJCWlmICghc3RyY21wKG5vZGUtPm5hbWUsICJtdWx0aWZ1bmMtZGV2aWNlIikpIHsKKwkJCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobm9kZSwgbm9kZTIpIHsKKwkJCQlpZiAoX19vZl9wY2lfcGNpX2NvbXBhcmUobm9kZTIsIGRldmZuKSkgeworCQkJCQlvZl9ub2RlX3B1dChub2RlKTsKKwkJCQkJcmV0dXJuIG5vZGUyOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX3BjaV9maW5kX2NoaWxkX2RldmljZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX3BjaV9pcnEuYyBiL2RyaXZlcnMvb2Yvb2ZfcGNpX2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMWVjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL29mL29mX3BjaV9pcnEuYwpAQCAtMCwwICsxLDkyIEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGNpLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworLyoqCisgKiBvZl9pcnFfbWFwX3BjaSAtIFJlc29sdmUgdGhlIGludGVycnVwdCBmb3IgYSBQQ0kgZGV2aWNlCisgKiBAcGRldjogICAgICAgdGhlIGRldmljZSB3aG9zZSBpbnRlcnJ1cHQgaXMgdG8gYmUgcmVzb2x2ZWQKKyAqIEBvdXRfaXJxOiAgICBzdHJ1Y3R1cmUgb2ZfaXJxIGZpbGxlZCBieSB0aGlzIGZ1bmN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXNvbHZlcyB0aGUgUENJIGludGVycnVwdCBmb3IgYSBnaXZlbiBQQ0kgZGV2aWNlLiBJZiBhCisgKiBkZXZpY2Utbm9kZSBleGlzdHMgZm9yIGEgZ2l2ZW4gcGNpX2RldiwgaXQgd2lsbCB1c2Ugbm9ybWFsIE9GIHRyZWUKKyAqIHdhbGtpbmcuIElmIG5vdCwgaXQgd2lsbCBpbXBsZW1lbnQgc3RhbmRhcmQgc3dpenpsaW5nIGFuZCB3YWxrIHVwIHRoZQorICogUENJIHRyZWUgdW50aWwgYW4gZGV2aWNlLW5vZGUgaXMgZm91bmQsIGF0IHdoaWNoIHBvaW50IGl0IHdpbGwgZmluaXNoCisgKiByZXNvbHZpbmcgdXNpbmcgdGhlIE9GIHRyZWUgd2Fsa2luZy4KKyAqLworaW50IG9mX2lycV9tYXBfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgb2ZfaXJxICpvdXRfaXJxKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sICpwcG5vZGU7CisJc3RydWN0IHBjaV9kZXYgKnBwZGV2OworCXUzMiBsc3BlYzsKKwlfX2JlMzIgbHNwZWNfYmU7CisJX19iZTMyIGxhZGRyWzNdOworCXU4IHBpbjsKKwlpbnQgcmM7CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgZGV2aWNlIG5vZGUsIGlmIHllcywgZmFsbGJhY2sgdG8gc3RhbmRhcmQKKwkgKiBkZXZpY2UgdHJlZSBwYXJzaW5nCisJICovCisJZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CisJaWYgKGRuKSB7CisJCXJjID0gb2ZfaXJxX21hcF9vbmUoZG4sIDAsIG91dF9pcnEpOworCQlpZiAoIXJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCS8qIE9rLCB3ZSBkb24ndCwgdGltZSB0byBoYXZlIGZ1bi4gTGV0J3Mgc3RhcnQgYnkgYnVpbGRpbmcgdXAgYW4KKwkgKiBpbnRlcnJ1cHQgc3BlYy4gIHdlIGFzc3VtZSAjaW50ZXJydXB0LWNlbGxzIGlzIDEsIHdoaWNoIGlzIHN0YW5kYXJkCisJICogZm9yIFBDSS4gSWYgeW91IGRvIGRpZmZlcmVudCwgdGhlbiBkb24ndCB1c2UgdGhhdCByb3V0aW5lLgorCSAqLworCXJjID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOworCWlmIChyYyAhPSAwKQorCQlyZXR1cm4gcmM7CisJLyogTm8gcGluLCBleGl0ICovCisJaWYgKHBpbiA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIE5vdyB3ZSB3YWxrIHVwIHRoZSBQQ0kgdHJlZSAqLworCWxzcGVjID0gcGluOworCWZvciAoOzspIHsKKwkJLyogR2V0IHRoZSBwY2lfZGV2IG9mIG91ciBwYXJlbnQgKi8KKwkJcHBkZXYgPSBwZGV2LT5idXMtPnNlbGY7CisKKwkJLyogT3VjaCwgaXQncyBhIGhvc3QgYnJpZGdlLi4uICovCisJCWlmIChwcGRldiA9PSBOVUxMKSB7CisJCQlwcG5vZGUgPSBwY2lfYnVzX3RvX09GX25vZGUocGRldi0+YnVzKTsKKworCQkJLyogTm8gbm9kZSBmb3IgaG9zdCBicmlkZ2UgPyBnaXZlIHVwICovCisJCQlpZiAocHBub2RlID09IE5VTEwpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQkvKiBXZSBmb3VuZCBhIFAyUCBicmlkZ2UsIGNoZWNrIGlmIGl0IGhhcyBhIG5vZGUgKi8KKwkJCXBwbm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwcGRldik7CisJCX0KKworCQkvKiBPaywgd2UgaGF2ZSBmb3VuZCBhIHBhcmVudCB3aXRoIGEgZGV2aWNlLW5vZGUsIGhhbmQgb3ZlciB0bworCQkgKiB0aGUgT0YgcGFyc2luZyBjb2RlLgorCQkgKiBXZSBidWlsZCBhIHVuaXQgYWRkcmVzcyBmcm9tIHRoZSBsaW51eCBkZXZpY2UgdG8gYmUgdXNlZCBmb3IKKwkJICogcmVzb2x1dGlvbi4gTm90ZSB0aGF0IHdlIHVzZSB0aGUgbGludXggYnVzIG51bWJlciB3aGljaCBtYXkKKwkJICogbm90IG1hdGNoIHlvdXIgZmlybXdhcmUgYnVzIG51bWJlcmluZy4KKwkJICogRm9ydHVuYXRlbHksIGluIG1vc3QgY2FzZXMsIGludGVycnVwdC1tYXAtbWFzayBkb2Vzbid0CisJCSAqIGluY2x1ZGUgdGhlIGJ1cyBudW1iZXIgYXMgcGFydCBvZiB0aGUgbWF0Y2hpbmcuCisJCSAqIFlvdSBzaG91bGQgc3RpbGwgYmUgY2FyZWZ1bCBhYm91dCB0aGF0IHRob3VnaCBpZiB5b3UgaW50ZW5kCisJCSAqIHRvIHJlbHkgb24gdGhpcyBmdW5jdGlvbiAoeW91IHNoaXAgIGEgZmlybXdhcmUgdGhhdCBkb2Vzbid0CisJCSAqIGNyZWF0ZSBkZXZpY2Ugbm9kZXMgZm9yIGFsbCBQQ0kgZGV2aWNlcykuCisJCSAqLworCQlpZiAocHBub2RlKQorCQkJYnJlYWs7CisKKwkJLyogV2UgY2FuIG9ubHkgZ2V0IGhlcmUgaWYgd2UgaGl0IGEgUDJQIGJyaWRnZSB3aXRoIG5vIG5vZGUsCisJCSAqIGxldCdzIGRvIHN0YW5kYXJkIHN3aXp6bGluZyBhbmQgdHJ5IGFnYWluCisJCSAqLworCQlsc3BlYyA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4ocGRldiwgbHNwZWMpOworCQlwZGV2ID0gcHBkZXY7CisJfQorCisJbHNwZWNfYmUgPSBjcHVfdG9fYmUzMihsc3BlYyk7CisJbGFkZHJbMF0gPSBjcHVfdG9fYmUzMigocGRldi0+YnVzLT5udW1iZXIgPDwgMTYpIHwgKHBkZXYtPmRldmZuIDw8IDgpKTsKKwlsYWRkclsxXSAgPSBsYWRkclsyXSA9IGNwdV90b19iZTMyKDApOworCXJldHVybiBvZl9pcnFfbWFwX3JhdyhwcG5vZGUsICZsc3BlY19iZSwgMSwgbGFkZHIsIG91dF9pcnEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfaXJxX21hcF9wY2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9wbGF0Zm9ybS5jIGIvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCmluZGV4IDYzZDNjYjcuLmVkNWE2ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL29mL3BsYXRmb3JtLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTIyLDYgKzIzLDE0IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAorY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9kZWZhdWx0X2J1c19tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCisjaWZkZWYgQ09ORklHX0FSTV9BTUJBCisJeyAuY29tcGF0aWJsZSA9ICJhcm0sYW1iYS1idXMiLCB9LAorI2VuZGlmIC8qIENPTkZJR19BUk1fQU1CQSAqLworCXt9IC8qIEVtcHR5IHRlcm1pbmF0ZWQgbGlzdCAqLworfTsKKwogc3RhdGljIGludCBvZl9kZXZfbm9kZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJuIGRldi0+b2Zfbm9kZSA9PSBkYXRhOwpAQCAtMTUzLDcgKzE2Miw3IEBACiAJfQogCiAJZGV2LT5kZXYub2Zfbm9kZSA9IG9mX25vZGVfZ2V0KG5wKTsKLSNpZiBkZWZpbmVkKENPTkZJR19QUEMpIHx8IGRlZmluZWQoQ09ORklHX01JQ1JPQkxBWkUpCisjaWYgZGVmaW5lZChDT05GSUdfTUlDUk9CTEFaRSkKIAlkZXYtPmRldi5kbWFfbWFzayA9ICZkZXYtPmFyY2hkYXRhLmRtYV9tYXNrOwogI2VuZGlmCiAJZGV2LT5kZXYucGFyZW50ID0gcGFyZW50OwpAQCAtMTY4LDE3ICsxNzcsMjAgQEAKIEVYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX2FsbG9jKTsKIAogLyoqCi0gKiBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlIC0gQWxsb2MsIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIGFuIG9mX2RldmljZQorICogb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZV9wZGF0YSAtIEFsbG9jLCBpbml0aWFsaXplIGFuZCByZWdpc3RlciBhbiBvZl9kZXZpY2UKICAqIEBucDogcG9pbnRlciB0byBub2RlIHRvIGNyZWF0ZSBkZXZpY2UgZm9yCiAgKiBAYnVzX2lkOiBuYW1lIHRvIGFzc2lnbiBkZXZpY2UKKyAqIEBwbGF0Zm9ybV9kYXRhOiBwb2ludGVyIHRvIHBvcHVsYXRlIHBsYXRmb3JtX2RhdGEgcG9pbnRlciB3aXRoCiAgKiBAcGFyZW50OiBMaW51eCBkZXZpY2UgbW9kZWwgcGFyZW50IGRldmljZS4KICAqCiAgKiBSZXR1cm5zIHBvaW50ZXIgdG8gY3JlYXRlZCBwbGF0Zm9ybSBkZXZpY2UsIG9yIE5VTEwgaWYgYSBkZXZpY2Ugd2FzIG5vdAogICogcmVnaXN0ZXJlZC4gIFVuYXZhaWxhYmxlIGRldmljZXMgd2lsbCBub3QgZ2V0IHJlZ2lzdGVyZWQuCiAgKi8KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1c19pZCwKLQkJCQkJICAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGVfcGRhdGEoCisJCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCWNvbnN0IGNoYXIgKmJ1c19pZCwKKwkJCQkJdm9pZCAqcGxhdGZvcm1fZGF0YSwKKwkJCQkJc3RydWN0IGRldmljZSAqcGFyZW50KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKIApAQCAtMTg5LDExICsyMDEsMTIgQEAKIAlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QUEMpIHx8IGRlZmluZWQoQ09ORklHX01JQ1JPQkxBWkUpCisjaWYgZGVmaW5lZChDT05GSUdfTUlDUk9CTEFaRSkKIAlkZXYtPmFyY2hkYXRhLmRtYV9tYXNrID0gMHhmZmZmZmZmZlVMOwogI2VuZGlmCiAJZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwogCWRldi0+ZGV2LmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZTsKKwlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGxhdGZvcm1fZGF0YTsKIAogCS8qIFdlIGRvIG5vdCBmaWxsIHRoZSBETUEgb3BzIGZvciBwbGF0Zm9ybSBkZXZpY2VzIGJ5IGRlZmF1bHQuCiAJICogVGhpcyBpcyBjdXJyZW50bHkgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBwbGF0Zm9ybSBjb2RlCkBAIC0yMDcsOCArMjIwLDExMSBAQAogCiAJcmV0dXJuIGRldjsKIH0KKworLyoqCisgKiBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlIC0gQWxsb2MsIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIGFuIG9mX2RldmljZQorICogQG5wOiBwb2ludGVyIHRvIG5vZGUgdG8gY3JlYXRlIGRldmljZSBmb3IKKyAqIEBidXNfaWQ6IG5hbWUgdG8gYXNzaWduIGRldmljZQorICogQHBhcmVudDogTGludXggZGV2aWNlIG1vZGVsIHBhcmVudCBkZXZpY2UuCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvIGNyZWF0ZWQgcGxhdGZvcm0gZGV2aWNlLCBvciBOVUxMIGlmIGEgZGV2aWNlIHdhcyBub3QKKyAqIHJlZ2lzdGVyZWQuICBVbmF2YWlsYWJsZSBkZXZpY2VzIHdpbGwgbm90IGdldCByZWdpc3RlcmVkLgorICovCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCSAgICBjb25zdCBjaGFyICpidXNfaWQsCisJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJcmV0dXJuIG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGVfcGRhdGEobnAsIGJ1c19pZCwgTlVMTCwgcGFyZW50KTsKK30KIEVYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZSk7CiAKKyNpZmRlZiBDT05GSUdfQVJNX0FNQkEKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgKm9mX2FtYmFfZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJCQkgY29uc3QgY2hhciAqYnVzX2lkLAorCQkJCQkJIHZvaWQgKnBsYXRmb3JtX2RhdGEsCisJCQkJCQkgc3RydWN0IGRldmljZSAqcGFyZW50KQoreworCXN0cnVjdCBhbWJhX2RldmljZSAqZGV2OworCWNvbnN0IHZvaWQgKnByb3A7CisJaW50IGksIHJldDsKKworCXByX2RlYnVnKCJDcmVhdGluZyBhbWJhIGRldmljZSAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKworCWlmICghb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShub2RlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJLyogc2V0dXAgZ2VuZXJpYyBkZXZpY2UgaW5mbyAqLworCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gfjA7CisJZGV2LT5kZXYub2Zfbm9kZSA9IG9mX25vZGVfZ2V0KG5vZGUpOworCWRldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKKwlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGxhdGZvcm1fZGF0YTsKKwlpZiAoYnVzX2lkKQorCQlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAiJXMiLCBidXNfaWQpOworCWVsc2UKKwkJb2ZfZGV2aWNlX21ha2VfYnVzX2lkKCZkZXYtPmRldik7CisKKwkvKiBzZXR1cCBhbWJhLXNwZWNpZmljIGRldmljZSBpbmZvICovCisJZGV2LT5kbWFfbWFzayA9IH4wOworCisJLyogQWxsb3cgdGhlIEhXIFBlcmlwaGVyYWwgSUQgdG8gYmUgb3ZlcnJpZGRlbiAqLworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImFybSxwcmltZWNlbGwtcGVyaXBoaWQiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJZGV2LT5wZXJpcGhpZCA9IG9mX3JlYWRfdWxvbmcocHJvcCwgMSk7CisKKwkvKiBEZWNvZGUgdGhlIElSUXMgYW5kIGFkZHJlc3MgcmFuZ2VzICovCisJZm9yIChpID0gMDsgaSA8IEFNQkFfTlJfSVJRUzsgaSsrKQorCQlkZXYtPmlycVtpXSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIGkpOworCisJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmZGV2LT5yZXMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwlyZXQgPSBhbWJhX2RldmljZV9yZWdpc3RlcihkZXYsICZpb21lbV9yZXNvdXJjZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZTsKKworCXJldHVybiBkZXY7CisKK2Vycl9mcmVlOgorCWtmcmVlKGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisjZWxzZSAvKiBDT05GSUdfQVJNX0FNQkEgKi8KK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgKm9mX2FtYmFfZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJCQkgY29uc3QgY2hhciAqYnVzX2lkLAorCQkJCQkJIHZvaWQgKnBsYXRmb3JtX2RhdGEsCisJCQkJCQkgc3RydWN0IGRldmljZSAqcGFyZW50KQoreworCXJldHVybiBOVUxMOworfQorI2VuZGlmIC8qIENPTkZJR19BUk1fQU1CQSAqLworCisvKioKKyAqIG9mX2Rldm5hbWVfbG9va3VwKCkgLSBHaXZlbiBhIGRldmljZSBub2RlLCBsb29rdXAgdGhlIHByZWZlcnJlZCBMaW51eCBuYW1lCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2X2F1eGRhdGEgKm9mX2Rldl9sb29rdXAoY29uc3Qgc3RydWN0IG9mX2Rldl9hdXhkYXRhICpsb29rdXAsCisJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpZiAobG9va3VwKSB7CisJCWZvcig7IGxvb2t1cC0+bmFtZSAhPSBOVUxMOyBsb29rdXArKykgeworCQkJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgbG9va3VwLT5jb21wYXRpYmxlKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChyZXMuc3RhcnQgIT0gbG9va3VwLT5waHlzX2FkZHIpCisJCQkJY29udGludWU7CisJCQlwcl9kZWJ1ZygiJXM6IGRldm5hbWU9JXNcbiIsIG5wLT5mdWxsX25hbWUsIGxvb2t1cC0+bmFtZSk7CisJCQlyZXR1cm4gbG9va3VwOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCiAvKioKICAqIG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoKSAtIENyZWF0ZSBhIGRldmljZSBmb3IgYSBub2RlIGFuZCBpdHMgY2hpbGRyZW4uCiAgKiBAYnVzOiBkZXZpY2Ugbm9kZSBvZiB0aGUgYnVzIHRvIGluc3RhbnRpYXRlCkBAIC0yMjEsMTkgKzMzNyw0MSBAQAogICovCiBzdGF0aWMgaW50IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoc3RydWN0IGRldmljZV9ub2RlICpidXMsCiAJCQkJICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLAotCQkJCSAgc3RydWN0IGRldmljZSAqcGFyZW50KQorCQkJCSAgY29uc3Qgc3RydWN0IG9mX2Rldl9hdXhkYXRhICpsb29rdXAsCisJCQkJICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGJvb2wgc3RyaWN0KQogeworCWNvbnN0IHN0cnVjdCBvZl9kZXZfYXV4ZGF0YSAqYXV4ZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKKwljb25zdCBjaGFyICpidXNfaWQgPSBOVUxMOworCXZvaWQgKnBsYXRmb3JtX2RhdGEgPSBOVUxMOwogCWludCByYyA9IDA7CiAKLQlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKGJ1cywgTlVMTCwgcGFyZW50KTsKKwkvKiBNYWtlIHN1cmUgaXQgaGFzIGEgY29tcGF0aWJsZSBwcm9wZXJ0eSAqLworCWlmIChzdHJpY3QgJiYgKCFvZl9nZXRfcHJvcGVydHkoYnVzLCAiY29tcGF0aWJsZSIsIE5VTEwpKSkgeworCQlwcl9kZWJ1ZygiJXMoKSAtIHNraXBwaW5nICVzLCBubyBjb21wYXRpYmxlIHByb3BcbiIsCisJCQkgX19mdW5jX18sIGJ1cy0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYXV4ZGF0YSA9IG9mX2Rldl9sb29rdXAobG9va3VwLCBidXMpOworCWlmIChhdXhkYXRhKSB7CisJCWJ1c19pZCA9IGF1eGRhdGEtPm5hbWU7CisJCXBsYXRmb3JtX2RhdGEgPSBhdXhkYXRhLT5wbGF0Zm9ybV9kYXRhOworCX0KKworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShidXMsICJhcm0scHJpbWVjZWxsIikpIHsKKwkJb2ZfYW1iYV9kZXZpY2VfY3JlYXRlKGJ1cywgYnVzX2lkLCBwbGF0Zm9ybV9kYXRhLCBwYXJlbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlX3BkYXRhKGJ1cywgYnVzX2lkLCBwbGF0Zm9ybV9kYXRhLCBwYXJlbnQpOwogCWlmICghZGV2IHx8ICFvZl9tYXRjaF9ub2RlKG1hdGNoZXMsIGJ1cykpCiAJCXJldHVybiAwOwogCiAJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShidXMsIGNoaWxkKSB7CiAJCXByX2RlYnVnKCIgICBjcmVhdGUgY2hpbGQ6ICVzXG4iLCBjaGlsZC0+ZnVsbF9uYW1lKTsKLQkJcmMgPSBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlKGNoaWxkLCBtYXRjaGVzLCAmZGV2LT5kZXYpOworCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY2hpbGQsIG1hdGNoZXMsIGxvb2t1cCwgJmRldi0+ZGV2LCBzdHJpY3QpOwogCQlpZiAocmMpIHsKIAkJCW9mX25vZGVfcHV0KGNoaWxkKTsKIAkJCWJyZWFrOwpAQCAtMjY3LDExICs0MDUsMTEgQEAKIAogCS8qIERvIGEgc2VsZiBjaGVjayBvZiBidXMgdHlwZSwgaWYgdGhlcmUncyBhIG1hdGNoLCBjcmVhdGUgY2hpbGRyZW4gKi8KIAlpZiAob2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCByb290KSkgewotCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUocm9vdCwgbWF0Y2hlcywgcGFyZW50KTsKKwkJcmMgPSBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlKHJvb3QsIG1hdGNoZXMsIE5VTEwsIHBhcmVudCwgZmFsc2UpOwogCX0gZWxzZSBmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHJvb3QsIGNoaWxkKSB7CiAJCWlmICghb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCBjaGlsZCkpCiAJCQljb250aW51ZTsKLQkJcmMgPSBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlKGNoaWxkLCBtYXRjaGVzLCBwYXJlbnQpOworCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY2hpbGQsIG1hdGNoZXMsIE5VTEwsIHBhcmVudCwgZmFsc2UpOwogCQlpZiAocmMpCiAJCQlicmVhazsKIAl9CkBAIC0yODAsNCArNDE4LDQ0IEBACiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChvZl9wbGF0Zm9ybV9idXNfcHJvYmUpOworCisvKioKKyAqIG9mX3BsYXRmb3JtX3BvcHVsYXRlKCkgLSBQb3B1bGF0ZSBwbGF0Zm9ybV9kZXZpY2VzIGZyb20gZGV2aWNlIHRyZWUgZGF0YQorICogQHJvb3Q6IHBhcmVudCBvZiB0aGUgZmlyc3QgbGV2ZWwgdG8gcHJvYmUgb3IgTlVMTCBmb3IgdGhlIHJvb3Qgb2YgdGhlIHRyZWUKKyAqIEBtYXRjaGVzOiBtYXRjaCB0YWJsZSwgTlVMTCB0byB1c2UgdGhlIGRlZmF1bHQKKyAqIEBwYXJlbnQ6IHBhcmVudCB0byBob29rIGRldmljZXMgZnJvbSwgTlVMTCBmb3IgdG9wbGV2ZWwKKyAqCisgKiBTaW1pbGFyIHRvIG9mX3BsYXRmb3JtX2J1c19wcm9iZSgpLCB0aGlzIGZ1bmN0aW9uIHdhbGtzIHRoZSBkZXZpY2UgdHJlZQorICogYW5kIGNyZWF0ZXMgZGV2aWNlcyBmcm9tIG5vZGVzLiAgSXQgZGlmZmVycyBpbiB0aGF0IGl0IGZvbGxvd3MgdGhlIG1vZGVybgorICogY29udmVudGlvbiBvZiByZXF1aXJpbmcgYWxsIGRldmljZSBub2RlcyB0byBoYXZlIGEgJ2NvbXBhdGlibGUnIHByb3BlcnR5LAorICogYW5kIGl0IGlzIHN1aXRhYmxlIGZvciBjcmVhdGluZyBkZXZpY2VzIHdoaWNoIGFyZSBjaGlsZHJlbiBvZiB0aGUgcm9vdAorICogbm9kZSAob2ZfcGxhdGZvcm1fYnVzX3Byb2JlIHdpbGwgb25seSBjcmVhdGUgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgd2hpY2gKKyAqIGFyZSBzZWxlY3RlZCBieSB0aGUgQG1hdGNoZXMgYXJndW1lbnQpLgorICoKKyAqIE5ldyBib2FyZCBzdXBwb3J0IHNob3VsZCBiZSB1c2luZyB0aGlzIGZ1bmN0aW9uIGluc3RlYWQgb2YKKyAqIG9mX3BsYXRmb3JtX2J1c19wcm9iZSgpLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCA8IDAgb24gZmFpbHVyZS4KKyAqLworaW50IG9mX3BsYXRmb3JtX3BvcHVsYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCwKKwkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCisJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2X2F1eGRhdGEgKmxvb2t1cCwKKwkJCXN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOworCWludCByYyA9IDA7CisKKwlyb290ID0gcm9vdCA/IG9mX25vZGVfZ2V0KHJvb3QpIDogb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKKwlpZiAoIXJvb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShyb290LCBjaGlsZCkgeworCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY2hpbGQsIG1hdGNoZXMsIGxvb2t1cCwgcGFyZW50LCB0cnVlKTsKKwkJaWYgKHJjKQorCQkJYnJlYWs7CisJfQorCisJb2Zfbm9kZV9wdXQocm9vdCk7CisJcmV0dXJuIHJjOworfQogI2VuZGlmIC8qICFDT05GSUdfU1BBUkMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYwppbmRleCBhMzk4NGY0Li5mMzRiNWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCkBAIC0xNDEsNiArMTQxLDEzIEBACiAJLm5vdGlmaWVyX2NhbGwgPSBtb2R1bGVfbG9hZF9ub3RpZnksCiB9OwogCitzdGF0aWMgdm9pZCBmcmVlX2FsbF90YXNrcyh2b2lkKQoreworCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBsZWFrIHRhc2sgc3RydWN0cyAqLworCXByb2Nlc3NfdGFza19tb3J0dWFyeSgpOworCXByb2Nlc3NfdGFza19tb3J0dWFyeSgpOworfQorCiBpbnQgc3luY19zdGFydCh2b2lkKQogewogCWludCBlcnI7CkBAIC0xNDgsOCArMTU1LDYgQEAKIAlpZiAoIXphbGxvY19jcHVtYXNrX3ZhcigmbWFya2VkX2NwdXMsIEdGUF9LRVJORUwpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW11dGV4X2xvY2soJmJ1ZmZlcl9tdXRleCk7Ci0KIAllcnIgPSB0YXNrX2hhbmRvZmZfcmVnaXN0ZXIoJnRhc2tfZnJlZV9uYik7CiAJaWYgKGVycikKIAkJZ290byBvdXQxOwpAQCAtMTY2LDcgKzE3MSw2IEBACiAJc3RhcnRfY3B1X3dvcmsoKTsKIAogb3V0OgotCW11dGV4X3VubG9jaygmYnVmZmVyX211dGV4KTsKIAlyZXR1cm4gZXJyOwogb3V0NDoKIAlwcm9maWxlX2V2ZW50X3VucmVnaXN0ZXIoUFJPRklMRV9NVU5NQVAsICZtdW5tYXBfbmIpOwpAQCAtMTc0LDYgKzE3OCw3IEBACiAJcHJvZmlsZV9ldmVudF91bnJlZ2lzdGVyKFBST0ZJTEVfVEFTS19FWElULCAmdGFza19leGl0X25iKTsKIG91dDI6CiAJdGFza19oYW5kb2ZmX3VucmVnaXN0ZXIoJnRhc2tfZnJlZV9uYik7CisJZnJlZV9hbGxfdGFza3MoKTsKIG91dDE6CiAJZnJlZV9jcHVtYXNrX3ZhcihtYXJrZWRfY3B1cyk7CiAJZ290byBvdXQ7CkBAIC0xODIsMjAgKzE4NywxNiBAQAogCiB2b2lkIHN5bmNfc3RvcCh2b2lkKQogewotCS8qIGZsdXNoIGJ1ZmZlcnMgKi8KLQltdXRleF9sb2NrKCZidWZmZXJfbXV0ZXgpOwogCWVuZF9jcHVfd29yaygpOwogCXVucmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKCZtb2R1bGVfbG9hZF9uYik7CiAJcHJvZmlsZV9ldmVudF91bnJlZ2lzdGVyKFBST0ZJTEVfTVVOTUFQLCAmbXVubWFwX25iKTsKIAlwcm9maWxlX2V2ZW50X3VucmVnaXN0ZXIoUFJPRklMRV9UQVNLX0VYSVQsICZ0YXNrX2V4aXRfbmIpOwogCXRhc2tfaGFuZG9mZl91bnJlZ2lzdGVyKCZ0YXNrX2ZyZWVfbmIpOwotCW11dGV4X3VubG9jaygmYnVmZmVyX211dGV4KTsKKwliYXJyaWVyKCk7CQkJLyogZG8gYWxsIG9mIHRoZSBhYm92ZSBmaXJzdCAqLworCiAJZmx1c2hfY3B1X3dvcmsoKTsKIAotCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBsZWFrIHRhc2sgc3RydWN0cyAqLwotCXByb2Nlc3NfdGFza19tb3J0dWFyeSgpOwotCXByb2Nlc3NfdGFza19tb3J0dWFyeSgpOwotCisJZnJlZV9hbGxfdGFza3MoKTsKIAlmcmVlX2NwdW1hc2tfdmFyKG1hcmtlZF9jcHVzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZV9wZXJmLmMgYi9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlX3BlcmYuYwppbmRleCA5MDQ2ZjdiLi45NDc5NmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlX3BlcmYuYworKysgYi9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlX3BlcmYuYwpAQCAtMzEsNyArMzEsNyBAQAogLyoKICAqIE92ZXJmbG93IGNhbGxiYWNrIGZvciBvcHJvZmlsZS4KICAqLwotc3RhdGljIHZvaWQgb3Bfb3ZlcmZsb3dfaGFuZGxlcihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCB1bnVzZWQsCitzdGF0aWMgdm9pZCBvcF9vdmVyZmxvd19oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKIAkJCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaWQ7CkBAIC03OSw3ICs3OSw3IEBACiAKIAlwZXZlbnQgPSBwZXJmX2V2ZW50X2NyZWF0ZV9rZXJuZWxfY291bnRlcigmY291bnRlcl9jb25maWdbZXZlbnRdLmF0dHIsCiAJCQkJCQkgIGNwdSwgTlVMTCwKLQkJCQkJCSAgb3Bfb3ZlcmZsb3dfaGFuZGxlcik7CisJCQkJCQkgIG9wX292ZXJmbG93X2hhbmRsZXIsIE5VTEwpOwogCiAJaWYgKElTX0VSUihwZXZlbnQpKQogCQlyZXR1cm4gUFRSX0VSUihwZXZlbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfYXg4ODc5Ni5jIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfYXg4ODc5Ni5jCmluZGV4IDJjNWFjMmIuLjg0NGY2MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2F4ODg3OTYuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9heDg4Nzk2LmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogCQlnb3RvIGV4aXRfbWVtOwogCX0KIAotCXNpemUgPSAocmVzLT5lbmQgLSByZXMtPnN0YXJ0KSArIDE7CisJc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAlzcGFjaW5nID0gc2l6ZSAvIDM7CiAKIAlkZC0+aW8gPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgc2l6ZSwgcGRldi0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IGM4NWY3NDQuLjZmYWRhZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCkBAIC0yOSwxMSArMjksNiBAQAogIyBCdWlsZCB0aGUgSHlwZXJ0cmFuc3BvcnQgaW50ZXJydXB0IHN1cHBvcnQKIG9iai0kKENPTkZJR19IVF9JUlEpICs9IGh0aXJxLm8KIAotIyBCdWlsZCBJbnRlbCBJT01NVSBzdXBwb3J0Ci1vYmotJChDT05GSUdfRE1BUikgKz0gZG1hci5vIGlvdmEubyBpbnRlbC1pb21tdS5vCi0KLW9iai0kKENPTkZJR19JTlRSX1JFTUFQKSArPSBkbWFyLm8gaW50cl9yZW1hcHBpbmcubwotCiBvYmotJChDT05GSUdfUENJX0lPVikgKz0gaW92Lm8KIAogIwpAQCAtNTEsNiArNDYsNyBAQAogb2JqLSQoQ09ORklHX01OMTAzMDApICs9IHNldHVwLWJ1cy5vCiBvYmotJChDT05GSUdfTUlDUk9CTEFaRSkgKz0gc2V0dXAtYnVzLm8KIG9iai0kKENPTkZJR19USUxFKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubworb2JqLSQoQ09ORklHX1NQQVJDX0xFT04pICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCiAKICMKICMgQUNQSSBSZWxhdGVkIFBDSSBGVyBGdW5jdGlvbnMKQEAgLTcwLDQgKzY2LDYgQEAKIAogb2JqLSQoQ09ORklHX1hFTl9QQ0lERVZfRlJPTlRFTkQpICs9IHhlbi1wY2lmcm9udC5vCiAKK29iai0kKENPTkZJR19PRikgKz0gb2YubworCiBjY2ZsYWdzLSQoQ09ORklHX1BDSV9ERUJVRykgOj0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYwppbmRleCAwODMwMzQ3Li4xZDAwMmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYwpAQCAtMTU4LDcgKzE1OCw3IEBACiAJLyogU2NhbiBiZWxvdyB0aGUgbmV3IGJyaWRnZSAqLwogCWlmIChkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UgfHwKIAkgICAgZGV2LT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUykKLQkJb2Zfc2Nhbl9wY2lfYnJpZGdlKGRuLCBkZXYpOworCQlvZl9zY2FuX3BjaV9icmlkZ2UoZGV2KTsKIAogCS8qIE1hcCBJTyBzcGFjZSBmb3IgY2hpbGQgYnVzLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBzdWNjZWVkICovCiAJcGNpYmlvc19tYXBfaW9fc3BhY2UoZGV2LT5zdWJvcmRpbmF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9zeXNmcy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfc3lzZnMuYwppbmRleCAwNzFiN2RjLi5lZmEzMGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX3N5c2ZzLmMKQEAgLTUwLDI5ICs1MCwyNiBAQAogCXBjaV9idXNfZm9yX2VhY2hfcmVzb3VyY2UoYnVzLCByZXMsIGluZGV4KSB7CiAJCWlmIChyZXMgJiYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgJiYKIAkJCQkhKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKSkgewotCQkJb3V0ICs9IHNwcmludGYob3V0LCAic3RhcnQgPSAlOC44bGx4LCAiCi0JCQkJCSJsZW5ndGggPSAlOC44bGx4XG4iLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQsCi0JCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKHJlcy0+ZW5kIC0gcmVzLT5zdGFydCkpOworCQkJb3V0ICs9IHNwcmludGYob3V0LCAic3RhcnQgPSAlOC44bGx4LCBsZW5ndGggPSAlOC44bGx4XG4iLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQsCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAkJfQogCX0KIAlvdXQgKz0gc3ByaW50ZihvdXQsICJGcmVlIHJlc291cmNlczogcHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CiAJcGNpX2J1c19mb3JfZWFjaF9yZXNvdXJjZShidXMsIHJlcywgaW5kZXgpIHsKIAkJaWYgKHJlcyAmJiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSAmJgogCQkJICAgICAgIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkpIHsKLQkJCW91dCArPSBzcHJpbnRmKG91dCwgInN0YXJ0ID0gJTguOGxseCwgIgotCQkJCQkibGVuZ3RoID0gJTguOGxseFxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKShyZXMtPmVuZCAtIHJlcy0+c3RhcnQpKTsKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgInN0YXJ0ID0gJTguOGxseCwgbGVuZ3RoID0gJTguOGxseFxuIiwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlc291cmNlX3NpemUocmVzKSk7CiAJCX0KIAl9CiAJb3V0ICs9IHNwcmludGYob3V0LCAiRnJlZSByZXNvdXJjZXM6IElPXG4iKTsKIAlwY2lfYnVzX2Zvcl9lYWNoX3Jlc291cmNlKGJ1cywgcmVzLCBpbmRleCkgewogCQlpZiAocmVzICYmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykpIHsKLQkJCW91dCArPSBzcHJpbnRmKG91dCwgInN0YXJ0ID0gJTguOGxseCwgIgotCQkJCQkibGVuZ3RoID0gJTguOGxseFxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKShyZXMtPmVuZCAtIHJlcy0+c3RhcnQpKTsKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgInN0YXJ0ID0gJTguOGxseCwgbGVuZ3RoID0gJTguOGxseFxuIiwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlc291cmNlX3NpemUocmVzKSk7CiAJCX0KIAl9CiAJb3V0ICs9IHNwcmludGYob3V0LCAiRnJlZSByZXNvdXJjZXM6IGJ1cyBudW1iZXJzXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMgYi9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWYxN2FjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCi0gKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbgotICogQXV0aG9yOiBBc2hvayBSYWogPGFzaG9rLnJhakBpbnRlbC5jb20+Ci0gKiBBdXRob3I6IFNoYW9odWEgTGkgPHNoYW9odWEubGlAaW50ZWwuY29tPgotICogQXV0aG9yOiBBbmlsIFMgS2VzaGF2YW11cnRoeSA8YW5pbC5zLmtlc2hhdmFtdXJ0aHlAaW50ZWwuY29tPgotICogQXV0aG9yOiBGZW5naHVhIFl1IDxmZW5naHVhLnl1QGludGVsLmNvbT4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWFyLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3ZhLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlbC1pb21tdS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvdGJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2ktYXRzLmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vaW9tbXUuaD4KLSNpbmNsdWRlICJwY2kuaCIKLQotI2RlZmluZSBST09UX1NJWkUJCVZURF9QQUdFX1NJWkUKLSNkZWZpbmUgQ09OVEVYVF9TSVpFCQlWVERfUEFHRV9TSVpFCi0KLSNkZWZpbmUgSVNfQlJJREdFX0hPU1RfREVWSUNFKHBkZXYpIFwKLQkJCSAgICAoKHBkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19CUklER0VfSE9TVCkKLSNkZWZpbmUgSVNfR0ZYX0RFVklDRShwZGV2KSAoKHBkZXYtPmNsYXNzID4+IDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19ESVNQTEFZKQotI2RlZmluZSBJU19JU0FfREVWSUNFKHBkZXYpICgocGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9JU0EpCi0jZGVmaW5lIElTX0FaQUxJQShwZGV2KSAoKHBkZXYpLT52ZW5kb3IgPT0gMHg4MDg2ICYmIChwZGV2KS0+ZGV2aWNlID09IDB4M2EzZSkKLQotI2RlZmluZSBJT0FQSUNfUkFOR0VfU1RBUlQJKDB4ZmVlMDAwMDApCi0jZGVmaW5lIElPQVBJQ19SQU5HRV9FTkQJKDB4ZmVlZmZmZmYpCi0jZGVmaW5lIElPVkFfU1RBUlRfQUREUgkJKDB4MTAwMCkKLQotI2RlZmluZSBERUZBVUxUX0RPTUFJTl9BRERSRVNTX1dJRFRIIDQ4Ci0KLSNkZWZpbmUgTUFYX0FHQVdfV0lEVEggNjQKLQotI2RlZmluZSBfX0RPTUFJTl9NQVhfUEZOKGdhdykgICgoKCh1aW50NjRfdCkxKSA8PCAoZ2F3LVZURF9QQUdFX1NISUZUKSkgLSAxKQotI2RlZmluZSBfX0RPTUFJTl9NQVhfQUREUihnYXcpICgoKCh1aW50NjRfdCkxKSA8PCBnYXcpIC0gMSkKLQotLyogV2UgbGltaXQgRE9NQUlOX01BWF9QRk4gdG8gZml0IGluIGFuIHVuc2lnbmVkIGxvbmcsIGFuZCBET01BSU5fTUFYX0FERFIKLSAgIHRvIG1hdGNoLiBUaGF0IHdheSwgd2UgY2FuIHVzZSAndW5zaWduZWQgbG9uZycgZm9yIFBGTnMgd2l0aCBpbXB1bml0eS4gKi8KLSNkZWZpbmUgRE9NQUlOX01BWF9QRk4oZ2F3KQkoKHVuc2lnbmVkIGxvbmcpIG1pbl90KHVpbnQ2NF90LCBcCi0JCQkJX19ET01BSU5fTUFYX1BGTihnYXcpLCAodW5zaWduZWQgbG9uZyktMSkpCi0jZGVmaW5lIERPTUFJTl9NQVhfQUREUihnYXcpCSgoKHVpbnQ2NF90KV9fRE9NQUlOX01BWF9QRk4oZ2F3KSkgPDwgVlREX1BBR0VfU0hJRlQpCi0KLSNkZWZpbmUgSU9WQV9QRk4oYWRkcikJCSgoYWRkcikgPj4gUEFHRV9TSElGVCkKLSNkZWZpbmUgRE1BXzMyQklUX1BGTgkJSU9WQV9QRk4oRE1BX0JJVF9NQVNLKDMyKSkKLSNkZWZpbmUgRE1BXzY0QklUX1BGTgkJSU9WQV9QRk4oRE1BX0JJVF9NQVNLKDY0KSkKLQotLyogcGFnZSB0YWJsZSBoYW5kbGluZyAqLwotI2RlZmluZSBMRVZFTF9TVFJJREUJCSg5KQotI2RlZmluZSBMRVZFTF9NQVNLCQkoKCh1NjQpMSA8PCBMRVZFTF9TVFJJREUpIC0gMSkKLQotc3RhdGljIGlubGluZSBpbnQgYWdhd190b19sZXZlbChpbnQgYWdhdykKLXsKLQlyZXR1cm4gYWdhdyArIDI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFnYXdfdG9fd2lkdGgoaW50IGFnYXcpCi17Ci0JcmV0dXJuIDMwICsgYWdhdyAqIExFVkVMX1NUUklERTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgd2lkdGhfdG9fYWdhdyhpbnQgd2lkdGgpCi17Ci0JcmV0dXJuICh3aWR0aCAtIDMwKSAvIExFVkVMX1NUUklERTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbGV2ZWxfdG9fb2Zmc2V0X2JpdHMoaW50IGxldmVsKQotewotCXJldHVybiAobGV2ZWwgLSAxKSAqIExFVkVMX1NUUklERTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcGZuX2xldmVsX29mZnNldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGxldmVsKQotewotCXJldHVybiAocGZuID4+IGxldmVsX3RvX29mZnNldF9iaXRzKGxldmVsKSkgJiBMRVZFTF9NQVNLOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbGV2ZWxfbWFzayhpbnQgbGV2ZWwpCi17Ci0JcmV0dXJuIC0xVUwgPDwgbGV2ZWxfdG9fb2Zmc2V0X2JpdHMobGV2ZWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbGV2ZWxfc2l6ZShpbnQgbGV2ZWwpCi17Ci0JcmV0dXJuIDFVTCA8PCBsZXZlbF90b19vZmZzZXRfYml0cyhsZXZlbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhbGlnbl90b19sZXZlbCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGxldmVsKQotewotCXJldHVybiAocGZuICsgbGV2ZWxfc2l6ZShsZXZlbCkgLSAxKSAmIGxldmVsX21hc2sobGV2ZWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbHZsX3RvX25yX3BhZ2VzKHVuc2lnbmVkIGludCBsdmwpCi17Ci0JcmV0dXJuICAxIDw8ICgobHZsIC0gMSkgKiBMRVZFTF9TVFJJREUpOwotfQotCi0vKiBWVC1kIHBhZ2VzIG11c3QgYWx3YXlzIGJlIF9zbWFsbGVyXyB0aGFuIE1NIHBhZ2VzLiBPdGhlcndpc2UgdGhpbmdzCi0gICBhcmUgbmV2ZXIgZ29pbmcgdG8gd29yay4gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkbWFfdG9fbW1fcGZuKHVuc2lnbmVkIGxvbmcgZG1hX3BmbikKLXsKLQlyZXR1cm4gZG1hX3BmbiA+PiAoUEFHRV9TSElGVCAtIFZURF9QQUdFX1NISUZUKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1tX3RvX2RtYV9wZm4odW5zaWduZWQgbG9uZyBtbV9wZm4pCi17Ci0JcmV0dXJuIG1tX3BmbiA8PCAoUEFHRV9TSElGVCAtIFZURF9QQUdFX1NISUZUKTsKLX0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwYWdlX3RvX2RtYV9wZm4oc3RydWN0IHBhZ2UgKnBnKQotewotCXJldHVybiBtbV90b19kbWFfcGZuKHBhZ2VfdG9fcGZuKHBnKSk7Ci19Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmlydF90b19kbWFfcGZuKHZvaWQgKnApCi17Ci0JcmV0dXJuIHBhZ2VfdG9fZG1hX3Bmbih2aXJ0X3RvX3BhZ2UocCkpOwotfQotCi0vKiBnbG9iYWwgaW9tbXUgbGlzdCwgc2V0IE5VTEwgZm9yIGlnbm9yZWQgRE1BUiB1bml0cyAqLwotc3RhdGljIHN0cnVjdCBpbnRlbF9pb21tdSAqKmdfaW9tbXVzOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfdHlsZXJzYnVyZ19pc29jaCh2b2lkKTsKLXN0YXRpYyBpbnQgcndiZl9xdWlyazsKLQotLyoKLSAqIHNldCB0byAxIHRvIHBhbmljIGtlcm5lbCBpZiBjYW4ndCBzdWNjZXNzZnVsbHkgZW5hYmxlIFZULWQKLSAqICh1c2VkIHdoZW4ga2VybmVsIGlzIGxhdW5jaGVkIHcvIFRYVCkKLSAqLwotc3RhdGljIGludCBmb3JjZV9vbiA9IDA7Ci0KLS8qCi0gKiAwOiBQcmVzZW50Ci0gKiAxLTExOiBSZXNlcnZlZAotICogMTItNjM6IENvbnRleHQgUHRyICgxMiAtIChoYXctMSkpCi0gKiA2NC0xMjc6IFJlc2VydmVkCi0gKi8KLXN0cnVjdCByb290X2VudHJ5IHsKLQl1NjQJdmFsOwotCXU2NAlyc3ZkMTsKLX07Ci0jZGVmaW5lIFJPT1RfRU5UUllfTlIgKFZURF9QQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCByb290X2VudHJ5KSkKLXN0YXRpYyBpbmxpbmUgYm9vbCByb290X3ByZXNlbnQoc3RydWN0IHJvb3RfZW50cnkgKnJvb3QpCi17Ci0JcmV0dXJuIChyb290LT52YWwgJiAxKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcm9vdF9wcmVzZW50KHN0cnVjdCByb290X2VudHJ5ICpyb290KQotewotCXJvb3QtPnZhbCB8PSAxOwotfQotc3RhdGljIGlubGluZSB2b2lkIHNldF9yb290X3ZhbHVlKHN0cnVjdCByb290X2VudHJ5ICpyb290LCB1bnNpZ25lZCBsb25nIHZhbHVlKQotewotCXJvb3QtPnZhbCB8PSB2YWx1ZSAmIFZURF9QQUdFX01BU0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNvbnRleHRfZW50cnkgKgotZ2V0X2NvbnRleHRfYWRkcl9mcm9tX3Jvb3Qoc3RydWN0IHJvb3RfZW50cnkgKnJvb3QpCi17Ci0JcmV0dXJuIChzdHJ1Y3QgY29udGV4dF9lbnRyeSAqKQotCQkocm9vdF9wcmVzZW50KHJvb3QpP3BoeXNfdG9fdmlydCgKLQkJcm9vdC0+dmFsICYgVlREX1BBR0VfTUFTSykgOgotCQlOVUxMKTsKLX0KLQotLyoKLSAqIGxvdyA2NCBiaXRzOgotICogMDogcHJlc2VudAotICogMTogZmF1bHQgcHJvY2Vzc2luZyBkaXNhYmxlCi0gKiAyLTM6IHRyYW5zbGF0aW9uIHR5cGUKLSAqIDEyLTYzOiBhZGRyZXNzIHNwYWNlIHJvb3QKLSAqIGhpZ2ggNjQgYml0czoKLSAqIDAtMjogYWRkcmVzcyB3aWR0aAotICogMy02OiBhdmFsCi0gKiA4LTIzOiBkb21haW4gaWQKLSAqLwotc3RydWN0IGNvbnRleHRfZW50cnkgewotCXU2NCBsbzsKLQl1NjQgaGk7Ci19OwotCi1zdGF0aWMgaW5saW5lIGJvb2wgY29udGV4dF9wcmVzZW50KHN0cnVjdCBjb250ZXh0X2VudHJ5ICpjb250ZXh0KQotewotCXJldHVybiAoY29udGV4dC0+bG8gJiAxKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb250ZXh0X3NldF9wcmVzZW50KHN0cnVjdCBjb250ZXh0X2VudHJ5ICpjb250ZXh0KQotewotCWNvbnRleHQtPmxvIHw9IDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb250ZXh0X3NldF9mYXVsdF9lbmFibGUoc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQpCi17Ci0JY29udGV4dC0+bG8gJj0gKCgodTY0KS0xKSA8PCAyKSB8IDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb250ZXh0X3NldF90cmFuc2xhdGlvbl90eXBlKHN0cnVjdCBjb250ZXh0X2VudHJ5ICpjb250ZXh0LAotCQkJCQkJdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQljb250ZXh0LT5sbyAmPSAoKCh1NjQpLTEpIDw8IDQpIHwgMzsKLQljb250ZXh0LT5sbyB8PSAodmFsdWUgJiAzKSA8PCAyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY29udGV4dF9zZXRfYWRkcmVzc19yb290KHN0cnVjdCBjb250ZXh0X2VudHJ5ICpjb250ZXh0LAotCQkJCQkgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQljb250ZXh0LT5sbyB8PSB2YWx1ZSAmIFZURF9QQUdFX01BU0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb250ZXh0X3NldF9hZGRyZXNzX3dpZHRoKHN0cnVjdCBjb250ZXh0X2VudHJ5ICpjb250ZXh0LAotCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi17Ci0JY29udGV4dC0+aGkgfD0gdmFsdWUgJiA3OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY29udGV4dF9zZXRfZG9tYWluX2lkKHN0cnVjdCBjb250ZXh0X2VudHJ5ICpjb250ZXh0LAotCQkJCQkgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQljb250ZXh0LT5oaSB8PSAodmFsdWUgJiAoKDEgPDwgMTYpIC0gMSkpIDw8IDg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb250ZXh0X2NsZWFyX2VudHJ5KHN0cnVjdCBjb250ZXh0X2VudHJ5ICpjb250ZXh0KQotewotCWNvbnRleHQtPmxvID0gMDsKLQljb250ZXh0LT5oaSA9IDA7Ci19Ci0KLS8qCi0gKiAwOiByZWFkYWJsZQotICogMTogd3JpdGFibGUKLSAqIDItNjogcmVzZXJ2ZWQKLSAqIDc6IHN1cGVyIHBhZ2UKLSAqIDgtMTA6IGF2YWlsYWJsZQotICogMTE6IHNub29wIGJlaGF2aW9yCi0gKiAxMi02MzogSG9zdCBwaHlzY2lhbCBhZGRyZXNzCi0gKi8KLXN0cnVjdCBkbWFfcHRlIHsKLQl1NjQgdmFsOwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIGRtYV9jbGVhcl9wdGUoc3RydWN0IGRtYV9wdGUgKnB0ZSkKLXsKLQlwdGUtPnZhbCA9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc2V0X3B0ZV9yZWFkYWJsZShzdHJ1Y3QgZG1hX3B0ZSAqcHRlKQotewotCXB0ZS0+dmFsIHw9IERNQV9QVEVfUkVBRDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRtYV9zZXRfcHRlX3dyaXRhYmxlKHN0cnVjdCBkbWFfcHRlICpwdGUpCi17Ci0JcHRlLT52YWwgfD0gRE1BX1BURV9XUklURTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRtYV9zZXRfcHRlX3NucChzdHJ1Y3QgZG1hX3B0ZSAqcHRlKQotewotCXB0ZS0+dmFsIHw9IERNQV9QVEVfU05QOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3NldF9wdGVfcHJvdChzdHJ1Y3QgZG1hX3B0ZSAqcHRlLCB1bnNpZ25lZCBsb25nIHByb3QpCi17Ci0JcHRlLT52YWwgPSAocHRlLT52YWwgJiB+MykgfCAocHJvdCAmIDMpOwotfQotCi1zdGF0aWMgaW5saW5lIHU2NCBkbWFfcHRlX2FkZHIoc3RydWN0IGRtYV9wdGUgKnB0ZSkKLXsKLSNpZmRlZiBDT05GSUdfNjRCSVQKLQlyZXR1cm4gcHRlLT52YWwgJiBWVERfUEFHRV9NQVNLOwotI2Vsc2UKLQkvKiBNdXN0IGhhdmUgYSBmdWxsIGF0b21pYyA2NC1iaXQgcmVhZCAqLwotCXJldHVybiAgX19jbXB4Y2hnNjQoJnB0ZS0+dmFsLCAwVUxMLCAwVUxMKSAmIFZURF9QQUdFX01BU0s7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRtYV9zZXRfcHRlX3BmbihzdHJ1Y3QgZG1hX3B0ZSAqcHRlLCB1bnNpZ25lZCBsb25nIHBmbikKLXsKLQlwdGUtPnZhbCB8PSAodWludDY0X3QpcGZuIDw8IFZURF9QQUdFX1NISUZUOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgZG1hX3B0ZV9wcmVzZW50KHN0cnVjdCBkbWFfcHRlICpwdGUpCi17Ci0JcmV0dXJuIChwdGUtPnZhbCAmIDMpICE9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGZpcnN0X3B0ZV9pbl9wYWdlKHN0cnVjdCBkbWFfcHRlICpwdGUpCi17Ci0JcmV0dXJuICEoKHVuc2lnbmVkIGxvbmcpcHRlICYgflZURF9QQUdFX01BU0spOwotfQotCi0vKgotICogVGhpcyBkb21haW4gaXMgYSBzdGF0aWNhbGx5IGlkZW50aXR5IG1hcHBpbmcgZG9tYWluLgotICoJMS4gVGhpcyBkb21haW4gY3JlYXRzIGEgc3RhdGljIDE6MSBtYXBwaW5nIHRvIGFsbCB1c2FibGUgbWVtb3J5LgotICogCTIuIEl0IG1hcHMgdG8gZWFjaCBpb21tdSBpZiBzdWNjZXNzZnVsLgotICoJMy4gRWFjaCBpb21tdSBtYXBwcyB0byB0aGlzIGRvbWFpbiBpZiBzdWNjZXNzZnVsLgotICovCi1zdGF0aWMgc3RydWN0IGRtYXJfZG9tYWluICpzaV9kb21haW47Ci1zdGF0aWMgaW50IGh3X3Bhc3NfdGhyb3VnaCA9IDE7Ci0KLS8qIGRldmljZXMgdW5kZXIgdGhlIHNhbWUgcDJwIGJyaWRnZSBhcmUgb3duZWQgaW4gb25lIGRvbWFpbiAqLwotI2RlZmluZSBET01BSU5fRkxBR19QMlBfTVVMVElQTEVfREVWSUNFUyAoMSA8PCAwKQotCi0vKiBkb21haW4gcmVwcmVzZW50cyBhIHZpcnR1YWwgbWFjaGluZSwgbW9yZSB0aGFuIG9uZSBkZXZpY2VzCi0gKiBhY3Jvc3MgaW9tbXVzIG1heSBiZSBvd25lZCBpbiBvbmUgZG9tYWluLCBlLmcuIGt2bSBndWVzdC4KLSAqLwotI2RlZmluZSBET01BSU5fRkxBR19WSVJUVUFMX01BQ0hJTkUJKDEgPDwgMSkKLQotLyogc2lfZG9tYWluIGNvbnRhaW5zIG11bGl0cGxlIGRldmljZXMgKi8KLSNkZWZpbmUgRE9NQUlOX0ZMQUdfU1RBVElDX0lERU5USVRZCSgxIDw8IDIpCi0KLXN0cnVjdCBkbWFyX2RvbWFpbiB7Ci0JaW50CWlkOwkJCS8qIGRvbWFpbiBpZCAqLwotCWludAluaWQ7CQkJLyogbm9kZSBpZCAqLwotCXVuc2lnbmVkIGxvbmcgaW9tbXVfYm1wOwkvKiBiaXRtYXAgb2YgaW9tbXVzIHRoaXMgZG9tYWluIHVzZXMqLwotCi0Jc3RydWN0IGxpc3RfaGVhZCBkZXZpY2VzOyAJLyogYWxsIGRldmljZXMnIGxpc3QgKi8KLQlzdHJ1Y3QgaW92YV9kb21haW4gaW92YWQ7CS8qIGlvdmEncyB0aGF0IGJlbG9uZyB0byB0aGlzIGRvbWFpbiAqLwotCi0Jc3RydWN0IGRtYV9wdGUJKnBnZDsJCS8qIHZpcnR1YWwgYWRkcmVzcyAqLwotCWludAkJZ2F3OwkJLyogbWF4IGd1ZXN0IGFkZHJlc3Mgd2lkdGggKi8KLQotCS8qIGFkanVzdGVkIGd1ZXN0IGFkZHJlc3Mgd2lkdGgsIDAgaXMgbGV2ZWwgMiAzMC1iaXQgKi8KLQlpbnQJCWFnYXc7Ci0KLQlpbnQJCWZsYWdzOwkJLyogZmxhZ3MgdG8gZmluZCBvdXQgdHlwZSBvZiBkb21haW4gKi8KLQotCWludAkJaW9tbXVfY29oZXJlbmN5Oy8qIGluZGljYXRlIGNvaGVyZW5jeSBvZiBpb21tdSBhY2Nlc3MgKi8KLQlpbnQJCWlvbW11X3Nub29waW5nOyAvKiBpbmRpY2F0ZSBzbm9vcGluZyBjb250cm9sIGZlYXR1cmUqLwotCWludAkJaW9tbXVfY291bnQ7CS8qIHJlZmVyZW5jZSBjb3VudCBvZiBpb21tdSAqLwotCWludAkJaW9tbXVfc3VwZXJwYWdlOy8qIExldmVsIG9mIHN1cGVycGFnZXMgc3VwcG9ydGVkOgotCQkJCQkgICAwID09IDRLaUIgKG5vIHN1cGVycGFnZXMpLCAxID09IDJNaUIsCi0JCQkJCSAgIDIgPT0gMUdpQiwgMyA9PSA1MTJHaUIsIDQgPT0gMVRpQiAqLwotCXNwaW5sb2NrX3QJaW9tbXVfbG9jazsJLyogcHJvdGVjdCBpb21tdSBzZXQgaW4gZG9tYWluICovCi0JdTY0CQltYXhfYWRkcjsJLyogbWF4aW11bSBtYXBwZWQgYWRkcmVzcyAqLwotfTsKLQotLyogUENJIGRvbWFpbi1kZXZpY2UgcmVsYXRpb25zaGlwICovCi1zdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CS8qIGxpbmsgdG8gZG9tYWluIHNpYmxpbmdzICovCi0Jc3RydWN0IGxpc3RfaGVhZCBnbG9iYWw7IC8qIGxpbmsgdG8gZ2xvYmFsIGxpc3QgKi8KLQlpbnQgc2VnbWVudDsJCS8qIFBDSSBkb21haW4gKi8KLQl1OCBidXM7CQkJLyogUENJIGJ1cyBudW1iZXIgKi8KLQl1OCBkZXZmbjsJCS8qIFBDSSBkZXZmbiBudW1iZXIgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OyAvKiBpdCdzIE5VTEwgZm9yIFBDSWUtdG8tUENJIGJyaWRnZSAqLwotCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7IC8qIElPTU1VIHVzZWQgYnkgdGhpcyBkZXZpY2UgKi8KLQlzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbjsgLyogcG9pbnRlciB0byBkb21haW4gKi8KLX07Ci0KLXN0YXRpYyB2b2lkIGZsdXNoX3VubWFwc190aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0KLURFRklORV9USU1FUih1bm1hcF90aW1lciwgIGZsdXNoX3VubWFwc190aW1lb3V0LCAwLCAwKTsKLQotI2RlZmluZSBISUdIX1dBVEVSX01BUksgMjUwCi1zdHJ1Y3QgZGVmZXJyZWRfZmx1c2hfdGFibGVzIHsKLQlpbnQgbmV4dDsKLQlzdHJ1Y3QgaW92YSAqaW92YVtISUdIX1dBVEVSX01BUktdOwotCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluW0hJR0hfV0FURVJfTUFSS107Ci19OwotCi1zdGF0aWMgc3RydWN0IGRlZmVycmVkX2ZsdXNoX3RhYmxlcyAqZGVmZXJyZWRfZmx1c2g7Ci0KLS8qIGJpdG1hcCBmb3IgaW5kZXhpbmcgaW50ZWxfaW9tbXVzICovCi1zdGF0aWMgaW50IGdfbnVtX29mX2lvbW11czsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhhc3luY191bWFwX2ZsdXNoX2xvY2spOwotc3RhdGljIExJU1RfSEVBRCh1bm1hcHNfdG9fZG8pOwotCi1zdGF0aWMgaW50IHRpbWVyX29uOwotc3RhdGljIGxvbmcgbGlzdF9zaXplOwotCi1zdGF0aWMgdm9pZCBkb21haW5fcmVtb3ZlX2Rldl9pbmZvKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKTsKLQotI2lmZGVmIENPTkZJR19ETUFSX0RFRkFVTFRfT04KLWludCBkbWFyX2Rpc2FibGVkID0gMDsKLSNlbHNlCi1pbnQgZG1hcl9kaXNhYmxlZCA9IDE7Ci0jZW5kaWYgLypDT05GSUdfRE1BUl9ERUZBVUxUX09OKi8KLQotc3RhdGljIGludCBkbWFyX21hcF9nZnggPSAxOwotc3RhdGljIGludCBkbWFyX2ZvcmNlZGFjOwotc3RhdGljIGludCBpbnRlbF9pb21tdV9zdHJpY3Q7Ci1zdGF0aWMgaW50IGludGVsX2lvbW11X3N1cGVycGFnZSA9IDE7Ci0KLSNkZWZpbmUgRFVNTVlfREVWSUNFX0RPTUFJTl9JTkZPICgoc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqKSgtMSkpCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRldmljZV9kb21haW5fbG9jayk7Ci1zdGF0aWMgTElTVF9IRUFEKGRldmljZV9kb21haW5fbGlzdCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaW9tbXVfb3BzIGludGVsX2lvbW11X29wczsKLQotc3RhdGljIGludCBfX2luaXQgaW50ZWxfaW9tbXVfc2V0dXAoY2hhciAqc3RyKQotewotCWlmICghc3RyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQl3aGlsZSAoKnN0cikgewotCQlpZiAoIXN0cm5jbXAoc3RyLCAib24iLCAyKSkgewotCQkJZG1hcl9kaXNhYmxlZCA9IDA7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJJbnRlbC1JT01NVTogZW5hYmxlZFxuIik7Ci0JCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAib2ZmIiwgMykpIHsKLQkJCWRtYXJfZGlzYWJsZWQgPSAxOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiSW50ZWwtSU9NTVU6IGRpc2FibGVkXG4iKTsKLQkJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJpZ2Z4X29mZiIsIDgpKSB7Ci0JCQlkbWFyX21hcF9nZnggPSAwOwotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCSJJbnRlbC1JT01NVTogZGlzYWJsZSBHRlggZGV2aWNlIG1hcHBpbmdcbiIpOwotCQl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgImZvcmNlZGFjIiwgOCkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkiSW50ZWwtSU9NTVU6IEZvcmNpbmcgREFDIGZvciBQQ0kgZGV2aWNlc1xuIik7Ci0JCQlkbWFyX2ZvcmNlZGFjID0gMTsKLQkJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJzdHJpY3QiLCA2KSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCSJJbnRlbC1JT01NVTogZGlzYWJsZSBiYXRjaGVkIElPVExCIGZsdXNoXG4iKTsKLQkJCWludGVsX2lvbW11X3N0cmljdCA9IDE7Ci0JCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAic3Bfb2ZmIiwgNikpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkiSW50ZWwtSU9NTVU6IGRpc2FibGUgc3VwcG9ydGVkIHN1cGVyIHBhZ2VcbiIpOwotCQkJaW50ZWxfaW9tbXVfc3VwZXJwYWdlID0gMDsKLQkJfQotCi0JCXN0ciArPSBzdHJjc3BuKHN0ciwgIiwiKTsKLQkJd2hpbGUgKCpzdHIgPT0gJywnKQotCQkJc3RyKys7Ci0JfQotCXJldHVybiAwOwotfQotX19zZXR1cCgiaW50ZWxfaW9tbXU9IiwgaW50ZWxfaW9tbXVfc2V0dXApOwotCi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmlvbW11X2RvbWFpbl9jYWNoZTsKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaW9tbXVfZGV2aW5mb19jYWNoZTsKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaW9tbXVfaW92YV9jYWNoZTsKLQotc3RhdGljIGlubGluZSB2b2lkICphbGxvY19wZ3RhYmxlX3BhZ2UoaW50IG5vZGUpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jdm9pZCAqdmFkZHIgPSBOVUxMOwotCi0JcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgR0ZQX0FUT01JQyB8IF9fR0ZQX1pFUk8sIDApOwotCWlmIChwYWdlKQotCQl2YWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQlyZXR1cm4gdmFkZHI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3BndGFibGVfcGFnZSh2b2lkICp2YWRkcikKLXsKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdmFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKmFsbG9jX2RvbWFpbl9tZW0odm9pZCkKLXsKLQlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhpb21tdV9kb21haW5fY2FjaGUsIEdGUF9BVE9NSUMpOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2RvbWFpbl9tZW0odm9pZCAqdmFkZHIpCi17Ci0Ja21lbV9jYWNoZV9mcmVlKGlvbW11X2RvbWFpbl9jYWNoZSwgdmFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKiBhbGxvY19kZXZpbmZvX21lbSh2b2lkKQotewotCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGlvbW11X2RldmluZm9fY2FjaGUsIEdGUF9BVE9NSUMpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9kZXZpbmZvX21lbSh2b2lkICp2YWRkcikKLXsKLQlrbWVtX2NhY2hlX2ZyZWUoaW9tbXVfZGV2aW5mb19jYWNoZSwgdmFkZHIpOwotfQotCi1zdHJ1Y3QgaW92YSAqYWxsb2NfaW92YV9tZW0odm9pZCkKLXsKLQlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhpb21tdV9pb3ZhX2NhY2hlLCBHRlBfQVRPTUlDKTsKLX0KLQotdm9pZCBmcmVlX2lvdmFfbWVtKHN0cnVjdCBpb3ZhICppb3ZhKQotewotCWttZW1fY2FjaGVfZnJlZShpb21tdV9pb3ZhX2NhY2hlLCBpb3ZhKTsKLX0KLQotCi1zdGF0aWMgaW50IF9faW9tbXVfY2FsY3VsYXRlX2FnYXcoc3RydWN0IGludGVsX2lvbW11ICppb21tdSwgaW50IG1heF9nYXcpCi17Ci0JdW5zaWduZWQgbG9uZyBzYWdhdzsKLQlpbnQgYWdhdyA9IC0xOwotCi0Jc2FnYXcgPSBjYXBfc2FnYXcoaW9tbXUtPmNhcCk7Ci0JZm9yIChhZ2F3ID0gd2lkdGhfdG9fYWdhdyhtYXhfZ2F3KTsKLQkgICAgIGFnYXcgPj0gMDsgYWdhdy0tKSB7Ci0JCWlmICh0ZXN0X2JpdChhZ2F3LCAmc2FnYXcpKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGFnYXc7Ci19Ci0KLS8qCi0gKiBDYWxjdWxhdGUgbWF4IFNBR0FXIGZvciBlYWNoIGlvbW11LgotICovCi1pbnQgaW9tbXVfY2FsY3VsYXRlX21heF9zYWdhdyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQotewotCXJldHVybiBfX2lvbW11X2NhbGN1bGF0ZV9hZ2F3KGlvbW11LCBNQVhfQUdBV19XSURUSCk7Ci19Ci0KLS8qCi0gKiBjYWxjdWxhdGUgYWdhdyBmb3IgZWFjaCBpb21tdS4KLSAqICJTQUdBVyIgbWF5IGJlIGRpZmZlcmVudCBhY3Jvc3MgaW9tbXVzLCB1c2UgYSBkZWZhdWx0IGFnYXcsIGFuZAotICogZ2V0IGEgc3VwcG9ydGVkIGxlc3MgYWdhdyBmb3IgaW9tbXVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgZGVmYXVsdCBhZ2F3LgotICovCi1pbnQgaW9tbXVfY2FsY3VsYXRlX2FnYXcoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKLXsKLQlyZXR1cm4gX19pb21tdV9jYWxjdWxhdGVfYWdhdyhpb21tdSwgREVGQVVMVF9ET01BSU5fQUREUkVTU19XSURUSCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb25pbiBvbmx5IHJldHVybnMgc2luZ2xlIGlvbW11IGluIGEgZG9tYWluICovCi1zdGF0aWMgc3RydWN0IGludGVsX2lvbW11ICpkb21haW5fZ2V0X2lvbW11KHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKQotewotCWludCBpb21tdV9pZDsKLQotCS8qIHNpX2RvbWFpbiBhbmQgdm0gZG9tYWluIHNob3VsZCBub3QgZ2V0IGhlcmUuICovCi0JQlVHX09OKGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19WSVJUVUFMX01BQ0hJTkUpOwotCUJVR19PTihkb21haW4tPmZsYWdzICYgRE9NQUlOX0ZMQUdfU1RBVElDX0lERU5USVRZKTsKLQotCWlvbW11X2lkID0gZmluZF9maXJzdF9iaXQoJmRvbWFpbi0+aW9tbXVfYm1wLCBnX251bV9vZl9pb21tdXMpOwotCWlmIChpb21tdV9pZCA8IDAgfHwgaW9tbXVfaWQgPj0gZ19udW1fb2ZfaW9tbXVzKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBnX2lvbW11c1tpb21tdV9pZF07Ci19Ci0KLXN0YXRpYyB2b2lkIGRvbWFpbl91cGRhdGVfaW9tbXVfY29oZXJlbmN5KHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKQotewotCWludCBpOwotCi0JZG9tYWluLT5pb21tdV9jb2hlcmVuY3kgPSAxOwotCi0JZm9yX2VhY2hfc2V0X2JpdChpLCAmZG9tYWluLT5pb21tdV9ibXAsIGdfbnVtX29mX2lvbW11cykgewotCQlpZiAoIWVjYXBfY29oZXJlbnQoZ19pb21tdXNbaV0tPmVjYXApKSB7Ci0JCQlkb21haW4tPmlvbW11X2NvaGVyZW5jeSA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgZG9tYWluX3VwZGF0ZV9pb21tdV9zbm9vcGluZyhzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbikKLXsKLQlpbnQgaTsKLQotCWRvbWFpbi0+aW9tbXVfc25vb3BpbmcgPSAxOwotCi0JZm9yX2VhY2hfc2V0X2JpdChpLCAmZG9tYWluLT5pb21tdV9ibXAsIGdfbnVtX29mX2lvbW11cykgewotCQlpZiAoIWVjYXBfc2Nfc3VwcG9ydChnX2lvbW11c1tpXS0+ZWNhcCkpIHsKLQkJCWRvbWFpbi0+aW9tbXVfc25vb3BpbmcgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGRvbWFpbl91cGRhdGVfaW9tbXVfc3VwZXJwYWdlKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKQotewotCWludCBpLCBtYXNrID0gMHhmOwotCi0JaWYgKCFpbnRlbF9pb21tdV9zdXBlcnBhZ2UpIHsKLQkJZG9tYWluLT5pb21tdV9zdXBlcnBhZ2UgPSAwOwotCQlyZXR1cm47Ci0JfQotCi0JZG9tYWluLT5pb21tdV9zdXBlcnBhZ2UgPSA0OyAvKiAxVGlCICovCi0KLQlmb3JfZWFjaF9zZXRfYml0KGksICZkb21haW4tPmlvbW11X2JtcCwgZ19udW1fb2ZfaW9tbXVzKSB7Ci0JCW1hc2sgfD0gY2FwX3N1cGVyX3BhZ2VfdmFsKGdfaW9tbXVzW2ldLT5jYXApOwotCQlpZiAoIW1hc2spIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWRvbWFpbi0+aW9tbXVfc3VwZXJwYWdlID0gZmxzKG1hc2spOwotfQotCi0vKiBTb21lIGNhcGFiaWxpdGllcyBtYXkgYmUgZGlmZmVyZW50IGFjcm9zcyBpb21tdXMgKi8KLXN0YXRpYyB2b2lkIGRvbWFpbl91cGRhdGVfaW9tbXVfY2FwKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKQotewotCWRvbWFpbl91cGRhdGVfaW9tbXVfY29oZXJlbmN5KGRvbWFpbik7Ci0JZG9tYWluX3VwZGF0ZV9pb21tdV9zbm9vcGluZyhkb21haW4pOwotCWRvbWFpbl91cGRhdGVfaW9tbXVfc3VwZXJwYWdlKGRvbWFpbik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmRldmljZV90b19pb21tdShpbnQgc2VnbWVudCwgdTggYnVzLCB1OCBkZXZmbikKLXsKLQlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQgPSBOVUxMOwotCWludCBpOwotCi0JZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKLQkJaWYgKGRyaGQtPmlnbm9yZWQpCi0JCQljb250aW51ZTsKLQkJaWYgKHNlZ21lbnQgIT0gZHJoZC0+c2VnbWVudCkKLQkJCWNvbnRpbnVlOwotCi0JCWZvciAoaSA9IDA7IGkgPCBkcmhkLT5kZXZpY2VzX2NudDsgaSsrKSB7Ci0JCQlpZiAoZHJoZC0+ZGV2aWNlc1tpXSAmJgotCQkJICAgIGRyaGQtPmRldmljZXNbaV0tPmJ1cy0+bnVtYmVyID09IGJ1cyAmJgotCQkJICAgIGRyaGQtPmRldmljZXNbaV0tPmRldmZuID09IGRldmZuKQotCQkJCXJldHVybiBkcmhkLT5pb21tdTsKLQkJCWlmIChkcmhkLT5kZXZpY2VzW2ldICYmCi0JCQkgICAgZHJoZC0+ZGV2aWNlc1tpXS0+c3Vib3JkaW5hdGUgJiYKLQkJCSAgICBkcmhkLT5kZXZpY2VzW2ldLT5zdWJvcmRpbmF0ZS0+bnVtYmVyIDw9IGJ1cyAmJgotCQkJICAgIGRyaGQtPmRldmljZXNbaV0tPnN1Ym9yZGluYXRlLT5zdWJvcmRpbmF0ZSA+PSBidXMpCi0JCQkJcmV0dXJuIGRyaGQtPmlvbW11OwotCQl9Ci0KLQkJaWYgKGRyaGQtPmluY2x1ZGVfYWxsKQotCQkJcmV0dXJuIGRyaGQtPmlvbW11OwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBkb21haW5fZmx1c2hfY2FjaGUoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCi0JCQkgICAgICAgdm9pZCAqYWRkciwgaW50IHNpemUpCi17Ci0JaWYgKCFkb21haW4tPmlvbW11X2NvaGVyZW5jeSkKLQkJY2xmbHVzaF9jYWNoZV9yYW5nZShhZGRyLCBzaXplKTsKLX0KLQotLyogR2V0cyBjb250ZXh0IGVudHJ5IGZvciBhIGdpdmVuIGJ1cyBhbmQgZGV2Zm4gKi8KLXN0YXRpYyBzdHJ1Y3QgY29udGV4dF9lbnRyeSAqIGRldmljZV90b19jb250ZXh0X2VudHJ5KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsCi0JCXU4IGJ1cywgdTggZGV2Zm4pCi17Ci0Jc3RydWN0IHJvb3RfZW50cnkgKnJvb3Q7Ci0Jc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQ7Ci0JdW5zaWduZWQgbG9uZyBwaHlfYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0Jcm9vdCA9ICZpb21tdS0+cm9vdF9lbnRyeVtidXNdOwotCWNvbnRleHQgPSBnZXRfY29udGV4dF9hZGRyX2Zyb21fcm9vdChyb290KTsKLQlpZiAoIWNvbnRleHQpIHsKLQkJY29udGV4dCA9IChzdHJ1Y3QgY29udGV4dF9lbnRyeSAqKQotCQkJCWFsbG9jX3BndGFibGVfcGFnZShpb21tdS0+bm9kZSk7Ci0JCWlmICghY29udGV4dCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCV9faW9tbXVfZmx1c2hfY2FjaGUoaW9tbXUsICh2b2lkICopY29udGV4dCwgQ09OVEVYVF9TSVpFKTsKLQkJcGh5X2FkZHIgPSB2aXJ0X3RvX3BoeXMoKHZvaWQgKiljb250ZXh0KTsKLQkJc2V0X3Jvb3RfdmFsdWUocm9vdCwgcGh5X2FkZHIpOwotCQlzZXRfcm9vdF9wcmVzZW50KHJvb3QpOwotCQlfX2lvbW11X2ZsdXNoX2NhY2hlKGlvbW11LCByb290LCBzaXplb2YoKnJvb3QpKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gJmNvbnRleHRbZGV2Zm5dOwotfQotCi1zdGF0aWMgaW50IGRldmljZV9jb250ZXh0X21hcHBlZChzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCB1OCBidXMsIHU4IGRldmZuKQotewotCXN0cnVjdCByb290X2VudHJ5ICpyb290OwotCXN0cnVjdCBjb250ZXh0X2VudHJ5ICpjb250ZXh0OwotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCXJvb3QgPSAmaW9tbXUtPnJvb3RfZW50cnlbYnVzXTsKLQljb250ZXh0ID0gZ2V0X2NvbnRleHRfYWRkcl9mcm9tX3Jvb3Qocm9vdCk7Ci0JaWYgKCFjb250ZXh0KSB7Ci0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQlyZXQgPSBjb250ZXh0X3ByZXNlbnQoJmNvbnRleHRbZGV2Zm5dKTsKLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFyX2NvbnRleHRfdGFibGUoc3RydWN0IGludGVsX2lvbW11ICppb21tdSwgdTggYnVzLCB1OCBkZXZmbikKLXsKLQlzdHJ1Y3Qgcm9vdF9lbnRyeSAqcm9vdDsKLQlzdHJ1Y3QgY29udGV4dF9lbnRyeSAqY29udGV4dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0Jcm9vdCA9ICZpb21tdS0+cm9vdF9lbnRyeVtidXNdOwotCWNvbnRleHQgPSBnZXRfY29udGV4dF9hZGRyX2Zyb21fcm9vdChyb290KTsKLQlpZiAoY29udGV4dCkgewotCQljb250ZXh0X2NsZWFyX2VudHJ5KCZjb250ZXh0W2RldmZuXSk7Ci0JCV9faW9tbXVfZmx1c2hfY2FjaGUoaW9tbXUsICZjb250ZXh0W2RldmZuXSwgXAotCQkJc2l6ZW9mKCpjb250ZXh0KSk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfY29udGV4dF90YWJsZShzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQotewotCXN0cnVjdCByb290X2VudHJ5ICpyb290OwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGNvbnRleHRfZW50cnkgKmNvbnRleHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQlpZiAoIWlvbW11LT5yb290X2VudHJ5KSB7Ci0JCWdvdG8gb3V0OwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgUk9PVF9FTlRSWV9OUjsgaSsrKSB7Ci0JCXJvb3QgPSAmaW9tbXUtPnJvb3RfZW50cnlbaV07Ci0JCWNvbnRleHQgPSBnZXRfY29udGV4dF9hZGRyX2Zyb21fcm9vdChyb290KTsKLQkJaWYgKGNvbnRleHQpCi0JCQlmcmVlX3BndGFibGVfcGFnZShjb250ZXh0KTsKLQl9Ci0JZnJlZV9wZ3RhYmxlX3BhZ2UoaW9tbXUtPnJvb3RfZW50cnkpOwotCWlvbW11LT5yb290X2VudHJ5ID0gTlVMTDsKLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgc3RydWN0IGRtYV9wdGUgKnBmbl90b19kbWFfcHRlKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgbGFyZ2VfbGV2ZWwpCi17Ci0JaW50IGFkZHJfd2lkdGggPSBhZ2F3X3RvX3dpZHRoKGRvbWFpbi0+YWdhdykgLSBWVERfUEFHRV9TSElGVDsKLQlzdHJ1Y3QgZG1hX3B0ZSAqcGFyZW50LCAqcHRlID0gTlVMTDsKLQlpbnQgbGV2ZWwgPSBhZ2F3X3RvX2xldmVsKGRvbWFpbi0+YWdhdyk7Ci0JaW50IG9mZnNldCwgdGFyZ2V0X2xldmVsOwotCi0JQlVHX09OKCFkb21haW4tPnBnZCk7Ci0JQlVHX09OKGFkZHJfd2lkdGggPCBCSVRTX1BFUl9MT05HICYmIHBmbiA+PiBhZGRyX3dpZHRoKTsKLQlwYXJlbnQgPSBkb21haW4tPnBnZDsKLQotCS8qIFNlYXJjaCBwdGUgKi8KLQlpZiAoIWxhcmdlX2xldmVsKQotCQl0YXJnZXRfbGV2ZWwgPSAxOwotCWVsc2UKLQkJdGFyZ2V0X2xldmVsID0gbGFyZ2VfbGV2ZWw7Ci0KLQl3aGlsZSAobGV2ZWwgPiAwKSB7Ci0JCXZvaWQgKnRtcF9wYWdlOwotCi0JCW9mZnNldCA9IHBmbl9sZXZlbF9vZmZzZXQocGZuLCBsZXZlbCk7Ci0JCXB0ZSA9ICZwYXJlbnRbb2Zmc2V0XTsKLQkJaWYgKCFsYXJnZV9sZXZlbCAmJiAocHRlLT52YWwgJiBETUFfUFRFX0xBUkdFX1BBR0UpKQotCQkJYnJlYWs7Ci0JCWlmIChsZXZlbCA9PSB0YXJnZXRfbGV2ZWwpCi0JCQlicmVhazsKLQotCQlpZiAoIWRtYV9wdGVfcHJlc2VudChwdGUpKSB7Ci0JCQl1aW50NjRfdCBwdGV2YWw7Ci0KLQkJCXRtcF9wYWdlID0gYWxsb2NfcGd0YWJsZV9wYWdlKGRvbWFpbi0+bmlkKTsKLQotCQkJaWYgKCF0bXBfcGFnZSkKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQkJZG9tYWluX2ZsdXNoX2NhY2hlKGRvbWFpbiwgdG1wX3BhZ2UsIFZURF9QQUdFX1NJWkUpOwotCQkJcHRldmFsID0gKCh1aW50NjRfdCl2aXJ0X3RvX2RtYV9wZm4odG1wX3BhZ2UpIDw8IFZURF9QQUdFX1NISUZUKSB8IERNQV9QVEVfUkVBRCB8IERNQV9QVEVfV1JJVEU7Ci0JCQlpZiAoY21weGNoZzY0KCZwdGUtPnZhbCwgMFVMTCwgcHRldmFsKSkgewotCQkJCS8qIFNvbWVvbmUgZWxzZSBzZXQgaXQgd2hpbGUgd2Ugd2VyZSB0aGlua2luZzsgdXNlIHRoZWlycy4gKi8KLQkJCQlmcmVlX3BndGFibGVfcGFnZSh0bXBfcGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCWRtYV9wdGVfYWRkcihwdGUpOwotCQkJCWRvbWFpbl9mbHVzaF9jYWNoZShkb21haW4sIHB0ZSwgc2l6ZW9mKCpwdGUpKTsKLQkJCX0KLQkJfQotCQlwYXJlbnQgPSBwaHlzX3RvX3ZpcnQoZG1hX3B0ZV9hZGRyKHB0ZSkpOwotCQlsZXZlbC0tOwotCX0KLQotCXJldHVybiBwdGU7Ci19Ci0KLQotLyogcmV0dXJuIGFkZHJlc3MncyBwdGUgYXQgc3BlY2lmaWMgbGV2ZWwgKi8KLXN0YXRpYyBzdHJ1Y3QgZG1hX3B0ZSAqZG1hX3Bmbl9sZXZlbF9wdGUoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCi0JCQkJCSB1bnNpZ25lZCBsb25nIHBmbiwKLQkJCQkJIGludCBsZXZlbCwgaW50ICpsYXJnZV9wYWdlKQotewotCXN0cnVjdCBkbWFfcHRlICpwYXJlbnQsICpwdGUgPSBOVUxMOwotCWludCB0b3RhbCA9IGFnYXdfdG9fbGV2ZWwoZG9tYWluLT5hZ2F3KTsKLQlpbnQgb2Zmc2V0OwotCi0JcGFyZW50ID0gZG9tYWluLT5wZ2Q7Ci0Jd2hpbGUgKGxldmVsIDw9IHRvdGFsKSB7Ci0JCW9mZnNldCA9IHBmbl9sZXZlbF9vZmZzZXQocGZuLCB0b3RhbCk7Ci0JCXB0ZSA9ICZwYXJlbnRbb2Zmc2V0XTsKLQkJaWYgKGxldmVsID09IHRvdGFsKQotCQkJcmV0dXJuIHB0ZTsKLQotCQlpZiAoIWRtYV9wdGVfcHJlc2VudChwdGUpKSB7Ci0JCQkqbGFyZ2VfcGFnZSA9IHRvdGFsOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocHRlLT52YWwgJiBETUFfUFRFX0xBUkdFX1BBR0UpIHsKLQkJCSpsYXJnZV9wYWdlID0gdG90YWw7Ci0JCQlyZXR1cm4gcHRlOwotCQl9Ci0KLQkJcGFyZW50ID0gcGh5c190b192aXJ0KGRtYV9wdGVfYWRkcihwdGUpKTsKLQkJdG90YWwtLTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGNsZWFyIGxhc3QgbGV2ZWwgcHRlLCBhIHRsYiBmbHVzaCBzaG91bGQgYmUgZm9sbG93ZWQgKi8KLXN0YXRpYyB2b2lkIGRtYV9wdGVfY2xlYXJfcmFuZ2Uoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCi0JCQkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCi0JCQkJdW5zaWduZWQgbG9uZyBsYXN0X3BmbikKLXsKLQlpbnQgYWRkcl93aWR0aCA9IGFnYXdfdG9fd2lkdGgoZG9tYWluLT5hZ2F3KSAtIFZURF9QQUdFX1NISUZUOwotCXVuc2lnbmVkIGludCBsYXJnZV9wYWdlID0gMTsKLQlzdHJ1Y3QgZG1hX3B0ZSAqZmlyc3RfcHRlLCAqcHRlOwotCi0JQlVHX09OKGFkZHJfd2lkdGggPCBCSVRTX1BFUl9MT05HICYmIHN0YXJ0X3BmbiA+PiBhZGRyX3dpZHRoKTsKLQlCVUdfT04oYWRkcl93aWR0aCA8IEJJVFNfUEVSX0xPTkcgJiYgbGFzdF9wZm4gPj4gYWRkcl93aWR0aCk7Ci0JQlVHX09OKHN0YXJ0X3BmbiA+IGxhc3RfcGZuKTsKLQotCS8qIHdlIGRvbid0IG5lZWQgbG9jayBoZXJlOyBub2JvZHkgZWxzZSB0b3VjaGVzIHRoZSBpb3ZhIHJhbmdlICovCi0JZG8gewotCQlsYXJnZV9wYWdlID0gMTsKLQkJZmlyc3RfcHRlID0gcHRlID0gZG1hX3Bmbl9sZXZlbF9wdGUoZG9tYWluLCBzdGFydF9wZm4sIDEsICZsYXJnZV9wYWdlKTsKLQkJaWYgKCFwdGUpIHsKLQkJCXN0YXJ0X3BmbiA9IGFsaWduX3RvX2xldmVsKHN0YXJ0X3BmbiArIDEsIGxhcmdlX3BhZ2UgKyAxKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWRvIHsKLQkJCWRtYV9jbGVhcl9wdGUocHRlKTsKLQkJCXN0YXJ0X3BmbiArPSBsdmxfdG9fbnJfcGFnZXMobGFyZ2VfcGFnZSk7Ci0JCQlwdGUrKzsKLQkJfSB3aGlsZSAoc3RhcnRfcGZuIDw9IGxhc3RfcGZuICYmICFmaXJzdF9wdGVfaW5fcGFnZShwdGUpKTsKLQotCQlkb21haW5fZmx1c2hfY2FjaGUoZG9tYWluLCBmaXJzdF9wdGUsCi0JCQkJICAgKHZvaWQgKilwdGUgLSAodm9pZCAqKWZpcnN0X3B0ZSk7Ci0KLQl9IHdoaWxlIChzdGFydF9wZm4gJiYgc3RhcnRfcGZuIDw9IGxhc3RfcGZuKTsKLX0KLQotLyogZnJlZSBwYWdlIHRhYmxlIHBhZ2VzLiBsYXN0IGxldmVsIHB0ZSBzaG91bGQgYWxyZWFkeSBiZSBjbGVhcmVkICovCi1zdGF0aWMgdm9pZCBkbWFfcHRlX2ZyZWVfcGFnZXRhYmxlKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgbGFzdF9wZm4pCi17Ci0JaW50IGFkZHJfd2lkdGggPSBhZ2F3X3RvX3dpZHRoKGRvbWFpbi0+YWdhdykgLSBWVERfUEFHRV9TSElGVDsKLQlzdHJ1Y3QgZG1hX3B0ZSAqZmlyc3RfcHRlLCAqcHRlOwotCWludCB0b3RhbCA9IGFnYXdfdG9fbGV2ZWwoZG9tYWluLT5hZ2F3KTsKLQlpbnQgbGV2ZWw7Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0JaW50IGxhcmdlX3BhZ2UgPSAyOwotCi0JQlVHX09OKGFkZHJfd2lkdGggPCBCSVRTX1BFUl9MT05HICYmIHN0YXJ0X3BmbiA+PiBhZGRyX3dpZHRoKTsKLQlCVUdfT04oYWRkcl93aWR0aCA8IEJJVFNfUEVSX0xPTkcgJiYgbGFzdF9wZm4gPj4gYWRkcl93aWR0aCk7Ci0JQlVHX09OKHN0YXJ0X3BmbiA+IGxhc3RfcGZuKTsKLQotCS8qIFdlIGRvbid0IG5lZWQgbG9jayBoZXJlOyBub2JvZHkgZWxzZSB0b3VjaGVzIHRoZSBpb3ZhIHJhbmdlICovCi0JbGV2ZWwgPSAyOwotCXdoaWxlIChsZXZlbCA8PSB0b3RhbCkgewotCQl0bXAgPSBhbGlnbl90b19sZXZlbChzdGFydF9wZm4sIGxldmVsKTsKLQotCQkvKiBJZiB3ZSBjYW4ndCBldmVuIGNsZWFyIG9uZSBQVEUgYXQgdGhpcyBsZXZlbCwgd2UncmUgZG9uZSAqLwotCQlpZiAodG1wICsgbGV2ZWxfc2l6ZShsZXZlbCkgLSAxID4gbGFzdF9wZm4pCi0JCQlyZXR1cm47Ci0KLQkJZG8gewotCQkJbGFyZ2VfcGFnZSA9IGxldmVsOwotCQkJZmlyc3RfcHRlID0gcHRlID0gZG1hX3Bmbl9sZXZlbF9wdGUoZG9tYWluLCB0bXAsIGxldmVsLCAmbGFyZ2VfcGFnZSk7Ci0JCQlpZiAobGFyZ2VfcGFnZSA+IGxldmVsKQotCQkJCWxldmVsID0gbGFyZ2VfcGFnZSArIDE7Ci0JCQlpZiAoIXB0ZSkgewotCQkJCXRtcCA9IGFsaWduX3RvX2xldmVsKHRtcCArIDEsIGxldmVsICsgMSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlkbyB7Ci0JCQkJaWYgKGRtYV9wdGVfcHJlc2VudChwdGUpKSB7Ci0JCQkJCWZyZWVfcGd0YWJsZV9wYWdlKHBoeXNfdG9fdmlydChkbWFfcHRlX2FkZHIocHRlKSkpOwotCQkJCQlkbWFfY2xlYXJfcHRlKHB0ZSk7Ci0JCQkJfQotCQkJCXB0ZSsrOwotCQkJCXRtcCArPSBsZXZlbF9zaXplKGxldmVsKTsKLQkJCX0gd2hpbGUgKCFmaXJzdF9wdGVfaW5fcGFnZShwdGUpICYmCi0JCQkJIHRtcCArIGxldmVsX3NpemUobGV2ZWwpIC0gMSA8PSBsYXN0X3Bmbik7Ci0KLQkJCWRvbWFpbl9mbHVzaF9jYWNoZShkb21haW4sIGZpcnN0X3B0ZSwKLQkJCQkJICAgKHZvaWQgKilwdGUgLSAodm9pZCAqKWZpcnN0X3B0ZSk7Ci0JCQkKLQkJfSB3aGlsZSAodG1wICYmIHRtcCArIGxldmVsX3NpemUobGV2ZWwpIC0gMSA8PSBsYXN0X3Bmbik7Ci0JCWxldmVsKys7Ci0JfQotCS8qIGZyZWUgcGdkICovCi0JaWYgKHN0YXJ0X3BmbiA9PSAwICYmIGxhc3RfcGZuID09IERPTUFJTl9NQVhfUEZOKGRvbWFpbi0+Z2F3KSkgewotCQlmcmVlX3BndGFibGVfcGFnZShkb21haW4tPnBnZCk7Ci0JCWRvbWFpbi0+cGdkID0gTlVMTDsKLQl9Ci19Ci0KLS8qIGlvbW11IGhhbmRsaW5nICovCi1zdGF0aWMgaW50IGlvbW11X2FsbG9jX3Jvb3RfZW50cnkoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKLXsKLQlzdHJ1Y3Qgcm9vdF9lbnRyeSAqcm9vdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jcm9vdCA9IChzdHJ1Y3Qgcm9vdF9lbnRyeSAqKWFsbG9jX3BndGFibGVfcGFnZShpb21tdS0+bm9kZSk7Ci0JaWYgKCFyb290KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCV9faW9tbXVfZmx1c2hfY2FjaGUoaW9tbXUsIHJvb3QsIFJPT1RfU0laRSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQlpb21tdS0+cm9vdF9lbnRyeSA9IHJvb3Q7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV9zZXRfcm9vdF9lbnRyeShzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQotewotCXZvaWQgKmFkZHI7Ci0JdTMyIHN0czsKLQl1bnNpZ25lZCBsb25nIGZsYWc7Ci0KLQlhZGRyID0gaW9tbXUtPnJvb3RfZW50cnk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWcpOwotCWRtYXJfd3JpdGVxKGlvbW11LT5yZWcgKyBETUFSX1JUQUREUl9SRUcsIHZpcnRfdG9fcGh5cyhhZGRyKSk7Ci0KLQl3cml0ZWwoaW9tbXUtPmdjbWQgfCBETUFfR0NNRF9TUlRQLCBpb21tdS0+cmVnICsgRE1BUl9HQ01EX1JFRyk7Ci0KLQkvKiBNYWtlIHN1cmUgaGFyZHdhcmUgY29tcGxldGUgaXQgKi8KLQlJT01NVV9XQUlUX09QKGlvbW11LCBETUFSX0dTVFNfUkVHLAotCQkgICAgICByZWFkbCwgKHN0cyAmIERNQV9HU1RTX1JUUFMpLCBzdHMpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWcpOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV9mbHVzaF93cml0ZV9idWZmZXIoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKLXsKLQl1MzIgdmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKLQotCWlmICghcndiZl9xdWlyayAmJiAhY2FwX3J3YmYoaW9tbXUtPmNhcCkpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7Ci0Jd3JpdGVsKGlvbW11LT5nY21kIHwgRE1BX0dDTURfV0JGLCBpb21tdS0+cmVnICsgRE1BUl9HQ01EX1JFRyk7Ci0KLQkvKiBNYWtlIHN1cmUgaGFyZHdhcmUgY29tcGxldGUgaXQgKi8KLQlJT01NVV9XQUlUX09QKGlvbW11LCBETUFSX0dTVFNfUkVHLAotCQkgICAgICByZWFkbCwgKCEodmFsICYgRE1BX0dTVFNfV0JGUykpLCB2YWwpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWcpOwotfQotCi0vKiByZXR1cm4gdmFsdWUgZGV0ZXJtaW5lIGlmIHdlIG5lZWQgYSB3cml0ZSBidWZmZXIgZmx1c2ggKi8KLXN0YXRpYyB2b2lkIF9faW9tbXVfZmx1c2hfY29udGV4dChzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LAotCQkJCSAgdTE2IGRpZCwgdTE2IHNvdXJjZV9pZCwgdTggZnVuY3Rpb25fbWFzaywKLQkJCQkgIHU2NCB0eXBlKQotewotCXU2NCB2YWwgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgRE1BX0NDTURfR0xPQkFMX0lOVkw6Ci0JCXZhbCA9IERNQV9DQ01EX0dMT0JBTF9JTlZMOwotCQlicmVhazsKLQljYXNlIERNQV9DQ01EX0RPTUFJTl9JTlZMOgotCQl2YWwgPSBETUFfQ0NNRF9ET01BSU5fSU5WTHxETUFfQ0NNRF9ESUQoZGlkKTsKLQkJYnJlYWs7Ci0JY2FzZSBETUFfQ0NNRF9ERVZJQ0VfSU5WTDoKLQkJdmFsID0gRE1BX0NDTURfREVWSUNFX0lOVkx8RE1BX0NDTURfRElEKGRpZCkKLQkJCXwgRE1BX0NDTURfU0lEKHNvdXJjZV9pZCkgfCBETUFfQ0NNRF9GTShmdW5jdGlvbl9tYXNrKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCXZhbCB8PSBETUFfQ0NNRF9JQ0M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWcpOwotCWRtYXJfd3JpdGVxKGlvbW11LT5yZWcgKyBETUFSX0NDTURfUkVHLCB2YWwpOwotCi0JLyogTWFrZSBzdXJlIGhhcmR3YXJlIGNvbXBsZXRlIGl0ICovCi0JSU9NTVVfV0FJVF9PUChpb21tdSwgRE1BUl9DQ01EX1JFRywKLQkJZG1hcl9yZWFkcSwgKCEodmFsICYgRE1BX0NDTURfSUNDKSksIHZhbCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7Ci19Ci0KLS8qIHJldHVybiB2YWx1ZSBkZXRlcm1pbmUgaWYgd2UgbmVlZCBhIHdyaXRlIGJ1ZmZlciBmbHVzaCAqLwotc3RhdGljIHZvaWQgX19pb21tdV9mbHVzaF9pb3RsYihzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCB1MTYgZGlkLAotCQkJCXU2NCBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZV9vcmRlciwgdTY0IHR5cGUpCi17Ci0JaW50IHRsYl9vZmZzZXQgPSBlY2FwX2lvdGxiX29mZnNldChpb21tdS0+ZWNhcCk7Ci0JdTY0IHZhbCA9IDAsIHZhbF9pdmEgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgRE1BX1RMQl9HTE9CQUxfRkxVU0g6Ci0JCS8qIGdsb2JhbCBmbHVzaCBkb2Vzbid0IG5lZWQgc2V0IElWQV9SRUcgKi8KLQkJdmFsID0gRE1BX1RMQl9HTE9CQUxfRkxVU0h8RE1BX1RMQl9JVlQ7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX1RMQl9EU0lfRkxVU0g6Ci0JCXZhbCA9IERNQV9UTEJfRFNJX0ZMVVNIfERNQV9UTEJfSVZUfERNQV9UTEJfRElEKGRpZCk7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX1RMQl9QU0lfRkxVU0g6Ci0JCXZhbCA9IERNQV9UTEJfUFNJX0ZMVVNIfERNQV9UTEJfSVZUfERNQV9UTEJfRElEKGRpZCk7Ci0JCS8qIE5vdGU6IGFsd2F5cyBmbHVzaCBub24tbGVhZiBjdXJyZW50bHkgKi8KLQkJdmFsX2l2YSA9IHNpemVfb3JkZXIgfCBhZGRyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0JLyogTm90ZTogc2V0IGRyYWluIHJlYWQvd3JpdGUgKi8KLSNpZiAwCi0JLyoKLQkgKiBUaGlzIGlzIHByb2JhYmx5IHRvIGJlIHN1cGVyIHNlY3VyZS4uIExvb2tzIGxpa2Ugd2UgY2FuCi0JICogaWdub3JlIGl0IHdpdGhvdXQgYW55IGltcGFjdC4KLQkgKi8KLQlpZiAoY2FwX3JlYWRfZHJhaW4oaW9tbXUtPmNhcCkpCi0JCXZhbCB8PSBETUFfVExCX1JFQURfRFJBSU47Ci0jZW5kaWYKLQlpZiAoY2FwX3dyaXRlX2RyYWluKGlvbW11LT5jYXApKQotCQl2YWwgfD0gRE1BX1RMQl9XUklURV9EUkFJTjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7Ci0JLyogTm90ZTogT25seSB1c2VzIGZpcnN0IFRMQiByZWcgY3VycmVudGx5ICovCi0JaWYgKHZhbF9pdmEpCi0JCWRtYXJfd3JpdGVxKGlvbW11LT5yZWcgKyB0bGJfb2Zmc2V0LCB2YWxfaXZhKTsKLQlkbWFyX3dyaXRlcShpb21tdS0+cmVnICsgdGxiX29mZnNldCArIDgsIHZhbCk7Ci0KLQkvKiBNYWtlIHN1cmUgaGFyZHdhcmUgY29tcGxldGUgaXQgKi8KLQlJT01NVV9XQUlUX09QKGlvbW11LCB0bGJfb2Zmc2V0ICsgOCwKLQkJZG1hcl9yZWFkcSwgKCEodmFsICYgRE1BX1RMQl9JVlQpKSwgdmFsKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFnKTsKLQotCS8qIGNoZWNrIElPVExCIGludmFsaWRhdGlvbiBncmFudWxhcml0eSAqLwotCWlmIChETUFfVExCX0lBSUcodmFsKSA9PSAwKQotCQlwcmludGsoS0VSTl9FUlIiSU9NTVU6IGZsdXNoIElPVExCIGZhaWxlZFxuIik7Ci0JaWYgKERNQV9UTEJfSUFJRyh2YWwpICE9IERNQV9UTEJfSUlSRyh0eXBlKSkKLQkJcHJfZGVidWcoIklPTU1VOiB0bGIgZmx1c2ggcmVxdWVzdCAlTHgsIGFjdHVhbCAlTHhcbiIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKURNQV9UTEJfSUlSRyh0eXBlKSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpRE1BX1RMQl9JQUlHKHZhbCkpOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW9tbXVfc3VwcG9ydF9kZXZfaW90bGIoCi0Jc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sIGludCBzZWdtZW50LCB1OCBidXMsIHU4IGRldmZuKQotewotCWludCBmb3VuZCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvICppbmZvOwotCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBkZXZpY2VfdG9faW9tbXUoc2VnbWVudCwgYnVzLCBkZXZmbik7Ci0KLQlpZiAoIWVjYXBfZGV2X2lvdGxiX3N1cHBvcnQoaW9tbXUtPmVjYXApKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICghaW9tbXUtPnFpKQotCQlyZXR1cm4gTlVMTDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZkb21haW4tPmRldmljZXMsIGxpbmspCi0JCWlmIChpbmZvLT5idXMgPT0gYnVzICYmIGluZm8tPmRldmZuID09IGRldmZuKSB7Ci0JCQlmb3VuZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFmb3VuZCB8fCAhaW5mby0+ZGV2KQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICghcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoaW5mby0+ZGV2LCBQQ0lfRVhUX0NBUF9JRF9BVFMpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICghZG1hcl9maW5kX21hdGNoZWRfYXRzcl91bml0KGluZm8tPmRldikpCi0JCXJldHVybiBOVUxMOwotCi0JaW5mby0+aW9tbXUgPSBpb21tdTsKLQotCXJldHVybiBpbmZvOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV9lbmFibGVfZGV2X2lvdGxiKHN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8gKmluZm8pCi17Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm47Ci0KLQlwY2lfZW5hYmxlX2F0cyhpbmZvLT5kZXYsIFZURF9QQUdFX1NISUZUKTsKLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfZGlzYWJsZV9kZXZfaW90bGIoc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW5mbykKLXsKLQlpZiAoIWluZm8tPmRldiB8fCAhcGNpX2F0c19lbmFibGVkKGluZm8tPmRldikpCi0JCXJldHVybjsKLQotCXBjaV9kaXNhYmxlX2F0cyhpbmZvLT5kZXYpOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV9mbHVzaF9kZXZfaW90bGIoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCi0JCQkJICB1NjQgYWRkciwgdW5zaWduZWQgbWFzaykKLXsKLQl1MTYgc2lkLCBxZGVwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW5mbzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZkb21haW4tPmRldmljZXMsIGxpbmspIHsKLQkJaWYgKCFpbmZvLT5kZXYgfHwgIXBjaV9hdHNfZW5hYmxlZChpbmZvLT5kZXYpKQotCQkJY29udGludWU7Ci0KLQkJc2lkID0gaW5mby0+YnVzIDw8IDggfCBpbmZvLT5kZXZmbjsKLQkJcWRlcCA9IHBjaV9hdHNfcXVldWVfZGVwdGgoaW5mby0+ZGV2KTsKLQkJcWlfZmx1c2hfZGV2X2lvdGxiKGluZm8tPmlvbW11LCBzaWQsIHFkZXAsIGFkZHIsIG1hc2spOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfZmx1c2hfaW90bGJfcHNpKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsIHUxNiBkaWQsCi0JCQkJICB1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgaW50IHBhZ2VzLCBpbnQgbWFwKQotewotCXVuc2lnbmVkIGludCBtYXNrID0gaWxvZzIoX19yb3VuZHVwX3Bvd19vZl90d28ocGFnZXMpKTsKLQl1aW50NjRfdCBhZGRyID0gKHVpbnQ2NF90KXBmbiA8PCBWVERfUEFHRV9TSElGVDsKLQotCUJVR19PTihwYWdlcyA9PSAwKTsKLQotCS8qCi0JICogRmFsbGJhY2sgdG8gZG9tYWluIHNlbGVjdGl2ZSBmbHVzaCBpZiBubyBQU0kgc3VwcG9ydCBvciB0aGUgc2l6ZSBpcwotCSAqIHRvbyBiaWcuCi0JICogUFNJIHJlcXVpcmVzIHBhZ2Ugc2l6ZSB0byBiZSAyIF4geCwgYW5kIHRoZSBiYXNlIGFkZHJlc3MgaXMgbmF0dXJhbGx5Ci0JICogYWxpZ25lZCB0byB0aGUgc2l6ZQotCSAqLwotCWlmICghY2FwX3Bnc2VsX2ludihpb21tdS0+Y2FwKSB8fCBtYXNrID4gY2FwX21heF9hbWFza192YWwoaW9tbXUtPmNhcCkpCi0JCWlvbW11LT5mbHVzaC5mbHVzaF9pb3RsYihpb21tdSwgZGlkLCAwLCAwLAotCQkJCQkJRE1BX1RMQl9EU0lfRkxVU0gpOwotCWVsc2UKLQkJaW9tbXUtPmZsdXNoLmZsdXNoX2lvdGxiKGlvbW11LCBkaWQsIGFkZHIsIG1hc2ssCi0JCQkJCQlETUFfVExCX1BTSV9GTFVTSCk7Ci0KLQkvKgotCSAqIEluIGNhY2hpbmcgbW9kZSwgY2hhbmdlcyBvZiBwYWdlcyBmcm9tIG5vbi1wcmVzZW50IHRvIHByZXNlbnQgcmVxdWlyZQotCSAqIGZsdXNoLiBIb3dldmVyLCBkZXZpY2UgSU9UTEIgZG9lc24ndCBuZWVkIHRvIGJlIGZsdXNoZWQgaW4gdGhpcyBjYXNlLgotCSAqLwotCWlmICghY2FwX2NhY2hpbmdfbW9kZShpb21tdS0+Y2FwKSB8fCAhbWFwKQotCQlpb21tdV9mbHVzaF9kZXZfaW90bGIoaW9tbXUtPmRvbWFpbnNbZGlkXSwgYWRkciwgbWFzayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbW11X2Rpc2FibGVfcHJvdGVjdF9tZW1fcmVnaW9ucyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQotewotCXUzMiBwbWVuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKLQlwbWVuID0gcmVhZGwoaW9tbXUtPnJlZyArIERNQVJfUE1FTl9SRUcpOwotCXBtZW4gJj0gfkRNQV9QTUVOX0VQTTsKLQl3cml0ZWwocG1lbiwgaW9tbXUtPnJlZyArIERNQVJfUE1FTl9SRUcpOwotCi0JLyogd2FpdCBmb3IgdGhlIHByb3RlY3RlZCByZWdpb24gc3RhdHVzIGJpdCB0byBjbGVhciAqLwotCUlPTU1VX1dBSVRfT1AoaW9tbXUsIERNQVJfUE1FTl9SRUcsCi0JCXJlYWRsLCAhKHBtZW4gJiBETUFfUE1FTl9QUlMpLCBwbWVuKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgaW9tbXVfZW5hYmxlX3RyYW5zbGF0aW9uKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCi17Ci0JdTMyIHN0czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci0JaW9tbXUtPmdjbWQgfD0gRE1BX0dDTURfVEU7Ci0Jd3JpdGVsKGlvbW11LT5nY21kLCBpb21tdS0+cmVnICsgRE1BUl9HQ01EX1JFRyk7Ci0KLQkvKiBNYWtlIHN1cmUgaGFyZHdhcmUgY29tcGxldGUgaXQgKi8KLQlJT01NVV9XQUlUX09QKGlvbW11LCBETUFSX0dTVFNfUkVHLAotCQkgICAgICByZWFkbCwgKHN0cyAmIERNQV9HU1RTX1RFUyksIHN0cyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlvbW11X2Rpc2FibGVfdHJhbnNsYXRpb24oc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKLXsKLQl1MzIgc3RzOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7Ci0JaW9tbXUtPmdjbWQgJj0gfkRNQV9HQ01EX1RFOwotCXdyaXRlbChpb21tdS0+Z2NtZCwgaW9tbXUtPnJlZyArIERNQVJfR0NNRF9SRUcpOwotCi0JLyogTWFrZSBzdXJlIGhhcmR3YXJlIGNvbXBsZXRlIGl0ICovCi0JSU9NTVVfV0FJVF9PUChpb21tdSwgRE1BUl9HU1RTX1JFRywKLQkJICAgICAgcmVhZGwsICghKHN0cyAmIERNQV9HU1RTX1RFUykpLCBzdHMpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWcpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgaW9tbXVfaW5pdF9kb21haW5zKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCi17Ci0JdW5zaWduZWQgbG9uZyBuZG9tYWluczsKLQl1bnNpZ25lZCBsb25nIG5sb25nczsKLQotCW5kb21haW5zID0gY2FwX25kb21zKGlvbW11LT5jYXApOwotCXByX2RlYnVnKCJJT01NVSAlZDogTnVtYmVyIG9mIERvbWFpbnMgc3VwcG9ydGQgPCVsZD5cbiIsIGlvbW11LT5zZXFfaWQsCi0JCQluZG9tYWlucyk7Ci0JbmxvbmdzID0gQklUU19UT19MT05HUyhuZG9tYWlucyk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmaW9tbXUtPmxvY2spOwotCi0JLyogVEJEOiB0aGVyZSBtaWdodCBiZSA2NEsgZG9tYWlucywKLQkgKiBjb25zaWRlciBvdGhlciBhbGxvY2F0aW9uIGZvciBmdXR1cmUgY2hpcAotCSAqLwotCWlvbW11LT5kb21haW5faWRzID0ga2NhbGxvYyhubG9uZ3MsIHNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpb21tdS0+ZG9tYWluX2lkcykgewotCQlwcmludGsoS0VSTl9FUlIgIkFsbG9jYXRpbmcgZG9tYWluIGlkIGFycmF5IGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlpb21tdS0+ZG9tYWlucyA9IGtjYWxsb2MobmRvbWFpbnMsIHNpemVvZihzdHJ1Y3QgZG1hcl9kb21haW4gKiksCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWlvbW11LT5kb21haW5zKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQWxsb2NhdGluZyBkb21haW4gYXJyYXkgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyoKLQkgKiBpZiBDYWNoaW5nIG1vZGUgaXMgc2V0LCB0aGVuIGludmFsaWQgdHJhbnNsYXRpb25zIGFyZSB0YWdnZWQKLQkgKiB3aXRoIGRvbWFpbmlkIDAuIEhlbmNlIHdlIG5lZWQgdG8gcHJlLWFsbG9jYXRlIGl0LgotCSAqLwotCWlmIChjYXBfY2FjaGluZ19tb2RlKGlvbW11LT5jYXApKQotCQlzZXRfYml0KDAsIGlvbW11LT5kb21haW5faWRzKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBkb21haW5fZXhpdChzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbik7Ci1zdGF0aWMgdm9pZCB2bV9kb21haW5fZXhpdChzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbik7Ci0KLXZvaWQgZnJlZV9kbWFyX2lvbW11KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCi17Ci0Jc3RydWN0IGRtYXJfZG9tYWluICpkb21haW47Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgoaW9tbXUtPmRvbWFpbnMpICYmIChpb21tdS0+ZG9tYWluX2lkcykpIHsKLQkJZm9yX2VhY2hfc2V0X2JpdChpLCBpb21tdS0+ZG9tYWluX2lkcywgY2FwX25kb21zKGlvbW11LT5jYXApKSB7Ci0JCQlkb21haW4gPSBpb21tdS0+ZG9tYWluc1tpXTsKLQkJCWNsZWFyX2JpdChpLCBpb21tdS0+ZG9tYWluX2lkcyk7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkb21haW4tPmlvbW11X2xvY2ssIGZsYWdzKTsKLQkJCWlmICgtLWRvbWFpbi0+aW9tbXVfY291bnQgPT0gMCkgewotCQkJCWlmIChkb21haW4tPmZsYWdzICYgRE9NQUlOX0ZMQUdfVklSVFVBTF9NQUNISU5FKQotCQkJCQl2bV9kb21haW5fZXhpdChkb21haW4pOwotCQkJCWVsc2UKLQkJCQkJZG9tYWluX2V4aXQoZG9tYWluKTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+aW9tbXVfbG9jaywgZmxhZ3MpOwotCQl9Ci0JfQotCi0JaWYgKGlvbW11LT5nY21kICYgRE1BX0dDTURfVEUpCi0JCWlvbW11X2Rpc2FibGVfdHJhbnNsYXRpb24oaW9tbXUpOwotCi0JaWYgKGlvbW11LT5pcnEpIHsKLQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoaW9tbXUtPmlycSwgTlVMTCk7Ci0JCS8qIFRoaXMgd2lsbCBtYXNrIHRoZSBpcnEgKi8KLQkJZnJlZV9pcnEoaW9tbXUtPmlycSwgaW9tbXUpOwotCQlkZXN0cm95X2lycShpb21tdS0+aXJxKTsKLQl9Ci0KLQlrZnJlZShpb21tdS0+ZG9tYWlucyk7Ci0Ja2ZyZWUoaW9tbXUtPmRvbWFpbl9pZHMpOwotCi0JZ19pb21tdXNbaW9tbXUtPnNlcV9pZF0gPSBOVUxMOwotCi0JLyogaWYgYWxsIGlvbW11cyBhcmUgZnJlZWQsIGZyZWUgZ19pb21tdXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZ19udW1fb2ZfaW9tbXVzOyBpKyspIHsKLQkJaWYgKGdfaW9tbXVzW2ldKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPT0gZ19udW1fb2ZfaW9tbXVzKQotCQlrZnJlZShnX2lvbW11cyk7Ci0KLQkvKiBmcmVlIGNvbnRleHQgbWFwcGluZyAqLwotCWZyZWVfY29udGV4dF90YWJsZShpb21tdSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZG1hcl9kb21haW4gKmFsbG9jX2RvbWFpbih2b2lkKQotewotCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluOwotCi0JZG9tYWluID0gYWxsb2NfZG9tYWluX21lbSgpOwotCWlmICghZG9tYWluKQotCQlyZXR1cm4gTlVMTDsKLQotCWRvbWFpbi0+bmlkID0gLTE7Ci0JbWVtc2V0KCZkb21haW4tPmlvbW11X2JtcCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQlkb21haW4tPmZsYWdzID0gMDsKLQotCXJldHVybiBkb21haW47Ci19Ci0KLXN0YXRpYyBpbnQgaW9tbXVfYXR0YWNoX2RvbWFpbihzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKLQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQotewotCWludCBudW07Ci0JdW5zaWduZWQgbG9uZyBuZG9tYWluczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbmRvbWFpbnMgPSBjYXBfbmRvbXMoaW9tbXUtPmNhcCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQotCW51bSA9IGZpbmRfZmlyc3RfemVyb19iaXQoaW9tbXUtPmRvbWFpbl9pZHMsIG5kb21haW5zKTsKLQlpZiAobnVtID49IG5kb21haW5zKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0JCXByaW50ayhLRVJOX0VSUiAiSU9NTVU6IG5vIGZyZWUgZG9tYWluIGlkc1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWRvbWFpbi0+aWQgPSBudW07Ci0Jc2V0X2JpdChudW0sIGlvbW11LT5kb21haW5faWRzKTsKLQlzZXRfYml0KGlvbW11LT5zZXFfaWQsICZkb21haW4tPmlvbW11X2JtcCk7Ci0JaW9tbXUtPmRvbWFpbnNbbnVtXSA9IGRvbWFpbjsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbW11X2RldGFjaF9kb21haW4oc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCi0JCQkJc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBudW0sIG5kb21haW5zOwotCWludCBmb3VuZCA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQluZG9tYWlucyA9IGNhcF9uZG9tcyhpb21tdS0+Y2FwKTsKLQlmb3JfZWFjaF9zZXRfYml0KG51bSwgaW9tbXUtPmRvbWFpbl9pZHMsIG5kb21haW5zKSB7Ci0JCWlmIChpb21tdS0+ZG9tYWluc1tudW1dID09IGRvbWFpbikgewotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoZm91bmQpIHsKLQkJY2xlYXJfYml0KG51bSwgaW9tbXUtPmRvbWFpbl9pZHMpOwotCQljbGVhcl9iaXQoaW9tbXUtPnNlcV9pZCwgJmRvbWFpbi0+aW9tbXVfYm1wKTsKLQkJaW9tbXUtPmRvbWFpbnNbbnVtXSA9IE5VTEw7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW92YV9kb21haW4gcmVzZXJ2ZWRfaW92YV9saXN0Owotc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSByZXNlcnZlZF9yYnRyZWVfa2V5OwotCi1zdGF0aWMgaW50IGRtYXJfaW5pdF9yZXNlcnZlZF9yYW5nZXModm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7Ci0Jc3RydWN0IGlvdmEgKmlvdmE7Ci0JaW50IGk7Ci0KLQlpbml0X2lvdmFfZG9tYWluKCZyZXNlcnZlZF9pb3ZhX2xpc3QsIERNQV8zMkJJVF9QRk4pOwotCi0JbG9ja2RlcF9zZXRfY2xhc3MoJnJlc2VydmVkX2lvdmFfbGlzdC5pb3ZhX3JidHJlZV9sb2NrLAotCQkmcmVzZXJ2ZWRfcmJ0cmVlX2tleSk7Ci0KLQkvKiBJT0FQSUMgcmFuZ2VzIHNob3VsZG4ndCBiZSBhY2Nlc3NlZCBieSBETUEgKi8KLQlpb3ZhID0gcmVzZXJ2ZV9pb3ZhKCZyZXNlcnZlZF9pb3ZhX2xpc3QsIElPVkFfUEZOKElPQVBJQ19SQU5HRV9TVEFSVCksCi0JCUlPVkFfUEZOKElPQVBJQ19SQU5HRV9FTkQpKTsKLQlpZiAoIWlvdmEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXNlcnZlIElPQVBJQyByYW5nZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBSZXNlcnZlIGFsbCBQQ0kgTU1JTyB0byBhdm9pZCBwZWVyLXRvLXBlZXIgYWNjZXNzICovCi0JZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcjsKLQotCQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7IGkrKykgewotCQkJciA9ICZwZGV2LT5yZXNvdXJjZVtpXTsKLQkJCWlmICghci0+ZmxhZ3MgfHwgIShyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkKLQkJCQljb250aW51ZTsKLQkJCWlvdmEgPSByZXNlcnZlX2lvdmEoJnJlc2VydmVkX2lvdmFfbGlzdCwKLQkJCQkJICAgIElPVkFfUEZOKHItPnN0YXJ0KSwKLQkJCQkJICAgIElPVkFfUEZOKHItPmVuZCkpOwotCQkJaWYgKCFpb3ZhKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJSZXNlcnZlIGlvdmEgZmFpbGVkXG4iKTsKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZG9tYWluX3Jlc2VydmVfc3BlY2lhbF9yYW5nZXMoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCi17Ci0JY29weV9yZXNlcnZlZF9pb3ZhKCZyZXNlcnZlZF9pb3ZhX2xpc3QsICZkb21haW4tPmlvdmFkKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ3Vlc3R3aWR0aF90b19hZGp1c3R3aWR0aChpbnQgZ2F3KQotewotCWludCBhZ2F3OwotCWludCByID0gKGdhdyAtIDEyKSAlIDk7Ci0KLQlpZiAociA9PSAwKQotCQlhZ2F3ID0gZ2F3OwotCWVsc2UKLQkJYWdhdyA9IGdhdyArIDkgLSByOwotCWlmIChhZ2F3ID4gNjQpCi0JCWFnYXcgPSA2NDsKLQlyZXR1cm4gYWdhdzsKLX0KLQotc3RhdGljIGludCBkb21haW5faW5pdChzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwgaW50IGd1ZXN0X3dpZHRoKQotewotCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7Ci0JaW50IGFkanVzdF93aWR0aCwgYWdhdzsKLQl1bnNpZ25lZCBsb25nIHNhZ2F3OwotCi0JaW5pdF9pb3ZhX2RvbWFpbigmZG9tYWluLT5pb3ZhZCwgRE1BXzMyQklUX1BGTik7Ci0Jc3Bpbl9sb2NrX2luaXQoJmRvbWFpbi0+aW9tbXVfbG9jayk7Ci0KLQlkb21haW5fcmVzZXJ2ZV9zcGVjaWFsX3Jhbmdlcyhkb21haW4pOwotCi0JLyogY2FsY3VsYXRlIEFHQVcgKi8KLQlpb21tdSA9IGRvbWFpbl9nZXRfaW9tbXUoZG9tYWluKTsKLQlpZiAoZ3Vlc3Rfd2lkdGggPiBjYXBfbWdhdyhpb21tdS0+Y2FwKSkKLQkJZ3Vlc3Rfd2lkdGggPSBjYXBfbWdhdyhpb21tdS0+Y2FwKTsKLQlkb21haW4tPmdhdyA9IGd1ZXN0X3dpZHRoOwotCWFkanVzdF93aWR0aCA9IGd1ZXN0d2lkdGhfdG9fYWRqdXN0d2lkdGgoZ3Vlc3Rfd2lkdGgpOwotCWFnYXcgPSB3aWR0aF90b19hZ2F3KGFkanVzdF93aWR0aCk7Ci0Jc2FnYXcgPSBjYXBfc2FnYXcoaW9tbXUtPmNhcCk7Ci0JaWYgKCF0ZXN0X2JpdChhZ2F3LCAmc2FnYXcpKSB7Ci0JCS8qIGhhcmR3YXJlIGRvZXNuJ3Qgc3VwcG9ydCBpdCwgY2hvb3NlIGEgYmlnZ2VyIG9uZSAqLwotCQlwcl9kZWJ1ZygiSU9NTVU6IGhhcmR3YXJlIGRvZXNuJ3Qgc3VwcG9ydCBhZ2F3ICVkXG4iLCBhZ2F3KTsKLQkJYWdhdyA9IGZpbmRfbmV4dF9iaXQoJnNhZ2F3LCA1LCBhZ2F3KTsKLQkJaWYgKGFnYXcgPj0gNSkKLQkJCXJldHVybiAtRU5PREVWOwotCX0KLQlkb21haW4tPmFnYXcgPSBhZ2F3OwotCUlOSVRfTElTVF9IRUFEKCZkb21haW4tPmRldmljZXMpOwotCi0JaWYgKGVjYXBfY29oZXJlbnQoaW9tbXUtPmVjYXApKQotCQlkb21haW4tPmlvbW11X2NvaGVyZW5jeSA9IDE7Ci0JZWxzZQotCQlkb21haW4tPmlvbW11X2NvaGVyZW5jeSA9IDA7Ci0KLQlpZiAoZWNhcF9zY19zdXBwb3J0KGlvbW11LT5lY2FwKSkKLQkJZG9tYWluLT5pb21tdV9zbm9vcGluZyA9IDE7Ci0JZWxzZQotCQlkb21haW4tPmlvbW11X3Nub29waW5nID0gMDsKLQotCWRvbWFpbi0+aW9tbXVfc3VwZXJwYWdlID0gZmxzKGNhcF9zdXBlcl9wYWdlX3ZhbChpb21tdS0+Y2FwKSk7Ci0JZG9tYWluLT5pb21tdV9jb3VudCA9IDE7Ci0JZG9tYWluLT5uaWQgPSBpb21tdS0+bm9kZTsKLQotCS8qIGFsd2F5cyBhbGxvY2F0ZSB0aGUgdG9wIHBnZCAqLwotCWRvbWFpbi0+cGdkID0gKHN0cnVjdCBkbWFfcHRlICopYWxsb2NfcGd0YWJsZV9wYWdlKGRvbWFpbi0+bmlkKTsKLQlpZiAoIWRvbWFpbi0+cGdkKQotCQlyZXR1cm4gLUVOT01FTTsKLQlfX2lvbW11X2ZsdXNoX2NhY2hlKGlvbW11LCBkb21haW4tPnBnZCwgUEFHRV9TSVpFKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZG9tYWluX2V4aXQoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCi17Ci0Jc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOwotCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7Ci0KLQkvKiBEb21haW4gMCBpcyByZXNlcnZlZCwgc28gZG9udCBwcm9jZXNzIGl0ICovCi0JaWYgKCFkb21haW4pCi0JCXJldHVybjsKLQotCS8qIEZsdXNoIGFueSBsYXp5IHVubWFwcyB0aGF0IG1heSByZWZlcmVuY2UgdGhpcyBkb21haW4gKi8KLQlpZiAoIWludGVsX2lvbW11X3N0cmljdCkKLQkJZmx1c2hfdW5tYXBzX3RpbWVvdXQoMCk7Ci0KLQlkb21haW5fcmVtb3ZlX2Rldl9pbmZvKGRvbWFpbik7Ci0JLyogZGVzdHJveSBpb3ZhcyAqLwotCXB1dF9pb3ZhX2RvbWFpbigmZG9tYWluLT5pb3ZhZCk7Ci0KLQkvKiBjbGVhciBwdGVzICovCi0JZG1hX3B0ZV9jbGVhcl9yYW5nZShkb21haW4sIDAsIERPTUFJTl9NQVhfUEZOKGRvbWFpbi0+Z2F3KSk7Ci0KLQkvKiBmcmVlIHBhZ2UgdGFibGVzICovCi0JZG1hX3B0ZV9mcmVlX3BhZ2V0YWJsZShkb21haW4sIDAsIERPTUFJTl9NQVhfUEZOKGRvbWFpbi0+Z2F3KSk7Ci0KLQlmb3JfZWFjaF9hY3RpdmVfaW9tbXUoaW9tbXUsIGRyaGQpCi0JCWlmICh0ZXN0X2JpdChpb21tdS0+c2VxX2lkLCAmZG9tYWluLT5pb21tdV9ibXApKQotCQkJaW9tbXVfZGV0YWNoX2RvbWFpbihkb21haW4sIGlvbW11KTsKLQotCWZyZWVfZG9tYWluX21lbShkb21haW4pOwotfQotCi1zdGF0aWMgaW50IGRvbWFpbl9jb250ZXh0X21hcHBpbmdfb25lKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLCBpbnQgc2VnbWVudCwKLQkJCQkgdTggYnVzLCB1OCBkZXZmbiwgaW50IHRyYW5zbGF0aW9uKQotewotCXN0cnVjdCBjb250ZXh0X2VudHJ5ICpjb250ZXh0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKLQlzdHJ1Y3QgZG1hX3B0ZSAqcGdkOwotCXVuc2lnbmVkIGxvbmcgbnVtOwotCXVuc2lnbmVkIGxvbmcgbmRvbWFpbnM7Ci0JaW50IGlkOwotCWludCBhZ2F3OwotCXN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8gKmluZm8gPSBOVUxMOwotCi0JcHJfZGVidWcoIlNldCBjb250ZXh0IG1hcHBpbmcgZm9yICUwMng6JTAyeC4lZFxuIiwKLQkJYnVzLCBQQ0lfU0xPVChkZXZmbiksIFBDSV9GVU5DKGRldmZuKSk7Ci0KLQlCVUdfT04oIWRvbWFpbi0+cGdkKTsKLQlCVUdfT04odHJhbnNsYXRpb24gIT0gQ09OVEVYVF9UVF9QQVNTX1RIUk9VR0ggJiYKLQkgICAgICAgdHJhbnNsYXRpb24gIT0gQ09OVEVYVF9UVF9NVUxUSV9MRVZFTCk7Ci0KLQlpb21tdSA9IGRldmljZV90b19pb21tdShzZWdtZW50LCBidXMsIGRldmZuKTsKLQlpZiAoIWlvbW11KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWNvbnRleHQgPSBkZXZpY2VfdG9fY29udGV4dF9lbnRyeShpb21tdSwgYnVzLCBkZXZmbik7Ci0JaWYgKCFjb250ZXh0KQotCQlyZXR1cm4gLUVOT01FTTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQlpZiAoY29udGV4dF9wcmVzZW50KGNvbnRleHQpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlkID0gZG9tYWluLT5pZDsKLQlwZ2QgPSBkb21haW4tPnBnZDsKLQotCWlmIChkb21haW4tPmZsYWdzICYgRE9NQUlOX0ZMQUdfVklSVFVBTF9NQUNISU5FIHx8Ci0JICAgIGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19TVEFUSUNfSURFTlRJVFkpIHsKLQkJaW50IGZvdW5kID0gMDsKLQotCQkvKiBmaW5kIGFuIGF2YWlsYWJsZSBkb21haW4gaWQgZm9yIHRoaXMgZGV2aWNlIGluIGlvbW11ICovCi0JCW5kb21haW5zID0gY2FwX25kb21zKGlvbW11LT5jYXApOwotCQlmb3JfZWFjaF9zZXRfYml0KG51bSwgaW9tbXUtPmRvbWFpbl9pZHMsIG5kb21haW5zKSB7Ci0JCQlpZiAoaW9tbXUtPmRvbWFpbnNbbnVtXSA9PSBkb21haW4pIHsKLQkJCQlpZCA9IG51bTsKLQkJCQlmb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZm91bmQgPT0gMCkgewotCQkJbnVtID0gZmluZF9maXJzdF96ZXJvX2JpdChpb21tdS0+ZG9tYWluX2lkcywgbmRvbWFpbnMpOwotCQkJaWYgKG51bSA+PSBuZG9tYWlucykgewotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJJT01NVTogbm8gZnJlZSBkb21haW4gaWRzXG4iKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQotCQkJc2V0X2JpdChudW0sIGlvbW11LT5kb21haW5faWRzKTsKLQkJCWlvbW11LT5kb21haW5zW251bV0gPSBkb21haW47Ci0JCQlpZCA9IG51bTsKLQkJfQotCi0JCS8qIFNraXAgdG9wIGxldmVscyBvZiBwYWdlIHRhYmxlcyBmb3IKLQkJICogaW9tbXUgd2hpY2ggaGFzIGxlc3MgYWdhdyB0aGFuIGRlZmF1bHQuCi0JCSAqIFVubmVjZXNzYXJ5IGZvciBQVCBtb2RlLgotCQkgKi8KLQkJaWYgKHRyYW5zbGF0aW9uICE9IENPTlRFWFRfVFRfUEFTU19USFJPVUdIKSB7Ci0JCQlmb3IgKGFnYXcgPSBkb21haW4tPmFnYXc7IGFnYXcgIT0gaW9tbXUtPmFnYXc7IGFnYXctLSkgewotCQkJCXBnZCA9IHBoeXNfdG9fdmlydChkbWFfcHRlX2FkZHIocGdkKSk7Ci0JCQkJaWYgKCFkbWFfcHRlX3ByZXNlbnQocGdkKSkgewotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljb250ZXh0X3NldF9kb21haW5faWQoY29udGV4dCwgaWQpOwotCi0JaWYgKHRyYW5zbGF0aW9uICE9IENPTlRFWFRfVFRfUEFTU19USFJPVUdIKSB7Ci0JCWluZm8gPSBpb21tdV9zdXBwb3J0X2Rldl9pb3RsYihkb21haW4sIHNlZ21lbnQsIGJ1cywgZGV2Zm4pOwotCQl0cmFuc2xhdGlvbiA9IGluZm8gPyBDT05URVhUX1RUX0RFVl9JT1RMQiA6Ci0JCQkJICAgICBDT05URVhUX1RUX01VTFRJX0xFVkVMOwotCX0KLQkvKgotCSAqIEluIHBhc3MgdGhyb3VnaCBtb2RlLCBBVyBtdXN0IGJlIHByb2dyYW1tZWQgdG8gaW5kaWNhdGUgdGhlIGxhcmdlc3QKLQkgKiBBR0FXIHZhbHVlIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4gQW5kIEFTUiBpcyBpZ25vcmVkIGJ5IGhhcmR3YXJlLgotCSAqLwotCWlmICh1bmxpa2VseSh0cmFuc2xhdGlvbiA9PSBDT05URVhUX1RUX1BBU1NfVEhST1VHSCkpCi0JCWNvbnRleHRfc2V0X2FkZHJlc3Nfd2lkdGgoY29udGV4dCwgaW9tbXUtPm1zYWdhdyk7Ci0JZWxzZSB7Ci0JCWNvbnRleHRfc2V0X2FkZHJlc3Nfcm9vdChjb250ZXh0LCB2aXJ0X3RvX3BoeXMocGdkKSk7Ci0JCWNvbnRleHRfc2V0X2FkZHJlc3Nfd2lkdGgoY29udGV4dCwgaW9tbXUtPmFnYXcpOwotCX0KLQotCWNvbnRleHRfc2V0X3RyYW5zbGF0aW9uX3R5cGUoY29udGV4dCwgdHJhbnNsYXRpb24pOwotCWNvbnRleHRfc2V0X2ZhdWx0X2VuYWJsZShjb250ZXh0KTsKLQljb250ZXh0X3NldF9wcmVzZW50KGNvbnRleHQpOwotCWRvbWFpbl9mbHVzaF9jYWNoZShkb21haW4sIGNvbnRleHQsIHNpemVvZigqY29udGV4dCkpOwotCi0JLyoKLQkgKiBJdCdzIGEgbm9uLXByZXNlbnQgdG8gcHJlc2VudCBtYXBwaW5nLiBJZiBoYXJkd2FyZSBkb2Vzbid0IGNhY2hlCi0JICogbm9uLXByZXNlbnQgZW50cnkgd2Ugb25seSBuZWVkIHRvIGZsdXNoIHRoZSB3cml0ZS1idWZmZXIuIElmIHRoZQotCSAqIF9kb2VzXyBjYWNoZSBub24tcHJlc2VudCBlbnRyaWVzLCB0aGVuIGl0IGRvZXMgc28gaW4gdGhlIHNwZWNpYWwKLQkgKiBkb21haW4gIzAsIHdoaWNoIHdlIGhhdmUgdG8gZmx1c2g6Ci0JICovCi0JaWYgKGNhcF9jYWNoaW5nX21vZGUoaW9tbXUtPmNhcCkpIHsKLQkJaW9tbXUtPmZsdXNoLmZsdXNoX2NvbnRleHQoaW9tbXUsIDAsCi0JCQkJCSAgICgoKHUxNilidXMpIDw8IDgpIHwgZGV2Zm4sCi0JCQkJCSAgIERNQV9DQ01EX01BU0tfTk9CSVQsCi0JCQkJCSAgIERNQV9DQ01EX0RFVklDRV9JTlZMKTsKLQkJaW9tbXUtPmZsdXNoLmZsdXNoX2lvdGxiKGlvbW11LCBkb21haW4tPmlkLCAwLCAwLCBETUFfVExCX0RTSV9GTFVTSCk7Ci0JfSBlbHNlIHsKLQkJaW9tbXVfZmx1c2hfd3JpdGVfYnVmZmVyKGlvbW11KTsKLQl9Ci0JaW9tbXVfZW5hYmxlX2Rldl9pb3RsYihpbmZvKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+aW9tbXVfbG9jaywgZmxhZ3MpOwotCWlmICghdGVzdF9hbmRfc2V0X2JpdChpb21tdS0+c2VxX2lkLCAmZG9tYWluLT5pb21tdV9ibXApKSB7Ci0JCWRvbWFpbi0+aW9tbXVfY291bnQrKzsKLQkJaWYgKGRvbWFpbi0+aW9tbXVfY291bnQgPT0gMSkKLQkJCWRvbWFpbi0+bmlkID0gaW9tbXUtPm5vZGU7Ci0JCWRvbWFpbl91cGRhdGVfaW9tbXVfY2FwKGRvbWFpbik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+aW9tbXVfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kb21haW5fY29udGV4dF9tYXBwaW5nKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCWludCB0cmFuc2xhdGlvbikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBwY2lfZGV2ICp0bXAsICpwYXJlbnQ7Ci0KLQlyZXQgPSBkb21haW5fY29udGV4dF9tYXBwaW5nX29uZShkb21haW4sIHBjaV9kb21haW5fbnIocGRldi0+YnVzKSwKLQkJCQkJIHBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbiwKLQkJCQkJIHRyYW5zbGF0aW9uKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogZGVwZW5kZW50IGRldmljZSBtYXBwaW5nICovCi0JdG1wID0gcGNpX2ZpbmRfdXBzdHJlYW1fcGNpZV9icmlkZ2UocGRldik7Ci0JaWYgKCF0bXApCi0JCXJldHVybiAwOwotCS8qIFNlY29uZGFyeSBpbnRlcmZhY2UncyBidXMgbnVtYmVyIGFuZCBkZXZmbiAwICovCi0JcGFyZW50ID0gcGRldi0+YnVzLT5zZWxmOwotCXdoaWxlIChwYXJlbnQgIT0gdG1wKSB7Ci0JCXJldCA9IGRvbWFpbl9jb250ZXh0X21hcHBpbmdfb25lKGRvbWFpbiwKLQkJCQkJCSBwY2lfZG9tYWluX25yKHBhcmVudC0+YnVzKSwKLQkJCQkJCSBwYXJlbnQtPmJ1cy0+bnVtYmVyLAotCQkJCQkJIHBhcmVudC0+ZGV2Zm4sIHRyYW5zbGF0aW9uKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXBhcmVudCA9IHBhcmVudC0+YnVzLT5zZWxmOwotCX0KLQlpZiAocGNpX2lzX3BjaWUodG1wKSkgLyogdGhpcyBpcyBhIFBDSWUtdG8tUENJIGJyaWRnZSAqLwotCQlyZXR1cm4gZG9tYWluX2NvbnRleHRfbWFwcGluZ19vbmUoZG9tYWluLAotCQkJCQlwY2lfZG9tYWluX25yKHRtcC0+c3Vib3JkaW5hdGUpLAotCQkJCQl0bXAtPnN1Ym9yZGluYXRlLT5udW1iZXIsIDAsCi0JCQkJCXRyYW5zbGF0aW9uKTsKLQllbHNlIC8qIHRoaXMgaXMgYSBsZWdhY3kgUENJIGJyaWRnZSAqLwotCQlyZXR1cm4gZG9tYWluX2NvbnRleHRfbWFwcGluZ19vbmUoZG9tYWluLAotCQkJCQkJICBwY2lfZG9tYWluX25yKHRtcC0+YnVzKSwKLQkJCQkJCSAgdG1wLT5idXMtPm51bWJlciwKLQkJCQkJCSAgdG1wLT5kZXZmbiwKLQkJCQkJCSAgdHJhbnNsYXRpb24pOwotfQotCi1zdGF0aWMgaW50IGRvbWFpbl9jb250ZXh0X21hcHBlZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBwY2lfZGV2ICp0bXAsICpwYXJlbnQ7Ci0Jc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKLQotCWlvbW11ID0gZGV2aWNlX3RvX2lvbW11KHBjaV9kb21haW5fbnIocGRldi0+YnVzKSwgcGRldi0+YnVzLT5udW1iZXIsCi0JCQkJcGRldi0+ZGV2Zm4pOwotCWlmICghaW9tbXUpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0ID0gZGV2aWNlX2NvbnRleHRfbWFwcGVkKGlvbW11LCBwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4pOwotCWlmICghcmV0KQotCQlyZXR1cm4gcmV0OwotCS8qIGRlcGVuZGVudCBkZXZpY2UgbWFwcGluZyAqLwotCXRtcCA9IHBjaV9maW5kX3Vwc3RyZWFtX3BjaWVfYnJpZGdlKHBkZXYpOwotCWlmICghdG1wKQotCQlyZXR1cm4gcmV0OwotCS8qIFNlY29uZGFyeSBpbnRlcmZhY2UncyBidXMgbnVtYmVyIGFuZCBkZXZmbiAwICovCi0JcGFyZW50ID0gcGRldi0+YnVzLT5zZWxmOwotCXdoaWxlIChwYXJlbnQgIT0gdG1wKSB7Ci0JCXJldCA9IGRldmljZV9jb250ZXh0X21hcHBlZChpb21tdSwgcGFyZW50LT5idXMtPm51bWJlciwKLQkJCQkJICAgIHBhcmVudC0+ZGV2Zm4pOwotCQlpZiAoIXJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXBhcmVudCA9IHBhcmVudC0+YnVzLT5zZWxmOwotCX0KLQlpZiAocGNpX2lzX3BjaWUodG1wKSkKLQkJcmV0dXJuIGRldmljZV9jb250ZXh0X21hcHBlZChpb21tdSwgdG1wLT5zdWJvcmRpbmF0ZS0+bnVtYmVyLAotCQkJCQkgICAgIDApOwotCWVsc2UKLQkJcmV0dXJuIGRldmljZV9jb250ZXh0X21hcHBlZChpb21tdSwgdG1wLT5idXMtPm51bWJlciwKLQkJCQkJICAgICB0bXAtPmRldmZuKTsKLX0KLQotLyogUmV0dXJucyBhIG51bWJlciBvZiBWVEQgcGFnZXMsIGJ1dCBhbGlnbmVkIHRvIE1NIHBhZ2Ugc2l6ZSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFsaWduZWRfbnJwYWdlcyh1bnNpZ25lZCBsb25nIGhvc3RfYWRkciwKLQkJCQkJICAgIHNpemVfdCBzaXplKQotewotCWhvc3RfYWRkciAmPSB+UEFHRV9NQVNLOwotCXJldHVybiBQQUdFX0FMSUdOKGhvc3RfYWRkciArIHNpemUpID4+IFZURF9QQUdFX1NISUZUOwotfQotCi0vKiBSZXR1cm4gbGFyZ2VzdCBwb3NzaWJsZSBzdXBlcnBhZ2UgbGV2ZWwgZm9yIGEgZ2l2ZW4gbWFwcGluZyAqLwotc3RhdGljIGlubGluZSBpbnQgaGFyZHdhcmVfbGFyZ2VwYWdlX2NhcHMoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCi0JCQkJCSAgdW5zaWduZWQgbG9uZyBpb3ZfcGZuLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGh5X3BmbiwKLQkJCQkJICB1bnNpZ25lZCBsb25nIHBhZ2VzKQotewotCWludCBzdXBwb3J0LCBsZXZlbCA9IDE7Ci0JdW5zaWduZWQgbG9uZyBwZm5tZXJnZTsKLQotCXN1cHBvcnQgPSBkb21haW4tPmlvbW11X3N1cGVycGFnZTsKLQotCS8qIFRvIHVzZSBhIGxhcmdlIHBhZ2UsIHRoZSB2aXJ0dWFsICphbmQqIHBoeXNpY2FsIGFkZHJlc3NlcwotCSAgIG11c3QgYmUgYWxpZ25lZCB0byAyTWlCLzFHaUIvZXRjLiBMb3dlciBiaXRzIHNldCBpbiBlaXRoZXIKLQkgICBvZiB0aGVtIHdpbGwgbWVhbiB3ZSBoYXZlIHRvIHVzZSBzbWFsbGVyIHBhZ2VzLiBTbyBqdXN0Ci0JICAgbWVyZ2UgdGhlbSBhbmQgY2hlY2sgYm90aCBhdCBvbmNlLiAqLwotCXBmbm1lcmdlID0gaW92X3BmbiB8IHBoeV9wZm47Ci0KLQl3aGlsZSAoc3VwcG9ydCAmJiAhKHBmbm1lcmdlICYgflZURF9TVFJJREVfTUFTSykpIHsKLQkJcGFnZXMgPj49IFZURF9TVFJJREVfU0hJRlQ7Ci0JCWlmICghcGFnZXMpCi0JCQlicmVhazsKLQkJcGZubWVyZ2UgPj49IFZURF9TVFJJREVfU0hJRlQ7Ci0JCWxldmVsKys7Ci0JCXN1cHBvcnQtLTsKLQl9Ci0JcmV0dXJuIGxldmVsOwotfQotCi1zdGF0aWMgaW50IF9fZG9tYWluX21hcHBpbmcoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92X3BmbiwKLQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBsb25nIHBoeXNfcGZuLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIGludCBwcm90KQotewotCXN0cnVjdCBkbWFfcHRlICpmaXJzdF9wdGUgPSBOVUxMLCAqcHRlID0gTlVMTDsKLQlwaHlzX2FkZHJfdCB1bmluaXRpYWxpemVkX3ZhcihwdGV2YWwpOwotCWludCBhZGRyX3dpZHRoID0gYWdhd190b193aWR0aChkb21haW4tPmFnYXcpIC0gVlREX1BBR0VfU0hJRlQ7Ci0JdW5zaWduZWQgbG9uZyBzZ19yZXM7Ci0JdW5zaWduZWQgaW50IGxhcmdlcGFnZV9sdmwgPSAwOwotCXVuc2lnbmVkIGxvbmcgbHZsX3BhZ2VzID0gMDsKLQotCUJVR19PTihhZGRyX3dpZHRoIDwgQklUU19QRVJfTE9ORyAmJiAoaW92X3BmbiArIG5yX3BhZ2VzIC0gMSkgPj4gYWRkcl93aWR0aCk7Ci0KLQlpZiAoKHByb3QgJiAoRE1BX1BURV9SRUFEfERNQV9QVEVfV1JJVEUpKSA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXByb3QgJj0gRE1BX1BURV9SRUFEIHwgRE1BX1BURV9XUklURSB8IERNQV9QVEVfU05QOwotCi0JaWYgKHNnKQotCQlzZ19yZXMgPSAwOwotCWVsc2UgewotCQlzZ19yZXMgPSBucl9wYWdlcyArIDE7Ci0JCXB0ZXZhbCA9ICgocGh5c19hZGRyX3QpcGh5c19wZm4gPDwgVlREX1BBR0VfU0hJRlQpIHwgcHJvdDsKLQl9Ci0KLQl3aGlsZSAobnJfcGFnZXMgPiAwKSB7Ci0JCXVpbnQ2NF90IHRtcDsKLQotCQlpZiAoIXNnX3JlcykgewotCQkJc2dfcmVzID0gYWxpZ25lZF9ucnBhZ2VzKHNnLT5vZmZzZXQsIHNnLT5sZW5ndGgpOwotCQkJc2ctPmRtYV9hZGRyZXNzID0gKChkbWFfYWRkcl90KWlvdl9wZm4gPDwgVlREX1BBR0VfU0hJRlQpICsgc2ctPm9mZnNldDsKLQkJCXNnLT5kbWFfbGVuZ3RoID0gc2ctPmxlbmd0aDsKLQkJCXB0ZXZhbCA9IHBhZ2VfdG9fcGh5cyhzZ19wYWdlKHNnKSkgfCBwcm90OwotCQkJcGh5c19wZm4gPSBwdGV2YWwgPj4gVlREX1BBR0VfU0hJRlQ7Ci0JCX0KLQotCQlpZiAoIXB0ZSkgewotCQkJbGFyZ2VwYWdlX2x2bCA9IGhhcmR3YXJlX2xhcmdlcGFnZV9jYXBzKGRvbWFpbiwgaW92X3BmbiwgcGh5c19wZm4sIHNnX3Jlcyk7Ci0KLQkJCWZpcnN0X3B0ZSA9IHB0ZSA9IHBmbl90b19kbWFfcHRlKGRvbWFpbiwgaW92X3BmbiwgbGFyZ2VwYWdlX2x2bCk7Ci0JCQlpZiAoIXB0ZSkKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCS8qIEl0IGlzIGxhcmdlIHBhZ2UqLwotCQkJaWYgKGxhcmdlcGFnZV9sdmwgPiAxKQotCQkJCXB0ZXZhbCB8PSBETUFfUFRFX0xBUkdFX1BBR0U7Ci0JCQllbHNlCi0JCQkJcHRldmFsICY9IH4odWludDY0X3QpRE1BX1BURV9MQVJHRV9QQUdFOwotCi0JCX0KLQkJLyogV2UgZG9uJ3QgbmVlZCBsb2NrIGhlcmUsIG5vYm9keSBlbHNlCi0JCSAqIHRvdWNoZXMgdGhlIGlvdmEgcmFuZ2UKLQkJICovCi0JCXRtcCA9IGNtcHhjaGc2NF9sb2NhbCgmcHRlLT52YWwsIDBVTEwsIHB0ZXZhbCk7Ci0JCWlmICh0bXApIHsKLQkJCXN0YXRpYyBpbnQgZHVtcHMgPSA1OwotCQkJcHJpbnRrKEtFUk5fQ1JJVCAiRVJST1I6IERNQSBQVEUgZm9yIHZQRk4gMHglbHggYWxyZWFkeSBzZXQgKHRvICVsbHggbm90ICVsbHgpXG4iLAotCQkJICAgICAgIGlvdl9wZm4sIHRtcCwgKHVuc2lnbmVkIGxvbmcgbG9uZylwdGV2YWwpOwotCQkJaWYgKGR1bXBzKSB7Ci0JCQkJZHVtcHMtLTsKLQkJCQlkZWJ1Z19kbWFfZHVtcF9tYXBwaW5ncyhOVUxMKTsKLQkJCX0KLQkJCVdBUk5fT04oMSk7Ci0JCX0KLQotCQlsdmxfcGFnZXMgPSBsdmxfdG9fbnJfcGFnZXMobGFyZ2VwYWdlX2x2bCk7Ci0KLQkJQlVHX09OKG5yX3BhZ2VzIDwgbHZsX3BhZ2VzKTsKLQkJQlVHX09OKHNnX3JlcyA8IGx2bF9wYWdlcyk7Ci0KLQkJbnJfcGFnZXMgLT0gbHZsX3BhZ2VzOwotCQlpb3ZfcGZuICs9IGx2bF9wYWdlczsKLQkJcGh5c19wZm4gKz0gbHZsX3BhZ2VzOwotCQlwdGV2YWwgKz0gbHZsX3BhZ2VzICogVlREX1BBR0VfU0laRTsKLQkJc2dfcmVzIC09IGx2bF9wYWdlczsKLQotCQkvKiBJZiB0aGUgbmV4dCBQVEUgd291bGQgYmUgdGhlIGZpcnN0IGluIGEgbmV3IHBhZ2UsIHRoZW4gd2UKLQkJICAgbmVlZCB0byBmbHVzaCB0aGUgY2FjaGUgb24gdGhlIGVudHJpZXMgd2UndmUganVzdCB3cml0dGVuLgotCQkgICBBbmQgdGhlbiB3ZSdsbCBuZWVkIHRvIHJlY2FsY3VsYXRlICdwdGUnLCBzbyBjbGVhciBpdCBhbmQKLQkJICAgbGV0IGl0IGdldCBzZXQgYWdhaW4gaW4gdGhlIGlmICghcHRlKSBibG9jayBhYm92ZS4KLQotCQkgICBJZiB3ZSdyZSBkb25lICghbnJfcGFnZXMpIHdlIG5lZWQgdG8gZmx1c2ggdGhlIGNhY2hlIHRvby4KLQotCQkgICBBbHNvIGlmIHdlJ3ZlIGJlZW4gc2V0dGluZyBzdXBlcnBhZ2VzLCB3ZSBtYXkgbmVlZCB0bwotCQkgICByZWNhbGN1bGF0ZSAncHRlJyBhbmQgc3dpdGNoIGJhY2sgdG8gc21hbGxlciBwYWdlcyBmb3IgdGhlCi0JCSAgIGVuZCBvZiB0aGUgbWFwcGluZywgaWYgdGhlIHRyYWlsaW5nIHNpemUgaXMgbm90IGVub3VnaCB0bwotCQkgICB1c2UgYW5vdGhlciBzdXBlcnBhZ2UgKGkuZS4gc2dfcmVzIDwgbHZsX3BhZ2VzKS4gKi8KLQkJcHRlKys7Ci0JCWlmICghbnJfcGFnZXMgfHwgZmlyc3RfcHRlX2luX3BhZ2UocHRlKSB8fAotCQkgICAgKGxhcmdlcGFnZV9sdmwgPiAxICYmIHNnX3JlcyA8IGx2bF9wYWdlcykpIHsKLQkJCWRvbWFpbl9mbHVzaF9jYWNoZShkb21haW4sIGZpcnN0X3B0ZSwKLQkJCQkJICAgKHZvaWQgKilwdGUgLSAodm9pZCAqKWZpcnN0X3B0ZSk7Ci0JCQlwdGUgPSBOVUxMOwotCQl9Ci0KLQkJaWYgKCFzZ19yZXMgJiYgbnJfcGFnZXMpCi0JCQlzZyA9IHNnX25leHQoc2cpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZG9tYWluX3NnX21hcHBpbmcoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92X3BmbiwKLQkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKLQkJCQkgICAgaW50IHByb3QpCi17Ci0JcmV0dXJuIF9fZG9tYWluX21hcHBpbmcoZG9tYWluLCBpb3ZfcGZuLCBzZywgMCwgbnJfcGFnZXMsIHByb3QpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkb21haW5fcGZuX21hcHBpbmcoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92X3BmbiwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCi0JCQkJICAgICBpbnQgcHJvdCkKLXsKLQlyZXR1cm4gX19kb21haW5fbWFwcGluZyhkb21haW4sIGlvdl9wZm4sIE5VTEwsIHBoeXNfcGZuLCBucl9wYWdlcywgcHJvdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbW11X2RldGFjaF9kZXYoc3RydWN0IGludGVsX2lvbW11ICppb21tdSwgdTggYnVzLCB1OCBkZXZmbikKLXsKLQlpZiAoIWlvbW11KQotCQlyZXR1cm47Ci0KLQljbGVhcl9jb250ZXh0X3RhYmxlKGlvbW11LCBidXMsIGRldmZuKTsKLQlpb21tdS0+Zmx1c2guZmx1c2hfY29udGV4dChpb21tdSwgMCwgMCwgMCwKLQkJCQkJICAgRE1BX0NDTURfR0xPQkFMX0lOVkwpOwotCWlvbW11LT5mbHVzaC5mbHVzaF9pb3RsYihpb21tdSwgMCwgMCwgMCwgRE1BX1RMQl9HTE9CQUxfRkxVU0gpOwotfQotCi1zdGF0aWMgdm9pZCBkb21haW5fcmVtb3ZlX2Rldl9pbmZvKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKQotewotCXN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8gKmluZm87Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmZG9tYWluLT5kZXZpY2VzKSkgewotCQlpbmZvID0gbGlzdF9lbnRyeShkb21haW4tPmRldmljZXMubmV4dCwKLQkJCXN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8sIGxpbmspOwotCQlsaXN0X2RlbCgmaW5mby0+bGluayk7Ci0JCWxpc3RfZGVsKCZpbmZvLT5nbG9iYWwpOwotCQlpZiAoaW5mby0+ZGV2KQotCQkJaW5mby0+ZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXUgPSBOVUxMOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKLQotCQlpb21tdV9kaXNhYmxlX2Rldl9pb3RsYihpbmZvKTsKLQkJaW9tbXUgPSBkZXZpY2VfdG9faW9tbXUoaW5mby0+c2VnbWVudCwgaW5mby0+YnVzLCBpbmZvLT5kZXZmbik7Ci0JCWlvbW11X2RldGFjaF9kZXYoaW9tbXUsIGluZm8tPmJ1cywgaW5mby0+ZGV2Zm4pOwotCQlmcmVlX2RldmluZm9fbWVtKGluZm8pOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiBmaW5kX2RvbWFpbgotICogTm90ZTogd2UgdXNlIHN0cnVjdCBwY2lfZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXUgc3RvcmVzIHRoZSBpbmZvCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZG1hcl9kb21haW4gKgotZmluZF9kb21haW4oc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW5mbzsKLQotCS8qIE5vIGxvY2sgaGVyZSwgYXNzdW1lcyBubyBkb21haW4gZXhpdCBpbiBub3JtYWwgY2FzZSAqLwotCWluZm8gPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0JaWYgKGluZm8pCi0JCXJldHVybiBpbmZvLT5kb21haW47Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGRvbWFpbiBpcyBpbml0aWFsaXplZCAqLwotc3RhdGljIHN0cnVjdCBkbWFyX2RvbWFpbiAqZ2V0X2RvbWFpbl9mb3JfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZ2F3KQotewotCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLCAqZm91bmQgPSBOVUxMOwotCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7Ci0Jc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOwotCXN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8gKmluZm8sICp0bXA7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldl90bXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgYnVzID0gMCwgZGV2Zm4gPSAwOwotCWludCBzZWdtZW50OwotCWludCByZXQ7Ci0KLQlkb21haW4gPSBmaW5kX2RvbWFpbihwZGV2KTsKLQlpZiAoZG9tYWluKQotCQlyZXR1cm4gZG9tYWluOwotCi0Jc2VnbWVudCA9IHBjaV9kb21haW5fbnIocGRldi0+YnVzKTsKLQotCWRldl90bXAgPSBwY2lfZmluZF91cHN0cmVhbV9wY2llX2JyaWRnZShwZGV2KTsKLQlpZiAoZGV2X3RtcCkgewotCQlpZiAocGNpX2lzX3BjaWUoZGV2X3RtcCkpIHsKLQkJCWJ1cyA9IGRldl90bXAtPnN1Ym9yZGluYXRlLT5udW1iZXI7Ci0JCQlkZXZmbiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlidXMgPSBkZXZfdG1wLT5idXMtPm51bWJlcjsKLQkJCWRldmZuID0gZGV2X3RtcC0+ZGV2Zm47Ci0JCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZkZXZpY2VfZG9tYWluX2xpc3QsIGdsb2JhbCkgewotCQkJaWYgKGluZm8tPnNlZ21lbnQgPT0gc2VnbWVudCAmJgotCQkJICAgIGluZm8tPmJ1cyA9PSBidXMgJiYgaW5mby0+ZGV2Zm4gPT0gZGV2Zm4pIHsKLQkJCQlmb3VuZCA9IGluZm8tPmRvbWFpbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKLQkJLyogcGNpZS1wY2kgYnJpZGdlIGFscmVhZHkgaGFzIGEgZG9tYWluLCB1c2VzIGl0ICovCi0JCWlmIChmb3VuZCkgewotCQkJZG9tYWluID0gZm91bmQ7Ci0JCQlnb3RvIGZvdW5kX2RvbWFpbjsKLQkJfQotCX0KLQotCWRvbWFpbiA9IGFsbG9jX2RvbWFpbigpOwotCWlmICghZG9tYWluKQotCQlnb3RvIGVycm9yOwotCi0JLyogQWxsb2NhdGUgbmV3IGRvbWFpbiBmb3IgdGhlIGRldmljZSAqLwotCWRyaGQgPSBkbWFyX2ZpbmRfbWF0Y2hlZF9kcmhkX3VuaXQocGRldik7Ci0JaWYgKCFkcmhkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSU9NTVU6IGNhbid0IGZpbmQgRE1BUiBmb3IgZGV2aWNlICVzXG4iLAotCQkJcGNpX25hbWUocGRldikpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaW9tbXUgPSBkcmhkLT5pb21tdTsKLQotCXJldCA9IGlvbW11X2F0dGFjaF9kb21haW4oZG9tYWluLCBpb21tdSk7Ci0JaWYgKHJldCkgewotCQlmcmVlX2RvbWFpbl9tZW0oZG9tYWluKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlpZiAoZG9tYWluX2luaXQoZG9tYWluLCBnYXcpKSB7Ci0JCWRvbWFpbl9leGl0KGRvbWFpbik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogcmVnaXN0ZXIgcGNpZS10by1wY2kgZGV2aWNlICovCi0JaWYgKGRldl90bXApIHsKLQkJaW5mbyA9IGFsbG9jX2RldmluZm9fbWVtKCk7Ci0JCWlmICghaW5mbykgewotCQkJZG9tYWluX2V4aXQoZG9tYWluKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJaW5mby0+c2VnbWVudCA9IHNlZ21lbnQ7Ci0JCWluZm8tPmJ1cyA9IGJ1czsKLQkJaW5mby0+ZGV2Zm4gPSBkZXZmbjsKLQkJaW5mby0+ZGV2ID0gTlVMTDsKLQkJaW5mby0+ZG9tYWluID0gZG9tYWluOwotCQkvKiBUaGlzIGRvbWFpbiBpcyBzaGFyZWQgYnkgZGV2aWNlcyB1bmRlciBwMnAgYnJpZGdlICovCi0JCWRvbWFpbi0+ZmxhZ3MgfD0gRE9NQUlOX0ZMQUdfUDJQX01VTFRJUExFX0RFVklDRVM7Ci0KLQkJLyogcGNpZS10by1wY2kgYnJpZGdlIGFscmVhZHkgaGFzIGEgZG9tYWluLCB1c2VzIGl0ICovCi0JCWZvdW5kID0gTlVMTDsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmRldmljZV9kb21haW5fbGlzdCwgZ2xvYmFsKSB7Ci0JCQlpZiAodG1wLT5zZWdtZW50ID09IHNlZ21lbnQgJiYKLQkJCSAgICB0bXAtPmJ1cyA9PSBidXMgJiYgdG1wLT5kZXZmbiA9PSBkZXZmbikgewotCQkJCWZvdW5kID0gdG1wLT5kb21haW47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZvdW5kKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKLQkJCWZyZWVfZGV2aW5mb19tZW0oaW5mbyk7Ci0JCQlkb21haW5fZXhpdChkb21haW4pOwotCQkJZG9tYWluID0gZm91bmQ7Ci0JCX0gZWxzZSB7Ci0JCQlsaXN0X2FkZCgmaW5mby0+bGluaywgJmRvbWFpbi0+ZGV2aWNlcyk7Ci0JCQlsaXN0X2FkZCgmaW5mby0+Z2xvYmFsLCAmZGV2aWNlX2RvbWFpbl9saXN0KTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOwotCQl9Ci0JfQotCi1mb3VuZF9kb21haW46Ci0JaW5mbyA9IGFsbG9jX2RldmluZm9fbWVtKCk7Ci0JaWYgKCFpbmZvKQotCQlnb3RvIGVycm9yOwotCWluZm8tPnNlZ21lbnQgPSBzZWdtZW50OwotCWluZm8tPmJ1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOwotCWluZm8tPmRldmZuID0gcGRldi0+ZGV2Zm47Ci0JaW5mby0+ZGV2ID0gcGRldjsKLQlpbmZvLT5kb21haW4gPSBkb21haW47Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOwotCS8qIHNvbWVib2R5IGlzIGZhc3QgKi8KLQlmb3VuZCA9IGZpbmRfZG9tYWluKHBkZXYpOwotCWlmIChmb3VuZCAhPSBOVUxMKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOwotCQlpZiAoZm91bmQgIT0gZG9tYWluKSB7Ci0JCQlkb21haW5fZXhpdChkb21haW4pOwotCQkJZG9tYWluID0gZm91bmQ7Ci0JCX0KLQkJZnJlZV9kZXZpbmZvX21lbShpbmZvKTsKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0JbGlzdF9hZGQoJmluZm8tPmxpbmssICZkb21haW4tPmRldmljZXMpOwotCWxpc3RfYWRkKCZpbmZvLT5nbG9iYWwsICZkZXZpY2VfZG9tYWluX2xpc3QpOwotCXBkZXYtPmRldi5hcmNoZGF0YS5pb21tdSA9IGluZm87Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGRvbWFpbjsKLWVycm9yOgotCS8qIHJlY2hlY2sgaXQgaGVyZSwgbWF5YmUgb3RoZXJzIHNldCBpdCAqLwotCXJldHVybiBmaW5kX2RvbWFpbihwZGV2KTsKLX0KLQotc3RhdGljIGludCBpb21tdV9pZGVudGl0eV9tYXBwaW5nOwotI2RlZmluZSBJREVOVE1BUF9BTEwJCTEKLSNkZWZpbmUgSURFTlRNQVBfR0ZYCQkyCi0jZGVmaW5lIElERU5UTUFQX0FaQUxJQQkJNAotCi1zdGF0aWMgaW50IGlvbW11X2RvbWFpbl9pZGVudGl0eV9tYXAoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGxvbmcgZW5kKQotewotCXVuc2lnbmVkIGxvbmcgZmlyc3RfdnBmbiA9IHN0YXJ0ID4+IFZURF9QQUdFX1NISUZUOwotCXVuc2lnbmVkIGxvbmcgbGFzdF92cGZuID0gZW5kID4+IFZURF9QQUdFX1NISUZUOwotCi0JaWYgKCFyZXNlcnZlX2lvdmEoJmRvbWFpbi0+aW92YWQsIGRtYV90b19tbV9wZm4oZmlyc3RfdnBmbiksCi0JCQkgIGRtYV90b19tbV9wZm4obGFzdF92cGZuKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJT01NVTogcmVzZXJ2ZSBpb3ZhIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXByX2RlYnVnKCJNYXBwaW5nIHJlc2VydmVkIHJlZ2lvbiAlbGx4LSVsbHggZm9yIGRvbWFpbiAlZFxuIiwKLQkJIHN0YXJ0LCBlbmQsIGRvbWFpbi0+aWQpOwotCS8qCi0JICogUk1SUiByYW5nZSBtaWdodCBoYXZlIG92ZXJsYXAgd2l0aCBwaHlzaWNhbCBtZW1vcnkgcmFuZ2UsCi0JICogY2xlYXIgaXQgZmlyc3QKLQkgKi8KLQlkbWFfcHRlX2NsZWFyX3JhbmdlKGRvbWFpbiwgZmlyc3RfdnBmbiwgbGFzdF92cGZuKTsKLQotCXJldHVybiBkb21haW5fcGZuX21hcHBpbmcoZG9tYWluLCBmaXJzdF92cGZuLCBmaXJzdF92cGZuLAotCQkJCSAgbGFzdF92cGZuIC0gZmlyc3RfdnBmbiArIDEsCi0JCQkJICBETUFfUFRFX1JFQUR8RE1BX1BURV9XUklURSk7Ci19Ci0KLXN0YXRpYyBpbnQgaW9tbXVfcHJlcGFyZV9pZGVudGl0eV9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBlbmQpCi17Ci0Jc3RydWN0IGRtYXJfZG9tYWluICpkb21haW47Ci0JaW50IHJldDsKLQotCWRvbWFpbiA9IGdldF9kb21haW5fZm9yX2RldihwZGV2LCBERUZBVUxUX0RPTUFJTl9BRERSRVNTX1dJRFRIKTsKLQlpZiAoIWRvbWFpbikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBGb3IgX2hhcmR3YXJlXyBwYXNzdGhyb3VnaCwgZG9uJ3QgYm90aGVyLiBCdXQgZm9yIHNvZnR3YXJlCi0JICAgcGFzc3Rocm91Z2gsIHdlIGRvIGl0IGFueXdheSAtLSBpdCBtYXkgaW5kaWNhdGUgYSBtZW1vcnkKLQkgICByYW5nZSB3aGljaCBpcyByZXNlcnZlZCBpbiBFODIwLCBzbyB3aGljaCBkaWRuJ3QgZ2V0IHNldAotCSAgIHVwIHRvIHN0YXJ0IHdpdGggaW4gc2lfZG9tYWluICovCi0JaWYgKGRvbWFpbiA9PSBzaV9kb21haW4gJiYgaHdfcGFzc190aHJvdWdoKSB7Ci0JCXByaW50aygiSWdub3JpbmcgaWRlbnRpdHkgbWFwIGZvciBIVyBwYXNzdGhyb3VnaCBkZXZpY2UgJXMgWzB4JUx4IC0gMHglTHhdXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldiksIHN0YXJ0LCBlbmQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICJJT01NVTogU2V0dGluZyBpZGVudGl0eSBtYXAgZm9yIGRldmljZSAlcyBbMHglTHggLSAweCVMeF1cbiIsCi0JICAgICAgIHBjaV9uYW1lKHBkZXYpLCBzdGFydCwgZW5kKTsKLQkKLQlpZiAoZW5kIDwgc3RhcnQpIHsKLQkJV0FSTigxLCAiWW91ciBCSU9TIGlzIGJyb2tlbjsgUk1SUiBlbmRzIGJlZm9yZSBpdCBzdGFydHMhXG4iCi0JCQkiQklPUyB2ZW5kb3I6ICVzOyBWZXI6ICVzOyBQcm9kdWN0IFZlcnNpb246ICVzXG4iLAotCQkJZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQklPU19WRU5ET1IpLAotCQkJZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQklPU19WRVJTSU9OKSwKLQkJICAgICBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX1ZFUlNJT04pKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlpZiAoZW5kID4+IGFnYXdfdG9fd2lkdGgoZG9tYWluLT5hZ2F3KSkgewotCQlXQVJOKDEsICJZb3VyIEJJT1MgaXMgYnJva2VuOyBSTVJSIGV4Y2VlZHMgcGVybWl0dGVkIGFkZHJlc3Mgd2lkdGggKCVkIGJpdHMpXG4iCi0JCSAgICAgIkJJT1MgdmVuZG9yOiAlczsgVmVyOiAlczsgUHJvZHVjdCBWZXJzaW9uOiAlc1xuIiwKLQkJICAgICBhZ2F3X3RvX3dpZHRoKGRvbWFpbi0+YWdhdyksCi0JCSAgICAgZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQklPU19WRU5ET1IpLAotCQkgICAgIGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JJT1NfVkVSU0lPTiksCi0JCSAgICAgZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9WRVJTSU9OKSk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JcmV0ID0gaW9tbXVfZG9tYWluX2lkZW50aXR5X21hcChkb21haW4sIHN0YXJ0LCBlbmQpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvKiBjb250ZXh0IGVudHJ5IGluaXQgKi8KLQlyZXQgPSBkb21haW5fY29udGV4dF9tYXBwaW5nKGRvbWFpbiwgcGRldiwgQ09OVEVYVF9UVF9NVUxUSV9MRVZFTCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQotCXJldHVybiAwOwotCi0gZXJyb3I6Ci0JZG9tYWluX2V4aXQoZG9tYWluKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpb21tdV9wcmVwYXJlX3JtcnJfZGV2KHN0cnVjdCBkbWFyX3JtcnJfdW5pdCAqcm1yciwKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlpZiAocGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11ID09IERVTU1ZX0RFVklDRV9ET01BSU5fSU5GTykKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlvbW11X3ByZXBhcmVfaWRlbnRpdHlfbWFwKHBkZXYsIHJtcnItPmJhc2VfYWRkcmVzcywKLQkJcm1yci0+ZW5kX2FkZHJlc3MpOwotfQotCi0jaWZkZWYgQ09ORklHX0RNQVJfRkxPUFBZX1dBCi1zdGF0aWMgaW5saW5lIHZvaWQgaW9tbXVfcHJlcGFyZV9pc2Eodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlpbnQgcmV0OwotCi0JcGRldiA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0JSSURHRV9JU0EgPDwgOCwgTlVMTCk7Ci0JaWYgKCFwZGV2KQotCQlyZXR1cm47Ci0KLQlwcmludGsoS0VSTl9JTkZPICJJT01NVTogUHJlcGFyZSAwLTE2TWlCIHVuaXR5IG1hcHBpbmcgZm9yIExQQ1xuIik7Ci0JcmV0ID0gaW9tbXVfcHJlcGFyZV9pZGVudGl0eV9tYXAocGRldiwgMCwgMTYqMTAyNCoxMDI0IC0gMSk7Ci0KLQlpZiAocmV0KQotCQlwcmludGsoS0VSTl9FUlIgIklPTU1VOiBGYWlsZWQgdG8gY3JlYXRlIDAtMTZNaUIgaWRlbnRpdHkgbWFwOyAiCi0JCSAgICAgICAiZmxvcHB5IG1pZ2h0IG5vdCB3b3JrXG4iKTsKLQotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBpb21tdV9wcmVwYXJlX2lzYSh2b2lkKQotewotCXJldHVybjsKLX0KLSNlbmRpZiAvKiAhQ09ORklHX0RNQVJfRkxQWV9XQSAqLwotCi1zdGF0aWMgaW50IG1kX2RvbWFpbl9pbml0KHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLCBpbnQgZ3Vlc3Rfd2lkdGgpOwotCi1zdGF0aWMgaW50IF9faW5pdCBzaV9kb21haW5fd29ya19mbih1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuLCB2b2lkICpkYXRheCkKLXsKLQlpbnQgKnJldCA9IGRhdGF4OwotCi0JKnJldCA9IGlvbW11X2RvbWFpbl9pZGVudGl0eV9tYXAoc2lfZG9tYWluLAotCQkJCQkgKHVpbnQ2NF90KXN0YXJ0X3BmbiA8PCBQQUdFX1NISUZULAotCQkJCQkgKHVpbnQ2NF90KWVuZF9wZm4gPDwgUEFHRV9TSElGVCk7Ci0JcmV0dXJuICpyZXQ7Ci0KLX0KLQotc3RhdGljIGludCBfX2luaXQgc2lfZG9tYWluX2luaXQoaW50IGh3KQotewotCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwotCWludCBuaWQsIHJldCA9IDA7Ci0KLQlzaV9kb21haW4gPSBhbGxvY19kb21haW4oKTsKLQlpZiAoIXNpX2RvbWFpbikKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlwcl9kZWJ1ZygiSWRlbnRpdHkgbWFwcGluZyBkb21haW4gaXMgZG9tYWluICVkXG4iLCBzaV9kb21haW4tPmlkKTsKLQotCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkgewotCQlyZXQgPSBpb21tdV9hdHRhY2hfZG9tYWluKHNpX2RvbWFpbiwgaW9tbXUpOwotCQlpZiAocmV0KSB7Ci0JCQlkb21haW5fZXhpdChzaV9kb21haW4pOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0KLQlpZiAobWRfZG9tYWluX2luaXQoc2lfZG9tYWluLCBERUZBVUxUX0RPTUFJTl9BRERSRVNTX1dJRFRIKSkgewotCQlkb21haW5fZXhpdChzaV9kb21haW4pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlzaV9kb21haW4tPmZsYWdzID0gRE9NQUlOX0ZMQUdfU1RBVElDX0lERU5USVRZOwotCi0JaWYgKGh3KQotCQlyZXR1cm4gMDsKLQotCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgewotCQl3b3JrX3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkLCBzaV9kb21haW5fd29ya19mbiwgJnJldCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkb21haW5fcmVtb3ZlX29uZV9kZXZfaW5mbyhzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwKLQkJCQkJICBzdHJ1Y3QgcGNpX2RldiAqcGRldik7Ci1zdGF0aWMgaW50IGlkZW50aXR5X21hcHBpbmcoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW5mbzsKLQotCWlmIChsaWtlbHkoIWlvbW11X2lkZW50aXR5X21hcHBpbmcpKQotCQlyZXR1cm4gMDsKLQotCWluZm8gPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0JaWYgKGluZm8gJiYgaW5mbyAhPSBEVU1NWV9ERVZJQ0VfRE9NQUlOX0lORk8pCi0JCXJldHVybiAoaW5mby0+ZG9tYWluID09IHNpX2RvbWFpbik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkb21haW5fYWRkX2Rldl9pbmZvKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLAotCQkJICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJICAgICAgIGludCB0cmFuc2xhdGlvbikKLXsKLQlzdHJ1Y3QgZGV2aWNlX2RvbWFpbl9pbmZvICppbmZvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKLQotCWluZm8gPSBhbGxvY19kZXZpbmZvX21lbSgpOwotCWlmICghaW5mbykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXQgPSBkb21haW5fY29udGV4dF9tYXBwaW5nKGRvbWFpbiwgcGRldiwgdHJhbnNsYXRpb24pOwotCWlmIChyZXQpIHsKLQkJZnJlZV9kZXZpbmZvX21lbShpbmZvKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpbmZvLT5zZWdtZW50ID0gcGNpX2RvbWFpbl9ucihwZGV2LT5idXMpOwotCWluZm8tPmJ1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOwotCWluZm8tPmRldmZuID0gcGRldi0+ZGV2Zm47Ci0JaW5mby0+ZGV2ID0gcGRldjsKLQlpbmZvLT5kb21haW4gPSBkb21haW47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGQoJmluZm8tPmxpbmssICZkb21haW4tPmRldmljZXMpOwotCWxpc3RfYWRkKCZpbmZvLT5nbG9iYWwsICZkZXZpY2VfZG9tYWluX2xpc3QpOwotCXBkZXYtPmRldi5hcmNoZGF0YS5pb21tdSA9IGluZm87Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpb21tdV9zaG91bGRfaWRlbnRpdHlfbWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgc3RhcnR1cCkKLXsKLQlpZiAoKGlvbW11X2lkZW50aXR5X21hcHBpbmcgJiBJREVOVE1BUF9BWkFMSUEpICYmIElTX0FaQUxJQShwZGV2KSkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAoKGlvbW11X2lkZW50aXR5X21hcHBpbmcgJiBJREVOVE1BUF9HRlgpICYmIElTX0dGWF9ERVZJQ0UocGRldikpCi0JCXJldHVybiAxOwotCi0JaWYgKCEoaW9tbXVfaWRlbnRpdHlfbWFwcGluZyAmIElERU5UTUFQX0FMTCkpCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiBXZSB3YW50IHRvIHN0YXJ0IG9mZiB3aXRoIGFsbCBkZXZpY2VzIGluIHRoZSAxOjEgZG9tYWluLCBhbmQKLQkgKiB0YWtlIHRoZW0gb3V0IGxhdGVyIGlmIHdlIGZpbmQgdGhleSBjYW4ndCBhY2Nlc3MgYWxsIG9mIG1lbW9yeS4KLQkgKgotCSAqIEhvd2V2ZXIsIHdlIGNhbid0IGRvIHRoaXMgZm9yIFBDSSBkZXZpY2VzIGJlaGluZCBicmlkZ2VzLAotCSAqIGJlY2F1c2UgYWxsIFBDSSBkZXZpY2VzIGJlaGluZCB0aGUgc2FtZSBicmlkZ2Ugd2lsbCBlbmQgdXAKLQkgKiB3aXRoIHRoZSBzYW1lIHNvdXJjZS1pZCBvbiB0aGVpciB0cmFuc2FjdGlvbnMuCi0JICoKLQkgKiBQcmFjdGljYWxseSBzcGVha2luZywgd2UgY2FuJ3QgY2hhbmdlIHRoaW5ncyBhcm91bmQgZm9yIHRoZXNlCi0JICogZGV2aWNlcyBhdCBydW4tdGltZSwgYmVjYXVzZSB3ZSBjYW4ndCBiZSBzdXJlIHRoZXJlJ2xsIGJlIG5vCi0JICogRE1BIHRyYW5zYWN0aW9ucyBpbiBmbGlnaHQgZm9yIGFueSBvZiB0aGVpciBzaWJsaW5ncy4KLQkgKiAKLQkgKiBTbyBQQ0kgZGV2aWNlcyAodW5sZXNzIHRoZXkncmUgb24gdGhlIHJvb3QgYnVzKSBhcyB3ZWxsIGFzCi0JICogdGhlaXIgcGFyZW50IFBDSS1QQ0kgb3IgUENJZS1QQ0kgYnJpZGdlcyBtdXN0IGJlIGxlZnQgX291dF8gb2YKLQkgKiB0aGUgMToxIGRvbWFpbiwganVzdCBpbiBfY2FzZV8gb25lIG9mIHRoZWlyIHNpYmxpbmdzIHR1cm5zIG91dAotCSAqIG5vdCB0byBiZSBhYmxlIHRvIG1hcCBhbGwgb2YgbWVtb3J5LgotCSAqLwotCWlmICghcGNpX2lzX3BjaWUocGRldikpIHsKLQkJaWYgKCFwY2lfaXNfcm9vdF9idXMocGRldi0+YnVzKSkKLQkJCXJldHVybiAwOwotCQlpZiAocGRldi0+Y2xhc3MgPj4gOCA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkKLQkJCXJldHVybiAwOwotCX0gZWxzZSBpZiAocGRldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9QQ0lfQlJJREdFKQotCQlyZXR1cm4gMDsKLQotCS8qIAotCSAqIEF0IGJvb3QgdGltZSwgd2UgZG9uJ3QgeWV0IGtub3cgaWYgZGV2aWNlcyB3aWxsIGJlIDY0LWJpdCBjYXBhYmxlLgotCSAqIEFzc3VtZSB0aGF0IHRoZXkgd2lsbCAtLSBpZiB0aGV5IHR1cm4gb3V0IG5vdCB0byBiZSwgdGhlbiB3ZSBjYW4gCi0JICogdGFrZSB0aGVtIG91dCBvZiB0aGUgMToxIGRvbWFpbiBsYXRlci4KLQkgKi8KLQlpZiAoIXN0YXJ0dXApIHsKLQkJLyoKLQkJICogSWYgdGhlIGRldmljZSdzIGRtYV9tYXNrIGlzIGxlc3MgdGhhbiB0aGUgc3lzdGVtJ3MgbWVtb3J5Ci0JCSAqIHNpemUgdGhlbiB0aGlzIGlzIG5vdCBhIGNhbmRpZGF0ZSBmb3IgaWRlbnRpdHkgbWFwcGluZy4KLQkJICovCi0JCXU2NCBkbWFfbWFzayA9IHBkZXYtPmRtYV9tYXNrOwotCi0JCWlmIChwZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgJiYKLQkJICAgIHBkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA8IGRtYV9tYXNrKQotCQkJZG1hX21hc2sgPSBwZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2s7Ci0KLQkJcmV0dXJuIGRtYV9tYXNrID49IGRtYV9nZXRfcmVxdWlyZWRfbWFzaygmcGRldi0+ZGV2KTsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW9tbXVfcHJlcGFyZV9zdGF0aWNfaWRlbnRpdHlfbWFwcGluZyhpbnQgaHcpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzaV9kb21haW5faW5pdChodyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJLyogU2tpcCBIb3N0L1BDSSBCcmlkZ2UgZGV2aWNlcyAqLwotCQlpZiAoSVNfQlJJREdFX0hPU1RfREVWSUNFKHBkZXYpKQotCQkJY29udGludWU7Ci0JCWlmIChpb21tdV9zaG91bGRfaWRlbnRpdHlfbWFwKHBkZXYsIDEpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJJT01NVTogJXMgaWRlbnRpdHkgbWFwcGluZyBmb3IgZGV2aWNlICVzXG4iLAotCQkJICAgICAgIGh3ID8gImhhcmR3YXJlIiA6ICJzb2Z0d2FyZSIsIHBjaV9uYW1lKHBkZXYpKTsKLQotCQkJcmV0ID0gZG9tYWluX2FkZF9kZXZfaW5mbyhzaV9kb21haW4sIHBkZXYsCi0JCQkJCQkgICAgIGh3ID8gQ09OVEVYVF9UVF9QQVNTX1RIUk9VR0ggOgotCQkJCQkJICAgICBDT05URVhUX1RUX01VTFRJX0xFVkVMKTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2RtYXJzKHZvaWQpCi17Ci0Jc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOwotCXN0cnVjdCBkbWFyX3JtcnJfdW5pdCAqcm1ycjsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwotCWludCBpLCByZXQ7Ci0KLQkvKgotCSAqIGZvciBlYWNoIGRyaGQKLQkgKiAgICBhbGxvY2F0ZSByb290Ci0JICogICAgaW5pdGlhbGl6ZSBhbmQgcHJvZ3JhbSByb290IGVudHJ5IHRvIG5vdCBwcmVzZW50Ci0JICogZW5kZm9yCi0JICovCi0JZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKLQkJZ19udW1fb2ZfaW9tbXVzKys7Ci0JCS8qCi0JCSAqIGxvY2sgbm90IG5lZWRlZCBhcyB0aGlzIGlzIG9ubHkgaW5jcmVtZW50ZWQgaW4gdGhlIHNpbmdsZQotCQkgKiB0aHJlYWRlZCBrZXJuZWwgX19pbml0IGNvZGUgcGF0aCBhbGwgb3RoZXIgYWNjZXNzIGFyZSByZWFkCi0JCSAqIG9ubHkKLQkJICovCi0JfQotCi0JZ19pb21tdXMgPSBrY2FsbG9jKGdfbnVtX29mX2lvbW11cywgc2l6ZW9mKHN0cnVjdCBpbnRlbF9pb21tdSAqKSwKLQkJCUdGUF9LRVJORUwpOwotCWlmICghZ19pb21tdXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJBbGxvY2F0aW5nIGdsb2JhbCBpb21tdSBhcnJheSBmYWlsZWRcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWRlZmVycmVkX2ZsdXNoID0ga3phbGxvYyhnX251bV9vZl9pb21tdXMgKgotCQlzaXplb2Yoc3RydWN0IGRlZmVycmVkX2ZsdXNoX3RhYmxlcyksIEdGUF9LRVJORUwpOwotCWlmICghZGVmZXJyZWRfZmx1c2gpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgewotCQlpZiAoZHJoZC0+aWdub3JlZCkKLQkJCWNvbnRpbnVlOwotCi0JCWlvbW11ID0gZHJoZC0+aW9tbXU7Ci0JCWdfaW9tbXVzW2lvbW11LT5zZXFfaWRdID0gaW9tbXU7Ci0KLQkJcmV0ID0gaW9tbXVfaW5pdF9kb21haW5zKGlvbW11KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3I7Ci0KLQkJLyoKLQkJICogVEJEOgotCQkgKiB3ZSBjb3VsZCBzaGFyZSB0aGUgc2FtZSByb290ICYgY29udGV4dCB0YWJsZXMKLQkJICogYW1vbmcgYWxsIElPTU1VJ3MuIE5lZWQgdG8gU3BsaXQgaXQgbGF0ZXIuCi0JCSAqLwotCQlyZXQgPSBpb21tdV9hbGxvY19yb290X2VudHJ5KGlvbW11KTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJJT01NVTogYWxsb2NhdGUgcm9vdCBlbnRyeSBmYWlsZWRcbiIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlpZiAoIWVjYXBfcGFzc190aHJvdWdoKGlvbW11LT5lY2FwKSkKLQkJCWh3X3Bhc3NfdGhyb3VnaCA9IDA7Ci0JfQotCi0JLyoKLQkgKiBTdGFydCBmcm9tIHRoZSBzYW5lIGlvbW11IGhhcmR3YXJlIHN0YXRlLgotCSAqLwotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7Ci0JCWlmIChkcmhkLT5pZ25vcmVkKQotCQkJY29udGludWU7Ci0KLQkJaW9tbXUgPSBkcmhkLT5pb21tdTsKLQotCQkvKgotCQkgKiBJZiB0aGUgcXVldWVkIGludmFsaWRhdGlvbiBpcyBhbHJlYWR5IGluaXRpYWxpemVkIGJ5IHVzCi0JCSAqIChmb3IgZXhhbXBsZSwgd2hpbGUgZW5hYmxpbmcgaW50ZXJydXB0LXJlbWFwcGluZykgdGhlbgotCQkgKiB3ZSBnb3QgdGhlIHRoaW5ncyBhbHJlYWR5IHJvbGxpbmcgZnJvbSBhIHNhbmUgc3RhdGUuCi0JCSAqLwotCQlpZiAoaW9tbXUtPnFpKQotCQkJY29udGludWU7Ci0KLQkJLyoKLQkJICogQ2xlYXIgYW55IHByZXZpb3VzIGZhdWx0cy4KLQkJICovCi0JCWRtYXJfZmF1bHQoLTEsIGlvbW11KTsKLQkJLyoKLQkJICogRGlzYWJsZSBxdWV1ZWQgaW52YWxpZGF0aW9uIGlmIHN1cHBvcnRlZCBhbmQgYWxyZWFkeSBlbmFibGVkCi0JCSAqIGJlZm9yZSBPUyBoYW5kb3Zlci4KLQkJICovCi0JCWRtYXJfZGlzYWJsZV9xaShpb21tdSk7Ci0JfQotCi0JZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKLQkJaWYgKGRyaGQtPmlnbm9yZWQpCi0JCQljb250aW51ZTsKLQotCQlpb21tdSA9IGRyaGQtPmlvbW11OwotCi0JCWlmIChkbWFyX2VuYWJsZV9xaShpb21tdSkpIHsKLQkJCS8qCi0JCQkgKiBRdWV1ZWQgSW52YWxpZGF0ZSBub3QgZW5hYmxlZCwgdXNlIFJlZ2lzdGVyIEJhc2VkCi0JCQkgKiBJbnZhbGlkYXRlCi0JCQkgKi8KLQkJCWlvbW11LT5mbHVzaC5mbHVzaF9jb250ZXh0ID0gX19pb21tdV9mbHVzaF9jb250ZXh0OwotCQkJaW9tbXUtPmZsdXNoLmZsdXNoX2lvdGxiID0gX19pb21tdV9mbHVzaF9pb3RsYjsKLQkJCXByaW50ayhLRVJOX0lORk8gIklPTU1VICVkIDB4JUx4OiB1c2luZyBSZWdpc3RlciBiYXNlZCAiCi0JCQkgICAgICAgImludmFsaWRhdGlvblxuIiwKLQkJCQlpb21tdS0+c2VxX2lkLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZHJoZC0+cmVnX2Jhc2VfYWRkcik7Ci0JCX0gZWxzZSB7Ci0JCQlpb21tdS0+Zmx1c2guZmx1c2hfY29udGV4dCA9IHFpX2ZsdXNoX2NvbnRleHQ7Ci0JCQlpb21tdS0+Zmx1c2guZmx1c2hfaW90bGIgPSBxaV9mbHVzaF9pb3RsYjsKLQkJCXByaW50ayhLRVJOX0lORk8gIklPTU1VICVkIDB4JUx4OiB1c2luZyBRdWV1ZWQgIgotCQkJICAgICAgICJpbnZhbGlkYXRpb25cbiIsCi0JCQkJaW9tbXUtPnNlcV9pZCwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRyaGQtPnJlZ19iYXNlX2FkZHIpOwotCQl9Ci0JfQotCi0JaWYgKGlvbW11X3Bhc3NfdGhyb3VnaCkKLQkJaW9tbXVfaWRlbnRpdHlfbWFwcGluZyB8PSBJREVOVE1BUF9BTEw7Ci0KLSNpZmRlZiBDT05GSUdfRE1BUl9CUk9LRU5fR0ZYX1dBCi0JaW9tbXVfaWRlbnRpdHlfbWFwcGluZyB8PSBJREVOVE1BUF9HRlg7Ci0jZW5kaWYKLQotCWNoZWNrX3R5bGVyc2J1cmdfaXNvY2goKTsKLQotCS8qCi0JICogSWYgcGFzcyB0aHJvdWdoIGlzIG5vdCBzZXQgb3Igbm90IGVuYWJsZWQsIHNldHVwIGNvbnRleHQgZW50cmllcyBmb3IKLQkgKiBpZGVudGl0eSBtYXBwaW5ncyBmb3Igcm1yciwgZ2Z4LCBhbmQgaXNhIGFuZCBtYXkgZmFsbCBiYWNrIHRvIHN0YXRpYwotCSAqIGlkZW50aXR5IG1hcHBpbmcgaWYgaW9tbXVfaWRlbnRpdHlfbWFwcGluZyBpcyBzZXQuCi0JICovCi0JaWYgKGlvbW11X2lkZW50aXR5X21hcHBpbmcpIHsKLQkJcmV0ID0gaW9tbXVfcHJlcGFyZV9zdGF0aWNfaWRlbnRpdHlfbWFwcGluZyhod19wYXNzX3Rocm91Z2gpOwotCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoS0VSTl9DUklUICJGYWlsZWQgdG8gc2V0dXAgSU9NTVUgcGFzcy10aHJvdWdoXG4iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBGb3IgZWFjaCBybXJyCi0JICogICBmb3IgZWFjaCBkZXYgYXR0YWNoZWQgdG8gcm1ycgotCSAqICAgZG8KLQkgKiAgICAgbG9jYXRlIGRyaGQgZm9yIGRldiwgYWxsb2MgZG9tYWluIGZvciBkZXYKLQkgKiAgICAgYWxsb2NhdGUgZnJlZSBkb21haW4KLQkgKiAgICAgYWxsb2NhdGUgcGFnZSB0YWJsZSBlbnRyaWVzIGZvciBybXJyCi0JICogICAgIGlmIGNvbnRleHQgbm90IGFsbG9jYXRlZCBmb3IgYnVzCi0JICogICAgICAgICAgIGFsbG9jYXRlIGFuZCBpbml0IGNvbnRleHQKLQkgKiAgICAgICAgICAgc2V0IHByZXNlbnQgaW4gcm9vdCB0YWJsZSBmb3IgdGhpcyBidXMKLQkgKiAgICAgaW5pdCBjb250ZXh0IHdpdGggZG9tYWluLCB0cmFuc2xhdGlvbiBldGMKLQkgKiAgICBlbmRmb3IKLQkgKiBlbmRmb3IKLQkgKi8KLQlwcmludGsoS0VSTl9JTkZPICJJT01NVTogU2V0dGluZyBSTVJSOlxuIik7Ci0JZm9yX2VhY2hfcm1ycl91bml0cyhybXJyKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBybXJyLT5kZXZpY2VzX2NudDsgaSsrKSB7Ci0JCQlwZGV2ID0gcm1yci0+ZGV2aWNlc1tpXTsKLQkJCS8qCi0JCQkgKiBzb21lIEJJT1MgbGlzdHMgbm9uLWV4aXN0IGRldmljZXMgaW4gRE1BUgotCQkJICogdGFibGUuCi0JCQkgKi8KLQkJCWlmICghcGRldikKLQkJCQljb250aW51ZTsKLQkJCXJldCA9IGlvbW11X3ByZXBhcmVfcm1ycl9kZXYocm1yciwgcGRldik7Ci0JCQlpZiAocmV0KQotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAgICAgICAiSU9NTVU6IG1hcHBpbmcgcmVzZXJ2ZWQgcmVnaW9uIGZhaWxlZFxuIik7Ci0JCX0KLQl9Ci0KLQlpb21tdV9wcmVwYXJlX2lzYSgpOwotCi0JLyoKLQkgKiBmb3IgZWFjaCBkcmhkCi0JICogICBlbmFibGUgZmF1bHQgbG9nCi0JICogICBnbG9iYWwgaW52YWxpZGF0ZSBjb250ZXh0IGNhY2hlCi0JICogICBnbG9iYWwgaW52YWxpZGF0ZSBpb3RsYgotCSAqICAgZW5hYmxlIHRyYW5zbGF0aW9uCi0JICovCi0JZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKLQkJaWYgKGRyaGQtPmlnbm9yZWQpIHsKLQkJCS8qCi0JCQkgKiB3ZSBhbHdheXMgaGF2ZSB0byBkaXNhYmxlIFBNUnMgb3IgRE1BIG1heSBmYWlsIG9uCi0JCQkgKiB0aGlzIGRldmljZQotCQkJICovCi0JCQlpZiAoZm9yY2Vfb24pCi0JCQkJaW9tbXVfZGlzYWJsZV9wcm90ZWN0X21lbV9yZWdpb25zKGRyaGQtPmlvbW11KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlvbW11ID0gZHJoZC0+aW9tbXU7Ci0KLQkJaW9tbXVfZmx1c2hfd3JpdGVfYnVmZmVyKGlvbW11KTsKLQotCQlyZXQgPSBkbWFyX3NldF9pbnRlcnJ1cHQoaW9tbXUpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJvcjsKLQotCQlpb21tdV9zZXRfcm9vdF9lbnRyeShpb21tdSk7Ci0KLQkJaW9tbXUtPmZsdXNoLmZsdXNoX2NvbnRleHQoaW9tbXUsIDAsIDAsIDAsIERNQV9DQ01EX0dMT0JBTF9JTlZMKTsKLQkJaW9tbXUtPmZsdXNoLmZsdXNoX2lvdGxiKGlvbW11LCAwLCAwLCAwLCBETUFfVExCX0dMT0JBTF9GTFVTSCk7Ci0KLQkJcmV0ID0gaW9tbXVfZW5hYmxlX3RyYW5zbGF0aW9uKGlvbW11KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3I7Ci0KLQkJaW9tbXVfZGlzYWJsZV9wcm90ZWN0X21lbV9yZWdpb25zKGlvbW11KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLWVycm9yOgotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7Ci0JCWlmIChkcmhkLT5pZ25vcmVkKQotCQkJY29udGludWU7Ci0JCWlvbW11ID0gZHJoZC0+aW9tbXU7Ci0JCWZyZWVfaW9tbXUoaW9tbXUpOwotCX0KLQlrZnJlZShnX2lvbW11cyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogVGhpcyB0YWtlcyBhIG51bWJlciBvZiBfTU1fIHBhZ2VzLCBub3QgVlREIHBhZ2VzICovCi1zdGF0aWMgc3RydWN0IGlvdmEgKmludGVsX2FsbG9jX2lvdmEoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIG5ycGFnZXMsIHVpbnQ2NF90IGRtYV9tYXNrKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBpb3ZhICppb3ZhID0gTlVMTDsKLQotCS8qIFJlc3RyaWN0IGRtYV9tYXNrIHRvIHRoZSB3aWR0aCB0aGF0IHRoZSBpb21tdSBjYW4gaGFuZGxlICovCi0JZG1hX21hc2sgPSBtaW5fdCh1aW50NjRfdCwgRE9NQUlOX01BWF9BRERSKGRvbWFpbi0+Z2F3KSwgZG1hX21hc2spOwotCi0JaWYgKCFkbWFyX2ZvcmNlZGFjICYmIGRtYV9tYXNrID4gRE1BX0JJVF9NQVNLKDMyKSkgewotCQkvKgotCQkgKiBGaXJzdCB0cnkgdG8gYWxsb2NhdGUgYW4gaW8gdmlydHVhbCBhZGRyZXNzIGluCi0JCSAqIERNQV9CSVRfTUFTSygzMikgYW5kIGlmIHRoYXQgZmFpbHMgdGhlbiB0cnkgYWxsb2NhdGluZwotCQkgKiBmcm9tIGhpZ2hlciByYW5nZQotCQkgKi8KLQkJaW92YSA9IGFsbG9jX2lvdmEoJmRvbWFpbi0+aW92YWQsIG5ycGFnZXMsCi0JCQkJICBJT1ZBX1BGTihETUFfQklUX01BU0soMzIpKSwgMSk7Ci0JCWlmIChpb3ZhKQotCQkJcmV0dXJuIGlvdmE7Ci0JfQotCWlvdmEgPSBhbGxvY19pb3ZhKCZkb21haW4tPmlvdmFkLCBucnBhZ2VzLCBJT1ZBX1BGTihkbWFfbWFzayksIDEpOwotCWlmICh1bmxpa2VseSghaW92YSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJBbGxvY2F0aW5nICVsZC1wYWdlIGlvdmEgZm9yICVzIGZhaWxlZCIsCi0JCSAgICAgICBucnBhZ2VzLCBwY2lfbmFtZShwZGV2KSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHVybiBpb3ZhOwotfQotCi1zdGF0aWMgc3RydWN0IGRtYXJfZG9tYWluICpfX2dldF92YWxpZF9kb21haW5fZm9yX2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbjsKLQlpbnQgcmV0OwotCi0JZG9tYWluID0gZ2V0X2RvbWFpbl9mb3JfZGV2KHBkZXYsCi0JCQlERUZBVUxUX0RPTUFJTl9BRERSRVNTX1dJRFRIKTsKLQlpZiAoIWRvbWFpbikgewotCQlwcmludGsoS0VSTl9FUlIKLQkJCSJBbGxvY2F0aW5nIGRvbWFpbiBmb3IgJXMgZmFpbGVkIiwgcGNpX25hbWUocGRldikpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgY29udGV4dCBtYXBwaW5nIGlzIG9rICovCi0JaWYgKHVubGlrZWx5KCFkb21haW5fY29udGV4dF9tYXBwZWQocGRldikpKSB7Ci0JCXJldCA9IGRvbWFpbl9jb250ZXh0X21hcHBpbmcoZG9tYWluLCBwZGV2LAotCQkJCQkgICAgIENPTlRFWFRfVFRfTVVMVElfTEVWRUwpOwotCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCQkiRG9tYWluIGNvbnRleHQgbWFwIGZvciAlcyBmYWlsZWQiLAotCQkJCXBjaV9uYW1lKHBkZXYpKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCi0JcmV0dXJuIGRvbWFpbjsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZG1hcl9kb21haW4gKmdldF92YWxpZF9kb21haW5fZm9yX2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8gKmluZm87Ci0KLQkvKiBObyBsb2NrIGhlcmUsIGFzc3VtZXMgbm8gZG9tYWluIGV4aXQgaW4gbm9ybWFsIGNhc2UgKi8KLQlpbmZvID0gZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0JaWYgKGxpa2VseShpbmZvKSkKLQkJcmV0dXJuIGluZm8tPmRvbWFpbjsKLQotCXJldHVybiBfX2dldF92YWxpZF9kb21haW5fZm9yX2RldihkZXYpOwotfQotCi1zdGF0aWMgaW50IGlvbW11X2R1bW15KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXJldHVybiBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXUgPT0gRFVNTVlfREVWSUNFX0RPTUFJTl9JTkZPOwotfQotCi0vKiBDaGVjayBpZiB0aGUgcGRldiBuZWVkcyB0byBnbyB0aHJvdWdoIG5vbi1pZGVudGl0eSBtYXAgYW5kIHVubWFwIHByb2Nlc3MuKi8KLXN0YXRpYyBpbnQgaW9tbXVfbm9fbWFwcGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0JaW50IGZvdW5kOwotCi0JaWYgKHVubGlrZWx5KGRldi0+YnVzICE9ICZwY2lfYnVzX3R5cGUpKQotCQlyZXR1cm4gMTsKLQotCXBkZXYgPSB0b19wY2lfZGV2KGRldik7Ci0JaWYgKGlvbW11X2R1bW15KHBkZXYpKQotCQlyZXR1cm4gMTsKLQotCWlmICghaW9tbXVfaWRlbnRpdHlfbWFwcGluZykKLQkJcmV0dXJuIDA7Ci0KLQlmb3VuZCA9IGlkZW50aXR5X21hcHBpbmcocGRldik7Ci0JaWYgKGZvdW5kKSB7Ci0JCWlmIChpb21tdV9zaG91bGRfaWRlbnRpdHlfbWFwKHBkZXYsIDApKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UgewotCQkJLyoKLQkJCSAqIDMyIGJpdCBETUEgaXMgcmVtb3ZlZCBmcm9tIHNpX2RvbWFpbiBhbmQgZmFsbCBiYWNrCi0JCQkgKiB0byBub24taWRlbnRpdHkgbWFwcGluZy4KLQkJCSAqLwotCQkJZG9tYWluX3JlbW92ZV9vbmVfZGV2X2luZm8oc2lfZG9tYWluLCBwZGV2KTsKLQkJCXByaW50ayhLRVJOX0lORk8gIjMyYml0ICVzIHVzZXMgbm9uLWlkZW50aXR5IG1hcHBpbmdcbiIsCi0JCQkgICAgICAgcGNpX25hbWUocGRldikpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiBJbiBjYXNlIG9mIGEgZGV0YWNoZWQgNjQgYml0IERNQSBkZXZpY2UgZnJvbSB2bSwgdGhlIGRldmljZQotCQkgKiBpcyBwdXQgaW50byBzaV9kb21haW4gZm9yIGlkZW50aXR5IG1hcHBpbmcuCi0JCSAqLwotCQlpZiAoaW9tbXVfc2hvdWxkX2lkZW50aXR5X21hcChwZGV2LCAwKSkgewotCQkJaW50IHJldDsKLQkJCXJldCA9IGRvbWFpbl9hZGRfZGV2X2luZm8oc2lfZG9tYWluLCBwZGV2LAotCQkJCQkJICBod19wYXNzX3Rocm91Z2ggPwotCQkJCQkJICBDT05URVhUX1RUX1BBU1NfVEhST1VHSCA6Ci0JCQkJCQkgIENPTlRFWFRfVFRfTVVMVElfTEVWRUwpOwotCQkJaWYgKCFyZXQpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICI2NGJpdCAlcyB1c2VzIGlkZW50aXR5IG1hcHBpbmdcbiIsCi0JCQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgZG1hX2FkZHJfdCBfX2ludGVsX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIHBoeXNfYWRkcl90IHBhZGRyLAotCQkJCSAgICAgc2l6ZV90IHNpemUsIGludCBkaXIsIHU2NCBkbWFfbWFzaykKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaHdkZXYpOwotCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluOwotCXBoeXNfYWRkcl90IHN0YXJ0X3BhZGRyOwotCXN0cnVjdCBpb3ZhICppb3ZhOwotCWludCBwcm90ID0gMDsKLQlpbnQgcmV0OwotCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7Ci0JdW5zaWduZWQgbG9uZyBwYWRkcl9wZm4gPSBwYWRkciA+PiBQQUdFX1NISUZUOwotCi0JQlVHX09OKGRpciA9PSBETUFfTk9ORSk7Ci0KLQlpZiAoaW9tbXVfbm9fbWFwcGluZyhod2RldikpCi0JCXJldHVybiBwYWRkcjsKLQotCWRvbWFpbiA9IGdldF92YWxpZF9kb21haW5fZm9yX2RldihwZGV2KTsKLQlpZiAoIWRvbWFpbikKLQkJcmV0dXJuIDA7Ci0KLQlpb21tdSA9IGRvbWFpbl9nZXRfaW9tbXUoZG9tYWluKTsKLQlzaXplID0gYWxpZ25lZF9ucnBhZ2VzKHBhZGRyLCBzaXplKTsKLQotCWlvdmEgPSBpbnRlbF9hbGxvY19pb3ZhKGh3ZGV2LCBkb21haW4sIGRtYV90b19tbV9wZm4oc2l6ZSksIGRtYV9tYXNrKTsKLQlpZiAoIWlvdmEpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvKgotCSAqIENoZWNrIGlmIERNQVIgc3VwcG9ydHMgemVyby1sZW5ndGggcmVhZHMgb24gd3JpdGUgb25seQotCSAqIG1hcHBpbmdzLi4KLQkgKi8KLQlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFMIHx8IFwKLQkJCSFjYXBfemxyKGlvbW11LT5jYXApKQotCQlwcm90IHw9IERNQV9QVEVfUkVBRDsKLQlpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpCi0JCXByb3QgfD0gRE1BX1BURV9XUklURTsKLQkvKgotCSAqIHBhZGRyIC0gKHBhZGRyICsgc2l6ZSkgbWlnaHQgYmUgcGFydGlhbCBwYWdlLCB3ZSBzaG91bGQgbWFwIHRoZSB3aG9sZQotCSAqIHBhZ2UuICBOb3RlOiBpZiB0d28gcGFydCBvZiBvbmUgcGFnZSBhcmUgc2VwYXJhdGVseSBtYXBwZWQsIHdlCi0JICogbWlnaHQgaGF2ZSB0d28gZ3Vlc3RfYWRkciBtYXBwaW5nIHRvIHRoZSBzYW1lIGhvc3QgcGFkZHIsIGJ1dCB0aGlzCi0JICogaXMgbm90IGEgYmlnIHByb2JsZW0KLQkgKi8KLQlyZXQgPSBkb21haW5fcGZuX21hcHBpbmcoZG9tYWluLCBtbV90b19kbWFfcGZuKGlvdmEtPnBmbl9sbyksCi0JCQkJIG1tX3RvX2RtYV9wZm4ocGFkZHJfcGZuKSwgc2l6ZSwgcHJvdCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQotCS8qIGl0J3MgYSBub24tcHJlc2VudCB0byBwcmVzZW50IG1hcHBpbmcuIE9ubHkgZmx1c2ggaWYgY2FjaGluZyBtb2RlICovCi0JaWYgKGNhcF9jYWNoaW5nX21vZGUoaW9tbXUtPmNhcCkpCi0JCWlvbW11X2ZsdXNoX2lvdGxiX3BzaShpb21tdSwgZG9tYWluLT5pZCwgbW1fdG9fZG1hX3Bmbihpb3ZhLT5wZm5fbG8pLCBzaXplLCAxKTsKLQllbHNlCi0JCWlvbW11X2ZsdXNoX3dyaXRlX2J1ZmZlcihpb21tdSk7Ci0KLQlzdGFydF9wYWRkciA9IChwaHlzX2FkZHJfdClpb3ZhLT5wZm5fbG8gPDwgUEFHRV9TSElGVDsKLQlzdGFydF9wYWRkciArPSBwYWRkciAmIH5QQUdFX01BU0s7Ci0JcmV0dXJuIHN0YXJ0X3BhZGRyOwotCi1lcnJvcjoKLQlpZiAoaW92YSkKLQkJX19mcmVlX2lvdmEoJmRvbWFpbi0+aW92YWQsIGlvdmEpOwotCXByaW50ayhLRVJOX0VSUiJEZXZpY2UgJXMgcmVxdWVzdDogJXp4QCVsbHggZGlyICVkIC0tLSBmYWlsZWRcbiIsCi0JCXBjaV9uYW1lKHBkZXYpLCBzaXplLCAodW5zaWduZWQgbG9uZyBsb25nKXBhZGRyLCBkaXIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgZG1hX2FkZHJfdCBpbnRlbF9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCi0JCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKLQkJCQkgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCi17Ci0JcmV0dXJuIF9faW50ZWxfbWFwX3NpbmdsZShkZXYsIHBhZ2VfdG9fcGh5cyhwYWdlKSArIG9mZnNldCwgc2l6ZSwKLQkJCQkgIGRpciwgdG9fcGNpX2RldihkZXYpLT5kbWFfbWFzayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZsdXNoX3VubWFwcyh2b2lkKQotewotCWludCBpLCBqOwotCi0JdGltZXJfb24gPSAwOwotCi0JLyoganVzdCBmbHVzaCB0aGVtIGFsbCAqLwotCWZvciAoaSA9IDA7IGkgPCBnX251bV9vZl9pb21tdXM7IGkrKykgewotCQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gZ19pb21tdXNbaV07Ci0JCWlmICghaW9tbXUpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIWRlZmVycmVkX2ZsdXNoW2ldLm5leHQpCi0JCQljb250aW51ZTsKLQotCQkvKiBJbiBjYWNoaW5nIG1vZGUsIGdsb2JhbCBmbHVzaGVzIHR1cm4gZW11bGF0aW9uIGV4cGVuc2l2ZSAqLwotCQlpZiAoIWNhcF9jYWNoaW5nX21vZGUoaW9tbXUtPmNhcCkpCi0JCQlpb21tdS0+Zmx1c2guZmx1c2hfaW90bGIoaW9tbXUsIDAsIDAsIDAsCi0JCQkJCSBETUFfVExCX0dMT0JBTF9GTFVTSCk7Ci0JCWZvciAoaiA9IDA7IGogPCBkZWZlcnJlZF9mbHVzaFtpXS5uZXh0OyBqKyspIHsKLQkJCXVuc2lnbmVkIGxvbmcgbWFzazsKLQkJCXN0cnVjdCBpb3ZhICppb3ZhID0gZGVmZXJyZWRfZmx1c2hbaV0uaW92YVtqXTsKLQkJCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluID0gZGVmZXJyZWRfZmx1c2hbaV0uZG9tYWluW2pdOwotCi0JCQkvKiBPbiByZWFsIGhhcmR3YXJlIG11bHRpcGxlIGludmFsaWRhdGlvbnMgYXJlIGV4cGVuc2l2ZSAqLwotCQkJaWYgKGNhcF9jYWNoaW5nX21vZGUoaW9tbXUtPmNhcCkpCi0JCQkJaW9tbXVfZmx1c2hfaW90bGJfcHNpKGlvbW11LCBkb21haW4tPmlkLAotCQkJCWlvdmEtPnBmbl9sbywgaW92YS0+cGZuX2hpIC0gaW92YS0+cGZuX2xvICsgMSwgMCk7Ci0JCQllbHNlIHsKLQkJCQltYXNrID0gaWxvZzIobW1fdG9fZG1hX3Bmbihpb3ZhLT5wZm5faGkgLSBpb3ZhLT5wZm5fbG8gKyAxKSk7Ci0JCQkJaW9tbXVfZmx1c2hfZGV2X2lvdGxiKGRlZmVycmVkX2ZsdXNoW2ldLmRvbWFpbltqXSwKLQkJCQkJCSh1aW50NjRfdClpb3ZhLT5wZm5fbG8gPDwgUEFHRV9TSElGVCwgbWFzayk7Ci0JCQl9Ci0JCQlfX2ZyZWVfaW92YSgmZGVmZXJyZWRfZmx1c2hbaV0uZG9tYWluW2pdLT5pb3ZhZCwgaW92YSk7Ci0JCX0KLQkJZGVmZXJyZWRfZmx1c2hbaV0ubmV4dCA9IDA7Ci0JfQotCi0JbGlzdF9zaXplID0gMDsKLX0KLQotc3RhdGljIHZvaWQgZmx1c2hfdW5tYXBzX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXN5bmNfdW1hcF9mbHVzaF9sb2NrLCBmbGFncyk7Ci0JZmx1c2hfdW5tYXBzKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXN5bmNfdW1hcF9mbHVzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZF91bm1hcChzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbSwgc3RydWN0IGlvdmEgKmlvdmEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbmV4dCwgaW9tbXVfaWQ7Ci0Jc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhc3luY191bWFwX2ZsdXNoX2xvY2ssIGZsYWdzKTsKLQlpZiAobGlzdF9zaXplID09IEhJR0hfV0FURVJfTUFSSykKLQkJZmx1c2hfdW5tYXBzKCk7Ci0KLQlpb21tdSA9IGRvbWFpbl9nZXRfaW9tbXUoZG9tKTsKLQlpb21tdV9pZCA9IGlvbW11LT5zZXFfaWQ7Ci0KLQluZXh0ID0gZGVmZXJyZWRfZmx1c2hbaW9tbXVfaWRdLm5leHQ7Ci0JZGVmZXJyZWRfZmx1c2hbaW9tbXVfaWRdLmRvbWFpbltuZXh0XSA9IGRvbTsKLQlkZWZlcnJlZF9mbHVzaFtpb21tdV9pZF0uaW92YVtuZXh0XSA9IGlvdmE7Ci0JZGVmZXJyZWRfZmx1c2hbaW9tbXVfaWRdLm5leHQrKzsKLQotCWlmICghdGltZXJfb24pIHsKLQkJbW9kX3RpbWVyKCZ1bm1hcF90aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKLQkJdGltZXJfb24gPSAxOwotCX0KLQlsaXN0X3NpemUrKzsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc3luY191bWFwX2ZsdXNoX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgaW50ZWxfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCi0JCQkgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCi0JCQkgICAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBsYXN0X3BmbjsKLQlzdHJ1Y3QgaW92YSAqaW92YTsKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwotCi0JaWYgKGlvbW11X25vX21hcHBpbmcoZGV2KSkKLQkJcmV0dXJuOwotCi0JZG9tYWluID0gZmluZF9kb21haW4ocGRldik7Ci0JQlVHX09OKCFkb21haW4pOwotCi0JaW9tbXUgPSBkb21haW5fZ2V0X2lvbW11KGRvbWFpbik7Ci0KLQlpb3ZhID0gZmluZF9pb3ZhKCZkb21haW4tPmlvdmFkLCBJT1ZBX1BGTihkZXZfYWRkcikpOwotCWlmIChXQVJOX09OQ0UoIWlvdmEsICJEcml2ZXIgdW5tYXBzIHVubWF0Y2hlZCBwYWdlIGF0IFBGTiAlbGx4XG4iLAotCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRldl9hZGRyKSkKLQkJcmV0dXJuOwotCi0Jc3RhcnRfcGZuID0gbW1fdG9fZG1hX3Bmbihpb3ZhLT5wZm5fbG8pOwotCWxhc3RfcGZuID0gbW1fdG9fZG1hX3Bmbihpb3ZhLT5wZm5faGkgKyAxKSAtIDE7Ci0KLQlwcl9kZWJ1ZygiRGV2aWNlICVzIHVubWFwcGluZzogcGZuICVseC0lbHhcbiIsCi0JCSBwY2lfbmFtZShwZGV2KSwgc3RhcnRfcGZuLCBsYXN0X3Bmbik7Ci0KLQkvKiAgY2xlYXIgdGhlIHdob2xlIHBhZ2UgKi8KLQlkbWFfcHRlX2NsZWFyX3JhbmdlKGRvbWFpbiwgc3RhcnRfcGZuLCBsYXN0X3Bmbik7Ci0KLQkvKiBmcmVlIHBhZ2UgdGFibGVzICovCi0JZG1hX3B0ZV9mcmVlX3BhZ2V0YWJsZShkb21haW4sIHN0YXJ0X3BmbiwgbGFzdF9wZm4pOwotCi0JaWYgKGludGVsX2lvbW11X3N0cmljdCkgewotCQlpb21tdV9mbHVzaF9pb3RsYl9wc2koaW9tbXUsIGRvbWFpbi0+aWQsIHN0YXJ0X3BmbiwKLQkJCQkgICAgICBsYXN0X3BmbiAtIHN0YXJ0X3BmbiArIDEsIDApOwotCQkvKiBmcmVlIGlvdmEgKi8KLQkJX19mcmVlX2lvdmEoJmRvbWFpbi0+aW92YWQsIGlvdmEpOwotCX0gZWxzZSB7Ci0JCWFkZF91bm1hcChkb21haW4sIGlvdmEpOwotCQkvKgotCQkgKiBxdWV1ZSB1cCB0aGUgcmVsZWFzZSBvZiB0aGUgdW5tYXAgdG8gc2F2ZSB0aGUgMS82dGggb2YgdGhlCi0JCSAqIGNwdSB1c2VkIHVwIGJ5IHRoZSBpb3RsYiBmbHVzaCBvcGVyYXRpb24uLi4KLQkJICovCi0JfQotfQotCi1zdGF0aWMgdm9pZCAqaW50ZWxfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLAotCQkJCSAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0Jdm9pZCAqdmFkZHI7Ci0JaW50IG9yZGVyOwotCi0Jc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7Ci0Jb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7Ci0KLQlpZiAoIWlvbW11X25vX21hcHBpbmcoaHdkZXYpKQotCQlmbGFncyAmPSB+KEdGUF9ETUEgfCBHRlBfRE1BMzIpOwotCWVsc2UgaWYgKGh3ZGV2LT5jb2hlcmVudF9kbWFfbWFzayA8IGRtYV9nZXRfcmVxdWlyZWRfbWFzayhod2RldikpIHsKLQkJaWYgKGh3ZGV2LT5jb2hlcmVudF9kbWFfbWFzayA8IERNQV9CSVRfTUFTSygzMikpCi0JCQlmbGFncyB8PSBHRlBfRE1BOwotCQllbHNlCi0JCQlmbGFncyB8PSBHRlBfRE1BMzI7Ci0JfQotCi0JdmFkZHIgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoZmxhZ3MsIG9yZGVyKTsKLQlpZiAoIXZhZGRyKQotCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQodmFkZHIsIDAsIHNpemUpOwotCi0JKmRtYV9oYW5kbGUgPSBfX2ludGVsX21hcF9zaW5nbGUoaHdkZXYsIHZpcnRfdG9fYnVzKHZhZGRyKSwgc2l6ZSwKLQkJCQkJIERNQV9CSURJUkVDVElPTkFMLAotCQkJCQkgaHdkZXYtPmNvaGVyZW50X2RtYV9tYXNrKTsKLQlpZiAoKmRtYV9oYW5kbGUpCi0JCXJldHVybiB2YWRkcjsKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBvcmRlcik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVsX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwKLQkJCQlkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0JaW50IG9yZGVyOwotCi0Jc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7Ci0Jb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7Ci0KLQlpbnRlbF91bm1hcF9wYWdlKGh3ZGV2LCBkbWFfaGFuZGxlLCBzaXplLCBETUFfQklESVJFQ1RJT05BTCwgTlVMTCk7Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgb3JkZXIpOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlbF91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCi0JCQkgICBpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCi0JCQkgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaHdkZXYpOwotCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBsYXN0X3BmbjsKLQlzdHJ1Y3QgaW92YSAqaW92YTsKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwotCi0JaWYgKGlvbW11X25vX21hcHBpbmcoaHdkZXYpKQotCQlyZXR1cm47Ci0KLQlkb21haW4gPSBmaW5kX2RvbWFpbihwZGV2KTsKLQlCVUdfT04oIWRvbWFpbik7Ci0KLQlpb21tdSA9IGRvbWFpbl9nZXRfaW9tbXUoZG9tYWluKTsKLQotCWlvdmEgPSBmaW5kX2lvdmEoJmRvbWFpbi0+aW92YWQsIElPVkFfUEZOKHNnbGlzdFswXS5kbWFfYWRkcmVzcykpOwotCWlmIChXQVJOX09OQ0UoIWlvdmEsICJEcml2ZXIgdW5tYXBzIHVubWF0Y2hlZCBzZ2xpc3QgYXQgUEZOICVsbHhcbiIsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2dsaXN0WzBdLmRtYV9hZGRyZXNzKSkKLQkJcmV0dXJuOwotCi0Jc3RhcnRfcGZuID0gbW1fdG9fZG1hX3Bmbihpb3ZhLT5wZm5fbG8pOwotCWxhc3RfcGZuID0gbW1fdG9fZG1hX3Bmbihpb3ZhLT5wZm5faGkgKyAxKSAtIDE7Ci0KLQkvKiAgY2xlYXIgdGhlIHdob2xlIHBhZ2UgKi8KLQlkbWFfcHRlX2NsZWFyX3JhbmdlKGRvbWFpbiwgc3RhcnRfcGZuLCBsYXN0X3Bmbik7Ci0KLQkvKiBmcmVlIHBhZ2UgdGFibGVzICovCi0JZG1hX3B0ZV9mcmVlX3BhZ2V0YWJsZShkb21haW4sIHN0YXJ0X3BmbiwgbGFzdF9wZm4pOwotCi0JaWYgKGludGVsX2lvbW11X3N0cmljdCkgewotCQlpb21tdV9mbHVzaF9pb3RsYl9wc2koaW9tbXUsIGRvbWFpbi0+aWQsIHN0YXJ0X3BmbiwKLQkJCQkgICAgICBsYXN0X3BmbiAtIHN0YXJ0X3BmbiArIDEsIDApOwotCQkvKiBmcmVlIGlvdmEgKi8KLQkJX19mcmVlX2lvdmEoJmRvbWFpbi0+aW92YWQsIGlvdmEpOwotCX0gZWxzZSB7Ci0JCWFkZF91bm1hcChkb21haW4sIGlvdmEpOwotCQkvKgotCQkgKiBxdWV1ZSB1cCB0aGUgcmVsZWFzZSBvZiB0aGUgdW5tYXAgdG8gc2F2ZSB0aGUgMS82dGggb2YgdGhlCi0JCSAqIGNwdSB1c2VkIHVwIGJ5IHRoZSBpb3RsYiBmbHVzaCBvcGVyYXRpb24uLi4KLQkJICovCi0JfQotfQotCi1zdGF0aWMgaW50IGludGVsX25vbnRyYW5zbGF0ZV9tYXBfc2coc3RydWN0IGRldmljZSAqaGRkZXYsCi0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsIGludCBkaXIpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQotCWZvcl9lYWNoX3NnKHNnbGlzdCwgc2csIG5lbGVtcywgaSkgewotCQlCVUdfT04oIXNnX3BhZ2Uoc2cpKTsKLQkJc2ctPmRtYV9hZGRyZXNzID0gcGFnZV90b19waHlzKHNnX3BhZ2Uoc2cpKSArIHNnLT5vZmZzZXQ7Ci0JCXNnLT5kbWFfbGVuZ3RoID0gc2ctPmxlbmd0aDsKLQl9Ci0JcmV0dXJuIG5lbGVtczsKLX0KLQotc3RhdGljIGludCBpbnRlbF9tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCBpbnQgbmVsZW1zLAotCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLCBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaHdkZXYpOwotCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluOwotCXNpemVfdCBzaXplID0gMDsKLQlpbnQgcHJvdCA9IDA7Ci0Jc3RydWN0IGlvdmEgKmlvdmEgPSBOVUxMOwotCWludCByZXQ7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3ZwZm47Ci0Jc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKLQotCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwotCWlmIChpb21tdV9ub19tYXBwaW5nKGh3ZGV2KSkKLQkJcmV0dXJuIGludGVsX25vbnRyYW5zbGF0ZV9tYXBfc2coaHdkZXYsIHNnbGlzdCwgbmVsZW1zLCBkaXIpOwotCi0JZG9tYWluID0gZ2V0X3ZhbGlkX2RvbWFpbl9mb3JfZGV2KHBkZXYpOwotCWlmICghZG9tYWluKQotCQlyZXR1cm4gMDsKLQotCWlvbW11ID0gZG9tYWluX2dldF9pb21tdShkb21haW4pOwotCi0JZm9yX2VhY2hfc2coc2dsaXN0LCBzZywgbmVsZW1zLCBpKQotCQlzaXplICs9IGFsaWduZWRfbnJwYWdlcyhzZy0+b2Zmc2V0LCBzZy0+bGVuZ3RoKTsKLQotCWlvdmEgPSBpbnRlbF9hbGxvY19pb3ZhKGh3ZGV2LCBkb21haW4sIGRtYV90b19tbV9wZm4oc2l6ZSksCi0JCQkJcGRldi0+ZG1hX21hc2spOwotCWlmICghaW92YSkgewotCQlzZ2xpc3QtPmRtYV9sZW5ndGggPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIGlmIERNQVIgc3VwcG9ydHMgemVyby1sZW5ndGggcmVhZHMgb24gd3JpdGUgb25seQotCSAqIG1hcHBpbmdzLi4KLQkgKi8KLQlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFMIHx8IFwKLQkJCSFjYXBfemxyKGlvbW11LT5jYXApKQotCQlwcm90IHw9IERNQV9QVEVfUkVBRDsKLQlpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpCi0JCXByb3QgfD0gRE1BX1BURV9XUklURTsKLQotCXN0YXJ0X3ZwZm4gPSBtbV90b19kbWFfcGZuKGlvdmEtPnBmbl9sbyk7Ci0KLQlyZXQgPSBkb21haW5fc2dfbWFwcGluZyhkb21haW4sIHN0YXJ0X3ZwZm4sIHNnbGlzdCwgc2l6ZSwgcHJvdCk7Ci0JaWYgKHVubGlrZWx5KHJldCkpIHsKLQkJLyogIGNsZWFyIHRoZSBwYWdlICovCi0JCWRtYV9wdGVfY2xlYXJfcmFuZ2UoZG9tYWluLCBzdGFydF92cGZuLAotCQkJCSAgICBzdGFydF92cGZuICsgc2l6ZSAtIDEpOwotCQkvKiBmcmVlIHBhZ2UgdGFibGVzICovCi0JCWRtYV9wdGVfZnJlZV9wYWdldGFibGUoZG9tYWluLCBzdGFydF92cGZuLAotCQkJCSAgICAgICBzdGFydF92cGZuICsgc2l6ZSAtIDEpOwotCQkvKiBmcmVlIGlvdmEgKi8KLQkJX19mcmVlX2lvdmEoJmRvbWFpbi0+aW92YWQsIGlvdmEpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBpdCdzIGEgbm9uLXByZXNlbnQgdG8gcHJlc2VudCBtYXBwaW5nLiBPbmx5IGZsdXNoIGlmIGNhY2hpbmcgbW9kZSAqLwotCWlmIChjYXBfY2FjaGluZ19tb2RlKGlvbW11LT5jYXApKQotCQlpb21tdV9mbHVzaF9pb3RsYl9wc2koaW9tbXUsIGRvbWFpbi0+aWQsIHN0YXJ0X3ZwZm4sIHNpemUsIDEpOwotCWVsc2UKLQkJaW9tbXVfZmx1c2hfd3JpdGVfYnVmZmVyKGlvbW11KTsKLQotCXJldHVybiBuZWxlbXM7Ci19Ci0KLXN0YXRpYyBpbnQgaW50ZWxfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCi17Ci0JcmV0dXJuICFkbWFfYWRkcjsKLX0KLQotc3RydWN0IGRtYV9tYXBfb3BzIGludGVsX2RtYV9vcHMgPSB7Ci0JLmFsbG9jX2NvaGVyZW50ID0gaW50ZWxfYWxsb2NfY29oZXJlbnQsCi0JLmZyZWVfY29oZXJlbnQgPSBpbnRlbF9mcmVlX2NvaGVyZW50LAotCS5tYXBfc2cgPSBpbnRlbF9tYXBfc2csCi0JLnVubWFwX3NnID0gaW50ZWxfdW5tYXBfc2csCi0JLm1hcF9wYWdlID0gaW50ZWxfbWFwX3BhZ2UsCi0JLnVubWFwX3BhZ2UgPSBpbnRlbF91bm1hcF9wYWdlLAotCS5tYXBwaW5nX2Vycm9yID0gaW50ZWxfbWFwcGluZ19lcnJvciwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlvbW11X2RvbWFpbl9jYWNoZV9pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpb21tdV9kb21haW5fY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaW9tbXVfZG9tYWluIiwKLQkJCQkJIHNpemVvZihzdHJ1Y3QgZG1hcl9kb21haW4pLAotCQkJCQkgMCwKLQkJCQkJIFNMQUJfSFdDQUNIRV9BTElHTiwKLQotCQkJCQkgTlVMTCk7Ci0JaWYgKCFpb21tdV9kb21haW5fY2FjaGUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBjcmVhdGUgaW9tbXVfZG9tYWluIGNhY2hlXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpb21tdV9kZXZpbmZvX2NhY2hlX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlvbW11X2RldmluZm9fY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaW9tbXVfZGV2aW5mbyIsCi0JCQkJCSBzaXplb2Yoc3RydWN0IGRldmljZV9kb21haW5faW5mbyksCi0JCQkJCSAwLAotCQkJCQkgU0xBQl9IV0NBQ0hFX0FMSUdOLAotCQkJCQkgTlVMTCk7Ci0JaWYgKCFpb21tdV9kZXZpbmZvX2NhY2hlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgY3JlYXRlIGRldmluZm8gY2FjaGVcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlvbW11X2lvdmFfY2FjaGVfaW5pdCh2b2lkKQotewotCWludCByZXQgPSAwOwotCi0JaW9tbXVfaW92YV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJpb21tdV9pb3ZhIiwKLQkJCQkJIHNpemVvZihzdHJ1Y3QgaW92YSksCi0JCQkJCSAwLAotCQkJCQkgU0xBQl9IV0NBQ0hFX0FMSUdOLAotCQkJCQkgTlVMTCk7Ci0JaWYgKCFpb21tdV9pb3ZhX2NhY2hlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgY3JlYXRlIGlvdmEgY2FjaGVcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlvbW11X2luaXRfbWVtcG9vbCh2b2lkKQotewotCWludCByZXQ7Ci0JcmV0ID0gaW9tbXVfaW92YV9jYWNoZV9pbml0KCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGlvbW11X2RvbWFpbl9jYWNoZV9pbml0KCk7Ci0JaWYgKHJldCkKLQkJZ290byBkb21haW5fZXJyb3I7Ci0KLQlyZXQgPSBpb21tdV9kZXZpbmZvX2NhY2hlX2luaXQoKTsKLQlpZiAoIXJldCkKLQkJcmV0dXJuIHJldDsKLQotCWttZW1fY2FjaGVfZGVzdHJveShpb21tdV9kb21haW5fY2FjaGUpOwotZG9tYWluX2Vycm9yOgotCWttZW1fY2FjaGVfZGVzdHJveShpb21tdV9pb3ZhX2NhY2hlKTsKLQotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgaW9tbXVfZXhpdF9tZW1wb29sKHZvaWQpCi17Ci0Ja21lbV9jYWNoZV9kZXN0cm95KGlvbW11X2RldmluZm9fY2FjaGUpOwotCWttZW1fY2FjaGVfZGVzdHJveShpb21tdV9kb21haW5fY2FjaGUpOwotCWttZW1fY2FjaGVfZGVzdHJveShpb21tdV9pb3ZhX2NhY2hlKTsKLQotfQotCi1zdGF0aWMgdm9pZCBxdWlya19pb2F0X3NuYl9sb2NhbF9pb21tdShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7Ci0JdTMyIHZ0YmFyOwotCWludCByYzsKLQotCS8qIFdlIGtub3cgdGhhdCB0aGlzIGRldmljZSBvbiB0aGlzIGNoaXBzZXQgaGFzIGl0cyBvd24gSU9NTVUuCi0JICogSWYgd2UgZmluZCBpdCB1bmRlciBhIGRpZmZlcmVudCBJT01NVSwgdGhlbiB0aGUgQklPUyBpcyBseWluZwotCSAqIHRvIHVzLiBIb3BlIHRoYXQgdGhlIElPTU1VIGZvciB0aGlzIGRldmljZSBpcyBhY3R1YWxseQotCSAqIGRpc2FibGVkLCBhbmQgaXQgbmVlZHMgbm8gdHJhbnNsYXRpb24uLi4KLQkgKi8KLQlyYyA9IHBjaV9idXNfcmVhZF9jb25maWdfZHdvcmQocGRldi0+YnVzLCBQQ0lfREVWRk4oMCwgMCksIDB4YjAsICZ2dGJhcik7Ci0JaWYgKHJjKSB7Ci0JCS8qICJjYW4ndCIgaGFwcGVuICovCi0JCWRldl9pbmZvKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcnVuIHZ0LWQgcXVpcmtcbiIpOwotCQlyZXR1cm47Ci0JfQotCXZ0YmFyICY9IDB4ZmZmZjAwMDA7Ci0KLQkvKiB3ZSBrbm93IHRoYXQgdGhlIHRoaXMgaW9tbXUgc2hvdWxkIGJlIGF0IG9mZnNldCAweGEwMDAgZnJvbSB2dGJhciAqLwotCWRyaGQgPSBkbWFyX2ZpbmRfbWF0Y2hlZF9kcmhkX3VuaXQocGRldik7Ci0JaWYgKFdBUk5fVEFJTlRfT05DRSghZHJoZCB8fCBkcmhkLT5yZWdfYmFzZV9hZGRyIC0gdnRiYXIgIT0gMHhhMDAwLAotCQkJICAgIFRBSU5UX0ZJUk1XQVJFX1dPUktBUk9VTkQsCi0JCQkgICAgIkJJT1MgYXNzaWduZWQgaW5jb3JyZWN0IFZULWQgdW5pdCBmb3IgSW50ZWwoUikgUXVpY2tEYXRhIFRlY2hub2xvZ3kgZGV2aWNlXG4iKSkKLQkJcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11ID0gRFVNTVlfREVWSUNFX0RPTUFJTl9JTkZPOwotfQotREVDTEFSRV9QQ0lfRklYVVBfRU5BQkxFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkIsIHF1aXJrX2lvYXRfc25iX2xvY2FsX2lvbW11KTsKLQotc3RhdGljIHZvaWQgX19pbml0IGluaXRfbm9fcmVtYXBwaW5nX2RldmljZXModm9pZCkKLXsKLQlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7Ci0KLQlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgewotCQlpZiAoIWRyaGQtPmluY2x1ZGVfYWxsKSB7Ci0JCQlpbnQgaTsKLQkJCWZvciAoaSA9IDA7IGkgPCBkcmhkLT5kZXZpY2VzX2NudDsgaSsrKQotCQkJCWlmIChkcmhkLT5kZXZpY2VzW2ldICE9IE5VTEwpCi0JCQkJCWJyZWFrOwotCQkJLyogaWdub3JlIERNQVIgdW5pdCBpZiBubyBwY2kgZGV2aWNlcyBleGlzdCAqLwotCQkJaWYgKGkgPT0gZHJoZC0+ZGV2aWNlc19jbnQpCi0JCQkJZHJoZC0+aWdub3JlZCA9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAoZG1hcl9tYXBfZ2Z4KQotCQlyZXR1cm47Ci0KLQlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgewotCQlpbnQgaTsKLQkJaWYgKGRyaGQtPmlnbm9yZWQgfHwgZHJoZC0+aW5jbHVkZV9hbGwpCi0JCQljb250aW51ZTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgZHJoZC0+ZGV2aWNlc19jbnQ7IGkrKykKLQkJCWlmIChkcmhkLT5kZXZpY2VzW2ldICYmCi0JCQkJIUlTX0dGWF9ERVZJQ0UoZHJoZC0+ZGV2aWNlc1tpXSkpCi0JCQkJYnJlYWs7Ci0KLQkJaWYgKGkgPCBkcmhkLT5kZXZpY2VzX2NudCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGJ5cGFzcyBJT01NVSBpZiBpdCBpcyBqdXN0IGZvciBnZnggZGV2aWNlcyAqLwotCQlkcmhkLT5pZ25vcmVkID0gMTsKLQkJZm9yIChpID0gMDsgaSA8IGRyaGQtPmRldmljZXNfY250OyBpKyspIHsKLQkJCWlmICghZHJoZC0+ZGV2aWNlc1tpXSkKLQkJCQljb250aW51ZTsKLQkJCWRyaGQtPmRldmljZXNbaV0tPmRldi5hcmNoZGF0YS5pb21tdSA9IERVTU1ZX0RFVklDRV9ET01BSU5fSU5GTzsKLQkJfQotCX0KLX0KLQotI2lmZGVmIENPTkZJR19TVVNQRU5ECi1zdGF0aWMgaW50IGluaXRfaW9tbXVfaHcodm9pZCkKLXsKLQlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7Ci0Jc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IE5VTEw7Ci0KLQlmb3JfZWFjaF9hY3RpdmVfaW9tbXUoaW9tbXUsIGRyaGQpCi0JCWlmIChpb21tdS0+cWkpCi0JCQlkbWFyX3JlZW5hYmxlX3FpKGlvbW11KTsKLQotCWZvcl9lYWNoX2lvbW11KGlvbW11LCBkcmhkKSB7Ci0JCWlmIChkcmhkLT5pZ25vcmVkKSB7Ci0JCQkvKgotCQkJICogd2UgYWx3YXlzIGhhdmUgdG8gZGlzYWJsZSBQTVJzIG9yIERNQSBtYXkgZmFpbCBvbgotCQkJICogdGhpcyBkZXZpY2UKLQkJCSAqLwotCQkJaWYgKGZvcmNlX29uKQotCQkJCWlvbW11X2Rpc2FibGVfcHJvdGVjdF9tZW1fcmVnaW9ucyhpb21tdSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQotCQlpb21tdV9mbHVzaF93cml0ZV9idWZmZXIoaW9tbXUpOwotCi0JCWlvbW11X3NldF9yb290X2VudHJ5KGlvbW11KTsKLQotCQlpb21tdS0+Zmx1c2guZmx1c2hfY29udGV4dChpb21tdSwgMCwgMCwgMCwKLQkJCQkJICAgRE1BX0NDTURfR0xPQkFMX0lOVkwpOwotCQlpb21tdS0+Zmx1c2guZmx1c2hfaW90bGIoaW9tbXUsIDAsIDAsIDAsCi0JCQkJCSBETUFfVExCX0dMT0JBTF9GTFVTSCk7Ci0JCWlmIChpb21tdV9lbmFibGVfdHJhbnNsYXRpb24oaW9tbXUpKQotCQkJcmV0dXJuIDE7Ci0JCWlvbW11X2Rpc2FibGVfcHJvdGVjdF9tZW1fcmVnaW9ucyhpb21tdSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbW11X2ZsdXNoX2FsbCh2b2lkKQotewotCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwotCi0JZm9yX2VhY2hfYWN0aXZlX2lvbW11KGlvbW11LCBkcmhkKSB7Ci0JCWlvbW11LT5mbHVzaC5mbHVzaF9jb250ZXh0KGlvbW11LCAwLCAwLCAwLAotCQkJCQkgICBETUFfQ0NNRF9HTE9CQUxfSU5WTCk7Ci0JCWlvbW11LT5mbHVzaC5mbHVzaF9pb3RsYihpb21tdSwgMCwgMCwgMCwKLQkJCQkJIERNQV9UTEJfR0xPQkFMX0ZMVVNIKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgaW9tbXVfc3VzcGVuZCh2b2lkKQotewotCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWc7Ci0KLQlmb3JfZWFjaF9hY3RpdmVfaW9tbXUoaW9tbXUsIGRyaGQpIHsKLQkJaW9tbXUtPmlvbW11X3N0YXRlID0ga3phbGxvYyhzaXplb2YodTMyKSAqIE1BWF9TUl9ETUFSX1JFR1MsCi0JCQkJCQkgR0ZQX0FUT01JQyk7Ci0JCWlmICghaW9tbXUtPmlvbW11X3N0YXRlKQotCQkJZ290byBub21lbTsKLQl9Ci0KLQlpb21tdV9mbHVzaF9hbGwoKTsKLQotCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkgewotCQlpb21tdV9kaXNhYmxlX3RyYW5zbGF0aW9uKGlvbW11KTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWcpOwotCi0JCWlvbW11LT5pb21tdV9zdGF0ZVtTUl9ETUFSX0ZFQ1RMX1JFR10gPQotCQkJcmVhZGwoaW9tbXUtPnJlZyArIERNQVJfRkVDVExfUkVHKTsKLQkJaW9tbXUtPmlvbW11X3N0YXRlW1NSX0RNQVJfRkVEQVRBX1JFR10gPQotCQkJcmVhZGwoaW9tbXUtPnJlZyArIERNQVJfRkVEQVRBX1JFRyk7Ci0JCWlvbW11LT5pb21tdV9zdGF0ZVtTUl9ETUFSX0ZFQUREUl9SRUddID0KLQkJCXJlYWRsKGlvbW11LT5yZWcgKyBETUFSX0ZFQUREUl9SRUcpOwotCQlpb21tdS0+aW9tbXVfc3RhdGVbU1JfRE1BUl9GRVVBRERSX1JFR10gPQotCQkJcmVhZGwoaW9tbXUtPnJlZyArIERNQVJfRkVVQUREUl9SRUcpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFnKTsKLQl9Ci0JcmV0dXJuIDA7Ci0KLW5vbWVtOgotCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkKLQkJa2ZyZWUoaW9tbXUtPmlvbW11X3N0YXRlKTsKLQotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgdm9pZCBpb21tdV9yZXN1bWUodm9pZCkKLXsKLQlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7Ci0Jc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnOwotCi0JaWYgKGluaXRfaW9tbXVfaHcoKSkgewotCQlpZiAoZm9yY2Vfb24pCi0JCQlwYW5pYygidGJvb3Q6IElPTU1VIHNldHVwIGZhaWxlZCwgRE1BUiBjYW4gbm90IHJlc3VtZSFcbiIpOwotCQllbHNlCi0JCQlXQVJOKDEsICJJT01NVSBzZXR1cCBmYWlsZWQsIERNQVIgY2FuIG5vdCByZXN1bWUhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkgewotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZyk7Ci0KLQkJd3JpdGVsKGlvbW11LT5pb21tdV9zdGF0ZVtTUl9ETUFSX0ZFQ1RMX1JFR10sCi0JCQlpb21tdS0+cmVnICsgRE1BUl9GRUNUTF9SRUcpOwotCQl3cml0ZWwoaW9tbXUtPmlvbW11X3N0YXRlW1NSX0RNQVJfRkVEQVRBX1JFR10sCi0JCQlpb21tdS0+cmVnICsgRE1BUl9GRURBVEFfUkVHKTsKLQkJd3JpdGVsKGlvbW11LT5pb21tdV9zdGF0ZVtTUl9ETUFSX0ZFQUREUl9SRUddLAotCQkJaW9tbXUtPnJlZyArIERNQVJfRkVBRERSX1JFRyk7Ci0JCXdyaXRlbChpb21tdS0+aW9tbXVfc3RhdGVbU1JfRE1BUl9GRVVBRERSX1JFR10sCi0JCQlpb21tdS0+cmVnICsgRE1BUl9GRVVBRERSX1JFRyk7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWcpOwotCX0KLQotCWZvcl9lYWNoX2FjdGl2ZV9pb21tdShpb21tdSwgZHJoZCkKLQkJa2ZyZWUoaW9tbXUtPmlvbW11X3N0YXRlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBpb21tdV9zeXNjb3JlX29wcyA9IHsKLQkucmVzdW1lCQk9IGlvbW11X3Jlc3VtZSwKLQkuc3VzcGVuZAk9IGlvbW11X3N1c3BlbmQsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9pb21tdV9wbV9vcHModm9pZCkKLXsKLQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmaW9tbXVfc3lzY29yZV9vcHMpOwotfQotCi0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgaW5pdF9pb21tdV9wbV9vcHModm9pZCkgeyB9Ci0jZW5kaWYJLyogQ09ORklHX1BNICovCi0KLS8qCi0gKiBIZXJlIHdlIG9ubHkgcmVzcG9uZCB0byBhY3Rpb24gb2YgdW5ib3VuZCBkZXZpY2UgZnJvbSBkcml2ZXIuCi0gKgotICogQWRkZWQgZGV2aWNlIGlzIG5vdCBhdHRhY2hlZCB0byBpdHMgRE1BUiBkb21haW4gaGVyZSB5ZXQuIFRoYXQgd2lsbCBoYXBwZW4KLSAqIHdoZW4gbWFwcGluZyB0aGUgZGV2aWNlIHRvIGlvdmEuCi0gKi8KLXN0YXRpYyBpbnQgZGV2aWNlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluOwotCi0JaWYgKGlvbW11X25vX21hcHBpbmcoZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQlkb21haW4gPSBmaW5kX2RvbWFpbihwZGV2KTsKLQlpZiAoIWRvbWFpbikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYWN0aW9uID09IEJVU19OT1RJRllfVU5CT1VORF9EUklWRVIgJiYgIWlvbW11X3Bhc3NfdGhyb3VnaCkgewotCQlkb21haW5fcmVtb3ZlX29uZV9kZXZfaW5mbyhkb21haW4sIHBkZXYpOwotCi0JCWlmICghKGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19WSVJUVUFMX01BQ0hJTkUpICYmCi0JCSAgICAhKGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19TVEFUSUNfSURFTlRJVFkpICYmCi0JCSAgICBsaXN0X2VtcHR5KCZkb21haW4tPmRldmljZXMpKQotCQkJZG9tYWluX2V4aXQoZG9tYWluKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBkZXZpY2VfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBkZXZpY2Vfbm90aWZpZXIsCi19OwotCi1pbnQgX19pbml0IGludGVsX2lvbW11X2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIFZULWQgaXMgcmVxdWlyZWQgZm9yIGEgVFhUL3Rib290IGxhdW5jaCwgc28gZW5mb3JjZSB0aGF0ICovCi0JZm9yY2Vfb24gPSB0Ym9vdF9mb3JjZV9pb21tdSgpOwotCi0JaWYgKGRtYXJfdGFibGVfaW5pdCgpKSB7Ci0JCWlmIChmb3JjZV9vbikKLQkJCXBhbmljKCJ0Ym9vdDogRmFpbGVkIHRvIGluaXRpYWxpemUgRE1BUiB0YWJsZVxuIik7Ci0JCXJldHVybiAJLUVOT0RFVjsKLQl9Ci0KLQlpZiAoZG1hcl9kZXZfc2NvcGVfaW5pdCgpKSB7Ci0JCWlmIChmb3JjZV9vbikKLQkJCXBhbmljKCJ0Ym9vdDogRmFpbGVkIHRvIGluaXRpYWxpemUgRE1BUiBkZXZpY2Ugc2NvcGVcbiIpOwotCQlyZXR1cm4gCS1FTk9ERVY7Ci0JfQotCi0JLyoKLQkgKiBDaGVjayB0aGUgbmVlZCBmb3IgRE1BLXJlbWFwcGluZyBpbml0aWFsaXphdGlvbiBub3cuCi0JICogQWJvdmUgaW5pdGlhbGl6YXRpb24gd2lsbCBhbHNvIGJlIHVzZWQgYnkgSW50ZXJydXB0LXJlbWFwcGluZy4KLQkgKi8KLQlpZiAobm9faW9tbXUgfHwgZG1hcl9kaXNhYmxlZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoaW9tbXVfaW5pdF9tZW1wb29sKCkpIHsKLQkJaWYgKGZvcmNlX29uKQotCQkJcGFuaWMoInRib290OiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBpb21tdSBtZW1vcnlcbiIpOwotCQlyZXR1cm4gCS1FTk9ERVY7Ci0JfQotCi0JaWYgKGRtYXJfaW5pdF9yZXNlcnZlZF9yYW5nZXMoKSkgewotCQlpZiAoZm9yY2Vfb24pCi0JCQlwYW5pYygidGJvb3Q6IEZhaWxlZCB0byByZXNlcnZlIGlvbW11IHJhbmdlc1xuIik7Ci0JCXJldHVybiAJLUVOT0RFVjsKLQl9Ci0KLQlpbml0X25vX3JlbWFwcGluZ19kZXZpY2VzKCk7Ci0KLQlyZXQgPSBpbml0X2RtYXJzKCk7Ci0JaWYgKHJldCkgewotCQlpZiAoZm9yY2Vfb24pCi0JCQlwYW5pYygidGJvb3Q6IEZhaWxlZCB0byBpbml0aWFsaXplIERNQVJzXG4iKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJJT01NVTogZG1hciBpbml0IGZhaWxlZFxuIik7Ci0JCXB1dF9pb3ZhX2RvbWFpbigmcmVzZXJ2ZWRfaW92YV9saXN0KTsKLQkJaW9tbXVfZXhpdF9tZW1wb29sKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXByaW50ayhLRVJOX0lORk8KLQkiUENJLURNQTogSW50ZWwoUikgVmlydHVhbGl6YXRpb24gVGVjaG5vbG9neSBmb3IgRGlyZWN0ZWQgSS9PXG4iKTsKLQotCWluaXRfdGltZXIoJnVubWFwX3RpbWVyKTsKLSNpZmRlZiBDT05GSUdfU1dJT1RMQgotCXN3aW90bGIgPSAwOwotI2VuZGlmCi0JZG1hX29wcyA9ICZpbnRlbF9kbWFfb3BzOwotCi0JaW5pdF9pb21tdV9wbV9vcHMoKTsKLQotCXJlZ2lzdGVyX2lvbW11KCZpbnRlbF9pb21tdV9vcHMpOwotCi0JYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZwY2lfYnVzX3R5cGUsICZkZXZpY2VfbmIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbW11X2RldGFjaF9kZXBlbmRlbnRfZGV2aWNlcyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LAotCQkJCQkgICBzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqdG1wLCAqcGFyZW50OwotCi0JaWYgKCFpb21tdSB8fCAhcGRldikKLQkJcmV0dXJuOwotCi0JLyogZGVwZW5kZW50IGRldmljZSBkZXRhY2ggKi8KLQl0bXAgPSBwY2lfZmluZF91cHN0cmVhbV9wY2llX2JyaWRnZShwZGV2KTsKLQkvKiBTZWNvbmRhcnkgaW50ZXJmYWNlJ3MgYnVzIG51bWJlciBhbmQgZGV2Zm4gMCAqLwotCWlmICh0bXApIHsKLQkJcGFyZW50ID0gcGRldi0+YnVzLT5zZWxmOwotCQl3aGlsZSAocGFyZW50ICE9IHRtcCkgewotCQkJaW9tbXVfZGV0YWNoX2Rldihpb21tdSwgcGFyZW50LT5idXMtPm51bWJlciwKLQkJCQkJIHBhcmVudC0+ZGV2Zm4pOwotCQkJcGFyZW50ID0gcGFyZW50LT5idXMtPnNlbGY7Ci0JCX0KLQkJaWYgKHBjaV9pc19wY2llKHRtcCkpIC8qIHRoaXMgaXMgYSBQQ0llLXRvLVBDSSBicmlkZ2UgKi8KLQkJCWlvbW11X2RldGFjaF9kZXYoaW9tbXUsCi0JCQkJdG1wLT5zdWJvcmRpbmF0ZS0+bnVtYmVyLCAwKTsKLQkJZWxzZSAvKiB0aGlzIGlzIGEgbGVnYWN5IFBDSSBicmlkZ2UgKi8KLQkJCWlvbW11X2RldGFjaF9kZXYoaW9tbXUsIHRtcC0+YnVzLT5udW1iZXIsCi0JCQkJCSB0bXAtPmRldmZuKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGRvbWFpbl9yZW1vdmVfb25lX2Rldl9pbmZvKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLAotCQkJCQkgIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8gKmluZm87Ci0Jc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBmb3VuZCA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7Ci0KLQlpb21tdSA9IGRldmljZV90b19pb21tdShwY2lfZG9tYWluX25yKHBkZXYtPmJ1cyksIHBkZXYtPmJ1cy0+bnVtYmVyLAotCQkJCXBkZXYtPmRldmZuKTsKLQlpZiAoIWlvbW11KQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZkb21haW4tPmRldmljZXMpIHsKLQkJaW5mbyA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8sIGxpbmspOwotCQlpZiAoaW5mby0+c2VnbWVudCA9PSBwY2lfZG9tYWluX25yKHBkZXYtPmJ1cykgJiYKLQkJICAgIGluZm8tPmJ1cyA9PSBwZGV2LT5idXMtPm51bWJlciAmJgotCQkgICAgaW5mby0+ZGV2Zm4gPT0gcGRldi0+ZGV2Zm4pIHsKLQkJCWxpc3RfZGVsKCZpbmZvLT5saW5rKTsKLQkJCWxpc3RfZGVsKCZpbmZvLT5nbG9iYWwpOwotCQkJaWYgKGluZm8tPmRldikKLQkJCQlpbmZvLT5kZXYtPmRldi5hcmNoZGF0YS5pb21tdSA9IE5VTEw7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKLQotCQkJaW9tbXVfZGlzYWJsZV9kZXZfaW90bGIoaW5mbyk7Ci0JCQlpb21tdV9kZXRhY2hfZGV2KGlvbW11LCBpbmZvLT5idXMsIGluZm8tPmRldmZuKTsKLQkJCWlvbW11X2RldGFjaF9kZXBlbmRlbnRfZGV2aWNlcyhpb21tdSwgcGRldik7Ci0JCQlmcmVlX2RldmluZm9fbWVtKGluZm8pOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChmb3VuZCkKLQkJCQlicmVhazsKLQkJCWVsc2UKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCS8qIGlmIHRoZXJlIGlzIG5vIG90aGVyIGRldmljZXMgdW5kZXIgdGhlIHNhbWUgaW9tbXUKLQkJICogb3duZWQgYnkgdGhpcyBkb21haW4sIGNsZWFyIHRoaXMgaW9tbXUgaW4gaW9tbXVfYm1wCi0JCSAqIHVwZGF0ZSBpb21tdSBjb3VudCBhbmQgY29oZXJlbmN5Ci0JCSAqLwotCQlpZiAoaW9tbXUgPT0gZGV2aWNlX3RvX2lvbW11KGluZm8tPnNlZ21lbnQsIGluZm8tPmJ1cywKLQkJCQkJICAgIGluZm8tPmRldmZuKSkKLQkJCWZvdW5kID0gMTsKLQl9Ci0KLQlpZiAoZm91bmQgPT0gMCkgewotCQl1bnNpZ25lZCBsb25nIHRtcF9mbGFnczsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+aW9tbXVfbG9jaywgdG1wX2ZsYWdzKTsKLQkJY2xlYXJfYml0KGlvbW11LT5zZXFfaWQsICZkb21haW4tPmlvbW11X2JtcCk7Ci0JCWRvbWFpbi0+aW9tbXVfY291bnQtLTsKLQkJZG9tYWluX3VwZGF0ZV9pb21tdV9jYXAoZG9tYWluKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5pb21tdV9sb2NrLCB0bXBfZmxhZ3MpOwotCi0JCWlmICghKGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19WSVJUVUFMX01BQ0hJTkUpICYmCi0JCSAgICAhKGRvbWFpbi0+ZmxhZ3MgJiBET01BSU5fRkxBR19TVEFUSUNfSURFTlRJVFkpKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIHRtcF9mbGFncyk7Ci0JCQljbGVhcl9iaXQoZG9tYWluLT5pZCwgaW9tbXUtPmRvbWFpbl9pZHMpOwotCQkJaW9tbXUtPmRvbWFpbnNbZG9tYWluLT5pZF0gPSBOVUxMOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIHRtcF9mbGFncyk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgdm1fZG9tYWluX3JlbW92ZV9hbGxfZGV2X2luZm8oc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCi17Ci0Jc3RydWN0IGRldmljZV9kb21haW5faW5mbyAqaW5mbzsKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MxLCBmbGFnczI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFnczEpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmZG9tYWluLT5kZXZpY2VzKSkgewotCQlpbmZvID0gbGlzdF9lbnRyeShkb21haW4tPmRldmljZXMubmV4dCwKLQkJCXN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8sIGxpbmspOwotCQlsaXN0X2RlbCgmaW5mby0+bGluayk7Ci0JCWxpc3RfZGVsKCZpbmZvLT5nbG9iYWwpOwotCQlpZiAoaW5mby0+ZGV2KQotCQkJaW5mby0+ZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXUgPSBOVUxMOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MxKTsKLQotCQlpb21tdV9kaXNhYmxlX2Rldl9pb3RsYihpbmZvKTsKLQkJaW9tbXUgPSBkZXZpY2VfdG9faW9tbXUoaW5mby0+c2VnbWVudCwgaW5mby0+YnVzLCBpbmZvLT5kZXZmbik7Ci0JCWlvbW11X2RldGFjaF9kZXYoaW9tbXUsIGluZm8tPmJ1cywgaW5mby0+ZGV2Zm4pOwotCQlpb21tdV9kZXRhY2hfZGVwZW5kZW50X2RldmljZXMoaW9tbXUsIGluZm8tPmRldik7Ci0KLQkJLyogY2xlYXIgdGhpcyBpb21tdSBpbiBpb21tdV9ibXAsIHVwZGF0ZSBpb21tdSBjb3VudAotCQkgKiBhbmQgY2FwYWJpbGl0aWVzCi0JCSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZG9tYWluLT5pb21tdV9sb2NrLCBmbGFnczIpOwotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KGlvbW11LT5zZXFfaWQsCi0JCQkJICAgICAgICZkb21haW4tPmlvbW11X2JtcCkpIHsKLQkJCWRvbWFpbi0+aW9tbXVfY291bnQtLTsKLQkJCWRvbWFpbl91cGRhdGVfaW9tbXVfY2FwKGRvbWFpbik7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5pb21tdV9sb2NrLCBmbGFnczIpOwotCi0JCWZyZWVfZGV2aW5mb19tZW0oaW5mbyk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2VfZG9tYWluX2xvY2ssIGZsYWdzMSk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MxKTsKLX0KLQotLyogZG9tYWluIGlkIGZvciB2aXJ0dWFsIG1hY2hpbmUsIGl0IHdvbid0IGJlIHNldCBpbiBjb250ZXh0ICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2bV9kb21pZDsKLQotc3RhdGljIHN0cnVjdCBkbWFyX2RvbWFpbiAqaW9tbXVfYWxsb2Nfdm1fZG9tYWluKHZvaWQpCi17Ci0Jc3RydWN0IGRtYXJfZG9tYWluICpkb21haW47Ci0KLQlkb21haW4gPSBhbGxvY19kb21haW5fbWVtKCk7Ci0JaWYgKCFkb21haW4pCi0JCXJldHVybiBOVUxMOwotCi0JZG9tYWluLT5pZCA9IHZtX2RvbWlkKys7Ci0JZG9tYWluLT5uaWQgPSAtMTsKLQltZW1zZXQoJmRvbWFpbi0+aW9tbXVfYm1wLCAwLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCWRvbWFpbi0+ZmxhZ3MgPSBET01BSU5fRkxBR19WSVJUVUFMX01BQ0hJTkU7Ci0KLQlyZXR1cm4gZG9tYWluOwotfQotCi1zdGF0aWMgaW50IG1kX2RvbWFpbl9pbml0KHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLCBpbnQgZ3Vlc3Rfd2lkdGgpCi17Ci0JaW50IGFkanVzdF93aWR0aDsKLQotCWluaXRfaW92YV9kb21haW4oJmRvbWFpbi0+aW92YWQsIERNQV8zMkJJVF9QRk4pOwotCXNwaW5fbG9ja19pbml0KCZkb21haW4tPmlvbW11X2xvY2spOwotCi0JZG9tYWluX3Jlc2VydmVfc3BlY2lhbF9yYW5nZXMoZG9tYWluKTsKLQotCS8qIGNhbGN1bGF0ZSBBR0FXICovCi0JZG9tYWluLT5nYXcgPSBndWVzdF93aWR0aDsKLQlhZGp1c3Rfd2lkdGggPSBndWVzdHdpZHRoX3RvX2FkanVzdHdpZHRoKGd1ZXN0X3dpZHRoKTsKLQlkb21haW4tPmFnYXcgPSB3aWR0aF90b19hZ2F3KGFkanVzdF93aWR0aCk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmZG9tYWluLT5kZXZpY2VzKTsKLQotCWRvbWFpbi0+aW9tbXVfY291bnQgPSAwOwotCWRvbWFpbi0+aW9tbXVfY29oZXJlbmN5ID0gMDsKLQlkb21haW4tPmlvbW11X3Nub29waW5nID0gMDsKLQlkb21haW4tPmlvbW11X3N1cGVycGFnZSA9IDA7Ci0JZG9tYWluLT5tYXhfYWRkciA9IDA7Ci0JZG9tYWluLT5uaWQgPSAtMTsKLQotCS8qIGFsd2F5cyBhbGxvY2F0ZSB0aGUgdG9wIHBnZCAqLwotCWRvbWFpbi0+cGdkID0gKHN0cnVjdCBkbWFfcHRlICopYWxsb2NfcGd0YWJsZV9wYWdlKGRvbWFpbi0+bmlkKTsKLQlpZiAoIWRvbWFpbi0+cGdkKQotCQlyZXR1cm4gLUVOT01FTTsKLQlkb21haW5fZmx1c2hfY2FjaGUoZG9tYWluLCBkb21haW4tPnBnZCwgUEFHRV9TSVpFKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfZnJlZV92bV9kb21haW4oc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7Ci0Jc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKLQl1bnNpZ25lZCBsb25nIGk7Ci0JdW5zaWduZWQgbG9uZyBuZG9tYWluczsKLQotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7Ci0JCWlmIChkcmhkLT5pZ25vcmVkKQotCQkJY29udGludWU7Ci0JCWlvbW11ID0gZHJoZC0+aW9tbXU7Ci0KLQkJbmRvbWFpbnMgPSBjYXBfbmRvbXMoaW9tbXUtPmNhcCk7Ci0JCWZvcl9lYWNoX3NldF9iaXQoaSwgaW9tbXUtPmRvbWFpbl9pZHMsIG5kb21haW5zKSB7Ci0JCQlpZiAoaW9tbXUtPmRvbWFpbnNbaV0gPT0gZG9tYWluKSB7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0JCQkJY2xlYXJfYml0KGksIGlvbW11LT5kb21haW5faWRzKTsKLQkJCQlpb21tdS0+ZG9tYWluc1tpXSA9IE5VTEw7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgdm1fZG9tYWluX2V4aXQoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCi17Ci0JLyogRG9tYWluIDAgaXMgcmVzZXJ2ZWQsIHNvIGRvbnQgcHJvY2VzcyBpdCAqLwotCWlmICghZG9tYWluKQotCQlyZXR1cm47Ci0KLQl2bV9kb21haW5fcmVtb3ZlX2FsbF9kZXZfaW5mbyhkb21haW4pOwotCS8qIGRlc3Ryb3kgaW92YXMgKi8KLQlwdXRfaW92YV9kb21haW4oJmRvbWFpbi0+aW92YWQpOwotCi0JLyogY2xlYXIgcHRlcyAqLwotCWRtYV9wdGVfY2xlYXJfcmFuZ2UoZG9tYWluLCAwLCBET01BSU5fTUFYX1BGTihkb21haW4tPmdhdykpOwotCi0JLyogZnJlZSBwYWdlIHRhYmxlcyAqLwotCWRtYV9wdGVfZnJlZV9wYWdldGFibGUoZG9tYWluLCAwLCBET01BSU5fTUFYX1BGTihkb21haW4tPmdhdykpOwotCi0JaW9tbXVfZnJlZV92bV9kb21haW4oZG9tYWluKTsKLQlmcmVlX2RvbWFpbl9tZW0oZG9tYWluKTsKLX0KLQotc3RhdGljIGludCBpbnRlbF9pb21tdV9kb21haW5faW5pdChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCi17Ci0Jc3RydWN0IGRtYXJfZG9tYWluICpkbWFyX2RvbWFpbjsKLQotCWRtYXJfZG9tYWluID0gaW9tbXVfYWxsb2Nfdm1fZG9tYWluKCk7Ci0JaWYgKCFkbWFyX2RvbWFpbikgewotCQlwcmludGsoS0VSTl9FUlIKLQkJCSJpbnRlbF9pb21tdV9kb21haW5faW5pdDogZG1hcl9kb21haW4gPT0gTlVMTFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlpZiAobWRfZG9tYWluX2luaXQoZG1hcl9kb21haW4sIERFRkFVTFRfRE9NQUlOX0FERFJFU1NfV0lEVEgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkJImludGVsX2lvbW11X2RvbWFpbl9pbml0KCkgZmFpbGVkXG4iKTsKLQkJdm1fZG9tYWluX2V4aXQoZG1hcl9kb21haW4pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JZG9tYWluLT5wcml2ID0gZG1hcl9kb21haW47Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaW50ZWxfaW9tbXVfZG9tYWluX2Rlc3Ryb3koc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQotewotCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG1hcl9kb21haW4gPSBkb21haW4tPnByaXY7Ci0KLQlkb21haW4tPnByaXYgPSBOVUxMOwotCXZtX2RvbWFpbl9leGl0KGRtYXJfZG9tYWluKTsKLX0KLQotc3RhdGljIGludCBpbnRlbF9pb21tdV9hdHRhY2hfZGV2aWNlKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZG1hcl9kb21haW4gKmRtYXJfZG9tYWluID0gZG9tYWluLT5wcml2OwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7Ci0JaW50IGFkZHJfd2lkdGg7Ci0KLQkvKiBub3JtYWxseSBwZGV2IGlzIG5vdCBtYXBwZWQgKi8KLQlpZiAodW5saWtlbHkoZG9tYWluX2NvbnRleHRfbWFwcGVkKHBkZXYpKSkgewotCQlzdHJ1Y3QgZG1hcl9kb21haW4gKm9sZF9kb21haW47Ci0KLQkJb2xkX2RvbWFpbiA9IGZpbmRfZG9tYWluKHBkZXYpOwotCQlpZiAob2xkX2RvbWFpbikgewotCQkJaWYgKGRtYXJfZG9tYWluLT5mbGFncyAmIERPTUFJTl9GTEFHX1ZJUlRVQUxfTUFDSElORSB8fAotCQkJICAgIGRtYXJfZG9tYWluLT5mbGFncyAmIERPTUFJTl9GTEFHX1NUQVRJQ19JREVOVElUWSkKLQkJCQlkb21haW5fcmVtb3ZlX29uZV9kZXZfaW5mbyhvbGRfZG9tYWluLCBwZGV2KTsKLQkJCWVsc2UKLQkJCQlkb21haW5fcmVtb3ZlX2Rldl9pbmZvKG9sZF9kb21haW4pOwotCQl9Ci0JfQotCi0JaW9tbXUgPSBkZXZpY2VfdG9faW9tbXUocGNpX2RvbWFpbl9ucihwZGV2LT5idXMpLCBwZGV2LT5idXMtPm51bWJlciwKLQkJCQlwZGV2LT5kZXZmbik7Ci0JaWYgKCFpb21tdSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBjaGVjayBpZiB0aGlzIGlvbW11IGFnYXcgaXMgc3VmZmljaWVudCBmb3IgbWF4IG1hcHBlZCBhZGRyZXNzICovCi0JYWRkcl93aWR0aCA9IGFnYXdfdG9fd2lkdGgoaW9tbXUtPmFnYXcpOwotCWlmIChhZGRyX3dpZHRoID4gY2FwX21nYXcoaW9tbXUtPmNhcCkpCi0JCWFkZHJfd2lkdGggPSBjYXBfbWdhdyhpb21tdS0+Y2FwKTsKLQotCWlmIChkbWFyX2RvbWFpbi0+bWF4X2FkZHIgPiAoMUxMIDw8IGFkZHJfd2lkdGgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGlvbW11IHdpZHRoICglZCkgaXMgbm90ICIKLQkJICAgICAgICJzdWZmaWNpZW50IGZvciB0aGUgbWFwcGVkIGFkZHJlc3MgKCVsbHgpXG4iLAotCQkgICAgICAgX19mdW5jX18sIGFkZHJfd2lkdGgsIGRtYXJfZG9tYWluLT5tYXhfYWRkcik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQlkbWFyX2RvbWFpbi0+Z2F3ID0gYWRkcl93aWR0aDsKLQotCS8qCi0JICogS25vY2sgb3V0IGV4dHJhIGxldmVscyBvZiBwYWdlIHRhYmxlcyBpZiBuZWNlc3NhcnkKLQkgKi8KLQl3aGlsZSAoaW9tbXUtPmFnYXcgPCBkbWFyX2RvbWFpbi0+YWdhdykgewotCQlzdHJ1Y3QgZG1hX3B0ZSAqcHRlOwotCi0JCXB0ZSA9IGRtYXJfZG9tYWluLT5wZ2Q7Ci0JCWlmIChkbWFfcHRlX3ByZXNlbnQocHRlKSkgewotCQkJZG1hcl9kb21haW4tPnBnZCA9IChzdHJ1Y3QgZG1hX3B0ZSAqKQotCQkJCXBoeXNfdG9fdmlydChkbWFfcHRlX2FkZHIocHRlKSk7Ci0JCQlmcmVlX3BndGFibGVfcGFnZShwdGUpOwotCQl9Ci0JCWRtYXJfZG9tYWluLT5hZ2F3LS07Ci0JfQotCi0JcmV0dXJuIGRvbWFpbl9hZGRfZGV2X2luZm8oZG1hcl9kb21haW4sIHBkZXYsIENPTlRFWFRfVFRfTVVMVElfTEVWRUwpOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlbF9pb21tdV9kZXRhY2hfZGV2aWNlKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRtYXJfZG9tYWluICpkbWFyX2RvbWFpbiA9IGRvbWFpbi0+cHJpdjsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQotCWRvbWFpbl9yZW1vdmVfb25lX2Rldl9pbmZvKGRtYXJfZG9tYWluLCBwZGV2KTsKLX0KLQotc3RhdGljIGludCBpbnRlbF9pb21tdV9tYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAotCQkJICAgdW5zaWduZWQgbG9uZyBpb3ZhLCBwaHlzX2FkZHJfdCBocGEsCi0JCQkgICBpbnQgZ2ZwX29yZGVyLCBpbnQgaW9tbXVfcHJvdCkKLXsKLQlzdHJ1Y3QgZG1hcl9kb21haW4gKmRtYXJfZG9tYWluID0gZG9tYWluLT5wcml2OwotCXU2NCBtYXhfYWRkcjsKLQlpbnQgcHJvdCA9IDA7Ci0Jc2l6ZV90IHNpemU7Ci0JaW50IHJldDsKLQotCWlmIChpb21tdV9wcm90ICYgSU9NTVVfUkVBRCkKLQkJcHJvdCB8PSBETUFfUFRFX1JFQUQ7Ci0JaWYgKGlvbW11X3Byb3QgJiBJT01NVV9XUklURSkKLQkJcHJvdCB8PSBETUFfUFRFX1dSSVRFOwotCWlmICgoaW9tbXVfcHJvdCAmIElPTU1VX0NBQ0hFKSAmJiBkbWFyX2RvbWFpbi0+aW9tbXVfc25vb3BpbmcpCi0JCXByb3QgfD0gRE1BX1BURV9TTlA7Ci0KLQlzaXplICAgICA9IFBBR0VfU0laRSA8PCBnZnBfb3JkZXI7Ci0JbWF4X2FkZHIgPSBpb3ZhICsgc2l6ZTsKLQlpZiAoZG1hcl9kb21haW4tPm1heF9hZGRyIDwgbWF4X2FkZHIpIHsKLQkJdTY0IGVuZDsKLQotCQkvKiBjaGVjayBpZiBtaW5pbXVtIGFnYXcgaXMgc3VmZmljaWVudCBmb3IgbWFwcGVkIGFkZHJlc3MgKi8KLQkJZW5kID0gX19ET01BSU5fTUFYX0FERFIoZG1hcl9kb21haW4tPmdhdykgKyAxOwotCQlpZiAoZW5kIDwgbWF4X2FkZHIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlvbW11IHdpZHRoICglZCkgaXMgbm90ICIKLQkJCSAgICAgICAic3VmZmljaWVudCBmb3IgdGhlIG1hcHBlZCBhZGRyZXNzICglbGx4KVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgZG1hcl9kb21haW4tPmdhdywgbWF4X2FkZHIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJZG1hcl9kb21haW4tPm1heF9hZGRyID0gbWF4X2FkZHI7Ci0JfQotCS8qIFJvdW5kIHVwIHNpemUgdG8gbmV4dCBtdWx0aXBsZSBvZiBQQUdFX1NJWkUsIGlmIGl0IGFuZAotCSAgIHRoZSBsb3cgYml0cyBvZiBocGEgd291bGQgdGFrZSB1cyBvbnRvIHRoZSBuZXh0IHBhZ2UgKi8KLQlzaXplID0gYWxpZ25lZF9ucnBhZ2VzKGhwYSwgc2l6ZSk7Ci0JcmV0ID0gZG9tYWluX3Bmbl9tYXBwaW5nKGRtYXJfZG9tYWluLCBpb3ZhID4+IFZURF9QQUdFX1NISUZULAotCQkJCSBocGEgPj4gVlREX1BBR0VfU0hJRlQsIHNpemUsIHByb3QpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaW50ZWxfaW9tbXVfdW5tYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAotCQkJICAgICB1bnNpZ25lZCBsb25nIGlvdmEsIGludCBnZnBfb3JkZXIpCi17Ci0Jc3RydWN0IGRtYXJfZG9tYWluICpkbWFyX2RvbWFpbiA9IGRvbWFpbi0+cHJpdjsKLQlzaXplX3Qgc2l6ZSA9IFBBR0VfU0laRSA8PCBnZnBfb3JkZXI7Ci0KLQlkbWFfcHRlX2NsZWFyX3JhbmdlKGRtYXJfZG9tYWluLCBpb3ZhID4+IFZURF9QQUdFX1NISUZULAotCQkJICAgIChpb3ZhICsgc2l6ZSAtIDEpID4+IFZURF9QQUdFX1NISUZUKTsKLQotCWlmIChkbWFyX2RvbWFpbi0+bWF4X2FkZHIgPT0gaW92YSArIHNpemUpCi0JCWRtYXJfZG9tYWluLT5tYXhfYWRkciA9IGlvdmE7Ci0KLQlyZXR1cm4gZ2ZwX29yZGVyOwotfQotCi1zdGF0aWMgcGh5c19hZGRyX3QgaW50ZWxfaW9tbXVfaW92YV90b19waHlzKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgaW92YSkKLXsKLQlzdHJ1Y3QgZG1hcl9kb21haW4gKmRtYXJfZG9tYWluID0gZG9tYWluLT5wcml2OwotCXN0cnVjdCBkbWFfcHRlICpwdGU7Ci0JdTY0IHBoeXMgPSAwOwotCi0JcHRlID0gcGZuX3RvX2RtYV9wdGUoZG1hcl9kb21haW4sIGlvdmEgPj4gVlREX1BBR0VfU0hJRlQsIDApOwotCWlmIChwdGUpCi0JCXBoeXMgPSBkbWFfcHRlX2FkZHIocHRlKTsKLQotCXJldHVybiBwaHlzOwotfQotCi1zdGF0aWMgaW50IGludGVsX2lvbW11X2RvbWFpbl9oYXNfY2FwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGNhcCkKLXsKLQlzdHJ1Y3QgZG1hcl9kb21haW4gKmRtYXJfZG9tYWluID0gZG9tYWluLT5wcml2OwotCi0JaWYgKGNhcCA9PSBJT01NVV9DQVBfQ0FDSEVfQ09IRVJFTkNZKQotCQlyZXR1cm4gZG1hcl9kb21haW4tPmlvbW11X3Nub29waW5nOwotCWlmIChjYXAgPT0gSU9NTVVfQ0FQX0lOVFJfUkVNQVApCi0JCXJldHVybiBpbnRyX3JlbWFwcGluZ19lbmFibGVkOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW9tbXVfb3BzIGludGVsX2lvbW11X29wcyA9IHsKLQkuZG9tYWluX2luaXQJPSBpbnRlbF9pb21tdV9kb21haW5faW5pdCwKLQkuZG9tYWluX2Rlc3Ryb3kgPSBpbnRlbF9pb21tdV9kb21haW5fZGVzdHJveSwKLQkuYXR0YWNoX2Rldgk9IGludGVsX2lvbW11X2F0dGFjaF9kZXZpY2UsCi0JLmRldGFjaF9kZXYJPSBpbnRlbF9pb21tdV9kZXRhY2hfZGV2aWNlLAotCS5tYXAJCT0gaW50ZWxfaW9tbXVfbWFwLAotCS51bm1hcAkJPSBpbnRlbF9pb21tdV91bm1hcCwKLQkuaW92YV90b19waHlzCT0gaW50ZWxfaW9tbXVfaW92YV90b19waHlzLAotCS5kb21haW5faGFzX2NhcCA9IGludGVsX2lvbW11X2RvbWFpbl9oYXNfY2FwLAotfTsKLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2lvbW11X3J3YmYoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQkvKgotCSAqIE1vYmlsZSA0IFNlcmllcyBDaGlwc2V0IG5lZ2xlY3RzIHRvIHNldCBSV0JGIGNhcGFiaWxpdHksCi0JICogYnV0IG5lZWRzIGl0OgotCSAqLwotCXByaW50ayhLRVJOX0lORk8gIkRNQVI6IEZvcmNpbmcgd3JpdGUtYnVmZmVyIGZsdXNoIGNhcGFiaWxpdHlcbiIpOwotCXJ3YmZfcXVpcmsgPSAxOwotCi0JLyogaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD01MzgxNjMgKi8KLQlpZiAoZGV2LT5yZXZpc2lvbiA9PSAweDA3KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkRNQVI6IERpc2FibGluZyBJT01NVSBmb3IgZ3JhcGhpY3Mgb24gdGhpcyBjaGlwc2V0XG4iKTsKLQkJZG1hcl9tYXBfZ2Z4ID0gMDsKLQl9Ci19Ci0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDJhNDAsIHF1aXJrX2lvbW11X3J3YmYpOwotCi0jZGVmaW5lIEdHQyAweDUyCi0jZGVmaW5lIEdHQ19NRU1PUllfU0laRV9NQVNLCSgweGYgPDwgOCkKLSNkZWZpbmUgR0dDX01FTU9SWV9TSVpFX05PTkUJKDB4MCA8PCA4KQotI2RlZmluZSBHR0NfTUVNT1JZX1NJWkVfMU0JKDB4MSA8PCA4KQotI2RlZmluZSBHR0NfTUVNT1JZX1NJWkVfMk0JKDB4MyA8PCA4KQotI2RlZmluZSBHR0NfTUVNT1JZX1ZUX0VOQUJMRUQJKDB4OCA8PCA4KQotI2RlZmluZSBHR0NfTUVNT1JZX1NJWkVfMk1fVlQJKDB4OSA8PCA4KQotI2RlZmluZSBHR0NfTUVNT1JZX1NJWkVfM01fVlQJKDB4YSA8PCA4KQotI2RlZmluZSBHR0NfTUVNT1JZX1NJWkVfNE1fVlQJKDB4YiA8PCA4KQotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfY2FscGVsbGFfbm9fc2hhZG93X2d0dChzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXVuc2lnbmVkIHNob3J0IGdnYzsKLQotCWlmIChwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIEdHQywgJmdnYykpCi0JCXJldHVybjsKLQotCWlmICghKGdnYyAmIEdHQ19NRU1PUllfVlRfRU5BQkxFRCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1BUjogQklPUyBoYXMgYWxsb2NhdGVkIG5vIHNoYWRvdyBHVFQ7IGRpc2FibGluZyBJT01NVSBmb3IgZ3JhcGhpY3NcbiIpOwotCQlkbWFyX21hcF9nZnggPSAwOwotCX0KLX0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDAwNDAsIHF1aXJrX2NhbHBlbGxhX25vX3NoYWRvd19ndHQpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDA0NCwgcXVpcmtfY2FscGVsbGFfbm9fc2hhZG93X2d0dCk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwMDYyLCBxdWlya19jYWxwZWxsYV9ub19zaGFkb3dfZ3R0KTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDAwNmEsIHF1aXJrX2NhbHBlbGxhX25vX3NoYWRvd19ndHQpOwotCi0vKiBPbiBUeWxlcnNidXJnIGNoaXBzZXRzLCBzb21lIEJJT1NlcyBoYXZlIGJlZW4ga25vd24gdG8gZW5hYmxlIHRoZQotICAgSVNPQ0ggRE1BUiB1bml0IGZvciB0aGUgQXphbGlhIHNvdW5kIGRldmljZSwgYnV0IG5vdCBnaXZlIGl0IGFueQotICAgVExCIGVudHJpZXMsIHdoaWNoIGNhdXNlcyBpdCB0byBkZWFkbG9jay4gQ2hlY2sgZm9yIHRoYXQuICBXZSBkbwotICAgdGhpcyBpbiBhIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGluaXRfZG1hcnMoKSwgaW5zdGVhZCBvZiBpbiBhIFBDSQotICAgcXVpcmssIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBwcmludCB0aGUgb2Jub3hpb3VzICJCSU9TIGJyb2tlbiIKLSAgIG1lc3NhZ2UgaWYgVlQtZCBpcyBhY3R1YWxseSBkaXNhYmxlZC4KLSovCi1zdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfdHlsZXJzYnVyZ19pc29jaCh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXVpbnQzMl90IHZ0aXNvY2hjdHJsOwotCi0JLyogSWYgdGhlcmUncyBubyBBemFsaWEgaW4gdGhlIHN5c3RlbSBhbnl3YXksIGZvcmdldCBpdC4gKi8KLQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgzYTNlLCBOVUxMKTsKLQlpZiAoIXBkZXYpCi0JCXJldHVybjsKLQlwY2lfZGV2X3B1dChwZGV2KTsKLQotCS8qIFN5c3RlbSBNYW5hZ2VtZW50IFJlZ2lzdGVycy4gTWlnaHQgYmUgaGlkZGVuLCBpbiB3aGljaCBjYXNlCi0JICAgd2UgY2FuJ3QgZG8gdGhlIHNhbml0eSBjaGVjay4gQnV0IHRoYXQncyBPSywgYmVjYXVzZSB0aGUKLQkgICBrbm93bi1icm9rZW4gQklPU2VzIF9kb24ndF8gYWN0dWFsbHkgaGlkZSBpdCwgc28gZmFyLiAqLwotCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDM0MmUsIE5VTEwpOwotCWlmICghcGRldikKLQkJcmV0dXJuOwotCi0JaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDE4OCwgJnZ0aXNvY2hjdHJsKSkgewotCQlwY2lfZGV2X3B1dChwZGV2KTsKLQkJcmV0dXJuOwotCX0KLQotCXBjaV9kZXZfcHV0KHBkZXYpOwotCi0JLyogSWYgQXphbGlhIERNQSBpcyByb3V0ZWQgdG8gdGhlIG5vbi1pc29jaCBETUFSIHVuaXQsIGZpbmUuICovCi0JaWYgKHZ0aXNvY2hjdHJsICYgMSkKLQkJcmV0dXJuOwotCi0JLyogRHJvcCBhbGwgYml0cyBvdGhlciB0aGFuIHRoZSBudW1iZXIgb2YgVExCIGVudHJpZXMgKi8KLQl2dGlzb2NoY3RybCAmPSAweDFjOwotCi0JLyogSWYgd2UgaGF2ZSB0aGUgcmVjb21tZW5kZWQgbnVtYmVyIG9mIFRMQiBlbnRyaWVzICgxNiksIGZpbmUuICovCi0JaWYgKHZ0aXNvY2hjdHJsID09IDB4MTApCi0JCXJldHVybjsKLQotCS8qIFplcm8gVExCIGVudHJpZXM/IFlvdSBnZXQgdG8gcmlkZSB0aGUgc2hvcnQgYnVzIHRvIHNjaG9vbC4gKi8KLQlpZiAoIXZ0aXNvY2hjdHJsKSB7Ci0JCVdBUk4oMSwgIllvdXIgQklPUyBpcyBicm9rZW47IERNQSByb3V0ZWQgdG8gSVNPQ0ggRE1BUiB1bml0IGJ1dCBubyBUTEIgc3BhY2UuXG4iCi0JCSAgICAgIkJJT1MgdmVuZG9yOiAlczsgVmVyOiAlczsgUHJvZHVjdCBWZXJzaW9uOiAlc1xuIiwKLQkJICAgICBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CSU9TX1ZFTkRPUiksCi0JCSAgICAgZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQklPU19WRVJTSU9OKSwKLQkJICAgICBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX1ZFUlNJT04pKTsKLQkJaW9tbXVfaWRlbnRpdHlfbWFwcGluZyB8PSBJREVOVE1BUF9BWkFMSUE7Ci0JCXJldHVybjsKLQl9Ci0JCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiRE1BUjogUmVjb21tZW5kZWQgVExCIGVudHJpZXMgZm9yIElTT0NIIHVuaXQgaXMgMTY7IHlvdXIgQklPUyBzZXQgJWRcbiIsCi0JICAgICAgIHZ0aXNvY2hjdHJsKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMgYi9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjA3ZmFmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTggKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYXIuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaHBldC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlbC1pb21tdS5oPgotI2luY2x1ZGUgImludHJfcmVtYXBwaW5nLmgiCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KLSNpbmNsdWRlICJwY2kuaCIKLQotc3RhdGljIHN0cnVjdCBpb2FwaWNfc2NvcGUgaXJfaW9hcGljW01BWF9JT19BUElDU107Ci1zdGF0aWMgc3RydWN0IGhwZXRfc2NvcGUgaXJfaHBldFtNQVhfSFBFVF9UQlNdOwotc3RhdGljIGludCBpcl9pb2FwaWNfbnVtLCBpcl9ocGV0X251bTsKLWludCBpbnRyX3JlbWFwcGluZ19lbmFibGVkOwotCi1zdGF0aWMgaW50IGRpc2FibGVfaW50cmVtYXA7Ci1zdGF0aWMgaW50IGRpc2FibGVfc291cmNlaWRfY2hlY2tpbmc7Ci0KLXN0YXRpYyBfX2luaXQgaW50IHNldHVwX25vaW50cmVtYXAoY2hhciAqc3RyKQotewotCWRpc2FibGVfaW50cmVtYXAgPSAxOwotCXJldHVybiAwOwotfQotZWFybHlfcGFyYW0oIm5vaW50cmVtYXAiLCBzZXR1cF9ub2ludHJlbWFwKTsKLQotc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfaW50cmVtYXAoY2hhciAqc3RyKQotewotCWlmICghc3RyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghc3RybmNtcChzdHIsICJvbiIsIDIpKQotCQlkaXNhYmxlX2ludHJlbWFwID0gMDsKLQllbHNlIGlmICghc3RybmNtcChzdHIsICJvZmYiLCAzKSkKLQkJZGlzYWJsZV9pbnRyZW1hcCA9IDE7Ci0JZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAibm9zaWQiLCA1KSkKLQkJZGlzYWJsZV9zb3VyY2VpZF9jaGVja2luZyA9IDE7Ci0KLQlyZXR1cm4gMDsKLX0KLWVhcmx5X3BhcmFtKCJpbnRyZW1hcCIsIHNldHVwX2ludHJlbWFwKTsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhpcnFfMl9pcl9sb2NrKTsKLQotc3RhdGljIHN0cnVjdCBpcnFfMl9pb21tdSAqaXJxXzJfaW9tbXUodW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gaXJxX2dldF9jaGlwX2RhdGEoaXJxKTsKLQlyZXR1cm4gY2ZnID8gJmNmZy0+aXJxXzJfaW9tbXUgOiBOVUxMOwotfQotCi1pbnQgZ2V0X2lydGUoaW50IGlycSwgc3RydWN0IGlydGUgKmVudHJ5KQotewotCXN0cnVjdCBpcnFfMl9pb21tdSAqaXJxX2lvbW11ID0gaXJxXzJfaW9tbXUoaXJxKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpbmRleDsKLQotCWlmICghZW50cnkgfHwgIWlycV9pb21tdSkKLQkJcmV0dXJuIC0xOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlycV8yX2lyX2xvY2ssIGZsYWdzKTsKLQotCWluZGV4ID0gaXJxX2lvbW11LT5pcnRlX2luZGV4ICsgaXJxX2lvbW11LT5zdWJfaGFuZGxlOwotCSplbnRyeSA9ICooaXJxX2lvbW11LT5pb21tdS0+aXJfdGFibGUtPmJhc2UgKyBpbmRleCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfMl9pcl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBhbGxvY19pcnRlKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsIGludCBpcnEsIHUxNiBjb3VudCkKLXsKLQlzdHJ1Y3QgaXJfdGFibGUgKnRhYmxlID0gaW9tbXUtPmlyX3RhYmxlOwotCXN0cnVjdCBpcnFfMl9pb21tdSAqaXJxX2lvbW11ID0gaXJxXzJfaW9tbXUoaXJxKTsKLQl1MTYgaW5kZXgsIHN0YXJ0X2luZGV4OwotCXVuc2lnbmVkIGludCBtYXNrID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOwotCi0JaWYgKCFjb3VudCB8fCAhaXJxX2lvbW11KQotCQlyZXR1cm4gLTE7Ci0KLQkvKgotCSAqIHN0YXJ0IHRoZSBJUlRFIHNlYXJjaCBmcm9tIGluZGV4IDAuCi0JICovCi0JaW5kZXggPSBzdGFydF9pbmRleCA9IDA7Ci0KLQlpZiAoY291bnQgPiAxKSB7Ci0JCWNvdW50ID0gX19yb3VuZHVwX3Bvd19vZl90d28oY291bnQpOwotCQltYXNrID0gaWxvZzIoY291bnQpOwotCX0KLQotCWlmIChtYXNrID4gZWNhcF9tYXhfaGFuZGxlX21hc2soaW9tbXUtPmVjYXApKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIlJlcXVlc3RlZCBtYXNrICV4IGV4Y2VlZHMgdGhlIG1heCBpbnZhbGlkYXRpb24gaGFuZGxlIgotCQkgICAgICAgIiBtYXNrIHZhbHVlICVMeFxuIiwgbWFzaywKLQkJICAgICAgIGVjYXBfbWF4X2hhbmRsZV9tYXNrKGlvbW11LT5lY2FwKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxXzJfaXJfbG9jaywgZmxhZ3MpOwotCWRvIHsKLQkJZm9yIChpID0gaW5kZXg7IGkgPCBpbmRleCArIGNvdW50OyBpKyspCi0JCQlpZiAgKHRhYmxlLT5iYXNlW2ldLnByZXNlbnQpCi0JCQkJYnJlYWs7Ci0JCS8qIGVtcHR5IGluZGV4IGZvdW5kICovCi0JCWlmIChpID09IGluZGV4ICsgY291bnQpCi0JCQlicmVhazsKLQotCQlpbmRleCA9IChpbmRleCArIGNvdW50KSAlIElOVFJfUkVNQVBfVEFCTEVfRU5UUklFUzsKLQotCQlpZiAoaW5kZXggPT0gc3RhcnRfaW5kZXgpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV8yX2lyX2xvY2ssIGZsYWdzKTsKLQkJCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgYWxsb2NhdGUgYW4gSVJURVxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9IHdoaWxlICgxKTsKLQotCWZvciAoaSA9IGluZGV4OyBpIDwgaW5kZXggKyBjb3VudDsgaSsrKQotCQl0YWJsZS0+YmFzZVtpXS5wcmVzZW50ID0gMTsKLQotCWlycV9pb21tdS0+aW9tbXUgPSBpb21tdTsKLQlpcnFfaW9tbXUtPmlydGVfaW5kZXggPSAgaW5kZXg7Ci0JaXJxX2lvbW11LT5zdWJfaGFuZGxlID0gMDsKLQlpcnFfaW9tbXUtPmlydGVfbWFzayA9IG1hc2s7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfMl9pcl9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gaW5kZXg7Ci19Ci0KLXN0YXRpYyBpbnQgcWlfZmx1c2hfaWVjKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsIGludCBpbmRleCwgaW50IG1hc2spCi17Ci0Jc3RydWN0IHFpX2Rlc2MgZGVzYzsKLQotCWRlc2MubG93ID0gUUlfSUVDX0lJREVYKGluZGV4KSB8IFFJX0lFQ19UWVBFIHwgUUlfSUVDX0lNKG1hc2spCi0JCSAgIHwgUUlfSUVDX1NFTEVDVElWRTsKLQlkZXNjLmhpZ2ggPSAwOwotCi0JcmV0dXJuIHFpX3N1Ym1pdF9zeW5jKCZkZXNjLCBpb21tdSk7Ci19Ci0KLWludCBtYXBfaXJxX3RvX2lydGVfaGFuZGxlKGludCBpcnEsIHUxNiAqc3ViX2hhbmRsZSkKLXsKLQlzdHJ1Y3QgaXJxXzJfaW9tbXUgKmlycV9pb21tdSA9IGlycV8yX2lvbW11KGlycSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaW5kZXg7Ci0KLQlpZiAoIWlycV9pb21tdSkKLQkJcmV0dXJuIC0xOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlycV8yX2lyX2xvY2ssIGZsYWdzKTsKLQkqc3ViX2hhbmRsZSA9IGlycV9pb21tdS0+c3ViX2hhbmRsZTsKLQlpbmRleCA9IGlycV9pb21tdS0+aXJ0ZV9pbmRleDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfMl9pcl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGluZGV4OwotfQotCi1pbnQgc2V0X2lydGVfaXJxKGludCBpcnEsIHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsIHUxNiBpbmRleCwgdTE2IHN1YmhhbmRsZSkKLXsKLQlzdHJ1Y3QgaXJxXzJfaW9tbXUgKmlycV9pb21tdSA9IGlycV8yX2lvbW11KGlycSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghaXJxX2lvbW11KQotCQlyZXR1cm4gLTE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxXzJfaXJfbG9jaywgZmxhZ3MpOwotCi0JaXJxX2lvbW11LT5pb21tdSA9IGlvbW11OwotCWlycV9pb21tdS0+aXJ0ZV9pbmRleCA9IGluZGV4OwotCWlycV9pb21tdS0+c3ViX2hhbmRsZSA9IHN1YmhhbmRsZTsKLQlpcnFfaW9tbXUtPmlydGVfbWFzayA9IDA7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfMl9pcl9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IG1vZGlmeV9pcnRlKGludCBpcnEsIHN0cnVjdCBpcnRlICppcnRlX21vZGlmaWVkKQotewotCXN0cnVjdCBpcnFfMl9pb21tdSAqaXJxX2lvbW11ID0gaXJxXzJfaW9tbXUoaXJxKTsKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGlydGUgKmlydGU7Ci0JaW50IHJjLCBpbmRleDsKLQotCWlmICghaXJxX2lvbW11KQotCQlyZXR1cm4gLTE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxXzJfaXJfbG9jaywgZmxhZ3MpOwotCi0JaW9tbXUgPSBpcnFfaW9tbXUtPmlvbW11OwotCi0JaW5kZXggPSBpcnFfaW9tbXUtPmlydGVfaW5kZXggKyBpcnFfaW9tbXUtPnN1Yl9oYW5kbGU7Ci0JaXJ0ZSA9ICZpb21tdS0+aXJfdGFibGUtPmJhc2VbaW5kZXhdOwotCi0Jc2V0XzY0Yml0KCZpcnRlLT5sb3csIGlydGVfbW9kaWZpZWQtPmxvdyk7Ci0Jc2V0XzY0Yml0KCZpcnRlLT5oaWdoLCBpcnRlX21vZGlmaWVkLT5oaWdoKTsKLQlfX2lvbW11X2ZsdXNoX2NhY2hlKGlvbW11LCBpcnRlLCBzaXplb2YoKmlydGUpKTsKLQotCXJjID0gcWlfZmx1c2hfaWVjKGlvbW11LCBpbmRleCwgMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxXzJfaXJfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdHJ1Y3QgaW50ZWxfaW9tbXUgKm1hcF9ocGV0X3RvX2lyKHU4IGhwZXRfaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hQRVRfVEJTOyBpKyspCi0JCWlmIChpcl9ocGV0W2ldLmlkID09IGhwZXRfaWQpCi0JCQlyZXR1cm4gaXJfaHBldFtpXS5pb21tdTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RydWN0IGludGVsX2lvbW11ICptYXBfaW9hcGljX3RvX2lyKGludCBhcGljKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9JT19BUElDUzsgaSsrKQotCQlpZiAoaXJfaW9hcGljW2ldLmlkID09IGFwaWMpCi0JCQlyZXR1cm4gaXJfaW9hcGljW2ldLmlvbW11OwotCXJldHVybiBOVUxMOwotfQotCi1zdHJ1Y3QgaW50ZWxfaW9tbXUgKm1hcF9kZXZfdG9faXIoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7Ci0KLQlkcmhkID0gZG1hcl9maW5kX21hdGNoZWRfZHJoZF91bml0KGRldik7Ci0JaWYgKCFkcmhkKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBkcmhkLT5pb21tdTsKLX0KLQotc3RhdGljIGludCBjbGVhcl9lbnRyaWVzKHN0cnVjdCBpcnFfMl9pb21tdSAqaXJxX2lvbW11KQotewotCXN0cnVjdCBpcnRlICpzdGFydCwgKmVudHJ5LCAqZW5kOwotCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7Ci0JaW50IGluZGV4OwotCi0JaWYgKGlycV9pb21tdS0+c3ViX2hhbmRsZSkKLQkJcmV0dXJuIDA7Ci0KLQlpb21tdSA9IGlycV9pb21tdS0+aW9tbXU7Ci0JaW5kZXggPSBpcnFfaW9tbXUtPmlydGVfaW5kZXggKyBpcnFfaW9tbXUtPnN1Yl9oYW5kbGU7Ci0KLQlzdGFydCA9IGlvbW11LT5pcl90YWJsZS0+YmFzZSArIGluZGV4OwotCWVuZCA9IHN0YXJ0ICsgKDEgPDwgaXJxX2lvbW11LT5pcnRlX21hc2spOwotCi0JZm9yIChlbnRyeSA9IHN0YXJ0OyBlbnRyeSA8IGVuZDsgZW50cnkrKykgewotCQlzZXRfNjRiaXQoJmVudHJ5LT5sb3csIDApOwotCQlzZXRfNjRiaXQoJmVudHJ5LT5oaWdoLCAwKTsKLQl9Ci0KLQlyZXR1cm4gcWlfZmx1c2hfaWVjKGlvbW11LCBpbmRleCwgaXJxX2lvbW11LT5pcnRlX21hc2spOwotfQotCi1pbnQgZnJlZV9pcnRlKGludCBpcnEpCi17Ci0Jc3RydWN0IGlycV8yX2lvbW11ICppcnFfaW9tbXUgPSBpcnFfMl9pb21tdShpcnEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJjOwotCi0JaWYgKCFpcnFfaW9tbXUpCi0JCXJldHVybiAtMTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfMl9pcl9sb2NrLCBmbGFncyk7Ci0KLQlyYyA9IGNsZWFyX2VudHJpZXMoaXJxX2lvbW11KTsKLQotCWlycV9pb21tdS0+aW9tbXUgPSBOVUxMOwotCWlycV9pb21tdS0+aXJ0ZV9pbmRleCA9IDA7Ci0JaXJxX2lvbW11LT5zdWJfaGFuZGxlID0gMDsKLQlpcnFfaW9tbXUtPmlydGVfbWFzayA9IDA7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfMl9pcl9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiBzb3VyY2UgdmFsaWRhdGlvbiB0eXBlCi0gKi8KLSNkZWZpbmUgU1ZUX05PX1ZFUklGWQkJMHgwICAvKiBubyB2ZXJpZmljYXRpb24gaXMgcmVxdWlyZWQgKi8KLSNkZWZpbmUgU1ZUX1ZFUklGWV9TSURfU1EJMHgxICAvKiB2ZXJpZnkgdXNpbmcgU0lEIGFuZCBTUSBmaWVsZHMgKi8KLSNkZWZpbmUgU1ZUX1ZFUklGWV9CVVMJCTB4MiAgLyogdmVyaWZ5IGJ1cyBvZiByZXF1ZXN0LWlkICovCi0KLS8qCi0gKiBzb3VyY2UtaWQgcXVhbGlmaWVyCi0gKi8KLSNkZWZpbmUgU1FfQUxMXzE2CTB4MCAgLyogdmVyaWZ5IGFsbCAxNiBiaXRzIG9mIHJlcXVlc3QtaWQgKi8KLSNkZWZpbmUgU1FfMTNfSUdOT1JFXzEJMHgxICAvKiB2ZXJpZnkgbW9zdCBzaWduaWZpY2FudCAxMyBiaXRzLCBpZ25vcmUKLQkJCSAgICAgICogdGhlIHRoaXJkIGxlYXN0IHNpZ25pZmljYW50IGJpdAotCQkJICAgICAgKi8KLSNkZWZpbmUgU1FfMTNfSUdOT1JFXzIJMHgyICAvKiB2ZXJpZnkgbW9zdCBzaWduaWZpY2FudCAxMyBiaXRzLCBpZ25vcmUKLQkJCSAgICAgICogdGhlIHNlY29uZCBhbmQgdGhpcmQgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cwotCQkJICAgICAgKi8KLSNkZWZpbmUgU1FfMTNfSUdOT1JFXzMJMHgzICAvKiB2ZXJpZnkgbW9zdCBzaWduaWZpY2FudCAxMyBiaXRzLCBpZ25vcmUKLQkJCSAgICAgICogdGhlIGxlYXN0IHRocmVlIHNpZ25pZmljYW50IGJpdHMKLQkJCSAgICAgICovCi0KLS8qCi0gKiBzZXQgU1ZULCBTUSBhbmQgU0lEIGZpZWxkcyBvZiBpcnRlIHRvIHZlcmlmeQotICogc291cmNlIGlkcyBvZiBpbnRlcnJ1cHQgcmVxdWVzdHMKLSAqLwotc3RhdGljIHZvaWQgc2V0X2lydGVfc2lkKHN0cnVjdCBpcnRlICppcnRlLCB1bnNpZ25lZCBpbnQgc3Z0LAotCQkJIHVuc2lnbmVkIGludCBzcSwgdW5zaWduZWQgaW50IHNpZCkKLXsKLQlpZiAoZGlzYWJsZV9zb3VyY2VpZF9jaGVja2luZykKLQkJc3Z0ID0gU1ZUX05PX1ZFUklGWTsKLQlpcnRlLT5zdnQgPSBzdnQ7Ci0JaXJ0ZS0+c3EgPSBzcTsKLQlpcnRlLT5zaWQgPSBzaWQ7Ci19Ci0KLWludCBzZXRfaW9hcGljX3NpZChzdHJ1Y3QgaXJ0ZSAqaXJ0ZSwgaW50IGFwaWMpCi17Ci0JaW50IGk7Ci0JdTE2IHNpZCA9IDA7Ci0KLQlpZiAoIWlydGUpCi0JCXJldHVybiAtMTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9fQVBJQ1M7IGkrKykgewotCQlpZiAoaXJfaW9hcGljW2ldLmlkID09IGFwaWMpIHsKLQkJCXNpZCA9IChpcl9pb2FwaWNbaV0uYnVzIDw8IDgpIHwgaXJfaW9hcGljW2ldLmRldmZuOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoc2lkID09IDApIHsKLQkJcHJfd2FybmluZygiRmFpbGVkIHRvIHNldCBzb3VyY2UtaWQgb2YgSU9BUElDICglZClcbiIsIGFwaWMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc2V0X2lydGVfc2lkKGlydGUsIDEsIDAsIHNpZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHNldF9ocGV0X3NpZChzdHJ1Y3QgaXJ0ZSAqaXJ0ZSwgdTggaWQpCi17Ci0JaW50IGk7Ci0JdTE2IHNpZCA9IDA7Ci0KLQlpZiAoIWlydGUpCi0JCXJldHVybiAtMTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfSFBFVF9UQlM7IGkrKykgewotCQlpZiAoaXJfaHBldFtpXS5pZCA9PSBpZCkgewotCQkJc2lkID0gKGlyX2hwZXRbaV0uYnVzIDw8IDgpIHwgaXJfaHBldFtpXS5kZXZmbjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKHNpZCA9PSAwKSB7Ci0JCXByX3dhcm5pbmcoIkZhaWxlZCB0byBzZXQgc291cmNlLWlkIG9mIEhQRVQgYmxvY2sgKCVkKVxuIiwgaWQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiBTaG91bGQgcmVhbGx5IHVzZSBTUV9BTExfMTYuIFNvbWUgcGxhdGZvcm1zIGFyZSBicm9rZW4uCi0JICogV2hpbGUgd2UgZmlndXJlIG91dCB0aGUgcmlnaHQgcXVpcmtzIGZvciB0aGVzZSBicm9rZW4gcGxhdGZvcm1zLCB1c2UKLQkgKiBTUV8xM19JR05PUkVfMyBmb3Igbm93LgotCSAqLwotCXNldF9pcnRlX3NpZChpcnRlLCBTVlRfVkVSSUZZX1NJRF9TUSwgU1FfMTNfSUdOT1JFXzMsIHNpZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHNldF9tc2lfc2lkKHN0cnVjdCBpcnRlICppcnRlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7Ci0KLQlpZiAoIWlydGUgfHwgIWRldikKLQkJcmV0dXJuIC0xOwotCi0JLyogUENJZSBkZXZpY2Ugb3IgUm9vdCBDb21wbGV4IGludGVncmF0ZWQgUENJIGRldmljZSAqLwotCWlmIChwY2lfaXNfcGNpZShkZXYpIHx8ICFkZXYtPmJ1cy0+cGFyZW50KSB7Ci0JCXNldF9pcnRlX3NpZChpcnRlLCBTVlRfVkVSSUZZX1NJRF9TUSwgU1FfQUxMXzE2LAotCQkJICAgICAoZGV2LT5idXMtPm51bWJlciA8PCA4KSB8IGRldi0+ZGV2Zm4pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlicmlkZ2UgPSBwY2lfZmluZF91cHN0cmVhbV9wY2llX2JyaWRnZShkZXYpOwotCWlmIChicmlkZ2UpIHsKLQkJaWYgKHBjaV9pc19wY2llKGJyaWRnZSkpLyogdGhpcyBpcyBhIFBDSWUtdG8tUENJL1BDSVggYnJpZGdlICovCi0JCQlzZXRfaXJ0ZV9zaWQoaXJ0ZSwgU1ZUX1ZFUklGWV9CVVMsIFNRX0FMTF8xNiwKLQkJCQkoYnJpZGdlLT5idXMtPm51bWJlciA8PCA4KSB8IGRldi0+YnVzLT5udW1iZXIpOwotCQllbHNlIC8qIHRoaXMgaXMgYSBsZWdhY3kgUENJIGJyaWRnZSAqLwotCQkJc2V0X2lydGVfc2lkKGlydGUsIFNWVF9WRVJJRllfU0lEX1NRLCBTUV9BTExfMTYsCi0JCQkJKGJyaWRnZS0+YnVzLT5udW1iZXIgPDwgOCkgfCBicmlkZ2UtPmRldmZuKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfc2V0X2ludHJfcmVtYXBwaW5nKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsIGludCBtb2RlKQotewotCXU2NCBhZGRyOwotCXUzMiBzdHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWFkZHIgPSB2aXJ0X3RvX3BoeXMoKHZvaWQgKilpb21tdS0+aXJfdGFibGUtPmJhc2UpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci0KLQlkbWFyX3dyaXRlcShpb21tdS0+cmVnICsgRE1BUl9JUlRBX1JFRywKLQkJICAgIChhZGRyKSB8IElSX1gyQVBJQ19NT0RFKG1vZGUpIHwgSU5UUl9SRU1BUF9UQUJMRV9SRUdfU0laRSk7Ci0KLQkvKiBTZXQgaW50ZXJydXB0LXJlbWFwcGluZyB0YWJsZSBwb2ludGVyICovCi0JaW9tbXUtPmdjbWQgfD0gRE1BX0dDTURfU0lSVFA7Ci0Jd3JpdGVsKGlvbW11LT5nY21kLCBpb21tdS0+cmVnICsgRE1BUl9HQ01EX1JFRyk7Ci0KLQlJT01NVV9XQUlUX09QKGlvbW11LCBETUFSX0dTVFNfUkVHLAotCQkgICAgICByZWFkbCwgKHN0cyAmIERNQV9HU1RTX0lSVFBTKSwgc3RzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBnbG9iYWwgaW52YWxpZGF0aW9uIG9mIGludGVycnVwdCBlbnRyeSBjYWNoZSBiZWZvcmUgZW5hYmxpbmcKLQkgKiBpbnRlcnJ1cHQtcmVtYXBwaW5nLgotCSAqLwotCXFpX2dsb2JhbF9pZWMoaW9tbXUpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci0KLQkvKiBFbmFibGUgaW50ZXJydXB0LXJlbWFwcGluZyAqLwotCWlvbW11LT5nY21kIHw9IERNQV9HQ01EX0lSRTsKLQl3cml0ZWwoaW9tbXUtPmdjbWQsIGlvbW11LT5yZWcgKyBETUFSX0dDTURfUkVHKTsKLQotCUlPTU1VX1dBSVRfT1AoaW9tbXUsIERNQVJfR1NUU19SRUcsCi0JCSAgICAgIHJlYWRsLCAoc3RzICYgRE1BX0dTVFNfSVJFUyksIHN0cyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOwotfQotCi0KLXN0YXRpYyBpbnQgc2V0dXBfaW50cl9yZW1hcHBpbmcoc3RydWN0IGludGVsX2lvbW11ICppb21tdSwgaW50IG1vZGUpCi17Ci0Jc3RydWN0IGlyX3RhYmxlICppcl90YWJsZTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZXM7Ci0KLQlpcl90YWJsZSA9IGlvbW11LT5pcl90YWJsZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcl90YWJsZSksCi0JCQkJCSAgICAgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoIWlvbW11LT5pcl90YWJsZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwYWdlcyA9IGFsbG9jX3BhZ2VzX25vZGUoaW9tbXUtPm5vZGUsIEdGUF9BVE9NSUMgfCBfX0dGUF9aRVJPLAotCQkJCSBJTlRSX1JFTUFQX1BBR0VfT1JERVIpOwotCi0JaWYgKCFwYWdlcykgewotCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBhbGxvY2F0ZSBwYWdlcyBvZiBvcmRlciAlZFxuIiwKLQkJICAgICAgIElOVFJfUkVNQVBfUEFHRV9PUkRFUik7Ci0JCWtmcmVlKGlvbW11LT5pcl90YWJsZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlyX3RhYmxlLT5iYXNlID0gcGFnZV9hZGRyZXNzKHBhZ2VzKTsKLQotCWlvbW11X3NldF9pbnRyX3JlbWFwcGluZyhpb21tdSwgbW9kZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBEaXNhYmxlIEludGVycnVwdCBSZW1hcHBpbmcuCi0gKi8KLXN0YXRpYyB2b2lkIGlvbW11X2Rpc2FibGVfaW50cl9yZW1hcHBpbmcoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBzdHM7Ci0KLQlpZiAoIWVjYXBfaXJfc3VwcG9ydChpb21tdS0+ZWNhcCkpCi0JCXJldHVybjsKLQotCS8qCi0JICogZ2xvYmFsIGludmFsaWRhdGlvbiBvZiBpbnRlcnJ1cHQgZW50cnkgY2FjaGUgYmVmb3JlIGRpc2FibGluZwotCSAqIGludGVycnVwdC1yZW1hcHBpbmcuCi0JICovCi0JcWlfZ2xvYmFsX2llYyhpb21tdSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKLQotCXN0cyA9IGRtYXJfcmVhZHEoaW9tbXUtPnJlZyArIERNQVJfR1NUU19SRUcpOwotCWlmICghKHN0cyAmIERNQV9HU1RTX0lSRVMpKQotCQlnb3RvIGVuZDsKLQotCWlvbW11LT5nY21kICY9IH5ETUFfR0NNRF9JUkU7Ci0Jd3JpdGVsKGlvbW11LT5nY21kLCBpb21tdS0+cmVnICsgRE1BUl9HQ01EX1JFRyk7Ci0KLQlJT01NVV9XQUlUX09QKGlvbW11LCBETUFSX0dTVFNfUkVHLAotCQkgICAgICByZWFkbCwgIShzdHMgJiBETUFfR1NUU19JUkVTKSwgc3RzKTsKLQotZW5kOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci19Ci0KLWludCBfX2luaXQgaW50cl9yZW1hcHBpbmdfc3VwcG9ydGVkKHZvaWQpCi17Ci0Jc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOwotCi0JaWYgKGRpc2FibGVfaW50cmVtYXApCi0JCXJldHVybiAwOwotCi0JaWYgKCFkbWFyX2lyX3N1cHBvcnQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgewotCQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gZHJoZC0+aW9tbXU7Ci0KLQkJaWYgKCFlY2FwX2lyX3N1cHBvcnQoaW9tbXUtPmVjYXApKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBfX2luaXQgZW5hYmxlX2ludHJfcmVtYXBwaW5nKGludCBlaW0pCi17Ci0Jc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOwotCWludCBzZXR1cCA9IDA7Ci0KLQlpZiAocGFyc2VfaW9hcGljc191bmRlcl9pcigpICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiTm90IGVuYWJsZSBpbnRlcnJ1cHQgcmVtYXBwaW5nXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7Ci0JCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBkcmhkLT5pb21tdTsKLQotCQkvKgotCQkgKiBJZiB0aGUgcXVldWVkIGludmFsaWRhdGlvbiBpcyBhbHJlYWR5IGluaXRpYWxpemVkLAotCQkgKiBzaG91bGRuJ3QgZGlzYWJsZSBpdC4KLQkJICovCi0JCWlmIChpb21tdS0+cWkpCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiBDbGVhciBwcmV2aW91cyBmYXVsdHMuCi0JCSAqLwotCQlkbWFyX2ZhdWx0KC0xLCBpb21tdSk7Ci0KLQkJLyoKLQkJICogRGlzYWJsZSBpbnRyIHJlbWFwcGluZyBhbmQgcXVldWVkIGludmFsaWRhdGlvbiwgaWYgYWxyZWFkeQotCQkgKiBlbmFibGVkIHByaW9yIHRvIE9TIGhhbmRvdmVyLgotCQkgKi8KLQkJaW9tbXVfZGlzYWJsZV9pbnRyX3JlbWFwcGluZyhpb21tdSk7Ci0KLQkJZG1hcl9kaXNhYmxlX3FpKGlvbW11KTsKLQl9Ci0KLQkvKgotCSAqIGNoZWNrIGZvciB0aGUgSW50ZXJydXB0LXJlbWFwcGluZyBzdXBwb3J0Ci0JICovCi0JZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKLQkJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IGRyaGQtPmlvbW11OwotCi0JCWlmICghZWNhcF9pcl9zdXBwb3J0KGlvbW11LT5lY2FwKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChlaW0gJiYgIWVjYXBfZWltX3N1cHBvcnQoaW9tbXUtPmVjYXApKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJEUkhEICVMeDogRUlNIG5vdCBzdXBwb3J0ZWQgYnkgRFJIRCwgIgotCQkJICAgICAgICIgZWNhcCAlTHhcbiIsIGRyaGQtPnJlZ19iYXNlX2FkZHIsIGlvbW11LT5lY2FwKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCS8qCi0JICogRW5hYmxlIHF1ZXVlZCBpbnZhbGlkYXRpb24gZm9yIGFsbCB0aGUgRFJIRCdzLgotCSAqLwotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7Ci0JCWludCByZXQ7Ci0JCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBkcmhkLT5pb21tdTsKLQkJcmV0ID0gZG1hcl9lbmFibGVfcWkoaW9tbXUpOwotCi0JCWlmIChyZXQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRFJIRCAlTHg6IGZhaWxlZCB0byBlbmFibGUgcXVldWVkLCAiCi0JCQkgICAgICAgIiBpbnZhbGlkYXRpb24sIGVjYXAgJUx4LCByZXQgJWRcbiIsCi0JCQkgICAgICAgZHJoZC0+cmVnX2Jhc2VfYWRkciwgaW9tbXUtPmVjYXAsIHJldCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFNldHVwIEludGVycnVwdC1yZW1hcHBpbmcgZm9yIGFsbCB0aGUgRFJIRCdzIG5vdy4KLQkgKi8KLQlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgewotCQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gZHJoZC0+aW9tbXU7Ci0KLQkJaWYgKCFlY2FwX2lyX3N1cHBvcnQoaW9tbXUtPmVjYXApKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHNldHVwX2ludHJfcmVtYXBwaW5nKGlvbW11LCBlaW0pKQotCQkJZ290byBlcnJvcjsKLQotCQlzZXR1cCA9IDE7Ci0JfQotCi0JaWYgKCFzZXR1cCkKLQkJZ290byBlcnJvcjsKLQotCWludHJfcmVtYXBwaW5nX2VuYWJsZWQgPSAxOwotCi0JcmV0dXJuIDA7Ci0KLWVycm9yOgotCS8qCi0JICogaGFuZGxlIGVycm9yIGNvbmRpdGlvbiBncmFjZWZ1bGx5IGhlcmUhCi0JICovCi0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZCBpcl9wYXJzZV9vbmVfaHBldF9zY29wZShzdHJ1Y3QgYWNwaV9kbWFyX2RldmljZV9zY29wZSAqc2NvcGUsCi0JCQkJICAgICAgc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKLXsKLQlzdHJ1Y3QgYWNwaV9kbWFyX3BjaV9wYXRoICpwYXRoOwotCXU4IGJ1czsKLQlpbnQgY291bnQ7Ci0KLQlidXMgPSBzY29wZS0+YnVzOwotCXBhdGggPSAoc3RydWN0IGFjcGlfZG1hcl9wY2lfcGF0aCAqKShzY29wZSArIDEpOwotCWNvdW50ID0gKHNjb3BlLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfZG1hcl9kZXZpY2Vfc2NvcGUpKQotCQkvIHNpemVvZihzdHJ1Y3QgYWNwaV9kbWFyX3BjaV9wYXRoKTsKLQotCXdoaWxlICgtLWNvdW50ID4gMCkgewotCQkvKgotCQkgKiBBY2Nlc3MgUENJIGRpcmVjdGx5IGR1ZSB0byB0aGUgUENJCi0JCSAqIHN1YnN5c3RlbSBpc24ndCBpbml0aWFsaXplZCB5ZXQuCi0JCSAqLwotCQlidXMgPSByZWFkX3BjaV9jb25maWdfYnl0ZShidXMsIHBhdGgtPmRldiwgcGF0aC0+Zm4sCi0JCQkJCSAgIFBDSV9TRUNPTkRBUllfQlVTKTsKLQkJcGF0aCsrOwotCX0KLQlpcl9ocGV0W2lyX2hwZXRfbnVtXS5idXMgICA9IGJ1czsKLQlpcl9ocGV0W2lyX2hwZXRfbnVtXS5kZXZmbiA9IFBDSV9ERVZGTihwYXRoLT5kZXYsIHBhdGgtPmZuKTsKLQlpcl9ocGV0W2lyX2hwZXRfbnVtXS5pb21tdSA9IGlvbW11OwotCWlyX2hwZXRbaXJfaHBldF9udW1dLmlkICAgID0gc2NvcGUtPmVudW1lcmF0aW9uX2lkOwotCWlyX2hwZXRfbnVtKys7Ci19Ci0KLXN0YXRpYyB2b2lkIGlyX3BhcnNlX29uZV9pb2FwaWNfc2NvcGUoc3RydWN0IGFjcGlfZG1hcl9kZXZpY2Vfc2NvcGUgKnNjb3BlLAotCQkJCSAgICAgIHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCi17Ci0Jc3RydWN0IGFjcGlfZG1hcl9wY2lfcGF0aCAqcGF0aDsKLQl1OCBidXM7Ci0JaW50IGNvdW50OwotCi0JYnVzID0gc2NvcGUtPmJ1czsKLQlwYXRoID0gKHN0cnVjdCBhY3BpX2RtYXJfcGNpX3BhdGggKikoc2NvcGUgKyAxKTsKLQljb3VudCA9IChzY29wZS0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX2RtYXJfZGV2aWNlX3Njb3BlKSkKLQkJLyBzaXplb2Yoc3RydWN0IGFjcGlfZG1hcl9wY2lfcGF0aCk7Ci0KLQl3aGlsZSAoLS1jb3VudCA+IDApIHsKLQkJLyoKLQkJICogQWNjZXNzIFBDSSBkaXJlY3RseSBkdWUgdG8gdGhlIFBDSQotCQkgKiBzdWJzeXN0ZW0gaXNuJ3QgaW5pdGlhbGl6ZWQgeWV0LgotCQkgKi8KLQkJYnVzID0gcmVhZF9wY2lfY29uZmlnX2J5dGUoYnVzLCBwYXRoLT5kZXYsIHBhdGgtPmZuLAotCQkJCQkgICBQQ0lfU0VDT05EQVJZX0JVUyk7Ci0JCXBhdGgrKzsKLQl9Ci0KLQlpcl9pb2FwaWNbaXJfaW9hcGljX251bV0uYnVzICAgPSBidXM7Ci0JaXJfaW9hcGljW2lyX2lvYXBpY19udW1dLmRldmZuID0gUENJX0RFVkZOKHBhdGgtPmRldiwgcGF0aC0+Zm4pOwotCWlyX2lvYXBpY1tpcl9pb2FwaWNfbnVtXS5pb21tdSA9IGlvbW11OwotCWlyX2lvYXBpY1tpcl9pb2FwaWNfbnVtXS5pZCAgICA9IHNjb3BlLT5lbnVtZXJhdGlvbl9pZDsKLQlpcl9pb2FwaWNfbnVtKys7Ci19Ci0KLXN0YXRpYyBpbnQgaXJfcGFyc2VfaW9hcGljX2hwZXRfc2NvcGUoc3RydWN0IGFjcGlfZG1hcl9oZWFkZXIgKmhlYWRlciwKLQkJCQkgICAgICBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQotewotCXN0cnVjdCBhY3BpX2RtYXJfaGFyZHdhcmVfdW5pdCAqZHJoZDsKLQlzdHJ1Y3QgYWNwaV9kbWFyX2RldmljZV9zY29wZSAqc2NvcGU7Ci0Jdm9pZCAqc3RhcnQsICplbmQ7Ci0KLQlkcmhkID0gKHN0cnVjdCBhY3BpX2RtYXJfaGFyZHdhcmVfdW5pdCAqKWhlYWRlcjsKLQotCXN0YXJ0ID0gKHZvaWQgKikoZHJoZCArIDEpOwotCWVuZCA9ICgodm9pZCAqKWRyaGQpICsgaGVhZGVyLT5sZW5ndGg7Ci0KLQl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLQkJc2NvcGUgPSBzdGFydDsKLQkJaWYgKHNjb3BlLT5lbnRyeV90eXBlID09IEFDUElfRE1BUl9TQ09QRV9UWVBFX0lPQVBJQykgewotCQkJaWYgKGlyX2lvYXBpY19udW0gPT0gTUFYX0lPX0FQSUNTKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXhjZWVkZWQgTWF4IElPIEFQSUNTXG4iKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCXByaW50ayhLRVJOX0lORk8gIklPQVBJQyBpZCAlZCB1bmRlciBEUkhEIGJhc2UgIgotCQkJICAgICAgICIgMHglTHggSU9NTVUgJWRcbiIsIHNjb3BlLT5lbnVtZXJhdGlvbl9pZCwKLQkJCSAgICAgICBkcmhkLT5hZGRyZXNzLCBpb21tdS0+c2VxX2lkKTsKLQotCQkJaXJfcGFyc2Vfb25lX2lvYXBpY19zY29wZShzY29wZSwgaW9tbXUpOwotCQl9IGVsc2UgaWYgKHNjb3BlLT5lbnRyeV90eXBlID09IEFDUElfRE1BUl9TQ09QRV9UWVBFX0hQRVQpIHsKLQkJCWlmIChpcl9ocGV0X251bSA9PSBNQVhfSFBFVF9UQlMpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFeGNlZWRlZCBNYXggSFBFVCBibG9ja3NcbiIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiSFBFVCBpZCAlZCB1bmRlciBEUkhEIGJhc2UiCi0JCQkgICAgICAgIiAweCVMeFxuIiwgc2NvcGUtPmVudW1lcmF0aW9uX2lkLAotCQkJICAgICAgIGRyaGQtPmFkZHJlc3MpOwotCi0JCQlpcl9wYXJzZV9vbmVfaHBldF9zY29wZShzY29wZSwgaW9tbXUpOwotCQl9Ci0JCXN0YXJ0ICs9IHNjb3BlLT5sZW5ndGg7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBGaW5kcyB0aGUgYXNzb2NhaXRpb24gYmV0d2VlbiBJT0FQSUMncyBhbmQgaXRzIEludGVycnVwdC1yZW1hcHBpbmcKLSAqIGhhcmR3YXJlIHVuaXQuCi0gKi8KLWludCBfX2luaXQgcGFyc2VfaW9hcGljc191bmRlcl9pcih2b2lkKQotewotCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKLQlpbnQgaXJfc3VwcG9ydGVkID0gMDsKLQotCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7Ci0JCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBkcmhkLT5pb21tdTsKLQotCQlpZiAoZWNhcF9pcl9zdXBwb3J0KGlvbW11LT5lY2FwKSkgewotCQkJaWYgKGlyX3BhcnNlX2lvYXBpY19ocGV0X3Njb3BlKGRyaGQtPmhkciwgaW9tbXUpKQotCQkJCXJldHVybiAtMTsKLQotCQkJaXJfc3VwcG9ydGVkID0gMTsKLQkJfQotCX0KLQotCWlmIChpcl9zdXBwb3J0ZWQgJiYgaXJfaW9hcGljX251bSAhPSBucl9pb2FwaWNzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJOb3QgYWxsIElPLUFQSUMncyBsaXN0ZWQgdW5kZXIgcmVtYXBwaW5nIGhhcmR3YXJlXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiBpcl9zdXBwb3J0ZWQ7Ci19Ci0KLXZvaWQgZGlzYWJsZV9pbnRyX3JlbWFwcGluZyh2b2lkKQotewotCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gTlVMTDsKLQotCS8qCi0JICogRGlzYWJsZSBJbnRlcnJ1cHQtcmVtYXBwaW5nIGZvciBhbGwgdGhlIERSSEQncyBub3cuCi0JICovCi0JZm9yX2VhY2hfaW9tbXUoaW9tbXUsIGRyaGQpIHsKLQkJaWYgKCFlY2FwX2lyX3N1cHBvcnQoaW9tbXUtPmVjYXApKQotCQkJY29udGludWU7Ci0KLQkJaW9tbXVfZGlzYWJsZV9pbnRyX3JlbWFwcGluZyhpb21tdSk7Ci0JfQotfQotCi1pbnQgcmVlbmFibGVfaW50cl9yZW1hcHBpbmcoaW50IGVpbSkKLXsKLQlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7Ci0JaW50IHNldHVwID0gMDsKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gTlVMTDsKLQotCWZvcl9lYWNoX2lvbW11KGlvbW11LCBkcmhkKQotCQlpZiAoaW9tbXUtPnFpKQotCQkJZG1hcl9yZWVuYWJsZV9xaShpb21tdSk7Ci0KLQkvKgotCSAqIFNldHVwIEludGVycnVwdC1yZW1hcHBpbmcgZm9yIGFsbCB0aGUgRFJIRCdzIG5vdy4KLQkgKi8KLQlmb3JfZWFjaF9pb21tdShpb21tdSwgZHJoZCkgewotCQlpZiAoIWVjYXBfaXJfc3VwcG9ydChpb21tdS0+ZWNhcCkpCi0JCQljb250aW51ZTsKLQotCQkvKiBTZXQgdXAgaW50ZXJydXB0IHJlbWFwcGluZyBmb3IgaW9tbXUuKi8KLQkJaW9tbXVfc2V0X2ludHJfcmVtYXBwaW5nKGlvbW11LCBlaW0pOwotCQlzZXR1cCA9IDE7Ci0JfQotCi0JaWYgKCFzZXR1cCkKLQkJZ290byBlcnJvcjsKLQotCXJldHVybiAwOwotCi1lcnJvcjoKLQkvKgotCSAqIGhhbmRsZSBlcnJvciBjb25kaXRpb24gZ3JhY2VmdWxseSBoZXJlIQotCSAqLwotCXJldHVybiAtMTsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvb2YuYyBiL2RyaXZlcnMvcGNpL29mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0ZDM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL29mLmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIFBDSSA8LT4gT0YgbWFwcGluZyBoZWxwZXJzCisgKgorICogQ29weXJpZ2h0IDIwMTEgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KKyNpbmNsdWRlICJwY2kuaCIKKwordm9pZCBwY2lfc2V0X29mX25vZGUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAoIWRldi0+YnVzLT5kZXYub2Zfbm9kZSkKKwkJcmV0dXJuOworCWRldi0+ZGV2Lm9mX25vZGUgPSBvZl9wY2lfZmluZF9jaGlsZF9kZXZpY2UoZGV2LT5idXMtPmRldi5vZl9ub2RlLAorCQkJCQkJICAgIGRldi0+ZGV2Zm4pOworfQorCit2b2lkIHBjaV9yZWxlYXNlX29mX25vZGUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlvZl9ub2RlX3B1dChkZXYtPmRldi5vZl9ub2RlKTsKKwlkZXYtPmRldi5vZl9ub2RlID0gTlVMTDsKK30KKwordm9pZCBwY2lfc2V0X2J1c19vZl9ub2RlKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJaWYgKGJ1cy0+c2VsZiA9PSBOVUxMKQorCQlidXMtPmRldi5vZl9ub2RlID0gcGNpYmlvc19nZXRfcGhiX29mX25vZGUoYnVzKTsKKwllbHNlCisJCWJ1cy0+ZGV2Lm9mX25vZGUgPSBvZl9ub2RlX2dldChidXMtPnNlbGYtPmRldi5vZl9ub2RlKTsKK30KKwordm9pZCBwY2lfcmVsZWFzZV9idXNfb2Zfbm9kZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCW9mX25vZGVfcHV0KGJ1cy0+ZGV2Lm9mX25vZGUpOworCWJ1cy0+ZGV2Lm9mX25vZGUgPSBOVUxMOworfQorCitzdHJ1Y3QgZGV2aWNlX25vZGUgKiBfX3dlYWsgcGNpYmlvc19nZXRfcGhiX29mX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwkvKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgUEhCcyAqLworCWlmIChXQVJOX09OKGJ1cy0+c2VsZiB8fCBidXMtPnBhcmVudCkpCisJCXJldHVybiBOVUxMOworCisJLyogTG9vayBmb3IgYSBub2RlIHBvaW50ZXIgaW4gZWl0aGVyIHRoZSBpbnRlcm1lZGlhcnkgZGV2aWNlIHdlCisJICogY3JlYXRlIGFib3ZlIHRoZSByb290IGJ1cyBvciBpdCdzIG93biBwYXJlbnQuIE5vcm1hbGx5IG9ubHkKKwkgKiB0aGUgbGF0ZXIgaXMgcG9wdWxhdGVkLgorCSAqLworCWlmIChidXMtPmJyaWRnZS0+b2Zfbm9kZSkKKwkJcmV0dXJuIG9mX25vZGVfZ2V0KGJ1cy0+YnJpZGdlLT5vZl9ub2RlKTsKKwlpZiAoYnVzLT5icmlkZ2UtPnBhcmVudC0+b2Zfbm9kZSkKKwkJcmV0dXJuIG9mX25vZGVfZ2V0KGJ1cy0+YnJpZGdlLT5wYXJlbnQtPm9mX25vZGUpOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCmluZGV4IDEzNWRmMTYuLjEyZDFlODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSAicGNpLmgiCiAKIHN0cnVjdCBwY2lfZHluaWQgewpAQCAtNjE2LDYgKzYxNywyMSBAQAogCWludCBlcnJvciA9IDA7CiAKIAkvKgorCSAqIElmIGEgUENJIGRldmljZSBjb25maWd1cmVkIHRvIHdha2UgdXAgdGhlIHN5c3RlbSBmcm9tIHNsZWVwIHN0YXRlcworCSAqIGhhcyBiZWVuIHN1c3BlbmRlZCBhdCBydW4gdGltZSBhbmQgdGhlcmUncyBhIHJlc3VtZSByZXF1ZXN0IHBlbmRpbmcKKwkgKiBmb3IgaXQsIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgZGV2aWNlIHNpZ25hbGluZyB3YWtldXAsIHNvIHRoZQorCSAqIHN5c3RlbSBzdXNwZW5kIG9wZXJhdGlvbiBzaG91bGQgYmUgYWJvcnRlZC4KKwkgKi8KKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZShkZXYpOworCWlmIChwbV9ydW50aW1lX2JhcnJpZXIoZGV2KSAmJiBkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlwbV93YWtldXBfZXZlbnQoZGV2LCAwKTsKKworCWlmIChwbV93YWtldXBfcGVuZGluZygpKSB7CisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKgogCSAqIFBDSSBkZXZpY2VzIHN1c3BlbmRlZCBhdCBydW4gdGltZSBuZWVkIHRvIGJlIHJlc3VtZWQgYXQgdGhpcwogCSAqIHBvaW50LCBiZWNhdXNlIGluIGdlbmVyYWwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlY29uZmlndXJlIHRoZW0gZm9yCiAJICogc3lzdGVtIHN1c3BlbmQuICBOYW1lbHksIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9zZWQgdG8gd2FrZSB1cCB0aGUKQEAgLTYzOCw2ICs2NTQsOCBAQAogCiAJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPmNvbXBsZXRlKQogCQlkcnYtPnBtLT5jb21wbGV0ZShkZXYpOworCisJcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOwogfQogCiAjZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDU2MDk4YjMuLjY5MjY3MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC0zMjcxLDExICszMjcxLDExIEBACiB9CiAKIHN0YXRpYyBpbnQgcGNpX3NldF92Z2Ffc3RhdGVfYXJjaChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBib29sIGRlY29kZSwKLQkJICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmRfYml0cywgYm9vbCBjaGFuZ2VfYnJpZGdlKQorCQkgICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZF9iaXRzLCB1MzIgZmxhZ3MpCiB7CiAJaWYgKGFyY2hfc2V0X3ZnYV9zdGF0ZSkKIAkJcmV0dXJuIGFyY2hfc2V0X3ZnYV9zdGF0ZShkZXYsIGRlY29kZSwgY29tbWFuZF9iaXRzLAotCQkJCQkJY2hhbmdlX2JyaWRnZSk7CisJCQkJCQlmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMyODQsNyArMzI4NCw3IEBACiAgKiBAZGV2OiB0aGUgUENJIGRldmljZQogICogQGRlY29kZTogdHJ1ZSA9IGVuYWJsZSBkZWNvZGluZywgZmFsc2UgPSBkaXNhYmxlIGRlY29kaW5nCiAgKiBAY29tbWFuZF9iaXRzOiBQQ0lfQ09NTUFORF9JTyBhbmQvb3IgUENJX0NPTU1BTkRfTUVNT1JZCi0gKiBAY2hhbmdlX2JyaWRnZV9mbGFnczogdHJhdmVyc2UgYW5jZXN0b3JzIGFuZCBjaGFuZ2UgYnJpZGdlcworICogQGZsYWdzOiB0cmF2ZXJzZSBhbmNlc3RvcnMgYW5kIGNoYW5nZSBicmlkZ2VzCiAgKiBDSEFOR0VfQlJJREdFX09OTFkgLyBDSEFOR0VfQlJJREdFCiAgKi8KIGludCBwY2lfc2V0X3ZnYV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBib29sIGRlY29kZSwKQEAgLTM0ODMsNiArMzQ4Myw4IEBACiAJCQkJcGNpX25vX21zaSgpOwogCQkJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm5vYWVyIikpIHsKIAkJCQlwY2lfbm9fYWVyKCk7CisJCQl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgInJlYWxsb2MiLCA3KSkgeworCQkJCXBjaV9yZWFsbG9jKCk7CiAJCQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibm9kb21haW5zIikpIHsKIAkJCQlwY2lfbm9fZG9tYWlucygpOwogCQkJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJjYmlvc2l6ZT0iLCA5KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCA3MzFlMjAyLi5jOGNlZTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtMTQ2LDYgKzE0Niw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX21zaV9pbml0X3BjaV9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikgeyB9CiAjZW5kaWYKIAorZXh0ZXJuIHZvaWQgcGNpX3JlYWxsb2Modm9pZCk7CisKIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9ub19kMWQyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdW5zaWduZWQgaW50IHBhcmVudF9kc3RhdGVzID0gMDsKQEAgLTE4NCw4ICsxODYsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdHJ1Y3QgcGNpX2RldiAqcGNpX2ZpbmRfdXBzdHJlYW1fcGNpZV9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotCiAvKiBQQ0kgc2xvdCBzeXNmcyBoZWxwZXIgY29kZSAqLwogI2RlZmluZSB0b19wY2lfc2xvdChzKSBjb250YWluZXJfb2Yocywgc3RydWN0IHBjaV9zbG90LCBrb2JqKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2FzcG0uYyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCmluZGV4IDY4OTI2MDEuLmNiZmJhYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCkBAIC05NDAsNyArOTQwLDcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUENJZSBBU1BNIGlzIGRpc2FibGVkXG4iKTsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiZm9yY2UiKSkgewogCQlhc3BtX2ZvcmNlID0gMTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJZSBBU1BNIGlzIGZvcmNlZGx5IGVuYWJsZWRcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJQQ0llIEFTUE0gaXMgZm9yY2libHkgZW5hYmxlZFxuIik7CiAJfQogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggNDg4NDlmZi4uOWFiNDkyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC01Miw2ICs1Miw3IEBACiAJaWYgKHBjaV9idXMtPmJyaWRnZSkKIAkJcHV0X2RldmljZShwY2lfYnVzLT5icmlkZ2UpOwogCXBjaV9idXNfcmVtb3ZlX3Jlc291cmNlcyhwY2lfYnVzKTsKKwlwY2lfcmVsZWFzZV9idXNfb2Zfbm9kZShwY2lfYnVzKTsKIAlrZnJlZShwY2lfYnVzKTsKIH0KIApAQCAtMTY4LDcgKzE2OSw3IEBACiAJCXJlcy0+ZmxhZ3MgfD0gcGNpX2NhbGNfcmVzb3VyY2VfZmxhZ3MobCkgfCBJT1JFU09VUkNFX1NJWkVBTElHTjsKIAkJaWYgKHR5cGUgPT0gcGNpX2Jhcl9pbykgewogCQkJbCAmPSBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JCQltYXNrID0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLICYgSU9fU1BBQ0VfTElNSVQ7CisJCQltYXNrID0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLICYgKHUzMikgSU9fU1BBQ0VfTElNSVQ7CiAJCX0gZWxzZSB7CiAJCQlsICY9IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CiAJCQltYXNrID0gKHUzMilQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOwpAQCAtNTg4LDcgKzU4OSw3IEBACiAKIAljaGlsZC0+c2VsZiA9IGJyaWRnZTsKIAljaGlsZC0+YnJpZGdlID0gZ2V0X2RldmljZSgmYnJpZGdlLT5kZXYpOwotCisJcGNpX3NldF9idXNfb2Zfbm9kZShjaGlsZCk7CiAJcGNpX3NldF9idXNfc3BlZWQoY2hpbGQpOwogCiAJLyogU2V0IHVwIGRlZmF1bHQgcmVzb3VyY2UgcG9pbnRlcnMgYW5kIG5hbWVzLi4gKi8KQEAgLTEwMzgsNiArMTAzOSw3IEBACiAKIAlwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCXBjaV9yZWxlYXNlX2NhcGFiaWxpdGllcyhwY2lfZGV2KTsKKwlwY2lfcmVsZWFzZV9vZl9ub2RlKHBjaV9kZXYpOwogCWtmcmVlKHBjaV9kZXYpOwogfQogCkBAIC0xMTU3LDYgKzExNTksOCBAQAogCWRldi0+dmVuZG9yID0gbCAmIDB4ZmZmZjsKIAlkZXYtPmRldmljZSA9IChsID4+IDE2KSAmIDB4ZmZmZjsKIAorCXBjaV9zZXRfb2Zfbm9kZShkZXYpOworCiAJaWYgKHBjaV9zZXR1cF9kZXZpY2UoZGV2KSkgewogCQlrZnJlZShkZXYpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTE0MDksNiArMTQxMyw3IEBACiAJCWdvdG8gZGV2X3JlZ19lcnI7CiAJYi0+YnJpZGdlID0gZ2V0X2RldmljZShkZXYpOwogCWRldmljZV9lbmFibGVfYXN5bmNfc3VzcGVuZChiLT5icmlkZ2UpOworCXBjaV9zZXRfYnVzX29mX25vZGUoYik7CiAKIAlpZiAoIXBhcmVudCkKIAkJc2V0X2Rldl9ub2RlKGItPmJyaWRnZSwgcGNpYnVzX3RvX25vZGUoYikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcXVpcmtzLmMgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwppbmRleCBlOGExNDA2Li4xMTk2ZjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9xdWlya3MuYworKysgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwpAQCAtMjc1OCw5ICsyNzU4LDM0IEBACiAKIAlkZXZfbm90aWNlKCZkZXYtPmRldiwgInByb3ByaWV0YXJ5IFJpY29oIE1NQyBjb250cm9sbGVyIGRpc2FibGVkICh2aWEgZmlyZXdpcmUgZnVuY3Rpb24pXG4iKTsKIAlkZXZfbm90aWNlKCZkZXYtPmRldiwgIk1NQyBjYXJkcyBhcmUgbm93IHN1cHBvcnRlZCBieSBzdGFuZGFyZCBTREhDSSBjb250cm9sbGVyXG4iKTsKKworCS8qCisJICogUklDT0ggMHhlODIzIFNEL01NQyBjYXJkIHJlYWRlciBmYWlscyB0byByZWNvZ25pemUKKwkgKiBjZXJ0YWluIHR5cGVzIG9mIFNEL01NQyBjYXJkcy4gTG93ZXJpbmcgdGhlIFNEIGJhc2UKKwkgKiBjbG9jayBmcmVxdWVuY3kgZnJvbSAyMDBNaHogdG8gNTBNaHogZml4ZXMgdGhpcyBpc3N1ZS4KKwkgKgorCSAqIDB4MTUwIC0gU0QyLjAgbW9kZSBlbmFibGUgZm9yIGNoYW5naW5nIGJhc2UgY2xvY2sKKwkgKgkgICBmcmVxdWVuY3kgdG8gNTBNaHoKKwkgKiAweGUxICAtIEJhc2UgY2xvY2sgZnJlcXVlbmN5CisJICogMHgzMiAgLSA1ME1oeiBuZXcgY2xvY2sgZnJlcXVlbmN5CisJICogMHhmOSAgLSBLZXkgcmVnaXN0ZXIgZm9yIDB4MTUwCisJICogMHhmYyAgLSBrZXkgcmVnaXN0ZXIgZm9yIDB4ZTEKKwkgKi8KKwlpZiAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9SSUNPSF9SNUNFODIzKSB7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ZjksIDB4ZmMpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDE1MCwgMHgxMCk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ZjksIDB4MDApOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGZjLCAweDAxKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhlMSwgMHgzMik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ZmMsIDB4MDApOworCisJCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAiTU1DIGNvbnRyb2xsZXIgYmFzZSBmcmVxdWVuY3kgY2hhbmdlZCB0byA1ME1oei5cbiIpOworCX0KIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfUklDT0gsIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDODMyLCByaWNvaF9tbWNfZml4dXBfcjVjODMyKTsKIERFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRV9FQVJMWShQQ0lfVkVORE9SX0lEX1JJQ09ILCBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1QzgzMiwgcmljb2hfbW1jX2ZpeHVwX3I1YzgzMik7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX1JJQ09ILCBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1Q0U4MjMsIHJpY29oX21tY19maXh1cF9yNWM4MzIpOworREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfUklDT0gsIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDRTgyMywgcmljb2hfbW1jX2ZpeHVwX3I1YzgzMik7CiAjZW5kaWYgLypDT05GSUdfTU1DX1JJQ09IX01NQyovCiAKICNpZiBkZWZpbmVkKENPTkZJR19ETUFSKSB8fCBkZWZpbmVkKENPTkZJR19JTlRSX1JFTUFQKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCAxZTllNWE1Li45OTk1ODQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtNDcsNiArNDcsMTMgQEAKIAkoaGVhZCktPm5leHQgPSBOVUxMOwkJCQlcCiB9IHdoaWxlICgwKQogCitpbnQgcGNpX3JlYWxsb2NfZW5hYmxlID0gMDsKKyNkZWZpbmUgcGNpX3JlYWxsb2NfZW5hYmxlZCgpIHBjaV9yZWFsbG9jX2VuYWJsZQordm9pZCBwY2lfcmVhbGxvYyh2b2lkKQoreworCXBjaV9yZWFsbG9jX2VuYWJsZSA9IDE7Cit9CisKIC8qKgogICogYWRkX3RvX2xpc3QoKSAtIGFkZCBhIG5ldyByZXNvdXJjZSB0cmFja2VyIHRvIHRoZSBsaXN0CiAgKiBAaGVhZDoJSGVhZCBvZiB0aGUgbGlzdApAQCAtMTAyNSw2ICsxMDMyLDcgQEAKIAlyZXR1cm4gZGVwdGg7CiB9CiAKKwogLyoKICAqIGZpcnN0IHRyeSB3aWxsIG5vdCB0b3VjaCBwY2kgYnJpZGdlIHJlcwogICogc2Vjb25kICBhbmQgbGF0ZXIgdHJ5IHdpbGwgY2xlYXIgc21hbGwgbGVhZiBicmlkZ2UgcmVzCkBAIC0xMDY4LDYgKzEwNzYsMTMgQEAKIAkvKiBhbnkgZGV2aWNlIGNvbXBsYWluPyAqLwogCWlmICghaGVhZC5uZXh0KQogCQlnb3RvIGVuYWJsZV9hbmRfZHVtcDsKKworCS8qIGRvbid0IHJlYWxsb2MgaWYgYXNrZWQgdG8gZG8gc28gKi8KKwlpZiAoIXBjaV9yZWFsbG9jX2VuYWJsZWQoKSkgeworCQlmcmVlX2xpc3QocmVzb3VyY2VfbGlzdF94LCAmaGVhZCk7CisJCWdvdG8gZW5hYmxlX2FuZF9kdW1wOworCX0KKwogCWZhaWxlZF90eXBlID0gMDsKIAlmb3IgKGxpc3QgPSBoZWFkLm5leHQ7IGxpc3Q7KSB7CiAJCWZhaWxlZF90eXBlIHw9IGxpc3QtPmZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvYXQ5MV9jZi5jIGIvZHJpdmVycy9wY21jaWEvYXQ5MV9jZi5jCmluZGV4IGZiMzNmYTQuLjQ5MDIyMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2F0OTFfY2YuYworKysgYi9kcml2ZXJzL3BjbWNpYS9hdDkxX2NmLmMKQEAgLTI4Myw4ICsyODMsNyBAQAogCX0KIAogCS8qIHJlc2VydmUgY2hpcC1zZWxlY3QgcmVnaW9ucyAqLwotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGlvLT5zdGFydCwgaW8tPmVuZCArIDEgLSBpby0+c3RhcnQsCi0JCQkJZHJpdmVyX25hbWUpKSB7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW8tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvKSwgZHJpdmVyX25hbWUpKSB7CiAJCXN0YXR1cyA9IC1FTlhJTzsKIAkJZ290byBmYWlsMTsKIAl9CkBAIC0zMDgsNyArMzA3LDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDI6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGlvLT5zdGFydCwgaW8tPmVuZCArIDEgLSBpby0+c3RhcnQpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihpby0+c3RhcnQsIHJlc291cmNlX3NpemUoaW8pKTsKIGZhaWwxOgogCWlmIChjZi0+c29ja2V0LmlvX29mZnNldCkKIAkJaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGNmLT5zb2NrZXQuaW9fb2Zmc2V0KTsKQEAgLTMzOSw3ICszMzgsNyBAQAogCXN0cnVjdCByZXNvdXJjZQkJKmlvID0gY2YtPnNvY2tldC5pb1swXS5yZXM7CiAKIAlwY21jaWFfdW5yZWdpc3Rlcl9zb2NrZXQoJmNmLT5zb2NrZXQpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihpby0+c3RhcnQsIGlvLT5lbmQgKyAxIC0gaW8tPnN0YXJ0KTsKKwlyZWxlYXNlX21lbV9yZWdpb24oaW8tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvKSk7CiAJaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGNmLT5zb2NrZXQuaW9fb2Zmc2V0KTsKIAlpZiAoYm9hcmQtPmlycV9waW4pIHsKIAkJZnJlZV9pcnEoYm9hcmQtPmlycV9waW4sIGNmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2VsZWN0cmFfY2YuYyBiL2RyaXZlcnMvcGNtY2lhL2VsZWN0cmFfY2YuYwppbmRleCA2ZGVmZDRhLi4wNmFkM2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9lbGVjdHJhX2NmLmMKKysrIGIvZHJpdmVycy9wY21jaWEvZWxlY3RyYV9jZi5jCkBAIC0yMDksOSArMjA5LDkgQEAKIAogCWNmLT5vZmRldiA9IG9mZGV2OwogCWNmLT5tZW1fcGh5cyA9IG1lbS5zdGFydDsKLQljZi0+bWVtX3NpemUgPSBQQUdFX0FMSUdOKG1lbS5lbmQgLSBtZW0uc3RhcnQpOworCWNmLT5tZW1fc2l6ZSA9IFBBR0VfQUxJR04ocmVzb3VyY2Vfc2l6ZSgmbWVtKSk7CiAJY2YtPm1lbV9iYXNlID0gaW9yZW1hcChjZi0+bWVtX3BoeXMsIGNmLT5tZW1fc2l6ZSk7Ci0JY2YtPmlvX3NpemUgPSBQQUdFX0FMSUdOKGlvLmVuZCAtIGlvLnN0YXJ0KTsKKwljZi0+aW9fc2l6ZSA9IFBBR0VfQUxJR04ocmVzb3VyY2Vfc2l6ZSgmaW8pKTsKIAogCWFyZWEgPSBfX2dldF92bV9hcmVhKGNmLT5pb19zaXplLCAwLCBQSEJfSU9fQkFTRSwgUEhCX0lPX0VORCk7CiAJaWYgKGFyZWEgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9zaGFycHNsLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfc2hhcnBzbC5jCmluZGV4IDgxYWYyYjMuLjY5YWUyZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9zaGFycHNsLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3NoYXJwc2wuYwpAQCAtNDgsOSArNDgsNiBAQAogewogCWludCByZXQ7CiAKLQlpZiAocGxhdGZvcm1fc2Nvb3BfY29uZmlnLT5wY21jaWFfaW5pdCkKLQkJcGxhdGZvcm1fc2Nvb3BfY29uZmlnLT5wY21jaWFfaW5pdCgpOwotCiAJLyogUmVnaXN0ZXIgaW50ZXJydXB0cyAqLwogCWlmIChTQ09PUF9ERVZbc2t0LT5ucl0uY2RfaXJxID49IDApIHsKIAkJc3RydWN0IHBjbWNpYV9pcnFzIGNkX2lycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF90cml6ZXBzNC5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3RyaXplcHM0LmMKaW5kZXggYjgyOWU2NS4uNTdkZGI5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3RyaXplcHM0LmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3RyaXplcHM0LmMKQEAgLTU1LDEwICs1NSw2IEBACiAJCX0KIAkJc2t0LT5zb2NrZXQucGNpX2lycSA9IElSUV9HUElPKEdQSU9fUFJEWSk7CiAJCWJyZWFrOwotCi0jaWZuZGVmIENPTkZJR19NQUNIX1RSSVpFUFNfQ09OWFMKLQljYXNlIDE6Ci0jZW5kaWYKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdnBhYzI3MC5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZwYWMyNzAuYwppbmRleCA0MzUwMDJkLi5lOTU2ZjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdnBhYzI3MC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF92cGFjMjcwLmMKQEAgLTExLDYgKzExLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIApAQCAtNzUsMTAgKzc2LDEwIEBACiBzdGF0aWMgdm9pZCB2cGFjMjcwX3BjbWNpYV9od19zaHV0ZG93bihzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKIHsKIAlpZiAoc2t0LT5uciA9PSAwKQotCQlncGlvX3JlcXVlc3RfYXJyYXkodnBhYzI3MF9wY21jaWFfZ3Bpb3MsCisJCWdwaW9fZnJlZV9hcnJheSh2cGFjMjcwX3BjbWNpYV9ncGlvcywKIAkJCQkJQVJSQVlfU0laRSh2cGFjMjcwX3BjbWNpYV9ncGlvcykpOwogCWVsc2UKLQkJZ3Bpb19yZXF1ZXN0X2FycmF5KHZwYWMyNzBfY2ZfZ3Bpb3MsCisJCWdwaW9fZnJlZV9hcnJheSh2cGFjMjcwX2NmX2dwaW9zLAogCQkJCQlBUlJBWV9TSVpFKHZwYWMyNzBfY2ZfZ3Bpb3MpKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcnNyY19pb2R5bi5jIGIvZHJpdmVycy9wY21jaWEvcnNyY19pb2R5bi5jCmluZGV4IDUyM2ViNjkuLmY1M2MyMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfaW9keW4uYworKysgYi9kcml2ZXJzL3BjbWNpYS9yc3JjX2lvZHluLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCQl0cnkgPSByZXMtPmVuZCArIDE7CiAJCWlmICgoKmJhc2UgPT0gMCkgfHwgKCpiYXNlID09IHRyeSkpIHsKIAkJCWlmIChhZGp1c3RfcmVzb3VyY2Uocy0+aW9baV0ucmVzLCByZXMtPnN0YXJ0LAotCQkJCQlyZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyBudW0gKyAxKSkKKwkJCQkJICAgIHJlc291cmNlX3NpemUocmVzKSArIG51bSkpCiAJCQkJY29udGludWU7CiAJCQkqYmFzZSA9IHRyeTsKIAkJCXMtPmlvW2ldLkluVXNlICs9IG51bTsKQEAgLTE0Nyw4ICsxNDcsOCBAQAogCQl0cnkgPSByZXMtPnN0YXJ0IC0gbnVtOwogCQlpZiAoKCpiYXNlID09IDApIHx8ICgqYmFzZSA9PSB0cnkpKSB7CiAJCQlpZiAoYWRqdXN0X3Jlc291cmNlKHMtPmlvW2ldLnJlcywKLQkJCQkJcmVzLT5zdGFydCAtIG51bSwKLQkJCQkJcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgbnVtICsgMSkpCisJCQkJCSAgICByZXMtPnN0YXJ0IC0gbnVtLAorCQkJCQkgICAgcmVzb3VyY2Vfc2l6ZShyZXMpICsgbnVtKSkKIAkJCQljb250aW51ZTsKIAkJCSpiYXNlID0gdHJ5OwogCQkJcy0+aW9baV0uSW5Vc2UgKz0gbnVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYyBiL2RyaXZlcnMvcGNtY2lhL3JzcmNfbm9uc3RhdGljLmMKaW5kZXggYjE4NzU1NS4uOWRhOTY1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9yc3JjX25vbnN0YXRpYy5jCkBAIC03NzAsNyArNzcwLDcgQEAKIAkJCQkJCQlyZXMtPmVuZCArIG51bSk7CiAJCQlpZiAoIXJldCkgewogCQkJCXJldCA9IGFkanVzdF9yZXNvdXJjZShzLT5pb1tpXS5yZXMsIHJlcy0+c3RhcnQsCi0JCQkJCSAgICAgICByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyBudW0gKyAxKTsKKwkJCQkJCSAgICAgIHJlc291cmNlX3NpemUocmVzKSArIG51bSk7CiAJCQkJaWYgKHJldCkKIAkJCQkJY29udGludWU7CiAJCQkJKmJhc2UgPSB0cnk7CkBAIC03ODgsOCArNzg4LDggQEAKIAkJCQkJCQlyZXMtPmVuZCk7CiAJCQlpZiAoIXJldCkgewogCQkJCXJldCA9IGFkanVzdF9yZXNvdXJjZShzLT5pb1tpXS5yZXMsCi0JCQkJCSAgICAgICByZXMtPnN0YXJ0IC0gbnVtLAotCQkJCQkgICAgICAgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgbnVtICsgMSk7CisJCQkJCQkgICAgICByZXMtPnN0YXJ0IC0gbnVtLAorCQkJCQkJICAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpICsgbnVtKTsKIAkJCQlpZiAocmV0KQogCQkJCQljb250aW51ZTsKIAkJCQkqYmFzZSA9IHRyeTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jCmluZGV4IDAwNTQxN2IuLmUxYzQ5MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYwpAQCAtMTE1Niw5ICsxMTU2LDkgQEAKIAlzdHJ1Y3Qgd21pZDNfZ2RzX2lucHV0X3BhcmFtIHBhcmFtcyA9IHsKIAkJLmZ1bmN0aW9uX251bSA9IDB4MSwKIAkJLmhvdGtleV9udW1iZXIgPSAweDAxLAotCQkuZGV2aWNlcyA9IEFDRVJfV01JRDNfR0RTX1dJUkVMRVNTICYKLQkJCQlBQ0VSX1dNSUQzX0dEU19USFJFRUcgJgotCQkJCUFDRVJfV01JRDNfR0RTX1dJTUFYICYKKwkJLmRldmljZXMgPSBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUyB8CisJCQkJQUNFUl9XTUlEM19HRFNfVEhSRUVHIHwKKwkJCQlBQ0VSX1dNSUQzX0dEU19XSU1BWCB8CiAJCQkJQUNFUl9XTUlEM19HRFNfQkxVRVRPT1RILAogCX07CiAJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0gewpAQCAtMTQ0NSw2ICsxNDQ1LDggQEAKIAl1bmlvbiBhY3BpX29iamVjdCAqb2JqOwogCXN0cnVjdCBldmVudF9yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MTYgZGV2aWNlX3N0YXRlOworCWNvbnN0IHN0cnVjdCBrZXlfZW50cnkgKmtleTsKIAogCXN0YXR1cyA9IHdtaV9nZXRfZXZlbnRfZGF0YSh2YWx1ZSwgJnJlc3BvbnNlKTsKIAlpZiAoc3RhdHVzICE9IEFFX09LKSB7CkBAIC0xNDcyLDIzICsxNDc0LDMyIEBACiAKIAlzd2l0Y2ggKHJldHVybl92YWx1ZS5mdW5jdGlvbikgewogCWNhc2UgV01JRF9IT1RLRVlfRVZFTlQ6Ci0JCWlmIChyZXR1cm5fdmFsdWUuZGV2aWNlX3N0YXRlKSB7Ci0JCQl1MTYgZGV2aWNlX3N0YXRlID0gcmV0dXJuX3ZhbHVlLmRldmljZV9zdGF0ZTsKLQkJCXByX2RlYnVnKCJkZXZpY2Ugc3RhdGU6IDB4JXhcbiIsIGRldmljZV9zdGF0ZSk7Ci0JCQlpZiAoaGFzX2NhcChBQ0VSX0NBUF9XSVJFTEVTUykpCi0JCQkJcmZraWxsX3NldF9zd19zdGF0ZSh3aXJlbGVzc19yZmtpbGwsCi0JCQkJIShkZXZpY2Vfc3RhdGUgJiBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUykpOwotCQkJaWYgKGhhc19jYXAoQUNFUl9DQVBfQkxVRVRPT1RIKSkKLQkJCQlyZmtpbGxfc2V0X3N3X3N0YXRlKGJsdWV0b290aF9yZmtpbGwsCi0JCQkJIShkZXZpY2Vfc3RhdGUgJiBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEgpKTsKLQkJCWlmIChoYXNfY2FwKEFDRVJfQ0FQX1RIUkVFRykpCi0JCQkJcmZraWxsX3NldF9zd19zdGF0ZSh0aHJlZWdfcmZraWxsLAotCQkJCSEoZGV2aWNlX3N0YXRlICYgQUNFUl9XTUlEM19HRFNfVEhSRUVHKSk7Ci0JCX0KLQkJaWYgKCFzcGFyc2Vfa2V5bWFwX3JlcG9ydF9ldmVudChhY2VyX3dtaV9pbnB1dF9kZXYsCi0JCQkJcmV0dXJuX3ZhbHVlLmtleV9udW0sIDEsIHRydWUpKQorCQlkZXZpY2Vfc3RhdGUgPSByZXR1cm5fdmFsdWUuZGV2aWNlX3N0YXRlOworCQlwcl9kZWJ1ZygiZGV2aWNlIHN0YXRlOiAweCV4XG4iLCBkZXZpY2Vfc3RhdGUpOworCisJCWtleSA9IHNwYXJzZV9rZXltYXBfZW50cnlfZnJvbV9zY2FuY29kZShhY2VyX3dtaV9pbnB1dF9kZXYsCisJCQkJCQkJcmV0dXJuX3ZhbHVlLmtleV9udW0pOworCQlpZiAoIWtleSkgewogCQkJcHJfd2FybigiVW5rbm93biBrZXkgbnVtYmVyIC0gMHgleFxuIiwKIAkJCQlyZXR1cm5fdmFsdWUua2V5X251bSk7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKGtleS0+a2V5Y29kZSkgeworCQkJY2FzZSBLRVlfV0xBTjoKKwkJCWNhc2UgS0VZX0JMVUVUT09USDoKKwkJCQlpZiAoaGFzX2NhcChBQ0VSX0NBUF9XSVJFTEVTUykpCisJCQkJCXJma2lsbF9zZXRfc3dfc3RhdGUod2lyZWxlc3NfcmZraWxsLAorCQkJCQkJIShkZXZpY2Vfc3RhdGUgJiBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUykpOworCQkJCWlmIChoYXNfY2FwKEFDRVJfQ0FQX1RIUkVFRykpCisJCQkJCXJma2lsbF9zZXRfc3dfc3RhdGUodGhyZWVnX3Jma2lsbCwKKwkJCQkJCSEoZGV2aWNlX3N0YXRlICYgQUNFUl9XTUlEM19HRFNfVEhSRUVHKSk7CisJCQkJaWYgKGhhc19jYXAoQUNFUl9DQVBfQkxVRVRPT1RIKSkKKwkJCQkJcmZraWxsX3NldF9zd19zdGF0ZShibHVldG9vdGhfcmZraWxsLAorCQkJCQkJIShkZXZpY2Vfc3RhdGUgJiBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEgpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNwYXJzZV9rZXltYXBfcmVwb3J0X2VudHJ5KGFjZXJfd21pX2lucHV0X2Rldiwga2V5LAorCQkJCQkJICAgMSwgdHJ1ZSk7CisJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfd2FybigiVW5rbm93biBmdW5jdGlvbiBudW1iZXIgLSAlZCAtICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtd21pLmMKaW5kZXggMDA0NjBjYi4uNjViNjZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLXdtaS5jCkBAIC04NTcsNyArODU3LDcgQEAKIAkJaW50IGVyciA9IGFzdXNfd21pX2dldF9kZXZzdGF0ZShhc3VzLCBkZXZfaWQsICZ2YWx1ZSk7CiAKIAkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOworCQkJcmV0dXJuIDA7IC8qIGNhbid0IHJldHVybiBuZWdhdGl2ZSBoZXJlICovCiAJfQogCiAJaWYgKGRldl9pZCA9PSBBU1VTX1dNSV9ERVZJRF9GQU5fQ1RSTCkgewpAQCAtMTAyNSw2ICsxMDI1LDcgQEAKIAkJcmV0dXJuIHBvd2VyOwogCiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOworCXByb3BzLnR5cGUgPSBCQUNLTElHSFRfUExBVEZPUk07CiAJcHJvcHMubWF4X2JyaWdodG5lc3MgPSBtYXg7CiAJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKGFzdXMtPmRyaXZlci0+bmFtZSwKIAkJCQkgICAgICAgJmFzdXMtPnBsYXRmb3JtX2RldmljZS0+ZGV2LCBhc3VzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jCmluZGV4IDNmMjA0ZmQuLjg4NzdiODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMKQEAgLTEwMzAsOCArMTAzMCwxMCBAQAogCWluaXRpYWxpemVfZmFuX2NvbnRyb2xfZGF0YShkYXRhKTsKIAogCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZjb21wYWxfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKKwkJa2ZyZWUoZGF0YSk7CiAJCXJldHVybiBlcnI7CisJfQogCiAJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwogCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMKaW5kZXggZDM4NDFkZS4uZTM5YWIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLWxhcHRvcC5jCkBAIC0yOTIsMTIgKzI5Miw5IEBACiAJZGVsbF9zZW5kX3JlcXVlc3QoYnVmZmVyLCAxNywgMTEpOwogCiAJLyogSWYgdGhlIGhhcmR3YXJlIHN3aXRjaCBjb250cm9scyB0aGlzIHJhZGlvLCBhbmQgdGhlIGhhcmR3YXJlCi0JICAgc3dpdGNoIGlzIGRpc2FibGVkLCBkb24ndCBhbGxvdyBjaGFuZ2luZyB0aGUgc29mdHdhcmUgc3RhdGUuCi0JICAgSWYgdGhlIGhhcmR3YXJlIHN3aXRjaCBpcyByZXBvcnRlZCBhcyBub3Qgc3VwcG9ydGVkLCBhbHdheXMKLQkgICBmaXJlIHRoZSBTTUkgdG8gdG9nZ2xlIHRoZSBraWxsc3dpdGNoLiAqLworCSAgIHN3aXRjaCBpcyBkaXNhYmxlZCwgZG9uJ3QgYWxsb3cgY2hhbmdpbmcgdGhlIHNvZnR3YXJlIHN0YXRlICovCiAJaWYgKChod3N3aXRjaF9zdGF0ZSAmIEJJVChod3N3aXRjaF9iaXQpKSAmJgotCSAgICAhKGJ1ZmZlci0+b3V0cHV0WzFdICYgQklUKDE2KSkgJiYKLQkgICAgKGJ1ZmZlci0+b3V0cHV0WzFdICYgQklUKDApKSkgeworCSAgICAhKGJ1ZmZlci0+b3V0cHV0WzFdICYgQklUKDE2KSkpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDAzLDIzICs0MDAsNiBAQAogCiBzdGF0aWMgdm9pZCBkZWxsX3VwZGF0ZV9yZmtpbGwoc3RydWN0IHdvcmtfc3RydWN0ICppZ25vcmVkKQogewotCWludCBzdGF0dXM7Ci0KLQlnZXRfYnVmZmVyKCk7Ci0JZGVsbF9zZW5kX3JlcXVlc3QoYnVmZmVyLCAxNywgMTEpOwotCXN0YXR1cyA9IGJ1ZmZlci0+b3V0cHV0WzFdOwotCXJlbGVhc2VfYnVmZmVyKCk7Ci0KLQkvKiBpZiBoYXJkd2FyZSByZmtpbGwgaXMgbm90IHN1cHBvcnRlZCwgc2V0IGl0IGV4cGxpY2l0bHkgKi8KLQlpZiAoIShzdGF0dXMgJiBCSVQoMCkpKSB7Ci0JCWlmICh3aWZpX3Jma2lsbCkKLQkJCWRlbGxfcmZraWxsX3NldCgodm9pZCAqKTEsICEoKHN0YXR1cyAmIEJJVCgxNykpID4+IDE3KSk7Ci0JCWlmIChibHVldG9vdGhfcmZraWxsKQotCQkJZGVsbF9yZmtpbGxfc2V0KCh2b2lkICopMiwgISgoc3RhdHVzICYgQklUKDE4KSkgPj4gMTgpKTsKLQkJaWYgKHd3YW5fcmZraWxsKQotCQkJZGVsbF9yZmtpbGxfc2V0KCh2b2lkICopMywgISgoc3RhdHVzICYgQklUKDE5KSkgPj4gMTkpKTsKLQl9Ci0KIAlpZiAod2lmaV9yZmtpbGwpCiAJCWRlbGxfcmZraWxsX3F1ZXJ5KHdpZmlfcmZraWxsLCAodm9pZCAqKTEpOwogCWlmIChibHVldG9vdGhfcmZraWxsKQpAQCAtNTYwLDExICs1NDAsMTEgQEAKIAllbHNlCiAJCWRlbGxfc2VuZF9yZXF1ZXN0KGJ1ZmZlciwgMCwgMSk7CiAKKwlyZXQgPSBidWZmZXItPm91dHB1dFsxXTsKKwogb3V0OgogCXJlbGVhc2VfYnVmZmVyKCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gYnVmZmVyLT5vdXRwdXRbMV07CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIGRlbGxfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHAtd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYwppbmRleCBmOTQwMTdiLi5lMmZhYTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYwpAQCAtMjA3LDYgKzIwNyw3IEBACiAJfTsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgaW5wdXQgPSB7IHNpemVvZihzdHJ1Y3QgYmlvc19hcmdzKSwgJmFyZ3MgfTsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXUzMiByYzsKIAogCWlmIChXQVJOX09OKGluc2l6ZSA+IHNpemVvZihhcmdzLmRhdGEpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjQsMTMgKzIyNSwxMyBAQAogCX0KIAogCWJpb3NfcmV0dXJuID0gKHN0cnVjdCBiaW9zX3JldHVybiAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CisJcmMgPSBiaW9zX3JldHVybi0+cmV0dXJuX2NvZGU7CiAKLQlpZiAoYmlvc19yZXR1cm4tPnJldHVybl9jb2RlKSB7Ci0JCWlmIChiaW9zX3JldHVybi0+cmV0dXJuX2NvZGUgIT0gSFBXTUlfUkVUX1VOS05PV05fQ01EVFlQRSkKLQkJCXByX3dhcm4oInF1ZXJ5IDB4JXggcmV0dXJuZWQgZXJyb3IgMHgleFxuIiwKLQkJCQlxdWVyeSwgYmlvc19yZXR1cm4tPnJldHVybl9jb2RlKTsKKwlpZiAocmMpIHsKKwkJaWYgKHJjICE9IEhQV01JX1JFVF9VTktOT1dOX0NNRFRZUEUpCisJCQlwcl93YXJuKCJxdWVyeSAweCV4IHJldHVybmVkIGVycm9yIDB4JXhcbiIsIHF1ZXJ5LCByYyk7CiAJCWtmcmVlKG9iaik7Ci0JCXJldHVybiBiaW9zX3JldHVybi0+cmV0dXJuX2NvZGU7CisJCXJldHVybiByYzsKIAl9CiAKIAlpZiAoIW91dHNpemUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX29ha3RyYWlsLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9vYWt0cmFpbC5jCmluZGV4IGU5MzYzNjQuLjdmODhjNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX29ha3RyYWlsLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfb2FrdHJhaWwuYwpAQCAtMjUwLDYgKzI1MCw3IEBACiAJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHByb3BzOwogCiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOworCXByb3BzLnR5cGUgPSBCQUNLTElHSFRfUExBVEZPUk07CiAJcHJvcHMubWF4X2JyaWdodG5lc3MgPSBPVF9FQ19CTF9CUklHSFRORVNTX01BWDsKIAliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoRFJJVkVSX05BTUUsCiAJCQkJICAgICAgICZvYWt0cmFpbF9kZXZpY2UtPmRldiwgTlVMTCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYwppbmRleCA3N2Y2ZTcwLi4yNmM1YjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCkBAIC0xODQsNiArMTg0LDEwIEBACiAKIAkvKiBNaXNjIGJheSBldmVudHMgKi8KIAlUUF9IS0VZX0VWX09QVERSVl9FSgkJPSAweDMwMDYsIC8qIG9wdC4gZHJpdmUgdHJheSBlamVjdGVkICovCisJVFBfSEtFWV9FVl9IT1RQTFVHX0RPQ0sJCT0gMHg0MDEwLCAvKiBkb2NrZWQgaW50byBob3RwbHVnIGRvY2sKKwkJCQkJCSAgICAgb3IgcG9ydCByZXBsaWNhdG9yICovCisJVFBfSEtFWV9FVl9IT1RQTFVHX1VORE9DSwk9IDB4NDAxMSwgLyogdW5kb2NrZWQgZnJvbSBob3RwbHVnCisJCQkJCQkgICAgIGRvY2sgb3IgcG9ydCByZXBsaWNhdG9yICovCiAKIAkvKiBVc2VyLWludGVyZmFjZSBldmVudHMgKi8KIAlUUF9IS0VZX0VWX0xJRF9DTE9TRQkJPSAweDUwMDEsIC8qIGxhcHRvcCBsaWQgY2xvc2VkICovCkBAIC0xOTQsNiArMTk4LDEwIEBACiAJVFBfSEtFWV9FVl9QRU5fUkVNT1ZFRAkJPSAweDUwMGMsIC8qIHRhYmxldCBwZW4gcmVtb3ZlZCAqLwogCVRQX0hLRVlfRVZfQlJHSFRfQ0hBTkdFRAk9IDB4NTAxMCwgLyogYmFja2xpZ2h0IGNvbnRyb2wgZXZlbnQgKi8KIAorCS8qIEtleS1yZWxhdGVkIHVzZXItaW50ZXJmYWNlIGV2ZW50cyAqLworCVRQX0hLRVlfRVZfS0VZX05VTUxPQ0sJCT0gMHg2MDAwLCAvKiBOdW1Mb2NrIGtleSBwcmVzc2VkICovCisJVFBfSEtFWV9FVl9LRVlfRk4JCT0gMHg2MDA1LCAvKiBGbiBrZXkgcHJlc3NlZD8gRTQyMCAqLworCiAJLyogVGhlcm1hbCBldmVudHMgKi8KIAlUUF9IS0VZX0VWX0FMQVJNX0JBVF9IT1QJPSAweDYwMTEsIC8qIGJhdHRlcnkgdG9vIGhvdCAqLwogCVRQX0hLRVlfRVZfQUxBUk1fQkFUX1hIT1QJPSAweDYwMTIsIC8qIGJhdHRlcnkgY3JpdGljYWxseSBob3QgKi8KQEAgLTIwMSw2ICsyMDksMTAgQEAKIAlUUF9IS0VZX0VWX0FMQVJNX1NFTlNPUl9YSE9UCT0gMHg2MDIyLCAvKiBzZW5zb3IgY3JpdGljYWxseSBob3QgKi8KIAlUUF9IS0VZX0VWX1RITV9UQUJMRV9DSEFOR0VECT0gMHg2MDMwLCAvKiB0aGVybWFsIHRhYmxlIGNoYW5nZWQgKi8KIAorCVRQX0hLRVlfRVZfVU5LXzYwNDAJCT0gMHg2MDQwLCAvKiBSZWxhdGVkIHRvIEFDIGNoYW5nZT8KKwkJCQkJCSAgICAgc29tZSBzb3J0IG9mIEFQTSBoaW50LAorCQkJCQkJICAgICBXNTIwICovCisKIAkvKiBNaXNjICovCiAJVFBfSEtFWV9FVl9SRktJTExfQ0hBTkdFRAk9IDB4NzAwMCwgLyogcmZraWxsIHN3aXRjaCBjaGFuZ2VkICovCiB9OwpAQCAtMzUxMyw2ICszNTI1LDM0IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sIGhvdGtleV9ub3RpZnlfZG9ja2V2ZW50KGNvbnN0IHUzMiBoa2V5LAorCQkJCSBib29sICpzZW5kX2FjcGlfZXYsCisJCQkJIGJvb2wgKmlnbm9yZV9hY3BpX2V2KQoreworCS8qIDB4NDAwMC0weDRGRkY6IGRvY2stcmVsYXRlZCBldmVudHMgKi8KKwkqc2VuZF9hY3BpX2V2ID0gdHJ1ZTsKKwkqaWdub3JlX2FjcGlfZXYgPSBmYWxzZTsKKworCXN3aXRjaCAoaGtleSkgeworCWNhc2UgVFBfSEtFWV9FVl9VTkRPQ0tfQUNLOgorCQkvKiBBQ1BJIHVuZG9jayBvcGVyYXRpb24gY29tcGxldGVkIGFmdGVyIHdha2V1cCAqLworCQlob3RrZXlfYXV0b3NsZWVwX2FjayA9IDE7CisJCXByX2luZm8oInVuZG9ja2VkXG4iKTsKKwkJaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSgpOworCQlyZXR1cm4gdHJ1ZTsKKworCWNhc2UgVFBfSEtFWV9FVl9IT1RQTFVHX0RPQ0s6IC8qIGRvY2tlZCB0byBwb3J0IHJlcGxpY2F0b3IgKi8KKwkJcHJfaW5mbygiZG9ja2VkIGludG8gaG90cGx1ZyBwb3J0IHJlcGxpY2F0b3JcbiIpOworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIFRQX0hLRVlfRVZfSE9UUExVR19VTkRPQ0s6IC8qIHVuZG9ja2VkIGZyb20gcG9ydCByZXBsaWNhdG9yICovCisJCXByX2luZm8oInVuZG9ja2VkIGZyb20gaG90cGx1ZyBwb3J0IHJlcGxpY2F0b3JcbiIpOworCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKIHN0YXRpYyBib29sIGhvdGtleV9ub3RpZnlfdXNyZXZlbnQoY29uc3QgdTMyIGhrZXksCiAJCQkJIGJvb2wgKnNlbmRfYWNwaV9ldiwKIAkJCQkgYm9vbCAqaWdub3JlX2FjcGlfZXYpCkBAIC0zNTQ3LDEzICszNTg3LDEzIEBACiAKIHN0YXRpYyB2b2lkIHRoZXJtYWxfZHVtcF9hbGxfc2Vuc29ycyh2b2lkKTsKIAotc3RhdGljIGJvb2wgaG90a2V5X25vdGlmeV90aGVybWFsKGNvbnN0IHUzMiBoa2V5LAorc3RhdGljIGJvb2wgaG90a2V5X25vdGlmeV82eHh4KGNvbnN0IHUzMiBoa2V5LAogCQkJCSBib29sICpzZW5kX2FjcGlfZXYsCiAJCQkJIGJvb2wgKmlnbm9yZV9hY3BpX2V2KQogewogCWJvb2wga25vd24gPSB0cnVlOwogCi0JLyogMHg2MDAwLTB4NkZGRjogdGhlcm1hbCBhbGFybXMgKi8KKwkvKiAweDYwMDAtMHg2RkZGOiB0aGVybWFsIGFsYXJtcy9ub3RpY2VzIGFuZCBrZXlib2FyZCBldmVudHMgKi8KIAkqc2VuZF9hY3BpX2V2ID0gdHJ1ZTsKIAkqaWdub3JlX2FjcGlfZXYgPSBmYWxzZTsKIApAQCAtMzU4Miw4ICszNjIyLDE3IEBACiAJCQkgImEgc2Vuc29yIHJlcG9ydHMgc29tZXRoaW5nIGlzIGV4dHJlbWVseSBob3QhXG4iKTsKIAkJLyogcmVjb21tZW5kZWQgYWN0aW9uOiBpbW1lZGlhdGUgc2xlZXAvaGliZXJuYXRlICovCiAJCWJyZWFrOworCisJY2FzZSBUUF9IS0VZX0VWX0tFWV9OVU1MT0NLOgorCWNhc2UgVFBfSEtFWV9FVl9LRVlfRk46CisJCS8qIGtleSBwcmVzcyBldmVudHMsIHdlIGp1c3QgaWdub3JlIHRoZW0gYXMgbG9uZyBhcyB0aGUgRUMKKwkJICogaXMgc3RpbGwgcmVwb3J0aW5nIHRoZW0gaW4gdGhlIG5vcm1hbCBrZXlib2FyZCBzdHJlYW0gKi8KKwkJKnNlbmRfYWNwaV9ldiA9IGZhbHNlOworCQkqaWdub3JlX2FjcGlfZXYgPSB0cnVlOworCQlyZXR1cm4gdHJ1ZTsKKwogCWRlZmF1bHQ6Ci0JCXByX2FsZXJ0KCJUSEVSTUFMIEFMRVJUOiB1bmtub3duIHRoZXJtYWwgYWxhcm0gcmVjZWl2ZWRcbiIpOworCQlwcl93YXJuKCJ1bmtub3duIHBvc3NpYmxlIHRoZXJtYWwgYWxhcm0gb3Iga2V5Ym9hcmQgZXZlbnQgcmVjZWl2ZWRcbiIpOwogCQlrbm93biA9IGZhbHNlOwogCX0KIApAQCAtMzY1MiwxNSArMzcwMSw5IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSA0OgotCQkJLyogMHg0MDAwLTB4NEZGRjogZG9jay1yZWxhdGVkIHdha2V1cHMgKi8KLQkJCWlmIChoa2V5ID09IFRQX0hLRVlfRVZfVU5ET0NLX0FDSykgewotCQkJCWhvdGtleV9hdXRvc2xlZXBfYWNrID0gMTsKLQkJCQlwcl9pbmZvKCJ1bmRvY2tlZFxuIik7Ci0JCQkJaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSgpOwotCQkJCWtub3duX2V2ID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJa25vd25fZXYgPSBmYWxzZTsKLQkJCX0KKwkJCS8qIDB4NDAwMC0weDRGRkY6IGRvY2stcmVsYXRlZCBldmVudHMgKi8KKwkJCWtub3duX2V2ID0gaG90a2V5X25vdGlmeV9kb2NrZXZlbnQoaGtleSwgJnNlbmRfYWNwaV9ldiwKKwkJCQkJCSZpZ25vcmVfYWNwaV9ldik7CiAJCQlicmVhazsKIAkJY2FzZSA1OgogCQkJLyogMHg1MDAwLTB4NUZGRjogaHVtYW4gaW50ZXJmYWNlIGhlbHBlcnMgKi8KQEAgLTM2NjgsOCArMzcxMSw5IEBACiAJCQkJCQkgJmlnbm9yZV9hY3BpX2V2KTsKIAkJCWJyZWFrOwogCQljYXNlIDY6Ci0JCQkvKiAweDYwMDAtMHg2RkZGOiB0aGVybWFsIGFsYXJtcyAqLwotCQkJa25vd25fZXYgPSBob3RrZXlfbm90aWZ5X3RoZXJtYWwoaGtleSwgJnNlbmRfYWNwaV9ldiwKKwkJCS8qIDB4NjAwMC0weDZGRkY6IHRoZXJtYWwgYWxhcm1zL25vdGljZXMgYW5kCisJCQkgKiAgICAgICAgICAgICAgICBrZXlib2FyZCBldmVudHMgKi8KKwkJCWtub3duX2V2ID0gaG90a2V5X25vdGlmeV82eHh4KGhrZXksICZzZW5kX2FjcGlfZXYsCiAJCQkJCQkgJmlnbm9yZV9hY3BpX2V2KTsKIAkJCWJyZWFrOwogCQljYXNlIDc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKaW5kZXggMTAwZTRkOS4uYmJmM2VkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwpAQCAtNTA5LDE1ICs1MDksMTUgQEAKIAkJCQkJICAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSAqcCkKIHsKIAlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyIG1hcCA9IDAsIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgbWFwID0gMCwgZmxhZ3MgPSAwOwogCiAJaWYgKHAtPmNoYW5uZWxfY291bnQgPT0gMCkKLQkJcmV0dXJuOworCQlmbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOwogCiAJZm9yIChpID0gMDsgaSA8IHAtPmNoYW5uZWxfY291bnQ7IGkrKykKIAkJbWFwIHw9IDEgPDwgcC0+Y2hhbm5lbHNbaV07CiAKLQlmbGFncyA9IGRtYV9mbGFncyhkZXYsIHAtPnR5cGUsIHAtPmJ1c19tYXN0ZXIsIHAtPnRyYW5zZmVyKTsKKwlmbGFncyB8PSBkbWFfZmxhZ3MoZGV2LCBwLT50eXBlLCBwLT5idXNfbWFzdGVyLCBwLT50cmFuc2Zlcik7CiAJcG5wX3JlZ2lzdGVyX2RtYV9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgbWFwLCBmbGFncyk7CiB9CiAKQEAgLTUyNywxNyArNTI3LDE3IEBACiB7CiAJaW50IGk7CiAJcG5wX2lycV9tYXNrX3QgbWFwOwotCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBmbGFncyA9IDA7CiAKIAlpZiAocC0+aW50ZXJydXB0X2NvdW50ID09IDApCi0JCXJldHVybjsKKwkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKIAogCWJpdG1hcF96ZXJvKG1hcC5iaXRzLCBQTlBfSVJRX05SKTsKIAlmb3IgKGkgPSAwOyBpIDwgcC0+aW50ZXJydXB0X2NvdW50OyBpKyspCiAJCWlmIChwLT5pbnRlcnJ1cHRzW2ldKQogCQkJX19zZXRfYml0KHAtPmludGVycnVwdHNbaV0sIG1hcC5iaXRzKTsKIAotCWZsYWdzID0gaXJxX2ZsYWdzKHAtPnRyaWdnZXJpbmcsIHAtPnBvbGFyaXR5LCBwLT5zaGFyYWJsZSk7CisJZmxhZ3MgfD0gaXJxX2ZsYWdzKHAtPnRyaWdnZXJpbmcsIHAtPnBvbGFyaXR5LCBwLT5zaGFyYWJsZSk7CiAJcG5wX3JlZ2lzdGVyX2lycV9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgJm1hcCwgZmxhZ3MpOwogfQogCkBAIC01NDcsMTAgKzU0NywxMCBAQAogewogCWludCBpOwogCXBucF9pcnFfbWFza190IG1hcDsKLQl1bnNpZ25lZCBjaGFyIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAwOwogCiAJaWYgKHAtPmludGVycnVwdF9jb3VudCA9PSAwKQotCQlyZXR1cm47CisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAKIAliaXRtYXBfemVybyhtYXAuYml0cywgUE5QX0lSUV9OUik7CiAJZm9yIChpID0gMDsgaSA8IHAtPmludGVycnVwdF9jb3VudDsgaSsrKSB7CkBAIC01NjQsNyArNTY0LDcgQEAKIAkJfQogCX0KIAotCWZsYWdzID0gaXJxX2ZsYWdzKHAtPnRyaWdnZXJpbmcsIHAtPnBvbGFyaXR5LCBwLT5zaGFyYWJsZSk7CisJZmxhZ3MgfD0gaXJxX2ZsYWdzKHAtPnRyaWdnZXJpbmcsIHAtPnBvbGFyaXR5LCBwLT5zaGFyYWJsZSk7CiAJcG5wX3JlZ2lzdGVyX2lycV9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgJm1hcCwgZmxhZ3MpOwogfQogCkBAIC01NzUsMTAgKzU3NSwxMCBAQAogCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAwOwogCiAJaWYgKGlvLT5hZGRyZXNzX2xlbmd0aCA9PSAwKQotCQlyZXR1cm47CisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAKIAlpZiAoaW8tPmlvX2RlY29kZSA9PSBBQ1BJX0RFQ09ERV8xNikKLQkJZmxhZ3MgPSBJT1JFU09VUkNFX0lPXzE2QklUX0FERFI7CisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfSU9fMTZCSVRfQUREUjsKIAlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgaW8tPm1pbmltdW0sIGlvLT5tYXhpbXVtLAogCQkJCSAgIGlvLT5hbGlnbm1lbnQsIGlvLT5hZGRyZXNzX2xlbmd0aCwgZmxhZ3MpOwogfQpAQCAtNTg3LDExICs1ODcsMTMgQEAKIAkJCQkJdW5zaWduZWQgaW50IG9wdGlvbl9mbGFncywKIAkJCQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8gKmlvKQogeworCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAwOworCiAJaWYgKGlvLT5hZGRyZXNzX2xlbmd0aCA9PSAwKQotCQlyZXR1cm47CisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAKIAlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgaW8tPmFkZHJlc3MsIGlvLT5hZGRyZXNzLAotCQkJCSAgIDAsIGlvLT5hZGRyZXNzX2xlbmd0aCwgSU9SRVNPVVJDRV9JT19GSVhFRCk7CisJCQkJICAgMCwgaW8tPmFkZHJlc3NfbGVuZ3RoLCBmbGFncyB8IElPUkVTT1VSQ0VfSU9fRklYRUQpOwogfQogCiBzdGF0aWMgX19pbml0IHZvaWQgcG5wYWNwaV9wYXJzZV9tZW0yNF9vcHRpb24oc3RydWN0IHBucF9kZXYgKmRldiwKQEAgLTYwMSwxMCArNjAzLDEwIEBACiAJdW5zaWduZWQgY2hhciBmbGFncyA9IDA7CiAKIAlpZiAocC0+YWRkcmVzc19sZW5ndGggPT0gMCkKLQkJcmV0dXJuOworCQlmbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOwogCiAJaWYgKHAtPndyaXRlX3Byb3RlY3QgPT0gQUNQSV9SRUFEX1dSSVRFX01FTU9SWSkKLQkJZmxhZ3MgPSBJT1JFU09VUkNFX01FTV9XUklURUFCTEU7CisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRTsKIAlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKGRldiwgb3B0aW9uX2ZsYWdzLCBwLT5taW5pbXVtLCBwLT5tYXhpbXVtLAogCQkJCSAgcC0+YWxpZ25tZW50LCBwLT5hZGRyZXNzX2xlbmd0aCwgZmxhZ3MpOwogfQpAQCAtNjE2LDEwICs2MTgsMTAgQEAKIAl1bnNpZ25lZCBjaGFyIGZsYWdzID0gMDsKIAogCWlmIChwLT5hZGRyZXNzX2xlbmd0aCA9PSAwKQotCQlyZXR1cm47CisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAKIAlpZiAocC0+d3JpdGVfcHJvdGVjdCA9PSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKQotCQlmbGFncyA9IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRTsKKwkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOwogCXBucF9yZWdpc3Rlcl9tZW1fcmVzb3VyY2UoZGV2LCBvcHRpb25fZmxhZ3MsIHAtPm1pbmltdW0sIHAtPm1heGltdW0sCiAJCQkJICBwLT5hbGlnbm1lbnQsIHAtPmFkZHJlc3NfbGVuZ3RoLCBmbGFncyk7CiB9CkBAIC02MzEsMTAgKzYzMywxMCBAQAogCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAwOwogCiAJaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCi0JCXJldHVybjsKKwkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKIAogCWlmIChwLT53cml0ZV9wcm90ZWN0ID09IEFDUElfUkVBRF9XUklURV9NRU1PUlkpCi0JCWZsYWdzID0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOworCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTV9XUklURUFCTEU7CiAJcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgcC0+YWRkcmVzcywgcC0+YWRkcmVzcywKIAkJCQkgIDAsIHAtPmFkZHJlc3NfbGVuZ3RoLCBmbGFncyk7CiB9CkBAIC02NTUsMTggKzY1NywxOCBAQAogCX0KIAogCWlmIChwLT5hZGRyZXNzX2xlbmd0aCA9PSAwKQotCQlyZXR1cm47CisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAKIAlpZiAocC0+cmVzb3VyY2VfdHlwZSA9PSBBQ1BJX01FTU9SWV9SQU5HRSkgewogCQlpZiAocC0+aW5mby5tZW0ud3JpdGVfcHJvdGVjdCA9PSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKQotCQkJZmxhZ3MgPSBJT1JFU09VUkNFX01FTV9XUklURUFCTEU7CisJCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTV9XUklURUFCTEU7CiAJCXBucF9yZWdpc3Rlcl9tZW1fcmVzb3VyY2UoZGV2LCBvcHRpb25fZmxhZ3MsIHAtPm1pbmltdW0sCiAJCQkJCSAgcC0+bWluaW11bSwgMCwgcC0+YWRkcmVzc19sZW5ndGgsCiAJCQkJCSAgZmxhZ3MpOwogCX0gZWxzZSBpZiAocC0+cmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0lPX1JBTkdFKQogCQlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgcC0+bWluaW11bSwKIAkJCQkJICAgcC0+bWluaW11bSwgMCwgcC0+YWRkcmVzc19sZW5ndGgsCi0JCQkJCSAgIElPUkVTT1VSQ0VfSU9fRklYRUQpOworCQkJCQkgICBmbGFncyB8IElPUkVTT1VSQ0VfSU9fRklYRUQpOwogfQogCiBzdGF0aWMgX19pbml0IHZvaWQgcG5wYWNwaV9wYXJzZV9leHRfYWRkcmVzc19vcHRpb24oc3RydWN0IHBucF9kZXYgKmRldiwKQEAgLTY3NywxOCArNjc5LDE4IEBACiAJdW5zaWduZWQgY2hhciBmbGFncyA9IDA7CiAKIAlpZiAocC0+YWRkcmVzc19sZW5ndGggPT0gMCkKLQkJcmV0dXJuOworCQlmbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOwogCiAJaWYgKHAtPnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpIHsKIAkJaWYgKHAtPmluZm8ubWVtLndyaXRlX3Byb3RlY3QgPT0gQUNQSV9SRUFEX1dSSVRFX01FTU9SWSkKLQkJCWZsYWdzID0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOworCQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOwogCQlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKGRldiwgb3B0aW9uX2ZsYWdzLCBwLT5taW5pbXVtLAogCQkJCQkgIHAtPm1pbmltdW0sIDAsIHAtPmFkZHJlc3NfbGVuZ3RoLAogCQkJCQkgIGZsYWdzKTsKIAl9IGVsc2UgaWYgKHAtPnJlc291cmNlX3R5cGUgPT0gQUNQSV9JT19SQU5HRSkKIAkJcG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2UoZGV2LCBvcHRpb25fZmxhZ3MsIHAtPm1pbmltdW0sCiAJCQkJCSAgIHAtPm1pbmltdW0sIDAsIHAtPmFkZHJlc3NfbGVuZ3RoLAotCQkJCQkgICBJT1JFU09VUkNFX0lPX0ZJWEVEKTsKKwkJCQkJICAgZmxhZ3MgfCBJT1JFU09VUkNFX0lPX0ZJWEVEKTsKIH0KIAogc3RydWN0IGFjcGlwbnBfcGFyc2Vfb3B0aW9uX3MgewpAQCAtMTAxOCw3ICsxMDIwLDcgQEAKIAkJaW8tPm1pbmltdW0gPSBwLT5zdGFydDsKIAkJaW8tPm1heGltdW0gPSBwLT5lbmQ7CiAJCWlvLT5hbGlnbm1lbnQgPSAwOwkvKiBDb3JyZWN0PyAqLwotCQlpby0+YWRkcmVzc19sZW5ndGggPSBwLT5lbmQgLSBwLT5zdGFydCArIDE7CisJCWlvLT5hZGRyZXNzX2xlbmd0aCA9IHJlc291cmNlX3NpemUocCk7CiAJfSBlbHNlIHsKIAkJaW8tPm1pbmltdW0gPSAwOwogCQlpby0+YWRkcmVzc19sZW5ndGggPSAwOwpAQCAtMTAzNiw3ICsxMDM4LDcgQEAKIAogCWlmIChwbnBfcmVzb3VyY2VfZW5hYmxlZChwKSkgewogCQlmaXhlZF9pby0+YWRkcmVzcyA9IHAtPnN0YXJ0OwotCQlmaXhlZF9pby0+YWRkcmVzc19sZW5ndGggPSBwLT5lbmQgLSBwLT5zdGFydCArIDE7CisJCWZpeGVkX2lvLT5hZGRyZXNzX2xlbmd0aCA9IHJlc291cmNlX3NpemUocCk7CiAJfSBlbHNlIHsKIAkJZml4ZWRfaW8tPmFkZHJlc3MgPSAwOwogCQlmaXhlZF9pby0+YWRkcmVzc19sZW5ndGggPSAwOwpAQCAtMTA1OSw3ICsxMDYxLDcgQEAKIAkJbWVtb3J5MjQtPm1pbmltdW0gPSBwLT5zdGFydDsKIAkJbWVtb3J5MjQtPm1heGltdW0gPSBwLT5lbmQ7CiAJCW1lbW9yeTI0LT5hbGlnbm1lbnQgPSAwOwotCQltZW1vcnkyNC0+YWRkcmVzc19sZW5ndGggPSBwLT5lbmQgLSBwLT5zdGFydCArIDE7CisJCW1lbW9yeTI0LT5hZGRyZXNzX2xlbmd0aCA9IHJlc291cmNlX3NpemUocCk7CiAJfSBlbHNlIHsKIAkJbWVtb3J5MjQtPm1pbmltdW0gPSAwOwogCQltZW1vcnkyNC0+YWRkcmVzc19sZW5ndGggPSAwOwpAQCAtMTA4Myw3ICsxMDg1LDcgQEAKIAkJbWVtb3J5MzItPm1pbmltdW0gPSBwLT5zdGFydDsKIAkJbWVtb3J5MzItPm1heGltdW0gPSBwLT5lbmQ7CiAJCW1lbW9yeTMyLT5hbGlnbm1lbnQgPSAwOwotCQltZW1vcnkzMi0+YWRkcmVzc19sZW5ndGggPSBwLT5lbmQgLSBwLT5zdGFydCArIDE7CisJCW1lbW9yeTMyLT5hZGRyZXNzX2xlbmd0aCA9IHJlc291cmNlX3NpemUocCk7CiAJfSBlbHNlIHsKIAkJbWVtb3J5MzItPm1pbmltdW0gPSAwOwogCQltZW1vcnkzMi0+YWxpZ25tZW50ID0gMDsKQEAgLTExMDYsNyArMTEwOCw3IEBACiAJCSAgICBwLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSA/CiAJCSAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZIDogQUNQSV9SRUFEX09OTFlfTUVNT1JZOwogCQlmaXhlZF9tZW1vcnkzMi0+YWRkcmVzcyA9IHAtPnN0YXJ0OwotCQlmaXhlZF9tZW1vcnkzMi0+YWRkcmVzc19sZW5ndGggPSBwLT5lbmQgLSBwLT5zdGFydCArIDE7CisJCWZpeGVkX21lbW9yeTMyLT5hZGRyZXNzX2xlbmd0aCA9IHJlc291cmNlX3NpemUocCk7CiAJfSBlbHNlIHsKIAkJZml4ZWRfbWVtb3J5MzItPmFkZHJlc3MgPSAwOwogCQlmaXhlZF9tZW1vcnkzMi0+YWRkcmVzc19sZW5ndGggPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jCmluZGV4IGNiMWY0N2IuLmNjYTJmOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYworKysgYi9kcml2ZXJzL3BucC9wbnBiaW9zL3JzcGFyc2VyLmMKQEAgLTUwNSw3ICs1MDUsNyBAQAogCiAJaWYgKHBucF9yZXNvdXJjZV9lbmFibGVkKHJlcykpIHsKIAkJYmFzZSA9IHJlcy0+c3RhcnQ7Ci0JCWxlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJCWxlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAl9IGVsc2UgewogCQliYXNlID0gMDsKIAkJbGVuID0gMDsKQEAgLTUyOSw3ICs1MjksNyBAQAogCiAJaWYgKHBucF9yZXNvdXJjZV9lbmFibGVkKHJlcykpIHsKIAkJYmFzZSA9IHJlcy0+c3RhcnQ7Ci0JCWxlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJCWxlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAl9IGVsc2UgewogCQliYXNlID0gMDsKIAkJbGVuID0gMDsKQEAgLTU1OSw3ICs1NTksNyBAQAogCiAJaWYgKHBucF9yZXNvdXJjZV9lbmFibGVkKHJlcykpIHsKIAkJYmFzZSA9IHJlcy0+c3RhcnQ7Ci0JCWxlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJCWxlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAl9IGVsc2UgewogCQliYXNlID0gMDsKIAkJbGVuID0gMDsKQEAgLTYxNyw3ICs2MTcsNyBAQAogCiAJaWYgKHBucF9yZXNvdXJjZV9lbmFibGVkKHJlcykpIHsKIAkJYmFzZSA9IHJlcy0+c3RhcnQ7Ci0JCWxlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJCWxlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAl9IGVsc2UgewogCQliYXNlID0gMDsKIAkJbGVuID0gMDsKQEAgLTYzNiwxMSArNjM2LDExIEBACiAJCQkJICAgICAgc3RydWN0IHJlc291cmNlICpyZXMpCiB7CiAJdW5zaWduZWQgbG9uZyBiYXNlID0gcmVzLT5zdGFydDsKLQl1bnNpZ25lZCBsb25nIGxlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJdW5zaWduZWQgbG9uZyBsZW4gPSByZXNvdXJjZV9zaXplKHJlcyk7CiAKIAlpZiAocG5wX3Jlc291cmNlX2VuYWJsZWQocmVzKSkgewogCQliYXNlID0gcmVzLT5zdGFydDsKLQkJbGVuID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwkJbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCX0gZWxzZSB7CiAJCWJhc2UgPSAwOwogCQlsZW4gPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9kczI3ODJfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9kczI3ODJfYmF0dGVyeS5jCmluZGV4IDRkMmRjNGYuLmJmYmNlNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvZHMyNzgyX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL2RzMjc4Ml9iYXR0ZXJ5LmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA5IEJsdWV3YXRlciBTeXN0ZW1zIEx0ZAogICoKLSAqIEF1dGhvcjogUnlhbiBNYWxsb24gPHJ5YW5AYmx1ZXdhdGVyc3lzLmNvbT4KKyAqIEF1dGhvcjogUnlhbiBNYWxsb24KICAqCiAgKiBEUzI3ODYgYWRkZWQgYnkgWXVsaWEgVmlsZW5za3kgPHZpbGVuc2t5QGNvbXB1bGFiLmNvLmlsPgogICoKQEAgLTQxNiw2ICs0MTYsNiBAQAogfQogbW9kdWxlX2V4aXQoZHMyNzh4X2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJSeWFuIE1hbGxvbiA8cnlhbkBibHVld2F0ZXJzeXMuY29tPiIpOworTU9EVUxFX0FVVEhPUigiUnlhbiBNYWxsb24iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTWF4aW0vRGFsbGFzIERTMjc4MiBTdGFuZC1BbG9uZSBGdWVsIEdhdWFnZSBJQyBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHRwL3B0cF9jaGFyZGV2LmMgYi9kcml2ZXJzL3B0cC9wdHBfY2hhcmRldi5jCmluZGV4IGE4ZDAzYWUuLmU3ZjMwMWRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wdHAvcHRwX2NoYXJkZXYuYworKysgYi9kcml2ZXJzL3B0cC9wdHBfY2hhcmRldi5jCkBAIC00Niw3ICs0Niw4IEBACiAJCWNhcHMubl9leHRfdHMgPSBwdHAtPmluZm8tPm5fZXh0X3RzOwogCQljYXBzLm5fcGVyX291dCA9IHB0cC0+aW5mby0+bl9wZXJfb3V0OwogCQljYXBzLnBwcyA9IHB0cC0+aW5mby0+cHBzOwotCQllcnIgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmY2Fwcywgc2l6ZW9mKGNhcHMpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZjYXBzLCBzaXplb2YoY2FwcykpKQorCQkJZXJyID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUF9FWFRUU19SRVFVRVNUOgpAQCAtMTI5LDggKzEzMCwxMCBAQAogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAotCWlmIChwdHAtPmRlZnVuY3QpCisJaWYgKHB0cC0+ZGVmdW5jdCkgeworCQltdXRleF91bmxvY2soJnB0cC0+dHNldnFfbXV4KTsKIAkJcmV0dXJuIC1FTk9ERVY7CisJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5sb2NrLCBmbGFncyk7CiAKQEAgLTE1MCwxMCArMTUzLDggQEAKIAogCW11dGV4X3VubG9jaygmcHRwLT50c2V2cV9tdXgpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihidWYsIGV2ZW50LCBjbnQpKSB7Ci0JCW11dGV4X3VubG9jaygmcHRwLT50c2V2cV9tdXgpOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBldmVudCwgY250KSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQogCiAJcmV0dXJuIGNudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcgYi9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCmluZGV4IGQ3ZWQyMGYuLjExOGViMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwpAQCAtMjM1LDYgKzIzNSw3IEBACiBjb25maWcgUkVHVUxBVE9SX1RQUzY1MDIzCiAJdHJpc3RhdGUgIlRJIFRQUzY1MDIzIFBvd2VyIHJlZ3VsYXRvcnMiCiAJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgUkVHTUFQX0kyQwogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFRQUzY1MDIzIHZvbHRhZ2UgcmVndWxhdG9yIGNoaXBzLiBUUFM2NTAyMyBwcm92aWRlcwogCSAgdGhyZWUgc3RlcC1kb3duIGNvbnZlcnRlcnMgYW5kIHR3byBnZW5lcmFsLXB1cnBvc2UgTERPIHZvbHRhZ2UgcmVndWxhdG9ycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RiODUwMC1wcmNtdS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGI4NTAwLXByY211LmMKaW5kZXggZTVmN2I4Zi4uMmJiOGY0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGI4NTAwLXByY211LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGI4NTAwLXByY211LmMKQEAgLTI2Niw3ICsyNjYsNyBAQAogICogUmVndWxhdG9yIGluZm9ybWF0aW9uCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZGI4NTAwX3JlZ3VsYXRvcl9pbmZvCi0JCWRiODUwMF9yZWd1bGF0b3JfaW5mb1tEQjg1MDBfTlVNX1JFR1VMQVRPUlNdID0geworZGI4NTAwX3JlZ3VsYXRvcl9pbmZvW0RCODUwMF9OVU1fUkVHVUxBVE9SU10gPSB7CiAJW0RCODUwMF9SRUdVTEFUT1JfVkFQRV0gPSB7CiAJCS5kZXNjID0gewogCQkJLm5hbWUJPSAiZGI4NTAwLXZhcGUiLApAQCAtNDkyLDExICs0OTIsOSBAQAogCQkJCWluZm8tPmRlc2MubmFtZSwgZXJyKTsKIAogCQkJLyogaWYgZmFpbGluZywgdW5yZWdpc3RlciBhbGwgZWFybGllciByZWd1bGF0b3JzICovCi0JCQlpLS07Ci0JCQl3aGlsZSAoaSA+PSAwKSB7CisJCQl3aGlsZSAoLS1pID49IDApIHsKIAkJCQlpbmZvID0gJmRiODUwMF9yZWd1bGF0b3JfaW5mb1tpXTsKIAkJCQlyZWd1bGF0b3JfdW5yZWdpc3RlcihpbmZvLT5yZGV2KTsKLQkJCQlpLS07CiAJCQl9CiAJCQlyZXR1cm4gZXJyOwogCQl9CkBAIC01MzYsMTMgKzUzNCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGRiODUwMF9yZWd1bGF0b3JfaW5pdCh2b2lkKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRiODUwMF9yZWd1bGF0b3JfZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkYjg1MDBfcmVndWxhdG9yX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkYjg1MDBfcmVndWxhdG9yX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NTIuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NTIuYwppbmRleCBkYWZmN2ZkLi40ODZlZDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAlzOCB2aWQgPSAtMSwgaTsKIAogCWlmICghZ3Bpb19pc192YWxpZChtYXg4OTUyLT5wZGF0YS0+Z3Bpb192aWQwKSB8fAotCQkJIWdwaW9faXNfdmFsaWQobWF4ODk1Mi0+cGRhdGEtPmdwaW9fdmlkMCkpIHsKKwkJCSFncGlvX2lzX3ZhbGlkKG1heDg5NTItPnBkYXRhLT5ncGlvX3ZpZDEpKSB7CiAJCS8qIERWUyBub3Qgc3VwcG9ydGVkICovCiAJCXJldHVybiAtRVBFUk07CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5Ny5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5Ny5jCmluZGV4IDEwZDVhMWQuLmFkNjYyOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTcuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk3LmMKQEAgLTM5LDI1ICszOSwyOCBAQAogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmRldjsKIAlpbnQgcmFtcF9kZWxheTsgLyogaW4gbVYvdXMgKi8KIAorCWJvb2wgYnVjazFfZ3Bpb2R2czsKKwlib29sIGJ1Y2syX2dwaW9kdnM7CisJYm9vbCBidWNrNV9ncGlvZHZzOwogCXU4IGJ1Y2sxX3ZvbFs4XTsKIAl1OCBidWNrMl92b2xbOF07CiAJdTggYnVjazVfdm9sWzhdOworCWludCBidWNrMTI1X2dwaW9zWzNdOwogCWludCBidWNrMTI1X2dwaW9pbmRleDsKKwlib29sIGlnbm9yZV9ncGlvZHZzX3NpZGVfZWZmZWN0OwogCiAJdTggc2F2ZWRfc3RhdGVzW01BWDg5OTdfUkVHX01BWF07CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWF4ODk5N19zZXRfZ3BpbyhzdHJ1Y3QgbWF4ODk5N19kYXRhICptYXg4OTk3KQogewotCXN0cnVjdCBtYXg4OTk3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KLQkJZGV2X2dldF9wbGF0ZGF0YShtYXg4OTk3LT5pb2Rldi0+ZGV2KTsKIAlpbnQgc2V0MyA9IChtYXg4OTk3LT5idWNrMTI1X2dwaW9pbmRleCkgJiAweDE7CiAJaW50IHNldDIgPSAoKG1heDg5OTctPmJ1Y2sxMjVfZ3Bpb2luZGV4KSA+PiAxKSAmIDB4MTsKIAlpbnQgc2V0MSA9ICgobWF4ODk5Ny0+YnVjazEyNV9ncGlvaW5kZXgpID4+IDIpICYgMHgxOwogCi0JZ3Bpb19zZXRfdmFsdWUocGRhdGEtPmJ1Y2sxMjVfZ3Bpb3NbMF0sIHNldDEpOwotCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLT5idWNrMTI1X2dwaW9zWzFdLCBzZXQyKTsKLQlncGlvX3NldF92YWx1ZShwZGF0YS0+YnVjazEyNV9ncGlvc1syXSwgc2V0Myk7CisJZ3Bpb19zZXRfdmFsdWUobWF4ODk5Ny0+YnVjazEyNV9ncGlvc1swXSwgc2V0MSk7CisJZ3Bpb19zZXRfdmFsdWUobWF4ODk5Ny0+YnVjazEyNV9ncGlvc1sxXSwgc2V0Mik7CisJZ3Bpb19zZXRfdmFsdWUobWF4ODk5Ny0+YnVjazEyNV9ncGlvc1syXSwgc2V0Myk7CiB9CiAKIHN0cnVjdCB2b2x0YWdlX21hcF9kZXNjIHsKQEAgLTM4MCw4ICszODMsNiBAQAogc3RhdGljIGludCBtYXg4OTk3X2dldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewogCXN0cnVjdCBtYXg4OTk3X2RhdGEgKm1heDg5OTcgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwotCXN0cnVjdCBtYXg4OTk3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KLQkJZGV2X2dldF9wbGF0ZGF0YShtYXg4OTk3LT5pb2Rldi0+ZGV2KTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gbWF4ODk5Ny0+aW9kZXYtPmkyYzsKIAlpbnQgcmVnLCBzaGlmdCwgbWFzaywgcmV0OwogCWludCByaWQgPSBtYXg4OTk3X2dldF9yaWQocmRldik7CkBAIC0zOTEsOSArMzkyLDkgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKChyaWQgPT0gTUFYODk5N19CVUNLMSAmJiBwZGF0YS0+YnVjazFfZ3Bpb2R2cykgfHwKLQkJCShyaWQgPT0gTUFYODk5N19CVUNLMiAmJiBwZGF0YS0+YnVjazJfZ3Bpb2R2cykgfHwKLQkJCShyaWQgPT0gTUFYODk5N19CVUNLNSAmJiBwZGF0YS0+YnVjazVfZ3Bpb2R2cykpCisJaWYgKChyaWQgPT0gTUFYODk5N19CVUNLMSAmJiBtYXg4OTk3LT5idWNrMV9ncGlvZHZzKSB8fAorCQkJKHJpZCA9PSBNQVg4OTk3X0JVQ0syICYmIG1heDg5OTctPmJ1Y2syX2dwaW9kdnMpIHx8CisJCQkocmlkID09IE1BWDg5OTdfQlVDSzUgJiYgbWF4ODk5Ny0+YnVjazVfZ3Bpb2R2cykpCiAJCXJlZyArPSBtYXg4OTk3LT5idWNrMTI1X2dwaW9pbmRleDsKIAogCXJldCA9IG1heDg5OTdfcmVhZF9yZWcoaTJjLCByZWcsICZ2YWwpOwpAQCAtNTQzLDcgKzU0NCw4IEBACiAJCQlyaWQgPT0gTUFYODk5N19CVUNLNCB8fCByaWQgPT0gTUFYODk5N19CVUNLNSkgewogCQkvKiBJZiB0aGUgdm9sdGFnZSBpcyBpbmNyZWFzaW5nICovCiAJCWlmIChvcmcgPCBpKQotCQkJdWRlbGF5KGRlc2MtPnN0ZXAgKiAoaSAtIG9yZykgLyBtYXg4OTk3LT5yYW1wX2RlbGF5KTsKKwkJCXVkZWxheShESVZfUk9VTkRfVVAoZGVzYy0+c3RlcCAqIChpIC0gb3JnKSwKKwkJCQkJCW1heDg5OTctPnJhbXBfZGVsYXkpKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNTYxLDggKzU2Myw2IEBACiAJCXU4IG5ld192YWwsIGludCAqYmVzdCkKIHsKIAlzdHJ1Y3QgbWF4ODk5N19kYXRhICptYXg4OTk3ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlzdHJ1Y3QgbWF4ODk5N19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9Ci0JCWRldl9nZXRfcGxhdGRhdGEobWF4ODk5Ny0+aW9kZXYtPmRldik7CiAJaW50IHJpZCA9IG1heDg5OTdfZ2V0X3JpZChyZGV2KTsKIAl1OCAqYnVja3hfdmFsWzNdOwogCWJvb2wgYnVja3hfZ3Bpb2R2c1szXTsKQEAgLTU4OSw5ICs1ODksOSBAQAogCWJ1Y2t4X3ZhbFswXSA9IG1heDg5OTctPmJ1Y2sxX3ZvbDsKIAlidWNreF92YWxbMV0gPSBtYXg4OTk3LT5idWNrMl92b2w7CiAJYnVja3hfdmFsWzJdID0gbWF4ODk5Ny0+YnVjazVfdm9sOwotCWJ1Y2t4X2dwaW9kdnNbMF0gPSBwZGF0YS0+YnVjazFfZ3Bpb2R2czsKLQlidWNreF9ncGlvZHZzWzFdID0gcGRhdGEtPmJ1Y2syX2dwaW9kdnM7Ci0JYnVja3hfZ3Bpb2R2c1syXSA9IHBkYXRhLT5idWNrNV9ncGlvZHZzOworCWJ1Y2t4X2dwaW9kdnNbMF0gPSBtYXg4OTk3LT5idWNrMV9ncGlvZHZzOworCWJ1Y2t4X2dwaW9kdnNbMV0gPSBtYXg4OTk3LT5idWNrMl9ncGlvZHZzOworCWJ1Y2t4X2dwaW9kdnNbMl0gPSBtYXg4OTk3LT5idWNrNV9ncGlvZHZzOwogCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogCQlpbnQgb3RoZXJzOwpAQCAtNjQwLDggKzY0MCw2IEBACiAJCWludCBtaW5fdVYsIGludCBtYXhfdVYsIHVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3QgbWF4ODk5N19kYXRhICptYXg4OTk3ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlzdHJ1Y3QgbWF4ODk5N19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9Ci0JCWRldl9nZXRfcGxhdGRhdGEobWF4ODk5Ny0+aW9kZXYtPmRldik7CiAJaW50IHJpZCA9IG1heDg5OTdfZ2V0X3JpZChyZGV2KTsKIAljb25zdCBzdHJ1Y3Qgdm9sdGFnZV9tYXBfZGVzYyAqZGVzYzsKIAlpbnQgbmV3X3ZhbCwgbmV3X2lkeCwgZGFtYWdlLCB0bXBfdmFsLCB0bXBfaWR4LCB0bXBfZG1nOwpAQCAtNjUzLDE1ICs2NTEsMTUgQEAKIAogCXN3aXRjaCAocmlkKSB7CiAJY2FzZSBNQVg4OTk3X0JVQ0sxOgotCQlpZiAocGRhdGEtPmJ1Y2sxX2dwaW9kdnMpCisJCWlmIChtYXg4OTk3LT5idWNrMV9ncGlvZHZzKQogCQkJZ3Bpb19kdnNfbW9kZSA9IHRydWU7CiAJCWJyZWFrOwogCWNhc2UgTUFYODk5N19CVUNLMjoKLQkJaWYgKHBkYXRhLT5idWNrMl9ncGlvZHZzKQorCQlpZiAobWF4ODk5Ny0+YnVjazJfZ3Bpb2R2cykKIAkJCWdwaW9fZHZzX21vZGUgPSB0cnVlOwogCQlicmVhazsKIAljYXNlIE1BWDg5OTdfQlVDSzU6Ci0JCWlmIChwZGF0YS0+YnVjazVfZ3Bpb2R2cykKKwkJaWYgKG1heDg5OTctPmJ1Y2s1X2dwaW9kdnMpCiAJCQlncGlvX2R2c19tb2RlID0gdHJ1ZTsKIAkJYnJlYWs7CiAJfQpAQCAtNjk1LDcgKzY5Myw3IEBACiAJbmV3X2lkeCA9IHRtcF9pZHg7CiAJbmV3X3ZhbCA9IHRtcF92YWw7CiAKLQlpZiAocGRhdGEtPmlnbm9yZV9ncGlvZHZzX3NpZGVfZWZmZWN0ID09IGZhbHNlKQorCWlmIChtYXg4OTk3LT5pZ25vcmVfZ3Bpb2R2c19zaWRlX2VmZmVjdCA9PSBmYWxzZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkZXZfd2FybigmcmRldi0+ZGV2LCAiTUFYODk5NyBHUElPLURWUyBTaWRlIEVmZmVjdCBXYXJuaW5nOiBHUElPIFNFVDoiCkBAIC05OTMsNiArOTkxLDExIEBACiAJaTJjID0gbWF4ODk5Ny0+aW9kZXYtPmkyYzsKIAogCW1heDg5OTctPmJ1Y2sxMjVfZ3Bpb2luZGV4ID0gcGRhdGEtPmJ1Y2sxMjVfZGVmYXVsdF9pZHg7CisJbWF4ODk5Ny0+YnVjazFfZ3Bpb2R2cyA9IHBkYXRhLT5idWNrMV9ncGlvZHZzOworCW1heDg5OTctPmJ1Y2syX2dwaW9kdnMgPSBwZGF0YS0+YnVjazJfZ3Bpb2R2czsKKwltYXg4OTk3LT5idWNrNV9ncGlvZHZzID0gcGRhdGEtPmJ1Y2s1X2dwaW9kdnM7CisJbWVtY3B5KG1heDg5OTctPmJ1Y2sxMjVfZ3Bpb3MsIHBkYXRhLT5idWNrMTI1X2dwaW9zLCBzaXplb2YoaW50KSAqIDMpOworCW1heDg5OTctPmlnbm9yZV9ncGlvZHZzX3NpZGVfZWZmZWN0ID0gcGRhdGEtPmlnbm9yZV9ncGlvZHZzX3NpZGVfZWZmZWN0OwogCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogCQltYXg4OTk3LT5idWNrMV92b2xbaV0gPSByZXQgPQpAQCAtMTEyNCw2ICsxMTI3LDEwIEBACiAJCQkJMHgzZik7CiAJfQogCisJLyogTWlzYyBTZXR0aW5ncyAqLworCW1heDg5OTctPnJhbXBfZGVsYXkgPSAxMDsgLyogc2V0IDEwbVYvdXMsIHdoaWNoIGlzIHRoZSBkZWZhdWx0ICovCisJbWF4ODk5N193cml0ZV9yZWcoaTJjLCBNQVg4OTk3X1JFR19CVUNLUkFNUCwgKDB4ZiA8PCA0KSB8IDB4OSk7CisKIAlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9yZWd1bGF0b3JzOyBpKyspIHsKIAkJY29uc3Qgc3RydWN0IHZvbHRhZ2VfbWFwX2Rlc2MgKmRlc2M7CiAJCWludCBpZCA9IHBkYXRhLT5yZWd1bGF0b3JzW2ldLmlkOwpAQCAtMTE0OCwxMCArMTE1NSw2IEBACiAJCX0KIAl9CiAKLQkvKiBNaXNjIFNldHRpbmdzICovCi0JbWF4ODk5Ny0+cmFtcF9kZWxheSA9IDEwOyAvKiBzZXQgMTBtVi91cywgd2hpY2ggaXMgdGhlIGRlZmF1bHQgKi8KLQltYXg4OTk3X3dyaXRlX3JlZyhpMmMsIE1BWDg5OTdfUkVHX0JVQ0tSQU1QLCAoMHhmIDw8IDQpIHwgMHg5KTsKLQogCXJldHVybiAwOwogZXJyOgogCWZvciAoaSA9IDA7IGkgPCBtYXg4OTk3LT5udW1fcmVndWxhdG9yczsgaSsrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwMjMtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTAyMy1yZWd1bGF0b3IuYwppbmRleCBmYmRkYzE1Li43MDFhNTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTAyMy1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTAyMy1yZWd1bGF0b3IuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogCiAvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLwogI2RlZmluZQlUUFM2NTAyM19SRUdfVkVSU0lPTgkJMApAQCAtMTI1LDkzICsxMjYsMzUgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2W1RQUzY1MDIzX05VTV9SRUdVTEFUT1JdOwogCWNvbnN0IHN0cnVjdCB0cHNfaW5mbyAqaW5mb1tUUFM2NTAyM19OVU1fUkVHVUxBVE9SXTsKLQlzdHJ1Y3QgbXV0ZXggaW9fbG9jazsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludCB0cHNfNjUwMjNfcmVhZChzdHJ1Y3QgdHBzX3BtaWMgKnRwcywgdTggcmVnKQotewotCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEodHBzLT5jbGllbnQsIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRwc182NTAyM193cml0ZShzdHJ1Y3QgdHBzX3BtaWMgKnRwcywgdTggcmVnLCB1OCB2YWwpCi17Ci0JcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEodHBzLT5jbGllbnQsIHJlZywgdmFsKTsKLX0KLQogc3RhdGljIGludCB0cHNfNjUwMjNfc2V0X2JpdHMoc3RydWN0IHRwc19wbWljICp0cHMsIHU4IHJlZywgdTggbWFzaykKIHsKLQlpbnQgZXJyLCBkYXRhOwotCi0JbXV0ZXhfbG9jaygmdHBzLT5pb19sb2NrKTsKLQotCWRhdGEgPSB0cHNfNjUwMjNfcmVhZCh0cHMsIHJlZyk7Ci0JaWYgKGRhdGEgPCAwKSB7Ci0JCWRldl9lcnIoJnRwcy0+Y2xpZW50LT5kZXYsICJSZWFkIGZyb20gcmVnIDB4JXggZmFpbGVkXG4iLCByZWcpOwotCQllcnIgPSBkYXRhOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlkYXRhIHw9IG1hc2s7Ci0JZXJyID0gdHBzXzY1MDIzX3dyaXRlKHRwcywgcmVnLCBkYXRhKTsKLQlpZiAoZXJyKQotCQlkZXZfZXJyKCZ0cHMtPmNsaWVudC0+ZGV2LCAiV3JpdGUgZm9yIHJlZyAweCV4IGZhaWxlZFxuIiwgcmVnKTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmdHBzLT5pb19sb2NrKTsKLQlyZXR1cm4gZXJyOworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHModHBzLT5yZWdtYXAsIHJlZywgbWFzaywgbWFzayk7CiB9CiAKIHN0YXRpYyBpbnQgdHBzXzY1MDIzX2NsZWFyX2JpdHMoc3RydWN0IHRwc19wbWljICp0cHMsIHU4IHJlZywgdTggbWFzaykKIHsKLQlpbnQgZXJyLCBkYXRhOwotCi0JbXV0ZXhfbG9jaygmdHBzLT5pb19sb2NrKTsKLQotCWRhdGEgPSB0cHNfNjUwMjNfcmVhZCh0cHMsIHJlZyk7Ci0JaWYgKGRhdGEgPCAwKSB7Ci0JCWRldl9lcnIoJnRwcy0+Y2xpZW50LT5kZXYsICJSZWFkIGZyb20gcmVnIDB4JXggZmFpbGVkXG4iLCByZWcpOwotCQllcnIgPSBkYXRhOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlkYXRhICY9IH5tYXNrOwotCi0JZXJyID0gdHBzXzY1MDIzX3dyaXRlKHRwcywgcmVnLCBkYXRhKTsKLQlpZiAoZXJyKQotCQlkZXZfZXJyKCZ0cHMtPmNsaWVudC0+ZGV2LCAiV3JpdGUgZm9yIHJlZyAweCV4IGZhaWxlZFxuIiwgcmVnKTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmdHBzLT5pb19sb2NrKTsKLQlyZXR1cm4gZXJyOwotCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyh0cHMtPnJlZ21hcCwgcmVnLCBtYXNrLCAwKTsKIH0KIAogc3RhdGljIGludCB0cHNfNjUwMjNfcmVnX3JlYWQoc3RydWN0IHRwc19wbWljICp0cHMsIHU4IHJlZykKIHsKLQlpbnQgZGF0YTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZ0cHMtPmlvX2xvY2spOworCXJldCA9IHJlZ21hcF9yZWFkKHRwcy0+cmVnbWFwLCByZWcsICZ2YWwpOwogCi0JZGF0YSA9IHRwc182NTAyM19yZWFkKHRwcywgcmVnKTsKLQlpZiAoZGF0YSA8IDApCi0JCWRldl9lcnIoJnRwcy0+Y2xpZW50LT5kZXYsICJSZWFkIGZyb20gcmVnIDB4JXggZmFpbGVkXG4iLCByZWcpOwotCi0JbXV0ZXhfdW5sb2NrKCZ0cHMtPmlvX2xvY2spOwotCXJldHVybiBkYXRhOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiB2YWw7CiB9CiAKIHN0YXRpYyBpbnQgdHBzXzY1MDIzX3JlZ193cml0ZShzdHJ1Y3QgdHBzX3BtaWMgKnRwcywgdTggcmVnLCB1OCB2YWwpCiB7Ci0JaW50IGVycjsKLQotCW11dGV4X2xvY2soJnRwcy0+aW9fbG9jayk7Ci0KLQllcnIgPSB0cHNfNjUwMjNfd3JpdGUodHBzLCByZWcsIHZhbCk7Ci0JaWYgKGVyciA8IDApCi0JCWRldl9lcnIoJnRwcy0+Y2xpZW50LT5kZXYsICJXcml0ZSBmb3IgcmVnIDB4JXggZmFpbGVkXG4iLCByZWcpOwotCi0JbXV0ZXhfdW5sb2NrKCZ0cHMtPmlvX2xvY2spOwotCXJldHVybiBlcnI7CisJcmV0dXJuIHJlZ21hcF93cml0ZSh0cHMtPnJlZ21hcCwgcmVnLCB2YWwpOwogfQogCiBzdGF0aWMgaW50IHRwczY1MDIzX2RjZGNfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQpAQCAtNDYzLDYgKzQwNiwxMSBAQAogCS5saXN0X3ZvbHRhZ2UgPSB0cHM2NTAyM19sZG9fbGlzdF92b2x0YWdlLAogfTsKIAorc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIHRwczY1MDIzX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgdHBzXzY1MDIzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC00ODgsNyArNDM2LDEzIEBACiAJaWYgKCF0cHMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbXV0ZXhfaW5pdCgmdHBzLT5pb19sb2NrKTsKKwl0cHMtPnJlZ21hcCA9IHJlZ21hcF9pbml0X2kyYyhjbGllbnQsICZ0cHM2NTAyM19yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKHRwcy0+cmVnbWFwKSkgeworCQllcnJvciA9IFBUUl9FUlIodHBzLT5yZWdtYXApOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXA6ICVkXG4iLAorCQkJZXJyb3IpOworCQlnb3RvIGZhaWxfYWxsb2M7CisJfQogCiAJLyogY29tbW9uIGZvciBhbGwgcmVndWxhdG9ycyAqLwogCXRwcy0+Y2xpZW50ID0gY2xpZW50OwpAQCAtNTI3LDYgKzQ4MSw4IEBACiAJd2hpbGUgKC0taSA+PSAwKQogCQlyZWd1bGF0b3JfdW5yZWdpc3Rlcih0cHMtPnJkZXZbaV0pOwogCisJcmVnbWFwX2V4aXQodHBzLT5yZWdtYXApOworIGZhaWxfYWxsb2M6CiAJa2ZyZWUodHBzKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC01NDUsNiArNTAxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgVFBTNjUwMjNfTlVNX1JFR1VMQVRPUjsgaSsrKQogCQlyZWd1bGF0b3JfdW5yZWdpc3Rlcih0cHMtPnJkZXZbaV0pOwogCisJcmVnbWFwX2V4aXQodHBzLT5yZWdtYXApOwogCWtmcmVlKHRwcyk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IGY4MjJlMTMuLjVhNTM4ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtOTgxLDExICs5ODEsMTEgQEAKIAogCiBjb25maWcgUlRDX0RSVl9TVE1QCi0JdHJpc3RhdGUgIkZyZWVzY2FsZSBTVE1QM3h4eCBSVEMiCi0JZGVwZW5kcyBvbiBBUkNIX1NUTVAzWFhYCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBTVE1QM3h4eC9pLk1YMjMvaS5NWDI4IFJUQyIKKwlkZXBlbmRzIG9uIEFSQ0hfTVhTCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlIG9uYm9hcmQKLQkgIFNUTVAzeHh4IFJUQy4KKwkgIFNUTVAzeHh4L2kuTVgyMy9pLk1YMjggUlRDLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1zdG1wM3h4eC4KQEAgLTEwMDYsMTAgKzEwMDYsMTAgQEAKIAogY29uZmlnIFJUQ19EUlZfTVBDNTEyMQogCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBDNTEyMSBidWlsdC1pbiBSVEMiCi0JZGVwZW5kcyBvbiBQUENfTVBDNTEyeCAmJiBSVENfQ0xBU1MKKwlkZXBlbmRzIG9uIFBQQ19NUEM1MTJ4IHx8IFBQQ19NUEM1Mnh4CiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCi0JICBidWlsdC1pbiBSVEMgTVBDNTEyMS4KKwkgIGJ1aWx0LWluIFJUQyBvbiBNUEM1MTIxIG9yIG9uIE1QQzUyMDAuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW1wYzUxMjEuCkBAIC0xMDM0LDYgKzEwMzQsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWxsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1scGMzMnh4LgogCitjb25maWcgUlRDX0RSVl9QTThYWFgKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gUE1JQzhYWFggUlRDIgorCWRlcGVuZHMgb24gTUZEX1BNOFhYWAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIFF1YWxjb21tIFBNSUM4WFhYIFJUQy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcnRjLXBtOHh4eC4KKwogY29uZmlnIFJUQ19EUlZfVEVHUkEKIAl0cmlzdGF0ZSAiTlZJRElBIFRlZ3JhIEludGVybmFsIFJUQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgQVJDSF9URUdSQQpAQCAtMTA1MSw0ICsxMDYxLDEzIEBACiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIExpbnV4IGRyaXZlciBzaWRlIG9mIHRoZSBUaWxlcmEKIAkgIGh5cGVydmlzb3IncyByZWFsLXRpbWUgY2xvY2sgaW50ZXJmYWNlLgogCitjb25maWcgUlRDX0RSVl9QVVYzCisJdHJpc3RhdGUgIlBLVW5pdHkgdjMgUlRDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX1BVVjMKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFJUQyBpbiB0aGUgUEtVbml0eS12MyBTb0NzLgorCisJICBUaGlzIGRyaXZlIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXB1djMuCisKIGVuZGlmICMgUlRDX0NMQVNTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZSBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCmluZGV4IDIxM2Q3MjUuLjZlNjk4MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC03Nyw3ICs3Nyw5IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9QQ0Y1MDYzMykJKz0gcnRjLXBjZjUwNjMzLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1BMMDMwKQkrPSBydGMtcGwwMzAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUEwwMzEpCSs9IHJ0Yy1wbDAzMS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9QTThYWFgpCSs9IHJ0Yy1wbTh4eHgubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUFMzKQkrPSBydGMtcHMzLm8KK29iai0kKENPTkZJR19SVENfRFJWX1BVVjMpCSs9IHJ0Yy1wdXYzLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1BYQSkJKz0gcnRjLXB4YS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SOTcwMSkJKz0gcnRjLXI5NzAxLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1JQNUMwMSkJKz0gcnRjLXJwNWMwMS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9jbGFzcy5jIGIvZHJpdmVycy9ydGMvY2xhc3MuYwppbmRleCA0MTk0ZTU5Li4wMWE3ZGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9jbGFzcy5jCisrKyBiL2RyaXZlcnMvcnRjL2NsYXNzLmMKQEAgLTQxLDIwICs0MSw0MSBAQAogICogc3lzdGVtJ3Mgd2FsbCBjbG9jazsgcmVzdG9yZSBpdCBvbiByZXN1bWUoKS4KICAqLwogCi1zdGF0aWMgdGltZV90CQlvbGR0aW1lOwotc3RhdGljIHN0cnVjdCB0aW1lc3BlYwlvbGR0czsKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgb2xkX3J0Yywgb2xkX3N5c3RlbSwgb2xkX2RlbHRhOworCiAKIHN0YXRpYyBpbnQgcnRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKIHsKIAlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjID0gdG9fcnRjX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfdGltZQkJdG07Ci0KKwlzdHJ1Y3QgdGltZXNwZWMJCWRlbHRhLCBkZWx0YV9kZWx0YTsKIAlpZiAoc3RyY21wKGRldl9uYW1lKCZydGMtPmRldiksIENPTkZJR19SVENfSENUT1NZU19ERVZJQ0UpICE9IDApCiAJCXJldHVybiAwOwogCisJLyogc25hcHNob3QgdGhlIGN1cnJlbnQgUlRDIGFuZCBzeXN0ZW0gdGltZSBhdCBzdXNwZW5kKi8KIAlydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKLQlrdGltZV9nZXRfdHMoJm9sZHRzKTsKLQlydGNfdG1fdG9fdGltZSgmdG0sICZvbGR0aW1lKTsKKwlnZXRuc3RpbWVvZmRheSgmb2xkX3N5c3RlbSk7CisJcnRjX3RtX3RvX3RpbWUoJnRtLCAmb2xkX3J0Yy50dl9zZWMpOworCisKKwkvKgorCSAqIFRvIGF2b2lkIGRyaWZ0IGNhdXNlZCBieSByZXBlYXRlZCBzdXNwZW5kL3Jlc3VtZXMsCisJICogd2hpY2ggZWFjaCBjYW4gYWRkIH4xIHNlY29uZCBkcmlmdCBlcnJvciwKKwkgKiB0cnkgdG8gY29tcGVuc2F0ZSBzbyB0aGUgZGlmZmVyZW5jZSBpbiBzeXN0ZW0gdGltZQorCSAqIGFuZCBydGMgdGltZSBzdGF5cyBjbG9zZSB0byBjb25zdGFudC4KKwkgKi8KKwlkZWx0YSA9IHRpbWVzcGVjX3N1YihvbGRfc3lzdGVtLCBvbGRfcnRjKTsKKwlkZWx0YV9kZWx0YSA9IHRpbWVzcGVjX3N1YihkZWx0YSwgb2xkX2RlbHRhKTsKKwlpZiAoYWJzKGRlbHRhX2RlbHRhLnR2X3NlYykgID49IDIpIHsKKwkJLyoKKwkJICogaWYgZGVsdGFfZGVsdGEgaXMgdG9vIGxhcmdlLCBhc3N1bWUgdGltZSBjb3JyZWN0aW9uCisJCSAqIGhhcyBvY2N1cmVkIGFuZCBzZXQgb2xkX2RlbHRhIHRvIHRoZSBjdXJyZW50IGRlbHRhLgorCQkgKi8KKwkJb2xkX2RlbHRhID0gZGVsdGE7CisJfSBlbHNlIHsKKwkJLyogT3RoZXJ3aXNlIHRyeSB0byBhZGp1c3Qgb2xkX3N5c3RlbSB0byBjb21wZW5zYXRlICovCisJCW9sZF9zeXN0ZW0gPSB0aW1lc3BlY19zdWIob2xkX3N5c3RlbSwgZGVsdGFfZGVsdGEpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtNjMsMzIgKzg0LDQyIEBACiB7CiAJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YyA9IHRvX3J0Y19kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3RpbWUJCXRtOwotCXRpbWVfdAkJCW5ld3RpbWU7Ci0Jc3RydWN0IHRpbWVzcGVjCQl0aW1lOwotCXN0cnVjdCB0aW1lc3BlYwkJbmV3dHM7CisJc3RydWN0IHRpbWVzcGVjCQluZXdfc3lzdGVtLCBuZXdfcnRjOworCXN0cnVjdCB0aW1lc3BlYwkJc2xlZXBfdGltZTsKIAogCWlmIChzdHJjbXAoZGV2X25hbWUoJnJ0Yy0+ZGV2KSwgQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSkgIT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlrdGltZV9nZXRfdHMoJm5ld3RzKTsKKwkvKiBzbmFwc2hvdCB0aGUgY3VycmVudCBydGMgYW5kIHN5c3RlbSB0aW1lIGF0IHJlc3VtZSAqLworCWdldG5zdGltZW9mZGF5KCZuZXdfc3lzdGVtKTsKIAlydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKIAlpZiAocnRjX3ZhbGlkX3RtKCZ0bSkgIT0gMCkgewogCQlwcl9kZWJ1ZygiJXM6ICBib2d1cyByZXN1bWUgdGltZVxuIiwgZGV2X25hbWUoJnJ0Yy0+ZGV2KSk7CiAJCXJldHVybiAwOwogCX0KLQlydGNfdG1fdG9fdGltZSgmdG0sICZuZXd0aW1lKTsKLQlpZiAobmV3dGltZSA8PSBvbGR0aW1lKSB7Ci0JCWlmIChuZXd0aW1lIDwgb2xkdGltZSkKKwlydGNfdG1fdG9fdGltZSgmdG0sICZuZXdfcnRjLnR2X3NlYyk7CisJbmV3X3J0Yy50dl9uc2VjID0gMDsKKworCWlmIChuZXdfcnRjLnR2X3NlYyA8PSBvbGRfcnRjLnR2X3NlYykgeworCQlpZiAobmV3X3J0Yy50dl9zZWMgPCBvbGRfcnRjLnR2X3NlYykKIAkJCXByX2RlYnVnKCIlczogIHRpbWUgdHJhdmVsIVxuIiwgZGV2X25hbWUoJnJ0Yy0+ZGV2KSk7CiAJCXJldHVybiAwOwogCX0KLQkvKiBjYWxjdWxhdGUgdGhlIFJUQyB0aW1lIGRlbHRhICovCi0Jc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnRpbWUsIG5ld3RpbWUgLSBvbGR0aW1lLCAwKTsKIAotCS8qIHN1YnRyYWN0IGtlcm5lbCB0aW1lIGJldHdlZW4gcnRjX3N1c3BlbmQgdG8gcnRjX3Jlc3VtZSAqLwotCXRpbWUgPSB0aW1lc3BlY19zdWIodGltZSwgdGltZXNwZWNfc3ViKG5ld3RzLCBvbGR0cykpOworCS8qIGNhbGN1bGF0ZSB0aGUgUlRDIHRpbWUgZGVsdGEgKHNsZWVwIHRpbWUpKi8KKwlzbGVlcF90aW1lID0gdGltZXNwZWNfc3ViKG5ld19ydGMsIG9sZF9ydGMpOwogCi0JdGltZWtlZXBpbmdfaW5qZWN0X3NsZWVwdGltZSgmdGltZSk7CisJLyoKKwkgKiBTaW5jZSB0aGVzZSBSVEMgc3VzcGVuZC9yZXN1bWUgaGFuZGxlcnMgYXJlIG5vdCBjYWxsZWQKKwkgKiBhdCB0aGUgdmVyeSBlbmQgb2Ygc3VzcGVuZCBvciB0aGUgc3RhcnQgb2YgcmVzdW1lLAorCSAqIHNvbWUgcnVuLXRpbWUgbWF5IHBhc3Mgb24gZWl0aGVyIHNpZGVzIG9mIHRoZSBzbGVlcCB0aW1lCisJICogc28gc3VidHJhY3Qga2VybmVsIHJ1bi10aW1lIGJldHdlZW4gcnRjX3N1c3BlbmQgdG8gcnRjX3Jlc3VtZQorCSAqIHRvIGtlZXAgdGhpbmdzIGFjY3VyYXRlLgorCSAqLworCXNsZWVwX3RpbWUgPSB0aW1lc3BlY19zdWIoc2xlZXBfdGltZSwKKwkJCXRpbWVzcGVjX3N1YihuZXdfc3lzdGVtLCBvbGRfc3lzdGVtKSk7CisKKwl0aW1la2VlcGluZ19pbmplY3Rfc2xlZXB0aW1lKCZzbGVlcF90aW1lKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwppbmRleCBlZjYzMTZhLi5kZjY4NjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwpAQCAtMzE4LDcgKzMxOCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfcmVhZF9hbGFybSk7CiAKLWludCBfX3J0Y19zZXRfYWxhcm0oc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQorc3RhdGljIGludCBfX3J0Y19zZXRfYWxhcm0oc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQogewogCXN0cnVjdCBydGNfdGltZSB0bTsKIAlsb25nIG5vdywgc2NoZWR1bGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDMyYXA3MDB4LmMKaW5kZXggZTcyNWQ1MS4uOGRkMDgzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtYXQzMmFwNzAweC5jCkBAIC0yMjMsNyArMjIzLDcgQEAKIAl9CiAKIAlydGMtPmlycSA9IGlycTsKLQlydGMtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCXJ0Yy0+cmVncyA9IGlvcmVtYXAocmVncy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVncykpOwogCWlmICghcnRjLT5yZWdzKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBtYXAgSS9PIG1lbW9yeVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jIGIvZHJpdmVycy9ydGMvcnRjLWNtb3MuYwppbmRleCA5MTFlNzVjLi4wNWJlYjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMKQEAgLTYwNiw3ICs2MDYsNyBAQAogCSAqIChuZWVkaW5nIGlvcmVtYXAgZXRjKSwgbm90IGkvbyBzcGFjZSByZXNvdXJjZXMgbGlrZSB0aGlzIC4uLgogCSAqLwogCXBvcnRzID0gcmVxdWVzdF9yZWdpb24ocG9ydHMtPnN0YXJ0LAotCQkJcG9ydHMtPmVuZCArIDEgLSBwb3J0cy0+c3RhcnQsCisJCQlyZXNvdXJjZV9zaXplKHBvcnRzKSwKIAkJCWRyaXZlcl9uYW1lKTsKIAlpZiAoIXBvcnRzKSB7CiAJCWRldl9kYmcoZGV2LCAiaS9vIHJlZ2lzdGVycyBhbHJlYWR5IGluIHVzZVxuIik7CkBAIC03NTAsNyArNzUwLDcgQEAKIAljbW9zX3J0Yy5kZXYgPSBOVUxMOwogCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihjbW9zX3J0Yy5ydGMpOwogY2xlYW51cDA6Ci0JcmVsZWFzZV9yZWdpb24ocG9ydHMtPnN0YXJ0LCBwb3J0cy0+ZW5kICsgMSAtIHBvcnRzLT5zdGFydCk7CisJcmVsZWFzZV9yZWdpb24ocG9ydHMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHBvcnRzKSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNzc5LDcgKzc3OSw3IEBACiAJY21vcy0+cnRjID0gTlVMTDsKIAogCXBvcnRzID0gY21vcy0+aW9tZW07Ci0JcmVsZWFzZV9yZWdpb24ocG9ydHMtPnN0YXJ0LCBwb3J0cy0+ZW5kICsgMSAtIHBvcnRzLT5zdGFydCk7CisJcmVsZWFzZV9yZWdpb24ocG9ydHMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHBvcnRzKSk7CiAJY21vcy0+aW9tZW0gPSBOVUxMOwogCiAJY21vcy0+ZGV2ID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwppbmRleCBkMGUwNmVkLi5jYWNlNmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRldi5jCkBAIC00MjEsNyArNDIxLDggQEAKIAkJCWVyciA9IG9wcy0+aW9jdGwocnRjLT5kZXYucGFyZW50LCBjbWQsIGFyZyk7CiAJCQlpZiAoZXJyID09IC1FTk9JT0NUTENNRCkKIAkJCQllcnIgPSAtRU5PVFRZOwotCQl9CisJCX0gZWxzZQorCQkJZXJyID0gLUVOT1RUWTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMjg2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMjg2LmMKaW5kZXggNDdlNjgxZC4uNjhlNmNhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTI4Ni5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEyODYuYwpAQCAtMzQzLDcgKzM0Myw3IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXByaXYtPnNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCXByaXYtPnNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcHJpdi0+c2l6ZSwgcGRldi0+bmFtZSkpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwppbmRleCA0NzI0YmEzLi5iMjAwNWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCkBAIC0xNDksNiArMTQ5LDcgQEAKIAl7ICJkczEzNDAiLCBkc18xMzQwIH0sCiAJeyAiZHMzMjMxIiwgZHNfMzIzMSB9LAogCXsgIm00MXQwMCIsIG00MXQwMCB9LAorCXsgInB0N2M0MzM4IiwgZHNfMTMwNyB9LAogCXsgInJ4ODAyNSIsIHJ4XzgwMjUgfSwKIAl7IH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMKaW5kZXggZmJhYmM3Ny4uNTY4YWQzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwotCXBkYXRhLT5zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlwZGF0YS0+c2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHBkYXRhLT5zaXplLAogCQkJcGRldi0+bmFtZSkpCiAJCXJldHVybiAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNzQyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNzQyLmMKaW5kZXggMDQyNjMwYy4uZDg0YTQ0OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczE3NDIuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNzQyLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQlwZGF0YS0+c2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJcGRhdGEtPnNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCBwZGF0YS0+c2l6ZSwKIAkJcGRldi0+bmFtZSkpCiAJCXJldHVybiAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbTQxdDkzLmMgYi9kcml2ZXJzL3J0Yy9ydGMtbTQxdDkzLmMKaW5kZXggMWE4NGIzZS4uNzMxN2QzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW00MXQ5My5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDF0OTMuYwpAQCAtMTg5LDcgKzE4OSw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IG00MXQ5M19yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAKIAlpZiAocnRjKQogCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tNDh0MzUuYyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDh0MzUuYwppbmRleCA3NDEwODc1Li44ZTJhMjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDM1LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLW00OHQzNS5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcHJpdi0+c2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJcHJpdi0+c2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAkvKgogCSAqIGtsdWRnZTogcmVtb3ZlIHRoZSAjaWZuZGVmIGFmdGVyIGlvYzMgcmVzb3VyY2UKIAkgKiBjb25mbGljdHMgYXJlIHJlc29sdmVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMgYi9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMKaW5kZXggMzk3OGY0Yy4uMjgzNjUzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW00OHQ1OS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDh0NTkuYwpAQCAtNDMzLDcgKzQzMyw3IEBACiAKIAlpZiAoIW00OHQ1OS0+aW9hZGRyKSB7CiAJCS8qIGlvYWRkciBub3QgbWFwcGVkIGV4dGVybmFsbHkgKi8KLQkJbTQ4dDU5LT5pb2FkZHIgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCQltNDh0NTktPmlvYWRkciA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAkJaWYgKCFtNDh0NTktPmlvYWRkcikKIAkJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tcGM1MTIxLmMgYi9kcml2ZXJzL3J0Yy9ydGMtbXBjNTEyMS5jCmluZGV4IDA5Y2NkOGQuLmRhNjA5MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1tcGM1MTIxLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLW1wYzUxMjEuYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgMjAwNywgRG9tZW4gUHVuY2VyIDxkb21lbi5wdW5jZXJAdGVsYXJnby5jb20+CiAgKiBDb3B5cmlnaHQgMjAwOCwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDExLCBEbWl0cnkgRXJlbWluLVNvbGVuaWtvdgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTQ1LDYgKzE0Niw1NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1wYzUyMDBfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IG1wYzUxMjFfcnRjX2RhdGEgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBtcGM1MTIxX3J0Y19yZWdzIF9faW9tZW0gKnJlZ3MgPSBydGMtPnJlZ3M7CisJaW50IHRtcDsKKworCXRtLT50bV9zZWMgPSBpbl84KCZyZWdzLT5zZWNvbmQpOworCXRtLT50bV9taW4gPSBpbl84KCZyZWdzLT5taW51dGUpOworCisJLyogMTIgaG91ciBmb3JtYXQ/ICovCisJaWYgKGluXzgoJnJlZ3MtPmhvdXIpICYgMHgyMCkKKwkJdG0tPnRtX2hvdXIgPSAoaW5fOCgmcmVncy0+aG91cikgPj4gMSkgKworCQkJKGluXzgoJnJlZ3MtPmhvdXIpICYgMSA/IDEyIDogMCk7CisJZWxzZQorCQl0bS0+dG1faG91ciA9IGluXzgoJnJlZ3MtPmhvdXIpOworCisJdG1wID0gaW5fOCgmcmVncy0+d2RheV9tZGF5KTsKKwl0bS0+dG1fbWRheSA9IHRtcCAmIDB4MWY7CisJdG0tPnRtX21vbiA9IGluXzgoJnJlZ3MtPm1vbnRoKSAtIDE7CisJdG0tPnRtX3llYXIgPSBpbl9iZTE2KCZyZWdzLT55ZWFyKSAtIDE5MDA7CisJdG0tPnRtX3dkYXkgPSAodG1wID4+IDUpICUgNzsKKwl0bS0+dG1feWRheSA9IHJ0Y195ZWFyX2RheXModG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyKTsKKwl0bS0+dG1faXNkc3QgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTIwMF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBtcGM1MTIxX3J0Y19kYXRhICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbXBjNTEyMV9ydGNfcmVncyBfX2lvbWVtICpyZWdzID0gcnRjLT5yZWdzOworCisJbXBjNTEyMV9ydGNfdXBkYXRlX3NtaChyZWdzLCB0bSk7CisKKwkvKiBkYXRlICovCisJb3V0XzgoJnJlZ3MtPm1vbnRoX3NldCwgdG0tPnRtX21vbiArIDEpOworCW91dF84KCZyZWdzLT53ZWVrZGF5X3NldCwgdG0tPnRtX3dkYXkgPyB0bS0+dG1fd2RheSA6IDcpOworCW91dF84KCZyZWdzLT5kYXRlX3NldCwgdG0tPnRtX21kYXkpOworCW91dF9iZTE2KCZyZWdzLT55ZWFyX3NldCwgdG0tPnRtX3llYXIgKyAxOTAwKTsKKworCS8qIHNldCBkYXRlIHNlcXVlbmNlICovCisJb3V0XzgoJnJlZ3MtPnNldF9kYXRlLCAweDEpOworCW91dF84KCZyZWdzLT5zZXRfZGF0ZSwgMHgzKTsKKwlvdXRfOCgmcmVncy0+c2V0X2RhdGUsIDB4MSk7CisJb3V0XzgoJnJlZ3MtPnNldF9kYXRlLCAweDApOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbXBjNTEyMV9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKIHsKIAlzdHJ1Y3QgbXBjNTEyMV9ydGNfZGF0YSAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC0yNDgsMTEgKzI5OCwxOCBAQAogCS5hbGFybV9pcnFfZW5hYmxlID0gbXBjNTEyMV9ydGNfYWxhcm1faXJxX2VuYWJsZSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtcGM1MjAwX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZSA9IG1wYzUyMDBfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUgPSBtcGM1MjAwX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybSA9IG1wYzUxMjFfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybSA9IG1wYzUxMjFfcnRjX3NldF9hbGFybSwKKwkuYWxhcm1faXJxX2VuYWJsZSA9IG1wYzUxMjFfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBtcGM1MTIxX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKIHsKIAlzdHJ1Y3QgbXBjNTEyMV9ydGNfZGF0YSAqcnRjOwogCWludCBlcnIgPSAwOwotCXUzMiBrYTsKIAogCXJ0YyA9IGt6YWxsb2Moc2l6ZW9mKCpydGMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJ0YykKQEAgLTI4NywxNSArMzQ0LDIyIEBACiAJCWdvdG8gb3V0X2Rpc3Bvc2UyOwogCX0KIAotCWthID0gaW5fYmUzMigmcnRjLT5yZWdzLT5rZWVwX2FsaXZlKTsKLQlpZiAoa2EgJiAweDAyKSB7Ci0JCWRldl93YXJuKCZvcC0+ZGV2LAotCQkJIm1wYzUxMjEtcnRjOiBCYXR0ZXJ5IG9yIG9zY2lsbGF0b3IgZmFpbHVyZSFcbiIpOwotCQlvdXRfYmUzMigmcnRjLT5yZWdzLT5rZWVwX2FsaXZlLCBrYSk7CisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG9wLT5kZXYub2Zfbm9kZSwgImZzbCxtcGM1MTIxLXJ0YyIpKSB7CisJCXUzMiBrYTsKKwkJa2EgPSBpbl9iZTMyKCZydGMtPnJlZ3MtPmtlZXBfYWxpdmUpOworCQlpZiAoa2EgJiAweDAyKSB7CisJCQlkZXZfd2Fybigmb3AtPmRldiwKKwkJCQkibXBjNTEyMS1ydGM6IEJhdHRlcnkgb3Igb3NjaWxsYXRvciBmYWlsdXJlIVxuIik7CisJCQlvdXRfYmUzMigmcnRjLT5yZWdzLT5rZWVwX2FsaXZlLCBrYSk7CisJCX0KKworCQlydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoIm1wYzUxMjEtcnRjIiwgJm9wLT5kZXYsCisJCQkJCQkmbXBjNTEyMV9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJfSBlbHNlIHsKKwkJcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJtcGM1MjAwLXJ0YyIsICZvcC0+ZGV2LAorCQkJCQkJJm1wYzUyMDBfcnRjX29wcywgVEhJU19NT0RVTEUpOwogCX0KIAotCXJ0Yy0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigibXBjNTEyMS1ydGMiLCAmb3AtPmRldiwKLQkJCQkJJm1wYzUxMjFfcnRjX29wcywgVEhJU19NT0RVTEUpOwogCWlmIChJU19FUlIocnRjLT5ydGMpKSB7CiAJCWVyciA9IFBUUl9FUlIocnRjLT5ydGMpOwogCQlnb3RvIG91dF9mcmVlX2lycTsKQEAgLTM0MCw2ICs0MDQsNyBAQAogCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1MTIxX3J0Y19tYXRjaFtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1ydGMiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtcnRjIiwgfSwKIAl7fSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tcnN0LmMgYi9kcml2ZXJzL3J0Yy9ydGMtbXJzdC5jCmluZGV4IDBjZWM1NjUuLmQzMzU0NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1tcnN0LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLW1yc3QuYwpAQCAtMzMyLDkgKzMzMiw4IEBACiAJaWYgKCFpb21lbSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpb21lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihpb21lbS0+c3RhcnQsCi0JCQlpb21lbS0+ZW5kICsgMSAtIGlvbWVtLT5zdGFydCwKLQkJCWRyaXZlcl9uYW1lKTsKKwlpb21lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihpb21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9tZW0pLAorCQkJCSAgIGRyaXZlcl9uYW1lKTsKIAlpZiAoIWlvbWVtKSB7CiAJCWRldl9kYmcoZGV2LCAiaS9vIG1lbSBhbHJlYWR5IGluIHVzZS5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXBtOHh4eC5jIGIvZHJpdmVycy9ydGMvcnRjLXBtOHh4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MjBlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtcG04eHh4LmMKQEAgLTAsMCArMSw1NTAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC9wbTh4eHgvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9wbTh4eHgvcnRjLmg+CisKKworLyogUlRDIFJlZ2lzdGVyIG9mZnNldHMgZnJvbSBSVEMgQ1RSTCBSRUcgKi8KKyNkZWZpbmUgUE04WFhYX0FMQVJNX0NUUkxfT0ZGU0VUCTB4MDEKKyNkZWZpbmUgUE04WFhYX1JUQ19XUklURV9PRkZTRVQJCTB4MDIKKyNkZWZpbmUgUE04WFhYX1JUQ19SRUFEX09GRlNFVAkJMHgwNgorI2RlZmluZSBQTThYWFhfQUxBUk1fUldfT0ZGU0VUCQkweDBBCisKKy8qIFJUQ19DVFJMIHJlZ2lzdGVyIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgUE04eHh4X1JUQ19FTkFCTEUJCUJJVCg3KQorI2RlZmluZSBQTTh4eHhfUlRDX0FMQVJNX0VOQUJMRQkJQklUKDEpCisjZGVmaW5lIFBNOHh4eF9SVENfQUxBUk1fQ0xFQVIJCUJJVCgwKQorCisjZGVmaW5lIE5VTV84X0JJVF9SVENfUkVHUwkJMHg0CisKKy8qKgorICogc3RydWN0IHBtOHh4eF9ydGMgLSAgcnRjIGRyaXZlciBpbnRlcm5hbCBzdHJ1Y3R1cmUKKyAqIEBydGM6CQlydGMgZGV2aWNlIGZvciB0aGlzIGRyaXZlci4KKyAqIEBydGNfYWxhcm1faXJxOglydGMgYWxhcm0gaXJxIG51bWJlci4KKyAqIEBydGNfYmFzZToJCWFkZHJlc3Mgb2YgcnRjIGNvbnRyb2wgcmVnaXN0ZXIuCisgKiBAcnRjX3JlYWRfYmFzZToJYmFzZSBhZGRyZXNzIG9mIHJlYWQgcmVnaXN0ZXJzLgorICogQHJ0Y193cml0ZV9iYXNlOgliYXNlIGFkZHJlc3Mgb2Ygd3JpdGUgcmVnaXN0ZXJzLgorICogQGFsYXJtX3J3X2Jhc2U6CWJhc2UgYWRkcmVzcyBvZiBhbGFybSByZWdpc3RlcnMuCisgKiBAY3RybF9yZWc6CQlydGMgY29udHJvbCByZWdpc3Rlci4KKyAqIEBydGNfZGV2OgkJZGV2aWNlIHN0cnVjdHVyZS4KKyAqIEBjdHJsX3JlZ19sb2NrOglzcGlubG9jayBwcm90ZWN0aW5nIGFjY2VzcyB0byBjdHJsX3JlZy4KKyAqLworc3RydWN0IHBtOHh4eF9ydGMgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJaW50IHJ0Y19hbGFybV9pcnE7CisJaW50IHJ0Y19iYXNlOworCWludCBydGNfcmVhZF9iYXNlOworCWludCBydGNfd3JpdGVfYmFzZTsKKwlpbnQgYWxhcm1fcndfYmFzZTsKKwl1OCAgY3RybF9yZWc7CisJc3RydWN0IGRldmljZSAqcnRjX2RldjsKKwlzcGlubG9ja190IGN0cmxfcmVnX2xvY2s7Cit9OworCisvKgorICogVGhlIFJUQyByZWdpc3RlcnMgbmVlZCB0byBiZSByZWFkL3dyaXR0ZW4gb25lIGJ5dGUgYXQgYSB0aW1lLiBUaGlzIGlzIGEKKyAqIGhhcmR3YXJlIGxpbWl0YXRpb24uCisgKi8KK3N0YXRpYyBpbnQgcG04eHh4X3JlYWRfd3JhcHBlcihzdHJ1Y3QgcG04eHh4X3J0YyAqcnRjX2RkLCB1OCAqcnRjX3ZhbCwKKwkJaW50IGJhc2UsIGludCBjb3VudCkKK3sKKwlpbnQgaSwgcmM7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gcnRjX2RkLT5ydGNfZGV2LT5wYXJlbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlyYyA9IHBtOHh4eF9yZWFkYihwYXJlbnQsIGJhc2UgKyBpLCAmcnRjX3ZhbFtpXSk7CisJCWlmIChyYyA8IDApIHsKKwkJCWRldl9lcnIocnRjX2RkLT5ydGNfZGV2LCAiUE1JQyByZWFkIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbTh4eHhfd3JpdGVfd3JhcHBlcihzdHJ1Y3QgcG04eHh4X3J0YyAqcnRjX2RkLCB1OCAqcnRjX3ZhbCwKKwkJaW50IGJhc2UsIGludCBjb3VudCkKK3sKKwlpbnQgaSwgcmM7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gcnRjX2RkLT5ydGNfZGV2LT5wYXJlbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlyYyA9IHBtOHh4eF93cml0ZWIocGFyZW50LCBiYXNlICsgaSwgcnRjX3ZhbFtpXSk7CisJCWlmIChyYyA8IDApIHsKKwkJCWRldl9lcnIocnRjX2RkLT5ydGNfZGV2LCAiUE1JQyB3cml0ZSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGVwcyB0byB3cml0ZSB0aGUgUlRDIHJlZ2lzdGVycy4KKyAqIDEuIERpc2FibGUgYWxhcm0gaWYgZW5hYmxlZC4KKyAqIDIuIFdyaXRlIDB4MDAgdG8gTFNCLgorICogMy4gV3JpdGUgQnl0ZVsxXSwgQnl0ZVsyXSwgQnl0ZVszXSB0aGVuIEJ5dGVbMF0uCisgKiA0LiBFbmFibGUgYWxhcm0gaWYgZGlzYWJsZWQgaW4gc3RlcCAxLgorICovCitzdGF0aWMgaW50IHBtOHh4eF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWludCByYywgaTsKKwl1bnNpZ25lZCBsb25nIHNlY3MsIGlycV9mbGFnczsKKwl1OCB2YWx1ZVtOVU1fOF9CSVRfUlRDX1JFR1NdLCByZWcgPSAwLCBhbGFybV9lbmFibGVkID0gMCwgY3RybF9yZWc7CisJc3RydWN0IHBtOHh4eF9ydGMgKnJ0Y19kZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjX3RtX3RvX3RpbWUodG0sICZzZWNzKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fOF9CSVRfUlRDX1JFR1M7IGkrKykgeworCQl2YWx1ZVtpXSA9IHNlY3MgJiAweEZGOworCQlzZWNzID4+PSA4OworCX0KKworCWRldl9kYmcoZGV2LCAiU2Vjb25kcyB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIFJUQyA9ICVsdVxuIiwgc2Vjcyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2RkLT5jdHJsX3JlZ19sb2NrLCBpcnFfZmxhZ3MpOworCWN0cmxfcmVnID0gcnRjX2RkLT5jdHJsX3JlZzsKKworCWlmIChjdHJsX3JlZyAmIFBNOHh4eF9SVENfQUxBUk1fRU5BQkxFKSB7CisJCWFsYXJtX2VuYWJsZWQgPSAxOworCQljdHJsX3JlZyAmPSB+UE04eHh4X1JUQ19BTEFSTV9FTkFCTEU7CisJCXJjID0gcG04eHh4X3dyaXRlX3dyYXBwZXIocnRjX2RkLCAmY3RybF9yZWcsIHJ0Y19kZC0+cnRjX2Jhc2UsCisJCQkJMSk7CisJCWlmIChyYyA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiV3JpdGUgdG8gUlRDIGNvbnRyb2wgcmVnaXN0ZXIgIgorCQkJCQkJCQkiZmFpbGVkXG4iKTsKKwkJCWdvdG8gcnRjX3J3X2ZhaWw7CisJCX0KKwkJcnRjX2RkLT5jdHJsX3JlZyA9IGN0cmxfcmVnOworCX0gZWxzZQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfZGQtPmN0cmxfcmVnX2xvY2ssIGlycV9mbGFncyk7CisKKwkvKiBXcml0ZSAwIHRvIEJ5dGVbMF0gKi8KKwlyZWcgPSAwOworCXJjID0gcG04eHh4X3dyaXRlX3dyYXBwZXIocnRjX2RkLCAmcmVnLCBydGNfZGQtPnJ0Y193cml0ZV9iYXNlLCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiV3JpdGUgdG8gUlRDIHdyaXRlIGRhdGEgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBydGNfcndfZmFpbDsKKwl9CisKKwkvKiBXcml0ZSBCeXRlWzFdLCBCeXRlWzJdLCBCeXRlWzNdICovCisJcmMgPSBwbTh4eHhfd3JpdGVfd3JhcHBlcihydGNfZGQsIHZhbHVlICsgMSwKKwkJCQkJcnRjX2RkLT5ydGNfd3JpdGVfYmFzZSArIDEsIDMpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJXcml0ZSB0byBSVEMgd3JpdGUgZGF0YSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIHJ0Y19yd19mYWlsOworCX0KKworCS8qIFdyaXRlIEJ5dGVbMF0gKi8KKwlyYyA9IHBtOHh4eF93cml0ZV93cmFwcGVyKHJ0Y19kZCwgdmFsdWUsIHJ0Y19kZC0+cnRjX3dyaXRlX2Jhc2UsIDEpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJXcml0ZSB0byBSVEMgd3JpdGUgZGF0YSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIHJ0Y19yd19mYWlsOworCX0KKworCWlmIChhbGFybV9lbmFibGVkKSB7CisJCWN0cmxfcmVnIHw9IFBNOHh4eF9SVENfQUxBUk1fRU5BQkxFOworCQlyYyA9IHBtOHh4eF93cml0ZV93cmFwcGVyKHJ0Y19kZCwgJmN0cmxfcmVnLCBydGNfZGQtPnJ0Y19iYXNlLAorCQkJCQkJCQkJMSk7CisJCWlmIChyYyA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiV3JpdGUgdG8gUlRDIGNvbnRyb2wgcmVnaXN0ZXIgIgorCQkJCQkJCQkiZmFpbGVkXG4iKTsKKwkJCWdvdG8gcnRjX3J3X2ZhaWw7CisJCX0KKwkJcnRjX2RkLT5jdHJsX3JlZyA9IGN0cmxfcmVnOworCX0KKworcnRjX3J3X2ZhaWw6CisJaWYgKGFsYXJtX2VuYWJsZWQpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19kZC0+Y3RybF9yZWdfbG9jaywgaXJxX2ZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwbTh4eHhfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IHJjOworCXU4IHZhbHVlW05VTV84X0JJVF9SVENfUkVHU10sIHJlZzsKKwl1bnNpZ25lZCBsb25nIHNlY3M7CisJc3RydWN0IHBtOHh4eF9ydGMgKnJ0Y19kZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmMgPSBwbTh4eHhfcmVhZF93cmFwcGVyKHJ0Y19kZCwgdmFsdWUsIHJ0Y19kZC0+cnRjX3JlYWRfYmFzZSwKKwkJCQkJCQlOVU1fOF9CSVRfUlRDX1JFR1MpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSVEMgcmVhZCBkYXRhIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKgorCSAqIFJlYWQgdGhlIExTQiBhZ2FpbiBhbmQgY2hlY2sgaWYgdGhlcmUgaGFzIGJlZW4gYSBjYXJyeSBvdmVyLgorCSAqIElmIHRoZXJlIGlzLCByZWRvIHRoZSByZWFkIG9wZXJhdGlvbi4KKwkgKi8KKwlyYyA9IHBtOHh4eF9yZWFkX3dyYXBwZXIocnRjX2RkLCAmcmVnLCBydGNfZGQtPnJ0Y19yZWFkX2Jhc2UsIDEpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSVEMgcmVhZCBkYXRhIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAodW5saWtlbHkocmVnIDwgdmFsdWVbMF0pKSB7CisJCXJjID0gcG04eHh4X3JlYWRfd3JhcHBlcihydGNfZGQsIHZhbHVlLAorCQkJCXJ0Y19kZC0+cnRjX3JlYWRfYmFzZSwgTlVNXzhfQklUX1JUQ19SRUdTKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJZGV2X2VycihkZXYsICJSVEMgcmVhZCBkYXRhIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlzZWNzID0gdmFsdWVbMF0gfCAodmFsdWVbMV0gPDwgOCkgfCAodmFsdWVbMl0gPDwgMTYpIHwgKHZhbHVlWzNdIDw8IDI0KTsKKworCXJ0Y190aW1lX3RvX3RtKHNlY3MsIHRtKTsKKworCXJjID0gcnRjX3ZhbGlkX3RtKHRtKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCB0aW1lIHJlYWQgZnJvbSBSVENcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJZGV2X2RiZyhkZXYsICJzZWNzID0gJWx1LCBoOm06cyA9PSAlZDolZDolZCwgZC9tL3kgPSAlZC8lZC8lZFxuIiwKKwkJCQlzZWNzLCB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYywKKwkJCQl0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG04eHh4X3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJaW50IHJjLCBpOworCXU4IHZhbHVlW05VTV84X0JJVF9SVENfUkVHU10sIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgc2VjcywgaXJxX2ZsYWdzOworCXN0cnVjdCBwbTh4eHhfcnRjICpydGNfZGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0Y190bV90b190aW1lKCZhbGFybS0+dGltZSwgJnNlY3MpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV84X0JJVF9SVENfUkVHUzsgaSsrKSB7CisJCXZhbHVlW2ldID0gc2VjcyAmIDB4RkY7CisJCXNlY3MgPj49IDg7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19kZC0+Y3RybF9yZWdfbG9jaywgaXJxX2ZsYWdzKTsKKworCXJjID0gcG04eHh4X3dyaXRlX3dyYXBwZXIocnRjX2RkLCB2YWx1ZSwgcnRjX2RkLT5hbGFybV9yd19iYXNlLAorCQkJCQkJCU5VTV84X0JJVF9SVENfUkVHUyk7CisJaWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIldyaXRlIHRvIFJUQyBBTEFSTSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIHJ0Y19yd19mYWlsOworCX0KKworCWN0cmxfcmVnID0gcnRjX2RkLT5jdHJsX3JlZzsKKwljdHJsX3JlZyA9IGFsYXJtLT5lbmFibGVkID8gKGN0cmxfcmVnIHwgUE04eHh4X1JUQ19BTEFSTV9FTkFCTEUpIDoKKwkJCQkJKGN0cmxfcmVnICYgflBNOHh4eF9SVENfQUxBUk1fRU5BQkxFKTsKKworCXJjID0gcG04eHh4X3dyaXRlX3dyYXBwZXIocnRjX2RkLCAmY3RybF9yZWcsIHJ0Y19kZC0+cnRjX2Jhc2UsIDEpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJXcml0ZSB0byBSVEMgY29udHJvbCByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIHJ0Y19yd19mYWlsOworCX0KKworCXJ0Y19kZC0+Y3RybF9yZWcgPSBjdHJsX3JlZzsKKworCWRldl9kYmcoZGV2LCAiQWxhcm0gU2V0IGZvciBoOnI6cz0lZDolZDolZCwgZC9tL3k9JWQvJWQvJWRcbiIsCisJCQkJYWxhcm0tPnRpbWUudG1faG91ciwgYWxhcm0tPnRpbWUudG1fbWluLAorCQkJCWFsYXJtLT50aW1lLnRtX3NlYywgYWxhcm0tPnRpbWUudG1fbWRheSwKKwkJCQlhbGFybS0+dGltZS50bV9tb24sIGFsYXJtLT50aW1lLnRtX3llYXIpOworcnRjX3J3X2ZhaWw6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2RkLT5jdHJsX3JlZ19sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwbTh4eHhfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJaW50IHJjOworCXU4IHZhbHVlW05VTV84X0JJVF9SVENfUkVHU107CisJdW5zaWduZWQgbG9uZyBzZWNzOworCXN0cnVjdCBwbTh4eHhfcnRjICpydGNfZGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJjID0gcG04eHh4X3JlYWRfd3JhcHBlcihydGNfZGQsIHZhbHVlLCBydGNfZGQtPmFsYXJtX3J3X2Jhc2UsCisJCQlOVU1fOF9CSVRfUlRDX1JFR1MpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSVEMgYWxhcm0gdGltZSByZWFkIGZhaWxlZFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlzZWNzID0gdmFsdWVbMF0gfCAodmFsdWVbMV0gPDwgOCkgfCAodmFsdWVbMl0gPDwgMTYpIHwgKHZhbHVlWzNdIDw8IDI0KTsKKworCXJ0Y190aW1lX3RvX3RtKHNlY3MsICZhbGFybS0+dGltZSk7CisKKwlyYyA9IHJ0Y192YWxpZF90bSgmYWxhcm0tPnRpbWUpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIGFsYXJtIHRpbWUgcmVhZCBmcm9tIFJUQ1xuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlkZXZfZGJnKGRldiwgIkFsYXJtIHNldCBmb3IgLSBoOnI6cz0lZDolZDolZCwgZC9tL3k9JWQvJWQvJWRcbiIsCisJCQkJYWxhcm0tPnRpbWUudG1faG91ciwgYWxhcm0tPnRpbWUudG1fbWluLAorCQkJCWFsYXJtLT50aW1lLnRtX3NlYywgYWxhcm0tPnRpbWUudG1fbWRheSwKKwkJCQlhbGFybS0+dGltZS50bV9tb24sIGFsYXJtLT50aW1lLnRtX3llYXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG04eHh4X3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZSkKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJc3RydWN0IHBtOHh4eF9ydGMgKnJ0Y19kZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXU4IGN0cmxfcmVnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19kZC0+Y3RybF9yZWdfbG9jaywgaXJxX2ZsYWdzKTsKKwljdHJsX3JlZyA9IHJ0Y19kZC0+Y3RybF9yZWc7CisJY3RybF9yZWcgPSAoZW5hYmxlKSA/IChjdHJsX3JlZyB8IFBNOHh4eF9SVENfQUxBUk1fRU5BQkxFKSA6CisJCQkJKGN0cmxfcmVnICYgflBNOHh4eF9SVENfQUxBUk1fRU5BQkxFKTsKKworCXJjID0gcG04eHh4X3dyaXRlX3dyYXBwZXIocnRjX2RkLCAmY3RybF9yZWcsIHJ0Y19kZC0+cnRjX2Jhc2UsIDEpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJXcml0ZSB0byBSVEMgY29udHJvbCByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIHJ0Y19yd19mYWlsOworCX0KKworCXJ0Y19kZC0+Y3RybF9yZWcgPSBjdHJsX3JlZzsKKworcnRjX3J3X2ZhaWw6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2RkLT5jdHJsX3JlZ19sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIHBtOHh4eF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBwbTh4eHhfcnRjX3JlYWRfdGltZSwKKwkuc2V0X2FsYXJtCT0gcG04eHh4X3J0Y19zZXRfYWxhcm0sCisJLnJlYWRfYWxhcm0JPSBwbTh4eHhfcnRjX3JlYWRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBwbTh4eHhfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgcG04eHh4X2FsYXJtX3RyaWdnZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBwbTh4eHhfcnRjICpydGNfZGQgPSBkZXZfaWQ7CisJdTggY3RybF9yZWc7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJcnRjX3VwZGF0ZV9pcnEocnRjX2RkLT5ydGMsIDEsIFJUQ19JUlFGIHwgUlRDX0FGKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfZGQtPmN0cmxfcmVnX2xvY2ssIGlycV9mbGFncyk7CisKKwkvKiBDbGVhciB0aGUgYWxhcm0gZW5hYmxlIGJpdCAqLworCWN0cmxfcmVnID0gcnRjX2RkLT5jdHJsX3JlZzsKKwljdHJsX3JlZyAmPSB+UE04eHh4X1JUQ19BTEFSTV9FTkFCTEU7CisKKwlyYyA9IHBtOHh4eF93cml0ZV93cmFwcGVyKHJ0Y19kZCwgJmN0cmxfcmVnLCBydGNfZGQtPnJ0Y19iYXNlLCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19kZC0+Y3RybF9yZWdfbG9jaywgaXJxX2ZsYWdzKTsKKwkJZGV2X2VycihydGNfZGQtPnJ0Y19kZXYsICJXcml0ZSB0byBSVEMgY29udHJvbCByZWdpc3RlciAiCisJCQkJCQkJCSJmYWlsZWRcbiIpOworCQlnb3RvIHJ0Y19hbGFybV9oYW5kbGVkOworCX0KKworCXJ0Y19kZC0+Y3RybF9yZWcgPSBjdHJsX3JlZzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfZGQtPmN0cmxfcmVnX2xvY2ssIGlycV9mbGFncyk7CisKKwkvKiBDbGVhciBSVEMgYWxhcm0gcmVnaXN0ZXIgKi8KKwlyYyA9IHBtOHh4eF9yZWFkX3dyYXBwZXIocnRjX2RkLCAmY3RybF9yZWcsIHJ0Y19kZC0+cnRjX2Jhc2UgKworCQkJCQkJUE04WFhYX0FMQVJNX0NUUkxfT0ZGU0VULCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIocnRjX2RkLT5ydGNfZGV2LCAiUlRDIEFsYXJtIGNvbnRyb2wgcmVnaXN0ZXIgcmVhZCAiCisJCQkJCQkJCSJmYWlsZWRcbiIpOworCQlnb3RvIHJ0Y19hbGFybV9oYW5kbGVkOworCX0KKworCWN0cmxfcmVnICY9IH5QTTh4eHhfUlRDX0FMQVJNX0NMRUFSOworCXJjID0gcG04eHh4X3dyaXRlX3dyYXBwZXIocnRjX2RkLCAmY3RybF9yZWcsIHJ0Y19kZC0+cnRjX2Jhc2UgKworCQkJCQkJUE04WFhYX0FMQVJNX0NUUkxfT0ZGU0VULCAxKTsKKwlpZiAocmMgPCAwKQorCQlkZXZfZXJyKHJ0Y19kZC0+cnRjX2RldiwgIldyaXRlIHRvIFJUQyBBbGFybSBjb250cm9sIHJlZ2lzdGVyIgorCQkJCQkJCQkiIGZhaWxlZFxuIik7CisKK3J0Y19hbGFybV9oYW5kbGVkOgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcG04eHh4X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByYzsKKwl1OCBjdHJsX3JlZzsKKwlib29sIHJ0Y193cml0ZV9lbmFibGUgPSBmYWxzZTsKKwlzdHJ1Y3QgcG04eHh4X3J0YyAqcnRjX2RkOworCXN0cnVjdCByZXNvdXJjZSAqcnRjX3Jlc291cmNlOworCWNvbnN0IHN0cnVjdCBwbTh4eHhfcnRjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwkJCQkJCWRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisKKwlpZiAocGRhdGEgIT0gTlVMTCkKKwkJcnRjX3dyaXRlX2VuYWJsZSA9IHBkYXRhLT5ydGNfd3JpdGVfZW5hYmxlOworCisJcnRjX2RkID0ga3phbGxvYyhzaXplb2YoKnJ0Y19kZCksIEdGUF9LRVJORUwpOworCWlmIChydGNfZGQgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEluaXRpYWxpc2Ugc3BpbmxvY2sgdG8gcHJvdGVjdCBSVEMgY29udHJvbCByZWdpc3RlciAqLworCXNwaW5fbG9ja19pbml0KCZydGNfZGQtPmN0cmxfcmVnX2xvY2spOworCisJcnRjX2RkLT5ydGNfYWxhcm1faXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocnRjX2RkLT5ydGNfYWxhcm1faXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJBbGFybSBJUlEgcmVzb3VyY2UgYWJzZW50IVxuIik7CisJCXJjID0gLUVOWElPOworCQlnb3RvIGZhaWxfcnRjX2VuYWJsZTsKKwl9CisKKwlydGNfcmVzb3VyY2UgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfSU8sCisJCQkJCQkJInBtaWNfcnRjX2Jhc2UiKTsKKwlpZiAoIShydGNfcmVzb3VyY2UgJiYgcnRjX3Jlc291cmNlLT5zdGFydCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiUlRDIElPIHJlc291cmNlIGFic2VudCFcbiIpOworCQlyYyA9IC1FTlhJTzsKKwkJZ290byBmYWlsX3J0Y19lbmFibGU7CisJfQorCisJcnRjX2RkLT5ydGNfYmFzZSA9IHJ0Y19yZXNvdXJjZS0+c3RhcnQ7CisKKwkvKiBTZXR1cCBSVEMgcmVnaXN0ZXIgYWRkcmVzc2VzICovCisJcnRjX2RkLT5ydGNfd3JpdGVfYmFzZSA9IHJ0Y19kZC0+cnRjX2Jhc2UgKyBQTThYWFhfUlRDX1dSSVRFX09GRlNFVDsKKwlydGNfZGQtPnJ0Y19yZWFkX2Jhc2UgPSBydGNfZGQtPnJ0Y19iYXNlICsgUE04WFhYX1JUQ19SRUFEX09GRlNFVDsKKwlydGNfZGQtPmFsYXJtX3J3X2Jhc2UgPSBydGNfZGQtPnJ0Y19iYXNlICsgUE04WFhYX0FMQVJNX1JXX09GRlNFVDsKKworCXJ0Y19kZC0+cnRjX2RldiA9ICZwZGV2LT5kZXY7CisKKwkvKiBDaGVjayBpZiB0aGUgUlRDIGlzIG9uLCBlbHNlIHR1cm4gaXQgb24gKi8KKwlyYyA9IHBtOHh4eF9yZWFkX3dyYXBwZXIocnRjX2RkLCAmY3RybF9yZWcsIHJ0Y19kZC0+cnRjX2Jhc2UsIDEpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiUlRDIGNvbnRyb2wgcmVnaXN0ZXIgcmVhZCBmYWlsZWQhXG4iKTsKKwkJZ290byBmYWlsX3J0Y19lbmFibGU7CisJfQorCisJaWYgKCEoY3RybF9yZWcgJiBQTTh4eHhfUlRDX0VOQUJMRSkpIHsKKwkJY3RybF9yZWcgfD0gUE04eHh4X1JUQ19FTkFCTEU7CisJCXJjID0gcG04eHh4X3dyaXRlX3dyYXBwZXIocnRjX2RkLCAmY3RybF9yZWcsIHJ0Y19kZC0+cnRjX2Jhc2UsCisJCQkJCQkJCQkxKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiV3JpdGUgdG8gUlRDIGNvbnRyb2wgcmVnaXN0ZXIgIgorCQkJCQkJCQkiZmFpbGVkXG4iKTsKKwkJCWdvdG8gZmFpbF9ydGNfZW5hYmxlOworCQl9CisJfQorCisJcnRjX2RkLT5jdHJsX3JlZyA9IGN0cmxfcmVnOworCWlmIChydGNfd3JpdGVfZW5hYmxlID09IHRydWUpCisJCXBtOHh4eF9ydGNfb3BzLnNldF90aW1lID0gcG04eHh4X3J0Y19zZXRfdGltZTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Y19kZCk7CisKKwkvKiBSZWdpc3RlciB0aGUgUlRDIGRldmljZSAqLworCXJ0Y19kZC0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigicG04eHh4X3J0YyIsICZwZGV2LT5kZXYsCisJCQkJJnBtOHh4eF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGNfZGQtPnJ0YykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IFJUQyByZWdpc3RyYXRpb24gZmFpbGVkICglbGQpXG4iLAorCQkJCQlfX2Z1bmNfXywgUFRSX0VSUihydGNfZGQtPnJ0YykpOworCQlyYyA9IFBUUl9FUlIocnRjX2RkLT5ydGMpOworCQlnb3RvIGZhaWxfcnRjX2VuYWJsZTsKKwl9CisKKwkvKiBSZXF1ZXN0IHRoZSBhbGFybSBJUlEgKi8KKwlyYyA9IHJlcXVlc3RfYW55X2NvbnRleHRfaXJxKHJ0Y19kZC0+cnRjX2FsYXJtX2lycSwKKwkJCQkgcG04eHh4X2FsYXJtX3RyaWdnZXIsIElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJICJwbTh4eHhfcnRjX2FsYXJtIiwgcnRjX2RkKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlcXVlc3QgSVJRIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCWdvdG8gZmFpbF9yZXFfaXJxOworCX0KKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIlByb2JlIHN1Y2Nlc3MgISFcbiIpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfcmVxX2lycToKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjX2RkLT5ydGMpOworZmFpbF9ydGNfZW5hYmxlOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKHJ0Y19kZCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBwbTh4eHhfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbTh4eHhfcnRjICpydGNfZGQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKKwlmcmVlX2lycShydGNfZGQtPnJ0Y19hbGFybV9pcnEsIHJ0Y19kZCk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Y19kZC0+cnRjKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShydGNfZGQpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgcG04eHh4X3J0Y19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbTh4eHhfcnRjICpydGNfZGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKHJ0Y19kZC0+cnRjX2FsYXJtX2lycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbTh4eHhfcnRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbTh4eHhfcnRjICpydGNfZGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQllbmFibGVfaXJxX3dha2UocnRjX2RkLT5ydGNfYWxhcm1faXJxKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK1NJTVBMRV9ERVZfUE1fT1BTKHBtOHh4eF9ydGNfcG1fb3BzLCBwbTh4eHhfcnRjX3N1c3BlbmQsIHBtOHh4eF9ydGNfcmVzdW1lKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcG04eHh4X3J0Y19kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBtOHh4eF9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwbTh4eHhfcnRjX3JlbW92ZSksCisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSBQTThYWFhfUlRDX0RFVl9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gJnBtOHh4eF9ydGNfcG1fb3BzLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwbTh4eHhfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwbTh4eHhfcnRjX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChwbTh4eHhfcnRjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcG04eHh4X3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBtOHh4eF9ydGNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHBtOHh4eF9ydGNfZXhpdCk7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06cnRjLXBtOHh4eCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQTUlDOHh4eCBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJBbmlydWRoIEdoYXlhbCA8YWdoYXlhbEBjb2RlYXVyb3JhLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1wdXYzLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcHV2My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZWJhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtcHV2My5jCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogUlRDIGRyaXZlciBjb2RlIHNwZWNpZmljIHRvIFBLVW5pdHkgU29DIGFuZCBVbmlDb3JlIElTQQorICoKKyAqCU1haW50YWluZWQgYnkgR1VBTiBYdWUtdGFvIDxneHRAbXByYy5wa3UuZWR1LmNuPgorICoJQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgR3VhbiBYdWV0YW8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqcHV2M19ydGNfbWVtOworCitzdGF0aWMgaW50IHB1djNfcnRjX2FsYXJtbm8gPSBJUlFfUlRDQWxhcm07CitzdGF0aWMgaW50IHB1djNfcnRjX3RpY2tubyAgPSBJUlFfUlRDOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHB1djNfcnRjX3BpZV9sb2NrKTsKKworLyogSVJRIEhhbmRsZXJzICovCitzdGF0aWMgaXJxcmV0dXJuX3QgcHV2M19ydGNfYWxhcm1pcnEoaW50IGlycSwgdm9pZCAqaWQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJkZXYgPSBpZDsKKworCXdyaXRlbChyZWFkbChSVENfUlRTUikgfCBSVENfUlRTUl9BTCwgUlRDX1JUU1IpOworCXJ0Y191cGRhdGVfaXJxKHJkZXYsIDEsIFJUQ19BRiB8IFJUQ19JUlFGKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwdXYzX3J0Y190aWNraXJxKGludCBpcnEsIHZvaWQgKmlkKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpyZGV2ID0gaWQ7CisKKwl3cml0ZWwocmVhZGwoUlRDX1JUU1IpIHwgUlRDX1JUU1JfSFosIFJUQ19SVFNSKTsKKwlydGNfdXBkYXRlX2lycShyZGV2LCAxLCBSVENfUEYgfCBSVENfSVJRRik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBVcGRhdGUgY29udHJvbCByZWdpc3RlcnMgKi8KK3N0YXRpYyB2b2lkIHB1djNfcnRjX3NldGFpZShpbnQgdG8pCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXByX2RlYnVnKCIlczogYWllPSVkXG4iLCBfX2Z1bmNfXywgdG8pOworCisJdG1wID0gcmVhZGwoUlRDX1JUU1IpICYgflJUQ19SVFNSX0FMRTsKKworCWlmICh0bykKKwkJdG1wIHw9IFJUQ19SVFNSX0FMRTsKKworCXdyaXRlbCh0bXAsIFJUQ19SVFNSKTsKK30KKworc3RhdGljIGludCBwdXYzX3J0Y19zZXRwaWUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZW5hYmxlZCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJcHJfZGVidWcoIiVzOiBwaWU9JWRcbiIsIF9fZnVuY19fLCBlbmFibGVkKTsKKworCXNwaW5fbG9ja19pcnEoJnB1djNfcnRjX3BpZV9sb2NrKTsKKwl0bXAgPSByZWFkbChSVENfUlRTUikgJiB+UlRDX1JUU1JfSFpFOworCisJaWYgKGVuYWJsZWQpCisJCXRtcCB8PSBSVENfUlRTUl9IWkU7CisKKwl3cml0ZWwodG1wLCBSVENfUlRTUik7CisJc3Bpbl91bmxvY2tfaXJxKCZwdXYzX3J0Y19waWVfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGltZSByZWFkL3dyaXRlICovCitzdGF0aWMgaW50IHB1djNfcnRjX2dldHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKK3sKKwlydGNfdGltZV90b190bShyZWFkbChSVENfUkNOUiksIHJ0Y190bSk7CisKKwlwcl9kZWJ1ZygicmVhZCB0aW1lICUwMnguJTAyeC4lMDJ4ICUwMngvJTAyeC8lMDJ4XG4iLAorCQkgcnRjX3RtLT50bV95ZWFyLCBydGNfdG0tPnRtX21vbiwgcnRjX3RtLT50bV9tZGF5LAorCQkgcnRjX3RtLT50bV9ob3VyLCBydGNfdG0tPnRtX21pbiwgcnRjX3RtLT50bV9zZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV2M19ydGNfc2V0dGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgbG9uZyBydGNfY291bnQgPSAwOworCisJcHJfZGVidWcoInNldCB0aW1lICUwMmQuJTAyZC4lMDJkICUwMmQvJTAyZC8lMDJkXG4iLAorCQkgdG0tPnRtX3llYXIsIHRtLT50bV9tb24sIHRtLT50bV9tZGF5LAorCQkgdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJcnRjX3RtX3RvX3RpbWUodG0sICZydGNfY291bnQpOworCXdyaXRlbChydGNfY291bnQsIFJUQ19SQ05SKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1djNfcnRjX2dldGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHJ0Y190aW1lICphbG1fdG0gPSAmYWxybS0+dGltZTsKKworCXJ0Y190aW1lX3RvX3RtKHJlYWRsKFJUQ19SVEFSKSwgYWxtX3RtKTsKKworCWFscm0tPmVuYWJsZWQgPSByZWFkbChSVENfUlRTUikgJiBSVENfUlRTUl9BTEU7CisKKwlwcl9kZWJ1ZygicmVhZCBhbGFybSAlMDJ4ICUwMnguJTAyeC4lMDJ4ICUwMngvJTAyeC8lMDJ4XG4iLAorCQkgYWxybS0+ZW5hYmxlZCwKKwkJIGFsbV90bS0+dG1feWVhciwgYWxtX3RtLT50bV9tb24sIGFsbV90bS0+dG1fbWRheSwKKwkJIGFsbV90bS0+dG1faG91ciwgYWxtX3RtLT50bV9taW4sIGFsbV90bS0+dG1fc2VjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1djNfcnRjX3NldGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOworCXVuc2lnbmVkIGxvbmcgcnRjYWxhcm1fY291bnQgPSAwOworCisJcHJfZGVidWcoInB1djNfcnRjX3NldGFsYXJtOiAlZCwgJTAyeC8lMDJ4LyUwMnggJTAyeC4lMDJ4LiUwMnhcbiIsCisJCSBhbHJtLT5lbmFibGVkLAorCQkgdG0tPnRtX21kYXkgJiAweGZmLCB0bS0+dG1fbW9uICYgMHhmZiwgdG0tPnRtX3llYXIgJiAweGZmLAorCQkgdG0tPnRtX2hvdXIgJiAweGZmLCB0bS0+dG1fbWluICYgMHhmZiwgdG0tPnRtX3NlYyk7CisKKwlydGNfdG1fdG9fdGltZSh0bSwgJnJ0Y2FsYXJtX2NvdW50KTsKKwl3cml0ZWwocnRjYWxhcm1fY291bnQsIFJUQ19SVEFSKTsKKworCXB1djNfcnRjX3NldGFpZShhbHJtLT5lbmFibGVkKTsKKworCWlmIChhbHJtLT5lbmFibGVkKQorCQllbmFibGVfaXJxX3dha2UocHV2M19ydGNfYWxhcm1ubyk7CisJZWxzZQorCQlkaXNhYmxlX2lycV93YWtlKHB1djNfcnRjX2FsYXJtbm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV2M19ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXNlcV9wcmludGYoc2VxLCAicGVyaW9kaWNfSVJRXHQ6ICVzXG4iLAorCQkgICAgIChyZWFkbChSVENfUlRTUikgJiBSVENfUlRTUl9IWkUpID8gInllcyIgOiAibm8iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXYzX3J0Y19vcGVuKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEocHV2M19ydGNfYWxhcm1ubywgcHV2M19ydGNfYWxhcm1pcnEsCisJCQkgIElSUUZfRElTQUJMRUQsICAicGt1bml0eS1ydGMgYWxhcm0iLCBydGNfZGV2KTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJJUlElZCBlcnJvciAlZFxuIiwgcHV2M19ydGNfYWxhcm1ubywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShwdXYzX3J0Y190aWNrbm8sIHB1djNfcnRjX3RpY2tpcnEsCisJCQkgIElSUUZfRElTQUJMRUQsICAicGt1bml0eS1ydGMgdGljayIsIHJ0Y19kZXYpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIklSUSVkIGVycm9yICVkXG4iLCBwdXYzX3J0Y190aWNrbm8sIHJldCk7CisJCWdvdG8gdGlja19lcnI7CisJfQorCisJcmV0dXJuIHJldDsKKworIHRpY2tfZXJyOgorCWZyZWVfaXJxKHB1djNfcnRjX2FsYXJtbm8sIHJ0Y19kZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHB1djNfcnRjX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyogZG8gbm90IGNsZWFyIEFJRSBoZXJlLCBpdCBtYXkgYmUgbmVlZGVkIGZvciB3YWtlICovCisJcHV2M19ydGNfc2V0cGllKGRldiwgMCk7CisJZnJlZV9pcnEocHV2M19ydGNfYWxhcm1ubywgcnRjX2Rldik7CisJZnJlZV9pcnEocHV2M19ydGNfdGlja25vLCBydGNfZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHB1djNfcnRjb3BzID0geworCS5vcGVuCQk9IHB1djNfcnRjX29wZW4sCisJLnJlbGVhc2UJPSBwdXYzX3J0Y19yZWxlYXNlLAorCS5yZWFkX3RpbWUJPSBwdXYzX3J0Y19nZXR0aW1lLAorCS5zZXRfdGltZQk9IHB1djNfcnRjX3NldHRpbWUsCisJLnJlYWRfYWxhcm0JPSBwdXYzX3J0Y19nZXRhbGFybSwKKwkuc2V0X2FsYXJtCT0gcHV2M19ydGNfc2V0YWxhcm0sCisJLnByb2MJICAgICAgICA9IHB1djNfcnRjX3Byb2MsCit9OworCitzdGF0aWMgdm9pZCBwdXYzX3J0Y19lbmFibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IGVuKQoreworCWlmICghZW4pIHsKKwkJd3JpdGVsKHJlYWRsKFJUQ19SVFNSKSAmIH5SVENfUlRTUl9IWkUsIFJUQ19SVFNSKTsKKwl9IGVsc2UgeworCQkvKiByZS1lbmFibGUgdGhlIGRldmljZSwgYW5kIGNoZWNrIGl0IGlzIG9rICovCisJCWlmICgocmVhZGwoUlRDX1JUU1IpICYgUlRDX1JUU1JfSFpFKSA9PSAwKSB7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAicnRjIGRpc2FibGVkLCByZS1lbmFibGluZ1xuIik7CisJCQl3cml0ZWwocmVhZGwoUlRDX1JUU1IpIHwgUlRDX1JUU1JfSFpFLCBSVENfUlRTUik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgcHV2M19ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKKwlwdXYzX3J0Y19zZXRwaWUoJmRldi0+ZGV2LCAwKTsKKwlwdXYzX3J0Y19zZXRhaWUoMCk7CisKKwlyZWxlYXNlX3Jlc291cmNlKHB1djNfcnRjX21lbSk7CisJa2ZyZWUocHV2M19ydGNfbWVtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1djNfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJcHJfZGVidWcoIiVzOiBwcm9iZT0lcFxuIiwgX19mdW5jX18sIHBkZXYpOworCisJLyogZmluZCB0aGUgSVJRcyAqLworCXB1djNfcnRjX3RpY2tubyA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7CisJaWYgKHB1djNfcnRjX3RpY2tubyA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaXJxIGZvciBydGMgdGlja1xuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXB1djNfcnRjX2FsYXJtbm8gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChwdXYzX3J0Y19hbGFybW5vIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBpcnEgZm9yIGFsYXJtXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcHJfZGVidWcoIlBLVW5pdHlfcnRjOiB0aWNrIGlycSAlZCwgYWxhcm0gaXJxICVkXG4iLAorCQkgcHV2M19ydGNfdGlja25vLCBwdXYzX3J0Y19hbGFybW5vKTsKKworCS8qIGdldCB0aGUgbWVtb3J5IHJlZ2lvbiAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5IHJlZ2lvbiByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXB1djNfcnRjX21lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCisJCQkJCSAgcGRldi0+bmFtZSk7CisKKwlpZiAocHV2M19ydGNfbWVtID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlc2VydmUgbWVtb3J5IHJlZ2lvblxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX25vcmVzOworCX0KKworCXB1djNfcnRjX2VuYWJsZShwZGV2LCAxKTsKKworCS8qIHJlZ2lzdGVyIFJUQyBhbmQgZXhpdCAqLworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInBrdW5pdHkiLCAmcGRldi0+ZGV2LCAmcHV2M19ydGNvcHMsCisJCQkJICBUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGF0dGFjaCBydGNcbiIpOworCQlyZXQgPSBQVFJfRVJSKHJ0Yyk7CisJCWdvdG8gZXJyX25vcnRjOworCX0KKworCS8qIHBsYXRmb3JtIHNldHVwIGNvZGUgc2hvdWxkIGhhdmUgaGFuZGxlZCB0aGlzOyBzaWdoICovCisJaWYgKCFkZXZpY2VfY2FuX3dha2V1cCgmcGRldi0+ZGV2KSkKKwkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKwlyZXR1cm4gMDsKKworIGVycl9ub3J0YzoKKwlwdXYzX3J0Y19lbmFibGUocGRldiwgMCk7CisJcmVsZWFzZV9yZXNvdXJjZShwdXYzX3J0Y19tZW0pOworCisgZXJyX25vcmVzOgorCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCB0aWNudF9zYXZlOworCitzdGF0aWMgaW50IHB1djNfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCS8qIHNhdmUgUlRBUiBmb3IgYW55b25lIHVzaW5nIHBlcmlvZGljIGludGVycnVwdHMgKi8KKwl0aWNudF9zYXZlID0gcmVhZGwoUlRDX1JUQVIpOworCXB1djNfcnRjX2VuYWJsZShwZGV2LCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXYzX3J0Y19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlwdXYzX3J0Y19lbmFibGUocGRldiwgMSk7CisJd3JpdGVsKHRpY250X3NhdmUsIFJUQ19SVEFSKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHB1djNfcnRjX3N1c3BlbmQgTlVMTAorI2RlZmluZSBwdXYzX3J0Y19yZXN1bWUgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwdXYzX3J0Y2RydiA9IHsKKwkucHJvYmUJCT0gcHV2M19ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwdXYzX3J0Y19yZW1vdmUpLAorCS5zdXNwZW5kCT0gcHV2M19ydGNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHB1djNfcnRjX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiUEtVbml0eS12My1SVEMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgY2hhciBfX2luaXRkYXRhIGJhbm5lcltdID0gIlBLVW5pdHktdjMgUlRDLCAoYykgMjAwOSBQS1VuaXR5IENvLlxuIjsKKworc3RhdGljIGludCBfX2luaXQgcHV2M19ydGNfaW5pdCh2b2lkKQoreworCXByaW50ayhiYW5uZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnB1djNfcnRjZHJ2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHB1djNfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHV2M19ydGNkcnYpOworfQorCittb2R1bGVfaW5pdChwdXYzX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KHB1djNfcnRjX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlJUQyBEcml2ZXIgZm9yIHRoZSBQS1VuaXR5IHYzIGNoaXAiKTsKK01PRFVMRV9BVVRIT1IoIkh1IERvbmdsaWFuZyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXMzYy5jIGIvZHJpdmVycy9ydGMvcnRjLXMzYy5jCmluZGV4IDE2NTEyZWMuLjkzMjlkYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zM2MuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtczNjLmMKQEAgLTU3LDExICs1NywxMyBAQAogewogCXN0cnVjdCBydGNfZGV2aWNlICpyZGV2ID0gaWQ7CiAKKwljbGtfZW5hYmxlKHJ0Y19jbGspOwogCXJ0Y191cGRhdGVfaXJxKHJkZXYsIDEsIFJUQ19BRiB8IFJUQ19JUlFGKTsKIAogCWlmIChzM2NfcnRjX2NwdV90eXBlID09IFRZUEVfUzNDNjRYWCkKIAkJd3JpdGViKFMzQzI0MTBfSU5UUF9BTE0sIHMzY19ydGNfYmFzZSArIFMzQzI0MTBfSU5UUCk7CiAKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTY5LDExICs3MSwxMyBAQAogewogCXN0cnVjdCBydGNfZGV2aWNlICpyZGV2ID0gaWQ7CiAKKwljbGtfZW5hYmxlKHJ0Y19jbGspOwogCXJ0Y191cGRhdGVfaXJxKHJkZXYsIDEsIFJUQ19QRiB8IFJUQ19JUlFGKTsKIAogCWlmIChzM2NfcnRjX2NwdV90eXBlID09IFRZUEVfUzNDNjRYWCkKIAkJd3JpdGViKFMzQzI0MTBfSU5UUF9USUMsIHMzY19ydGNfYmFzZSArIFMzQzI0MTBfSU5UUCk7CiAKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTg0LDEyICs4OCwxNCBAQAogCiAJcHJfZGVidWcoIiVzOiBhaWU9JWRcbiIsIF9fZnVuY19fLCBlbmFibGVkKTsKIAorCWNsa19lbmFibGUocnRjX2Nsayk7CiAJdG1wID0gcmVhZGIoczNjX3J0Y19iYXNlICsgUzNDMjQxMF9SVENBTE0pICYgflMzQzI0MTBfUlRDQUxNX0FMTUVOOwogCiAJaWYgKGVuYWJsZWQpCiAJCXRtcCB8PSBTM0MyNDEwX1JUQ0FMTV9BTE1FTjsKIAogCXdyaXRlYih0bXAsIHMzY19ydGNfYmFzZSArIFMzQzI0MTBfUlRDQUxNKTsKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTAzLDYgKzEwOSw3IEBACiAJaWYgKCFpc19wb3dlcl9vZl8yKGZyZXEpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWNsa19lbmFibGUocnRjX2Nsayk7CiAJc3Bpbl9sb2NrX2lycSgmczNjX3J0Y19waWVfbG9jayk7CiAKIAlpZiAoczNjX3J0Y19jcHVfdHlwZSA9PSBUWVBFX1MzQzI0MTApIHsKQEAgLTExNCw2ICsxMjEsNyBAQAogCiAJd3JpdGVsKHRtcCwgczNjX3J0Y19iYXNlICsgUzNDMjQxMF9USUNOVCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZzM2NfcnRjX3BpZV9sb2NrKTsKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTI1LDYgKzEzMyw3IEBACiAJdW5zaWduZWQgaW50IGhhdmVfcmV0cmllZCA9IDA7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gczNjX3J0Y19iYXNlOwogCisJY2xrX2VuYWJsZShydGNfY2xrKTsKICByZXRyeV9nZXRfdGltZToKIAlydGNfdG0tPnRtX21pbiAgPSByZWFkYihiYXNlICsgUzNDMjQxMF9SVENNSU4pOwogCXJ0Y190bS0+dG1faG91ciA9IHJlYWRiKGJhc2UgKyBTM0MyNDEwX1JUQ0hPVVIpOwpAQCAtMTU3LDYgKzE2Niw3IEBACiAJcnRjX3RtLT50bV95ZWFyICs9IDEwMDsKIAlydGNfdG0tPnRtX21vbiAtPSAxOwogCisJY2xrX2Rpc2FibGUocnRjX2Nsayk7CiAJcmV0dXJuIHJ0Y192YWxpZF90bShydGNfdG0pOwogfQogCkBAIC0xNjUsNiArMTc1LDcgQEAKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBzM2NfcnRjX2Jhc2U7CiAJaW50IHllYXIgPSB0bS0+dG1feWVhciAtIDEwMDsKIAorCWNsa19lbmFibGUocnRjX2Nsayk7CiAJcHJfZGVidWcoInNldCB0aW1lICUwNGQuJTAyZC4lMDJkICUwMmQ6JTAyZDolMDJkXG4iLAogCQkgMTkwMCArIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKIAkJIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKQEAgLTE4Miw2ICsxOTMsNyBAQAogCXdyaXRlYihiaW4yYmNkKHRtLT50bV9tZGF5KSwgYmFzZSArIFMzQzI0MTBfUlRDREFURSk7CiAJd3JpdGViKGJpbjJiY2QodG0tPnRtX21vbiArIDEpLCBiYXNlICsgUzNDMjQxMF9SVENNT04pOwogCXdyaXRlYihiaW4yYmNkKHllYXIpLCBiYXNlICsgUzNDMjQxMF9SVENZRUFSKTsKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTkyLDYgKzIwNCw3IEBACiAJdm9pZCBfX2lvbWVtICpiYXNlID0gczNjX3J0Y19iYXNlOwogCXVuc2lnbmVkIGludCBhbG1fZW47CiAKKwljbGtfZW5hYmxlKHJ0Y19jbGspOwogCWFsbV90bS0+dG1fc2VjICA9IHJlYWRiKGJhc2UgKyBTM0MyNDEwX0FMTVNFQyk7CiAJYWxtX3RtLT50bV9taW4gID0gcmVhZGIoYmFzZSArIFMzQzI0MTBfQUxNTUlOKTsKIAlhbG1fdG0tPnRtX2hvdXIgPSByZWFkYihiYXNlICsgUzNDMjQxMF9BTE1IT1VSKTsKQEAgLTI0Myw2ICsyNTYsNyBAQAogCWVsc2UKIAkJYWxtX3RtLT50bV95ZWFyID0gLTE7CiAKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjUyLDYgKzI2Niw3IEBACiAJdm9pZCBfX2lvbWVtICpiYXNlID0gczNjX3J0Y19iYXNlOwogCXVuc2lnbmVkIGludCBhbHJtX2VuOwogCisJY2xrX2VuYWJsZShydGNfY2xrKTsKIAlwcl9kZWJ1ZygiczNjX3J0Y19zZXRhbGFybTogJWQsICUwNGQuJTAyZC4lMDJkICUwMmQ6JTAyZDolMDJkXG4iLAogCQkgYWxybS0+ZW5hYmxlZCwKIAkJIDE5MDAgKyB0bS0+dG1feWVhciwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCkBAIC0yODIsNiArMjk3LDcgQEAKIAogCXMzY19ydGNfc2V0YWllKGRldiwgYWxybS0+ZW5hYmxlZCk7CiAKKwljbGtfZGlzYWJsZShydGNfY2xrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjg5LDYgKzMwNSw3IEBACiB7CiAJdW5zaWduZWQgaW50IHRpY250OwogCisJY2xrX2VuYWJsZShydGNfY2xrKTsKIAlpZiAoczNjX3J0Y19jcHVfdHlwZSA9PSBUWVBFX1MzQzY0WFgpIHsKIAkJdGljbnQgPSByZWFkdyhzM2NfcnRjX2Jhc2UgKyBTM0MyNDEwX1JUQ0NPTik7CiAJCXRpY250ICY9IFMzQzY0WFhfUlRDQ09OX1RJQ0VOOwpAQCAtMjk4LDYgKzMxNSw3IEBACiAJfQogCiAJc2VxX3ByaW50ZihzZXEsICJwZXJpb2RpY19JUlFcdDogJXNcbiIsIHRpY250ICA/ICJ5ZXMiIDogIm5vIik7CisJY2xrX2Rpc2FibGUocnRjX2Nsayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2MCw2ICszNzgsNyBAQAogCWlmIChzM2NfcnRjX2Jhc2UgPT0gTlVMTCkKIAkJcmV0dXJuOwogCisJY2xrX2VuYWJsZShydGNfY2xrKTsKIAlpZiAoIWVuKSB7CiAJCXRtcCA9IHJlYWR3KGJhc2UgKyBTM0MyNDEwX1JUQ0NPTik7CiAJCWlmIChzM2NfcnRjX2NwdV90eXBlID09IFRZUEVfUzNDNjRYWCkKQEAgLTM5OSw2ICs0MTgsNyBAQAogCQkJCWJhc2UgKyBTM0MyNDEwX1JUQ0NPTik7CiAJCX0KIAl9CisJY2xrX2Rpc2FibGUocnRjX2Nsayk7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IHMzY19ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKQEAgLTQxMCw3ICs0MzAsNiBAQAogCiAJczNjX3J0Y19zZXRhaWUoJmRldi0+ZGV2LCAwKTsKIAotCWNsa19kaXNhYmxlKHJ0Y19jbGspOwogCWNsa19wdXQocnRjX2Nsayk7CiAJcnRjX2NsayA9IE5VTEw7CiAKQEAgLTQ1NSw4ICs0NzQsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlzM2NfcnRjX21lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LAotCQkJCQkgcmVzLT5lbmQtcmVzLT5zdGFydCsxLAorCXMzY19ydGNfbWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKIAkJCQkJIHBkZXYtPm5hbWUpOwogCiAJaWYgKHMzY19ydGNfbWVtID09IE5VTEwpIHsKQEAgLTQ2NSw3ICs0ODMsNyBAQAogCQlnb3RvIGVycl9ub3JlczsKIAl9CiAKLQlzM2NfcnRjX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCXMzY19ydGNfYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAoczNjX3J0Y19iYXNlID09IE5VTEwpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIGlvcmVtYXAoKVxuIik7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC01MzAsNiArNTQ4LDggQEAKIAogCXMzY19ydGNfc2V0ZnJlcSgmcGRldi0+ZGV2LCAxKTsKIAorCWNsa19kaXNhYmxlKHJ0Y19jbGspOworCiAJcmV0dXJuIDA7CiAKICBlcnJfbm9ydGM6CkBAIC01NTUsNiArNTc1LDcgQEAKIAogc3RhdGljIGludCBzM2NfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogeworCWNsa19lbmFibGUocnRjX2Nsayk7CiAJLyogc2F2ZSBUSUNOVCBmb3IgYW55b25lIHVzaW5nIHBlcmlvZGljIGludGVycnVwdHMgKi8KIAl0aWNudF9zYXZlID0gcmVhZGIoczNjX3J0Y19iYXNlICsgUzNDMjQxMF9USUNOVCk7CiAJaWYgKHMzY19ydGNfY3B1X3R5cGUgPT0gVFlQRV9TM0M2NFhYKSB7CkBAIC01NjksNiArNTkwLDcgQEAKIAkJZWxzZQogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZW5hYmxlX2lycV93YWtlIGZhaWxlZFxuIik7CiAJfQorCWNsa19kaXNhYmxlKHJ0Y19jbGspOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NzcsNiArNTk5LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCisJY2xrX2VuYWJsZShydGNfY2xrKTsKIAlzM2NfcnRjX2VuYWJsZShwZGV2LCAxKTsKIAl3cml0ZWIodGljbnRfc2F2ZSwgczNjX3J0Y19iYXNlICsgUzNDMjQxMF9USUNOVCk7CiAJaWYgKHMzY19ydGNfY3B1X3R5cGUgPT0gVFlQRV9TM0M2NFhYICYmIHRpY250X2VuX3NhdmUpIHsKQEAgLTU4OCw2ICs2MTEsNyBAQAogCQlkaXNhYmxlX2lycV93YWtlKHMzY19ydGNfYWxhcm1ubyk7CiAJCXdha2VfZW4gPSBmYWxzZTsKIAl9CisJY2xrX2Rpc2FibGUocnRjX2Nsayk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zdG1wM3h4eC5jIGIvZHJpdmVycy9ydGMvcnRjLXN0bXAzeHh4LmMKaW5kZXggNTcyZTk1My4uNzMxNTA2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXN0bXAzeHh4LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXN0bXAzeHh4LmMKQEAgLTYsNiArNiw3IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIENvcHlyaWdodCAyMDA4IEVtYmVkZGVkIEFsbGV5IFNvbHV0aW9ucywgSW5jIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMSBXb2xmcmFtIFNhbmcsIFBlbmd1dHJvbml4IGUuSy4KICAqLwogCiAvKgpAQCAtMTgsMjEgKzE5LDQxIEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8bWFjaC9zdG1wM3h4eC5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1ydGMuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19DVFJMCQkJMHgwCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19DVFJMX1NFVAkJCTB4NAorI2RlZmluZSBTVE1QM1hYWF9SVENfQ1RSTF9DTFIJCQkweDgKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX0NUUkxfQUxBUk1fSVJRX0VOCQkweDAwMDAwMDAxCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19DVFJMX09ORU1TRUNfSVJRX0VOCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX0NUUkxfQUxBUk1fSVJRCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX1NUQVQJCQkweDEwCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19TVEFUX1NUQUxFX1NISUZUCQkxNgorI2RlZmluZSBTVE1QM1hYWF9SVENfU1RBVF9SVENfUFJFU0VOVAkJMHg4MDAwMDAwMAorCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19TRUNPTkRTCQkJMHgzMAorCisjZGVmaW5lIFNUTVAzWFhYX1JUQ19BTEFSTQkJCTB4NDAKKworI2RlZmluZSBTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDAJCTB4NjAKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX1NFVAkJMHg2NAorI2RlZmluZSBTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQ0xSCQkweDY4CisjZGVmaW5lIFNUTVAzWFhYX1JUQ19QRVJTSVNURU5UMF9BTEFSTV9XQUtFX0VOCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX0FMQVJNX0VOCTB4MDAwMDAwMDQKKyNkZWZpbmUgU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX0FMQVJNX1dBS0UJMHgwMDAwMDA4MAogCiBzdHJ1Y3Qgc3RtcDN4eHhfcnRjX2RhdGEgewogCXN0cnVjdCBydGNfZGV2aWNlICpydGM7Ci0JdW5zaWduZWQgaXJxX2NvdW50OwogCXZvaWQgX19pb21lbSAqaW87Ci0JaW50IGlycV9hbGFybSwgaXJxXzFtc2VjOworCWludCBpcnFfYWxhcm07CiB9OwogCiBzdGF0aWMgdm9pZCBzdG1wM3h4eF93YWl0X3RpbWUoc3RydWN0IHN0bXAzeHh4X3J0Y19kYXRhICpydGNfZGF0YSkKQEAgLTQyLDggKzYzLDggQEAKIAkgKiBORVdfUkVHUy9TVEFMRV9SRUdTIGJpdGZpZWxkcyBnby4gSW4gZmFjdCBpdCdzIDB4MT1QMCwKIAkgKiAweDI9UDEsIC4uLCAweDIwPVA1LCAweDQwPUFMQVJNLCAweDgwPVNFQ09ORFMKIAkgKi8KLQl3aGlsZSAoX19yYXdfcmVhZGwocnRjX2RhdGEtPmlvICsgSFdfUlRDX1NUQVQpICYKLQkJCUJGKDB4ODAsIFJUQ19TVEFUX1NUQUxFX1JFR1MpKQorCXdoaWxlIChyZWFkbChydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfU1RBVCkgJgorCQkJKDB4ODAgPDwgU1RNUDNYWFhfUlRDX1NUQVRfU1RBTEVfU0hJRlQpKQogCQljcHVfcmVsYXgoKTsKIH0KIApAQCAtNTMsNyArNzQsNyBAQAogCXN0cnVjdCBzdG1wM3h4eF9ydGNfZGF0YSAqcnRjX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXN0bXAzeHh4X3dhaXRfdGltZShydGNfZGF0YSk7Ci0JcnRjX3RpbWVfdG9fdG0oX19yYXdfcmVhZGwocnRjX2RhdGEtPmlvICsgSFdfUlRDX1NFQ09ORFMpLCBydGNfdG0pOworCXJ0Y190aW1lX3RvX3RtKHJlYWRsKHJ0Y19kYXRhLT5pbyArIFNUTVAzWFhYX1JUQ19TRUNPTkRTKSwgcnRjX3RtKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjEsNyArODIsNyBAQAogewogCXN0cnVjdCBzdG1wM3h4eF9ydGNfZGF0YSAqcnRjX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCV9fcmF3X3dyaXRlbCh0LCBydGNfZGF0YS0+aW8gKyBIV19SVENfU0VDT05EUyk7CisJd3JpdGVsKHQsIHJ0Y19kYXRhLT5pbyArIFNUTVAzWFhYX1JUQ19TRUNPTkRTKTsKIAlzdG1wM3h4eF93YWl0X3RpbWUocnRjX2RhdGEpOwogCXJldHVybiAwOwogfQpAQCAtNzAsNDcgKzkxLDM0IEBACiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3RtcDN4eHhfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IHN0bXAzeHh4X3J0Y19kYXRhICpydGNfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXZfaWQpOwotCXUzMiBzdGF0dXM7Ci0JdTMyIGV2ZW50cyA9IDA7CisJdTMyIHN0YXR1cyA9IHJlYWRsKHJ0Y19kYXRhLT5pbyArIFNUTVAzWFhYX1JUQ19DVFJMKTsKIAotCXN0YXR1cyA9IF9fcmF3X3JlYWRsKHJ0Y19kYXRhLT5pbyArIEhXX1JUQ19DVFJMKSAmCi0JCQkoQk1fUlRDX0NUUkxfQUxBUk1fSVJRIHwgQk1fUlRDX0NUUkxfT05FTVNFQ19JUlEpOwotCi0JaWYgKHN0YXR1cyAmIEJNX1JUQ19DVFJMX0FMQVJNX0lSUSkgewotCQlzdG1wM3h4eF9jbGVhcmwoQk1fUlRDX0NUUkxfQUxBUk1fSVJRLAotCQkJCXJ0Y19kYXRhLT5pbyArIEhXX1JUQ19DVFJMKTsKLQkJZXZlbnRzIHw9IFJUQ19BRiB8IFJUQ19JUlFGOworCWlmIChzdGF0dXMgJiBTVE1QM1hYWF9SVENfQ1RSTF9BTEFSTV9JUlEpIHsKKwkJd3JpdGVsKFNUTVAzWFhYX1JUQ19DVFJMX0FMQVJNX0lSUSwKKwkJCQlydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfQ1RSTF9DTFIpOworCQlydGNfdXBkYXRlX2lycShydGNfZGF0YS0+cnRjLCAxLCBSVENfQUYgfCBSVENfSVJRRik7CisJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKLQlpZiAoc3RhdHVzICYgQk1fUlRDX0NUUkxfT05FTVNFQ19JUlEpIHsKLQkJc3RtcDN4eHhfY2xlYXJsKEJNX1JUQ19DVFJMX09ORU1TRUNfSVJRLAotCQkJCXJ0Y19kYXRhLT5pbyArIEhXX1JUQ19DVFJMKTsKLQkJaWYgKCsrcnRjX2RhdGEtPmlycV9jb3VudCAlIDEwMDAgPT0gMCkgewotCQkJZXZlbnRzIHw9IFJUQ19VRiB8IFJUQ19JUlFGOwotCQkJcnRjX2RhdGEtPmlycV9jb3VudCA9IDA7Ci0JCX0KLQl9Ci0KLQlpZiAoZXZlbnRzKQotCQlydGNfdXBkYXRlX2lycShydGNfZGF0YS0+cnRjLCAxLCBldmVudHMpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOworCXJldHVybiBJUlFfTk9ORTsKIH0KIAogc3RhdGljIGludCBzdG1wM3h4eF9hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCiB7CiAJc3RydWN0IHN0bXAzeHh4X3J0Y19kYXRhICpydGNfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXZvaWQgX19pb21lbSAqcCA9IHJ0Y19kYXRhLT5pbyArIEhXX1JUQ19QRVJTSVNURU5UMCwKLQkJICAgICAqY3RsID0gcnRjX2RhdGEtPmlvICsgSFdfUlRDX0NUUkw7CiAKIAlpZiAoZW5hYmxlZCkgewotCQlzdG1wM3h4eF9zZXRsKEJNX1JUQ19QRVJTSVNURU5UMF9BTEFSTV9FTiB8Ci0JCQkgICAgICBCTV9SVENfUEVSU0lTVEVOVDBfQUxBUk1fV0FLRV9FTiwgcCk7Ci0JCXN0bXAzeHh4X3NldGwoQk1fUlRDX0NUUkxfQUxBUk1fSVJRX0VOLCBjdGwpOworCQl3cml0ZWwoU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX0FMQVJNX0VOIHwKKwkJCQlTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQUxBUk1fV0FLRV9FTiwKKwkJCQlydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfU0VUKTsKKwkJd3JpdGVsKFNUTVAzWFhYX1JUQ19DVFJMX0FMQVJNX0lSUV9FTiwKKwkJCQlydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfQ1RSTF9TRVQpOwogCX0gZWxzZSB7Ci0JCXN0bXAzeHh4X2NsZWFybChCTV9SVENfUEVSU0lTVEVOVDBfQUxBUk1fRU4gfAotCQkJICAgICAgQk1fUlRDX1BFUlNJU1RFTlQwX0FMQVJNX1dBS0VfRU4sIHApOwotCQlzdG1wM3h4eF9jbGVhcmwoQk1fUlRDX0NUUkxfQUxBUk1fSVJRX0VOLCBjdGwpOworCQl3cml0ZWwoU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX0FMQVJNX0VOIHwKKwkJCQlTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQUxBUk1fV0FLRV9FTiwKKwkJCQlydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQ0xSKTsKKwkJd3JpdGVsKFNUTVAzWFhYX1JUQ19DVFJMX0FMQVJNX0lSUV9FTiwKKwkJCQlydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfQ1RSTF9DTFIpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTExOSw3ICsxMjcsNyBAQAogewogCXN0cnVjdCBzdG1wM3h4eF9ydGNfZGF0YSAqcnRjX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXJ0Y190aW1lX3RvX3RtKF9fcmF3X3JlYWRsKHJ0Y19kYXRhLT5pbyArIEhXX1JUQ19BTEFSTSksICZhbG0tPnRpbWUpOworCXJ0Y190aW1lX3RvX3RtKHJlYWRsKHJ0Y19kYXRhLT5pbyArIFNUTVAzWFhYX1JUQ19BTEFSTSksICZhbG0tPnRpbWUpOwogCXJldHVybiAwOwogfQogCkBAIC0xMjksNyArMTM3LDEwIEBACiAJc3RydWN0IHN0bXAzeHh4X3J0Y19kYXRhICpydGNfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcnRjX3RtX3RvX3RpbWUoJmFsbS0+dGltZSwgJnQpOwotCV9fcmF3X3dyaXRlbCh0LCBydGNfZGF0YS0+aW8gKyBIV19SVENfQUxBUk0pOworCXdyaXRlbCh0LCBydGNfZGF0YS0+aW8gKyBTVE1QM1hYWF9SVENfQUxBUk0pOworCisJc3RtcDN4eHhfYWxhcm1faXJxX2VuYWJsZShkZXYsIGFsbS0+ZW5hYmxlZCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ5LDExICsxNjAsMTEgQEAKIAlpZiAoIXJ0Y19kYXRhKQogCQlyZXR1cm4gMDsKIAotCXN0bXAzeHh4X2NsZWFybChCTV9SVENfQ1RSTF9PTkVNU0VDX0lSUV9FTiB8IEJNX1JUQ19DVFJMX0FMQVJNX0lSUV9FTiwKLQkJCXJ0Y19kYXRhLT5pbyArIEhXX1JUQ19DVFJMKTsKKwl3cml0ZWwoU1RNUDNYWFhfUlRDX0NUUkxfQUxBUk1fSVJRX0VOLAorCQkJcnRjX2RhdGEtPmlvICsgU1RNUDNYWFhfUlRDX0NUUkxfQ0xSKTsKIAlmcmVlX2lycShydGNfZGF0YS0+aXJxX2FsYXJtLCAmcGRldi0+ZGV2KTsKLQlmcmVlX2lycShydGNfZGF0YS0+aXJxXzFtc2VjLCAmcGRldi0+ZGV2KTsKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjX2RhdGEtPnJ0Yyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJaW91bm1hcChydGNfZGF0YS0+aW8pOwogCWtmcmVlKHJ0Y19kYXRhKTsKIApAQCAtMTg1LDIwICsxOTYsMjYgQEAKIAl9CiAKIAlydGNfZGF0YS0+aXJxX2FsYXJtID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlydGNfZGF0YS0+aXJxXzFtc2VjID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKIAotCWlmICghKF9fcmF3X3JlYWRsKEhXX1JUQ19TVEFUICsgcnRjX2RhdGEtPmlvKSAmCi0JCQlCTV9SVENfU1RBVF9SVENfUFJFU0VOVCkpIHsKKwlpZiAoIShyZWFkbChTVE1QM1hYWF9SVENfU1RBVCArIHJ0Y19kYXRhLT5pbykgJgorCQkJU1RNUDNYWFhfUlRDX1NUQVRfUlRDX1BSRVNFTlQpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGRldmljZSBvbmJvYXJkXG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBvdXRfcmVtYXA7CiAJfQogCi0Jc3RtcDN4eHhfcmVzZXRfYmxvY2socnRjX2RhdGEtPmlvLCB0cnVlKTsKLQlzdG1wM3h4eF9jbGVhcmwoQk1fUlRDX1BFUlNJU1RFTlQwX0FMQVJNX0VOIHwKLQkJCUJNX1JUQ19QRVJTSVNURU5UMF9BTEFSTV9XQUtFX0VOIHwKLQkJCUJNX1JUQ19QRVJTSVNURU5UMF9BTEFSTV9XQUtFLAotCQkJcnRjX2RhdGEtPmlvICsgSFdfUlRDX1BFUlNJU1RFTlQwKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGNfZGF0YSk7CisKKwlteHNfcmVzZXRfYmxvY2socnRjX2RhdGEtPmlvKTsKKwl3cml0ZWwoU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX0FMQVJNX0VOIHwKKwkJCVNUTVAzWFhYX1JUQ19QRVJTSVNURU5UMF9BTEFSTV9XQUtFX0VOIHwKKwkJCVNUTVAzWFhYX1JUQ19QRVJTSVNURU5UMF9BTEFSTV9XQUtFLAorCQkJcnRjX2RhdGEtPmlvICsgU1RNUDNYWFhfUlRDX1BFUlNJU1RFTlQwX0NMUik7CisKKwl3cml0ZWwoU1RNUDNYWFhfUlRDX0NUUkxfT05FTVNFQ19JUlFfRU4gfAorCQkJU1RNUDNYWFhfUlRDX0NUUkxfQUxBUk1fSVJRX0VOLAorCQkJcnRjX2RhdGEtPmlvICsgU1RNUDNYWFhfUlRDX0NUUkxfQ0xSKTsKKwogCXJ0Y19kYXRhLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCiAJCQkJJnN0bXAzeHh4X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKIAlpZiAoSVNfRVJSKHJ0Y19kYXRhLT5ydGMpKSB7CkBAIC0yMDYsMzMgKzIyMywyMCBAQAogCQlnb3RvIG91dF9yZW1hcDsKIAl9CiAKLQlydGNfZGF0YS0+aXJxX2NvdW50ID0gMDsKLQllcnIgPSByZXF1ZXN0X2lycShydGNfZGF0YS0+aXJxX2FsYXJtLCBzdG1wM3h4eF9ydGNfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCwgIlJUQyBhbGFybSIsICZwZGV2LT5kZXYpOworCWVyciA9IHJlcXVlc3RfaXJxKHJ0Y19kYXRhLT5pcnFfYWxhcm0sIHN0bXAzeHh4X3J0Y19pbnRlcnJ1cHQsIDAsCisJCQkiUlRDIGFsYXJtIiwgJnBkZXYtPmRldik7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgY2xhaW0gSVJRJWRcbiIsCiAJCQlydGNfZGF0YS0+aXJxX2FsYXJtKTsKIAkJZ290byBvdXRfaXJxX2FsYXJtOwogCX0KLQllcnIgPSByZXF1ZXN0X2lycShydGNfZGF0YS0+aXJxXzFtc2VjLCBzdG1wM3h4eF9ydGNfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCwgIlJUQyB0aWNrIiwgJnBkZXYtPmRldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgY2xhaW0gSVJRJWRcbiIsCi0JCQlydGNfZGF0YS0+aXJxXzFtc2VjKTsKLQkJZ290byBvdXRfaXJxMTsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGNfZGF0YSk7CiAKIAlyZXR1cm4gMDsKIAotb3V0X2lycTE6Ci0JZnJlZV9pcnEocnRjX2RhdGEtPmlycV9hbGFybSwgJnBkZXYtPmRldik7CiBvdXRfaXJxX2FsYXJtOgotCXN0bXAzeHh4X2NsZWFybChCTV9SVENfQ1RSTF9PTkVNU0VDX0lSUV9FTiB8IEJNX1JUQ19DVFJMX0FMQVJNX0lSUV9FTiwKLQkJCXJ0Y19kYXRhLT5pbyArIEhXX1JUQ19DVFJMKTsKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjX2RhdGEtPnJ0Yyk7CiBvdXRfcmVtYXA6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJaW91bm1hcChydGNfZGF0YS0+aW8pOwogb3V0X2ZyZWU6CiAJa2ZyZWUocnRjX2RhdGEpOwpAQCAtMjQ5LDExICsyNTMsMTEgQEAKIHsKIAlzdHJ1Y3Qgc3RtcDN4eHhfcnRjX2RhdGEgKnJ0Y19kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAotCXN0bXAzeHh4X3Jlc2V0X2Jsb2NrKHJ0Y19kYXRhLT5pbywgdHJ1ZSk7Ci0Jc3RtcDN4eHhfY2xlYXJsKEJNX1JUQ19QRVJTSVNURU5UMF9BTEFSTV9FTiB8Ci0JCQlCTV9SVENfUEVSU0lTVEVOVDBfQUxBUk1fV0FLRV9FTiB8Ci0JCQlCTV9SVENfUEVSU0lTVEVOVDBfQUxBUk1fV0FLRSwKLQkJCXJ0Y19kYXRhLT5pbyArIEhXX1JUQ19QRVJTSVNURU5UMCk7CisJbXhzX3Jlc2V0X2Jsb2NrKHJ0Y19kYXRhLT5pbyk7CisJd3JpdGVsKFNUTVAzWFhYX1JUQ19QRVJTSVNURU5UMF9BTEFSTV9FTiB8CisJCQlTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQUxBUk1fV0FLRV9FTiB8CisJCQlTVE1QM1hYWF9SVENfUEVSU0lTVEVOVDBfQUxBUk1fV0FLRSwKKwkJCXJ0Y19kYXRhLT5pbyArIFNUTVAzWFhYX1JUQ19QRVJTSVNURU5UMF9DTFIpOwogCXJldHVybiAwOwogfQogI2Vsc2UKQEAgLTI4Niw1ICsyOTAsNiBAQAogbW9kdWxlX2V4aXQoc3RtcDN4eHhfcnRjX2V4aXQpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNUTVAzeHh4IFJUQyBEcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoImRtaXRyeSBwZXJ2dXNoaW4gPGRwZXJ2dXNoaW5AZW1iZWRkZWRhbGxleS5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJkbWl0cnkgcGVydnVzaGluIDxkcGVydnVzaGluQGVtYmVkZGVkYWxsZXkuY29tPiBhbmQgIgorCQkiV29sZnJhbSBTYW5nIDx3LnNhbmdAcGVuZ3V0cm9uaXguZGU+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdGVncmEuYyBiL2RyaXZlcnMvcnRjL3J0Yy10ZWdyYS5jCmluZGV4IDJmYzMxYWEuLjc1MjU5ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy10ZWdyYS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy10ZWdyYS5jCkBAIC0zNDMsNyArMzQzLDcgQEAKIAogCS8qIHNldCBjb250ZXh0IGluZm8uICovCiAJaW5mby0+cGRldiA9IHBkZXY7Ci0JaW5mby0+dGVncmFfcnRjX2xvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChpbmZvLT50ZWdyYV9ydGNfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmluZm8tPnRlZ3JhX3J0Y19sb2NrKTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdHdsLmMgYi9kcml2ZXJzL3J0Yy9ydGMtdHdsLmMKaW5kZXggZjlhMjc5OS4uOWE4MWY3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXR3bC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy10d2wuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJCWdvdG8gb3V0OwogCiAJc2F2ZV9jb250cm9sICY9IH5CSVRfUlRDX0NUUkxfUkVHX1NUT1BfUlRDX007Ci0JdHdsX3J0Y193cml0ZV91OChzYXZlX2NvbnRyb2wsIFJFR19SVENfQ1RSTF9SRUcpOworCXJldCA9IHR3bF9ydGNfd3JpdGVfdTgoc2F2ZV9jb250cm9sLCBSRUdfUlRDX0NUUkxfUkVHKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy12dDg1MDAuYyBiL2RyaXZlcnMvcnRjL3J0Yy12dDg1MDAuYwppbmRleCBiOGJjODYyLi5mOTNmNDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdnQ4NTAwLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXZ0ODUwMC5jCkBAIC03NCwxMSArNzQsMTIgQEAKICNkZWZpbmUgVlQ4NTAwX1JUQ19DUl9TTV9TRUMJKDEgPDwgMykJLyogMDogMUh6LzYwLCAxOiAxSHogKi8KICNkZWZpbmUgVlQ4NTAwX1JUQ19DUl9DQUxJQgkoMSA8PCA0KQkvKiBFbmFibGUgY2FsaWJyYXRpb24gKi8KIAorI2RlZmluZSBWVDg1MDBfUlRDX0lTX0FMQVJNCSgxIDw8IDApCS8qIEFsYXJtIGludGVycnVwdCBzdGF0dXMgKi8KKwogc3RydWN0IHZ0ODUwMF9ydGMgewogCXZvaWQgX19pb21lbQkJKnJlZ2Jhc2U7CiAJc3RydWN0IHJlc291cmNlCQkqcmVzOwogCWludAkJCWlycV9hbGFybTsKLQlpbnQJCQlpcnFfaHo7CiAJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKIAlzcGlubG9ja190CQlsb2NrOwkJLyogUHJvdGVjdHMgdGhpcyBzdHJ1Y3R1cmUgKi8KIH07CkBAIC05NywxMyArOTgsOSBAQAogCiAJc3Bpbl91bmxvY2soJnZ0ODUwMF9ydGMtPmxvY2spOwogCi0JaWYgKGlzciAmIDEpCisJaWYgKGlzciAmIFZUODUwMF9SVENfSVNfQUxBUk0pCiAJCWV2ZW50cyB8PSBSVENfQUYgfCBSVENfSVJRRjsKIAotCS8qIE9ubHkgc2Vjb25kL21pbnV0ZSBpbnRlcnJ1cHRzIGFyZSBzdXBwb3J0ZWQgKi8KLQlpZiAoaXNyICYgMikKLQkJZXZlbnRzIHw9IFJUQ19VRiB8IFJUQ19JUlFGOwotCiAJcnRjX3VwZGF0ZV9pcnEodnQ4NTAwX3J0Yy0+cnRjLCAxLCBldmVudHMpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMTY2LDggKzE2Myw4IEBACiAJYWxybS0+dGltZS50bV9zZWMgPSBiY2QyYmluKChhbGFybSAmIFRJTUVfU0VDX01BU0spKTsKIAogCWFscm0tPmVuYWJsZWQgPSAoYWxhcm0gJiBBTEFSTV9FTkFCTEVfTUFTSykgPyAxIDogMDsKKwlhbHJtLT5wZW5kaW5nID0gKGlzciAmIFZUODUwMF9SVENfSVNfQUxBUk0pID8gMSA6IDA7CiAKLQlhbHJtLT5wZW5kaW5nID0gKGlzciAmIDEpID8gMSA6IDA7CiAJcmV0dXJuIHJ0Y192YWxpZF90bSgmYWxybS0+dGltZSk7CiB9CiAKQEAgLTE5OSwyNyArMTk2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdnQ4NTAwX3VwZGF0ZV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCi17Ci0Jc3RydWN0IHZ0ODUwMF9ydGMgKnZ0ODUwMF9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBsb25nIHRtcCA9IHJlYWRsKHZ0ODUwMF9ydGMtPnJlZ2Jhc2UgKyBWVDg1MDBfUlRDX0NSKTsKLQotCWlmIChlbmFibGVkKQotCQl0bXAgfD0gVlQ4NTAwX1JUQ19DUl9TTV9TRUMgfCBWVDg1MDBfUlRDX0NSX1NNX0VOQUJMRTsKLQllbHNlCi0JCXRtcCAmPSB+VlQ4NTAwX1JUQ19DUl9TTV9FTkFCTEU7Ci0KLQl3cml0ZWwodG1wLCB2dDg1MDBfcnRjLT5yZWdiYXNlICsgVlQ4NTAwX1JUQ19DUik7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyB2dDg1MDBfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lID0gdnQ4NTAwX3J0Y19yZWFkX3RpbWUsCiAJLnNldF90aW1lID0gdnQ4NTAwX3J0Y19zZXRfdGltZSwKIAkucmVhZF9hbGFybSA9IHZ0ODUwMF9ydGNfcmVhZF9hbGFybSwKIAkuc2V0X2FsYXJtID0gdnQ4NTAwX3J0Y19zZXRfYWxhcm0sCiAJLmFsYXJtX2lycV9lbmFibGUgPSB2dDg1MDBfYWxhcm1faXJxX2VuYWJsZSwKLQkudXBkYXRlX2lycV9lbmFibGUgPSB2dDg1MDBfdXBkYXRlX2lycV9lbmFibGUsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB2dDg1MDBfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0yNDgsMTMgKzIzMCw2IEBACiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCi0JdnQ4NTAwX3J0Yy0+aXJxX2h6ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKLQlpZiAodnQ4NTAwX3J0Yy0+aXJxX2h6IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyAxSHogSVJRIHJlc291cmNlIGRlZmluZWRcbiIpOwotCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gZXJyX2ZyZWU7Ci0JfQotCiAJdnQ4NTAwX3J0Yy0+cmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHZ0ODUwMF9ydGMtPnJlcy0+c3RhcnQsCiAJCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZSh2dDg1MDBfcnRjLT5yZXMpLAogCQkJCQkgICAgICJ2dDg1MDAtcnRjIik7CkBAIC0yNzIsOSArMjQ3LDggQEAKIAkJZ290byBlcnJfcmVsZWFzZTsKIAl9CiAKLQkvKiBFbmFibGUgdGhlIHNlY29uZC9taW51dGUgaW50ZXJydXB0IGdlbmVyYXRpb24gYW5kIGVuYWJsZSBSVEMgKi8KLQl3cml0ZWwoVlQ4NTAwX1JUQ19DUl9FTkFCTEUgfCBWVDg1MDBfUlRDX0NSXzI0SAotCQl8IFZUODUwMF9SVENfQ1JfU01fRU5BQkxFIHwgVlQ4NTAwX1JUQ19DUl9TTV9TRUMsCisJLyogRW5hYmxlIFJUQyBhbmQgc2V0IGl0IHRvIDI0LWhvdXIgbW9kZSAqLworCXdyaXRlbChWVDg1MDBfUlRDX0NSX0VOQUJMRSB8IFZUODUwMF9SVENfQ1JfMjRILAogCSAgICAgICB2dDg1MDBfcnRjLT5yZWdiYXNlICsgVlQ4NTAwX1JUQ19DUik7CiAKIAl2dDg1MDBfcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJ2dDg1MDAtcnRjIiwgJnBkZXYtPmRldiwKQEAgLTI4NiwyNiArMjYwLDE2IEBACiAJCWdvdG8gZXJyX3VubWFwOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKHZ0ODUwMF9ydGMtPmlycV9oeiwgdnQ4NTAwX3J0Y19pcnEsIDAsCi0JCQkgICJydGMgMUh6IiwgdnQ4NTAwX3J0Yyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLAotCQkJdnQ4NTAwX3J0Yy0+aXJxX2h6LCByZXQpOwotCQlnb3RvIGVycl91bnJlZzsKLQl9Ci0KIAlyZXQgPSByZXF1ZXN0X2lycSh2dDg1MDBfcnRjLT5pcnFfYWxhcm0sIHZ0ODUwMF9ydGNfaXJxLCAwLAogCQkJICAicnRjIGFsYXJtIiwgdnQ4NTAwX3J0Yyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLAogCQkJdnQ4NTAwX3J0Yy0+aXJxX2FsYXJtLCByZXQpOwotCQlnb3RvIGVycl9mcmVlX2h6OworCQlnb3RvIGVycl91bnJlZzsKIAl9CiAKIAlyZXR1cm4gMDsKIAotZXJyX2ZyZWVfaHo6Ci0JZnJlZV9pcnEodnQ4NTAwX3J0Yy0+aXJxX2h6LCB2dDg1MDBfcnRjKTsKIGVycl91bnJlZzoKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIodnQ4NTAwX3J0Yy0+cnRjKTsKIGVycl91bm1hcDoKQEAgLTMyMyw3ICsyODcsNiBAQAogCXN0cnVjdCB2dDg1MDBfcnRjICp2dDg1MDBfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlmcmVlX2lycSh2dDg1MDBfcnRjLT5pcnFfYWxhcm0sIHZ0ODUwMF9ydGMpOwotCWZyZWVfaXJxKHZ0ODUwMF9ydGMtPmlycV9oeiwgdnQ4NTAwX3J0Yyk7CiAKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIodnQ4NTAwX3J0Yy0+cnRjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKaW5kZXggODZiNmYxYy4uNDMyNDQ0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgpAQCAtNDUsNiArNDcsNyBAQAogICogU0VDVElPTjogZXhwb3J0ZWQgdmFyaWFibGVzIG9mIGRhc2QuYwogICovCiBkZWJ1Z19pbmZvX3QgKmRhc2RfZGVidWdfYXJlYTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkYXNkX2RlYnVnZnNfcm9vdF9lbnRyeTsKIHN0cnVjdCBkYXNkX2Rpc2NpcGxpbmUgKmRhc2RfZGlhZ19kaXNjaXBsaW5lX3BvaW50ZXI7CiB2b2lkIGRhc2RfaW50X2hhbmRsZXIoc3RydWN0IGNjd19kZXZpY2UgKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGlyYiAqKTsKIApAQCAtNzEsNiArNzQsOCBAQAogc3RhdGljIHZvaWQgZGFzZF9kZXZpY2VfdGltZW91dCh1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyB2b2lkIGRhc2RfYmxvY2tfdGltZW91dCh1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyB2b2lkIF9fZGFzZF9wcm9jZXNzX2VycChzdHJ1Y3QgZGFzZF9kZXZpY2UgKiwgc3RydWN0IGRhc2RfY2N3X3JlcSAqKTsKK3N0YXRpYyB2b2lkIGRhc2RfcHJvZmlsZV9pbml0KHN0cnVjdCBkYXNkX3Byb2ZpbGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyB2b2lkIGRhc2RfcHJvZmlsZV9leGl0KHN0cnVjdCBkYXNkX3Byb2ZpbGUgKik7CiAKIC8qCiAgKiBTRUNUSU9OOiBPcGVyYXRpb25zIG9uIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgpAQCAtMTIxLDcgKzEyNiw3IEBACiAJZGV2aWNlLT5zdGF0ZSA9IERBU0RfU1RBVEVfTkVXOwogCWRldmljZS0+dGFyZ2V0ID0gREFTRF9TVEFURV9ORVc7CiAJbXV0ZXhfaW5pdCgmZGV2aWNlLT5zdGF0ZV9tdXRleCk7Ci0KKwlzcGluX2xvY2tfaW5pdCgmZGV2aWNlLT5wcm9maWxlLmxvY2spOwogCXJldHVybiBkZXZpY2U7CiB9CiAKQEAgLTE1OSw2ICsxNjQsNyBAQAogCWluaXRfdGltZXIoJmJsb2NrLT50aW1lcik7CiAJYmxvY2stPnRpbWVyLmZ1bmN0aW9uID0gZGFzZF9ibG9ja190aW1lb3V0OwogCWJsb2NrLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGJsb2NrOworCXNwaW5fbG9ja19pbml0KCZibG9jay0+cHJvZmlsZS5sb2NrKTsKIAogCXJldHVybiBibG9jazsKIH0KQEAgLTIyMiwxOSArMjI4LDQ0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkYXNkX2RlYnVnZnNfc2V0dXAoY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJIHN0cnVjdCBkZW50cnkgKmJhc2VfZGVudHJ5KQoreworCXN0cnVjdCBkZW50cnkgKnBkZTsKKworCWlmICghYmFzZV9kZW50cnkpCisJCXJldHVybiBOVUxMOworCXBkZSA9IGRlYnVnZnNfY3JlYXRlX2RpcihuYW1lLCBiYXNlX2RlbnRyeSk7CisJaWYgKCFwZGUgfHwgSVNfRVJSKHBkZSkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBwZGU7Cit9CisKIC8qCiAgKiBSZXF1ZXN0IHRoZSBpcnEgbGluZSBmb3IgdGhlIGRldmljZS4KICAqLwogc3RhdGljIGludCBkYXNkX3N0YXRlX2tub3duX3RvX2Jhc2ljKHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlKQogeworCXN0cnVjdCBkYXNkX2Jsb2NrICpibG9jayA9IGRldmljZS0+YmxvY2s7CiAJaW50IHJjOwogCiAJLyogQWxsb2NhdGUgYW5kIHJlZ2lzdGVyIGdlbmRpc2sgc3RydWN0dXJlLiAqLwotCWlmIChkZXZpY2UtPmJsb2NrKSB7Ci0JCXJjID0gZGFzZF9nZW5kaXNrX2FsbG9jKGRldmljZS0+YmxvY2spOworCWlmIChibG9jaykgeworCQlyYyA9IGRhc2RfZ2VuZGlza19hbGxvYyhibG9jayk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKKwkJYmxvY2stPmRlYnVnZnNfZGVudHJ5ID0KKwkJCWRhc2RfZGVidWdmc19zZXR1cChibG9jay0+Z2RwLT5kaXNrX25hbWUsCisJCQkJCSAgIGRhc2RfZGVidWdmc19yb290X2VudHJ5KTsKKwkJZGFzZF9wcm9maWxlX2luaXQoJmJsb2NrLT5wcm9maWxlLCBibG9jay0+ZGVidWdmc19kZW50cnkpOworCQlpZiAoZGFzZF9nbG9iYWxfcHJvZmlsZV9sZXZlbCA9PSBEQVNEX1BST0ZJTEVfT04pCisJCQlkYXNkX3Byb2ZpbGVfb24oJmRldmljZS0+YmxvY2stPnByb2ZpbGUpOwogCX0KKwlkZXZpY2UtPmRlYnVnZnNfZGVudHJ5ID0KKwkJZGFzZF9kZWJ1Z2ZzX3NldHVwKGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksCisJCQkJICAgZGFzZF9kZWJ1Z2ZzX3Jvb3RfZW50cnkpOworCWRhc2RfcHJvZmlsZV9pbml0KCZkZXZpY2UtPnByb2ZpbGUsIGRldmljZS0+ZGVidWdmc19kZW50cnkpOworCiAJLyogcmVnaXN0ZXIgJ2RldmljZScgZGVidWcgYXJlYSwgdXNlZCBmb3IgYWxsIERCRl9ERVZfWFhYIGNhbGxzICovCiAJZGV2aWNlLT5kZWJ1Z19hcmVhID0gZGVidWdfcmVnaXN0ZXIoZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgNCwgMSwKIAkJCQkJICAgIDggKiBzaXplb2YobG9uZykpOwpAQCAtMjUzLDYgKzI4NCw5IEBACiB7CiAJaW50IHJjOwogCWlmIChkZXZpY2UtPmJsb2NrKSB7CisJCWRhc2RfcHJvZmlsZV9leGl0KCZkZXZpY2UtPmJsb2NrLT5wcm9maWxlKTsKKwkJaWYgKGRldmljZS0+YmxvY2stPmRlYnVnZnNfZGVudHJ5KQorCQkJZGVidWdmc19yZW1vdmUoZGV2aWNlLT5ibG9jay0+ZGVidWdmc19kZW50cnkpOwogCQlkYXNkX2dlbmRpc2tfZnJlZShkZXZpY2UtPmJsb2NrKTsKIAkJZGFzZF9ibG9ja19jbGVhcl90aW1lcihkZXZpY2UtPmJsb2NrKTsKIAl9CkBAIC0yNjAsNiArMjk0LDkgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAlkYXNkX2RldmljZV9jbGVhcl90aW1lcihkZXZpY2UpOworCWRhc2RfcHJvZmlsZV9leGl0KCZkZXZpY2UtPnByb2ZpbGUpOworCWlmIChkZXZpY2UtPmRlYnVnZnNfZGVudHJ5KQorCQlkZWJ1Z2ZzX3JlbW92ZShkZXZpY2UtPmRlYnVnZnNfZGVudHJ5KTsKIAogCURCRl9ERVZfRVZFTlQoREJGX0VNRVJHLCBkZXZpY2UsICIlcCBkZWJ1ZyBhcmVhIGRlbGV0ZWQiLCBkZXZpY2UpOwogCWlmIChkZXZpY2UtPmRlYnVnX2FyZWEgIT0gTlVMTCkgewpAQCAtNjA5LDIxICs2NDYsMTMgQEAKIC8qCiAgKiBTRUNUSU9OOiBkZXZpY2Ugb3BlcmF0aW9uIChpbnRlcnJ1cHQgaGFuZGxlciwgc3RhcnQgaS9vLCB0ZXJtIGkvbyAuLi4pCiAgKi8KKwordW5zaWduZWQgaW50IGRhc2RfZ2xvYmFsX3Byb2ZpbGVfbGV2ZWwgPSBEQVNEX1BST0ZJTEVfT0ZGOworCiAjaWZkZWYgQ09ORklHX0RBU0RfUFJPRklMRQotCi1zdHJ1Y3QgZGFzZF9wcm9maWxlX2luZm9fdCBkYXNkX2dsb2JhbF9wcm9maWxlOwotdW5zaWduZWQgaW50IGRhc2RfcHJvZmlsZV9sZXZlbCA9IERBU0RfUFJPRklMRV9PRkY7Ci0KLS8qCi0gKiBJbmNyZW1lbnRzIGNvdW50ZXIgaW4gZ2xvYmFsIGFuZCBsb2NhbCBwcm9maWxpbmcgc3RydWN0dXJlcy4KLSAqLwotI2RlZmluZSBkYXNkX3Byb2ZpbGVfY291bnRlcih2YWx1ZSwgY291bnRlciwgYmxvY2spIFwKLXsgXAotCWludCBpbmRleDsgXAotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDMxICYmIHZhbHVlID4+ICgyK2luZGV4KTsgaW5kZXgrKyk7IFwKLQlkYXNkX2dsb2JhbF9wcm9maWxlLmNvdW50ZXJbaW5kZXhdKys7IFwKLQlibG9jay0+cHJvZmlsZS5jb3VudGVyW2luZGV4XSsrOyBcCi19CitzdHJ1Y3QgZGFzZF9wcm9maWxlX2luZm8gZGFzZF9nbG9iYWxfcHJvZmlsZV9kYXRhOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRhc2RfZ2xvYmFsX3Byb2ZpbGVfZGVudHJ5Oworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRhc2RfZGVidWdmc19nbG9iYWxfZW50cnk7CiAKIC8qCiAgKiBBZGQgcHJvZmlsaW5nIGluZm9ybWF0aW9uIGZvciBjcXIgYmVmb3JlIGV4ZWN1dGlvbi4KQEAgLTYzNCwzMCArNjYzLDEyMSBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgKmw7CiAJdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0KLQlpZiAoZGFzZF9wcm9maWxlX2xldmVsICE9IERBU0RfUFJPRklMRV9PTikKLQkJcmV0dXJuOworCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOwogCiAJLyogY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgY2hhbnEgZm9yIHN0YXRpc3RpY3MgKi8KIAljb3VudGVyID0gMDsKLQlsaXN0X2Zvcl9lYWNoKGwsICZibG9jay0+Y2N3X3F1ZXVlKQotCQlpZiAoKytjb3VudGVyID49IDMxKQotCQkJYnJlYWs7Ci0JZGFzZF9nbG9iYWxfcHJvZmlsZS5kYXNkX2lvX25yX3JlcVtjb3VudGVyXSsrOwotCWJsb2NrLT5wcm9maWxlLmRhc2RfaW9fbnJfcmVxW2NvdW50ZXJdKys7CisJaWYgKGRhc2RfZ2xvYmFsX3Byb2ZpbGVfbGV2ZWwgfHwgYmxvY2stPnByb2ZpbGUuZGF0YSkKKwkJbGlzdF9mb3JfZWFjaChsLCAmYmxvY2stPmNjd19xdWV1ZSkKKwkJCWlmICgrK2NvdW50ZXIgPj0gMzEpCisJCQkJYnJlYWs7CisKKwlpZiAoZGFzZF9nbG9iYWxfcHJvZmlsZV9sZXZlbCkgeworCQlkYXNkX2dsb2JhbF9wcm9maWxlX2RhdGEuZGFzZF9pb19ucl9yZXFbY291bnRlcl0rKzsKKwkJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkKKwkJCWRhc2RfZ2xvYmFsX3Byb2ZpbGVfZGF0YS5kYXNkX3JlYWRfbnJfcmVxW2NvdW50ZXJdKys7CisJfQorCisJc3Bpbl9sb2NrKCZibG9jay0+cHJvZmlsZS5sb2NrKTsKKwlpZiAoYmxvY2stPnByb2ZpbGUuZGF0YSkKKwkJYmxvY2stPnByb2ZpbGUuZGF0YS0+ZGFzZF9pb19ucl9yZXFbY291bnRlcl0rKzsKKwkJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkKKwkJCWJsb2NrLT5wcm9maWxlLmRhdGEtPmRhc2RfcmVhZF9ucl9yZXFbY291bnRlcl0rKzsKKwlzcGluX3VubG9jaygmYmxvY2stPnByb2ZpbGUubG9jayk7CisKKwkvKgorCSAqIFdlIGNvdW50IHRoZSByZXF1ZXN0IGZvciB0aGUgc3RhcnQgZGV2aWNlLCBldmVuIHRob3VnaCBpdCBtYXkgcnVuIG9uCisJICogc29tZSBvdGhlciBkZXZpY2UgZHVlIHRvIGVycm9yIHJlY292ZXJ5LiBUaGlzIHdheSB3ZSBtYWtlIHN1cmUgdGhhdAorCSAqIHdlIGNvdW50IGVhY2ggcmVxdWVzdCBvbmx5IG9uY2UuCisJICovCisJZGV2aWNlID0gY3FyLT5zdGFydGRldjsKKwlpZiAoZGV2aWNlLT5wcm9maWxlLmRhdGEpIHsKKwkJY291bnRlciA9IDE7IC8qIHJlcXVlc3QgaXMgbm90IHlldCBxdWV1ZWQgb24gdGhlIHN0YXJ0IGRldmljZSAqLworCQlsaXN0X2Zvcl9lYWNoKGwsICZkZXZpY2UtPmNjd19xdWV1ZSkKKwkJCWlmICgrK2NvdW50ZXIgPj0gMzEpCisJCQkJYnJlYWs7CisJfQorCXNwaW5fbG9jaygmZGV2aWNlLT5wcm9maWxlLmxvY2spOworCWlmIChkZXZpY2UtPnByb2ZpbGUuZGF0YSkgeworCQlkZXZpY2UtPnByb2ZpbGUuZGF0YS0+ZGFzZF9pb19ucl9yZXFbY291bnRlcl0rKzsKKwkJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkKKwkJCWRldmljZS0+cHJvZmlsZS5kYXRhLT5kYXNkX3JlYWRfbnJfcmVxW2NvdW50ZXJdKys7CisJfQorCXNwaW5fdW5sb2NrKCZkZXZpY2UtPnByb2ZpbGUubG9jayk7CiB9CiAKIC8qCiAgKiBBZGQgcHJvZmlsaW5nIGluZm9ybWF0aW9uIGZvciBjcXIgYWZ0ZXIgZXhlY3V0aW9uLgogICovCisKKyNkZWZpbmUgZGFzZF9wcm9maWxlX2NvdW50ZXIodmFsdWUsIGluZGV4KQkJCSAgIFwKK3sJCQkJCQkJCSAgIFwKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAzMSAmJiB2YWx1ZSA+PiAoMitpbmRleCk7IGluZGV4KyspIFwKKwkJOwkJCQkJCSAgIFwKK30KKworc3RhdGljIHZvaWQgZGFzZF9wcm9maWxlX2VuZF9hZGRfZGF0YShzdHJ1Y3QgZGFzZF9wcm9maWxlX2luZm8gKmRhdGEsCisJCQkJICAgICAgaW50IGlzX2FsaWFzLAorCQkJCSAgICAgIGludCBpc190cG0sCisJCQkJICAgICAgaW50IGlzX3JlYWQsCisJCQkJICAgICAgbG9uZyBzZWN0b3JzLAorCQkJCSAgICAgIGludCBzZWN0b3JzX2luZCwKKwkJCQkgICAgICBpbnQgdG90dGltZV9pbmQsCisJCQkJICAgICAgaW50IHRvdHRpbWVwc19pbmQsCisJCQkJICAgICAgaW50IHN0cnRpbWVfaW5kLAorCQkJCSAgICAgIGludCBpcnF0aW1lX2luZCwKKwkJCQkgICAgICBpbnQgaXJxdGltZXBzX2luZCwKKwkJCQkgICAgICBpbnQgZW5kdGltZV9pbmQpCit7CisJLyogaW4gY2FzZSBvZiBhbiBvdmVyZmxvdywgcmVzZXQgdGhlIHdob2xlIHByb2ZpbGUgKi8KKwlpZiAoZGF0YS0+ZGFzZF9pb19yZXFzID09IFVJTlRfTUFYKSB7CisJCQltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisJCQlnZXRuc3RpbWVvZmRheSgmZGF0YS0+c3RhcnR0b2QpOworCX0KKwlkYXRhLT5kYXNkX2lvX3JlcXMrKzsKKwlkYXRhLT5kYXNkX2lvX3NlY3RzICs9IHNlY3RvcnM7CisJaWYgKGlzX2FsaWFzKQorCQlkYXRhLT5kYXNkX2lvX2FsaWFzKys7CisJaWYgKGlzX3RwbSkKKwkJZGF0YS0+ZGFzZF9pb190cG0rKzsKKworCWRhdGEtPmRhc2RfaW9fc2Vjc1tzZWN0b3JzX2luZF0rKzsKKwlkYXRhLT5kYXNkX2lvX3RpbWVzW3RvdHRpbWVfaW5kXSsrOworCWRhdGEtPmRhc2RfaW9fdGltcHNbdG90dGltZXBzX2luZF0rKzsKKwlkYXRhLT5kYXNkX2lvX3RpbWUxW3N0cnRpbWVfaW5kXSsrOworCWRhdGEtPmRhc2RfaW9fdGltZTJbaXJxdGltZV9pbmRdKys7CisJZGF0YS0+ZGFzZF9pb190aW1lMnBzW2lycXRpbWVwc19pbmRdKys7CisJZGF0YS0+ZGFzZF9pb190aW1lM1tlbmR0aW1lX2luZF0rKzsKKworCWlmIChpc19yZWFkKSB7CisJCWRhdGEtPmRhc2RfcmVhZF9yZXFzKys7CisJCWRhdGEtPmRhc2RfcmVhZF9zZWN0cyArPSBzZWN0b3JzOworCQlpZiAoaXNfYWxpYXMpCisJCQlkYXRhLT5kYXNkX3JlYWRfYWxpYXMrKzsKKwkJaWYgKGlzX3RwbSkKKwkJCWRhdGEtPmRhc2RfcmVhZF90cG0rKzsKKwkJZGF0YS0+ZGFzZF9yZWFkX3NlY3Nbc2VjdG9yc19pbmRdKys7CisJCWRhdGEtPmRhc2RfcmVhZF90aW1lc1t0b3R0aW1lX2luZF0rKzsKKwkJZGF0YS0+ZGFzZF9yZWFkX3RpbWUxW3N0cnRpbWVfaW5kXSsrOworCQlkYXRhLT5kYXNkX3JlYWRfdGltZTJbaXJxdGltZV9pbmRdKys7CisJCWRhdGEtPmRhc2RfcmVhZF90aW1lM1tlbmR0aW1lX2luZF0rKzsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGRhc2RfcHJvZmlsZV9lbmQoc3RydWN0IGRhc2RfYmxvY2sgKmJsb2NrLAogCQkJICAgICBzdHJ1Y3QgZGFzZF9jY3dfcmVxICpjcXIsCiAJCQkgICAgIHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7CiAJbG9uZyBzdHJ0aW1lLCBpcnF0aW1lLCBlbmR0aW1lLCB0b3R0aW1lOwkvKiBpbiBtaWNyb3NlY29uZHMgKi8KIAlsb25nIHRvdHRpbWVwcywgc2VjdG9yczsKKwlzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZTsKKwlpbnQgc2VjdG9yc19pbmQsIHRvdHRpbWVfaW5kLCB0b3R0aW1lcHNfaW5kLCBzdHJ0aW1lX2luZDsKKwlpbnQgaXJxdGltZV9pbmQsIGlycXRpbWVwc19pbmQsIGVuZHRpbWVfaW5kOwogCi0JaWYgKGRhc2RfcHJvZmlsZV9sZXZlbCAhPSBEQVNEX1BST0ZJTEVfT04pCisJZGV2aWNlID0gY3FyLT5zdGFydGRldjsKKwlpZiAoIShkYXNkX2dsb2JhbF9wcm9maWxlX2xldmVsIHx8CisJICAgICAgYmxvY2stPnByb2ZpbGUuZGF0YSB8fAorCSAgICAgIGRldmljZS0+cHJvZmlsZS5kYXRhKSkKIAkJcmV0dXJuOwogCiAJc2VjdG9ycyA9IGJsa19ycV9zZWN0b3JzKHJlcSk7CkBAIC02NzIsMjkgKzc5MiwzOTIgQEAKIAl0b3R0aW1lID0gKChjcXItPmVuZGNsayAtIGNxci0+YnVpbGRjbGspID4+IDEyKTsKIAl0b3R0aW1lcHMgPSB0b3R0aW1lIC8gc2VjdG9yczsKIAotCWlmICghZGFzZF9nbG9iYWxfcHJvZmlsZS5kYXNkX2lvX3JlcXMpCi0JCW1lbXNldCgmZGFzZF9nbG9iYWxfcHJvZmlsZSwgMCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGFzZF9wcm9maWxlX2luZm9fdCkpOwotCWRhc2RfZ2xvYmFsX3Byb2ZpbGUuZGFzZF9pb19yZXFzKys7Ci0JZGFzZF9nbG9iYWxfcHJvZmlsZS5kYXNkX2lvX3NlY3RzICs9IHNlY3RvcnM7CisJZGFzZF9wcm9maWxlX2NvdW50ZXIoc2VjdG9ycywgc2VjdG9yc19pbmQpOworCWRhc2RfcHJvZmlsZV9jb3VudGVyKHRvdHRpbWUsIHRvdHRpbWVfaW5kKTsKKwlkYXNkX3Byb2ZpbGVfY291bnRlcih0b3R0aW1lcHMsIHRvdHRpbWVwc19pbmQpOworCWRhc2RfcHJvZmlsZV9jb3VudGVyKHN0cnRpbWUsIHN0cnRpbWVfaW5kKTsKKwlkYXNkX3Byb2ZpbGVfY291bnRlcihpcnF0aW1lLCBpcnF0aW1lX2luZCk7CisJZGFzZF9wcm9maWxlX2NvdW50ZXIoaXJxdGltZSAvIHNlY3RvcnMsIGlycXRpbWVwc19pbmQpOworCWRhc2RfcHJvZmlsZV9jb3VudGVyKGVuZHRpbWUsIGVuZHRpbWVfaW5kKTsKIAotCWlmICghYmxvY2stPnByb2ZpbGUuZGFzZF9pb19yZXFzKQotCQltZW1zZXQoJmJsb2NrLT5wcm9maWxlLCAwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkYXNkX3Byb2ZpbGVfaW5mb190KSk7Ci0JYmxvY2stPnByb2ZpbGUuZGFzZF9pb19yZXFzKys7Ci0JYmxvY2stPnByb2ZpbGUuZGFzZF9pb19zZWN0cyArPSBzZWN0b3JzOworCWlmIChkYXNkX2dsb2JhbF9wcm9maWxlX2xldmVsKSB7CisJCWRhc2RfcHJvZmlsZV9lbmRfYWRkX2RhdGEoJmRhc2RfZ2xvYmFsX3Byb2ZpbGVfZGF0YSwKKwkJCQkJICBjcXItPnN0YXJ0ZGV2ICE9IGJsb2NrLT5iYXNlLAorCQkJCQkgIGNxci0+Y3Btb2RlID09IDEsCisJCQkJCSAgcnFfZGF0YV9kaXIocmVxKSA9PSBSRUFELAorCQkJCQkgIHNlY3RvcnMsIHNlY3RvcnNfaW5kLCB0b3R0aW1lX2luZCwKKwkJCQkJICB0b3R0aW1lcHNfaW5kLCBzdHJ0aW1lX2luZCwKKwkJCQkJICBpcnF0aW1lX2luZCwgaXJxdGltZXBzX2luZCwKKwkJCQkJICBlbmR0aW1lX2luZCk7CisJfQogCi0JZGFzZF9wcm9maWxlX2NvdW50ZXIoc2VjdG9ycywgZGFzZF9pb19zZWNzLCBibG9jayk7Ci0JZGFzZF9wcm9maWxlX2NvdW50ZXIodG90dGltZSwgZGFzZF9pb190aW1lcywgYmxvY2spOwotCWRhc2RfcHJvZmlsZV9jb3VudGVyKHRvdHRpbWVwcywgZGFzZF9pb190aW1wcywgYmxvY2spOwotCWRhc2RfcHJvZmlsZV9jb3VudGVyKHN0cnRpbWUsIGRhc2RfaW9fdGltZTEsIGJsb2NrKTsKLQlkYXNkX3Byb2ZpbGVfY291bnRlcihpcnF0aW1lLCBkYXNkX2lvX3RpbWUyLCBibG9jayk7Ci0JZGFzZF9wcm9maWxlX2NvdW50ZXIoaXJxdGltZSAvIHNlY3RvcnMsIGRhc2RfaW9fdGltZTJwcywgYmxvY2spOwotCWRhc2RfcHJvZmlsZV9jb3VudGVyKGVuZHRpbWUsIGRhc2RfaW9fdGltZTMsIGJsb2NrKTsKKwlzcGluX2xvY2soJmJsb2NrLT5wcm9maWxlLmxvY2spOworCWlmIChibG9jay0+cHJvZmlsZS5kYXRhKQorCQlkYXNkX3Byb2ZpbGVfZW5kX2FkZF9kYXRhKGJsb2NrLT5wcm9maWxlLmRhdGEsCisJCQkJCSAgY3FyLT5zdGFydGRldiAhPSBibG9jay0+YmFzZSwKKwkJCQkJICBjcXItPmNwbW9kZSA9PSAxLAorCQkJCQkgIHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCwKKwkJCQkJICBzZWN0b3JzLCBzZWN0b3JzX2luZCwgdG90dGltZV9pbmQsCisJCQkJCSAgdG90dGltZXBzX2luZCwgc3RydGltZV9pbmQsCisJCQkJCSAgaXJxdGltZV9pbmQsIGlycXRpbWVwc19pbmQsCisJCQkJCSAgZW5kdGltZV9pbmQpOworCXNwaW5fdW5sb2NrKCZibG9jay0+cHJvZmlsZS5sb2NrKTsKKworCXNwaW5fbG9jaygmZGV2aWNlLT5wcm9maWxlLmxvY2spOworCWlmIChkZXZpY2UtPnByb2ZpbGUuZGF0YSkKKwkJZGFzZF9wcm9maWxlX2VuZF9hZGRfZGF0YShkZXZpY2UtPnByb2ZpbGUuZGF0YSwKKwkJCQkJICBjcXItPnN0YXJ0ZGV2ICE9IGJsb2NrLT5iYXNlLAorCQkJCQkgIGNxci0+Y3Btb2RlID09IDEsCisJCQkJCSAgcnFfZGF0YV9kaXIocmVxKSA9PSBSRUFELAorCQkJCQkgIHNlY3RvcnMsIHNlY3RvcnNfaW5kLCB0b3R0aW1lX2luZCwKKwkJCQkJICB0b3R0aW1lcHNfaW5kLCBzdHJ0aW1lX2luZCwKKwkJCQkJICBpcnF0aW1lX2luZCwgaXJxdGltZXBzX2luZCwKKwkJCQkJICBlbmR0aW1lX2luZCk7CisJc3Bpbl91bmxvY2soJmRldmljZS0+cHJvZmlsZS5sb2NrKTsKIH0KKwordm9pZCBkYXNkX3Byb2ZpbGVfcmVzZXQoc3RydWN0IGRhc2RfcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwlzdHJ1Y3QgZGFzZF9wcm9maWxlX2luZm8gKmRhdGE7CisKKwlzcGluX2xvY2tfYmgoJnByb2ZpbGUtPmxvY2spOworCWRhdGEgPSBwcm9maWxlLT5kYXRhOworCWlmICghZGF0YSkgeworCQlzcGluX3VubG9ja19iaCgmcHJvZmlsZS0+bG9jayk7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZigqZGF0YSkpOworCWdldG5zdGltZW9mZGF5KCZkYXRhLT5zdGFydHRvZCk7CisJc3Bpbl91bmxvY2tfYmgoJnByb2ZpbGUtPmxvY2spOworfQorCit2b2lkIGRhc2RfZ2xvYmFsX3Byb2ZpbGVfcmVzZXQodm9pZCkKK3sKKwltZW1zZXQoJmRhc2RfZ2xvYmFsX3Byb2ZpbGVfZGF0YSwgMCwgc2l6ZW9mKGRhc2RfZ2xvYmFsX3Byb2ZpbGVfZGF0YSkpOworCWdldG5zdGltZW9mZGF5KCZkYXNkX2dsb2JhbF9wcm9maWxlX2RhdGEuc3RhcnR0b2QpOworfQorCitpbnQgZGFzZF9wcm9maWxlX29uKHN0cnVjdCBkYXNkX3Byb2ZpbGUgKnByb2ZpbGUpCit7CisJc3RydWN0IGRhc2RfcHJvZmlsZV9pbmZvICpkYXRhOworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzcGluX2xvY2tfYmgoJnByb2ZpbGUtPmxvY2spOworCWlmIChwcm9maWxlLT5kYXRhKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZwcm9maWxlLT5sb2NrKTsKKwkJa2ZyZWUoZGF0YSk7CisJCXJldHVybiAwOworCX0KKwlnZXRuc3RpbWVvZmRheSgmZGF0YS0+c3RhcnR0b2QpOworCXByb2ZpbGUtPmRhdGEgPSBkYXRhOworCXNwaW5fdW5sb2NrX2JoKCZwcm9maWxlLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkYXNkX3Byb2ZpbGVfb2ZmKHN0cnVjdCBkYXNkX3Byb2ZpbGUgKnByb2ZpbGUpCit7CisJc3Bpbl9sb2NrX2JoKCZwcm9maWxlLT5sb2NrKTsKKwlrZnJlZShwcm9maWxlLT5kYXRhKTsKKwlwcm9maWxlLT5kYXRhID0gTlVMTDsKKwlzcGluX3VubG9ja19iaCgmcHJvZmlsZS0+bG9jayk7Cit9CisKK2NoYXIgKmRhc2RfZ2V0X3VzZXJfc3RyaW5nKGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IHVzZXJfbGVuKQoreworCWNoYXIgKmJ1ZmZlcjsKKworCWJ1ZmZlciA9IGttYWxsb2ModXNlcl9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmZmVyID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmIChjb3B5X2Zyb21fdXNlcihidWZmZXIsIHVzZXJfYnVmLCB1c2VyX2xlbikgIT0gMCkgeworCQlrZnJlZShidWZmZXIpOworCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwl9CisJLyogZ290IHRoZSBzdHJpbmcsIG5vdyBzdHJpcCBsaW5lZmVlZC4gKi8KKwlpZiAoYnVmZmVyW3VzZXJfbGVuIC0gMV0gPT0gJ1xuJykKKwkJYnVmZmVyW3VzZXJfbGVuIC0gMV0gPSAwOworCWVsc2UKKwkJYnVmZmVyW3VzZXJfbGVuXSA9IDA7CisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIHNzaXplX3QgZGFzZF9zdGF0c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJc2l6ZV90IHVzZXJfbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwljaGFyICpidWZmZXIsICpzdHI7CisJaW50IHJjOworCXN0cnVjdCBzZXFfZmlsZSAqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRhc2RfcHJvZmlsZSAqcHJvZiA9IG0tPnByaXZhdGU7CisKKwlpZiAodXNlcl9sZW4gPiA2NTUzNikKKwkJdXNlcl9sZW4gPSA2NTUzNjsKKwlidWZmZXIgPSBkYXNkX2dldF91c2VyX3N0cmluZyh1c2VyX2J1ZiwgdXNlcl9sZW4pOworCWlmIChJU19FUlIoYnVmZmVyKSkKKwkJcmV0dXJuIFBUUl9FUlIoYnVmZmVyKTsKKworCXN0ciA9IHNraXBfc3BhY2VzKGJ1ZmZlcik7CisJcmMgPSB1c2VyX2xlbjsKKwlpZiAoc3RybmNtcChzdHIsICJyZXNldCIsIDUpID09IDApIHsKKwkJZGFzZF9wcm9maWxlX3Jlc2V0KHByb2YpOworCX0gZWxzZSBpZiAoc3RybmNtcChzdHIsICJvbiIsIDIpID09IDApIHsKKwkJcmMgPSBkYXNkX3Byb2ZpbGVfb24ocHJvZik7CisJCWlmICghcmMpCisJCQlyYyA9IHVzZXJfbGVuOworCX0gZWxzZSBpZiAoc3RybmNtcChzdHIsICJvZmYiLCAzKSA9PSAwKSB7CisJCWRhc2RfcHJvZmlsZV9vZmYocHJvZik7CisJfSBlbHNlCisJCXJjID0gLUVJTlZBTDsKKwlrZnJlZShidWZmZXIpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZGFzZF9zdGF0c19hcnJheShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHVuc2lnbmVkIGludCAqYXJyYXkpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJc2VxX3ByaW50ZihtLCAiJXUgIiwgYXJyYXlbaV0pOworCXNlcV9wdXRjKG0sICdcbicpOworfQorCitzdGF0aWMgdm9pZCBkYXNkX3N0YXRzX3NlcV9wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCisJCQkJIHN0cnVjdCBkYXNkX3Byb2ZpbGVfaW5mbyAqZGF0YSkKK3sKKwlzZXFfcHJpbnRmKG0sICJzdGFydF90aW1lICVsZC4lMDlsZFxuIiwKKwkJICAgZGF0YS0+c3RhcnR0b2QudHZfc2VjLCBkYXRhLT5zdGFydHRvZC50dl9uc2VjKTsKKwlzZXFfcHJpbnRmKG0sICJ0b3RhbF9yZXF1ZXN0cyAldVxuIiwgZGF0YS0+ZGFzZF9pb19yZXFzKTsKKwlzZXFfcHJpbnRmKG0sICJ0b3RhbF9zZWN0b3JzICV1XG4iLCBkYXRhLT5kYXNkX2lvX3NlY3RzKTsKKwlzZXFfcHJpbnRmKG0sICJ0b3RhbF9wYXYgJXVcbiIsIGRhdGEtPmRhc2RfaW9fYWxpYXMpOworCXNlcV9wcmludGYobSwgInRvdGFsX2hwZiAldVxuIiwgZGF0YS0+ZGFzZF9pb190cG0pOworCXNlcV9wcmludGYobSwgImhpc3RvZ3JhbV9zZWN0b3JzICIpOworCWRhc2Rfc3RhdHNfYXJyYXkobSwgZGF0YS0+ZGFzZF9pb19zZWNzKTsKKwlzZXFfcHJpbnRmKG0sICJoaXN0b2dyYW1faW9fdGltZXMgIik7CisJZGFzZF9zdGF0c19hcnJheShtLCBkYXRhLT5kYXNkX2lvX3RpbWVzKTsKKwlzZXFfcHJpbnRmKG0sICJoaXN0b2dyYW1faW9fdGltZXNfd2VpZ2h0ZWQgIik7CisJZGFzZF9zdGF0c19hcnJheShtLCBkYXRhLT5kYXNkX2lvX3RpbXBzKTsKKwlzZXFfcHJpbnRmKG0sICJoaXN0b2dyYW1fdGltZV9idWlsZF90b19zc2NoICIpOworCWRhc2Rfc3RhdHNfYXJyYXkobSwgZGF0YS0+ZGFzZF9pb190aW1lMSk7CisJc2VxX3ByaW50ZihtLCAiaGlzdG9ncmFtX3RpbWVfc3NjaF90b19pcnEgIik7CisJZGFzZF9zdGF0c19hcnJheShtLCBkYXRhLT5kYXNkX2lvX3RpbWUyKTsKKwlzZXFfcHJpbnRmKG0sICJoaXN0b2dyYW1fdGltZV9zc2NoX3RvX2lycV93ZWlnaHRlZCAiKTsKKwlkYXNkX3N0YXRzX2FycmF5KG0sIGRhdGEtPmRhc2RfaW9fdGltZTJwcyk7CisJc2VxX3ByaW50ZihtLCAiaGlzdG9ncmFtX3RpbWVfaXJxX3RvX2VuZCAiKTsKKwlkYXNkX3N0YXRzX2FycmF5KG0sIGRhdGEtPmRhc2RfaW9fdGltZTMpOworCXNlcV9wcmludGYobSwgImhpc3RvZ3JhbV9jY3dfcXVldWVfbGVuZ3RoICIpOworCWRhc2Rfc3RhdHNfYXJyYXkobSwgZGF0YS0+ZGFzZF9pb19ucl9yZXEpOworCXNlcV9wcmludGYobSwgInRvdGFsX3JlYWRfcmVxdWVzdHMgJXVcbiIsIGRhdGEtPmRhc2RfcmVhZF9yZXFzKTsKKwlzZXFfcHJpbnRmKG0sICJ0b3RhbF9yZWFkX3NlY3RvcnMgJXVcbiIsIGRhdGEtPmRhc2RfcmVhZF9zZWN0cyk7CisJc2VxX3ByaW50ZihtLCAidG90YWxfcmVhZF9wYXYgJXVcbiIsIGRhdGEtPmRhc2RfcmVhZF9hbGlhcyk7CisJc2VxX3ByaW50ZihtLCAidG90YWxfcmVhZF9ocGYgJXVcbiIsIGRhdGEtPmRhc2RfcmVhZF90cG0pOworCXNlcV9wcmludGYobSwgImhpc3RvZ3JhbV9yZWFkX3NlY3RvcnMgIik7CisJZGFzZF9zdGF0c19hcnJheShtLCBkYXRhLT5kYXNkX3JlYWRfc2Vjcyk7CisJc2VxX3ByaW50ZihtLCAiaGlzdG9ncmFtX3JlYWRfdGltZXMgIik7CisJZGFzZF9zdGF0c19hcnJheShtLCBkYXRhLT5kYXNkX3JlYWRfdGltZXMpOworCXNlcV9wcmludGYobSwgImhpc3RvZ3JhbV9yZWFkX3RpbWVfYnVpbGRfdG9fc3NjaCAiKTsKKwlkYXNkX3N0YXRzX2FycmF5KG0sIGRhdGEtPmRhc2RfcmVhZF90aW1lMSk7CisJc2VxX3ByaW50ZihtLCAiaGlzdG9ncmFtX3JlYWRfdGltZV9zc2NoX3RvX2lycSAiKTsKKwlkYXNkX3N0YXRzX2FycmF5KG0sIGRhdGEtPmRhc2RfcmVhZF90aW1lMik7CisJc2VxX3ByaW50ZihtLCAiaGlzdG9ncmFtX3JlYWRfdGltZV9pcnFfdG9fZW5kICIpOworCWRhc2Rfc3RhdHNfYXJyYXkobSwgZGF0YS0+ZGFzZF9yZWFkX3RpbWUzKTsKKwlzZXFfcHJpbnRmKG0sICJoaXN0b2dyYW1fcmVhZF9jY3dfcXVldWVfbGVuZ3RoICIpOworCWRhc2Rfc3RhdHNfYXJyYXkobSwgZGF0YS0+ZGFzZF9yZWFkX25yX3JlcSk7Cit9CisKK3N0YXRpYyBpbnQgZGFzZF9zdGF0c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgZGFzZF9wcm9maWxlICpwcm9maWxlOworCXN0cnVjdCBkYXNkX3Byb2ZpbGVfaW5mbyAqZGF0YTsKKworCXByb2ZpbGUgPSBtLT5wcml2YXRlOworCXNwaW5fbG9ja19iaCgmcHJvZmlsZS0+bG9jayk7CisJZGF0YSA9IHByb2ZpbGUtPmRhdGE7CisJaWYgKCFkYXRhKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZwcm9maWxlLT5sb2NrKTsKKwkJc2VxX3ByaW50ZihtLCAiZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZGFzZF9zdGF0c19zZXFfcHJpbnQobSwgZGF0YSk7CisJc3Bpbl91bmxvY2tfYmgoJnByb2ZpbGUtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhc2Rfc3RhdHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGFzZF9wcm9maWxlICpwcm9maWxlID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGFzZF9zdGF0c19zaG93LCBwcm9maWxlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGFzZF9zdGF0c19yYXdfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gZGFzZF9zdGF0c19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLndyaXRlCQk9IGRhc2Rfc3RhdHNfd3JpdGUsCit9OworCitzdGF0aWMgc3NpemVfdCBkYXNkX3N0YXRzX2dsb2JhbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgICAgICBzaXplX3QgdXNlcl9sZW4sIGxvZmZfdCAqcG9zKQoreworCWNoYXIgKmJ1ZmZlciwgKnN0cjsKKwlzc2l6ZV90IHJjOworCisJaWYgKHVzZXJfbGVuID4gNjU1MzYpCisJCXVzZXJfbGVuID0gNjU1MzY7CisJYnVmZmVyID0gZGFzZF9nZXRfdXNlcl9zdHJpbmcodXNlcl9idWYsIHVzZXJfbGVuKTsKKwlpZiAoSVNfRVJSKGJ1ZmZlcikpCisJCXJldHVybiBQVFJfRVJSKGJ1ZmZlcik7CisJc3RyID0gc2tpcF9zcGFjZXMoYnVmZmVyKTsKKwlyYyA9IHVzZXJfbGVuOworCWlmIChzdHJuY21wKHN0ciwgInJlc2V0IiwgNSkgPT0gMCkgeworCQlkYXNkX2dsb2JhbF9wcm9maWxlX3Jlc2V0KCk7CisJfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgIm9uIiwgMikgPT0gMCkgeworCQlkYXNkX2dsb2JhbF9wcm9maWxlX3Jlc2V0KCk7CisJCWRhc2RfZ2xvYmFsX3Byb2ZpbGVfbGV2ZWwgPSBEQVNEX1BST0ZJTEVfR0xPQkFMX09OTFk7CisJfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgIm9mZiIsIDMpID09IDApIHsKKwkJZGFzZF9nbG9iYWxfcHJvZmlsZV9sZXZlbCA9IERBU0RfUFJPRklMRV9PRkY7CisJfSBlbHNlCisJCXJjID0gLUVJTlZBTDsKKwlrZnJlZShidWZmZXIpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBkYXNkX3N0YXRzX2dsb2JhbF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlpZiAoIWRhc2RfZ2xvYmFsX3Byb2ZpbGVfbGV2ZWwpIHsKKwkJc2VxX3ByaW50ZihtLCAiZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZGFzZF9zdGF0c19zZXFfcHJpbnQobSwgJmRhc2RfZ2xvYmFsX3Byb2ZpbGVfZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFzZF9zdGF0c19nbG9iYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGFzZF9zdGF0c19nbG9iYWxfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRhc2Rfc3RhdHNfZ2xvYmFsX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGRhc2Rfc3RhdHNfZ2xvYmFsX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkud3JpdGUJCT0gZGFzZF9zdGF0c19nbG9iYWxfd3JpdGUsCit9OworCitzdGF0aWMgdm9pZCBkYXNkX3Byb2ZpbGVfaW5pdChzdHJ1Y3QgZGFzZF9wcm9maWxlICpwcm9maWxlLAorCQkJICAgICAgc3RydWN0IGRlbnRyeSAqYmFzZV9kZW50cnkpCit7CisJbW9kZV90IG1vZGU7CisJc3RydWN0IGRlbnRyeSAqcGRlOworCisJaWYgKCFiYXNlX2RlbnRyeSkKKwkJcmV0dXJuOworCXByb2ZpbGUtPmRlbnRyeSA9IE5VTEw7CisJcHJvZmlsZS0+ZGF0YSA9IE5VTEw7CisJbW9kZSA9IChTX0lSVVNSIHwgU19JV1VTUiB8IFNfSUZSRUcpOworCXBkZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInN0YXRpc3RpY3MiLCBtb2RlLCBiYXNlX2RlbnRyeSwKKwkJCQkgIHByb2ZpbGUsICZkYXNkX3N0YXRzX3Jhd19mb3BzKTsKKwlpZiAocGRlICYmICFJU19FUlIocGRlKSkKKwkJcHJvZmlsZS0+ZGVudHJ5ID0gcGRlOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZGFzZF9wcm9maWxlX2V4aXQoc3RydWN0IGRhc2RfcHJvZmlsZSAqcHJvZmlsZSkKK3sKKwlkYXNkX3Byb2ZpbGVfb2ZmKHByb2ZpbGUpOworCWlmIChwcm9maWxlLT5kZW50cnkpIHsKKwkJZGVidWdmc19yZW1vdmUocHJvZmlsZS0+ZGVudHJ5KTsKKwkJcHJvZmlsZS0+ZGVudHJ5ID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRhc2Rfc3RhdGlzdGljc19yZW1vdmVyb290KHZvaWQpCit7CisJZGFzZF9nbG9iYWxfcHJvZmlsZV9sZXZlbCA9IERBU0RfUFJPRklMRV9PRkY7CisJaWYgKGRhc2RfZ2xvYmFsX3Byb2ZpbGVfZGVudHJ5KSB7CisJCWRlYnVnZnNfcmVtb3ZlKGRhc2RfZ2xvYmFsX3Byb2ZpbGVfZGVudHJ5KTsKKwkJZGFzZF9nbG9iYWxfcHJvZmlsZV9kZW50cnkgPSBOVUxMOworCX0KKwlpZiAoZGFzZF9kZWJ1Z2ZzX2dsb2JhbF9lbnRyeSkKKwkJZGVidWdmc19yZW1vdmUoZGFzZF9kZWJ1Z2ZzX2dsb2JhbF9lbnRyeSk7CisJaWYgKGRhc2RfZGVidWdmc19yb290X2VudHJ5KQorCQlkZWJ1Z2ZzX3JlbW92ZShkYXNkX2RlYnVnZnNfcm9vdF9lbnRyeSk7Cit9CisKK3N0YXRpYyB2b2lkIGRhc2Rfc3RhdGlzdGljc19jcmVhdGVyb290KHZvaWQpCit7CisJbW9kZV90IG1vZGU7CisJc3RydWN0IGRlbnRyeSAqcGRlOworCisJZGFzZF9kZWJ1Z2ZzX3Jvb3RfZW50cnkgPSBOVUxMOworCWRhc2RfZGVidWdmc19nbG9iYWxfZW50cnkgPSBOVUxMOworCWRhc2RfZ2xvYmFsX3Byb2ZpbGVfZGVudHJ5ID0gTlVMTDsKKwlwZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImRhc2QiLCBOVUxMKTsKKwlpZiAoIXBkZSB8fCBJU19FUlIocGRlKSkKKwkJZ290byBlcnJvcjsKKwlkYXNkX2RlYnVnZnNfcm9vdF9lbnRyeSA9IHBkZTsKKwlwZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImdsb2JhbCIsIGRhc2RfZGVidWdmc19yb290X2VudHJ5KTsKKwlpZiAoIXBkZSB8fCBJU19FUlIocGRlKSkKKwkJZ290byBlcnJvcjsKKwlkYXNkX2RlYnVnZnNfZ2xvYmFsX2VudHJ5ID0gcGRlOworCisJbW9kZSA9IChTX0lSVVNSIHwgU19JV1VTUiB8IFNfSUZSRUcpOworCXBkZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInN0YXRpc3RpY3MiLCBtb2RlLCBkYXNkX2RlYnVnZnNfZ2xvYmFsX2VudHJ5LAorCQkJCSAgTlVMTCwgJmRhc2Rfc3RhdHNfZ2xvYmFsX2ZvcHMpOworCWlmICghcGRlIHx8IElTX0VSUihwZGUpKQorCQlnb3RvIGVycm9yOworCWRhc2RfZ2xvYmFsX3Byb2ZpbGVfZGVudHJ5ID0gcGRlOworCXJldHVybjsKKworZXJyb3I6CisJREJGX0VWRU5UKERCRl9FUlIsICIlcyIsCisJCSAgIkNyZWF0aW9uIG9mIHRoZSBkYXNkIGRlYnVnZnMgaW50ZXJmYWNlIGZhaWxlZCIpOworCWRhc2Rfc3RhdGlzdGljc19yZW1vdmVyb290KCk7CisJcmV0dXJuOworfQorCiAjZWxzZQogI2RlZmluZSBkYXNkX3Byb2ZpbGVfc3RhcnQoYmxvY2ssIGNxciwgcmVxKSBkbyB7fSB3aGlsZSAoMCkKICNkZWZpbmUgZGFzZF9wcm9maWxlX2VuZChibG9jaywgY3FyLCByZXEpIGRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBkYXNkX3N0YXRpc3RpY3NfY3JlYXRlcm9vdCh2b2lkKQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZGFzZF9zdGF0aXN0aWNzX3JlbW92ZXJvb3Qodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKK2ludCBkYXNkX3N0YXRzX2dlbmVyaWNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc2VxX3ByaW50ZihtLCAiU3RhdGlzdGljcyBhcmUgbm90IGFjdGl2YXRlZCBpbiB0aGlzIGtlcm5lbFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRhc2RfcHJvZmlsZV9pbml0KHN0cnVjdCBkYXNkX3Byb2ZpbGUgKnByb2ZpbGUsCisJCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpiYXNlX2RlbnRyeSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGRhc2RfcHJvZmlsZV9leGl0KHN0cnVjdCBkYXNkX3Byb2ZpbGUgKnByb2ZpbGUpCit7CisJcmV0dXJuOworfQorCitpbnQgZGFzZF9wcm9maWxlX29uKHN0cnVjdCBkYXNkX3Byb2ZpbGUgKnByb2ZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKICNlbmRpZgkJCQkvKiBDT05GSUdfREFTRF9QUk9GSUxFICovCiAKIC8qCkBAIC0yNDQxLDYgKzI5MjQsNyBAQAogCQlkZWJ1Z191bnJlZ2lzdGVyKGRhc2RfZGVidWdfYXJlYSk7CiAJCWRhc2RfZGVidWdfYXJlYSA9IE5VTEw7CiAJfQorCWRhc2Rfc3RhdGlzdGljc19yZW1vdmVyb290KCk7CiB9CiAKIC8qCkBAIC0yOTkyLDYgKzM0NzYsOCBAQAogCiAJZGFzZF9kaWFnX2Rpc2NpcGxpbmVfcG9pbnRlciA9IE5VTEw7CiAKKwlkYXNkX3N0YXRpc3RpY3NfY3JlYXRlcm9vdCgpOworCiAJcmMgPSBkYXNkX2Rldm1hcF9pbml0KCk7CiAJaWYgKHJjKQogCQlnb3RvIGZhaWxlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKaW5kZXggZDFlNGYyYy4uMWRkMTJiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKQEAgLTM4Miw2ICszODIsNDEgQEAKIAlfX3U4IG5wbTsKIH07CiAKK3N0cnVjdCBkYXNkX3Byb2ZpbGVfaW5mbyB7CisJLyogbGVnYWN5IHBhcnQgb2YgcHJvZmlsZSBkYXRhLCBhcyBpbiBkYXNkX3Byb2ZpbGVfaW5mb190ICovCisJdW5zaWduZWQgaW50IGRhc2RfaW9fcmVxczsJIC8qIG51bWJlciBvZiByZXF1ZXN0cyBwcm9jZXNzZWQgKi8KKwl1bnNpZ25lZCBpbnQgZGFzZF9pb19zZWN0czsJIC8qIG51bWJlciBvZiBzZWN0b3JzIHByb2Nlc3NlZCAqLworCXVuc2lnbmVkIGludCBkYXNkX2lvX3NlY3NbMzJdOwkgLyogaGlzdG9ncmFtIG9mIHJlcXVlc3QncyBzaXplcyAqLworCXVuc2lnbmVkIGludCBkYXNkX2lvX3RpbWVzWzMyXTsJIC8qIGhpc3RvZ3JhbSBvZiByZXF1ZXN0cydzIHRpbWVzICovCisJdW5zaWduZWQgaW50IGRhc2RfaW9fdGltcHNbMzJdOwkgLyogaC4gb2YgcmVxdWVzdHMncyB0aW1lcyBwZXIgc2VjdG9yICovCisJdW5zaWduZWQgaW50IGRhc2RfaW9fdGltZTFbMzJdOwkgLyogaGlzdC4gb2YgdGltZSBmcm9tIGJ1aWxkIHRvIHN0YXJ0ICovCisJdW5zaWduZWQgaW50IGRhc2RfaW9fdGltZTJbMzJdOwkgLyogaGlzdC4gb2YgdGltZSBmcm9tIHN0YXJ0IHRvIGlycSAqLworCXVuc2lnbmVkIGludCBkYXNkX2lvX3RpbWUycHNbMzJdOyAvKiBoaXN0LiBvZiB0aW1lIGZyb20gc3RhcnQgdG8gaXJxICovCisJdW5zaWduZWQgaW50IGRhc2RfaW9fdGltZTNbMzJdOwkgLyogaGlzdC4gb2YgdGltZSBmcm9tIGlycSB0byBlbmQgKi8KKwl1bnNpZ25lZCBpbnQgZGFzZF9pb19ucl9yZXFbMzJdOyAvKiBoaXN0LiBvZiAjIG9mIHJlcXVlc3RzIGluIGNoYW5xICovCisKKwkvKiBuZXcgZGF0YSAqLworCXN0cnVjdCB0aW1lc3BlYyBzdGFydHRvZDsJICAgLyogdGltZSBvZiBzdGFydCBvciBsYXN0IHJlc2V0ICovCisJdW5zaWduZWQgaW50IGRhc2RfaW9fYWxpYXM7CSAgIC8qIHJlcXVlc3RzIHVzaW5nIGFuIGFsaWFzICovCisJdW5zaWduZWQgaW50IGRhc2RfaW9fdHBtOwkgICAvKiByZXF1ZXN0cyB1c2luZyB0cmFuc3BvcnQgbW9kZSAqLworCXVuc2lnbmVkIGludCBkYXNkX3JlYWRfcmVxczsJICAgLyogdG90YWwgbnVtYmVyIG9mIHJlYWQgIHJlcXVlc3RzICovCisJdW5zaWduZWQgaW50IGRhc2RfcmVhZF9zZWN0czsJICAgLyogdG90YWwgbnVtYmVyIHJlYWQgc2VjdG9ycyAqLworCXVuc2lnbmVkIGludCBkYXNkX3JlYWRfYWxpYXM7CSAgIC8qIHJlYWQgcmVxdWVzdCB1c2luZyBhbiBhbGlhcyAqLworCXVuc2lnbmVkIGludCBkYXNkX3JlYWRfdHBtOwkgICAvKiByZWFkIHJlcXVlc3RzIGluIHRyYW5zcG9ydCBtb2RlICovCisJdW5zaWduZWQgaW50IGRhc2RfcmVhZF9zZWNzWzMyXTsgICAvKiBoaXN0b2dyYW0gb2YgcmVxdWVzdCdzIHNpemVzICovCisJdW5zaWduZWQgaW50IGRhc2RfcmVhZF90aW1lc1szMl07ICAvKiBoaXN0b2dyYW0gb2YgcmVxdWVzdHMncyB0aW1lcyAqLworCXVuc2lnbmVkIGludCBkYXNkX3JlYWRfdGltZTFbMzJdOyAgLyogaGlzdC4gdGltZSBmcm9tIGJ1aWxkIHRvIHN0YXJ0ICovCisJdW5zaWduZWQgaW50IGRhc2RfcmVhZF90aW1lMlszMl07ICAvKiBoaXN0LiBvZiB0aW1lIGZyb20gc3RhcnQgdG8gaXJxICovCisJdW5zaWduZWQgaW50IGRhc2RfcmVhZF90aW1lM1szMl07ICAvKiBoaXN0LiBvZiB0aW1lIGZyb20gaXJxIHRvIGVuZCAqLworCXVuc2lnbmVkIGludCBkYXNkX3JlYWRfbnJfcmVxWzMyXTsgLyogaGlzdC4gb2YgIyBvZiByZXF1ZXN0cyBpbiBjaGFucSAqLworfTsKKworc3RydWN0IGRhc2RfcHJvZmlsZSB7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBkYXNkX3Byb2ZpbGVfaW5mbyAqZGF0YTsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCiBzdHJ1Y3QgZGFzZF9kZXZpY2UgewogCS8qIEJsb2NrIGRldmljZSBzdHVmZi4gKi8KIAlzdHJ1Y3QgZGFzZF9ibG9jayAqYmxvY2s7CkBAIC00MzEsNiArNDY2LDkgQEAKIAogCS8qIGRlZmF1bHQgZXhwaXJhdGlvbiB0aW1lIGluIHMgKi8KIAl1bnNpZ25lZCBsb25nIGRlZmF1bHRfZXhwaXJlczsKKworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGVudHJ5OworCXN0cnVjdCBkYXNkX3Byb2ZpbGUgcHJvZmlsZTsKIH07CiAKIHN0cnVjdCBkYXNkX2Jsb2NrIHsKQEAgLTQ1Myw5ICs0OTEsOCBAQAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCi0jaWZkZWYgQ09ORklHX0RBU0RfUFJPRklMRQotCXN0cnVjdCBkYXNkX3Byb2ZpbGVfaW5mb190IHByb2ZpbGU7Ci0jZW5kaWYKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RlbnRyeTsKKwlzdHJ1Y3QgZGFzZF9wcm9maWxlIHByb2ZpbGU7CiB9OwogCiAKQEAgLTU4OSwxMiArNjI2LDEzIEBACiB9CiAKIC8qIGV4dGVybmFscyBpbiBkYXNkLmMgKi8KLSNkZWZpbmUgREFTRF9QUk9GSUxFX09OCSAxCi0jZGVmaW5lIERBU0RfUFJPRklMRV9PRkYgMAorI2RlZmluZSBEQVNEX1BST0ZJTEVfT0ZGCSAwCisjZGVmaW5lIERBU0RfUFJPRklMRV9PTiAJIDEKKyNkZWZpbmUgREFTRF9QUk9GSUxFX0dMT0JBTF9PTkxZIDIKIAogZXh0ZXJuIGRlYnVnX2luZm9fdCAqZGFzZF9kZWJ1Z19hcmVhOwotZXh0ZXJuIHN0cnVjdCBkYXNkX3Byb2ZpbGVfaW5mb190IGRhc2RfZ2xvYmFsX3Byb2ZpbGU7Ci1leHRlcm4gdW5zaWduZWQgaW50IGRhc2RfcHJvZmlsZV9sZXZlbDsKK2V4dGVybiBzdHJ1Y3QgZGFzZF9wcm9maWxlX2luZm8gZGFzZF9nbG9iYWxfcHJvZmlsZV9kYXRhOworZXh0ZXJuIHVuc2lnbmVkIGludCBkYXNkX2dsb2JhbF9wcm9maWxlX2xldmVsOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBkYXNkX2RldmljZV9vcGVyYXRpb25zOwogCiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmRhc2RfcGFnZV9jYWNoZTsKQEAgLTY2Miw2ICs3MDAsMTEgQEAKIAogaW50IGRhc2RfZGV2aWNlX2lzX3JvKHN0cnVjdCBkYXNkX2RldmljZSAqKTsKIAordm9pZCBkYXNkX3Byb2ZpbGVfcmVzZXQoc3RydWN0IGRhc2RfcHJvZmlsZSAqKTsKK2ludCBkYXNkX3Byb2ZpbGVfb24oc3RydWN0IGRhc2RfcHJvZmlsZSAqKTsKK3ZvaWQgZGFzZF9wcm9maWxlX29mZihzdHJ1Y3QgZGFzZF9wcm9maWxlICopOwordm9pZCBkYXNkX2dsb2JhbF9wcm9maWxlX3Jlc2V0KHZvaWQpOworY2hhciAqZGFzZF9nZXRfdXNlcl9zdHJpbmcoY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90KTsKIAogLyogZXh0ZXJuYWxzIGluIGRhc2RfZGV2bWFwLmMgKi8KIGV4dGVybiBpbnQgZGFzZF9tYXhfZGV2aW5kZXg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pb2N0bC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW9jdGwuYwppbmRleCA3MjI2MWU0Li5lYjRlMDM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2lvY3RsLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogICovCiBzdGF0aWMgaW50IGRhc2RfaW9jdGxfcmVzZXRfcHJvZmlsZShzdHJ1Y3QgZGFzZF9ibG9jayAqYmxvY2spCiB7Ci0JbWVtc2V0KCZibG9jay0+cHJvZmlsZSwgMCwgc2l6ZW9mKHN0cnVjdCBkYXNkX3Byb2ZpbGVfaW5mb190KSk7CisJZGFzZF9wcm9maWxlX3Jlc2V0KCZibG9jay0+cHJvZmlsZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0OCwxMCArMjQ4LDQwIEBACiAgKi8KIHN0YXRpYyBpbnQgZGFzZF9pb2N0bF9yZWFkX3Byb2ZpbGUoc3RydWN0IGRhc2RfYmxvY2sgKmJsb2NrLCB2b2lkIF9fdXNlciAqYXJncCkKIHsKLQlpZiAoZGFzZF9wcm9maWxlX2xldmVsID09IERBU0RfUFJPRklMRV9PRkYpCisJc3RydWN0IGRhc2RfcHJvZmlsZV9pbmZvX3QgKmRhdGE7CisKKwlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2JoKCZibG9jay0+cHJvZmlsZS5sb2NrKTsKKwlpZiAoYmxvY2stPnByb2ZpbGUuZGF0YSkgeworCQlkYXRhLT5kYXNkX2lvX3JlcXMgPSBibG9jay0+cHJvZmlsZS5kYXRhLT5kYXNkX2lvX3JlcXM7CisJCWRhdGEtPmRhc2RfaW9fc2VjdHMgPSBibG9jay0+cHJvZmlsZS5kYXRhLT5kYXNkX2lvX3NlY3RzOworCQltZW1jcHkoZGF0YS0+ZGFzZF9pb19zZWNzLCBibG9jay0+cHJvZmlsZS5kYXRhLT5kYXNkX2lvX3NlY3MsCisJCSAgICAgICBzaXplb2YoZGF0YS0+ZGFzZF9pb19zZWNzKSk7CisJCW1lbWNweShkYXRhLT5kYXNkX2lvX3RpbWVzLCBibG9jay0+cHJvZmlsZS5kYXRhLT5kYXNkX2lvX3RpbWVzLAorCQkgICAgICAgc2l6ZW9mKGRhdGEtPmRhc2RfaW9fdGltZXMpKTsKKwkJbWVtY3B5KGRhdGEtPmRhc2RfaW9fdGltcHMsIGJsb2NrLT5wcm9maWxlLmRhdGEtPmRhc2RfaW9fdGltcHMsCisJCSAgICAgICBzaXplb2YoZGF0YS0+ZGFzZF9pb190aW1wcykpOworCQltZW1jcHkoZGF0YS0+ZGFzZF9pb190aW1lMSwgYmxvY2stPnByb2ZpbGUuZGF0YS0+ZGFzZF9pb190aW1lMSwKKwkJICAgICAgIHNpemVvZihkYXRhLT5kYXNkX2lvX3RpbWUxKSk7CisJCW1lbWNweShkYXRhLT5kYXNkX2lvX3RpbWUyLCBibG9jay0+cHJvZmlsZS5kYXRhLT5kYXNkX2lvX3RpbWUyLAorCQkgICAgICAgc2l6ZW9mKGRhdGEtPmRhc2RfaW9fdGltZTIpKTsKKwkJbWVtY3B5KGRhdGEtPmRhc2RfaW9fdGltZTJwcywKKwkJICAgICAgIGJsb2NrLT5wcm9maWxlLmRhdGEtPmRhc2RfaW9fdGltZTJwcywKKwkJICAgICAgIHNpemVvZihkYXRhLT5kYXNkX2lvX3RpbWUycHMpKTsKKwkJbWVtY3B5KGRhdGEtPmRhc2RfaW9fdGltZTMsIGJsb2NrLT5wcm9maWxlLmRhdGEtPmRhc2RfaW9fdGltZTMsCisJCSAgICAgICBzaXplb2YoZGF0YS0+ZGFzZF9pb190aW1lMykpOworCQltZW1jcHkoZGF0YS0+ZGFzZF9pb19ucl9yZXEsCisJCSAgICAgICBibG9jay0+cHJvZmlsZS5kYXRhLT5kYXNkX2lvX25yX3JlcSwKKwkJICAgICAgIHNpemVvZihkYXRhLT5kYXNkX2lvX25yX3JlcSkpOworCQlzcGluX3VubG9ja19iaCgmYmxvY2stPnByb2ZpbGUubG9jayk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmJsb2NrLT5wcm9maWxlLmxvY2spOwogCQlyZXR1cm4gLUVJTzsKLQlpZiAoY29weV90b191c2VyKGFyZ3AsICZibG9jay0+cHJvZmlsZSwKLQkJCSBzaXplb2Yoc3RydWN0IGRhc2RfcHJvZmlsZV9pbmZvX3QpKSkKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBkYXRhLCBzaXplb2YoKmRhdGEpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMKaW5kZXggYzRhNmEzMS4uNmMzYzUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfcHJvYy5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX3Byb2MuYwpAQCAtMzIsMjggKzMyLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRhc2RfZGV2aWNlc19lbnRyeSA9IE5VTEw7CiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkYXNkX3N0YXRpc3RpY3NfZW50cnkgPSBOVUxMOwogCi0jaWZkZWYgQ09ORklHX0RBU0RfUFJPRklMRQotc3RhdGljIGNoYXIgKgotZGFzZF9nZXRfdXNlcl9zdHJpbmcoY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgdXNlcl9sZW4pCi17Ci0JY2hhciAqYnVmZmVyOwotCi0JYnVmZmVyID0ga21hbGxvYyh1c2VyX2xlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmIChidWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZmZlciwgdXNlcl9idWYsIHVzZXJfbGVuKSAhPSAwKSB7Ci0JCWtmcmVlKGJ1ZmZlcik7Ci0JCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwotCX0KLQkvKiBnb3QgdGhlIHN0cmluZywgbm93IHN0cmlwIGxpbmVmZWVkLiAqLwotCWlmIChidWZmZXJbdXNlcl9sZW4gLSAxXSA9PSAnXG4nKQotCQlidWZmZXJbdXNlcl9sZW4gLSAxXSA9IDA7Ci0JZWxzZQotCQlidWZmZXJbdXNlcl9sZW5dID0gMDsKLQlyZXR1cm4gYnVmZmVyOwotfQotI2VuZGlmIC8qIENPTkZJR19EQVNEX1BST0ZJTEUgKi8KLQogc3RhdGljIGludAogZGFzZF9kZXZpY2VzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewpAQCAtMTY3LDYgKzE0NSw1NSBAQAogfTsKIAogI2lmZGVmIENPTkZJR19EQVNEX1BST0ZJTEUKK3N0YXRpYyBpbnQgZGFzZF9zdGF0c19hbGxfYmxvY2tfb24odm9pZCkKK3sKKwlpbnQgaSwgcmM7CisJc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2U7CisKKwlyYyA9IDA7CisJZm9yIChpID0gMDsgaSA8IGRhc2RfbWF4X2RldmluZGV4OyArK2kpIHsKKwkJZGV2aWNlID0gZGFzZF9kZXZpY2VfZnJvbV9kZXZpbmRleChpKTsKKwkJaWYgKElTX0VSUihkZXZpY2UpKQorCQkJY29udGludWU7CisJCWlmIChkZXZpY2UtPmJsb2NrKQorCQkJcmMgPSBkYXNkX3Byb2ZpbGVfb24oJmRldmljZS0+YmxvY2stPnByb2ZpbGUpOworCQlkYXNkX3B1dF9kZXZpY2UoZGV2aWNlKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGFzZF9zdGF0c19hbGxfYmxvY2tfb2ZmKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGFzZF9tYXhfZGV2aW5kZXg7ICsraSkgeworCQlkZXZpY2UgPSBkYXNkX2RldmljZV9mcm9tX2RldmluZGV4KGkpOworCQlpZiAoSVNfRVJSKGRldmljZSkpCisJCQljb250aW51ZTsKKwkJaWYgKGRldmljZS0+YmxvY2spCisJCQlkYXNkX3Byb2ZpbGVfb2ZmKCZkZXZpY2UtPmJsb2NrLT5wcm9maWxlKTsKKwkJZGFzZF9wdXRfZGV2aWNlKGRldmljZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkYXNkX3N0YXRzX2FsbF9ibG9ja19yZXNldCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOworCisJZm9yIChpID0gMDsgaSA8IGRhc2RfbWF4X2RldmluZGV4OyArK2kpIHsKKwkJZGV2aWNlID0gZGFzZF9kZXZpY2VfZnJvbV9kZXZpbmRleChpKTsKKwkJaWYgKElTX0VSUihkZXZpY2UpKQorCQkJY29udGludWU7CisJCWlmIChkZXZpY2UtPmJsb2NrKQorCQkJZGFzZF9wcm9maWxlX3Jlc2V0KCZkZXZpY2UtPmJsb2NrLT5wcm9maWxlKTsKKwkJZGFzZF9wdXRfZGV2aWNlKGRldmljZSk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBkYXNkX3N0YXRpc3RpY3NfYXJyYXkoc3RydWN0IHNlcV9maWxlICptLCB1bnNpZ25lZCBpbnQgKmFycmF5LCBpbnQgZmFjdG9yKQogewogCWludCBpOwpAQCAtMTgzLDE4ICsyMTAsMTggQEAKIHN0YXRpYyBpbnQgZGFzZF9zdGF0c19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogI2lmZGVmIENPTkZJR19EQVNEX1BST0ZJTEUKLQlzdHJ1Y3QgZGFzZF9wcm9maWxlX2luZm9fdCAqcHJvZjsKKwlzdHJ1Y3QgZGFzZF9wcm9maWxlX2luZm8gKnByb2Y7CiAJaW50IGZhY3RvcjsKIAogCS8qIGNoZWNrIGZvciBhY3RpdmUgcHJvZmlsaW5nICovCi0JaWYgKGRhc2RfcHJvZmlsZV9sZXZlbCA9PSBEQVNEX1BST0ZJTEVfT0ZGKSB7CisJaWYgKCFkYXNkX2dsb2JhbF9wcm9maWxlX2xldmVsKSB7CiAJCXNlcV9wcmludGYobSwgIlN0YXRpc3RpY3MgYXJlIG9mZiAtIHRoZXkgbWlnaHQgYmUgIgogCQkJCSAgICAic3dpdGNoZWQgb24gdXNpbmcgJ2VjaG8gc2V0IG9uID4gIgogCQkJCSAgICAiL3Byb2MvZGFzZC9zdGF0aXN0aWNzJ1xuIik7CiAJCXJldHVybiAwOwogCX0KKwlwcm9mID0gJmRhc2RfZ2xvYmFsX3Byb2ZpbGVfZGF0YTsKIAotCXByb2YgPSAmZGFzZF9nbG9iYWxfcHJvZmlsZTsKIAkvKiBwcmV2ZW50IGNvdW50ZXIgJ292ZXJmbG93JyBvbiBvdXRwdXQgKi8KIAlmb3IgKGZhY3RvciA9IDE7IChwcm9mLT5kYXNkX2lvX3JlcXMgLyBmYWN0b3IpID4gOTk5OTk5OTsKIAkgICAgIGZhY3RvciAqPSAxMCk7CkBAIC0yNDUsNiArMjcyLDcgQEAKIHsKICNpZmRlZiBDT05GSUdfREFTRF9QUk9GSUxFCiAJY2hhciAqYnVmZmVyLCAqc3RyOworCWludCByYzsKIAogCWlmICh1c2VyX2xlbiA+IDY1NTM2KQogCQl1c2VyX2xlbiA9IDY1NTM2OwpAQCAtMjU5LDMyICsyODcsNDAgQEAKIAkJc3RyID0gc2tpcF9zcGFjZXMoc3RyICsgNCk7CiAJCWlmIChzdHJjbXAoc3RyLCAib24iKSA9PSAwKSB7CiAJCQkvKiBzd2l0Y2ggb24gc3RhdGlzdGljcyBwcm9maWxpbmcgKi8KLQkJCWRhc2RfcHJvZmlsZV9sZXZlbCA9IERBU0RfUFJPRklMRV9PTjsKKwkJCXJjID0gZGFzZF9zdGF0c19hbGxfYmxvY2tfb24oKTsKKwkJCWlmIChyYykgeworCQkJCWRhc2Rfc3RhdHNfYWxsX2Jsb2NrX29mZigpOworCQkJCWdvdG8gb3V0X2Vycm9yOworCQkJfQorCQkJZGFzZF9nbG9iYWxfcHJvZmlsZV9yZXNldCgpOworCQkJZGFzZF9nbG9iYWxfcHJvZmlsZV9sZXZlbCA9IERBU0RfUFJPRklMRV9PTjsKIAkJCXByX2luZm8oIlRoZSBzdGF0aXN0aWNzIGZlYXR1cmUgaGFzIGJlZW4gc3dpdGNoZWQgIgogCQkJCSJvblxuIik7CiAJCX0gZWxzZSBpZiAoc3RyY21wKHN0ciwgIm9mZiIpID09IDApIHsKIAkJCS8qIHN3aXRjaCBvZmYgYW5kIHJlc2V0IHN0YXRpc3RpY3MgcHJvZmlsaW5nICovCi0JCQltZW1zZXQoJmRhc2RfZ2xvYmFsX3Byb2ZpbGUsCi0JCQkgICAgICAgMCwgc2l6ZW9mIChzdHJ1Y3QgZGFzZF9wcm9maWxlX2luZm9fdCkpOwotCQkJZGFzZF9wcm9maWxlX2xldmVsID0gREFTRF9QUk9GSUxFX09GRjsKKwkJCWRhc2RfZ2xvYmFsX3Byb2ZpbGVfbGV2ZWwgPSBEQVNEX1BST0ZJTEVfT0ZGOworCQkJZGFzZF9nbG9iYWxfcHJvZmlsZV9yZXNldCgpOworCQkJZGFzZF9zdGF0c19hbGxfYmxvY2tfb2ZmKCk7CiAJCQlwcl9pbmZvKCJUaGUgc3RhdGlzdGljcyBmZWF0dXJlIGhhcyBiZWVuIHN3aXRjaGVkICIKIAkJCQkib2ZmXG4iKTsKIAkJfSBlbHNlCi0JCQlnb3RvIG91dF9lcnJvcjsKKwkJCWdvdG8gb3V0X3BhcnNlX2Vycm9yOwogCX0gZWxzZSBpZiAoc3RybmNtcChzdHIsICJyZXNldCIsIDUpID09IDApIHsKIAkJLyogcmVzZXQgdGhlIHN0YXRpc3RpY3MgKi8KLQkJbWVtc2V0KCZkYXNkX2dsb2JhbF9wcm9maWxlLCAwLAotCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZGFzZF9wcm9maWxlX2luZm9fdCkpOworCQlkYXNkX2dsb2JhbF9wcm9maWxlX3Jlc2V0KCk7CisJCWRhc2Rfc3RhdHNfYWxsX2Jsb2NrX3Jlc2V0KCk7CiAJCXByX2luZm8oIlRoZSBzdGF0aXN0aWNzIGhhdmUgYmVlbiByZXNldFxuIik7CiAJfSBlbHNlCi0JCWdvdG8gb3V0X2Vycm9yOworCQlnb3RvIG91dF9wYXJzZV9lcnJvcjsKIAlrZnJlZShidWZmZXIpOwogCXJldHVybiB1c2VyX2xlbjsKLW91dF9lcnJvcjoKK291dF9wYXJzZV9lcnJvcjoKKwlyYyA9IC1FSU5WQUw7CiAJcHJfd2FybmluZygiJXMgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciAvcHJvYy9kYXNkL3N0YXRpc3RpY3NcbiIsCiAJCXN0cik7CitvdXRfZXJyb3I6CiAJa2ZyZWUoYnVmZmVyKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcmM7CiAjZWxzZQogCXByX3dhcm5pbmcoIi9wcm9jL2Rhc2Qvc3RhdGlzdGljczogaXMgbm90IGFjdGl2YXRlZCBpbiB0aGlzIGtlcm5lbFxuIik7CiAJcmV0dXJuIHVzZXJfbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvczM5MC9jaGFyL0tjb25maWcKaW5kZXggYTRmMTE3ZC4uMmM5YTc3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9LY29uZmlnCkBAIC0xMTYsOSArMTE2LDYgQEAKIAkgIGNhbGxlZCB0YXBlMzkwIGFuZCBpbmNsdWRlIGFsbCBzZWxlY3RlZCBpbnRlcmZhY2VzIGFuZAogCSAgaGFyZHdhcmUgZHJpdmVycy4KIAotY29tbWVudCAiUy8zOTAgdGFwZSBpbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFMzOTBfVEFQRQotCiBjb21tZW50ICJTLzM5MCB0YXBlIGhhcmR3YXJlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTMzkwX1RBUEUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdm13YXRjaGRvZy5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdm13YXRjaGRvZy5jCmluZGV4IDEyZWY5MTIuLjExMzEyZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3Ztd2F0Y2hkb2cuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci92bXdhdGNoZG9nLmMKQEAgLTI1OCwxMyArMjU4LDEzIEBACiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoVk1XRFRfT1BFTiwgJnZtd2R0X2lzX29wZW4pKSB7CiAJCXByX2VycigiVGhlIHN5c3RlbSBjYW5ub3QgYmUgc3VzcGVuZGVkIHdoaWxlIHRoZSB3YXRjaGRvZyIKIAkJCSIgaXMgaW4gdXNlXG4iKTsKLQkJcmV0dXJuIE5PVElGWV9CQUQ7CisJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKC1FQlVTWSk7CiAJfQogCWlmICh0ZXN0X2JpdChWTVdEVF9SVU5OSU5HLCAmdm13ZHRfaXNfb3BlbikpIHsKIAkJY2xlYXJfYml0KFZNV0RUX09QRU4sICZ2bXdkdF9pc19vcGVuKTsKIAkJcHJfZXJyKCJUaGUgc3lzdGVtIGNhbm5vdCBiZSBzdXNwZW5kZWQgd2hpbGUgdGhlIHdhdGNoZG9nIgogCQkJIiBpcyBydW5uaW5nXG4iKTsKLQkJcmV0dXJuIE5PVElGWV9CQUQ7CisJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKC1FQlVTWSk7CiAJfQogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCmluZGV4IGM0N2IyNWYuLjkyZDczMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuYwpAQCAtODE0LDggKzgxNCw4IEBACiAJCQkJbXV0ZXhfdW5sb2NrKCZjc3MtPm11dGV4KTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmIChfX2Noc2NfZG9fc2VjbShjc3MsIDApKQotCQkJCXJldCA9IE5PVElGWV9CQUQ7CisJCQlyZXQgPSBfX2Noc2NfZG9fc2VjbShjc3MsIDApOworCQkJcmV0ID0gbm90aWZpZXJfZnJvbV9lcnJubyhyZXQpOwogCQkJbXV0ZXhfdW5sb2NrKCZjc3MtPm11dGV4KTsKIAkJfQogCQlicmVhazsKQEAgLTgzMSw4ICs4MzEsOCBAQAogCQkJCW11dGV4X3VubG9jaygmY3NzLT5tdXRleCk7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlpZiAoX19jaHNjX2RvX3NlY20oY3NzLCAxKSkKLQkJCQlyZXQgPSBOT1RJRllfQkFEOworCQkJcmV0ID0gX19jaHNjX2RvX3NlY20oY3NzLCAxKTsKKwkJCXJldCA9IG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTsKIAkJCW11dGV4X3VubG9jaygmY3NzLT5tdXRleCk7CiAJCX0KIAkJLyogc2VhcmNoIGZvciBzdWJjaGFubmVscywgd2hpY2ggYXBwZWFyZWQgZHVyaW5nIGhpYmVybmF0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYwppbmRleCA1NWU4ZjcyLi41NzBkNGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKQEAgLTQxNiw3ICs0MTYsNyBAQAogCiAJLyogc3BlY2lhbCBoYW5kbGluZyBmb3Igbm8gdGFyZ2V0IGJ1ZmZlciBlbXB0eSAqLwogCWlmICgoIXEtPmlzX2lucHV0X3EgJiYKLQkgICAgKHEtPnNiYWxbcS0+Zmlyc3RfdG9fY2hlY2tdLT5lbGVtZW50WzE1XS5mbGFncyAmIDB4ZmYpID09IDB4MTApKSB7CisJICAgIChxLT5zYmFsW3EtPmZpcnN0X3RvX2NoZWNrXS0+ZWxlbWVudFsxNV0uc2ZsYWdzKSA9PSAweDEwKSkgewogCQlxcGVyZl9pbmMocSwgdGFyZ2V0X2Z1bGwpOwogCQlEQkZfREVWX0VWRU5UKERCRl9JTkZPLCBxLT5pcnFfcHRyLCAiT1VURlVMTCBGVEM6JTAyeCIsCiAJCQkgICAgICBxLT5maXJzdF90b19jaGVjayk7CkBAIC00MjcsOCArNDI3LDggQEAKIAlEQkZfRVJST1IoKHEtPmlzX2lucHV0X3EpID8gIklOOiUyZCIgOiAiT1VUOiUyZCIsIHEtPm5yKTsKIAlEQkZfRVJST1IoIkZUQzolM2QgQzolM2QiLCBxLT5maXJzdF90b19jaGVjaywgY291bnQpOwogCURCRl9FUlJPUigiRjE0OiUyeCBGMTU6JTJ4IiwKLQkJICBxLT5zYmFsW3EtPmZpcnN0X3RvX2NoZWNrXS0+ZWxlbWVudFsxNF0uZmxhZ3MgJiAweGZmLAotCQkgIHEtPnNiYWxbcS0+Zmlyc3RfdG9fY2hlY2tdLT5lbGVtZW50WzE1XS5mbGFncyAmIDB4ZmYpOworCQkgIHEtPnNiYWxbcS0+Zmlyc3RfdG9fY2hlY2tdLT5lbGVtZW50WzE0XS5zZmxhZ3MsCisJCSAgcS0+c2JhbFtxLT5maXJzdF90b19jaGVja10tPmVsZW1lbnRbMTVdLnNmbGFncyk7CiAKIAkvKgogCSAqIEludGVycnVwdHMgbWF5IGJlIGF2b2lkZWQgYXMgbG9uZyBhcyB0aGUgZXJyb3IgaXMgcHJlc2VudApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX3RoaW5pbnQuYyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb190aGluaW50LmMKaW5kZXggNWM0ZTc0MS4uNjhiZTZlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX3RoaW5pbnQuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fdGhpbmludC5jCkBAIC05NSw5ICs5NSwxMSBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB1MzIgc2hhcmVkX2luZF9zZXQodm9pZCkKK3N0YXRpYyBpbmxpbmUgdTMyIGNsZWFyX3NoYXJlZF9pbmQodm9pZCkKIHsKLQlyZXR1cm4gcV9pbmRpY2F0b3JzW1RJUURJT19TSEFSRURfSU5EXS5pbmQ7CisJaWYgKCFhdG9taWNfcmVhZCgmcV9pbmRpY2F0b3JzW1RJUURJT19TSEFSRURfSU5EXS5jb3VudCkpCisJCXJldHVybiAwOworCXJldHVybiB4Y2hnKCZxX2luZGljYXRvcnNbVElRRElPX1NIQVJFRF9JTkRdLmluZCwgMCk7CiB9CiAKIC8qKgpAQCAtMTA3LDcgKzEwOSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHRpcWRpb190aGluaW50X2hhbmRsZXIodm9pZCAqYWxzaSwgdm9pZCAqZGF0YSkKIHsKLQl1MzIgc2lfdXNlZCA9IHNoYXJlZF9pbmRfc2V0KCk7CisJdTMyIHNpX3VzZWQgPSBjbGVhcl9zaGFyZWRfaW5kKCk7CiAJc3RydWN0IHFkaW9fcSAqcTsKIAogCWxhc3RfYWlfdGltZSA9IFMzOTBfbG93Y29yZS5pbnRfY2xvY2s7CkBAIC0xNTAsMTMgKzE1Miw2IEBACiAJCXFwZXJmX2luYyhxLCBhZGFwdGVyX2ludCk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwotCi0JLyoKLQkgKiBJZiB0aGUgc2hhcmVkIGluZGljYXRvciB3YXMgdXNlZCBjbGVhciBpdCBub3cgYWZ0ZXIgYWxsIHF1ZXVlcwotCSAqIHdlcmUgcHJvY2Vzc2VkLgotCSAqLwotCWlmIChzaV91c2VkICYmIHNoYXJlZF9pbmRfc2V0KCkpCi0JCXhjaGcoJnFfaW5kaWNhdG9yc1tUSVFESU9fU0hBUkVEX0lORF0uaW5kLCAwKTsKIH0KIAogc3RhdGljIGludCBzZXRfc3ViY2hhbm5lbF9pbmQoc3RydWN0IHFkaW9faXJxICppcnFfcHRyLCBpbnQgcmVzZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jIGIvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYwppbmRleCAxNmU0YTI1Li5mODEzNGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCisrKyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKQEAgLTYsNiArNiw3IEBACiAgKgkgICAgICBNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+CiAgKgkgICAgICBSYWxwaCBXdWVydGhuZXIgPHJ3dWVydGhuQGRlLmlibS5jb20+CiAgKgkgICAgICBGZWxpeCBCZWNrIDxmZWxpeC5iZWNrQGRlLmlibS5jb20+CisgKgkgICAgICBIb2xnZXIgRGVuZ2xlciA8aGRAbGludXgudm5ldC5pYm0uY29tPgogICoKICAqIEFkanVuY3QgcHJvY2Vzc29yIGJ1cy4KICAqCkBAIC0yMjIsMjkgKzIyMyw3NSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGFwX3F1ZXVlX3N0YXR1cyBfX2FwXzQwOTZfY29tbWFuZHNfYXZhaWxhYmxlKGFwX3FpZF90IHFpZCwKLQkJCQkJCQkJICBpbnQgKnN1cHBvcnQpCisjaWZkZWYgQ09ORklHXzY0QklUCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhcF9xdWV1ZV9zdGF0dXMKK19fYXBfcXVlcnlfZnVuY3Rpb25zKGFwX3FpZF90IHFpZCwgdW5zaWduZWQgaW50ICpmdW5jdGlvbnMpCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcwIGFzbSAoIjAiKSA9IDBVTCB8IHFpZCB8ICgxVUwgPDwgMjMpOwotCXJlZ2lzdGVyIHN0cnVjdCBhcF9xdWV1ZV9zdGF0dXMgcmVnMSBhc20gKCIxIik7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcyIGFzbSAoIjIiKSA9IDBVTDsKKwlyZWdpc3RlciBzdHJ1Y3QgYXBfcXVldWVfc3RhdHVzIHJlZzEgYXNtICgiMSIpID0gQVBfUVVFVUVfU1RBVFVTX0lOVkFMSUQ7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcyIGFzbSAoIjIiKTsKIAogCWFzbSB2b2xhdGlsZSgKIAkJIi5sb25nIDB4YjJhZjAwMDBcbiIKLQkJIjA6IGxhICAgICUxLDBcbiIKLQkJIjE6XG4iCi0JCUVYX1RBQkxFKDBiLCAxYikKLQkJOiAiK2QiIChyZWcwKSwgIj1kIiAocmVnMSksICI9ZCIgKHJlZzIpCisJCSIwOlxuIgorCQlFWF9UQUJMRSgwYiwgMGIpCisJCTogIitkIiAocmVnMCksICIrZCIgKHJlZzEpLCAiPWQiIChyZWcyKQogCQk6CiAJCTogImNjIik7CiAKLQlpZiAocmVnMiAmIDB4NjAwMDAwMDAwMDAwMDAwMFVMTCkKLQkJKnN1cHBvcnQgPSAxOwotCWVsc2UKLQkJKnN1cHBvcnQgPSAwOwotCisJKmZ1bmN0aW9ucyA9ICh1bnNpZ25lZCBpbnQpKHJlZzIgPj4gMzIpOwogCXJldHVybiByZWcxOwogfQorI2VuZGlmCisKKy8qKgorICogYXBfcXVlcnlfZnVuY3Rpb25zKCk6IFF1ZXJ5IHN1cHBvcnRlZCBmdW5jdGlvbnMuCisgKiBAcWlkOiBUaGUgQVAgcXVldWUgbnVtYmVyCisgKiBAZnVuY3Rpb25zOiBQb2ludGVyIHRvIGZ1bmN0aW9ucyBmaWVsZC4KKyAqCisgKiBSZXR1cm5zCisgKiAgIDAJICAgICBvbiBzdWNjZXNzLgorICogICAtRU5PREVWICBpZiBxdWV1ZSBub3QgdmFsaWQuCisgKiAgIC1FQlVTWSAgIGlmIGRldmljZSBidXN5LgorICogICAtRUlOVkFMICBpZiBxdWVyeSBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgKi8KK3N0YXRpYyBpbnQgYXBfcXVlcnlfZnVuY3Rpb25zKGFwX3FpZF90IHFpZCwgdW5zaWduZWQgaW50ICpmdW5jdGlvbnMpCit7CisjaWZkZWYgQ09ORklHXzY0QklUCisJc3RydWN0IGFwX3F1ZXVlX3N0YXR1cyBzdGF0dXM7CisJaW50IGk7CisJc3RhdHVzID0gX19hcF9xdWVyeV9mdW5jdGlvbnMocWlkLCBmdW5jdGlvbnMpOworCisJZm9yIChpID0gMDsgaSA8IEFQX01BWF9SRVNFVDsgaSsrKSB7CisJCWlmIChhcF9xdWV1ZV9zdGF0dXNfaW52YWxpZF90ZXN0KCZzdGF0dXMpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJc3dpdGNoIChzdGF0dXMucmVzcG9uc2VfY29kZSkgeworCQljYXNlIEFQX1JFU1BPTlNFX05PUk1BTDoKKwkJCXJldHVybiAwOworCQljYXNlIEFQX1JFU1BPTlNFX1JFU0VUX0lOX1BST0dSRVNTOgorCQljYXNlIEFQX1JFU1BPTlNFX0JVU1k6CisJCQlicmVhazsKKwkJY2FzZSBBUF9SRVNQT05TRV9RX05PVF9BVkFJTDoKKwkJY2FzZSBBUF9SRVNQT05TRV9ERUNPTkZJR1VSRUQ6CisJCWNhc2UgQVBfUkVTUE9OU0VfQ0hFQ0tTVE9QUEVEOgorCQljYXNlIEFQX1JFU1BPTlNFX0lOVkFMSURfQUREUkVTUzoKKwkJCXJldHVybiAtRU5PREVWOworCQljYXNlIEFQX1JFU1BPTlNFX09USEVSV0lTRV9DSEFOR0VEOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlpZiAoaSA8IEFQX01BWF9SRVNFVCAtIDEpIHsKKwkJCXVkZWxheSg1KTsKKwkJCXN0YXR1cyA9IF9fYXBfcXVlcnlfZnVuY3Rpb25zKHFpZCwgZnVuY3Rpb25zKTsKKwkJfQorCX0KKwlyZXR1cm4gLUVCVVNZOworI2Vsc2UKKwlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorfQogCiAvKioKICAqIGFwXzQwOTZfY29tbWFuZHNfYXZhaWxhYmxlbigpOiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIDQwOTYgYml0IFJTQQpAQCAtMjU1LDMzICszMDIsMTMgQEAKICAqLwogaW50IGFwXzQwOTZfY29tbWFuZHNfYXZhaWxhYmxlKGFwX3FpZF90IHFpZCkKIHsKLQlzdHJ1Y3QgYXBfcXVldWVfc3RhdHVzIHN0YXR1czsKLQlpbnQgaSwgc3VwcG9ydCA9IDA7Ci0Jc3RhdHVzID0gX19hcF80MDk2X2NvbW1hbmRzX2F2YWlsYWJsZShxaWQsICZzdXBwb3J0KTsKKwl1bnNpZ25lZCBpbnQgZnVuY3Rpb25zOwogCi0JZm9yIChpID0gMDsgaSA8IEFQX01BWF9SRVNFVDsgaSsrKSB7Ci0JCXN3aXRjaCAoc3RhdHVzLnJlc3BvbnNlX2NvZGUpIHsKLQkJY2FzZSBBUF9SRVNQT05TRV9OT1JNQUw6Ci0JCQlyZXR1cm4gc3VwcG9ydDsKLQkJY2FzZSBBUF9SRVNQT05TRV9SRVNFVF9JTl9QUk9HUkVTUzoKLQkJY2FzZSBBUF9SRVNQT05TRV9CVVNZOgotCQkJYnJlYWs7Ci0JCWNhc2UgQVBfUkVTUE9OU0VfUV9OT1RfQVZBSUw6Ci0JCWNhc2UgQVBfUkVTUE9OU0VfREVDT05GSUdVUkVEOgotCQljYXNlIEFQX1JFU1BPTlNFX0NIRUNLU1RPUFBFRDoKLQkJY2FzZSBBUF9SRVNQT05TRV9JTlZBTElEX0FERFJFU1M6Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBBUF9SRVNQT05TRV9PVEhFUldJU0VfQ0hBTkdFRDoKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgPCBBUF9NQVhfUkVTRVQgLSAxKSB7Ci0JCQl1ZGVsYXkoNSk7Ci0JCQlzdGF0dXMgPSBfX2FwXzQwOTZfY29tbWFuZHNfYXZhaWxhYmxlKHFpZCwgJnN1cHBvcnQpOwotCQl9Ci0JfQotCXJldHVybiBzdXBwb3J0OworCWlmIChhcF9xdWVyeV9mdW5jdGlvbnMocWlkLCAmZnVuY3Rpb25zKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdGVzdF9hcF9mYWNpbGl0eShmdW5jdGlvbnMsIDEpICYmCisJICAgICAgIHRlc3RfYXBfZmFjaWxpdHkoZnVuY3Rpb25zLCAyKTsKIH0KIEVYUE9SVF9TWU1CT0woYXBfNDA5Nl9jb21tYW5kc19hdmFpbGFibGUpOwogCkBAIC0xMTM1LDYgKzExNjIsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlhcF9xaWRfdCBxaWQ7CiAJaW50IHF1ZXVlX2RlcHRoLCBkZXZpY2VfdHlwZTsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlX2Z1bmN0aW9uczsKIAlpbnQgcmMsIGk7CiAKIAlpZiAoYXBfc2VsZWN0X2RvbWFpbigpICE9IDApCkBAIC0xMTgzLDE0ICsxMjExLDMwIEBACiAJCUlOSVRfTElTVF9IRUFEKCZhcF9kZXYtPmxpc3QpOwogCQlzZXR1cF90aW1lcigmYXBfZGV2LT50aW1lb3V0LCBhcF9yZXF1ZXN0X3RpbWVvdXQsCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcpIGFwX2Rldik7Ci0JCWlmIChkZXZpY2VfdHlwZSA9PSAwKSB7CisJCXN3aXRjaCAoZGV2aWNlX3R5cGUpIHsKKwkJY2FzZSAwOgogCQkJaWYgKGFwX3Byb2JlX2RldmljZV90eXBlKGFwX2RldikpIHsKIAkJCQlrZnJlZShhcF9kZXYpOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQl9Ci0JCWVsc2UKKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJaWYgKGFwX3F1ZXJ5X2Z1bmN0aW9ucyhxaWQsICZkZXZpY2VfZnVuY3Rpb25zKSkgeworCQkJCWtmcmVlKGFwX2Rldik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAodGVzdF9hcF9mYWNpbGl0eShkZXZpY2VfZnVuY3Rpb25zLCAzKSkKKwkJCQlhcF9kZXYtPmRldmljZV90eXBlID0gQVBfREVWSUNFX1RZUEVfQ0VYM0M7CisJCQllbHNlIGlmICh0ZXN0X2FwX2ZhY2lsaXR5KGRldmljZV9mdW5jdGlvbnMsIDQpKQorCQkJCWFwX2Rldi0+ZGV2aWNlX3R5cGUgPSBBUF9ERVZJQ0VfVFlQRV9DRVgzQTsKKwkJCWVsc2UgeworCQkJCWtmcmVlKGFwX2Rldik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKIAkJCWFwX2Rldi0+ZGV2aWNlX3R5cGUgPSBkZXZpY2VfdHlwZTsKKwkJfQogCiAJCWFwX2Rldi0+ZGV2aWNlLmJ1cyA9ICZhcF9idXNfdHlwZTsKIAkJYXBfZGV2LT5kZXZpY2UucGFyZW50ID0gYXBfcm9vdF9kZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5oIGIvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuaAppbmRleCAwOGI5NzM4Li5kOTYwYTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5oCisrKyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmgKQEAgLTYsNiArNiw3IEBACiAgKgkgICAgICBNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+CiAgKgkgICAgICBSYWxwaCBXdWVydGhuZXIgPHJ3dWVydGhuQGRlLmlibS5jb20+CiAgKgkgICAgICBGZWxpeCBCZWNrIDxmZWxpeC5iZWNrQGRlLmlibS5jb20+CisgKgkgICAgICBIb2xnZXIgRGVuZ2xlciA8aGRAbGludXgudm5ldC5pYm0uY29tPgogICoKICAqIEFkanVuY3QgcHJvY2Vzc29yIGJ1cyBoZWFkZXIgZmlsZS4KICAqCkBAIC03Miw3ICs3MywyNiBAQAogCXVuc2lnbmVkIGludCBpbnRfZW5hYmxlZAk6IDE7CiAJdW5zaWduZWQgaW50IHJlc3BvbnNlX2NvZGUJOiA4OwogCXVuc2lnbmVkIGludCBwYWQyCQk6IDE2OwotfTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVBfUVVFVUVfU1RBVFVTX0lOVkFMSUQgXAorCQl7IDEsIDEsIDEsIDB4RiwgMSwgMHhGRiwgMHhGRkZGIH0KKworc3RhdGljIGlubGluZQoraW50IGFwX3F1ZXVlX3N0YXR1c19pbnZhbGlkX3Rlc3Qoc3RydWN0IGFwX3F1ZXVlX3N0YXR1cyAqc3RhdHVzKQoreworCXN0cnVjdCBhcF9xdWV1ZV9zdGF0dXMgaW52YWxpZCA9IEFQX1FVRVVFX1NUQVRVU19JTlZBTElEOworCXJldHVybiAhKG1lbWNtcChzdGF0dXMsICZpbnZhbGlkLCBzaXplb2Yoc3RydWN0IGFwX3F1ZXVlX3N0YXR1cykpKTsKK30KKworI2RlZmluZSBNQVhfQVBfRkFDSUxJVFkgMzEKKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hcF9mYWNpbGl0eSh1bnNpZ25lZCBpbnQgZnVuY3Rpb24sIHVuc2lnbmVkIGludCBucikKK3sKKwlpZiAobnIgPiBNQVhfQVBfRkFDSUxJVFkpCisJCXJldHVybiAwOworCXJldHVybiBmdW5jdGlvbiAmICh1bnNpZ25lZCBpbnQpKDB4ODAwMDAwMDAgPj4gbnIpOworfQogCiAjZGVmaW5lIEFQX1JFU1BPTlNFX05PUk1BTAkJMHgwMAogI2RlZmluZSBBUF9SRVNQT05TRV9RX05PVF9BVkFJTAkJMHgwMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jdGNtX21wYy5oIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX21wYy5oCmluZGV4IDUzMzYxMjAuLjFmYTA3YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tcGMuaAorKysgYi9kcml2ZXJzL3MzOTAvbmV0L2N0Y21fbXBjLmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpZm5kZWYgX0NUQ19NUENfSF8KICNkZWZpbmUgX0NUQ19NUENfSF8KIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgImZzbS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaAppbmRleCA1NWM2YWExLi4yNmE0MTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKQEAgLTM2MSw3ICszNjEsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBxZXRoX2lzX2xhc3Rfc2JhbGUoc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlKQogewotCXJldHVybiAoc2JhbGUtPmZsYWdzICYgU0JBTF9GTEFHU19MQVNUX0VOVFJZKTsKKwlyZXR1cm4gKHNiYWxlLT5lZmxhZ3MgJiBTQkFMX0VGTEFHU19MQVNUX0VOVFJZKTsKIH0KIAogZW51bSBxZXRoX3FkaW9fYnVmZmVyX3N0YXRlcyB7CkBAIC03MjAsNyArNzIwLDcgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3E7CiAJc3BpbmxvY2tfdCB2bGFubG9jazsKIAlzcGlubG9ja190IG1jbG9jazsKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbmdycDsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV92bGFuc1tCSVRTX1RPX0xPTkdTKFZMQU5fTl9WSUQpXTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHZpZF9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgbWNfbGlzdDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qga2VybmVsX3RocmVhZF9zdGFydGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCmluZGV4IDUwMzY3OGEuLjQ1NTA1NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKQEAgLTg5MCw3ICs4OTAsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAkvKiBpcyBQQ0kgZmxhZyBzZXQgb24gYnVmZmVyPyAqLwotCWlmIChidWYtPmJ1ZmZlci0+ZWxlbWVudFswXS5mbGFncyAmIDB4NDApCisJaWYgKGJ1Zi0+YnVmZmVyLT5lbGVtZW50WzBdLnNmbGFncyAmIFNCQUxfU0ZMQUdTMF9QQ0lfUkVRKQogCQlhdG9taWNfZGVjKCZxdWV1ZS0+c2V0X3BjaV9mbGFnc19jb3VudCk7CiAKIAlza2IgPSBza2JfZGVxdWV1ZSgmYnVmLT5za2JfbGlzdCk7CkBAIC05MDYsOSArOTA2LDExIEBACiAJCWJ1Zi0+aXNfaGVhZGVyW2ldID0gMDsKIAkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0ubGVuZ3RoID0gMDsKIAkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uYWRkciA9IE5VTEw7Ci0JCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2ldLmZsYWdzID0gMDsKKwkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uZWZsYWdzID0gMDsKKwkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uc2ZsYWdzID0gMDsKIAl9Ci0JYnVmLT5idWZmZXItPmVsZW1lbnRbMTVdLmZsYWdzID0gMDsKKwlidWYtPmJ1ZmZlci0+ZWxlbWVudFsxNV0uZWZsYWdzID0gMDsKKwlidWYtPmJ1ZmZlci0+ZWxlbWVudFsxNV0uc2ZsYWdzID0gMDsKIAlidWYtPm5leHRfZWxlbWVudF90b19maWxsID0gMDsKIAlhdG9taWNfc2V0KCZidWYtPnN0YXRlLCBRRVRIX1FESU9fQlVGX0VNUFRZKTsKIH0KQEAgLTEwOTUsNyArMTA5Nyw2IEBACiAJY2FyZC0+ZGV2ID0gTlVMTDsKIAlzcGluX2xvY2tfaW5pdCgmY2FyZC0+dmxhbmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZjYXJkLT5tY2xvY2spOwotCWNhcmQtPnZsYW5ncnAgPSBOVUxMOwogCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmY2FyZC0+aXBfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPnRocmVhZF9tYXNrX2xvY2spOwpAQCAtMjM2OCw5ICsyMzY5LDEwIEBACiAJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2ldLmxlbmd0aCA9IFBBR0VfU0laRTsKIAkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uYWRkciA9ICBwb29sX2VudHJ5LT5lbGVtZW50c1tpXTsKIAkJaWYgKGkgPT0gUUVUSF9NQVhfQlVGRkVSX0VMRU1FTlRTKGNhcmQpIC0gMSkKLQkJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2ldLmZsYWdzID0gU0JBTF9GTEFHU19MQVNUX0VOVFJZOworCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uZWZsYWdzID0gU0JBTF9FRkxBR1NfTEFTVF9FTlRSWTsKIAkJZWxzZQotCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uZmxhZ3MgPSAwOworCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uZWZsYWdzID0gMDsKKwkJYnVmLT5idWZmZXItPmVsZW1lbnRbaV0uc2ZsYWdzID0gMDsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNzE4LDExICsyNzIwLDExIEBACiAJaWYgKHFkaW9fZXJyb3IpIHsKIAkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMiwgZGJmdGV4dCk7CiAJCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCAyLCAiIEYxNT0lMDJYIiwKLQkJCSAgICAgICBidWYtPmVsZW1lbnRbMTVdLmZsYWdzICYgMHhmZik7CisJCQkgICAgICAgYnVmLT5lbGVtZW50WzE1XS5zZmxhZ3MpOwogCQlRRVRIX0NBUkRfVEVYVF8oY2FyZCwgMiwgIiBGMTQ9JTAyWCIsCi0JCQkgICAgICAgYnVmLT5lbGVtZW50WzE0XS5mbGFncyAmIDB4ZmYpOworCQkJICAgICAgIGJ1Zi0+ZWxlbWVudFsxNF0uc2ZsYWdzKTsKIAkJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDIsICIgcWVycj0lWCIsIHFkaW9fZXJyb3IpOwotCQlpZiAoKGJ1Zi0+ZWxlbWVudFsxNV0uZmxhZ3MgJiAweGZmKSA9PSAweDEyKSB7CisJCWlmICgoYnVmLT5lbGVtZW50WzE1XS5zZmxhZ3MpID09IDB4MTIpIHsKIAkJCWNhcmQtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UKQEAgLTI3OTgsNyArMjgwMCw3IEBACiBzdGF0aWMgaW50IHFldGhfaGFuZGxlX3NlbmRfZXJyb3Ioc3RydWN0IHFldGhfY2FyZCAqY2FyZCwKIAkJc3RydWN0IHFldGhfcWRpb19vdXRfYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGludCBxZGlvX2VycikKIHsKLQlpbnQgc2JhbGYxNSA9IGJ1ZmZlci0+YnVmZmVyLT5lbGVtZW50WzE1XS5mbGFncyAmIDB4ZmY7CisJaW50IHNiYWxmMTUgPSBidWZmZXItPmJ1ZmZlci0+ZWxlbWVudFsxNV0uc2ZsYWdzOwogCiAJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNiwgImhkc25kZXJyIik7CiAJaWYgKGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9JUUQpIHsKQEAgLTI5MDcsOCArMjkwOSw4IEBACiAKIAlmb3IgKGkgPSBpbmRleDsgaSA8IGluZGV4ICsgY291bnQ7ICsraSkgewogCQlidWYgPSAmcXVldWUtPmJ1ZnNbaSAlIFFESU9fTUFYX0JVRkZFUlNfUEVSX1FdOwotCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtidWYtPm5leHRfZWxlbWVudF90b19maWxsIC0gMV0uZmxhZ3MgfD0KLQkJCQlTQkFMX0ZMQUdTX0xBU1RfRU5UUlk7CisJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2J1Zi0+bmV4dF9lbGVtZW50X3RvX2ZpbGwgLSAxXS5lZmxhZ3MgfD0KKwkJCQlTQkFMX0VGTEFHU19MQVNUX0VOVFJZOwogCiAJCWlmIChxdWV1ZS0+Y2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX0lRRCkKIAkJCWNvbnRpbnVlOwpAQCAtMjkyMSw3ICsyOTIzLDcgQEAKIAkJCQkvKiBpdCdzIGxpa2VseSB0aGF0IHdlJ2xsIGdvIHRvIHBhY2tpbmcKIAkJCQkgKiBtb2RlIHNvb24gKi8KIAkJCQlhdG9taWNfaW5jKCZxdWV1ZS0+c2V0X3BjaV9mbGFnc19jb3VudCk7Ci0JCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbMF0uZmxhZ3MgfD0gMHg0MDsKKwkJCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFswXS5zZmxhZ3MgfD0gU0JBTF9TRkxBR1MwX1BDSV9SRVE7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoIWF0b21pY19yZWFkKCZxdWV1ZS0+c2V0X3BjaV9mbGFnc19jb3VudCkpIHsKQEAgLTI5MzQsNyArMjkzNiw3IEBACiAJCQkJICogZnVydGhlciBzZW5kIHdhcyByZXF1ZXN0ZWQgYnkgdGhlIHN0YWNrCiAJCQkJICovCiAJCQkJYXRvbWljX2luYygmcXVldWUtPnNldF9wY2lfZmxhZ3NfY291bnQpOwotCQkJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50WzBdLmZsYWdzIHw9IDB4NDA7CisJCQkJYnVmLT5idWZmZXItPmVsZW1lbnRbMF0uc2ZsYWdzIHw9IFNCQUxfU0ZMQUdTMF9QQ0lfUkVROwogCQkJfQogCQl9CiAJfQpAQCAtMzE4MCwyMCArMzE4MiwyMCBAQAogCQlpZiAoIWxlbmd0aCkgewogCQkJaWYgKGZpcnN0X2xhcCkKIAkJCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykKLQkJCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0KLQkJCQkJCVNCQUxfRkxBR1NfRklSU1RfRlJBRzsKKwkJCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmVmbGFncyA9CisJCQkJCQlTQkFMX0VGTEFHU19GSVJTVF9GUkFHOwogCQkJCWVsc2UKLQkJCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0gMDsKKwkJCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmVmbGFncyA9IDA7CiAJCQllbHNlCi0JCQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0KLQkJCQkgICAgU0JBTF9GTEFHU19NSURETEVfRlJBRzsKKwkJCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZWZsYWdzID0KKwkJCQkgICAgU0JBTF9FRkxBR1NfTUlERExFX0ZSQUc7CiAJCX0gZWxzZSB7CiAJCQlpZiAoZmlyc3RfbGFwKQotCQkJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5mbGFncyA9Ci0JCQkJICAgIFNCQUxfRkxBR1NfRklSU1RfRlJBRzsKKwkJCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZWZsYWdzID0KKwkJCQkgICAgU0JBTF9FRkxBR1NfRklSU1RfRlJBRzsKIAkJCWVsc2UKLQkJCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZmxhZ3MgPQotCQkJCSAgICBTQkFMX0ZMQUdTX01JRERMRV9GUkFHOworCQkJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5lZmxhZ3MgPQorCQkJCSAgICBTQkFMX0VGTEFHU19NSURETEVfRlJBRzsKIAkJfQogCQlkYXRhICs9IGxlbmd0aF9oZXJlOwogCQllbGVtZW50Kys7CkBAIC0zMjA1LDEyICszMjA3LDEyIEBACiAJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5hZGRyID0gKGNoYXIgKilwYWdlX3RvX3BoeXMoZnJhZy0+cGFnZSkKIAkJCSsgZnJhZy0+cGFnZV9vZmZzZXQ7CiAJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5sZW5ndGggPSBmcmFnLT5zaXplOwotCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZmxhZ3MgPSBTQkFMX0ZMQUdTX01JRERMRV9GUkFHOworCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZWZsYWdzID0gU0JBTF9FRkxBR1NfTUlERExFX0ZSQUc7CiAJCWVsZW1lbnQrKzsKIAl9CiAKLQlpZiAoYnVmZmVyLT5lbGVtZW50W2VsZW1lbnQgLSAxXS5mbGFncykKLQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnQgLSAxXS5mbGFncyA9IFNCQUxfRkxBR1NfTEFTVF9GUkFHOworCWlmIChidWZmZXItPmVsZW1lbnRbZWxlbWVudCAtIDFdLmVmbGFncykKKwkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnQgLSAxXS5lZmxhZ3MgPSBTQkFMX0VGTEFHU19MQVNUX0ZSQUc7CiAJKm5leHRfZWxlbWVudF90b19maWxsID0gZWxlbWVudDsKIH0KIApAQCAtMzIzNCw3ICszMjM2LDcgQEAKIAkJLypmaWxsIGZpcnN0IGJ1ZmZlciBlbnRyeSBvbmx5IHdpdGggaGVhZGVyIGluZm9ybWF0aW9uICovCiAJCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5hZGRyID0gc2tiLT5kYXRhOwogCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0ubGVuZ3RoID0gaGRyX2xlbjsKLQkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmZsYWdzID0gU0JBTF9GTEFHU19GSVJTVF9GUkFHOworCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uZWZsYWdzID0gU0JBTF9FRkxBR1NfRklSU1RfRlJBRzsKIAkJYnVmLT5uZXh0X2VsZW1lbnRfdG9fZmlsbCsrOwogCQlza2ItPmRhdGEgKz0gaGRyX2xlbjsKIAkJc2tiLT5sZW4gIC09IGhkcl9sZW47CkBAIC0zMjQ2LDcgKzMyNDgsNyBAQAogCQlidWZmZXItPmVsZW1lbnRbZWxlbWVudF0uYWRkciA9IGhkcjsKIAkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgcWV0aF9oZHIpICsKIAkJCQkJCQloZF9sZW47Ci0JCWJ1ZmZlci0+ZWxlbWVudFtlbGVtZW50XS5mbGFncyA9IFNCQUxfRkxBR1NfRklSU1RfRlJBRzsKKwkJYnVmZmVyLT5lbGVtZW50W2VsZW1lbnRdLmVmbGFncyA9IFNCQUxfRUZMQUdTX0ZJUlNUX0ZSQUc7CiAJCWJ1Zi0+aXNfaGVhZGVyW2VsZW1lbnRdID0gMTsKIAkJYnVmLT5uZXh0X2VsZW1lbnRfdG9fZmlsbCsrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCmluZGV4IGZkNjlkYTMuLmZhZmI4YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjMsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pZ21wLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KIAogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9hcnAuaD4KQEAgLTE2OTYsMTYgKzE2OTgsMTggQEAKIHN0YXRpYyB2b2lkIHFldGhfbDNfYWRkX3ZsYW5fbWMoc3RydWN0IHFldGhfY2FyZCAqY2FyZCkKIHsKIAlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7Ci0Jc3RydWN0IHZsYW5fZ3JvdXAgKnZnOwotCWludCBpOworCXUxNiB2aWQ7CiAKIAlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAiYWRkbWN2bCIpOwotCWlmICghcWV0aF9pc19zdXBwb3J0ZWQoY2FyZCwgSVBBX0ZVTExfVkxBTikgfHwgKGNhcmQtPnZsYW5ncnAgPT0gTlVMTCkpCisJaWYgKCFxZXRoX2lzX3N1cHBvcnRlZChjYXJkLCBJUEFfRlVMTF9WTEFOKSkKIAkJcmV0dXJuOwogCi0JdmcgPSBjYXJkLT52bGFuZ3JwOwotCWZvciAoaSA9IDA7IGkgPCBWTEFOX05fVklEOyBpKyspIHsKLQkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZSh2ZywgaSk7CisJZm9yX2VhY2hfc2V0X2JpdCh2aWQsIGNhcmQtPmFjdGl2ZV92bGFucywgVkxBTl9OX1ZJRCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJbmV0ZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXAoY2FyZC0+ZGV2LCB2aWQpOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJaWYgKG5ldGRldiA9PSBOVUxMIHx8CiAJCSAgICAhKG5ldGRldi0+ZmxhZ3MgJiBJRkZfVVApKQogCQkJY29udGludWU7CkBAIC0xNzU5LDE2ICsxNzYzLDE2IEBACiBzdGF0aWMgdm9pZCBxZXRoX2wzX2FkZF92bGFuX21jNihzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkKQogewogCXN0cnVjdCBpbmV0Nl9kZXYgKmluX2RldjsKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmc7Ci0JaW50IGk7CisJdTE2IHZpZDsKIAogCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJhZG1jNnZsIik7Ci0JaWYgKCFxZXRoX2lzX3N1cHBvcnRlZChjYXJkLCBJUEFfRlVMTF9WTEFOKSB8fCAoY2FyZC0+dmxhbmdycCA9PSBOVUxMKSkKKwlpZiAoIXFldGhfaXNfc3VwcG9ydGVkKGNhcmQsIElQQV9GVUxMX1ZMQU4pKQogCQlyZXR1cm47CiAKLQl2ZyA9IGNhcmQtPnZsYW5ncnA7Ci0JZm9yIChpID0gMDsgaSA8IFZMQU5fTl9WSUQ7IGkrKykgewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gdmxhbl9ncm91cF9nZXRfZGV2aWNlKHZnLCBpKTsKKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgY2FyZC0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKKwkJbmV0ZGV2ID0gX192bGFuX2ZpbmRfZGV2X2RlZXAoY2FyZC0+ZGV2LCB2aWQpOwogCQlpZiAobmV0ZGV2ID09IE5VTEwgfHwKIAkJICAgICEobmV0ZGV2LT5mbGFncyAmIElGRl9VUCkpCiAJCQljb250aW51ZTsKQEAgLTE4MDYsMTAgKzE4MTAsMTIgQEAKIAlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CiAJc3RydWN0IGluX2lmYWRkciAqaWZhOwogCXN0cnVjdCBxZXRoX2lwYWRkciAqYWRkcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCiAJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgImZydmFkZHI0Iik7CiAKLQlpbl9kZXYgPSBpbl9kZXZfZ2V0KHZsYW5fZ3JvdXBfZ2V0X2RldmljZShjYXJkLT52bGFuZ3JwLCB2aWQpKTsKKwluZXRkZXYgPSBfX3ZsYW5fZmluZF9kZXZfZGVlcChjYXJkLT5kZXYsIHZpZCk7CisJaW5fZGV2ID0gaW5fZGV2X2dldChuZXRkZXYpOwogCWlmICghaW5fZGV2KQogCQlyZXR1cm47CiAJZm9yIChpZmEgPSBpbl9kZXYtPmlmYV9saXN0OyBpZmE7IGlmYSA9IGlmYS0+aWZhX25leHQpIHsKQEAgLTE4MzIsMTAgKzE4MzgsMTIgQEAKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppbjZfZGV2OwogCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmYTsKIAlzdHJ1Y3QgcWV0aF9pcGFkZHIgKmFkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAogCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDQsICJmcnZhZGRyNiIpOwogCi0JaW42X2RldiA9IGluNl9kZXZfZ2V0KHZsYW5fZ3JvdXBfZ2V0X2RldmljZShjYXJkLT52bGFuZ3JwLCB2aWQpKTsKKwluZXRkZXYgPSBfX3ZsYW5fZmluZF9kZXZfZGVlcChjYXJkLT5kZXYsIHZpZCk7CisJaW42X2RldiA9IGluNl9kZXZfZ2V0KG5ldGRldik7CiAJaWYgKCFpbjZfZGV2KQogCQlyZXR1cm47CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpZmEsICZpbjZfZGV2LT5hZGRyX2xpc3QsIGlmX2xpc3QpIHsKQEAgLTE4NTYsMjYgKzE4NjQsMTUgQEAKIHN0YXRpYyB2b2lkIHFldGhfbDNfZnJlZV92bGFuX2FkZHJlc3NlcyhzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLAogCQkJdW5zaWduZWQgc2hvcnQgdmlkKQogewotCWlmICghY2FyZC0+dmxhbmdycCkKLQkJcmV0dXJuOwogCXFldGhfbDNfZnJlZV92bGFuX2FkZHJlc3NlczQoY2FyZCwgdmlkKTsKIAlxZXRoX2wzX2ZyZWVfdmxhbl9hZGRyZXNzZXM2KGNhcmQsIHZpZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHFldGhfbDNfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKLXsKLQlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2LT5tbF9wcml2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAidmxhbnJlZyIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT52bGFubG9jaywgZmxhZ3MpOwotCWNhcmQtPnZsYW5ncnAgPSBncnA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+dmxhbmxvY2ssIGZsYWdzKTsKLX0KLQogc3RhdGljIHZvaWQgcWV0aF9sM192bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQogeworCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXYtPm1sX3ByaXY7CisKKwlzZXRfYml0KHZpZCwgY2FyZC0+YWN0aXZlX3ZsYW5zKTsKIAlyZXR1cm47CiB9CiAKQEAgLTE4OTIsNyArMTg4OSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnZsYW5sb2NrLCBmbGFncyk7CiAJLyogdW5yZWdpc3RlciBJUCBhZGRyZXNzZXMgb2YgdmxhbiBkZXZpY2UgKi8KIAlxZXRoX2wzX2ZyZWVfdmxhbl9hZGRyZXNzZXMoY2FyZCwgdmlkKTsKLQl2bGFuX2dyb3VwX3NldF9kZXZpY2UoY2FyZC0+dmxhbmdycCwgdmlkLCBOVUxMKTsKKwljbGVhcl9iaXQodmlkLCBjYXJkLT5hY3RpdmVfdmxhbnMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnZsYW5sb2NrLCBmbGFncyk7CiAJcWV0aF9sM19zZXRfbXVsdGljYXN0X2xpc3QoY2FyZC0+ZGV2KTsKIH0KQEAgLTIwMTQsMTAgKzIwMTEsOCBAQAogCQkJCQkJICAgICAgJnZsYW5fdGFnKTsKIAkJCWxlbiA9IHNrYi0+bGVuOwogCQkJaWYgKGlzX3ZsYW4gJiYgIWNhcmQtPm9wdGlvbnMuc25pZmZlcikKLQkJCQl2bGFuX2dyb19yZWNlaXZlKCZjYXJkLT5uYXBpLCBjYXJkLT52bGFuZ3JwLAotCQkJCQl2bGFuX3RhZywgc2tiKTsKLQkJCWVsc2UKLQkJCQluYXBpX2dyb19yZWNlaXZlKCZjYXJkLT5uYXBpLCBza2IpOworCQkJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGFuX3RhZyk7CisJCQluYXBpX2dyb19yZWNlaXZlKCZjYXJkLT5uYXBpLCBza2IpOwogCQkJYnJlYWs7CiAJCWNhc2UgUUVUSF9IRUFERVJfVFlQRV9MQVlFUjI6IC8qIGZvciBIaXBlclNvY2tldHMgc25pZmZlciAqLwogCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwpAQCAtMjExOCwxNSArMjExMywxNSBAQAogCQkJc3RydWN0IHFldGhfY2FyZCAqY2FyZCkKIHsKIAlpbnQgcmMgPSAwOwotCXN0cnVjdCB2bGFuX2dyb3VwICp2ZzsKLQlpbnQgaTsKKwl1MTYgdmlkOwogCi0JdmcgPSBjYXJkLT52bGFuZ3JwOwotCWlmICghdmcpCi0JCXJldHVybiByYzsKKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgY2FyZC0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVkxBTl9OX1ZJRDsgaSsrKSB7Ci0JCWlmICh2bGFuX2dyb3VwX2dldF9kZXZpY2UodmcsIGkpID09IGRldikgeworCQlyY3VfcmVhZF9sb2NrKCk7CisJCW5ldGRldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwKGRldiwgdmlkKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWlmIChuZXRkZXYgPT0gZGV2KSB7CiAJCQlyYyA9IFFFVEhfVkxBTl9DQVJEOwogCQkJYnJlYWs7CiAJCX0KQEAgLTI3NDIsOSArMjczNywxNCBAQAogaW50IGlubGluZSBxZXRoX2wzX2dldF9jYXN0X3R5cGUoc3RydWN0IHFldGhfY2FyZCAqY2FyZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgY2FzdF90eXBlID0gUlROX1VOU1BFQzsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gTlVMTDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAKLQlpZiAoc2tiX2RzdChza2IpICYmIHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyKSB7Ci0JCWNhc3RfdHlwZSA9IHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyLT50eXBlOworCWRzdCA9IHNrYl9kc3Qoc2tiKTsKKwlpZiAoZHN0KQorCQluID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwlpZiAobikgeworCQljYXN0X3R5cGUgPSBuLT50eXBlOwogCQlpZiAoKGNhc3RfdHlwZSA9PSBSVE5fQlJPQURDQVNUKSB8fAogCQkgICAgKGNhc3RfdHlwZSA9PSBSVE5fTVVMVElDQVNUKSB8fAogCQkgICAgKGNhc3RfdHlwZSA9PSBSVE5fQU5ZQ0FTVCkpCkBAIC0yNzg3LDYgKzI3ODcsOSBAQAogc3RhdGljIHZvaWQgcWV0aF9sM19maWxsX2hlYWRlcihzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBzdHJ1Y3QgcWV0aF9oZHIgKmhkciwKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGlwdiwgaW50IGNhc3RfdHlwZSkKIHsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gTlVMTDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisKIAltZW1zZXQoaGRyLCAwLCBzaXplb2Yoc3RydWN0IHFldGhfaGRyKSk7CiAJaGRyLT5oZHIubDMuaWQgPSBRRVRIX0hFQURFUl9UWVBFX0xBWUVSMzsKIAloZHItPmhkci5sMy5leHRfZmxhZ3MgPSAwOwpAQCAtMjc5NSw3ICsyNzk4LDcgQEAKIAkgKiBiZWZvcmUgd2UncmUgZ29pbmcgdG8gb3ZlcndyaXRlIHRoaXMgbG9jYXRpb24gd2l0aCBuZXh0IGhvcCBpcC4KIAkgKiB2NiB1c2VzIHBhc3N0aHJvdWdoLCB2NCBzZXRzIHRoZSB0YWcgaW4gdGhlIFFESU8gaGVhZGVyLgogCSAqLwotCWlmIChjYXJkLT52bGFuZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCWlmICh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKIAkJaWYgKChpcHYgPT0gNCkgfHwgKGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9JUUQpKQogCQkJaGRyLT5oZHIubDMuZXh0X2ZsYWdzID0gUUVUSF9IRFJfRVhUX1ZMQU5fRlJBTUU7CiAJCWVsc2UKQEAgLTI4MDQsMTMgKzI4MDcsMTYgQEAKIAl9CiAKIAloZHItPmhkci5sMy5sZW5ndGggPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgcWV0aF9oZHIpOworCWRzdCA9IHNrYl9kc3Qoc2tiKTsKKwlpZiAoZHN0KQorCQluID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKIAlpZiAoaXB2ID09IDQpIHsKIAkJLyogSVB2NCAqLwogCQloZHItPmhkci5sMy5mbGFncyA9IHFldGhfbDNfZ2V0X3FldGhfaGRyX2ZsYWdzNChjYXN0X3R5cGUpOwogCQltZW1zZXQoaGRyLT5oZHIubDMuZGVzdF9hZGRyLCAwLCAxMik7Ci0JCWlmICgoc2tiX2RzdChza2IpKSAmJiAoc2tiX2RzdChza2IpLT5uZWlnaGJvdXIpKSB7CisJCWlmIChuKSB7CiAJCQkqKCh1MzIgKikgKCZoZHItPmhkci5sMy5kZXN0X2FkZHJbMTJdKSkgPQotCQkJICAgICooKHUzMiAqKSBza2JfZHN0KHNrYiktPm5laWdoYm91ci0+cHJpbWFyeV9rZXkpOworCQkJICAgICooKHUzMiAqKSBuLT5wcmltYXJ5X2tleSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBmaWxsIGluIGRlc3RpbmF0aW9uIGFkZHJlc3MgdXNlZCBpbiBpcCBoZWFkZXIgKi8KIAkJCSooKHUzMiAqKSAoJmhkci0+aGRyLmwzLmRlc3RfYWRkclsxMl0pKSA9CkBAIC0yODIxLDkgKzI4MjcsOSBAQAogCQloZHItPmhkci5sMy5mbGFncyA9IHFldGhfbDNfZ2V0X3FldGhfaGRyX2ZsYWdzNihjYXN0X3R5cGUpOwogCQlpZiAoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX0lRRCkKIAkJCWhkci0+aGRyLmwzLmZsYWdzICY9IH5RRVRIX0hEUl9QQVNTVEhSVTsKLQkJaWYgKChza2JfZHN0KHNrYikpICYmIChza2JfZHN0KHNrYiktPm5laWdoYm91cikpIHsKKwkJaWYgKG4pIHsKIAkJCW1lbWNweShoZHItPmhkci5sMy5kZXN0X2FkZHIsCi0JCQkgICAgICAgc2tiX2RzdChza2IpLT5uZWlnaGJvdXItPnByaW1hcnlfa2V5LCAxNik7CisJCQkgICAgICAgbi0+cHJpbWFyeV9rZXksIDE2KTsKIAkJfSBlbHNlIHsKIAkJCS8qIGZpbGwgaW4gZGVzdGluYXRpb24gYWRkcmVzcyB1c2VkIGluIGlwIGhlYWRlciAqLwogCQkJbWVtY3B5KGhkci0+aGRyLmwzLmRlc3RfYWRkciwKQEAgLTI5NzcsOCArMjk4Myw3IEBACiAJCQkJc2tiX3B1bGwobmV3X3NrYiwgRVRIX0hMRU4pOwogCQl9CiAKLQkJaWYgKGlwdiAhPSA0ICYmIGNhcmQtPnZsYW5ncnAgJiYKLQkJCQl2bGFuX3R4X3RhZ19wcmVzZW50KG5ld19za2IpKSB7CisJCWlmIChpcHYgIT0gNCAmJiB2bGFuX3R4X3RhZ19wcmVzZW50KG5ld19za2IpKSB7CiAJCQlza2JfcHVzaChuZXdfc2tiLCBWTEFOX0hMRU4pOwogCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEobmV3X3NrYiwgbmV3X3NrYi0+ZGF0YSArIDQsIDQpOwogCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KG5ld19za2IsIDQsCkBAIC0zMjIyLDE0ICszMjI3LDEzIEBACiAJLm5kb19zdGFydF94bWl0CQk9IHFldGhfbDNfaGFyZF9zdGFydF94bWl0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gcWV0aF9sM19zZXRfbXVsdGljYXN0X2xpc3QsCi0JLm5kb19kb19pb2N0bAkgICAJPSBxZXRoX2wzX2RvX2lvY3RsLAotCS5uZG9fY2hhbmdlX210dQkgICAJPSBxZXRoX2NoYW5nZV9tdHUsCi0JLm5kb19maXhfZmVhdHVyZXMgICAJPSBxZXRoX2wzX2ZpeF9mZWF0dXJlcywKLQkubmRvX3NldF9mZWF0dXJlcyAgIAk9IHFldGhfbDNfc2V0X2ZlYXR1cmVzLAotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IHFldGhfbDNfdmxhbl9yeF9yZWdpc3RlciwKKwkubmRvX2RvX2lvY3RsCQk9IHFldGhfbDNfZG9faW9jdGwsCisJLm5kb19jaGFuZ2VfbXR1CQk9IHFldGhfY2hhbmdlX210dSwKKwkubmRvX2ZpeF9mZWF0dXJlcwk9IHFldGhfbDNfZml4X2ZlYXR1cmVzLAorCS5uZG9fc2V0X2ZlYXR1cmVzCT0gcWV0aF9sM19zZXRfZmVhdHVyZXMsCiAJLm5kb192bGFuX3J4X2FkZF92aWQJPSBxZXRoX2wzX3ZsYW5fcnhfYWRkX3ZpZCwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQgICA9IHFldGhfbDNfdmxhbl9yeF9raWxsX3ZpZCwKLQkubmRvX3R4X3RpbWVvdXQJICAgCT0gcWV0aF90eF90aW1lb3V0LAorCS5uZG9fdHhfdGltZW91dAkJPSBxZXRoX3R4X3RpbWVvdXQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHFldGhfbDNfb3NhX25ldGRldl9vcHMgPSB7CkBAIC0zMjM5LDE0ICszMjQzLDEzIEBACiAJLm5kb19zdGFydF94bWl0CQk9IHFldGhfbDNfaGFyZF9zdGFydF94bWl0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gcWV0aF9sM19zZXRfbXVsdGljYXN0X2xpc3QsCi0JLm5kb19kb19pb2N0bAkgICAJPSBxZXRoX2wzX2RvX2lvY3RsLAotCS5uZG9fY2hhbmdlX210dQkgICAJPSBxZXRoX2NoYW5nZV9tdHUsCi0JLm5kb19maXhfZmVhdHVyZXMgICAJPSBxZXRoX2wzX2ZpeF9mZWF0dXJlcywKLQkubmRvX3NldF9mZWF0dXJlcyAgIAk9IHFldGhfbDNfc2V0X2ZlYXR1cmVzLAotCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IHFldGhfbDNfdmxhbl9yeF9yZWdpc3RlciwKKwkubmRvX2RvX2lvY3RsCQk9IHFldGhfbDNfZG9faW9jdGwsCisJLm5kb19jaGFuZ2VfbXR1CQk9IHFldGhfY2hhbmdlX210dSwKKwkubmRvX2ZpeF9mZWF0dXJlcwk9IHFldGhfbDNfZml4X2ZlYXR1cmVzLAorCS5uZG9fc2V0X2ZlYXR1cmVzCT0gcWV0aF9sM19zZXRfZmVhdHVyZXMsCiAJLm5kb192bGFuX3J4X2FkZF92aWQJPSBxZXRoX2wzX3ZsYW5fcnhfYWRkX3ZpZCwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQgICA9IHFldGhfbDNfdmxhbl9yeF9raWxsX3ZpZCwKLQkubmRvX3R4X3RpbWVvdXQJICAgCT0gcWV0aF90eF90aW1lb3V0LAorCS5uZG9fdHhfdGltZW91dAkJPSBxZXRoX3R4X3RpbWVvdXQsCiAJLm5kb19uZWlnaF9zZXR1cAk9IHFldGhfbDNfbmVpZ2hfc2V0dXAsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYwppbmRleCA4NTEyYjVjLi4wMjJmYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKQEAgLTY0MCw3ICs2NDAsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHpmY3BfZnNmX3JlcSAqemZjcF9mc2ZfcmVxX2NyZWF0ZShzdHJ1Y3QgemZjcF9xZGlvICpxZGlvLAotCQkJCQkJdTMyIGZzZl9jbWQsIHUzMiBzYnR5cGUsCisJCQkJCQl1MzIgZnNmX2NtZCwgdTggc2J0eXBlLAogCQkJCQkJbWVtcG9vbF90ICpwb29sKQogewogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBxZGlvLT5hZGFwdGVyOwpAQCAtODQxLDcgKzg0MSw3IEBACiAJaWYgKHpmY3BfcWRpb19zYmFsX2dldChxZGlvKSkKIAkJZ290byBvdXQ7CiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9BQk9SVF9GQ1BfQ01ORCwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsCiAJCQkJICBxZGlvLT5hZGFwdGVyLT5wb29sLnNjc2lfYWJvcnQpOwogCWlmIChJU19FUlIocmVxKSkgewogCQlyZXEgPSBOVUxMOwpAQCAtMTAxMiw3ICsxMDEyLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX1NFTkRfR0VORVJJQywKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfV1JJVEVfUkVBRCwgcG9vbCk7CisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9XUklURV9SRUFELCBwb29sKTsKIAogCWlmIChJU19FUlIocmVxKSkgewogCQlyZXQgPSBQVFJfRVJSKHJlcSk7CkBAIC0xMTEwLDcgKzExMTAsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfU0VORF9FTFMsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1dSSVRFX1JFQUQsIE5VTEwpOworCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfV1JJVEVfUkVBRCwgTlVMTCk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKIAkJcmV0ID0gUFRSX0VSUihyZXEpOwpAQCAtMTE1Niw3ICsxMTU2LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX0VYQ0hBTkdFX0NPTkZJR19EQVRBLAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELAorCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwKIAkJCQkgIHFkaW8tPmFkYXB0ZXItPnBvb2wuZXJwX3JlcSk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKQEAgLTExOTgsNyArMTE5OCw3IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfRVhDSEFOR0VfQ09ORklHX0RBVEEsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsIE5VTEwpOworCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwgTlVMTCk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKIAkJcmV0dmFsID0gUFRSX0VSUihyZXEpOwpAQCAtMTI1MCw3ICsxMjUwLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX0VYQ0hBTkdFX1BPUlRfREFUQSwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwKKwkJCQkgIFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQsCiAJCQkJICBxZGlvLT5hZGFwdGVyLT5wb29sLmVycF9yZXEpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CkBAIC0xMjk2LDcgKzEyOTYsNyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX0VYQ0hBTkdFX1BPUlRfREFUQSwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfUkVBRCwgTlVMTCk7CisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELCBOVUxMKTsKIAogCWlmIChJU19FUlIocmVxKSkgewogCQlyZXR2YWwgPSBQVFJfRVJSKHJlcSk7CkBAIC0xNDEyLDcgKzE0MTIsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUocWRpbywgRlNGX1FUQ0JfT1BFTl9QT1JUX1dJVEhfRElELAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELAorCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwKIAkJCQkgIHFkaW8tPmFkYXB0ZXItPnBvb2wuZXJwX3JlcSk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKQEAgLTE0NzgsNyArMTQ3OCw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9DTE9TRV9QT1JULAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELAorCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwKIAkJCQkgIHFkaW8tPmFkYXB0ZXItPnBvb2wuZXJwX3JlcSk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKQEAgLTE1NTMsNyArMTU1Myw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9PUEVOX1BPUlRfV0lUSF9ESUQsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsCisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELAogCQkJCSAgcWRpby0+YWRhcHRlci0+cG9vbC5lcnBfcmVxKTsKIAogCWlmIChJU19FUlIocmVxKSkgewpAQCAtMTYwNiw3ICsxNjA2LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX0NMT1NFX1BPUlQsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsCisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELAogCQkJCSAgcWRpby0+YWRhcHRlci0+cG9vbC5lcnBfcmVxKTsKIAogCWlmIChJU19FUlIocmVxKSkgewpAQCAtMTY5OCw3ICsxNjk4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX0NMT1NFX1BIWVNJQ0FMX1BPUlQsCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsCisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELAogCQkJCSAgcWRpby0+YWRhcHRlci0+cG9vbC5lcnBfcmVxKTsKIAogCWlmIChJU19FUlIocmVxKSkgewpAQCAtMTgxMiw3ICsxODEyLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX09QRU5fTFVOLAotCQkJCSAgU0JBTF9GTEFHUzBfVFlQRV9SRUFELAorCQkJCSAgU0JBTF9TRkxBR1MwX1RZUEVfUkVBRCwKIAkJCQkgIGFkYXB0ZXItPnBvb2wuZXJwX3JlcSk7CiAKIAlpZiAoSVNfRVJSKHJlcSkpIHsKQEAgLTE5MDEsNyArMTkwMSw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9DTE9TRV9MVU4sCi0JCQkJICBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQsCisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9SRUFELAogCQkJCSAgcWRpby0+YWRhcHRlci0+cG9vbC5lcnBfcmVxKTsKIAogCWlmIChJU19FUlIocmVxKSkgewpAQCAtMjE2MSw3ICsyMTYxLDcgQEAKIHsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXE7CiAJc3RydWN0IGZjcF9jbW5kICpmY3BfY21uZDsKLQl1bnNpZ25lZCBpbnQgc2J0eXBlID0gU0JBTF9GTEFHUzBfVFlQRV9SRUFEOworCXU4IHNidHlwZSA9IFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQ7CiAJaW50IHJlYWxfYnl0ZXMsIHJldHZhbCA9IC1FSU8sIGRpeF9ieXRlcyA9IDA7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gc2NzaV9jbW5kLT5kZXZpY2U7CiAJc3RydWN0IHpmY3Bfc2NzaV9kZXYgKnpmY3Bfc2RldiA9IHNkZXZfdG9femZjcChzZGV2KTsKQEAgLTIxODEsNyArMjE4MSw3IEBACiAJfQogCiAJaWYgKHNjc2lfY21uZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKLQkJc2J0eXBlID0gU0JBTF9GTEFHUzBfVFlQRV9XUklURTsKKwkJc2J0eXBlID0gU0JBTF9TRkxBR1MwX1RZUEVfV1JJVEU7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKHFkaW8sIEZTRl9RVENCX0ZDUF9DTU5ELAogCQkJCSAgc2J0eXBlLCBhZGFwdGVyLT5wb29sLnNjc2lfcmVxKTsKQEAgLTIyODAsNyArMjI4MCw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShxZGlvLCBGU0ZfUVRDQl9GQ1BfQ01ORCwKLQkJCQkgIFNCQUxfRkxBR1MwX1RZUEVfV1JJVEUsCisJCQkJICBTQkFMX1NGTEFHUzBfVFlQRV9XUklURSwKIAkJCQkgIHFkaW8tPmFkYXB0ZXItPnBvb2wuc2NzaV9yZXEpOwogCiAJaWYgKElTX0VSUihyZXEpKSB7CkBAIC0yMzI4LDE3ICsyMzI4LDE4IEBACiAJc3RydWN0IHpmY3BfcWRpbyAqcWRpbyA9IGFkYXB0ZXItPnFkaW87CiAJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxID0gTlVMTDsKIAlzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX3N1cHBvcnQgKmJvdHRvbTsKLQlpbnQgZGlyZWN0aW9uLCByZXR2YWwgPSAtRUlPLCBieXRlczsKKwlpbnQgcmV0dmFsID0gLUVJTywgYnl0ZXM7CisJdTggZGlyZWN0aW9uOwogCiAJaWYgKCEoYWRhcHRlci0+YWRhcHRlcl9mZWF0dXJlcyAmIEZTRl9GRUFUVVJFX0NGREMpKQogCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CiAKIAlzd2l0Y2ggKGZzZl9jZmRjLT5jb21tYW5kKSB7CiAJY2FzZSBGU0ZfUVRDQl9ET1dOTE9BRF9DT05UUk9MX0ZJTEU6Ci0JCWRpcmVjdGlvbiA9IFNCQUxfRkxBR1MwX1RZUEVfV1JJVEU7CisJCWRpcmVjdGlvbiA9IFNCQUxfU0ZMQUdTMF9UWVBFX1dSSVRFOwogCQlicmVhazsKIAljYXNlIEZTRl9RVENCX1VQTE9BRF9DT05UUk9MX0ZJTEU6Ci0JCWRpcmVjdGlvbiA9IFNCQUxfRkxBR1MwX1RZUEVfUkVBRDsKKwkJZGlyZWN0aW9uID0gU0JBTF9TRkxBR1MwX1RZUEVfUkVBRDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC0yNDEzLDcgKzI0MTQsNyBAQAogCQlmc2ZfcmVxLT5xZGlvX3JlcS5zYmFsX3Jlc3BvbnNlID0gc2JhbF9pZHg7CiAJCXpmY3BfZnNmX3JlcV9jb21wbGV0ZShmc2ZfcmVxKTsKIAotCQlpZiAobGlrZWx5KHNiYWxlLT5mbGFncyAmIFNCQUxfRkxBR1NfTEFTVF9FTlRSWSkpCisJCWlmIChsaWtlbHkoc2JhbGUtPmVmbGFncyAmIFNCQUxfRUZMQUdTX0xBU1RfRU5UUlkpKQogCQkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uYwppbmRleCA5OGU5N2Q5Li5kOWM0MGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAKIAkvKiBzZXQgbGFzdCBlbnRyeSBmbGFnIGluIGN1cnJlbnQgU0JBTEUgb2YgY3VycmVudCBTQkFMICovCiAJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfY3VycihxZGlvLCBxX3JlcSk7Ci0Jc2JhbGUtPmZsYWdzIHw9IFNCQUxfRkxBR1NfTEFTVF9FTlRSWTsKKwlzYmFsZS0+ZWZsYWdzIHw9IFNCQUxfRUZMQUdTX0xBU1RfRU5UUlk7CiAKIAkvKiBkb24ndCBleGNlZWQgbGFzdCBhbGxvd2VkIFNCQUwgKi8KIAlpZiAocV9yZXEtPnNiYWxfbGFzdCA9PSBxX3JlcS0+c2JhbF9saW1pdCkKQEAgLTEzMiw3ICsxMzIsNyBAQAogCiAJLyogc2V0IGNoYWluaW5nIGZsYWcgaW4gZmlyc3QgU0JBTEUgb2YgY3VycmVudCBTQkFMICovCiAJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfcmVxKHFkaW8sIHFfcmVxKTsKLQlzYmFsZS0+ZmxhZ3MgfD0gU0JBTF9GTEFHUzBfTU9SRV9TQkFMUzsKKwlzYmFsZS0+c2ZsYWdzIHw9IFNCQUxfU0ZMQUdTMF9NT1JFX1NCQUxTOwogCiAJLyogY2FsY3VsYXRlIGluZGV4IG9mIG5leHQgU0JBTCAqLwogCXFfcmVxLT5zYmFsX2xhc3QrKzsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCiAJLyogc2V0IHN0b3JhZ2UtYmxvY2sgdHlwZSBmb3IgbmV3IFNCQUwgKi8KIAlzYmFsZSA9IHpmY3BfcWRpb19zYmFsZV9jdXJyKHFkaW8sIHFfcmVxKTsKLQlzYmFsZS0+ZmxhZ3MgfD0gcV9yZXEtPnNidHlwZTsKKwlzYmFsZS0+c2ZsYWdzIHw9IHFfcmVxLT5zYnR5cGU7CiAKIAlyZXR1cm4gc2JhbGU7CiB9CkBAIC0xNzcsNyArMTc3LDcgQEAKIAogCS8qIHNldCBzdG9yYWdlLWJsb2NrIHR5cGUgZm9yIHRoaXMgcmVxdWVzdCAqLwogCXNiYWxlID0gemZjcF9xZGlvX3NiYWxlX3JlcShxZGlvLCBxX3JlcSk7Ci0Jc2JhbGUtPmZsYWdzIHw9IHFfcmVxLT5zYnR5cGU7CisJc2JhbGUtPnNmbGFncyB8PSBxX3JlcS0+c2J0eXBlOwogCiAJZm9yICg7IHNnOyBzZyA9IHNnX25leHQoc2cpKSB7CiAJCXNiYWxlID0gemZjcF9xZGlvX3NiYWxlX25leHQocWRpbywgcV9yZXEpOwpAQCAtMzg0LDcgKzM4NCw4IEBACiAJZm9yIChjYyA9IDA7IGNjIDwgUURJT19NQVhfQlVGRkVSU19QRVJfUTsgY2MrKykgewogCQlzYmFsZSA9ICYocWRpby0+cmVzX3FbY2NdLT5lbGVtZW50WzBdKTsKIAkJc2JhbGUtPmxlbmd0aCA9IDA7Ci0JCXNiYWxlLT5mbGFncyA9IFNCQUxfRkxBR1NfTEFTVF9FTlRSWTsKKwkJc2JhbGUtPmVmbGFncyA9IFNCQUxfRUZMQUdTX0xBU1RfRU5UUlk7CisJCXNiYWxlLT5zZmxhZ3MgPSAwOwogCQlzYmFsZS0+YWRkciA9IE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5oCmluZGV4IDIyOTdkOGQuLjU0ZTIyYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5oCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5oCkBAIC02Nyw3ICs2Nyw3IEBACiAgKiBAcWRpb19vdXRiX3VzYWdlOiB1c2FnZSBvZiBvdXRib3VuZCBxdWV1ZQogICovCiBzdHJ1Y3QgemZjcF9xZGlvX3JlcSB7Ci0JdTMyCXNidHlwZTsKKwl1OAlzYnR5cGU7CiAJdTgJc2JhbF9udW1iZXI7CiAJdTgJc2JhbF9maXJzdDsKIAl1OAlzYmFsX2xhc3Q7CkBAIC0xMTYsNyArMTE2LDcgQEAKICAqLwogc3RhdGljIGlubGluZQogdm9pZCB6ZmNwX3FkaW9fcmVxX2luaXQoc3RydWN0IHpmY3BfcWRpbyAqcWRpbywgc3RydWN0IHpmY3BfcWRpb19yZXEgKnFfcmVxLAotCQkJdW5zaWduZWQgbG9uZyByZXFfaWQsIHUzMiBzYnR5cGUsIHZvaWQgKmRhdGEsIHUzMiBsZW4pCisJCQl1bnNpZ25lZCBsb25nIHJlcV9pZCwgdTggc2J0eXBlLCB2b2lkICpkYXRhLCB1MzIgbGVuKQogewogCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAlpbnQgY291bnQgPSBtaW4oYXRvbWljX3JlYWQoJnFkaW8tPnJlcV9xX2ZyZWUpLApAQCAtMTMxLDcgKzEzMSw4IEBACiAKIAlzYmFsZSA9IHpmY3BfcWRpb19zYmFsZV9yZXEocWRpbywgcV9yZXEpOwogCXNiYWxlLT5hZGRyID0gKHZvaWQgKikgcmVxX2lkOwotCXNiYWxlLT5mbGFncyA9IFNCQUxfRkxBR1MwX0NPTU1BTkQgfCBzYnR5cGU7CisJc2JhbGUtPmVmbGFncyA9IDA7CisJc2JhbGUtPnNmbGFncyA9IFNCQUxfU0ZMQUdTMF9DT01NQU5EIHwgc2J0eXBlOwogCiAJaWYgKHVubGlrZWx5KCFkYXRhKSkKIAkJcmV0dXJuOwpAQCAtMTczLDcgKzE3NCw3IEBACiAJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOwogCiAJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfY3VycihxZGlvLCBxX3JlcSk7Ci0Jc2JhbGUtPmZsYWdzIHw9IFNCQUxfRkxBR1NfTEFTVF9FTlRSWTsKKwlzYmFsZS0+ZWZsYWdzIHw9IFNCQUxfRUZMQUdTX0xBU1RfRU5UUlk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwppbmRleCA0YTFmMDI5Li44ZDlkYWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwpAQCAtODMwLDYgKzgzMCwxOSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ2R0aC4KIAorY29uZmlnIFNDU0lfSVNDSQorCXRyaXN0YXRlICJJbnRlbChSKSBDNjAwIFNlcmllcyBDaGlwc2V0IFNBUyBDb250cm9sbGVyIgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwlkZXBlbmRzIG9uIFg4NgorCSMgKHRlbXBvcmFyeSk6IGtub3duIGFscGhhIHF1YWxpdHkgZHJpdmVyCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU0NTSV9TQVNfTElCU0FTCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIDZHYi9zIFNBUyBjYXBhYmlsaXRpZXMgb2YgdGhlIHN0b3JhZ2UKKwkgIGNvbnRyb2wgdW5pdCBmb3VuZCBpbiB0aGUgSW50ZWwoUikgQzYwMCBzZXJpZXMgY2hpcHNldC4KKworCSAgVGhlIGV4cGVyaW1lbnRhbCB0YWcgd2lsbCBiZSByZW1vdmVkIGFmdGVyIHRoZSBkcml2ZXIgZXhpdHMgYWxwaGEKKwogY29uZmlnIFNDU0lfR0VORVJJQ19OQ1I1MzgwCiAJdHJpc3RhdGUgIkdlbmVyaWMgTkNSNTM4MC81M2M0MDAgU0NTSSBQSU8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElTQSAmJiBTQ1NJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKaW5kZXggN2FkMGI4YS4uM2MwOGY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQpAQCAtNzMsNiArNzMsNyBAQAogb2JqLSQoQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQpCSs9IGFpYzd4eHhfb2xkLm8KIG9iai0kKENPTkZJR19TQ1NJX0FJQzk0WFgpCSs9IGFpYzk0eHgvCiBvYmotJChDT05GSUdfU0NTSV9QTTgwMDEpCSs9IHBtODAwMS8KK29iai0kKENPTkZJR19TQ1NJX0lTQ0kpCQkrPSBpc2NpLwogb2JqLSQoQ09ORklHX1NDU0lfSVBTKQkJKz0gaXBzLm8KIG9iai0kKENPTkZJR19TQ1NJX0ZEX01DUykJKz0gZmRfbWNzLm8KIG9iai0kKENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4pKz0gZmRvbWFpbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguYwppbmRleCBjNTE2OWYwLi5mMTdjOTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9haGExNTJ4LmMKQEAgLTQyMiwxMCArNDIyLDE5IEBACiAKICNpZmRlZiBfX0lTQVBOUF9fCiBzdGF0aWMgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0gewotCXsgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKLQkJSVNBUE5QX1ZFTkRPUignQScsJ0QnLCdQJyksIElTQVBOUF9GVU5DVElPTigweDE1MDUpLCAwIH0sCi0JeyBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAotCQlJU0FQTlBfVkVORE9SKCdBJywnRCcsJ1AnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MTUzMCksIDAgfSwKKwl7IElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCUlTQVBOUF9WRU5ET1IoJ0EnLCAnRCcsICdQJyksIElTQVBOUF9GVU5DVElPTigweDE1MDIpLCAwIH0sCisJeyBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAlJU0FQTlBfVkVORE9SKCdBJywgJ0QnLCAnUCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgxNTA1KSwgMCB9LAorCXsgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwJSVNBUE5QX1ZFTkRPUignQScsICdEJywgJ1AnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MTUxMCksIDAgfSwKKwl7IElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCUlTQVBOUF9WRU5ET1IoJ0EnLCAnRCcsICdQJyksIElTQVBOUF9GVU5DVElPTigweDE1MTUpLCAwIH0sCisJeyBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAlJU0FQTlBfVkVORE9SKCdBJywgJ0QnLCAnUCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgxNTIwKSwgMCB9LAorCXsgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwJSVNBUE5QX1ZFTkRPUignQScsICdEJywgJ1AnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MjAxNSksIDAgfSwKKwl7IElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCUlTQVBOUF9WRU5ET1IoJ0EnLCAnRCcsICdQJyksIElTQVBOUF9GVU5DVElPTigweDE1MjIpLCAwIH0sCisJeyBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAlJU0FQTlBfVkVORE9SKCdBJywgJ0QnLCAnUCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgyMjE1KSwgMCB9LAorCXsgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwJSVNBUE5QX1ZFTkRPUignQScsICdEJywgJ1AnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MTUzMCksIDAgfSwKKwl7IElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCUlTQVBOUF9WRU5ET1IoJ0EnLCAnRCcsICdQJyksIElTQVBOUF9GVU5DVElPTigweDMwMTUpLCAwIH0sCisJeyBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAlJU0FQTlBfVkVORE9SKCdBJywgJ0QnLCAnUCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgxNTMyKSwgMCB9LAorCXsgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwJSVNBUE5QX1ZFTkRPUignQScsICdEJywgJ1AnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MzIxNSksIDAgfSwKKwl7IElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCUlTQVBOUF9WRU5ET1IoJ0EnLCAnRCcsICdQJyksIElTQVBOUF9GVU5DVElPTigweDYzNjApLCAwIH0sCiAJeyBJU0FQTlBfREVWSUNFX1NJTkdMRV9FTkQsIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGlzYXBucCwgaWRfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2F0YXJpX05DUjUzODAuYyBiL2RyaXZlcnMvc2NzaS9hdGFyaV9OQ1I1MzgwLmMKaW5kZXggZWE0MzlmOS4uMmRiNzliNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2F0YXJpX05DUjUzODAuYworKysgYi9kcml2ZXJzL3Njc2kvYXRhcmlfTkNSNTM4MC5jCkBAIC04OTIsNiArODkyLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIE5DUjUzODBfZXhpdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwkvKiBFbXB0eSwgYXMgd2UgZGlkbid0IHNjaGVkdWxlIGFueSBkZWxheWVkIHdvcmsgKi8KK30KKwogLyoKICAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfcXVldWVfY29tbWFuZCAoU2NzaV9DbW5kICpjbWQsCiAgKgl2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQpAQCAtOTE0LDcgKzkxOSw2IEBACiB7CiAJU0VUVVBfSE9TVERBVEEoY21kLT5kZXZpY2UtPmhvc3QpOwogCVNjc2lfQ21uZCAqdG1wOwotCWludCBvbGR0bzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAjaWYgKE5ERUJVRyAmIE5ERUJVR19OT19XUklURSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvYXRhcmlfc2NzaS5jCmluZGV4IDNlODY1OGUuLjA0YTE1NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2F0YXJpX3Njc2kuYwpAQCAtNzMwLDYgKzczMCw3IEBACiAJCWZyZWVfaXJxKElSUV9UVF9NRlBfU0NTSSwgc2gpOwogCWlmIChhdGFyaV9kbWFfYnVmZmVyKQogCQlhdGFyaV9zdHJhbV9mcmVlKGF0YXJpX2RtYV9idWZmZXIpOworCU5DUjUzODBfZXhpdChzaCk7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jCmluZGV4IDk0YjlhMDcuLjBhOWJkZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYwpAQCAtMjE1LDczICsyMTUsNjIgQEAKIHN0YXRpYyBzc2l6ZV90IGJlaXNjc2lfc2hvd19ib290X3RndF9pbmZvKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gZGF0YTsKKwlzdHJ1Y3QgbWdtdF9zZXNzaW9uX2luZm8gKmJvb3Rfc2VzcyA9ICZwaGJhLT5ib290X3Nlc3M7CisJc3RydWN0IG1nbXRfY29ubl9pbmZvICpib290X2Nvbm4gPSAmYm9vdF9zZXNzLT5jb25uX2xpc3RbMF07CiAJY2hhciAqc3RyID0gYnVmOwogCWludCByYzsKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgSVNDU0lfQk9PVF9UR1RfTkFNRToKIAkJcmMgPSBzcHJpbnRmKGJ1ZiwgIiUuKnNcbiIsCi0JCQkJKGludClzdHJsZW4ocGhiYS0+Ym9vdF9zZXNzLnRhcmdldF9uYW1lKSwKLQkJCQkoY2hhciAqKSZwaGJhLT5ib290X3Nlc3MudGFyZ2V0X25hbWUpOworCQkJICAgIChpbnQpc3RybGVuKGJvb3Rfc2Vzcy0+dGFyZ2V0X25hbWUpLAorCQkJICAgIChjaGFyICopJmJvb3Rfc2Vzcy0+dGFyZ2V0X25hbWUpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX0JPT1RfVEdUX0lQX0FERFI6Ci0JCWlmIChwaGJhLT5ib290X3Nlc3MuY29ubl9saXN0WzBdLmRlc3RfaXBhZGRyLmlwX3R5cGUgPT0gMHgxKQorCQlpZiAoYm9vdF9jb25uLT5kZXN0X2lwYWRkci5pcF90eXBlID09IDB4MSkKIAkJCXJjID0gc3ByaW50ZihidWYsICIlcEk0XG4iLAotCQkJCShjaGFyICopJnBoYmEtPmJvb3Rfc2Vzcy5jb25uX2xpc3RbMF0uCi0JCQkJZGVzdF9pcGFkZHIuaXBfYWRkcmVzcyk7CisJCQkJKGNoYXIgKikmYm9vdF9jb25uLT5kZXN0X2lwYWRkci5pcF9hZGRyZXNzKTsKIAkJZWxzZQogCQkJcmMgPSBzcHJpbnRmKHN0ciwgIiVwSTZcbiIsCi0JCQkJKGNoYXIgKikmcGhiYS0+Ym9vdF9zZXNzLmNvbm5fbGlzdFswXS4KLQkJCQlkZXN0X2lwYWRkci5pcF9hZGRyZXNzKTsKKwkJCQkoY2hhciAqKSZib290X2Nvbm4tPmRlc3RfaXBhZGRyLmlwX2FkZHJlc3MpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX0JPT1RfVEdUX1BPUlQ6Ci0JCXJjID0gc3ByaW50ZihzdHIsICIlZFxuIiwgcGhiYS0+Ym9vdF9zZXNzLmNvbm5fbGlzdFswXS4KLQkJCQkgIGRlc3RfcG9ydCk7CisJCXJjID0gc3ByaW50ZihzdHIsICIlZFxuIiwgYm9vdF9jb25uLT5kZXN0X3BvcnQpOwogCQlicmVhazsKIAogCWNhc2UgSVNDU0lfQk9PVF9UR1RfQ0hBUF9OQU1FOgogCQlyYyA9IHNwcmludGYoc3RyLCAgIiUuKnNcbiIsCi0JCQkJICAgICAgcGhiYS0+Ym9vdF9zZXNzLmNvbm5fbGlzdFswXS4KLQkJCQkgICAgICBuZWdvdGlhdGVkX2xvZ2luX29wdGlvbnMuYXV0aF9kYXRhLmNoYXAuCi0JCQkJICAgICAgdGFyZ2V0X2NoYXBfbmFtZV9sZW5ndGgsCi0JCQkJICAgICAgKGNoYXIgKikmcGhiYS0+Ym9vdF9zZXNzLmNvbm5fbGlzdFswXS4KLQkJCQkgICAgICBuZWdvdGlhdGVkX2xvZ2luX29wdGlvbnMuYXV0aF9kYXRhLmNoYXAuCi0JCQkJICAgICAgdGFyZ2V0X2NoYXBfbmFtZSk7CisJCQkgICAgIGJvb3RfY29ubi0+bmVnb3RpYXRlZF9sb2dpbl9vcHRpb25zLmF1dGhfZGF0YS5jaGFwLgorCQkJICAgICB0YXJnZXRfY2hhcF9uYW1lX2xlbmd0aCwKKwkJCSAgICAgKGNoYXIgKikmYm9vdF9jb25uLT5uZWdvdGlhdGVkX2xvZ2luX29wdGlvbnMuCisJCQkgICAgIGF1dGhfZGF0YS5jaGFwLnRhcmdldF9jaGFwX25hbWUpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX0JPT1RfVEdUX0NIQVBfU0VDUkVUOgogCQlyYyA9IHNwcmludGYoc3RyLCAgIiUuKnNcbiIsCi0JCQkJICAgICAgcGhiYS0+Ym9vdF9zZXNzLmNvbm5fbGlzdFswXS4KLQkJCQkgICAgICBuZWdvdGlhdGVkX2xvZ2luX29wdGlvbnMuYXV0aF9kYXRhLmNoYXAuCi0JCQkJICAgICAgdGFyZ2V0X3NlY3JldF9sZW5ndGgsCi0JCQkJICAgICAgKGNoYXIgKikmcGhiYS0+Ym9vdF9zZXNzLmNvbm5fbGlzdFswXS4KLQkJCQkgICAgICBuZWdvdGlhdGVkX2xvZ2luX29wdGlvbnMuYXV0aF9kYXRhLmNoYXAuCi0JCQkJICAgICAgdGFyZ2V0X3NlY3JldCk7Ci0KKwkJCSAgICAgYm9vdF9jb25uLT5uZWdvdGlhdGVkX2xvZ2luX29wdGlvbnMuYXV0aF9kYXRhLmNoYXAuCisJCQkgICAgIHRhcmdldF9zZWNyZXRfbGVuZ3RoLAorCQkJICAgICAoY2hhciAqKSZib290X2Nvbm4tPm5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy4KKwkJCSAgICAgYXV0aF9kYXRhLmNoYXAudGFyZ2V0X3NlY3JldCk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfQk9PVF9UR1RfUkVWX0NIQVBfTkFNRToKIAkJcmMgPSBzcHJpbnRmKHN0ciwgICIlLipzXG4iLAotCQkJCSAgICAgIHBoYmEtPmJvb3Rfc2Vzcy5jb25uX2xpc3RbMF0uCi0JCQkJICAgICAgbmVnb3RpYXRlZF9sb2dpbl9vcHRpb25zLmF1dGhfZGF0YS5jaGFwLgotCQkJCSAgICAgIGludHJfY2hhcF9uYW1lX2xlbmd0aCwKLQkJCQkgICAgICAoY2hhciAqKSZwaGJhLT5ib290X3Nlc3MuY29ubl9saXN0WzBdLgotCQkJCSAgICAgIG5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy5hdXRoX2RhdGEuY2hhcC4KLQkJCQkgICAgICBpbnRyX2NoYXBfbmFtZSk7Ci0KKwkJCSAgICAgYm9vdF9jb25uLT5uZWdvdGlhdGVkX2xvZ2luX29wdGlvbnMuYXV0aF9kYXRhLmNoYXAuCisJCQkgICAgIGludHJfY2hhcF9uYW1lX2xlbmd0aCwKKwkJCSAgICAgKGNoYXIgKikmYm9vdF9jb25uLT5uZWdvdGlhdGVkX2xvZ2luX29wdGlvbnMuCisJCQkgICAgIGF1dGhfZGF0YS5jaGFwLmludHJfY2hhcF9uYW1lKTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9CT09UX1RHVF9SRVZfQ0hBUF9TRUNSRVQ6Ci0JCQlyYyA9IHNwcmludGYoc3RyLCAgIiUuKnNcbiIsCi0JCQkJICAgICAgcGhiYS0+Ym9vdF9zZXNzLmNvbm5fbGlzdFswXS4KLQkJCQkgICAgICBuZWdvdGlhdGVkX2xvZ2luX29wdGlvbnMuYXV0aF9kYXRhLmNoYXAuCi0JCQkJICAgICAgaW50cl9zZWNyZXRfbGVuZ3RoLAotCQkJCSAgICAgIChjaGFyICopJnBoYmEtPmJvb3Rfc2Vzcy5jb25uX2xpc3RbMF0uCi0JCQkJICAgICAgbmVnb3RpYXRlZF9sb2dpbl9vcHRpb25zLmF1dGhfZGF0YS5jaGFwLgotCQkJCSAgICAgIGludHJfc2VjcmV0KTsKKwkJcmMgPSBzcHJpbnRmKHN0ciwgICIlLipzXG4iLAorCQkJICAgICBib290X2Nvbm4tPm5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy5hdXRoX2RhdGEuY2hhcC4KKwkJCSAgICAgaW50cl9zZWNyZXRfbGVuZ3RoLAorCQkJICAgICAoY2hhciAqKSZib290X2Nvbm4tPm5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy4KKwkJCSAgICAgYXV0aF9kYXRhLmNoYXAuaW50cl9zZWNyZXQpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX0JPT1RfVEdUX0ZMQUdTOgotCQkJcmMgPSBzcHJpbnRmKHN0ciwgIjJcbiIpOworCQlyYyA9IHNwcmludGYoc3RyLCAiMlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfQk9PVF9UR1RfTklDX0FTU09DOgotCQkJcmMgPSBzcHJpbnRmKHN0ciwgIjBcbiIpOworCQlyYyA9IHNwcmludGYoc3RyLCAiMFxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJjID0gLUVOT1NZUzsKQEAgLTMxNSwxMCArMzA0LDEwIEBACiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIElTQ1NJX0JPT1RfRVRIX0ZMQUdTOgotCQkJcmMgPSBzcHJpbnRmKHN0ciwgIjJcbiIpOworCQlyYyA9IHNwcmludGYoc3RyLCAiMlxuIik7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfQk9PVF9FVEhfSU5ERVg6Ci0JCQlyYyA9IHNwcmludGYoc3RyLCAiMFxuIik7CisJCXJjID0gc3ByaW50ZihzdHIsICIwXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9CT09UX0VUSF9NQUM6CiAJCXJjICA9IGJlaXNjc2lfZ2V0X21hY2FkZHIoYnVmLCBwaGJhKTsKQEAgLTM5MSw0MCArMzgwLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgYmVpc2NzaV9zZXR1cF9ib290X2luZm8oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQotewotCXN0cnVjdCBpc2NzaV9ib290X2tvYmogKmJvb3Rfa29iajsKLQotCXBoYmEtPmJvb3Rfa3NldCA9IGlzY3NpX2Jvb3RfY3JlYXRlX2hvc3Rfa3NldChwaGJhLT5zaG9zdC0+aG9zdF9ubyk7Ci0JaWYgKCFwaGJhLT5ib290X2tzZXQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogZ2V0IGJvb3QgaW5mbyB1c2luZyBtZ210IGNtZCAqLwotCWJvb3Rfa29iaiA9IGlzY3NpX2Jvb3RfY3JlYXRlX3RhcmdldChwaGJhLT5ib290X2tzZXQsIDAsIHBoYmEsCi0JCQkJCSAgICAgYmVpc2NzaV9zaG93X2Jvb3RfdGd0X2luZm8sCi0JCQkJCSAgICAgYmVpc2NzaV90Z3RfZ2V0X2F0dHJfdmlzaWJpbGl0eSk7Ci0JaWYgKCFib290X2tvYmopCi0JCWdvdG8gZnJlZV9rc2V0OwotCi0JYm9vdF9rb2JqID0gaXNjc2lfYm9vdF9jcmVhdGVfaW5pdGlhdG9yKHBoYmEtPmJvb3Rfa3NldCwgMCwgcGhiYSwKLQkJCQkJICAgICBiZWlzY3NpX3Nob3dfYm9vdF9pbmlfaW5mbywKLQkJCQkJICAgICBiZWlzY3NpX2luaV9nZXRfYXR0cl92aXNpYmlsaXR5KTsKLQlpZiAoIWJvb3Rfa29iaikKLQkJZ290byBmcmVlX2tzZXQ7Ci0KLQlib290X2tvYmogPSBpc2NzaV9ib290X2NyZWF0ZV9ldGhlcm5ldChwaGJhLT5ib290X2tzZXQsIDAsIHBoYmEsCi0JCQkJCSAgICAgYmVpc2NzaV9zaG93X2Jvb3RfZXRoX2luZm8sCi0JCQkJCSAgICAgYmVpc2NzaV9ldGhfZ2V0X2F0dHJfdmlzaWJpbGl0eSk7Ci0JaWYgKCFib290X2tvYmopCi0JCWdvdG8gZnJlZV9rc2V0OwotCXJldHVybiAwOwotCi1mcmVlX2tzZXQ6Ci0JaWYgKHBoYmEtPmJvb3Rfa3NldCkKLQkJaXNjc2lfYm9vdF9kZXN0cm95X2tzZXQocGhiYS0+Ym9vdF9rc2V0KTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tIFBDSSBEcml2ZXIgb3BlcmF0aW9ucyBhbmQgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGJlaXNjc2lfcGNpX2lkX3RhYmxlKSA9IHsKIAl7IFBDSV9ERVZJQ0UoQkVfVkVORE9SX0lELCBCRV9ERVZJQ0VfSUQxKSB9LApAQCAtNDgzLDE0ICs0MzgsNiBAQAogCWlmIChpc2NzaV9ob3N0X2FkZChzaG9zdCwgJnBoYmEtPnBjaWRldi0+ZGV2KSkKIAkJZ290byBmcmVlX2RldmljZXM7CiAKLQlpZiAoYmVpc2NzaV9zZXR1cF9ib290X2luZm8ocGhiYSkpCi0JCS8qCi0JCSAqIGxvZyBlcnJvciBidXQgY29udGludWUsIGJlY2F1c2Ugd2UgbWF5IG5vdCBiZSB1c2luZwotCQkgKiBpc2NzaSBib290LgotCQkgKi8KLQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgIkNvdWxkIG5vdCBzZXQgdXAgIgotCQkiaVNDU0kgYm9vdCBpbmZvLiIpOwotCiAJcmV0dXJuIHBoYmE7CiAKIGZyZWVfZGV2aWNlczoKQEAgLTM1MTEsNiArMzQ1OCw3IEBACiAJdW5zaWduZWQgaW50IHRhZywgd3JiX251bTsKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXMsIGV4dGRfc3RhdHVzOwogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2NxID0gJnBoYmEtPmN0cmwubWNjX29iai5xOworCWludCByZXQgPSAtRU5PTUVNOwogCiAJdGFnID0gYmVpc2NzaV9nZXRfYm9vdF90YXJnZXQocGhiYSk7CiAJaWYgKCF0YWcpIHsKQEAgLTM1MzUsOCArMzQ4Myw3IEBACiAJYm9vdF9yZXNwID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCiAJaWYgKGJvb3RfcmVzcC0+Ym9vdF9zZXNzaW9uX2hhbmRsZSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJObyBCb290IFNlc3Npb24gZm9yIHRoaXMgcGNpX2Z1bmMsIgotCQkJInNlc3Npb24gSG5kbCA9ICVkXG4iLCBib290X3Jlc3AtPmJvb3Rfc2Vzc2lvbl9oYW5kbGUpOworCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBwaGJhLT5zaG9zdCwgIk5vIEJvb3QgU2Vzc2lvbi5cbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIApAQCAtMzU3NCwxNCArMzUyMSw3MCBAQAogCXdyYiA9IHF1ZXVlX2dldF93cmIobWNjcSwgd3JiX251bSk7CiAJZnJlZV9tY2NfdGFnKCZwaGJhLT5jdHJsLCB0YWcpOwogCXNlc3Npb25fcmVzcCA9IG5vbmVtYl9jbWQudmEgOworCiAJbWVtY3B5KCZwaGJhLT5ib290X3Nlc3MsICZzZXNzaW9uX3Jlc3AtPnNlc3Npb25faW5mbywKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBtZ210X3Nlc3Npb25faW5mbykpOwotCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LCBub25lbWJfY21kLnNpemUsCi0JCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7Ci0JcmV0dXJuIDA7CisJcmV0ID0gMDsKKwogYm9vdF9mcmVlbWVtOgogCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LCBub25lbWJfY21kLnNpemUsCiAJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYmVpc2NzaV9ib290X3JlbGVhc2Uodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBkYXRhOworCisJc2NzaV9ob3N0X3B1dChwaGJhLT5zaG9zdCk7Cit9CisKK3N0YXRpYyBpbnQgYmVpc2NzaV9zZXR1cF9ib290X2luZm8oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXN0cnVjdCBpc2NzaV9ib290X2tvYmogKmJvb3Rfa29iajsKKworCS8qIGdldCBib290IGluZm8gdXNpbmcgbWdtdCBjbWQgKi8KKwlpZiAoYmVpc2NzaV9nZXRfYm9vdF9pbmZvKHBoYmEpKQorCQkvKiBUcnkgdG8gc2VlIGlmIHdlIGNhbiBjYXJyeSBvbiB3aXRob3V0IHRoaXMgKi8KKwkJcmV0dXJuIDA7CisKKwlwaGJhLT5ib290X2tzZXQgPSBpc2NzaV9ib290X2NyZWF0ZV9ob3N0X2tzZXQocGhiYS0+c2hvc3QtPmhvc3Rfbm8pOworCWlmICghcGhiYS0+Ym9vdF9rc2V0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGdldCBhIHJlZiBiZWNhdXNlIHRoZSBzaG93IGZ1bmN0aW9uIHdpbGwgcmVmIHRoZSBwaGJhICovCisJaWYgKCFzY3NpX2hvc3RfZ2V0KHBoYmEtPnNob3N0KSkKKwkJZ290byBmcmVlX2tzZXQ7CisJYm9vdF9rb2JqID0gaXNjc2lfYm9vdF9jcmVhdGVfdGFyZ2V0KHBoYmEtPmJvb3Rfa3NldCwgMCwgcGhiYSwKKwkJCQkJICAgICBiZWlzY3NpX3Nob3dfYm9vdF90Z3RfaW5mbywKKwkJCQkJICAgICBiZWlzY3NpX3RndF9nZXRfYXR0cl92aXNpYmlsaXR5LAorCQkJCQkgICAgIGJlaXNjc2lfYm9vdF9yZWxlYXNlKTsKKwlpZiAoIWJvb3Rfa29iaikKKwkJZ290byBwdXRfc2hvc3Q7CisKKwlpZiAoIXNjc2lfaG9zdF9nZXQocGhiYS0+c2hvc3QpKQorCQlnb3RvIGZyZWVfa3NldDsKKwlib290X2tvYmogPSBpc2NzaV9ib290X2NyZWF0ZV9pbml0aWF0b3IocGhiYS0+Ym9vdF9rc2V0LCAwLCBwaGJhLAorCQkJCQkJYmVpc2NzaV9zaG93X2Jvb3RfaW5pX2luZm8sCisJCQkJCQliZWlzY3NpX2luaV9nZXRfYXR0cl92aXNpYmlsaXR5LAorCQkJCQkJYmVpc2NzaV9ib290X3JlbGVhc2UpOworCWlmICghYm9vdF9rb2JqKQorCQlnb3RvIHB1dF9zaG9zdDsKKworCWlmICghc2NzaV9ob3N0X2dldChwaGJhLT5zaG9zdCkpCisJCWdvdG8gZnJlZV9rc2V0OworCWJvb3Rfa29iaiA9IGlzY3NpX2Jvb3RfY3JlYXRlX2V0aGVybmV0KHBoYmEtPmJvb3Rfa3NldCwgMCwgcGhiYSwKKwkJCQkJICAgICAgIGJlaXNjc2lfc2hvd19ib290X2V0aF9pbmZvLAorCQkJCQkgICAgICAgYmVpc2NzaV9ldGhfZ2V0X2F0dHJfdmlzaWJpbGl0eSwKKwkJCQkJICAgICAgIGJlaXNjc2lfYm9vdF9yZWxlYXNlKTsKKwlpZiAoIWJvb3Rfa29iaikKKwkJZ290byBwdXRfc2hvc3Q7CisJcmV0dXJuIDA7CisKK3B1dF9zaG9zdDoKKwlzY3NpX2hvc3RfcHV0KHBoYmEtPnNob3N0KTsKK2ZyZWVfa3NldDoKKwlpc2NzaV9ib290X2Rlc3Ryb3lfa3NldChwaGJhLT5ib290X2tzZXQpOwogCXJldHVybiAtRU5PTUVNOwogfQogCkBAIC0zOTYzLDExICszOTY2LDEwIEBACiAJfQogCW1lbWNweSgmaW9fdGFzay0+Y21kX2Jocy0+aXNjc2lfZGF0YV9wZHUuCiAJICAgICAgIGR3W29mZnNldG9mKHN0cnVjdCBhbWFwX3BkdV9kYXRhX291dCwgbHVuKSAvIDMyXSwKLQkgICAgICAgaW9fdGFzay0+Y21kX2Jocy0+aXNjc2lfaGRyLmx1biwgc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bikpOworCSAgICAgICAmaW9fdGFzay0+Y21kX2Jocy0+aXNjc2lfaGRyLmx1biwgc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bikpOwogCiAJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGx1biwgcHdyYiwKLQkJICAgICAgY3B1X3RvX2JlMTYoKHVuc2lnbmVkIHNob3J0KWlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2hkci4KLQkJCQkgIGx1blswXSkpOworCQkgICAgICBjcHVfdG9fYmUxNigqKHVuc2lnbmVkIHNob3J0ICopJmlvX3Rhc2stPmNtZF9iaHMtPmlzY3NpX2hkci5sdW4pKTsKIAlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgcjJ0X2V4cF9kdGwsIHB3cmIsIHhmZXJsZW4pOwogCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB3cmJfaWR4LCBwd3JiLAogCQkgICAgICBpb190YXNrLT5wd3JiX2hhbmRsZS0+d3JiX2luZGV4KTsKQEAgLTQxNTAsOCArNDE1Miw3IEBACiAJCQkgICAgcGhiYS0+Y3RybC5tYm94X21lbV9hbGxvY2VkLnNpemUsCiAJCQkgICAgcGhiYS0+Y3RybC5tYm94X21lbV9hbGxvY2VkLnZhLAogCQkJICAgIHBoYmEtPmN0cmwubWJveF9tZW1fYWxsb2NlZC5kbWEpOwotCWlmIChwaGJhLT5ib290X2tzZXQpCi0JCWlzY3NpX2Jvb3RfZGVzdHJveV9rc2V0KHBoYmEtPmJvb3Rfa3NldCk7CisJaXNjc2lfYm9vdF9kZXN0cm95X2tzZXQocGhiYS0+Ym9vdF9rc2V0KTsKIAlpc2NzaV9ob3N0X3JlbW92ZShwaGJhLT5zaG9zdCk7CiAJcGNpX2Rldl9wdXQocGhiYS0+cGNpZGV2KTsKIAlpc2NzaV9ob3N0X2ZyZWUocGhiYS0+c2hvc3QpOwpAQCAtNDMxMCwxMSArNDMxMSwxNSBAQAogCQlnb3RvIGZyZWVfYmxrZW5ibGQ7CiAJfQogCWh3aV9lbmFibGVfaW50cihwaGJhKTsKLQlyZXQgPSBiZWlzY3NpX2dldF9ib290X2luZm8ocGhiYSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgImJlaXNjc2lfZGV2X3Byb2JlLSIKLQkJCSAgICAgIk5vIEJvb3QgRGV2aWNlcyAhISEhIVxuIik7Ci0JfQorCisJaWYgKGJlaXNjc2lfc2V0dXBfYm9vdF9pbmZvKHBoYmEpKQorCQkvKgorCQkgKiBsb2cgZXJyb3IgYnV0IGNvbnRpbnVlLCBiZWNhdXNlIHdlIG1heSBub3QgYmUgdXNpbmcKKwkJICogaXNjc2kgYm9vdC4KKwkJICovCisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsICJDb3VsZCBub3Qgc2V0IHVwICIKKwkJCSAgICAgImlTQ1NJIGJvb3QgaW5mby4iKTsKKwogCVNFX0RFQlVHKERCR19MVkxfOCwgIlxuXG5cbiBTVUNDRVNTIC0gRFJJVkVSIExPQURFRFxuXG5cbiIpOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL2JmYS9NYWtlZmlsZQppbmRleCA0Y2U2ZjQ5Li40NzVjZjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvTWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACiBvYmotJChDT05GSUdfU0NTSV9CRkFfRkMpIDo9IGJmYS5vCiAKLWJmYS15IDo9IGJmYWQubyBiZmFkX2ltLm8gYmZhZF9hdHRyLm8gYmZhZF9kZWJ1Z2ZzLm8KK2JmYS15IDo9IGJmYWQubyBiZmFkX2ltLm8gYmZhZF9hdHRyLm8gYmZhZF9kZWJ1Z2ZzLm8gYmZhZF9ic2cubwogYmZhLXkgKz0gYmZhX2lvYy5vIGJmYV9pb2NfY2IubyBiZmFfaW9jX2N0Lm8gYmZhX2h3X2NiLm8gYmZhX2h3X2N0Lm8KIGJmYS15ICs9IGJmYV9mY3MubyBiZmFfZmNzX2xwb3J0Lm8gYmZhX2Zjc19ycG9ydC5vIGJmYV9mY3NfZmNwaW0ubyBiZmFfZmNidWlsZC5vCiBiZmEteSArPSBiZmFfcG9ydC5vIGJmYV9mY3BpbS5vIGJmYV9jb3JlLm8gYmZhX3N2Yy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYS5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmEuaAppbmRleCA3YmU2YjVhLi4zYjBhZjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhLmgKQEAgLTI3LDcgKzI3LDYgQEAKIHN0cnVjdCBiZmFfczsKIAogdHlwZWRlZiB2b2lkICgqYmZhX2lzcl9mdW5jX3QpIChzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbSk7Ci10eXBlZGVmIHZvaWQgICAgKCpiZmFfY2JfY2Jmbl90KSAodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpOwogCiAvKgogICogSW50ZXJydXB0IG1lc3NhZ2UgaGFuZGxlcnMKQEAgLTU0LDcgKzUzLDggQEAKIAkgKCh2b2lkICopKChzdHJ1Y3QgYmZpX21zZ19zICopKChfX2JmYSktPmlvY2ZjLnJlcV9jcV9iYVtfX3JlcXFdLmt2YSkgXAogCQkgICArIGJmYV9yZXFxX3BpKChfX2JmYSksIChfX3JlcXEpKSkpKQogCi0jZGVmaW5lIGJmYV9yZXFxX3Byb2R1Y2UoX19iZmEsIF9fcmVxcSkJZG8gewkJCQlcCisjZGVmaW5lIGJmYV9yZXFxX3Byb2R1Y2UoX19iZmEsIF9fcmVxcSwgX19taCkgIGRvIHsJCQlcCisJCShfX21oKS5tdGFnLmgyaS5xaWQgICAgID0gKF9fYmZhKS0+aW9jZmMuaHdfcWlkW19fcmVxcV07XAogCQkoX19iZmEpLT5pb2NmYy5yZXFfY3FfcGlbX19yZXFxXSsrOwkJCVwKIAkJKF9fYmZhKS0+aW9jZmMucmVxX2NxX3BpW19fcmVxcV0gJj0JCQlcCiAJCQkoKF9fYmZhKS0+aW9jZmMuY2ZnLmRydmNmZy5udW1fcmVxcV9lbGVtcyAtIDEpOyBcCkBAIC03NiwxNiArNzYsNiBAQAogfSB3aGlsZSAoMCkKIAogLyoKLSAqIFF1ZXVlIGVsZW1lbnQgdG8gd2FpdCBmb3Igcm9vbSBpbiByZXF1ZXN0IHF1ZXVlLiBGSUZPIG9yZGVyIGlzCi0gKiBtYWludGFpbmVkIHdoZW4gZnVsbGZpbGxpbmcgcmVxdWVzdHMuCi0gKi8KLXN0cnVjdCBiZmFfcmVxcV93YWl0X3MgewotCXN0cnVjdCBsaXN0X2hlYWQJcWU7Ci0Jdm9pZAkJKCpxcmVzdW1lKSAodm9pZCAqY2JhcmcpOwotCXZvaWQJCSpjYmFyZzsKLX07Ci0KLS8qCiAgKiBDaXJjdWxhciBxdWV1ZSB1c2FnZSBhc3NpZ25tZW50cwogICovCiBlbnVtIHsKQEAgLTEyOCwxOCArMTE4LDYgQEAKIAogI2RlZmluZSBiZmFfcmVxcV93Y2FuY2VsKF9fd3FlKQlsaXN0X2RlbCgmKF9fd3FlKS0+cWUpCiAKLQotLyoKLSAqIEdlbmVyaWMgQkZBIGNhbGxiYWNrIGVsZW1lbnQuCi0gKi8KLXN0cnVjdCBiZmFfY2JfcWVfcyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgIHFlOwotCWJmYV9jYl9jYmZuX3QgIGNiZm47Ci0JYmZhX2Jvb2xlYW5fdCAgIG9uY2U7Ci0JdTMyCQlyc3ZkOwotCXZvaWQgICAgICAgICAgICpjYmFyZzsKLX07Ci0KICNkZWZpbmUgYmZhX2NiX3F1ZXVlKF9fYmZhLCBfX2hjYl9xZSwgX19jYmZuLCBfX2NiYXJnKSBkbyB7CVwKIAkJKF9faGNiX3FlKS0+Y2JmbiAgPSAoX19jYmZuKTsgICAgICBcCiAJCShfX2hjYl9xZSktPmNiYXJnID0gKF9fY2JhcmcpOyAgICAgIFwKQEAgLTE3Miw0NCArMTUwLDE0IEBACiAKIGV4dGVybiBjaGFyICAgICBiZmFfdmVyc2lvbltdOwogCi0vKgotICogQkZBIG1lbW9yeSByZXNvdXJjZXMKLSAqLwotZW51bSBiZmFfbWVtX3R5cGUgewotCUJGQV9NRU1fVFlQRV9LVkEgPSAxLAkvKiAgS2VybmVsIFZpcnR1YWwgTWVtb3J5ICoobm9uLWRtYS1hYmxlKSAqLwotCUJGQV9NRU1fVFlQRV9ETUEgPSAyLAkvKiAgRE1BLWFibGUgbWVtb3J5ICovCi0JQkZBX01FTV9UWVBFX01BWCA9IEJGQV9NRU1fVFlQRV9ETUEsCi19OwotCi1zdHJ1Y3QgYmZhX21lbV9lbGVtX3MgewotCWVudW0gYmZhX21lbV90eXBlIG1lbV90eXBlOwkvKiBzZWUgZW51bSBiZmFfbWVtX3R5cGUgKi8KLQl1MzIJbWVtX2xlbjsJLyogIFRvdGFsIExlbmd0aCBpbiBCeXRlcwkqLwotCXU4CQkqa3ZhOwkJLyogIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MJKi8KLQl1NjQJZG1hOwkJLyogIGRtYSBhZGRyZXNzIGlmIERNQSBtZW1vcnkJKi8KLQl1OAkJKmt2YV9jdXJwOwkvKiAga3ZhIGFsbG9jYXRpb24gY3Vyc29yCSovCi0JdTY0CWRtYV9jdXJwOwkvKiAgZG1hIGFsbG9jYXRpb24gY3Vyc29yCSovCi19OwotCi1zdHJ1Y3QgYmZhX21lbWluZm9fcyB7Ci0Jc3RydWN0IGJmYV9tZW1fZWxlbV9zIG1lbWluZm9bQkZBX01FTV9UWVBFX01BWF07Ci19OwotI2RlZmluZSBiZmFfbWVtaW5mb19rdmEoX20pCQkJCVwKLQkoKF9tKS0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfS1ZBIC0gMV0ua3ZhX2N1cnApCi0jZGVmaW5lIGJmYV9tZW1pbmZvX2RtYV92aXJ0KF9tKQkJCVwKLQkoKF9tKS0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfRE1BIC0gMV0ua3ZhX2N1cnApCi0jZGVmaW5lIGJmYV9tZW1pbmZvX2RtYV9waHlzKF9tKQkJCVwKLQkoKF9tKS0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfRE1BIC0gMV0uZG1hX2N1cnApCi0KIHN0cnVjdCBiZmFfaW9jZmNfcmVnc19zIHsKIAl2b2lkIF9faW9tZW0JKmludHJfc3RhdHVzOwogCXZvaWQgX19pb21lbQkqaW50cl9tYXNrOwogCXZvaWQgX19pb21lbQkqY3BlX3FfcGlbQkZJX0lPQ19NQVhfQ1FTXTsKIAl2b2lkIF9faW9tZW0JKmNwZV9xX2NpW0JGSV9JT0NfTUFYX0NRU107Ci0Jdm9pZCBfX2lvbWVtCSpjcGVfcV9kZXB0aFtCRklfSU9DX01BWF9DUVNdOwogCXZvaWQgX19pb21lbQkqY3BlX3FfY3RybFtCRklfSU9DX01BWF9DUVNdOwogCXZvaWQgX19pb21lbQkqcm1lX3FfY2lbQkZJX0lPQ19NQVhfQ1FTXTsKIAl2b2lkIF9faW9tZW0JKnJtZV9xX3BpW0JGSV9JT0NfTUFYX0NRU107Ci0Jdm9pZCBfX2lvbWVtCSpybWVfcV9kZXB0aFtCRklfSU9DX01BWF9DUVNdOwogCXZvaWQgX19pb21lbQkqcm1lX3FfY3RybFtCRklfSU9DX01BWF9DUVNdOwogfTsKIApAQCAtMjMxLDI1ICsxNzksNTUgQEAKIAl2b2lkICgqaHdfcmVxcV9hY2spKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcmVxcSk7CiAJdm9pZCAoKmh3X3JzcHFfYWNrKShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpOwogCXZvaWQgKCpod19tc2l4X2luaXQpKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgbnZlY3MpOwotCXZvaWQgKCpod19tc2l4X2luc3RhbGwpKHN0cnVjdCBiZmFfcyAqYmZhKTsKKwl2b2lkICgqaHdfbXNpeF9jdHJsX2luc3RhbGwpKHN0cnVjdCBiZmFfcyAqYmZhKTsKKwl2b2lkICgqaHdfbXNpeF9xdWV1ZV9pbnN0YWxsKShzdHJ1Y3QgYmZhX3MgKmJmYSk7CiAJdm9pZCAoKmh3X21zaXhfdW5pbnN0YWxsKShzdHJ1Y3QgYmZhX3MgKmJmYSk7CiAJdm9pZCAoKmh3X2lzcl9tb2RlX3NldCkoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3QgbXNpeCk7CiAJdm9pZCAoKmh3X21zaXhfZ2V0dmVjcykoc3RydWN0IGJmYV9zICpiZmEsIHUzMiAqdmVjbWFwLAogCQkJCXUzMiAqbnZlY3MsIHUzMiAqbWF4dmVjKTsKIAl2b2lkICgqaHdfbXNpeF9nZXRfcm1lX3JhbmdlKSAoc3RydWN0IGJmYV9zICpiZmEsIHUzMiAqc3RhcnQsCiAJCQkJICAgICAgIHUzMiAqZW5kKTsKKwlpbnQJY3BlX3ZlY19xMDsKKwlpbnQJcm1lX3ZlY19xMDsKIH07CiB0eXBlZGVmIHZvaWQgKCpiZmFfY2JfaW9jZmNfdCkgKHZvaWQgKmNiYXJnLCBlbnVtIGJmYV9zdGF0dXMgc3RhdHVzKTsKIAorc3RydWN0IGJmYV9mYWFfY2Jmbl9zIHsKKwliZmFfY2JfaW9jZmNfdAlmYWFfY2JmbjsKKwl2b2lkCQkqZmFhX2NiYXJnOworfTsKKworI2RlZmluZSBCRkFfRkFBX0VOQUJMRUQJCTEKKyNkZWZpbmUgQkZBX0ZBQV9ESVNBQkxFRAkyCisKKy8qCisgKglGQUEgYXR0cmlidXRlcworICovCitzdHJ1Y3QgYmZhX2ZhYV9hdHRyX3MgeworCXd3bl90CWZhYTsKKwl1OAlmYWFfc3RhdGU7CisJdTgJcHd3bl9zb3VyY2U7CisJdTgJcnN2ZFs2XTsKK307CisKK3N0cnVjdCBiZmFfZmFhX2FyZ3NfcyB7CisJc3RydWN0IGJmYV9mYWFfYXR0cl9zCSpmYWFfYXR0cjsKKwlzdHJ1Y3QgYmZhX2ZhYV9jYmZuX3MJZmFhX2NiOworCXU4CQkJZmFhX3N0YXRlOworCWJmYV9ib29sZWFuX3QJCWJ1c3k7Cit9OworCiBzdHJ1Y3QgYmZhX2lvY2ZjX3MgewogCXN0cnVjdCBiZmFfcwkJKmJmYTsKIAlzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zCWNmZzsKIAlpbnQJCQlhY3Rpb247CiAJdTMyCQlyZXFfY3FfcGlbQkZJX0lPQ19NQVhfQ1FTXTsKIAl1MzIJCXJzcF9jcV9jaVtCRklfSU9DX01BWF9DUVNdOworCXU4CQlod19xaWRbQkZJX0lPQ19NQVhfQ1FTXTsKIAlzdHJ1Y3QgYmZhX2NiX3FlX3MJaW5pdF9oY2JfcWU7CiAJc3RydWN0IGJmYV9jYl9xZV9zCXN0b3BfaGNiX3FlOwogCXN0cnVjdCBiZmFfY2JfcWVfcwlkaXNfaGNiX3FlOworCXN0cnVjdCBiZmFfY2JfcWVfcwllbl9oY2JfcWU7CiAJc3RydWN0IGJmYV9jYl9xZV9zCXN0YXRzX2hjYl9xZTsKIAliZmFfYm9vbGVhbl90CQljZmdkb25lOwogCkBAIC0yNTcsNyArMjM1LDYgQEAKIAlzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ19zICpjZmdpbmZvOwogCXN0cnVjdCBiZmFfZG1hX3MJY2ZncnNwX2RtYTsKIAlzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ3JzcF9zICpjZmdyc3A7Ci0Jc3RydWN0IGJmaV9pb2NmY19jZmdfcmVwbHlfcyAqY2ZnX3JlcGx5OwogCXN0cnVjdCBiZmFfZG1hX3MJcmVxX2NxX2JhW0JGSV9JT0NfTUFYX0NRU107CiAJc3RydWN0IGJmYV9kbWFfcwlyZXFfY3Ffc2hhZG93X2NpW0JGSV9JT0NfTUFYX0NRU107CiAJc3RydWN0IGJmYV9kbWFfcwlyc3BfY3FfYmFbQkZJX0lPQ19NQVhfQ1FTXTsKQEAgLTI2NywxOCArMjQ0LDQyIEBACiAJYmZhX2NiX2lvY2ZjX3QJCXVwZGF0ZXFfY2JmbjsgLyogIGJpb3MgY2FsbGJhY2sgZnVuY3Rpb24gKi8KIAl2b2lkCQkJKnVwZGF0ZXFfY2Jhcmc7CS8qICBiaW9zIGNhbGxiYWNrIGFyZyAqLwogCXUzMglpbnRyX21hc2s7CisJc3RydWN0IGJmYV9mYWFfYXJnc19zCWZhYV9hcmdzOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zCWlvY19kbWE7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MJaW9jZmNfZG1hOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zCXJlcXFfZG1hW0JGSV9JT0NfTUFYX0NRU107CisJc3RydWN0IGJmYV9tZW1fZG1hX3MJcnNwcV9kbWFbQkZJX0lPQ19NQVhfQ1FTXTsKKwlzdHJ1Y3QgYmZhX21lbV9rdmFfcwlrdmFfc2VnOwogfTsKIAotI2RlZmluZSBiZmFfbHB1aWQoX19iZmEpCQkJCQkJXAotCWJmYV9pb2NfcG9ydGlkKCYoX19iZmEpLT5pb2MpCisjZGVmaW5lIEJGQV9NRU1fSU9DX0RNQShfYmZhKQkJKCYoKF9iZmEpLT5pb2NmYy5pb2NfZG1hKSkKKyNkZWZpbmUgQkZBX01FTV9JT0NGQ19ETUEoX2JmYSkJCSgmKChfYmZhKS0+aW9jZmMuaW9jZmNfZG1hKSkKKyNkZWZpbmUgQkZBX01FTV9SRVFRX0RNQShfYmZhLCBfcW5vKQkoJigoX2JmYSktPmlvY2ZjLnJlcXFfZG1hWyhfcW5vKV0pKQorI2RlZmluZSBCRkFfTUVNX1JTUFFfRE1BKF9iZmEsIF9xbm8pCSgmKChfYmZhKS0+aW9jZmMucnNwcV9kbWFbKF9xbm8pXSkpCisjZGVmaW5lIEJGQV9NRU1fSU9DRkNfS1ZBKF9iZmEpCQkoJigoX2JmYSktPmlvY2ZjLmt2YV9zZWcpKQorCisjZGVmaW5lIGJmYV9mbl9scHUoX19iZmEpCVwKKwliZmlfZm5fbHB1KGJmYV9pb2NfcGNpZm4oJihfX2JmYSktPmlvYyksIGJmYV9pb2NfcG9ydGlkKCYoX19iZmEpLT5pb2MpKQogI2RlZmluZSBiZmFfbXNpeF9pbml0KF9fYmZhLCBfX252ZWNzKQkJCQkJXAogCSgoX19iZmEpLT5pb2NmYy5od2lmLmh3X21zaXhfaW5pdChfX2JmYSwgX19udmVjcykpCi0jZGVmaW5lIGJmYV9tc2l4X2luc3RhbGwoX19iZmEpCQkJCQkJXAotCSgoX19iZmEpLT5pb2NmYy5od2lmLmh3X21zaXhfaW5zdGFsbChfX2JmYSkpCisjZGVmaW5lIGJmYV9tc2l4X2N0cmxfaW5zdGFsbChfX2JmYSkJCQkJCVwKKwkoKF9fYmZhKS0+aW9jZmMuaHdpZi5od19tc2l4X2N0cmxfaW5zdGFsbChfX2JmYSkpCisjZGVmaW5lIGJmYV9tc2l4X3F1ZXVlX2luc3RhbGwoX19iZmEpCQkJCQlcCisJKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfbXNpeF9xdWV1ZV9pbnN0YWxsKF9fYmZhKSkKICNkZWZpbmUgYmZhX21zaXhfdW5pbnN0YWxsKF9fYmZhKQkJCQkJXAogCSgoX19iZmEpLT5pb2NmYy5od2lmLmh3X21zaXhfdW5pbnN0YWxsKF9fYmZhKSkKLSNkZWZpbmUgYmZhX2lzcl9tb2RlX3NldChfX2JmYSwgX19tc2l4KQkJCQkJXAotCSgoX19iZmEpLT5pb2NmYy5od2lmLmh3X2lzcl9tb2RlX3NldChfX2JmYSwgX19tc2l4KSkKKyNkZWZpbmUgYmZhX2lzcl9yc3BxX2FjayhfX2JmYSwgX19xdWV1ZSkgZG8gewkJCQlcCisJaWYgKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfcnNwcV9hY2spCQkJCVwKKwkJKF9fYmZhKS0+aW9jZmMuaHdpZi5od19yc3BxX2FjayhfX2JmYSwgX19xdWV1ZSk7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lIGJmYV9pc3JfcmVxcV9hY2soX19iZmEsIF9fcXVldWUpIGRvIHsJCQkJXAorCWlmICgoX19iZmEpLT5pb2NmYy5od2lmLmh3X3JlcXFfYWNrKQkJCQlcCisJCShfX2JmYSktPmlvY2ZjLmh3aWYuaHdfcmVxcV9hY2soX19iZmEsIF9fcXVldWUpOwlcCit9IHdoaWxlICgwKQorI2RlZmluZSBiZmFfaXNyX21vZGVfc2V0KF9fYmZhLCBfX21zaXgpIGRvIHsJCQkJXAorCWlmICgoX19iZmEpLT5pb2NmYy5od2lmLmh3X2lzcl9tb2RlX3NldCkJCQlcCisJCShfX2JmYSktPmlvY2ZjLmh3aWYuaHdfaXNyX21vZGVfc2V0KF9fYmZhLCBfX21zaXgpOwlcCit9IHdoaWxlICgwKQogI2RlZmluZSBiZmFfbXNpeF9nZXR2ZWNzKF9fYmZhLCBfX3ZlY21hcCwgX19udmVjcywgX19tYXh2ZWMpCQlcCiAJKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfbXNpeF9nZXR2ZWNzKF9fYmZhLCBfX3ZlY21hcCwJCVwKIAkJCQkJX19udmVjcywgX19tYXh2ZWMpKQpAQCAtMjkwLDE3ICsyOTEsMTcgQEAKIC8qCiAgKiBGQyBzcGVjaWZpYyBJT0MgZnVuY3Rpb25zLgogICovCi12b2lkIGJmYV9pb2NmY19tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgdTMyICprbV9sZW4sCi0JCSAgICAgICB1MzIgKmRtX2xlbik7Cit2b2lkIGJmYV9pb2NmY19tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKKwkJCXN0cnVjdCBiZmFfbWVtaW5mb19zICptZW1pbmZvLAorCQkJc3RydWN0IGJmYV9zICpiZmEpOwogdm9pZCBiZmFfaW9jZmNfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLAogCQkgICAgICBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCi0JCSAgICAgIHN0cnVjdCBiZmFfbWVtaW5mb19zICptZW1pbmZvLAogCQkgICAgICBzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYpOwogdm9pZCBiZmFfaW9jZmNfaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiB2b2lkIGJmYV9pb2NmY19zdGFydChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiB2b2lkIGJmYV9pb2NmY19zdG9wKHN0cnVjdCBiZmFfcyAqYmZhKTsKIHZvaWQgYmZhX2lvY2ZjX2lzcih2b2lkICpiZmEsIHN0cnVjdCBiZmlfbWJtc2dfcyAqbXNnKTsKLXZvaWQgYmZhX2lvY2ZjX3NldF9zbnNiYXNlKHN0cnVjdCBiZmFfcyAqYmZhLCB1NjQgc25zYmFzZV9wYSk7Cit2b2lkIGJmYV9pb2NmY19zZXRfc25zYmFzZShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHNlZ19ubywgdTY0IHNuc2Jhc2VfcGEpOwogYmZhX2Jvb2xlYW5fdCBiZmFfaW9jZmNfaXNfb3BlcmF0aW9uYWwoc3RydWN0IGJmYV9zICpiZmEpOwogdm9pZCBiZmFfaW9jZmNfcmVzZXRfcXVldWVzKHN0cnVjdCBiZmFfcyAqYmZhKTsKIApAQCAtMzEwLDEwICszMTEsMTAgQEAKIHZvaWQgYmZhX21zaXhfbHB1X2VycihzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHZlYyk7CiAKIHZvaWQgYmZhX2h3Y2JfcmVnaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSk7Ci12b2lkIGJmYV9od2NiX3JlcXFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSk7CiB2b2lkIGJmYV9od2NiX3JzcHFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSk7CiB2b2lkIGJmYV9od2NiX21zaXhfaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IG52ZWNzKTsKLXZvaWQgYmZhX2h3Y2JfbXNpeF9pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQgYmZhX2h3Y2JfbXNpeF9jdHJsX2luc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfaHdjYl9tc2l4X3F1ZXVlX2luc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpOwogdm9pZCBiZmFfaHdjYl9tc2l4X3VuaW5zdGFsbChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiB2b2lkIGJmYV9od2NiX2lzcl9tb2RlX3NldChzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2Jvb2xlYW5fdCBtc2l4KTsKIHZvaWQgYmZhX2h3Y2JfbXNpeF9nZXR2ZWNzKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgKnZlY21hcCwgdTMyICpudmVjcywKQEAgLTMyMSwxMCArMzIyLDEyIEBACiB2b2lkIGJmYV9od2NiX21zaXhfZ2V0X3JtZV9yYW5nZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyICpzdGFydCwKIAkJCQkgdTMyICplbmQpOwogdm9pZCBiZmFfaHdjdF9yZWdpbml0KHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQgYmZhX2h3Y3QyX3JlZ2luaXQoc3RydWN0IGJmYV9zICpiZmEpOwogdm9pZCBiZmFfaHdjdF9yZXFxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpOwogdm9pZCBiZmFfaHdjdF9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpOwogdm9pZCBiZmFfaHdjdF9tc2l4X2luaXQoc3RydWN0IGJmYV9zICpiZmEsIGludCBudmVjcyk7Ci12b2lkIGJmYV9od2N0X21zaXhfaW5zdGFsbChzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9od2N0X21zaXhfY3RybF9pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQgYmZhX2h3Y3RfbXNpeF9xdWV1ZV9pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKTsKIHZvaWQgYmZhX2h3Y3RfbXNpeF91bmluc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpOwogdm9pZCBiZmFfaHdjdF9pc3JfbW9kZV9zZXQoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3QgbXNpeCk7CiB2b2lkIGJmYV9od2N0X21zaXhfZ2V0dmVjcyhzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyICp2ZWNtYXAsIHUzMiAqbnZlY3MsCkBAIC0zNzcsNyArMzgwLDggQEAKIHZvaWQgYmZhX2NmZ19nZXRfZGVmYXVsdChzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcpOwogdm9pZCBiZmFfY2ZnX2dldF9taW4oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnKTsKIHZvaWQgYmZhX2NmZ19nZXRfbWVtaW5mbyhzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCi0JCQkgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8pOworCQkJc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sCisJCQlzdHJ1Y3QgYmZhX3MgKmJmYSk7CiB2b2lkIGJmYV9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKIAkJc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sCiAJCXN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jb3JlLmMKaW5kZXggOTE4MzhjNS4uYzM4ZTU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfY29yZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NvcmUuYwpAQCAtMTcsNyArMTcsNyBAQAogCiAjaW5jbHVkZSAiYmZhZF9kcnYuaCIKICNpbmNsdWRlICJiZmFfbW9kdWxlcy5oIgotI2luY2x1ZGUgImJmaV9jdHJlZy5oIgorI2luY2x1ZGUgImJmaV9yZWcuaCIKIAogQkZBX1RSQ19GSUxFKEhBTCwgQ09SRSk7CiAKQEAgLTI1LDEzICsyNSwxNCBAQAogICogQkZBIG1vZHVsZSBsaXN0IHRlcm1pbmF0ZWQgYnkgTlVMTAogICovCiBzdGF0aWMgc3RydWN0IGJmYV9tb2R1bGVfcyAqaGFsX21vZHNbXSA9IHsKKwkmaGFsX21vZF9mY2RpYWcsCiAJJmhhbF9tb2Rfc2dwZywKIAkmaGFsX21vZF9mY3BvcnQsCiAJJmhhbF9tb2RfZmN4cCwKIAkmaGFsX21vZF9scHMsCiAJJmhhbF9tb2RfdWYsCiAJJmhhbF9tb2RfcnBvcnQsCi0JJmhhbF9tb2RfZmNwaW0sCisJJmhhbF9tb2RfZmNwLAogCU5VTEwKIH07CiAKQEAgLTQxLDcgKzQyLDcgQEAKIHN0YXRpYyBiZmFfaXNyX2Z1bmNfdCAgYmZhX2lzcnNbQkZJX01DX01BWF0gPSB7CiAJYmZhX2lzcl91bmhhbmRsZWQsCS8qIE5PTkUgKi8KIAliZmFfaXNyX3VuaGFuZGxlZCwJLyogQkZJX01DX0lPQyAqLwotCWJmYV9pc3JfdW5oYW5kbGVkLAkvKiBCRklfTUNfRElBRyAqLworCWJmYV9mY2RpYWdfaW50ciwJLyogQkZJX01DX0RJQUcgKi8KIAliZmFfaXNyX3VuaGFuZGxlZCwJLyogQkZJX01DX0ZMQVNIICovCiAJYmZhX2lzcl91bmhhbmRsZWQsCS8qIEJGSV9NQ19DRUUgKi8KIAliZmFfZmNwb3J0X2lzciwJCS8qIEJGSV9NQ19GQ1BPUlQgKi8KQEAgLTUxLDcgKzUyLDcgQEAKIAliZmFfZmN4cF9pc3IsCQkvKiBCRklfTUNfRkNYUCAqLwogCWJmYV9scHNfaXNyLAkJLyogQkZJX01DX0xQUyAqLwogCWJmYV9ycG9ydF9pc3IsCQkvKiBCRklfTUNfUlBPUlQgKi8KLQliZmFfaXRuaW1faXNyLAkJLyogQkZJX01DX0lUTklNICovCisJYmZhX2l0bl9pc3IsCQkvKiBCRklfTUNfSVROICovCiAJYmZhX2lzcl91bmhhbmRsZWQsCS8qIEJGSV9NQ19JT0lNX1JFQUQgKi8KIAliZmFfaXNyX3VuaGFuZGxlZCwJLyogQkZJX01DX0lPSU1fV1JJVEUgKi8KIAliZmFfaXNyX3VuaGFuZGxlZCwJLyogQkZJX01DX0lPSU1fSU8gKi8KQEAgLTg5LDIzICs5MCw3OCBAQAogCiAKIHN0YXRpYyB2b2lkCi1iZmFfY29tX3BvcnRfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWkpCitiZmFfY29tX3BvcnRfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhKQogewogCXN0cnVjdCBiZmFfcG9ydF9zCSpwb3J0ID0gJmJmYS0+bW9kdWxlcy5wb3J0OwotCXUzMgkJCWRtX2xlbjsKLQl1OAkJCSpkbV9rdmE7Ci0JdTY0CQkJZG1fcGE7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MJKnBvcnRfZG1hID0gQkZBX01FTV9QT1JUX0RNQShiZmEpOwogCi0JZG1fbGVuID0gYmZhX3BvcnRfbWVtaW5mbygpOwotCWRtX2t2YSA9IGJmYV9tZW1pbmZvX2RtYV92aXJ0KG1pKTsKLQlkbV9wYSAgPSBiZmFfbWVtaW5mb19kbWFfcGh5cyhtaSk7Ci0KLQltZW1zZXQocG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfcG9ydF9zKSk7CiAJYmZhX3BvcnRfYXR0YWNoKHBvcnQsICZiZmEtPmlvYywgYmZhLCBiZmEtPnRyY21vZCk7Ci0JYmZhX3BvcnRfbWVtX2NsYWltKHBvcnQsIGRtX2t2YSwgZG1fcGEpOworCWJmYV9wb3J0X21lbV9jbGFpbShwb3J0LCBwb3J0X2RtYS0+a3ZhX2N1cnAsIHBvcnRfZG1hLT5kbWFfY3VycCk7Cit9CiAKLQliZmFfbWVtaW5mb19kbWFfdmlydChtaSkgPSBkbV9rdmEgKyBkbV9sZW47Ci0JYmZhX21lbWluZm9fZG1hX3BoeXMobWkpID0gZG1fcGEgKyBkbV9sZW47CisvKgorICogYWJsayBtb2R1bGUgYXR0YWNoCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfY29tX2FibGtfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfYWJsa19zCSphYmxrID0gJmJmYS0+bW9kdWxlcy5hYmxrOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zCSphYmxrX2RtYSA9IEJGQV9NRU1fQUJMS19ETUEoYmZhKTsKKworCWJmYV9hYmxrX2F0dGFjaChhYmxrLCAmYmZhLT5pb2MpOworCWJmYV9hYmxrX21lbWNsYWltKGFibGssIGFibGtfZG1hLT5rdmFfY3VycCwgYWJsa19kbWEtPmRtYV9jdXJwKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9jb21fY2VlX2F0dGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2NlZV9zCSpjZWUgPSAmYmZhLT5tb2R1bGVzLmNlZTsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcwkqY2VlX2RtYSA9IEJGQV9NRU1fQ0VFX0RNQShiZmEpOworCisJY2VlLT50cmNtb2QgPSBiZmEtPnRyY21vZDsKKwliZmFfY2VlX2F0dGFjaChjZWUsICZiZmEtPmlvYywgYmZhKTsKKwliZmFfY2VlX21lbV9jbGFpbShjZWUsIGNlZV9kbWEtPmt2YV9jdXJwLCBjZWVfZG1hLT5kbWFfY3VycCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfY29tX3NmcF9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9zZnBfcwkqc2ZwID0gQkZBX1NGUF9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcwkqc2ZwX2RtYSA9IEJGQV9NRU1fU0ZQX0RNQShiZmEpOworCisJYmZhX3NmcF9hdHRhY2goc2ZwLCAmYmZhLT5pb2MsIGJmYSwgYmZhLT50cmNtb2QpOworCWJmYV9zZnBfbWVtY2xhaW0oc2ZwLCBzZnBfZG1hLT5rdmFfY3VycCwgc2ZwX2RtYS0+ZG1hX2N1cnApOworfQorCitzdGF0aWMgdm9pZAorYmZhX2NvbV9mbGFzaF9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3QgbWluY2ZnKQoreworCXN0cnVjdCBiZmFfZmxhc2hfcwkqZmxhc2ggPSBCRkFfRkxBU0goYmZhKTsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcwkqZmxhc2hfZG1hID0gQkZBX01FTV9GTEFTSF9ETUEoYmZhKTsKKworCWJmYV9mbGFzaF9hdHRhY2goZmxhc2gsICZiZmEtPmlvYywgYmZhLCBiZmEtPnRyY21vZCwgbWluY2ZnKTsKKwliZmFfZmxhc2hfbWVtY2xhaW0oZmxhc2gsIGZsYXNoX2RtYS0+a3ZhX2N1cnAsCisJCQkgICBmbGFzaF9kbWEtPmRtYV9jdXJwLCBtaW5jZmcpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2NvbV9kaWFnX2F0dGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2RpYWdfcwkqZGlhZyA9IEJGQV9ESUFHX01PRChiZmEpOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zCSpkaWFnX2RtYSA9IEJGQV9NRU1fRElBR19ETUEoYmZhKTsKKworCWJmYV9kaWFnX2F0dGFjaChkaWFnLCAmYmZhLT5pb2MsIGJmYSwgYmZhX2ZjcG9ydF9iZWFjb24sIGJmYS0+dHJjbW9kKTsKKwliZmFfZGlhZ19tZW1jbGFpbShkaWFnLCBkaWFnX2RtYS0+a3ZhX2N1cnAsIGRpYWdfZG1hLT5kbWFfY3VycCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfY29tX3BoeV9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3QgbWluY2ZnKQoreworCXN0cnVjdCBiZmFfcGh5X3MJKnBoeSA9IEJGQV9QSFkoYmZhKTsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcwkqcGh5X2RtYSA9IEJGQV9NRU1fUEhZX0RNQShiZmEpOworCisJYmZhX3BoeV9hdHRhY2gocGh5LCAmYmZhLT5pb2MsIGJmYSwgYmZhLT50cmNtb2QsIG1pbmNmZyk7CisJYmZhX3BoeV9tZW1jbGFpbShwaHksIHBoeV9kbWEtPmt2YV9jdXJwLCBwaHlfZG1hLT5kbWFfY3VycCwgbWluY2ZnKTsKIH0KIAogLyoKQEAgLTEyMiw2ICsxNzgsNyBAQAogCUJGQV9JT0NGQ19BQ1RfSU5JVAk9IDEsCiAJQkZBX0lPQ0ZDX0FDVF9TVE9QCT0gMiwKIAlCRkFfSU9DRkNfQUNUX0RJU0FCTEUJPSAzLAorCUJGQV9JT0NGQ19BQ1RfRU5BQkxFCT0gNCwKIH07CiAKICNkZWZpbmUgREVGX0NGR19OVU1fRkFCUklDUwkJMQpAQCAtMTczLDE0MiArMjMwLDI0IEBACiAJfQogfQogCi12b2lkCi1iZmFfbXNpeF9hbGwoc3RydWN0IGJmYV9zICpiZmEsIGludCB2ZWMpCi17Ci0JYmZhX2ludHgoYmZhKTsKLX0KLQotYmZhX2Jvb2xlYW5fdAotYmZhX2ludHgoc3RydWN0IGJmYV9zICpiZmEpCi17Ci0JdTMyIGludHIsIHFpbnRyOwotCWludCBxdWV1ZTsKLQotCWludHIgPSByZWFkbChiZmEtPmlvY2ZjLmJmYV9yZWdzLmludHJfc3RhdHVzKTsKLQlpZiAoIWludHIpCi0JCXJldHVybiBCRkFfRkFMU0U7Ci0KLQkvKgotCSAqIFJNRSBjb21wbGV0aW9uIHF1ZXVlIGludGVycnVwdAotCSAqLwotCXFpbnRyID0gaW50ciAmIF9fSEZOX0lOVF9STUVfTUFTSzsKLQl3cml0ZWwocWludHIsIGJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOwotCi0JZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgQkZJX0lPQ19NQVhfQ1FTX0FTSUM7IHF1ZXVlKyspIHsKLQkJaWYgKGludHIgJiAoX19IRk5fSU5UX1JNRV9RMCA8PCBxdWV1ZSkpCi0JCQliZmFfbXNpeF9yc3BxKGJmYSwgcXVldWUgJiAoQkZJX0lPQ19NQVhfQ1FTIC0gMSkpOwotCX0KLQlpbnRyICY9IH5xaW50cjsKLQlpZiAoIWludHIpCi0JCXJldHVybiBCRkFfVFJVRTsKLQotCS8qCi0JICogQ1BFIGNvbXBsZXRpb24gcXVldWUgaW50ZXJydXB0Ci0JICovCi0JcWludHIgPSBpbnRyICYgX19IRk5fSU5UX0NQRV9NQVNLOwotCXdyaXRlbChxaW50ciwgYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cyk7Ci0KLQlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBCRklfSU9DX01BWF9DUVNfQVNJQzsgcXVldWUrKykgewotCQlpZiAoaW50ciAmIChfX0hGTl9JTlRfQ1BFX1EwIDw8IHF1ZXVlKSkKLQkJCWJmYV9tc2l4X3JlcXEoYmZhLCBxdWV1ZSAmIChCRklfSU9DX01BWF9DUVMgLSAxKSk7Ci0JfQotCWludHIgJj0gfnFpbnRyOwotCWlmICghaW50cikKLQkJcmV0dXJuIEJGQV9UUlVFOwotCi0JYmZhX21zaXhfbHB1X2VycihiZmEsIGludHIpOwotCi0JcmV0dXJuIEJGQV9UUlVFOwotfQotCi12b2lkCi1iZmFfaXNyX2VuYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKLXsKLQl1MzIgaW50cl91bm1hc2s7Ci0JaW50IHBjaV9mdW5jID0gYmZhX2lvY19wY2lmbigmYmZhLT5pb2MpOwotCi0JYmZhX3RyYyhiZmEsIHBjaV9mdW5jKTsKLQotCWJmYV9tc2l4X2luc3RhbGwoYmZhKTsKLQlpbnRyX3VubWFzayA9IChfX0hGTl9JTlRfRVJSX0VNQyB8IF9fSEZOX0lOVF9FUlJfTFBVMCB8Ci0JCSAgICAgICBfX0hGTl9JTlRfRVJSX0xQVTEgfCBfX0hGTl9JTlRfRVJSX1BTUyB8Ci0JCSAgICAgICBfX0hGTl9JTlRfTExfSEFMVCk7Ci0KLQlpZiAocGNpX2Z1bmMgPT0gMCkKLQkJaW50cl91bm1hc2sgfD0gKF9fSEZOX0lOVF9DUEVfUTAgfCBfX0hGTl9JTlRfQ1BFX1ExIHwKLQkJCQlfX0hGTl9JTlRfQ1BFX1EyIHwgX19IRk5fSU5UX0NQRV9RMyB8Ci0JCQkJX19IRk5fSU5UX1JNRV9RMCB8IF9fSEZOX0lOVF9STUVfUTEgfAotCQkJCV9fSEZOX0lOVF9STUVfUTIgfCBfX0hGTl9JTlRfUk1FX1EzIHwKLQkJCQlfX0hGTl9JTlRfTUJPWF9MUFUwKTsKLQllbHNlCi0JCWludHJfdW5tYXNrIHw9IChfX0hGTl9JTlRfQ1BFX1E0IHwgX19IRk5fSU5UX0NQRV9RNSB8Ci0JCQkJX19IRk5fSU5UX0NQRV9RNiB8IF9fSEZOX0lOVF9DUEVfUTcgfAotCQkJCV9fSEZOX0lOVF9STUVfUTQgfCBfX0hGTl9JTlRfUk1FX1E1IHwKLQkJCQlfX0hGTl9JTlRfUk1FX1E2IHwgX19IRk5fSU5UX1JNRV9RNyB8Ci0JCQkJX19IRk5fSU5UX01CT1hfTFBVMSk7Ci0KLQl3cml0ZWwoaW50cl91bm1hc2ssIGJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOwotCXdyaXRlbCh+aW50cl91bm1hc2ssIGJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9tYXNrKTsKLQliZmEtPmlvY2ZjLmludHJfbWFzayA9IH5pbnRyX3VubWFzazsKLQliZmFfaXNyX21vZGVfc2V0KGJmYSwgYmZhLT5tc2l4Lm52ZWNzICE9IDApOwotfQotCi12b2lkCi1iZmFfaXNyX2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpCi17Ci0JYmZhX2lzcl9tb2RlX3NldChiZmEsIEJGQV9GQUxTRSk7Ci0Jd3JpdGVsKC0xTCwgYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX21hc2spOwotCWJmYV9tc2l4X3VuaW5zdGFsbChiZmEpOwotfQotCi12b2lkCi1iZmFfbXNpeF9yZXFxKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcWlkKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKndhaXRxOwotCi0JcWlkICY9IChCRklfSU9DX01BWF9DUVMgLSAxKTsKLQotCWJmYS0+aW9jZmMuaHdpZi5od19yZXFxX2FjayhiZmEsIHFpZCk7Ci0KLQkvKgotCSAqIFJlc3VtZSBhbnkgcGVuZGluZyByZXF1ZXN0cyBpbiB0aGUgY29ycmVzcG9uZGluZyByZXFxLgotCSAqLwotCXdhaXRxID0gYmZhX3JlcXEoYmZhLCBxaWQpOwotCWlmICghbGlzdF9lbXB0eSh3YWl0cSkpCi0JCWJmYV9yZXFxX3Jlc3VtZShiZmEsIHFpZCk7Ci19Ci0KLXZvaWQKLWJmYV9pc3JfdW5oYW5kbGVkKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptKQotewotCWJmYV90cmMoYmZhLCBtLT5taGRyLm1zZ19jbGFzcyk7Ci0JYmZhX3RyYyhiZmEsIG0tPm1oZHIubXNnX2lkKTsKLQliZmFfdHJjKGJmYSwgbS0+bWhkci5tdGFnLmkyaHRvayk7Ci0JV0FSTl9PTigxKTsKLQliZmFfdHJjX3N0b3AoYmZhLT50cmNtb2QpOwotfQotCi12b2lkCi1iZmFfbXNpeF9yc3BxKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcWlkKQorc3RhdGljIGlubGluZSB2b2lkCitiZmFfaXNyX3JzcHEoc3RydWN0IGJmYV9zICpiZmEsIGludCBxaWQpCiB7CiAJc3RydWN0IGJmaV9tc2dfcyAqbTsKLQl1MzIgcGksIGNpOworCXUzMglwaSwgY2k7CiAJc3RydWN0IGxpc3RfaGVhZCAqd2FpdHE7CiAKLQlxaWQgJj0gKEJGSV9JT0NfTUFYX0NRUyAtIDEpOwotCi0JYmZhLT5pb2NmYy5od2lmLmh3X3JzcHFfYWNrKGJmYSwgcWlkKTsKKwliZmFfaXNyX3JzcHFfYWNrKGJmYSwgcWlkKTsKIAogCWNpID0gYmZhX3JzcHFfY2koYmZhLCBxaWQpOwogCXBpID0gYmZhX3JzcHFfcGkoYmZhLCBxaWQpOwogCi0JaWYgKGJmYS0+cm1lX3Byb2Nlc3MpIHsKLQkJd2hpbGUgKGNpICE9IHBpKSB7Ci0JCQltID0gYmZhX3JzcHFfZWxlbShiZmEsIHFpZCwgY2kpOwotCQkJYmZhX2lzcnNbbS0+bWhkci5tc2dfY2xhc3NdIChiZmEsIG0pOwotCQkJQ1FfSU5DUihjaSwgYmZhLT5pb2NmYy5jZmcuZHJ2Y2ZnLm51bV9yc3BxX2VsZW1zKTsKLQkJfQorCXdoaWxlIChjaSAhPSBwaSkgeworCQltID0gYmZhX3JzcHFfZWxlbShiZmEsIHFpZCwgY2kpOworCQlXQVJOX09OKG0tPm1oZHIubXNnX2NsYXNzID49IEJGSV9NQ19NQVgpOworCisJCWJmYV9pc3JzW20tPm1oZHIubXNnX2NsYXNzXSAoYmZhLCBtKTsKKwkJQ1FfSU5DUihjaSwgYmZhLT5pb2NmYy5jZmcuZHJ2Y2ZnLm51bV9yc3BxX2VsZW1zKTsKIAl9CiAKIAkvKgpAQCAtMzI2LDIxICsyNjUsMTg0IEBACiAJCWJmYV9yZXFxX3Jlc3VtZShiZmEsIHFpZCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAorYmZhX2lzcl9yZXFxKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcWlkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKndhaXRxOworCisJYmZhX2lzcl9yZXFxX2FjayhiZmEsIHFpZCk7CisKKwkvKgorCSAqIFJlc3VtZSBhbnkgcGVuZGluZyByZXF1ZXN0cyBpbiB0aGUgY29ycmVzcG9uZGluZyByZXFxLgorCSAqLworCXdhaXRxID0gYmZhX3JlcXEoYmZhLCBxaWQpOworCWlmICghbGlzdF9lbXB0eSh3YWl0cSkpCisJCWJmYV9yZXFxX3Jlc3VtZShiZmEsIHFpZCk7Cit9CisKK3ZvaWQKK2JmYV9tc2l4X2FsbChzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHZlYykKK3sKKwl1MzIJaW50ciwgcWludHI7CisJaW50CXF1ZXVlOworCisJaW50ciA9IHJlYWRsKGJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOworCWlmICghaW50cikKKwkJcmV0dXJuOworCisJLyoKKwkgKiBSTUUgY29tcGxldGlvbiBxdWV1ZSBpbnRlcnJ1cHQKKwkgKi8KKwlxaW50ciA9IGludHIgJiBfX0hGTl9JTlRfUk1FX01BU0s7CisJaWYgKHFpbnRyICYmIGJmYS0+cXVldWVfcHJvY2VzcykgeworCQlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBCRklfSU9DX01BWF9DUVM7IHF1ZXVlKyspCisJCQliZmFfaXNyX3JzcHEoYmZhLCBxdWV1ZSk7CisJfQorCisJaW50ciAmPSB+cWludHI7CisJaWYgKCFpbnRyKQorCQlyZXR1cm47CisKKwkvKgorCSAqIENQRSBjb21wbGV0aW9uIHF1ZXVlIGludGVycnVwdAorCSAqLworCXFpbnRyID0gaW50ciAmIF9fSEZOX0lOVF9DUEVfTUFTSzsKKwlpZiAocWludHIgJiYgYmZhLT5xdWV1ZV9wcm9jZXNzKSB7CisJCWZvciAocXVldWUgPSAwOyBxdWV1ZSA8IEJGSV9JT0NfTUFYX0NRUzsgcXVldWUrKykKKwkJCWJmYV9pc3JfcmVxcShiZmEsIHF1ZXVlKTsKKwl9CisJaW50ciAmPSB+cWludHI7CisJaWYgKCFpbnRyKQorCQlyZXR1cm47CisKKwliZmFfbXNpeF9scHVfZXJyKGJmYSwgaW50cik7Cit9CisKK2JmYV9ib29sZWFuX3QKK2JmYV9pbnR4KHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXUzMiBpbnRyLCBxaW50cjsKKwlpbnQgcXVldWU7CisKKwlpbnRyID0gcmVhZGwoYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cyk7CisJaWYgKCFpbnRyKQorCQlyZXR1cm4gQkZBX0ZBTFNFOworCisJcWludHIgPSBpbnRyICYgKF9fSEZOX0lOVF9STUVfTUFTSyB8IF9fSEZOX0lOVF9DUEVfTUFTSyk7CisJaWYgKHFpbnRyKQorCQl3cml0ZWwocWludHIsIGJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOworCisJLyoKKwkgKiBSTUUgY29tcGxldGlvbiBxdWV1ZSBpbnRlcnJ1cHQKKwkgKi8KKwlxaW50ciA9IGludHIgJiBfX0hGTl9JTlRfUk1FX01BU0s7CisJaWYgKHFpbnRyICYmIGJmYS0+cXVldWVfcHJvY2VzcykgeworCQlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBCRklfSU9DX01BWF9DUVM7IHF1ZXVlKyspCisJCQliZmFfaXNyX3JzcHEoYmZhLCBxdWV1ZSk7CisJfQorCisJaW50ciAmPSB+cWludHI7CisJaWYgKCFpbnRyKQorCQlyZXR1cm4gQkZBX1RSVUU7CisKKwkvKgorCSAqIENQRSBjb21wbGV0aW9uIHF1ZXVlIGludGVycnVwdAorCSAqLworCXFpbnRyID0gaW50ciAmIF9fSEZOX0lOVF9DUEVfTUFTSzsKKwlpZiAocWludHIgJiYgYmZhLT5xdWV1ZV9wcm9jZXNzKSB7CisJCWZvciAocXVldWUgPSAwOyBxdWV1ZSA8IEJGSV9JT0NfTUFYX0NRUzsgcXVldWUrKykKKwkJCWJmYV9pc3JfcmVxcShiZmEsIHF1ZXVlKTsKKwl9CisJaW50ciAmPSB+cWludHI7CisJaWYgKCFpbnRyKQorCQlyZXR1cm4gQkZBX1RSVUU7CisKKwliZmFfbXNpeF9scHVfZXJyKGJmYSwgaW50cik7CisKKwlyZXR1cm4gQkZBX1RSVUU7Cit9CisKK3ZvaWQKK2JmYV9pc3JfZW5hYmxlKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXUzMiB1bXNrOworCWludCBwY2lfZnVuYyA9IGJmYV9pb2NfcGNpZm4oJmJmYS0+aW9jKTsKKworCWJmYV90cmMoYmZhLCBwY2lfZnVuYyk7CisKKwliZmFfbXNpeF9jdHJsX2luc3RhbGwoYmZhKTsKKworCWlmIChiZmFfYXNpY19pZF9jdDIoYmZhLT5pb2MucGNpZGV2LmRldmljZV9pZCkpIHsKKwkJdW1zayA9IF9fSEZOX0lOVF9FUlJfTUFTS19DVDI7CisJCXVtc2sgfD0gcGNpX2Z1bmMgPT0gMCA/CisJCQlfX0hGTl9JTlRfRk4wX01BU0tfQ1QyIDogX19IRk5fSU5UX0ZOMV9NQVNLX0NUMjsKKwl9IGVsc2UgeworCQl1bXNrID0gX19IRk5fSU5UX0VSUl9NQVNLOworCQl1bXNrIHw9IHBjaV9mdW5jID09IDAgPyBfX0hGTl9JTlRfRk4wX01BU0sgOiBfX0hGTl9JTlRfRk4xX01BU0s7CisJfQorCisJd3JpdGVsKHVtc2ssIGJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOworCXdyaXRlbCh+dW1zaywgYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX21hc2spOworCWJmYS0+aW9jZmMuaW50cl9tYXNrID0gfnVtc2s7CisJYmZhX2lzcl9tb2RlX3NldChiZmEsIGJmYS0+bXNpeC5udmVjcyAhPSAwKTsKK30KKwordm9pZAorYmZhX2lzcl9kaXNhYmxlKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCWJmYV9pc3JfbW9kZV9zZXQoYmZhLCBCRkFfRkFMU0UpOworCXdyaXRlbCgtMUwsIGJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9tYXNrKTsKKwliZmFfbXNpeF91bmluc3RhbGwoYmZhKTsKK30KKwordm9pZAorYmZhX21zaXhfcmVxcShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHZlYykKK3sKKwliZmFfaXNyX3JlcXEoYmZhLCB2ZWMgLSBiZmEtPmlvY2ZjLmh3aWYuY3BlX3ZlY19xMCk7Cit9CisKK3ZvaWQKK2JmYV9pc3JfdW5oYW5kbGVkKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptKQoreworCWJmYV90cmMoYmZhLCBtLT5taGRyLm1zZ19jbGFzcyk7CisJYmZhX3RyYyhiZmEsIG0tPm1oZHIubXNnX2lkKTsKKwliZmFfdHJjKGJmYSwgbS0+bWhkci5tdGFnLmkyaHRvayk7CisJV0FSTl9PTigxKTsKKwliZmFfdHJjX3N0b3AoYmZhLT50cmNtb2QpOworfQorCit2b2lkCitiZmFfbXNpeF9yc3BxKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgdmVjKQoreworCWJmYV9pc3JfcnNwcShiZmEsIHZlYyAtIGJmYS0+aW9jZmMuaHdpZi5ybWVfdmVjX3EwKTsKK30KKwogdm9pZAogYmZhX21zaXhfbHB1X2VycihzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHZlYykKIHsKIAl1MzIgaW50ciwgY3Vycl92YWx1ZTsKKwliZmFfYm9vbGVhbl90IGxwdV9pc3IsIGhhbHRfaXNyLCBwc3NfaXNyOwogCiAJaW50ciA9IHJlYWRsKGJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOwogCi0JaWYgKGludHIgJiAoX19IRk5fSU5UX01CT1hfTFBVMCB8IF9fSEZOX0lOVF9NQk9YX0xQVTEpKQorCWlmIChiZmFfYXNpY19pZF9jdDIoYmZhLT5pb2MucGNpZGV2LmRldmljZV9pZCkpIHsKKwkJaGFsdF9pc3IgPSBpbnRyICYgX19IRk5fSU5UX0NQUV9IQUxUX0NUMjsKKwkJcHNzX2lzciAgPSBpbnRyICYgX19IRk5fSU5UX0VSUl9QU1NfQ1QyOworCQlscHVfaXNyICA9IGludHIgJiAoX19IRk5fSU5UX01CT1hfTFBVMF9DVDIgfAorCQkJCSAgIF9fSEZOX0lOVF9NQk9YX0xQVTFfQ1QyKTsKKwkJaW50ciAgICAmPSBfX0hGTl9JTlRfRVJSX01BU0tfQ1QyOworCX0gZWxzZSB7CisJCWhhbHRfaXNyID0gaW50ciAmIF9fSEZOX0lOVF9MTF9IQUxUOworCQlwc3NfaXNyICA9IGludHIgJiBfX0hGTl9JTlRfRVJSX1BTUzsKKwkJbHB1X2lzciAgPSBpbnRyICYgKF9fSEZOX0lOVF9NQk9YX0xQVTAgfCBfX0hGTl9JTlRfTUJPWF9MUFUxKTsKKwkJaW50ciAgICAmPSBfX0hGTl9JTlRfRVJSX01BU0s7CisJfQorCisJaWYgKGxwdV9pc3IpCiAJCWJmYV9pb2NfbWJveF9pc3IoJmJmYS0+aW9jKTsKIAotCWludHIgJj0gKF9fSEZOX0lOVF9FUlJfRU1DIHwgX19IRk5fSU5UX0VSUl9MUFUwIHwKLQkJX19IRk5fSU5UX0VSUl9MUFUxIHwgX19IRk5fSU5UX0VSUl9QU1MgfCBfX0hGTl9JTlRfTExfSEFMVCk7Ci0KIAlpZiAoaW50cikgewotCQlpZiAoaW50ciAmIF9fSEZOX0lOVF9MTF9IQUxUKSB7CisJCWlmIChoYWx0X2lzcikgewogCQkJLyoKIAkJCSAqIElmIExMX0hBTFQgYml0IGlzIHNldCB0aGVuIEZXIEluaXQgSGFsdCBMTCBQb3J0CiAJCQkgKiBSZWdpc3RlciBuZWVkcyB0byBiZSBjbGVhcmVkIGFzIHdlbGwgc28gSW50ZXJydXB0CkBAIC0zNTEsNyArNDUzLDcgQEAKIAkJCXdyaXRlbChjdXJyX3ZhbHVlLCBiZmEtPmlvYy5pb2NfcmVncy5sbF9oYWx0KTsKIAkJfQogCi0JCWlmIChpbnRyICYgX19IRk5fSU5UX0VSUl9QU1MpIHsKKwkJaWYgKHBzc19pc3IpIHsKIAkJCS8qCiAJCQkgKiBFUlJfUFNTIGJpdCBuZWVkcyB0byBiZSBjbGVhcmVkIGFzIHdlbGwgaW4gY2FzZQogCQkJICogaW50ZXJydXBzIGFyZSBzaGFyZWQgc28gZHJpdmVyJ3MgaW50ZXJydXB0IGhhbmRsZXIgaXMKQEAgLTM1OSw3ICs0NjEsNiBAQAogCQkJICovCiAJCQljdXJyX3ZhbHVlID0gcmVhZGwoCiAJCQkJCWJmYS0+aW9jLmlvY19yZWdzLnBzc19lcnJfc3RhdHVzX3JlZyk7Ci0JCQljdXJyX3ZhbHVlICY9IF9fUFNTX0VSUl9TVEFUVVNfU0VUOwogCQkJd3JpdGVsKGN1cnJfdmFsdWUsCiAJCQkJYmZhLT5pb2MuaW9jX3JlZ3MucHNzX2Vycl9zdGF0dXNfcmVnKTsKIAkJfQpAQCAtMzc3LDQxICs0NzgsNiBAQAogICogIEJGQSBJT0MgcHJpdmF0ZSBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZAotYmZhX2lvY2ZjX2Nxc19zeihzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsIHUzMiAqZG1fbGVuKQotewotCWludAkJaSwgcGVyX3JlcXFfc3osIHBlcl9yc3BxX3N6OwotCi0JcGVyX3JlcXFfc3ogPSBCRkFfUk9VTkRVUCgoY2ZnLT5kcnZjZmcubnVtX3JlcXFfZWxlbXMgKiBCRklfTE1TR19TWiksCi0JCQkJICBCRkFfRE1BX0FMSUdOX1NaKTsKLQlwZXJfcnNwcV9zeiA9IEJGQV9ST1VORFVQKChjZmctPmRydmNmZy5udW1fcnNwcV9lbGVtcyAqIEJGSV9MTVNHX1NaKSwKLQkJCQkgIEJGQV9ETUFfQUxJR05fU1opOwotCi0JLyoKLQkgKiBDYWxjdWxhdGUgQ1Egc2l6ZQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBjZmctPmZ3Y2ZnLm51bV9jcXM7IGkrKykgewotCQkqZG1fbGVuID0gKmRtX2xlbiArIHBlcl9yZXFxX3N6OwotCQkqZG1fbGVuID0gKmRtX2xlbiArIHBlcl9yc3BxX3N6OwotCX0KLQotCS8qCi0JICogQ2FsY3VsYXRlIFNoYWRvdyBDSS9QSSBzaXplCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGNmZy0+ZndjZmcubnVtX2NxczsgaSsrKQotCQkqZG1fbGVuICs9ICgyICogQkZBX0NBQ0hFTElORV9TWik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmFfaW9jZmNfZndfY2ZnX3N6KHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgdTMyICpkbV9sZW4pCi17Ci0JKmRtX2xlbiArPQotCQlCRkFfUk9VTkRVUChzaXplb2Yoc3RydWN0IGJmaV9pb2NmY19jZmdfcyksIEJGQV9DQUNIRUxJTkVfU1opOwotCSpkbV9sZW4gKz0KLQkJQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MpLAotCQkJICAgIEJGQV9DQUNIRUxJTkVfU1opOwotfQotCiAvKgogICogVXNlIHRoZSBNYWlsYm94IGludGVyZmFjZSB0byBzZW5kIEJGSV9JT0NGQ19IMklfQ0ZHX1JFUQogICovCkBAIC00MzMsOCArNDk5LDEzIEBACiAJLyoKIAkgKiBpbml0aWFsaXplIElPQyBjb25maWd1cmF0aW9uIGluZm8KIAkgKi8KKwljZmdfaW5mby0+c2luZ2xlX21zaXhfdmVjID0gMDsKKwlpZiAoYmZhLT5tc2l4Lm52ZWNzID09IDEpCisJCWNmZ19pbmZvLT5zaW5nbGVfbXNpeF92ZWMgPSAxOwogCWNmZ19pbmZvLT5lbmRpYW5fc2lnID0gQkZJX0lPQ19FTkRJQU5fU0lHOwogCWNmZ19pbmZvLT5udW1fY3FzID0gY2ZnLT5md2NmZy5udW1fY3FzOworCWNmZ19pbmZvLT5udW1faW9pbV9yZXFzID0gY3B1X3RvX2JlMTYoY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzKTsKKwljZmdfaW5mby0+bnVtX2Z3dGlvX3JlcXMgPSBjcHVfdG9fYmUxNihjZmctPmZ3Y2ZnLm51bV9md3Rpb19yZXFzKTsKIAogCWJmYV9kbWFfYmVfYWRkcl9zZXQoY2ZnX2luZm8tPmNmZ3JzcF9hZGRyLCBpb2NmYy0+Y2ZncnNwX2RtYS5wYSk7CiAJLyoKQEAgLTQ2OSw3ICs1NDAsNyBAQAogCSAqIGRtYSBtYXAgSU9DIGNvbmZpZ3VyYXRpb24gaXRzZWxmCiAJICovCiAJYmZpX2gyaV9zZXQoY2ZnX3JlcS5taCwgQkZJX01DX0lPQ0ZDLCBCRklfSU9DRkNfSDJJX0NGR19SRVEsCi0JCSAgICBiZmFfbHB1aWQoYmZhKSk7CisJCSAgICBiZmFfZm5fbHB1KGJmYSkpOwogCWJmYV9kbWFfYmVfYWRkcl9zZXQoY2ZnX3JlcS5pb2NfY2ZnX2RtYV9hZGRyLCBpb2NmYy0+Y2ZnX2luZm8ucGEpOwogCiAJYmZhX2lvY19tYm94X3NlbmQoJmJmYS0+aW9jLCAmY2ZnX3JlcSwKQEAgLTQ5MSwyNiArNTYyLDQwIEBACiAJLyoKIAkgKiBJbml0aWFsaXplIGNoaXAgc3BlY2lmaWMgaGFuZGxlcnMuCiAJICovCi0JaWYgKGJmYV9hc2ljX2lkX2N0KGJmYV9pb2NfZGV2aWQoJmJmYS0+aW9jKSkpIHsKKwlpZiAoYmZhX2FzaWNfaWRfY3RjKGJmYV9pb2NfZGV2aWQoJmJmYS0+aW9jKSkpIHsKIAkJaW9jZmMtPmh3aWYuaHdfcmVnaW5pdCA9IGJmYV9od2N0X3JlZ2luaXQ7CiAJCWlvY2ZjLT5od2lmLmh3X3JlcXFfYWNrID0gYmZhX2h3Y3RfcmVxcV9hY2s7CiAJCWlvY2ZjLT5od2lmLmh3X3JzcHFfYWNrID0gYmZhX2h3Y3RfcnNwcV9hY2s7CiAJCWlvY2ZjLT5od2lmLmh3X21zaXhfaW5pdCA9IGJmYV9od2N0X21zaXhfaW5pdDsKLQkJaW9jZmMtPmh3aWYuaHdfbXNpeF9pbnN0YWxsID0gYmZhX2h3Y3RfbXNpeF9pbnN0YWxsOworCQlpb2NmYy0+aHdpZi5od19tc2l4X2N0cmxfaW5zdGFsbCA9IGJmYV9od2N0X21zaXhfY3RybF9pbnN0YWxsOworCQlpb2NmYy0+aHdpZi5od19tc2l4X3F1ZXVlX2luc3RhbGwgPSBiZmFfaHdjdF9tc2l4X3F1ZXVlX2luc3RhbGw7CiAJCWlvY2ZjLT5od2lmLmh3X21zaXhfdW5pbnN0YWxsID0gYmZhX2h3Y3RfbXNpeF91bmluc3RhbGw7CiAJCWlvY2ZjLT5od2lmLmh3X2lzcl9tb2RlX3NldCA9IGJmYV9od2N0X2lzcl9tb2RlX3NldDsKIAkJaW9jZmMtPmh3aWYuaHdfbXNpeF9nZXR2ZWNzID0gYmZhX2h3Y3RfbXNpeF9nZXR2ZWNzOwogCQlpb2NmYy0+aHdpZi5od19tc2l4X2dldF9ybWVfcmFuZ2UgPSBiZmFfaHdjdF9tc2l4X2dldF9ybWVfcmFuZ2U7CisJCWlvY2ZjLT5od2lmLnJtZV92ZWNfcTAgPSBCRklfTVNJWF9STUVfUU1JTl9DVDsKKwkJaW9jZmMtPmh3aWYuY3BlX3ZlY19xMCA9IEJGSV9NU0lYX0NQRV9RTUlOX0NUOwogCX0gZWxzZSB7CiAJCWlvY2ZjLT5od2lmLmh3X3JlZ2luaXQgPSBiZmFfaHdjYl9yZWdpbml0OwotCQlpb2NmYy0+aHdpZi5od19yZXFxX2FjayA9IGJmYV9od2NiX3JlcXFfYWNrOwotCQlpb2NmYy0+aHdpZi5od19yc3BxX2FjayA9IGJmYV9od2NiX3JzcHFfYWNrOworCQlpb2NmYy0+aHdpZi5od19yZXFxX2FjayA9IE5VTEw7CisJCWlvY2ZjLT5od2lmLmh3X3JzcHFfYWNrID0gTlVMTDsKIAkJaW9jZmMtPmh3aWYuaHdfbXNpeF9pbml0ID0gYmZhX2h3Y2JfbXNpeF9pbml0OwotCQlpb2NmYy0+aHdpZi5od19tc2l4X2luc3RhbGwgPSBiZmFfaHdjYl9tc2l4X2luc3RhbGw7CisJCWlvY2ZjLT5od2lmLmh3X21zaXhfY3RybF9pbnN0YWxsID0gYmZhX2h3Y2JfbXNpeF9jdHJsX2luc3RhbGw7CisJCWlvY2ZjLT5od2lmLmh3X21zaXhfcXVldWVfaW5zdGFsbCA9IGJmYV9od2NiX21zaXhfcXVldWVfaW5zdGFsbDsKIAkJaW9jZmMtPmh3aWYuaHdfbXNpeF91bmluc3RhbGwgPSBiZmFfaHdjYl9tc2l4X3VuaW5zdGFsbDsKIAkJaW9jZmMtPmh3aWYuaHdfaXNyX21vZGVfc2V0ID0gYmZhX2h3Y2JfaXNyX21vZGVfc2V0OwogCQlpb2NmYy0+aHdpZi5od19tc2l4X2dldHZlY3MgPSBiZmFfaHdjYl9tc2l4X2dldHZlY3M7CiAJCWlvY2ZjLT5od2lmLmh3X21zaXhfZ2V0X3JtZV9yYW5nZSA9IGJmYV9od2NiX21zaXhfZ2V0X3JtZV9yYW5nZTsKKwkJaW9jZmMtPmh3aWYucm1lX3ZlY19xMCA9IEJGSV9NU0lYX1JNRV9RTUlOX0NCICsKKwkJCWJmYV9pb2NfcGNpZm4oJmJmYS0+aW9jKSAqIEJGSV9JT0NfTUFYX0NRUzsKKwkJaW9jZmMtPmh3aWYuY3BlX3ZlY19xMCA9IEJGSV9NU0lYX0NQRV9RTUlOX0NCICsKKwkJCWJmYV9pb2NfcGNpZm4oJmJmYS0+aW9jKSAqIEJGSV9JT0NfTUFYX0NRUzsKKwl9CisKKwlpZiAoYmZhX2FzaWNfaWRfY3QyKGJmYV9pb2NfZGV2aWQoJmJmYS0+aW9jKSkpIHsKKwkJaW9jZmMtPmh3aWYuaHdfcmVnaW5pdCA9IGJmYV9od2N0Ml9yZWdpbml0OworCQlpb2NmYy0+aHdpZi5od19pc3JfbW9kZV9zZXQgPSBOVUxMOworCQlpb2NmYy0+aHdpZi5od19yc3BxX2FjayA9IE5VTEw7CiAJfQogCiAJaW9jZmMtPmh3aWYuaHdfcmVnaW5pdChiZmEpOwpAQCAtNTE4LDQ4ICs2MDMsNDIgQEAKIH0KIAogc3RhdGljIHZvaWQKLWJmYV9pb2NmY19tZW1fY2xhaW0oc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKLQkJICAgIHN0cnVjdCBiZmFfbWVtaW5mb19zICptZW1pbmZvKQorYmZhX2lvY2ZjX21lbV9jbGFpbShzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnKQogewotCXU4CSAgICAgICAqZG1fa3ZhOwotCXU2NAlkbV9wYTsKLQlpbnQJCWksIHBlcl9yZXFxX3N6LCBwZXJfcnNwcV9zejsKKwl1OAkqZG1fa3ZhID0gTlVMTDsKKwl1NjQJZG1fcGEgPSAwOworCWludAlpLCBwZXJfcmVxcV9zeiwgcGVyX3JzcHFfc3osIGRiZ3N6OwogCXN0cnVjdCBiZmFfaW9jZmNfcyAgKmlvY2ZjID0gJmJmYS0+aW9jZmM7Ci0JaW50CQlkYmdzejsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcyAqaW9jX2RtYSA9IEJGQV9NRU1fSU9DX0RNQShiZmEpOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zICppb2NmY19kbWEgPSBCRkFfTUVNX0lPQ0ZDX0RNQShiZmEpOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zICpyZXFxX2RtYSwgKnJzcHFfZG1hOwogCi0JZG1fa3ZhID0gYmZhX21lbWluZm9fZG1hX3ZpcnQobWVtaW5mbyk7Ci0JZG1fcGEgPSBiZmFfbWVtaW5mb19kbWFfcGh5cyhtZW1pbmZvKTsKKwkvKiBGaXJzdCBhbGxvY2F0ZSBkbWEgbWVtb3J5IGZvciBJT0MgKi8KKwliZmFfaW9jX21lbV9jbGFpbSgmYmZhLT5pb2MsIGJmYV9tZW1fZG1hX3ZpcnQoaW9jX2RtYSksCisJCQliZmFfbWVtX2RtYV9waHlzKGlvY19kbWEpKTsKIAotCS8qCi0JICogRmlyc3QgYWxsb2NhdGUgZG1hIG1lbW9yeSBmb3IgSU9DLgotCSAqLwotCWJmYV9pb2NfbWVtX2NsYWltKCZiZmEtPmlvYywgZG1fa3ZhLCBkbV9wYSk7Ci0JZG1fa3ZhICs9IEJGQV9ST1VORFVQKHNpemVvZihzdHJ1Y3QgYmZpX2lvY19hdHRyX3MpLCBCRkFfRE1BX0FMSUdOX1NaKTsKLQlkbV9wYSAgKz0gQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmlfaW9jX2F0dHJfcyksIEJGQV9ETUFfQUxJR05fU1opOwotCi0JLyoKLQkgKiBDbGFpbSBETUEtYWJsZSBtZW1vcnkgZm9yIHRoZSByZXF1ZXN0L3Jlc3BvbnNlIHF1ZXVlcyBhbmQgZm9yIHNoYWRvdwotCSAqIGNpL3BpIHJlZ2lzdGVycwotCSAqLworCS8qIENsYWltIERNQS1hYmxlIG1lbW9yeSBmb3IgdGhlIHJlcXVlc3QvcmVzcG9uc2UgcXVldWVzICovCiAJcGVyX3JlcXFfc3ogPSBCRkFfUk9VTkRVUCgoY2ZnLT5kcnZjZmcubnVtX3JlcXFfZWxlbXMgKiBCRklfTE1TR19TWiksCi0JCQkJICBCRkFfRE1BX0FMSUdOX1NaKTsKKwkJCQlCRkFfRE1BX0FMSUdOX1NaKTsKIAlwZXJfcnNwcV9zeiA9IEJGQV9ST1VORFVQKChjZmctPmRydmNmZy5udW1fcnNwcV9lbGVtcyAqIEJGSV9MTVNHX1NaKSwKLQkJCQkgIEJGQV9ETUFfQUxJR05fU1opOworCQkJCUJGQV9ETUFfQUxJR05fU1opOwogCiAJZm9yIChpID0gMDsgaSA8IGNmZy0+ZndjZmcubnVtX2NxczsgaSsrKSB7Ci0JCWlvY2ZjLT5yZXFfY3FfYmFbaV0ua3ZhID0gZG1fa3ZhOwotCQlpb2NmYy0+cmVxX2NxX2JhW2ldLnBhID0gZG1fcGE7Ci0JCW1lbXNldChkbV9rdmEsIDAsIHBlcl9yZXFxX3N6KTsKLQkJZG1fa3ZhICs9IHBlcl9yZXFxX3N6OwotCQlkbV9wYSArPSBwZXJfcmVxcV9zejsKKwkJcmVxcV9kbWEgPSBCRkFfTUVNX1JFUVFfRE1BKGJmYSwgaSk7CisJCWlvY2ZjLT5yZXFfY3FfYmFbaV0ua3ZhID0gYmZhX21lbV9kbWFfdmlydChyZXFxX2RtYSk7CisJCWlvY2ZjLT5yZXFfY3FfYmFbaV0ucGEgPSBiZmFfbWVtX2RtYV9waHlzKHJlcXFfZG1hKTsKKwkJbWVtc2V0KGlvY2ZjLT5yZXFfY3FfYmFbaV0ua3ZhLCAwLCBwZXJfcmVxcV9zeik7CiAKLQkJaW9jZmMtPnJzcF9jcV9iYVtpXS5rdmEgPSBkbV9rdmE7Ci0JCWlvY2ZjLT5yc3BfY3FfYmFbaV0ucGEgPSBkbV9wYTsKLQkJbWVtc2V0KGRtX2t2YSwgMCwgcGVyX3JzcHFfc3opOwotCQlkbV9rdmEgKz0gcGVyX3JzcHFfc3o7Ci0JCWRtX3BhICs9IHBlcl9yc3BxX3N6OworCQlyc3BxX2RtYSA9IEJGQV9NRU1fUlNQUV9ETUEoYmZhLCBpKTsKKwkJaW9jZmMtPnJzcF9jcV9iYVtpXS5rdmEgPSBiZmFfbWVtX2RtYV92aXJ0KHJzcHFfZG1hKTsKKwkJaW9jZmMtPnJzcF9jcV9iYVtpXS5wYSA9IGJmYV9tZW1fZG1hX3BoeXMocnNwcV9kbWEpOworCQltZW1zZXQoaW9jZmMtPnJzcF9jcV9iYVtpXS5rdmEsIDAsIHBlcl9yc3BxX3N6KTsKIAl9CiAKKwkvKiBDbGFpbSBJT0NGQyBkbWEgbWVtb3J5IC0gZm9yIHNoYWRvdyBDSS9QSSAqLworCWRtX2t2YSA9IGJmYV9tZW1fZG1hX3ZpcnQoaW9jZmNfZG1hKTsKKwlkbV9wYSAgPSBiZmFfbWVtX2RtYV9waHlzKGlvY2ZjX2RtYSk7CisKIAlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5md2NmZy5udW1fY3FzOyBpKyspIHsKIAkJaW9jZmMtPnJlcV9jcV9zaGFkb3dfY2lbaV0ua3ZhID0gZG1fa3ZhOwogCQlpb2NmYy0+cmVxX2NxX3NoYWRvd19jaVtpXS5wYSA9IGRtX3BhOwpAQCAtNTcyLDM2ICs2NTEsMjcgQEAKIAkJZG1fcGEgKz0gQkZBX0NBQ0hFTElORV9TWjsKIAl9CiAKLQkvKgotCSAqIENsYWltIERNQS1hYmxlIG1lbW9yeSBmb3IgdGhlIGNvbmZpZyBpbmZvIHBhZ2UKLQkgKi8KKwkvKiBDbGFpbSBJT0NGQyBkbWEgbWVtb3J5IC0gZm9yIHRoZSBjb25maWcgaW5mbyBwYWdlICovCiAJYmZhLT5pb2NmYy5jZmdfaW5mby5rdmEgPSBkbV9rdmE7CiAJYmZhLT5pb2NmYy5jZmdfaW5mby5wYSA9IGRtX3BhOwogCWJmYS0+aW9jZmMuY2ZnaW5mbyA9IChzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ19zICopIGRtX2t2YTsKIAlkbV9rdmEgKz0gQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmlfaW9jZmNfY2ZnX3MpLCBCRkFfQ0FDSEVMSU5FX1NaKTsKIAlkbV9wYSArPSBCRkFfUk9VTkRVUChzaXplb2Yoc3RydWN0IGJmaV9pb2NmY19jZmdfcyksIEJGQV9DQUNIRUxJTkVfU1opOwogCi0JLyoKLQkgKiBDbGFpbSBETUEtYWJsZSBtZW1vcnkgZm9yIHRoZSBjb25maWcgcmVzcG9uc2UKLQkgKi8KKwkvKiBDbGFpbSBJT0NGQyBkbWEgbWVtb3J5IC0gZm9yIHRoZSBjb25maWcgcmVzcG9uc2UgKi8KIAliZmEtPmlvY2ZjLmNmZ3JzcF9kbWEua3ZhID0gZG1fa3ZhOwogCWJmYS0+aW9jZmMuY2ZncnNwX2RtYS5wYSA9IGRtX3BhOwogCWJmYS0+aW9jZmMuY2ZncnNwID0gKHN0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MgKikgZG1fa3ZhOwotCi0JZG1fa3ZhICs9Ci0JCUJGQV9ST1VORFVQKHNpemVvZihzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ3JzcF9zKSwKLQkJCSAgICBCRkFfQ0FDSEVMSU5FX1NaKTsKKwlkbV9rdmEgKz0gQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MpLAorCQkJQkZBX0NBQ0hFTElORV9TWik7CiAJZG1fcGEgKz0gQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MpLAotCQkJICAgICBCRkFfQ0FDSEVMSU5FX1NaKTsKKwkJCUJGQV9DQUNIRUxJTkVfU1opOwogCi0KLQliZmFfbWVtaW5mb19kbWFfdmlydChtZW1pbmZvKSA9IGRtX2t2YTsKLQliZmFfbWVtaW5mb19kbWFfcGh5cyhtZW1pbmZvKSA9IGRtX3BhOwotCisJLyogQ2xhaW0gSU9DRkMga3ZhIG1lbW9yeSAqLwogCWRiZ3N6ID0gKGJmYV9hdXRvX3JlY292ZXIpID8gQkZBX0RCR19GV1RSQ19MRU4gOiAwOwogCWlmIChkYmdzeiA+IDApIHsKLQkJYmZhX2lvY19kZWJ1Z19tZW1jbGFpbSgmYmZhLT5pb2MsIGJmYV9tZW1pbmZvX2t2YShtZW1pbmZvKSk7Ci0JCWJmYV9tZW1pbmZvX2t2YShtZW1pbmZvKSArPSBkYmdzejsKKwkJYmZhX2lvY19kZWJ1Z19tZW1jbGFpbSgmYmZhLT5pb2MsIGJmYV9tZW1fa3ZhX2N1cnAoaW9jZmMpKTsKKwkJYmZhX21lbV9rdmFfY3VycChpb2NmYykgKz0gZGJnc3o7CiAJfQogfQogCkBAIC02MTMsNyArNjgzLDkgQEAKIHsKIAlpbnQJCWk7CiAKLQliZmEtPnJtZV9wcm9jZXNzID0gQkZBX1RSVUU7CisJYmZhLT5xdWV1ZV9wcm9jZXNzID0gQkZBX1RSVUU7CisJZm9yIChpID0gMDsgaSA8IEJGSV9JT0NfTUFYX0NRUzsgaSsrKQorCQliZmFfaXNyX3JzcHFfYWNrKGJmYSwgaSk7CiAKIAlmb3IgKGkgPSAwOyBoYWxfbW9kc1tpXTsgaSsrKQogCQloYWxfbW9kc1tpXS0+c3RhcnQoYmZhKTsKQEAgLTY2MCw2ICs3MzIsMTYgQEAKIH0KIAogc3RhdGljIHZvaWQKK2JmYV9pb2NmY19lbmFibGVfY2Iodm9pZCAqYmZhX2FyZywgYmZhX2Jvb2xlYW5fdCBjb21wbCkKK3sKKwlzdHJ1Y3QgYmZhX3MJKmJmYSA9IGJmYV9hcmc7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IGJmYS0+YmZhZDsKKworCWlmIChjb21wbCkKKwkJY29tcGxldGUoJmJmYWQtPmVuYWJsZV9jb21wKTsKK30KKworc3RhdGljIHZvaWQKIGJmYV9pb2NmY19kaXNhYmxlX2NiKHZvaWQgKmJmYV9hcmcsIGJmYV9ib29sZWFuX3QgY29tcGwpCiB7CiAJc3RydWN0IGJmYV9zICAqYmZhID0gYmZhX2FyZzsKQEAgLTY2OSw2ICs3NTEsMzcgQEAKIAkJY29tcGxldGUoJmJmYWQtPmRpc2FibGVfY29tcCk7CiB9CiAKKy8qKgorICogY29uZmlndXJlIHF1ZXVlIHJlZ2lzdGVycyBmcm9tIGZpcm13YXJlIHJlc3BvbnNlCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jZmNfcXJlZyhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9pb2NmY19xcmVnX3MgKnFyZWcpCit7CisJaW50ICAgICBpOworCXN0cnVjdCBiZmFfaW9jZmNfcmVnc19zICpyID0gJmJmYS0+aW9jZmMuYmZhX3JlZ3M7CisJdm9pZCBfX2lvbWVtICprdmEgPSBiZmFfaW9jX2JhcjAoJmJmYS0+aW9jKTsKKworCWZvciAoaSA9IDA7IGkgPCBCRklfSU9DX01BWF9DUVM7IGkrKykgeworCQliZmEtPmlvY2ZjLmh3X3FpZFtpXSA9IHFyZWctPmh3X3FpZFtpXTsKKwkJci0+Y3BlX3FfY2lbaV0gPSBrdmEgKyBiZTMyX3RvX2NwdShxcmVnLT5jcGVfcV9jaV9vZmZbaV0pOworCQlyLT5jcGVfcV9waVtpXSA9IGt2YSArIGJlMzJfdG9fY3B1KHFyZWctPmNwZV9xX3BpX29mZltpXSk7CisJCXItPmNwZV9xX2N0cmxbaV0gPSBrdmEgKyBiZTMyX3RvX2NwdShxcmVnLT5jcGVfcWN0bF9vZmZbaV0pOworCQlyLT5ybWVfcV9jaVtpXSA9IGt2YSArIGJlMzJfdG9fY3B1KHFyZWctPnJtZV9xX2NpX29mZltpXSk7CisJCXItPnJtZV9xX3BpW2ldID0ga3ZhICsgYmUzMl90b19jcHUocXJlZy0+cm1lX3FfcGlfb2ZmW2ldKTsKKwkJci0+cm1lX3FfY3RybFtpXSA9IGt2YSArIGJlMzJfdG9fY3B1KHFyZWctPnJtZV9xY3RsX29mZltpXSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY2ZjX3Jlc19yZWNmZyhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9pb2NmY19md2NmZ19zICpmd2NmZykKK3sKKwliZmFfZmN4cF9yZXNfcmVjZmcoYmZhLCBmd2NmZy0+bnVtX2ZjeHBfcmVxcyk7CisJYmZhX3VmX3Jlc19yZWNmZyhiZmEsIGZ3Y2ZnLT5udW1fdWZfYnVmcyk7CisJYmZhX3Jwb3J0X3Jlc19yZWNmZyhiZmEsIGZ3Y2ZnLT5udW1fcnBvcnRzKTsKKwliZmFfZmNwX3Jlc19yZWNmZyhiZmEsIGZ3Y2ZnLT5udW1faW9pbV9yZXFzKTsKKwliZmFfdHNraW1fcmVzX3JlY2ZnKGJmYSwgZndjZmctPm51bV90c2tpbV9yZXFzKTsKK30KKwogLyoKICAqIFVwZGF0ZSBCRkEgY29uZmlndXJhdGlvbiBmcm9tIGZpcm13YXJlIGNvbmZpZ3VyYXRpb24uCiAgKi8KQEAgLTY4MSw2ICs3OTQsNyBAQAogCiAJZndjZmctPm51bV9jcXMJICAgICAgPSBmd2NmZy0+bnVtX2NxczsKIAlmd2NmZy0+bnVtX2lvaW1fcmVxcyAgPSBiZTE2X3RvX2NwdShmd2NmZy0+bnVtX2lvaW1fcmVxcyk7CisJZndjZmctPm51bV9md3Rpb19yZXFzID0gYmUxNl90b19jcHUoZndjZmctPm51bV9md3Rpb19yZXFzKTsKIAlmd2NmZy0+bnVtX3Rza2ltX3JlcXMgPSBiZTE2X3RvX2NwdShmd2NmZy0+bnVtX3Rza2ltX3JlcXMpOwogCWZ3Y2ZnLT5udW1fZmN4cF9yZXFzICA9IGJlMTZfdG9fY3B1KGZ3Y2ZnLT5udW1fZmN4cF9yZXFzKTsKIAlmd2NmZy0+bnVtX3VmX2J1ZnMgICAgPSBiZTE2X3RvX2NwdShmd2NmZy0+bnVtX3VmX2J1ZnMpOwpAQCAtNjg5LDE0ICs4MDMsMzMgQEAKIAlpb2NmYy0+Y2ZnZG9uZSA9IEJGQV9UUlVFOwogCiAJLyoKKwkgKiBjb25maWd1cmUgcXVldWUgcmVnaXN0ZXIgb2Zmc2V0cyBhcyBsZWFybnQgZnJvbSBmaXJtd2FyZQorCSAqLworCWJmYV9pb2NmY19xcmVnKGJmYSwgJmNmZ3JzcC0+cXJlZyk7CisKKwkvKgorCSAqIFJlLWNvbmZpZ3VyZSByZXNvdXJjZXMgYXMgbGVhcm50IGZyb20gRmlybXdhcmUKKwkgKi8KKwliZmFfaW9jZmNfcmVzX3JlY2ZnKGJmYSwgZndjZmcpOworCisJLyoKKwkgKiBJbnN0YWxsIE1TSVggcXVldWUgaGFuZGxlcnMKKwkgKi8KKwliZmFfbXNpeF9xdWV1ZV9pbnN0YWxsKGJmYSk7CisKKwkvKgogCSAqIENvbmZpZ3VyYXRpb24gaXMgY29tcGxldGUgLSBpbml0aWFsaXplL3N0YXJ0IHN1Ym1vZHVsZXMKIAkgKi8KIAliZmFfZmNwb3J0X2luaXQoYmZhKTsKIAogCWlmIChpb2NmYy0+YWN0aW9uID09IEJGQV9JT0NGQ19BQ1RfSU5JVCkKIAkJYmZhX2NiX3F1ZXVlKGJmYSwgJmlvY2ZjLT5pbml0X2hjYl9xZSwgYmZhX2lvY2ZjX2luaXRfY2IsIGJmYSk7Ci0JZWxzZQorCWVsc2UgeworCQlpZiAoYmZhLT5pb2NmYy5hY3Rpb24gPT0gQkZBX0lPQ0ZDX0FDVF9FTkFCTEUpCisJCQliZmFfY2JfcXVldWUoYmZhLCAmYmZhLT5pb2NmYy5lbl9oY2JfcWUsCisJCQkJCWJmYV9pb2NmY19lbmFibGVfY2IsIGJmYSk7CiAJCWJmYV9pb2NmY19zdGFydF9zdWJtb2QoYmZhKTsKKwl9CiB9CiB2b2lkCiBiZmFfaW9jZmNfcmVzZXRfcXVldWVzKHN0cnVjdCBiZmFfcyAqYmZhKQpAQCAtNzExLDYgKzg0NCwxODEgQEAKIAl9CiB9CiAKKy8qIEZhYnJpYyBBc3NpZ25lZCBBZGRyZXNzIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworCisvKgorICoJQ2hlY2sgd2hldGhlciBJT0MgaXMgcmVhZHkgYmVmb3JlIHNlbmRpbmcgY29tbWFuZCBkb3duCisgKi8KK3N0YXRpYyBiZmFfc3RhdHVzX3QKK2JmYV9mYWFfdmFsaWRhdGVfcmVxdWVzdChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwllbnVtIGJmYV9pb2NfdHlwZV9lCWlvY190eXBlID0gYmZhX2dldF90eXBlKGJmYSk7CisJdTMyCWNhcmRfdHlwZSA9IGJmYS0+aW9jLmF0dHItPmNhcmRfdHlwZTsKKworCWlmIChiZmFfaW9jX2lzX29wZXJhdGlvbmFsKCZiZmEtPmlvYykpIHsKKwkJaWYgKChpb2NfdHlwZSAhPSBCRkFfSU9DX1RZUEVfRkMpIHx8IGJmYV9tZmdfaXNfbWV6eihjYXJkX3R5cGUpKQorCQkJcmV0dXJuIEJGQV9TVEFUVVNfRkVBVFVSRV9OT1RfU1VQUE9SVEVEOworCX0gZWxzZSB7CisJCWlmICghYmZhX2lvY19pc19hY3FfYWRkcigmYmZhLT5pb2MpKQorCQkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKwl9CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworYmZhX3N0YXR1c190CitiZmFfZmFhX2VuYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2NiX2lvY2ZjX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmaV9mYWFfZW5fZGlzX3MgZmFhX2VuYWJsZV9yZXE7CisJc3RydWN0IGJmYV9pb2NmY19zCSppb2NmYyA9ICZiZmEtPmlvY2ZjOworCWJmYV9zdGF0dXNfdAkJc3RhdHVzOworCisJaW9jZmMtPmZhYV9hcmdzLmZhYV9jYi5mYWFfY2JmbiA9IGNiZm47CisJaW9jZmMtPmZhYV9hcmdzLmZhYV9jYi5mYWFfY2JhcmcgPSBjYmFyZzsKKworCXN0YXR1cyA9IGJmYV9mYWFfdmFsaWRhdGVfcmVxdWVzdChiZmEpOworCWlmIChzdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChpb2NmYy0+ZmFhX2FyZ3MuYnVzeSA9PSBCRkFfVFJVRSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKworCWlmIChpb2NmYy0+ZmFhX2FyZ3MuZmFhX3N0YXRlID09IEJGQV9GQUFfRU5BQkxFRCkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkFBX0VOQUJMRUQ7CisKKwlpZiAoYmZhX2ZjcG9ydF9pc190cnVua19lbmFibGVkKGJmYSkpCisJCXJldHVybiBCRkFfU1RBVFVTX0VSUk9SX1RSVU5LX0VOQUJMRUQ7CisKKwliZmFfZmNwb3J0X2NmZ19mYWEoYmZhLCBCRkFfRkFBX0VOQUJMRUQpOworCWlvY2ZjLT5mYWFfYXJncy5idXN5ID0gQkZBX1RSVUU7CisKKwltZW1zZXQoJmZhYV9lbmFibGVfcmVxLCAwLCBzaXplb2Yoc3RydWN0IGJmaV9mYWFfZW5fZGlzX3MpKTsKKwliZmlfaDJpX3NldChmYWFfZW5hYmxlX3JlcS5taCwgQkZJX01DX0lPQ0ZDLAorCQlCRklfSU9DRkNfSDJJX0ZBQV9FTkFCTEVfUkVRLCBiZmFfZm5fbHB1KGJmYSkpOworCisJYmZhX2lvY19tYm94X3NlbmQoJmJmYS0+aW9jLCAmZmFhX2VuYWJsZV9yZXEsCisJCQlzaXplb2Yoc3RydWN0IGJmaV9mYWFfZW5fZGlzX3MpKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9mYWFfZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2NiX2lvY2ZjX3QgY2JmbiwKKwkJdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmaV9mYWFfZW5fZGlzX3MgZmFhX2Rpc2FibGVfcmVxOworCXN0cnVjdCBiZmFfaW9jZmNfcwkqaW9jZmMgPSAmYmZhLT5pb2NmYzsKKwliZmFfc3RhdHVzX3QJCXN0YXR1czsKKworCWlvY2ZjLT5mYWFfYXJncy5mYWFfY2IuZmFhX2NiZm4gPSBjYmZuOworCWlvY2ZjLT5mYWFfYXJncy5mYWFfY2IuZmFhX2NiYXJnID0gY2Jhcmc7CisKKwlzdGF0dXMgPSBiZmFfZmFhX3ZhbGlkYXRlX3JlcXVlc3QoYmZhKTsKKwlpZiAoc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoaW9jZmMtPmZhYV9hcmdzLmJ1c3kgPT0gQkZBX1RSVUUpCisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisKKwlpZiAoaW9jZmMtPmZhYV9hcmdzLmZhYV9zdGF0ZSA9PSBCRkFfRkFBX0RJU0FCTEVEKQorCQlyZXR1cm4gQkZBX1NUQVRVU19GQUFfRElTQUJMRUQ7CisKKwliZmFfZmNwb3J0X2NmZ19mYWEoYmZhLCBCRkFfRkFBX0RJU0FCTEVEKTsKKwlpb2NmYy0+ZmFhX2FyZ3MuYnVzeSA9IEJGQV9UUlVFOworCisJbWVtc2V0KCZmYWFfZGlzYWJsZV9yZXEsIDAsIHNpemVvZihzdHJ1Y3QgYmZpX2ZhYV9lbl9kaXNfcykpOworCWJmaV9oMmlfc2V0KGZhYV9kaXNhYmxlX3JlcS5taCwgQkZJX01DX0lPQ0ZDLAorCQlCRklfSU9DRkNfSDJJX0ZBQV9ESVNBQkxFX1JFUSwgYmZhX2ZuX2xwdShiZmEpKTsKKworCWJmYV9pb2NfbWJveF9zZW5kKCZiZmEtPmlvYywgJmZhYV9kaXNhYmxlX3JlcSwKKwkJc2l6ZW9mKHN0cnVjdCBiZmlfZmFhX2VuX2Rpc19zKSk7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworYmZhX3N0YXR1c190CitiZmFfZmFhX3F1ZXJ5KHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2ZhYV9hdHRyX3MgKmF0dHIsCisJCWJmYV9jYl9pb2NmY190IGNiZm4sIHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmlfZmFhX3F1ZXJ5X3MgIGZhYV9hdHRyX3JlcTsKKwlzdHJ1Y3QgYmZhX2lvY2ZjX3MgICAgICAqaW9jZmMgPSAmYmZhLT5pb2NmYzsKKwliZmFfc3RhdHVzX3QgICAgICAgICAgICBzdGF0dXM7CisKKwlpb2NmYy0+ZmFhX2FyZ3MuZmFhX2F0dHIgPSBhdHRyOworCWlvY2ZjLT5mYWFfYXJncy5mYWFfY2IuZmFhX2NiZm4gPSBjYmZuOworCWlvY2ZjLT5mYWFfYXJncy5mYWFfY2IuZmFhX2NiYXJnID0gY2Jhcmc7CisKKwlzdGF0dXMgPSBiZmFfZmFhX3ZhbGlkYXRlX3JlcXVlc3QoYmZhKTsKKwlpZiAoc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoaW9jZmMtPmZhYV9hcmdzLmJ1c3kgPT0gQkZBX1RSVUUpCisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisKKwlpb2NmYy0+ZmFhX2FyZ3MuYnVzeSA9IEJGQV9UUlVFOworCW1lbXNldCgmZmFhX2F0dHJfcmVxLCAwLCBzaXplb2Yoc3RydWN0IGJmaV9mYWFfcXVlcnlfcykpOworCWJmaV9oMmlfc2V0KGZhYV9hdHRyX3JlcS5taCwgQkZJX01DX0lPQ0ZDLAorCQlCRklfSU9DRkNfSDJJX0ZBQV9RVUVSWV9SRVEsIGJmYV9mbl9scHUoYmZhKSk7CisKKwliZmFfaW9jX21ib3hfc2VuZCgmYmZhLT5pb2MsICZmYWFfYXR0cl9yZXEsCisJCXNpemVvZihzdHJ1Y3QgYmZpX2ZhYV9xdWVyeV9zKSk7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoKKyAqCUZBQSBlbmFibGUgcmVzcG9uc2UKKyAqLworc3RhdGljIHZvaWQKK2JmYV9mYWFfZW5hYmxlX3JlcGx5KHN0cnVjdCBiZmFfaW9jZmNfcyAqaW9jZmMsCisJCXN0cnVjdCBiZmlfZmFhX2VuX2Rpc19yc3BfcyAqcnNwKQoreworCXZvaWQJKmNiYXJnID0gaW9jZmMtPmZhYV9hcmdzLmZhYV9jYi5mYWFfY2Jhcmc7CisJYmZhX3N0YXR1c190CXN0YXR1cyA9IHJzcC0+c3RhdHVzOworCisJV0FSTl9PTighaW9jZmMtPmZhYV9hcmdzLmZhYV9jYi5mYWFfY2Jmbik7CisKKwlpb2NmYy0+ZmFhX2FyZ3MuZmFhX2NiLmZhYV9jYmZuKGNiYXJnLCBzdGF0dXMpOworCWlvY2ZjLT5mYWFfYXJncy5idXN5ID0gQkZBX0ZBTFNFOworfQorCisvKgorICoJRkFBIGRpc2FibGUgcmVzcG9uc2UKKyAqLworc3RhdGljIHZvaWQKK2JmYV9mYWFfZGlzYWJsZV9yZXBseShzdHJ1Y3QgYmZhX2lvY2ZjX3MgKmlvY2ZjLAorCQlzdHJ1Y3QgYmZpX2ZhYV9lbl9kaXNfcnNwX3MgKnJzcCkKK3sKKwl2b2lkCSpjYmFyZyA9IGlvY2ZjLT5mYWFfYXJncy5mYWFfY2IuZmFhX2NiYXJnOworCWJmYV9zdGF0dXNfdAlzdGF0dXMgPSByc3AtPnN0YXR1czsKKworCVdBUk5fT04oIWlvY2ZjLT5mYWFfYXJncy5mYWFfY2IuZmFhX2NiZm4pOworCisJaW9jZmMtPmZhYV9hcmdzLmZhYV9jYi5mYWFfY2JmbihjYmFyZywgc3RhdHVzKTsKKwlpb2NmYy0+ZmFhX2FyZ3MuYnVzeSA9IEJGQV9GQUxTRTsKK30KKworLyoKKyAqCUZBQSBxdWVyeSByZXNwb25zZQorICovCitzdGF0aWMgdm9pZAorYmZhX2ZhYV9xdWVyeV9yZXBseShzdHJ1Y3QgYmZhX2lvY2ZjX3MgKmlvY2ZjLAorCQliZmlfZmFhX3F1ZXJ5X3JzcF90ICpyc3ApCit7CisJdm9pZAkqY2JhcmcgPSBpb2NmYy0+ZmFhX2FyZ3MuZmFhX2NiLmZhYV9jYmFyZzsKKworCWlmIChpb2NmYy0+ZmFhX2FyZ3MuZmFhX2F0dHIpIHsKKwkJaW9jZmMtPmZhYV9hcmdzLmZhYV9hdHRyLT5mYWEgPSByc3AtPmZhYTsKKwkJaW9jZmMtPmZhYV9hcmdzLmZhYV9hdHRyLT5mYWFfc3RhdGUgPSByc3AtPmZhYV9zdGF0dXM7CisJCWlvY2ZjLT5mYWFfYXJncy5mYWFfYXR0ci0+cHd3bl9zb3VyY2UgPSByc3AtPmFkZHJfc291cmNlOworCX0KKworCVdBUk5fT04oIWlvY2ZjLT5mYWFfYXJncy5mYWFfY2IuZmFhX2NiZm4pOworCisJaW9jZmMtPmZhYV9hcmdzLmZhYV9jYi5mYWFfY2JmbihjYmFyZywgQkZBX1NUQVRVU19PSyk7CisJaW9jZmMtPmZhYV9hcmdzLmJ1c3kgPSBCRkFfRkFMU0U7Cit9CisKIC8qCiAgKiBJT0MgZW5hYmxlIHJlcXVlc3QgaXMgY29tcGxldGUKICAqLwpAQCAtNzE5LDExICsxMDI3LDIwIEBACiB7CiAJc3RydWN0IGJmYV9zCSpiZmEgPSBiZmFfYXJnOwogCisJaWYgKHN0YXR1cyA9PSBCRkFfU1RBVFVTX0ZBQV9BQ1FfQUREUikgeworCQliZmFfY2JfcXVldWUoYmZhLCAmYmZhLT5pb2NmYy5pbml0X2hjYl9xZSwKKwkJCQliZmFfaW9jZmNfaW5pdF9jYiwgYmZhKTsKKwkJcmV0dXJuOworCX0KKwogCWlmIChzdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgewogCQliZmFfaXNyX2Rpc2FibGUoYmZhKTsKIAkJaWYgKGJmYS0+aW9jZmMuYWN0aW9uID09IEJGQV9JT0NGQ19BQ1RfSU5JVCkKIAkJCWJmYV9jYl9xdWV1ZShiZmEsICZiZmEtPmlvY2ZjLmluaXRfaGNiX3FlLAogCQkJCSAgICAgYmZhX2lvY2ZjX2luaXRfY2IsIGJmYSk7CisJCWVsc2UgaWYgKGJmYS0+aW9jZmMuYWN0aW9uID09IEJGQV9JT0NGQ19BQ1RfRU5BQkxFKQorCQkJYmZhX2NiX3F1ZXVlKGJmYSwgJmJmYS0+aW9jZmMuZW5faGNiX3FlLAorCQkJCQliZmFfaW9jZmNfZW5hYmxlX2NiLCBiZmEpOwogCQlyZXR1cm47CiAJfQogCkBAIC03NTksNyArMTA3Niw3IEBACiB7CiAJc3RydWN0IGJmYV9zCSpiZmEgPSBiZmFfYXJnOwogCi0JYmZhLT5ybWVfcHJvY2VzcyA9IEJGQV9GQUxTRTsKKwliZmEtPnF1ZXVlX3Byb2Nlc3MgPSBCRkFfRkFMU0U7CiAKIAliZmFfaXNyX2Rpc2FibGUoYmZhKTsKIAliZmFfaW9jZmNfZGlzYWJsZV9zdWJtb2QoYmZhKTsKQEAgLTc4NiwxNSArMTEwMyw0NyBAQAogICogUXVlcnkgSU9DIG1lbW9yeSByZXF1aXJlbWVudCBpbmZvcm1hdGlvbi4KICAqLwogdm9pZAotYmZhX2lvY2ZjX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmttX2xlbiwKLQkJICB1MzIgKmRtX2xlbikKK2JmYV9pb2NmY19tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sCisJCSAgc3RydWN0IGJmYV9zICpiZmEpCiB7Ci0JLyogZG1hIG1lbW9yeSBmb3IgSU9DICovCi0JKmRtX2xlbiArPSBCRkFfUk9VTkRVUChzaXplb2Yoc3RydWN0IGJmaV9pb2NfYXR0cl9zKSwgQkZBX0RNQV9BTElHTl9TWik7CisJaW50IHEsIHBlcl9yZXFxX3N6LCBwZXJfcnNwcV9zejsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcyAqaW9jX2RtYSA9IEJGQV9NRU1fSU9DX0RNQShiZmEpOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zICppb2NmY19kbWEgPSBCRkFfTUVNX0lPQ0ZDX0RNQShiZmEpOworCXN0cnVjdCBiZmFfbWVtX2t2YV9zICppb2NmY19rdmEgPSBCRkFfTUVNX0lPQ0ZDX0tWQShiZmEpOworCXUzMglkbV9sZW4gPSAwOwogCi0JYmZhX2lvY2ZjX2Z3X2NmZ19zeihjZmcsIGRtX2xlbik7Ci0JYmZhX2lvY2ZjX2Nxc19zeihjZmcsIGRtX2xlbik7Ci0JKmttX2xlbiArPSAoYmZhX2F1dG9fcmVjb3ZlcikgPyBCRkFfREJHX0ZXVFJDX0xFTiA6IDA7CisJLyogZG1hIG1lbW9yeSBzZXR1cCBmb3IgSU9DICovCisJYmZhX21lbV9kbWFfc2V0dXAobWVtaW5mbywgaW9jX2RtYSwKKwkJQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmlfaW9jX2F0dHJfcyksIEJGQV9ETUFfQUxJR05fU1opKTsKKworCS8qIGRtYSBtZW1vcnkgc2V0dXAgZm9yIFJFUS9SU1AgcXVldWVzICovCisJcGVyX3JlcXFfc3ogPSBCRkFfUk9VTkRVUCgoY2ZnLT5kcnZjZmcubnVtX3JlcXFfZWxlbXMgKiBCRklfTE1TR19TWiksCisJCQkJQkZBX0RNQV9BTElHTl9TWik7CisJcGVyX3JzcHFfc3ogPSBCRkFfUk9VTkRVUCgoY2ZnLT5kcnZjZmcubnVtX3JzcHFfZWxlbXMgKiBCRklfTE1TR19TWiksCisJCQkJQkZBX0RNQV9BTElHTl9TWik7CisKKwlmb3IgKHEgPSAwOyBxIDwgY2ZnLT5md2NmZy5udW1fY3FzOyBxKyspIHsKKwkJYmZhX21lbV9kbWFfc2V0dXAobWVtaW5mbywgQkZBX01FTV9SRVFRX0RNQShiZmEsIHEpLAorCQkJCXBlcl9yZXFxX3N6KTsKKwkJYmZhX21lbV9kbWFfc2V0dXAobWVtaW5mbywgQkZBX01FTV9SU1BRX0RNQShiZmEsIHEpLAorCQkJCXBlcl9yc3BxX3N6KTsKKwl9CisKKwkvKiBJT0NGQyBkbWEgbWVtb3J5IC0gY2FsY3VsYXRlIFNoYWRvdyBDSS9QSSBzaXplICovCisJZm9yIChxID0gMDsgcSA8IGNmZy0+ZndjZmcubnVtX2NxczsgcSsrKQorCQlkbV9sZW4gKz0gKDIgKiBCRkFfQ0FDSEVMSU5FX1NaKTsKKworCS8qIElPQ0ZDIGRtYSBtZW1vcnkgLSBjYWxjdWxhdGUgY29uZmlnIGluZm8gLyByc3Agc2l6ZSAqLworCWRtX2xlbiArPSBCRkFfUk9VTkRVUChzaXplb2Yoc3RydWN0IGJmaV9pb2NmY19jZmdfcyksIEJGQV9DQUNIRUxJTkVfU1opOworCWRtX2xlbiArPSBCRkFfUk9VTkRVUChzaXplb2Yoc3RydWN0IGJmaV9pb2NmY19jZmdyc3BfcyksCisJCQlCRkFfQ0FDSEVMSU5FX1NaKTsKKworCS8qIGRtYSBtZW1vcnkgc2V0dXAgZm9yIElPQ0ZDICovCisJYmZhX21lbV9kbWFfc2V0dXAobWVtaW5mbywgaW9jZmNfZG1hLCBkbV9sZW4pOworCisJLyoga3ZhIG1lbW9yeSBzZXR1cCBmb3IgSU9DRkMgKi8KKwliZmFfbWVtX2t2YV9zZXR1cChtZW1pbmZvLCBpb2NmY19rdmEsCisJCQkoKGJmYV9hdXRvX3JlY292ZXIpID8gQkZBX0RCR19GV1RSQ19MRU4gOiAwKSk7CiB9CiAKIC8qCkBAIC04MDIsNyArMTE1MSw3IEBACiAgKi8KIHZvaWQKIGJmYV9pb2NmY19hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKLQkJIHN0cnVjdCBiZmFfbWVtaW5mb19zICptZW1pbmZvLCBzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYpCisJCSBzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYpCiB7CiAJaW50CQlpOwogCXN0cnVjdCBiZmFfaW9jX3MgKmlvYyA9ICZiZmEtPmlvYzsKQEAgLTgxNSwxNyArMTE2NCwxMSBAQAogCWlvYy0+dHJjbW9kID0gYmZhLT50cmNtb2Q7CiAJYmZhX2lvY19hdHRhY2goJmJmYS0+aW9jLCBiZmEsICZiZmFfaW9jZmNfY2JmbiwgJmJmYS0+dGltZXJfbW9kKTsKIAotCS8qCi0JICogU2V0IEZDIG1vZGUgZm9yIEJGQV9QQ0lfREVWSUNFX0lEX0NUX0ZDLgotCSAqLwotCWlmIChwY2lkZXYtPmRldmljZV9pZCA9PSBCRkFfUENJX0RFVklDRV9JRF9DVF9GQykKLQkJYmZhX2lvY19zZXRfZmNtb2RlKCZiZmEtPmlvYyk7Ci0KLQliZmFfaW9jX3BjaV9pbml0KCZiZmEtPmlvYywgcGNpZGV2LCBCRklfTUNfSU9DRkMpOworCWJmYV9pb2NfcGNpX2luaXQoJmJmYS0+aW9jLCBwY2lkZXYsIEJGSV9QQ0lGTl9DTEFTU19GQyk7CiAJYmZhX2lvY19tYm94X3JlZ2lzdGVyKCZiZmEtPmlvYywgYmZhX21ib3hfaXNycyk7CiAKIAliZmFfaW9jZmNfaW5pdF9tZW0oYmZhLCBiZmFkLCBjZmcsIHBjaWRldik7Ci0JYmZhX2lvY2ZjX21lbV9jbGFpbShiZmEsIGNmZywgbWVtaW5mbyk7CisJYmZhX2lvY2ZjX21lbV9jbGFpbShiZmEsIGNmZyk7CiAJSU5JVF9MSVNUX0hFQUQoJmJmYS0+dGltZXJfbW9kLnRpbWVyX3EpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmJmYS0+Y29tcF9xKTsKQEAgLTg2Myw3ICsxMjA2LDcgQEAKIHsKIAliZmEtPmlvY2ZjLmFjdGlvbiA9IEJGQV9JT0NGQ19BQ1RfU1RPUDsKIAotCWJmYS0+cm1lX3Byb2Nlc3MgPSBCRkFfRkFMU0U7CisJYmZhLT5xdWV1ZV9wcm9jZXNzID0gQkZBX0ZBTFNFOwogCWJmYV9pb2NfZGlzYWJsZSgmYmZhLT5pb2MpOwogfQogCkBAIC04NzksMTIgKzEyMjIsMjIgQEAKIAogCXN3aXRjaCAobXNnLT5taC5tc2dfaWQpIHsKIAljYXNlIEJGSV9JT0NGQ19JMkhfQ0ZHX1JFUExZOgotCQlpb2NmYy0+Y2ZnX3JlcGx5ID0gJm1zZy0+Y2ZnX3JlcGx5OwogCQliZmFfaW9jZmNfY2ZncnNwKGJmYSk7CiAJCWJyZWFrOwogCWNhc2UgQkZJX0lPQ0ZDX0kySF9VUERBVEVRX1JTUDoKIAkJaW9jZmMtPnVwZGF0ZXFfY2Jmbihpb2NmYy0+dXBkYXRlcV9jYmFyZywgQkZBX1NUQVRVU19PSyk7CiAJCWJyZWFrOworCWNhc2UgQkZJX0lPQ0ZDX0kySF9GQUFfRU5BQkxFX1JTUDoKKwkJYmZhX2ZhYV9lbmFibGVfcmVwbHkoaW9jZmMsCisJCQkoc3RydWN0IGJmaV9mYWFfZW5fZGlzX3JzcF9zICopbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBCRklfSU9DRkNfSTJIX0ZBQV9ESVNBQkxFX1JTUDoKKwkJYmZhX2ZhYV9kaXNhYmxlX3JlcGx5KGlvY2ZjLAorCQkJKHN0cnVjdCBiZmlfZmFhX2VuX2Rpc19yc3BfcyAqKW1zZyk7CisJCWJyZWFrOworCWNhc2UgQkZJX0lPQ0ZDX0kySF9GQUFfUVVFUllfUlNQOgorCQliZmFfZmFhX3F1ZXJ5X3JlcGx5KGlvY2ZjLCAoYmZpX2ZhYV9xdWVyeV9yc3BfdCAqKW1zZyk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVdBUk5fT04oMSk7CiAJfQpAQCAtOTI2LDcgKzEyNzksNyBAQAogCQlyZXR1cm4gQkZBX1NUQVRVU19ERVZCVVNZOwogCiAJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19JT0NGQywgQkZJX0lPQ0ZDX0gySV9TRVRfSU5UUl9SRVEsCi0JCSAgICBiZmFfbHB1aWQoYmZhKSk7CisJCSAgICBiZmFfZm5fbHB1KGJmYSkpOwogCW0tPmNvYWxlc2NlID0gaW9jZmMtPmNmZ2luZm8tPmludHJfYXR0ci5jb2FsZXNjZTsKIAltLT5kZWxheSAgICA9IGlvY2ZjLT5jZmdpbmZvLT5pbnRyX2F0dHIuZGVsYXk7CiAJbS0+bGF0ZW5jeSAgPSBpb2NmYy0+Y2ZnaW5mby0+aW50cl9hdHRyLmxhdGVuY3k7CkBAIC05MzQsMTcgKzEyODcsMTcgQEAKIAliZmFfdHJjKGJmYSwgYXR0ci0+ZGVsYXkpOwogCWJmYV90cmMoYmZhLCBhdHRyLT5sYXRlbmN5KTsKIAotCWJmYV9yZXFxX3Byb2R1Y2UoYmZhLCBCRkFfUkVRUV9JT0MpOworCWJmYV9yZXFxX3Byb2R1Y2UoYmZhLCBCRkFfUkVRUV9JT0MsIG0tPm1oKTsKIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKIH0KIAogdm9pZAotYmZhX2lvY2ZjX3NldF9zbnNiYXNlKHN0cnVjdCBiZmFfcyAqYmZhLCB1NjQgc25zYmFzZV9wYSkKK2JmYV9pb2NmY19zZXRfc25zYmFzZShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHNlZ19ubywgdTY0IHNuc2Jhc2VfcGEpCiB7CiAJc3RydWN0IGJmYV9pb2NmY19zCSppb2NmYyA9ICZiZmEtPmlvY2ZjOwogCiAJaW9jZmMtPmNmZ2luZm8tPnNlbnNlX2J1Zl9sZW4gPSAoQkZJX0lPSU1fU05TTEVOIC0gMSk7Ci0JYmZhX2RtYV9iZV9hZGRyX3NldChpb2NmYy0+Y2ZnaW5mby0+aW9pbV9zbnNiYXNlLCBzbnNiYXNlX3BhKTsKKwliZmFfZG1hX2JlX2FkZHJfc2V0KGlvY2ZjLT5jZmdpbmZvLT5pb2ltX3Nuc2Jhc2Vbc2VnX25vXSwgc25zYmFzZV9wYSk7CiB9CiAvKgogICogRW5hYmxlIElPQyBhZnRlciBpdCBpcyBkaXNhYmxlZC4KQEAgLTk1NCw2ICsxMzA3LDcgQEAKIHsKIAliZmFfcGxvZ19zdHIoYmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTCwgQkZBX1BMX0VJRF9NSVNDLCAwLAogCQkgICAgICJJT0MgRW5hYmxlIik7CisJYmZhLT5pb2NmYy5hY3Rpb24gPSBCRkFfSU9DRkNfQUNUX0VOQUJMRTsKIAliZmFfaW9jX2VuYWJsZSgmYmZhLT5pb2MpOwogfQogCkBAIC05NjQsNyArMTMxOCw3IEBACiAJCSAgICAgIklPQyBEaXNhYmxlIik7CiAJYmZhLT5pb2NmYy5hY3Rpb24gPSBCRkFfSU9DRkNfQUNUX0RJU0FCTEU7CiAKLQliZmEtPnJtZV9wcm9jZXNzID0gQkZBX0ZBTFNFOworCWJmYS0+cXVldWVfcHJvY2VzcyA9IEJGQV9GQUxTRTsKIAliZmFfaW9jX2Rpc2FibGUoJmJmYS0+aW9jKTsKIH0KIApAQCAtMTAzMywzMyArMTM4Nyw0OSBAQAogICoJCQlzdGFydGluZyBhZGRyZXNzIGZvciBlYWNoIGJsb2NrIGFuZCBwcm92aWRlIHRoZSBzYW1lCiAgKgkJCXN0cnVjdHVyZSBhcyBpbnB1dCBwYXJhbWV0ZXIgdG8gYmZhX2F0dGFjaCgpIGNhbGwuCiAgKgorICogQHBhcmFtW2luXSBiZmEgLQlwb2ludGVyIHRvIHRoZSBiZmEgc3RydWN0dXJlLCB1c2VkIHdoaWxlIGZldGNoaW5nIHRoZQorICoJCQlkbWEsIGt2YSBtZW1vcnkgaW5mb3JtYXRpb24gb2YgdGhlIGJmYSBzdWItbW9kdWxlcy4KKyAqCiAgKiBAcmV0dXJuIHZvaWQKICAqCiAgKiBTcGVjaWFsIENvbnNpZGVyYXRpb25zOiBAbm90ZQogICovCiB2b2lkCi1iZmFfY2ZnX2dldF9tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8pCitiZmFfY2ZnX2dldF9tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sCisJCXN0cnVjdCBiZmFfcyAqYmZhKQogewogCWludAkJaTsKLQl1MzIJa21fbGVuID0gMCwgZG1fbGVuID0gMDsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcyAqcG9ydF9kbWEgPSBCRkFfTUVNX1BPUlRfRE1BKGJmYSk7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MgKmFibGtfZG1hID0gQkZBX01FTV9BQkxLX0RNQShiZmEpOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zICpjZWVfZG1hID0gQkZBX01FTV9DRUVfRE1BKGJmYSk7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MgKnNmcF9kbWEgPSBCRkFfTUVNX1NGUF9ETUEoYmZhKTsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcyAqZmxhc2hfZG1hID0gQkZBX01FTV9GTEFTSF9ETUEoYmZhKTsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcyAqZGlhZ19kbWEgPSBCRkFfTUVNX0RJQUdfRE1BKGJmYSk7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MgKnBoeV9kbWEgPSBCRkFfTUVNX1BIWV9ETUEoYmZhKTsKIAogCVdBUk5fT04oKGNmZyA9PSBOVUxMKSB8fCAobWVtaW5mbyA9PSBOVUxMKSk7CiAKIAltZW1zZXQoKHZvaWQgKiltZW1pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9tZW1pbmZvX3MpKTsKLQltZW1pbmZvLT5tZW1pbmZvW0JGQV9NRU1fVFlQRV9LVkEgLSAxXS5tZW1fdHlwZSA9Ci0JCUJGQV9NRU1fVFlQRV9LVkE7Ci0JbWVtaW5mby0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfRE1BIC0gMV0ubWVtX3R5cGUgPQotCQlCRkFfTUVNX1RZUEVfRE1BOwogCi0JYmZhX2lvY2ZjX21lbWluZm8oY2ZnLCAma21fbGVuLCAmZG1fbGVuKTsKKwkvKiBJbml0aWFsaXplIHRoZSBETUEgJiBLVkEgbWVtaW5mbyBxdWV1ZXMgKi8KKwlJTklUX0xJU1RfSEVBRCgmbWVtaW5mby0+ZG1hX2luZm8ucWUpOworCUlOSVRfTElTVF9IRUFEKCZtZW1pbmZvLT5rdmFfaW5mby5xZSk7CisKKwliZmFfaW9jZmNfbWVtaW5mbyhjZmcsIG1lbWluZm8sIGJmYSk7CiAKIAlmb3IgKGkgPSAwOyBoYWxfbW9kc1tpXTsgaSsrKQotCQloYWxfbW9kc1tpXS0+bWVtaW5mbyhjZmcsICZrbV9sZW4sICZkbV9sZW4pOworCQloYWxfbW9kc1tpXS0+bWVtaW5mbyhjZmcsIG1lbWluZm8sIGJmYSk7CiAKLQlkbV9sZW4gKz0gYmZhX3BvcnRfbWVtaW5mbygpOwotCi0JbWVtaW5mby0+bWVtaW5mb1tCRkFfTUVNX1RZUEVfS1ZBIC0gMV0ubWVtX2xlbiA9IGttX2xlbjsKLQltZW1pbmZvLT5tZW1pbmZvW0JGQV9NRU1fVFlQRV9ETUEgLSAxXS5tZW1fbGVuID0gZG1fbGVuOworCS8qIGRtYSBpbmZvIHNldHVwICovCisJYmZhX21lbV9kbWFfc2V0dXAobWVtaW5mbywgcG9ydF9kbWEsIGJmYV9wb3J0X21lbWluZm8oKSk7CisJYmZhX21lbV9kbWFfc2V0dXAobWVtaW5mbywgYWJsa19kbWEsIGJmYV9hYmxrX21lbWluZm8oKSk7CisJYmZhX21lbV9kbWFfc2V0dXAobWVtaW5mbywgY2VlX2RtYSwgYmZhX2NlZV9tZW1pbmZvKCkpOworCWJmYV9tZW1fZG1hX3NldHVwKG1lbWluZm8sIHNmcF9kbWEsIGJmYV9zZnBfbWVtaW5mbygpKTsKKwliZmFfbWVtX2RtYV9zZXR1cChtZW1pbmZvLCBmbGFzaF9kbWEsCisJCQkgIGJmYV9mbGFzaF9tZW1pbmZvKGNmZy0+ZHJ2Y2ZnLm1pbl9jZmcpKTsKKwliZmFfbWVtX2RtYV9zZXR1cChtZW1pbmZvLCBkaWFnX2RtYSwgYmZhX2RpYWdfbWVtaW5mbygpKTsKKwliZmFfbWVtX2RtYV9zZXR1cChtZW1pbmZvLCBwaHlfZG1hLAorCQkJICBiZmFfcGh5X21lbWluZm8oY2ZnLT5kcnZjZmcubWluX2NmZykpOwogfQogCiAvKgpAQCAtMTA5MiwyOCArMTQ2Miw0NiBAQAogYmZhX2F0dGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqYmZhZCwgc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLAogCSAgICAgICBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywgc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQogewotCWludAkJCWk7Ci0Jc3RydWN0IGJmYV9tZW1fZWxlbV9zCSptZWxlbTsKKwlpbnQJaTsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcyAqZG1hX2luZm8sICpkbWFfZWxlbTsKKwlzdHJ1Y3QgYmZhX21lbV9rdmFfcyAqa3ZhX2luZm8sICprdmFfZWxlbTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpkbV9xZSwgKmttX3FlOwogCiAJYmZhLT5mY3MgPSBCRkFfRkFMU0U7CiAKIAlXQVJOX09OKChjZmcgPT0gTlVMTCkgfHwgKG1lbWluZm8gPT0gTlVMTCkpOwogCi0JLyoKLQkgKiBpbml0aWFsaXplIGFsbCBtZW1vcnkgcG9pbnRlcnMgZm9yIGl0ZXJhdGl2ZSBhbGxvY2F0aW9uCi0JICovCi0JZm9yIChpID0gMDsgaSA8IEJGQV9NRU1fVFlQRV9NQVg7IGkrKykgewotCQltZWxlbSA9IG1lbWluZm8tPm1lbWluZm8gKyBpOwotCQltZWxlbS0+a3ZhX2N1cnAgPSBtZWxlbS0+a3ZhOwotCQltZWxlbS0+ZG1hX2N1cnAgPSBtZWxlbS0+ZG1hOworCS8qIEluaXRpYWxpemUgbWVtb3J5IHBvaW50ZXJzIGZvciBpdGVyYXRpdmUgYWxsb2NhdGlvbiAqLworCWRtYV9pbmZvID0gJm1lbWluZm8tPmRtYV9pbmZvOworCWRtYV9pbmZvLT5rdmFfY3VycCA9IGRtYV9pbmZvLT5rdmE7CisJZG1hX2luZm8tPmRtYV9jdXJwID0gZG1hX2luZm8tPmRtYTsKKworCWt2YV9pbmZvID0gJm1lbWluZm8tPmt2YV9pbmZvOworCWt2YV9pbmZvLT5rdmFfY3VycCA9IGt2YV9pbmZvLT5rdmE7CisKKwlsaXN0X2Zvcl9lYWNoKGRtX3FlLCAmZG1hX2luZm8tPnFlKSB7CisJCWRtYV9lbGVtID0gKHN0cnVjdCBiZmFfbWVtX2RtYV9zICopIGRtX3FlOworCQlkbWFfZWxlbS0+a3ZhX2N1cnAgPSBkbWFfZWxlbS0+a3ZhOworCQlkbWFfZWxlbS0+ZG1hX2N1cnAgPSBkbWFfZWxlbS0+ZG1hOwogCX0KIAotCWJmYV9pb2NmY19hdHRhY2goYmZhLCBiZmFkLCBjZmcsIG1lbWluZm8sIHBjaWRldik7CisJbGlzdF9mb3JfZWFjaChrbV9xZSwgJmt2YV9pbmZvLT5xZSkgeworCQlrdmFfZWxlbSA9IChzdHJ1Y3QgYmZhX21lbV9rdmFfcyAqKSBrbV9xZTsKKwkJa3ZhX2VsZW0tPmt2YV9jdXJwID0ga3ZhX2VsZW0tPmt2YTsKKwl9CisKKwliZmFfaW9jZmNfYXR0YWNoKGJmYSwgYmZhZCwgY2ZnLCBwY2lkZXYpOwogCiAJZm9yIChpID0gMDsgaGFsX21vZHNbaV07IGkrKykKLQkJaGFsX21vZHNbaV0tPmF0dGFjaChiZmEsIGJmYWQsIGNmZywgbWVtaW5mbywgcGNpZGV2KTsKKwkJaGFsX21vZHNbaV0tPmF0dGFjaChiZmEsIGJmYWQsIGNmZywgcGNpZGV2KTsKIAotCWJmYV9jb21fcG9ydF9hdHRhY2goYmZhLCBtZW1pbmZvKTsKKwliZmFfY29tX3BvcnRfYXR0YWNoKGJmYSk7CisJYmZhX2NvbV9hYmxrX2F0dGFjaChiZmEpOworCWJmYV9jb21fY2VlX2F0dGFjaChiZmEpOworCWJmYV9jb21fc2ZwX2F0dGFjaChiZmEpOworCWJmYV9jb21fZmxhc2hfYXR0YWNoKGJmYSwgY2ZnLT5kcnZjZmcubWluX2NmZyk7CisJYmZhX2NvbV9kaWFnX2F0dGFjaChiZmEpOworCWJmYV9jb21fcGh5X2F0dGFjaChiZmEsIGNmZy0+ZHJ2Y2ZnLm1pbl9jZmcpOwogfQogCiAvKgpAQCAtMTIxNSw2ICsxNjAzLDcgQEAKIAljZmctPmZ3Y2ZnLm51bV9mY3hwX3JlcXMgPSBERUZfQ0ZHX05VTV9GQ1hQX1JFUVM7CiAJY2ZnLT5md2NmZy5udW1fdWZfYnVmcyA9IERFRl9DRkdfTlVNX1VGX0JVRlM7CiAJY2ZnLT5md2NmZy5udW1fY3FzID0gREVGX0NGR19OVU1fQ1FTOworCWNmZy0+ZndjZmcubnVtX2Z3dGlvX3JlcXMgPSAwOwogCiAJY2ZnLT5kcnZjZmcubnVtX3JlcXFfZWxlbXMgPSBERUZfQ0ZHX05VTV9SRVFRX0VMRU1TOwogCWNmZy0+ZHJ2Y2ZnLm51bV9yc3BxX2VsZW1zID0gREVGX0NGR19OVU1fUlNQUV9FTEVNUzsKQEAgLTEyMzYsNiArMTYyNSw3IEBACiAJY2ZnLT5md2NmZy5udW1fZmN4cF9yZXFzICAgPSBCRkFfRkNYUF9NSU47CiAJY2ZnLT5md2NmZy5udW1fdWZfYnVmcyAgICAgPSBCRkFfVUZfTUlOOwogCWNmZy0+ZndjZmcubnVtX3Jwb3J0cyAgICAgID0gQkZBX1JQT1JUX01JTjsKKwljZmctPmZ3Y2ZnLm51bV9md3Rpb19yZXFzID0gMDsKIAogCWNmZy0+ZHJ2Y2ZnLm51bV9zZ3BncyAgICAgID0gQkZBX1NHUEdfTUlOOwogCWNmZy0+ZHJ2Y2ZnLm51bV9yZXFxX2VsZW1zID0gQkZBX1JFUVFfTkVMRU1TX01JTjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnMuaAppbmRleCBkODVmOTNhLi5lZDhkMzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9kZWZzLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmcy5oCkBAIC00MCw3ICs0MCwxMiBAQAogCUJGQV9NRkdfVFlQRV9BU1RSQSAgICA9IDgwNywgICAgIC8qICBBc3RyYSBtZXp6IGNhcmQgICAgICAgICAgICAqLwogCUJGQV9NRkdfVFlQRV9MSUdIVE5JTkdfUDAgPSA5MDIsIC8qICBMaWdodG5pbmcgbWV6eiBjYXJkIC0gb2xkICAqLwogCUJGQV9NRkdfVFlQRV9MSUdIVE5JTkcgPSAxNzQxLCAgIC8qICBMaWdodG5pbmcgbWV6eiBjYXJkICAgICAgICAqLwotCUJGQV9NRkdfVFlQRV9JTlZBTElEID0gMCwgICAgICAgIC8qICBJbnZhbGlkIGNhcmQgdHlwZSAgICAgICAgICAqLworCUJGQV9NRkdfVFlQRV9QUk9XTEVSX0YgPSAxNTYwLAkgLyogIFByb3dsZXIgRkMgb25seSBjYXJkcwkqLworCUJGQV9NRkdfVFlQRV9QUk9XTEVSX04gPSAxNDEwLAkgLyogIFByb3dsZXIgTklDIG9ubHkgY2FyZHMJKi8KKwlCRkFfTUZHX1RZUEVfUFJPV0xFUl9DID0gMTcxMCwgICAvKiAgUHJvd2xlciBDTkEgb25seSBjYXJkcwkqLworCUJGQV9NRkdfVFlQRV9QUk9XTEVSX0QgPSAxODYwLCAgIC8qICBQcm93bGVyIER1YWwgY2FyZHMJCSovCisJQkZBX01GR19UWVBFX0NISU5PT0sgICA9IDE4NjcsICAgLyogIENoaW5vb2sgY2FyZHMJCSovCisJQkZBX01GR19UWVBFX0lOVkFMSUQgPSAwLCAgICAgICAgLyogIEludmFsaWQgY2FyZCB0eXBlCQkqLwogfTsKIAogI3ByYWdtYSBwYWNrKDEpCkBAIC01Myw3ICs1OCw4IEBACiAJKHR5cGUpID09IEJGQV9NRkdfVFlQRV9XQU5DSEVTRSB8fCBcCiAJKHR5cGUpID09IEJGQV9NRkdfVFlQRV9BU1RSQSB8fCBcCiAJKHR5cGUpID09IEJGQV9NRkdfVFlQRV9MSUdIVE5JTkdfUDAgfHwgXAotCSh0eXBlKSA9PSBCRkFfTUZHX1RZUEVfTElHSFROSU5HKSkKKwkodHlwZSkgPT0gQkZBX01GR19UWVBFX0xJR0hUTklORyB8fCBcCisJKHR5cGUpID09IEJGQV9NRkdfVFlQRV9DSElOT09LKSkKIAogLyoKICAqIENoZWNrIGlmIHRoZSBjYXJkIGhhdmluZyBvbGQgd3duL21hYyBoYW5kbGluZwpAQCAtMTI0LDMwICsxMzAsNTMgQEAKIAlCRkFfU1RBVFVTX0VUSU1FUgk9IDUsCS8qICBUaW1lciBleHBpcmVkIC0gUmV0cnksIGlmIHBlcnNpc3RzLAogCQkJCQkgKiAgY29udGFjdCBzdXBwb3J0ICovCiAJQkZBX1NUQVRVU19FUFJPVE9DT0wJPSA2LAkvKiAgUHJvdG9jb2wgZXJyb3IgKi8KKwlCRkFfU1RBVFVTX1NGUF9VTlNVUFAJPSAxMCwJLyogIFVuc3VwcG9ydGVkIFNGUCAtIFJlcGxhY2UgU0ZQICovCisJQkZBX1NUQVRVU19VTktOT1dOX1ZGSUQgPSAxMSwJLyogIFZGX0lEIG5vdCBmb3VuZCAqLworCUJGQV9TVEFUVVNfREFUQUNPUlJVUFRFRCA9IDEyLCAgLyogIERpYWcgcmV0dXJuZWQgZGF0YSBjb3JydXB0ZWQgKi8KIAlCRkFfU1RBVFVTX0RFVkJVU1kJPSAxMywJLyogIERldmljZSBidXN5IC0gUmV0cnkgb3BlcmF0aW9uICovCisJQkZBX1NUQVRVU19IRE1BX0ZBSUxFRCAgPSAxNiwgICAvKiBIb3N0IGRtYSBmYWlsZWQgY29udGFjdCBzdXBwb3J0ICovCisJQkZBX1NUQVRVU19GTEFTSF9CQURfTEVOID0gMTcsCS8qICBGbGFzaCBiYWQgbGVuZ3RoICovCiAJQkZBX1NUQVRVU19VTktOT1dOX0xXV04gPSAxOCwJLyogIExQT1JUIFBXV04gbm90IGZvdW5kICovCiAJQkZBX1NUQVRVU19VTktOT1dOX1JXV04gPSAxOSwJLyogIFJQT1JUIFBXV04gbm90IGZvdW5kICovCiAJQkZBX1NUQVRVU19WUE9SVF9FWElTVFMgPSAyMSwJLyogIFZQT1JUIGFscmVhZHkgZXhpc3RzICovCiAJQkZBX1NUQVRVU19WUE9SVF9NQVgJPSAyMiwJLyogIFJlYWNoZWQgbWF4IFZQT1JUIHN1cHBvcnRlZCBsaW1pdCAqLwogCUJGQV9TVEFUVVNfVU5TVVBQX1NQRUVECT0gMjMsCS8qICBJbnZhbGlkIFNwZWVkIENoZWNrIHNwZWVkIHNldHRpbmcgKi8KIAlCRkFfU1RBVFVTX0lOVkxEX0RGU1oJPSAyNCwJLyogIEludmFsaWQgTWF4IGRhdGEgZmllbGQgc2l6ZSAqLworCUJGQV9TVEFUVVNfQ01EX05PVFNVUFAgID0gMjYsICAgLyogIENvbW1hbmQvQVBJIG5vdCBzdXBwb3J0ZWQgKi8KIAlCRkFfU1RBVFVTX0ZBQlJJQ19SSlQJPSAyOSwJLyogIFJlamVjdCBmcm9tIGF0dGFjaGVkIGZhYnJpYyAqLworCUJGQV9TVEFUVVNfUE9SVF9PRkZMSU5FID0gMzQsCS8qICBQb3J0IGlzIG5vdCBvbmxpbmUgKi8KIAlCRkFfU1RBVFVTX1ZQT1JUX1dXTl9CUAk9IDQ2LAkvKiAgV1dOIGlzIHNhbWUgYXMgYmFzZSBwb3J0J3MgV1dOICovCisJQkZBX1NUQVRVU19QT1JUX05PVF9ESVNBQkxFRCA9IDQ3LCAvKiBQb3J0IG5vdCBkaXNhYmxlZCBkaXNhYmxlIHBvcnQgKi8KIAlCRkFfU1RBVFVTX05PX0ZDUElNX05FWFVTID0gNTIsCS8qIE5vIEZDUCBOZXh1cyBleGlzdHMgd2l0aCB0aGUgcnBvcnQgKi8KIAlCRkFfU1RBVFVTX0lPQ19GQUlMVVJFCT0gNTYsCS8qIElPQyBmYWlsdXJlIC0gUmV0cnksIGlmIHBlcnNpc3RzCiAJCQkJCSAqIGNvbnRhY3Qgc3VwcG9ydCAqLwogCUJGQV9TVEFUVVNfSU5WQUxJRF9XV04JPSA1NywJLyogIEludmFsaWQgV1dOICovCisJQkZBX1NUQVRVU19BREFQVEVSX0VOQUJMRUQgPSA2MCwgLyogQWRhcHRlciBpcyBub3QgZGlzYWJsZWQgKi8KKwlCRkFfU1RBVFVTX0lPQ19OT05fT1AgICA9IDYxLAkvKiBJT0MgaXMgbm90IG9wZXJhdGlvbmFsICovCisJQkZBX1NUQVRVU19WRVJTSU9OX0ZBSUwgPSA3MCwgLyogQXBwbGljYXRpb24vRHJpdmVyIHZlcnNpb24gbWlzbWF0Y2ggKi8KIAlCRkFfU1RBVFVTX0RJQUdfQlVTWQk9IDcxLAkvKiAgZGlhZyBidXN5ICovCisJQkZBX1NUQVRVU19CRUFDT05fT04gICAgPSA3MiwgICAvKiBQb3J0IEJlYWNvbiBhbHJlYWR5IG9uICovCiAJQkZBX1NUQVRVU19FTk9GU0FWRQk9IDc4LAkvKiAgTm8gc2F2ZWQgZmlybXdhcmUgdHJhY2UgKi8KIAlCRkFfU1RBVFVTX0lPQ19ESVNBQkxFRCA9IDgyLCAgIC8qIElPQyBpcyBhbHJlYWR5IGRpc2FibGVkICovCisJQkZBX1NUQVRVU19OT19TRlBfREVWID0gODksCS8qIE5vIFNGUCBkZXZpY2UgY2hlY2sgb3IgcmVwbGFjZSBTRlAgKi8KKwlCRkFfU1RBVFVTX01FTVRFU1RfRkFJTEVEID0gOTAsIC8qIE1lbW9yeSB0ZXN0IGZhaWxlZCBjb250YWN0IHN1cHBvcnQgKi8KKwlCRkFfU1RBVFVTX0xFRFRFU1RfT1AgPSAxMDksIC8qIExFRCB0ZXN0IGlzIG9wZXJhdGluZyAqLwogCUJGQV9TVEFUVVNfSU5WQUxJRF9NQUMgID0gMTM0LCAvKiAgSW52YWxpZCBNQUMgYWRkcmVzcyAqLwogCUJGQV9TVEFUVVNfUEJDCQk9IDE1NCwgLyogIE9wZXJhdGlvbiBub3QgYWxsb3dlZCBmb3IgcHJlLWJvb3QKIAkJCQkJKiAgY29uZmlndXJhdGlvbiAqLworCUJGQV9TVEFUVVNfU0ZQX05PVF9SRUFEWSA9IDE1OSwJLyogU0ZQIGluZm8gaXMgbm90IHJlYWR5LiBSZXRyeSAqLwogCUJGQV9TVEFUVVNfVFJVTktfRU5BQkxFRCA9IDE2NCwgLyogVHJ1bmsgaXMgYWxyZWFkeSBlbmFibGVkIG9uCiAJCQkJCSAqIHRoaXMgYWRhcHRlciAqLwogCUJGQV9TVEFUVVNfVFJVTktfRElTQUJMRUQgID0gMTY1LCAvKiBUcnVua2luZyBpcyBkaXNhYmxlZCBvbgogCQkJCQkgICAqIHRoZSBhZGFwdGVyICovCiAJQkZBX1NUQVRVU19JT1BST0ZJTEVfT0ZGID0gMTc1LCAvKiBJTyBwcm9maWxlIE9GRiAqLworCUJGQV9TVEFUVVNfUEhZX05PVF9QUkVTRU5UID0gMTgzLCAvKiBQSFkgbW9kdWxlIG5vdCBwcmVzZW50ICovCisJQkZBX1NUQVRVU19GRUFUVVJFX05PVF9TVVBQT1JURUQgPSAxOTIsCS8qIEZlYXR1cmUgbm90IHN1cHBvcnRlZCAqLworCUJGQV9TVEFUVVNfRkFBX0VOQUJMRUQgPSAxOTcsCS8qIEZBQSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKwlCRkFfU1RBVFVTX0ZBQV9ESVNBQkxFRCA9IDE5OCwJLyogRkFBIGlzIGFscmVhZHkgZGlzYWJsZWQgKi8KKwlCRkFfU1RBVFVTX0ZBQV9BQ1FVSVJFRCA9IDE5OSwJLyogRkFBIGlzIGFscmVhZHkgYWNxdWlyZWQgKi8KKwlCRkFfU1RBVFVTX0ZBQV9BQ1FfQUREUiA9IDIwMCwJLyogQWNxdWlyaW5nIGFkZHIgKi8KKwlCRkFfU1RBVFVTX0VSUk9SX1RSVU5LX0VOQUJMRUQgPSAyMDMsCS8qIFRydW5rIGVuYWJsZWQgb24gYWRhcHRlciAqLwogCUJGQV9TVEFUVVNfTUFYX1ZBTAkJLyogVW5rbm93biBlcnJvciBjb2RlICovCiB9OwogI2RlZmluZSBiZmFfc3RhdHVzX3QgZW51bSBiZmFfc3RhdHVzCkBAIC0yNjUsNiArMjk0LDggQEAKIAlCRkFfSU9DX0RJU0FCTEVECT0gMTAsCS8qICBJT0MgaXMgZGlzYWJsZWQgKi8KIAlCRkFfSU9DX0ZXTUlTTUFUQ0gJPSAxMSwJLyogIElPQyBmL3cgZGlmZmVyZW50IGZyb20gZHJpdmVycyAqLwogCUJGQV9JT0NfRU5BQkxJTkcJPSAxMiwJLyogIElPQyBpcyBiZWluZyBlbmFibGVkICovCisJQkZBX0lPQ19IV0ZBSUwJCT0gMTMsCS8qICBQQ0kgbWFwcGluZyBkb2Vzbid0IGV4aXN0ICovCisJQkZBX0lPQ19BQ1FfQUREUgk9IDE0LAkvKiAgQWNxdWlyaW5nIGFkZHIgZnJvbSBmYWJyaWMgKi8KIH07CiAKIC8qCkBAIC0yOTQsNiArMzI1LDcgQEAKIAl1MzIJZW5hYmxlX3JlcXM7CiAJdTMyCWRpc2FibGVfcmVwbGllczsKIAl1MzIJZW5hYmxlX3JlcGxpZXM7CisJdTMyCXJzdmQ7CiB9OwogCiAvKgpAQCAtMzIwLDcgKzM1MiwxMCBAQAogCXN0cnVjdCBiZmFfaW9jX2RyaXZlcl9hdHRyX3MJZHJpdmVyX2F0dHI7CS8qICBkcml2ZXIgYXR0ciAgICAqLwogCXN0cnVjdCBiZmFfaW9jX3BjaV9hdHRyX3MJcGNpX2F0dHI7CiAJdTgJCQkJcG9ydF9pZDsJLyogIHBvcnQgbnVtYmVyICAgICovCi0JdTgJCQkJcnN2ZFs3XTsJLyogIDY0Yml0IGFsaWduICAgICovCisJdTgJCQkJcG9ydF9tb2RlOwkvKiAgYmZhX21vZGVfcwkqLworCXU4CQkJCWNhcF9ibTsJCS8qICBjYXBhYmlsaXR5CSovCisJdTgJCQkJcG9ydF9tb2RlX2NmZzsJLyogIGJmYV9tb2RlX3MJKi8KKwl1OAkJCQlyc3ZkWzRdOwkvKiAgNjRiaXQgYWxpZ24JKi8KIH07CiAKIC8qCkBAIC0zMzcsNiArMzcyLDIxIEBACiAjZGVmaW5lIEJGQV9NRkdfU1VQUExJRVJfUEFSVE5VTV9TSVpFCQkyMAogI2RlZmluZSBCRkFfTUZHX1NVUFBMSUVSX1NFUklBTE5VTV9TSVpFCQkyMAogI2RlZmluZSBCRkFfTUZHX1NVUFBMSUVSX1JFVklTSU9OX1NJWkUJCTQKKy8qCisgKiBJbml0aWFsIGNhcGFiaWxpdHkgZGVmaW5pdGlvbgorICovCisjZGVmaW5lIEJGQV9NRkdfSUNfRkMJMHgwMQorI2RlZmluZSBCRkFfTUZHX0lDX0VUSAkweDAyCisKKy8qCisgKiBBZGFwdGVyIGNhcGFiaWxpdHkgbWFzayBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgQkZBX0NNX0hCQQkweDAxCisjZGVmaW5lIEJGQV9DTV9DTkEJMHgwMgorI2RlZmluZSBCRkFfQ01fTklDCTB4MDQKKyNkZWZpbmUgQkZBX0NNX0ZDMTZHCTB4MDgKKyNkZWZpbmUgQkZBX0NNX1NSSU9WCTB4MTAKKyNkZWZpbmUgQkZBX0NNX01FWloJMHgyMAogCiAjcHJhZ21hIHBhY2soMSkKIApAQCAtMzQ0LDMxICszOTQsMzkgQEAKICAqIEFsbCBudW1lcmljYWwgZmllbGRzIGFyZSBpbiBiaWctZW5kaWFuIGZvcm1hdC4KICAqLwogc3RydWN0IGJmYV9tZmdfYmxvY2tfcyB7Ci0JdTgJCXZlcnNpb247CS8qICBtYW51ZmFjdHVyaW5nIGJsb2NrIHZlcnNpb24gKi8KLQl1OAkJbWZnX3NpZ1szXTsJLyogIGNoYXJhY3RlcnMgJ00nLCAnRicsICdHJyAqLwotCXUxNgltZmdzaXplOwkvKiAgbWZnIGJsb2NrIHNpemUgKi8KLQl1MTYJdTE2X2Noa3N1bTsJLyogIG9sZCB1MTYgY2hlY2tzdW0gKi8KLQljaGFyCQlicmNkX3NlcmlhbG51bVtTVFJTWihCRkFfTUZHX1NFUklBTE5VTV9TSVpFKV07Ci0JY2hhcgkJYnJjZF9wYXJ0bnVtW1NUUlNaKEJGQV9NRkdfUEFSVE5VTV9TSVpFKV07Ci0JdTgJCW1mZ19kYXk7CS8qICBtYW51ZmFjdHVyaW5nIGRheSAqLwotCXU4CQltZmdfbW9udGg7CS8qICBtYW51ZmFjdHVyaW5nIG1vbnRoICovCi0JdTE2CW1mZ195ZWFyOwkvKiAgbWFudWZhY3R1cmluZyB5ZWFyICovCi0Jd3duX3QJCW1mZ193d247CS8qICB3d24gYmFzZSBmb3IgdGhpcyBhZGFwdGVyICovCi0JdTgJCW51bV93d247CS8qICBudW1iZXIgb2Ygd3ducyBhc3NpZ25lZCAqLwotCXU4CQltZmdfc3BlZWRzOwkvKiAgc3BlZWRzIGFsbG93ZWQgZm9yIHRoaXMgYWRhcHRlciAqLwotCXU4CQlyc3ZbMl07Ci0JY2hhcgkJc3VwcGxpZXJfaWRbU1RSU1ooQkZBX01GR19TVVBQTElFUl9JRF9TSVpFKV07Ci0JY2hhcgkJc3VwcGxpZXJfcGFydG51bVtTVFJTWihCRkFfTUZHX1NVUFBMSUVSX1BBUlROVU1fU0laRSldOwotCWNoYXIKLQkJc3VwcGxpZXJfc2VyaWFsbnVtW1NUUlNaKEJGQV9NRkdfU1VQUExJRVJfU0VSSUFMTlVNX1NJWkUpXTsKLQljaGFyCi0JCXN1cHBsaWVyX3JldmlzaW9uW1NUUlNaKEJGQV9NRkdfU1VQUExJRVJfUkVWSVNJT05fU0laRSldOwotCW1hY190CQltZmdfbWFjOwkvKiAgbWFjIGFkZHJlc3MgKi8KLQl1OAkJbnVtX21hYzsJLyogIG51bWJlciBvZiBtYWMgYWRkcmVzc2VzICovCi0JdTgJCXJzdjI7Ci0JdTMyCW1mZ190eXBlOwkvKiAgY2FyZCB0eXBlICovCi0JdTgJCXJzdjNbMTA4XTsKLQl1OAkJbWQ1X2Noa3N1bVtCRkFfTUZHX0NIS1NVTV9TSVpFXTsgLyogIG1kNSBjaGVja3N1bSAqLworCXU4CXZlcnNpb247ICAgIC8qITwgbWFudWZhY3R1cmluZyBibG9jayB2ZXJzaW9uICovCisJdTggICAgIG1mZ19zaWdbM107IC8qITwgY2hhcmFjdGVycyAnTScsICdGJywgJ0cnICovCisJdTE2ICAgIG1mZ3NpemU7ICAgIC8qITwgbWZnIGJsb2NrIHNpemUgKi8KKwl1MTYgICAgdTE2X2Noa3N1bTsgLyohPCBvbGQgdTE2IGNoZWNrc3VtICovCisJY2hhciAgICAgICAgYnJjZF9zZXJpYWxudW1bU1RSU1ooQkZBX01GR19TRVJJQUxOVU1fU0laRSldOworCWNoYXIgICAgICAgIGJyY2RfcGFydG51bVtTVFJTWihCRkFfTUZHX1BBUlROVU1fU0laRSldOworCXU4ICAgICBtZmdfZGF5OyAgICAvKiE8IG1hbnVmYWN0dXJpbmcgZGF5ICovCisJdTggICAgIG1mZ19tb250aDsgIC8qITwgbWFudWZhY3R1cmluZyBtb250aCAqLworCXUxNiAgICBtZmdfeWVhcjsgICAvKiE8IG1hbnVmYWN0dXJpbmcgeWVhciAqLworCXd3bl90ICAgICAgIG1mZ193d247ICAgIC8qITwgd3duIGJhc2UgZm9yIHRoaXMgYWRhcHRlciAqLworCXU4ICAgICBudW1fd3duOyAgICAvKiE8IG51bWJlciBvZiB3d25zIGFzc2lnbmVkICovCisJdTggICAgIG1mZ19zcGVlZHM7IC8qITwgc3BlZWRzIGFsbG93ZWQgZm9yIHRoaXMgYWRhcHRlciAqLworCXU4ICAgICByc3ZbMl07CisJY2hhciAgICBzdXBwbGllcl9pZFtTVFJTWihCRkFfTUZHX1NVUFBMSUVSX0lEX1NJWkUpXTsKKwljaGFyICAgIHN1cHBsaWVyX3BhcnRudW1bU1RSU1ooQkZBX01GR19TVVBQTElFUl9QQVJUTlVNX1NJWkUpXTsKKwljaGFyICAgIHN1cHBsaWVyX3NlcmlhbG51bVtTVFJTWihCRkFfTUZHX1NVUFBMSUVSX1NFUklBTE5VTV9TSVpFKV07CisJY2hhciAgICBzdXBwbGllcl9yZXZpc2lvbltTVFJTWihCRkFfTUZHX1NVUFBMSUVSX1JFVklTSU9OX1NJWkUpXTsKKwltYWNfdCAgICAgICBtZmdfbWFjOyAgICAvKiE8IGJhc2UgbWFjIGFkZHJlc3MgKi8KKwl1OCAgICAgbnVtX21hYzsgICAgLyohPCBudW1iZXIgb2YgbWFjIGFkZHJlc3NlcyAqLworCXU4ICAgICByc3YyOworCXUzMiAgICBjYXJkX3R5cGU7ICAvKiE8IGNhcmQgdHlwZSAgICAgICAgICAqLworCWNoYXIgICAgICAgIGNhcF9uaWM7ICAgIC8qITwgY2FwYWJpbGl0eSBuaWMgICAgICovCisJY2hhciAgICAgICAgY2FwX2NuYTsgICAgLyohPCBjYXBhYmlsaXR5IGNuYSAgICAgKi8KKwljaGFyICAgICAgICBjYXBfaGJhOyAgICAvKiE8IGNhcGFiaWxpdHkgaGJhICAgICAqLworCWNoYXIgICAgICAgIGNhcF9mYzE2ZzsgIC8qITwgY2FwYWJpbGl0eSBmYyAxNmcgICAgICAqLworCWNoYXIgICAgICAgIGNhcF9zcmlvdjsgIC8qITwgY2FwYWJpbGl0eSBzcmlvdiAgICAgICAqLworCWNoYXIgICAgICAgIGNhcF9tZXp6OyAgIC8qITwgY2FwYWJpbGl0eSBtZXp6ICAgICAgICAqLworCXU4ICAgICByc3YzOworCXU4ICAgICBtZmdfbnBvcnRzOyAvKiE8IG51bWJlciBvZiBwb3J0cyAgICAgICAgKi8KKwljaGFyICAgICAgICBtZWRpYVs4XTsgICAvKiE8IHhmaS94YXVpICAgICAgICAgICAqLworCWNoYXIgICAgICAgIGluaXRpYWxfbW9kZVs4XTsgLyohPCBpbml0aWFsIG1vZGU6IGhiYS9jbmEvbmljICovCisJdTggICAgIHJzdjRbODRdOworCXU4ICAgICBtZDVfY2hrc3VtW0JGQV9NRkdfQ0hLU1VNX1NJWkVdOyAvKiE8IG1kNSBjaGVja3N1bSAqLwogfTsKIAogI3ByYWdtYSBwYWNrKCkKQEAgLTM4NiwxNyArNDQ0LDI3IEBACiAJQkZBX1BDSV9ERVZJQ0VfSURfRkNfOEcxUAk9IDB4MTcsCiAJQkZBX1BDSV9ERVZJQ0VfSURfQ1QJCT0gMHgxNCwKIAlCRkFfUENJX0RFVklDRV9JRF9DVF9GQwkJPSAweDIxLAorCUJGQV9QQ0lfREVWSUNFX0lEX0NUMgkJPSAweDIyLAogfTsKIAotI2RlZmluZSBiZmFfYXNpY19pZF9jdChkZXZpZCkJCQlcCi0JKChkZXZpZCkgPT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QgfHwJXAotCSAoZGV2aWQpID09IEJGQV9QQ0lfREVWSUNFX0lEX0NUX0ZDKQorI2RlZmluZSBiZmFfYXNpY19pZF9jYihfX2QpCQkJXAorCSgoX19kKSA9PSBCRkFfUENJX0RFVklDRV9JRF9GQ184RzJQIHx8CVwKKwkgKF9fZCkgPT0gQkZBX1BDSV9ERVZJQ0VfSURfRkNfOEcxUCkKKyNkZWZpbmUgYmZhX2FzaWNfaWRfY3QoX19kKQkJCVwKKwkoKF9fZCkgPT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QgfHwJXAorCSAoX19kKSA9PSBCRkFfUENJX0RFVklDRV9JRF9DVF9GQykKKyNkZWZpbmUgYmZhX2FzaWNfaWRfY3QyKF9fZCkJKChfX2QpID09IEJGQV9QQ0lfREVWSUNFX0lEX0NUMikKKyNkZWZpbmUgYmZhX2FzaWNfaWRfY3RjKF9fZCkJXAorCShiZmFfYXNpY19pZF9jdChfX2QpIHx8IGJmYV9hc2ljX2lkX2N0MihfX2QpKQogCiAvKgogICogUENJIHN1Yi1zeXN0ZW0gZGV2aWNlIGFuZCB2ZW5kb3IgSUQgaW5mb3JtYXRpb24KICAqLwogZW51bSB7CiAJQkZBX1BDSV9GQ09FX1NTREVWSUNFX0lECT0gMHgxNCwKKwlCRkFfUENJX0NUMl9TU0lEX0ZDb0UJCT0gMHgyMiwKKwlCRkFfUENJX0NUMl9TU0lEX0VUSAkJPSAweDIzLAorCUJGQV9QQ0lfQ1QyX1NTSURfRkMJCT0gMHgyNCwKIH07CiAKIC8qCkBAIC00MTYsOSArNDg0LDcgQEAKIAlCRkFfUE9SVF9TUEVFRF84R0JQUwk9IDgsCiAJQkZBX1BPUlRfU1BFRURfMTBHQlBTCT0gMTAsCiAJQkZBX1BPUlRfU1BFRURfMTZHQlBTCT0gMTYsCi0JQkZBX1BPUlRfU1BFRURfQVVUTyA9Ci0JCShCRkFfUE9SVF9TUEVFRF8xR0JQUyB8IEJGQV9QT1JUX1NQRUVEXzJHQlBTIHwKLQkJIEJGQV9QT1JUX1NQRUVEXzRHQlBTIHwgQkZBX1BPUlRfU1BFRURfOEdCUFMpLAorCUJGQV9QT1JUX1NQRUVEX0FVVE8JPSAweGYsCiB9OwogI2RlZmluZSBiZmFfcG9ydF9zcGVlZF90IGVudW0gYmZhX3BvcnRfc3BlZWQKIApAQCAtNDYzLDQgKzUyOSw0NTMgQEAKIAlzdHJ1Y3QgYmZhX2Jvb3RfYm9vdGx1bl9zIHBibHVuW0JGQV9QUkVCT09UX0JPT1RMVU5fTUFYXTsKIH07CiAKKy8qCisgKiBBU0lDIGJsb2NrIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCBzdHJ1Y3R1cmVzCisgKi8KKyNkZWZpbmUgQkZBX0FCTEtfTUFYX1BPUlRTCTIKKyNkZWZpbmUgQkZBX0FCTEtfTUFYX1BGUwkxNgorI2RlZmluZSBCRkFfQUJMS19NQVgJCTIKKworI3ByYWdtYSBwYWNrKDEpCitlbnVtIGJmYV9tb2RlX3MgeworCUJGQV9NT0RFX0hCQQk9IDEsCisJQkZBX01PREVfQ05BCT0gMiwKKwlCRkFfTU9ERV9OSUMJPSAzCit9OworCitzdHJ1Y3QgYmZhX2FkYXB0ZXJfY2ZnX21vZGVfcyB7CisJdTE2CW1heF9wZjsKKwl1MTYJbWF4X3ZmOworCWVudW0gYmZhX21vZGVfcwltb2RlOworfTsKKworc3RydWN0IGJmYV9hYmxrX2NmZ19wZl9zIHsKKwl1MTYJcGVyczsKKwl1OAlwb3J0X2lkOworCXU4CW9wdHJvbTsKKwl1OAl2YWxpZDsKKwl1OAlzcmlvdjsKKwl1OAltYXhfdmZzOworCXU4CXJzdmRbMV07CisJdTE2CW51bV9xcGFpcnM7CisJdTE2CW51bV92ZWN0b3JzOworCXUzMglidzsKK307CisKK3N0cnVjdCBiZmFfYWJsa19jZmdfcG9ydF9zIHsKKwl1OAltb2RlOworCXU4CXR5cGU7CisJdTgJbWF4X3BmczsKKwl1OAlyc3ZkWzVdOworfTsKKworc3RydWN0IGJmYV9hYmxrX2NmZ19pbnN0X3MgeworCXU4CW5wb3J0czsKKwl1OAltYXhfcGZzOworCXU4CXJzdmRbNl07CisJc3RydWN0IGJmYV9hYmxrX2NmZ19wZl9zCXBmX2NmZ1tCRkFfQUJMS19NQVhfUEZTXTsKKwlzdHJ1Y3QgYmZhX2FibGtfY2ZnX3BvcnRfcwlwb3J0X2NmZ1tCRkFfQUJMS19NQVhfUE9SVFNdOworfTsKKworc3RydWN0IGJmYV9hYmxrX2NmZ19zIHsKKwlzdHJ1Y3QgYmZhX2FibGtfY2ZnX2luc3RfcwlpbnN0W0JGQV9BQkxLX01BWF07Cit9OworCisKKy8qCisgKglTRlAgbW9kdWxlIHNwZWNpZmljCisgKi8KKyNkZWZpbmUgU0ZQX0RJQUdNT05fU0laRQkxMCAvKiBudW0gYnl0ZXMgb2YgZGlhZyBtb25pdG9yIGRhdGEgKi8KKworZW51bSBiZmFfZGVmc19zZnBfbWVkaWFfZSB7CisJQkZBX1NGUF9NRURJQV9VTktOT1dOCT0gMHgwMCwKKwlCRkFfU0ZQX01FRElBX0NVCT0gMHgwMSwKKwlCRkFfU0ZQX01FRElBX0xXCT0gMHgwMiwKKwlCRkFfU0ZQX01FRElBX1NXCT0gMHgwMywKKwlCRkFfU0ZQX01FRElBX0VMCT0gMHgwNCwKKwlCRkFfU0ZQX01FRElBX1VOU1VQUE9SVAk9IDB4MDUsCit9OworCisvKgorICogdmFsdWVzIGZvciB4bXRyX3RlY2ggYWJvdmUKKyAqLworZW51bSB7CisJU0ZQX1hNVFJfVEVDSF9DVSA9ICgxIDw8IDApLAkvKiBjb3BwZXIgRkMtQmFzZVQgKi8KKwlTRlBfWE1UUl9URUNIX0NQID0gKDEgPDwgMSksCS8qIGNvcHBlciBwYXNzaXZlICovCisJU0ZQX1hNVFJfVEVDSF9DQSA9ICgxIDw8IDIpLAkvKiBjb3BwZXIgYWN0aXZlICovCisJU0ZQX1hNVFJfVEVDSF9MTCA9ICgxIDw8IDMpLAkvKiBsb25nd2F2ZSBsYXNlciAqLworCVNGUF9YTVRSX1RFQ0hfU0wgPSAoMSA8PCA0KSwJLyogc2hvcnR3YXZlIGxhc2VyIHcvIE9GQyAqLworCVNGUF9YTVRSX1RFQ0hfU04gPSAoMSA8PCA1KSwJLyogc2hvcnR3YXZlIGxhc2VyIHcvbyBPRkMgKi8KKwlTRlBfWE1UUl9URUNIX0VMX0lOVFJBID0gKDEgPDwgNiksIC8qIGVsZWMgaW50cmEtZW5jbG9zdXJlICovCisJU0ZQX1hNVFJfVEVDSF9FTF9JTlRFUiA9ICgxIDw8IDcpLCAvKiBlbGVjIGludGVyLWVuY2xvc3VyZSAqLworCVNGUF9YTVRSX1RFQ0hfTEMgPSAoMSA8PCA4KSwJLyogbG9uZ3dhdmUgbGFzZXIgKi8KKwlTRlBfWE1UUl9URUNIX1NBID0gKDEgPDwgOSkKK307CisKKy8qCisgKiBTZXJpYWwgSUQ6IERhdGEgRmllbGRzIC0tIEFkZHJlc3MgQTBoCisgKiBCYXNpYyBJRCBmaWVsZCB0b3RhbCA2NCBieXRlcworICovCitzdHJ1Y3Qgc2ZwX3NybGlkX2Jhc2VfcyB7CisJdTgJaWQ7CQkvKiAwMDogSWRlbnRpZmllciAqLworCXU4CWV4dGlkOwkJLyogMDE6IEV4dGVuZGVkIElkZW50aWZpZXIgKi8KKwl1OAljb25uZWN0b3I7CS8qIDAyOiBDb25uZWN0b3IgKi8KKwl1OAl4Y3ZyWzhdOwkvKiAwMy0xMDogVHJhbnNjZWl2ZXIgKi8KKwl1OAllbmNvZGluZzsJLyogMTE6IEVuY29kaW5nICovCisJdTgJYnJfbm9ybTsJLyogMTI6IEJSLCBOb21pbmFsICovCisJdTgJcmF0ZV9pZDsJLyogMTM6IFJhdGUgSWRlbnRpZmllciAqLworCXU4CWxlbl9rbTsJCS8qIDE0OiBMZW5ndGggc2luZ2xlIG1vZGUga20gKi8KKwl1OAlsZW5fMTAwbTsJLyogMTU6IExlbmd0aCBzaW5nbGUgbW9kZSAxMDBtICovCisJdTgJbGVuX29tMjsJLyogMTY6IExlbmd0aCBvbTIgZmliZXIgMTBtICovCisJdTgJbGVuX29tMTsJLyogMTc6IExlbmd0aCBvbTEgZmliZXIgMTBtICovCisJdTgJbGVuX2N1OwkJLyogMTg6IExlbmd0aCBjb3BwZXIgMW0gKi8KKwl1OAlsZW5fb20zOwkvKiAxOTogTGVuZ3RoIG9tMyBmaWJlciAxMG0gKi8KKwl1OAl2ZW5kb3JfbmFtZVsxNl07LyogMjAtMzUgKi8KKwl1OAl1bmFsbG9jMTsKKwl1OAl2ZW5kb3Jfb3VpWzNdOwkvKiAzNy0zOSAqLworCXU4CXZlbmRvcl9wblsxNl07CS8qIDQwLTU1ICovCisJdTgJdmVuZG9yX3Jldls0XTsJLyogNTYtNTkgKi8KKwl1OAl3YXZlbGVuWzJdOwkvKiA2MC02MSAqLworCXU4CXVuYWxsb2MyOworCXU4CWNjX2Jhc2U7CS8qIDYzOiBjaGVjayBjb2RlIGZvciBiYXNlIGlkIGZpZWxkICovCit9OworCisvKgorICogU2VyaWFsIElEOiBEYXRhIEZpZWxkcyAtLSBBZGRyZXNzIEEwaAorICogRXh0ZW5kZWQgaWQgZmllbGQgdG90YWwgMzIgYnl0ZXMKKyAqLworc3RydWN0IHNmcF9zcmxpZF9leHRfcyB7CisJdTgJb3B0aW9uc1syXTsKKwl1OAlicl9tYXg7CisJdTgJYnJfbWluOworCXU4CXZlbmRvcl9zblsxNl07CisJdTgJZGF0ZV9jb2RlWzhdOworCXU4CWRpYWdfbW9uX3R5cGU7ICAvKiA5MjogRGlhZ25vc3RpYyBNb25pdG9yaW5nIHR5cGUgKi8KKwl1OAllbl9vcHRpb25zOworCXU4CXNmZl84NDcyOworCXU4CWNjX2V4dDsKK307CisKKy8qCisgKiBEaWFnbm9zdGljOiBEYXRhIEZpZWxkcyAtLSBBZGRyZXNzIEEyaAorICogRGlhZ25vc3RpYyBhbmQgY29udHJvbC9zdGF0dXMgYmFzZSBmaWVsZCB0b3RhbCA5NiBieXRlcworICovCitzdHJ1Y3Qgc2ZwX2RpYWdfYmFzZV9zIHsKKwkvKgorCSAqIEFsYXJtIGFuZCB3YXJuaW5nIFRocmVzaG9sZHMgNDAgYnl0ZXMKKwkgKi8KKwl1OAl0ZW1wX2hpZ2hfYWxhcm1bMl07IC8qIDAwLTAxICovCisJdTgJdGVtcF9sb3dfYWxhcm1bMl07ICAvKiAwMi0wMyAqLworCXU4CXRlbXBfaGlnaF93YXJuaW5nWzJdOyAgIC8qIDA0LTA1ICovCisJdTgJdGVtcF9sb3dfd2FybmluZ1syXTsgICAgLyogMDYtMDcgKi8KKworCXU4CXZvbHRfaGlnaF9hbGFybVsyXTsgLyogMDgtMDkgKi8KKwl1OAl2b2x0X2xvd19hbGFybVsyXTsgIC8qIDEwLTExICovCisJdTgJdm9sdF9oaWdoX3dhcm5pbmdbMl07ICAgLyogMTItMTMgKi8KKwl1OAl2b2x0X2xvd193YXJuaW5nWzJdOyAgICAvKiAxNC0xNSAqLworCisJdTgJYmlhc19oaWdoX2FsYXJtWzJdOyAvKiAxNi0xNyAqLworCXU4CWJpYXNfbG93X2FsYXJtWzJdOyAgLyogMTgtMTkgKi8KKwl1OAliaWFzX2hpZ2hfd2FybmluZ1syXTsgICAvKiAyMC0yMSAqLworCXU4CWJpYXNfbG93X3dhcm5pbmdbMl07ICAgIC8qIDIyLTIzICovCisKKwl1OAl0eF9wd3JfaGlnaF9hbGFybVsyXTsgICAvKiAyNC0yNSAqLworCXU4CXR4X3B3cl9sb3dfYWxhcm1bMl07ICAgIC8qIDI2LTI3ICovCisJdTgJdHhfcHdyX2hpZ2hfd2FybmluZ1syXTsgLyogMjgtMjkgKi8KKwl1OAl0eF9wd3JfbG93X3dhcm5pbmdbMl07ICAvKiAzMC0zMSAqLworCisJdTgJcnhfcHdyX2hpZ2hfYWxhcm1bMl07ICAgLyogMzItMzMgKi8KKwl1OAlyeF9wd3JfbG93X2FsYXJtWzJdOyAgICAvKiAzNC0zNSAqLworCXU4CXJ4X3B3cl9oaWdoX3dhcm5pbmdbMl07IC8qIDM2LTM3ICovCisJdTgJcnhfcHdyX2xvd193YXJuaW5nWzJdOyAgLyogMzgtMzkgKi8KKworCXU4CXVuYWxsb2NhdGVfMVsxNl07CisKKwkvKgorCSAqIGV4dF9jYWxfY29uc3RbMzZdCisJICovCisJdTgJcnhfcHdyWzIwXTsKKwl1OAl0eF9pWzRdOworCXU4CXR4X3B3cls0XTsKKwl1OAl0ZW1wWzRdOworCXU4CXZvbHRbNF07CisJdTgJdW5hbGxvY2F0ZV8yWzNdOworCXU4CWNjX2RtaTsKK307CisKKy8qCisgKiBEaWFnbm9zdGljOiBEYXRhIEZpZWxkcyAtLSBBZGRyZXNzIEEyaAorICogRGlhZ25vc3RpYyBhbmQgY29udHJvbC9zdGF0dXMgZXh0ZW5kZWQgZmllbGQgdG90YWwgMjQgYnl0ZXMKKyAqLworc3RydWN0IHNmcF9kaWFnX2V4dF9zIHsKKwl1OAlkaWFnW1NGUF9ESUFHTU9OX1NJWkVdOworCXU4CXVuYWxsb2MxWzRdOworCXU4CXN0YXR1c19jdGw7CisJdTgJcnN2ZDsKKwl1OAlhbGFybV9mbGFnc1syXTsKKwl1OAl1bmFsbG9jMlsyXTsKKwl1OAl3YXJuaW5nX2ZsYWdzWzJdOworCXU4CWV4dF9zdGF0dXNfY3RsWzJdOworfTsKKworc3RydWN0IHNmcF9tZW1fcyB7CisJc3RydWN0IHNmcF9zcmxpZF9iYXNlX3MJc3JsaWRfYmFzZTsKKwlzdHJ1Y3Qgc2ZwX3NybGlkX2V4dF9zCXNybGlkX2V4dDsKKwlzdHJ1Y3Qgc2ZwX2RpYWdfYmFzZV9zCWRpYWdfYmFzZTsKKwlzdHJ1Y3Qgc2ZwX2RpYWdfZXh0X3MJZGlhZ19leHQ7Cit9OworCisvKgorICogdHJhbnNjZWl2ZXIgY29kZXMgKFNGRi04NDcyIFJldiAxMC4yIFRhYmxlIDMuNSkKKyAqLwordW5pb24gc2ZwX3hjdnJfZTEwZ19jb2RlX3UgeworCXU4CQliOworCXN0cnVjdCB7CisjaWZkZWYgX19CSUdFTkRJQU4KKwkJdTgJZTEwZ191bmFsbDoxOyAgIC8qIDEwRyBFdGhlcm5ldCBjb21wbGlhbmNlICovCisJCXU4CWUxMGdfbHJtOjE7CisJCXU4CWUxMGdfbHI6MTsKKwkJdTgJZTEwZ19zcjoxOworCQl1OAlpYl9zeDoxOyAgICAvKiBJbmZpbmliYW5kIGNvbXBsaWFuY2UgKi8KKwkJdTgJaWJfbHg6MTsKKwkJdTgJaWJfY3VfYToxOworCQl1OAlpYl9jdV9wOjE7CisjZWxzZQorCQl1OAlpYl9jdV9wOjE7CisJCXU4CWliX2N1X2E6MTsKKwkJdTgJaWJfbHg6MTsKKwkJdTgJaWJfc3g6MTsgICAgLyogSW5maW5pYmFuZCBjb21wbGlhbmNlICovCisJCXU4CWUxMGdfc3I6MTsKKwkJdTgJZTEwZ19scjoxOworCQl1OAllMTBnX2xybToxOworCQl1OAllMTBnX3VuYWxsOjE7ICAgLyogMTBHIEV0aGVybmV0IGNvbXBsaWFuY2UgKi8KKyNlbmRpZgorCX0gcjsKK307CisKK3VuaW9uIHNmcF94Y3ZyX3NvMV9jb2RlX3UgeworCXU4CQliOworCXN0cnVjdCB7CisJCXU4CWVzY29uOjI7ICAgIC8qIEVTQ09OIGNvbXBsaWFuY2UgY29kZSAqLworCQl1OAlvYzE5Ml9yZWFjaDoxOyAgLyogU09ORVQgY29tcGxpYW5jZSBjb2RlICovCisJCXU4CXNvX3JlYWNoOjI7CisJCXU4CW9jNDhfcmVhY2g6MzsKKwl9IHI7Cit9OworCit1bmlvbiBzZnBfeGN2cl9zbzJfY29kZV91IHsKKwl1OAkJYjsKKwlzdHJ1Y3QgeworCQl1OAlyZXNlcnZlZDoxOworCQl1OAlvYzEyX3JlYWNoOjM7ICAgLyogT0MxMiByZWFjaCAqLworCQl1OAlyZXNlcnZlZDE6MTsKKwkJdTgJb2MzX3JlYWNoOjM7ICAgIC8qIE9DMyByZWFjaCAqLworCX0gcjsKK307CisKK3VuaW9uIHNmcF94Y3ZyX2V0aF9jb2RlX3UgeworCXU4CQliOworCXN0cnVjdCB7CisJCXU4CWJhc2VfcHg6MTsKKwkJdTgJYmFzZV9ieDEwOjE7CisJCXU4CWUxMDBiYXNlX2Z4OjE7CisJCXU4CWUxMDBiYXNlX2x4OjE7CisJCXU4CWUxMDAwYmFzZV90OjE7CisJCXU4CWUxMDAwYmFzZV9jeDoxOworCQl1OAllMTAwMGJhc2VfbHg6MTsKKwkJdTgJZTEwMDBiYXNlX3N4OjE7CisJfSByOworfTsKKworc3RydWN0IHNmcF94Y3ZyX2ZjMV9jb2RlX3MgeworCXU4CWxpbmtfbGVuOjU7IC8qIEZDIGxpbmsgbGVuZ3RoICovCisJdTgJeG10cl90ZWNoMjozOworCXU4CXhtdHJfdGVjaDE6NzsgICAvKiBGQyB0cmFuc21pdHRlciB0ZWNobm9sb2d5ICovCisJdTgJcmVzZXJ2ZWQxOjE7Cit9OworCit1bmlvbiBzZnBfeGN2cl9mYzJfY29kZV91IHsKKwl1OAkJYjsKKwlzdHJ1Y3QgeworCQl1OAl0d19tZWRpYToxOyAvKiB0d2luIGF4aWFsIHBhaXIgKHR3KSAqLworCQl1OAl0cF9tZWRpYToxOyAvKiBzaGllbGRlZCB0d2lzdGVkIHBhaXIgKHNwKSAqLworCQl1OAltaV9tZWRpYToxOyAvKiBtaW5pYXR1cmUgY29heCAobWkpICovCisJCXU4CXR2X21lZGlhOjE7IC8qIHZpZGVvIGNvYXggKHR2KSAqLworCQl1OAltNl9tZWRpYToxOyAvKiBtdWx0aW1vZGUsIDYyLjVtIChtNikgKi8KKwkJdTgJbTVfbWVkaWE6MTsgLyogbXVsdGltb2RlLCA1MG0gKG01KSAqLworCQl1OAlyZXNlcnZlZDoxOworCQl1OAlzbV9tZWRpYToxOyAvKiBzaW5nbGUgbW9kZSAoc20pICovCisJfSByOworfTsKKwordW5pb24gc2ZwX3hjdnJfZmMzX2NvZGVfdSB7CisJdTgJCWI7CisJc3RydWN0IHsKKyNpZmRlZiBfX0JJR0VORElBTgorCQl1OAlyc3Y0OjE7CisJCXU4CW1iODAwOjE7ICAgIC8qIDgwMCBNYnl0ZXMvc2VjICovCisJCXU4CW1iMTYwMDoxOyAgIC8qIDE2MDAgTWJ5dGVzL3NlYyAqLworCQl1OAltYjQwMDoxOyAgICAvKiA0MDAgTWJ5dGVzL3NlYyAqLworCQl1OAlyc3YyOjE7CisJCXU4CW1iMjAwOjE7ICAgIC8qIDIwMCBNYnl0ZXMvc2VjICovCisJCXU4CXJzdjE6MTsKKwkJdTgJbWIxMDA6MTsgICAgLyogMTAwIE1ieXRlcy9zZWMgKi8KKyNlbHNlCisJCXU4CW1iMTAwOjE7ICAgIC8qIDEwMCBNYnl0ZXMvc2VjICovCisJCXU4CXJzdjE6MTsKKwkJdTgJbWIyMDA6MTsgICAgLyogMjAwIE1ieXRlcy9zZWMgKi8KKwkJdTgJcnN2MjoxOworCQl1OAltYjQwMDoxOyAgICAvKiA0MDAgTWJ5dGVzL3NlYyAqLworCQl1OAltYjE2MDA6MTsgICAvKiAxNjAwIE1ieXRlcy9zZWMgKi8KKwkJdTgJbWI4MDA6MTsgICAgLyogODAwIE1ieXRlcy9zZWMgKi8KKwkJdTgJcnN2NDoxOworI2VuZGlmCisJfSByOworfTsKKworc3RydWN0IHNmcF94Y3ZyX3MgeworCXVuaW9uIHNmcF94Y3ZyX2UxMGdfY29kZV91CWUxMGc7CisJdW5pb24gc2ZwX3hjdnJfc28xX2NvZGVfdQlzbzE7CisJdW5pb24gc2ZwX3hjdnJfc28yX2NvZGVfdQlzbzI7CisJdW5pb24gc2ZwX3hjdnJfZXRoX2NvZGVfdQlldGg7CisJc3RydWN0IHNmcF94Y3ZyX2ZjMV9jb2RlX3MJZmMxOworCXVuaW9uIHNmcF94Y3ZyX2ZjMl9jb2RlX3UJZmMyOworCXVuaW9uIHNmcF94Y3ZyX2ZjM19jb2RlX3UJZmMzOworfTsKKworLyoKKyAqCUZsYXNoIG1vZHVsZSBzcGVjaWZpYworICovCisjZGVmaW5lIEJGQV9GTEFTSF9QQVJUX0VOVFJZX1NJWkUJMzIJLyogcGFydGl0aW9uIGVudHJ5IHNpemUgKi8KKyNkZWZpbmUgQkZBX0ZMQVNIX1BBUlRfTUFYCQkzMgkvKiBtYXhpbWFsICMgb2YgcGFydGl0aW9ucyAqLworCitlbnVtIGJmYV9mbGFzaF9wYXJ0X3R5cGUgeworCUJGQV9GTEFTSF9QQVJUX09QVFJPTSAgID0gMSwgICAgLyogb3B0aW9uIHJvbSBwYXJ0aXRpb24gKi8KKwlCRkFfRkxBU0hfUEFSVF9GV0lNRyAgICA9IDIsICAgIC8qIGZpcm13YXJlIGltYWdlIHBhcnRpdGlvbiAqLworCUJGQV9GTEFTSF9QQVJUX0ZXQ0ZHICAgID0gMywgICAgLyogZmlybXdhcmUgdHVuZWFibGUgY29uZmlnICovCisJQkZBX0ZMQVNIX1BBUlRfRFJWICAgICAgPSA0LCAgICAvKiBJT0MgZHJpdmVyIGNvbmZpZyAqLworCUJGQV9GTEFTSF9QQVJUX0JPT1QgICAgID0gNSwgICAgLyogYm9vdCBjb25maWcgKi8KKwlCRkFfRkxBU0hfUEFSVF9BU0lDICAgICA9IDYsICAgIC8qIGFzaWMgYm9vdHN0cmFwIGNvbmZpZ3VyYXRpb24gKi8KKwlCRkFfRkxBU0hfUEFSVF9NRkcgICAgICA9IDcsICAgIC8qIG1hbnVmYWN0dXJpbmcgYmxvY2sgcGFydGl0aW9uICovCisJQkZBX0ZMQVNIX1BBUlRfT1BUUk9NMiAgPSA4LCAgICAvKiAybmQgb3B0aW9uIHJvbSBwYXJ0aXRpb24gKi8KKwlCRkFfRkxBU0hfUEFSVF9WUEQgICAgICA9IDksICAgIC8qIHZwZCBkYXRhIG9mIE9FTSBpbmZvICovCisJQkZBX0ZMQVNIX1BBUlRfUEJDICAgICAgPSAxMCwgICAvKiBwcmUtYm9vdCBjb25maWcgKi8KKwlCRkFfRkxBU0hfUEFSVF9CT09UT1ZMICA9IDExLCAgIC8qIGJvb3Qgb3ZlcmxheSBwYXJ0aXRpb24gKi8KKwlCRkFfRkxBU0hfUEFSVF9MT0cgICAgICA9IDEyLCAgIC8qIGZpcm13YXJlIGxvZyBwYXJ0aXRpb24gKi8KKwlCRkFfRkxBU0hfUEFSVF9QWEVDRkcgICA9IDEzLCAgIC8qIHB4ZSBib290IGNvbmZpZyBwYXJ0aXRpb24gKi8KKwlCRkFfRkxBU0hfUEFSVF9QWEVPVkwgICA9IDE0LCAgIC8qIHB4ZSBib290IG92ZXJsYXkgcGFydGl0aW9uICovCisJQkZBX0ZMQVNIX1BBUlRfUE9SVENGRyAgPSAxNSwgICAvKiBwb3J0IGNmZyBwYXJ0aXRpb24gKi8KKwlCRkFfRkxBU0hfUEFSVF9BU0lDQksgICA9IDE2LCAgIC8qIGFzaWMgYmFja3VwIHBhcnRpdGlvbiAqLworfTsKKworLyoKKyAqIGZsYXNoIHBhcnRpdGlvbiBhdHRyaWJ1dGVzCisgKi8KK3N0cnVjdCBiZmFfZmxhc2hfcGFydF9hdHRyX3MgeworCXUzMglwYXJ0X3R5cGU7ICAgICAgLyogcGFydGl0aW9uIHR5cGUgKi8KKwl1MzIJcGFydF9pbnN0YW5jZTsgIC8qIHBhcnRpdGlvbiBpbnN0YW5jZSAqLworCXUzMglwYXJ0X29mZjsgICAgICAgLyogcGFydGl0aW9uIG9mZnNldCAqLworCXUzMglwYXJ0X3NpemU7ICAgICAgLyogcGFydGl0aW9uIHNpemUgKi8KKwl1MzIJcGFydF9sZW47ICAgICAgIC8qIHBhcnRpdGlvbiBjb250ZW50IGxlbmd0aCAqLworCXUzMglwYXJ0X3N0YXR1czsgICAgLyogcGFydGl0aW9uIHN0YXR1cyAqLworCWNoYXIJcnN2W0JGQV9GTEFTSF9QQVJUX0VOVFJZX1NJWkUgLSAyNF07Cit9OworCisvKgorICogZmxhc2ggYXR0cmlidXRlcworICovCitzdHJ1Y3QgYmZhX2ZsYXNoX2F0dHJfcyB7CisJdTMyCXN0YXR1czsgLyogZmxhc2ggb3ZlcmFsbCBzdGF0dXMgKi8KKwl1MzIJbnBhcnQ7ICAvKiBudW0gb2YgcGFydGl0aW9ucyAqLworCXN0cnVjdCBiZmFfZmxhc2hfcGFydF9hdHRyX3MgcGFydFtCRkFfRkxBU0hfUEFSVF9NQVhdOworfTsKKworLyoKKyAqCURJQUcgbW9kdWxlIHNwZWNpZmljCisgKi8KKyNkZWZpbmUgTEJfUEFUVEVSTl9ERUZBVUxUCTB4QjVCNUI1QjUKKyNkZWZpbmUgUVRFU1RfQ05UX0RFRkFVTFQJMTAKKyNkZWZpbmUgUVRFU1RfUEFUX0RFRkFVTFQJTEJfUEFUVEVSTl9ERUZBVUxUCisKK3N0cnVjdCBiZmFfZGlhZ19tZW10ZXN0X3MgeworCXU4CWFsZ287CisJdTgJcnN2ZFs3XTsKK307CisKK3N0cnVjdCBiZmFfZGlhZ19tZW10ZXN0X3Jlc3VsdCB7CisJdTMyCXN0YXR1czsKKwl1MzIJYWRkcjsKKwl1MzIJZXhwOyAvKiBleHBlY3QgdmFsdWUgcmVhZCBmcm9tIHJlZyAqLworCXUzMglhY3Q7IC8qIGFjdHVhbGx5IHZhbHVlIHJlYWQgKi8KKwl1MzIJZXJyX3N0YXR1czsgICAgICAgICAgICAgLyogZXJyb3Igc3RhdHVzIHJlZyAqLworCXUzMgllcnJfc3RhdHVzMTsgICAgLyogZXh0cmEgZXJyb3IgaW5mbyByZWcgKi8KKwl1MzIJZXJyX2FkZHI7IC8qIGVycm9yIGFkZHJlc3MgcmVnICovCisJdTgJYWxnbzsKKwl1OAlyc3ZbM107Cit9OworCitzdHJ1Y3QgYmZhX2RpYWdfbG9vcGJhY2tfcmVzdWx0X3MgeworCXUzMgludW10eG1mcm07ICAgICAgLyogbm8uIG9mIHRyYW5zbWl0IGZyYW1lICovCisJdTMyCW51bW9zZmZybTsgICAgICAvKiBuby4gb2Ygb3V0c3RhbmRpbmcgZnJhbWUgKi8KKwl1MzIJbnVtcmN2ZnJtOyAgICAgIC8qIG5vLiBvZiByZWNlaXZlZCBnb29kIGZyYW1lICovCisJdTMyCWJhZGZybWluZjsgICAgICAvKiBtaXMtbWF0Y2ggaW5mbyAqLworCXUzMgliYWRmcm1udW07ICAgICAgLyogbWlzLW1hdGNoIGZyYW0gbnVtYmVyICovCisJdTgJc3RhdHVzOyAgICAgICAgIC8qIGxvb3BiYWNrIHRlc3QgcmVzdWx0ICovCisJdTgJcnN2ZFszXTsKK307CisKK3N0cnVjdCBiZmFfZGlhZ19sZWR0ZXN0X3MgeworCXUzMgljbWQ7ICAgIC8qIGJmYV9sZWRfb3BfdCAqLworCXUzMgljb2xvcjsgIC8qIGJmYV9sZWRfY29sb3JfdCAqLworCXUxNglmcmVxOyAgIC8qIG5vLiBvZiBibGlua3MgZXZlcnkgMTAgc2VjcyAqLworCXU4CWxlZDsgICAgLyogYml0bWFwIG9mIExFRHMgdG8gYmUgdGVzdGVkICovCisJdTgJcnN2ZFs1XTsKK307CisKK3N0cnVjdCBiZmFfZGlhZ19sb29wYmFja19zIHsKKwl1MzIJbG9vcGNudDsKKwl1MzIJcGF0dGVybjsKKwl1OAlsYl9tb2RlOyAgICAvKiBiZmFfcG9ydF9vcG1vZGVfdCAqLworCXU4CXNwZWVkOyAgICAgIC8qIGJmYV9wb3J0X3NwZWVkX3QgKi8KKwl1OAlyc3ZkWzJdOworfTsKKworLyoKKyAqCVBIWSBtb2R1bGUgc3BlY2lmaWMKKyAqLworZW51bSBiZmFfcGh5X3N0YXR1c19lIHsKKwlCRkFfUEhZX1NUQVRVU19HT09ECT0gMCwgLyogcGh5IGlzIGdvb2QgKi8KKwlCRkFfUEhZX1NUQVRVU19OT1RfUFJFU0VOVAk9IDEsIC8qIHBoeSBkb2VzIG5vdCBleGlzdCAqLworCUJGQV9QSFlfU1RBVFVTX0JBRAk9IDIsIC8qIHBoeSBpcyBiYWQgKi8KK307CisKKy8qCisgKiBwaHkgYXR0cmlidXRlcyBmb3IgcGh5IHF1ZXJ5CisgKi8KK3N0cnVjdCBiZmFfcGh5X2F0dHJfcyB7CisJdTMyCXN0YXR1czsgICAgICAgICAvKiBwaHkgcHJlc2VudC9hYnNlbnQgc3RhdHVzICovCisJdTMyCWxlbmd0aDsgICAgICAgICAvKiBmaXJtd2FyZSBsZW5ndGggKi8KKwl1MzIJZndfdmVyOyAgICAgICAgIC8qIGZpcm13YXJlIHZlcnNpb24gKi8KKwl1MzIJYW5fc3RhdHVzOyAgICAgIC8qIEFOIHN0YXR1cyAqLworCXUzMglwbWFfcG1kX3N0YXR1czsgLyogUE1BL1BNRCBsaW5rIHN0YXR1cyAqLworCXUzMglwbWFfcG1kX3NpZ25hbDsgLyogUE1BL1BNRCBzaWduYWwgZGV0ZWN0ICovCisJdTMyCXBjc19zdGF0dXM7ICAgICAvKiBQQ1MgbGluayBzdGF0dXMgKi8KK307CisKKy8qCisgKiBwaHkgc3RhdHMKKyAqLworc3RydWN0IGJmYV9waHlfc3RhdHNfcyB7CisJdTMyCXN0YXR1czsgICAgICAgICAvKiBwaHkgc3RhdHMgc3RhdHVzICovCisJdTMyCWxpbmtfYnJlYWtzOyAgICAvKiBOdW0gb2YgbGluayBicmVha3MgYWZ0ZXIgbGlua3VwICovCisJdTMyCXBtYV9wbWRfZmF1bHQ7ICAvKiBOUE1BL1BNRCBmYXVsdCAqLworCXUzMglwY3NfZmF1bHQ7ICAgICAgLyogUENTIGZhdWx0ICovCisJdTMyCXNwZWVkX25lZzsgICAgICAvKiBOdW0gb2Ygc3BlZWQgbmVnb3RpYXRpb24gKi8KKwl1MzIJdHhfZXFfdHJhaW5pbmc7IC8qIE51bSBvZiBUWCBFUSB0cmFpbmluZyAqLworCXUzMgl0eF9lcV90aW1lb3V0OyAgLyogTnVtIG9mIFRYIEVRIHRpbWVvdXQgKi8KKwl1MzIJY3JjX2Vycm9yOyAgICAgIC8qIE51bSBvZiBDUkMgZXJyb3JzICovCit9OworCisjcHJhZ21hIHBhY2soKQorCiAjZW5kaWYgLyogX19CRkFfREVGU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnNfZmNzLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9kZWZzX2Zjcy5oCmluZGV4IDE5MWQzNGEuLjNiYmM1ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnNfZmNzLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmc19mY3MuaApAQCAtOTAsMTIgKzkwLDE0IEBACiAgKiBGQ1MgcG9ydCBjb25maWd1cmF0aW9uLgogICovCiBzdHJ1Y3QgYmZhX2xwb3J0X2NmZ19zIHsKLSAgICB3d25fdAkgICAgICAgcHd3bjsgICAgICAgLyogIHBvcnQgd3duICovCi0gICAgd3duX3QJICAgICAgIG53d247ICAgICAgIC8qICBub2RlIHd3biAqLwotICAgIHN0cnVjdCBiZmFfbHBvcnRfc3ltbmFtZV9zICBzeW1fbmFtZTsgICAvKiAgdm0gcG9ydCBzeW1ib2xpYyBuYW1lICovCi0gICAgYmZhX2Jvb2xlYW5fdCAgICAgICBwcmVib290X3ZwOyAgLyogIHZwb3J0IGNyZWF0ZWQgZnJvbSBQQkMgKi8KLSAgICBlbnVtIGJmYV9scG9ydF9yb2xlICAgICByb2xlczsgICAgICAvKiAgRkNTIHBvcnQgcm9sZXMgKi8KLSAgICB1OAkgICAgIHRhZ1sxNl07CS8qICBvcGFxdWUgdGFnIGZyb20gYXBwbGljYXRpb24gKi8KKwl3d25fdAkgICAgICAgcHd3bjsgICAgICAgLyogIHBvcnQgd3duICovCisJd3duX3QJICAgICAgIG53d247ICAgICAgIC8qICBub2RlIHd3biAqLworCXN0cnVjdCBiZmFfbHBvcnRfc3ltbmFtZV9zICBzeW1fbmFtZTsgICAvKiAgdm0gcG9ydCBzeW1ib2xpYyBuYW1lICovCisJZW51bSBiZmFfbHBvcnRfcm9sZSByb2xlczsgICAgICAvKiBGQ1MgcG9ydCByb2xlcyAqLworCXUzMiAgICAgcnN2ZDsKKwliZmFfYm9vbGVhbl90ICAgcHJlYm9vdF92cDsgIC8qICB2cG9ydCBjcmVhdGVkIGZyb20gUEJDICovCisJdTgJdGFnWzE2XTsgICAgICAgIC8qIG9wYXF1ZSB0YWcgZnJvbSBhcHBsaWNhdGlvbiAqLworCXU4CXBhZGRpbmdbNF07CiB9OwogCiAvKgpAQCAtMjQ5LDEyICsyNTEsMTMgQEAKIAlCRkFfRkNTX1ZQT1JUX0ZESVNDX1NFTkQJPSAyLAogCUJGQV9GQ1NfVlBPUlRfRkRJU0MJCT0gMywKIAlCRkFfRkNTX1ZQT1JUX0ZESVNDX1JFVFJZCT0gNCwKLQlCRkFfRkNTX1ZQT1JUX09OTElORQkJPSA1LAotCUJGQV9GQ1NfVlBPUlRfREVMRVRJTkcJCT0gNiwKLQlCRkFfRkNTX1ZQT1JUX0NMRUFOVVAJCT0gNiwKLQlCRkFfRkNTX1ZQT1JUX0xPR09fU0VORAkJPSA3LAotCUJGQV9GQ1NfVlBPUlRfTE9HTwkJPSA4LAotCUJGQV9GQ1NfVlBPUlRfRVJST1IJCT0gOSwKKwlCRkFfRkNTX1ZQT1JUX0ZESVNDX1JTUF9XQUlUCT0gNSwKKwlCRkFfRkNTX1ZQT1JUX09OTElORQkJPSA2LAorCUJGQV9GQ1NfVlBPUlRfREVMRVRJTkcJCT0gNywKKwlCRkFfRkNTX1ZQT1JUX0NMRUFOVVAJCT0gOCwKKwlCRkFfRkNTX1ZQT1JUX0xPR09fU0VORAkJPSA5LAorCUJGQV9GQ1NfVlBPUlRfTE9HTwkJPSAxMCwKKwlCRkFfRkNTX1ZQT1JUX0VSUk9SCQk9IDExLAogCUJGQV9GQ1NfVlBPUlRfTUFYX1NUQVRFLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmc19zdmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnNfc3ZjLmgKaW5kZXggMjA3ZjU5OC4uMGI5NzUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmc19zdmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9kZWZzX3N2Yy5oCkBAIC00NywxMyArNDcsMTIgQEAKIAl1MTYgICAgICAgIG51bV9ycG9ydHM7CS8qICBudW1iZXIgb2YgcmVtb3RlIHBvcnRzCSovCiAJdTE2ICAgICAgICBudW1faW9pbV9yZXFzOwkvKiAgbnVtYmVyIG9mIElPIHJlcXMJCSovCiAJdTE2ICAgICAgICBudW1fdHNraW1fcmVxczsJLyogIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0cwkqLwotCXUxNiAgICAgICAgbnVtX2lvdG1fcmVxczsJLyogIG51bWJlciBvZiBUTSBJTyByZXFzCSovCi0JdTE2ICAgICAgICBudW1fdHNrdG1fcmVxczsJLyogIFRNIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0cyovCisJdTE2CSAgIG51bV9md3Rpb19yZXFzOwkvKiBudW1iZXIgb2YgVE0gSU8gcmVxcyBpbiBGVyAqLwogCXUxNiAgICAgICAgbnVtX2ZjeHBfcmVxczsJLyogIHVuYXNzaXN0ZWQgRkMgZXhjaGFuZ2VzCSovCiAJdTE2ICAgICAgICBudW1fdWZfYnVmczsJLyogIHVuc29saWNpdGVkIHJlY3YgYnVmZmVycwkqLwogCXU4CQludW1fY3FzOwogCXU4CQlmd190aWNrX3JlczsJLyogIEZXIGNsb2NrIHJlc29sdXRpb24gaW4gbXMgKi8KLQl1OAkJcnN2ZFs0XTsKKwl1OAkJcnN2ZFsyXTsKIH07CiAjcHJhZ21hIHBhY2soKQogCkBAIC02Niw4ICs2NSwxMiBAQAogCXUxNgkgICAgaW9jX3JlY292ZXI7CS8qICBJT0MgcmVjb3ZlcnkgbW9kZQkJICAqLwogCXUxNgkgICAgbWluX2NmZzsJLyogIG1pbmltdW0gY29uZmlndXJhdGlvbgkgICovCiAJdTE2ICAgICAgICBwYXRoX3RvdjsJLyogIGRldmljZSBwYXRoIHRpbWVvdXQJICAqLworCXUxNgkJbnVtX3Rpb19yZXFzOyAgIC8qITwgbnVtYmVyIG9mIFRNIElPIHJlcXMJKi8KKwl1OAkJcG9ydF9tb2RlOworCXU4CQlyc3ZkX2E7CiAJYmZhX2Jvb2xlYW5fdCAgIGRlbGF5X2NvbXA7IC8qICBkZWxheSBjb21wbGV0aW9uIG9mCiAJCQkJCQkJZmFpbGVkIGluZmxpZ2h0IElPcyAqLworCXUxNgkJbnVtX3R0c2tfcmVxczsJIC8qIFRNIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0cyAqLwogCXUzMgkJcnN2ZDsKIH07CiAKQEAgLTgyLDcgKzg1LDcgQEAKIC8qCiAgKiBJT0MgZmlybXdhcmUgSU8gc3RhdHMKICAqLwotc3RydWN0IGJmYV9md19pb19zdGF0c19zIHsKK3N0cnVjdCBiZmFfZndfaW9pbV9zdGF0c19zIHsKIAl1MzIJaG9zdF9hYm9ydDsJCS8qICBJTyBhYm9ydGVkIGJ5IGhvc3QgZHJpdmVyKi8KIAl1MzIJaG9zdF9jbGVhbnVwOwkJLyogIElPIGNsZWFuIHVwIGJ5IGhvc3QgZHJpdmVyICovCiAKQEAgLTE1Miw2ICsxNTUsNTQgQEAKIAkJCQkJCSAqLwogfTsKIAorc3RydWN0IGJmYV9md190aW9fc3RhdHNfcyB7CisJdTMyCXRpb19jb25mX3Byb2M7CS8qIFRJTyBDT05GIHByb2Nlc3NlZCAqLworCXUzMgl0aW9fY29uZl9kcm9wOyAgICAgIC8qIFRJTyBDT05GIGRyb3BwZWQgKi8KKwl1MzIJdGlvX2NsZWFudXBfcmVxOyAgICAvKiBUSU8gY2xlYW51cCByZXF1ZXN0ZWQgKi8KKwl1MzIJdGlvX2NsZWFudXBfY29tcDsgICAvKiBUSU8gY2xlYW51cCBjb21wbGV0ZWQgKi8KKwl1MzIJdGlvX2Fib3J0X3JzcDsgICAgICAvKiBUSU8gYWJvcnQgcmVzcG9uc2UgKi8KKwl1MzIJdGlvX2Fib3J0X3JzcF9jb21wOyAvKiBUSU8gYWJvcnQgcnNwIGNvbXBsZXRlZCAqLworCXUzMgl0aW9fYWJ0c19yZXE7ICAgICAgIC8qIFRJTyBBQlRTIHJlcXVlc3RlZCAqLworCXUzMgl0aW9fYWJ0c19hY2s7ICAgICAgIC8qIFRJTyBBQlRTIGFjay1lZCAqLworCXUzMgl0aW9fYWJ0c19hY2tfbm9jb21wOyAvKiBUSU8gQUJUUyBhY2stZWQgYnV0IG5vdCBjb21wbGV0ZWQgKi8KKwl1MzIJdGlvX2FidHNfdG1vOyAgICAgICAvKiBUSU8gQUJUUyB0aW1lb3V0ICovCisJdTMyCXRpb19zbnNkYXRhX2RtYTsgICAgLyogVElPIHNlbnNlIGRhdGEgRE1BICovCisJdTMyCXRpb19yeHdjaGFuX3dhaXQ7IC8qIFRJTyB3YWl0aW5nIGZvciBSWCB3YWl0IGNoYW5uZWwgKi8KKwl1MzIJdGlvX3J4d2NoYW5fYXZhaWw7IC8qIFRJTyBSWCB3YWl0IGNoYW5uZWwgYXZhaWxhYmxlICovCisJdTMyCXRpb19oaXRfYmxzOyAgICAgICAgLyogVElPIElPSCBCTFMgZXZlbnQgKi8KKwl1MzIJdGlvX3VmX3JlY3Y7ICAgICAgICAvKiBUSU8gcmVjZWl2ZWQgVUYgKi8KKwl1MzIJdGlvX3JkX2ludmFsaWRfc207IC8qIFRJTyByZWFkIHJlcXN0IGluIHdyb25nIHN0YXRlIG1hY2hpbmUgKi8KKwl1MzIJdGlvX3dyX2ludmFsaWRfc207LyogVElPIHdyaXRlIHJlcXN0IGluIHdyb25nIHN0YXRlIG1hY2hpbmUgKi8KKworCXUzMglkc19yeHdjaGFuX3dhaXQ7IC8qIERTIHdhaXRpbmcgZm9yIFJYIHdhaXQgY2hhbm5lbCAqLworCXUzMglkc19yeHdjaGFuX2F2YWlsOyAvKiBEUyBSWCB3YWl0IGNoYW5uZWwgYXZhaWxhYmxlICovCisJdTMyCWRzX3VuYWxpZ25lZF9yZDsgICAgLyogRFMgdW5hbGlnbmVkIHJlYWQgKi8KKwl1MzIJZHNfcmRjb21wX2ludmFsaWRfc207IC8qIERTIHJlYWQgY29tcGxldGVkIGluIHdyb25nIHN0YXRlIG1hY2hpbmUgKi8KKwl1MzIJZHNfd3Jjb21wX2ludmFsaWRfc207IC8qIERTIHdyaXRlIGNvbXBsZXRlZCBpbiB3cm9uZyBzdGF0ZSBtYWNoaW5lICovCisJdTMyCWRzX2ZsdXNoX3JlcTsgICAgICAgLyogRFMgZmx1c2ggcmVxdWVzdGVkICovCisJdTMyCWRzX2ZsdXNoX2NvbXA7ICAgICAgLyogRFMgZmx1c2ggY29tcGxldGVkICovCisJdTMyCWRzX3hmcmR5X2V4cDsgICAgICAgLyogRFMgWEZFUl9SRFkgZXhwaXJlZCAqLworCXUzMglkc19zZXFfY250X2VycjsgICAgIC8qIERTIHNlcSBjbnQgZXJyb3IgKi8KKwl1MzIJZHNfc2VxX2xlbl9lcnI7ICAgICAvKiBEUyBzZXEgbGVuIGVycm9yICovCisJdTMyCWRzX2RhdGFfb29yOyAgICAgICAgLyogRFMgZGF0YSBvdXQgb2Ygb3JkZXIgKi8KKwl1MzIJZHNfaGl0X2JsczsgICAgIC8qIERTIGhpdCBCTFMgKi8KKwl1MzIJZHNfZWR0b3ZfdGltZXJfZXhwOyAvKiBEUyBlZHRvdiBleHBpcmVkICovCisJdTMyCWRzX2NwdV9vd25lZDsgICAgICAgLyogRFMgY3B1IG93bmVkICovCisJdTMyCWRzX2hpdF9jbGFzczI7ICAgICAgLyogRFMgaGl0IGNsYXNzMiAqLworCXUzMglkc19sZW5ndGhfZXJyOyAgICAgIC8qIERTIGxlbmd0aCBlcnJvciAqLworCXUzMglkc19yb19vb29fZXJyOyAgICAgIC8qIERTIHJlbGF0aXZlIG9mZnNldCBvdXQtb2Ytb3JkZXIgZXJyb3IgKi8KKwl1MzIJZHNfcmVjdG92X3RpbWVyX2V4cDsgICAgLyogRFMgcmVjdG92IGV4cGlyZWQgKi8KKwl1MzIJZHNfdW5leHBfZnJfZXJyOyAgICAvKiBEUyB1bmV4cCBmcmFtZSBlcnJvciAqLworfTsKKworLyoKKyAqIElPQyBmaXJtd2FyZSBJTyBzdGF0cworICovCitzdHJ1Y3QgYmZhX2Z3X2lvX3N0YXRzX3MgeworCXN0cnVjdCBiZmFfZndfaW9pbV9zdGF0c19zCWlvaW1fc3RhdHM7CisJc3RydWN0IGJmYV9md190aW9fc3RhdHNfcwl0aW9fc3RhdHM7Cit9OworCiAvKgogICogSU9DIHBvcnQgZmlybXdhcmUgc3RhdHMKICAqLwpAQCAtMjA1LDYgKzI1Niw3IEBACiAgICAgdTMyICAgIG5vc190eDsgICAgICAgICAgICAgLyogIE5vLiBvZiB0aW1lcyBOT1MgdHggc3RhcnRlZCAgICAgICAgICovCiAgICAgdTMyICAgIGh3c21fbHJyX3J4OyAgICAgICAgLyogIE5vLiBvZiB0aW1lcyBMUlIgcngtZWQgYnkgSFdTTSAgICAgICovCiAgICAgdTMyICAgIGh3c21fbHJfcng7ICAgICAgICAgLyogIE5vLiBvZiB0aW1lcyBMUiByeC1lZCBieSBIV1NNICAgICAgKi8KKwl1MzIJYmJzY19scjsJLyogTEtTTSBMUiB0eCBmb3IgY3JlZGl0IHJlY292ZXJ5CSovCiB9OwogCiBzdHJ1Y3QgYmZhX2Z3X3BvcnRfc25zbV9zdGF0c19zIHsKQEAgLTI2Niw4ICszMTgsOCBAQAogICogSU9DIGZpcm13YXJlIEZDb0UgcG9ydCBzdGF0cwogICovCiBzdHJ1Y3QgYmZhX2Z3X2Zjb2VfcG9ydF9zdGF0c19zIHsKLSAgICBzdHJ1Y3QgYmZhX2Z3X2Zjb2Vfc3RhdHNfcyAgZmNvZV9zdGF0czsKLSAgICBzdHJ1Y3QgYmZhX2Z3X2ZpcF9zdGF0c19zICAgZmlwX3N0YXRzOworCXN0cnVjdCBiZmFfZndfZmNvZV9zdGF0c19zICBmY29lX3N0YXRzOworCXN0cnVjdCBiZmFfZndfZmlwX3N0YXRzX3MgICBmaXBfc3RhdHM7CiB9OwogCiAvKgpAQCAtNjM2LDYgKzY4OCw3IEBACiAJQkZBX1BPUlRfU1RfRldNSVNNQVRDSAkJPSAxMiwKIAlCRkFfUE9SVF9TVF9QUkVCT09UX0RJU0FCTEVECT0gMTMsCiAJQkZBX1BPUlRfU1RfVE9HR0xJTkdfUVdBSVQJPSAxNCwKKwlCRkFfUE9SVF9TVF9BQ1FfQUREUgkJPSAxNSwKIAlCRkFfUE9SVF9TVF9NQVhfU1RBVEUsCiB9OwogCkBAIC03NDgsNiArODAxLDEwIEBACiAJdTgJIHR4X2JiY3JlZGl0OwkvKiAgdHJhbnNtaXQgYnVmZmVyIGNyZWRpdHMJKi8KIAl1OAkgcmF0ZWxpbWl0OwkvKiAgcmF0ZWxpbWl0IGVuYWJsZWQgb3Igbm90CSovCiAJdTgJIHRybF9kZWZfc3BlZWQ7CS8qICByYXRlbGltaXQgZGVmYXVsdCBzcGVlZAkqLworCXU4CWJiX3NjbjsJCS8qICBCQl9TQ04gdmFsdWUgZnJvbSBGTE9HSSBFeGNoZyAqLworCXU4CWJiX3Njbl9zdGF0ZTsJLyogIENvbmZpZyBzdGF0ZSBvZiBCQl9TQ04gKi8KKwl1OAlmYWFfc3RhdGU7CS8qICBGQUEgZW5hYmxlZC9kaXNhYmxlZCAgICAgICAgKi8KKwl1OAlyc3ZkWzFdOwogCXUxNiBwYXRoX3RvdjsJLyogIGRldmljZSBwYXRoIHRpbWVvdXQJKi8KIAl1MTYgcV9kZXB0aDsJLyogIFNDU0kgUXVldWUgZGVwdGgJCSovCiB9OwpAQCAtNzgzLDcgKzg0MCw3IEBACiAJZW51bSBiZmFfcG9ydF90b3BvbG9neQl0b3BvbG9neTsJLyogIGN1cnJlbnQgdG9wb2xvZ3kgKi8KIAliZmFfYm9vbGVhbl90CQliZWFjb247CQkvKiAgY3VycmVudCBiZWFjb24gc3RhdHVzICovCiAJYmZhX2Jvb2xlYW5fdAkJbGlua19lMmVfYmVhY29uOyAvKiAgbGluayBiZWFjb24gaXMgb24gKi8KLQliZmFfYm9vbGVhbl90CQlwbG9nX2VuYWJsZWQ7CS8qICBwb3J0bG9nIGlzIGVuYWJsZWQgKi8KKwliZmFfYm9vbGVhbl90CWJic2Nfb3Bfc3RhdHVzOwkvKiBmYyBjcmVkaXQgcmVjb3Zlcnkgb3BlciBzdGF0ZSAqLwogCiAJLyoKIAkgKiBEeW5hbWljIGZpZWxkIC0gaW5mbyBmcm9tIEZDUwpAQCAtNzkyLDEyICs4NDksMTAgQEAKIAllbnVtIGJmYV9wb3J0X3R5cGUJcG9ydF90eXBlOwkvKiAgY3VycmVudCB0b3BvbG9neSAqLwogCXUzMgkJbG9vcGJhY2s7CS8qICBleHRlcm5hbCBsb29wYmFjayAqLwogCXUzMgkJYXV0aGZhaWw7CS8qICBhdXRoIGZhaWwgc3RhdGUgKi8KLQliZmFfYm9vbGVhbl90CQlpb19wcm9maWxlOwkvKiAgZ2V0IGl0IGZyb20gZmNwaW0gbW9kICovCi0JdTgJCQlwYWRbNF07CQkvKiAgZm9yIDY0LWJpdCBhbGlnbmVtZW50ICovCiAKIAkvKiBGQ29FIHNwZWNpZmljICAqLwogCXUxNgkJZmNvZV92bGFuOwotCXU4CQkJcnN2ZDFbNl07CisJdTgJCQlyc3ZkMVsyXTsKIH07CiAKIC8qCkBAIC05ODgsNiArMTA0MywxOSBAQAogfTsKIAogLyoKKyAqCXZIQkEgcG9ydCBhdHRyaWJ1dGUgdmFsdWVzLgorICovCitzdHJ1Y3QgYmZhX3ZoYmFfYXR0cl9zIHsKKwl3d25fdAlud3duOyAgICAgICAvKiBub2RlIHd3biAqLworCXd3bl90CXB3d247ICAgICAgIC8qIHBvcnQgd3duICovCisJdTMyCXBpZDsgICAgICAgIC8qIHBvcnQgSUQgKi8KKwliZmFfYm9vbGVhbl90ICAgICAgIGlvX3Byb2ZpbGU7IC8qIGdldCBpdCBmcm9tIGZjcGltIG1vZCAqLworCWJmYV9ib29sZWFuX3QgICAgICAgcGxvZ19lbmFibGVkOyAgIC8qIHBvcnRsb2cgaXMgZW5hYmxlZCAqLworCXUxNglwYXRoX3RvdjsKKwl1OAlyc3ZkWzJdOworfTsKKworLyoKICAqIEZDIHBoeXNpY2FsIHBvcnQgc3RhdGlzdGljcy4KICAqLwogc3RydWN0IGJmYV9wb3J0X2ZjX3N0YXRzX3MgewpAQCAtMTAyMCw2ICsxMDg4LDkgQEAKIAl1NjQgICAgIGJhZF9vc19jb3VudDsgICAvKiAgSW52YWxpZCBvcmRlcmVkIHNldHMgICAgICAgICovCiAJdTY0ICAgICBlcnJfZW5jX291dDsgICAgLyogIEVuY29kaW5nIGVyciBub25mcmFtZV84YjEwYiAqLwogCXU2NCAgICAgZXJyX2VuYzsgICAgICAgIC8qICBFbmNvZGluZyBlcnIgZnJhbWVfOGIxMGIgICAgKi8KKwl1NjQJYmJzY19mcmFtZXNfbG9zdDsgLyogQ3JlZGl0IFJlY292ZXJ5LUZyYW1lcyBMb3N0ICAqLworCXU2NAliYnNjX2NyZWRpdHNfbG9zdDsgLyogQ3JlZGl0IFJlY292ZXJ5LUNyZWRpdHMgTG9zdCAqLworCXU2NAliYnNjX2xpbmtfcmVzZXRzOyAvKiBDcmVkaXQgUmVjb3ZlcnktTGluayBSZXNldHMgICAqLwogfTsKIAogLyoKQEAgLTEwNzgsNCArMTE0OSw4MyBAQAogCXN0cnVjdCBiZmFfcG9ydF9ldGhfc3RhdHNfcyAgICAgZXRoOwogfTsKIAorc3RydWN0IGJmYV9wb3J0X2NmZ19tb2RlX3MgeworCXUxNgkJbWF4X3BmOworCXUxNgkJbWF4X3ZmOworCWVudW0gYmZhX21vZGVfcwltb2RlOworfTsKKworI3ByYWdtYSBwYWNrKDEpCisKKyNkZWZpbmUgQkZBX0NFRV9MTERQX01BWF9TVFJJTkdfTEVOCSgxMjgpCisjZGVmaW5lIEJGQV9DRUVfRENCWF9NQVhfUFJJT1JJVFkJKDgpCisjZGVmaW5lIEJGQV9DRUVfRENCWF9NQVhfUEdJRAkJKDgpCisKK3N0cnVjdCBiZmFfY2VlX2xsZHBfc3RyX3MgeworCXU4CXN1Yl90eXBlOworCXU4CWxlbjsKKwl1OAlyc3ZkWzJdOworCXU4CXZhbHVlW0JGQV9DRUVfTExEUF9NQVhfU1RSSU5HX0xFTl07Cit9OworCitzdHJ1Y3QgYmZhX2NlZV9sbGRwX2NmZ19zIHsKKwlzdHJ1Y3QgYmZhX2NlZV9sbGRwX3N0cl9zIGNoYXNzaXNfaWQ7CisJc3RydWN0IGJmYV9jZWVfbGxkcF9zdHJfcyBwb3J0X2lkOworCXN0cnVjdCBiZmFfY2VlX2xsZHBfc3RyX3MgcG9ydF9kZXNjOworCXN0cnVjdCBiZmFfY2VlX2xsZHBfc3RyX3Mgc3lzX25hbWU7CisJc3RydWN0IGJmYV9jZWVfbGxkcF9zdHJfcyBzeXNfZGVzYzsKKwlzdHJ1Y3QgYmZhX2NlZV9sbGRwX3N0cl9zIG1nbXRfYWRkcjsKKwl1MTYJdGltZV90b19saXZlOworCXUxNgllbmFibGVkX3N5c3RlbV9jYXA7Cit9OworCisvKiBDRUUvRENCWCBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgYmZhX2NlZV9kY2J4X2NmZ19zIHsKKwl1OAlwZ2lkW0JGQV9DRUVfRENCWF9NQVhfUFJJT1JJVFldOworCXU4CXBnX3BlcmNlbnRhZ2VbQkZBX0NFRV9EQ0JYX01BWF9QR0lEXTsKKwl1OAlwZmNfcHJpbWFwOyAvKiBiaXRtYXAgb2YgcHJpb3J0aWVzIHdpdGggUEZDIGVuYWJsZWQgKi8KKwl1OAlmY29lX3ByaW1hcDsgLyogYml0bWFwIG9mIHByaW9yaXRpZXMgdXNlZCBmb3IgRmNvRSB0cmFmZmljICovCisJdTgJaXNjc2lfcHJpbWFwOyAvKiBiaXRtYXAgb2YgcHJpb3JpdGllcyB1c2VkIGZvciBpU0NTSSB0cmFmZmljICovCisJdTgJZGNieF92ZXJzaW9uOyAvKiBvcGVyYXRpbmcgdmVyc2lvbjpDRUUgb3IgcHJlQ0VFICovCisJdTgJbGxzX2Zjb2U7IC8qIEZDb0UgTG9naWNhbCBMaW5rIFN0YXR1cyAqLworCXU4CWxsc19sYW47IC8qIExBTiBMb2dpY2FsIExpbmsgU3RhdHVzICovCisJdTgJcnN2ZFsyXTsKK307CisKKy8qIENFRSBRdWVyeSAqLworc3RydWN0IGJmYV9jZWVfYXR0cl9zIHsKKwl1OAljZWVfc3RhdHVzOworCXU4CWVycm9yX3JlYXNvbjsKKwlzdHJ1Y3QgYmZhX2NlZV9sbGRwX2NmZ19zIGxsZHBfcmVtb3RlOworCXN0cnVjdCBiZmFfY2VlX2RjYnhfY2ZnX3MgZGNieF9yZW1vdGU7CisJbWFjX3Qgc3JjX21hYzsKKwl1OAlsaW5rX3NwZWVkOworCXU4CW53X3ByaW9yaXR5OworCXU4CWZpbGxlclsyXTsKK307CisKKy8qIExMRFAvRENCWC9DRUUgU3RhdGlzdGljcyAqLworc3RydWN0IGJmYV9jZWVfc3RhdHNfcyB7CisJdTMyCQlsbGRwX3R4X2ZyYW1lczsJCS8qIExMRFAgVHggRnJhbWVzICovCisJdTMyCQlsbGRwX3J4X2ZyYW1lczsJCS8qIExMRFAgUnggRnJhbWVzICovCisJdTMyCQlsbGRwX3J4X2ZyYW1lc19pbnZhbGlkOyAvKiBMTERQIFJ4IEZyYW1lcyBpbnZhbGlkICovCisJdTMyCQlsbGRwX3J4X2ZyYW1lc19uZXc7ICAgICAvKiBMTERQIFJ4IEZyYW1lcyBuZXcgKi8KKwl1MzIJCWxsZHBfdGx2c191bnJlY29nbml6ZWQ7IC8qIExMRFAgUnggdW5yZWNvZy4gVExWcyAqLworCXUzMgkJbGxkcF9yeF9zaHV0ZG93bl90bHZzOyAgLyogTExEUCBSeCBzaHV0ZG93biBUTFZzICovCisJdTMyCQlsbGRwX2luZm9fYWdlZF9vdXQ7ICAgICAvKiBMTERQIHJlbW90ZSBpbmZvIGFnZWQgKi8KKwl1MzIJCWRjYnhfcGh5bGlua191cHM7ICAgICAgIC8qIERDQlggcGh5IGxpbmsgdXBzICovCisJdTMyCQlkY2J4X3BoeWxpbmtfZG93bnM7ICAgICAvKiBEQ0JYIHBoeSBsaW5rIGRvd25zICovCisJdTMyCQlkY2J4X3J4X3RsdnM7ICAgICAgICAgICAvKiBEQ0JYIFJ4IFRMVnMgKi8KKwl1MzIJCWRjYnhfcnhfdGx2c19pbnZhbGlkOyAgIC8qIERDQlggUnggVExWcyBpbnZhbGlkICovCisJdTMyCQlkY2J4X2NvbnRyb2xfdGx2X2Vycm9yOyAvKiBEQ0JYIGNvbnRyb2wgVExWIGVycm9ycyAqLworCXUzMgkJZGNieF9mZWF0dXJlX3Rsdl9lcnJvcjsgLyogRENCWCBmZWF0dXJlIFRMViBlcnJvcnMgKi8KKwl1MzIJCWRjYnhfY2VlX2NmZ19uZXc7ICAgICAgIC8qIERDQlggbmV3IENFRSBjZmcgcmN2ZCAqLworCXUzMgkJY2VlX3N0YXR1c19kb3duOyAgICAgICAgLyogRENCIHN0YXR1cyBkb3duICovCisJdTMyCQljZWVfc3RhdHVzX3VwOyAgICAgICAgICAvKiBEQ0Igc3RhdHVzIHVwICovCisJdTMyCQljZWVfaHdfY2ZnX2NoYW5nZWQ7ICAgICAvKiBEQ0IgaHcgY2ZnIGNoYW5nZWQgKi8KKwl1MzIJCWNlZV9yeF9pbnZhbGlkX2NmZzsgICAgIC8qIERDQiBpbnZhbGlkIGNmZyAqLworfTsKKworI3ByYWdtYSBwYWNrKCkKKwogI2VuZGlmIC8qIF9fQkZBX0RFRlNfU1ZDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjLmgKaW5kZXggYmYwMDY3ZS4uOGQwYjg4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mYy5oCkBAIC0xMDIxLDcgKzEwMjEsNyBAQAogI2RlZmluZSBGQ19FRF9UT1YJMgogI2RlZmluZSBGQ19SRUNfVE9WCShGQ19FRF9UT1YgKyAxKQogI2RlZmluZSBGQ19SQV9UT1YJMTAKLSNkZWZpbmUgRkNfRUxTX1RPVgkoMiAqIEZDX1JBX1RPVikKKyNkZWZpbmUgRkNfRUxTX1RPVgkoKDIgKiBGQ19SQV9UT1YpICsgMSkKICNkZWZpbmUgRkNfRkNDVF9UT1YJKDMgKiBGQ19SQV9UT1YpCiAKIC8qCkBAIC0xMDQ5LDE1ICsxMDQ5LDYgQEAKIH07CiAKIC8qCi0gKiBGQ1AKLSAqLwotZW51bSB7Ci0JRkNQX1JKVAkJPSAweDAxMDAwMDAwLAkvKiBTUlIgcmVqZWN0ICovCi0JRkNQX1NSUl9BQ0NFUFQJPSAweDAyMDAwMDAwLAkvKiBTUlIgYWNjZXB0ICovCi0JRkNQX1NSUgkJPSAweDE0MDAwMDAwLAkvKiBTZXF1ZW5jZSBSZXRyYW5zbWlzc2lvbiBSZXF1ZXN0ICovCi19OwotCi0vKgogICogRkNQX0NNTkQgZGVmaW5pdGlvbnMKICAqLwogI2RlZmluZSBGQ1BfQ01ORF9DREJfTEVOICAgIDE2CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY2J1aWxkLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY2J1aWxkLmMKaW5kZXggYjdlMjUzNC4uMTdiNTliOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNidWlsZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjYnVpbGQuYwpAQCAtOTQsNyArOTQsNiBAQAogCSAqLwogCXBsb2dpX3RtcGwuY3NwLnZlcmhpID0gRkNfUEhfVkVSX1BIXzM7CiAJcGxvZ2lfdG1wbC5jc3AudmVybG8gPSBGQ19QSF9WRVJfNF8zOwotCXBsb2dpX3RtcGwuY3NwLmJiY3JlZCA9IGNwdV90b19iZTE2KDB4MDAwNCk7CiAJcGxvZ2lfdG1wbC5jc3AuY2lybyA9IDB4MTsKIAlwbG9naV90bXBsLmNzcC5jaXNjID0gMHgwOwogCXBsb2dpX3RtcGwuY3NwLmFsdGJiY3JlZCA9IDB4MDsKQEAgLTE1Niw2ICsxNTUsMjIgQEAKIAkgKi8KIH0KIAorc3RhdGljIHZvaWQKK2ZjX2dzcmVzcF9mY2hkcl9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB1MzIgZF9pZCwgdTMyIHNfaWQsIHUxNiBveF9pZCkKK3sKKwltZW1zZXQoZmNocywgMCwgc2l6ZW9mKHN0cnVjdCBmY2hzX3MpKTsKKworCWZjaHMtPnJvdXRpbmcgPSBGQ19SVEdfRkM0X0RFVl9EQVRBOworCWZjaHMtPmNhdF9pbmZvID0gRkNfQ0FUX1NPTElDSVRfQ1RSTDsKKwlmY2hzLT50eXBlID0gRkNfVFlQRV9TRVJWSUNFUzsKKwlmY2hzLT5mX2N0bCA9CisJCWJmYV9odG9uM2IoRkNUTF9FQ19SRVNQIHwgRkNUTF9TRVFfSU5JIHwgRkNUTF9MU19FWENIIHwKKwkJCSAgIEZDVExfRU5EX1NFUSB8IEZDVExfU0lfWEZFUik7CisJZmNocy0+ZF9pZCA9IGRfaWQ7CisJZmNocy0+c19pZCA9IHNfaWQ7CisJZmNocy0+b3hfaWQgPSBveF9pZDsKK30KKwogdm9pZAogZmNfZWxzX3JlcV9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB1MzIgZF9pZCwgdTMyIHNfaWQsIF9fYmUxNiBveF9pZCkKIHsKQEAgLTIwNyw3ICsyMjIsNyBAQAogc3RhdGljICAgICAgICAgIHUxNgogZmNfcGxvZ2lfeF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsIHUzMiBkX2lkLCB1MzIgc19pZCwKIAkJIF9fYmUxNiBveF9pZCwgd3duX3QgcG9ydF9uYW1lLCB3d25fdCBub2RlX25hbWUsCi0JCSB1MTYgcGR1X3NpemUsIHU4IGVsc19jb2RlKQorCQkgdTE2IHBkdV9zaXplLCB1MTYgYmJfY3IsIHU4IGVsc19jb2RlKQogewogCXN0cnVjdCBmY19sb2dpX3MgKnBsb2dpID0gKHN0cnVjdCBmY19sb2dpX3MgKikgKHBsZCk7CiAKQEAgLTIyMCw2ICsyMzUsNyBAQAogCQlmY19lbHNfcnNwX2J1aWxkKGZjaHMsIGRfaWQsIHNfaWQsIG94X2lkKTsKIAogCXBsb2dpLT5jc3AucnhzeiA9IHBsb2dpLT5jbGFzczMucnhzeiA9IGNwdV90b19iZTE2KHBkdV9zaXplKTsKKwlwbG9naS0+Y3NwLmJiY3JlZCAgPSBjcHVfdG9fYmUxNihiYl9jcik7CiAKIAltZW1jcHkoJnBsb2dpLT5wb3J0X25hbWUsICZwb3J0X25hbWUsIHNpemVvZih3d25fdCkpOwogCW1lbWNweSgmcGxvZ2ktPm5vZGVfbmFtZSwgJm5vZGVfbmFtZSwgc2l6ZW9mKHd3bl90KSk7CkBAIC0yNjgsMTUgKzI4NCwxNyBAQAogdTE2CiBmY19mbG9naV9hY2NfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX2xvZ2lfcyAqZmxvZ2ksIHUzMiBzX2lkLAogCQkgICBfX2JlMTYgb3hfaWQsIHd3bl90IHBvcnRfbmFtZSwgd3duX3Qgbm9kZV9uYW1lLAotCQkgICB1MTYgcGR1X3NpemUsIHUxNiBsb2NhbF9iYl9jcmVkaXRzKQorCQkgICB1MTYgcGR1X3NpemUsIHUxNiBsb2NhbF9iYl9jcmVkaXRzLCB1OCBiYl9zY24pCiB7CiAJdTMyICAgICAgICBkX2lkID0gMDsKKwl1MTYJICAgYmJzY25fcnhzeiA9IChiYl9zY24gPDwgMTIpIHwgcGR1X3NpemU7CiAKIAltZW1jcHkoZmxvZ2ksICZwbG9naV90bXBsLCBzaXplb2Yoc3RydWN0IGZjX2xvZ2lfcykpOwogCWZjX2Vsc19yc3BfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOwogCiAJZmxvZ2ktPmVsc19jbWQuZWxzX2NvZGUgPSBGQ19FTFNfQUNDOwotCWZsb2dpLT5jc3AucnhzeiA9IGZsb2dpLT5jbGFzczMucnhzeiA9IGNwdV90b19iZTE2KHBkdV9zaXplKTsKKwlmbG9naS0+Y2xhc3MzLnJ4c3ogPSBjcHVfdG9fYmUxNihwZHVfc2l6ZSk7CisJZmxvZ2ktPmNzcC5yeHN6ICA9IGNwdV90b19iZTE2KGJic2NuX3J4c3opOwkvKiBiYl9zY24vcnhzeiAqLwogCWZsb2dpLT5wb3J0X25hbWUgPSBwb3J0X25hbWU7CiAJZmxvZ2ktPm5vZGVfbmFtZSA9IG5vZGVfbmFtZTsKIApAQCAtMzA2LDE5ICszMjQsMTkgQEAKIHUxNgogZmNfcGxvZ2lfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcGxkLCB1MzIgZF9pZCwgdTMyIHNfaWQsCiAJICAgICAgIHUxNiBveF9pZCwgd3duX3QgcG9ydF9uYW1lLCB3d25fdCBub2RlX25hbWUsCi0JICAgICAgIHUxNiBwZHVfc2l6ZSkKKwkgICAgICAgdTE2IHBkdV9zaXplLCB1MTYgYmJfY3IpCiB7CiAJcmV0dXJuIGZjX3Bsb2dpX3hfYnVpbGQoZmNocywgcGxkLCBkX2lkLCBzX2lkLCBveF9pZCwgcG9ydF9uYW1lLAotCQkJCW5vZGVfbmFtZSwgcGR1X3NpemUsIEZDX0VMU19QTE9HSSk7CisJCQkJbm9kZV9uYW1lLCBwZHVfc2l6ZSwgYmJfY3IsIEZDX0VMU19QTE9HSSk7CiB9CiAKIHUxNgogZmNfcGxvZ2lfYWNjX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHZvaWQgKnBsZCwgdTMyIGRfaWQsIHUzMiBzX2lkLAogCQkgICB1MTYgb3hfaWQsIHd3bl90IHBvcnRfbmFtZSwgd3duX3Qgbm9kZV9uYW1lLAotCQkgICB1MTYgcGR1X3NpemUpCisJCSAgIHUxNiBwZHVfc2l6ZSwgdTE2IGJiX2NyKQogewogCXJldHVybiBmY19wbG9naV94X2J1aWxkKGZjaHMsIHBsZCwgZF9pZCwgc19pZCwgb3hfaWQsIHBvcnRfbmFtZSwKLQkJCQlub2RlX25hbWUsIHBkdV9zaXplLCBGQ19FTFNfQUNDKTsKKwkJCQlub2RlX25hbWUsIHBkdV9zaXplLCBiYl9jciwgRkNfRUxTX0FDQyk7CiB9CiAKIGVudW0gZmNfcGFyc2Vfc3RhdHVzCkBAIC0xMDk2LDYgKzExMTQsMjEgQEAKIH0KIAogdTE2CitmY19nc19yanRfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgIHN0cnVjdCBjdF9oZHJfcyAqY3RoZHIsCisJCXUzMiBkX2lkLCB1MzIgc19pZCwgdTE2IG94X2lkLCB1OCByZWFzb25fY29kZSwKKwkJdTggcmVhc29uX2NvZGVfZXhwbCkKK3sKKwlmY19nc3Jlc3BfZmNoZHJfYnVpbGQoZmNocywgZF9pZCwgc19pZCwgb3hfaWQpOworCisJY3RoZHItPmNtZF9yc3BfY29kZSA9IGNwdV90b19iZTE2KENUX1JTUF9SRUpFQ1QpOworCWN0aGRyLT5yZXZfaWQgPSBDVF9HUzNfUkVWSVNJT047CisKKwljdGhkci0+cmVhc29uX2NvZGUgPSByZWFzb25fY29kZTsKKwljdGhkci0+ZXhwX2NvZGUgICAgPSByZWFzb25fY29kZV9leHBsOworCXJldHVybiBzaXplb2Yoc3RydWN0IGN0X2hkcl9zKTsKK30KKwordTE2CiBmY19zY3JfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX3Njcl9zICpzY3IsCiAJCXU4IHNldF9icl9yZWcsIHUzMiBzX2lkLCB1MTYgb3hfaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY2J1aWxkLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY2J1aWxkLmgKaW5kZXggZWNlNTFlYy4uNDJjZDlkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNidWlsZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjYnVpbGQuaApAQCAtNjYsNiArNjYsOSBAQAogCWNhc2UgUlBTQ19PUF9TUEVFRF84RzoKIAkJcmV0dXJuIEJGQV9QT1JUX1NQRUVEXzhHQlBTOwogCisJY2FzZSBSUFNDX09QX1NQRUVEXzE2RzoKKwkJcmV0dXJuIEJGQV9QT1JUX1NQRUVEXzE2R0JQUzsKKwogCWNhc2UgUlBTQ19PUF9TUEVFRF8xMEc6CiAJCXJldHVybiBCRkFfUE9SVF9TUEVFRF8xMEdCUFM7CiAKQEAgLTk0LDYgKzk3LDkgQEAKIAljYXNlIEJGQV9QT1JUX1NQRUVEXzhHQlBTOgogCQlyZXR1cm4gUlBTQ19PUF9TUEVFRF84RzsKIAorCWNhc2UgQkZBX1BPUlRfU1BFRURfMTZHQlBTOgorCQlyZXR1cm4gUlBTQ19PUF9TUEVFRF8xNkc7CisKIAljYXNlIEJGQV9QT1JUX1NQRUVEXzEwR0JQUzoKIAkJcmV0dXJuIFJQU0NfT1BfU1BFRURfMTBHOwogCkBAIC0xNDEsMTEgKzE0NywxMSBAQAogCQkJCSAgIHUzMiBzX2lkLCBfX2JlMTYgb3hfaWQsCiAJCQkJICAgd3duX3QgcG9ydF9uYW1lLCB3d25fdCBub2RlX25hbWUsCiAJCQkJICAgdTE2IHBkdV9zaXplLAotCQkJCSAgIHUxNiBsb2NhbF9iYl9jcmVkaXRzKTsKKwkJCQkgICB1MTYgbG9jYWxfYmJfY3JlZGl0cywgdTggYmJfc2NuKTsKIAogdTE2ICAgICAgICBmY19wbG9naV9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsIHUzMiBkX2lkLAogCQkJICAgICAgIHUzMiBzX2lkLCB1MTYgb3hfaWQsIHd3bl90IHBvcnRfbmFtZSwKLQkJCSAgICAgICB3d25fdCBub2RlX25hbWUsIHUxNiBwZHVfc2l6ZSk7CisJCQkgICAgICAgd3duX3Qgbm9kZV9uYW1lLCB1MTYgcGR1X3NpemUsIHUxNiBiYl9jcik7CiAKIGVudW0gZmNfcGFyc2Vfc3RhdHVzIGZjX3Bsb2dpX3BhcnNlKHN0cnVjdCBmY2hzX3MgKmZjaHMpOwogCkBAIC0xNzcsMTMgKzE4MywxNyBAQAogdTE2ICAgICAgICBmY19ncG5pZF9idWlsZChzdHJ1Y3QgZmNoc19zICpmY2hzLCB2b2lkICpwbGQsIHUzMiBzX2lkLAogCQkJICAgICAgIHUxNiBveF9pZCwgdTMyIHBvcnRfaWQpOwogCit1MTYJZmNfZ3Nfcmp0X2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHN0cnVjdCBjdF9oZHJfcyAqY3RoZHIsCisJCQl1MzIgZF9pZCwgdTMyIHNfaWQsIHUxNiBveF9pZCwKKwkJCXU4IHJlYXNvbl9jb2RlLCB1OCByZWFzb25fY29kZV9leHBsKTsKKwogdTE2ICAgICAgICBmY19zY3JfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgc3RydWN0IGZjX3Njcl9zICpzY3IsCiAJCQl1OCBzZXRfYnJfcmVnLCB1MzIgc19pZCwgdTE2IG94X2lkKTsKIAogdTE2ICAgICAgICBmY19wbG9naV9hY2NfYnVpbGQoc3RydWN0IGZjaHNfcyAqZmNocywgdm9pZCAqcGxkLCB1MzIgZF9pZCwKIAkJCQkgICB1MzIgc19pZCwgdTE2IG94X2lkLAogCQkJCSAgIHd3bl90IHBvcnRfbmFtZSwgd3duX3Qgbm9kZV9uYW1lLAotCQkJCSAgIHUxNiBwZHVfc2l6ZSk7CisJCQkJICAgdTE2IHBkdV9zaXplLCB1MTYgYmJfY3IpOwogCiB1MTYgICAgICAgIGZjX2FkaXNjX2J1aWxkKHN0cnVjdCBmY2hzX3MgKmZjaHMsIHN0cnVjdCBmY19hZGlzY19zICphZGlzYywKIAkJCXUzMiBkX2lkLCB1MzIgc19pZCwgX19iZTE2IG94X2lkLCB3d25fdCBwb3J0X25hbWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uYwppbmRleCBjMDM1M2NkLi5hNGU3OTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlICJiZmFfbW9kdWxlcy5oIgogCiBCRkFfVFJDX0ZJTEUoSEFMLCBGQ1BJTSk7Ci1CRkFfTU9EVUxFKGZjcGltKTsKIAogLyoKICAqICBCRkEgSVROSU0gUmVsYXRlZCBkZWZpbml0aW9ucwpAQCAtMjg3LDI0ICsyODYsMTYgQEAKICAqIENvbXB1dGUgYW5kIHJldHVybiBtZW1vcnkgbmVlZGVkIGJ5IEZDUChpbSkgbW9kdWxlLgogICovCiBzdGF0aWMgdm9pZAotYmZhX2ZjcGltX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmttX2xlbiwKLQkJdTMyICpkbV9sZW4pCitiZmFfZmNwaW1fbWVtaW5mbyhzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsIHUzMiAqa21fbGVuKQogewotCWJmYV9pdG5pbV9tZW1pbmZvKGNmZywga21fbGVuLCBkbV9sZW4pOworCWJmYV9pdG5pbV9tZW1pbmZvKGNmZywga21fbGVuKTsKIAogCS8qCiAJICogSU8gbWVtb3J5CiAJICovCi0JaWYgKGNmZy0+ZndjZmcubnVtX2lvaW1fcmVxcyA8IEJGQV9JT0lNX01JTikKLQkJY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzID0gQkZBX0lPSU1fTUlOOwotCWVsc2UgaWYgKGNmZy0+ZndjZmcubnVtX2lvaW1fcmVxcyA+IEJGQV9JT0lNX01BWCkKLQkJY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzID0gQkZBX0lPSU1fTUFYOwotCiAJKmttX2xlbiArPSBjZmctPmZ3Y2ZnLm51bV9pb2ltX3JlcXMgKgogCSAgKHNpemVvZihzdHJ1Y3QgYmZhX2lvaW1fcykgKyBzaXplb2Yoc3RydWN0IGJmYV9pb2ltX3NwX3MpKTsKIAotCSpkbV9sZW4gKz0gY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzICogQkZJX0lPSU1fU05TTEVOOwotCiAJLyoKIAkgKiB0YXNrIG1hbmFnZW1lbnQgY29tbWFuZCBtZW1vcnkKIAkgKi8KQEAgLTMxNSw1MiArMzA2LDQxIEBACiAKIAogc3RhdGljIHZvaWQKLWJmYV9mY3BpbV9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKLQkJc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKK2JmYV9mY3BpbV9hdHRhY2goc3RydWN0IGJmYV9mY3BfbW9kX3MgKmZjcCwgdm9pZCAqYmZhZCwKKwkJc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCBzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYpCiB7Ci0Jc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBCRkFfRkNQSU1fTU9EKGJmYSk7CisJc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSA9ICZmY3AtPmZjcGltOworCXN0cnVjdCBiZmFfcyAqYmZhID0gZmNwLT5iZmE7CiAKIAliZmFfdHJjKGJmYSwgY2ZnLT5kcnZjZmcucGF0aF90b3YpOwogCWJmYV90cmMoYmZhLCBjZmctPmZ3Y2ZnLm51bV9ycG9ydHMpOwogCWJmYV90cmMoYmZhLCBjZmctPmZ3Y2ZnLm51bV9pb2ltX3JlcXMpOwogCWJmYV90cmMoYmZhLCBjZmctPmZ3Y2ZnLm51bV90c2tpbV9yZXFzKTsKIAorCWZjcGltLT5mY3AJCT0gZmNwOwogCWZjcGltLT5iZmEJCT0gYmZhOwogCWZjcGltLT5udW1faXRuaW1zCT0gY2ZnLT5md2NmZy5udW1fcnBvcnRzOwotCWZjcGltLT5udW1faW9pbV9yZXFzICA9IGNmZy0+ZndjZmcubnVtX2lvaW1fcmVxczsKIAlmY3BpbS0+bnVtX3Rza2ltX3JlcXMgPSBjZmctPmZ3Y2ZnLm51bV90c2tpbV9yZXFzOwogCWZjcGltLT5wYXRoX3RvdgkJPSBjZmctPmRydmNmZy5wYXRoX3RvdjsKIAlmY3BpbS0+ZGVsYXlfY29tcAk9IGNmZy0+ZHJ2Y2ZnLmRlbGF5X2NvbXA7CiAJZmNwaW0tPnByb2ZpbGVfY29tcCA9IE5VTEw7CiAJZmNwaW0tPnByb2ZpbGVfc3RhcnQgPSBOVUxMOwogCi0JYmZhX2l0bmltX2F0dGFjaChmY3BpbSwgbWVtaW5mbyk7Ci0JYmZhX3Rza2ltX2F0dGFjaChmY3BpbSwgbWVtaW5mbyk7Ci0JYmZhX2lvaW1fYXR0YWNoKGZjcGltLCBtZW1pbmZvKTsKKwliZmFfaXRuaW1fYXR0YWNoKGZjcGltKTsKKwliZmFfdHNraW1fYXR0YWNoKGZjcGltKTsKKwliZmFfaW9pbV9hdHRhY2goZmNwaW0pOwogfQogCiBzdGF0aWMgdm9pZAotYmZhX2ZjcGltX2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKK2JmYV9mY3BpbV9pb2NkaXNhYmxlKHN0cnVjdCBiZmFfZmNwX21vZF9zICpmY3ApCiB7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmFfZmNwaW1fc3RhcnQoc3RydWN0IGJmYV9zICpiZmEpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmFfZmNwaW1fc3RvcChzdHJ1Y3QgYmZhX3MgKmJmYSkKLXsKLX0KLQotc3RhdGljIHZvaWQKLWJmYV9mY3BpbV9pb2NkaXNhYmxlKHN0cnVjdCBiZmFfcyAqYmZhKQotewotCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOworCXN0cnVjdCBiZmFfZmNwaW1fcyAqZmNwaW0gPSAmZmNwLT5mY3BpbTsKIAlzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltOwogCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOwogCisJLyogRW5xdWV1ZSB1bnVzZWQgaW9pbSByZXNvdXJjZXMgdG8gZnJlZV9xICovCisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZmY3BpbS0+dHNraW1fdW51c2VkX3EsICZmY3BpbS0+dHNraW1fZnJlZV9xKTsKKwogCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmZmNwaW0tPml0bmltX3EpIHsKIAkJaXRuaW0gPSAoc3RydWN0IGJmYV9pdG5pbV9zICopIHFlOwogCQliZmFfaXRuaW1faW9jZGlzYWJsZShpdG5pbSk7CkBAIC0zNzAsNyArMzUwLDcgQEAKIHZvaWQKIGJmYV9mY3BpbV9wYXRoX3Rvdl9zZXQoc3RydWN0IGJmYV9zICpiZmEsIHUxNiBwYXRoX3RvdikKIHsKLQlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSA9IEJGQV9GQ1BJTV9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKGJmYSk7CiAKIAlmY3BpbS0+cGF0aF90b3YgPSBwYXRoX3RvdiAqIDEwMDA7CiAJaWYgKGZjcGltLT5wYXRoX3RvdiA+IEJGQV9GQ1BJTV9QQVRIVE9WX01BWCkKQEAgLTM4MCwxNSArMzYwLDg3IEBACiB1MTYKIGJmYV9mY3BpbV9wYXRoX3Rvdl9nZXQoc3RydWN0IGJmYV9zICpiZmEpCiB7Ci0Jc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBCRkFfRkNQSU1fTU9EKGJmYSk7CisJc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSA9IEJGQV9GQ1BJTShiZmEpOwogCiAJcmV0dXJuIGZjcGltLT5wYXRoX3RvdiAvIDEwMDA7CiB9CiAKKyNkZWZpbmUgYmZhX2ZjcGltX2FkZF9pb3N0YXRzKF9fbCwgX19yLCBfX3N0YXRzKQlcCisJKF9fbC0+X19zdGF0cyArPSBfX3ItPl9fc3RhdHMpCisKK3ZvaWQKK2JmYV9mY3BpbV9hZGRfc3RhdHMoc3RydWN0IGJmYV9pdG5pbV9pb3N0YXRzX3MgKmxzdGF0cywKKwkJc3RydWN0IGJmYV9pdG5pbV9pb3N0YXRzX3MgKnJzdGF0cykKK3sKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIHRvdGFsX2lvcyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBxcmVzdW1lcyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBub19pb3RhZ3MpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgaW9fYWJvcnRzKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIG5vX3Rza2ltcyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBpb2NvbXBfb2spOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgaW9jb21wX3VuZGVycnVuKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGlvY29tcF9vdmVycnVuKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGlvY29tcF9hYm9ydGVkKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGlvY29tcF90aW1lZG91dCk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBpb2NvbV9uZXh1c19hYm9ydCk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBpb2NvbV9wcm90b19lcnIpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgaW9jb21fZGlmX2Vycik7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBpb2NvbV9zcWVyX25lZWRlZCk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBpb2NvbV9yZXNfZnJlZSk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBpb2NvbV9ob3N0YWJydHMpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgaW9jb21fdXRhZ3MpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgaW9fY2xlYW51cHMpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgaW9fdG1hYm9ydHMpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgb25saW5lcyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBvZmZsaW5lcyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBjcmVhdGVzKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGRlbGV0ZXMpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgY3JlYXRlX2NvbXBzKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGRlbGV0ZV9jb21wcyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBzbGVyX2V2ZW50cyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBmd19jcmVhdGUpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgZndfZGVsZXRlKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGlvY19kaXNhYmxlZCk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBjbGVhbnVwX2NvbXBzKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIHRtX2NtbmRzKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIHRtX2Z3X3JzcHMpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgdG1fc3VjY2Vzcyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCB0bV9mYWlsdXJlcyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCB0bV9pb19jb21wcyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCB0bV9xcmVzdW1lcyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCB0bV9pb2Nkb3ducyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCB0bV9jbGVhbnVwcyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCB0bV9jbGVhbnVwX2NvbXBzKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGlvX2NvbXBzKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGlucHV0X3JlcXMpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgb3V0cHV0X3JlcXMpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgcmRfdGhyb3VnaHB1dCk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCB3cl90aHJvdWdocHV0KTsKK30KKworYmZhX3N0YXR1c190CitiZmFfZmNwaW1fcG9ydF9pb3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLAorCQlzdHJ1Y3QgYmZhX2l0bmltX2lvc3RhdHNfcyAqc3RhdHMsIHU4IGxwX3RhZykKK3sKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKGJmYSk7CisJc3RydWN0IGxpc3RfaGVhZCAqcWUsICpxZW47CisJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbTsKKworCS8qIGFjY3VtdWxhdGUgSU8gc3RhdHMgZnJvbSBpdG5pbSAqLworCW1lbXNldChzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfaXRuaW1faW9zdGF0c19zKSk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZmY3BpbS0+aXRuaW1fcSkgeworCQlpdG5pbSA9IChzdHJ1Y3QgYmZhX2l0bmltX3MgKikgcWU7CisJCWlmIChpdG5pbS0+cnBvcnQtPnJwb3J0X2luZm8ubHBfdGFnICE9IGxwX3RhZykKKwkJCWNvbnRpbnVlOworCQliZmFfZmNwaW1fYWRkX3N0YXRzKHN0YXRzLCAmKGl0bmltLT5zdGF0cykpOworCX0KKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKwogdTE2CiBiZmFfZmNwaW1fcWRlcHRoX2dldChzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKLQlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSA9IEJGQV9GQ1BJTV9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKGJmYSk7CiAKIAlyZXR1cm4gZmNwaW0tPnFfZGVwdGg7CiB9CkBAIC05OTAsOCArMTA0Miw3IEBACiB9CiAKIHZvaWQKLWJmYV9pdG5pbV9tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgdTMyICprbV9sZW4sCi0JCXUzMiAqZG1fbGVuKQorYmZhX2l0bmltX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmttX2xlbikKIHsKIAkvKgogCSAqIElUTiBtZW1vcnkKQEAgLTEwMDAsMTUgKzEwNTEsMTYgQEAKIH0KIAogdm9pZAotYmZhX2l0bmltX2F0dGFjaChzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSwgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pbmZvKQorYmZhX2l0bmltX2F0dGFjaChzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltKQogewogCXN0cnVjdCBiZmFfcwkqYmZhID0gZmNwaW0tPmJmYTsKKwlzdHJ1Y3QgYmZhX2ZjcF9tb2RfcwkqZmNwID0gZmNwaW0tPmZjcDsKIAlzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltOwogCWludAlpLCBqOwogCiAJSU5JVF9MSVNUX0hFQUQoJmZjcGltLT5pdG5pbV9xKTsKIAotCWl0bmltID0gKHN0cnVjdCBiZmFfaXRuaW1fcyAqKSBiZmFfbWVtaW5mb19rdmEobWluZm8pOworCWl0bmltID0gKHN0cnVjdCBiZmFfaXRuaW1fcyAqKSBiZmFfbWVtX2t2YV9jdXJwKGZjcCk7CiAJZmNwaW0tPml0bmltX2FyciA9IGl0bmltOwogCiAJZm9yIChpID0gMDsgaSA8IGZjcGltLT5udW1faXRuaW1zOyBpKyssIGl0bmltKyspIHsKQEAgLTEwMzAsNyArMTA4Miw3IEBACiAJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV91bmluaXQpOwogCX0KIAotCWJmYV9tZW1pbmZvX2t2YShtaW5mbykgPSAodTggKikgaXRuaW07CisJYmZhX21lbV9rdmFfY3VycChmY3ApID0gKHU4ICopIGl0bmltOwogfQogCiB2b2lkCkBAIC0xMDQzLDcgKzEwOTUsNyBAQAogc3RhdGljIGJmYV9ib29sZWFuX3QKIGJmYV9pdG5pbV9zZW5kX2Z3Y3JlYXRlKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCiB7Ci0Jc3RydWN0IGJmaV9pdG5pbV9jcmVhdGVfcmVxX3MgKm07CisJc3RydWN0IGJmaV9pdG5fY3JlYXRlX3JlcV9zICptOwogCiAJaXRuaW0tPm1zZ19ubysrOwogCkBAIC0xMDU2LDggKzExMDgsOCBAQAogCQlyZXR1cm4gQkZBX0ZBTFNFOwogCX0KIAotCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfSVROSU0sIEJGSV9JVE5JTV9IMklfQ1JFQVRFX1JFUSwKLQkJCWJmYV9scHVpZChpdG5pbS0+YmZhKSk7CisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19JVE4sIEJGSV9JVE5fSDJJX0NSRUFURV9SRVEsCisJCQliZmFfZm5fbHB1KGl0bmltLT5iZmEpKTsKIAltLT5md19oYW5kbGUgPSBpdG5pbS0+cnBvcnQtPmZ3X2hhbmRsZTsKIAltLT5jbGFzcyA9IEZDX0NMQVNTXzM7CiAJbS0+c2VxX3JlYyA9IGl0bmltLT5zZXFfcmVjOwpAQCAtMTA2NywxNCArMTExOSwxNCBAQAogCS8qCiAJICogcXVldWUgSS9PIG1lc3NhZ2UgdG8gZmlybXdhcmUKIAkgKi8KLQliZmFfcmVxcV9wcm9kdWNlKGl0bmltLT5iZmEsIGl0bmltLT5yZXFxKTsKKwliZmFfcmVxcV9wcm9kdWNlKGl0bmltLT5iZmEsIGl0bmltLT5yZXFxLCBtLT5taCk7CiAJcmV0dXJuIEJGQV9UUlVFOwogfQogCiBzdGF0aWMgYmZhX2Jvb2xlYW5fdAogYmZhX2l0bmltX3NlbmRfZndkZWxldGUoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSkKIHsKLQlzdHJ1Y3QgYmZpX2l0bmltX2RlbGV0ZV9yZXFfcyAqbTsKKwlzdHJ1Y3QgYmZpX2l0bl9kZWxldGVfcmVxX3MgKm07CiAKIAkvKgogCSAqIGNoZWNrIGZvciByb29tIGluIHF1ZXVlIHRvIHNlbmQgcmVxdWVzdCBub3cKQEAgLTEwODUsMTUgKzExMzcsMTUgQEAKIAkJcmV0dXJuIEJGQV9GQUxTRTsKIAl9CiAKLQliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0lUTklNLCBCRklfSVROSU1fSDJJX0RFTEVURV9SRVEsCi0JCQliZmFfbHB1aWQoaXRuaW0tPmJmYSkpOworCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfSVROLCBCRklfSVROX0gySV9ERUxFVEVfUkVRLAorCQkJYmZhX2ZuX2xwdShpdG5pbS0+YmZhKSk7CiAJbS0+ZndfaGFuZGxlID0gaXRuaW0tPnJwb3J0LT5md19oYW5kbGU7CiAJYmZhX3N0YXRzKGl0bmltLCBmd19kZWxldGUpOwogCiAJLyoKIAkgKiBxdWV1ZSBJL08gbWVzc2FnZSB0byBmaXJtd2FyZQogCSAqLwotCWJmYV9yZXFxX3Byb2R1Y2UoaXRuaW0tPmJmYSwgaXRuaW0tPnJlcXEpOworCWJmYV9yZXFxX3Byb2R1Y2UoaXRuaW0tPmJmYSwgaXRuaW0tPnJlcXEsIG0tPm1oKTsKIAlyZXR1cm4gQkZBX1RSVUU7CiB9CiAKQEAgLTEyMjQsNyArMTI3Niw3IEBACiBzdGF0aWMgdm9pZAogYmZhX2l0bmltX3VwZGF0ZV9kZWxfaXRuX3N0YXRzKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCiB7Ci0Jc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBCRkFfRkNQSU1fTU9EKGl0bmltLT5iZmEpOworCXN0cnVjdCBiZmFfZmNwaW1fcyAqZmNwaW0gPSBCRkFfRkNQSU0oaXRuaW0tPmJmYSk7CiAJZmNwaW0tPmRlbF9pdG5fc3RhdHMuZGVsX2l0bl9pb2NvbXBfYWJvcnRlZCArPQogCQlpdG5pbS0+c3RhdHMuaW9jb21wX2Fib3J0ZWQ7CiAJZmNwaW0tPmRlbF9pdG5fc3RhdHMuZGVsX2l0bl9pb2NvbXBfdGltZWRvdXQgKz0KQEAgLTEyNTAsOCArMTMwMiw4IEBACiB2b2lkCiBiZmFfaXRuaW1faXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptKQogewotCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOwotCXVuaW9uIGJmaV9pdG5pbV9pMmhfbXNnX3UgbXNnOworCXN0cnVjdCBiZmFfZmNwaW1fcyAqZmNwaW0gPSBCRkFfRkNQSU0oYmZhKTsKKwl1bmlvbiBiZmlfaXRuX2kyaF9tc2dfdSBtc2c7CiAJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbTsKIAogCWJmYV90cmMoYmZhLCBtLT5taGRyLm1zZ19pZCk7CkBAIC0xMjU5LDcgKzEzMTEsNyBAQAogCW1zZy5tc2cgPSBtOwogCiAJc3dpdGNoIChtLT5taGRyLm1zZ19pZCkgewotCWNhc2UgQkZJX0lUTklNX0kySF9DUkVBVEVfUlNQOgorCWNhc2UgQkZJX0lUTl9JMkhfQ1JFQVRFX1JTUDoKIAkJaXRuaW0gPSBCRkFfSVROSU1fRlJPTV9UQUcoZmNwaW0sCiAJCQkJCQltc2cuY3JlYXRlX3JzcC0+YmZhX2hhbmRsZSk7CiAJCVdBUk5fT04obXNnLmNyZWF0ZV9yc3AtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKTsKQEAgLTEyNjcsNyArMTMxOSw3IEBACiAJCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfSVROSU1fU01fRldSU1ApOwogCQlicmVhazsKIAotCWNhc2UgQkZJX0lUTklNX0kySF9ERUxFVEVfUlNQOgorCWNhc2UgQkZJX0lUTl9JMkhfREVMRVRFX1JTUDoKIAkJaXRuaW0gPSBCRkFfSVROSU1fRlJPTV9UQUcoZmNwaW0sCiAJCQkJCQltc2cuZGVsZXRlX3JzcC0+YmZhX2hhbmRsZSk7CiAJCVdBUk5fT04obXNnLmRlbGV0ZV9yc3AtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKTsKQEAgLTEyNzUsNyArMTMyNyw3IEBACiAJCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfSVROSU1fU01fRldSU1ApOwogCQlicmVhazsKIAotCWNhc2UgQkZJX0lUTklNX0kySF9TTEVSX0VWRU5UOgorCWNhc2UgQkZJX0lUTl9JMkhfU0xFUl9FVkVOVDoKIAkJaXRuaW0gPSBCRkFfSVROSU1fRlJPTV9UQUcoZmNwaW0sCiAJCQkJCQltc2cuc2xlcl9ldmVudC0+YmZhX2hhbmRsZSk7CiAJCWJmYV9zdGF0cyhpdG5pbSwgc2xlcl9ldmVudHMpOwpAQCAtMTI5NSw5ICsxMzQ3LDExIEBACiBzdHJ1Y3QgYmZhX2l0bmltX3MgKgogYmZhX2l0bmltX2NyZWF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9ycG9ydF9zICpycG9ydCwgdm9pZCAqZGl0bikKIHsKLQlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSA9IEJGQV9GQ1BJTV9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKGJmYSk7CiAJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbTsKIAorCWJmYV9pdG5fY3JlYXRlKGJmYSwgcnBvcnQsIGJmYV9pdG5pbV9pc3IpOworCiAJaXRuaW0gPSBCRkFfSVROSU1fRlJPTV9UQUcoZmNwaW0sIHJwb3J0LT5ycG9ydF90YWcpOwogCVdBUk5fT04oaXRuaW0tPnJwb3J0ICE9IHJwb3J0KTsKIApAQCAtMTk5MSw3ICsyMDQ1LDggQEAKIAkJaWYgKChtLT5zY3NpX3N0YXR1cyA9PSBTQ1NJX1NUQVRVU19DSEVDS19DT05ESVRJT04pICYmCiAJCQkJCW0tPnNuc19sZW4pIHsKIAkJCXNuc19sZW4gPSBtLT5zbnNfbGVuOwotCQkJc25zaW5mbyA9IGlvaW0tPmlvc3AtPnNuc2luZm87CisJCQlzbnNpbmZvID0gQkZBX1NOU0lORk9fRlJPTV9UQUcoaW9pbS0+ZmNwaW0tPmZjcCwKKwkJCQkJCWlvaW0tPmlvdGFnKTsKIAkJfQogCiAJCS8qCkBAIC0yMTg5LDEyICsyMjQ0LDEyIEBACiAJICovCiAJc3dpdGNoIChtLT5jbW5kLmlvZGlyKSB7CiAJY2FzZSBGQ1BfSU9ESVJfUkVBRDoKLQkJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19JT0lNX1JFQUQsIDAsIGJmYV9scHVpZChpb2ltLT5iZmEpKTsKKwkJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19JT0lNX1JFQUQsIDAsIGJmYV9mbl9scHUoaW9pbS0+YmZhKSk7CiAJCWJmYV9zdGF0cyhpdG5pbSwgaW5wdXRfcmVxcyk7CiAJCWlvaW0tPml0bmltLT5zdGF0cy5yZF90aHJvdWdocHV0ICs9IGZjcF9kbDsKIAkJYnJlYWs7CiAJY2FzZSBGQ1BfSU9ESVJfV1JJVEU6Ci0JCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfSU9JTV9XUklURSwgMCwgYmZhX2xwdWlkKGlvaW0tPmJmYSkpOworCQliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0lPSU1fV1JJVEUsIDAsIGJmYV9mbl9scHUoaW9pbS0+YmZhKSk7CiAJCWJmYV9zdGF0cyhpdG5pbSwgb3V0cHV0X3JlcXMpOwogCQlpb2ltLT5pdG5pbS0+c3RhdHMud3JfdGhyb3VnaHB1dCArPSBmY3BfZGw7CiAJCWJyZWFrOwpAQCAtMjIwMiwxNiArMjI1NywxNiBAQAogCQliZmFfc3RhdHMoaXRuaW0sIGlucHV0X3JlcXMpOwogCQliZmFfc3RhdHMoaXRuaW0sIG91dHB1dF9yZXFzKTsKIAlkZWZhdWx0OgotCQliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0lPSU1fSU8sIDAsIGJmYV9scHVpZChpb2ltLT5iZmEpKTsKKwkJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19JT0lNX0lPLCAwLCBiZmFfZm5fbHB1KGlvaW0tPmJmYSkpOwogCX0KIAlpZiAoaXRuaW0tPnNlcV9yZWMgfHwKIAkgICAgKHNjc2lfYnVmZmxlbihjbW5kKSAmIChzaXplb2YodTMyKSAtIDEpKSkKLQkJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19JT0lNX0lPLCAwLCBiZmFfbHB1aWQoaW9pbS0+YmZhKSk7CisJCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfSU9JTV9JTywgMCwgYmZhX2ZuX2xwdShpb2ltLT5iZmEpKTsKIAogCS8qCiAJICogcXVldWUgSS9PIG1lc3NhZ2UgdG8gZmlybXdhcmUKIAkgKi8KLQliZmFfcmVxcV9wcm9kdWNlKGlvaW0tPmJmYSwgaW9pbS0+cmVxcSk7CisJYmZhX3JlcXFfcHJvZHVjZShpb2ltLT5iZmEsIGlvaW0tPnJlcXEsIG0tPm1oKTsKIAlyZXR1cm4gQkZBX1RSVUU7CiB9CiAKQEAgLTIyNjksMTQgKzIzMjQsMTQgQEAKIAllbHNlCiAJCW1zZ29wID0gQkZJX0lPSU1fSDJJX0lPQ0xFQU5VUF9SRVE7CiAKLQliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0lPSU0sIG1zZ29wLCBiZmFfbHB1aWQoaW9pbS0+YmZhKSk7CisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19JT0lNLCBtc2dvcCwgYmZhX2ZuX2xwdShpb2ltLT5iZmEpKTsKIAltLT5pb190YWcgICAgPSBjcHVfdG9fYmUxNihpb2ltLT5pb3RhZyk7CiAJbS0+YWJvcnRfdGFnID0gKytpb2ltLT5hYm9ydF90YWc7CiAKIAkvKgogCSAqIHF1ZXVlIEkvTyBtZXNzYWdlIHRvIGZpcm13YXJlCiAJICovCi0JYmZhX3JlcXFfcHJvZHVjZShpb2ltLT5iZmEsIGlvaW0tPnJlcXEpOworCWJmYV9yZXFxX3Byb2R1Y2UoaW9pbS0+YmZhLCBpb2ltLT5yZXFxLCBtLT5taCk7CiAJcmV0dXJuIEJGQV9UUlVFOwogfQogCkBAIC0yMzYwLDQ2ICsyNDE1LDMyIEBACiAgKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24uCiAgKi8KIHZvaWQKLWJmYV9pb2ltX2F0dGFjaChzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSwgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pbmZvKQorYmZhX2lvaW1fYXR0YWNoKHN0cnVjdCBiZmFfZmNwaW1fcyAqZmNwaW0pCiB7CiAJc3RydWN0IGJmYV9pb2ltX3MJCSppb2ltOworCXN0cnVjdCBiZmFfZmNwX21vZF9zCSpmY3AgPSBmY3BpbS0+ZmNwOwogCXN0cnVjdCBiZmFfaW9pbV9zcF9zCSppb3NwOwogCXUxNgkJaTsKLQl1OAkJCSpzbnNpbmZvOwotCXUzMgkJc25zYnVmc3o7CiAKIAkvKgogCSAqIGNsYWltIG1lbW9yeSBmaXJzdAogCSAqLwotCWlvaW0gPSAoc3RydWN0IGJmYV9pb2ltX3MgKikgYmZhX21lbWluZm9fa3ZhKG1pbmZvKTsKKwlpb2ltID0gKHN0cnVjdCBiZmFfaW9pbV9zICopIGJmYV9tZW1fa3ZhX2N1cnAoZmNwKTsKIAlmY3BpbS0+aW9pbV9hcnIgPSBpb2ltOwotCWJmYV9tZW1pbmZvX2t2YShtaW5mbykgPSAodTggKikgKGlvaW0gKyBmY3BpbS0+bnVtX2lvaW1fcmVxcyk7CisJYmZhX21lbV9rdmFfY3VycChmY3ApID0gKHU4ICopIChpb2ltICsgZmNwaW0tPmZjcC0+bnVtX2lvaW1fcmVxcyk7CiAKLQlpb3NwID0gKHN0cnVjdCBiZmFfaW9pbV9zcF9zICopIGJmYV9tZW1pbmZvX2t2YShtaW5mbyk7CisJaW9zcCA9IChzdHJ1Y3QgYmZhX2lvaW1fc3BfcyAqKSBiZmFfbWVtX2t2YV9jdXJwKGZjcCk7CiAJZmNwaW0tPmlvaW1fc3BfYXJyID0gaW9zcDsKLQliZmFfbWVtaW5mb19rdmEobWluZm8pID0gKHU4ICopIChpb3NwICsgZmNwaW0tPm51bV9pb2ltX3JlcXMpOwotCi0JLyoKLQkgKiBDbGFpbSBETUEgbWVtb3J5IGZvciBwZXIgSU8gc2Vuc2UgZGF0YS4KLQkgKi8KLQlzbnNidWZzeiA9IGZjcGltLT5udW1faW9pbV9yZXFzICogQkZJX0lPSU1fU05TTEVOOwotCWZjcGltLT5zbnNiYXNlLnBhICA9IGJmYV9tZW1pbmZvX2RtYV9waHlzKG1pbmZvKTsKLQliZmFfbWVtaW5mb19kbWFfcGh5cyhtaW5mbykgKz0gc25zYnVmc3o7Ci0KLQlmY3BpbS0+c25zYmFzZS5rdmEgPSBiZmFfbWVtaW5mb19kbWFfdmlydChtaW5mbyk7Ci0JYmZhX21lbWluZm9fZG1hX3ZpcnQobWluZm8pICs9IHNuc2J1ZnN6OwotCXNuc2luZm8gPSBmY3BpbS0+c25zYmFzZS5rdmE7Ci0JYmZhX2lvY2ZjX3NldF9zbnNiYXNlKGZjcGltLT5iZmEsIGZjcGltLT5zbnNiYXNlLnBhKTsKKwliZmFfbWVtX2t2YV9jdXJwKGZjcCkgPSAodTggKikgKGlvc3AgKyBmY3BpbS0+ZmNwLT5udW1faW9pbV9yZXFzKTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBpb2ltIGZyZWUgcXVldWVzCiAJICovCi0JSU5JVF9MSVNUX0hFQUQoJmZjcGltLT5pb2ltX2ZyZWVfcSk7CiAJSU5JVF9MSVNUX0hFQUQoJmZjcGltLT5pb2ltX3Jlc2ZyZWVfcSk7CiAJSU5JVF9MSVNUX0hFQUQoJmZjcGltLT5pb2ltX2NvbXBfcSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZmNwaW0tPm51bV9pb2ltX3JlcXM7Ci0JICAgICBpKyssIGlvaW0rKywgaW9zcCsrLCBzbnNpbmZvICs9IEJGSV9JT0lNX1NOU0xFTikgeworCWZvciAoaSA9IDA7IGkgPCBmY3BpbS0+ZmNwLT5udW1faW9pbV9yZXFzOworCSAgICAgaSsrLCBpb2ltKyssIGlvc3ArKykgewogCQkvKgogCQkgKiBpbml0aWFsaXplIElPSU0KIAkJICovCkBAIC0yNDA4LDIyICsyNDQ5LDE5IEBACiAJCWlvaW0tPmJmYSAgICAgPSBmY3BpbS0+YmZhOwogCQlpb2ltLT5mY3BpbSAgID0gZmNwaW07CiAJCWlvaW0tPmlvc3AgICAgPSBpb3NwOwotCQlpb3NwLT5zbnNpbmZvID0gc25zaW5mbzsKIAkJSU5JVF9MSVNUX0hFQUQoJmlvaW0tPnNncGdfcSk7CiAJCWJmYV9yZXFxX3dpbml0KCZpb2ltLT5pb3NwLT5yZXFxX3dhaXQsCiAJCQkJICAgYmZhX2lvaW1fcXJlc3VtZSwgaW9pbSk7CiAJCWJmYV9zZ3BnX3dpbml0KCZpb2ltLT5pb3NwLT5zZ3BnX3dxZSwKIAkJCQkgICBiZmFfaW9pbV9zZ3BnX2FsbG9jZWQsIGlvaW0pOwogCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX3VuaW5pdCk7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmaW9pbS0+cWUsICZmY3BpbS0+aW9pbV9mcmVlX3EpOwogCX0KIH0KIAogdm9pZAogYmZhX2lvaW1faXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptKQogewotCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltID0gQkZBX0ZDUElNX01PRChiZmEpOworCXN0cnVjdCBiZmFfZmNwaW1fcyAqZmNwaW0gPSBCRkFfRkNQSU0oYmZhKTsKIAlzdHJ1Y3QgYmZpX2lvaW1fcnNwX3MgKnJzcCA9IChzdHJ1Y3QgYmZpX2lvaW1fcnNwX3MgKikgbTsKIAlzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbTsKIAl1MTYJaW90YWc7CkBAIC0yNTA3LDcgKzI1NDUsNyBAQAogdm9pZAogYmZhX2lvaW1fZ29vZF9jb21wX2lzcihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbSkKIHsKLQlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSA9IEJGQV9GQ1BJTV9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKGJmYSk7CiAJc3RydWN0IGJmaV9pb2ltX3JzcF9zICpyc3AgPSAoc3RydWN0IGJmaV9pb2ltX3JzcF9zICopIG07CiAJc3RydWN0IGJmYV9pb2ltX3MgKmlvaW07CiAJdTE2CWlvdGFnOwpAQCAtMjU3MywxOCArMjYxMSwyMSBAQAogYmZhX2lvaW1fYWxsb2Moc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFkX2lvaW1fcyAqZGlvLAogCQlzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLCB1MTYgbnNnZXMpCiB7Ci0Jc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBCRkFfRkNQSU1fTU9EKGJmYSk7CisJc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSA9IEJGQV9GQ1BJTShiZmEpOwogCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltOworCXN0cnVjdCBiZmFfaW90YWdfcyAqaW90YWcgPSBOVUxMOwogCiAJLyoKIAkgKiBhbG9jYXRlIElPSU0gcmVzb3VyY2UKIAkgKi8KLQliZmFfcV9kZXEoJmZjcGltLT5pb2ltX2ZyZWVfcSwgJmlvaW0pOwotCWlmICghaW9pbSkgeworCWJmYV9xX2RlcSgmZmNwaW0tPmZjcC0+aW90YWdfaW9pbV9mcmVlX3EsICZpb3RhZyk7CisJaWYgKCFpb3RhZykgewogCQliZmFfc3RhdHMoaXRuaW0sIG5vX2lvdGFncyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAorCWlvaW0gPSBCRkFfSU9JTV9GUk9NX1RBRyhmY3BpbSwgaW90YWctPnRhZyk7CisKIAlpb2ltLT5kaW8gPSBkaW87CiAJaW9pbS0+aXRuaW0gPSBpdG5pbTsKIAlpb2ltLT5uc2dlcyA9IG5zZ2VzOwpAQCAtMjYwMSw3ICsyNjQyLDggQEAKIHZvaWQKIGJmYV9pb2ltX2ZyZWUoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCiB7Ci0Jc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBpb2ltLT5mY3BpbTsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gaW9pbS0+ZmNwaW07CisJc3RydWN0IGJmYV9pb3RhZ19zICppb3RhZzsKIAogCWlmIChpb2ltLT5uc2dwZ3MgPiAwKQogCQliZmFfc2dwZ19tZnJlZShpb2ltLT5iZmEsICZpb2ltLT5zZ3BnX3EsIGlvaW0tPm5zZ3Bncyk7CkBAIC0yNjEwLDggKzI2NTIsMTcgQEAKIAlmY3BpbS0+aW9zX2FjdGl2ZS0tOwogCiAJaW9pbS0+aW90YWcgJj0gQkZBX0lPSU1fSU9UQUdfTUFTSzsKKworCVdBUk5fT04oIShpb2ltLT5pb3RhZyA8CisJCShmY3BpbS0+ZmNwLT5udW1faW9pbV9yZXFzICsgZmNwaW0tPmZjcC0+bnVtX2Z3dGlvX3JlcXMpKSk7CisJaW90YWcgPSBCRkFfSU9UQUdfRlJPTV9UQUcoZmNwaW0tPmZjcCwgaW9pbS0+aW90YWcpOworCisJaWYgKGlvaW0tPmlvdGFnIDwgZmNwaW0tPmZjcC0+bnVtX2lvaW1fcmVxcykKKwkJbGlzdF9hZGRfdGFpbCgmaW90YWctPnFlLCAmZmNwaW0tPmZjcC0+aW90YWdfaW9pbV9mcmVlX3EpOworCWVsc2UKKwkJbGlzdF9hZGRfdGFpbCgmaW90YWctPnFlLCAmZmNwaW0tPmZjcC0+aW90YWdfdGlvX2ZyZWVfcSk7CisKIAlsaXN0X2RlbCgmaW9pbS0+cWUpOwotCWxpc3RfYWRkX3RhaWwoJmlvaW0tPnFlLCAmZmNwaW0tPmlvaW1fZnJlZV9xKTsKIH0KIAogdm9pZApAQCAtMzAyMSw3ICszMDcyLDcgQEAKIAkgKiBidWlsZCBpL28gcmVxdWVzdCBtZXNzYWdlIG5leHQKIAkgKi8KIAliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX1RTS0lNLCBCRklfVFNLSU1fSDJJX1RNX1JFUSwKLQkJCWJmYV9scHVpZCh0c2tpbS0+YmZhKSk7CisJCQliZmFfZm5fbHB1KHRza2ltLT5iZmEpKTsKIAogCW0tPnRza190YWcgPSBjcHVfdG9fYmUxNih0c2tpbS0+dHNrX3RhZyk7CiAJbS0+aXRuX2ZoZGwgPSB0c2tpbS0+aXRuaW0tPnJwb3J0LT5md19oYW5kbGU7CkBAIC0zMDMyLDcgKzMwODMsNyBAQAogCS8qCiAJICogcXVldWUgSS9PIG1lc3NhZ2UgdG8gZmlybXdhcmUKIAkgKi8KLQliZmFfcmVxcV9wcm9kdWNlKHRza2ltLT5iZmEsIGl0bmltLT5yZXFxKTsKKwliZmFfcmVxcV9wcm9kdWNlKHRza2ltLT5iZmEsIGl0bmltLT5yZXFxLCBtLT5taCk7CiAJcmV0dXJuIEJGQV9UUlVFOwogfQogCkBAIC0zMDU2LDE0ICszMTA3LDE0IEBACiAJICogYnVpbGQgaS9vIHJlcXVlc3QgbWVzc2FnZSBuZXh0CiAJICovCiAJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19UU0tJTSwgQkZJX1RTS0lNX0gySV9BQk9SVF9SRVEsCi0JCQliZmFfbHB1aWQodHNraW0tPmJmYSkpOworCQkJYmZhX2ZuX2xwdSh0c2tpbS0+YmZhKSk7CiAKIAltLT50c2tfdGFnICA9IGNwdV90b19iZTE2KHRza2ltLT50c2tfdGFnKTsKIAogCS8qCiAJICogcXVldWUgSS9PIG1lc3NhZ2UgdG8gZmlybXdhcmUKIAkgKi8KLQliZmFfcmVxcV9wcm9kdWNlKHRza2ltLT5iZmEsIGl0bmltLT5yZXFxKTsKKwliZmFfcmVxcV9wcm9kdWNlKHRza2ltLT5iZmEsIGl0bmltLT5yZXFxLCBtLT5taCk7CiAJcmV0dXJuIEJGQV9UUlVFOwogfQogCkBAIC0zMTI5LDE0ICszMTgwLDE2IEBACiAgKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24uCiAgKi8KIHZvaWQKLWJmYV90c2tpbV9hdHRhY2goc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0sIHN0cnVjdCBiZmFfbWVtaW5mb19zICptaW5mbykKK2JmYV90c2tpbV9hdHRhY2goc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSkKIHsKIAlzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltOworCXN0cnVjdCBiZmFfZmNwX21vZF9zCSpmY3AgPSBmY3BpbS0+ZmNwOwogCXUxNglpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmZjcGltLT50c2tpbV9mcmVlX3EpOworCUlOSVRfTElTVF9IRUFEKCZmY3BpbS0+dHNraW1fdW51c2VkX3EpOwogCi0JdHNraW0gPSAoc3RydWN0IGJmYV90c2tpbV9zICopIGJmYV9tZW1pbmZvX2t2YShtaW5mbyk7CisJdHNraW0gPSAoc3RydWN0IGJmYV90c2tpbV9zICopIGJmYV9tZW1fa3ZhX2N1cnAoZmNwKTsKIAlmY3BpbS0+dHNraW1fYXJyID0gdHNraW07CiAKIAlmb3IgKGkgPSAwOyBpIDwgZmNwaW0tPm51bV90c2tpbV9yZXFzOyBpKyssIHRza2ltKyspIHsKQEAgLTMxNTUsMTMgKzMyMDgsMTMgQEAKIAkJbGlzdF9hZGRfdGFpbCgmdHNraW0tPnFlLCAmZmNwaW0tPnRza2ltX2ZyZWVfcSk7CiAJfQogCi0JYmZhX21lbWluZm9fa3ZhKG1pbmZvKSA9ICh1OCAqKSB0c2tpbTsKKwliZmFfbWVtX2t2YV9jdXJwKGZjcCkgPSAodTggKikgdHNraW07CiB9CiAKIHZvaWQKIGJmYV90c2tpbV9pc3Ioc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm0pCiB7Ci0Jc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0gPSBCRkFfRkNQSU1fTU9EKGJmYSk7CisJc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSA9IEJGQV9GQ1BJTShiZmEpOwogCXN0cnVjdCBiZmlfdHNraW1fcnNwX3MgKnJzcCA9IChzdHJ1Y3QgYmZpX3Rza2ltX3JzcF9zICopIG07CiAJc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbTsKIAl1MTYJdHNrX3RhZyA9IGJlMTZfdG9fY3B1KHJzcC0+dHNrX3RhZyk7CkBAIC0zMTg4LDcgKzMyNDEsNyBAQAogc3RydWN0IGJmYV90c2tpbV9zICoKIGJmYV90c2tpbV9hbGxvYyhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYWRfdHNraW1fcyAqZHRzaykKIHsKLQlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbSA9IEJGQV9GQ1BJTV9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKGJmYSk7CiAJc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbTsKIAogCWJmYV9xX2RlcSgmZmNwaW0tPnRza2ltX2ZyZWVfcSwgJnRza2ltKTsKQEAgLTMyMzMsMyArMzI4NiwyMTQgQEAKIAlsaXN0X2FkZF90YWlsKCZ0c2tpbS0+cWUsICZpdG5pbS0+dHNrX3EpOwogCWJmYV9zbV9zZW5kX2V2ZW50KHRza2ltLCBCRkFfVFNLSU1fU01fU1RBUlQpOwogfQorCit2b2lkCitiZmFfdHNraW1fcmVzX3JlY2ZnKHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgbnVtX3Rza2ltX2Z3KQoreworCXN0cnVjdCBiZmFfZmNwaW1fcwkqZmNwaW0gPSBCRkFfRkNQSU0oYmZhKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpxZTsKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IGkgPCAoZmNwaW0tPm51bV90c2tpbV9yZXFzIC0gbnVtX3Rza2ltX2Z3KTsgaSsrKSB7CisJCWJmYV9xX2RlcV90YWlsKCZmY3BpbS0+dHNraW1fZnJlZV9xLCAmcWUpOworCQlsaXN0X2FkZF90YWlsKHFlLCAmZmNwaW0tPnRza2ltX3VudXNlZF9xKTsKKwl9Cit9CisKKy8qIEJGQSBGQ1AgbW9kdWxlIC0gcGFyZW50IG1vZHVsZSBmb3IgZmNwaW0gKi8KKworQkZBX01PRFVMRShmY3ApOworCitzdGF0aWMgdm9pZAorYmZhX2ZjcF9tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pbmZvLAorCQlzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2ZjcF9tb2RfcyAqZmNwID0gQkZBX0ZDUF9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX21lbV9rdmFfcyAqZmNwX2t2YSA9IEJGQV9NRU1fRkNQX0tWQShiZmEpOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zICpzZWdfcHRyOworCXUxNgluc2VncywgaWR4LCBwZXJfc2VnX2lvcywgbnVtX2lvX3JlcTsKKwl1MzIJa21fbGVuID0gMDsKKworCS8qCisJICogWkVSTyBmb3IgbnVtX2lvaW1fcmVxcyBhbmQgbnVtX2Z3dGlvX3JlcXMgaXMgYWxsb3dlZCBjb25maWcgdmFsdWUuCisJICogU28gaWYgdGhlIHZhbHVlcyBhcmUgbm9uIHplcm8sIGFkanVzdCB0aGVtIGFwcHJvcHJpYXRlbHkuCisJICovCisJaWYgKGNmZy0+ZndjZmcubnVtX2lvaW1fcmVxcyAmJgorCSAgICBjZmctPmZ3Y2ZnLm51bV9pb2ltX3JlcXMgPCBCRkFfSU9JTV9NSU4pCisJCWNmZy0+ZndjZmcubnVtX2lvaW1fcmVxcyA9IEJGQV9JT0lNX01JTjsKKwllbHNlIGlmIChjZmctPmZ3Y2ZnLm51bV9pb2ltX3JlcXMgPiBCRkFfSU9JTV9NQVgpCisJCWNmZy0+ZndjZmcubnVtX2lvaW1fcmVxcyA9IEJGQV9JT0lNX01BWDsKKworCWlmIChjZmctPmZ3Y2ZnLm51bV9md3Rpb19yZXFzID4gQkZBX0ZXVElPX01BWCkKKwkJY2ZnLT5md2NmZy5udW1fZnd0aW9fcmVxcyA9IEJGQV9GV1RJT19NQVg7CisKKwludW1faW9fcmVxID0gKGNmZy0+ZndjZmcubnVtX2lvaW1fcmVxcyArIGNmZy0+ZndjZmcubnVtX2Z3dGlvX3JlcXMpOworCWlmIChudW1faW9fcmVxID4gQkZBX0lPX01BWCkgeworCQlpZiAoY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzICYmIGNmZy0+ZndjZmcubnVtX2Z3dGlvX3JlcXMpIHsKKwkJCWNmZy0+ZndjZmcubnVtX2lvaW1fcmVxcyA9IEJGQV9JT19NQVgvMjsKKwkJCWNmZy0+ZndjZmcubnVtX2Z3dGlvX3JlcXMgPSBCRkFfSU9fTUFYLzI7CisJCX0gZWxzZSBpZiAoY2ZnLT5md2NmZy5udW1fZnd0aW9fcmVxcykKKwkJCWNmZy0+ZndjZmcubnVtX2Z3dGlvX3JlcXMgPSBCRkFfRldUSU9fTUFYOworCQllbHNlCisJCQljZmctPmZ3Y2ZnLm51bV9pb2ltX3JlcXMgPSBCRkFfSU9JTV9NQVg7CisJfQorCisJYmZhX2ZjcGltX21lbWluZm8oY2ZnLCAma21fbGVuKTsKKworCW51bV9pb19yZXEgPSAoY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzICsgY2ZnLT5md2NmZy5udW1fZnd0aW9fcmVxcyk7CisJa21fbGVuICs9IG51bV9pb19yZXEgKiBzaXplb2Yoc3RydWN0IGJmYV9pb3RhZ19zKTsKKwlrbV9sZW4gKz0gY2ZnLT5md2NmZy5udW1fcnBvcnRzICogc2l6ZW9mKHN0cnVjdCBiZmFfaXRuX3MpOworCisJLyogZG1hIG1lbW9yeSAqLworCW5zZWdzID0gQkZJX01FTV9ETUFfTlNFR1MobnVtX2lvX3JlcSwgQkZJX0lPSU1fU05TTEVOKTsKKwlwZXJfc2VnX2lvcyA9IEJGSV9NRU1fTlJFUVNfU0VHKEJGSV9JT0lNX1NOU0xFTik7CisKKwliZmFfbWVtX2RtYV9zZWdfaXRlcihmY3AsIHNlZ19wdHIsIG5zZWdzLCBpZHgpIHsKKwkJaWYgKG51bV9pb19yZXEgPj0gcGVyX3NlZ19pb3MpIHsKKwkJCW51bV9pb19yZXEgLT0gcGVyX3NlZ19pb3M7CisJCQliZmFfbWVtX2RtYV9zZXR1cChtaW5mbywgc2VnX3B0ciwKKwkJCQlwZXJfc2VnX2lvcyAqIEJGSV9JT0lNX1NOU0xFTik7CisJCX0gZWxzZQorCQkJYmZhX21lbV9kbWFfc2V0dXAobWluZm8sIHNlZ19wdHIsCisJCQkJbnVtX2lvX3JlcSAqIEJGSV9JT0lNX1NOU0xFTik7CisJfQorCisJLyoga3ZhIG1lbW9yeSAqLworCWJmYV9tZW1fa3ZhX3NldHVwKG1pbmZvLCBmY3Bfa3ZhLCBrbV9sZW4pOworfQorCitzdGF0aWMgdm9pZAorYmZhX2ZjcF9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKKwkJc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQoreworCXN0cnVjdCBiZmFfZmNwX21vZF9zICpmY3AgPSBCRkFfRkNQX01PRChiZmEpOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zICpzZWdfcHRyOworCXUxNglpZHgsIG5zZWdzLCBudW1faW9fcmVxOworCisJZmNwLT5udW1faW9pbV9yZXFzID0gY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzOworCWZjcC0+bnVtX2Z3dGlvX3JlcXMgID0gY2ZnLT5md2NmZy5udW1fZnd0aW9fcmVxczsKKwlmY3AtPm51bV9pdG5zICAgPSBjZmctPmZ3Y2ZnLm51bV9ycG9ydHM7CisJZmNwLT5iZmEgPSBiZmE7CisKKwkvKgorCSAqIFNldHVwIHRoZSBwb29sIG9mIHNuc2Jhc2UgYWRkcidzLCB0aGF0IGlzIHBhc3NlZCB0byBmdyBhcworCSAqIHBhcnQgb2YgYmZpX2lvY2ZjX2NmZ19zLgorCSAqLworCW51bV9pb19yZXEgPSAoY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzICsgY2ZnLT5md2NmZy5udW1fZnd0aW9fcmVxcyk7CisJbnNlZ3MgPSBCRklfTUVNX0RNQV9OU0VHUyhudW1faW9fcmVxLCBCRklfSU9JTV9TTlNMRU4pOworCisJYmZhX21lbV9kbWFfc2VnX2l0ZXIoZmNwLCBzZWdfcHRyLCBuc2VncywgaWR4KSB7CisKKwkJaWYgKCFiZmFfbWVtX2RtYV92aXJ0KHNlZ19wdHIpKQorCQkJYnJlYWs7CisKKwkJZmNwLT5zbnNiYXNlW2lkeF0ucGEgPSBiZmFfbWVtX2RtYV9waHlzKHNlZ19wdHIpOworCQlmY3AtPnNuc2Jhc2VbaWR4XS5rdmEgPSBiZmFfbWVtX2RtYV92aXJ0KHNlZ19wdHIpOworCQliZmFfaW9jZmNfc2V0X3Nuc2Jhc2UoYmZhLCBpZHgsIGZjcC0+c25zYmFzZVtpZHhdLnBhKTsKKwl9CisKKwliZmFfZmNwaW1fYXR0YWNoKGZjcCwgYmZhZCwgY2ZnLCBwY2lkZXYpOworCisJYmZhX2lvdGFnX2F0dGFjaChmY3ApOworCisJZmNwLT5pdG5fYXJyID0gKHN0cnVjdCBiZmFfaXRuX3MgKikgYmZhX21lbV9rdmFfY3VycChmY3ApOworCWJmYV9tZW1fa3ZhX2N1cnAoZmNwKSA9ICh1OCAqKWZjcC0+aXRuX2FyciArCisJCQkoZmNwLT5udW1faXRucyAqIHNpemVvZihzdHJ1Y3QgYmZhX2l0bl9zKSk7CisJbWVtc2V0KGZjcC0+aXRuX2FyciwgMCwKKwkJCShmY3AtPm51bV9pdG5zICogc2l6ZW9mKHN0cnVjdCBiZmFfaXRuX3MpKSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNwX2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY3Bfc3RhcnQoc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNwX3N0b3Aoc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNwX2lvY2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9mY3BfbW9kX3MgKmZjcCA9IEJGQV9GQ1BfTU9EKGJmYSk7CisKKwkvKiBFbnF1ZXVlIHVudXNlZCBpb2ltIHJlc291cmNlcyB0byBmcmVlX3EgKi8KKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJmZjcC0+aW90YWdfdW51c2VkX3EsICZmY3AtPmlvdGFnX2lvaW1fZnJlZV9xKTsKKworCWJmYV9mY3BpbV9pb2NkaXNhYmxlKGZjcCk7Cit9CisKK3ZvaWQKK2JmYV9mY3BfcmVzX3JlY2ZnKHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgbnVtX2lvaW1fZncpCit7CisJc3RydWN0IGJmYV9mY3BfbW9kX3MJKm1vZCA9IEJGQV9GQ1BfTU9EKGJmYSk7CisJc3RydWN0IGxpc3RfaGVhZAkqcWU7CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKG1vZC0+bnVtX2lvaW1fcmVxcyAtIG51bV9pb2ltX2Z3KTsgaSsrKSB7CisJCWJmYV9xX2RlcV90YWlsKCZtb2QtPmlvdGFnX2lvaW1fZnJlZV9xLCAmcWUpOworCQlsaXN0X2FkZF90YWlsKHFlLCAmbW9kLT5pb3RhZ191bnVzZWRfcSk7CisJfQorfQorCit2b2lkCitiZmFfaXRuX2NyZWF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9ycG9ydF9zICpycG9ydCwKKwkJdm9pZCAoKmlzcikoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm0pKQoreworCXN0cnVjdCBiZmFfZmNwX21vZF9zICpmY3AgPSBCRkFfRkNQX01PRChiZmEpOworCXN0cnVjdCBiZmFfaXRuX3MgKml0bjsKKworCWl0biA9ICBCRkFfSVROX0ZST01fVEFHKGZjcCwgcnBvcnQtPnJwb3J0X3RhZyk7CisJaXRuLT5pc3IgPSBpc3I7Cit9CisKKy8qCisgKiBJdG4gaW50ZXJydXB0IHByb2Nlc3NpbmcuCisgKi8KK3ZvaWQKK2JmYV9pdG5faXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptKQoreworCXN0cnVjdCBiZmFfZmNwX21vZF9zICpmY3AgPSBCRkFfRkNQX01PRChiZmEpOworCXVuaW9uIGJmaV9pdG5faTJoX21zZ191IG1zZzsKKwlzdHJ1Y3QgYmZhX2l0bl9zICppdG47CisKKwltc2cubXNnID0gbTsKKwlpdG4gPSAgQkZBX0lUTl9GUk9NX1RBRyhmY3AsIG1zZy5jcmVhdGVfcnNwLT5iZmFfaGFuZGxlKTsKKworCWlmIChpdG4tPmlzcikKKwkJaXRuLT5pc3IoYmZhLCBtKTsKKwllbHNlCisJCVdBUk5fT04oMSk7Cit9CisKK3ZvaWQKK2JmYV9pb3RhZ19hdHRhY2goc3RydWN0IGJmYV9mY3BfbW9kX3MgKmZjcCkKK3sKKwlzdHJ1Y3QgYmZhX2lvdGFnX3MgKmlvdGFnOworCXUxNgludW1faW9fcmVxLCBpOworCisJaW90YWcgPSAoc3RydWN0IGJmYV9pb3RhZ19zICopIGJmYV9tZW1fa3ZhX2N1cnAoZmNwKTsKKwlmY3AtPmlvdGFnX2FyciA9IGlvdGFnOworCisJSU5JVF9MSVNUX0hFQUQoJmZjcC0+aW90YWdfaW9pbV9mcmVlX3EpOworCUlOSVRfTElTVF9IRUFEKCZmY3AtPmlvdGFnX3Rpb19mcmVlX3EpOworCUlOSVRfTElTVF9IRUFEKCZmY3AtPmlvdGFnX3VudXNlZF9xKTsKKworCW51bV9pb19yZXEgPSBmY3AtPm51bV9pb2ltX3JlcXMgKyBmY3AtPm51bV9md3Rpb19yZXFzOworCWZvciAoaSA9IDA7IGkgPCBudW1faW9fcmVxOyBpKyssIGlvdGFnKyspIHsKKwkJbWVtc2V0KGlvdGFnLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9pb3RhZ19zKSk7CisJCWlvdGFnLT50YWcgPSBpOworCQlpZiAoaSA8IGZjcC0+bnVtX2lvaW1fcmVxcykKKwkJCWxpc3RfYWRkX3RhaWwoJmlvdGFnLT5xZSwgJmZjcC0+aW90YWdfaW9pbV9mcmVlX3EpOworCQllbHNlCisJCQlsaXN0X2FkZF90YWlsKCZpb3RhZy0+cWUsICZmY3AtPmlvdGFnX3Rpb19mcmVlX3EpOworCX0KKworCWJmYV9tZW1fa3ZhX2N1cnAoZmNwKSA9ICh1OCAqKSBpb3RhZzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5oCmluZGV4IDFlMzhkYWQuLjU3YjY5NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uaApAQCAtMjQsNiArMjQsMzQgQEAKICNpbmNsdWRlICJiZmFfZGVmc19zdmMuaCIKICNpbmNsdWRlICJiZmFfY3MuaCIKIAorLyogRkNQIG1vZHVsZSByZWxhdGVkIGRlZmluaXRpb25zICovCisjZGVmaW5lIEJGQV9JT19NQVgJQkZJX0lPX01BWAorI2RlZmluZSBCRkFfRldUSU9fTUFYCTIwMDAKKworc3RydWN0IGJmYV9mY3BfbW9kX3M7CitzdHJ1Y3QgYmZhX2lvdGFnX3MgeworCXN0cnVjdCBsaXN0X2hlYWQJcWU7CS8qIHF1ZXVlIGVsZW1lbnQJKi8KKwl1MTYJdGFnOwkJCS8qIEZXIElPIHRhZwkJKi8KK307CisKK3N0cnVjdCBiZmFfaXRuX3MgeworCWJmYV9pc3JfZnVuY190IGlzcjsKK307CisKK3ZvaWQgYmZhX2l0bl9jcmVhdGUoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfcnBvcnRfcyAqcnBvcnQsCisJCXZvaWQgKCppc3IpKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptKSk7Cit2b2lkIGJmYV9pdG5faXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptKTsKK3ZvaWQgYmZhX2lvdGFnX2F0dGFjaChzdHJ1Y3QgYmZhX2ZjcF9tb2RfcyAqZmNwKTsKK3ZvaWQgYmZhX2ZjcF9yZXNfcmVjZmcoc3RydWN0IGJmYV9zICpiZmEsIHUxNiBudW1faW9pbV9mdyk7CisKKyNkZWZpbmUgQkZBX0ZDUF9NT0QoX2hhbCkJKCYoX2hhbCktPm1vZHVsZXMuZmNwX21vZCkKKyNkZWZpbmUgQkZBX01FTV9GQ1BfS1ZBKF9fYmZhKQkoJihCRkFfRkNQX01PRChfX2JmYSktPmt2YV9zZWcpKQorI2RlZmluZSBCRkFfSU9UQUdfRlJPTV9UQUcoX2ZjcCwgX3RhZykJXAorCSgmKF9mY3ApLT5pb3RhZ19hcnJbKF90YWcgJiBCRkFfSU9JTV9JT1RBR19NQVNLKV0pCisjZGVmaW5lIEJGQV9JVE5fRlJPTV9UQUcoX2ZjcCwgX3RhZykJXAorCSgoX2ZjcCktPml0bl9hcnIgKyAoKF90YWcpICYgKChfZmNwKS0+bnVtX2l0bnMgLSAxKSkpCisjZGVmaW5lIEJGQV9TTlNJTkZPX0ZST01fVEFHKF9mY3AsIF90YWcpIFwKKwliZmFfbWVtX2dldF9kbWFidWZfa3ZhKF9mY3AsIF90YWcsIEJGSV9JT0lNX1NOU0xFTikKIAogI2RlZmluZSBCRkFfSVROSU1fTUlOICAgMzIKICNkZWZpbmUgQkZBX0lUTklNX01BWCAgIDEwMjQKQEAgLTc1LDI1ICsxMDMsMjQgQEAKIAogdHlwZWRlZiB2b2lkICAgICgqYmZhX2ZjcGltX3Byb2ZpbGVfdCkgKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKIAotc3RydWN0IGJmYV9mY3BpbV9tb2RfcyB7CitzdHJ1Y3QgYmZhX2ZjcGltX3MgewogCXN0cnVjdCBiZmFfcwkJKmJmYTsKKwlzdHJ1Y3QgYmZhX2ZjcF9tb2RfcwkqZmNwOwogCXN0cnVjdCBiZmFfaXRuaW1fcwkqaXRuaW1fYXJyOwogCXN0cnVjdCBiZmFfaW9pbV9zCSppb2ltX2FycjsKIAlzdHJ1Y3QgYmZhX2lvaW1fc3BfcwkqaW9pbV9zcF9hcnI7CiAJc3RydWN0IGJmYV90c2tpbV9zCSp0c2tpbV9hcnI7Ci0Jc3RydWN0IGJmYV9kbWFfcwlzbnNiYXNlOwogCWludAkJCW51bV9pdG5pbXM7Ci0JaW50CQkJbnVtX2lvaW1fcmVxczsKIAlpbnQJCQludW1fdHNraW1fcmVxczsKIAl1MzIJCQlwYXRoX3RvdjsKIAl1MTYJCQlxX2RlcHRoOwogCXU4CQkJcmVxcTsJCS8qICBSZXF1ZXN0IHF1ZXVlIHRvIGJlIHVzZWQgKi8KIAl1OAkJCXJzdmQ7CiAJc3RydWN0IGxpc3RfaGVhZAlpdG5pbV9xOwkvKiAgcXVldWUgb2YgYWN0aXZlIGl0bmltICovCi0Jc3RydWN0IGxpc3RfaGVhZAlpb2ltX2ZyZWVfcTsJLyogIGZyZWUgSU8gcmVzb3VyY2VzCSovCiAJc3RydWN0IGxpc3RfaGVhZAlpb2ltX3Jlc2ZyZWVfcTsgLyogIElPcyB3YWl0aW5nIGZvciBmL3cgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWlvaW1fY29tcF9xOwkvKiAgSU8gZ2xvYmFsIGNvbXAgUQkqLwogCXN0cnVjdCBsaXN0X2hlYWQJdHNraW1fZnJlZV9xOworCXN0cnVjdCBsaXN0X2hlYWQJdHNraW1fdW51c2VkX3E7CS8qIFVudXNlZCB0c2tpbSBRICovCiAJdTMyCQkJaW9zX2FjdGl2ZTsJLyogIGN1cnJlbnQgYWN0aXZlIElPcwkqLwogCXUzMgkJCWRlbGF5X2NvbXA7CiAJc3RydWN0IGJmYV9mY3BpbV9kZWxfaXRuX3N0YXRzX3MgZGVsX2l0bl9zdGF0czsKQEAgLTEwNCw2ICsxMzEsMjUgQEAKIAliZmFfZmNwaW1fcHJvZmlsZV90ICAgICBwcm9maWxlX3N0YXJ0OwogfTsKIAorLyogTWF4IEZDUCBkbWEgc2VncyByZXF1aXJlZCAqLworI2RlZmluZSBCRkFfRkNQX0RNQV9TRUdTCUJGSV9JT0lNX1NOU0JVRl9TRUdTCisKK3N0cnVjdCBiZmFfZmNwX21vZF9zIHsKKwlzdHJ1Y3QgYmZhX3MJCSpiZmE7CisJc3RydWN0IGxpc3RfaGVhZAlpb3RhZ19pb2ltX2ZyZWVfcTsJLyogZnJlZSBJTyByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWlvdGFnX3Rpb19mcmVlX3E7CS8qIGZyZWUgSU8gcmVzb3VyY2VzICovCisJc3RydWN0IGxpc3RfaGVhZAlpb3RhZ191bnVzZWRfcTsJLyogdW51c2VkIElPIHJlc291cmNlcyovCisJc3RydWN0IGJmYV9pb3RhZ19zCSppb3RhZ19hcnI7CisJc3RydWN0IGJmYV9pdG5fcwkqaXRuX2FycjsKKwlpbnQJCQludW1faW9pbV9yZXFzOworCWludAkJCW51bV9md3Rpb19yZXFzOworCWludAkJCW51bV9pdG5zOworCXN0cnVjdCBiZmFfZG1hX3MJc25zYmFzZVtCRkFfRkNQX0RNQV9TRUdTXTsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MJZmNwaW07CisJc3RydWN0IGJmYV9tZW1fZG1hX3MJZG1hX3NlZ1tCRkFfRkNQX0RNQV9TRUdTXTsKKwlzdHJ1Y3QgYmZhX21lbV9rdmFfcwlrdmFfc2VnOworfTsKKwogLyoKICAqIEJGQSBJTyAoaW5pdGlhdG9yIG1vZGUpCiAgKi8KQEAgLTExMSw3ICsxNTcsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJcWU7CQkvKiAgcXVldWUgZWxlbWVtdAkqLwogCWJmYV9zbV90CQlzbTsJCS8qICBCRkEgaW9pbSBzdGF0ZSBtYWNoaW5lICovCiAJc3RydWN0IGJmYV9zCQkqYmZhOwkJLyogIEJGQSBtb2R1bGUJKi8KLQlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zCSpmY3BpbTsJCS8qICBwYXJlbnQgZmNwaW0gbW9kdWxlICovCisJc3RydWN0IGJmYV9mY3BpbV9zCSpmY3BpbTsJCS8qICBwYXJlbnQgZmNwaW0gbW9kdWxlICovCiAJc3RydWN0IGJmYV9pdG5pbV9zCSppdG5pbTsJCS8qICBpLXQtbiBuZXh1cyBmb3IgdGhpcyBJTyAgKi8KIAlzdHJ1Y3QgYmZhZF9pb2ltX3MJKmRpbzsJCS8qICBkcml2ZXIgSU8gaGFuZGxlCSovCiAJdTE2CQkJaW90YWc7CQkvKiAgRldJIElPIHRhZwkqLwpAQCAtMTI5LDcgKzE3NSw2IEBACiAKIHN0cnVjdCBiZmFfaW9pbV9zcF9zIHsKIAlzdHJ1Y3QgYmZpX21zZ19zCWNvbXBfcnNwbXNnOwkvKiAgSU8gY29tcCBmL3cgcmVzcG9uc2UgKi8KLQl1OAkJCSpzbnNpbmZvOwkvKiAgc2Vuc2UgaW5mbyBmb3IgdGhpcyBJTyAgICovCiAJc3RydWN0IGJmYV9zZ3BnX3dxZV9zCXNncGdfd3FlOwkvKiAgd2FpdHEgZWxlbSBmb3Igc2dwZwkqLwogCXN0cnVjdCBiZmFfcmVxcV93YWl0X3MJcmVxcV93YWl0OwkvKiAgdG8gd2FpdCBmb3Igcm9vbSBpbiByZXFxICovCiAJYmZhX2Jvb2xlYW5fdAkJYWJvcnRfZXhwbGljaXQ7CS8qICBhYm9ydGVkIGJ5IE9TCSovCkBAIC0xNDMsNyArMTg4LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXFlOwogCWJmYV9zbV90CQlzbTsKIAlzdHJ1Y3QgYmZhX3MJCSpiZmE7CS8qICBCRkEgbW9kdWxlICAqLwotCXN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgICpmY3BpbTsJLyogIHBhcmVudCBmY3BpbSBtb2R1bGUJKi8KKwlzdHJ1Y3QgYmZhX2ZjcGltX3MJKmZjcGltOwkvKiAgcGFyZW50IGZjcGltIG1vZHVsZQkqLwogCXN0cnVjdCBiZmFfaXRuaW1fcwkqaXRuaW07CS8qICBpLXQtbiBuZXh1cyBmb3IgdGhpcyBJTyAgKi8KIAlzdHJ1Y3QgYmZhZF90c2tpbV9zCSpkdHNrOyAgLyogIGRyaXZlciB0YXNrIG1nbXQgY21uZAkqLwogCWJmYV9ib29sZWFuX3QJCW5vdGlmeTsJLyogIG5vdGlmeSBpdG5pbSBvbiBUTSBjb21wICAqLwpAQCAtMTgyLDEzICsyMjcsMTMgQEAKIAlzdHJ1Y3QgYmZhX3djX3MJd2M7CQkvKiAgd2FpdGluZyBjb3VudGVyCSovCiAJc3RydWN0IGJmYV90aW1lcl9zIHRpbWVyOwkvKiAgcGVuZGluZyBJTyBUT1YJICovCiAJc3RydWN0IGJmYV9yZXFxX3dhaXRfcyByZXFxX3dhaXQ7IC8qICB0byB3YWl0IGZvciByb29tIGluIHJlcXEgKi8KLQlzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICpmY3BpbTsJLyogIGZjcGltIG1vZHVsZQkqLworCXN0cnVjdCBiZmFfZmNwaW1fcyAqZmNwaW07CS8qICBmY3BpbSBtb2R1bGUJKi8KIAlzdHJ1Y3QgYmZhX2l0bmltX2lvc3RhdHNfcwlzdGF0czsKIAlzdHJ1Y3QgYmZhX2l0bmltX2lvcHJvZmlsZV9zICBpb3Byb2ZpbGU7CiB9OwogCiAjZGVmaW5lIGJmYV9pdG5pbV9pc19vbmxpbmUoX2l0bmltKSAoKF9pdG5pbSktPmlzX29ubGluZSkKLSNkZWZpbmUgQkZBX0ZDUElNX01PRChfaGFsKSAoJihfaGFsKS0+bW9kdWxlcy5mY3BpbV9tb2QpCisjZGVmaW5lIEJGQV9GQ1BJTShfaGFsKQkoJihfaGFsKS0+bW9kdWxlcy5mY3BfbW9kLmZjcGltKQogI2RlZmluZSBCRkFfSU9JTV9UQUdfMl9JRChfaW90YWcpCSgoX2lvdGFnKSAmIEJGQV9JT0lNX0lPVEFHX01BU0spCiAjZGVmaW5lIEJGQV9JT0lNX0ZST01fVEFHKF9mY3BpbSwgX2lvdGFnKQlcCiAJKCZmY3BpbS0+aW9pbV9hcnJbKF9pb3RhZyAmIEJGQV9JT0lNX0lPVEFHX01BU0spXSkKQEAgLTE5Niw5ICsyNDEsOSBAQAogCSgmZmNwaW0tPnRza2ltX2FycltfdG10YWcgJiAoZmNwaW0tPm51bV90c2tpbV9yZXFzIC0gMSldKQogCiAjZGVmaW5lIGJmYV9pb19wcm9maWxlX3N0YXJ0X3RpbWUoX2JmYSkJXAotCShfYmZhLT5tb2R1bGVzLmZjcGltX21vZC5pb19wcm9maWxlX3N0YXJ0X3RpbWUpCisJKChfYmZhKS0+bW9kdWxlcy5mY3BfbW9kLmZjcGltLmlvX3Byb2ZpbGVfc3RhcnRfdGltZSkKICNkZWZpbmUgYmZhX2ZjcGltX2dldF9pb19wcm9maWxlKF9iZmEpCVwKLQkoX2JmYS0+bW9kdWxlcy5mY3BpbV9tb2QuaW9fcHJvZmlsZSkKKwkoKF9iZmEpLT5tb2R1bGVzLmZjcF9tb2QuZmNwaW0uaW9fcHJvZmlsZSkKICNkZWZpbmUgYmZhX2lvaW1fdXBkYXRlX2lvdGFnKF9faW9pbSkgZG8gewkJCQlcCiAJdWludDE2X3QgayA9IChfX2lvaW0pLT5pb3RhZyA+PiBCRkFfSU9JTV9SRVRSWV9UQUdfT0ZGU0VUOwlcCiAJaysrOyAoX19pb2ltKS0+aW90YWcgJj0gQkZBX0lPSU1fSU9UQUdfTUFTSzsJCQlcCkBAIC0yMTcsOCArMjYyLDcgQEAKIC8qCiAgKiBmdW5jdGlvbiBwcm90b3R5cGVzCiAgKi8KLXZvaWQJYmZhX2lvaW1fYXR0YWNoKHN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltLAotCQkJCQlzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWluZm8pOwordm9pZAliZmFfaW9pbV9hdHRhY2goc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSk7CiB2b2lkCWJmYV9pb2ltX2lzcihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbXNnKTsKIHZvaWQJYmZhX2lvaW1fZ29vZF9jb21wX2lzcihzdHJ1Y3QgYmZhX3MgKmJmYSwKIAkJCQkJc3RydWN0IGJmaV9tc2dfcyAqbXNnKTsKQEAgLTIyOCwxOCArMjcyLDE1IEBACiB2b2lkCWJmYV9pb2ltX2lvY2Rpc2FibGUoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pOwogdm9pZAliZmFfaW9pbV90b3Yoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pOwogCi12b2lkCWJmYV90c2tpbV9hdHRhY2goc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqZmNwaW0sCi0JCQkJCXN0cnVjdCBiZmFfbWVtaW5mb19zICptaW5mbyk7Cit2b2lkCWJmYV90c2tpbV9hdHRhY2goc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSk7CiB2b2lkCWJmYV90c2tpbV9pc3Ioc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm1zZyk7CiB2b2lkCWJmYV90c2tpbV9pb2RvbmUoc3RydWN0IGJmYV90c2tpbV9zICp0c2tpbSk7CiB2b2lkCWJmYV90c2tpbV9pb2NkaXNhYmxlKHN0cnVjdCBiZmFfdHNraW1fcyAqdHNraW0pOwogdm9pZAliZmFfdHNraW1fY2xlYW51cChzdHJ1Y3QgYmZhX3Rza2ltX3MgKnRza2ltKTsKK3ZvaWQJYmZhX3Rza2ltX3Jlc19yZWNmZyhzdHJ1Y3QgYmZhX3MgKmJmYSwgdTE2IG51bV90c2tpbV9mdyk7CiAKLXZvaWQJYmZhX2l0bmltX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmttX2xlbiwKLQkJCQkJdTMyICpkbV9sZW4pOwotdm9pZAliZmFfaXRuaW1fYXR0YWNoKHN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltLAotCQkJCQlzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWluZm8pOwotdm9pZAliZmFfaXRuaW1fZGV0YWNoKHN0cnVjdCBiZmFfZmNwaW1fbW9kX3MgKmZjcGltKTsKK3ZvaWQJYmZhX2l0bmltX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmttX2xlbik7Cit2b2lkCWJmYV9pdG5pbV9hdHRhY2goc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSk7CiB2b2lkCWJmYV9pdG5pbV9pb2NkaXNhYmxlKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pOwogdm9pZAliZmFfaXRuaW1faXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptc2cpOwogdm9pZAliZmFfaXRuaW1faW9kb25lKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pOwpAQCAtMjUyLDEzICsyOTMsMTcgQEAKIHZvaWQJYmZhX2ZjcGltX3BhdGhfdG92X3NldChzdHJ1Y3QgYmZhX3MgKmJmYSwgdTE2IHBhdGhfdG92KTsKIHUxNgliZmFfZmNwaW1fcGF0aF90b3ZfZ2V0KHN0cnVjdCBiZmFfcyAqYmZhKTsKIHUxNgliZmFfZmNwaW1fcWRlcHRoX2dldChzdHJ1Y3QgYmZhX3MgKmJmYSk7CitiZmFfc3RhdHVzX3QgYmZhX2ZjcGltX3BvcnRfaW9zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwKKwkJCXN0cnVjdCBiZmFfaXRuaW1faW9zdGF0c19zICpzdGF0cywgdTggbHBfdGFnKTsKK3ZvaWQgYmZhX2ZjcGltX2FkZF9zdGF0cyhzdHJ1Y3QgYmZhX2l0bmltX2lvc3RhdHNfcyAqZmNwaW1fc3RhdHMsCisJCQlzdHJ1Y3QgYmZhX2l0bmltX2lvc3RhdHNfcyAqaXRuaW1fc3RhdHMpOwogCiAjZGVmaW5lIGJmYV9mY3BpbV9pb3JlZGlyZWN0X2VuYWJsZWQoX19iZmEpCQkJCVwKLQkoKChzdHJ1Y3QgYmZhX2ZjcGltX21vZF9zICopKEJGQV9GQ1BJTV9NT0QoX19iZmEpKSktPmlvcmVkaXJlY3QpCisJKCgoc3RydWN0IGJmYV9mY3BpbV9zICopKEJGQV9GQ1BJTShfX2JmYSkpKS0+aW9yZWRpcmVjdCkKIAogI2RlZmluZSBiZmFfZmNwaW1fZ2V0X25leHRfcmVxcShfX2JmYSwgX19xaWQpCQkJCVwKIHsJCQkJCQkJCQlcCi0Jc3RydWN0IGJmYV9mY3BpbV9tb2RfcyAqX19mY3BpbSA9IEJGQV9GQ1BJTV9NT0QoX19iZmEpOyAgICAgIFwKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKl9fZmNwaW0gPSBCRkFfRkNQSU0oX19iZmEpOyAgICAgIFwKIAlfX2ZjcGltLT5yZXFxKys7CQkJCQkJXAogCV9fZmNwaW0tPnJlcXEgJj0gKEJGSV9JT0NfTUFYX0NRUyAtIDEpOyAgICAgIFwKIAkqKF9fcWlkKSA9IF9fZmNwaW0tPnJlcXE7CQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5jCmluZGV4IDliNDNjYTQuLmE5YjIyYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5jCkBAIC05MiwyNSArOTIsNDkgQEAKIHZvaWQKIGJmYV9mY3NfaW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpCiB7Ci0JaW50CQlpLCBucGJjX3Zwb3J0czsKKwlpbnQJaTsKIAlzdHJ1Y3QgYmZhX2Zjc19tb2RfcyAgKm1vZDsKLQlzdHJ1Y3QgYmZpX3BiY192cG9ydF9zIHBiY192cG9ydHNbQkZJX1BCQ19NQVhfVlBPUlRTXTsKIAogCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoZmNzX21vZHVsZXMpIC8gc2l6ZW9mKGZjc19tb2R1bGVzWzBdKTsgaSsrKSB7CiAJCW1vZCA9ICZmY3NfbW9kdWxlc1tpXTsKIAkJaWYgKG1vZC0+bW9kaW5pdCkKIAkJCW1vZC0+bW9kaW5pdChmY3MpOwogCX0KK30KKworLyoKKyAqIEZDUyB1cGRhdGUgY2ZnIC0gcmVzZXQgdGhlIHB3d24vbnd3biBvZiBmYWJyaWMgYmFzZSBsb2dpY2FsIHBvcnQKKyAqIHdpdGggdmFsdWVzIGxlYXJuZWQgZHVyaW5nIGJmYV9pbml0IGZpcm13YXJlIEdFVEFUVFIgUkVRLgorICovCit2b2lkCitiZmFfZmNzX3VwZGF0ZV9jZmcoc3RydWN0IGJmYV9mY3NfcyAqZmNzKQoreworCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMgPSAmZmNzLT5mYWJyaWM7CisJc3RydWN0IGJmYV9scG9ydF9jZmdfcyAqcG9ydF9jZmcgPSAmZmFicmljLT5icG9ydC5wb3J0X2NmZzsKKwlzdHJ1Y3QgYmZhX2lvY19zICppb2MgPSAmZmFicmljLT5mY3MtPmJmYS0+aW9jOworCisJcG9ydF9jZmctPm53d24gPSBpb2MtPmF0dHItPm53d247CisJcG9ydF9jZmctPnB3d24gPSBpb2MtPmF0dHItPnB3d247Cit9CisKKy8qCisgKiBmY3MgcGJjIHZwb3J0IGluaXRpYWxpemF0aW9uCisgKi8KK3ZvaWQKK2JmYV9mY3NfcGJjX3Zwb3J0X2luaXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKQoreworCWludCBpLCBucGJjX3Zwb3J0czsKKwlzdHJ1Y3QgYmZpX3BiY192cG9ydF9zIHBiY192cG9ydHNbQkZJX1BCQ19NQVhfVlBPUlRTXTsKKwogCS8qIEluaXRpYWxpemUgcGJjIHZwb3J0cyAqLwogCWlmICghZmNzLT5taW5fY2ZnKSB7CiAJCW5wYmNfdnBvcnRzID0KLQkJICAgIGJmYV9pb2NmY19nZXRfcGJjX3Zwb3J0cyhmY3MtPmJmYSwgcGJjX3Zwb3J0cyk7CisJCQliZmFfaW9jZmNfZ2V0X3BiY192cG9ydHMoZmNzLT5iZmEsIHBiY192cG9ydHMpOwogCQlmb3IgKGkgPSAwOyBpIDwgbnBiY192cG9ydHM7IGkrKykKIAkJCWJmYV9mY2JfcGJjX3Zwb3J0X2NyZWF0ZShmY3MtPmJmYS0+YmZhZCwgcGJjX3Zwb3J0c1tpXSk7CiAJfQogfQogCi0KIC8qCiAgKglicmllZgogICoJCUZDUyBkcml2ZXIgZGV0YWlscyBpbml0aWFsaXphdGlvbi4KQEAgLTE2OCwxMSArMTkyLDE0IEBACiAjZGVmaW5lIEJGQV9GQ1NfRkFCUklDX0NMRUFOVVBfREVMQVkJKDEwMDAwKQkvKiBNaWxsaXNlY29uZHMgKi8KIAogI2RlZmluZSBiZmFfZmNzX2ZhYnJpY19zZXRfb3BlcnR5cGUoX19mYWJyaWMpIGRvIHsJCQlcCi0JCWlmIChiZmFfZmNwb3J0X2dldF90b3BvbG9neSgoX19mYWJyaWMpLT5mY3MtPmJmYSkJXAotCQkgICAgPT0gQkZBX1BPUlRfVE9QT0xPR1lfUDJQKQkJCQlcCisJaWYgKGJmYV9mY3BvcnRfZ2V0X3RvcG9sb2d5KChfX2ZhYnJpYyktPmZjcy0+YmZhKQkJXAorCQkJCT09IEJGQV9QT1JUX1RPUE9MT0dZX1AyUCkgewkJXAorCQlpZiAoZmFicmljLT5mYWJfdHlwZSA9PSBCRkFfRkNTX0ZBQlJJQ19TV0lUQ0hFRCkJXAogCQkJKF9fZmFicmljKS0+b3Blcl90eXBlID0gQkZBX1BPUlRfVFlQRV9OUE9SVDsJXAogCQllbHNlCQkJCQkJCVwKLQkJCShfX2ZhYnJpYyktPm9wZXJfdHlwZSA9IEJGQV9QT1JUX1RZUEVfTkxQT1JUOwlcCisJCQkoX19mYWJyaWMpLT5vcGVyX3R5cGUgPSBCRkFfUE9SVF9UWVBFX1AyUDsJXAorCX0gZWxzZQkJCQkJCQkJXAorCQkoX19mYWJyaWMpLT5vcGVyX3R5cGUgPSBCRkFfUE9SVF9UWVBFX05MUE9SVDsJCVwKIH0gd2hpbGUgKDApCiAKIC8qCkBAIC0xOTYsNiArMjIzLDkgQEAKIAkJCQkJIHUzMiByc3BfbGVuLAogCQkJCQkgdTMyIHJlc2lkX2xlbiwKIAkJCQkJIHN0cnVjdCBmY2hzX3MgKnJzcGZjaHMpOworc3RhdGljIHU4IGJmYV9mY3NfZmFicmljX29wZXJfYmJzY24oc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYyk7CitzdGF0aWMgYmZhX2Jvb2xlYW5fdCBiZmFfZmNzX2ZhYnJpY19pc19iYnNjbl9lbmFibGVkKAorCQkJCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMpOwogCiBzdGF0aWMgdm9pZAliZmFfZmNzX2ZhYnJpY19zbV91bmluaXQoc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYywKIAkJCQkJIGVudW0gYmZhX2Zjc19mYWJyaWNfZXZlbnQgZXZlbnQpOwpAQCAtMjY5LDggKzI5OSw4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9ERUxFVEU6Ci0JCWJmYV9zbV9zZXRfc3RhdGUoZmFicmljLCBiZmFfZmNzX2ZhYnJpY19zbV91bmluaXQpOwotCQliZmFfd2NfZG93bigmZmFicmljLT5mY3MtPndjKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX2RlbGV0aW5nKTsKKwkJYmZhX2Zjc19mYWJyaWNfZGVsZXRlKGZhYnJpYyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTMyMiw3ICszNTIsOCBAQAogCWNhc2UgQkZBX0ZDU19GQUJSSUNfU01fQ09OVF9PUDoKIAogCQliZmFfZmNwb3J0X3NldF90eF9iYmNyZWRpdChmYWJyaWMtPmZjcy0+YmZhLAotCQkJCQkgICBmYWJyaWMtPmJiX2NyZWRpdCk7CisJCQkJCSAgIGZhYnJpYy0+YmJfY3JlZGl0LAorCQkJCQkgICBiZmFfZmNzX2ZhYnJpY19vcGVyX2Jic2NuKGZhYnJpYykpOwogCQlmYWJyaWMtPmZhYl90eXBlID0gQkZBX0ZDU19GQUJSSUNfU1dJVENIRUQ7CiAKIAkJaWYgKGZhYnJpYy0+YXV0aF9yZXFkICYmIGZhYnJpYy0+aXNfYXV0aCkgewpAQCAtMzUwLDcgKzM4MSw4IEBACiAJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9OT19GQUJSSUM6CiAJCWZhYnJpYy0+ZmFiX3R5cGUgPSBCRkFfRkNTX0ZBQlJJQ19OMk47CiAJCWJmYV9mY3BvcnRfc2V0X3R4X2JiY3JlZGl0KGZhYnJpYy0+ZmNzLT5iZmEsCi0JCQkJCSAgIGZhYnJpYy0+YmJfY3JlZGl0KTsKKwkJCQkJICAgZmFicmljLT5iYl9jcmVkaXQsCisJCQkJCSAgIGJmYV9mY3NfZmFicmljX29wZXJfYmJzY24oZmFicmljKSk7CiAJCWJmYV9mY3NfZmFicmljX25vdGlmeV9vbmxpbmUoZmFicmljKTsKIAkJYmZhX3NtX3NldF9zdGF0ZShmYWJyaWMsIGJmYV9mY3NfZmFicmljX3NtX25vZmFicmljKTsKIAkJYnJlYWs7CkBAIC01MTgsNyArNTUwLDExIEBACiAJY2FzZSBCRkFfRkNTX0ZBQlJJQ19TTV9OT19GQUJSSUM6CiAJCWJmYV90cmMoZmFicmljLT5mY3MsIGZhYnJpYy0+YmJfY3JlZGl0KTsKIAkJYmZhX2ZjcG9ydF9zZXRfdHhfYmJjcmVkaXQoZmFicmljLT5mY3MtPmJmYSwKLQkJCQkJICAgZmFicmljLT5iYl9jcmVkaXQpOworCQkJCQkgICBmYWJyaWMtPmJiX2NyZWRpdCwKKwkJCQkJICAgYmZhX2Zjc19mYWJyaWNfb3Blcl9iYnNjbihmYWJyaWMpKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfRkFCUklDX1NNX1JFVFJZX09QOgogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC03NjQsNiArODAwLDEwIEBACiAKIAljYXNlIEJGQV9TVEFUVVNfRkFCUklDX1JKVDoKIAkJZmFicmljLT5zdGF0cy5mbG9naV9yZWplY3RzKys7CisJCWlmIChmYWJyaWMtPmxwcy0+bHNyanRfcnNuID09IEZDX0xTX1JKVF9SU05fTE9HSUNBTF9FUlJPUiAmJgorCQkgICAgZmFicmljLT5scHMtPmxzcmp0X2V4cGwgPT0gRkNfTFNfUkpUX0VYUF9OT19BRERMX0lORk8pCisJCQlmYWJyaWMtPmZjcy0+YmJzY25fZmxvZ2lfcmp0ID0gQkZBX1RSVUU7CisKIAkJYmZhX3NtX3NlbmRfZXZlbnQoZmFicmljLCBCRkFfRkNTX0ZBQlJJQ19TTV9SRVRSWV9PUCk7CiAJCXJldHVybjsKIApAQCAtNzkzLDYgKzgzMyw3IEBACiAJCSAqLwogCQlmYWJyaWMtPmJwb3J0LnBvcnRfdG9wby5wbjJuLnJlbV9wb3J0X3d3biA9CiAJCQlmYWJyaWMtPmxwcy0+cHJfcHd3bjsKKwkJZmFicmljLT5mYWJfdHlwZSA9IEJGQV9GQ1NfRkFCUklDX04yTjsKIAkJYmZhX3NtX3NlbmRfZXZlbnQoZmFicmljLCBCRkFfRkNTX0ZBQlJJQ19TTV9OT19GQUJSSUMpOwogCX0KIApAQCAtODA4LDEzICs4NDksMTcgQEAKIHsKIAlzdHJ1Y3QgYmZhX3MJCSpiZmEgPSBmYWJyaWMtPmZjcy0+YmZhOwogCXN0cnVjdCBiZmFfbHBvcnRfY2ZnX3MJKnBjZmcgPSAmZmFicmljLT5icG9ydC5wb3J0X2NmZzsKLQl1OAkJCWFscGEgPSAwOworCXU4CQkJYWxwYSA9IDAsIGJiX3NjbiA9IDA7CiAKIAlpZiAoYmZhX2ZjcG9ydF9nZXRfdG9wb2xvZ3koYmZhKSA9PSBCRkFfUE9SVF9UT1BPTE9HWV9MT09QKQogCQlhbHBhID0gYmZhX2ZjcG9ydF9nZXRfbXlhbHBhKGJmYSk7CiAKKwlpZiAoYmZhX2Zjc19mYWJyaWNfaXNfYmJzY25fZW5hYmxlZChmYWJyaWMpICYmCisJICAgICghZmFicmljLT5mY3MtPmJic2NuX2Zsb2dpX3JqdCkpCisJCWJiX3NjbiA9IEJGQV9GQ1NfUE9SVF9ERUZfQkJfU0NOOworCiAJYmZhX2xwc19mbG9naShmYWJyaWMtPmxwcywgZmFicmljLCBhbHBhLCBiZmFfZmNwb3J0X2dldF9tYXhmcnNpemUoYmZhKSwKLQkJICAgICAgcGNmZy0+cHd3biwgcGNmZy0+bnd3biwgZmFicmljLT5hdXRoX3JlcWQpOworCQkgICAgICBwY2ZnLT5wd3duLCBwY2ZnLT5ud3duLCBmYWJyaWMtPmF1dGhfcmVxZCwgYmJfc2NuKTsKIAogCWZhYnJpYy0+c3RhdHMuZmxvZ2lfc2VudCsrOwogfQpAQCAtODczLDYgKzkxOCw0MCBAQAogfQogCiAvKgorICogQ29tcHV0ZXMgb3BlcmF0aW5nIEJCX1NDTiB2YWx1ZQorICovCitzdGF0aWMgdTgKK2JmYV9mY3NfZmFicmljX29wZXJfYmJzY24oc3RydWN0IGJmYV9mY3NfZmFicmljX3MgKmZhYnJpYykKK3sKKwl1OAlwcl9iYnNjbiA9IGZhYnJpYy0+bHBzLT5wcl9iYnNjbjsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRChmYWJyaWMtPmZjcy0+YmZhKTsKKworCWlmICghKGZjcG9ydC0+Y2ZnLmJiX3Njbl9zdGF0ZSAmJiBwcl9iYnNjbikpCisJCXJldHVybiAwOworCisJLyogcmV0dXJuIG1heCBvZiBsb2NhbC9yZW1vdGUgYmJfc2NuIHZhbHVlcyAqLworCXJldHVybiAoKHByX2Jic2NuID4gQkZBX0ZDU19QT1JUX0RFRl9CQl9TQ04pID8KKwkJcHJfYmJzY24gOiBCRkFfRkNTX1BPUlRfREVGX0JCX1NDTik7Cit9CisKKy8qCisgKiBDaGVjayBpZiBCQl9TQ04gY2FuIGJlIGVuYWJsZWQuCisgKi8KK3N0YXRpYyBiZmFfYm9vbGVhbl90CitiZmFfZmNzX2ZhYnJpY19pc19iYnNjbl9lbmFibGVkKHN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zICpmYWJyaWMpCit7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoZmFicmljLT5mY3MtPmJmYSk7CisKKwlpZiAoYmZhX2lvY19nZXRfZmNtb2RlKCZmYWJyaWMtPmZjcy0+YmZhLT5pb2MpICYmCisJCQlmY3BvcnQtPmNmZy5iYl9zY25fc3RhdGUgJiYKKwkJCSFiZmFfZmNwb3J0X2lzX3Fvc19lbmFibGVkKGZhYnJpYy0+ZmNzLT5iZmEpICYmCisJCQkhYmZhX2ZjcG9ydF9pc190cnVua19lbmFibGVkKGZhYnJpYy0+ZmNzLT5iZmEpKQorCQlyZXR1cm4gQkZBX1RSVUU7CisJZWxzZQorCQlyZXR1cm4gQkZBX0ZBTFNFOworfQorCisvKgogICogRGVsZXRlIGFsbCB2cG9ydHMgYW5kIHdhaXQgZm9yIHZwb3J0IGRlbGV0ZSBjb21wbGV0aW9ucy4KICAqLwogc3RhdGljIHZvaWQKQEAgLTk4OSw2ICsxMDY4LDcgQEAKIGJmYV9mY3NfZmFicmljX2xpbmtfZG93bihzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyAqZmFicmljKQogewogCWJmYV90cmMoZmFicmljLT5mY3MsIGZhYnJpYy0+YnBvcnQucG9ydF9jZmcucHd3bik7CisJZmFicmljLT5mY3MtPmJic2NuX2Zsb2dpX3JqdCA9IEJGQV9GQUxTRTsKIAliZmFfc21fc2VuZF9ldmVudChmYWJyaWMsIEJGQV9GQ1NfRkFCUklDX1NNX0xJTktfRE9XTik7CiB9CiAKQEAgLTExOTIsNiArMTI3Miw3IEBACiAJfQogCiAJZmFicmljLT5iYl9jcmVkaXQgPSBiZTE2X3RvX2NwdShmbG9naS0+Y3NwLmJiY3JlZCk7CisJZmFicmljLT5scHMtPnByX2Jic2NuID0gKGJlMTZfdG9fY3B1KGZsb2dpLT5jc3AucnhzeikgPj4gMTIpOwogCWJwb3J0LT5wb3J0X3RvcG8ucG4ybi5yZW1fcG9ydF93d24gPSBmbG9naS0+cG9ydF9uYW1lOwogCWJwb3J0LT5wb3J0X3RvcG8ucG4ybi5yZXBseV9veGlkID0gZmNocy0+b3hfaWQ7CiAKQEAgLTEyMjQsOSArMTMwNSwxMCBAQAogCQkJCSAgICBuMm5fcG9ydC0+cmVwbHlfb3hpZCwgcGNmZy0+cHd3biwKIAkJCQkgICAgcGNmZy0+bnd3biwKIAkJCQkgICAgYmZhX2ZjcG9ydF9nZXRfbWF4ZnJzaXplKGJmYSksCi0JCQkJICAgIGJmYV9mY3BvcnRfZ2V0X3J4X2JiY3JlZGl0KGJmYSkpOworCQkJCSAgICBiZmFfZmNwb3J0X2dldF9yeF9iYmNyZWRpdChiZmEpLAorCQkJCSAgICBiZmFfZmNzX2ZhYnJpY19vcGVyX2Jic2NuKGZhYnJpYykpOwogCi0JYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBmYWJyaWMtPnZmX2lkLCBmYWJyaWMtPmxwcy0+bHBfdGFnLAorCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgZmFicmljLT52Zl9pZCwgZmFicmljLT5scHMtPmJmYV90YWcsCiAJCSAgICAgIEJGQV9GQUxTRSwgRkNfQ0xBU1NfMywKIAkJICAgICAgcmVxbGVuLCAmZmNocywgYmZhX2Zjc19mYWJyaWNfZmxvZ2lhY2NfY29tcCwgZmFicmljLAogCQkgICAgICBGQ19NQVhfUERVU1osIDApOwpAQCAtMTI5OCw2ICsxMzgwLDQ1IEBACiB9CiAKIC8qCisgKglSZXR1cm4gdGhlIGxpc3Qgb2YgbG9jYWwgbG9naWNhbCBwb3J0cyBwcmVzZW50IGluIHRoZSBnaXZlbiBWRi4KKyAqCisgKglAcGFyYW1baW5dCXZmCXZmIGZvciB3aGljaCBsb2dpY2FsIHBvcnRzIGFyZSByZXR1cm5lZAorICoJQHBhcmFtW291dF0JbHB3d24JcmV0dXJuZWQgbG9naWNhbCBwb3J0IHd3biBsaXN0CisgKglAcGFyYW1baW4sb3V0XQlubHBvcnRzIGluOnNpemUgb2YgbHB3d24gbGlzdDsKKyAqCQkJCW91dDp0b3RhbCBlbGVtZW50cyBwcmVzZW50LAorICoJCQkJYWN0dWFsIGVsZW1lbnRzIHJldHVybmVkIGlzIGxpbWl0ZWQgYnkgdGhlIHNpemUKKyAqLwordm9pZAorYmZhX2Zjc192Zl9nZXRfcG9ydHMoYmZhX2Zjc192Zl90ICp2Ziwgd3duX3QgbHB3d25bXSwgaW50ICpubHBvcnRzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnFlOworCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0OworCWludAlpID0gMDsKKwlzdHJ1Y3QgYmZhX2Zjc19zCSpmY3M7CisKKwlpZiAodmYgPT0gTlVMTCB8fCBscHd3biA9PSBOVUxMIHx8ICpubHBvcnRzID09IDApCisJCXJldHVybjsKKworCWZjcyA9IHZmLT5mY3M7CisKKwliZmFfdHJjKGZjcywgdmYtPnZmX2lkKTsKKwliZmFfdHJjKGZjcywgKHVpbnQzMl90KSAqbmxwb3J0cyk7CisKKwlscHd3bltpKytdID0gdmYtPmJwb3J0LnBvcnRfY2ZnLnB3d247CisKKwlsaXN0X2Zvcl9lYWNoKHFlLCAmdmYtPnZwb3J0X3EpIHsKKwkJaWYgKGkgPj0gKm5scG9ydHMpCisJCQlicmVhazsKKworCQl2cG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICopIHFlOworCQlscHd3bltpKytdID0gdnBvcnQtPmxwb3J0LnBvcnRfY2ZnLnB3d247CisJfQorCisJYmZhX3RyYyhmY3MsIGkpOworCSpubHBvcnRzID0gaTsKK30KKworLyoKICAqIEJGQSBGQ1MgUFBPUlQgKCBwaHlzaWNhbCBwb3J0KQogICovCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuaAppbmRleCA2MWNkY2U0Li5hNWYxZmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuaApAQCAtMjU0LDYgKzI1NCw5IEBACiAjZGVmaW5lIEJGQV9GQ1NfUE9SVF9TWU1CTkFNRV9PU0lORk9fU1oJCQk0OAogI2RlZmluZSBCRkFfRkNTX1BPUlRfU1lNQk5BTUVfT1NQQVRDSF9TWgkJMTYKIAorLyogYmJfc2NuIHZhbHVlIGluIDJeYmJfc2NuICovCisjZGVmaW5lIEJGQV9GQ1NfUE9SVF9ERUZfQkJfU0NOCQkJCTMKKwogLyoKICAqIEdldCBGQyBwb3J0IElEIGZvciBhIGxvZ2ljYWwgcG9ydC4KICAqLwpAQCAtMzc5LDYgKzM4Miw3IEBACiB2b2lkIGJmYV9mY3NfdnBvcnRfb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCk7CiB2b2lkIGJmYV9mY3NfdnBvcnRfZGVsZXRlX2NvbXAoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpOwogdm9pZCBiZmFfZmNzX3Zwb3J0X2Zjc19kZWxldGUoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpOwordm9pZCBiZmFfZmNzX3Zwb3J0X3N0b3BfY29tcChzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCk7CiAKICNkZWZpbmUgQkZBX0ZDU19SUE9SVF9ERUZfREVMX1RJTUVPVVQJOTAJLyogaW4gc2VjcyAqLwogI2RlZmluZSBCRkFfRkNTX1JQT1JUX01BWF9SRVRSSUVTCSg1KQpAQCAtNDIwLDYgKzQyNCw3IEBACiAJZW51bSBmY19jb3MJZmNfY29zOwkvKiAgRkMgY2xhc3NlcyBvZiBzZXJ2aWNlIHN1cHAgKi8KIAliZmFfYm9vbGVhbl90CWNpc2M7CS8qICBDSVNDIGNhcGFibGUgZGV2aWNlICovCiAJYmZhX2Jvb2xlYW5fdAlwcmxvOwkvKiAgcHJvY2Vzc2luZyBwcmxvIG9yIExPR08gKi8KKwliZmFfYm9vbGVhbl90CXBsb2dpX3BlbmRpbmc7CS8qIFJ4IFBsb2dpIFBlbmRpbmcgKi8KIAl3d25fdAlwd3duOwkvKiAgcG9ydCB3d24gb2YgcnBvcnQgKi8KIAl3d25fdAlud3duOwkvKiAgbm9kZSB3d24gb2YgcnBvcnQgKi8KIAlzdHJ1Y3QgYmZhX3Jwb3J0X3N5bW5hbWVfcyBwc3ltX25hbWU7IC8qICBwb3J0IHN5bWJvbGljIG5hbWUgICovCkBAIC00NDcsNiArNDUyLDggQEAKIC8qCiAgKiBiZmEgZmNzIHJwb3J0IEFQSSBmdW5jdGlvbnMKICAqLwordm9pZCBiZmFfZmNzX3Jwb3J0X2dldF9hdHRyKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJc3RydWN0IGJmYV9ycG9ydF9hdHRyX3MgKmF0dHIpOwogc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqYmZhX2Zjc19ycG9ydF9sb29rdXAoc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqcG9ydCwKIAkJCQkJICAgICB3d25fdCBycHd3bik7CiBzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpiZmFfZmNzX3Jwb3J0X2xvb2t1cF9ieV9ud3duKApAQCAtNTkxLDEwICs1OTgsMjEgQEAKIHZvaWQgYmZhX2Zjc19mY3BpbV91Zl9yZWN2KHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltLAogCQkJc3RydWN0IGZjaHNfcyAqZmNocywgdTE2IGxlbik7CiAKLSNkZWZpbmUJQkZBX0ZDU19GRE1JX1NVUE9SVEVEX1NQRUVEUyAgKEZETUlfVFJBTlNfU1BFRURfMUcgIHwJXAotCQkJCSAgICAgICBGRE1JX1RSQU5TX1NQRUVEXzJHIHwJXAotCQkJCSAgICAgICBGRE1JX1RSQU5TX1NQRUVEXzRHIHwJXAotCQkJCSAgICAgICBGRE1JX1RSQU5TX1NQRUVEXzhHKQorI2RlZmluZSBCRkFfRkNTX0ZETUlfU1VQUF9TUEVFRFNfNEcJKEZETUlfVFJBTlNfU1BFRURfMUcgIHwJXAorCQkJCUZETUlfVFJBTlNfU1BFRURfMkcgfAkJXAorCQkJCUZETUlfVFJBTlNfU1BFRURfNEcpCisKKyNkZWZpbmUgQkZBX0ZDU19GRE1JX1NVUFBfU1BFRURTXzhHCShGRE1JX1RSQU5TX1NQRUVEXzFHICB8CVwKKwkJCQlGRE1JX1RSQU5TX1NQRUVEXzJHIHwJCVwKKwkJCQlGRE1JX1RSQU5TX1NQRUVEXzRHIHwJCVwKKwkJCQlGRE1JX1RSQU5TX1NQRUVEXzhHKQorCisjZGVmaW5lIEJGQV9GQ1NfRkRNSV9TVVBQX1NQRUVEU18xNkcJKEZETUlfVFJBTlNfU1BFRURfMkcgIHwJXAorCQkJCUZETUlfVFJBTlNfU1BFRURfNEcgfAkJXAorCQkJCUZETUlfVFJBTlNfU1BFRURfOEcgfAkJXAorCQkJCUZETUlfVFJBTlNfU1BFRURfMTZHKQorCisjZGVmaW5lIEJGQV9GQ1NfRkRNSV9TVVBQX1NQRUVEU18xMEcJRkRNSV9UUkFOU19TUEVFRF8xMEcKIAogLyoKICAqIEhCQSBBdHRyaWJ1dGUgQmxvY2sgOiBCRkEgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uIE5vdGUgOiBTb21lIHZhcmlhYmxlCkBAIC02NDksNiArNjY3LDggQEAKIAlzdHJ1Y3QgYmZhX3RyY19tb2RfcyAgKnRyY21vZDsJLyogIHRyYWNpbmcgbW9kdWxlICovCiAJYmZhX2Jvb2xlYW5fdAl2Zl9lbmFibGVkOwkvKiAgVkYgbW9kZSBpcyBlbmFibGVkICovCiAJYmZhX2Jvb2xlYW5fdAlmZG1pX2VuYWJsZWQ7CS8qICBGRE1JIGlzIGVuYWJsZWQgKi8KKwliZmFfYm9vbGVhbl90CWJic2NuX2VuYWJsZWQ7CS8qICBEcml2ZXIgQ29uZmlnIFBhcmFtZXRlciAqLworCWJmYV9ib29sZWFuX3QJYmJzY25fZmxvZ2lfcmp0Oy8qICBGTE9HSSByZWplY3QgZHVlIHRvIEJCX1NDTiAqLwogCWJmYV9ib29sZWFuX3QgbWluX2NmZzsJCS8qIG1pbiBjZmcgZW5hYmxlZC9kaXNhYmxlZCAqLwogCXUxNglwb3J0X3ZmaWQ7CS8qICBwb3J0IGRlZmF1bHQgVkYgSUQgKi8KIAlzdHJ1Y3QgYmZhX2Zjc19kcml2ZXJfaW5mb19zIGRyaXZlcl9pbmZvOwpAQCAtNzE1LDYgKzczNSw4IEBACiAJCSAgICBzdHJ1Y3QgYmZhZF9zICpiZmFkLAogCQkgICAgYmZhX2Jvb2xlYW5fdCBtaW5fY2ZnKTsKIHZvaWQgYmZhX2Zjc19pbml0KHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7Cit2b2lkIGJmYV9mY3NfcGJjX3Zwb3J0X2luaXQoc3RydWN0IGJmYV9mY3NfcyAqZmNzKTsKK3ZvaWQgYmZhX2Zjc191cGRhdGVfY2ZnKHN0cnVjdCBiZmFfZmNzX3MgKmZjcyk7CiB2b2lkIGJmYV9mY3NfZHJpdmVyX2luZm9faW5pdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsCiAJCQkgICAgICBzdHJ1Y3QgYmZhX2Zjc19kcml2ZXJfaW5mb19zICpkcml2ZXJfaW5mbyk7CiB2b2lkIGJmYV9mY3NfZXhpdChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MpOwpAQCAtNzIzLDYgKzc0NSw3IEBACiAgKiBiZmEgZmNzIHZmIHB1YmxpYyBmdW5jdGlvbnMKICAqLwogYmZhX2Zjc192Zl90ICpiZmFfZmNzX3ZmX2xvb2t1cChzdHJ1Y3QgYmZhX2Zjc19zICpmY3MsIHUxNiB2Zl9pZCk7Cit2b2lkIGJmYV9mY3NfdmZfZ2V0X3BvcnRzKGJmYV9mY3NfdmZfdCAqdmYsIHd3bl90IHZwd3duW10sIGludCAqbnBvcnRzKTsKIAogLyoKICAqIGZhYnJpYyBwcm90ZWN0ZWQgaW50ZXJmYWNlIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2ZjcGltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfZmNwaW0uYwppbmRleCBlN2I0OWY0Li4yOWI0MTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfZmNwaW0uYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfZmNwaW0uYwpAQCAtNTQsNiArNTQsNyBAQAogCUJGQV9GQ1NfSVROSU1fU01fSU5JVElBVE9SID0gOSwJLyogIHJwb3J0IGlzIGluaXRpYXRvciAqLwogCUJGQV9GQ1NfSVROSU1fU01fREVMRVRFID0gMTAsCS8qICBkZWxldGUgZXZlbnQgZnJvbSBycG9ydCAqLwogCUJGQV9GQ1NfSVROSU1fU01fUFJMTyA9IDExLAkvKiAgZGVsZXRlIGV2ZW50IGZyb20gcnBvcnQgKi8KKwlCRkFfRkNTX0lUTklNX1NNX1JTUF9OT1RfU1VQUCA9IDEyLCAvKiBjbWQgbm90IHN1cHBvcnRlZCByc3AgKi8KIH07CiAKIHN0YXRpYyB2b2lkCWJmYV9mY3NfaXRuaW1fc21fb2ZmbGluZShzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwKQEAgLTE3OCw2ICsxNzksMTAgQEAKIAkJCQlCRkFfRkNTX1JFVFJZX1RJTUVPVVQpOwogCQlicmVhazsKIAorCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9SU1BfTk9UX1NVUFA6CisJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21fb2ZmbGluZSk7CisJCWJyZWFrOworCiAJY2FzZSBCRkFfRkNTX0lUTklNX1NNX09GRkxJTkU6CiAJCWJmYV9zbV9zZXRfc3RhdGUoaXRuaW0sIGJmYV9mY3NfaXRuaW1fc21fb2ZmbGluZSk7CiAJCWJmYV9mY3hwX2Rpc2NhcmQoaXRuaW0tPmZjeHApOwpAQCAtNDQ3LDYgKzQ1Miw3IEBACiAJCQkJaXRuaW0tPnJwb3J0LT5zY3NpX2Z1bmN0aW9uID0KIAkJCQkJIEJGQV9SUE9SVF9JTklUSUFUT1I7CiAJCQkJaXRuaW0tPnN0YXRzLnBybGlfcnNwX2FjYysrOworCQkJCWl0bmltLT5zdGF0cy5pbml0aWF0b3IrKzsKIAkJCQliZmFfc21fc2VuZF9ldmVudChpdG5pbSwKIAkJCQkJCSAgQkZBX0ZDU19JVE5JTV9TTV9SU1BfT0spOwogCQkJCXJldHVybjsKQEAgLTQ3Miw2ICs0NzgsMTAgQEAKIAkJYmZhX3RyYyhpdG5pbS0+ZmNzLCBsc19yanQtPnJlYXNvbl9jb2RlX2V4cGwpOwogCiAJCWl0bmltLT5zdGF0cy5wcmxpX3JzcF9yanQrKzsKKwkJaWYgKGxzX3JqdC0+cmVhc29uX2NvZGUgPT0gRkNfTFNfUkpUX1JTTl9DTURfTk9UX1NVUFApIHsKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KGl0bmltLCBCRkFfRkNTX0lUTklNX1NNX1JTUF9OT1RfU1VQUCk7CisJCQlyZXR1cm47CisJCX0KIAkJYmZhX3NtX3NlbmRfZXZlbnQoaXRuaW0sIEJGQV9GQ1NfSVROSU1fU01fUlNQX0VSUk9SKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19scG9ydC5jCmluZGV4IDFkNmJlOGMuLmY4MjUxYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19scG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19scG9ydC5jCkBAIC03NCw2ICs3NCw3IEBACiAJQkZBX0ZDU19QT1JUX1NNX09GRkxJTkUgPSAzLAogCUJGQV9GQ1NfUE9SVF9TTV9ERUxFVEUgPSA0LAogCUJGQV9GQ1NfUE9SVF9TTV9ERUxSUE9SVCA9IDUsCisJQkZBX0ZDU19QT1JUX1NNX1NUT1AgPSA2LAogfTsKIAogc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfbHBvcnRfc21fdW5pbml0KHN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKnBvcnQsCkBAIC04Niw2ICs4Nyw4IEBACiAJCQkJCWVudW0gYmZhX2Zjc19scG9ydF9ldmVudCBldmVudCk7CiBzdGF0aWMgdm9pZCAgICAgYmZhX2Zjc19scG9ydF9zbV9kZWxldGluZyhzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpwb3J0LAogCQkJCQllbnVtIGJmYV9mY3NfbHBvcnRfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQJYmZhX2Zjc19scG9ydF9zbV9zdG9wcGluZyhzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpwb3J0LAorCQkJCQllbnVtIGJmYV9mY3NfbHBvcnRfZXZlbnQgZXZlbnQpOwogCiBzdGF0aWMgdm9pZAogYmZhX2Zjc19scG9ydF9zbV91bmluaXQoCkBAIC0xMjMsNiArMTI2LDEyIEBACiAJCWJmYV9mY3NfbHBvcnRfZGVsZXRlZChwb3J0KTsKIAkJYnJlYWs7CiAKKwljYXNlIEJGQV9GQ1NfUE9SVF9TTV9TVE9QOgorCQkvKiBJZiB2cG9ydCAtIHNlbmQgY29tcGxldGlvbiBjYWxsIGJhY2sgKi8KKwkJaWYgKHBvcnQtPnZwb3J0KQorCQkJYmZhX2Zjc192cG9ydF9zdG9wX2NvbXAocG9ydC0+dnBvcnQpOworCQlicmVhazsKKwogCWNhc2UgQkZBX0ZDU19QT1JUX1NNX09GRkxJTkU6CiAJCWJyZWFrOwogCkBAIC0xNDgsNiArMTU3LDIzIEBACiAJCWJmYV9mY3NfbHBvcnRfb2ZmbGluZV9hY3Rpb25zKHBvcnQpOwogCQlicmVhazsKIAorCWNhc2UgQkZBX0ZDU19QT1JUX1NNX1NUT1A6CisJCV9fcG9ydF9hY3Rpb25bcG9ydC0+ZmFicmljLT5mYWJfdHlwZV0ub2ZmbGluZShwb3J0KTsKKworCQlpZiAocG9ydC0+bnVtX3Jwb3J0cyA9PSAwKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHBvcnQsIGJmYV9mY3NfbHBvcnRfc21faW5pdCk7CisJCQkvKiBJZiB2cG9ydCAtIHNlbmQgY29tcGxldGlvbiBjYWxsIGJhY2sgKi8KKwkJCWlmIChwb3J0LT52cG9ydCkKKwkJCQliZmFfZmNzX3Zwb3J0X3N0b3BfY29tcChwb3J0LT52cG9ydCk7CisJCX0gZWxzZSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHBvcnQsIGJmYV9mY3NfbHBvcnRfc21fc3RvcHBpbmcpOworCQkJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZwb3J0LT5ycG9ydF9xKSB7CisJCQkJcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKSBxZTsKKwkJCQliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9ERUxFVEUpOworCQkJfQorCQl9CisJCWJyZWFrOworCiAJY2FzZSBCRkFfRkNTX1BPUlRfU01fREVMRVRFOgogCiAJCV9fcG9ydF9hY3Rpb25bcG9ydC0+ZmFicmljLT5mYWJfdHlwZV0ub2ZmbGluZShwb3J0KTsKQEAgLTE4OSw2ICsyMTUsMjEgQEAKIAkJYmZhX2Zjc19scG9ydF9vbmxpbmVfYWN0aW9ucyhwb3J0KTsKIAkJYnJlYWs7CiAKKwljYXNlIEJGQV9GQ1NfUE9SVF9TTV9TVE9QOgorCQlpZiAocG9ydC0+bnVtX3Jwb3J0cyA9PSAwKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHBvcnQsIGJmYV9mY3NfbHBvcnRfc21faW5pdCk7CisJCQkvKiBJZiB2cG9ydCAtIHNlbmQgY29tcGxldGlvbiBjYWxsIGJhY2sgKi8KKwkJCWlmIChwb3J0LT52cG9ydCkKKwkJCQliZmFfZmNzX3Zwb3J0X3N0b3BfY29tcChwb3J0LT52cG9ydCk7CisJCX0gZWxzZSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHBvcnQsIGJmYV9mY3NfbHBvcnRfc21fc3RvcHBpbmcpOworCQkJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZwb3J0LT5ycG9ydF9xKSB7CisJCQkJcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKSBxZTsKKwkJCQliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9ERUxFVEUpOworCQkJfQorCQl9CisJCWJyZWFrOworCiAJY2FzZSBCRkFfRkNTX1BPUlRfU01fREVMRVRFOgogCQlpZiAocG9ydC0+bnVtX3Jwb3J0cyA9PSAwKSB7CiAJCQliZmFfc21fc2V0X3N0YXRlKHBvcnQsIGJmYV9mY3NfbHBvcnRfc21fdW5pbml0KTsKQEAgLTIxMiw2ICsyNTMsMjggQEAKIH0KIAogc3RhdGljIHZvaWQKK2JmYV9mY3NfbHBvcnRfc21fc3RvcHBpbmcoc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqcG9ydCwKKwkJCSAgZW51bSBiZmFfZmNzX2xwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMocG9ydC0+ZmNzLCBwb3J0LT5wb3J0X2NmZy5wd3duKTsKKwliZmFfdHJjKHBvcnQtPmZjcywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19QT1JUX1NNX0RFTFJQT1JUOgorCQlpZiAocG9ydC0+bnVtX3Jwb3J0cyA9PSAwKSB7CisJCQliZmFfc21fc2V0X3N0YXRlKHBvcnQsIGJmYV9mY3NfbHBvcnRfc21faW5pdCk7CisJCQkvKiBJZiB2cG9ydCAtIHNlbmQgY29tcGxldGlvbiBjYWxsIGJhY2sgKi8KKwkJCWlmIChwb3J0LT52cG9ydCkKKwkJCQliZmFfZmNzX3Zwb3J0X3N0b3BfY29tcChwb3J0LT52cG9ydCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQocG9ydC0+ZmNzLCBldmVudCk7CisJfQorfQorCitzdGF0aWMgdm9pZAogYmZhX2Zjc19scG9ydF9zbV9kZWxldGluZygKIAlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpwb3J0LAogCWVudW0gYmZhX2Zjc19scG9ydF9ldmVudCBldmVudCkKQEAgLTI2NSw2ICszMjgsNDAgQEAKIH0KIAogLyoKKyAqIFNlbmQgYSBGQ0NUIFJlamVjdAorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19scG9ydF9zZW5kX2ZjZ3Nfcmp0KHN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKnBvcnQsCisJc3RydWN0IGZjaHNfcyAqcnhfZmNocywgdTggcmVhc29uX2NvZGUsIHU4IHJlYXNvbl9jb2RlX2V4cGwpCit7CisJc3RydWN0IGZjaHNfcyAgIGZjaHM7CisJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CisJc3RydWN0IGJmYV9ycG9ydF9zICpiZmFfcnBvcnQgPSBOVUxMOworCWludCAgICAgICAgICAgICBsZW47CisJc3RydWN0IGN0X2hkcl9zICpyeF9jdGhkciA9IChzdHJ1Y3QgY3RfaGRyX3MgKikocnhfZmNocyArIDEpOworCXN0cnVjdCBjdF9oZHJfcyAqY3RfaGRyOworCisJYmZhX3RyYyhwb3J0LT5mY3MsIHJ4X2ZjaHMtPmRfaWQpOworCWJmYV90cmMocG9ydC0+ZmNzLCByeF9mY2hzLT5zX2lkKTsKKworCWZjeHAgPSBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKKwlpZiAoIWZjeHApCisJCXJldHVybjsKKworCWN0X2hkciA9IGJmYV9mY3hwX2dldF9yZXFidWYoZmN4cCk7CisJY3RfaGRyLT5nc190eXBlID0gcnhfY3RoZHItPmdzX3R5cGU7CisJY3RfaGRyLT5nc19zdWJfdHlwZSA9IHJ4X2N0aGRyLT5nc19zdWJfdHlwZTsKKworCWxlbiA9IGZjX2dzX3JqdF9idWlsZCgmZmNocywgY3RfaGRyLCByeF9mY2hzLT5zX2lkLAorCQkJYmZhX2Zjc19scG9ydF9nZXRfZmNpZChwb3J0KSwKKwkJCXJ4X2ZjaHMtPm94X2lkLCByZWFzb25fY29kZSwgcmVhc29uX2NvZGVfZXhwbCk7CisKKwliZmFfZmN4cF9zZW5kKGZjeHAsIGJmYV9ycG9ydCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLAorCQkJQkZBX0ZBTFNFLCBGQ19DTEFTU18zLCBsZW4sICZmY2hzLCBOVUxMLCBOVUxMLAorCQkJRkNfTUFYX1BEVVNaLCAwKTsKK30KKworLyoKICAqIFByb2Nlc3MgaW5jb21pbmcgcGxvZ2kgZnJvbSBhIHJlbW90ZSBwb3J0LgogICovCiBzdGF0aWMgdm9pZApAQCAtNjQ3LDYgKzc0NCwxNiBAQAogCQkJYmZhX2Zjc19scG9ydF9hYnRzX2FjYyhscG9ydCwgZmNocyk7CiAJCXJldHVybjsKIAl9CisKKwlpZiAoZmNocy0+dHlwZSA9PSBGQ19UWVBFX1NFUlZJQ0VTKSB7CisJCS8qCisJCSAqIFVuaGFuZGxlZCBGQy1HUyBmcmFtZXMuIFNlbmQgYSBGQy1DVCBSZWplY3QKKwkJICovCisJCWJmYV9mY3NfbHBvcnRfc2VuZF9mY2dzX3JqdChscG9ydCwgZmNocywgQ1RfUlNOX05PVF9TVVBQLAorCQkJCUNUX05TX0VYUF9OT0FERElUSU9OQUwpOworCQlyZXR1cm47CisJfQorCiAJLyoKIAkgKiBsb29rIGZvciBhIG1hdGNoaW5nIHJlbW90ZSBwb3J0IElECiAJICovCkBAIC04MzUsOCArOTQyLDggQEAKIAlscG9ydC0+ZmNzID0gZmNzOwogCWxwb3J0LT5mYWJyaWMgPSBiZmFfZmNzX3ZmX2xvb2t1cChmY3MsIHZmX2lkKTsKIAlscG9ydC0+dnBvcnQgPSB2cG9ydDsKLQlscG9ydC0+bHBfdGFnID0gKHZwb3J0KSA/IHZwb3J0LT5scHMtPmxwX3RhZyA6Ci0JCQkJICBscG9ydC0+ZmFicmljLT5scHMtPmxwX3RhZzsKKwlscG9ydC0+bHBfdGFnID0gKHZwb3J0KSA/IHZwb3J0LT5scHMtPmJmYV90YWcgOgorCQkJCSAgbHBvcnQtPmZhYnJpYy0+bHBzLT5iZmFfdGFnOwogCiAJSU5JVF9MSVNUX0hFQUQoJmxwb3J0LT5ycG9ydF9xKTsKIAlscG9ydC0+bnVtX3Jwb3J0cyA9IDA7CkBAIC0xMDc0LDYgKzExODEsOCBAQAogCQkJCSBzdHJ1Y3QgYmZhX2Zjc19mZG1pX2hiYV9hdHRyX3MgKmhiYV9hdHRyKTsKIHN0YXRpYyB2b2lkCWJmYV9mY3NfZmRtaV9nZXRfcG9ydGF0dHIoc3RydWN0IGJmYV9mY3NfbHBvcnRfZmRtaV9zICpmZG1pLAogCQkJCSAgc3RydWN0IGJmYV9mY3NfZmRtaV9wb3J0X2F0dHJfcyAqcG9ydF9hdHRyKTsKK3UzMgliZmFfZmNzX2ZkbWlfY29udmVydF9zcGVlZChlbnVtIGJmYV9wb3J0X3NwZWVkIHBwb3J0X3NwZWVkKTsKKwogLyoKICAqICBmY3NfZmRtaV9zbSBGQ1MgRkRNSSBzdGF0ZSBtYWNoaW5lCiAgKi8KQEAgLTE2NzIsNyArMTc4MSw3IEBACiAJbWVtY3B5KGF0dHItPnZhbHVlLCBmY3NfaGJhX2F0dHItPmRyaXZlcl92ZXJzaW9uLCB0ZW1wbGVuKTsKIAl0ZW1wbGVuID0gZmNfcm91bmR1cCh0ZW1wbGVuLCBzaXplb2YodTMyKSk7CiAJY3Vycl9wdHIgKz0gc2l6ZW9mKGF0dHItPnR5cGUpICsgc2l6ZW9mKHRlbXBsZW4pICsgdGVtcGxlbjsKLQlsZW4gKz0gdGVtcGxlbjs7CisJbGVuICs9IHRlbXBsZW47CiAJY291bnQrKzsKIAlhdHRyLT5sZW4gPSBjcHVfdG9fYmUxNih0ZW1wbGVuICsgc2l6ZW9mKGF0dHItPnR5cGUpICsKIAkJCSAgICAgc2l6ZW9mKHRlbXBsZW4pKTsKQEAgLTIxNjAsMTIgKzIyNjksMzYgQEAKIAkvKgogCSAqIFN1cHBvcnRlZCBTcGVlZHMKIAkgKi8KLQlwb3J0X2F0dHItPnN1cHBfc3BlZWQgPSBjcHVfdG9fYmUzMihCRkFfRkNTX0ZETUlfU1VQT1JURURfU1BFRURTKTsKKwlzd2l0Y2ggKHBwb3J0X2F0dHIuc3BlZWRfc3VwcG9ydGVkKSB7CisJY2FzZSBCRkFfUE9SVF9TUEVFRF8xNkdCUFM6CisJCXBvcnRfYXR0ci0+c3VwcF9zcGVlZCA9CisJCQljcHVfdG9fYmUzMihCRkFfRkNTX0ZETUlfU1VQUF9TUEVFRFNfMTZHKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9QT1JUX1NQRUVEXzEwR0JQUzoKKwkJcG9ydF9hdHRyLT5zdXBwX3NwZWVkID0KKwkJCWNwdV90b19iZTMyKEJGQV9GQ1NfRkRNSV9TVVBQX1NQRUVEU18xMEcpOworCQlicmVhazsKKworCWNhc2UgQkZBX1BPUlRfU1BFRURfOEdCUFM6CisJCXBvcnRfYXR0ci0+c3VwcF9zcGVlZCA9CisJCQljcHVfdG9fYmUzMihCRkFfRkNTX0ZETUlfU1VQUF9TUEVFRFNfOEcpOworCQlicmVhazsKKworCWNhc2UgQkZBX1BPUlRfU1BFRURfNEdCUFM6CisJCXBvcnRfYXR0ci0+c3VwcF9zcGVlZCA9CisJCQljcHVfdG9fYmUzMihCRkFfRkNTX0ZETUlfU1VQUF9TUEVFRFNfNEcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChwb3J0LT5mY3MsIHBwb3J0X2F0dHIuc3BlZWRfc3VwcG9ydGVkKTsKKwl9CiAKIAkvKgogCSAqIEN1cnJlbnQgU3BlZWQKIAkgKi8KLQlwb3J0X2F0dHItPmN1cnJfc3BlZWQgPSBjcHVfdG9fYmUzMihwcG9ydF9hdHRyLnNwZWVkKTsKKwlwb3J0X2F0dHItPmN1cnJfc3BlZWQgPSBjcHVfdG9fYmUzMigKKwkJCQliZmFfZmNzX2ZkbWlfY29udmVydF9zcGVlZChwcG9ydF9hdHRyLnNwZWVkKSk7CiAKIAkvKgogCSAqIE1heCBQRFUgU2l6ZS4KQEAgLTIxODYsNiArMjMxOSw0MSBAQAogCiB9CiAKKy8qCisgKiBDb252ZXJ0IEJGQSBzcGVlZCB0byBGRE1JIGZvcm1hdC4KKyAqLwordTMyCitiZmFfZmNzX2ZkbWlfY29udmVydF9zcGVlZChiZmFfcG9ydF9zcGVlZF90IHBwb3J0X3NwZWVkKQoreworCXUzMglyZXQ7CisKKwlzd2l0Y2ggKHBwb3J0X3NwZWVkKSB7CisJY2FzZSBCRkFfUE9SVF9TUEVFRF8xR0JQUzoKKwljYXNlIEJGQV9QT1JUX1NQRUVEXzJHQlBTOgorCQlyZXQgPSBwcG9ydF9zcGVlZDsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9QT1JUX1NQRUVEXzRHQlBTOgorCQlyZXQgPSBGRE1JX1RSQU5TX1NQRUVEXzRHOworCQlicmVhazsKKworCWNhc2UgQkZBX1BPUlRfU1BFRURfOEdCUFM6CisJCXJldCA9IEZETUlfVFJBTlNfU1BFRURfOEc7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUE9SVF9TUEVFRF8xMEdCUFM6CisJCXJldCA9IEZETUlfVFJBTlNfU1BFRURfMTBHOworCQlicmVhazsKKworCWNhc2UgQkZBX1BPUlRfU1BFRURfMTZHQlBTOgorCQlyZXQgPSBGRE1JX1RSQU5TX1NQRUVEXzE2RzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSBGRE1JX1RSQU5TX1NQRUVEX1VOS05PV047CisJfQorCXJldHVybiByZXQ7Cit9CiAKIHZvaWQKIGJmYV9mY3NfbHBvcnRfZmRtaV9pbml0KHN0cnVjdCBiZmFfZmNzX2xwb3J0X21zX3MgKm1zKQpAQCAtMjgyOSw3ICsyOTk3LDggQEAKIAkJCSAgICAgYmZhX2h0b24zYihGQ19NR01UX1NFUlZFUiksCiAJCQkgICAgIGJmYV9mY3NfbHBvcnRfZ2V0X2ZjaWQocG9ydCksIDAsCiAJCQkgICAgIHBvcnQtPnBvcnRfY2ZnLnB3d24sIHBvcnQtPnBvcnRfY2ZnLm53d24sCi0JCQkJIGJmYV9mY3BvcnRfZ2V0X21heGZyc2l6ZShwb3J0LT5mY3MtPmJmYSkpOworCQkJICAgICBiZmFfZmNwb3J0X2dldF9tYXhmcnNpemUocG9ydC0+ZmNzLT5iZmEpLAorCQkJICAgICBiZmFfZmNwb3J0X2dldF9yeF9iYmNyZWRpdChwb3J0LT5mY3MtPmJmYSkpOwogCiAJYmZhX2ZjeHBfc2VuZChmY3hwLCBOVUxMLCBwb3J0LT5mYWJyaWMtPnZmX2lkLCBwb3J0LT5scF90YWcsIEJGQV9GQUxTRSwKIAkJCSAgRkNfQ0xBU1NfMywgbGVuLCAmZmNocywKQEAgLTM1NzMsNyArMzc0Miw3IEBACiAKIAliZmFfdHJjKHBvcnQtPmZjcywgcG9ydC0+cGlkKTsKIAotZmN4cCA9IGZjeHBfYWxsb2NlZCA/IGZjeHBfYWxsb2NlZCA6IGJmYV9mY3NfZmN4cF9hbGxvYyhwb3J0LT5mY3MpOworCWZjeHAgPSBmY3hwX2FsbG9jZWQgPyBmY3hwX2FsbG9jZWQgOiBiZmFfZmNzX2ZjeHBfYWxsb2MocG9ydC0+ZmNzKTsKIAlpZiAoIWZjeHApIHsKIAkJcG9ydC0+c3RhdHMubnNfcGxvZ2lfYWxsb2Nfd2FpdCsrOwogCQliZmFfZmNzX2ZjeHBfYWxsb2Nfd2FpdChwb3J0LT5mY3MtPmJmYSwgJm5zLT5mY3hwX3dxZSwKQEAgLTM1ODYsNyArMzc1NSw4IEBACiAJCQkgICAgIGJmYV9odG9uM2IoRkNfTkFNRV9TRVJWRVIpLAogCQkJICAgICBiZmFfZmNzX2xwb3J0X2dldF9mY2lkKHBvcnQpLCAwLAogCQkJICAgICBwb3J0LT5wb3J0X2NmZy5wd3duLCBwb3J0LT5wb3J0X2NmZy5ud3duLAotCQkJCSBiZmFfZmNwb3J0X2dldF9tYXhmcnNpemUocG9ydC0+ZmNzLT5iZmEpKTsKKwkJCSAgICAgYmZhX2ZjcG9ydF9nZXRfbWF4ZnJzaXplKHBvcnQtPmZjcy0+YmZhKSwKKwkJCSAgICAgYmZhX2ZjcG9ydF9nZXRfcnhfYmJjcmVkaXQocG9ydC0+ZmNzLT5iZmEpKTsKIAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCQkgIEZDX0NMQVNTXzMsIGxlbiwgJmZjaHMsCkBAIC00NzYyLDggKzQ5MzIsOCBAQAogCXdoaWxlIChxZSAhPSBxaCkgewogCQlycG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopIHFlOwogCQlpZiAoKGJmYV9udG9oM2IocnBvcnQtPnBpZCkgPiAweEZGRjAwMCkgfHwKLQkJCShiZmFfZmNzX3Jwb3J0X2dldF9zdGF0ZShycG9ydCkgPT0KLQkJCSAgQkZBX1JQT1JUX09GRkxJTkUpKSB7CisJCQkoYmZhX2Zjc19ycG9ydF9nZXRfc3RhdGUocnBvcnQpID09IEJGQV9SUE9SVF9PRkZMSU5FKSB8fAorCQkJKHJwb3J0LT5zY3NpX2Z1bmN0aW9uICE9IEJGQV9SUE9SVF9UQVJHRVQpKSB7CiAJCQlxZSA9IGJmYV9xX25leHQocWUpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTQ3NzYsMTcgKzQ5NDYsMTUgQEAKIAkJCQliZmFfZmNwb3J0X2dldF9yYXRlbGltX3NwZWVkKHBvcnQtPmZjcy0+YmZhKTsKIAkJfQogCi0JCWlmCSgocnBvcnRfc3BlZWQgID09IEJGQV9QT1JUX1NQRUVEXzhHQlBTKSB8fAotCQkJKHJwb3J0X3NwZWVkID4gcG9ydF9zcGVlZCkpIHsKKwkJaWYgKHJwb3J0X3NwZWVkID4gbWF4X3NwZWVkKQogCQkJbWF4X3NwZWVkID0gcnBvcnRfc3BlZWQ7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChycG9ydF9zcGVlZCA+IG1heF9zcGVlZCkgewotCQkJbWF4X3NwZWVkID0gcnBvcnRfc3BlZWQ7Ci0JCX0KIAogCQlxZSA9IGJmYV9xX25leHQocWUpOwogCX0KIAorCWlmIChtYXhfc3BlZWQgPiBwb3J0X3NwZWVkKQorCQltYXhfc3BlZWQgPSBwb3J0X3NwZWVkOworCiAJYmZhX3RyYyhmY3MsIG1heF9zcGVlZCk7CiAJcmV0dXJuIG1heF9zcGVlZDsKIH0KQEAgLTQ5MTgsNiArNTA4Niw3IEBACiAJQkZBX0ZDU19WUE9SVF9TTV9ERUxDT01QID0gMTEsCS8qICBscG9ydCBkZWxldGUgY29tcGxldGlvbiAqLwogCUJGQV9GQ1NfVlBPUlRfU01fUlNQX0RVUF9XV04gPSAxMiwJLyogIER1cCB3bm4gZXJyb3IqLwogCUJGQV9GQ1NfVlBPUlRfU01fUlNQX0ZBSUxFRCA9IDEzLAkvKiAgbm9uLXJldHJ5YWJsZSBmYWlsdXJlICovCisJQkZBX0ZDU19WUE9SVF9TTV9TVE9QQ09NUCA9IDE0LAkvKiB2cG9ydCBkZWxldGUgY29tcGxldGlvbiAqLwogfTsKIAogc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfdnBvcnRfc21fdW5pbml0KHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LApAQCAtNDkzMCw2ICs1MDk5LDggQEAKIAkJCQkgICAgICAgZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KTsKIHN0YXRpYyB2b2lkICAgICBiZmFfZmNzX3Zwb3J0X3NtX2ZkaXNjX3JldHJ5KHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAogCQkJCQkgICAgIGVudW0gYmZhX2Zjc192cG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZAliZmFfZmNzX3Zwb3J0X3NtX2ZkaXNjX3JzcF93YWl0KHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAorCQkJCQllbnVtIGJmYV9mY3NfdnBvcnRfZXZlbnQgZXZlbnQpOwogc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfdnBvcnRfc21fb25saW5lKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAogCQkJCQllbnVtIGJmYV9mY3NfdnBvcnRfZXZlbnQgZXZlbnQpOwogc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfdnBvcnRfc21fZGVsZXRpbmcoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCkBAIC00OTQwLDYgKzUxMTEsMTAgQEAKIAkJCQkgICAgICBlbnVtIGJmYV9mY3NfdnBvcnRfZXZlbnQgZXZlbnQpOwogc3RhdGljIHZvaWQgICAgIGJmYV9mY3NfdnBvcnRfc21fZXJyb3Ioc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCiAJCQkJICAgICAgZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkCWJmYV9mY3NfdnBvcnRfc21fc3RvcHBpbmcoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCisJCQkJCWVudW0gYmZhX2Zjc192cG9ydF9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZAliZmFfZmNzX3Zwb3J0X3NtX2xvZ29fZm9yX3N0b3Aoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCisJCQkJCWVudW0gYmZhX2Zjc192cG9ydF9ldmVudCBldmVudCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYmZhX3NtX3RhYmxlX3MgIHZwb3J0X3NtX3RhYmxlW10gPSB7CiAJe0JGQV9TTShiZmFfZmNzX3Zwb3J0X3NtX3VuaW5pdCksIEJGQV9GQ1NfVlBPUlRfVU5JTklUfSwKQEAgLTQ5NDcsNiArNTEyMiw3IEBACiAJe0JGQV9TTShiZmFfZmNzX3Zwb3J0X3NtX29mZmxpbmUpLCBCRkFfRkNTX1ZQT1JUX09GRkxJTkV9LAogCXtCRkFfU00oYmZhX2Zjc192cG9ydF9zbV9mZGlzYyksIEJGQV9GQ1NfVlBPUlRfRkRJU0N9LAogCXtCRkFfU00oYmZhX2Zjc192cG9ydF9zbV9mZGlzY19yZXRyeSksIEJGQV9GQ1NfVlBPUlRfRkRJU0NfUkVUUll9LAorCXtCRkFfU00oYmZhX2Zjc192cG9ydF9zbV9mZGlzY19yc3Bfd2FpdCksIEJGQV9GQ1NfVlBPUlRfRkRJU0NfUlNQX1dBSVR9LAogCXtCRkFfU00oYmZhX2Zjc192cG9ydF9zbV9vbmxpbmUpLCBCRkFfRkNTX1ZQT1JUX09OTElORX0sCiAJe0JGQV9TTShiZmFfZmNzX3Zwb3J0X3NtX2RlbGV0aW5nKSwgQkZBX0ZDU19WUE9SVF9ERUxFVElOR30sCiAJe0JGQV9TTShiZmFfZmNzX3Zwb3J0X3NtX2NsZWFudXApLCBCRkFfRkNTX1ZQT1JUX0NMRUFOVVB9LApAQCAtNTA0Miw2ICs1MjE4LDExIEBACiAJCWJmYV9mY3NfdnBvcnRfZG9fZmRpc2ModnBvcnQpOwogCQlicmVhazsKIAorCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9TVE9QOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2NsZWFudXApOworCQliZmFfc21fc2VuZF9ldmVudCgmdnBvcnQtPmxwb3J0LCBCRkFfRkNTX1BPUlRfU01fU1RPUCk7CisJCWJyZWFrOworCiAJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX09GRkxJTkU6CiAJCS8qCiAJCSAqIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgdnBvcnQgY291bGRuJ3QgYmUgaW5pdGlhbHppZWQKQEAgLTUwNzAsOSArNTI1MSw3IEBACiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX0RFTEVURToKLQkJYmZhX3NtX3NldF9zdGF0ZSh2cG9ydCwgYmZhX2Zjc192cG9ydF9zbV9jbGVhbnVwKTsKLQkJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQtPmxwcywgQkZBX0xQU19TTV9PRkZMSU5FKTsKLQkJYmZhX2Zjc19scG9ydF9kZWxldGUoJnZwb3J0LT5scG9ydCk7CisJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fZmRpc2NfcnNwX3dhaXQpOwogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9PRkZMSU5FOgpAQCAtNTE0MCw2ICs1MzE5LDQxIEBACiB9CiAKIC8qCisgKiBGRElTQyBpcyBpbiBwcm9ncmVzcyBhbmQgd2UgZ290IGEgdnBvcnQgZGVsZXRlIHJlcXVlc3QgLQorICogdGhpcyBpcyBhIHdhaXQgc3RhdGUgd2hpbGUgd2Ugd2FpdCBmb3IgZmRpc2MgcmVzcG9uc2UgYW5kCisgKiB3ZSB3aWxsIHRyYW5zaXRpb24gdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXRlIC0gb24gcnNwIHN0YXR1cy4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfdnBvcnRfc21fZmRpc2NfcnNwX3dhaXQoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCisJCQkJZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBfX3Zwb3J0X3B3d24odnBvcnQpKTsKKwliZmFfdHJjKF9fdnBvcnRfZmNzKHZwb3J0KSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9SU1BfT0s6CisJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fZGVsZXRpbmcpOworCQliZmFfZmNzX2xwb3J0X2RlbGV0ZSgmdnBvcnQtPmxwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9GQ1NfVlBPUlRfU01fREVMRVRFOgorCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9PRkZMSU5FOgorCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9SU1BfRVJST1I6CisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9GQUlMRUQ6CisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9EVVBfV1dOOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2NsZWFudXApOworCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydC0+bHBzLCBCRkFfTFBTX1NNX09GRkxJTkUpOworCQliZmFfZmNzX2xwb3J0X2RlbGV0ZSgmdnBvcnQtPmxwb3J0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoX192cG9ydF9mY3ModnBvcnQpLCBldmVudCk7CisJfQorfQorCisvKgogICogVnBvcnQgaXMgb25saW5lIChGRElTQyBpcyBjb21wbGV0ZSkuCiAgKi8KIHN0YXRpYyB2b2lkCkBAIC01MTU1LDYgKzUzNjksMTEgQEAKIAkJYmZhX2Zjc19scG9ydF9kZWxldGUoJnZwb3J0LT5scG9ydCk7CiAJCWJyZWFrOwogCisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX1NUT1A6CisJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fc3RvcHBpbmcpOworCQliZmFfc21fc2VuZF9ldmVudCgmdnBvcnQtPmxwb3J0LCBCRkFfRkNTX1BPUlRfU01fU1RPUCk7CisJCWJyZWFrOworCiAJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX09GRkxJTkU6CiAJCWJmYV9zbV9zZXRfc3RhdGUodnBvcnQsIGJmYV9mY3NfdnBvcnRfc21fb2ZmbGluZSk7CiAJCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LT5scHMsIEJGQV9MUFNfU01fT0ZGTElORSk7CkBAIC01MTY3LDYgKzUzODYsMzIgQEAKIH0KIAogLyoKKyAqIFZwb3J0IGlzIGJlaW5nIHN0b3BwZWQgLSBhd2FpdGluZyBscG9ydCBzdG9wIGNvbXBsZXRpb24gdG8gc2VuZAorICogTE9HTyB0byBmYWJyaWMuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Zwb3J0X3NtX3N0b3BwaW5nKHN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKnZwb3J0LAorCQkJICBlbnVtIGJmYV9mY3NfdnBvcnRfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhfX3Zwb3J0X2Zjcyh2cG9ydCksIF9fdnBvcnRfcHd3bih2cG9ydCkpOworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX1NUT1BDT01QOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2xvZ29fZm9yX3N0b3ApOworCQliZmFfZmNzX3Zwb3J0X2RvX2xvZ28odnBvcnQpOworCQlicmVhazsKKworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9PRkZMSU5FOgorCQliZmFfc21fc2V0X3N0YXRlKHZwb3J0LCBiZmFfZmNzX3Zwb3J0X3NtX2NsZWFudXApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChfX3Zwb3J0X2Zjcyh2cG9ydCksIGV2ZW50KTsKKwl9Cit9CisKKy8qCiAgKiBWcG9ydCBpcyBiZWluZyBkZWxldGVkIC0gYXdhaXRpbmcgbHBvcnQgZGVsZXRlIGNvbXBsZXRpb24gdG8gc2VuZAogICogTE9HTyB0byBmYWJyaWMuCiAgKi8KQEAgLTUyMzYsNiArNTQ4MSwxMCBAQAogCQliZmFfZmNzX3Zwb3J0X2ZyZWUodnBvcnQpOwogCQlicmVhazsKIAorCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9TVE9QQ09NUDoKKwkJYmZhX3NtX3NldF9zdGF0ZSh2cG9ydCwgYmZhX2Zjc192cG9ydF9zbV9jcmVhdGVkKTsKKwkJYnJlYWs7CisKIAljYXNlIEJGQV9GQ1NfVlBPUlRfU01fREVMRVRFOgogCQlicmVhazsKIApAQCAtNTI0NSw2ICs1NDk0LDM0IEBACiB9CiAKIC8qCisgKiBMT0dPIGlzIHNlbnQgdG8gZmFicmljLiBWcG9ydCBzdG9wIGlzIGluIHByb2dyZXNzLiBMcG9ydCBzdG9wIGNsZWFudXAKKyAqIGlzIGRvbmUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Zwb3J0X3NtX2xvZ29fZm9yX3N0b3Aoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQsCisJCQkgICAgICAgZW51bSBiZmFfZmNzX3Zwb3J0X2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoX192cG9ydF9mY3ModnBvcnQpLCBfX3Zwb3J0X3B3d24odnBvcnQpKTsKKwliZmFfdHJjKF9fdnBvcnRfZmNzKHZwb3J0KSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9PRkZMSU5FOgorCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydC0+bHBzLCBCRkFfTFBTX1NNX09GRkxJTkUpOworCQkvKgorCQkgKiAhISEgZmFsbCB0aHJvdWdoICEhIQorCQkgKi8KKworCWNhc2UgQkZBX0ZDU19WUE9SVF9TTV9SU1BfT0s6CisJY2FzZSBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9FUlJPUjoKKwkJYmZhX3NtX3NldF9zdGF0ZSh2cG9ydCwgYmZhX2Zjc192cG9ydF9zbV9jcmVhdGVkKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoX192cG9ydF9mY3ModnBvcnQpLCBldmVudCk7CisJfQorfQorCisvKgogICogTE9HTyBpcyBzZW50IHRvIGZhYnJpYy4gVnBvcnQgZGVsZXRlIGlzIGluIHByb2dyZXNzLiBMcG9ydCBkZWxldGUgY2xlYW51cAogICogaXMgZG9uZS4KICAqLwpAQCAtNTM5MSw3ICs1NjY4LDEwIEBACiBiZmFfZmNzX3Zwb3J0X29ubGluZShzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICp2cG9ydCkKIHsKIAl2cG9ydC0+dnBvcnRfc3RhdHMuZmFiX29ubGluZSsrOwotCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX09OTElORSk7CisJaWYgKGJmYV9mY3NfZmFicmljX25waXZfY2FwYWJsZShfX3Zwb3J0X2ZhYnJpYyh2cG9ydCkpKQorCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9PTkxJTkUpOworCWVsc2UKKwkJdnBvcnQtPnZwb3J0X3N0YXRzLmZhYl9ub19ucGl2Kys7CiB9CiAKIC8qCkBAIC01NDIyLDYgKzU3MDIsMTUgQEAKIH0KIAogLyoKKyAqIFN0b3AgY29tcGxldGlvbiBjYWxsYmFjayBmcm9tIGFzc29jaWF0ZWQgbHBvcnQKKyAqLwordm9pZAorYmZhX2Zjc192cG9ydF9zdG9wX2NvbXAoc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqdnBvcnQpCit7CisJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fU1RPUENPTVApOworfQorCisvKgogICogRGVsZXRlIGNvbXBsZXRpb24gY2FsbGJhY2sgZnJvbSBhc3NvY2lhdGVkIGxwb3J0CiAgKi8KIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19ycG9ydC5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX3Jwb3J0LmMKaW5kZXggY2FhZWU2Zi4uMmM1MTQ0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX3Jwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX3Jwb3J0LmMKQEAgLTI2Miw2ICsyNjIsNyBAQAogCQlicmVhazsKIAogCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9SQ1ZEOgorCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9DT01QOgogCWNhc2UgUlBTTV9FVkVOVF9TQ046CiAJCS8qCiAJCSAqIElnbm9yZSwgU0NOIGlzIHBvc3NpYmx5IG9ubGluZSBub3RpZmljYXRpb24uCkBAIC00NzAsNiArNDcxLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFJQU01fRVZFTlRfUFJMT19SQ1ZEOgorCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9DT01QOgogCQlicmVhazsKIAogCWNhc2UgUlBTTV9FVkVOVF9MT0dPX1JDVkQ6CkBAIC00ODQsOSArNDg2LDkgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFJQU01fRVZFTlRfUExPR0lfUkNWRDoKLQkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9wbG9naWFjY19zZW5kaW5nKTsKKwkJcnBvcnQtPnBsb2dpX3BlbmRpbmcgPSBCRkFfVFJVRTsKKwkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwgYmZhX2Zjc19ycG9ydF9zbV9oY2Jfb2ZmbGluZSk7CiAJCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LT5iZmFfcnBvcnQsIEJGQV9SUE9SVF9TTV9PRkZMSU5FKTsKLQkJYmZhX2Zjc19ycG9ydF9zZW5kX3Bsb2dpYWNjKHJwb3J0LCBOVUxMKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJQU01fRVZFTlRfREVMRVRFOgpAQCAtODkxLDYgKzg5MywxOCBAQAogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgUlBTTV9FVkVOVF9IQ0JfT0ZGTElORToKKwkJaWYgKGJmYV9mY3NfbHBvcnRfaXNfb25saW5lKHJwb3J0LT5wb3J0KSAmJgorCQkgICAgKHJwb3J0LT5wbG9naV9wZW5kaW5nKSkgeworCQkJcnBvcnQtPnBsb2dpX3BlbmRpbmcgPSBCRkFfRkFMU0U7CisJCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LAorCQkJCWJmYV9mY3NfcnBvcnRfc21fcGxvZ2lhY2Nfc2VuZGluZyk7CisJCQliZmFfZmNzX3Jwb3J0X3NlbmRfcGxvZ2lhY2MocnBvcnQsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICogISEgZmFsbCB0aHJvdWdoICEhCisJCSAqLworCiAJY2FzZSBSUFNNX0VWRU5UX0FERFJFU1NfQ0hBTkdFOgogCQlpZiAoYmZhX2Zjc19scG9ydF9pc19vbmxpbmUocnBvcnQtPnBvcnQpKSB7CiAJCQlpZiAoYmZhX2Zjc19mYWJyaWNfaXNfc3dpdGNoZWQocnBvcnQtPnBvcnQtPmZhYnJpYykpIHsKQEAgLTkyMSw2ICs5MzUsOCBAQAogCWNhc2UgUlBTTV9FVkVOVF9TQ046CiAJY2FzZSBSUFNNX0VWRU5UX0xPR09fUkNWRDoKIAljYXNlIFJQU01fRVZFTlRfUFJMT19SQ1ZEOgorCWNhc2UgUlBTTV9FVkVOVF9QTE9HSV9SQ1ZEOgorCWNhc2UgUlBTTV9FVkVOVF9MT0dPX0lNUDoKIAkJLyoKIAkJICogSWdub3JlLCBhbHJlYWR5IG9mZmxpbmUuCiAJCSAqLwpAQCAtOTU3LDEwICs5NzMsMTggQEAKIAkJICovCiAJCWlmIChiZmFfZmNzX2xwb3J0X2lzX29ubGluZShycG9ydC0+cG9ydCkgJiYKIAkJCSghQkZBX0ZDU19QSURfSVNfV0tBKHJwb3J0LT5waWQpKSkgewotCQkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwKLQkJCQliZmFfZmNzX3Jwb3J0X3NtX25zZGlzY19zZW5kaW5nKTsKLQkJCXJwb3J0LT5uc19yZXRyaWVzID0gMDsKLQkJCWJmYV9mY3NfcnBvcnRfc2VuZF9uc2Rpc2MocnBvcnQsIE5VTEwpOworCQkJaWYgKGJmYV9mY3NfZmFicmljX2lzX3N3aXRjaGVkKHJwb3J0LT5wb3J0LT5mYWJyaWMpKSB7CisJCQkJYmZhX3NtX3NldF9zdGF0ZShycG9ydCwKKwkJCQkJYmZhX2Zjc19ycG9ydF9zbV9uc2Rpc2Nfc2VuZGluZyk7CisJCQkJcnBvcnQtPm5zX3JldHJpZXMgPSAwOworCQkJCWJmYV9mY3NfcnBvcnRfc2VuZF9uc2Rpc2MocnBvcnQsIE5VTEwpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBGb3IgTjJOICBEaXJlY3QgQXR0YWNoLCB0cnkgdG8gcmUtbG9naW4gKi8KKwkJCQliZmFfc21fc2V0X3N0YXRlKHJwb3J0LAorCQkJCQliZmFfZmNzX3Jwb3J0X3NtX3Bsb2dpX3NlbmRpbmcpOworCQkJCXJwb3J0LT5wbG9naV9yZXRyaWVzID0gMDsKKwkJCQliZmFfZmNzX3Jwb3J0X3NlbmRfcGxvZ2kocnBvcnQsIE5VTEwpOworCQkJfQogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIGlmIGl0IGlzIG5vdCBhIHdlbGwga25vd24gYWRkcmVzcywgcmVzZXQgdGhlCkBAIC0xMzU2LDcgKzEzODAsOCBAQAogCWxlbiA9IGZjX3Bsb2dpX2J1aWxkKCZmY2hzLCBiZmFfZmN4cF9nZXRfcmVxYnVmKGZjeHApLCBycG9ydC0+cGlkLAogCQkJCWJmYV9mY3NfbHBvcnRfZ2V0X2ZjaWQocG9ydCksIDAsCiAJCQkJcG9ydC0+cG9ydF9jZmcucHd3biwgcG9ydC0+cG9ydF9jZmcubnd3biwKLQkJCQliZmFfZmNwb3J0X2dldF9tYXhmcnNpemUocG9ydC0+ZmNzLT5iZmEpKTsKKwkJCQliZmFfZmNwb3J0X2dldF9tYXhmcnNpemUocG9ydC0+ZmNzLT5iZmEpLAorCQkJCWJmYV9mY3BvcnRfZ2V0X3J4X2JiY3JlZGl0KHBvcnQtPmZjcy0+YmZhKSk7CiAKIAliZmFfZmN4cF9zZW5kKGZjeHAsIE5VTEwsIHBvcnQtPmZhYnJpYy0+dmZfaWQsIHBvcnQtPmxwX3RhZywgQkZBX0ZBTFNFLAogCQkJRkNfQ0xBU1NfMywgbGVuLCAmZmNocywgYmZhX2Zjc19ycG9ydF9wbG9naV9yZXNwb25zZSwKQEAgLTE0NzYsNyArMTUwMSw4IEBACiAJCQkJIHJwb3J0LT5waWQsIGJmYV9mY3NfbHBvcnRfZ2V0X2ZjaWQocG9ydCksCiAJCQkJIHJwb3J0LT5yZXBseV9veGlkLCBwb3J0LT5wb3J0X2NmZy5wd3duLAogCQkJCSBwb3J0LT5wb3J0X2NmZy5ud3duLAotCQkJCSBiZmFfZmNwb3J0X2dldF9tYXhmcnNpemUocG9ydC0+ZmNzLT5iZmEpKTsKKwkJCQkgYmZhX2ZjcG9ydF9nZXRfbWF4ZnJzaXplKHBvcnQtPmZjcy0+YmZhKSwKKwkJCQkgYmZhX2ZjcG9ydF9nZXRfcnhfYmJjcmVkaXQocG9ydC0+ZmNzLT5iZmEpKTsKIAogCWJmYV9mY3hwX3NlbmQoZmN4cCwgTlVMTCwgcG9ydC0+ZmFicmljLT52Zl9pZCwgcG9ydC0+bHBfdGFnLCBCRkFfRkFMU0UsCiAJCQlGQ19DTEFTU18zLCBsZW4sICZmY2hzLCBOVUxMLCBOVUxMLCBGQ19NQVhfUERVU1osIDApOwpAQCAtMjAyNCw2ICsyMDUwLDExIEBACiAKIAlycG9ydC0+c3RhdHMub25saW5lcysrOwogCisJaWYgKCghcnBvcnQtPnBpZCkgfHwgKCFycG9ydC0+cHd3bikpIHsKKwkJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKKwkJYmZhX3NtX2ZhdWx0KHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOworCX0KKwogCWlmIChiZmFfZmNzX2xwb3J0X2lzX2luaXRpYXRvcihwb3J0KSkgewogCQliZmFfZmNzX2l0bmltX3Jwb3J0X29ubGluZShycG9ydC0+aXRuaW0pOwogCQlpZiAoIUJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkKQEAgLTIwNDcsNiArMjA3OCw3IEBACiAJY2hhcglycHd3bl9idWZbQkZBX1NUUklOR18zMl07CiAKIAlycG9ydC0+c3RhdHMub2ZmbGluZXMrKzsKKwlycG9ydC0+cGxvZ2lfcGVuZGluZyA9IEJGQV9GQUxTRTsKIAogCXd3bjJzdHIobHB3d25fYnVmLCBiZmFfZmNzX2xwb3J0X2dldF9wd3duKHBvcnQpKTsKIAl3d24yc3RyKHJwd3duX2J1ZiwgcnBvcnQtPnB3d24pOwpAQCAtMjEyMCw3ICsyMTUyLDcgQEAKIAogCQlwb3J0LT5mYWJyaWMtPmJiX2NyZWRpdCA9IGJlMTZfdG9fY3B1KHBsb2dpLT5jc3AuYmJjcmVkKTsKIAkJYmZhX2ZjcG9ydF9zZXRfdHhfYmJjcmVkaXQocG9ydC0+ZmNzLT5iZmEsCi0JCQkJCSAgcG9ydC0+ZmFicmljLT5iYl9jcmVkaXQpOworCQkJCQkgIHBvcnQtPmZhYnJpYy0+YmJfY3JlZGl0LCAwKTsKIAl9CiAKIH0KQEAgLTIyMzMsMjIgKzIyNjUsNiBAQAogCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX1BMT0dJX1JDVkQpOwogfQogCi1zdGF0aWMgaW50Ci13d25fY29tcGFyZSh3d25fdCB3d24xLCB3d25fdCB3d24yKQotewotCXU4CQkqYjEgPSAodTggKikgJnd3bjE7Ci0JdTgJCSpiMiA9ICh1OCAqKSAmd3duMjsKLQlpbnQJCWk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHd3bl90KTsgaSsrKSB7Ci0JCWlmIChiMVtpXSA8IGIyW2ldKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoYjFbaV0gPiBiMltpXSkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqCUNhbGxlZCBieSBicG9ydC92cG9ydCB0byBoYW5kbGUgUExPR0kgcmVjZWl2ZWQgZnJvbSBhbiBleGlzdGluZwogICoJIHJlbW90ZSBwb3J0LgpAQCAtMjI2NiwxOSArMjI4Miw4IEBACiAJcnBvcnQtPnJlcGx5X294aWQgPSByeF9mY2hzLT5veF9pZDsKIAliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5yZXBseV9veGlkKTsKIAotCS8qCi0JICogSW4gU3dpdGNoZWQgZmFicmljIHRvcG9sb2d5LAotCSAqIFBMT0dJIHRvIGVhY2ggb3RoZXIuIElmIG91ciBwd3duIGlzIHNtYWxsZXIsIGlnbm9yZSBpdCwKLQkgKiBpZiBpdCBpcyBub3QgYSB3ZWxsIGtub3duIGFkZHJlc3MuCi0JICogSWYgdGhlIGxpbmsgdG9wb2xvZ3kgaXMgTjJOLAotCSAqIHRoaXMgUGxvZ2kgc2hvdWxkIGJlIGFjY2VwdGVkLgotCSAqLwotCWlmICgod3duX2NvbXBhcmUocnBvcnQtPnBvcnQtPnBvcnRfY2ZnLnB3d24sIHJwb3J0LT5wd3duKSA9PSAtMSkgJiYKLQkJKGJmYV9mY3NfZmFicmljX2lzX3N3aXRjaGVkKHJwb3J0LT5wb3J0LT5mYWJyaWMpKSAmJgotCQkoIUJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkpIHsKLQkJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cGlkKTsKLQkJcmV0dXJuOwotCX0KKwlycG9ydC0+cGlkID0gcnhfZmNocy0+c19pZDsKKwliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5waWQpOwogCiAJcnBvcnQtPnN0YXRzLnBsb2dpX3JjdmQrKzsKIAliZmFfc21fc2VuZF9ldmVudChycG9ydCwgUlBTTV9FVkVOVF9QTE9HSV9SQ1ZEKTsKQEAgLTI1MzEsNyArMjUzNiw0NSBAQAogCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBSUFNNX0VWRU5UX1BSTE9fUkNWRCk7CiB9CiAKK3ZvaWQKK2JmYV9mY3NfcnBvcnRfZ2V0X2F0dHIoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCXN0cnVjdCBiZmFfcnBvcnRfYXR0cl9zICpycG9ydF9hdHRyKQoreworCXN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyBxb3NfYXR0cjsKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpwb3J0ID0gcnBvcnQtPnBvcnQ7CisJYmZhX3BvcnRfc3BlZWRfdCBycG9ydF9zcGVlZCA9IHJwb3J0LT5ycGYucnBzY19zcGVlZDsKIAorCW1lbXNldChycG9ydF9hdHRyLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9ycG9ydF9hdHRyX3MpKTsKKwltZW1zZXQoJnFvc19hdHRyLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9ycG9ydF9xb3NfYXR0cl9zKSk7CisKKwlycG9ydF9hdHRyLT5waWQgPSBycG9ydC0+cGlkOworCXJwb3J0X2F0dHItPnB3d24gPSBycG9ydC0+cHd3bjsKKwlycG9ydF9hdHRyLT5ud3duID0gcnBvcnQtPm53d247CisJcnBvcnRfYXR0ci0+Y29zX3N1cHBvcnRlZCA9IHJwb3J0LT5mY19jb3M7CisJcnBvcnRfYXR0ci0+ZGZfc3ogPSBycG9ydC0+bWF4ZnJzaXplOworCXJwb3J0X2F0dHItPnN0YXRlID0gYmZhX2Zjc19ycG9ydF9nZXRfc3RhdGUocnBvcnQpOworCXJwb3J0X2F0dHItPmZjX2NvcyA9IHJwb3J0LT5mY19jb3M7CisJcnBvcnRfYXR0ci0+Y2lzYyA9IHJwb3J0LT5jaXNjOworCXJwb3J0X2F0dHItPnNjc2lfZnVuY3Rpb24gPSBycG9ydC0+c2NzaV9mdW5jdGlvbjsKKwlycG9ydF9hdHRyLT5jdXJyX3NwZWVkICA9IHJwb3J0LT5ycGYucnBzY19zcGVlZDsKKwlycG9ydF9hdHRyLT5hc3NpZ25lZF9zcGVlZCAgPSBycG9ydC0+cnBmLmFzc2lnbmVkX3NwZWVkOworCisJcW9zX2F0dHIucW9zX3ByaW9yaXR5ID0gcnBvcnQtPmJmYV9ycG9ydC0+cW9zX2F0dHIucW9zX3ByaW9yaXR5OworCXFvc19hdHRyLnFvc19mbG93X2lkID0KKwkJY3B1X3RvX2JlMzIocnBvcnQtPmJmYV9ycG9ydC0+cW9zX2F0dHIucW9zX2Zsb3dfaWQpOworCXJwb3J0X2F0dHItPnFvc19hdHRyID0gcW9zX2F0dHI7CisKKwlycG9ydF9hdHRyLT50cmxfZW5mb3JjZWQgPSBCRkFfRkFMU0U7CisJaWYgKGJmYV9mY3BvcnRfaXNfcmF0ZWxpbShwb3J0LT5mY3MtPmJmYSkgJiYKKwkgICAgKHJwb3J0LT5zY3NpX2Z1bmN0aW9uID09IEJGQV9SUE9SVF9UQVJHRVQpKSB7CisJCWlmIChycG9ydF9zcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF9VTktOT1dOKQorCQkJcnBvcnRfc3BlZWQgPQorCQkJCWJmYV9mY3BvcnRfZ2V0X3JhdGVsaW1fc3BlZWQocnBvcnQtPmZjcy0+YmZhKTsKKworCQlpZiAocnBvcnRfc3BlZWQgPCBiZmFfZmNzX2xwb3J0X2dldF9ycG9ydF9tYXhfc3BlZWQocG9ydCkpCisJCQlycG9ydF9hdHRyLT50cmxfZW5mb3JjZWQgPSBCRkFfVFJVRTsKKwl9Cit9CiAKIC8qCiAgKiBSZW1vdGUgcG9ydCBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2NiLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jYi5jCmluZGV4IDk3N2U2ODEuLmU3ZmZkODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2NiLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY2IuYwpAQCAtMTcsMTQgKzE3LDE0IEBACiAKICNpbmNsdWRlICJiZmFkX2Rydi5oIgogI2luY2x1ZGUgImJmYV9tb2R1bGVzLmgiCi0jaW5jbHVkZSAiYmZpX2NicmVnLmgiCisjaW5jbHVkZSAiYmZpX3JlZy5oIgogCiB2b2lkCiBiZmFfaHdjYl9yZWdpbml0KHN0cnVjdCBiZmFfcyAqYmZhKQogewogCXN0cnVjdCBiZmFfaW9jZmNfcmVnc19zCSpiZmFfcmVncyA9ICZiZmEtPmlvY2ZjLmJmYV9yZWdzOwogCXZvaWQgX19pb21lbSAqa3ZhID0gYmZhX2lvY19iYXIwKCZiZmEtPmlvYyk7Ci0JaW50CQkJaSwgcSwgZm4gPSBiZmFfaW9jX3BjaWZuKCZiZmEtPmlvYyk7CisJaW50CWZuID0gYmZhX2lvY19wY2lmbigmYmZhLT5pb2MpOwogCiAJaWYgKGZuID09IDApIHsKIAkJYmZhX3JlZ3MtPmludHJfc3RhdHVzID0gKGt2YSArIEhPU1RGTjBfSU5UX1NUQVRVUyk7CkBAIC0zMywyOSArMzMsNiBAQAogCQliZmFfcmVncy0+aW50cl9zdGF0dXMgPSAoa3ZhICsgSE9TVEZOMV9JTlRfU1RBVFVTKTsKIAkJYmZhX3JlZ3MtPmludHJfbWFzayAgID0gKGt2YSArIEhPU1RGTjFfSU5UX01TSyk7CiAJfQotCi0JZm9yIChpID0gMDsgaSA8IEJGSV9JT0NfTUFYX0NRUzsgaSsrKSB7Ci0JCS8qCi0JCSAqIENQRSByZWdpc3RlcnMKLQkJICovCi0JCXEgPSBDUEVfUV9OVU0oZm4sIGkpOwotCQliZmFfcmVncy0+Y3BlX3FfcGlbaV0gPSAoa3ZhICsgQ1BFX1FfUEkocSkpOwotCQliZmFfcmVncy0+Y3BlX3FfY2lbaV0gPSAoa3ZhICsgQ1BFX1FfQ0kocSkpOwotCQliZmFfcmVncy0+Y3BlX3FfZGVwdGhbaV0gPSAoa3ZhICsgQ1BFX1FfREVQVEgocSkpOwotCi0JCS8qCi0JCSAqIFJNRSByZWdpc3RlcnMKLQkJICovCi0JCXEgPSBDUEVfUV9OVU0oZm4sIGkpOwotCQliZmFfcmVncy0+cm1lX3FfcGlbaV0gPSAoa3ZhICsgUk1FX1FfUEkocSkpOwotCQliZmFfcmVncy0+cm1lX3FfY2lbaV0gPSAoa3ZhICsgUk1FX1FfQ0kocSkpOwotCQliZmFfcmVncy0+cm1lX3FfZGVwdGhbaV0gPSAoa3ZhICsgUk1FX1FfREVQVEgocSkpOwotCX0KLX0KLQotdm9pZAotYmZhX2h3Y2JfcmVxcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByZXFxKQotewogfQogCiBzdGF0aWMgdm9pZApAQCAtNjUsMTEgKzQyLDYgQEAKIAkJCWJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOwogfQogCi12b2lkCi1iZmFfaHdjYl9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpCi17Ci19Ci0KIHN0YXRpYyB2b2lkCiBiZmFfaHdjYl9yc3BxX2Fja19tc2l4KHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSkKIHsKQEAgLTEwNCw0MyArNzYsNzEgQEAKIH0KIAogLyoKKyAqIER1bW15IGludGVycnVwdCBoYW5kbGVyIGZvciBoYW5kbGluZyBzcHVyaW91cyBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZAorYmZhX2h3Y2JfbXNpeF9kdW1teShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHZlYykKK3sKK30KKworLyoKICAqIE5vIHNwZWNpYWwgc2V0dXAgcmVxdWlyZWQgZm9yIGNyb3NzYm93IC0tIHZlY3RvciBhc3NpZ25tZW50cyBhcmUgaW1wbGljaXQuCiAgKi8KIHZvaWQKIGJmYV9od2NiX21zaXhfaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IG52ZWNzKQogewotCWludCBpOwotCiAJV0FSTl9PTigobnZlY3MgIT0gMSkgJiYgKG52ZWNzICE9IF9fSEZOX05VTUlOVFMpKTsKIAogCWJmYS0+bXNpeC5udmVjcyA9IG52ZWNzOwotCWlmIChudmVjcyA9PSAxKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBCRkFfTVNJWF9DQl9NQVg7IGkrKykKKwliZmFfaHdjYl9tc2l4X3VuaW5zdGFsbChiZmEpOworfQorCit2b2lkCitiZmFfaHdjYl9tc2l4X2N0cmxfaW5zdGFsbChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlpbnQgaTsKKworCWlmIChiZmEtPm1zaXgubnZlY3MgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGJmYS0+bXNpeC5udmVjcyA9PSAxKSB7CisJCWZvciAoaSA9IEJGSV9NU0lYX0NQRV9RTUlOX0NCOyBpIDwgQkZJX01TSVhfQ0JfTUFYOyBpKyspCiAJCQliZmEtPm1zaXguaGFuZGxlcltpXSA9IGJmYV9tc2l4X2FsbDsKIAkJcmV0dXJuOwogCX0KIAotCWZvciAoaSA9IEJGQV9NU0lYX0NQRV9RMDsgaSA8PSBCRkFfTVNJWF9DUEVfUTc7IGkrKykKLQkJYmZhLT5tc2l4LmhhbmRsZXJbaV0gPSBiZmFfbXNpeF9yZXFxOwotCi0JZm9yIChpID0gQkZBX01TSVhfUk1FX1EwOyBpIDw9IEJGQV9NU0lYX1JNRV9RNzsgaSsrKQotCQliZmEtPm1zaXguaGFuZGxlcltpXSA9IGJmYV9tc2l4X3JzcHE7Ci0KLQlmb3IgKDsgaSA8IEJGQV9NU0lYX0NCX01BWDsgaSsrKQorCWZvciAoaSA9IEJGSV9NU0lYX1JNRV9RTUFYX0NCKzE7IGkgPCBCRklfTVNJWF9DQl9NQVg7IGkrKykKIAkJYmZhLT5tc2l4LmhhbmRsZXJbaV0gPSBiZmFfbXNpeF9scHVfZXJyOwogfQogCi0vKgotICogQ3Jvc3Nib3cgLS0gZHVtbXksIGludGVycnVwdHMgYXJlIG1hc2tlZAotICovCiB2b2lkCi1iZmFfaHdjYl9tc2l4X2luc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpCitiZmFfaHdjYl9tc2l4X3F1ZXVlX2luc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpCiB7CisJaW50IGk7CisKKwlpZiAoYmZhLT5tc2l4Lm52ZWNzID09IDApCisJCXJldHVybjsKKworCWlmIChiZmEtPm1zaXgubnZlY3MgPT0gMSkgeworCQlmb3IgKGkgPSBCRklfTVNJWF9DUEVfUU1JTl9DQjsgaSA8PSBCRklfTVNJWF9STUVfUU1BWF9DQjsgaSsrKQorCQkJYmZhLT5tc2l4LmhhbmRsZXJbaV0gPSBiZmFfbXNpeF9hbGw7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSBCRklfTVNJWF9DUEVfUU1JTl9DQjsgaSA8PSBCRklfTVNJWF9DUEVfUU1BWF9DQjsgaSsrKQorCQliZmEtPm1zaXguaGFuZGxlcltpXSA9IGJmYV9tc2l4X3JlcXE7CisKKwlmb3IgKGkgPSBCRklfTVNJWF9STUVfUU1JTl9DQjsgaSA8PSBCRklfTVNJWF9STUVfUU1BWF9DQjsgaSsrKQorCQliZmEtPm1zaXguaGFuZGxlcltpXSA9IGJmYV9tc2l4X3JzcHE7CiB9CiAKIHZvaWQKIGJmYV9od2NiX21zaXhfdW5pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKQogeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEJGSV9NU0lYX0NCX01BWDsgaSsrKQorCQliZmEtPm1zaXguaGFuZGxlcltpXSA9IGJmYV9od2NiX21zaXhfZHVtbXk7CiB9CiAKIC8qCkBAIC0xNTYsNiArMTU2LDYgQEAKIHZvaWQKIGJmYV9od2NiX21zaXhfZ2V0X3JtZV9yYW5nZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyICpzdGFydCwgdTMyICplbmQpCiB7Ci0JKnN0YXJ0ID0gQkZBX01TSVhfUk1FX1EwOwotCSplbmQgPSBCRkFfTVNJWF9STUVfUTc7CisJKnN0YXJ0ID0gQkZJX01TSVhfUk1FX1FNSU5fQ0I7CisJKmVuZCA9IEJGSV9NU0lYX1JNRV9RTUFYX0NCOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY3QuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2N0LmMKaW5kZXggMjEwMThkOS4uOTg5YmJjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY3QuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jdC5jCkBAIC0xNywyOSArMTcsMTAgQEAKIAogI2luY2x1ZGUgImJmYWRfZHJ2LmgiCiAjaW5jbHVkZSAiYmZhX21vZHVsZXMuaCIKLSNpbmNsdWRlICJiZmlfY3RyZWcuaCIKKyNpbmNsdWRlICJiZmlfcmVnLmgiCiAKIEJGQV9UUkNfRklMRShIQUwsIElPQ0ZDX0NUKTsKIAotc3RhdGljIHUzMiBfX2N0X21zaXhfZXJyX3ZlY19yZWdbXSA9IHsKLQlIT1NUX01TSVhfRVJSX0lOREVYX0ZOMCwKLQlIT1NUX01TSVhfRVJSX0lOREVYX0ZOMSwKLQlIT1NUX01TSVhfRVJSX0lOREVYX0ZOMiwKLQlIT1NUX01TSVhfRVJSX0lOREVYX0ZOMywKLX07Ci0KLXN0YXRpYyB2b2lkCi1iZmFfaHdjdF9tc2l4X2xwdV9lcnJfc2V0KHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfYm9vbGVhbl90IG1zaXgsIGludCB2ZWMpCi17Ci0JaW50IGZuID0gYmZhX2lvY19wY2lmbigmYmZhLT5pb2MpOwotCXZvaWQgX19pb21lbSAqa3ZhID0gYmZhX2lvY19iYXIwKCZiZmEtPmlvYyk7Ci0KLQlpZiAobXNpeCkKLQkJd3JpdGVsKHZlYywga3ZhICsgX19jdF9tc2l4X2Vycl92ZWNfcmVnW2ZuXSk7Ci0JZWxzZQotCQl3cml0ZWwoMCwga3ZhICsgX19jdF9tc2l4X2Vycl92ZWNfcmVnW2ZuXSk7Ci19Ci0KIC8qCiAgKiBEdW1teSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgaGFuZGxpbmcgc3B1cmlvdXMgaW50ZXJydXB0IGR1cmluZyBjaGlwLXJlaW5pdC4KICAqLwpAQCAtNTMsNyArMzQsNyBAQAogewogCXN0cnVjdCBiZmFfaW9jZmNfcmVnc19zCSpiZmFfcmVncyA9ICZiZmEtPmlvY2ZjLmJmYV9yZWdzOwogCXZvaWQgX19pb21lbSAqa3ZhID0gYmZhX2lvY19iYXIwKCZiZmEtPmlvYyk7Ci0JaW50CQkJaSwgcSwgZm4gPSBiZmFfaW9jX3BjaWZuKCZiZmEtPmlvYyk7CisJaW50CWZuID0gYmZhX2lvY19wY2lmbigmYmZhLT5pb2MpOwogCiAJaWYgKGZuID09IDApIHsKIAkJYmZhX3JlZ3MtPmludHJfc3RhdHVzID0gKGt2YSArIEhPU1RGTjBfSU5UX1NUQVRVUyk7CkBAIC02MiwyNiArNDMsMTYgQEAKIAkJYmZhX3JlZ3MtPmludHJfc3RhdHVzID0gKGt2YSArIEhPU1RGTjFfSU5UX1NUQVRVUyk7CiAJCWJmYV9yZWdzLT5pbnRyX21hc2sgICA9IChrdmEgKyBIT1NURk4xX0lOVF9NU0spOwogCX0KK30KIAotCWZvciAoaSA9IDA7IGkgPCBCRklfSU9DX01BWF9DUVM7IGkrKykgewotCQkvKgotCQkgKiBDUEUgcmVnaXN0ZXJzCi0JCSAqLwotCQlxID0gQ1BFX1FfTlVNKGZuLCBpKTsKLQkJYmZhX3JlZ3MtPmNwZV9xX3BpW2ldID0gKGt2YSArIENQRV9QSV9QVFJfUShxIDw8IDUpKTsKLQkJYmZhX3JlZ3MtPmNwZV9xX2NpW2ldID0gKGt2YSArIENQRV9DSV9QVFJfUShxIDw8IDUpKTsKLQkJYmZhX3JlZ3MtPmNwZV9xX2RlcHRoW2ldID0gKGt2YSArIENQRV9ERVBUSF9RKHEgPDwgNSkpOwotCQliZmFfcmVncy0+Y3BlX3FfY3RybFtpXSA9IChrdmEgKyBDUEVfUUNUUkxfUShxIDw8IDUpKTsKK3ZvaWQKK2JmYV9od2N0Ml9yZWdpbml0KHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfaW9jZmNfcmVnc19zICpiZmFfcmVncyA9ICZiZmEtPmlvY2ZjLmJmYV9yZWdzOworCXZvaWQgX19pb21lbQkqa3ZhID0gYmZhX2lvY19iYXIwKCZiZmEtPmlvYyk7CiAKLQkJLyoKLQkJICogUk1FIHJlZ2lzdGVycwotCQkgKi8KLQkJcSA9IENQRV9RX05VTShmbiwgaSk7Ci0JCWJmYV9yZWdzLT5ybWVfcV9waVtpXSA9IChrdmEgKyBSTUVfUElfUFRSX1EocSA8PCA1KSk7Ci0JCWJmYV9yZWdzLT5ybWVfcV9jaVtpXSA9IChrdmEgKyBSTUVfQ0lfUFRSX1EocSA8PCA1KSk7Ci0JCWJmYV9yZWdzLT5ybWVfcV9kZXB0aFtpXSA9IChrdmEgKyBSTUVfREVQVEhfUShxIDw8IDUpKTsKLQkJYmZhX3JlZ3MtPnJtZV9xX2N0cmxbaV0gPSAoa3ZhICsgUk1FX1FDVFJMX1EocSA8PCA1KSk7Ci0JfQorCWJmYV9yZWdzLT5pbnRyX3N0YXR1cyA9IChrdmEgKyBDVDJfSE9TVEZOX0lOVF9TVEFUVVMpOworCWJmYV9yZWdzLT5pbnRyX21hc2sgICA9IChrdmEgKyBDVDJfSE9TVEZOX0lOVFJfTUFTSyk7CiB9CiAKIHZvaWQKQEAgLTEwNiw5ICs3Nyw5IEBACiBiZmFfaHdjdF9tc2l4X2dldHZlY3Moc3RydWN0IGJmYV9zICpiZmEsIHUzMiAqbXNpeF92ZWNzX2JtYXAsCiAJCSB1MzIgKm51bV92ZWNzLCB1MzIgKm1heF92ZWNfYml0KQogewotCSptc2l4X3ZlY3NfYm1hcCA9ICgxIDw8IEJGQV9NU0lYX0NUX01BWCkgLSAxOwotCSptYXhfdmVjX2JpdCA9ICgxIDw8IChCRkFfTVNJWF9DVF9NQVggLSAxKSk7Ci0JKm51bV92ZWNzID0gQkZBX01TSVhfQ1RfTUFYOworCSptc2l4X3ZlY3NfYm1hcCA9ICgxIDw8IEJGSV9NU0lYX0NUX01BWCkgLSAxOworCSptYXhfdmVjX2JpdCA9ICgxIDw8IChCRklfTVNJWF9DVF9NQVggLSAxKSk7CisJKm51bV92ZWNzID0gQkZJX01TSVhfQ1RfTUFYOwogfQogCiAvKgpAQCAtMTE3LDcgKzg4LDcgQEAKIHZvaWQKIGJmYV9od2N0X21zaXhfaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IG52ZWNzKQogewotCVdBUk5fT04oKG52ZWNzICE9IDEpICYmIChudmVjcyAhPSBCRkFfTVNJWF9DVF9NQVgpKTsKKwlXQVJOX09OKChudmVjcyAhPSAxKSAmJiAobnZlY3MgIT0gQkZJX01TSVhfQ1RfTUFYKSk7CiAJYmZhX3RyYyhiZmEsIG52ZWNzKTsKIAogCWJmYS0+bXNpeC5udmVjcyA9IG52ZWNzOwpAQCAtMTI1LDcgKzk2LDE5IEBACiB9CiAKIHZvaWQKLWJmYV9od2N0X21zaXhfaW5zdGFsbChzdHJ1Y3QgYmZhX3MgKmJmYSkKK2JmYV9od2N0X21zaXhfY3RybF9pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCWlmIChiZmEtPm1zaXgubnZlY3MgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGJmYS0+bXNpeC5udmVjcyA9PSAxKQorCQliZmEtPm1zaXguaGFuZGxlcltCRklfTVNJWF9MUFVfRVJSX0NUXSA9IGJmYV9tc2l4X2FsbDsKKwllbHNlCisJCWJmYS0+bXNpeC5oYW5kbGVyW0JGSV9NU0lYX0xQVV9FUlJfQ1RdID0gYmZhX21zaXhfbHB1X2VycjsKK30KKwordm9pZAorYmZhX2h3Y3RfbXNpeF9xdWV1ZV9pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKQogewogCWludCBpOwogCkBAIC0xMzMsMTkgKzExNiwxNiBAQAogCQlyZXR1cm47CiAKIAlpZiAoYmZhLT5tc2l4Lm52ZWNzID09IDEpIHsKLQkJZm9yIChpID0gMDsgaSA8IEJGQV9NU0lYX0NUX01BWDsgaSsrKQorCQlmb3IgKGkgPSBCRklfTVNJWF9DUEVfUU1JTl9DVDsgaSA8IEJGSV9NU0lYX0NUX01BWDsgaSsrKQogCQkJYmZhLT5tc2l4LmhhbmRsZXJbaV0gPSBiZmFfbXNpeF9hbGw7CiAJCXJldHVybjsKIAl9CiAKLQlmb3IgKGkgPSBCRkFfTVNJWF9DUEVfUTA7IGkgPD0gQkZBX01TSVhfQ1BFX1EzOyBpKyspCisJZm9yIChpID0gQkZJX01TSVhfQ1BFX1FNSU5fQ1Q7IGkgPD0gQkZJX01TSVhfQ1BFX1FNQVhfQ1Q7IGkrKykKIAkJYmZhLT5tc2l4LmhhbmRsZXJbaV0gPSBiZmFfbXNpeF9yZXFxOwogCi0JZm9yICg7IGkgPD0gQkZBX01TSVhfUk1FX1EzOyBpKyspCisJZm9yIChpID0gQkZJX01TSVhfUk1FX1FNSU5fQ1Q7IGkgPD0gQkZJX01TSVhfUk1FX1FNQVhfQ1Q7IGkrKykKIAkJYmZhLT5tc2l4LmhhbmRsZXJbaV0gPSBiZmFfbXNpeF9yc3BxOwotCi0JV0FSTl9PTihpICE9IEJGQV9NU0lYX0xQVV9FUlIpOwotCWJmYS0+bXNpeC5oYW5kbGVyW0JGQV9NU0lYX0xQVV9FUlJdID0gYmZhX21zaXhfbHB1X2VycjsKIH0KIAogdm9pZApAQCAtMTUzLDcgKzEzMyw3IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQkZBX01TSVhfQ1RfTUFYOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEJGSV9NU0lYX0NUX01BWDsgaSsrKQogCQliZmEtPm1zaXguaGFuZGxlcltpXSA9IGJmYV9od2N0X21zaXhfZHVtbXk7CiB9CiAKQEAgLTE2NCwxMyArMTQ0LDEyIEBACiBiZmFfaHdjdF9pc3JfbW9kZV9zZXQoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3QgbXNpeCkKIHsKIAliZmFfdHJjKGJmYSwgMCk7Ci0JYmZhX2h3Y3RfbXNpeF9scHVfZXJyX3NldChiZmEsIG1zaXgsIEJGQV9NU0lYX0xQVV9FUlIpOwogCWJmYV9pb2NfaXNyX21vZGVfc2V0KCZiZmEtPmlvYywgbXNpeCk7CiB9CiAKIHZvaWQKIGJmYV9od2N0X21zaXhfZ2V0X3JtZV9yYW5nZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyICpzdGFydCwgdTMyICplbmQpCiB7Ci0JKnN0YXJ0ID0gQkZBX01TSVhfUk1FX1EwOwotCSplbmQgPSBCRkFfTVNJWF9STUVfUTM7CisJKnN0YXJ0ID0gQkZJX01TSVhfUk1FX1FNSU5fQ1Q7CisJKmVuZCA9IEJGSV9NU0lYX1JNRV9RTUFYX0NUOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYwppbmRleCA2YzdlMDMzLi5kNmMyYmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYwpAQCAtMTcsNyArMTcsNyBAQAogCiAjaW5jbHVkZSAiYmZhZF9kcnYuaCIKICNpbmNsdWRlICJiZmFfaW9jLmgiCi0jaW5jbHVkZSAiYmZpX2N0cmVnLmgiCisjaW5jbHVkZSAiYmZpX3JlZy5oIgogI2luY2x1ZGUgImJmYV9kZWZzLmgiCiAjaW5jbHVkZSAiYmZhX2RlZnNfc3ZjLmgiCiAKQEAgLTI5LDggKzI5LDggQEAKICNkZWZpbmUgQkZBX0lPQ19UT1YJCTMwMDAJLyogbXNlY3MgKi8KICNkZWZpbmUgQkZBX0lPQ19IV1NFTV9UT1YJNTAwCS8qIG1zZWNzICovCiAjZGVmaW5lIEJGQV9JT0NfSEJfVE9WCQk1MDAJLyogbXNlY3MgKi8KLSNkZWZpbmUgQkZBX0lPQ19IV0lOSVRfTUFYCTUKICNkZWZpbmUgQkZBX0lPQ19UT1ZfUkVDT1ZFUgkgQkZBX0lPQ19IQl9UT1YKKyNkZWZpbmUgQkZBX0lPQ19QT0xMX1RPVglCRkFfVElNRVJfRlJFUQogCiAjZGVmaW5lIGJmYV9pb2NfdGltZXJfc3RhcnQoX19pb2MpCQkJCQlcCiAJYmZhX3RpbWVyX2JlZ2luKChfX2lvYyktPnRpbWVyX21vZCwgJihfX2lvYyktPmlvY190aW1lciwJXApAQCAtNzksMTQgKzc5LDE3IEBACiBzdGF0aWMgdm9pZCBiZmFfaW9jX2h3X3NlbV9nZXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIHN0YXRpYyB2b2lkIGJmYV9pb2NfaHdpbml0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgYmZhX2Jvb2xlYW5fdCBmb3JjZSk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX3RpbWVvdXQodm9pZCAqaW9jKTsKK3N0YXRpYyB2b2lkIGJmYV9pb2NfcG9sbF9md2luaXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIHN0YXRpYyB2b2lkIGJmYV9pb2Nfc2VuZF9lbmFibGUoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIHN0YXRpYyB2b2lkIGJmYV9pb2Nfc2VuZF9kaXNhYmxlKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX3NlbmRfZ2V0YXR0cihzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogc3RhdGljIHZvaWQgYmZhX2lvY19oYl9tb25pdG9yKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX21ib3hfcG9sbChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwotc3RhdGljIHZvaWQgYmZhX2lvY19tYm94X2hiZmFpbChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOworc3RhdGljIHZvaWQgYmZhX2lvY19tYm94X2ZsdXNoKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX3JlY292ZXIoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIHN0YXRpYyB2b2lkIGJmYV9pb2NfY2hlY2tfYXR0cl93d25zKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CitzdGF0aWMgdm9pZCBiZmFfaW9jX2V2ZW50X25vdGlmeShzdHJ1Y3QgYmZhX2lvY19zICppb2MgLAorCQkJCWVudW0gYmZhX2lvY19ldmVudF9lIGV2ZW50KTsKIHN0YXRpYyB2b2lkIGJmYV9pb2NfZGlzYWJsZV9jb21wKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2xwdV9zdG9wKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2RlYnVnX3NhdmVfZnRyYyhzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwpAQCAtMTA1LDExICsxMDgsMTIgQEAKIAlJT0NfRV9FTkFCTEVECQk9IDUsCS8qICBmL3cgZW5hYmxlZAkJKi8KIAlJT0NfRV9GV1JTUF9HRVRBVFRSCT0gNiwJLyogIElPQyBnZXQgYXR0cmlidXRlIHJlc3BvbnNlCSovCiAJSU9DX0VfRElTQUJMRUQJCT0gNywJLyogIGYvdyBkaXNhYmxlZAkJKi8KLQlJT0NfRV9JTklURkFJTEVECT0gOCwJLyogIGZhaWx1cmUgbm90aWNlIGJ5IGlvY3BmIHNtCSovCi0JSU9DX0VfUEZGQUlMRUQJCT0gOSwJLyogIGZhaWx1cmUgbm90aWNlIGJ5IGlvY3BmIHNtCSovCi0JSU9DX0VfSEJGQUlMCQk9IDEwLAkvKiAgaGVhcnRiZWF0IGZhaWx1cmUJCSovCi0JSU9DX0VfSFdFUlJPUgkJPSAxMSwJLyogIGhhcmR3YXJlIGVycm9yIGludGVycnVwdAkqLwotCUlPQ19FX1RJTUVPVVQJCT0gMTIsCS8qICB0aW1lb3V0CQkJKi8KKwlJT0NfRV9QRkZBSUxFRAkJPSA4LAkvKiAgZmFpbHVyZSBub3RpY2UgYnkgaW9jcGYgc20JKi8KKwlJT0NfRV9IQkZBSUwJCT0gOSwJLyogIGhlYXJ0YmVhdCBmYWlsdXJlCQkqLworCUlPQ19FX0hXRVJST1IJCT0gMTAsCS8qICBoYXJkd2FyZSBlcnJvciBpbnRlcnJ1cHQJKi8KKwlJT0NfRV9USU1FT1VUCQk9IDExLAkvKiAgdGltZW91dAkJCSovCisJSU9DX0VfSFdGQUlMRUQJCT0gMTIsCS8qICBQQ0kgbWFwcGluZyBmYWlsdXJlIG5vdGljZQkqLworCUlPQ19FX0ZXUlNQX0FDUV9BRERSCT0gMTMsCS8qICBBY3F1aXJpbmcgYWRkcmVzcwkJKi8KIH07CiAKIGJmYV9mc21fc3RhdGVfZGVjbChiZmFfaW9jLCB1bmluaXQsIHN0cnVjdCBiZmFfaW9jX3MsIGVudW0gaW9jX2V2ZW50KTsKQEAgLTEyMSw2ICsxMjUsOCBAQAogYmZhX2ZzbV9zdGF0ZV9kZWNsKGJmYV9pb2MsIGZhaWwsIHN0cnVjdCBiZmFfaW9jX3MsIGVudW0gaW9jX2V2ZW50KTsKIGJmYV9mc21fc3RhdGVfZGVjbChiZmFfaW9jLCBkaXNhYmxpbmcsIHN0cnVjdCBiZmFfaW9jX3MsIGVudW0gaW9jX2V2ZW50KTsKIGJmYV9mc21fc3RhdGVfZGVjbChiZmFfaW9jLCBkaXNhYmxlZCwgc3RydWN0IGJmYV9pb2NfcywgZW51bSBpb2NfZXZlbnQpOworYmZhX2ZzbV9zdGF0ZV9kZWNsKGJmYV9pb2MsIGh3ZmFpbCwgc3RydWN0IGJmYV9pb2NfcywgZW51bSBpb2NfZXZlbnQpOworYmZhX2ZzbV9zdGF0ZV9kZWNsKGJmYV9pb2MsIGFjcV9hZGRyLCBzdHJ1Y3QgYmZhX2lvY19zLCBlbnVtIGlvY19ldmVudCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYmZhX3NtX3RhYmxlX3MgaW9jX3NtX3RhYmxlW10gPSB7CiAJe0JGQV9TTShiZmFfaW9jX3NtX3VuaW5pdCksIEJGQV9JT0NfVU5JTklUfSwKQEAgLTEzMiw2ICsxMzgsOCBAQAogCXtCRkFfU00oYmZhX2lvY19zbV9mYWlsKSwgQkZBX0lPQ19GQUlMfSwKIAl7QkZBX1NNKGJmYV9pb2Nfc21fZGlzYWJsaW5nKSwgQkZBX0lPQ19ESVNBQkxJTkd9LAogCXtCRkFfU00oYmZhX2lvY19zbV9kaXNhYmxlZCksIEJGQV9JT0NfRElTQUJMRUR9LAorCXtCRkFfU00oYmZhX2lvY19zbV9od2ZhaWwpLCBCRkFfSU9DX0hXRkFJTH0sCisJe0JGQV9TTShiZmFfaW9jX3NtX2FjcV9hZGRyKSwgQkZBX0lPQ19BQ1FfQUREUn0sCiB9OwogCiAvKgpAQCAtMTQzLDkgKzE1MSw5IEBACiAJCQliZmFfaW9jcGZfdGltZW91dCwgKF9faW9jKSwgQkZBX0lPQ19UT1YpCiAjZGVmaW5lIGJmYV9pb2NwZl90aW1lcl9zdG9wKF9faW9jKQliZmFfdGltZXJfc3RvcCgmKF9faW9jKS0+aW9jX3RpbWVyKQogCi0jZGVmaW5lIGJmYV9pb2NwZl9yZWNvdmVyeV90aW1lcl9zdGFydChfX2lvYykJCQkJXAorI2RlZmluZSBiZmFfaW9jcGZfcG9sbF90aW1lcl9zdGFydChfX2lvYykJCQkJXAogCWJmYV90aW1lcl9iZWdpbigoX19pb2MpLT50aW1lcl9tb2QsICYoX19pb2MpLT5pb2NfdGltZXIsCVwKLQkJCWJmYV9pb2NwZl90aW1lb3V0LCAoX19pb2MpLCBCRkFfSU9DX1RPVl9SRUNPVkVSKQorCQkJYmZhX2lvY3BmX3BvbGxfdGltZW91dCwgKF9faW9jKSwgQkZBX0lPQ19QT0xMX1RPVikKIAogI2RlZmluZSBiZmFfc2VtX3RpbWVyX3N0YXJ0KF9faW9jKQkJCQkJXAogCWJmYV90aW1lcl9iZWdpbigoX19pb2MpLT50aW1lcl9tb2QsICYoX19pb2MpLT5zZW1fdGltZXIsCVwKQEAgLTE1Nyw2ICsxNjUsNyBAQAogICovCiBzdGF0aWMgdm9pZCBiZmFfaW9jcGZfdGltZW91dCh2b2lkICppb2NfYXJnKTsKIHN0YXRpYyB2b2lkIGJmYV9pb2NwZl9zZW1fdGltZW91dCh2b2lkICppb2NfYXJnKTsKK3N0YXRpYyB2b2lkIGJmYV9pb2NwZl9wb2xsX3RpbWVvdXQodm9pZCAqaW9jX2FyZyk7CiAKIC8qCiAgKiBJT0NQRiBzdGF0ZSBtYWNoaW5lIGV2ZW50cwpAQCAtMTczLDYgKzE4Miw3IEBACiAJSU9DUEZfRV9HRVRBVFRSRkFJTAk9IDksCS8qICBpbml0IGZhaWwgbm90aWNlIGJ5IGlvYyBzbQkqLwogCUlPQ1BGX0VfU0VNTE9DS0VECT0gMTAsCS8qICBoL3cgc2VtYXBob3JlIGlzIGxvY2tlZAkqLwogCUlPQ1BGX0VfVElNRU9VVAkJPSAxMSwJLyogIGYvdyByZXNwb25zZSB0aW1lb3V0CSovCisJSU9DUEZfRV9TRU1fRVJST1IJPSAxMiwJLyogIGgvdyBzZW0gbWFwcGluZyBlcnJvcgkqLwogfTsKIAogLyoKQEAgLTMxNCwxMSArMzI0LDE2IEBACiAJCS8qICEhISBmYWxsIHRocm91Z2ggISEhICovCiAJY2FzZSBJT0NfRV9IV0VSUk9SOgogCQlpb2MtPmNiZm4tPmVuYWJsZV9jYmZuKGlvYy0+YmZhLCBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFKTsKLQkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2ZhaWxfcmV0cnkpOworCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZmFpbCk7CiAJCWlmIChldmVudCAhPSBJT0NfRV9QRkZBSUxFRCkKIAkJCWJmYV9mc21fc2VuZF9ldmVudCgmaW9jLT5pb2NwZiwgSU9DUEZfRV9JTklURkFJTCk7CiAJCWJyZWFrOwogCisJY2FzZSBJT0NfRV9IV0ZBSUxFRDoKKwkJaW9jLT5jYmZuLT5lbmFibGVfY2Jmbihpb2MtPmJmYSwgQkZBX1NUQVRVU19JT0NfRkFJTFVSRSk7CisJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9od2ZhaWwpOworCQlicmVhazsKKwogCWNhc2UgSU9DX0VfRElTQUJMRToKIAkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2Rpc2FibGluZyk7CiAJCWJyZWFrOwpAQCAtMzU2LDE3ICszNzEsMjMgQEAKIAljYXNlIElPQ19FX0ZXUlNQX0dFVEFUVFI6CiAJCWJmYV9pb2NfdGltZXJfc3RvcChpb2MpOwogCQliZmFfaW9jX2NoZWNrX2F0dHJfd3ducyhpb2MpOworCQliZmFfaW9jX2hiX21vbml0b3IoaW9jKTsKIAkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX29wKTsKIAkJYnJlYWs7CiAKKwljYXNlIElPQ19FX0ZXUlNQX0FDUV9BRERSOgorCQliZmFfaW9jX3RpbWVyX3N0b3AoaW9jKTsKKwkJYmZhX2lvY19oYl9tb25pdG9yKGlvYyk7CisJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9hY3FfYWRkcik7CiAJCWJyZWFrOworCiAJY2FzZSBJT0NfRV9QRkZBSUxFRDoKIAljYXNlIElPQ19FX0hXRVJST1I6CiAJCWJmYV9pb2NfdGltZXJfc3RvcChpb2MpOwogCQkvKiAhISEgZmFsbCB0aHJvdWdoICEhISAqLwogCWNhc2UgSU9DX0VfVElNRU9VVDoKIAkJaW9jLT5jYmZuLT5lbmFibGVfY2Jmbihpb2MtPmJmYSwgQkZBX1NUQVRVU19JT0NfRkFJTFVSRSk7Ci0JCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9mYWlsX3JldHJ5KTsKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2ZhaWwpOwogCQlpZiAoZXZlbnQgIT0gSU9DX0VfUEZGQUlMRUQpCiAJCQliZmFfZnNtX3NlbmRfZXZlbnQoJmlvYy0+aW9jcGYsIElPQ1BGX0VfR0VUQVRUUkZBSUwpOwogCQlicmVhazsKQEAgLTM4NCw2ICs0MDUsNTAgQEAKIAl9CiB9CiAKKy8qCisgKiBBY3F1aXJpbmcgYWRkcmVzcyBmcm9tIGZhYnJpYyAoZW50cnkgZnVuY3Rpb24pCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9jX3NtX2FjcV9hZGRyX2VudHJ5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKK30KKworLyoKKyAqCUFjcXVpcmluZyBhZGRyZXNzIGZyb20gdGhlIGZhYnJpYworICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19zbV9hY3FfYWRkcihzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gaW9jX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaW9jLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJT0NfRV9GV1JTUF9HRVRBVFRSOgorCQliZmFfaW9jX2NoZWNrX2F0dHJfd3ducyhpb2MpOworCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fb3ApOworCQlicmVhazsKKworCWNhc2UgSU9DX0VfUEZGQUlMRUQ6CisJY2FzZSBJT0NfRV9IV0VSUk9SOgorCQliZmFfaGJfdGltZXJfc3RvcChpb2MpOworCWNhc2UgSU9DX0VfSEJGQUlMOgorCQlpb2MtPmNiZm4tPmVuYWJsZV9jYmZuKGlvYy0+YmZhLCBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFKTsKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2ZhaWwpOworCQlpZiAoZXZlbnQgIT0gSU9DX0VfUEZGQUlMRUQpCisJCQliZmFfZnNtX3NlbmRfZXZlbnQoJmlvYy0+aW9jcGYsIElPQ1BGX0VfR0VUQVRUUkZBSUwpOworCQlicmVhazsKKworCWNhc2UgSU9DX0VfRElTQUJMRToKKwkJYmZhX2hiX3RpbWVyX3N0b3AoaW9jKTsKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2Rpc2FibGluZyk7CisJCWJyZWFrOworCisJY2FzZSBJT0NfRV9FTkFCTEU6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOworCX0KK30KIAogc3RhdGljIHZvaWQKIGJmYV9pb2Nfc21fb3BfZW50cnkoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQpAQCAtMzkxLDcgKzQ1Niw3IEBACiAJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopaW9jLT5iZmEtPmJmYWQ7CiAKIAlpb2MtPmNiZm4tPmVuYWJsZV9jYmZuKGlvYy0+YmZhLCBCRkFfU1RBVFVTX09LKTsKLQliZmFfaW9jX2hiX21vbml0b3IoaW9jKTsKKwliZmFfaW9jX2V2ZW50X25vdGlmeShpb2MsIEJGQV9JT0NfRV9FTkFCTEVEKTsKIAlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwgIklPQyBlbmFibGVkXG4iKTsKIH0KIApAQCAtNDE0LDEzICs0NzksMTMgQEAKIAkJYmZhX2hiX3RpbWVyX3N0b3AoaW9jKTsKIAkJLyogISEhIGZhbGwgdGhyb3VnaCAhISEgKi8KIAljYXNlIElPQ19FX0hCRkFJTDoKLQkJYmZhX2lvY19mYWlsX25vdGlmeShpb2MpOwotCiAJCWlmIChpb2MtPmlvY3BmLmF1dG9fcmVjb3ZlcikKIAkJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9mYWlsX3JldHJ5KTsKIAkJZWxzZQogCQkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2ZhaWwpOwogCisJCWJmYV9pb2NfZmFpbF9ub3RpZnkoaW9jKTsKKwogCQlpZiAoZXZlbnQgIT0gSU9DX0VfUEZGQUlMRUQpCiAJCQliZmFfZnNtX3NlbmRfZXZlbnQoJmlvYy0+aW9jcGYsIElPQ1BGX0VfRkFJTCk7CiAJCWJyZWFrOwpAQCAtNDYxLDYgKzUyNiwxMSBAQAogCQliZmFfZnNtX3NlbmRfZXZlbnQoJmlvYy0+aW9jcGYsIElPQ1BGX0VfRkFJTCk7CiAJCWJyZWFrOwogCisJY2FzZSBJT0NfRV9IV0ZBSUxFRDoKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX2h3ZmFpbCk7CisJCWJmYV9pb2NfZGlzYWJsZV9jb21wKGlvYyk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJYmZhX3NtX2ZhdWx0KGlvYywgZXZlbnQpOwogCX0KQEAgLTUyNSwxMiArNTk1LDE0IEBACiAJCSAqIEluaXRpYWxpemF0aW9uIHJldHJ5IGZhaWxlZC4KIAkJICovCiAJCWlvYy0+Y2Jmbi0+ZW5hYmxlX2NiZm4oaW9jLT5iZmEsIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkUpOworCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZmFpbCk7CiAJCWlmIChldmVudCAhPSBJT0NfRV9QRkZBSUxFRCkKIAkJCWJmYV9mc21fc2VuZF9ldmVudCgmaW9jLT5pb2NwZiwgSU9DUEZfRV9JTklURkFJTCk7CiAJCWJyZWFrOwogCi0JY2FzZSBJT0NfRV9JTklURkFJTEVEOgotCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZmFpbCk7CisJY2FzZSBJT0NfRV9IV0ZBSUxFRDoKKwkJaW9jLT5jYmZuLT5lbmFibGVfY2Jmbihpb2MtPmJmYSwgQkZBX1NUQVRVU19JT0NfRkFJTFVSRSk7CisJCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV9od2ZhaWwpOwogCQlicmVhazsKIAogCWNhc2UgSU9DX0VfRU5BQkxFOgpAQCAtNTkwLDYgKzY2MiwzNSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQKK2JmYV9pb2Nfc21faHdmYWlsX2VudHJ5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwliZmFfdHJjKGlvYywgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfaW9jX3NtX2h3ZmFpbChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gaW9jX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoaW9jLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJT0NfRV9FTkFCTEU6CisJCWlvYy0+Y2Jmbi0+ZW5hYmxlX2NiZm4oaW9jLT5iZmEsIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkUpOworCQlicmVhazsKKworCWNhc2UgSU9DX0VfRElTQUJMRToKKwkJaW9jLT5jYmZuLT5kaXNhYmxlX2NiZm4oaW9jLT5iZmEpOworCQlicmVhazsKKworCWNhc2UgSU9DX0VfREVUQUNIOgorCQliZmFfZnNtX3NldF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fdW5pbml0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoaW9jLCBldmVudCk7CisJfQorfQorCiAvKgogICogSU9DUEYgU3RhdGUgTWFjaGluZQogICovCkBAIC02MDAsNyArNzAxLDcgQEAKIHN0YXRpYyB2b2lkCiBiZmFfaW9jcGZfc21fcmVzZXRfZW50cnkoc3RydWN0IGJmYV9pb2NwZl9zICppb2NwZikKIHsKLQlpb2NwZi0+cmV0cnlfY291bnQgPSAwOworCWlvY3BmLT5md19taXNtYXRjaF9ub3RpZmllZCA9IEJGQV9GQUxTRTsKIAlpb2NwZi0+YXV0b19yZWNvdmVyID0gYmZhX2F1dG9fcmVjb3ZlcjsKIH0KIApAQCAtNjMzLDYgKzczNCwyOCBAQAogc3RhdGljIHZvaWQKIGJmYV9pb2NwZl9zbV9md2NoZWNrX2VudHJ5KHN0cnVjdCBiZmFfaW9jcGZfcyAqaW9jcGYpCiB7CisJc3RydWN0IGJmaV9pb2NfaW1hZ2VfaGRyX3MJZndoZHI7CisJdTMyCWZ3c3RhdGUgPSByZWFkbChpb2NwZi0+aW9jLT5pb2NfcmVncy5pb2NfZndzdGF0ZSk7CisKKwkvKiBoL3cgc2VtIGluaXQgKi8KKwlpZiAoZndzdGF0ZSA9PSBCRklfSU9DX1VOSU5JVCkKKwkJZ290byBzZW1fZ2V0OworCisJYmZhX2lvY19md3Zlcl9nZXQoaW9jcGYtPmlvYywgJmZ3aGRyKTsKKworCWlmIChzd2FiMzIoZndoZHIuZXhlYykgPT0gQkZJX0ZXQk9PVF9UWVBFX05PUk1BTCkKKwkJZ290byBzZW1fZ2V0OworCisJYmZhX3RyYyhpb2NwZi0+aW9jLCBmd3N0YXRlKTsKKwliZmFfdHJjKGlvY3BmLT5pb2MsIGZ3aGRyLmV4ZWMpOworCXdyaXRlbChCRklfSU9DX1VOSU5JVCwgaW9jcGYtPmlvYy0+aW9jX3JlZ3MuaW9jX2Z3c3RhdGUpOworCisJLyoKKwkgKiBUcnkgdG8gbG9jayBhbmQgdGhlbiB1bmxvY2sgdGhlIHNlbWFwaG9yZS4KKwkgKi8KKwlyZWFkbChpb2NwZi0+aW9jLT5pb2NfcmVncy5pb2Nfc2VtX3JlZyk7CisJd3JpdGVsKDEsIGlvY3BmLT5pb2MtPmlvY19yZWdzLmlvY19zZW1fcmVnKTsKK3NlbV9nZXQ6CiAJYmZhX2lvY19od19zZW1fZ2V0KGlvY3BmLT5pb2MpOwogfQogCkBAIC02NTAsNyArNzczLDYgQEAKIAljYXNlIElPQ1BGX0VfU0VNTE9DS0VEOgogCQlpZiAoYmZhX2lvY19maXJtd2FyZV9sb2NrKGlvYykpIHsKIAkJCWlmIChiZmFfaW9jX3N5bmNfc3RhcnQoaW9jKSkgewotCQkJCWlvY3BmLT5yZXRyeV9jb3VudCA9IDA7CiAJCQkJYmZhX2lvY19zeW5jX2pvaW4oaW9jKTsKIAkJCQliZmFfZnNtX3NldF9zdGF0ZShpb2NwZiwgYmZhX2lvY3BmX3NtX2h3aW5pdCk7CiAJCQl9IGVsc2UgewpAQCAtNjY0LDYgKzc4NiwxMSBAQAogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBJT0NQRl9FX1NFTV9FUlJPUjoKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jcGYsIGJmYV9pb2NwZl9zbV9mYWlsKTsKKwkJYmZhX2ZzbV9zZW5kX2V2ZW50KGlvYywgSU9DX0VfSFdGQUlMRUQpOworCQlicmVhazsKKwogCWNhc2UgSU9DUEZfRV9ESVNBQkxFOgogCQliZmFfc2VtX3RpbWVyX3N0b3AoaW9jKTsKIAkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jcGYsIGJmYV9pb2NwZl9zbV9yZXNldCk7CkBAIC02ODksMTAgKzgxNiwxMCBAQAogCS8qCiAJICogQ2FsbCBvbmx5IHRoZSBmaXJzdCB0aW1lIHNtIGVudGVycyBmd21pc21hdGNoIHN0YXRlLgogCSAqLwotCWlmIChpb2NwZi0+cmV0cnlfY291bnQgPT0gMCkKKwlpZiAoaW9jcGYtPmZ3X21pc21hdGNoX25vdGlmaWVkID09IEJGQV9GQUxTRSkKIAkJYmZhX2lvY19wZl9md21pc21hdGNoKGlvY3BmLT5pb2MpOwogCi0JaW9jcGYtPnJldHJ5X2NvdW50Kys7CisJaW9jcGYtPmZ3X21pc21hdGNoX25vdGlmaWVkID0gQkZBX1RSVUU7CiAJYmZhX2lvY3BmX3RpbWVyX3N0YXJ0KGlvY3BmLT5pb2MpOwogfQogCkBAIC03NTcsNiArODg0LDExIEBACiAJCX0KIAkJYnJlYWs7CiAKKwljYXNlIElPQ1BGX0VfU0VNX0VSUk9SOgorCQliZmFfZnNtX3NldF9zdGF0ZShpb2NwZiwgYmZhX2lvY3BmX3NtX2ZhaWwpOworCQliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9IV0ZBSUxFRCk7CisJCWJyZWFrOworCiAJY2FzZSBJT0NQRl9FX0RJU0FCTEU6CiAJCWJmYV9zZW1fdGltZXJfc3RvcChpb2MpOwogCQliZmFfZnNtX3NldF9zdGF0ZShpb2NwZiwgYmZhX2lvY3BmX3NtX2Rpc2FibGluZ19zeW5jKTsKQEAgLTc3MCw3ICs5MDIsNyBAQAogc3RhdGljIHZvaWQKIGJmYV9pb2NwZl9zbV9od2luaXRfZW50cnkoc3RydWN0IGJmYV9pb2NwZl9zICppb2NwZikKIHsKLQliZmFfaW9jcGZfdGltZXJfc3RhcnQoaW9jcGYtPmlvYyk7CisJaW9jcGYtPnBvbGxfdGltZSA9IDA7CiAJYmZhX2lvY19od2luaXQoaW9jcGYtPmlvYywgQkZBX0ZBTFNFKTsKIH0KIApAQCAtNzg3LDIwICs5MTksMTIgQEAKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIElPQ1BGX0VfRldSRUFEWToKLQkJYmZhX2lvY3BmX3RpbWVyX3N0b3AoaW9jKTsKIAkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jcGYsIGJmYV9pb2NwZl9zbV9lbmFibGluZyk7CiAJCWJyZWFrOwogCi0JY2FzZSBJT0NQRl9FX0lOSVRGQUlMOgotCQliZmFfaW9jcGZfdGltZXJfc3RvcChpb2MpOwotCQkvKgotCQkgKiAhISEgZmFsbCB0aHJvdWdoICEhIQotCQkgKi8KLQogCWNhc2UgSU9DUEZfRV9USU1FT1VUOgogCQl3cml0ZWwoMSwgaW9jLT5pb2NfcmVncy5pb2Nfc2VtX3JlZyk7Ci0JCWlmIChldmVudCA9PSBJT0NQRl9FX1RJTUVPVVQpCi0JCQliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9QRkZBSUxFRCk7CisJCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX1BGRkFJTEVEKTsKIAkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jcGYsIGJmYV9pb2NwZl9zbV9pbml0ZmFpbF9zeW5jKTsKIAkJYnJlYWs7CiAKQEAgLTgyMCw2ICs5NDQsMTAgQEAKIGJmYV9pb2NwZl9zbV9lbmFibGluZ19lbnRyeShzdHJ1Y3QgYmZhX2lvY3BmX3MgKmlvY3BmKQogewogCWJmYV9pb2NwZl90aW1lcl9zdGFydChpb2NwZi0+aW9jKTsKKwkvKgorCSAqIEVuYWJsZSBJbnRlcnJ1cHRzIGJlZm9yZSBzZW5kaW5nIGZ3IElPQyBFTkFCTEUgY21kLgorCSAqLworCWlvY3BmLT5pb2MtPmNiZm4tPnJlc2V0X2NiZm4oaW9jcGYtPmlvYy0+YmZhKTsKIAliZmFfaW9jX3NlbmRfZW5hYmxlKGlvY3BmLT5pb2MpOwogfQogCkBAIC04NjAsMTAgKzk4OCw2IEBACiAJCWJmYV9mc21fc2V0X3N0YXRlKGlvY3BmLCBiZmFfaW9jcGZfc21fZGlzYWJsaW5nKTsKIAkJYnJlYWs7CiAKLQljYXNlIElPQ1BGX0VfRldSRUFEWToKLQkJYmZhX2lvY19zZW5kX2VuYWJsZShpb2MpOwotCQlicmVhazsKLQogCWRlZmF1bHQ6CiAJCWJmYV9zbV9mYXVsdChpb2MsIGV2ZW50KTsKIAl9CkBAIC04OTUsMTYgKzEwMTksNiBAQAogCQliZmFfZnNtX3NldF9zdGF0ZShpb2NwZiwgYmZhX2lvY3BmX3NtX2ZhaWxfc3luYyk7CiAJCWJyZWFrOwogCi0JY2FzZSBJT0NQRl9FX0ZXUkVBRFk6Ci0JCWlmIChiZmFfaW9jX2lzX29wZXJhdGlvbmFsKGlvYykpIHsKLQkJCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX1BGRkFJTEVEKTsKLQkJCWJmYV9mc21fc2V0X3N0YXRlKGlvY3BmLCBiZmFfaW9jcGZfc21fZmFpbF9zeW5jKTsKLQkJfSBlbHNlIHsKLQkJCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX1BGRkFJTEVEKTsKLQkJCWJmYV9mc21fc2V0X3N0YXRlKGlvY3BmLCBiZmFfaW9jcGZfc21faW5pdGZhaWxfc3luYyk7Ci0JCX0KLQkJYnJlYWs7Ci0KIAlkZWZhdWx0OgogCQliZmFfc21fZmF1bHQoaW9jLCBldmVudCk7CiAJfQpAQCAtOTI5LDcgKzEwNDMsNiBAQAogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgSU9DUEZfRV9GV1JTUF9ESVNBQkxFOgotCWNhc2UgSU9DUEZfRV9GV1JFQURZOgogCQliZmFfaW9jcGZfdGltZXJfc3RvcChpb2MpOwogCQliZmFfZnNtX3NldF9zdGF0ZShpb2NwZiwgYmZhX2lvY3BmX3NtX2Rpc2FibGluZ19zeW5jKTsKIAkJYnJlYWs7CkBAIC05NzYsNiArMTA4OSwxMSBAQAogCQliZmFfZnNtX3NldF9zdGF0ZShpb2NwZiwgYmZhX2lvY3BmX3NtX2Rpc2FibGVkKTsKIAkJYnJlYWs7CiAKKwljYXNlIElPQ1BGX0VfU0VNX0VSUk9SOgorCQliZmFfZnNtX3NldF9zdGF0ZShpb2NwZiwgYmZhX2lvY3BmX3NtX2ZhaWwpOworCQliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9IV0ZBSUxFRCk7CisJCWJyZWFrOworCiAJY2FzZSBJT0NQRl9FX0ZBSUw6CiAJCWJyZWFrOwogCkBAIC05OTAsNiArMTEwOCw3IEBACiBzdGF0aWMgdm9pZAogYmZhX2lvY3BmX3NtX2Rpc2FibGVkX2VudHJ5KHN0cnVjdCBiZmFfaW9jcGZfcyAqaW9jcGYpCiB7CisJYmZhX2lvY19tYm94X2ZsdXNoKGlvY3BmLT5pb2MpOwogCWJmYV9mc21fc2VuZF9ldmVudChpb2NwZi0+aW9jLCBJT0NfRV9ESVNBQkxFRCk7CiB9CiAKQEAgLTEwMDIsNyArMTEyMSw2IEBACiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBJT0NQRl9FX0VOQUJMRToKLQkJaW9jcGYtPnJldHJ5X2NvdW50ID0gMDsKIAkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jcGYsIGJmYV9pb2NwZl9zbV9zZW13YWl0KTsKIAkJYnJlYWs7CiAKQEAgLTEwMTksNiArMTEzNyw3IEBACiBzdGF0aWMgdm9pZAogYmZhX2lvY3BmX3NtX2luaXRmYWlsX3N5bmNfZW50cnkoc3RydWN0IGJmYV9pb2NwZl9zICppb2NwZikKIHsKKwliZmFfaW9jX2RlYnVnX3NhdmVfZnRyYyhpb2NwZi0+aW9jKTsKIAliZmFfaW9jX2h3X3NlbV9nZXQoaW9jcGYtPmlvYyk7CiB9CiAKQEAgLTEwMzUsMjAgKzExNTQsMTUgQEAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBJT0NQRl9FX1NFTUxPQ0tFRDoKIAkJYmZhX2lvY19ub3RpZnlfZmFpbChpb2MpOwotCQliZmFfaW9jX3N5bmNfYWNrKGlvYyk7Ci0JCWlvY3BmLT5yZXRyeV9jb3VudCsrOwotCQlpZiAoaW9jcGYtPnJldHJ5X2NvdW50ID49IEJGQV9JT0NfSFdJTklUX01BWCkgewotCQkJYmZhX2lvY19zeW5jX2xlYXZlKGlvYyk7Ci0JCQl3cml0ZWwoMSwgaW9jLT5pb2NfcmVncy5pb2Nfc2VtX3JlZyk7Ci0JCQliZmFfZnNtX3NldF9zdGF0ZShpb2NwZiwgYmZhX2lvY3BmX3NtX2luaXRmYWlsKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChiZmFfaW9jX3N5bmNfY29tcGxldGUoaW9jKSkKLQkJCQliZmFfZnNtX3NldF9zdGF0ZShpb2NwZiwgYmZhX2lvY3BmX3NtX2h3aW5pdCk7Ci0JCQllbHNlIHsKLQkJCQl3cml0ZWwoMSwgaW9jLT5pb2NfcmVncy5pb2Nfc2VtX3JlZyk7Ci0JCQkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jcGYsIGJmYV9pb2NwZl9zbV9zZW13YWl0KTsKLQkJCX0KLQkJfQorCQliZmFfaW9jX3N5bmNfbGVhdmUoaW9jKTsKKwkJd3JpdGVsKEJGSV9JT0NfRkFJTCwgaW9jLT5pb2NfcmVncy5pb2NfZndzdGF0ZSk7CisJCXdyaXRlbCgxLCBpb2MtPmlvY19yZWdzLmlvY19zZW1fcmVnKTsKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jcGYsIGJmYV9pb2NwZl9zbV9pbml0ZmFpbCk7CisJCWJyZWFrOworCisJY2FzZSBJT0NQRl9FX1NFTV9FUlJPUjoKKwkJYmZhX2ZzbV9zZXRfc3RhdGUoaW9jcGYsIGJmYV9pb2NwZl9zbV9mYWlsKTsKKwkJYmZhX2ZzbV9zZW5kX2V2ZW50KGlvYywgSU9DX0VfSFdGQUlMRUQpOwogCQlicmVhazsKIAogCWNhc2UgSU9DUEZfRV9ESVNBQkxFOgpAQCAtMTA3Myw3ICsxMTg3LDcgQEAKIHN0YXRpYyB2b2lkCiBiZmFfaW9jcGZfc21faW5pdGZhaWxfZW50cnkoc3RydWN0IGJmYV9pb2NwZl9zICppb2NwZikKIHsKLQliZmFfZnNtX3NlbmRfZXZlbnQoaW9jcGYtPmlvYywgSU9DX0VfSU5JVEZBSUxFRCk7CisJYmZhX3RyYyhpb2NwZi0+aW9jLCAwKTsKIH0KIAogLyoKQEAgLTExMTIsNyArMTIyNiw3IEBACiAJLyoKIAkgKiBGbHVzaCBhbnkgcXVldWVkIHVwIG1haWxib3ggcmVxdWVzdHMuCiAJICovCi0JYmZhX2lvY19tYm94X2hiZmFpbChpb2NwZi0+aW9jKTsKKwliZmFfaW9jX21ib3hfZmx1c2goaW9jcGYtPmlvYyk7CiAKIAliZmFfaW9jX2h3X3NlbV9nZXQoaW9jcGYtPmlvYyk7CiB9CkBAIC0xMTI2LDExICsxMjQwLDExIEBACiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBJT0NQRl9FX1NFTUxPQ0tFRDoKLQkJaW9jcGYtPnJldHJ5X2NvdW50ID0gMDsKIAkJYmZhX2lvY19zeW5jX2Fjayhpb2MpOwogCQliZmFfaW9jX25vdGlmeV9mYWlsKGlvYyk7CiAJCWlmICghaW9jcGYtPmF1dG9fcmVjb3ZlcikgewogCQkJYmZhX2lvY19zeW5jX2xlYXZlKGlvYyk7CisJCQl3cml0ZWwoQkZJX0lPQ19GQUlMLCBpb2MtPmlvY19yZWdzLmlvY19md3N0YXRlKTsKIAkJCXdyaXRlbCgxLCBpb2MtPmlvY19yZWdzLmlvY19zZW1fcmVnKTsKIAkJCWJmYV9mc21fc2V0X3N0YXRlKGlvY3BmLCBiZmFfaW9jcGZfc21fZmFpbCk7CiAJCX0gZWxzZSB7CkBAIC0xMTQzLDYgKzEyNTcsMTEgQEAKIAkJfQogCQlicmVhazsKIAorCWNhc2UgSU9DUEZfRV9TRU1fRVJST1I6CisJCWJmYV9mc21fc2V0X3N0YXRlKGlvY3BmLCBiZmFfaW9jcGZfc21fZmFpbCk7CisJCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX0hXRkFJTEVEKTsKKwkJYnJlYWs7CisKIAljYXNlIElPQ1BGX0VfRElTQUJMRToKIAkJYmZhX3NlbV90aW1lcl9zdG9wKGlvYyk7CiAJCWJmYV9mc21fc2V0X3N0YXRlKGlvY3BmLCBiZmFfaW9jcGZfc21fZGlzYWJsaW5nX3N5bmMpOwpAQCAtMTE1OSw2ICsxMjc4LDcgQEAKIHN0YXRpYyB2b2lkCiBiZmFfaW9jcGZfc21fZmFpbF9lbnRyeShzdHJ1Y3QgYmZhX2lvY3BmX3MgKmlvY3BmKQogeworCWJmYV90cmMoaW9jcGYtPmlvYywgMCk7CiB9CiAKIC8qCkBAIC0xMTg1LDIxICsxMzA1LDI2IEBACiAgKiAgQkZBIElPQyBwcml2YXRlIGZ1bmN0aW9ucwogICovCiAKKy8qCisgKiBOb3RpZnkgY29tbW9uIG1vZHVsZXMgcmVnaXN0ZXJlZCBmb3Igbm90aWZpY2F0aW9uLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvY19ldmVudF9ub3RpZnkoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBlbnVtIGJmYV9pb2NfZXZlbnRfZSBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2lvY19ub3RpZnlfcwkqbm90aWZ5OworCXN0cnVjdCBsaXN0X2hlYWQJKnFlOworCisJbGlzdF9mb3JfZWFjaChxZSwgJmlvYy0+bm90aWZ5X3EpIHsKKwkJbm90aWZ5ID0gKHN0cnVjdCBiZmFfaW9jX25vdGlmeV9zICopcWU7CisJCW5vdGlmeS0+Y2Jmbihub3RpZnktPmNiYXJnLCBldmVudCk7CisJfQorfQorCiBzdGF0aWMgdm9pZAogYmZhX2lvY19kaXNhYmxlX2NvbXAoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQogewotCXN0cnVjdCBsaXN0X2hlYWQJCQkqcWU7Ci0Jc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeV9zCSpub3RpZnk7Ci0KIAlpb2MtPmNiZm4tPmRpc2FibGVfY2Jmbihpb2MtPmJmYSk7Ci0KLQkvKgotCSAqIE5vdGlmeSBjb21tb24gbW9kdWxlcyByZWdpc3RlcmVkIGZvciBub3RpZmljYXRpb24uCi0JICovCi0JbGlzdF9mb3JfZWFjaChxZSwgJmlvYy0+aGJfbm90aWZ5X3EpIHsKLQkJbm90aWZ5ID0gKHN0cnVjdCBiZmFfaW9jX2hiZmFpbF9ub3RpZnlfcyAqKSBxZTsKLQkJbm90aWZ5LT5jYmZuKG5vdGlmeS0+Y2JhcmcpOwotCX0KKwliZmFfaW9jX2V2ZW50X25vdGlmeShpb2MsIEJGQV9JT0NfRV9ESVNBQkxFRCk7CiB9CiAKIGJmYV9ib29sZWFuX3QKQEAgLTEyMTEsMTYgKzEzMzYsMTUgQEAKIAogCXIzMiA9IHJlYWRsKHNlbV9yZWcpOwogCi0Jd2hpbGUgKHIzMiAmJiAoY250IDwgQkZBX1NFTV9TUElOQ05UKSkgeworCXdoaWxlICgocjMyICYgMSkgJiYgKGNudCA8IEJGQV9TRU1fU1BJTkNOVCkpIHsKIAkJY250Kys7CiAJCXVkZWxheSgyKTsKIAkJcjMyID0gcmVhZGwoc2VtX3JlZyk7CiAJfQogCi0JaWYgKHIzMiA9PSAwKQorCWlmICghKHIzMiAmIDEpKQogCQlyZXR1cm4gQkZBX1RSVUU7CiAKLQlXQVJOX09OKGNudCA+PSBCRkFfU0VNX1NQSU5DTlQpOwogCXJldHVybiBCRkFfRkFMU0U7CiB9CiAKQEAgLTEyMzQsNyArMTM1OCwxMiBAQAogCSAqIHdpbGwgcmV0dXJuIDEuIFNlbWFwaG9yZSBpcyByZWxlYXNlZCBieSB3cml0aW5nIDEgdG8gdGhlIHJlZ2lzdGVyCiAJICovCiAJcjMyID0gcmVhZGwoaW9jLT5pb2NfcmVncy5pb2Nfc2VtX3JlZyk7Ci0JaWYgKHIzMiA9PSAwKSB7CisJaWYgKHIzMiA9PSB+MCkgeworCQlXQVJOX09OKHIzMiA9PSB+MCk7CisJCWJmYV9mc21fc2VuZF9ldmVudCgmaW9jLT5pb2NwZiwgSU9DUEZfRV9TRU1fRVJST1IpOworCQlyZXR1cm47CisJfQorCWlmICghKHIzMiAmIDEpKSB7CiAJCWJmYV9mc21fc2VuZF9ldmVudCgmaW9jLT5pb2NwZiwgSU9DUEZfRV9TRU1MT0NLRUQpOwogCQlyZXR1cm47CiAJfQpAQCAtMTM0Myw3ICsxNDcyLDcgQEAKIAlpbnQgaTsKIAogCWRydl9md2hkciA9IChzdHJ1Y3QgYmZpX2lvY19pbWFnZV9oZHJfcyAqKQotCQliZmFfY2JfaW1hZ2VfZ2V0X2NodW5rKEJGQV9JT0NfRldJTUdfVFlQRShpb2MpLCAwKTsKKwkJYmZhX2NiX2ltYWdlX2dldF9jaHVuayhiZmFfaW9jX2FzaWNfZ2VuKGlvYyksIDApOwogCiAJZm9yIChpID0gMDsgaSA8IEJGSV9JT0NfTUQ1U1VNX1NaOyBpKyspIHsKIAkJaWYgKGZ3aGRyLT5tZDVzdW1baV0gIT0gZHJ2X2Z3aGRyLT5tZDVzdW1baV0pIHsKQEAgLTEzNjksNyArMTQ5OCw3IEBACiAKIAliZmFfaW9jX2Z3dmVyX2dldChpb2MsICZmd2hkcik7CiAJZHJ2X2Z3aGRyID0gKHN0cnVjdCBiZmlfaW9jX2ltYWdlX2hkcl9zICopCi0JCWJmYV9jYl9pbWFnZV9nZXRfY2h1bmsoQkZBX0lPQ19GV0lNR19UWVBFKGlvYyksIDApOworCQliZmFfY2JfaW1hZ2VfZ2V0X2NodW5rKGJmYV9pb2NfYXNpY19nZW4oaW9jKSwgMCk7CiAKIAlpZiAoZndoZHIuc2lnbmF0dXJlICE9IGRydl9md2hkci0+c2lnbmF0dXJlKSB7CiAJCWJmYV90cmMoaW9jLCBmd2hkci5zaWduYXR1cmUpOwpAQCAtMTM3Nyw4ICsxNTA2LDggQEAKIAkJcmV0dXJuIEJGQV9GQUxTRTsKIAl9CiAKLQlpZiAoc3dhYjMyKGZ3aGRyLnBhcmFtKSAhPSBib290X2VudikgewotCQliZmFfdHJjKGlvYywgZndoZHIucGFyYW0pOworCWlmIChzd2FiMzIoZndoZHIuYm9vdGVudikgIT0gYm9vdF9lbnYpIHsKKwkJYmZhX3RyYyhpb2MsIGZ3aGRyLmJvb3RlbnYpOwogCQliZmFfdHJjKGlvYywgYm9vdF9lbnYpOwogCQlyZXR1cm4gQkZBX0ZBTFNFOwogCX0KQEAgLTE0MTQsOCArMTU0Myw4IEBACiAKIAliZmFfdHJjKGlvYywgaW9jX2Z3c3RhdGUpOwogCi0JYm9vdF90eXBlID0gQkZJX0JPT1RfVFlQRV9OT1JNQUw7Ci0JYm9vdF9lbnYgPSBCRklfQk9PVF9MT0FERVJfT1M7CisJYm9vdF90eXBlID0gQkZJX0ZXQk9PVF9UWVBFX05PUk1BTDsKKwlib290X2VudiA9IEJGSV9GV0JPT1RfRU5WX09TOwogCiAJLyoKIAkgKiBjaGVjayBpZiBmaXJtd2FyZSBpcyB2YWxpZApAQCAtMTQyNSw2ICsxNTU0LDcgQEAKIAogCWlmICghZnd2YWxpZCkgewogCQliZmFfaW9jX2Jvb3QoaW9jLCBib290X3R5cGUsIGJvb3RfZW52KTsKKwkJYmZhX2lvY19wb2xsX2Z3aW5pdChpb2MpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNDMzLDcgKzE1NjMsNyBAQAogCSAqIGp1c3Qgd2FpdCBmb3IgYW4gaW5pdGlhbGl6YXRpb24gY29tcGxldGlvbiBpbnRlcnJ1cHQuCiAJICovCiAJaWYgKGlvY19md3N0YXRlID09IEJGSV9JT0NfSU5JVElORykgewotCQlpb2MtPmNiZm4tPnJlc2V0X2NiZm4oaW9jLT5iZmEpOworCQliZmFfaW9jX3BvbGxfZndpbml0KGlvYyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE0NTIsNyArMTU4Miw2IEBACiAJCSAqIGJlIGZsdXNoZWQuIE90aGVyd2lzZSBNU0ktWCBpbnRlcnJ1cHRzIGFyZSBub3QgZGVsaXZlcmVkLgogCQkgKi8KIAkJYmZhX2lvY19tc2dmbHVzaChpb2MpOwotCQlpb2MtPmNiZm4tPnJlc2V0X2NiZm4oaW9jLT5iZmEpOwogCQliZmFfZnNtX3NlbmRfZXZlbnQoJmlvYy0+aW9jcGYsIElPQ1BGX0VfRldSRUFEWSk7CiAJCXJldHVybjsKIAl9CkBAIC0xNDYxLDYgKzE1OTAsNyBAQAogCSAqIEluaXRpYWxpemUgdGhlIGgvdyBmb3IgYW55IG90aGVyIHN0YXRlcy4KIAkgKi8KIAliZmFfaW9jX2Jvb3QoaW9jLCBib290X3R5cGUsIGJvb3RfZW52KTsKKwliZmFfaW9jX3BvbGxfZndpbml0KGlvYyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNTA4LDcgKzE2MzgsNyBAQAogCiAJYmZpX2gyaV9zZXQoZW5hYmxlX3JlcS5taCwgQkZJX01DX0lPQywgQkZJX0lPQ19IMklfRU5BQkxFX1JFUSwKIAkJICAgIGJmYV9pb2NfcG9ydGlkKGlvYykpOwotCWVuYWJsZV9yZXEuaW9jX2NsYXNzID0gaW9jLT5pb2NfbWM7CisJZW5hYmxlX3JlcS5jbHNjb2RlID0gY3B1X3RvX2JlMTYoaW9jLT5jbHNjb2RlKTsKIAlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKIAllbmFibGVfcmVxLnR2X3NlYyA9IGJlMzJfdG9fY3B1KHR2LnR2X3NlYyk7CiAJYmZhX2lvY19tYm94X3NlbmQoaW9jLCAmZW5hYmxlX3JlcSwgc2l6ZW9mKHN0cnVjdCBiZmlfaW9jX2N0cmxfcmVxX3MpKTsKQEAgLTE1NzIsMjUgKzE3MDIsMjYgQEAKIAl1MzIgbG9mZiA9IDA7CiAJdTMyIGNodW5rbm8gPSAwOwogCXUzMiBpOworCXUzMiBhc2ljbW9kZTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBMTUVNIGZpcnN0IGJlZm9yZSBjb2RlIGRvd25sb2FkCiAJICovCiAJYmZhX2lvY19sbWVtX2luaXQoaW9jKTsKIAotCWJmYV90cmMoaW9jLCBiZmFfY2JfaW1hZ2VfZ2V0X3NpemUoQkZBX0lPQ19GV0lNR19UWVBFKGlvYykpKTsKLQlmd2ltZyA9IGJmYV9jYl9pbWFnZV9nZXRfY2h1bmsoQkZBX0lPQ19GV0lNR19UWVBFKGlvYyksIGNodW5rbm8pOworCWJmYV90cmMoaW9jLCBiZmFfY2JfaW1hZ2VfZ2V0X3NpemUoYmZhX2lvY19hc2ljX2dlbihpb2MpKSk7CisJZndpbWcgPSBiZmFfY2JfaW1hZ2VfZ2V0X2NodW5rKGJmYV9pb2NfYXNpY19nZW4oaW9jKSwgY2h1bmtubyk7CiAKIAlwZ251bSA9IFBTU19TTUVNX1BHTlVNKGlvYy0+aW9jX3JlZ3Muc21lbV9wZzAsIGxvZmYpOwogCXBnb2ZmID0gUFNTX1NNRU1fUEdPRkYobG9mZik7CiAKIAl3cml0ZWwocGdudW0sIGlvYy0+aW9jX3JlZ3MuaG9zdF9wYWdlX251bV9mbik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYmZhX2NiX2ltYWdlX2dldF9zaXplKEJGQV9JT0NfRldJTUdfVFlQRShpb2MpKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGJmYV9jYl9pbWFnZV9nZXRfc2l6ZShiZmFfaW9jX2FzaWNfZ2VuKGlvYykpOyBpKyspIHsKIAogCQlpZiAoQkZBX0lPQ19GTEFTSF9DSFVOS19OTyhpKSAhPSBjaHVua25vKSB7CiAJCQljaHVua25vID0gQkZBX0lPQ19GTEFTSF9DSFVOS19OTyhpKTsKLQkJCWZ3aW1nID0gYmZhX2NiX2ltYWdlX2dldF9jaHVuayhCRkFfSU9DX0ZXSU1HX1RZUEUoaW9jKSwKKwkJCWZ3aW1nID0gYmZhX2NiX2ltYWdlX2dldF9jaHVuayhiZmFfaW9jX2FzaWNfZ2VuKGlvYyksCiAJCQkJCUJGQV9JT0NfRkxBU0hfQ0hVTktfQUREUihjaHVua25vKSk7CiAJCX0KIApAQCAtMTYxNiwxMSArMTc0NywxNSBAQAogCQkJaW9jLT5pb2NfcmVncy5ob3N0X3BhZ2VfbnVtX2ZuKTsKIAogCS8qCi0JICogU2V0IGJvb3QgdHlwZSBhbmQgYm9vdCBwYXJhbSBhdCB0aGUgZW5kLgotCSovCi0JYmZhX21lbV93cml0ZShpb2MtPmlvY19yZWdzLnNtZW1fcGFnZV9zdGFydCwgQkZJX0JPT1RfVFlQRV9PRkYsCisJICogU2V0IGJvb3QgdHlwZSBhbmQgZGV2aWNlIG1vZGUgYXQgdGhlIGVuZC4KKwkgKi8KKwlhc2ljbW9kZSA9IEJGSV9GV0JPT1RfREVWTU9ERShpb2MtPmFzaWNfZ2VuLCBpb2MtPmFzaWNfbW9kZSwKKwkJCQlpb2MtPnBvcnQwX21vZGUsIGlvYy0+cG9ydDFfbW9kZSk7CisJYmZhX21lbV93cml0ZShpb2MtPmlvY19yZWdzLnNtZW1fcGFnZV9zdGFydCwgQkZJX0ZXQk9PVF9ERVZNT0RFX09GRiwKKwkJCXN3YWIzMihhc2ljbW9kZSkpOworCWJmYV9tZW1fd3JpdGUoaW9jLT5pb2NfcmVncy5zbWVtX3BhZ2Vfc3RhcnQsIEJGSV9GV0JPT1RfVFlQRV9PRkYsCiAJCQlzd2FiMzIoYm9vdF90eXBlKSk7Ci0JYmZhX21lbV93cml0ZShpb2MtPmlvY19yZWdzLnNtZW1fcGFnZV9zdGFydCwgQkZJX0JPT1RfTE9BREVSX09GRiwKKwliZmFfbWVtX3dyaXRlKGlvYy0+aW9jX3JlZ3Muc21lbV9wYWdlX3N0YXJ0LCBCRklfRldCT09UX0VOVl9PRkYsCiAJCQlzd2FiMzIoYm9vdF9lbnYpKTsKIH0KIApAQCAtMTYzNiw2ICsxNzcxLDcgQEAKIAlhdHRyLT5hZGFwdGVyX3Byb3AgID0gYmUzMl90b19jcHUoYXR0ci0+YWRhcHRlcl9wcm9wKTsKIAlhdHRyLT5jYXJkX3R5cGUgICAgID0gYmUzMl90b19jcHUoYXR0ci0+Y2FyZF90eXBlKTsKIAlhdHRyLT5tYXhmcnNpemUJICAgID0gYmUxNl90b19jcHUoYXR0ci0+bWF4ZnJzaXplKTsKKwlpb2MtPmZjbW9kZQk9IChhdHRyLT5wb3J0X21vZGUgPT0gQkZJX1BPUlRfTU9ERV9GQyk7CiAKIAliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9GV1JTUF9HRVRBVFRSKTsKIH0KQEAgLTE2OTAsNyArMTgyNiw3IEBACiAgKiBDbGVhbnVwIGFueSBwZW5kaW5nIHJlcXVlc3RzLgogICovCiBzdGF0aWMgdm9pZAotYmZhX2lvY19tYm94X2hiZmFpbChzdHJ1Y3QgYmZhX2lvY19zICppb2MpCitiZmFfaW9jX21ib3hfZmx1c2goc3RydWN0IGJmYV9pb2NfcyAqaW9jKQogewogCXN0cnVjdCBiZmFfaW9jX21ib3hfbW9kX3MJKm1vZCA9ICZpb2MtPm1ib3hfbW9kOwogCXN0cnVjdCBiZmFfbWJveF9jbWRfcwkJKmNtZDsKQEAgLTE3NTIsNiArMTg4OCw3IEBACiAJLyoKIAkgKiAgcmVsZWFzZSBzZW1hcGhvcmUuCiAJICovCisJcmVhZGwoaW9jLT5pb2NfcmVncy5pb2NfaW5pdF9zZW1fcmVnKTsKIAl3cml0ZWwoMSwgaW9jLT5pb2NfcmVncy5pb2NfaW5pdF9zZW1fcmVnKTsKIAogCWJmYV90cmMoaW9jLCBwZ251bSk7CkBAIC0xODA4LDYgKzE5NDUsNyBAQAogCS8qCiAJICogIHJlbGVhc2Ugc2VtYXBob3JlLgogCSAqLworCXJlYWRsKGlvYy0+aW9jX3JlZ3MuaW9jX2luaXRfc2VtX3JlZyk7CiAJd3JpdGVsKDEsIGlvYy0+aW9jX3JlZ3MuaW9jX2luaXRfc2VtX3JlZyk7CiAJYmZhX3RyYyhpb2MsIHBnbnVtKTsKIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKQEAgLTE4MTYsMTggKzE5NTQsMTMgQEAKIHN0YXRpYyB2b2lkCiBiZmFfaW9jX2ZhaWxfbm90aWZ5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkqcWU7Ci0Jc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeV9zCSpub3RpZnk7CiAJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopaW9jLT5iZmEtPmJmYWQ7CiAKIAkvKgogCSAqIE5vdGlmeSBkcml2ZXIgYW5kIGNvbW1vbiBtb2R1bGVzIHJlZ2lzdGVyZWQgZm9yIG5vdGlmaWNhdGlvbi4KIAkgKi8KIAlpb2MtPmNiZm4tPmhiZmFpbF9jYmZuKGlvYy0+YmZhKTsKLQlsaXN0X2Zvcl9lYWNoKHFlLCAmaW9jLT5oYl9ub3RpZnlfcSkgewotCQlub3RpZnkgPSAoc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeV9zICopIHFlOwotCQlub3RpZnktPmNiZm4obm90aWZ5LT5jYmFyZyk7Ci0JfQorCWJmYV9pb2NfZXZlbnRfbm90aWZ5KGlvYywgQkZBX0lPQ19FX0ZBSUxFRCk7CiAKIAliZmFfaW9jX2RlYnVnX3NhdmVfZnRyYyhpb2MpOwogCkBAIC0xODY0LDYgKzE5OTcsNyBAQAogCS8qCiAJICogIHJlbGVhc2Ugc2VtYXBob3JlLgogCSAqLworCXJlYWRsKGlvYy0+aW9jX3JlZ3MuaW9jX2luaXRfc2VtX3JlZyk7CiAJd3JpdGVsKDEsIGlvYy0+aW9jX3JlZ3MuaW9jX2luaXRfc2VtX3JlZyk7CiAKIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKQEAgLTE4NzYsOCArMjAxMCw2IEBACiB2b2lkCiBiZmFfaW9jX2Jvb3Qoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB1MzIgYm9vdF90eXBlLCB1MzIgYm9vdF9lbnYpCiB7Ci0Jdm9pZCBfX2lvbWVtICpyYjsKLQogCWJmYV9pb2Nfc3RhdHMoaW9jLCBpb2NfYm9vdHMpOwogCiAJaWYgKGJmYV9pb2NfcGxsX2luaXQoaW9jKSAhPSBCRkFfU1RBVFVTX09LKQpAQCAtMTg4NiwyMiArMjAxOCwxNiBAQAogCS8qCiAJICogSW5pdGlhbGl6ZSBJT0Mgc3RhdGUgb2YgYWxsIGZ1bmN0aW9ucyBvbiBhIGNoaXAgcmVzZXQuCiAJICovCi0JcmIgPSBpb2MtPnBjaWRldi5wY2lfYmFyX2t2YTsKLQlpZiAoYm9vdF90eXBlID09IEJGSV9CT09UX1RZUEVfTUVNVEVTVCkgewotCQl3cml0ZWwoQkZJX0lPQ19NRU1URVNULCAocmIgKyBCRkFfSU9DMF9TVEFURV9SRUcpKTsKLQkJd3JpdGVsKEJGSV9JT0NfTUVNVEVTVCwgKHJiICsgQkZBX0lPQzFfU1RBVEVfUkVHKSk7CisJaWYgKGJvb3RfdHlwZSA9PSBCRklfRldCT09UX1RZUEVfTUVNVEVTVCkgeworCQl3cml0ZWwoQkZJX0lPQ19NRU1URVNULCBpb2MtPmlvY19yZWdzLmlvY19md3N0YXRlKTsKKwkJd3JpdGVsKEJGSV9JT0NfTUVNVEVTVCwgaW9jLT5pb2NfcmVncy5hbHRfaW9jX2Z3c3RhdGUpOwogCX0gZWxzZSB7Ci0JCXdyaXRlbChCRklfSU9DX0lOSVRJTkcsIChyYiArIEJGQV9JT0MwX1NUQVRFX1JFRykpOwotCQl3cml0ZWwoQkZJX0lPQ19JTklUSU5HLCAocmIgKyBCRkFfSU9DMV9TVEFURV9SRUcpKTsKKwkJd3JpdGVsKEJGSV9JT0NfSU5JVElORywgaW9jLT5pb2NfcmVncy5pb2NfZndzdGF0ZSk7CisJCXdyaXRlbChCRklfSU9DX0lOSVRJTkcsIGlvYy0+aW9jX3JlZ3MuYWx0X2lvY19md3N0YXRlKTsKIAl9CiAKIAliZmFfaW9jX21zZ2ZsdXNoKGlvYyk7CiAJYmZhX2lvY19kb3dubG9hZF9mdyhpb2MsIGJvb3RfdHlwZSwgYm9vdF9lbnYpOwotCi0JLyoKLQkgKiBFbmFibGUgaW50ZXJydXB0cyBqdXN0IGJlZm9yZSBzdGFydGluZyBMUFUKLQkgKi8KLQlpb2MtPmNiZm4tPnJlc2V0X2NiZm4oaW9jLT5iZmEpOwogCWJmYV9pb2NfbHB1X3N0YXJ0KGlvYyk7CiB9CiAKQEAgLTE5MzIsMTMgKzIwNTgsMTcgQEAKIAkJKHIzMiAhPSBCRklfSU9DX01FTVRFU1QpKTsKIH0KIAotdm9pZAorYmZhX2Jvb2xlYW5fdAogYmZhX2lvY19tc2dnZXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICptYm1zZykKIHsKIAlfX2JlMzIJKm1zZ3AgPSBtYm1zZzsKIAl1MzIJcjMyOwogCWludAkJaTsKIAorCXIzMiA9IHJlYWRsKGlvYy0+aW9jX3JlZ3MubHB1X21ib3hfY21kKTsKKwlpZiAoKHIzMiAmIDEpID09IDApCisJCXJldHVybiBCRkFfRkFMU0U7CisKIAkvKgogCSAqIHJlYWQgdGhlIE1CT1ggbXNnCiAJICovCkBAIC0xOTU0LDYgKzIwODQsOCBAQAogCSAqLwogCXdyaXRlbCgxLCBpb2MtPmlvY19yZWdzLmxwdV9tYm94X2NtZCk7CiAJcmVhZGwoaW9jLT5pb2NfcmVncy5scHVfbWJveF9jbWQpOworCisJcmV0dXJuIEJGQV9UUlVFOwogfQogCiB2b2lkCkBAIC0xOTcwLDExICsyMTAyLDEwIEBACiAJY2FzZSBCRklfSU9DX0kySF9IQkVBVDoKIAkJYnJlYWs7CiAKLQljYXNlIEJGSV9JT0NfSTJIX1JFQURZX0VWRU5UOgotCQliZmFfZnNtX3NlbmRfZXZlbnQoaW9jcGYsIElPQ1BGX0VfRldSRUFEWSk7Ci0JCWJyZWFrOwotCiAJY2FzZSBCRklfSU9DX0kySF9FTkFCTEVfUkVQTFk6CisJCWlvYy0+cG9ydF9tb2RlID0gaW9jLT5wb3J0X21vZGVfY2ZnID0KKwkJCQkoZW51bSBiZmFfbW9kZV9zKW1zZy0+ZndfZXZlbnQucG9ydF9tb2RlOworCQlpb2MtPmFkX2NhcF9ibSA9IG1zZy0+ZndfZXZlbnQuY2FwX2JtOwogCQliZmFfZnNtX3NlbmRfZXZlbnQoaW9jcGYsIElPQ1BGX0VfRldSU1BfRU5BQkxFKTsKIAkJYnJlYWs7CiAKQEAgLTE5ODYsNiArMjExNywxMCBAQAogCQliZmFfaW9jX2dldGF0dHJfcmVwbHkoaW9jKTsKIAkJYnJlYWs7CiAKKwljYXNlIEJGSV9JT0NfSTJIX0FDUV9BRERSX1JFUExZOgorCQliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9GV1JTUF9BQ1FfQUREUik7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJYmZhX3RyYyhpb2MsIG1zZy0+bWgubXNnX2lkKTsKIAkJV0FSTl9PTigxKTsKQEAgLTIwMTEsNyArMjE0Niw3IEBACiAJaW9jLT5pb2NwZi5pb2MJPSBpb2M7CiAKIAliZmFfaW9jX21ib3hfYXR0YWNoKGlvYyk7Ci0JSU5JVF9MSVNUX0hFQUQoJmlvYy0+aGJfbm90aWZ5X3EpOworCUlOSVRfTElTVF9IRUFEKCZpb2MtPm5vdGlmeV9xKTsKIAogCWJmYV9mc21fc2V0X3N0YXRlKGlvYywgYmZhX2lvY19zbV91bmluaXQpOwogCWJmYV9mc21fc2VuZF9ldmVudChpb2MsIElPQ19FX1JFU0VUKTsKQEAgLTIwMjQsNiArMjE1OSw3IEBACiBiZmFfaW9jX2RldGFjaChzdHJ1Y3QgYmZhX2lvY19zICppb2MpCiB7CiAJYmZhX2ZzbV9zZW5kX2V2ZW50KGlvYywgSU9DX0VfREVUQUNIKTsKKwlJTklUX0xJU1RfSEVBRCgmaW9jLT5ub3RpZnlfcSk7CiB9CiAKIC8qCkBAIC0yMDMzLDIwICsyMTY5LDgwIEBACiAgKi8KIHZvaWQKIGJmYV9pb2NfcGNpX2luaXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYsCi0JCSBlbnVtIGJmaV9tY2xhc3MgbWMpCisJCWVudW0gYmZpX3BjaWZuX2NsYXNzIGNsc2NvZGUpCiB7Ci0JaW9jLT5pb2NfbWMJPSBtYzsKKwlpb2MtPmNsc2NvZGUJPSBjbHNjb2RlOwogCWlvYy0+cGNpZGV2CT0gKnBjaWRldjsKLQlpb2MtPmN0ZGV2CT0gYmZhX2FzaWNfaWRfY3QoaW9jLT5wY2lkZXYuZGV2aWNlX2lkKTsKLQlpb2MtPmNuYQk9IGlvYy0+Y3RkZXYgJiYgIWlvYy0+ZmNtb2RlOworCisJLyoKKwkgKiBJbml0aWFsaXplIElPQyBhbmQgZGV2aWNlIHBlcnNvbmFsaXR5CisJICovCisJaW9jLT5wb3J0MF9tb2RlID0gaW9jLT5wb3J0MV9tb2RlID0gQkZJX1BPUlRfTU9ERV9GQzsKKwlpb2MtPmFzaWNfbW9kZSAgPSBCRklfQVNJQ19NT0RFX0ZDOworCisJc3dpdGNoIChwY2lkZXYtPmRldmljZV9pZCkgeworCWNhc2UgQkZBX1BDSV9ERVZJQ0VfSURfRkNfOEcxUDoKKwljYXNlIEJGQV9QQ0lfREVWSUNFX0lEX0ZDXzhHMlA6CisJCWlvYy0+YXNpY19nZW4gPSBCRklfQVNJQ19HRU5fQ0I7CisJCWlvYy0+ZmNtb2RlID0gQkZBX1RSVUU7CisJCWlvYy0+cG9ydF9tb2RlID0gaW9jLT5wb3J0X21vZGVfY2ZnID0gQkZBX01PREVfSEJBOworCQlpb2MtPmFkX2NhcF9ibSA9IEJGQV9DTV9IQkE7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUENJX0RFVklDRV9JRF9DVDoKKwkJaW9jLT5hc2ljX2dlbiA9IEJGSV9BU0lDX0dFTl9DVDsKKwkJaW9jLT5wb3J0MF9tb2RlID0gaW9jLT5wb3J0MV9tb2RlID0gQkZJX1BPUlRfTU9ERV9FVEg7CisJCWlvYy0+YXNpY19tb2RlICA9IEJGSV9BU0lDX01PREVfRVRIOworCQlpb2MtPnBvcnRfbW9kZSA9IGlvYy0+cG9ydF9tb2RlX2NmZyA9IEJGQV9NT0RFX0NOQTsKKwkJaW9jLT5hZF9jYXBfYm0gPSBCRkFfQ01fQ05BOworCQlicmVhazsKKworCWNhc2UgQkZBX1BDSV9ERVZJQ0VfSURfQ1RfRkM6CisJCWlvYy0+YXNpY19nZW4gPSBCRklfQVNJQ19HRU5fQ1Q7CisJCWlvYy0+ZmNtb2RlID0gQkZBX1RSVUU7CisJCWlvYy0+cG9ydF9tb2RlID0gaW9jLT5wb3J0X21vZGVfY2ZnID0gQkZBX01PREVfSEJBOworCQlpb2MtPmFkX2NhcF9ibSA9IEJGQV9DTV9IQkE7CisJCWJyZWFrOworCisJY2FzZSBCRkFfUENJX0RFVklDRV9JRF9DVDI6CisJCWlvYy0+YXNpY19nZW4gPSBCRklfQVNJQ19HRU5fQ1QyOworCQlpZiAoY2xzY29kZSA9PSBCRklfUENJRk5fQ0xBU1NfRkMgJiYKKwkJICAgIHBjaWRldi0+c3NpZCA9PSBCRkFfUENJX0NUMl9TU0lEX0ZDKSB7CisJCQlpb2MtPmFzaWNfbW9kZSAgPSBCRklfQVNJQ19NT0RFX0ZDMTY7CisJCQlpb2MtPmZjbW9kZSA9IEJGQV9UUlVFOworCQkJaW9jLT5wb3J0X21vZGUgPSBpb2MtPnBvcnRfbW9kZV9jZmcgPSBCRkFfTU9ERV9IQkE7CisJCQlpb2MtPmFkX2NhcF9ibSA9IEJGQV9DTV9IQkE7CisJCX0gZWxzZSB7CisJCQlpb2MtPnBvcnQwX21vZGUgPSBpb2MtPnBvcnQxX21vZGUgPSBCRklfUE9SVF9NT0RFX0VUSDsKKwkJCWlvYy0+YXNpY19tb2RlICA9IEJGSV9BU0lDX01PREVfRVRIOworCQkJaWYgKHBjaWRldi0+c3NpZCA9PSBCRkFfUENJX0NUMl9TU0lEX0ZDb0UpIHsKKwkJCQlpb2MtPnBvcnRfbW9kZSA9CisJCQkJaW9jLT5wb3J0X21vZGVfY2ZnID0gQkZBX01PREVfQ05BOworCQkJCWlvYy0+YWRfY2FwX2JtID0gQkZBX0NNX0NOQTsKKwkJCX0gZWxzZSB7CisJCQkJaW9jLT5wb3J0X21vZGUgPQorCQkJCWlvYy0+cG9ydF9tb2RlX2NmZyA9IEJGQV9NT0RFX05JQzsKKwkJCQlpb2MtPmFkX2NhcF9ibSA9IEJGQV9DTV9OSUM7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCX0KIAogCS8qCiAJICogU2V0IGFzaWMgc3BlY2lmaWMgaW50ZXJmYWNlcy4gU2VlIGJmYV9pb2NfY2IuYyBhbmQgYmZhX2lvY19jdC5jCiAJICovCi0JaWYgKGlvYy0+Y3RkZXYpCi0JCWJmYV9pb2Nfc2V0X2N0X2h3aWYoaW9jKTsKLQllbHNlCisJaWYgKGlvYy0+YXNpY19nZW4gPT0gQkZJX0FTSUNfR0VOX0NCKQogCQliZmFfaW9jX3NldF9jYl9od2lmKGlvYyk7CisJZWxzZSBpZiAoaW9jLT5hc2ljX2dlbiA9PSBCRklfQVNJQ19HRU5fQ1QpCisJCWJmYV9pb2Nfc2V0X2N0X2h3aWYoaW9jKTsKKwllbHNlIHsKKwkJV0FSTl9PTihpb2MtPmFzaWNfZ2VuICE9IEJGSV9BU0lDX0dFTl9DVDIpOworCQliZmFfaW9jX3NldF9jdDJfaHdpZihpb2MpOworCQliZmFfaW9jX2N0Ml9wb3dlcm9uKGlvYyk7CisJfQogCiAJYmZhX2lvY19tYXBfcG9ydChpb2MpOwogCWJmYV9pb2NfcmVnX2luaXQoaW9jKTsKQEAgLTIxNzIsMzYgKzIzNjgsMzggQEAKIAlzdHJ1Y3QgYmZpX21ibXNnX3MJCW07CiAJaW50CQkJCW1jOwogCi0JYmZhX2lvY19tc2dnZXQoaW9jLCAmbSk7CisJaWYgKGJmYV9pb2NfbXNnZ2V0KGlvYywgJm0pKSB7CisJCS8qCisJCSAqIFRyZWF0IElPQyBtZXNzYWdlIGNsYXNzIGFzIHNwZWNpYWwuCisJCSAqLworCQltYyA9IG0ubWgubXNnX2NsYXNzOworCQlpZiAobWMgPT0gQkZJX01DX0lPQykgeworCQkJYmZhX2lvY19pc3IoaW9jLCAmbSk7CisJCQlyZXR1cm47CisJCX0KIAotCS8qCi0JICogVHJlYXQgSU9DIG1lc3NhZ2UgY2xhc3MgYXMgc3BlY2lhbC4KLQkgKi8KLQltYyA9IG0ubWgubXNnX2NsYXNzOwotCWlmIChtYyA9PSBCRklfTUNfSU9DKSB7Ci0JCWJmYV9pb2NfaXNyKGlvYywgJm0pOwotCQlyZXR1cm47CisJCWlmICgobWMgPiBCRklfTUNfTUFYKSB8fCAobW9kLT5tYmhkbHJbbWNdLmNiZm4gPT0gTlVMTCkpCisJCQlyZXR1cm47CisKKwkJbW9kLT5tYmhkbHJbbWNdLmNiZm4obW9kLT5tYmhkbHJbbWNdLmNiYXJnLCAmbSk7CiAJfQogCi0JaWYgKChtYyA+IEJGSV9NQ19NQVgpIHx8IChtb2QtPm1iaGRsclttY10uY2JmbiA9PSBOVUxMKSkKLQkJcmV0dXJuOworCWJmYV9pb2NfbHB1X3JlYWRfc3RhdChpb2MpOwogCi0JbW9kLT5tYmhkbHJbbWNdLmNiZm4obW9kLT5tYmhkbHJbbWNdLmNiYXJnLCAmbSk7CisJLyoKKwkgKiBUcnkgdG8gc2VuZCBwZW5kaW5nIG1haWxib3ggY29tbWFuZHMKKwkgKi8KKwliZmFfaW9jX21ib3hfcG9sbChpb2MpOwogfQogCiB2b2lkCiBiZmFfaW9jX2Vycm9yX2lzcihzdHJ1Y3QgYmZhX2lvY19zICppb2MpCiB7CisJYmZhX2lvY19zdGF0cyhpb2MsIGlvY19oYmZhaWxzKTsKKwlpb2MtPnN0YXRzLmhiX2NvdW50ID0gaW9jLT5oYl9jb3VudDsKIAliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9IV0VSUk9SKTsKIH0KIAotdm9pZAotYmZhX2lvY19zZXRfZmNtb2RlKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKLXsKLQlpb2MtPmZjbW9kZSAgPSBCRkFfVFJVRTsKLQlpb2MtPnBvcnRfaWQgPSBiZmFfaW9jX3BjaWZuKGlvYyk7Ci19Ci0KIC8qCiAgKiByZXR1cm4gdHJ1ZSBpZiBJT0MgaXMgZGlzYWJsZWQKICAqLwpAQCAtMjIxMyw2ICsyNDExLDE1IEBACiB9CiAKIC8qCisgKiBSZXR1cm4gVFJVRSBpZiBJT0MgaXMgaW4gYWNxdWlyaW5nIGFkZHJlc3Mgc3RhdGUKKyAqLworYmZhX2Jvb2xlYW5fdAorYmZhX2lvY19pc19hY3FfYWRkcihzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJcmV0dXJuIGJmYV9mc21fY21wX3N0YXRlKGlvYywgYmZhX2lvY19zbV9hY3FfYWRkcik7Cit9CisKKy8qCiAgKiByZXR1cm4gdHJ1ZSBpZiBJT0MgZmlybXdhcmUgaXMgZGlmZmVyZW50LgogICovCiBiZmFfYm9vbGVhbl90CkBAIC0yMjM5LDE3ICsyNDQ2LDE2IEBACiBiZmFfaW9jX2FkYXB0ZXJfaXNfZGlzYWJsZWQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQogewogCXUzMglpb2Nfc3RhdGU7Ci0Jdm9pZCBfX2lvbWVtICpyYiA9IGlvYy0+cGNpZGV2LnBjaV9iYXJfa3ZhOwogCiAJaWYgKCFiZmFfZnNtX2NtcF9zdGF0ZShpb2MsIGJmYV9pb2Nfc21fZGlzYWJsZWQpKQogCQlyZXR1cm4gQkZBX0ZBTFNFOwogCi0JaW9jX3N0YXRlID0gcmVhZGwocmIgKyBCRkFfSU9DMF9TVEFURV9SRUcpOworCWlvY19zdGF0ZSA9IHJlYWRsKGlvYy0+aW9jX3JlZ3MuaW9jX2Z3c3RhdGUpOwogCWlmICghYmZhX2lvY19zdGF0ZV9kaXNhYmxlZChpb2Nfc3RhdGUpKQogCQlyZXR1cm4gQkZBX0ZBTFNFOwogCiAJaWYgKGlvYy0+cGNpZGV2LmRldmljZV9pZCAhPSBCRkFfUENJX0RFVklDRV9JRF9GQ184RzFQKSB7Ci0JCWlvY19zdGF0ZSA9IHJlYWRsKHJiICsgQkZBX0lPQzFfU1RBVEVfUkVHKTsKKwkJaW9jX3N0YXRlID0gcmVhZGwoaW9jLT5pb2NfcmVncy5hbHRfaW9jX2Z3c3RhdGUpOwogCQlpZiAoIWJmYV9pb2Nfc3RhdGVfZGlzYWJsZWQoaW9jX3N0YXRlKSkKIAkJCXJldHVybiBCRkFfRkFMU0U7CiAJfQpAQCAtMjMwOCwyNCArMjUxNCwyMSBAQAogCiAJYmZhX2lvY19nZXRfcGNpX2NoaXBfcmV2KGlvYywgYWRfYXR0ci0+aHdfdmVyKTsKIAotCWFkX2F0dHItPmNuYV9jYXBhYmxlID0gaW9jLT5jbmE7Ci0JYWRfYXR0ci0+dHJ1bmtfY2FwYWJsZSA9IChhZF9hdHRyLT5ucG9ydHMgPiAxKSAmJiAhaW9jLT5jbmEgJiYKLQkJCQkhYWRfYXR0ci0+aXNfbWV6ejsKKwlhZF9hdHRyLT5jbmFfY2FwYWJsZSA9IGJmYV9pb2NfaXNfY25hKGlvYyk7CisJYWRfYXR0ci0+dHJ1bmtfY2FwYWJsZSA9IChhZF9hdHRyLT5ucG9ydHMgPiAxKSAmJgorCQkJCSAgIWJmYV9pb2NfaXNfY25hKGlvYykgJiYgIWFkX2F0dHItPmlzX21leno7CiB9CiAKIGVudW0gYmZhX2lvY190eXBlX2UKIGJmYV9pb2NfZ2V0X3R5cGUoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQogewotCWlmICghaW9jLT5jdGRldiB8fCBpb2MtPmZjbW9kZSkKLQkJcmV0dXJuIEJGQV9JT0NfVFlQRV9GQzsKLQllbHNlIGlmIChpb2MtPmlvY19tYyA9PSBCRklfTUNfSU9DRkMpCi0JCXJldHVybiBCRkFfSU9DX1RZUEVfRkNvRTsKLQllbHNlIGlmIChpb2MtPmlvY19tYyA9PSBCRklfTUNfTEwpCisJaWYgKGlvYy0+Y2xzY29kZSA9PSBCRklfUENJRk5fQ0xBU1NfRVRIKQogCQlyZXR1cm4gQkZBX0lPQ19UWVBFX0xMOwotCWVsc2UgewotCQlXQVJOX09OKGlvYy0+aW9jX21jICE9IEJGSV9NQ19MTCk7Ci0JCXJldHVybiBCRkFfSU9DX1RZUEVfTEw7Ci0JfQorCisJV0FSTl9PTihpb2MtPmNsc2NvZGUgIT0gQkZJX1BDSUZOX0NMQVNTX0ZDKTsKKworCXJldHVybiAoaW9jLT5hdHRyLT5wb3J0X21vZGUgPT0gQkZJX1BPUlRfTU9ERV9GQykKKwkJPyBCRkFfSU9DX1RZUEVfRkMgOiBCRkFfSU9DX1RZUEVfRkNvRTsKIH0KIAogdm9pZApAQCAtMjM4NCwxMSArMjU4Nyw4IEBACiAKIAlpb2NfYXR0ciA9IGlvYy0+YXR0cjsKIAotCS8qCi0JICogbW9kZWwgbmFtZQotCSAqLwogCXNucHJpbnRmKG1vZGVsLCBCRkFfQURBUFRFUl9NT0RFTF9OQU1FX0xFTiwgIiVzLSV1IiwKLQkJQkZBX01GR19OQU1FLCBpb2NfYXR0ci0+Y2FyZF90eXBlKTsKKwkJCUJGQV9NRkdfTkFNRSwgaW9jX2F0dHItPmNhcmRfdHlwZSk7CiB9CiAKIGVudW0gYmZhX2lvY19zdGF0ZQpAQCAtMjQzOCw2ICsyNjM4LDkgQEAKIAogCWlvY19hdHRyLT5zdGF0ZSA9IGJmYV9pb2NfZ2V0X3N0YXRlKGlvYyk7CiAJaW9jX2F0dHItPnBvcnRfaWQgPSBpb2MtPnBvcnRfaWQ7CisJaW9jX2F0dHItPnBvcnRfbW9kZSA9IGlvYy0+cG9ydF9tb2RlOworCWlvY19hdHRyLT5wb3J0X21vZGVfY2ZnID0gaW9jLT5wb3J0X21vZGVfY2ZnOworCWlvY19hdHRyLT5jYXBfYm0gPSBpb2MtPmFkX2NhcF9ibTsKIAogCWlvY19hdHRyLT5pb2NfdHlwZSA9IGJmYV9pb2NfZ2V0X3R5cGUoaW9jKTsKIApAQCAtMjQ3NSwxMiArMjY3OCw2IEBACiAJcmV0dXJuIG07CiB9CiAKLWJmYV9ib29sZWFuX3QKLWJmYV9pb2NfZ2V0X2ZjbW9kZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpCi17Ci0JcmV0dXJuIGlvYy0+ZmNtb2RlIHx8ICFiZmFfYXNpY19pZF9jdChpb2MtPnBjaWRldi5kZXZpY2VfaWQpOwotfQotCiAvKgogICogUmV0cmlldmUgc2F2ZWQgZmlybXdhcmUgdHJhY2UgZnJvbSBhIHByaW9yIElPQyBmYWlsdXJlLgogICovCkBAIC0yNTMxLDcgKzI3MjgsNyBAQAogCiAJYmZpX2gyaV9zZXQocmVxLT5taCwgQkZJX01DX0lPQywgQkZJX0lPQ19IMklfREJHX1NZTkMsCiAJCSAgICBiZmFfaW9jX3BvcnRpZChpb2MpKTsKLQlyZXEtPmlvY19jbGFzcyA9IGlvYy0+aW9jX21jOworCXJlcS0+Y2xzY29kZSA9IGNwdV90b19iZTE2KGlvYy0+Y2xzY29kZSk7CiAJYmZhX2lvY19tYm94X3F1ZXVlKGlvYywgJmNtZCk7CiB9CiAKQEAgLTI2NzMsNiArMjg3MCw3IEBACiBiZmFfaW9jX3JlY292ZXIoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQogewogCWJmYV9pb2Nfc3RhdHMoaW9jLCBpb2NfaGJmYWlscyk7CisJaW9jLT5zdGF0cy5oYl9jb3VudCA9IGlvYy0+aGJfY291bnQ7CiAJYmZhX2ZzbV9zZW5kX2V2ZW50KGlvYywgSU9DX0VfSEJGQUlMKTsKIH0KIApAQCAtMjcwMyw2ICsyOTAxLDM0IEBACiAJYmZhX2lvY19od19zZW1fZ2V0KGlvYyk7CiB9CiAKK3N0YXRpYyB2b2lkCitiZmFfaW9jX3BvbGxfZndpbml0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwl1MzIgZndzdGF0ZSA9IHJlYWRsKGlvYy0+aW9jX3JlZ3MuaW9jX2Z3c3RhdGUpOworCisJYmZhX3RyYyhpb2MsIGZ3c3RhdGUpOworCisJaWYgKGZ3c3RhdGUgPT0gQkZJX0lPQ19ESVNBQkxFRCkgeworCQliZmFfZnNtX3NlbmRfZXZlbnQoJmlvYy0+aW9jcGYsIElPQ1BGX0VfRldSRUFEWSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW9jLT5pb2NwZi5wb2xsX3RpbWUgPj0gQkZBX0lPQ19UT1YpCisJCWJmYV9pb2NwZl90aW1lb3V0KGlvYyk7CisJZWxzZSB7CisJCWlvYy0+aW9jcGYucG9sbF90aW1lICs9IEJGQV9JT0NfUE9MTF9UT1Y7CisJCWJmYV9pb2NwZl9wb2xsX3RpbWVyX3N0YXJ0KGlvYyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY3BmX3BvbGxfdGltZW91dCh2b2lkICppb2NfYXJnKQoreworCXN0cnVjdCBiZmFfaW9jX3MgKmlvYyA9IChzdHJ1Y3QgYmZhX2lvY19zICopIGlvY19hcmc7CisKKwliZmFfaW9jX3BvbGxfZndpbml0KGlvYyk7Cit9CisKIC8qCiAgKiAgYmZhIHRpbWVyIGZ1bmN0aW9uCiAgKi8KQEAgLTI3NzAsMyArMjk5NiwyNDIzIEBACiAKIAlsaXN0X2RlbCgmdGltZXItPnFlKTsKIH0KKworLyoKKyAqCUFTSUMgYmxvY2sgcmVsYXRlZAorICovCitzdGF0aWMgdm9pZAorYmZhX2FibGtfY29uZmlnX3N3YXAoc3RydWN0IGJmYV9hYmxrX2NmZ19zICpjZmcpCit7CisJc3RydWN0IGJmYV9hYmxrX2NmZ19pbnN0X3MgKmNmZ19pbnN0OworCWludCBpLCBqOworCXUxNgliZTE2OworCXUzMgliZTMyOworCisJZm9yIChpID0gMDsgaSA8IEJGQV9BQkxLX01BWDsgaSsrKSB7CisJCWNmZ19pbnN0ID0gJmNmZy0+aW5zdFtpXTsKKwkJZm9yIChqID0gMDsgaiA8IEJGQV9BQkxLX01BWF9QRlM7IGorKykgeworCQkJYmUxNiA9IGNmZ19pbnN0LT5wZl9jZmdbal0ucGVyczsKKwkJCWNmZ19pbnN0LT5wZl9jZmdbal0ucGVycyA9IGJlMTZfdG9fY3B1KGJlMTYpOworCQkJYmUxNiA9IGNmZ19pbnN0LT5wZl9jZmdbal0ubnVtX3FwYWlyczsKKwkJCWNmZ19pbnN0LT5wZl9jZmdbal0ubnVtX3FwYWlycyA9IGJlMTZfdG9fY3B1KGJlMTYpOworCQkJYmUxNiA9IGNmZ19pbnN0LT5wZl9jZmdbal0ubnVtX3ZlY3RvcnM7CisJCQljZmdfaW5zdC0+cGZfY2ZnW2pdLm51bV92ZWN0b3JzID0gYmUxNl90b19jcHUoYmUxNik7CisJCQliZTMyID0gY2ZnX2luc3QtPnBmX2NmZ1tqXS5idzsKKwkJCWNmZ19pbnN0LT5wZl9jZmdbal0uYncgPSBiZTE2X3RvX2NwdShiZTMyKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9hYmxrX2lzcih2b2lkICpjYmFyZywgc3RydWN0IGJmaV9tYm1zZ19zICptc2cpCit7CisJc3RydWN0IGJmYV9hYmxrX3MgKmFibGsgPSAoc3RydWN0IGJmYV9hYmxrX3MgKiljYmFyZzsKKwlzdHJ1Y3QgYmZpX2FibGtfaTJoX3JzcF9zICpyc3AgPSAoc3RydWN0IGJmaV9hYmxrX2kyaF9yc3BfcyAqKW1zZzsKKwliZmFfYWJsa19jYmZuX3QgY2JmbjsKKworCVdBUk5fT04obXNnLT5taC5tc2dfY2xhc3MgIT0gQkZJX01DX0FCTEspOworCWJmYV90cmMoYWJsay0+aW9jLCBtc2ctPm1oLm1zZ19pZCk7CisKKwlzd2l0Y2ggKG1zZy0+bWgubXNnX2lkKSB7CisJY2FzZSBCRklfQUJMS19JMkhfUVVFUlk6CisJCWlmIChyc3AtPnN0YXR1cyA9PSBCRkFfU1RBVFVTX09LKSB7CisJCQltZW1jcHkoYWJsay0+Y2ZnLCBhYmxrLT5kbWFfYWRkci5rdmEsCisJCQkJc2l6ZW9mKHN0cnVjdCBiZmFfYWJsa19jZmdfcykpOworCQkJYmZhX2FibGtfY29uZmlnX3N3YXAoYWJsay0+Y2ZnKTsKKwkJCWFibGstPmNmZyA9IE5VTEw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJGSV9BQkxLX0kySF9BRFBUX0NPTkZJRzoKKwljYXNlIEJGSV9BQkxLX0kySF9QT1JUX0NPTkZJRzoKKwkJLyogdXBkYXRlIGNvbmZpZyBwb3J0IG1vZGUgKi8KKwkJYWJsay0+aW9jLT5wb3J0X21vZGVfY2ZnID0gcnNwLT5wb3J0X21vZGU7CisKKwljYXNlIEJGSV9BQkxLX0kySF9QRl9ERUxFVEU6CisJY2FzZSBCRklfQUJMS19JMkhfUEZfVVBEQVRFOgorCWNhc2UgQkZJX0FCTEtfSTJIX09QVFJPTV9FTkFCTEU6CisJY2FzZSBCRklfQUJMS19JMkhfT1BUUk9NX0RJU0FCTEU6CisJCS8qIE5vLW9wICovCisJCWJyZWFrOworCisJY2FzZSBCRklfQUJMS19JMkhfUEZfQ1JFQVRFOgorCQkqKGFibGstPnBjaWZuKSA9IHJzcC0+cGNpZm47CisJCWFibGstPnBjaWZuID0gTlVMTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCX0KKworCWFibGstPmJ1c3kgPSBCRkFfRkFMU0U7CisJaWYgKGFibGstPmNiZm4pIHsKKwkJY2JmbiA9IGFibGstPmNiZm47CisJCWFibGstPmNiZm4gPSBOVUxMOworCQljYmZuKGFibGstPmNiYXJnLCByc3AtPnN0YXR1cyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2FibGtfbm90aWZ5KHZvaWQgKmNiYXJnLCBlbnVtIGJmYV9pb2NfZXZlbnRfZSBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2FibGtfcyAqYWJsayA9IChzdHJ1Y3QgYmZhX2FibGtfcyAqKWNiYXJnOworCisJYmZhX3RyYyhhYmxrLT5pb2MsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JT0NfRV9FTkFCTEVEOgorCQlXQVJOX09OKGFibGstPmJ1c3kgIT0gQkZBX0ZBTFNFKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0NfRV9ESVNBQkxFRDoKKwljYXNlIEJGQV9JT0NfRV9GQUlMRUQ6CisJCS8qIEZhaWwgYW55IHBlbmRpbmcgcmVxdWVzdHMgKi8KKwkJYWJsay0+cGNpZm4gPSBOVUxMOworCQlpZiAoYWJsay0+YnVzeSkgeworCQkJaWYgKGFibGstPmNiZm4pCisJCQkJYWJsay0+Y2JmbihhYmxrLT5jYmFyZywgQkZBX1NUQVRVU19GQUlMRUQpOworCQkJYWJsay0+Y2JmbiA9IE5VTEw7CisJCQlhYmxrLT5idXN5ID0gQkZBX0ZBTFNFOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CisJfQorfQorCit1MzIKK2JmYV9hYmxrX21lbWluZm8odm9pZCkKK3sKKwlyZXR1cm4gQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmFfYWJsa19jZmdfcyksIEJGQV9ETUFfQUxJR05fU1opOworfQorCit2b2lkCitiZmFfYWJsa19tZW1jbGFpbShzdHJ1Y3QgYmZhX2FibGtfcyAqYWJsaywgdTggKmRtYV9rdmEsIHU2NCBkbWFfcGEpCit7CisJYWJsay0+ZG1hX2FkZHIua3ZhID0gZG1hX2t2YTsKKwlhYmxrLT5kbWFfYWRkci5wYSAgPSBkbWFfcGE7Cit9CisKK3ZvaWQKK2JmYV9hYmxrX2F0dGFjaChzdHJ1Y3QgYmZhX2FibGtfcyAqYWJsaywgc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWFibGstPmlvYyA9IGlvYzsKKworCWJmYV9pb2NfbWJveF9yZWdpc3IoYWJsay0+aW9jLCBCRklfTUNfQUJMSywgYmZhX2FibGtfaXNyLCBhYmxrKTsKKwliZmFfcV9xZV9pbml0KCZhYmxrLT5pb2Nfbm90aWZ5KTsKKwliZmFfaW9jX25vdGlmeV9pbml0KCZhYmxrLT5pb2Nfbm90aWZ5LCBiZmFfYWJsa19ub3RpZnksIGFibGspOworCWxpc3RfYWRkX3RhaWwoJmFibGstPmlvY19ub3RpZnkucWUsICZhYmxrLT5pb2MtPm5vdGlmeV9xKTsKK30KKworYmZhX3N0YXR1c190CitiZmFfYWJsa19xdWVyeShzdHJ1Y3QgYmZhX2FibGtfcyAqYWJsaywgc3RydWN0IGJmYV9hYmxrX2NmZ19zICphYmxrX2NmZywKKwkJYmZhX2FibGtfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmlfYWJsa19oMmlfcXVlcnlfcyAqbTsKKworCVdBUk5fT04oIWFibGtfY2ZnKTsKKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChhYmxrLT5pb2MpKSB7CisJCWJmYV90cmMoYWJsay0+aW9jLCBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkU7CisJfQorCisJaWYgKGFibGstPmJ1c3kpIHsKKwkJYmZhX3RyYyhhYmxrLT5pb2MsIEJGQV9TVEFUVVNfREVWQlVTWSk7CisJCXJldHVybiAgQkZBX1NUQVRVU19ERVZCVVNZOworCX0KKworCWFibGstPmNmZyA9IGFibGtfY2ZnOworCWFibGstPmNiZm4gID0gY2JmbjsKKwlhYmxrLT5jYmFyZyA9IGNiYXJnOworCWFibGstPmJ1c3kgID0gQkZBX1RSVUU7CisKKwltID0gKHN0cnVjdCBiZmlfYWJsa19oMmlfcXVlcnlfcyAqKWFibGstPm1iLm1zZzsKKwliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0FCTEssIEJGSV9BQkxLX0gySV9RVUVSWSwKKwkJICAgIGJmYV9pb2NfcG9ydGlkKGFibGstPmlvYykpOworCWJmYV9kbWFfYmVfYWRkcl9zZXQobS0+YWRkciwgYWJsay0+ZG1hX2FkZHIucGEpOworCWJmYV9pb2NfbWJveF9xdWV1ZShhYmxrLT5pb2MsICZhYmxrLT5tYik7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworYmZhX3N0YXR1c190CitiZmFfYWJsa19wZl9jcmVhdGUoc3RydWN0IGJmYV9hYmxrX3MgKmFibGssIHUxNiAqcGNpZm4sCisJCXU4IHBvcnQsIGVudW0gYmZpX3BjaWZuX2NsYXNzIHBlcnNvbmFsaXR5LCBpbnQgYncsCisJCWJmYV9hYmxrX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZpX2FibGtfaDJpX3BmX3JlcV9zICptOworCisJaWYgKCFiZmFfaW9jX2lzX29wZXJhdGlvbmFsKGFibGstPmlvYykpIHsKKwkJYmZhX3RyYyhhYmxrLT5pb2MsIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkUpOworCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfRkFJTFVSRTsKKwl9CisKKwlpZiAoYWJsay0+YnVzeSkgeworCQliZmFfdHJjKGFibGstPmlvYywgQkZBX1NUQVRVU19ERVZCVVNZKTsKKwkJcmV0dXJuICBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfQorCisJYWJsay0+cGNpZm4gPSBwY2lmbjsKKwlhYmxrLT5jYmZuID0gY2JmbjsKKwlhYmxrLT5jYmFyZyA9IGNiYXJnOworCWFibGstPmJ1c3kgID0gQkZBX1RSVUU7CisKKwltID0gKHN0cnVjdCBiZmlfYWJsa19oMmlfcGZfcmVxX3MgKilhYmxrLT5tYi5tc2c7CisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19BQkxLLCBCRklfQUJMS19IMklfUEZfQ1JFQVRFLAorCQkgICAgYmZhX2lvY19wb3J0aWQoYWJsay0+aW9jKSk7CisJbS0+cGVycyA9IGNwdV90b19iZTE2KCh1MTYpcGVyc29uYWxpdHkpOworCW0tPmJ3ID0gY3B1X3RvX2JlMzIoYncpOworCW0tPnBvcnQgPSBwb3J0OworCWJmYV9pb2NfbWJveF9xdWV1ZShhYmxrLT5pb2MsICZhYmxrLT5tYik7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworYmZhX3N0YXR1c190CitiZmFfYWJsa19wZl9kZWxldGUoc3RydWN0IGJmYV9hYmxrX3MgKmFibGssIGludCBwY2lmbiwKKwkJYmZhX2FibGtfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmlfYWJsa19oMmlfcGZfcmVxX3MgKm07CisKKwlpZiAoIWJmYV9pb2NfaXNfb3BlcmF0aW9uYWwoYWJsay0+aW9jKSkgeworCQliZmFfdHJjKGFibGstPmlvYywgQkZBX1NUQVRVU19JT0NfRkFJTFVSRSk7CisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCX0KKworCWlmIChhYmxrLT5idXN5KSB7CisJCWJmYV90cmMoYWJsay0+aW9jLCBCRkFfU1RBVFVTX0RFVkJVU1kpOworCQlyZXR1cm4gIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisKKwlhYmxrLT5jYmZuICA9IGNiZm47CisJYWJsay0+Y2JhcmcgPSBjYmFyZzsKKwlhYmxrLT5idXN5ICA9IEJGQV9UUlVFOworCisJbSA9IChzdHJ1Y3QgYmZpX2FibGtfaDJpX3BmX3JlcV9zICopYWJsay0+bWIubXNnOworCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfQUJMSywgQkZJX0FCTEtfSDJJX1BGX0RFTEVURSwKKwkJICAgIGJmYV9pb2NfcG9ydGlkKGFibGstPmlvYykpOworCW0tPnBjaWZuID0gKHU4KXBjaWZuOworCWJmYV9pb2NfbWJveF9xdWV1ZShhYmxrLT5pb2MsICZhYmxrLT5tYik7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworYmZhX3N0YXR1c190CitiZmFfYWJsa19hZGFwdGVyX2NvbmZpZyhzdHJ1Y3QgYmZhX2FibGtfcyAqYWJsaywgZW51bSBiZmFfbW9kZV9zIG1vZGUsCisJCWludCBtYXhfcGYsIGludCBtYXhfdmYsIGJmYV9hYmxrX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZpX2FibGtfaDJpX2NmZ19yZXFfcyAqbTsKKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChhYmxrLT5pb2MpKSB7CisJCWJmYV90cmMoYWJsay0+aW9jLCBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkU7CisJfQorCisJaWYgKGFibGstPmJ1c3kpIHsKKwkJYmZhX3RyYyhhYmxrLT5pb2MsIEJGQV9TVEFUVVNfREVWQlVTWSk7CisJCXJldHVybiAgQkZBX1NUQVRVU19ERVZCVVNZOworCX0KKworCWFibGstPmNiZm4gID0gY2JmbjsKKwlhYmxrLT5jYmFyZyA9IGNiYXJnOworCWFibGstPmJ1c3kgID0gQkZBX1RSVUU7CisKKwltID0gKHN0cnVjdCBiZmlfYWJsa19oMmlfY2ZnX3JlcV9zICopYWJsay0+bWIubXNnOworCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfQUJMSywgQkZJX0FCTEtfSDJJX0FEUFRfQ09ORklHLAorCQkgICAgYmZhX2lvY19wb3J0aWQoYWJsay0+aW9jKSk7CisJbS0+bW9kZSA9ICh1OCltb2RlOworCW0tPm1heF9wZiA9ICh1OCltYXhfcGY7CisJbS0+bWF4X3ZmID0gKHU4KW1heF92ZjsKKwliZmFfaW9jX21ib3hfcXVldWUoYWJsay0+aW9jLCAmYWJsay0+bWIpOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2FibGtfcG9ydF9jb25maWcoc3RydWN0IGJmYV9hYmxrX3MgKmFibGssIGludCBwb3J0LCBlbnVtIGJmYV9tb2RlX3MgbW9kZSwKKwkJaW50IG1heF9wZiwgaW50IG1heF92ZiwgYmZhX2FibGtfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmlfYWJsa19oMmlfY2ZnX3JlcV9zICptOworCisJaWYgKCFiZmFfaW9jX2lzX29wZXJhdGlvbmFsKGFibGstPmlvYykpIHsKKwkJYmZhX3RyYyhhYmxrLT5pb2MsIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkUpOworCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfRkFJTFVSRTsKKwl9CisKKwlpZiAoYWJsay0+YnVzeSkgeworCQliZmFfdHJjKGFibGstPmlvYywgQkZBX1NUQVRVU19ERVZCVVNZKTsKKwkJcmV0dXJuICBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfQorCisJYWJsay0+Y2JmbiAgPSBjYmZuOworCWFibGstPmNiYXJnID0gY2Jhcmc7CisJYWJsay0+YnVzeSAgPSBCRkFfVFJVRTsKKworCW0gPSAoc3RydWN0IGJmaV9hYmxrX2gyaV9jZmdfcmVxX3MgKilhYmxrLT5tYi5tc2c7CisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19BQkxLLCBCRklfQUJMS19IMklfUE9SVF9DT05GSUcsCisJCWJmYV9pb2NfcG9ydGlkKGFibGstPmlvYykpOworCW0tPnBvcnQgPSAodTgpcG9ydDsKKwltLT5tb2RlID0gKHU4KW1vZGU7CisJbS0+bWF4X3BmID0gKHU4KW1heF9wZjsKKwltLT5tYXhfdmYgPSAodTgpbWF4X3ZmOworCWJmYV9pb2NfbWJveF9xdWV1ZShhYmxrLT5pb2MsICZhYmxrLT5tYik7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworYmZhX3N0YXR1c190CitiZmFfYWJsa19wZl91cGRhdGUoc3RydWN0IGJmYV9hYmxrX3MgKmFibGssIGludCBwY2lmbiwgaW50IGJ3LAorCQliZmFfYWJsa19jYmZuX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmaV9hYmxrX2gyaV9wZl9yZXFfcyAqbTsKKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChhYmxrLT5pb2MpKSB7CisJCWJmYV90cmMoYWJsay0+aW9jLCBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkU7CisJfQorCisJaWYgKGFibGstPmJ1c3kpIHsKKwkJYmZhX3RyYyhhYmxrLT5pb2MsIEJGQV9TVEFUVVNfREVWQlVTWSk7CisJCXJldHVybiAgQkZBX1NUQVRVU19ERVZCVVNZOworCX0KKworCWFibGstPmNiZm4gID0gY2JmbjsKKwlhYmxrLT5jYmFyZyA9IGNiYXJnOworCWFibGstPmJ1c3kgID0gQkZBX1RSVUU7CisKKwltID0gKHN0cnVjdCBiZmlfYWJsa19oMmlfcGZfcmVxX3MgKilhYmxrLT5tYi5tc2c7CisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19BQkxLLCBCRklfQUJMS19IMklfUEZfVVBEQVRFLAorCQliZmFfaW9jX3BvcnRpZChhYmxrLT5pb2MpKTsKKwltLT5wY2lmbiA9ICh1OClwY2lmbjsKKwltLT5idyA9IGNwdV90b19iZTMyKGJ3KTsKKwliZmFfaW9jX21ib3hfcXVldWUoYWJsay0+aW9jLCAmYWJsay0+bWIpOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2FibGtfb3B0cm9tX2VuKHN0cnVjdCBiZmFfYWJsa19zICphYmxrLCBiZmFfYWJsa19jYmZuX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmaV9hYmxrX2gyaV9vcHRyb21fcyAqbTsKKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChhYmxrLT5pb2MpKSB7CisJCWJmYV90cmMoYWJsay0+aW9jLCBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkU7CisJfQorCisJaWYgKGFibGstPmJ1c3kpIHsKKwkJYmZhX3RyYyhhYmxrLT5pb2MsIEJGQV9TVEFUVVNfREVWQlVTWSk7CisJCXJldHVybiAgQkZBX1NUQVRVU19ERVZCVVNZOworCX0KKworCWFibGstPmNiZm4gID0gY2JmbjsKKwlhYmxrLT5jYmFyZyA9IGNiYXJnOworCWFibGstPmJ1c3kgID0gQkZBX1RSVUU7CisKKwltID0gKHN0cnVjdCBiZmlfYWJsa19oMmlfb3B0cm9tX3MgKilhYmxrLT5tYi5tc2c7CisJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19BQkxLLCBCRklfQUJMS19IMklfT1BUUk9NX0VOQUJMRSwKKwkJYmZhX2lvY19wb3J0aWQoYWJsay0+aW9jKSk7CisJYmZhX2lvY19tYm94X3F1ZXVlKGFibGstPmlvYywgJmFibGstPm1iKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9hYmxrX29wdHJvbV9kaXMoc3RydWN0IGJmYV9hYmxrX3MgKmFibGssIGJmYV9hYmxrX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZpX2FibGtfaDJpX29wdHJvbV9zICptOworCisJaWYgKCFiZmFfaW9jX2lzX29wZXJhdGlvbmFsKGFibGstPmlvYykpIHsKKwkJYmZhX3RyYyhhYmxrLT5pb2MsIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkUpOworCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfRkFJTFVSRTsKKwl9CisKKwlpZiAoYWJsay0+YnVzeSkgeworCQliZmFfdHJjKGFibGstPmlvYywgQkZBX1NUQVRVU19ERVZCVVNZKTsKKwkJcmV0dXJuICBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfQorCisJYWJsay0+Y2JmbiAgPSBjYmZuOworCWFibGstPmNiYXJnID0gY2Jhcmc7CisJYWJsay0+YnVzeSAgPSBCRkFfVFJVRTsKKworCW0gPSAoc3RydWN0IGJmaV9hYmxrX2gyaV9vcHRyb21fcyAqKWFibGstPm1iLm1zZzsKKwliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0FCTEssIEJGSV9BQkxLX0gySV9PUFRST01fRElTQUJMRSwKKwkJYmZhX2lvY19wb3J0aWQoYWJsay0+aW9jKSk7CisJYmZhX2lvY19tYm94X3F1ZXVlKGFibGstPmlvYywgJmFibGstPm1iKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKgorICoJU0ZQIG1vZHVsZSBzcGVjaWZpYworICovCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdGF0aWMgdm9pZCBiZmFfc2ZwX2dldGRhdGFfc2VuZChzdHJ1Y3QgYmZhX3NmcF9zICpzZnApOworc3RhdGljIHZvaWQgYmZhX3NmcF9tZWRpYV9nZXQoc3RydWN0IGJmYV9zZnBfcyAqc2ZwKTsKK3N0YXRpYyBiZmFfc3RhdHVzX3QgYmZhX3NmcF9zcGVlZF92YWxpZChzdHJ1Y3QgYmZhX3NmcF9zICpzZnAsCisJCQkJZW51bSBiZmFfcG9ydF9zcGVlZCBwb3J0c3BlZWQpOworCitzdGF0aWMgdm9pZAorYmZhX2NiX3NmcF9zaG93KHN0cnVjdCBiZmFfc2ZwX3MgKnNmcCkKK3sKKwliZmFfdHJjKHNmcCwgc2ZwLT5sb2NrKTsKKwlpZiAoc2ZwLT5jYmZuKQorCQlzZnAtPmNiZm4oc2ZwLT5jYmFyZywgc2ZwLT5zdGF0dXMpOworCXNmcC0+bG9jayA9IDA7CisJc2ZwLT5jYmZuID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2JmYV9jYl9zZnBfc3RhdGVfcXVlcnkoc3RydWN0IGJmYV9zZnBfcyAqc2ZwKQoreworCWJmYV90cmMoc2ZwLCBzZnAtPnBvcnRzcGVlZCk7CisJaWYgKHNmcC0+bWVkaWEpIHsKKwkJYmZhX3NmcF9tZWRpYV9nZXQoc2ZwKTsKKwkJaWYgKHNmcC0+c3RhdGVfcXVlcnlfY2JmbikKKwkJCXNmcC0+c3RhdGVfcXVlcnlfY2JmbihzZnAtPnN0YXRlX3F1ZXJ5X2NiYXJnLAorCQkJCQlzZnAtPnN0YXR1cyk7CisJCQlzZnAtPm1lZGlhID0gTlVMTDsKKwkJfQorCisJCWlmIChzZnAtPnBvcnRzcGVlZCkgeworCQkJc2ZwLT5zdGF0dXMgPSBiZmFfc2ZwX3NwZWVkX3ZhbGlkKHNmcCwgc2ZwLT5wb3J0c3BlZWQpOworCQkJaWYgKHNmcC0+c3RhdGVfcXVlcnlfY2JmbikKKwkJCQlzZnAtPnN0YXRlX3F1ZXJ5X2NiZm4oc2ZwLT5zdGF0ZV9xdWVyeV9jYmFyZywKKwkJCQkJCXNmcC0+c3RhdHVzKTsKKwkJCQlzZnAtPnBvcnRzcGVlZCA9IEJGQV9QT1JUX1NQRUVEX1VOS05PV047CisJCX0KKworCQlzZnAtPnN0YXRlX3F1ZXJ5X2xvY2sgPSAwOworCQlzZnAtPnN0YXRlX3F1ZXJ5X2NiZm4gPSBOVUxMOworfQorCisvKgorICoJSU9DIGV2ZW50IGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfc2ZwX25vdGlmeSh2b2lkICpzZnBfYXJnLCBlbnVtIGJmYV9pb2NfZXZlbnRfZSBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX3NmcF9zICpzZnAgPSBzZnBfYXJnOworCisJYmZhX3RyYyhzZnAsIGV2ZW50KTsKKwliZmFfdHJjKHNmcCwgc2ZwLT5sb2NrKTsKKwliZmFfdHJjKHNmcCwgc2ZwLT5zdGF0ZV9xdWVyeV9sb2NrKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JT0NfRV9ESVNBQkxFRDoKKwljYXNlIEJGQV9JT0NfRV9GQUlMRUQ6CisJCWlmIChzZnAtPmxvY2spIHsKKwkJCXNmcC0+c3RhdHVzID0gQkZBX1NUQVRVU19JT0NfRkFJTFVSRTsKKwkJCWJmYV9jYl9zZnBfc2hvdyhzZnApOworCQl9CisKKwkJaWYgKHNmcC0+c3RhdGVfcXVlcnlfbG9jaykgeworCQkJc2ZwLT5zdGF0dXMgPSBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCQkJYmZhX2NiX3NmcF9zdGF0ZV9xdWVyeShzZnApOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKgorICoJU0ZQIGdldCBkYXRhIHNlbmQKKyAqLworc3RhdGljIHZvaWQKK2JmYV9zZnBfZ2V0ZGF0YV9zZW5kKHN0cnVjdCBiZmFfc2ZwX3MgKnNmcCkKK3sKKwlzdHJ1Y3QgYmZpX3NmcF9yZXFfcyAqcmVxID0gKHN0cnVjdCBiZmlfc2ZwX3JlcV9zICopc2ZwLT5tYmNtZC5tc2c7CisKKwliZmFfdHJjKHNmcCwgcmVxLT5tZW10eXBlKTsKKworCS8qIGJ1aWxkIGhvc3QgY29tbWFuZCAqLworCWJmaV9oMmlfc2V0KHJlcS0+bWgsIEJGSV9NQ19TRlAsIEJGSV9TRlBfSDJJX1NIT1csCisJCQliZmFfaW9jX3BvcnRpZChzZnAtPmlvYykpOworCisJLyogc2VuZCBtYm94IGNtZCAqLworCWJmYV9pb2NfbWJveF9xdWV1ZShzZnAtPmlvYywgJnNmcC0+bWJjbWQpOworfQorCisvKgorICoJU0ZQIGlzIHZhbGlkLCByZWFkIHNmcCBkYXRhCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfc2ZwX2dldGRhdGEoc3RydWN0IGJmYV9zZnBfcyAqc2ZwLCBlbnVtIGJmaV9zZnBfbWVtX2UgbWVtdHlwZSkKK3sKKwlzdHJ1Y3QgYmZpX3NmcF9yZXFfcyAqcmVxID0gKHN0cnVjdCBiZmlfc2ZwX3JlcV9zICopc2ZwLT5tYmNtZC5tc2c7CisKKwlXQVJOX09OKHNmcC0+bG9jayAhPSAwKTsKKwliZmFfdHJjKHNmcCwgc2ZwLT5zdGF0ZSk7CisKKwlzZnAtPmxvY2sgPSAxOworCXNmcC0+bWVtdHlwZSA9IG1lbXR5cGU7CisJcmVxLT5tZW10eXBlID0gbWVtdHlwZTsKKworCS8qIFNldHVwIFNHIGxpc3QgKi8KKwliZmFfYWxlbl9zZXQoJnJlcS0+YWxlbiwgc2l6ZW9mKHN0cnVjdCBzZnBfbWVtX3MpLCBzZnAtPmRidWZfcGEpOworCisJYmZhX3NmcF9nZXRkYXRhX3NlbmQoc2ZwKTsKK30KKworLyoKKyAqIFNGUCBzaG93IGNvbXBsZXRlCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfc2ZwX3Nob3dfY29tcChzdHJ1Y3QgYmZhX3NmcF9zICpzZnAsIHN0cnVjdCBiZmlfbWJtc2dfcyAqbXNnKQoreworCXN0cnVjdCBiZmlfc2ZwX3JzcF9zICpyc3AgPSAoc3RydWN0IGJmaV9zZnBfcnNwX3MgKikgbXNnOworCisJaWYgKCFzZnAtPmxvY2spIHsKKwkJLyoKKwkJICogcmVjZWl2aW5nIHJlc3BvbnNlIGFmdGVyIGlvYyBmYWlsdXJlCisJCSAqLworCQliZmFfdHJjKHNmcCwgc2ZwLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWJmYV90cmMoc2ZwLCByc3AtPnN0YXR1cyk7CisJaWYgKHJzcC0+c3RhdHVzID09IEJGQV9TVEFUVVNfT0spIHsKKwkJc2ZwLT5kYXRhX3ZhbGlkID0gMTsKKwkJaWYgKHNmcC0+c3RhdGUgPT0gQkZBX1NGUF9TVEFURV9WQUxJRCkKKwkJCXNmcC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwkJZWxzZSBpZiAoc2ZwLT5zdGF0ZSA9PSBCRkFfU0ZQX1NUQVRFX1VOU1VQUE9SVCkKKwkJCXNmcC0+c3RhdHVzID0gQkZBX1NUQVRVU19TRlBfVU5TVVBQOworCQllbHNlCisJCQliZmFfdHJjKHNmcCwgc2ZwLT5zdGF0ZSk7CisJfSBlbHNlIHsKKwkJc2ZwLT5kYXRhX3ZhbGlkID0gMDsKKwkJc2ZwLT5zdGF0dXMgPSByc3AtPnN0YXR1czsKKwkJLyogc2Zwc2hvdyBzaG91bGRuJ3QgY2hhbmdlIHNmcCBzdGF0ZSAqLworCX0KKworCWJmYV90cmMoc2ZwLCBzZnAtPm1lbXR5cGUpOworCWlmIChzZnAtPm1lbXR5cGUgPT0gQkZJX1NGUF9NRU1fRElBR0VYVCkgeworCQliZmFfdHJjKHNmcCwgc2ZwLT5kYXRhX3ZhbGlkKTsKKwkJaWYgKHNmcC0+ZGF0YV92YWxpZCkgeworCQkJdTMyCXNpemUgPSBzaXplb2Yoc3RydWN0IHNmcF9tZW1fcyk7CisJCQl1OCAqZGVzID0gKHU4ICopICYoc2ZwLT5zZnBtZW0tPnNybGlkX2Jhc2UpOworCQkJbWVtY3B5KGRlcywgc2ZwLT5kYnVmX2t2YSwgc2l6ZSk7CisJCX0KKwkJLyoKKwkJICogUXVldWUgY29tcGxldGlvbiBjYWxsYmFjay4KKwkJICovCisJCWJmYV9jYl9zZnBfc2hvdyhzZnApOworCX0gZWxzZQorCQlzZnAtPmxvY2sgPSAwOworCisJYmZhX3RyYyhzZnAsIHNmcC0+c3RhdGVfcXVlcnlfbG9jayk7CisJaWYgKHNmcC0+c3RhdGVfcXVlcnlfbG9jaykgeworCQlzZnAtPnN0YXRlID0gcnNwLT5zdGF0ZTsKKwkJLyogQ29tcGxldGUgY2FsbGJhY2sgKi8KKwkJYmZhX2NiX3NmcF9zdGF0ZV9xdWVyeShzZnApOworCX0KK30KKworLyoKKyAqCVNGUCBxdWVyeSBmdyBzZnAgc3RhdGUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9zZnBfc3RhdGVfcXVlcnkoc3RydWN0IGJmYV9zZnBfcyAqc2ZwKQoreworCXN0cnVjdCBiZmlfc2ZwX3JlcV9zICpyZXEgPSAoc3RydWN0IGJmaV9zZnBfcmVxX3MgKilzZnAtPm1iY21kLm1zZzsKKworCS8qIFNob3VsZCBub3QgYmUgZG9pbmcgcXVlcnkgaWYgbm90IGluIF9JTklUIHN0YXRlICovCisJV0FSTl9PTihzZnAtPnN0YXRlICE9IEJGQV9TRlBfU1RBVEVfSU5JVCk7CisJV0FSTl9PTihzZnAtPnN0YXRlX3F1ZXJ5X2xvY2sgIT0gMCk7CisJYmZhX3RyYyhzZnAsIHNmcC0+c3RhdGUpOworCisJc2ZwLT5zdGF0ZV9xdWVyeV9sb2NrID0gMTsKKwlyZXEtPm1lbXR5cGUgPSAwOworCisJaWYgKCFzZnAtPmxvY2spCisJCWJmYV9zZnBfZ2V0ZGF0YShzZnAsIEJGSV9TRlBfTUVNX0FMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfc2ZwX21lZGlhX2dldChzdHJ1Y3QgYmZhX3NmcF9zICpzZnApCit7CisJZW51bSBiZmFfZGVmc19zZnBfbWVkaWFfZSAqbWVkaWEgPSBzZnAtPm1lZGlhOworCisJKm1lZGlhID0gQkZBX1NGUF9NRURJQV9VTktOT1dOOworCisJaWYgKHNmcC0+c3RhdGUgPT0gQkZBX1NGUF9TVEFURV9VTlNVUFBPUlQpCisJCSptZWRpYSA9IEJGQV9TRlBfTUVESUFfVU5TVVBQT1JUOworCWVsc2UgaWYgKHNmcC0+c3RhdGUgPT0gQkZBX1NGUF9TVEFURV9WQUxJRCkgeworCQl1bmlvbiBzZnBfeGN2cl9lMTBnX2NvZGVfdSBlMTBnOworCQlzdHJ1Y3Qgc2ZwX21lbV9zICpzZnBtZW0gPSAoc3RydWN0IHNmcF9tZW1fcyAqKXNmcC0+ZGJ1Zl9rdmE7CisJCXUxNiB4bXRyX3RlY2ggPSAoc2ZwbWVtLT5zcmxpZF9iYXNlLnhjdnJbNF0gJiAweDMpIDw8IDcgfAorCQkJCShzZnBtZW0tPnNybGlkX2Jhc2UueGN2cls1XSA+PiAxKTsKKworCQllMTBnLmIgPSBzZnBtZW0tPnNybGlkX2Jhc2UueGN2clswXTsKKwkJYmZhX3RyYyhzZnAsIGUxMGcuYik7CisJCWJmYV90cmMoc2ZwLCB4bXRyX3RlY2gpOworCQkvKiBjaGVjayBmYyB0cmFuc21pdHRlciB0ZWNoICovCisJCWlmICgoeG10cl90ZWNoICYgU0ZQX1hNVFJfVEVDSF9DVSkgfHwKKwkJICAgICh4bXRyX3RlY2ggJiBTRlBfWE1UUl9URUNIX0NQKSB8fAorCQkgICAgKHhtdHJfdGVjaCAmIFNGUF9YTVRSX1RFQ0hfQ0EpKQorCQkJKm1lZGlhID0gQkZBX1NGUF9NRURJQV9DVTsKKwkJZWxzZSBpZiAoKHhtdHJfdGVjaCAmIFNGUF9YTVRSX1RFQ0hfRUxfSU5UUkEpIHx8CisJCQkgKHhtdHJfdGVjaCAmIFNGUF9YTVRSX1RFQ0hfRUxfSU5URVIpKQorCQkJKm1lZGlhID0gQkZBX1NGUF9NRURJQV9FTDsKKwkJZWxzZSBpZiAoKHhtdHJfdGVjaCAmIFNGUF9YTVRSX1RFQ0hfTEwpIHx8CisJCQkgKHhtdHJfdGVjaCAmIFNGUF9YTVRSX1RFQ0hfTEMpKQorCQkJKm1lZGlhID0gQkZBX1NGUF9NRURJQV9MVzsKKwkJZWxzZSBpZiAoKHhtdHJfdGVjaCAmIFNGUF9YTVRSX1RFQ0hfU0wpIHx8CisJCQkgKHhtdHJfdGVjaCAmIFNGUF9YTVRSX1RFQ0hfU04pIHx8CisJCQkgKHhtdHJfdGVjaCAmIFNGUF9YTVRSX1RFQ0hfU0EpKQorCQkJKm1lZGlhID0gQkZBX1NGUF9NRURJQV9TVzsKKwkJLyogQ2hlY2sgMTBHIEV0aGVybmV0IENvbXBpbGFuY2UgY29kZSAqLworCQllbHNlIGlmIChlMTBnLmIgJiAweDEwKQorCQkJKm1lZGlhID0gQkZBX1NGUF9NRURJQV9TVzsKKwkJZWxzZSBpZiAoZTEwZy5iICYgMHg2MCkKKwkJCSptZWRpYSA9IEJGQV9TRlBfTUVESUFfTFc7CisJCWVsc2UgaWYgKGUxMGcuci5lMTBnX3VuYWxsICYgMHg4MCkKKwkJCSptZWRpYSA9IEJGQV9TRlBfTUVESUFfVU5LTk9XTjsKKwkJZWxzZQorCQkJYmZhX3RyYyhzZnAsIDApOworCX0gZWxzZQorCQliZmFfdHJjKHNmcCwgc2ZwLT5zdGF0ZSk7Cit9CisKK3N0YXRpYyBiZmFfc3RhdHVzX3QKK2JmYV9zZnBfc3BlZWRfdmFsaWQoc3RydWN0IGJmYV9zZnBfcyAqc2ZwLCBlbnVtIGJmYV9wb3J0X3NwZWVkIHBvcnRzcGVlZCkKK3sKKwlzdHJ1Y3Qgc2ZwX21lbV9zICpzZnBtZW0gPSAoc3RydWN0IHNmcF9tZW1fcyAqKXNmcC0+ZGJ1Zl9rdmE7CisJc3RydWN0IHNmcF94Y3ZyX3MgKnhjdnIgPSAoc3RydWN0IHNmcF94Y3ZyX3MgKikgc2ZwbWVtLT5zcmxpZF9iYXNlLnhjdnI7CisJdW5pb24gc2ZwX3hjdnJfZmMzX2NvZGVfdSBmYzMgPSB4Y3ZyLT5mYzM7CisJdW5pb24gc2ZwX3hjdnJfZTEwZ19jb2RlX3UgZTEwZyA9IHhjdnItPmUxMGc7CisKKwlpZiAocG9ydHNwZWVkID09IEJGQV9QT1JUX1NQRUVEXzEwR0JQUykgeworCQlpZiAoZTEwZy5yLmUxMGdfc3IgfHwgZTEwZy5yLmUxMGdfbHIpCisJCQlyZXR1cm4gQkZBX1NUQVRVU19PSzsKKwkJZWxzZSB7CisJCQliZmFfdHJjKHNmcCwgZTEwZy5iKTsKKwkJCXJldHVybiBCRkFfU1RBVFVTX1VOU1VQUF9TUEVFRDsKKwkJfQorCX0KKwlpZiAoKChwb3J0c3BlZWQgJiBCRkFfUE9SVF9TUEVFRF8xNkdCUFMpICYmIGZjMy5yLm1iMTYwMCkgfHwKKwkgICAgKChwb3J0c3BlZWQgJiBCRkFfUE9SVF9TUEVFRF84R0JQUykgJiYgZmMzLnIubWI4MDApIHx8CisJICAgICgocG9ydHNwZWVkICYgQkZBX1BPUlRfU1BFRURfNEdCUFMpICYmIGZjMy5yLm1iNDAwKSB8fAorCSAgICAoKHBvcnRzcGVlZCAmIEJGQV9QT1JUX1NQRUVEXzJHQlBTKSAmJiBmYzMuci5tYjIwMCkgfHwKKwkgICAgKChwb3J0c3BlZWQgJiBCRkFfUE9SVF9TUEVFRF8xR0JQUykgJiYgZmMzLnIubWIxMDApKQorCQlyZXR1cm4gQkZBX1NUQVRVU19PSzsKKwllbHNlIHsKKwkJYmZhX3RyYyhzZnAsIHBvcnRzcGVlZCk7CisJCWJmYV90cmMoc2ZwLCBmYzMuYik7CisJCWJmYV90cmMoc2ZwLCBlMTBnLmIpOworCQlyZXR1cm4gQkZBX1NUQVRVU19VTlNVUFBfU1BFRUQ7CisJfQorfQorCisvKgorICoJU0ZQIGhtYm94IGhhbmRsZXIKKyAqLwordm9pZAorYmZhX3NmcF9pbnRyKHZvaWQgKnNmcGFyZywgc3RydWN0IGJmaV9tYm1zZ19zICptc2cpCit7CisJc3RydWN0IGJmYV9zZnBfcyAqc2ZwID0gc2ZwYXJnOworCisJc3dpdGNoIChtc2ctPm1oLm1zZ19pZCkgeworCWNhc2UgQkZJX1NGUF9JMkhfU0hPVzoKKwkJYmZhX3NmcF9zaG93X2NvbXAoc2ZwLCBtc2cpOworCQlicmVhazsKKworCWNhc2UgQkZJX1NGUF9JMkhfU0NOOgorCQliZmFfdHJjKHNmcCwgbXNnLT5taC5tc2dfaWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJmYV90cmMoc2ZwLCBtc2ctPm1oLm1zZ19pZCk7CisJCVdBUk5fT04oMSk7CisJfQorfQorCisvKgorICoJUmV0dXJuIERNQSBtZW1vcnkgbmVlZGVkIGJ5IHNmcCBtb2R1bGUuCisgKi8KK3UzMgorYmZhX3NmcF9tZW1pbmZvKHZvaWQpCit7CisJcmV0dXJuIEJGQV9ST1VORFVQKHNpemVvZihzdHJ1Y3Qgc2ZwX21lbV9zKSwgQkZBX0RNQV9BTElHTl9TWik7Cit9CisKKy8qCisgKglBdHRhY2ggdmlydHVhbCBhbmQgcGh5c2ljYWwgbWVtb3J5IGZvciBTRlAuCisgKi8KK3ZvaWQKK2JmYV9zZnBfYXR0YWNoKHN0cnVjdCBiZmFfc2ZwX3MgKnNmcCwgc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICpkZXYsCisJCXN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtb2QpCit7CisJc2ZwLT5kZXYgPSBkZXY7CisJc2ZwLT5pb2MgPSBpb2M7CisJc2ZwLT50cmNtb2QgPSB0cmNtb2Q7CisKKwlzZnAtPmNiZm4gPSBOVUxMOworCXNmcC0+Y2JhcmcgPSBOVUxMOworCXNmcC0+c2ZwbWVtID0gTlVMTDsKKwlzZnAtPmxvY2sgPSAwOworCXNmcC0+ZGF0YV92YWxpZCA9IDA7CisJc2ZwLT5zdGF0ZSA9IEJGQV9TRlBfU1RBVEVfSU5JVDsKKwlzZnAtPnN0YXRlX3F1ZXJ5X2xvY2sgPSAwOworCXNmcC0+c3RhdGVfcXVlcnlfY2JmbiA9IE5VTEw7CisJc2ZwLT5zdGF0ZV9xdWVyeV9jYmFyZyA9IE5VTEw7CisJc2ZwLT5tZWRpYSA9IE5VTEw7CisJc2ZwLT5wb3J0c3BlZWQgPSBCRkFfUE9SVF9TUEVFRF9VTktOT1dOOworCXNmcC0+aXNfZWxiID0gQkZBX0ZBTFNFOworCisJYmZhX2lvY19tYm94X3JlZ2lzcihzZnAtPmlvYywgQkZJX01DX1NGUCwgYmZhX3NmcF9pbnRyLCBzZnApOworCWJmYV9xX3FlX2luaXQoJnNmcC0+aW9jX25vdGlmeSk7CisJYmZhX2lvY19ub3RpZnlfaW5pdCgmc2ZwLT5pb2Nfbm90aWZ5LCBiZmFfc2ZwX25vdGlmeSwgc2ZwKTsKKwlsaXN0X2FkZF90YWlsKCZzZnAtPmlvY19ub3RpZnkucWUsICZzZnAtPmlvYy0+bm90aWZ5X3EpOworfQorCisvKgorICoJQ2xhaW0gTWVtb3J5IGZvciBTRlAKKyAqLwordm9pZAorYmZhX3NmcF9tZW1jbGFpbShzdHJ1Y3QgYmZhX3NmcF9zICpzZnAsIHU4ICpkbV9rdmEsIHU2NCBkbV9wYSkKK3sKKwlzZnAtPmRidWZfa3ZhICAgPSBkbV9rdmE7CisJc2ZwLT5kYnVmX3BhICAgID0gZG1fcGE7CisJbWVtc2V0KHNmcC0+ZGJ1Zl9rdmEsIDAsIHNpemVvZihzdHJ1Y3Qgc2ZwX21lbV9zKSk7CisKKwlkbV9rdmEgKz0gQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBzZnBfbWVtX3MpLCBCRkFfRE1BX0FMSUdOX1NaKTsKKwlkbV9wYSArPSBCRkFfUk9VTkRVUChzaXplb2Yoc3RydWN0IHNmcF9tZW1fcyksIEJGQV9ETUFfQUxJR05fU1opOworfQorCisvKgorICogU2hvdyBTRlAgZWVwcm9tIGNvbnRlbnQKKyAqCisgKiBAcGFyYW1baW5dIHNmcCAgIC0gYmZhIHNmcCBtb2R1bGUKKyAqCisgKiBAcGFyYW1bb3V0XSBzZnBtZW0gLSBzZnAgZWVwcm9tIGRhdGEKKyAqCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX3NmcF9zaG93KHN0cnVjdCBiZmFfc2ZwX3MgKnNmcCwgc3RydWN0IHNmcF9tZW1fcyAqc2ZwbWVtLAorCQliZmFfY2Jfc2ZwX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisKKwlpZiAoIWJmYV9pb2NfaXNfb3BlcmF0aW9uYWwoc2ZwLT5pb2MpKSB7CisJCWJmYV90cmMoc2ZwLCAwKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKwl9CisKKwlpZiAoc2ZwLT5sb2NrKSB7CisJCWJmYV90cmMoc2ZwLCAwKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisKKwlzZnAtPmNiZm4gPSBjYmZuOworCXNmcC0+Y2JhcmcgPSBjYmFyZzsKKwlzZnAtPnNmcG1lbSA9IHNmcG1lbTsKKworCWJmYV9zZnBfZ2V0ZGF0YShzZnAsIEJGSV9TRlBfTUVNX0RJQUdFWFQpOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKgorICogUmV0dXJuIFNGUCBNZWRpYSB0eXBlCisgKgorICogQHBhcmFtW2luXSBzZnAgICAtIGJmYSBzZnAgbW9kdWxlCisgKgorICogQHBhcmFtW291dF0gbWVkaWEgLSBwb3J0IHNwZWVkIGZyb20gdXNlcgorICoKKyAqLworYmZhX3N0YXR1c190CitiZmFfc2ZwX21lZGlhKHN0cnVjdCBiZmFfc2ZwX3MgKnNmcCwgZW51bSBiZmFfZGVmc19zZnBfbWVkaWFfZSAqbWVkaWEsCisJCWJmYV9jYl9zZnBfdCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwlpZiAoIWJmYV9pb2NfaXNfb3BlcmF0aW9uYWwoc2ZwLT5pb2MpKSB7CisJCWJmYV90cmMoc2ZwLCAwKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKwl9CisKKwlzZnAtPm1lZGlhID0gbWVkaWE7CisJaWYgKHNmcC0+c3RhdGUgPT0gQkZBX1NGUF9TVEFURV9JTklUKSB7CisJCWlmIChzZnAtPnN0YXRlX3F1ZXJ5X2xvY2spIHsKKwkJCWJmYV90cmMoc2ZwLCAwKTsKKwkJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisJCX0gZWxzZSB7CisJCQlzZnAtPnN0YXRlX3F1ZXJ5X2NiZm4gPSBjYmZuOworCQkJc2ZwLT5zdGF0ZV9xdWVyeV9jYmFyZyA9IGNiYXJnOworCQkJYmZhX3NmcF9zdGF0ZV9xdWVyeShzZnApOworCQkJcmV0dXJuIEJGQV9TVEFUVVNfU0ZQX05PVF9SRUFEWTsKKwkJfQorCX0KKworCWJmYV9zZnBfbWVkaWFfZ2V0KHNmcCk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qCisgKiBDaGVjayBpZiB1c2VyIHNldCBwb3J0IHNwZWVkIGlzIGFsbG93ZWQgYnkgdGhlIFNGUAorICoKKyAqIEBwYXJhbVtpbl0gc2ZwICAgLSBiZmEgc2ZwIG1vZHVsZQorICogQHBhcmFtW2luXSBwb3J0c3BlZWQgLSBwb3J0IHNwZWVkIGZyb20gdXNlcgorICoKKyAqLworYmZhX3N0YXR1c190CitiZmFfc2ZwX3NwZWVkKHN0cnVjdCBiZmFfc2ZwX3MgKnNmcCwgZW51bSBiZmFfcG9ydF9zcGVlZCBwb3J0c3BlZWQsCisJCWJmYV9jYl9zZnBfdCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwlXQVJOX09OKHBvcnRzcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF9VTktOT1dOKTsKKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChzZnAtPmlvYykpCisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19OT05fT1A7CisKKwkvKiBGb3IgTWV6eiBjYXJkLCBhbGwgc3BlZWQgaXMgYWxsb3dlZCAqLworCWlmIChiZmFfbWZnX2lzX21lenooc2ZwLT5pb2MtPmF0dHItPmNhcmRfdHlwZSkpCisJCXJldHVybiBCRkFfU1RBVFVTX09LOworCisJLyogQ2hlY2sgU0ZQIHN0YXRlICovCisJc2ZwLT5wb3J0c3BlZWQgPSBwb3J0c3BlZWQ7CisJaWYgKHNmcC0+c3RhdGUgPT0gQkZBX1NGUF9TVEFURV9JTklUKSB7CisJCWlmIChzZnAtPnN0YXRlX3F1ZXJ5X2xvY2spIHsKKwkJCWJmYV90cmMoc2ZwLCAwKTsKKwkJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisJCX0gZWxzZSB7CisJCQlzZnAtPnN0YXRlX3F1ZXJ5X2NiZm4gPSBjYmZuOworCQkJc2ZwLT5zdGF0ZV9xdWVyeV9jYmFyZyA9IGNiYXJnOworCQkJYmZhX3NmcF9zdGF0ZV9xdWVyeShzZnApOworCQkJcmV0dXJuIEJGQV9TVEFUVVNfU0ZQX05PVF9SRUFEWTsKKwkJfQorCX0KKworCWlmIChzZnAtPnN0YXRlID09IEJGQV9TRlBfU1RBVEVfUkVNT1ZFRCB8fAorCSAgICBzZnAtPnN0YXRlID09IEJGQV9TRlBfU1RBVEVfRkFJTEVEKSB7CisJCWJmYV90cmMoc2ZwLCBzZnAtPnN0YXRlKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfTk9fU0ZQX0RFVjsKKwl9CisKKwlpZiAoc2ZwLT5zdGF0ZSA9PSBCRkFfU0ZQX1NUQVRFX0lOU0VSVEVEKSB7CisJCWJmYV90cmMoc2ZwLCBzZnAtPnN0YXRlKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsgIC8qIHNmcCBpcyByZWFkaW5nIGRhdGEgKi8KKwl9CisKKwkvKiBGb3IgZWxvb3BiYWNrLCBhbGwgc3BlZWQgaXMgYWxsb3dlZCAqLworCWlmIChzZnAtPmlzX2VsYikKKwkJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CisKKwlyZXR1cm4gYmZhX3NmcF9zcGVlZF92YWxpZChzZnAsIHBvcnRzcGVlZCk7Cit9CisKKy8qCisgKglGbGFzaCBtb2R1bGUgc3BlY2lmaWMKKyAqLworCisvKgorICogRkxBU0ggRE1BIGJ1ZmZlciBzaG91bGQgYmUgYmlnIGVub3VnaCB0byBob2xkIGJvdGggTUZHIGJsb2NrIGFuZAorICogYXNpYyBibG9jayg2NGspIGF0IHRoZSBzYW1lIHRpbWUgYW5kIGFsc28gc2hvdWxkIGJlIDJrIGFsaWduZWQgdG8KKyAqIGF2b2lkIHdyaXRlIHNlZ2VtZW50IHRvIGNyb3NzIHNlY3RvciBib3VuZGFyeS4KKyAqLworI2RlZmluZSBCRkFfRkxBU0hfU0VHX1NaCTIwNDgKKyNkZWZpbmUgQkZBX0ZMQVNIX0RNQV9CVUZfU1oJXAorCUJGQV9ST1VORFVQKDB4MDEwMDAwICsgc2l6ZW9mKHN0cnVjdCBiZmFfbWZnX2Jsb2NrX3MpLCBCRkFfRkxBU0hfU0VHX1NaKQorCitzdGF0aWMgdm9pZAorYmZhX2ZsYXNoX2NiKHN0cnVjdCBiZmFfZmxhc2hfcyAqZmxhc2gpCit7CisJZmxhc2gtPm9wX2J1c3kgPSAwOworCWlmIChmbGFzaC0+Y2JmbikKKwkJZmxhc2gtPmNiZm4oZmxhc2gtPmNiYXJnLCBmbGFzaC0+c3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mbGFzaF9ub3RpZnkodm9pZCAqY2JhcmcsIGVudW0gYmZhX2lvY19ldmVudF9lIGV2ZW50KQoreworCXN0cnVjdCBiZmFfZmxhc2hfcwkqZmxhc2ggPSBjYmFyZzsKKworCWJmYV90cmMoZmxhc2gsIGV2ZW50KTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfSU9DX0VfRElTQUJMRUQ6CisJY2FzZSBCRkFfSU9DX0VfRkFJTEVEOgorCQlpZiAoZmxhc2gtPm9wX2J1c3kpIHsKKwkJCWZsYXNoLT5zdGF0dXMgPSBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCQkJZmxhc2gtPmNiZm4oZmxhc2gtPmNiYXJnLCBmbGFzaC0+c3RhdHVzKTsKKwkJCWZsYXNoLT5vcF9idXN5ID0gMDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFNlbmQgZmxhc2ggYXR0cmlidXRlIHF1ZXJ5IHJlcXVlc3QuCisgKgorICogQHBhcmFtW2luXSBjYmFyZyAtIGNhbGxiYWNrIGFyZ3VtZW50CisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmxhc2hfcXVlcnlfc2VuZCh2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX2ZsYXNoX3MgKmZsYXNoID0gY2Jhcmc7CisJc3RydWN0IGJmaV9mbGFzaF9xdWVyeV9yZXFfcyAqbXNnID0KKwkJCShzdHJ1Y3QgYmZpX2ZsYXNoX3F1ZXJ5X3JlcV9zICopIGZsYXNoLT5tYi5tc2c7CisKKwliZmlfaDJpX3NldChtc2ctPm1oLCBCRklfTUNfRkxBU0gsIEJGSV9GTEFTSF9IMklfUVVFUllfUkVRLAorCQliZmFfaW9jX3BvcnRpZChmbGFzaC0+aW9jKSk7CisJYmZhX2FsZW5fc2V0KCZtc2ctPmFsZW4sIHNpemVvZihzdHJ1Y3QgYmZhX2ZsYXNoX2F0dHJfcyksCisJCWZsYXNoLT5kYnVmX3BhKTsKKwliZmFfaW9jX21ib3hfcXVldWUoZmxhc2gtPmlvYywgJmZsYXNoLT5tYik7Cit9CisKKy8qCisgKiBTZW5kIGZsYXNoIHdyaXRlIHJlcXVlc3QuCisgKgorICogQHBhcmFtW2luXSBjYmFyZyAtIGNhbGxiYWNrIGFyZ3VtZW50CisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmxhc2hfd3JpdGVfc2VuZChzdHJ1Y3QgYmZhX2ZsYXNoX3MgKmZsYXNoKQoreworCXN0cnVjdCBiZmlfZmxhc2hfd3JpdGVfcmVxX3MgKm1zZyA9CisJCQkoc3RydWN0IGJmaV9mbGFzaF93cml0ZV9yZXFfcyAqKSBmbGFzaC0+bWIubXNnOworCXUzMglsZW47CisKKwltc2ctPnR5cGUgPSBiZTMyX3RvX2NwdShmbGFzaC0+dHlwZSk7CisJbXNnLT5pbnN0YW5jZSA9IGZsYXNoLT5pbnN0YW5jZTsKKwltc2ctPm9mZnNldCA9IGJlMzJfdG9fY3B1KGZsYXNoLT5hZGRyX29mZiArIGZsYXNoLT5vZmZzZXQpOworCWxlbiA9IChmbGFzaC0+cmVzaWR1ZSA8IEJGQV9GTEFTSF9ETUFfQlVGX1NaKSA/CisJCWZsYXNoLT5yZXNpZHVlIDogQkZBX0ZMQVNIX0RNQV9CVUZfU1o7CisJbXNnLT5sZW5ndGggPSBiZTMyX3RvX2NwdShsZW4pOworCisJLyogaW5kaWNhdGUgaWYgaXQncyB0aGUgbGFzdCBtc2cgb2YgdGhlIHdob2xlIHdyaXRlIG9wZXJhdGlvbiAqLworCW1zZy0+bGFzdCA9IChsZW4gPT0gZmxhc2gtPnJlc2lkdWUpID8gMSA6IDA7CisKKwliZmlfaDJpX3NldChtc2ctPm1oLCBCRklfTUNfRkxBU0gsIEJGSV9GTEFTSF9IMklfV1JJVEVfUkVRLAorCQkJYmZhX2lvY19wb3J0aWQoZmxhc2gtPmlvYykpOworCWJmYV9hbGVuX3NldCgmbXNnLT5hbGVuLCBsZW4sIGZsYXNoLT5kYnVmX3BhKTsKKwltZW1jcHkoZmxhc2gtPmRidWZfa3ZhLCBmbGFzaC0+dWJ1ZiArIGZsYXNoLT5vZmZzZXQsIGxlbik7CisJYmZhX2lvY19tYm94X3F1ZXVlKGZsYXNoLT5pb2MsICZmbGFzaC0+bWIpOworCisJZmxhc2gtPnJlc2lkdWUgLT0gbGVuOworCWZsYXNoLT5vZmZzZXQgKz0gbGVuOworfQorCisvKgorICogU2VuZCBmbGFzaCByZWFkIHJlcXVlc3QuCisgKgorICogQHBhcmFtW2luXSBjYmFyZyAtIGNhbGxiYWNrIGFyZ3VtZW50CisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmxhc2hfcmVhZF9zZW5kKHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfZmxhc2hfcyAqZmxhc2ggPSBjYmFyZzsKKwlzdHJ1Y3QgYmZpX2ZsYXNoX3JlYWRfcmVxX3MgKm1zZyA9CisJCQkoc3RydWN0IGJmaV9mbGFzaF9yZWFkX3JlcV9zICopIGZsYXNoLT5tYi5tc2c7CisJdTMyCWxlbjsKKworCW1zZy0+dHlwZSA9IGJlMzJfdG9fY3B1KGZsYXNoLT50eXBlKTsKKwltc2ctPmluc3RhbmNlID0gZmxhc2gtPmluc3RhbmNlOworCW1zZy0+b2Zmc2V0ID0gYmUzMl90b19jcHUoZmxhc2gtPmFkZHJfb2ZmICsgZmxhc2gtPm9mZnNldCk7CisJbGVuID0gKGZsYXNoLT5yZXNpZHVlIDwgQkZBX0ZMQVNIX0RNQV9CVUZfU1opID8KKwkJCWZsYXNoLT5yZXNpZHVlIDogQkZBX0ZMQVNIX0RNQV9CVUZfU1o7CisJbXNnLT5sZW5ndGggPSBiZTMyX3RvX2NwdShsZW4pOworCWJmaV9oMmlfc2V0KG1zZy0+bWgsIEJGSV9NQ19GTEFTSCwgQkZJX0ZMQVNIX0gySV9SRUFEX1JFUSwKKwkJYmZhX2lvY19wb3J0aWQoZmxhc2gtPmlvYykpOworCWJmYV9hbGVuX3NldCgmbXNnLT5hbGVuLCBsZW4sIGZsYXNoLT5kYnVmX3BhKTsKKwliZmFfaW9jX21ib3hfcXVldWUoZmxhc2gtPmlvYywgJmZsYXNoLT5tYik7Cit9CisKKy8qCisgKiBTZW5kIGZsYXNoIGVyYXNlIHJlcXVlc3QuCisgKgorICogQHBhcmFtW2luXSBjYmFyZyAtIGNhbGxiYWNrIGFyZ3VtZW50CisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmxhc2hfZXJhc2Vfc2VuZCh2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX2ZsYXNoX3MgKmZsYXNoID0gY2Jhcmc7CisJc3RydWN0IGJmaV9mbGFzaF9lcmFzZV9yZXFfcyAqbXNnID0KKwkJCShzdHJ1Y3QgYmZpX2ZsYXNoX2VyYXNlX3JlcV9zICopIGZsYXNoLT5tYi5tc2c7CisKKwltc2ctPnR5cGUgPSBiZTMyX3RvX2NwdShmbGFzaC0+dHlwZSk7CisJbXNnLT5pbnN0YW5jZSA9IGZsYXNoLT5pbnN0YW5jZTsKKwliZmlfaDJpX3NldChtc2ctPm1oLCBCRklfTUNfRkxBU0gsIEJGSV9GTEFTSF9IMklfRVJBU0VfUkVRLAorCQkJYmZhX2lvY19wb3J0aWQoZmxhc2gtPmlvYykpOworCWJmYV9pb2NfbWJveF9xdWV1ZShmbGFzaC0+aW9jLCAmZmxhc2gtPm1iKTsKK30KKworLyoKKyAqIFByb2Nlc3MgZmxhc2ggcmVzcG9uc2UgbWVzc2FnZXMgdXBvbiByZWNlaXZpbmcgaW50ZXJydXB0cy4KKyAqCisgKiBAcGFyYW1baW5dIGZsYXNoYXJnIC0gZmxhc2ggc3RydWN0dXJlCisgKiBAcGFyYW1baW5dIG1zZyAtIG1lc3NhZ2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmxhc2hfaW50cih2b2lkICpmbGFzaGFyZywgc3RydWN0IGJmaV9tYm1zZ19zICptc2cpCit7CisJc3RydWN0IGJmYV9mbGFzaF9zICpmbGFzaCA9IGZsYXNoYXJnOworCXUzMglzdGF0dXM7CisKKwl1bmlvbiB7CisJCXN0cnVjdCBiZmlfZmxhc2hfcXVlcnlfcnNwX3MgKnF1ZXJ5OworCQlzdHJ1Y3QgYmZpX2ZsYXNoX2VyYXNlX3JzcF9zICplcmFzZTsKKwkJc3RydWN0IGJmaV9mbGFzaF93cml0ZV9yc3BfcyAqd3JpdGU7CisJCXN0cnVjdCBiZmlfZmxhc2hfcmVhZF9yc3BfcyAqcmVhZDsKKwkJc3RydWN0IGJmaV9tYm1zZ19zICAgKm1zZzsKKwl9IG07CisKKwltLm1zZyA9IG1zZzsKKwliZmFfdHJjKGZsYXNoLCBtc2ctPm1oLm1zZ19pZCk7CisKKwlpZiAoIWZsYXNoLT5vcF9idXN5ICYmIG1zZy0+bWgubXNnX2lkICE9IEJGSV9GTEFTSF9JMkhfRVZFTlQpIHsKKwkJLyogcmVjZWl2aW5nIHJlc3BvbnNlIGFmdGVyIGlvYyBmYWlsdXJlICovCisJCWJmYV90cmMoZmxhc2gsIDB4OTk5OSk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKG1zZy0+bWgubXNnX2lkKSB7CisJY2FzZSBCRklfRkxBU0hfSTJIX1FVRVJZX1JTUDoKKwkJc3RhdHVzID0gYmUzMl90b19jcHUobS5xdWVyeS0+c3RhdHVzKTsKKwkJYmZhX3RyYyhmbGFzaCwgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyA9PSBCRkFfU1RBVFVTX09LKSB7CisJCQl1MzIJaTsKKwkJCXN0cnVjdCBiZmFfZmxhc2hfYXR0cl9zICphdHRyLCAqZjsKKworCQkJYXR0ciA9IChzdHJ1Y3QgYmZhX2ZsYXNoX2F0dHJfcyAqKSBmbGFzaC0+dWJ1ZjsKKwkJCWYgPSAoc3RydWN0IGJmYV9mbGFzaF9hdHRyX3MgKikgZmxhc2gtPmRidWZfa3ZhOworCQkJYXR0ci0+c3RhdHVzID0gYmUzMl90b19jcHUoZi0+c3RhdHVzKTsKKwkJCWF0dHItPm5wYXJ0ID0gYmUzMl90b19jcHUoZi0+bnBhcnQpOworCQkJYmZhX3RyYyhmbGFzaCwgYXR0ci0+c3RhdHVzKTsKKwkJCWJmYV90cmMoZmxhc2gsIGF0dHItPm5wYXJ0KTsKKwkJCWZvciAoaSA9IDA7IGkgPCBhdHRyLT5ucGFydDsgaSsrKSB7CisJCQkJYXR0ci0+cGFydFtpXS5wYXJ0X3R5cGUgPQorCQkJCQliZTMyX3RvX2NwdShmLT5wYXJ0W2ldLnBhcnRfdHlwZSk7CisJCQkJYXR0ci0+cGFydFtpXS5wYXJ0X2luc3RhbmNlID0KKwkJCQkJYmUzMl90b19jcHUoZi0+cGFydFtpXS5wYXJ0X2luc3RhbmNlKTsKKwkJCQlhdHRyLT5wYXJ0W2ldLnBhcnRfb2ZmID0KKwkJCQkJYmUzMl90b19jcHUoZi0+cGFydFtpXS5wYXJ0X29mZik7CisJCQkJYXR0ci0+cGFydFtpXS5wYXJ0X3NpemUgPQorCQkJCQliZTMyX3RvX2NwdShmLT5wYXJ0W2ldLnBhcnRfc2l6ZSk7CisJCQkJYXR0ci0+cGFydFtpXS5wYXJ0X2xlbiA9CisJCQkJCWJlMzJfdG9fY3B1KGYtPnBhcnRbaV0ucGFydF9sZW4pOworCQkJCWF0dHItPnBhcnRbaV0ucGFydF9zdGF0dXMgPQorCQkJCQliZTMyX3RvX2NwdShmLT5wYXJ0W2ldLnBhcnRfc3RhdHVzKTsKKwkJCX0KKwkJfQorCQlmbGFzaC0+c3RhdHVzID0gc3RhdHVzOworCQliZmFfZmxhc2hfY2IoZmxhc2gpOworCQlicmVhazsKKwljYXNlIEJGSV9GTEFTSF9JMkhfRVJBU0VfUlNQOgorCQlzdGF0dXMgPSBiZTMyX3RvX2NwdShtLmVyYXNlLT5zdGF0dXMpOworCQliZmFfdHJjKGZsYXNoLCBzdGF0dXMpOworCQlmbGFzaC0+c3RhdHVzID0gc3RhdHVzOworCQliZmFfZmxhc2hfY2IoZmxhc2gpOworCQlicmVhazsKKwljYXNlIEJGSV9GTEFTSF9JMkhfV1JJVEVfUlNQOgorCQlzdGF0dXMgPSBiZTMyX3RvX2NwdShtLndyaXRlLT5zdGF0dXMpOworCQliZmFfdHJjKGZsYXNoLCBzdGF0dXMpOworCQlpZiAoc3RhdHVzICE9IEJGQV9TVEFUVVNfT0sgfHwgZmxhc2gtPnJlc2lkdWUgPT0gMCkgeworCQkJZmxhc2gtPnN0YXR1cyA9IHN0YXR1czsKKwkJCWJmYV9mbGFzaF9jYihmbGFzaCk7CisJCX0gZWxzZSB7CisJCQliZmFfdHJjKGZsYXNoLCBmbGFzaC0+b2Zmc2V0KTsKKwkJCWJmYV9mbGFzaF93cml0ZV9zZW5kKGZsYXNoKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJGSV9GTEFTSF9JMkhfUkVBRF9SU1A6CisJCXN0YXR1cyA9IGJlMzJfdG9fY3B1KG0ucmVhZC0+c3RhdHVzKTsKKwkJYmZhX3RyYyhmbGFzaCwgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCQlmbGFzaC0+c3RhdHVzID0gc3RhdHVzOworCQkJYmZhX2ZsYXNoX2NiKGZsYXNoKTsKKwkJfSBlbHNlIHsKKwkJCXUzMiBsZW4gPSBiZTMyX3RvX2NwdShtLnJlYWQtPmxlbmd0aCk7CisJCQliZmFfdHJjKGZsYXNoLCBmbGFzaC0+b2Zmc2V0KTsKKwkJCWJmYV90cmMoZmxhc2gsIGxlbik7CisJCQltZW1jcHkoZmxhc2gtPnVidWYgKyBmbGFzaC0+b2Zmc2V0LAorCQkJCWZsYXNoLT5kYnVmX2t2YSwgbGVuKTsKKwkJCWZsYXNoLT5yZXNpZHVlIC09IGxlbjsKKwkJCWZsYXNoLT5vZmZzZXQgKz0gbGVuOworCQkJaWYgKGZsYXNoLT5yZXNpZHVlID09IDApIHsKKwkJCQlmbGFzaC0+c3RhdHVzID0gc3RhdHVzOworCQkJCWJmYV9mbGFzaF9jYihmbGFzaCk7CisJCQl9IGVsc2UKKwkJCQliZmFfZmxhc2hfcmVhZF9zZW5kKGZsYXNoKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJGSV9GTEFTSF9JMkhfQk9PVF9WRVJfUlNQOgorCWNhc2UgQkZJX0ZMQVNIX0kySF9FVkVOVDoKKwkJYmZhX3RyYyhmbGFzaCwgbXNnLT5taC5tc2dfaWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJfQorfQorCisvKgorICogRmxhc2ggbWVtb3J5IGluZm8gQVBJLgorICoKKyAqIEBwYXJhbVtpbl0gbWluY2ZnIC0gbWluaW1hbCBjZmcgdmFyaWFibGUKKyAqLwordTMyCitiZmFfZmxhc2hfbWVtaW5mbyhiZmFfYm9vbGVhbl90IG1pbmNmZykKK3sKKwkvKiBtaW4gZHJpdmVyIGRvZXNuJ3QgbmVlZCBmbGFzaCAqLworCWlmIChtaW5jZmcpCisJCXJldHVybiAwOworCXJldHVybiBCRkFfUk9VTkRVUChCRkFfRkxBU0hfRE1BX0JVRl9TWiwgQkZBX0RNQV9BTElHTl9TWik7Cit9CisKKy8qCisgKiBGbGFzaCBhdHRhY2ggQVBJLgorICoKKyAqIEBwYXJhbVtpbl0gZmxhc2ggLSBmbGFzaCBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gaW9jICAtIGlvYyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gZGV2ICAtIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gdHJjbW9kIC0gdHJhY2UgbW9kdWxlCisgKiBAcGFyYW1baW5dIGxvZ21vZCAtIGxvZyBtb2R1bGUKKyAqLwordm9pZAorYmZhX2ZsYXNoX2F0dGFjaChzdHJ1Y3QgYmZhX2ZsYXNoX3MgKmZsYXNoLCBzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHZvaWQgKmRldiwKKwkJc3RydWN0IGJmYV90cmNfbW9kX3MgKnRyY21vZCwgYmZhX2Jvb2xlYW5fdCBtaW5jZmcpCit7CisJZmxhc2gtPmlvYyA9IGlvYzsKKwlmbGFzaC0+dHJjbW9kID0gdHJjbW9kOworCWZsYXNoLT5jYmZuID0gTlVMTDsKKwlmbGFzaC0+Y2JhcmcgPSBOVUxMOworCWZsYXNoLT5vcF9idXN5ID0gMDsKKworCWJmYV9pb2NfbWJveF9yZWdpc3IoZmxhc2gtPmlvYywgQkZJX01DX0ZMQVNILCBiZmFfZmxhc2hfaW50ciwgZmxhc2gpOworCWJmYV9xX3FlX2luaXQoJmZsYXNoLT5pb2Nfbm90aWZ5KTsKKwliZmFfaW9jX25vdGlmeV9pbml0KCZmbGFzaC0+aW9jX25vdGlmeSwgYmZhX2ZsYXNoX25vdGlmeSwgZmxhc2gpOworCWxpc3RfYWRkX3RhaWwoJmZsYXNoLT5pb2Nfbm90aWZ5LnFlLCAmZmxhc2gtPmlvYy0+bm90aWZ5X3EpOworCisJLyogbWluIGRyaXZlciBkb2Vzbid0IG5lZWQgZmxhc2ggKi8KKwlpZiAobWluY2ZnKSB7CisJCWZsYXNoLT5kYnVmX2t2YSA9IE5VTEw7CisJCWZsYXNoLT5kYnVmX3BhID0gMDsKKwl9Cit9CisKKy8qCisgKiBDbGFpbSBtZW1vcnkgZm9yIGZsYXNoCisgKgorICogQHBhcmFtW2luXSBmbGFzaCAtIGZsYXNoIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSBkbV9rdmEgLSBwb2ludGVyIHRvIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MKKyAqIEBwYXJhbVtpbl0gZG1fcGEgLSBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcworICogQHBhcmFtW2luXSBtaW5jZmcgLSBtaW5pbWFsIGNmZyB2YXJpYWJsZQorICovCit2b2lkCitiZmFfZmxhc2hfbWVtY2xhaW0oc3RydWN0IGJmYV9mbGFzaF9zICpmbGFzaCwgdTggKmRtX2t2YSwgdTY0IGRtX3BhLAorCQliZmFfYm9vbGVhbl90IG1pbmNmZykKK3sKKwlpZiAobWluY2ZnKQorCQlyZXR1cm47CisKKwlmbGFzaC0+ZGJ1Zl9rdmEgPSBkbV9rdmE7CisJZmxhc2gtPmRidWZfcGEgPSBkbV9wYTsKKwltZW1zZXQoZmxhc2gtPmRidWZfa3ZhLCAwLCBCRkFfRkxBU0hfRE1BX0JVRl9TWik7CisJZG1fa3ZhICs9IEJGQV9ST1VORFVQKEJGQV9GTEFTSF9ETUFfQlVGX1NaLCBCRkFfRE1BX0FMSUdOX1NaKTsKKwlkbV9wYSArPSBCRkFfUk9VTkRVUChCRkFfRkxBU0hfRE1BX0JVRl9TWiwgQkZBX0RNQV9BTElHTl9TWik7Cit9CisKKy8qCisgKiBHZXQgZmxhc2ggYXR0cmlidXRlLgorICoKKyAqIEBwYXJhbVtpbl0gZmxhc2ggLSBmbGFzaCBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gYXR0ciAtIGZsYXNoIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gY2JmbiAtIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcGFyYW1baW5dIGNiYXJnIC0gY2FsbGJhY2sgYXJndW1lbnQKKyAqCisgKiBSZXR1cm4gc3RhdHVzLgorICovCitiZmFfc3RhdHVzX3QKK2JmYV9mbGFzaF9nZXRfYXR0cihzdHJ1Y3QgYmZhX2ZsYXNoX3MgKmZsYXNoLCBzdHJ1Y3QgYmZhX2ZsYXNoX2F0dHJfcyAqYXR0ciwKKwkJYmZhX2NiX2ZsYXNoX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJYmZhX3RyYyhmbGFzaCwgQkZJX0ZMQVNIX0gySV9RVUVSWV9SRVEpOworCisJaWYgKCFiZmFfaW9jX2lzX29wZXJhdGlvbmFsKGZsYXNoLT5pb2MpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfTk9OX09QOworCisJaWYgKGZsYXNoLT5vcF9idXN5KSB7CisJCWJmYV90cmMoZmxhc2gsIGZsYXNoLT5vcF9idXN5KTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisKKwlmbGFzaC0+b3BfYnVzeSA9IDE7CisJZmxhc2gtPmNiZm4gPSBjYmZuOworCWZsYXNoLT5jYmFyZyA9IGNiYXJnOworCWZsYXNoLT51YnVmID0gKHU4ICopIGF0dHI7CisJYmZhX2ZsYXNoX3F1ZXJ5X3NlbmQoZmxhc2gpOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qCisgKiBFcmFzZSBmbGFzaCBwYXJ0aXRpb24uCisgKgorICogQHBhcmFtW2luXSBmbGFzaCAtIGZsYXNoIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSB0eXBlIC0gZmxhc2ggcGFydGl0aW9uIHR5cGUKKyAqIEBwYXJhbVtpbl0gaW5zdGFuY2UgLSBmbGFzaCBwYXJ0aXRpb24gaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gY2JmbiAtIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcGFyYW1baW5dIGNiYXJnIC0gY2FsbGJhY2sgYXJndW1lbnQKKyAqCisgKiBSZXR1cm4gc3RhdHVzLgorICovCitiZmFfc3RhdHVzX3QKK2JmYV9mbGFzaF9lcmFzZV9wYXJ0KHN0cnVjdCBiZmFfZmxhc2hfcyAqZmxhc2gsIGVudW0gYmZhX2ZsYXNoX3BhcnRfdHlwZSB0eXBlLAorCQl1OCBpbnN0YW5jZSwgYmZhX2NiX2ZsYXNoX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJYmZhX3RyYyhmbGFzaCwgQkZJX0ZMQVNIX0gySV9FUkFTRV9SRVEpOworCWJmYV90cmMoZmxhc2gsIHR5cGUpOworCWJmYV90cmMoZmxhc2gsIGluc3RhbmNlKTsKKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChmbGFzaC0+aW9jKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKworCWlmIChmbGFzaC0+b3BfYnVzeSkgeworCQliZmFfdHJjKGZsYXNoLCBmbGFzaC0+b3BfYnVzeSk7CisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfQorCisJZmxhc2gtPm9wX2J1c3kgPSAxOworCWZsYXNoLT5jYmZuID0gY2JmbjsKKwlmbGFzaC0+Y2JhcmcgPSBjYmFyZzsKKwlmbGFzaC0+dHlwZSA9IHR5cGU7CisJZmxhc2gtPmluc3RhbmNlID0gaW5zdGFuY2U7CisKKwliZmFfZmxhc2hfZXJhc2Vfc2VuZChmbGFzaCk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qCisgKiBVcGRhdGUgZmxhc2ggcGFydGl0aW9uLgorICoKKyAqIEBwYXJhbVtpbl0gZmxhc2ggLSBmbGFzaCBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gdHlwZSAtIGZsYXNoIHBhcnRpdGlvbiB0eXBlCisgKiBAcGFyYW1baW5dIGluc3RhbmNlIC0gZmxhc2ggcGFydGl0aW9uIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGJ1ZiAtIHVwZGF0ZSBkYXRhIGJ1ZmZlcgorICogQHBhcmFtW2luXSBsZW4gLSBkYXRhIGJ1ZmZlciBsZW5ndGgKKyAqIEBwYXJhbVtpbl0gb2Zmc2V0IC0gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBwYXJ0aXRpb24gc3RhcnRpbmcgYWRkcmVzcworICogQHBhcmFtW2luXSBjYmZuIC0gY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBwYXJhbVtpbl0gY2JhcmcgLSBjYWxsYmFjayBhcmd1bWVudAorICoKKyAqIFJldHVybiBzdGF0dXMuCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2ZsYXNoX3VwZGF0ZV9wYXJ0KHN0cnVjdCBiZmFfZmxhc2hfcyAqZmxhc2gsIGVudW0gYmZhX2ZsYXNoX3BhcnRfdHlwZSB0eXBlLAorCQl1OCBpbnN0YW5jZSwgdm9pZCAqYnVmLCB1MzIgbGVuLCB1MzIgb2Zmc2V0LAorCQliZmFfY2JfZmxhc2hfdCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwliZmFfdHJjKGZsYXNoLCBCRklfRkxBU0hfSDJJX1dSSVRFX1JFUSk7CisJYmZhX3RyYyhmbGFzaCwgdHlwZSk7CisJYmZhX3RyYyhmbGFzaCwgaW5zdGFuY2UpOworCWJmYV90cmMoZmxhc2gsIGxlbik7CisJYmZhX3RyYyhmbGFzaCwgb2Zmc2V0KTsKKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChmbGFzaC0+aW9jKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKworCS8qCisJICogJ2xlbicgbXVzdCBiZSBpbiB3b3JkICg0LWJ5dGUpIGJvdW5kYXJ5CisJICogJ29mZnNldCcgbXVzdCBiZSBpbiBzZWN0b3IgKDE2a2IpIGJvdW5kYXJ5CisJICovCisJaWYgKCFsZW4gfHwgKGxlbiAmIDB4MDMpIHx8IChvZmZzZXQgJiAweDAwMDAzRkZGKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkxBU0hfQkFEX0xFTjsKKworCWlmICh0eXBlID09IEJGQV9GTEFTSF9QQVJUX01GRykKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRUlOVkFMOworCisJaWYgKGZsYXNoLT5vcF9idXN5KSB7CisJCWJmYV90cmMoZmxhc2gsIGZsYXNoLT5vcF9idXN5KTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisKKwlmbGFzaC0+b3BfYnVzeSA9IDE7CisJZmxhc2gtPmNiZm4gPSBjYmZuOworCWZsYXNoLT5jYmFyZyA9IGNiYXJnOworCWZsYXNoLT50eXBlID0gdHlwZTsKKwlmbGFzaC0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKKwlmbGFzaC0+cmVzaWR1ZSA9IGxlbjsKKwlmbGFzaC0+b2Zmc2V0ID0gMDsKKwlmbGFzaC0+YWRkcl9vZmYgPSBvZmZzZXQ7CisJZmxhc2gtPnVidWYgPSBidWY7CisKKwliZmFfZmxhc2hfd3JpdGVfc2VuZChmbGFzaCk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qCisgKiBSZWFkIGZsYXNoIHBhcnRpdGlvbi4KKyAqCisgKiBAcGFyYW1baW5dIGZsYXNoIC0gZmxhc2ggc3RydWN0dXJlCisgKiBAcGFyYW1baW5dIHR5cGUgLSBmbGFzaCBwYXJ0aXRpb24gdHlwZQorICogQHBhcmFtW2luXSBpbnN0YW5jZSAtIGZsYXNoIHBhcnRpdGlvbiBpbnN0YW5jZQorICogQHBhcmFtW2luXSBidWYgLSByZWFkIGRhdGEgYnVmZmVyCisgKiBAcGFyYW1baW5dIGxlbiAtIGRhdGEgYnVmZmVyIGxlbmd0aAorICogQHBhcmFtW2luXSBvZmZzZXQgLSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHBhcnRpdGlvbiBzdGFydGluZyBhZGRyZXNzCisgKiBAcGFyYW1baW5dIGNiZm4gLSBjYWxsYmFjayBmdW5jdGlvbgorICogQHBhcmFtW2luXSBjYmFyZyAtIGNhbGxiYWNrIGFyZ3VtZW50CisgKgorICogUmV0dXJuIHN0YXR1cy4KKyAqLworYmZhX3N0YXR1c190CitiZmFfZmxhc2hfcmVhZF9wYXJ0KHN0cnVjdCBiZmFfZmxhc2hfcyAqZmxhc2gsIGVudW0gYmZhX2ZsYXNoX3BhcnRfdHlwZSB0eXBlLAorCQl1OCBpbnN0YW5jZSwgdm9pZCAqYnVmLCB1MzIgbGVuLCB1MzIgb2Zmc2V0LAorCQliZmFfY2JfZmxhc2hfdCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwliZmFfdHJjKGZsYXNoLCBCRklfRkxBU0hfSDJJX1JFQURfUkVRKTsKKwliZmFfdHJjKGZsYXNoLCB0eXBlKTsKKwliZmFfdHJjKGZsYXNoLCBpbnN0YW5jZSk7CisJYmZhX3RyYyhmbGFzaCwgbGVuKTsKKwliZmFfdHJjKGZsYXNoLCBvZmZzZXQpOworCisJaWYgKCFiZmFfaW9jX2lzX29wZXJhdGlvbmFsKGZsYXNoLT5pb2MpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfTk9OX09QOworCisJLyoKKwkgKiAnbGVuJyBtdXN0IGJlIGluIHdvcmQgKDQtYnl0ZSkgYm91bmRhcnkKKwkgKiAnb2Zmc2V0JyBtdXN0IGJlIGluIHNlY3RvciAoMTZrYikgYm91bmRhcnkKKwkgKi8KKwlpZiAoIWxlbiB8fCAobGVuICYgMHgwMykgfHwgKG9mZnNldCAmIDB4MDAwMDNGRkYpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19GTEFTSF9CQURfTEVOOworCisJaWYgKGZsYXNoLT5vcF9idXN5KSB7CisJCWJmYV90cmMoZmxhc2gsIGZsYXNoLT5vcF9idXN5KTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisKKwlmbGFzaC0+b3BfYnVzeSA9IDE7CisJZmxhc2gtPmNiZm4gPSBjYmZuOworCWZsYXNoLT5jYmFyZyA9IGNiYXJnOworCWZsYXNoLT50eXBlID0gdHlwZTsKKwlmbGFzaC0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKKwlmbGFzaC0+cmVzaWR1ZSA9IGxlbjsKKwlmbGFzaC0+b2Zmc2V0ID0gMDsKKwlmbGFzaC0+YWRkcl9vZmYgPSBvZmZzZXQ7CisJZmxhc2gtPnVidWYgPSBidWY7CisJYmZhX2ZsYXNoX3JlYWRfc2VuZChmbGFzaCk7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoKKyAqCURJQUcgbW9kdWxlIHNwZWNpZmljCisgKi8KKworI2RlZmluZSBCRkFfRElBR19NRU1URVNUX1RPVgk1MDAwMAkvKiBtZW10ZXN0IHRpbWVvdXQgaW4gbXNlYyAqLworI2RlZmluZSBCRkFfRElBR19GV1BJTkdfVE9WCTEwMDAJLyogbXNlYyAqLworCisvKiBJT0MgZXZlbnQgaGFuZGxlciAqLworc3RhdGljIHZvaWQKK2JmYV9kaWFnX25vdGlmeSh2b2lkICpkaWFnX2FyZywgZW51bSBiZmFfaW9jX2V2ZW50X2UgZXZlbnQpCit7CisJc3RydWN0IGJmYV9kaWFnX3MgKmRpYWcgPSBkaWFnX2FyZzsKKworCWJmYV90cmMoZGlhZywgZXZlbnQpOworCWJmYV90cmMoZGlhZywgZGlhZy0+YmxvY2spOworCWJmYV90cmMoZGlhZywgZGlhZy0+ZndwaW5nLmxvY2spOworCWJmYV90cmMoZGlhZywgZGlhZy0+dHNlbnNvci5sb2NrKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JT0NfRV9ESVNBQkxFRDoKKwljYXNlIEJGQV9JT0NfRV9GQUlMRUQ6CisJCWlmIChkaWFnLT5md3BpbmcubG9jaykgeworCQkJZGlhZy0+ZndwaW5nLnN0YXR1cyA9IEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkU7CisJCQlkaWFnLT5md3BpbmcuY2JmbihkaWFnLT5md3BpbmcuY2JhcmcsCisJCQkJCWRpYWctPmZ3cGluZy5zdGF0dXMpOworCQkJZGlhZy0+ZndwaW5nLmxvY2sgPSAwOworCQl9CisKKwkJaWYgKGRpYWctPnRzZW5zb3IubG9jaykgeworCQkJZGlhZy0+dHNlbnNvci5zdGF0dXMgPSBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCQkJZGlhZy0+dHNlbnNvci5jYmZuKGRpYWctPnRzZW5zb3IuY2JhcmcsCisJCQkJCSAgIGRpYWctPnRzZW5zb3Iuc3RhdHVzKTsKKwkJCWRpYWctPnRzZW5zb3IubG9jayA9IDA7CisJCX0KKworCQlpZiAoZGlhZy0+YmxvY2spIHsKKwkJCWlmIChkaWFnLT50aW1lcl9hY3RpdmUpIHsKKwkJCQliZmFfdGltZXJfc3RvcCgmZGlhZy0+dGltZXIpOworCQkJCWRpYWctPnRpbWVyX2FjdGl2ZSA9IDA7CisJCQl9CisKKwkJCWRpYWctPnN0YXR1cyA9IEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkU7CisJCQlkaWFnLT5jYmZuKGRpYWctPmNiYXJnLCBkaWFnLT5zdGF0dXMpOworCQkJZGlhZy0+YmxvY2sgPSAwOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2RpYWdfbWVtdGVzdF9kb25lKHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfZGlhZ19zICpkaWFnID0gY2Jhcmc7CisJc3RydWN0IGJmYV9pb2NfcyAgKmlvYyA9IGRpYWctPmlvYzsKKwlzdHJ1Y3QgYmZhX2RpYWdfbWVtdGVzdF9yZXN1bHQgKnJlcyA9IGRpYWctPnJlc3VsdDsKKwl1MzIJbG9mZiA9IEJGSV9CT09UX01FTVRFU1RfUkVTX0FERFI7CisJdTMyCXBnbnVtLCBwZ29mZiwgaTsKKworCXBnbnVtID0gUFNTX1NNRU1fUEdOVU0oaW9jLT5pb2NfcmVncy5zbWVtX3BnMCwgbG9mZik7CisJcGdvZmYgPSBQU1NfU01FTV9QR09GRihsb2ZmKTsKKworCXdyaXRlbChwZ251bSwgaW9jLT5pb2NfcmVncy5ob3N0X3BhZ2VfbnVtX2ZuKTsKKworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHN0cnVjdCBiZmFfZGlhZ19tZW10ZXN0X3Jlc3VsdCkgLworCQkJIHNpemVvZih1MzIpKTsgaSsrKSB7CisJCS8qIHJlYWQgdGVzdCByZXN1bHQgZnJvbSBzbWVtICovCisJCSooKHUzMiAqKSByZXMgKyBpKSA9CisJCQliZmFfbWVtX3JlYWQoaW9jLT5pb2NfcmVncy5zbWVtX3BhZ2Vfc3RhcnQsIGxvZmYpOworCQlsb2ZmICs9IHNpemVvZih1MzIpOworCX0KKworCS8qIFJlc2V0IElPQyBmd3N0YXRlcyB0byBCRklfSU9DX1VOSU5JVCAqLworCWJmYV9pb2NfcmVzZXRfZndzdGF0ZShpb2MpOworCisJcmVzLT5zdGF0dXMgPSBzd2FiMzIocmVzLT5zdGF0dXMpOworCWJmYV90cmMoZGlhZywgcmVzLT5zdGF0dXMpOworCisJaWYgKHJlcy0+c3RhdHVzID09IEJGSV9CT09UX01FTVRFU1RfUkVTX1NJRykKKwkJZGlhZy0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwllbHNlIHsKKwkJZGlhZy0+c3RhdHVzID0gQkZBX1NUQVRVU19NRU1URVNUX0ZBSUxFRDsKKwkJcmVzLT5hZGRyID0gc3dhYjMyKHJlcy0+YWRkcik7CisJCXJlcy0+ZXhwID0gc3dhYjMyKHJlcy0+ZXhwKTsKKwkJcmVzLT5hY3QgPSBzd2FiMzIocmVzLT5hY3QpOworCQlyZXMtPmVycl9zdGF0dXMgPSBzd2FiMzIocmVzLT5lcnJfc3RhdHVzKTsKKwkJcmVzLT5lcnJfc3RhdHVzMSA9IHN3YWIzMihyZXMtPmVycl9zdGF0dXMxKTsKKwkJcmVzLT5lcnJfYWRkciA9IHN3YWIzMihyZXMtPmVycl9hZGRyKTsKKwkJYmZhX3RyYyhkaWFnLCByZXMtPmFkZHIpOworCQliZmFfdHJjKGRpYWcsIHJlcy0+ZXhwKTsKKwkJYmZhX3RyYyhkaWFnLCByZXMtPmFjdCk7CisJCWJmYV90cmMoZGlhZywgcmVzLT5lcnJfc3RhdHVzKTsKKwkJYmZhX3RyYyhkaWFnLCByZXMtPmVycl9zdGF0dXMxKTsKKwkJYmZhX3RyYyhkaWFnLCByZXMtPmVycl9hZGRyKTsKKwl9CisJZGlhZy0+dGltZXJfYWN0aXZlID0gMDsKKwlkaWFnLT5jYmZuKGRpYWctPmNiYXJnLCBkaWFnLT5zdGF0dXMpOworCWRpYWctPmJsb2NrID0gMDsKK30KKworLyoKKyAqIEZpcm13YXJlIHBpbmcKKyAqLworCisvKgorICogUGVyZm9ybSBETUEgdGVzdCBkaXJlY3RseQorICovCitzdGF0aWMgdm9pZAorZGlhZ19md3Bpbmdfc2VuZChzdHJ1Y3QgYmZhX2RpYWdfcyAqZGlhZykKK3sKKwlzdHJ1Y3QgYmZpX2RpYWdfZndwaW5nX3JlcV9zICpmd3BpbmdfcmVxOworCXUzMglpOworCisJYmZhX3RyYyhkaWFnLCBkaWFnLT5md3BpbmcuZGJ1Zl9wYSk7CisKKwkvKiBmaWxsIERNQSBhcmVhIHdpdGggcGF0dGVybiAqLworCWZvciAoaSA9IDA7IGkgPCAoQkZJX0RJQUdfRE1BX0JVRl9TWiA+PiAyKTsgaSsrKQorCQkqKCh1MzIgKilkaWFnLT5md3BpbmcuZGJ1Zl9rdmEgKyBpKSA9IGRpYWctPmZ3cGluZy5kYXRhOworCisJLyogRmlsbCBtYm94IG1zZyAqLworCWZ3cGluZ19yZXEgPSAoc3RydWN0IGJmaV9kaWFnX2Z3cGluZ19yZXFfcyAqKWRpYWctPmZ3cGluZy5tYmNtZC5tc2c7CisKKwkvKiBTZXR1cCBTRyBsaXN0ICovCisJYmZhX2FsZW5fc2V0KCZmd3BpbmdfcmVxLT5hbGVuLCBCRklfRElBR19ETUFfQlVGX1NaLAorCQkJZGlhZy0+ZndwaW5nLmRidWZfcGEpOworCS8qIFNldCB1cCBkbWEgY291bnQgKi8KKwlmd3BpbmdfcmVxLT5jb3VudCA9IGNwdV90b19iZTMyKGRpYWctPmZ3cGluZy5jb3VudCk7CisJLyogU2V0IHVwIGRhdGEgcGF0dGVybiAqLworCWZ3cGluZ19yZXEtPmRhdGEgPSBkaWFnLT5md3BpbmcuZGF0YTsKKworCS8qIGJ1aWxkIGhvc3QgY29tbWFuZCAqLworCWJmaV9oMmlfc2V0KGZ3cGluZ19yZXEtPm1oLCBCRklfTUNfRElBRywgQkZJX0RJQUdfSDJJX0ZXUElORywKKwkJYmZhX2lvY19wb3J0aWQoZGlhZy0+aW9jKSk7CisKKwkvKiBzZW5kIG1ib3ggY21kICovCisJYmZhX2lvY19tYm94X3F1ZXVlKGRpYWctPmlvYywgJmRpYWctPmZ3cGluZy5tYmNtZCk7Cit9CisKK3N0YXRpYyB2b2lkCitkaWFnX2Z3cGluZ19jb21wKHN0cnVjdCBiZmFfZGlhZ19zICpkaWFnLAorCQkgc3RydWN0IGJmaV9kaWFnX2Z3cGluZ19yc3BfcyAqZGlhZ19yc3ApCit7CisJdTMyCXJzcF9kYXRhID0gZGlhZ19yc3AtPmRhdGE7CisJdTgJcnNwX2RtYV9zdGF0dXMgPSBkaWFnX3JzcC0+ZG1hX3N0YXR1czsKKworCWJmYV90cmMoZGlhZywgcnNwX2RhdGEpOworCWJmYV90cmMoZGlhZywgcnNwX2RtYV9zdGF0dXMpOworCisJaWYgKHJzcF9kbWFfc3RhdHVzID09IEJGQV9TVEFUVVNfT0spIHsKKwkJdTMyCWksIHBhdDsKKwkJcGF0ID0gKGRpYWctPmZ3cGluZy5jb3VudCAmIDB4MSkgPyB+KGRpYWctPmZ3cGluZy5kYXRhKSA6CisJCQlkaWFnLT5md3BpbmcuZGF0YTsKKwkJLyogQ2hlY2sgbWJveCBkYXRhICovCisJCWlmIChkaWFnLT5md3BpbmcuZGF0YSAhPSByc3BfZGF0YSkgeworCQkJYmZhX3RyYyhkaWFnLCByc3BfZGF0YSk7CisJCQlkaWFnLT5md3BpbmcucmVzdWx0LT5kbWFzdGF0dXMgPQorCQkJCQlCRkFfU1RBVFVTX0RBVEFDT1JSVVBURUQ7CisJCQlkaWFnLT5md3Bpbmcuc3RhdHVzID0gQkZBX1NUQVRVU19EQVRBQ09SUlVQVEVEOworCQkJZGlhZy0+ZndwaW5nLmNiZm4oZGlhZy0+ZndwaW5nLmNiYXJnLAorCQkJCQlkaWFnLT5md3Bpbmcuc3RhdHVzKTsKKwkJCWRpYWctPmZ3cGluZy5sb2NrID0gMDsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBDaGVjayBkbWEgcGF0dGVybiAqLworCQlmb3IgKGkgPSAwOyBpIDwgKEJGSV9ESUFHX0RNQV9CVUZfU1ogPj4gMik7IGkrKykgeworCQkJaWYgKCooKHUzMiAqKWRpYWctPmZ3cGluZy5kYnVmX2t2YSArIGkpICE9IHBhdCkgeworCQkJCWJmYV90cmMoZGlhZywgaSk7CisJCQkJYmZhX3RyYyhkaWFnLCBwYXQpOworCQkJCWJmYV90cmMoZGlhZywKKwkJCQkJKigodTMyICopZGlhZy0+ZndwaW5nLmRidWZfa3ZhICsgaSkpOworCQkJCWRpYWctPmZ3cGluZy5yZXN1bHQtPmRtYXN0YXR1cyA9CisJCQkJCQlCRkFfU1RBVFVTX0RBVEFDT1JSVVBURUQ7CisJCQkJZGlhZy0+ZndwaW5nLnN0YXR1cyA9IEJGQV9TVEFUVVNfREFUQUNPUlJVUFRFRDsKKwkJCQlkaWFnLT5md3BpbmcuY2JmbihkaWFnLT5md3BpbmcuY2JhcmcsCisJCQkJCQlkaWFnLT5md3Bpbmcuc3RhdHVzKTsKKwkJCQlkaWFnLT5md3BpbmcubG9jayA9IDA7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWRpYWctPmZ3cGluZy5yZXN1bHQtPmRtYXN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJCWRpYWctPmZ3cGluZy5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCQlkaWFnLT5md3BpbmcuY2JmbihkaWFnLT5md3BpbmcuY2JhcmcsIGRpYWctPmZ3cGluZy5zdGF0dXMpOworCQlkaWFnLT5md3BpbmcubG9jayA9IDA7CisJfSBlbHNlIHsKKwkJZGlhZy0+ZndwaW5nLnN0YXR1cyA9IEJGQV9TVEFUVVNfSERNQV9GQUlMRUQ7CisJCWRpYWctPmZ3cGluZy5jYmZuKGRpYWctPmZ3cGluZy5jYmFyZywgZGlhZy0+ZndwaW5nLnN0YXR1cyk7CisJCWRpYWctPmZ3cGluZy5sb2NrID0gMDsKKwl9Cit9CisKKy8qCisgKiBUZW1wZXJhdHVyZSBTZW5zb3IKKyAqLworCitzdGF0aWMgdm9pZAorZGlhZ190ZW1wc2Vuc29yX3NlbmQoc3RydWN0IGJmYV9kaWFnX3MgKmRpYWcpCit7CisJc3RydWN0IGJmaV9kaWFnX3RzX3JlcV9zICptc2c7CisKKwltc2cgPSAoc3RydWN0IGJmaV9kaWFnX3RzX3JlcV9zICopZGlhZy0+dHNlbnNvci5tYmNtZC5tc2c7CisJYmZhX3RyYyhkaWFnLCBtc2ctPnRlbXApOworCS8qIGJ1aWxkIGhvc3QgY29tbWFuZCAqLworCWJmaV9oMmlfc2V0KG1zZy0+bWgsIEJGSV9NQ19ESUFHLCBCRklfRElBR19IMklfVEVNUFNFTlNPUiwKKwkJYmZhX2lvY19wb3J0aWQoZGlhZy0+aW9jKSk7CisJLyogc2VuZCBtYm94IGNtZCAqLworCWJmYV9pb2NfbWJveF9xdWV1ZShkaWFnLT5pb2MsICZkaWFnLT50c2Vuc29yLm1iY21kKTsKK30KKworc3RhdGljIHZvaWQKK2RpYWdfdGVtcHNlbnNvcl9jb21wKHN0cnVjdCBiZmFfZGlhZ19zICpkaWFnLCBiZmlfZGlhZ190c19yc3BfdCAqcnNwKQoreworCWlmICghZGlhZy0+dHNlbnNvci5sb2NrKSB7CisJCS8qIHJlY2VpdmluZyByZXNwb25zZSBhZnRlciBpb2MgZmFpbHVyZSAqLworCQliZmFfdHJjKGRpYWcsIGRpYWctPnRzZW5zb3IubG9jayk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEFTSUMganVuY3Rpb24gdGVtcHNlbnNvciBpcyBhIHJlZyByZWFkIG9wZXJhdGlvbgorCSAqIGl0IHdpbGwgYWx3YXlzIHJldHVybiBPSworCSAqLworCWRpYWctPnRzZW5zb3IudGVtcC0+dGVtcCA9IGJlMTZfdG9fY3B1KHJzcC0+dGVtcCk7CisJZGlhZy0+dHNlbnNvci50ZW1wLT50c19qdW5jID0gcnNwLT50c19qdW5jOworCWRpYWctPnRzZW5zb3IudGVtcC0+dHNfYnJkID0gcnNwLT50c19icmQ7CisJZGlhZy0+dHNlbnNvci50ZW1wLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCisJaWYgKHJzcC0+dHNfYnJkKSB7CisJCWlmIChyc3AtPnN0YXR1cyA9PSBCRkFfU1RBVFVTX09LKSB7CisJCQlkaWFnLT50c2Vuc29yLnRlbXAtPmJyZF90ZW1wID0KKwkJCQliZTE2X3RvX2NwdShyc3AtPmJyZF90ZW1wKTsKKwkJfSBlbHNlIHsKKwkJCWJmYV90cmMoZGlhZywgcnNwLT5zdGF0dXMpOworCQkJZGlhZy0+dHNlbnNvci50ZW1wLT5icmRfdGVtcCA9IDA7CisJCQlkaWFnLT50c2Vuc29yLnRlbXAtPnN0YXR1cyA9IEJGQV9TVEFUVVNfREVWQlVTWTsKKwkJfQorCX0KKwliZmFfdHJjKGRpYWcsIHJzcC0+dHNfanVuYyk7CisJYmZhX3RyYyhkaWFnLCByc3AtPnRlbXApOworCWJmYV90cmMoZGlhZywgcnNwLT50c19icmQpOworCWJmYV90cmMoZGlhZywgcnNwLT5icmRfdGVtcCk7CisJZGlhZy0+dHNlbnNvci5jYmZuKGRpYWctPnRzZW5zb3IuY2JhcmcsIGRpYWctPnRzZW5zb3Iuc3RhdHVzKTsKKwlkaWFnLT50c2Vuc29yLmxvY2sgPSAwOworfQorCisvKgorICoJTEVEIFRlc3QgY29tbWFuZAorICovCitzdGF0aWMgdm9pZAorZGlhZ19sZWR0ZXN0X3NlbmQoc3RydWN0IGJmYV9kaWFnX3MgKmRpYWcsIHN0cnVjdCBiZmFfZGlhZ19sZWR0ZXN0X3MgKmxlZHRlc3QpCit7CisJc3RydWN0IGJmaV9kaWFnX2xlZHRlc3RfcmVxX3MgICptc2c7CisKKwltc2cgPSAoc3RydWN0IGJmaV9kaWFnX2xlZHRlc3RfcmVxX3MgKilkaWFnLT5sZWR0ZXN0Lm1iY21kLm1zZzsKKwkvKiBidWlsZCBob3N0IGNvbW1hbmQgKi8KKwliZmlfaDJpX3NldChtc2ctPm1oLCBCRklfTUNfRElBRywgQkZJX0RJQUdfSDJJX0xFRFRFU1QsCisJCQliZmFfaW9jX3BvcnRpZChkaWFnLT5pb2MpKTsKKworCS8qCisJICogY29udmVydCB0aGUgZnJlcSBmcm9tIE4gYmxpbmtzIHBlciAxMCBzZWMgdG8KKwkgKiBjcm9zc2JvdyBvbnRpbWUgdmFsdWUuIFdlIGRvIGl0IGhlcmUgYmVjYXVzZSBkaXZpc2lvbiBpcyBuZWVkCisJICovCisJaWYgKGxlZHRlc3QtPmZyZXEpCisJCWxlZHRlc3QtPmZyZXEgPSA1MDAgLyBsZWR0ZXN0LT5mcmVxOworCisJaWYgKGxlZHRlc3QtPmZyZXEgPT0gMCkKKwkJbGVkdGVzdC0+ZnJlcSA9IDE7CisKKwliZmFfdHJjKGRpYWcsIGxlZHRlc3QtPmZyZXEpOworCS8qIG1jcHkoJmxlZHRlc3RfcmVxLT5yZXEsIGxlZHRlc3QsIHNpemVvZihiZmFfZGlhZ19sZWR0ZXN0X3QpKTsgKi8KKwltc2ctPmNtZCA9ICh1OCkgbGVkdGVzdC0+Y21kOworCW1zZy0+Y29sb3IgPSAodTgpIGxlZHRlc3QtPmNvbG9yOworCW1zZy0+cG9ydGlkID0gYmZhX2lvY19wb3J0aWQoZGlhZy0+aW9jKTsKKwltc2ctPmxlZCA9IGxlZHRlc3QtPmxlZDsKKwltc2ctPmZyZXEgPSBjcHVfdG9fYmUxNihsZWR0ZXN0LT5mcmVxKTsKKworCS8qIHNlbmQgbWJveCBjbWQgKi8KKwliZmFfaW9jX21ib3hfcXVldWUoZGlhZy0+aW9jLCAmZGlhZy0+bGVkdGVzdC5tYmNtZCk7Cit9CisKK3N0YXRpYyB2b2lkCitkaWFnX2xlZHRlc3RfY29tcChzdHJ1Y3QgYmZhX2RpYWdfcyAqZGlhZywgc3RydWN0IGJmaV9kaWFnX2xlZHRlc3RfcnNwX3MgKiBtc2cpCit7CisJYmZhX3RyYyhkaWFnLCBkaWFnLT5sZWR0ZXN0LmxvY2spOworCWRpYWctPmxlZHRlc3QubG9jayA9IEJGQV9GQUxTRTsKKwkvKiBubyBiZmFfY2JfcXVldWUgaXMgbmVlZGVkIGJlY2F1c2UgZHJpdmVyIGlzIG5vdCB3YWl0aW5nICovCit9CisKKy8qCisgKiBQb3J0IGJlYWNvbmluZworICovCitzdGF0aWMgdm9pZAorZGlhZ19wb3J0YmVhY29uX3NlbmQoc3RydWN0IGJmYV9kaWFnX3MgKmRpYWcsIGJmYV9ib29sZWFuX3QgYmVhY29uLCB1MzIgc2VjKQoreworCXN0cnVjdCBiZmlfZGlhZ19wb3J0YmVhY29uX3JlcV9zICptc2c7CisKKwltc2cgPSAoc3RydWN0IGJmaV9kaWFnX3BvcnRiZWFjb25fcmVxX3MgKilkaWFnLT5iZWFjb24ubWJjbWQubXNnOworCS8qIGJ1aWxkIGhvc3QgY29tbWFuZCAqLworCWJmaV9oMmlfc2V0KG1zZy0+bWgsIEJGSV9NQ19ESUFHLCBCRklfRElBR19IMklfUE9SVEJFQUNPTiwKKwkJYmZhX2lvY19wb3J0aWQoZGlhZy0+aW9jKSk7CisJbXNnLT5iZWFjb24gPSBiZWFjb247CisJbXNnLT5wZXJpb2QgPSBjcHVfdG9fYmUzMihzZWMpOworCS8qIHNlbmQgbWJveCBjbWQgKi8KKwliZmFfaW9jX21ib3hfcXVldWUoZGlhZy0+aW9jLCAmZGlhZy0+YmVhY29uLm1iY21kKTsKK30KKworc3RhdGljIHZvaWQKK2RpYWdfcG9ydGJlYWNvbl9jb21wKHN0cnVjdCBiZmFfZGlhZ19zICpkaWFnKQoreworCWJmYV90cmMoZGlhZywgZGlhZy0+YmVhY29uLnN0YXRlKTsKKwlkaWFnLT5iZWFjb24uc3RhdGUgPSBCRkFfRkFMU0U7CisJaWYgKGRpYWctPmNiZm5fYmVhY29uKQorCQlkaWFnLT5jYmZuX2JlYWNvbihkaWFnLT5kZXYsIEJGQV9GQUxTRSwgZGlhZy0+YmVhY29uLmxpbmtfZTJlKTsKK30KKworLyoKKyAqCURpYWcgaG1ib3ggaGFuZGxlcgorICovCit2b2lkCitiZmFfZGlhZ19pbnRyKHZvaWQgKmRpYWdhcmcsIHN0cnVjdCBiZmlfbWJtc2dfcyAqbXNnKQoreworCXN0cnVjdCBiZmFfZGlhZ19zICpkaWFnID0gZGlhZ2FyZzsKKworCXN3aXRjaCAobXNnLT5taC5tc2dfaWQpIHsKKwljYXNlIEJGSV9ESUFHX0kySF9QT1JUQkVBQ09OOgorCQlkaWFnX3BvcnRiZWFjb25fY29tcChkaWFnKTsKKwkJYnJlYWs7CisJY2FzZSBCRklfRElBR19JMkhfRldQSU5HOgorCQlkaWFnX2Z3cGluZ19jb21wKGRpYWcsIChzdHJ1Y3QgYmZpX2RpYWdfZndwaW5nX3JzcF9zICopIG1zZyk7CisJCWJyZWFrOworCWNhc2UgQkZJX0RJQUdfSTJIX1RFTVBTRU5TT1I6CisJCWRpYWdfdGVtcHNlbnNvcl9jb21wKGRpYWcsIChiZmlfZGlhZ190c19yc3BfdCAqKSBtc2cpOworCQlicmVhazsKKwljYXNlIEJGSV9ESUFHX0kySF9MRURURVNUOgorCQlkaWFnX2xlZHRlc3RfY29tcChkaWFnLCAoc3RydWN0IGJmaV9kaWFnX2xlZHRlc3RfcnNwX3MgKikgbXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmZhX3RyYyhkaWFnLCBtc2ctPm1oLm1zZ19pZCk7CisJCVdBUk5fT04oMSk7CisJfQorfQorCisvKgorICogR2VuIFJBTSBUZXN0CisgKgorICogICBAcGFyYW1baW5dICpkaWFnICAgICAgICAgICAtIGRpYWcgZGF0YSBzdHJ1Y3QKKyAqICAgQHBhcmFtW2luXSAqbWVtdGVzdCAgICAgICAgLSBtZW0gdGVzdCBwYXJhbXMgaW5wdXQgZnJvbSB1cHBlciBsYXllciwKKyAqICAgQHBhcmFtW2luXSBwYXR0ZXJuICAgICAgICAgLSBtZW0gdGVzdCBwYXR0ZXJuCisgKiAgIEBwYXJhbVtpbl0gKnJlc3VsdCAgICAgICAgIC0gbWVtIHRlc3QgcmVzdWx0CisgKiAgIEBwYXJhbVtpbl0gY2JmbiAgICAgICAgICAgIC0gbWVtIHRlc3QgY2FsbGJhY2sgZnVuY3Rpb2luCisgKiAgIEBwYXJhbVtpbl0gY2JhcmcgICAgICAgICAgIC0gY2FsbGJhY2sgZnVuY3Rpb2luIGFyZworICoKKyAqICAgQHBhcmFtW291dF0KKyAqLworYmZhX3N0YXR1c190CitiZmFfZGlhZ19tZW10ZXN0KHN0cnVjdCBiZmFfZGlhZ19zICpkaWFnLCBzdHJ1Y3QgYmZhX2RpYWdfbWVtdGVzdF9zICptZW10ZXN0LAorCQl1MzIgcGF0dGVybiwgc3RydWN0IGJmYV9kaWFnX21lbXRlc3RfcmVzdWx0ICpyZXN1bHQsCisJCWJmYV9jYl9kaWFnX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJYmZhX3RyYyhkaWFnLCBwYXR0ZXJuKTsKKworCWlmICghYmZhX2lvY19hZGFwdGVyX2lzX2Rpc2FibGVkKGRpYWctPmlvYykpCisJCXJldHVybiBCRkFfU1RBVFVTX0FEQVBURVJfRU5BQkxFRDsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIGRlc3RydWN0aXZlIGRpYWcgY21kIHJ1bm5pbmcgKi8KKwlpZiAoZGlhZy0+YmxvY2spIHsKKwkJYmZhX3RyYyhkaWFnLCBkaWFnLT5ibG9jayk7CisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfSBlbHNlCisJCWRpYWctPmJsb2NrID0gMTsKKworCWRpYWctPnJlc3VsdCA9IHJlc3VsdDsKKwlkaWFnLT5jYmZuID0gY2JmbjsKKwlkaWFnLT5jYmFyZyA9IGNiYXJnOworCisJLyogZG93bmxvYWQgbWVtdGVzdCBjb2RlIGFuZCB0YWtlIExQVTAgb3V0IG9mIHJlc2V0ICovCisJYmZhX2lvY19ib290KGRpYWctPmlvYywgQkZJX0ZXQk9PVF9UWVBFX01FTVRFU1QsIEJGSV9GV0JPT1RfRU5WX09TKTsKKworCWJmYV90aW1lcl9iZWdpbihkaWFnLT5pb2MtPnRpbWVyX21vZCwgJmRpYWctPnRpbWVyLAorCQkJYmZhX2RpYWdfbWVtdGVzdF9kb25lLCBkaWFnLCBCRkFfRElBR19NRU1URVNUX1RPVik7CisJZGlhZy0+dGltZXJfYWN0aXZlID0gMTsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoKKyAqIERJQUcgZmlybXdhcmUgcGluZyBjb21tYW5kCisgKgorICogICBAcGFyYW1baW5dICpkaWFnICAgICAgICAgICAtIGRpYWcgZGF0YSBzdHJ1Y3QKKyAqICAgQHBhcmFtW2luXSBjbnQgICAgICAgICAgICAgLSBkbWEgbG9vcCBjb3VudCBmb3IgdGVzdGluZyBQQ0lFCisgKiAgIEBwYXJhbVtpbl0gZGF0YSAgICAgICAgICAgIC0gZGF0YSBwYXR0ZXJuIHRvIHBhc3MgaW4gZncKKyAqICAgQHBhcmFtW2luXSAqcmVzdWx0ICAgICAgICAgLSBwdCB0byBiZmFfZGlhZ19md3BpbmdfcmVzdWx0X3QgZGF0YSBzdHJ1Y3QKKyAqICAgQHBhcmFtW2luXSBjYmZuICAgICAgICAgICAgLSBjYWxsYmFjayBmdW5jdGlvbgorICogICBAcGFyYW1baW5dICpjYmFyZyAgICAgICAgICAtIGNhbGxiYWNrIGZ1bmN0aW9pbiBhcmcKKyAqCisgKiAgIEBwYXJhbVtvdXRdCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2RpYWdfZndwaW5nKHN0cnVjdCBiZmFfZGlhZ19zICpkaWFnLCB1MzIgY250LCB1MzIgZGF0YSwKKwkJc3RydWN0IGJmYV9kaWFnX3Jlc3VsdHNfZndwaW5nICpyZXN1bHQsIGJmYV9jYl9kaWFnX3QgY2JmbiwKKwkJdm9pZCAqY2JhcmcpCit7CisJYmZhX3RyYyhkaWFnLCBjbnQpOworCWJmYV90cmMoZGlhZywgZGF0YSk7CisKKwlpZiAoIWJmYV9pb2NfaXNfb3BlcmF0aW9uYWwoZGlhZy0+aW9jKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKworCWlmIChiZmFfYXNpY19pZF9jdDIoYmZhX2lvY19kZXZpZCgoZGlhZy0+aW9jKSkpICYmCisJICAgICgoZGlhZy0+aW9jKS0+Y2xzY29kZSA9PSBCRklfUENJRk5fQ0xBU1NfRVRIKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfQ01EX05PVFNVUFA7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBkZXN0cnVjdGl2ZSBkaWFnIGNtZCBydW5uaW5nICovCisJaWYgKGRpYWctPmJsb2NrIHx8IGRpYWctPmZ3cGluZy5sb2NrKSB7CisJCWJmYV90cmMoZGlhZywgZGlhZy0+YmxvY2spOworCQliZmFfdHJjKGRpYWcsIGRpYWctPmZ3cGluZy5sb2NrKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisKKwkvKiBJbml0aWFsaXphdGlvbiAqLworCWRpYWctPmZ3cGluZy5sb2NrID0gMTsKKwlkaWFnLT5md3BpbmcuY2JmbiA9IGNiZm47CisJZGlhZy0+ZndwaW5nLmNiYXJnID0gY2Jhcmc7CisJZGlhZy0+ZndwaW5nLnJlc3VsdCA9IHJlc3VsdDsKKwlkaWFnLT5md3BpbmcuZGF0YSA9IGRhdGE7CisJZGlhZy0+ZndwaW5nLmNvdW50ID0gY250OworCisJLyogSW5pdCB0ZXN0IHJlc3VsdHMgKi8KKwlkaWFnLT5md3BpbmcucmVzdWx0LT5kYXRhID0gMDsKKwlkaWFnLT5md3BpbmcucmVzdWx0LT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCisJLyoga2ljayBvZmYgdGhlIGZpcnN0IHBpbmcgKi8KKwlkaWFnX2Z3cGluZ19zZW5kKGRpYWcpOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKgorICogUmVhZCBUZW1wZXJhdHVyZSBTZW5zb3IKKyAqCisgKiAgIEBwYXJhbVtpbl0gKmRpYWcgICAgICAgICAgIC0gZGlhZyBkYXRhIHN0cnVjdAorICogICBAcGFyYW1baW5dICpyZXN1bHQgICAgICAgICAtIHB0IHRvIGJmYV9kaWFnX3RlbXBfdCBkYXRhIHN0cnVjdAorICogICBAcGFyYW1baW5dIGNiZm4gICAgICAgICAgICAtIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiAgIEBwYXJhbVtpbl0gKmNiYXJnICAgICAgICAgIC0gY2FsbGJhY2sgZnVuY3Rpb2luIGFyZworICoKKyAqICAgQHBhcmFtW291dF0KKyAqLworYmZhX3N0YXR1c190CitiZmFfZGlhZ190c2Vuc29yX3F1ZXJ5KHN0cnVjdCBiZmFfZGlhZ19zICpkaWFnLAorCQlzdHJ1Y3QgYmZhX2RpYWdfcmVzdWx0c190ZW1wc2Vuc29yX3MgKnJlc3VsdCwKKwkJYmZhX2NiX2RpYWdfdCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBkZXN0cnVjdGl2ZSBkaWFnIGNtZCBydW5uaW5nICovCisJaWYgKGRpYWctPmJsb2NrIHx8IGRpYWctPnRzZW5zb3IubG9jaykgeworCQliZmFfdHJjKGRpYWcsIGRpYWctPmJsb2NrKTsKKwkJYmZhX3RyYyhkaWFnLCBkaWFnLT50c2Vuc29yLmxvY2spOworCQlyZXR1cm4gQkZBX1NUQVRVU19ERVZCVVNZOworCX0KKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChkaWFnLT5pb2MpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfTk9OX09QOworCisJLyogSW5pdCBkaWFnIG1vZCBwYXJhbXMgKi8KKwlkaWFnLT50c2Vuc29yLmxvY2sgPSAxOworCWRpYWctPnRzZW5zb3IudGVtcCA9IHJlc3VsdDsKKwlkaWFnLT50c2Vuc29yLmNiZm4gPSBjYmZuOworCWRpYWctPnRzZW5zb3IuY2JhcmcgPSBjYmFyZzsKKworCS8qIFNlbmQgbXNnIHRvIGZ3ICovCisJZGlhZ190ZW1wc2Vuc29yX3NlbmQoZGlhZyk7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoKKyAqIExFRCBUZXN0IGNvbW1hbmQKKyAqCisgKiAgIEBwYXJhbVtpbl0gKmRpYWcgICAgICAgICAgIC0gZGlhZyBkYXRhIHN0cnVjdAorICogICBAcGFyYW1baW5dICpsZWR0ZXN0ICAgICAgICAtIHB0IHRvIGxlZHRlc3QgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiAgIEBwYXJhbVtvdXRdCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2RpYWdfbGVkdGVzdChzdHJ1Y3QgYmZhX2RpYWdfcyAqZGlhZywgc3RydWN0IGJmYV9kaWFnX2xlZHRlc3RfcyAqbGVkdGVzdCkKK3sKKwliZmFfdHJjKGRpYWcsIGxlZHRlc3QtPmNtZCk7CisKKwlpZiAoIWJmYV9pb2NfaXNfb3BlcmF0aW9uYWwoZGlhZy0+aW9jKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKworCWlmIChkaWFnLT5iZWFjb24uc3RhdGUpCisJCXJldHVybiBCRkFfU1RBVFVTX0JFQUNPTl9PTjsKKworCWlmIChkaWFnLT5sZWR0ZXN0LmxvY2spCisJCXJldHVybiBCRkFfU1RBVFVTX0xFRFRFU1RfT1A7CisKKwkvKiBTZW5kIG1zZyB0byBmdyAqLworCWRpYWctPmxlZHRlc3QubG9jayA9IEJGQV9UUlVFOworCWRpYWdfbGVkdGVzdF9zZW5kKGRpYWcsIGxlZHRlc3QpOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKKy8qCisgKiBQb3J0IGJlYWNvbmluZyBjb21tYW5kCisgKgorICogICBAcGFyYW1baW5dICpkaWFnICAgICAgICAgICAtIGRpYWcgZGF0YSBzdHJ1Y3QKKyAqICAgQHBhcmFtW2luXSBiZWFjb24gICAgICAgICAgLSBwb3J0IGJlYWNvbmluZyAxOk9OICAgMDpPRkYKKyAqICAgQHBhcmFtW2luXSBsaW5rX2UyZV9iZWFjb24gLSBsaW5rIGJlYWNvbmluZyAxOk9OICAgMDpPRkYKKyAqICAgQHBhcmFtW2luXSBzZWMgICAgICAgICAgICAgLSBiZWFjb25pbmcgZHVyYXRpb24gaW4gc2Vjb25kcworICoKKyAqICAgQHBhcmFtW291dF0KKyAqLworYmZhX3N0YXR1c190CitiZmFfZGlhZ19iZWFjb25fcG9ydChzdHJ1Y3QgYmZhX2RpYWdfcyAqZGlhZywgYmZhX2Jvb2xlYW5fdCBiZWFjb24sCisJCWJmYV9ib29sZWFuX3QgbGlua19lMmVfYmVhY29uLCB1aW50MzJfdCBzZWMpCit7CisJYmZhX3RyYyhkaWFnLCBiZWFjb24pOworCWJmYV90cmMoZGlhZywgbGlua19lMmVfYmVhY29uKTsKKwliZmFfdHJjKGRpYWcsIHNlYyk7CisKKwlpZiAoIWJmYV9pb2NfaXNfb3BlcmF0aW9uYWwoZGlhZy0+aW9jKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKworCWlmIChkaWFnLT5sZWR0ZXN0LmxvY2spCisJCXJldHVybiBCRkFfU1RBVFVTX0xFRFRFU1RfT1A7CisKKwlpZiAoZGlhZy0+YmVhY29uLnN0YXRlICYmIGJlYWNvbikgICAgICAgLyogYmVhY29uIGFscmVhZCBvbiAqLworCQlyZXR1cm4gQkZBX1NUQVRVU19CRUFDT05fT047CisKKwlkaWFnLT5iZWFjb24uc3RhdGUJPSBiZWFjb247CisJZGlhZy0+YmVhY29uLmxpbmtfZTJlCT0gbGlua19lMmVfYmVhY29uOworCWlmIChkaWFnLT5jYmZuX2JlYWNvbikKKwkJZGlhZy0+Y2Jmbl9iZWFjb24oZGlhZy0+ZGV2LCBiZWFjb24sIGxpbmtfZTJlX2JlYWNvbik7CisKKwkvKiBTZW5kIG1zZyB0byBmdyAqLworCWRpYWdfcG9ydGJlYWNvbl9zZW5kKGRpYWcsIGJlYWNvbiwgc2VjKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKgorICogUmV0dXJuIERNQSBtZW1vcnkgbmVlZGVkIGJ5IGRpYWcgbW9kdWxlLgorICovCit1MzIKK2JmYV9kaWFnX21lbWluZm8odm9pZCkKK3sKKwlyZXR1cm4gQkZBX1JPVU5EVVAoQkZJX0RJQUdfRE1BX0JVRl9TWiwgQkZBX0RNQV9BTElHTl9TWik7Cit9CisKKy8qCisgKglBdHRhY2ggdmlydHVhbCBhbmQgcGh5c2ljYWwgbWVtb3J5IGZvciBEaWFnLgorICovCit2b2lkCitiZmFfZGlhZ19hdHRhY2goc3RydWN0IGJmYV9kaWFnX3MgKmRpYWcsIHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdm9pZCAqZGV2LAorCWJmYV9jYl9kaWFnX2JlYWNvbl90IGNiZm5fYmVhY29uLCBzdHJ1Y3QgYmZhX3RyY19tb2RfcyAqdHJjbW9kKQoreworCWRpYWctPmRldiA9IGRldjsKKwlkaWFnLT5pb2MgPSBpb2M7CisJZGlhZy0+dHJjbW9kID0gdHJjbW9kOworCisJZGlhZy0+YmxvY2sgPSAwOworCWRpYWctPmNiZm4gPSBOVUxMOworCWRpYWctPmNiYXJnID0gTlVMTDsKKwlkaWFnLT5yZXN1bHQgPSBOVUxMOworCWRpYWctPmNiZm5fYmVhY29uID0gY2Jmbl9iZWFjb247CisKKwliZmFfaW9jX21ib3hfcmVnaXNyKGRpYWctPmlvYywgQkZJX01DX0RJQUcsIGJmYV9kaWFnX2ludHIsIGRpYWcpOworCWJmYV9xX3FlX2luaXQoJmRpYWctPmlvY19ub3RpZnkpOworCWJmYV9pb2Nfbm90aWZ5X2luaXQoJmRpYWctPmlvY19ub3RpZnksIGJmYV9kaWFnX25vdGlmeSwgZGlhZyk7CisJbGlzdF9hZGRfdGFpbCgmZGlhZy0+aW9jX25vdGlmeS5xZSwgJmRpYWctPmlvYy0+bm90aWZ5X3EpOworfQorCit2b2lkCitiZmFfZGlhZ19tZW1jbGFpbShzdHJ1Y3QgYmZhX2RpYWdfcyAqZGlhZywgdTggKmRtX2t2YSwgdTY0IGRtX3BhKQoreworCWRpYWctPmZ3cGluZy5kYnVmX2t2YSA9IGRtX2t2YTsKKwlkaWFnLT5md3BpbmcuZGJ1Zl9wYSA9IGRtX3BhOworCW1lbXNldChkaWFnLT5md3BpbmcuZGJ1Zl9rdmEsIDAsIEJGSV9ESUFHX0RNQV9CVUZfU1opOworfQorCisvKgorICoJUEhZIG1vZHVsZSBzcGVjaWZpYworICovCisjZGVmaW5lIEJGQV9QSFlfRE1BX0JVRl9TWgkweDAyMDAwICAgICAgICAgLyogOGsgZG1hIGJ1ZmZlciAqLworI2RlZmluZSBCRkFfUEhZX0xPQ0tfU1RBVFVTCTB4MDE4ODc4ICAgICAgICAvKiBwaHkgc2VtYXBob3JlIHN0YXR1cyByZWcgKi8KKworc3RhdGljIHZvaWQKK2JmYV9waHlfbnRvaDMyKHUzMiAqb2J1ZiwgdTMyICppYnVmLCBpbnQgc3opCit7CisJaW50IGksIG0gPSBzeiA+PiAyOworCisJZm9yIChpID0gMDsgaSA8IG07IGkrKykKKwkJb2J1ZltpXSA9IGJlMzJfdG9fY3B1KGlidWZbaV0pOworfQorCitzdGF0aWMgYmZhX2Jvb2xlYW5fdAorYmZhX3BoeV9wcmVzZW50KHN0cnVjdCBiZmFfcGh5X3MgKnBoeSkKK3sKKwlyZXR1cm4gKHBoeS0+aW9jLT5hdHRyLT5jYXJkX3R5cGUgPT0gQkZBX01GR19UWVBFX0xJR0hUTklORyk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfcGh5X25vdGlmeSh2b2lkICpjYmFyZywgZW51bSBiZmFfaW9jX2V2ZW50X2UgZXZlbnQpCit7CisJc3RydWN0IGJmYV9waHlfcyAqcGh5ID0gY2Jhcmc7CisKKwliZmFfdHJjKHBoeSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lPQ19FX0RJU0FCTEVEOgorCWNhc2UgQkZBX0lPQ19FX0ZBSUxFRDoKKwkJaWYgKHBoeS0+b3BfYnVzeSkgeworCQkJcGh5LT5zdGF0dXMgPSBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCQkJcGh5LT5jYmZuKHBoeS0+Y2JhcmcsIHBoeS0+c3RhdHVzKTsKKwkJCXBoeS0+b3BfYnVzeSA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBTZW5kIHBoeSBhdHRyaWJ1dGUgcXVlcnkgcmVxdWVzdC4KKyAqCisgKiBAcGFyYW1baW5dIGNiYXJnIC0gY2FsbGJhY2sgYXJndW1lbnQKKyAqLworc3RhdGljIHZvaWQKK2JmYV9waHlfcXVlcnlfc2VuZCh2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX3BoeV9zICpwaHkgPSBjYmFyZzsKKwlzdHJ1Y3QgYmZpX3BoeV9xdWVyeV9yZXFfcyAqbXNnID0KKwkJCShzdHJ1Y3QgYmZpX3BoeV9xdWVyeV9yZXFfcyAqKSBwaHktPm1iLm1zZzsKKworCW1zZy0+aW5zdGFuY2UgPSBwaHktPmluc3RhbmNlOworCWJmaV9oMmlfc2V0KG1zZy0+bWgsIEJGSV9NQ19QSFksIEJGSV9QSFlfSDJJX1FVRVJZX1JFUSwKKwkJYmZhX2lvY19wb3J0aWQocGh5LT5pb2MpKTsKKwliZmFfYWxlbl9zZXQoJm1zZy0+YWxlbiwgc2l6ZW9mKHN0cnVjdCBiZmFfcGh5X2F0dHJfcyksIHBoeS0+ZGJ1Zl9wYSk7CisJYmZhX2lvY19tYm94X3F1ZXVlKHBoeS0+aW9jLCAmcGh5LT5tYik7Cit9CisKKy8qCisgKiBTZW5kIHBoeSB3cml0ZSByZXF1ZXN0LgorICoKKyAqIEBwYXJhbVtpbl0gY2JhcmcgLSBjYWxsYmFjayBhcmd1bWVudAorICovCitzdGF0aWMgdm9pZAorYmZhX3BoeV93cml0ZV9zZW5kKHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfcGh5X3MgKnBoeSA9IGNiYXJnOworCXN0cnVjdCBiZmlfcGh5X3dyaXRlX3JlcV9zICptc2cgPQorCQkJKHN0cnVjdCBiZmlfcGh5X3dyaXRlX3JlcV9zICopIHBoeS0+bWIubXNnOworCXUzMglsZW47CisJdTE2CSpidWYsICpkYnVmOworCWludAlpLCBzejsKKworCW1zZy0+aW5zdGFuY2UgPSBwaHktPmluc3RhbmNlOworCW1zZy0+b2Zmc2V0ID0gY3B1X3RvX2JlMzIocGh5LT5hZGRyX29mZiArIHBoeS0+b2Zmc2V0KTsKKwlsZW4gPSAocGh5LT5yZXNpZHVlIDwgQkZBX1BIWV9ETUFfQlVGX1NaKSA/CisJCQlwaHktPnJlc2lkdWUgOiBCRkFfUEhZX0RNQV9CVUZfU1o7CisJbXNnLT5sZW5ndGggPSBjcHVfdG9fYmUzMihsZW4pOworCisJLyogaW5kaWNhdGUgaWYgaXQncyB0aGUgbGFzdCBtc2cgb2YgdGhlIHdob2xlIHdyaXRlIG9wZXJhdGlvbiAqLworCW1zZy0+bGFzdCA9IChsZW4gPT0gcGh5LT5yZXNpZHVlKSA/IDEgOiAwOworCisJYmZpX2gyaV9zZXQobXNnLT5taCwgQkZJX01DX1BIWSwgQkZJX1BIWV9IMklfV1JJVEVfUkVRLAorCQliZmFfaW9jX3BvcnRpZChwaHktPmlvYykpOworCWJmYV9hbGVuX3NldCgmbXNnLT5hbGVuLCBsZW4sIHBoeS0+ZGJ1Zl9wYSk7CisKKwlidWYgPSAodTE2ICopIChwaHktPnVidWYgKyBwaHktPm9mZnNldCk7CisJZGJ1ZiA9ICh1MTYgKilwaHktPmRidWZfa3ZhOworCXN6ID0gbGVuID4+IDE7CisJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspCisJCWJ1ZltpXSA9IGNwdV90b19iZTE2KGRidWZbaV0pOworCisJYmZhX2lvY19tYm94X3F1ZXVlKHBoeS0+aW9jLCAmcGh5LT5tYik7CisKKwlwaHktPnJlc2lkdWUgLT0gbGVuOworCXBoeS0+b2Zmc2V0ICs9IGxlbjsKK30KKworLyoKKyAqIFNlbmQgcGh5IHJlYWQgcmVxdWVzdC4KKyAqCisgKiBAcGFyYW1baW5dIGNiYXJnIC0gY2FsbGJhY2sgYXJndW1lbnQKKyAqLworc3RhdGljIHZvaWQKK2JmYV9waHlfcmVhZF9zZW5kKHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfcGh5X3MgKnBoeSA9IGNiYXJnOworCXN0cnVjdCBiZmlfcGh5X3JlYWRfcmVxX3MgKm1zZyA9CisJCQkoc3RydWN0IGJmaV9waHlfcmVhZF9yZXFfcyAqKSBwaHktPm1iLm1zZzsKKwl1MzIJbGVuOworCisJbXNnLT5pbnN0YW5jZSA9IHBoeS0+aW5zdGFuY2U7CisJbXNnLT5vZmZzZXQgPSBjcHVfdG9fYmUzMihwaHktPmFkZHJfb2ZmICsgcGh5LT5vZmZzZXQpOworCWxlbiA9IChwaHktPnJlc2lkdWUgPCBCRkFfUEhZX0RNQV9CVUZfU1opID8KKwkJCXBoeS0+cmVzaWR1ZSA6IEJGQV9QSFlfRE1BX0JVRl9TWjsKKwltc2ctPmxlbmd0aCA9IGNwdV90b19iZTMyKGxlbik7CisJYmZpX2gyaV9zZXQobXNnLT5taCwgQkZJX01DX1BIWSwgQkZJX1BIWV9IMklfUkVBRF9SRVEsCisJCWJmYV9pb2NfcG9ydGlkKHBoeS0+aW9jKSk7CisJYmZhX2FsZW5fc2V0KCZtc2ctPmFsZW4sIGxlbiwgcGh5LT5kYnVmX3BhKTsKKwliZmFfaW9jX21ib3hfcXVldWUocGh5LT5pb2MsICZwaHktPm1iKTsKK30KKworLyoKKyAqIFNlbmQgcGh5IHN0YXRzIHJlcXVlc3QuCisgKgorICogQHBhcmFtW2luXSBjYmFyZyAtIGNhbGxiYWNrIGFyZ3VtZW50CisgKi8KK3N0YXRpYyB2b2lkCitiZmFfcGh5X3N0YXRzX3NlbmQodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9waHlfcyAqcGh5ID0gY2Jhcmc7CisJc3RydWN0IGJmaV9waHlfc3RhdHNfcmVxX3MgKm1zZyA9CisJCQkoc3RydWN0IGJmaV9waHlfc3RhdHNfcmVxX3MgKikgcGh5LT5tYi5tc2c7CisKKwltc2ctPmluc3RhbmNlID0gcGh5LT5pbnN0YW5jZTsKKwliZmlfaDJpX3NldChtc2ctPm1oLCBCRklfTUNfUEhZLCBCRklfUEhZX0gySV9TVEFUU19SRVEsCisJCWJmYV9pb2NfcG9ydGlkKHBoeS0+aW9jKSk7CisJYmZhX2FsZW5fc2V0KCZtc2ctPmFsZW4sIHNpemVvZihzdHJ1Y3QgYmZhX3BoeV9zdGF0c19zKSwgcGh5LT5kYnVmX3BhKTsKKwliZmFfaW9jX21ib3hfcXVldWUocGh5LT5pb2MsICZwaHktPm1iKTsKK30KKworLyoKKyAqIEZsYXNoIG1lbW9yeSBpbmZvIEFQSS4KKyAqCisgKiBAcGFyYW1baW5dIG1pbmNmZyAtIG1pbmltYWwgY2ZnIHZhcmlhYmxlCisgKi8KK3UzMgorYmZhX3BoeV9tZW1pbmZvKGJmYV9ib29sZWFuX3QgbWluY2ZnKQoreworCS8qIG1pbiBkcml2ZXIgZG9lc24ndCBuZWVkIHBoeSAqLworCWlmIChtaW5jZmcpCisJCXJldHVybiAwOworCisJcmV0dXJuIEJGQV9ST1VORFVQKEJGQV9QSFlfRE1BX0JVRl9TWiwgQkZBX0RNQV9BTElHTl9TWik7Cit9CisKKy8qCisgKiBGbGFzaCBhdHRhY2ggQVBJLgorICoKKyAqIEBwYXJhbVtpbl0gcGh5IC0gcGh5IHN0cnVjdHVyZQorICogQHBhcmFtW2luXSBpb2MgIC0gaW9jIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSBkZXYgIC0gZGV2aWNlIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSB0cmNtb2QgLSB0cmFjZSBtb2R1bGUKKyAqIEBwYXJhbVtpbl0gbG9nbW9kIC0gbG9nIG1vZHVsZQorICovCit2b2lkCitiZmFfcGh5X2F0dGFjaChzdHJ1Y3QgYmZhX3BoeV9zICpwaHksIHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdm9pZCAqZGV2LAorCQlzdHJ1Y3QgYmZhX3RyY19tb2RfcyAqdHJjbW9kLCBiZmFfYm9vbGVhbl90IG1pbmNmZykKK3sKKwlwaHktPmlvYyA9IGlvYzsKKwlwaHktPnRyY21vZCA9IHRyY21vZDsKKwlwaHktPmNiZm4gPSBOVUxMOworCXBoeS0+Y2JhcmcgPSBOVUxMOworCXBoeS0+b3BfYnVzeSA9IDA7CisKKwliZmFfaW9jX21ib3hfcmVnaXNyKHBoeS0+aW9jLCBCRklfTUNfUEhZLCBiZmFfcGh5X2ludHIsIHBoeSk7CisJYmZhX3FfcWVfaW5pdCgmcGh5LT5pb2Nfbm90aWZ5KTsKKwliZmFfaW9jX25vdGlmeV9pbml0KCZwaHktPmlvY19ub3RpZnksIGJmYV9waHlfbm90aWZ5LCBwaHkpOworCWxpc3RfYWRkX3RhaWwoJnBoeS0+aW9jX25vdGlmeS5xZSwgJnBoeS0+aW9jLT5ub3RpZnlfcSk7CisKKwkvKiBtaW4gZHJpdmVyIGRvZXNuJ3QgbmVlZCBwaHkgKi8KKwlpZiAobWluY2ZnKSB7CisJCXBoeS0+ZGJ1Zl9rdmEgPSBOVUxMOworCQlwaHktPmRidWZfcGEgPSAwOworCX0KK30KKworLyoKKyAqIENsYWltIG1lbW9yeSBmb3IgcGh5CisgKgorICogQHBhcmFtW2luXSBwaHkgLSBwaHkgc3RydWN0dXJlCisgKiBAcGFyYW1baW5dIGRtX2t2YSAtIHBvaW50ZXIgdG8gdmlydHVhbCBtZW1vcnkgYWRkcmVzcworICogQHBhcmFtW2luXSBkbV9wYSAtIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzCisgKiBAcGFyYW1baW5dIG1pbmNmZyAtIG1pbmltYWwgY2ZnIHZhcmlhYmxlCisgKi8KK3ZvaWQKK2JmYV9waHlfbWVtY2xhaW0oc3RydWN0IGJmYV9waHlfcyAqcGh5LCB1OCAqZG1fa3ZhLCB1NjQgZG1fcGEsCisJCWJmYV9ib29sZWFuX3QgbWluY2ZnKQoreworCWlmIChtaW5jZmcpCisJCXJldHVybjsKKworCXBoeS0+ZGJ1Zl9rdmEgPSBkbV9rdmE7CisJcGh5LT5kYnVmX3BhID0gZG1fcGE7CisJbWVtc2V0KHBoeS0+ZGJ1Zl9rdmEsIDAsIEJGQV9QSFlfRE1BX0JVRl9TWik7CisJZG1fa3ZhICs9IEJGQV9ST1VORFVQKEJGQV9QSFlfRE1BX0JVRl9TWiwgQkZBX0RNQV9BTElHTl9TWik7CisJZG1fcGEgKz0gQkZBX1JPVU5EVVAoQkZBX1BIWV9ETUFfQlVGX1NaLCBCRkFfRE1BX0FMSUdOX1NaKTsKK30KKworYmZhX2Jvb2xlYW5fdAorYmZhX3BoeV9idXN5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwl2b2lkIF9faW9tZW0JKnJiOworCisJcmIgPSBiZmFfaW9jX2JhcjAoaW9jKTsKKwlyZXR1cm4gcmVhZGwocmIgKyBCRkFfUEhZX0xPQ0tfU1RBVFVTKTsKK30KKworLyoKKyAqIEdldCBwaHkgYXR0cmlidXRlLgorICoKKyAqIEBwYXJhbVtpbl0gcGh5IC0gcGh5IHN0cnVjdHVyZQorICogQHBhcmFtW2luXSBhdHRyIC0gcGh5IGF0dHJpYnV0ZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gY2JmbiAtIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcGFyYW1baW5dIGNiYXJnIC0gY2FsbGJhY2sgYXJndW1lbnQKKyAqCisgKiBSZXR1cm4gc3RhdHVzLgorICovCitiZmFfc3RhdHVzX3QKK2JmYV9waHlfZ2V0X2F0dHIoc3RydWN0IGJmYV9waHlfcyAqcGh5LCB1OCBpbnN0YW5jZSwKKwkJc3RydWN0IGJmYV9waHlfYXR0cl9zICphdHRyLCBiZmFfY2JfcGh5X3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJYmZhX3RyYyhwaHksIEJGSV9QSFlfSDJJX1FVRVJZX1JFUSk7CisJYmZhX3RyYyhwaHksIGluc3RhbmNlKTsKKworCWlmICghYmZhX3BoeV9wcmVzZW50KHBoeSkpCisJCXJldHVybiBCRkFfU1RBVFVTX1BIWV9OT1RfUFJFU0VOVDsKKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChwaHktPmlvYykpCisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19OT05fT1A7CisKKwlpZiAocGh5LT5vcF9idXN5IHx8IGJmYV9waHlfYnVzeShwaHktPmlvYykpIHsKKwkJYmZhX3RyYyhwaHksIHBoeS0+b3BfYnVzeSk7CisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfQorCisJcGh5LT5vcF9idXN5ID0gMTsKKwlwaHktPmNiZm4gPSBjYmZuOworCXBoeS0+Y2JhcmcgPSBjYmFyZzsKKwlwaHktPmluc3RhbmNlID0gaW5zdGFuY2U7CisJcGh5LT51YnVmID0gKHVpbnQ4X3QgKikgYXR0cjsKKwliZmFfcGh5X3F1ZXJ5X3NlbmQocGh5KTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKgorICogR2V0IHBoeSBzdGF0cy4KKyAqCisgKiBAcGFyYW1baW5dIHBoeSAtIHBoeSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gaW5zdGFuY2UgLSBwaHkgaW1hZ2UgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gc3RhdHMgLSBwb2ludGVyIHRvIHBoeSBzdGF0cworICogQHBhcmFtW2luXSBjYmZuIC0gY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBwYXJhbVtpbl0gY2JhcmcgLSBjYWxsYmFjayBhcmd1bWVudAorICoKKyAqIFJldHVybiBzdGF0dXMuCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX3BoeV9nZXRfc3RhdHMoc3RydWN0IGJmYV9waHlfcyAqcGh5LCB1OCBpbnN0YW5jZSwKKwkJc3RydWN0IGJmYV9waHlfc3RhdHNfcyAqc3RhdHMsCisJCWJmYV9jYl9waHlfdCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwliZmFfdHJjKHBoeSwgQkZJX1BIWV9IMklfU1RBVFNfUkVRKTsKKwliZmFfdHJjKHBoeSwgaW5zdGFuY2UpOworCisJaWYgKCFiZmFfcGh5X3ByZXNlbnQocGh5KSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfUEhZX05PVF9QUkVTRU5UOworCisJaWYgKCFiZmFfaW9jX2lzX29wZXJhdGlvbmFsKHBoeS0+aW9jKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKworCWlmIChwaHktPm9wX2J1c3kgfHwgYmZhX3BoeV9idXN5KHBoeS0+aW9jKSkgeworCQliZmFfdHJjKHBoeSwgcGh5LT5vcF9idXN5KTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisKKwlwaHktPm9wX2J1c3kgPSAxOworCXBoeS0+Y2JmbiA9IGNiZm47CisJcGh5LT5jYmFyZyA9IGNiYXJnOworCXBoeS0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKKwlwaHktPnVidWYgPSAodTggKikgc3RhdHM7CisJYmZhX3BoeV9zdGF0c19zZW5kKHBoeSk7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoKKyAqIFVwZGF0ZSBwaHkgaW1hZ2UuCisgKgorICogQHBhcmFtW2luXSBwaHkgLSBwaHkgc3RydWN0dXJlCisgKiBAcGFyYW1baW5dIGluc3RhbmNlIC0gcGh5IGltYWdlIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGJ1ZiAtIHVwZGF0ZSBkYXRhIGJ1ZmZlcgorICogQHBhcmFtW2luXSBsZW4gLSBkYXRhIGJ1ZmZlciBsZW5ndGgKKyAqIEBwYXJhbVtpbl0gb2Zmc2V0IC0gb2Zmc2V0IHJlbGF0aXZlIHRvIHN0YXJ0aW5nIGFkZHJlc3MKKyAqIEBwYXJhbVtpbl0gY2JmbiAtIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcGFyYW1baW5dIGNiYXJnIC0gY2FsbGJhY2sgYXJndW1lbnQKKyAqCisgKiBSZXR1cm4gc3RhdHVzLgorICovCitiZmFfc3RhdHVzX3QKK2JmYV9waHlfdXBkYXRlKHN0cnVjdCBiZmFfcGh5X3MgKnBoeSwgdTggaW5zdGFuY2UsCisJCXZvaWQgKmJ1ZiwgdTMyIGxlbiwgdTMyIG9mZnNldCwKKwkJYmZhX2NiX3BoeV90IGNiZm4sIHZvaWQgKmNiYXJnKQoreworCWJmYV90cmMocGh5LCBCRklfUEhZX0gySV9XUklURV9SRVEpOworCWJmYV90cmMocGh5LCBpbnN0YW5jZSk7CisJYmZhX3RyYyhwaHksIGxlbik7CisJYmZhX3RyYyhwaHksIG9mZnNldCk7CisKKwlpZiAoIWJmYV9waHlfcHJlc2VudChwaHkpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19QSFlfTk9UX1BSRVNFTlQ7CisKKwlpZiAoIWJmYV9pb2NfaXNfb3BlcmF0aW9uYWwocGh5LT5pb2MpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfTk9OX09QOworCisJLyogJ2xlbicgbXVzdCBiZSBpbiB3b3JkICg0LWJ5dGUpIGJvdW5kYXJ5ICovCisJaWYgKCFsZW4gfHwgKGxlbiAmIDB4MDMpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19GQUlMRUQ7CisKKwlpZiAocGh5LT5vcF9idXN5IHx8IGJmYV9waHlfYnVzeShwaHktPmlvYykpIHsKKwkJYmZhX3RyYyhwaHksIHBoeS0+b3BfYnVzeSk7CisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfQorCisJcGh5LT5vcF9idXN5ID0gMTsKKwlwaHktPmNiZm4gPSBjYmZuOworCXBoeS0+Y2JhcmcgPSBjYmFyZzsKKwlwaHktPmluc3RhbmNlID0gaW5zdGFuY2U7CisJcGh5LT5yZXNpZHVlID0gbGVuOworCXBoeS0+b2Zmc2V0ID0gMDsKKwlwaHktPmFkZHJfb2ZmID0gb2Zmc2V0OworCXBoeS0+dWJ1ZiA9IGJ1ZjsKKworCWJmYV9waHlfd3JpdGVfc2VuZChwaHkpOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKgorICogUmVhZCBwaHkgaW1hZ2UuCisgKgorICogQHBhcmFtW2luXSBwaHkgLSBwaHkgc3RydWN0dXJlCisgKiBAcGFyYW1baW5dIGluc3RhbmNlIC0gcGh5IGltYWdlIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGJ1ZiAtIHJlYWQgZGF0YSBidWZmZXIKKyAqIEBwYXJhbVtpbl0gbGVuIC0gZGF0YSBidWZmZXIgbGVuZ3RoCisgKiBAcGFyYW1baW5dIG9mZnNldCAtIG9mZnNldCByZWxhdGl2ZSB0byBzdGFydGluZyBhZGRyZXNzCisgKiBAcGFyYW1baW5dIGNiZm4gLSBjYWxsYmFjayBmdW5jdGlvbgorICogQHBhcmFtW2luXSBjYmFyZyAtIGNhbGxiYWNrIGFyZ3VtZW50CisgKgorICogUmV0dXJuIHN0YXR1cy4KKyAqLworYmZhX3N0YXR1c190CitiZmFfcGh5X3JlYWQoc3RydWN0IGJmYV9waHlfcyAqcGh5LCB1OCBpbnN0YW5jZSwKKwkJdm9pZCAqYnVmLCB1MzIgbGVuLCB1MzIgb2Zmc2V0LAorCQliZmFfY2JfcGh5X3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJYmZhX3RyYyhwaHksIEJGSV9QSFlfSDJJX1JFQURfUkVRKTsKKwliZmFfdHJjKHBoeSwgaW5zdGFuY2UpOworCWJmYV90cmMocGh5LCBsZW4pOworCWJmYV90cmMocGh5LCBvZmZzZXQpOworCisJaWYgKCFiZmFfcGh5X3ByZXNlbnQocGh5KSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfUEhZX05PVF9QUkVTRU5UOworCisJaWYgKCFiZmFfaW9jX2lzX29wZXJhdGlvbmFsKHBoeS0+aW9jKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKworCS8qICdsZW4nIG11c3QgYmUgaW4gd29yZCAoNC1ieXRlKSBib3VuZGFyeSAqLworCWlmICghbGVuIHx8IChsZW4gJiAweDAzKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkFJTEVEOworCisJaWYgKHBoeS0+b3BfYnVzeSB8fCBiZmFfcGh5X2J1c3kocGh5LT5pb2MpKSB7CisJCWJmYV90cmMocGh5LCBwaHktPm9wX2J1c3kpOworCQlyZXR1cm4gQkZBX1NUQVRVU19ERVZCVVNZOworCX0KKworCXBoeS0+b3BfYnVzeSA9IDE7CisJcGh5LT5jYmZuID0gY2JmbjsKKwlwaHktPmNiYXJnID0gY2Jhcmc7CisJcGh5LT5pbnN0YW5jZSA9IGluc3RhbmNlOworCXBoeS0+cmVzaWR1ZSA9IGxlbjsKKwlwaHktPm9mZnNldCA9IDA7CisJcGh5LT5hZGRyX29mZiA9IG9mZnNldDsKKwlwaHktPnVidWYgPSBidWY7CisJYmZhX3BoeV9yZWFkX3NlbmQocGh5KTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKgorICogUHJvY2VzcyBwaHkgcmVzcG9uc2UgbWVzc2FnZXMgdXBvbiByZWNlaXZpbmcgaW50ZXJydXB0cy4KKyAqCisgKiBAcGFyYW1baW5dIHBoeWFyZyAtIHBoeSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gbXNnIC0gbWVzc2FnZSBzdHJ1Y3R1cmUKKyAqLwordm9pZAorYmZhX3BoeV9pbnRyKHZvaWQgKnBoeWFyZywgc3RydWN0IGJmaV9tYm1zZ19zICptc2cpCit7CisJc3RydWN0IGJmYV9waHlfcyAqcGh5ID0gcGh5YXJnOworCXUzMglzdGF0dXM7CisKKwl1bmlvbiB7CisJCXN0cnVjdCBiZmlfcGh5X3F1ZXJ5X3JzcF9zICpxdWVyeTsKKwkJc3RydWN0IGJmaV9waHlfc3RhdHNfcnNwX3MgKnN0YXRzOworCQlzdHJ1Y3QgYmZpX3BoeV93cml0ZV9yc3BfcyAqd3JpdGU7CisJCXN0cnVjdCBiZmlfcGh5X3JlYWRfcnNwX3MgKnJlYWQ7CisJCXN0cnVjdCBiZmlfbWJtc2dfcyAgICptc2c7CisJfSBtOworCisJbS5tc2cgPSBtc2c7CisJYmZhX3RyYyhwaHksIG1zZy0+bWgubXNnX2lkKTsKKworCWlmICghcGh5LT5vcF9idXN5KSB7CisJCS8qIHJlY2VpdmluZyByZXNwb25zZSBhZnRlciBpb2MgZmFpbHVyZSAqLworCQliZmFfdHJjKHBoeSwgMHg5OTk5KTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAobXNnLT5taC5tc2dfaWQpIHsKKwljYXNlIEJGSV9QSFlfSTJIX1FVRVJZX1JTUDoKKwkJc3RhdHVzID0gYmUzMl90b19jcHUobS5xdWVyeS0+c3RhdHVzKTsKKwkJYmZhX3RyYyhwaHksIHN0YXR1cyk7CisKKwkJaWYgKHN0YXR1cyA9PSBCRkFfU1RBVFVTX09LKSB7CisJCQlzdHJ1Y3QgYmZhX3BoeV9hdHRyX3MgKmF0dHIgPQorCQkJCShzdHJ1Y3QgYmZhX3BoeV9hdHRyX3MgKikgcGh5LT51YnVmOworCQkJYmZhX3BoeV9udG9oMzIoKHUzMiAqKWF0dHIsICh1MzIgKilwaHktPmRidWZfa3ZhLAorCQkJCQlzaXplb2Yoc3RydWN0IGJmYV9waHlfYXR0cl9zKSk7CisJCQliZmFfdHJjKHBoeSwgYXR0ci0+c3RhdHVzKTsKKwkJCWJmYV90cmMocGh5LCBhdHRyLT5sZW5ndGgpOworCQl9CisKKwkJcGh5LT5zdGF0dXMgPSBzdGF0dXM7CisJCXBoeS0+b3BfYnVzeSA9IDA7CisJCWlmIChwaHktPmNiZm4pCisJCQlwaHktPmNiZm4ocGh5LT5jYmFyZywgcGh5LT5zdGF0dXMpOworCQlicmVhazsKKwljYXNlIEJGSV9QSFlfSTJIX1NUQVRTX1JTUDoKKwkJc3RhdHVzID0gYmUzMl90b19jcHUobS5zdGF0cy0+c3RhdHVzKTsKKwkJYmZhX3RyYyhwaHksIHN0YXR1cyk7CisKKwkJaWYgKHN0YXR1cyA9PSBCRkFfU1RBVFVTX09LKSB7CisJCQlzdHJ1Y3QgYmZhX3BoeV9zdGF0c19zICpzdGF0cyA9CisJCQkJKHN0cnVjdCBiZmFfcGh5X3N0YXRzX3MgKikgcGh5LT51YnVmOworCQkJYmZhX3BoeV9udG9oMzIoKHUzMiAqKXN0YXRzLCAodTMyICopcGh5LT5kYnVmX2t2YSwKKwkJCQlzaXplb2Yoc3RydWN0IGJmYV9waHlfc3RhdHNfcykpOworCQkJCWJmYV90cmMocGh5LCBzdGF0cy0+c3RhdHVzKTsKKwkJfQorCisJCXBoeS0+c3RhdHVzID0gc3RhdHVzOworCQlwaHktPm9wX2J1c3kgPSAwOworCQlpZiAocGh5LT5jYmZuKQorCQkJcGh5LT5jYmZuKHBoeS0+Y2JhcmcsIHBoeS0+c3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBCRklfUEhZX0kySF9XUklURV9SU1A6CisJCXN0YXR1cyA9IGJlMzJfdG9fY3B1KG0ud3JpdGUtPnN0YXR1cyk7CisJCWJmYV90cmMocGh5LCBzdGF0dXMpOworCisJCWlmIChzdGF0dXMgIT0gQkZBX1NUQVRVU19PSyB8fCBwaHktPnJlc2lkdWUgPT0gMCkgeworCQkJcGh5LT5zdGF0dXMgPSBzdGF0dXM7CisJCQlwaHktPm9wX2J1c3kgPSAwOworCQkJaWYgKHBoeS0+Y2JmbikKKwkJCQlwaHktPmNiZm4ocGh5LT5jYmFyZywgcGh5LT5zdGF0dXMpOworCQl9IGVsc2UgeworCQkJYmZhX3RyYyhwaHksIHBoeS0+b2Zmc2V0KTsKKwkJCWJmYV9waHlfd3JpdGVfc2VuZChwaHkpOworCQl9CisJCWJyZWFrOworCWNhc2UgQkZJX1BIWV9JMkhfUkVBRF9SU1A6CisJCXN0YXR1cyA9IGJlMzJfdG9fY3B1KG0ucmVhZC0+c3RhdHVzKTsKKwkJYmZhX3RyYyhwaHksIHN0YXR1cyk7CisKKwkJaWYgKHN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCQlwaHktPnN0YXR1cyA9IHN0YXR1czsKKwkJCXBoeS0+b3BfYnVzeSA9IDA7CisJCQlpZiAocGh5LT5jYmZuKQorCQkJCXBoeS0+Y2JmbihwaHktPmNiYXJnLCBwaHktPnN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQl1MzIgbGVuID0gYmUzMl90b19jcHUobS5yZWFkLT5sZW5ndGgpOworCQkJdTE2ICpidWYgPSAodTE2ICopKHBoeS0+dWJ1ZiArIHBoeS0+b2Zmc2V0KTsKKwkJCXUxNiAqZGJ1ZiA9ICh1MTYgKilwaHktPmRidWZfa3ZhOworCQkJaW50IGksIHN6ID0gbGVuID4+IDE7CisKKwkJCWJmYV90cmMocGh5LCBwaHktPm9mZnNldCk7CisJCQliZmFfdHJjKHBoeSwgbGVuKTsKKworCQkJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspCisJCQkJYnVmW2ldID0gYmUxNl90b19jcHUoZGJ1ZltpXSk7CisKKwkJCXBoeS0+cmVzaWR1ZSAtPSBsZW47CisJCQlwaHktPm9mZnNldCArPSBsZW47CisKKwkJCWlmIChwaHktPnJlc2lkdWUgPT0gMCkgeworCQkJCXBoeS0+c3RhdHVzID0gc3RhdHVzOworCQkJCXBoeS0+b3BfYnVzeSA9IDA7CisJCQkJaWYgKHBoeS0+Y2JmbikKKwkJCQkJcGh5LT5jYmZuKHBoeS0+Y2JhcmcsIHBoeS0+c3RhdHVzKTsKKwkJCX0gZWxzZQorCQkJCWJmYV9waHlfcmVhZF9zZW5kKHBoeSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oCmluZGV4IGM4NTE4MmEuLmM1ZWNkMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oCkBAIC04NSwxMiArODUsNzUgQEAKICNlbmRpZgogCiAvKgorICogQkZBIG1lbW9yeSByZXNvdXJjZXMKKyAqLworc3RydWN0IGJmYV9tZW1fZG1hX3MgeworCXN0cnVjdCBsaXN0X2hlYWQgcWU7CQkvKiBRdWV1ZSBvZiBETUEgZWxlbWVudHMgKi8KKwl1MzIJCW1lbV9sZW47CS8qIFRvdGFsIExlbmd0aCBpbiBCeXRlcyAqLworCXU4CQkqa3ZhOwkJLyoga2VybmVsIHZpcnR1YWwgYWRkcmVzcyAqLworCXU2NAkJZG1hOwkJLyogZG1hIGFkZHJlc3MgaWYgRE1BIG1lbW9yeSAqLworCXU4CQkqa3ZhX2N1cnA7CS8qIGt2YSBhbGxvY2F0aW9uIGN1cnNvciAqLworCXU2NAkJZG1hX2N1cnA7CS8qIGRtYSBhbGxvY2F0aW9uIGN1cnNvciAqLworfTsKKyNkZWZpbmUgYmZhX21lbV9kbWFfdCBzdHJ1Y3QgYmZhX21lbV9kbWFfcworCitzdHJ1Y3QgYmZhX21lbV9rdmFfcyB7CisJc3RydWN0IGxpc3RfaGVhZCBxZTsJCS8qIFF1ZXVlIG9mIEtWQSBlbGVtZW50cyAqLworCXUzMgkJbWVtX2xlbjsJLyogVG90YWwgTGVuZ3RoIGluIEJ5dGVzICovCisJdTgJCSprdmE7CQkvKiBrZXJuZWwgdmlydHVhbCBhZGRyZXNzICovCisJdTgJCSprdmFfY3VycDsJLyoga3ZhIGFsbG9jYXRpb24gY3Vyc29yICovCit9OworI2RlZmluZSBiZmFfbWVtX2t2YV90IHN0cnVjdCBiZmFfbWVtX2t2YV9zCisKK3N0cnVjdCBiZmFfbWVtaW5mb19zIHsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcyBkbWFfaW5mbzsKKwlzdHJ1Y3QgYmZhX21lbV9rdmFfcyBrdmFfaW5mbzsKK307CisKKy8qIEJGQSBtZW1vcnkgc2VnbWVudCBzZXR1cCBtYWNyb3MgKi8KKyNkZWZpbmUgYmZhX21lbV9kbWFfc2V0dXAoX21lbWluZm8sIF9kbV9wdHIsIF9zZWdfc3opIGRvIHsJXAorCSgoYmZhX21lbV9kbWFfdCAqKShfZG1fcHRyKSktPm1lbV9sZW4gPSAoX3NlZ19zeik7CVwKKwlpZiAoX3NlZ19zeikJCQkJCQlcCisJCWxpc3RfYWRkX3RhaWwoJigoYmZhX21lbV9kbWFfdCAqKV9kbV9wdHIpLT5xZSwJXAorCQkJICAgICAgJihfbWVtaW5mbyktPmRtYV9pbmZvLnFlKTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBiZmFfbWVtX2t2YV9zZXR1cChfbWVtaW5mbywgX2t2YV9wdHIsIF9zZWdfc3opIGRvIHsJXAorCSgoYmZhX21lbV9rdmFfdCAqKShfa3ZhX3B0cikpLT5tZW1fbGVuID0gKF9zZWdfc3opOwlcCisJaWYgKF9zZWdfc3opCQkJCQkJXAorCQlsaXN0X2FkZF90YWlsKCYoKGJmYV9tZW1fa3ZhX3QgKilfa3ZhX3B0ciktPnFlLAlcCisJCQkgICAgICAmKF9tZW1pbmZvKS0+a3ZhX2luZm8ucWUpOwlcCit9IHdoaWxlICgwKQorCisvKiBCRkEgZG1hIG1lbW9yeSBzZWdtZW50cyBpdGVyYXRvciAqLworI2RlZmluZSBiZmFfbWVtX2RtYV9zcHRyKF9tb2QsIF9pKQkoJihfbW9kKS0+ZG1hX3NlZ1soX2kpXSkKKyNkZWZpbmUgYmZhX21lbV9kbWFfc2VnX2l0ZXIoX21vZCwgX3NwdHIsIF9uciwgX2kpCQkJXAorCWZvciAoX2kgPSAwLCBfc3B0ciA9IGJmYV9tZW1fZG1hX3NwdHIoX21vZCwgX2kpOyBfaSA8IChfbnIpOwlcCisJICAgICBfaSsrLCBfc3B0ciA9IGJmYV9tZW1fZG1hX3NwdHIoX21vZCwgX2kpKQorCisjZGVmaW5lIGJmYV9tZW1fa3ZhX2N1cnAoX21vZCkJKChfbW9kKS0+a3ZhX3NlZy5rdmFfY3VycCkKKyNkZWZpbmUgYmZhX21lbV9kbWFfdmlydChfc3B0cikJKChfc3B0ciktPmt2YV9jdXJwKQorI2RlZmluZSBiZmFfbWVtX2RtYV9waHlzKF9zcHRyKQkoKF9zcHRyKS0+ZG1hX2N1cnApCisjZGVmaW5lIGJmYV9tZW1fZG1hX2xlbihfc3B0cikJKChfc3B0ciktPm1lbV9sZW4pCisKKy8qIEdldCB0aGUgY29ycmVzcG9uZGluZyBkbWEgYnVmIGt2YSBmb3IgYSByZXEgLSBmcm9tIHRoZSB0YWcgKi8KKyNkZWZpbmUgYmZhX21lbV9nZXRfZG1hYnVmX2t2YShfbW9kLCBfdGFnLCBfcnFzeikJCQkgICAgICBcCisJKCgodTggKikoX21vZCktPmRtYV9zZWdbQkZJX01FTV9TRUdfRlJPTV9UQUcoX3RhZywgX3Jxc3opXS5rdmFfY3VycCkgK1wKKwkgQkZJX01FTV9TRUdfUkVRX09GRlNFVChfdGFnLCBfcnFzeikgKiAoX3Jxc3opKQorCisvKiBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgZG1hIGJ1ZiBwYSBmb3IgYSByZXEgLSBmcm9tIHRoZSB0YWcgKi8KKyNkZWZpbmUgYmZhX21lbV9nZXRfZG1hYnVmX3BhKF9tb2QsIF90YWcsIF9ycXN6KQkJCVwKKwkoKF9tb2QpLT5kbWFfc2VnW0JGSV9NRU1fU0VHX0ZST01fVEFHKF90YWcsIF9ycXN6KV0uZG1hX2N1cnAgKwlcCisJIEJGSV9NRU1fU0VHX1JFUV9PRkZTRVQoX3RhZywgX3Jxc3opICogKF9ycXN6KSkKKworLyoKICAqIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgSU9DCiAgKi8KIHN0cnVjdCBiZmFfcGNpZGV2X3MgewogCWludAkJcGNpX3Nsb3Q7CiAJdTgJCXBjaV9mdW5jOwogCXUxNgkJZGV2aWNlX2lkOworCXUxNgkJc3NpZDsKIAl2b2lkIF9faW9tZW0JKnBjaV9iYXJfa3ZhOwogfTsKIApAQCAtMTEyLDE4ICsxNzUsNiBAQAogI2RlZmluZSBCRklfU01FTV9DQl9TSVpFCTB4MjAwMDAwVQkvKiAhIDJNQiBmb3IgY3Jvc3Nib3cJKi8KICNkZWZpbmUgQkZJX1NNRU1fQ1RfU0laRQkweDI4MDAwMFUJLyogISAyLjVNQiBmb3IgY2F0YXB1bHQJKi8KIAotCi0jZGVmaW5lIGJmYV9kbWFfYWRkcl9zZXQoZG1hX2FkZHIsIHBhKQlcCi0JCV9fYmZhX2RtYV9hZGRyX3NldCgmZG1hX2FkZHIsICh1NjQpcGEpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19iZmFfZG1hX2FkZHJfc2V0KHVuaW9uIGJmaV9hZGRyX3UgKmRtYV9hZGRyLCB1NjQgcGEpCi17Ci0JZG1hX2FkZHItPmEzMi5hZGRyX2xvID0gKF9fYmUzMikgcGE7Ci0JZG1hX2FkZHItPmEzMi5hZGRyX2hpID0gKF9fYmUzMikgKHBhID4+IDMyKTsKLX0KLQotCiAjZGVmaW5lIGJmYV9kbWFfYmVfYWRkcl9zZXQoZG1hX2FkZHIsIHBhKQlcCiAJCV9fYmZhX2RtYV9iZV9hZGRyX3NldCgmZG1hX2FkZHIsICh1NjQpcGEpCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTEzMywxMSArMTg0LDIyIEBACiAJZG1hX2FkZHItPmEzMi5hZGRyX2hpID0gY3B1X3RvX2JlMzIocGEgPj4gMzIpOwogfQogCisjZGVmaW5lIGJmYV9hbGVuX3NldChfX2FsZW4sIF9fbGVuLCBfX3BhKQlcCisJX19iZmFfYWxlbl9zZXQoX19hbGVuLCBfX2xlbiwgKHU2NClfX3BhKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fYmZhX2FsZW5fc2V0KHN0cnVjdCBiZmlfYWxlbl9zICphbGVuLCB1MzIgbGVuLCB1NjQgcGEpCit7CisJYWxlbi0+YWxfbGVuID0gY3B1X3RvX2JlMzIobGVuKTsKKwliZmFfZG1hX2JlX2FkZHJfc2V0KGFsZW4tPmFsX2FkZHIsIHBhKTsKK30KKwogc3RydWN0IGJmYV9pb2NfcmVnc19zIHsKIAl2b2lkIF9faW9tZW0gKmhmbl9tYm94X2NtZDsKIAl2b2lkIF9faW9tZW0gKmhmbl9tYm94OwogCXZvaWQgX19pb21lbSAqbHB1X21ib3hfY21kOwogCXZvaWQgX19pb21lbSAqbHB1X21ib3g7CisJdm9pZCBfX2lvbWVtICpscHVfcmVhZF9zdGF0OwogCXZvaWQgX19pb21lbSAqcHNzX2N0bF9yZWc7CiAJdm9pZCBfX2lvbWVtICpwc3NfZXJyX3N0YXR1c19yZWc7CiAJdm9pZCBfX2lvbWVtICphcHBfcGxsX2Zhc3RfY3RsX3JlZzsKQEAgLTE5OSwxOCArMjYxLDI2IEBACiB9OwogCiAvKgotICogSGVhcnRiZWF0IGZhaWx1cmUgbm90aWZpY2F0aW9uIHF1ZXVlIGVsZW1lbnQuCisgKiBJT0MgZXZlbnQgbm90aWZpY2F0aW9uIG1lY2hhbmlzbS4KICAqLwotc3RydWN0IGJmYV9pb2NfaGJmYWlsX25vdGlmeV9zIHsKK2VudW0gYmZhX2lvY19ldmVudF9lIHsKKwlCRkFfSU9DX0VfRU5BQkxFRAk9IDEsCisJQkZBX0lPQ19FX0RJU0FCTEVECT0gMiwKKwlCRkFfSU9DX0VfRkFJTEVECT0gMywKK307CisKK3R5cGVkZWYgdm9pZCAoKmJmYV9pb2Nfbm90aWZ5X2NiZm5fdCkodm9pZCAqLCBlbnVtIGJmYV9pb2NfZXZlbnRfZSk7CisKK3N0cnVjdCBiZmFfaW9jX25vdGlmeV9zIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlxZTsKLQliZmFfaW9jX2hiZmFpbF9jYmZuX3QJY2JmbjsKKwliZmFfaW9jX25vdGlmeV9jYmZuX3QJY2JmbjsKIAl2b2lkCQkJKmNiYXJnOwogfTsKIAogLyoKLSAqIEluaXRpYWxpemUgYSBoZWFydGJlYXQgZmFpbHVyZSBub3RpZmljYXRpb24gc3RydWN0dXJlCisgKiBJbml0aWFsaXplIGEgSU9DIGV2ZW50IG5vdGlmaWNhdGlvbiBzdHJ1Y3R1cmUKICAqLwotI2RlZmluZSBiZmFfaW9jX2hiZmFpbF9pbml0KF9fbm90aWZ5LCBfX2NiZm4sIF9fY2JhcmcpIGRvIHsJXAorI2RlZmluZSBiZmFfaW9jX25vdGlmeV9pbml0KF9fbm90aWZ5LCBfX2NiZm4sIF9fY2JhcmcpIGRvIHsJXAogCShfX25vdGlmeSktPmNiZm4gPSAoX19jYmZuKTsgICAgICBcCiAJKF9fbm90aWZ5KS0+Y2JhcmcgPSAoX19jYmFyZyk7ICAgICAgXAogfSB3aGlsZSAoMCkKQEAgLTIxOCw4ICsyODgsOSBAQAogc3RydWN0IGJmYV9pb2NwZl9zIHsKIAliZmFfZnNtX3QJCWZzbTsKIAlzdHJ1Y3QgYmZhX2lvY19zCSppb2M7Ci0JdTMyCQlyZXRyeV9jb3VudDsKKwliZmFfYm9vbGVhbl90CQlmd19taXNtYXRjaF9ub3RpZmllZDsKIAliZmFfYm9vbGVhbl90CQlhdXRvX3JlY292ZXI7CisJdTMyCQkJcG9sbF90aW1lOwogfTsKIAogc3RydWN0IGJmYV9pb2NfcyB7CkBAIC0yMzEsMTcgKzMwMiwxNSBAQAogCXN0cnVjdCBiZmFfdGltZXJfcwlzZW1fdGltZXI7CiAJc3RydWN0IGJmYV90aW1lcl9zCWhiX3RpbWVyOwogCXUzMgkJaGJfY291bnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJaGJfbm90aWZ5X3E7CisJc3RydWN0IGxpc3RfaGVhZAlub3RpZnlfcTsKIAl2b2lkCQkJKmRiZ19md3NhdmU7CiAJaW50CQkJZGJnX2Z3c2F2ZV9sZW47CiAJYmZhX2Jvb2xlYW5fdAkJZGJnX2Z3c2F2ZV9vbmNlOwotCWVudW0gYmZpX21jbGFzcwkJaW9jX21jOworCWVudW0gYmZpX3BjaWZuX2NsYXNzCWNsc2NvZGU7CiAJc3RydWN0IGJmYV9pb2NfcmVnc19zCWlvY19yZWdzOwogCXN0cnVjdCBiZmFfdHJjX21vZF9zCSp0cmNtb2Q7CiAJc3RydWN0IGJmYV9pb2NfZHJ2X3N0YXRzX3MJc3RhdHM7CiAJYmZhX2Jvb2xlYW5fdAkJZmNtb2RlOwotCWJmYV9ib29sZWFuX3QJCWN0ZGV2OwotCWJmYV9ib29sZWFuX3QJCWNuYTsKIAliZmFfYm9vbGVhbl90CQlwbGxpbml0OwogCWJmYV9ib29sZWFuX3QJCXN0YXRzX2J1c3k7CS8qICBvdXRzdGFuZGluZyBzdGF0cyAqLwogCXU4CQkJcG9ydF9pZDsKQEAgLTI1MSwxMCArMzIwLDE3IEBACiAJc3RydWN0IGJmYV9pb2NfbWJveF9tb2RfcyBtYm94X21vZDsKIAlzdHJ1Y3QgYmZhX2lvY19od2lmX3MJKmlvY19od2lmOwogCXN0cnVjdCBiZmFfaW9jcGZfcwlpb2NwZjsKKwllbnVtIGJmaV9hc2ljX2dlbglhc2ljX2dlbjsKKwllbnVtIGJmaV9hc2ljX21vZGUJYXNpY19tb2RlOworCWVudW0gYmZpX3BvcnRfbW9kZQlwb3J0MF9tb2RlOworCWVudW0gYmZpX3BvcnRfbW9kZQlwb3J0MV9tb2RlOworCWVudW0gYmZhX21vZGVfcwkJcG9ydF9tb2RlOworCXU4CQkJYWRfY2FwX2JtOwkvKiBhZGFwdGVyIGNhcCBiaXQgbWFzayAqLworCXU4CQkJcG9ydF9tb2RlX2NmZzsJLyogY29uZmlnIHBvcnQgbW9kZSAqLwogfTsKIAogc3RydWN0IGJmYV9pb2NfaHdpZl9zIHsKLQliZmFfc3RhdHVzX3QgKCppb2NfcGxsX2luaXQpICh2b2lkIF9faW9tZW0gKnJiLCBiZmFfYm9vbGVhbl90IGZjbW9kZSk7CisJYmZhX3N0YXR1c190ICgqaW9jX3BsbF9pbml0KSAodm9pZCBfX2lvbWVtICpyYiwgZW51bSBiZmlfYXNpY19tb2RlIG0pOwogCWJmYV9ib29sZWFuX3QJKCppb2NfZmlybXdhcmVfbG9jaykJKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiAJdm9pZAkJKCppb2NfZmlybXdhcmVfdW5sb2NrKQkoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIAl2b2lkCQkoKmlvY19yZWdfaW5pdCkJKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CkBAIC0yNjgsMTIgKzM0NCwzNTYgQEAKIAl2b2lkCQkoKmlvY19zeW5jX2xlYXZlKQkoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIAl2b2lkCQkoKmlvY19zeW5jX2FjaykJCShzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogCWJmYV9ib29sZWFuX3QJKCppb2Nfc3luY19jb21wbGV0ZSkJKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CisJYmZhX2Jvb2xlYW5fdAkoKmlvY19scHVfcmVhZF9zdGF0KQkoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIH07CiAKKy8qCisgKiBRdWV1ZSBlbGVtZW50IHRvIHdhaXQgZm9yIHJvb20gaW4gcmVxdWVzdCBxdWV1ZS4gRklGTyBvcmRlciBpcworICogbWFpbnRhaW5lZCB3aGVuIGZ1bGxmaWxsaW5nIHJlcXVlc3RzLgorICovCitzdHJ1Y3QgYmZhX3JlcXFfd2FpdF9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXFlOworCXZvaWQJKCpxcmVzdW1lKSAodm9pZCAqY2JhcmcpOworCXZvaWQJKmNiYXJnOworfTsKKwordHlwZWRlZiB2b2lkCSgqYmZhX2NiX2NiZm5fdCkgKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKKworLyoKKyAqIEdlbmVyaWMgQkZBIGNhbGxiYWNrIGVsZW1lbnQuCisgKi8KK3N0cnVjdCBiZmFfY2JfcWVfcyB7CisJc3RydWN0IGxpc3RfaGVhZAlxZTsKKwliZmFfY2JfY2Jmbl90CWNiZm47CisJYmZhX2Jvb2xlYW5fdAlvbmNlOworCXZvaWQJCSpjYmFyZzsKK307CisKKy8qCisgKiBBU0lDIGJsb2NrIGNvbmZpZ3VydGlvbiByZWxhdGVkCisgKi8KKwordHlwZWRlZiB2b2lkICgqYmZhX2FibGtfY2Jmbl90KSh2b2lkICosIGVudW0gYmZhX3N0YXR1cyk7CisKK3N0cnVjdCBiZmFfYWJsa19zIHsKKwlzdHJ1Y3QgYmZhX2lvY19zCSppb2M7CisJc3RydWN0IGJmYV9hYmxrX2NmZ19zCSpjZmc7CisJdTE2CQkJKnBjaWZuOworCXN0cnVjdCBiZmFfZG1hX3MJZG1hX2FkZHI7CisJYmZhX2Jvb2xlYW5fdAkJYnVzeTsKKwlzdHJ1Y3QgYmZhX21ib3hfY21kX3MJbWI7CisJYmZhX2FibGtfY2Jmbl90CQljYmZuOworCXZvaWQJCQkqY2Jhcmc7CisJc3RydWN0IGJmYV9pb2Nfbm90aWZ5X3MJaW9jX25vdGlmeTsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcwlhYmxrX2RtYTsKK307CisjZGVmaW5lIEJGQV9NRU1fQUJMS19ETUEoX19iZmEpCQkoJigoX19iZmEpLT5tb2R1bGVzLmFibGsuYWJsa19kbWEpKQorCisvKgorICoJU0ZQIG1vZHVsZSBzcGVjaWZpYworICovCit0eXBlZGVmIHZvaWQJKCpiZmFfY2Jfc2ZwX3QpICh2b2lkICpjYmFyZywgYmZhX3N0YXR1c190IHN0YXR1cyk7CisKK3N0cnVjdCBiZmFfc2ZwX3MgeworCXZvaWQJKmRldjsKKwlzdHJ1Y3QgYmZhX2lvY19zCSppb2M7CisJc3RydWN0IGJmYV90cmNfbW9kX3MJKnRyY21vZDsKKwlzdHJ1Y3Qgc2ZwX21lbV9zCSpzZnBtZW07CisJYmZhX2NiX3NmcF90CQljYmZuOworCXZvaWQJCQkqY2Jhcmc7CisJZW51bSBiZmlfc2ZwX21lbV9lCW1lbXR5cGU7IC8qIG1lbSBhY2Nlc3MgdHlwZSAgICovCisJdTMyCQkJc3RhdHVzOworCXN0cnVjdCBiZmFfbWJveF9jbWRfcwltYmNtZDsKKwl1OAkJCSpkYnVmX2t2YTsgLyogZG1hIGJ1ZiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwl1NjQJCQlkYnVmX3BhOyAgIC8qIGRtYSBidWYgcGh5c2ljYWwgYWRkcmVzcyAqLworCXN0cnVjdCBiZmFfaW9jX25vdGlmeV9zCWlvY19ub3RpZnk7CisJZW51bSBiZmFfZGVmc19zZnBfbWVkaWFfZSAqbWVkaWE7CisJZW51bSBiZmFfcG9ydF9zcGVlZAlwb3J0c3BlZWQ7CisJYmZhX2NiX3NmcF90CQlzdGF0ZV9xdWVyeV9jYmZuOworCXZvaWQJCQkqc3RhdGVfcXVlcnlfY2Jhcmc7CisJdTgJCQlsb2NrOworCXU4CQkJZGF0YV92YWxpZDsgLyogZGF0YSBpbiBkYnVmIGlzIHZhbGlkICovCisJdTgJCQlzdGF0ZTsJICAgIC8qIHNmcCBzdGF0ZSAgKi8KKwl1OAkJCXN0YXRlX3F1ZXJ5X2xvY2s7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MJc2ZwX2RtYTsKKwl1OAkJCWlzX2VsYjsJICAgIC8qIGVsb29wYmFjayAgKi8KK307CisKKyNkZWZpbmUgQkZBX1NGUF9NT0QoX19iZmEpCSgmKF9fYmZhKS0+bW9kdWxlcy5zZnApCisjZGVmaW5lIEJGQV9NRU1fU0ZQX0RNQShfX2JmYSkJKCYoQkZBX1NGUF9NT0QoX19iZmEpLT5zZnBfZG1hKSkKKwordTMyCWJmYV9zZnBfbWVtaW5mbyh2b2lkKTsKKwordm9pZAliZmFfc2ZwX2F0dGFjaChzdHJ1Y3QgYmZhX3NmcF9zICpzZnAsIHN0cnVjdCBiZmFfaW9jX3MgKmlvYywKKwkJCXZvaWQgKmRldiwgc3RydWN0IGJmYV90cmNfbW9kX3MgKnRyY21vZCk7CisKK3ZvaWQJYmZhX3NmcF9tZW1jbGFpbShzdHJ1Y3QgYmZhX3NmcF9zICpkaWFnLCB1OCAqZG1fa3ZhLCB1NjQgZG1fcGEpOwordm9pZAliZmFfc2ZwX2ludHIodm9pZCAqYmZhYXJnLCBzdHJ1Y3QgYmZpX21ibXNnX3MgKm1zZyk7CisKK2JmYV9zdGF0dXNfdAliZmFfc2ZwX3Nob3coc3RydWN0IGJmYV9zZnBfcyAqc2ZwLCBzdHJ1Y3Qgc2ZwX21lbV9zICpzZnBtZW0sCisJCQkgICAgIGJmYV9jYl9zZnBfdCBjYmZuLCB2b2lkICpjYmFyZyk7CisKK2JmYV9zdGF0dXNfdAliZmFfc2ZwX21lZGlhKHN0cnVjdCBiZmFfc2ZwX3MgKnNmcCwKKwkJCWVudW0gYmZhX2RlZnNfc2ZwX21lZGlhX2UgKm1lZGlhLAorCQkJYmZhX2NiX3NmcF90IGNiZm4sIHZvaWQgKmNiYXJnKTsKKworYmZhX3N0YXR1c190CWJmYV9zZnBfc3BlZWQoc3RydWN0IGJmYV9zZnBfcyAqc2ZwLAorCQkJZW51bSBiZmFfcG9ydF9zcGVlZCBwb3J0c3BlZWQsCisJCQliZmFfY2Jfc2ZwX3QgY2Jmbiwgdm9pZCAqY2JhcmcpOworCisvKgorICoJRmxhc2ggbW9kdWxlIHNwZWNpZmljCisgKi8KK3R5cGVkZWYgdm9pZAkoKmJmYV9jYl9mbGFzaF90KSAodm9pZCAqY2JhcmcsIGJmYV9zdGF0dXNfdCBzdGF0dXMpOworCitzdHJ1Y3QgYmZhX2ZsYXNoX3MgeworCXN0cnVjdCBiZmFfaW9jX3MgKmlvYzsJCS8qIGJhY2sgcG9pbnRlciB0byBpb2MgKi8KKwlzdHJ1Y3QgYmZhX3RyY19tb2RfcyAqdHJjbW9kOworCXUzMgkJdHlwZTsgICAgICAgICAgIC8qIHBhcnRpdGlvbiB0eXBlICovCisJdTgJCWluc3RhbmNlOyAgICAgICAvKiBwYXJ0aXRpb24gaW5zdGFuY2UgKi8KKwl1OAkJcnN2WzNdOworCXUzMgkJb3BfYnVzeTsgICAgICAgIC8qICBvcGVyYXRpb24gYnVzeSBmbGFnICovCisJdTMyCQlyZXNpZHVlOyAgICAgICAgLyogIHJlc2lkdWFsIGxlbmd0aCAqLworCXUzMgkJb2Zmc2V0OyAgICAgICAgIC8qICBvZmZzZXQgKi8KKwliZmFfc3RhdHVzX3QJc3RhdHVzOyAgICAgICAgIC8qICBzdGF0dXMgKi8KKwl1OAkJKmRidWZfa3ZhOyAgICAgIC8qICBkbWEgYnVmIHZpcnR1YWwgYWRkcmVzcyAqLworCXU2NAkJZGJ1Zl9wYTsgICAgICAgIC8qICBkbWEgYnVmIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYmZhX3JlcXFfd2FpdF9zCXJlcXFfd2FpdDsgLyogIHRvIHdhaXQgZm9yIHJvb20gaW4gcmVxcSAqLworCWJmYV9jYl9mbGFzaF90CWNiZm47ICAgICAgICAgICAvKiAgdXNlciBjYWxsYmFjayBmdW5jdGlvbiAqLworCXZvaWQJCSpjYmFyZzsgICAgICAgICAvKiAgdXNlciBjYWxsYmFjayBhcmcgKi8KKwl1OAkJKnVidWY7ICAgICAgICAgIC8qICB1c2VyIHN1cHBsaWVkIGJ1ZmZlciAqLworCXN0cnVjdCBiZmFfY2JfcWVfcwloY2JfcWU7IC8qICBjb21wOiBCRkEgY2FsbGJhY2sgcWVsZW0gKi8KKwl1MzIJCWFkZHJfb2ZmOyAgICAgICAvKiAgcGFydGl0aW9uIGFkZHJlc3Mgb2Zmc2V0ICovCisJc3RydWN0IGJmYV9tYm94X2NtZF9zCW1iOyAgICAgICAvKiAgbWFpbGJveCAqLworCXN0cnVjdCBiZmFfaW9jX25vdGlmeV9zCWlvY19ub3RpZnk7IC8qICBpb2MgZXZlbnQgbm90aWZ5ICovCisJc3RydWN0IGJmYV9tZW1fZG1hX3MJZmxhc2hfZG1hOworfTsKKworI2RlZmluZSBCRkFfRkxBU0goX19iZmEpCQkoJihfX2JmYSktPm1vZHVsZXMuZmxhc2gpCisjZGVmaW5lIEJGQV9NRU1fRkxBU0hfRE1BKF9fYmZhKQkoJihCRkFfRkxBU0goX19iZmEpLT5mbGFzaF9kbWEpKQorCitiZmFfc3RhdHVzX3QgYmZhX2ZsYXNoX2dldF9hdHRyKHN0cnVjdCBiZmFfZmxhc2hfcyAqZmxhc2gsCisJCQlzdHJ1Y3QgYmZhX2ZsYXNoX2F0dHJfcyAqYXR0ciwKKwkJCWJmYV9jYl9mbGFzaF90IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdCBiZmFfZmxhc2hfZXJhc2VfcGFydChzdHJ1Y3QgYmZhX2ZsYXNoX3MgKmZsYXNoLAorCQkJZW51bSBiZmFfZmxhc2hfcGFydF90eXBlIHR5cGUsIHU4IGluc3RhbmNlLAorCQkJYmZhX2NiX2ZsYXNoX3QgY2Jmbiwgdm9pZCAqY2JhcmcpOworYmZhX3N0YXR1c190IGJmYV9mbGFzaF91cGRhdGVfcGFydChzdHJ1Y3QgYmZhX2ZsYXNoX3MgKmZsYXNoLAorCQkJZW51bSBiZmFfZmxhc2hfcGFydF90eXBlIHR5cGUsIHU4IGluc3RhbmNlLAorCQkJdm9pZCAqYnVmLCB1MzIgbGVuLCB1MzIgb2Zmc2V0LAorCQkJYmZhX2NiX2ZsYXNoX3QgY2Jmbiwgdm9pZCAqY2JhcmcpOworYmZhX3N0YXR1c190IGJmYV9mbGFzaF9yZWFkX3BhcnQoc3RydWN0IGJmYV9mbGFzaF9zICpmbGFzaCwKKwkJCWVudW0gYmZhX2ZsYXNoX3BhcnRfdHlwZSB0eXBlLCB1OCBpbnN0YW5jZSwgdm9pZCAqYnVmLAorCQkJdTMyIGxlbiwgdTMyIG9mZnNldCwgYmZhX2NiX2ZsYXNoX3QgY2Jmbiwgdm9pZCAqY2JhcmcpOwordTMyCWJmYV9mbGFzaF9tZW1pbmZvKGJmYV9ib29sZWFuX3QgbWluY2ZnKTsKK3ZvaWQgYmZhX2ZsYXNoX2F0dGFjaChzdHJ1Y3QgYmZhX2ZsYXNoX3MgKmZsYXNoLCBzdHJ1Y3QgYmZhX2lvY19zICppb2MsCisJCXZvaWQgKmRldiwgc3RydWN0IGJmYV90cmNfbW9kX3MgKnRyY21vZCwgYmZhX2Jvb2xlYW5fdCBtaW5jZmcpOwordm9pZCBiZmFfZmxhc2hfbWVtY2xhaW0oc3RydWN0IGJmYV9mbGFzaF9zICpmbGFzaCwKKwkJdTggKmRtX2t2YSwgdTY0IGRtX3BhLCBiZmFfYm9vbGVhbl90IG1pbmNmZyk7CisKKy8qCisgKglESUFHIG1vZHVsZSBzcGVjaWZpYworICovCisKK3R5cGVkZWYgdm9pZCAoKmJmYV9jYl9kaWFnX3QpICh2b2lkICpjYmFyZywgYmZhX3N0YXR1c190IHN0YXR1cyk7Cit0eXBlZGVmIHZvaWQgKCpiZmFfY2JfZGlhZ19iZWFjb25fdCkgKHZvaWQgKmRldiwgYmZhX2Jvb2xlYW5fdCBiZWFjb24sCisJCQliZmFfYm9vbGVhbl90IGxpbmtfZTJlX2JlYWNvbik7CisKKy8qCisgKiAgICAgIEZpcm13YXJlIHBpbmcgdGVzdCByZXN1bHRzCisgKi8KK3N0cnVjdCBiZmFfZGlhZ19yZXN1bHRzX2Z3cGluZyB7CisJdTMyICAgICBkYXRhOyAgIC8qIHN0b3JlIHRoZSBjb3JydXB0ZWQgZGF0YSAqLworCXUzMiAgICAgc3RhdHVzOworCXUzMiAgICAgZG1hc3RhdHVzOworCXU4ICAgICAgcnN2ZFs0XTsKK307CisKK3N0cnVjdCBiZmFfZGlhZ19xdGVzdF9yZXN1bHRfcyB7CisJdTMyCXN0YXR1czsKKwl1MTYJY291bnQ7CS8qIHN1Y2Vzc2Z1bCBxdWV1ZSB0ZXN0IGNvdW50ICovCisJdTgJcXVldWU7CisJdTgJcnN2ZDsJLyogNjQtYml0IGFsaWduICovCit9OworCisvKgorICogRmlybXdhcmUgcGluZyB0ZXN0IHJlc3VsdHMKKyAqLworc3RydWN0IGJmYV9kaWFnX2Z3cGluZ19zIHsKKwlzdHJ1Y3QgYmZhX2RpYWdfcmVzdWx0c19md3BpbmcgKnJlc3VsdDsKKwliZmFfY2JfZGlhZ190ICBjYmZuOworCXZvaWQgICAgICAgICAgICAqY2Jhcmc7CisJdTMyICAgICAgICAgICAgIGRhdGE7CisJdTggICAgICAgICAgICAgIGxvY2s7CisJdTggICAgICAgICAgICAgIHJzdlszXTsKKwl1MzIgICAgICAgICAgICAgc3RhdHVzOworCXUzMiAgICAgICAgICAgICBjb3VudDsKKwlzdHJ1Y3QgYmZhX21ib3hfY21kX3MgICBtYmNtZDsKKwl1OCAgICAgICAgICAgICAgKmRidWZfa3ZhOyAgICAgIC8qIGRtYSBidWYgdmlydHVhbCBhZGRyZXNzICovCisJdTY0ICAgICAgICAgICAgIGRidWZfcGE7ICAgICAgICAvKiBkbWEgYnVmIHBoeXNpY2FsIGFkZHJlc3MgKi8KK307CisKKy8qCisgKiAgICAgIFRlbXBlcmF0dXJlIHNlbnNvciBxdWVyeSByZXN1bHRzCisgKi8KK3N0cnVjdCBiZmFfZGlhZ19yZXN1bHRzX3RlbXBzZW5zb3JfcyB7CisJdTMyICAgICBzdGF0dXM7CisJdTE2ICAgICB0ZW1wOyAgICAgICAgICAgLyogMTAtYml0IEEvRCB2YWx1ZSAqLworCXUxNiAgICAgYnJkX3RlbXA7ICAgICAgIC8qIDktYml0IGJvYXJkIHRlbXAgKi8KKwl1OCAgICAgIHRzX2p1bmM7ICAgICAgICAvKiBzaG93IGp1bmN0aW9uIHRlbXBzZW5zb3IgICAqLworCXU4ICAgICAgdHNfYnJkOyAgICAgICAgIC8qIHNob3cgYm9hcmQgdGVtcHNlbnNvciAgICAgICovCisJdTggICAgICByc3ZkWzZdOyAgICAgICAgLyoga2VlcCA4IGJ5dGVzIGFsaWdubWVudCAgICAgKi8KK307CisKK3N0cnVjdCBiZmFfZGlhZ190c2Vuc29yX3MgeworCWJmYV9jYl9kaWFnX3QgICBjYmZuOworCXZvaWQgICAgICAgICAgICAqY2Jhcmc7CisJc3RydWN0IGJmYV9kaWFnX3Jlc3VsdHNfdGVtcHNlbnNvcl9zICp0ZW1wOworCXU4ICAgICAgICAgICAgICBsb2NrOworCXU4ICAgICAgICAgICAgICByc3ZbM107CisJdTMyICAgICAgICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgYmZhX21ib3hfY21kX3MgICBtYmNtZDsKK307CisKK3N0cnVjdCBiZmFfZGlhZ19zZnBzaG93X3MgeworCXN0cnVjdCBzZnBfbWVtX3MgICAgICAgICpzZnBtZW07CisJYmZhX2NiX2RpYWdfdCAgICAgICAgICAgY2JmbjsKKwl2b2lkICAgICAgICAgICAgICAgICAgICAqY2Jhcmc7CisJdTggICAgICBsb2NrOworCXU4ICAgICAgc3RhdGljX2RhdGE7CisJdTggICAgICByc3ZbMl07CisJdTMyICAgICBzdGF0dXM7CisJc3RydWN0IGJmYV9tYm94X2NtZF9zICAgIG1iY21kOworCXU4ICAgICAgKmRidWZfa3ZhOyAgICAgIC8qIGRtYSBidWYgdmlydHVhbCBhZGRyZXNzICovCisJdTY0ICAgICBkYnVmX3BhOyAgICAgICAgLyogZG1hIGJ1ZiBwaHlzaWNhbCBhZGRyZXNzICovCit9OworCitzdHJ1Y3QgYmZhX2RpYWdfbGVkX3MgeworCXN0cnVjdCBiZmFfbWJveF9jbWRfcyAgIG1iY21kOworCWJmYV9ib29sZWFuX3QgICBsb2NrOyAgIC8qIDE6IGxlZHRlc3QgaXMgb3BlcmF0aW5nICovCit9OworCitzdHJ1Y3QgYmZhX2RpYWdfYmVhY29uX3MgeworCXN0cnVjdCBiZmFfbWJveF9jbWRfcyAgIG1iY21kOworCWJmYV9ib29sZWFuX3QgICBzdGF0ZTsgICAgICAgICAgLyogcG9ydCBiZWFjb24gc3RhdGUgKi8KKwliZmFfYm9vbGVhbl90ICAgbGlua19lMmU7ICAgICAgIC8qIGxpbmsgYmVhY29uIHN0YXRlICovCit9OworCitzdHJ1Y3QgYmZhX2RpYWdfcyB7CisJdm9pZAkqZGV2OworCXN0cnVjdCBiZmFfaW9jX3MJCSppb2M7CisJc3RydWN0IGJmYV90cmNfbW9kX3MJCSp0cmNtb2Q7CisJc3RydWN0IGJmYV9kaWFnX2Z3cGluZ19zCWZ3cGluZzsKKwlzdHJ1Y3QgYmZhX2RpYWdfdHNlbnNvcl9zCXRzZW5zb3I7CisJc3RydWN0IGJmYV9kaWFnX3NmcHNob3dfcwlzZnBzaG93OworCXN0cnVjdCBiZmFfZGlhZ19sZWRfcwkJbGVkdGVzdDsKKwlzdHJ1Y3QgYmZhX2RpYWdfYmVhY29uX3MJYmVhY29uOworCXZvaWQJKnJlc3VsdDsKKwlzdHJ1Y3QgYmZhX3RpbWVyX3MgdGltZXI7CisJYmZhX2NiX2RpYWdfYmVhY29uX3QgIGNiZm5fYmVhY29uOworCWJmYV9jYl9kaWFnX3QgIGNiZm47CisJdm9pZAkJKmNiYXJnOworCXU4CQlibG9jazsKKwl1OAkJdGltZXJfYWN0aXZlOworCXU4CQlyc3ZkWzJdOworCXUzMgkJc3RhdHVzOworCXN0cnVjdCBiZmFfaW9jX25vdGlmeV9zCWlvY19ub3RpZnk7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MJZGlhZ19kbWE7Cit9OworCisjZGVmaW5lIEJGQV9ESUFHX01PRChfX2JmYSkgICAgICgmKF9fYmZhKS0+bW9kdWxlcy5kaWFnX21vZCkKKyNkZWZpbmUgQkZBX01FTV9ESUFHX0RNQShfX2JmYSkgKCYoQkZBX0RJQUdfTU9EKF9fYmZhKS0+ZGlhZ19kbWEpKQorCit1MzIJYmZhX2RpYWdfbWVtaW5mbyh2b2lkKTsKK3ZvaWQgYmZhX2RpYWdfbWVtY2xhaW0oc3RydWN0IGJmYV9kaWFnX3MgKmRpYWcsIHU4ICpkbV9rdmEsIHU2NCBkbV9wYSk7Cit2b2lkIGJmYV9kaWFnX2F0dGFjaChzdHJ1Y3QgYmZhX2RpYWdfcyAqZGlhZywgc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICpkZXYsCisJCSAgICAgYmZhX2NiX2RpYWdfYmVhY29uX3QgY2Jmbl9iZWFjb24sCisJCSAgICAgc3RydWN0IGJmYV90cmNfbW9kX3MgKnRyY21vZCk7CitiZmFfc3RhdHVzX3QJYmZhX2RpYWdfcmVnX3JlYWQoc3RydWN0IGJmYV9kaWFnX3MgKmRpYWcsIHUzMiBvZmZzZXQsCisJCQl1MzIgbGVuLCB1MzIgKmJ1ZiwgdTMyIGZvcmNlKTsKK2JmYV9zdGF0dXNfdAliZmFfZGlhZ19yZWdfd3JpdGUoc3RydWN0IGJmYV9kaWFnX3MgKmRpYWcsIHUzMiBvZmZzZXQsCisJCQl1MzIgbGVuLCB1MzIgdmFsdWUsIHUzMiBmb3JjZSk7CitiZmFfc3RhdHVzX3QJYmZhX2RpYWdfdHNlbnNvcl9xdWVyeShzdHJ1Y3QgYmZhX2RpYWdfcyAqZGlhZywKKwkJCXN0cnVjdCBiZmFfZGlhZ19yZXN1bHRzX3RlbXBzZW5zb3JfcyAqcmVzdWx0LAorCQkJYmZhX2NiX2RpYWdfdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QJYmZhX2RpYWdfZndwaW5nKHN0cnVjdCBiZmFfZGlhZ19zICpkaWFnLCB1MzIgY250LAorCQkJdTMyIHBhdHRlcm4sIHN0cnVjdCBiZmFfZGlhZ19yZXN1bHRzX2Z3cGluZyAqcmVzdWx0LAorCQkJYmZhX2NiX2RpYWdfdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QJYmZhX2RpYWdfc2Zwc2hvdyhzdHJ1Y3QgYmZhX2RpYWdfcyAqZGlhZywKKwkJCXN0cnVjdCBzZnBfbWVtX3MgKnNmcG1lbSwgdTggc3RhdGljX2RhdGEsCisJCQliZmFfY2JfZGlhZ190IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdAliZmFfZGlhZ19tZW10ZXN0KHN0cnVjdCBiZmFfZGlhZ19zICpkaWFnLAorCQkJc3RydWN0IGJmYV9kaWFnX21lbXRlc3RfcyAqbWVtdGVzdCwgdTMyIHBhdHRlcm4sCisJCQlzdHJ1Y3QgYmZhX2RpYWdfbWVtdGVzdF9yZXN1bHQgKnJlc3VsdCwKKwkJCWJmYV9jYl9kaWFnX3QgY2Jmbiwgdm9pZCAqY2JhcmcpOworYmZhX3N0YXR1c190CWJmYV9kaWFnX2xlZHRlc3Qoc3RydWN0IGJmYV9kaWFnX3MgKmRpYWcsCisJCQlzdHJ1Y3QgYmZhX2RpYWdfbGVkdGVzdF9zICpsZWR0ZXN0KTsKK2JmYV9zdGF0dXNfdAliZmFfZGlhZ19iZWFjb25fcG9ydChzdHJ1Y3QgYmZhX2RpYWdfcyAqZGlhZywKKwkJCWJmYV9ib29sZWFuX3QgYmVhY29uLCBiZmFfYm9vbGVhbl90IGxpbmtfZTJlX2JlYWNvbiwKKwkJCXUzMiBzZWMpOworCisvKgorICoJUEhZIG1vZHVsZSBzcGVjaWZpYworICovCit0eXBlZGVmIHZvaWQgKCpiZmFfY2JfcGh5X3QpICh2b2lkICpjYmFyZywgYmZhX3N0YXR1c190IHN0YXR1cyk7CisKK3N0cnVjdCBiZmFfcGh5X3MgeworCXN0cnVjdCBiZmFfaW9jX3MgKmlvYzsgICAgICAgICAgLyogYmFjayBwb2ludGVyIHRvIGlvYyAqLworCXN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtb2Q7ICAgLyogdHJhY2UgbW9kdWxlICovCisJdTgJaW5zdGFuY2U7ICAgICAgIC8qIHBvcnQgaW5zdGFuY2UgKi8KKwl1OAlvcF9idXN5OyAgICAgICAgLyogb3BlcmF0aW9uIGJ1c3kgZmxhZyAqLworCXU4CXJzdlsyXTsKKwl1MzIJcmVzaWR1ZTsgICAgICAgIC8qIHJlc2lkdWFsIGxlbmd0aCAqLworCXUzMglvZmZzZXQ7ICAgICAgICAgLyogb2Zmc2V0ICovCisJYmZhX3N0YXR1c190CXN0YXR1czsgICAgICAgICAvKiBzdGF0dXMgKi8KKwl1OAkqZGJ1Zl9rdmE7ICAgICAgLyogZG1hIGJ1ZiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwl1NjQJZGJ1Zl9wYTsgICAgICAgIC8qIGRtYSBidWYgcGh5c2ljYWwgYWRkcmVzcyAqLworCXN0cnVjdCBiZmFfcmVxcV93YWl0X3MgcmVxcV93YWl0OyAvKiB0byB3YWl0IGZvciByb29tIGluIHJlcXEgKi8KKwliZmFfY2JfcGh5X3QJY2JmbjsgICAgICAgICAgIC8qIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKwl2b2lkCQkqY2Jhcmc7ICAgICAgICAgLyogdXNlciBjYWxsYmFjayBhcmcgKi8KKwl1OAkJKnVidWY7ICAgICAgICAgIC8qIHVzZXIgc3VwcGxpZWQgYnVmZmVyICovCisJc3RydWN0IGJmYV9jYl9xZV9zCWhjYl9xZTsgLyogY29tcDogQkZBIGNhbGxiYWNrIHFlbGVtICovCisJdTMyCWFkZHJfb2ZmOyAgICAgICAvKiBwaHkgYWRkcmVzcyBvZmZzZXQgKi8KKwlzdHJ1Y3QgYmZhX21ib3hfY21kX3MJbWI7ICAgICAgIC8qIG1haWxib3ggKi8KKwlzdHJ1Y3QgYmZhX2lvY19ub3RpZnlfcwlpb2Nfbm90aWZ5OyAvKiBpb2MgZXZlbnQgbm90aWZ5ICovCisJc3RydWN0IGJmYV9tZW1fZG1hX3MJcGh5X2RtYTsKK307CisKKyNkZWZpbmUgQkZBX1BIWShfX2JmYSkJKCYoX19iZmEpLT5tb2R1bGVzLnBoeSkKKyNkZWZpbmUgQkZBX01FTV9QSFlfRE1BKF9fYmZhKQkoJihCRkFfUEhZKF9fYmZhKS0+cGh5X2RtYSkpCisKK2JmYV9ib29sZWFuX3QgYmZhX3BoeV9idXN5KHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CitiZmFfc3RhdHVzX3QgYmZhX3BoeV9nZXRfYXR0cihzdHJ1Y3QgYmZhX3BoeV9zICpwaHksIHU4IGluc3RhbmNlLAorCQkJc3RydWN0IGJmYV9waHlfYXR0cl9zICphdHRyLAorCQkJYmZhX2NiX3BoeV90IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdCBiZmFfcGh5X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX3BoeV9zICpwaHksIHU4IGluc3RhbmNlLAorCQkJc3RydWN0IGJmYV9waHlfc3RhdHNfcyAqc3RhdHMsCisJCQliZmFfY2JfcGh5X3QgY2Jmbiwgdm9pZCAqY2JhcmcpOworYmZhX3N0YXR1c190IGJmYV9waHlfdXBkYXRlKHN0cnVjdCBiZmFfcGh5X3MgKnBoeSwgdTggaW5zdGFuY2UsCisJCQl2b2lkICpidWYsIHUzMiBsZW4sIHUzMiBvZmZzZXQsCisJCQliZmFfY2JfcGh5X3QgY2Jmbiwgdm9pZCAqY2JhcmcpOworYmZhX3N0YXR1c190IGJmYV9waHlfcmVhZChzdHJ1Y3QgYmZhX3BoeV9zICpwaHksIHU4IGluc3RhbmNlLAorCQkJdm9pZCAqYnVmLCB1MzIgbGVuLCB1MzIgb2Zmc2V0LAorCQkJYmZhX2NiX3BoeV90IGNiZm4sIHZvaWQgKmNiYXJnKTsKKwordTMyCWJmYV9waHlfbWVtaW5mbyhiZmFfYm9vbGVhbl90IG1pbmNmZyk7Cit2b2lkIGJmYV9waHlfYXR0YWNoKHN0cnVjdCBiZmFfcGh5X3MgKnBoeSwgc3RydWN0IGJmYV9pb2NfcyAqaW9jLAorCQl2b2lkICpkZXYsIHN0cnVjdCBiZmFfdHJjX21vZF9zICp0cmNtb2QsIGJmYV9ib29sZWFuX3QgbWluY2ZnKTsKK3ZvaWQgYmZhX3BoeV9tZW1jbGFpbShzdHJ1Y3QgYmZhX3BoeV9zICpwaHksCisJCXU4ICpkbV9rdmEsIHU2NCBkbV9wYSwgYmZhX2Jvb2xlYW5fdCBtaW5jZmcpOwordm9pZCBiZmFfcGh5X2ludHIodm9pZCAqcGh5YXJnLCBzdHJ1Y3QgYmZpX21ibXNnX3MgKm1zZyk7CisKKy8qCisgKglJT0Mgc3BlY2ZpYyBtYWNyb3MKKyAqLwogI2RlZmluZSBiZmFfaW9jX3BjaWZuKF9faW9jKQkJKChfX2lvYyktPnBjaWRldi5wY2lfZnVuYykKICNkZWZpbmUgYmZhX2lvY19kZXZpZChfX2lvYykJCSgoX19pb2MpLT5wY2lkZXYuZGV2aWNlX2lkKQogI2RlZmluZSBiZmFfaW9jX2JhcjAoX19pb2MpCQkoKF9faW9jKS0+cGNpZGV2LnBjaV9iYXJfa3ZhKQogI2RlZmluZSBiZmFfaW9jX3BvcnRpZChfX2lvYykJCSgoX19pb2MpLT5wb3J0X2lkKQorI2RlZmluZSBiZmFfaW9jX2FzaWNfZ2VuKF9faW9jKQkJKChfX2lvYyktPmFzaWNfZ2VuKQorI2RlZmluZSBiZmFfaW9jX2lzX2NuYShfX2lvYykJXAorCSgoYmZhX2lvY19nZXRfdHlwZShfX2lvYykgPT0gQkZBX0lPQ19UWVBFX0ZDb0UpIHx8CVwKKwkgKGJmYV9pb2NfZ2V0X3R5cGUoX19pb2MpID09IEJGQV9JT0NfVFlQRV9MTCkpCiAjZGVmaW5lIGJmYV9pb2NfZmV0Y2hfc3RhdHMoX19pb2MsIF9fc3RhdHMpIFwKIAkJKCgoX19zdGF0cyktPmRydl9zdGF0cykgPSAoX19pb2MpLT5zdGF0cykKICNkZWZpbmUgYmZhX2lvY19jbHJfc3RhdHMoX19pb2MpCVwKQEAgLTI4NywxMiArNzA3LDkgQEAKIAogI2RlZmluZSBiZmFfaW9jX3N0YXRzKF9pb2MsIF9zdGF0cykJKChfaW9jKS0+c3RhdHMuX3N0YXRzKyspCiAjZGVmaW5lIEJGQV9JT0NfRldJTUdfTUlOU1oJKDE2ICogMTAyNCkKLSNkZWZpbmUgQkZBX0lPQ19GV0lNR19UWVBFKF9faW9jKQkJCQkJXAotCSgoKF9faW9jKS0+Y3RkZXYpID8JCQkJCQlcCi0JICgoKF9faW9jKS0+ZmNtb2RlKSA/IEJGSV9JTUFHRV9DVF9GQyA6IEJGSV9JTUFHRV9DVF9DTkEpIDoJXAotCSBCRklfSU1BR0VfQ0JfRkMpCi0jZGVmaW5lIEJGQV9JT0NfRldfU01FTV9TSVpFKF9faW9jKQkJCQkJXAotCSgoKF9faW9jKS0+Y3RkZXYpID8gQkZJX1NNRU1fQ1RfU0laRSA6IEJGSV9TTUVNX0NCX1NJWkUpCisjZGVmaW5lIEJGQV9JT0NfRldfU01FTV9TSVpFKF9faW9jKQkJCVwKKwkoKGJmYV9pb2NfYXNpY19nZW4oX19pb2MpID09IEJGSV9BU0lDX0dFTl9DQikJXAorCSA/IEJGSV9TTUVNX0NCX1NJWkUgOiBCRklfU01FTV9DVF9TSVpFKQogI2RlZmluZSBCRkFfSU9DX0ZMQVNIX0NIVU5LX05PKG9mZikJCShvZmYgLyBCRklfRkxBU0hfQ0hVTktfU1pfV09SRFMpCiAjZGVmaW5lIEJGQV9JT0NfRkxBU0hfT0ZGU0VUX0lOX0NIVU5LKG9mZikJKG9mZiAlIEJGSV9GTEFTSF9DSFVOS19TWl9XT1JEUykKICNkZWZpbmUgQkZBX0lPQ19GTEFTSF9DSFVOS19BRERSKGNodW5rbm8pICAoY2h1bmtubyAqIEJGSV9GTEFTSF9DSFVOS19TWl9XT1JEUykKQEAgLTMwNSw3ICs3MjIsNyBAQAogCQliZmFfaW9jX21ib3hfbWNmdW5jX3QgKm1jZnVuY3MpOwogdm9pZCBiZmFfaW9jX21ib3hfaXNyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiB2b2lkIGJmYV9pb2NfbWJveF9zZW5kKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdm9pZCAqaW9jX21zZywgaW50IGxlbik7Ci12b2lkIGJmYV9pb2NfbXNnZ2V0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdm9pZCAqbWJtc2cpOworYmZhX2Jvb2xlYW5fdCBiZmFfaW9jX21zZ2dldChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHZvaWQgKm1ibXNnKTsKIHZvaWQgYmZhX2lvY19tYm94X3JlZ2lzcihzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gYmZpX21jbGFzcyBtYywKIAkJYmZhX2lvY19tYm94X21jZnVuY190IGNiZm4sIHZvaWQgKmNiYXJnKTsKIApAQCAtMzE1LDQwICs3MzIsNDkgQEAKIAogI2RlZmluZSBiZmFfaW9jX3BsbF9pbml0X2FzaWMoX19pb2MpIFwKIAkoKF9faW9jKS0+aW9jX2h3aWYtPmlvY19wbGxfaW5pdCgoX19pb2MpLT5wY2lkZXYucGNpX2Jhcl9rdmEsIFwKLQkJCSAgIChfX2lvYyktPmZjbW9kZSkpCisJCQkgICAoX19pb2MpLT5hc2ljX21vZGUpKQogCiBiZmFfc3RhdHVzX3QgYmZhX2lvY19wbGxfaW5pdChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwotYmZhX3N0YXR1c190IGJmYV9pb2NfY2JfcGxsX2luaXQodm9pZCBfX2lvbWVtICpyYiwgYmZhX2Jvb2xlYW5fdCBmY21vZGUpOwotYmZhX2Jvb2xlYW5fdCBiZmFfaW9jX2N0X3BsbF9pbml0X2NvbXBsZXRlKHZvaWQgX19pb21lbSAqcmIpOwotYmZhX3N0YXR1c190IGJmYV9pb2NfY3RfcGxsX2luaXQodm9pZCBfX2lvbWVtICpyYiwgYmZhX2Jvb2xlYW5fdCBmY21vZGUpOworYmZhX3N0YXR1c190IGJmYV9pb2NfY2JfcGxsX2luaXQodm9pZCBfX2lvbWVtICpyYiwgZW51bSBiZmlfYXNpY19tb2RlIG1vZGUpOworYmZhX3N0YXR1c190IGJmYV9pb2NfY3RfcGxsX2luaXQodm9pZCBfX2lvbWVtICpyYiwgZW51bSBiZmlfYXNpY19tb2RlIG1vZGUpOworYmZhX3N0YXR1c190IGJmYV9pb2NfY3QyX3BsbF9pbml0KHZvaWQgX19pb21lbSAqcmIsIGVudW0gYmZpX2FzaWNfbW9kZSBtb2RlKTsKIAotI2RlZmluZQliZmFfaW9jX2lzcl9tb2RlX3NldChfX2lvYywgX19tc2l4KQkJCVwKLQkJCSgoX19pb2MpLT5pb2NfaHdpZi0+aW9jX2lzcl9tb2RlX3NldChfX2lvYywgX19tc2l4KSkKKyNkZWZpbmUgYmZhX2lvY19pc3JfbW9kZV9zZXQoX19pb2MsIF9fbXNpeCkgZG8gewkJCVwKKwlpZiAoKF9faW9jKS0+aW9jX2h3aWYtPmlvY19pc3JfbW9kZV9zZXQpCQkJXAorCQkoKF9faW9jKS0+aW9jX2h3aWYtPmlvY19pc3JfbW9kZV9zZXQoX19pb2MsIF9fbXNpeCkpOwlcCit9IHdoaWxlICgwKQogI2RlZmluZQliZmFfaW9jX293bmVyc2hpcF9yZXNldChfX2lvYykJCQkJXAogCQkJKChfX2lvYyktPmlvY19od2lmLT5pb2Nfb3duZXJzaGlwX3Jlc2V0KF9faW9jKSkKKyNkZWZpbmUgYmZhX2lvY19nZXRfZmNtb2RlKF9faW9jKQkoKF9faW9jKS0+ZmNtb2RlKQorI2RlZmluZSBiZmFfaW9jX2xwdV9yZWFkX3N0YXQoX19pb2MpIGRvIHsJCQlcCisJaWYgKChfX2lvYyktPmlvY19od2lmLT5pb2NfbHB1X3JlYWRfc3RhdCkJCVwKKwkJKChfX2lvYyktPmlvY19od2lmLT5pb2NfbHB1X3JlYWRfc3RhdChfX2lvYykpOwlcCit9IHdoaWxlICgwKQogCi0KLXZvaWQgYmZhX2lvY19zZXRfY3RfaHdpZihzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogdm9pZCBiZmFfaW9jX3NldF9jYl9od2lmKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7Cit2b2lkIGJmYV9pb2Nfc2V0X2N0X2h3aWYoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK3ZvaWQgYmZhX2lvY19zZXRfY3QyX2h3aWYoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK3ZvaWQgYmZhX2lvY19jdDJfcG93ZXJvbihzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogCiB2b2lkIGJmYV9pb2NfYXR0YWNoKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdm9pZCAqYmZhLAogCQlzdHJ1Y3QgYmZhX2lvY19jYmZuX3MgKmNiZm4sIHN0cnVjdCBiZmFfdGltZXJfbW9kX3MgKnRpbWVyX21vZCk7CiB2b2lkIGJmYV9pb2NfYXV0b19yZWNvdmVyKGJmYV9ib29sZWFuX3QgYXV0b19yZWNvdmVyKTsKIHZvaWQgYmZhX2lvY19kZXRhY2goc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIHZvaWQgYmZhX2lvY19wY2lfaW5pdChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldiwKLQkJZW51bSBiZmlfbWNsYXNzIG1jKTsKKwkJZW51bSBiZmlfcGNpZm5fY2xhc3MgY2xzY29kZSk7CiB2b2lkIGJmYV9pb2NfbWVtX2NsYWltKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgIHU4ICpkbV9rdmEsIHU2NCBkbV9wYSk7CiB2b2lkIGJmYV9pb2NfZW5hYmxlKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiB2b2lkIGJmYV9pb2NfZGlzYWJsZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogYmZhX2Jvb2xlYW5fdCBiZmFfaW9jX2ludHhfY2xhaW0oc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIAogdm9pZCBiZmFfaW9jX2Jvb3Qoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB1MzIgYm9vdF90eXBlLAotCQl1MzIgYm9vdF9wYXJhbSk7CisJCXUzMiBib290X2Vudik7CiB2b2lkIGJmYV9pb2NfaXNyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgc3RydWN0IGJmaV9tYm1zZ19zICptc2cpOwogdm9pZCBiZmFfaW9jX2Vycm9yX2lzcihzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogYmZhX2Jvb2xlYW5fdCBiZmFfaW9jX2lzX29wZXJhdGlvbmFsKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBiZmFfYm9vbGVhbl90IGJmYV9pb2NfaXNfaW5pdGlhbGl6ZWQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIGJmYV9ib29sZWFuX3QgYmZhX2lvY19pc19kaXNhYmxlZChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOworYmZhX2Jvb2xlYW5fdCBiZmFfaW9jX2lzX2FjcV9hZGRyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBiZmFfYm9vbGVhbl90IGJmYV9pb2NfZndfbWlzbWF0Y2goc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIGJmYV9ib29sZWFuX3QgYmZhX2lvY19hZGFwdGVyX2lzX2Rpc2FibGVkKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiB2b2lkIGJmYV9pb2NfcmVzZXRfZndzdGF0ZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwpAQCAtMzcyLDggKzc5OCw2IEBACiAJCQkJIGludCAqdHJjbGVuKTsKIGJmYV9zdGF0dXNfdCBiZmFfaW9jX2RlYnVnX2Z3Y29yZShzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHZvaWQgKmJ1ZiwKIAl1MzIgKm9mZnNldCwgaW50ICpidWZsZW4pOwotdm9pZCBiZmFfaW9jX3NldF9mY21vZGUoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKLWJmYV9ib29sZWFuX3QgYmZhX2lvY19nZXRfZmNtb2RlKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBiZmFfYm9vbGVhbl90IGJmYV9pb2Nfc2VtX2dldCh2b2lkIF9faW9tZW0gKnNlbV9yZWcpOwogdm9pZCBiZmFfaW9jX2Z3dmVyX2dldChzdHJ1Y3QgYmZhX2lvY19zICppb2MsCiAJCQlzdHJ1Y3QgYmZpX2lvY19pbWFnZV9oZHJfcyAqZndoZHIpOwpAQCAtMzgzLDYgKzgwNywzMyBAQAogYmZhX3N0YXR1c190IGJmYV9pb2NfZndfc3RhdHNfY2xlYXIoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIAogLyoKKyAqIGFzaWMgYmxvY2sgY29uZmlndXJhdGlvbiByZWxhdGVkIEFQSXMKKyAqLwordTMyCWJmYV9hYmxrX21lbWluZm8odm9pZCk7Cit2b2lkIGJmYV9hYmxrX21lbWNsYWltKHN0cnVjdCBiZmFfYWJsa19zICphYmxrLCB1OCAqZG1hX2t2YSwgdTY0IGRtYV9wYSk7Cit2b2lkIGJmYV9hYmxrX2F0dGFjaChzdHJ1Y3QgYmZhX2FibGtfcyAqYWJsaywgc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKK2JmYV9zdGF0dXNfdCBiZmFfYWJsa19xdWVyeShzdHJ1Y3QgYmZhX2FibGtfcyAqYWJsaywKKwkJc3RydWN0IGJmYV9hYmxrX2NmZ19zICphYmxrX2NmZywKKwkJYmZhX2FibGtfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdCBiZmFfYWJsa19hZGFwdGVyX2NvbmZpZyhzdHJ1Y3QgYmZhX2FibGtfcyAqYWJsaywKKwkJZW51bSBiZmFfbW9kZV9zIG1vZGUsIGludCBtYXhfcGYsIGludCBtYXhfdmYsCisJCWJmYV9hYmxrX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QgYmZhX2FibGtfcG9ydF9jb25maWcoc3RydWN0IGJmYV9hYmxrX3MgKmFibGssIGludCBwb3J0LAorCQllbnVtIGJmYV9tb2RlX3MgbW9kZSwgaW50IG1heF9wZiwgaW50IG1heF92ZiwKKwkJYmZhX2FibGtfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdCBiZmFfYWJsa19wZl9jcmVhdGUoc3RydWN0IGJmYV9hYmxrX3MgKmFibGssIHUxNiAqcGNpZm4sCisJCXU4IHBvcnQsIGVudW0gYmZpX3BjaWZuX2NsYXNzIHBlcnNvbmFsaXR5LCBpbnQgYncsCisJCWJmYV9hYmxrX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QgYmZhX2FibGtfcGZfZGVsZXRlKHN0cnVjdCBiZmFfYWJsa19zICphYmxrLCBpbnQgcGNpZm4sCisJCWJmYV9hYmxrX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QgYmZhX2FibGtfcGZfdXBkYXRlKHN0cnVjdCBiZmFfYWJsa19zICphYmxrLCBpbnQgcGNpZm4sIGludCBidywKKwkJYmZhX2FibGtfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdCBiZmFfYWJsa19vcHRyb21fZW4oc3RydWN0IGJmYV9hYmxrX3MgKmFibGssCisJCWJmYV9hYmxrX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QgYmZhX2FibGtfb3B0cm9tX2RpcyhzdHJ1Y3QgYmZhX2FibGtfcyAqYWJsaywKKwkJYmZhX2FibGtfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKTsKKworLyoKICAqIGJmYSBtZmcgd3duIEFQSSBmdW5jdGlvbnMKICAqLwogbWFjX3QgYmZhX2lvY19nZXRfbWFjKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CkBAIC0zOTEsNTAgKzg0Miw2NCBAQAogLyoKICAqIEYvVyBJbWFnZSBTaXplICYgQ2h1bmsKICAqLwotZXh0ZXJuIHUzMiBiZmlfaW1hZ2VfY3RfZmNfc2l6ZTsKLWV4dGVybiB1MzIgYmZpX2ltYWdlX2N0X2NuYV9zaXplOwotZXh0ZXJuIHUzMiBiZmlfaW1hZ2VfY2JfZmNfc2l6ZTsKLWV4dGVybiB1MzIgKmJmaV9pbWFnZV9jdF9mYzsKLWV4dGVybiB1MzIgKmJmaV9pbWFnZV9jdF9jbmE7Ci1leHRlcm4gdTMyICpiZmlfaW1hZ2VfY2JfZmM7CitleHRlcm4gdTMyIGJmaV9pbWFnZV9jYl9zaXplOworZXh0ZXJuIHUzMiBiZmlfaW1hZ2VfY3Rfc2l6ZTsKK2V4dGVybiB1MzIgYmZpX2ltYWdlX2N0Ml9zaXplOworZXh0ZXJuIHUzMiAqYmZpX2ltYWdlX2NiOworZXh0ZXJuIHUzMiAqYmZpX2ltYWdlX2N0OworZXh0ZXJuIHUzMiAqYmZpX2ltYWdlX2N0MjsKIAogc3RhdGljIGlubGluZSB1MzIgKgotYmZpX2ltYWdlX2N0X2ZjX2dldF9jaHVuayh1MzIgb2ZmKQotewlyZXR1cm4gKHUzMiAqKShiZmlfaW1hZ2VfY3RfZmMgKyBvZmYpOyB9CitiZmlfaW1hZ2VfY2JfZ2V0X2NodW5rKHUzMiBvZmYpCit7CisJcmV0dXJuICh1MzIgKikoYmZpX2ltYWdlX2NiICsgb2ZmKTsKK30KIAogc3RhdGljIGlubGluZSB1MzIgKgotYmZpX2ltYWdlX2N0X2NuYV9nZXRfY2h1bmsodTMyIG9mZikKLXsJcmV0dXJuICh1MzIgKikoYmZpX2ltYWdlX2N0X2NuYSArIG9mZik7IH0KK2JmaV9pbWFnZV9jdF9nZXRfY2h1bmsodTMyIG9mZikKK3sKKwlyZXR1cm4gKHUzMiAqKShiZmlfaW1hZ2VfY3QgKyBvZmYpOworfQogCiBzdGF0aWMgaW5saW5lIHUzMiAqCi1iZmlfaW1hZ2VfY2JfZmNfZ2V0X2NodW5rKHUzMiBvZmYpCi17CXJldHVybiAodTMyICopKGJmaV9pbWFnZV9jYl9mYyArIG9mZik7IH0KK2JmaV9pbWFnZV9jdDJfZ2V0X2NodW5rKHUzMiBvZmYpCit7CisJcmV0dXJuICh1MzIgKikoYmZpX2ltYWdlX2N0MiArIG9mZik7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdTMyKgotYmZhX2NiX2ltYWdlX2dldF9jaHVuayhpbnQgdHlwZSwgdTMyIG9mZikKK2JmYV9jYl9pbWFnZV9nZXRfY2h1bmsoZW51bSBiZmlfYXNpY19nZW4gYXNpY19nZW4sIHUzMiBvZmYpCiB7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBCRklfSU1BR0VfQ1RfRkM6Ci0JCXJldHVybiBiZmlfaW1hZ2VfY3RfZmNfZ2V0X2NodW5rKG9mZik7CWJyZWFrOwotCWNhc2UgQkZJX0lNQUdFX0NUX0NOQToKLQkJcmV0dXJuIGJmaV9pbWFnZV9jdF9jbmFfZ2V0X2NodW5rKG9mZik7CWJyZWFrOwotCWNhc2UgQkZJX0lNQUdFX0NCX0ZDOgotCQlyZXR1cm4gYmZpX2ltYWdlX2NiX2ZjX2dldF9jaHVuayhvZmYpOwlicmVhazsKLQlkZWZhdWx0OiByZXR1cm4gTlVMTDsKKwlzd2l0Y2ggKGFzaWNfZ2VuKSB7CisJY2FzZSBCRklfQVNJQ19HRU5fQ0I6CisJCXJldHVybiBiZmlfaW1hZ2VfY2JfZ2V0X2NodW5rKG9mZik7CisJCWJyZWFrOworCWNhc2UgQkZJX0FTSUNfR0VOX0NUOgorCQlyZXR1cm4gYmZpX2ltYWdlX2N0X2dldF9jaHVuayhvZmYpOworCQlicmVhazsKKwljYXNlIEJGSV9BU0lDX0dFTl9DVDI6CisJCXJldHVybiBiZmlfaW1hZ2VfY3QyX2dldF9jaHVuayhvZmYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKIAl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyCi1iZmFfY2JfaW1hZ2VfZ2V0X3NpemUoaW50IHR5cGUpCitiZmFfY2JfaW1hZ2VfZ2V0X3NpemUoZW51bSBiZmlfYXNpY19nZW4gYXNpY19nZW4pCiB7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBCRklfSU1BR0VfQ1RfRkM6Ci0JCXJldHVybiBiZmlfaW1hZ2VfY3RfZmNfc2l6ZTsJYnJlYWs7Ci0JY2FzZSBCRklfSU1BR0VfQ1RfQ05BOgotCQlyZXR1cm4gYmZpX2ltYWdlX2N0X2NuYV9zaXplOwlicmVhazsKLQljYXNlIEJGSV9JTUFHRV9DQl9GQzoKLQkJcmV0dXJuIGJmaV9pbWFnZV9jYl9mY19zaXplOwlicmVhazsKLQlkZWZhdWx0OiByZXR1cm4gMDsKKwlzd2l0Y2ggKGFzaWNfZ2VuKSB7CisJY2FzZSBCRklfQVNJQ19HRU5fQ0I6CisJCXJldHVybiBiZmlfaW1hZ2VfY2Jfc2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBCRklfQVNJQ19HRU5fQ1Q6CisJCXJldHVybiBiZmlfaW1hZ2VfY3Rfc2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBCRklfQVNJQ19HRU5fQ1QyOgorCQlyZXR1cm4gYmZpX2ltYWdlX2N0Ml9zaXplOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY19jYi5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jX2NiLmMKaW5kZXggODlhZTRjOC4uMzBkZjhhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jX2NiLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jX2NiLmMKQEAgLTE3LDcgKzE3LDcgQEAKIAogI2luY2x1ZGUgImJmYWRfZHJ2LmgiCiAjaW5jbHVkZSAiYmZhX2lvYy5oIgotI2luY2x1ZGUgImJmaV9jYnJlZy5oIgorI2luY2x1ZGUgImJmaV9yZWcuaCIKICNpbmNsdWRlICJiZmFfZGVmcy5oIgogCiBCRkFfVFJDX0ZJTEUoQ05BLCBJT0NfQ0IpOwpAQCAtNjksMjEgKzY5LDYgQEAKIHN0YXRpYyBiZmFfYm9vbGVhbl90CiBiZmFfaW9jX2NiX2Zpcm13YXJlX2xvY2soc3RydWN0IGJmYV9pb2NfcyAqaW9jKQogewotCXN0cnVjdCBiZmlfaW9jX2ltYWdlX2hkcl9zIGZ3aGRyOwotCXVpbnQzMl90IGZ3c3RhdGUgPSByZWFkbChpb2MtPmlvY19yZWdzLmlvY19md3N0YXRlKTsKLQotCWlmIChmd3N0YXRlID09IEJGSV9JT0NfVU5JTklUKQotCQlyZXR1cm4gQkZBX1RSVUU7Ci0KLQliZmFfaW9jX2Z3dmVyX2dldChpb2MsICZmd2hkcik7Ci0KLQlpZiAoc3dhYjMyKGZ3aGRyLmV4ZWMpID09IEJGSV9CT09UX1RZUEVfTk9STUFMKQotCQlyZXR1cm4gQkZBX1RSVUU7Ci0KLQliZmFfdHJjKGlvYywgZndzdGF0ZSk7Ci0JYmZhX3RyYyhpb2MsIGZ3aGRyLmV4ZWMpOwotCXdyaXRlbChCRklfSU9DX1VOSU5JVCwgaW9jLT5pb2NfcmVncy5pb2NfZndzdGF0ZSk7Ci0KIAlyZXR1cm4gQkZBX1RSVUU7CiB9CiAKQEAgLTk4LDcgKzgzLDcgQEAKIHN0YXRpYyB2b2lkCiBiZmFfaW9jX2NiX25vdGlmeV9mYWlsKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKIHsKLQl3cml0ZWwoX19QU1NfRVJSX1NUQVRVU19TRVQsIGlvYy0+aW9jX3JlZ3MuZXJyX3NldCk7CisJd3JpdGVsKH4wVSwgaW9jLT5pb2NfcmVncy5lcnJfc2V0KTsKIAlyZWFkbChpb2MtPmlvY19yZWdzLmVycl9zZXQpOwogfQogCkBAIC0xNTIsOCArMTM3LDggQEAKIAkgKi8KIAlpb2MtPmlvY19yZWdzLnBzc19jdGxfcmVnID0gKHJiICsgUFNTX0NUTF9SRUcpOwogCWlvYy0+aW9jX3JlZ3MucHNzX2Vycl9zdGF0dXNfcmVnID0gKHJiICsgUFNTX0VSUl9TVEFUVVNfUkVHKTsKLQlpb2MtPmlvY19yZWdzLmFwcF9wbGxfZmFzdF9jdGxfcmVnID0gKHJiICsgQVBQX1BMTF80MDBfQ1RMX1JFRyk7Ci0JaW9jLT5pb2NfcmVncy5hcHBfcGxsX3Nsb3dfY3RsX3JlZyA9IChyYiArIEFQUF9QTExfMjEyX0NUTF9SRUcpOworCWlvYy0+aW9jX3JlZ3MuYXBwX3BsbF9mYXN0X2N0bF9yZWcgPSAocmIgKyBBUFBfUExMX0xDTEtfQ1RMX1JFRyk7CisJaW9jLT5pb2NfcmVncy5hcHBfcGxsX3Nsb3dfY3RsX3JlZyA9IChyYiArIEFQUF9QTExfU0NMS19DVExfUkVHKTsKIAogCS8qCiAJICogSU9DIHNlbWFwaG9yZSByZWdpc3RlcnMgYW5kIHNlcmlhbGl6YXRpb24KQEAgLTI4NSwxOCArMjcwLDE4IEBACiB9CiAKIGJmYV9zdGF0dXNfdAotYmZhX2lvY19jYl9wbGxfaW5pdCh2b2lkIF9faW9tZW0gKnJiLCBiZmFfYm9vbGVhbl90IGZjbW9kZSkKK2JmYV9pb2NfY2JfcGxsX2luaXQodm9pZCBfX2lvbWVtICpyYiwgZW51bSBiZmlfYXNpY19tb2RlIGZjbW9kZSkKIHsKIAl1MzIJcGxsX3NjbGssIHBsbF9mY2xrOwogCi0JcGxsX3NjbGsgPSBfX0FQUF9QTExfMjEyX0VOQUJMRSB8IF9fQVBQX1BMTF8yMTJfTFJFU0VUTiB8Ci0JCV9fQVBQX1BMTF8yMTJfUDBfMSgzVSkgfAotCQlfX0FQUF9QTExfMjEyX0pJVExNVDBfMSgzVSkgfAotCQlfX0FQUF9QTExfMjEyX0NOVExNVDBfMSgzVSk7Ci0JcGxsX2ZjbGsgPSBfX0FQUF9QTExfNDAwX0VOQUJMRSB8IF9fQVBQX1BMTF80MDBfTFJFU0VUTiB8Ci0JCV9fQVBQX1BMTF80MDBfUlNFTDIwMDUwMCB8IF9fQVBQX1BMTF80MDBfUDBfMSgzVSkgfAotCQlfX0FQUF9QTExfNDAwX0pJVExNVDBfMSgzVSkgfAotCQlfX0FQUF9QTExfNDAwX0NOVExNVDBfMSgzVSk7CisJcGxsX3NjbGsgPSBfX0FQUF9QTExfU0NMS19FTkFCTEUgfCBfX0FQUF9QTExfU0NMS19MUkVTRVROIHwKKwkJX19BUFBfUExMX1NDTEtfUDBfMSgzVSkgfAorCQlfX0FQUF9QTExfU0NMS19KSVRMTVQwXzEoM1UpIHwKKwkJX19BUFBfUExMX1NDTEtfQ05UTE1UMF8xKDNVKTsKKwlwbGxfZmNsayA9IF9fQVBQX1BMTF9MQ0xLX0VOQUJMRSB8IF9fQVBQX1BMTF9MQ0xLX0xSRVNFVE4gfAorCQlfX0FQUF9QTExfTENMS19SU0VMMjAwNTAwIHwgX19BUFBfUExMX0xDTEtfUDBfMSgzVSkgfAorCQlfX0FQUF9QTExfTENMS19KSVRMTVQwXzEoM1UpIHwKKwkJX19BUFBfUExMX0xDTEtfQ05UTE1UMF8xKDNVKTsKIAl3cml0ZWwoQkZJX0lPQ19VTklOSVQsIChyYiArIEJGQV9JT0MwX1NUQVRFX1JFRykpOwogCXdyaXRlbChCRklfSU9DX1VOSU5JVCwgKHJiICsgQkZBX0lPQzFfU1RBVEVfUkVHKSk7CiAJd3JpdGVsKDB4ZmZmZmZmZmZVLCAocmIgKyBIT1NURk4wX0lOVF9NU0spKTsKQEAgLTMwNSwyNCArMjkwLDI0IEBACiAJd3JpdGVsKDB4ZmZmZmZmZmZVLCAocmIgKyBIT1NURk4xX0lOVF9TVEFUVVMpKTsKIAl3cml0ZWwoMHhmZmZmZmZmZlUsIChyYiArIEhPU1RGTjBfSU5UX01TSykpOwogCXdyaXRlbCgweGZmZmZmZmZmVSwgKHJiICsgSE9TVEZOMV9JTlRfTVNLKSk7Ci0Jd3JpdGVsKF9fQVBQX1BMTF8yMTJfTE9HSUNfU09GVF9SRVNFVCwgcmIgKyBBUFBfUExMXzIxMl9DVExfUkVHKTsKLQl3cml0ZWwoX19BUFBfUExMXzIxMl9CWVBBU1MgfCBfX0FQUF9QTExfMjEyX0xPR0lDX1NPRlRfUkVTRVQsCi0JCQlyYiArIEFQUF9QTExfMjEyX0NUTF9SRUcpOwotCXdyaXRlbChfX0FQUF9QTExfNDAwX0xPR0lDX1NPRlRfUkVTRVQsIHJiICsgQVBQX1BMTF80MDBfQ1RMX1JFRyk7Ci0Jd3JpdGVsKF9fQVBQX1BMTF80MDBfQllQQVNTIHwgX19BUFBfUExMXzQwMF9MT0dJQ19TT0ZUX1JFU0VULAotCQkJcmIgKyBBUFBfUExMXzQwMF9DVExfUkVHKTsKKwl3cml0ZWwoX19BUFBfUExMX1NDTEtfTE9HSUNfU09GVF9SRVNFVCwgcmIgKyBBUFBfUExMX1NDTEtfQ1RMX1JFRyk7CisJd3JpdGVsKF9fQVBQX1BMTF9TQ0xLX0JZUEFTUyB8IF9fQVBQX1BMTF9TQ0xLX0xPR0lDX1NPRlRfUkVTRVQsCisJCQlyYiArIEFQUF9QTExfU0NMS19DVExfUkVHKTsKKwl3cml0ZWwoX19BUFBfUExMX0xDTEtfTE9HSUNfU09GVF9SRVNFVCwgcmIgKyBBUFBfUExMX0xDTEtfQ1RMX1JFRyk7CisJd3JpdGVsKF9fQVBQX1BMTF9MQ0xLX0JZUEFTUyB8IF9fQVBQX1BMTF9MQ0xLX0xPR0lDX1NPRlRfUkVTRVQsCisJCQlyYiArIEFQUF9QTExfTENMS19DVExfUkVHKTsKIAl1ZGVsYXkoMik7Ci0Jd3JpdGVsKF9fQVBQX1BMTF8yMTJfTE9HSUNfU09GVF9SRVNFVCwgcmIgKyBBUFBfUExMXzIxMl9DVExfUkVHKTsKLQl3cml0ZWwoX19BUFBfUExMXzQwMF9MT0dJQ19TT0ZUX1JFU0VULCByYiArIEFQUF9QTExfNDAwX0NUTF9SRUcpOwotCXdyaXRlbChwbGxfc2NsayB8IF9fQVBQX1BMTF8yMTJfTE9HSUNfU09GVF9SRVNFVCwKLQkJCXJiICsgQVBQX1BMTF8yMTJfQ1RMX1JFRyk7Ci0Jd3JpdGVsKHBsbF9mY2xrIHwgX19BUFBfUExMXzQwMF9MT0dJQ19TT0ZUX1JFU0VULAotCQkJcmIgKyBBUFBfUExMXzQwMF9DVExfUkVHKTsKKwl3cml0ZWwoX19BUFBfUExMX1NDTEtfTE9HSUNfU09GVF9SRVNFVCwgcmIgKyBBUFBfUExMX1NDTEtfQ1RMX1JFRyk7CisJd3JpdGVsKF9fQVBQX1BMTF9MQ0xLX0xPR0lDX1NPRlRfUkVTRVQsIHJiICsgQVBQX1BMTF9MQ0xLX0NUTF9SRUcpOworCXdyaXRlbChwbGxfc2NsayB8IF9fQVBQX1BMTF9TQ0xLX0xPR0lDX1NPRlRfUkVTRVQsCisJCQlyYiArIEFQUF9QTExfU0NMS19DVExfUkVHKTsKKwl3cml0ZWwocGxsX2ZjbGsgfCBfX0FQUF9QTExfTENMS19MT0dJQ19TT0ZUX1JFU0VULAorCQkJcmIgKyBBUFBfUExMX0xDTEtfQ1RMX1JFRyk7CiAJdWRlbGF5KDIwMDApOwogCXdyaXRlbCgweGZmZmZmZmZmVSwgKHJiICsgSE9TVEZOMF9JTlRfU1RBVFVTKSk7CiAJd3JpdGVsKDB4ZmZmZmZmZmZVLCAocmIgKyBIT1NURk4xX0lOVF9TVEFUVVMpKTsKLQl3cml0ZWwocGxsX3NjbGssIChyYiArIEFQUF9QTExfMjEyX0NUTF9SRUcpKTsKLQl3cml0ZWwocGxsX2ZjbGssIChyYiArIEFQUF9QTExfNDAwX0NUTF9SRUcpKTsKKwl3cml0ZWwocGxsX3NjbGssIChyYiArIEFQUF9QTExfU0NMS19DVExfUkVHKSk7CisJd3JpdGVsKHBsbF9mY2xrLCAocmIgKyBBUFBfUExMX0xDTEtfQ1RMX1JFRykpOwogCiAJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2NfY3QuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY19jdC5jCmluZGV4IDkzNjEyNTIuLmQxYjhmMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY19jdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvY19jdC5jCkBAIC0xNyw3ICsxNyw3IEBACiAKICNpbmNsdWRlICJiZmFkX2Rydi5oIgogI2luY2x1ZGUgImJmYV9pb2MuaCIKLSNpbmNsdWRlICJiZmlfY3RyZWcuaCIKKyNpbmNsdWRlICJiZmlfcmVnLmgiCiAjaW5jbHVkZSAiYmZhX2RlZnMuaCIKIAogQkZBX1RSQ19GSUxFKENOQSwgSU9DX0NUKTsKQEAgLTM2LDkgKzM2LDYgQEAKICAqLwogc3RhdGljIGJmYV9ib29sZWFuX3QgYmZhX2lvY19jdF9maXJtd2FyZV9sb2NrKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2N0X2Zpcm13YXJlX3VubG9jayhzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwotc3RhdGljIHZvaWQgYmZhX2lvY19jdF9yZWdfaW5pdChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwotc3RhdGljIHZvaWQgYmZhX2lvY19jdF9tYXBfcG9ydChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwotc3RhdGljIHZvaWQgYmZhX2lvY19jdF9pc3JfbW9kZV9zZXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBiZmFfYm9vbGVhbl90IG1zaXgpOwogc3RhdGljIHZvaWQgYmZhX2lvY19jdF9ub3RpZnlfZmFpbChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogc3RhdGljIHZvaWQgYmZhX2lvY19jdF9vd25lcnNoaXBfcmVzZXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIHN0YXRpYyBiZmFfYm9vbGVhbl90IGJmYV9pb2NfY3Rfc3luY19zdGFydChzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwpAQCAtNDgsMjkgKzQ1LDcgQEAKIHN0YXRpYyBiZmFfYm9vbGVhbl90IGJmYV9pb2NfY3Rfc3luY19jb21wbGV0ZShzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogCiBzdGF0aWMgc3RydWN0IGJmYV9pb2NfaHdpZl9zIGh3aWZfY3Q7Ci0KLS8qCi0gKiBDYWxsZWQgZnJvbSBiZmFfaW9jX2F0dGFjaCgpIHRvIG1hcCBhc2ljIHNwZWNpZmljIGNhbGxzLgotICovCi12b2lkCi1iZmFfaW9jX3NldF9jdF9od2lmKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKLXsKLQlod2lmX2N0LmlvY19wbGxfaW5pdCA9IGJmYV9pb2NfY3RfcGxsX2luaXQ7Ci0JaHdpZl9jdC5pb2NfZmlybXdhcmVfbG9jayA9IGJmYV9pb2NfY3RfZmlybXdhcmVfbG9jazsKLQlod2lmX2N0LmlvY19maXJtd2FyZV91bmxvY2sgPSBiZmFfaW9jX2N0X2Zpcm13YXJlX3VubG9jazsKLQlod2lmX2N0LmlvY19yZWdfaW5pdCA9IGJmYV9pb2NfY3RfcmVnX2luaXQ7Ci0JaHdpZl9jdC5pb2NfbWFwX3BvcnQgPSBiZmFfaW9jX2N0X21hcF9wb3J0OwotCWh3aWZfY3QuaW9jX2lzcl9tb2RlX3NldCA9IGJmYV9pb2NfY3RfaXNyX21vZGVfc2V0OwotCWh3aWZfY3QuaW9jX25vdGlmeV9mYWlsID0gYmZhX2lvY19jdF9ub3RpZnlfZmFpbDsKLQlod2lmX2N0LmlvY19vd25lcnNoaXBfcmVzZXQgPSBiZmFfaW9jX2N0X293bmVyc2hpcF9yZXNldDsKLQlod2lmX2N0LmlvY19zeW5jX3N0YXJ0ID0gYmZhX2lvY19jdF9zeW5jX3N0YXJ0OwotCWh3aWZfY3QuaW9jX3N5bmNfam9pbiA9IGJmYV9pb2NfY3Rfc3luY19qb2luOwotCWh3aWZfY3QuaW9jX3N5bmNfbGVhdmUgPSBiZmFfaW9jX2N0X3N5bmNfbGVhdmU7Ci0JaHdpZl9jdC5pb2Nfc3luY19hY2sgPSBiZmFfaW9jX2N0X3N5bmNfYWNrOwotCWh3aWZfY3QuaW9jX3N5bmNfY29tcGxldGUgPSBiZmFfaW9jX2N0X3N5bmNfY29tcGxldGU7Ci0KLQlpb2MtPmlvY19od2lmID0gJmh3aWZfY3Q7Ci19CitzdGF0aWMgc3RydWN0IGJmYV9pb2NfaHdpZl9zIGh3aWZfY3QyOwogCiAvKgogICogUmV0dXJuIHRydWUgaWYgZmlybXdhcmUgb2YgY3VycmVudCBkcml2ZXIgbWF0Y2hlcyB0aGUgcnVubmluZyBmaXJtd2FyZS4KQEAgLTgzLDE1ICs1OCw5IEBACiAJc3RydWN0IGJmaV9pb2NfaW1hZ2VfaGRyX3MgZndoZHI7CiAKIAkvKgotCSAqIEZpcm13YXJlIG1hdGNoIGNoZWNrIGlzIHJlbGV2YW50IG9ubHkgZm9yIENOQS4KLQkgKi8KLQlpZiAoIWlvYy0+Y25hKQotCQlyZXR1cm4gQkZBX1RSVUU7Ci0KLQkvKgogCSAqIElmIGJpb3MgYm9vdCAoZmxhc2ggYmFzZWQpIC0tIGRvIG5vdCBpbmNyZW1lbnQgdXNhZ2UgY291bnQKIAkgKi8KLQlpZiAoYmZhX2NiX2ltYWdlX2dldF9zaXplKEJGQV9JT0NfRldJTUdfVFlQRShpb2MpKSA8CisJaWYgKGJmYV9jYl9pbWFnZV9nZXRfc2l6ZShiZmFfaW9jX2FzaWNfZ2VuKGlvYykpIDwKIAkJCQkJCUJGQV9JT0NfRldJTUdfTUlOU1opCiAJCXJldHVybiBCRkFfVFJVRTsKIApAQCAtMTAzLDYgKzcyLDcgQEAKIAkgKi8KIAlpZiAodXNlY250ID09IDApIHsKIAkJd3JpdGVsKDEsIGlvYy0+aW9jX3JlZ3MuaW9jX3VzYWdlX3JlZyk7CisJCXJlYWRsKGlvYy0+aW9jX3JlZ3MuaW9jX3VzYWdlX3NlbV9yZWcpOwogCQl3cml0ZWwoMSwgaW9jLT5pb2NfcmVncy5pb2NfdXNhZ2Vfc2VtX3JlZyk7CiAJCXdyaXRlbCgwLCBpb2MtPmlvY19yZWdzLmlvY19mYWlsX3N5bmMpOwogCQliZmFfdHJjKGlvYywgdXNlY250KTsKQEAgLTEyMiw2ICs5Miw3IEBACiAJICovCiAJYmZhX2lvY19md3Zlcl9nZXQoaW9jLCAmZndoZHIpOwogCWlmICghYmZhX2lvY19md3Zlcl9jbXAoaW9jLCAmZndoZHIpKSB7CisJCXJlYWRsKGlvYy0+aW9jX3JlZ3MuaW9jX3VzYWdlX3NlbV9yZWcpOwogCQl3cml0ZWwoMSwgaW9jLT5pb2NfcmVncy5pb2NfdXNhZ2Vfc2VtX3JlZyk7CiAJCWJmYV90cmMoaW9jLCB1c2VjbnQpOwogCQlyZXR1cm4gQkZBX0ZBTFNFOwpAQCAtMTMyLDYgKzEwMyw3IEBACiAJICovCiAJdXNlY250Kys7CiAJd3JpdGVsKHVzZWNudCwgaW9jLT5pb2NfcmVncy5pb2NfdXNhZ2VfcmVnKTsKKwlyZWFkbChpb2MtPmlvY19yZWdzLmlvY191c2FnZV9zZW1fcmVnKTsKIAl3cml0ZWwoMSwgaW9jLT5pb2NfcmVncy5pb2NfdXNhZ2Vfc2VtX3JlZyk7CiAJYmZhX3RyYyhpb2MsIHVzZWNudCk7CiAJcmV0dXJuIEJGQV9UUlVFOwpAQCAtMTQzLDE1ICsxMTUsOSBAQAogCXUzMiB1c2VjbnQ7CiAKIAkvKgotCSAqIEZpcm13YXJlIGxvY2sgaXMgcmVsZXZhbnQgb25seSBmb3IgQ05BLgotCSAqLwotCWlmICghaW9jLT5jbmEpCi0JCXJldHVybjsKLQotCS8qCiAJICogSWYgYmlvcyBib290IChmbGFzaCBiYXNlZCkgLS0gZG8gbm90IGRlY3JlbWVudCB1c2FnZSBjb3VudAogCSAqLwotCWlmIChiZmFfY2JfaW1hZ2VfZ2V0X3NpemUoQkZBX0lPQ19GV0lNR19UWVBFKGlvYykpIDwKKwlpZiAoYmZhX2NiX2ltYWdlX2dldF9zaXplKGJmYV9pb2NfYXNpY19nZW4oaW9jKSkgPAogCQkJCQkJQkZBX0lPQ19GV0lNR19NSU5TWikKIAkJcmV0dXJuOwogCkBAIC0xNjYsNiArMTMyLDcgQEAKIAl3cml0ZWwodXNlY250LCBpb2MtPmlvY19yZWdzLmlvY191c2FnZV9yZWcpOwogCWJmYV90cmMoaW9jLCB1c2VjbnQpOwogCisJcmVhZGwoaW9jLT5pb2NfcmVncy5pb2NfdXNhZ2Vfc2VtX3JlZyk7CiAJd3JpdGVsKDEsIGlvYy0+aW9jX3JlZ3MuaW9jX3VzYWdlX3NlbV9yZWcpOwogfQogCkBAIC0xNzUsMTQgKzE0MiwxNCBAQAogc3RhdGljIHZvaWQKIGJmYV9pb2NfY3Rfbm90aWZ5X2ZhaWwoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQogewotCWlmIChpb2MtPmNuYSkgeworCWlmIChiZmFfaW9jX2lzX2NuYShpb2MpKSB7CiAJCXdyaXRlbChfX0ZXX0lOSVRfSEFMVF9QLCBpb2MtPmlvY19yZWdzLmxsX2hhbHQpOwogCQl3cml0ZWwoX19GV19JTklUX0hBTFRfUCwgaW9jLT5pb2NfcmVncy5hbHRfbGxfaGFsdCk7CiAJCS8qIFdhaXQgZm9yIGhhbHQgdG8gdGFrZSBlZmZlY3QgKi8KIAkJcmVhZGwoaW9jLT5pb2NfcmVncy5sbF9oYWx0KTsKIAkJcmVhZGwoaW9jLT5pb2NfcmVncy5hbHRfbGxfaGFsdCk7CiAJfSBlbHNlIHsKLQkJd3JpdGVsKF9fUFNTX0VSUl9TVEFUVVNfU0VULCBpb2MtPmlvY19yZWdzLmVycl9zZXQpOworCQl3cml0ZWwofjBVLCBpb2MtPmlvY19yZWdzLmVycl9zZXQpOwogCQlyZWFkbChpb2MtPmlvY19yZWdzLmVycl9zZXQpOwogCX0KIH0KQEAgLTE5MCw3ICsxNTcsNyBAQAogLyoKICAqIEhvc3QgdG8gTFBVIG1haWxib3ggbWVzc2FnZSBhZGRyZXNzZXMKICAqLwotc3RhdGljIHN0cnVjdCB7IHUzMiBoZm5fbWJveCwgbHB1X21ib3gsIGhmbl9wZ247IH0gaW9jcmVnX2ZucmVnW10gPSB7CitzdGF0aWMgc3RydWN0IHsgdTMyIGhmbl9tYm94LCBscHVfbWJveCwgaGZuX3BnbjsgfSBjdF9mbnJlZ1tdID0gewogCXsgSE9TVEZOMF9MUFVfTUJPWDBfMCwgTFBVX0hPU1RGTjBfTUJPWDBfMCwgSE9TVF9QQUdFX05VTV9GTjAgfSwKIAl7IEhPU1RGTjFfTFBVX01CT1gwXzgsIExQVV9IT1NURk4xX01CT1gwXzgsIEhPU1RfUEFHRV9OVU1fRk4xIH0sCiAJeyBIT1NURk4yX0xQVV9NQk9YMF8wLCBMUFVfSE9TVEZOMl9NQk9YMF8wLCBIT1NUX1BBR0VfTlVNX0ZOMiB9LApAQCAtMjAwLDIxICsxNjcsMzEgQEAKIC8qCiAgKiBIb3N0IDwtPiBMUFUgbWFpbGJveCBjb21tYW5kL3N0YXR1cyByZWdpc3RlcnMgLSBwb3J0IDAKICAqLwotc3RhdGljIHN0cnVjdCB7IHUzMiBoZm4sIGxwdTsgfSBpb2NyZWdfbWJjbWRfcDBbXSA9IHsKLQl7IEhPU1RGTjBfTFBVMF9NQk9YMF9DTURfU1RBVCwgTFBVMF9IT1NURk4wX01CT1gwX0NNRF9TVEFUIH0sCi0JeyBIT1NURk4xX0xQVTBfTUJPWDBfQ01EX1NUQVQsIExQVTBfSE9TVEZOMV9NQk9YMF9DTURfU1RBVCB9LAotCXsgSE9TVEZOMl9MUFUwX01CT1gwX0NNRF9TVEFULCBMUFUwX0hPU1RGTjJfTUJPWDBfQ01EX1NUQVQgfSwKLQl7IEhPU1RGTjNfTFBVMF9NQk9YMF9DTURfU1RBVCwgTFBVMF9IT1NURk4zX01CT1gwX0NNRF9TVEFUIH0KK3N0YXRpYyBzdHJ1Y3QgeyB1MzIgaGZuLCBscHU7IH0gY3RfcDByZWdbXSA9IHsKKwl7IEhPU1RGTjBfTFBVMF9DTURfU1RBVCwgTFBVMF9IT1NURk4wX0NNRF9TVEFUIH0sCisJeyBIT1NURk4xX0xQVTBfQ01EX1NUQVQsIExQVTBfSE9TVEZOMV9DTURfU1RBVCB9LAorCXsgSE9TVEZOMl9MUFUwX0NNRF9TVEFULCBMUFUwX0hPU1RGTjJfQ01EX1NUQVQgfSwKKwl7IEhPU1RGTjNfTFBVMF9DTURfU1RBVCwgTFBVMF9IT1NURk4zX0NNRF9TVEFUIH0KIH07CiAKIC8qCiAgKiBIb3N0IDwtPiBMUFUgbWFpbGJveCBjb21tYW5kL3N0YXR1cyByZWdpc3RlcnMgLSBwb3J0IDEKICAqLwotc3RhdGljIHN0cnVjdCB7IHUzMiBoZm4sIGxwdTsgfSBpb2NyZWdfbWJjbWRfcDFbXSA9IHsKLQl7IEhPU1RGTjBfTFBVMV9NQk9YMF9DTURfU1RBVCwgTFBVMV9IT1NURk4wX01CT1gwX0NNRF9TVEFUIH0sCi0JeyBIT1NURk4xX0xQVTFfTUJPWDBfQ01EX1NUQVQsIExQVTFfSE9TVEZOMV9NQk9YMF9DTURfU1RBVCB9LAotCXsgSE9TVEZOMl9MUFUxX01CT1gwX0NNRF9TVEFULCBMUFUxX0hPU1RGTjJfTUJPWDBfQ01EX1NUQVQgfSwKLQl7IEhPU1RGTjNfTFBVMV9NQk9YMF9DTURfU1RBVCwgTFBVMV9IT1NURk4zX01CT1gwX0NNRF9TVEFUIH0KK3N0YXRpYyBzdHJ1Y3QgeyB1MzIgaGZuLCBscHU7IH0gY3RfcDFyZWdbXSA9IHsKKwl7IEhPU1RGTjBfTFBVMV9DTURfU1RBVCwgTFBVMV9IT1NURk4wX0NNRF9TVEFUIH0sCisJeyBIT1NURk4xX0xQVTFfQ01EX1NUQVQsIExQVTFfSE9TVEZOMV9DTURfU1RBVCB9LAorCXsgSE9TVEZOMl9MUFUxX0NNRF9TVEFULCBMUFUxX0hPU1RGTjJfQ01EX1NUQVQgfSwKKwl7IEhPU1RGTjNfTFBVMV9DTURfU1RBVCwgTFBVMV9IT1NURk4zX0NNRF9TVEFUIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgeyB1aW50MzJfdCBoZm5fbWJveCwgbHB1X21ib3gsIGhmbl9wZ24sIGhmbiwgbHB1LCBscHVfcmVhZDsgfQorCWN0Ml9yZWdbXSA9IHsKKwl7IENUMl9IT1NURk5fTFBVMF9NQk9YMCwgQ1QyX0xQVTBfSE9TVEZOX01CT1gwLCBDVDJfSE9TVEZOX1BBR0VfTlVNLAorCSAgQ1QyX0hPU1RGTl9MUFUwX0NNRF9TVEFULCBDVDJfTFBVMF9IT1NURk5fQ01EX1NUQVQsCisJICBDVDJfSE9TVEZOX0xQVTBfUkVBRF9TVEFUfSwKKwl7IENUMl9IT1NURk5fTFBVMV9NQk9YMCwgQ1QyX0xQVTFfSE9TVEZOX01CT1gwLCBDVDJfSE9TVEZOX1BBR0VfTlVNLAorCSAgQ1QyX0hPU1RGTl9MUFUxX0NNRF9TVEFULCBDVDJfTFBVMV9IT1NURk5fQ01EX1NUQVQsCisJICBDVDJfSE9TVEZOX0xQVTFfUkVBRF9TVEFUfSwKIH07CiAKIHN0YXRpYyB2b2lkCkBAIC0yMjUsMjQgKzIwMiwyNCBAQAogCiAJcmIgPSBiZmFfaW9jX2JhcjAoaW9jKTsKIAotCWlvYy0+aW9jX3JlZ3MuaGZuX21ib3ggPSByYiArIGlvY3JlZ19mbnJlZ1twY2lmbl0uaGZuX21ib3g7Ci0JaW9jLT5pb2NfcmVncy5scHVfbWJveCA9IHJiICsgaW9jcmVnX2ZucmVnW3BjaWZuXS5scHVfbWJveDsKLQlpb2MtPmlvY19yZWdzLmhvc3RfcGFnZV9udW1fZm4gPSByYiArIGlvY3JlZ19mbnJlZ1twY2lmbl0uaGZuX3BnbjsKKwlpb2MtPmlvY19yZWdzLmhmbl9tYm94ID0gcmIgKyBjdF9mbnJlZ1twY2lmbl0uaGZuX21ib3g7CisJaW9jLT5pb2NfcmVncy5scHVfbWJveCA9IHJiICsgY3RfZm5yZWdbcGNpZm5dLmxwdV9tYm94OworCWlvYy0+aW9jX3JlZ3MuaG9zdF9wYWdlX251bV9mbiA9IHJiICsgY3RfZm5yZWdbcGNpZm5dLmhmbl9wZ247CiAKIAlpZiAoaW9jLT5wb3J0X2lkID09IDApIHsKIAkJaW9jLT5pb2NfcmVncy5oZWFydGJlYXQgPSByYiArIEJGQV9JT0MwX0hCRUFUX1JFRzsKIAkJaW9jLT5pb2NfcmVncy5pb2NfZndzdGF0ZSA9IHJiICsgQkZBX0lPQzBfU1RBVEVfUkVHOwogCQlpb2MtPmlvY19yZWdzLmFsdF9pb2NfZndzdGF0ZSA9IHJiICsgQkZBX0lPQzFfU1RBVEVfUkVHOwotCQlpb2MtPmlvY19yZWdzLmhmbl9tYm94X2NtZCA9IHJiICsgaW9jcmVnX21iY21kX3AwW3BjaWZuXS5oZm47Ci0JCWlvYy0+aW9jX3JlZ3MubHB1X21ib3hfY21kID0gcmIgKyBpb2NyZWdfbWJjbWRfcDBbcGNpZm5dLmxwdTsKKwkJaW9jLT5pb2NfcmVncy5oZm5fbWJveF9jbWQgPSByYiArIGN0X3AwcmVnW3BjaWZuXS5oZm47CisJCWlvYy0+aW9jX3JlZ3MubHB1X21ib3hfY21kID0gcmIgKyBjdF9wMHJlZ1twY2lmbl0ubHB1OwogCQlpb2MtPmlvY19yZWdzLmxsX2hhbHQgPSByYiArIEZXX0lOSVRfSEFMVF9QMDsKIAkJaW9jLT5pb2NfcmVncy5hbHRfbGxfaGFsdCA9IHJiICsgRldfSU5JVF9IQUxUX1AxOwogCX0gZWxzZSB7CiAJCWlvYy0+aW9jX3JlZ3MuaGVhcnRiZWF0ID0gKHJiICsgQkZBX0lPQzFfSEJFQVRfUkVHKTsKIAkJaW9jLT5pb2NfcmVncy5pb2NfZndzdGF0ZSA9IChyYiArIEJGQV9JT0MxX1NUQVRFX1JFRyk7CiAJCWlvYy0+aW9jX3JlZ3MuYWx0X2lvY19md3N0YXRlID0gcmIgKyBCRkFfSU9DMF9TVEFURV9SRUc7Ci0JCWlvYy0+aW9jX3JlZ3MuaGZuX21ib3hfY21kID0gcmIgKyBpb2NyZWdfbWJjbWRfcDFbcGNpZm5dLmhmbjsKLQkJaW9jLT5pb2NfcmVncy5scHVfbWJveF9jbWQgPSByYiArIGlvY3JlZ19tYmNtZF9wMVtwY2lmbl0ubHB1OworCQlpb2MtPmlvY19yZWdzLmhmbl9tYm94X2NtZCA9IHJiICsgY3RfcDFyZWdbcGNpZm5dLmhmbjsKKwkJaW9jLT5pb2NfcmVncy5scHVfbWJveF9jbWQgPSByYiArIGN0X3AxcmVnW3BjaWZuXS5scHU7CiAJCWlvYy0+aW9jX3JlZ3MubGxfaGFsdCA9IHJiICsgRldfSU5JVF9IQUxUX1AxOwogCQlpb2MtPmlvY19yZWdzLmFsdF9sbF9oYWx0ID0gcmIgKyBGV19JTklUX0hBTFRfUDA7CiAJfQpAQCAtMjUyLDggKzIyOSw4IEBACiAJICovCiAJaW9jLT5pb2NfcmVncy5wc3NfY3RsX3JlZyA9IChyYiArIFBTU19DVExfUkVHKTsKIAlpb2MtPmlvY19yZWdzLnBzc19lcnJfc3RhdHVzX3JlZyA9IChyYiArIFBTU19FUlJfU1RBVFVTX1JFRyk7Ci0JaW9jLT5pb2NfcmVncy5hcHBfcGxsX2Zhc3RfY3RsX3JlZyA9IChyYiArIEFQUF9QTExfNDI1X0NUTF9SRUcpOwotCWlvYy0+aW9jX3JlZ3MuYXBwX3BsbF9zbG93X2N0bF9yZWcgPSAocmIgKyBBUFBfUExMXzMxMl9DVExfUkVHKTsKKwlpb2MtPmlvY19yZWdzLmFwcF9wbGxfZmFzdF9jdGxfcmVnID0gKHJiICsgQVBQX1BMTF9MQ0xLX0NUTF9SRUcpOworCWlvYy0+aW9jX3JlZ3MuYXBwX3BsbF9zbG93X2N0bF9yZWcgPSAocmIgKyBBUFBfUExMX1NDTEtfQ1RMX1JFRyk7CiAKIAkvKgogCSAqIElPQyBzZW1hcGhvcmUgcmVnaXN0ZXJzIGFuZCBzZXJpYWxpemF0aW9uCkBAIC0yNzYsNiArMjUzLDY0IEBACiAJaW9jLT5pb2NfcmVncy5lcnJfc2V0ID0gKHJiICsgRVJSX1NFVF9SRUcpOwogfQogCitzdGF0aWMgdm9pZAorYmZhX2lvY19jdDJfcmVnX2luaXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXZvaWQgX19pb21lbSAqcmI7CisJaW50CXBvcnQgPSBiZmFfaW9jX3BvcnRpZChpb2MpOworCisJcmIgPSBiZmFfaW9jX2JhcjAoaW9jKTsKKworCWlvYy0+aW9jX3JlZ3MuaGZuX21ib3ggPSByYiArIGN0Ml9yZWdbcG9ydF0uaGZuX21ib3g7CisJaW9jLT5pb2NfcmVncy5scHVfbWJveCA9IHJiICsgY3QyX3JlZ1twb3J0XS5scHVfbWJveDsKKwlpb2MtPmlvY19yZWdzLmhvc3RfcGFnZV9udW1fZm4gPSByYiArIGN0Ml9yZWdbcG9ydF0uaGZuX3BnbjsKKwlpb2MtPmlvY19yZWdzLmhmbl9tYm94X2NtZCA9IHJiICsgY3QyX3JlZ1twb3J0XS5oZm47CisJaW9jLT5pb2NfcmVncy5scHVfbWJveF9jbWQgPSByYiArIGN0Ml9yZWdbcG9ydF0ubHB1OworCWlvYy0+aW9jX3JlZ3MubHB1X3JlYWRfc3RhdCA9IHJiICsgY3QyX3JlZ1twb3J0XS5scHVfcmVhZDsKKworCWlmIChwb3J0ID09IDApIHsKKwkJaW9jLT5pb2NfcmVncy5oZWFydGJlYXQgPSByYiArIENUMl9CRkFfSU9DMF9IQkVBVF9SRUc7CisJCWlvYy0+aW9jX3JlZ3MuaW9jX2Z3c3RhdGUgPSByYiArIENUMl9CRkFfSU9DMF9TVEFURV9SRUc7CisJCWlvYy0+aW9jX3JlZ3MuYWx0X2lvY19md3N0YXRlID0gcmIgKyBDVDJfQkZBX0lPQzFfU1RBVEVfUkVHOworCQlpb2MtPmlvY19yZWdzLmxsX2hhbHQgPSByYiArIEZXX0lOSVRfSEFMVF9QMDsKKwkJaW9jLT5pb2NfcmVncy5hbHRfbGxfaGFsdCA9IHJiICsgRldfSU5JVF9IQUxUX1AxOworCX0gZWxzZSB7CisJCWlvYy0+aW9jX3JlZ3MuaGVhcnRiZWF0ID0gKHJiICsgQ1QyX0JGQV9JT0MxX0hCRUFUX1JFRyk7CisJCWlvYy0+aW9jX3JlZ3MuaW9jX2Z3c3RhdGUgPSAocmIgKyBDVDJfQkZBX0lPQzFfU1RBVEVfUkVHKTsKKwkJaW9jLT5pb2NfcmVncy5hbHRfaW9jX2Z3c3RhdGUgPSByYiArIENUMl9CRkFfSU9DMF9TVEFURV9SRUc7CisJCWlvYy0+aW9jX3JlZ3MubGxfaGFsdCA9IHJiICsgRldfSU5JVF9IQUxUX1AxOworCQlpb2MtPmlvY19yZWdzLmFsdF9sbF9oYWx0ID0gcmIgKyBGV19JTklUX0hBTFRfUDA7CisJfQorCisJLyoKKwkgKiBQU1MgY29udHJvbCByZWdpc3RlcnMKKwkgKi8KKwlpb2MtPmlvY19yZWdzLnBzc19jdGxfcmVnID0gKHJiICsgUFNTX0NUTF9SRUcpOworCWlvYy0+aW9jX3JlZ3MucHNzX2Vycl9zdGF0dXNfcmVnID0gKHJiICsgUFNTX0VSUl9TVEFUVVNfUkVHKTsKKwlpb2MtPmlvY19yZWdzLmFwcF9wbGxfZmFzdF9jdGxfcmVnID0gKHJiICsgQ1QyX0FQUF9QTExfTENMS19DVExfUkVHKTsKKwlpb2MtPmlvY19yZWdzLmFwcF9wbGxfc2xvd19jdGxfcmVnID0gKHJiICsgQ1QyX0FQUF9QTExfU0NMS19DVExfUkVHKTsKKworCS8qCisJICogSU9DIHNlbWFwaG9yZSByZWdpc3RlcnMgYW5kIHNlcmlhbGl6YXRpb24KKwkgKi8KKwlpb2MtPmlvY19yZWdzLmlvY19zZW1fcmVnID0gKHJiICsgQ1QyX0hPU1RfU0VNMF9SRUcpOworCWlvYy0+aW9jX3JlZ3MuaW9jX3VzYWdlX3NlbV9yZWcgPSAocmIgKyBDVDJfSE9TVF9TRU0xX1JFRyk7CisJaW9jLT5pb2NfcmVncy5pb2NfaW5pdF9zZW1fcmVnID0gKHJiICsgQ1QyX0hPU1RfU0VNMl9SRUcpOworCWlvYy0+aW9jX3JlZ3MuaW9jX3VzYWdlX3JlZyA9IChyYiArIENUMl9CRkFfRldfVVNFX0NPVU5UKTsKKwlpb2MtPmlvY19yZWdzLmlvY19mYWlsX3N5bmMgPSAocmIgKyBDVDJfQkZBX0lPQ19GQUlMX1NZTkMpOworCisJLyoKKwkgKiBzcmFtIG1lbW9yeSBhY2Nlc3MKKwkgKi8KKwlpb2MtPmlvY19yZWdzLnNtZW1fcGFnZV9zdGFydCA9IChyYiArIFBTU19TTUVNX1BBR0VfU1RBUlQpOworCWlvYy0+aW9jX3JlZ3Muc21lbV9wZzAgPSBCRklfSU9DX1NNRU1fUEcwX0NUOworCisJLyoKKwkgKiBlcnIgc2V0IHJlZyA6IGZvciBub3RpZmljYXRpb24gb2YgaGIgZmFpbHVyZSBpbiBmY21vZGUKKwkgKi8KKwlpb2MtPmlvY19yZWdzLmVycl9zZXQgPSAocmIgKyBFUlJfU0VUX1JFRyk7Cit9CisKIC8qCiAgKiBJbml0aWFsaXplIElPQyB0byBwb3J0IG1hcHBpbmcuCiAgKi8KQEAgLTI5OCw2ICszMzMsMTkgQEAKIAliZmFfdHJjKGlvYywgaW9jLT5wb3J0X2lkKTsKIH0KIAorc3RhdGljIHZvaWQKK2JmYV9pb2NfY3QyX21hcF9wb3J0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwl2b2lkIF9faW9tZW0JKnJiID0gaW9jLT5wY2lkZXYucGNpX2Jhcl9rdmE7CisJdTMyCXIzMjsKKworCXIzMiA9IHJlYWRsKHJiICsgQ1QyX0hPU1RGTl9QRVJTT05BTElUWTApOworCWlvYy0+cG9ydF9pZCA9ICgocjMyICYgX19GQ19MTF9QT1JUX01BUF9fTUspID4+IF9fRkNfTExfUE9SVF9NQVBfX1NIKTsKKworCWJmYV90cmMoaW9jLCBiZmFfaW9jX3BjaWZuKGlvYykpOworCWJmYV90cmMoaW9jLCBpb2MtPnBvcnRfaWQpOworfQorCiAvKgogICogU2V0IGludGVycnVwdCBtb2RlIGZvciBhIGZ1bmN0aW9uOiBJTlRYIG9yIE1TSVgKICAqLwpAQCAtMzE2LDcgKzM2NCw3IEBACiAJLyoKIAkgKiBJZiBhbHJlYWR5IGluIGRlc2lyZWQgbW9kZSwgZG8gbm90IGNoYW5nZSBhbnl0aGluZwogCSAqLwotCWlmICghbXNpeCAmJiBtb2RlKQorCWlmICgoIW1zaXggJiYgbW9kZSkgfHwgKG1zaXggJiYgIW1vZGUpKQogCQlyZXR1cm47CiAKIAlpZiAobXNpeCkKQEAgLTMzMSw2ICszNzksMjAgQEAKIAl3cml0ZWwocjMyLCByYiArIEZOQ19QRVJTX1JFRyk7CiB9CiAKK2JmYV9ib29sZWFuX3QKK2JmYV9pb2NfY3QyX2xwdV9yZWFkX3N0YXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCXUzMglyMzI7CisKKwlyMzIgPSByZWFkbChpb2MtPmlvY19yZWdzLmxwdV9yZWFkX3N0YXQpOworCWlmIChyMzIpIHsKKwkJd3JpdGVsKDEsIGlvYy0+aW9jX3JlZ3MubHB1X3JlYWRfc3RhdCk7CisJCXJldHVybiBCRkFfVFJVRTsKKwl9CisKKwlyZXR1cm4gQkZBX0ZBTFNFOworfQorCiAvKgogICogQ2xlYW51cCBodyBzZW1hcGhvcmUgYW5kIHVzZWNudCByZWdpc3RlcnMKICAqLwpAQCAtMzM4LDkgKzQwMCwxMCBAQAogYmZhX2lvY19jdF9vd25lcnNoaXBfcmVzZXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQogewogCi0JaWYgKGlvYy0+Y25hKSB7CisJaWYgKGJmYV9pb2NfaXNfY25hKGlvYykpIHsKIAkJYmZhX2lvY19zZW1fZ2V0KGlvYy0+aW9jX3JlZ3MuaW9jX3VzYWdlX3NlbV9yZWcpOwogCQl3cml0ZWwoMCwgaW9jLT5pb2NfcmVncy5pb2NfdXNhZ2VfcmVnKTsKKwkJcmVhZGwoaW9jLT5pb2NfcmVncy5pb2NfdXNhZ2Vfc2VtX3JlZyk7CiAJCXdyaXRlbCgxLCBpb2MtPmlvY19yZWdzLmlvY191c2FnZV9zZW1fcmVnKTsKIAl9CiAKQEAgLTQ0OSwzMiArNTEyLDk5IEBACiAJcmV0dXJuIEJGQV9GQUxTRTsKIH0KIAotLyoKLSAqIENoZWNrIHRoZSBmaXJtd2FyZSBzdGF0ZSB0byBrbm93IGlmIHBsbF9pbml0IGhhcyBiZWVuIGNvbXBsZXRlZCBhbHJlYWR5CisvKioKKyAqIENhbGxlZCBmcm9tIGJmYV9pb2NfYXR0YWNoKCkgdG8gbWFwIGFzaWMgc3BlY2lmaWMgY2FsbHMuCiAgKi8KLWJmYV9ib29sZWFuX3QKLWJmYV9pb2NfY3RfcGxsX2luaXRfY29tcGxldGUodm9pZCBfX2lvbWVtICpyYikKK3N0YXRpYyB2b2lkCitiZmFfaW9jX3NldF9jdHhfaHdpZihzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHN0cnVjdCBiZmFfaW9jX2h3aWZfcyAqaHdpZikKIHsKLQlpZiAoKHJlYWRsKHJiICsgQkZBX0lPQzBfU1RBVEVfUkVHKSA9PSBCRklfSU9DX09QKSB8fAotCSAgKHJlYWRsKHJiICsgQkZBX0lPQzFfU1RBVEVfUkVHKSA9PSBCRklfSU9DX09QKSkKLQkJcmV0dXJuIEJGQV9UUlVFOworCWh3aWYtPmlvY19maXJtd2FyZV9sb2NrID0gYmZhX2lvY19jdF9maXJtd2FyZV9sb2NrOworCWh3aWYtPmlvY19maXJtd2FyZV91bmxvY2sgPSBiZmFfaW9jX2N0X2Zpcm13YXJlX3VubG9jazsKKwlod2lmLT5pb2Nfbm90aWZ5X2ZhaWwgPSBiZmFfaW9jX2N0X25vdGlmeV9mYWlsOworCWh3aWYtPmlvY19vd25lcnNoaXBfcmVzZXQgPSBiZmFfaW9jX2N0X293bmVyc2hpcF9yZXNldDsKKwlod2lmLT5pb2Nfc3luY19zdGFydCA9IGJmYV9pb2NfY3Rfc3luY19zdGFydDsKKwlod2lmLT5pb2Nfc3luY19qb2luID0gYmZhX2lvY19jdF9zeW5jX2pvaW47CisJaHdpZi0+aW9jX3N5bmNfbGVhdmUgPSBiZmFfaW9jX2N0X3N5bmNfbGVhdmU7CisJaHdpZi0+aW9jX3N5bmNfYWNrID0gYmZhX2lvY19jdF9zeW5jX2FjazsKKwlod2lmLT5pb2Nfc3luY19jb21wbGV0ZSA9IGJmYV9pb2NfY3Rfc3luY19jb21wbGV0ZTsKK30KIAotCXJldHVybiBCRkFfRkFMU0U7CisvKioKKyAqIENhbGxlZCBmcm9tIGJmYV9pb2NfYXR0YWNoKCkgdG8gbWFwIGFzaWMgc3BlY2lmaWMgY2FsbHMuCisgKi8KK3ZvaWQKK2JmYV9pb2Nfc2V0X2N0X2h3aWYoc3RydWN0IGJmYV9pb2NfcyAqaW9jKQoreworCWJmYV9pb2Nfc2V0X2N0eF9od2lmKGlvYywgJmh3aWZfY3QpOworCisJaHdpZl9jdC5pb2NfcGxsX2luaXQgPSBiZmFfaW9jX2N0X3BsbF9pbml0OworCWh3aWZfY3QuaW9jX3JlZ19pbml0ID0gYmZhX2lvY19jdF9yZWdfaW5pdDsKKwlod2lmX2N0LmlvY19tYXBfcG9ydCA9IGJmYV9pb2NfY3RfbWFwX3BvcnQ7CisJaHdpZl9jdC5pb2NfaXNyX21vZGVfc2V0ID0gYmZhX2lvY19jdF9pc3JfbW9kZV9zZXQ7CisJaW9jLT5pb2NfaHdpZiA9ICZod2lmX2N0OworfQorCisvKioKKyAqIENhbGxlZCBmcm9tIGJmYV9pb2NfYXR0YWNoKCkgdG8gbWFwIGFzaWMgc3BlY2lmaWMgY2FsbHMuCisgKi8KK3ZvaWQKK2JmYV9pb2Nfc2V0X2N0Ml9od2lmKHN0cnVjdCBiZmFfaW9jX3MgKmlvYykKK3sKKwliZmFfaW9jX3NldF9jdHhfaHdpZihpb2MsICZod2lmX2N0Mik7CisKKwlod2lmX2N0Mi5pb2NfcGxsX2luaXQgPSBiZmFfaW9jX2N0Ml9wbGxfaW5pdDsKKwlod2lmX2N0Mi5pb2NfcmVnX2luaXQgPSBiZmFfaW9jX2N0Ml9yZWdfaW5pdDsKKwlod2lmX2N0Mi5pb2NfbWFwX3BvcnQgPSBiZmFfaW9jX2N0Ml9tYXBfcG9ydDsKKwlod2lmX2N0Mi5pb2NfbHB1X3JlYWRfc3RhdCA9IGJmYV9pb2NfY3QyX2xwdV9yZWFkX3N0YXQ7CisJaHdpZl9jdDIuaW9jX2lzcl9tb2RlX3NldCA9IE5VTEw7CisJaW9jLT5pb2NfaHdpZiA9ICZod2lmX2N0MjsKK30KKworLyoKKyAqIFdvcmthcm91bmQgZm9yIE1TSS1YIHJlc291cmNlIGFsbG9jYXRpb24gZm9yIGNhdGFwdWx0LTIgd2l0aCBubyBhc2ljIGJsb2NrCisgKi8KKyNkZWZpbmUgSE9TVEZOX01TSVhfREVGQVVMVAkJNjQKKyNkZWZpbmUgSE9TVEZOX01TSVhfVlRfSU5ERVhfTUJPWF9FUlIJMHgzMDEzOAorI2RlZmluZSBIT1NURk5fTVNJWF9WVF9PRlNUX05VTVZUCTB4MzAxM2MKKyNkZWZpbmUgX19NU0lYX1ZUX05VTVZUX19NSwkJMHgwMDNmZjgwMAorI2RlZmluZSBfX01TSVhfVlRfTlVNVlRfX1NICQkxMQorI2RlZmluZSBfX01TSVhfVlRfTlVNVlRfKF92KQkJKChfdikgPDwgX19NU0lYX1ZUX05VTVZUX19TSCkKKyNkZWZpbmUgX19NU0lYX1ZUX09GU1RfCQkJMHgwMDAwMDdmZgordm9pZAorYmZhX2lvY19jdDJfcG93ZXJvbihzdHJ1Y3QgYmZhX2lvY19zICppb2MpCit7CisJdm9pZCBfX2lvbWVtICpyYiA9IGlvYy0+cGNpZGV2LnBjaV9iYXJfa3ZhOworCXUzMglyMzI7CisKKwlyMzIgPSByZWFkbChyYiArIEhPU1RGTl9NU0lYX1ZUX09GU1RfTlVNVlQpOworCWlmIChyMzIgJiBfX01TSVhfVlRfTlVNVlRfX01LKSB7CisJCXdyaXRlbChyMzIgJiBfX01TSVhfVlRfT0ZTVF8sCisJCQlyYiArIEhPU1RGTl9NU0lYX1ZUX0lOREVYX01CT1hfRVJSKTsKKwkJcmV0dXJuOworCX0KKworCXdyaXRlbChfX01TSVhfVlRfTlVNVlRfKEhPU1RGTl9NU0lYX0RFRkFVTFQgLSAxKSB8CisJCUhPU1RGTl9NU0lYX0RFRkFVTFQgKiBiZmFfaW9jX3BjaWZuKGlvYyksCisJCXJiICsgSE9TVEZOX01TSVhfVlRfT0ZTVF9OVU1WVCk7CisJd3JpdGVsKEhPU1RGTl9NU0lYX0RFRkFVTFQgKiBiZmFfaW9jX3BjaWZuKGlvYyksCisJCXJiICsgSE9TVEZOX01TSVhfVlRfSU5ERVhfTUJPWF9FUlIpOwogfQogCiBiZmFfc3RhdHVzX3QKLWJmYV9pb2NfY3RfcGxsX2luaXQodm9pZCBfX2lvbWVtICpyYiwgYmZhX2Jvb2xlYW5fdCBmY21vZGUpCitiZmFfaW9jX2N0X3BsbF9pbml0KHZvaWQgX19pb21lbSAqcmIsIGVudW0gYmZpX2FzaWNfbW9kZSBtb2RlKQogewogCXUzMglwbGxfc2NsaywgcGxsX2ZjbGssIHIzMjsKKwliZmFfYm9vbGVhbl90IGZjbW9kZSA9IChtb2RlID09IEJGSV9BU0lDX01PREVfRkMpOwogCi0JcGxsX3NjbGsgPSBfX0FQUF9QTExfMzEyX0xSRVNFVE4gfCBfX0FQUF9QTExfMzEyX0VOQVJTVCB8Ci0JCV9fQVBQX1BMTF8zMTJfUlNFTDIwMDUwMCB8IF9fQVBQX1BMTF8zMTJfUDBfMSgzVSkgfAotCQlfX0FQUF9QTExfMzEyX0pJVExNVDBfMSgzVSkgfAotCQlfX0FQUF9QTExfMzEyX0NOVExNVDBfMSgxVSk7Ci0JcGxsX2ZjbGsgPSBfX0FQUF9QTExfNDI1X0xSRVNFVE4gfCBfX0FQUF9QTExfNDI1X0VOQVJTVCB8Ci0JCV9fQVBQX1BMTF80MjVfUlNFTDIwMDUwMCB8IF9fQVBQX1BMTF80MjVfUDBfMSgzVSkgfAotCQlfX0FQUF9QTExfNDI1X0pJVExNVDBfMSgzVSkgfAotCQlfX0FQUF9QTExfNDI1X0NOVExNVDBfMSgxVSk7CisJcGxsX3NjbGsgPSBfX0FQUF9QTExfU0NMS19MUkVTRVROIHwgX19BUFBfUExMX1NDTEtfRU5BUlNUIHwKKwkJX19BUFBfUExMX1NDTEtfUlNFTDIwMDUwMCB8IF9fQVBQX1BMTF9TQ0xLX1AwXzEoM1UpIHwKKwkJX19BUFBfUExMX1NDTEtfSklUTE1UMF8xKDNVKSB8CisJCV9fQVBQX1BMTF9TQ0xLX0NOVExNVDBfMSgxVSk7CisJcGxsX2ZjbGsgPSBfX0FQUF9QTExfTENMS19MUkVTRVROIHwgX19BUFBfUExMX0xDTEtfRU5BUlNUIHwKKwkJX19BUFBfUExMX0xDTEtfUlNFTDIwMDUwMCB8IF9fQVBQX1BMTF9MQ0xLX1AwXzEoM1UpIHwKKwkJX19BUFBfUExMX0xDTEtfSklUTE1UMF8xKDNVKSB8CisJCV9fQVBQX1BMTF9MQ0xLX0NOVExNVDBfMSgxVSk7CisKIAlpZiAoZmNtb2RlKSB7CiAJCXdyaXRlbCgwLCAocmIgKyBPUF9NT0RFKSk7CiAJCXdyaXRlbChfX0FQUF9FTVNfQ01MQ0tTRUwgfCBfX0FQUF9FTVNfUkVGQ0tCVUZFTjIgfApAQCAtNDkxLDIwICs2MjEsMjEgQEAKIAl3cml0ZWwoMHhmZmZmZmZmZlUsIChyYiArIEhPU1RGTjFfSU5UX1NUQVRVUykpOwogCXdyaXRlbCgweGZmZmZmZmZmVSwgKHJiICsgSE9TVEZOMF9JTlRfTVNLKSk7CiAJd3JpdGVsKDB4ZmZmZmZmZmZVLCAocmIgKyBIT1NURk4xX0lOVF9NU0spKTsKLQl3cml0ZWwocGxsX3NjbGsgfCBfX0FQUF9QTExfMzEyX0xPR0lDX1NPRlRfUkVTRVQsCi0JCQlyYiArIEFQUF9QTExfMzEyX0NUTF9SRUcpOwotCXdyaXRlbChwbGxfZmNsayB8IF9fQVBQX1BMTF80MjVfTE9HSUNfU09GVF9SRVNFVCwKLQkJCXJiICsgQVBQX1BMTF80MjVfQ1RMX1JFRyk7Ci0Jd3JpdGVsKHBsbF9zY2xrIHwgX19BUFBfUExMXzMxMl9MT0dJQ19TT0ZUX1JFU0VUIHwgX19BUFBfUExMXzMxMl9FTkFCTEUsCi0JCQlyYiArIEFQUF9QTExfMzEyX0NUTF9SRUcpOwotCXdyaXRlbChwbGxfZmNsayB8IF9fQVBQX1BMTF80MjVfTE9HSUNfU09GVF9SRVNFVCB8IF9fQVBQX1BMTF80MjVfRU5BQkxFLAotCQkJcmIgKyBBUFBfUExMXzQyNV9DVExfUkVHKTsKKwl3cml0ZWwocGxsX3NjbGsgfCBfX0FQUF9QTExfU0NMS19MT0dJQ19TT0ZUX1JFU0VULAorCQkJcmIgKyBBUFBfUExMX1NDTEtfQ1RMX1JFRyk7CisJd3JpdGVsKHBsbF9mY2xrIHwgX19BUFBfUExMX0xDTEtfTE9HSUNfU09GVF9SRVNFVCwKKwkJCXJiICsgQVBQX1BMTF9MQ0xLX0NUTF9SRUcpOworCXdyaXRlbChwbGxfc2NsayB8IF9fQVBQX1BMTF9TQ0xLX0xPR0lDX1NPRlRfUkVTRVQgfAorCQlfX0FQUF9QTExfU0NMS19FTkFCTEUsIHJiICsgQVBQX1BMTF9TQ0xLX0NUTF9SRUcpOworCXdyaXRlbChwbGxfZmNsayB8IF9fQVBQX1BMTF9MQ0xLX0xPR0lDX1NPRlRfUkVTRVQgfAorCQlfX0FQUF9QTExfTENMS19FTkFCTEUsIHJiICsgQVBQX1BMTF9MQ0xLX0NUTF9SRUcpOwogCXJlYWRsKHJiICsgSE9TVEZOMF9JTlRfTVNLKTsKIAl1ZGVsYXkoMjAwMCk7CiAJd3JpdGVsKDB4ZmZmZmZmZmZVLCAocmIgKyBIT1NURk4wX0lOVF9TVEFUVVMpKTsKIAl3cml0ZWwoMHhmZmZmZmZmZlUsIChyYiArIEhPU1RGTjFfSU5UX1NUQVRVUykpOwotCXdyaXRlbChwbGxfc2NsayB8IF9fQVBQX1BMTF8zMTJfRU5BQkxFLCByYiArIEFQUF9QTExfMzEyX0NUTF9SRUcpOwotCXdyaXRlbChwbGxfZmNsayB8IF9fQVBQX1BMTF80MjVfRU5BQkxFLCByYiArIEFQUF9QTExfNDI1X0NUTF9SRUcpOworCXdyaXRlbChwbGxfc2NsayB8IF9fQVBQX1BMTF9TQ0xLX0VOQUJMRSwgcmIgKyBBUFBfUExMX1NDTEtfQ1RMX1JFRyk7CisJd3JpdGVsKHBsbF9mY2xrIHwgX19BUFBfUExMX0xDTEtfRU5BQkxFLCByYiArIEFQUF9QTExfTENMS19DVExfUkVHKTsKKwogCWlmICghZmNtb2RlKSB7CiAJCXdyaXRlbChfX1BNTV8xVF9SRVNFVF9QLCAocmIgKyBQTU1fMVRfUkVTRVRfUkVHX1AwKSk7CiAJCXdyaXRlbChfX1BNTV8xVF9SRVNFVF9QLCAocmIgKyBQTU1fMVRfUkVTRVRfUkVHX1AxKSk7CkBAIC01MjQsMyArNjU1LDIwNiBAQAogCXdyaXRlbCgwLCAocmIgKyBNQklTVF9DVExfUkVHKSk7CiAJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CisKK3N0YXRpYyB2b2lkCitiZmFfaW9jX2N0Ml9zY2xrX2luaXQodm9pZCBfX2lvbWVtICpyYikKK3sKKwl1MzIgcjMyOworCisJLyoKKwkgKiBwdXQgc19jbGsgUExMIGFuZCBQTEwgRlNNIGluIHJlc2V0CisJICovCisJcjMyID0gcmVhZGwoKHJiICsgQ1QyX0FQUF9QTExfU0NMS19DVExfUkVHKSk7CisJcjMyICY9IH4oX19BUFBfUExMX1NDTEtfRU5BQkxFIHwgX19BUFBfUExMX1NDTEtfTFJFU0VUTik7CisJcjMyIHw9IChfX0FQUF9QTExfU0NMS19FTkFSU1QgfCBfX0FQUF9QTExfU0NMS19CWVBBU1MgfAorCQlfX0FQUF9QTExfU0NMS19MT0dJQ19TT0ZUX1JFU0VUKTsKKwl3cml0ZWwocjMyLCAocmIgKyBDVDJfQVBQX1BMTF9TQ0xLX0NUTF9SRUcpKTsKKworCS8qCisJICogSWdub3JlIG1vZGUgYW5kIHByb2dyYW0gZm9yIHRoZSBtYXggY2xvY2sgKHdoaWNoIGlzIEZDMTYpCisJICogRmlybXdhcmUvTkZDIHdpbGwgZG8gdGhlIFBMTCBpbml0IGFwcHJvcGlhdGVseQorCSAqLworCXIzMiA9IHJlYWRsKChyYiArIENUMl9BUFBfUExMX1NDTEtfQ1RMX1JFRykpOworCXIzMiAmPSB+KF9fQVBQX1BMTF9TQ0xLX1JFRkNMS19TRUwgfCBfX0FQUF9QTExfU0NMS19DTEtfRElWMik7CisJd3JpdGVsKHIzMiwgKHJiICsgQ1QyX0FQUF9QTExfU0NMS19DVExfUkVHKSk7CisKKwkvKgorCSAqIHdoaWxlIGRvaW5nIFBMTCBpbml0IGRvbnQgY2xvY2sgZ2F0ZSBldGhlcm5ldCBzdWJzeXN0ZW0KKwkgKi8KKwlyMzIgPSByZWFkbCgocmIgKyBDVDJfQ0hJUF9NSVNDX1BSRykpOworCXdyaXRlbChyMzIgfCBfX0VUSF9DTEtfRU5BQkxFX1BPUlQwLCAocmIgKyBDVDJfQ0hJUF9NSVNDX1BSRykpOworCisJcjMyID0gcmVhZGwoKHJiICsgQ1QyX1BDSUVfTUlTQ19SRUcpKTsKKwl3cml0ZWwocjMyIHwgX19FVEhfQ0xLX0VOQUJMRV9QT1JUMSwgKHJiICsgQ1QyX1BDSUVfTUlTQ19SRUcpKTsKKworCS8qCisJICogc2V0IHNjbGsgdmFsdWUKKwkgKi8KKwlyMzIgPSByZWFkbCgocmIgKyBDVDJfQVBQX1BMTF9TQ0xLX0NUTF9SRUcpKTsKKwlyMzIgJj0gKF9fUF9TQ0xLX1BMTF9MT0NLIHwgX19BUFBfUExMX1NDTEtfUkVGQ0xLX1NFTCB8CisJCV9fQVBQX1BMTF9TQ0xLX0NMS19ESVYyKTsKKwl3cml0ZWwocjMyIHwgMHgxMDYxNzMxYiwgKHJiICsgQ1QyX0FQUF9QTExfU0NMS19DVExfUkVHKSk7CisKKwkvKgorCSAqIHBvbGwgZm9yIHNfY2xrIGxvY2sgb3IgZGVsYXkgMW1zCisJICovCisJdWRlbGF5KDEwMDApOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY19jdDJfbGNsa19pbml0KHZvaWQgX19pb21lbSAqcmIpCit7CisJdTMyIHIzMjsKKworCS8qCisJICogcHV0IGxfY2xrIFBMTCBhbmQgUExMIEZTTSBpbiByZXNldAorCSAqLworCXIzMiA9IHJlYWRsKChyYiArIENUMl9BUFBfUExMX0xDTEtfQ1RMX1JFRykpOworCXIzMiAmPSB+KF9fQVBQX1BMTF9MQ0xLX0VOQUJMRSB8IF9fQVBQX1BMTF9MQ0xLX0xSRVNFVE4pOworCXIzMiB8PSAoX19BUFBfUExMX0xDTEtfRU5BUlNUIHwgX19BUFBfUExMX0xDTEtfQllQQVNTIHwKKwkJX19BUFBfUExMX0xDTEtfTE9HSUNfU09GVF9SRVNFVCk7CisJd3JpdGVsKHIzMiwgKHJiICsgQ1QyX0FQUF9QTExfTENMS19DVExfUkVHKSk7CisKKwkvKgorCSAqIHNldCBMUFUgc3BlZWQgKHNldCBmb3IgRkMxNiB3aGljaCB3aWxsIHdvcmsgZm9yIG90aGVyIG1vZGVzKQorCSAqLworCXIzMiA9IHJlYWRsKChyYiArIENUMl9DSElQX01JU0NfUFJHKSk7CisJd3JpdGVsKHIzMiwgKHJiICsgQ1QyX0NISVBfTUlTQ19QUkcpKTsKKworCS8qCisJICogc2V0IExQVSBoYWxmIHNwZWVkIChzZXQgZm9yIEZDMTYgd2hpY2ggd2lsbCB3b3JrIGZvciBvdGhlciBtb2RlcykKKwkgKi8KKwlyMzIgPSByZWFkbCgocmIgKyBDVDJfQVBQX1BMTF9MQ0xLX0NUTF9SRUcpKTsKKwl3cml0ZWwocjMyLCAocmIgKyBDVDJfQVBQX1BMTF9MQ0xLX0NUTF9SRUcpKTsKKworCS8qCisJICogc2V0IGxjbGsgZm9yIG1vZGUgKHNldCBmb3IgRkMxNikKKwkgKi8KKwlyMzIgPSByZWFkbCgocmIgKyBDVDJfQVBQX1BMTF9MQ0xLX0NUTF9SRUcpKTsKKwlyMzIgJj0gKF9fUF9MQ0xLX1BMTF9MT0NLIHwgX19BUFBfTFBVQ0xLX0hBTEZTUEVFRCk7CisJcjMyIHw9IDB4MjBjMTczMWI7CisJd3JpdGVsKHIzMiwgKHJiICsgQ1QyX0FQUF9QTExfTENMS19DVExfUkVHKSk7CisKKwkvKgorCSAqIHBvbGwgZm9yIHNfY2xrIGxvY2sgb3IgZGVsYXkgMW1zCisJICovCisJdWRlbGF5KDEwMDApOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvY19jdDJfbWVtX2luaXQodm9pZCBfX2lvbWVtICpyYikKK3sKKwl1MzIJcjMyOworCisJcjMyID0gcmVhZGwoKHJiICsgUFNTX0NUTF9SRUcpKTsKKwlyMzIgJj0gfl9fUFNTX0xNRU1fUkVTRVQ7CisJd3JpdGVsKHIzMiwgKHJiICsgUFNTX0NUTF9SRUcpKTsKKwl1ZGVsYXkoMTAwMCk7CisKKwl3cml0ZWwoX19FRFJBTV9CSVNUUl9TVEFSVCwgKHJiICsgQ1QyX01CSVNUX0NUTF9SRUcpKTsKKwl1ZGVsYXkoMTAwMCk7CisJd3JpdGVsKDAsIChyYiArIENUMl9NQklTVF9DVExfUkVHKSk7Cit9CisKK3ZvaWQKK2JmYV9pb2NfY3QyX21hY19yZXNldCh2b2lkIF9faW9tZW0gKnJiKQoreworCXUzMglyMzI7CisKKwliZmFfaW9jX2N0Ml9zY2xrX2luaXQocmIpOworCWJmYV9pb2NfY3QyX2xjbGtfaW5pdChyYik7CisKKwkvKgorCSAqIHJlbGVhc2Ugc29mdCByZXNldCBvbiBzX2NsayAmIGxfY2xrCisJICovCisJcjMyID0gcmVhZGwoKHJiICsgQ1QyX0FQUF9QTExfU0NMS19DVExfUkVHKSk7CisJd3JpdGVsKHIzMiAmIH5fX0FQUF9QTExfU0NMS19MT0dJQ19TT0ZUX1JFU0VULAorCQkocmIgKyBDVDJfQVBQX1BMTF9TQ0xLX0NUTF9SRUcpKTsKKworCS8qCisJICogcmVsZWFzZSBzb2Z0IHJlc2V0IG9uIHNfY2xrICYgbF9jbGsKKwkgKi8KKwlyMzIgPSByZWFkbCgocmIgKyBDVDJfQVBQX1BMTF9MQ0xLX0NUTF9SRUcpKTsKKwl3cml0ZWwocjMyICYgfl9fQVBQX1BMTF9MQ0xLX0xPR0lDX1NPRlRfUkVTRVQsCisJCShyYiArIENUMl9BUFBfUExMX0xDTEtfQ1RMX1JFRykpOworCisJLyogcHV0IHBvcnQwLCBwb3J0MSBNQUMgJiBBSEIgaW4gcmVzZXQgKi8KKwl3cml0ZWwoKF9fQ1NJX01BQ19SRVNFVCB8IF9fQ1NJX01BQ19BSEJfUkVTRVQpLAorCQlyYiArIENUMl9DU0lfTUFDX0NPTlRST0xfUkVHKDApKTsKKwl3cml0ZWwoKF9fQ1NJX01BQ19SRVNFVCB8IF9fQ1NJX01BQ19BSEJfUkVTRVQpLAorCQlyYiArIENUMl9DU0lfTUFDX0NPTlRST0xfUkVHKDEpKTsKK30KKworI2RlZmluZSBDVDJfTkZDX01BWF9ERUxBWQkxMDAwCitiZmFfc3RhdHVzX3QKK2JmYV9pb2NfY3QyX3BsbF9pbml0KHZvaWQgX19pb21lbSAqcmIsIGVudW0gYmZpX2FzaWNfbW9kZSBtb2RlKQoreworCXUzMgl3Z24sIHIzMjsKKwlpbnQgaTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBQTEwgaWYgbm90IGFscmVhZHkgZG9uZSBieSBORkMKKwkgKi8KKwl3Z24gPSByZWFkbChyYiArIENUMl9XR05fU1RBVFVTKTsKKwlpZiAoISh3Z24gJiBfX0dMQkxfUEZfVkZfQ0ZHX1JEWSkpIHsKKwkJd3JpdGVsKF9fSEFMVF9ORkNfQ09OVFJPTExFUiwgcmIgKyBDVDJfTkZDX0NTUl9TRVRfUkVHKTsKKwkJZm9yIChpID0gMDsgaSA8IENUMl9ORkNfTUFYX0RFTEFZOyBpKyspIHsKKwkJCXIzMiA9IHJlYWRsKHJiICsgQ1QyX05GQ19DU1JfU0VUX1JFRyk7CisJCQlpZiAocjMyICYgX19ORkNfQ09OVFJPTExFUl9IQUxURUQpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMTAwMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIE1hc2sgdGhlIGludGVycnVwdHMgYW5kIGNsZWFyIGFueQorCSAqIHBlbmRpbmcgaW50ZXJydXB0cy4KKwkgKi8KKwl3cml0ZWwoMSwgKHJiICsgQ1QyX0xQVTBfSE9TVEZOX01CT1gwX01TSykpOworCXdyaXRlbCgxLCAocmIgKyBDVDJfTFBVMV9IT1NURk5fTUJPWDBfTVNLKSk7CisKKwlyMzIgPSByZWFkbCgocmIgKyBDVDJfTFBVMF9IT1NURk5fQ01EX1NUQVQpKTsKKwlpZiAocjMyID09IDEpIHsKKwkJd3JpdGVsKDEsIChyYiArIENUMl9MUFUwX0hPU1RGTl9DTURfU1RBVCkpOworCQlyZWFkbCgocmIgKyBDVDJfTFBVMF9IT1NURk5fQ01EX1NUQVQpKTsKKwl9CisJcjMyID0gcmVhZGwoKHJiICsgQ1QyX0xQVTFfSE9TVEZOX0NNRF9TVEFUKSk7CisJaWYgKHIzMiA9PSAxKSB7CisJCXdyaXRlbCgxLCAocmIgKyBDVDJfTFBVMV9IT1NURk5fQ01EX1NUQVQpKTsKKwkJcmVhZGwoKHJiICsgQ1QyX0xQVTFfSE9TVEZOX0NNRF9TVEFUKSk7CisJfQorCisJYmZhX2lvY19jdDJfbWFjX3Jlc2V0KHJiKTsKKwliZmFfaW9jX2N0Ml9zY2xrX2luaXQocmIpOworCWJmYV9pb2NfY3QyX2xjbGtfaW5pdChyYik7CisKKwkvKgorCSAqIHJlbGVhc2Ugc29mdCByZXNldCBvbiBzX2NsayAmIGxfY2xrCisJICovCisJcjMyID0gcmVhZGwoKHJiICsgQ1QyX0FQUF9QTExfU0NMS19DVExfUkVHKSk7CisJd3JpdGVsKHIzMiAmIH5fX0FQUF9QTExfU0NMS19MT0dJQ19TT0ZUX1JFU0VULAorCQkocmIgKyBDVDJfQVBQX1BMTF9TQ0xLX0NUTF9SRUcpKTsKKworCS8qCisJICogcmVsZWFzZSBzb2Z0IHJlc2V0IG9uIHNfY2xrICYgbF9jbGsKKwkgKi8KKwlyMzIgPSByZWFkbCgocmIgKyBDVDJfQVBQX1BMTF9MQ0xLX0NUTF9SRUcpKTsKKwl3cml0ZWwocjMyICYgfl9fQVBQX1BMTF9MQ0xLX0xPR0lDX1NPRlRfUkVTRVQsCisJCShyYiArIENUMl9BUFBfUExMX0xDTEtfQ1RMX1JFRykpOworCisJLyoKKwkgKiBBbm5vdW5jZSBmbGFzaCBkZXZpY2UgcHJlc2VuY2UsIGlmIGZsYXNoIHdhcyBjb3JydXB0ZWQuCisJICovCisJaWYgKHdnbiA9PSAoX19XR05fUkVBRFkgfCBfX0dMQkxfUEZfVkZfQ0ZHX1JEWSkpIHsKKwkJcjMyID0gcmVhZGwoKHJiICsgUFNTX0dQSU9fT1VUX1JFRykpOworCQl3cml0ZWwocjMyICYgfjEsIChyYiArIFBTU19HUElPX09VVF9SRUcpKTsKKwkJcjMyID0gcmVhZGwoKHJiICsgUFNTX0dQSU9fT0VfUkVHKSk7CisJCXdyaXRlbChyMzIgfCAxLCAocmIgKyBQU1NfR1BJT19PRV9SRUcpKTsKKwl9CisKKwliZmFfaW9jX2N0Ml9tZW1faW5pdChyYik7CisKKwl3cml0ZWwoQkZJX0lPQ19VTklOSVQsIChyYiArIENUMl9CRkFfSU9DMF9TVEFURV9SRUcpKTsKKwl3cml0ZWwoQkZJX0lPQ19VTklOSVQsIChyYiArIENUMl9CRkFfSU9DMV9TVEFURV9SRUcpKTsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX21vZHVsZXMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX21vZHVsZXMuaAppbmRleCBhYjc5ZmY2Li4xYzZlZmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9tb2R1bGVzLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfbW9kdWxlcy5oCkBAIC0yOSwxNCArMjksMjEgQEAKICNpbmNsdWRlICJiZmFfcG9ydC5oIgogCiBzdHJ1Y3QgYmZhX21vZHVsZXNfcyB7CisJc3RydWN0IGJmYV9mY2RpYWdfcwlmY2RpYWc7CQkvKiBmY2RpYWcgbW9kdWxlICovCiAJc3RydWN0IGJmYV9mY3BvcnRfcwlmY3BvcnQ7CQkvKiAgZmMgcG9ydCBtb2R1bGUJICAgICAgKi8KIAlzdHJ1Y3QgYmZhX2ZjeHBfbW9kX3MJZmN4cF9tb2Q7CS8qICBmY3hwIG1vZHVsZQkgICAgICAqLwogCXN0cnVjdCBiZmFfbHBzX21vZF9zCWxwc19tb2Q7CS8qICBmY3hwIG1vZHVsZQkgICAgICAqLwogCXN0cnVjdCBiZmFfdWZfbW9kX3MJdWZfbW9kOwkJLyogIHVuc29saWNpdGVkIGZyYW1lIG1vZHVsZSAqLwogCXN0cnVjdCBiZmFfcnBvcnRfbW9kX3MJcnBvcnRfbW9kOwkvKiAgcmVtb3RlIHBvcnQgbW9kdWxlCSAgICAgICovCi0Jc3RydWN0IGJmYV9mY3BpbV9tb2RfcwlmY3BpbV9tb2Q7CS8qICBGQ1AgaW5pdGlhdG9yIG1vZHVsZSAgICAgKi8KKwlzdHJ1Y3QgYmZhX2ZjcF9tb2RfcwlmY3BfbW9kOwkvKiAgRkNQIGluaXRpYXRvciBtb2R1bGUgICAgICovCiAJc3RydWN0IGJmYV9zZ3BnX21vZF9zCXNncGdfbW9kOwkvKiAgU0cgcGFnZSBtb2R1bGUJICAgICAgKi8KIAlzdHJ1Y3QgYmZhX3BvcnRfcwlwb3J0OwkJLyogIFBoeXNpY2FsIHBvcnQgbW9kdWxlICAgICAqLworCXN0cnVjdCBiZmFfYWJsa19zCWFibGs7CQkvKiAgQVNJQyBibG9jayBjb25maWcgbW9kdWxlICovCisJc3RydWN0IGJmYV9jZWVfcwljZWU7CQkvKiAgQ0VFIE1vZHVsZQkqLworCXN0cnVjdCBiZmFfc2ZwX3MJc2ZwOwkJLyogIFNGUCBtb2R1bGUJKi8KKwlzdHJ1Y3QgYmZhX2ZsYXNoX3MJZmxhc2g7CQkvKiAgZmxhc2ggbW9kdWxlICovCisJc3RydWN0IGJmYV9kaWFnX3MJZGlhZ19tb2Q7CS8qICBkaWFnbm9zdGljcyBtb2R1bGUJKi8KKwlzdHJ1Y3QgYmZhX3BoeV9zCXBoeTsJCS8qICBwaHkgbW9kdWxlCQkqLwogfTsKIAogLyoKQEAgLTUxLDE3ICs1OCwxNiBAQAogCUJGQV9UUkNfSEFMX0lPQ0ZDX0NCCT0gNSwKIH07CiAKLQogLyoKICAqIE1hY3JvIHRvIGRlZmluZSBhIG5ldyBCRkEgbW9kdWxlCiAgKi8KICNkZWZpbmUgQkZBX01PRFVMRShfX21vZCkJCQkJCQlcCiAJc3RhdGljIHZvaWQgYmZhXyAjIyBfX21vZCAjIyBfbWVtaW5mbygJCQkJXAotCQkJc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKm5kbV9sZW4sCVwKLQkJCXUzMiAqZG1fbGVuKTsgICAgICBcCisJCQlzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCQkJXAorCQkJc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sCQkJXAorCQkJc3RydWN0IGJmYV9zICpiZmEpOwkJCQlcCiAJc3RhdGljIHZvaWQgYmZhXyAjIyBfX21vZCAjIyBfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLAkJXAogCQkJdm9pZCAqYmZhZCwgc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLAlcCi0JCQlzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywJCQlcCiAJCQlzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYpOyAgICAgIFwKIAlzdGF0aWMgdm9pZCBiZmFfICMjIF9fbW9kICMjIF9kZXRhY2goc3RydWN0IGJmYV9zICpiZmEpOyAgICAgIFwKIAlzdGF0aWMgdm9pZCBiZmFfICMjIF9fbW9kICMjIF9zdGFydChzdHJ1Y3QgYmZhX3MgKmJmYSk7ICAgICAgXApAQCAtODcsMTEgKzkzLDExIEBACiAgKiBjYW4gbGVhdmUgZW50cnkgcG9pbnRzIGFzIE5VTEwpCiAgKi8KIHN0cnVjdCBiZmFfbW9kdWxlX3MgewotCXZvaWQgKCptZW1pbmZvKSAoc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmttX2xlbiwKLQkJCXUzMiAqZG1fbGVuKTsKKwl2b2lkICgqbWVtaW5mbykgKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKKwkJCSBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywKKwkJCSBzdHJ1Y3QgYmZhX3MgKmJmYSk7CiAJdm9pZCAoKmF0dGFjaCkgKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLAogCQkJc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLAotCQkJc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sCiAJCQlzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYpOwogCXZvaWQgKCpkZXRhY2gpIChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiAJdm9pZCAoKnN0YXJ0KSAoc3RydWN0IGJmYV9zICpiZmEpOwpAQCAtMTA5LDE5ICsxMTUsMjAgQEAKIAlzdHJ1Y3QgYmZhX3RpbWVyX21vZF9zCXRpbWVyX21vZDsJLyogIHRpbWVyIG1vZHVsZQkgICAgKi8KIAlzdHJ1Y3QgYmZhX21vZHVsZXNfcwltb2R1bGVzOwkvKiAgQkZBIG1vZHVsZXMJICAgICovCiAJc3RydWN0IGxpc3RfaGVhZAljb21wX3E7CQkvKiAgcGVuZGluZyBjb21wbGV0aW9ucyAgICAgKi8KLQliZmFfYm9vbGVhbl90CQlybWVfcHJvY2VzczsJLyogIFJNRSBwcm9jZXNzaW5nIGVuYWJsZWQgICovCisJYmZhX2Jvb2xlYW5fdAkJcXVldWVfcHJvY2VzczsJLyogIHF1ZXVlIHByb2Nlc3NpbmcgZW5hYmxlZCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJcmVxcV93YWl0cVtCRklfSU9DX01BWF9DUVNdOwogCWJmYV9ib29sZWFuX3QJCWZjczsJCS8qICBGQ1MgaXMgYXR0YWNoZWQgdG8gQkZBICovCiAJc3RydWN0IGJmYV9tc2l4X3MJbXNpeDsKIH07CiAKIGV4dGVybiBiZmFfYm9vbGVhbl90IGJmYV9hdXRvX3JlY292ZXI7CitleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX2ZjZGlhZzsKIGV4dGVybiBzdHJ1Y3QgYmZhX21vZHVsZV9zIGhhbF9tb2Rfc2dwZzsKIGV4dGVybiBzdHJ1Y3QgYmZhX21vZHVsZV9zIGhhbF9tb2RfZmNwb3J0OwogZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgaGFsX21vZF9mY3hwOwogZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgaGFsX21vZF9scHM7CiBleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX3VmOwogZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgaGFsX21vZF9ycG9ydDsKLWV4dGVybiBzdHJ1Y3QgYmZhX21vZHVsZV9zIGhhbF9tb2RfZmNwaW07CitleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX2ZjcDsKIAogI2VuZGlmIC8qIF9fQkZBX01PRFVMRVNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9wb3J0LmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9wb3J0LmMKaW5kZXggM2Y4ZTlkNi4uOTVlNGFkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3BvcnQuYwpAQCAtMjQsOCArMjQsNiBAQAogCiBCRkFfVFJDX0ZJTEUoQ05BLCBQT1JUKTsKIAotI2RlZmluZSBiZmFfaW9jX3BvcnRpZChfX2lvYykgKChfX2lvYyktPnBvcnRfaWQpCi0KIHN0YXRpYyB2b2lkCiBiZmFfcG9ydF9zdGF0c19zd2FwKHN0cnVjdCBiZmFfcG9ydF9zICpwb3J0LCB1bmlvbiBiZmFfcG9ydF9zdGF0c191ICpzdGF0cykKIHsKQEAgLTIzNiw2ICsyMzQsMTIgQEAKIHsKIAlzdHJ1Y3QgYmZpX3BvcnRfZ2VuZXJpY19yZXFfcyAqbTsKIAorCS8qIElmIHBvcnQgaXMgUEJDIGRpc2FibGVkLCByZXR1cm4gZXJyb3IgKi8KKwlpZiAocG9ydC0+cGJjX2Rpc2FibGVkKSB7CisJCWJmYV90cmMocG9ydCwgQkZBX1NUQVRVU19QQkMpOworCQlyZXR1cm4gQkZBX1NUQVRVU19QQkM7CisJfQorCiAJaWYgKGJmYV9pb2NfaXNfZGlzYWJsZWQocG9ydC0+aW9jKSkgewogCQliZmFfdHJjKHBvcnQsIEJGQV9TVEFUVVNfSU9DX0RJU0FCTEVEKTsKIAkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX0RJU0FCTEVEOwpAQCAtMjgwLDYgKzI4NCwxMiBAQAogewogCXN0cnVjdCBiZmlfcG9ydF9nZW5lcmljX3JlcV9zICptOwogCisJLyogSWYgcG9ydCBpcyBQQkMgZGlzYWJsZWQsIHJldHVybiBlcnJvciAqLworCWlmIChwb3J0LT5wYmNfZGlzYWJsZWQpIHsKKwkJYmZhX3RyYyhwb3J0LCBCRkFfU1RBVFVTX1BCQyk7CisJCXJldHVybiBCRkFfU1RBVFVTX1BCQzsKKwl9CisKIAlpZiAoYmZhX2lvY19pc19kaXNhYmxlZChwb3J0LT5pb2MpKSB7CiAJCWJmYV90cmMocG9ydCwgQkZBX1NUQVRVU19JT0NfRElTQUJMRUQpOwogCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfRElTQUJMRUQ7CkBAIC0zODcsMzIgKzM5Nyw0MyBAQAogfQogCiAvKgotICogYmZhX3BvcnRfaGJmYWlsKCkKKyAqIGJmYV9wb3J0X25vdGlmeSgpCiAgKgorICogUG9ydCBtb2R1bGUgSU9DIGV2ZW50IGhhbmRsZXIKICAqCiAgKiBAcGFyYW1baW5dIFBvaW50ZXIgdG8gdGhlIFBvcnQgbW9kdWxlIGRhdGEgc3RydWN0dXJlLgorICogQHBhcmFtW2luXSBJT0MgZXZlbnQgc3RydWN0dXJlCiAgKgogICogQHJldHVybiB2b2lkCiAgKi8KIHZvaWQKLWJmYV9wb3J0X2hiZmFpbCh2b2lkICphcmcpCitiZmFfcG9ydF9ub3RpZnkodm9pZCAqYXJnLCBlbnVtIGJmYV9pb2NfZXZlbnRfZSBldmVudCkKIHsKIAlzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCA9IChzdHJ1Y3QgYmZhX3BvcnRfcyAqKSBhcmc7CiAKLQkvKiBGYWlsIGFueSBwZW5kaW5nIGdldF9zdGF0cy9jbGVhcl9zdGF0cyByZXF1ZXN0cyAqLwotCWlmIChwb3J0LT5zdGF0c19idXN5KSB7Ci0JCWlmIChwb3J0LT5zdGF0c19jYmZuKQotCQkJcG9ydC0+c3RhdHNfY2Jmbihwb3J0LT5zdGF0c19jYmFyZywgQkZBX1NUQVRVU19GQUlMRUQpOwotCQlwb3J0LT5zdGF0c19jYmZuID0gTlVMTDsKLQkJcG9ydC0+c3RhdHNfYnVzeSA9IEJGQV9GQUxTRTsKLQl9CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lPQ19FX0RJU0FCTEVEOgorCWNhc2UgQkZBX0lPQ19FX0ZBSUxFRDoKKwkJLyogRmFpbCBhbnkgcGVuZGluZyBnZXRfc3RhdHMvY2xlYXJfc3RhdHMgcmVxdWVzdHMgKi8KKwkJaWYgKHBvcnQtPnN0YXRzX2J1c3kpIHsKKwkJCWlmIChwb3J0LT5zdGF0c19jYmZuKQorCQkJCXBvcnQtPnN0YXRzX2NiZm4ocG9ydC0+c3RhdHNfY2JhcmcsCisJCQkJCQlCRkFfU1RBVFVTX0ZBSUxFRCk7CisJCQlwb3J0LT5zdGF0c19jYmZuID0gTlVMTDsKKwkJCXBvcnQtPnN0YXRzX2J1c3kgPSBCRkFfRkFMU0U7CisJCX0KIAotCS8qIENsZWFyIGFueSBlbmFibGUvZGlzYWJsZSBpcyBwZW5kaW5nICovCi0JaWYgKHBvcnQtPmVuZGlzX3BlbmRpbmcpIHsKLQkJaWYgKHBvcnQtPmVuZGlzX2NiZm4pCi0JCQlwb3J0LT5lbmRpc19jYmZuKHBvcnQtPmVuZGlzX2NiYXJnLCBCRkFfU1RBVFVTX0ZBSUxFRCk7Ci0JCXBvcnQtPmVuZGlzX2NiZm4gPSBOVUxMOwotCQlwb3J0LT5lbmRpc19wZW5kaW5nID0gQkZBX0ZBTFNFOworCQkvKiBDbGVhciBhbnkgZW5hYmxlL2Rpc2FibGUgaXMgcGVuZGluZyAqLworCQlpZiAocG9ydC0+ZW5kaXNfcGVuZGluZykgeworCQkJaWYgKHBvcnQtPmVuZGlzX2NiZm4pCisJCQkJcG9ydC0+ZW5kaXNfY2Jmbihwb3J0LT5lbmRpc19jYmFyZywKKwkJCQkJCUJGQV9TVEFUVVNfRkFJTEVEKTsKKwkJCXBvcnQtPmVuZGlzX2NiZm4gPSBOVUxMOworCQkJcG9ydC0+ZW5kaXNfcGVuZGluZyA9IEJGQV9GQUxTRTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiB9CiAKQEAgLTQ0NSwxMCArNDY2LDEyIEBACiAJcG9ydC0+ZW5kaXNfcGVuZGluZyA9IEJGQV9GQUxTRTsKIAlwb3J0LT5zdGF0c19jYmZuID0gTlVMTDsKIAlwb3J0LT5lbmRpc19jYmZuID0gTlVMTDsKKwlwb3J0LT5wYmNfZGlzYWJsZWQgPSBCRkFfRkFMU0U7CiAKIAliZmFfaW9jX21ib3hfcmVnaXNyKHBvcnQtPmlvYywgQkZJX01DX1BPUlQsIGJmYV9wb3J0X2lzciwgcG9ydCk7Ci0JYmZhX2lvY19oYmZhaWxfaW5pdCgmcG9ydC0+aGJmYWlsLCBiZmFfcG9ydF9oYmZhaWwsIHBvcnQpOwotCWxpc3RfYWRkX3RhaWwoJnBvcnQtPmhiZmFpbC5xZSwgJnBvcnQtPmlvYy0+aGJfbm90aWZ5X3EpOworCWJmYV9xX3FlX2luaXQoJnBvcnQtPmlvY19ub3RpZnkpOworCWJmYV9pb2Nfbm90aWZ5X2luaXQoJnBvcnQtPmlvY19ub3RpZnksIGJmYV9wb3J0X25vdGlmeSwgcG9ydCk7CisJbGlzdF9hZGRfdGFpbCgmcG9ydC0+aW9jX25vdGlmeS5xZSwgJnBvcnQtPmlvYy0+bm90aWZ5X3EpOwogCiAJLyoKIAkgKiBpbml0aWFsaXplIHRpbWUgc3RhbXAgZm9yIHN0YXRzIHJlc2V0CkBAIC00NTgsMyArNDgxLDM2OCBAQAogCiAJYmZhX3RyYyhwb3J0LCAwKTsKIH0KKworLyoKKyAqCUNFRSBtb2R1bGUgc3BlY2lmaWMgZGVmaW5pdGlvbnMKKyAqLworCisvKgorICogYmZhX2NlZV9nZXRfYXR0cl9pc3IoKQorICoKKyAqIEBicmllZiBDRUUgSVNSIGZvciBnZXQtYXR0cmlidXRlcyByZXNwb25zZXMgZnJvbSBmL3cKKyAqCisgKiBAcGFyYW1baW5dIGNlZSAtIFBvaW50ZXIgdG8gdGhlIENFRSBtb2R1bGUKKyAqCQkgICAgc3RhdHVzIC0gUmV0dXJuIHN0YXR1cyBmcm9tIHRoZSBmL3cKKyAqCisgKiBAcmV0dXJuIHZvaWQKKyAqLworc3RhdGljIHZvaWQKK2JmYV9jZWVfZ2V0X2F0dHJfaXNyKHN0cnVjdCBiZmFfY2VlX3MgKmNlZSwgYmZhX3N0YXR1c190IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYmZhX2NlZV9sbGRwX2NmZ19zICpsbGRwX2NmZyA9ICZjZWUtPmF0dHItPmxsZHBfcmVtb3RlOworCisJY2VlLT5nZXRfYXR0cl9zdGF0dXMgPSBzdGF0dXM7CisJYmZhX3RyYyhjZWUsIDApOworCWlmIChzdGF0dXMgPT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKGNlZSwgMCk7CisJCW1lbWNweShjZWUtPmF0dHIsIGNlZS0+YXR0cl9kbWEua3ZhLAorCQkJc2l6ZW9mKHN0cnVjdCBiZmFfY2VlX2F0dHJfcykpOworCQlsbGRwX2NmZy0+dGltZV90b19saXZlID0gYmUxNl90b19jcHUobGxkcF9jZmctPnRpbWVfdG9fbGl2ZSk7CisJCWxsZHBfY2ZnLT5lbmFibGVkX3N5c3RlbV9jYXAgPQorCQkJCWJlMTZfdG9fY3B1KGxsZHBfY2ZnLT5lbmFibGVkX3N5c3RlbV9jYXApOworCX0KKwljZWUtPmdldF9hdHRyX3BlbmRpbmcgPSBCRkFfRkFMU0U7CisJaWYgKGNlZS0+Y2Jmbi5nZXRfYXR0cl9jYmZuKSB7CisJCWJmYV90cmMoY2VlLCAwKTsKKwkJY2VlLT5jYmZuLmdldF9hdHRyX2NiZm4oY2VlLT5jYmZuLmdldF9hdHRyX2NiYXJnLCBzdGF0dXMpOworCX0KK30KKworLyoKKyAqIGJmYV9jZWVfZ2V0X3N0YXRzX2lzcigpCisgKgorICogQGJyaWVmIENFRSBJU1IgZm9yIGdldC1zdGF0cyByZXNwb25zZXMgZnJvbSBmL3cKKyAqCisgKiBAcGFyYW1baW5dIGNlZSAtIFBvaW50ZXIgdG8gdGhlIENFRSBtb2R1bGUKKyAqCSAgICAgIHN0YXR1cyAtIFJldHVybiBzdGF0dXMgZnJvbSB0aGUgZi93CisgKgorICogQHJldHVybiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfY2VlX2dldF9zdGF0c19pc3Ioc3RydWN0IGJmYV9jZWVfcyAqY2VlLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKQoreworCXUzMiAqYnVmZmVyOworCWludCBpOworCisJY2VlLT5nZXRfc3RhdHNfc3RhdHVzID0gc3RhdHVzOworCWJmYV90cmMoY2VlLCAwKTsKKwlpZiAoc3RhdHVzID09IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhjZWUsIDApOworCQltZW1jcHkoY2VlLT5zdGF0cywgY2VlLT5zdGF0c19kbWEua3ZhLAorCQkJc2l6ZW9mKHN0cnVjdCBiZmFfY2VlX3N0YXRzX3MpKTsKKwkJLyogc3dhcCB0aGUgY2VlIHN0YXRzICovCisJCWJ1ZmZlciA9ICh1MzIgKiljZWUtPnN0YXRzOworCQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihzdHJ1Y3QgYmZhX2NlZV9zdGF0c19zKSAvCisJCQkJIHNpemVvZih1MzIpKTsgaSsrKQorCQkJYnVmZmVyW2ldID0gY3B1X3RvX2JlMzIoYnVmZmVyW2ldKTsKKwl9CisJY2VlLT5nZXRfc3RhdHNfcGVuZGluZyA9IEJGQV9GQUxTRTsKKwliZmFfdHJjKGNlZSwgMCk7CisJaWYgKGNlZS0+Y2Jmbi5nZXRfc3RhdHNfY2JmbikgeworCQliZmFfdHJjKGNlZSwgMCk7CisJCWNlZS0+Y2Jmbi5nZXRfc3RhdHNfY2JmbihjZWUtPmNiZm4uZ2V0X3N0YXRzX2NiYXJnLCBzdGF0dXMpOworCX0KK30KKworLyoKKyAqIGJmYV9jZWVfcmVzZXRfc3RhdHNfaXNyKCkKKyAqCisgKiBAYnJpZWYgQ0VFIElTUiBmb3IgcmVzZXQtc3RhdHMgcmVzcG9uc2VzIGZyb20gZi93CisgKgorICogQHBhcmFtW2luXSBjZWUgLSBQb2ludGVyIHRvIHRoZSBDRUUgbW9kdWxlCisgKiAgICAgICAgICAgIHN0YXR1cyAtIFJldHVybiBzdGF0dXMgZnJvbSB0aGUgZi93CisgKgorICogQHJldHVybiB2b2lkCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfY2VlX3Jlc2V0X3N0YXRzX2lzcihzdHJ1Y3QgYmZhX2NlZV9zICpjZWUsIGJmYV9zdGF0dXNfdCBzdGF0dXMpCit7CisJY2VlLT5yZXNldF9zdGF0c19zdGF0dXMgPSBzdGF0dXM7CisJY2VlLT5yZXNldF9zdGF0c19wZW5kaW5nID0gQkZBX0ZBTFNFOworCWlmIChjZWUtPmNiZm4ucmVzZXRfc3RhdHNfY2JmbikKKwkJY2VlLT5jYmZuLnJlc2V0X3N0YXRzX2NiZm4oY2VlLT5jYmZuLnJlc2V0X3N0YXRzX2NiYXJnLCBzdGF0dXMpOworfQorCisvKgorICogYmZhX2NlZV9tZW1pbmZvKCkKKyAqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgRE1BIG1lbW9yeSBuZWVkZWQgYnkgQ0VFIG1vZHVsZQorICoKKyAqIEBwYXJhbVtpbl0gdm9pZAorICoKKyAqIEByZXR1cm4gU2l6ZSBvZiBETUEgcmVnaW9uCisgKi8KK3UzMgorYmZhX2NlZV9tZW1pbmZvKHZvaWQpCit7CisJcmV0dXJuIEJGQV9ST1VORFVQKHNpemVvZihzdHJ1Y3QgYmZhX2NlZV9hdHRyX3MpLCBCRkFfRE1BX0FMSUdOX1NaKSArCisJCUJGQV9ST1VORFVQKHNpemVvZihzdHJ1Y3QgYmZhX2NlZV9zdGF0c19zKSwgQkZBX0RNQV9BTElHTl9TWik7Cit9CisKKy8qCisgKiBiZmFfY2VlX21lbV9jbGFpbSgpCisgKgorICogQGJyaWVmIEluaXRpYWxpemVkIENFRSBETUEgTWVtb3J5CisgKgorICogQHBhcmFtW2luXSBjZWUgQ0VFIG1vZHVsZSBwb2ludGVyCisgKiAgICAgICAgICAgIGRtYV9rdmEgS2VybmVsIFZpcnR1YWwgQWRkcmVzcyBvZiBDRUUgRE1BIE1lbW9yeQorICogICAgICAgICAgICBkbWFfcGEgIFBoeXNpY2FsIEFkZHJlc3Mgb2YgQ0VFIERNQSBNZW1vcnkKKyAqCisgKiBAcmV0dXJuIHZvaWQKKyAqLwordm9pZAorYmZhX2NlZV9tZW1fY2xhaW0oc3RydWN0IGJmYV9jZWVfcyAqY2VlLCB1OCAqZG1hX2t2YSwgdTY0IGRtYV9wYSkKK3sKKwljZWUtPmF0dHJfZG1hLmt2YSA9IGRtYV9rdmE7CisJY2VlLT5hdHRyX2RtYS5wYSA9IGRtYV9wYTsKKwljZWUtPnN0YXRzX2RtYS5rdmEgPSBkbWFfa3ZhICsgQkZBX1JPVU5EVVAoCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgYmZhX2NlZV9hdHRyX3MpLCBCRkFfRE1BX0FMSUdOX1NaKTsKKwljZWUtPnN0YXRzX2RtYS5wYSA9IGRtYV9wYSArIEJGQV9ST1VORFVQKAorCQkJICAgICBzaXplb2Yoc3RydWN0IGJmYV9jZWVfYXR0cl9zKSwgQkZBX0RNQV9BTElHTl9TWik7CisJY2VlLT5hdHRyID0gKHN0cnVjdCBiZmFfY2VlX2F0dHJfcyAqKSBkbWFfa3ZhOworCWNlZS0+c3RhdHMgPSAoc3RydWN0IGJmYV9jZWVfc3RhdHNfcyAqKSAoZG1hX2t2YSArIEJGQV9ST1VORFVQKAorCQkJc2l6ZW9mKHN0cnVjdCBiZmFfY2VlX2F0dHJfcyksIEJGQV9ETUFfQUxJR05fU1opKTsKK30KKworLyoKKyAqIGJmYV9jZWVfZ2V0X2F0dHIoKQorICoKKyAqIEBicmllZgorICogICBTZW5kIHRoZSByZXF1ZXN0IHRvIHRoZSBmL3cgdG8gZmV0Y2ggQ0VFIGF0dHJpYnV0ZXMuCisgKgorICogQHBhcmFtW2luXSBQb2ludGVyIHRvIHRoZSBDRUUgbW9kdWxlIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIEByZXR1cm4gU3RhdHVzCisgKi8KKworYmZhX3N0YXR1c190CitiZmFfY2VlX2dldF9hdHRyKHN0cnVjdCBiZmFfY2VlX3MgKmNlZSwgc3RydWN0IGJmYV9jZWVfYXR0cl9zICphdHRyLAorCQkgYmZhX2NlZV9nZXRfYXR0cl9jYmZuX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmaV9jZWVfZ2V0X3JlcV9zICpjbWQ7CisKKwlXQVJOX09OKChjZWUgPT0gTlVMTCkgfHwgKGNlZS0+aW9jID09IE5VTEwpKTsKKwliZmFfdHJjKGNlZSwgMCk7CisJaWYgKCFiZmFfaW9jX2lzX29wZXJhdGlvbmFsKGNlZS0+aW9jKSkgeworCQliZmFfdHJjKGNlZSwgMCk7CisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCX0KKwlpZiAoY2VlLT5nZXRfYXR0cl9wZW5kaW5nID09IEJGQV9UUlVFKSB7CisJCWJmYV90cmMoY2VlLCAwKTsKKwkJcmV0dXJuICBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfQorCWNlZS0+Z2V0X2F0dHJfcGVuZGluZyA9IEJGQV9UUlVFOworCWNtZCA9IChzdHJ1Y3QgYmZpX2NlZV9nZXRfcmVxX3MgKikgY2VlLT5nZXRfY2ZnX21iLm1zZzsKKwljZWUtPmF0dHIgPSBhdHRyOworCWNlZS0+Y2Jmbi5nZXRfYXR0cl9jYmZuID0gY2JmbjsKKwljZWUtPmNiZm4uZ2V0X2F0dHJfY2JhcmcgPSBjYmFyZzsKKwliZmlfaDJpX3NldChjbWQtPm1oLCBCRklfTUNfQ0VFLCBCRklfQ0VFX0gySV9HRVRfQ0ZHX1JFUSwKKwkJYmZhX2lvY19wb3J0aWQoY2VlLT5pb2MpKTsKKwliZmFfZG1hX2JlX2FkZHJfc2V0KGNtZC0+ZG1hX2FkZHIsIGNlZS0+YXR0cl9kbWEucGEpOworCWJmYV9pb2NfbWJveF9xdWV1ZShjZWUtPmlvYywgJmNlZS0+Z2V0X2NmZ19tYik7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoKKyAqIGJmYV9jZWVfZ2V0X3N0YXRzKCkKKyAqCisgKiBAYnJpZWYKKyAqICAgU2VuZCB0aGUgcmVxdWVzdCB0byB0aGUgZi93IHRvIGZldGNoIENFRSBzdGF0aXN0aWNzLgorICoKKyAqIEBwYXJhbVtpbl0gUG9pbnRlciB0byB0aGUgQ0VFIG1vZHVsZSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuIFN0YXR1cworICovCisKK2JmYV9zdGF0dXNfdAorYmZhX2NlZV9nZXRfc3RhdHMoc3RydWN0IGJmYV9jZWVfcyAqY2VlLCBzdHJ1Y3QgYmZhX2NlZV9zdGF0c19zICpzdGF0cywKKwkJICBiZmFfY2VlX2dldF9zdGF0c19jYmZuX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmaV9jZWVfZ2V0X3JlcV9zICpjbWQ7CisKKwlXQVJOX09OKChjZWUgPT0gTlVMTCkgfHwgKGNlZS0+aW9jID09IE5VTEwpKTsKKworCWlmICghYmZhX2lvY19pc19vcGVyYXRpb25hbChjZWUtPmlvYykpIHsKKwkJYmZhX3RyYyhjZWUsIDApOworCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfRkFJTFVSRTsKKwl9CisJaWYgKGNlZS0+Z2V0X3N0YXRzX3BlbmRpbmcgPT0gQkZBX1RSVUUpIHsKKwkJYmZhX3RyYyhjZWUsIDApOworCQlyZXR1cm4gIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisJY2VlLT5nZXRfc3RhdHNfcGVuZGluZyA9IEJGQV9UUlVFOworCWNtZCA9IChzdHJ1Y3QgYmZpX2NlZV9nZXRfcmVxX3MgKikgY2VlLT5nZXRfc3RhdHNfbWIubXNnOworCWNlZS0+c3RhdHMgPSBzdGF0czsKKwljZWUtPmNiZm4uZ2V0X3N0YXRzX2NiZm4gPSBjYmZuOworCWNlZS0+Y2Jmbi5nZXRfc3RhdHNfY2JhcmcgPSBjYmFyZzsKKwliZmlfaDJpX3NldChjbWQtPm1oLCBCRklfTUNfQ0VFLCBCRklfQ0VFX0gySV9HRVRfU1RBVFNfUkVRLAorCQliZmFfaW9jX3BvcnRpZChjZWUtPmlvYykpOworCWJmYV9kbWFfYmVfYWRkcl9zZXQoY21kLT5kbWFfYWRkciwgY2VlLT5zdGF0c19kbWEucGEpOworCWJmYV9pb2NfbWJveF9xdWV1ZShjZWUtPmlvYywgJmNlZS0+Z2V0X3N0YXRzX21iKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKgorICogYmZhX2NlZV9yZXNldF9zdGF0cygpCisgKgorICogQGJyaWVmIENsZWFycyBDRUUgU3RhdHMgaW4gdGhlIGYvdy4KKyAqCisgKiBAcGFyYW1baW5dIFBvaW50ZXIgdG8gdGhlIENFRSBtb2R1bGUgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogQHJldHVybiBTdGF0dXMKKyAqLworCitiZmFfc3RhdHVzX3QKK2JmYV9jZWVfcmVzZXRfc3RhdHMoc3RydWN0IGJmYV9jZWVfcyAqY2VlLAorCQkgICAgYmZhX2NlZV9yZXNldF9zdGF0c19jYmZuX3QgY2Jmbiwgdm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmaV9jZWVfcmVzZXRfc3RhdHNfcyAqY21kOworCisJV0FSTl9PTigoY2VlID09IE5VTEwpIHx8IChjZWUtPmlvYyA9PSBOVUxMKSk7CisJaWYgKCFiZmFfaW9jX2lzX29wZXJhdGlvbmFsKGNlZS0+aW9jKSkgeworCQliZmFfdHJjKGNlZSwgMCk7CisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19GQUlMVVJFOworCX0KKwlpZiAoY2VlLT5yZXNldF9zdGF0c19wZW5kaW5nID09IEJGQV9UUlVFKSB7CisJCWJmYV90cmMoY2VlLCAwKTsKKwkJcmV0dXJuICBCRkFfU1RBVFVTX0RFVkJVU1k7CisJfQorCWNlZS0+cmVzZXRfc3RhdHNfcGVuZGluZyA9IEJGQV9UUlVFOworCWNtZCA9IChzdHJ1Y3QgYmZpX2NlZV9yZXNldF9zdGF0c19zICopIGNlZS0+cmVzZXRfc3RhdHNfbWIubXNnOworCWNlZS0+Y2Jmbi5yZXNldF9zdGF0c19jYmZuID0gY2JmbjsKKwljZWUtPmNiZm4ucmVzZXRfc3RhdHNfY2JhcmcgPSBjYmFyZzsKKwliZmlfaDJpX3NldChjbWQtPm1oLCBCRklfTUNfQ0VFLCBCRklfQ0VFX0gySV9SRVNFVF9TVEFUUywKKwkJYmZhX2lvY19wb3J0aWQoY2VlLT5pb2MpKTsKKwliZmFfaW9jX21ib3hfcXVldWUoY2VlLT5pb2MsICZjZWUtPnJlc2V0X3N0YXRzX21iKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKgorICogYmZhX2NlZV9pc3JzKCkKKyAqCisgKiBAYnJpZWYgSGFuZGxlcyBNYWlsLWJveCBpbnRlcnJ1cHRzIGZvciBDRUUgbW9kdWxlLgorICoKKyAqIEBwYXJhbVtpbl0gUG9pbnRlciB0byB0aGUgQ0VFIG1vZHVsZSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuIHZvaWQKKyAqLworCit2b2lkCitiZmFfY2VlX2lzcih2b2lkICpjYmFyZywgc3RydWN0IGJmaV9tYm1zZ19zICptKQoreworCXVuaW9uIGJmaV9jZWVfaTJoX21zZ191ICptc2c7CisJc3RydWN0IGJmaV9jZWVfZ2V0X3JzcF9zICpnZXRfcnNwOworCXN0cnVjdCBiZmFfY2VlX3MgKmNlZSA9IChzdHJ1Y3QgYmZhX2NlZV9zICopIGNiYXJnOworCW1zZyA9ICh1bmlvbiBiZmlfY2VlX2kyaF9tc2dfdSAqKSBtOworCWdldF9yc3AgPSAoc3RydWN0IGJmaV9jZWVfZ2V0X3JzcF9zICopIG07CisJYmZhX3RyYyhjZWUsIG1zZy0+bWgubXNnX2lkKTsKKwlzd2l0Y2ggKG1zZy0+bWgubXNnX2lkKSB7CisJY2FzZSBCRklfQ0VFX0kySF9HRVRfQ0ZHX1JTUDoKKwkJYmZhX3RyYyhjZWUsIGdldF9yc3AtPmNtZF9zdGF0dXMpOworCQliZmFfY2VlX2dldF9hdHRyX2lzcihjZWUsIGdldF9yc3AtPmNtZF9zdGF0dXMpOworCQlicmVhazsKKwljYXNlIEJGSV9DRUVfSTJIX0dFVF9TVEFUU19SU1A6CisJCWJmYV9jZWVfZ2V0X3N0YXRzX2lzcihjZWUsIGdldF9yc3AtPmNtZF9zdGF0dXMpOworCQlicmVhazsKKwljYXNlIEJGSV9DRUVfSTJIX1JFU0VUX1NUQVRTX1JTUDoKKwkJYmZhX2NlZV9yZXNldF9zdGF0c19pc3IoY2VlLCBnZXRfcnNwLT5jbWRfc3RhdHVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwl9Cit9CisKKy8qCisgKiBiZmFfY2VlX25vdGlmeSgpCisgKgorICogQGJyaWVmIENFRSBtb2R1bGUgSU9DIGV2ZW50IGhhbmRsZXIuCisgKgorICogQHBhcmFtW2luXSBQb2ludGVyIHRvIHRoZSBDRUUgbW9kdWxlIGRhdGEgc3RydWN0dXJlLgorICogQHBhcmFtW2luXSBJT0MgZXZlbnQgdHlwZQorICoKKyAqIEByZXR1cm4gdm9pZAorICovCisKK3ZvaWQKK2JmYV9jZWVfbm90aWZ5KHZvaWQgKmFyZywgZW51bSBiZmFfaW9jX2V2ZW50X2UgZXZlbnQpCit7CisJc3RydWN0IGJmYV9jZWVfcyAqY2VlID0gKHN0cnVjdCBiZmFfY2VlX3MgKikgYXJnOworCisJYmZhX3RyYyhjZWUsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9JT0NfRV9ESVNBQkxFRDoKKwljYXNlIEJGQV9JT0NfRV9GQUlMRUQ6CisJCWlmIChjZWUtPmdldF9hdHRyX3BlbmRpbmcgPT0gQkZBX1RSVUUpIHsKKwkJCWNlZS0+Z2V0X2F0dHJfc3RhdHVzID0gQkZBX1NUQVRVU19GQUlMRUQ7CisJCQljZWUtPmdldF9hdHRyX3BlbmRpbmcgID0gQkZBX0ZBTFNFOworCQkJaWYgKGNlZS0+Y2Jmbi5nZXRfYXR0cl9jYmZuKSB7CisJCQkJY2VlLT5jYmZuLmdldF9hdHRyX2NiZm4oCisJCQkJCWNlZS0+Y2Jmbi5nZXRfYXR0cl9jYmFyZywKKwkJCQkJQkZBX1NUQVRVU19GQUlMRUQpOworCQkJfQorCQl9CisJCWlmIChjZWUtPmdldF9zdGF0c19wZW5kaW5nID09IEJGQV9UUlVFKSB7CisJCQljZWUtPmdldF9zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX0ZBSUxFRDsKKwkJCWNlZS0+Z2V0X3N0YXRzX3BlbmRpbmcgID0gQkZBX0ZBTFNFOworCQkJaWYgKGNlZS0+Y2Jmbi5nZXRfc3RhdHNfY2JmbikgeworCQkJCWNlZS0+Y2Jmbi5nZXRfc3RhdHNfY2JmbigKKwkJCQljZWUtPmNiZm4uZ2V0X3N0YXRzX2NiYXJnLAorCQkJCUJGQV9TVEFUVVNfRkFJTEVEKTsKKwkJCX0KKwkJfQorCQlpZiAoY2VlLT5yZXNldF9zdGF0c19wZW5kaW5nID09IEJGQV9UUlVFKSB7CisJCQljZWUtPnJlc2V0X3N0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfRkFJTEVEOworCQkJY2VlLT5yZXNldF9zdGF0c19wZW5kaW5nICA9IEJGQV9GQUxTRTsKKwkJCWlmIChjZWUtPmNiZm4ucmVzZXRfc3RhdHNfY2JmbikgeworCQkJCWNlZS0+Y2Jmbi5yZXNldF9zdGF0c19jYmZuKAorCQkJCWNlZS0+Y2Jmbi5yZXNldF9zdGF0c19jYmFyZywKKwkJCQlCRkFfU1RBVFVTX0ZBSUxFRCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBiZmFfY2VlX2F0dGFjaCgpCisgKgorICogQGJyaWVmIENFRSBtb2R1bGUtYXR0YWNoIEFQSQorICoKKyAqIEBwYXJhbVtpbl0gY2VlIC0gUG9pbnRlciB0byB0aGUgQ0VFIG1vZHVsZSBkYXRhIHN0cnVjdHVyZQorICogICAgICAgICAgICBpb2MgLSBQb2ludGVyIHRvIHRoZSBpb2MgbW9kdWxlIGRhdGEgc3RydWN0dXJlCisgKiAgICAgICAgICAgIGRldiAtIFBvaW50ZXIgdG8gdGhlIGRldmljZSBkcml2ZXIgbW9kdWxlIGRhdGEgc3RydWN0dXJlCisgKiAgICAgICAgICAgICAgICAgIFRoZSBkZXZpY2UgZHJpdmVyIHNwZWNpZmljIG1ib3ggSVNSIGZ1bmN0aW9ucyBoYXZlCisgKiAgICAgICAgICAgICAgICAgIHRoaXMgcG9pbnRlciBhcyBvbmUgb2YgdGhlIHBhcmFtZXRlcnMuCisgKgorICogQHJldHVybiB2b2lkCisgKi8KK3ZvaWQKK2JmYV9jZWVfYXR0YWNoKHN0cnVjdCBiZmFfY2VlX3MgKmNlZSwgc3RydWN0IGJmYV9pb2NfcyAqaW9jLAorCQl2b2lkICpkZXYpCit7CisJV0FSTl9PTihjZWUgPT0gTlVMTCk7CisJY2VlLT5kZXYgPSBkZXY7CisJY2VlLT5pb2MgPSBpb2M7CisKKwliZmFfaW9jX21ib3hfcmVnaXNyKGNlZS0+aW9jLCBCRklfTUNfQ0VFLCBiZmFfY2VlX2lzciwgY2VlKTsKKwliZmFfcV9xZV9pbml0KCZjZWUtPmlvY19ub3RpZnkpOworCWJmYV9pb2Nfbm90aWZ5X2luaXQoJmNlZS0+aW9jX25vdGlmeSwgYmZhX2NlZV9ub3RpZnksIGNlZSk7CisJbGlzdF9hZGRfdGFpbCgmY2VlLT5pb2Nfbm90aWZ5LnFlLCAmY2VlLT5pb2MtPm5vdGlmeV9xKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3BvcnQuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3BvcnQuaAppbmRleCBjNGVlOWRiLi45NDdmODk3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfcG9ydC5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3BvcnQuaApAQCAtNDMsMTIgKzQzLDE2IEBACiAJYmZhX3BvcnRfZW5kaXNfY2Jmbl90CQllbmRpc19jYmZuOwogCXZvaWQJCQkJKmVuZGlzX2NiYXJnOwogCWJmYV9zdGF0dXNfdAkJCWVuZGlzX3N0YXR1czsKLQlzdHJ1Y3QgYmZhX2lvY19oYmZhaWxfbm90aWZ5X3MJaGJmYWlsOworCXN0cnVjdCBiZmFfaW9jX25vdGlmeV9zCQlpb2Nfbm90aWZ5OworCWJmYV9ib29sZWFuX3QJCQlwYmNfZGlzYWJsZWQ7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MJCXBvcnRfZG1hOwogfTsKIAorI2RlZmluZSBCRkFfTUVNX1BPUlRfRE1BKF9fYmZhKQkJKCYoKF9fYmZhKS0+bW9kdWxlcy5wb3J0LnBvcnRfZG1hKSkKKwogdm9pZAkgICAgIGJmYV9wb3J0X2F0dGFjaChzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCwgc3RydWN0IGJmYV9pb2NfcyAqaW9jLAogCQkJCXZvaWQgKmRldiwgc3RydWN0IGJmYV90cmNfbW9kX3MgKnRyY21vZCk7Ci12b2lkCSAgICAgYmZhX3BvcnRfaGJmYWlsKHZvaWQgKmFyZyk7Cit2b2lkCWJmYV9wb3J0X25vdGlmeSh2b2lkICphcmcsIGVudW0gYmZhX2lvY19ldmVudF9lIGV2ZW50KTsKIAogYmZhX3N0YXR1c190IGJmYV9wb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCwKIAkJCQkgdW5pb24gYmZhX3BvcnRfc3RhdHNfdSAqc3RhdHMsCkBAIC02Miw0ICs2Niw1OCBAQAogdTMyICAgICBiZmFfcG9ydF9tZW1pbmZvKHZvaWQpOwogdm9pZAkgICAgIGJmYV9wb3J0X21lbV9jbGFpbShzdHJ1Y3QgYmZhX3BvcnRfcyAqcG9ydCwKIAkJCQkgdTggKmRtYV9rdmEsIHU2NCBkbWFfcGEpOworCisvKgorICogQ0VFIGRlY2xhcmF0aW9uCisgKi8KK3R5cGVkZWYgdm9pZCAoKmJmYV9jZWVfZ2V0X2F0dHJfY2Jmbl90KSAodm9pZCAqZGV2LCBiZmFfc3RhdHVzX3Qgc3RhdHVzKTsKK3R5cGVkZWYgdm9pZCAoKmJmYV9jZWVfZ2V0X3N0YXRzX2NiZm5fdCkgKHZvaWQgKmRldiwgYmZhX3N0YXR1c190IHN0YXR1cyk7Cit0eXBlZGVmIHZvaWQgKCpiZmFfY2VlX3Jlc2V0X3N0YXRzX2NiZm5fdCkgKHZvaWQgKmRldiwgYmZhX3N0YXR1c190IHN0YXR1cyk7CisKK3N0cnVjdCBiZmFfY2VlX2NiZm5fcyB7CisJYmZhX2NlZV9nZXRfYXR0cl9jYmZuX3QJCWdldF9hdHRyX2NiZm47CisJdm9pZAkJCQkqZ2V0X2F0dHJfY2Jhcmc7CisJYmZhX2NlZV9nZXRfc3RhdHNfY2Jmbl90CWdldF9zdGF0c19jYmZuOworCXZvaWQJCQkJKmdldF9zdGF0c19jYmFyZzsKKwliZmFfY2VlX3Jlc2V0X3N0YXRzX2NiZm5fdAlyZXNldF9zdGF0c19jYmZuOworCXZvaWQJCQkJKnJlc2V0X3N0YXRzX2NiYXJnOworfTsKKworc3RydWN0IGJmYV9jZWVfcyB7CisJdm9pZCAqZGV2OworCWJmYV9ib29sZWFuX3QJCWdldF9hdHRyX3BlbmRpbmc7CisJYmZhX2Jvb2xlYW5fdAkJZ2V0X3N0YXRzX3BlbmRpbmc7CisJYmZhX2Jvb2xlYW5fdAkJcmVzZXRfc3RhdHNfcGVuZGluZzsKKwliZmFfc3RhdHVzX3QJCWdldF9hdHRyX3N0YXR1czsKKwliZmFfc3RhdHVzX3QJCWdldF9zdGF0c19zdGF0dXM7CisJYmZhX3N0YXR1c190CQlyZXNldF9zdGF0c19zdGF0dXM7CisJc3RydWN0IGJmYV9jZWVfY2Jmbl9zCWNiZm47CisJc3RydWN0IGJmYV9pb2Nfbm90aWZ5X3MJaW9jX25vdGlmeTsKKwlzdHJ1Y3QgYmZhX3RyY19tb2RfcwkqdHJjbW9kOworCXN0cnVjdCBiZmFfY2VlX2F0dHJfcwkqYXR0cjsKKwlzdHJ1Y3QgYmZhX2NlZV9zdGF0c19zCSpzdGF0czsKKwlzdHJ1Y3QgYmZhX2RtYV9zCWF0dHJfZG1hOworCXN0cnVjdCBiZmFfZG1hX3MJc3RhdHNfZG1hOworCXN0cnVjdCBiZmFfaW9jX3MJKmlvYzsKKwlzdHJ1Y3QgYmZhX21ib3hfY21kX3MJZ2V0X2NmZ19tYjsKKwlzdHJ1Y3QgYmZhX21ib3hfY21kX3MJZ2V0X3N0YXRzX21iOworCXN0cnVjdCBiZmFfbWJveF9jbWRfcwlyZXNldF9zdGF0c19tYjsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcwljZWVfZG1hOworfTsKKworI2RlZmluZSBCRkFfTUVNX0NFRV9ETUEoX19iZmEpCSgmKChfX2JmYSktPm1vZHVsZXMuY2VlLmNlZV9kbWEpKQorCit1MzIJYmZhX2NlZV9tZW1pbmZvKHZvaWQpOwordm9pZAliZmFfY2VlX21lbV9jbGFpbShzdHJ1Y3QgYmZhX2NlZV9zICpjZWUsIHU4ICpkbWFfa3ZhLCB1NjQgZG1hX3BhKTsKK3ZvaWQJYmZhX2NlZV9hdHRhY2goc3RydWN0IGJmYV9jZWVfcyAqY2VlLAorCQkJc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICpkZXYpOworYmZhX3N0YXR1c190CWJmYV9jZWVfZ2V0X2F0dHIoc3RydWN0IGJmYV9jZWVfcyAqY2VlLAorCQkJCXN0cnVjdCBiZmFfY2VlX2F0dHJfcyAqYXR0ciwKKwkJCQliZmFfY2VlX2dldF9hdHRyX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QJYmZhX2NlZV9nZXRfc3RhdHMoc3RydWN0IGJmYV9jZWVfcyAqY2VlLAorCQkJCXN0cnVjdCBiZmFfY2VlX3N0YXRzX3MgKnN0YXRzLAorCQkJCWJmYV9jZWVfZ2V0X3N0YXRzX2NiZm5fdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QJYmZhX2NlZV9yZXNldF9zdGF0cyhzdHJ1Y3QgYmZhX2NlZV9zICpjZWUsCisJCQkJYmZhX2NlZV9yZXNldF9zdGF0c19jYmZuX3QgY2Jmbiwgdm9pZCAqY2JhcmcpOworCiAjZW5kaWYJLyogX19CRkFfUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfc3ZjLmMKaW5kZXggMTZkOWE1Zi4uMjFjYWFlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfc3ZjLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfc3ZjLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJiZmFfbW9kdWxlcy5oIgogCiBCRkFfVFJDX0ZJTEUoSEFMLCBGQ1hQKTsKK0JGQV9NT0RVTEUoZmNkaWFnKTsKIEJGQV9NT0RVTEUoZmN4cCk7CiBCRkFfTU9EVUxFKHNncGcpOwogQkZBX01PRFVMRShscHMpOwpAQCAtMTEzLDExICsxMTQsMTAgQEAKIC8qCiAgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgTFBTIGZ1bmN0aW9ucwogICovCi1zdGF0aWMgdm9pZCBiZmFfbHBzX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKm5kbV9sZW4sCi0JCQkJdTMyICpkbV9sZW4pOworc3RhdGljIHZvaWQgYmZhX2xwc19tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKKwkJc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pbmZvLCBzdHJ1Y3QgYmZhX3MgKmJmYSk7CiBzdGF0aWMgdm9pZCBiZmFfbHBzX2F0dGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqYmZhZCwKIAkJCQlzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCi0JCQkJc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sCiAJCQkJc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KTsKIHN0YXRpYyB2b2lkIGJmYV9scHNfZGV0YWNoKHN0cnVjdCBiZmFfcyAqYmZhKTsKIHN0YXRpYyB2b2lkIGJmYV9scHNfc3RhcnQoc3RydWN0IGJmYV9zICpiZmEpOwpAQCAtMTI1LDYgKzEyNSw3IEBACiBzdGF0aWMgdm9pZCBiZmFfbHBzX2lvY2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpOwogc3RhdGljIHZvaWQgYmZhX2xwc19sb2dpbl9yc3Aoc3RydWN0IGJmYV9zICpiZmEsCiAJCQkJc3RydWN0IGJmaV9scHNfbG9naW5fcnNwX3MgKnJzcCk7CitzdGF0aWMgdm9pZCBiZmFfbHBzX25vX3JlcyhzdHJ1Y3QgYmZhX2xwc19zICpmaXJzdF9scHMsIHU4IGNvdW50KTsKIHN0YXRpYyB2b2lkIGJmYV9scHNfbG9nb3V0X3JzcChzdHJ1Y3QgYmZhX3MgKmJmYSwKIAkJCQlzdHJ1Y3QgYmZpX2xwc19sb2dvdXRfcnNwX3MgKnJzcCk7CiBzdGF0aWMgdm9pZCBiZmFfbHBzX3JlcXFfcmVzdW1lKHZvaWQgKmxwc19hcmcpOwpAQCAtNDMwLDUxICs0MzEsMTcgQEAKICAqLwogCiBzdGF0aWMgdm9pZAotY2xhaW1fZmN4cF9yZXFfcnNwX21lbShzdHJ1Y3QgYmZhX2ZjeHBfbW9kX3MgKm1vZCwgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pKQotewotCXU4CSAgICAgICAqZG1fa3ZhID0gTlVMTDsKLQl1NjQJZG1fcGE7Ci0JdTMyCWJ1Zl9wb29sX3N6OwotCi0JZG1fa3ZhID0gYmZhX21lbWluZm9fZG1hX3ZpcnQobWkpOwotCWRtX3BhID0gYmZhX21lbWluZm9fZG1hX3BoeXMobWkpOwotCi0JYnVmX3Bvb2xfc3ogPSBtb2QtPnJlcV9wbGRfc3ogKiBtb2QtPm51bV9mY3hwczsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgZmN4cCByZXEgcGF5bG9hZCBsaXN0Ci0JICovCi0JbW9kLT5yZXFfcGxkX2xpc3Rfa3ZhID0gZG1fa3ZhOwotCW1vZC0+cmVxX3BsZF9saXN0X3BhID0gZG1fcGE7Ci0JZG1fa3ZhICs9IGJ1Zl9wb29sX3N6OwotCWRtX3BhICs9IGJ1Zl9wb29sX3N6OwotCW1lbXNldChtb2QtPnJlcV9wbGRfbGlzdF9rdmEsIDAsIGJ1Zl9wb29sX3N6KTsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgZmN4cCByc3AgcGF5bG9hZCBsaXN0Ci0JICovCi0JYnVmX3Bvb2xfc3ogPSBtb2QtPnJzcF9wbGRfc3ogKiBtb2QtPm51bV9mY3hwczsKLQltb2QtPnJzcF9wbGRfbGlzdF9rdmEgPSBkbV9rdmE7Ci0JbW9kLT5yc3BfcGxkX2xpc3RfcGEgPSBkbV9wYTsKLQlkbV9rdmEgKz0gYnVmX3Bvb2xfc3o7Ci0JZG1fcGEgKz0gYnVmX3Bvb2xfc3o7Ci0JbWVtc2V0KG1vZC0+cnNwX3BsZF9saXN0X2t2YSwgMCwgYnVmX3Bvb2xfc3opOwotCi0JYmZhX21lbWluZm9fZG1hX3ZpcnQobWkpID0gZG1fa3ZhOwotCWJmYV9tZW1pbmZvX2RtYV9waHlzKG1pKSA9IGRtX3BhOwotfQotCi1zdGF0aWMgdm9pZAotY2xhaW1fZmN4cHNfbWVtKHN0cnVjdCBiZmFfZmN4cF9tb2RfcyAqbW9kLCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWkpCitjbGFpbV9mY3hwc19tZW0oc3RydWN0IGJmYV9mY3hwX21vZF9zICptb2QpCiB7CiAJdTE2CWk7CiAJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHA7CiAKLQlmY3hwID0gKHN0cnVjdCBiZmFfZmN4cF9zICopIGJmYV9tZW1pbmZvX2t2YShtaSk7CisJZmN4cCA9IChzdHJ1Y3QgYmZhX2ZjeHBfcyAqKSBiZmFfbWVtX2t2YV9jdXJwKG1vZCk7CiAJbWVtc2V0KGZjeHAsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX2ZjeHBfcykgKiBtb2QtPm51bV9mY3hwcyk7CiAKIAlJTklUX0xJU1RfSEVBRCgmbW9kLT5mY3hwX2ZyZWVfcSk7CiAJSU5JVF9MSVNUX0hFQUQoJm1vZC0+ZmN4cF9hY3RpdmVfcSk7CisJSU5JVF9MSVNUX0hFQUQoJm1vZC0+ZmN4cF91bnVzZWRfcSk7CiAKIAltb2QtPmZjeHBfbGlzdCA9IGZjeHA7CiAKQEAgLTQ4OSw0MCArNDU2LDUzIEBACiAJCWZjeHAgPSBmY3hwICsgMTsKIAl9CiAKLQliZmFfbWVtaW5mb19rdmEobWkpID0gKHZvaWQgKilmY3hwOworCWJmYV9tZW1fa3ZhX2N1cnAobW9kKSA9ICh2b2lkICopZmN4cDsKIH0KIAogc3RhdGljIHZvaWQKLWJmYV9mY3hwX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKm5kbV9sZW4sCi0JCSB1MzIgKmRtX2xlbikKK2JmYV9mY3hwX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWluZm8sCisJCXN0cnVjdCBiZmFfcyAqYmZhKQogewotCXUxNgludW1fZmN4cF9yZXFzID0gY2ZnLT5md2NmZy5udW1fZmN4cF9yZXFzOworCXN0cnVjdCBiZmFfZmN4cF9tb2RfcyAqZmN4cF9tb2QgPSBCRkFfRkNYUF9NT0QoYmZhKTsKKwlzdHJ1Y3QgYmZhX21lbV9rdmFfcyAqZmN4cF9rdmEgPSBCRkFfTUVNX0ZDWFBfS1ZBKGJmYSk7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MgKnNlZ19wdHI7CisJdTE2CW5zZWdzLCBpZHgsIHBlcl9zZWdfZmN4cDsKKwl1MTYJbnVtX2ZjeHBzID0gY2ZnLT5md2NmZy5udW1fZmN4cF9yZXFzOworCXUzMglwZXJfZmN4cF9zejsKIAotCWlmIChudW1fZmN4cF9yZXFzID09IDApCisJaWYgKG51bV9mY3hwcyA9PSAwKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIEFjY291bnQgZm9yIHJlcS9yc3AgcGF5bG9hZAotCSAqLwotCSpkbV9sZW4gKz0gQkZBX0ZDWFBfTUFYX0lCVUZfU1ogKiBudW1fZmN4cF9yZXFzOwogCWlmIChjZmctPmRydmNmZy5taW5fY2ZnKQotCQkqZG1fbGVuICs9IEJGQV9GQ1hQX01BWF9JQlVGX1NaICogbnVtX2ZjeHBfcmVxczsKKwkJcGVyX2ZjeHBfc3ogPSAyICogQkZBX0ZDWFBfTUFYX0lCVUZfU1o7CiAJZWxzZQotCQkqZG1fbGVuICs9IEJGQV9GQ1hQX01BWF9MQlVGX1NaICogbnVtX2ZjeHBfcmVxczsKKwkJcGVyX2ZjeHBfc3ogPSBCRkFfRkNYUF9NQVhfSUJVRl9TWiArIEJGQV9GQ1hQX01BWF9MQlVGX1NaOwogCi0JLyoKLQkgKiBBY2NvdW50IGZvciBmY3hwIHN0cnVjdHMKLQkgKi8KLQkqbmRtX2xlbiArPSBzaXplb2Yoc3RydWN0IGJmYV9mY3hwX3MpICogbnVtX2ZjeHBfcmVxczsKKwkvKiBkbWEgbWVtb3J5ICovCisJbnNlZ3MgPSBCRklfTUVNX0RNQV9OU0VHUyhudW1fZmN4cHMsIHBlcl9mY3hwX3N6KTsKKwlwZXJfc2VnX2ZjeHAgPSBCRklfTUVNX05SRVFTX1NFRyhwZXJfZmN4cF9zeik7CisKKwliZmFfbWVtX2RtYV9zZWdfaXRlcihmY3hwX21vZCwgc2VnX3B0ciwgbnNlZ3MsIGlkeCkgeworCQlpZiAobnVtX2ZjeHBzID49IHBlcl9zZWdfZmN4cCkgeworCQkJbnVtX2ZjeHBzIC09IHBlcl9zZWdfZmN4cDsKKwkJCWJmYV9tZW1fZG1hX3NldHVwKG1pbmZvLCBzZWdfcHRyLAorCQkJCXBlcl9zZWdfZmN4cCAqIHBlcl9mY3hwX3N6KTsKKwkJfSBlbHNlCisJCQliZmFfbWVtX2RtYV9zZXR1cChtaW5mbywgc2VnX3B0ciwKKwkJCQludW1fZmN4cHMgKiBwZXJfZmN4cF9zeik7CisJfQorCisJLyoga3ZhIG1lbW9yeSAqLworCWJmYV9tZW1fa3ZhX3NldHVwKG1pbmZvLCBmY3hwX2t2YSwKKwkJY2ZnLT5md2NmZy5udW1fZmN4cF9yZXFzICogc2l6ZW9mKHN0cnVjdCBiZmFfZmN4cF9zKSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBiZmFfZmN4cF9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKLQkJc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKKwkJc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQogewogCXN0cnVjdCBiZmFfZmN4cF9tb2RfcyAqbW9kID0gQkZBX0ZDWFBfTU9EKGJmYSk7CiAKLQltZW1zZXQobW9kLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9mY3hwX21vZF9zKSk7CiAJbW9kLT5iZmEgPSBiZmE7CiAJbW9kLT5udW1fZmN4cHMgPSBjZmctPmZ3Y2ZnLm51bV9mY3hwX3JlcXM7CiAKQEAgLTUzNSw4ICs1MTUsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJm1vZC0+d2FpdF9xKTsKIAotCWNsYWltX2ZjeHBfcmVxX3JzcF9tZW0obW9kLCBtZW1pbmZvKTsKLQljbGFpbV9mY3hwc19tZW0obW9kLCBtZW1pbmZvKTsKKwljbGFpbV9mY3hwc19tZW0obW9kKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTU2MSw2ICs1NDAsOSBAQAogCXN0cnVjdCBiZmFfZmN4cF9zICpmY3hwOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgKnFlLCAqcWVuOwogCisJLyogRW5xdWV1ZSB1bnVzZWQgZmN4cCByZXNvdXJjZXMgdG8gZnJlZV9xICovCisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZtb2QtPmZjeHBfdW51c2VkX3EsICZtb2QtPmZjeHBfZnJlZV9xKTsKKwogCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmbW9kLT5mY3hwX2FjdGl2ZV9xKSB7CiAJCWZjeHAgPSAoc3RydWN0IGJmYV9mY3hwX3MgKikgcWU7CiAJCWlmIChmY3hwLT5jYWxsZXIgPT0gTlVMTCkgewpAQCAtNzUwLDIzICs3MzIsNiBAQAogfQogCiBzdGF0aWMgdm9pZAotaGFsX2ZjeHBfc2V0X2xvY2FsX3NnZXMoc3RydWN0IGJmaV9zZ2VfcyAqc2dlLCB1MzIgcmVxbGVuLCB1NjQgcmVxX3BhKQotewotCXVuaW9uIGJmaV9hZGRyX3UgICAgICBzZ2FfemVybyA9IHsgezB9IH07Ci0KLQlzZ2UtPnNnX2xlbiA9IHJlcWxlbjsKLQlzZ2UtPmZsYWdzID0gQkZJX1NHRV9EQVRBX0xBU1Q7Ci0JYmZhX2RtYV9hZGRyX3NldChzZ2VbMF0uc2dhLCByZXFfcGEpOwotCWJmYV9zZ2VfdG9fYmUoc2dlKTsKLQlzZ2UrKzsKLQotCXNnZS0+c2dhID0gc2dhX3plcm87Ci0Jc2dlLT5zZ19sZW4gPSByZXFsZW47Ci0Jc2dlLT5mbGFncyA9IEJGSV9TR0VfUEdETEVOOwotCWJmYV9zZ2VfdG9fYmUoc2dlKTsKLX0KLQotc3RhdGljIHZvaWQKIGhhbF9mY3hwX3R4X3Bsb2coc3RydWN0IGJmYV9zICpiZmEsIHUzMiByZXFsZW4sIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAogCQkgc3RydWN0IGZjaHNfcyAqZmNocykKIHsKQEAgLTg0Niw3ICs4MTEsNyBAQAogCXN0cnVjdCBiZmFfcnBvcnRfcwkJKnJwb3J0ID0gcmVxaS0+YmZhX3Jwb3J0OwogCiAJYmZpX2gyaV9zZXQoc2VuZF9yZXEtPm1oLCBCRklfTUNfRkNYUCwgQkZJX0ZDWFBfSDJJX1NFTkRfUkVRLAotCQkgICAgYmZhX2xwdWlkKGJmYSkpOworCQkgICAgYmZhX2ZuX2xwdShiZmEpKTsKIAogCXNlbmRfcmVxLT5mY3hwX3RhZyA9IGNwdV90b19iZTE2KGZjeHAtPmZjeHBfdGFnKTsKIAlpZiAocnBvcnQpIHsKQEAgLTg2MCw3ICs4MjUsNyBAQAogCX0KIAogCXNlbmRfcmVxLT52Zl9pZCA9IGNwdV90b19iZTE2KHJlcWktPnZmX2lkKTsKLQlzZW5kX3JlcS0+bHBfdGFnID0gcmVxaS0+bHBfdGFnOworCXNlbmRfcmVxLT5scF9md3RhZyA9IGJmYV9scHNfZ2V0X2Z3dGFnKGJmYSwgcmVxaS0+bHBfdGFnKTsKIAlzZW5kX3JlcS0+Y2xhc3MgPSByZXFpLT5jbGFzczsKIAlzZW5kX3JlcS0+cnNwX3RpbWVvdXQgPSByc3BpLT5yc3BfdGltZW91dDsKIAlzZW5kX3JlcS0+Y3RzID0gcmVxaS0+Y3RzOwpAQCAtODczLDE4ICs4MzgsMTYgQEAKIAkgKiBzZXR1cCByZXEgc2dsZXMKIAkgKi8KIAlpZiAoZmN4cC0+dXNlX2lyZXFidWYgPT0gMSkgewotCQloYWxfZmN4cF9zZXRfbG9jYWxfc2dlcyhzZW5kX3JlcS0+cmVxX3NnZSwgcmVxaS0+cmVxX3RvdF9sZW4sCisJCWJmYV9hbGVuX3NldCgmc2VuZF9yZXEtPnJlcV9hbGVuLCByZXFpLT5yZXFfdG90X2xlbiwKIAkJCQkJQkZBX0ZDWFBfUkVRX1BMRF9QQShmY3hwKSk7CiAJfSBlbHNlIHsKIAkJaWYgKGZjeHAtPm5yZXFfc2dsZXMgPiAwKSB7CiAJCQlXQVJOX09OKGZjeHAtPm5yZXFfc2dsZXMgIT0gMSk7Ci0JCQloYWxfZmN4cF9zZXRfbG9jYWxfc2dlcyhzZW5kX3JlcS0+cmVxX3NnZSwKLQkJCQkJCXJlcWktPnJlcV90b3RfbGVuLAotCQkJCQkJZmN4cC0+cmVxX3NnYV9jYmZuKGZjeHAtPmNhbGxlciwKLQkJCQkJCQkJICAgMCkpOworCQkJYmZhX2FsZW5fc2V0KCZzZW5kX3JlcS0+cmVxX2FsZW4sIHJlcWktPnJlcV90b3RfbGVuLAorCQkJCWZjeHAtPnJlcV9zZ2FfY2JmbihmY3hwLT5jYWxsZXIsIDApKTsKIAkJfSBlbHNlIHsKIAkJCVdBUk5fT04ocmVxaS0+cmVxX3RvdF9sZW4gIT0gMCk7Ci0JCQloYWxfZmN4cF9zZXRfbG9jYWxfc2dlcyhzZW5kX3JlcS0+cnNwX3NnZSwgMCwgMCk7CisJCQliZmFfYWxlbl9zZXQoJnNlbmRfcmVxLT5yc3BfYWxlbiwgMCwgMCk7CiAJCX0KIAl9CiAKQEAgLTg5NCwyNSArODU3LDIzIEBACiAJaWYgKGZjeHAtPnVzZV9pcnNwYnVmID09IDEpIHsKIAkJV0FSTl9PTihyc3BpLT5yc3BfbWF4bGVuID4gQkZBX0ZDWFBfTUFYX0xCVUZfU1opOwogCi0JCWhhbF9mY3hwX3NldF9sb2NhbF9zZ2VzKHNlbmRfcmVxLT5yc3Bfc2dlLCByc3BpLT5yc3BfbWF4bGVuLAorCQliZmFfYWxlbl9zZXQoJnNlbmRfcmVxLT5yc3BfYWxlbiwgcnNwaS0+cnNwX21heGxlbiwKIAkJCQkJQkZBX0ZDWFBfUlNQX1BMRF9QQShmY3hwKSk7Ci0KIAl9IGVsc2UgewogCQlpZiAoZmN4cC0+bnJzcF9zZ2xlcyA+IDApIHsKIAkJCVdBUk5fT04oZmN4cC0+bnJzcF9zZ2xlcyAhPSAxKTsKLQkJCWhhbF9mY3hwX3NldF9sb2NhbF9zZ2VzKHNlbmRfcmVxLT5yc3Bfc2dlLAotCQkJCQkJcnNwaS0+cnNwX21heGxlbiwKLQkJCQkJCWZjeHAtPnJzcF9zZ2FfY2JmbihmY3hwLT5jYWxsZXIsCi0JCQkJCQkJCSAgIDApKTsKKwkJCWJmYV9hbGVuX3NldCgmc2VuZF9yZXEtPnJzcF9hbGVuLCByc3BpLT5yc3BfbWF4bGVuLAorCQkJCWZjeHAtPnJzcF9zZ2FfY2JmbihmY3hwLT5jYWxsZXIsIDApKTsKKwogCQl9IGVsc2UgewogCQkJV0FSTl9PTihyc3BpLT5yc3BfbWF4bGVuICE9IDApOwotCQkJaGFsX2ZjeHBfc2V0X2xvY2FsX3NnZXMoc2VuZF9yZXEtPnJzcF9zZ2UsIDAsIDApOworCQkJYmZhX2FsZW5fc2V0KCZzZW5kX3JlcS0+cnNwX2FsZW4sIDAsIDApOwogCQl9CiAJfQogCiAJaGFsX2ZjeHBfdHhfcGxvZyhiZmEsIHJlcWktPnJlcV90b3RfbGVuLCBmY3hwLCAmcmVxaS0+ZmNocyk7CiAKLQliZmFfcmVxcV9wcm9kdWNlKGJmYSwgQkZBX1JFUVFfRkNYUCk7CisJYmZhX3JlcXFfcHJvZHVjZShiZmEsIEJGQV9SRVFRX0ZDWFAsIHNlbmRfcmVxLT5taCk7CiAKIAliZmFfdHJjKGJmYSwgYmZhX3JlcXFfcGkoYmZhLCBCRkFfUkVRUV9GQ1hQKSk7CiAJYmZhX3RyYyhiZmEsIGJmYV9yZXFxX2NpKGJmYSwgQkZBX1JFUVFfRkNYUCkpOwpAQCAtOTc4LDggKzkzOSw4IEBACiAJdm9pZAkqcmVxYnVmOwogCiAJV0FSTl9PTihmY3hwLT51c2VfaXJlcWJ1ZiAhPSAxKTsKLQlyZXFidWYgPSAoKHU4ICopbW9kLT5yZXFfcGxkX2xpc3Rfa3ZhKSArCi0JCWZjeHAtPmZjeHBfdGFnICogbW9kLT5yZXFfcGxkX3N6OworCXJlcWJ1ZiA9IGJmYV9tZW1fZ2V0X2RtYWJ1Zl9rdmEobW9kLCBmY3hwLT5mY3hwX3RhZywKKwkJCQltb2QtPnJlcV9wbGRfc3ogKyBtb2QtPnJzcF9wbGRfc3opOwogCXJldHVybiByZXFidWY7CiB9CiAKQEAgLTEwMDIsMTMgKzk2MywxNSBAQAogYmZhX2ZjeHBfZ2V0X3JzcGJ1ZihzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCkKIHsKIAlzdHJ1Y3QgYmZhX2ZjeHBfbW9kX3MgKm1vZCA9IGZjeHAtPmZjeHBfbW9kOwotCXZvaWQJKnJzcGJ1ZjsKKwl2b2lkCSpmY3hwX2J1ZjsKIAogCVdBUk5fT04oZmN4cC0+dXNlX2lyc3BidWYgIT0gMSk7CiAKLQlyc3BidWYgPSAoKHU4ICopbW9kLT5yc3BfcGxkX2xpc3Rfa3ZhKSArCi0JCWZjeHAtPmZjeHBfdGFnICogbW9kLT5yc3BfcGxkX3N6OwotCXJldHVybiByc3BidWY7CisJZmN4cF9idWYgPSBiZmFfbWVtX2dldF9kbWFidWZfa3ZhKG1vZCwgZmN4cC0+ZmN4cF90YWcsCisJCQkJbW9kLT5yZXFfcGxkX3N6ICsgbW9kLT5yc3BfcGxkX3N6KTsKKworCS8qIGZjeHBfYnVmID0gcmVxX2J1ZiArIHJzcF9idWYgOi0gYWRkIHJlcV9idWZfc3ogdG8gZ2V0IHRvIHJzcF9idWYgKi8KKwlyZXR1cm4gKCh1OCAqKSBmY3hwX2J1ZikgKyBtb2QtPnJlcV9wbGRfc3o7CiB9CiAKIC8qCkBAIC0xMTgxLDYgKzExNDQsMTggQEAKIAlyZXR1cm4gbW9kLT5yc3BfcGxkX3N6OwogfQogCit2b2lkCitiZmFfZmN4cF9yZXNfcmVjZmcoc3RydWN0IGJmYV9zICpiZmEsIHUxNiBudW1fZmN4cF9mdykKK3sKKwlzdHJ1Y3QgYmZhX2ZjeHBfbW9kX3MJKm1vZCA9IEJGQV9GQ1hQX01PRChiZmEpOworCXN0cnVjdCBsaXN0X2hlYWQJKnFlOworCWludAlpOworCisJZm9yIChpID0gMDsgaSA8IChtb2QtPm51bV9mY3hwcyAtIG51bV9mY3hwX2Z3KTsgaSsrKSB7CisJCWJmYV9xX2RlcV90YWlsKCZtb2QtPmZjeHBfZnJlZV9xLCAmcWUpOworCQlsaXN0X2FkZF90YWlsKHFlLCAmbW9kLT5mY3hwX3VudXNlZF9xKTsKKwl9Cit9CiAKIC8qCiAgKiAgQkZBIExQUyBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9ucwpAQCAtMTE5Miw3ICsxMTY3LDcgQEAKIHN0YXRpYyB2b2lkCiBiZmFfbHBzX3NtX2luaXQoc3RydWN0IGJmYV9scHNfcyAqbHBzLCBlbnVtIGJmYV9scHNfZXZlbnQgZXZlbnQpCiB7Ci0JYmZhX3RyYyhscHMtPmJmYSwgbHBzLT5scF90YWcpOworCWJmYV90cmMobHBzLT5iZmEsIGxwcy0+YmZhX3RhZyk7CiAJYmZhX3RyYyhscHMtPmJmYSwgZXZlbnQpOwogCiAJc3dpdGNoIChldmVudCkgewpAQCAtMTI0NCw3ICsxMjE5LDcgQEAKIHN0YXRpYyB2b2lkCiBiZmFfbHBzX3NtX2xvZ2luKHN0cnVjdCBiZmFfbHBzX3MgKmxwcywgZW51bSBiZmFfbHBzX2V2ZW50IGV2ZW50KQogewotCWJmYV90cmMobHBzLT5iZmEsIGxwcy0+bHBfdGFnKTsKKwliZmFfdHJjKGxwcy0+YmZhLCBscHMtPmJmYV90YWcpOwogCWJmYV90cmMobHBzLT5iZmEsIGV2ZW50KTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKQEAgLTEyNzgsNiArMTI1Myw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfTFBTX1NNX09GRkxJTkU6CisJY2FzZSBCRkFfTFBTX1NNX0RFTEVURToKIAkJYmZhX3NtX3NldF9zdGF0ZShscHMsIGJmYV9scHNfc21faW5pdCk7CiAJCWJyZWFrOwogCkBAIC0xMjk3LDcgKzEyNzMsNyBAQAogc3RhdGljIHZvaWQKIGJmYV9scHNfc21fbG9naW53YWl0KHN0cnVjdCBiZmFfbHBzX3MgKmxwcywgZW51bSBiZmFfbHBzX2V2ZW50IGV2ZW50KQogewotCWJmYV90cmMobHBzLT5iZmEsIGxwcy0+bHBfdGFnKTsKKwliZmFfdHJjKGxwcy0+YmZhLCBscHMtPmJmYV90YWcpOwogCWJmYV90cmMobHBzLT5iZmEsIGV2ZW50KTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKQEAgLTEzMDYsNiArMTI4Miw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfTFBTX1NNX09GRkxJTkU6CisJY2FzZSBCRkFfTFBTX1NNX0RFTEVURToKIAkJYmZhX3NtX3NldF9zdGF0ZShscHMsIGJmYV9scHNfc21faW5pdCk7CiAJCWJmYV9yZXFxX3djYW5jZWwoJmxwcy0+d3FlKTsKIAkJYnJlYWs7CkBAIC0xMzI5LDcgKzEzMDYsNyBAQAogc3RhdGljIHZvaWQKIGJmYV9scHNfc21fb25saW5lKHN0cnVjdCBiZmFfbHBzX3MgKmxwcywgZW51bSBiZmFfbHBzX2V2ZW50IGV2ZW50KQogewotCWJmYV90cmMobHBzLT5iZmEsIGxwcy0+bHBfdGFnKTsKKwliZmFfdHJjKGxwcy0+YmZhLCBscHMtPmJmYV90YWcpOwogCWJmYV90cmMobHBzLT5iZmEsIGV2ZW50KTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKQEAgLTEzNzgsNyArMTM1NSw3IEBACiBzdGF0aWMgdm9pZAogYmZhX2xwc19zbV9vbmxpbmVfbjJuX3BpZF93YWl0KHN0cnVjdCBiZmFfbHBzX3MgKmxwcywgZW51bSBiZmFfbHBzX2V2ZW50IGV2ZW50KQogewotCWJmYV90cmMobHBzLT5iZmEsIGxwcy0+bHBfdGFnKTsKKwliZmFfdHJjKGxwcy0+YmZhLCBscHMtPmJmYV90YWcpOwogCWJmYV90cmMobHBzLT5iZmEsIGV2ZW50KTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKQEAgLTE0MjAsNyArMTM5Nyw3IEBACiBzdGF0aWMgdm9pZAogYmZhX2xwc19zbV9sb2dvdXQoc3RydWN0IGJmYV9scHNfcyAqbHBzLCBlbnVtIGJmYV9scHNfZXZlbnQgZXZlbnQpCiB7Ci0JYmZhX3RyYyhscHMtPmJmYSwgbHBzLT5scF90YWcpOworCWJmYV90cmMobHBzLT5iZmEsIGxwcy0+YmZhX3RhZyk7CiAJYmZhX3RyYyhscHMtPmJmYSwgZXZlbnQpOwogCiAJc3dpdGNoIChldmVudCkgewpAQCAtMTQzMCw2ICsxNDA3LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9MUFNfU01fT0ZGTElORToKKwljYXNlIEJGQV9MUFNfU01fREVMRVRFOgogCQliZmFfc21fc2V0X3N0YXRlKGxwcywgYmZhX2xwc19zbV9pbml0KTsKIAkJYnJlYWs7CiAKQEAgLTE0NDQsNyArMTQyMiw3IEBACiBzdGF0aWMgdm9pZAogYmZhX2xwc19zbV9sb2dvd2FpdChzdHJ1Y3QgYmZhX2xwc19zICpscHMsIGVudW0gYmZhX2xwc19ldmVudCBldmVudCkKIHsKLQliZmFfdHJjKGxwcy0+YmZhLCBscHMtPmxwX3RhZyk7CisJYmZhX3RyYyhscHMtPmJmYSwgbHBzLT5iZmFfdGFnKTsKIAliZmFfdHJjKGxwcy0+YmZhLCBldmVudCk7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CkBAIC0xNDU0LDYgKzE0MzIsNyBAQAogCQlicmVhazsKIAogCWNhc2UgQkZBX0xQU19TTV9PRkZMSU5FOgorCWNhc2UgQkZBX0xQU19TTV9ERUxFVEU6CiAJCWJmYV9zbV9zZXRfc3RhdGUobHBzLCBiZmFfbHBzX3NtX2luaXQpOwogCQliZmFfcmVxcV93Y2FuY2VsKCZscHMtPndxZSk7CiAJCWJyZWFrOwpAQCAtMTQ3MywxMyArMTQ1MiwxNyBAQAogICogcmV0dXJuIG1lbW9yeSByZXF1aXJlbWVudAogICovCiBzdGF0aWMgdm9pZAotYmZhX2xwc19tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgdTMyICpuZG1fbGVuLAotCXUzMiAqZG1fbGVuKQorYmZhX2xwc19tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pbmZvLAorCQlzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKKwlzdHJ1Y3QgYmZhX21lbV9rdmFfcyAqbHBzX2t2YSA9IEJGQV9NRU1fTFBTX0tWQShiZmEpOworCiAJaWYgKGNmZy0+ZHJ2Y2ZnLm1pbl9jZmcpCi0JCSpuZG1fbGVuICs9IHNpemVvZihzdHJ1Y3QgYmZhX2xwc19zKSAqIEJGQV9MUFNfTUlOX0xQT1JUUzsKKwkJYmZhX21lbV9rdmFfc2V0dXAobWluZm8sIGxwc19rdmEsCisJCQlzaXplb2Yoc3RydWN0IGJmYV9scHNfcykgKiBCRkFfTFBTX01JTl9MUE9SVFMpOwogCWVsc2UKLQkJKm5kbV9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBiZmFfbHBzX3MpICogQkZBX0xQU19NQVhfTFBPUlRTOworCQliZmFfbWVtX2t2YV9zZXR1cChtaW5mbywgbHBzX2t2YSwKKwkJCXNpemVvZihzdHJ1Y3QgYmZhX2xwc19zKSAqIEJGQV9MUFNfTUFYX0xQT1JUUyk7CiB9CiAKIC8qCkBAIC0xNDg3LDI4ICsxNDcwLDI4IEBACiAgKi8KIHN0YXRpYyB2b2lkCiBiZmFfbHBzX2F0dGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqYmZhZCwgc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLAotCXN0cnVjdCBiZmFfbWVtaW5mb19zICptZW1pbmZvLCBzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYpCisJc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQogewogCXN0cnVjdCBiZmFfbHBzX21vZF9zCSptb2QgPSBCRkFfTFBTX01PRChiZmEpOwogCXN0cnVjdCBiZmFfbHBzX3MJKmxwczsKIAlpbnQJCQlpOwogCi0JbWVtc2V0KG1vZCwgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfbHBzX21vZF9zKSk7CiAJbW9kLT5udW1fbHBzID0gQkZBX0xQU19NQVhfTFBPUlRTOwogCWlmIChjZmctPmRydmNmZy5taW5fY2ZnKQogCQltb2QtPm51bV9scHMgPSBCRkFfTFBTX01JTl9MUE9SVFM7CiAJZWxzZQogCQltb2QtPm51bV9scHMgPSBCRkFfTFBTX01BWF9MUE9SVFM7Ci0JbW9kLT5scHNfYXJyID0gbHBzID0gKHN0cnVjdCBiZmFfbHBzX3MgKikgYmZhX21lbWluZm9fa3ZhKG1lbWluZm8pOworCW1vZC0+bHBzX2FyciA9IGxwcyA9IChzdHJ1Y3QgYmZhX2xwc19zICopIGJmYV9tZW1fa3ZhX2N1cnAobW9kKTsKIAotCWJmYV9tZW1pbmZvX2t2YShtZW1pbmZvKSArPSBtb2QtPm51bV9scHMgKiBzaXplb2Yoc3RydWN0IGJmYV9scHNfcyk7CisJYmZhX21lbV9rdmFfY3VycChtb2QpICs9IG1vZC0+bnVtX2xwcyAqIHNpemVvZihzdHJ1Y3QgYmZhX2xwc19zKTsKIAogCUlOSVRfTElTVF9IRUFEKCZtb2QtPmxwc19mcmVlX3EpOwogCUlOSVRfTElTVF9IRUFEKCZtb2QtPmxwc19hY3RpdmVfcSk7CisJSU5JVF9MSVNUX0hFQUQoJm1vZC0+bHBzX2xvZ2luX3EpOwogCiAJZm9yIChpID0gMDsgaSA8IG1vZC0+bnVtX2xwczsgaSsrLCBscHMrKykgewogCQlscHMtPmJmYQk9IGJmYTsKLQkJbHBzLT5scF90YWcJPSAodTgpIGk7CisJCWxwcy0+YmZhX3RhZwk9ICh1OCkgaTsKIAkJbHBzLT5yZXFxCT0gQkZBX1JFUVFfTFBTOwogCQliZmFfcmVxcV93aW5pdCgmbHBzLT53cWUsIGJmYV9scHNfcmVxcV9yZXN1bWUsIGxwcyk7CiAJCWxpc3RfYWRkX3RhaWwoJmxwcy0+cWUsICZtb2QtPmxwc19mcmVlX3EpOwpAQCAtMTU0NCw2ICsxNTI3LDExIEBACiAJCWxwcyA9IChzdHJ1Y3QgYmZhX2xwc19zICopIHFlOwogCQliZmFfc21fc2VuZF9ldmVudChscHMsIEJGQV9MUFNfU01fT0ZGTElORSk7CiAJfQorCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmbW9kLT5scHNfbG9naW5fcSkgeworCQlscHMgPSAoc3RydWN0IGJmYV9scHNfcyAqKSBxZTsKKwkJYmZhX3NtX3NlbmRfZXZlbnQobHBzLCBCRkFfTFBTX1NNX09GRkxJTkUpOworCX0KKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJm1vZC0+bHBzX2xvZ2luX3EsICZtb2QtPmxwc19hY3RpdmVfcSk7CiB9CiAKIC8qCkBAIC0xNTU1LDEyICsxNTQzLDEzIEBACiAJc3RydWN0IGJmYV9scHNfbW9kX3MJKm1vZCA9IEJGQV9MUFNfTU9EKGJmYSk7CiAJc3RydWN0IGJmYV9scHNfcwkqbHBzOwogCi0JV0FSTl9PTihyc3AtPmxwX3RhZyA+PSBtb2QtPm51bV9scHMpOwotCWxwcyA9IEJGQV9MUFNfRlJPTV9UQUcobW9kLCByc3AtPmxwX3RhZyk7CisJV0FSTl9PTihyc3AtPmJmYV90YWcgPj0gbW9kLT5udW1fbHBzKTsKKwlscHMgPSBCRkFfTFBTX0ZST01fVEFHKG1vZCwgcnNwLT5iZmFfdGFnKTsKIAogCWxwcy0+c3RhdHVzID0gcnNwLT5zdGF0dXM7CiAJc3dpdGNoIChyc3AtPnN0YXR1cykgewogCWNhc2UgQkZBX1NUQVRVU19PSzoKKwkJbHBzLT5md190YWcJPSByc3AtPmZ3X3RhZzsKIAkJbHBzLT5mcG9ydAk9IHJzcC0+Zl9wb3J0OwogCQlpZiAobHBzLT5mcG9ydCkKIAkJCWxwcy0+bHBfcGlkID0gcnNwLT5scF9waWQ7CkBAIC0xNTcyLDYgKzE1NjEsNyBAQAogCQlscHMtPmxwX21hYwk9IHJzcC0+bHBfbWFjOwogCQlscHMtPmJyY2Rfc3dpdGNoID0gcnNwLT5icmNkX3N3aXRjaDsKIAkJbHBzLT5mY2ZfbWFjCT0gcnNwLT5mY2ZfbWFjOworCQlscHMtPnByX2Jic2NuCT0gcnNwLT5iYl9zY247CiAKIAkJYnJlYWs7CiAKQEAgLTE1ODYsMTQgKzE1NzYsNDYgQEAKIAogCQlicmVhazsKIAorCWNhc2UgQkZBX1NUQVRVU19WUE9SVF9NQVg6CisJCWlmICghcnNwLT5leHRfc3RhdHVzKQorCQkJYmZhX2xwc19ub19yZXMobHBzLCByc3AtPmV4dF9zdGF0dXMpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCS8qIE5vdGhpbmcgdG8gZG8gd2l0aCBvdGhlciBzdGF0dXMgKi8KIAkJYnJlYWs7CiAJfQogCisJbGlzdF9kZWwoJmxwcy0+cWUpOworCWxpc3RfYWRkX3RhaWwoJmxwcy0+cWUsICZtb2QtPmxwc19hY3RpdmVfcSk7CiAJYmZhX3NtX3NlbmRfZXZlbnQobHBzLCBCRkFfTFBTX1NNX0ZXUlNQKTsKIH0KIAorc3RhdGljIHZvaWQKK2JmYV9scHNfbm9fcmVzKHN0cnVjdCBiZmFfbHBzX3MgKmZpcnN0X2xwcywgdTggY291bnQpCit7CisJc3RydWN0IGJmYV9zCQkqYmZhID0gZmlyc3RfbHBzLT5iZmE7CisJc3RydWN0IGJmYV9scHNfbW9kX3MJKm1vZCA9IEJGQV9MUFNfTU9EKGJmYSk7CisJc3RydWN0IGxpc3RfaGVhZAkqcWUsICpxZV9uZXh0OworCXN0cnVjdCBiZmFfbHBzX3MJKmxwczsKKworCWJmYV90cmMoYmZhLCBjb3VudCk7CisKKwlxZSA9IGJmYV9xX25leHQoZmlyc3RfbHBzKTsKKworCXdoaWxlIChjb3VudCAmJiBxZSkgeworCQlxZV9uZXh0ID0gYmZhX3FfbmV4dChxZSk7CisJCWxwcyA9IChzdHJ1Y3QgYmZhX2xwc19zICopcWU7CisJCWJmYV90cmMoYmZhLCBscHMtPmJmYV90YWcpOworCQlscHMtPnN0YXR1cyA9IGZpcnN0X2xwcy0+c3RhdHVzOworCQlsaXN0X2RlbCgmbHBzLT5xZSk7CisJCWxpc3RfYWRkX3RhaWwoJmxwcy0+cWUsICZtb2QtPmxwc19hY3RpdmVfcSk7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGxwcywgQkZBX0xQU19TTV9GV1JTUCk7CisJCXFlID0gcWVfbmV4dDsKKwkJY291bnQtLTsKKwl9Cit9CisKIC8qCiAgKiBGaXJtd2FyZSBsb2dvdXQgcmVzcG9uc2UKICAqLwpAQCAtMTYwMyw4ICsxNjI1LDggQEAKIAlzdHJ1Y3QgYmZhX2xwc19tb2RfcwkqbW9kID0gQkZBX0xQU19NT0QoYmZhKTsKIAlzdHJ1Y3QgYmZhX2xwc19zCSpscHM7CiAKLQlXQVJOX09OKHJzcC0+bHBfdGFnID49IG1vZC0+bnVtX2xwcyk7Ci0JbHBzID0gQkZBX0xQU19GUk9NX1RBRyhtb2QsIHJzcC0+bHBfdGFnKTsKKwlXQVJOX09OKHJzcC0+YmZhX3RhZyA+PSBtb2QtPm51bV9scHMpOworCWxwcyA9IEJGQV9MUFNfRlJPTV9UQUcobW9kLCByc3AtPmJmYV90YWcpOwogCiAJYmZhX3NtX3NlbmRfZXZlbnQobHBzLCBCRkFfTFBTX1NNX0ZXUlNQKTsKIH0KQEAgLTE2MTgsNyArMTY0MCw3IEBACiAJc3RydWN0IGJmYV9scHNfbW9kX3MJKm1vZCA9IEJGQV9MUFNfTU9EKGJmYSk7CiAJc3RydWN0IGJmYV9scHNfcwkqbHBzOwogCi0JbHBzID0gQkZBX0xQU19GUk9NX1RBRyhtb2QsIGN2bC0+bHBfdGFnKTsKKwlscHMgPSBCRkFfTFBTX0ZST01fVEFHKG1vZCwgY3ZsLT5iZmFfdGFnKTsKIAogCWJmYV9zbV9zZW5kX2V2ZW50KGxwcywgQkZBX0xQU19TTV9SWF9DVkwpOwogfQpAQCAtMTY1MywyMyArMTY3NSwyNyBAQAogc3RhdGljIHZvaWQKIGJmYV9scHNfc2VuZF9sb2dpbihzdHJ1Y3QgYmZhX2xwc19zICpscHMpCiB7CisJc3RydWN0IGJmYV9scHNfbW9kX3MJKm1vZCA9IEJGQV9MUFNfTU9EKGxwcy0+YmZhKTsKIAlzdHJ1Y3QgYmZpX2xwc19sb2dpbl9yZXFfcwkqbTsKIAogCW0gPSBiZmFfcmVxcV9uZXh0KGxwcy0+YmZhLCBscHMtPnJlcXEpOwogCVdBUk5fT04oIW0pOwogCiAJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19MUFMsIEJGSV9MUFNfSDJJX0xPR0lOX1JFUSwKLQkJYmZhX2xwdWlkKGxwcy0+YmZhKSk7CisJCWJmYV9mbl9scHUobHBzLT5iZmEpKTsKIAotCW0tPmxwX3RhZwk9IGxwcy0+bHBfdGFnOworCW0tPmJmYV90YWcJPSBscHMtPmJmYV90YWc7CiAJbS0+YWxwYQkJPSBscHMtPmFscGE7CiAJbS0+cGR1X3NpemUJPSBjcHVfdG9fYmUxNihscHMtPnBkdXN6KTsKIAltLT5wd3duCQk9IGxwcy0+cHd3bjsKIAltLT5ud3duCQk9IGxwcy0+bnd3bjsKIAltLT5mZGlzYwk9IGxwcy0+ZmRpc2M7CiAJbS0+YXV0aF9lbgk9IGxwcy0+YXV0aF9lbjsKKwltLT5iYl9zY24JPSBscHMtPmJiX3NjbjsKIAotCWJmYV9yZXFxX3Byb2R1Y2UobHBzLT5iZmEsIGxwcy0+cmVxcSk7CisJYmZhX3JlcXFfcHJvZHVjZShscHMtPmJmYSwgbHBzLT5yZXFxLCBtLT5taCk7CisJbGlzdF9kZWwoJmxwcy0+cWUpOworCWxpc3RfYWRkX3RhaWwoJmxwcy0+cWUsICZtb2QtPmxwc19sb2dpbl9xKTsKIH0KIAogLyoKQEAgLTE2ODQsMTEgKzE3MTAsMTEgQEAKIAlXQVJOX09OKCFtKTsKIAogCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfTFBTLCBCRklfTFBTX0gySV9MT0dPVVRfUkVRLAotCQliZmFfbHB1aWQobHBzLT5iZmEpKTsKKwkJYmZhX2ZuX2xwdShscHMtPmJmYSkpOwogCi0JbS0+bHBfdGFnICAgID0gbHBzLT5scF90YWc7CisJbS0+ZndfdGFnID0gbHBzLT5md190YWc7CiAJbS0+cG9ydF9uYW1lID0gbHBzLT5wd3duOwotCWJmYV9yZXFxX3Byb2R1Y2UobHBzLT5iZmEsIGxwcy0+cmVxcSk7CisJYmZhX3JlcXFfcHJvZHVjZShscHMtPmJmYSwgbHBzLT5yZXFxLCBtLT5taCk7CiB9CiAKIC8qCkBAIC0xNzAzLDExICsxNzI5LDExIEBACiAJV0FSTl9PTighbSk7CiAKIAliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0xQUywgQkZJX0xQU19IMklfTjJOX1BJRF9SRVEsCi0JCWJmYV9scHVpZChscHMtPmJmYSkpOworCQliZmFfZm5fbHB1KGxwcy0+YmZhKSk7CiAKLQltLT5scF90YWcgPSBscHMtPmxwX3RhZzsKKwltLT5md190YWcgPSBscHMtPmZ3X3RhZzsKIAltLT5scF9waWQgPSBscHMtPmxwX3BpZDsKLQliZmFfcmVxcV9wcm9kdWNlKGxwcy0+YmZhLCBscHMtPnJlcXEpOworCWJmYV9yZXFxX3Byb2R1Y2UobHBzLT5iZmEsIGxwcy0+cmVxcSwgbS0+bWgpOwogfQogCiAvKgpAQCAtMTg1OSw3ICsxODg1LDcgQEAKICAqLwogdm9pZAogYmZhX2xwc19mbG9naShzdHJ1Y3QgYmZhX2xwc19zICpscHMsIHZvaWQgKnVhcmcsIHU4IGFscGEsIHUxNiBwZHVzeiwKLQl3d25fdCBwd3duLCB3d25fdCBud3duLCBiZmFfYm9vbGVhbl90IGF1dGhfZW4pCisJd3duX3QgcHd3biwgd3duX3Qgbnd3biwgYmZhX2Jvb2xlYW5fdCBhdXRoX2VuLCB1aW50OF90IGJiX3NjbikKIHsKIAlscHMtPnVhcmcJPSB1YXJnOwogCWxwcy0+YWxwYQk9IGFscGE7CkBAIC0xODY4LDYgKzE4OTQsNyBAQAogCWxwcy0+bnd3bgk9IG53d247CiAJbHBzLT5mZGlzYwk9IEJGQV9GQUxTRTsKIAlscHMtPmF1dGhfZW4JPSBhdXRoX2VuOworCWxwcy0+YmJfc2NuCT0gYmJfc2NuOwogCWJmYV9zbV9zZW5kX2V2ZW50KGxwcywgQkZBX0xQU19TTV9MT0dJTik7CiB9CiAKQEAgLTE4OTgsNiArMTkyNSwxMyBAQAogCWJmYV9zbV9zZW5kX2V2ZW50KGxwcywgQkZBX0xQU19TTV9MT0dPVVQpOwogfQogCit1OAorYmZhX2xwc19nZXRfZnd0YWcoc3RydWN0IGJmYV9zICpiZmEsIHU4IGxwX3RhZykKK3sKKwlzdHJ1Y3QgYmZhX2xwc19tb2RfcyAgICAqbW9kID0gQkZBX0xQU19NT0QoYmZhKTsKKworCXJldHVybiBCRkFfTFBTX0ZST01fVEFHKG1vZCwgbHBfdGFnKS0+ZndfdGFnOworfQogCiAvKgogICogUmV0dXJuIGxwb3J0IHNlcnZpY2VzIHRhZyBnaXZlbiB0aGUgcGlkCkBAIC0xOTExLDcgKzE5NDUsNyBAQAogCiAJZm9yIChpID0gMCwgbHBzID0gbW9kLT5scHNfYXJyOyBpIDwgbW9kLT5udW1fbHBzOyBpKyssIGxwcysrKSB7CiAJCWlmIChscHMtPmxwX3BpZCA9PSBwaWQpCi0JCQlyZXR1cm4gbHBzLT5scF90YWc7CisJCQlyZXR1cm4gbHBzLT5iZmFfdGFnOwogCX0KIAogCS8qIFJldHVybiBiYXNlIHBvcnQgdGFnIGFueXdheSAqLwpAQCAtMTkzNiw3ICsxOTcwLDcgQEAKIHZvaWQKIGJmYV9scHNfc2V0X24ybl9waWQoc3RydWN0IGJmYV9scHNfcyAqbHBzLCB1aW50MzJfdCBuMm5fcGlkKQogewotCWJmYV90cmMobHBzLT5iZmEsIGxwcy0+bHBfdGFnKTsKKwliZmFfdHJjKGxwcy0+YmZhLCBscHMtPmJmYV90YWcpOwogCWJmYV90cmMobHBzLT5iZmEsIG4ybl9waWQpOwogCiAJbHBzLT5scF9waWQgPSBuMm5fcGlkOwpAQCAtMTk1NSwxNSArMTk4OSwxNSBAQAogCW1zZy5tc2cgPSBtOwogCiAJc3dpdGNoIChtLT5taGRyLm1zZ19pZCkgewotCWNhc2UgQkZJX0xQU19IMklfTE9HSU5fUlNQOgorCWNhc2UgQkZJX0xQU19JMkhfTE9HSU5fUlNQOgogCQliZmFfbHBzX2xvZ2luX3JzcChiZmEsIG1zZy5sb2dpbl9yc3ApOwogCQlicmVhazsKIAotCWNhc2UgQkZJX0xQU19IMklfTE9HT1VUX1JTUDoKKwljYXNlIEJGSV9MUFNfSTJIX0xPR09VVF9SU1A6CiAJCWJmYV9scHNfbG9nb3V0X3JzcChiZmEsIG1zZy5sb2dvdXRfcnNwKTsKIAkJYnJlYWs7CiAKLQljYXNlIEJGSV9MUFNfSDJJX0NWTF9FVkVOVDoKKwljYXNlIEJGSV9MUFNfSTJIX0NWTF9FVkVOVDoKIAkJYmZhX2xwc19yeF9jdmxfZXZlbnQoYmZhLCBtc2cuY3ZsX2V2ZW50KTsKIAkJYnJlYWs7CiAKQEAgLTI3NzcsMTAgKzI4MTEsMTIgQEAKIAkJCQkJCQlCRkFfQ0FDSEVMSU5FX1NaKSkKIAogc3RhdGljIHZvaWQKLWJmYV9mY3BvcnRfbWVtaW5mbyhzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsIHUzMiAqbmRtX2xlbiwKLQkJdTMyICpkbV9sZW4pCitiZmFfZmNwb3J0X21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWluZm8sCisJCSAgIHN0cnVjdCBiZmFfcyAqYmZhKQogewotCSpkbV9sZW4gKz0gRkNQT1JUX1NUQVRTX0RNQV9TWjsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcyAqZmNwb3J0X2RtYSA9IEJGQV9NRU1fRkNQT1JUX0RNQShiZmEpOworCisJYmZhX21lbV9kbWFfc2V0dXAobWluZm8sIGZjcG9ydF9kbWEsIEZDUE9SVF9TVEFUU19ETUFfU1opOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjc5MiwyMyArMjgyOCwxNCBAQAogfQogCiBzdGF0aWMgdm9pZAotYmZhX2ZjcG9ydF9tZW1fY2xhaW0oc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0LCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbykKK2JmYV9mY3BvcnRfbWVtX2NsYWltKHN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCkKIHsKLQl1OAkJKmRtX2t2YTsKLQl1NjQJZG1fcGE7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MgKmZjcG9ydF9kbWEgPSAmZmNwb3J0LT5mY3BvcnRfZG1hOwogCi0JZG1fa3ZhID0gYmZhX21lbWluZm9fZG1hX3ZpcnQobWVtaW5mbyk7Ci0JZG1fcGEgID0gYmZhX21lbWluZm9fZG1hX3BoeXMobWVtaW5mbyk7Ci0KLQlmY3BvcnQtPnN0YXRzX2t2YSA9IGRtX2t2YTsKLQlmY3BvcnQtPnN0YXRzX3BhICA9IGRtX3BhOwotCWZjcG9ydC0+c3RhdHMJICA9ICh1bmlvbiBiZmFfZmNwb3J0X3N0YXRzX3UgKikgZG1fa3ZhOwotCi0JZG1fa3ZhICs9IEZDUE9SVF9TVEFUU19ETUFfU1o7Ci0JZG1fcGEgICs9IEZDUE9SVF9TVEFUU19ETUFfU1o7Ci0KLQliZmFfbWVtaW5mb19kbWFfdmlydChtZW1pbmZvKSA9IGRtX2t2YTsKLQliZmFfbWVtaW5mb19kbWFfcGh5cyhtZW1pbmZvKSA9IGRtX3BhOworCWZjcG9ydC0+c3RhdHNfa3ZhID0gYmZhX21lbV9kbWFfdmlydChmY3BvcnRfZG1hKTsKKwlmY3BvcnQtPnN0YXRzX3BhICA9IGJmYV9tZW1fZG1hX3BoeXMoZmNwb3J0X2RtYSk7CisJZmNwb3J0LT5zdGF0cyA9ICh1bmlvbiBiZmFfZmNwb3J0X3N0YXRzX3UgKikKKwkJCQliZmFfbWVtX2RtYV92aXJ0KGZjcG9ydF9kbWEpOwogfQogCiAvKgpAQCAtMjgxNiwxOCArMjg0MywxNyBAQAogICovCiBzdGF0aWMgdm9pZAogYmZhX2ZjcG9ydF9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKLQkJc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKKwkJc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQogewogCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKGJmYSk7CiAJc3RydWN0IGJmYV9wb3J0X2NmZ19zICpwb3J0X2NmZyA9ICZmY3BvcnQtPmNmZzsKIAlzdHJ1Y3QgYmZhX2ZjcG9ydF9sbl9zICpsbiA9ICZmY3BvcnQtPmxuOwogCXN0cnVjdCB0aW1ldmFsIHR2OwogCi0JbWVtc2V0KGZjcG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfZmNwb3J0X3MpKTsKIAlmY3BvcnQtPmJmYSA9IGJmYTsKIAlsbi0+ZmNwb3J0ID0gZmNwb3J0OwogCi0JYmZhX2ZjcG9ydF9tZW1fY2xhaW0oZmNwb3J0LCBtZW1pbmZvKTsKKwliZmFfZmNwb3J0X21lbV9jbGFpbShmY3BvcnQpOwogCiAJYmZhX3NtX3NldF9zdGF0ZShmY3BvcnQsIGJmYV9mY3BvcnRfc21fdW5pbml0KTsKIAliZmFfc21fc2V0X3N0YXRlKGxuLCBiZmFfZmNwb3J0X2xuX3NtX2RuKTsKQEAgLTI5MjEsNiArMjk0Nyw3IEBACiB7CiAJZmNwb3J0LT5zcGVlZCA9IEJGQV9QT1JUX1NQRUVEX1VOS05PV047CiAJZmNwb3J0LT50b3BvbG9neSA9IEJGQV9QT1JUX1RPUE9MT0dZX05PTkU7CisJZmNwb3J0LT5iYnNjX29wX3N0YXRlID0gQkZBX0ZBTFNFOwogfQogCiAvKgpAQCAtMjk0OCw3ICsyOTc1LDcgQEAKIAl9CiAKIAliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0ZDUE9SVCwgQkZJX0ZDUE9SVF9IMklfRU5BQkxFX1JFUSwKLQkJCWJmYV9scHVpZChmY3BvcnQtPmJmYSkpOworCQkJYmZhX2ZuX2xwdShmY3BvcnQtPmJmYSkpOwogCW0tPm53d24gPSBmY3BvcnQtPm53d247CiAJbS0+cHd3biA9IGZjcG9ydC0+cHd3bjsKIAltLT5wb3J0X2NmZyA9IGZjcG9ydC0+Y2ZnOwpAQCAtMjk2Miw3ICsyOTg5LDcgQEAKIAkvKgogCSAqIHF1ZXVlIEkvTyBtZXNzYWdlIHRvIGZpcm13YXJlCiAJICovCi0JYmZhX3JlcXFfcHJvZHVjZShmY3BvcnQtPmJmYSwgQkZBX1JFUVFfUE9SVCk7CisJYmZhX3JlcXFfcHJvZHVjZShmY3BvcnQtPmJmYSwgQkZBX1JFUVFfUE9SVCwgbS0+bWgpOwogCXJldHVybiBCRkFfVFJVRTsKIH0KIApAQCAtMjk5MSwxMyArMzAxOCwxMyBAQAogCX0KIAogCWJmaV9oMmlfc2V0KG0tPm1oLCBCRklfTUNfRkNQT1JULCBCRklfRkNQT1JUX0gySV9ESVNBQkxFX1JFUSwKLQkJCWJmYV9scHVpZChmY3BvcnQtPmJmYSkpOworCQkJYmZhX2ZuX2xwdShmY3BvcnQtPmJmYSkpOwogCW0tPm1zZ3RhZyA9IGZjcG9ydC0+bXNndGFnOwogCiAJLyoKIAkgKiBxdWV1ZSBJL08gbWVzc2FnZSB0byBmaXJtd2FyZQogCSAqLwotCWJmYV9yZXFxX3Byb2R1Y2UoZmNwb3J0LT5iZmEsIEJGQV9SRVFRX1BPUlQpOworCWJmYV9yZXFxX3Byb2R1Y2UoZmNwb3J0LT5iZmEsIEJGQV9SRVFRX1BPUlQsIG0tPm1oKTsKIAogCXJldHVybiBCRkFfVFJVRTsKIH0KQEAgLTMwMjksMTMgKzMwNTYsMTQgQEAKIAl9CiAKIAliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX0ZDUE9SVCwgQkZJX0ZDUE9SVF9IMklfU0VUX1NWQ19QQVJBTVNfUkVRLAotCQkJYmZhX2xwdWlkKGZjcG9ydC0+YmZhKSk7CisJCQliZmFfZm5fbHB1KGZjcG9ydC0+YmZhKSk7CiAJbS0+dHhfYmJjcmVkaXQgPSBjcHVfdG9fYmUxNigodTE2KWZjcG9ydC0+Y2ZnLnR4X2JiY3JlZGl0KTsKKwltLT5iYl9zY24gPSBmY3BvcnQtPmNmZy5iYl9zY247CiAKIAkvKgogCSAqIHF1ZXVlIEkvTyBtZXNzYWdlIHRvIGZpcm13YXJlCiAJICovCi0JYmZhX3JlcXFfcHJvZHVjZShmY3BvcnQtPmJmYSwgQkZBX1JFUVFfUE9SVCk7CisJYmZhX3JlcXFfcHJvZHVjZShmY3BvcnQtPmJmYSwgQkZBX1JFUVFfUE9SVCwgbS0+bWgpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzEzOSw4ICszMTY3LDggQEAKIAogCW1lbXNldChtc2csIDAsIHNpemVvZihzdHJ1Y3QgYmZpX2ZjcG9ydF9yZXFfcykpOwogCWJmaV9oMmlfc2V0KG1zZy0+bWgsIEJGSV9NQ19GQ1BPUlQsIEJGSV9GQ1BPUlRfSDJJX1NUQVRTX0dFVF9SRVEsCi0JCQliZmFfbHB1aWQoZmNwb3J0LT5iZmEpKTsKLQliZmFfcmVxcV9wcm9kdWNlKGZjcG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JUKTsKKwkJCWJmYV9mbl9scHUoZmNwb3J0LT5iZmEpKTsKKwliZmFfcmVxcV9wcm9kdWNlKGZjcG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JULCBtc2ctPm1oKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTMyMDEsOCArMzIyOSw4IEBACiAKIAltZW1zZXQobXNnLCAwLCBzaXplb2Yoc3RydWN0IGJmaV9mY3BvcnRfcmVxX3MpKTsKIAliZmlfaDJpX3NldChtc2ctPm1oLCBCRklfTUNfRkNQT1JULCBCRklfRkNQT1JUX0gySV9TVEFUU19DTEVBUl9SRVEsCi0JCQliZmFfbHB1aWQoZmNwb3J0LT5iZmEpKTsKLQliZmFfcmVxcV9wcm9kdWNlKGZjcG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JUKTsKKwkJCWJmYV9mbl9scHUoZmNwb3J0LT5iZmEpKTsKKwliZmFfcmVxcV9wcm9kdWNlKGZjcG9ydC0+YmZhLCBCRkFfUkVRUV9QT1JULCBtc2ctPm1oKTsKIH0KIAogLyoKQEAgLTMzMjksNiArMzM1Nyw5IEBACiAJZmNwb3J0LT5jZmcucnhfYmJjcmVkaXQgPSBiZmFfaW9jX3J4X2JiY3JlZGl0KCZiZmEtPmlvYyk7CiAJZmNwb3J0LT5zcGVlZF9zdXAgPSBiZmFfaW9jX3NwZWVkX3N1cCgmYmZhLT5pb2MpOwogCisJaWYgKGJmYV9mY3BvcnRfaXNfcGJjZGlzYWJsZWQoYmZhKSkKKwkJYmZhLT5tb2R1bGVzLnBvcnQucGJjX2Rpc2FibGVkID0gQkZBX1RSVUU7CisKIAlXQVJOX09OKCFmY3BvcnQtPmNmZy5tYXhmcnNpemUpOwogCVdBUk5fT04oIWZjcG9ydC0+Y2ZnLnJ4X2JiY3JlZGl0KTsKIAlXQVJOX09OKCFmY3BvcnQtPnNwZWVkX3N1cCk7CkBAIC0zNDUzLDYgKzM0ODQsOSBAQAogewogCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKGJmYSk7CiAKKwlpZiAoYmZhX2ZjcG9ydF9pc19wYmNkaXNhYmxlZChiZmEpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19QQkM7CisKIAlpZiAoYmZhX2lvY19pc19kaXNhYmxlZCgmYmZhLT5pb2MpKQogCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfRElTQUJMRUQ7CiAKQEAgLTM0NjYsNiArMzUwMCw4IEBACiBiZmFfc3RhdHVzX3QKIGJmYV9mY3BvcnRfZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKKwlpZiAoYmZhX2ZjcG9ydF9pc19wYmNkaXNhYmxlZChiZmEpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19QQkM7CiAKIAlpZiAoYmZhX2lvY19pc19kaXNhYmxlZCgmYmZhLT5pb2MpKQogCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfRElTQUJMRUQ7CkBAIC0zNDc0LDYgKzM1MTAsMjEgQEAKIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKIH0KIAorLyogSWYgUEJDIGlzIGRpc2FibGVkIG9uIHBvcnQsIHJldHVybiBlcnJvciAqLworYmZhX3N0YXR1c190CitiZmFfZmNwb3J0X2lzX3BiY2Rpc2FibGVkKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKGJmYSk7CisJc3RydWN0IGJmYV9pb2NmY19zICppb2NmYyA9ICZiZmEtPmlvY2ZjOworCXN0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MgKmNmZ3JzcCA9IGlvY2ZjLT5jZmdyc3A7CisKKwlpZiAoY2ZncnNwLT5wYmNfY2ZnLnBvcnRfZW5hYmxlZCA9PSBCRklfUEJDX1BPUlRfRElTQUJMRUQpIHsKKwkJYmZhX3RyYyhiZmEsIGZjcG9ydC0+cHd3bik7CisJCXJldHVybiBCRkFfU1RBVFVTX1BCQzsKKwl9CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKIC8qCiAgKiBDb25maWd1cmUgcG9ydCBzcGVlZC4KICAqLwpAQCAtMzQ5MSw2ICszNTQyLDI4IEBACiAJCXJldHVybiBCRkFfU1RBVFVTX1VOU1VQUF9TUEVFRDsKIAl9CiAKKwkvKiBGb3IgTWV6eiBjYXJkLCBwb3J0IHNwZWVkIGVudGVyZWQgbmVlZHMgdG8gYmUgY2hlY2tlZCAqLworCWlmIChiZmFfbWZnX2lzX21lenooZmNwb3J0LT5iZmEtPmlvYy5hdHRyLT5jYXJkX3R5cGUpKSB7CisJCWlmIChiZmFfaW9jX2dldF90eXBlKCZmY3BvcnQtPmJmYS0+aW9jKSA9PSBCRkFfSU9DX1RZUEVfRkMpIHsKKwkJCS8qIEZvciBDVDIsIDFHIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwkJCWlmICgoc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfMUdCUFMpICYmCisJCQkgICAgKGJmYV9hc2ljX2lkX2N0MihiZmEtPmlvYy5wY2lkZXYuZGV2aWNlX2lkKSkpCisJCQkJcmV0dXJuIEJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEOworCisJCQkvKiBBbHJlYWR5IGNoZWNrZWQgZm9yIEF1dG8gU3BlZWQgYW5kIE1heCBTcGVlZCBzdXBwICovCisJCQlpZiAoIShzcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF8xR0JQUyB8fAorCQkJICAgICAgc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfMkdCUFMgfHwKKwkJCSAgICAgIHNwZWVkID09IEJGQV9QT1JUX1NQRUVEXzRHQlBTIHx8CisJCQkgICAgICBzcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF84R0JQUyB8fAorCQkJICAgICAgc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfMTZHQlBTIHx8CisJCQkgICAgICBzcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF9BVVRPKSkKKwkJCQlyZXR1cm4gQkZBX1NUQVRVU19VTlNVUFBfU1BFRUQ7CisJCX0gZWxzZSB7CisJCQlpZiAoc3BlZWQgIT0gQkZBX1BPUlRfU1BFRURfMTBHQlBTKQorCQkJCXJldHVybiBCRkFfU1RBVFVTX1VOU1VQUF9TUEVFRDsKKwkJfQorCX0KKwogCWZjcG9ydC0+Y2ZnLnNwZWVkID0gc3BlZWQ7CiAKIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKQEAgLTM2MjQsMTEgKzM2OTcsMTQgQEAKIH0KIAogdm9pZAotYmZhX2ZjcG9ydF9zZXRfdHhfYmJjcmVkaXQoc3RydWN0IGJmYV9zICpiZmEsIHUxNiB0eF9iYmNyZWRpdCkKK2JmYV9mY3BvcnRfc2V0X3R4X2JiY3JlZGl0KHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgdHhfYmJjcmVkaXQsIHU4IGJiX3NjbikKIHsKIAlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRChiZmEpOwogCiAJZmNwb3J0LT5jZmcudHhfYmJjcmVkaXQgPSAodTgpdHhfYmJjcmVkaXQ7CisJZmNwb3J0LT5jZmcuYmJfc2NuID0gYmJfc2NuOworCWlmIChiYl9zY24pCisJCWZjcG9ydC0+YmJzY19vcF9zdGF0ZSA9IEJGQV9UUlVFOwogCWJmYV9mY3BvcnRfc2VuZF90eGNyZWRpdChmY3BvcnQpOwogfQogCkBAIC0zNjc1LDE2ICszNzUxLDIzIEBACiAJLyogYmVhY29uIGF0dHJpYnV0ZXMgKi8KIAlhdHRyLT5iZWFjb24gPSBmY3BvcnQtPmJlYWNvbjsKIAlhdHRyLT5saW5rX2UyZV9iZWFjb24gPSBmY3BvcnQtPmxpbmtfZTJlX2JlYWNvbjsKLQlhdHRyLT5wbG9nX2VuYWJsZWQgPSAoYmZhX2Jvb2xlYW5fdClmY3BvcnQtPmJmYS0+cGxvZy0+cGxvZ19lbmFibGVkOwotCWF0dHItPmlvX3Byb2ZpbGUgPSBiZmFfZmNwaW1fZ2V0X2lvX3Byb2ZpbGUoZmNwb3J0LT5iZmEpOwogCiAJYXR0ci0+cHBvcnRfY2ZnLnBhdGhfdG92ICA9IGJmYV9mY3BpbV9wYXRoX3Rvdl9nZXQoYmZhKTsKIAlhdHRyLT5wcG9ydF9jZmcucV9kZXB0aCAgPSBiZmFfZmNwaW1fcWRlcHRoX2dldChiZmEpOwogCWF0dHItPnBvcnRfc3RhdGUgPSBiZmFfc21fdG9fc3RhdGUoaGFsX3BvcnRfc21fdGFibGUsIGZjcG9ydC0+c20pOwotCWlmIChiZmFfaW9jX2lzX2Rpc2FibGVkKCZmY3BvcnQtPmJmYS0+aW9jKSkKLQkJYXR0ci0+cG9ydF9zdGF0ZSA9IEJGQV9QT1JUX1NUX0lPQ0RJUzsKLQllbHNlIGlmIChiZmFfaW9jX2Z3X21pc21hdGNoKCZmY3BvcnQtPmJmYS0+aW9jKSkKLQkJYXR0ci0+cG9ydF9zdGF0ZSA9IEJGQV9QT1JUX1NUX0ZXTUlTTUFUQ0g7CisJYXR0ci0+YmJzY19vcF9zdGF0dXMgPSAgZmNwb3J0LT5iYnNjX29wX3N0YXRlOworCisJLyogUEJDIERpc2FibGVkIFN0YXRlICovCisJaWYgKGJmYV9mY3BvcnRfaXNfcGJjZGlzYWJsZWQoYmZhKSkKKwkJYXR0ci0+cG9ydF9zdGF0ZSA9IEJGQV9QT1JUX1NUX1BSRUJPT1RfRElTQUJMRUQ7CisJZWxzZSB7CisJCWlmIChiZmFfaW9jX2lzX2Rpc2FibGVkKCZmY3BvcnQtPmJmYS0+aW9jKSkKKwkJCWF0dHItPnBvcnRfc3RhdGUgPSBCRkFfUE9SVF9TVF9JT0NESVM7CisJCWVsc2UgaWYgKGJmYV9pb2NfZndfbWlzbWF0Y2goJmZjcG9ydC0+YmZhLT5pb2MpKQorCQkJYXR0ci0+cG9ydF9zdGF0ZSA9IEJGQV9QT1JUX1NUX0ZXTUlTTUFUQ0g7CisJCWVsc2UgaWYgKGJmYV9pb2NfaXNfYWNxX2FkZHIoJmZjcG9ydC0+YmZhLT5pb2MpKQorCQkJYXR0ci0+cG9ydF9zdGF0ZSA9IEJGQV9QT1JUX1NUX0FDUV9BRERSOworCX0KIAogCS8qIEZDb0UgdmxhbiAqLwogCWF0dHItPmZjb2VfdmxhbiA9IGZjcG9ydC0+ZmNvZV92bGFuOwpAQCAtMzc2Niw2ICszODQ5LDE4IEBACiB9CiAKIC8qCisgKglFbmFibGUvRGlzYWJsZSBGQUEgZmVhdHVyZSBpbiBwb3J0IGNvbmZpZworICovCit2b2lkCitiZmFfZmNwb3J0X2NmZ19mYWEoc3RydWN0IGJmYV9zICpiZmEsIHU4IHN0YXRlKQoreworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKGJmYSk7CisKKwliZmFfdHJjKGJmYSwgc3RhdGUpOworCWZjcG9ydC0+Y2ZnLmZhYV9zdGF0ZSA9IHN0YXRlOworfQorCisvKgogICogR2V0IGRlZmF1bHQgbWluaW11bSByYXRlbGltIHNwZWVkCiAgKi8KIGVudW0gYmZhX3BvcnRfc3BlZWQKQEAgLTM3NzgsNiArMzg3MywyMiBAQAogCiB9CiAKK3ZvaWQKK2JmYV9mY3BvcnRfYmVhY29uKHZvaWQgKmRldiwgYmZhX2Jvb2xlYW5fdCBiZWFjb24sCisJCSAgYmZhX2Jvb2xlYW5fdCBsaW5rX2UyZV9iZWFjb24pCit7CisJc3RydWN0IGJmYV9zICpiZmEgPSBkZXY7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoYmZhKTsKKworCWJmYV90cmMoYmZhLCBiZWFjb24pOworCWJmYV90cmMoYmZhLCBsaW5rX2UyZV9iZWFjb24pOworCWJmYV90cmMoYmZhLCBmY3BvcnQtPmJlYWNvbik7CisJYmZhX3RyYyhiZmEsIGZjcG9ydC0+bGlua19lMmVfYmVhY29uKTsKKworCWZjcG9ydC0+YmVhY29uID0gYmVhY29uOworCWZjcG9ydC0+bGlua19lMmVfYmVhY29uID0gbGlua19lMmVfYmVhY29uOworfQorCiBiZmFfYm9vbGVhbl90CiBiZmFfZmNwb3J0X2lzX2xpbmt1cChzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKQEAgLTM3OTcsNiArMzkwOCwxNCBAQAogCXJldHVybiBmY3BvcnQtPmNmZy5xb3NfZW5hYmxlZDsKIH0KIAorYmZhX2Jvb2xlYW5fdAorYmZhX2ZjcG9ydF9pc190cnVua19lbmFibGVkKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKGJmYSk7CisKKwlyZXR1cm4gZmNwb3J0LT5jZmcudHJ1bmtlZDsKK30KKwogLyoKICAqIFJwb3J0IFN0YXRlIG1hY2hpbmUgZnVuY3Rpb25zCiAgKi8KQEAgLTQyODYsMTggKzQ0MDUsMjIgQEAKIH0KIAogc3RhdGljIHZvaWQKLWJmYV9ycG9ydF9tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgdTMyICprbV9sZW4sCi0JCXUzMiAqZG1fbGVuKQorYmZhX3Jwb3J0X21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWluZm8sCisJCXN0cnVjdCBiZmFfcyAqYmZhKQogeworCXN0cnVjdCBiZmFfbWVtX2t2YV9zICpycG9ydF9rdmEgPSBCRkFfTUVNX1JQT1JUX0tWQShiZmEpOworCiAJaWYgKGNmZy0+ZndjZmcubnVtX3Jwb3J0cyA8IEJGQV9SUE9SVF9NSU4pCiAJCWNmZy0+ZndjZmcubnVtX3Jwb3J0cyA9IEJGQV9SUE9SVF9NSU47CiAKLQkqa21fbGVuICs9IGNmZy0+ZndjZmcubnVtX3Jwb3J0cyAqIHNpemVvZihzdHJ1Y3QgYmZhX3Jwb3J0X3MpOworCS8qIGt2YSBtZW1vcnkgKi8KKwliZmFfbWVtX2t2YV9zZXR1cChtaW5mbywgcnBvcnRfa3ZhLAorCQljZmctPmZ3Y2ZnLm51bV9ycG9ydHMgKiBzaXplb2Yoc3RydWN0IGJmYV9ycG9ydF9zKSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBiZmFfcnBvcnRfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCi0JCSAgICAgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKKwkJc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQogewogCXN0cnVjdCBiZmFfcnBvcnRfbW9kX3MgKm1vZCA9IEJGQV9SUE9SVF9NT0QoYmZhKTsKIAlzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwOwpAQCAtNDMwNSw4ICs0NDI4LDkgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZtb2QtPnJwX2ZyZWVfcSk7CiAJSU5JVF9MSVNUX0hFQUQoJm1vZC0+cnBfYWN0aXZlX3EpOworCUlOSVRfTElTVF9IRUFEKCZtb2QtPnJwX3VudXNlZF9xKTsKIAotCXJwID0gKHN0cnVjdCBiZmFfcnBvcnRfcyAqKSBiZmFfbWVtaW5mb19rdmEobWVtaW5mbyk7CisJcnAgPSAoc3RydWN0IGJmYV9ycG9ydF9zICopIGJmYV9tZW1fa3ZhX2N1cnAobW9kKTsKIAltb2QtPnJwc19saXN0ID0gcnA7CiAJbW9kLT5udW1fcnBvcnRzID0gY2ZnLT5md2NmZy5udW1fcnBvcnRzOwogCkBAIC00MzMxLDcgKzQ0NTUsNyBAQAogCS8qCiAJICogY29uc3VtZSBtZW1vcnkKIAkgKi8KLQliZmFfbWVtaW5mb19rdmEobWVtaW5mbykgPSAodTggKikgcnA7CisJYmZhX21lbV9rdmFfY3VycChtb2QpID0gKHU4ICopIHJwOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNDM1Niw2ICs0NDgwLDkgQEAKIAlzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwb3J0OwogCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOwogCisJLyogRW5xdWV1ZSB1bnVzZWQgcnBvcnQgcmVzb3VyY2VzIHRvIGZyZWVfcSAqLworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbW9kLT5ycF91bnVzZWRfcSwgJm1vZC0+cnBfZnJlZV9xKTsKKwogCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmbW9kLT5ycF9hY3RpdmVfcSkgewogCQlycG9ydCA9IChzdHJ1Y3QgYmZhX3Jwb3J0X3MgKikgcWU7CiAJCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBCRkFfUlBPUlRfU01fSFdGQUlMKTsKQEAgLTQzOTksMTEgKzQ1MjYsMTEgQEAKIAl9CiAKIAliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX1JQT1JULCBCRklfUlBPUlRfSDJJX0NSRUFURV9SRVEsCi0JCQliZmFfbHB1aWQocnAtPmJmYSkpOworCQkJYmZhX2ZuX2xwdShycC0+YmZhKSk7CiAJbS0+YmZhX2hhbmRsZSA9IHJwLT5ycG9ydF90YWc7CiAJbS0+bWF4X2ZybXN6ID0gY3B1X3RvX2JlMTYocnAtPnJwb3J0X2luZm8ubWF4X2ZybXN6KTsKIAltLT5waWQgPSBycC0+cnBvcnRfaW5mby5waWQ7Ci0JbS0+bHBfdGFnID0gcnAtPnJwb3J0X2luZm8ubHBfdGFnOworCW0tPmxwX2Z3dGFnID0gYmZhX2xwc19nZXRfZnd0YWcocnAtPmJmYSwgKHU4KXJwLT5ycG9ydF9pbmZvLmxwX3RhZyk7CiAJbS0+bG9jYWxfcGlkID0gcnAtPnJwb3J0X2luZm8ubG9jYWxfcGlkOwogCW0tPmZjX2NsYXNzID0gcnAtPnJwb3J0X2luZm8uZmNfY2xhc3M7CiAJbS0+dmZfZW4gPSBycC0+cnBvcnRfaW5mby52Zl9lbjsKQEAgLTQ0MTMsNyArNDU0MCw3IEBACiAJLyoKIAkgKiBxdWV1ZSBJL08gbWVzc2FnZSB0byBmaXJtd2FyZQogCSAqLwotCWJmYV9yZXFxX3Byb2R1Y2UocnAtPmJmYSwgQkZBX1JFUVFfUlBPUlQpOworCWJmYV9yZXFxX3Byb2R1Y2UocnAtPmJmYSwgQkZBX1JFUVFfUlBPUlQsIG0tPm1oKTsKIAlyZXR1cm4gQkZBX1RSVUU7CiB9CiAKQEAgLTQ0MzIsMTMgKzQ1NTksMTMgQEAKIAl9CiAKIAliZmlfaDJpX3NldChtLT5taCwgQkZJX01DX1JQT1JULCBCRklfUlBPUlRfSDJJX0RFTEVURV9SRVEsCi0JCQliZmFfbHB1aWQocnAtPmJmYSkpOworCQkJYmZhX2ZuX2xwdShycC0+YmZhKSk7CiAJbS0+ZndfaGFuZGxlID0gcnAtPmZ3X2hhbmRsZTsKIAogCS8qCiAJICogcXVldWUgSS9PIG1lc3NhZ2UgdG8gZmlybXdhcmUKIAkgKi8KLQliZmFfcmVxcV9wcm9kdWNlKHJwLT5iZmEsIEJGQV9SRVFRX1JQT1JUKTsKKwliZmFfcmVxcV9wcm9kdWNlKHJwLT5iZmEsIEJGQV9SRVFRX1JQT1JULCBtLT5taCk7CiAJcmV0dXJuIEJGQV9UUlVFOwogfQogCkBAIC00NDU3LDE0ICs0NTg0LDE0IEBACiAJfQogCiAJYmZpX2gyaV9zZXQobS0+bWgsIEJGSV9NQ19SUE9SVCwgQkZJX1JQT1JUX0gySV9TRVRfU1BFRURfUkVRLAotCQkJYmZhX2xwdWlkKHJwLT5iZmEpKTsKKwkJCWJmYV9mbl9scHUocnAtPmJmYSkpOwogCW0tPmZ3X2hhbmRsZSA9IHJwLT5md19oYW5kbGU7CiAJbS0+c3BlZWQgPSAodTgpcnAtPnJwb3J0X2luZm8uc3BlZWQ7CiAKIAkvKgogCSAqIHF1ZXVlIEkvTyBtZXNzYWdlIHRvIGZpcm13YXJlCiAJICovCi0JYmZhX3JlcXFfcHJvZHVjZShycC0+YmZhLCBCRkFfUkVRUV9SUE9SVCk7CisJYmZhX3JlcXFfcHJvZHVjZShycC0+YmZhLCBCRkFfUkVRUV9SUE9SVCwgbS0+bWgpOwogCXJldHVybiBCRkFfVFJVRTsKIH0KIApAQCAtNDUxNCw3ICs0NjQxLDE4IEBACiAJfQogfQogCit2b2lkCitiZmFfcnBvcnRfcmVzX3JlY2ZnKHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgbnVtX3Jwb3J0X2Z3KQoreworCXN0cnVjdCBiZmFfcnBvcnRfbW9kX3MJKm1vZCA9IEJGQV9SUE9SVF9NT0QoYmZhKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpxZTsKKwlpbnQJaTsKIAorCWZvciAoaSA9IDA7IGkgPCAobW9kLT5udW1fcnBvcnRzIC0gbnVtX3Jwb3J0X2Z3KTsgaSsrKSB7CisJCWJmYV9xX2RlcV90YWlsKCZtb2QtPnJwX2ZyZWVfcSwgJnFlKTsKKwkJbGlzdF9hZGRfdGFpbChxZSwgJm1vZC0+cnBfdW51c2VkX3EpOworCX0KK30KIAogLyoKICAqICBiZmFfcnBvcnRfYXBpCkBAIC00NTc3LDI2ICs0NzE1LDUxIEBACiAgKiBDb21wdXRlIGFuZCByZXR1cm4gbWVtb3J5IG5lZWRlZCBieSBGQ1AoaW0pIG1vZHVsZS4KICAqLwogc3RhdGljIHZvaWQKLWJmYV9zZ3BnX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCB1MzIgKmttX2xlbiwKLQkJdTMyICpkbV9sZW4pCitiZmFfc2dwZ19tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pbmZvLAorCQlzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKKwlzdHJ1Y3QgYmZhX3NncGdfbW9kX3MgKnNncGdfbW9kID0gQkZBX1NHUEdfTU9EKGJmYSk7CisJc3RydWN0IGJmYV9tZW1fa3ZhX3MgKnNncGdfa3ZhID0gQkZBX01FTV9TR1BHX0tWQShiZmEpOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zICpzZWdfcHRyOworCXUxNgluc2VncywgaWR4LCBwZXJfc2VnX3NncGcsIG51bV9zZ3BnOworCXUzMglzZ3BnX3N6ID0gc2l6ZW9mKHN0cnVjdCBiZmlfc2dwZ19zKTsKKwogCWlmIChjZmctPmRydmNmZy5udW1fc2dwZ3MgPCBCRkFfU0dQR19NSU4pCiAJCWNmZy0+ZHJ2Y2ZnLm51bV9zZ3BncyA9IEJGQV9TR1BHX01JTjsKKwllbHNlIGlmIChjZmctPmRydmNmZy5udW1fc2dwZ3MgPiBCRkFfU0dQR19NQVgpCisJCWNmZy0+ZHJ2Y2ZnLm51bV9zZ3BncyA9IEJGQV9TR1BHX01BWDsKIAotCSprbV9sZW4gKz0gKGNmZy0+ZHJ2Y2ZnLm51bV9zZ3BncyArIDEpICogc2l6ZW9mKHN0cnVjdCBiZmFfc2dwZ19zKTsKLQkqZG1fbGVuICs9IChjZmctPmRydmNmZy5udW1fc2dwZ3MgKyAxKSAqIHNpemVvZihzdHJ1Y3QgYmZpX3NncGdfcyk7CisJbnVtX3NncGcgPSBjZmctPmRydmNmZy5udW1fc2dwZ3M7CisKKwluc2VncyA9IEJGSV9NRU1fRE1BX05TRUdTKG51bV9zZ3BnLCBzZ3BnX3N6KTsKKwlwZXJfc2VnX3NncGcgPSBCRklfTUVNX05SRVFTX1NFRyhzZ3BnX3N6KTsKKworCWJmYV9tZW1fZG1hX3NlZ19pdGVyKHNncGdfbW9kLCBzZWdfcHRyLCBuc2VncywgaWR4KSB7CisJCWlmIChudW1fc2dwZyA+PSBwZXJfc2VnX3NncGcpIHsKKwkJCW51bV9zZ3BnIC09IHBlcl9zZWdfc2dwZzsKKwkJCWJmYV9tZW1fZG1hX3NldHVwKG1pbmZvLCBzZWdfcHRyLAorCQkJCQlwZXJfc2VnX3NncGcgKiBzZ3BnX3N6KTsKKwkJfSBlbHNlCisJCQliZmFfbWVtX2RtYV9zZXR1cChtaW5mbywgc2VnX3B0ciwKKwkJCQkJbnVtX3NncGcgKiBzZ3BnX3N6KTsKKwl9CisKKwkvKiBrdmEgbWVtb3J5ICovCisJYmZhX21lbV9rdmFfc2V0dXAobWluZm8sIHNncGdfa3ZhLAorCQljZmctPmRydmNmZy5udW1fc2dwZ3MgKiBzaXplb2Yoc3RydWN0IGJmYV9zZ3BnX3MpKTsKIH0KIAotCiBzdGF0aWMgdm9pZAogYmZhX3NncGdfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCi0JCSAgICBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWluZm8sIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKKwkJc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQogewogCXN0cnVjdCBiZmFfc2dwZ19tb2RfcyAqbW9kID0gQkZBX1NHUEdfTU9EKGJmYSk7Ci0JaW50IGk7CiAJc3RydWN0IGJmYV9zZ3BnX3MgKmhzZ3BnOwogCXN0cnVjdCBiZmlfc2dwZ19zICpzZ3BnOwogCXU2NCBhbGlnbl9sZW47CisJc3RydWN0IGJmYV9tZW1fZG1hX3MgKnNlZ19wdHI7CisJdTMyCXNncGdfc3ogPSBzaXplb2Yoc3RydWN0IGJmaV9zZ3BnX3MpOworCXUxNglpLCBpZHgsIG5zZWdzLCBwZXJfc2VnX3NncGcsIG51bV9zZ3BnOwogCiAJdW5pb24gewogCQl1NjQgcGE7CkBAIC00NjA4LDM5ICs0NzcxLDQ1IEBACiAKIAliZmFfdHJjKGJmYSwgY2ZnLT5kcnZjZmcubnVtX3NncGdzKTsKIAotCW1vZC0+bnVtX3NncGdzID0gY2ZnLT5kcnZjZmcubnVtX3NncGdzOwotCW1vZC0+c2dwZ19hcnJfcGEgPSBiZmFfbWVtaW5mb19kbWFfcGh5cyhtaW5mbyk7Ci0JYWxpZ25fbGVuID0gKEJGQV9TR1BHX1JPVU5EVVAobW9kLT5zZ3BnX2Fycl9wYSkgLSBtb2QtPnNncGdfYXJyX3BhKTsKLQltb2QtPnNncGdfYXJyX3BhICs9IGFsaWduX2xlbjsKLQltb2QtPmhzZ3BnX2FyciA9IChzdHJ1Y3QgYmZhX3NncGdfcyAqKSAoYmZhX21lbWluZm9fa3ZhKG1pbmZvKSArCi0JCQkJCQlhbGlnbl9sZW4pOwotCW1vZC0+c2dwZ19hcnIgPSAoc3RydWN0IGJmaV9zZ3BnX3MgKikgKGJmYV9tZW1pbmZvX2RtYV92aXJ0KG1pbmZvKSArCi0JCQkJCQlhbGlnbl9sZW4pOworCW1vZC0+ZnJlZV9zZ3BncyA9IG1vZC0+bnVtX3NncGdzID0gY2ZnLT5kcnZjZmcubnVtX3NncGdzOwogCi0JaHNncGcgPSBtb2QtPmhzZ3BnX2FycjsKLQlzZ3BnID0gbW9kLT5zZ3BnX2FycjsKLQlzZ3BnX3BhLnBhID0gbW9kLT5zZ3BnX2Fycl9wYTsKLQltb2QtPmZyZWVfc2dwZ3MgPSBtb2QtPm51bV9zZ3BnczsKKwludW1fc2dwZyA9IGNmZy0+ZHJ2Y2ZnLm51bV9zZ3BnczsKKwluc2VncyA9IEJGSV9NRU1fRE1BX05TRUdTKG51bV9zZ3BnLCBzZ3BnX3N6KTsKIAotCVdBUk5fT04oc2dwZ19wYS5wYSAmIChzaXplb2Yoc3RydWN0IGJmaV9zZ3BnX3MpIC0gMSkpOworCS8qIGRtYS9rdmEgbWVtIGNsYWltICovCisJaHNncGcgPSAoc3RydWN0IGJmYV9zZ3BnX3MgKikgYmZhX21lbV9rdmFfY3VycChtb2QpOwogCi0JZm9yIChpID0gMDsgaSA8IG1vZC0+bnVtX3NncGdzOyBpKyspIHsKLQkJbWVtc2V0KGhzZ3BnLCAwLCBzaXplb2YoKmhzZ3BnKSk7Ci0JCW1lbXNldChzZ3BnLCAwLCBzaXplb2YoKnNncGcpKTsKKwliZmFfbWVtX2RtYV9zZWdfaXRlcihtb2QsIHNlZ19wdHIsIG5zZWdzLCBpZHgpIHsKIAotCQloc2dwZy0+c2dwZyA9IHNncGc7Ci0JCXNncGdfcGFfdG1wLnBhID0gYmZhX3NnYWRkcl9sZShzZ3BnX3BhLnBhKTsKLQkJaHNncGctPnNncGdfcGEgPSBzZ3BnX3BhX3RtcC5hZGRyOwotCQlsaXN0X2FkZF90YWlsKCZoc2dwZy0+cWUsICZtb2QtPnNncGdfcSk7CisJCWlmICghYmZhX21lbV9kbWFfdmlydChzZWdfcHRyKSkKKwkJCWJyZWFrOwogCi0JCWhzZ3BnKys7Ci0JCXNncGcrKzsKLQkJc2dwZ19wYS5wYSArPSBzaXplb2Yoc3RydWN0IGJmaV9zZ3BnX3MpOworCQlhbGlnbl9sZW4gPSBCRkFfU0dQR19ST1VORFVQKGJmYV9tZW1fZG1hX3BoeXMoc2VnX3B0cikpIC0KKwkJCQkJICAgICBiZmFfbWVtX2RtYV9waHlzKHNlZ19wdHIpOworCisJCXNncGcgPSAoc3RydWN0IGJmaV9zZ3BnX3MgKikKKwkJCSgoKHU4ICopIGJmYV9tZW1fZG1hX3ZpcnQoc2VnX3B0cikpICsgYWxpZ25fbGVuKTsKKwkJc2dwZ19wYS5wYSA9IGJmYV9tZW1fZG1hX3BoeXMoc2VnX3B0cikgKyBhbGlnbl9sZW47CisJCVdBUk5fT04oc2dwZ19wYS5wYSAmIChzZ3BnX3N6IC0gMSkpOworCisJCXBlcl9zZWdfc2dwZyA9IChzZWdfcHRyLT5tZW1fbGVuIC0gKHUzMilhbGlnbl9sZW4pIC8gc2dwZ19zejsKKworCQlmb3IgKGkgPSAwOyBudW1fc2dwZyA+IDAgJiYgaSA8IHBlcl9zZWdfc2dwZzsgaSsrLCBudW1fc2dwZy0tKSB7CisJCQltZW1zZXQoaHNncGcsIDAsIHNpemVvZigqaHNncGcpKTsKKwkJCW1lbXNldChzZ3BnLCAwLCBzaXplb2YoKnNncGcpKTsKKworCQkJaHNncGctPnNncGcgPSBzZ3BnOworCQkJc2dwZ19wYV90bXAucGEgPSBiZmFfc2dhZGRyX2xlKHNncGdfcGEucGEpOworCQkJaHNncGctPnNncGdfcGEgPSBzZ3BnX3BhX3RtcC5hZGRyOworCQkJbGlzdF9hZGRfdGFpbCgmaHNncGctPnFlLCAmbW9kLT5zZ3BnX3EpOworCisJCQlzZ3BnKys7CisJCQloc2dwZysrOworCQkJc2dwZ19wYS5wYSArPSBzZ3BnX3N6OworCQl9CiAJfQogCi0JYmZhX21lbWluZm9fa3ZhKG1pbmZvKSA9ICh1OCAqKSBoc2dwZzsKLQliZmFfbWVtaW5mb19kbWFfdmlydChtaW5mbykgPSAodTggKikgc2dwZzsKLQliZmFfbWVtaW5mb19kbWFfcGh5cyhtaW5mbykgPSBzZ3BnX3BhLnBhOworCWJmYV9tZW1fa3ZhX2N1cnAobW9kKSA9ICh1OCAqKSBoc2dwZzsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTQ3ODIsMzEgKzQ5NTEsMTMgQEAKIH0KIAogc3RhdGljIHZvaWQKLWNsYWltX3VmX3BicyhzdHJ1Y3QgYmZhX3VmX21vZF9zICp1Zm0sIHN0cnVjdCBiZmFfbWVtaW5mb19zICptaSkKLXsKLQl1MzIgdWZfcGJfdG90X3N6OwotCi0JdWZtLT51Zl9wYnNfa3ZhID0gKHN0cnVjdCBiZmFfdWZfYnVmX3MgKikgYmZhX21lbWluZm9fZG1hX3ZpcnQobWkpOwotCXVmbS0+dWZfcGJzX3BhID0gYmZhX21lbWluZm9fZG1hX3BoeXMobWkpOwotCXVmX3BiX3RvdF9zeiA9IEJGQV9ST1VORFVQKChzaXplb2Yoc3RydWN0IGJmYV91Zl9idWZfcykgKiB1Zm0tPm51bV91ZnMpLAotCQkJCQkJCUJGQV9ETUFfQUxJR05fU1opOwotCi0JYmZhX21lbWluZm9fZG1hX3ZpcnQobWkpICs9IHVmX3BiX3RvdF9zejsKLQliZmFfbWVtaW5mb19kbWFfcGh5cyhtaSkgKz0gdWZfcGJfdG90X3N6OwotCi0JbWVtc2V0KCh2b2lkICopdWZtLT51Zl9wYnNfa3ZhLCAwLCB1Zl9wYl90b3Rfc3opOwotfQotCi1zdGF0aWMgdm9pZAotY2xhaW1fdWZfcG9zdF9tc2dzKHN0cnVjdCBiZmFfdWZfbW9kX3MgKnVmbSwgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pKQorY2xhaW1fdWZfcG9zdF9tc2dzKHN0cnVjdCBiZmFfdWZfbW9kX3MgKnVmbSkKIHsKIAlzdHJ1Y3QgYmZpX3VmX2J1Zl9wb3N0X3MgKnVmX2JwX21zZzsKLQlzdHJ1Y3QgYmZpX3NnZV9zICAgICAgKnNnZTsKLQl1bmlvbiBiZmlfYWRkcl91ICAgICAgc2dhX3plcm8gPSB7IHswfSB9OwogCXUxNiBpOwogCXUxNiBidWZfbGVuOwogCi0JdWZtLT51Zl9idWZfcG9zdHMgPSAoc3RydWN0IGJmaV91Zl9idWZfcG9zdF9zICopIGJmYV9tZW1pbmZvX2t2YShtaSk7CisJdWZtLT51Zl9idWZfcG9zdHMgPSAoc3RydWN0IGJmaV91Zl9idWZfcG9zdF9zICopIGJmYV9tZW1fa3ZhX2N1cnAodWZtKTsKIAl1Zl9icF9tc2cgPSB1Zm0tPnVmX2J1Zl9wb3N0czsKIAogCWZvciAoaSA9IDAsIHVmX2JwX21zZyA9IHVmbS0+dWZfYnVmX3Bvc3RzOyBpIDwgdWZtLT5udW1fdWZzOwpAQCAtNDgxNywyOCArNDk2OCwxOCBAQAogCQlidWZfbGVuID0gc2l6ZW9mKHN0cnVjdCBiZmFfdWZfYnVmX3MpOwogCQl1Zl9icF9tc2ctPmJ1Zl9sZW4gPSBjcHVfdG9fYmUxNihidWZfbGVuKTsKIAkJYmZpX2gyaV9zZXQodWZfYnBfbXNnLT5taCwgQkZJX01DX1VGLCBCRklfVUZfSDJJX0JVRl9QT1NULAotCQkJICAgIGJmYV9scHVpZCh1Zm0tPmJmYSkpOwotCi0JCXNnZSA9IHVmX2JwX21zZy0+c2dlOwotCQlzZ2VbMF0uc2dfbGVuID0gYnVmX2xlbjsKLQkJc2dlWzBdLmZsYWdzID0gQkZJX1NHRV9EQVRBX0xBU1Q7Ci0JCWJmYV9kbWFfYWRkcl9zZXQoc2dlWzBdLnNnYSwgdWZtX3Bic19wYSh1Zm0sIGkpKTsKLQkJYmZhX3NnZV90b19iZShzZ2UpOwotCi0JCXNnZVsxXS5zZ19sZW4gPSBidWZfbGVuOwotCQlzZ2VbMV0uZmxhZ3MgPSBCRklfU0dFX1BHRExFTjsKLQkJc2dlWzFdLnNnYSA9IHNnYV96ZXJvOwotCQliZmFfc2dlX3RvX2JlKCZzZ2VbMV0pOworCQkJICAgIGJmYV9mbl9scHUodWZtLT5iZmEpKTsKKwkJYmZhX2FsZW5fc2V0KCZ1Zl9icF9tc2ctPmFsZW4sIGJ1Zl9sZW4sIHVmbV9wYnNfcGEodWZtLCBpKSk7CiAJfQogCiAJLyoKIAkgKiBhZHZhbmNlIHBvaW50ZXIgYmV5b25kIGNvbnN1bWVkIG1lbW9yeQogCSAqLwotCWJmYV9tZW1pbmZvX2t2YShtaSkgPSAodTggKikgdWZfYnBfbXNnOworCWJmYV9tZW1fa3ZhX2N1cnAodWZtKSA9ICh1OCAqKSB1Zl9icF9tc2c7CiB9CiAKIHN0YXRpYyB2b2lkCi1jbGFpbV91ZnMoc3RydWN0IGJmYV91Zl9tb2RfcyAqdWZtLCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWkpCitjbGFpbV91ZnMoc3RydWN0IGJmYV91Zl9tb2RfcyAqdWZtKQogewogCXUxNiBpOwogCXN0cnVjdCBiZmFfdWZfcyAgICp1ZjsKQEAgLTQ4NDYsNyArNDk4Nyw3IEBACiAJLyoKIAkgKiBDbGFpbSBibG9jayBvZiBtZW1vcnkgZm9yIFVGIGxpc3QKIAkgKi8KLQl1Zm0tPnVmX2xpc3QgPSAoc3RydWN0IGJmYV91Zl9zICopIGJmYV9tZW1pbmZvX2t2YShtaSk7CisJdWZtLT51Zl9saXN0ID0gKHN0cnVjdCBiZmFfdWZfcyAqKSBiZmFfbWVtX2t2YV9jdXJwKHVmbSk7CiAKIAkvKgogCSAqIEluaXRpYWxpemUgVUZzIGFuZCBxdWV1ZSBpdCBpbiBVRiBmcmVlIHF1ZXVlCkBAIC00ODU1LDggKzQ5OTYsOCBAQAogCQltZW1zZXQodWYsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX3VmX3MpKTsKIAkJdWYtPmJmYSA9IHVmbS0+YmZhOwogCQl1Zi0+dWZfdGFnID0gaTsKLQkJdWYtPnBiX2xlbiA9IHNpemVvZihzdHJ1Y3QgYmZhX3VmX2J1Zl9zKTsKLQkJdWYtPmJ1Zl9rdmEgPSAodm9pZCAqKSZ1Zm0tPnVmX3Bic19rdmFbaV07CisJCXVmLT5wYl9sZW4gPSBCRkFfUEVSX1VGX0RNQV9TWjsKKwkJdWYtPmJ1Zl9rdmEgPSBiZmFfbWVtX2dldF9kbWFidWZfa3ZhKHVmbSwgaSwgQkZBX1BFUl9VRl9ETUFfU1opOwogCQl1Zi0+YnVmX3BhID0gdWZtX3Bic19wYSh1Zm0sIGkpOwogCQlsaXN0X2FkZF90YWlsKCZ1Zi0+cWUsICZ1Zm0tPnVmX2ZyZWVfcSk7CiAJfQpAQCAtNDg2NCw0OCArNTAwNSw1NyBAQAogCS8qCiAJICogYWR2YW5jZSBtZW1vcnkgcG9pbnRlcgogCSAqLwotCWJmYV9tZW1pbmZvX2t2YShtaSkgPSAodTggKikgdWY7CisJYmZhX21lbV9rdmFfY3VycCh1Zm0pID0gKHU4ICopIHVmOwogfQogCiBzdGF0aWMgdm9pZAotdWZfbWVtX2NsYWltKHN0cnVjdCBiZmFfdWZfbW9kX3MgKnVmbSwgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pKQordWZfbWVtX2NsYWltKHN0cnVjdCBiZmFfdWZfbW9kX3MgKnVmbSkKIHsKLQljbGFpbV91Zl9wYnModWZtLCBtaSk7Ci0JY2xhaW1fdWZzKHVmbSwgbWkpOwotCWNsYWltX3VmX3Bvc3RfbXNncyh1Zm0sIG1pKTsKKwljbGFpbV91ZnModWZtKTsKKwljbGFpbV91Zl9wb3N0X21zZ3ModWZtKTsKIH0KIAogc3RhdGljIHZvaWQKLWJmYV91Zl9tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgdTMyICpuZG1fbGVuLCB1MzIgKmRtX2xlbikKK2JmYV91Zl9tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1pbmZvLAorCQlzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKLQl1MzIgbnVtX3VmcyA9IGNmZy0+ZndjZmcubnVtX3VmX2J1ZnM7CisJc3RydWN0IGJmYV91Zl9tb2RfcyAqdWZtID0gQkZBX1VGX01PRChiZmEpOworCXN0cnVjdCBiZmFfbWVtX2t2YV9zICp1Zl9rdmEgPSBCRkFfTUVNX1VGX0tWQShiZmEpOworCXUzMgludW1fdWZzID0gY2ZnLT5md2NmZy5udW1fdWZfYnVmczsKKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcyAqc2VnX3B0cjsKKwl1MTYJbnNlZ3MsIGlkeCwgcGVyX3NlZ191ZiA9IDA7CiAKLQkvKgotCSAqIGRtYS1hYmxlIG1lbW9yeSBmb3IgVUYgcG9zdGVkIGJ1ZnMKLQkgKi8KLQkqZG1fbGVuICs9IEJGQV9ST1VORFVQKChzaXplb2Yoc3RydWN0IGJmYV91Zl9idWZfcykgKiBudW1fdWZzKSwKLQkJCQkJCQlCRkFfRE1BX0FMSUdOX1NaKTsKKwluc2VncyA9IEJGSV9NRU1fRE1BX05TRUdTKG51bV91ZnMsIEJGQV9QRVJfVUZfRE1BX1NaKTsKKwlwZXJfc2VnX3VmID0gQkZJX01FTV9OUkVRU19TRUcoQkZBX1BFUl9VRl9ETUFfU1opOwogCi0JLyoKLQkgKiBrZXJuZWwgVmlydHVhbCBtZW1vcnkgZm9yIFVGcyBhbmQgVUYgYnVmIHBvc3QgbXNnIGNvcGllcwotCSAqLwotCSpuZG1fbGVuICs9IHNpemVvZihzdHJ1Y3QgYmZhX3VmX3MpICogbnVtX3VmczsKLQkqbmRtX2xlbiArPSBzaXplb2Yoc3RydWN0IGJmaV91Zl9idWZfcG9zdF9zKSAqIG51bV91ZnM7CisJYmZhX21lbV9kbWFfc2VnX2l0ZXIodWZtLCBzZWdfcHRyLCBuc2VncywgaWR4KSB7CisJCWlmIChudW1fdWZzID49IHBlcl9zZWdfdWYpIHsKKwkJCW51bV91ZnMgLT0gcGVyX3NlZ191ZjsKKwkJCWJmYV9tZW1fZG1hX3NldHVwKG1pbmZvLCBzZWdfcHRyLAorCQkJCXBlcl9zZWdfdWYgKiBCRkFfUEVSX1VGX0RNQV9TWik7CisJCX0gZWxzZQorCQkJYmZhX21lbV9kbWFfc2V0dXAobWluZm8sIHNlZ19wdHIsCisJCQkJbnVtX3VmcyAqIEJGQV9QRVJfVUZfRE1BX1NaKTsKKwl9CisKKwkvKiBrdmEgbWVtb3J5ICovCisJYmZhX21lbV9rdmFfc2V0dXAobWluZm8sIHVmX2t2YSwgY2ZnLT5md2NmZy5udW1fdWZfYnVmcyAqCisJCShzaXplb2Yoc3RydWN0IGJmYV91Zl9zKSArIHNpemVvZihzdHJ1Y3QgYmZpX3VmX2J1Zl9wb3N0X3MpKSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBiZmFfdWZfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCi0JCSAgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sIHN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKKwkJc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQogewogCXN0cnVjdCBiZmFfdWZfbW9kX3MgKnVmbSA9IEJGQV9VRl9NT0QoYmZhKTsKIAotCW1lbXNldCh1Zm0sIDAsIHNpemVvZihzdHJ1Y3QgYmZhX3VmX21vZF9zKSk7CiAJdWZtLT5iZmEgPSBiZmE7CiAJdWZtLT5udW1fdWZzID0gY2ZnLT5md2NmZy5udW1fdWZfYnVmczsKIAlJTklUX0xJU1RfSEVBRCgmdWZtLT51Zl9mcmVlX3EpOwogCUlOSVRfTElTVF9IRUFEKCZ1Zm0tPnVmX3Bvc3RlZF9xKTsKKwlJTklUX0xJU1RfSEVBRCgmdWZtLT51Zl91bnVzZWRfcSk7CiAKLQl1Zl9tZW1fY2xhaW0odWZtLCBtZW1pbmZvKTsKKwl1Zl9tZW1fY2xhaW0odWZtKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTQ5MzksNyArNTA4OSw3IEBACiAKIAltZW1jcHkodWZfcG9zdF9tc2csICZ1Zm0tPnVmX2J1Zl9wb3N0c1t1Zi0+dWZfdGFnXSwKIAkJICAgICAgc2l6ZW9mKHN0cnVjdCBiZmlfdWZfYnVmX3Bvc3RfcykpOwotCWJmYV9yZXFxX3Byb2R1Y2UodWZtLT5iZmEsIEJGQV9SRVFRX0ZDWFApOworCWJmYV9yZXFxX3Byb2R1Y2UodWZtLT5iZmEsIEJGQV9SRVFRX0ZDWFAsIHVmX3Bvc3RfbXNnLT5taCk7CiAKIAliZmFfdHJjKHVmbS0+YmZhLCB1Zi0+dWZfdGFnKTsKIApAQCAtNDk2MywxMSArNTExMywxNSBAQAogewogCXN0cnVjdCBiZmFfdWZfbW9kX3MgKnVmbSA9IEJGQV9VRl9NT0QoYmZhKTsKIAl1MTYgdWZfdGFnID0gbS0+YnVmX3RhZzsKLQlzdHJ1Y3QgYmZhX3VmX2J1Zl9zICp1Zl9idWYgPSAmdWZtLT51Zl9wYnNfa3ZhW3VmX3RhZ107CiAJc3RydWN0IGJmYV91Zl9zICp1ZiA9ICZ1Zm0tPnVmX2xpc3RbdWZfdGFnXTsKLQl1OCAqYnVmID0gJnVmX2J1Zi0+ZFswXTsKKwlzdHJ1Y3QgYmZhX3VmX2J1Zl9zICp1Zl9idWY7CisJdWludDhfdCAqYnVmOwogCXN0cnVjdCBmY2hzX3MgKmZjaHM7CiAKKwl1Zl9idWYgPSAoc3RydWN0IGJmYV91Zl9idWZfcyAqKQorCQkJYmZhX21lbV9nZXRfZG1hYnVmX2t2YSh1Zm0sIHVmX3RhZywgdWYtPnBiX2xlbik7CisJYnVmID0gJnVmX2J1Zi0+ZFswXTsKKwogCW0tPmZybV9sZW4gPSBiZTE2X3RvX2NwdShtLT5mcm1fbGVuKTsKIAltLT54ZnJfbGVuID0gYmUxNl90b19jcHUobS0+eGZyX2xlbik7CiAKQEAgLTUwMDgsNiArNTE2Miw5IEBACiAJc3RydWN0IGJmYV91Zl9zICp1ZjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpxZSwgKnFlbjsKIAorCS8qIEVucXVldWUgdW51c2VkIHVmIHJlc291cmNlcyB0byBmcmVlX3EgKi8KKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJnVmbS0+dWZfdW51c2VkX3EsICZ1Zm0tPnVmX2ZyZWVfcSk7CisKIAlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJnVmbS0+dWZfcG9zdGVkX3EpIHsKIAkJdWYgPSAoc3RydWN0IGJmYV91Zl9zICopIHFlOwogCQlsaXN0X2RlbCgmdWYtPnFlKTsKQEAgLTUwNzIsNCArNTIyOSw0MTUgQEAKIAl9CiB9CiAKK3ZvaWQKK2JmYV91Zl9yZXNfcmVjZmcoc3RydWN0IGJmYV9zICpiZmEsIHUxNiBudW1fdWZfZncpCit7CisJc3RydWN0IGJmYV91Zl9tb2RfcwkqbW9kID0gQkZBX1VGX01PRChiZmEpOworCXN0cnVjdCBsaXN0X2hlYWQJKnFlOworCWludAlpOwogCisJZm9yIChpID0gMDsgaSA8IChtb2QtPm51bV91ZnMgLSBudW1fdWZfZncpOyBpKyspIHsKKwkJYmZhX3FfZGVxX3RhaWwoJm1vZC0+dWZfZnJlZV9xLCAmcWUpOworCQlsaXN0X2FkZF90YWlsKHFlLCAmbW9kLT51Zl91bnVzZWRfcSk7CisJfQorfQorCisvKgorICoJQkZBIGZjZGlhZyBtb2R1bGUKKyAqLworI2RlZmluZSBCRkFfRElBR19RVEVTVF9UT1YJMTAwMCAgICAvKiBtc2VjICovCisKKy8qCisgKglTZXQgcG9ydCBzdGF0dXMgdG8gYnVzeQorICovCitzdGF0aWMgdm9pZAorYmZhX2ZjZGlhZ19zZXRfYnVzeV9zdGF0dXMoc3RydWN0IGJmYV9mY2RpYWdfcyAqZmNkaWFnKQoreworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKGZjZGlhZy0+YmZhKTsKKworCWlmIChmY2RpYWctPmxiLmxvY2spCisJCWZjcG9ydC0+ZGlhZ19idXN5ID0gQkZBX1RSVUU7CisJZWxzZQorCQlmY3BvcnQtPmRpYWdfYnVzeSA9IEJGQV9GQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY2RpYWdfbWVtaW5mbyhzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsIHN0cnVjdCBiZmFfbWVtaW5mb19zICptZW1pbmZvLAorCQlzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY2RpYWdfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCisJCXN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKK3sKKwlzdHJ1Y3QgYmZhX2ZjZGlhZ19zICpmY2RpYWcgPSBCRkFfRkNESUFHX01PRChiZmEpOworCWZjZGlhZy0+YmZhICAgICAgICAgICAgID0gYmZhOworCWZjZGlhZy0+dHJjbW9kICA9IGJmYS0+dHJjbW9kOworCS8qIFRoZSBjb21tb24gRElBRyBhdHRhY2ggYmZhX2RpYWdfYXR0YWNoKCkgd2lsbCBkbyBhbGwgbWVtb3J5IGNsYWltICovCit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNkaWFnX2lvY2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9mY2RpYWdfcyAqZmNkaWFnID0gQkZBX0ZDRElBR19NT0QoYmZhKTsKKwliZmFfdHJjKGZjZGlhZywgZmNkaWFnLT5sYi5sb2NrKTsKKwlpZiAoZmNkaWFnLT5sYi5sb2NrKSB7CisJCWZjZGlhZy0+bGIuc3RhdHVzID0gQkZBX1NUQVRVU19JT0NfRkFJTFVSRTsKKwkJZmNkaWFnLT5sYi5jYmZuKGZjZGlhZy0+bGIuY2JhcmcsIGZjZGlhZy0+bGIuc3RhdHVzKTsKKwkJZmNkaWFnLT5sYi5sb2NrID0gMDsKKwkJYmZhX2ZjZGlhZ19zZXRfYnVzeV9zdGF0dXMoZmNkaWFnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNkaWFnX2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY2RpYWdfc3RhcnQoc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNkaWFnX3N0b3Aoc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZmNkaWFnX3F1ZXVldGVzdF90aW1lb3V0KHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfZmNkaWFnX3MgICAgICAgKmZjZGlhZyA9IGNiYXJnOworCXN0cnVjdCBiZmFfZGlhZ19xdGVzdF9yZXN1bHRfcyAqcmVzID0gZmNkaWFnLT5xdGVzdC5yZXN1bHQ7CisKKwliZmFfdHJjKGZjZGlhZywgZmNkaWFnLT5xdGVzdC5hbGwpOworCWJmYV90cmMoZmNkaWFnLCBmY2RpYWctPnF0ZXN0LmNvdW50KTsKKworCWZjZGlhZy0+cXRlc3QudGltZXJfYWN0aXZlID0gMDsKKworCXJlcy0+c3RhdHVzID0gQkZBX1NUQVRVU19FVElNRVI7CisJcmVzLT5jb3VudCAgPSBRVEVTVF9DTlRfREVGQVVMVCAtIGZjZGlhZy0+cXRlc3QuY291bnQ7CisJaWYgKGZjZGlhZy0+cXRlc3QuYWxsKQorCQlyZXMtPnF1ZXVlICA9IGZjZGlhZy0+cXRlc3QuYWxsOworCisJYmZhX3RyYyhmY2RpYWcsIEJGQV9TVEFUVVNfRVRJTUVSKTsKKwlmY2RpYWctPnF0ZXN0LnN0YXR1cyA9IEJGQV9TVEFUVVNfRVRJTUVSOworCWZjZGlhZy0+cXRlc3QuY2JmbihmY2RpYWctPnF0ZXN0LmNiYXJnLCBmY2RpYWctPnF0ZXN0LnN0YXR1cyk7CisJZmNkaWFnLT5xdGVzdC5sb2NrID0gMDsKK30KKworc3RhdGljIGJmYV9zdGF0dXNfdAorYmZhX2ZjZGlhZ19xdWV1ZXRlc3Rfc2VuZChzdHJ1Y3QgYmZhX2ZjZGlhZ19zICpmY2RpYWcpCit7CisJdTMyCWk7CisJc3RydWN0IGJmaV9kaWFnX3F0ZXN0X3JlcV9zICpyZXE7CisKKwlyZXEgPSBiZmFfcmVxcV9uZXh0KGZjZGlhZy0+YmZhLCBmY2RpYWctPnF0ZXN0LnF1ZXVlKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKworCS8qIGJ1aWxkIGhvc3QgY29tbWFuZCAqLworCWJmaV9oMmlfc2V0KHJlcS0+bWgsIEJGSV9NQ19ESUFHLCBCRklfRElBR19IMklfUVRFU1QsCisJCWJmYV9mbl9scHUoZmNkaWFnLT5iZmEpKTsKKworCWZvciAoaSA9IDA7IGkgPCBCRklfTE1TR19QTF9XU1o7IGkrKykKKwkJcmVxLT5kYXRhW2ldID0gUVRFU1RfUEFUX0RFRkFVTFQ7CisKKwliZmFfdHJjKGZjZGlhZywgZmNkaWFnLT5xdGVzdC5xdWV1ZSk7CisJLyogcmluZyBkb29yIGJlbGwgKi8KKwliZmFfcmVxcV9wcm9kdWNlKGZjZGlhZy0+YmZhLCBmY2RpYWctPnF0ZXN0LnF1ZXVlLCByZXEtPm1oKTsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY2RpYWdfcXVldWV0ZXN0X2NvbXAoc3RydWN0IGJmYV9mY2RpYWdfcyAqZmNkaWFnLAorCQkJYmZpX2RpYWdfcXRlc3RfcnNwX3QgKnJzcCkKK3sKKwlzdHJ1Y3QgYmZhX2RpYWdfcXRlc3RfcmVzdWx0X3MgKnJlcyA9IGZjZGlhZy0+cXRlc3QucmVzdWx0OworCWJmYV9zdGF0dXNfdCBzdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCWludCBpOworCisJLyogQ2hlY2sgdGltZXIsIHNob3VsZCBzdGlsbCBiZSBhY3RpdmUgICAqLworCWlmICghZmNkaWFnLT5xdGVzdC50aW1lcl9hY3RpdmUpIHsKKwkJYmZhX3RyYyhmY2RpYWcsIGZjZGlhZy0+cXRlc3QudGltZXJfYWN0aXZlKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHVwZGF0ZSBjb3VudCAqLworCWZjZGlhZy0+cXRlc3QuY291bnQtLTsKKworCS8qIENoZWNrIHJlc3VsdCAqLworCWZvciAoaSA9IDA7IGkgPCBCRklfTE1TR19QTF9XU1o7IGkrKykgeworCQlpZiAocnNwLT5kYXRhW2ldICE9IH4oUVRFU1RfUEFUX0RFRkFVTFQpKSB7CisJCQlyZXMtPnN0YXR1cyA9IEJGQV9TVEFUVVNfREFUQUNPUlJVUFRFRDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJlcy0+c3RhdHVzID09IEJGQV9TVEFUVVNfT0spIHsKKwkJaWYgKGZjZGlhZy0+cXRlc3QuY291bnQgPiAwKSB7CisJCQlzdGF0dXMgPSBiZmFfZmNkaWFnX3F1ZXVldGVzdF9zZW5kKGZjZGlhZyk7CisJCQlpZiAoc3RhdHVzID09IEJGQV9TVEFUVVNfT0spCisJCQkJcmV0dXJuOworCQkJZWxzZQorCQkJCXJlcy0+c3RhdHVzID0gc3RhdHVzOworCQl9IGVsc2UgaWYgKGZjZGlhZy0+cXRlc3QuYWxsID4gMCAmJgorCQkJZmNkaWFnLT5xdGVzdC5xdWV1ZSA8IChCRklfSU9DX01BWF9DUVMgLSAxKSkgeworCQkJZmNkaWFnLT5xdGVzdC5jb3VudCA9IFFURVNUX0NOVF9ERUZBVUxUOworCQkJZmNkaWFnLT5xdGVzdC5xdWV1ZSsrOworCQkJc3RhdHVzID0gYmZhX2ZjZGlhZ19xdWV1ZXRlc3Rfc2VuZChmY2RpYWcpOworCQkJaWYgKHN0YXR1cyA9PSBCRkFfU1RBVFVTX09LKQorCQkJCXJldHVybjsKKwkJCWVsc2UKKwkJCQlyZXMtPnN0YXR1cyA9IHN0YXR1czsKKwkJfQorCX0KKworCS8qIFN0b3AgdGltZXIgd2hlbiB3ZSBjb21wIGFsbCBxdWV1ZSAqLworCWlmIChmY2RpYWctPnF0ZXN0LnRpbWVyX2FjdGl2ZSkgeworCQliZmFfdGltZXJfc3RvcCgmZmNkaWFnLT5xdGVzdC50aW1lcik7CisJCWZjZGlhZy0+cXRlc3QudGltZXJfYWN0aXZlID0gMDsKKwl9CisJcmVzLT5xdWV1ZSA9IGZjZGlhZy0+cXRlc3QucXVldWU7CisJcmVzLT5jb3VudCA9IFFURVNUX0NOVF9ERUZBVUxUIC0gZmNkaWFnLT5xdGVzdC5jb3VudDsKKwliZmFfdHJjKGZjZGlhZywgcmVzLT5jb3VudCk7CisJYmZhX3RyYyhmY2RpYWcsIHJlcy0+c3RhdHVzKTsKKwlmY2RpYWctPnF0ZXN0LnN0YXR1cyA9IHJlcy0+c3RhdHVzOworCWZjZGlhZy0+cXRlc3QuY2JmbihmY2RpYWctPnF0ZXN0LmNiYXJnLCBmY2RpYWctPnF0ZXN0LnN0YXR1cyk7CisJZmNkaWFnLT5xdGVzdC5sb2NrID0gMDsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mY2RpYWdfbG9vcGJhY2tfY29tcChzdHJ1Y3QgYmZhX2ZjZGlhZ19zICpmY2RpYWcsCisJCQlzdHJ1Y3QgYmZpX2RpYWdfbGJfcnNwX3MgKnJzcCkKK3sKKwlzdHJ1Y3QgYmZhX2RpYWdfbG9vcGJhY2tfcmVzdWx0X3MgKnJlcyA9IGZjZGlhZy0+bGIucmVzdWx0OworCisJcmVzLT5udW10eG1mcm0gID0gYmUzMl90b19jcHUocnNwLT5yZXMubnVtdHhtZnJtKTsKKwlyZXMtPm51bW9zZmZybSAgPSBiZTMyX3RvX2NwdShyc3AtPnJlcy5udW1vc2Zmcm0pOworCXJlcy0+bnVtcmN2ZnJtICA9IGJlMzJfdG9fY3B1KHJzcC0+cmVzLm51bXJjdmZybSk7CisJcmVzLT5iYWRmcm1pbmYgID0gYmUzMl90b19jcHUocnNwLT5yZXMuYmFkZnJtaW5mKTsKKwlyZXMtPmJhZGZybW51bSAgPSBiZTMyX3RvX2NwdShyc3AtPnJlcy5iYWRmcm1udW0pOworCXJlcy0+c3RhdHVzICAgICA9IHJzcC0+cmVzLnN0YXR1czsKKwlmY2RpYWctPmxiLnN0YXR1cyA9IHJzcC0+cmVzLnN0YXR1czsKKwliZmFfdHJjKGZjZGlhZywgZmNkaWFnLT5sYi5zdGF0dXMpOworCWZjZGlhZy0+bGIuY2JmbihmY2RpYWctPmxiLmNiYXJnLCBmY2RpYWctPmxiLnN0YXR1cyk7CisJZmNkaWFnLT5sYi5sb2NrID0gMDsKKwliZmFfZmNkaWFnX3NldF9idXN5X3N0YXR1cyhmY2RpYWcpOworfQorCitzdGF0aWMgYmZhX3N0YXR1c190CitiZmFfZmNkaWFnX2xvb3BiYWNrX3NlbmQoc3RydWN0IGJmYV9mY2RpYWdfcyAqZmNkaWFnLAorCQkJc3RydWN0IGJmYV9kaWFnX2xvb3BiYWNrX3MgKmxvb3BiYWNrKQoreworCXN0cnVjdCBiZmlfZGlhZ19sYl9yZXFfcyAqbGJfcmVxOworCisJbGJfcmVxID0gYmZhX3JlcXFfbmV4dChmY2RpYWctPmJmYSwgQkZBX1JFUVFfRElBRyk7CisJaWYgKCFsYl9yZXEpCisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisKKwkvKiBidWlsZCBob3N0IGNvbW1hbmQgKi8KKwliZmlfaDJpX3NldChsYl9yZXEtPm1oLCBCRklfTUNfRElBRywgQkZJX0RJQUdfSDJJX0xPT1BCQUNLLAorCQliZmFfZm5fbHB1KGZjZGlhZy0+YmZhKSk7CisKKwlsYl9yZXEtPmxiX21vZGUgPSBsb29wYmFjay0+bGJfbW9kZTsKKwlsYl9yZXEtPnNwZWVkID0gbG9vcGJhY2stPnNwZWVkOworCWxiX3JlcS0+bG9vcGNudCA9IGxvb3BiYWNrLT5sb29wY250OworCWxiX3JlcS0+cGF0dGVybiA9IGxvb3BiYWNrLT5wYXR0ZXJuOworCisJLyogcmluZyBkb29yIGJlbGwgKi8KKwliZmFfcmVxcV9wcm9kdWNlKGZjZGlhZy0+YmZhLCBCRkFfUkVRUV9ESUFHLCBsYl9yZXEtPm1oKTsKKworCWJmYV90cmMoZmNkaWFnLCBsb29wYmFjay0+bGJfbW9kZSk7CisJYmZhX3RyYyhmY2RpYWcsIGxvb3BiYWNrLT5zcGVlZCk7CisJYmZhX3RyYyhmY2RpYWcsIGxvb3BiYWNrLT5sb29wY250KTsKKwliZmFfdHJjKGZjZGlhZywgbG9vcGJhY2stPnBhdHRlcm4pOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCisvKgorICoJY3BlL3JtZSBpbnRyIGhhbmRsZXIKKyAqLwordm9pZAorYmZhX2ZjZGlhZ19pbnRyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptc2cpCit7CisJc3RydWN0IGJmYV9mY2RpYWdfcyAqZmNkaWFnID0gQkZBX0ZDRElBR19NT0QoYmZhKTsKKworCXN3aXRjaCAobXNnLT5taGRyLm1zZ19pZCkgeworCWNhc2UgQkZJX0RJQUdfSTJIX0xPT1BCQUNLOgorCQliZmFfZmNkaWFnX2xvb3BiYWNrX2NvbXAoZmNkaWFnLAorCQkJCShzdHJ1Y3QgYmZpX2RpYWdfbGJfcnNwX3MgKikgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBCRklfRElBR19JMkhfUVRFU1Q6CisJCWJmYV9mY2RpYWdfcXVldWV0ZXN0X2NvbXAoZmNkaWFnLCAoYmZpX2RpYWdfcXRlc3RfcnNwX3QgKiltc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliZmFfdHJjKGZjZGlhZywgbXNnLT5taGRyLm1zZ19pZCk7CisJCVdBUk5fT04oMSk7CisJfQorfQorCisvKgorICoJTG9vcGJhY2sgdGVzdAorICoKKyAqICAgQHBhcmFtW2luXSAqYmZhICAgICAgICAgICAgLSBiZmEgZGF0YSBzdHJ1Y3QKKyAqICAgQHBhcmFtW2luXSBvcG1vZGUgICAgICAgICAgLSBwb3J0IG9wZXJhdGlvbiBtb2RlCisgKiAgIEBwYXJhbVtpbl0gc3BlZWQgICAgICAgICAgIC0gcG9ydCBzcGVlZAorICogICBAcGFyYW1baW5dIGxwY250ICAgICAgICAgICAtIGxvb3AgY291bnQKKyAqICAgQHBhcmFtW2luXSBwYXQgICAgICAgICAgICAgICAgICAgICAtIHBhdHRlcm4gdG8gYnVpbGQgcGFja2V0CisgKiAgIEBwYXJhbVtpbl0gKnJlc3VsdCAgICAgICAgIC0gcHQgdG8gYmZhX2RpYWdfbG9vcGJhY2tfcmVzdWx0X3QgZGF0YSBzdHJ1Y3QKKyAqICAgQHBhcmFtW2luXSBjYmZuICAgICAgICAgICAgLSBjYWxsYmFjayBmdW5jdGlvbgorICogICBAcGFyYW1baW5dIGNiYXJnICAgICAgICAgICAtIGNhbGxiYWNrIGZ1bmN0aW9pbiBhcmcKKyAqCisgKiAgIEBwYXJhbVtvdXRdCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2ZjZGlhZ19sb29wYmFjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgZW51bSBiZmFfcG9ydF9vcG1vZGUgb3Btb2RlLAorCQllbnVtIGJmYV9wb3J0X3NwZWVkIHNwZWVkLCB1MzIgbHBjbnQsIHUzMiBwYXQsCisJCXN0cnVjdCBiZmFfZGlhZ19sb29wYmFja19yZXN1bHRfcyAqcmVzdWx0LCBiZmFfY2JfZGlhZ190IGNiZm4sCisJCXZvaWQgKmNiYXJnKQoreworCXN0cnVjdCAgYmZhX2RpYWdfbG9vcGJhY2tfcyBsb29wYmFjazsKKwlzdHJ1Y3QgYmZhX3BvcnRfYXR0cl9zIGF0dHI7CisJYmZhX3N0YXR1c190IHN0YXR1czsKKwlzdHJ1Y3QgYmZhX2ZjZGlhZ19zICpmY2RpYWcgPSBCRkFfRkNESUFHX01PRChiZmEpOworCisJaWYgKCFiZmFfaW9jZmNfaXNfb3BlcmF0aW9uYWwoYmZhKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKworCS8qIGlmIHBvcnQgaXMgUEJDIGRpc2FibGVkLCByZXR1cm4gZXJyb3IgKi8KKwlpZiAoYmZhX2ZjcG9ydF9pc19wYmNkaXNhYmxlZChiZmEpKSB7CisJCWJmYV90cmMoZmNkaWFnLCBCRkFfU1RBVFVTX1BCQyk7CisJCXJldHVybiBCRkFfU1RBVFVTX1BCQzsKKwl9CisKKwlpZiAoYmZhX2ZjcG9ydF9pc19kaXNhYmxlZChiZmEpID09IEJGQV9GQUxTRSkgeworCQliZmFfdHJjKGZjZGlhZywgb3Btb2RlKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfUE9SVF9OT1RfRElTQUJMRUQ7CisJfQorCisJLyogQ2hlY2sgaWYgdGhlIHNwZWVkIGlzIHN1cHBvcnRlZCAqLworCWJmYV9mY3BvcnRfZ2V0X2F0dHIoYmZhLCAmYXR0cik7CisJYmZhX3RyYyhmY2RpYWcsIGF0dHIuc3BlZWRfc3VwcG9ydGVkKTsKKwlpZiAoc3BlZWQgPiBhdHRyLnNwZWVkX3N1cHBvcnRlZCkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEOworCisJLyogRm9yIE1lenogY2FyZCwgcG9ydCBzcGVlZCBlbnRlcmVkIG5lZWRzIHRvIGJlIGNoZWNrZWQgKi8KKwlpZiAoYmZhX21mZ19pc19tZXp6KGJmYS0+aW9jLmF0dHItPmNhcmRfdHlwZSkpIHsKKwkJaWYgKGJmYV9pb2NfZ2V0X3R5cGUoJmJmYS0+aW9jKSA9PSBCRkFfSU9DX1RZUEVfRkMpIHsKKwkJCWlmICgoc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfMUdCUFMpICYmCisJCQkgICAgKGJmYV9hc2ljX2lkX2N0MihiZmEtPmlvYy5wY2lkZXYuZGV2aWNlX2lkKSkpCisJCQkJcmV0dXJuIEJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEOworCQkJaWYgKCEoc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfMUdCUFMgfHwKKwkJCSAgICAgIHNwZWVkID09IEJGQV9QT1JUX1NQRUVEXzJHQlBTIHx8CisJCQkgICAgICBzcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF80R0JQUyB8fAorCQkJICAgICAgc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfOEdCUFMgfHwKKwkJCSAgICAgIHNwZWVkID09IEJGQV9QT1JUX1NQRUVEXzE2R0JQUyB8fAorCQkJICAgICAgc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfQVVUTykpCisJCQkJcmV0dXJuIEJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEOworCQl9IGVsc2UgeworCQkJaWYgKHNwZWVkICE9IEJGQV9QT1JUX1NQRUVEXzEwR0JQUykKKwkJCQlyZXR1cm4gQkZBX1NUQVRVU19VTlNVUFBfU1BFRUQ7CisJCX0KKwl9CisKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBkZXN0cnVjdGl2ZSBkaWFnIGNtZCBydW5uaW5nICovCisJaWYgKGZjZGlhZy0+bGIubG9jaykgeworCQliZmFfdHJjKGZjZGlhZywgZmNkaWFnLT5sYi5sb2NrKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKwl9CisKKwlmY2RpYWctPmxiLmxvY2sgPSAxOworCWxvb3BiYWNrLmxiX21vZGUgPSBvcG1vZGU7CisJbG9vcGJhY2suc3BlZWQgPSBzcGVlZDsKKwlsb29wYmFjay5sb29wY250ID0gbHBjbnQ7CisJbG9vcGJhY2sucGF0dGVybiA9IHBhdDsKKwlmY2RpYWctPmxiLnJlc3VsdCA9IHJlc3VsdDsKKwlmY2RpYWctPmxiLmNiZm4gPSBjYmZuOworCWZjZGlhZy0+bGIuY2JhcmcgPSBjYmFyZzsKKwltZW1zZXQocmVzdWx0LCAwLCBzaXplb2Yoc3RydWN0IGJmYV9kaWFnX2xvb3BiYWNrX3Jlc3VsdF9zKSk7CisJYmZhX2ZjZGlhZ19zZXRfYnVzeV9zdGF0dXMoZmNkaWFnKTsKKworCS8qIFNlbmQgbXNnIHRvIGZ3ICovCisJc3RhdHVzID0gYmZhX2ZjZGlhZ19sb29wYmFja19zZW5kKGZjZGlhZywgJmxvb3BiYWNrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICoJRElBRyBxdWV1ZSB0ZXN0IGNvbW1hbmQKKyAqCisgKiAgIEBwYXJhbVtpbl0gKmJmYSAgICAgICAgICAgIC0gYmZhIGRhdGEgc3RydWN0CisgKiAgIEBwYXJhbVtpbl0gZm9yY2UgICAgICAgICAgIC0gMTogZG9uJ3QgZG8gaW9jIG9wIGNoZWNraW5nCisgKiAgIEBwYXJhbVtpbl0gcXVldWUgICAgICAgICAgIC0gcXVldWUgbm8uIHRvIHRlc3QKKyAqICAgQHBhcmFtW2luXSAqcmVzdWx0ICAgICAgICAgLSBwdCB0byBiZmFfZGlhZ19xdGVzdF9yZXN1bHRfdCBkYXRhIHN0cnVjdAorICogICBAcGFyYW1baW5dIGNiZm4gICAgICAgICAgICAtIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiAgIEBwYXJhbVtpbl0gKmNiYXJnICAgICAgICAgIC0gY2FsbGJhY2sgZnVuY3Rpb2luIGFyZworICoKKyAqICAgQHBhcmFtW291dF0KKyAqLworYmZhX3N0YXR1c190CitiZmFfZmNkaWFnX3F1ZXVldGVzdChzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyIGZvcmNlLCB1MzIgcXVldWUsCisJCXN0cnVjdCBiZmFfZGlhZ19xdGVzdF9yZXN1bHRfcyAqcmVzdWx0LCBiZmFfY2JfZGlhZ190IGNiZm4sCisJCXZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfZmNkaWFnX3MgKmZjZGlhZyA9IEJGQV9GQ0RJQUdfTU9EKGJmYSk7CisJYmZhX3N0YXR1c190IHN0YXR1czsKKwliZmFfdHJjKGZjZGlhZywgZm9yY2UpOworCWJmYV90cmMoZmNkaWFnLCBxdWV1ZSk7CisKKwlpZiAoIWZvcmNlICYmICFiZmFfaW9jZmNfaXNfb3BlcmF0aW9uYWwoYmZhKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIGRlc3RydWN0aXZlIGRpYWcgY21kIHJ1bm5pbmcgKi8KKwlpZiAoZmNkaWFnLT5xdGVzdC5sb2NrKSB7CisJCWJmYV90cmMoZmNkaWFnLCBmY2RpYWctPnF0ZXN0LmxvY2spOworCQlyZXR1cm4gQkZBX1NUQVRVU19ERVZCVVNZOworCX0KKworCS8qIEluaXRpYWxpemF0aW9uICovCisJZmNkaWFnLT5xdGVzdC5sb2NrID0gMTsKKwlmY2RpYWctPnF0ZXN0LmNiZm4gPSBjYmZuOworCWZjZGlhZy0+cXRlc3QuY2JhcmcgPSBjYmFyZzsKKwlmY2RpYWctPnF0ZXN0LnJlc3VsdCA9IHJlc3VsdDsKKwlmY2RpYWctPnF0ZXN0LmNvdW50ID0gUVRFU1RfQ05UX0RFRkFVTFQ7CisKKwkvKiBJbml0IHRlc3QgcmVzdWx0cyAqLworCWZjZGlhZy0+cXRlc3QucmVzdWx0LT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCWZjZGlhZy0+cXRlc3QucmVzdWx0LT5jb3VudCAgPSAwOworCisJLyogc2VuZCAqLworCWlmIChxdWV1ZSA8IEJGSV9JT0NfTUFYX0NRUykgeworCQlmY2RpYWctPnF0ZXN0LnJlc3VsdC0+cXVldWUgID0gKHU4KXF1ZXVlOworCQlmY2RpYWctPnF0ZXN0LnF1ZXVlID0gKHU4KXF1ZXVlOworCQlmY2RpYWctPnF0ZXN0LmFsbCAgID0gMDsKKwl9IGVsc2UgeworCQlmY2RpYWctPnF0ZXN0LnJlc3VsdC0+cXVldWUgID0gMDsKKwkJZmNkaWFnLT5xdGVzdC5xdWV1ZSA9IDA7CisJCWZjZGlhZy0+cXRlc3QuYWxsICAgPSAxOworCX0KKwlzdGF0dXMgPSBiZmFfZmNkaWFnX3F1ZXVldGVzdF9zZW5kKGZjZGlhZyk7CisKKwkvKiBTdGFydCBhIHRpbWVyICovCisJaWYgKHN0YXR1cyA9PSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90aW1lcl9zdGFydChiZmEsICZmY2RpYWctPnF0ZXN0LnRpbWVyLAorCQkJCWJmYV9mY2RpYWdfcXVldWV0ZXN0X3RpbWVvdXQsIGZjZGlhZywKKwkJCQlCRkFfRElBR19RVEVTVF9UT1YpOworCQlmY2RpYWctPnF0ZXN0LnRpbWVyX2FjdGl2ZSA9IDE7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBESUFHIFBMQiBpcyBydW5uaW5nCisgKgorICogICBAcGFyYW1baW5dICpiZmEgICAgLSBiZmEgZGF0YSBzdHJ1Y3QKKyAqCisgKiAgIEBwYXJhbVtvdXRdCisgKi8KK2JmYV9zdGF0dXNfdAorYmZhX2ZjZGlhZ19sYl9pc19ydW5uaW5nKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfZmNkaWFnX3MgKmZjZGlhZyA9IEJGQV9GQ0RJQUdfTU9EKGJmYSk7CisJcmV0dXJuIGZjZGlhZy0+bGIubG9jayA/ICBCRkFfU1RBVFVTX0RJQUdfQlVTWSA6IEJGQV9TVEFUVVNfT0s7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zdmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5oCmluZGV4IDU5MDJhNDUuLmZiZTUxM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5oCkBAIC0yNiw2ICsyNiw3IEBACiAgKiBTY2F0dGVyLWdhdGhlciBETUEgcmVsYXRlZCBkZWZpbmVzCiAgKi8KICNkZWZpbmUgQkZBX1NHUEdfTUlOCSgxNikKKyNkZWZpbmUgQkZBX1NHUEdfTUFYCSg4MTkyKQogCiAvKgogICogQWxpZ25tZW50IG1hY3JvIGZvciBTRyBwYWdlIGFsbG9jYXRpb24KQEAgLTU0LDE3ICs1NSwyMSBAQAogICovCiAjZGVmaW5lIEJGQV9TR1BHX05QQUdFKF9uc2dlcykgICgoKF9uc2dlcykgLyBCRklfU0dQR19EQVRBX1NHRVMpICsgMSkKIAorLyogTWF4IFNHUEcgZG1hIHNlZ3MgcmVxdWlyZWQgKi8KKyNkZWZpbmUgQkZBX1NHUEdfRE1BX1NFR1MJXAorCUJGSV9NRU1fRE1BX05TRUdTKEJGQV9TR1BHX01BWCwgKHVpbnQzMl90KXNpemVvZihzdHJ1Y3QgYmZpX3NncGdfcykpCisKIHN0cnVjdCBiZmFfc2dwZ19tb2RfcyB7CiAJc3RydWN0IGJmYV9zICpiZmE7CiAJaW50CQludW1fc2dwZ3M7CS8qICBudW1iZXIgb2YgU0cgcGFnZXMJCSovCiAJaW50CQlmcmVlX3NncGdzOwkvKiAgbnVtYmVyIG9mIGZyZWUgU0cgcGFnZXMJKi8KLQlzdHJ1Y3QgYmZhX3NncGdfcwkqaHNncGdfYXJyOwkvKiAgQkZBIFNHIHBhZ2UgYXJyYXkJKi8KLQlzdHJ1Y3QgYmZpX3NncGdfcyAqc2dwZ19hcnI7CS8qICBhY3R1YWwgU0cgcGFnZSBhcnJheQkqLwotCXU2NAlzZ3BnX2Fycl9wYTsJLyogIFNHIHBhZ2UgYXJyYXkgRE1BIGFkZHIJKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXNncGdfcTsJCS8qICBxdWV1ZSBvZiBmcmVlIFNHIHBhZ2VzICovCiAJc3RydWN0IGxpc3RfaGVhZAlzZ3BnX3dhaXRfcTsJLyogIHdhaXQgcXVldWUgZm9yIFNHIHBhZ2VzICovCisJc3RydWN0IGJmYV9tZW1fZG1hX3MJZG1hX3NlZ1tCRkFfU0dQR19ETUFfU0VHU107CisJc3RydWN0IGJmYV9tZW1fa3ZhX3MJa3ZhX3NlZzsKIH07CiAjZGVmaW5lIEJGQV9TR1BHX01PRChfX2JmYSkJKCYoX19iZmEpLT5tb2R1bGVzLnNncGdfbW9kKQorI2RlZmluZSBCRkFfTUVNX1NHUEdfS1ZBKF9fYmZhKSAoJihCRkFfU0dQR19NT0QoX19iZmEpLT5rdmFfc2VnKSkKIAogYmZhX3N0YXR1c190IGJmYV9zZ3BnX21hbGxvYyhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGxpc3RfaGVhZCAqc2dwZ19xLAogCQkJICAgICBpbnQgbnNncGdzKTsKQEAgLTc5LDI2ICs4NCwzMiBAQAogICogRkNYUCByZWxhdGVkIGRlZmluZXMKICAqLwogI2RlZmluZSBCRkFfRkNYUF9NSU4JCSgxKQorI2RlZmluZSBCRkFfRkNYUF9NQVgJCSgyNTYpCiAjZGVmaW5lIEJGQV9GQ1hQX01BWF9JQlVGX1NaCSgyICogMTAyNCArIDI1NikKICNkZWZpbmUgQkZBX0ZDWFBfTUFYX0xCVUZfU1oJKDQgKiAxMDI0ICsgMjU2KQogCisvKiBNYXggRkNYUCBkbWEgc2VncyByZXF1aXJlZCAqLworI2RlZmluZSBCRkFfRkNYUF9ETUFfU0VHUwkJCQkJCVwKKwlCRklfTUVNX0RNQV9OU0VHUyhCRkFfRkNYUF9NQVgsCQkJCQlcCisJCSh1MzIpQkZBX0ZDWFBfTUFYX0lCVUZfU1ogKyBCRkFfRkNYUF9NQVhfTEJVRl9TWikKKwogc3RydWN0IGJmYV9mY3hwX21vZF9zIHsKIAlzdHJ1Y3QgYmZhX3MgICAgICAqYmZhOwkJLyogYmFja3BvaW50ZXIgdG8gQkZBICovCiAJc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfbGlzdDsJLyogYXJyYXkgb2YgRkNYUHMgKi8KIAl1MTYJbnVtX2ZjeHBzOwkvKiBtYXggbnVtIEZDWFAgcmVxdWVzdHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkICBmY3hwX2ZyZWVfcTsJLyogZnJlZSBGQ1hQcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgIGZjeHBfYWN0aXZlX3E7CS8qIGFjdGl2ZSBGQ1hQcyAqLwotCXZvaWQJCSpyZXFfcGxkX2xpc3Rfa3ZhOwkvKiBsaXN0IG9mIEZDWFAgcmVxIHBsZCAqLwotCXU2NAlyZXFfcGxkX2xpc3RfcGE7CS8qIGxpc3Qgb2YgRkNYUCByZXEgcGxkICovCi0Jdm9pZAkJKnJzcF9wbGRfbGlzdF9rdmE7CS8qIGxpc3Qgb2YgRkNYUCByZXNwIHBsZCAqLwotCXU2NAlyc3BfcGxkX2xpc3RfcGE7CS8qIGxpc3Qgb2YgRkNYUCByZXNwIHBsZCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgIHdhaXRfcTsJCS8qIHdhaXQgcXVldWUgZm9yIGZyZWUgZmN4cCAqLworCXN0cnVjdCBsaXN0X2hlYWQgZmN4cF91bnVzZWRfcTsgLyogdW51c2VkIGZjeHBzICovCiAJdTMyCXJlcV9wbGRfc3o7CiAJdTMyCXJzcF9wbGRfc3o7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MgZG1hX3NlZ1tCRkFfRkNYUF9ETUFfU0VHU107CisJc3RydWN0IGJmYV9tZW1fa3ZhX3Mga3ZhX3NlZzsKIH07CiAKICNkZWZpbmUgQkZBX0ZDWFBfTU9EKF9fYmZhKQkJKCYoX19iZmEpLT5tb2R1bGVzLmZjeHBfbW9kKQogI2RlZmluZSBCRkFfRkNYUF9GUk9NX1RBRyhfX21vZCwgX190YWcpCSgmKF9fbW9kKS0+ZmN4cF9saXN0W19fdGFnXSkKKyNkZWZpbmUgQkZBX01FTV9GQ1hQX0tWQShfX2JmYSkgKCYoQkZBX0ZDWFBfTU9EKF9fYmZhKS0+a3ZhX3NlZykpCiAKIHR5cGVkZWYgdm9pZCAgICAoKmZjeHBfc2VuZF9jYl90KSAoc3RydWN0IGJmYV9zICppb2MsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLAogCQkJCSAgIHZvaWQgKmNiX2FyZywgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsCkBAIC0yMDYsMTMgKzIxNywxNSBAQAogI2RlZmluZSBCRkFfRkNYUF9SU1BfRkNIUyhfZmN4cCkJKCYoKF9mY3hwKS0+cnNwX2luZm8uZmNocykpCiAjZGVmaW5lIEJGQV9GQ1hQX1JTUF9QTEQoX2ZjeHApCQkoYmZhX2ZjeHBfZ2V0X3JzcGJ1ZihfZmN4cCkpCiAKLSNkZWZpbmUgQkZBX0ZDWFBfUkVRX1BMRF9QQShfZmN4cCkJCQkJXAotCSgoX2ZjeHApLT5mY3hwX21vZC0+cmVxX3BsZF9saXN0X3BhICsJCQlcCi0JICgoX2ZjeHApLT5mY3hwX21vZC0+cmVxX3BsZF9zeiAgKiAoX2ZjeHApLT5mY3hwX3RhZykpCisjZGVmaW5lIEJGQV9GQ1hQX1JFUV9QTERfUEEoX2ZjeHApCQkJCQkgICAgICBcCisJYmZhX21lbV9nZXRfZG1hYnVmX3BhKChfZmN4cCktPmZjeHBfbW9kLCAoX2ZjeHApLT5mY3hwX3RhZywJICAgICAgXAorCQkoX2ZjeHApLT5mY3hwX21vZC0+cmVxX3BsZF9zeiArIChfZmN4cCktPmZjeHBfbW9kLT5yc3BfcGxkX3N6KQogCi0jZGVmaW5lIEJGQV9GQ1hQX1JTUF9QTERfUEEoX2ZjeHApCQkJCVwKLQkoKF9mY3hwKS0+ZmN4cF9tb2QtPnJzcF9wbGRfbGlzdF9wYSArCQkJXAotCSAoKF9mY3hwKS0+ZmN4cF9tb2QtPnJzcF9wbGRfc3ogKiAoX2ZjeHApLT5mY3hwX3RhZykpCisvKiBmY3hwX2J1ZiA9IHJlcV9idWYgKyByc3BfYnVmIDotIGFkZCByZXFfYnVmX3N6IHRvIGdldCB0byByc3BfYnVmICovCisjZGVmaW5lIEJGQV9GQ1hQX1JTUF9QTERfUEEoX2ZjeHApCQkJCQkgICAgICAgXAorCShiZmFfbWVtX2dldF9kbWFidWZfcGEoKF9mY3hwKS0+ZmN4cF9tb2QsIChfZmN4cCktPmZjeHBfdGFnLAkgICAgICAgXAorCSAgICAgIChfZmN4cCktPmZjeHBfbW9kLT5yZXFfcGxkX3N6ICsgKF9mY3hwKS0+ZmN4cF9tb2QtPnJzcF9wbGRfc3opICsgXAorCSAgICAgIChfZmN4cCktPmZjeHBfbW9kLT5yZXFfcGxkX3N6KQogCiB2b2lkCWJmYV9mY3hwX2lzcihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbXNnKTsKIApAQCAtMjM4LDEwICsyNTEsMTMgQEAKIAlzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwc19saXN0OwkvKiAgbGlzdCBvZiBycG9ydHMJKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXJwX2ZyZWVfcTsJLyogIGZyZWUgYmZhX3Jwb3J0cwkqLwogCXN0cnVjdCBsaXN0X2hlYWQJcnBfYWN0aXZlX3E7CS8qICBmcmVlIGJmYV9ycG9ydHMJKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXJwX3VudXNlZF9xOwkvKiAgdW51c2VkIGJmYSBycG9ydHMgICovCiAJdTE2CW51bV9ycG9ydHM7CS8qICBudW1iZXIgb2YgcnBvcnRzCSovCisJc3RydWN0IGJmYV9tZW1fa3ZhX3MJa3ZhX3NlZzsKIH07CiAKICNkZWZpbmUgQkZBX1JQT1JUX01PRChfX2JmYSkJKCYoX19iZmEpLT5tb2R1bGVzLnJwb3J0X21vZCkKKyNkZWZpbmUgQkZBX01FTV9SUE9SVF9LVkEoX19iZmEpICgmKEJGQV9SUE9SVF9NT0QoX19iZmEpLT5rdmFfc2VnKSkKIAogLyoKICAqIENvbnZlcnQgcnBvcnQgdGFnIHRvIFJQT1JUCkBAIC0yNTQsNiArMjcwLDcgQEAKICAqIHByb3RlY3RlZCBmdW5jdGlvbnMKICAqLwogdm9pZAliZmFfcnBvcnRfaXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptc2cpOwordm9pZAliZmFfcnBvcnRfcmVzX3JlY2ZnKHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgbnVtX3Jwb3J0X2Z3KTsKIAogLyoKICAqCUJGQSBycG9ydCBpbmZvcm1hdGlvbi4KQEAgLTI5OCw3ICszMTUsNyBAQAogICovCiAKICNkZWZpbmUgQkZBX1VGX01JTgkoNCkKLQorI2RlZmluZSBCRkFfVUZfTUFYCSgyNTYpCiAKIHN0cnVjdCBiZmFfdWZfcyB7CiAJc3RydWN0IGxpc3RfaGVhZAlxZTsJLyogIHF1ZXVlIGVsZW1lbnQJCSovCkBAIC0zMjYsMzYgKzM0Myw0MSBAQAogICovCiB0eXBlZGVmIHZvaWQgKCpiZmFfY2JfdWZfcmVjdl90KSAodm9pZCAqY2JhcmcsIHN0cnVjdCBiZmFfdWZfcyAqdWYpOwogCisjZGVmaW5lIEJGQV9VRl9CVUZTWgkoMiAqIDEwMjQgKyAyNTYpCisKK3N0cnVjdCBiZmFfdWZfYnVmX3MgeworCXU4CWRbQkZBX1VGX0JVRlNaXTsKK307CisKKyNkZWZpbmUgQkZBX1BFUl9VRl9ETUFfU1oJXAorCSh1MzIpQkZBX1JPVU5EVVAoc2l6ZW9mKHN0cnVjdCBiZmFfdWZfYnVmX3MpLCBCRkFfRE1BX0FMSUdOX1NaKQorCisvKiBNYXggVUYgZG1hIHNlZ3MgcmVxdWlyZWQgKi8KKyNkZWZpbmUgQkZBX1VGX0RNQV9TRUdTIEJGSV9NRU1fRE1BX05TRUdTKEJGQV9VRl9NQVgsIEJGQV9QRVJfVUZfRE1BX1NaKQorCiBzdHJ1Y3QgYmZhX3VmX21vZF9zIHsKIAlzdHJ1Y3QgYmZhX3MgKmJmYTsJCS8qICBiYWNrIHBvaW50ZXIgdG8gQkZBICovCiAJc3RydWN0IGJmYV91Zl9zICp1Zl9saXN0OwkvKiAgYXJyYXkgb2YgVUZzICovCiAJdTE2CW51bV91ZnM7CS8qICBudW0gdW5zb2xpY2l0ZWQgcnggZnJhbWVzICovCiAJc3RydWN0IGxpc3RfaGVhZAl1Zl9mcmVlX3E7CS8qICBmcmVlIFVGcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJdWZfcG9zdGVkX3E7CS8qICBVRnMgcG9zdGVkIHRvIElPQyAqLwotCXN0cnVjdCBiZmFfdWZfYnVmX3MgKnVmX3Bic19rdmE7CS8qICBsaXN0IFVGIGJ1ZnMgcmVxdWVzdCBwbGQgKi8KLQl1NjQJdWZfcGJzX3BhOwkvKiAgcGh5IGFkZHIgZm9yIFVGIGJ1ZnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXVmX3VudXNlZF9xOwkvKiAgdW51c2VkIFVGJ3MgKi8KIAlzdHJ1Y3QgYmZpX3VmX2J1Zl9wb3N0X3MgKnVmX2J1Zl9wb3N0czsKIAkvKiAgcHJlLWJ1aWx0IFVGIHBvc3QgbXNncyAqLwogCWJmYV9jYl91Zl9yZWN2X3QgdWZyZWN2OwkvKiAgdWYgcmVjdiBoYW5kbGVyIGZ1bmN0aW9uICovCiAJdm9pZAkJKmNiYXJnOwkJLyogIHVmIHJlY2VpdmUgaGFuZGxlciBhcmcgKi8KKwlzdHJ1Y3QgYmZhX21lbV9kbWFfcwlkbWFfc2VnW0JGQV9VRl9ETUFfU0VHU107CisJc3RydWN0IGJmYV9tZW1fa3ZhX3MJa3ZhX3NlZzsKIH07CiAKICNkZWZpbmUgQkZBX1VGX01PRChfX2JmYSkJKCYoX19iZmEpLT5tb2R1bGVzLnVmX21vZCkKKyNkZWZpbmUgQkZBX01FTV9VRl9LVkEoX19iZmEpCSgmKEJGQV9VRl9NT0QoX19iZmEpLT5rdmFfc2VnKSkKIAogI2RlZmluZSB1Zm1fcGJzX3BhKF91Zm1vZCwgX3VmdGFnKQkJCQkJXAotCSgoX3VmbW9kKS0+dWZfcGJzX3BhICsgc2l6ZW9mKHN0cnVjdCBiZmFfdWZfYnVmX3MpICogKF91ZnRhZykpCisJYmZhX21lbV9nZXRfZG1hYnVmX3BhKF91Zm1vZCwgX3VmdGFnLCBCRkFfUEVSX1VGX0RNQV9TWikKIAogdm9pZAliZmFfdWZfaXNyKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptc2cpOwotCi0jZGVmaW5lIEJGQV9VRl9CVUZTWgkoMiAqIDEwMjQgKyAyNTYpCi0KLS8qCi0gKiBAdG9kbyBwcml2YXRlCi0gKi8KLXN0cnVjdCBiZmFfdWZfYnVmX3MgewotCXU4CQlkW0JGQV9VRl9CVUZTWl07Ci19OwotCit2b2lkCWJmYV91Zl9yZXNfcmVjZmcoc3RydWN0IGJmYV9zICpiZmEsIHUxNiBudW1fdWZfZncpOwogCiAvKgogICogTFBTIC0gYmZhIGxwb3J0IGxvZ2luL2xvZ291dCBzZXJ2aWNlIGludGVyZmFjZQpAQCAtMzY0LDcgKzM4Niw4IEBACiAJc3RydWN0IGxpc3RfaGVhZAlxZTsJLyogIHF1ZXVlIGVsZW1lbnQJCSovCiAJc3RydWN0IGJmYV9zCSpiZmE7CQkvKiAgcGFyZW50IGJmYSBpbnN0YW5jZQkqLwogCWJmYV9zbV90CXNtOwkJLyogIGZpbml0ZSBzdGF0ZSBtYWNoaW5lCSovCi0JdTgJCWxwX3RhZzsJCS8qICBscG9ydCB0YWcJCQkqLworCXU4CQliZmFfdGFnOwkvKiAgbHBvcnQgdGFnCQkqLworCXU4CQlmd190YWc7CQkvKiAgbHBvcnQgZncgdGFnICAgICAgICAgICAgICAgICovCiAJdTgJCXJlcXE7CQkvKiAgbHBvcnQgcmVxdWVzdCBxdWV1ZQkqLwogCXU4CQlhbHBhOwkJLyogIEFMUEEgZm9yIGxvb3AgdG9wb2xvZ2llcwkqLwogCXUzMglscF9waWQ7CQkvKiAgbHBvcnQgcG9ydCBJRAkJKi8KQEAgLTM3Nyw2ICs0MDAsOCBAQAogCWJmYV9zdGF0dXNfdAlzdGF0dXM7CQkvKiAgbG9naW4gc3RhdHVzCQkqLwogCXUxNgkJcGR1c3o7CQkvKiAgbWF4IHJlY2VpdmUgUERVIHNpemUJKi8KIAl1MTYJCXByX2JiY3JlZDsJLyogIEJCX0NSRURJVCBmcm9tIHBlZXIJCSovCisJdTgJCXByX2Jic2NuOwkvKiAgQkJfU0NOIGZyb20gcGVlcgkJKi8KKwl1OAkJYmJfc2NuOwkJLyogIGxvY2FsIEJCX1NDTgkJKi8KIAl1OAkJbHNyanRfcnNuOwkvKiAgTFNSSlQgcmVhc29uCQkqLwogCXU4CQlsc3JqdF9leHBsOwkvKiAgTFNSSlQgZXhwbGFuYXRpb24JCSovCiAJd3duX3QJCXB3d247CQkvKiAgcG9ydCB3d24gb2YgbHBvcnQJCSovCkBAIC0zOTUsMTIgKzQyMCwxNSBAQAogc3RydWN0IGJmYV9scHNfbW9kX3MgewogCXN0cnVjdCBsaXN0X2hlYWQJCWxwc19mcmVlX3E7CiAJc3RydWN0IGxpc3RfaGVhZAkJbHBzX2FjdGl2ZV9xOworCXN0cnVjdCBsaXN0X2hlYWQJCWxwc19sb2dpbl9xOwogCXN0cnVjdCBiZmFfbHBzX3MJKmxwc19hcnI7CiAJaW50CQkJbnVtX2xwczsKKwlzdHJ1Y3QgYmZhX21lbV9rdmFfcwlrdmFfc2VnOwogfTsKIAogI2RlZmluZSBCRkFfTFBTX01PRChfX2JmYSkJCSgmKF9fYmZhKS0+bW9kdWxlcy5scHNfbW9kKQogI2RlZmluZSBCRkFfTFBTX0ZST01fVEFHKF9fbW9kLCBfX3RhZykJKCYoX19tb2QpLT5scHNfYXJyW19fdGFnXSkKKyNkZWZpbmUgQkZBX01FTV9MUFNfS1ZBKF9fYmZhKQkoJihCRkFfTFBTX01PRChfX2JmYSktPmt2YV9zZWcpKQogCiAvKgogICogZXh0ZXJuYWwgZnVuY3Rpb25zCkBAIC00NzcsMTEgKzUwNSwxNCBAQAogCWJmYV9ib29sZWFuX3QJCWRpYWdfYnVzeTsgLyogIGRpYWcgYnVzeSBzdGF0dXMgKi8KIAliZmFfYm9vbGVhbl90CQliZWFjb247IC8qICBwb3J0IGJlYWNvbiBzdGF0dXMgKi8KIAliZmFfYm9vbGVhbl90CQlsaW5rX2UyZV9iZWFjb247IC8qICBsaW5rIGJlYWNvbiBzdGF0dXMgKi8KKwliZmFfYm9vbGVhbl90CQliYnNjX29wX3N0YXRlOwkvKiBDcmVkIHJlY292IE9wZXIgU3RhdGUgKi8KIAlzdHJ1Y3QgYmZhX2ZjcG9ydF90cnVua19zIHRydW5rOwogCXUxNgkJZmNvZV92bGFuOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zCWZjcG9ydF9kbWE7CiB9OwogCiAjZGVmaW5lIEJGQV9GQ1BPUlRfTU9EKF9fYmZhKQkoJihfX2JmYSktPm1vZHVsZXMuZmNwb3J0KQorI2RlZmluZSBCRkFfTUVNX0ZDUE9SVF9ETUEoX19iZmEpICgmKEJGQV9GQ1BPUlRfTU9EKF9fYmZhKS0+ZmNwb3J0X2RtYSkpCiAKIC8qCiAgKiBwcm90ZWN0ZWQgZnVuY3Rpb25zCkBAIC01MTUsOCArNTQ2LDEwIEBACiBiZmFfYm9vbGVhbl90IGJmYV9mY3BvcnRfaXNfZGlzYWJsZWQoc3RydWN0IGJmYV9zICpiZmEpOwogZW51bSBiZmFfcG9ydF9zcGVlZCBiZmFfZmNwb3J0X2dldF9yYXRlbGltX3NwZWVkKHN0cnVjdCBiZmFfcyAqYmZhKTsKIAotdm9pZCBiZmFfZmNwb3J0X3NldF90eF9iYmNyZWRpdChzdHJ1Y3QgYmZhX3MgKmJmYSwgdTE2IHR4X2JiY3JlZGl0KTsKK3ZvaWQgYmZhX2ZjcG9ydF9zZXRfdHhfYmJjcmVkaXQoc3RydWN0IGJmYV9zICpiZmEsIHUxNiB0eF9iYmNyZWRpdCwgdTggYmJfc2NuKTsKIGJmYV9ib29sZWFuX3QgICAgIGJmYV9mY3BvcnRfaXNfcmF0ZWxpbShzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9mY3BvcnRfYmVhY29uKHZvaWQgKmRldiwgYmZhX2Jvb2xlYW5fdCBiZWFjb24sCisJCQliZmFfYm9vbGVhbl90IGxpbmtfZTJlX2JlYWNvbik7CiBiZmFfYm9vbGVhbl90CWJmYV9mY3BvcnRfaXNfbGlua3VwKHN0cnVjdCBiZmFfcyAqYmZhKTsKIGJmYV9zdGF0dXNfdCBiZmFfZmNwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwKIAkJCQkgIHVuaW9uIGJmYV9mY3BvcnRfc3RhdHNfdSAqc3RhdHMsCkBAIC01MjQsNiArNTU3LDkgQEAKIGJmYV9zdGF0dXNfdCBiZmFfZmNwb3J0X2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfY2JfcG9ydF90IGNiZm4sCiAJCQkJICAgIHZvaWQgKmNiYXJnKTsKIGJmYV9ib29sZWFuX3QgYmZhX2ZjcG9ydF9pc19xb3NfZW5hYmxlZChzdHJ1Y3QgYmZhX3MgKmJmYSk7CitiZmFfYm9vbGVhbl90IGJmYV9mY3BvcnRfaXNfdHJ1bmtfZW5hYmxlZChzdHJ1Y3QgYmZhX3MgKmJmYSk7CitiZmFfc3RhdHVzX3QgYmZhX2ZjcG9ydF9pc19wYmNkaXNhYmxlZChzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9mY3BvcnRfY2ZnX2ZhYShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTggc3RhdGUpOwogCiAvKgogICogYmZhIHJwb3J0IEFQSSBmdW5jdGlvbnMKQEAgLTU3Nyw2ICs2MTMsNyBAQAogYmZhX3N0YXR1c190IGJmYV9mY3hwX2Fib3J0KHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwKTsKIHUzMiBiZmFfZmN4cF9nZXRfcmVxYnVmc3ooc3RydWN0IGJmYV9mY3hwX3MgKmZjeHApOwogdTMyIGJmYV9mY3hwX2dldF9tYXhyc3Aoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfZmN4cF9yZXNfcmVjZmcoc3RydWN0IGJmYV9zICpiZmEsIHUxNiBudW1fZmN4cF9mdyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqCiBiZmFfdWZfZ2V0X2ZybWJ1ZihzdHJ1Y3QgYmZhX3VmX3MgKnVmKQpAQCAtNjA2LDExICs2NDMsMTIgQEAKIHZvaWQgYmZhX2xwc19kZWxldGUoc3RydWN0IGJmYV9scHNfcyAqbHBzKTsKIHZvaWQgYmZhX2xwc19mbG9naShzdHJ1Y3QgYmZhX2xwc19zICpscHMsIHZvaWQgKnVhcmcsIHU4IGFscGEsCiAJCSAgIHUxNiBwZHVzeiwgd3duX3QgcHd3biwgd3duX3Qgbnd3biwKLQkJICAgYmZhX2Jvb2xlYW5fdCBhdXRoX2VuKTsKKwkJICAgYmZhX2Jvb2xlYW5fdCBhdXRoX2VuLCB1OCBiYl9zY24pOwogdm9pZCBiZmFfbHBzX2ZkaXNjKHN0cnVjdCBiZmFfbHBzX3MgKmxwcywgdm9pZCAqdWFyZywgdTE2IHBkdXN6LAogCQkgICB3d25fdCBwd3duLCB3d25fdCBud3duKTsKIHZvaWQgYmZhX2xwc19mZGlzY2xvZ28oc3RydWN0IGJmYV9scHNfcyAqbHBzKTsKIHZvaWQgYmZhX2xwc19zZXRfbjJuX3BpZChzdHJ1Y3QgYmZhX2xwc19zICpscHMsIHUzMiBuMm5fcGlkKTsKK3U4IGJmYV9scHNfZ2V0X2Z3dGFnKHN0cnVjdCBiZmFfcyAqYmZhLCB1OCBscF90YWcpOwogdTMyIGJmYV9scHNfZ2V0X2Jhc2VfcGlkKHN0cnVjdCBiZmFfcyAqYmZhKTsKIHU4IGJmYV9scHNfZ2V0X3RhZ19mcm9tX3BpZChzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyIHBpZCk7CiB2b2lkIGJmYV9jYl9scHNfZmxvZ2lfY29tcCh2b2lkICpiZmFkLCB2b2lkICp1YXJnLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKTsKQEAgLTYxOCw0ICs2NTYsNTcgQEAKIHZvaWQgYmZhX2NiX2xwc19mZGlzY2xvZ29fY29tcCh2b2lkICpiZmFkLCB2b2lkICp1YXJnKTsKIHZvaWQgYmZhX2NiX2xwc19jdmxfZXZlbnQodm9pZCAqYmZhZCwgdm9pZCAqdWFyZyk7CiAKKy8qIEZBQSBzcGVjaWZpYyBBUElzICovCitiZmFfc3RhdHVzX3QgYmZhX2ZhYV9lbmFibGUoc3RydWN0IGJmYV9zICpiZmEsCisJCQliZmFfY2JfaW9jZmNfdCBjYmZuLCB2b2lkICpjYmFyZyk7CitiZmFfc3RhdHVzX3QgYmZhX2ZhYV9kaXNhYmxlKHN0cnVjdCBiZmFfcyAqYmZhLAorCQkJYmZhX2NiX2lvY2ZjX3QgY2Jmbiwgdm9pZCAqY2JhcmcpOworYmZhX3N0YXR1c190IGJmYV9mYWFfcXVlcnkoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfZmFhX2F0dHJfcyAqYXR0ciwKKwkJCWJmYV9jYl9pb2NmY190IGNiZm4sIHZvaWQgKmNiYXJnKTsKKworLyoKKyAqCUZDIERJQUcgZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGJmYV9mY2RpYWdfcXRlc3RfcyB7CisJc3RydWN0IGJmYV9kaWFnX3F0ZXN0X3Jlc3VsdF9zICpyZXN1bHQ7CisJYmZhX2NiX2RpYWdfdAljYmZuOworCXZvaWQJCSpjYmFyZzsKKwlzdHJ1Y3QgYmZhX3RpbWVyX3MJdGltZXI7CisJdTMyCXN0YXR1czsKKwl1MzIJY291bnQ7CisJdTgJbG9jazsKKwl1OAlxdWV1ZTsKKwl1OAlhbGw7CisJdTgJdGltZXJfYWN0aXZlOworfTsKKworc3RydWN0IGJmYV9mY2RpYWdfbGJfcyB7CisJYmZhX2NiX2RpYWdfdCAgIGNiZm47CisJdm9pZCAgICAgICAgICAgICpjYmFyZzsKKwl2b2lkICAgICAgICAgICAgKnJlc3VsdDsKKwliZmFfYm9vbGVhbl90ICAgbG9jazsKKwl1MzIgICAgICAgIHN0YXR1czsKK307CisKK3N0cnVjdCBiZmFfZmNkaWFnX3MgeworCXN0cnVjdCBiZmFfcyAgICAqYmZhOyAgICAgICAgICAgLyogQmFjayBwb2ludGVyIHRvIEJGQSAqLworCXN0cnVjdCBiZmFfdHJjX21vZF9zICAgKnRyY21vZDsKKwlzdHJ1Y3QgYmZhX2ZjZGlhZ19sYl9zIGxiOworCXN0cnVjdCBiZmFfZmNkaWFnX3F0ZXN0X3MgcXRlc3Q7Cit9OworCisjZGVmaW5lIEJGQV9GQ0RJQUdfTU9EKF9fYmZhKQkoJihfX2JmYSktPm1vZHVsZXMuZmNkaWFnKQorCit2b2lkCWJmYV9mY2RpYWdfaW50cihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbXNnKTsKKworYmZhX3N0YXR1c190CWJmYV9mY2RpYWdfbG9vcGJhY2soc3RydWN0IGJmYV9zICpiZmEsCisJCQkJZW51bSBiZmFfcG9ydF9vcG1vZGUgb3Btb2RlLAorCQkJCWVudW0gYmZhX3BvcnRfc3BlZWQgc3BlZWQsIHUzMiBscGNudCwgdTMyIHBhdCwKKwkJCQlzdHJ1Y3QgYmZhX2RpYWdfbG9vcGJhY2tfcmVzdWx0X3MgKnJlc3VsdCwKKwkJCQliZmFfY2JfZGlhZ190IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdAliZmFfZmNkaWFnX3F1ZXVldGVzdChzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyIGlnbm9yZSwKKwkJCXUzMiBxdWV1ZSwgc3RydWN0IGJmYV9kaWFnX3F0ZXN0X3Jlc3VsdF9zICpyZXN1bHQsCisJCQliZmFfY2JfZGlhZ190IGNiZm4sIHZvaWQgKmNiYXJnKTsKK2JmYV9zdGF0dXNfdAliZmFfZmNkaWFnX2xiX2lzX3J1bm5pbmcoc3RydWN0IGJmYV9zICpiZmEpOworCiAjZW5kaWYgLyogX19CRkFfU1ZDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYwppbmRleCA1OWI1ZTliLi5iZWIzMGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYwpAQCAtNTYsMTQgKzU2LDE1IEBACiBpbnQJCXBjaWVfbWF4X3JlYWRfcmVxc3o7CiBpbnQJCWJmYV9kZWJ1Z2ZzX2VuYWJsZSA9IDE7CiBpbnQJCW1zaXhfZGlzYWJsZV9jYiA9IDAsIG1zaXhfZGlzYWJsZV9jdCA9IDA7CitpbnQJCW1heF94ZmVyX3NpemUgPSBCRkFEX01BWF9TRUNUT1JTID4+IDE7CiAKIC8qIEZpcm13YXJlIHJlbGVhdGVkICovCi11MzIJYmZpX2ltYWdlX2N0X2ZjX3NpemUsIGJmaV9pbWFnZV9jdF9jbmFfc2l6ZSwgYmZpX2ltYWdlX2NiX2ZjX3NpemU7Ci11MzIgICAgICpiZmlfaW1hZ2VfY3RfZmMsICpiZmlfaW1hZ2VfY3RfY25hLCAqYmZpX2ltYWdlX2NiX2ZjOwordTMyCWJmaV9pbWFnZV9jYl9zaXplLCBiZmlfaW1hZ2VfY3Rfc2l6ZSwgYmZpX2ltYWdlX2N0Ml9zaXplOwordTMyCSpiZmlfaW1hZ2VfY2IsICpiZmlfaW1hZ2VfY3QsICpiZmlfaW1hZ2VfY3QyOwogCi0jZGVmaW5lIEJGQURfRldfRklMRV9DVF9GQyAgICAgICJjdGZ3X2ZjLmJpbiIKLSNkZWZpbmUgQkZBRF9GV19GSUxFX0NUX0NOQSAgICAgImN0ZndfY25hLmJpbiIKLSNkZWZpbmUgQkZBRF9GV19GSUxFX0NCX0ZDICAgICAgImNiZndfZmMuYmluIgorI2RlZmluZSBCRkFEX0ZXX0ZJTEVfQ0IJCSJjYmZ3LmJpbiIKKyNkZWZpbmUgQkZBRF9GV19GSUxFX0NUCQkiY3Rmdy5iaW4iCisjZGVmaW5lIEJGQURfRldfRklMRV9DVDIJImN0MmZ3LmJpbiIKIAogc3RhdGljIHUzMiAqYmZhZF9sb2FkX2Z3aW1nKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIHN0YXRpYyB2b2lkIGJmYWRfZnJlZV9md2ltZyh2b2lkKTsKQEAgLTcxLDE4ICs3MiwxOCBAQAogCQl1MzIgKmJmaV9pbWFnZV9zaXplLCBjaGFyICpmd19uYW1lKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1zaXhfbmFtZV9jdFtdID0geworCSJjdHJsIiwKIAkiY3BlMCIsICJjcGUxIiwgImNwZTIiLCAiY3BlMyIsCi0JInJtZTAiLCAicm1lMSIsICJybWUyIiwgInJtZTMiLAotCSJjdHJsIiB9OworCSJybWUwIiwgInJtZTEiLCAicm1lMiIsICJybWUzIiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqbXNpeF9uYW1lX2NiW10gPSB7CiAJImNwZTAiLCAiY3BlMSIsICJjcGUyIiwgImNwZTMiLAogCSJybWUwIiwgInJtZTEiLCAicm1lMiIsICJybWUzIiwKIAkiZWVtYyIsICJlbHB1MCIsICJlbHB1MSIsICJlcHNzIiwgIm1scHUiIH07CiAKLU1PRFVMRV9GSVJNV0FSRShCRkFEX0ZXX0ZJTEVfQ1RfRkMpOwotTU9EVUxFX0ZJUk1XQVJFKEJGQURfRldfRklMRV9DVF9DTkEpOwotTU9EVUxFX0ZJUk1XQVJFKEJGQURfRldfRklMRV9DQl9GQyk7CitNT0RVTEVfRklSTVdBUkUoQkZBRF9GV19GSUxFX0NCKTsKK01PRFVMRV9GSVJNV0FSRShCRkFEX0ZXX0ZJTEVfQ1QpOworTU9EVUxFX0ZJUk1XQVJFKEJGQURfRldfRklMRV9DVDIpOwogCiBtb2R1bGVfcGFyYW0ob3NfbmFtZSwgY2hhcnAsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0Mob3NfbmFtZSwgIk9TIG5hbWUgb2YgdGhlIGhiYSBob3N0IG1hY2hpbmUiKTsKQEAgLTE0NCw2ICsxNDUsOSBAQAogbW9kdWxlX3BhcmFtKGJmYV9kZWJ1Z2ZzX2VuYWJsZSwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGJmYV9kZWJ1Z2ZzX2VuYWJsZSwgIkVuYWJsZXMgZGVidWdmcyBmZWF0dXJlLCBkZWZhdWx0PTEsIgogCQkiIFJhbmdlW2ZhbHNlOjB8dHJ1ZToxXSIpOworbW9kdWxlX3BhcmFtKG1heF94ZmVyX3NpemUsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfeGZlcl9zaXplLCAiZGVmYXVsdD0zMk1CLCIKKwkJIiBSYW5nZVs2NGt8MTI4a3wyNTZrfDUxMmt8MTAyNGt8MjA0OGtdIik7CiAKIHN0YXRpYyB2b2lkCiBiZmFkX3NtX3VuaW5pdChzdHJ1Y3QgYmZhZF9zICpiZmFkLCBlbnVtIGJmYWRfc21fZXZlbnQgZXZlbnQpOwpAQCAtNTI3LDI4ICs1MzEsMjYgQEAKIHZvaWQKIGJmYWRfaGFsX21lbV9yZWxlYXNlKHN0cnVjdCBiZmFkX3MgKmJmYWQpCiB7Ci0JaW50CQlpOwogCXN0cnVjdCBiZmFfbWVtaW5mb19zICpoYWxfbWVtaW5mbyA9ICZiZmFkLT5tZW1pbmZvOwotCXN0cnVjdCBiZmFfbWVtX2VsZW1fcyAqbWVtaW5mb19lbGVtOworCXN0cnVjdCBiZmFfbWVtX2RtYV9zICpkbWFfaW5mbywgKmRtYV9lbGVtOworCXN0cnVjdCBiZmFfbWVtX2t2YV9zICprdmFfaW5mbywgKmt2YV9lbGVtOworCXN0cnVjdCBsaXN0X2hlYWQgKmRtX3FlLCAqa21fcWU7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQkZBX01FTV9UWVBFX01BWDsgaSsrKSB7Ci0JCW1lbWluZm9fZWxlbSA9ICZoYWxfbWVtaW5mby0+bWVtaW5mb1tpXTsKLQkJaWYgKG1lbWluZm9fZWxlbS0+a3ZhICE9IE5VTEwpIHsKLQkJCXN3aXRjaCAobWVtaW5mb19lbGVtLT5tZW1fdHlwZSkgewotCQkJY2FzZSBCRkFfTUVNX1RZUEVfS1ZBOgotCQkJCXZmcmVlKG1lbWluZm9fZWxlbS0+a3ZhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQkZBX01FTV9UWVBFX0RNQToKLQkJCQlkbWFfZnJlZV9jb2hlcmVudCgmYmZhZC0+cGNpZGV2LT5kZXYsCi0JCQkJCW1lbWluZm9fZWxlbS0+bWVtX2xlbiwKLQkJCQkJbWVtaW5mb19lbGVtLT5rdmEsCi0JCQkJCShkbWFfYWRkcl90KSBtZW1pbmZvX2VsZW0tPmRtYSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCVdBUk5fT04oMSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKwlkbWFfaW5mbyA9ICZoYWxfbWVtaW5mby0+ZG1hX2luZm87CisJa3ZhX2luZm8gPSAmaGFsX21lbWluZm8tPmt2YV9pbmZvOworCisJLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBLVkEgbWVtaW5mbyBxdWV1ZSAqLworCWxpc3RfZm9yX2VhY2goa21fcWUsICZrdmFfaW5mby0+cWUpIHsKKwkJa3ZhX2VsZW0gPSAoc3RydWN0IGJmYV9tZW1fa3ZhX3MgKikga21fcWU7CisJCXZmcmVlKGt2YV9lbGVtLT5rdmEpOworCX0KKworCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgRE1BIG1lbWluZm8gcXVldWUgKi8KKwlsaXN0X2Zvcl9lYWNoKGRtX3FlLCAmZG1hX2luZm8tPnFlKSB7CisJCWRtYV9lbGVtID0gKHN0cnVjdCBiZmFfbWVtX2RtYV9zICopIGRtX3FlOworCQlkbWFfZnJlZV9jb2hlcmVudCgmYmZhZC0+cGNpZGV2LT5kZXYsCisJCQkJZG1hX2VsZW0tPm1lbV9sZW4sIGRtYV9lbGVtLT5rdmEsCisJCQkJKGRtYV9hZGRyX3QpIGRtYV9lbGVtLT5kbWEpOwogCX0KIAogCW1lbXNldChoYWxfbWVtaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfbWVtaW5mb19zKSk7CkBAIC01NjMsMTUgKzU2NSwxNSBAQAogCQliZmFfY2ZnLT5md2NmZy5udW1faW9pbV9yZXFzID0gbnVtX2lvczsKIAlpZiAobnVtX3RtcyA+IDApCiAJCWJmYV9jZmctPmZ3Y2ZnLm51bV90c2tpbV9yZXFzID0gbnVtX3RtczsKLQlpZiAobnVtX2ZjeHBzID4gMCkKKwlpZiAobnVtX2ZjeHBzID4gMCAmJiBudW1fZmN4cHMgPD0gQkZBX0ZDWFBfTUFYKQogCQliZmFfY2ZnLT5md2NmZy5udW1fZmN4cF9yZXFzID0gbnVtX2ZjeHBzOwotCWlmIChudW1fdWZidWZzID4gMCkKKwlpZiAobnVtX3VmYnVmcyA+IDAgJiYgbnVtX3VmYnVmcyA8PSBCRkFfVUZfTUFYKQogCQliZmFfY2ZnLT5md2NmZy5udW1fdWZfYnVmcyA9IG51bV91ZmJ1ZnM7CiAJaWYgKHJlcXFfc2l6ZSA+IDApCiAJCWJmYV9jZmctPmRydmNmZy5udW1fcmVxcV9lbGVtcyA9IHJlcXFfc2l6ZTsKIAlpZiAocnNwcV9zaXplID4gMCkKIAkJYmZhX2NmZy0+ZHJ2Y2ZnLm51bV9yc3BxX2VsZW1zID0gcnNwcV9zaXplOwotCWlmIChudW1fc2dwZ3MgPiAwKQorCWlmIChudW1fc2dwZ3MgPiAwICYmIG51bV9zZ3BncyA8PSBCRkFfU0dQR19NQVgpCiAJCWJmYV9jZmctPmRydmNmZy5udW1fc2dwZ3MgPSBudW1fc2dwZ3M7CiAKIAkvKgpAQCAtNTkxLDg1ICs1OTMsNDYgQEAKIGJmYV9zdGF0dXNfdAogYmZhZF9oYWxfbWVtX2FsbG9jKHN0cnVjdCBiZmFkX3MgKmJmYWQpCiB7Ci0JaW50CQlpOwogCXN0cnVjdCBiZmFfbWVtaW5mb19zICpoYWxfbWVtaW5mbyA9ICZiZmFkLT5tZW1pbmZvOwotCXN0cnVjdCBiZmFfbWVtX2VsZW1fcyAqbWVtaW5mb19lbGVtOwotCWRtYV9hZGRyX3QJcGh5c19hZGRyOwotCXZvaWQJICAgICAgICprdmE7CisJc3RydWN0IGJmYV9tZW1fZG1hX3MgKmRtYV9pbmZvLCAqZG1hX2VsZW07CisJc3RydWN0IGJmYV9tZW1fa3ZhX3MgKmt2YV9pbmZvLCAqa3ZhX2VsZW07CisJc3RydWN0IGxpc3RfaGVhZCAqZG1fcWUsICprbV9xZTsKIAliZmFfc3RhdHVzX3QJcmMgPSBCRkFfU1RBVFVTX09LOwotCWludCByZXRyeV9jb3VudCA9IDA7Ci0JaW50IHJlc2V0X3ZhbHVlID0gMTsKLQlpbnQgbWluX251bV9zZ3BncyA9IDUxMjsKKwlkbWFfYWRkcl90CXBoeXNfYWRkcjsKIAogCWJmYV9jZmdfZ2V0X2RlZmF1bHQoJmJmYWQtPmlvY19jZmcpOwotCi1yZXRyeToKIAliZmFkX3VwZGF0ZV9oYWxfY2ZnKCZiZmFkLT5pb2NfY2ZnKTsKIAliZmFkLT5jZmdfZGF0YS5pb2NfcXVldWVfZGVwdGggPSBiZmFkLT5pb2NfY2ZnLmZ3Y2ZnLm51bV9pb2ltX3JlcXM7Ci0JYmZhX2NmZ19nZXRfbWVtaW5mbygmYmZhZC0+aW9jX2NmZywgaGFsX21lbWluZm8pOworCWJmYV9jZmdfZ2V0X21lbWluZm8oJmJmYWQtPmlvY19jZmcsIGhhbF9tZW1pbmZvLCAmYmZhZC0+YmZhKTsKIAotCWZvciAoaSA9IDA7IGkgPCBCRkFfTUVNX1RZUEVfTUFYOyBpKyspIHsKLQkJbWVtaW5mb19lbGVtID0gJmhhbF9tZW1pbmZvLT5tZW1pbmZvW2ldOwotCQlzd2l0Y2ggKG1lbWluZm9fZWxlbS0+bWVtX3R5cGUpIHsKLQkJY2FzZSBCRkFfTUVNX1RZUEVfS1ZBOgotCQkJa3ZhID0gdm1hbGxvYyhtZW1pbmZvX2VsZW0tPm1lbV9sZW4pOwotCQkJaWYgKGt2YSA9PSBOVUxMKSB7Ci0JCQkJYmZhZF9oYWxfbWVtX3JlbGVhc2UoYmZhZCk7Ci0JCQkJcmMgPSBCRkFfU1RBVFVTX0VOT01FTTsKLQkJCQlnb3RvIGV4dDsKLQkJCX0KLQkJCW1lbXNldChrdmEsIDAsIG1lbWluZm9fZWxlbS0+bWVtX2xlbik7Ci0JCQltZW1pbmZvX2VsZW0tPmt2YSA9IGt2YTsKLQkJCWJyZWFrOwotCQljYXNlIEJGQV9NRU1fVFlQRV9ETUE6Ci0JCQlrdmEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmJmYWQtPnBjaWRldi0+ZGV2LAotCQkJCW1lbWluZm9fZWxlbS0+bWVtX2xlbiwgJnBoeXNfYWRkciwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoa3ZhID09IE5VTEwpIHsKLQkJCQliZmFkX2hhbF9tZW1fcmVsZWFzZShiZmFkKTsKLQkJCQkvKgotCQkJCSAqIElmIHdlIGNhbm5vdCBhbGxvY2F0ZSB3aXRoIGRlZmF1bHQKLQkJCQkgKiBudW1fc2dwYWdlcyB0cnkgd2l0aCBoYWxmIHRoZSB2YWx1ZS4KLQkJCQkgKi8KLQkJCQlpZiAobnVtX3NncGdzID4gbWluX251bV9zZ3BncykgewotCQkJCQlwcmludGsoS0VSTl9JTkZPCi0JCQkJCSJiZmFkWyVkXTogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIgotCQkJCQkiIHdpdGggbnVtX3NncGdzOiAlZFxuIiwKLQkJCQkJCWJmYWQtPmluc3Rfbm8sIG51bV9zZ3Bncyk7Ci0JCQkJCW5leHRMb3dlckludCgmbnVtX3NncGdzKTsKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCQkiYmZhZFslZF06IHRyeWluZyB0byBhbGxvY2F0ZSBtZW1vcnkiCi0JCQkJCSIgd2l0aCBudW1fc2dwZ3M6ICVkXG4iLAotCQkJCQkJYmZhZC0+aW5zdF9ubywgbnVtX3NncGdzKTsKLQkJCQkJcmV0cnlfY291bnQrKzsKLQkJCQkJZ290byByZXRyeTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobnVtX3NncGdzX3Bhcm0gPiAwKQotCQkJCQkJbnVtX3NncGdzID0gbnVtX3NncGdzX3Bhcm07Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVzZXRfdmFsdWUgPQotCQkJCQkJCSgxIDw8IHJldHJ5X2NvdW50KTsKLQkJCQkJCW51bV9zZ3BncyAqPSByZXNldF92YWx1ZTsKLQkJCQkJfQotCQkJCQlyYyA9IEJGQV9TVEFUVVNfRU5PTUVNOwotCQkJCQlnb3RvIGV4dDsKLQkJCQl9Ci0JCQl9CisJZG1hX2luZm8gPSAmaGFsX21lbWluZm8tPmRtYV9pbmZvOworCWt2YV9pbmZvID0gJmhhbF9tZW1pbmZvLT5rdmFfaW5mbzsKIAotCQkJaWYgKG51bV9zZ3Bnc19wYXJtID4gMCkKLQkJCQludW1fc2dwZ3MgPSBudW1fc2dwZ3NfcGFybTsKLQkJCWVsc2UgewotCQkJCXJlc2V0X3ZhbHVlID0gKDEgPDwgcmV0cnlfY291bnQpOwotCQkJCW51bV9zZ3BncyAqPSByZXNldF92YWx1ZTsKLQkJCX0KLQotCQkJbWVtc2V0KGt2YSwgMCwgbWVtaW5mb19lbGVtLT5tZW1fbGVuKTsKLQkJCW1lbWluZm9fZWxlbS0+a3ZhID0ga3ZhOwotCQkJbWVtaW5mb19lbGVtLT5kbWEgPSBwaHlzX2FkZHI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCisJLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBLVkEgbWVtaW5mbyBxdWV1ZSAqLworCWxpc3RfZm9yX2VhY2goa21fcWUsICZrdmFfaW5mby0+cWUpIHsKKwkJa3ZhX2VsZW0gPSAoc3RydWN0IGJmYV9tZW1fa3ZhX3MgKikga21fcWU7CisJCWt2YV9lbGVtLT5rdmEgPSB2bWFsbG9jKGt2YV9lbGVtLT5tZW1fbGVuKTsKKwkJaWYgKGt2YV9lbGVtLT5rdmEgPT0gTlVMTCkgeworCQkJYmZhZF9oYWxfbWVtX3JlbGVhc2UoYmZhZCk7CisJCQlyYyA9IEJGQV9TVEFUVVNfRU5PTUVNOworCQkJZ290byBleHQ7CiAJCX0KKwkJbWVtc2V0KGt2YV9lbGVtLT5rdmEsIDAsIGt2YV9lbGVtLT5tZW1fbGVuKTsKKwl9CisKKwkvKiBJdGVyYXRlIHRocm91Z2ggdGhlIERNQSBtZW1pbmZvIHF1ZXVlICovCisJbGlzdF9mb3JfZWFjaChkbV9xZSwgJmRtYV9pbmZvLT5xZSkgeworCQlkbWFfZWxlbSA9IChzdHJ1Y3QgYmZhX21lbV9kbWFfcyAqKSBkbV9xZTsKKwkJZG1hX2VsZW0tPmt2YSA9IGRtYV9hbGxvY19jb2hlcmVudCgmYmZhZC0+cGNpZGV2LT5kZXYsCisJCQkJCQlkbWFfZWxlbS0+bWVtX2xlbiwKKwkJCQkJCSZwaHlzX2FkZHIsIEdGUF9LRVJORUwpOworCQlpZiAoZG1hX2VsZW0tPmt2YSA9PSBOVUxMKSB7CisJCQliZmFkX2hhbF9tZW1fcmVsZWFzZShiZmFkKTsKKwkJCXJjID0gQkZBX1NUQVRVU19FTk9NRU07CisJCQlnb3RvIGV4dDsKKwkJfQorCQlkbWFfZWxlbS0+ZG1hID0gcGh5c19hZGRyOworCQltZW1zZXQoZG1hX2VsZW0tPmt2YSwgMCwgZG1hX2VsZW0tPm1lbV9sZW4pOwogCX0KIGV4dDoKIAlyZXR1cm4gcmM7CkBAIC03ODAsMTMgKzc0MywxNyBAQAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCiAKLQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKSAhPSAwKQotCQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSAhPSAwKSB7CisJaWYgKChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpICE9IDApIHx8CisJICAgIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkgIT0gMCkpIHsKKwkJaWYgKChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpICE9IDApIHx8CisJCSAgIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkgIT0gMCkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAicGNpX3NldF9kbWFfbWFzayBmYWlsICVwXG4iLCBwZGV2KTsKIAkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwogCQl9CisJfQogCiAJYmZhZC0+cGNpX2JhcjBfa3ZhID0gcGNpX2lvbWFwKHBkZXYsIDAsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCWJmYWQtPnBjaV9iYXIyX2t2YSA9IHBjaV9pb21hcChwZGV2LCAyLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpKTsKIAogCWlmIChiZmFkLT5wY2lfYmFyMF9rdmEgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gbWFwIGJhcjBcbiIpOwpAQCAtNzk3LDYgKzc2NCw3IEBACiAJYmZhZC0+aGFsX3BjaWRldi5wY2lfZnVuYyA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKIAliZmFkLT5oYWxfcGNpZGV2LnBjaV9iYXJfa3ZhID0gYmZhZC0+cGNpX2JhcjBfa3ZhOwogCWJmYWQtPmhhbF9wY2lkZXYuZGV2aWNlX2lkID0gcGRldi0+ZGV2aWNlOworCWJmYWQtPmhhbF9wY2lkZXYuc3NpZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CiAJYmZhZC0+cGNpX25hbWUgPSBwY2lfbmFtZShwZGV2KTsKIAogCWJmYWQtPnBjaV9hdHRyLnZlbmRvcl9pZCA9IHBkZXYtPnZlbmRvcjsKQEAgLTg2OCw2ICs4MzYsNyBAQAogYmZhZF9wY2lfdW5pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgYmZhZF9zICpiZmFkKQogewogCXBjaV9pb3VubWFwKHBkZXYsIGJmYWQtPnBjaV9iYXIwX2t2YSk7CisJcGNpX2lvdW5tYXAocGRldiwgYmZhZC0+cGNpX2JhcjJfa3ZhKTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CkBAIC05MDgsMTIgKzg3NywyOSBAQAogCWJmYWQtPmJmYV9mY3MudHJjbW9kID0gYmZhZC0+dHJjbW9kOwogCWJmYV9mY3NfYXR0YWNoKCZiZmFkLT5iZmFfZmNzLCAmYmZhZC0+YmZhLCBiZmFkLCBCRkFfRkFMU0UpOwogCWJmYWQtPmJmYV9mY3MuZmRtaV9lbmFibGVkID0gZmRtaV9lbmFibGU7CisJYmZhX2Zjc19pbml0KCZiZmFkLT5iZmFfZmNzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKIAogCWJmYWQtPmJmYWRfZmxhZ3MgfD0gQkZBRF9EUlZfSU5JVF9ET05FOwogCisJLyogY29uZmlndXJlIGJhc2UgcG9ydCAqLworCXJjID0gYmZhZF9jZmdfcHBvcnQoYmZhZCwgQkZBX0xQT1JUX1JPTEVfRkNQX0lNKTsKKwlpZiAocmMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXRfY2ZnX3Bwb3J0X2ZhaWw7CisKIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKIAorb3V0X2NmZ19wcG9ydF9mYWlsOgorCS8qIGZjcyBleGl0IC0gb24gY2ZnIHBwb3J0IGZhaWx1cmUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW5pdF9jb21wbGV0aW9uKCZiZmFkLT5jb21wKTsKKwliZmFkLT5wcG9ydC5mbGFncyB8PSBCRkFEX1BPUlRfREVMRVRFOworCWJmYV9mY3NfZXhpdCgmYmZhZC0+YmZhX2Zjcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYmZhZC0+Y29tcCk7CisJLyogYmZhIGRldGFjaCAtIGZyZWUgaGFsIG1lbW9yeSAqLworCWJmYV9kZXRhY2goJmJmYWQtPmJmYSk7CisJYmZhZF9oYWxfbWVtX3JlbGVhc2UoYmZhZCk7CiBvdXRfaGFsX21lbV9hbGxvY19mYWlsdXJlOgogCXJldHVybiBCRkFfU1RBVFVTX0ZBSUxFRDsKIH0KQEAgLTk0NSw2ICs5MzEsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwogCWJmYV9pb2NmY19zdGFydCgmYmZhZC0+YmZhKTsKKwliZmFfZmNzX3BiY192cG9ydF9pbml0KCZiZmFkLT5iZmFfZmNzKTsKIAliZmFfZmNzX2ZhYnJpY19tb2RzdGFydCgmYmZhZC0+YmZhX2Zjcyk7CiAJYmZhZC0+YmZhZF9mbGFncyB8PSBCRkFEX0hBTF9TVEFSVF9ET05FOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwpAQCAtMTAzMiw2ICsxMDE5LDEyIEBACiAJc3RydWN0IGJmYWRfdnBvcnRfcyAqdnBvcnQsICp2cG9ydF9uZXc7CiAJc3RydWN0IGJmYV9mY3NfZHJpdmVyX2luZm9fcyBkcml2ZXJfaW5mbzsKIAorCS8qIExpbWl0IG1pbi9tYXguIHhmZXIgc2l6ZSB0byBbNjRrLTMyTUJdICovCisJaWYgKG1heF94ZmVyX3NpemUgPCBCRkFEX01JTl9TRUNUT1JTID4+IDEpCisJCW1heF94ZmVyX3NpemUgPSBCRkFEX01JTl9TRUNUT1JTID4+IDE7CisJaWYgKG1heF94ZmVyX3NpemUgPiBCRkFEX01BWF9TRUNUT1JTID4+IDEpCisJCW1heF94ZmVyX3NpemUgPSBCRkFEX01BWF9TRUNUT1JTID4+IDE7CisKIAkvKiBGaWxsIHRoZSBkcml2ZXJfaW5mbyBpbmZvIHRvIGZjcyovCiAJbWVtc2V0KCZkcml2ZXJfaW5mbywgMCwgc2l6ZW9mKGRyaXZlcl9pbmZvKSk7CiAJc3RybmNweShkcml2ZXJfaW5mby52ZXJzaW9uLCBCRkFEX0RSSVZFUl9WRVJTSU9OLApAQCAtMTA0OSwxOSArMTA0MiwxOSBAQAogCXN0cm5jcHkoZHJpdmVyX2luZm8ub3NfZGV2aWNlX25hbWUsIGJmYWQtPnBjaV9uYW1lLAogCQlzaXplb2YoZHJpdmVyX2luZm8ub3NfZGV2aWNlX25hbWUgLSAxKSk7CiAKLQkvKiBGQ1MgSU5JVCAqLworCS8qIEZDUyBkcml2ZXIgaW5mbyBpbml0ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwogCWJmYV9mY3NfZHJpdmVyX2luZm9faW5pdCgmYmZhZC0+YmZhX2ZjcywgJmRyaXZlcl9pbmZvKTsKLQliZmFfZmNzX2luaXQoJmJmYWQtPmJmYV9mY3MpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwogCi0JcmV0dmFsID0gYmZhZF9jZmdfcHBvcnQoYmZhZCwgQkZBX0xQT1JUX1JPTEVfRkNQX0lNKTsKLQlpZiAocmV0dmFsICE9IEJGQV9TVEFUVVNfT0spIHsKLQkJaWYgKGJmYV9zbV9jbXBfc3RhdGUoYmZhZCwgYmZhZF9zbV9pbml0aWFsaXppbmcpKQotCQkJYmZhX3NtX3NldF9zdGF0ZShiZmFkLCBiZmFkX3NtX2ZhaWxlZCk7Ci0JCWJmYWRfc3RvcChiZmFkKTsKLQkJcmV0dXJuIEJGQV9TVEFUVVNfRkFJTEVEOwotCX0KKwkvKgorCSAqIEZDUyB1cGRhdGUgY2ZnIC0gcmVzZXQgdGhlIHB3d24vbnd3biBvZiBmYWJyaWMgYmFzZSBsb2dpY2FsIHBvcnQKKwkgKiB3aXRoIHZhbHVlcyBsZWFybmVkIGR1cmluZyBiZmFfaW5pdCBmaXJtd2FyZSBHRVRBVFRSIFJFUS4KKwkgKi8KKwliZmFfZmNzX3VwZGF0ZV9jZmcoJmJmYWQtPmJmYV9mY3MpOworCisJLyogU2V0dXAgZmMgaG9zdCBmaXhlZCBhdHRyaWJ1dGUgaWYgdGhlIGxrIHN1cHBvcnRzICovCisJYmZhZF9mY19ob3N0X2luaXQoYmZhZC0+cHBvcnQuaW1fcG9ydCk7CiAKIAkvKiBCRkFEIGxldmVsIEZDNCBJTSBzcGVjaWZpYyByZXNvdXJjZSBhbGxvY2F0aW9uICovCiAJcmV0dmFsID0gYmZhZF9pbV9wcm9iZShiZmFkKTsKQEAgLTEyMzMsOCArMTIyNiw4IEBACiAJZm9yIChpID0gMDsgaSA8IGJmYWQtPm52ZWM7IGkrKykgewogCQlzcHJpbnRmKGJmYWQtPm1zaXhfdGFiW2ldLm5hbWUsICJiZmEtJXMtJXMiLAogCQkJCWJmYWQtPnBjaV9uYW1lLAotCQkJCSgoYmZhX2FzaWNfaWRfY3QoYmZhZC0+aGFsX3BjaWRldi5kZXZpY2VfaWQpKSA/Ci0JCQkJbXNpeF9uYW1lX2N0W2ldIDogbXNpeF9uYW1lX2NiW2ldKSk7CisJCQkJKChiZmFfYXNpY19pZF9jYihiZmFkLT5oYWxfcGNpZGV2LmRldmljZV9pZCkpID8KKwkJCQltc2l4X25hbWVfY2JbaV0gOiBtc2l4X25hbWVfY3RbaV0pKTsKIAogCQllcnJvciA9IHJlcXVlc3RfaXJxKGJmYWQtPm1zaXhfdGFiW2ldLm1zaXgudmVjdG9yLAogCQkJCSAgICAoaXJxX2hhbmRsZXJfdCkgYmZhZF9tc2l4LCAwLApAQCAtMTI0OCw2ICsxMjQxLDkgQEAKIAkJCQlmcmVlX2lycShiZmFkLT5tc2l4X3RhYltqXS5tc2l4LnZlY3RvciwKIAkJCQkJCSZiZmFkLT5tc2l4X3RhYltqXSk7CiAKKwkJCWJmYWQtPmJmYWRfZmxhZ3MgJj0gfkJGQURfTVNJWF9PTjsKKwkJCXBjaV9kaXNhYmxlX21zaXgoYmZhZC0+cGNpZGV2KTsKKwogCQkJcmV0dXJuIDE7CiAJCX0KIAl9CkBAIC0xMjY1LDYgKzEyNjEsNyBAQAogCXUzMiBtYXNrID0gMCwgaSwgbnVtX2JpdCA9IDAsIG1heF9iaXQgPSAwOwogCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhfZW50cmllc1tNQVhfTVNJWF9FTlRSWV07CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBiZmFkLT5wY2lkZXY7CisJdTE2CXJlZzsKIAogCS8qIENhbGwgQkZBIHRvIGdldCB0aGUgbXNpeCBtYXAgZm9yIHRoaXMgUENJIGZ1bmN0aW9uLiAgKi8KIAliZmFfbXNpeF9nZXR2ZWNzKCZiZmFkLT5iZmEsICZtYXNrLCAmbnVtX2JpdCwgJm1heF9iaXQpOwpAQCAtMTI3Miw4ICsxMjY5LDggQEAKIAkvKiBTZXQgdXAgdGhlIG1zaXggZW50cnkgdGFibGUgKi8KIAliZmFkX2luaXRfbXNpeF9lbnRyeShiZmFkLCBtc2l4X2VudHJpZXMsIG1hc2ssIG1heF9iaXQpOwogCi0JaWYgKChiZmFfYXNpY19pZF9jdChwZGV2LT5kZXZpY2UpICYmICFtc2l4X2Rpc2FibGVfY3QpIHx8Ci0JICAgICghYmZhX2FzaWNfaWRfY3QocGRldi0+ZGV2aWNlKSAmJiAhbXNpeF9kaXNhYmxlX2NiKSkgeworCWlmICgoYmZhX2FzaWNfaWRfY3RjKHBkZXYtPmRldmljZSkgJiYgIW1zaXhfZGlzYWJsZV9jdCkgfHwKKwkgICAoYmZhX2FzaWNfaWRfY2IocGRldi0+ZGV2aWNlKSAmJiAhbXNpeF9kaXNhYmxlX2NiKSkgewogCiAJCWVycm9yID0gcGNpX2VuYWJsZV9tc2l4KGJmYWQtPnBjaWRldiwgbXNpeF9lbnRyaWVzLCBiZmFkLT5udmVjKTsKIAkJaWYgKGVycm9yKSB7CkBAIC0xMjk0LDYgKzEyOTEsMTMgQEAKIAkJCWdvdG8gbGluZV9iYXNlZDsKIAkJfQogCisJCS8qIERpc2FibGUgSU5UWCBpbiBNU0ktWCBtb2RlICovCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmcmVnKTsKKworCQlpZiAoIShyZWcgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpKQorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELAorCQkJCXJlZyB8IFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSk7CisKIAkJLyogU2F2ZSB0aGUgdmVjdG9ycyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgYmZhZC0+bnZlYzsgaSsrKSB7CiAJCQliZmFfdHJjKGJmYWQsIG1zaXhfZW50cmllc1tpXS52ZWN0b3IpOwpAQCAtMTMxNSw2ICsxMzE5LDcgQEAKIAkJLyogRW5hYmxlIGludGVycnVwdCBoYW5kbGVyIGZhaWxlZCAqLwogCQlyZXR1cm4gMTsKIAl9CisJYmZhZC0+YmZhZF9mbGFncyB8PSBCRkFEX0lOVFhfT047CiAKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xMzMxLDcgKzEzMzYsNyBAQAogCiAJCXBjaV9kaXNhYmxlX21zaXgoYmZhZC0+cGNpZGV2KTsKIAkJYmZhZC0+YmZhZF9mbGFncyAmPSB+QkZBRF9NU0lYX09OOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChiZmFkLT5iZmFkX2ZsYWdzICYgQkZBRF9JTlRYX09OKSB7CiAJCWZyZWVfaXJxKGJmYWQtPnBjaWRldi0+aXJxLCBiZmFkKTsKIAl9CiB9CkBAIC0xNTAxLDYgKzE1MDYsMTQgQEAKIAkJLmNsYXNzID0gKFBDSV9DTEFTU19TRVJJQUxfRklCRVIgPDwgOCksCiAJCS5jbGFzc19tYXNrID0gfjAsCiAJfSwKKwl7CisJCS52ZW5kb3IgPSBCRkFfUENJX1ZFTkRPUl9JRF9CUk9DQURFLAorCQkuZGV2aWNlID0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QyLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5jbGFzcyA9IChQQ0lfQ0xBU1NfU0VSSUFMX0ZJQkVSIDw8IDgpLAorCQkuY2xhc3NfbWFzayA9IH4wLAorCX0sCiAKIAl7MCwgMH0sCiB9OwpAQCAtMTU5NCwzMyArMTYwNywzMyBAQAogc3RhdGljIHUzMiAqCiBiZmFkX2xvYWRfZndpbWcoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0JaWYgKHBkZXYtPmRldmljZSA9PSBCRkFfUENJX0RFVklDRV9JRF9DVF9GQykgewotCQlpZiAoYmZpX2ltYWdlX2N0X2ZjX3NpemUgPT0gMCkKLQkJCWJmYWRfcmVhZF9maXJtd2FyZShwZGV2LCAmYmZpX2ltYWdlX2N0X2ZjLAotCQkJCSZiZmlfaW1hZ2VfY3RfZmNfc2l6ZSwgQkZBRF9GV19GSUxFX0NUX0ZDKTsKLQkJcmV0dXJuIGJmaV9pbWFnZV9jdF9mYzsKLQl9IGVsc2UgaWYgKHBkZXYtPmRldmljZSA9PSBCRkFfUENJX0RFVklDRV9JRF9DVCkgewotCQlpZiAoYmZpX2ltYWdlX2N0X2NuYV9zaXplID09IDApCi0JCQliZmFkX3JlYWRfZmlybXdhcmUocGRldiwgJmJmaV9pbWFnZV9jdF9jbmEsCi0JCQkJJmJmaV9pbWFnZV9jdF9jbmFfc2l6ZSwgQkZBRF9GV19GSUxFX0NUX0NOQSk7Ci0JCXJldHVybiBiZmlfaW1hZ2VfY3RfY25hOworCWlmIChwZGV2LT5kZXZpY2UgPT0gQkZBX1BDSV9ERVZJQ0VfSURfQ1QyKSB7CisJCWlmIChiZmlfaW1hZ2VfY3QyX3NpemUgPT0gMCkKKwkJCWJmYWRfcmVhZF9maXJtd2FyZShwZGV2LCAmYmZpX2ltYWdlX2N0MiwKKwkJCQkmYmZpX2ltYWdlX2N0Ml9zaXplLCBCRkFEX0ZXX0ZJTEVfQ1QyKTsKKwkJcmV0dXJuIGJmaV9pbWFnZV9jdDI7CisJfSBlbHNlIGlmIChiZmFfYXNpY19pZF9jdChwZGV2LT5kZXZpY2UpKSB7CisJCWlmIChiZmlfaW1hZ2VfY3Rfc2l6ZSA9PSAwKQorCQkJYmZhZF9yZWFkX2Zpcm13YXJlKHBkZXYsICZiZmlfaW1hZ2VfY3QsCisJCQkJJmJmaV9pbWFnZV9jdF9zaXplLCBCRkFEX0ZXX0ZJTEVfQ1QpOworCQlyZXR1cm4gYmZpX2ltYWdlX2N0OwogCX0gZWxzZSB7Ci0JCWlmIChiZmlfaW1hZ2VfY2JfZmNfc2l6ZSA9PSAwKQotCQkJYmZhZF9yZWFkX2Zpcm13YXJlKHBkZXYsICZiZmlfaW1hZ2VfY2JfZmMsCi0JCQkJJmJmaV9pbWFnZV9jYl9mY19zaXplLCBCRkFEX0ZXX0ZJTEVfQ0JfRkMpOwotCQlyZXR1cm4gYmZpX2ltYWdlX2NiX2ZjOworCQlpZiAoYmZpX2ltYWdlX2NiX3NpemUgPT0gMCkKKwkJCWJmYWRfcmVhZF9maXJtd2FyZShwZGV2LCAmYmZpX2ltYWdlX2NiLAorCQkJCSZiZmlfaW1hZ2VfY2Jfc2l6ZSwgQkZBRF9GV19GSUxFX0NCKTsKKwkJcmV0dXJuIGJmaV9pbWFnZV9jYjsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkCiBiZmFkX2ZyZWVfZndpbWcodm9pZCkKIHsKLQlpZiAoYmZpX2ltYWdlX2N0X2ZjX3NpemUgJiYgYmZpX2ltYWdlX2N0X2ZjKQotCQl2ZnJlZShiZmlfaW1hZ2VfY3RfZmMpOwotCWlmIChiZmlfaW1hZ2VfY3RfY25hX3NpemUgJiYgYmZpX2ltYWdlX2N0X2NuYSkKLQkJdmZyZWUoYmZpX2ltYWdlX2N0X2NuYSk7Ci0JaWYgKGJmaV9pbWFnZV9jYl9mY19zaXplICYmIGJmaV9pbWFnZV9jYl9mYykKLQkJdmZyZWUoYmZpX2ltYWdlX2NiX2ZjKTsKKwlpZiAoYmZpX2ltYWdlX2N0Ml9zaXplICYmIGJmaV9pbWFnZV9jdDIpCisJCXZmcmVlKGJmaV9pbWFnZV9jdDIpOworCWlmIChiZmlfaW1hZ2VfY3Rfc2l6ZSAmJiBiZmlfaW1hZ2VfY3QpCisJCXZmcmVlKGJmaV9pbWFnZV9jdCk7CisJaWYgKGJmaV9pbWFnZV9jYl9zaXplICYmIGJmaV9pbWFnZV9jYikKKwkJdmZyZWUoYmZpX2ltYWdlX2NiKTsKIH0KIAogbW9kdWxlX2luaXQoYmZhZF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYXR0ci5jCmluZGV4IGE5NGVhNDIuLjlkOTU4NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2F0dHIuYwpAQCAtMjE4LDYgKzIxOCw5IEBACiAJY2FzZSBCRkFfUE9SVF9TUEVFRF8xMEdCUFM6CiAJCWZjX2hvc3Rfc3BlZWQoc2hvc3QpID0gRkNfUE9SVFNQRUVEXzEwR0JJVDsKIAkJYnJlYWs7CisJY2FzZSBCRkFfUE9SVF9TUEVFRF8xNkdCUFM6CisJCWZjX2hvc3Rfc3BlZWQoc2hvc3QpID0gRkNfUE9SVFNQRUVEXzE2R0JJVDsKKwkJYnJlYWs7CiAJY2FzZSBCRkFfUE9SVF9TUEVFRF84R0JQUzoKIAkJZmNfaG9zdF9zcGVlZChzaG9zdCkgPSBGQ19QT1JUU1BFRURfOEdCSVQ7CiAJCWJyZWFrOwpAQCAtNTgwLDYgKzU4Myw4IEBACiAJLnZwb3J0X2NyZWF0ZSA9IGJmYWRfaW1fdnBvcnRfY3JlYXRlLAogCS52cG9ydF9kZWxldGUgPSBiZmFkX2ltX3Zwb3J0X2RlbGV0ZSwKIAkudnBvcnRfZGlzYWJsZSA9IGJmYWRfaW1fdnBvcnRfZGlzYWJsZSwKKwkuYnNnX3JlcXVlc3QgPSBiZmFkX2ltX2JzZ19yZXF1ZXN0LAorCS5ic2dfdGltZW91dCA9IGJmYWRfaW1fYnNnX3RpbWVvdXQsCiB9OwogCiBzdHJ1Y3QgZmNfZnVuY3Rpb25fdGVtcGxhdGUgYmZhZF9pbV92cG9ydF9mY19mdW5jdGlvbl90ZW1wbGF0ZSA9IHsKQEAgLTY3NCw4ICs2NzksMTAgQEAKIAlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gaW1fcG9ydC0+YmZhZDsKIAljaGFyIG1vZGVsW0JGQV9BREFQVEVSX01PREVMX05BTUVfTEVOXTsKIAljaGFyIG1vZGVsX2Rlc2NyW0JGQV9BREFQVEVSX01PREVMX0RFU0NSX0xFTl07CisJaW50IG5wb3J0cyA9IDA7CiAKIAliZmFfZ2V0X2FkYXB0ZXJfbW9kZWwoJmJmYWQtPmJmYSwgbW9kZWwpOworCW5wb3J0cyA9IGJmYV9nZXRfbnBvcnRzKCZiZmFkLT5iZmEpOwogCWlmICghc3RyY21wKG1vZGVsLCAiQnJvY2FkZS00MjUiKSkKIAkJc25wcmludGYobW9kZWxfZGVzY3IsIEJGQV9BREFQVEVSX01PREVMX0RFU0NSX0xFTiwKIAkJCSJCcm9jYWRlIDRHYnBzIFBDSWUgZHVhbCBwb3J0IEZDIEhCQSIpOwpAQCAtNjg0LDEwICs2OTEsMTAgQEAKIAkJCSJCcm9jYWRlIDhHYnBzIFBDSWUgZHVhbCBwb3J0IEZDIEhCQSIpOwogCWVsc2UgaWYgKCFzdHJjbXAobW9kZWwsICJCcm9jYWRlLTQyQiIpKQogCQlzbnByaW50Zihtb2RlbF9kZXNjciwgQkZBX0FEQVBURVJfTU9ERUxfREVTQ1JfTEVOLAotCQkJIkhQIDRHYnBzIFBDSWUgZHVhbCBwb3J0IEZDIEhCQSIpOworCQkJIkJyb2NhZGUgNEdicHMgUENJZSBkdWFsIHBvcnQgRkMgSEJBIGZvciBIUCIpOwogCWVsc2UgaWYgKCFzdHJjbXAobW9kZWwsICJCcm9jYWRlLTgyQiIpKQogCQlzbnByaW50Zihtb2RlbF9kZXNjciwgQkZBX0FEQVBURVJfTU9ERUxfREVTQ1JfTEVOLAotCQkJIkhQIDhHYnBzIFBDSWUgZHVhbCBwb3J0IEZDIEhCQSIpOworCQkJIkJyb2NhZGUgOEdicHMgUENJZSBkdWFsIHBvcnQgRkMgSEJBIGZvciBIUCIpOwogCWVsc2UgaWYgKCFzdHJjbXAobW9kZWwsICJCcm9jYWRlLTEwMTAiKSkKIAkJc25wcmludGYobW9kZWxfZGVzY3IsIEJGQV9BREFQVEVSX01PREVMX0RFU0NSX0xFTiwKIAkJCSJCcm9jYWRlIDEwR2JwcyBzaW5nbGUgcG9ydCBDTkEiKTsKQEAgLTY5Niw3ICs3MDMsNyBAQAogCQkJIkJyb2NhZGUgMTBHYnBzIGR1YWwgcG9ydCBDTkEiKTsKIAllbHNlIGlmICghc3RyY21wKG1vZGVsLCAiQnJvY2FkZS0xMDA3IikpCiAJCXNucHJpbnRmKG1vZGVsX2Rlc2NyLCBCRkFfQURBUFRFUl9NT0RFTF9ERVNDUl9MRU4sCi0JCQkiQnJvY2FkZSAxMEdicHMgQ05BIik7CisJCQkiQnJvY2FkZSAxMEdicHMgQ05BIGZvciBJQk0gQmxhZGUgQ2VudGVyIik7CiAJZWxzZSBpZiAoIXN0cmNtcChtb2RlbCwgIkJyb2NhZGUtNDE1IikpCiAJCXNucHJpbnRmKG1vZGVsX2Rlc2NyLCBCRkFfQURBUFRFUl9NT0RFTF9ERVNDUl9MRU4sCiAJCQkiQnJvY2FkZSA0R2JwcyBQQ0llIHNpbmdsZSBwb3J0IEZDIEhCQSIpOwpAQCAtNzA1LDE3ICs3MTIsNDUgQEAKIAkJCSJCcm9jYWRlIDhHYnBzIFBDSWUgc2luZ2xlIHBvcnQgRkMgSEJBIik7CiAJZWxzZSBpZiAoIXN0cmNtcChtb2RlbCwgIkJyb2NhZGUtNDFCIikpCiAJCXNucHJpbnRmKG1vZGVsX2Rlc2NyLCBCRkFfQURBUFRFUl9NT0RFTF9ERVNDUl9MRU4sCi0JCQkiSFAgNEdicHMgUENJZSBzaW5nbGUgcG9ydCBGQyBIQkEiKTsKKwkJCSJCcm9jYWRlIDRHYnBzIFBDSWUgc2luZ2xlIHBvcnQgRkMgSEJBIGZvciBIUCIpOwogCWVsc2UgaWYgKCFzdHJjbXAobW9kZWwsICJCcm9jYWRlLTgxQiIpKQogCQlzbnByaW50Zihtb2RlbF9kZXNjciwgQkZBX0FEQVBURVJfTU9ERUxfREVTQ1JfTEVOLAotCQkJIkhQIDhHYnBzIFBDSWUgc2luZ2xlIHBvcnQgRkMgSEJBIik7CisJCQkiQnJvY2FkZSA4R2JwcyBQQ0llIHNpbmdsZSBwb3J0IEZDIEhCQSBmb3IgSFAiKTsKIAllbHNlIGlmICghc3RyY21wKG1vZGVsLCAiQnJvY2FkZS04MDQiKSkKIAkJc25wcmludGYobW9kZWxfZGVzY3IsIEJGQV9BREFQVEVSX01PREVMX0RFU0NSX0xFTiwKLQkJCSJIUCBCbGFkZXN5c3RlbSBDLWNsYXNzIDhHYnBzIEZDIEhCQSIpOwotCWVsc2UgaWYgKCFzdHJjbXAobW9kZWwsICJCcm9jYWRlLTkwMiIpKQorCQkJIkJyb2NhZGUgOEdicHMgRkMgSEJBIGZvciBIUCBCbGFkZXN5c3RlbSBDLWNsYXNzIik7CisJZWxzZSBpZiAoIXN0cmNtcChtb2RlbCwgIkJyb2NhZGUtOTAyIikgfHwKKwkJICFzdHJjbXAobW9kZWwsICJCcm9jYWRlLTE3NDEiKSkKIAkJc25wcmludGYobW9kZWxfZGVzY3IsIEJGQV9BREFQVEVSX01PREVMX0RFU0NSX0xFTiwKLQkJCSJCcm9jYWRlIDEwR2JwcyBDTkEiKTsKLQllbHNlCisJCQkiQnJvY2FkZSAxMEdicHMgQ05BIGZvciBEZWxsIE0tU2VyaWVzIEJsYWRlIFNlcnZlcnMiKTsKKwllbHNlIGlmIChzdHJzdHIobW9kZWwsICJCcm9jYWRlLTE1NjAiKSkgeworCQlpZiAobnBvcnRzID09IDEpCisJCQlzbnByaW50Zihtb2RlbF9kZXNjciwgQkZBX0FEQVBURVJfTU9ERUxfREVTQ1JfTEVOLAorCQkJCSJCcm9jYWRlIDE2R2JwcyBQQ0llIHNpbmdsZSBwb3J0IEZDIEhCQSIpOworCQllbHNlCisJCQlzbnByaW50Zihtb2RlbF9kZXNjciwgQkZBX0FEQVBURVJfTU9ERUxfREVTQ1JfTEVOLAorCQkJCSJCcm9jYWRlIDE2R2JwcyBQQ0llIGR1YWwgcG9ydCBGQyBIQkEiKTsKKwl9IGVsc2UgaWYgKHN0cnN0cihtb2RlbCwgIkJyb2NhZGUtMTcxMCIpKSB7CisJCWlmIChucG9ydHMgPT0gMSkKKwkJCXNucHJpbnRmKG1vZGVsX2Rlc2NyLCBCRkFfQURBUFRFUl9NT0RFTF9ERVNDUl9MRU4sCisJCQkJIkJyb2NhZGUgMTBHYnBzIHNpbmdsZSBwb3J0IENOQSIpOworCQllbHNlCisJCQlzbnByaW50Zihtb2RlbF9kZXNjciwgQkZBX0FEQVBURVJfTU9ERUxfREVTQ1JfTEVOLAorCQkJCSJCcm9jYWRlIDEwR2JwcyBkdWFsIHBvcnQgQ05BIik7CisJfSBlbHNlIGlmIChzdHJzdHIobW9kZWwsICJCcm9jYWRlLTE4NjAiKSkgeworCQlpZiAobnBvcnRzID09IDEgJiYgYmZhX2lvY19pc19jbmEoJmJmYWQtPmJmYS5pb2MpKQorCQkJc25wcmludGYobW9kZWxfZGVzY3IsIEJGQV9BREFQVEVSX01PREVMX0RFU0NSX0xFTiwKKwkJCQkiQnJvY2FkZSAxMEdicHMgc2luZ2xlIHBvcnQgQ05BIik7CisJCWVsc2UgaWYgKG5wb3J0cyA9PSAxICYmICFiZmFfaW9jX2lzX2NuYSgmYmZhZC0+YmZhLmlvYykpCisJCQlzbnByaW50Zihtb2RlbF9kZXNjciwgQkZBX0FEQVBURVJfTU9ERUxfREVTQ1JfTEVOLAorCQkJCSJCcm9jYWRlIDE2R2JwcyBQQ0llIHNpbmdsZSBwb3J0IEZDIEhCQSIpOworCQllbHNlIGlmIChucG9ydHMgPT0gMiAmJiBiZmFfaW9jX2lzX2NuYSgmYmZhZC0+YmZhLmlvYykpCisJCQlzbnByaW50Zihtb2RlbF9kZXNjciwgQkZBX0FEQVBURVJfTU9ERUxfREVTQ1JfTEVOLAorCQkJCSJCcm9jYWRlIDEwR2JwcyBkdWFsIHBvcnQgQ05BIik7CisJCWVsc2UgaWYgKG5wb3J0cyA9PSAyICYmICFiZmFfaW9jX2lzX2NuYSgmYmZhZC0+YmZhLmlvYykpCisJCQlzbnByaW50Zihtb2RlbF9kZXNjciwgQkZBX0FEQVBURVJfTU9ERUxfREVTQ1JfTEVOLAorCQkJCSJCcm9jYWRlIDE2R2JwcyBQQ0llIGR1YWwgcG9ydCBGQyBIQkEiKTsKKwl9IGVsc2UKIAkJc25wcmludGYobW9kZWxfZGVzY3IsIEJGQV9BREFQVEVSX01PREVMX0RFU0NSX0xFTiwKIAkJCSJJbnZhbGlkIE1vZGVsIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY4NjNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5jCkBAIC0wLDAgKzEsMjE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICogd3d3LmJyb2NhZGUuY29tCisgKgorICogTGludXggZHJpdmVyIGZvciBCcm9jYWRlIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgImJmYWRfZHJ2LmgiCisjaW5jbHVkZSAiYmZhZF9pbS5oIgorI2luY2x1ZGUgImJmYWRfYnNnLmgiCisKK0JGQV9UUkNfRklMRShMRFJWLCBCU0cpOworCitpbnQKK2JmYWRfaW9jbWRfaW9jX2VuYWJsZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCWludAlyYyA9IDA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkvKiBJZiBJT0MgaXMgbm90IGluIGRpc2FibGVkIHN0YXRlIC0gcmV0dXJuICovCisJaWYgKCFiZmFfaW9jX2lzX2Rpc2FibGVkKCZiZmFkLT5iZmEuaW9jKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkU7CisJCXJldHVybiByYzsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJmJmYWQtPmVuYWJsZV9jb21wKTsKKwliZmFfaW9jZmNfZW5hYmxlKCZiZmFkLT5iZmEpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJmYWQtPmVuYWJsZV9jb21wKTsKKworCXJldHVybiByYzsKK30KKworaW50CitiZmFkX2lvY21kX2lvY19kaXNhYmxlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKiljbWQ7CisJaW50CXJjID0gMDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChiZmFkLT5kaXNhYmxlX2FjdGl2ZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIEVCVVNZOworCX0KKworCWJmYWQtPmRpc2FibGVfYWN0aXZlID0gQkZBX1RSVUU7CisJaW5pdF9jb21wbGV0aW9uKCZiZmFkLT5kaXNhYmxlX2NvbXApOworCWJmYV9pb2NmY19kaXNhYmxlKCZiZmFkLT5iZmEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmYmZhZC0+ZGlzYWJsZV9jb21wKTsKKwliZmFkLT5kaXNhYmxlX2FjdGl2ZSA9IEJGQV9GQUxTRTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorYmZhZF9pb2NtZF9pb2NfZ2V0X2luZm8oc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCWludAlpOworCXN0cnVjdCBiZmFfYnNnX2lvY19pbmZvX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2lvY19pbmZvX3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zCSppbV9wb3J0OworCXN0cnVjdCBiZmFfcG9ydF9hdHRyX3MJcGF0dHI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwliZmFfZmNwb3J0X2dldF9hdHRyKCZiZmFkLT5iZmEsICZwYXR0cik7CisJaW9jbWQtPm53d24gPSBwYXR0ci5ud3duOworCWlvY21kLT5wd3duID0gcGF0dHIucHd3bjsKKwlpb2NtZC0+aW9jX3R5cGUgPSBiZmFfZ2V0X3R5cGUoJmJmYWQtPmJmYSk7CisJaW9jbWQtPm1hYyA9IGJmYV9nZXRfbWFjKCZiZmFkLT5iZmEpOworCWlvY21kLT5mYWN0b3J5X21hYyA9IGJmYV9nZXRfbWZnX21hYygmYmZhZC0+YmZhKTsKKwliZmFfZ2V0X2FkYXB0ZXJfc2VyaWFsX251bSgmYmZhZC0+YmZhLCBpb2NtZC0+c2VyaWFsbnVtKTsKKwlpb2NtZC0+ZmFjdG9yeW53d24gPSBwYXR0ci5mYWN0b3J5bnd3bjsKKwlpb2NtZC0+ZmFjdG9yeXB3d24gPSBwYXR0ci5mYWN0b3J5cHd3bjsKKwlpbV9wb3J0ID0gYmZhZC0+cHBvcnQuaW1fcG9ydDsKKwlpb2NtZC0+aG9zdCA9IGltX3BvcnQtPnNob3N0LT5ob3N0X25vOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJc3RyY3B5KGlvY21kLT5uYW1lLCBiZmFkLT5hZGFwdGVyX25hbWUpOworCXN0cmNweShpb2NtZC0+cG9ydF9uYW1lLCBiZmFkLT5wb3J0X25hbWUpOworCXN0cmNweShpb2NtZC0+aHdwYXRoLCBiZmFkLT5wY2lfbmFtZSk7CisKKwkvKiBzZXQgYWRhcHRlciBodyBwYXRoICovCisJc3RyY3B5KGlvY21kLT5hZGFwdGVyX2h3cGF0aCwgYmZhZC0+cGNpX25hbWUpOworCWkgPSBzdHJsZW4oaW9jbWQtPmFkYXB0ZXJfaHdwYXRoKSAtIDE7CisJd2hpbGUgKGlvY21kLT5hZGFwdGVyX2h3cGF0aFtpXSAhPSAnLicpCisJCWktLTsKKwlpb2NtZC0+YWRhcHRlcl9od3BhdGhbaV0gPSAnXDAnOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitiZmFkX2lvY21kX2lvY19nZXRfYXR0cihzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfaW9jX2F0dHJfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfaW9jX2F0dHJfcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWJmYV9pb2NfZ2V0X2F0dHIoJmJmYWQtPmJmYS5pb2MsICZpb2NtZC0+aW9jX2F0dHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJLyogZmlsbCBpbiBkcml2ZXIgYXR0ciBpbmZvICovCisJc3RyY3B5KGlvY21kLT5pb2NfYXR0ci5kcml2ZXJfYXR0ci5kcml2ZXIsIEJGQURfRFJJVkVSX05BTUUpOworCXN0cm5jcHkoaW9jbWQtPmlvY19hdHRyLmRyaXZlcl9hdHRyLmRyaXZlcl92ZXIsCisJCUJGQURfRFJJVkVSX1ZFUlNJT04sIEJGQV9WRVJTSU9OX0xFTik7CisJc3RyY3B5KGlvY21kLT5pb2NfYXR0ci5kcml2ZXJfYXR0ci5md192ZXIsCisJCWlvY21kLT5pb2NfYXR0ci5hZGFwdGVyX2F0dHIuZndfdmVyKTsKKwlzdHJjcHkoaW9jbWQtPmlvY19hdHRyLmRyaXZlcl9hdHRyLmJpb3NfdmVyLAorCQlpb2NtZC0+aW9jX2F0dHIuYWRhcHRlcl9hdHRyLm9wdHJvbV92ZXIpOworCisJLyogY29weSBjaGlwIHJldiBpbmZvIGZpcnN0IG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuICovCisJbWVtY3B5KGJmYWQtPnBjaV9hdHRyLmNoaXBfcmV2LCBpb2NtZC0+aW9jX2F0dHIucGNpX2F0dHIuY2hpcF9yZXYsCisJCXNpemVvZihiZmFkLT5wY2lfYXR0ci5jaGlwX3JldikpOworCW1lbWNweSgmaW9jbWQtPmlvY19hdHRyLnBjaV9hdHRyLCAmYmZhZC0+cGNpX2F0dHIsCisJCXNpemVvZihzdHJ1Y3QgYmZhX2lvY19wY2lfYXR0cl9zKSk7CisKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2lvY19nZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2lvY19zdGF0c19zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19pb2Nfc3RhdHNfcyAqKWNtZDsKKworCWJmYV9pb2NfZ2V0X3N0YXRzKCZiZmFkLT5iZmEsICZpb2NtZC0+aW9jX3N0YXRzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2lvY19nZXRfZndzdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsCisJCQl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4pCit7CisJc3RydWN0IGJmYV9ic2dfaW9jX2Z3c3RhdHNfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX2lvY19md3N0YXRzX3MgKiljbWQ7CisJdm9pZAkqaW9jbWRfYnVmcHRyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoYmZhZF9jaGtfaW9jbWRfc3oocGF5bG9hZF9sZW4sCisJCQlzaXplb2Yoc3RydWN0IGJmYV9ic2dfaW9jX2Z3c3RhdHNfcyksCisJCQlzaXplb2Yoc3RydWN0IGJmYV9md19zdGF0c19zKSkgIT0gQkZBX1NUQVRVU19PSykgeworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19WRVJTSU9OX0ZBSUw7CisJCWdvdG8gb3V0OworCX0KKworCWlvY21kX2J1ZnB0ciA9IChjaGFyICopaW9jbWQgKyBzaXplb2Yoc3RydWN0IGJmYV9ic2dfaW9jX2Z3c3RhdHNfcyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfaW9jX2Z3X3N0YXRzX2dldCgmYmZhZC0+YmZhLmlvYywgaW9jbWRfYnVmcHRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhiZmFkLCBpb2NtZC0+c3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorb3V0OgorCWJmYV90cmMoYmZhZCwgMHg2NjY2KTsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2lvY2ZjX2dldF9hdHRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19pb2NmY19hdHRyX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2lvY2ZjX2F0dHJfcyAqKWNtZDsKKworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCWJmYV9pb2NmY19nZXRfYXR0cigmYmZhZC0+YmZhLCAmaW9jbWQtPmlvY2ZjX2F0dHIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9pb2NmY19zZXRfaW50cihzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfaW9jZmNfaW50cl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19pb2NmY19pbnRyX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2lvY2ZjX2lzcmF0dHJfc2V0KCZiZmFkLT5iZmEsICZpb2NtZC0+YXR0cik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3BvcnRfZW5hYmxlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfcG9ydF9lbmFibGUoJmJmYWQtPmJmYS5tb2R1bGVzLnBvcnQsCisJCQkJCWJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCQlyZXR1cm4gMDsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3BvcnRfZGlzYWJsZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX3BvcnRfZGlzYWJsZSgmYmZhZC0+YmZhLm1vZHVsZXMucG9ydCwKKwkJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCQlyZXR1cm4gMDsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmZhZF9pb2NtZF9wb3J0X2dldF9hdHRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19wb3J0X2F0dHJfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfcG9ydF9hdHRyX3MgKiljbWQ7CisJc3RydWN0IGJmYV9scG9ydF9hdHRyX3MJcG9ydF9hdHRyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJYmZhX2ZjcG9ydF9nZXRfYXR0cigmYmZhZC0+YmZhLCAmaW9jbWQtPmF0dHIpOworCWJmYV9mY3NfbHBvcnRfZ2V0X2F0dHIoJmJmYWQtPmJmYV9mY3MuZmFicmljLmJwb3J0LCAmcG9ydF9hdHRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlmIChpb2NtZC0+YXR0ci50b3BvbG9neSAhPSBCRkFfUE9SVF9UT1BPTE9HWV9OT05FKQorCQlpb2NtZC0+YXR0ci5waWQgPSBwb3J0X2F0dHIucGlkOworCWVsc2UKKwkJaW9jbWQtPmF0dHIucGlkID0gMDsKKworCWlvY21kLT5hdHRyLnBvcnRfdHlwZSA9IHBvcnRfYXR0ci5wb3J0X3R5cGU7CisJaW9jbWQtPmF0dHIubG9vcGJhY2sgPSBwb3J0X2F0dHIubG9vcGJhY2s7CisJaW9jbWQtPmF0dHIuYXV0aGZhaWwgPSBwb3J0X2F0dHIuYXV0aGZhaWw7CisJc3RybmNweShpb2NtZC0+YXR0ci5wb3J0X3N5bW5hbWUuc3ltbmFtZSwKKwkJcG9ydF9hdHRyLnBvcnRfY2ZnLnN5bV9uYW1lLnN5bW5hbWUsCisJCXNpemVvZihwb3J0X2F0dHIucG9ydF9jZmcuc3ltX25hbWUuc3ltbmFtZSkpOworCisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9wb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsCisJCQl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4pCit7CisJc3RydWN0IGJmYV9ic2dfcG9ydF9zdGF0c19zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19wb3J0X3N0YXRzX3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdm9pZAkqaW9jbWRfYnVmcHRyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoYmZhZF9jaGtfaW9jbWRfc3oocGF5bG9hZF9sZW4sCisJCQlzaXplb2Yoc3RydWN0IGJmYV9ic2dfcG9ydF9zdGF0c19zKSwKKwkJCXNpemVvZih1bmlvbiBiZmFfcG9ydF9zdGF0c191KSkgIT0gQkZBX1NUQVRVU19PSykgeworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19WRVJTSU9OX0ZBSUw7CisJCXJldHVybiAwOworCX0KKworCWlvY21kX2J1ZnB0ciA9IChjaGFyICopaW9jbWQgKyBzaXplb2Yoc3RydWN0IGJmYV9ic2dfcG9ydF9zdGF0c19zKTsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfcG9ydF9nZXRfc3RhdHMoJmJmYWQtPmJmYS5tb2R1bGVzLnBvcnQsCisJCQkJaW9jbWRfYnVmcHRyLCBiZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhiZmFkLCBpb2NtZC0+c3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmZhZF9pb2NtZF9scG9ydF9nZXRfYXR0cihzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9mY3NfbHBvcnRfcwkqZmNzX3BvcnQ7CisJc3RydWN0IGJmYV9ic2dfbHBvcnRfYXR0cl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19scG9ydF9hdHRyX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+cHd3bik7CisJaWYgKGZjc19wb3J0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwkJZ290byBvdXQ7CisJfQorCisJYmZhX2Zjc19scG9ydF9nZXRfYXR0cihmY3NfcG9ydCwgJmlvY21kLT5wb3J0X2F0dHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfbHBvcnRfZ2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpmY3NfcG9ydDsKKwlzdHJ1Y3QgYmZhX2JzZ19scG9ydF9zdGF0c19zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfbHBvcnRfc3RhdHNfcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc19wb3J0ID0gYmZhX2Zjc19sb29rdXBfcG9ydCgmYmZhZC0+YmZhX2ZjcywKKwkJCQlpb2NtZC0+dmZfaWQsIGlvY21kLT5wd3duKTsKKwlpZiAoZmNzX3BvcnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9MV1dOOworCQlnb3RvIG91dDsKKwl9CisKKwliZmFfZmNzX2xwb3J0X2dldF9zdGF0cyhmY3NfcG9ydCwgJmlvY21kLT5wb3J0X3N0YXRzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2xwb3J0X2dldF9pb3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpmY3NfcG9ydDsKKwlzdHJ1Y3QgYmZhX2JzZ19scG9ydF9pb3N0YXRzX3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ19scG9ydF9pb3N0YXRzX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+cHd3bik7CisJaWYgKGZjc19wb3J0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwkJZ290byBvdXQ7CisJfQorCisJYmZhX2ZjcGltX3BvcnRfaW9zdGF0cygmYmZhZC0+YmZhLCAmaW9jbWQtPmlvc3RhdHMsCisJCQlmY3NfcG9ydC0+bHBfdGFnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2xwb3J0X2dldF9ycG9ydHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLAorCQkJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuKQoreworCXN0cnVjdCBiZmFfYnNnX2xwb3J0X2dldF9ycG9ydHNfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX2xwb3J0X2dldF9ycG9ydHNfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpmY3NfcG9ydDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXZvaWQJKmlvY21kX2J1ZnB0cjsKKworCWlmIChpb2NtZC0+bnJwb3J0cyA9PSAwKQorCQlyZXR1cm4gRUlOVkFMOworCisJaWYgKGJmYWRfY2hrX2lvY21kX3N6KHBheWxvYWRfbGVuLAorCQkJc2l6ZW9mKHN0cnVjdCBiZmFfYnNnX2xwb3J0X2dldF9ycG9ydHNfcyksCisJCQlzaXplb2Yod3duX3QpICogaW9jbWQtPm5ycG9ydHMpICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVkVSU0lPTl9GQUlMOworCQlyZXR1cm4gMDsKKwl9CisKKwlpb2NtZF9idWZwdHIgPSAoY2hhciAqKWlvY21kICsKKwkJCXNpemVvZihzdHJ1Y3QgYmZhX2JzZ19scG9ydF9nZXRfcnBvcnRzX3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+cHd3bik7CisJaWYgKGZjc19wb3J0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWJmYV90cmMoYmZhZCwgMCk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwkJZ290byBvdXQ7CisJfQorCisJYmZhX2Zjc19scG9ydF9nZXRfcnBvcnRzKGZjc19wb3J0LCAod3duX3QgKilpb2NtZF9idWZwdHIsCisJCQkJJmlvY21kLT5ucnBvcnRzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3Jwb3J0X2dldF9hdHRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19ycG9ydF9hdHRyX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX3Jwb3J0X2F0dHJfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpmY3NfcG9ydDsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpmY3NfcnBvcnQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+cHd3bik7CisJaWYgKGZjc19wb3J0ID09IE5VTEwpIHsKKwkJYmZhX3RyYyhiZmFkLCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwkJZ290byBvdXQ7CisJfQorCisJZmNzX3Jwb3J0ID0gYmZhX2Zjc19ycG9ydF9sb29rdXAoZmNzX3BvcnQsIGlvY21kLT5ycHd3bik7CisJaWYgKGZjc19ycG9ydCA9PSBOVUxMKSB7CisJCWJmYV90cmMoYmZhZCwgMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1JXV047CisJCWdvdG8gb3V0OworCX0KKworCWJmYV9mY3NfcnBvcnRfZ2V0X2F0dHIoZmNzX3Jwb3J0LCAmaW9jbWQtPmF0dHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitiZmFkX2lvY21kX3Jwb3J0X2dldF9hZGRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19ycG9ydF9zY3NpX2FkZHJfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX3Jwb3J0X3Njc2lfYWRkcl9zICopY21kOworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MJKmZjc19wb3J0OworCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MJKmZjc19pdG5pbTsKKwlzdHJ1Y3QgYmZhZF9pdG5pbV9zCSpkcnZfaXRuaW07CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+cHd3bik7CisJaWYgKGZjc19wb3J0ID09IE5VTEwpIHsKKwkJYmZhX3RyYyhiZmFkLCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwkJZ290byBvdXQ7CisJfQorCisJZmNzX2l0bmltID0gYmZhX2Zjc19pdG5pbV9sb29rdXAoZmNzX3BvcnQsIGlvY21kLT5ycHd3bik7CisJaWYgKGZjc19pdG5pbSA9PSBOVUxMKSB7CisJCWJmYV90cmMoYmZhZCwgMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1JXV047CisJCWdvdG8gb3V0OworCX0KKworCWRydl9pdG5pbSA9IGZjc19pdG5pbS0+aXRuaW1fZHJ2OworCisJaWYgKGRydl9pdG5pbSAmJiBkcnZfaXRuaW0tPmltX3BvcnQpCisJCWlvY21kLT5ob3N0ID0gZHJ2X2l0bmltLT5pbV9wb3J0LT5zaG9zdC0+aG9zdF9ubzsKKwllbHNlIHsKKwkJYmZhX3RyYyhiZmFkLCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fUldXTjsKKwkJZ290byBvdXQ7CisJfQorCisJaW9jbWQtPnRhcmdldCA9IGRydl9pdG5pbS0+c2NzaV90Z3RfaWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpb2NtZC0+YnVzID0gMDsKKwlpb2NtZC0+bHVuID0gMDsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3Jwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcnBvcnRfc3RhdHNfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX3Jwb3J0X3N0YXRzX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqZmNzX3BvcnQ7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqZmNzX3Jwb3J0OworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3BvcnQgPSBiZmFfZmNzX2xvb2t1cF9wb3J0KCZiZmFkLT5iZmFfZmNzLAorCQkJCWlvY21kLT52Zl9pZCwgaW9jbWQtPnB3d24pOworCWlmIChmY3NfcG9ydCA9PSBOVUxMKSB7CisJCWJmYV90cmMoYmZhZCwgMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX0xXV047CisJCWdvdG8gb3V0OworCX0KKworCWZjc19ycG9ydCA9IGJmYV9mY3NfcnBvcnRfbG9va3VwKGZjc19wb3J0LCBpb2NtZC0+cnB3d24pOworCWlmIChmY3NfcnBvcnQgPT0gTlVMTCkgeworCQliZmFfdHJjKGJmYWQsIDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9SV1dOOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoKHZvaWQgKikmaW9jbWQtPnN0YXRzLCAodm9pZCAqKSZmY3NfcnBvcnQtPnN0YXRzLAorCQlzaXplb2Yoc3RydWN0IGJmYV9ycG9ydF9zdGF0c19zKSk7CisJbWVtY3B5KCh2b2lkICopJmlvY21kLT5zdGF0cy5oYWxfc3RhdHMsCisJICAgICAgICh2b2lkICopJihiZmFfZmNzX3Jwb3J0X2dldF9oYWxycG9ydChmY3NfcnBvcnQpLT5zdGF0cyksCisJICAgICAgIHNpemVvZihzdHJ1Y3QgYmZhX3Jwb3J0X2hhbF9zdGF0c19zKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmZhZF9pb2NtZF9mYWJyaWNfZ2V0X2xwb3J0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsCisJCQl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4pCit7CisJc3RydWN0IGJmYV9ic2dfZmFicmljX2dldF9scG9ydHNfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX2ZhYnJpY19nZXRfbHBvcnRzX3MgKiljbWQ7CisJYmZhX2Zjc192Zl90CSpmY3NfdmY7CisJdWludDMyX3QJbnBvcnRzID0gaW9jbWQtPm5wb3J0czsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXZvaWQJKmlvY21kX2J1ZnB0cjsKKworCWlmIChucG9ydHMgPT0gMCkgeworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChiZmFkX2Noa19pb2NtZF9zeihwYXlsb2FkX2xlbiwKKwkJc2l6ZW9mKHN0cnVjdCBiZmFfYnNnX2ZhYnJpY19nZXRfbHBvcnRzX3MpLAorCQlzaXplb2Yod3duX3RbaW9jbWQtPm5wb3J0c10pKSAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1ZFUlNJT05fRkFJTDsKKwkJZ290byBvdXQ7CisJfQorCisJaW9jbWRfYnVmcHRyID0gKGNoYXIgKilpb2NtZCArCisJCQlzaXplb2Yoc3RydWN0IGJmYV9ic2dfZmFicmljX2dldF9scG9ydHNfcyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3ZmID0gYmZhX2Zjc192Zl9sb29rdXAoJmJmYWQtPmJmYV9mY3MsIGlvY21kLT52Zl9pZCk7CisJaWYgKGZjc192ZiA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1ZGSUQ7CisJCWdvdG8gb3V0OworCX0KKwliZmFfZmNzX3ZmX2dldF9wb3J0cyhmY3NfdmYsICh3d25fdCAqKWlvY21kX2J1ZnB0ciwgJm5wb3J0cyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpb2NtZC0+bnBvcnRzID0gbnBvcnRzOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZmNwaW1fZ2V0X21vZHN0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9tb2RzdGF0c19zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfZmNwaW1fbW9kc3RhdHNfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKCZiZmFkLT5iZmEpOworCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOworCXN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW07CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkvKiBhY2N1bXVsYXRlIElPIHN0YXRzIGZyb20gaXRuaW0gKi8KKwltZW1zZXQoKHZvaWQgKikmaW9jbWQtPm1vZHN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9pdG5pbV9pb3N0YXRzX3MpKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJmZjcGltLT5pdG5pbV9xKSB7CisJCWl0bmltID0gKHN0cnVjdCBiZmFfaXRuaW1fcyAqKSBxZTsKKwkJYmZhX2ZjcGltX2FkZF9zdGF0cygmaW9jbWQtPm1vZHN0YXRzLCAmKGl0bmltLT5zdGF0cykpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2ZjcGltX2dldF9kZWxfaXRuX3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9kZWxfaXRuX3N0YXRzX3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9kZWxfaXRuX3N0YXRzX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSA9IEJGQV9GQ1BJTSgmYmZhZC0+YmZhKTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCW1lbWNweSgodm9pZCAqKSZpb2NtZC0+bW9kc3RhdHMsICh2b2lkICopJmZjcGltLT5kZWxfaXRuX3N0YXRzLAorCQlzaXplb2Yoc3RydWN0IGJmYV9mY3BpbV9kZWxfaXRuX3N0YXRzX3MpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitiZmFkX2lvY21kX2l0bmltX2dldF9hdHRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19pdG5pbV9hdHRyX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2l0bmltX2F0dHJfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zCSpmY3NfcG9ydDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc19wb3J0ID0gYmZhX2Zjc19sb29rdXBfcG9ydCgmYmZhZC0+YmZhX2ZjcywKKwkJCQlpb2NtZC0+dmZfaWQsIGlvY21kLT5scHd3bik7CisJaWYgKCFmY3NfcG9ydCkKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9MV1dOOworCWVsc2UKKwkJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3NfaXRuaW1fYXR0cl9nZXQoZmNzX3BvcnQsCisJCQkJCWlvY21kLT5ycHd3biwgJmlvY21kLT5hdHRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmZhZF9pb2NtZF9pdG5pbV9nZXRfaW9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfaXRuaW1faW9zdGF0c19zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfaXRuaW1faW9zdGF0c19zICopY21kOworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKmZjc19wb3J0OworCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3BvcnQgPSBiZmFfZmNzX2xvb2t1cF9wb3J0KCZiZmFkLT5iZmFfZmNzLAorCQkJCWlvY21kLT52Zl9pZCwgaW9jbWQtPmxwd3duKTsKKwlpZiAoIWZjc19wb3J0KSB7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwkJYmZhX3RyYyhiZmFkLCAwKTsKKwl9IGVsc2UgeworCQlpdG5pbSA9IGJmYV9mY3NfaXRuaW1fbG9va3VwKGZjc19wb3J0LCBpb2NtZC0+cnB3d24pOworCQlpZiAoaXRuaW0gPT0gTlVMTCkKKwkJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fUldXTjsKKwkJZWxzZSB7CisJCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwkJCW1lbWNweSgodm9pZCAqKSZpb2NtZC0+aW9zdGF0cywgKHZvaWQgKikKKwkJCSAgICAgICAmKGJmYV9mY3NfaXRuaW1fZ2V0X2hhbGl0bihpdG5pbSktPnN0YXRzKSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJmYV9pdG5pbV9pb3N0YXRzX3MpKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmZhZF9pb2NtZF9pdG5pbV9nZXRfaXRuc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2l0bmltX2l0bnN0YXRzX3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ19pdG5pbV9pdG5zdGF0c19zICopY21kOworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKmZjc19wb3J0OworCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3BvcnQgPSBiZmFfZmNzX2xvb2t1cF9wb3J0KCZiZmFkLT5iZmFfZmNzLAorCQkJCWlvY21kLT52Zl9pZCwgaW9jbWQtPmxwd3duKTsKKwlpZiAoIWZjc19wb3J0KSB7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwkJYmZhX3RyYyhiZmFkLCAwKTsKKwl9IGVsc2UgeworCQlpdG5pbSA9IGJmYV9mY3NfaXRuaW1fbG9va3VwKGZjc19wb3J0LCBpb2NtZC0+cnB3d24pOworCQlpZiAoaXRuaW0gPT0gTlVMTCkKKwkJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fUldXTjsKKwkJZWxzZSB7CisJCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwkJCWJmYV9mY3NfaXRuaW1fc3RhdHNfZ2V0KGZjc19wb3J0LCBpb2NtZC0+cnB3d24sCisJCQkJCSZpb2NtZC0+aXRuc3RhdHMpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZmNwb3J0X2VuYWJsZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BvcnRfZW5hYmxlKCZiZmFkLT5iZmEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9mY3BvcnRfZGlzYWJsZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BvcnRfZGlzYWJsZSgmYmZhZC0+YmZhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfaW9jX2dldF9wY2lmbl9jZmcoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3BjaWZuX2NmZ19zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19wY2lmbl9jZmdfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9hYmxrX3F1ZXJ5KCZiZmFkLT5iZmEubW9kdWxlcy5hYmxrLAorCQkJCSZpb2NtZC0+cGNpZm5fY2ZnLAorCQkJCWJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcGNpZm5fY3JlYXRlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19wY2lmbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19wY2lmbl9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2FibGtfcGZfY3JlYXRlKCZiZmFkLT5iZmEubW9kdWxlcy5hYmxrLAorCQkJCSZpb2NtZC0+cGNpZm5faWQsIGlvY21kLT5wb3J0LAorCQkJCWlvY21kLT5wY2lmbl9jbGFzcywgaW9jbWQtPmJhbmR3aWR0aCwKKwkJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3BjaWZuX2RlbGV0ZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcGNpZm5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfcGNpZm5fcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9hYmxrX3BmX2RlbGV0ZSgmYmZhZC0+YmZhLm1vZHVsZXMuYWJsaywKKwkJCQlpb2NtZC0+cGNpZm5faWQsCisJCQkJYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKQorCQlnb3RvIG91dDsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9wY2lmbl9idyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcGNpZm5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfcGNpZm5fcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9hYmxrX3BmX3VwZGF0ZSgmYmZhZC0+YmZhLm1vZHVsZXMuYWJsaywKKwkJCQlpb2NtZC0+cGNpZm5faWQsIGlvY21kLT5iYW5kd2lkdGgsCisJCQkJYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKKwliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfYWRhcHRlcl9jZmdfbW9kZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfYWRhcHRlcl9jZmdfbW9kZV9zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfYWRhcHRlcl9jZmdfbW9kZV9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9hYmxrX2FkYXB0ZXJfY29uZmlnKCZiZmFkLT5iZmEubW9kdWxlcy5hYmxrLAorCQkJCWlvY21kLT5jZmcubW9kZSwgaW9jbWQtPmNmZy5tYXhfcGYsCisJCQkJaW9jbWQtPmNmZy5tYXhfdmYsIGJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcG9ydF9jZmdfbW9kZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcG9ydF9jZmdfbW9kZV9zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfcG9ydF9jZmdfbW9kZV9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9hYmxrX3BvcnRfY29uZmlnKCZiZmFkLT5iZmEubW9kdWxlcy5hYmxrLAorCQkJCWlvY21kLT5pbnN0YW5jZSwgaW9jbWQtPmNmZy5tb2RlLAorCQkJCWlvY21kLT5jZmcubWF4X3BmLCBpb2NtZC0+Y2ZnLm1heF92ZiwKKwkJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2FibGtfb3B0cm9tKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKnBjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopcGNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoY21kID09IElPQ01EX0ZMQVNIX0VOQUJMRV9PUFRST00pCisJCWlvY21kLT5zdGF0dXMgPSBiZmFfYWJsa19vcHRyb21fZW4oJmJmYWQtPmJmYS5tb2R1bGVzLmFibGssCisJCQkJCWJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJZWxzZQorCQlpb2NtZC0+c3RhdHVzID0gYmZhX2FibGtfb3B0cm9tX2RpcygmYmZhZC0+YmZhLm1vZHVsZXMuYWJsaywKKwkJCQkJYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2ZhYV9lbmFibGUoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgICAgZmNvbXA7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZhYV9lbmFibGUoJmJmYWQtPmJmYSwgYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2ZhYV9kaXNhYmxlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXN0cnVjdCBiZmFkX2hhbF9jb21wICAgIGZjb21wOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mYWFfZGlzYWJsZSgmYmZhZC0+YmZhLCBiZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZmFhX3F1ZXJ5KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mYWFfYXR0cl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19mYWFfYXR0cl9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wICAgIGZjb21wOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmFhX3F1ZXJ5KCZiZmFkLT5iZmEsICZpb2NtZC0+ZmFhX2F0dHIsCisJCQkJYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2NlZV9hdHRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IHBheWxvYWRfbGVuKQoreworCXN0cnVjdCBiZmFfYnNnX2NlZV9hdHRyX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfY2VlX2F0dHJfcyAqKWNtZDsKKwl2b2lkCSppb2NtZF9idWZwdHI7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAJY2VlX2NvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmIChiZmFkX2Noa19pb2NtZF9zeihwYXlsb2FkX2xlbiwKKwkJCXNpemVvZihzdHJ1Y3QgYmZhX2JzZ19jZWVfYXR0cl9zKSwKKwkJCXNpemVvZihzdHJ1Y3QgYmZhX2NlZV9hdHRyX3MpKSAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1ZFUlNJT05fRkFJTDsKKwkJcmV0dXJuIDA7CisJfQorCisJaW9jbWRfYnVmcHRyID0gKGNoYXIgKilpb2NtZCArIHNpemVvZihzdHJ1Y3QgYmZhX2JzZ19jZWVfYXR0cl9zKTsKKworCWNlZV9jb21wLnN0YXR1cyA9IDA7CisJaW5pdF9jb21wbGV0aW9uKCZjZWVfY29tcC5jb21wKTsKKwltdXRleF9sb2NrKCZiZmFkX211dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9jZWVfZ2V0X2F0dHIoJmJmYWQtPmJmYS5tb2R1bGVzLmNlZSwgaW9jbWRfYnVmcHRyLAorCQkJCQkgYmZhZF9oY2JfY29tcCwgJmNlZV9jb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCW11dGV4X3VubG9jaygmYmZhZF9tdXRleCk7CisJCWJmYV90cmMoYmZhZCwgMHg1NTU1KTsKKwkJZ290byBvdXQ7CisJfQorCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNlZV9jb21wLmNvbXApOworCW11dGV4X3VubG9jaygmYmZhZF9tdXRleCk7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9jZWVfZ2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwKKwkJCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbikKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19jZWVfc3RhdHNfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19jZWVfc3RhdHNfcyAqKWNtZDsKKwl2b2lkCSppb2NtZF9idWZwdHI7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAJY2VlX2NvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmIChiZmFkX2Noa19pb2NtZF9zeihwYXlsb2FkX2xlbiwKKwkJCXNpemVvZihzdHJ1Y3QgYmZhX2JzZ19jZWVfc3RhdHNfcyksCisJCQlzaXplb2Yoc3RydWN0IGJmYV9jZWVfc3RhdHNfcykpICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVkVSU0lPTl9GQUlMOworCQlyZXR1cm4gMDsKKwl9CisKKwlpb2NtZF9idWZwdHIgPSAoY2hhciAqKWlvY21kICsgc2l6ZW9mKHN0cnVjdCBiZmFfYnNnX2NlZV9zdGF0c19zKTsKKworCWNlZV9jb21wLnN0YXR1cyA9IDA7CisJaW5pdF9jb21wbGV0aW9uKCZjZWVfY29tcC5jb21wKTsKKwltdXRleF9sb2NrKCZiZmFkX211dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9jZWVfZ2V0X3N0YXRzKCZiZmFkLT5iZmEubW9kdWxlcy5jZWUsIGlvY21kX2J1ZnB0ciwKKwkJCQkJYmZhZF9oY2JfY29tcCwgJmNlZV9jb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCW11dGV4X3VubG9jaygmYmZhZF9tdXRleCk7CisJCWJmYV90cmMoYmZhZCwgMHg1NTU1KTsKKwkJZ290byBvdXQ7CisJfQorCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNlZV9jb21wLmNvbXApOworCW11dGV4X3VubG9jaygmYmZhZF9tdXRleCk7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9jZWVfcmVzZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfY2VlX3Jlc2V0X3N0YXRzKCZiZmFkLT5iZmEubW9kdWxlcy5jZWUsIE5VTEwsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWJmYV90cmMoYmZhZCwgMHg1NTU1KTsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3NmcF9tZWRpYShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfc2ZwX21lZGlhX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX3NmcF9tZWRpYV9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wCWZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX3NmcF9tZWRpYShCRkFfU0ZQX01PRCgmYmZhZC0+YmZhKSwgJmlvY21kLT5tZWRpYSwKKwkJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWJmYV90cmMoYmZhZCwgaW9jbWQtPnN0YXR1cyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19TRlBfTk9UX1JFQURZKQorCQlnb3RvIG91dDsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9zZnBfc3BlZWQoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3NmcF9zcGVlZF9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19zZnBfc3BlZWRfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcAlmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9zZnBfc3BlZWQoQkZBX1NGUF9NT0QoJmJmYWQtPmJmYSksIGlvY21kLT5zcGVlZCwKKwkJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWJmYV90cmMoYmZhZCwgaW9jbWQtPnN0YXR1cyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19TRlBfTk9UX1JFQURZKQorCQlnb3RvIG91dDsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZmxhc2hfZ2V0X2F0dHIoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2ZsYXNoX2F0dHJfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX2ZsYXNoX2F0dHJfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mbGFzaF9nZXRfYXR0cihCRkFfRkxBU0goJmJmYWQtPmJmYSksICZpb2NtZC0+YXR0ciwKKwkJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9mbGFzaF9lcmFzZV9wYXJ0KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mbGFzaF9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19mbGFzaF9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZsYXNoX2VyYXNlX3BhcnQoQkZBX0ZMQVNIKCZiZmFkLT5iZmEpLCBpb2NtZC0+dHlwZSwKKwkJCQlpb2NtZC0+aW5zdGFuY2UsIGJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2ZsYXNoX3VwZGF0ZV9wYXJ0KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwKKwkJCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbikKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mbGFzaF9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19mbGFzaF9zICopY21kOworCXZvaWQJKmlvY21kX2J1ZnB0cjsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaWYgKGJmYWRfY2hrX2lvY21kX3N6KHBheWxvYWRfbGVuLAorCQkJc2l6ZW9mKHN0cnVjdCBiZmFfYnNnX2ZsYXNoX3MpLAorCQkJaW9jbWQtPmJ1ZnN6KSAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1ZFUlNJT05fRkFJTDsKKwkJcmV0dXJuIDA7CisJfQorCisJaW9jbWRfYnVmcHRyID0gKGNoYXIgKilpb2NtZCArIHNpemVvZihzdHJ1Y3QgYmZhX2JzZ19mbGFzaF9zKTsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmxhc2hfdXBkYXRlX3BhcnQoQkZBX0ZMQVNIKCZiZmFkLT5iZmEpLAorCQkJCWlvY21kLT50eXBlLCBpb2NtZC0+aW5zdGFuY2UsIGlvY21kX2J1ZnB0ciwKKwkJCQlpb2NtZC0+YnVmc3osIDAsIGJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2ZsYXNoX3JlYWRfcGFydChzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsCisJCQl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4pCit7CisJc3RydWN0IGJmYV9ic2dfZmxhc2hfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZmxhc2hfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl2b2lkCSppb2NtZF9idWZwdHI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmIChiZmFkX2Noa19pb2NtZF9zeihwYXlsb2FkX2xlbiwKKwkJCXNpemVvZihzdHJ1Y3QgYmZhX2JzZ19mbGFzaF9zKSwKKwkJCWlvY21kLT5idWZzeikgIT0gQkZBX1NUQVRVU19PSykgeworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19WRVJTSU9OX0ZBSUw7CisJCXJldHVybiAwOworCX0KKworCWlvY21kX2J1ZnB0ciA9IChjaGFyICopaW9jbWQgKyBzaXplb2Yoc3RydWN0IGJmYV9ic2dfZmxhc2hfcyk7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZsYXNoX3JlYWRfcGFydChCRkFfRkxBU0goJmJmYWQtPmJmYSksIGlvY21kLT50eXBlLAorCQkJCWlvY21kLT5pbnN0YW5jZSwgaW9jbWRfYnVmcHRyLCBpb2NtZC0+YnVmc3osIDAsCisJCQkJYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKQorCQlnb3RvIG91dDsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZGlhZ190ZW1wKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19kaWFnX2dldF90ZW1wX3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ19kaWFnX2dldF90ZW1wX3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZGlhZ190c2Vuc29yX3F1ZXJ5KEJGQV9ESUFHX01PRCgmYmZhZC0+YmZhKSwKKwkJCQkmaW9jbWQtPnJlc3VsdCwgYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9kaWFnX21lbXRlc3Qoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2RpYWdfbWVtdGVzdF9zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfZGlhZ19tZW10ZXN0X3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9kaWFnX21lbXRlc3QoQkZBX0RJQUdfTU9EKCZiZmFkLT5iZmEpLAorCQkJCSZpb2NtZC0+bWVtdGVzdCwgaW9jbWQtPnBhdCwKKwkJCQkmaW9jbWQtPnJlc3VsdCwgYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9kaWFnX2xvb3BiYWNrKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19kaWFnX2xvb3BiYWNrX3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ19kaWFnX2xvb3BiYWNrX3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY2RpYWdfbG9vcGJhY2soJmJmYWQtPmJmYSwgaW9jbWQtPm9wbW9kZSwKKwkJCQlpb2NtZC0+c3BlZWQsIGlvY21kLT5scGNudCwgaW9jbWQtPnBhdCwKKwkJCQkmaW9jbWQtPnJlc3VsdCwgYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9kaWFnX2Z3cGluZyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZGlhZ19md3BpbmdfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX2RpYWdfZndwaW5nX3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9kaWFnX2Z3cGluZyhCRkFfRElBR19NT0QoJmJmYWQtPmJmYSksIGlvY21kLT5jbnQsCisJCQkJaW9jbWQtPnBhdHRlcm4sICZpb2NtZC0+cmVzdWx0LAorCQkJCWJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJYmZhX3RyYyhiZmFkLCBpb2NtZC0+c3RhdHVzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKQorCQlnb3RvIG91dDsKKwliZmFfdHJjKGJmYWQsIDB4Nzc3NzEpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9kaWFnX3F1ZXVldGVzdChzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZGlhZ19xdGVzdF9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19kaWFnX3F0ZXN0X3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY2RpYWdfcXVldWV0ZXN0KCZiZmFkLT5iZmEsIGlvY21kLT5mb3JjZSwKKwkJCQlpb2NtZC0+cXVldWUsICZpb2NtZC0+cmVzdWx0LAorCQkJCWJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2RpYWdfc2ZwKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19zZnBfc2hvd19zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfc2ZwX3Nob3dfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX3NmcF9zaG93KEJGQV9TRlBfTU9EKCZiZmFkLT5iZmEpLCAmaW9jbWQtPnNmcCwKKwkJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWJmYV90cmMoYmZhZCwgaW9jbWQtPnN0YXR1cyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKKwliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZGlhZ19sZWQoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2RpYWdfbGVkX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2RpYWdfbGVkX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZGlhZ19sZWR0ZXN0KEJGQV9ESUFHX01PRCgmYmZhZC0+YmZhKSwKKwkJCQkmaW9jbWQtPmxlZHRlc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZGlhZ19iZWFjb25fbHBvcnQoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2RpYWdfYmVhY29uX3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ19kaWFnX2JlYWNvbl9zICopY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9kaWFnX2JlYWNvbl9wb3J0KEJGQV9ESUFHX01PRCgmYmZhZC0+YmZhKSwKKwkJCQlpb2NtZC0+YmVhY29uLCBpb2NtZC0+bGlua19lMmVfYmVhY29uLAorCQkJCWlvY21kLT5zZWNvbmQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZGlhZ19sYl9zdGF0KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19kaWFnX2xiX3N0YXRfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX2RpYWdfbGJfc3RhdF9zICopY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY2RpYWdfbGJfaXNfcnVubmluZygmYmZhZC0+YmZhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9waHlfZ2V0X2F0dHIoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3BoeV9hdHRyX3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ19waHlfYXR0cl9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX3BoeV9nZXRfYXR0cihCRkFfUEhZKCZiZmFkLT5iZmEpLCBpb2NtZC0+aW5zdGFuY2UsCisJCQkJJmlvY21kLT5hdHRyLCBiZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9waHlfZ2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19waHlfc3RhdHNfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX3BoeV9zdGF0c19zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX3BoeV9nZXRfc3RhdHMoQkZBX1BIWSgmYmZhZC0+YmZhKSwgaW9jbWQtPmluc3RhbmNlLAorCQkJCSZpb2NtZC0+c3RhdHMsIGJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3BoeV9yZWFkKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IHBheWxvYWRfbGVuKQoreworCXN0cnVjdCBiZmFfYnNnX3BoeV9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19waHlfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl2b2lkCSppb2NtZF9idWZwdHI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmIChiZmFkX2Noa19pb2NtZF9zeihwYXlsb2FkX2xlbiwKKwkJCXNpemVvZihzdHJ1Y3QgYmZhX2JzZ19waHlfcyksCisJCQlpb2NtZC0+YnVmc3opICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVkVSU0lPTl9GQUlMOworCQlyZXR1cm4gMDsKKwl9CisKKwlpb2NtZF9idWZwdHIgPSAoY2hhciAqKWlvY21kICsgc2l6ZW9mKHN0cnVjdCBiZmFfYnNnX3BoeV9zKTsKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX3BoeV9yZWFkKEJGQV9QSFkoJmJmYWQtPmJmYSksCisJCQkJaW9jbWQtPmluc3RhbmNlLCBpb2NtZF9idWZwdHIsIGlvY21kLT5idWZzeiwKKwkJCQkwLCBiZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF92aGJhX3F1ZXJ5KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ192aGJhX2F0dHJfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX3ZoYmFfYXR0cl9zICopY21kOworCXN0cnVjdCBiZmFfdmhiYV9hdHRyX3MgKmF0dHIgPSAmaW9jbWQtPmF0dHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlhdHRyLT5wd3duID0gIGJmYWQtPmJmYS5pb2MuYXR0ci0+cHd3bjsKKwlhdHRyLT5ud3duID0gIGJmYWQtPmJmYS5pb2MuYXR0ci0+bnd3bjsKKwlhdHRyLT5wbG9nX2VuYWJsZWQgPSAoYmZhX2Jvb2xlYW5fdCliZmFkLT5iZmEucGxvZy0+cGxvZ19lbmFibGVkOworCWF0dHItPmlvX3Byb2ZpbGUgPSBiZmFfZmNwaW1fZ2V0X2lvX3Byb2ZpbGUoJmJmYWQtPmJmYSk7CisJYXR0ci0+cGF0aF90b3YgID0gYmZhX2ZjcGltX3BhdGhfdG92X2dldCgmYmZhZC0+YmZhKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3BoeV91cGRhdGUoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4pCit7CisJc3RydWN0IGJmYV9ic2dfcGh5X3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX3BoeV9zICopY21kOworCXZvaWQJKmlvY21kX2J1ZnB0cjsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaWYgKGJmYWRfY2hrX2lvY21kX3N6KHBheWxvYWRfbGVuLAorCQkJc2l6ZW9mKHN0cnVjdCBiZmFfYnNnX3BoeV9zKSwKKwkJCWlvY21kLT5idWZzeikgIT0gQkZBX1NUQVRVU19PSykgeworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19WRVJTSU9OX0ZBSUw7CisJCXJldHVybiAwOworCX0KKworCWlvY21kX2J1ZnB0ciA9IChjaGFyICopaW9jbWQgKyBzaXplb2Yoc3RydWN0IGJmYV9ic2dfcGh5X3MpOworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfcGh5X3VwZGF0ZShCRkFfUEhZKCZiZmFkLT5iZmEpLAorCQkJCWlvY21kLT5pbnN0YW5jZSwgaW9jbWRfYnVmcHRyLCBpb2NtZC0+YnVmc3osCisJCQkJMCwgYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKQorCQlnb3RvIG91dDsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcG9yZ2xvZ19nZXQoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2RlYnVnX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2RlYnVnX3MgKiljbWQ7CisJdm9pZCAqaW9jbWRfYnVmcHRyOworCisJaWYgKGlvY21kLT5idWZzeiA8IHNpemVvZihzdHJ1Y3QgYmZhX3Bsb2dfcykpIHsKKwkJYmZhX3RyYyhiZmFkLCBzaXplb2Yoc3RydWN0IGJmYV9wbG9nX3MpKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlpb2NtZF9idWZwdHIgPSAoY2hhciAqKWlvY21kICsgc2l6ZW9mKHN0cnVjdCBiZmFfYnNnX2RlYnVnX3MpOworCW1lbWNweShpb2NtZF9idWZwdHIsICh1OCAqKSAmYmZhZC0+cGxvZ19idWYsIHNpemVvZihzdHJ1Y3QgYmZhX3Bsb2dfcykpOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitiZmFkX2lvY21kX2hhbmRsZXIoc3RydWN0IGJmYWRfcyAqYmZhZCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqaW9jbWQsCisJCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbikKK3sKKwlpbnQgcmMgPSBFSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSU9DTURfSU9DX0VOQUJMRToKKwkJcmMgPSBiZmFkX2lvY21kX2lvY19lbmFibGUoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0lPQ19ESVNBQkxFOgorCQlyYyA9IGJmYWRfaW9jbWRfaW9jX2Rpc2FibGUoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0lPQ19HRVRfSU5GTzoKKwkJcmMgPSBiZmFkX2lvY21kX2lvY19nZXRfaW5mbyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfSU9DX0dFVF9BVFRSOgorCQlyYyA9IGJmYWRfaW9jbWRfaW9jX2dldF9hdHRyKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9JT0NfR0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfaW9jX2dldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfSU9DX0dFVF9GV1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfaW9jX2dldF9md3N0YXRzKGJmYWQsIGlvY21kLCBwYXlsb2FkX2xlbik7CisJCWJyZWFrOworCWNhc2UgSU9DTURfSU9DRkNfR0VUX0FUVFI6CisJCXJjID0gYmZhZF9pb2NtZF9pb2NmY19nZXRfYXR0cihiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfSU9DRkNfU0VUX0lOVFI6CisJCXJjID0gYmZhZF9pb2NtZF9pb2NmY19zZXRfaW50cihiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUE9SVF9FTkFCTEU6CisJCXJjID0gYmZhZF9pb2NtZF9wb3J0X2VuYWJsZShiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUE9SVF9ESVNBQkxFOgorCQlyYyA9IGJmYWRfaW9jbWRfcG9ydF9kaXNhYmxlKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9QT1JUX0dFVF9BVFRSOgorCQlyYyA9IGJmYWRfaW9jbWRfcG9ydF9nZXRfYXR0cihiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUE9SVF9HRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9wb3J0X2dldF9zdGF0cyhiZmFkLCBpb2NtZCwgcGF5bG9hZF9sZW4pOworCQlicmVhazsKKwljYXNlIElPQ01EX0xQT1JUX0dFVF9BVFRSOgorCQlyYyA9IGJmYWRfaW9jbWRfbHBvcnRfZ2V0X2F0dHIoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0xQT1JUX0dFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX2xwb3J0X2dldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfTFBPUlRfR0VUX0lPU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9scG9ydF9nZXRfaW9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfTFBPUlRfR0VUX1JQT1JUUzoKKwkJcmMgPSBiZmFkX2lvY21kX2xwb3J0X2dldF9ycG9ydHMoYmZhZCwgaW9jbWQsIHBheWxvYWRfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9SUE9SVF9HRVRfQVRUUjoKKwkJcmMgPSBiZmFkX2lvY21kX3Jwb3J0X2dldF9hdHRyKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9SUE9SVF9HRVRfQUREUjoKKwkJcmMgPSBiZmFkX2lvY21kX3Jwb3J0X2dldF9hZGRyKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9SUE9SVF9HRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9ycG9ydF9nZXRfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZBQlJJQ19HRVRfTFBPUlRTOgorCQlyYyA9IGJmYWRfaW9jbWRfZmFicmljX2dldF9scG9ydHMoYmZhZCwgaW9jbWQsIHBheWxvYWRfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQ1BJTV9NT0RTVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX2ZjcGltX2dldF9tb2RzdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRkNQSU1fREVMX0lUTl9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX2ZjcGltX2dldF9kZWxfaXRuX3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9JVE5JTV9HRVRfQVRUUjoKKwkJcmMgPSBiZmFkX2lvY21kX2l0bmltX2dldF9hdHRyKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9JVE5JTV9HRVRfSU9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX2l0bmltX2dldF9pb3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9JVE5JTV9HRVRfSVROU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9pdG5pbV9nZXRfaXRuc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZDUE9SVF9FTkFCTEU6CisJCXJjID0gYmZhZF9pb2NtZF9mY3BvcnRfZW5hYmxlKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQ1BPUlRfRElTQUJMRToKKwkJcmMgPSBiZmFkX2lvY21kX2ZjcG9ydF9kaXNhYmxlKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9JT0NfUENJRk5fQ0ZHOgorCQlyYyA9IGJmYWRfaW9jbWRfaW9jX2dldF9wY2lmbl9jZmcoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1BDSUZOX0NSRUFURToKKwkJcmMgPSBiZmFkX2lvY21kX3BjaWZuX2NyZWF0ZShiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUENJRk5fREVMRVRFOgorCQlyYyA9IGJmYWRfaW9jbWRfcGNpZm5fZGVsZXRlKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9QQ0lGTl9CVzoKKwkJcmMgPSBiZmFkX2lvY21kX3BjaWZuX2J3KGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9BREFQVEVSX0NGR19NT0RFOgorCQlyYyA9IGJmYWRfaW9jbWRfYWRhcHRlcl9jZmdfbW9kZShiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUE9SVF9DRkdfTU9ERToKKwkJcmMgPSBiZmFkX2lvY21kX3BvcnRfY2ZnX21vZGUoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZMQVNIX0VOQUJMRV9PUFRST006CisJY2FzZSBJT0NNRF9GTEFTSF9ESVNBQkxFX09QVFJPTToKKwkJcmMgPSBiZmFkX2lvY21kX2FibGtfb3B0cm9tKGJmYWQsIGNtZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZBQV9FTkFCTEU6CisJCXJjID0gYmZhZF9pb2NtZF9mYWFfZW5hYmxlKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQUFfRElTQUJMRToKKwkJcmMgPSBiZmFkX2lvY21kX2ZhYV9kaXNhYmxlKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQUFfUVVFUlk6CisJCXJjID0gYmZhZF9pb2NtZF9mYWFfcXVlcnkoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0NFRV9HRVRfQVRUUjoKKwkJcmMgPSBiZmFkX2lvY21kX2NlZV9hdHRyKGJmYWQsIGlvY21kLCBwYXlsb2FkX2xlbik7CisJCWJyZWFrOworCWNhc2UgSU9DTURfQ0VFX0dFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX2NlZV9nZXRfc3RhdHMoYmZhZCwgaW9jbWQsIHBheWxvYWRfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9DRUVfUkVTRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9jZWVfcmVzZXRfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1NGUF9NRURJQToKKwkJcmMgPSBiZmFkX2lvY21kX3NmcF9tZWRpYShiZmFkLCBpb2NtZCk7CisJCSBicmVhazsKKwljYXNlIElPQ01EX1NGUF9TUEVFRDoKKwkJcmMgPSBiZmFkX2lvY21kX3NmcF9zcGVlZChiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRkxBU0hfR0VUX0FUVFI6CisJCXJjID0gYmZhZF9pb2NtZF9mbGFzaF9nZXRfYXR0cihiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRkxBU0hfRVJBU0VfUEFSVDoKKwkJcmMgPSBiZmFkX2lvY21kX2ZsYXNoX2VyYXNlX3BhcnQoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZMQVNIX1VQREFURV9QQVJUOgorCQlyYyA9IGJmYWRfaW9jbWRfZmxhc2hfdXBkYXRlX3BhcnQoYmZhZCwgaW9jbWQsIHBheWxvYWRfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GTEFTSF9SRUFEX1BBUlQ6CisJCXJjID0gYmZhZF9pb2NtZF9mbGFzaF9yZWFkX3BhcnQoYmZhZCwgaW9jbWQsIHBheWxvYWRfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9ESUFHX1RFTVA6CisJCXJjID0gYmZhZF9pb2NtZF9kaWFnX3RlbXAoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0RJQUdfTUVNVEVTVDoKKwkJcmMgPSBiZmFkX2lvY21kX2RpYWdfbWVtdGVzdChiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRElBR19MT09QQkFDSzoKKwkJcmMgPSBiZmFkX2lvY21kX2RpYWdfbG9vcGJhY2soYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0RJQUdfRldQSU5HOgorCQlyYyA9IGJmYWRfaW9jbWRfZGlhZ19md3BpbmcoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0RJQUdfUVVFVUVURVNUOgorCQlyYyA9IGJmYWRfaW9jbWRfZGlhZ19xdWV1ZXRlc3QoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0RJQUdfU0ZQOgorCQlyYyA9IGJmYWRfaW9jbWRfZGlhZ19zZnAoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0RJQUdfTEVEOgorCQlyYyA9IGJmYWRfaW9jbWRfZGlhZ19sZWQoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0RJQUdfQkVBQ09OX0xQT1JUOgorCQlyYyA9IGJmYWRfaW9jbWRfZGlhZ19iZWFjb25fbHBvcnQoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0RJQUdfTEJfU1RBVDoKKwkJcmMgPSBiZmFkX2lvY21kX2RpYWdfbGJfc3RhdChiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUEhZX0dFVF9BVFRSOgorCQlyYyA9IGJmYWRfaW9jbWRfcGh5X2dldF9hdHRyKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9QSFlfR0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfcGh5X2dldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUEhZX1VQREFURV9GVzoKKwkJcmMgPSBiZmFkX2lvY21kX3BoeV91cGRhdGUoYmZhZCwgaW9jbWQsIHBheWxvYWRfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9QSFlfUkVBRF9GVzoKKwkJcmMgPSBiZmFkX2lvY21kX3BoeV9yZWFkKGJmYWQsIGlvY21kLCBwYXlsb2FkX2xlbik7CisJCWJyZWFrOworCWNhc2UgSU9DTURfVkhCQV9RVUVSWToKKwkJcmMgPSBiZmFkX2lvY21kX3ZoYmFfcXVlcnkoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0RFQlVHX1BPUlRMT0c6CisJCXJjID0gYmZhZF9pb2NtZF9wb3JnbG9nX2dldChiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIC1yYzsKK30KKworc3RhdGljIGludAorYmZhZF9pbV9ic2dfdmVuZG9yX3JlcXVlc3Qoc3RydWN0IGZjX2JzZ19qb2IgKmpvYikKK3sKKwl1aW50MzJfdCB2ZW5kb3JfY21kID0gam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFswXTsKKwlzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQgPQorCQkJKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqKSBqb2ItPnNob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gaW1fcG9ydC0+YmZhZDsKKwl2b2lkICpwYXlsb2FkX2tidWY7CisJaW50IHJjID0gLUVJTlZBTDsKKworCS8qIEFsbG9jYXRlIGEgdGVtcCBidWZmZXIgdG8gaG9sZCB0aGUgcGFzc2VkIGluIHVzZXIgc3BhY2UgY29tbWFuZCAqLworCXBheWxvYWRfa2J1ZiA9IGt6YWxsb2Moam9iLT5yZXF1ZXN0X3BheWxvYWQucGF5bG9hZF9sZW4sIEdGUF9LRVJORUwpOworCWlmICghcGF5bG9hZF9rYnVmKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ29weSB0aGUgc2dfbGlzdCBwYXNzZWQgaW4gdG8gYSBsaW5lYXIgYnVmZmVyOiBob2xkcyB0aGUgY21uZCBkYXRhICovCisJc2dfY29weV90b19idWZmZXIoam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfbGlzdCwKKwkJCSAgam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBwYXlsb2FkX2tidWYsCisJCQkgIGpvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuKTsKKworCS8qIEludm9rZSBJT0NNRCBoYW5kbGVyIC0gdG8gaGFuZGxlIGFsbCB0aGUgdmVuZG9yIGNvbW1hbmQgcmVxdWVzdHMgKi8KKwlyYyA9IGJmYWRfaW9jbWRfaGFuZGxlcihiZmFkLCB2ZW5kb3JfY21kLCBwYXlsb2FkX2tidWYsCisJCQkJam9iLT5yZXF1ZXN0X3BheWxvYWQucGF5bG9hZF9sZW4pOworCWlmIChyYyAhPSBCRkFfU1RBVFVTX09LKQorCQlnb3RvIGVycm9yOworCisJLyogQ29weSB0aGUgcmVzcG9uc2UgZGF0YSB0byB0aGUgam9iLT5yZXBseV9wYXlsb2FkIHNnX2xpc3QgKi8KKwlzZ19jb3B5X2Zyb21fYnVmZmVyKGpvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0LAorCQkJICAgIGpvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsCisJCQkgICAgcGF5bG9hZF9rYnVmLAorCQkJICAgIGpvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbik7CisKKwkvKiBmcmVlIHRoZSBjb21tYW5kIGJ1ZmZlciAqLworCWtmcmVlKHBheWxvYWRfa2J1Zik7CisKKwkvKiBGaWxsIHRoZSBCU0cgam9iIHJlcGx5IGRhdGEgKi8KKwlqb2ItPnJlcGx5X2xlbiA9IGpvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbjsKKwlqb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSBqb2ItPnJlcGx5X3BheWxvYWQucGF5bG9hZF9sZW47CisJam9iLT5yZXBseS0+cmVzdWx0ID0gcmM7CisKKwlqb2ItPmpvYl9kb25lKGpvYik7CisJcmV0dXJuIHJjOworZXJyb3I6CisJLyogZnJlZSB0aGUgY29tbWFuZCBidWZmZXIgKi8KKwlrZnJlZShwYXlsb2FkX2tidWYpOworb3V0OgorCWpvYi0+cmVwbHktPnJlc3VsdCA9IHJjOworCWpvYi0+cmVwbHlfbGVuID0gc2l6ZW9mKHVpbnQzMl90KTsKKwlqb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOworCXJldHVybiByYzsKK30KKworLyogRkMgcGFzc3RocnUgY2FsbCBiYWNrcyAqLwordTY0CitiZmFkX2ZjeHBfZ2V0X3JlcV9zZ2FkZHJfY2Iodm9pZCAqYmZhZF9mY3hwLCBpbnQgc2dlaWQpCit7CisJc3RydWN0IGJmYWRfZmN4cAkqZHJ2X2ZjeHAgPSBiZmFkX2ZjeHA7CisJc3RydWN0IGJmYV9zZ2VfcyAgKnNnZTsKKwl1NjQJYWRkcjsKKworCXNnZSA9IGRydl9mY3hwLT5yZXFfc2dlICsgc2dlaWQ7CisJYWRkciA9ICh1NjQpKHNpemVfdCkgc2dlLT5zZ19hZGRyOworCXJldHVybiBhZGRyOworfQorCit1MzIKK2JmYWRfZmN4cF9nZXRfcmVxX3NnbGVuX2NiKHZvaWQgKmJmYWRfZmN4cCwgaW50IHNnZWlkKQoreworCXN0cnVjdCBiZmFkX2ZjeHAJKmRydl9mY3hwID0gYmZhZF9mY3hwOworCXN0cnVjdCBiZmFfc2dlX3MJKnNnZTsKKworCXNnZSA9IGRydl9mY3hwLT5yZXFfc2dlICsgc2dlaWQ7CisJcmV0dXJuIHNnZS0+c2dfbGVuOworfQorCit1NjQKK2JmYWRfZmN4cF9nZXRfcnNwX3NnYWRkcl9jYih2b2lkICpiZmFkX2ZjeHAsIGludCBzZ2VpZCkKK3sKKwlzdHJ1Y3QgYmZhZF9mY3hwCSpkcnZfZmN4cCA9IGJmYWRfZmN4cDsKKwlzdHJ1Y3QgYmZhX3NnZV9zCSpzZ2U7CisJdTY0CWFkZHI7CisKKwlzZ2UgPSBkcnZfZmN4cC0+cnNwX3NnZSArIHNnZWlkOworCWFkZHIgPSAodTY0KShzaXplX3QpIHNnZS0+c2dfYWRkcjsKKwlyZXR1cm4gYWRkcjsKK30KKwordTMyCitiZmFkX2ZjeHBfZ2V0X3JzcF9zZ2xlbl9jYih2b2lkICpiZmFkX2ZjeHAsIGludCBzZ2VpZCkKK3sKKwlzdHJ1Y3QgYmZhZF9mY3hwCSpkcnZfZmN4cCA9IGJmYWRfZmN4cDsKKwlzdHJ1Y3QgYmZhX3NnZV9zCSpzZ2U7CisKKwlzZ2UgPSBkcnZfZmN4cC0+cnNwX3NnZSArIHNnZWlkOworCXJldHVybiBzZ2UtPnNnX2xlbjsKK30KKwordm9pZAorYmZhZF9zZW5kX2ZjcHRfY2Iodm9pZCAqYmZhZF9mY3hwLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwgdm9pZCAqY2JhcmcsCisJCWJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLCB1MzIgcnNwX2xlbiwgdTMyIHJlc2lkX2xlbiwKKwkJc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpCit7CisJc3RydWN0IGJmYWRfZmN4cCAqZHJ2X2ZjeHAgPSBiZmFkX2ZjeHA7CisKKwlkcnZfZmN4cC0+cmVxX3N0YXR1cyA9IHJlcV9zdGF0dXM7CisJZHJ2X2ZjeHAtPnJzcF9sZW4gPSByc3BfbGVuOworCisJLyogYmZhX2ZjeHAgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZyZWVkIGJ5IEJGQSAqLworCWRydl9mY3hwLT5iZmFfZmN4cCA9IE5VTEw7CisJY29tcGxldGUoJmRydl9mY3hwLT5jb21wKTsKK30KKworc3RydWN0IGJmYWRfYnVmX2luZm8gKgorYmZhZF9mY3hwX21hcF9zZyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpwYXlsb2FkX2tidWYsCisJCSB1aW50MzJfdCBwYXlsb2FkX2xlbiwgdWludDMyX3QgKm51bV9zZ2xlcykKK3sKKwlzdHJ1Y3QgYmZhZF9idWZfaW5mbwkqYnVmX2Jhc2UsICpidWZfaW5mbzsKKwlzdHJ1Y3QgYmZhX3NnZV9zCSpzZ190YWJsZTsKKwlpbnQgc2dlX251bSA9IDE7CisKKwlidWZfYmFzZSA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgYmZhZF9idWZfaW5mbykgKworCQkJICAgc2l6ZW9mKHN0cnVjdCBiZmFfc2dlX3MpKSAqIHNnZV9udW0sIEdGUF9LRVJORUwpOworCWlmICghYnVmX2Jhc2UpCisJCXJldHVybiBOVUxMOworCisJc2dfdGFibGUgPSAoc3RydWN0IGJmYV9zZ2VfcyAqKSAoKCh1aW50OF90ICopYnVmX2Jhc2UpICsKKwkJCShzaXplb2Yoc3RydWN0IGJmYWRfYnVmX2luZm8pICogc2dlX251bSkpOworCisJLyogQWxsb2NhdGUgZG1hIGNvaGVyZW50IG1lbW9yeSAqLworCWJ1Zl9pbmZvID0gYnVmX2Jhc2U7CisJYnVmX2luZm8tPnNpemUgPSBwYXlsb2FkX2xlbjsKKwlidWZfaW5mby0+dmlydCA9IGRtYV9hbGxvY19jb2hlcmVudCgmYmZhZC0+cGNpZGV2LT5kZXYsIGJ1Zl9pbmZvLT5zaXplLAorCQkJCQkmYnVmX2luZm8tPnBoeXMsIEdGUF9LRVJORUwpOworCWlmICghYnVmX2luZm8tPnZpcnQpCisJCWdvdG8gb3V0X2ZyZWVfbWVtOworCisJLyogY29weSB0aGUgbGluZWFyIGJzZyBidWZmZXIgdG8gYnVmX2luZm8gKi8KKwltZW1zZXQoYnVmX2luZm8tPnZpcnQsIDAsIGJ1Zl9pbmZvLT5zaXplKTsKKwltZW1jcHkoYnVmX2luZm8tPnZpcnQsIHBheWxvYWRfa2J1ZiwgYnVmX2luZm8tPnNpemUpOworCisJLyoKKwkgKiBTZXR1cCBTRyB0YWJsZQorCSAqLworCXNnX3RhYmxlLT5zZ19sZW4gPSBidWZfaW5mby0+c2l6ZTsKKwlzZ190YWJsZS0+c2dfYWRkciA9ICh2b2lkICopKHNpemVfdCkgYnVmX2luZm8tPnBoeXM7CisKKwkqbnVtX3NnbGVzID0gc2dlX251bTsKKworCXJldHVybiBidWZfYmFzZTsKKworb3V0X2ZyZWVfbWVtOgorCWtmcmVlKGJ1Zl9iYXNlKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZAorYmZhZF9mY3hwX2ZyZWVfbWVtKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHN0cnVjdCBiZmFkX2J1Zl9pbmZvICpidWZfYmFzZSwKKwkJICAgdWludDMyX3QgbnVtX3NnbGVzKQoreworCWludCBpOworCXN0cnVjdCBiZmFkX2J1Zl9pbmZvICpidWZfaW5mbyA9IGJ1Zl9iYXNlOworCisJaWYgKGJ1Zl9iYXNlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fc2dsZXM7IGJ1Zl9pbmZvKyssIGkrKykgeworCQkJaWYgKGJ1Zl9pbmZvLT52aXJ0ICE9IE5VTEwpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmJmYWQtPnBjaWRldi0+ZGV2LAorCQkJCQlidWZfaW5mby0+c2l6ZSwgYnVmX2luZm8tPnZpcnQsCisJCQkJCWJ1Zl9pbmZvLT5waHlzKTsKKwkJfQorCQlrZnJlZShidWZfYmFzZSk7CisJfQorfQorCitpbnQKK2JmYWRfZmN4cF9ic2dfc2VuZChzdHJ1Y3QgZmNfYnNnX2pvYiAqam9iLCBzdHJ1Y3QgYmZhZF9mY3hwICpkcnZfZmN4cCwKKwkJICAgYmZhX2JzZ19mY3B0X3QgKmJzZ19mY3B0KQoreworCXN0cnVjdCBiZmFfZmN4cF9zICpoYWxfZmN4cDsKKwlzdHJ1Y3QgYmZhZF9zCSpiZmFkID0gZHJ2X2ZjeHAtPnBvcnQtPmJmYWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1aW50OF90CWxwX3RhZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCS8qIEFsbG9jYXRlIGJmYV9mY3hwIHN0cnVjdHVyZSAqLworCWhhbF9mY3hwID0gYmZhX2ZjeHBfYWxsb2MoZHJ2X2ZjeHAsICZiZmFkLT5iZmEsCisJCQkJICBkcnZfZmN4cC0+bnVtX3JlcV9zZ2xlcywKKwkJCQkgIGRydl9mY3hwLT5udW1fcnNwX3NnbGVzLAorCQkJCSAgYmZhZF9mY3hwX2dldF9yZXFfc2dhZGRyX2NiLAorCQkJCSAgYmZhZF9mY3hwX2dldF9yZXFfc2dsZW5fY2IsCisJCQkJICBiZmFkX2ZjeHBfZ2V0X3JzcF9zZ2FkZHJfY2IsCisJCQkJICBiZmFkX2ZjeHBfZ2V0X3JzcF9zZ2xlbl9jYik7CisJaWYgKCFoYWxfZmN4cCkgeworCQliZmFfdHJjKGJmYWQsIDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRU5PTUVNOworCX0KKworCWRydl9mY3hwLT5iZmFfZmN4cCA9IGhhbF9mY3hwOworCisJbHBfdGFnID0gYmZhX2xwc19nZXRfdGFnX2Zyb21fcGlkKCZiZmFkLT5iZmEsIGJzZ19mY3B0LT5mY2hzLnNfaWQpOworCisJYmZhX2ZjeHBfc2VuZChoYWxfZmN4cCwgZHJ2X2ZjeHAtPmJmYV9ycG9ydCwgYnNnX2ZjcHQtPnZmX2lkLCBscF90YWcsCisJCSAgICAgIGJzZ19mY3B0LT5jdHMsIGJzZ19mY3B0LT5jb3MsCisJCSAgICAgIGpvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuLAorCQkgICAgICAmYnNnX2ZjcHQtPmZjaHMsIGJmYWRfc2VuZF9mY3B0X2NiLCBiZmFkLAorCQkgICAgICBqb2ItPnJlcGx5X3BheWxvYWQucGF5bG9hZF9sZW4sIGJzZ19mY3B0LT50c2Vjcyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCitpbnQKK2JmYWRfaW1fYnNnX2Vsc19jdF9yZXF1ZXN0KHN0cnVjdCBmY19ic2dfam9iICpqb2IpCit7CisJc3RydWN0IGJmYV9ic2dfZGF0YSAqYnNnX2RhdGE7CisJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KKwkJCShzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKikgam9iLT5zaG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IGltX3BvcnQtPmJmYWQ7CisJYmZhX2JzZ19mY3B0X3QgKmJzZ19mY3B0OworCXN0cnVjdCBiZmFkX2ZjeHAgICAgKmRydl9mY3hwOworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKmZjc19wb3J0OworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKmZjc19ycG9ydDsKKwl1aW50MzJfdCBjb21tYW5kX3R5cGUgPSBqb2ItPnJlcXVlc3QtPm1zZ2NvZGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYmZhZF9idWZfaW5mbyAqcnNwX2J1Zl9pbmZvOworCXZvaWQgKnJlcV9rYnVmID0gTlVMTCwgKnJzcF9rYnVmID0gTlVMTDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJam9iLT5yZXBseV9sZW4gID0gc2l6ZW9mKHVpbnQzMl90KTsJLyogQXRsZWFzdCB1aW50MzJfdCByZXBseV9sZW4gKi8KKwlqb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOworCisJLyogR2V0IHRoZSBwYXlsb2FkIHBhc3NlZCBpbiBmcm9tIHVzZXJzcGFjZSAqLworCWJzZ19kYXRhID0gKHN0cnVjdCBiZmFfYnNnX2RhdGEgKikgKCgoY2hhciAqKWpvYi0+cmVxdWVzdCkgKworCQkJCQlzaXplb2Yoc3RydWN0IGZjX2JzZ19yZXF1ZXN0KSk7CisJaWYgKGJzZ19kYXRhID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIGJzZ19mY3B0IGFuZCBkbyBhIGNvcHlfZnJvbV91c2VyIG9wIGZvciBwYXlsb2FkCisJICogYnVmZmVyIG9mIHNpemUgYnNnX2RhdGEtPnBheWxvYWRfbGVuCisJICovCisJYnNnX2ZjcHQgPSAoc3RydWN0IGJmYV9ic2dfZmNwdF9zICopCisJCSAgIGt6YWxsb2MoYnNnX2RhdGEtPnBheWxvYWRfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJzZ19mY3B0KQorCQlnb3RvIG91dDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigodWludDhfdCAqKWJzZ19mY3B0LCBic2dfZGF0YS0+cGF5bG9hZCwKKwkJCQlic2dfZGF0YS0+cGF5bG9hZF9sZW4pKSB7CisJCWtmcmVlKGJzZ19mY3B0KTsKKwkJZ290byBvdXQ7CisJfQorCisJZHJ2X2ZjeHAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmZhZF9mY3hwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRydl9mY3hwID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3BvcnQgPSBiZmFfZmNzX2xvb2t1cF9wb3J0KCZiZmFkLT5iZmFfZmNzLCBic2dfZmNwdC0+dmZfaWQsCisJCQkJCWJzZ19mY3B0LT5scHd3bik7CisJaWYgKGZjc19wb3J0ID09IE5VTEwpIHsKKwkJYnNnX2ZjcHQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9MV1dOOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJZ290byBvdXRfZnJlZV9tZW07CisJfQorCisJLyogQ2hlY2sgaWYgdGhlIHBvcnQgaXMgb25saW5lIGJlZm9yZSBzZW5kaW5nIEZDIFBhc3N0aHJ1IGNtZCAqLworCWlmICghYmZhX2Zjc19scG9ydF9pc19vbmxpbmUoZmNzX3BvcnQpKSB7CisJCWJzZ19mY3B0LT5zdGF0dXMgPSBCRkFfU1RBVFVTX1BPUlRfT0ZGTElORTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWdvdG8gb3V0X2ZyZWVfbWVtOworCX0KKworCWRydl9mY3hwLT5wb3J0ID0gZmNzX3BvcnQtPmJmYWRfcG9ydDsKKworCWlmIChkcnZfZmN4cC0+cG9ydC0+YmZhZCA9PSAwKQorCQlkcnZfZmN4cC0+cG9ydC0+YmZhZCA9IGJmYWQ7CisKKwkvKiBGZXRjaCB0aGUgYmZhX3Jwb3J0IC0gaWYgbmV4dXMgbmVlZGVkICovCisJaWYgKGNvbW1hbmRfdHlwZSA9PSBGQ19CU0dfSFNUX0VMU19OT0xPR0lOIHx8CisJICAgIGNvbW1hbmRfdHlwZSA9PSBGQ19CU0dfSFNUX0NUKSB7CisJCS8qIEJTRyBIU1QgY29tbWFuZHM6IG5vIG5leHVzIG5lZWRlZCAqLworCQlkcnZfZmN4cC0+YmZhX3Jwb3J0ID0gTlVMTDsKKworCX0gZWxzZSBpZiAoY29tbWFuZF90eXBlID09IEZDX0JTR19SUFRfRUxTIHx8CisJCSAgIGNvbW1hbmRfdHlwZSA9PSBGQ19CU0dfUlBUX0NUKSB7CisJCS8qIEJTRyBSUFQgY29tbWFuZHM6IG5leHVzIG5lZWRlZCAqLworCQlmY3NfcnBvcnQgPSBiZmFfZmNzX2xwb3J0X2dldF9ycG9ydF9ieV9wd3duKGZjc19wb3J0LAorCQkJCQkJCSAgICBic2dfZmNwdC0+ZHB3d24pOworCQlpZiAoZmNzX3Jwb3J0ID09IE5VTEwpIHsKKwkJCWJzZ19mY3B0LT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fUldXTjsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQkJZ290byBvdXRfZnJlZV9tZW07CisJCX0KKworCQlkcnZfZmN4cC0+YmZhX3Jwb3J0ID0gZmNzX3Jwb3J0LT5iZmFfcnBvcnQ7CisKKwl9IGVsc2UgeyAvKiBVbmtub3duIEJTRyBtc2djb2RlOyByZXR1cm4gLUVJTlZBTCAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJZ290byBvdXRfZnJlZV9tZW07CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcSAvIHJzcCBidWZmZXJzICovCisJcmVxX2tidWYgPSBremFsbG9jKGpvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcV9rYnVmKSB7CisJCXByaW50ayhLRVJOX0lORk8gImJmYSAlczogZmNwdCByZXF1ZXN0IGJ1ZmZlciBhbGxvYyBmYWlsZWRcbiIsCisJCQkJYmZhZC0+cGNpX25hbWUpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfbWVtOworCX0KKworCXJzcF9rYnVmID0ga3phbGxvYyhqb2ItPnJlcGx5X3BheWxvYWQucGF5bG9hZF9sZW4sIEdGUF9LRVJORUwpOworCWlmICghcnNwX2tidWYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmZhICVzOiBmY3B0IHJlc3BvbnNlIGJ1ZmZlciBhbGxvYyBmYWlsZWRcbiIsCisJCQkJYmZhZC0+cGNpX25hbWUpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfbWVtOworCX0KKworCS8qIG1hcCByZXEgc2cgLSBjb3B5IHRoZSBzZ19saXN0IHBhc3NlZCBpbiB0byB0aGUgbGluZWFyIGJ1ZmZlciAqLworCXNnX2NvcHlfdG9fYnVmZmVyKGpvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QsCisJCQkgIGpvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgcmVxX2tidWYsCisJCQkgIGpvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuKTsKKworCWRydl9mY3hwLT5yZXFidWZfaW5mbyA9IGJmYWRfZmN4cF9tYXBfc2coYmZhZCwgcmVxX2tidWYsCisJCQkJCWpvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuLAorCQkJCQkmZHJ2X2ZjeHAtPm51bV9yZXFfc2dsZXMpOworCWlmICghZHJ2X2ZjeHAtPnJlcWJ1Zl9pbmZvKSB7CisJCXByaW50ayhLRVJOX0lORk8gImJmYSAlczogZmNwdCByZXF1ZXN0IGZjeHBfbWFwX3NnIGZhaWxlZFxuIiwKKwkJCQliZmFkLT5wY2lfbmFtZSk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9tZW07CisJfQorCisJZHJ2X2ZjeHAtPnJlcV9zZ2UgPSAoc3RydWN0IGJmYV9zZ2VfcyAqKQorCQkJICAgICgoKHVpbnQ4X3QgKilkcnZfZmN4cC0+cmVxYnVmX2luZm8pICsKKwkJCSAgICAoc2l6ZW9mKHN0cnVjdCBiZmFkX2J1Zl9pbmZvKSAqCisJCQkJCWRydl9mY3hwLT5udW1fcmVxX3NnbGVzKSk7CisKKwkvKiBtYXAgcnNwIHNnICovCisJZHJ2X2ZjeHAtPnJzcGJ1Zl9pbmZvID0gYmZhZF9mY3hwX21hcF9zZyhiZmFkLCByc3Bfa2J1ZiwKKwkJCQkJam9iLT5yZXBseV9wYXlsb2FkLnBheWxvYWRfbGVuLAorCQkJCQkmZHJ2X2ZjeHAtPm51bV9yc3Bfc2dsZXMpOworCWlmICghZHJ2X2ZjeHAtPnJzcGJ1Zl9pbmZvKSB7CisJCXByaW50ayhLRVJOX0lORk8gImJmYSAlczogZmNwdCByZXNwb25zZSBmY3hwX21hcF9zZyBmYWlsZWRcbiIsCisJCQkJYmZhZC0+cGNpX25hbWUpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfbWVtOworCX0KKworCXJzcF9idWZfaW5mbyA9IChzdHJ1Y3QgYmZhZF9idWZfaW5mbyAqKWRydl9mY3hwLT5yc3BidWZfaW5mbzsKKwlkcnZfZmN4cC0+cnNwX3NnZSA9IChzdHJ1Y3QgYmZhX3NnZV9zICAqKQorCQkJICAgICgoKHVpbnQ4X3QgKilkcnZfZmN4cC0+cnNwYnVmX2luZm8pICsKKwkJCSAgICAoc2l6ZW9mKHN0cnVjdCBiZmFkX2J1Zl9pbmZvKSAqCisJCQkJCWRydl9mY3hwLT5udW1fcnNwX3NnbGVzKSk7CisKKwkvKiBmY3hwIHNlbmQgKi8KKwlpbml0X2NvbXBsZXRpb24oJmRydl9mY3hwLT5jb21wKTsKKwlyYyA9IGJmYWRfZmN4cF9ic2dfc2VuZChqb2IsIGRydl9mY3hwLCBic2dfZmNwdCk7CisJaWYgKHJjID09IEJGQV9TVEFUVVNfT0spIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmZHJ2X2ZjeHAtPmNvbXApOworCQlic2dfZmNwdC0+c3RhdHVzID0gZHJ2X2ZjeHAtPnJlcV9zdGF0dXM7CisJfSBlbHNlIHsKKwkJYnNnX2ZjcHQtPnN0YXR1cyA9IHJjOworCQlnb3RvIG91dF9mcmVlX21lbTsKKwl9CisKKwkvKiBmaWxsIHRoZSBqb2ItPnJlcGx5IGRhdGEgKi8KKwlpZiAoZHJ2X2ZjeHAtPnJlcV9zdGF0dXMgPT0gQkZBX1NUQVRVU19PSykgeworCQlqb2ItPnJlcGx5X2xlbiA9IGRydl9mY3hwLT5yc3BfbGVuOworCQlqb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSBkcnZfZmN4cC0+cnNwX2xlbjsKKwkJam9iLT5yZXBseS0+cmVwbHlfZGF0YS5jdGVsc19yZXBseS5zdGF0dXMgPSBGQ19DVEVMU19TVEFUVVNfT0s7CisJfSBlbHNlIHsKKwkJam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0KKwkJCQkJc2l6ZW9mKHN0cnVjdCBmY19ic2dfY3RlbHNfcmVwbHkpOworCQlqb2ItPnJlcGx5X2xlbiA9IHNpemVvZih1aW50MzJfdCk7CisJCWpvYi0+cmVwbHktPnJlcGx5X2RhdGEuY3RlbHNfcmVwbHkuc3RhdHVzID0KKwkJCQkJCUZDX0NURUxTX1NUQVRVU19SRUpFQ1Q7CisJfQorCisJLyogQ29weSB0aGUgcmVzcG9uc2UgZGF0YSB0byB0aGUgcmVwbHlfcGF5bG9hZCBzZyBsaXN0ICovCisJc2dfY29weV9mcm9tX2J1ZmZlcihqb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdCwKKwkJCSAgICBqb2ItPnJlcGx5X3BheWxvYWQuc2dfY250LAorCQkJICAgICh1aW50OF90ICopcnNwX2J1Zl9pbmZvLT52aXJ0LAorCQkJICAgIGpvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbik7CisKK291dF9mcmVlX21lbToKKwliZmFkX2ZjeHBfZnJlZV9tZW0oYmZhZCwgZHJ2X2ZjeHAtPnJzcGJ1Zl9pbmZvLAorCQkJICAgZHJ2X2ZjeHAtPm51bV9yc3Bfc2dsZXMpOworCWJmYWRfZmN4cF9mcmVlX21lbShiZmFkLCBkcnZfZmN4cC0+cmVxYnVmX2luZm8sCisJCQkgICBkcnZfZmN4cC0+bnVtX3JlcV9zZ2xlcyk7CisJa2ZyZWUocmVxX2tidWYpOworCWtmcmVlKHJzcF9rYnVmKTsKKworCS8qIE5lZWQgYSBjb3B5IHRvIHVzZXIgb3AgKi8KKwlpZiAoY29weV90b191c2VyKGJzZ19kYXRhLT5wYXlsb2FkLCAodm9pZCAqKSBic2dfZmNwdCwKKwkJCSBic2dfZGF0YS0+cGF5bG9hZF9sZW4pKQorCQlyYyA9IC1FSU87CisKKwlrZnJlZShic2dfZmNwdCk7CisJa2ZyZWUoZHJ2X2ZjeHApOworb3V0OgorCWpvYi0+cmVwbHktPnJlc3VsdCA9IHJjOworCisJaWYgKHJjID09IEJGQV9TVEFUVVNfT0spCisJCWpvYi0+am9iX2RvbmUoam9iKTsKKworCXJldHVybiByYzsKK30KKworaW50CitiZmFkX2ltX2JzZ19yZXF1ZXN0KHN0cnVjdCBmY19ic2dfam9iICpqb2IpCit7CisJdWludDMyX3QgcmMgPSBCRkFfU1RBVFVTX09LOworCisJc3dpdGNoIChqb2ItPnJlcXVlc3QtPm1zZ2NvZGUpIHsKKwljYXNlIEZDX0JTR19IU1RfVkVORE9SOgorCQkvKiBQcm9jZXNzIEJTRyBIU1QgVmVuZG9yIHJlcXVlc3RzICovCisJCXJjID0gYmZhZF9pbV9ic2dfdmVuZG9yX3JlcXVlc3Qoam9iKTsKKwkJYnJlYWs7CisJY2FzZSBGQ19CU0dfSFNUX0VMU19OT0xPR0lOOgorCWNhc2UgRkNfQlNHX1JQVF9FTFM6CisJY2FzZSBGQ19CU0dfSFNUX0NUOgorCWNhc2UgRkNfQlNHX1JQVF9DVDoKKwkJLyogUHJvY2VzcyBCU0cgRUxTL0NUIGNvbW1hbmRzICovCisJCXJjID0gYmZhZF9pbV9ic2dfZWxzX2N0X3JlcXVlc3Qoam9iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJam9iLT5yZXBseS0+cmVzdWx0ID0gcmMgPSAtRUlOVkFMOworCQlqb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorYmZhZF9pbV9ic2dfdGltZW91dChzdHJ1Y3QgZmNfYnNnX2pvYiAqam9iKQoreworCS8qIERvbid0IGNvbXBsZXRlIHRoZSBCU0cgam9iIHJlcXVlc3QgLSByZXR1cm4gLUVBR0FJTgorCSAqIHRvIHJlc2V0IGJzZyBqb2IgdGltZW91dCA6IGZvciBFTFMvQ1QgcGFzcyB0aHJ1IHdlCisJICogYWxyZWFkeSBoYXZlIHRpbWVyIHRvIHRyYWNrIHRoZSByZXF1ZXN0LgorCSAqLworCXJldHVybiAtRUFHQUlOOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjBlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmgKQEAgLTAsMCArMSw1MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIHd3dy5icm9jYWRlLmNvbQorICoKKyAqIExpbnV4IGRyaXZlciBmb3IgQnJvY2FkZSBGaWJyZSBDaGFubmVsIEhvc3QgQnVzIEFkYXB0ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgQkZBRF9CU0dfSAorI2RlZmluZSBCRkFEX0JTR19ICisKKyNpbmNsdWRlICJiZmFfZGVmcy5oIgorI2luY2x1ZGUgImJmYV9kZWZzX2Zjcy5oIgorCisvKiBEZWZpbml0aW9ucyBvZiB2ZW5kb3IgdW5pcXVlIHN0cnVjdHVyZXMgYW5kIGNvbW1hbmQgY29kZXMgcGFzc2VkIGluCisgKiB1c2luZyBGQ19CU0dfSFNUX1ZFTkRPUiBtZXNzYWdlIGNvZGUuCisgKi8KK2VudW0geworCUlPQ01EX0lPQ19FTkFCTEUgPSAweDEsCisJSU9DTURfSU9DX0RJU0FCTEUsCisJSU9DTURfSU9DX0dFVF9BVFRSLAorCUlPQ01EX0lPQ19HRVRfSU5GTywKKwlJT0NNRF9JT0NfR0VUX1NUQVRTLAorCUlPQ01EX0lPQ19HRVRfRldTVEFUUywKKwlJT0NNRF9JT0NGQ19HRVRfQVRUUiwKKwlJT0NNRF9JT0NGQ19TRVRfSU5UUiwKKwlJT0NNRF9QT1JUX0VOQUJMRSwKKwlJT0NNRF9QT1JUX0RJU0FCTEUsCisJSU9DTURfUE9SVF9HRVRfQVRUUiwKKwlJT0NNRF9QT1JUX0dFVF9TVEFUUywKKwlJT0NNRF9MUE9SVF9HRVRfQVRUUiwKKwlJT0NNRF9MUE9SVF9HRVRfUlBPUlRTLAorCUlPQ01EX0xQT1JUX0dFVF9TVEFUUywKKwlJT0NNRF9MUE9SVF9HRVRfSU9TVEFUUywKKwlJT0NNRF9SUE9SVF9HRVRfQVRUUiwKKwlJT0NNRF9SUE9SVF9HRVRfQUREUiwKKwlJT0NNRF9SUE9SVF9HRVRfU1RBVFMsCisJSU9DTURfRkFCUklDX0dFVF9MUE9SVFMsCisJSU9DTURfRkNQSU1fTU9EU1RBVFMsCisJSU9DTURfRkNQSU1fREVMX0lUTl9TVEFUUywKKwlJT0NNRF9JVE5JTV9HRVRfQVRUUiwKKwlJT0NNRF9JVE5JTV9HRVRfSU9TVEFUUywKKwlJT0NNRF9JVE5JTV9HRVRfSVROU1RBVFMsCisJSU9DTURfSU9DX1BDSUZOX0NGRywKKwlJT0NNRF9GQ1BPUlRfRU5BQkxFLAorCUlPQ01EX0ZDUE9SVF9ESVNBQkxFLAorCUlPQ01EX1BDSUZOX0NSRUFURSwKKwlJT0NNRF9QQ0lGTl9ERUxFVEUsCisJSU9DTURfUENJRk5fQlcsCisJSU9DTURfQURBUFRFUl9DRkdfTU9ERSwKKwlJT0NNRF9QT1JUX0NGR19NT0RFLAorCUlPQ01EX0ZMQVNIX0VOQUJMRV9PUFRST00sCisJSU9DTURfRkxBU0hfRElTQUJMRV9PUFRST00sCisJSU9DTURfRkFBX0VOQUJMRSwKKwlJT0NNRF9GQUFfRElTQUJMRSwKKwlJT0NNRF9GQUFfUVVFUlksCisJSU9DTURfQ0VFX0dFVF9BVFRSLAorCUlPQ01EX0NFRV9HRVRfU1RBVFMsCisJSU9DTURfQ0VFX1JFU0VUX1NUQVRTLAorCUlPQ01EX1NGUF9NRURJQSwKKwlJT0NNRF9TRlBfU1BFRUQsCisJSU9DTURfRkxBU0hfR0VUX0FUVFIsCisJSU9DTURfRkxBU0hfRVJBU0VfUEFSVCwKKwlJT0NNRF9GTEFTSF9VUERBVEVfUEFSVCwKKwlJT0NNRF9GTEFTSF9SRUFEX1BBUlQsCisJSU9DTURfRElBR19URU1QLAorCUlPQ01EX0RJQUdfTUVNVEVTVCwKKwlJT0NNRF9ESUFHX0xPT1BCQUNLLAorCUlPQ01EX0RJQUdfRldQSU5HLAorCUlPQ01EX0RJQUdfUVVFVUVURVNULAorCUlPQ01EX0RJQUdfU0ZQLAorCUlPQ01EX0RJQUdfTEVELAorCUlPQ01EX0RJQUdfQkVBQ09OX0xQT1JULAorCUlPQ01EX0RJQUdfTEJfU1RBVCwKKwlJT0NNRF9QSFlfR0VUX0FUVFIsCisJSU9DTURfUEhZX0dFVF9TVEFUUywKKwlJT0NNRF9QSFlfVVBEQVRFX0ZXLAorCUlPQ01EX1BIWV9SRUFEX0ZXLAorCUlPQ01EX1ZIQkFfUVVFUlksCisJSU9DTURfREVCVUdfUE9SVExPRywKK307CisKK3N0cnVjdCBiZmFfYnNnX2dlbl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworfTsKKworc3RydWN0IGJmYV9ic2dfaW9jX2luZm9fcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwljaGFyCQlzZXJpYWxudW1bNjRdOworCWNoYXIJCWh3cGF0aFtCRkFfU1RSSU5HXzMyXTsKKwljaGFyCQlhZGFwdGVyX2h3cGF0aFtCRkFfU1RSSU5HXzMyXTsKKwljaGFyCQlndWlkW0JGQV9BREFQVEVSX1NZTV9OQU1FX0xFTioyXTsKKwljaGFyCQluYW1lW0JGQV9BREFQVEVSX1NZTV9OQU1FX0xFTl07CisJY2hhcgkJcG9ydF9uYW1lW0JGQV9BREFQVEVSX1NZTV9OQU1FX0xFTl07CisJY2hhcgkJZXRoX25hbWVbQkZBX0FEQVBURVJfU1lNX05BTUVfTEVOXTsKKwl3d25fdAkJcHd3bjsKKwl3d25fdAkJbnd3bjsKKwl3d25fdAkJZmFjdG9yeXB3d247CisJd3duX3QJCWZhY3Rvcnlud3duOworCW1hY190CQltYWM7CisJbWFjX3QJCWZhY3RvcnlfbWFjOyAvKiBGYWN0b3J5IG1hYyBhZGRyZXNzICovCisJbWFjX3QJCWN1cnJlbnRfbWFjOyAvKiBDdXJyZW50bHkgYXNzaWduZWQgbWFjIGFkZHJlc3MgKi8KKwllbnVtIGJmYV9pb2NfdHlwZV9lCWlvY190eXBlOworCXUxNgkJcHZpZDsgLyogUG9ydCB2bGFuIGlkICovCisJdTE2CQlyc3ZkMTsKKwl1MzIJCWhvc3Q7CisJdTMyCQliYW5kd2lkdGg7IC8qIEZvciBQRiBzdXBwb3J0ICovCisJdTMyCQlyc3ZkMjsKK307CisKK3N0cnVjdCBiZmFfYnNnX2lvY19hdHRyX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJc3RydWN0IGJmYV9pb2NfYXR0cl9zICBpb2NfYXR0cjsKK307CisKK3N0cnVjdCBiZmFfYnNnX2lvY19zdGF0c19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXN0cnVjdCBiZmFfaW9jX3N0YXRzX3MgaW9jX3N0YXRzOworfTsKKworc3RydWN0IGJmYV9ic2dfaW9jX2Z3c3RhdHNfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwl1MzIJCWJ1Zl9zaXplOworCXUzMgkJcnN2ZDE7CisJdTY0CQlidWZfcHRyOworfTsKKworc3RydWN0IGJmYV9ic2dfaW9jZmNfYXR0cl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXN0cnVjdCBiZmFfaW9jZmNfYXR0cl9zCWlvY2ZjX2F0dHI7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19pb2NmY19pbnRyX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJc3RydWN0IGJmYV9pb2NmY19pbnRyX2F0dHJfcyBhdHRyOworfTsKKworc3RydWN0IGJmYV9ic2dfcG9ydF9hdHRyX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJc3RydWN0IGJmYV9wb3J0X2F0dHJfcwlhdHRyOworfTsKKworc3RydWN0IGJmYV9ic2dfcG9ydF9zdGF0c19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXUzMgkJYnVmX3NpemU7CisJdTMyCQlyc3ZkMTsKKwl1NjQJCWJ1Zl9wdHI7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19scG9ydF9hdHRyX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXd3bl90CQlwd3duOworCXN0cnVjdCBiZmFfbHBvcnRfYXR0cl9zIHBvcnRfYXR0cjsKK307CisKK3N0cnVjdCBiZmFfYnNnX2xwb3J0X3N0YXRzX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXd3bl90CQlwd3duOworCXN0cnVjdCBiZmFfbHBvcnRfc3RhdHNfcyBwb3J0X3N0YXRzOworfTsKKworc3RydWN0IGJmYV9ic2dfbHBvcnRfaW9zdGF0c19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKKwl3d25fdAkJcHd3bjsKKwlzdHJ1Y3QgYmZhX2l0bmltX2lvc3RhdHNfcyBpb3N0YXRzOworfTsKKworc3RydWN0IGJmYV9ic2dfbHBvcnRfZ2V0X3Jwb3J0c19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKKwl3d25fdAkJcHd3bjsKKwl1NjQJCXJidWZfcHRyOworCXUzMgkJbnJwb3J0czsKKwl1MzIJCXJzdmQ7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19ycG9ydF9hdHRyX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXd3bl90CQlwd3duOworCXd3bl90CQlycHd3bjsKKwlzdHJ1Y3QgYmZhX3Jwb3J0X2F0dHJfcyBhdHRyOworfTsKKworc3RydWN0IGJmYV9ic2dfcnBvcnRfc3RhdHNfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJdmZfaWQ7CisJd3duX3QJCXB3d247CisJd3duX3QJCXJwd3duOworCXN0cnVjdCBiZmFfcnBvcnRfc3RhdHNfcyBzdGF0czsKK307CisKK3N0cnVjdCBiZmFfYnNnX3Jwb3J0X3Njc2lfYWRkcl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKKwl3d25fdAkJcHd3bjsKKwl3d25fdAkJcnB3d247CisJdTMyCQlob3N0OworCXUzMgkJYnVzOworCXUzMgkJdGFyZ2V0OworCXUzMgkJbHVuOworfTsKKworc3RydWN0IGJmYV9ic2dfZmFicmljX2dldF9scG9ydHNfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJdmZfaWQ7CisJdTY0CQlidWZfcHRyOworCXUzMgkJbnBvcnRzOworCXUzMgkJcnN2ZDsKK307CisKK3N0cnVjdCBiZmFfYnNnX2ZjcGltX21vZHN0YXRzX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwlzdHJ1Y3QgYmZhX2l0bmltX2lvc3RhdHNfcyBtb2RzdGF0czsKK307CisKK3N0cnVjdCBiZmFfYnNnX2ZjcGltX2RlbF9pdG5fc3RhdHNfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXN0cnVjdCBiZmFfZmNwaW1fZGVsX2l0bl9zdGF0c19zIG1vZHN0YXRzOworfTsKKworc3RydWN0IGJmYV9ic2dfaXRuaW1fYXR0cl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKKwl3d25fdAkJbHB3d247CisJd3duX3QJCXJwd3duOworCXN0cnVjdCBiZmFfaXRuaW1fYXR0cl9zCWF0dHI7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19pdG5pbV9pb3N0YXRzX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXd3bl90CQlscHd3bjsKKwl3d25fdAkJcnB3d247CisJc3RydWN0IGJmYV9pdG5pbV9pb3N0YXRzX3MgaW9zdGF0czsKK307CisKK3N0cnVjdCBiZmFfYnNnX2l0bmltX2l0bnN0YXRzX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXd3bl90CQlscHd3bjsKKwl3d25fdAkJcnB3d247CisJc3RydWN0IGJmYV9pdG5pbV9zdGF0c19zIGl0bnN0YXRzOworfTsKKworc3RydWN0IGJmYV9ic2dfcGNpZm5fY2ZnX3MgeworCWJmYV9zdGF0dXNfdAkJc3RhdHVzOworCXUxNgkJCWJmYWRfbnVtOworCXUxNgkJCXJzdmQ7CisJc3RydWN0IGJmYV9hYmxrX2NmZ19zCXBjaWZuX2NmZzsKK307CisKK3N0cnVjdCBiZmFfYnNnX3BjaWZuX3MgeworCWJmYV9zdGF0dXNfdAkJc3RhdHVzOworCXUxNgkJCWJmYWRfbnVtOworCXUxNgkJCXBjaWZuX2lkOworCXUzMgkJCWJhbmR3aWR0aDsKKwl1OAkJCXBvcnQ7CisJZW51bSBiZmlfcGNpZm5fY2xhc3MJcGNpZm5fY2xhc3M7CisJdTgJCQlyc3ZkWzFdOworfTsKKworc3RydWN0IGJmYV9ic2dfYWRhcHRlcl9jZmdfbW9kZV9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXN0cnVjdCBiZmFfYWRhcHRlcl9jZmdfbW9kZV9zCWNmZzsKK307CisKK3N0cnVjdCBiZmFfYnNnX3BvcnRfY2ZnX21vZGVfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJaW5zdGFuY2U7CisJc3RydWN0IGJmYV9wb3J0X2NmZ19tb2RlX3MgY2ZnOworfTsKKworc3RydWN0IGJmYV9ic2dfZmFhX2F0dHJfcyB7CisJYmZhX3N0YXR1c190CQlzdGF0dXM7CisJdTE2CQkJYmZhZF9udW07CisJdTE2CQkJcnN2ZDsKKwlzdHJ1Y3QgYmZhX2ZhYV9hdHRyX3MJZmFhX2F0dHI7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19jZWVfYXR0cl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXUzMgkJYnVmX3NpemU7CisJdTMyCQlyc3ZkMTsKKwl1NjQJCWJ1Zl9wdHI7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19jZWVfc3RhdHNfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwl1MzIJCWJ1Zl9zaXplOworCXUzMgkJcnN2ZDE7CisJdTY0CQlidWZfcHRyOworfTsKKworc3RydWN0IGJmYV9ic2dfc2ZwX21lZGlhX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJZW51bSBiZmFfZGVmc19zZnBfbWVkaWFfZSBtZWRpYTsKK307CisKK3N0cnVjdCBiZmFfYnNnX3NmcF9zcGVlZF9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCWVudW0gYmZhX3BvcnRfc3BlZWQgc3BlZWQ7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19mbGFzaF9hdHRyX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJc3RydWN0IGJmYV9mbGFzaF9hdHRyX3MgYXR0cjsKK307CisKK3N0cnVjdCBiZmFfYnNnX2ZsYXNoX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1OAkJaW5zdGFuY2U7CisJdTgJCXJzdmQ7CisJZW51bSAgYmZhX2ZsYXNoX3BhcnRfdHlwZSB0eXBlOworCWludAkJYnVmc3o7CisJdTY0CQlidWZfcHRyOworfTsKKworc3RydWN0IGJmYV9ic2dfZGlhZ19nZXRfdGVtcF9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXN0cnVjdCBiZmFfZGlhZ19yZXN1bHRzX3RlbXBzZW5zb3JfcyByZXN1bHQ7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19kaWFnX21lbXRlc3RfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZFszXTsKKwl1MzIJCXBhdDsKKwlzdHJ1Y3QgYmZhX2RpYWdfbWVtdGVzdF9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBiZmFfZGlhZ19tZW10ZXN0X3MgbWVtdGVzdDsKK307CisKK3N0cnVjdCBiZmFfYnNnX2RpYWdfbG9vcGJhY2tfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwllbnVtIGJmYV9wb3J0X29wbW9kZSBvcG1vZGU7CisJZW51bSBiZmFfcG9ydF9zcGVlZCBzcGVlZDsKKwl1MzIJCWxwY250OworCXUzMgkJcGF0OworCXN0cnVjdCBiZmFfZGlhZ19sb29wYmFja19yZXN1bHRfcyByZXN1bHQ7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19kaWFnX2Z3cGluZ19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXUzMgkJY250OworCXUzMgkJcGF0dGVybjsKKwlzdHJ1Y3QgYmZhX2RpYWdfcmVzdWx0c19md3BpbmcgcmVzdWx0OworfTsKKworc3RydWN0IGJmYV9ic2dfZGlhZ19xdGVzdF9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgliZmFkX251bTsKKwl1MTYJcnN2ZDsKKwl1MzIJZm9yY2U7CisJdTMyCXF1ZXVlOworCXN0cnVjdCBiZmFfZGlhZ19xdGVzdF9yZXN1bHRfcyByZXN1bHQ7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19zZnBfc2hvd19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXN0cnVjdCBzZnBfbWVtX3Mgc2ZwOworfTsKKworc3RydWN0IGJmYV9ic2dfZGlhZ19sZWRfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwlzdHJ1Y3QgYmZhX2RpYWdfbGVkdGVzdF9zIGxlZHRlc3Q7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19kaWFnX2JlYWNvbl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCWJmYV9ib29sZWFuX3QgICBiZWFjb247CisJYmZhX2Jvb2xlYW5fdCAgIGxpbmtfZTJlX2JlYWNvbjsKKwl1MzIJCXNlY29uZDsKK307CisKK3N0cnVjdCBiZmFfYnNnX2RpYWdfbGJfc3RhdF9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworfTsKKworc3RydWN0IGJmYV9ic2dfcGh5X2F0dHJfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJYmZhZF9udW07CisJdTE2CWluc3RhbmNlOworCXN0cnVjdCBiZmFfcGh5X2F0dHJfcwlhdHRyOworfTsKKworc3RydWN0IGJmYV9ic2dfcGh5X3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CWJmYWRfbnVtOworCXUxNglpbnN0YW5jZTsKKwl1NjQJYnVmc3o7CisJdTY0CWJ1Zl9wdHI7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19kZWJ1Z19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXUzMgkJYnVmc3o7CisJaW50CQlpbnN0X25vOworCXU2NAkJYnVmX3B0cjsKKwl1NjQJCW9mZnNldDsKK307CisKK3N0cnVjdCBiZmFfYnNnX3BoeV9zdGF0c19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgliZmFkX251bTsKKwl1MTYJaW5zdGFuY2U7CisJc3RydWN0IGJmYV9waHlfc3RhdHNfcwlzdGF0czsKK307CisKK3N0cnVjdCBiZmFfYnNnX3ZoYmFfYXR0cl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlwY2lmbl9pZDsKKwlzdHJ1Y3QgYmZhX3ZoYmFfYXR0cl9zCWF0dHI7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19mY3B0X3MgeworCWJmYV9zdGF0dXNfdCAgICBzdGF0dXM7CisJdTE2CQl2Zl9pZDsKKwl3d25fdAkJbHB3d247CisJd3duX3QJCWRwd3duOworCXUzMgkJdHNlY3M7CisJaW50CQljdHM7CisJZW51bSBmY19jb3MJY29zOworCXN0cnVjdCBmY2hzX3MJZmNoczsKK307CisjZGVmaW5lIGJmYV9ic2dfZmNwdF90IHN0cnVjdCBiZmFfYnNnX2ZjcHRfcworCitzdHJ1Y3QgYmZhX2JzZ19kYXRhIHsKKwlpbnQgcGF5bG9hZF9sZW47CisJdm9pZCAqcGF5bG9hZDsKK307CisKKyNkZWZpbmUgYmZhZF9jaGtfaW9jbWRfc3ooX19wYXlsb2FkX2xlbiwgX19oZHJzeiwgX19idWZzeikJXAorCSgoKF9fcGF5bG9hZF9sZW4pICE9ICgoX19oZHJzeikgKyAoX19idWZzeikpKSA/CQlcCisJIEJGQV9TVEFUVVNfRkFJTEVEIDogQkZBX1NUQVRVU19PSykKKworI2VuZGlmIC8qIEJGQURfQlNHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZGVidWdmcy5jCmluZGV4IDQ4YmUwYzUuLmI0MTJlMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2RlYnVnZnMuYwpAQCAtMjE0LDEwICsyMTQsMTAgQEAKIAogI2RlZmluZSBCRkFfUkVHX0NUX0FERFJTWgkoMHg0MDAwMCkKICNkZWZpbmUgQkZBX1JFR19DQl9BRERSU1oJKDB4MjAwMDApCi0jZGVmaW5lIEJGQV9SRUdfQUREUlNaKF9fYmZhKQlcCi0JKChiZmFfaW9jX2RldmlkKCYoX19iZmEpLT5pb2MpID09IEJGQV9QQ0lfREVWSUNFX0lEX0NUKSA/CVwKLQkJQkZBX1JFR19DVF9BRERSU1ogOiBCRkFfUkVHX0NCX0FERFJTWikKLSNkZWZpbmUgQkZBX1JFR19BRERSTVNLKF9fYmZhKSAgKCh1MzIpKEJGQV9SRUdfQUREUlNaKF9fYmZhKSAtIDEpKQorI2RlZmluZSBCRkFfUkVHX0FERFJTWihfX2lvYykJXAorCSgodTMyKShiZmFfYXNpY19pZF9jdGMoYmZhX2lvY19kZXZpZChfX2lvYykpID8JXAorCSBCRkFfUkVHX0NUX0FERFJTWiA6IEJGQV9SRUdfQ0JfQUREUlNaKSkKKyNkZWZpbmUgQkZBX1JFR19BRERSTVNLKF9faW9jKQkoQkZBX1JFR19BRERSU1ooX19pb2MpIC0gMSkKIAogc3RhdGljIGJmYV9zdGF0dXNfdAogYmZhZF9yZWdfb2Zmc2V0X2NoZWNrKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgb2Zmc2V0LCB1MzIgbGVuKQpAQCAtMjM2LDcgKzIzNiw3IEBACiAJCQlyZXR1cm4gQkZBX1NUQVRVU19FSU5WQUw7CiAJfSBlbHNlIHsKIAkJLyogQ0IgcmVnaXN0ZXIgc3BhY2UgNjRLQiAqLwotCQlpZiAoKG9mZnNldCArIChsZW48PDIpKSA+IEJGQV9SRUdfQUREUk1TSyhiZmEpKQorCQlpZiAoKG9mZnNldCArIChsZW48PDIpKSA+IEJGQV9SRUdfQUREUk1TSygmYmZhLT5pb2MpKQogCQkJcmV0dXJuIEJGQV9TVEFUVVNfRUlOVkFMOwogCX0KIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKQEAgLTMxNyw3ICszMTcsNyBAQAogCiAJYmZhZC0+cmVnbGVuID0gbGVuIDw8IDI7CiAJcmIgPSBiZmFfaW9jX2JhcjAoaW9jKTsKLQlhZGRyICY9IEJGQV9SRUdfQUREUk1TSyhiZmEpOworCWFkZHIgJj0gQkZBX1JFR19BRERSTVNLKGlvYyk7CiAKIAkvKiBvZmZzZXQgYW5kIGxlbiBzYW5pdHkgY2hlY2sgKi8KIAlyYyA9IGJmYWRfcmVnX29mZnNldF9jaGVjayhiZmEsIGFkZHIsIGxlbik7CkBAIC0zODAsNyArMzgwLDcgQEAKIAl9CiAJa2ZyZWUoa2Vybl9idWYpOwogCi0JYWRkciAmPSBCRkFfUkVHX0FERFJNU0soYmZhKTsgLyogb2Zmc2V0IG9ubHkgMTcgYml0IGFuZCB3b3JkIGFsaWduICovCisJYWRkciAmPSBCRkFfUkVHX0FERFJNU0soaW9jKTsgLyogb2Zmc2V0IG9ubHkgMTcgYml0IGFuZCB3b3JkIGFsaWduICovCiAKIAkvKiBvZmZzZXQgYW5kIGxlbiBzYW5pdHkgY2hlY2sgKi8KIAlyYyA9IGJmYWRfcmVnX29mZnNldF9jaGVjayhiZmEsIGFkZHIsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Rydi5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Rydi5oCmluZGV4IDdmOWVhOTAuLjQ4NjYxYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kcnYuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZHJ2LmgKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfYnNnX2ZjLmg+CiAKICNpbmNsdWRlICJiZmFfbW9kdWxlcy5oIgogI2luY2x1ZGUgImJmYV9mY3MuaCIKQEAgLTU1LDcgKzU2LDcgQEAKICNpZmRlZiBCRkFfRFJJVkVSX1ZFUlNJT04KICNkZWZpbmUgQkZBRF9EUklWRVJfVkVSU0lPTiAgICBCRkFfRFJJVkVSX1ZFUlNJT04KICNlbHNlCi0jZGVmaW5lIEJGQURfRFJJVkVSX1ZFUlNJT04gICAgIjIuMy4yLjMiCisjZGVmaW5lIEJGQURfRFJJVkVSX1ZFUlNJT04gICAgIjMuMC4yLjEiCiAjZW5kaWYKIAogI2RlZmluZSBCRkFEX1BST1RPX05BTUUgRkNQSV9OQU1FCkBAIC03OSw3ICs4MCw3IEBACiAjZGVmaW5lIEJGQURfSEFMX0lOSVRfRkFJTAkJCTB4MDAwMDAxMDAKICNkZWZpbmUgQkZBRF9GQzRfUFJPQkVfRE9ORQkJCTB4MDAwMDAyMDAKICNkZWZpbmUgQkZBRF9QT1JUX0RFTEVURQkJCTB4MDAwMDAwMDEKLQorI2RlZmluZSBCRkFEX0lOVFhfT04JCQkJMHgwMDAwMDQwMAogLyoKICAqIEJGQUQgcmVsYXRlZCBkZWZpbml0aW9uCiAgKi8KQEAgLTkyLDYgKzkzLDggQEAKICAqLwogI2RlZmluZSBCRkFEX0xVTl9RVUVVRV9ERVBUSAkzMgogI2RlZmluZSBCRkFEX0lPX01BWF9TR0UJCVNHX0FMTAorI2RlZmluZSBCRkFEX01JTl9TRUNUT1JTCTEyOCAvKiA2NGsgICAqLworI2RlZmluZSBCRkFEX01BWF9TRUNUT1JTCTB4RkZGRiAgLyogMzIgTUIgKi8KIAogI2RlZmluZSBiZmFkX2lzcl90IGlycV9oYW5kbGVyX3QKIApAQCAtMTEwLDYgKzExMyw3IEBACiBlbnVtIHsKIAlCRkFfVFJDX0xEUlZfQkZBRAkJPSAxLAogCUJGQV9UUkNfTERSVl9JTQkJCT0gMiwKKwlCRkFfVFJDX0xEUlZfQlNHCQk9IDMsCiB9OwogCiBlbnVtIGJmYWRfcG9ydF9wdmJfdHlwZSB7CkBAIC0xODksOCArMTkzLDEwIEBACiAJc3RydWN0IGJmYV9wY2lkZXZfcyBoYWxfcGNpZGV2OwogCXN0cnVjdCBiZmFfaW9jX3BjaV9hdHRyX3MgcGNpX2F0dHI7CiAJdm9pZCBfX2lvbWVtICAgKnBjaV9iYXIwX2t2YTsKKwl2b2lkIF9faW9tZW0gICAqcGNpX2JhcjJfa3ZhOwogCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CiAJc3RydWN0IGNvbXBsZXRpb24gc3VzcGVuZDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBlbmFibGVfY29tcDsKIAlzdHJ1Y3QgY29tcGxldGlvbiBkaXNhYmxlX2NvbXA7CiAJYmZhX2Jvb2xlYW5fdCAgIGRpc2FibGVfYWN0aXZlOwogCXN0cnVjdCBiZmFkX3BvcnRfcyAgICAgcHBvcnQ7CS8qIHBoeXNpY2FsIHBvcnQgb2YgdGhlIEJGQUQgKi8KQEAgLTI3MywyMSArMjc5LDYgQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOwogfTsKIAotLyoKLSAqIE1hY3JvIHRvIG9idGFpbiB0aGUgaW1tZWRpYXRlIGxvd2VyIHBvd2VyCi0gKiBvZiB0d28gZm9yIHRoZSBpbnRlZ2VyLgotICovCi0jZGVmaW5lIG5leHRMb3dlckludCh4KSAgICAgICAgICAgICAgICAgICAgICAgICBcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSgqeCktLTsJCQkJCVwKLQlmb3IgKF9faSA9IDE7IF9faSA8IChzaXplb2YoaW50KSo4KTsgX19pIDw8PSAxKSBcCi0JCSgqeCkgPSAoKngpIHwgKCp4KSA+PiBfX2k7CVwKLQkoKngpKys7CQkJCQlcCi0JKCp4KSA9ICgqeCkgPj4gMTsJCQlcCi19IHdoaWxlICgwKQotCi0KICNkZWZpbmUgQkZBX0xPRyhsZXZlbCwgYmZhZCwgbWFzaywgZm10LCBhcmcuLi4pCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJaWYgKCgobWFzaykgPT0gNCkgfHwgKGxldmVsWzFdIDw9ICc0JykpCQkJCVwKQEAgLTM1NCw2ICszNDUsNyBAQAogZXh0ZXJuIGludCAgICAgIGZkbWlfZW5hYmxlOwogZXh0ZXJuIGludCAgICAgIHN1cHBvcnRlZF9mYzRzOwogZXh0ZXJuIGludAlwY2llX21heF9yZWFkX3JlcXN6OworZXh0ZXJuIGludAltYXhfeGZlcl9zaXplOwogZXh0ZXJuIGludCBiZmFfZGVidWdmc19lbmFibGU7CiBleHRlcm4gc3RydWN0IG11dGV4IGJmYWRfbXV0ZXg7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKaW5kZXggYzJiMzYxNy4uZjJiZjgxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKQEAgLTE3NSwyMSArMTc1LDExIEBACiAJc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0ID0KIAkJCShzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKikgc2hvc3QtPmhvc3RkYXRhWzBdOwogCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSBpbV9wb3J0LT5iZmFkOwotCXN0cnVjdCBiZmFfcyAqYmZhID0gJmJmYWQtPmJmYTsKLQlzdHJ1Y3QgYmZhX2lvY19zICppb2MgPSAmYmZhLT5pb2M7Ci0JY2hhciBtb2RlbFtCRkFfQURBUFRFUl9NT0RFTF9OQU1FX0xFTl07Ci0KLQliZmFfZ2V0X2FkYXB0ZXJfbW9kZWwoYmZhLCBtb2RlbCk7CiAKIAltZW1zZXQoYmZhX2J1ZiwgMCwgc2l6ZW9mKGJmYV9idWYpKTsKLQlpZiAoaW9jLT5jdGRldiAmJiAhaW9jLT5mY21vZGUpCi0JCXNucHJpbnRmKGJmYV9idWYsIHNpemVvZihiZmFfYnVmKSwKLQkJIkJyb2NhZGUgRkNPRSBBZGFwdGVyLCAiICJtb2RlbDogJXMgaHdwYXRoOiAlcyBkcml2ZXI6ICVzIiwKLQkJIG1vZGVsLCBiZmFkLT5wY2lfbmFtZSwgQkZBRF9EUklWRVJfVkVSU0lPTik7Ci0JZWxzZQotCQlzbnByaW50ZihiZmFfYnVmLCBzaXplb2YoYmZhX2J1ZiksCi0JCSJCcm9jYWRlIEZDIEFkYXB0ZXIsICIgIm1vZGVsOiAlcyBod3BhdGg6ICVzIGRyaXZlcjogJXMiLAotCQltb2RlbCwgYmZhZC0+cGNpX25hbWUsIEJGQURfRFJJVkVSX1ZFUlNJT04pOworCXNucHJpbnRmKGJmYV9idWYsIHNpemVvZihiZmFfYnVmKSwKKwkJIkJyb2NhZGUgRkMvRkNPRSBBZGFwdGVyLCAiICJod3BhdGg6ICVzIGRyaXZlcjogJXMiLAorCQliZmFkLT5wY2lfbmFtZSwgQkZBRF9EUklWRVJfVkVSU0lPTik7CiAKIAlyZXR1cm4gYmZhX2J1ZjsKIH0KQEAgLTU3Miw5ICs1NjIsNiBAQAogCQlnb3RvIG91dF9mY19yZWw7CiAJfQogCi0JLyogc2V0dXAgaG9zdCBmaXhlZCBhdHRyaWJ1dGUgaWYgdGhlIGxrIHN1cHBvcnRzICovCi0JYmZhZF9mY19ob3N0X2luaXQoaW1fcG9ydCk7Ci0KIAlyZXR1cm4gMDsKIAogb3V0X2ZjX3JlbDoKQEAgLTcxMyw2ICs3MDAsOSBAQAogCWVsc2UKIAkJc2h0ID0gJmJmYWRfaW1fdnBvcnRfdGVtcGxhdGU7CiAKKwlpZiAobWF4X3hmZXJfc2l6ZSAhPSBCRkFEX01BWF9TRUNUT1JTID4+IDEpCisJCXNodC0+bWF4X3NlY3RvcnMgPSBtYXhfeGZlcl9zaXplIDw8IDE7CisKIAlzaHQtPnNnX3RhYmxlc2l6ZSA9IGJmYWQtPmNmZ19kYXRhLmlvX21heF9zZ2U7CiAKIAlyZXR1cm4gc2NzaV9ob3N0X2FsbG9jKHNodCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKQEAgLTc5MCw3ICs3ODAsOCBAQAogCS5jbWRfcGVyX2x1biA9IDMsCiAJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCiAJLnNob3N0X2F0dHJzID0gYmZhZF9pbV9ob3N0X2F0dHJzLAotCS5tYXhfc2VjdG9ycyA9IDB4RkZGRiwKKwkubWF4X3NlY3RvcnMgPSBCRkFEX01BWF9TRUNUT1JTLAorCS52ZW5kb3JfaWQgPSBCRkFfUENJX1ZFTkRPUl9JRF9CUk9DQURFLAogfTsKIAogc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBiZmFkX2ltX3Zwb3J0X3RlbXBsYXRlID0gewpAQCAtODExLDcgKzgwMiw3IEBACiAJLmNtZF9wZXJfbHVuID0gMywKIAkudXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORywKIAkuc2hvc3RfYXR0cnMgPSBiZmFkX2ltX3Zwb3J0X2F0dHJzLAotCS5tYXhfc2VjdG9ycyA9IDB4RkZGRiwKKwkubWF4X3NlY3RvcnMgPSBCRkFEX01BWF9TRUNUT1JTLAogfTsKIAogYmZhX3N0YXR1c190CkBAIC05MjUsNyArOTE2LDEwIEBACiAJCXJldHVybiAwOwogCiAJYmZhX2lvY19nZXRfYXR0cigmYmZhLT5pb2MsIGlvY19hdHRyKTsKLQlpZiAoaW9jX2F0dHItPmFkYXB0ZXJfYXR0ci5tYXhfc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfOEdCUFMpIHsKKwlpZiAoaW9jX2F0dHItPmFkYXB0ZXJfYXR0ci5tYXhfc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfMTZHQlBTKQorCQlzdXBwb3J0ZWRfc3BlZWQgfD0gIEZDX1BPUlRTUEVFRF8xNkdCSVQgfCBGQ19QT1JUU1BFRURfOEdCSVQgfAorCQkJCUZDX1BPUlRTUEVFRF80R0JJVCB8IEZDX1BPUlRTUEVFRF8yR0JJVDsKKwllbHNlIGlmIChpb2NfYXR0ci0+YWRhcHRlcl9hdHRyLm1heF9zcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF84R0JQUykgewogCQlpZiAoaW9jX2F0dHItPmFkYXB0ZXJfYXR0ci5pc19tZXp6KSB7CiAJCQlzdXBwb3J0ZWRfc3BlZWQgfD0gRkNfUE9SVFNQRUVEXzhHQklUIHwKIAkJCQlGQ19QT1JUU1BFRURfNEdCSVQgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uaAppbmRleCBjMjk2Yzg5Li40ZmUzNGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uaApAQCAtMTQxLDQgKzE0MSw3IEBACiAKIGlycXJldHVybl90IGJmYWRfaW50eChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogCitpbnQgYmZhZF9pbV9ic2dfcmVxdWVzdChzdHJ1Y3QgZmNfYnNnX2pvYiAqam9iKTsKK2ludCBiZmFkX2ltX2JzZ190aW1lb3V0KHN0cnVjdCBmY19ic2dfam9iICpqb2IpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZpLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmaS5oCmluZGV4IDcyYjY5YTAuLjFlMjU4ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZpLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmkuaApAQCAtMjMsMTcgKzIzLDI5IEBACiAKICNwcmFnbWEgcGFjaygxKQogCisvKiBQZXIgZG1hIHNlZ21lbnQgbWF4IHNpemUgKi8KKyNkZWZpbmUgQkZJX01FTV9ETUFfU0VHX1NaCSgxMzEwNzIpCisKKy8qIEdldCBudW1iZXIgb2YgZG1hIHNlZ21lbnRzIHJlcXVpcmVkICovCisjZGVmaW5lIEJGSV9NRU1fRE1BX05TRUdTKF9udW1fcmVxcywgX3JlcV9zeikJCQkJXAorCSgodTE2KSgoKCgoX251bV9yZXFzKSAqIChfcmVxX3N6KSkgKyBCRklfTUVNX0RNQV9TRUdfU1ogLSAxKSAmCVwKKwkgfihCRklfTUVNX0RNQV9TRUdfU1ogLSAxKSkgLyBCRklfTUVNX0RNQV9TRUdfU1opKQorCisvKiBHZXQgbnVtIGRtYSByZXFzIC0gdGhhdCBmaXQgaW4gYSBzZWdtZW50ICovCisjZGVmaW5lIEJGSV9NRU1fTlJFUVNfU0VHKF9ycXN6KSAoQkZJX01FTV9ETUFfU0VHX1NaIC8gKF9ycXN6KSkKKworLyogR2V0IHNlZ21lbnQgbnVtIGZyb20gdGFnICovCisjZGVmaW5lIEJGSV9NRU1fU0VHX0ZST01fVEFHKF90YWcsIF9ycXN6KSAoKF90YWcpIC8gQkZJX01FTV9OUkVRU19TRUcoX3Jxc3opKQorCisvKiBHZXQgZG1hIHJlcSBvZmZzZXQgaW4gYSBzZWdtZW50ICovCisjZGVmaW5lIEJGSV9NRU1fU0VHX1JFUV9PRkZTRVQoX3RhZywgX3N6KQlcCisJKChfdGFnKSAtIChCRklfTUVNX1NFR19GUk9NX1RBRyhfdGFnLCBfc3opICogQkZJX01FTV9OUkVRU19TRUcoX3N6KSkpCisKIC8qCiAgKiBCRkkgRlcgaW1hZ2UgdHlwZQogICovCiAjZGVmaW5lCUJGSV9GTEFTSF9DSFVOS19TWgkJCTI1NgkvKiAgRmxhc2ggY2h1bmsgc2l6ZSAqLwogI2RlZmluZQlCRklfRkxBU0hfQ0hVTktfU1pfV09SRFMJKEJGSV9GTEFTSF9DSFVOS19TWi9zaXplb2YodTMyKSkKLWVudW0gewotCUJGSV9JTUFHRV9DQl9GQywKLQlCRklfSU1BR0VfQ1RfRkMsCi0JQkZJX0lNQUdFX0NUX0NOQSwKLQlCRklfSU1BR0VfTUFYLAotfTsKIAogLyoKICAqIE1zZyBoZWFkZXIgY29tbW9uIHRvIGFsbCBtc2dzCkBAIC00MywxNyArNTUsMjAgQEAKIAl1OAkJbXNnX2lkOwkJLyogIG1zZyBvcGNvZGUgd2l0aCBpbiB0aGUgY2xhc3MgICAqLwogCXVuaW9uIHsKIAkJc3RydWN0IHsKLQkJCXU4CXJzdmQ7Ci0JCQl1OAlscHVfaWQ7CS8qICBtc2cgZGVzdGluYXRpb24JCSAgICAqLworCQkJdTgJcWlkOworCQkJdTgJZm5fbHB1OwkvKiAgbXNnIGRlc3RpbmF0aW9uCQkgICAgKi8KIAkJfSBoMmk7CiAJCXUxNglpMmh0b2s7CS8qICB0b2tlbiBpbiBtc2dzIHRvIGhvc3QJICAgICovCiAJfSBtdGFnOwogfTsKIAotI2RlZmluZSBiZmlfaDJpX3NldChfbWgsIF9tYywgX29wLCBfbHB1aWQpIGRvIHsJCVwKKyNkZWZpbmUgYmZpX2ZuX2xwdShfX2ZuLCBfX2xwdSkJKChfX2ZuKSA8PCAxIHwgKF9fbHB1KSkKKyNkZWZpbmUgYmZpX21oZHJfMl9mbihfbWgpCSgoX21oKS0+bXRhZy5oMmkuZm5fbHB1ID4+IDEpCisKKyNkZWZpbmUgYmZpX2gyaV9zZXQoX21oLCBfbWMsIF9vcCwgX2ZuX2xwdSkgZG8gewkJXAogCShfbWgpLm1zZ19jbGFzcwkJPSAoX21jKTsgICAgICBcCiAJKF9taCkubXNnX2lkCQk9IChfb3ApOyAgICAgIFwKLQkoX21oKS5tdGFnLmgyaS5scHVfaWQJPSAoX2xwdWlkKTsgICAgICBcCisJKF9taCkubXRhZy5oMmkuZm5fbHB1CT0gKF9mbl9scHUpOyAgICAgIFwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgYmZpX2kyaF9zZXQoX21oLCBfbWMsIF9vcCwgX2kyaHRvaykgZG8gewkJXApAQCAtMTAxLDcgKzExNiw3IEBACiB9OwogCiAvKgotICogU2NhdHRlciBHYXRoZXIgRWxlbWVudAorICogU2NhdHRlciBHYXRoZXIgRWxlbWVudCB1c2VkIGZvciBmYXN0LXBhdGggSU8gcmVxdWVzdHMKICAqLwogc3RydWN0IGJmaV9zZ2VfcyB7CiAjaWZkZWYgX19CSUdfRU5ESUFOCkBAIC0xMTYsNiArMTMxLDE0IEBACiAJdW5pb24gYmZpX2FkZHJfdSBzZ2E7CiB9OwogCisvKioKKyAqIEdlbmVyaWMgRE1BIGFkZHItbGVuIHBhaXIuCisgKi8KK3N0cnVjdCBiZmlfYWxlbl9zIHsKKwl1bmlvbiBiZmlfYWRkcl91CWFsX2FkZHI7CS8qIERNQSBhZGRyIG9mIGJ1ZmZlcgkqLworCXUzMgkJCWFsX2xlbjsJCS8qIGxlbmd0aCBvZiBidWZmZXIJKi8KK307CisKIC8qCiAgKiBTY2F0dGVyIEdhdGhlciBQYWdlCiAgKi8KQEAgLTEyNyw2ICsxNTAsMTIgQEAKIAl1MzIJcnN2ZFtCRklfU0dQR19SU1ZEX1dEX0xFTl07CiB9OwogCisvKiBGQ1AgbW9kdWxlIGRlZmluaXRpb25zICovCisjZGVmaW5lIEJGSV9JT19NQVgJKDIwMDApCisjZGVmaW5lIEJGSV9JT0lNX1NOU0xFTgkoMjU2KQorI2RlZmluZSBCRklfSU9JTV9TTlNCVUZfU0VHUwlcCisJQkZJX01FTV9ETUFfTlNFR1MoQkZJX0lPX01BWCwgQkZJX0lPSU1fU05TTEVOKQorCiAvKgogICogTGFyZ2UgTWVzc2FnZSBzdHJ1Y3R1cmUgLSAxMjggQnl0ZXMgc2l6ZSBNc2dzCiAgKi8KQEAgLTE0OSwxOCArMTc4LDI5IEBACiB9OwogCiAvKgorICogU3VwcG9ydGVkIFBDSSBmdW5jdGlvbiBjbGFzcyBjb2RlcyAocGVyc29uYWxpdHkpCisgKi8KK2VudW0gYmZpX3BjaWZuX2NsYXNzIHsKKwlCRklfUENJRk5fQ0xBU1NfRkMgID0gMHgwYzA0LAorCUJGSV9QQ0lGTl9DTEFTU19FVEggPSAweDAyMDAsCit9OworCisvKgogICogTWVzc2FnZSBDbGFzc2VzCiAgKi8KIGVudW0gYmZpX21jbGFzcyB7CiAJQkZJX01DX0lPQwkJPSAxLAkvKiAgSU8gQ29udHJvbGxlciAoSU9DKQkgICAgKi8KKwlCRklfTUNfRElBRwkJPSAyLCAgICAvKiAgRGlhZ25vc3RpYyBNc2dzICAgICAgICAgICAgKi8KKwlCRklfTUNfRkxBU0gJCT0gMywJLyogIEZsYXNoIG1lc3NhZ2UgY2xhc3MJKi8KKwlCRklfTUNfQ0VFCQk9IDQsCS8qICBDRUUJKi8KIAlCRklfTUNfRkNQT1JUCQk9IDUsCS8qICBGQyBwb3J0CQkJICAgICovCiAJQkZJX01DX0lPQ0ZDCQk9IDYsCS8qICBGQyAtIElPIENvbnRyb2xsZXIgKElPQykJICAgICovCi0JQkZJX01DX0xMICAgICAgICAgICAgICAgPSA3LCAgICAvKiAgTGluayBMYXllciAgICAgICAgICAgICAgICAgICAgICAqLworCUJGSV9NQ19BQkxLCQk9IDcsCS8qICBBU0lDIGJsb2NrIGNvbmZpZ3VyYXRpb24JICAgICovCiAJQkZJX01DX1VGCQk9IDgsCS8qICBVbnNvbGljaXRlZCBmcmFtZSByZWNlaXZlCSAgICAqLwogCUJGSV9NQ19GQ1hQCQk9IDksCS8qICBGQyBUcmFuc3BvcnQJCSAgICAqLwogCUJGSV9NQ19MUFMJCT0gMTAsCS8qICBscG9ydCBmYyBsb2dpbiBzZXJ2aWNlcwkgICAgKi8KIAlCRklfTUNfUlBPUlQJCT0gMTEsCS8qICBSZW1vdGUgcG9ydAkJICAgICovCi0JQkZJX01DX0lUTklNCQk9IDEyLAkvKiAgSS1UIG5leHVzIChJbml0aWF0b3IgbW9kZSkJICAgICovCisJQkZJX01DX0lUTgkJPSAxMiwJLyogIEktVCBuZXh1cyAoSW5pdGlhdG9yIG1vZGUpCSAgICAqLwogCUJGSV9NQ19JT0lNX1JFQUQJPSAxMywJLyogIHJlYWQgSU8gKEluaXRpYXRvciBtb2RlKQkgICAgKi8KIAlCRklfTUNfSU9JTV9XUklURQk9IDE0LAkvKiAgd3JpdGUgSU8gKEluaXRpYXRvciBtb2RlKQkgICAgKi8KIAlCRklfTUNfSU9JTV9JTwkJPSAxNSwJLyogIElPIChJbml0aWF0b3IgbW9kZSkJICAgICovCkBAIC0xNjgsNiArMjA4LDggQEAKIAlCRklfTUNfSU9JTV9JT0NPTQk9IDE3LAkvKiAgZ29vZCBJTyBjb21wbGV0aW9uCQkgICAgKi8KIAlCRklfTUNfVFNLSU0JCT0gMTgsCS8qICBJbml0aWF0b3IgVGFzayBtYW5hZ2VtZW50CSAgICAqLwogCUJGSV9NQ19QT1JUCQk9IDIxLAkvKiAgUGh5c2ljYWwgcG9ydAkJICAgICovCisJQkZJX01DX1NGUAkJPSAyMiwJLyogIFNGUCBtb2R1bGUJKi8KKwlCRklfTUNfUEhZCQk9IDI1LCAgIC8qICBFeHRlcm5hbCBQSFkgbWVzc2FnZSBjbGFzcwkqLwogCUJGSV9NQ19NQVgJCT0gMzIKIH07CiAKQEAgLTE3NSwyMyArMjE3LDI4IEBACiAjZGVmaW5lIEJGSV9JT0NfTUFYX0NRU19BU0lDCTgKICNkZWZpbmUgQkZJX0lPQ19NU0dMRU5fTUFYCTMyCS8qIDMyIGJ5dGVzICovCiAKLSNkZWZpbmUgQkZJX0JPT1RfVFlQRV9PRkYJCTgKLSNkZWZpbmUgQkZJX0JPT1RfTE9BREVSX09GRgkJMTIKLQotI2RlZmluZSBCRklfQk9PVF9UWVBFX05PUk1BTAkJMAotI2RlZmluZQlCRklfQk9PVF9UWVBFX0ZMQVNICQkxCi0jZGVmaW5lCUJGSV9CT09UX1RZUEVfTUVNVEVTVAkJMgotCi0jZGVmaW5lIEJGSV9CT09UX0xPQURFUl9PUwkJMAotI2RlZmluZSBCRklfQk9PVF9MT0FERVJfQklPUwkJMQotI2RlZmluZSBCRklfQk9PVF9MT0FERVJfVUVGSQkJMgotCiAvKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgkJCQlJT0MKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKKy8qCisgKiBEaWZmZXJlbnQgYXNpYyBnZW5lcmF0aW9ucworICovCitlbnVtIGJmaV9hc2ljX2dlbiB7CisJQkZJX0FTSUNfR0VOX0NCCQk9IDEsCS8qIGNyb3NzYm93IDhHIEZDCQkqLworCUJGSV9BU0lDX0dFTl9DVAkJPSAyLAkvKiBjYXRhcHVsdCA4RyBGQyBvciAxMEcgQ05BCSovCisJQkZJX0FTSUNfR0VOX0NUMgk9IDMsCS8qIGNhdGFwdWx0LTIgMTZHIEZDIG9yIDEwRyBDTkEJKi8KK307CisKK2VudW0gYmZpX2FzaWNfbW9kZSB7CisJQkZJX0FTSUNfTU9ERV9GQwk9IDEsCS8qIEZDIHVwdG8gOEcgc3BlZWQJCSovCisJQkZJX0FTSUNfTU9ERV9GQzE2CT0gMiwJLyogRkMgdXB0byAxNkcgc3BlZWQJCSovCisJQkZJX0FTSUNfTU9ERV9FVEgJPSAzLAkvKiBFdGhlcm5ldCBwb3J0cwkJKi8KKwlCRklfQVNJQ19NT0RFX0NPTUJPCT0gNCwJLyogRkMgMTZHIGFuZCBFdGhlcm5ldCAxMEcgcG9ydAkqLworfTsKKwogZW51bSBiZmlfaW9jX2gyaV9tc2dzIHsKIAlCRklfSU9DX0gySV9FTkFCTEVfUkVRCQk9IDEsCiAJQkZJX0lPQ19IMklfRElTQUJMRV9SRVEJCT0gMiwKQEAgLTIwNCw4ICsyNTEsOCBAQAogCUJGSV9JT0NfSTJIX0VOQUJMRV9SRVBMWQk9IEJGQV9JMkhNKDEpLAogCUJGSV9JT0NfSTJIX0RJU0FCTEVfUkVQTFkJPSBCRkFfSTJITSgyKSwKIAlCRklfSU9DX0kySF9HRVRBVFRSX1JFUExZCT0gQkZBX0kySE0oMyksCi0JQkZJX0lPQ19JMkhfUkVBRFlfRVZFTlQJCT0gQkZBX0kySE0oNCksCi0JQkZJX0lPQ19JMkhfSEJFQVQJCT0gQkZBX0kySE0oNSksCisJQkZJX0lPQ19JMkhfSEJFQVQJCT0gQkZBX0kySE0oNCksCisJQkZJX0lPQ19JMkhfQUNRX0FERFJfUkVQTFkJPSBCRkFfSTJITSg1KSwKIH07CiAKIC8qCkBAIC0yMjAsNyArMjY3LDggQEAKIAl3d25fdAkJbWZnX3B3d247CS8qICBNZmcgcG9ydCB3d24JICAgKi8KIAl3d25fdAkJbWZnX253d247CS8qICBNZmcgbm9kZSB3d24JICAgKi8KIAltYWNfdAkJbWZnX21hYzsJLyogIE1mZyBtYWMJCSAgICovCi0JdTE2CXJzdmRfYTsKKwl1OAkJcG9ydF9tb2RlOwkvKiBiZmlfcG9ydF9tb2RlCSAgICovCisJdTgJCXJzdmRfYTsKIAl3d25fdAkJcHd3bjsKIAl3d25fdAkJbnd3bjsKIAltYWNfdAkJbWFjOwkJLyogIFBCQyBvciBNZmcgbWFjCSAgICovCkBAIC0yNzIsMjEgKzMyMCwzMyBAQAogI2RlZmluZSBCRklfSU9DX0ZXX1NJR05BVFVSRQkoMHhiZmFkYmZhZCkKICNkZWZpbmUgQkZJX0lPQ19NRDVTVU1fU1oJNAogc3RydWN0IGJmaV9pb2NfaW1hZ2VfaGRyX3MgewotCXUzMglzaWduYXR1cmU7CS8qICBjb25zdGFudCBzaWduYXR1cmUgKi8KLQl1MzIJcnN2ZF9hOwotCXUzMglleGVjOwkJLyogIGV4ZWMgdmVjdG9yCSovCi0JdTMyCXBhcmFtOwkJLyogIHBhcmFtZXRlcnMJCSovCisJdTMyCXNpZ25hdHVyZTsJLyogY29uc3RhbnQgc2lnbmF0dXJlCQkqLworCXU4CWFzaWNfZ2VuOwkvKiBhc2ljIGdlbmVyYXRpb24JCSovCisJdTgJYXNpY19tb2RlOworCXU4CXBvcnQwX21vZGU7CS8qIGRldmljZSBtb2RlIGZvciBwb3J0IDAJKi8KKwl1OAlwb3J0MV9tb2RlOwkvKiBkZXZpY2UgbW9kZSBmb3IgcG9ydCAxCSovCisJdTMyCWV4ZWM7CQkvKiBleGVjIHZlY3RvcgkJCSovCisJdTMyCWJvb3RlbnY7CS8qIGZpbXdhcmUgYm9vdCBlbnYJCSovCiAJdTMyCXJzdmRfYls0XTsKIAl1MzIJbWQ1c3VtW0JGSV9JT0NfTUQ1U1VNX1NaXTsKIH07CiAKLS8qCi0gKiAgQkZJX0lPQ19JMkhfUkVBRFlfRVZFTlQgbWVzc2FnZQotICovCi1zdHJ1Y3QgYmZpX2lvY19yZHlfZXZlbnRfcyB7Ci0Jc3RydWN0IGJmaV9taGRyX3MJbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIgKi8KLQl1OAkJCWluaXRfc3RhdHVzOwkvKiAgaW5pdCBldmVudCBzdGF0dXMgKi8KLQl1OAkJCXJzdmRbM107CisjZGVmaW5lIEJGSV9GV0JPT1RfREVWTU9ERV9PRkYJCTQKKyNkZWZpbmUgQkZJX0ZXQk9PVF9UWVBFX09GRgkJOAorI2RlZmluZSBCRklfRldCT09UX0VOVl9PRkYJCTEyCisjZGVmaW5lIEJGSV9GV0JPT1RfREVWTU9ERShfX2FzaWNfZ2VuLCBfX2FzaWNfbW9kZSwgX19wMF9tb2RlLCBfX3AxX21vZGUpIFwKKwkoKCh1MzIpKF9fYXNpY19nZW4pKSA8PCAyNCB8CQlcCisJICgodTMyKShfX2FzaWNfbW9kZSkpIDw8IDE2IHwJCVwKKwkgKCh1MzIpKF9fcDBfbW9kZSkpIDw8IDggfAkJXAorCSAoKHUzMikoX19wMV9tb2RlKSkpCisKKyNkZWZpbmUgQkZJX0ZXQk9PVF9UWVBFX05PUk1BTAkwCisjZGVmaW5lIEJGSV9GV0JPT1RfVFlQRV9NRU1URVNUCTIKKyNkZWZpbmUgQkZJX0ZXQk9PVF9FTlZfT1MgICAgICAgMAorCitlbnVtIGJmaV9wb3J0X21vZGUgeworCUJGSV9QT1JUX01PREVfRkMJPSAxLAorCUJGSV9QT1JUX01PREVfRVRICT0gMiwKIH07CiAKIHN0cnVjdCBiZmlfaW9jX2hiZWF0X3MgewpAQCAtMzQ1LDggKzQwNSw4IEBACiAgKi8KIHN0cnVjdCBiZmlfaW9jX2N0cmxfcmVxX3MgewogCXN0cnVjdCBiZmlfbWhkcl9zCW1oOwotCXU4CQkJaW9jX2NsYXNzOwotCXU4CQkJcnN2ZFszXTsKKwl1MTYJCQljbHNjb2RlOworCXUxNgkJCXJzdmQ7CiAJdTMyCQl0dl9zZWM7CiB9OwogI2RlZmluZSBiZmlfaW9jX2VuYWJsZV9yZXFfdCBzdHJ1Y3QgYmZpX2lvY19jdHJsX3JlcV9zOwpAQCAtMzU4LDcgKzQxOCw5IEBACiBzdHJ1Y3QgYmZpX2lvY19jdHJsX3JlcGx5X3MgewogCXN0cnVjdCBiZmlfbWhkcl9zCW1oOwkJLyogIENvbW1vbiBtc2cgaGVhZGVyICAgICAqLwogCXU4CQkJc3RhdHVzOwkJLyogIGVuYWJsZS9kaXNhYmxlIHN0YXR1cyAqLwotCXU4CQkJcnN2ZFszXTsKKwl1OAkJCXBvcnRfbW9kZTsJLyogIGJmYV9tb2RlX3MJKi8KKwl1OAkJCWNhcF9ibTsJCS8qICBjYXBhYmlsaXR5IGJpdCBtYXNrICovCisJdTgJCQlyc3ZkOwogfTsKICNkZWZpbmUgYmZpX2lvY19lbmFibGVfcmVwbHlfdCBzdHJ1Y3QgYmZpX2lvY19jdHJsX3JlcGx5X3M7CiAjZGVmaW5lIGJmaV9pb2NfZGlzYWJsZV9yZXBseV90IHN0cnVjdCBiZmlfaW9jX2N0cmxfcmVwbHlfczsKQEAgLTM4MCw3ICs0NDIsNyBAQAogICovCiB1bmlvbiBiZmlfaW9jX2kyaF9tc2dfdSB7CiAJc3RydWN0IGJmaV9taGRyX3MJCW1oOwotCXN0cnVjdCBiZmlfaW9jX3JkeV9ldmVudF9zCXJkeV9ldmVudDsKKwlzdHJ1Y3QgYmZpX2lvY19jdHJsX3JlcGx5X3MJZndfZXZlbnQ7CiAJdTMyCQkJbWJveG1zZ1tCRklfSU9DX01TR1NaXTsKIH07CiAKQEAgLTM5Myw2ICs0NTUsNyBAQAogCiAjZGVmaW5lIEJGSV9QQkNfTUFYX0JMVU5TCTgKICNkZWZpbmUgQkZJX1BCQ19NQVhfVlBPUlRTCTE2CisjZGVmaW5lIEJGSV9QQkNfUE9SVF9ESVNBQkxFRAkyCiAKIC8qCiAgKiBQQkMgYm9vdCBsdW4gY29uZmlndXJhdGlvbgpAQCAtNTc0LDYgKzYzNyw0OTYgQEAKIAlzdHJ1Y3QgYmZpX3BvcnRfZ2VuZXJpY19yc3BfcyAgIGNsZWFyc3RhdHNfcnNwOwogfTsKIAorLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJCQkJQUJMSworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2VudW0gYmZpX2FibGtfaDJpX21zZ3NfZSB7CisJQkZJX0FCTEtfSDJJX1FVRVJZCQk9IDEsCisJQkZJX0FCTEtfSDJJX0FEUFRfQ09ORklHCT0gMiwKKwlCRklfQUJMS19IMklfUE9SVF9DT05GSUcJPSAzLAorCUJGSV9BQkxLX0gySV9QRl9DUkVBVEUJCT0gNCwKKwlCRklfQUJMS19IMklfUEZfREVMRVRFCQk9IDUsCisJQkZJX0FCTEtfSDJJX1BGX1VQREFURQkJPSA2LAorCUJGSV9BQkxLX0gySV9PUFRST01fRU5BQkxFCT0gNywKKwlCRklfQUJMS19IMklfT1BUUk9NX0RJU0FCTEUJPSA4LAorfTsKKworZW51bSBiZmlfYWJsa19pMmhfbXNnc19lIHsKKwlCRklfQUJMS19JMkhfUVVFUlkJCT0gQkZBX0kySE0oQkZJX0FCTEtfSDJJX1FVRVJZKSwKKwlCRklfQUJMS19JMkhfQURQVF9DT05GSUcJPSBCRkFfSTJITShCRklfQUJMS19IMklfQURQVF9DT05GSUcpLAorCUJGSV9BQkxLX0kySF9QT1JUX0NPTkZJRwk9IEJGQV9JMkhNKEJGSV9BQkxLX0gySV9QT1JUX0NPTkZJRyksCisJQkZJX0FCTEtfSTJIX1BGX0NSRUFURQkJPSBCRkFfSTJITShCRklfQUJMS19IMklfUEZfQ1JFQVRFKSwKKwlCRklfQUJMS19JMkhfUEZfREVMRVRFCQk9IEJGQV9JMkhNKEJGSV9BQkxLX0gySV9QRl9ERUxFVEUpLAorCUJGSV9BQkxLX0kySF9QRl9VUERBVEUJCT0gQkZBX0kySE0oQkZJX0FCTEtfSDJJX1BGX1VQREFURSksCisJQkZJX0FCTEtfSTJIX09QVFJPTV9FTkFCTEUJPSBCRkFfSTJITShCRklfQUJMS19IMklfT1BUUk9NX0VOQUJMRSksCisJQkZJX0FCTEtfSTJIX09QVFJPTV9ESVNBQkxFCT0gQkZBX0kySE0oQkZJX0FCTEtfSDJJX09QVFJPTV9ESVNBQkxFKSwKK307CisKKy8qIEJGSV9BQkxLX0gySV9RVUVSWSAqLworc3RydWN0IGJmaV9hYmxrX2gyaV9xdWVyeV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcwltaDsKKwl1bmlvbiBiZmlfYWRkcl91CWFkZHI7Cit9OworCisvKiBCRklfQUJMX0gySV9BRFBUX0NPTkZJRywgQkZJX0FCTEtfSDJJX1BPUlRfQ09ORklHICovCitzdHJ1Y3QgYmZpX2FibGtfaDJpX2NmZ19yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MJbWg7CisJdTgJCQltb2RlOworCXU4CQkJcG9ydDsKKwl1OAkJCW1heF9wZjsKKwl1OAkJCW1heF92ZjsKK307CisKKy8qCisgKiBCRklfQUJMS19IMklfUEZfQ1JFQVRFLCBCRklfQUJMS19IMklfUEZfREVMRVRFLAorICovCitzdHJ1Y3QgYmZpX2FibGtfaDJpX3BmX3JlcV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcwltaDsKKwl1OAkJCXBjaWZuOworCXU4CQkJcG9ydDsKKwl1MTYJCQlwZXJzOworCXUzMgkJCWJ3OworfTsKKworLyogQkZJX0FCTEtfSDJJX09QVFJPTV9FTkFCTEUsIEJGSV9BQkxLX0gySV9PUFRST01fRElTQUJMRSAqLworc3RydWN0IGJmaV9hYmxrX2gyaV9vcHRyb21fcyB7CisJc3RydWN0IGJmaV9taGRyX3MJbWg7Cit9OworCisvKgorICogQkZJX0FCTEtfSTJIX1FVRVJZCisgKiBCRklfQUJMS19JMkhfUE9SVF9DT05GSUcKKyAqIEJGSV9BQkxLX0kySF9QRl9DUkVBVEUKKyAqIEJGSV9BQkxLX0kySF9QRl9ERUxFVEUKKyAqIEJGSV9BQkxLX0kySF9QRl9VUERBVEUKKyAqIEJGSV9BQkxLX0kySF9PUFRST01fRU5BQkxFCisgKiBCRklfQUJMS19JMkhfT1BUUk9NX0RJU0FCTEUKKyAqLworc3RydWN0IGJmaV9hYmxrX2kyaF9yc3BfcyB7CisJc3RydWN0IGJmaV9taGRyX3MJbWg7CisJdTgJCQlzdGF0dXM7CisJdTgJCQlwY2lmbjsKKwl1OAkJCXBvcnRfbW9kZTsKK307CisKKworLyoKKyAqCUNFRSBtb2R1bGUgc3BlY2lmaWMgbWVzc2FnZXMKKyAqLworCisvKiBNYWlsYm94IGNvbW1hbmRzIGZyb20gaG9zdCB0byBmaXJtd2FyZSAqLworZW51bSBiZmlfY2VlX2gyaV9tc2dzX2UgeworCUJGSV9DRUVfSDJJX0dFVF9DRkdfUkVRID0gMSwKKwlCRklfQ0VFX0gySV9SRVNFVF9TVEFUUyA9IDIsCisJQkZJX0NFRV9IMklfR0VUX1NUQVRTX1JFUSA9IDMsCit9OworCitlbnVtIGJmaV9jZWVfaTJoX21zZ3NfZSB7CisJQkZJX0NFRV9JMkhfR0VUX0NGR19SU1AgPSBCRkFfSTJITSgxKSwKKwlCRklfQ0VFX0kySF9SRVNFVF9TVEFUU19SU1AgPSBCRkFfSTJITSgyKSwKKwlCRklfQ0VFX0kySF9HRVRfU1RBVFNfUlNQID0gQkZBX0kySE0oMyksCit9OworCisvKgorICogSDJJIGNvbW1hbmQgc3RydWN0dXJlIGZvciByZXNldHRpbmcgdGhlIHN0YXRzCisgKi8KK3N0cnVjdCBiZmlfY2VlX3Jlc2V0X3N0YXRzX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsKK307CisKKy8qCisgKiBHZXQgY29uZmlndXJhdGlvbiAgY29tbWFuZCBmcm9tIGhvc3QKKyAqLworc3RydWN0IGJmaV9jZWVfZ2V0X3JlcV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcwltaDsKKwl1bmlvbiBiZmlfYWRkcl91CWRtYV9hZGRyOworfTsKKworLyoKKyAqIFJlcGx5IG1lc3NhZ2UgZnJvbSBmaXJtd2FyZQorICovCitzdHJ1Y3QgYmZpX2NlZV9nZXRfcnNwX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zCW1oOworCXU4CQkJY21kX3N0YXR1czsKKwl1OAkJCXJzdmRbM107Cit9OworCisvKgorICogUmVwbHkgbWVzc2FnZSBmcm9tIGZpcm13YXJlCisgKi8KK3N0cnVjdCBiZmlfY2VlX3N0YXRzX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcwltaDsKKwl1OAkJCWNtZF9zdGF0dXM7CisJdTgJCQlyc3ZkWzNdOworfTsKKworLyogTWFpbGJveCBtZXNzYWdlIHN0cnVjdHVyZXMgZnJvbSBmaXJtd2FyZSB0byBob3N0CSovCit1bmlvbiBiZmlfY2VlX2kyaF9tc2dfdSB7CisJc3RydWN0IGJmaV9taGRyX3MJCW1oOworCXN0cnVjdCBiZmlfY2VlX2dldF9yc3BfcwlnZXRfcnNwOworCXN0cnVjdCBiZmlfY2VlX3N0YXRzX3JzcF9zCXN0YXRzX3JzcDsKK307CisKKy8qCisgKiBTRlAgcmVsYXRlZAorICovCisKK2VudW0gYmZpX3NmcF9oMmlfZSB7CisJQkZJX1NGUF9IMklfU0hPVwk9IDEsCisJQkZJX1NGUF9IMklfU0NOCQk9IDIsCit9OworCitlbnVtIGJmaV9zZnBfaTJoX2UgeworCUJGSV9TRlBfSTJIX1NIT1cgPSBCRkFfSTJITShCRklfU0ZQX0gySV9TSE9XKSwKKwlCRklfU0ZQX0kySF9TQ04JID0gQkZBX0kySE0oQkZJX1NGUF9IMklfU0NOKSwKK307CisKKy8qCisgKglTRlAgc3RhdGUKKyAqLworZW51bSBiZmFfc2ZwX3N0YXRfZSB7CisJQkZBX1NGUF9TVEFURV9JTklUCT0gMCwJLyogU0ZQIHN0YXRlIGlzIHVuaW5pdAkqLworCUJGQV9TRlBfU1RBVEVfUkVNT1ZFRAk9IDEsCS8qIFNGUCBpcyByZW1vdmVkCSovCisJQkZBX1NGUF9TVEFURV9JTlNFUlRFRAk9IDIsCS8qIFNGUCBpcyBpbnNlcnRlZAkqLworCUJGQV9TRlBfU1RBVEVfVkFMSUQJPSAzLAkvKiBTRlAgaXMgdmFsaWQJCSovCisJQkZBX1NGUF9TVEFURV9VTlNVUFBPUlQJPSA0LAkvKiBTRlAgaXMgdW5zdXBwb3J0CSovCisJQkZBX1NGUF9TVEFURV9GQUlMRUQJPSA1LAkvKiBTRlAgaTJjIHJlYWQgZmFpbAkqLworfTsKKworLyoKKyAqICBTRlAgbWVtb3J5IGFjY2VzcyB0eXBlCisgKi8KK2VudW0gYmZpX3NmcF9tZW1fZSB7CisJQkZJX1NGUF9NRU1fQUxMCQk9IDB4MSwgIC8qIGFjY2VzcyBhbGwgZGF0YSBmaWVsZCAqLworCUJGSV9TRlBfTUVNX0RJQUdFWFQJPSAweDIsICAvKiBhY2Nlc3MgZGlhZyBleHQgZGF0YSBmaWVsZCBvbmx5ICovCit9OworCitzdHJ1Y3QgYmZpX3NmcF9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MJbWg7CisJdTgJCQltZW10eXBlOworCXU4CQkJcnN2ZFszXTsKKwlzdHJ1Y3QgYmZpX2FsZW5fcwlhbGVuOworfTsKKworc3RydWN0IGJmaV9zZnBfcnNwX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zCW1oOworCXU4CQkJc3RhdHVzOworCXU4CQkJc3RhdGU7CisJdTgJCQlyc3ZkWzJdOworfTsKKworLyoKKyAqCUZMQVNIIG1vZHVsZSBzcGVjaWZpYworICovCitlbnVtIGJmaV9mbGFzaF9oMmlfbXNncyB7CisJQkZJX0ZMQVNIX0gySV9RVUVSWV9SRVEgPSAxLAorCUJGSV9GTEFTSF9IMklfRVJBU0VfUkVRID0gMiwKKwlCRklfRkxBU0hfSDJJX1dSSVRFX1JFUSA9IDMsCisJQkZJX0ZMQVNIX0gySV9SRUFEX1JFUSA9IDQsCisJQkZJX0ZMQVNIX0gySV9CT09UX1ZFUl9SRVEgPSA1LAorfTsKKworZW51bSBiZmlfZmxhc2hfaTJoX21zZ3MgeworCUJGSV9GTEFTSF9JMkhfUVVFUllfUlNQID0gQkZBX0kySE0oMSksCisJQkZJX0ZMQVNIX0kySF9FUkFTRV9SU1AgPSBCRkFfSTJITSgyKSwKKwlCRklfRkxBU0hfSTJIX1dSSVRFX1JTUCA9IEJGQV9JMkhNKDMpLAorCUJGSV9GTEFTSF9JMkhfUkVBRF9SU1AgPSBCRkFfSTJITSg0KSwKKwlCRklfRkxBU0hfSTJIX0JPT1RfVkVSX1JTUCA9IEJGQV9JMkhNKDUpLAorCUJGSV9GTEFTSF9JMkhfRVZFTlQgPSBCRkFfSTJITSgxMjcpLAorfTsKKworLyoKKyAqIEZsYXNoIHF1ZXJ5IHJlcXVlc3QKKyAqLworc3RydWN0IGJmaV9mbGFzaF9xdWVyeV9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgbWg7CS8qIENvbW1vbiBtc2cgaGVhZGVyICovCisJc3RydWN0IGJmaV9hbGVuX3MgYWxlbjsKK307CisKKy8qCisgKiBGbGFzaCBlcmFzZSByZXF1ZXN0CisgKi8KK3N0cnVjdCBiZmlfZmxhc2hfZXJhc2VfcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zCW1oOwkvKiBDb21tb24gbXNnIGhlYWRlciAqLworCXUzMgl0eXBlOwkvKiBwYXJ0aXRpb24gdHlwZSAqLworCXU4CWluc3RhbmNlOyAvKiBwYXJ0aXRpb24gaW5zdGFuY2UgKi8KKwl1OAlyc3ZbM107Cit9OworCisvKgorICogRmxhc2ggd3JpdGUgcmVxdWVzdAorICovCitzdHJ1Y3QgYmZpX2ZsYXNoX3dyaXRlX3JlcV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyBtaDsJLyogQ29tbW9uIG1zZyBoZWFkZXIgKi8KKwlzdHJ1Y3QgYmZpX2FsZW5fcyBhbGVuOworCXUzMgl0eXBlOwkvKiBwYXJ0aXRpb24gdHlwZSAqLworCXU4CWluc3RhbmNlOyAvKiBwYXJ0aXRpb24gaW5zdGFuY2UgKi8KKwl1OAlsYXN0OworCXU4CXJzdlsyXTsKKwl1MzIJb2Zmc2V0OworCXUzMglsZW5ndGg7Cit9OworCisvKgorICogRmxhc2ggcmVhZCByZXF1ZXN0CisgKi8KK3N0cnVjdCBiZmlfZmxhc2hfcmVhZF9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgbWg7CS8qIENvbW1vbiBtc2cgaGVhZGVyICovCisJdTMyCXR5cGU7CQkvKiBwYXJ0aXRpb24gdHlwZSAqLworCXU4CWluc3RhbmNlOwkvKiBwYXJ0aXRpb24gaW5zdGFuY2UgKi8KKwl1OAlyc3ZbM107CisJdTMyCW9mZnNldDsKKwl1MzIJbGVuZ3RoOworCXN0cnVjdCBiZmlfYWxlbl9zIGFsZW47Cit9OworCisvKgorICogRmxhc2ggcXVlcnkgcmVzcG9uc2UKKyAqLworc3RydWN0IGJmaV9mbGFzaF9xdWVyeV9yc3BfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgbWg7CS8qIENvbW1vbiBtc2cgaGVhZGVyICovCisJdTMyCXN0YXR1czsKK307CisKKy8qCisgKiBGbGFzaCByZWFkIHJlc3BvbnNlCisgKi8KK3N0cnVjdCBiZmlfZmxhc2hfcmVhZF9yc3BfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgbWg7CS8qIENvbW1vbiBtc2cgaGVhZGVyICovCisJdTMyCXR5cGU7ICAgICAgIC8qIHBhcnRpdGlvbiB0eXBlICovCisJdTgJaW5zdGFuY2U7ICAgLyogcGFydGl0aW9uIGluc3RhbmNlICovCisJdTgJcnN2WzNdOworCXUzMglzdGF0dXM7CisJdTMyCWxlbmd0aDsKK307CisKKy8qCisgKiBGbGFzaCB3cml0ZSByZXNwb25zZQorICovCitzdHJ1Y3QgYmZpX2ZsYXNoX3dyaXRlX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyBtaDsJLyogQ29tbW9uIG1zZyBoZWFkZXIgKi8KKwl1MzIJdHlwZTsgICAgICAgLyogcGFydGl0aW9uIHR5cGUgKi8KKwl1OAlpbnN0YW5jZTsgICAvKiBwYXJ0aXRpb24gaW5zdGFuY2UgKi8KKwl1OAlyc3ZbM107CisJdTMyCXN0YXR1czsKKwl1MzIJbGVuZ3RoOworfTsKKworLyoKKyAqIEZsYXNoIGVyYXNlIHJlc3BvbnNlCisgKi8KK3N0cnVjdCBiZmlfZmxhc2hfZXJhc2VfcnNwX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zIG1oOwkvKiBDb21tb24gbXNnIGhlYWRlciAqLworCXUzMgl0eXBlOwkJLyogcGFydGl0aW9uIHR5cGUgKi8KKwl1OAlpbnN0YW5jZTsJLyogcGFydGl0aW9uIGluc3RhbmNlICovCisJdTgJcnN2WzNdOworCXUzMglzdGF0dXM7Cit9OworCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkJCQlESUFHCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworZW51bSBiZmlfZGlhZ19oMmkgeworCUJGSV9ESUFHX0gySV9QT1JUQkVBQ09OID0gMSwKKwlCRklfRElBR19IMklfTE9PUEJBQ0sgPSAyLAorCUJGSV9ESUFHX0gySV9GV1BJTkcgPSAzLAorCUJGSV9ESUFHX0gySV9URU1QU0VOU09SID0gNCwKKwlCRklfRElBR19IMklfTEVEVEVTVCA9IDUsCisJQkZJX0RJQUdfSDJJX1FURVNUICAgICAgPSA2LAorfTsKKworZW51bSBiZmlfZGlhZ19pMmggeworCUJGSV9ESUFHX0kySF9QT1JUQkVBQ09OID0gQkZBX0kySE0oQkZJX0RJQUdfSDJJX1BPUlRCRUFDT04pLAorCUJGSV9ESUFHX0kySF9MT09QQkFDSyA9IEJGQV9JMkhNKEJGSV9ESUFHX0gySV9MT09QQkFDSyksCisJQkZJX0RJQUdfSTJIX0ZXUElORyA9IEJGQV9JMkhNKEJGSV9ESUFHX0gySV9GV1BJTkcpLAorCUJGSV9ESUFHX0kySF9URU1QU0VOU09SID0gQkZBX0kySE0oQkZJX0RJQUdfSDJJX1RFTVBTRU5TT1IpLAorCUJGSV9ESUFHX0kySF9MRURURVNUID0gQkZBX0kySE0oQkZJX0RJQUdfSDJJX0xFRFRFU1QpLAorCUJGSV9ESUFHX0kySF9RVEVTVCAgICAgID0gQkZBX0kySE0oQkZJX0RJQUdfSDJJX1FURVNUKSwKK307CisKKyNkZWZpbmUgQkZJX0RJQUdfTUFYX1NHRVMJMgorI2RlZmluZSBCRklfRElBR19ETUFfQlVGX1NaCSgyICogMTAyNCkKKyNkZWZpbmUgQkZJX0JPT1RfTUVNVEVTVF9SRVNfQUREUiAweDkwMAorI2RlZmluZSBCRklfQk9PVF9NRU1URVNUX1JFU19TSUcgIDB4QTBBMUEyQTMKKworc3RydWN0IGJmaV9kaWFnX2xiX3JlcV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyBtaDsKKwl1MzIJbG9vcGNudDsKKwl1MzIJcGF0dGVybjsKKwl1OAlsYl9tb2RlOyAgICAgICAgLyohPCBiZmFfcG9ydF9vcG1vZGVfdCAqLworCXU4CXNwZWVkOyAgICAgICAgICAvKiE8IGJmYV9wb3J0X3NwZWVkX3QgKi8KKwl1OAlyc3ZkWzJdOworfTsKKworc3RydWN0IGJmaV9kaWFnX2xiX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7ICAgICAgICAgIC8qIDQgYnl0ZXMgKi8KKwlzdHJ1Y3QgYmZhX2RpYWdfbG9vcGJhY2tfcmVzdWx0X3MgcmVzOyAvKiAxNiBieXRlcyAqLworfTsKKworc3RydWN0IGJmaV9kaWFnX2Z3cGluZ19yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgbWg7CS8qIDQgYnl0ZXMgKi8KKwlzdHJ1Y3QgYmZpX2FsZW5fcyBhbGVuOyAvKiAxMiBieXRlcyAqLworCXUzMglkYXRhOyAgICAgICAgICAgLyogdXNlciBpbnB1dCBkYXRhIHBhdHRlcm4gKi8KKwl1MzIJY291bnQ7ICAgICAgICAgIC8qIHVzZXIgaW5wdXQgZG1hIGNvdW50ICovCisJdTgJcXRhZzsgICAgICAgICAgIC8qIHRyYWNrIENQRSB2YyAqLworCXU4CXJzdlszXTsKK307CisKK3N0cnVjdCBiZmlfZGlhZ19md3BpbmdfcnNwX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsgICAgICAgICAgLyogNCBieXRlcyAqLworCXUzMglkYXRhOyAgICAgICAgICAgLyogdXNlciBpbnB1dCBkYXRhIHBhdHRlcm4gICAgKi8KKwl1OAlxdGFnOyAgICAgICAgICAgLyogdHJhY2sgQ1BFIHZjICAgICAgICAgICAgICAgKi8KKwl1OAlkbWFfc3RhdHVzOyAgICAgLyogZG1hIHN0YXR1cyAgICAgICAgICAgICAgICAgKi8KKwl1OAlyc3ZbMl07Cit9OworCisvKgorICogVGVtcGVyYXR1cmUgU2Vuc29yCisgKi8KK3N0cnVjdCBiZmlfZGlhZ190c19yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgbWg7CS8qIDQgYnl0ZXMgKi8KKwl1MTYJdGVtcDsgICAgICAgICAgIC8qIDEwLWJpdCBBL0QgdmFsdWUgKi8KKwl1MTYJYnJkX3RlbXA7ICAgICAgIC8qIDktYml0IGJvYXJkIHRlbXAgKi8KKwl1OAlzdGF0dXM7CisJdTgJdHNfanVuYzsgICAgICAgIC8qIHNob3cganVuY3Rpb24gdGVtcHNlbnNvciAgICovCisJdTgJdHNfYnJkOyAgICAgICAgIC8qIHNob3cgYm9hcmQgdGVtcHNlbnNvciAgICAgICovCisJdTgJcnN2OworfTsKKyNkZWZpbmUgYmZpX2RpYWdfdHNfcnNwX3Qgc3RydWN0IGJmaV9kaWFnX3RzX3JlcV9zCisKK3N0cnVjdCBiZmlfZGlhZ19sZWR0ZXN0X3JlcV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7ICAvKiA0IGJ5dGVzICovCisJdTgJY21kOworCXU4CWNvbG9yOworCXU4CXBvcnRpZDsKKwl1OAlsZWQ7ICAgIC8qIGJpdG1hcCBvZiBMRURzIHRvIGJlIHRlc3RlZCAqLworCXUxNglmcmVxOyAgIC8qIG5vLiBvZiBibGlua3MgZXZlcnkgMTAgc2VjcyAqLworCXU4CXJzdlsyXTsKK307CisKKy8qIG5vdGlmeSBob3N0IGxlZCBvcGVyYXRpb24gaXMgZG9uZSAqLworc3RydWN0IGJmaV9kaWFnX2xlZHRlc3RfcnNwX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsgIC8qIDQgYnl0ZXMgKi8KK307CisKK3N0cnVjdCBiZmlfZGlhZ19wb3J0YmVhY29uX3JlcV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7ICAvKiA0IGJ5dGVzICovCisJdTMyCXBlcmlvZDsgLyogYmVhY29uaW5nIHBlcmlvZCAqLworCXU4CWJlYWNvbjsgLyogMTogYmVhY29uIG9uICovCisJdTgJcnN2ZFszXTsKK307CisKKy8qIG5vdGlmeSBob3N0IHRoZSBiZWFjb24gaXMgb2ZmICovCitzdHJ1Y3QgYmZpX2RpYWdfcG9ydGJlYWNvbl9yc3BfcyB7CisJc3RydWN0IGJmaV9taGRyX3MgIG1oOyAgLyogNCBieXRlcyAqLworfTsKKworc3RydWN0IGJmaV9kaWFnX3F0ZXN0X3JlcV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcwltaDsgICAgICAgICAgICAgLyogNCBieXRlcyAqLworCXUzMglkYXRhW0JGSV9MTVNHX1BMX1dTWl07IC8qIGZpbGwgdXAgdGNtIHByZWZldGNoIGFyZWEgKi8KK307CisjZGVmaW5lIGJmaV9kaWFnX3F0ZXN0X3JzcF90IHN0cnVjdCBiZmlfZGlhZ19xdGVzdF9yZXFfcworCisvKgorICoJUEhZIG1vZHVsZSBzcGVjaWZpYworICovCitlbnVtIGJmaV9waHlfaDJpX21zZ3NfZSB7CisJQkZJX1BIWV9IMklfUVVFUllfUkVRID0gMSwKKwlCRklfUEhZX0gySV9TVEFUU19SRVEgPSAyLAorCUJGSV9QSFlfSDJJX1dSSVRFX1JFUSA9IDMsCisJQkZJX1BIWV9IMklfUkVBRF9SRVEgPSA0LAorfTsKKworZW51bSBiZmlfcGh5X2kyaF9tc2dzX2UgeworCUJGSV9QSFlfSTJIX1FVRVJZX1JTUCA9IEJGQV9JMkhNKDEpLAorCUJGSV9QSFlfSTJIX1NUQVRTX1JTUCA9IEJGQV9JMkhNKDIpLAorCUJGSV9QSFlfSTJIX1dSSVRFX1JTUCA9IEJGQV9JMkhNKDMpLAorCUJGSV9QSFlfSTJIX1JFQURfUlNQID0gQkZBX0kySE0oNCksCit9OworCisvKgorICogRXh0ZXJuYWwgUEhZIHF1ZXJ5IHJlcXVlc3QKKyAqLworc3RydWN0IGJmaV9waHlfcXVlcnlfcmVxX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zCW1oOyAgICAgICAgICAgICAvKiBDb21tb24gbXNnIGhlYWRlciAqLworCXU4CQkJaW5zdGFuY2U7CisJdTgJCQlyc3ZbM107CisJc3RydWN0IGJmaV9hbGVuX3MJYWxlbjsKK307CisKKy8qCisgKiBFeHRlcm5hbCBQSFkgc3RhdHMgcmVxdWVzdAorICovCitzdHJ1Y3QgYmZpX3BoeV9zdGF0c19yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MJbWg7ICAgICAgICAgICAgIC8qIENvbW1vbiBtc2cgaGVhZGVyICovCisJdTgJCQlpbnN0YW5jZTsKKwl1OAkJCXJzdlszXTsKKwlzdHJ1Y3QgYmZpX2FsZW5fcwlhbGVuOworfTsKKworLyoKKyAqIEV4dGVybmFsIFBIWSB3cml0ZSByZXF1ZXN0CisgKi8KK3N0cnVjdCBiZmlfcGh5X3dyaXRlX3JlcV9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcwltaDsgICAgICAgICAgICAgLyogQ29tbW9uIG1zZyBoZWFkZXIgKi8KKwl1OAkJaW5zdGFuY2U7CisJdTgJCWxhc3Q7CisJdTgJCXJzdlsyXTsKKwl1MzIJCW9mZnNldDsKKwl1MzIJCWxlbmd0aDsKKwlzdHJ1Y3QgYmZpX2FsZW5fcwlhbGVuOworfTsKKworLyoKKyAqIEV4dGVybmFsIFBIWSByZWFkIHJlcXVlc3QKKyAqLworc3RydWN0IGJmaV9waHlfcmVhZF9yZXFfcyB7CisJc3RydWN0IGJmaV9taGRyX3MJbWg7CS8qIENvbW1vbiBtc2cgaGVhZGVyICovCisJdTgJCWluc3RhbmNlOworCXU4CQlyc3ZbM107CisJdTMyCQlvZmZzZXQ7CisJdTMyCQlsZW5ndGg7CisJc3RydWN0IGJmaV9hbGVuX3MJYWxlbjsKK307CisKKy8qCisgKiBFeHRlcm5hbCBQSFkgcXVlcnkgcmVzcG9uc2UKKyAqLworc3RydWN0IGJmaV9waHlfcXVlcnlfcnNwX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zCW1oOwkvKiBDb21tb24gbXNnIGhlYWRlciAqLworCXUzMgkJCXN0YXR1czsKK307CisKKy8qCisgKiBFeHRlcm5hbCBQSFkgc3RhdHMgcmVzcG9uc2UKKyAqLworc3RydWN0IGJmaV9waHlfc3RhdHNfcnNwX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zCW1oOwkvKiBDb21tb24gbXNnIGhlYWRlciAqLworCXUzMgkJCXN0YXR1czsKK307CisKKy8qCisgKiBFeHRlcm5hbCBQSFkgcmVhZCByZXNwb25zZQorICovCitzdHJ1Y3QgYmZpX3BoeV9yZWFkX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcwltaDsJLyogQ29tbW9uIG1zZyBoZWFkZXIgKi8KKwl1MzIJCQlzdGF0dXM7CisJdTMyCQlsZW5ndGg7Cit9OworCisvKgorICogRXh0ZXJuYWwgUEhZIHdyaXRlIHJlc3BvbnNlCisgKi8KK3N0cnVjdCBiZmlfcGh5X3dyaXRlX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcwltaDsJLyogQ29tbW9uIG1zZyBoZWFkZXIgKi8KKwl1MzIJCQlzdGF0dXM7CisJdTMyCQkJbGVuZ3RoOworfTsKKwogI3ByYWdtYSBwYWNrKCkKIAogI2VuZGlmIC8qIF9fQkZJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmlfY2JyZWcuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZpX2NicmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YWQ0MmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmlfY2JyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0KLS8qCi0gKiBiZmlfY2JyZWcuaCBjcm9zc2JvdyBob3N0IGJsb2NrIHJlZ2lzdGVyIGRlZmluaXRpb25zCi0gKgotICogISEhIERvIG5vdCBlZGl0LiBBdXRvIGdlbmVyYXRlZC4gISEhCi0gKi8KLQotI2lmbmRlZiBfX0JGSV9DQlJFR19IX18KLSNkZWZpbmUgX19CRklfQ0JSRUdfSF9fCi0KLQotI2RlZmluZSBIT1NURk4wX0lOVF9TVEFUVVMgICAgICAgICAgICAgICAweDAwMDE0MDAwCi0jZGVmaW5lIF9fSE9TVEZOMF9JTlRfU1RBVFVTX0xWTF9NSyAgICAgIDB4MDBmMDAwMDAKLSNkZWZpbmUgX19IT1NURk4wX0lOVF9TVEFUVVNfTFZMX1NIICAgICAgMjAKLSNkZWZpbmUgX19IT1NURk4wX0lOVF9TVEFUVVNfTFZMKF92KSAgICAgKChfdikgPDwgX19IT1NURk4wX0lOVF9TVEFUVVNfTFZMX1NIKQotI2RlZmluZSBfX0hPU1RGTjBfSU5UX1NUQVRVU19QICAgICAgICAgICAweDAwMGZmZmZmCi0jZGVmaW5lIEhPU1RGTjBfSU5UX01TSyAgICAgICAgICAgICAgICAgIDB4MDAwMTQwMDQKLSNkZWZpbmUgSE9TVF9QQUdFX05VTV9GTjAgICAgICAgICAgICAgICAgMHgwMDAxNDAwOAotI2RlZmluZSBfX0hPU1RfUEFHRV9OVU1fRk4gICAgICAgICAgICAgICAweDAwMDAwMWZmCi0jZGVmaW5lIEhPU1RGTjFfSU5UX1NUQVRVUyAgICAgICAgICAgICAgIDB4MDAwMTQxMDAKLSNkZWZpbmUgX19IT1NURk4xX0lOVF9TVEFUX0xWTF9NSyAgICAgICAgMHgwMGYwMDAwMAotI2RlZmluZSBfX0hPU1RGTjFfSU5UX1NUQVRfTFZMX1NIICAgICAgICAyMAotI2RlZmluZSBfX0hPU1RGTjFfSU5UX1NUQVRfTFZMKF92KSAgICAgICAoKF92KSA8PCBfX0hPU1RGTjFfSU5UX1NUQVRfTFZMX1NIKQotI2RlZmluZSBfX0hPU1RGTjFfSU5UX1NUQVRfUCAgICAgICAgICAgICAweDAwMGZmZmZmCi0jZGVmaW5lIEhPU1RGTjFfSU5UX01TSyAgICAgICAgICAgICAgICAgIDB4MDAwMTQxMDQKLSNkZWZpbmUgSE9TVF9QQUdFX05VTV9GTjEgICAgICAgICAgICAgICAgMHgwMDAxNDEwOAotI2RlZmluZSBBUFBfUExMXzQwMF9DVExfUkVHICAgICAgICAgICAgICAweDAwMDE0MjA0Ci0jZGVmaW5lIF9fUF80MDBfUExMX0xPQ0sgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgX19BUFBfUExMXzQwMF9TUkFNX1VTRV8xMDBNSFogICAgMHgwMDEwMDAwMAotI2RlZmluZSBfX0FQUF9QTExfNDAwX1JFU0VUX1RJTUVSX01LICAgICAweDAwMGUwMDAwCi0jZGVmaW5lIF9fQVBQX1BMTF80MDBfUkVTRVRfVElNRVJfU0ggICAgIDE3Ci0jZGVmaW5lIF9fQVBQX1BMTF80MDBfUkVTRVRfVElNRVIoX3YpICAgICgoX3YpIDw8IF9fQVBQX1BMTF80MDBfUkVTRVRfVElNRVJfU0gpCi0jZGVmaW5lIF9fQVBQX1BMTF80MDBfTE9HSUNfU09GVF9SRVNFVCAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgX19BUFBfUExMXzQwMF9DTlRMTVQwXzFfTUsgICAgICAgMHgwMDAwYzAwMAotI2RlZmluZSBfX0FQUF9QTExfNDAwX0NOVExNVDBfMV9TSCAgICAgICAxNAotI2RlZmluZSBfX0FQUF9QTExfNDAwX0NOVExNVDBfMShfdikgICAgICAoKF92KSA8PCBfX0FQUF9QTExfNDAwX0NOVExNVDBfMV9TSCkKLSNkZWZpbmUgX19BUFBfUExMXzQwMF9KSVRMTVQwXzFfTUsgICAgICAgMHgwMDAwMzAwMAotI2RlZmluZSBfX0FQUF9QTExfNDAwX0pJVExNVDBfMV9TSCAgICAgICAxMgotI2RlZmluZSBfX0FQUF9QTExfNDAwX0pJVExNVDBfMShfdikgICAgICAoKF92KSA8PCBfX0FQUF9QTExfNDAwX0pJVExNVDBfMV9TSCkKLSNkZWZpbmUgX19BUFBfUExMXzQwMF9IUkVGICAgICAgICAgICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBfX0FQUF9QTExfNDAwX0hESVYgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIF9fQVBQX1BMTF80MDBfUDBfMV9NSyAgICAgICAgICAgIDB4MDAwMDAzMDAKLSNkZWZpbmUgX19BUFBfUExMXzQwMF9QMF8xX1NIICAgICAgICAgICAgOAotI2RlZmluZSBfX0FQUF9QTExfNDAwX1AwXzEoX3YpICAgICAgICAgICAoKF92KSA8PCBfX0FQUF9QTExfNDAwX1AwXzFfU0gpCi0jZGVmaW5lIF9fQVBQX1BMTF80MDBfWjBfMl9NSyAgICAgICAgICAgIDB4MDAwMDAwZTAKLSNkZWZpbmUgX19BUFBfUExMXzQwMF9aMF8yX1NIICAgICAgICAgICAgNQotI2RlZmluZSBfX0FQUF9QTExfNDAwX1owXzIoX3YpICAgICAgICAgICAoKF92KSA8PCBfX0FQUF9QTExfNDAwX1owXzJfU0gpCi0jZGVmaW5lIF9fQVBQX1BMTF80MDBfUlNFTDIwMDUwMCAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgX19BUFBfUExMXzQwMF9FTkFSU1QgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBfX0FQUF9QTExfNDAwX0JZUEFTUyAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIF9fQVBQX1BMTF80MDBfTFJFU0VUTiAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgX19BUFBfUExMXzQwMF9FTkFCTEUgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBUFBfUExMXzIxMl9DVExfUkVHICAgICAgICAgICAgICAweDAwMDE0MjA4Ci0jZGVmaW5lIF9fUF8yMTJfUExMX0xPQ0sgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgX19BUFBfUExMXzIxMl9SRVNFVF9USU1FUl9NSyAgICAgMHgwMDBlMDAwMAotI2RlZmluZSBfX0FQUF9QTExfMjEyX1JFU0VUX1RJTUVSX1NIICAgICAxNwotI2RlZmluZSBfX0FQUF9QTExfMjEyX1JFU0VUX1RJTUVSKF92KSAgICAoKF92KSA8PCBfX0FQUF9QTExfMjEyX1JFU0VUX1RJTUVSX1NIKQotI2RlZmluZSBfX0FQUF9QTExfMjEyX0xPR0lDX1NPRlRfUkVTRVQgICAweDAwMDEwMDAwCi0jZGVmaW5lIF9fQVBQX1BMTF8yMTJfQ05UTE1UMF8xX01LICAgICAgIDB4MDAwMGMwMDAKLSNkZWZpbmUgX19BUFBfUExMXzIxMl9DTlRMTVQwXzFfU0ggICAgICAgMTQKLSNkZWZpbmUgX19BUFBfUExMXzIxMl9DTlRMTVQwXzEoX3YpICAgICAgKChfdikgPDwgX19BUFBfUExMXzIxMl9DTlRMTVQwXzFfU0gpCi0jZGVmaW5lIF9fQVBQX1BMTF8yMTJfSklUTE1UMF8xX01LICAgICAgIDB4MDAwMDMwMDAKLSNkZWZpbmUgX19BUFBfUExMXzIxMl9KSVRMTVQwXzFfU0ggICAgICAgMTIKLSNkZWZpbmUgX19BUFBfUExMXzIxMl9KSVRMTVQwXzEoX3YpICAgICAgKChfdikgPDwgX19BUFBfUExMXzIxMl9KSVRMTVQwXzFfU0gpCi0jZGVmaW5lIF9fQVBQX1BMTF8yMTJfSFJFRiAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgX19BUFBfUExMXzIxMl9IRElWICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBfX0FQUF9QTExfMjEyX1AwXzFfTUsgICAgICAgICAgICAweDAwMDAwMzAwCi0jZGVmaW5lIF9fQVBQX1BMTF8yMTJfUDBfMV9TSCAgICAgICAgICAgIDgKLSNkZWZpbmUgX19BUFBfUExMXzIxMl9QMF8xKF92KSAgICAgICAgICAgKChfdikgPDwgX19BUFBfUExMXzIxMl9QMF8xX1NIKQotI2RlZmluZSBfX0FQUF9QTExfMjEyX1owXzJfTUsgICAgICAgICAgICAweDAwMDAwMGUwCi0jZGVmaW5lIF9fQVBQX1BMTF8yMTJfWjBfMl9TSCAgICAgICAgICAgIDUKLSNkZWZpbmUgX19BUFBfUExMXzIxMl9aMF8yKF92KSAgICAgICAgICAgKChfdikgPDwgX19BUFBfUExMXzIxMl9aMF8yX1NIKQotI2RlZmluZSBfX0FQUF9QTExfMjEyX1JTRUwyMDA1MDAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIF9fQVBQX1BMTF8yMTJfRU5BUlNUICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgX19BUFBfUExMXzIxMl9CWVBBU1MgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBfX0FQUF9QTExfMjEyX0xSRVNFVE4gICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIF9fQVBQX1BMTF8yMTJfRU5BQkxFICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSE9TVF9TRU0wX1JFRyAgICAgICAgICAgICAgICAgICAgMHgwMDAxNDIzMAotI2RlZmluZSBfX0hPU1RfU0VNQVBIT1JFICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEhPU1RfU0VNMV9SRUcgICAgICAgICAgICAgICAgICAgIDB4MDAwMTQyMzQKLSNkZWZpbmUgSE9TVF9TRU0yX1JFRyAgICAgICAgICAgICAgICAgICAgMHgwMDAxNDIzOAotI2RlZmluZSBIT1NUX1NFTTNfUkVHICAgICAgICAgICAgICAgICAgICAweDAwMDE0MjNjCi0jZGVmaW5lIEhPU1RfU0VNMF9JTkZPX1JFRyAgICAgICAgICAgICAgIDB4MDAwMTQyNDAKLSNkZWZpbmUgSE9TVF9TRU0xX0lORk9fUkVHICAgICAgICAgICAgICAgMHgwMDAxNDI0NAotI2RlZmluZSBIT1NUX1NFTTJfSU5GT19SRUcgICAgICAgICAgICAgICAweDAwMDE0MjQ4Ci0jZGVmaW5lIEhPU1RfU0VNM19JTkZPX1JFRyAgICAgICAgICAgICAgIDB4MDAwMTQyNGMKLSNkZWZpbmUgSE9TVEZOMF9MUFUwX0NNRF9TVEFUICAgICAgICAgICAgMHgwMDAxOTAwMAotI2RlZmluZSBfX0hPU1RGTjBfTFBVMF9NQk9YX0lORk9fTUsgICAgICAweGZmZmZmZmZlCi0jZGVmaW5lIF9fSE9TVEZOMF9MUFUwX01CT1hfSU5GT19TSCAgICAgIDEKLSNkZWZpbmUgX19IT1NURk4wX0xQVTBfTUJPWF9JTkZPKF92KSAgICAgKChfdikgPDwgX19IT1NURk4wX0xQVTBfTUJPWF9JTkZPX1NIKQotI2RlZmluZSBfX0hPU1RGTjBfTFBVMF9NQk9YX0NNRF9TVEFUVVMgICAweDAwMDAwMDAxCi0jZGVmaW5lIExQVTBfSE9TVEZOMF9DTURfU1RBVCAgICAgICAgICAgIDB4MDAwMTkwMDgKLSNkZWZpbmUgX19MUFUwX0hPU1RGTjBfTUJPWF9JTkZPX01LICAgICAgMHhmZmZmZmZmZQotI2RlZmluZSBfX0xQVTBfSE9TVEZOMF9NQk9YX0lORk9fU0ggICAgICAxCi0jZGVmaW5lIF9fTFBVMF9IT1NURk4wX01CT1hfSU5GTyhfdikgICAgICgoX3YpIDw8IF9fTFBVMF9IT1NURk4wX01CT1hfSU5GT19TSCkKLSNkZWZpbmUgX19MUFUwX0hPU1RGTjBfTUJPWF9DTURfU1RBVFVTICAgMHgwMDAwMDAwMQotI2RlZmluZSBIT1NURk4xX0xQVTFfQ01EX1NUQVQgICAgICAgICAgICAweDAwMDE5MDE0Ci0jZGVmaW5lIF9fSE9TVEZOMV9MUFUxX01CT1hfSU5GT19NSyAgICAgIDB4ZmZmZmZmZmUKLSNkZWZpbmUgX19IT1NURk4xX0xQVTFfTUJPWF9JTkZPX1NIICAgICAgMQotI2RlZmluZSBfX0hPU1RGTjFfTFBVMV9NQk9YX0lORk8oX3YpICAgICAoKF92KSA8PCBfX0hPU1RGTjFfTFBVMV9NQk9YX0lORk9fU0gpCi0jZGVmaW5lIF9fSE9TVEZOMV9MUFUxX01CT1hfQ01EX1NUQVRVUyAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgTFBVMV9IT1NURk4xX0NNRF9TVEFUICAgICAgICAgICAgMHgwMDAxOTAxYwotI2RlZmluZSBfX0xQVTFfSE9TVEZOMV9NQk9YX0lORk9fTUsgICAgICAweGZmZmZmZmZlCi0jZGVmaW5lIF9fTFBVMV9IT1NURk4xX01CT1hfSU5GT19TSCAgICAgIDEKLSNkZWZpbmUgX19MUFUxX0hPU1RGTjFfTUJPWF9JTkZPKF92KSAgICAgKChfdikgPDwgX19MUFUxX0hPU1RGTjFfTUJPWF9JTkZPX1NIKQotI2RlZmluZSBfX0xQVTFfSE9TVEZOMV9NQk9YX0NNRF9TVEFUVVMgICAweDAwMDAwMDAxCi0jZGVmaW5lIENQRV9RMF9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMTQKLSNkZWZpbmUgQ1BFX1EwX1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAxYwotI2RlZmluZSBDUEVfUTBfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDIwCi0jZGVmaW5lIENQRV9RMV9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMzQKLSNkZWZpbmUgQ1BFX1ExX1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAzYwotI2RlZmluZSBDUEVfUTFfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDQwCi0jZGVmaW5lIENQRV9RMl9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwNTQKLSNkZWZpbmUgQ1BFX1EyX1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDA1YwotI2RlZmluZSBDUEVfUTJfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDYwCi0jZGVmaW5lIENQRV9RM19ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwNzQKLSNkZWZpbmUgQ1BFX1EzX1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDA3YwotI2RlZmluZSBDUEVfUTNfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDgwCi0jZGVmaW5lIENQRV9RNF9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwOTQKLSNkZWZpbmUgQ1BFX1E0X1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDA5YwotI2RlZmluZSBDUEVfUTRfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMGEwCi0jZGVmaW5lIENQRV9RNV9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwYjQKLSNkZWZpbmUgQ1BFX1E1X1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDBiYwotI2RlZmluZSBDUEVfUTVfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMGMwCi0jZGVmaW5lIENQRV9RNl9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwZDQKLSNkZWZpbmUgQ1BFX1E2X1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDBkYwotI2RlZmluZSBDUEVfUTZfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMGUwCi0jZGVmaW5lIENQRV9RN19ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwZjQKLSNkZWZpbmUgQ1BFX1E3X1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDBmYwotI2RlZmluZSBDUEVfUTdfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMTAwCi0jZGVmaW5lIFJNRV9RMF9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwMTQKLSNkZWZpbmUgUk1FX1EwX1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTAxYwotI2RlZmluZSBSTUVfUTBfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDExMDIwCi0jZGVmaW5lIFJNRV9RMV9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwMzQKLSNkZWZpbmUgUk1FX1ExX1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTAzYwotI2RlZmluZSBSTUVfUTFfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDExMDQwCi0jZGVmaW5lIFJNRV9RMl9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwNTQKLSNkZWZpbmUgUk1FX1EyX1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTA1YwotI2RlZmluZSBSTUVfUTJfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDExMDYwCi0jZGVmaW5lIFJNRV9RM19ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwNzQKLSNkZWZpbmUgUk1FX1EzX1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTA3YwotI2RlZmluZSBSTUVfUTNfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDExMDgwCi0jZGVmaW5lIFJNRV9RNF9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwOTQKLSNkZWZpbmUgUk1FX1E0X1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTA5YwotI2RlZmluZSBSTUVfUTRfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDExMGEwCi0jZGVmaW5lIFJNRV9RNV9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwYjQKLSNkZWZpbmUgUk1FX1E1X1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTBiYwotI2RlZmluZSBSTUVfUTVfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDExMGMwCi0jZGVmaW5lIFJNRV9RNl9ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwZDQKLSNkZWZpbmUgUk1FX1E2X1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTBkYwotI2RlZmluZSBSTUVfUTZfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDExMGUwCi0jZGVmaW5lIFJNRV9RN19ERVBUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTEwZjQKLSNkZWZpbmUgUk1FX1E3X1BJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMTBmYwotI2RlZmluZSBSTUVfUTdfQ0kgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDExMTAwCi0jZGVmaW5lIFBTU19DVExfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTg4MDAKLSNkZWZpbmUgX19QU1NfSTJDX0NMS19ESVZfTUsgICAgICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBfX1BTU19JMkNfQ0xLX0RJVl9TSCAgICAgICAgICAgICAxNgotI2RlZmluZSBfX1BTU19JMkNfQ0xLX0RJVihfdikgICAgICAgICAgICAoKF92KSA8PCBfX1BTU19JMkNfQ0xLX0RJVl9TSCkKLSNkZWZpbmUgX19QU1NfTE1FTV9JTklUX0RPTkUgICAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBfX1BTU19MTUVNX1JFU0VUICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIF9fUFNTX0xNRU1fSU5JVF9FTiAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgX19QU1NfTFBVMV9SRVNFVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBfX1BTU19MUFUwX1JFU0VUICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFBTU19FUlJfU1RBVFVTX1JFRyAgICAgICAgICAgICAgIDB4MDAwMTg4MTAKLSNkZWZpbmUgX19QU1NfTE1FTTFfQ09SUl9FUlIgICAgICAgICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBfX1BTU19MTUVNMF9DT1JSX0VSUiAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIF9fUFNTX0xNRU0xX1VOQ09SUl9FUlIgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgX19QU1NfTE1FTTBfVU5DT1JSX0VSUiAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBfX1BTU19CQUxfUEVSUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIF9fUFNTX0RJUF9JRl9FUlIgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgX19QU1NfSU9IX0lGX0VSUiAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBfX1BTU19URFNfSUZfRVJSICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIF9fUFNTX1JEU19JRl9FUlIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgX19QU1NfU0dNX0lGX0VSUiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBfX1BTU19MUFUxX1JBTV9FUlIgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIF9fUFNTX0xQVTBfUkFNX0VSUiAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgRVJSX1NFVF9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxODgxOAotI2RlZmluZSBfX1BTU19FUlJfU1RBVFVTX1NFVCAgICAgICAgICAgICAweDAwMDAwZmZmCi0KLQotLyoKLSAqIFRoZXNlIGRlZmluaXRpb25zIGFyZSBlaXRoZXIgaW4gZXJyb3IvbWlzc2luZyBpbiBzcGVjLiBJdHMgYXV0by1nZW5lcmF0ZWQKLSAqIGZyb20gaGFyZCBjb2RlZCB2YWx1ZXMgaW4gcmVncGFyc2UucGwuCi0gKi8KLSNkZWZpbmUgX19FTVBIUE9TVF9BVF80R19NS19GSVggICAgICAgICAgMHgwMDAwMDAxYwotI2RlZmluZSBfX0VNUEhQT1NUX0FUXzRHX1NIX0ZJWCAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIF9fRU1QSFBSRV9BVF80R19GSVggICAgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgX19TRlBfVFhSQVRFX0VOX0ZJWCAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBfX1NGUF9SWFJBVEVfRU5fRklYICAgICAgICAgICAgICAweDAwMDAwMDgwCi0KLQotLyoKLSAqIFRoZXNlIHJlZ2lzdGVyIGRlZmluaXRpb25zIGFyZSBhdXRvLWdlbmVyYXRlZCBmcm9tIGhhcmQgY29kZWQgdmFsdWVzCi0gKiBpbiByZWdwYXJzZS5wbC4KLSAqLwotI2RlZmluZSBIT1NURk4wX0xQVV9NQk9YMF8wICAgICAgICAgICAgICAweDAwMDE5MjAwCi0jZGVmaW5lIEhPU1RGTjFfTFBVX01CT1gwXzggICAgICAgICAgICAgIDB4MDAwMTkyNjAKLSNkZWZpbmUgTFBVX0hPU1RGTjBfTUJPWDBfMCAgICAgICAgICAgICAgMHgwMDAxOTI4MAotI2RlZmluZSBMUFVfSE9TVEZOMV9NQk9YMF84ICAgICAgICAgICAgICAweDAwMDE5MmUwCi0KLQotLyoKLSAqIFRoZXNlIHJlZ2lzdGVyIG1hcHBpbmcgZGVmaW5pdGlvbnMgYXJlIGF1dG8tZ2VuZXJhdGVkIGZyb20gbWFwcGluZyB0YWJsZXMKLSAqIGluIHJlZ3BhcnNlLnBsLgotICovCi0jZGVmaW5lIEJGQV9JT0MwX0hCRUFUX1JFRyAgICAgICAgICAgICAgIEhPU1RfU0VNMF9JTkZPX1JFRwotI2RlZmluZSBCRkFfSU9DMF9TVEFURV9SRUcgICAgICAgICAgICAgICBIT1NUX1NFTTFfSU5GT19SRUcKLSNkZWZpbmUgQkZBX0lPQzFfSEJFQVRfUkVHICAgICAgICAgICAgICAgSE9TVF9TRU0yX0lORk9fUkVHCi0jZGVmaW5lIEJGQV9JT0MxX1NUQVRFX1JFRyAgICAgICAgICAgICAgIEhPU1RfU0VNM19JTkZPX1JFRwotI2RlZmluZSBCRkFfRldfVVNFX0NPVU5UICAgICAgICAgICAgICAgICBIT1NUX1NFTTRfSU5GT19SRUcKLSNkZWZpbmUgQkZBX0lPQ19GQUlMX1NZTkMJCSBIT1NUX1NFTTVfSU5GT19SRUcKLQotI2RlZmluZSBDUEVfUV9ERVBUSChfX24pIFwKLQkoQ1BFX1EwX0RFUFRIICsgKF9fbikgKiAoQ1BFX1ExX0RFUFRIIC0gQ1BFX1EwX0RFUFRIKSkKLSNkZWZpbmUgQ1BFX1FfUEkoX19uKSBcCi0JKENQRV9RMF9QSSArIChfX24pICogKENQRV9RMV9QSSAtIENQRV9RMF9QSSkpCi0jZGVmaW5lIENQRV9RX0NJKF9fbikgXAotCShDUEVfUTBfQ0kgKyAoX19uKSAqIChDUEVfUTFfQ0kgLSBDUEVfUTBfQ0kpKQotI2RlZmluZSBSTUVfUV9ERVBUSChfX24pIFwKLQkoUk1FX1EwX0RFUFRIICsgKF9fbikgKiAoUk1FX1ExX0RFUFRIIC0gUk1FX1EwX0RFUFRIKSkKLSNkZWZpbmUgUk1FX1FfUEkoX19uKSBcCi0JKFJNRV9RMF9QSSArIChfX24pICogKFJNRV9RMV9QSSAtIFJNRV9RMF9QSSkpCi0jZGVmaW5lIFJNRV9RX0NJKF9fbikgXAotCShSTUVfUTBfQ0kgKyAoX19uKSAqIChSTUVfUTFfQ0kgLSBSTUVfUTBfQ0kpKQotCi0jZGVmaW5lIENQRV9RX05VTShfX2ZuLCBfX3EpICAoKChfX2ZuKSA8PCAyKSArIChfX3EpKQotI2RlZmluZSBSTUVfUV9OVU0oX19mbiwgX19xKSAgKCgoX19mbikgPDwgMikgKyAoX19xKSkKLSNkZWZpbmUgQ1BFX1FfTUFTSyhfX3EpICAoKF9fcSkgJiAweDMpCi0jZGVmaW5lIFJNRV9RX01BU0soX19xKSAgKChfX3EpICYgMHgzKQotCi0KLS8qCi0gKiBQQ0kgTVNJLVggdmVjdG9yIGRlZmluZXMKLSAqLwotZW51bSB7Ci0gICAgQkZBX01TSVhfQ1BFX1EwID0gMCwKLSAgICBCRkFfTVNJWF9DUEVfUTEgPSAxLAotICAgIEJGQV9NU0lYX0NQRV9RMiA9IDIsCi0gICAgQkZBX01TSVhfQ1BFX1EzID0gMywKLSAgICBCRkFfTVNJWF9DUEVfUTQgPSA0LAotICAgIEJGQV9NU0lYX0NQRV9RNSA9IDUsCi0gICAgQkZBX01TSVhfQ1BFX1E2ID0gNiwKLSAgICBCRkFfTVNJWF9DUEVfUTcgPSA3LAotICAgIEJGQV9NU0lYX1JNRV9RMCA9IDgsCi0gICAgQkZBX01TSVhfUk1FX1ExID0gOSwKLSAgICBCRkFfTVNJWF9STUVfUTIgPSAxMCwKLSAgICBCRkFfTVNJWF9STUVfUTMgPSAxMSwKLSAgICBCRkFfTVNJWF9STUVfUTQgPSAxMiwKLSAgICBCRkFfTVNJWF9STUVfUTUgPSAxMywKLSAgICBCRkFfTVNJWF9STUVfUTYgPSAxNCwKLSAgICBCRkFfTVNJWF9STUVfUTcgPSAxNSwKLSAgICBCRkFfTVNJWF9FUlJfRU1DID0gMTYsCi0gICAgQkZBX01TSVhfRVJSX0xQVTAgPSAxNywKLSAgICBCRkFfTVNJWF9FUlJfTFBVMSA9IDE4LAotICAgIEJGQV9NU0lYX0VSUl9QU1MgPSAxOSwKLSAgICBCRkFfTVNJWF9NQk9YX0xQVTAgPSAyMCwKLSAgICBCRkFfTVNJWF9NQk9YX0xQVTEgPSAyMSwKLSAgICBCRkFfTVNJWF9DQl9NQVggPSAyMiwKLX07Ci0KLS8qCi0gKiBBbmQgY29ycmVzcG9uZGluZyBob3N0IGludGVycnVwdCBzdGF0dXMgYml0IGZpZWxkIGRlZmluZXMKLSAqLwotI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1EwICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTEgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlUKLSNkZWZpbmUgX19IRk5fSU5UX0NQRV9RMiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VQotI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1EzICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFUKLSNkZWZpbmUgX19IRk5fSU5UX0NQRV9RNSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVQotI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1E2ICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTcgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MFUKLSNkZWZpbmUgX19IRk5fSU5UX1JNRV9RMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwVQotI2RlZmluZSBfX0hGTl9JTlRfUk1FX1ExICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9STUVfUTIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMFUKLSNkZWZpbmUgX19IRk5fSU5UX1JNRV9RMyAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwVQotI2RlZmluZSBfX0hGTl9JTlRfUk1FX1E0ICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9STUVfUTUgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMFUKLSNkZWZpbmUgX19IRk5fSU5UX1JNRV9RNiAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwVQotI2RlZmluZSBfX0hGTl9JTlRfUk1FX1E3ICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9FUlJfRU1DICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMFUKLSNkZWZpbmUgX19IRk5fSU5UX0VSUl9MUFUwICAgICAgICAgICAgICAgICAweDAwMDIwMDAwVQotI2RlZmluZSBfX0hGTl9JTlRfRVJSX0xQVTEgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9FUlJfUFNTICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMFUKLSNkZWZpbmUgX19IRk5fSU5UX01CT1hfTFBVMCAgICAgICAgICAgICAgICAweDAwMTAwMDAwVQotI2RlZmluZSBfX0hGTl9JTlRfTUJPWF9MUFUxICAgICAgICAgICAgICAgIDB4MDAyMDAwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9NQk9YMV9MUFUwICAgICAgICAgICAgICAgMHgwMDQwMDAwMFUKLSNkZWZpbmUgX19IRk5fSU5UX01CT1gxX0xQVTEgICAgICAgICAgICAgICAweDAwODAwMDAwVQotI2RlZmluZSBfX0hGTl9JTlRfQ1BFX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwZmZVCi0jZGVmaW5lIF9fSEZOX0lOVF9STUVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwZmYwMFUKLQotCi0vKgotICogY3Jvc3Nib3cgbWVtb3J5IG1hcC4KLSAqLwotI2RlZmluZSBQU1NfU01FTV9QQUdFX1NUQVJUCTB4ODAwMAotI2RlZmluZSBQU1NfU01FTV9QR05VTShfcGcwLCBfbWEpCSgoX3BnMCkgKyAoKF9tYSkgPj4gMTUpKQotI2RlZmluZSBQU1NfU01FTV9QR09GRihfbWEpCSgoX21hKSAmIDB4N2ZmZikKLQotLyoKLSAqIEVuZCBvZiBjcm9zc2JvdyBtZW1vcnkgbWFwCi0gKi8KLQotCi0jZW5kaWYgLyogX19CRklfQ0JSRUdfSF9fICovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZpX2N0cmVnLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmaV9jdHJlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzRjZTRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZpX2N0cmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotCi0vKgotICogYmZpX2N0cmVnLmggY2F0YXB1bHQgaG9zdCBibG9jayByZWdpc3RlciBkZWZpbml0aW9ucwotICoKLSAqICEhISBEbyBub3QgZWRpdC4gQXV0byBnZW5lcmF0ZWQuICEhIQotICovCi0KLSNpZm5kZWYgX19CRklfQ1RSRUdfSF9fCi0jZGVmaW5lIF9fQkZJX0NUUkVHX0hfXwotCi0KLSNkZWZpbmUgSE9TVEZOMF9MUFVfTUJPWDBfMAkJMHgwMDAxOTIwMAotI2RlZmluZSBIT1NURk4xX0xQVV9NQk9YMF84CQkweDAwMDE5MjYwCi0jZGVmaW5lIExQVV9IT1NURk4wX01CT1gwXzAJCTB4MDAwMTkyODAKLSNkZWZpbmUgTFBVX0hPU1RGTjFfTUJPWDBfOAkJMHgwMDAxOTJlMAotI2RlZmluZSBIT1NURk4yX0xQVV9NQk9YMF8wCQkweDAwMDE5NDAwCi0jZGVmaW5lIEhPU1RGTjNfTFBVX01CT1gwXzgJCTB4MDAwMTk0NjAKLSNkZWZpbmUgTFBVX0hPU1RGTjJfTUJPWDBfMAkJMHgwMDAxOTQ4MAotI2RlZmluZSBMUFVfSE9TVEZOM19NQk9YMF84CQkweDAwMDE5NGUwCi0jZGVmaW5lIEhPU1RGTjBfSU5UX1NUQVRVUwkJMHgwMDAxNDAwMAotI2RlZmluZSBfX0hPU1RGTjBfSEFMVF9PQ0NVUlJFRAkJMHgwMTAwMDAwMAotI2RlZmluZSBfX0hPU1RGTjBfSU5UX1NUQVRVU19MVkxfTUsJMHgwMGYwMDAwMAotI2RlZmluZSBfX0hPU1RGTjBfSU5UX1NUQVRVU19MVkxfU0gJMjAKLSNkZWZpbmUgX19IT1NURk4wX0lOVF9TVEFUVVNfTFZMKF92KQkoKF92KSA8PCBfX0hPU1RGTjBfSU5UX1NUQVRVU19MVkxfU0gpCi0jZGVmaW5lIF9fSE9TVEZOMF9JTlRfU1RBVFVTX1BfTUsJMHgwMDBmMDAwMAotI2RlZmluZSBfX0hPU1RGTjBfSU5UX1NUQVRVU19QX1NICTE2Ci0jZGVmaW5lIF9fSE9TVEZOMF9JTlRfU1RBVFVTX1AoX3YpCSgoX3YpIDw8IF9fSE9TVEZOMF9JTlRfU1RBVFVTX1BfU0gpCi0jZGVmaW5lIF9fSE9TVEZOMF9JTlRfU1RBVFVTX0YJCTB4MDAwMGZmZmYKLSNkZWZpbmUgSE9TVEZOMF9JTlRfTVNLCQkJMHgwMDAxNDAwNAotI2RlZmluZSBIT1NUX1BBR0VfTlVNX0ZOMAkJMHgwMDAxNDAwOAotI2RlZmluZSBfX0hPU1RfUEFHRV9OVU1fRk4JCTB4MDAwMDAxZmYKLSNkZWZpbmUgSE9TVF9NU0lYX0VSUl9JTkRFWF9GTjAJCTB4MDAwMTQwMGMKLSNkZWZpbmUgX19NU0lYX0VSUl9JTkRFWF9GTgkJMHgwMDAwMDFmZgotI2RlZmluZSBIT1NURk4xX0lOVF9TVEFUVVMJCTB4MDAwMTQxMDAKLSNkZWZpbmUgX19IT1NURk4xX0hBTFRfT0NDVVJSRUQJCTB4MDEwMDAwMDAKLSNkZWZpbmUgX19IT1NURk4xX0lOVF9TVEFUVVNfTFZMX01LCTB4MDBmMDAwMDAKLSNkZWZpbmUgX19IT1NURk4xX0lOVF9TVEFUVVNfTFZMX1NICTIwCi0jZGVmaW5lIF9fSE9TVEZOMV9JTlRfU1RBVFVTX0xWTChfdikJKChfdikgPDwgX19IT1NURk4xX0lOVF9TVEFUVVNfTFZMX1NIKQotI2RlZmluZSBfX0hPU1RGTjFfSU5UX1NUQVRVU19QX01LCTB4MDAwZjAwMDAKLSNkZWZpbmUgX19IT1NURk4xX0lOVF9TVEFUVVNfUF9TSAkxNgotI2RlZmluZSBfX0hPU1RGTjFfSU5UX1NUQVRVU19QKF92KQkoKF92KSA8PCBfX0hPU1RGTjFfSU5UX1NUQVRVU19QX1NIKQotI2RlZmluZSBfX0hPU1RGTjFfSU5UX1NUQVRVU19GCQkweDAwMDBmZmZmCi0jZGVmaW5lIEhPU1RGTjFfSU5UX01TSwkJCTB4MDAwMTQxMDQKLSNkZWZpbmUgSE9TVF9QQUdFX05VTV9GTjEJCTB4MDAwMTQxMDgKLSNkZWZpbmUgSE9TVF9NU0lYX0VSUl9JTkRFWF9GTjEJCTB4MDAwMTQxMGMKLSNkZWZpbmUgQVBQX1BMTF80MjVfQ1RMX1JFRwkJMHgwMDAxNDIwNAotI2RlZmluZSBfX1BfNDI1X1BMTF9MT0NLCQkweDgwMDAwMDAwCi0jZGVmaW5lIF9fQVBQX1BMTF80MjVfU1JBTV9VU0VfMTAwTUhaCTB4MDAxMDAwMDAKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9SRVNFVF9USU1FUl9NSwkweDAwMGUwMDAwCi0jZGVmaW5lIF9fQVBQX1BMTF80MjVfUkVTRVRfVElNRVJfU0gJMTcKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9SRVNFVF9USU1FUihfdikJKChfdikgPDwgX19BUFBfUExMXzQyNV9SRVNFVF9USU1FUl9TSCkKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9MT0dJQ19TT0ZUX1JFU0VUCTB4MDAwMTAwMDAKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9DTlRMTVQwXzFfTUsJMHgwMDAwYzAwMAotI2RlZmluZSBfX0FQUF9QTExfNDI1X0NOVExNVDBfMV9TSAkxNAotI2RlZmluZSBfX0FQUF9QTExfNDI1X0NOVExNVDBfMShfdikJKChfdikgPDwgX19BUFBfUExMXzQyNV9DTlRMTVQwXzFfU0gpCi0jZGVmaW5lIF9fQVBQX1BMTF80MjVfSklUTE1UMF8xX01LCTB4MDAwMDMwMDAKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9KSVRMTVQwXzFfU0gJMTIKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9KSVRMTVQwXzEoX3YpCSgoX3YpIDw8IF9fQVBQX1BMTF80MjVfSklUTE1UMF8xX1NIKQotI2RlZmluZSBfX0FQUF9QTExfNDI1X0hSRUYJCTB4MDAwMDA4MDAKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9IRElWCQkweDAwMDAwNDAwCi0jZGVmaW5lIF9fQVBQX1BMTF80MjVfUDBfMV9NSwkJMHgwMDAwMDMwMAotI2RlZmluZSBfX0FQUF9QTExfNDI1X1AwXzFfU0gJCTgKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9QMF8xKF92KQkJKChfdikgPDwgX19BUFBfUExMXzQyNV9QMF8xX1NIKQotI2RlZmluZSBfX0FQUF9QTExfNDI1X1owXzJfTUsJCTB4MDAwMDAwZTAKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9aMF8yX1NICQk1Ci0jZGVmaW5lIF9fQVBQX1BMTF80MjVfWjBfMihfdikJCSgoX3YpIDw8IF9fQVBQX1BMTF80MjVfWjBfMl9TSCkKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9SU0VMMjAwNTAwCTB4MDAwMDAwMTAKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9FTkFSU1QJCTB4MDAwMDAwMDgKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9CWVBBU1MJCTB4MDAwMDAwMDQKLSNkZWZpbmUgX19BUFBfUExMXzQyNV9MUkVTRVROCQkweDAwMDAwMDAyCi0jZGVmaW5lIF9fQVBQX1BMTF80MjVfRU5BQkxFCQkweDAwMDAwMDAxCi0jZGVmaW5lIEFQUF9QTExfMzEyX0NUTF9SRUcJCTB4MDAwMTQyMDgKLSNkZWZpbmUgX19QXzMxMl9QTExfTE9DSwkJMHg4MDAwMDAwMAotI2RlZmluZSBfX0VOQUJMRV9NQUNfQUhCXzEJCTB4MDA4MDAwMDAKLSNkZWZpbmUgX19FTkFCTEVfTUFDX0FIQl8wCQkweDAwNDAwMDAwCi0jZGVmaW5lIF9fRU5BQkxFX01BQ18xCQkJMHgwMDIwMDAwMAotI2RlZmluZSBfX0VOQUJMRV9NQUNfMAkJCTB4MDAxMDAwMDAKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9SRVNFVF9USU1FUl9NSwkweDAwMGUwMDAwCi0jZGVmaW5lIF9fQVBQX1BMTF8zMTJfUkVTRVRfVElNRVJfU0gJMTcKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9SRVNFVF9USU1FUihfdikJKChfdikgPDwgX19BUFBfUExMXzMxMl9SRVNFVF9USU1FUl9TSCkKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9MT0dJQ19TT0ZUX1JFU0VUCTB4MDAwMTAwMDAKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9DTlRMTVQwXzFfTUsJMHgwMDAwYzAwMAotI2RlZmluZSBfX0FQUF9QTExfMzEyX0NOVExNVDBfMV9TSAkxNAotI2RlZmluZSBfX0FQUF9QTExfMzEyX0NOVExNVDBfMShfdikJKChfdikgPDwgX19BUFBfUExMXzMxMl9DTlRMTVQwXzFfU0gpCi0jZGVmaW5lIF9fQVBQX1BMTF8zMTJfSklUTE1UMF8xX01LCTB4MDAwMDMwMDAKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9KSVRMTVQwXzFfU0gJMTIKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9KSVRMTVQwXzEoX3YpCSgoX3YpIDw8IF9fQVBQX1BMTF8zMTJfSklUTE1UMF8xX1NIKQotI2RlZmluZSBfX0FQUF9QTExfMzEyX0hSRUYJCTB4MDAwMDA4MDAKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9IRElWCQkweDAwMDAwNDAwCi0jZGVmaW5lIF9fQVBQX1BMTF8zMTJfUDBfMV9NSwkJMHgwMDAwMDMwMAotI2RlZmluZSBfX0FQUF9QTExfMzEyX1AwXzFfU0gJCTgKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9QMF8xKF92KQkJKChfdikgPDwgX19BUFBfUExMXzMxMl9QMF8xX1NIKQotI2RlZmluZSBfX0FQUF9QTExfMzEyX1owXzJfTUsJCTB4MDAwMDAwZTAKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9aMF8yX1NICQk1Ci0jZGVmaW5lIF9fQVBQX1BMTF8zMTJfWjBfMihfdikJCSgoX3YpIDw8IF9fQVBQX1BMTF8zMTJfWjBfMl9TSCkKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9SU0VMMjAwNTAwCTB4MDAwMDAwMTAKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9FTkFSU1QJCTB4MDAwMDAwMDgKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9CWVBBU1MJCTB4MDAwMDAwMDQKLSNkZWZpbmUgX19BUFBfUExMXzMxMl9MUkVTRVROCQkweDAwMDAwMDAyCi0jZGVmaW5lIF9fQVBQX1BMTF8zMTJfRU5BQkxFCQkweDAwMDAwMDAxCi0jZGVmaW5lIE1CSVNUX0NUTF9SRUcJCQkweDAwMDE0MjIwCi0jZGVmaW5lIF9fRURSQU1fQklTVFJfU1RBUlQJCTB4MDAwMDAwMDQKLSNkZWZpbmUgX19NQklTVF9SRVNFVAkJCTB4MDAwMDAwMDIKLSNkZWZpbmUgX19NQklTVF9TVEFSVAkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgTUJJU1RfU1RBVF9SRUcJCQkweDAwMDE0MjI0Ci0jZGVmaW5lIF9fRURSQU1fQklTVFJfU1RBVFVTCQkweDAwMDAwMDA4Ci0jZGVmaW5lIF9fRURSQU1fQklTVFJfRE9ORQkJMHgwMDAwMDAwNAotI2RlZmluZSBfX01FTV9CSVRfU1RBVFVTCQkweDAwMDAwMDAyCi0jZGVmaW5lIF9fTUJJU1RfRE9ORQkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgSE9TVF9TRU0wX1JFRwkJCTB4MDAwMTQyMzAKLSNkZWZpbmUgX19IT1NUX1NFTUFQSE9SRQkJMHgwMDAwMDAwMQotI2RlZmluZSBIT1NUX1NFTTFfUkVHCQkJMHgwMDAxNDIzNAotI2RlZmluZSBIT1NUX1NFTTJfUkVHCQkJMHgwMDAxNDIzOAotI2RlZmluZSBIT1NUX1NFTTNfUkVHCQkJMHgwMDAxNDIzYwotI2RlZmluZSBIT1NUX1NFTTBfSU5GT19SRUcJCTB4MDAwMTQyNDAKLSNkZWZpbmUgSE9TVF9TRU0xX0lORk9fUkVHCQkweDAwMDE0MjQ0Ci0jZGVmaW5lIEhPU1RfU0VNMl9JTkZPX1JFRwkJMHgwMDAxNDI0OAotI2RlZmluZSBIT1NUX1NFTTNfSU5GT19SRUcJCTB4MDAwMTQyNGMKLSNkZWZpbmUgRVRIX01BQ19TRVJfUkVHCQkJMHgwMDAxNDI4OAotI2RlZmluZSBfX0FQUF9FTVNfQ0tCVUZBTVBJTgkJMHgwMDAwMDAyMAotI2RlZmluZSBfX0FQUF9FTVNfUkVGQ0xLU0VMCQkweDAwMDAwMDEwCi0jZGVmaW5lIF9fQVBQX0VNU19DTUxDS1NFTAkJMHgwMDAwMDAwOAotI2RlZmluZSBfX0FQUF9FTVNfUkVGQ0tCVUZFTjIJCTB4MDAwMDAwMDQKLSNkZWZpbmUgX19BUFBfRU1TX1JFRkNLQlVGRU4xCQkweDAwMDAwMDAyCi0jZGVmaW5lIF9fQVBQX0VNU19DSEFOTkVMX1NFTAkJMHgwMDAwMDAwMQotI2RlZmluZSBIT1NURk4yX0lOVF9TVEFUVVMJCTB4MDAwMTQzMDAKLSNkZWZpbmUgX19IT1NURk4yX0hBTFRfT0NDVVJSRUQJCTB4MDEwMDAwMDAKLSNkZWZpbmUgX19IT1NURk4yX0lOVF9TVEFUVVNfTFZMX01LCTB4MDBmMDAwMDAKLSNkZWZpbmUgX19IT1NURk4yX0lOVF9TVEFUVVNfTFZMX1NICTIwCi0jZGVmaW5lIF9fSE9TVEZOMl9JTlRfU1RBVFVTX0xWTChfdikJKChfdikgPDwgX19IT1NURk4yX0lOVF9TVEFUVVNfTFZMX1NIKQotI2RlZmluZSBfX0hPU1RGTjJfSU5UX1NUQVRVU19QX01LCTB4MDAwZjAwMDAKLSNkZWZpbmUgX19IT1NURk4yX0lOVF9TVEFUVVNfUF9TSAkxNgotI2RlZmluZSBfX0hPU1RGTjJfSU5UX1NUQVRVU19QKF92KQkoKF92KSA8PCBfX0hPU1RGTjJfSU5UX1NUQVRVU19QX1NIKQotI2RlZmluZSBfX0hPU1RGTjJfSU5UX1NUQVRVU19GCQkweDAwMDBmZmZmCi0jZGVmaW5lIEhPU1RGTjJfSU5UX01TSwkJCTB4MDAwMTQzMDQKLSNkZWZpbmUgSE9TVF9QQUdFX05VTV9GTjIJCTB4MDAwMTQzMDgKLSNkZWZpbmUgSE9TVF9NU0lYX0VSUl9JTkRFWF9GTjIJCTB4MDAwMTQzMGMKLSNkZWZpbmUgSE9TVEZOM19JTlRfU1RBVFVTCQkweDAwMDE0NDAwCi0jZGVmaW5lIF9fSEFMVF9PQ0NVUlJFRAkJCTB4MDEwMDAwMDAKLSNkZWZpbmUgX19IT1NURk4zX0lOVF9TVEFUVVNfTFZMX01LCTB4MDBmMDAwMDAKLSNkZWZpbmUgX19IT1NURk4zX0lOVF9TVEFUVVNfTFZMX1NICTIwCi0jZGVmaW5lIF9fSE9TVEZOM19JTlRfU1RBVFVTX0xWTChfdikJKChfdikgPDwgX19IT1NURk4zX0lOVF9TVEFUVVNfTFZMX1NIKQotI2RlZmluZSBfX0hPU1RGTjNfSU5UX1NUQVRVU19QX01LCTB4MDAwZjAwMDAKLSNkZWZpbmUgX19IT1NURk4zX0lOVF9TVEFUVVNfUF9TSAkxNgotI2RlZmluZSBfX0hPU1RGTjNfSU5UX1NUQVRVU19QKF92KQkoKF92KSA8PCBfX0hPU1RGTjNfSU5UX1NUQVRVU19QX1NIKQotI2RlZmluZSBfX0hPU1RGTjNfSU5UX1NUQVRVU19GCQkweDAwMDBmZmZmCi0jZGVmaW5lIEhPU1RGTjNfSU5UX01TSwkJCTB4MDAwMTQ0MDQKLSNkZWZpbmUgSE9TVF9QQUdFX05VTV9GTjMJCTB4MDAwMTQ0MDgKLSNkZWZpbmUgSE9TVF9NU0lYX0VSUl9JTkRFWF9GTjMJCTB4MDAwMTQ0MGMKLSNkZWZpbmUgRk5DX0lEX1JFRwkJCTB4MDAwMTQ2MDAKLSNkZWZpbmUgX19GVU5DVElPTl9OVU1CRVIJCTB4MDAwMDAwMDcKLSNkZWZpbmUgRk5DX1BFUlNfUkVHCQkJMHgwMDAxNDYwNAotI2RlZmluZSBfX0YzX0ZVTkNUSU9OX0FDVElWRQkJMHg4MDAwMDAwMAotI2RlZmluZSBfX0YzX0ZVTkNUSU9OX01PREUJCTB4NDAwMDAwMDAKLSNkZWZpbmUgX19GM19QT1JUX01BUF9NSwkJMHgzMDAwMDAwMAotI2RlZmluZSBfX0YzX1BPUlRfTUFQX1NICQkyOAotI2RlZmluZSBfX0YzX1BPUlRfTUFQKF92KQkJKChfdikgPDwgX19GM19QT1JUX01BUF9TSCkKLSNkZWZpbmUgX19GM19WTV9NT0RFCQkJMHgwODAwMDAwMAotI2RlZmluZSBfX0YzX0lOVFhfU1RBVFVTX01LCQkweDA3MDAwMDAwCi0jZGVmaW5lIF9fRjNfSU5UWF9TVEFUVVNfU0gJCTI0Ci0jZGVmaW5lIF9fRjNfSU5UWF9TVEFUVVMoX3YpCQkoKF92KSA8PCBfX0YzX0lOVFhfU1RBVFVTX1NIKQotI2RlZmluZSBfX0YyX0ZVTkNUSU9OX0FDVElWRQkJMHgwMDgwMDAwMAotI2RlZmluZSBfX0YyX0ZVTkNUSU9OX01PREUJCTB4MDA0MDAwMDAKLSNkZWZpbmUgX19GMl9QT1JUX01BUF9NSwkJMHgwMDMwMDAwMAotI2RlZmluZSBfX0YyX1BPUlRfTUFQX1NICQkyMAotI2RlZmluZSBfX0YyX1BPUlRfTUFQKF92KQkJKChfdikgPDwgX19GMl9QT1JUX01BUF9TSCkKLSNkZWZpbmUgX19GMl9WTV9NT0RFCQkJMHgwMDA4MDAwMAotI2RlZmluZSBfX0YyX0lOVFhfU1RBVFVTX01LCQkweDAwMDcwMDAwCi0jZGVmaW5lIF9fRjJfSU5UWF9TVEFUVVNfU0gJCTE2Ci0jZGVmaW5lIF9fRjJfSU5UWF9TVEFUVVMoX3YpCQkoKF92KSA8PCBfX0YyX0lOVFhfU1RBVFVTX1NIKQotI2RlZmluZSBfX0YxX0ZVTkNUSU9OX0FDVElWRQkJMHgwMDAwODAwMAotI2RlZmluZSBfX0YxX0ZVTkNUSU9OX01PREUJCTB4MDAwMDQwMDAKLSNkZWZpbmUgX19GMV9QT1JUX01BUF9NSwkJMHgwMDAwMzAwMAotI2RlZmluZSBfX0YxX1BPUlRfTUFQX1NICQkxMgotI2RlZmluZSBfX0YxX1BPUlRfTUFQKF92KQkJKChfdikgPDwgX19GMV9QT1JUX01BUF9TSCkKLSNkZWZpbmUgX19GMV9WTV9NT0RFCQkJMHgwMDAwMDgwMAotI2RlZmluZSBfX0YxX0lOVFhfU1RBVFVTX01LCQkweDAwMDAwNzAwCi0jZGVmaW5lIF9fRjFfSU5UWF9TVEFUVVNfU0gJCTgKLSNkZWZpbmUgX19GMV9JTlRYX1NUQVRVUyhfdikJCSgoX3YpIDw8IF9fRjFfSU5UWF9TVEFUVVNfU0gpCi0jZGVmaW5lIF9fRjBfRlVOQ1RJT05fQUNUSVZFCQkweDAwMDAwMDgwCi0jZGVmaW5lIF9fRjBfRlVOQ1RJT05fTU9ERQkJMHgwMDAwMDA0MAotI2RlZmluZSBfX0YwX1BPUlRfTUFQX01LCQkweDAwMDAwMDMwCi0jZGVmaW5lIF9fRjBfUE9SVF9NQVBfU0gJCTQKLSNkZWZpbmUgX19GMF9QT1JUX01BUChfdikJCSgoX3YpIDw8IF9fRjBfUE9SVF9NQVBfU0gpCi0jZGVmaW5lIF9fRjBfVk1fTU9ERQkJMHgwMDAwMDAwOAotI2RlZmluZSBfX0YwX0lOVFhfU1RBVFVTCQkweDAwMDAwMDA3Ci1lbnVtIHsKLQlfX0YwX0lOVFhfU1RBVFVTX01TSVgJCT0gMHgwLAotCV9fRjBfSU5UWF9TVEFUVVNfSU5UQQkJPSAweDEsCi0JX19GMF9JTlRYX1NUQVRVU19JTlRCCQk9IDB4MiwKLQlfX0YwX0lOVFhfU1RBVFVTX0lOVEMJCT0gMHgzLAotCV9fRjBfSU5UWF9TVEFUVVNfSU5URAkJPSAweDQsCi19OwotI2RlZmluZSBPUF9NT0RFCQkJCTB4MDAwMTQ2MGMKLSNkZWZpbmUgX19BUFBfRVRIX0NMS19MT1dTUEVFRAkJMHgwMDAwMDAwNAotI2RlZmluZSBfX0dMT0JBTF9DT1JFQ0xLX0hBTEZTUEVFRAkweDAwMDAwMDAyCi0jZGVmaW5lIF9fR0xPQkFMX0ZDT0VfTU9ERQkJMHgwMDAwMDAwMQotI2RlZmluZSBIT1NUX1NFTTRfUkVHCQkJMHgwMDAxNDYxMAotI2RlZmluZSBIT1NUX1NFTTVfUkVHCQkJMHgwMDAxNDYxNAotI2RlZmluZSBIT1NUX1NFTTZfUkVHCQkJMHgwMDAxNDYxOAotI2RlZmluZSBIT1NUX1NFTTdfUkVHCQkJMHgwMDAxNDYxYwotI2RlZmluZSBIT1NUX1NFTTRfSU5GT19SRUcJCTB4MDAwMTQ2MjAKLSNkZWZpbmUgSE9TVF9TRU01X0lORk9fUkVHCQkweDAwMDE0NjI0Ci0jZGVmaW5lIEhPU1RfU0VNNl9JTkZPX1JFRwkJMHgwMDAxNDYyOAotI2RlZmluZSBIT1NUX1NFTTdfSU5GT19SRUcJCTB4MDAwMTQ2MmMKLSNkZWZpbmUgSE9TVEZOMF9MUFUwX01CT1gwX0NNRF9TVEFUCTB4MDAwMTkwMDAKLSNkZWZpbmUgX19IT1NURk4wX0xQVTBfTUJPWDBfSU5GT19NSwkweGZmZmZmZmZlCi0jZGVmaW5lIF9fSE9TVEZOMF9MUFUwX01CT1gwX0lORk9fU0gJMQotI2RlZmluZSBfX0hPU1RGTjBfTFBVMF9NQk9YMF9JTkZPKF92KQkoKF92KSA8PCBfX0hPU1RGTjBfTFBVMF9NQk9YMF9JTkZPX1NIKQotI2RlZmluZSBfX0hPU1RGTjBfTFBVMF9NQk9YMF9DTURfU1RBVFVTIDB4MDAwMDAwMDEKLSNkZWZpbmUgSE9TVEZOMF9MUFUxX01CT1gwX0NNRF9TVEFUCTB4MDAwMTkwMDQKLSNkZWZpbmUgX19IT1NURk4wX0xQVTFfTUJPWDBfSU5GT19NSwkweGZmZmZmZmZlCi0jZGVmaW5lIF9fSE9TVEZOMF9MUFUxX01CT1gwX0lORk9fU0gJMQotI2RlZmluZSBfX0hPU1RGTjBfTFBVMV9NQk9YMF9JTkZPKF92KQkoKF92KSA8PCBfX0hPU1RGTjBfTFBVMV9NQk9YMF9JTkZPX1NIKQotI2RlZmluZSBfX0hPU1RGTjBfTFBVMV9NQk9YMF9DTURfU1RBVFVTIDB4MDAwMDAwMDEKLSNkZWZpbmUgTFBVMF9IT1NURk4wX01CT1gwX0NNRF9TVEFUCTB4MDAwMTkwMDgKLSNkZWZpbmUgX19MUFUwX0hPU1RGTjBfTUJPWDBfSU5GT19NSwkweGZmZmZmZmZlCi0jZGVmaW5lIF9fTFBVMF9IT1NURk4wX01CT1gwX0lORk9fU0gJMQotI2RlZmluZSBfX0xQVTBfSE9TVEZOMF9NQk9YMF9JTkZPKF92KQkoKF92KSA8PCBfX0xQVTBfSE9TVEZOMF9NQk9YMF9JTkZPX1NIKQotI2RlZmluZSBfX0xQVTBfSE9TVEZOMF9NQk9YMF9DTURfU1RBVFVTIDB4MDAwMDAwMDEKLSNkZWZpbmUgTFBVMV9IT1NURk4wX01CT1gwX0NNRF9TVEFUCTB4MDAwMTkwMGMKLSNkZWZpbmUgX19MUFUxX0hPU1RGTjBfTUJPWDBfSU5GT19NSwkweGZmZmZmZmZlCi0jZGVmaW5lIF9fTFBVMV9IT1NURk4wX01CT1gwX0lORk9fU0gJMQotI2RlZmluZSBfX0xQVTFfSE9TVEZOMF9NQk9YMF9JTkZPKF92KQkoKF92KSA8PCBfX0xQVTFfSE9TVEZOMF9NQk9YMF9JTkZPX1NIKQotI2RlZmluZSBfX0xQVTFfSE9TVEZOMF9NQk9YMF9DTURfU1RBVFVTIDB4MDAwMDAwMDEKLSNkZWZpbmUgSE9TVEZOMV9MUFUwX01CT1gwX0NNRF9TVEFUCTB4MDAwMTkwMTAKLSNkZWZpbmUgX19IT1NURk4xX0xQVTBfTUJPWDBfSU5GT19NSwkweGZmZmZmZmZlCi0jZGVmaW5lIF9fSE9TVEZOMV9MUFUwX01CT1gwX0lORk9fU0gJMQotI2RlZmluZSBfX0hPU1RGTjFfTFBVMF9NQk9YMF9JTkZPKF92KQkoKF92KSA8PCBfX0hPU1RGTjFfTFBVMF9NQk9YMF9JTkZPX1NIKQotI2RlZmluZSBfX0hPU1RGTjFfTFBVMF9NQk9YMF9DTURfU1RBVFVTIDB4MDAwMDAwMDEKLSNkZWZpbmUgSE9TVEZOMV9MUFUxX01CT1gwX0NNRF9TVEFUCTB4MDAwMTkwMTQKLSNkZWZpbmUgX19IT1NURk4xX0xQVTFfTUJPWDBfSU5GT19NSwkweGZmZmZmZmZlCi0jZGVmaW5lIF9fSE9TVEZOMV9MUFUxX01CT1gwX0lORk9fU0gJMQotI2RlZmluZSBfX0hPU1RGTjFfTFBVMV9NQk9YMF9JTkZPKF92KQkoKF92KSA8PCBfX0hPU1RGTjFfTFBVMV9NQk9YMF9JTkZPX1NIKQotI2RlZmluZSBfX0hPU1RGTjFfTFBVMV9NQk9YMF9DTURfU1RBVFVTIDB4MDAwMDAwMDEKLSNkZWZpbmUgTFBVMF9IT1NURk4xX01CT1gwX0NNRF9TVEFUCTB4MDAwMTkwMTgKLSNkZWZpbmUgX19MUFUwX0hPU1RGTjFfTUJPWDBfSU5GT19NSwkweGZmZmZmZmZlCi0jZGVmaW5lIF9fTFBVMF9IT1NURk4xX01CT1gwX0lORk9fU0gJMQotI2RlZmluZSBfX0xQVTBfSE9TVEZOMV9NQk9YMF9JTkZPKF92KQkoKF92KSA8PCBfX0xQVTBfSE9TVEZOMV9NQk9YMF9JTkZPX1NIKQotI2RlZmluZSBfX0xQVTBfSE9TVEZOMV9NQk9YMF9DTURfU1RBVFVTIDB4MDAwMDAwMDEKLSNkZWZpbmUgTFBVMV9IT1NURk4xX01CT1gwX0NNRF9TVEFUCTB4MDAwMTkwMWMKLSNkZWZpbmUgX19MUFUxX0hPU1RGTjFfTUJPWDBfSU5GT19NSwkweGZmZmZmZmZlCi0jZGVmaW5lIF9fTFBVMV9IT1NURk4xX01CT1gwX0lORk9fU0gJMQotI2RlZmluZSBfX0xQVTFfSE9TVEZOMV9NQk9YMF9JTkZPKF92KQkoKF92KSA8PCBfX0xQVTFfSE9TVEZOMV9NQk9YMF9JTkZPX1NIKQotI2RlZmluZSBfX0xQVTFfSE9TVEZOMV9NQk9YMF9DTURfU1RBVFVTIDB4MDAwMDAwMDEKLSNkZWZpbmUgSE9TVEZOMl9MUFUwX01CT1gwX0NNRF9TVEFUCTB4MDAwMTkxNTAKLSNkZWZpbmUgX19IT1NURk4yX0xQVTBfTUJPWDBfSU5GT19NSwkweGZmZmZmZmZlCi0jZGVmaW5lIF9fSE9TVEZOMl9MUFUwX01CT1gwX0lORk9fU0gJMQotI2RlZmluZSBfX0hPU1RGTjJfTFBVMF9NQk9YMF9JTkZPKF92KQkoKF92KSA8PCBfX0hPU1RGTjJfTFBVMF9NQk9YMF9JTkZPX1NIKQotI2RlZmluZSBfX0hPU1RGTjJfTFBVMF9NQk9YMF9DTURfU1RBVFVTIDB4MDAwMDAwMDEKLSNkZWZpbmUgSE9TVEZOMl9MUFUxX01CT1gwX0NNRF9TVEFUCTB4MDAwMTkxNTQKLSNkZWZpbmUgX19IT1NURk4yX0xQVTFfTUJPWDBfSU5GT19NSwkweGZmZmZmZmZlCi0jZGVmaW5lIF9fSE9TVEZOMl9MUFUxX01CT1gwX0lORk9fU0gJMQotI2RlZmluZSBfX0hPU1RGTjJfTFBVMV9NQk9YMF9JTkZPKF92KQkoKF92KSA8PCBfX0hPU1RGTjJfTFBVMV9NQk9YMF9JTkZPX1NIKQotI2RlZmluZSBfX0hPU1RGTjJfTFBVMV9NQk9YMEJPWDBfQ01EX1NUQVRVUyAweDAwMDAwMDAxCi0jZGVmaW5lIExQVTBfSE9TVEZOMl9NQk9YMF9DTURfU1RBVAkweDAwMDE5MTU4Ci0jZGVmaW5lIF9fTFBVMF9IT1NURk4yX01CT1gwX0lORk9fTUsJMHhmZmZmZmZmZQotI2RlZmluZSBfX0xQVTBfSE9TVEZOMl9NQk9YMF9JTkZPX1NICTEKLSNkZWZpbmUgX19MUFUwX0hPU1RGTjJfTUJPWDBfSU5GTyhfdikJKChfdikgPDwgX19MUFUwX0hPU1RGTjJfTUJPWDBfSU5GT19TSCkKLSNkZWZpbmUgX19MUFUwX0hPU1RGTjJfTUJPWDBfQ01EX1NUQVRVUyAweDAwMDAwMDAxCi0jZGVmaW5lIExQVTFfSE9TVEZOMl9NQk9YMF9DTURfU1RBVAkweDAwMDE5MTVjCi0jZGVmaW5lIF9fTFBVMV9IT1NURk4yX01CT1gwX0lORk9fTUsJMHhmZmZmZmZmZQotI2RlZmluZSBfX0xQVTFfSE9TVEZOMl9NQk9YMF9JTkZPX1NICTEKLSNkZWZpbmUgX19MUFUxX0hPU1RGTjJfTUJPWDBfSU5GTyhfdikJKChfdikgPDwgX19MUFUxX0hPU1RGTjJfTUJPWDBfSU5GT19TSCkKLSNkZWZpbmUgX19MUFUxX0hPU1RGTjJfTUJPWDBfQ01EX1NUQVRVUyAweDAwMDAwMDAxCi0jZGVmaW5lIEhPU1RGTjNfTFBVMF9NQk9YMF9DTURfU1RBVAkweDAwMDE5MTYwCi0jZGVmaW5lIF9fSE9TVEZOM19MUFUwX01CT1gwX0lORk9fTUsJMHhmZmZmZmZmZQotI2RlZmluZSBfX0hPU1RGTjNfTFBVMF9NQk9YMF9JTkZPX1NICTEKLSNkZWZpbmUgX19IT1NURk4zX0xQVTBfTUJPWDBfSU5GTyhfdikJKChfdikgPDwgX19IT1NURk4zX0xQVTBfTUJPWDBfSU5GT19TSCkKLSNkZWZpbmUgX19IT1NURk4zX0xQVTBfTUJPWDBfQ01EX1NUQVRVUyAweDAwMDAwMDAxCi0jZGVmaW5lIEhPU1RGTjNfTFBVMV9NQk9YMF9DTURfU1RBVAkweDAwMDE5MTY0Ci0jZGVmaW5lIF9fSE9TVEZOM19MUFUxX01CT1gwX0lORk9fTUsJMHhmZmZmZmZmZQotI2RlZmluZSBfX0hPU1RGTjNfTFBVMV9NQk9YMF9JTkZPX1NICTEKLSNkZWZpbmUgX19IT1NURk4zX0xQVTFfTUJPWDBfSU5GTyhfdikJKChfdikgPDwgX19IT1NURk4zX0xQVTFfTUJPWDBfSU5GT19TSCkKLSNkZWZpbmUgX19IT1NURk4zX0xQVTFfTUJPWDBfQ01EX1NUQVRVUyAweDAwMDAwMDAxCi0jZGVmaW5lIExQVTBfSE9TVEZOM19NQk9YMF9DTURfU1RBVAkweDAwMDE5MTY4Ci0jZGVmaW5lIF9fTFBVMF9IT1NURk4zX01CT1gwX0lORk9fTUsJMHhmZmZmZmZmZQotI2RlZmluZSBfX0xQVTBfSE9TVEZOM19NQk9YMF9JTkZPX1NICTEKLSNkZWZpbmUgX19MUFUwX0hPU1RGTjNfTUJPWDBfSU5GTyhfdikJKChfdikgPDwgX19MUFUwX0hPU1RGTjNfTUJPWDBfSU5GT19TSCkKLSNkZWZpbmUgX19MUFUwX0hPU1RGTjNfTUJPWDBfQ01EX1NUQVRVUyAweDAwMDAwMDAxCi0jZGVmaW5lIExQVTFfSE9TVEZOM19NQk9YMF9DTURfU1RBVAkweDAwMDE5MTZjCi0jZGVmaW5lIF9fTFBVMV9IT1NURk4zX01CT1gwX0lORk9fTUsJMHhmZmZmZmZmZQotI2RlZmluZSBfX0xQVTFfSE9TVEZOM19NQk9YMF9JTkZPX1NICTEKLSNkZWZpbmUgX19MUFUxX0hPU1RGTjNfTUJPWDBfSU5GTyhfdikJKChfdikgPDwgX19MUFUxX0hPU1RGTjNfTUJPWDBfSU5GT19TSCkKLSNkZWZpbmUgX19MUFUxX0hPU1RGTjNfTUJPWDBfQ01EX1NUQVRVUwkweDAwMDAwMDAxCi0jZGVmaW5lIEZXX0lOSVRfSEFMVF9QMAkJCTB4MDAwMTkxYWMKLSNkZWZpbmUgX19GV19JTklUX0hBTFRfUAkJMHgwMDAwMDAwMQotI2RlZmluZSBGV19JTklUX0hBTFRfUDEJCQkweDAwMDE5MWJjCi0jZGVmaW5lIENQRV9QSV9QVFJfUTAJCQkweDAwMDM4MDAwCi0jZGVmaW5lIF9fQ1BFX1BJX1VOVVNFRF9NSwkJMHhmZmZmMDAwMAotI2RlZmluZSBfX0NQRV9QSV9VTlVTRURfU0gJCTE2Ci0jZGVmaW5lIF9fQ1BFX1BJX1VOVVNFRChfdikJCSgoX3YpIDw8IF9fQ1BFX1BJX1VOVVNFRF9TSCkKLSNkZWZpbmUgX19DUEVfUElfUFRSCQkJMHgwMDAwZmZmZgotI2RlZmluZSBDUEVfUElfUFRSX1ExCQkJMHgwMDAzODA0MAotI2RlZmluZSBDUEVfQ0lfUFRSX1EwCQkJMHgwMDAzODAwNAotI2RlZmluZSBfX0NQRV9DSV9VTlVTRURfTUsJCTB4ZmZmZjAwMDAKLSNkZWZpbmUgX19DUEVfQ0lfVU5VU0VEX1NICQkxNgotI2RlZmluZSBfX0NQRV9DSV9VTlVTRUQoX3YpCQkoKF92KSA8PCBfX0NQRV9DSV9VTlVTRURfU0gpCi0jZGVmaW5lIF9fQ1BFX0NJX1BUUgkJCTB4MDAwMGZmZmYKLSNkZWZpbmUgQ1BFX0NJX1BUUl9RMQkJCTB4MDAwMzgwNDQKLSNkZWZpbmUgQ1BFX0RFUFRIX1EwCQkJMHgwMDAzODAwOAotI2RlZmluZSBfX0NQRV9ERVBUSF9VTlVTRURfTUsJCTB4ZjgwMDAwMDAKLSNkZWZpbmUgX19DUEVfREVQVEhfVU5VU0VEX1NICQkyNwotI2RlZmluZSBfX0NQRV9ERVBUSF9VTlVTRUQoX3YpCQkoKF92KSA8PCBfX0NQRV9ERVBUSF9VTlVTRURfU0gpCi0jZGVmaW5lIF9fQ1BFX01TSVhfVkVDX0lOREVYX01LCQkweDA3ZmYwMDAwCi0jZGVmaW5lIF9fQ1BFX01TSVhfVkVDX0lOREVYX1NICQkxNgotI2RlZmluZSBfX0NQRV9NU0lYX1ZFQ19JTkRFWChfdikJKChfdikgPDwgX19DUEVfTVNJWF9WRUNfSU5ERVhfU0gpCi0jZGVmaW5lIF9fQ1BFX0RFUFRICQkJMHgwMDAwZmZmZgotI2RlZmluZSBDUEVfREVQVEhfUTEJCQkweDAwMDM4MDQ4Ci0jZGVmaW5lIENQRV9RQ1RSTF9RMAkJCTB4MDAwMzgwMGMKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQzMF9NSwkJMHhmYzAwMDAwMAotI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDMwX1NICQkyNgotI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDMwKF92KQkJKChfdikgPDwgX19DUEVfQ1RSTF9VTlVTRUQzMF9TSCkKLSNkZWZpbmUgX19DUEVfRlVOQ19JTlRfQ1RSTF9NSwkJMHgwMzAwMDAwMAotI2RlZmluZSBfX0NQRV9GVU5DX0lOVF9DVFJMX1NICQkyNAotI2RlZmluZSBfX0NQRV9GVU5DX0lOVF9DVFJMKF92KQkJKChfdikgPDwgX19DUEVfRlVOQ19JTlRfQ1RSTF9TSCkKLWVudW0gewotCV9fQ1BFX0ZVTkNfSU5UX0NUUkxfRElTQUJMRQkJPSAweDAsCi0JX19DUEVfRlVOQ19JTlRfQ1RSTF9GMk5GCQk9IDB4MSwKLQlfX0NQRV9GVU5DX0lOVF9DVFJMXzNRVUFSVAkJPSAweDIsCi0JX19DUEVfRlVOQ19JTlRfQ1RSTF9IQUxGCQk9IDB4MywKLX07Ci0jZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMjBfTUsJCTB4MDBmMDAwMDAKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQyMF9TSAkJMjAKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQyMChfdikJCSgoX3YpIDw8IF9fQ1BFX0NUUkxfVU5VU0VEMjBfU0gpCi0jZGVmaW5lIF9fQ1BFX1NDSV9USF9NSwkJCTB4MDAwZjAwMDAKLSNkZWZpbmUgX19DUEVfU0NJX1RIX1NICQkJMTYKLSNkZWZpbmUgX19DUEVfU0NJX1RIKF92KQkJKChfdikgPDwgX19DUEVfU0NJX1RIX1NIKQotI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDEwX01LCQkweDAwMDBjMDAwCi0jZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMTBfU0gJCTE0Ci0jZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMTAoX3YpCQkoKF92KSA8PCBfX0NQRV9DVFJMX1VOVVNFRDEwX1NIKQotI2RlZmluZSBfX0NQRV9BQ0tfUEVORElORwkJMHgwMDAwMjAwMAotI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDQwX01LCQkweDAwMDAxYzAwCi0jZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VENDBfU0gJCTEwCi0jZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VENDAoX3YpCQkoKF92KSA8PCBfX0NQRV9DVFJMX1VOVVNFRDQwX1NIKQotI2RlZmluZSBfX0NQRV9QQ0lFSURfTUsJCQkweDAwMDAwMzAwCi0jZGVmaW5lIF9fQ1BFX1BDSUVJRF9TSAkJCTgKLSNkZWZpbmUgX19DUEVfUENJRUlEKF92KQkJKChfdikgPDwgX19DUEVfUENJRUlEX1NIKQotI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDAwX01LCQkweDAwMDAwMGZlCi0jZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMDBfU0gJCTEKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQwMChfdikJCSgoX3YpIDw8IF9fQ1BFX0NUUkxfVU5VU0VEMDBfU0gpCi0jZGVmaW5lIF9fQ1BFX0VTSVpFCQkJMHgwMDAwMDAwMQotI2RlZmluZSBDUEVfUUNUUkxfUTEJCQkweDAwMDM4MDRjCi0jZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMzFfTUsJCTB4ZmMwMDAwMDAKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQzMV9TSAkJMjYKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQzMShfdikJCSgoX3YpIDw8IF9fQ1BFX0NUUkxfVU5VU0VEMzFfU0gpCi0jZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMjFfTUsJCTB4MDBmMDAwMDAKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQyMV9TSAkJMjAKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQyMShfdikJCSgoX3YpIDw8IF9fQ1BFX0NUUkxfVU5VU0VEMjFfU0gpCi0jZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMTFfTUsJCTB4MDAwMGMwMDAKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQxMV9TSAkJMTQKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQxMShfdikJCSgoX3YpIDw8IF9fQ1BFX0NUUkxfVU5VU0VEMTFfU0gpCi0jZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VENDFfTUsJCTB4MDAwMDFjMDAKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQ0MV9TSAkJMTAKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQ0MShfdikJCSgoX3YpIDw8IF9fQ1BFX0NUUkxfVU5VU0VENDFfU0gpCi0jZGVmaW5lIF9fQ1BFX0NUUkxfVU5VU0VEMDFfTUsJCTB4MDAwMDAwZmUKLSNkZWZpbmUgX19DUEVfQ1RSTF9VTlVTRUQwMV9TSAkJMQotI2RlZmluZSBfX0NQRV9DVFJMX1VOVVNFRDAxKF92KQkJKChfdikgPDwgX19DUEVfQ1RSTF9VTlVTRUQwMV9TSCkKLSNkZWZpbmUgUk1FX1BJX1BUUl9RMAkJCTB4MDAwMzgwMjAKLSNkZWZpbmUgX19MQVRFTkNZX1RJTUVfU1RBTVBfTUsJCTB4ZmZmZjAwMDAKLSNkZWZpbmUgX19MQVRFTkNZX1RJTUVfU1RBTVBfU0gJCTE2Ci0jZGVmaW5lIF9fTEFURU5DWV9USU1FX1NUQU1QKF92KQkoKF92KSA8PCBfX0xBVEVOQ1lfVElNRV9TVEFNUF9TSCkKLSNkZWZpbmUgX19STUVfUElfUFRSCQkJMHgwMDAwZmZmZgotI2RlZmluZSBSTUVfUElfUFRSX1ExCQkJMHgwMDAzODA2MAotI2RlZmluZSBSTUVfQ0lfUFRSX1EwCQkJMHgwMDAzODAyNAotI2RlZmluZSBfX0RFTEFZX1RJTUVfU1RBTVBfTUsJCTB4ZmZmZjAwMDAKLSNkZWZpbmUgX19ERUxBWV9USU1FX1NUQU1QX1NICQkxNgotI2RlZmluZSBfX0RFTEFZX1RJTUVfU1RBTVAoX3YpCQkoKF92KSA8PCBfX0RFTEFZX1RJTUVfU1RBTVBfU0gpCi0jZGVmaW5lIF9fUk1FX0NJX1BUUgkJCTB4MDAwMGZmZmYKLSNkZWZpbmUgUk1FX0NJX1BUUl9RMQkJCTB4MDAwMzgwNjQKLSNkZWZpbmUgUk1FX0RFUFRIX1EwCQkJMHgwMDAzODAyOAotI2RlZmluZSBfX1JNRV9ERVBUSF9VTlVTRURfTUsJCTB4ZjgwMDAwMDAKLSNkZWZpbmUgX19STUVfREVQVEhfVU5VU0VEX1NICQkyNwotI2RlZmluZSBfX1JNRV9ERVBUSF9VTlVTRUQoX3YpCQkoKF92KSA8PCBfX1JNRV9ERVBUSF9VTlVTRURfU0gpCi0jZGVmaW5lIF9fUk1FX01TSVhfVkVDX0lOREVYX01LCQkweDA3ZmYwMDAwCi0jZGVmaW5lIF9fUk1FX01TSVhfVkVDX0lOREVYX1NICQkxNgotI2RlZmluZSBfX1JNRV9NU0lYX1ZFQ19JTkRFWChfdikJKChfdikgPDwgX19STUVfTVNJWF9WRUNfSU5ERVhfU0gpCi0jZGVmaW5lIF9fUk1FX0RFUFRICQkJMHgwMDAwZmZmZgotI2RlZmluZSBSTUVfREVQVEhfUTEJCQkweDAwMDM4MDY4Ci0jZGVmaW5lIFJNRV9RQ1RSTF9RMAkJCTB4MDAwMzgwMmMKLSNkZWZpbmUgX19STUVfSU5UX0xBVEVOQ1lfVElNRVJfTUsJMHhmZjAwMDAwMAotI2RlZmluZSBfX1JNRV9JTlRfTEFURU5DWV9USU1FUl9TSAkyNAotI2RlZmluZSBfX1JNRV9JTlRfTEFURU5DWV9USU1FUihfdikJKChfdikgPDwgX19STUVfSU5UX0xBVEVOQ1lfVElNRVJfU0gpCi0jZGVmaW5lIF9fUk1FX0lOVF9ERUxBWV9USU1FUl9NSwkweDAwZmYwMDAwCi0jZGVmaW5lIF9fUk1FX0lOVF9ERUxBWV9USU1FUl9TSAkxNgotI2RlZmluZSBfX1JNRV9JTlRfREVMQVlfVElNRVIoX3YpCSgoX3YpIDw8IF9fUk1FX0lOVF9ERUxBWV9USU1FUl9TSCkKLSNkZWZpbmUgX19STUVfSU5UX0RFTEFZX0RJU0FCTEUJCTB4MDAwMDgwMDAKLSNkZWZpbmUgX19STUVfRExZX0RFTEFZX0RJU0FCTEUJCTB4MDAwMDQwMDAKLSNkZWZpbmUgX19STUVfQUNLX1BFTkRJTkcJCTB4MDAwMDIwMDAKLSNkZWZpbmUgX19STUVfRlVMTF9JTlRFUlJVUFRfRElTQUJMRQkweDAwMDAxMDAwCi0jZGVmaW5lIF9fUk1FX0NUUkxfVU5VU0VEMTBfTUsJCTB4MDAwMDBjMDAKLSNkZWZpbmUgX19STUVfQ1RSTF9VTlVTRUQxMF9TSAkJMTAKLSNkZWZpbmUgX19STUVfQ1RSTF9VTlVTRUQxMChfdikJCSgoX3YpIDw8IF9fUk1FX0NUUkxfVU5VU0VEMTBfU0gpCi0jZGVmaW5lIF9fUk1FX1BDSUVJRF9NSwkJCTB4MDAwMDAzMDAKLSNkZWZpbmUgX19STUVfUENJRUlEX1NICQkJOAotI2RlZmluZSBfX1JNRV9QQ0lFSUQoX3YpCQkoKF92KSA8PCBfX1JNRV9QQ0lFSURfU0gpCi0jZGVmaW5lIF9fUk1FX0NUUkxfVU5VU0VEMDBfTUsJCTB4MDAwMDAwZmUKLSNkZWZpbmUgX19STUVfQ1RSTF9VTlVTRUQwMF9TSAkJMQotI2RlZmluZSBfX1JNRV9DVFJMX1VOVVNFRDAwKF92KQkJKChfdikgPDwgX19STUVfQ1RSTF9VTlVTRUQwMF9TSCkKLSNkZWZpbmUgX19STUVfRVNJWkUJCQkweDAwMDAwMDAxCi0jZGVmaW5lIFJNRV9RQ1RSTF9RMQkJCTB4MDAwMzgwNmMKLSNkZWZpbmUgX19STUVfQ1RSTF9VTlVTRUQxMV9NSwkJMHgwMDAwMGMwMAotI2RlZmluZSBfX1JNRV9DVFJMX1VOVVNFRDExX1NICQkxMAotI2RlZmluZSBfX1JNRV9DVFJMX1VOVVNFRDExKF92KQkJKChfdikgPDwgX19STUVfQ1RSTF9VTlVTRUQxMV9TSCkKLSNkZWZpbmUgX19STUVfQ1RSTF9VTlVTRUQwMV9NSwkJMHgwMDAwMDBmZQotI2RlZmluZSBfX1JNRV9DVFJMX1VOVVNFRDAxX1NICQkxCi0jZGVmaW5lIF9fUk1FX0NUUkxfVU5VU0VEMDEoX3YpCQkoKF92KSA8PCBfX1JNRV9DVFJMX1VOVVNFRDAxX1NIKQotI2RlZmluZSBQU1NfQ1RMX1JFRwkJCTB4MDAwMTg4MDAKLSNkZWZpbmUgX19QU1NfSTJDX0NMS19ESVZfTUsJCTB4MDA3ZjAwMDAKLSNkZWZpbmUgX19QU1NfSTJDX0NMS19ESVZfU0gJCTE2Ci0jZGVmaW5lIF9fUFNTX0kyQ19DTEtfRElWKF92KQkJKChfdikgPDwgX19QU1NfSTJDX0NMS19ESVZfU0gpCi0jZGVmaW5lIF9fUFNTX0xNRU1fSU5JVF9ET05FCQkweDAwMDAxMDAwCi0jZGVmaW5lIF9fUFNTX0xNRU1fUkVTRVQJCTB4MDAwMDAyMDAKLSNkZWZpbmUgX19QU1NfTE1FTV9JTklUX0VOCQkweDAwMDAwMTAwCi0jZGVmaW5lIF9fUFNTX0xQVTFfUkVTRVQJCTB4MDAwMDAwMDIKLSNkZWZpbmUgX19QU1NfTFBVMF9SRVNFVAkJMHgwMDAwMDAwMQotI2RlZmluZSBQU1NfRVJSX1NUQVRVU19SRUcJCTB4MDAwMTg4MTAKLSNkZWZpbmUgX19QU1NfTFBVMV9UQ01fUkVBRF9FUlIJCTB4MDAyMDAwMDAKLSNkZWZpbmUgX19QU1NfTFBVMF9UQ01fUkVBRF9FUlIJCTB4MDAxMDAwMDAKLSNkZWZpbmUgX19QU1NfTE1FTTVfQ09SUl9FUlIJCTB4MDAwODAwMDAKLSNkZWZpbmUgX19QU1NfTE1FTTRfQ09SUl9FUlIJCTB4MDAwNDAwMDAKLSNkZWZpbmUgX19QU1NfTE1FTTNfQ09SUl9FUlIJCTB4MDAwMjAwMDAKLSNkZWZpbmUgX19QU1NfTE1FTTJfQ09SUl9FUlIJCTB4MDAwMTAwMDAKLSNkZWZpbmUgX19QU1NfTE1FTTFfQ09SUl9FUlIJCTB4MDAwMDgwMDAKLSNkZWZpbmUgX19QU1NfTE1FTTBfQ09SUl9FUlIJCTB4MDAwMDQwMDAKLSNkZWZpbmUgX19QU1NfTE1FTTVfVU5DT1JSX0VSUgkJMHgwMDAwMjAwMAotI2RlZmluZSBfX1BTU19MTUVNNF9VTkNPUlJfRVJSCQkweDAwMDAxMDAwCi0jZGVmaW5lIF9fUFNTX0xNRU0zX1VOQ09SUl9FUlIJCTB4MDAwMDA4MDAKLSNkZWZpbmUgX19QU1NfTE1FTTJfVU5DT1JSX0VSUgkJMHgwMDAwMDQwMAotI2RlZmluZSBfX1BTU19MTUVNMV9VTkNPUlJfRVJSCQkweDAwMDAwMjAwCi0jZGVmaW5lIF9fUFNTX0xNRU0wX1VOQ09SUl9FUlIJCTB4MDAwMDAxMDAKLSNkZWZpbmUgX19QU1NfQkFMX1BFUlIJCQkweDAwMDAwMDgwCi0jZGVmaW5lIF9fUFNTX0RJUF9JRl9FUlIJCTB4MDAwMDAwNDAKLSNkZWZpbmUgX19QU1NfSU9IX0lGX0VSUgkJMHgwMDAwMDAyMAotI2RlZmluZSBfX1BTU19URFNfSUZfRVJSCQkweDAwMDAwMDEwCi0jZGVmaW5lIF9fUFNTX1JEU19JRl9FUlIJCTB4MDAwMDAwMDgKLSNkZWZpbmUgX19QU1NfU0dNX0lGX0VSUgkJMHgwMDAwMDAwNAotI2RlZmluZSBfX1BTU19MUFUxX1JBTV9FUlIJCTB4MDAwMDAwMDIKLSNkZWZpbmUgX19QU1NfTFBVMF9SQU1fRVJSCQkweDAwMDAwMDAxCi0jZGVmaW5lIEVSUl9TRVRfUkVHCQkJMHgwMDAxODgxOAotI2RlZmluZSBfX1BTU19FUlJfU1RBVFVTX1NFVAkJMHgwMDNmZmZmZgotI2RlZmluZSBQTU1fMVRfUkVTRVRfUkVHX1AwCQkweDAwMDIzODFjCi0jZGVmaW5lIF9fUE1NXzFUX1JFU0VUX1AJCTB4MDAwMDAwMDEKLSNkZWZpbmUgUE1NXzFUX1JFU0VUX1JFR19QMQkJMHgwMDAyM2MxYwotI2RlZmluZSBIUU1fUVNFVDBfUlhRX0RSQkxfUDAJCTB4MDAwMzgwMDAKLSNkZWZpbmUgX19SWFEwX0FERF9WRUNUT1JTX1AJCTB4ODAwMDAwMDAKLSNkZWZpbmUgX19SWFEwX1NUT1BfUAkJCTB4NDAwMDAwMDAKLSNkZWZpbmUgX19SWFEwX1BSRF9QVFJfUAkJMHgwMDAwZmZmZgotI2RlZmluZSBIUU1fUVNFVDFfUlhRX0RSQkxfUDAJCTB4MDAwMzgwODAKLSNkZWZpbmUgX19SWFExX0FERF9WRUNUT1JTX1AJCTB4ODAwMDAwMDAKLSNkZWZpbmUgX19SWFExX1NUT1BfUAkJCTB4NDAwMDAwMDAKLSNkZWZpbmUgX19SWFExX1BSRF9QVFJfUAkJMHgwMDAwZmZmZgotI2RlZmluZSBIUU1fUVNFVDBfUlhRX0RSQkxfUDEJCTB4MDAwM2MwMDAKLSNkZWZpbmUgSFFNX1FTRVQxX1JYUV9EUkJMX1AxCQkweDAwMDNjMDgwCi0jZGVmaW5lIEhRTV9RU0VUMF9UWFFfRFJCTF9QMAkJMHgwMDAzODAyMAotI2RlZmluZSBfX1RYUTBfQUREX1ZFQ1RPUlNfUAkJMHg4MDAwMDAwMAotI2RlZmluZSBfX1RYUTBfU1RPUF9QCQkJMHg0MDAwMDAwMAotI2RlZmluZSBfX1RYUTBfUFJEX1BUUl9QCQkweDAwMDBmZmZmCi0jZGVmaW5lIEhRTV9RU0VUMV9UWFFfRFJCTF9QMAkJMHgwMDAzODBhMAotI2RlZmluZSBfX1RYUTFfQUREX1ZFQ1RPUlNfUAkJMHg4MDAwMDAwMAotI2RlZmluZSBfX1RYUTFfU1RPUF9QCQkJMHg0MDAwMDAwMAotI2RlZmluZSBfX1RYUTFfUFJEX1BUUl9QCQkweDAwMDBmZmZmCi0jZGVmaW5lIEhRTV9RU0VUMF9UWFFfRFJCTF9QMQkJMHgwMDAzYzAyMAotI2RlZmluZSBIUU1fUVNFVDFfVFhRX0RSQkxfUDEJCTB4MDAwM2MwYTAKLSNkZWZpbmUgSFFNX1FTRVQwX0lCX0RSQkxfMV9QMAkJMHgwMDAzODA0MAotI2RlZmluZSBfX0lCMV8wX0FDS19QCQkJMHg4MDAwMDAwMAotI2RlZmluZSBfX0lCMV8wX0RJU0FCTEVfUAkJMHg0MDAwMDAwMAotI2RlZmluZSBfX0lCMV8wX0NPQUxFU0NJTkdfQ0ZHX1BfTUsJMHgwMGZmMDAwMAotI2RlZmluZSBfX0lCMV8wX0NPQUxFU0NJTkdfQ0ZHX1BfU0gJMTYKLSNkZWZpbmUgX19JQjFfMF9DT0FMRVNDSU5HX0NGR19QKF92KQkoKF92KSA8PCBfX0lCMV8wX0NPQUxFU0NJTkdfQ0ZHX1BfU0gpCi0jZGVmaW5lIF9fSUIxXzBfTlVNX09GX0FDS0VEX0VWRU5UU19QCTB4MDAwMGZmZmYKLSNkZWZpbmUgSFFNX1FTRVQxX0lCX0RSQkxfMV9QMAkJMHgwMDAzODBjMAotI2RlZmluZSBfX0lCMV8xX0FDS19QCQkJMHg4MDAwMDAwMAotI2RlZmluZSBfX0lCMV8xX0RJU0FCTEVfUAkJMHg0MDAwMDAwMAotI2RlZmluZSBfX0lCMV8xX0NPQUxFU0NJTkdfQ0ZHX1BfTUsJMHgwMGZmMDAwMAotI2RlZmluZSBfX0lCMV8xX0NPQUxFU0NJTkdfQ0ZHX1BfU0gJMTYKLSNkZWZpbmUgX19JQjFfMV9DT0FMRVNDSU5HX0NGR19QKF92KQkoKF92KSA8PCBfX0lCMV8xX0NPQUxFU0NJTkdfQ0ZHX1BfU0gpCi0jZGVmaW5lIF9fSUIxXzFfTlVNX09GX0FDS0VEX0VWRU5UU19QCTB4MDAwMGZmZmYKLSNkZWZpbmUgSFFNX1FTRVQwX0lCX0RSQkxfMV9QMQkJMHgwMDAzYzA0MAotI2RlZmluZSBIUU1fUVNFVDFfSUJfRFJCTF8xX1AxCQkweDAwMDNjMGMwCi0jZGVmaW5lIEhRTV9RU0VUMF9JQl9EUkJMXzJfUDAJCTB4MDAwMzgwNjAKLSNkZWZpbmUgX19JQjJfMF9BQ0tfUAkJCTB4ODAwMDAwMDAKLSNkZWZpbmUgX19JQjJfMF9ESVNBQkxFX1AJCTB4NDAwMDAwMDAKLSNkZWZpbmUgX19JQjJfMF9DT0FMRVNDSU5HX0NGR19QX01LCTB4MDBmZjAwMDAKLSNkZWZpbmUgX19JQjJfMF9DT0FMRVNDSU5HX0NGR19QX1NICTE2Ci0jZGVmaW5lIF9fSUIyXzBfQ09BTEVTQ0lOR19DRkdfUChfdikJKChfdikgPDwgX19JQjJfMF9DT0FMRVNDSU5HX0NGR19QX1NIKQotI2RlZmluZSBfX0lCMl8wX05VTV9PRl9BQ0tFRF9FVkVOVFNfUAkweDAwMDBmZmZmCi0jZGVmaW5lIEhRTV9RU0VUMV9JQl9EUkJMXzJfUDAJCTB4MDAwMzgwZTAKLSNkZWZpbmUgX19JQjJfMV9BQ0tfUAkJCTB4ODAwMDAwMDAKLSNkZWZpbmUgX19JQjJfMV9ESVNBQkxFX1AJCTB4NDAwMDAwMDAKLSNkZWZpbmUgX19JQjJfMV9DT0FMRVNDSU5HX0NGR19QX01LCTB4MDBmZjAwMDAKLSNkZWZpbmUgX19JQjJfMV9DT0FMRVNDSU5HX0NGR19QX1NICTE2Ci0jZGVmaW5lIF9fSUIyXzFfQ09BTEVTQ0lOR19DRkdfUChfdikJKChfdikgPDwgX19JQjJfMV9DT0FMRVNDSU5HX0NGR19QX1NIKQotI2RlZmluZSBfX0lCMl8xX05VTV9PRl9BQ0tFRF9FVkVOVFNfUAkweDAwMDBmZmZmCi0jZGVmaW5lIEhRTV9RU0VUMF9JQl9EUkJMXzJfUDEJCTB4MDAwM2MwNjAKLSNkZWZpbmUgSFFNX1FTRVQxX0lCX0RSQkxfMl9QMQkJMHgwMDAzYzBlMAotCi0KLS8qCi0gKiBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZWl0aGVyIGluIGVycm9yL21pc3NpbmcgaW4gc3BlYy4gSXRzIGF1dG8tZ2VuZXJhdGVkCi0gKiBmcm9tIGhhcmQgY29kZWQgdmFsdWVzIGluIHJlZ3BhcnNlLnBsLgotICovCi0jZGVmaW5lIF9fRU1QSFBPU1RfQVRfNEdfTUtfRklYCQkweDAwMDAwMDFjCi0jZGVmaW5lIF9fRU1QSFBPU1RfQVRfNEdfU0hfRklYCQkweDAwMDAwMDAyCi0jZGVmaW5lIF9fRU1QSFBSRV9BVF80R19GSVgJCTB4MDAwMDAwMDMKLSNkZWZpbmUgX19TRlBfVFhSQVRFX0VOX0ZJWAkJMHgwMDAwMDEwMAotI2RlZmluZSBfX1NGUF9SWFJBVEVfRU5fRklYCQkweDAwMDAwMDgwCi0KLQotLyoKLSAqIFRoZXNlIHJlZ2lzdGVyIGRlZmluaXRpb25zIGFyZSBhdXRvLWdlbmVyYXRlZCBmcm9tIGhhcmQgY29kZWQgdmFsdWVzCi0gKiBpbiByZWdwYXJzZS5wbC4KLSAqLwotCi0KLS8qCi0gKiBUaGVzZSByZWdpc3RlciBtYXBwaW5nIGRlZmluaXRpb25zIGFyZSBhdXRvLWdlbmVyYXRlZCBmcm9tIG1hcHBpbmcgdGFibGVzCi0gKiBpbiByZWdwYXJzZS5wbC4KLSAqLwotI2RlZmluZSBCRkFfSU9DMF9IQkVBVF9SRUcJCUhPU1RfU0VNMF9JTkZPX1JFRwotI2RlZmluZSBCRkFfSU9DMF9TVEFURV9SRUcJCUhPU1RfU0VNMV9JTkZPX1JFRwotI2RlZmluZSBCRkFfSU9DMV9IQkVBVF9SRUcJCUhPU1RfU0VNMl9JTkZPX1JFRwotI2RlZmluZSBCRkFfSU9DMV9TVEFURV9SRUcJCUhPU1RfU0VNM19JTkZPX1JFRwotI2RlZmluZSBCRkFfRldfVVNFX0NPVU5UCQkgSE9TVF9TRU00X0lORk9fUkVHCi0jZGVmaW5lIEJGQV9JT0NfRkFJTF9TWU5DCQlIT1NUX1NFTTVfSU5GT19SRUcKLQotI2RlZmluZSBDUEVfREVQVEhfUShfX24pIFwKLQkoQ1BFX0RFUFRIX1EwICsgKF9fbikgKiAoQ1BFX0RFUFRIX1ExIC0gQ1BFX0RFUFRIX1EwKSkKLSNkZWZpbmUgQ1BFX1FDVFJMX1EoX19uKSBcCi0JKENQRV9RQ1RSTF9RMCArIChfX24pICogKENQRV9RQ1RSTF9RMSAtIENQRV9RQ1RSTF9RMCkpCi0jZGVmaW5lIENQRV9QSV9QVFJfUShfX24pIFwKLQkoQ1BFX1BJX1BUUl9RMCArIChfX24pICogKENQRV9QSV9QVFJfUTEgLSBDUEVfUElfUFRSX1EwKSkKLSNkZWZpbmUgQ1BFX0NJX1BUUl9RKF9fbikgXAotCShDUEVfQ0lfUFRSX1EwICsgKF9fbikgKiAoQ1BFX0NJX1BUUl9RMSAtIENQRV9DSV9QVFJfUTApKQotI2RlZmluZSBSTUVfREVQVEhfUShfX24pIFwKLQkoUk1FX0RFUFRIX1EwICsgKF9fbikgKiAoUk1FX0RFUFRIX1ExIC0gUk1FX0RFUFRIX1EwKSkKLSNkZWZpbmUgUk1FX1FDVFJMX1EoX19uKSBcCi0JKFJNRV9RQ1RSTF9RMCArIChfX24pICogKFJNRV9RQ1RSTF9RMSAtIFJNRV9RQ1RSTF9RMCkpCi0jZGVmaW5lIFJNRV9QSV9QVFJfUShfX24pIFwKLQkoUk1FX1BJX1BUUl9RMCArIChfX24pICogKFJNRV9QSV9QVFJfUTEgLSBSTUVfUElfUFRSX1EwKSkKLSNkZWZpbmUgUk1FX0NJX1BUUl9RKF9fbikgXAotCShSTUVfQ0lfUFRSX1EwICsgKF9fbikgKiAoUk1FX0NJX1BUUl9RMSAtIFJNRV9DSV9QVFJfUTApKQotI2RlZmluZSBIUU1fUVNFVF9SWFFfRFJCTF9QMChfX24pIFwKLQkoSFFNX1FTRVQwX1JYUV9EUkJMX1AwICsgKF9fbikgKglcCi0JKEhRTV9RU0VUMV9SWFFfRFJCTF9QMCAtIEhRTV9RU0VUMF9SWFFfRFJCTF9QMCkpCi0jZGVmaW5lIEhRTV9RU0VUX1RYUV9EUkJMX1AwKF9fbikgXAotCShIUU1fUVNFVDBfVFhRX0RSQkxfUDAgKyAoX19uKSAqCVwKLQkoSFFNX1FTRVQxX1RYUV9EUkJMX1AwIC0gSFFNX1FTRVQwX1RYUV9EUkJMX1AwKSkKLSNkZWZpbmUgSFFNX1FTRVRfSUJfRFJCTF8xX1AwKF9fbikgXAotCShIUU1fUVNFVDBfSUJfRFJCTF8xX1AwICsgKF9fbikgKglcCi0JKEhRTV9RU0VUMV9JQl9EUkJMXzFfUDAgLSBIUU1fUVNFVDBfSUJfRFJCTF8xX1AwKSkKLSNkZWZpbmUgSFFNX1FTRVRfSUJfRFJCTF8yX1AwKF9fbikgXAotCShIUU1fUVNFVDBfSUJfRFJCTF8yX1AwICsgKF9fbikgKglcCi0JKEhRTV9RU0VUMV9JQl9EUkJMXzJfUDAgLSBIUU1fUVNFVDBfSUJfRFJCTF8yX1AwKSkKLSNkZWZpbmUgSFFNX1FTRVRfUlhRX0RSQkxfUDEoX19uKSBcCi0JKEhRTV9RU0VUMF9SWFFfRFJCTF9QMSArIChfX24pICoJXAotCShIUU1fUVNFVDFfUlhRX0RSQkxfUDEgLSBIUU1fUVNFVDBfUlhRX0RSQkxfUDEpKQotI2RlZmluZSBIUU1fUVNFVF9UWFFfRFJCTF9QMShfX24pIFwKLQkoSFFNX1FTRVQwX1RYUV9EUkJMX1AxICsgKF9fbikgKglcCi0JKEhRTV9RU0VUMV9UWFFfRFJCTF9QMSAtIEhRTV9RU0VUMF9UWFFfRFJCTF9QMSkpCi0jZGVmaW5lIEhRTV9RU0VUX0lCX0RSQkxfMV9QMShfX24pIFwKLQkoSFFNX1FTRVQwX0lCX0RSQkxfMV9QMSArIChfX24pICoJXAotCShIUU1fUVNFVDFfSUJfRFJCTF8xX1AxIC0gSFFNX1FTRVQwX0lCX0RSQkxfMV9QMSkpCi0jZGVmaW5lIEhRTV9RU0VUX0lCX0RSQkxfMl9QMShfX24pIFwKLQkoSFFNX1FTRVQwX0lCX0RSQkxfMl9QMSArIChfX24pICoJXAotCShIUU1fUVNFVDFfSUJfRFJCTF8yX1AxIC0gSFFNX1FTRVQwX0lCX0RSQkxfMl9QMSkpCi0KLSNkZWZpbmUgQ1BFX1FfTlVNKF9fZm4sIF9fcSkgKCgoX19mbikgPDwgMikgKyAoX19xKSkKLSNkZWZpbmUgUk1FX1FfTlVNKF9fZm4sIF9fcSkgKCgoX19mbikgPDwgMikgKyAoX19xKSkKLSNkZWZpbmUgQ1BFX1FfTUFTSyhfX3EpICgoX19xKSAmIDB4MykKLSNkZWZpbmUgUk1FX1FfTUFTSyhfX3EpICgoX19xKSAmIDB4MykKLQotCi0vKgotICogUENJIE1TSS1YIHZlY3RvciBkZWZpbmVzCi0gKi8KLWVudW0gewotCUJGQV9NU0lYX0NQRV9RMCA9IDAsCi0JQkZBX01TSVhfQ1BFX1ExID0gMSwKLQlCRkFfTVNJWF9DUEVfUTIgPSAyLAotCUJGQV9NU0lYX0NQRV9RMyA9IDMsCi0JQkZBX01TSVhfUk1FX1EwID0gNCwKLQlCRkFfTVNJWF9STUVfUTEgPSA1LAotCUJGQV9NU0lYX1JNRV9RMiA9IDYsCi0JQkZBX01TSVhfUk1FX1EzID0gNywKLQlCRkFfTVNJWF9MUFVfRVJSID0gOCwKLQlCRkFfTVNJWF9DVF9NQVggPSA5LAotfTsKLQotLyoKLSAqIEFuZCBjb3JyZXNwb25kaW5nIGhvc3QgaW50ZXJydXB0IHN0YXR1cyBiaXQgZmllbGQgZGVmaW5lcwotICovCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTAJCTB4MDAwMDAwMDFVCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTEJCTB4MDAwMDAwMDJVCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTIJCTB4MDAwMDAwMDRVCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTMJCTB4MDAwMDAwMDhVCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTQJCTB4MDAwMDAwMTBVCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTUJCTB4MDAwMDAwMjBVCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTYJCTB4MDAwMDAwNDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTcJCTB4MDAwMDAwODBVCi0jZGVmaW5lIF9fSEZOX0lOVF9STUVfUTAJCTB4MDAwMDAxMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9STUVfUTEJCTB4MDAwMDAyMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9STUVfUTIJCTB4MDAwMDA0MDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9STUVfUTMJCTB4MDAwMDA4MDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9STUVfUTQJCTB4MDAwMDEwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9STUVfUTUJCTB4MDAwMDIwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9STUVfUTYJCTB4MDAwMDQwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9STUVfUTcJCTB4MDAwMDgwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9FUlJfRU1DCQkweDAwMDEwMDAwVQotI2RlZmluZSBfX0hGTl9JTlRfRVJSX0xQVTAJCTB4MDAwMjAwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9FUlJfTFBVMQkJMHgwMDA0MDAwMFUKLSNkZWZpbmUgX19IRk5fSU5UX0VSUl9QU1MJCTB4MDAwODAwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9NQk9YX0xQVTAJCTB4MDAxMDAwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9NQk9YX0xQVTEJCTB4MDAyMDAwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9NQk9YMV9MUFUwCQkweDAwNDAwMDAwVQotI2RlZmluZSBfX0hGTl9JTlRfTUJPWDFfTFBVMQkJMHgwMDgwMDAwMFUKLSNkZWZpbmUgX19IRk5fSU5UX0xMX0hBTFQJCTB4MDEwMDAwMDBVCi0jZGVmaW5lIF9fSEZOX0lOVF9DUEVfTUFTSwkJMHgwMDAwMDBmZlUKLSNkZWZpbmUgX19IRk5fSU5UX1JNRV9NQVNLCQkweDAwMDBmZjAwVQotCi0KLS8qCi0gKiBjYXRhcHVsdCBtZW1vcnkgbWFwLgotICovCi0jZGVmaW5lIExMX1BHTl9IUU0wCQkweDAwOTYKLSNkZWZpbmUgTExfUEdOX0hRTTEJCTB4MDA5NwotI2RlZmluZSBQU1NfU01FTV9QQUdFX1NUQVJUCTB4ODAwMAotI2RlZmluZSBQU1NfU01FTV9QR05VTShfcGcwLCBfbWEpCSgoX3BnMCkgKyAoKF9tYSkgPj4gMTUpKQotI2RlZmluZSBQU1NfU01FTV9QR09GRihfbWEpCSgoX21hKSAmIDB4N2ZmZikKLQotLyoKLSAqIEVuZCBvZiBjYXRhcHVsdCBtZW1vcnkgbWFwCi0gKi8KLQotCi0jZW5kaWYgLyogX19CRklfQ1RSRUdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmaV9tcy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmlfbXMuaAppbmRleCAxOWU4ODhhLi4wZDlmMWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmaV9tcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZpX21zLmgKQEAgLTI4LDExICsyOCwxNyBAQAogCUJGSV9JT0NGQ19IMklfQ0ZHX1JFUQkJPSAxLAogCUJGSV9JT0NGQ19IMklfU0VUX0lOVFJfUkVRCT0gMiwKIAlCRklfSU9DRkNfSDJJX1VQREFURVFfUkVRCT0gMywKKwlCRklfSU9DRkNfSDJJX0ZBQV9FTkFCTEVfUkVRCT0gNCwKKwlCRklfSU9DRkNfSDJJX0ZBQV9ESVNBQkxFX1JFUQk9IDUsCisJQkZJX0lPQ0ZDX0gySV9GQUFfUVVFUllfUkVRCT0gNiwKIH07CiAKIGVudW0gYmZpX2lvY2ZjX2kyaF9tc2dzIHsKIAlCRklfSU9DRkNfSTJIX0NGR19SRVBMWQkJPSBCRkFfSTJITSgxKSwKIAlCRklfSU9DRkNfSTJIX1VQREFURVFfUlNQCT0gQkZBX0kySE0oMyksCisJQkZJX0lPQ0ZDX0kySF9GQUFfRU5BQkxFX1JTUAk9IEJGQV9JMkhNKDQpLAorCUJGSV9JT0NGQ19JMkhfRkFBX0RJU0FCTEVfUlNQCT0gQkZBX0kySE0oNSksCisJQkZJX0lPQ0ZDX0kySF9GQUFfUVVFUllfUlNQCT0gQkZBX0kySE0oNiksCiB9OwogCiBzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ19zIHsKQEAgLTQwLDYgKzQ2LDEyIEBACiAJdTgJIHNlbnNlX2J1Zl9sZW47CS8qICBTQ1NJIHNlbnNlIGxlbmd0aAkgICAgKi8KIAl1MTYJcnN2ZF8xOwogCXUzMgllbmRpYW5fc2lnOwkvKiAgZW5kaWFuIHNpZ25hdHVyZSBvZiBob3N0ICAgICAqLworCXU4CXJzdmRfMjsKKwl1OAlzaW5nbGVfbXNpeF92ZWM7CisJdTgJcnN2ZFsyXTsKKwlfX2JlMTYJbnVtX2lvaW1fcmVxczsKKwlfX2JlMTYJbnVtX2Z3dGlvX3JlcXM7CisKIAogCS8qCiAJICogUmVxdWVzdCBhbmQgcmVzcG9uc2UgY2lyY3VsYXIgcXVldWUgYmFzZSBhZGRyZXNzZXMsIHNpemUgYW5kCkBAIC01NCw3ICs2Niw4IEBACiAKIAl1bmlvbiBiZmlfYWRkcl91ICBzdGF0c19hZGRyOwkvKiAgRE1BLWFibGUgYWRkcmVzcyBmb3Igc3RhdHMJICAqLwogCXVuaW9uIGJmaV9hZGRyX3UgIGNmZ3JzcF9hZGRyOwkvKiAgY29uZmlnIHJlc3BvbnNlIGRtYSBhZGRyZXNzICAqLwotCXVuaW9uIGJmaV9hZGRyX3UgIGlvaW1fc25zYmFzZTsgIC8qICBJTyBzZW5zZSBidWZmZXIgYmFzZSBhZGRyZXNzICovCisJdW5pb24gYmZpX2FkZHJfdSAgaW9pbV9zbnNiYXNlW0JGSV9JT0lNX1NOU0JVRl9TRUdTXTsKKwkJCQkJLyogIElPIHNlbnNlIGJ1ZiBiYXNlIGFkZHIgc2VnbWVudHMgKi8KIAlzdHJ1Y3QgYmZhX2lvY2ZjX2ludHJfYXR0cl9zIGludHJfYXR0cjsgLyogIElPQyBpbnRlcnJ1cHQgYXR0cmlidXRlcyAqLwogfTsKIApAQCAtNjgsMTEgKzgxLDI1IEBACiAJdTgJCXJzdmRbN107CiB9OwogCisvKioKKyAqIFF1ZXVlIGNvbmZpZ3VyYXRpb24gcmVzcG9uc2UgZnJvbSBmaXJtd2FyZQorICovCitzdHJ1Y3QgYmZpX2lvY2ZjX3FyZWdfcyB7CisJdTMyCWNwZV9xX2NpX29mZltCRklfSU9DX01BWF9DUVNdOworCXUzMgljcGVfcV9waV9vZmZbQkZJX0lPQ19NQVhfQ1FTXTsKKwl1MzIJY3BlX3FjdGxfb2ZmW0JGSV9JT0NfTUFYX0NRU107CisJdTMyCXJtZV9xX2NpX29mZltCRklfSU9DX01BWF9DUVNdOworCXUzMglybWVfcV9waV9vZmZbQkZJX0lPQ19NQVhfQ1FTXTsKKwl1MzIJcm1lX3FjdGxfb2ZmW0JGSV9JT0NfTUFYX0NRU107CisJdTgJaHdfcWlkW0JGSV9JT0NfTUFYX0NRU107Cit9OworCiBzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ3JzcF9zIHsKIAlzdHJ1Y3QgYmZhX2lvY2ZjX2Z3Y2ZnX3MJZndjZmc7CiAJc3RydWN0IGJmYV9pb2NmY19pbnRyX2F0dHJfcwlpbnRyX2F0dHI7CiAJc3RydWN0IGJmaV9pb2NmY19ib290d3ducwlib290d3duczsKIAlzdHJ1Y3QgYmZpX3BiY19zCQlwYmNfY2ZnOworCXN0cnVjdCBiZmlfaW9jZmNfcXJlZ19zCQlxcmVnOwogfTsKIAogLyoKQEAgLTE1MCw2ICsxNzcsMzcgQEAKIAl1MzIgbWJveG1zZ1tCRklfSU9DX01TR1NaXTsKIH07CiAKKy8qCisgKiBCRklfSU9DRkNfSDJJX0ZBQV9FTkFCTEVfUkVRIEJGSV9JT0NGQ19IMklfRkFBX0RJU0FCTEVfUkVRIG1lc3NhZ2UKKyAqLworc3RydWN0IGJmaV9mYWFfZW5fZGlzX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zIG1oOwkvKiBjb21tb24gbXNnIGhlYWRlciAgICAqLworfTsKKworLyoKKyAqIEJGSV9JT0NGQ19IMklfRkFBX1FVRVJZX1JFUSBtZXNzYWdlCisgKi8KK3N0cnVjdCBiZmlfZmFhX3F1ZXJ5X3MgeworCXN0cnVjdCBiZmlfbWhkcl9zIG1oOwkvKiBjb21tb24gbXNnIGhlYWRlciAgICAqLworCXU4CWZhYV9zdGF0dXM7CS8qIEZBQSBzdGF0dXMgICAgICAgICAgICovCisJdTgJYWRkcl9zb3VyY2U7CS8qIFBXV04gc291cmNlICAgICAgICAgICovCisJdTgJcnN2ZFsyXTsKKwl3d25fdAlmYWE7CQkvKiBGYWJyaWMgYWNxdWlyZWQgUFdXTgkqLworfTsKKworLyoKKyAqIEJGSV9JT0NGQ19JMkhfRkFBX0VOQUJMRV9SU1AsIEJGSV9JT0NGQ19JMkhfRkFBX0RJU0FCTEVfUlNQIG1lc3NhZ2UKKyAqLworc3RydWN0IGJmaV9mYWFfZW5fZGlzX3JzcF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyBtaDsJLyogY29tbW9uIG1zZyBoZWFkZXIgICAgKi8KKwl1OAlzdGF0dXM7CQkvKiB1cGRhdGVxICBzdGF0dXMgICAgICAqLworCXU4CXJzdmRbM107Cit9OworCisvKgorICogQkZJX0lPQ0ZDX0kySF9GQUFfUVVFUllfUlNQIG1lc3NhZ2UKKyAqLworI2RlZmluZSBiZmlfZmFhX3F1ZXJ5X3JzcF90IHN0cnVjdCBiZmlfZmFhX3F1ZXJ5X3MKIAogZW51bSBiZmlfZmNwb3J0X2gyaSB7CiAJQkZJX0ZDUE9SVF9IMklfRU5BQkxFX1JFUQkJPSAoMSksCkBAIC0yMTMsNyArMjcxLDggQEAKIHN0cnVjdCBiZmlfZmNwb3J0X3NldF9zdmNfcGFyYW1zX3JlcV9zIHsKIAlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgbXNnIGhlYWRlciAqLwogCV9fYmUxNgkgICB0eF9iYmNyZWRpdDsJLyogIFR4IGNyZWRpdHMgKi8KLQl1MTYJICAgcnN2ZDsKKwl1OAliYl9zY247CQkvKiBCQl9TQyBGQyBjcmVkaXQgcmVjb3ZlcnkgKi8KKwl1OAlyc3ZkOwogfTsKIAogLyoKQEAgLTI5MywxMiArMzUyLDEyIEBACiAJdTgJIGNsYXNzOwkJLyogIEZDIGNsYXNzIHVzZWQgZm9yIHJlcS9yc3AJICAgICovCiAJdTgJIHJzcF90aW1lb3V0OwkvKiAgdGltZW91dCBpbiBzZWNzLCAwLW5vIHJlc3BvbnNlICovCiAJdTgJIGN0czsJCS8qICBjb250aW51ZSBzZXF1ZW5jZQkJICAgICovCi0JdTgJIGxwX3RhZzsJLyogIGxwb3J0IHRhZwkJCSAgICAqLworCXU4CSBscF9md3RhZzsJLyogIGxwb3J0IHRhZwkJCSAgICAqLwogCXN0cnVjdCBmY2hzX3MJZmNoczsJLyogIHJlcXVlc3QgRkMgaGVhZGVyIHN0cnVjdHVyZSAgICAqLwogCV9fYmUzMglyZXFfbGVuOwkvKiAgcmVxdWVzdCBwYXlsb2FkIGxlbmd0aAkgICAgKi8KIAlfX2JlMzIJcnNwX21heGxlbjsJLyogIG1heCByZXNwb25zZSBsZW5ndGggZXhwZWN0ZWQgICAqLwotCXN0cnVjdCBiZmlfc2dlX3MgICByZXFfc2dlW0JGQV9GQ1hQX01BWF9TR0VTXTsJLyogIHJlcXVlc3QgYnVmICAgICovCi0Jc3RydWN0IGJmaV9zZ2VfcyAgIHJzcF9zZ2VbQkZBX0ZDWFBfTUFYX1NHRVNdOwkvKiAgcmVzcG9uc2UgYnVmICAgKi8KKwlzdHJ1Y3QgYmZpX2FsZW5fcyByZXFfYWxlbjsJLyogcmVxdWVzdCBidWZmZXIJKi8KKwlzdHJ1Y3QgYmZpX2FsZW5fcyByc3BfYWxlbjsJLyogcmVzcG9uc2UgYnVmZmVyCSovCiB9OwogCiAvKgpAQCAtMzI4LDcgKzM4Nyw3IEBACiAJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIENvbW1vbiBtc2cgaGVhZGVyCQkqLwogCXUxNglidWZfdGFnOwkvKiAgYnVmZmVyIHRhZwkJCSovCiAJX19iZTE2CWJ1Zl9sZW47CS8qICB0b3RhbCBidWZmZXIgbGVuZ3RoCSovCi0Jc3RydWN0IGJmaV9zZ2VfcyAgIHNnZVtCRkFfVUZfTUFYX1NHRVNdOyAvKiAgYnVmZmVyIERNQSBTR0VzCSovCisJc3RydWN0IGJmaV9hbGVuX3MgYWxlbjsJLyogYnVmZmVyIGFkZHJlc3MvbGVuIHBhaXIJKi8KIH07CiAKIHN0cnVjdCBiZmlfdWZfZnJtX3JjdmRfcyB7CkBAIC0zNDYsMjYgKzQwNSwyNyBAQAogfTsKIAogZW51bSBiZmlfbHBzX2kyaF9tc2dzIHsKLQlCRklfTFBTX0gySV9MT0dJTl9SU1AJPSBCRkFfSTJITSgxKSwKLQlCRklfTFBTX0gySV9MT0dPVVRfUlNQCT0gQkZBX0kySE0oMiksCi0JQkZJX0xQU19IMklfQ1ZMX0VWRU5UCT0gQkZBX0kySE0oMyksCisJQkZJX0xQU19JMkhfTE9HSU5fUlNQCT0gQkZBX0kySE0oMSksCisJQkZJX0xQU19JMkhfTE9HT1VUX1JTUAk9IEJGQV9JMkhNKDIpLAorCUJGSV9MUFNfSTJIX0NWTF9FVkVOVAk9IEJGQV9JMkhNKDMpLAogfTsKIAogc3RydWN0IGJmaV9scHNfbG9naW5fcmVxX3MgewogCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJKi8KLQl1OAkJbHBfdGFnOworCXU4CQliZmFfdGFnOwogCXU4CQlhbHBhOwogCV9fYmUxNgkJcGR1X3NpemU7CiAJd3duX3QJCXB3d247CiAJd3duX3QJCW53d247CiAJdTgJCWZkaXNjOwogCXU4CQlhdXRoX2VuOwotCXU4CQlyc3ZkWzJdOworCXU4CQlscHNfcm9sZTsKKwl1OAkJYmJfc2NuOwogfTsKIAogc3RydWN0IGJmaV9scHNfbG9naW5fcnNwX3MgewogCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJKi8KLQl1OAkJbHBfdGFnOworCXU4CQlmd190YWc7CiAJdTgJCXN0YXR1czsKIAl1OAkJbHNyanRfcnNuOwogCXU4CQlsc3JqdF9leHBsOwpAQCAtMzgwLDMxICs0NDAsMzMgQEAKIAltYWNfdAkJZmNmX21hYzsKIAl1OAkJZXh0X3N0YXR1czsKIAl1OAkJYnJjZF9zd2l0Y2g7CS8qICBhdHRhY2hlZCBwZWVyIGlzIGJyY2Qgc3dpdGNoICovCisJdTgJCWJiX3NjbjsJCS8qIGF0YXRjaGVkIHBvcnQncyBiYl9zY24gKi8KKwl1OAkJYmZhX3RhZzsKIH07CiAKIHN0cnVjdCBiZmlfbHBzX2xvZ291dF9yZXFfcyB7CiAJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkqLwotCXU4CQlscF90YWc7CisJdTgJCWZ3X3RhZzsKIAl1OAkJcnN2ZFszXTsKIAl3d25fdAkJcG9ydF9uYW1lOwogfTsKIAogc3RydWN0IGJmaV9scHNfbG9nb3V0X3JzcF9zIHsKIAlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIJCSovCi0JdTgJCWxwX3RhZzsKKwl1OAkJYmZhX3RhZzsKIAl1OAkJc3RhdHVzOwogCXU4CQlyc3ZkWzJdOwogfTsKIAogc3RydWN0IGJmaV9scHNfY3ZsX2V2ZW50X3MgewogCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJKi8KLQl1OAkJbHBfdGFnOworCXU4CQliZmFfdGFnOwogCXU4CQlyc3ZkWzNdOwogfTsKIAogc3RydWN0IGJmaV9scHNfbjJuX3BpZF9yZXFfcyB7CiAJc3RydWN0IGJmaV9taGRyX3MJbWg7CS8qICBjb21tb24gbXNnIGhlYWRlcgkJKi8KLQl1OAlscF90YWc7CisJdTgJZndfdGFnOwogCXUzMglscF9waWQ6MjQ7CiB9OwogCkBAIC00MzksNyArNTAxLDcgQEAKIAl1MTYJYmZhX2hhbmRsZTsJLyogIGhvc3QgcnBvcnQgaGFuZGxlCQkqLwogCV9fYmUxNgltYXhfZnJtc3o7CS8qICBtYXggcmN2IHBkdSBzaXplCQkqLwogCXUzMglwaWQ6MjQsCS8qICByZW1vdGUgcG9ydCBJRAkJKi8KLQkJbHBfdGFnOjg7CS8qICBsb2NhbCBwb3J0IHRhZwkJKi8KKwkJbHBfZnd0YWc6ODsJLyogIGxvY2FsIHBvcnQgdGFnCQkqLwogCXUzMglsb2NhbF9waWQ6MjQsCS8qICBsb2NhbCBwb3J0IElECQkqLwogCQljaXNjOjg7CiAJdTgJZmNfY2xhc3M7CS8qICBzdXBwb3J0ZWQgRkMgY2xhc3NlcwkqLwpAQCAtNTAyLDYyICs1NjQsNjMgQEAKICAqIEluaXRpYXRvciBtb2RlIEktVCBuZXh1cyBpbnRlcmZhY2UgZGVmaW5lcy4KICAqLwogCi1lbnVtIGJmaV9pdG5pbV9oMmkgewotCUJGSV9JVE5JTV9IMklfQ1JFQVRFX1JFUSA9IDEsCS8qICBpLXQgbmV4dXMgY3JlYXRpb24gKi8KLQlCRklfSVROSU1fSDJJX0RFTEVURV9SRVEgPSAyLAkvKiAgaS10IG5leHVzIGRlbGV0aW9uICovCitlbnVtIGJmaV9pdG5faDJpIHsKKwlCRklfSVROX0gySV9DUkVBVEVfUkVRID0gMSwJLyogIGktdCBuZXh1cyBjcmVhdGlvbiAqLworCUJGSV9JVE5fSDJJX0RFTEVURV9SRVEgPSAyLAkvKiAgaS10IG5leHVzIGRlbGV0aW9uICovCiB9OwogCi1lbnVtIGJmaV9pdG5pbV9pMmggewotCUJGSV9JVE5JTV9JMkhfQ1JFQVRFX1JTUCA9IEJGQV9JMkhNKDEpLAotCUJGSV9JVE5JTV9JMkhfREVMRVRFX1JTUCA9IEJGQV9JMkhNKDIpLAotCUJGSV9JVE5JTV9JMkhfU0xFUl9FVkVOVCA9IEJGQV9JMkhNKDMpLAorZW51bSBiZmlfaXRuX2kyaCB7CisJQkZJX0lUTl9JMkhfQ1JFQVRFX1JTUCA9IEJGQV9JMkhNKDEpLAorCUJGSV9JVE5fSTJIX0RFTEVURV9SU1AgPSBCRkFfSTJITSgyKSwKKwlCRklfSVROX0kySF9TTEVSX0VWRU5UID0gQkZBX0kySE0oMyksCiB9OwogCi1zdHJ1Y3QgYmZpX2l0bmltX2NyZWF0ZV9yZXFfcyB7CitzdHJ1Y3QgYmZpX2l0bl9jcmVhdGVfcmVxX3MgewogCXN0cnVjdCBiZmlfbWhkcl9zICBtaDsJCS8qICBjb21tb24gbXNnIGhlYWRlcgkJICovCiAJdTE2CWZ3X2hhbmRsZTsJLyogIGYvdyBoYW5kbGUgZm9yIGl0bmltCSAqLwogCXU4CWNsYXNzOwkJLyogIEZDIGNsYXNzIGZvciBJTwkJICovCiAJdTgJc2VxX3JlYzsJLyogIHNlcXVlbmNlIHJlY292ZXJ5IHN1cHBvcnQJICovCiAJdTgJbXNnX25vOwkJLyogIHNlcSBpZCBvZiB0aGUgbXNnCQkgKi8KKwl1OAlyb2xlOwogfTsKIAotc3RydWN0IGJmaV9pdG5pbV9jcmVhdGVfcnNwX3Mgeworc3RydWN0IGJmaV9pdG5fY3JlYXRlX3JzcF9zIHsKIAlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIJCSAqLwogCXUxNgliZmFfaGFuZGxlOwkvKiAgYmZhIGhhbmRsZSBmb3IgaXRuaW0JICovCiAJdTgJc3RhdHVzOwkJLyogIGZjcCByZXF1ZXN0IHN0YXR1cwkJICovCiAJdTgJc2VxX2lkOwkJLyogIHNlcSBpZCBvZiB0aGUgbXNnCQkgKi8KIH07CiAKLXN0cnVjdCBiZmlfaXRuaW1fZGVsZXRlX3JlcV9zIHsKK3N0cnVjdCBiZmlfaXRuX2RlbGV0ZV9yZXFfcyB7CiAJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkgKi8KIAl1MTYJZndfaGFuZGxlOwkvKiAgZi93IGl0bmltIGhhbmRsZQkJICovCiAJdTgJc2VxX2lkOwkJLyogIHNlcSBpZCBvZiB0aGUgbXNnCQkgKi8KIAl1OAlyc3ZkOwogfTsKIAotc3RydWN0IGJmaV9pdG5pbV9kZWxldGVfcnNwX3Mgeworc3RydWN0IGJmaV9pdG5fZGVsZXRlX3JzcF9zIHsKIAlzdHJ1Y3QgYmZpX21oZHJfcyAgbWg7CQkvKiAgY29tbW9uIG1zZyBoZWFkZXIJCSAqLwogCXUxNgliZmFfaGFuZGxlOwkvKiAgYmZhIGhhbmRsZSBmb3IgaXRuaW0JICovCiAJdTgJc3RhdHVzOwkJLyogIGZjcCByZXF1ZXN0IHN0YXR1cwkJICovCiAJdTgJc2VxX2lkOwkJLyogIHNlcSBpZCBvZiB0aGUgbXNnCQkgKi8KIH07CiAKLXN0cnVjdCBiZmlfaXRuaW1fc2xlcl9ldmVudF9zIHsKK3N0cnVjdCBiZmlfaXRuX3NsZXJfZXZlbnRfcyB7CiAJc3RydWN0IGJmaV9taGRyX3MgIG1oOwkJLyogIGNvbW1vbiBtc2cgaGVhZGVyCQkgKi8KIAl1MTYJYmZhX2hhbmRsZTsJLyogIGJmYSBoYW5kbGUgZm9yIGl0bmltCSAqLwogCXUxNglyc3ZkOwogfTsKIAotdW5pb24gYmZpX2l0bmltX2gyaV9tc2dfdSB7Ci0Jc3RydWN0IGJmaV9pdG5pbV9jcmVhdGVfcmVxX3MgKmNyZWF0ZV9yZXE7Ci0Jc3RydWN0IGJmaV9pdG5pbV9kZWxldGVfcmVxX3MgKmRlbGV0ZV9yZXE7Cit1bmlvbiBiZmlfaXRuX2gyaV9tc2dfdSB7CisJc3RydWN0IGJmaV9pdG5fY3JlYXRlX3JlcV9zICpjcmVhdGVfcmVxOworCXN0cnVjdCBiZmlfaXRuX2RlbGV0ZV9yZXFfcyAqZGVsZXRlX3JlcTsKIAlzdHJ1Y3QgYmZpX21zZ19zCSptc2c7CiB9OwogCi11bmlvbiBiZmlfaXRuaW1faTJoX21zZ191IHsKLQlzdHJ1Y3QgYmZpX2l0bmltX2NyZWF0ZV9yc3BfcyAqY3JlYXRlX3JzcDsKLQlzdHJ1Y3QgYmZpX2l0bmltX2RlbGV0ZV9yc3BfcyAqZGVsZXRlX3JzcDsKLQlzdHJ1Y3QgYmZpX2l0bmltX3NsZXJfZXZlbnRfcyAqc2xlcl9ldmVudDsKK3VuaW9uIGJmaV9pdG5faTJoX21zZ191IHsKKwlzdHJ1Y3QgYmZpX2l0bl9jcmVhdGVfcnNwX3MgKmNyZWF0ZV9yc3A7CisJc3RydWN0IGJmaV9pdG5fZGVsZXRlX3JzcF9zICpkZWxldGVfcnNwOworCXN0cnVjdCBiZmlfaXRuX3NsZXJfZXZlbnRfcyAqc2xlcl9ldmVudDsKIAlzdHJ1Y3QgYmZpX21zZ19zCSptc2c7CiB9OwogCkBAIC02OTMsNyArNzU2LDYgQEAKIAlCRklfSU9JTV9TVFNfUEFUSFRPViA9IDgsCiB9OwogCi0jZGVmaW5lIEJGSV9JT0lNX1NOU0xFTgkoMjU2KQogLyoKICAqIEkvTyByZXNwb25zZSBtZXNzYWdlCiAgKi8KQEAgLTc3Miw0ICs4MzQsMjcgQEAKIAogI3ByYWdtYSBwYWNrKCkKIAorLyoKKyAqIENyb3NzYm93IFBDSSBNU0ktWCB2ZWN0b3IgZGVmaW5lcworICovCitlbnVtIHsKKwlCRklfTVNJWF9DUEVfUU1JTl9DQiA9IDAsCisJQkZJX01TSVhfQ1BFX1FNQVhfQ0IgPSA3LAorCUJGSV9NU0lYX1JNRV9RTUlOX0NCID0gOCwKKwlCRklfTVNJWF9STUVfUU1BWF9DQiA9IDE1LAorCUJGSV9NU0lYX0NCX01BWCA9IDIyLAorfTsKKworLyoKKyAqIENhdGFwdWx0IEZDIFBDSSBNU0ktWCB2ZWN0b3IgZGVmaW5lcworICovCitlbnVtIHsKKwlCRklfTVNJWF9MUFVfRVJSX0NUID0gMCwKKwlCRklfTVNJWF9DUEVfUU1JTl9DVCA9IDEsCisJQkZJX01TSVhfQ1BFX1FNQVhfQ1QgPSA0LAorCUJGSV9NU0lYX1JNRV9RTUlOX0NUID0gNSwKKwlCRklfTVNJWF9STUVfUU1BWF9DVCA9IDgsCisJQkZJX01TSVhfQ1RfTUFYID0gOSwKK307CisKICNlbmRpZiAvKiBfX0JGSV9NU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZpX3JlZy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmlfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5MjA2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZpX3JlZy5oCkBAIC0wLDAgKzEsNDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEJyb2NhZGUgRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBiZmlfcmVnLmggQVNJQyByZWdpc3RlciBkZWZpbmVzIGZvciBhbGwgQnJvY2FkZSBhZGFwdGVyIEFTSUNzCisgKi8KKworI2lmbmRlZiBfX0JGSV9SRUdfSF9fCisjZGVmaW5lIF9fQkZJX1JFR19IX18KKworI2RlZmluZSBIT1NURk4wX0lOVF9TVEFUVVMJCTB4MDAwMTQwMDAJLyogY2IvY3QJKi8KKyNkZWZpbmUgSE9TVEZOMV9JTlRfU1RBVFVTCQkweDAwMDE0MTAwCS8qIGNiL2N0CSovCisjZGVmaW5lIEhPU1RGTjJfSU5UX1NUQVRVUwkJMHgwMDAxNDMwMAkvKiBjdAkJKi8KKyNkZWZpbmUgSE9TVEZOM19JTlRfU1RBVFVTCQkweDAwMDE0NDAwCS8qIGN0CQkqLworI2RlZmluZSBIT1NURk4wX0lOVF9NU0sJCQkweDAwMDE0MDA0CS8qIGNiL2N0CSovCisjZGVmaW5lIEhPU1RGTjFfSU5UX01TSwkJCTB4MDAwMTQxMDQJLyogY2IvY3QJKi8KKyNkZWZpbmUgSE9TVEZOMl9JTlRfTVNLCQkJMHgwMDAxNDMwNAkvKiBjdAkJKi8KKyNkZWZpbmUgSE9TVEZOM19JTlRfTVNLCQkJMHgwMDAxNDQwNAkvKiBjdAkJKi8KKworI2RlZmluZSBIT1NUX1BBR0VfTlVNX0ZOMAkJMHgwMDAxNDAwOAkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1BBR0VfTlVNX0ZOMQkJMHgwMDAxNDEwOAkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1BBR0VfTlVNX0ZOMgkJMHgwMDAxNDMwOAkvKiBjdAkJKi8KKyNkZWZpbmUgSE9TVF9QQUdFX05VTV9GTjMJCTB4MDAwMTQ0MDgJLyogY3QJCSovCisKKyNkZWZpbmUgQVBQX1BMTF9MQ0xLX0NUTF9SRUcJCTB4MDAwMTQyMDQJLyogY2IvY3QJKi8KKyNkZWZpbmUgX19QX0xDTEtfUExMX0xPQ0sJCTB4ODAwMDAwMDAKKyNkZWZpbmUgX19BUFBfUExMX0xDTEtfU1JBTV9VU0VfMTAwTUhaCTB4MDAxMDAwMDAKKyNkZWZpbmUgX19BUFBfUExMX0xDTEtfUkVTRVRfVElNRVJfTUsJMHgwMDBlMDAwMAorI2RlZmluZSBfX0FQUF9QTExfTENMS19SRVNFVF9USU1FUl9TSAkxNworI2RlZmluZSBfX0FQUF9QTExfTENMS19SRVNFVF9USU1FUihfdikJKChfdikgPDwgX19BUFBfUExMX0xDTEtfUkVTRVRfVElNRVJfU0gpCisjZGVmaW5lIF9fQVBQX1BMTF9MQ0xLX0xPR0lDX1NPRlRfUkVTRVQJMHgwMDAxMDAwMAorI2RlZmluZSBfX0FQUF9QTExfTENMS19DTlRMTVQwXzFfTUsJMHgwMDAwYzAwMAorI2RlZmluZSBfX0FQUF9QTExfTENMS19DTlRMTVQwXzFfU0gJMTQKKyNkZWZpbmUgX19BUFBfUExMX0xDTEtfQ05UTE1UMF8xKF92KQkoKF92KSA8PCBfX0FQUF9QTExfTENMS19DTlRMTVQwXzFfU0gpCisjZGVmaW5lIF9fQVBQX1BMTF9MQ0xLX0pJVExNVDBfMV9NSwkweDAwMDAzMDAwCisjZGVmaW5lIF9fQVBQX1BMTF9MQ0xLX0pJVExNVDBfMV9TSAkxMgorI2RlZmluZSBfX0FQUF9QTExfTENMS19KSVRMTVQwXzEoX3YpCSgoX3YpIDw8IF9fQVBQX1BMTF9MQ0xLX0pJVExNVDBfMV9TSCkKKyNkZWZpbmUgX19BUFBfUExMX0xDTEtfSFJFRgkJMHgwMDAwMDgwMAorI2RlZmluZSBfX0FQUF9QTExfTENMS19IRElWCQkweDAwMDAwNDAwCisjZGVmaW5lIF9fQVBQX1BMTF9MQ0xLX1AwXzFfTUsJCTB4MDAwMDAzMDAKKyNkZWZpbmUgX19BUFBfUExMX0xDTEtfUDBfMV9TSAkJOAorI2RlZmluZSBfX0FQUF9QTExfTENMS19QMF8xKF92KQkJKChfdikgPDwgX19BUFBfUExMX0xDTEtfUDBfMV9TSCkKKyNkZWZpbmUgX19BUFBfUExMX0xDTEtfWjBfMl9NSwkJMHgwMDAwMDBlMAorI2RlZmluZSBfX0FQUF9QTExfTENMS19aMF8yX1NICQk1CisjZGVmaW5lIF9fQVBQX1BMTF9MQ0xLX1owXzIoX3YpCQkoKF92KSA8PCBfX0FQUF9QTExfTENMS19aMF8yX1NIKQorI2RlZmluZSBfX0FQUF9QTExfTENMS19SU0VMMjAwNTAwCTB4MDAwMDAwMTAKKyNkZWZpbmUgX19BUFBfUExMX0xDTEtfRU5BUlNUCQkweDAwMDAwMDA4CisjZGVmaW5lIF9fQVBQX1BMTF9MQ0xLX0JZUEFTUwkJMHgwMDAwMDAwNAorI2RlZmluZSBfX0FQUF9QTExfTENMS19MUkVTRVROCQkweDAwMDAwMDAyCisjZGVmaW5lIF9fQVBQX1BMTF9MQ0xLX0VOQUJMRQkJMHgwMDAwMDAwMQorI2RlZmluZSBBUFBfUExMX1NDTEtfQ1RMX1JFRwkJMHgwMDAxNDIwOAkvKiBjYi9jdAkqLworI2RlZmluZSBfX1BfU0NMS19QTExfTE9DSwkJMHg4MDAwMDAwMAorI2RlZmluZSBfX0FQUF9QTExfU0NMS19SRVNFVF9USU1FUl9NSwkweDAwMGUwMDAwCisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX1JFU0VUX1RJTUVSX1NICTE3CisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX1JFU0VUX1RJTUVSKF92KQkoKF92KSA8PCBfX0FQUF9QTExfU0NMS19SRVNFVF9USU1FUl9TSCkKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfTE9HSUNfU09GVF9SRVNFVAkweDAwMDEwMDAwCisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX0NOVExNVDBfMV9NSwkweDAwMDBjMDAwCisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX0NOVExNVDBfMV9TSAkxNAorI2RlZmluZSBfX0FQUF9QTExfU0NMS19DTlRMTVQwXzEoX3YpCSgoX3YpIDw8IF9fQVBQX1BMTF9TQ0xLX0NOVExNVDBfMV9TSCkKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfSklUTE1UMF8xX01LCTB4MDAwMDMwMDAKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfSklUTE1UMF8xX1NICTEyCisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX0pJVExNVDBfMShfdikJKChfdikgPDwgX19BUFBfUExMX1NDTEtfSklUTE1UMF8xX1NIKQorI2RlZmluZSBfX0FQUF9QTExfU0NMS19IUkVGCQkweDAwMDAwODAwCisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX0hESVYJCTB4MDAwMDA0MDAKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfUDBfMV9NSwkJMHgwMDAwMDMwMAorI2RlZmluZSBfX0FQUF9QTExfU0NMS19QMF8xX1NICQk4CisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX1AwXzEoX3YpCQkoKF92KSA8PCBfX0FQUF9QTExfU0NMS19QMF8xX1NIKQorI2RlZmluZSBfX0FQUF9QTExfU0NMS19aMF8yX01LCQkweDAwMDAwMGUwCisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX1owXzJfU0gJCTUKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfWjBfMihfdikJCSgoX3YpIDw8IF9fQVBQX1BMTF9TQ0xLX1owXzJfU0gpCisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX1JTRUwyMDA1MDAJMHgwMDAwMDAxMAorI2RlZmluZSBfX0FQUF9QTExfU0NMS19FTkFSU1QJCTB4MDAwMDAwMDgKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfQllQQVNTCQkweDAwMDAwMDA0CisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX0xSRVNFVE4JCTB4MDAwMDAwMDIKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfRU5BQkxFCQkweDAwMDAwMDAxCisjZGVmaW5lIF9fRU5BQkxFX01BQ19BSEJfMQkJMHgwMDgwMDAwMAkvKiBjdAkJKi8KKyNkZWZpbmUgX19FTkFCTEVfTUFDX0FIQl8wCQkweDAwNDAwMDAwCS8qIGN0CQkqLworI2RlZmluZSBfX0VOQUJMRV9NQUNfMQkJCTB4MDAyMDAwMDAJLyogY3QJCSovCisjZGVmaW5lIF9fRU5BQkxFX01BQ18wCQkJMHgwMDEwMDAwMAkvKiBjdAkJKi8KKworI2RlZmluZSBIT1NUX1NFTTBfUkVHCQkJMHgwMDAxNDIzMAkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1NFTTFfUkVHCQkJMHgwMDAxNDIzNAkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1NFTTJfUkVHCQkJMHgwMDAxNDIzOAkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1NFTTNfUkVHCQkJMHgwMDAxNDIzYwkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1NFTTRfUkVHCQkJMHgwMDAxNDYxMAkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1NFTTVfUkVHCQkJMHgwMDAxNDYxNAkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1NFTTZfUkVHCQkJMHgwMDAxNDYxOAkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1NFTTdfUkVHCQkJMHgwMDAxNDYxYwkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1NFTTBfSU5GT19SRUcJCTB4MDAwMTQyNDAJLyogY2IvY3QJKi8KKyNkZWZpbmUgSE9TVF9TRU0xX0lORk9fUkVHCQkweDAwMDE0MjQ0CS8qIGNiL2N0CSovCisjZGVmaW5lIEhPU1RfU0VNMl9JTkZPX1JFRwkJMHgwMDAxNDI0OAkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1NFTTNfSU5GT19SRUcJCTB4MDAwMTQyNGMJLyogY2IvY3QJKi8KKyNkZWZpbmUgSE9TVF9TRU00X0lORk9fUkVHCQkweDAwMDE0NjIwCS8qIGNiL2N0CSovCisjZGVmaW5lIEhPU1RfU0VNNV9JTkZPX1JFRwkJMHgwMDAxNDYyNAkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NUX1NFTTZfSU5GT19SRUcJCTB4MDAwMTQ2MjgJLyogY2IvY3QJKi8KKyNkZWZpbmUgSE9TVF9TRU03X0lORk9fUkVHCQkweDAwMDE0NjJjCS8qIGNiL2N0CSovCisKKyNkZWZpbmUgSE9TVEZOMF9MUFUwX0NNRF9TVEFUCQkweDAwMDE5MDAwCS8qIGNiL2N0CSovCisjZGVmaW5lIEhPU1RGTjBfTFBVMV9DTURfU1RBVAkJMHgwMDAxOTAwNAkvKiBjYi9jdAkqLworI2RlZmluZSBIT1NURk4xX0xQVTBfQ01EX1NUQVQJCTB4MDAwMTkwMTAJLyogY2IvY3QJKi8KKyNkZWZpbmUgSE9TVEZOMV9MUFUxX0NNRF9TVEFUCQkweDAwMDE5MDE0CS8qIGNiL2N0CSovCisjZGVmaW5lIEhPU1RGTjJfTFBVMF9DTURfU1RBVAkJMHgwMDAxOTE1MAkvKiBjdAkJKi8KKyNkZWZpbmUgSE9TVEZOMl9MUFUxX0NNRF9TVEFUCQkweDAwMDE5MTU0CS8qIGN0CQkqLworI2RlZmluZSBIT1NURk4zX0xQVTBfQ01EX1NUQVQJCTB4MDAwMTkxNjAJLyogY3QJCSovCisjZGVmaW5lIEhPU1RGTjNfTFBVMV9DTURfU1RBVAkJMHgwMDAxOTE2NAkvKiBjdAkJKi8KKyNkZWZpbmUgTFBVMF9IT1NURk4wX0NNRF9TVEFUCQkweDAwMDE5MDA4CS8qIGNiL2N0CSovCisjZGVmaW5lIExQVTFfSE9TVEZOMF9DTURfU1RBVAkJMHgwMDAxOTAwYwkvKiBjYi9jdAkqLworI2RlZmluZSBMUFUwX0hPU1RGTjFfQ01EX1NUQVQJCTB4MDAwMTkwMTgJLyogY2IvY3QJKi8KKyNkZWZpbmUgTFBVMV9IT1NURk4xX0NNRF9TVEFUCQkweDAwMDE5MDFjCS8qIGNiL2N0CSovCisjZGVmaW5lIExQVTBfSE9TVEZOMl9DTURfU1RBVAkJMHgwMDAxOTE1OAkvKiBjdAkJKi8KKyNkZWZpbmUgTFBVMV9IT1NURk4yX0NNRF9TVEFUCQkweDAwMDE5MTVjCS8qIGN0CQkqLworI2RlZmluZSBMUFUwX0hPU1RGTjNfQ01EX1NUQVQJCTB4MDAwMTkxNjgJLyogY3QJCSovCisjZGVmaW5lIExQVTFfSE9TVEZOM19DTURfU1RBVAkJMHgwMDAxOTE2YwkvKiBjdAkJKi8KKworI2RlZmluZSBQU1NfQ1RMX1JFRwkJCTB4MDAwMTg4MDAJLyogY2IvY3QJKi8KKyNkZWZpbmUgX19QU1NfSTJDX0NMS19ESVZfTUsJCTB4MDA3ZjAwMDAKKyNkZWZpbmUgX19QU1NfSTJDX0NMS19ESVZfU0gJCTE2CisjZGVmaW5lIF9fUFNTX0kyQ19DTEtfRElWKF92KQkJKChfdikgPDwgX19QU1NfSTJDX0NMS19ESVZfU0gpCisjZGVmaW5lIF9fUFNTX0xNRU1fSU5JVF9ET05FCQkweDAwMDAxMDAwCisjZGVmaW5lIF9fUFNTX0xNRU1fUkVTRVQJCTB4MDAwMDAyMDAKKyNkZWZpbmUgX19QU1NfTE1FTV9JTklUX0VOCQkweDAwMDAwMTAwCisjZGVmaW5lIF9fUFNTX0xQVTFfUkVTRVQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgX19QU1NfTFBVMF9SRVNFVAkJMHgwMDAwMDAwMQorI2RlZmluZSBQU1NfRVJSX1NUQVRVU19SRUcJCTB4MDAwMTg4MTAJLyogY2IvY3QJKi8KKyNkZWZpbmUgRVJSX1NFVF9SRUcJCQkweDAwMDE4ODE4CS8qIGNiL2N0CSovCisjZGVmaW5lIFBTU19HUElPX09VVF9SRUcJCTB4MDAwMTg4YzAJLyogY2IvY3QJKi8KKyNkZWZpbmUgX19QU1NfR1BJT19PVVRfUkVHCQkweDAwMDAwZmZmCisjZGVmaW5lIFBTU19HUElPX09FX1JFRwkJCTB4MDAwMTg4YzgJLyogY2IvY3QJKi8KKyNkZWZpbmUgX19QU1NfR1BJT19PRV9SRUcJCTB4MDAwMDAwZmYKKworI2RlZmluZSBIT1NURk4wX0xQVV9NQk9YMF8wCQkweDAwMDE5MjAwCS8qIGNiL2N0CSovCisjZGVmaW5lIEhPU1RGTjFfTFBVX01CT1gwXzgJCTB4MDAwMTkyNjAJLyogY2IvY3QJKi8KKyNkZWZpbmUgTFBVX0hPU1RGTjBfTUJPWDBfMAkJMHgwMDAxOTI4MAkvKiBjYi9jdAkqLworI2RlZmluZSBMUFVfSE9TVEZOMV9NQk9YMF84CQkweDAwMDE5MmUwCS8qIGNiL2N0CSovCisjZGVmaW5lIEhPU1RGTjJfTFBVX01CT1gwXzAJCTB4MDAwMTk0MDAJLyogY3QJCSovCisjZGVmaW5lIEhPU1RGTjNfTFBVX01CT1gwXzgJCTB4MDAwMTk0NjAJLyogY3QJCSovCisjZGVmaW5lIExQVV9IT1NURk4yX01CT1gwXzAJCTB4MDAwMTk0ODAJLyogY3QJCSovCisjZGVmaW5lIExQVV9IT1NURk4zX01CT1gwXzgJCTB4MDAwMTk0ZTAJLyogY3QJCSovCisKKyNkZWZpbmUgSE9TVF9NU0lYX0VSUl9JTkRFWF9GTjAJCTB4MDAwMTQwMGMJLyogY3QJCSovCisjZGVmaW5lIEhPU1RfTVNJWF9FUlJfSU5ERVhfRk4xCQkweDAwMDE0MTBjCS8qIGN0CQkqLworI2RlZmluZSBIT1NUX01TSVhfRVJSX0lOREVYX0ZOMgkJMHgwMDAxNDMwYwkvKiBjdAkJKi8KKyNkZWZpbmUgSE9TVF9NU0lYX0VSUl9JTkRFWF9GTjMJCTB4MDAwMTQ0MGMJLyogY3QJCSovCisKKyNkZWZpbmUgTUJJU1RfQ1RMX1JFRwkJCTB4MDAwMTQyMjAJLyogY3QJCSovCisjZGVmaW5lIF9fRURSQU1fQklTVFJfU1RBUlQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUJJU1RfU1RBVF9SRUcJCQkweDAwMDE0MjI0CS8qIGN0CQkqLworI2RlZmluZSBFVEhfTUFDX1NFUl9SRUcJCQkweDAwMDE0Mjg4CS8qIGN0CQkqLworI2RlZmluZSBfX0FQUF9FTVNfQ0tCVUZBTVBJTgkJMHgwMDAwMDAyMAorI2RlZmluZSBfX0FQUF9FTVNfUkVGQ0xLU0VMCQkweDAwMDAwMDEwCisjZGVmaW5lIF9fQVBQX0VNU19DTUxDS1NFTAkJMHgwMDAwMDAwOAorI2RlZmluZSBfX0FQUF9FTVNfUkVGQ0tCVUZFTjIJCTB4MDAwMDAwMDQKKyNkZWZpbmUgX19BUFBfRU1TX1JFRkNLQlVGRU4xCQkweDAwMDAwMDAyCisjZGVmaW5lIF9fQVBQX0VNU19DSEFOTkVMX1NFTAkJMHgwMDAwMDAwMQorI2RlZmluZSBGTkNfUEVSU19SRUcJCQkweDAwMDE0NjA0CS8qIGN0CQkqLworI2RlZmluZSBfX0YzX0ZVTkNUSU9OX0FDVElWRQkJMHg4MDAwMDAwMAorI2RlZmluZSBfX0YzX0ZVTkNUSU9OX01PREUJCTB4NDAwMDAwMDAKKyNkZWZpbmUgX19GM19QT1JUX01BUF9NSwkJMHgzMDAwMDAwMAorI2RlZmluZSBfX0YzX1BPUlRfTUFQX1NICQkyOAorI2RlZmluZSBfX0YzX1BPUlRfTUFQKF92KQkJKChfdikgPDwgX19GM19QT1JUX01BUF9TSCkKKyNkZWZpbmUgX19GM19WTV9NT0RFCQkJMHgwODAwMDAwMAorI2RlZmluZSBfX0YzX0lOVFhfU1RBVFVTX01LCQkweDA3MDAwMDAwCisjZGVmaW5lIF9fRjNfSU5UWF9TVEFUVVNfU0gJCTI0CisjZGVmaW5lIF9fRjNfSU5UWF9TVEFUVVMoX3YpCQkoKF92KSA8PCBfX0YzX0lOVFhfU1RBVFVTX1NIKQorI2RlZmluZSBfX0YyX0ZVTkNUSU9OX0FDVElWRQkJMHgwMDgwMDAwMAorI2RlZmluZSBfX0YyX0ZVTkNUSU9OX01PREUJCTB4MDA0MDAwMDAKKyNkZWZpbmUgX19GMl9QT1JUX01BUF9NSwkJMHgwMDMwMDAwMAorI2RlZmluZSBfX0YyX1BPUlRfTUFQX1NICQkyMAorI2RlZmluZSBfX0YyX1BPUlRfTUFQKF92KQkJKChfdikgPDwgX19GMl9QT1JUX01BUF9TSCkKKyNkZWZpbmUgX19GMl9WTV9NT0RFCQkJMHgwMDA4MDAwMAorI2RlZmluZSBfX0YyX0lOVFhfU1RBVFVTX01LCQkweDAwMDcwMDAwCisjZGVmaW5lIF9fRjJfSU5UWF9TVEFUVVNfU0gJCTE2CisjZGVmaW5lIF9fRjJfSU5UWF9TVEFUVVMoX3YpCQkoKF92KSA8PCBfX0YyX0lOVFhfU1RBVFVTX1NIKQorI2RlZmluZSBfX0YxX0ZVTkNUSU9OX0FDVElWRQkJMHgwMDAwODAwMAorI2RlZmluZSBfX0YxX0ZVTkNUSU9OX01PREUJCTB4MDAwMDQwMDAKKyNkZWZpbmUgX19GMV9QT1JUX01BUF9NSwkJMHgwMDAwMzAwMAorI2RlZmluZSBfX0YxX1BPUlRfTUFQX1NICQkxMgorI2RlZmluZSBfX0YxX1BPUlRfTUFQKF92KQkJKChfdikgPDwgX19GMV9QT1JUX01BUF9TSCkKKyNkZWZpbmUgX19GMV9WTV9NT0RFCQkJMHgwMDAwMDgwMAorI2RlZmluZSBfX0YxX0lOVFhfU1RBVFVTX01LCQkweDAwMDAwNzAwCisjZGVmaW5lIF9fRjFfSU5UWF9TVEFUVVNfU0gJCTgKKyNkZWZpbmUgX19GMV9JTlRYX1NUQVRVUyhfdikJCSgoX3YpIDw8IF9fRjFfSU5UWF9TVEFUVVNfU0gpCisjZGVmaW5lIF9fRjBfRlVOQ1RJT05fQUNUSVZFCQkweDAwMDAwMDgwCisjZGVmaW5lIF9fRjBfRlVOQ1RJT05fTU9ERQkJMHgwMDAwMDA0MAorI2RlZmluZSBfX0YwX1BPUlRfTUFQX01LCQkweDAwMDAwMDMwCisjZGVmaW5lIF9fRjBfUE9SVF9NQVBfU0gJCTQKKyNkZWZpbmUgX19GMF9QT1JUX01BUChfdikJCSgoX3YpIDw8IF9fRjBfUE9SVF9NQVBfU0gpCisjZGVmaW5lIF9fRjBfVk1fTU9ERQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgX19GMF9JTlRYX1NUQVRVUwkJMHgwMDAwMDAwNworZW51bSB7CisJX19GMF9JTlRYX1NUQVRVU19NU0lYID0gMHgwLAorCV9fRjBfSU5UWF9TVEFUVVNfSU5UQSA9IDB4MSwKKwlfX0YwX0lOVFhfU1RBVFVTX0lOVEIgPSAweDIsCisJX19GMF9JTlRYX1NUQVRVU19JTlRDID0gMHgzLAorCV9fRjBfSU5UWF9TVEFUVVNfSU5URCA9IDB4NCwKK307CisKKyNkZWZpbmUgT1BfTU9ERQkJCQkweDAwMDE0NjBjCS8qIGN0CQkqLworI2RlZmluZSBfX0FQUF9FVEhfQ0xLX0xPV1NQRUVECQkweDAwMDAwMDA0CisjZGVmaW5lIF9fR0xPQkFMX0NPUkVDTEtfSEFMRlNQRUVECTB4MDAwMDAwMDIKKyNkZWZpbmUgX19HTE9CQUxfRkNPRV9NT0RFCQkweDAwMDAwMDAxCisjZGVmaW5lIEZXX0lOSVRfSEFMVF9QMAkJCTB4MDAwMTkxYWMJLyogY3QJCSovCisjZGVmaW5lIF9fRldfSU5JVF9IQUxUX1AJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRldfSU5JVF9IQUxUX1AxCQkJMHgwMDAxOTFiYwkvKiBjdAkJKi8KKyNkZWZpbmUgUE1NXzFUX1JFU0VUX1JFR19QMAkJMHgwMDAyMzgxYwkvKiBjdAkJKi8KKyNkZWZpbmUgX19QTU1fMVRfUkVTRVRfUAkJMHgwMDAwMDAwMQorI2RlZmluZSBQTU1fMVRfUkVTRVRfUkVHX1AxCQkweDAwMDIzYzFjCS8qIGN0CQkqLworCisvKioKKyAqIENhdGFwdWx0LTIgc3BlY2lmaWMgZGVmaW5lcworICovCisjZGVmaW5lIENUMl9QQ0lfQ1BRX0JBU0UJCTB4MDAwMzAwMDAKKyNkZWZpbmUgQ1QyX1BDSV9BUFBfQkFTRQkJMHgwMDAzMDEwMAorI2RlZmluZSBDVDJfUENJX0VUSF9CQVNFCQkweDAwMDMwNDAwCisKKy8qCisgKiBBUFAgYmxvY2sgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgQ1QyX0hPU1RGTl9JTlRfU1RBVFVTCQkoQ1QyX1BDSV9BUFBfQkFTRSArIDB4MDApCisjZGVmaW5lIENUMl9IT1NURk5fSU5UUl9NQVNLCQkoQ1QyX1BDSV9BUFBfQkFTRSArIDB4MDQpCisjZGVmaW5lIENUMl9IT1NURk5fUEVSU09OQUxJVFkwCQkoQ1QyX1BDSV9BUFBfQkFTRSArIDB4MDgpCisjZGVmaW5lIF9fUE1FX1NUQVRVU18JCQkweDAwMjAwMDAwCisjZGVmaW5lIF9fUEZfVkZfQkFSX1NJWkVfTU9ERV9fTUsJMHgwMDE4MDAwMAorI2RlZmluZSBfX1BGX1ZGX0JBUl9TSVpFX01PREVfX1NICTE5CisjZGVmaW5lIF9fUEZfVkZfQkFSX1NJWkVfTU9ERV8oX3YpCSgoX3YpIDw8IF9fUEZfVkZfQkFSX1NJWkVfTU9ERV9fU0gpCisjZGVmaW5lIF9fRkNfTExfUE9SVF9NQVBfX01LCQkweDAwMDYwMDAwCisjZGVmaW5lIF9fRkNfTExfUE9SVF9NQVBfX1NICQkxNworI2RlZmluZSBfX0ZDX0xMX1BPUlRfTUFQXyhfdikJCSgoX3YpIDw8IF9fRkNfTExfUE9SVF9NQVBfX1NIKQorI2RlZmluZSBfX1BGX1ZGX0FDVElWRV8JCQkweDAwMDEwMDAwCisjZGVmaW5lIF9fUEZfVkZfQ0ZHX1JEWV8JCTB4MDAwMDgwMDAKKyNkZWZpbmUgX19QRl9WRl9FTkFCTEVfCQkJMHgwMDAwNDAwMAorI2RlZmluZSBfX1BGX0RSSVZFUl9BQ1RJVkVfCQkweDAwMDAyMDAwCisjZGVmaW5lIF9fUEZfUE1FX1NFTkRfRU5BQkxFXwkJMHgwMDAwMTAwMAorI2RlZmluZSBfX1BGX0VYUk9NX09GRlNFVF9fTUsJCTB4MDAwMDBmZjAKKyNkZWZpbmUgX19QRl9FWFJPTV9PRkZTRVRfX1NICQk0CisjZGVmaW5lIF9fUEZfRVhST01fT0ZGU0VUXyhfdikJCSgoX3YpIDw8IF9fUEZfRVhST01fT0ZGU0VUX19TSCkKKyNkZWZpbmUgX19GQ19MTF9NT0RFXwkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgX19QRl9JTlRYX1BJTl8JCQkweDAwMDAwMDA3CisjZGVmaW5lIENUMl9IT1NURk5fUEVSU09OQUxJVFkxCQkoQ1QyX1BDSV9BUFBfQkFTRSArIDB4MEMpCisjZGVmaW5lIF9fUEZfTlVNX1FVRVVFUzFfX01LCQkweGZmMDAwMDAwCisjZGVmaW5lIF9fUEZfTlVNX1FVRVVFUzFfX1NICQkyNAorI2RlZmluZSBfX1BGX05VTV9RVUVVRVMxXyhfdikJCSgoX3YpIDw8IF9fUEZfTlVNX1FVRVVFUzFfX1NIKQorI2RlZmluZSBfX1BGX1ZGX1FVRV9PRkZTRVQxX19NSwkJMHgwMGZmMDAwMAorI2RlZmluZSBfX1BGX1ZGX1FVRV9PRkZTRVQxX19TSAkJMTYKKyNkZWZpbmUgX19QRl9WRl9RVUVfT0ZGU0VUMV8oX3YpCSgoX3YpIDw8IF9fUEZfVkZfUVVFX09GRlNFVDFfX1NIKQorI2RlZmluZSBfX1BGX1ZGX05VTV9RVUVVRVNfX01LCQkweDAwMDBmZjAwCisjZGVmaW5lIF9fUEZfVkZfTlVNX1FVRVVFU19fU0gJCTgKKyNkZWZpbmUgX19QRl9WRl9OVU1fUVVFVUVTXyhfdikJCSgoX3YpIDw8IF9fUEZfVkZfTlVNX1FVRVVFU19fU0gpCisjZGVmaW5lIF9fUEZfVkZfUVVFX09GRlNFVF8JCTB4MDAwMDAwZmYKKyNkZWZpbmUgQ1QyX0hPU1RGTl9QQUdFX05VTQkJKENUMl9QQ0lfQVBQX0JBU0UgKyAweDE4KQorI2RlZmluZSBDVDJfSE9TVEZOX01TSVhfVlRfSU5ERVhfTUJPWF9FUlIJKENUMl9QQ0lfQVBQX0JBU0UgKyAweDM4KQorCisvKgorICogQ2F0YXB1bHQtMiBDUFEgYmxvY2sgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgQ1QyX0hPU1RGTl9MUFUwX01CT1gwCQkoQ1QyX1BDSV9DUFFfQkFTRSArIDB4MDApCisjZGVmaW5lIENUMl9IT1NURk5fTFBVMV9NQk9YMAkJKENUMl9QQ0lfQ1BRX0JBU0UgKyAweDIwKQorI2RlZmluZSBDVDJfTFBVMF9IT1NURk5fTUJPWDAJCShDVDJfUENJX0NQUV9CQVNFICsgMHg0MCkKKyNkZWZpbmUgQ1QyX0xQVTFfSE9TVEZOX01CT1gwCQkoQ1QyX1BDSV9DUFFfQkFTRSArIDB4NjApCisjZGVmaW5lIENUMl9IT1NURk5fTFBVMF9DTURfU1RBVAkoQ1QyX1BDSV9DUFFfQkFTRSArIDB4ODApCisjZGVmaW5lIENUMl9IT1NURk5fTFBVMV9DTURfU1RBVAkoQ1QyX1BDSV9DUFFfQkFTRSArIDB4ODQpCisjZGVmaW5lIENUMl9MUFUwX0hPU1RGTl9DTURfU1RBVAkoQ1QyX1BDSV9DUFFfQkFTRSArIDB4ODgpCisjZGVmaW5lIENUMl9MUFUxX0hPU1RGTl9DTURfU1RBVAkoQ1QyX1BDSV9DUFFfQkFTRSArIDB4OGMpCisjZGVmaW5lIENUMl9IT1NURk5fTFBVMF9SRUFEX1NUQVQJKENUMl9QQ0lfQ1BRX0JBU0UgKyAweDkwKQorI2RlZmluZSBDVDJfSE9TVEZOX0xQVTFfUkVBRF9TVEFUCShDVDJfUENJX0NQUV9CQVNFICsgMHg5NCkKKyNkZWZpbmUgQ1QyX0xQVTBfSE9TVEZOX01CT1gwX01TSwkoQ1QyX1BDSV9DUFFfQkFTRSArIDB4OTgpCisjZGVmaW5lIENUMl9MUFUxX0hPU1RGTl9NQk9YMF9NU0sJKENUMl9QQ0lfQ1BRX0JBU0UgKyAweDlDKQorI2RlZmluZSBDVDJfSE9TVF9TRU0wX1JFRwkJMHgwMDAxNDhmMAorI2RlZmluZSBDVDJfSE9TVF9TRU0xX1JFRwkJMHgwMDAxNDhmNAorI2RlZmluZSBDVDJfSE9TVF9TRU0yX1JFRwkJMHgwMDAxNDhmOAorI2RlZmluZSBDVDJfSE9TVF9TRU0zX1JFRwkJMHgwMDAxNDhmYworI2RlZmluZSBDVDJfSE9TVF9TRU00X1JFRwkJMHgwMDAxNDkwMAorI2RlZmluZSBDVDJfSE9TVF9TRU01X1JFRwkJMHgwMDAxNDkwNAorI2RlZmluZSBDVDJfSE9TVF9TRU02X1JFRwkJMHgwMDAxNDkwOAorI2RlZmluZSBDVDJfSE9TVF9TRU03X1JFRwkJMHgwMDAxNDkwYworI2RlZmluZSBDVDJfSE9TVF9TRU0wX0lORk9fUkVHCQkweDAwMDE0OGIwCisjZGVmaW5lIENUMl9IT1NUX1NFTTFfSU5GT19SRUcJCTB4MDAwMTQ4YjQKKyNkZWZpbmUgQ1QyX0hPU1RfU0VNMl9JTkZPX1JFRwkJMHgwMDAxNDhiOAorI2RlZmluZSBDVDJfSE9TVF9TRU0zX0lORk9fUkVHCQkweDAwMDE0OGJjCisjZGVmaW5lIENUMl9IT1NUX1NFTTRfSU5GT19SRUcJCTB4MDAwMTQ4YzAKKyNkZWZpbmUgQ1QyX0hPU1RfU0VNNV9JTkZPX1JFRwkJMHgwMDAxNDhjNAorI2RlZmluZSBDVDJfSE9TVF9TRU02X0lORk9fUkVHCQkweDAwMDE0OGM4CisjZGVmaW5lIENUMl9IT1NUX1NFTTdfSU5GT19SRUcJCTB4MDAwMTQ4Y2MKKworI2RlZmluZSBDVDJfQVBQX1BMTF9MQ0xLX0NUTF9SRUcJMHgwMDAxNDgwOAorI2RlZmluZSBfX0FQUF9MUFVDTEtfSEFMRlNQRUVECQkweDQwMDAwMDAwCisjZGVmaW5lIF9fQVBQX1BMTF9MQ0xLX0xPQUQJCTB4MjAwMDAwMDAKKyNkZWZpbmUgX19BUFBfUExMX0xDTEtfRkJDTlRfTUsJCTB4MWZlMDAwMDAKKyNkZWZpbmUgX19BUFBfUExMX0xDTEtfRkJDTlRfU0gJCTIxCisjZGVmaW5lIF9fQVBQX1BMTF9MQ0xLX0ZCQ05UKF92KQkoKF92KSA8PCBfX0FQUF9QTExfU0NMS19GQkNOVF9TSCkKK2VudW0geworCV9fQVBQX1BMTF9MQ0xLX0ZCQ05UXzQyNV9NSFogPSA2LAorCV9fQVBQX1BMTF9MQ0xLX0ZCQ05UXzQ2OF9NSFogPSA0LAorfTsKKyNkZWZpbmUgX19BUFBfUExMX0xDTEtfRVhURkIJCTB4MDAwMDA4MDAKKyNkZWZpbmUgX19BUFBfUExMX0xDTEtfRU5PVVRTCQkweDAwMDAwNDAwCisjZGVmaW5lIF9fQVBQX1BMTF9MQ0xLX1JBVEUJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ1QyX0FQUF9QTExfU0NMS19DVExfUkVHCTB4MDAwMTQ4MGMKKyNkZWZpbmUgX19QX1NDTEtfUExMX0xPQ0sJCTB4ODAwMDAwMDAKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfUkVGQ0xLX1NFTAkweDQwMDAwMDAwCisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX0NMS19ESVYyCQkweDIwMDAwMDAwCisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX0xPQUQJCTB4MTAwMDAwMDAKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfRkJDTlRfTUsJCTB4MGZmMDAwMDAKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfRkJDTlRfU0gJCTIwCisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX0ZCQ05UKF92KQkoKF92KSA8PCBfX0FQUF9QTExfU0NMS19GQkNOVF9TSCkKK2VudW0geworCV9fQVBQX1BMTF9TQ0xLX0ZCQ05UX05PUk0gPSA2LAorCV9fQVBQX1BMTF9TQ0xLX0ZCQ05UXzEwR19GQyA9IDEwLAorfTsKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfRVhURkIJCTB4MDAwMDA4MDAKKyNkZWZpbmUgX19BUFBfUExMX1NDTEtfRU5PVVRTCQkweDAwMDAwNDAwCisjZGVmaW5lIF9fQVBQX1BMTF9TQ0xLX1JBVEUJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ1QyX1BDSUVfTUlTQ19SRUcJCTB4MDAwMTQ4MDQKKyNkZWZpbmUgX19FVEhfQ0xLX0VOQUJMRV9QT1JUMQkJMHgwMDAwMDAxMAorI2RlZmluZSBDVDJfQ0hJUF9NSVNDX1BSRwkJMHgwMDAxNDhhNAorI2RlZmluZSBfX0VUSF9DTEtfRU5BQkxFX1BPUlQwCQkweDAwMDA0MDAwCisjZGVmaW5lIF9fQVBQX0xQVV9TUEVFRAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ1QyX01CSVNUX1NUQVRfUkVHCQkweDAwMDE0ODE4CisjZGVmaW5lIENUMl9NQklTVF9DVExfUkVHCQkweDAwMDE0ODFjCisjZGVmaW5lIENUMl9QTU1fMVRfQ09OVFJPTF9SRUdfUDAJMHgwMDAyMzgxYworI2RlZmluZSBfX1BNTV8xVF9QTkRCX1AJCQkweDAwMDAwMDAyCisjZGVmaW5lIENUMl9QTU1fMVRfQ09OVFJPTF9SRUdfUDEJMHgwMDAyM2MxYworI2RlZmluZSBDVDJfV0dOX1NUQVRVUwkJCTB4MDAwMTQ5OTAKKyNkZWZpbmUgX19XR05fUkVBRFkJCQkweDAwMDAwNDAwCisjZGVmaW5lIF9fR0xCTF9QRl9WRl9DRkdfUkRZCQkweDAwMDAwMjAwCisjZGVmaW5lIENUMl9ORkNfQ1NSX1NFVF9SRUcJCTB4MDAwMjc0MjQKKyNkZWZpbmUgX19IQUxUX05GQ19DT05UUk9MTEVSCQkweDAwMDAwMDAyCisjZGVmaW5lIF9fTkZDX0NPTlRST0xMRVJfSEFMVEVECQkweDAwMDAxMDAwCisKKyNkZWZpbmUgQ1QyX0NTSV9NQUMwX0NPTlRST0xfUkVHCTB4MDAwMjcwZDAKKyNkZWZpbmUgX19DU0lfTUFDX1JFU0VUCQkJMHgwMDAwMDAxMAorI2RlZmluZSBfX0NTSV9NQUNfQUhCX1JFU0VUCQkweDAwMDAwMDA4CisjZGVmaW5lIENUMl9DU0lfTUFDMV9DT05UUk9MX1JFRwkweDAwMDI3MGQ0CisjZGVmaW5lIENUMl9DU0lfTUFDX0NPTlRST0xfUkVHKF9fbikJXAorCShDVDJfQ1NJX01BQzBfQ09OVFJPTF9SRUcgKwlcCisJKF9fbikgKiAoQ1QyX0NTSV9NQUMxX0NPTlRST0xfUkVHIC0gQ1QyX0NTSV9NQUMwX0NPTlRST0xfUkVHKSkKKworLyoKKyAqIE5hbWUgc2VtYXBob3JlIHJlZ2lzdGVycyBiYXNlZCBvbiB1c2FnZQorICovCisjZGVmaW5lIEJGQV9JT0MwX0hCRUFUX1JFRwkJSE9TVF9TRU0wX0lORk9fUkVHCisjZGVmaW5lIEJGQV9JT0MwX1NUQVRFX1JFRwkJSE9TVF9TRU0xX0lORk9fUkVHCisjZGVmaW5lIEJGQV9JT0MxX0hCRUFUX1JFRwkJSE9TVF9TRU0yX0lORk9fUkVHCisjZGVmaW5lIEJGQV9JT0MxX1NUQVRFX1JFRwkJSE9TVF9TRU0zX0lORk9fUkVHCisjZGVmaW5lIEJGQV9GV19VU0VfQ09VTlQJCUhPU1RfU0VNNF9JTkZPX1JFRworI2RlZmluZSBCRkFfSU9DX0ZBSUxfU1lOQwkJSE9TVF9TRU01X0lORk9fUkVHCisKKy8qCisgKiBDVDIgc2VtYXBob3JlIHJlZ2lzdGVyIGxvY2F0aW9ucyBjaGFuZ2VkCisgKi8KKyNkZWZpbmUgQ1QyX0JGQV9JT0MwX0hCRUFUX1JFRwkJQ1QyX0hPU1RfU0VNMF9JTkZPX1JFRworI2RlZmluZSBDVDJfQkZBX0lPQzBfU1RBVEVfUkVHCQlDVDJfSE9TVF9TRU0xX0lORk9fUkVHCisjZGVmaW5lIENUMl9CRkFfSU9DMV9IQkVBVF9SRUcJCUNUMl9IT1NUX1NFTTJfSU5GT19SRUcKKyNkZWZpbmUgQ1QyX0JGQV9JT0MxX1NUQVRFX1JFRwkJQ1QyX0hPU1RfU0VNM19JTkZPX1JFRworI2RlZmluZSBDVDJfQkZBX0ZXX1VTRV9DT1VOVAkJQ1QyX0hPU1RfU0VNNF9JTkZPX1JFRworI2RlZmluZSBDVDJfQkZBX0lPQ19GQUlMX1NZTkMJCUNUMl9IT1NUX1NFTTVfSU5GT19SRUcKKworI2RlZmluZSBDUEVfUV9OVU0oX19mbiwgX19xKQkoKChfX2ZuKSA8PCAyKSArIChfX3EpKQorI2RlZmluZSBSTUVfUV9OVU0oX19mbiwgX19xKQkoKChfX2ZuKSA8PCAyKSArIChfX3EpKQorCisvKgorICogQW5kIGNvcnJlc3BvbmRpbmcgaG9zdCBpbnRlcnJ1cHQgc3RhdHVzIGJpdCBmaWVsZCBkZWZpbmVzCisgKi8KKyNkZWZpbmUgX19IRk5fSU5UX0NQRV9RMAkweDAwMDAwMDAxVQorI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1ExCTB4MDAwMDAwMDJVCisjZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTIJMHgwMDAwMDAwNFUKKyNkZWZpbmUgX19IRk5fSU5UX0NQRV9RMwkweDAwMDAwMDA4VQorI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1E0CTB4MDAwMDAwMTBVCisjZGVmaW5lIF9fSEZOX0lOVF9DUEVfUTUJMHgwMDAwMDAyMFUKKyNkZWZpbmUgX19IRk5fSU5UX0NQRV9RNgkweDAwMDAwMDQwVQorI2RlZmluZSBfX0hGTl9JTlRfQ1BFX1E3CTB4MDAwMDAwODBVCisjZGVmaW5lIF9fSEZOX0lOVF9STUVfUTAJMHgwMDAwMDEwMFUKKyNkZWZpbmUgX19IRk5fSU5UX1JNRV9RMQkweDAwMDAwMjAwVQorI2RlZmluZSBfX0hGTl9JTlRfUk1FX1EyCTB4MDAwMDA0MDBVCisjZGVmaW5lIF9fSEZOX0lOVF9STUVfUTMJMHgwMDAwMDgwMFUKKyNkZWZpbmUgX19IRk5fSU5UX1JNRV9RNAkweDAwMDAxMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfUk1FX1E1CTB4MDAwMDIwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9STUVfUTYJMHgwMDAwNDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX1JNRV9RNwkweDAwMDA4MDAwVQorI2RlZmluZSBfX0hGTl9JTlRfRVJSX0VNQwkweDAwMDEwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfRVJSX0xQVTAJMHgwMDAyMDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX0VSUl9MUFUxCTB4MDAwNDAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9FUlJfUFNTCTB4MDAwODAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9NQk9YX0xQVTAJMHgwMDEwMDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX01CT1hfTFBVMQkweDAwMjAwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfTUJPWDFfTFBVMAkweDAwNDAwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfTUJPWDFfTFBVMQkweDAwODAwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfTExfSEFMVAkweDAxMDAwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfQ1BFX01BU0sJMHgwMDAwMDBmZlUKKyNkZWZpbmUgX19IRk5fSU5UX1JNRV9NQVNLCTB4MDAwMGZmMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9FUlJfTUFTSwlcCisJKF9fSEZOX0lOVF9FUlJfRU1DIHwgX19IRk5fSU5UX0VSUl9MUFUwIHwgX19IRk5fSU5UX0VSUl9MUFUxIHwgXAorCSBfX0hGTl9JTlRfRVJSX1BTUyB8IF9fSEZOX0lOVF9MTF9IQUxUKQorI2RlZmluZSBfX0hGTl9JTlRfRk4wX01BU0sJXAorCShfX0hGTl9JTlRfQ1BFX1EwIHwgX19IRk5fSU5UX0NQRV9RMSB8IF9fSEZOX0lOVF9DUEVfUTIgfCBcCisJIF9fSEZOX0lOVF9DUEVfUTMgfCBfX0hGTl9JTlRfUk1FX1EwIHwgX19IRk5fSU5UX1JNRV9RMSB8IFwKKwkgX19IRk5fSU5UX1JNRV9RMiB8IF9fSEZOX0lOVF9STUVfUTMgfCBfX0hGTl9JTlRfTUJPWF9MUFUwKQorI2RlZmluZSBfX0hGTl9JTlRfRk4xX01BU0sJXAorCShfX0hGTl9JTlRfQ1BFX1E0IHwgX19IRk5fSU5UX0NQRV9RNSB8IF9fSEZOX0lOVF9DUEVfUTYgfCBcCisJIF9fSEZOX0lOVF9DUEVfUTcgfCBfX0hGTl9JTlRfUk1FX1E0IHwgX19IRk5fSU5UX1JNRV9RNSB8IFwKKwkgX19IRk5fSU5UX1JNRV9RNiB8IF9fSEZOX0lOVF9STUVfUTcgfCBfX0hGTl9JTlRfTUJPWF9MUFUxKQorCisvKgorICogSG9zdCBpbnRlcnJ1cHQgc3RhdHVzIGRlZmluZXMgZm9yIGNhdGFwdWx0LTIKKyAqLworI2RlZmluZSBfX0hGTl9JTlRfTUJPWF9MUFUwX0NUMgkweDAwMDEwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfTUJPWF9MUFUxX0NUMgkweDAwMDIwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfRVJSX1BTU19DVDIJMHgwMDA0MDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX0VSUl9MUFUwX0NUMgkweDAwMDgwMDAwVQorI2RlZmluZSBfX0hGTl9JTlRfRVJSX0xQVTFfQ1QyCTB4MDAxMDAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9DUFFfSEFMVF9DVDIJMHgwMDIwMDAwMFUKKyNkZWZpbmUgX19IRk5fSU5UX0VSUl9XR05fQ1QyCTB4MDA0MDAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9FUlJfTEVIUlhfQ1QyCTB4MDA4MDAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9FUlJfTEVIVFhfQ1QyCTB4MDEwMDAwMDBVCisjZGVmaW5lIF9fSEZOX0lOVF9FUlJfTUFTS19DVDIJXAorCShfX0hGTl9JTlRfRVJSX1BTU19DVDIgfCBfX0hGTl9JTlRfRVJSX0xQVTBfQ1QyIHwgXAorCSBfX0hGTl9JTlRfRVJSX0xQVTFfQ1QyIHwgX19IRk5fSU5UX0NQUV9IQUxUX0NUMiB8IFwKKwkgX19IRk5fSU5UX0VSUl9XR05fQ1QyIHwgX19IRk5fSU5UX0VSUl9MRUhSWF9DVDIgfCBcCisJIF9fSEZOX0lOVF9FUlJfTEVIVFhfQ1QyKQorI2RlZmluZSBfX0hGTl9JTlRfRk4wX01BU0tfQ1QyCVwKKwkoX19IRk5fSU5UX0NQRV9RMCB8IF9fSEZOX0lOVF9DUEVfUTEgfCBfX0hGTl9JTlRfQ1BFX1EyIHwgXAorCSBfX0hGTl9JTlRfQ1BFX1EzIHwgX19IRk5fSU5UX1JNRV9RMCB8IF9fSEZOX0lOVF9STUVfUTEgfCBcCisJIF9fSEZOX0lOVF9STUVfUTIgfCBfX0hGTl9JTlRfUk1FX1EzIHwgX19IRk5fSU5UX01CT1hfTFBVMF9DVDIpCisjZGVmaW5lIF9fSEZOX0lOVF9GTjFfTUFTS19DVDIJXAorCShfX0hGTl9JTlRfQ1BFX1E0IHwgX19IRk5fSU5UX0NQRV9RNSB8IF9fSEZOX0lOVF9DUEVfUTYgfCBcCisJIF9fSEZOX0lOVF9DUEVfUTcgfCBfX0hGTl9JTlRfUk1FX1E0IHwgX19IRk5fSU5UX1JNRV9RNSB8IFwKKwkgX19IRk5fSU5UX1JNRV9RNiB8IF9fSEZOX0lOVF9STUVfUTcgfCBfX0hGTl9JTlRfTUJPWF9MUFUxX0NUMikKKworLyoKKyAqIGFzaWMgbWVtb3J5IG1hcC4KKyAqLworI2RlZmluZSBQU1NfU01FTV9QQUdFX1NUQVJUCQkweDgwMDAKKyNkZWZpbmUgUFNTX1NNRU1fUEdOVU0oX3BnMCwgX21hKQkoKF9wZzApICsgKChfbWEpID4+IDE1KSkKKyNkZWZpbmUgUFNTX1NNRU1fUEdPRkYoX21hKQkJKChfbWEpICYgMHg3ZmZmKQorCisjZW5kaWYgLyogX19CRklfUkVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy81N3h4X2hzaV9ibngyZmMuaCBiL2RyaXZlcnMvc2NzaS9ibngyZmMvNTd4eF9oc2lfYm54MmZjLmgKaW5kZXggOTdhNjFiNC4uZTFmMWUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy81N3h4X2hzaV9ibngyZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjLzU3eHhfaHNpX2JueDJmYy5oCkBAIC0xOSw2ICsxOSwyMyBAQAogLyoKICAqIGRvb3JiZWxsIG1lc3NhZ2Ugc2VudCB0byB0aGUgY2hpcAogICovCitzdHJ1Y3QgYjU3N3h4X2Rvb3JiZWxsIHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgemVyb19maWxsMjsKKwl1OCB6ZXJvX2ZpbGwxOworCXN0cnVjdCBiNTc3eHhfZG9vcmJlbGxfaGRyIGhlYWRlcjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXN0cnVjdCBiNTc3eHhfZG9vcmJlbGxfaGRyIGhlYWRlcjsKKwl1OCB6ZXJvX2ZpbGwxOworCXUxNiB6ZXJvX2ZpbGwyOworI2VuZGlmCit9OworCisKKworLyoKKyAqIGRvb3JiZWxsIG1lc3NhZ2Ugc2VudCB0byB0aGUgY2hpcAorICovCiBzdHJ1Y3QgYjU3N3h4X2Rvb3JiZWxsX3NldF9wcm9kIHsKICNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKIAl1MTYgcHJvZDsKQEAgLTM5LDEwNiArNTYsNjMgQEAKIAogCiAvKgotICogRml4ZWQgc2l6ZSBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8gcGxhbnQgaXQgaW4gVW5pb24gc3RydWN0dXJlCisgKiBBQlRTIGluZm8gJCRLRUVQX0VORElBTk5FU1MkJAogICovCi1zdHJ1Y3QgZmNvZV9hYnRzX3JzcF91bmlvbiB7Ci0JdTMyIHJfY3RsOwotCXUzMiBhYnRzX3JzcF9wYXlsb2FkWzddOworc3RydWN0IGZjb2VfYWJ0c19pbmZvIHsKKwlfX2xlMTYgYWJvcnRlZF90YXNrX2lkOworCV9fbGUxNiByZXNlcnZlZDA7CisJX19sZTMyIHJlc2VydmVkMTsKIH07CiAKIAogLyoKLSAqIDQgcmVncyBzaXplCisgKiBGaXhlZCBzaXplIHN0cnVjdHVyZSBpbiBvcmRlciB0byBwbGFudCBpdCBpbiBVbmlvbiBzdHJ1Y3R1cmUKKyAqICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfYWJ0c19yc3BfdW5pb24geworCXU4IHJfY3RsOworCXU4IHJzcnZbM107CisJX19sZTMyIGFidHNfcnNwX3BheWxvYWRbN107Cit9OworCisKKy8qCisgKiA0IHJlZ3Mgc2l6ZSAkJEtFRVBfRU5ESUFOTkVTUyQkCiAgKi8KIHN0cnVjdCBmY29lX2JkX2N0eCB7Ci0JdTMyIGJ1Zl9hZGRyX2hpOwotCXUzMiBidWZfYWRkcl9sbzsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgcnNydjA7Ci0JdTE2IGJ1Zl9sZW47Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgYnVmX2xlbjsKLQl1MTYgcnNydjA7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgcnNydjE7Ci0JdTE2IGZsYWdzOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IGZsYWdzOwotCXUxNiByc3J2MTsKLSNlbmRpZgorCV9fbGUzMiBidWZfYWRkcl9oaTsKKwlfX2xlMzIgYnVmX2FkZHJfbG87CisJX19sZTE2IGJ1Zl9sZW47CisJX19sZTE2IHJzcnYwOworCV9fbGUxNiBmbGFnczsKKwlfX2xlMTYgcnNydjE7CiB9OwogCiAKLXN0cnVjdCBmY29lX2NsZWFudXBfZmxvd19pbmZvIHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgcmVzZXJ2ZWQxOwotCXUxNiB0YXNrX2lkOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHRhc2tfaWQ7Ci0JdTE2IHJlc2VydmVkMTsKLSNlbmRpZgotCXUzMiByZXNlcnZlZDJbN107CisvKgorICogRkNvRSBjYWNoZWQgc2dlcyBjb250ZXh0ICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfY2FjaGVkX3NnZV9jdHggeworCXN0cnVjdCByZWdwYWlyIGN1cl9idWZfYWRkcjsKKwlfX2xlMTYgY3VyX2J1Zl9yZW07CisJX19sZTE2IHNlY29uZF9idWZfcmVtOworCXN0cnVjdCByZWdwYWlyIHNlY29uZF9idWZfYWRkcjsKIH07CiAKIAotc3RydWN0IGZjb2VfZmNwX2NtZF9wYXlsb2FkIHsKLQl1MzIgb3BhcXVlWzhdOwotfTsKLQotc3RydWN0IGZjb2VfZmNfaGRyIHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBjc19jdGw7Ci0JdTggc19pZFszXTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IHNfaWRbM107Ci0JdTggY3NfY3RsOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggcl9jdGw7Ci0JdTggZF9pZFszXTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IGRfaWRbM107Ci0JdTggcl9jdGw7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBzZXFfaWQ7Ci0JdTggZGZfY3RsOwotCXUxNiBzZXFfY250OwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHNlcV9jbnQ7Ci0JdTggZGZfY3RsOwotCXU4IHNlcV9pZDsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IHR5cGU7Ci0JdTggZl9jdGxbM107Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBmX2N0bFszXTsKLQl1OCB0eXBlOwotI2VuZGlmCi0JdTMyIHBhcmFtZXRlcnM7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IG94X2lkOwotCXUxNiByeF9pZDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiByeF9pZDsKLQl1MTYgb3hfaWQ7Ci0jZW5kaWYKLX07Ci0KLXN0cnVjdCBmY29lX2ZjX2ZyYW1lIHsKLQlzdHJ1Y3QgZmNvZV9mY19oZHIgZmNfaGRyOwotCXUzMiByZXNlcnZlZDBbMl07Ci19OwotCi11bmlvbiBmY29lX2NtZF9mbG93X2luZm8gewotCXN0cnVjdCBmY29lX2ZjcF9jbWRfcGF5bG9hZCBmY3BfY21kX3BheWxvYWQ7Ci0Jc3RydWN0IGZjb2VfZmNfZnJhbWUgbXBfZmNfZnJhbWU7CisvKgorICogQ2xlYW51cCBpbmZvICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfY2xlYW51cF9pbmZvIHsKKwlfX2xlMTYgY2xlYW5lZF90YXNrX2lkOworCV9fbGUxNiByb2xsZWRfdHhfc2VxX2NudDsKKwlfX2xlMzIgcm9sbGVkX3R4X2RhdGFfb2Zmc2V0OwogfTsKIAogCi0KKy8qCisgKiBGY3AgUlNQIGZsYWdzICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLwogc3RydWN0IGZjb2VfZmNwX3JzcF9mbGFncyB7CiAJdTggZmxhZ3M7CiAjZGVmaW5lIEZDT0VfRkNQX1JTUF9GTEFHU19GQ1BfUlNQX0xFTl9WQUxJRCAoMHgxPDwwKQpAQCAtMTU1LDk1ICsxMjksMTY4IEBACiAjZGVmaW5lIEZDT0VfRkNQX1JTUF9GTEFHU19GQ1BfQklESV9GTEFHU19TSElGVCA1CiB9OwogCi0KKy8qCisgKiBGY3AgUlNQIHBheWxvYWQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCiBzdHJ1Y3QgZmNvZV9mY3BfcnNwX3BheWxvYWQgewogCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkMDsKLQl1MzIgZmNwX3Jlc2lkOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiByZXRyeV9kZWxheV90aW1lcjsKLQlzdHJ1Y3QgZmNvZV9mY3BfcnNwX2ZsYWdzIGZjcF9mbGFnczsKLQl1OCBzY3NpX3N0YXR1c19jb2RlOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJX19sZTMyIGZjcF9yZXNpZDsKIAl1OCBzY3NpX3N0YXR1c19jb2RlOwogCXN0cnVjdCBmY29lX2ZjcF9yc3BfZmxhZ3MgZmNwX2ZsYWdzOwotCXUxNiByZXRyeV9kZWxheV90aW1lcjsKLSNlbmRpZgotCXUzMiBmY3BfcnNwX2xlbjsKLQl1MzIgZmNwX3Nuc19sZW47CisJX19sZTE2IHJldHJ5X2RlbGF5X3RpbWVyOworCV9fbGUzMiBmY3BfcnNwX2xlbjsKKwlfX2xlMzIgZmNwX3Nuc19sZW47CiB9OwogCi0KIC8qCiAgKiBGaXhlZCBzaXplIHN0cnVjdHVyZSBpbiBvcmRlciB0byBwbGFudCBpdCBpbiBVbmlvbiBzdHJ1Y3R1cmUKKyAqICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogc3RydWN0IGZjb2VfZmNwX3JzcF91bmlvbiB7CiAJc3RydWN0IGZjb2VfZmNwX3JzcF9wYXlsb2FkIHBheWxvYWQ7CiAJc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWQwOwogfTsKIAotCi1zdHJ1Y3QgZmNvZV9mY3BfeGZyX3JkeV9wYXlsb2FkIHsKLQl1MzIgYnVyc3RfbGVuOwotCXUzMiBkYXRhX3JvOworLyoKKyAqIEZDIGhlYWRlciAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2ZjX2hkciB7CisJdTggc19pZFszXTsKKwl1OCBjc19jdGw7CisJdTggZF9pZFszXTsKKwl1OCByX2N0bDsKKwlfX2xlMTYgc2VxX2NudDsKKwl1OCBkZl9jdGw7CisJdTggc2VxX2lkOworCXU4IGZfY3RsWzNdOworCXU4IHR5cGU7CisJX19sZTMyIHBhcmFtZXRlcnM7CisJX19sZTE2IHJ4X2lkOworCV9fbGUxNiBveF9pZDsKIH07CiAKLXN0cnVjdCBmY29lX3JlYWRfZmxvd19pbmZvIHsKLQlzdHJ1Y3QgZmNvZV9mY19oZHIgZmNfZGF0YV9pbl9oZHI7Ci0JdTMyIHJlc2VydmVkWzJdOworLyoKKyAqIEZDIGhlYWRlciB1bmlvbiAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX21wX3JzcF91bmlvbiB7CisJc3RydWN0IGZjb2VfZmNfaGRyIGZjX2hkcjsKKwlfX2xlMzIgbXBfcGF5bG9hZF9sZW47CisJX19sZTMyIHJzcnY7CiB9OwogCi1zdHJ1Y3QgZmNvZV93cml0ZV9mbG93X2luZm8gewotCXN0cnVjdCBmY29lX2ZjX2hkciBmY19kYXRhX291dF9oZHI7Ci0Jc3RydWN0IGZjb2VfZmNwX3hmcl9yZHlfcGF5bG9hZCBmY3BfeGZyX3BheWxvYWQ7Ci19OwotCi11bmlvbiBmY29lX3JzcF9mbG93X2luZm8geworLyoKKyAqIENvbXBsZXRpb24gaW5mb3JtYXRpb24gJCRLRUVQX0VORElBTk5FU1MkJAorICovCit1bmlvbiBmY29lX2NvbXBfZmxvd19pbmZvIHsKIAlzdHJ1Y3QgZmNvZV9mY3BfcnNwX3VuaW9uIGZjcF9yc3A7CiAJc3RydWN0IGZjb2VfYWJ0c19yc3BfdW5pb24gYWJ0c19yc3A7CisJc3RydWN0IGZjb2VfbXBfcnNwX3VuaW9uIG1wX3JzcDsKKwlfX2xlMzIgb3BhcXVlWzhdOwogfTsKIAorCiAvKgotICogMzIgYnl0ZXMgdXNlZCBmb3IgZ2VuZXJhbCBwdXJwb3NlcworICogRXh0ZXJuYWwgQUJUUyBpbmZvICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwotdW5pb24gZmNvZV9nZW5lcmFsX3Rhc2tfY3R4IHsKLQl1bmlvbiBmY29lX2NtZF9mbG93X2luZm8gY21kX2luZm87Ci0Jc3RydWN0IGZjb2VfcmVhZF9mbG93X2luZm8gcmVhZF9pbmZvOwotCXN0cnVjdCBmY29lX3dyaXRlX2Zsb3dfaW5mbyB3cml0ZV9pbmZvOwotCXVuaW9uIGZjb2VfcnNwX2Zsb3dfaW5mbyByc3BfaW5mbzsKLQlzdHJ1Y3QgZmNvZV9jbGVhbnVwX2Zsb3dfaW5mbyBjbGVhbnVwX2luZm87Ci0JdTMyIGNvbXBfaW5mb1s4XTsKK3N0cnVjdCBmY29lX2V4dF9hYnRzX2luZm8geworCV9fbGUzMiByc3J2MFs2XTsKKwlzdHJ1Y3QgZmNvZV9hYnRzX2luZm8gY3R4OwogfTsKIAogCiAvKgotICogRkNvRSBLQ1EgQ1FFIHBhcmFtZXRlcnMKKyAqIEV4dGVybmFsIGNsZWFudXAgaW5mbyAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2V4dF9jbGVhbnVwX2luZm8geworCV9fbGUzMiByc3J2MFs2XTsKKwlzdHJ1Y3QgZmNvZV9jbGVhbnVwX2luZm8gY3R4OworfTsKKworCisvKgorICogRmNvZSBGVyBUeCBzZXF1ZW5jZSBjb250ZXh0ICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfZndfdHhfc2VxX2N0eCB7CisJX19sZTMyIGRhdGFfb2Zmc2V0OworCV9fbGUxNiBzZXFfY250OworCV9fbGUxNiByc3J2MDsKK307CisKKy8qCisgKiBGY29lIGV4dGVybmFsIEZXIFR4IHNlcXVlbmNlIGNvbnRleHQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9leHRfZndfdHhfc2VxX2N0eCB7CisJX19sZTMyIHJzcnYwWzZdOworCXN0cnVjdCBmY29lX2Z3X3R4X3NlcV9jdHggY3R4OworfTsKKworCisvKgorICogRkNvRSBtdWx0aXBsZSBzZ2VzIGNvbnRleHQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9tdWxfc2dlc19jdHggeworCXN0cnVjdCByZWdwYWlyIGN1cl9zZ2VfYWRkcjsKKwlfX2xlMTYgY3VyX3NnZV9vZmY7CisJdTggY3VyX3NnZV9pZHg7CisJdTggc2dsX3NpemU7Cit9OworCisvKgorICogRkNvRSBleHRlcm5hbCBtdWx0aXBsZSBzZ2VzIGNvbnRleHQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9leHRfbXVsX3NnZXNfY3R4IHsKKwlzdHJ1Y3QgZmNvZV9tdWxfc2dlc19jdHggbXVsX3NnbDsKKwlzdHJ1Y3QgcmVncGFpciByc3J2MDsKK307CisKKworLyoKKyAqIEZDUCBDTUQgcGF5bG9hZCAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2ZjcF9jbWRfcGF5bG9hZCB7CisJX19sZTMyIG9wYXF1ZVs4XTsKK307CisKKworCisKKworLyoKKyAqIEZjcCB4ZnIgcmR5IHBheWxvYWQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9mY3BfeGZyX3JkeV9wYXlsb2FkIHsKKwlfX2xlMzIgYnVyc3RfbGVuOworCV9fbGUzMiBkYXRhX3JvOworfTsKKworCisvKgorICogRkMgZnJhbWUgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9mY19mcmFtZSB7CisJc3RydWN0IGZjb2VfZmNfaGRyIGZjX2hkcjsKKwlfX2xlMzIgcmVzZXJ2ZWQwWzJdOworfTsKKworCisKKworLyoKKyAqIEZDb0UgS0NRIENRRSBwYXJhbWV0ZXJzICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogdW5pb24gZmNvZV9rY3FlX3BhcmFtcyB7Ci0JdTMyIHJlc2VydmVkMFs0XTsKKwlfX2xlMzIgcmVzZXJ2ZWQwWzRdOwogfTsKIAogLyoKLSAqIEZDb0UgS0NRIENRRQorICogRkNvRSBLQ1EgQ1FFICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogc3RydWN0IGZjb2Vfa2NxZSB7Ci0JdTMyIGZjb2VfY29ubl9pZDsKLQl1MzIgY29tcGxldGlvbl9zdGF0dXM7Ci0JdTMyIGZjb2VfY29ubl9jb250ZXh0X2lkOworCV9fbGUzMiBmY29lX2Nvbm5faWQ7CisJX19sZTMyIGNvbXBsZXRpb25fc3RhdHVzOworCV9fbGUzMiBmY29lX2Nvbm5fY29udGV4dF9pZDsKIAl1bmlvbiBmY29lX2tjcWVfcGFyYW1zIHBhcmFtczsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBmbGFnczsKLSNkZWZpbmUgRkNPRV9LQ1FFX1JFU0VSVkVEMCAoMHg3PDwwKQotI2RlZmluZSBGQ09FX0tDUUVfUkVTRVJWRUQwX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9LQ1FFX1JBTVJPRF9DT01QTEVUSU9OICgweDE8PDMpCi0jZGVmaW5lIEZDT0VfS0NRRV9SQU1ST0RfQ09NUExFVElPTl9TSElGVCAzCi0jZGVmaW5lIEZDT0VfS0NRRV9MQVlFUl9DT0RFICgweDc8PDQpCi0jZGVmaW5lIEZDT0VfS0NRRV9MQVlFUl9DT0RFX1NISUZUIDQKLSNkZWZpbmUgRkNPRV9LQ1FFX0xJTktFRF9XSVRIX05FWFQgKDB4MTw8NykKLSNkZWZpbmUgRkNPRV9LQ1FFX0xJTktFRF9XSVRIX05FWFRfU0hJRlQgNwotCXU4IG9wX2NvZGU7Ci0JdTE2IHFlX3NlbGZfc2VxOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHFlX3NlbGZfc2VxOworCV9fbGUxNiBxZV9zZWxmX3NlcTsKIAl1OCBvcF9jb2RlOwogCXU4IGZsYWdzOwogI2RlZmluZSBGQ09FX0tDUUVfUkVTRVJWRUQwICgweDc8PDApCkBAIC0yNTQsMjMgKzMwMSwxNCBAQAogI2RlZmluZSBGQ09FX0tDUUVfTEFZRVJfQ09ERV9TSElGVCA0CiAjZGVmaW5lIEZDT0VfS0NRRV9MSU5LRURfV0lUSF9ORVhUICgweDE8PDcpCiAjZGVmaW5lIEZDT0VfS0NRRV9MSU5LRURfV0lUSF9ORVhUX1NISUZUIDcKLSNlbmRpZgogfTsKIAorCisKIC8qCi0gKiBGQ29FIEtXUUUgaGVhZGVyCisgKiBGQ29FIEtXUUUgaGVhZGVyICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IGZsYWdzOwotI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX1JFU0VSVkVEMCAoMHhGPDwwKQotI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX1JFU0VSVkVEMF9TSElGVCAwCi0jZGVmaW5lIEZDT0VfS1dRRV9IRUFERVJfTEFZRVJfQ09ERSAoMHg3PDw0KQotI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX0xBWUVSX0NPREVfU0hJRlQgNAotI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX1JFU0VSVkVEMSAoMHgxPDw3KQotI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX1JFU0VSVkVEMV9TSElGVCA3Ci0JdTggb3BfY29kZTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQogCXU4IG9wX2NvZGU7CiAJdTggZmxhZ3M7CiAjZGVmaW5lIEZDT0VfS1dRRV9IRUFERVJfUkVTRVJWRUQwICgweEY8PDApCkBAIC0yNzksNTAgKzMxNywyMyBAQAogI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX0xBWUVSX0NPREVfU0hJRlQgNAogI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX1JFU0VSVkVEMSAoMHgxPDw3KQogI2RlZmluZSBGQ09FX0tXUUVfSEVBREVSX1JFU0VSVkVEMV9TSElGVCA3Ci0jZW5kaWYKIH07CiAKIC8qCi0gKiBGQ29FIGZpcm13YXJlIGluaXQgcmVxdWVzdCAxCisgKiBGQ29FIGZpcm13YXJlIGluaXQgcmVxdWVzdCAxICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogc3RydWN0IGZjb2Vfa3dxZV9pbml0MSB7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJX19sZTE2IG51bV90YXNrczsKIAlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0JdTE2IG51bV90YXNrczsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBudW1fdGFza3M7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotI2VuZGlmCi0JdTMyIHRhc2tfbGlzdF9wYmxfYWRkcl9sbzsKLQl1MzIgdGFza19saXN0X3BibF9hZGRyX2hpOwotCXUzMiBkdW1teV9idWZmZXJfYWRkcl9sbzsKLQl1MzIgZHVtbXlfYnVmZmVyX2FkZHJfaGk7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJxX251bV93cWVzOwotCXUxNiBzcV9udW1fd3FlczsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBzcV9udW1fd3FlczsKLQl1MTYgcnFfbnVtX3dxZXM7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgY3FfbnVtX3dxZXM7Ci0JdTE2IHJxX2J1ZmZlcl9sb2dfc2l6ZTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBycV9idWZmZXJfbG9nX3NpemU7Ci0JdTE2IGNxX251bV93cWVzOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggZmxhZ3M7Ci0jZGVmaW5lIEZDT0VfS1dRRV9JTklUMV9MT0dfUEFHRV9TSVpFICgweEY8PDApCi0jZGVmaW5lIEZDT0VfS1dRRV9JTklUMV9MT0dfUEFHRV9TSVpFX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9LV1FFX0lOSVQxX0xPR19DQUNIRURfUEJFU19QRVJfRlVOQyAoMHg3PDw0KQotI2RlZmluZSBGQ09FX0tXUUVfSU5JVDFfTE9HX0NBQ0hFRF9QQkVTX1BFUl9GVU5DX1NISUZUIDQKLSNkZWZpbmUgRkNPRV9LV1FFX0lOSVQxX1JFU0VSVkVEMSAoMHgxPDw3KQotI2RlZmluZSBGQ09FX0tXUUVfSU5JVDFfUkVTRVJWRUQxX1NISUZUIDcKLQl1OCBudW1fc2Vzc2lvbnNfbG9nOwotCXUxNiBtdHU7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgbXR1OworCV9fbGUzMiB0YXNrX2xpc3RfcGJsX2FkZHJfbG87CisJX19sZTMyIHRhc2tfbGlzdF9wYmxfYWRkcl9oaTsKKwlfX2xlMzIgZHVtbXlfYnVmZmVyX2FkZHJfbG87CisJX19sZTMyIGR1bW15X2J1ZmZlcl9hZGRyX2hpOworCV9fbGUxNiBzcV9udW1fd3FlczsKKwlfX2xlMTYgcnFfbnVtX3dxZXM7CisJX19sZTE2IHJxX2J1ZmZlcl9sb2dfc2l6ZTsKKwlfX2xlMTYgY3FfbnVtX3dxZXM7CisJX19sZTE2IG10dTsKIAl1OCBudW1fc2Vzc2lvbnNfbG9nOwogCXU4IGZsYWdzOwogI2RlZmluZSBGQ09FX0tXUUVfSU5JVDFfTE9HX1BBR0VfU0laRSAoMHhGPDwwKQpAQCAtMzMxLDExMyArMzQyLDczIEBACiAjZGVmaW5lIEZDT0VfS1dRRV9JTklUMV9MT0dfQ0FDSEVEX1BCRVNfUEVSX0ZVTkNfU0hJRlQgNAogI2RlZmluZSBGQ09FX0tXUUVfSU5JVDFfUkVTRVJWRUQxICgweDE8PDcpCiAjZGVmaW5lIEZDT0VfS1dRRV9JTklUMV9SRVNFUlZFRDFfU0hJRlQgNwotI2VuZGlmCiB9OwogCiAvKgotICogRkNvRSBmaXJtd2FyZSBpbml0IHJlcXVlc3QgMgorICogRkNvRSBmaXJtd2FyZSBpbml0IHJlcXVlc3QgMiAkJEtFRVBfRU5ESUFOTkVTUyQkCiAgKi8KIHN0cnVjdCBmY29lX2t3cWVfaW5pdDIgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXU4IGhzaV9tYWpvcl92ZXJzaW9uOworCXU4IGhzaV9taW5vcl92ZXJzaW9uOwogCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLQl1MTYgcmVzZXJ2ZWQwOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHJlc2VydmVkMDsKLQlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0jZW5kaWYKLQl1MzIgaGFzaF90YmxfcGJsX2FkZHJfbG87Ci0JdTMyIGhhc2hfdGJsX3BibF9hZGRyX2hpOwotCXUzMiB0Ml9oYXNoX3RibF9hZGRyX2xvOwotCXUzMiB0Ml9oYXNoX3RibF9hZGRyX2hpOwotCXUzMiB0Ml9wdHJfaGFzaF90YmxfYWRkcl9sbzsKLQl1MzIgdDJfcHRyX2hhc2hfdGJsX2FkZHJfaGk7Ci0JdTMyIGZyZWVfbGlzdF9jb3VudDsKKwlfX2xlMzIgaGFzaF90YmxfcGJsX2FkZHJfbG87CisJX19sZTMyIGhhc2hfdGJsX3BibF9hZGRyX2hpOworCV9fbGUzMiB0Ml9oYXNoX3RibF9hZGRyX2xvOworCV9fbGUzMiB0Ml9oYXNoX3RibF9hZGRyX2hpOworCV9fbGUzMiB0Ml9wdHJfaGFzaF90YmxfYWRkcl9sbzsKKwlfX2xlMzIgdDJfcHRyX2hhc2hfdGJsX2FkZHJfaGk7CisJX19sZTMyIGZyZWVfbGlzdF9jb3VudDsKIH07CiAKIC8qCi0gKiBGQ29FIGZpcm13YXJlIGluaXQgcmVxdWVzdCAzCisgKiBGQ29FIGZpcm13YXJlIGluaXQgcmVxdWVzdCAzICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogc3RydWN0IGZjb2Vfa3dxZV9pbml0MyB7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJX19sZTE2IHJlc2VydmVkMDsKIAlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0JdTE2IHJlc2VydmVkMDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiByZXNlcnZlZDA7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotI2VuZGlmCi0JdTMyIGVycm9yX2JpdF9tYXBfbG87Ci0JdTMyIGVycm9yX2JpdF9tYXBfaGk7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJX19sZTMyIGVycm9yX2JpdF9tYXBfbG87CisJX19sZTMyIGVycm9yX2JpdF9tYXBfaGk7CisJdTggcGVyZl9jb25maWc7CiAJdTggcmVzZXJ2ZWQyMVszXTsKLQl1OCBjYWNoZWRfc2Vzc2lvbl9lbmFibGU7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1OCBjYWNoZWRfc2Vzc2lvbl9lbmFibGU7Ci0JdTggcmVzZXJ2ZWQyMVszXTsKLSNlbmRpZgotCXUzMiByZXNlcnZlZDJbNF07CisJX19sZTMyIHJlc2VydmVkMls0XTsKIH07CiAKIC8qCi0gKiBGQ29FIGNvbm5lY3Rpb24gb2ZmbG9hZCByZXF1ZXN0IDEKKyAqIEZDb0UgY29ubmVjdGlvbiBvZmZsb2FkIHJlcXVlc3QgMSAkJEtFRVBfRU5ESUFOTkVTUyQkCiAgKi8KIHN0cnVjdCBmY29lX2t3cWVfY29ubl9vZmZsb2FkMSB7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJX19sZTE2IGZjb2VfY29ubl9pZDsKIAlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0JdTE2IGZjb2VfY29ubl9pZDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiBmY29lX2Nvbm5faWQ7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotI2VuZGlmCi0JdTMyIHNxX2FkZHJfbG87Ci0JdTMyIHNxX2FkZHJfaGk7Ci0JdTMyIHJxX3BibF9hZGRyX2xvOwotCXUzMiBycV9wYmxfYWRkcl9oaTsKLQl1MzIgcnFfZmlyc3RfcGJlX2FkZHJfbG87Ci0JdTMyIHJxX2ZpcnN0X3BiZV9hZGRyX2hpOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiByZXNlcnZlZDA7Ci0JdTE2IHJxX3Byb2Q7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcnFfcHJvZDsKLQl1MTYgcmVzZXJ2ZWQwOwotI2VuZGlmCisJX19sZTMyIHNxX2FkZHJfbG87CisJX19sZTMyIHNxX2FkZHJfaGk7CisJX19sZTMyIHJxX3BibF9hZGRyX2xvOworCV9fbGUzMiBycV9wYmxfYWRkcl9oaTsKKwlfX2xlMzIgcnFfZmlyc3RfcGJlX2FkZHJfbG87CisJX19sZTMyIHJxX2ZpcnN0X3BiZV9hZGRyX2hpOworCV9fbGUxNiBycV9wcm9kOworCV9fbGUxNiByZXNlcnZlZDA7CiB9OwogCiAvKgotICogRkNvRSBjb25uZWN0aW9uIG9mZmxvYWQgcmVxdWVzdCAyCisgKiBGQ29FIGNvbm5lY3Rpb24gb2ZmbG9hZCByZXF1ZXN0IDIgJCRLRUVQX0VORElBTk5FU1MkJAogICovCiBzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fb2ZmbG9hZDIgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCV9fbGUxNiB0eF9tYXhfZmNfcGF5X2xlbjsKIAlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0JdTE2IHR4X21heF9mY19wYXlfbGVuOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHR4X21heF9mY19wYXlfbGVuOwotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLSNlbmRpZgotCXUzMiBjcV9hZGRyX2xvOwotCXUzMiBjcV9hZGRyX2hpOwotCXUzMiB4ZmVycV9hZGRyX2xvOwotCXUzMiB4ZmVycV9hZGRyX2hpOwotCXUzMiBjb25uX2RiX2FkZHJfbG87Ci0JdTMyIGNvbm5fZGJfYWRkcl9oaTsKLQl1MzIgcmVzZXJ2ZWQxOworCV9fbGUzMiBjcV9hZGRyX2xvOworCV9fbGUzMiBjcV9hZGRyX2hpOworCV9fbGUzMiB4ZmVycV9hZGRyX2xvOworCV9fbGUzMiB4ZmVycV9hZGRyX2hpOworCV9fbGUzMiBjb25uX2RiX2FkZHJfbG87CisJX19sZTMyIGNvbm5fZGJfYWRkcl9oaTsKKwlfX2xlMzIgcmVzZXJ2ZWQxOwogfTsKIAogLyoKLSAqIEZDb0UgY29ubmVjdGlvbiBvZmZsb2FkIHJlcXVlc3QgMworICogRkNvRSBjb25uZWN0aW9uIG9mZmxvYWQgcmVxdWVzdCAzICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQzIHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0JdTE2IHZsYW5fdGFnOwotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19WTEFOX0lEICgweEZGRjw8MCkKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfVkxBTl9JRF9TSElGVCAwCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0NGSSAoMHgxPDwxMikKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQ0ZJX1NISUZUIDEyCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX1BSSU9SSVRZICgweDc8PDEzKQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19QUklPUklUWV9TSElGVCAxMwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHZsYW5fdGFnOworCV9fbGUxNiB2bGFuX3RhZzsKICNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfVkxBTl9JRCAoMHhGRkY8PDApCiAjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX1ZMQU5fSURfU0hJRlQgMAogI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19DRkkgKDB4MTw8MTIpCkBAIC00NDUsMzQgKzQxNiw4IEBACiAjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX1BSSU9SSVRZICgweDc8PDEzKQogI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19QUklPUklUWV9TSElGVCAxMwogCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IHR4X21heF9jb25jX3NlcXNfYzM7Ci0JdTggc19pZFszXTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQogCXU4IHNfaWRbM107CiAJdTggdHhfbWF4X2NvbmNfc2Vxc19jMzsKLSNlbmRpZgotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IGZsYWdzOwotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX01VTF9OX1BPUlRfSURTICgweDE8PDApCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfTVVMX05fUE9SVF9JRFNfU0hJRlQgMAotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0VfRF9UT1ZfUkVTICgweDE8PDEpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfRV9EX1RPVl9SRVNfU0hJRlQgMQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0NPTlRfSU5DUl9TRVFfQ05UICgweDE8PDIpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQ09OVF9JTkNSX1NFUV9DTlRfU0hJRlQgMgotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0NPTkZfUkVRICgweDE8PDMpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQ09ORl9SRVFfU0hJRlQgMwotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX1JFQ19WQUxJRCAoMHgxPDw0KQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX1JFQ19WQUxJRF9TSElGVCA0Ci0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQzJfVkFMSUQgKDB4MTw8NSkKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9DMl9WQUxJRF9TSElGVCA1Ci0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQUNLXzAgKDB4MTw8NikKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9BQ0tfMF9TSElGVCA2Ci0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfVkxBTl9GTEFHICgweDE8PDcpCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfVkxBTl9GTEFHX1NISUZUIDcKLQl1OCBkX2lkWzNdOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCiAJdTggZF9pZFszXTsKIAl1OCBmbGFnczsKICNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9NVUxfTl9QT1JUX0lEUyAoMHgxPDwwKQpAQCAtNDkxLDY5ICs0MzYsNDQgQEAKICNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9BQ0tfMF9TSElGVCA2CiAjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfVkxBTl9GTEFHICgweDE8PDcpCiAjZGVmaW5lIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfVkxBTl9GTEFHX1NISUZUIDcKLSNlbmRpZgotCXUzMiByZXNlcnZlZDsKLQl1MzIgY29uZnFfZmlyc3RfcGJlX2FkZHJfbG87Ci0JdTMyIGNvbmZxX2ZpcnN0X3BiZV9hZGRyX2hpOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiByeF9tYXhfZmNfcGF5X2xlbjsKLQl1MTYgdHhfdG90YWxfY29uY19zZXFzOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IHR4X3RvdGFsX2NvbmNfc2VxczsKLQl1MTYgcnhfbWF4X2ZjX3BheV9sZW47Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCByeF9vcGVuX3NlcXNfZXhjaF9jMzsKLQl1OCByeF9tYXhfY29uY19zZXFzX2MzOwotCXUxNiByeF90b3RhbF9jb25jX3NlcXM7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcnhfdG90YWxfY29uY19zZXFzOworCV9fbGUzMiByZXNlcnZlZDsKKwlfX2xlMzIgY29uZnFfZmlyc3RfcGJlX2FkZHJfbG87CisJX19sZTMyIGNvbmZxX2ZpcnN0X3BiZV9hZGRyX2hpOworCV9fbGUxNiB0eF90b3RhbF9jb25jX3NlcXM7CisJX19sZTE2IHJ4X21heF9mY19wYXlfbGVuOworCV9fbGUxNiByeF90b3RhbF9jb25jX3NlcXM7CiAJdTggcnhfbWF4X2NvbmNfc2Vxc19jMzsKIAl1OCByeF9vcGVuX3NlcXNfZXhjaF9jMzsKLSNlbmRpZgogfTsKIAogLyoKLSAqIEZDb0UgY29ubmVjdGlvbiBvZmZsb2FkIHJlcXVlc3QgNAorICogRkNvRSBjb25uZWN0aW9uIG9mZmxvYWQgcmVxdWVzdCA0ICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQ0IHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0JdTggcmVzZXJ2ZWQyOwotCXU4IGVfZF90b3ZfdGltZXJfdmFsOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCiAJdTggZV9kX3Rvdl90aW1lcl92YWw7CiAJdTggcmVzZXJ2ZWQyOwogCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLSNlbmRpZgotCXU4IHNyY19tYWNfYWRkcl9sbzMyWzRdOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXU4IGRzdF9tYWNfYWRkcl9oaTE2WzJdOwotCXU4IHNyY19tYWNfYWRkcl9oaTE2WzJdOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggc3JjX21hY19hZGRyX2hpMTZbMl07Ci0JdTggZHN0X21hY19hZGRyX2hpMTZbMl07Ci0jZW5kaWYKLQl1OCBkc3RfbWFjX2FkZHJfbG8zMls0XTsKLQl1MzIgbGNxX2FkZHJfbG87Ci0JdTMyIGxjcV9hZGRyX2hpOwotCXUzMiBjb25mcV9wYmxfYmFzZV9hZGRyX2xvOwotCXUzMiBjb25mcV9wYmxfYmFzZV9hZGRyX2hpOworCXU4IHNyY19tYWNfYWRkcl9sb1syXTsKKwl1OCBzcmNfbWFjX2FkZHJfbWlkWzJdOworCXU4IHNyY19tYWNfYWRkcl9oaVsyXTsKKwl1OCBkc3RfbWFjX2FkZHJfaGlbMl07CisJdTggZHN0X21hY19hZGRyX2xvWzJdOworCXU4IGRzdF9tYWNfYWRkcl9taWRbMl07CisJX19sZTMyIGxjcV9hZGRyX2xvOworCV9fbGUzMiBsY3FfYWRkcl9oaTsKKwlfX2xlMzIgY29uZnFfcGJsX2Jhc2VfYWRkcl9sbzsKKwlfX2xlMzIgY29uZnFfcGJsX2Jhc2VfYWRkcl9oaTsKIH07CiAKIC8qCi0gKiBGQ29FIGNvbm5lY3Rpb24gZW5hYmxlIHJlcXVlc3QKKyAqIEZDb0UgY29ubmVjdGlvbiBlbmFibGUgcmVxdWVzdCAkJEtFRVBfRU5ESUFOTkVTUyQkCiAgKi8KIHN0cnVjdCBmY29lX2t3cWVfY29ubl9lbmFibGVfZGlzYWJsZSB7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJX19sZTE2IHJlc2VydmVkMDsKIAlzdHJ1Y3QgZmNvZV9rd3FlX2hlYWRlciBoZHI7Ci0JdTE2IHJlc2VydmVkMDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiByZXNlcnZlZDA7Ci0Jc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotI2VuZGlmCi0JdTggc3JjX21hY19hZGRyX2xvMzJbNF07Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTggc3JjX21hY19hZGRyX2xvWzJdOworCXU4IHNyY19tYWNfYWRkcl9taWRbMl07CisJdTggc3JjX21hY19hZGRyX2hpWzJdOwogCXUxNiB2bGFuX3RhZzsKICNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfVkxBTl9JRCAoMHhGRkY8PDApCiAjZGVmaW5lIEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1ZMQU5fSURfU0hJRlQgMApAQCAtNTYxLDkyICs0ODEsNTIgQEAKICNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfQ0ZJX1NISUZUIDEyCiAjZGVmaW5lIEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1BSSU9SSVRZICgweDc8PDEzKQogI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9QUklPUklUWV9TSElGVCAxMwotCXU4IHNyY19tYWNfYWRkcl9oaTE2WzJdOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggc3JjX21hY19hZGRyX2hpMTZbMl07Ci0JdTE2IHZsYW5fdGFnOwotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9WTEFOX0lEICgweEZGRjw8MCkKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfVkxBTl9JRF9TSElGVCAwCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX0NGSSAoMHgxPDwxMikKLSNkZWZpbmUgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfQ0ZJX1NISUZUIDEyCi0jZGVmaW5lIEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1BSSU9SSVRZICgweDc8PDEzKQotI2RlZmluZSBGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9QUklPUklUWV9TSElGVCAxMwotI2VuZGlmCi0JdTggZHN0X21hY19hZGRyX2xvMzJbNF07Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJlc2VydmVkMTsKLQl1OCBkc3RfbWFjX2FkZHJfaGkxNlsyXTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IGRzdF9tYWNfYWRkcl9oaTE2WzJdOwotCXUxNiByZXNlcnZlZDE7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCB2bGFuX2ZsYWc7Ci0JdTggc19pZFszXTsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXU4IGRzdF9tYWNfYWRkcl9sb1syXTsKKwl1OCBkc3RfbWFjX2FkZHJfbWlkWzJdOworCXU4IGRzdF9tYWNfYWRkcl9oaVsyXTsKKwlfX2xlMTYgcmVzZXJ2ZWQxOwogCXU4IHNfaWRbM107CiAJdTggdmxhbl9mbGFnOwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTggcmVzZXJ2ZWQzOwotCXU4IGRfaWRbM107Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKIAl1OCBkX2lkWzNdOwogCXU4IHJlc2VydmVkMzsKLSNlbmRpZgotCXUzMiBjb250ZXh0X2lkOwotCXUzMiBjb25uX2lkOwotCXUzMiByZXNlcnZlZDQ7CisJX19sZTMyIGNvbnRleHRfaWQ7CisJX19sZTMyIGNvbm5faWQ7CisJX19sZTMyIHJlc2VydmVkNDsKIH07CiAKIC8qCi0gKiBGQ29FIGNvbm5lY3Rpb24gZGVzdHJveSByZXF1ZXN0CisgKiBGQ29FIGNvbm5lY3Rpb24gZGVzdHJveSByZXF1ZXN0ICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogc3RydWN0IGZjb2Vfa3dxZV9jb25uX2Rlc3Ryb3kgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCV9fbGUxNiByZXNlcnZlZDA7CiAJc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotCXUxNiByZXNlcnZlZDA7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcmVzZXJ2ZWQwOwotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLSNlbmRpZgotCXUzMiBjb250ZXh0X2lkOwotCXUzMiBjb25uX2lkOwotCXUzMiByZXNlcnZlZDFbNV07CisJX19sZTMyIGNvbnRleHRfaWQ7CisJX19sZTMyIGNvbm5faWQ7CisJX19sZTMyIHJlc2VydmVkMVs1XTsKIH07CiAKIC8qCi0gKiBGQ29lIGRlc3Ryb3kgcmVxdWVzdAorICogRkNvZSBkZXN0cm95IHJlcXVlc3QgJCRLRUVQX0VORElBTk5FU1MkJAogICovCiBzdHJ1Y3QgZmNvZV9rd3FlX2Rlc3Ryb3kgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCV9fbGUxNiByZXNlcnZlZDA7CiAJc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotCXUxNiByZXNlcnZlZDA7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcmVzZXJ2ZWQwOwotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLSNlbmRpZgotCXUzMiByZXNlcnZlZDFbN107CisJX19sZTMyIHJlc2VydmVkMVs3XTsKIH07CiAKIC8qCi0gKiBGQ29lIHN0YXRpc3RpY3MgcmVxdWVzdAorICogRkNvZSBzdGF0aXN0aWNzIHJlcXVlc3QgJCRLRUVQX0VORElBTk5FU1MkJAogICovCiBzdHJ1Y3QgZmNvZV9rd3FlX3N0YXQgewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCV9fbGUxNiByZXNlcnZlZDA7CiAJc3RydWN0IGZjb2Vfa3dxZV9oZWFkZXIgaGRyOwotCXUxNiByZXNlcnZlZDA7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgcmVzZXJ2ZWQwOwotCXN0cnVjdCBmY29lX2t3cWVfaGVhZGVyIGhkcjsKLSNlbmRpZgotCXUzMiBzdGF0X3BhcmFtc19hZGRyX2xvOwotCXUzMiBzdGF0X3BhcmFtc19hZGRyX2hpOwotCXUzMiByZXNlcnZlZDFbNV07CisJX19sZTMyIHN0YXRfcGFyYW1zX2FkZHJfbG87CisJX19sZTMyIHN0YXRfcGFyYW1zX2FkZHJfaGk7CisJX19sZTMyIHJlc2VydmVkMVs1XTsKIH07CiAKIC8qCi0gKiBGQ29FIEtXUSBXUUUKKyAqIEZDb0UgS1dRIFdRRSAkJEtFRVBfRU5ESUFOTkVTUyQkCiAgKi8KIHVuaW9uIGZjb2Vfa3dxZSB7CiAJc3RydWN0IGZjb2Vfa3dxZV9pbml0MSBpbml0MTsKQEAgLTY2MiwxOSArNTQyLDQyIEBACiAJc3RydWN0IGZjb2Vfa3dxZV9zdGF0IHN0YXRpc3RpY3M7CiB9OwogCi1zdHJ1Y3QgZmNvZV9tdWxfc2dlc19jdHggewotCXN0cnVjdCByZWdwYWlyIGN1cl9zZ2VfYWRkcjsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBzZ2xfc2l6ZTsKLQl1OCBjdXJfc2dlX2lkeDsKLQl1MTYgY3VyX3NnZV9vZmY7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgY3VyX3NnZV9vZmY7Ci0JdTggY3VyX3NnZV9pZHg7Ci0JdTggc2dsX3NpemU7Ci0jZW5kaWYKKworCisKKworCisKKworCisKKworCisKKworCisKKy8qCisgKiBUWCBTR0wgY29udGV4dCAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3VuaW9uIGZjb2Vfc2dsX3VuaW9uX2N0eCB7CisJc3RydWN0IGZjb2VfY2FjaGVkX3NnZV9jdHggY2FjaGVkX3NnZTsKKwlzdHJ1Y3QgZmNvZV9leHRfbXVsX3NnZXNfY3R4IHNnbDsKKwlfX2xlMzIgb3BhcXVlWzVdOwogfTsKIAorLyoKKyAqIERhdGEtSW4vRUxTL0JMUyBpbmZvcm1hdGlvbiAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX3JlYWRfZmxvd19pbmZvIHsKKwl1bmlvbiBmY29lX3NnbF91bmlvbl9jdHggc2dsX2N0eDsKKwlfX2xlMzIgcnNydjBbM107Cit9OworCisKKy8qCisgKiBGY29lIHN0YXQgY29udGV4dCAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KIHN0cnVjdCBmY29lX3Nfc3RhdF9jdHggewogCXU4IGZsYWdzOwogI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfQUNUSVZFICgweDE8PDApCkBAIC02OTMsNTEgKzU5NiwzNCBAQAogI2RlZmluZSBGQ09FX1NfU1RBVF9DVFhfUlNSVjFfU0hJRlQgNgogfTsKIAotc3RydWN0IGZjb2Vfc2VxX2N0eCB7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IGxvd19zZXFfY250OwotCXN0cnVjdCBmY29lX3Nfc3RhdF9jdHggc19zdGF0OwotCXU4IHNlcV9pZDsKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorLyoKKyAqIEZjb2Ugcnggc2VxIGNvbnRleHQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9yeF9zZXFfY3R4IHsKIAl1OCBzZXFfaWQ7CiAJc3RydWN0IGZjb2Vfc19zdGF0X2N0eCBzX3N0YXQ7Ci0JdTE2IGxvd19zZXFfY250OwotI2VuZGlmCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IGVycl9zZXFfY250OwotCXUxNiBoaWdoX3NlcV9jbnQ7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgaGlnaF9zZXFfY250OwotCXUxNiBlcnJfc2VxX2NudDsKLSNlbmRpZgotCXUzMiBsb3dfZXhwX3JvOwotCXUzMiBoaWdoX2V4cF9ybzsKKwlfX2xlMTYgc2VxX2NudDsKKwlfX2xlMzIgbG93X2V4cF9ybzsKKwlfX2xlMzIgaGlnaF9leHBfcm87CiB9OwogCiAKLXN0cnVjdCBmY29lX3NpbmdsZV9zZ2VfY3R4IHsKLQlzdHJ1Y3QgcmVncGFpciBjdXJfYnVmX2FkZHI7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJlc2VydmVkMDsKLQl1MTYgY3VyX2J1Zl9yZW07Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgY3VyX2J1Zl9yZW07Ci0JdTE2IHJlc2VydmVkMDsKLSNlbmRpZgotfTsKLQotdW5pb24gZmNvZV9zZ2xfY3R4IHsKLQlzdHJ1Y3QgZmNvZV9zaW5nbGVfc2dlX2N0eCBzaW5nbGVfc2dlOwotCXN0cnVjdCBmY29lX211bF9zZ2VzX2N0eCBtdWxfc2dlczsKKy8qCisgKiBGY29lIHJ4X3dyIHVuaW9uIGNvbnRleHQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCit1bmlvbiBmY29lX3J4X3dyX3VuaW9uX2N0eCB7CisJc3RydWN0IGZjb2VfcmVhZF9mbG93X2luZm8gcmVhZF9pbmZvOworCXVuaW9uIGZjb2VfY29tcF9mbG93X2luZm8gY29tcF9pbmZvOworCV9fbGUzMiBvcGFxdWVbOF07CiB9OwogCiAKIAogLyoKLSAqIEZDb0UgU1EgZWxlbWVudAorICogRkNvRSBTUSBlbGVtZW50ICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogc3RydWN0IGZjb2Vfc3FlIHsKLQl1MTYgd3FlOworCV9fbGUxNiB3cWU7CiAjZGVmaW5lIEZDT0VfU1FFX1RBU0tfSUQgKDB4N0ZGRjw8MCkKICNkZWZpbmUgRkNPRV9TUUVfVEFTS19JRF9TSElGVCAwCiAjZGVmaW5lIEZDT0VfU1FFX1RPR0dMRV9CSVQgKDB4MTw8MTUpCkBAIC03NDYsMTM1ICs2MzIsMTQxIEBACiAKIAogCi1zdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeV90eF9vbmx5IHsKLQl1bmlvbiBmY29lX3NnbF9jdHggc2dsX2N0eDsKLX07Ci0KLXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3R4d3JfcnhyZCB7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHZlcmlmeV90eF9zZXE7Ci0JdTggaW5pdF9mbGFnczsKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfVEFTS19UWVBFICgweDc8PDApCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1RBU0tfVFlQRV9TSElGVCAwCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX0RFVl9UWVBFICgweDE8PDMpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX0RFVl9UWVBFX1NISUZUIDMKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfQ0xBU1NfVFlQRSAoMHgxPDw0KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9DTEFTU19UWVBFX1NISUZUIDQKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfU0lOR0xFX1NHRSAoMHgxPDw1KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9TSU5HTEVfU0dFX1NISUZUIDUKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfUlNSVjUgKDB4Mzw8NikKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfUlNSVjVfU0hJRlQgNgotCXU4IHR4X2ZsYWdzOwotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9UWF9TVEFURSAoMHhGPDwwKQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9UWF9TVEFURV9TSElGVCAwCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1JTUlY0ICgweEY8PDQpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1JTUlY0X1NISUZUIDQKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXU4IHR4X2ZsYWdzOwotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9UWF9TVEFURSAoMHhGPDwwKQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9UWF9TVEFURV9TSElGVCAwCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1JTUlY0ICgweEY8PDQpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1JTUlY0X1NISUZUIDQKLQl1OCBpbml0X2ZsYWdzOwotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9UQVNLX1RZUEUgKDB4Nzw8MCkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfVEFTS19UWVBFX1NISUZUIDAKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfREVWX1RZUEUgKDB4MTw8MykKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfREVWX1RZUEVfU0hJRlQgMwotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9DTEFTU19UWVBFICgweDE8PDQpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX0NMQVNTX1RZUEVfU0hJRlQgNAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9TSU5HTEVfU0dFICgweDE8PDUpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1NJTkdMRV9TR0VfU0hJRlQgNQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9SU1JWNSAoMHgzPDw2KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9SU1JWNV9TSElGVCA2Ci0JdTE2IHZlcmlmeV90eF9zZXE7Ci0jZW5kaWYKLX07Ci0KIC8qCi0gKiBDb21tb24gc2VjdGlvbi4gQm90aCBUWCBhbmQgUlggcHJvY2Vzc2luZyBtaWdodCB3cml0ZSBhbmQgcmVhZCBmcm9tIGl0IGluCi0gKiBkaWZmZXJlbnQgZmxvd3MKKyAqIDE0IHJlZ3MgJCRLRUVQX0VORElBTk5FU1MkJAogICovCi1zdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeV90eF9yeF9jbW4gewotCXUzMiBkYXRhXzJfdHJuczsKLQl1bmlvbiBmY29lX2dlbmVyYWxfdGFza19jdHggZ2VuZXJhbDsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgdHhfbG93X3NlcV9jbnQ7Ci0Jc3RydWN0IGZjb2Vfc19zdGF0X2N0eCB0eF9zX3N0YXQ7Ci0JdTggdHhfc2VxX2lkOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTggdHhfc2VxX2lkOwotCXN0cnVjdCBmY29lX3Nfc3RhdF9jdHggdHhfc19zdGF0OwotCXUxNiB0eF9sb3dfc2VxX2NudDsKLSNlbmRpZgotCXUzMiBjb21tb25fZmxhZ3M7Ci0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX0NJRCAoMHhGRkZGRkY8PDApCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX0NJRF9TSElGVCAwCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX1ZBTElEICgweDE8PDI0KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9WQUxJRF9TSElGVCAyNAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9TRVFfSU5JVCAoMHgxPDwyNSkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWF9SWF9DTU5fU0VRX0lOSVRfU0hJRlQgMjUKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWF9SWF9DTU5fUEVORF9YRkVSICgweDE8PDI2KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9QRU5EX1hGRVJfU0hJRlQgMjYKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWF9SWF9DTU5fUEVORF9DT05GICgweDE8PDI3KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9QRU5EX0NPTkZfU0hJRlQgMjcKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWF9SWF9DTU5fRVhQX0ZJUlNUX0ZSQU1FICgweDE8PDI4KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9FWFBfRklSU1RfRlJBTUVfU0hJRlQgMjgKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWF9SWF9DTU5fUlNSViAoMHg3PDwyOSkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9UWF9SWF9DTU5fUlNSVl9TSElGVCAyOQorc3RydWN0IGZjb2VfdGNlX3R4X29ubHkgeworCXVuaW9uIGZjb2Vfc2dsX3VuaW9uX2N0eCBzZ2xfY3R4OworCV9fbGUzMiByc3J2MDsKIH07CiAKLXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3J4d3JfdHhyZCB7Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JdTE2IHJ4X2lkOwotCXUxNiByeF9mbGFnczsKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfUlhfU1RBVEUgKDB4Rjw8MCkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfUlhfU1RBVEVfU0hJRlQgMAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9OVU1fUlFfV1FFICgweDc8PDQpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX05VTV9SUV9XUUVfU0hJRlQgNAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9DT05GX1JFUSAoMHgxPDw3KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9DT05GX1JFUV9TSElGVCA3Ci0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX01JU1NfRlJBTUUgKDB4MTw8OCkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfTUlTU19GUkFNRV9TSElGVCA4Ci0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX1JFU0VSVkVEMCAoMHg3Rjw8OSkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfUkVTRVJWRUQwX1NISUZUIDkKLSNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQotCXUxNiByeF9mbGFnczsKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfUlhfU1RBVEUgKDB4Rjw8MCkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfUlhfU1RBVEVfU0hJRlQgMAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9OVU1fUlFfV1FFICgweDc8PDQpCi0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX05VTV9SUV9XUUVfU0hJRlQgNAotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9DT05GX1JFUSAoMHgxPDw3KQotI2RlZmluZSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1JYV1JfVFhSRF9DT05GX1JFUV9TSElGVCA3Ci0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX01JU1NfRlJBTUUgKDB4MTw8OCkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfTUlTU19GUkFNRV9TSElGVCA4Ci0jZGVmaW5lIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX1JFU0VSVkVEMCAoMHg3Rjw8OSkKLSNkZWZpbmUgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfUkVTRVJWRUQwX1NISUZUIDkKLQl1MTYgcnhfaWQ7Ci0jZW5kaWYKKy8qCisgKiAzMiBieXRlcyAoOCByZWdzKSB1c2VkIGZvciBUWCBvbmx5IHB1cnBvc2VzICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLwordW5pb24gZmNvZV90eF93cl9yeF9yZF91bmlvbl9jdHggeworCXN0cnVjdCBmY29lX2ZjX2ZyYW1lIHR4X2ZyYW1lOworCXN0cnVjdCBmY29lX2ZjcF9jbWRfcGF5bG9hZCBmY3BfY21kOworCXN0cnVjdCBmY29lX2V4dF9jbGVhbnVwX2luZm8gY2xlYW51cDsKKwlzdHJ1Y3QgZmNvZV9leHRfYWJ0c19pbmZvIGFidHM7CisJc3RydWN0IGZjb2VfZXh0X2Z3X3R4X3NlcV9jdHggdHhfc2VxOworCV9fbGUzMiBvcGFxdWVbOF07CiB9OwogCi1zdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeV9yeF9vbmx5IHsKLQlzdHJ1Y3QgZmNvZV9zZXFfY3R4IHNlcV9jdHg7Ci0Jc3RydWN0IGZjb2Vfc2VxX2N0eCBvb29fc2VxX2N0eDsKLQl1MzIgcnNydjM7Ci0JdW5pb24gZmNvZV9zZ2xfY3R4IHNnbF9jdHg7CisvKgorICogdGNlX3R4X3dyX3J4X3JkX2NvbnN0ICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfdGNlX3R4X3dyX3J4X3JkX2NvbnN0IHsKKwl1OCBpbml0X2ZsYWdzOworI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UQVNLX1RZUEUgKDB4Nzw8MCkKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVEFTS19UWVBFX1NISUZUIDAKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfREVWX1RZUEUgKDB4MTw8MykKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfREVWX1RZUEVfU0hJRlQgMworI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9DTEFTU19UWVBFICgweDE8PDQpCisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0NMQVNTX1RZUEVfU0hJRlQgNAorI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9DQUNIRURfU0dFICgweDM8PDUpCisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0NBQ0hFRF9TR0VfU0hJRlQgNQorI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9TVVBQT1JUX1JFQ19UT1YgKDB4MTw8NykKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfU1VQUE9SVF9SRUNfVE9WX1NISUZUIDcKKwl1OCB0eF9mbGFnczsKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVFhfVkFMSUQgKDB4MTw8MCkKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVFhfVkFMSURfU0hJRlQgMAorI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UWF9TVEFURSAoMHhGPDwxKQorI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UWF9TVEFURV9TSElGVCAxCisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1JTUlYxICgweDE8PDUpCisjZGVmaW5lIEZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1JTUlYxX1NISUZUIDUKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVFhfU0VRX0lOSVQgKDB4MTw8NikKKyNkZWZpbmUgRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVFhfU0VRX0lOSVRfU0hJRlQgNgorI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9SU1JWMiAoMHgxPDw3KQorI2RlZmluZSBGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9SU1JWMl9TSElGVCA3CisJX19sZTE2IHJzcnYzOworCV9fbGUzMiB2ZXJpZnlfdHhfc2VxOwogfTsKIAorLyoKKyAqIHRjZV90eF93cl9yeF9yZCAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX3RjZV90eF93cl9yeF9yZCB7CisJdW5pb24gZmNvZV90eF93cl9yeF9yZF91bmlvbl9jdHggdW5pb25fY3R4OworCXN0cnVjdCBmY29lX3RjZV90eF93cl9yeF9yZF9jb25zdCBjb25zdF9jdHg7Cit9OworCisvKgorICogdGNlX3J4X3dyX3R4X3JkX2NvbnN0ICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfdGNlX3J4X3dyX3R4X3JkX2NvbnN0IHsKKwlfX2xlMzIgZGF0YV8yX3RybnM7CisJX19sZTMyIGluaXRfZmxhZ3M7CisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX0NPTlNUX0NJRCAoMHhGRkZGRkY8PDApCisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX0NPTlNUX0NJRF9TSElGVCAwCisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX0NPTlNUX1JTUlYwICgweEZGPDwyNCkKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfQ09OU1RfUlNSVjBfU0hJRlQgMjQKK307CisKKy8qCisgKiB0Y2Vfcnhfd3JfdHhfcmRfdmFyICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfdGNlX3J4X3dyX3R4X3JkX3ZhciB7CisJX19sZTE2IHJ4X2ZsYWdzOworI2RlZmluZSBGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfUlNSVjEgKDB4Rjw8MCkKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX1JTUlYxX1NISUZUIDAKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX05VTV9SUV9XUUUgKDB4Nzw8NCkKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX05VTV9SUV9XUUVfU0hJRlQgNAorI2RlZmluZSBGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfQ09ORl9SRVEgKDB4MTw8NykKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX0NPTkZfUkVRX1NISUZUIDcKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX1JYX1NUQVRFICgweEY8PDgpCisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9SWF9TVEFURV9TSElGVCA4CisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9FWFBfRklSU1RfRlJBTUUgKDB4MTw8MTIpCisjZGVmaW5lIEZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9FWFBfRklSU1RfRlJBTUVfU0hJRlQgMTIKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX1JYX1NFUV9JTklUICgweDE8PDEzKQorI2RlZmluZSBGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfUlhfU0VRX0lOSVRfU0hJRlQgMTMKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX1JTUlYyICgweDE8PDE0KQorI2RlZmluZSBGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfUlNSVjJfU0hJRlQgMTQKKyNkZWZpbmUgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX1JYX1ZBTElEICgweDE8PDE1KQorI2RlZmluZSBGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfUlhfVkFMSURfU0hJRlQgMTUKKwlfX2xlMTYgcnhfaWQ7CisJc3RydWN0IGZjb2VfZmNwX3hmcl9yZHlfcGF5bG9hZCBmY3BfeGZyX3JkeTsKK307CisKKy8qCisgKiB0Y2Vfcnhfd3JfdHhfcmQgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV90Y2Vfcnhfd3JfdHhfcmQgeworCXN0cnVjdCBmY29lX3RjZV9yeF93cl90eF9yZF9jb25zdCBjb25zdF9jdHg7CisJc3RydWN0IGZjb2VfdGNlX3J4X3dyX3R4X3JkX3ZhciB2YXJfY3R4OworfTsKKworLyoKKyAqIHRjZV9yeF9vbmx5ICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfdGNlX3J4X29ubHkgeworCXN0cnVjdCBmY29lX3J4X3NlcV9jdHggcnhfc2VxX2N0eDsKKwl1bmlvbiBmY29lX3J4X3dyX3VuaW9uX2N0eCB1bmlvbl9jdHg7Cit9OworCisvKgorICogdGFza19jdHhfZW50cnkgJCRLRUVQX0VORElBTk5FU1MkJAorICovCiBzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSB7Ci0Jc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnlfdHhfb25seSB0eF93cl9vbmx5OwotCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3R4d3JfcnhyZCB0eF93cl9yeF9yZDsKLQlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeV90eF9yeF9jbW4gY21uOwotCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5X3J4d3JfdHhyZCByeF93cl90eF9yZDsKLQlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeV9yeF9vbmx5IHJ4X3dyX29ubHk7Ci0JdTMyIHJlc2VydmVkWzRdOworCXN0cnVjdCBmY29lX3RjZV90eF9vbmx5IHR4d3Jfb25seTsKKwlzdHJ1Y3QgZmNvZV90Y2VfdHhfd3JfcnhfcmQgdHh3cl9yeHJkOworCXN0cnVjdCBmY29lX3RjZV9yeF93cl90eF9yZCByeHdyX3R4cmQ7CisJc3RydWN0IGZjb2VfdGNlX3J4X29ubHkgcnh3cl9vbmx5OwogfTsKIAogCisKKworCisKKworCisKKwogLyoKLSAqIEZDb0UgWEZSUSBlbGVtZW50CisgKiBGQ29FIFhGUlEgZWxlbWVudCAkJEtFRVBfRU5ESUFOTkVTUyQkCiAgKi8KIHN0cnVjdCBmY29lX3hmcnFlIHsKLQl1MTYgd3FlOworCV9fbGUxNiB3cWU7CiAjZGVmaW5lIEZDT0VfWEZSUUVfVEFTS19JRCAoMHg3RkZGPDwwKQogI2RlZmluZSBGQ09FX1hGUlFFX1RBU0tfSURfU0hJRlQgMAogI2RlZmluZSBGQ09FX1hGUlFFX1RPR0dMRV9CSVQgKDB4MTw8MTUpCkBAIC04ODMsMjIgKzc3NSwzMSBAQAogCiAKIC8qCi0gKiBGQ29FIENPTkZRIGVsZW1lbnQKKyAqIGZjb2UgcnggZG9vcmJlbGwgbWVzc2FnZSBzZW50IHRvIHRoZSBjaGlwICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwotc3RydWN0IGZjb2VfY29uZnFlIHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgcnhfaWQ7Ci0JdTE2IG94X2lkOwotI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdTE2IG94X2lkOwotCXUxNiByeF9pZDsKLSNlbmRpZgotCXUzMiBwYXJhbTsKK3N0cnVjdCBiNTc3eHhfZmNvZV9yeF9kb29yYmVsbCB7CisJc3RydWN0IGI1Nzd4eF9kb29yYmVsbF9oZHIgaGRyOworCXU4IHBhcmFtczsKKyNkZWZpbmUgQjU3N1hYX0ZDT0VfUlhfRE9PUkJFTExfTkVHQVRJVkVfQVJNICgweDFGPDwwKQorI2RlZmluZSBCNTc3WFhfRkNPRV9SWF9ET09SQkVMTF9ORUdBVElWRV9BUk1fU0hJRlQgMAorI2RlZmluZSBCNTc3WFhfRkNPRV9SWF9ET09SQkVMTF9PUENPREUgKDB4Nzw8NSkKKyNkZWZpbmUgQjU3N1hYX0ZDT0VfUlhfRE9PUkJFTExfT1BDT0RFX1NISUZUIDUKKwlfX2xlMTYgZG9vcmJlbGxfY3FfY29uczsKIH07CiAKIAogLyoKLSAqIEZDb0UgY29ubmVjdGlvbiBkYXRhIGJhc2UKKyAqIEZDb0UgQ09ORlEgZWxlbWVudCAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX2NvbmZxZSB7CisJX19sZTE2IG94X2lkOworCV9fbGUxNiByeF9pZDsKKwlfX2xlMzIgcGFyYW07Cit9OworCisKKy8qCisgKiBGQ29FIGNvbmVjdGlvbiBkYXRhIGJhc2UKICAqLwogc3RydWN0IGZjb2VfY29ubl9kYiB7CiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCkBAIC05MTQsMTAgKzgxNSwxMCBAQAogCiAKIC8qCi0gKiBGQ29FIENRIGVsZW1lbnQKKyAqIEZDb0UgQ1EgZWxlbWVudCAkJEtFRVBfRU5ESUFOTkVTUyQkCiAgKi8KIHN0cnVjdCBmY29lX2NxZSB7Ci0JdTE2IHdxZTsKKwlfX2xlMTYgd3FlOwogI2RlZmluZSBGQ09FX0NRRV9DUUVfSU5GTyAoMHgzRkZGPDwwKQogI2RlZmluZSBGQ09FX0NRRV9DUUVfSU5GT19TSElGVCAwCiAjZGVmaW5lIEZDT0VfQ1FFX0NRRV9UWVBFICgweDE8PDE0KQpAQCAtOTI4LDYxICs4MjksNDYgQEAKIAogCiAvKgotICogRkNvRSBlcnJvci93YXJuaW5nIHJlc3BvcnRpbmcgZW50cnkKKyAqIEZDb0UgZXJyb3Ivd2FybmluZyByZXBvcnRpbmcgZW50cnkgJCRLRUVQX0VORElBTk5FU1MkJAorICovCitzdHJ1Y3QgZmNvZV9wYXJ0aWFsX2Vycl9yZXBvcnRfZW50cnkgeworCV9fbGUzMiBlcnJfd2Fybl9iaXRtYXBfbG87CisJX19sZTMyIGVycl93YXJuX2JpdG1hcF9oaTsKKwlfX2xlMzIgdHhfYnVmX29mZjsKKwlfX2xlMzIgcnhfYnVmX29mZjsKK307CisKKy8qCisgKiBGQ29FIGVycm9yL3dhcm5pbmcgcmVwb3J0aW5nIGVudHJ5ICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogc3RydWN0IGZjb2VfZXJyX3JlcG9ydF9lbnRyeSB7Ci0JdTMyIGVycl93YXJuX2JpdG1hcF9sbzsKLQl1MzIgZXJyX3dhcm5fYml0bWFwX2hpOwotCXUzMiB0eF9idWZfb2ZmOwotCXUzMiByeF9idWZfb2ZmOworCXN0cnVjdCBmY29lX3BhcnRpYWxfZXJyX3JlcG9ydF9lbnRyeSBkYXRhOwogCXN0cnVjdCBmY29lX2ZjX2hkciBmY19oZHI7CiB9OwogCiAKIC8qCi0gKiBGQ29FIGhhc2ggdGFibGUgZW50cnkgKDMyIGJ5dGVzKQorICogRkNvRSBoYXNoIHRhYmxlIGVudHJ5ICgzMiBieXRlcykgJCRLRUVQX0VORElBTk5FU1MkJAogICovCiBzdHJ1Y3QgZmNvZV9oYXNoX3RhYmxlX2VudHJ5IHsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1OCBkX2lkXzA7Ci0JdTggc19pZF8yOwotCXU4IHNfaWRfMTsKLQl1OCBzX2lkXzA7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKIAl1OCBzX2lkXzA7CiAJdTggc19pZF8xOwogCXU4IHNfaWRfMjsKIAl1OCBkX2lkXzA7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgZHN0X21hY19hZGRyX2hpOwotCXU4IGRfaWRfMjsKLQl1OCBkX2lkXzE7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKIAl1OCBkX2lkXzE7CiAJdTggZF9pZF8yOwotCXUxNiBkc3RfbWFjX2FkZHJfaGk7Ci0jZW5kaWYKLQl1MzIgZHN0X21hY19hZGRyX2xvOwotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXUxNiB2bGFuX2lkOwotCXUxNiBzcmNfbWFjX2FkZHJfaGk7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQl1MTYgc3JjX21hY19hZGRyX2hpOwotCXUxNiB2bGFuX2lkOwotI2VuZGlmCi0JdTMyIHNyY19tYWNfYWRkcl9sbzsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQl1MTYgcmVzZXJ2ZWQxOwotCXU4IHJlc2VydmVkMDsKLQl1OCB2bGFuX2ZsYWc7Ci0jZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwlfX2xlMTYgZHN0X21hY19hZGRyX2hpOworCV9fbGUxNiBkc3RfbWFjX2FkZHJfbWlkOworCV9fbGUxNiBkc3RfbWFjX2FkZHJfbG87CisJX19sZTE2IHNyY19tYWNfYWRkcl9oaTsKKwlfX2xlMTYgdmxhbl9pZDsKKwlfX2xlMTYgc3JjX21hY19hZGRyX2xvOworCV9fbGUxNiBzcmNfbWFjX2FkZHJfbWlkOwogCXU4IHZsYW5fZmxhZzsKIAl1OCByZXNlcnZlZDA7Ci0JdTE2IHJlc2VydmVkMTsKLSNlbmRpZgotCXUzMiByZXNlcnZlZDI7Ci0JdTMyIGZpZWxkX2lkOworCV9fbGUxNiByZXNlcnZlZDE7CisJX19sZTMyIHJlc2VydmVkMjsKKwlfX2xlMzIgZmllbGRfaWQ7CiAjZGVmaW5lIEZDT0VfSEFTSF9UQUJMRV9FTlRSWV9DSUQgKDB4RkZGRkZGPDwwKQogI2RlZmluZSBGQ09FX0hBU0hfVEFCTEVfRU5UUllfQ0lEX1NISUZUIDAKICNkZWZpbmUgRkNPRV9IQVNIX1RBQkxFX0VOVFJZX1JFU0VSVkVEMyAoMHg3Rjw8MjQpCkBAIC05OTEsMTEgKzg3NywyNyBAQAogI2RlZmluZSBGQ09FX0hBU0hfVEFCTEVfRU5UUllfVkFMSURfU0hJRlQgMzEKIH07CiAKKwogLyoKLSAqIEZDb0UgcGVuZGluZyB3b3JrIHJlcXVlc3QgQ1FFCisgKiBGQ29FIExDUSBlbGVtZW50ICQkS0VFUF9FTkRJQU5ORVNTJCQKKyAqLworc3RydWN0IGZjb2VfbGNxZSB7CisJX19sZTMyIHdxZTsKKyNkZWZpbmUgRkNPRV9MQ1FFX1RBU0tfSUQgKDB4RkZGRjw8MCkKKyNkZWZpbmUgRkNPRV9MQ1FFX1RBU0tfSURfU0hJRlQgMAorI2RlZmluZSBGQ09FX0xDUUVfTENRRV9UWVBFICgweEZGPDwxNikKKyNkZWZpbmUgRkNPRV9MQ1FFX0xDUUVfVFlQRV9TSElGVCAxNgorI2RlZmluZSBGQ09FX0xDUUVfUkVTRVJWRUQgKDB4RkY8PDI0KQorI2RlZmluZSBGQ09FX0xDUUVfUkVTRVJWRURfU0hJRlQgMjQKK307CisKKworCisvKgorICogRkNvRSBwZW5kaW5nIHdvcmsgcmVxdWVzdCBDUUUgJCRLRUVQX0VORElBTk5FU1MkJAogICovCiBzdHJ1Y3QgZmNvZV9wZW5kX3dxX2NxZSB7Ci0JdTE2IHdxZTsKKwlfX2xlMTYgd3FlOwogI2RlZmluZSBGQ09FX1BFTkRfV1FfQ1FFX1RBU0tfSUQgKDB4M0ZGRjw8MCkKICNkZWZpbmUgRkNPRV9QRU5EX1dRX0NRRV9UQVNLX0lEX1NISUZUIDAKICNkZWZpbmUgRkNPRV9QRU5EX1dRX0NRRV9DUUVfVFlQRSAoMHgxPDwxNCkKQEAgLTEwMDYsNTMgKzkwOCw2MSBAQAogCiAKIC8qCi0gKiBGQ29FIFJYIHN0YXRpc3RpY3MgcGFyYW1ldGVycyBzZWN0aW9uIzAKKyAqIEZDb0UgUlggc3RhdGlzdGljcyBwYXJhbWV0ZXJzIHNlY3Rpb24jMCAkJEtFRVBfRU5ESUFOTkVTUyQkCiAgKi8KIHN0cnVjdCBmY29lX3J4X3N0YXRfcGFyYW1zX3NlY3Rpb24wIHsKLQl1MzIgZmNvZV92ZXJfY250OwotCXUzMiBmY29lX3J4X3BrdF9jbnQ7Ci0JdTMyIGZjb2VfcnhfYnl0ZV9jbnQ7Ci0JdTMyIGZjb2VfcnhfZHJvcF9wa3RfY250OworCV9fbGUzMiBmY29lX3J4X3BrdF9jbnQ7CisJX19sZTMyIGZjb2VfcnhfYnl0ZV9jbnQ7CiB9OwogCiAKIC8qCi0gKiBGQ29FIFJYIHN0YXRpc3RpY3MgcGFyYW1ldGVycyBzZWN0aW9uIzEKKyAqIEZDb0UgUlggc3RhdGlzdGljcyBwYXJhbWV0ZXJzIHNlY3Rpb24jMSAkJEtFRVBfRU5ESUFOTkVTUyQkCiAgKi8KIHN0cnVjdCBmY29lX3J4X3N0YXRfcGFyYW1zX3NlY3Rpb24xIHsKLQl1MzIgZmNfY3JjX2NudDsKLQl1MzIgZW9mYV9kZWxfY250OwotCXUzMiBtaXNzX2ZyYW1lX2NudDsKLQl1MzIgc2VxX3RpbWVvdXRfY250OwotCXUzMiBkcm9wX3NlcV9jbnQ7Ci0JdTMyIGZjb2VfcnhfZHJvcF9wa3RfY250OwotCXUzMiBmY3BfcnhfcGt0X2NudDsKLQl1MzIgcmVzZXJ2ZWQwOworCV9fbGUzMiBmY29lX3Zlcl9jbnQ7CisJX19sZTMyIGZjb2VfcnhfZHJvcF9wa3RfY250OwogfTsKIAogCiAvKgotICogRkNvRSBUWCBzdGF0aXN0aWNzIHBhcmFtZXRlcnMKKyAqIEZDb0UgUlggc3RhdGlzdGljcyBwYXJhbWV0ZXJzIHNlY3Rpb24jMiAkJEtFRVBfRU5ESUFOTkVTUyQkCisgKi8KK3N0cnVjdCBmY29lX3J4X3N0YXRfcGFyYW1zX3NlY3Rpb24yIHsKKwlfX2xlMzIgZmNfY3JjX2NudDsKKwlfX2xlMzIgZW9mYV9kZWxfY250OworCV9fbGUzMiBtaXNzX2ZyYW1lX2NudDsKKwlfX2xlMzIgc2VxX3RpbWVvdXRfY250OworCV9fbGUzMiBkcm9wX3NlcV9jbnQ7CisJX19sZTMyIGZjb2VfcnhfZHJvcF9wa3RfY250OworCV9fbGUzMiBmY3BfcnhfcGt0X2NudDsKKwlfX2xlMzIgcmVzZXJ2ZWQwOworfTsKKworCisvKgorICogRkNvRSBUWCBzdGF0aXN0aWNzIHBhcmFtZXRlcnMgJCRLRUVQX0VORElBTk5FU1MkJAogICovCiBzdHJ1Y3QgZmNvZV90eF9zdGF0X3BhcmFtcyB7Ci0JdTMyIGZjb2VfdHhfcGt0X2NudDsKLQl1MzIgZmNvZV90eF9ieXRlX2NudDsKLQl1MzIgZmNwX3R4X3BrdF9jbnQ7Ci0JdTMyIHJlc2VydmVkMDsKKwlfX2xlMzIgZmNvZV90eF9wa3RfY250OworCV9fbGUzMiBmY29lX3R4X2J5dGVfY250OworCV9fbGUzMiBmY3BfdHhfcGt0X2NudDsKKwlfX2xlMzIgcmVzZXJ2ZWQwOwogfTsKIAogLyoKLSAqIEZDb0Ugc3RhdGlzdGljcyBwYXJhbWV0ZXJzCisgKiBGQ29FIHN0YXRpc3RpY3MgcGFyYW1ldGVycyAkJEtFRVBfRU5ESUFOTkVTUyQkCiAgKi8KIHN0cnVjdCBmY29lX3N0YXRpc3RpY3NfcGFyYW1zIHsKIAlzdHJ1Y3QgZmNvZV90eF9zdGF0X3BhcmFtcyB0eF9zdGF0OwogCXN0cnVjdCBmY29lX3J4X3N0YXRfcGFyYW1zX3NlY3Rpb24wIHJ4X3N0YXQwOwogCXN0cnVjdCBmY29lX3J4X3N0YXRfcGFyYW1zX3NlY3Rpb24xIHJ4X3N0YXQxOworCXN0cnVjdCBmY29lX3J4X3N0YXRfcGFyYW1zX3NlY3Rpb24yIHJ4X3N0YXQyOwogfTsKIAogCiAvKgotICogRkNvRSB0MiBoYXNoIHRhYmxlIGVudHJ5ICg2NCBieXRlcykKKyAqIEZDb0UgdDIgaGFzaCB0YWJsZSBlbnRyeSAoNjQgYnl0ZXMpICQkS0VFUF9FTkRJQU5ORVNTJCQKICAqLwogc3RydWN0IGZjb2VfdDJfaGFzaF90YWJsZV9lbnRyeSB7CiAJc3RydWN0IGZjb2VfaGFzaF90YWJsZV9lbnRyeSBkYXRhOwpAQCAtMTA2MCwxMSArOTcwLDEzIEBACiAJc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWQwWzNdOwogfTsKIAorCisKIC8qCi0gKiBGQ29FIHVuc29saWNpdGVkIENRRQorICogRkNvRSB1bnNvbGljaXRlZCBDUUUgJCRLRUVQX0VORElBTk5FU1MkJAogICovCiBzdHJ1Y3QgZmNvZV91bnNvbGljaXRlZF9jcWUgewotCXUxNiB3cWU7CisJX19sZTE2IHdxZTsKICNkZWZpbmUgRkNPRV9VTlNPTElDSVRFRF9DUUVfU1VCVFlQRSAoMHgzPDwwKQogI2RlZmluZSBGQ09FX1VOU09MSUNJVEVEX0NRRV9TVUJUWVBFX1NISUZUIDAKICNkZWZpbmUgRkNPRV9VTlNPTElDSVRFRF9DUUVfUEtUX0xFTiAoMHhGRkY8PDIpCkBAIC0xMDc1LDYgKzk4Nyw0IEBACiAjZGVmaW5lIEZDT0VfVU5TT0xJQ0lURURfQ1FFX1RPR0dMRV9CSVRfU0hJRlQgMTUKIH07CiAKLQotCiAjZW5kaWYgLyogX181N1hYX0ZDT0VfSFNJX0xJTlVYX0xFX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmggYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oCmluZGV4IDBhNDA0YmYuLmQ5MjQyMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmgKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmMuaApAQCAtNjIsNyArNjIsNyBAQAogI2luY2x1ZGUgImJueDJmY19jb25zdGFudHMuaCIKIAogI2RlZmluZSBCTlgyRkNfTkFNRQkJImJueDJmYyIKLSNkZWZpbmUgQk5YMkZDX1ZFUlNJT04JCSIxLjAuMSIKKyNkZWZpbmUgQk5YMkZDX1ZFUlNJT04JCSIxLjAuMyIKIAogI2RlZmluZSBQRlgJCQkiYm54MmZjOiAiCiAKQEAgLTE1Miw3ICsxNTIsNiBAQAogCXNwaW5sb2NrX3QgZnBfd29ya19sb2NrOwogfTsKIAotCiBzdHJ1Y3QgYm54MmZjX2hiYSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaW5rOwogCXN0cnVjdCBjbmljX2RldiAqY25pYzsKQEAgLTE3OSw2ICsxNzgsNyBAQAogCQkjZGVmaW5lIEJOWDJGQ19DVExSX0lOSVRfRE9ORQkJMQogCQkjZGVmaW5lIEJOWDJGQ19DUkVBVEVfRE9ORQkJMgogCXN0cnVjdCBmY29lX2N0bHIgY3RscjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZwb3J0czsKIAl1OCB2bGFuX2VuYWJsZWQ7CiAJaW50IHZsYW5faWQ7CiAJdTMyIG5leHRfY29ubl9pZDsKQEAgLTIzMiw2ICsyMzIsMTEgQEAKIAogI2RlZmluZSBibngyZmNfZnJvbV9jdGxyKGZpcCkgY29udGFpbmVyX29mKGZpcCwgc3RydWN0IGJueDJmY19oYmEsIGN0bHIpCiAKK3N0cnVjdCBibngyZmNfbHBvcnQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OworfTsKKwogc3RydWN0IGJueDJmY19jbWRfbWdyIHsKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOwogCXUxNiBuZXh0X2lkeDsKQEAgLTI2Miw5ICsyNjcsMTQgQEAKICNkZWZpbmUgQk5YMkZDX0ZMQUdfVVBMRF9SRVFfQ09NUEwJMHg4CiAjZGVmaW5lIEJOWDJGQ19GTEFHX0VYUExfTE9HTwkJMHg5CiAKKwl1OCBzcmNfYWRkcltFVEhfQUxFTl07CiAJdTMyIG1heF9zcWVzOwogCXUzMiBtYXhfcnFlczsKIAl1MzIgbWF4X2NxZXM7CisJYXRvbWljX3QgZnJlZV9zcWVzOworCisJc3RydWN0IGI1Nzd4eF9kb29yYmVsbF9zZXRfcHJvZCBzcV9kYjsKKwlzdHJ1Y3QgYjU3N3h4X2Zjb2VfcnhfZG9vcmJlbGwgcnhfZGI7CiAKIAlzdHJ1Y3QgZmNvZV9zcWUgKnNxOwogCWRtYV9hZGRyX3Qgc3FfZG1hOwpAQCAtMjc0LDcgKzI4NCw3IEBACiAKIAlzdHJ1Y3QgZmNvZV9jcWUgKmNxOwogCWRtYV9hZGRyX3QgY3FfZG1hOwotCXUzMiBjcV9jb25zX2lkeDsKKwl1MTYgY3FfY29uc19pZHg7CiAJdTggY3FfY3Vycl90b2dnbGVfYml0OwogCXUzMiBjcV9tZW1fc2l6ZTsKIApAQCAtNDIzLDYgKzQzMyw3IEBACiBzdHJ1Y3QgYm54MmZjX3Vuc29sX2VscyB7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CiAJc3RydWN0IHdvcmtfc3RydWN0IHVuc29sX2Vsc193b3JrOwogfTsKIApAQCAtNTA1LDYgKzUxNiw3IEBACiAJCQkJCQkgICBzdHJ1Y3QgZmNfZnJhbWUgKiwKIAkJCQkJCSAgIHZvaWQgKiksCiAJCQkJICAgICAgdm9pZCAqYXJnLCB1MzIgdGltZW91dCk7Cit2b2lkIGJueDJmY19hcm1fY3Eoc3RydWN0IGJueDJmY19ycG9ydCAqdGd0KTsKIGludCBibngyZmNfcHJvY2Vzc19uZXdfY3FlcyhzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QpOwogdm9pZCBibngyZmNfcHJvY2Vzc19jcV9jb21wbChzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QsIHUxNiB3cWUpOwogc3RydWN0IGJueDJmY19ycG9ydCAqYm54MmZjX3RndF9sb29rdXAoc3RydWN0IGZjb2VfcG9ydCAqcG9ydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2NvbnN0YW50cy5oIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfY29uc3RhbnRzLmgKaW5kZXggZmU3NzY5MS4uMzk5Y2RhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfY29uc3RhbnRzLmgKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfY29uc3RhbnRzLmgKQEAgLTUsNiArNSwxMiBAQAogICogVGhpcyBmaWxlIGRlZmluZXMgSFNJIGNvbnN0YW50cyBmb3IgdGhlIEZDb0UgZmxvd3MKICAqLwogCisvKiBDdXJyZW50IEZDb0UgSFNJIHZlcnNpb24gbnVtYmVyIGNvbXBvc2VkIG9mIHR3byBmaWVsZHMgKDE2IGJpdCkgKi8KKy8qIEltcGxpZXMgb24gYSBjaGFuZ2UgYnJva2VuIHByZXZpb3VzIEhTSSAqLworI2RlZmluZSBGQ09FX0hTSV9NQUpPUl9WRVJTSU9OICgxKQorLyogSW1wbGllcyBvbiBhIGNoYW5nZSB3aGljaCBkb2VzIG5vdCBicm9rZW4gcHJldmlvdXMgSFNJICovCisjZGVmaW5lIEZDT0VfSFNJX01JTk9SX1ZFUlNJT04gKDEpCisKIC8qIEtXUS9LQ1EgRkNvRSBsYXllciBjb2RlICovCiAjZGVmaW5lIEZDT0VfS1dRRV9MQVlFUl9DT0RFICAgKDcpCiAKQEAgLTQwLDIxICs0Niw2MiBAQAogI2RlZmluZSBGQ09FX0tDUUVfQ09NUExFVElPTl9TVEFUVVNfQ1RYX0FMTE9DX0ZBSUxVUkUJKDB4MykKICNkZWZpbmUgRkNPRV9LQ1FFX0NPTVBMRVRJT05fU1RBVFVTX0NUWF9GUkVFX0ZBSUxVUkUJKDB4NCkKICNkZWZpbmUgRkNPRV9LQ1FFX0NPTVBMRVRJT05fU1RBVFVTX05JQ19FUlJPUgkJCSgweDUpCisjZGVmaW5lIEZDT0VfS0NRRV9DT01QTEVUSU9OX1NUQVRVU19XUk9OR19IU0lfVkVSU0lPTiAgICgweDYpCisKKy8qIENRRSB0eXBlICovCisjZGVmaW5lIEZDT0VfUEVORElOR19DUUVfVFlQRQkJCTAKKyNkZWZpbmUgRkNPRV9VTlNPTElDX0NRRV9UWVBFCQkJMQogCiAvKiBVbnNvbGljaXRlZCBDUUUgdHlwZSAqLwogI2RlZmluZSBGQ09FX1VOU09MSUNJVEVEX0ZSQU1FX0NRRV9UWVBFCQkJMAogI2RlZmluZSBGQ09FX0VSUk9SX0RFVEVDVElPTl9DUUVfVFlQRQkJCTEKICNkZWZpbmUgRkNPRV9XQVJOSU5HX0RFVEVDVElPTl9DUUVfVFlQRQkJCTIKIAorLyogRV9EX1RPViB0aW1lciByZXNvbHV0aW9uIGluIG1zICovCisjZGVmaW5lIEZDT0VfRV9EX1RPVl9USU1FUl9SRVNPTFVUSU9OX01TICgyMCkKKworLyogRV9EX1RPViB0aW1lciByZXNvbHV0aW9uIGZvciBTRE0gKDQgbWljcm8pICovCisjZGVmaW5lIEZDT0VfRV9EX1RPVl9TRE1fVElNRVJfUkVTT0xVVElPTgkJCQlcCisJKEZDT0VfRV9EX1RPVl9USU1FUl9SRVNPTFVUSU9OX01TICogMTAwMCAvIDQpCisKKy8qIFJFQyB0aW1lciByZXNvbHV0aW9uIGluIG1zICovCisjZGVmaW5lIEZDT0VfUkVDX1RJTUVSX1JFU09MVVRJT05fTVMgKDIwKQorCisvKiBSRUMgdGltZXIgcmVzb2x1dGlvbiBmb3IgU0RNICg0IG1pY3JvKSAqLworI2RlZmluZSBGQ09FX1JFQ19TRE1fVElNRVJfUkVTT0xVVElPTiAoRkNPRV9SRUNfVElNRVJfUkVTT0xVVElPTl9NUyAqIDEwMDAgLyA0KQorCisvKiBFX0RfVE9WIHRpbWVyIGRlZmF1bHQgd3JhcGFyb3VuZCB2YWx1ZSAoMiBzZWMpIGluIDIwIG1zIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgRkNPRV9FX0RfVE9WX0RFRkFVTFRfV1JBUEFST1VORF9WQUwJCQlcCisJCQkoMjAwMCAvIEZDT0VfRV9EX1RPVl9USU1FUl9SRVNPTFVUSU9OX01TKQorCisvKiBSRUNfVE9WIHRpbWVyIGRlZmF1bHQgd3JhcGFyb3VuZCB2YWx1ZSAoMyBzZWMpIGluIDIwIG1zIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgRkNPRV9SRUNfVE9WX0RFRkFVTFRfV1JBUEFST1VORF9WQUwJCQlcCisJCQkoMzAwMCAvIEZDT0VfUkVDX1RJTUVSX1JFU09MVVRJT05fTVMpCisKKyNkZWZpbmUgRkNPRV9OVU1fT0ZfVElNRVJfVEFTS1MgICg4ICogMTAyNCkKKworI2RlZmluZSBGQ09FX05VTV9PRl9DQUNIRURfVEFTS1NfVElNRVIgKDgpCisKIC8qIFRhc2sgY29udGV4dCBjb25zdGFudHMgKi8KKy8qKioqKioqKiBSZW1vdmUgRkNQX0NNRCB3cml0ZSB0Y2Ugc2xlZXAgKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbiBjYXNlIHRpbWVyIHNlcnZpY2VzIGFyZSByZXF1aXJlZCB0aGVuIHNoYWxsIGJlIHVwZGF0ZWQgYnkgWHN0b3JtIGFmdGVyCisgKiBzdGFydCBwcm9jZXNzaW5nIHRoZSB0YXNrLiBJbiBjYXNlIG5vIHRpbWVyIGZhY2lsaXRpZXMgYXJlIHJlcXVpcmVkIHRoZW4gdGhlCisgKiBkcml2ZXIgd291bGQgaW5pdGlhbGl6ZSB0aGUgc3RhdGUgdG8gdGhpcyB2YWx1ZQorICoKKyNkZWZpbmUJRkNPRV9UQVNLX1RYX1NUQVRFX05PUk1BTAkJCQkwCisgKiBBZnRlciBkcml2ZXIgaGFzIGluaXRpYWxpemUgdGhlIHRhc2sgaW4gY2FzZSB0aW1lciBzZXJ2aWNlcyByZXF1aXJlZCAqCisjZGVmaW5lCUZDT0VfVEFTS19UWF9TVEFURV9JTklUCQkJCQkxCisqKioqKioqKiBSZW1vdmUgRkNQX0NNRCB3cml0ZSB0Y2Ugc2xlZXAgKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBBZnRlciBkcml2ZXIgaGFzIGluaXRpYWxpemUgdGhlIHRhc2sgaW4gY2FzZSB0aW1lciBzZXJ2aWNlcyByZXF1aXJlZCAqLwogI2RlZmluZQlGQ09FX1RBU0tfVFhfU1RBVEVfSU5JVAkJCQkJMAogLyogSW4gY2FzZSB0aW1lciBzZXJ2aWNlcyBhcmUgcmVxdWlyZWQgdGhlbiBzaGFsbCBiZSB1cGRhdGVkIGJ5IFhzdG9ybSBhZnRlcgogICogc3RhcnQgcHJvY2Vzc2luZyB0aGUgdGFzay4gSW4gY2FzZSBubyB0aW1lciBmYWNpbGl0aWVzIGFyZSByZXF1aXJlZCB0aGVuIHRoZQotICogZHJpdmVyIHdvdWxkIGluaXRpYWxpemUgdGhlIHN0YXRlIHRvIHRoaXMgdmFsdWUgKi8KKyAqIGRyaXZlciB3b3VsZCBpbml0aWFsaXplIHRoZSBzdGF0ZSB0byB0aGlzIHZhbHVlCisgKi8KICNkZWZpbmUJRkNPRV9UQVNLX1RYX1NUQVRFX05PUk1BTAkJCQkxCiAvKiBUYXNrIGlzIHVuZGVyIGFib3J0IHByb2NlZHVyZS4gVXBkYXRlZCBpbiBvcmRlciB0byBzdG9wIHByb2Nlc3Npbmcgb2YKLSAqIHBlbmRpbmcgV1FFcyBvbiB0aGlzIHRhc2sgKi8KKyAqIHBlbmRpbmcgV1FFcyBvbiB0aGlzIHRhc2sKKyAqLwogI2RlZmluZQlGQ09FX1RBU0tfVFhfU1RBVEVfQUJPUlQJCQkJMgogLyogRm9yIEVfRF9UX1RPViB0aW1lciBleHBpcmF0aW9uIGluIFhzdG9ybSAoQ2xhc3MgMiBvbmx5KSAqLwogI2RlZmluZQlGQ09FX1RBU0tfVFhfU1RBVEVfRVJST1IJCQkJMwpAQCAtNjYsMTcgKzExMyw4IEBACiAjZGVmaW5lCUZDT0VfVEFTS19UWF9TVEFURV9FWENIQU5HRV9DTEVBTlVQCQkJNgogLyogRm9yIHNlcXVlbmNlIGNsZWFudXAgcmVxdWVzdCB0YXNrICovCiAjZGVmaW5lCUZDT0VfVEFTS19UWF9TVEFURV9TRVFVRU5DRV9DTEVBTlVQCQkJNwotLyogTWFyayB0YXNrIGFzIGFib3J0ZWQgYW5kIGluZGljYXRlIHRoYXQgQUJUUyB3YXMgbm90IHRyYW5zbWl0dGVkICovCi0jZGVmaW5lCUZDT0VfVEFTS19UWF9TVEFURV9CRUZPUkVfQUJUU19UWAkJCTgKLS8qIE1hcmsgdGFzayBhcyBhYm9ydGVkIGFuZCBpbmRpY2F0ZSB0aGF0IEFCVFMgd2FzIHRyYW5zbWl0dGVkICovCi0jZGVmaW5lCUZDT0VfVEFTS19UWF9TVEFURV9BRlRFUl9BQlRTX1RYCQkJOQogLyogRm9yIGNvbXBsZXRpb24gdGhlIEFCVFMgdGFzay4gKi8KLSNkZWZpbmUJRkNPRV9UQVNLX1RYX1NUQVRFX0FCVFNfVFhfQ09NUExFVEVECQkJMTAKLS8qIE1hcmsgdGFzayBhcyBhYm9ydGVkIGFuZCBpbmRpY2F0ZSB0aGF0IEV4Y2hhbmdlIGNsZWFudXAgd2FzIG5vdCB0cmFuc21pdHRlZAotICovCi0jZGVmaW5lCUZDT0VfVEFTS19UWF9TVEFURV9CRUZPUkVfRVhDSEFOR0VfQ0xFQU5VUF9UWAkJMTEKLS8qIE1hcmsgdGFzayBhcyBhYm9ydGVkIGFuZCBpbmRpY2F0ZSB0aGF0IEV4Y2hhbmdlIGNsZWFudXAgd2FzIHRyYW5zbWl0dGVkICovCi0jZGVmaW5lCUZDT0VfVEFTS19UWF9TVEFURV9BRlRFUl9FWENIQU5HRV9DTEVBTlVQX1RYCQkxMgorI2RlZmluZQlGQ09FX1RBU0tfVFhfU1RBVEVfQUJUU19UWAkJCQk4CiAKICNkZWZpbmUJRkNPRV9UQVNLX1JYX1NUQVRFX05PUk1BTAkJCQkwCiAjZGVmaW5lCUZDT0VfVEFTS19SWF9TVEFURV9DT01QTEVURUQJCQkJMQpAQCAtODYsMjUgKzEyNCwyNSBAQAogI2RlZmluZQlGQ09FX1RBU0tfUlhfU1RBVEVfV0FSTklORwkJCQkzCiAvKiBGb3IgRV9EX1RfVE9WIHRpbWVyIGV4cGlyYXRpb24gaW4gVXN0b3JtICovCiAjZGVmaW5lCUZDT0VfVEFTS19SWF9TVEFURV9FUlJPUgkJCQk0Ci0vKiBBQlRTIEFDQyBhcnJpdmVkIHdhaXQgZm9yIGxvY2FsIGNvbXBsZXRpb24gdG8gZmluYWxseSBjb21wbGV0ZSB0aGUgdGFzay4gKi8KLSNkZWZpbmUJRkNPRV9UQVNLX1JYX1NUQVRFX0FCVFNfQUNDX0FSUklWRUQJCQk1Ci0vKiBsb2NhbCBjb21wbGV0aW9uIGFycml2ZWQgd2FpdCBmb3IgQUJUUyBBQ0MgdG8gZmluYWxseSBjb21wbGV0ZSB0aGUgdGFzay4gKi8KLSNkZWZpbmUJRkNPRV9UQVNLX1JYX1NUQVRFX0FCVFNfTE9DQUxfQ09NUF9BUlJJVkVECQk2CisvKiBGVyBvbmx5OiBGaXJzdCB2aXNpdCBhdCByeC1wYXRoLCBwYXJ0IG9mIHRoZSBhYnRzIHJvdW5kIHRyaXAgKi8KKyNkZWZpbmUJRkNPRV9UQVNLX1JYX1NUQVRFX0FCVFNfSU5fUFJPQ0VTUwkJCTUKKy8qIEZXIG9ubHk6IFNlY29uZCB2aXNpdCBhdCByeC1wYXRoLCBhZnRlciBBQlRTIGZyYW1lIHRyYW5zbWl0dGVkICovCisjZGVmaW5lCUZDT0VfVEFTS19SWF9TVEFURV9BQlRTX1RSQU5TTUlUVEVECQkJNgogLyogU3BlY2lhbCBjb21wbGV0aW9uIGluZGljYXRpb24gaW4gY2FzZSBvZiB0YXNrIHdhcyBhYm9ydGVkLiAqLwogI2RlZmluZSBGQ09FX1RBU0tfUlhfU1RBVEVfQUJUU19DT01QTEVURUQJCQk3Ci0vKiBTcGVjaWFsIGNvbXBsZXRpb24gaW5kaWNhdGlvbiBpbiBjYXNlIG9mIHRhc2sgd2FzIGNsZWFuZWQuICovCi0jZGVmaW5lIEZDT0VfVEFTS19SWF9TVEFURV9FWENIQU5HRV9DTEVBTlVQX0NPTVBMRVRFRAkJOAotLyogU3BlY2lhbCBjb21wbGV0aW9uIGluZGljYXRpb24gKGluIHRhc2sgcmVxdWVzdGVkIHRoZSBleGNoYW5nZSBjbGVhbnVwKSBpbgotICogY2FzZSBjbGVhbmVkIHRhc2sgaXMgaW4gbm9uLXZhbGlkLiAqLwotI2RlZmluZSBGQ09FX1RBU0tfUlhfU1RBVEVfQUJPUlRfQ0xFQU5VUF9DT01QTEVURUQJCTkKKy8qIEZXIG9ubHk6IEZpcnN0IHZpc2l0IGF0IHJ4LXBhdGgsIHBhcnQgb2YgdGhlIGNsZWFudXAgcm91bmQgdHJpcCAqLworI2RlZmluZQlGQ09FX1RBU0tfUlhfU1RBVEVfRVhDSEFOR0VfQ0xFQU5VUF9JTl9QUk9DRVNTCQk4CisvKiBGVyBvbmx5OiBTcGVjaWFsIGNvbXBsZXRpb24gaW5kaWNhdGlvbiBpbiBjYXNlIG9mIHRhc2sgd2FzIGNsZWFuZWQuICovCisjZGVmaW5lIEZDT0VfVEFTS19SWF9TVEFURV9FWENIQU5HRV9DTEVBTlVQX0NPTVBMRVRFRAkJOQorLyogTm90IGluIHVzZWQ6IFNwZWNpYWwgY29tcGxldGlvbiBpbmRpY2F0aW9uIChpbiB0YXNrIHJlcXVlc3RlZCB0aGUgZXhjaGFuZ2UKKyAqIGNsZWFudXApIGluIGNhc2UgY2xlYW5lZCB0YXNrIGlzIGluIG5vbi12YWxpZC4KKyAqLworI2RlZmluZSBGQ09FX1RBU0tfUlhfU1RBVEVfQUJPUlRfQ0xFQU5VUF9DT01QTEVURUQJCTEwCiAvKiBTcGVjaWFsIGNvbXBsZXRpb24gaW5kaWNhdGlvbiAoaW4gdGFzayByZXF1ZXN0ZWQgdGhlIHNlcXVlbmNlIGNsZWFudXApIGluCi0gKiBjYXNlIGNsZWFuZWQgdGFzayB3YXMgYWxyZWFkeSByZXR1cm5lZCB0byBub3JtYWwuICovCi0jZGVmaW5lIEZDT0VfVEFTS19SWF9TVEFURV9JR05PUkVEX1NFUVVFTkNFX0NMRUFOVVAJCTEwCi0vKiBFeGNoYW5nZSBjbGVhbnVwIGFycml2ZWQgd2FpdCB1bnRpbCB4ZmVyIHdpbGwgYmUgaGFuZGxlZCB0byBmaW5hbGx5Ci0gKiBjb21wbGV0ZSB0aGUgdGFzay4gKi8KLSNkZWZpbmUJRkNPRV9UQVNLX1JYX1NUQVRFX0VYQ0hBTkdFX0NMRUFOVVBfQVJSSVZFRAkJMTEKLS8qIFhmZXIgaGFuZGxlZCwgd2FpdCBmb3IgZXhjaGFuZ2UgY2xlYW51cCB0byBmaW5hbGx5IGNvbXBsZXRlIHRoZSB0YXNrLiAqLwotI2RlZmluZQlGQ09FX1RBU0tfUlhfU1RBVEVfRVhDSEFOR0VfQ0xFQU5VUF9IQU5ETEVEX1hGRVIJMTIKKyAqIGNhc2UgY2xlYW5lZCB0YXNrIHdhcyBhbHJlYWR5IHJldHVybmVkIHRvIG5vcm1hbC4KKyAqLworI2RlZmluZSBGQ09FX1RBU0tfUlhfU1RBVEVfSUdOT1JFRF9TRVFVRU5DRV9DTEVBTlVQCQkxMQorCiAKICNkZWZpbmUJRkNPRV9UQVNLX1RZUEVfV1JJVEUJCQkwCiAjZGVmaW5lCUZDT0VfVEFTS19UWVBFX1JFQUQJCQkJMQpAQCAtMTIwLDExICsxNTgsNDAgQEAKICNkZWZpbmUgRkNPRV9UQVNLX0NMQVNTX1RZUEVfMwkJCTAKICNkZWZpbmUgRkNPRV9UQVNLX0NMQVNTX1RZUEVfMgkJCTEKIAorLyogRkNvRS9GQyBwYWNrZXQgZmllbGRzICAqLworI2RlZmluZQlGQ09FX0VUSF9UWVBFCQkJCQkweDg5MDYKKworLyogRkNvRSBtYXhpbXVtIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgRkNPRV9NQVhfRUxFTUVOVFNfSU5fSEFTSF9UQUJMRV9ST1cJOAorCisvKiBGQ29FIGhhbGYgb2YgdGhlIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgRkNPRV9IQUxGX0VMRU1FTlRTX0lOX0hBU0hfVEFCTEVfUk9XCQkJXAorCQkJKEZDT0VfTUFYX0VMRU1FTlRTX0lOX0hBU0hfVEFCTEVfUk9XIC8gMikKKworLyogRmNvRSBudW1iZXIgb2YgY2FjaGVkIFQyIGVudHJpZXMgKi8KKyNkZWZpbmUgVF9GQ09FX05VTUJFUl9PRl9DQUNIRURfVDJfRU5UUklFUyAoNCkKKworLyogRkNvRSBtYXhpbXVtIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgRkNPRV9IQVNIX1RCTF9DSFVOS19TSVpFCTE2Mzg0CisKIC8qIEV2ZXJlc3QgRkNvRSBjb25uZWN0aW9uIHR5cGUgKi8KICNkZWZpbmUgQjU3N1hYX0ZDT0VfQ09OTkVDVElPTl9UWVBFCQk0CiAKLS8qIEVycm9yIGNvZGVzIGZvciBFcnJvciBSZXBvcnRpbmcgaW4gZmFzdCBwYXRoIGZsb3dzICovCi0vKiBYRkVSIGVycm9yIGNvZGVzICovCisvKiBGQ29FIG51bWJlciBvZiByb3dzIChpbiBsb2cpLiBUaGlzIG51bWJlciBkZXJpdmVzCisgKiBmcm9tIHRoZSBtYXhpbXVtIGNvbm5lY3Rpb25zIHN1cHBvcnRlZCB3aGljaCBpcyAyMDQ4LgorICogVEJBOiBOZWVkIGEgZGlmZmVyZW50IGNvbnN0YW50IGZvciBFMgorICovCisjZGVmaW5lIEZDT0VfTUFYX05VTV9TRVNTSU9OU19MT0cJCTExCisKKyNkZWZpbmUgRkNfQUJUU19SRVBMWV9NQVhfUEFZTE9BRF9MRU4JMTIKKworLyogRXJyb3IgY29kZXMgZm9yIEVycm9yIFJlcG9ydGluZyBpbiBzbG93IHBhdGggZmxvd3MgKi8KKyNkZWZpbmUgRkNPRV9TTE9XX1BBVEhfRVJST1JfQ09ERV9UT09fTUFOWV9GVU5DUwkJCTAKKyNkZWZpbmUgRkNPRV9TTE9XX1BBVEhfRVJST1JfQ09ERV9OT19MSUNFTlNFCQkJCTEKKworLyogRXJyb3IgY29kZXMgZm9yIEVycm9yIFJlcG9ydGluZyBpbiBmYXN0IHBhdGggZmxvd3MKKyAqIFhGRVIgZXJyb3IgY29kZXMKKyAqLwogI2RlZmluZSBGQ09FX0VSUk9SX0NPREVfWEZFUl9PT09fUk8JCQkJCTAKICNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX1hGRVJfUk9fTk9UX0FMSUdORUQJCQkJMQogI2RlZmluZSBGQ09FX0VSUk9SX0NPREVfWEZFUl9OVUxMX0JVUlNUX0xFTgkJCQkyCkBAIC0xNTUsMTcgKzIyMiwxNyBAQAogI2RlZmluZSBGQ09FX0VSUk9SX0NPREVfREFUQV9TT0ZJM19TRVFfQUNUSVZFX1NFVAkJCTIzCiAjZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9EQVRBX1NPRk5fU0VRX0FDVElWRV9SRVNFVAkJCTI0CiAjZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9EQVRBX0VPRk5fRU5EX1NFUV9TRVQJCQkJMjUKLSNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX0RBVEFfRU9GVF9FTkRfU0VRX1JFU0VUCQkJMjYKLSNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX0RBVEFfVEFTS19UWVBFX05PVF9SRUFECQkJMjcKKyNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX0RBVEFfRU9GVF9FTkRfU0VRX1JFU0VUCQkJCTI2CisjZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9EQVRBX1RBU0tfVFlQRV9OT1RfUkVBRAkJCQkyNwogI2RlZmluZSBGQ09FX0VSUk9SX0NPREVfREFUQV9GQ1RMCQkJCQkyOAogCiAvKiBNaWRkbGUgcGF0aCBlcnJvciBjb2RlcyAqLwotI2RlZmluZSBGQ09FX0VSUk9SX0NPREVfTUlEUEFUSF9UWVBFX05PVF9FTFMJCQkJMjkKKyNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX01JRFBBVEhfSU5WQUxJRF9UWVBFCQkJCTI5CiAjZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9NSURQQVRIX1NPRkkzX1NFUV9BQ1RJVkVfU0VUCQkJMzAKICNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX01JRFBBVEhfU09GTl9TRVFfQUNUSVZFX1JFU0VUCQkJMzEKICNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX01JRFBBVEhfRU9GTl9FTkRfU0VRX1NFVAkJCTMyCiAjZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9NSURQQVRIX0VPRlRfRU5EX1NFUV9SRVNFVAkJCTMzCi0jZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9NSURQQVRIX0VMU19SRVBMWV9GQ1RMCQkJCTM0CisjZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9NSURQQVRIX1JFUExZX0ZDVEwJCQkJMzQKICNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX01JRFBBVEhfSU5WQUxJRF9SRVBMWQkJCQkzNQogI2RlZmluZSBGQ09FX0VSUk9SX0NPREVfTUlEUEFUSF9FTFNfUkVQTFlfUkNUTAkJCQkzNgogCkBAIC0xNzMsNyArMjQwLDcgQEAKICNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX0FCVFNfUkVQTFlfRl9DVEwJCQkJMzcKICNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX0FCVFNfUkVQTFlfRERGX1JDVExfRklFTEQJCQkzOAogI2RlZmluZSBGQ09FX0VSUk9SX0NPREVfQUJUU19SRVBMWV9JTlZBTElEX0JMU19SQ1RMCQkJMzkKLSNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX0FCVFNfUkVQTFlfSU5WQUxJRF9SQ1RMCQkJNDAKKyNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX0FCVFNfUkVQTFlfSU5WQUxJRF9SQ1RMCQkJCTQwCiAjZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9BQlRTX1JFUExZX1JDVExfR0VORVJBTF9NSVNNQVRDSAkJNDEKIAogLyogQ29tbW9uIGVycm9yIGNvZGVzICovCkBAIC0xODUsNyArMjUyLDcgQEAKICNkZWZpbmUgRkNPRV9FUlJPUl9DT0RFX0NPTU1PTl9EQVRBX05PX01PUkVfU0dFUwkJCTQ3CiAjZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9DT01NT05fT1BUSU9OQUxfRkNfSERSCQkJCTQ4CiAjZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9DT01NT05fUkVBRF9UQ0VfT1hfSURfVE9PX0JJRwkJCTQ5Ci0jZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9DT01NT05fREFUQV9XQVNfTk9UX1RSQU5TTUlUVEVECQk1MAorI2RlZmluZSBGQ09FX0VSUk9SX0NPREVfQ09NTU9OX0RBVEFfV0FTX05PVF9UUkFOU01JVFRFRAkJCTUwCiAKIC8qIFVuc29saWNpdGVkIFJ4IGVycm9yIGNvZGVzICovCiAjZGVmaW5lIEZDT0VfRVJST1JfQ09ERV9VTlNPTElDSVRFRF9UWVBFX05PVF9FTFMJCQk1MQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZWxzLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYwppbmRleCA1MmMzNTg0Li43ZTg5MTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYwpAQCAtODMsNyArODMsNyBAQAogCXJycS5ycnFfY21kID0gRUxTX1JSUTsKIAlodG9uMjQocnJxLnJycV9zX2lkLCBzaWQpOwogCXJycS5ycnFfb3hfaWQgPSBodG9ucyhhYm9ydGVkX2lvX3JlcS0+eGlkKTsKLQlycnEucnJxX3J4X2lkID0gaHRvbnMoYWJvcnRlZF9pb19yZXEtPnRhc2stPnJ4X3dyX3R4X3JkLnJ4X2lkKTsKKwlycnEucnJxX3J4X2lkID0gaHRvbnMoYWJvcnRlZF9pb19yZXEtPnRhc2stPnJ4d3JfdHhyZC52YXJfY3R4LnJ4X2lkKTsKIAogcmV0cnlfcnJxOgogCXJjID0gYm54MmZjX2luaXRpYXRlX2Vscyh0Z3QsIEVMU19SUlEsICZycnEsIHNpemVvZihycnEpLApAQCAtNDE3LDEyICs0MTcsMTMgQEAKIAogCWhkciA9ICh1NjQgKilmY19oZHI7CiAJdGVtcF9oZHIgPSAodTY0ICopCi0JCSZ0YXNrLT5jbW4uZ2VuZXJhbC5jbWRfaW5mby5tcF9mY19mcmFtZS5mY19oZHI7CisJCSZ0YXNrLT5yeHdyX29ubHkudW5pb25fY3R4LmNvbXBfaW5mby5tcF9yc3AuZmNfaGRyOwogCWhkclswXSA9IGNwdV90b19iZTY0KHRlbXBfaGRyWzBdKTsKIAloZHJbMV0gPSBjcHVfdG9fYmU2NCh0ZW1wX2hkclsxXSk7CiAJaGRyWzJdID0gY3B1X3RvX2JlNjQodGVtcF9oZHJbMl0pOwogCi0JbXBfcmVxLT5yZXNwX2xlbiA9IHRhc2stPnJ4X3dyX29ubHkuc2dsX2N0eC5tdWxfc2dlcy5jdXJfc2dlX29mZjsKKwltcF9yZXEtPnJlc3BfbGVuID0KKwkJdGFzay0+cnh3cl9vbmx5LnVuaW9uX2N0eC5jb21wX2luZm8ubXBfcnNwLm1wX3BheWxvYWRfbGVuOwogCiAJLyogUGFyc2UgRUxTIHJlc3BvbnNlICovCiAJaWYgKChlbHNfcmVxLT5jYl9mdW5jKSAmJiAoZWxzX3JlcS0+Y2JfYXJnKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jCmluZGV4IGFiMjU1ZmIuLmE5N2FmZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJibngyZmMiCiAjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTglCTlgyRkNfVkVSU0lPTgotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIk1hciAxNywgMjAxMSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW4gMTAsIDIwMTEiCiAKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQpAQCAtNjEyLDcgKzYxMiw3IEBACiAJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiRlcgc3RhdCByZXEgdGltZWQgb3V0XG4iKTsKIAkJcmV0dXJuIGJueDJmY19zdGF0czsKIAl9Ci0JYm54MmZjX3N0YXRzLT5pbnZhbGlkX2NyY19jb3VudCArPSBmd19zdGF0cy0+cnhfc3RhdDEuZmNfY3JjX2NudDsKKwlibngyZmNfc3RhdHMtPmludmFsaWRfY3JjX2NvdW50ICs9IGZ3X3N0YXRzLT5yeF9zdGF0Mi5mY19jcmNfY250OwogCWJueDJmY19zdGF0cy0+dHhfZnJhbWVzICs9IGZ3X3N0YXRzLT50eF9zdGF0LmZjb2VfdHhfcGt0X2NudDsKIAlibngyZmNfc3RhdHMtPnR4X3dvcmRzICs9IChmd19zdGF0cy0+dHhfc3RhdC5mY29lX3R4X2J5dGVfY250KSAvIDQ7CiAJYm54MmZjX3N0YXRzLT5yeF9mcmFtZXMgKz0gZndfc3RhdHMtPnJ4X3N0YXQwLmZjb2VfcnhfcGt0X2NudDsKQEAgLTY3OSw2ICs2NzksOSBAQAogCQljYXNlIFNQRUVEXzEwMDA6CiAJCQlscG9ydC0+bGlua19zcGVlZCA9IEZDX1BPUlRTUEVFRF8xR0JJVDsKIAkJCWJyZWFrOworCQljYXNlIFNQRUVEXzI1MDA6CisJCQlscG9ydC0+bGlua19zcGVlZCA9IEZDX1BPUlRTUEVFRF8yR0JJVDsKKwkJCWJyZWFrOwogCQljYXNlIFNQRUVEXzEwMDAwOgogCQkJbHBvcnQtPmxpbmtfc3BlZWQgPSBGQ19QT1JUU1BFRURfMTBHQklUOwogCQkJYnJlYWs7CkBAIC03NjcsMTcgKzc3MCwyMyBAQAogICoKICAqIEBjb250ZXh0OglhZGFwdGVyIHN0cnVjdHVyZSBwb2ludGVyCiAgKiBAZXZlbnQ6CWV2ZW50IHR5cGUKKyAqIEB2bGFuX2lkOgl2bGFuIGlkIC0gYXNzb2NpYXRlZCB2bGFuIGlkIHdpdGggdGhpcyBldmVudAogICoKICAqIEhhbmRsZXMgTkVUREVWX1VQLCBORVRERVZfRE9XTiwgTkVUREVWX0dPSU5HX0RPV04sTkVUREVWX0NIQU5HRSBhbmQKICAqIE5FVERFVl9DSEFOR0VfTVRVIGV2ZW50cwogICovCi1zdGF0aWMgdm9pZCBibngyZmNfaW5kaWNhdGVfbmV0ZXZlbnQodm9pZCAqY29udGV4dCwgdW5zaWduZWQgbG9uZyBldmVudCkKK3N0YXRpYyB2b2lkIGJueDJmY19pbmRpY2F0ZV9uZXRldmVudCh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBsb25nIGV2ZW50LAorCQkJCSAgICAgdTE2IHZsYW5faWQpCiB7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IChzdHJ1Y3QgYm54MmZjX2hiYSAqKWNvbnRleHQ7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGhiYS0+Y3Rsci5scDsKIAlzdHJ1Y3QgZmNfbHBvcnQgKnZwb3J0OwogCXUzMiBsaW5rX3Bvc3NpYmxlID0gMTsKIAorCS8qIElnbm9yZSB2bGFucyBmb3Igbm93ICovCisJaWYgKHZsYW5faWQgIT0gMCkKKwkJcmV0dXJuOworCiAJaWYgKCF0ZXN0X2JpdChCTlgyRkNfQ1JFQVRFX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpIHsKIAkJQk5YMkZDX01JU0NfREJHKCJkcml2ZXIgbm90IHJlYWR5LiBldmVudD0lcyAlbGRcbiIsCiAJCQkgICBoYmEtPm5ldGRldi0+bmFtZSwgZXZlbnQpOwpAQCAtMTIyNSw2ICsxMjM0LDcgQEAKIAloYmEtPmN0bHIuZ2V0X3NyY19hZGRyID0gYm54MmZjX2dldF9zcmNfbWFjOwogCXNldF9iaXQoQk5YMkZDX0NUTFJfSU5JVF9ET05FLCAmaGJhLT5pbml0X2RvbmUpOwogCisJSU5JVF9MSVNUX0hFQUQoJmhiYS0+dnBvcnRzKTsKIAlyYyA9IGJueDJmY19uZXRkZXZfc2V0dXAoaGJhKTsKIAlpZiAocmMpCiAJCWdvdG8gc2V0dXBfZXJyOwpAQCAtMTI2MSw4ICsxMjcxLDE1IEBACiAJc3RydWN0IGZjb2VfcG9ydAkqcG9ydDsKIAlzdHJ1Y3QgU2NzaV9Ib3N0CSpzaG9zdDsKIAlzdHJ1Y3QgZmNfdnBvcnQJCSp2cG9ydCA9IGRldl90b192cG9ydChwYXJlbnQpOworCXN0cnVjdCBibngyZmNfbHBvcnQJKmJscG9ydDsKIAlpbnQJCQlyYyA9IDA7CiAKKwlibHBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm54MmZjX2xwb3J0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFibHBvcnQpIHsKKwkJQk5YMkZDX0hCQV9EQkcoaGJhLT5jdGxyLmxwLCAiVW5hYmxlIHRvIGFsbG9jIGJueDJmY19scG9ydFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwogCS8qIEFsbG9jYXRlIFNjc2lfSG9zdCBzdHJ1Y3R1cmUgKi8KIAlpZiAoIW5waXYpCiAJCWxwb3J0ID0gbGliZmNfaG9zdF9hbGxvYygmYm54MmZjX3Nob3N0X3RlbXBsYXRlLCBzaXplb2YoKnBvcnQpKTsKQEAgLTEyNzEsNyArMTI4OCw3IEBACiAKIAlpZiAoIWxwb3J0KSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImNvdWxkIG5vdCBhbGxvY2F0ZSBzY3NpIGhvc3Qgc3RydWN0dXJlXG4iKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZnJlZV9ibHBvcnQ7CiAJfQogCXNob3N0ID0gbHBvcnQtPmhvc3Q7CiAJcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwpAQCAtMTMyNywxMiArMTM0NCwyMCBAQAogCX0KIAogCWJueDJmY19pbnRlcmZhY2VfZ2V0KGhiYSk7CisKKwlzcGluX2xvY2tfYmgoJmhiYS0+aGJhX2xvY2spOworCWJscG9ydC0+bHBvcnQgPSBscG9ydDsKKwlsaXN0X2FkZF90YWlsKCZibHBvcnQtPmxpc3QsICZoYmEtPnZwb3J0cyk7CisJc3Bpbl91bmxvY2tfYmgoJmhiYS0+aGJhX2xvY2spOworCiAJcmV0dXJuIGxwb3J0OwogCiBzaG9zdF9lcnI6CiAJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CiBscF9jb25maWdfZXJyOgogCXNjc2lfaG9zdF9wdXQobHBvcnQtPmhvc3QpOworZnJlZV9ibHBvcnQ6CisJa2ZyZWUoYmxwb3J0KTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTM0OCw2ICsxMzczLDcgQEAKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19scG9ydCAqYmxwb3J0LCAqdG1wOwogCiAJQk5YMkZDX0hCQV9EQkcoaGJhLT5jdGxyLmxwLCAiRU5URVJFRCBibngyZmNfaWZfZGVzdHJveVxuIik7CiAJLyogU3RvcCB0aGUgdHJhbnNtaXQgcmV0cnkgdGltZXIgKi8KQEAgLTEzNzIsNiArMTM5OCwxNSBAQAogCS8qIEZyZWUgbWVtb3J5IHVzZWQgYnkgc3RhdGlzdGljYWwgY291bnRlcnMgKi8KIAlmY19scG9ydF9mcmVlX3N0YXRzKGxwb3J0KTsKIAorCXNwaW5fbG9ja19iaCgmaGJhLT5oYmFfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJscG9ydCwgdG1wLCAmaGJhLT52cG9ydHMsIGxpc3QpIHsKKwkJaWYgKGJscG9ydC0+bHBvcnQgPT0gbHBvcnQpIHsKKwkJCWxpc3RfZGVsKCZibHBvcnQtPmxpc3QpOworCQkJa2ZyZWUoYmxwb3J0KTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmaGJhLT5oYmFfbG9jayk7CisKIAkvKiBSZWxlYXNlIFNjc2lfSG9zdCAqLwogCXNjc2lfaG9zdF9wdXQobHBvcnQtPmhvc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19od2kuYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jCmluZGV4IGY3NTZkNWYuLjA5YmRkOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jCkBAIC0xMDAsNiArMTAwLDkgQEAKIAlmY29lX2luaXQyLmhkci5mbGFncyA9IChGQ09FX0tXUUVfTEFZRVJfQ09ERSA8PAogCQkJCQlGQ09FX0tXUUVfSEVBREVSX0xBWUVSX0NPREVfU0hJRlQpOwogCisJZmNvZV9pbml0Mi5oc2lfbWFqb3JfdmVyc2lvbiA9IEZDT0VfSFNJX01BSk9SX1ZFUlNJT047CisJZmNvZV9pbml0Mi5oc2lfbWlub3JfdmVyc2lvbiA9IEZDT0VfSFNJX01JTk9SX1ZFUlNJT047CisKIAlmY29lX2luaXQyLmhhc2hfdGJsX3BibF9hZGRyX2xvID0gKHUzMikgaGJhLT5oYXNoX3RibF9wYmxfZG1hOwogCWZjb2VfaW5pdDIuaGFzaF90YmxfcGJsX2FkZHJfaGkgPSAodTMyKQogCQkJCQkgICAoKHU2NCkgaGJhLT5oYXNoX3RibF9wYmxfZG1hID4+IDMyKTsKQEAgLTEyMiw2ICsxMjUsNyBAQAogCWZjb2VfaW5pdDMuZXJyb3JfYml0X21hcF9sbyA9IDB4ZmZmZmZmZmY7CiAJZmNvZV9pbml0My5lcnJvcl9iaXRfbWFwX2hpID0gMHhmZmZmZmZmZjsKIAorCWZjb2VfaW5pdDMucGVyZl9jb25maWcgPSAxOwogCiAJa3dxZV9hcnJbMF0gPSAoc3RydWN0IGt3cWUgKikgJmZjb2VfaW5pdDE7CiAJa3dxZV9hcnJbMV0gPSAoc3RydWN0IGt3cWUgKikgJmZjb2VfaW5pdDI7CkBAIC0yODksMTkgKzI5MywxOSBAQAogCW9mbGRfcmVxNC5lX2RfdG92X3RpbWVyX3ZhbCA9IGxwb3J0LT5lX2RfdG92IC8gMjA7CiAKIAotCW9mbGRfcmVxNC5zcmNfbWFjX2FkZHJfbG8zMlswXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzVdOworCW9mbGRfcmVxNC5zcmNfbWFjX2FkZHJfbG9bMF0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkcls1XTsKIAkJCQkJCQkvKiBsb2NhbCBtYWMgKi8KLQlvZmxkX3JlcTQuc3JjX21hY19hZGRyX2xvMzJbMV0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkcls0XTsKLQlvZmxkX3JlcTQuc3JjX21hY19hZGRyX2xvMzJbMl0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclszXTsKLQlvZmxkX3JlcTQuc3JjX21hY19hZGRyX2xvMzJbM10gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclsyXTsKLQlvZmxkX3JlcTQuc3JjX21hY19hZGRyX2hpMTZbMF0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclsxXTsKLQlvZmxkX3JlcTQuc3JjX21hY19hZGRyX2hpMTZbMV0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclswXTsKLQlvZmxkX3JlcTQuZHN0X21hY19hZGRyX2xvMzJbMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls1XTsvKiBmY2YgbWFjICovCi0Jb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9sbzMyWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbNF07Ci0Jb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9sbzMyWzJdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbM107Ci0Jb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9sbzMyWzNdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMl07Ci0Jb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9oaTE2WzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMV07Ci0Jb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9oaTE2WzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMF07CisJb2ZsZF9yZXE0LnNyY19tYWNfYWRkcl9sb1sxXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzRdOworCW9mbGRfcmVxNC5zcmNfbWFjX2FkZHJfbWlkWzBdID0gIHBvcnQtPmRhdGFfc3JjX2FkZHJbM107CisJb2ZsZF9yZXE0LnNyY19tYWNfYWRkcl9taWRbMV0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclsyXTsKKwlvZmxkX3JlcTQuc3JjX21hY19hZGRyX2hpWzBdID0gIHBvcnQtPmRhdGFfc3JjX2FkZHJbMV07CisJb2ZsZF9yZXE0LnNyY19tYWNfYWRkcl9oaVsxXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzBdOworCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfbG9bMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls1XTsvKiBmY2YgbWFjICovCisJb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9sb1sxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzRdOworCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfbWlkWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbM107CisJb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9taWRbMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclsyXTsKKwlvZmxkX3JlcTQuZHN0X21hY19hZGRyX2hpWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMV07CisJb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9oaVsxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzBdOwogCiAJb2ZsZF9yZXE0LmxjcV9hZGRyX2xvID0gKHUzMikgdGd0LT5sY3FfZG1hOwogCW9mbGRfcmVxNC5sY3FfYWRkcl9oaSA9ICh1MzIpKCh1NjQpIHRndC0+bGNxX2RtYSA+PiAzMik7CkBAIC0zNDUsMjAgKzM0OSwyMSBAQAogCWVuYmxfcmVxLmhkci5mbGFncyA9CiAJCShGQ09FX0tXUUVfTEFZRVJfQ09ERSA8PCBGQ09FX0tXUUVfSEVBREVSX0xBWUVSX0NPREVfU0hJRlQpOwogCi0JZW5ibF9yZXEuc3JjX21hY19hZGRyX2xvMzJbMF0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkcls1XTsKKwllbmJsX3JlcS5zcmNfbWFjX2FkZHJfbG9bMF0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkcls1XTsKIAkJCQkJCQkvKiBsb2NhbCBtYWMgKi8KLQllbmJsX3JlcS5zcmNfbWFjX2FkZHJfbG8zMlsxXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzRdOwotCWVuYmxfcmVxLnNyY19tYWNfYWRkcl9sbzMyWzJdID0gIHBvcnQtPmRhdGFfc3JjX2FkZHJbM107Ci0JZW5ibF9yZXEuc3JjX21hY19hZGRyX2xvMzJbM10gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclsyXTsKLQllbmJsX3JlcS5zcmNfbWFjX2FkZHJfaGkxNlswXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzFdOwotCWVuYmxfcmVxLnNyY19tYWNfYWRkcl9oaTE2WzFdID0gIHBvcnQtPmRhdGFfc3JjX2FkZHJbMF07CisJZW5ibF9yZXEuc3JjX21hY19hZGRyX2xvWzFdID0gIHBvcnQtPmRhdGFfc3JjX2FkZHJbNF07CisJZW5ibF9yZXEuc3JjX21hY19hZGRyX21pZFswXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzNdOworCWVuYmxfcmVxLnNyY19tYWNfYWRkcl9taWRbMV0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclsyXTsKKwllbmJsX3JlcS5zcmNfbWFjX2FkZHJfaGlbMF0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclsxXTsKKwllbmJsX3JlcS5zcmNfbWFjX2FkZHJfaGlbMV0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclswXTsKKwltZW1jcHkodGd0LT5zcmNfYWRkciwgcG9ydC0+ZGF0YV9zcmNfYWRkciwgRVRIX0FMRU4pOwogCi0JZW5ibF9yZXEuZHN0X21hY19hZGRyX2xvMzJbMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls1XTsvKiBmY2YgbWFjICovCi0JZW5ibF9yZXEuZHN0X21hY19hZGRyX2xvMzJbMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls0XTsKLQllbmJsX3JlcS5kc3RfbWFjX2FkZHJfbG8zMlsyXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzNdOwotCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9sbzMyWzNdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMl07Ci0JZW5ibF9yZXEuZHN0X21hY19hZGRyX2hpMTZbMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclsxXTsKLQllbmJsX3JlcS5kc3RfbWFjX2FkZHJfaGkxNlsxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzBdOworCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9sb1swXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzVdOy8qIGZjZiBtYWMgKi8KKwllbmJsX3JlcS5kc3RfbWFjX2FkZHJfbG9bMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls0XTsKKwllbmJsX3JlcS5kc3RfbWFjX2FkZHJfbWlkWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbM107CisJZW5ibF9yZXEuZHN0X21hY19hZGRyX21pZFsxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzJdOworCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9oaVswXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzFdOworCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9oaVsxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzBdOwogCiAJcG9ydF9pZCA9IGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCk7CiAJaWYgKHBvcnRfaWQgIT0gdGd0LT5zaWQpIHsKQEAgLTQxMSwxOCArNDE2LDE5IEBACiAJZGlzYWJsZV9yZXEuaGRyLmZsYWdzID0KIAkJKEZDT0VfS1dRRV9MQVlFUl9DT0RFIDw8IEZDT0VfS1dRRV9IRUFERVJfTEFZRVJfQ09ERV9TSElGVCk7CiAKLQlkaXNhYmxlX3JlcS5zcmNfbWFjX2FkZHJfbG8zMlswXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzVdOwotCWRpc2FibGVfcmVxLnNyY19tYWNfYWRkcl9sbzMyWzJdID0gIHBvcnQtPmRhdGFfc3JjX2FkZHJbM107Ci0JZGlzYWJsZV9yZXEuc3JjX21hY19hZGRyX2xvMzJbM10gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclsyXTsKLQlkaXNhYmxlX3JlcS5zcmNfbWFjX2FkZHJfaGkxNlswXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzFdOwotCWRpc2FibGVfcmVxLnNyY19tYWNfYWRkcl9oaTE2WzFdID0gIHBvcnQtPmRhdGFfc3JjX2FkZHJbMF07CisJZGlzYWJsZV9yZXEuc3JjX21hY19hZGRyX2xvWzBdID0gIHRndC0+c3JjX2FkZHJbNV07CisJZGlzYWJsZV9yZXEuc3JjX21hY19hZGRyX2xvWzFdID0gIHRndC0+c3JjX2FkZHJbNF07CisJZGlzYWJsZV9yZXEuc3JjX21hY19hZGRyX21pZFswXSA9ICB0Z3QtPnNyY19hZGRyWzNdOworCWRpc2FibGVfcmVxLnNyY19tYWNfYWRkcl9taWRbMV0gPSAgdGd0LT5zcmNfYWRkclsyXTsKKwlkaXNhYmxlX3JlcS5zcmNfbWFjX2FkZHJfaGlbMF0gPSAgdGd0LT5zcmNfYWRkclsxXTsKKwlkaXNhYmxlX3JlcS5zcmNfbWFjX2FkZHJfaGlbMV0gPSAgdGd0LT5zcmNfYWRkclswXTsKIAotCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9sbzMyWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbNV07LyogZmNmIG1hYyAqLwotCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9sbzMyWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbNF07Ci0JZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX2xvMzJbMl0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclszXTsKLQlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfbG8zMlszXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzJdOwotCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9oaTE2WzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMV07Ci0JZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX2hpMTZbMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclswXTsKKwlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfbG9bMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls1XTsvKiBmY2YgbWFjICovCisJZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX2xvWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbNF07CisJZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX21pZFswXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzNdOworCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9taWRbMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclsyXTsKKwlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfaGlbMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclsxXTsKKwlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfaGlbMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclswXTsKIAogCXBvcnRfaWQgPSB0Z3QtPnNpZDsKIAlkaXNhYmxlX3JlcS5zX2lkWzBdID0gKHBvcnRfaWQgJiAweDAwMDAwMEZGKTsKQEAgLTQ4MCwxNiArNDg2LDM2IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgYm9vbCBpc192YWxpZF9scG9ydChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhLCBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCXN0cnVjdCBibngyZmNfbHBvcnQgKmJscG9ydDsKKworCXNwaW5fbG9ja19iaCgmaGJhLT5oYmFfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShibHBvcnQsICZoYmEtPnZwb3J0cywgbGlzdCkgeworCQlpZiAoYmxwb3J0LT5scG9ydCA9PSBscG9ydCkgeworCQkJc3Bpbl91bmxvY2tfYmgoJmhiYS0+aGJhX2xvY2spOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmhiYS0+aGJhX2xvY2spOworCXJldHVybiBmYWxzZTsKKworfQorCisKIHN0YXRpYyB2b2lkIGJueDJmY191bnNvbF9lbHNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGJueDJmY191bnNvbF9lbHMgKnVuc29sX2VsczsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OworCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CiAJc3RydWN0IGZjX2ZyYW1lICpmcDsKIAogCXVuc29sX2VscyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYm54MmZjX3Vuc29sX2VscywgdW5zb2xfZWxzX3dvcmspOwogCWxwb3J0ID0gdW5zb2xfZWxzLT5scG9ydDsKIAlmcCA9IHVuc29sX2Vscy0+ZnA7Ci0JZmNfZXhjaF9yZWN2KGxwb3J0LCBmcCk7CisJaGJhID0gdW5zb2xfZWxzLT5oYmE7CisJaWYgKGlzX3ZhbGlkX2xwb3J0KGhiYSwgbHBvcnQpKQorCQlmY19leGNoX3JlY3YobHBvcnQsIGZwKTsKIAlrZnJlZSh1bnNvbF9lbHMpOwogfQogCkBAIC00OTksNiArNTI1LDcgQEAKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gdGd0LT5wb3J0OwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBwb3J0LT5scG9ydDsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKIAlzdHJ1Y3QgYm54MmZjX3Vuc29sX2VscyAqdW5zb2xfZWxzOwogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOwogCXN0cnVjdCBmY19mcmFtZSAqZnA7CkBAIC01NTksNiArNTg2LDcgQEAKIAkJZnJfZW9mKGZwKSA9IEZDX0VPRl9UOwogCQlmcl9jcmMoZnApID0gY3B1X3RvX2xlMzIofmNyYyk7CiAJCXVuc29sX2Vscy0+bHBvcnQgPSBscG9ydDsKKwkJdW5zb2xfZWxzLT5oYmEgPSBoYmE7CiAJCXVuc29sX2Vscy0+ZnAgPSBmcDsKIAkJSU5JVF9XT1JLKCZ1bnNvbF9lbHMtPnVuc29sX2Vsc193b3JrLCBibngyZmNfdW5zb2xfZWxzX3dvcmspOwogCQlxdWV1ZV93b3JrKGJueDJmY193cSwgJnVuc29sX2Vscy0+dW5zb2xfZWxzX3dvcmspOwpAQCAtNjQwLDEwICs2NjgsMTAgQEAKIAkJeGlkID0gZXJyX2VudHJ5LT5mY19oZHIub3hfaWQ7CiAJCUJOWDJGQ19UR1RfREJHKHRndCwgIlVuc29sIEVycm9yIEZyYW1lIE9YX0lEID0gMHgleFxuIiwgeGlkKTsKIAkJQk5YMkZDX1RHVF9EQkcodGd0LCAiZXJyX3dhcm5fYml0bWFwID0gJTA4eDolMDh4XG4iLAotCQkJZXJyX2VudHJ5LT5lcnJfd2Fybl9iaXRtYXBfaGksCi0JCQllcnJfZW50cnktPmVycl93YXJuX2JpdG1hcF9sbyk7CisJCQllcnJfZW50cnktPmRhdGEuZXJyX3dhcm5fYml0bWFwX2hpLAorCQkJZXJyX2VudHJ5LT5kYXRhLmVycl93YXJuX2JpdG1hcF9sbyk7CiAJCUJOWDJGQ19UR1RfREJHKHRndCwgImJ1Zl9vZmZzZXRzIC0gdHggPSAweCV4LCByeCA9IDB4JXhcbiIsCi0JCQllcnJfZW50cnktPnR4X2J1Zl9vZmYsIGVycl9lbnRyeS0+cnhfYnVmX29mZik7CisJCQllcnJfZW50cnktPmRhdGEudHhfYnVmX29mZiwgZXJyX2VudHJ5LT5kYXRhLnJ4X2J1Zl9vZmYpOwogCiAJCWJueDJmY19yZXR1cm5fcnFlKHRndCwgMSk7CiAKQEAgLTcyMiwxMCArNzUwLDEwIEBACiAJCXhpZCA9IGNwdV90b19iZTE2KGVycl9lbnRyeS0+ZmNfaGRyLm94X2lkKTsKIAkJQk5YMkZDX1RHVF9EQkcodGd0LCAiVW5zb2wgV2FybmluZyBGcmFtZSBPWF9JRCA9IDB4JXhcbiIsIHhpZCk7CiAJCUJOWDJGQ19UR1RfREJHKHRndCwgImVycl93YXJuX2JpdG1hcCA9ICUwOHg6JTA4eCIsCi0JCQllcnJfZW50cnktPmVycl93YXJuX2JpdG1hcF9oaSwKLQkJCWVycl9lbnRyeS0+ZXJyX3dhcm5fYml0bWFwX2xvKTsKKwkJCWVycl9lbnRyeS0+ZGF0YS5lcnJfd2Fybl9iaXRtYXBfaGksCisJCQllcnJfZW50cnktPmRhdGEuZXJyX3dhcm5fYml0bWFwX2xvKTsKIAkJQk5YMkZDX1RHVF9EQkcodGd0LCAiYnVmX29mZnNldHMgLSB0eCA9IDB4JXgsIHJ4ID0gMHgleCIsCi0JCQllcnJfZW50cnktPnR4X2J1Zl9vZmYsIGVycl9lbnRyeS0+cnhfYnVmX29mZik7CisJCQllcnJfZW50cnktPmRhdGEudHhfYnVmX29mZiwgZXJyX2VudHJ5LT5kYXRhLnJ4X2J1Zl9vZmYpOwogCiAJCWJueDJmY19yZXR1cm5fcnFlKHRndCwgMSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKQEAgLTc2Miw5ICs3OTAsOSBAQAogCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKWhiYS0+dGFza19jdHhbdGFza19pZHhdOwogCXRhc2sgPSAmKHRhc2tfcGFnZVtpbmRleF0pOwogCi0JbnVtX3JxID0gKCh0YXNrLT5yeF93cl90eF9yZC5yeF9mbGFncyAmCi0JCSAgIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX05VTV9SUV9XUUUpID4+Ci0JCSAgIEZDT0VfVEFTS19DVFhfRU5UUllfUlhXUl9UWFJEX05VTV9SUV9XUUVfU0hJRlQpOworCW51bV9ycSA9ICgodGFzay0+cnh3cl90eHJkLnZhcl9jdHgucnhfZmxhZ3MgJgorCQkgICBGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfTlVNX1JRX1dRRSkgPj4KKwkJICAgRkNPRV9UQ0VfUlhfV1JfVFhfUkRfVkFSX05VTV9SUV9XUUVfU0hJRlQpOwogCiAJaW9fcmVxID0gKHN0cnVjdCBibngyZmNfY21kICopaGJhLT5jbWRfbWdyLT5jbWRzW3hpZF07CiAKQEAgLTc3NywyMiArODA1LDE5IEBACiAJLyogVGltZXN0YW1wIElPIGNvbXBsZXRpb24gdGltZSAqLwogCWNtZF90eXBlID0gaW9fcmVxLT5jbWRfdHlwZTsKIAotCS8qIG9wdGltaXplZCBjb21wbGV0aW9uIHBhdGggKi8KLQlpZiAoY21kX3R5cGUgPT0gQk5YMkZDX1NDU0lfQ01EKSB7Ci0JCXJ4X3N0YXRlID0gKCh0YXNrLT5yeF93cl90eF9yZC5yeF9mbGFncyAmCi0JCQkgICAgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfUlhfU1RBVEUpID4+Ci0JCQkgICAgRkNPRV9UQVNLX0NUWF9FTlRSWV9SWFdSX1RYUkRfUlhfU1RBVEVfU0hJRlQpOworCXJ4X3N0YXRlID0gKCh0YXNrLT5yeHdyX3R4cmQudmFyX2N0eC5yeF9mbGFncyAmCisJCSAgICBGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfUlhfU1RBVEUpID4+CisJCSAgICBGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfUlhfU1RBVEVfU0hJRlQpOwogCisJLyogUHJvY2VzcyBvdGhlciBJTyBjb21wbGV0aW9uIHR5cGVzICovCisJc3dpdGNoIChjbWRfdHlwZSkgeworCWNhc2UgQk5YMkZDX1NDU0lfQ01EOgogCQlpZiAocnhfc3RhdGUgPT0gRkNPRV9UQVNLX1JYX1NUQVRFX0NPTVBMRVRFRCkgewogCQkJYm54MmZjX3Byb2Nlc3Nfc2NzaV9jbWRfY29tcGwoaW9fcmVxLCB0YXNrLCBudW1fcnEpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwogCQkJcmV0dXJuOwogCQl9Ci0JfQogCi0JLyogUHJvY2VzcyBvdGhlciBJTyBjb21wbGV0aW9uIHR5cGVzICovCi0Jc3dpdGNoIChjbWRfdHlwZSkgewotCWNhc2UgQk5YMkZDX1NDU0lfQ01EOgogCQlpZiAocnhfc3RhdGUgPT0gRkNPRV9UQVNLX1JYX1NUQVRFX0FCVFNfQ09NUExFVEVEKQogCQkJYm54MmZjX3Byb2Nlc3NfYWJ0c19jb21wbChpb19yZXEsIHRhc2ssIG51bV9ycSk7CiAJCWVsc2UgaWYgKHJ4X3N0YXRlID09CkBAIC04MTksOCArODQ0LDE2IEBACiAJCWJyZWFrOwogCiAJY2FzZSBCTlgyRkNfRUxTOgotCQlCTlgyRkNfSU9fREJHKGlvX3JlcSwgImNxX2NvbXBsIC0gY2FsbCBwcm9jZXNzX2Vsc19jb21wbFxuIik7Ci0JCWJueDJmY19wcm9jZXNzX2Vsc19jb21wbChpb19yZXEsIHRhc2ssIG51bV9ycSk7CisJCWlmIChyeF9zdGF0ZSA9PSBGQ09FX1RBU0tfUlhfU1RBVEVfQ09NUExFVEVEKQorCQkJYm54MmZjX3Byb2Nlc3NfZWxzX2NvbXBsKGlvX3JlcSwgdGFzaywgbnVtX3JxKTsKKwkJZWxzZSBpZiAocnhfc3RhdGUgPT0gRkNPRV9UQVNLX1JYX1NUQVRFX0FCVFNfQ09NUExFVEVEKQorCQkJYm54MmZjX3Byb2Nlc3NfYWJ0c19jb21wbChpb19yZXEsIHRhc2ssIG51bV9ycSk7CisJCWVsc2UgaWYgKHJ4X3N0YXRlID09CisJCQkgRkNPRV9UQVNLX1JYX1NUQVRFX0VYQ0hBTkdFX0NMRUFOVVBfQ09NUExFVEVEKQorCQkJYm54MmZjX3Byb2Nlc3NfY2xlYW51cF9jb21wbChpb19yZXEsIHRhc2ssIG51bV9ycSk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkludmFsaWQgcnggc3RhdGUgPSAgJWRcbiIsCisJCQkJcnhfc3RhdGUpOwogCQlicmVhazsKIAogCWNhc2UgQk5YMkZDX0NMRUFOVVA6CkBAIC04MzUsNiArODY4LDIwIEBACiAJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwogfQogCit2b2lkIGJueDJmY19hcm1fY3Eoc3RydWN0IGJueDJmY19ycG9ydCAqdGd0KQoreworCXN0cnVjdCBiNTc3eHhfZmNvZV9yeF9kb29yYmVsbCAqcnhfZGIgPSAmdGd0LT5yeF9kYjsKKwl1MzIgbXNnOworCisJd21iKCk7CisJcnhfZGItPmRvb3JiZWxsX2NxX2NvbnMgPSB0Z3QtPmNxX2NvbnNfaWR4IHwgKHRndC0+Y3FfY3Vycl90b2dnbGVfYml0IDw8CisJCQlGQ09FX0NRRV9UT0dHTEVfQklUX1NISUZUKTsKKwltc2cgPSAqKCh1MzIgKilyeF9kYik7CisJd3JpdGVsKGNwdV90b19sZTMyKG1zZyksIHRndC0+Y3R4X2Jhc2UpOworCW1taW93YigpOworCit9CisKIHN0cnVjdCBibngyZmNfd29yayAqYm54MmZjX2FsbG9jX3dvcmsoc3RydWN0IGJueDJmY19ycG9ydCAqdGd0LCB1MTYgd3FlKQogewogCXN0cnVjdCBibngyZmNfd29yayAqd29yazsKQEAgLTg1Myw4ICs5MDAsOCBAQAogCXN0cnVjdCBmY29lX2NxZSAqY3E7CiAJdTMyIGNxX2NvbnM7CiAJc3RydWN0IGZjb2VfY3FlICpjcWU7CisJdTMyIG51bV9mcmVlX3NxZXMgPSAwOwogCXUxNiB3cWU7Ci0JYm9vbCBtb3JlX2NxZXNfZm91bmQgPSBmYWxzZTsKIAogCS8qCiAJICogY3FfbG9jayBpcyBhIGxvdyBjb250ZW50aW9uIGxvY2sgdXNlZCB0byBwcm90ZWN0CkBAIC04NzIsNjIgKzkxOSw1MSBAQAogCWNxX2NvbnMgPSB0Z3QtPmNxX2NvbnNfaWR4OwogCWNxZSA9ICZjcVtjcV9jb25zXTsKIAotCWRvIHsKLQkJbW9yZV9jcWVzX2ZvdW5kIF49IHRydWU7CisJd2hpbGUgKCgod3FlID0gY3FlLT53cWUpICYgRkNPRV9DUUVfVE9HR0xFX0JJVCkgPT0KKwkgICAgICAgKHRndC0+Y3FfY3Vycl90b2dnbGVfYml0IDw8CisJICAgICAgIEZDT0VfQ1FFX1RPR0dMRV9CSVRfU0hJRlQpKSB7CiAKLQkJd2hpbGUgKCgod3FlID0gY3FlLT53cWUpICYgRkNPRV9DUUVfVE9HR0xFX0JJVCkgPT0KLQkJICAgICAgICh0Z3QtPmNxX2N1cnJfdG9nZ2xlX2JpdCA8PAotCQkgICAgICAgRkNPRV9DUUVfVE9HR0xFX0JJVF9TSElGVCkpIHsKKwkJLyogbmV3IGVudHJ5IG9uIHRoZSBjcSAqLworCQlpZiAod3FlICYgRkNPRV9DUUVfQ1FFX1RZUEUpIHsKKwkJCS8qIFVuc29saWNpdGVkIGV2ZW50IG5vdGlmaWNhdGlvbiAqLworCQkJYm54MmZjX3Byb2Nlc3NfdW5zb2xfY29tcGwodGd0LCB3cWUpOworCQl9IGVsc2UgeworCQkJLyogUGVuZGluZyB3b3JrIHJlcXVlc3QgY29tcGxldGlvbiAqLworCQkJc3RydWN0IGJueDJmY193b3JrICp3b3JrID0gTlVMTDsKKwkJCXN0cnVjdCBibngyZmNfcGVyY3B1X3MgKmZwcyA9IE5VTEw7CisJCQl1bnNpZ25lZCBpbnQgY3B1ID0gd3FlICUgbnVtX3Bvc3NpYmxlX2NwdXMoKTsKIAotCQkJLyogbmV3IGVudHJ5IG9uIHRoZSBjcSAqLwotCQkJaWYgKHdxZSAmIEZDT0VfQ1FFX0NRRV9UWVBFKSB7Ci0JCQkJLyogVW5zb2xpY2l0ZWQgZXZlbnQgbm90aWZpY2F0aW9uICovCi0JCQkJYm54MmZjX3Byb2Nlc3NfdW5zb2xfY29tcGwodGd0LCB3cWUpOwotCQkJfSBlbHNlIHsKLQkJCQlzdHJ1Y3QgYm54MmZjX3dvcmsgKndvcmsgPSBOVUxMOwotCQkJCXN0cnVjdCBibngyZmNfcGVyY3B1X3MgKmZwcyA9IE5VTEw7Ci0JCQkJdW5zaWduZWQgaW50IGNwdSA9IHdxZSAlIG51bV9wb3NzaWJsZV9jcHVzKCk7CisJCQlmcHMgPSAmcGVyX2NwdShibngyZmNfcGVyY3B1LCBjcHUpOworCQkJc3Bpbl9sb2NrX2JoKCZmcHMtPmZwX3dvcmtfbG9jayk7CisJCQlpZiAodW5saWtlbHkoIWZwcy0+aW90aHJlYWQpKQorCQkJCWdvdG8gdW5sb2NrOwogCi0JCQkJZnBzID0gJnBlcl9jcHUoYm54MmZjX3BlcmNwdSwgY3B1KTsKLQkJCQlzcGluX2xvY2tfYmgoJmZwcy0+ZnBfd29ya19sb2NrKTsKLQkJCQlpZiAodW5saWtlbHkoIWZwcy0+aW90aHJlYWQpKQotCQkJCQlnb3RvIHVubG9jazsKLQotCQkJCXdvcmsgPSBibngyZmNfYWxsb2Nfd29yayh0Z3QsIHdxZSk7Ci0JCQkJaWYgKHdvcmspCi0JCQkJCWxpc3RfYWRkX3RhaWwoJndvcmstPmxpc3QsCi0JCQkJCQkJJmZwcy0+d29ya19saXN0KTsKKwkJCXdvcmsgPSBibngyZmNfYWxsb2Nfd29yayh0Z3QsIHdxZSk7CisJCQlpZiAod29yaykKKwkJCQlsaXN0X2FkZF90YWlsKCZ3b3JrLT5saXN0LAorCQkJCQkgICAgICAmZnBzLT53b3JrX2xpc3QpOwogdW5sb2NrOgotCQkJCXNwaW5fdW5sb2NrX2JoKCZmcHMtPmZwX3dvcmtfbG9jayk7CisJCQlzcGluX3VubG9ja19iaCgmZnBzLT5mcF93b3JrX2xvY2spOwogCi0JCQkJLyogUGVuZGluZyB3b3JrIHJlcXVlc3QgY29tcGxldGlvbiAqLwotCQkJCWlmIChmcHMtPmlvdGhyZWFkICYmIHdvcmspCi0JCQkJCXdha2VfdXBfcHJvY2VzcyhmcHMtPmlvdGhyZWFkKTsKLQkJCQllbHNlCi0JCQkJCWJueDJmY19wcm9jZXNzX2NxX2NvbXBsKHRndCwgd3FlKTsKLQkJCX0KLQkJCWNxZSsrOwotCQkJdGd0LT5jcV9jb25zX2lkeCsrOwotCi0JCQlpZiAodGd0LT5jcV9jb25zX2lkeCA9PSBCTlgyRkNfQ1FfV1FFU19NQVgpIHsKLQkJCQl0Z3QtPmNxX2NvbnNfaWR4ID0gMDsKLQkJCQljcWUgPSBjcTsKLQkJCQl0Z3QtPmNxX2N1cnJfdG9nZ2xlX2JpdCA9Ci0JCQkJCTEgLSB0Z3QtPmNxX2N1cnJfdG9nZ2xlX2JpdDsKLQkJCX0KKwkJCS8qIFBlbmRpbmcgd29yayByZXF1ZXN0IGNvbXBsZXRpb24gKi8KKwkJCWlmIChmcHMtPmlvdGhyZWFkICYmIHdvcmspCisJCQkJd2FrZV91cF9wcm9jZXNzKGZwcy0+aW90aHJlYWQpOworCQkJZWxzZQorCQkJCWJueDJmY19wcm9jZXNzX2NxX2NvbXBsKHRndCwgd3FlKTsKIAkJfQotCQkvKiBSZS1hcm0gQ1EgKi8KLQkJaWYgKG1vcmVfY3Flc19mb3VuZCkgewotCQkJdGd0LT5jb25uX2RiLT5jcV9hcm0ubG8gPSAtMTsKLQkJCXdtYigpOworCQljcWUrKzsKKwkJdGd0LT5jcV9jb25zX2lkeCsrOworCQludW1fZnJlZV9zcWVzKys7CisKKwkJaWYgKHRndC0+Y3FfY29uc19pZHggPT0gQk5YMkZDX0NRX1dRRVNfTUFYKSB7CisJCQl0Z3QtPmNxX2NvbnNfaWR4ID0gMDsKKwkJCWNxZSA9IGNxOworCQkJdGd0LT5jcV9jdXJyX3RvZ2dsZV9iaXQgPQorCQkJCTEgLSB0Z3QtPmNxX2N1cnJfdG9nZ2xlX2JpdDsKIAkJfQotCX0gd2hpbGUgKG1vcmVfY3Flc19mb3VuZCk7Ci0KLQkvKgotCSAqIENvbW1pdCB0Z3QtPmNxX2NvbnNfaWR4IGNoYW5nZSB0byB0aGUgbWVtb3J5Ci0JICogc3Bpbl9sb2NrIGltcGxpZXMgZnVsbCBtZW1vcnkgYmFycmllciwgbm8gbmVlZCB0byBzbXBfd21iCi0JICovCi0KKwl9CisJYm54MmZjX2FybV9jcSh0Z3QpOworCWF0b21pY19hZGQobnVtX2ZyZWVfc3FlcywgJnRndC0+ZnJlZV9zcWVzKTsKIAlzcGluX3VubG9ja19iaCgmdGd0LT5jcV9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExNDEsNyArMTE3NywxMSBAQAogCWNhc2UgRkNPRV9LQ1FFX0NPTVBMRVRJT05fU1RBVFVTX05JQ19FUlJPUjoKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW5pdF9mYWlsdXJlIGR1ZSB0byBOSUMgZXJyb3JcbiIpOwogCQlicmVhazsKLQorCWNhc2UgRkNPRV9LQ1FFX0NPTVBMRVRJT05fU1RBVFVTX0VSUk9SOgorCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbml0IGZhaWx1cmUgZHVlIHRvIGNvbXBsIHN0YXR1cyBlcnJcbiIpOworCQlicmVhazsKKwljYXNlIEZDT0VfS0NRRV9DT01QTEVUSU9OX1NUQVRVU19XUk9OR19IU0lfVkVSU0lPTjoKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW5pdCBmYWlsdXJlIGR1ZSB0byBIU0kgbWlzbWF0Y2hcbiIpOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIlVua25vd24gRXJyb3IgY29kZSAlZFxuIiwgZXJyX2NvZGUpOwogCX0KQEAgLTEyNDcsMjEgKzEyODcsMTQgQEAKIAogdm9pZCBibngyZmNfcmluZ19kb29yYmVsbChzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QpCiB7Ci0Jc3RydWN0IGI1Nzd4eF9kb29yYmVsbF9zZXRfcHJvZCBldl9kb29yYmVsbDsKKwlzdHJ1Y3QgYjU3N3h4X2Rvb3JiZWxsX3NldF9wcm9kICpzcV9kYiA9ICZ0Z3QtPnNxX2RiOwogCXUzMiBtc2c7CiAKIAl3bWIoKTsKLQotCW1lbXNldCgmZXZfZG9vcmJlbGwsIDAsIHNpemVvZihzdHJ1Y3QgYjU3N3h4X2Rvb3JiZWxsX3NldF9wcm9kKSk7Ci0JZXZfZG9vcmJlbGwuaGVhZGVyLmhlYWRlciA9IEI1NzdYWF9ET09SQkVMTF9IRFJfREJfVFlQRTsKLQotCWV2X2Rvb3JiZWxsLnByb2QgPSB0Z3QtPnNxX3Byb2RfaWR4IHwKKwlzcV9kYi0+cHJvZCA9IHRndC0+c3FfcHJvZF9pZHggfAogCQkJCSh0Z3QtPnNxX2N1cnJfdG9nZ2xlX2JpdCA8PCAxNSk7Ci0JZXZfZG9vcmJlbGwuaGVhZGVyLmhlYWRlciB8PSBCNTc3WFhfRkNPRV9DT05ORUNUSU9OX1RZUEUgPDwKLQkJCQkJQjU3N1hYX0RPT1JCRUxMX0hEUl9DT05OX1RZUEVfU0hJRlQ7Ci0JbXNnID0gKigodTMyICopJmV2X2Rvb3JiZWxsKTsKKwltc2cgPSAqKCh1MzIgKilzcV9kYik7CiAJd3JpdGVsKGNwdV90b19sZTMyKG1zZyksIHRndC0+Y3R4X2Jhc2UpOwotCiAJbW1pb3diKCk7CiAKIH0KQEAgLTEzMjIsMTggKzEzNTUsMjYgQEAKIAltZW1zZXQodGFzaywgMCwgc2l6ZW9mKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5KSk7CiAKIAkvKiBUeCBXcml0ZSBSeCBSZWFkICovCi0JdGFzay0+dHhfd3JfcnhfcmQudHhfZmxhZ3MgPSBGQ09FX1RBU0tfVFhfU1RBVEVfRVhDSEFOR0VfQ0xFQU5VUCA8PAotCQkJCUZDT0VfVEFTS19DVFhfRU5UUllfVFhXUl9SWFJEX1RYX1NUQVRFX1NISUZUOwotCXRhc2stPnR4X3dyX3J4X3JkLmluaXRfZmxhZ3MgPSB0YXNrX3R5cGUgPDwKLQkJCQlGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9UQVNLX1RZUEVfU0hJRlQ7Ci0JdGFzay0+dHhfd3JfcnhfcmQuaW5pdF9mbGFncyB8PSBGQ09FX1RBU0tfQ0xBU1NfVFlQRV8zIDw8Ci0JCQkJRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfQ0xBU1NfVFlQRV9TSElGVDsKLQkvKiBDb21tb24gKi8KLQl0YXNrLT5jbW4uY29tbW9uX2ZsYWdzID0gY29udGV4dF9pZCA8PAotCQkJCUZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX0NJRF9TSElGVDsKLQl0YXNrLT5jbW4uZ2VuZXJhbC5jbGVhbnVwX2luZm8udGFza19pZCA9IG9yaWdfeGlkOworCS8qIGluaXQgZmxhZ3MgKi8KKwl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgPSB0YXNrX3R5cGUgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UQVNLX1RZUEVfU0hJRlQ7CisJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9IEZDT0VfVEFTS19DTEFTU19UWVBFXzMgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9DTEFTU19UWVBFX1NISUZUOworCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQorCQkJCUZDT0VfVEFTS19ERVZfVFlQRV9ESVNLIDw8CisJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfREVWX1RZUEVfU0hJRlQ7CisJdGFzay0+dHh3cl9yeHJkLnVuaW9uX2N0eC5jbGVhbnVwLmN0eC5jbGVhbmVkX3Rhc2tfaWQgPSBvcmlnX3hpZDsKIAorCS8qIFR4IGZsYWdzICovCisJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC50eF9mbGFncyA9CisJCQkJRkNPRV9UQVNLX1RYX1NUQVRFX0VYQ0hBTkdFX0NMRUFOVVAgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UWF9TVEFURV9TSElGVDsKIAorCS8qIFJ4IFJlYWQgVHggV3JpdGUgKi8KKwl0YXNrLT5yeHdyX3R4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgPSBjb250ZXh0X2lkIDw8CisJCQkJRkNPRV9UQ0VfUlhfV1JfVFhfUkRfQ09OU1RfQ0lEX1NISUZUOworCXRhc2stPnJ4d3JfdHhyZC52YXJfY3R4LnJ4X2ZsYWdzIHw9IDEgPDwKKwkJCQlGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfRVhQX0ZJUlNUX0ZSQU1FX1NISUZUOwogfQogCiB2b2lkIGJueDJmY19pbml0X21wX3Rhc2soc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSwKQEAgLTEzNDIsNiArMTM4Myw3IEBACiAJc3RydWN0IGJueDJmY19tcF9yZXEgKm1wX3JlcSA9ICYoaW9fcmVxLT5tcF9yZXEpOwogCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IGlvX3JlcS0+dGd0OwogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZjX2hkcjsKKwlzdHJ1Y3QgZmNvZV9leHRfbXVsX3NnZXNfY3R4ICpzZ2w7CiAJdTggdGFza190eXBlID0gMDsKIAl1NjQgKmhkcjsKIAl1NjQgdGVtcF9oZHJbM107CkBAIC0xMzY3LDQ3ICsxNDA5LDQ5IEBACiAJLyogVHggb25seSAqLwogCWlmICgodGFza190eXBlID09IEZDT0VfVEFTS19UWVBFX01JRFBBVEgpIHx8CiAJICAgICh0YXNrX3R5cGUgPT0gRkNPRV9UQVNLX1RZUEVfVU5TT0xJQ0lURUQpKSB7Ci0JCXRhc2stPnR4X3dyX29ubHkuc2dsX2N0eC5tdWxfc2dlcy5jdXJfc2dlX2FkZHIubG8gPQorCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5jdXJfc2dlX2FkZHIubG8gPQogCQkJCSh1MzIpbXBfcmVxLT5tcF9yZXFfYmRfZG1hOwotCQl0YXNrLT50eF93cl9vbmx5LnNnbF9jdHgubXVsX3NnZXMuY3VyX3NnZV9hZGRyLmhpID0KKwkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuY3VyX3NnZV9hZGRyLmhpID0KIAkJCQkodTMyKSgodTY0KW1wX3JlcS0+bXBfcmVxX2JkX2RtYSA+PiAzMik7Ci0JCXRhc2stPnR4X3dyX29ubHkuc2dsX2N0eC5tdWxfc2dlcy5zZ2xfc2l6ZSA9IDE7Ci0JCUJOWDJGQ19JT19EQkcoaW9fcmVxLCAiaW5pdF9tcF90YXNrIC0gYmRfZG1hID0gMHglbGx4XG4iLAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltcF9yZXEtPm1wX3JlcV9iZF9kbWEpOworCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5zZ2xfc2l6ZSA9IDE7CiAJfQogCiAJLyogVHggV3JpdGUgUnggUmVhZCAqLwotCXRhc2stPnR4X3dyX3J4X3JkLnR4X2ZsYWdzID0gRkNPRV9UQVNLX1RYX1NUQVRFX0lOSVQgPDwKLQkJCQlGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9UWF9TVEFURV9TSElGVDsKLQl0YXNrLT50eF93cl9yeF9yZC5pbml0X2ZsYWdzID0gdGFza190eXBlIDw8Ci0JCQkJRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfVEFTS19UWVBFX1NISUZUOwotCXRhc2stPnR4X3dyX3J4X3JkLmluaXRfZmxhZ3MgfD0gRkNPRV9UQVNLX0RFVl9UWVBFX0RJU0sgPDwKLQkJCQlGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9ERVZfVFlQRV9TSElGVDsKLQl0YXNrLT50eF93cl9yeF9yZC5pbml0X2ZsYWdzIHw9IEZDT0VfVEFTS19DTEFTU19UWVBFXzMgPDwKLQkJCQlGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9DTEFTU19UWVBFX1NISUZUOworCS8qIGluaXQgZmxhZ3MgKi8KKwl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgPSB0YXNrX3R5cGUgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UQVNLX1RZUEVfU0hJRlQ7CisJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9CisJCQkJRkNPRV9UQVNLX0RFVl9UWVBFX0RJU0sgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9ERVZfVFlQRV9TSElGVDsKKwl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0gRkNPRV9UQVNLX0NMQVNTX1RZUEVfMyA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0NMQVNTX1RZUEVfU0hJRlQ7CiAKLQkvKiBDb21tb24gKi8KLQl0YXNrLT5jbW4uZGF0YV8yX3RybnMgPSBpb19yZXEtPmRhdGFfeGZlcl9sZW47Ci0JY29udGV4dF9pZCA9IHRndC0+Y29udGV4dF9pZDsKLQl0YXNrLT5jbW4uY29tbW9uX2ZsYWdzID0gY29udGV4dF9pZCA8PAotCQkJCUZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX0NJRF9TSElGVDsKLQl0YXNrLT5jbW4uY29tbW9uX2ZsYWdzIHw9IDEgPDwKLQkJCQlGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9WQUxJRF9TSElGVDsKLQl0YXNrLT5jbW4uY29tbW9uX2ZsYWdzIHw9IDEgPDwKLQkJCUZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX0VYUF9GSVJTVF9GUkFNRV9TSElGVDsKKwkvKiB0eCBmbGFncyAqLworCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHgudHhfZmxhZ3MgPSBGQ09FX1RBU0tfVFhfU1RBVEVfSU5JVCA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RYX1NUQVRFX1NISUZUOwogCiAJLyogUnggV3JpdGUgVHggUmVhZCAqLworCXRhc2stPnJ4d3JfdHhyZC5jb25zdF9jdHguZGF0YV8yX3RybnMgPSBpb19yZXEtPmRhdGFfeGZlcl9sZW47CisKKwkvKiByeCBmbGFncyAqLworCXRhc2stPnJ4d3JfdHhyZC52YXJfY3R4LnJ4X2ZsYWdzIHw9IDEgPDwKKwkJCQlGQ09FX1RDRV9SWF9XUl9UWF9SRF9WQVJfRVhQX0ZJUlNUX0ZSQU1FX1NISUZUOworCisJY29udGV4dF9pZCA9IHRndC0+Y29udGV4dF9pZDsKKwl0YXNrLT5yeHdyX3R4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgPSBjb250ZXh0X2lkIDw8CisJCQkJRkNPRV9UQ0VfUlhfV1JfVFhfUkRfQ09OU1RfQ0lEX1NISUZUOworCiAJZmNfaGRyID0gJihtcF9yZXEtPnJlcV9mY19oZHIpOwogCWlmICh0YXNrX3R5cGUgPT0gRkNPRV9UQVNLX1RZUEVfTUlEUEFUSCkgewogCQlmY19oZHItPmZoX294X2lkID0gY3B1X3RvX2JlMTYoaW9fcmVxLT54aWQpOwogCQlmY19oZHItPmZoX3J4X2lkID0gaHRvbnMoMHhmZmZmKTsKLQkJdGFzay0+cnhfd3JfdHhfcmQucnhfaWQgPSAweGZmZmY7CisJCXRhc2stPnJ4d3JfdHhyZC52YXJfY3R4LnJ4X2lkID0gMHhmZmZmOwogCX0gZWxzZSBpZiAodGFza190eXBlID09IEZDT0VfVEFTS19UWVBFX1VOU09MSUNJVEVEKSB7CiAJCWZjX2hkci0+ZmhfcnhfaWQgPSBjcHVfdG9fYmUxNihpb19yZXEtPnhpZCk7CiAJfQogCiAJLyogRmlsbCBGQyBIZWFkZXIgaW50byBtaWRkbGUgcGF0aCBidWZmZXIgKi8KLQloZHIgPSAodTY0ICopICZ0YXNrLT5jbW4uZ2VuZXJhbC5jbWRfaW5mby5tcF9mY19mcmFtZS5mY19oZHI7CisJaGRyID0gKHU2NCAqKSAmdGFzay0+dHh3cl9yeHJkLnVuaW9uX2N0eC50eF9mcmFtZS5mY19oZHI7CiAJbWVtY3B5KHRlbXBfaGRyLCBmY19oZHIsIHNpemVvZih0ZW1wX2hkcikpOwogCWhkclswXSA9IGNwdV90b19iZTY0KHRlbXBfaGRyWzBdKTsKIAloZHJbMV0gPSBjcHVfdG9fYmU2NCh0ZW1wX2hkclsxXSk7CkBAIC0xNDE1LDEyICsxNDU5LDEyIEBACiAKIAkvKiBSeCBPbmx5ICovCiAJaWYgKHRhc2tfdHlwZSA9PSBGQ09FX1RBU0tfVFlQRV9NSURQQVRIKSB7CisJCXNnbCA9ICZ0YXNrLT5yeHdyX29ubHkudW5pb25fY3R4LnJlYWRfaW5mby5zZ2xfY3R4LnNnbDsKIAotCQl0YXNrLT5yeF93cl9vbmx5LnNnbF9jdHgubXVsX3NnZXMuY3VyX3NnZV9hZGRyLmxvID0KLQkJCQkodTMyKW1wX3JlcS0+bXBfcmVzcF9iZF9kbWE7Ci0JCXRhc2stPnJ4X3dyX29ubHkuc2dsX2N0eC5tdWxfc2dlcy5jdXJfc2dlX2FkZHIuaGkgPQorCQlzZ2wtPm11bF9zZ2wuY3VyX3NnZV9hZGRyLmxvID0gKHUzMiltcF9yZXEtPm1wX3Jlc3BfYmRfZG1hOworCQlzZ2wtPm11bF9zZ2wuY3VyX3NnZV9hZGRyLmhpID0KIAkJCQkodTMyKSgodTY0KW1wX3JlcS0+bXBfcmVzcF9iZF9kbWEgPj4gMzIpOwotCQl0YXNrLT5yeF93cl9vbmx5LnNnbF9jdHgubXVsX3NnZXMuc2dsX3NpemUgPSAxOworCQlzZ2wtPm11bF9zZ2wuc2dsX3NpemUgPSAxOwogCX0KIH0KIApAQCAtMTQzMSw2ICsxNDc1LDggQEAKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpzY19jbWQgPSBpb19yZXEtPnNjX2NtZDsKIAlzdHJ1Y3QgaW9fYmR0ICpiZF90YmwgPSBpb19yZXEtPmJkX3RibDsKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBpb19yZXEtPnRndDsKKwlzdHJ1Y3QgZmNvZV9jYWNoZWRfc2dlX2N0eCAqY2FjaGVkX3NnZTsKKwlzdHJ1Y3QgZmNvZV9leHRfbXVsX3NnZXNfY3R4ICpzZ2w7CiAJdTY0ICpmY3BfY21uZDsKIAl1NjQgdG1wX2ZjcF9jbW5kWzRdOwogCXUzMiBjb250ZXh0X2lkOwpAQCAtMTQ0OSw0NyArMTQ5NSwzMyBAQAogCiAJLyogVHggb25seSAqLwogCWlmICh0YXNrX3R5cGUgPT0gRkNPRV9UQVNLX1RZUEVfV1JJVEUpIHsKLQkJdGFzay0+dHhfd3Jfb25seS5zZ2xfY3R4Lm11bF9zZ2VzLmN1cl9zZ2VfYWRkci5sbyA9CisJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLmN1cl9zZ2VfYWRkci5sbyA9CiAJCQkJKHUzMiliZF90YmwtPmJkX3RibF9kbWE7Ci0JCXRhc2stPnR4X3dyX29ubHkuc2dsX2N0eC5tdWxfc2dlcy5jdXJfc2dlX2FkZHIuaGkgPQorCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5jdXJfc2dlX2FkZHIuaGkgPQogCQkJCSh1MzIpKCh1NjQpYmRfdGJsLT5iZF90YmxfZG1hID4+IDMyKTsKLQkJdGFzay0+dHhfd3Jfb25seS5zZ2xfY3R4Lm11bF9zZ2VzLnNnbF9zaXplID0KKwkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuc2dsX3NpemUgPQogCQkJCWJkX3RibC0+YmRfdmFsaWQ7CiAJfQogCiAJLypUeCBXcml0ZSBSeCBSZWFkICovCiAJLyogSW5pdCBzdGF0ZSB0byBOT1JNQUwgKi8KLQl0YXNrLT50eF93cl9yeF9yZC50eF9mbGFncyA9IEZDT0VfVEFTS19UWF9TVEFURV9OT1JNQUwgPDwKLQkJCQlGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9UWF9TVEFURV9TSElGVDsKLQl0YXNrLT50eF93cl9yeF9yZC5pbml0X2ZsYWdzID0gdGFza190eXBlIDw8Ci0JCQkJRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfVEFTS19UWVBFX1NISUZUOwotCXRhc2stPnR4X3dyX3J4X3JkLmluaXRfZmxhZ3MgfD0gRkNPRV9UQVNLX0RFVl9UWVBFX0RJU0sgPDwKLQkJCQlGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9ERVZfVFlQRV9TSElGVDsKLQl0YXNrLT50eF93cl9yeF9yZC5pbml0X2ZsYWdzIHw9IEZDT0VfVEFTS19DTEFTU19UWVBFXzMgPDwKLQkJCQlGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYV1JfUlhSRF9DTEFTU19UWVBFX1NISUZUOwotCi0JLyogQ29tbW9uICovCi0JdGFzay0+Y21uLmRhdGFfMl90cm5zID0gaW9fcmVxLT5kYXRhX3hmZXJfbGVuOwotCWNvbnRleHRfaWQgPSB0Z3QtPmNvbnRleHRfaWQ7Ci0JdGFzay0+Y21uLmNvbW1vbl9mbGFncyA9IGNvbnRleHRfaWQgPDwKLQkJCQlGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9DSURfU0hJRlQ7Ci0JdGFzay0+Y21uLmNvbW1vbl9mbGFncyB8PSAxIDw8Ci0JCQkJRkNPRV9UQVNLX0NUWF9FTlRSWV9UWF9SWF9DTU5fVkFMSURfU0hJRlQ7Ci0JdGFzay0+Y21uLmNvbW1vbl9mbGFncyB8PSAxIDw8Ci0JCQlGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9FWFBfRklSU1RfRlJBTUVfU0hJRlQ7Ci0KLQkvKiBTZXQgaW5pdGlhdGl2ZSBvd25lcnNoaXAgKi8KLQl0YXNrLT5jbW4uY29tbW9uX2ZsYWdzIHw9IEZDT0VfVEFTS19DVFhfRU5UUllfVFhfUlhfQ01OX1NFUV9JTklUOworCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyA9IHRhc2tfdHlwZSA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RBU0tfVFlQRV9TSElGVDsKKwl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0KKwkJCQlGQ09FX1RBU0tfREVWX1RZUEVfRElTSyA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0RFVl9UWVBFX1NISUZUOworCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PSBGQ09FX1RBU0tfQ0xBU1NfVFlQRV8zIDw8CisJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfQ0xBU1NfVFlQRV9TSElGVDsKKwkvKiB0eCBmbGFncyAqLworCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHgudHhfZmxhZ3MgPSBGQ09FX1RBU0tfVFhfU1RBVEVfTk9STUFMIDw8CisJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVFhfU1RBVEVfU0hJRlQ7CiAKIAkvKiBTZXQgaW5pdGlhbCBzZXEgY291bnRlciAqLwotCXRhc2stPmNtbi50eF9sb3dfc2VxX2NudCA9IDE7Ci0KLQkvKiBTZXQgc3RhdGUgdG8gIndhaXRpbmcgZm9yIHRoZSBmaXJzdCBwYWNrZXQiICovCi0JdGFzay0+Y21uLmNvbW1vbl9mbGFncyB8PSBGQ09FX1RBU0tfQ1RYX0VOVFJZX1RYX1JYX0NNTl9FWFBfRklSU1RfRlJBTUU7CisJdGFzay0+dHh3cl9yeHJkLnVuaW9uX2N0eC50eF9zZXEuY3R4LnNlcV9jbnQgPSAxOwogCiAJLyogRmlsbCBGQ1BfQ01ORCBJVSAqLwogCWZjcF9jbW5kID0gKHU2NCAqKQotCQkgICAgdGFzay0+Y21uLmdlbmVyYWwuY21kX2luZm8uZmNwX2NtZF9wYXlsb2FkLm9wYXF1ZTsKKwkJICAgIHRhc2stPnR4d3JfcnhyZC51bmlvbl9jdHguZmNwX2NtZC5vcGFxdWU7CiAJYm54MmZjX2J1aWxkX2ZjcF9jbW5kKGlvX3JlcSwgKHN0cnVjdCBmY3BfY21uZCAqKSZ0bXBfZmNwX2NtbmQpOwogCiAJLyogc3dhcCBmY3BfY21uZCAqLwpAQCAtMTUwMSwzMiArMTUzMyw1NCBAQAogCX0KIAogCS8qIFJ4IFdyaXRlIFR4IFJlYWQgKi8KLQl0YXNrLT5yeF93cl90eF9yZC5yeF9pZCA9IDB4ZmZmZjsKKwl0YXNrLT5yeHdyX3R4cmQuY29uc3RfY3R4LmRhdGFfMl90cm5zID0gaW9fcmVxLT5kYXRhX3hmZXJfbGVuOworCisJY29udGV4dF9pZCA9IHRndC0+Y29udGV4dF9pZDsKKwl0YXNrLT5yeHdyX3R4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgPSBjb250ZXh0X2lkIDw8CisJCQkJRkNPRV9UQ0VfUlhfV1JfVFhfUkRfQ09OU1RfQ0lEX1NISUZUOworCisJLyogcnggZmxhZ3MgKi8KKwkvKiBTZXQgc3RhdGUgdG8gIndhaXRpbmcgZm9yIHRoZSBmaXJzdCBwYWNrZXQiICovCisJdGFzay0+cnh3cl90eHJkLnZhcl9jdHgucnhfZmxhZ3MgfD0gMSA8PAorCQkJCUZDT0VfVENFX1JYX1dSX1RYX1JEX1ZBUl9FWFBfRklSU1RfRlJBTUVfU0hJRlQ7CisKKwl0YXNrLT5yeHdyX3R4cmQudmFyX2N0eC5yeF9pZCA9IDB4ZmZmZjsKIAogCS8qIFJ4IE9ubHkgKi8KKwljYWNoZWRfc2dlID0gJnRhc2stPnJ4d3Jfb25seS51bmlvbl9jdHgucmVhZF9pbmZvLnNnbF9jdHguY2FjaGVkX3NnZTsKKwlzZ2wgPSAmdGFzay0+cnh3cl9vbmx5LnVuaW9uX2N0eC5yZWFkX2luZm8uc2dsX2N0eC5zZ2w7CisJYmRfY291bnQgPSBiZF90YmwtPmJkX3ZhbGlkOwogCWlmICh0YXNrX3R5cGUgPT0gRkNPRV9UQVNLX1RZUEVfUkVBRCkgewotCi0JCWJkX2NvdW50ID0gYmRfdGJsLT5iZF92YWxpZDsKIAkJaWYgKGJkX2NvdW50ID09IDEpIHsKIAogCQkJc3RydWN0IGZjb2VfYmRfY3R4ICpmY29lX2JkX3RibCA9IGJkX3RibC0+YmRfdGJsOwogCi0JCQl0YXNrLT5yeF93cl9vbmx5LnNnbF9jdHguc2luZ2xlX3NnZS5jdXJfYnVmX2FkZHIubG8gPQotCQkJCQlmY29lX2JkX3RibC0+YnVmX2FkZHJfbG87Ci0JCQl0YXNrLT5yeF93cl9vbmx5LnNnbF9jdHguc2luZ2xlX3NnZS5jdXJfYnVmX2FkZHIuaGkgPQotCQkJCQlmY29lX2JkX3RibC0+YnVmX2FkZHJfaGk7Ci0JCQl0YXNrLT5yeF93cl9vbmx5LnNnbF9jdHguc2luZ2xlX3NnZS5jdXJfYnVmX3JlbSA9Ci0JCQkJCWZjb2VfYmRfdGJsLT5idWZfbGVuOwotCQkJdGFzay0+dHhfd3JfcnhfcmQuaW5pdF9mbGFncyB8PSAxIDw8Ci0JCQkJRkNPRV9UQVNLX0NUWF9FTlRSWV9UWFdSX1JYUkRfU0lOR0xFX1NHRV9TSElGVDsKKwkJCWNhY2hlZF9zZ2UtPmN1cl9idWZfYWRkci5sbyA9IGZjb2VfYmRfdGJsLT5idWZfYWRkcl9sbzsKKwkJCWNhY2hlZF9zZ2UtPmN1cl9idWZfYWRkci5oaSA9IGZjb2VfYmRfdGJsLT5idWZfYWRkcl9oaTsKKwkJCWNhY2hlZF9zZ2UtPmN1cl9idWZfcmVtID0gZmNvZV9iZF90YmwtPmJ1Zl9sZW47CisJCQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0gMSA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0NBQ0hFRF9TR0VfU0hJRlQ7CisJCX0gZWxzZSBpZiAoYmRfY291bnQgPT0gMikgeworCQkJc3RydWN0IGZjb2VfYmRfY3R4ICpmY29lX2JkX3RibCA9IGJkX3RibC0+YmRfdGJsOworCisJCQljYWNoZWRfc2dlLT5jdXJfYnVmX2FkZHIubG8gPSBmY29lX2JkX3RibC0+YnVmX2FkZHJfbG87CisJCQljYWNoZWRfc2dlLT5jdXJfYnVmX2FkZHIuaGkgPSBmY29lX2JkX3RibC0+YnVmX2FkZHJfaGk7CisJCQljYWNoZWRfc2dlLT5jdXJfYnVmX3JlbSA9IGZjb2VfYmRfdGJsLT5idWZfbGVuOworCisJCQlmY29lX2JkX3RibCsrOworCQkJY2FjaGVkX3NnZS0+c2Vjb25kX2J1Zl9hZGRyLmxvID0KKwkJCQkJCSBmY29lX2JkX3RibC0+YnVmX2FkZHJfbG87CisJCQljYWNoZWRfc2dlLT5zZWNvbmRfYnVmX2FkZHIuaGkgPQorCQkJCQkJZmNvZV9iZF90YmwtPmJ1Zl9hZGRyX2hpOworCQkJY2FjaGVkX3NnZS0+c2Vjb25kX2J1Zl9yZW0gPSBmY29lX2JkX3RibC0+YnVmX2xlbjsKKwkJCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PSAxIDw8CisJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfQ0FDSEVEX1NHRV9TSElGVDsKIAkJfSBlbHNlIHsKIAotCQkJdGFzay0+cnhfd3Jfb25seS5zZ2xfY3R4Lm11bF9zZ2VzLmN1cl9zZ2VfYWRkci5sbyA9Ci0JCQkJCSh1MzIpYmRfdGJsLT5iZF90YmxfZG1hOwotCQkJdGFzay0+cnhfd3Jfb25seS5zZ2xfY3R4Lm11bF9zZ2VzLmN1cl9zZ2VfYWRkci5oaSA9CisJCQlzZ2wtPm11bF9zZ2wuY3VyX3NnZV9hZGRyLmxvID0gKHUzMiliZF90YmwtPmJkX3RibF9kbWE7CisJCQlzZ2wtPm11bF9zZ2wuY3VyX3NnZV9hZGRyLmhpID0KIAkJCQkJKHUzMikoKHU2NCliZF90YmwtPmJkX3RibF9kbWEgPj4gMzIpOwotCQkJdGFzay0+cnhfd3Jfb25seS5zZ2xfY3R4Lm11bF9zZ2VzLnNnbF9zaXplID0KLQkJCQkJYmRfdGJsLT5iZF92YWxpZDsKKwkJCXNnbC0+bXVsX3NnbC5zZ2xfc2l6ZSA9IGJkX2NvdW50OwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMKaW5kZXggYjViNWMzNC4uNDVlYmE2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jCkBAIC00MjUsNiArNDI1LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0cDsKIAlzdHJ1Y3QgaW9fYmR0ICpiZF90Ymw7CiAJaW50IGluZGV4ID0gUkVTRVJWRV9GUkVFX0xJU1RfSU5ERVg7CisJdTMyIGZyZWVfc3FlczsKIAl1MzIgbWF4X3NxZXM7CiAJdTE2IHhpZDsKIApAQCAtNDQ1LDggKzQ0NiwxMCBAQAogCSAqIGNtZ3IgbG9jawogCSAqLwogCXNwaW5fbG9ja19iaCgmY21kX21nci0+ZnJlZV9saXN0X2xvY2tbaW5kZXhdKTsKKwlmcmVlX3NxZXMgPSBhdG9taWNfcmVhZCgmdGd0LT5mcmVlX3NxZXMpOwogCWlmICgobGlzdF9lbXB0eSgmKGNtZF9tZ3ItPmZyZWVfbGlzdFtpbmRleF0pKSkgfHwKLQkgICAgKHRndC0+bnVtX2FjdGl2ZV9pb3MuY291bnRlciAgPj0gbWF4X3NxZXMpKSB7CisJICAgICh0Z3QtPm51bV9hY3RpdmVfaW9zLmNvdW50ZXIgID49IG1heF9zcWVzKSB8fAorCSAgICAoZnJlZV9zcWVzICsgbWF4X3NxZXMgPD0gQk5YMkZDX1NRX1dRRVNfTUFYKSkgewogCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJObyBmcmVlIGVsc190bSBjbWRzIGF2YWlsYWJsZSAiCiAJCQkiaW9zKCVkKTpzcWVzKCVkKVxuIiwKIAkJCXRndC0+bnVtX2FjdGl2ZV9pb3MuY291bnRlciwgdGd0LT5tYXhfc3Flcyk7CkBAIC00NjMsNiArNDY2LDcgQEAKIAl4aWQgPSBpb19yZXEtPnhpZDsKIAljbWRfbWdyLT5jbWRzW3hpZF0gPSBpb19yZXE7CiAJYXRvbWljX2luYygmdGd0LT5udW1fYWN0aXZlX2lvcyk7CisJYXRvbWljX2RlYygmdGd0LT5mcmVlX3NxZXMpOwogCXNwaW5fdW5sb2NrX2JoKCZjbWRfbWdyLT5mcmVlX2xpc3RfbG9ja1tpbmRleF0pOwogCiAJSU5JVF9MSVNUX0hFQUQoJmlvX3JlcS0+bGluayk7CkBAIC00ODksNiArNDkzLDcgQEAKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RwOwogCXN0cnVjdCBpb19iZHQgKmJkX3RibDsKKwl1MzIgZnJlZV9zcWVzOwogCXUzMiBtYXhfc3FlczsKIAl1MTYgeGlkOwogCWludCBpbmRleCA9IGdldF9jcHUoKTsKQEAgLTQ5OSw4ICs1MDQsMTAgQEAKIAkgKiBjbWdyIGxvY2sKIAkgKi8KIAlzcGluX2xvY2tfYmgoJmNtZF9tZ3ItPmZyZWVfbGlzdF9sb2NrW2luZGV4XSk7CisJZnJlZV9zcWVzID0gYXRvbWljX3JlYWQoJnRndC0+ZnJlZV9zcWVzKTsKIAlpZiAoKGxpc3RfZW1wdHkoJmNtZF9tZ3ItPmZyZWVfbGlzdFtpbmRleF0pKSB8fAotCSAgICAodGd0LT5udW1fYWN0aXZlX2lvcy5jb3VudGVyICA+PSBtYXhfc3FlcykpIHsKKwkgICAgKHRndC0+bnVtX2FjdGl2ZV9pb3MuY291bnRlciAgPj0gbWF4X3NxZXMpIHx8CisJICAgIChmcmVlX3NxZXMgKyBtYXhfc3FlcyA8PSBCTlgyRkNfU1FfV1FFU19NQVgpKSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZjbWRfbWdyLT5mcmVlX2xpc3RfbG9ja1tpbmRleF0pOwogCQlwdXRfY3B1KCk7CiAJCXJldHVybiBOVUxMOwpAQCAtNTEzLDYgKzUyMCw3IEBACiAJeGlkID0gaW9fcmVxLT54aWQ7CiAJY21kX21nci0+Y21kc1t4aWRdID0gaW9fcmVxOwogCWF0b21pY19pbmMoJnRndC0+bnVtX2FjdGl2ZV9pb3MpOworCWF0b21pY19kZWMoJnRndC0+ZnJlZV9zcWVzKTsKIAlzcGluX3VubG9ja19iaCgmY21kX21nci0+ZnJlZV9saXN0X2xvY2tbaW5kZXhdKTsKIAlwdXRfY3B1KCk7CiAKQEAgLTg3Myw3ICs4ODEsNyBAQAogCiAJLyogT2J0YWluIG94aWQgYW5kIHJ4aWQgZm9yIHRoZSBvcmlnaW5hbCBleGNoYW5nZSB0byBiZSBhYm9ydGVkICovCiAJZmNfaGRyLT5maF9veF9pZCA9IGh0b25zKGlvX3JlcS0+eGlkKTsKLQlmY19oZHItPmZoX3J4X2lkID0gaHRvbnMoaW9fcmVxLT50YXNrLT5yeF93cl90eF9yZC5yeF9pZCk7CisJZmNfaGRyLT5maF9yeF9pZCA9IGh0b25zKGlvX3JlcS0+dGFzay0+cnh3cl90eHJkLnZhcl9jdHgucnhfaWQpOwogCiAJc2lkID0gdGd0LT5zaWQ7CiAJZGlkID0gcnBvcnQtPnBvcnRfaWQ7CkBAIC0xMTg5LDcgKzExOTcsNyBAQAogCQkJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsCiAJCQkJIGJueDJmY19jbWRfcmVsZWFzZSk7IC8qIGRyb3AgdGltZXIgaG9sZCAqLwogCi0Jcl9jdGwgPSB0YXNrLT5jbW4uZ2VuZXJhbC5yc3BfaW5mby5hYnRzX3JzcC5yX2N0bDsKKwlyX2N0bCA9ICh1OCl0YXNrLT5yeHdyX29ubHkudW5pb25fY3R4LmNvbXBfaW5mby5hYnRzX3JzcC5yX2N0bDsKIAogCXN3aXRjaCAocl9jdGwpIHsKIAljYXNlIEZDX1JDVExfQkFfQUNDOgpAQCAtMTM0NCwxMiArMTM1MiwxMyBAQAogCWZjX2hkciA9ICYodG1fcmVxLT5yZXNwX2ZjX2hkcik7CiAJaGRyID0gKHU2NCAqKWZjX2hkcjsKIAl0ZW1wX2hkciA9ICh1NjQgKikKLQkJJnRhc2stPmNtbi5nZW5lcmFsLmNtZF9pbmZvLm1wX2ZjX2ZyYW1lLmZjX2hkcjsKKwkJJnRhc2stPnJ4d3Jfb25seS51bmlvbl9jdHguY29tcF9pbmZvLm1wX3JzcC5mY19oZHI7CiAJaGRyWzBdID0gY3B1X3RvX2JlNjQodGVtcF9oZHJbMF0pOwogCWhkclsxXSA9IGNwdV90b19iZTY0KHRlbXBfaGRyWzFdKTsKIAloZHJbMl0gPSBjcHVfdG9fYmU2NCh0ZW1wX2hkclsyXSk7CiAKLQl0bV9yZXEtPnJlc3BfbGVuID0gdGFzay0+cnhfd3Jfb25seS5zZ2xfY3R4Lm11bF9zZ2VzLmN1cl9zZ2Vfb2ZmOworCXRtX3JlcS0+cmVzcF9sZW4gPQorCQl0YXNrLT5yeHdyX29ubHkudW5pb25fY3R4LmNvbXBfaW5mby5tcF9yc3AubXBfcGF5bG9hZF9sZW47CiAKIAlyc3BfYnVmID0gdG1fcmVxLT5yZXNwX2J1ZjsKIApAQCAtMTcyNCw3ICsxNzMzLDcgQEAKIAogCS8qIEZldGNoIGZjcF9yc3AgZnJvbSB0YXNrIGNvbnRleHQgYW5kIHBlcmZvcm0gY21kIGNvbXBsZXRpb24gKi8KIAlmY3BfcnNwID0gKHN0cnVjdCBmY29lX2ZjcF9yc3BfcGF5bG9hZCAqKQotCQkgICAmKHRhc2stPmNtbi5nZW5lcmFsLnJzcF9pbmZvLmZjcF9yc3AucGF5bG9hZCk7CisJCSAgICYodGFzay0+cnh3cl9vbmx5LnVuaW9uX2N0eC5jb21wX2luZm8uZmNwX3JzcC5wYXlsb2FkKTsKIAogCS8qIHBhcnNlIGZjcF9yc3AgYW5kIG9idGFpbiBzZW5zZSBkYXRhIGZyb20gUlEgaWYgYXZhaWxhYmxlICovCiAJYm54MmZjX3BhcnNlX2ZjcF9yc3AoaW9fcmVxLCBmY3BfcnNwLCBudW1fcnEpOwpAQCAtMTczNCw3ICsxNzQzLDYgQEAKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiU0NwLnB0ciBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlpb19yZXEtPnNjX2NtZCA9IE5VTEw7CiAKIAlpZiAoaW9fcmVxLT5vbl9hY3RpdmVfcXVldWUpIHsKIAkJbGlzdF9kZWxfaW5pdCgmaW9fcmVxLT5saW5rKTsKQEAgLTE3NTQsNiArMTc2Miw3IEBACiAJfQogCiAJYm54MmZjX3VubWFwX3NnX2xpc3QoaW9fcmVxKTsKKwlpb19yZXEtPnNjX2NtZCA9IE5VTEw7CiAKIAlzd2l0Y2ggKGlvX3JlcS0+ZmNwX3N0YXR1cykgewogCWNhc2UgRkNfR09PRDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKaW5kZXggYTJlMzgzMC4uM2U4OTJiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKQEAgLTEzMyw2ICsxMzMsOCBAQAogCQkvKiB1cGxvYWQgd2lsbCB0YWtlIGNhcmUgb2YgY2xlYW5pbmcgdXAgc2VzcyByZXNjICovCiAJCWxwb3J0LT50dC5ycG9ydF9sb2dvZmYocmRhdGEpOwogCX0KKwkvKiBBcm0gQ1EgKi8KKwlibngyZmNfYXJtX2NxKHRndCk7CiAJcmV0dXJuOwogCiBvZmxkX2VycjoKQEAgLTMxNSw2ICszMTcsOCBAQAogCiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHJkYXRhLT5ycG9ydDsKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYjU3N3h4X2Rvb3JiZWxsX3NldF9wcm9kICpzcV9kYiA9ICZ0Z3QtPnNxX2RiOworCXN0cnVjdCBiNTc3eHhfZmNvZV9yeF9kb29yYmVsbCAqcnhfZGIgPSAmdGd0LT5yeF9kYjsKIAogCXRndC0+cnBvcnQgPSBycG9ydDsKIAl0Z3QtPnJkYXRhID0gcmRhdGE7CkBAIC0zMzUsNiArMzM5LDcgQEAKIAl0Z3QtPm1heF9zcWVzID0gQk5YMkZDX1NRX1dRRVNfTUFYOwogCXRndC0+bWF4X3JxZXMgPSBCTlgyRkNfUlFfV1FFU19NQVg7CiAJdGd0LT5tYXhfY3FlcyA9IEJOWDJGQ19DUV9XUUVTX01BWDsKKwlhdG9taWNfc2V0KCZ0Z3QtPmZyZWVfc3FlcywgQk5YMkZDX1NRX1dRRVNfTUFYKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIHRvZ2dsZSBiaXQgKi8KIAl0Z3QtPnNxX2N1cnJfdG9nZ2xlX2JpdCA9IDE7CkBAIC0zNDUsNyArMzUwLDE3IEBACiAJdGd0LT5ycV9jb25zX2lkeCA9IDA7CiAJYXRvbWljX3NldCgmdGd0LT5udW1fYWN0aXZlX2lvcywgMCk7CiAKLQl0Z3QtPndvcmtfdGltZV9zbGljZSA9IDI7CisJLyogaW5pdGlhbGl6ZSBzcSBkb29yYmVsbCAqLworCXNxX2RiLT5oZWFkZXIuaGVhZGVyID0gQjU3N1hYX0RPT1JCRUxMX0hEUl9EQl9UWVBFOworCXNxX2RiLT5oZWFkZXIuaGVhZGVyIHw9IEI1NzdYWF9GQ09FX0NPTk5FQ1RJT05fVFlQRSA8PAorCQkJCQlCNTc3WFhfRE9PUkJFTExfSERSX0NPTk5fVFlQRV9TSElGVDsKKwkvKiBpbml0aWFsaXplIHJ4IGRvb3JiZWxsICovCisJcnhfZGItPmhkci5oZWFkZXIgPSAoKDB4MSA8PCBCNTc3WFhfRE9PUkJFTExfSERSX1JYX1NISUZUKSB8CisJCQkgICgweDEgPDwgQjU3N1hYX0RPT1JCRUxMX0hEUl9EQl9UWVBFX1NISUZUKSB8CisJCQkgIChCNTc3WFhfRkNPRV9DT05ORUNUSU9OX1RZUEUgPDwKKwkJCQlCNTc3WFhfRE9PUkJFTExfSERSX0NPTk5fVFlQRV9TSElGVCkpOworCXJ4X2RiLT5wYXJhbXMgPSAoMHgyIDw8IEI1NzdYWF9GQ09FX1JYX0RPT1JCRUxMX05FR0FUSVZFX0FSTV9TSElGVCkgfAorCQkgICAgICgweDMgPDwgQjU3N1hYX0ZDT0VfUlhfRE9PUkJFTExfT1BDT0RFX1NISUZUKTsKIAogCXNwaW5fbG9ja19pbml0KCZ0Z3QtPnRndF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmdGd0LT5jcV9sb2NrKTsKQEAgLTc1OCw4ICs3NzMsNiBAQAogCX0KIAltZW1zZXQodGd0LT5sY3EsIDAsIHRndC0+bGNxX21lbV9zaXplKTsKIAotCS8qIEFybSBDUSAqLwotCXRndC0+Y29ubl9kYi0+Y3FfYXJtLmxvID0gLTE7CiAJdGd0LT5jb25uX2RiLT5ycV9wcm9kID0gMHg4MDAwOwogCiAJcmV0dXJuIDA7CkBAIC03ODcsNiArODAwLDggQEAKIAkJaW91bm1hcCh0Z3QtPmN0eF9iYXNlKTsKIAkJdGd0LT5jdHhfYmFzZSA9IE5VTEw7CiAJfQorCisJc3Bpbl9sb2NrX2JoKCZ0Z3QtPmNxX2xvY2spOwogCS8qIEZyZWUgTENRICovCiAJaWYgKHRndC0+bGNxKSB7CiAJCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPmxjcV9tZW1fc2l6ZSwKQEAgLTgyOCwxNyArODQzLDE2IEBACiAJCXRndC0+cnEgPSBOVUxMOwogCX0KIAkvKiBGcmVlIENRICovCi0Jc3Bpbl9sb2NrX2JoKCZ0Z3QtPmNxX2xvY2spOwogCWlmICh0Z3QtPmNxKSB7CiAJCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPmNxX21lbV9zaXplLAogCQkJCSAgICB0Z3QtPmNxLCB0Z3QtPmNxX2RtYSk7CiAJCXRndC0+Y3EgPSBOVUxMOwogCX0KLQlzcGluX3VubG9ja19iaCgmdGd0LT5jcV9sb2NrKTsKIAkvKiBGcmVlIFNRICovCiAJaWYgKHRndC0+c3EpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+c3FfbWVtX3NpemUsCiAJCQkJICAgIHRndC0+c3EsIHRndC0+c3FfZG1hKTsKIAkJdGd0LT5zcSA9IE5VTEw7CiAJfQorCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPmNxX2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJpLzU3eHhfaXNjc2lfY29uc3RhbnRzLmggYi9kcml2ZXJzL3Njc2kvYm54MmkvNTd4eF9pc2NzaV9jb25zdGFudHMuaAppbmRleCAzMGU2YmRiLi41NzUxNWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvNTd4eF9pc2NzaV9jb25zdGFudHMuaAorKysgYi9kcml2ZXJzL3Njc2kvYm54MmkvNTd4eF9pc2NzaV9jb25zdGFudHMuaApAQCAtMSw2ICsxLDYgQEAKIC8qIDU3eHhfaXNjc2lfY29uc3RhbnRzLmg6IEJyb2FkY29tIE5ldFh0cmVtZSBJSSBpU0NTSSBIU0kKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xMjUsNyArMTI1LDcgQEAKIAogLyogU1EvUlEvQ1EgREIgc3RydWN0dXJlIHNpemVzICovCiAjZGVmaW5lIElTQ1NJX1NRX0RCX1NJWkUgICAgKDE2KQotI2RlZmluZSBJU0NTSV9SUV9EQl9TSVpFICAgICgxNikKKyNkZWZpbmUgSVNDU0lfUlFfREJfU0laRSAgICAoNjQpCiAjZGVmaW5lIElTQ1NJX0NRX0RCX1NJWkUgICAgKDgwKQogCiAjZGVmaW5lIElTQ1NJX1NRTl9UT19OT1RJRllfTk9UX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyaS81N3h4X2lzY3NpX2hzaS5oIGIvZHJpdmVycy9zY3NpL2JueDJpLzU3eHhfaXNjc2lfaHNpLmgKaW5kZXggZGFkNmM4YS4uNzIxMThkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJpLzU3eHhfaXNjc2lfaHNpLmgKKysrIGIvZHJpdmVycy9zY3NpL2JueDJpLzU3eHhfaXNjc2lfaHNpLmgKQEAgLTEsNiArMSw2IEBACiAvKiA1N3h4X2lzY3NpX2hzaS5oOiBCcm9hZGNvbSBOZXRYdHJlbWUgSUkgaVNDU0kgSFNJLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTcwNyw4ICs3MDcsMTAgQEAKICNkZWZpbmUgSVNDU0lfS1dRRV9DT05OX1VQREFURV9JTklUSUFMX1IyVF9TSElGVCAyCiAjZGVmaW5lIElTQ1NJX0tXUUVfQ09OTl9VUERBVEVfSU1NRURJQVRFX0RBVEEgKDB4MTw8MykKICNkZWZpbmUgSVNDU0lfS1dRRV9DT05OX1VQREFURV9JTU1FRElBVEVfREFUQV9TSElGVCAzCi0jZGVmaW5lIElTQ1NJX0tXUUVfQ09OTl9VUERBVEVfUkVTRVJWRUQxICgweEY8PDQpCi0jZGVmaW5lIElTQ1NJX0tXUUVfQ09OTl9VUERBVEVfUkVTRVJWRUQxX1NISUZUIDQKKyNkZWZpbmUgSVNDU0lfS1dRRV9DT05OX1VQREFURV9PT09fU1VQUE9SVF9NT0RFICgweDM8PDQpCisjZGVmaW5lIElTQ1NJX0tXUUVfQ09OTl9VUERBVEVfT09PX1NVUFBPUlRfTU9ERV9TSElGVCA0CisjZGVmaW5lIElTQ1NJX0tXUUVfQ09OTl9VUERBVEVfUkVTRVJWRUQxICgweDM8PDYpCisjZGVmaW5lIElTQ1NJX0tXUUVfQ09OTl9VUERBVEVfUkVTRVJWRUQxX1NISUZUIDYKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQogCXU4IGNvbm5fZmxhZ3M7CiAjZGVmaW5lIElTQ1NJX0tXUUVfQ09OTl9VUERBVEVfSEVBREVSX0RJR0VTVCAoMHgxPDwwKQpAQCAtNzE5LDggKzcyMSwxMCBAQAogI2RlZmluZSBJU0NTSV9LV1FFX0NPTk5fVVBEQVRFX0lOSVRJQUxfUjJUX1NISUZUIDIKICNkZWZpbmUgSVNDU0lfS1dRRV9DT05OX1VQREFURV9JTU1FRElBVEVfREFUQSAoMHgxPDwzKQogI2RlZmluZSBJU0NTSV9LV1FFX0NPTk5fVVBEQVRFX0lNTUVESUFURV9EQVRBX1NISUZUIDMKLSNkZWZpbmUgSVNDU0lfS1dRRV9DT05OX1VQREFURV9SRVNFUlZFRDEgKDB4Rjw8NCkKLSNkZWZpbmUgSVNDU0lfS1dRRV9DT05OX1VQREFURV9SRVNFUlZFRDFfU0hJRlQgNAorI2RlZmluZSBJU0NTSV9LV1FFX0NPTk5fVVBEQVRFX09PT19TVVBQT1JUX01PREUgKDB4Mzw8NCkKKyNkZWZpbmUgSVNDU0lfS1dRRV9DT05OX1VQREFURV9PT09fU1VQUE9SVF9NT0RFX1NISUZUIDQKKyNkZWZpbmUgSVNDU0lfS1dRRV9DT05OX1VQREFURV9SRVNFUlZFRDEgKDB4Mzw8NikKKyNkZWZpbmUgSVNDU0lfS1dRRV9DT05OX1VQREFURV9SRVNFUlZFRDFfU0hJRlQgNgogCXU4IHJlc2VydmVkMjsKIAl1OCBtYXhfb3V0c3RhbmRpbmdfcjJ0czsKIAl1OCBzZXNzaW9uX2Vycm9yX3JlY292ZXJ5X2xldmVsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpLmggYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmkuaAppbmRleCA2YmRkMjVhLi5kYzU3MDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmkuaAorKysgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmkuaApAQCAtMSw2ICsxLDYgQEAKIC8qIGJueDJpLmg6IEJyb2FkY29tIE5ldFh0cmVtZSBJSSBpU0NTSSBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggTWlrZSBDaHJpc3RpZQogICoKQEAgLTIyLDExICsyMiwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CkBAIC0yMDIsMTAgKzIwNSwxMyBAQAogLyoqCiAgKiBibngyaV9jbWQgLSBpc2NzaSBjb21tYW5kIHN0cnVjdHVyZQogICoKKyAqIEBoZHI6ICAgICAgICAgICAgICAgIGlTQ1NJIGhlYWRlcgorICogQGNvbm46ICAgICAgICAgICAgICAgaXNjc2lfY29ubiBwb2ludGVyCiAgKiBAc2NzaV9jbWQ6ICAgICAgICAgICBTQ1NJLU1MIHRhc2sgcG9pbnRlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaXNjc2kgY21kCiAgKiBAc2c6ICAgICAgICAgICAgICAgICBTRyBsaXN0CiAgKiBAaW9fdGJsOiAgICAgICAgICAgICBidWZmZXIgZGVzY3JpcHRvciAoQkQpIHRhYmxlCiAgKiBAYmRfdGJsX2RtYTogICAgICAgICBidWZmZXIgZGVzY3JpcHRvciAoQkQpIHRhYmxlJ3MgZG1hIGFkZHJlc3MKKyAqIEByZXE6ICAgICAgICAgICAgICAgIGJueDJpIHNwZWNpZmljIGNvbW1hbmQgcmVxdWVzdCBzdHJ1Y3QKICAqLwogc3RydWN0IGJueDJpX2NtZCB7CiAJc3RydWN0IGlzY3NpX2hkciBoZHI7CkBAIC0yMjksNiArMjM1LDcgQEAKICAqIEBnZW5fcGR1OiAgICAgICAgICAgICAgIGxvZ2luL25vcG91dC9sb2dvdXQgcGR1IHJlc291cmNlcwogICogQHZpb2xhdGlvbl9ub3RpZmllZDogICAgYml0IG1hc2sgdXNlZCB0byB0cmFjayBpc2NzaSBlcnJvci93YXJuaW5nIG1lc3NhZ2VzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IHByaW50ZWQgb3V0CisgKiBAd29ya19jbnQ6ICAgICAgICAgICAgICBrZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIHdvcmsKICAqCiAgKiBpU0NTSSBjb25uZWN0aW9uIHN0cnVjdHVyZQogICovCkBAIC0yNTIsNiArMjU5LDggQEAKIAkgKi8KIAlzdHJ1Y3QgZ2VuZXJpY19wZHVfcmVzYyBnZW5fcGR1OwogCXU2NCB2aW9sYXRpb25fbm90aWZpZWQ7CisKKwlhdG9taWNfdCB3b3JrX2NudDsKIH07CiAKIApAQCAtNDc4LDcgKzQ4Nyw3IEBACiAKIHN0cnVjdCBibngyaV81NzcxeF9zcV9ycV9kYiB7CiAJdTE2IHByb2RfaWR4OwotCXU4IHJlc2VydmVkMFsxNF07IC8qIFBhZCBzdHJ1Y3R1cmUgc2l6ZSB0byAxNiBieXRlcyAqLworCXU4IHJlc2VydmVkMFs2Ml07IC8qIFBhZCBzdHJ1Y3R1cmUgc2l6ZSB0byA2NCBieXRlcyAqLwogfTsKIAogCkBAIC02NjEsNyArNjcwLDYgQEAKICAqIEBoYmE6ICAgICAgICAgICAgICAgIGFkYXB0ZXIgdG8gd2hpY2ggdGhpcyBjb25uZWN0aW9uIGJlbG9uZ3MKICAqIEBjb25uOiAgICAgICAgICAgICAgIGlzY3NpIGNvbm5lY3Rpb24gdGhpcyBFUCBpcyBsaW5rZWQgdG8KICAqIEBjbHNfZXA6ICAgICAgICAgICAgIGFzc29jaWF0ZWQgaVNDU0kgZW5kcG9pbnQgcG9pbnRlcgotICogQHNlc3M6ICAgICAgICAgICAgICAgaXNjc2kgc2Vzc2lvbiB0aGlzIEVQIGlzIGxpbmtlZCB0bwogICogQGNtX3NrOiAgICAgICAgICAgICAgY25pYyBzb2NrIHN0cnVjdAogICogQGhiYV9hZ2U6ICAgICAgICAgICAgYWdlIHRvIGRldGVjdCBpZiAnaXNjc2lkJyBpc3N1ZXMgZXBfZGlzY29ubmVjdCgpCiAgKiAgICAgICAgICAgICAgICAgICAgICBhZnRlciBIQkEgcmVzZXQgaXMgY29tcGxldGVkIGJ5IGJueDJpL2NuaWMvYm54MgpAQCAtNjg3LDcgKzY5NSw3IEBACiAJdTMyIGhiYV9hZ2U7CiAJdTMyIHN0YXRlOwogCXVuc2lnbmVkIGxvbmcgdGltZXN0YW1wOwotCWludCBudW1fYWN0aXZlX2NtZHM7CisJYXRvbWljX3QgbnVtX2FjdGl2ZV9jbWRzOwogCXUzMiBlY19zaGlmdDsKIAogCXN0cnVjdCBxcF9pbmZvIHFwOwpAQCAtNzAwLDYgKzcwOCwxOSBAQAogfTsKIAogCitzdHJ1Y3QgYm54Mmlfd29yayB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uOworCXN0cnVjdCBibngyaV9jb25uICpibngyaV9jb25uOworCXN0cnVjdCBjcWUgY3FlOworfTsKKworc3RydWN0IGJueDJpX3BlcmNwdV9zIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlvdGhyZWFkOworCXN0cnVjdCBsaXN0X2hlYWQgd29ya19saXN0OworCXNwaW5sb2NrX3QgcF93b3JrX2xvY2s7Cit9OworCiAKIC8qIEdsb2JhbCB2YXJpYWJsZXMgKi8KIGV4dGVybiB1bnNpZ25lZCBpbnQgZXJyb3JfbWFzazEsIGVycm9yX21hc2syOwpAQCAtNzgzLDcgKzgwNCw3IEBACiAJCXN0cnVjdCBibngyaV9oYmEgKmhiYSwgdTMyIGlzY3NpX2NpZCk7CiAKIGV4dGVybiBpbnQgYm54MmlfbWFwX2VwX2RiZWxsX3JlZ3Moc3RydWN0IGJueDJpX2VuZHBvaW50ICplcCk7Ci1leHRlcm4gdm9pZCBibngyaV9hcm1fY3FfZXZlbnRfY29hbGVzY2luZyhzdHJ1Y3QgYm54MmlfZW5kcG9pbnQgKmVwLCB1OCBhY3Rpb24pOworZXh0ZXJuIGludCBibngyaV9hcm1fY3FfZXZlbnRfY29hbGVzY2luZyhzdHJ1Y3QgYm54MmlfZW5kcG9pbnQgKmVwLCB1OCBhY3Rpb24pOwogCiBleHRlcm4gaW50IGJueDJpX2h3X2VwX2Rpc2Nvbm5lY3Qoc3RydWN0IGJueDJpX2VuZHBvaW50ICpibngyaV9lcCk7CiAKQEAgLTc5Myw0ICs4MTQsOCBAQAogZXh0ZXJuIHZvaWQgYm54MmlfcHJpbnRfeG1pdF9wZHVfcXVldWUoc3RydWN0IGJueDJpX2Nvbm4gKmNvbm4pOwogZXh0ZXJuIHZvaWQgYm54MmlfcHJpbnRfcmVjdl9zdGF0ZShzdHJ1Y3QgYm54MmlfY29ubiAqY29ubik7CiAKK2V4dGVybiBpbnQgYm54MmlfcGVyY3B1X2lvX3RocmVhZCh2b2lkICphcmcpOworZXh0ZXJuIGludCBibngyaV9wcm9jZXNzX3Njc2lfY21kX3Jlc3Aoc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJICAgICAgIHN0cnVjdCBibngyaV9jb25uICpibngyaV9jb25uLAorCQkJCSAgICAgICBzdHJ1Y3QgY3FlICpjcWUpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMKaW5kZXggNWM1NGEyZC4uMDMwYTk2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2h3aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9od2kuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIGJueDJpX2h3aS5jOiBCcm9hZGNvbSBOZXRYdHJlbWUgSUkgaVNDU0kgZHJpdmVyLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE1pa2UgQ2hyaXN0aWUKICAqCkBAIC0xNyw2ICsxNyw4IEBACiAjaW5jbHVkZSA8c2NzaS9saWJpc2NzaS5oPgogI2luY2x1ZGUgImJueDJpLmgiCiAKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgYm54MmlfcGVyY3B1X3MsIGJueDJpX3BlcmNwdSk7CisKIC8qKgogICogYm54MmlfZ2V0X2NpZF9udW0gLSBnZXQgY2lkIGZyb20gZXAKICAqIEBlcDogCWVuZHBvaW50IHBvaW50ZXIKQEAgLTEzMSwxNiArMTMzLDE2IEBACiAgKgl0aGUgZHJpdmVyLiBFUSBldmVudCBpcyBnZW5lcmF0ZWQgQ1EgaW5kZXggaXMgaGl0IG9yIGF0IGxlYXN0IDEgQ1EgaXMKICAqCW91dHN0YW5kaW5nIGFuZCBvbiBjaGlwIHRpbWVyIGV4cGlyZXMKICAqLwotdm9pZCBibngyaV9hcm1fY3FfZXZlbnRfY29hbGVzY2luZyhzdHJ1Y3QgYm54MmlfZW5kcG9pbnQgKmVwLCB1OCBhY3Rpb24pCitpbnQgYm54MmlfYXJtX2NxX2V2ZW50X2NvYWxlc2Npbmcoc3RydWN0IGJueDJpX2VuZHBvaW50ICplcCwgdTggYWN0aW9uKQogewogCXN0cnVjdCBibngyaV81NzcxeF9jcV9kYiAqY3FfZGI7CiAJdTE2IGNxX2luZGV4OwotCXUxNiBuZXh0X2luZGV4OworCXUxNiBuZXh0X2luZGV4ID0gMDsKIAl1MzIgbnVtX2FjdGl2ZV9jbWRzOwogCiAJLyogQ29hbGVzY2UgQ1EgZW50cmllcyBvbmx5IG9uIDEwRyBkZXZpY2VzICovCiAJaWYgKCF0ZXN0X2JpdChCTlgySV9OWDJfREVWXzU3NzEwLCAmZXAtPmhiYS0+Y25pY19kZXZfdHlwZSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAkvKiBEbyBub3QgdXBkYXRlIENRIERCIG11bHRpcGxlIHRpbWVzIGJlZm9yZSBmaXJtd2FyZSB3cml0ZXMKIAkgKiAnMHhGRkZGJyB0byBDUURCLT5TUU4gZmllbGQuIERldmlhdGlvbiBtYXkgY2F1c2Ugc3B1cmlvdXMKQEAgLTE1MCwxNiArMTUyLDE3IEBACiAKIAlpZiAoYWN0aW9uICE9IENOSUNfQVJNX0NRRV9GUCkKIAkJaWYgKGNxX2RiLT5zcW5bMF0gJiYgY3FfZGItPnNxblswXSAhPSAweEZGRkYpCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAogCWlmIChhY3Rpb24gPT0gQ05JQ19BUk1fQ1FFIHx8IGFjdGlvbiA9PSBDTklDX0FSTV9DUUVfRlApIHsKLQkJbnVtX2FjdGl2ZV9jbWRzID0gZXAtPm51bV9hY3RpdmVfY21kczsKKwkJbnVtX2FjdGl2ZV9jbWRzID0gYXRvbWljX3JlYWQoJmVwLT5udW1fYWN0aXZlX2NtZHMpOwogCQlpZiAobnVtX2FjdGl2ZV9jbWRzIDw9IGV2ZW50X2NvYWxfbWluKQogCQkJbmV4dF9pbmRleCA9IDE7Ci0JCWVsc2UKLQkJCW5leHRfaW5kZXggPSBldmVudF9jb2FsX21pbiArCi0JCQkJICAgICAoKG51bV9hY3RpdmVfY21kcyAtIGV2ZW50X2NvYWxfbWluKSA+PgotCQkJCSAgICAgZXAtPmVjX3NoaWZ0KTsKKwkJZWxzZSB7CisJCQluZXh0X2luZGV4ID0gbnVtX2FjdGl2ZV9jbWRzID4+IGVwLT5lY19zaGlmdDsKKwkJCWlmIChuZXh0X2luZGV4ID4gbnVtX2FjdGl2ZV9jbWRzIC0gZXZlbnRfY29hbF9taW4pCisJCQkJbmV4dF9pbmRleCA9IG51bV9hY3RpdmVfY21kcyAtIGV2ZW50X2NvYWxfbWluOworCQl9CiAJCWlmICghbmV4dF9pbmRleCkKIAkJCW5leHRfaW5kZXggPSAxOwogCQljcV9pbmRleCA9IGVwLT5xcC5jcWVfZXhwX3NlcV9zbiArIG5leHRfaW5kZXggLSAxOwpAQCAtMTcwLDYgKzE3Myw3IEBACiAKIAkJY3FfZGItPnNxblswXSA9IGNxX2luZGV4OwogCX0KKwlyZXR1cm4gbmV4dF9pbmRleDsKIH0KIAogCkBAIC0yNjUsNyArMjY5LDcgQEAKIAlzdHJ1Y3QgYm54MmlfNTc3MXhfc3FfcnFfZGIgKnNxX2RiOwogCXN0cnVjdCBibngyaV9lbmRwb2ludCAqZXAgPSBibngyaV9jb25uLT5lcDsKIAotCWVwLT5udW1fYWN0aXZlX2NtZHMrKzsKKwlhdG9taWNfaW5jKCZlcC0+bnVtX2FjdGl2ZV9jbWRzKTsKIAl3bWIoKTsJLyogZmx1c2ggU1EgV1FFIG1lbW9yeSBiZWZvcmUgdGhlIGRvb3JiZWxsIGlzIHJ1bmcgKi8KIAlpZiAodGVzdF9iaXQoQk5YMklfTlgyX0RFVl81NzcxMCwgJmVwLT5oYmEtPmNuaWNfZGV2X3R5cGUpKSB7CiAJCXNxX2RiID0gKHN0cnVjdCBibngyaV81NzcxeF9zcV9ycV9kYiAqKSBlcC0+cXAuc3FfcGd0YmxfdmlydDsKQEAgLTQzMCw3ICs0MzQsNyBAQAogCWRlZmF1bHQ6CiAJCXRtZmFib3J0X3dxZS0+cmVmX2l0dCA9IFJFU0VSVkVEX0lUVDsKIAl9Ci0JbWVtY3B5KHNjc2lfbHVuLCB0bWZhYm9ydF9oZHItPmx1biwgc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bikpOworCW1lbWNweShzY3NpX2x1biwgJnRtZmFib3J0X2hkci0+bHVuLCBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKSk7CiAJdG1mYWJvcnRfd3FlLT5sdW5bMF0gPSBiZTMyX3RvX2NwdShzY3NpX2x1blswXSk7CiAJdG1mYWJvcnRfd3FlLT5sdW5bMV0gPSBiZTMyX3RvX2NwdShzY3NpX2x1blsxXSk7CiAKQEAgLTU0Nyw3ICs1NTEsNyBAQAogCiAJbm9wb3V0X3dxZS0+b3BfY29kZSA9IG5vcG91dF9oZHItPm9wY29kZTsKIAlub3BvdXRfd3FlLT5vcF9hdHRyID0gSVNDU0lfRkxBR19DTURfRklOQUw7Ci0JbWVtY3B5KG5vcG91dF93cWUtPmx1biwgbm9wb3V0X2hkci0+bHVuLCA4KTsKKwltZW1jcHkobm9wb3V0X3dxZS0+bHVuLCAmbm9wb3V0X2hkci0+bHVuLCA4KTsKIAogCWlmICh0ZXN0X2JpdChCTlgySV9OWDJfREVWXzU3NzEwLCAmZXAtPmhiYS0+Y25pY19kZXZfdHlwZSkpIHsKIAkJdTMyIHRtcCA9IG5vcG91dF93cWUtPmx1blswXTsKQEAgLTEzMzEsMTQgKzEzMzUsMTUgQEAKIAogLyoqCiAgKiBibngyaV9wcm9jZXNzX3Njc2lfY21kX3Jlc3AgLSB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgc2NzaSBjbWQgY29tcGxldGlvbi4KLSAqIEBjb25uOglpc2NzaSBjb25uZWN0aW9uCisgKiBAc2Vzc2lvbjoJaXNjc2kgc2Vzc2lvbgorICogQGJueDJpX2Nvbm46CWJueDJpIGNvbm5lY3Rpb24KICAqIEBjcWU6CXBvaW50ZXIgdG8gbmV3bHkgRE1BJ2VkIENRRSBlbnRyeSBmb3IgcHJvY2Vzc2luZwogICoKICAqIHByb2Nlc3MgU0NTSSBDTUQgUmVzcG9uc2UgQ1FFICYgY29tcGxldGUgdGhlIHJlcXVlc3QgdG8gU0NTSS1NTAogICovCi1zdGF0aWMgaW50IGJueDJpX3Byb2Nlc3Nfc2NzaV9jbWRfcmVzcChzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJCQkgICAgICAgc3RydWN0IGJueDJpX2Nvbm4gKmJueDJpX2Nvbm4sCi0JCQkJICAgICAgIHN0cnVjdCBjcWUgKmNxZSkKK2ludCBibngyaV9wcm9jZXNzX3Njc2lfY21kX3Jlc3Aoc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJc3RydWN0IGJueDJpX2Nvbm4gKmJueDJpX2Nvbm4sCisJCQkJc3RydWN0IGNxZSAqY3FlKQogewogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gYm54MmlfY29ubi0+Y2xzX2Nvbm4tPmRkX2RhdGE7CiAJc3RydWN0IGJueDJpX2NtZF9yZXNwb25zZSAqcmVzcF9jcWU7CkBAIC0xMzQ4LDcgKzEzNTMsNyBAQAogCXUzMiBkYXRhbGVuID0gMDsKIAogCXJlc3BfY3FlID0gKHN0cnVjdCBibngyaV9jbWRfcmVzcG9uc2UgKiljcWU7Ci0Jc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhjb25uLAogCQkJCSByZXNwX2NxZS0+aXR0ICYgSVNDU0lfQ01EX1JFU1BPTlNFX0lOREVYKTsKIAlpZiAoIXRhc2spCkBAIC0xNDA5LDcgKzE0MTQsNyBAQAogCV9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIChzdHJ1Y3QgaXNjc2lfaGRyICopaGRyLAogCQkJICAgICBjb25uLT5kYXRhLCBkYXRhbGVuKTsKIGZhaWw6Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTcxMSw3ICsxNzE2LDcgQEAKIAkJaGRyLT5mbGFncyA9IElTQ1NJX0ZMQUdfQ01EX0ZJTkFMOwogCQloZHItPml0dCA9IHRhc2stPmhkci0+aXR0OwogCQloZHItPnR0dCA9IGNwdV90b19iZTMyKG5vcF9pbi0+dHR0KTsKLQkJbWVtY3B5KGhkci0+bHVuLCBub3BfaW4tPmx1biwgOCk7CisJCW1lbWNweSgmaGRyLT5sdW4sIG5vcF9pbi0+bHVuLCA4KTsKIAl9CiBkb25lOgogCV9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIChzdHJ1Y3QgaXNjc2lfaGRyICopaGRyLCBOVUxMLCAwKTsKQEAgLTE3NTQsNyArMTc1OSw3IEBACiAJcmVzcF9oZHItPm9wY29kZSA9IGFzeW5jX2NxZS0+b3BfY29kZTsKIAlyZXNwX2hkci0+ZmxhZ3MgPSAweDgwOwogCi0JbWVtY3B5KHJlc3BfaGRyLT5sdW4sIGFzeW5jX2NxZS0+bHVuLCA4KTsKKwltZW1jcHkoJnJlc3BfaGRyLT5sdW4sIGFzeW5jX2NxZS0+bHVuLCA4KTsKIAlyZXNwX2hkci0+ZXhwX2NtZHNuID0gY3B1X3RvX2JlMzIoYXN5bmNfY3FlLT5leHBfY21kX3NuKTsKIAlyZXNwX2hkci0+bWF4X2NtZHNuID0gY3B1X3RvX2JlMzIoYXN5bmNfY3FlLT5tYXhfY21kX3NuKTsKIApAQCAtMTgzNiwyMSArMTg0MSwxMzYgQEAKIH0KIAogCisvKioKKyAqIGJueDJpX3BlcmNwdV9pb190aHJlYWQgLSB0aHJlYWQgcGVyIGNwdSBmb3IgaW9zCisgKgorICogQGFyZzoJcHRyIHRvIGJueDJpX3BlcmNwdV9pbmZvIHN0cnVjdHVyZQorICovCitpbnQgYm54MmlfcGVyY3B1X2lvX3RocmVhZCh2b2lkICphcmcpCit7CisJc3RydWN0IGJueDJpX3BlcmNwdV9zICpwID0gYXJnOworCXN0cnVjdCBibngyaV93b3JrICp3b3JrLCAqdG1wOworCUxJU1RfSEVBRCh3b3JrX2xpc3QpOworCisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMjApOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJc3Bpbl9sb2NrX2JoKCZwLT5wX3dvcmtfbG9jayk7CisJCXdoaWxlICghbGlzdF9lbXB0eSgmcC0+d29ya19saXN0KSkgeworCQkJbGlzdF9zcGxpY2VfaW5pdCgmcC0+d29ya19saXN0LCAmd29ya19saXN0KTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZwLT5wX3dvcmtfbG9jayk7CisKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3b3JrLCB0bXAsICZ3b3JrX2xpc3QsIGxpc3QpIHsKKwkJCQlsaXN0X2RlbF9pbml0KCZ3b3JrLT5saXN0KTsKKwkJCQkvKiB3b3JrIGFsbG9jYXRlZCBpbiB0aGUgYmgsIGZyZWVkIGhlcmUgKi8KKwkJCQlibngyaV9wcm9jZXNzX3Njc2lfY21kX3Jlc3Aod29yay0+c2Vzc2lvbiwKKwkJCQkJCQkgICAgd29yay0+Ym54MmlfY29ubiwKKwkJCQkJCQkgICAgJndvcmstPmNxZSk7CisJCQkJYXRvbWljX2RlYygmd29yay0+Ym54MmlfY29ubi0+d29ya19jbnQpOworCQkJCWtmcmVlKHdvcmspOworCQkJfQorCQkJc3Bpbl9sb2NrX2JoKCZwLT5wX3dvcmtfbG9jayk7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnAtPnBfd29ya19sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBibngyaV9xdWV1ZV9zY3NpX2NtZF9yZXNwIC0gcXVldWUgY21kIGNvbXBsZXRpb24gdG8gdGhlIHBlcmNwdSB0aHJlYWQKKyAqIEBibngyaV9jb25uOgkJYm54MmkgY29ubmVjdGlvbgorICoKKyAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGdlbmVyaWMgS0NRIGhhbmRsZXIgdG8gcXVldWUgYWxsIHBlbmRpbmcgY21kCisgKiBjb21wbGV0aW9uIENRRXMKKyAqCisgKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgdG8gcXVldWUgdGhlIGNtZCByZXNwb25zZSBiYXNlZCBvbiB0aGUKKyAqIGxhc3QgcmVjb3JkZWQgY29tbWFuZCBmb3IgdGhlIGdpdmVuIGNvbm5lY3Rpb24uICBUaGUKKyAqIGNwdV9pZCBnZXRzIHJlY29yZGVkIHVwb24gdGFza194bWl0LiAgTm8gb3V0LW9mLW9yZGVyIGNvbXBsZXRpb24hCisgKi8KK3N0YXRpYyBpbnQgYm54MmlfcXVldWVfc2NzaV9jbWRfcmVzcChzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkgICAgIHN0cnVjdCBibngyaV9jb25uICpibngyaV9jb25uLAorCQkJCSAgICAgc3RydWN0IGJueDJpX25vcF9pbl9tc2cgKmNxZSkKK3sKKwlzdHJ1Y3QgYm54Mmlfd29yayAqYm54Mmlfd29yayA9IE5VTEw7CisJc3RydWN0IGJueDJpX3BlcmNwdV9zICpwID0gTlVMTDsKKwlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzYzsKKwlpbnQgcmMgPSAwOworCWludCBjcHU7CisKKwlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOworCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhibngyaV9jb25uLT5jbHNfY29ubi0+ZGRfZGF0YSwKKwkJCQkgY3FlLT5pdHQgJiBJU0NTSV9DTURfUkVTUE9OU0VfSU5ERVgpOworCWlmICghdGFzaykgeworCQlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzYyA9IHRhc2stPnNjOworCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKworCWlmICghYmxrX3JxX2NwdV92YWxpZChzYy0+cmVxdWVzdCkpCisJCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwllbHNlCisJCWNwdSA9IHNjLT5yZXF1ZXN0LT5jcHU7CisKKwlwID0gJnBlcl9jcHUoYm54MmlfcGVyY3B1LCBjcHUpOworCXNwaW5fbG9jaygmcC0+cF93b3JrX2xvY2spOworCWlmICh1bmxpa2VseSghcC0+aW90aHJlYWQpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCS8qIEFsbG9jIGFuZCBjb3B5IHRvIHRoZSBjcWUgKi8KKwlibngyaV93b3JrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJueDJpX3dvcmspLCBHRlBfQVRPTUlDKTsKKwlpZiAoYm54Mmlfd29yaykgeworCQlJTklUX0xJU1RfSEVBRCgmYm54Mmlfd29yay0+bGlzdCk7CisJCWJueDJpX3dvcmstPnNlc3Npb24gPSBzZXNzaW9uOworCQlibngyaV93b3JrLT5ibngyaV9jb25uID0gYm54MmlfY29ubjsKKwkJbWVtY3B5KCZibngyaV93b3JrLT5jcWUsIGNxZSwgc2l6ZW9mKHN0cnVjdCBjcWUpKTsKKwkJbGlzdF9hZGRfdGFpbCgmYm54Mmlfd29yay0+bGlzdCwgJnAtPndvcmtfbGlzdCk7CisJCWF0b21pY19pbmMoJmJueDJpX2Nvbm4tPndvcmtfY250KTsKKwkJd2FrZV91cF9wcm9jZXNzKHAtPmlvdGhyZWFkKTsKKwkJc3Bpbl91bmxvY2soJnAtPnBfd29ya19sb2NrKTsKKwkJZ290byBkb25lOworCX0gZWxzZQorCQlyYyA9IC1FTk9NRU07CitlcnI6CisJc3Bpbl91bmxvY2soJnAtPnBfd29ya19sb2NrKTsKKwlibngyaV9wcm9jZXNzX3Njc2lfY21kX3Jlc3Aoc2Vzc2lvbiwgYm54MmlfY29ubiwgKHN0cnVjdCBjcWUgKiljcWUpOworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKIAogLyoqCiAgKiBibngyaV9wcm9jZXNzX25ld19jcWVzIC0gcHJvY2VzcyBuZXdseSBETUEnZWQgQ1FFJ3MKLSAqIEBibngyaV9jb25uOgkJaXNjc2kgY29ubmVjdGlvbgorICogQGJueDJpX2Nvbm46CQlibngyaSBjb25uZWN0aW9uCiAgKgogICogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZ2VuZXJpYyBLQ1EgaGFuZGxlciB0byBwcm9jZXNzIGFsbCBwZW5kaW5nIENRRSdzCiAgKi8KLXN0YXRpYyB2b2lkIGJueDJpX3Byb2Nlc3NfbmV3X2NxZXMoc3RydWN0IGJueDJpX2Nvbm4gKmJueDJpX2Nvbm4pCitzdGF0aWMgaW50IGJueDJpX3Byb2Nlc3NfbmV3X2NxZXMoc3RydWN0IGJueDJpX2Nvbm4gKmJueDJpX2Nvbm4pCiB7CiAJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBibngyaV9jb25uLT5jbHNfY29ubi0+ZGRfZGF0YTsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247Ci0Jc3RydWN0IHFwX2luZm8gKnFwID0gJmJueDJpX2Nvbm4tPmVwLT5xcDsKKwlzdHJ1Y3QgcXBfaW5mbyAqcXA7CiAJc3RydWN0IGJueDJpX25vcF9pbl9tc2cgKm5vcGluOwogCWludCB0Z3RfYXN5bmNfbXNnOworCWludCBjcWVfY250ID0gMDsKIAorCWlmIChibngyaV9jb25uLT5lcCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXFwID0gJmJueDJpX2Nvbm4tPmVwLT5xcDsKKworCWlmICghcXAtPmNxX3ZpcnQpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgImJueDJpICglcyk6IGNxIHJlc3IgZnJlZWQgaW4gYmggZXhlY3V0aW9uISIsCisJCQlibngyaV9jb25uLT5oYmEtPm5ldGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KIAl3aGlsZSAoMSkgewogCQlub3BpbiA9IChzdHJ1Y3QgYm54Mmlfbm9wX2luX21zZyAqKSBxcC0+Y3FfY29uc19xZTsKIAkJaWYgKG5vcGluLT5jcV9yZXFfc24gIT0gcXAtPmNxZV9leHBfc2VxX3NuKQpAQCAtMTg3Myw4ICsxOTkzLDkgQEAKIAkJc3dpdGNoIChub3Bpbi0+b3BfY29kZSkgewogCQljYXNlIElTQ1NJX09QX1NDU0lfQ01EX1JTUDoKIAkJY2FzZSBJU0NTSV9PUF9TQ1NJX0RBVEFfSU46Ci0JCQlibngyaV9wcm9jZXNzX3Njc2lfY21kX3Jlc3Aoc2Vzc2lvbiwgYm54MmlfY29ubiwKLQkJCQkJCSAgICBxcC0+Y3FfY29uc19xZSk7CisJCQkvKiBSdW4gdGhlIGt0aHJlYWQgZW5naW5lIG9ubHkgZm9yIGRhdGEgY21kcworCQkJICAgQWxsIG90aGVyIGNtZHMgd2lsbCBiZSBjb21wbGV0ZWQgaW4gdGhpcyBiaCEgKi8KKwkJCWJueDJpX3F1ZXVlX3Njc2lfY21kX3Jlc3Aoc2Vzc2lvbiwgYm54MmlfY29ubiwgbm9waW4pOwogCQkJYnJlYWs7CiAJCWNhc2UgSVNDU0lfT1BfTE9HSU5fUlNQOgogCQkJYm54MmlfcHJvY2Vzc19sb2dpbl9yZXNwKHNlc3Npb24sIGJueDJpX2Nvbm4sCkBAIC0xOTE4LDEzICsyMDM5LDIxIEBACiAJCQlwcmludGsoS0VSTl9BTEVSVCAiYm54Mmk6IHVua25vd24gb3Bjb2RlIDB4JXhcbiIsCiAJCQkJCSAgbm9waW4tPm9wX2NvZGUpOwogCQl9Ci0JCWlmICghdGd0X2FzeW5jX21zZykKLQkJCWJueDJpX2Nvbm4tPmVwLT5udW1fYWN0aXZlX2NtZHMtLTsKKwkJaWYgKCF0Z3RfYXN5bmNfbXNnKSB7CisJCQlpZiAoIWF0b21pY19yZWFkKCZibngyaV9jb25uLT5lcC0+bnVtX2FjdGl2ZV9jbWRzKSkKKwkJCQlwcmludGsoS0VSTl9BTEVSVCAiYm54MmkgKCVzKTogbm8gYWN0aXZlIGNtZCEgIgorCQkJCSAgICAgICAib3AgMHgleFxuIiwKKwkJCQkgICAgICAgYm54MmlfY29ubi0+aGJhLT5uZXRkZXYtPm5hbWUsCisJCQkJICAgICAgIG5vcGluLT5vcF9jb2RlKTsKKwkJCWVsc2UKKwkJCQlhdG9taWNfZGVjKCZibngyaV9jb25uLT5lcC0+bnVtX2FjdGl2ZV9jbWRzKTsKKwkJfQogY3FlX291dDoKIAkJLyogY2xlYXIgb3V0IGluIHByb2R1Y3Rpb24gdmVyc2lvbiBvbmx5LCB0aWxsIGJldGEga2VlcCBvcGNvZGUKIAkJICogZmllbGQgaW50YWN0LCB3aWxsIGJlIGhlbHBmdWwgaW4gZGVidWdnaW5nIChjb250ZXh0IGR1bXApCiAJCSAqIG5vcGluLT5vcF9jb2RlID0gMDsKIAkJICovCisJCWNxZV9jbnQrKzsKIAkJcXAtPmNxZV9leHBfc2VxX3NuKys7CiAJCWlmIChxcC0+Y3FlX2V4cF9zZXFfc24gPT0gKHFwLT5jcWVfc2l6ZSAqIDIgKyAxKSkKIAkJCXFwLT5jcWVfZXhwX3NlcV9zbiA9IElTQ1NJX0lOSVRJQUxfU047CkBAIC0xOTM3LDYgKzIwNjYsOCBAQAogCQkJcXAtPmNxX2NvbnNfaWR4Kys7CiAJCX0KIAl9CitvdXQ6CisJcmV0dXJuIGNxZV9jbnQ7CiB9CiAKIC8qKgpAQCAtMTk1Miw2ICsyMDgzLDcgQEAKIHsKIAlzdHJ1Y3QgYm54MmlfY29ubiAqYm54MmlfY29ubjsKIAl1MzIgaXNjc2lfY2lkOworCWludCBueHRfaWR4OwogCiAJaXNjc2lfY2lkID0gbmV3X2NxZV9rY3FlLT5pc2NzaV9jb25uX2lkOwogCWJueDJpX2Nvbm4gPSBibngyaV9nZXRfY29ubl9mcm9tX2lkKGhiYSwgaXNjc2lfY2lkKTsKQEAgLTE5NjQsOSArMjA5NiwxMiBAQAogCQlwcmludGsoS0VSTl9BTEVSVCAiY2lkICMleCAtIGVwIG5vdCBib3VuZFxuIiwgaXNjc2lfY2lkKTsKIAkJcmV0dXJuOwogCX0KKwogCWJueDJpX3Byb2Nlc3NfbmV3X2NxZXMoYm54MmlfY29ubik7Ci0JYm54MmlfYXJtX2NxX2V2ZW50X2NvYWxlc2NpbmcoYm54MmlfY29ubi0+ZXAsIENOSUNfQVJNX0NRRV9GUCk7Ci0JYm54MmlfcHJvY2Vzc19uZXdfY3FlcyhibngyaV9jb25uKTsKKwlueHRfaWR4ID0gYm54MmlfYXJtX2NxX2V2ZW50X2NvYWxlc2NpbmcoYm54MmlfY29ubi0+ZXAsCisJCQkJCQlDTklDX0FSTV9DUUVfRlApOworCWlmIChueHRfaWR4ICYmIG54dF9pZHggPT0gYm54MmlfcHJvY2Vzc19uZXdfY3FlcyhibngyaV9jb25uKSkKKwkJYm54MmlfYXJtX2NxX2V2ZW50X2NvYWxlc2NpbmcoYm54MmlfY29ubi0+ZXAsIENOSUNfQVJNX0NRRV9GUCk7CiB9CiAKIApAQCAtMjMxMiw3ICsyNDQ3LDcgQEAKIAkJCXByaW50ayhLRVJOX0FMRVJUICJibngyaSAoJXMpOiBvZmxkMSBjbXBsIC0gaW52YWxpZCAiCiAJCQkJIm9wY29kZVxuIiwgaGJhLT5uZXRkZXYtPm5hbWUpOwogCQllbHNlIGlmIChvZmxkX2tjcWUtPmNvbXBsZXRpb25fc3RhdHVzID09Ci0JCQlJU0NTSV9LQ1FFX0NPTVBMRVRJT05fU1RBVFVTX0NJRF9CVVNZKQorCQkJIElTQ1NJX0tDUUVfQ09NUExFVElPTl9TVEFUVVNfQ0lEX0JVU1kpCiAJCQkvKiBlcnJvciBzdGF0dXMgY29kZSB2YWxpZCBvbmx5IGZvciA1NzcxeCBjaGlwc2V0ICovCiAJCQllcC0+c3RhdGUgPSBFUF9TVEFURV9PRkxEX0ZBSUxFRF9DSURfQlVTWTsKIAkJZWxzZQpAQCAtMjM4NiwxNCArMjUyMSwyMCBAQAogICogYm54MmlfaW5kaWNhdGVfbmV0ZXZlbnQgLSBHZW5lcmljIG5ldGRldiBldmVudCBoYW5kbGVyCiAgKiBAY29udGV4dDoJYWRhcHRlciBzdHJ1Y3R1cmUgcG9pbnRlcgogICogQGV2ZW50OglldmVudCB0eXBlCisgKiBAdmxhbl9pZDoJdmxhbnMgaWQgLSBhc3NvY2lhdGVkIHZsYW4gaWQgd2l0aCB0aGlzIGV2ZW50CiAgKgogICogSGFuZGxlcyBmb3VyIG5ldGRldiBldmVudHMsIE5FVERFVl9VUCwgTkVUREVWX0RPV04sCiAgKglORVRERVZfR09JTkdfRE9XTiBhbmQgTkVUREVWX0NIQU5HRQogICovCi1zdGF0aWMgdm9pZCBibngyaV9pbmRpY2F0ZV9uZXRldmVudCh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBsb25nIGV2ZW50KQorc3RhdGljIHZvaWQgYm54MmlfaW5kaWNhdGVfbmV0ZXZlbnQodm9pZCAqY29udGV4dCwgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCQkgICAgdTE2IHZsYW5faWQpCiB7CiAJc3RydWN0IGJueDJpX2hiYSAqaGJhID0gY29udGV4dDsKIAorCS8qIElnbm9yZSBhbGwgbmV0ZXZlbnQgY29taW5nIGZyb20gdmxhbnMgKi8KKwlpZiAodmxhbl9pZCAhPSAwKQorCQlyZXR1cm47CisKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBORVRERVZfVVA6CiAJCWlmICghdGVzdF9iaXQoQURBUFRFUl9TVEFURV9VUCwgJmhiYS0+YWRhcHRlcl9zdGF0ZSkpCkBAIC0yNTExLDcgKzI2NTIsNyBAQAogCiAKIHN0YXRpYyBpbnQgYm54Mmlfc2VuZF9ubF9tZXNnKHZvaWQgKmNvbnRleHQsIHUzMiBtc2dfdHlwZSwKLQkJCSAgICAgICBjaGFyICpidWYsIHUxNiBidWZsZW4pCisJCQkgICAgICBjaGFyICpidWYsIHUxNiBidWZsZW4pCiB7CiAJc3RydWN0IGJueDJpX2hiYSAqaGJhID0gY29udGV4dDsKIAlpbnQgcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2luaXQuYwppbmRleCA2YWRiZGMzLi4xYTk0N2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pbml0LmMKQEAgLTEsNiArMSw2IEBACiAvKiBibngyaS5jOiBCcm9hZGNvbSBOZXRYdHJlbWUgSUkgaVNDU0kgZHJpdmVyLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE1pa2UgQ2hyaXN0aWUKICAqCkBAIC0xOCw4ICsxOCw4IEBACiBzdGF0aWMgdTMyIGFkYXB0ZXJfY291bnQ7CiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiYm54MmkiCi0jZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMi42LjIuMyIKLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJEZWMgMzEsIDIwMTAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMi43LjAuMyIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW4gMTUsIDIwMTEiCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KIAkJIkJyb2FkY29tIE5ldFh0cmVtZSBJSSBpU0NTSSBEcml2ZXIgIiBEUlZfTU9EVUxFX05BTUUgXApAQCAtMzAsNyArMzAsNyBAQAogCSAgICAgICJFZGRpZSBXYWkgPGVkZGllLndhaUBicm9hZGNvbS5jb20+Iik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3MDYvNTcwOC81NzA5LzU3NzEwLzU3NzExLzU3NzEyIgotCQkgICAiIGlTQ1NJIERyaXZlciIpOworCQkgICAiLzU3ODAwLzU3ODEwLzU3ODQwIGlTQ1NJIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKIApAQCAtNDAsNyArNDAsNyBAQAogbW9kdWxlX3BhcmFtKGV2ZW50X2NvYWxfbWluLCBpbnQsIDA2NjQpOwogTU9EVUxFX1BBUk1fREVTQyhldmVudF9jb2FsX21pbiwgIkV2ZW50IENvYWxlc2NpbmcgTWluaW11bSBDb21tYW5kcyIpOwogCi11bnNpZ25lZCBpbnQgZXZlbnRfY29hbF9kaXYgPSAxOwordW5zaWduZWQgaW50IGV2ZW50X2NvYWxfZGl2ID0gMjsKIG1vZHVsZV9wYXJhbShldmVudF9jb2FsX2RpdiwgaW50LCAwNjY0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZXZlbnRfY29hbF9kaXYsICJFdmVudCBDb2FsZXNjaW5nIERpdmlkZSBGYWN0b3IiKTsKIApAQCAtNjYsNiArNjYsMTUgQEAKIAogdTY0IGlzY3NpX2Vycm9yX21hc2sgPSAweDAwOwogCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgYm54MmlfcGVyY3B1X3MsIGJueDJpX3BlcmNwdSk7CisKK3N0YXRpYyBpbnQgYm54MmlfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpOworLyogbm90aWZpY2F0aW9uIGZ1bmN0aW9uIGZvciBDUFUgaG90cGx1ZyBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYm54MmlfY3B1X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gYm54MmlfY3B1X2NhbGxiYWNrLAorfTsKKwogCiAvKioKICAqIGJueDJpX2lkZW50aWZ5X2RldmljZSAtIGlkZW50aWZpZXMgTmV0WHRyZW1lIElJIGRldmljZSB0eXBlCkBAIC04OCwxMSArOTcsMjAgQEAKIAkgICAgKGhiYS0+cGNpX2RpZCA9PSBQQ0lfREVWSUNFX0lEX05YMl81NzA5UykpIHsKIAkJc2V0X2JpdChCTlgySV9OWDJfREVWXzU3MDksICZoYmEtPmNuaWNfZGV2X3R5cGUpOwogCQloYmEtPm1haWxfcXVldWVfYWNjZXNzID0gQk5YMklfTVFfQklOX01PREU7Ci0JfSBlbHNlIGlmIChoYmEtPnBjaV9kaWQgPT0gUENJX0RFVklDRV9JRF9OWDJfNTc3MTAgIHx8Ci0JCSAgIGhiYS0+cGNpX2RpZCA9PSBQQ0lfREVWSUNFX0lEX05YMl81NzcxMSAgfHwKLQkJICAgaGJhLT5wY2lfZGlkID09IFBDSV9ERVZJQ0VfSURfTlgyXzU3NzExRSB8fAotCQkgICBoYmEtPnBjaV9kaWQgPT0gUENJX0RFVklDRV9JRF9OWDJfNTc3MTIgIHx8Ci0JCSAgIGhiYS0+cGNpX2RpZCA9PSBQQ0lfREVWSUNFX0lEX05YMl81NzcxMkUpCisJfSBlbHNlIGlmIChoYmEtPnBjaV9kaWQgPT0gUENJX0RFVklDRV9JRF9OWDJfNTc3MTAgICAgfHwKKwkJICAgaGJhLT5wY2lfZGlkID09IFBDSV9ERVZJQ0VfSURfTlgyXzU3NzExICAgIHx8CisJCSAgIGhiYS0+cGNpX2RpZCA9PSBQQ0lfREVWSUNFX0lEX05YMl81NzcxMUUgICB8fAorCQkgICBoYmEtPnBjaV9kaWQgPT0gUENJX0RFVklDRV9JRF9OWDJfNTc3MTIgICAgfHwKKwkJICAgaGJhLT5wY2lfZGlkID09IFBDSV9ERVZJQ0VfSURfTlgyXzU3NzEyRSAgIHx8CisJCSAgIGhiYS0+cGNpX2RpZCA9PSBQQ0lfREVWSUNFX0lEX05YMl81NzgwMCAgICB8fAorCQkgICBoYmEtPnBjaV9kaWQgPT0gUENJX0RFVklDRV9JRF9OWDJfNTc4MDBfTUYgfHwKKwkJICAgaGJhLT5wY2lfZGlkID09IFBDSV9ERVZJQ0VfSURfTlgyXzU3ODAwX1ZGIHx8CisJCSAgIGhiYS0+cGNpX2RpZCA9PSBQQ0lfREVWSUNFX0lEX05YMl81NzgxMCAgICB8fAorCQkgICBoYmEtPnBjaV9kaWQgPT0gUENJX0RFVklDRV9JRF9OWDJfNTc4MTBfTUYgfHwKKwkJICAgaGJhLT5wY2lfZGlkID09IFBDSV9ERVZJQ0VfSURfTlgyXzU3ODEwX1ZGIHx8CisJCSAgIGhiYS0+cGNpX2RpZCA9PSBQQ0lfREVWSUNFX0lEX05YMl81Nzg0MCAgICB8fAorCQkgICBoYmEtPnBjaV9kaWQgPT0gUENJX0RFVklDRV9JRF9OWDJfNTc4NDBfTUYgfHwKKwkJICAgaGJhLT5wY2lfZGlkID09IFBDSV9ERVZJQ0VfSURfTlgyXzU3ODQwX1ZGKQogCQlzZXRfYml0KEJOWDJJX05YMl9ERVZfNTc3MTAsICZoYmEtPmNuaWNfZGV2X3R5cGUpOwogCWVsc2UKIAkJcHJpbnRrKEtFUk5fQUxFUlQgImJueDJpOiB1bmtub3duIGRldmljZSwgMHgleFxuIiwKQEAgLTE2MywyMSArMTgxLDE0IEBACiAJc3RydWN0IGJueDJpX2hiYSAqaGJhID0gaGFuZGxlOwogCWludCBpID0gSFo7CiAKLQlpZiAoIWhiYS0+Y25pYy0+bWF4X2lzY3NpX2Nvbm4pIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgImJueDJpOiBkZXYgJXMgZG9lcyBub3Qgc3VwcG9ydCAiCi0JCQkiaVNDU0lcbiIsIGhiYS0+bmV0ZGV2LT5uYW1lKTsKKwkvKgorCSAqIFdlIHNob3VsZCBuZXZlciByZWdpc3RlciBkZXZpY2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpU0NTSQorCSAqIChzZWUgYm54MmlfaW5pdF9vbmUpLCBzbyBzb21ldGhpbmcgaXMgd3JvbmcgaWYgd2UgdHJ5IHRvCisJICogc3RhcnQgYSBpU0NTSSBhZGFwdGVyIG9uIGhhcmR3YXJlIHdpdGggMCBzdXBwb3J0ZWQgaVNDU0kKKwkgKiBjb25uZWN0aW9ucworCSAqLworCUJVR19PTighaGJhLT5jbmljLT5tYXhfaXNjc2lfY29ubik7CiAKLQkJaWYgKHRlc3RfYml0KEJOWDJJX0NOSUNfUkVHSVNURVJFRCwgJmhiYS0+cmVnX3dpdGhfY25pYykpIHsKLQkJCW11dGV4X2xvY2soJmJueDJpX2Rldl9sb2NrKTsKLQkJCWxpc3RfZGVsX2luaXQoJmhiYS0+bGluayk7Ci0JCQlhZGFwdGVyX2NvdW50LS07Ci0JCQloYmEtPmNuaWMtPnVucmVnaXN0ZXJfZGV2aWNlKGhiYS0+Y25pYywgQ05JQ19VTFBfSVNDU0kpOwotCQkJY2xlYXJfYml0KEJOWDJJX0NOSUNfUkVHSVNURVJFRCwgJmhiYS0+cmVnX3dpdGhfY25pYyk7Ci0JCQltdXRleF91bmxvY2soJmJueDJpX2Rldl9sb2NrKTsKLQkJCWJueDJpX2ZyZWVfaGJhKGhiYSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KIAlibngyaV9zZW5kX2Z3X2lzY3NpX2luaXRfbXNnKGhiYSk7CiAJd2hpbGUgKCF0ZXN0X2JpdChBREFQVEVSX1NUQVRFX1VQLCAmaGJhLT5hZGFwdGVyX3N0YXRlKSAmJiBpLS0pCiAJCW1zbGVlcChCTlgySV9JTklUX1BPTExfVElNRSk7CkBAIC0yODEsNiArMjkyLDEzIEBACiAJaW50IHJjOwogCiAJbXV0ZXhfbG9jaygmYm54MmlfZGV2X2xvY2spOworCWlmICghY25pYy0+bWF4X2lzY3NpX2Nvbm4pIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgImJueDJpOiBkZXYgJXMgZG9lcyBub3Qgc3VwcG9ydCAiCisJCQkiaVNDU0lcbiIsIGhiYS0+bmV0ZGV2LT5uYW1lKTsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCiAJaGJhLT5jbmljID0gY25pYzsKIAlyYyA9IGNuaWMtPnJlZ2lzdGVyX2RldmljZShjbmljLCBDTklDX1VMUF9JU0NTSSwgaGJhKTsKIAlpZiAoIXJjKSB7CkBAIC0yOTgsNiArMzE2LDcgQEAKIAllbHNlCiAJCXByaW50ayhLRVJOX0VSUiAiYm54MmkgZGV2IHJlZywgdW5rbm93biBlcnJvciwgJWRcbiIsIHJjKTsKIAorb3V0OgogCW11dGV4X3VubG9jaygmYm54MmlfZGV2X2xvY2spOwogCiAJcmV0dXJuIHJjOwpAQCAtMzYyLDYgKzM4MSw5MSBAQAogCiAKIC8qKgorICogYm54MmlfcGVyY3B1X3RocmVhZF9jcmVhdGUgLSBDcmVhdGUgYSByZWNlaXZlIHRocmVhZCBmb3IgYW4KKyAqCQkJCW9ubGluZSBDUFUKKyAqCisgKiBAY3B1OgljcHUgaW5kZXggZm9yIHRoZSBvbmxpbmUgY3B1CisgKi8KK3N0YXRpYyB2b2lkIGJueDJpX3BlcmNwdV90aHJlYWRfY3JlYXRlKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGJueDJpX3BlcmNwdV9zICpwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOworCisJcCA9ICZwZXJfY3B1KGJueDJpX3BlcmNwdSwgY3B1KTsKKworCXRocmVhZCA9IGt0aHJlYWRfY3JlYXRlKGJueDJpX3BlcmNwdV9pb190aHJlYWQsICh2b2lkICopcCwKKwkJCQkiYm54MmlfdGhyZWFkLyVkIiwgY3B1KTsKKwkvKiBiaW5kIHRocmVhZCB0byB0aGUgY3B1ICovCisJaWYgKGxpa2VseSghSVNfRVJSKHRocmVhZCkpKSB7CisJCWt0aHJlYWRfYmluZCh0aHJlYWQsIGNwdSk7CisJCXAtPmlvdGhyZWFkID0gdGhyZWFkOworCQl3YWtlX3VwX3Byb2Nlc3ModGhyZWFkKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgYm54MmlfcGVyY3B1X3RocmVhZF9kZXN0cm95KHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGJueDJpX3BlcmNwdV9zICpwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOworCXN0cnVjdCBibngyaV93b3JrICp3b3JrLCAqdG1wOworCisJLyogUHJldmVudCBhbnkgbmV3IHdvcmsgZnJvbSBiZWluZyBxdWV1ZWQgZm9yIHRoaXMgQ1BVICovCisJcCA9ICZwZXJfY3B1KGJueDJpX3BlcmNwdSwgY3B1KTsKKwlzcGluX2xvY2tfYmgoJnAtPnBfd29ya19sb2NrKTsKKwl0aHJlYWQgPSBwLT5pb3RocmVhZDsKKwlwLT5pb3RocmVhZCA9IE5VTEw7CisKKwkvKiBGcmVlIGFsbCB3b3JrIGluIHRoZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdvcmssIHRtcCwgJnAtPndvcmtfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZ3b3JrLT5saXN0KTsKKwkJYm54MmlfcHJvY2Vzc19zY3NpX2NtZF9yZXNwKHdvcmstPnNlc3Npb24sCisJCQkJCSAgICB3b3JrLT5ibngyaV9jb25uLCAmd29yay0+Y3FlKTsKKwkJa2ZyZWUod29yayk7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJnAtPnBfd29ya19sb2NrKTsKKwlpZiAodGhyZWFkKQorCQlrdGhyZWFkX3N0b3AodGhyZWFkKTsKK30KKworCisvKioKKyAqIGJueDJpX2NwdV9jYWxsYmFjayAtIEhhbmRsZXIgZm9yIENQVSBob3RwbHVnIGV2ZW50cworICoKKyAqIEBuZmI6CVRoZSBjYWxsYmFjayBkYXRhIGJsb2NrCisgKiBAYWN0aW9uOglUaGUgZXZlbnQgdHJpZ2dlcmluZyB0aGUgY2FsbGJhY2sKKyAqIEBoY3B1OglUaGUgaW5kZXggb2YgdGhlIENQVSB0aGF0IHRoZSBldmVudCBpcyBmb3IKKyAqCisgKiBUaGlzIGNyZWF0ZXMgb3IgZGVzdHJveXMgcGVyLUNQVSBkYXRhIGZvciBpU0NTSQorICoKKyAqIFJldHVybnMgTk9USUZZX09LIGFsd2F5cy4KKyAqLworc3RhdGljIGludCBibngyaV9jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwl1bnNpZ25lZCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9PTkxJTkU6CisJY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYm54Mmk6IENQVSAleCBvbmxpbmU6IENyZWF0ZSBSeCB0aHJlYWRcbiIsCisJCQljcHUpOworCQlibngyaV9wZXJjcHVfdGhyZWFkX2NyZWF0ZShjcHUpOworCQlicmVhazsKKwljYXNlIENQVV9ERUFEOgorCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgorCQlwcmludGsoS0VSTl9JTkZPICJDUFUgJXggb2ZmbGluZTogUmVtb3ZlIFJ4IHRocmVhZFxuIiwgY3B1KTsKKwkJYm54MmlfcGVyY3B1X3RocmVhZF9kZXN0cm95KGNwdSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCisKKy8qKgogICogYm54MmlfbW9kX2luaXQgLSBtb2R1bGUgaW5pdCBlbnRyeSBwb2ludAogICoKICAqIGluaXRpYWxpemUgYW55IGRyaXZlciB3aWRlIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgc3VjaCBhcyBlbmRwb2ludCBwb29sLApAQCAtMzcxLDYgKzQ3NSw4IEBACiBzdGF0aWMgaW50IF9faW5pdCBibngyaV9tb2RfaW5pdCh2b2lkKQogewogCWludCBlcnI7CisJdW5zaWduZWQgY3B1ID0gMDsKKwlzdHJ1Y3QgYm54MmlfcGVyY3B1X3MgKnA7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOwogCkBAIC0zOTMsNiArNDk5LDIwIEBACiAJCWdvdG8gdW5yZWdfeHBvcnQ7CiAJfQogCisJLyogQ3JlYXRlIHBlcmNwdSBrZXJuZWwgdGhyZWFkcyB0byBoYW5kbGUgaVNDU0kgSS9PIGNvbXBsZXRpb25zICovCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlwID0gJnBlcl9jcHUoYm54MmlfcGVyY3B1LCBjcHUpOworCQlJTklUX0xJU1RfSEVBRCgmcC0+d29ya19saXN0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJnAtPnBfd29ya19sb2NrKTsKKwkJcC0+aW90aHJlYWQgPSBOVUxMOworCX0KKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQlibngyaV9wZXJjcHVfdGhyZWFkX2NyZWF0ZShjcHUpOworCisJLyogSW5pdGlhbGl6ZSBwZXIgQ1BVIGludGVycnVwdCB0aHJlYWQgKi8KKwlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmJueDJpX2NwdV9ub3RpZmllcik7CisKIAlyZXR1cm4gMDsKIAogdW5yZWdfeHBvcnQ6CkBAIC00MTMsNiArNTMzLDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBibngyaV9tb2RfZXhpdCh2b2lkKQogewogCXN0cnVjdCBibngyaV9oYmEgKmhiYTsKKwl1bnNpZ25lZCBjcHUgPSAwOwogCiAJbXV0ZXhfbG9jaygmYm54MmlfZGV2X2xvY2spOwogCXdoaWxlICghbGlzdF9lbXB0eSgmYWRhcHRlcl9saXN0KSkgewpAQCAtNDMwLDYgKzU1MSwxMSBAQAogCX0KIAltdXRleF91bmxvY2soJmJueDJpX2Rldl9sb2NrKTsKIAorCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZibngyaV9jcHVfbm90aWZpZXIpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCWJueDJpX3BlcmNwdV90aHJlYWRfZGVzdHJveShjcHUpOworCiAJaXNjc2lfdW5yZWdpc3Rlcl90cmFuc3BvcnQoJmJueDJpX2lzY3NpX3RyYW5zcG9ydCk7CiAJY25pY191bnJlZ2lzdGVyX2RyaXZlcihDTklDX1VMUF9JU0NTSSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCmluZGV4IDA0MTkyOGIuLjVjNTVhNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGJueDJpX2lzY3NpLmM6IEJyb2FkY29tIE5ldFh0cmVtZSBJSSBpU0NTSSBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggTWlrZSBDaHJpc3RpZQogICoKQEAgLTI3LDYgKzI3LDcgQEAKICAqLwogc3RhdGljIERFRklORV9TUElOTE9DSyhibngyaV9yZXNjX2xvY2spOyAvKiBwcm90ZWN0cyBnbG9iYWwgcmVzb3VyY2VzICovCiAKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgYm54MmlfcGVyY3B1X3MsIGJueDJpX3BlcmNwdSk7CiAKIHN0YXRpYyBpbnQgYm54MmlfYWRhcHRlcl9yZWFkeShzdHJ1Y3QgYm54MmlfaGJhICpoYmEpCiB7CkBAIC0xMjE0LDcgKzEyMTUsOCBAQAogCXN0cnVjdCBibngyaV9jbWQgKmNtZCA9IHRhc2stPmRkX2RhdGE7CiAJc3RydWN0IGlzY3NpX2NtZCAqaGRyID0gKHN0cnVjdCBpc2NzaV9jbWQgKikgdGFzay0+aGRyOwogCi0JaWYgKGJueDJpX2Nvbm4tPmVwLT5udW1fYWN0aXZlX2NtZHMgKyAxID4gaGJhLT5tYXhfc3FlcykKKwlpZiAoYXRvbWljX3JlYWQoJmJueDJpX2Nvbm4tPmVwLT5udW1fYWN0aXZlX2NtZHMpICsgMSAgPgorCSAgICBoYmEtPm1heF9zcWVzKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qCkBAIC0xMzU0LDYgKzEzNTYsOSBAQAogCWJueDJpX2Nvbm4gPSBjb25uLT5kZF9kYXRhOwogCWJueDJpX2Nvbm4tPmNsc19jb25uID0gY2xzX2Nvbm47CiAJYm54MmlfY29ubi0+aGJhID0gaGJhOworCisJYXRvbWljX3NldCgmYm54MmlfY29ubi0+d29ya19jbnQsIDApOworCiAJLyogJ2VwJyBwdHIgd2lsbCBiZSBhc3NpZ25lZCBpbiBiaW5kKCkgY2FsbCAqLwogCWJueDJpX2Nvbm4tPmVwID0gTlVMTDsKIAlpbml0X2NvbXBsZXRpb24oJmJueDJpX2Nvbm4tPmNtZF9jbGVhbnVwX2NtcGwpOwpAQCAtMTQ1NywxMSArMTQ2MiwzNCBAQAogCXN0cnVjdCBibngyaV9jb25uICpibngyaV9jb25uID0gY29ubi0+ZGRfZGF0YTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAlzdHJ1Y3QgYm54MmlfaGJhICpoYmE7CisJc3RydWN0IGJueDJpX3dvcmsgKndvcmssICp0bXA7CisJdW5zaWduZWQgY3B1ID0gMDsKKwlzdHJ1Y3QgYm54MmlfcGVyY3B1X3MgKnA7CiAKIAlzaG9zdCA9IGlzY3NpX3Nlc3Npb25fdG9fc2hvc3QoaXNjc2lfY29ubl90b19zZXNzaW9uKGNsc19jb25uKSk7CiAJaGJhID0gaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKIAogCWJueDJpX2Nvbm5fZnJlZV9sb2dpbl9yZXNvdXJjZXMoaGJhLCBibngyaV9jb25uKTsKKworCWlmIChhdG9taWNfcmVhZCgmYm54MmlfY29ubi0+d29ya19jbnQpKSB7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCQlwID0gJnBlcl9jcHUoYm54MmlfcGVyY3B1LCBjcHUpOworCQkJc3Bpbl9sb2NrX2JoKCZwLT5wX3dvcmtfbG9jayk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod29yaywgdG1wLAorCQkJCQkJICZwLT53b3JrX2xpc3QsIGxpc3QpIHsKKwkJCQlpZiAod29yay0+c2Vzc2lvbiA9PSBjb25uLT5zZXNzaW9uICYmCisJCQkJICAgIHdvcmstPmJueDJpX2Nvbm4gPT0gYm54MmlfY29ubikgeworCQkJCQlsaXN0X2RlbF9pbml0KCZ3b3JrLT5saXN0KTsKKwkJCQkJa2ZyZWUod29yayk7CisJCQkJCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgKKwkJCQkJCQkmYm54MmlfY29ubi0+d29ya19jbnQpKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2tfYmgoJnAtPnBfd29ya19sb2NrKTsKKwkJfQorCX0KKwogCWlzY3NpX2Nvbm5fdGVhcmRvd24oY2xzX2Nvbm4pOwogfQogCkBAIC0xNzY5LDcgKzE3OTcsNyBAQAogCX0KIAlibngyaV9lcCA9IGVwLT5kZF9kYXRhOwogCi0JYm54MmlfZXAtPm51bV9hY3RpdmVfY21kcyA9IDA7CisJYXRvbWljX3NldCgmYm54MmlfZXAtPm51bV9hY3RpdmVfY21kcywgMCk7CiAJaXNjc2lfY2lkID0gYm54MmlfYWxsb2NfaXNjc2lfY2lkKGhiYSk7CiAJaWYgKGlzY3NpX2NpZCA9PSAtMSkgewogCQlwcmludGsoS0VSTl9BTEVSVCAiYm54MmkgKCVzKTogYWxsb2NfZXAgLSB1bmFibGUgdG8gYWxsb2NhdGUgIgpAQCAtMjE2Myw5ICsyMTkxLDkgQEAKIAkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBpc2NzaV9laF9kZXZpY2VfcmVzZXQsCiAJLmVoX3RhcmdldF9yZXNldF9oYW5kbGVyID0gaXNjc2lfZWhfcmVjb3Zlcl90YXJnZXQsCiAJLmNoYW5nZV9xdWV1ZV9kZXB0aAk9IGlzY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aCwKLQkuY2FuX3F1ZXVlCQk9IDEwMjQsCisJLmNhbl9xdWV1ZQkJPSAyMDQ4LAogCS5tYXhfc2VjdG9ycwkJPSAxMjcsCi0JLmNtZF9wZXJfbHVuCQk9IDI0LAorCS5jbWRfcGVyX2x1bgkJPSAxMjgsCiAJLnRoaXNfaWQJCT0gLTEsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAogCS5zZ190YWJsZXNpemUJCT0gSVNDU0lfTUFYX0JEU19QRVJfQ01ELApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54Mmlfc3lzZnMuYwppbmRleCA5MTc0MTk2Li44M2E3N2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54Mmlfc3lzZnMuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54Mmlfc3lzZnMuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIGJueDJpX3N5c2ZzLmM6IEJyb2FkY29tIE5ldFh0cmVtZSBJSSBpU0NTSSBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA0IC0gMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA0IC0gMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2IzaS9jeGdiM2kuYyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiM2kvY3hnYjNpLmMKaW5kZXggZmMyY2RiNi4uYmQyMjA0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2IzaS9jeGdiM2kuYworKysgYi9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjNpL2N4Z2IzaS5jCkBAIC05ODUsNyArOTg1LDcgQEAKIAkJY3NrLT5zYWRkci5zaW5fYWRkci5zX2FkZHIgPSBjaGJhLT5pcHY0YWRkcjsKIAogCWNzay0+cnNzX3FpZCA9IDA7Ci0JY3NrLT5sMnQgPSB0M19sMnRfZ2V0KHQzZGV2LCBkc3QtPm5laWdoYm91ciwgbmRldik7CisJY3NrLT5sMnQgPSB0M19sMnRfZ2V0KHQzZGV2LCBkc3RfZ2V0X25laWdoYm91cihkc3QpLCBuZGV2KTsKIAlpZiAoIWNzay0+bDJ0KSB7CiAJCXByX2VycigiTk8gbDJ0IGF2YWlsYWJsZS5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEyNDUsNyArMTI0NSw3IEBACiAJc3RydWN0IGN4Z2JpX2RkcF9pbmZvICpkZHAgPSB0ZGV2LT51bHBfaXNjc2k7CiAJc3RydWN0IHVscF9pc2NzaV9pbmZvIHVpbmZvOwogCXVuc2lnbmVkIGludCBwZ3N6X2ZhY3Rvcls0XTsKLQlpbnQgZXJyOworCWludCBpLCBlcnI7CiAKIAlpZiAoZGRwKSB7CiAJCWtyZWZfZ2V0KCZkZHAtPnJlZmNudCk7CkBAIC0xMjcxLDYgKzEyNzEsOCBAQAogCiAJdWluZm8udGFnbWFzayA9IGRkcC0+aWR4X21hc2sgPDwgUFBPRF9JRFhfU0hJRlQ7CiAJY3hnYmlfZGRwX3BhZ2Vfc2l6ZV9mYWN0b3IocGdzel9mYWN0b3IpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXVpbmZvLnBnc3pfZmFjdG9yW2ldID0gcGdzel9mYWN0b3JbaV07CiAJdWluZm8udWxpbWl0ID0gdWluZm8ubGxpbWl0ICsgKGRkcC0+bnBwb2RzIDw8IFBQT0RfU0laRV9TSElGVCk7CiAKIAllcnIgPSB0ZGV2LT5jdGwodGRldiwgVUxQX0lTQ1NJX1NFVF9QQVJBTVMsICZ1aW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYwppbmRleCBmM2E0Y2Q3Li5hZTEzYzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMKQEAgLTExNjAsNyArMTE2MCw3IEBACiAJY3hnYmlfc29ja19zZXRfZmxhZyhjc2ssIENUUEZfSEFTX0FUSUQpOwogCWN4Z2JpX3NvY2tfZ2V0KGNzayk7CiAKLQljc2stPmwydCA9IGN4Z2I0X2wydF9nZXQobGxkaS0+bDJ0LCBjc2stPmRzdC0+bmVpZ2hib3VyLCBuZGV2LCAwKTsKKwljc2stPmwydCA9IGN4Z2I0X2wydF9nZXQobGxkaS0+bDJ0LCBkc3RfZ2V0X25laWdoYm91cihjc2stPmRzdCksIG5kZXYsIDApOwogCWlmICghY3NrLT5sMnQpIHsKIAkJcHJfZXJyKCIlcywgY2Fubm90IGFsbG9jIGwydC5cbiIsIG5kZXYtPm5hbWUpOwogCQlnb3RvIHJlbF9yZXNvdXJjZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiaS9saWJjeGdiaS5jIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2xpYmN4Z2JpLmMKaW5kZXggYTJhOWM3Yy4uNzdhYzIxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2N4Z2JpL2xpYmN4Z2JpLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2xpYmN4Z2JpLmMKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCWRzdCA9ICZydC0+ZHN0OwotCW5kZXYgPSBkc3QtPm5laWdoYm91ci0+ZGV2OworCW5kZXYgPSBkc3RfZ2V0X25laWdoYm91cihkc3QpLT5kZXY7CiAKIAlpZiAocnQtPnJ0X2ZsYWdzICYgKFJUQ0ZfTVVMVElDQVNUIHwgUlRDRl9CUk9BRENBU1QpKSB7CiAJCXByX2luZm8oIm11bHRpLWNhc3Qgcm91dGUgJXBJNCwgcG9ydCAldSwgZGV2ICVzLlxuIiwKQEAgLTUwNiw3ICs1MDYsNyBAQAogCQluZGV2ID0gaXBfZGV2X2ZpbmQoJmluaXRfbmV0LCBkYWRkci0+c2luX2FkZHIuc19hZGRyKTsKIAkJbXR1ID0gbmRldi0+bXR1OwogCQlwcl9pbmZvKCJydCBkZXYgJXMsIGxvb3BiYWNrIC0+ICVzLCBtdHUgJXUuXG4iLAotCQkJZHN0LT5uZWlnaGJvdXItPmRldi0+bmFtZSwgbmRldi0+bmFtZSwgbXR1KTsKKwkJCWRzdF9nZXRfbmVpZ2hib3VyKGRzdCktPmRldi0+bmFtZSwgbmRldi0+bmFtZSwgbXR1KTsKIAl9CiAKIAljZGV2ID0gY3hnYmlfZGV2aWNlX2ZpbmRfYnlfbmV0ZGV2KG5kZXYsICZwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYwppbmRleCBlN2ZjNzBkLi4yZTdjMTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMKKysrIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jCkBAIC0zNSw3ICszNSw3IEBACiAgKiBtb2RlIHBhZ2Ugd2VyZSB0YWtlbiBmcm9tIHRoZSBMU0kgUkRBQyAyLjQgR1BMJ2QKICAqIGRyaXZlciwgYW5kIHRoZW4gY29udmVydGVkIHRvIExpbnV4IGNvbnZlbnRpb25zLgogICovCi0jZGVmaW5lIFJEQUNfUVVJRVNDRU5DRV9USU1FIDIwOworI2RlZmluZSBSREFDX1FVSUVTQ0VOQ0VfVElNRSAyMAogLyoKICAqIFBhZ2UgQ29kZXMKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jCmluZGV4IDE1NWQ3YjkuLjIwNGZhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYworKysgYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmMKQEAgLTk5LDcgKzk5LDggQEAKIHN0YXRpYyBpbnQgZmNvZV9kZHBfc2V0dXAoc3RydWN0IGZjX2xwb3J0ICosIHUxNiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosCiAJCQkgIHVuc2lnbmVkIGludCk7CiBzdGF0aWMgaW50IGZjb2VfZGRwX2RvbmUoc3RydWN0IGZjX2xwb3J0ICosIHUxNik7Ci0KK3N0YXRpYyBpbnQgZmNvZV9kZHBfdGFyZ2V0KHN0cnVjdCBmY19scG9ydCAqLCB1MTYsIHN0cnVjdCBzY2F0dGVybGlzdCAqLAorCQkJICAgdW5zaWduZWQgaW50KTsKIHN0YXRpYyBpbnQgZmNvZV9jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcsIHZvaWQgKik7CiAKIHN0YXRpYyBib29sIGZjb2VfbWF0Y2goc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CkBAIC0xNDMsNiArMTQ0LDcgQEAKIAkuZnJhbWVfc2VuZCA9IGZjb2VfeG1pdCwKIAkuZGRwX3NldHVwID0gZmNvZV9kZHBfc2V0dXAsCiAJLmRkcF9kb25lID0gZmNvZV9kZHBfZG9uZSwKKwkuZGRwX3RhcmdldCA9IGZjb2VfZGRwX3RhcmdldCwKIAkuZWxzY3Rfc2VuZCA9IGZjb2VfZWxzY3Rfc2VuZCwKIAkuZ2V0X2xlc2IgPSBmY29lX2dldF9sZXNiLAogCS5scG9ydF9zZXRfcG9ydF9pZCA9IGZjb2Vfc2V0X3BvcnRfaWQsCkBAIC00MjksMjEgKzQzMSw2IEBACiAJc3RydWN0IGZjb2VfY3RsciAqZmlwID0gJmZjb2UtPmN0bHI7CiAJdTggZmxvZ2lfbWFkZHJbRVRIX0FMRU5dOwogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzOwotCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGZjb2UtPmN0bHIubHApOwotCi0JRkNPRV9ORVRERVZfREJHKG5ldGRldiwgIkRlc3Ryb3lpbmcgaW50ZXJmYWNlXG4iKTsKLQotCS8qIExvZ291dCBvZiB0aGUgZmFicmljICovCi0JZmNfZmFicmljX2xvZ29mZihmY29lLT5jdGxyLmxwKTsKLQotCS8qIENsZWFudXAgdGhlIGZjX2xwb3J0ICovCi0JZmNfbHBvcnRfZGVzdHJveShmY29lLT5jdGxyLmxwKTsKLQotCS8qIFN0b3AgdGhlIHRyYW5zbWl0IHJldHJ5IHRpbWVyICovCi0JZGVsX3RpbWVyX3N5bmMoJnBvcnQtPnRpbWVyKTsKLQotCS8qIEZyZWUgZXhpc3RpbmcgdHJhbnNtaXQgc2ticyAqLwotCWZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShmY29lLT5jdGxyLmxwKTsKIAogCS8qCiAJICogRG9uJ3QgbGlzdGVuIGZvciBFdGhlcm5ldCBwYWNrZXRzIGFueW1vcmUuCkBAIC00NjYsOSArNDUzLDYgQEAKIAl9IGVsc2UKIAkJZGV2X21jX2RlbChuZXRkZXYsIEZJUF9BTExfRU5PREVfTUFDUyk7CiAKLQlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcihwb3J0LT5kYXRhX3NyY19hZGRyKSkKLQkJZGV2X3VjX2RlbChuZXRkZXYsIHBvcnQtPmRhdGFfc3JjX2FkZHIpOwotCiAJLyogVGVsbCB0aGUgTExEIHdlIGFyZSBkb25lIHcvIEZDb0UgKi8KIAlvcHMgPSBuZXRkZXYtPm5ldGRldl9vcHM7CiAJaWYgKG9wcy0+bmRvX2Zjb2VfZGlzYWJsZSkgewpAQCAtNDc2LDYgKzQ2MCw4IEBACiAJCQlGQ09FX05FVERFVl9EQkcobmV0ZGV2LCAiRmFpbGVkIHRvIGRpc2FibGUgRkNvRSIKIAkJCQkJIiBzcGVjaWZpYyBmZWF0dXJlIGZvciBMTEQuXG4iKTsKIAl9CisKKwkvKiBSZWxlYXNlIHRoZSBzZWxmLXJlZmVyZW5jZSB0YWtlbiBkdXJpbmcgZmNvZV9pbnRlcmZhY2VfY3JlYXRlKCkgKi8KIAlmY29lX2ludGVyZmFjZV9wdXQoZmNvZSk7CiB9CiAKQEAgLTc0OSwxMiArNzM1LDI3IEBACiAgKiBUaGUgb2ZmbG9hZCBFTSB0aGF0IHRoaXMgcm91dGluZSBpcyBhc3NvY2lhdGVkIHdpdGggd2lsbCBoYW5kbGUgYW55CiAgKiBwYWNrZXRzIHRoYXQgYXJlIGZvciBTQ1NJIHJlYWQgcmVxdWVzdHMuCiAgKgorICogVGhpcyBoYXMgYmVlbiBlbmhhbmNlZCB0byB3b3JrIHdoZW4gRkNvRSBzdGFjayBpcyBvcGVyYXRpbmcgaW4gdGFyZ2V0CisgKiBtb2RlLgorICoKICAqIFJldHVybnM6IFRydWUgZm9yIHJlYWQgdHlwZXMgSS9PLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KICAqLwogYm9vbCBmY29lX29lbV9tYXRjaChzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogewotCXJldHVybiBmY19mY3BfaXNfcmVhZChmcl9mc3AoZnApKSAmJgotCQkoZnJfZnNwKGZwKS0+ZGF0YV9sZW4gPiBmY29lX2RkcF9taW4pOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJc3RydWN0IGZjcF9jbW5kICpmY3A7CisKKwlpZiAoZmNfZmNwX2lzX3JlYWQoZnJfZnNwKGZwKSkgJiYKKwkgICAgKGZyX2ZzcChmcCktPmRhdGFfbGVuID4gZmNvZV9kZHBfbWluKSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZSBpZiAoIShudG9oMjQoZmgtPmZoX2ZfY3RsKSAmIEZDX0ZDX0VYX0NUWCkpIHsKKwkJZmNwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqZmNwKSk7CisJCWlmIChudG9ocyhmaC0+ZmhfcnhfaWQpID09IEZDX1hJRF9VTktOT1dOICYmCisJCSAgICBmY3AgJiYgKG50b2hsKGZjcC0+ZmNfZGwpID4gZmNvZV9kZHBfbWluKSAmJgorCQkgICAgKGZjcC0+ZmNfZmxhZ3MgJiBGQ1BfQ0ZMX1dSREFUQSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKioKQEAgLTg0NCw2ICs4NDUsMzIgQEAKICAqLwogc3RhdGljIHZvaWQgZmNvZV9pZl9kZXN0cm95KHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7CisJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOworCXN0cnVjdCBmY29lX2ludGVyZmFjZSAqZmNvZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGZjb2UtPm5ldGRldjsKKworCUZDT0VfTkVUREVWX0RCRyhuZXRkZXYsICJEZXN0cm95aW5nIGludGVyZmFjZVxuIik7CisKKwkvKiBMb2dvdXQgb2YgdGhlIGZhYnJpYyAqLworCWZjX2ZhYnJpY19sb2dvZmYobHBvcnQpOworCisJLyogQ2xlYW51cCB0aGUgZmNfbHBvcnQgKi8KKwlmY19scG9ydF9kZXN0cm95KGxwb3J0KTsKKworCS8qIFN0b3AgdGhlIHRyYW5zbWl0IHJldHJ5IHRpbWVyICovCisJZGVsX3RpbWVyX3N5bmMoJnBvcnQtPnRpbWVyKTsKKworCS8qIEZyZWUgZXhpc3RpbmcgdHJhbnNtaXQgc2ticyAqLworCWZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShscG9ydCk7CisKKwlydG5sX2xvY2soKTsKKwlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcihwb3J0LT5kYXRhX3NyY19hZGRyKSkKKwkJZGV2X3VjX2RlbChuZXRkZXYsIHBvcnQtPmRhdGFfc3JjX2FkZHIpOworCXJ0bmxfdW5sb2NrKCk7CisKKwkvKiBSZWxlYXNlIHJlZmVyZW5jZSBoZWxkIGluIGZjb2VfaWZfY3JlYXRlKCkgKi8KKwlmY29lX2ludGVyZmFjZV9wdXQoZmNvZSk7CisKIAkvKiBGcmVlIHF1ZXVlZCBwYWNrZXRzIGZvciB0aGUgcGVyLUNQVSByZWNlaXZlIHRocmVhZHMgKi8KIAlmY29lX3BlcmNwdV9jbGVhbihscG9ydCk7CiAKQEAgLTg4Nyw2ICs5MTQsMjggQEAKIH0KIAogLyoqCisgKiBmY29lX2RkcF90YXJnZXQoKSAtIENhbGwgYSBMTEQncyBkZHBfdGFyZ2V0IHRocm91Z2ggdGhlIG5ldCBkZXZpY2UKKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gc2V0dXAgRERQIGZvcgorICogQHhpZDogICBUaGUgZXhjaGFuZ2UgSUQgZm9yIHRoaXMgRERQIHRyYW5zZmVyCisgKiBAc2dsOiAgIFRoZSBzY2F0dGVybGlzdCBkZXNjcmliaW5nIHRoaXMgdHJhbnNmZXIKKyAqIEBzZ2M6ICAgVGhlIG51bWJlciBvZiBzZyBpdGVtcworICoKKyAqIFJldHVybnM6IDAgaWYgdGhlIEREUCBjb250ZXh0IHdhcyBub3QgY29uZmlndXJlZAorICovCitzdGF0aWMgaW50IGZjb2VfZGRwX3RhcmdldChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCB1MTYgeGlkLAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBzZ2MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGZjb2VfbmV0ZGV2KGxwb3J0KTsKKworCWlmIChuZXRkZXYtPm5ldGRldl9vcHMtPm5kb19mY29lX2RkcF90YXJnZXQpCisJCXJldHVybiBuZXRkZXYtPm5ldGRldl9vcHMtPm5kb19mY29lX2RkcF90YXJnZXQobmV0ZGV2LCB4aWQsCisJCQkJCQkJICAgICAgIHNnbCwgc2djKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgogICogZmNvZV9kZHBfZG9uZSgpIC0gQ2FsbCBhIExMRCdzIGRkcF9kb25lIHRocm91Z2ggdGhlIG5ldCBkZXZpY2UKICAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gY29tcGxldGUgRERQIG9uCiAgKiBAeGlkOiAgIFRoZSBleGNoYW5nZSBJRCBmb3IgdGhpcyBERFAgdHJhbnNmZXIKQEAgLTEyMDYsNiArMTI1NSwzNiBAQAogfQogCiAvKioKKyAqIGZjb2Vfc2VsZWN0X2NwdSgpIC0gU2VsZWN0cyBDUFUgdG8gaGFuZGxlIHBvc3QtcHJvY2Vzc2luZyBvZiBpbmNvbWluZworICoJCQljb21tYW5kLgorICogQGN1cnJfY3B1OiAgIENQVSB3aGljaCByZWNlaXZlZCByZXF1ZXN0CisgKgorICogVGhpcyByb3V0aW5lIHNlbGVjdHMgbmV4dCBDUFUgYmFzZWQgb24gY3B1bWFzay4KKyAqCisgKiBSZXR1cm5zOiBpbnQgKENQVSBudW1iZXIpLiBDYWxsZXIgdG8gdmVyaWZ5IGlmIHJldHVybmVkIENQVSBpcyBvbmxpbmUgb3Igbm90LgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGZjb2Vfc2VsZWN0X2NwdSh1bnNpZ25lZCBpbnQgY3Vycl9jcHUpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCBzZWxlY3RlZF9jcHU7CisKKwlpZiAobnVtX29ubGluZV9jcHVzKCkgPT0gMSkKKwkJcmV0dXJuIGN1cnJfY3B1OworCS8qCisJICogRG9pbmcgZm9sbG93aW5nIGNoZWNrLCB0byBza2lwICJjdXJyX2NwdSAoc21wX3Byb2Nlc3Nvcl9pZCkiCisJICogZnJvbSBzZWxlY3Rpb24gb2YgQ1BVIGlzIGludGVudGlvbmFsLiBUaGlzIGlzIHRvIGF2b2lkIHNhbWUgQ1BVCisJICogZG9pbmcgcG9zdC1wcm9jZXNzaW5nIG9mIGNvbW1hbmQuICJjdXJyX2NwdSIgdG8ganVzdCByZWNlaXZlCisJICogaW5jb21pbmcgcmVxdWVzdCBpbiBjYXNlIHdoZXJlIHJ4X2lkIGlzIFVOS05PV04gYW5kIGFsbCBvdGhlcgorCSAqIENQVSB0byBhY3R1YWxseSBwcm9jZXNzIHRoZSBjb21tYW5kKHMpCisJICovCisJZG8geworCQlzZWxlY3RlZF9jcHUgPSBjcHVtYXNrX25leHQoc2VsZWN0ZWRfY3B1LCBjcHVfb25saW5lX21hc2spOworCQlpZiAoc2VsZWN0ZWRfY3B1ID49IG5yX2NwdV9pZHMpCisJCQlzZWxlY3RlZF9jcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9vbmxpbmVfbWFzayk7CisJfSB3aGlsZSAoc2VsZWN0ZWRfY3B1ID09IGN1cnJfY3B1KTsKKwlyZXR1cm4gc2VsZWN0ZWRfY3B1OworfQorCisvKioKICAqIGZjb2VfcmN2KCkgLSBSZWNlaXZlIHBhY2tldHMgZnJvbSBhIG5ldCBkZXZpY2UKICAqIEBza2I6ICAgIFRoZSByZWNlaXZlZCBwYWNrZXQKICAqIEBuZXRkZXY6IFRoZSBuZXQgZGV2aWNlIHRoYXQgdGhlIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24KQEAgLTEyODEsOSArMTM2MCwyMCBAQAogCSAqLwogCWlmIChudG9oMjQoZmgtPmZoX2ZfY3RsKSAmIEZDX0ZDX0VYX0NUWCkKIAkJY3B1ID0gbnRvaHMoZmgtPmZoX294X2lkKSAmIGZjX2NwdV9tYXNrOwotCWVsc2UKKwllbHNlIHsKIAkJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCisJCWlmICgoZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9GQ1ApICYmCisJCSAgICAobnRvaHMoZmgtPmZoX3J4X2lkKSA9PSBGQ19YSURfVU5LTk9XTikpIHsKKwkJCWRvIHsKKwkJCQljcHUgPSBmY29lX3NlbGVjdF9jcHUoY3B1KTsKKwkJCX0gd2hpbGUgKCFjcHVfb25saW5lKGNwdSkpOworCQl9IGVsc2UgIGlmICgoZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9GQ1ApICYmCisJCQkgICAgKG50b2hzKGZoLT5maF9yeF9pZCkgIT0gRkNfWElEX1VOS05PV04pKSB7CisJCQljcHUgPSBudG9ocyhmaC0+ZmhfcnhfaWQpICYgZmNfY3B1X21hc2s7CisJCX0gZWxzZQorCQkJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCX0KIAlmcHMgPSAmcGVyX2NwdShmY29lX3BlcmNwdSwgY3B1KTsKIAlzcGluX2xvY2tfYmgoJmZwcy0+ZmNvZV9yeF9saXN0LmxvY2spOwogCWlmICh1bmxpa2VseSghZnBzLT50aHJlYWQpKSB7CkBAIC0xNzMzLDcgKzE4MjMsNiBAQAogCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CiAJCWxpc3RfZGVsKCZmY29lLT5saXN0KTsKIAkJcG9ydCA9IGxwb3J0X3ByaXYoZmNvZS0+Y3Rsci5scCk7Ci0JCWZjb2VfaW50ZXJmYWNlX2NsZWFudXAoZmNvZSk7CiAJCXF1ZXVlX3dvcmsoZmNvZV93cSwgJnBvcnQtPmRlc3Ryb3lfd29yayk7CiAJCWdvdG8gb3V0OwogCQlicmVhazsKQEAgLTE4MjcsMjIgKzE5MTYsMjIgQEAKIHsKIAlzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2U7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKKwlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OwogCWludCByYyA9IDA7CiAKIAltdXRleF9sb2NrKCZmY29lX2NvbmZpZ19tdXRleCk7CiAJcnRubF9sb2NrKCk7CiAJZmNvZSA9IGZjb2VfaG9zdGxpc3RfbG9va3VwX3BvcnQobmV0ZGV2KTsKIAlpZiAoIWZjb2UpIHsKLQkJcnRubF91bmxvY2soKTsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIG91dF9ub2RldjsKIAl9CiAJbHBvcnQgPSBmY29lLT5jdGxyLmxwOworCXBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKIAlsaXN0X2RlbCgmZmNvZS0+bGlzdCk7Ci0JZmNvZV9pbnRlcmZhY2VfY2xlYW51cChmY29lKTsKLQlydG5sX3VubG9jaygpOwotCWZjb2VfaWZfZGVzdHJveShscG9ydCk7CisJcXVldWVfd29yayhmY29lX3dxLCAmcG9ydC0+ZGVzdHJveV93b3JrKTsKIG91dF9ub2RldjoKKwlydG5sX3VubG9jaygpOwogCW11dGV4X3VubG9jaygmZmNvZV9jb25maWdfbXV0ZXgpOwogCXJldHVybiByYzsKIH0KQEAgLTE4NTQsMTAgKzE5NDMsMjUgQEAKIHN0YXRpYyB2b2lkIGZjb2VfZGVzdHJveV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OworCXN0cnVjdCBmY29lX2ludGVyZmFjZSAqZmNvZTsKKwlpbnQgbnBpdiA9IDA7CiAKIAlwb3J0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmY29lX3BvcnQsIGRlc3Ryb3lfd29yayk7CiAJbXV0ZXhfbG9jaygmZmNvZV9jb25maWdfbXV0ZXgpOworCisJLyogc2V0IGlmIHRoaXMgaXMgYW4gTlBJViBwb3J0ICovCisJbnBpdiA9IHBvcnQtPmxwb3J0LT52cG9ydCA/IDEgOiAwOworCisJZmNvZSA9IHBvcnQtPnByaXY7CiAJZmNvZV9pZl9kZXN0cm95KHBvcnQtPmxwb3J0KTsKKworCS8qIERvIG5vdCB0ZWFyIGRvd24gdGhlIGZjb2UgaW50ZXJmYWNlIGZvciBOUElWIHBvcnQgKi8KKwlpZiAoIW5waXYpIHsKKwkJcnRubF9sb2NrKCk7CisJCWZjb2VfaW50ZXJmYWNlX2NsZWFudXAoZmNvZSk7CisJCXJ0bmxfdW5sb2NrKCk7CisJfQorCiAJbXV0ZXhfdW5sb2NrKCZmY29lX2NvbmZpZ19tdXRleCk7CiB9CiAKQEAgLTE4ODYsNyArMTk5MCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZmNvZV9jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgZW51bSBmaXBfc3RhdGUgZmlwX21vZGUpCiB7Ci0JaW50IHJjOworCWludCByYyA9IDA7CiAJc3RydWN0IGZjb2VfaW50ZXJmYWNlICpmY29lOwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAKQEAgLTE5MTEsNyArMjAxNSw3IEBACiAJCSAgICAgICBuZXRkZXYtPm5hbWUpOwogCQlyYyA9IC1FSU87CiAJCWZjb2VfaW50ZXJmYWNlX2NsZWFudXAoZmNvZSk7Ci0JCWdvdG8gb3V0X2ZyZWU7CisJCWdvdG8gb3V0X25vZGV2OwogCX0KIAogCS8qIE1ha2UgdGhpcyB0aGUgIm1hc3RlciIgTl9Qb3J0ICovCkBAIC0xOTI2LDE3ICsyMDMwLDYgQEAKIAlpZiAoIWZjb2VfbGlua19vayhscG9ydCkpCiAJCWZjb2VfY3Rscl9saW5rX3VwKCZmY29lLT5jdGxyKTsKIAotCS8qCi0JICogUmVsZWFzZSBmcm9tIGluaXQgaW4gZmNvZV9pbnRlcmZhY2VfY3JlYXRlKCksIG9uIHN1Y2Nlc3MgbHBvcnQKLQkgKiBzaG91bGQgYmUgaG9sZGluZyBhIHJlZmVyZW5jZSB0YWtlbiBpbiBmY29lX2lmX2NyZWF0ZSgpLgotCSAqLwotCWZjb2VfaW50ZXJmYWNlX3B1dChmY29lKTsKLQlydG5sX3VubG9jaygpOwotCW11dGV4X3VubG9jaygmZmNvZV9jb25maWdfbXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci1vdXRfZnJlZToKLQlmY29lX2ludGVyZmFjZV9wdXQoZmNvZSk7CiBvdXRfbm9kZXY6CiAJcnRubF91bmxvY2soKTsKIAltdXRleF91bmxvY2soJmZjb2VfY29uZmlnX211dGV4KTsKQEAgLTIyMTgsNyArMjMxMSw2IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjb2UsIHRtcCwgJmZjb2VfaG9zdGxpc3QsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJmZjb2UtPmxpc3QpOwogCQlwb3J0ID0gbHBvcnRfcHJpdihmY29lLT5jdGxyLmxwKTsKLQkJZmNvZV9pbnRlcmZhY2VfY2xlYW51cChmY29lKTsKIAkJcXVldWVfd29yayhmY29lX3dxLCAmcG9ydC0+ZGVzdHJveV93b3JrKTsKIAl9CiAJcnRubF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWMuaCBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWMuaAppbmRleCA2NzFjZGU5Li45NWE1YmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljLmgKKysrIGIvZHJpdmVycy9zY3NpL2ZuaWMvZm5pYy5oCkBAIC0zNyw3ICszNyw3IEBACiAKICNkZWZpbmUgRFJWX05BTUUJCSJmbmljIgogI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JCSJDaXNjbyBGQ29FIEhCQSBEcml2ZXIiCi0jZGVmaW5lIERSVl9WRVJTSU9OCQkiMS41LjAuMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjUuMC4yIgogI2RlZmluZSBQRlgJCQlEUlZfTkFNRSAiOiAiCiAjZGVmaW5lIERGWCAgICAgICAgICAgICAgICAgICAgIERSVl9OQU1FICIlZDogIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX21haW4uYyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfbWFpbi5jCmluZGV4IGJiNjNmMWEuLmZjOThlYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfbWFpbi5jCkBAIC0zODgsMTcgKzM4OCw2IEBACiAJCWlvdW5tYXAoZm5pYy0+YmFyMC52YWRkcik7CiB9CiAKLS8qCi0gKiBBbGxvY2F0ZSBlbGVtZW50IGZvciBtZW1wb29scyByZXF1aXJpbmcgR0ZQX0RNQSBmbGFnLgotICogT3RoZXJ3aXNlLCBjaGVja3MgaW4ga21lbV9mbGFnY2hlY2soKSBoaXQgQlVHX09OKCkuCi0gKi8KLXN0YXRpYyB2b2lkICpmbmljX2FsbG9jX3NsYWJfZG1hKGdmcF90IGdmcF9tYXNrLCB2b2lkICpwb29sX2RhdGEpCi17Ci0Jc3RydWN0IGttZW1fY2FjaGUgKm1lbSA9IHBvb2xfZGF0YTsKLQotCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKG1lbSwgZ2ZwX21hc2sgfCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7Ci19Ci0KIC8qKgogICogZm5pY19nZXRfbWFjKCkgLSBnZXQgYXNzaWduZWQgZGF0YSBNQUMgYWRkcmVzcyBmb3IgRklQIGNvZGUuCiAgKiBAbHBvcnQ6IAlsb2NhbCBwb3J0LgpAQCAtNjAzLDE0ICs1OTIsMTIgQEAKIAlpZiAoIWZuaWMtPmlvX3JlcV9wb29sKQogCQlnb3RvIGVycl9vdXRfZnJlZV9yZXNvdXJjZXM7CiAKLQlwb29sID0gbWVtcG9vbF9jcmVhdGUoMiwgZm5pY19hbGxvY19zbGFiX2RtYSwgbWVtcG9vbF9mcmVlX3NsYWIsCi0JCQkgICAgICBmbmljX3NnbF9jYWNoZVtGTklDX1NHTF9DQUNIRV9ERkxUXSk7CisJcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbCgyLCBmbmljX3NnbF9jYWNoZVtGTklDX1NHTF9DQUNIRV9ERkxUXSk7CiAJaWYgKCFwb29sKQogCQlnb3RvIGVycl9vdXRfZnJlZV9pb3JlcV9wb29sOwogCWZuaWMtPmlvX3NnbF9wb29sW0ZOSUNfU0dMX0NBQ0hFX0RGTFRdID0gcG9vbDsKIAotCXBvb2wgPSBtZW1wb29sX2NyZWF0ZSgyLCBmbmljX2FsbG9jX3NsYWJfZG1hLCBtZW1wb29sX2ZyZWVfc2xhYiwKLQkJCSAgICAgIGZuaWNfc2dsX2NhY2hlW0ZOSUNfU0dMX0NBQ0hFX01BWF0pOworCXBvb2wgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2woMiwgZm5pY19zZ2xfY2FjaGVbRk5JQ19TR0xfQ0FDSEVfTUFYXSk7CiAJaWYgKCFwb29sKQogCQlnb3RvIGVycl9vdXRfZnJlZV9kZmx0X3Bvb2w7CiAJZm5pYy0+aW9fc2dsX3Bvb2xbRk5JQ19TR0xfQ0FDSEVfTUFYXSA9IHBvb2w7CkBAIC04NzYsNyArODYzLDcgQEAKIAlsZW4gPSBzaXplb2Yoc3RydWN0IGZuaWNfZGZsdF9zZ2xfbGlzdCk7CiAJZm5pY19zZ2xfY2FjaGVbRk5JQ19TR0xfQ0FDSEVfREZMVF0gPSBrbWVtX2NhY2hlX2NyZWF0ZQogCQkoImZuaWNfc2dsX2RmbHQiLCBsZW4gKyBGTklDX1NHX0RFU0NfQUxJR04sIEZOSUNfU0dfREVTQ19BTElHTiwKLQkJIFNMQUJfSFdDQUNIRV9BTElHTiB8IFNMQUJfQ0FDSEVfRE1BLAorCQkgU0xBQl9IV0NBQ0hFX0FMSUdOLAogCQkgTlVMTCk7CiAJaWYgKCFmbmljX3NnbF9jYWNoZVtGTklDX1NHTF9DQUNIRV9ERkxUXSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gY3JlYXRlIGZuaWMgZGZsdCBzZ2wgc2xhYlxuIik7CkBAIC04ODgsNyArODc1LDcgQEAKIAlsZW4gPSBzaXplb2Yoc3RydWN0IGZuaWNfc2dsX2xpc3QpOwogCWZuaWNfc2dsX2NhY2hlW0ZOSUNfU0dMX0NBQ0hFX01BWF0gPSBrbWVtX2NhY2hlX2NyZWF0ZQogCQkoImZuaWNfc2dsX21heCIsIGxlbiArIEZOSUNfU0dfREVTQ19BTElHTiwgRk5JQ19TR19ERVNDX0FMSUdOLAotCQkgU0xBQl9IV0NBQ0hFX0FMSUdOIHwgU0xBQl9DQUNIRV9ETUEsCisJCSBTTEFCX0hXQ0FDSEVfQUxJR04sCiAJCSBOVUxMKTsKIAlpZiAoIWZuaWNfc2dsX2NhY2hlW0ZOSUNfU0dMX0NBQ0hFX01BWF0pIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIHRvIGNyZWF0ZSBmbmljIG1heCBzZ2wgc2xhYlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfc2NzaS5jCmluZGV4IDUzOGIzMWMuLmM0MGNlNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWNfc2NzaS5jCkBAIC00MDYsNyArNDA2LDcgQEAKIAlpZiAoc2dfY291bnQpIHsKIAkJaW9fcmVxLT5zZ2xfbGlzdCA9CiAJCQltZW1wb29sX2FsbG9jKGZuaWMtPmlvX3NnbF9wb29sW2lvX3JlcS0+c2dsX3R5cGVdLAotCQkJCSAgICAgIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKKwkJCQkgICAgICBHRlBfQVRPTUlDKTsKIAkJaWYgKCFpb19yZXEtPnNnbF9saXN0KSB7CiAJCQlyZXQgPSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwogCQkJc2NzaV9kbWFfdW5tYXAoc2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hwc2EuYyBiL2RyaXZlcnMvc2NzaS9ocHNhLmMKaW5kZXggYzZjMDQzNC4uNmJiYTIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2EuYworKysgYi9kcml2ZXJzL3Njc2kvaHBzYS5jCkBAIC0xMDM3LDYgKzEwMzcsNyBAQAogCXVuc2lnbmVkIGNoYXIgc2Vuc2Vfa2V5OwogCXVuc2lnbmVkIGNoYXIgYXNjOyAgICAgIC8qIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSAqLwogCXVuc2lnbmVkIGNoYXIgYXNjcTsgICAgIC8qIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSBxdWFsaWZpZXIgKi8KKwl1bnNpZ25lZCBsb25nIHNlbnNlX2RhdGFfc2l6ZTsKIAogCWVpID0gY3AtPmVycl9pbmZvOwogCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNwLT5zY3NpX2NtZDsKQEAgLTEwNTEsMTAgKzEwNTIsMTQgQEAKIAljbWQtPnJlc3VsdCB8PSBlaS0+U2NzaVN0YXR1czsKIAogCS8qIGNvcHkgdGhlIHNlbnNlIGRhdGEgd2hldGhlciB3ZSBuZWVkIHRvIG9yIG5vdC4gKi8KLQltZW1jcHkoY21kLT5zZW5zZV9idWZmZXIsIGVpLT5TZW5zZUluZm8sCi0JCWVpLT5TZW5zZUxlbiA+IFNDU0lfU0VOU0VfQlVGRkVSU0laRSA/Ci0JCQlTQ1NJX1NFTlNFX0JVRkZFUlNJWkUgOgotCQkJZWktPlNlbnNlTGVuKTsKKwlpZiAoU0NTSV9TRU5TRV9CVUZGRVJTSVpFIDwgc2l6ZW9mKGVpLT5TZW5zZUluZm8pKQorCQlzZW5zZV9kYXRhX3NpemUgPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisJZWxzZQorCQlzZW5zZV9kYXRhX3NpemUgPSBzaXplb2YoZWktPlNlbnNlSW5mbyk7CisJaWYgKGVpLT5TZW5zZUxlbiA8IHNlbnNlX2RhdGFfc2l6ZSkKKwkJc2Vuc2VfZGF0YV9zaXplID0gZWktPlNlbnNlTGVuOworCisJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLCBlaS0+U2Vuc2VJbmZvLCBzZW5zZV9kYXRhX3NpemUpOwogCXNjc2lfc2V0X3Jlc2lkKGNtZCwgZWktPlJlc2lkdWFsQ250KTsKIAogCWlmIChlaS0+Q29tbWFuZFN0YXR1cyA9PSAwKSB7CkBAIC0yNTgwLDcgKzI1ODUsOCBAQAogCQljLT5TR1swXS5FeHQgPSAwOyAvKiB3ZSBhcmUgbm90IGNoYWluaW5nKi8KIAl9CiAJaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZShoLCBjKTsKLQlocHNhX3BjaV91bm1hcChoLT5wZGV2LCBjLCAxLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCWlmIChpb2NvbW1hbmQuYnVmX3NpemUgPiAwKQorCQlocHNhX3BjaV91bm1hcChoLT5wZGV2LCBjLCAxLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCWNoZWNrX2lvY3RsX3VuaXRfYXR0ZW50aW9uKGgsIGMpOwogCiAJLyogQ29weSB0aGUgZXJyb3IgaW5mb3JtYXRpb24gb3V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMKaW5kZXggYjc2NTA2MS4uYmRmYTIyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYwpAQCAtNDMwNiw4ICs0MzA2LDggQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCQlpZiAocmMgPT0gSF9DTE9TRUQpCiAJCQl2aW9fZW5hYmxlX2ludGVycnVwdHModG9fdmlvX2Rldih2aG9zdC0+ZGV2KSk7Ci0JCWVsc2UgaWYgKHJjIHx8IChyYyA9IGlibXZmY19zZW5kX2NycV9pbml0KHZob3N0KSkgfHwKLQkJCSAocmMgPSB2aW9fZW5hYmxlX2ludGVycnVwdHModG9fdmlvX2Rldih2aG9zdC0+ZGV2KSkpKSB7CisJCWlmIChyYyB8fCAocmMgPSBpYm12ZmNfc2VuZF9jcnFfaW5pdCh2aG9zdCkpIHx8CisJCSAgICAocmMgPSB2aW9fZW5hYmxlX2ludGVycnVwdHModG9fdmlvX2Rldih2aG9zdC0+ZGV2KSkpKSB7CiAJCQlpYm12ZmNfbGlua19kb3duKHZob3N0LCBJQk1WRkNfTElOS19ERUFEKTsKIAkJCWRldl9lcnIodmhvc3QtPmRldiwgIkVycm9yIGFmdGVyIHJlc2V0IChyYz0lZClcbiIsIHJjKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvaXNjaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzU5ZTEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACitvYmotJChDT05GSUdfU0NTSV9JU0NJKSArPSBpc2NpLm8KK2lzY2ktb2JqcyA6PSBpbml0Lm8gcGh5Lm8gcmVxdWVzdC5vIFwKKwkgICAgIHJlbW90ZV9kZXZpY2UubyBwb3J0Lm8gXAorCSAgICAgaG9zdC5vIHRhc2subyBwcm9iZV9yb21zLm8gXAorCSAgICAgcmVtb3RlX25vZGVfY29udGV4dC5vIFwKKwkgICAgIHJlbW90ZV9ub2RlX3RhYmxlLm8gXAorCSAgICAgdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbC5vIFwKKwkgICAgIHBvcnRfY29uZmlnLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvaXNjaS9maXJtd2FyZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjU0NDYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorIyBNYWtlZmlsZSBmb3IgY3JlYXRlX2Z3CisjCitDQz1nY2MKK0NGTEFHUz0tYyAtV2FsbCAtTzIgLWcKK0xERkxBR1M9CitTT1VSQ0VTPWNyZWF0ZV9mdy5jCitPQkpFQ1RTPSQoU09VUkNFUzouY3BwPS5vKQorRVhFQ1VUQUJMRT1jcmVhdGVfZncKKworYWxsOiAkKFNPVVJDRVMpICQoRVhFQ1VUQUJMRSkKKworJChFWEVDVVRBQkxFKTogJChPQkpFQ1RTKQorCSQoQ0MpICQoTERGTEFHUykgJChPQkpFQ1RTKSAtbyAkQAorCisuYy5vOgorCSQoQ0MpICQoQ0ZMQUdTKSAkPCAtTyAkQAorCitjbGVhbjoKKwlybSAtZiAqLm8gJChFWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvUkVBRE1FIGIvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTZkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9maXJtd2FyZS9SRUFETUUKQEAgLTAsMCArMSwzNiBAQAorVGhpcyBkZWZpbmVzIHRoZSB0ZW1wb3JhcnkgYmluYXJ5IGJsb3cgd2UgYXJlIHRvIHBhc3MgdG8gdGhlIFNDVQorZHJpdmVyIHRvIGVtdWxhdGUgdGhlIGJpbmFyeSBmaXJtd2FyZSB0aGF0IHdlIHdpbGwgZXZlbnR1YWxseSBiZQorYWJsZSB0byBhY2Nlc3MgdmlhIE5WUkFNIG9uIHRoZSBTQ1UgY29udHJvbGxlci4KKworVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYmluYXJ5IGJsb2IgaXMgZXhwZWN0ZWQgdG8gYmUgMTQ5IGJ5dGVzIG9yIGxhcmdlcgorCitIZWFkZXIgVHlwZXM6CisweDE6IFBoeSBNYXNrcworMHgyOiBQaHkgR2VucworMHgzOiBTQVMgQWRkcnMKKzB4ZmY6IEVuZCBvZiBEYXRhCisKK0lEIHN0cmluZyAtIHU4WzEyXTogIiNTQ1UgTUFHSUMjXDAiCitWZXJzaW9uIC0gdTg6IDEKK1N1YlZlcnNpb24gLSB1ODogMAorCitIZWFkZXIgVHlwZSAtIHU4OiAweDEKK1NpemUgLSB1ODogOAorUGh5IE1hc2sgLSB1MzJbOF0KKworSGVhZGVyIFR5cGUgLSB1ODogMHgyCitTaXplIC0gdTg6IDgKK1BoeSBHZW4gLSB1MzJbOF0KKworSGVhZGVyIFR5cGUgLSB1ODogMHgzCitTaXplIC0gdTg6IDgKK1NhcyBBZGRyIC0gdTY0WzhdCisKK0hlYWRlciBUeXBlIC0gdTg6IDB4ZgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQbGFjZSBpc2NpX2Zpcm13YXJlLmJpbiBpbiAvbGliL2Zpcm13YXJlCitCZSBzdXJlIHRvIHJlY3JlYXRlIHRoZSBpbml0cmFtZnMgaW1hZ2UgdG8gaW5jbHVkZSB0aGUgZmlybXdhcmUuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2Zpcm13YXJlL2NyZWF0ZV9mdy5jIGIvZHJpdmVycy9zY3NpL2lzY2kvZmlybXdhcmUvY3JlYXRlX2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhMjg4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL2Zpcm13YXJlL2NyZWF0ZV9mdy5jCkBAIC0wLDAgKzEsOTkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNyZWF0ZV9mdy5oIgorI2luY2x1ZGUgIi4uL3Byb2JlX3JvbXMuaCIKKworaW50IHdyaXRlX2Jsb2Ioc3RydWN0IGlzY2lfb3JvbSAqaXNjaV9vcm9tKQoreworCUZJTEUgKmZkOworCWludCBlcnI7CisJc2l6ZV90IGNvdW50OworCisJZmQgPSBmb3BlbihibG9iX25hbWUsICJ3KyIpOworCWlmICghZmQpIHsKKwkJcGVycm9yKCJPcGVuIGZpbGUgZm9yIHdyaXRlIGZhaWxlZCIpOworCQlmY2xvc2UoZmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljb3VudCA9IGZ3cml0ZShpc2NpX29yb20sIHNpemVvZihzdHJ1Y3QgaXNjaV9vcm9tKSwgMSwgZmQpOworCWlmIChjb3VudCAhPSAxKSB7CisJCXBlcnJvcigiV3JpdGUgZGF0YSBmYWlsZWQiKTsKKwkJZmNsb3NlKGZkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZmNsb3NlKGZkKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHNldF9iaW5hcnlfdmFsdWVzKHN0cnVjdCBpc2NpX29yb20gKmlzY2lfb3JvbSkKK3sKKwlpbnQgY3RybF9pZHgsIHBoeV9pZHgsIHBvcnRfaWR4OworCisJLyogc2V0dGluZyBPUk9NIHNpZ25hdHVyZSAqLworCXN0cm5jcHkoaXNjaV9vcm9tLT5oZHIuc2lnbmF0dXJlLCBzaWcsIHN0cmxlbihzaWcpKTsKKwlpc2NpX29yb20tPmhkci52ZXJzaW9uID0gdmVyc2lvbjsKKwlpc2NpX29yb20tPmhkci50b3RhbF9ibG9ja19sZW5ndGggPSBzaXplb2Yoc3RydWN0IGlzY2lfb3JvbSk7CisJaXNjaV9vcm9tLT5oZHIuaGRyX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc2NpX2Jpb3Nfb2VtX3BhcmFtX2Jsb2NrX2hkcik7CisJaXNjaV9vcm9tLT5oZHIubnVtX2VsZW1lbnRzID0gbnVtX2VsZW1lbnRzOworCisJZm9yIChjdHJsX2lkeCA9IDA7IGN0cmxfaWR4IDwgMjsgY3RybF9pZHgrKykgeworCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLmNvbnRyb2xsZXIubW9kZV90eXBlID0gbW9kZV90eXBlOworCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLmNvbnRyb2xsZXIubWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXAgPQorCQkJbWF4X251bV9jb25jdXJyZW50X2Rldl9zcGluX3VwOworCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLmNvbnRyb2xsZXIuZG9fZW5hYmxlX3NzYyA9CisJCQllbmFibGVfc3NjOworCisJCWZvciAocG9ydF9pZHggPSAwOyBwb3J0X2lkeCA8IDQ7IHBvcnRfaWR4KyspCisJCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLnBvcnRzW3BvcnRfaWR4XS5waHlfbWFzayA9CisJCQkJcGh5X21hc2tbY3RybF9pZHhdW3BvcnRfaWR4XTsKKworCQlmb3IgKHBoeV9pZHggPSAwOyBwaHlfaWR4IDwgNDsgcGh5X2lkeCsrKSB7CisJCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLnBoeXNbcGh5X2lkeF0uc2FzX2FkZHJlc3MuaGlnaCA9CisJCQkJKF9fdTMyKShzYXNfYWRkcltjdHJsX2lkeF1bcGh5X2lkeF0gPj4gMzIpOworCQkJaXNjaV9vcm9tLT5jdHJsW2N0cmxfaWR4XS5waHlzW3BoeV9pZHhdLnNhc19hZGRyZXNzLmxvdyA9CisJCQkJKF9fdTMyKShzYXNfYWRkcltjdHJsX2lkeF1bcGh5X2lkeF0pOworCisJCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLnBoeXNbcGh5X2lkeF0uYWZlX3R4X2FtcF9jb250cm9sMCA9CisJCQkJYWZlX3R4X2FtcF9jb250cm9sMDsKKwkJCWlzY2lfb3JvbS0+Y3RybFtjdHJsX2lkeF0ucGh5c1twaHlfaWR4XS5hZmVfdHhfYW1wX2NvbnRyb2wxID0KKwkJCQlhZmVfdHhfYW1wX2NvbnRyb2wxOworCQkJaXNjaV9vcm9tLT5jdHJsW2N0cmxfaWR4XS5waHlzW3BoeV9pZHhdLmFmZV90eF9hbXBfY29udHJvbDIgPQorCQkJCWFmZV90eF9hbXBfY29udHJvbDI7CisJCQlpc2NpX29yb20tPmN0cmxbY3RybF9pZHhdLnBoeXNbcGh5X2lkeF0uYWZlX3R4X2FtcF9jb250cm9sMyA9CisJCQkJYWZlX3R4X2FtcF9jb250cm9sMzsKKwkJfQorCX0KK30KKworaW50IG1haW4odm9pZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpc2NpX29yb20gKmlzY2lfb3JvbTsKKworCWlzY2lfb3JvbSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGlzY2lfb3JvbSkpOworCW1lbXNldChpc2NpX29yb20sIDAsIHNpemVvZihzdHJ1Y3QgaXNjaV9vcm9tKSk7CisKKwlzZXRfYmluYXJ5X3ZhbHVlcyhpc2NpX29yb20pOworCisJZXJyID0gd3JpdGVfYmxvYihpc2NpX29yb20pOworCWlmIChlcnIgPCAwKSB7CisJCWZyZWUoaXNjaV9vcm9tKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmcmVlKGlzY2lfb3JvbSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9maXJtd2FyZS9jcmVhdGVfZncuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL2Zpcm13YXJlL2NyZWF0ZV9mdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjk4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9maXJtd2FyZS9jcmVhdGVfZncuaApAQCAtMCwwICsxLDc3IEBACisjaWZuZGVmIF9DUkVBVEVfRldfSF8KKyNkZWZpbmUgX0NSRUFURV9GV19IXworI2luY2x1ZGUgIi4uL3Byb2JlX3JvbXMuaCIKKworCisvKiB3ZSBhcmUgY29uZmlndXJpbmcgZm9yIDIgU0NVcyAqLworc3RhdGljIGNvbnN0IGludCBudW1fZWxlbWVudHMgPSAyOworCisvKgorICogRm9yIGFsbCBkZWZpbmVkIGFycmF5czoKKyAqIGVsZW1lbnRzIDAtMyBhcmUgZm9yIFNDVTAsIHBvcnRzIDAtMworICogZWxlbWVudHMgNC03IGFyZSBmb3IgU0NVMSwgcG9ydHMgMC0zCisgKgorICogdmFsaWQgY29uZmlndXJhdGlvbnMgZm9yIG9uZSBTQ1UgYXJlOgorICogIFAwICBQMSAgUDIgIFAzCisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKiAweEYsMHgwLDB4MCwweDAgIyAxIHg0IHBvcnQKKyAqIDB4MywweDAsMHg0LDB4OCAjIFBoeXMgMCBhbmQgMSBhcmUgYSB4MiBwb3J0LCBwaHkgMiBhbmQgcGh5IDMgYXJlIGVhY2ggeDEKKyAqICAgICAgICAgICAgICAgICAjIHBvcnRzCisgKiAweDEsMHgyLDB4QywweDAgIyBQaHlzIDAgYW5kIDEgYXJlIGVhY2ggeDEgcG9ydHMsIHBoeSAyIGFuZCBwaHkgMyBhcmUgYSB4MgorICogICAgICAgICAgICAgICAgICMgcG9ydAorICogMHgzLDB4MCwweEMsMHgwICMgUGh5cyAwIGFuZCAxIGFyZSBhIHgyIHBvcnQsIHBoeSAyIGFuZCBwaHkgMyBhcmUgYSB4MiBwb3J0CisgKiAweDEsMHgyLDB4NCwweDggIyBFYWNoIHBoeSBpcyBhIHgxIHBvcnQgKHRoaXMgaXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbikKKyAqCisgKiBpZiB0aGVyZSBpcyBhIHBvcnQvcGh5IG9uIHdoaWNoIHlvdSBkbyBub3Qgd2lzaCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdAorICogdmFsdWVzLCB1c2UgdGhlIHZhbHVlIGFzc2lnbmVkIHRvIFVOSU5JVF9QQVJBTSAoMjU1KS4KKyAqLworCisvKiBkaXNjb3ZlcnkgbW9kZSB0eXBlIChwb3J0IGF1dG8gY29uZmlnIG1vZGUgYnkgZGVmYXVsdCApICovCisKKy8qCisgKiBpZiB0aGVyZSBpcyBhIHBvcnQvcGh5IG9uIHdoaWNoIHlvdSBkbyBub3Qgd2lzaCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdAorICogdmFsdWVzLCB1c2UgdGhlIHZhbHVlICIwMDAwMDAwMDAwMDAwMDAwIi4gU0FTIGFkZHJlc3Mgb2YgemVybydzIGlzCisgKiBjb25zaWRlcmVkIGludmFsaWQgYW5kIHdpbGwgbm90IGJlIHVzZWQuCisgKi8KKyNpZmRlZiBNUEMKK3N0YXRpYyBjb25zdCBpbnQgbW9kZV90eXBlID0gU0NJQ19QT1JUX01BTlVBTF9DT05GSUdVUkFUSU9OX01PREU7CitzdGF0aWMgY29uc3QgX191OCBwaHlfbWFza1syXVs0XSA9IHsgezEsIDIsIDQsIDh9LAorCQkJCSAgICAgezEsIDIsIDQsIDh9IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIHNhc19hZGRyWzJdWzRdID0geyB7IDB4NUZDRkZGRkZGMDAwMDAwMVVMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRkYwMDAwMDAyVUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGRjAwMDAwMDNVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkZGMDAwMDAwNFVMTCB9LAorCQkJCQkJICAgeyAweDVGQ0ZGRkZGRjAwMDAwMDVVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkZGMDAwMDAwNlVMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRkYwMDAwMDA3VUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGRjAwMDAwMDhVTEwgfSB9OworI2Vsc2UJLyogQVBDIChkZWZhdWx0KSAqLworc3RhdGljIGNvbnN0IGludCBtb2RlX3R5cGUgPSBTQ0lDX1BPUlRfQVVUT01BVElDX0NPTkZJR1VSQVRJT05fTU9ERTsKK3N0YXRpYyBjb25zdCBfX3U4IHBoeV9tYXNrWzJdWzRdOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBzYXNfYWRkclsyXVs0XSA9IHsgeyAweDVGQ0ZGRkZGMDAwMDAwMDFVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkYwMDAwMDAwMVVMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRjAwMDAwMDAxVUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGMDAwMDAwMDFVTEwgfSwKKwkJCQkJCSAgIHsgMHg1RkNGRkZGRjAwMDAwMDAyVUxMLAorCQkJCQkJICAgICAweDVGQ0ZGRkZGMDAwMDAwMDJVTEwsCisJCQkJCQkgICAgIDB4NUZDRkZGRkYwMDAwMDAwMlVMTCwKKwkJCQkJCSAgICAgMHg1RkNGRkZGRjAwMDAwMDAyVUxMIH0gfTsKKyNlbmRpZgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGRldmljZSBzcGluIHVwICovCitzdGF0aWMgY29uc3QgaW50IG1heF9udW1fY29uY3VycmVudF9kZXZfc3Bpbl91cCA9IDE7CisKKy8qIGVuYWJsZSBvZiBzc2Mgb3BlcmF0aW9uICovCitzdGF0aWMgY29uc3QgaW50IGVuYWJsZV9zc2M7CisKKy8qIEFGRV9UWF9BTVBfQ09OVFJPTCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhZmVfdHhfYW1wX2NvbnRyb2wwID0gMHgwMDBiZGQwODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWZlX3R4X2FtcF9jb250cm9sMSA9IDB4MDAwZmZjMDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFmZV90eF9hbXBfY29udHJvbDIgPSAweDAwMGI3YzA5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhZmVfdHhfYW1wX2NvbnRyb2wzID0gMHgwMDBhZmM2ZTsKKworc3RhdGljIGNvbnN0IGNoYXIgYmxvYl9uYW1lW10gPSAiaXNjaV9maXJtd2FyZS5iaW4iOworc3RhdGljIGNvbnN0IGNoYXIgc2lnW10gPSAiSVNDVU9FTUIiOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmVyc2lvbiA9IDB4MTA7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDcyZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9ob3N0LmMKQEAgLTAsMCArMSwyNzUxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zYXMuaD4KKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAicHJvYmVfcm9tcy5oIgorI2luY2x1ZGUgInJlbW90ZV9kZXZpY2UuaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisjaW5jbHVkZSAic2N1X2NvbXBsZXRpb25fY29kZXMuaCIKKyNpbmNsdWRlICJzY3VfZXZlbnRfY29kZXMuaCIKKyNpbmNsdWRlICJyZWdpc3RlcnMuaCIKKyNpbmNsdWRlICJzY3VfcmVtb3RlX25vZGVfY29udGV4dC5oIgorI2luY2x1ZGUgInNjdV90YXNrX2NvbnRleHQuaCIKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9SQU1fSU5JVF9TVEFMTF9USU1FICAgICAgMjAwCisKKyNkZWZpbmUgc211X21heF9wb3J0cyhkY2NfdmFsdWUpIFwKKwkoXAorCQkoKChkY2NfdmFsdWUpICYgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9MUF9NQVNLKSBcCisJCSA+PiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX0xQX1NISUZUKSArIDEgXAorCSkKKworI2RlZmluZSBzbXVfbWF4X3Rhc2tfY29udGV4dHMoZGNjX3ZhbHVlKQlcCisJKFwKKwkJKCgoZGNjX3ZhbHVlKSAmIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfVENfTUFTSykgXAorCQkgPj4gU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9UQ19TSElGVCkgKyAxIFwKKwkpCisKKyNkZWZpbmUgc211X21heF9ybmNzKGRjY192YWx1ZSkgXAorCShcCisJCSgoKGRjY192YWx1ZSkgJiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1JOQ19NQVNLKSBcCisJCSA+PiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1JOQ19TSElGVCkgKyAxIFwKKwkpCisKKyNkZWZpbmUgU0NJQ19TRFNfQ09OVFJPTExFUl9QSFlfU1RBUlRfVElNRU9VVCAgICAgIDEwMAorCisvKioKKyAqCisgKgorICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB3aGlsZSBhIGdpdmVuIHBoeSBpcyBjb25zdW1pbmcgcG93ZXIKKyAqIGJlZm9yZSBhbGxvd2luZyBhbm90aGVyIHNldCBvZiBwaHlzIHRvIGNvbnN1bWUgcG93ZXIuIFVsdGltYXRlbHksIHRoaXMgd2lsbAorICogYmUgc3BlY2lmaWVkIGJ5IE9FTSBwYXJhbWV0ZXIuCisgKi8KKyNkZWZpbmUgU0NJQ19TRFNfQ09OVFJPTExFUl9QT1dFUl9DT05UUk9MX0lOVEVSVkFMIDUwMAorCisvKioKKyAqIE5PUk1BTElaRV9QVVRfUE9JTlRFUigpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHdpbGwgbm9ybWFsaXplIHRoZSBjb21wbGV0aW9uIHF1ZXVlIHB1dCBwb2ludGVyIHNvIGl0cyB2YWx1ZSBjYW4KKyAqIGJlIHVzZWQgYXMgYW4gYXJyYXkgaW5kZQorICovCisjZGVmaW5lIE5PUk1BTElaRV9QVVRfUE9JTlRFUih4KSBcCisJKCh4KSAmIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9QT0lOVEVSX01BU0spCisKKworLyoqCisgKiBOT1JNQUxJWkVfRVZFTlRfUE9JTlRFUigpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHdpbGwgbm9ybWFsaXplIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGV2ZW50IGVudHJ5IHNvIGl0cyB2YWx1ZSBjYW4KKyAqIGJlIHVzZWQgYXMgYW4gaW5kZXguCisgKi8KKyNkZWZpbmUgTk9STUFMSVpFX0VWRU5UX1BPSU5URVIoeCkgXAorCShcCisJCSgoeCkgJiBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRVZFTlRfUE9JTlRFUl9NQVNLKSBcCisJCT4+IFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9FVkVOVF9QT0lOVEVSX1NISUZUCVwKKwkpCisKKy8qKgorICogTk9STUFMSVpFX0dFVF9QT0lOVEVSKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gd2lsbCBub3JtYWxpemUgdGhlIGNvbXBsZXRpb24gcXVldWUgZ2V0IHBvaW50ZXIgc28gaXRzIHZhbHVlIGNhbgorICogYmUgdXNlZCBhcyBhbiBpbmRleCBpbnRvIGFuIGFycmF5CisgKi8KKyNkZWZpbmUgTk9STUFMSVpFX0dFVF9QT0lOVEVSKHgpIFwKKwkoKHgpICYgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX1BPSU5URVJfTUFTSykKKworLyoqCisgKiBOT1JNQUxJWkVfR0VUX1BPSU5URVJfQ1lDTEVfQklUKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gd2lsbCBub3JtYWxpemUgdGhlIGNvbXBsZXRpb24gcXVldWUgY3ljbGUgcG9pbnRlciBzbyBpdCBtYXRjaGVzCisgKiB0aGUgY29tcGxldGlvbiBxdWV1ZSBjeWNsZSBiaXQKKyAqLworI2RlZmluZSBOT1JNQUxJWkVfR0VUX1BPSU5URVJfQ1lDTEVfQklUKHgpIFwKKwkoKFNNVV9DUUdSX0NZQ0xFX0JJVCAmICh4KSkgPDwgKDMxIC0gU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0NZQ0xFX0JJVF9TSElGVCkpCisKKy8qKgorICogQ09NUExFVElPTl9RVUVVRV9DWUNMRV9CSVQoKSAtCisgKgorICogVGhpcyBtYWNybyB3aWxsIHJldHVybiB0aGUgY3ljbGUgYml0IG9mIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5CisgKi8KKyNkZWZpbmUgQ09NUExFVElPTl9RVUVVRV9DWUNMRV9CSVQoeCkgKCh4KSAmIDB4ODAwMDAwMDApCisKKy8qIEluaXQgdGhlIHN0YXRlIG1hY2hpbmUgYW5kIGNhbGwgdGhlIHN0YXRlIGVudHJ5IGZ1bmN0aW9uIChpZiBhbnkpICovCit2b2lkIHNjaV9pbml0X3NtKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSwKKwkJIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSAqc3RhdGVfdGFibGUsIHUzMiBpbml0aWFsX3N0YXRlKQoreworCXNjaV9zdGF0ZV90cmFuc2l0aW9uX3QgaGFuZGxlcjsKKworCXNtLT5pbml0aWFsX3N0YXRlX2lkICAgID0gaW5pdGlhbF9zdGF0ZTsKKwlzbS0+cHJldmlvdXNfc3RhdGVfaWQgICA9IGluaXRpYWxfc3RhdGU7CisJc20tPmN1cnJlbnRfc3RhdGVfaWQgICAgPSBpbml0aWFsX3N0YXRlOworCXNtLT5zdGF0ZV90YWJsZSAgICAgICAgID0gc3RhdGVfdGFibGU7CisKKwloYW5kbGVyID0gc20tPnN0YXRlX3RhYmxlW2luaXRpYWxfc3RhdGVdLmVudGVyX3N0YXRlOworCWlmIChoYW5kbGVyKQorCQloYW5kbGVyKHNtKTsKK30KKworLyogQ2FsbCB0aGUgc3RhdGUgZXhpdCBmbiwgdXBkYXRlIHRoZSBjdXJyZW50IHN0YXRlLCBjYWxsIHRoZSBzdGF0ZSBlbnRyeSBmbiAqLwordm9pZCBzY2lfY2hhbmdlX3N0YXRlKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSwgdTMyIG5leHRfc3RhdGUpCit7CisJc2NpX3N0YXRlX3RyYW5zaXRpb25fdCBoYW5kbGVyOworCisJaGFuZGxlciA9IHNtLT5zdGF0ZV90YWJsZVtzbS0+Y3VycmVudF9zdGF0ZV9pZF0uZXhpdF9zdGF0ZTsKKwlpZiAoaGFuZGxlcikKKwkJaGFuZGxlcihzbSk7CisKKwlzbS0+cHJldmlvdXNfc3RhdGVfaWQgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKwlzbS0+Y3VycmVudF9zdGF0ZV9pZCA9IG5leHRfc3RhdGU7CisKKwloYW5kbGVyID0gc20tPnN0YXRlX3RhYmxlW3NtLT5jdXJyZW50X3N0YXRlX2lkXS5lbnRlcl9zdGF0ZTsKKwlpZiAoaGFuZGxlcikKKwkJaGFuZGxlcihzbSk7Cit9CisKK3N0YXRpYyBib29sIHNjaV9jb250cm9sbGVyX2NvbXBsZXRpb25fcXVldWVfaGFzX2VudHJpZXMoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIGdldF92YWx1ZSA9IGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldDsKKwl1MzIgZ2V0X2luZGV4ID0gZ2V0X3ZhbHVlICYgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX1BPSU5URVJfTUFTSzsKKworCWlmIChOT1JNQUxJWkVfR0VUX1BPSU5URVJfQ1lDTEVfQklUKGdldF92YWx1ZSkgPT0KKwkgICAgQ09NUExFVElPTl9RVUVVRV9DWUNMRV9CSVQoaWhvc3QtPmNvbXBsZXRpb25fcXVldWVbZ2V0X2luZGV4XSkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBzY2lfY29udHJvbGxlcl9pc3Ioc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJaWYgKHNjaV9jb250cm9sbGVyX2NvbXBsZXRpb25fcXVldWVfaGFzX2VudHJpZXMoaWhvc3QpKSB7CisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHdlIGhhdmUgYSBzcHVyaW91cyBpbnRlcnJ1cHQgaXQgY291bGQgYmUgdGhhdCB3ZSBoYXZlIGFscmVhZHkKKwkJICogZW1wdGllZCB0aGUgY29tcGxldGlvbiBxdWV1ZSBmcm9tIGEgcHJldmlvdXMgaW50ZXJydXB0ICovCisJCXdyaXRlbChTTVVfSVNSX0NPTVBMRVRJT04sICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X3N0YXR1cyk7CisKKwkJLyoKKwkJICogVGhlcmUgaXMgYSByYWNlIGluIHRoZSBoYXJkd2FyZSB0aGF0IGNvdWxkIGNhdXNlIHVzIG5vdCB0byBiZSBub3RpZmllZAorCQkgKiBvZiBhbiBpbnRlcnJ1cHQgY29tcGxldGlvbiBpZiB3ZSBkbyBub3QgdGFrZSB0aGlzIHN0ZXAuICBXZSB3aWxsIG1hc2sKKwkJICogdGhlbiB1bm1hc2sgdGhlIGludGVycnVwdHMgc28gaWYgdGhlcmUgaXMgYW5vdGhlciBpbnRlcnJ1cHQgcGVuZGluZworCQkgKiB0aGUgY2xlYXJpbmcgb2YgdGhlIGludGVycnVwdCBzb3VyY2Ugd2UgZ2V0IHRoZSBuZXh0IGludGVycnVwdCBtZXNzYWdlLiAqLworCQl3cml0ZWwoMHhGRjAwMDAwMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7CisJCXdyaXRlbCgwLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9tYXNrKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2lycXJldHVybl90IGlzY2lfbXNpeF9pc3IoaW50IHZlYywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGRhdGE7CisKKwlpZiAoc2NpX2NvbnRyb2xsZXJfaXNyKGlob3N0KSkKKwkJdGFza2xldF9zY2hlZHVsZSgmaWhvc3QtPmNvbXBsZXRpb25fdGFza2xldCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBib29sIHNjaV9jb250cm9sbGVyX2Vycm9yX2lzcihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgaW50ZXJydXB0X3N0YXR1czsKKworCWludGVycnVwdF9zdGF0dXMgPQorCQlyZWFkbCgmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9zdGF0dXMpOworCWludGVycnVwdF9zdGF0dXMgJj0gKFNNVV9JU1JfUVVFVUVfRVJST1IgfCBTTVVfSVNSX1FVRVVFX1NVU1BFTkQpOworCisJaWYgKGludGVycnVwdF9zdGF0dXMgIT0gMCkgeworCQkvKgorCQkgKiBUaGVyZSBpcyBhbiBlcnJvciBpbnRlcnJ1cHQgcGVuZGluZyBzbyBsZXQgaXQgdGhyb3VnaCBhbmQgaGFuZGxlCisJCSAqIGluIHRoZSBjYWxsYmFjayAqLworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIFRoZXJlIGlzIGEgcmFjZSBpbiB0aGUgaGFyZHdhcmUgdGhhdCBjb3VsZCBjYXVzZSB1cyBub3QgdG8gYmUgbm90aWZpZWQKKwkgKiBvZiBhbiBpbnRlcnJ1cHQgY29tcGxldGlvbiBpZiB3ZSBkbyBub3QgdGFrZSB0aGlzIHN0ZXAuICBXZSB3aWxsIG1hc2sKKwkgKiB0aGVuIHVubWFzayB0aGUgZXJyb3IgaW50ZXJydXB0cyBzbyBpZiB0aGVyZSB3YXMgYW5vdGhlciBpbnRlcnJ1cHQKKwkgKiBwZW5kaW5nIHdlIHdpbGwgYmUgbm90aWZpZWQuCisJICogQ291bGQgd2Ugd3JpdGUgdGhlIHZhbHVlIG9mIChTTVVfSVNSX1FVRVVFX0VSUk9SIHwgU01VX0lTUl9RVUVVRV9TVVNQRU5EKT8gKi8KKwl3cml0ZWwoMHhmZiwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7CisJd3JpdGVsKDAsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X21hc2spOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl90YXNrX2NvbXBsZXRpb24oc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUzMiBlbnQpCit7CisJdTMyIGluZGV4ID0gU0NVX0dFVF9DT01QTEVUSU9OX0lOREVYKGVudCk7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSA9IGlob3N0LT5yZXFzW2luZGV4XTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIHJlYWxseSB3YW50IHRvIHByb2Nlc3MgdGhpcyBJTyByZXF1ZXN0ICovCisJaWYgKHRlc3RfYml0KElSRVFfQUNUSVZFLCAmaXJlcS0+ZmxhZ3MpICYmCisJICAgIGlyZXEtPmlvX3RhZyAhPSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRyAmJgorCSAgICBJU0NJX1RBR19TRVEoaXJlcS0+aW9fdGFnKSA9PSBpaG9zdC0+aW9fcmVxdWVzdF9zZXF1ZW5jZVtpbmRleF0pCisJCS8qIFllcCB0aGlzIGlzIGEgdmFsaWQgaW8gcmVxdWVzdCBwYXNzIGl0IGFsb25nIHRvIHRoZQorCQkgKiBpbyByZXF1ZXN0IGhhbmRsZXIKKwkJICovCisJCXNjaV9pb19yZXF1ZXN0X3RjX2NvbXBsZXRpb24oaXJlcSwgZW50KTsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfc2RtYV9jb21wbGV0aW9uKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MzIgZW50KQoreworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisKKwlpbmRleCA9IFNDVV9HRVRfQ09NUExFVElPTl9JTkRFWChlbnQpOworCisJc3dpdGNoIChzY3VfZ2V0X2NvbW1hbmRfcmVxdWVzdF90eXBlKGVudCkpIHsKKwljYXNlIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfVEM6CisJY2FzZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9EVU1QX1RDOgorCQlpcmVxID0gaWhvc3QtPnJlcXNbaW5kZXhdOworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiAleCBmb3IgaW8gcmVxdWVzdCAlcFxuIiwKKwkJCSBfX2Z1bmNfXywgZW50LCBpcmVxKTsKKwkJLyogQHRvZG8gRm9yIGEgcG9zdCBUQyBvcGVyYXRpb24gd2UgbmVlZCB0byBmYWlsIHRoZSBJTworCQkgKiByZXF1ZXN0CisJCSAqLworCQlicmVhazsKKwljYXNlIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX0RVTVBfUk5DOgorCWNhc2UgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfT1RIRVJfUk5DOgorCWNhc2UgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9STkM6CisJCWlkZXYgPSBpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XTsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsICIlczogJXggZm9yIGRldmljZSAlcFxuIiwKKwkJCSBfX2Z1bmNfXywgZW50LCBpZGV2KTsKKwkJLyogQHRvZG8gRm9yIGEgcG9ydCBSTkMgb3BlcmF0aW9uIHdlIG5lZWQgdG8gZmFpbCB0aGUKKwkJICogZGV2aWNlCisJCSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiB1bmtub3duIGNvbXBsZXRpb24gdHlwZSAleFxuIiwKKwkJCSBfX2Z1bmNfXywgZW50KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl91bnNvbGljaXRlZF9mcmFtZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTMyIGVudCkKK3sKKwl1MzIgaW5kZXg7CisJdTMyIGZyYW1lX2luZGV4OworCisJc3RydWN0IHNjdV91bnNvbGljaXRlZF9mcmFtZV9oZWFkZXIgKmZyYW1lX2hlYWRlcjsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHk7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKworCWVudW0gc2NpX3N0YXR1cyByZXN1bHQgPSBTQ0lfRkFJTFVSRTsKKworCWZyYW1lX2luZGV4ID0gU0NVX0dFVF9GUkFNRV9JTkRFWChlbnQpOworCisJZnJhbWVfaGVhZGVyID0gaWhvc3QtPnVmX2NvbnRyb2wuYnVmZmVycy5hcnJheVtmcmFtZV9pbmRleF0uaGVhZGVyOworCWlob3N0LT51Zl9jb250cm9sLmJ1ZmZlcnMuYXJyYXlbZnJhbWVfaW5kZXhdLnN0YXRlID0gVU5TT0xJQ0lURURfRlJBTUVfSU5fVVNFOworCisJaWYgKFNDVV9HRVRfRlJBTUVfRVJST1IoZW50KSkgeworCQkvKgorCQkgKiAvIEB0b2RvIElmIHRoZSBJQUYgZnJhbWUgb3IgU0lHTkFUVVJFIEZJUyBmcmFtZSBoYXMgYW4gZXJyb3Igd2lsbAorCQkgKiAvICAgICAgIHRoaXMgY2F1c2UgYSBwcm9ibGVtPyBXZSBleHBlY3QgdGhlIHBoeSBpbml0aWFsaXphdGlvbiB3aWxsCisJCSAqIC8gICAgICAgZmFpbCBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgZnJhbWUuICovCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChmcmFtZV9oZWFkZXItPmlzX2FkZHJlc3NfZnJhbWUpIHsKKwkJaW5kZXggPSBTQ1VfR0VUX1BST1RPQ09MX0VOR0lORV9JTkRFWChlbnQpOworCQlpcGh5ID0gJmlob3N0LT5waHlzW2luZGV4XTsKKwkJcmVzdWx0ID0gc2NpX3BoeV9mcmFtZV9oYW5kbGVyKGlwaHksIGZyYW1lX2luZGV4KTsKKwl9IGVsc2UgeworCisJCWluZGV4ID0gU0NVX0dFVF9DT01QTEVUSU9OX0lOREVYKGVudCk7CisKKwkJaWYgKGluZGV4ID09IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWCkgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgYSBzaWduYXR1cmUgZmlzIG9yIGEgZnJhbWUgZnJvbSBhIGRpcmVjdCBhdHRhY2hlZCBTQVRBCisJCQkgKiBkZXZpY2UgdGhhdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQuICBJbiBlaXRoZXIgY2FzZSBmb3J3YXJlZAorCQkJICogdGhlIGZyYW1lIHRvIHRoZSBQRSBhbmQgbGV0IGl0IHRha2UgY2FyZSBvZiB0aGUgZnJhbWUgZGF0YS4gKi8KKwkJCWluZGV4ID0gU0NVX0dFVF9QUk9UT0NPTF9FTkdJTkVfSU5ERVgoZW50KTsKKwkJCWlwaHkgPSAmaWhvc3QtPnBoeXNbaW5kZXhdOworCQkJcmVzdWx0ID0gc2NpX3BoeV9mcmFtZV9oYW5kbGVyKGlwaHksIGZyYW1lX2luZGV4KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbmRleCA8IGlob3N0LT5yZW1vdGVfbm9kZV9lbnRyaWVzKQorCQkJCWlkZXYgPSBpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XTsKKwkJCWVsc2UKKwkJCQlpZGV2ID0gTlVMTDsKKworCQkJaWYgKGlkZXYgIT0gTlVMTCkKKwkJCQlyZXN1bHQgPSBzY2lfcmVtb3RlX2RldmljZV9mcmFtZV9oYW5kbGVyKGlkZXYsIGZyYW1lX2luZGV4KTsKKwkJCWVsc2UKKwkJCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisJCX0KKwl9CisKKwlpZiAocmVzdWx0ICE9IFNDSV9TVUNDRVNTKSB7CisJCS8qCisJCSAqIC8gQHRvZG8gSXMgdGhlcmUgYW55IHJlYXNvbiB0byByZXBvcnQgc29tZSBhZGRpdGlvbmFsIGVycm9yIG1lc3NhZ2UKKwkJICogLyAgICAgICB3aGVuIHdlIGdldCB0aGlzIGZhaWx1cmUgbm90aWZpY3Rpb24/ICovCisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9ldmVudF9jb21wbGV0aW9uKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MzIgZW50KQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcTsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHk7CisJdTMyIGluZGV4OworCisJaW5kZXggPSBTQ1VfR0VUX0NPTVBMRVRJT05fSU5ERVgoZW50KTsKKworCXN3aXRjaCAoc2N1X2dldF9ldmVudF90eXBlKGVudCkpIHsKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1NNVV9DT01NQU5EX0VSUk9SOgorCQkvKiAvIEB0b2RvIFRoZSBkcml2ZXIgZGlkIHNvbWV0aGluZyB3cm9uZyBhbmQgd2UgbmVlZCB0byBmaXggdGhlIGNvbmR0aW9uLiAqLworCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBTQ0lDIENvbnRyb2xsZXIgMHglcCByZWNlaXZlZCBTTVUgY29tbWFuZCBlcnJvciAiCisJCQkiMHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaWhvc3QsCisJCQllbnQpOworCQlicmVhazsKKworCWNhc2UgU0NVX0VWRU5UX1RZUEVfU01VX1BDUV9FUlJPUjoKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1NNVV9FUlJPUjoKKwljYXNlIFNDVV9FVkVOVF9UWVBFX0ZBVEFMX01FTU9SWV9FUlJPUjoKKwkJLyoKKwkJICogLyBAdG9kbyBUaGlzIGlzIGEgaGFyZHdhcmUgZmFpbHVyZSBhbmQgaXRzIGxpa2VseSB0aGF0IHdlIHdhbnQgdG8KKwkJICogLyAgICAgICByZXNldCB0aGUgY29udHJvbGxlci4gKi8KKwkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogU0NJQyBDb250cm9sbGVyIDB4JXAgcmVjZWl2ZWQgZmF0YWwgY29udHJvbGxlciAiCisJCQkiZXZlbnQgIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWlob3N0LAorCQkJZW50KTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1RSQU5TUE9SVF9FUlJPUjoKKwkJaXJlcSA9IGlob3N0LT5yZXFzW2luZGV4XTsKKwkJc2NpX2lvX3JlcXVlc3RfZXZlbnRfaGFuZGxlcihpcmVxLCBlbnQpOworCQlicmVhazsKKworCWNhc2UgU0NVX0VWRU5UX1RZUEVfUFRYX1NDSEVEVUxFX0VWRU5UOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKGVudCkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfU1BFQ0lGSUNfU01QX1JFU1BPTlNFX05PX1BFOgorCQljYXNlIFNDVV9FVkVOVF9TUEVDSUZJQ19UQVNLX1RJTUVPVVQ6CisJCQlpcmVxID0gaWhvc3QtPnJlcXNbaW5kZXhdOworCQkJaWYgKGlyZXEgIT0gTlVMTCkKKwkJCQlzY2lfaW9fcmVxdWVzdF9ldmVudF9oYW5kbGVyKGlyZXEsIGVudCk7CisJCQllbHNlCisJCQkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSAiJXM6IFNDSUMgQ29udHJvbGxlciAweCVwIHJlY2VpdmVkICIKKwkJCQkJICJldmVudCAweCV4IGZvciBpbyByZXF1ZXN0IG9iamVjdCAiCisJCQkJCSAidGhhdCBkb2VzbnQgZXhpc3QuXG4iLAorCQkJCQkgX19mdW5jX18sCisJCQkJCSBpaG9zdCwKKwkJCQkJIGVudCk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0NVX0VWRU5UX1NQRUNJRklDX0lUX05FWFVTX1RJTUVPVVQ6CisJCQlpZGV2ID0gaWhvc3QtPmRldmljZV90YWJsZVtpbmRleF07CisJCQlpZiAoaWRldiAhPSBOVUxMKQorCQkJCXNjaV9yZW1vdGVfZGV2aWNlX2V2ZW50X2hhbmRsZXIoaWRldiwgZW50KTsKKwkJCWVsc2UKKwkJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJICIlczogU0NJQyBDb250cm9sbGVyIDB4JXAgcmVjZWl2ZWQgIgorCQkJCQkgImV2ZW50IDB4JXggZm9yIHJlbW90ZSBkZXZpY2Ugb2JqZWN0ICIKKwkJCQkJICJ0aGF0IGRvZXNudCBleGlzdC5cbiIsCisJCQkJCSBfX2Z1bmNfXywKKwkJCQkJIGlob3N0LAorCQkJCQkgZW50KTsKKworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0U6CisJLyoKKwkgKiBkaXJlY3QgdGhlIGJyb2FkY2FzdCBjaGFuZ2UgZXZlbnQgdG8gdGhlIHBoeSBmaXJzdCBhbmQgdGhlbiBsZXQKKwkgKiB0aGUgcGh5IHJlZGlyZWN0IHRoZSBicm9hZGNhc3QgY2hhbmdlIHRvIHRoZSBwb3J0IG9iamVjdCAqLworCWNhc2UgU0NVX0VWRU5UX1RZUEVfRVJSX0NOVF9FVkVOVDoKKwkvKgorCSAqIGRpcmVjdCBlcnJvciBjb3VudGVyIGV2ZW50IHRvIHRoZSBwaHkgb2JqZWN0IHNpbmNlIHRoYXQgaXMgd2hlcmUKKwkgKiB3ZSBnZXQgdGhlIGV2ZW50IG5vdGlmaWNhdGlvbi4gIFRoaXMgaXMgYSB0eXBlIDQgZXZlbnQuICovCisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5UOgorCQlpbmRleCA9IFNDVV9HRVRfUFJPVE9DT0xfRU5HSU5FX0lOREVYKGVudCk7CisJCWlwaHkgPSAmaWhvc3QtPnBoeXNbaW5kZXhdOworCQlzY2lfcGh5X2V2ZW50X2hhbmRsZXIoaXBoeSwgZW50KTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYOgorCWNhc2UgU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFhfUlg6CisJY2FzZSBTQ1VfRVZFTlRfVFlQRV9STkNfT1BTX01JU0M6CisJCWlmIChpbmRleCA8IGlob3N0LT5yZW1vdGVfbm9kZV9lbnRyaWVzKSB7CisJCQlpZGV2ID0gaWhvc3QtPmRldmljZV90YWJsZVtpbmRleF07CisKKwkJCWlmIChpZGV2ICE9IE5VTEwpCisJCQkJc2NpX3JlbW90ZV9kZXZpY2VfZXZlbnRfaGFuZGxlcihpZGV2LCBlbnQpOworCQl9IGVsc2UKKwkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lDIENvbnRyb2xsZXIgMHglcCByZWNlaXZlZCBldmVudCAweCV4ICIKKwkJCQkiZm9yIHJlbW90ZSBkZXZpY2Ugb2JqZWN0IDB4JTB4IHRoYXQgZG9lc250ICIKKwkJCQkiZXhpc3QuXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWlob3N0LAorCQkJCWVudCwKKwkJCQlpbmRleCk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IFNDSUMgQ29udHJvbGxlciByZWNlaXZlZCB1bmtub3duIGV2ZW50IGNvZGUgJXhcbiIsCisJCQkgX19mdW5jX18sCisJCQkgZW50KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9wcm9jZXNzX2NvbXBsZXRpb25zKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXUzMiBjb21wbGV0aW9uX2NvdW50ID0gMDsKKwl1MzIgZW50OworCXUzMiBnZXRfaW5kZXg7CisJdTMyIGdldF9jeWNsZTsKKwl1MzIgZXZlbnRfZ2V0OworCXUzMiBldmVudF9jeWNsZTsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogY29tcGxldGlvbiBxdWV1ZSBiZWdpbmluZyBnZXQ6MHglMDh4XG4iLAorCQlfX2Z1bmNfXywKKwkJaWhvc3QtPmNvbXBsZXRpb25fcXVldWVfZ2V0KTsKKworCS8qIEdldCB0aGUgY29tcG9uZW50IHBhcnRzIG9mIHRoZSBjb21wbGV0aW9uIHF1ZXVlICovCisJZ2V0X2luZGV4ID0gTk9STUFMSVpFX0dFVF9QT0lOVEVSKGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldCk7CisJZ2V0X2N5Y2xlID0gU01VX0NRR1JfQ1lDTEVfQklUICYgaWhvc3QtPmNvbXBsZXRpb25fcXVldWVfZ2V0OworCisJZXZlbnRfZ2V0ID0gTk9STUFMSVpFX0VWRU5UX1BPSU5URVIoaWhvc3QtPmNvbXBsZXRpb25fcXVldWVfZ2V0KTsKKwlldmVudF9jeWNsZSA9IFNNVV9DUUdSX0VWRU5UX0NZQ0xFX0JJVCAmIGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldDsKKworCXdoaWxlICgKKwkJTk9STUFMSVpFX0dFVF9QT0lOVEVSX0NZQ0xFX0JJVChnZXRfY3ljbGUpCisJCT09IENPTVBMRVRJT05fUVVFVUVfQ1lDTEVfQklUKGlob3N0LT5jb21wbGV0aW9uX3F1ZXVlW2dldF9pbmRleF0pCisJCSkgeworCQljb21wbGV0aW9uX2NvdW50Kys7CisKKwkJZW50ID0gaWhvc3QtPmNvbXBsZXRpb25fcXVldWVbZ2V0X2luZGV4XTsKKworCQkvKiBpbmNyZW1lbnQgdGhlIGdldCBwb2ludGVyIGFuZCBjaGVjayBmb3Igcm9sbG92ZXIgdG8gdG9nZ2xlIHRoZSBjeWNsZSBiaXQgKi8KKwkJZ2V0X2N5Y2xlIF49ICgoZ2V0X2luZGV4KzEpICYgU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX0VOVFJJRVMpIDw8CisJCQkgICAgIChTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfQ1lDTEVfQklUX1NISUZUIC0gU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX1NISUZUKTsKKwkJZ2V0X2luZGV4ID0gKGdldF9pbmRleCsxKSAmIChTQ1VfTUFYX0NPTVBMRVRJT05fUVVFVUVfRU5UUklFUy0xKTsKKworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5OjB4JTA4eFxuIiwKKwkJCV9fZnVuY19fLAorCQkJZW50KTsKKworCQlzd2l0Y2ggKFNDVV9HRVRfQ09NUExFVElPTl9UWVBFKGVudCkpIHsKKwkJY2FzZSBTQ1VfQ09NUExFVElPTl9UWVBFX1RBU0s6CisJCQlzY2lfY29udHJvbGxlcl90YXNrX2NvbXBsZXRpb24oaWhvc3QsIGVudCk7CisJCQlicmVhazsKKworCQljYXNlIFNDVV9DT01QTEVUSU9OX1RZUEVfU0RNQToKKwkJCXNjaV9jb250cm9sbGVyX3NkbWFfY29tcGxldGlvbihpaG9zdCwgZW50KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NVX0NPTVBMRVRJT05fVFlQRV9VRkk6CisJCQlzY2lfY29udHJvbGxlcl91bnNvbGljaXRlZF9mcmFtZShpaG9zdCwgZW50KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NVX0NPTVBMRVRJT05fVFlQRV9FVkVOVDoKKwkJY2FzZSBTQ1VfQ09NUExFVElPTl9UWVBFX05PVElGWTogeworCQkJZXZlbnRfY3ljbGUgXj0gKChldmVudF9nZXQrMSkgJiBTQ1VfTUFYX0VWRU5UUykgPDwKKwkJCQkgICAgICAgKFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9FVkVOVF9DWUNMRV9CSVRfU0hJRlQgLSBTQ1VfTUFYX0VWRU5UU19TSElGVCk7CisJCQlldmVudF9nZXQgPSAoZXZlbnRfZ2V0KzEpICYgKFNDVV9NQVhfRVZFTlRTLTEpOworCisJCQlzY2lfY29udHJvbGxlcl9ldmVudF9jb21wbGV0aW9uKGlob3N0LCBlbnQpOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSAiJXM6IFNDSUMgQ29udHJvbGxlciByZWNlaXZlZCB1bmtub3duICIKKwkJCQkgImNvbXBsZXRpb24gdHlwZSAleFxuIiwKKwkJCQkgX19mdW5jX18sCisJCQkJIGVudCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFVwZGF0ZSB0aGUgZ2V0IHJlZ2lzdGVyIGlmIHdlIGNvbXBsZXRlZCBvbmUgb3IgbW9yZSBlbnRyaWVzICovCisJaWYgKGNvbXBsZXRpb25fY291bnQgPiAwKSB7CisJCWlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldCA9CisJCQlTTVVfQ1FHUl9HRU5fQklUKEVOQUJMRSkgfAorCQkJU01VX0NRR1JfR0VOX0JJVChFVkVOVF9FTkFCTEUpIHwKKwkJCWV2ZW50X2N5Y2xlIHwKKwkJCVNNVV9DUUdSX0dFTl9WQUwoRVZFTlRfUE9JTlRFUiwgZXZlbnRfZ2V0KSB8CisJCQlnZXRfY3ljbGUgfAorCQkJU01VX0NRR1JfR0VOX1ZBTChQT0lOVEVSLCBnZXRfaW5kZXgpOworCisJCXdyaXRlbChpaG9zdC0+Y29tcGxldGlvbl9xdWV1ZV9nZXQsCisJCSAgICAgICAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmNvbXBsZXRpb25fcXVldWVfZ2V0KTsKKworCX0KKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogY29tcGxldGlvbiBxdWV1ZSBlbmRpbmcgZ2V0OjB4JTA4eFxuIiwKKwkJX19mdW5jX18sCisJCWlob3N0LT5jb21wbGV0aW9uX3F1ZXVlX2dldCk7CisKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgaW50ZXJydXB0X3N0YXR1czsKKworCWludGVycnVwdF9zdGF0dXMgPQorCQlyZWFkbCgmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9zdGF0dXMpOworCisJaWYgKChpbnRlcnJ1cHRfc3RhdHVzICYgU01VX0lTUl9RVUVVRV9TVVNQRU5EKSAmJgorCSAgICBzY2lfY29udHJvbGxlcl9jb21wbGV0aW9uX3F1ZXVlX2hhc19lbnRyaWVzKGlob3N0KSkgeworCisJCXNjaV9jb250cm9sbGVyX3Byb2Nlc3NfY29tcGxldGlvbnMoaWhvc3QpOworCQl3cml0ZWwoU01VX0lTUl9RVUVVRV9TVVNQRU5ELCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9zdGF0dXMpOworCX0gZWxzZSB7CisJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsICIlczogc3RhdHVzOiAlI3hcbiIsIF9fZnVuY19fLAorCQkJaW50ZXJydXB0X3N0YXR1cyk7CisKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaWhvc3QtPnNtLCBTQ0lDX0ZBSUxFRCk7CisKKwkJcmV0dXJuOworCX0KKworCS8qIElmIHdlIGRvbnQgcHJvY2VzcyBhbnkgY29tcGxldGlvbnMgSSBhbSBub3Qgc3VyZSB0aGF0IHdlIHdhbnQgdG8gZG8gdGhpcy4KKwkgKiBXZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGhhcmR3YXJlIGZhdWx0IGFuZCBzaG91bGQgcHJvYmFibHkgYmUgcmVzZXQuCisJICovCisJd3JpdGVsKDAsICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X21hc2spOworfQorCitpcnFyZXR1cm5fdCBpc2NpX2ludHhfaXNyKGludCB2ZWMsIHZvaWQgKmRhdGEpCit7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBkYXRhOworCisJaWYgKHNjaV9jb250cm9sbGVyX2lzcihpaG9zdCkpIHsKKwkJd3JpdGVsKFNNVV9JU1JfQ09NUExFVElPTiwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfc3RhdHVzKTsKKwkJdGFza2xldF9zY2hlZHVsZSgmaWhvc3QtPmNvbXBsZXRpb25fdGFza2xldCk7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0gZWxzZSBpZiAoc2NpX2NvbnRyb2xsZXJfZXJyb3JfaXNyKGlob3N0KSkgeworCQlzcGluX2xvY2soJmlob3N0LT5zY2ljX2xvY2spOworCQlzY2lfY29udHJvbGxlcl9lcnJvcl9oYW5kbGVyKGlob3N0KTsKKwkJc3Bpbl91bmxvY2soJmlob3N0LT5zY2ljX2xvY2spOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpcnFyZXR1cm5fdCBpc2NpX2Vycm9yX2lzcihpbnQgdmVjLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gZGF0YTsKKworCWlmIChzY2lfY29udHJvbGxlcl9lcnJvcl9pc3IoaWhvc3QpKQorCQlzY2lfY29udHJvbGxlcl9lcnJvcl9oYW5kbGVyKGlob3N0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBpc2NpX2hvc3Rfc3RhcnRfY29tcGxldGUoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBjb3JlIGxpYnJhcnksCisgKiAgICB0aHJvdWdoIHRoZSBJU0NJIE1vZHVsZSwgdG8gaW5kaWNhdGUgY29udHJvbGxlciBzdGFydCBzdGF0dXMuCisgKiBAaXNjaV9ob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIElTQ0kgaG9zdCBvYmplY3QKKyAqIEBjb21wbGV0aW9uX3N0YXR1czogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBjb21wbGV0aW9uIHN0YXR1cyBmcm9tIHRoZQorICogICAgY29yZSBsaWJyYXJ5LgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9ob3N0X3N0YXJ0X2NvbXBsZXRlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBlbnVtIHNjaV9zdGF0dXMgY29tcGxldGlvbl9zdGF0dXMpCit7CisJaWYgKGNvbXBsZXRpb25fc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlkZXZfaW5mbygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSJjb250cm9sbGVyIHN0YXJ0IHRpbWVkIG91dCwgY29udGludWluZy4uLlxuIik7CisJaXNjaV9ob3N0X2NoYW5nZV9zdGF0ZShpaG9zdCwgaXNjaV9yZWFkeSk7CisJY2xlYXJfYml0KElIT1NUX1NUQVJUX1BFTkRJTkcsICZpaG9zdC0+ZmxhZ3MpOworCXdha2VfdXAoJmlob3N0LT5ldmVudHEpOworfQorCitpbnQgaXNjaV9ob3N0X3NjYW5fZmluaXNoZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVuc2lnbmVkIGxvbmcgdGltZSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCktPmxsZGRfaGE7CisKKwlpZiAodGVzdF9iaXQoSUhPU1RfU1RBUlRfUEVORElORywgJmlob3N0LT5mbGFncykpCisJCXJldHVybiAwOworCisJLyogdG9kbzogdXNlIHNhc19mbHVzaF9kaXNjb3Zlcnkgb25jZSBpdCBpcyB1cHN0cmVhbSAqLworCXNjc2lfZmx1c2hfd29yayhzaG9zdCk7CisKKwlzY3NpX2ZsdXNoX3dvcmsoc2hvc3QpOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpaG9zdC0+c3RhdHVzID0gJWQsIHRpbWUgPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgaXNjaV9ob3N0X2dldF9zdGF0ZShpaG9zdCksIHRpbWUpOworCisJcmV0dXJuIDE7CisKK30KKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9nZXRfc3VnZ2VzdGVkX3N0YXJ0X3RpbWVvdXQoKSAtIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlCisgKiAgICBzdWdnZXN0ZWQgc2NpX2NvbnRyb2xsZXJfc3RhcnQoKSB0aW1lb3V0IGFtb3VudC4gIFRoZSB1c2VyIGlzIGZyZWUgdG8KKyAqICAgIHVzZSBhbnkgdGltZW91dCB2YWx1ZSwgYnV0IHRoaXMgbWV0aG9kIHByb3ZpZGVzIHRoZSBzdWdnZXN0ZWQgbWluaW11bQorICogICAgc3RhcnQgdGltZW91dCB2YWx1ZS4gIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBiYXNlZCB1cG9uIGVtcGlyaWNhbAorICogICAgaW5mb3JtYXRpb24gZGV0ZXJtaW5lZCBhcyBhIHJlc3VsdCBvZiBpbnRlcm9wZXJhYmlsaXR5IHRlc3RpbmcuCisgKiBAY29udHJvbGxlcjogdGhlIGhhbmRsZSB0byB0aGUgY29udHJvbGxlciBvYmplY3QgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUKKyAqICAgIHN1Z2dlc3RlZCBzdGFydCB0aW1lb3V0LgorICoKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZm9yIHRoZSBzdWdnZXN0ZWQgc3RhcnQKKyAqIG9wZXJhdGlvbiB0aW1lb3V0LgorICovCitzdGF0aWMgdTMyIHNjaV9jb250cm9sbGVyX2dldF9zdWdnZXN0ZWRfc3RhcnRfdGltZW91dChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwkvKiBWYWxpZGF0ZSB0aGUgdXNlciBzdXBwbGllZCBwYXJhbWV0ZXJzLiAqLworCWlmICghaWhvc3QpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBUaGUgc3VnZ2VzdGVkIG1pbmltdW0gdGltZW91dCB2YWx1ZSBmb3IgYSBjb250cm9sbGVyIHN0YXJ0IG9wZXJhdGlvbjoKKwkgKgorCSAqICAgICBTaWduYXR1cmUgRklTIFRpbWVvdXQKKwkgKiAgICsgUGh5IFN0YXJ0IFRpbWVvdXQKKwkgKiAgICsgTnVtYmVyIG9mIFBoeSBTcGluIFVwIEludGVydmFscworCSAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogICBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZvciB0aGUgY29udHJvbGxlciBzdGFydCBvcGVyYXRpb24uCisJICoKKwkgKiBOT1RFOiBUaGUgbnVtYmVyIG9mIHBoeSBzcGluIHVwIGludGVydmFscyB3aWxsIGJlIGVxdWl2YWxlbnQKKwkgKiAgICAgICB0byB0aGUgbnVtYmVyIG9mIHBoeXMgZGl2aWRlZCBieSB0aGUgbnVtYmVyIHBoeXMgYWxsb3dlZAorCSAqICAgICAgIHBlciBpbnRlcnZhbCAtIDEgKG9uY2UgT0VNIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZCkuCisJICogICAgICAgQ3VycmVudGx5IHdlIGFzc3VtZSBvbmx5IDEgcGh5IHBlciBpbnRlcnZhbC4gKi8KKworCXJldHVybiBTQ0lDX1NEU19TSUdOQVRVUkVfRklTX1RJTUVPVVQKKwkJKyBTQ0lDX1NEU19DT05UUk9MTEVSX1BIWV9TVEFSVF9USU1FT1VUCisJCSsgKChTQ0lfTUFYX1BIWVMgLSAxKSAqIFNDSUNfU0RTX0NPTlRST0xMRVJfUE9XRVJfQ09OVFJPTF9JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCUJVR19PTihpaG9zdC0+c211X3JlZ2lzdGVycyA9PSBOVUxMKTsKKwl3cml0ZWwoMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCUJVR19PTihpaG9zdC0+c211X3JlZ2lzdGVycyA9PSBOVUxMKTsKKwl3cml0ZWwoMHhmZmZmZmZmZiwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2VuYWJsZV9wb3J0X3Rhc2tfc2NoZWR1bGVyKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXUzMiBwb3J0X3Rhc2tfc2NoZWR1bGVyX3ZhbHVlOworCisJcG9ydF90YXNrX3NjaGVkdWxlcl92YWx1ZSA9CisJCXJlYWRsKCZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+cGVnMC5wdHNnLmNvbnRyb2wpOworCXBvcnRfdGFza19zY2hlZHVsZXJfdmFsdWUgfD0KKwkJKFNDVV9QVFNHQ1JfR0VOX0JJVChFVE1fRU5BQkxFKSB8CisJCSBTQ1VfUFRTR0NSX0dFTl9CSVQoUFRTR19FTkFCTEUpKTsKKwl3cml0ZWwocG9ydF90YXNrX3NjaGVkdWxlcl92YWx1ZSwKKwkgICAgICAgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnB0c2cuY29udHJvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2Fzc2lnbl90YXNrX2VudHJpZXMoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIHRhc2tfYXNzaWdubWVudDsKKworCS8qCisJICogQXNzaWduIGFsbCB0aGUgVENzIHRvIGZ1bmN0aW9uIDAKKwkgKiBUT0RPOiBEbyB3ZSBhY3R1YWxseSBuZWVkIHRvIHJlYWQgdGhpcyByZWdpc3RlciB0byB3cml0ZSBpdCBiYWNrPworCSAqLworCisJdGFza19hc3NpZ25tZW50ID0KKwkJcmVhZGwoJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT50YXNrX2NvbnRleHRfYXNzaWdubWVudFswXSk7CisKKwl0YXNrX2Fzc2lnbm1lbnQgfD0gKFNNVV9UQ0FfR0VOX1ZBTChTVEFSVElORywgMCkpIHwKKwkJKFNNVV9UQ0FfR0VOX1ZBTChFTkRJTkcsICBpaG9zdC0+dGFza19jb250ZXh0X2VudHJpZXMgLSAxKSkgfAorCQkoU01VX1RDQV9HRU5fQklUKFJBTkdFX0NIRUNLX0VOQUJMRSkpOworCisJd3JpdGVsKHRhc2tfYXNzaWdubWVudCwKKwkJJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT50YXNrX2NvbnRleHRfYXNzaWdubWVudFswXSk7CisKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfaW5pdGlhbGl6ZV9jb21wbGV0aW9uX3F1ZXVlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXUzMiBpbmRleDsKKwl1MzIgY29tcGxldGlvbl9xdWV1ZV9jb250cm9sX3ZhbHVlOworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX2dldF92YWx1ZTsKKwl1MzIgY29tcGxldGlvbl9xdWV1ZV9wdXRfdmFsdWU7CisKKwlpaG9zdC0+Y29tcGxldGlvbl9xdWV1ZV9nZXQgPSAwOworCisJY29tcGxldGlvbl9xdWV1ZV9jb250cm9sX3ZhbHVlID0KKwkJKFNNVV9DUUNfUVVFVUVfTElNSVRfU0VUKFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9FTlRSSUVTIC0gMSkgfAorCQkgU01VX0NRQ19FVkVOVF9MSU1JVF9TRVQoU0NVX01BWF9FVkVOVFMgLSAxKSk7CisKKwl3cml0ZWwoY29tcGxldGlvbl9xdWV1ZV9jb250cm9sX3ZhbHVlLAorCSAgICAgICAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmNvbXBsZXRpb25fcXVldWVfY29udHJvbCk7CisKKworCS8qIFNldCB0aGUgY29tcGxldGlvbiBxdWV1ZSBnZXQgcG9pbnRlciBhbmQgZW5hYmxlIHRoZSBxdWV1ZSAqLworCWNvbXBsZXRpb25fcXVldWVfZ2V0X3ZhbHVlID0gKAorCQkoU01VX0NRR1JfR0VOX1ZBTChQT0lOVEVSLCAwKSkKKwkJfCAoU01VX0NRR1JfR0VOX1ZBTChFVkVOVF9QT0lOVEVSLCAwKSkKKwkJfCAoU01VX0NRR1JfR0VOX0JJVChFTkFCTEUpKQorCQl8IChTTVVfQ1FHUl9HRU5fQklUKEVWRU5UX0VOQUJMRSkpCisJCSk7CisKKwl3cml0ZWwoY29tcGxldGlvbl9xdWV1ZV9nZXRfdmFsdWUsCisJICAgICAgICZpaG9zdC0+c211X3JlZ2lzdGVycy0+Y29tcGxldGlvbl9xdWV1ZV9nZXQpOworCisJLyogU2V0IHRoZSBjb21wbGV0aW9uIHF1ZXVlIHB1dCBwb2ludGVyICovCisJY29tcGxldGlvbl9xdWV1ZV9wdXRfdmFsdWUgPSAoCisJCShTTVVfQ1FQUl9HRU5fVkFMKFBPSU5URVIsIDApKQorCQl8IChTTVVfQ1FQUl9HRU5fVkFMKEVWRU5UX1BPSU5URVIsIDApKQorCQkpOworCisJd3JpdGVsKGNvbXBsZXRpb25fcXVldWVfcHV0X3ZhbHVlLAorCSAgICAgICAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmNvbXBsZXRpb25fcXVldWVfcHV0KTsKKworCS8qIEluaXRpYWxpemUgdGhlIGN5Y2xlIGJpdCBvZiB0aGUgY29tcGxldGlvbiBxdWV1ZSBlbnRyaWVzICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX0VOVFJJRVM7IGluZGV4KyspIHsKKwkJLyoKKwkJICogSWYgZ2V0LmN5Y2xlX2JpdCAhPSBjb21wbGV0aW9uX3F1ZXVlLmN5Y2xlX2JpdAorCQkgKiBpdHMgbm90IGEgdmFsaWQgY29tcGxldGlvbiBxdWV1ZSBlbnRyeQorCQkgKiBzbyBhdCBzeXN0ZW0gc3RhcnQgYWxsIGVudHJpZXMgYXJlIGludmFsaWQgKi8KKwkJaWhvc3QtPmNvbXBsZXRpb25fcXVldWVbaW5kZXhdID0gMHg4MDAwMDAwMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2luaXRpYWxpemVfdW5zb2xpY2l0ZWRfZnJhbWVfcXVldWUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIGZyYW1lX3F1ZXVlX2NvbnRyb2xfdmFsdWU7CisJdTMyIGZyYW1lX3F1ZXVlX2dldF92YWx1ZTsKKwl1MzIgZnJhbWVfcXVldWVfcHV0X3ZhbHVlOworCisJLyogV3JpdGUgdGhlIHF1ZXVlIHNpemUgKi8KKwlmcmFtZV9xdWV1ZV9jb250cm9sX3ZhbHVlID0KKwkJU0NVX1VGUUNfR0VOX1ZBTChRVUVVRV9TSVpFLCBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyk7CisKKwl3cml0ZWwoZnJhbWVfcXVldWVfY29udHJvbF92YWx1ZSwKKwkgICAgICAgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVuc29saWNpdGVkX2ZyYW1lX3F1ZXVlX2NvbnRyb2wpOworCisJLyogU2V0dXAgdGhlIGdldCBwb2ludGVyIGZvciB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgcXVldWUgKi8KKwlmcmFtZV9xdWV1ZV9nZXRfdmFsdWUgPSAoCisJCVNDVV9VRlFHUF9HRU5fVkFMKFBPSU5URVIsIDApCisJCXwgIFNDVV9VRlFHUF9HRU5fQklUKEVOQUJMRV9CSVQpCisJCSk7CisKKwl3cml0ZWwoZnJhbWVfcXVldWVfZ2V0X3ZhbHVlLAorCSAgICAgICAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnNkbWEudW5zb2xpY2l0ZWRfZnJhbWVfZ2V0X3BvaW50ZXIpOworCS8qIFNldHVwIHRoZSBwdXQgcG9pbnRlciBmb3IgdGhlIHVuc29saWNpdGVkIGZyYW1lIHF1ZXVlICovCisJZnJhbWVfcXVldWVfcHV0X3ZhbHVlID0gU0NVX1VGUVBQX0dFTl9WQUwoUE9JTlRFUiwgMCk7CisJd3JpdGVsKGZyYW1lX3F1ZXVlX3B1dF92YWx1ZSwKKwkgICAgICAgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVuc29saWNpdGVkX2ZyYW1lX3B1dF9wb2ludGVyKTsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfdHJhbnNpdGlvbl90b19yZWFkeShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgZW51bSBzY2lfc3RhdHVzIHN0YXR1cykKK3sKKwlpZiAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQgPT0gU0NJQ19TVEFSVElORykgeworCQkvKgorCQkgKiBXZSBtb3ZlIGludG8gdGhlIHJlYWR5IHN0YXRlLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHBoeXMvcG9ydHMKKwkJICogbWF5IGJlIHVwIGFuZCBvcGVyYXRpb25hbC4KKwkJICovCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlob3N0LT5zbSwgU0NJQ19SRUFEWSk7CisKKwkJaXNjaV9ob3N0X3N0YXJ0X2NvbXBsZXRlKGlob3N0LCBzdGF0dXMpOworCX0KK30KKworc3RhdGljIGJvb2wgaXNfcGh5X3N0YXJ0aW5nKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwllbnVtIHNjaV9waHlfc3RhdGVzIHN0YXRlOworCisJc3RhdGUgPSBpcGh5LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QSFlfU1RBUlRJTkc6CisJY2FzZSBTQ0lfUEhZX1NVQl9JTklUSUFMOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FTX1NQRUVEX0VOOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfSUFGX1VGOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FTX1BPV0VSOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9QT1dFUjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUEhZX0VOOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9TUEVFRF9FTjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NJR19GSVNfVUY6CisJY2FzZSBTQ0lfUEhZX1NVQl9GSU5BTDoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9zdGFydF9uZXh0X3BoeSAtIHN0YXJ0IHBoeQorICogQHNjaWM6IGNvbnRyb2xsZXIKKyAqCisgKiBJZiBhbGwgdGhlIHBoeXMgaGF2ZSBiZWVuIHN0YXJ0ZWQsIHRoZW4gYXR0ZW1wdCB0byB0cmFuc2l0aW9uIHRoZQorICogY29udHJvbGxlciB0byB0aGUgUkVBRFkgc3RhdGUgYW5kIGluZm9ybSB0aGUgdXNlcgorICogKHNjaV9jYl9jb250cm9sbGVyX3N0YXJ0X2NvbXBsZXRlKCkpLgorICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0YXJ0X25leHRfcGh5KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXN0cnVjdCBzY2lfb2VtX3BhcmFtcyAqb2VtID0gJmlob3N0LT5vZW1fcGFyYW1ldGVyczsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHk7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IFNDSV9TVUNDRVNTOworCisJaWYgKGlob3N0LT5waHlfc3RhcnR1cF90aW1lcl9wZW5kaW5nKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKGlob3N0LT5uZXh0X3BoeV90b19zdGFydCA+PSBTQ0lfTUFYX1BIWVMpIHsKKwkJYm9vbCBpc19jb250cm9sbGVyX3N0YXJ0X2NvbXBsZXRlID0gdHJ1ZTsKKwkJdTMyIHN0YXRlOworCQl1OCBpbmRleDsKKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspIHsKKwkJCWlwaHkgPSAmaWhvc3QtPnBoeXNbaW5kZXhdOworCQkJc3RhdGUgPSBpcGh5LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJCQlpZiAoIXBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSkpCisJCQkJY29udGludWU7CisKKwkJCS8qIFRoZSBjb250cm9sbGVyIHN0YXJ0IG9wZXJhdGlvbiBpcyBjb21wbGV0ZSBpZmY6CisJCQkgKiAtIGFsbCBsaW5rcyBoYXZlIGJlZW4gZ2l2ZW4gYW4gb3Bwb3J0dW5pdHkgdG8gc3RhcnQKKwkJCSAqIC0gaGF2ZSBubyBpbmRpY2F0aW9uIG9mIGEgY29ubmVjdGVkIGRldmljZQorCQkJICogLSBoYXZlIGFuIGluZGljYXRpb24gb2YgYSBjb25uZWN0ZWQgZGV2aWNlIGFuZCBpdCBoYXMKKwkJCSAqICAgZmluaXNoZWQgdGhlIGxpbmsgdHJhaW5pbmcgcHJvY2Vzcy4KKwkJCSAqLworCQkJaWYgKChpcGh5LT5pc19pbl9saW5rX3RyYWluaW5nID09IGZhbHNlICYmIHN0YXRlID09IFNDSV9QSFlfSU5JVElBTCkgfHwKKwkJCSAgICAoaXBoeS0+aXNfaW5fbGlua190cmFpbmluZyA9PSBmYWxzZSAmJiBzdGF0ZSA9PSBTQ0lfUEhZX1NUT1BQRUQpIHx8CisJCQkgICAgKGlwaHktPmlzX2luX2xpbmtfdHJhaW5pbmcgPT0gdHJ1ZSAmJiBpc19waHlfc3RhcnRpbmcoaXBoeSkpKSB7CisJCQkJaXNfY29udHJvbGxlcl9zdGFydF9jb21wbGV0ZSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogVGhlIGNvbnRyb2xsZXIgaGFzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCB0aGUgc3RhcnQgcHJvY2Vzcy4KKwkJICogSW5mb3JtIHRoZSBTQ0kgQ29yZSB1c2VyIGFuZCB0cmFuc2l0aW9uIHRvIHRoZSBSRUFEWSBzdGF0ZS4gKi8KKwkJaWYgKGlzX2NvbnRyb2xsZXJfc3RhcnRfY29tcGxldGUgPT0gdHJ1ZSkgeworCQkJc2NpX2NvbnRyb2xsZXJfdHJhbnNpdGlvbl90b19yZWFkeShpaG9zdCwgU0NJX1NVQ0NFU1MpOworCQkJc2NpX2RlbF90aW1lcigmaWhvc3QtPnBoeV90aW1lcik7CisJCQlpaG9zdC0+cGh5X3N0YXJ0dXBfdGltZXJfcGVuZGluZyA9IGZhbHNlOworCQl9CisJfSBlbHNlIHsKKwkJaXBoeSA9ICZpaG9zdC0+cGh5c1tpaG9zdC0+bmV4dF9waHlfdG9fc3RhcnRdOworCisJCWlmIChvZW0tPmNvbnRyb2xsZXIubW9kZV90eXBlID09IFNDSUNfUE9SVF9NQU5VQUxfQ09ORklHVVJBVElPTl9NT0RFKSB7CisJCQlpZiAocGh5X2dldF9ub25fZHVtbXlfcG9ydChpcGh5KSA9PSBOVUxMKSB7CisJCQkJaWhvc3QtPm5leHRfcGh5X3RvX3N0YXJ0Kys7CisKKwkJCQkvKiBDYXV0aW9uIHJlY3Vyc2lvbiBhaGVhZCBiZSBmb3J3YXJuZWQKKwkJCQkgKgorCQkJCSAqIFRoZSBQSFkgd2FzIG5ldmVyIGFkZGVkIHRvIGEgUE9SVCBpbiBNUEMgbW9kZQorCQkJCSAqIHNvIHN0YXJ0IHRoZSBuZXh0IHBoeSBpbiBzZXF1ZW5jZSBUaGlzIHBoeQorCQkJCSAqIHdpbGwgbmV2ZXIgZ28gbGluayB1cCBhbmQgd2lsbCBub3QgZHJhdyBwb3dlcgorCQkJCSAqIHRoZSBPRU0gcGFyYW1ldGVycyBlaXRoZXIgY29uZmlndXJlZCB0aGUgcGh5CisJCQkJICogaW5jb3JyZWN0bHkgZm9yIHRoZSBQT1JUIG9yIGl0IHdhcyBuZXZlcgorCQkJCSAqIGFzc2lnbmVkIHRvIGEgUE9SVAorCQkJCSAqLworCQkJCXJldHVybiBzY2lfY29udHJvbGxlcl9zdGFydF9uZXh0X3BoeShpaG9zdCk7CisJCQl9CisJCX0KKworCQlzdGF0dXMgPSBzY2lfcGh5X3N0YXJ0KGlwaHkpOworCisJCWlmIChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpIHsKKwkJCXNjaV9tb2RfdGltZXIoJmlob3N0LT5waHlfdGltZXIsCisJCQkJICAgICAgU0NJQ19TRFNfQ09OVFJPTExFUl9QSFlfU1RBUlRfVElNRU9VVCk7CisJCQlpaG9zdC0+cGh5X3N0YXJ0dXBfdGltZXJfcGVuZGluZyA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkgIiVzOiBDb250cm9sbGVyIHN0b3Agb3BlcmF0aW9uIGZhaWxlZCAiCisJCQkJICJ0byBzdG9wIHBoeSAlZCBiZWNhdXNlIG9mIHN0YXR1cyAiCisJCQkJICIlZC5cbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBpaG9zdC0+cGh5c1tpaG9zdC0+bmV4dF9waHlfdG9fc3RhcnRdLnBoeV9pbmRleCwKKwkJCQkgc3RhdHVzKTsKKwkJfQorCisJCWlob3N0LT5uZXh0X3BoeV90b19zdGFydCsrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHBoeV9zdGFydHVwX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzY2lfdGltZXIgKnRtciA9IChzdHJ1Y3Qgc2NpX3RpbWVyICopZGF0YTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGNvbnRhaW5lcl9vZih0bXIsIHR5cGVvZigqaWhvc3QpLCBwaHlfdGltZXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAodG1yLT5jYW5jZWwpCisJCWdvdG8gZG9uZTsKKworCWlob3N0LT5waHlfc3RhcnR1cF90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisKKwlkbyB7CisJCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX3N0YXJ0X25leHRfcGh5KGlob3N0KTsKKwl9IHdoaWxlIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpOworCitkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHUxNiBpc2NpX3RjaV9hY3RpdmUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJcmV0dXJuIENJUkNfQ05UKGlob3N0LT50Y2lfaGVhZCwgaWhvc3QtPnRjaV90YWlsLCBTQ0lfTUFYX0lPX1JFUVVFU1RTKTsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9zdGFydChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICB1MzIgdGltZW91dCkKK3sKKwllbnVtIHNjaV9zdGF0dXMgcmVzdWx0OworCXUxNiBpbmRleDsKKworCWlmIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCAhPSBTQ0lDX0lOSVRJQUxJWkVEKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICJTQ0lDIENvbnRyb2xsZXIgc3RhcnQgb3BlcmF0aW9uIHJlcXVlc3RlZCBpbiAiCisJCQkgImludmFsaWQgc3RhdGVcbiIpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwkvKiBCdWlsZCB0aGUgVENpIGZyZWUgcG9vbCAqLworCUJVSUxEX0JVR19PTihTQ0lfTUFYX0lPX1JFUVVFU1RTID4gMSA8PCBzaXplb2YoaWhvc3QtPnRjaV9wb29sWzBdKSAqIDgpOworCWlob3N0LT50Y2lfaGVhZCA9IDA7CisJaWhvc3QtPnRjaV90YWlsID0gMDsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBpaG9zdC0+dGFza19jb250ZXh0X2VudHJpZXM7IGluZGV4KyspCisJCWlzY2lfdGNpX2ZyZWUoaWhvc3QsIGluZGV4KTsKKworCS8qIEJ1aWxkIHRoZSBSTmkgZnJlZSBwb29sICovCisJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2luaXRpYWxpemUoJmlob3N0LT5hdmFpbGFibGVfcmVtb3RlX25vZGVzLAorCQkJCQkgaWhvc3QtPnJlbW90ZV9ub2RlX2VudHJpZXMpOworCisJLyoKKwkgKiBCZWZvcmUgYW55dGhpbmcgZWxzZSBsZXRzIG1ha2Ugc3VyZSB3ZSB3aWxsIG5vdCBiZQorCSAqIGludGVycnVwdGVkIGJ5IHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlzY2lfY29udHJvbGxlcl9kaXNhYmxlX2ludGVycnVwdHMoaWhvc3QpOworCisJLyogRW5hYmxlIHRoZSBwb3J0IHRhc2sgc2NoZWR1bGVyICovCisJc2NpX2NvbnRyb2xsZXJfZW5hYmxlX3BvcnRfdGFza19zY2hlZHVsZXIoaWhvc3QpOworCisJLyogQXNzaWduIGFsbCB0aGUgdGFzayBlbnRyaWVzIHRvIGlob3N0IHBoeXNpY2FsIGZ1bmN0aW9uICovCisJc2NpX2NvbnRyb2xsZXJfYXNzaWduX3Rhc2tfZW50cmllcyhpaG9zdCk7CisKKwkvKiBOb3cgaW5pdGlhbGl6ZSB0aGUgY29tcGxldGlvbiBxdWV1ZSAqLworCXNjaV9jb250cm9sbGVyX2luaXRpYWxpemVfY29tcGxldGlvbl9xdWV1ZShpaG9zdCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBxdWV1ZSBmb3IgdXNlICovCisJc2NpX2NvbnRyb2xsZXJfaW5pdGlhbGl6ZV91bnNvbGljaXRlZF9mcmFtZV9xdWV1ZShpaG9zdCk7CisKKwkvKiBTdGFydCBhbGwgb2YgdGhlIHBvcnRzIG9uIHRoaXMgY29udHJvbGxlciAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGlob3N0LT5sb2dpY2FsX3BvcnRfZW50cmllczsgaW5kZXgrKykgeworCQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9ICZpaG9zdC0+cG9ydHNbaW5kZXhdOworCisJCXJlc3VsdCA9IHNjaV9wb3J0X3N0YXJ0KGlwb3J0KTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCisJc2NpX2NvbnRyb2xsZXJfc3RhcnRfbmV4dF9waHkoaWhvc3QpOworCisJc2NpX21vZF90aW1lcigmaWhvc3QtPnRpbWVyLCB0aW1lb3V0KTsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlob3N0LT5zbSwgU0NJQ19TVEFSVElORyk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3ZvaWQgaXNjaV9ob3N0X3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpLT5sbGRkX2hhOworCXVuc2lnbmVkIGxvbmcgdG1vID0gc2NpX2NvbnRyb2xsZXJfZ2V0X3N1Z2dlc3RlZF9zdGFydF90aW1lb3V0KGlob3N0KTsKKworCXNldF9iaXQoSUhPU1RfU1RBUlRfUEVORElORywgJmlob3N0LT5mbGFncyk7CisKKwlzcGluX2xvY2tfaXJxKCZpaG9zdC0+c2NpY19sb2NrKTsKKwlzY2lfY29udHJvbGxlcl9zdGFydChpaG9zdCwgdG1vKTsKKwlzY2lfY29udHJvbGxlcl9lbmFibGVfaW50ZXJydXB0cyhpaG9zdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZpaG9zdC0+c2NpY19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgaXNjaV9ob3N0X3N0b3BfY29tcGxldGUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIGVudW0gc2NpX3N0YXR1cyBjb21wbGV0aW9uX3N0YXR1cykKK3sKKwlpc2NpX2hvc3RfY2hhbmdlX3N0YXRlKGlob3N0LCBpc2NpX3N0b3BwZWQpOworCXNjaV9jb250cm9sbGVyX2Rpc2FibGVfaW50ZXJydXB0cyhpaG9zdCk7CisJY2xlYXJfYml0KElIT1NUX1NUT1BfUEVORElORywgJmlob3N0LT5mbGFncyk7CisJd2FrZV91cCgmaWhvc3QtPmV2ZW50cSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2NvbXBsZXRpb25faGFuZGxlcihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwkvKiBFbXB0eSBvdXQgdGhlIGNvbXBsZXRpb24gcXVldWUgKi8KKwlpZiAoc2NpX2NvbnRyb2xsZXJfY29tcGxldGlvbl9xdWV1ZV9oYXNfZW50cmllcyhpaG9zdCkpCisJCXNjaV9jb250cm9sbGVyX3Byb2Nlc3NfY29tcGxldGlvbnMoaWhvc3QpOworCisJLyogQ2xlYXIgdGhlIGludGVycnVwdCBhbmQgZW5hYmxlIGFsbCBpbnRlcnJ1cHRzIGFnYWluICovCisJd3JpdGVsKFNNVV9JU1JfQ09NUExFVElPTiwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfc3RhdHVzKTsKKwkvKiBDb3VsZCB3ZSB3cml0ZSB0aGUgdmFsdWUgb2YgU01VX0lTUl9DT01QTEVUSU9OPyAqLworCXdyaXRlbCgweEZGMDAwMDAwLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmludGVycnVwdF9tYXNrKTsKKwl3cml0ZWwoMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfbWFzayk7Cit9CisKKy8qKgorICogaXNjaV9ob3N0X2NvbXBsZXRpb25fcm91dGluZSgpIC0gVGhpcyBmdW5jdGlvbiBpcyB0aGUgZGVsYXllZCBzZXJ2aWNlCisgKiAgICByb3V0aW5lIHRoYXQgY2FsbHMgdGhlIHNjaSBjb3JlIGxpYnJhcnkncyBjb21wbGV0aW9uIGhhbmRsZXIuIEl0J3MKKyAqICAgIHNjaGVkdWxlZCBhcyBhIHRhc2tsZXQgZnJvbSB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSB3aGVuIGludGVycnVwdHMKKyAqICAgIGluIHVzZSwgb3Igc2V0IGFzIHRoZSB0aW1lb3V0IGZ1bmN0aW9uIGluIHBvbGxlZCBtb2RlLgorICogQGRhdGE6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgSVNDSSBob3N0IG9iamVjdAorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9ob3N0X2NvbXBsZXRpb25fcm91dGluZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSAoc3RydWN0IGlzY2lfaG9zdCAqKWRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAgICBjb21wbGV0ZWRfcmVxdWVzdF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgICAgZXJyb3JlZF9yZXF1ZXN0X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAgICAqY3VycmVudF9wb3NpdGlvbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICpuZXh0X3Bvc2l0aW9uOworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqbmV4dF9yZXF1ZXN0OworCXN0cnVjdCBzYXNfdGFzayAgICAgKnRhc2s7CisKKwlJTklUX0xJU1RfSEVBRCgmY29tcGxldGVkX3JlcXVlc3RfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmVycm9yZWRfcmVxdWVzdF9saXN0KTsKKworCXNwaW5fbG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCisJc2NpX2NvbnRyb2xsZXJfY29tcGxldGlvbl9oYW5kbGVyKGlob3N0KTsKKworCS8qIFRha2UgdGhlIGxpc3RzIG9mIGNvbXBsZXRlZCBJL09zIGZyb20gdGhlIGhvc3QuICovCisKKwlsaXN0X3NwbGljZV9pbml0KCZpaG9zdC0+cmVxdWVzdHNfdG9fY29tcGxldGUsCisJCQkgJmNvbXBsZXRlZF9yZXF1ZXN0X2xpc3QpOworCisJLyogVGFrZSB0aGUgbGlzdCBvZiBlcnJvcmVkIEkvT3MgZnJvbSB0aGUgaG9zdC4gKi8KKwlsaXN0X3NwbGljZV9pbml0KCZpaG9zdC0+cmVxdWVzdHNfdG9fZXJyb3JiYWNrLAorCQkJICZlcnJvcmVkX3JlcXVlc3RfbGlzdCk7CisKKwlzcGluX3VubG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCisJLyogUHJvY2VzcyBhbnkgY29tcGxldGlvbnMgaW4gdGhlIGxpc3RzLiAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShjdXJyZW50X3Bvc2l0aW9uLCBuZXh0X3Bvc2l0aW9uLAorCQkJICAgJmNvbXBsZXRlZF9yZXF1ZXN0X2xpc3QpIHsKKworCQlyZXF1ZXN0ID0gbGlzdF9lbnRyeShjdXJyZW50X3Bvc2l0aW9uLCBzdHJ1Y3QgaXNjaV9yZXF1ZXN0LAorCQkJCSAgICAgY29tcGxldGVkX25vZGUpOworCQl0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKHJlcXVlc3QpOworCisJCS8qIE5vcm1hbCBub3RpZmljYXRpb24gKHRhc2tfZG9uZSkgKi8KKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogTm9ybWFsIC0gcmVxdWVzdC90YXNrID0gJXAvJXBcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXJlcXVlc3QsCisJCQl0YXNrKTsKKworCQkvKiBSZXR1cm4gdGhlIHRhc2sgdG8gbGlic2FzICovCisJCWlmICh0YXNrICE9IE5VTEwpIHsKKworCQkJdGFzay0+bGxkZF90YXNrID0gTlVMTDsKKwkJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSkgeworCisJCQkJLyogSWYgdGhlIHRhc2sgaXMgYWxyZWFkeSBpbiB0aGUgYWJvcnQgcGF0aCwKKwkJCQkqIHRoZSB0YXNrX2RvbmUgY2FsbGJhY2sgY2Fubm90IGJlIGNhbGxlZC4KKwkJCQkqLworCQkJCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKKwkJCX0KKwkJfQorCisJCXNwaW5fbG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCQlpc2NpX2ZyZWVfdGFnKGlob3N0LCByZXF1ZXN0LT5pb190YWcpOworCQlzcGluX3VubG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxdWVzdCwgbmV4dF9yZXF1ZXN0LCAmZXJyb3JlZF9yZXF1ZXN0X2xpc3QsCisJCQkJIGNvbXBsZXRlZF9ub2RlKSB7CisKKwkJdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhyZXF1ZXN0KTsKKworCQkvKiBVc2Ugc2FzX3Rhc2tfYWJvcnQgKi8KKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBFcnJvciAtIHJlcXVlc3QvdGFzayA9ICVwLyVwXG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHJlcXVlc3QsCisJCQkgdGFzayk7CisKKwkJaWYgKHRhc2sgIT0gTlVMTCkgeworCisJCQkvKiBQdXQgdGhlIHRhc2sgaW50byB0aGUgYWJvcnQgcGF0aCBpZiBpdCdzIG5vdCB0aGVyZQorCQkJICogYWxyZWFkeS4KKwkJCSAqLworCQkJaWYgKCEodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0FCT1JURUQpKQorCQkJCXNhc190YXNrX2Fib3J0KHRhc2spOworCisJCX0gZWxzZSB7CisJCQkvKiBUaGlzIGlzIGEgY2FzZSB3aGVyZSB0aGUgcmVxdWVzdCBoYXMgY29tcGxldGVkIHdpdGggYQorCQkJICogc3RhdHVzIHN1Y2ggdGhhdCBpdCBuZWVkZWQgZnVydGhlciB0YXJnZXQgc2VydmljaW5nLAorCQkJICogYnV0IHRoZSBzYXNfdGFzayByZWZlcmVuY2UgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkCisJCQkgKiBmcm9tIHRoZSByZXF1ZXN0LiAgU2luY2UgaXQgd2FzIGVycm9yZWQsIGl0IHdhcyBub3QKKwkJCSAqIGJlaW5nIGFib3J0ZWQsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gZXhjZXB0IGZyZWUKKwkJCSAqIGl0LgorCQkJICovCisKKwkJCXNwaW5fbG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCQkJLyogUmVtb3ZlIHRoZSByZXF1ZXN0IGZyb20gdGhlIHJlbW90ZSBkZXZpY2UncyBsaXN0CisJCQkqIG9mIHBlbmRpbmcgcmVxdWVzdHMuCisJCQkqLworCQkJbGlzdF9kZWxfaW5pdCgmcmVxdWVzdC0+ZGV2X25vZGUpOworCQkJaXNjaV9mcmVlX3RhZyhpaG9zdCwgcmVxdWVzdC0+aW9fdGFnKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmaWhvc3QtPnNjaWNfbG9jayk7CisJCX0KKwl9CisKK30KKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9zdG9wKCkgLSBUaGlzIG1ldGhvZCB3aWxsIHN0b3AgYW4gaW5kaXZpZHVhbCBjb250cm9sbGVyCisgKiAgICBvYmplY3QuVGhpcyBtZXRob2Qgd2lsbCBpbnZva2UgdGhlIGFzc29jaWF0ZWQgdXNlciBjYWxsYmFjayB1cG9uCisgKiAgICBjb21wbGV0aW9uLiAgVGhlIGNvbXBsZXRpb24gY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIGZvbGxvd2luZworICogICAgY29uZGl0aW9ucyBhcmUgbWV0OiAtIyB0aGUgbWV0aG9kIHJldHVybiBzdGF0dXMgaXMgU0NJX1NVQ0NFU1MuIC0jIHRoZQorICogICAgY29udHJvbGxlciBoYXMgYmVlbiBxdWllc2NlZC4gVGhpcyBtZXRob2Qgd2lsbCBlbnN1cmUgdGhhdCBhbGwgSU8KKyAqICAgIHJlcXVlc3RzIGFyZSBxdWllc2NlZCwgcGh5cyBhcmUgc3RvcHBlZCwgYW5kIGFsbCBhZGRpdGlvbmFsIG9wZXJhdGlvbiBieQorICogICAgdGhlIGhhcmR3YXJlIGlzIGhhbHRlZC4KKyAqIEBjb250cm9sbGVyOiB0aGUgaGFuZGxlIHRvIHRoZSBjb250cm9sbGVyIG9iamVjdCB0byBzdG9wLgorICogQHRpbWVvdXQ6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiB3aGljaCB0aGUKKyAqICAgIHN0b3Agb3BlcmF0aW9uIHNob3VsZCBjb21wbGV0ZS4KKyAqCisgKiBUaGUgY29udHJvbGxlciBtdXN0IGJlIGluIHRoZSBTVEFSVEVEIG9yIFNUT1BQRUQgc3RhdGUuIEluZGljYXRlIGlmIHRoZQorICogY29udHJvbGxlciBzdG9wIG1ldGhvZCBzdWNjZWVkZWQgb3IgZmFpbGVkIGluIHNvbWUgd2F5LiBTQ0lfU1VDQ0VTUyBpZiB0aGUKKyAqIHN0b3Agb3BlcmF0aW9uIHN1Y2Nlc3NmdWxseSBiZWdhbi4gU0NJX1dBUk5JTkdfQUxSRUFEWV9JTl9TVEFURSBpZiB0aGUKKyAqIGNvbnRyb2xsZXIgaXMgYWxyZWFkeSBpbiB0aGUgU1RPUFBFRCBzdGF0ZS4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURSBpZiB0aGUKKyAqIGNvbnRyb2xsZXIgaXMgbm90IGVpdGhlciBpbiB0aGUgU1RBUlRFRCBvciBTVE9QUEVEIHN0YXRlcy4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9zdG9wKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MzIgdGltZW91dCkKK3sKKwlpZiAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQgIT0gU0NJQ19SRUFEWSkgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiU0NJQyBDb250cm9sbGVyIHN0b3Agb3BlcmF0aW9uIHJlcXVlc3RlZCBpbiAiCisJCQkgImludmFsaWQgc3RhdGVcbiIpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlzY2lfbW9kX3RpbWVyKCZpaG9zdC0+dGltZXIsIHRpbWVvdXQpOworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlob3N0LT5zbSwgU0NJQ19TVE9QUElORyk7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKioKKyAqIHNjaV9jb250cm9sbGVyX3Jlc2V0KCkgLSBUaGlzIG1ldGhvZCB3aWxsIHJlc2V0IHRoZSBzdXBwbGllZCBjb3JlCisgKiAgICBjb250cm9sbGVyIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHNhaWQgY29udHJvbGxlci4gIFRoaXMgb3BlcmF0aW9uIGlzCisgKiAgICBjb25zaWRlcmVkIGRlc3RydWN0aXZlLiAgSW4gb3RoZXIgd29yZHMsIGFsbCBjdXJyZW50IG9wZXJhdGlvbnMgYXJlIHdpcGVkCisgKiAgICBvdXQuICBObyBJTyBjb21wbGV0aW9ucyBmb3Igb3V0c3RhbmRpbmcgZGV2aWNlcyBvY2N1ci4gIE91dHN0YW5kaW5nIElPCisgKiAgICByZXF1ZXN0cyBhcmUgbm90IGFib3J0ZWQgb3IgY29tcGxldGVkIGF0IHRoZSBhY3R1YWwgcmVtb3RlIGRldmljZS4KKyAqIEBjb250cm9sbGVyOiB0aGUgaGFuZGxlIHRvIHRoZSBjb250cm9sbGVyIG9iamVjdCB0byByZXNldC4KKyAqCisgKiBJbmRpY2F0ZSBpZiB0aGUgY29udHJvbGxlciByZXNldCBtZXRob2Qgc3VjY2VlZGVkIG9yIGZhaWxlZCBpbiBzb21lIHdheS4KKyAqIFNDSV9TVUNDRVNTIGlmIHRoZSByZXNldCBvcGVyYXRpb24gc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuIFNDSV9GQVRBTF9FUlJPUiBpZgorICogdGhlIGNvbnRyb2xsZXIgcmVzZXQgb3BlcmF0aW9uIGlzIHVuYWJsZSB0byBjb21wbGV0ZS4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9yZXNldChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlzd2l0Y2ggKGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkKSB7CisJY2FzZSBTQ0lDX1JFU0VUOgorCWNhc2UgU0NJQ19SRUFEWToKKwljYXNlIFNDSUNfU1RPUFBFRDoKKwljYXNlIFNDSUNfRkFJTEVEOgorCQkvKgorCQkgKiBUaGUgcmVzZXQgb3BlcmF0aW9uIGlzIG5vdCBhIGdyYWNlZnVsIGNsZWFudXAsIGp1c3QKKwkJICogcGVyZm9ybSB0aGUgc3RhdGUgdHJhbnNpdGlvbi4KKwkJICovCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlob3N0LT5zbSwgU0NJQ19SRVNFVFRJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIlNDSUMgQ29udHJvbGxlciByZXNldCBvcGVyYXRpb24gcmVxdWVzdGVkIGluICIKKwkJCSAiaW52YWxpZCBzdGF0ZVxuIik7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKwordm9pZCBpc2NpX2hvc3RfZGVpbml0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCWludCBpOworCisJaXNjaV9ob3N0X2NoYW5nZV9zdGF0ZShpaG9zdCwgaXNjaV9zdG9wcGluZyk7CisJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9ICZpaG9zdC0+cG9ydHNbaV07CisJCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsICpkOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpZGV2LCBkLCAmaXBvcnQtPnJlbW90ZV9kZXZfbGlzdCwgbm9kZSkgeworCQkJaWYgKHRlc3RfYml0KElERVZfQUxMT0NBVEVELCAmaWRldi0+ZmxhZ3MpKQorCQkJCWlzY2lfcmVtb3RlX2RldmljZV9zdG9wKGlob3N0LCBpZGV2KTsKKwkJfQorCX0KKworCXNldF9iaXQoSUhPU1RfU1RPUF9QRU5ESU5HLCAmaWhvc3QtPmZsYWdzKTsKKworCXNwaW5fbG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCXNjaV9jb250cm9sbGVyX3N0b3AoaWhvc3QsIFNDSUNfQ09OVFJPTExFUl9TVE9QX1RJTUVPVVQpOworCXNwaW5fdW5sb2NrX2lycSgmaWhvc3QtPnNjaWNfbG9jayk7CisKKwl3YWl0X2Zvcl9zdG9wKGlob3N0KTsKKwlzY2lfY29udHJvbGxlcl9yZXNldChpaG9zdCk7CisKKwkvKiBDYW5jZWwgYW55L2FsbCBvdXRzdGFuZGluZyBwb3J0IHRpbWVycyAqLworCWZvciAoaSA9IDA7IGkgPCBpaG9zdC0+bG9naWNhbF9wb3J0X2VudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9ICZpaG9zdC0+cG9ydHNbaV07CisJCWRlbF90aW1lcl9zeW5jKCZpcG9ydC0+dGltZXIudGltZXIpOworCX0KKworCS8qIENhbmNlbCBhbnkvYWxsIG91dHN0YW5kaW5nIHBoeSB0aW1lcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QSFlTOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gJmlob3N0LT5waHlzW2ldOworCQlkZWxfdGltZXJfc3luYygmaXBoeS0+c2F0YV90aW1lci50aW1lcik7CisJfQorCisJZGVsX3RpbWVyX3N5bmMoJmlob3N0LT5wb3J0X2FnZW50LnRpbWVyLnRpbWVyKTsKKworCWRlbF90aW1lcl9zeW5jKCZpaG9zdC0+cG93ZXJfY29udHJvbC50aW1lci50aW1lcik7CisKKwlkZWxfdGltZXJfc3luYygmaWhvc3QtPnRpbWVyLnRpbWVyKTsKKworCWRlbF90aW1lcl9zeW5jKCZpaG9zdC0+cGh5X3RpbWVyLnRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqc2N1X2Jhc2Uoc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaXNjaV9ob3N0LT5wZGV2OworCWludCBpZCA9IGlzY2lfaG9zdC0+aWQ7CisKKwlyZXR1cm4gcGNpbV9pb21hcF90YWJsZShwZGV2KVtTQ0lfU0NVX0JBUiAqIDJdICsgU0NJX1NDVV9CQVJfU0laRSAqIGlkOworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpzbXVfYmFzZShzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpc2NpX2hvc3QtPnBkZXY7CisJaW50IGlkID0gaXNjaV9ob3N0LT5pZDsKKworCXJldHVybiBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpW1NDSV9TTVVfQkFSICogMl0gKyBTQ0lfU01VX0JBUl9TSVpFICogaWQ7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfdXNlcl9wYXJhbWV0ZXJzX2dldChzdHJ1Y3Qgc2NpX3VzZXJfcGFyYW1ldGVycyAqdSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykgeworCQlzdHJ1Y3Qgc2NpX3BoeV91c2VyX3BhcmFtcyAqdV9waHkgPSAmdS0+cGh5c1tpXTsKKworCQl1X3BoeS0+bWF4X3NwZWVkX2dlbmVyYXRpb24gPSBwaHlfZ2VuOworCisJCS8qIHdlIGFyZSBub3QgZXhwb3J0aW5nIHRoZXNlIGZvciBub3cgKi8KKwkJdV9waHktPmFsaWduX2luc2VydGlvbl9mcmVxdWVuY3kgPSAweDdmOworCQl1X3BoeS0+aW5fY29ubmVjdGlvbl9hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5ID0gMHhmZjsKKwkJdV9waHktPm5vdGlmeV9lbmFibGVfc3Bpbl91cF9pbnNlcnRpb25fZnJlcXVlbmN5ID0gMHgzMzsKKwl9CisKKwl1LT5zdHBfaW5hY3Rpdml0eV90aW1lb3V0ID0gc3RwX2luYWN0aXZlX3RvOworCXUtPnNzcF9pbmFjdGl2aXR5X3RpbWVvdXQgPSBzc3BfaW5hY3RpdmVfdG87CisJdS0+c3RwX21heF9vY2N1cGFuY3lfdGltZW91dCA9IHN0cF9tYXhfb2NjX3RvOworCXUtPnNzcF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQgPSBzc3BfbWF4X29jY190bzsKKwl1LT5ub19vdXRib3VuZF90YXNrX3RpbWVvdXQgPSBub19vdXRib3VuZF90YXNrX3RvOworCXUtPm1heF9udW1iZXJfY29uY3VycmVudF9kZXZpY2Vfc3Bpbl91cCA9IG1heF9jb25jdXJyX3NwaW51cDsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfaW5pdGlhbF9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWhvc3QpLCBzbSk7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpaG9zdC0+c20sIFNDSUNfUkVTRVQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NpX2NvbnRyb2xsZXJfc3RhcnRpbmdfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWhvc3QpLCBzbSk7CisKKwlzY2lfZGVsX3RpbWVyKCZpaG9zdC0+dGltZXIpOworfQorCisjZGVmaW5lIElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0JBU0VfUkFOR0VfTE9XRVJfQk9VTkRfTlMgODUzCisjZGVmaW5lIElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0JBU0VfUkFOR0VfVVBQRVJfQk9VTkRfTlMgMTI4MAorI2RlZmluZSBJTlRFUlJVUFRfQ09BTEVTQ0VfVElNRU9VVF9NQVhfVVMgICAgICAgICAgICAgICAgICAgIDI3MDAwMDAKKyNkZWZpbmUgSU5URVJSVVBUX0NPQUxFU0NFX05VTUJFUl9NQVggICAgICAgICAgICAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgSU5URVJSVVBUX0NPQUxFU0NFX1RJTUVPVVRfRU5DT0RFX01JTiAgICAgICAgICAgICAgICA3CisjZGVmaW5lIElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0VOQ09ERV9NQVggICAgICAgICAgICAgICAgMjgKKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9zZXRfaW50ZXJydXB0X2NvYWxlc2NlbmNlKCkgLSBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIHVzZXIgdG8KKyAqICAgIGNvbmZpZ3VyZSB0aGUgaW50ZXJydXB0IGNvYWxlc2NlbmNlLgorICogQGNvbnRyb2xsZXI6IFRoaXMgcGFyYW1ldGVyIHJlcHJlc2VudHMgdGhlIGhhbmRsZSB0byB0aGUgY29udHJvbGxlciBvYmplY3QKKyAqICAgIGZvciB3aGljaCBpdHMgaW50ZXJydXB0IGNvYWxlc2NlIHJlZ2lzdGVyIGlzIG92ZXJyaWRkZW4uCisgKiBAY29hbGVzY2VfbnVtYmVyOiBVc2VkIHRvIGNvbnRyb2wgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBDb21wbGV0aW9uCisgKiAgICBRdWV1ZSBiZWZvcmUgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZC4gSWYgdGhlIG51bWJlciBvZiBlbnRyaWVzIGV4Y2VlZAorICogICAgdGhpcyBudW1iZXIsIGFuIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZC4gVGhlIHZhbGlkIHJhbmdlIG9mIHRoZSBpbnB1dAorICogICAgaXMgWzAsIDI1Nl0uIEEgc2V0dGluZyBvZiAwIHJlc3VsdHMgaW4gY29hbGVzY2luZyBiZWluZyBkaXNhYmxlZC4KKyAqIEBjb2FsZXNjZV90aW1lb3V0OiBUaW1lb3V0IHZhbHVlIGluIG1pY3Jvc2Vjb25kcy4gVGhlIHZhbGlkIHJhbmdlIG9mIHRoZQorICogICAgaW5wdXQgaXMgWzAsIDI3MDAwMDBdIC4gQSBzZXR0aW5nIG9mIDAgaXMgYWxsb3dlZCBhbmQgcmVzdWx0cyBpbiBubworICogICAgaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZW91dC4KKyAqCisgKiBJbmRpY2F0ZSBpZiB0aGUgdXNlciBzdWNjZXNzZnVsbHkgc2V0IHRoZSBpbnRlcnJ1cHQgY29hbGVzY2UgcGFyYW1ldGVycy4KKyAqIFNDSV9TVUNDRVNTIFRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIHRoZSBpbnRlcnJ1dHAgY29hbGVzY2VuY2UuCisgKiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSBUaGUgdXNlciBpbnB1dCB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NjaV9jb250cm9sbGVyX3NldF9pbnRlcnJ1cHRfY29hbGVzY2VuY2Uoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSB1MzIgY29hbGVzY2VfbnVtYmVyLAorCQkJCQkgdTMyIGNvYWxlc2NlX3RpbWVvdXQpCit7CisJdTggdGltZW91dF9lbmNvZGUgPSAwOworCXUzMiBtaW4gPSAwOworCXUzMiBtYXggPSAwOworCisJLyogQ2hlY2sgaWYgdGhlIGlucHV0IHBhcmFtZXRlcnMgZmFsbCBpbiB0aGUgcmFuZ2UuICovCisJaWYgKGNvYWxlc2NlX251bWJlciA+IElOVEVSUlVQVF9DT0FMRVNDRV9OVU1CRVJfTUFYKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUU7CisKKwkvKgorCSAqICBEZWZpbmVkIGVuY29kaW5nIGZvciBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lb3V0OgorCSAqICAgICAgICAgICAgICBWYWx1ZSAgIE1pbiAgICAgIE1heCAgICAgVW5pdHMKKwkgKiAgICAgICAgICAgICAgLS0tLS0gICAtLS0gICAgICAtLS0gICAgIC0tLS0tCisJICogICAgICAgICAgICAgIDAgICAgICAgLSAgICAgICAgLSAgICAgICBEaXNhYmxlZAorCSAqICAgICAgICAgICAgICAxICAgICAgIDEzLjMgICAgIDIwLjAgICAgbnMKKwkgKiAgICAgICAgICAgICAgMiAgICAgICAyNi43ICAgICA0MC4wCisJICogICAgICAgICAgICAgIDMgICAgICAgNTMuMyAgICAgODAuMAorCSAqICAgICAgICAgICAgICA0ICAgICAgIDEwNi43ICAgIDE2MC4wCisJICogICAgICAgICAgICAgIDUgICAgICAgMjEzLjMgICAgMzIwLjAKKwkgKiAgICAgICAgICAgICAgNiAgICAgICA0MjYuNyAgICA2NDAuMAorCSAqICAgICAgICAgICAgICA3ICAgICAgIDg1My4zICAgIDEyODAuMAorCSAqICAgICAgICAgICAgICA4ICAgICAgIDEuNyAgICAgIDIuNiAgICAgdXMKKwkgKiAgICAgICAgICAgICAgOSAgICAgICAzLjQgICAgICA1LjEKKwkgKiAgICAgICAgICAgICAgMTAgICAgICA2LjggICAgICAxMC4yCisJICogICAgICAgICAgICAgIDExICAgICAgMTMuNyAgICAgMjAuNQorCSAqICAgICAgICAgICAgICAxMiAgICAgIDI3LjMgICAgIDQxLjAKKwkgKiAgICAgICAgICAgICAgMTMgICAgICA1NC42ICAgICA4MS45CisJICogICAgICAgICAgICAgIDE0ICAgICAgMTA5LjIgICAgMTYzLjgKKwkgKiAgICAgICAgICAgICAgMTUgICAgICAyMTguNSAgICAzMjcuNworCSAqICAgICAgICAgICAgICAxNiAgICAgIDQzNi45ICAgIDY1NS40CisJICogICAgICAgICAgICAgIDE3ICAgICAgODczLjggICAgMTMxMC43CisJICogICAgICAgICAgICAgIDE4ICAgICAgMS43ICAgICAgMi42ICAgICBtcworCSAqICAgICAgICAgICAgICAxOSAgICAgIDMuNSAgICAgIDUuMgorCSAqICAgICAgICAgICAgICAyMCAgICAgIDcuMCAgICAgIDEwLjUKKwkgKiAgICAgICAgICAgICAgMjEgICAgICAxNC4wICAgICAyMS4wCisJICogICAgICAgICAgICAgIDIyICAgICAgMjguMCAgICAgNDEuOQorCSAqICAgICAgICAgICAgICAyMyAgICAgIDU1LjkgICAgIDgzLjkKKwkgKiAgICAgICAgICAgICAgMjQgICAgICAxMTEuOCAgICAxNjcuOAorCSAqICAgICAgICAgICAgICAyNSAgICAgIDIyMy43ICAgIDMzNS41CisJICogICAgICAgICAgICAgIDI2ICAgICAgNDQ3LjQgICAgNjcxLjEKKwkgKiAgICAgICAgICAgICAgMjcgICAgICA4OTQuOCAgICAxMzQyLjIKKwkgKiAgICAgICAgICAgICAgMjggICAgICAxLjggICAgICAyLjcgICAgIHMKKwkgKiAgICAgICAgICAgICAgT3RoZXJzIFVuZGVmaW5lZCAqLworCisJLyoKKwkgKiBVc2UgdGhlIHRhYmxlIGFib3ZlIHRvIGRlY2lkZSB0aGUgZW5jb2RlIG9mIGludGVycnVwdCBjb2FsZXNjaW5nIHRpbWVvdXQKKwkgKiB2YWx1ZSBmb3IgcmVnaXN0ZXIgd3JpdGluZy4gKi8KKwlpZiAoY29hbGVzY2VfdGltZW91dCA9PSAwKQorCQl0aW1lb3V0X2VuY29kZSA9IDA7CisJZWxzZXsKKwkJLyogbWFrZSB0aGUgdGltZW91dCB2YWx1ZSBpbiB1bml0IG9mICgxMCBucykuICovCisJCWNvYWxlc2NlX3RpbWVvdXQgPSBjb2FsZXNjZV90aW1lb3V0ICogMTAwOworCQltaW4gPSBJTlRFUlJVUFRfQ09BTEVTQ0VfVElNRU9VVF9CQVNFX1JBTkdFX0xPV0VSX0JPVU5EX05TIC8gMTA7CisJCW1heCA9IElOVEVSUlVQVF9DT0FMRVNDRV9USU1FT1VUX0JBU0VfUkFOR0VfVVBQRVJfQk9VTkRfTlMgLyAxMDsKKworCQkvKiBnZXQgdGhlIGVuY29kZSBvZiB0aW1lb3V0IGZvciByZWdpc3RlciB3cml0aW5nLiAqLworCQlmb3IgKHRpbWVvdXRfZW5jb2RlID0gSU5URVJSVVBUX0NPQUxFU0NFX1RJTUVPVVRfRU5DT0RFX01JTjsKKwkJICAgICAgdGltZW91dF9lbmNvZGUgPD0gSU5URVJSVVBUX0NPQUxFU0NFX1RJTUVPVVRfRU5DT0RFX01BWDsKKwkJICAgICAgdGltZW91dF9lbmNvZGUrKykgeworCQkJaWYgKG1pbiA8PSBjb2FsZXNjZV90aW1lb3V0ICYmICBtYXggPiBjb2FsZXNjZV90aW1lb3V0KQorCQkJCWJyZWFrOworCQkJZWxzZSBpZiAoY29hbGVzY2VfdGltZW91dCA+PSBtYXggJiYgY29hbGVzY2VfdGltZW91dCA8IG1pbiAqIDIKKwkJCQkgJiYgY29hbGVzY2VfdGltZW91dCA8PSBJTlRFUlJVUFRfQ09BTEVTQ0VfVElNRU9VVF9NQVhfVVMgKiAxMDApIHsKKwkJCQlpZiAoKGNvYWxlc2NlX3RpbWVvdXQgLSBtYXgpIDwgKDIgKiBtaW4gLSBjb2FsZXNjZV90aW1lb3V0KSkKKwkJCQkJYnJlYWs7CisJCQkJZWxzZXsKKwkJCQkJdGltZW91dF9lbmNvZGUrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQltYXggPSBtYXggKiAyOworCQkJCW1pbiA9IG1pbiAqIDI7CisJCQl9CisJCX0KKworCQlpZiAodGltZW91dF9lbmNvZGUgPT0gSU5URVJSVVBUX0NPQUxFU0NFX1RJTUVPVVRfRU5DT0RFX01BWCArIDEpCisJCQkvKiB0aGUgdmFsdWUgaXMgb3V0IG9mIHJhbmdlLiAqLworCQkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFOworCX0KKworCXdyaXRlbChTTVVfSUNDX0dFTl9WQUwoTlVNQkVSLCBjb2FsZXNjZV9udW1iZXIpIHwKKwkgICAgICAgU01VX0lDQ19HRU5fVkFMKFRJTUVSLCB0aW1lb3V0X2VuY29kZSksCisJICAgICAgICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aW50ZXJydXB0X2NvYWxlc2NlX2NvbnRyb2wpOworCisKKwlpaG9zdC0+aW50ZXJydXB0X2NvYWxlc2NlX251bWJlciA9ICh1MTYpY29hbGVzY2VfbnVtYmVyOworCWlob3N0LT5pbnRlcnJ1cHRfY29hbGVzY2VfdGltZW91dCA9IGNvYWxlc2NlX3RpbWVvdXQgLyAxMDA7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfcmVhZHlfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlob3N0KSwgc20pOworCisJLyogc2V0IHRoZSBkZWZhdWx0IGludGVycnVwdCBjb2FsZXNjZW5jZSBudW1iZXIgYW5kIHRpbWVvdXQgdmFsdWUuICovCisJc2NpX2NvbnRyb2xsZXJfc2V0X2ludGVycnVwdF9jb2FsZXNjZW5jZShpaG9zdCwgMHgxMCwgMjUwKTsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfcmVhZHlfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWhvc3QpLCBzbSk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdCBjb2FsZXNjZW5jZS4gKi8KKwlzY2lfY29udHJvbGxlcl9zZXRfaW50ZXJydXB0X2NvYWxlc2NlbmNlKGlob3N0LCAwLCAwKTsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9zdG9wX3BoeXMoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIGluZGV4OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJZW51bSBzY2lfc3RhdHVzIHBoeV9zdGF0dXM7CisKKwlzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQlwaHlfc3RhdHVzID0gc2NpX3BoeV9zdG9wKCZpaG9zdC0+cGh5c1tpbmRleF0pOworCisJCWlmIChwaHlfc3RhdHVzICE9IFNDSV9TVUNDRVNTICYmCisJCSAgICBwaHlfc3RhdHVzICE9IFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEUpIHsKKwkJCXN0YXR1cyA9IFNDSV9GQUlMVVJFOworCisJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkgIiVzOiBDb250cm9sbGVyIHN0b3Agb3BlcmF0aW9uIGZhaWxlZCB0byBzdG9wICIKKwkJCQkgInBoeSAlZCBiZWNhdXNlIG9mIHN0YXR1cyAlZC5cbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBpaG9zdC0+cGh5c1tpbmRleF0ucGh5X2luZGV4LCBwaHlfc3RhdHVzKTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfc3RvcF9wb3J0cyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgaW5kZXg7CisJZW51bSBzY2lfc3RhdHVzIHBvcnRfc3RhdHVzOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGlob3N0LT5sb2dpY2FsX3BvcnRfZW50cmllczsgaW5kZXgrKykgeworCQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9ICZpaG9zdC0+cG9ydHNbaW5kZXhdOworCisJCXBvcnRfc3RhdHVzID0gc2NpX3BvcnRfc3RvcChpcG9ydCk7CisKKwkJaWYgKChwb3J0X3N0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgJiYKKwkJICAgIChwb3J0X3N0YXR1cyAhPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFKSkgeworCQkJc3RhdHVzID0gU0NJX0ZBSUxVUkU7CisKKwkJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSAiJXM6IENvbnRyb2xsZXIgc3RvcCBvcGVyYXRpb24gZmFpbGVkIHRvICIKKwkJCQkgInN0b3AgcG9ydCAlZCBiZWNhdXNlIG9mIHN0YXR1cyAlZC5cbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBpcG9ydC0+bG9naWNhbF9wb3J0X2luZGV4LAorCQkJCSBwb3J0X3N0YXR1cyk7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0b3BfZGV2aWNlcyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgaW5kZXg7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKwllbnVtIHNjaV9zdGF0dXMgZGV2aWNlX3N0YXR1czsKKworCXN0YXR1cyA9IFNDSV9TVUNDRVNTOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgaWhvc3QtPnJlbW90ZV9ub2RlX2VudHJpZXM7IGluZGV4KyspIHsKKwkJaWYgKGlob3N0LT5kZXZpY2VfdGFibGVbaW5kZXhdICE9IE5VTEwpIHsKKwkJCS8qIC8gQHRvZG8gV2hhdCB0aW1lb3V0IHZhbHVlIGRvIHdlIHdhbnQgdG8gcHJvdmlkZSB0byB0aGlzIHJlcXVlc3Q/ICovCisJCQlkZXZpY2Vfc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcChpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XSwgMCk7CisKKwkJCWlmICgoZGV2aWNlX3N0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgJiYKKwkJCSAgICAoZGV2aWNlX3N0YXR1cyAhPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFKSkgeworCQkJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkgIiVzOiBDb250cm9sbGVyIHN0b3Agb3BlcmF0aW9uIGZhaWxlZCAiCisJCQkJCSAidG8gc3RvcCBkZXZpY2UgMHglcCBiZWNhdXNlIG9mICIKKwkJCQkJICJzdGF0dXMgJWQuXG4iLAorCQkJCQkgX19mdW5jX18sCisJCQkJCSBpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XSwgZGV2aWNlX3N0YXR1cyk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9zdG9wcGluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWhvc3QpLCBzbSk7CisKKwkvKiBTdG9wIGFsbCBvZiB0aGUgY29tcG9uZW50cyBmb3IgdGhpcyBjb250cm9sbGVyICovCisJc2NpX2NvbnRyb2xsZXJfc3RvcF9waHlzKGlob3N0KTsKKwlzY2lfY29udHJvbGxlcl9zdG9wX3BvcnRzKGlob3N0KTsKKwlzY2lfY29udHJvbGxlcl9zdG9wX2RldmljZXMoaWhvc3QpOworfQorCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9zdG9wcGluZ19zdGF0ZV9leGl0KHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppaG9zdCksIHNtKTsKKworCXNjaV9kZWxfdGltZXIoJmlob3N0LT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX3Jlc2V0X2hhcmR3YXJlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCS8qIERpc2FibGUgaW50ZXJydXB0cyBzbyB3ZSBkb250IHRha2UgYW55IHNwdXJpb3VzIGludGVycnVwdHMgKi8KKwlzY2lfY29udHJvbGxlcl9kaXNhYmxlX2ludGVycnVwdHMoaWhvc3QpOworCisJLyogUmVzZXQgdGhlIFNDVSAqLworCXdyaXRlbCgweEZGRkZGRkZGLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPnNvZnRfcmVzZXRfY29udHJvbCk7CisKKwkvKiBEZWxheSBmb3IgMW1zIHRvIGJlZm9yZSBjbGVhcmluZyB0aGUgQ1FQIGFuZCBVRlFQUi4gKi8KKwl1ZGVsYXkoMTAwMCk7CisKKwkvKiBUaGUgd3JpdGUgdG8gdGhlIENRR1IgY2xlYXJzIHRoZSBDUVAgKi8KKwl3cml0ZWwoMHgwMDAwMDAwMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5jb21wbGV0aW9uX3F1ZXVlX2dldCk7CisKKwkvKiBUaGUgd3JpdGUgdG8gdGhlIFVGUUdQIGNsZWFycyB0aGUgVUZRUFIgKi8KKwl3cml0ZWwoMCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVuc29saWNpdGVkX2ZyYW1lX2dldF9wb2ludGVyKTsKK30KKworc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfcmVzZXR0aW5nX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppaG9zdCksIHNtKTsKKworCXNjaV9jb250cm9sbGVyX3Jlc2V0X2hhcmR3YXJlKGlob3N0KTsKKwlzY2lfY2hhbmdlX3N0YXRlKCZpaG9zdC0+c20sIFNDSUNfUkVTRVQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjaV9iYXNlX3N0YXRlIHNjaV9jb250cm9sbGVyX3N0YXRlX3RhYmxlW10gPSB7CisJW1NDSUNfSU5JVElBTF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9jb250cm9sbGVyX2luaXRpYWxfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJQ19SRVNFVF0gPSB7fSwKKwlbU0NJQ19JTklUSUFMSVpJTkddID0ge30sCisJW1NDSUNfSU5JVElBTElaRURdID0ge30sCisJW1NDSUNfU1RBUlRJTkddID0geworCQkuZXhpdF9zdGF0ZSAgPSBzY2lfY29udHJvbGxlcl9zdGFydGluZ19zdGF0ZV9leGl0LAorCX0sCisJW1NDSUNfUkVBRFldID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfY29udHJvbGxlcl9yZWFkeV9zdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX2NvbnRyb2xsZXJfcmVhZHlfc3RhdGVfZXhpdCwKKwl9LAorCVtTQ0lDX1JFU0VUVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9jb250cm9sbGVyX3Jlc2V0dGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lDX1NUT1BQSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX2NvbnRyb2xsZXJfc3RvcHBpbmdfc3RhdGVfZW50ZXIsCisJCS5leGl0X3N0YXRlID0gc2NpX2NvbnRyb2xsZXJfc3RvcHBpbmdfc3RhdGVfZXhpdCwKKwl9LAorCVtTQ0lDX1NUT1BQRURdID0ge30sCisJW1NDSUNfRkFJTEVEXSA9IHt9Cit9OworCitzdGF0aWMgdm9pZCBzY2lfY29udHJvbGxlcl9zZXRfZGVmYXVsdF9jb25maWdfcGFyYW1ldGVycyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwkvKiB0aGVzZSBkZWZhdWx0cyBhcmUgb3ZlcnJpZGRlbiBieSB0aGUgcGxhdGZvcm0gLyBmaXJtd2FyZSAqLworCXUxNiBpbmRleDsKKworCS8qIERlZmF1bHQgdG8gQVBDIG1vZGUuICovCisJaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubW9kZV90eXBlID0gU0NJQ19QT1JUX0FVVE9NQVRJQ19DT05GSUdVUkFUSU9OX01PREU7CisKKwkvKiBEZWZhdWx0IHRvIEFQQyBtb2RlLiAqLworCWlob3N0LT5vZW1fcGFyYW1ldGVycy5jb250cm9sbGVyLm1heF9jb25jdXJyZW50X2Rldl9zcGluX3VwID0gMTsKKworCS8qIERlZmF1bHQgdG8gbm8gU1NDIG9wZXJhdGlvbi4gKi8KKwlpaG9zdC0+b2VtX3BhcmFtZXRlcnMuY29udHJvbGxlci5kb19lbmFibGVfc3NjID0gZmFsc2U7CisKKwkvKiBJbml0aWFsaXplIGFsbCBvZiB0aGUgcG9ydCBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gdG8gbmFycm93IHBvcnRzLiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUE9SVFM7IGluZGV4KyspIHsKKwkJaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLnBvcnRzW2luZGV4XS5waHlfbWFzayA9IDA7CisJfQorCisJLyogSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIHBoeSBwYXJhbWV0ZXIgaW5mb3JtYXRpb24uICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCS8qIERlZmF1bHQgdG8gNkcgKGkuZS4gR2VuIDMpIGZvciBub3cuICovCisJCWlob3N0LT51c2VyX3BhcmFtZXRlcnMucGh5c1tpbmRleF0ubWF4X3NwZWVkX2dlbmVyYXRpb24gPSAzOworCisJCS8qIHRoZSBmcmVxdWVuY2llcyBjYW5ub3QgYmUgMCAqLworCQlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnBoeXNbaW5kZXhdLmFsaWduX2luc2VydGlvbl9mcmVxdWVuY3kgPSAweDdmOworCQlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnBoeXNbaW5kZXhdLmluX2Nvbm5lY3Rpb25fYWxpZ25faW5zZXJ0aW9uX2ZyZXF1ZW5jeSA9IDB4ZmY7CisJCWlob3N0LT51c2VyX3BhcmFtZXRlcnMucGh5c1tpbmRleF0ubm90aWZ5X2VuYWJsZV9zcGluX3VwX2luc2VydGlvbl9mcmVxdWVuY3kgPSAweDMzOworCisJCS8qCisJCSAqIFByZXZpb3VzIFZpdGVzc2UgYmFzZWQgZXhwYW5kZXJzIGhhZCBhIGFyYml0cmF0aW9uIGlzc3VlIHRoYXQKKwkJICogaXMgd29ya2VkIGFyb3VuZCBieSBoYXZpbmcgdGhlIHVwcGVyIDMyLWJpdHMgb2YgU0FTIGFkZHJlc3MKKwkJICogd2l0aCBhIHZhbHVlIGdyZWF0ZXIgdGhlbiB0aGUgVml0ZXNzZSBjb21wYW55IGlkZW50aWZpZXIuCisJCSAqIEhlbmNlLCB1c2FnZSBvZiAweDVGQ0ZGRkZGLiAqLworCQlpaG9zdC0+b2VtX3BhcmFtZXRlcnMucGh5c1tpbmRleF0uc2FzX2FkZHJlc3MubG93ID0gMHgxICsgaWhvc3QtPmlkOworCQlpaG9zdC0+b2VtX3BhcmFtZXRlcnMucGh5c1tpbmRleF0uc2FzX2FkZHJlc3MuaGlnaCA9IDB4NUZDRkZGRkY7CisJfQorCisJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5zdHBfaW5hY3Rpdml0eV90aW1lb3V0ID0gNTsKKwlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnNzcF9pbmFjdGl2aXR5X3RpbWVvdXQgPSA1OworCWlob3N0LT51c2VyX3BhcmFtZXRlcnMuc3RwX21heF9vY2N1cGFuY3lfdGltZW91dCA9IDU7CisJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5zc3BfbWF4X29jY3VwYW5jeV90aW1lb3V0ID0gMjA7CisJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5ub19vdXRib3VuZF90YXNrX3RpbWVvdXQgPSAyMDsKK30KKworc3RhdGljIHZvaWQgY29udHJvbGxlcl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIgPSAoc3RydWN0IHNjaV90aW1lciAqKWRhdGE7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBjb250YWluZXJfb2YodG1yLCB0eXBlb2YoKmlob3N0KSwgdGltZXIpOworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpaG9zdC0+c207CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAodG1yLT5jYW5jZWwpCisJCWdvdG8gZG9uZTsKKworCWlmIChzbS0+Y3VycmVudF9zdGF0ZV9pZCA9PSBTQ0lDX1NUQVJUSU5HKQorCQlzY2lfY29udHJvbGxlcl90cmFuc2l0aW9uX3RvX3JlYWR5KGlob3N0LCBTQ0lfRkFJTFVSRV9USU1FT1VUKTsKKwllbHNlIGlmIChzbS0+Y3VycmVudF9zdGF0ZV9pZCA9PSBTQ0lDX1NUT1BQSU5HKSB7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSUNfRkFJTEVEKTsKKwkJaXNjaV9ob3N0X3N0b3BfY29tcGxldGUoaWhvc3QsIFNDSV9GQUlMVVJFX1RJTUVPVVQpOworCX0gZWxzZQkvKiAvIEB0b2RvIE5vdyB3aGF0IGRvIHdlIHdhbnQgdG8gZG8gaW4gdGhpcyBjYXNlPyAqLworCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBDb250cm9sbGVyIHRpbWVyIGZpcmVkIHdoZW4gY29udHJvbGxlciB3YXMgbm90ICIKKwkJCSJpbiBhIHN0YXRlIGJlaW5nIHRpbWVkLlxuIiwKKwkJCV9fZnVuY19fKTsKKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfY29uc3RydWN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkJdm9pZCBfX2lvbWVtICpzY3VfYmFzZSwKKwkJCQkJCXZvaWQgX19pb21lbSAqc211X2Jhc2UpCit7CisJdTggaTsKKworCXNjaV9pbml0X3NtKCZpaG9zdC0+c20sIHNjaV9jb250cm9sbGVyX3N0YXRlX3RhYmxlLCBTQ0lDX0lOSVRJQUwpOworCisJaWhvc3QtPnNjdV9yZWdpc3RlcnMgPSBzY3VfYmFzZTsKKwlpaG9zdC0+c211X3JlZ2lzdGVycyA9IHNtdV9iYXNlOworCisJc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudF9jb25zdHJ1Y3QoJmlob3N0LT5wb3J0X2FnZW50KTsKKworCS8qIENvbnN0cnVjdCB0aGUgcG9ydHMgZm9yIHRoaXMgY29udHJvbGxlciAqLworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BPUlRTOyBpKyspCisJCXNjaV9wb3J0X2NvbnN0cnVjdCgmaWhvc3QtPnBvcnRzW2ldLCBpLCBpaG9zdCk7CisJc2NpX3BvcnRfY29uc3RydWN0KCZpaG9zdC0+cG9ydHNbaV0sIFNDSUNfU0RTX0RVTU1ZX1BPUlQsIGlob3N0KTsKKworCS8qIENvbnN0cnVjdCB0aGUgcGh5cyBmb3IgdGhpcyBjb250cm9sbGVyICovCisJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUEhZUzsgaSsrKSB7CisJCS8qIEFkZCBhbGwgdGhlIFBIWXMgdG8gdGhlIGR1bW15IHBvcnQgKi8KKwkJc2NpX3BoeV9jb25zdHJ1Y3QoJmlob3N0LT5waHlzW2ldLAorCQkJCSAgJmlob3N0LT5wb3J0c1tTQ0lfTUFYX1BPUlRTXSwgaSk7CisJfQorCisJaWhvc3QtPmludmFsaWRfcGh5X21hc2sgPSAwOworCisJc2NpX2luaXRfdGltZXIoJmlob3N0LT50aW1lciwgY29udHJvbGxlcl90aW1lb3V0KTsKKworCS8qIEluaXRpYWxpemUgdGhlIFVzZXIgYW5kIE9FTSBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzLiAqLworCXNjaV9jb250cm9sbGVyX3NldF9kZWZhdWx0X2NvbmZpZ19wYXJhbWV0ZXJzKGlob3N0KTsKKworCXJldHVybiBzY2lfY29udHJvbGxlcl9yZXNldChpaG9zdCk7Cit9CisKK2ludCBzY2lfb2VtX3BhcmFtZXRlcnNfdmFsaWRhdGUoc3RydWN0IHNjaV9vZW1fcGFyYW1zICpvZW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QT1JUUzsgaSsrKQorCQlpZiAob2VtLT5wb3J0c1tpXS5waHlfbWFzayA+IFNDSUNfU0RTX1BBUk1fUEhZX01BU0tfTUFYKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QSFlTOyBpKyspCisJCWlmIChvZW0tPnBoeXNbaV0uc2FzX2FkZHJlc3MuaGlnaCA9PSAwICYmCisJCSAgICBvZW0tPnBoeXNbaV0uc2FzX2FkZHJlc3MubG93ID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvZW0tPmNvbnRyb2xsZXIubW9kZV90eXBlID09IFNDSUNfUE9SVF9BVVRPTUFUSUNfQ09ORklHVVJBVElPTl9NT0RFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykKKwkJCWlmIChvZW0tPnBvcnRzW2ldLnBoeV9tYXNrICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChvZW0tPmNvbnRyb2xsZXIubW9kZV90eXBlID09IFNDSUNfUE9SVF9NQU5VQUxfQ09ORklHVVJBVElPTl9NT0RFKSB7CisJCXU4IHBoeV9tYXNrID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QSFlTOyBpKyspCisJCQlwaHlfbWFzayB8PSBvZW0tPnBvcnRzW2ldLnBoeV9tYXNrOworCisJCWlmIChwaHlfbWFzayA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9lbS0+Y29udHJvbGxlci5tYXhfY29uY3VycmVudF9kZXZfc3Bpbl91cCA+IE1BWF9DT05DVVJSRU5UX0RFVklDRV9TUElOX1VQX0NPVU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9vZW1fcGFyYW1ldGVyc19zZXQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJdTMyIHN0YXRlID0gaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgPT0gU0NJQ19SRVNFVCB8fAorCSAgICBzdGF0ZSA9PSBTQ0lDX0lOSVRJQUxJWklORyB8fAorCSAgICBzdGF0ZSA9PSBTQ0lDX0lOSVRJQUxJWkVEKSB7CisKKwkJaWYgKHNjaV9vZW1fcGFyYW1ldGVyc192YWxpZGF0ZSgmaWhvc3QtPm9lbV9wYXJhbWV0ZXJzKSkKKwkJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRTsKKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7Cit9CisKK3N0YXRpYyB2b2lkIHBvd2VyX2NvbnRyb2xfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNjaV90aW1lciAqdG1yID0gKHN0cnVjdCBzY2lfdGltZXIgKilkYXRhOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gY29udGFpbmVyX29mKHRtciwgdHlwZW9mKCppaG9zdCksIHBvd2VyX2NvbnRyb2wudGltZXIpOworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKHRtci0+Y2FuY2VsKQorCQlnb3RvIGRvbmU7CisKKwlpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX2dyYW50ZWRfcG93ZXIgPSAwOworCisJaWYgKGlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfd2FpdGluZyA9PSAwKSB7CisJCWlob3N0LT5wb3dlcl9jb250cm9sLnRpbWVyX3N0YXJ0ZWQgPSBmYWxzZTsKKwkJZ290byBkb25lOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykgeworCisJCWlmIChpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX3dhaXRpbmcgPT0gMCkKKwkJCWJyZWFrOworCisJCWlwaHkgPSBpaG9zdC0+cG93ZXJfY29udHJvbC5yZXF1ZXN0ZXJzW2ldOworCQlpZiAoaXBoeSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKGlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlciA+PQorCQkgICAgaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXApCisJCQlicmVhazsKKworCQlpaG9zdC0+cG93ZXJfY29udHJvbC5yZXF1ZXN0ZXJzW2ldID0gTlVMTDsKKwkJaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c193YWl0aW5nLS07CisJCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlcisrOworCQlzY2lfcGh5X2NvbnN1bWVfcG93ZXJfaGFuZGxlcihpcGh5KTsKKwl9CisKKwkvKgorCSAqIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSBwb3dlciBsaXN0IGlzIGVtcHR5LCB3ZSBuZWVkIHRvIHN0YXJ0IHRoZQorCSAqIHRpbWVyIGluIGNhc2UgYW5vdGhlciBwaHkgYmVjb21lcyByZWFkeS4KKwkgKi8KKwlzY2lfbW9kX3RpbWVyKHRtciwgU0NJQ19TRFNfQ09OVFJPTExFUl9QT1dFUl9DT05UUk9MX0lOVEVSVkFMKTsKKwlpaG9zdC0+cG93ZXJfY29udHJvbC50aW1lcl9zdGFydGVkID0gdHJ1ZTsKKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcG93ZXJfY29udHJvbF9xdWV1ZV9pbnNlcnQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJQlVHX09OKGlwaHkgPT0gTlVMTCk7CisKKwlpZiAoaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c19ncmFudGVkX3Bvd2VyIDwKKwkgICAgaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXApIHsKKwkJaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c19ncmFudGVkX3Bvd2VyKys7CisJCXNjaV9waHlfY29uc3VtZV9wb3dlcl9oYW5kbGVyKGlwaHkpOworCisJCS8qCisJCSAqIHN0b3AgYW5kIHN0YXJ0IHRoZSBwb3dlcl9jb250cm9sIHRpbWVyLiBXaGVuIHRoZSB0aW1lciBmaXJlcywgdGhlCisJCSAqIG5vX29mX3BoeXNfZ3JhbnRlZF9wb3dlciB3aWxsIGJlIHNldCB0byAwCisJCSAqLworCQlpZiAoaWhvc3QtPnBvd2VyX2NvbnRyb2wudGltZXJfc3RhcnRlZCkKKwkJCXNjaV9kZWxfdGltZXIoJmlob3N0LT5wb3dlcl9jb250cm9sLnRpbWVyKTsKKworCQlzY2lfbW9kX3RpbWVyKCZpaG9zdC0+cG93ZXJfY29udHJvbC50aW1lciwKKwkJCQkgU0NJQ19TRFNfQ09OVFJPTExFUl9QT1dFUl9DT05UUk9MX0lOVEVSVkFMKTsKKwkJaWhvc3QtPnBvd2VyX2NvbnRyb2wudGltZXJfc3RhcnRlZCA9IHRydWU7CisKKwl9IGVsc2UgeworCQkvKiBBZGQgdGhlIHBoeSBpbiB0aGUgd2FpdGluZyBsaXN0ICovCisJCWlob3N0LT5wb3dlcl9jb250cm9sLnJlcXVlc3RlcnNbaXBoeS0+cGh5X2luZGV4XSA9IGlwaHk7CisJCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfd2FpdGluZysrOworCX0KK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9wb3dlcl9jb250cm9sX3F1ZXVlX3JlbW92ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICAgIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwlCVUdfT04oaXBoeSA9PSBOVUxMKTsKKworCWlmIChpaG9zdC0+cG93ZXJfY29udHJvbC5yZXF1ZXN0ZXJzW2lwaHktPnBoeV9pbmRleF0pCisJCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfd2FpdGluZy0tOworCisJaWhvc3QtPnBvd2VyX2NvbnRyb2wucmVxdWVzdGVyc1tpcGh5LT5waHlfaW5kZXhdID0gTlVMTDsKK30KKworI2RlZmluZSBBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkgMTAKKworLyogSW5pdGlhbGl6ZSB0aGUgQUZFIGZvciB0aGlzIHBoeSBpbmRleC4gV2UgbmVlZCB0byByZWFkIHRoZSBBRkUgc2V0dXAgZnJvbQorICogdGhlIE9FTSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2FmZV9pbml0aWFsaXphdGlvbihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwljb25zdCBzdHJ1Y3Qgc2NpX29lbV9wYXJhbXMgKm9lbSA9ICZpaG9zdC0+b2VtX3BhcmFtZXRlcnM7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpaG9zdC0+cGRldjsKKwl1MzIgYWZlX3N0YXR1czsKKwl1MzIgcGh5X2lkOworCisJLyogQ2xlYXIgREZYIFN0YXR1cyByZWdpc3RlcnMgKi8KKwl3cml0ZWwoMHgwMDgxMDAwZiwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuYWZlX2RmeF9tYXN0ZXJfY29udHJvbDApOworCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJaWYgKGlzX2IwKHBkZXYpKSB7CisJCS8qIFBNIFJ4IEVxdWFsaXphdGlvbiBTYXZlLCBQTSBTUGh5IFJ4IEFja25vd2xlZGdlbWVudAorCQkgKiBUaW1lciwgUE0gU3RhZ2dlciBUaW1lciAqLworCQl3cml0ZWwoMHgwMDA3QkZGRiwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuYWZlX3Btc25fbWFzdGVyX2NvbnRyb2wyKTsKKwkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisJfQorCisJLyogQ29uZmlndXJlIGJpYXMgY3VycmVudHMgdG8gbm9ybWFsICovCisJaWYgKGlzX2EyKHBkZXYpKQorCQl3cml0ZWwoMHgwMDAwNUEwMCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuYWZlX2JpYXNfY29udHJvbCk7CisJZWxzZSBpZiAoaXNfYjAocGRldikgfHwgaXNfYzAocGRldikpCisJCXdyaXRlbCgweDAwMDA1RjAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5hZmVfYmlhc19jb250cm9sKTsKKworCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJLyogRW5hYmxlIFBMTCAqLworCWlmIChpc19iMChwZGV2KSB8fCBpc19jMChwZGV2KSkKKwkJd3JpdGVsKDB4ODAwNDBBMDgsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLmFmZV9wbGxfY29udHJvbDApOworCWVsc2UKKwkJd3JpdGVsKDB4ODAwNDA5MDgsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLmFmZV9wbGxfY29udHJvbDApOworCisJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisKKwkvKiBXYWl0IGZvciB0aGUgUExMIHRvIGxvY2sgKi8KKwlkbyB7CisJCWFmZV9zdGF0dXMgPSByZWFkbCgmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5hZmVfY29tbW9uX2Jsb2NrX3N0YXR1cyk7CisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCX0gd2hpbGUgKChhZmVfc3RhdHVzICYgMHgwMDAwMTAwMCkgPT0gMCk7CisKKwlpZiAoaXNfYTIocGRldikpIHsKKwkJLyogU2hvcnRlbiBTQVMgU05XIGxvY2sgdGltZSAoUnhMb2NrIHRpbWVyIHZhbHVlIGZyb20gNzYgdXMgdG8gNTAgdXMpICovCisJCXdyaXRlbCgweDdiY2M5NmFkLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5hZmVfcG1zbl9tYXN0ZXJfY29udHJvbDApOworCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKwl9CisKKwlmb3IgKHBoeV9pZCA9IDA7IHBoeV9pZCA8IFNDSV9NQVhfUEhZUzsgcGh5X2lkKyspIHsKKwkJY29uc3Qgc3RydWN0IHNjaV9waHlfb2VtX3BhcmFtcyAqb2VtX3BoeSA9ICZvZW0tPnBoeXNbcGh5X2lkXTsKKworCQlpZiAoaXNfYjAocGRldikpIHsKKwkJCSAvKiBDb25maWd1cmUgdHJhbnNtaXR0ZXIgU1NDIHBhcmFtZXRlcnMgKi8KKwkJCXdyaXRlbCgweDAwMDMwMDAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfdHhfc3NjX2NvbnRyb2wpOworCQkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisJCX0gZWxzZSBpZiAoaXNfYzAocGRldikpIHsKKwkJCSAvKiBDb25maWd1cmUgdHJhbnNtaXR0ZXIgU1NDIHBhcmFtZXRlcnMgKi8KKwkJCXdyaXRlbCgweDAwMDMwMDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV90eF9zc2NfY29udHJvbCk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQkJLyoKKwkJCSAqIEFsbCBkZWZhdWx0cywgZXhjZXB0IHRoZSBSZWNlaXZlIFdvcmQgQWxpZ25hbWVudC9Db21tYSBEZXRlY3QKKwkJCSAqIEVuYWJsZS4uLi4oMHhlODAwKSAqLworCQkJd3JpdGVsKDB4MDAwMDQ1MDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV94Y3ZyX2NvbnRyb2wwKTsKKwkJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEFsbCBkZWZhdWx0cywgZXhjZXB0IHRoZSBSZWNlaXZlIFdvcmQgQWxpZ25hbWVudC9Db21tYSBEZXRlY3QKKwkJCSAqIEVuYWJsZS4uLi4oMHhlODAwKSAqLworCQkJd3JpdGVsKDB4MDAwMDQ1MTIsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV94Y3ZyX2NvbnRyb2wwKTsKKwkJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCQl3cml0ZWwoMHgwMDUwMTAwRiwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3hjdnJfY29udHJvbDEpOworCQkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisJCX0KKworCQkvKgorCQkgKiBQb3dlciB1cCBUWCBhbmQgUlggb3V0IGZyb20gcG93ZXIgZG93biAoUFdSRE5UWCBhbmQgUFdSRE5SWCkKKwkJICogJiBpbmNyZWFzZSBUWCBpbnQgJiBleHQgYmlhcyAyMCUuLi4uKDB4ZTg1YykgKi8KKwkJaWYgKGlzX2EyKHBkZXYpKQorCQkJd3JpdGVsKDB4MDAwMDAzRjAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV9jaGFubmVsX2NvbnRyb2wpOworCQllbHNlIGlmIChpc19iMChwZGV2KSkgeworCQkJIC8qIFBvd2VyIGRvd24gVFggYW5kIFJYIChQV1JETlRYIGFuZCBQV1JETlJYKSAqLworCQkJd3JpdGVsKDB4MDAwMDAzRDcsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV9jaGFubmVsX2NvbnRyb2wpOworCQkJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7CisKKwkJCS8qCisJCQkgKiBQb3dlciB1cCBUWCBhbmQgUlggb3V0IGZyb20gcG93ZXIgZG93biAoUFdSRE5UWCBhbmQgUFdSRE5SWCkKKwkJCSAqICYgaW5jcmVhc2UgVFggaW50ICYgZXh0IGJpYXMgMjAlLi4uLigweGU4NWMpICovCisJCQl3cml0ZWwoMHgwMDAwMDNENCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX2NoYW5uZWxfY29udHJvbCk7CisJCX0gZWxzZSB7CisJCQl3cml0ZWwoMHgwMDAwMDFFNywgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX2NoYW5uZWxfY29udHJvbCk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQkJLyoKKwkJCSAqIFBvd2VyIHVwIFRYIGFuZCBSWCBvdXQgZnJvbSBwb3dlciBkb3duIChQV1JETlRYIGFuZCBQV1JETlJYKQorCQkJICogJiBpbmNyZWFzZSBUWCBpbnQgJiBleHQgYmlhcyAyMCUuLi4uKDB4ZTg1YykgKi8KKwkJCXdyaXRlbCgweDAwMDAwMUU0LCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfY2hhbm5lbF9jb250cm9sKTsKKwkJfQorCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQlpZiAoaXNfYTIocGRldikpIHsKKwkJCS8qIEVuYWJsZSBUWCBlcXVhbGl6YXRpb24gKDB4ZTgyNCkgKi8KKwkJCXdyaXRlbCgweDAwMDQwMDAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfdHhfY29udHJvbCk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKwkJfQorCisJCS8qCisJCSAqIFJEUEk9MHgwKFJYIFBvd2VyIE9uKSwgUlhPT0JERVRQRE5DPTB4MCwgVFBEPTB4MChUWCBQb3dlciBPbiksCisJCSAqIFJERD0weDAoUlggRGV0ZWN0IEVuYWJsZWQpIC4uLi4oMHhlODAwKSAqLworCQl3cml0ZWwoMHgwMDAwNDEwMCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3hjdnJfY29udHJvbDApOworCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQkvKiBMZWF2ZSBERkUvRkZFIG9uICovCisJCWlmIChpc19hMihwZGV2KSkKKwkJCXdyaXRlbCgweDNGMTExMDNGLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfcnhfc3NjX2NvbnRyb2wwKTsKKwkJZWxzZSBpZiAoaXNfYjAocGRldikpIHsKKwkJCXdyaXRlbCgweDNGMTExMDNGLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfcnhfc3NjX2NvbnRyb2wwKTsKKwkJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCQkJLyogRW5hYmxlIFRYIGVxdWFsaXphdGlvbiAoMHhlODI0KSAqLworCQkJd3JpdGVsKDB4MDAwNDAwMDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV90eF9jb250cm9sKTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlbCgweDAxNDBERjBGLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5zY3VfYWZlX3hjdnJbcGh5X2lkXS5hZmVfcnhfc3NjX2NvbnRyb2wxKTsKKwkJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCQl3cml0ZWwoMHgzRjZGMTAzRiwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3J4X3NzY19jb250cm9sMCk7CisJCQl1ZGVsYXkoQUZFX1JFR0lTVEVSX1dSSVRFX0RFTEFZKTsKKworCQkJLyogRW5hYmxlIFRYIGVxdWFsaXphdGlvbiAoMHhlODI0KSAqLworCQkJd3JpdGVsKDB4MDAwNDAwMDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+YWZlLnNjdV9hZmVfeGN2cltwaHlfaWRdLmFmZV90eF9jb250cm9sKTsKKwkJfQorCisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCXdyaXRlbChvZW1fcGh5LT5hZmVfdHhfYW1wX2NvbnRyb2wwLAorCQkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3R4X2FtcF9jb250cm9sMCk7CisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCXdyaXRlbChvZW1fcGh5LT5hZmVfdHhfYW1wX2NvbnRyb2wxLAorCQkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3R4X2FtcF9jb250cm9sMSk7CisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCXdyaXRlbChvZW1fcGh5LT5hZmVfdHhfYW1wX2NvbnRyb2wyLAorCQkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3R4X2FtcF9jb250cm9sMik7CisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCisJCXdyaXRlbChvZW1fcGh5LT5hZmVfdHhfYW1wX2NvbnRyb2wzLAorCQkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5hZmUuc2N1X2FmZV94Y3ZyW3BoeV9pZF0uYWZlX3R4X2FtcF9jb250cm9sMyk7CisJCXVkZWxheShBRkVfUkVHSVNURVJfV1JJVEVfREVMQVkpOworCX0KKworCS8qIFRyYW5zZmVyIGNvbnRyb2wgdG8gdGhlIFBFcyAqLworCXdyaXRlbCgweDAwMDEwZjAwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPmFmZS5hZmVfZGZ4X21hc3Rlcl9jb250cm9sMCk7CisJdWRlbGF5KEFGRV9SRUdJU1RFUl9XUklURV9ERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2luaXRpYWxpemVfcG93ZXJfY29udHJvbChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlzY2lfaW5pdF90aW1lcigmaWhvc3QtPnBvd2VyX2NvbnRyb2wudGltZXIsIHBvd2VyX2NvbnRyb2xfdGltZW91dCk7CisKKwltZW1zZXQoaWhvc3QtPnBvd2VyX2NvbnRyb2wucmVxdWVzdGVycywgMCwKKwkgICAgICAgc2l6ZW9mKGlob3N0LT5wb3dlcl9jb250cm9sLnJlcXVlc3RlcnMpKTsKKworCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfd2FpdGluZyA9IDA7CisJaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c19ncmFudGVkX3Bvd2VyID0gMDsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9pbml0aWFsaXplKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpaG9zdC0+c207CisJZW51bSBzY2lfc3RhdHVzIHJlc3VsdCA9IFNDSV9GQUlMVVJFOworCXVuc2lnbmVkIGxvbmcgaSwgc3RhdGUsIHZhbDsKKworCWlmIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCAhPSBTQ0lDX1JFU0VUKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICJTQ0lDIENvbnRyb2xsZXIgaW5pdGlhbGl6ZSBvcGVyYXRpb24gcmVxdWVzdGVkICIKKwkJCSAiaW4gaW52YWxpZCBzdGF0ZVxuIik7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSUNfSU5JVElBTElaSU5HKTsKKworCXNjaV9pbml0X3RpbWVyKCZpaG9zdC0+cGh5X3RpbWVyLCBwaHlfc3RhcnR1cF90aW1lb3V0KTsKKworCWlob3N0LT5uZXh0X3BoeV90b19zdGFydCA9IDA7CisJaWhvc3QtPnBoeV9zdGFydHVwX3RpbWVyX3BlbmRpbmcgPSBmYWxzZTsKKworCXNjaV9jb250cm9sbGVyX2luaXRpYWxpemVfcG93ZXJfY29udHJvbChpaG9zdCk7CisKKwkvKgorCSAqIFRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZSBmb3IgQjAgc2luY2Ugd2UgZG8gbm90IGhhdmUgdG8KKwkgKiBwcm9ncmFtIHRoZSBBRkUgcmVnaXN0ZXJzLgorCSAqIC8gQHRvZG8gVGhlIEFGRSBzZXR0aW5ncyBhcmUgc3VwcG9zZWQgdG8gYmUgY29ycmVjdCBmb3IgdGhlIEIwIGJ1dAorCSAqIC8gICAgICAgcHJlc2VudGx5IHRoZXkgc2VlbSB0byBiZSB3cm9uZy4gKi8KKwlzY2lfY29udHJvbGxlcl9hZmVfaW5pdGlhbGl6YXRpb24oaWhvc3QpOworCisKKwkvKiBUYWtlIHRoZSBoYXJkd2FyZSBvdXQgb2YgcmVzZXQgKi8KKwl3cml0ZWwoMCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5zb2Z0X3Jlc2V0X2NvbnRyb2wpOworCisJLyoKKwkgKiAvIEB0b2RvIFByb3ZpZGUgbWVhbmluZ2Z1bGwgZXJyb3IgY29kZSBmb3IgaGFyZHdhcmUgZmFpbHVyZQorCSAqIHJlc3VsdCA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfSEFSRFdBUkU7ICovCisJZm9yIChpID0gMTAwOyBpID49IDE7IGktLSkgeworCQl1MzIgc3RhdHVzOworCisJCS8qIExvb3AgdW50aWwgdGhlIGhhcmR3YXJlIHJlcG9ydHMgc3VjY2VzcyAqLworCQl1ZGVsYXkoU0NVX0NPTlRFWFRfUkFNX0lOSVRfU1RBTExfVElNRSk7CisJCXN0YXR1cyA9IHJlYWRsKCZpaG9zdC0+c211X3JlZ2lzdGVycy0+Y29udHJvbF9zdGF0dXMpOworCisJCWlmICgoc3RhdHVzICYgU0NVX1JBTV9JTklUX0NPTVBMRVRFRCkgPT0gU0NVX1JBTV9JTklUX0NPTVBMRVRFRCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qCisJICogRGV0ZXJtaW5lIHdoYXQgYXJlIHRoZSBhY3RhdWwgZGV2aWNlIGNhcGFjaXRpZXMgdGhhdCB0aGUKKwkgKiBoYXJkd2FyZSB3aWxsIHN1cHBvcnQgKi8KKwl2YWwgPSByZWFkbCgmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmRldmljZV9jb250ZXh0X2NhcGFjaXR5KTsKKworCS8qIFJlY29yZCB0aGUgc21hbGxlciBvZiB0aGUgdHdvIGNhcGFjaXR5IHZhbHVlcyAqLworCWlob3N0LT5sb2dpY2FsX3BvcnRfZW50cmllcyA9IG1pbihzbXVfbWF4X3BvcnRzKHZhbCksIFNDSV9NQVhfUE9SVFMpOworCWlob3N0LT50YXNrX2NvbnRleHRfZW50cmllcyA9IG1pbihzbXVfbWF4X3Rhc2tfY29udGV4dHModmFsKSwgU0NJX01BWF9JT19SRVFVRVNUUyk7CisJaWhvc3QtPnJlbW90ZV9ub2RlX2VudHJpZXMgPSBtaW4oc211X21heF9ybmNzKHZhbCksIFNDSV9NQVhfUkVNT1RFX0RFVklDRVMpOworCisJLyoKKwkgKiBNYWtlIGFsbCBQRXMgdGhhdCBhcmUgdW5hc3NpZ25lZCBtYXRjaCB1cCB3aXRoIHRoZQorCSAqIGxvZ2ljYWwgcG9ydHMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWhvc3QtPmxvZ2ljYWxfcG9ydF9lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IHNjdV9wb3J0X3Rhc2tfc2NoZWR1bGVyX2dyb3VwX3JlZ2lzdGVycyBfX2lvbWVtCisJCQkqcHRzZyA9ICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+cGVnMC5wdHNnOworCisJCXdyaXRlbChpLCAmcHRzZy0+cHJvdG9jb2xfZW5naW5lW2ldKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlIFBDSSBSZWxheGVkIG9yZGVyaW5nIGluIERNQSBlbmdpbmVzICovCisJdmFsID0gcmVhZGwoJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnBkbWFfY29uZmlndXJhdGlvbik7CisJdmFsIHw9IFNDVV9QRE1BQ1JfR0VOX0JJVChQQ0lfUkVMQVhFRF9PUkRFUklOR19FTkFCTEUpOworCXdyaXRlbCh2YWwsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS5wZG1hX2NvbmZpZ3VyYXRpb24pOworCisJdmFsID0gcmVhZGwoJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLmNkbWFfY29uZmlndXJhdGlvbik7CisJdmFsIHw9IFNDVV9DRE1BQ1JfR0VOX0JJVChQQ0lfUkVMQVhFRF9PUkRFUklOR19FTkFCTEUpOworCXdyaXRlbCh2YWwsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS5jZG1hX2NvbmZpZ3VyYXRpb24pOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBQSFlzIGJlZm9yZSB0aGUgUE9SVHMgYmVjYXVzZSB0aGUgUEhZIHJlZ2lzdGVycworCSAqIGFyZSBhY2Nlc3NlZCBkdXJpbmcgdGhlIHBvcnQgaW5pdGlhbGl6YXRpb24uCisJICovCisJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUEhZUzsgaSsrKSB7CisJCXJlc3VsdCA9IHNjaV9waHlfaW5pdGlhbGl6ZSgmaWhvc3QtPnBoeXNbaV0sCisJCQkJCSAgICAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAucGVbaV0udGwsCisJCQkJCSAgICAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAucGVbaV0ubGwpOworCQlpZiAocmVzdWx0ICE9IFNDSV9TVUNDRVNTKQorCQkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGlob3N0LT5sb2dpY2FsX3BvcnRfZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gJmlob3N0LT5wb3J0c1tpXTsKKworCQlpcG9ydC0+cG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMgPSAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAucHRzZy5wb3J0W2ldOworCQlpcG9ydC0+cG9ydF9wZV9jb25maWd1cmF0aW9uX3JlZ2lzdGVyID0gJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnB0c2cucHJvdG9jb2xfZW5naW5lWzBdOworCQlpcG9ydC0+dmlpdF9yZWdpc3RlcnMgPSAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAudmlpdFtpXTsKKwl9CisKKwlyZXN1bHQgPSBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X2luaXRpYWxpemUoaWhvc3QsICZpaG9zdC0+cG9ydF9hZ2VudCk7CisKKyBvdXQ6CisJLyogQWR2YW5jZSB0aGUgY29udHJvbGxlciBzdGF0ZSBtYWNoaW5lICovCisJaWYgKHJlc3VsdCA9PSBTQ0lfU1VDQ0VTUykKKwkJc3RhdGUgPSBTQ0lDX0lOSVRJQUxJWkVEOworCWVsc2UKKwkJc3RhdGUgPSBTQ0lDX0ZBSUxFRDsKKwlzY2lfY2hhbmdlX3N0YXRlKHNtLCBzdGF0ZSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV91c2VyX3BhcmFtZXRlcnNfc2V0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICAgICAgc3RydWN0IHNjaV91c2VyX3BhcmFtZXRlcnMgKnNjaV9wYXJtcykKK3sKKwl1MzIgc3RhdGUgPSBpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZDsKKworCWlmIChzdGF0ZSA9PSBTQ0lDX1JFU0VUIHx8CisJICAgIHN0YXRlID09IFNDSUNfSU5JVElBTElaSU5HIHx8CisJICAgIHN0YXRlID09IFNDSUNfSU5JVElBTElaRUQpIHsKKwkJdTE2IGluZGV4OworCisJCS8qCisJCSAqIFZhbGlkYXRlIHRoZSB1c2VyIHBhcmFtZXRlcnMuICBJZiB0aGV5IGFyZSBub3QgbGVnYWwsIHRoZW4KKwkJICogcmV0dXJuIGEgZmFpbHVyZS4KKwkJICovCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQkJc3RydWN0IHNjaV9waHlfdXNlcl9wYXJhbXMgKnVzZXJfcGh5OworCisJCQl1c2VyX3BoeSA9ICZzY2lfcGFybXMtPnBoeXNbaW5kZXhdOworCisJCQlpZiAoISgodXNlcl9waHktPm1heF9zcGVlZF9nZW5lcmF0aW9uIDw9CisJCQkJCQlTQ0lDX1NEU19QQVJNX01BWF9TUEVFRCkgJiYKKwkJCSAgICAgICh1c2VyX3BoeS0+bWF4X3NwZWVkX2dlbmVyYXRpb24gPgorCQkJCQkJU0NJQ19TRFNfUEFSTV9OT19TUEVFRCkpKQorCQkJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRTsKKworCQkJaWYgKHVzZXJfcGh5LT5pbl9jb25uZWN0aW9uX2FsaWduX2luc2VydGlvbl9mcmVxdWVuY3kgPAorCQkJCQkzKQorCQkJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRTsKKworCQkJaWYgKCh1c2VyX3BoeS0+aW5fY29ubmVjdGlvbl9hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5IDwKKwkJCQkJCTMpIHx8CisJCQkgICAgKHVzZXJfcGh5LT5hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5ID09IDApIHx8CisJCQkgICAgKHVzZXJfcGh5LT4KKwkJCQlub3RpZnlfZW5hYmxlX3NwaW5fdXBfaW5zZXJ0aW9uX2ZyZXF1ZW5jeSA9PQorCQkJCQkJMCkpCisJCQkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFOworCQl9CisKKwkJaWYgKChzY2lfcGFybXMtPnN0cF9pbmFjdGl2aXR5X3RpbWVvdXQgPT0gMCkgfHwKKwkJICAgIChzY2lfcGFybXMtPnNzcF9pbmFjdGl2aXR5X3RpbWVvdXQgPT0gMCkgfHwKKwkJICAgIChzY2lfcGFybXMtPnN0cF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQgPT0gMCkgfHwKKwkJICAgIChzY2lfcGFybXMtPnNzcF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQgPT0gMCkgfHwKKwkJICAgIChzY2lfcGFybXMtPm5vX291dGJvdW5kX3Rhc2tfdGltZW91dCA9PSAwKSkKKwkJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRTsKKworCQltZW1jcHkoJmlob3N0LT51c2VyX3BhcmFtZXRlcnMsIHNjaV9wYXJtcywgc2l6ZW9mKCpzY2lfcGFybXMpKTsKKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7Cit9CisKK3N0YXRpYyBpbnQgc2NpX2NvbnRyb2xsZXJfbWVtX2luaXQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlob3N0LT5wZGV2LT5kZXY7CisJZG1hX2FkZHJfdCBkbWE7CisJc2l6ZV90IHNpemU7CisJaW50IGVycjsKKworCXNpemUgPSBTQ1VfTUFYX0NPTVBMRVRJT05fUVVFVUVfRU5UUklFUyAqIHNpemVvZih1MzIpOworCWlob3N0LT5jb21wbGV0aW9uX3F1ZXVlID0gZG1hbV9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsICZkbWEsIEdGUF9LRVJORUwpOworCWlmICghaWhvc3QtPmNvbXBsZXRpb25fcXVldWUpCisJCXJldHVybiAtRU5PTUVNOworCisJd3JpdGVsKGxvd2VyXzMyX2JpdHMoZG1hKSwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5jb21wbGV0aW9uX3F1ZXVlX2xvd2VyKTsKKwl3cml0ZWwodXBwZXJfMzJfYml0cyhkbWEpLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmNvbXBsZXRpb25fcXVldWVfdXBwZXIpOworCisJc2l6ZSA9IGlob3N0LT5yZW1vdGVfbm9kZV9lbnRyaWVzICogc2l6ZW9mKHVuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0KTsKKwlpaG9zdC0+cmVtb3RlX25vZGVfY29udGV4dF90YWJsZSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCAmZG1hLAorCQkJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWlob3N0LT5yZW1vdGVfbm9kZV9jb250ZXh0X3RhYmxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdyaXRlbChsb3dlcl8zMl9iaXRzKGRtYSksICZpaG9zdC0+c211X3JlZ2lzdGVycy0+cmVtb3RlX25vZGVfY29udGV4dF9sb3dlcik7CisJd3JpdGVsKHVwcGVyXzMyX2JpdHMoZG1hKSwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5yZW1vdGVfbm9kZV9jb250ZXh0X3VwcGVyKTsKKworCXNpemUgPSBpaG9zdC0+dGFza19jb250ZXh0X2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IHNjdV90YXNrX2NvbnRleHQpLAorCWlob3N0LT50YXNrX2NvbnRleHRfdGFibGUgPSBkbWFtX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgJmRtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpaG9zdC0+dGFza19jb250ZXh0X3RhYmxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlob3N0LT50YXNrX2NvbnRleHRfZG1hID0gZG1hOworCXdyaXRlbChsb3dlcl8zMl9iaXRzKGRtYSksICZpaG9zdC0+c211X3JlZ2lzdGVycy0+aG9zdF90YXNrX3RhYmxlX2xvd2VyKTsKKwl3cml0ZWwodXBwZXJfMzJfYml0cyhkbWEpLCAmaWhvc3QtPnNtdV9yZWdpc3RlcnMtPmhvc3RfdGFza190YWJsZV91cHBlcik7CisKKwllcnIgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9jb25zdHJ1Y3QoaWhvc3QpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIEluZm9ybSB0aGUgc2lsaWNvbiBhcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIFVGIGhlYWRlcnMgYW5kCisJICogYWRkcmVzcyB0YWJsZS4KKwkgKi8KKwl3cml0ZWwobG93ZXJfMzJfYml0cyhpaG9zdC0+dWZfY29udHJvbC5oZWFkZXJzLnBoeXNpY2FsX2FkZHJlc3MpLAorCQkmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnNkbWEudWZfaGVhZGVyX2Jhc2VfYWRkcmVzc19sb3dlcik7CisJd3JpdGVsKHVwcGVyXzMyX2JpdHMoaWhvc3QtPnVmX2NvbnRyb2wuaGVhZGVycy5waHlzaWNhbF9hZGRyZXNzKSwKKwkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVmX2hlYWRlcl9iYXNlX2FkZHJlc3NfdXBwZXIpOworCisJd3JpdGVsKGxvd2VyXzMyX2JpdHMoaWhvc3QtPnVmX2NvbnRyb2wuYWRkcmVzc190YWJsZS5waHlzaWNhbF9hZGRyZXNzKSwKKwkJJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5zZG1hLnVmX2FkZHJlc3NfdGFibGVfbG93ZXIpOworCXdyaXRlbCh1cHBlcl8zMl9iaXRzKGlob3N0LT51Zl9jb250cm9sLmFkZHJlc3NfdGFibGUucGh5c2ljYWxfYWRkcmVzcyksCisJCSZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+c2RtYS51Zl9hZGRyZXNzX3RhYmxlX3VwcGVyKTsKKworCXJldHVybiAwOworfQorCitpbnQgaXNjaV9ob3N0X2luaXQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJaW50IGVyciA9IDAsIGk7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3Qgc2NpX3VzZXJfcGFyYW1ldGVycyBzY2lfdXNlcl9wYXJhbXM7CisJc3RydWN0IGlzY2lfcGNpX2luZm8gKnBjaV9pbmZvID0gdG9fcGNpX2luZm8oaWhvc3QtPnBkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJmlob3N0LT5zdGF0ZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWhvc3QtPnNjaWNfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaWhvc3QtPmV2ZW50cSk7CisKKwlpc2NpX2hvc3RfY2hhbmdlX3N0YXRlKGlob3N0LCBpc2NpX3N0YXJ0aW5nKTsKKworCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX2NvbnN0cnVjdChpaG9zdCwgc2N1X2Jhc2UoaWhvc3QpLAorCQkJCQkgIHNtdV9iYXNlKGlob3N0KSk7CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IHNjaV9jb250cm9sbGVyX2NvbnN0cnVjdCBmYWlsZWQgLSBzdGF0dXMgPSAleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJc3RhdHVzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWhvc3QtPnNhc19oYS5kZXYgPSAmaWhvc3QtPnBkZXYtPmRldjsKKwlpaG9zdC0+c2FzX2hhLmxsZGRfaGEgPSBpaG9zdDsKKworCS8qCisJICogZ3JhYiBpbml0aWFsIHZhbHVlcyBzdG9yZWQgaW4gdGhlIGNvbnRyb2xsZXIgb2JqZWN0IGZvciBPRU0gYW5kIFVTRVIKKwkgKiBwYXJhbWV0ZXJzCisJICovCisJaXNjaV91c2VyX3BhcmFtZXRlcnNfZ2V0KCZzY2lfdXNlcl9wYXJhbXMpOworCXN0YXR1cyA9IHNjaV91c2VyX3BhcmFtZXRlcnNfc2V0KGlob3N0LCAmc2NpX3VzZXJfcGFyYW1zKTsKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogc2NpX3VzZXJfcGFyYW1ldGVyc19zZXQgZmFpbGVkXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogZ3JhYiBhbnkgT0VNIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIG9yb20gKi8KKwlpZiAocGNpX2luZm8tPm9yb20pIHsKKwkJc3RhdHVzID0gaXNjaV9wYXJzZV9vZW1fcGFyYW1ldGVycygmaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLAorCQkJCQkJICAgcGNpX2luZm8tPm9yb20sCisJCQkJCQkgICBpaG9zdC0+aWQpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkgInBhcnNpbmcgZmlybXdhcmUgb2VtIHBhcmFtZXRlcnMgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJc3RhdHVzID0gc2NpX29lbV9wYXJhbWV0ZXJzX3NldChpaG9zdCk7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IHNjaV9vZW1fcGFyYW1ldGVyc19zZXQgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdGFza2xldF9pbml0KCZpaG9zdC0+Y29tcGxldGlvbl90YXNrbGV0LAorCQkgICAgIGlzY2lfaG9zdF9jb21wbGV0aW9uX3JvdXRpbmUsICh1bnNpZ25lZCBsb25nKWlob3N0KTsKKworCUlOSVRfTElTVF9IRUFEKCZpaG9zdC0+cmVxdWVzdHNfdG9fY29tcGxldGUpOworCUlOSVRfTElTVF9IRUFEKCZpaG9zdC0+cmVxdWVzdHNfdG9fZXJyb3JiYWNrKTsKKworCXNwaW5fbG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOworCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX2luaXRpYWxpemUoaWhvc3QpOworCXNwaW5fdW5sb2NrX2lycSgmaWhvc3QtPnNjaWNfbG9jayk7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHNjaV9jb250cm9sbGVyX2luaXRpYWxpemUgZmFpbGVkIC0iCisJCQkgIiBzdGF0dXMgPSAweCV4XG4iLAorCQkJIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllcnIgPSBzY2lfY29udHJvbGxlcl9tZW1faW5pdChpaG9zdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BPUlRTOyBpKyspCisJCWlzY2lfcG9ydF9pbml0KCZpaG9zdC0+cG9ydHNbaV0sIGlob3N0LCBpKTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykKKwkJaXNjaV9waHlfaW5pdCgmaWhvc3QtPnBoeXNbaV0sIGlob3N0LCBpKTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9ICZpaG9zdC0+ZGV2aWNlc1tpXTsKKworCQlJTklUX0xJU1RfSEVBRCgmaWRldi0+cmVxc19pbl9wcm9jZXNzKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmlkZXYtPm5vZGUpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX0lPX1JFUVVFU1RTOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcTsKKwkJZG1hX2FkZHJfdCBkbWE7CisKKwkJaXJlcSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXNjaV9yZXF1ZXN0KSwgJmRtYSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJCWlmICghaXJlcSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlyZXEtPnRjID0gJmlob3N0LT50YXNrX2NvbnRleHRfdGFibGVbaV07CisJCWlyZXEtPm93bmluZ19jb250cm9sbGVyID0gaWhvc3Q7CisJCXNwaW5fbG9ja19pbml0KCZpcmVxLT5zdGF0ZV9sb2NrKTsKKwkJaXJlcS0+cmVxdWVzdF9kYWRkciA9IGRtYTsKKwkJaXJlcS0+aXNjaV9ob3N0ID0gaWhvc3Q7CisJCWlob3N0LT5yZXFzW2ldID0gaXJlcTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9saW5rX3VwKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCSAgICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJc3dpdGNoIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCkgeworCWNhc2UgU0NJQ19TVEFSVElORzoKKwkJc2NpX2RlbF90aW1lcigmaWhvc3QtPnBoeV90aW1lcik7CisJCWlob3N0LT5waHlfc3RhcnR1cF90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisJCWlob3N0LT5wb3J0X2FnZW50LmxpbmtfdXBfaGFuZGxlcihpaG9zdCwgJmlob3N0LT5wb3J0X2FnZW50LAorCQkJCQkJICBpcG9ydCwgaXBoeSk7CisJCXNjaV9jb250cm9sbGVyX3N0YXJ0X25leHRfcGh5KGlob3N0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0lDX1JFQURZOgorCQlpaG9zdC0+cG9ydF9hZ2VudC5saW5rX3VwX2hhbmRsZXIoaWhvc3QsICZpaG9zdC0+cG9ydF9hZ2VudCwKKwkJCQkJCSAgaXBvcnQsIGlwaHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBTQ0lDIENvbnRyb2xsZXIgbGlua3VwIGV2ZW50IGZyb20gcGh5ICVkIGluICIKKwkJCSJ1bmV4cGVjdGVkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgaXBoeS0+cGh5X2luZGV4LAorCQkJaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQpOworCX0KK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9saW5rX2Rvd24oc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJICAgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXN3aXRjaCAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQpIHsKKwljYXNlIFNDSUNfU1RBUlRJTkc6CisJY2FzZSBTQ0lDX1JFQURZOgorCQlpaG9zdC0+cG9ydF9hZ2VudC5saW5rX2Rvd25faGFuZGxlcihpaG9zdCwgJmlob3N0LT5wb3J0X2FnZW50LAorCQkJCQkJICAgaXBvcnQsIGlwaHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBTQ0lDIENvbnRyb2xsZXIgbGlua2Rvd24gZXZlbnQgZnJvbSBwaHkgJWQgaW4gIgorCQkJInVuZXhwZWN0ZWQgc3RhdGUgJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWlwaHktPnBoeV9pbmRleCwKKwkJCWlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIHNjaV9jb250cm9sbGVyX2hhc19yZW1vdGVfZGV2aWNlc19zdG9wcGluZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MzIgaW5kZXg7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBpaG9zdC0+cmVtb3RlX25vZGVfZW50cmllczsgaW5kZXgrKykgeworCQlpZiAoKGlob3N0LT5kZXZpY2VfdGFibGVbaW5kZXhdICE9IE5VTEwpICYmCisJCSAgIChpaG9zdC0+ZGV2aWNlX3RhYmxlW2luZGV4XS0+c20uY3VycmVudF9zdGF0ZV9pZCA9PSBTQ0lfREVWX1NUT1BQSU5HKSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9yZW1vdGVfZGV2aWNlX3N0b3BwZWQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlpZiAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQgIT0gU0NJQ19TVE9QUElORykgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIlNDSUMgQ29udHJvbGxlciAweCVwIHJlbW90ZSBkZXZpY2Ugc3RvcHBlZCBldmVudCAiCisJCQkiZnJvbSBkZXZpY2UgMHglcCBpbiB1bmV4cGVjdGVkIHN0YXRlICVkXG4iLAorCQkJaWhvc3QsIGlkZXYsCisJCQlpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXNjaV9jb250cm9sbGVyX2hhc19yZW1vdGVfZGV2aWNlc19zdG9wcGluZyhpaG9zdCkpCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlob3N0LT5zbSwgU0NJQ19TVE9QUEVEKTsKK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3Qoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUzMiByZXF1ZXN0KQoreworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlc1slZF06ICUjeFxuIiwKKwkJX19mdW5jX18sIGlob3N0LT5pZCwgcmVxdWVzdCk7CisKKwl3cml0ZWwocmVxdWVzdCwgJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5wb3N0X2NvbnRleHRfcG9ydCk7Cit9CisKK3N0cnVjdCBpc2NpX3JlcXVlc3QgKnNjaV9yZXF1ZXN0X2J5X3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTE2IGlvX3RhZykKK3sKKwl1MTYgdGFza19pbmRleDsKKwl1MTYgdGFza19zZXF1ZW5jZTsKKworCXRhc2tfaW5kZXggPSBJU0NJX1RBR19UQ0koaW9fdGFnKTsKKworCWlmICh0YXNrX2luZGV4IDwgaWhvc3QtPnRhc2tfY29udGV4dF9lbnRyaWVzKSB7CisJCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBpaG9zdC0+cmVxc1t0YXNrX2luZGV4XTsKKworCQlpZiAodGVzdF9iaXQoSVJFUV9BQ1RJVkUsICZpcmVxLT5mbGFncykpIHsKKwkJCXRhc2tfc2VxdWVuY2UgPSBJU0NJX1RBR19TRVEoaW9fdGFnKTsKKworCQkJaWYgKHRhc2tfc2VxdWVuY2UgPT0gaWhvc3QtPmlvX3JlcXVlc3Rfc2VxdWVuY2VbdGFza19pbmRleF0pCisJCQkJcmV0dXJuIGlyZXE7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBUaGlzIG1ldGhvZCBhbGxvY2F0ZXMgcmVtb3RlIG5vZGUgaW5kZXggYW5kIHRoZSByZXNlcnZlcyB0aGUgcmVtb3RlIG5vZGUKKyAqICAgIGNvbnRleHQgc3BhY2UgZm9yIHVzZS4gVGhpcyBtZXRob2QgY2FuIGZhaWwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcmVtb3RlCisgKiAgICBub2RlIGluZGV4IGF2YWlsYWJsZS4KKyAqIEBzY2ljOiBUaGlzIGlzIHRoZSBjb250cm9sbGVyIG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgc2V0IG9mCisgKiAgICBmcmVlIHJlbW90ZSBub2RlIGlkcworICogQHNjaV9kZXY6IFRoaXMgaXMgdGhlIGRldmljZSBvYmplY3Qgd2hpY2ggaXMgcmVxdWVzdGluZyB0aGUgYSByZW1vdGUgbm9kZQorICogICAgaWQKKyAqIEBub2RlX2lkOiBUaGlzIGlzIHRoZSByZW1vdGUgbm9kZSBpZCB0aGF0IGlzIGFzc2luZ2VkIHRvIHRoZSBkZXZpY2UgaWYgb25lCisgKiAgICBpcyBhdmFpbGFibGUKKyAqCisgKiBlbnVtIHNjaV9zdGF0dXMgU0NJX0ZBSUxVUkVfT1VUX09GX1JFU09VUkNFUyBpZiB0aGVyZSBhcmUgbm8gYXZhaWxhYmxlIHJlbW90ZQorICogbm9kZSBpbmRleCBhdmFpbGFibGUuCisgKi8KK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9hbGxvY2F0ZV9yZW1vdGVfbm9kZV9jb250ZXh0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkJCSAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJCSAgICB1MTYgKm5vZGVfaWQpCit7CisJdTE2IG5vZGVfaW5kZXg7CisJdTMyIHJlbW90ZV9ub2RlX2NvdW50ID0gc2NpX3JlbW90ZV9kZXZpY2Vfbm9kZV9jb3VudChpZGV2KTsKKworCW5vZGVfaW5kZXggPSBzY2lfcmVtb3RlX25vZGVfdGFibGVfYWxsb2NhdGVfcmVtb3RlX25vZGUoCisJCSZpaG9zdC0+YXZhaWxhYmxlX3JlbW90ZV9ub2RlcywgcmVtb3RlX25vZGVfY291bnQKKwkJKTsKKworCWlmIChub2RlX2luZGV4ICE9IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWCkgeworCQlpaG9zdC0+ZGV2aWNlX3RhYmxlW25vZGVfaW5kZXhdID0gaWRldjsKKworCQkqbm9kZV9pZCA9IG5vZGVfaW5kZXg7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKworCXJldHVybiBTQ0lfRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTOworfQorCit2b2lkIHNjaV9jb250cm9sbGVyX2ZyZWVfcmVtb3RlX25vZGVfY29udGV4dChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkgICAgIHUxNiBub2RlX2lkKQoreworCXUzMiByZW1vdGVfbm9kZV9jb3VudCA9IHNjaV9yZW1vdGVfZGV2aWNlX25vZGVfY291bnQoaWRldik7CisKKwlpZiAoaWhvc3QtPmRldmljZV90YWJsZVtub2RlX2lkXSA9PSBpZGV2KSB7CisJCWlob3N0LT5kZXZpY2VfdGFibGVbbm9kZV9pZF0gPSBOVUxMOworCisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9yZWxlYXNlX3JlbW90ZV9ub2RlX2luZGV4KAorCQkJJmlob3N0LT5hdmFpbGFibGVfcmVtb3RlX25vZGVzLCByZW1vdGVfbm9kZV9jb3VudCwgbm9kZV9pZAorCQkJKTsKKwl9Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKHZvaWQgKnJlc3BvbnNlX2J1ZmZlciwKKwkJCQkgICAgICAgdm9pZCAqZnJhbWVfaGVhZGVyLAorCQkJCSAgICAgICB2b2lkICpmcmFtZV9idWZmZXIpCit7CisJLyogWFhYIHR5cGUgc2FmZXR5PyAqLworCW1lbWNweShyZXNwb25zZV9idWZmZXIsIGZyYW1lX2hlYWRlciwgc2l6ZW9mKHUzMikpOworCisJbWVtY3B5KHJlc3BvbnNlX2J1ZmZlciArIHNpemVvZih1MzIpLAorCSAgICAgICBmcmFtZV9idWZmZXIsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzKSAtIHNpemVvZih1MzIpKTsKK30KKwordm9pZCBzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MzIgZnJhbWVfaW5kZXgpCit7CisJaWYgKHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX3JlbGVhc2VfZnJhbWUoJmlob3N0LT51Zl9jb250cm9sLCBmcmFtZV9pbmRleCkpCisJCXdyaXRlbChpaG9zdC0+dWZfY29udHJvbC5nZXQsCisJCQkmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnNkbWEudW5zb2xpY2l0ZWRfZnJhbWVfZ2V0X3BvaW50ZXIpOworfQorCit2b2lkIGlzY2lfdGNpX2ZyZWUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUxNiB0Y2kpCit7CisJdTE2IHRhaWwgPSBpaG9zdC0+dGNpX3RhaWwgJiAoU0NJX01BWF9JT19SRVFVRVNUUy0xKTsKKworCWlob3N0LT50Y2lfcG9vbFt0YWlsXSA9IHRjaTsKKwlpaG9zdC0+dGNpX3RhaWwgPSB0YWlsICsgMTsKK30KKworc3RhdGljIHUxNiBpc2NpX3RjaV9hbGxvYyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwl1MTYgaGVhZCA9IGlob3N0LT50Y2lfaGVhZCAmIChTQ0lfTUFYX0lPX1JFUVVFU1RTLTEpOworCXUxNiB0Y2kgPSBpaG9zdC0+dGNpX3Bvb2xbaGVhZF07CisKKwlpaG9zdC0+dGNpX2hlYWQgPSBoZWFkICsgMTsKKwlyZXR1cm4gdGNpOworfQorCitzdGF0aWMgdTE2IGlzY2lfdGNpX3NwYWNlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXJldHVybiBDSVJDX1NQQUNFKGlob3N0LT50Y2lfaGVhZCwgaWhvc3QtPnRjaV90YWlsLCBTQ0lfTUFYX0lPX1JFUVVFU1RTKTsKK30KKwordTE2IGlzY2lfYWxsb2NfdGFnKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCWlmIChpc2NpX3RjaV9zcGFjZShpaG9zdCkpIHsKKwkJdTE2IHRjaSA9IGlzY2lfdGNpX2FsbG9jKGlob3N0KTsKKwkJdTggc2VxID0gaWhvc3QtPmlvX3JlcXVlc3Rfc2VxdWVuY2VbdGNpXTsKKworCQlyZXR1cm4gSVNDSV9UQUcoc2VxLCB0Y2kpOworCX0KKworCXJldHVybiBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRzsKK30KKworZW51bSBzY2lfc3RhdHVzIGlzY2lfZnJlZV90YWcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUxNiBpb190YWcpCit7CisJdTE2IHRjaSA9IElTQ0lfVEFHX1RDSShpb190YWcpOworCXUxNiBzZXEgPSBJU0NJX1RBR19TRVEoaW9fdGFnKTsKKworCS8qIHByZXZlbnQgdGFpbCBmcm9tIHBhc3NpbmcgaGVhZCAqLworCWlmIChpc2NpX3RjaV9hY3RpdmUoaWhvc3QpID09IDApCisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX0lPX1RBRzsKKworCWlmIChzZXEgPT0gaWhvc3QtPmlvX3JlcXVlc3Rfc2VxdWVuY2VbdGNpXSkgeworCQlpaG9zdC0+aW9fcmVxdWVzdF9zZXF1ZW5jZVt0Y2ldID0gKHNlcSsxKSAmIChTQ0lfTUFYX1NFUS0xKTsKKworCQlpc2NpX3RjaV9mcmVlKGlob3N0LCB0Y2kpOworCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfSU9fVEFHOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfc3RhcnRfaW8oc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWlmIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCAhPSBTQ0lDX1JFQURZKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LCAiaW52YWxpZCBzdGF0ZSB0byBzdGFydCBJL08iKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfaW8oaWhvc3QsIGlkZXYsIGlyZXEpOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlzZXRfYml0KElSRVFfQUNUSVZFLCAmaXJlcS0+ZmxhZ3MpOworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgaXJlcS0+cG9zdF9jb250ZXh0KTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl90ZXJtaW5hdGVfcmVxdWVzdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJCSBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJLyogdGVybWluYXRlIGFuIG9uZ29pbmcgKGkuZS4gc3RhcnRlZCkgY29yZSBJTyByZXF1ZXN0LiAgVGhpcyBkb2VzIG5vdAorCSAqIGFib3J0IHRoZSBJTyByZXF1ZXN0IGF0IHRoZSB0YXJnZXQsIGJ1dCByYXRoZXIgcmVtb3ZlcyB0aGUgSU8KKwkgKiByZXF1ZXN0IGZyb20gdGhlIGhvc3QgY29udHJvbGxlci4KKwkgKi8KKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkICE9IFNDSUNfUkVBRFkpIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgImludmFsaWQgc3RhdGUgdG8gdGVybWluYXRlIHJlcXVlc3RcbiIpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlzdGF0dXMgPSBzY2lfaW9fcmVxdWVzdF90ZXJtaW5hdGUoaXJlcSk7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qCisJICogVXRpbGl6ZSB0aGUgb3JpZ2luYWwgcG9zdCBjb250ZXh0IGNvbW1hbmQgYW5kIG9yIGluIHRoZSBQT1NUX1RDX0FCT1JUCisJICogcmVxdWVzdCBzdWItdHlwZS4KKwkgKi8KKwlzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3QoaWhvc3QsCisJCQkJICAgIGlyZXEtPnBvc3RfY29udGV4dCB8IFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9QT1NUX1RDX0FCT1JUKTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc2NpX2NvbnRyb2xsZXJfY29tcGxldGVfaW8oKSAtIFRoaXMgbWV0aG9kIHdpbGwgcGVyZm9ybSBjb3JlIHNwZWNpZmljCisgKiAgICBjb21wbGV0aW9uIG9wZXJhdGlvbnMgZm9yIGFuIElPIHJlcXVlc3QuICBBZnRlciB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLAorICogICAgdGhlIHVzZXIgc2hvdWxkIGNvbnNpZGVyIHRoZSBJTyByZXF1ZXN0IGFzIGludmFsaWQgdW50aWwgaXQgaXMgcHJvcGVybHkKKyAqICAgIHJldXNlZCAoaS5lLiByZS1jb25zdHJ1Y3RlZCkuCisgKiBAaWhvc3Q6IFRoZSBoYW5kbGUgdG8gdGhlIGNvbnRyb2xsZXIgb2JqZWN0IGZvciB3aGljaCB0byBjb21wbGV0ZSB0aGUKKyAqICAgIElPIHJlcXVlc3QuCisgKiBAaWRldjogVGhlIGhhbmRsZSB0byB0aGUgcmVtb3RlIGRldmljZSBvYmplY3QgZm9yIHdoaWNoIHRvIGNvbXBsZXRlCisgKiAgICB0aGUgSU8gcmVxdWVzdC4KKyAqIEBpcmVxOiB0aGUgaGFuZGxlIHRvIHRoZSBpbyByZXF1ZXN0IG9iamVjdCB0byBjb21wbGV0ZS4KKyAqLworZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX2NvbXBsZXRlX2lvKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJdTE2IGluZGV4OworCisJc3dpdGNoIChpaG9zdC0+c20uY3VycmVudF9zdGF0ZV9pZCkgeworCWNhc2UgU0NJQ19TVE9QUElORzoKKwkJLyogWFhYOiBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiAqLworCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisJY2FzZSBTQ0lDX1JFQURZOgorCQlzdGF0dXMgPSBzY2lfcmVtb3RlX2RldmljZV9jb21wbGV0ZV9pbyhpaG9zdCwgaWRldiwgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCWluZGV4ID0gSVNDSV9UQUdfVENJKGlyZXEtPmlvX3RhZyk7CisJCWNsZWFyX2JpdChJUkVRX0FDVElWRSwgJmlyZXEtPmZsYWdzKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LCAiaW52YWxpZCBzdGF0ZSB0byBjb21wbGV0ZSBJL08iKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9jb250aW51ZV9pbyhzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpZiAoaWhvc3QtPnNtLmN1cnJlbnRfc3RhdGVfaWQgIT0gU0NJQ19SRUFEWSkgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgImludmFsaWQgc3RhdGUgdG8gY29udGludWUgSS9PIik7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXNldF9iaXQoSVJFUV9BQ1RJVkUsICZpcmVxLT5mbGFncyk7CisJc2NpX2NvbnRyb2xsZXJfcG9zdF9yZXF1ZXN0KGlob3N0LCBpcmVxLT5wb3N0X2NvbnRleHQpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9zdGFydF90YXNrKCkgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFNDSUMgdXNlciB0bworICogICAgc2VuZC9zdGFydCBhIGZyYW1ld29yayB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdC4KKyAqIEBjb250cm9sbGVyOiB0aGUgaGFuZGxlIHRvIHRoZSBjb250cm9sbGVyIG9iamVjdCBmb3Igd2hpY2ggdG8gc3RhcnQgdGhlIHRhc2sKKyAqICAgIG1hbmFnZW1lbnQgcmVxdWVzdC4KKyAqIEByZW1vdGVfZGV2aWNlOiB0aGUgaGFuZGxlIHRvIHRoZSByZW1vdGUgZGV2aWNlIG9iamVjdCBmb3Igd2hpY2ggdG8gc3RhcnQKKyAqICAgIHRoZSB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdC4KKyAqIEB0YXNrX3JlcXVlc3Q6IHRoZSBoYW5kbGUgdG8gdGhlIHRhc2sgcmVxdWVzdCBvYmplY3QgdG8gc3RhcnQuCisgKi8KK2VudW0gc2NpX3Rhc2tfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0YXJ0X3Rhc2soc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkgICAgICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKGlob3N0LT5zbS5jdXJyZW50X3N0YXRlX2lkICE9IFNDSUNfUkVBRFkpIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBTQ0lDIENvbnRyb2xsZXIgc3RhcnRpbmcgdGFzayBmcm9tIGludmFsaWQgIgorCQkJICJzdGF0ZVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiBTQ0lfVEFTS19GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfdGFzayhpaG9zdCwgaWRldiwgaXJlcSk7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIFNDSV9GQUlMVVJFX1JFU0VUX0RFVklDRV9QQVJUSUFMX1NVQ0NFU1M6CisJCXNldF9iaXQoSVJFUV9BQ1RJVkUsICZpcmVxLT5mbGFncyk7CisKKwkJLyoKKwkJICogV2Ugd2lsbCBsZXQgZnJhbWV3b3JrIGtub3cgdGhpcyB0YXNrIHJlcXVlc3Qgc3RhcnRlZCBzdWNjZXNzZnVsbHksCisJCSAqIGFsdGhvdWdoIGNvcmUgaXMgc3RpbGwgd29yaW5nIG9uIHN0YXJ0aW5nIHRoZSByZXF1ZXN0ICh0byBwb3N0IHRjIHdoZW4KKwkJICogUk5DIGlzIHJlc3VtZWQuKQorCQkgKi8KKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1NVQ0NFU1M6CisJCXNldF9iaXQoSVJFUV9BQ1RJVkUsICZpcmVxLT5mbGFncyk7CisJCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgaXJlcS0+cG9zdF9jb250ZXh0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjIxMDFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5oCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfU0NJX0hPU1RfSF8KKyNkZWZpbmUgX1NDSV9IT1NUX0hfCisKKyNpbmNsdWRlICJyZW1vdGVfZGV2aWNlLmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInJlbW90ZV9ub2RlX3RhYmxlLmgiCisjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCisjaW5jbHVkZSAidW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbC5oIgorI2luY2x1ZGUgInByb2JlX3JvbXMuaCIKKworc3RydWN0IGlzY2lfcmVxdWVzdDsKK3N0cnVjdCBzY3VfdGFza19jb250ZXh0OworCisKKy8qKgorICogc3RydWN0IHNjaV9wb3dlcl9jb250cm9sIC0KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmaWVsZHMgZm9yIG1hbmFnaW5nIHBvd2VyIGNvbnRyb2wgZm9yIGRpcmVjdAorICogYXR0YWNoZWQgZGlzayBkZXZpY2VzLgorICovCitzdHJ1Y3Qgc2NpX3Bvd2VyX2NvbnRyb2wgeworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHdoZW4gdGhlIHBvd2VyIGNvbnRyb2wgdGltZXIgaXMgcnVubmluZyBhbmQgY2xlYXJlZCB3aGVuCisJICogaXQgaXMgbm90LgorCSAqLworCWJvb2wgdGltZXJfc3RhcnRlZDsKKworCS8qKgorCSAqIFRpbWVyIHRvIGNvbnRyb2wgd2hlbiB0aGUgZGlyZWN0ZWQgYXR0YWNoZWQgZGlza3MgY2FuIGNvbnN1bWUgcG93ZXIuCisJICovCisJc3RydWN0IHNjaV90aW1lciB0aW1lcjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHBoeXMgYXJlIHB1dCBpbnRvIHRoZQorCSAqIHJlcXVlc3RlcnMgZmllbGQuCisJICovCisJdTggcGh5c193YWl0aW5nOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgcGh5cyBoYXZlIGJlZW4gZ3JhbnRlZCB0byBjb25zdW1lIHBvd2VyCisJICovCisJdTggcGh5c19ncmFudGVkX3Bvd2VyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBhbiBhcnJheSBvZiBwaHlzIHRoYXQgd2UgYXJlIHdhaXRpbmcgb24uIFRoZSBwaHlzIGFyZSBkaXJlY3QKKwkgKiBtYXBwZWQgaW50byByZXF1ZXN0ZXJzIHZpYSBzdHJ1Y3Qgc2NpX3BoeS5waHlfaW5kZXgKKwkgKi8KKwlzdHJ1Y3QgaXNjaV9waHkgKnJlcXVlc3RlcnNbU0NJX01BWF9QSFlTXTsKKworfTsKKworc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQ7Cit0eXBlZGVmIHZvaWQgKCpwb3J0X2NvbmZpZ19mbikoc3RydWN0IGlzY2lfaG9zdCAqLAorCQkJICAgICAgIHN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICosCisJCQkgICAgICAgc3RydWN0IGlzY2lfcG9ydCAqLCBzdHJ1Y3QgaXNjaV9waHkgKik7CisKK3N0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50IHsKKwl1MTYgcGh5X2NvbmZpZ3VyZWRfbWFzazsKKwl1MTYgcGh5X3JlYWR5X21hc2s7CisJc3RydWN0IHsKKwkJdTggbWluX2luZGV4OworCQl1OCBtYXhfaW5kZXg7CisJfSBwaHlfdmFsaWRfcG9ydF9yYW5nZVtTQ0lfTUFYX1BIWVNdOworCWJvb2wgdGltZXJfcGVuZGluZzsKKwlwb3J0X2NvbmZpZ19mbiBsaW5rX3VwX2hhbmRsZXI7CisJcG9ydF9jb25maWdfZm4gbGlua19kb3duX2hhbmRsZXI7CisJc3RydWN0IHNjaV90aW1lcgl0aW1lcjsKK307CisKKy8qKgorICogaXNjaV9ob3N0IC0gcHJpbWFyeSBob3N0L2NvbnRyb2xsZXIgb2JqZWN0CisgKiBAdGltZXI6IHRpbWVvdXQgc3RhcnQvc3RvcCBvcGVyYXRpb25zCisgKiBAZGV2aWNlX3RhYmxlOiBybmkgKGh3IHJlbW90ZSBub2RlIGluZGV4KSB0byByZW1vdGUgZGV2aWNlIGxvb2t1cCB0YWJsZQorICogQGF2YWlsYWJsZV9yZW1vdGVfbm9kZXM6IHJuaSBhbGxvY2F0b3IKKyAqIEBwb3dlcl9jb250cm9sOiBtYW5hZ2UgZGV2aWNlIHNwaW4gdXAKKyAqIEBpb19yZXF1ZXN0X3NlcXVlbmNlOiBnZW5lcmF0aW9uIG51bWJlciBmb3IgdGNpJ3MgKHRhc2sgY29udGV4dHMpCisgKiBAdGFza19jb250ZXh0X3RhYmxlOiBodyB0YXNrIGNvbnRleHQgdGFibGUKKyAqIEByZW1vdGVfbm9kZV9jb250ZXh0X3RhYmxlOiBodyByZW1vdGUgbm9kZSBjb250ZXh0IHRhYmxlCisgKiBAY29tcGxldGlvbl9xdWV1ZTogaHctcHJvZHVjZXIgZHJpdmVyLWNvbnN1bWVyIGNvbW11bmljYXRpb24gcmluZworICogQGNvbXBsZXRpb25fcXVldWVfZ2V0OiB0cmFja3MgdGhlIGRyaXZlciAnaGVhZCcgb2YgdGhlIHJpbmcgdG8gbm90aWZ5IGh3CisgKiBAbG9naWNhbF9wb3J0X2VudHJpZXM6IG1pbih7ZHJpdmVyfHNpbGljb259LXN1cHBvcnRlZC1wb3J0LWNvdW50KQorICogQHJlbW90ZV9ub2RlX2VudHJpZXM6IG1pbih7ZHJpdmVyfHNpbGljb259LXN1cHBvcnRlZC1ub2RlLWNvdW50KQorICogQHRhc2tfY29udGV4dF9lbnRyaWVzOiBtaW4oe2RyaXZlcnxzaWxpY29ufS1zdXBwb3J0ZWQtdGFzay1jb3VudCkKKyAqIEBwaHlfdGltZXI6IHBoeSBzdGFydHVwIHRpbWVyCisgKiBAaW52YWxpZF9waHlfbWFzazogaWYgYW4gaW52YWxpZF9saW5rX3VwIG5vdGlmaWNhdGlvbiBpcyByZXBvcnRlZCBhIGJpdCBmb3IKKyAqIAkJICAgICAgdGhlIHBoeSBpbmRleCBpcyBzZXQgc28gZnVydGhlciBub3RpZmljYXRpb25zIGFyZSBub3QKKyAqIAkJICAgICAgbWFkZS4gIE9uY2UgdGhlIHBoeSByZXBvcnRzIGxpbmsgdXAgYW5kIGlzIG1hZGUgcGFydCBvZiBhCisgKiAJCSAgICAgIHBvcnQgdGhlbiB0aGlzIGJpdCBpcyBjbGVhcmVkLgorCisgKi8KK3N0cnVjdCBpc2NpX2hvc3QgeworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lIHNtOworCS8qIFhYWCBjYW4gd2UgdGltZSB0aGlzIGV4dGVybmFsbHkgKi8KKwlzdHJ1Y3Qgc2NpX3RpbWVyIHRpbWVyOworCS8qIFhYWCBkcm9wIHJlZmVyZW5jZSBtb2R1bGUgcGFyYW1zIGRpcmVjdGx5ICovCisJc3RydWN0IHNjaV91c2VyX3BhcmFtZXRlcnMgdXNlcl9wYXJhbWV0ZXJzOworCS8qIFhYWCBubyBuZWVkIHRvIGJlIGEgdW5pb24gKi8KKwlzdHJ1Y3Qgc2NpX29lbV9wYXJhbXMgb2VtX3BhcmFtZXRlcnM7CisJc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgcG9ydF9hZ2VudDsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICpkZXZpY2VfdGFibGVbU0NJX01BWF9SRU1PVEVfREVWSUNFU107CisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSBhdmFpbGFibGVfcmVtb3RlX25vZGVzOworCXN0cnVjdCBzY2lfcG93ZXJfY29udHJvbCBwb3dlcl9jb250cm9sOworCXU4IGlvX3JlcXVlc3Rfc2VxdWVuY2VbU0NJX01BWF9JT19SRVFVRVNUU107CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dF90YWJsZTsKKwlkbWFfYWRkcl90IHRhc2tfY29udGV4dF9kbWE7CisJdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgKnJlbW90ZV9ub2RlX2NvbnRleHRfdGFibGU7CisJdTMyICpjb21wbGV0aW9uX3F1ZXVlOworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX2dldDsKKwl1MzIgbG9naWNhbF9wb3J0X2VudHJpZXM7CisJdTMyIHJlbW90ZV9ub2RlX2VudHJpZXM7CisJdTMyIHRhc2tfY29udGV4dF9lbnRyaWVzOworCXN0cnVjdCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbCB1Zl9jb250cm9sOworCisJLyogcGh5IHN0YXJ0dXAgKi8KKwlzdHJ1Y3Qgc2NpX3RpbWVyIHBoeV90aW1lcjsKKwkvKiBYWFgga2lsbCAqLworCWJvb2wgcGh5X3N0YXJ0dXBfdGltZXJfcGVuZGluZzsKKwl1MzIgbmV4dF9waHlfdG9fc3RhcnQ7CisJLyogWFhYIGNvbnZlcnQgdG8gdW5zaWduZWQgbG9uZyBhbmQgdXNlIGJpdG9wcyAqLworCXU4IGludmFsaWRfcGh5X21hc2s7CisKKwkvKiBUT0RPIGF0dGVtcHQgZHluYW1pYyBpbnRlcnJ1cHQgY29hbGVzY2luZyBzY2hlbWUgKi8KKwl1MTYgaW50ZXJydXB0X2NvYWxlc2NlX251bWJlcjsKKwl1MzIgaW50ZXJydXB0X2NvYWxlc2NlX3RpbWVvdXQ7CisJc3RydWN0IHNtdV9yZWdpc3RlcnMgX19pb21lbSAqc211X3JlZ2lzdGVyczsKKwlzdHJ1Y3Qgc2N1X3JlZ2lzdGVycyBfX2lvbWVtICpzY3VfcmVnaXN0ZXJzOworCisJdTE2IHRjaV9oZWFkOworCXUxNiB0Y2lfdGFpbDsKKwl1MTYgdGNpX3Bvb2xbU0NJX01BWF9JT19SRVFVRVNUU107CisKKwlpbnQgaWQ7IC8qIHVuaXF1ZSB3aXRoaW4gYSBnaXZlbiBwY2kgZGV2aWNlICovCisJc3RydWN0IGlzY2lfcGh5IHBoeXNbU0NJX01BWF9QSFlTXTsKKwlzdHJ1Y3QgaXNjaV9wb3J0IHBvcnRzW1NDSV9NQVhfUE9SVFMgKyAxXTsgLyogaW5jbHVkZXMgZHVtbXkgcG9ydCAqLworCXN0cnVjdCBzYXNfaGFfc3RydWN0IHNhc19oYTsKKworCXNwaW5sb2NrX3Qgc3RhdGVfbG9jazsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwllbnVtIGlzY2lfc3RhdHVzIHN0YXR1czsKKwkjZGVmaW5lIElIT1NUX1NUQVJUX1BFTkRJTkcgMAorCSNkZWZpbmUgSUhPU1RfU1RPUF9QRU5ESU5HIDEKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50cTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgY29tcGxldGlvbl90YXNrbGV0OworCXN0cnVjdCBsaXN0X2hlYWQgcmVxdWVzdHNfdG9fY29tcGxldGU7CisJc3RydWN0IGxpc3RfaGVhZCByZXF1ZXN0c190b19lcnJvcmJhY2s7CisJc3BpbmxvY2tfdCBzY2ljX2xvY2s7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqcmVxc1tTQ0lfTUFYX0lPX1JFUVVFU1RTXTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlIGRldmljZXNbU0NJX01BWF9SRU1PVEVfREVWSUNFU107Cit9OworCisvKioKKyAqIGVudW0gc2NpX2NvbnRyb2xsZXJfc3RhdGVzIC0gVGhpcyBlbnVtZXJhdGlvbiBkZXBpY3RzIGFsbCB0aGUgc3RhdGVzCisgKiAgICBmb3IgdGhlIGNvbW1vbiBjb250cm9sbGVyIHN0YXRlIG1hY2hpbmUuCisgKi8KK2VudW0gc2NpX2NvbnRyb2xsZXJfc3RhdGVzIHsKKwkvKioKKwkgKiBTaW1wbHkgdGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoZSBiYXNlIGNvbnRyb2xsZXIgc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlTQ0lDX0lOSVRJQUwgPSAwLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY29udHJvbGxlciBpcyByZXNldC4gIFRoZSBtZW1vcnkgZm9yCisJICogdGhlIGNvbnRyb2xsZXIgaXMgaW4gaXQncyBpbml0aWFsIHN0YXRlLCBidXQgdGhlIGNvbnRyb2xsZXIgcmVxdWlyZXMKKwkgKiBpbml0aWFsaXphdGlvbi4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgSU5JVElBTCBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVTRVRUSU5HIHN0YXRlLgorCSAqLworCVNDSUNfUkVTRVQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGlzIHR5cGljYWxseSBhbiBhY3Rpb24gc3RhdGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvbnRyb2xsZXIKKwkgKiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBpbml0aWFsaXphdGlvbi4gIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMKKwkgKiBhcmUgcGVybWl0dGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBSRVNFVCBzdGF0ZS4KKwkgKi8KKwlTQ0lDX0lOSVRJQUxJWklORywKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRyb2xsZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CisJICogaW5pdGlhbGl6ZWQuICBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIElOSVRJQUxJWklORyBzdGF0ZS4KKwkgKi8KKwlTQ0lDX0lOSVRJQUxJWkVELAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIHRoZSBjb250cm9sbGVyIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlY29taW5nCisJICogcmVhZHkgKGkuZS4gc3RhcnRpbmcpLiAgSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBJTklUSUFMSVpFRCBzdGF0ZS4KKwkgKi8KKwlTQ0lDX1NUQVJUSU5HLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIGNvbnRyb2xsZXIgaXMgbm93IHJlYWR5LiAgVGh1cywgdGhlIHVzZXIKKwkgKiBpcyBhYmxlIHRvIHBlcmZvcm0gSU8gb3BlcmF0aW9ucyBvbiB0aGUgY29udHJvbGxlci4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRJTkcgc3RhdGUuCisJICovCisJU0NJQ19SRUFEWSwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaXMgdHlwaWNhbGx5IGFuIGFjdGlvbiBzdGF0ZSB0aGF0IGluZGljYXRlcyB0aGUgY29udHJvbGxlcgorCSAqIGlzIGluIHRoZSBwcm9jZXNzIG9mIHJlc2V0dGluZy4gIFRodXMsIHRoZSB1c2VyIGlzIHVuYWJsZSB0byBwZXJmb3JtCisJICogSU8gb3BlcmF0aW9ucyBvbiB0aGUgY29udHJvbGxlci4gIEEgcmVzZXQgaXMgY29uc2lkZXJlZCBkZXN0cnVjdGl2ZSBpbgorCSAqIG1vc3QgY2FzZXMuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBGQUlMRUQgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUT1BQRUQgc3RhdGUuCisJICovCisJU0NJQ19SRVNFVFRJTkcsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBjb250cm9sbGVyIGlzIGluIHRoZSBwcm9jZXNzIG9mIHN0b3BwaW5nLgorCSAqIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZCwgYnV0IGV4aXN0aW5nIElPCisJICogb3BlcmF0aW9ucyBhcmUgYWxsb3dlZCB0byBjb21wbGV0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJQ19TVE9QUElORywKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRyb2xsZXIgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHN0b3BwZWQuCisJICogSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVE9QUElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lDX1NUT1BQRUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBjb250cm9sbGVyIGNvdWxkIG5vdCBzdWNjZXNzZnVsbHkgYmUKKwkgKiBpbml0aWFsaXplZC4gIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgSU5JVElBTElaSU5HIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVEFSVElORyBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RPUFBJTkcgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFU0VUVElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lDX0ZBSUxFRCwKK307CisKKy8qKgorICogc3RydWN0IGlzY2lfcGNpX2luZm8gLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHBjaSBmdW5jdGlvbiBjb250YWluaW5nIHRoZQorICogICAgY29udHJvbGxlcnMuIERlcGVuZGluZyBvbiBQQ0kgU0tVLCB0aGVyZSBjb3VsZCBiZSB1cCB0byAyIGNvbnRyb2xsZXJzIGluCisgKiAgICB0aGUgUENJIGZ1bmN0aW9uLgorICovCisjZGVmaW5lIFNDSV9NQVhfTVNJWF9JTlQgKFNDSV9OVU1fTVNJX1hfSU5UKlNDSV9NQVhfQ09OVFJPTExFUlMpCisKK3N0cnVjdCBpc2NpX3BjaV9pbmZvIHsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSBtc2l4X2VudHJpZXNbU0NJX01BWF9NU0lYX0lOVF07CisJc3RydWN0IGlzY2lfaG9zdCAqaG9zdHNbU0NJX01BWF9DT05UUk9MTEVSU107CisJc3RydWN0IGlzY2lfb3JvbSAqb3JvbTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlzY2lfcGNpX2luZm8gKnRvX3BjaV9pbmZvKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiBwY2lfZ2V0X2RydmRhdGEocGRldik7Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfaXNjaV9ob3N0KGlkLCBpaG9zdCwgcGRldikgXAorCWZvciAoaWQgPSAwLCBpaG9zdCA9IHRvX3BjaV9pbmZvKHBkZXYpLT5ob3N0c1tpZF07IFwKKwkgICAgIGlkIDwgQVJSQVlfU0laRSh0b19wY2lfaW5mbyhwZGV2KS0+aG9zdHMpICYmIGlob3N0OyBcCisJICAgICBpaG9zdCA9IHRvX3BjaV9pbmZvKHBkZXYpLT5ob3N0c1srK2lkXSkKKworc3RhdGljIGlubGluZSBlbnVtIGlzY2lfc3RhdHVzIGlzY2lfaG9zdF9nZXRfc3RhdGUoc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0KQoreworCXJldHVybiBpc2NpX2hvc3QtPnN0YXR1czsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzY2lfaG9zdF9jaGFuZ2Vfc3RhdGUoc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0LAorCQkJCQkgIGVudW0gaXNjaV9zdGF0dXMgc3RhdHVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX2hvc3QgPSAlcCwgc3RhdGUgPSAweCV4IiwKKwkJX19mdW5jX18sCisJCWlzY2lfaG9zdCwKKwkJc3RhdHVzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9ob3N0LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJaXNjaV9ob3N0LT5zdGF0dXMgPSBzdGF0dXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX3N0YXJ0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXdhaXRfZXZlbnQoaWhvc3QtPmV2ZW50cSwgIXRlc3RfYml0KElIT1NUX1NUQVJUX1BFTkRJTkcsICZpaG9zdC0+ZmxhZ3MpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX3N0b3Aoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJd2FpdF9ldmVudChpaG9zdC0+ZXZlbnRxLCAhdGVzdF9iaXQoSUhPU1RfU1RPUF9QRU5ESU5HLCAmaWhvc3QtPmZsYWdzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X2Zvcl9kZXZpY2Vfc3RhcnQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJd2FpdF9ldmVudChpaG9zdC0+ZXZlbnRxLCAhdGVzdF9iaXQoSURFVl9TVEFSVF9QRU5ESU5HLCAmaWRldi0+ZmxhZ3MpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX2RldmljZV9zdG9wKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXdhaXRfZXZlbnQoaWhvc3QtPmV2ZW50cSwgIXRlc3RfYml0KElERVZfU1RPUF9QRU5ESU5HLCAmaWRldi0+ZmxhZ3MpKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXNjaV9ob3N0ICpkZXZfdG9faWhvc3Qoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5wb3J0LT5oYS0+bGxkZF9oYTsKK30KKworLyogd2UgYWx3YXlzIHVzZSBwcm90b2NvbCBlbmdpbmUgZ3JvdXAgemVybyAqLworI2RlZmluZSBJU0NJX1BFRyAwCisKKy8qIHNlZSBzY2lfY29udHJvbGxlcl9pb190YWdfYWxsb2NhdGV8ZnJlZSBmb3IgaG93IHNlcSBhbmQgdGNpIGFyZSBidWlsdCAqLworI2RlZmluZSBJU0NJX1RBRyhzZXEsIHRjaSkgKCgodTE2KSAoc2VxKSkgPDwgMTIgfCB0Y2kpCisKKy8qIHRoZXNlIGFyZSByZXR1cm5lZCBieSB0aGUgaGFyZHdhcmUsIHNvIHNhbml0aXplIHRoZW0gKi8KKyNkZWZpbmUgSVNDSV9UQUdfU0VRKHRhZykgKCgodGFnKSA+PiAxMikgJiAoU0NJX01BWF9TRVEtMSkpCisjZGVmaW5lIElTQ0lfVEFHX1RDSSh0YWcpICgodGFnKSAmIChTQ0lfTUFYX0lPX1JFUVVFU1RTLTEpKQorCisvKiBleHBhbmRlciBhdHRhY2hlZCBzYXRhIGRldmljZXMgcmVxdWlyZSAzIHJuYyBzbG90cyAqLworc3RhdGljIGlubGluZSBpbnQgc2NpX3JlbW90ZV9kZXZpY2Vfbm9kZV9jb3VudChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCisJaWYgKChkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKSAmJgorCSAgICAhaWRldi0+aXNfZGlyZWN0X2F0dGFjaGVkKQorCQlyZXR1cm4gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVDsKKwlyZXR1cm4gU0NVX1NTUF9SRU1PVEVfTk9ERV9DT1VOVDsKK30KKworLyoqCisgKiBzY2lfY29udHJvbGxlcl9jbGVhcl9pbnZhbGlkX3BoeSgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHdpbGwgY2xlYXIgdGhlIGJpdCBpbiB0aGUgaW52YWxpZCBwaHkgbWFzayBmb3IgdGhpcyBjb250cm9sbGVyCisgKiBvYmplY3QuICBUaGlzIGlzIHVzZWQgdG8gY29udHJvbCBtZXNzYWdlcyByZXBvcnRlZCBmb3IgaW52YWxpZCBsaW5rIHVwCisgKiBub3RpZmljYXRpb25zLgorICovCisjZGVmaW5lIHNjaV9jb250cm9sbGVyX2NsZWFyX2ludmFsaWRfcGh5KGNvbnRyb2xsZXIsIHBoeSkgXAorCSgoY29udHJvbGxlciktPmludmFsaWRfcGh5X21hc2sgJj0gfigxIDw8IChwaHkpLT5waHlfaW5kZXgpKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKnNjaXBoeV90b19kZXYoc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCisJaWYgKCFpcGh5IHx8ICFpcGh5LT5pc2NpX3BvcnQgfHwgIWlwaHktPmlzY2lfcG9ydC0+aXNjaV9ob3N0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmaXBoeS0+aXNjaV9wb3J0LT5pc2NpX2hvc3QtPnBkZXYtPmRldjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpzY2lwb3J0X3RvX2RldihzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKworCWlmICghaXBvcnQgfHwgIWlwb3J0LT5pc2NpX2hvc3QpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZpcG9ydC0+aXNjaV9ob3N0LT5wZGV2LT5kZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqc2NpcmRldl90b19kZXYoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlpZiAoIWlkZXYgfHwgIWlkZXYtPmlzY2lfcG9ydCB8fCAhaWRldi0+aXNjaV9wb3J0LT5pc2NpX2hvc3QpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZpZGV2LT5pc2NpX3BvcnQtPmlzY2lfaG9zdC0+cGRldi0+ZGV2OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfYTIoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKHBkZXYtPnJldmlzaW9uIDwgNCkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfYjAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKHBkZXYtPnJldmlzaW9uID09IDQpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2MwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChwZGV2LT5yZXZpc2lvbiA+PSA1KQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcG9zdF9yZXF1ZXN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgICAgIHUzMiByZXF1ZXN0KTsKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgICAgdTMyIGZyYW1lX2luZGV4KTsKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKHZvaWQgKnJlc3BvbnNlX2J1ZmZlciwKKwkJCQkJICAgIHZvaWQgKmZyYW1lX2hlYWRlciwKKwkJCQkJICAgIHZvaWQgKmZyYW1lX2J1ZmZlcik7CitlbnVtIHNjaV9zdGF0dXMgc2NpX2NvbnRyb2xsZXJfYWxsb2NhdGVfcmVtb3RlX25vZGVfY29udGV4dChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJCQkJIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCQkJCSB1MTYgKm5vZGVfaWQpOwordm9pZCBzY2lfY29udHJvbGxlcl9mcmVlX3JlbW90ZV9ub2RlX2NvbnRleHQoCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwl1MTYgbm9kZV9pZCk7CisKK3N0cnVjdCBpc2NpX3JlcXVlc3QgKnNjaV9yZXF1ZXN0X2J5X3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICB1MTYgaW9fdGFnKTsKKwordm9pZCBzY2lfY29udHJvbGxlcl9wb3dlcl9jb250cm9sX3F1ZXVlX2luc2VydCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCit2b2lkIHNjaV9jb250cm9sbGVyX3Bvd2VyX2NvbnRyb2xfcXVldWVfcmVtb3ZlKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSk7CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfbGlua191cCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCit2b2lkIHNjaV9jb250cm9sbGVyX2xpbmtfZG93bigKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCit2b2lkIHNjaV9jb250cm9sbGVyX3JlbW90ZV9kZXZpY2Vfc3RvcHBlZCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KTsKKwordm9pZCBzY2lfY29udHJvbGxlcl9jb3B5X3Rhc2tfY29udGV4dCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKwordm9pZCBzY2lfY29udHJvbGxlcl9yZWdpc3Rlcl9zZXR1cChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9jb250aW51ZV9pbyhzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2ludCBpc2NpX2hvc3Rfc2Nhbl9maW5pc2hlZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHVuc2lnbmVkIGxvbmcpOwordm9pZCBpc2NpX2hvc3Rfc2Nhbl9zdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICopOwordTE2IGlzY2lfYWxsb2NfdGFnKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KTsKK2VudW0gc2NpX3N0YXR1cyBpc2NpX2ZyZWVfdGFnKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1MTYgaW9fdGFnKTsKK3ZvaWQgaXNjaV90Y2lfZnJlZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTE2IHRjaSk7CisKK2ludCBpc2NpX2hvc3RfaW5pdChzdHJ1Y3QgaXNjaV9ob3N0ICopOworCit2b2lkIGlzY2lfaG9zdF9pbml0X2NvbnRyb2xsZXJfbmFtZXMoCisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0LAorCXVuc2lnbmVkIGludCBjb250cm9sbGVyX2lkeCk7CisKK3ZvaWQgaXNjaV9ob3N0X2RlaW5pdCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICopOworCit2b2lkIGlzY2lfaG9zdF9wb3J0X2xpbmtfdXAoCisJc3RydWN0IGlzY2lfaG9zdCAqLAorCXN0cnVjdCBpc2NpX3BvcnQgKiwKKwlzdHJ1Y3QgaXNjaV9waHkgKik7CitpbnQgaXNjaV9ob3N0X2Rldl9mb3VuZChzdHJ1Y3QgZG9tYWluX2RldmljZSAqKTsKKwordm9pZCBpc2NpX2hvc3RfcmVtb3RlX2RldmljZV9zdGFydF9jb21wbGV0ZSgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICosCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqLAorCWVudW0gc2NpX3N0YXR1cyk7CisKK3ZvaWQgc2NpX2NvbnRyb2xsZXJfZGlzYWJsZV9pbnRlcnJ1cHRzKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0YXJ0X2lvKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CisKK2VudW0gc2NpX3Rhc2tfc3RhdHVzIHNjaV9jb250cm9sbGVyX3N0YXJ0X3Rhc2soCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9jb250cm9sbGVyX3Rlcm1pbmF0ZV9yZXF1ZXN0KAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfY29udHJvbGxlcl9jb21wbGV0ZV9pbygKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworCit2b2lkIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfY29uc3RydWN0KAorCXN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfaW5pdGlhbGl6ZSgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWUwZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaW5pdC5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAicHJvYmVfcm9tcy5oIgorCitzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICppc2NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGlzY2lfaWRfdGFibGUpID0geworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2MSksfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjMpLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDY1KSx9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2NyksfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjkpLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDZCKSx9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2MCksfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjIpLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDY0KSx9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MUQ2NiksfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFENjgpLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxRDZBKSx9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXNjaV9pZF90YWJsZSk7CisKKy8qIGxpbnV4IGlzY2kgc3BlY2lmaWMgc2V0dGluZ3MgKi8KKwordW5zaWduZWQgY2hhciBub19vdXRib3VuZF90YXNrX3RvID0gMjA7Cittb2R1bGVfcGFyYW0obm9fb3V0Ym91bmRfdGFza190bywgYnl0ZSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vX291dGJvdW5kX3Rhc2tfdG8sICJObyBPdXRib3VuZCBUYXNrIFRpbWVvdXQgKDF1cyBpbmNyKSIpOworCit1MTYgc3NwX21heF9vY2NfdG8gPSAyMDsKK21vZHVsZV9wYXJhbShzc3BfbWF4X29jY190bywgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3NwX21heF9vY2NfdG8sICJTU1AgTWF4IG9jY3VwYW5jeSB0aW1lb3V0ICgxMDB1cyBpbmNyKSIpOworCit1MTYgc3RwX21heF9vY2NfdG8gPSA1OworbW9kdWxlX3BhcmFtKHN0cF9tYXhfb2NjX3RvLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzdHBfbWF4X29jY190bywgIlNUUCBNYXggb2NjdXBhbmN5IHRpbWVvdXQgKDEwMHVzIGluY3IpIik7CisKK3UxNiBzc3BfaW5hY3RpdmVfdG8gPSA1OworbW9kdWxlX3BhcmFtKHNzcF9pbmFjdGl2ZV90bywgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3NwX2luYWN0aXZlX3RvLCAiU1NQIGluYWN0aXZpdHkgdGltZW91dCAoMTAwdXMgaW5jcikiKTsKKwordTE2IHN0cF9pbmFjdGl2ZV90byA9IDU7Cittb2R1bGVfcGFyYW0oc3RwX2luYWN0aXZlX3RvLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzdHBfaW5hY3RpdmVfdG8sICJTVFAgaW5hY3Rpdml0eSB0aW1lb3V0ICgxMDB1cyBpbmNyKSIpOworCit1bnNpZ25lZCBjaGFyIHBoeV9nZW4gPSAzOworbW9kdWxlX3BhcmFtKHBoeV9nZW4sIGJ5dGUsIDApOworTU9EVUxFX1BBUk1fREVTQyhwaHlfZ2VuLCAiUEhZIGdlbmVyYXRpb24gKDE6IDEuNUdicHMgMjogMy4wR2JwcyAzOiA2LjBHYnBzKSIpOworCit1bnNpZ25lZCBjaGFyIG1heF9jb25jdXJyX3NwaW51cCA9IDE7Cittb2R1bGVfcGFyYW0obWF4X2NvbmN1cnJfc3BpbnVwLCBieXRlLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2NvbmN1cnJfc3BpbnVwLCAiTWF4IGNvbmN1cnJlbnQgZGV2aWNlIHNwaW51cCIpOworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBpc2NpX3NodCA9IHsKKworCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCQk9IERSVl9OQU1FLAorCS5wcm9jX25hbWUJCQk9IERSVl9OQU1FLAorCS5xdWV1ZWNvbW1hbmQJCQk9IHNhc19xdWV1ZWNvbW1hbmQsCisJLnRhcmdldF9hbGxvYwkJCT0gc2FzX3RhcmdldF9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCQk9IHNhc19zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2Rlc3Ryb3kJCQk9IHNhc19zbGF2ZV9kZXN0cm95LAorCS5zY2FuX2ZpbmlzaGVkCQkJPSBpc2NpX2hvc3Rfc2Nhbl9maW5pc2hlZCwKKwkuc2Nhbl9zdGFydAkJCT0gaXNjaV9ob3N0X3NjYW5fc3RhcnQsCisJLmNoYW5nZV9xdWV1ZV9kZXB0aAkJPSBzYXNfY2hhbmdlX3F1ZXVlX2RlcHRoLAorCS5jaGFuZ2VfcXVldWVfdHlwZQkJPSBzYXNfY2hhbmdlX3F1ZXVlX3R5cGUsCisJLmJpb3NfcGFyYW0JCQk9IHNhc19iaW9zX3BhcmFtLAorCS5jYW5fcXVldWUJCQk9IElTQ0lfQ0FOX1FVRVVFX1ZBTCwKKwkuY21kX3Blcl9sdW4JCQk9IDEsCisJLnRoaXNfaWQJCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCQk9IFNHX0FMTCwKKwkubWF4X3NlY3RvcnMJCQk9IFNDU0lfREVGQVVMVF9NQVhfU0VDVE9SUywKKwkudXNlX2NsdXN0ZXJpbmcJCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IHNhc19laF9kZXZpY2VfcmVzZXRfaGFuZGxlciwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gaXNjaV9idXNfcmVzZXRfaGFuZGxlciwKKwkuc2xhdmVfYWxsb2MJCQk9IHNhc19zbGF2ZV9hbGxvYywKKwkudGFyZ2V0X2Rlc3Ryb3kJCQk9IHNhc190YXJnZXRfZGVzdHJveSwKKwkuaW9jdGwJCQkJPSBzYXNfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IHNhc19kb21haW5fZnVuY3Rpb25fdGVtcGxhdGUgaXNjaV90cmFuc3BvcnRfb3BzICA9IHsKKworCS8qIFRoZSBjbGFzcyBjYWxscyB0aGVzZSB0byBub3RpZnkgdGhlIExMREQgb2YgYW4gZXZlbnQuICovCisJLmxsZGRfcG9ydF9mb3JtZWQJPSBpc2NpX3BvcnRfZm9ybWVkLAorCS5sbGRkX3BvcnRfZGVmb3JtZWQJPSBpc2NpX3BvcnRfZGVmb3JtZWQsCisKKwkvKiBUaGUgY2xhc3MgY2FsbHMgdGhlc2Ugd2hlbiBhIGRldmljZSBpcyBmb3VuZCBvciBnb25lLiAqLworCS5sbGRkX2Rldl9mb3VuZAkJPSBpc2NpX3JlbW90ZV9kZXZpY2VfZm91bmQsCisJLmxsZGRfZGV2X2dvbmUJCT0gaXNjaV9yZW1vdGVfZGV2aWNlX2dvbmUsCisKKwkubGxkZF9leGVjdXRlX3Rhc2sJPSBpc2NpX3Rhc2tfZXhlY3V0ZV90YXNrLAorCS8qIFRhc2sgTWFuYWdlbWVudCBGdW5jdGlvbnMuIE11c3QgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0LiAqLworCS5sbGRkX2Fib3J0X3Rhc2sJPSBpc2NpX3Rhc2tfYWJvcnRfdGFzaywKKwkubGxkZF9hYm9ydF90YXNrX3NldAk9IGlzY2lfdGFza19hYm9ydF90YXNrX3NldCwKKwkubGxkZF9jbGVhcl9hY2EJCT0gaXNjaV90YXNrX2NsZWFyX2FjYSwKKwkubGxkZF9jbGVhcl90YXNrX3NldAk9IGlzY2lfdGFza19jbGVhcl90YXNrX3NldCwKKwkubGxkZF9JX1RfbmV4dXNfcmVzZXQJPSBpc2NpX3Rhc2tfSV9UX25leHVzX3Jlc2V0LAorCS5sbGRkX2x1X3Jlc2V0CQk9IGlzY2lfdGFza19sdV9yZXNldCwKKwkubGxkZF9xdWVyeV90YXNrCT0gaXNjaV90YXNrX3F1ZXJ5X3Rhc2ssCisKKwkvKiBQb3J0IGFuZCBBZGFwdGVyIG1hbmFnZW1lbnQgKi8KKwkubGxkZF9jbGVhcl9uZXh1c19wb3J0CT0gaXNjaV90YXNrX2NsZWFyX25leHVzX3BvcnQsCisJLmxsZGRfY2xlYXJfbmV4dXNfaGEJPSBpc2NpX3Rhc2tfY2xlYXJfbmV4dXNfaGEsCisKKwkvKiBQaHkgbWFuYWdlbWVudCAqLworCS5sbGRkX2NvbnRyb2xfcGh5CT0gaXNjaV9waHlfY29udHJvbCwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQIFIgTyBUIEUgQyBUIEUgRCAgTSBFIFQgSCBPIEQgUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyoqCisgKiBpc2NpX3JlZ2lzdGVyX3Nhc19oYSgpIC0gVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdmFyaW91cyBsbGRkCisgKiAgICBzcGVjaWZpYyBtZW1iZXJzIG9mIHRoZSBzYXNfaGEgc3RydWN0IGFuZCBjYWxscyB0aGUgbGlic2FzCisgKiAgICBzYXNfcmVnaXN0ZXJfaGEoKSBmdW5jdGlvbi4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbGxkZCBzcGVjaWZpYyB3cmFwcGVyIGZvciB0aGUKKyAqICAgIGxpYnNhcyBzYXNfaGEgc3RydWN0LgorICoKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHN1Y2VzcyBvciBmYWlsdXJlLiBUaGUgdXNlcgorICogc2hvdWxkIGNoZWNrIGZvciBwb3NzaWJsZSBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciByZXR1cm4gb3RoZXJ3aXNlLCBhIHplcm8KKyAqIGluZGljYXRlcyBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGlzY2lfcmVnaXN0ZXJfc2FzX2hhKHN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gJihpc2NpX2hvc3QtPnNhc19oYSk7CisJc3RydWN0IGFzZF9zYXNfcGh5ICoqc2FzX3BoeXM7CisJc3RydWN0IGFzZF9zYXNfcG9ydCAqKnNhc19wb3J0czsKKworCXNhc19waHlzID0gZGV2bV9remFsbG9jKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCQlTQ0lfTUFYX1BIWVMgKiBzaXplb2Yodm9pZCAqKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXNhc19waHlzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNhc19wb3J0cyA9IGRldm1fa3phbGxvYygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkJIFNDSV9NQVhfUE9SVFMgKiBzaXplb2Yodm9pZCAqKSwKKwkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYXNfcG9ydHMpCisJCXJldHVybiAtRU5PTUVNOworCisJLyotLS0tLS0tLS0tLS0tLS0tLSBMaWJzYXMgSW5pdGlhbGl6YXRpb24gU3R1ZmYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0IHZhcmlvdXMgZmllbGRzIGluIHRoZSBzYXNfaGEgc3RydWN0OgorCSAqLworCisJc2FzX2hhLT5zYXNfaGFfbmFtZSA9IERSVl9OQU1FOworCXNhc19oYS0+bGxkZF9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzYXNfaGEtPnNhc19hZGRyICAgID0gJmlzY2lfaG9zdC0+cGh5c1swXS5zYXNfYWRkclswXTsKKworCS8qIHNldCB0aGUgYXJyYXkgb2YgcGh5IGFuZCBwb3J0IHN0cnVjdHMuICAqLworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykgeworCQlzYXNfcGh5c1tpXSA9ICZpc2NpX2hvc3QtPnBoeXNbaV0uc2FzX3BoeTsKKwkJc2FzX3BvcnRzW2ldID0gJmlzY2lfaG9zdC0+cG9ydHNbaV0uc2FzX3BvcnQ7CisJfQorCisJc2FzX2hhLT5zYXNfcGh5ICA9IHNhc19waHlzOworCXNhc19oYS0+c2FzX3BvcnQgPSBzYXNfcG9ydHM7CisJc2FzX2hhLT5udW1fcGh5cyA9IFNDSV9NQVhfUEhZUzsKKworCXNhc19oYS0+bGxkZF9xdWV1ZV9zaXplID0gSVNDSV9DQU5fUVVFVUVfVkFMOworCXNhc19oYS0+bGxkZF9tYXhfZXhlY3V0ZV9udW0gPSAxOworCXNhc19oYS0+c3RyaWN0X3dpZGVfcG9ydHMgPSAxOworCisJc2FzX3JlZ2lzdGVyX2hhKHNhc19oYSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgaXNjaV9zaG93X2lkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNvbnRhaW5lcl9vZihkZXYsIHR5cGVvZigqc2hvc3QpLCBzaG9zdF9kZXYpOworCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gY29udGFpbmVyX29mKHNhc19oYSwgdHlwZW9mKCppaG9zdCksIHNhc19oYSk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaWhvc3QtPmlkKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGlzY2lfaWQsIFNfSVJVR08sIGlzY2lfc2hvd19pZCwgTlVMTCk7CisKK3N0YXRpYyB2b2lkIGlzY2lfdW5yZWdpc3RlcihzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisKKwlpZiAoIWlzY2lfaG9zdCkKKwkJcmV0dXJuOworCisJc2hvc3QgPSBpc2NpX2hvc3QtPnNob3N0OworCWRldmljZV9yZW1vdmVfZmlsZSgmc2hvc3QtPnNob3N0X2RldiwgJmRldl9hdHRyX2lzY2lfaWQpOworCisJc2FzX3VucmVnaXN0ZXJfaGEoJmlzY2lfaG9zdC0+c2FzX2hhKTsKKworCXNhc19yZW1vdmVfaG9zdChpc2NpX2hvc3QtPnNob3N0KTsKKwlzY3NpX3JlbW92ZV9ob3N0KGlzY2lfaG9zdC0+c2hvc3QpOworCXNjc2lfaG9zdF9wdXQoaXNjaV9ob3N0LT5zaG9zdCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlzY2lfcGNpX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGVyciwgYmFyX251bSwgYmFyX21hc2sgPSAwOworCXZvaWQgX19pb21lbSAqIGNvbnN0ICppb21hcDsKKworCWVyciA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJmYWlsZWQgZW5hYmxlIFBDSSBkZXZpY2UgJXMhXG4iLAorCQkJcGNpX25hbWUocGRldikpOworCQlyZXR1cm4gZXJyOworCX0KKworCWZvciAoYmFyX251bSA9IDA7IGJhcl9udW0gPCBTQ0lfUENJX0JBUl9DT1VOVDsgYmFyX251bSsrKQorCQliYXJfbWFzayB8PSAxIDw8IChiYXJfbnVtICogMik7CisKKwllcnIgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgYmFyX21hc2ssIERSVl9OQU1FKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOworCWlmICghaW9tYXApCisJCXJldHVybiAtRU5PTUVNOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCWlmIChlcnIpIHsKKwkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCWlmIChlcnIpIHsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudW1fY29udHJvbGxlcnMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJLyogYmFyIHNpemUgYWxvbmUgY2FuIHRlbGwgdXMgaWYgd2UgYXJlIHJ1bm5pbmcgd2l0aCBhIGR1YWwgY29udHJvbGxlcgorCSAqIHBhcnQsIG5vIG5lZWQgdG8gdHJ1c3QgcmV2aXNpb24gaWRzIHRoYXQgbWlnaHQgYmUgdW5kZXIgYnJva2VuIGZpcm13YXJlCisJICogY29udHJvbAorCSAqLworCXJlc291cmNlX3NpemVfdCBzY3VfYmFyX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIFNDSV9TQ1VfQkFSKjIpOworCXJlc291cmNlX3NpemVfdCBzbXVfYmFyX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIFNDSV9TTVVfQkFSKjIpOworCisJaWYgKHNjdV9iYXJfc2l6ZSA+PSBTQ0lfU0NVX0JBUl9TSVpFKlNDSV9NQVhfQ09OVFJPTExFUlMgJiYKKwkgICAgc211X2Jhcl9zaXplID49IFNDSV9TTVVfQkFSX1NJWkUqU0NJX01BWF9DT05UUk9MTEVSUykKKwkJcmV0dXJuIFNDSV9NQVhfQ09OVFJPTExFUlM7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpc2NpX3NldHVwX2ludGVycnVwdHMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGVyciwgaSwgbnVtX21zaXg7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3Q7CisJc3RydWN0IGlzY2lfcGNpX2luZm8gKnBjaV9pbmZvID0gdG9fcGNpX2luZm8ocGRldik7CisKKwkvKgorCSAqICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisJICogIFBDSSBmdW5jdGlvbi4KKwkgKi8KKwludW1fbXNpeCA9IG51bV9jb250cm9sbGVycyhwZGV2KSAqIFNDSV9OVU1fTVNJX1hfSU5UOworCisJZm9yIChpID0gMDsgaSA8IG51bV9tc2l4OyBpKyspCisJCXBjaV9pbmZvLT5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOworCisJZXJyID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIHBjaV9pbmZvLT5tc2l4X2VudHJpZXMsIG51bV9tc2l4KTsKKwlpZiAoZXJyKQorCQlnb3RvIGludHg7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21zaXg7IGkrKykgeworCQlpbnQgaWQgPSBpIC8gU0NJX05VTV9NU0lfWF9JTlQ7CisJCXN0cnVjdCBtc2l4X2VudHJ5ICptc2l4ID0gJnBjaV9pbmZvLT5tc2l4X2VudHJpZXNbaV07CisJCWlycV9oYW5kbGVyX3QgaXNyOworCisJCWlob3N0ID0gcGNpX2luZm8tPmhvc3RzW2lkXTsKKwkJLyogb2RkIG51bWJlcmVkIHZlY3RvcnMgYXJlIGVycm9yIGludGVycnVwdHMgKi8KKwkJaWYgKGkgJiAxKQorCQkJaXNyID0gaXNjaV9lcnJvcl9pc3I7CisJCWVsc2UKKwkJCWlzciA9IGlzY2lfbXNpeF9pc3I7CisKKwkJZXJyID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBtc2l4LT52ZWN0b3IsIGlzciwgMCwKKwkJCQkgICAgICAgRFJWX05BTUUiLW1zaXgiLCBpaG9zdCk7CisJCWlmICghZXJyKQorCQkJY29udGludWU7CisKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIm1zaXggc2V0dXAgZmFpbGVkIGZhbGxpbmcgYmFjayB0byBpbnR4XG4iKTsKKwkJd2hpbGUgKGktLSkgeworCQkJaWQgPSBpIC8gU0NJX05VTV9NU0lfWF9JTlQ7CisJCQlpaG9zdCA9IHBjaV9pbmZvLT5ob3N0c1tpZF07CisJCQltc2l4ID0gJnBjaV9pbmZvLT5tc2l4X2VudHJpZXNbaV07CisJCQlkZXZtX2ZyZWVfaXJxKCZwZGV2LT5kZXYsIG1zaXgtPnZlY3RvciwgaWhvc3QpOworCQl9CisJCXBjaV9kaXNhYmxlX21zaXgocGRldik7CisJCWdvdG8gaW50eDsKKwl9CisJcmV0dXJuIDA7CisKKyBpbnR4OgorCWZvcl9lYWNoX2lzY2lfaG9zdChpLCBpaG9zdCwgcGRldikgeworCQllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHBkZXYtPmlycSwgaXNjaV9pbnR4X2lzciwKKwkJCQkgICAgICAgSVJRRl9TSEFSRUQsIERSVl9OQU1FIi1pbnR4IiwgaWhvc3QpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3RfYWxsb2Moc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBpZCkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3Q7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJaW50IGVycjsKKworCWlzY2lfaG9zdCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmlzY2lfaG9zdCksIEdGUF9LRVJORUwpOworCWlmICghaXNjaV9ob3N0KQorCQlyZXR1cm4gTlVMTDsKKworCWlzY2lfaG9zdC0+cGRldiA9IHBkZXY7CisJaXNjaV9ob3N0LT5pZCA9IGlkOworCisJc2hvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmlzY2lfc2h0LCBzaXplb2Yodm9pZCAqKSk7CisJaWYgKCFzaG9zdCkKKwkJcmV0dXJuIE5VTEw7CisJaXNjaV9ob3N0LT5zaG9zdCA9IHNob3N0OworCisJZXJyID0gaXNjaV9ob3N0X2luaXQoaXNjaV9ob3N0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9zaG9zdDsKKworCVNIT1NUX1RPX1NBU19IQShzaG9zdCkgPSAmaXNjaV9ob3N0LT5zYXNfaGE7CisJaXNjaV9ob3N0LT5zYXNfaGEuY29yZS5zaG9zdCA9IHNob3N0OworCXNob3N0LT50cmFuc3BvcnR0ID0gaXNjaV90cmFuc3BvcnRfdGVtcGxhdGU7CisKKwlzaG9zdC0+bWF4X2lkID0gfjA7CisJc2hvc3QtPm1heF9sdW4gPSB+MDsKKwlzaG9zdC0+bWF4X2NtZF9sZW4gPSBNQVhfQ09NTUFORF9TSVpFOworCisJZXJyID0gc2NzaV9hZGRfaG9zdChzaG9zdCwgJnBkZXYtPmRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfc2hvc3Q7CisKKwllcnIgPSBpc2NpX3JlZ2lzdGVyX3Nhc19oYShpc2NpX2hvc3QpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3Nob3N0X3JlbW92ZTsKKworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2hvc3QtPnNob3N0X2RldiwgJmRldl9hdHRyX2lzY2lfaWQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfaGE7CisKKwlyZXR1cm4gaXNjaV9ob3N0OworCisgZXJyX3VucmVnaXN0ZXJfaGE6CisJc2FzX3VucmVnaXN0ZXJfaGEoJihpc2NpX2hvc3QtPnNhc19oYSkpOworIGVycl9zaG9zdF9yZW1vdmU6CisJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CisgZXJyX3Nob3N0OgorCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlzY2lfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGlzY2lfcGNpX2luZm8gKnBjaV9pbmZvOworCWludCBlcnIsIGk7CisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOworCXN0cnVjdCBpc2NpX29yb20gKm9yb20gPSBOVUxMOworCWNoYXIgKnNvdXJjZSA9ICIocGxhdGZvcm0pIjsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJkcml2ZXIgY29uZmlndXJlZCBmb3IgcmV2OiAlZCBzaWxpY29uXG4iLAorCQkgcGRldi0+cmV2aXNpb24pOworCisJcGNpX2luZm8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwY2lfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghcGNpX2luZm8pCisJCXJldHVybiAtRU5PTUVNOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwY2lfaW5mbyk7CisKKwlpZiAoZWZpX2VuYWJsZWQpCisJCW9yb20gPSBpc2NpX2dldF9lZmlfdmFyKHBkZXYpOworCisJaWYgKCFvcm9tKQorCQlvcm9tID0gaXNjaV9yZXF1ZXN0X29wcm9tKHBkZXYpOworCisJZm9yIChpID0gMDsgb3JvbSAmJiBpIDwgQVJSQVlfU0laRShvcm9tLT5jdHJsKTsgaSsrKSB7CisJCWlmIChzY2lfb2VtX3BhcmFtZXRlcnNfdmFsaWRhdGUoJm9yb20tPmN0cmxbaV0pKSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCSAiWyVkXTogaW52YWxpZCBvZW0gcGFyYW1ldGVycyBkZXRlY3RlZCwgZmFsbGluZyBiYWNrIHRvIGZpcm13YXJlXG4iLCBpKTsKKwkJCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgb3JvbSk7CisJCQlvcm9tID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFvcm9tKSB7CisJCXNvdXJjZSA9ICIoZmlybXdhcmUpIjsKKwkJb3JvbSA9IGlzY2lfcmVxdWVzdF9maXJtd2FyZShwZGV2LCBmdyk7CisJCWlmICghb3JvbSkgeworCQkJLyogVE9ETyBjb252ZXJ0IHRoaXMgdG8gV0FSTl9UQUlOVF9PTkNFIG9uY2UgdGhlCisJCQkgKiBvcm9tL2VmaSBwYXJhbWV0ZXIgc3VwcG9ydCBpcyB3aWRlbHkgYXZhaWxhYmxlCisJCQkgKi8KKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJICJMb2FkaW5nIHVzZXIgZmlybXdhcmUgZmFpbGVkLCB1c2luZyBkZWZhdWx0ICIKKwkJCQkgInZhbHVlc1xuIik7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCSAiRGVmYXVsdCBPRU0gY29uZmlndXJhdGlvbiBiZWluZyB1c2VkOiA0ICIKKwkJCQkgIm5hcnJvdyBwb3J0cywgYW5kIGRlZmF1bHQgU0FTIEFkZHJlc3Nlc1xuIik7CisJCX0KKwl9CisKKwlpZiAob3JvbSkKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCSAiT0VNIFNBUyBwYXJhbWV0ZXJzICh2ZXJzaW9uOiAldS4ldSkgbG9hZGVkICVzXG4iLAorCQkJIChvcm9tLT5oZHIudmVyc2lvbiAmIDB4ZjApID4+IDQsCisJCQkgKG9yb20tPmhkci52ZXJzaW9uICYgMHhmKSwgc291cmNlKTsKKworCXBjaV9pbmZvLT5vcm9tID0gb3JvbTsKKworCWVyciA9IGlzY2lfcGNpX2luaXQocGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY29udHJvbGxlcnMocGRldik7IGkrKykgeworCQlzdHJ1Y3QgaXNjaV9ob3N0ICpoID0gaXNjaV9ob3N0X2FsbG9jKHBkZXYsIGkpOworCisJCWlmICghaCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX2hvc3RfYWxsb2M7CisJCX0KKwkJcGNpX2luZm8tPmhvc3RzW2ldID0gaDsKKwl9CisKKwllcnIgPSBpc2NpX3NldHVwX2ludGVycnVwdHMocGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfaG9zdF9hbGxvYzsKKworCWZvcl9lYWNoX2lzY2lfaG9zdChpLCBpc2NpX2hvc3QsIHBkZXYpCisJCXNjc2lfc2Nhbl9ob3N0KGlzY2lfaG9zdC0+c2hvc3QpOworCisJcmV0dXJuIDA7CisKKyBlcnJfaG9zdF9hbGxvYzoKKwlmb3JfZWFjaF9pc2NpX2hvc3QoaSwgaXNjaV9ob3N0LCBwZGV2KQorCQlpc2NpX3VucmVnaXN0ZXIoaXNjaV9ob3N0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaXNjaV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0OworCWludCBpOworCisJZm9yX2VhY2hfaXNjaV9ob3N0KGksIGlob3N0LCBwZGV2KSB7CisJCWlzY2lfdW5yZWdpc3RlcihpaG9zdCk7CisJCWlzY2lfaG9zdF9kZWluaXQoaWhvc3QpOworCQlzY2lfY29udHJvbGxlcl9kaXNhYmxlX2ludGVycnVwdHMoaWhvc3QpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlzY2lfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSBpc2NpX2lkX3RhYmxlLAorCS5wcm9iZQkJPSBpc2NpX3BjaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGlzY2lfcGNpX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBpc2NpX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcHJfaW5mbygiJXM6IEludGVsKFIpIEM2MDAgU0FTIENvbnRyb2xsZXIgRHJpdmVyXG4iLCBEUlZfTkFNRSk7CisKKwlpc2NpX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IHNhc19kb21haW5fYXR0YWNoX3RyYW5zcG9ydCgmaXNjaV90cmFuc3BvcnRfb3BzKTsKKwlpZiAoIWlzY2lfdHJhbnNwb3J0X3RlbXBsYXRlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlzY2lfcGNpX2RyaXZlcik7CisJaWYgKGVycikKKwkJc2FzX3JlbGVhc2VfdHJhbnNwb3J0KGlzY2lfdHJhbnNwb3J0X3RlbXBsYXRlKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBpc2NpX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlzY2lfcGNpX2RyaXZlcik7CisJc2FzX3JlbGVhc2VfdHJhbnNwb3J0KGlzY2lfdHJhbnNwb3J0X3RlbXBsYXRlKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0ZJUk1XQVJFKElTQ0lfRldfTkFNRSk7Cittb2R1bGVfaW5pdChpc2NpX2luaXQpOworbW9kdWxlX2V4aXQoaXNjaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2lzY2kuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL2lzY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRlNjMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaXNjaS5oCkBAIC0wLDAgKzEsNTM4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fSVNDSV9IX18KKyNkZWZpbmUgX19JU0NJX0hfXworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBEUlZfTkFNRSAiaXNjaSIKKyNkZWZpbmUgU0NJX1BDSV9CQVJfQ09VTlQgMgorI2RlZmluZSBTQ0lfTlVNX01TSV9YX0lOVCAyCisjZGVmaW5lIFNDSV9TTVVfQkFSICAgICAgIDAKKyNkZWZpbmUgU0NJX1NNVV9CQVJfU0laRSAgKDE2KjEwMjQpCisjZGVmaW5lIFNDSV9TQ1VfQkFSICAgICAgIDEKKyNkZWZpbmUgU0NJX1NDVV9CQVJfU0laRSAgKDQqMTAyNCoxMDI0KQorI2RlZmluZSBTQ0lfSU9fU1BBQ0VfQkFSMCAyCisjZGVmaW5lIFNDSV9JT19TUEFDRV9CQVIxIDMKKyNkZWZpbmUgSVNDSV9DQU5fUVVFVUVfVkFMIDI1MCAvKiA8IFNDSV9NQVhfSU9fUkVRVUVTVFMgPyAqLworI2RlZmluZSBTQ0lDX0NPTlRST0xMRVJfU1RPUF9USU1FT1VUIDUwMDAKKworI2RlZmluZSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRyAweEZGRkYKKworI2RlZmluZSBTQ0lfTUFYX1BIWVMgICg0VUwpCisjZGVmaW5lIFNDSV9NQVhfUE9SVFMgU0NJX01BWF9QSFlTCisjZGVmaW5lIFNDSV9NQVhfU01QX1BIWVMgICgzODQpIC8qIG5vdCBzaWxpY29uIGNvbnN0cmFpbmVkICovCisjZGVmaW5lIFNDSV9NQVhfUkVNT1RFX0RFVklDRVMgKDI1NlVMKQorI2RlZmluZSBTQ0lfTUFYX0lPX1JFUVVFU1RTICgyNTZVTCkKKyNkZWZpbmUgU0NJX01BWF9TRVEgKDE2KQorI2RlZmluZSBTQ0lfTUFYX01TSVhfTUVTU0FHRVMgICgyKQorI2RlZmluZSBTQ0lfTUFYX1NDQVRURVJfR0FUSEVSX0VMRU1FTlRTIDEzMCAvKiBub3Qgc2lsaWNvbiBjb25zdHJhaW5lZCAqLworI2RlZmluZSBTQ0lfTUFYX0NPTlRST0xMRVJTIDIKKyNkZWZpbmUgU0NJX01BWF9ET01BSU5TICBTQ0lfTUFYX1BPUlRTCisKKyNkZWZpbmUgU0NVX01BWF9DUklUSUNBTF9OT1RJRklDQVRJT05TICAgICgzODQpCisjZGVmaW5lIFNDVV9NQVhfRVZFTlRTX1NISUZUCQkgICg3KQorI2RlZmluZSBTQ1VfTUFYX0VWRU5UUyAgICAgICAgICAgICAgICAgICAgKDEgPDwgU0NVX01BWF9FVkVOVFNfU0hJRlQpCisjZGVmaW5lIFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTICAgICAgICAoMTI4KQorI2RlZmluZSBTQ1VfTUFYX0NPTVBMRVRJT05fUVVFVUVfU0NSQVRDSCAgKDEyOCkKKyNkZWZpbmUgU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX0VOVFJJRVMgIChTQ1VfTUFYX0NSSVRJQ0FMX05PVElGSUNBVElPTlMgXAorCQkJCQkgICArIFNDVV9NQVhfRVZFTlRTIFwKKwkJCQkJICAgKyBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUwlcCisJCQkJCSAgICsgU0NJX01BWF9JT19SRVFVRVNUUyBcCisJCQkJCSAgICsgU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX1NDUkFUQ0gpCisjZGVmaW5lIFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9TSElGVAkgIChpbG9nMihTQ1VfTUFYX0NPTVBMRVRJT05fUVVFVUVfRU5UUklFUykpCisKKyNkZWZpbmUgU0NVX0FCU09MVVRFX01BWF9VTlNPTElDSVRFRF9GUkFNRVMgKDQwOTYpCisjZGVmaW5lIFNDVV9VTlNPTElDSVRFRF9GUkFNRV9CVUZGRVJfU0laRSAgICgxMDI0KQorI2RlZmluZSBTQ1VfSU5WQUxJRF9GUkFNRV9JTkRFWCAgICAgICAgICAgICAoMHhGRkZGKQorCisjZGVmaW5lIFNDVV9JT19SRVFVRVNUX01BWF9TR0VfU0laRSAgICAgICAgICgweDAwRkZGRkZGKQorI2RlZmluZSBTQ1VfSU9fUkVRVUVTVF9NQVhfVFJBTlNGRVJfTEVOR1RIICAoMHgwMEZGRkZGRikKKworc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3NpemVzKHZvaWQpCit7CisJQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKFNDVV9NQVhfRVZFTlRTKTsKKwlCVUlMRF9CVUdfT04oU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMgPD0gOCk7CisJQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTKTsKKwlCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIoU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX0VOVFJJRVMpOworCUJVSUxEX0JVR19PTihTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyA+IFNDVV9BQlNPTFVURV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTKTsKKwlCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIoU0NJX01BWF9JT19SRVFVRVNUUyk7CisJQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKFNDSV9NQVhfU0VRKTsKK30KKworLyoqCisgKiBlbnVtIHNjaV9zdGF0dXMgLSBUaGlzIGlzIHRoZSBnZW5lcmFsIHJldHVybiBzdGF0dXMgZW51bWVyYXRpb24gZm9yIG5vbi1JTywKKyAqICAgIG5vbi10YXNrIG1hbmFnZW1lbnQgcmVsYXRlZCBTQ0kgaW50ZXJmYWNlIG1ldGhvZHMuCisgKgorICoKKyAqLworZW51bSBzY2lfc3RhdHVzIHsKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLgorCSAqLworCVNDSV9TVUNDRVNTID0gMCwKKworCS8qKgorCSAqIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxpbmcgbWV0aG9kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksCisJICogYnV0IHRoYXQgdGhlIElPIG1heSBoYXZlIGNvbXBsZXRlZCBiZWZvcmUgaGF2aW5nIGl0J3Mgc3RhcnQgbWV0aG9kCisJICogaW52b2tlZC4gIFRoaXMgb2NjdXJzIGR1cmluZyBTQVQgdHJhbnNsYXRpb24gZm9yIHJlcXVlc3RzIHRoYXQgZG8KKwkgKiBub3QgcmVxdWlyZSBhbiBJTyB0byB0aGUgdGFyZ2V0IG9yIGZvciBhbnkgb3RoZXIgcmVxdWVzdHMgdGhhdCBtYXkKKwkgKiBiZSBjb21wbGV0ZWQgd2l0aG91dCBoYXZpbmcgdG8gc3VibWl0IElPLgorCSAqLworCVNDSV9TVUNDRVNTX0lPX0NPTVBMRVRFX0JFRk9SRV9TVEFSVCwKKworCS8qKgorCSAqICBUaGlzIFZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBTQ1UgaGFyZHdhcmUgcmV0dXJuZWQgYW4gZWFybHkgcmVzcG9uc2UKKwkgKiAgYmVjYXVzZSB0aGUgaW8gcmVxdWVzdCBzcGVjaWZpZWQgbW9yZSBkYXRhIHRoYW4gaXMgcmV0dXJuZWQgYnkgdGhlCisJICogIHRhcmdldCBkZXZpY2UgKG1vZGUgcGFnZXMsIGlucXVpcnkgZGF0YSwgZXRjLikuIFRoZSBjb21wbGV0aW9uIHJvdXRpbmUKKwkgKiAgd2lsbCBoYW5kbGUgdGhpcyBjYXNlIHRvIGdldCB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KKwkgKi8KKwlTQ0lfU1VDQ0VTU19JT19ET05FX0VBUkxZLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG9iamVjdCBmb3Igd2hpY2ggYSBzdGF0ZSBjaGFuZ2UgaXMKKwkgKiBiZWluZyByZXF1ZXN0ZWQgaXMgYWxyZWFkeSBpbiBzYWlkIHN0YXRlLgorCSAqLworCVNDSV9XQVJOSU5HX0FMUkVBRFlfSU5fU1RBVEUsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgaW50ZXJydXB0IGNvYWxlc2NlbmNlIHRpbWVyIG1heSBjYXVzZSBTQVMKKwkgKiBzcGVjaWZpY2F0aW9uIGNvbXBsaWFuY2UgaXNzdWVzIChpLmUuIFNNUCB0YXJnZXQgbW9kZSByZXNwb25zZQorCSAqIGZyYW1lcyBtdXN0IGJlIHJldHVybmVkIHdpdGhpbiAxLjkgbWlsbGlzZWNvbmRzKS4KKwkgKi8KKwlTQ0lfV0FSTklOR19USU1FUl9DT05GTElDVCwKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaW5kaWNhdGVzIGEgc2VxdWVuY2Ugb2YgYWN0aW9uIGlzIG5vdCBjb21wbGV0ZWQgeWV0LiBNb3N0bHksCisJICogdGhpcyBzdGF0dXMgaXMgdXNlZCB3aGVuIG11bHRpcGxlIEFUQSBjb21tYW5kcyBhcmUgbmVlZGVkIGluIGEgU0FUSSB0cmFuc2xhdGlvbi4KKwkgKi8KKwlTQ0lfV0FSTklOR19TRVFVRU5DRV9JTkNPTVBMRVRFLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIGEgZ2VuZXJhbCBmYWlsdXJlLgorCSAqLworCVNDSV9GQUlMVVJFLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIFNDSSBpbXBsZW1lbnRhdGlvbiBpcyB1bmFibGUgdG8gY29tcGxldGUKKwkgKiBhbiBvcGVyYXRpb24gZHVlIHRvIGEgY3JpdGljYWwgZmxhdyB0aGUgcHJldmVudHMgYW55IGZ1cnRoZXIgb3BlcmF0aW9uCisJICogKGkuZS4gYW4gaW52YWxpZCBwb2ludGVyKS4KKwkgKi8KKwlTQ0lfRkFUQUxfRVJST1IsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIHRoZSBzdGF0ZQorCSAqIG9mIHRoZSBjb250cm9sbGVyIGlzIGluIGEgc3RhdGUgdGhhdCBwcmV2ZW50cyBzdWNjZXNzZnVsIGNvbXBsZXRpb24uCisJICovCisJU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlcmUgaXMKKwkgKiBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzL21lbW9yeSB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUKKwkgKiBjb250cm9sbGVyIG9iamVjdCByZXF1aXJlZCBmb3IgdGhlIG9wZXJhdGlvbiBjYW4ndCBiZSBsb2NhdGVkLgorCSAqLworCVNDSV9GQUlMVVJFX0NPTlRST0xMRVJfTk9UX0ZPVU5ELAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUKKwkgKiBkaXNjb3ZlcmVkIGNvbnRyb2xsZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5LgorCSAqLworCVNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX0NPTlRST0xMRVJfVFlQRSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlCisJICogcmVxdWVzdGVkIGluaXRpYWxpemF0aW9uIGRhdGEgdmVyc2lvbiBpc24ndCBzdXBwb3J0ZWQuCisJICovCisJU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfSU5JVF9EQVRBX1ZFUlNJT04sCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIHRoZQorCSAqIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIG9mIFNBUyBQaHlzIGludG8gU0FTIFBvcnRzIGlzIG5vdCBzdXBwb3J0ZWQuCisJICovCisJU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUKKwkgKiByZXF1ZXN0ZWQgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcmVtb3RlIGRldmljZSwgcG9ydCwKKwkgKiBvciBjb250cm9sbGVyLgorCSAqLworCVNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUKKwkgKiByZXF1ZXN0ZWQgaW5mb3JtYXRpb24gdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBTQ0kgaW1wbGVtZW50YXRpb24uCisJICovCisJU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfSU5GT1JNQVRJT05fVFlQRSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlCisJICogZGV2aWNlIGFscmVhZHkgZXhpc3RzLgorCSAqLworCVNDSV9GQUlMVVJFX0RFVklDRV9FWElTVFMsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIGFkZGluZworCSAqIGEgcGh5IHRvIHRoZSBvYmplY3QgaXMgbm90IHBvc3NpYmxlLgorCSAqLworCVNDSV9GQUlMVVJFX0FERElOR19QSFlfVU5TVVBQT1JURUQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZmFpbGVkLCBiZWNhdXNlIHRoZQorCSAqIHJlcXVlc3RlZCBpbmZvcm1hdGlvbiB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFNDSSBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9JTkZPUk1BVElPTl9GSUVMRCwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlIFNDSQorCSAqIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN1cHBsaWVkIHRpbWUgbGltaXQuCisJICovCisJU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfVElNRV9MSU1JVCwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBtZXRob2QgZmFpbGVkLCBiZWNhdXNlIHRoZSBTQ0kKKwkgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjb250YWluIHRoZSBzcGVjaWZpZWQgUGh5LgorCSAqLworCVNDSV9GQUlMVVJFX0lOVkFMSURfUEhZLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoZSBjYWxsaW5nIG1ldGhvZCBmYWlsZWQsIGJlY2F1c2UgdGhlIFNDSQorCSAqIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCBQb3J0LgorCSAqLworCVNDSV9GQUlMVVJFX0lOVkFMSURfUE9SVCwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBtZXRob2Qgd2FzIHBhcnRseSBzdWNjZXNzZnVsCisJICogVGhlIHBvcnQgd2FzIHJlc2V0IGJ1dCBub3QgYWxsIHBoeXMgaW4gcG9ydCBhcmUgb3BlcmF0aW9uYWwKKwkgKi8KKwlTQ0lfRkFJTFVSRV9SRVNFVF9QT1JUX1BBUlRJQUxfU1VDQ0VTUywKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGF0IGNhbGxpbmcgbWV0aG9kIGZhaWxlZAorCSAqIFRoZSBwb3J0IHJlc2V0IGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBub25lIG9mIHRoZSBwaHlzIGFyZSBvcGVyYXRpb25hbAorCSAqLworCVNDSV9GQUlMVVJFX1JFU0VUX1BPUlRfRkFJTFVSRSwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGUgY2FsbGluZyBtZXRob2QgZmFpbGVkLCBiZWNhdXNlIHRoZSBTQ0kKKwkgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjb250YWluIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGRldmljZS4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JTlZBTElEX1JFTU9URV9ERVZJQ0UsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgbWV0aG9kIGZhaWxlZCwgYmVjYXVzZSB0aGUgcmVtb3RlCisJICogZGV2aWNlIGlzIGluIGEgYmFkIHN0YXRlIGFuZCByZXF1aXJlcyBhIHJlc2V0LgorCSAqLworCVNDSV9GQUlMVVJFX1JFTU9URV9ERVZJQ0VfUkVTRVRfUkVRVUlSRUQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgbWV0aG9kIGZhaWxlZCwgYmVjYXVzZSB0aGUgU0NJCisJICogaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY29udGFpbiBvciBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgSU8gdGFnLgorCSAqLworCVNDSV9GQUlMVVJFX0lOVkFMSURfSU9fVEFHLAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBmYWlsZWQgYW5kIHRoZSB1c2VyIHNob3VsZAorCSAqIGNoZWNrIHRoZSByZXNwb25zZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgSU8uCisJICovCisJU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIGZhaWxlZCwgdGhlIGZhaWx1cmUgaXMKKwkgKiBjb250cm9sbGVyIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLCBhbmQgdGhlIHJlc3BvbnNlIGRhdGEgYXNzb2NpYXRlZAorCSAqIHdpdGggdGhlIHJlcXVlc3QgaXMgbm90IHZhbGlkLiAgWW91IGNhbiBxdWVyeSBmb3IgdGhlIGNvbnRyb2xsZXIKKwkgKiBzcGVjaWZpYyBlcnJvciBpbmZvcm1hdGlvbiB2aWEgc2NpX2NvbnRyb2xsZXJfZ2V0X3JlcXVlc3Rfc3RhdHVzKCkKKwkgKi8KKwlTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUiwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlZCB0aGF0IHRoZSBvcGVyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlCisJICogdXNlciByZXF1ZXN0ZWQgdGhpcyBJTyB0byBiZSB0ZXJtaW5hdGVkLgorCSAqLworCVNDSV9GQUlMVVJFX0lPX1RFUk1JTkFURUQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIGZhaWxlZCBhbmQgdGhlIGFzc29jaWF0ZWQKKwkgKiByZXF1ZXN0IHJlcXVpcmVzIGEgU0NTSSBhYm9ydCB0YXNrIHRvIGJlIHNlbnQgdG8gdGhlIHRhcmdldC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JT19SRVFVSVJFU19TQ1NJX0FCT1JULAorCisJLyoqCisJICogVGhpcyBtZW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgc3VwcGxpZWQKKwkgKiBkZXZpY2UgY291bGQgbm90IGJlIGxvY2F0ZWQuCisJICovCisJU0NJX0ZBSUxVUkVfREVWSUNFX05PVF9GT1VORCwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBvcGVyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlCisJICogb2JqZWN0cyBhc3NvY2lhdGlvbiBpcyByZXF1aXJlZCBhbmQgaXMgbm90IGNvcnJlY3RseSBzZXQuCisJICovCisJU0NJX0ZBSUxVUkVfSU5WQUxJRF9BU1NPQ0lBVElPTiwKKworCS8qKgorCSAqIFRoaXMgbWVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBvcGVyYXRpb24gZmFpbGVkLCBiZWNhdXNlIGEgdGltZW91dAorCSAqIG9jY3VycmVkLgorCSAqLworCVNDSV9GQUlMVVJFX1RJTUVPVVQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIGZhaWxlZCwgYmVjYXVzZSB0aGUgdXNlcgorCSAqIHNwZWNpZmllZCBhIHZhbHVlIHRoYXQgaXMgZWl0aGVyIGludmFsaWQgb3Igbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSwKKworCS8qKgorCSAqIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBmYWlsZWQsIGJlY2F1c2UgdGhlIG51bWJlcgorCSAqIG9mIG1lc3NhZ2VzIChNU0ktWCkgaXMgbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9NRVNTQUdFX0NPVU5ULAorCisJLyoqCisJICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbWV0aG9kIGZhaWxlZCBkdWUgdG8gYSBsYWNrIG9mCisJICogYXZhaWxhYmxlIE5DUSB0YWdzLgorCSAqLworCVNDSV9GQUlMVVJFX05PX05DUV9UQUdfQVZBSUxBQkxFLAorCisJLyoqCisJICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBhIHByb3RvY29sIHZpb2xhdGlvbiBoYXMgb2NjdXJyZWQgb24gdGhlCisJICogbGluay4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9QUk9UT0NPTF9WSU9MQVRJT04sCisKKwkvKioKKwkgKiBUaGlzIHZhbHVlIGluZGljYXRlcyBhIGZhaWx1cmUgY29uZGl0aW9uIHRoYXQgcmV0cnkgbWF5IGhlbHAgdG8gY2xlYXIuCisJICovCisJU0NJX0ZBSUxVUkVfUkVUUllfUkVRVUlSRUQsCisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgcmV0cnkgbGltaXQgd2FzIHJlYWNoZWQgd2hlbiBhIHJldHJ5IGlzIGF0dGVtcHRlZAorCSAqLworCVNDSV9GQUlMVVJFX1JFVFJZX0xJTUlUX1JFQUNIRUQsCisKKwkvKioKKwkgKiBUaGlzIG1lbWJlciBpbmRpY2F0ZXMgdGhlIGNhbGxpbmcgbWV0aG9kIHdhcyBwYXJ0bHkgc3VjY2Vzc2Z1bC4KKwkgKiBNb3N0bHksIHRoaXMgc3RhdHVzIGlzIHVzZWQgd2hlbiBhIExVTl9SRVNFVCBpc3N1ZWQgdG8gYW4gZXhwYW5kZXIgYXR0YWNoZWQKKwkgKiBTVFAgZGV2aWNlIGluIFJFQURZIE5DUSBzdWJzdGF0ZSBuZWVkcyB0byBoYXZlIFJOQyBzdXNwZW5kZWQvcmVzdW1lZAorCSAqIGJlZm9yZSBwb3N0aW5nIFRDLgorCSAqLworCVNDSV9GQUlMVVJFX1JFU0VUX0RFVklDRV9QQVJUSUFMX1NVQ0NFU1MsCisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyBhbiBpbGxlZ2FsIHBoeSBjb25uZWN0aW9uIGJhc2VkIG9uIHRoZSByb3V0aW5nIGF0dHJpYnV0ZQorCSAqIG9mIGJvdGggZXhwYW5kZXIgcGh5IGF0dGFjaGVkIHRvIGVhY2ggb3RoZXIuCisJICovCisJU0NJX0ZBSUxVUkVfSUxMRUdBTF9ST1VUSU5HX0FUVFJJQlVURV9DT05GSUdVUkFUSU9OLAorCisJLyoqCisJICogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgYSBDT05GSUcgUk9VVEUgSU5GTyBjb21tYW5kIGhhcyBhIHJlc3BvbnNlIHdpdGggZnVuY3Rpb24gcmVzdWx0CisJICogSU5ERVggRE9FUyBOT1QgRVhJU1QsIHVzdWFsbHkgbWVhbnMgZXhjZWVkaW5nIG1heCByb3V0ZSBpbmRleC4KKwkgKi8KKwlTQ0lfRkFJTFVSRV9FWENFRURfTUFYX1JPVVRFX0lOREVYLAorCisJLyoqCisJICogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBhbiB1bnN1cHBvcnRlZCBQQ0kgZGV2aWNlIElEIGhhcyBiZWVuCisJICogc3BlY2lmaWVkLiAgVGhpcyBpbmRpY2F0ZXMgdGhhdCBhdHRlbXB0cyB0byBpbnZva2UKKwkgKiBzY2lfbGlicmFyeV9hbGxvY2F0ZV9jb250cm9sbGVyKCkgd2lsbCBmYWlsLgorCSAqLworCVNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BDSV9ERVZJQ0VfSUQKKworfTsKKworLyoqCisgKiBlbnVtIHNjaV9pb19zdGF0dXMgLSBUaGlzIGVudW1lcmF0aW9uIGRlcGljdHMgYWxsIG9mIHRoZSBwb3NzaWJsZSBJTworICogICAgY29tcGxldGlvbiBzdGF0dXMgdmFsdWVzLiAgRWFjaCB2YWx1ZSBpbiB0aGlzIGVudW1lcmF0aW9uIG1hcHMgZGlyZWN0bHkKKyAqICAgIHRvIGEgdmFsdWUgaW4gdGhlIGVudW0gc2NpX3N0YXR1cyBlbnVtZXJhdGlvbi4gIFBsZWFzZSByZWZlciB0byB0aGF0CisgKiAgICBlbnVtZXJhdGlvbiBmb3IgZGV0YWlsZWQgY29tbWVudHMgY29uY2VybmluZyB3aGF0IHRoZSBzdGF0dXMgcmVwcmVzZW50cy4KKyAqCisgKiBBZGQgdGhlIEFQSSB0byByZXRyaWV2ZSB0aGUgU0NVIHN0YXR1cyBmcm9tIHRoZSBjb3JlLiBDaGVjayB0byBzZWUgdGhhdCB0aGUKKyAqIGZvbGxvd2luZyBzdGF0dXMgYXJlIHByb3Blcmx5IGhhbmRsZWQ6IC0gU0NJX0lPX0ZBSUxVUkVfVU5TVVBQT1JURURfUFJPVE9DT0wKKyAqIC0gU0NJX0lPX0ZBSUxVUkVfSU5WQUxJRF9JT19UQUcKKyAqLworZW51bSBzY2lfaW9fc3RhdHVzIHsKKwlTQ0lfSU9fU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICA9IFNDSV9TVUNDRVNTLAorCVNDSV9JT19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgID0gU0NJX0ZBSUxVUkUsCisJU0NJX0lPX1NVQ0NFU1NfQ09NUExFVEVfQkVGT1JFX1NUQVJUICAgPSBTQ0lfU1VDQ0VTU19JT19DT01QTEVURV9CRUZPUkVfU1RBUlQsCisJU0NJX0lPX1NVQ0NFU1NfSU9fRE9ORV9FQVJMWSAgICAgICAgICAgPSBTQ0lfU1VDQ0VTU19JT19ET05FX0VBUkxZLAorCVNDSV9JT19GQUlMVVJFX0lOVkFMSURfU1RBVEUgICAgICAgICAgID0gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURSwKKwlTQ0lfSU9fRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTICA9IFNDSV9GQUlMVVJFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMsCisJU0NJX0lPX0ZBSUxVUkVfVU5TVVBQT1JURURfUFJPVE9DT0wgICAgPSBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTCwKKwlTQ0lfSU9fRkFJTFVSRV9SRVNQT05TRV9WQUxJRCAgICAgICAgICA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElELAorCVNDSV9JT19GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfRVJSID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlIsCisJU0NJX0lPX0ZBSUxVUkVfVEVSTUlOQVRFRCAgICAgICAgICAgICAgPSBTQ0lfRkFJTFVSRV9JT19URVJNSU5BVEVELAorCVNDSV9JT19GQUlMVVJFX1JFUVVJUkVTX1NDU0lfQUJPUlQgICAgID0gU0NJX0ZBSUxVUkVfSU9fUkVRVUlSRVNfU0NTSV9BQk9SVCwKKwlTQ0lfSU9fRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSA9IFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFLAorCVNDSV9JT19GQUlMVVJFX05PX05DUV9UQUdfQVZBSUxBQkxFICAgID0gU0NJX0ZBSUxVUkVfTk9fTkNRX1RBR19BVkFJTEFCTEUsCisJU0NJX0lPX0ZBSUxVUkVfUFJPVE9DT0xfVklPTEFUSU9OICAgICAgPSBTQ0lfRkFJTFVSRV9QUk9UT0NPTF9WSU9MQVRJT04sCisKKwlTQ0lfSU9fRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEID0gU0NJX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRCwKKworCVNDSV9JT19GQUlMVVJFX1JFVFJZX1JFUVVJUkVEICAgICAgPSBTQ0lfRkFJTFVSRV9SRVRSWV9SRVFVSVJFRCwKKwlTQ0lfSU9fRkFJTFVSRV9SRVRSWV9MSU1JVF9SRUFDSEVEID0gU0NJX0ZBSUxVUkVfUkVUUllfTElNSVRfUkVBQ0hFRCwKKwlTQ0lfSU9fRkFJTFVSRV9JTlZBTElEX1JFTU9URV9ERVZJQ0UgPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1JFTU9URV9ERVZJQ0UKK307CisKKy8qKgorICogZW51bSBzY2lfdGFza19zdGF0dXMgLSBUaGlzIGVudW1lcmF0aW9uIGRlcGljdHMgYWxsIG9mIHRoZSBwb3NzaWJsZSB0YXNrCisgKiAgICBjb21wbGV0aW9uIHN0YXR1cyB2YWx1ZXMuICBFYWNoIHZhbHVlIGluIHRoaXMgZW51bWVyYXRpb24gbWFwcyBkaXJlY3RseQorICogICAgdG8gYSB2YWx1ZSBpbiB0aGUgZW51bSBzY2lfc3RhdHVzIGVudW1lcmF0aW9uLiAgUGxlYXNlIHJlZmVyIHRvIHRoYXQKKyAqICAgIGVudW1lcmF0aW9uIGZvciBkZXRhaWxlZCBjb21tZW50cyBjb25jZXJuaW5nIHdoYXQgdGhlIHN0YXR1cyByZXByZXNlbnRzLgorICoKKyAqIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBmb2xsb3dpbmcgc3RhdHVzIGFyZSBwcm9wZXJseSBoYW5kbGVkOgorICovCitlbnVtIHNjaV90YXNrX3N0YXR1cyB7CisJU0NJX1RBU0tfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICA9IFNDSV9TVUNDRVNTLAorCVNDSV9UQVNLX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgPSBTQ0lfRkFJTFVSRSwKKwlTQ0lfVEFTS19GQUlMVVJFX0lOVkFMSURfU1RBVEUgICAgICAgICAgID0gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURSwKKwlTQ0lfVEFTS19GQUlMVVJFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgID0gU0NJX0ZBSUxVUkVfSU5TVUZGSUNJRU5UX1JFU09VUkNFUywKKwlTQ0lfVEFTS19GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MICAgID0gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUFJPVE9DT0wsCisJU0NJX1RBU0tfRkFJTFVSRV9JTlZBTElEX1RBRyAgICAgICAgICAgICA9IFNDSV9GQUlMVVJFX0lOVkFMSURfSU9fVEFHLAorCVNDSV9UQVNLX0ZBSUxVUkVfUkVTUE9OU0VfVkFMSUQgICAgICAgICAgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRCwKKwlTQ0lfVEFTS19GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfRVJSID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlIsCisJU0NJX1RBU0tfRkFJTFVSRV9URVJNSU5BVEVEICAgICAgICAgICAgICA9IFNDSV9GQUlMVVJFX0lPX1RFUk1JTkFURUQsCisJU0NJX1RBU0tfRkFJTFVSRV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSA9IFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFLAorCisJU0NJX1RBU0tfRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEID0gU0NJX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRCwKKwlTQ0lfVEFTS19GQUlMVVJFX1JFU0VUX0RFVklDRV9QQVJUSUFMX1NVQ0NFU1MgPSBTQ0lfRkFJTFVSRV9SRVNFVF9ERVZJQ0VfUEFSVElBTF9TVUNDRVNTCisKK307CisKKy8qKgorICogc2NpX3N3YWIzMl9jcHkgLSBjb252ZXJ0IGJldHdlZW4gc2NzaSBhbmQgc2N1LWhhcmR3YXJlIGJ5dGUgZm9ybWF0CisgKiBAZGVzdDogcmVjZWl2ZSB0aGUgNC1ieXRlIGVuZGlhbiBzd2FwcGVkIHZlcnNpb24gb2Ygc3JjCisgKiBAc3JjOiB3b3JkIGFsaWduZWQgc291cmNlIGJ1ZmZlcgorICoKKyAqIHNjdSBoYXJkd2FyZSBoYW5kbGVzIFNTUC9TTVAgY29udHJvbCwgcmVzcG9uc2UsIGFuZCB1bmlkZW50aWZpZWQKKyAqIGZyYW1lcyBpbiAiYmlnIGVuZGlhbiBkd29yZCIgb3JkZXIuICBSZWdhcmRsZXNzIG9mIGhvc3QgZW5kaWFuIHRoaXMKKyAqIGlzIGFsd2F5cyBhIHN3YWIzMigpLXBlci1kd29yZCBjb252ZXJzaW9uIG9mIHRoZSBzdGFuZGFyZCBkZWZpbml0aW9uLAorICogaS5lLiBzaW5nbGUgYnl0ZSBmaWVsZHMgc3dhcHBlZCBhbmQgbXVsdGktYnl0ZSBmaWVsZHMgaW4gbGl0dGxlLQorICogZW5kaWFuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2lfc3dhYjMyX2NweSh2b2lkICpfZGVzdCwgdm9pZCAqX3NyYywgc3NpemVfdCB3b3JkX2NudCkKK3sKKwl1MzIgKmRlc3QgPSBfZGVzdCwgKnNyYyA9IF9zcmM7CisKKwl3aGlsZSAoLS13b3JkX2NudCA+PSAwKQorCQlkZXN0W3dvcmRfY250XSA9IHN3YWIzMihzcmNbd29yZF9jbnRdKTsKK30KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgbm9fb3V0Ym91bmRfdGFza190bzsKK2V4dGVybiB1MTYgc3NwX21heF9vY2NfdG87CitleHRlcm4gdTE2IHN0cF9tYXhfb2NjX3RvOworZXh0ZXJuIHUxNiBzc3BfaW5hY3RpdmVfdG87CitleHRlcm4gdTE2IHN0cF9pbmFjdGl2ZV90bzsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBoeV9nZW47CitleHRlcm4gdW5zaWduZWQgY2hhciBtYXhfY29uY3Vycl9zcGludXA7CisKK2lycXJldHVybl90IGlzY2lfbXNpeF9pc3IoaW50IHZlYywgdm9pZCAqZGF0YSk7CitpcnFyZXR1cm5fdCBpc2NpX2ludHhfaXNyKGludCB2ZWMsIHZvaWQgKmRhdGEpOworaXJxcmV0dXJuX3QgaXNjaV9lcnJvcl9pc3IoaW50IHZlYywgdm9pZCAqZGF0YSk7CisKKy8qCisgKiBFYWNoIHRpbWVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNhbmNlbGxhdGlvbiBmbGFnIHRoYXQgaXMgc2V0IHdoZW4KKyAqIGRlbF90aW1lcigpIGlzIGNhbGxlZCBhbmQgY2hlY2tlZCBpbiB0aGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24uIFRoaXMKKyAqIGlzIG5lZWRlZCBzaW5jZSBkZWxfdGltZXJfc3luYygpIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBzY2lfbG9jayBoZWxkLgorICogRm9yIGRlaW5pdCBob3dldmVyLCBkZWxfdGltZXJfc3luYygpIGlzIHVzZWQgd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrLgorICovCitzdHJ1Y3Qgc2NpX3RpbWVyIHsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlib29sCQkJY2FuY2VsOworfTsKKworc3RhdGljIGlubGluZQordm9pZCBzY2lfaW5pdF90aW1lcihzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIsIHZvaWQgKCpmbikodW5zaWduZWQgbG9uZykpCit7CisJdG1yLT50aW1lci5mdW5jdGlvbiA9IGZuOworCXRtci0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0bXI7CisJdG1yLT5jYW5jZWwgPSAwOworCWluaXRfdGltZXIoJnRtci0+dGltZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NpX21vZF90aW1lcihzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIsIHVuc2lnbmVkIGxvbmcgbXNlYykKK3sKKwl0bXItPmNhbmNlbCA9IDA7CisJbW9kX3RpbWVyKCZ0bXItPnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhtc2VjKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2lfZGVsX3RpbWVyKHN0cnVjdCBzY2lfdGltZXIgKnRtcikKK3sKKwl0bXItPmNhbmNlbCA9IDE7CisJZGVsX3RpbWVyKCZ0bXItPnRpbWVyKTsKK30KKworc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgeworCWNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSAqc3RhdGVfdGFibGU7CisJdTMyIGluaXRpYWxfc3RhdGVfaWQ7CisJdTMyIGN1cnJlbnRfc3RhdGVfaWQ7CisJdTMyIHByZXZpb3VzX3N0YXRlX2lkOworfTsKKwordHlwZWRlZiB2b2lkICgqc2NpX3N0YXRlX3RyYW5zaXRpb25fdCkoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKTsKKworc3RydWN0IHNjaV9iYXNlX3N0YXRlIHsKKwlzY2lfc3RhdGVfdHJhbnNpdGlvbl90IGVudGVyX3N0YXRlOwkvKiBDYWxsZWQgb24gc3RhdGUgZW50cnkgKi8KKwlzY2lfc3RhdGVfdHJhbnNpdGlvbl90IGV4aXRfc3RhdGU7CS8qIENhbGxlZCBvbiBzdGF0ZSBleGl0ICovCit9OworCitleHRlcm4gdm9pZCBzY2lfaW5pdF9zbShzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20sCisJCQljb25zdCBzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGUgKnN0YXRlX3RhYmxlLAorCQkJdTMyIGluaXRpYWxfc3RhdGUpOworZXh0ZXJuIHZvaWQgc2NpX2NoYW5nZV9zdGF0ZShzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20sIHUzMiBuZXh0X3N0YXRlKTsKKyNlbmRpZiAgLyogX19JU0NJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcGh5LmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9waHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTMxM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcGh5LmMKQEAgLTAsMCArMSwxMzEyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJzY3VfZXZlbnRfY29kZXMuaCIKKyNpbmNsdWRlICJwcm9iZV9yb21zLmgiCisKKy8qIE1heGltdW0gYXJiaXRyYXRpb24gd2FpdCB0aW1lIGluIG1pY3JvLXNlY29uZHMgKi8KKyNkZWZpbmUgU0NJQ19TRFNfUEhZX01BWF9BUkJJVFJBVElPTl9XQUlUX1RJTUUgICg3MDApCisKK2VudW0gc2FzX2xpbmtyYXRlIHNjaV9waHlfbGlua3JhdGUoc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXJldHVybiBpcGh5LT5tYXhfbmVnb3RpYXRlZF9zcGVlZDsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworc2NpX3BoeV90cmFuc3BvcnRfbGF5ZXJfaW5pdGlhbGl6YXRpb24oc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2N1X3RyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMgX19pb21lbSAqcmVnKQoreworCXUzMiB0bF9jb250cm9sOworCisJaXBoeS0+dHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycyA9IHJlZzsKKworCXdyaXRlbChTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgsCisJCSZpcGh5LT50cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzLT5zdHBfcm5pKTsKKworCS8qCisJICogSGFyZHdhcmUgdGVhbSByZWNvbW1lbmRzIHRoYXQgd2UgZW5hYmxlIHRoZSBTVFAgcHJlZmV0Y2ggZm9yIGFsbAorCSAqIHRyYW5zcG9ydHMKKwkgKi8KKwl0bF9jb250cm9sID0gcmVhZGwoJmlwaHktPnRyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMtPmNvbnRyb2wpOworCXRsX2NvbnRyb2wgfD0gU0NVX1RMQ1JfR0VOX0JJVChTVFBfV1JJVEVfREFUQV9QUkVGRVRDSCk7CisJd3JpdGVsKHRsX2NvbnRyb2wsICZpcGh5LT50cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzLT5jb250cm9sKTsKKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworc2NpX3BoeV9saW5rX2xheWVyX2luaXRpYWxpemF0aW9uKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwkJCQkgIHN0cnVjdCBzY3VfbGlua19sYXllcl9yZWdpc3RlcnMgX19pb21lbSAqcmVnKQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBoeS0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCWludCBwaHlfaWR4ID0gaXBoeS0+cGh5X2luZGV4OworCXN0cnVjdCBzY2lfcGh5X3VzZXJfcGFyYW1zICpwaHlfdXNlciA9ICZpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnBoeXNbcGh5X2lkeF07CisJc3RydWN0IHNjaV9waHlfb2VtX3BhcmFtcyAqcGh5X29lbSA9CisJCSZpaG9zdC0+b2VtX3BhcmFtZXRlcnMucGh5c1twaHlfaWR4XTsKKwl1MzIgcGh5X2NvbmZpZ3VyYXRpb247CisJc3RydWN0IHNjaV9waHlfY2FwIHBoeV9jYXA7CisJdTMyIHBhcml0eV9jaGVjayA9IDA7CisJdTMyIHBhcml0eV9jb3VudCA9IDA7CisJdTMyIGxsY3RsLCBsaW5rX3JhdGU7CisJdTMyIGNsa3NtX3ZhbHVlID0gMDsKKworCWlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzID0gcmVnOworCisJLyogU2V0IG91ciBJREVOVElGWSBmcmFtZSBkYXRhICovCisJI2RlZmluZSBTQ0lfRU5EX0RFVklDRSAweDAxCisKKwl3cml0ZWwoU0NVX1NBU19USUlEX0dFTl9CSVQoU01QX0lOSVRJQVRPUikgfAorCSAgICAgICBTQ1VfU0FTX1RJSURfR0VOX0JJVChTU1BfSU5JVElBVE9SKSB8CisJICAgICAgIFNDVV9TQVNfVElJRF9HRU5fQklUKFNUUF9JTklUSUFUT1IpIHwKKwkgICAgICAgU0NVX1NBU19USUlEX0dFTl9CSVQoREFfU0FUQV9IT1NUKSB8CisJICAgICAgIFNDVV9TQVNfVElJRF9HRU5fVkFMKERFVklDRV9UWVBFLCBTQ0lfRU5EX0RFVklDRSksCisJICAgICAgICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+dHJhbnNtaXRfaWRlbnRpZmljYXRpb24pOworCisJLyogV3JpdGUgdGhlIGRldmljZSBTQVMgQWRkcmVzcyAqLworCXdyaXRlbCgweEZFRENCQTk4LAorCSAgICAgICAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnNhc19kZXZpY2VfbmFtZV9oaWdoKTsKKwl3cml0ZWwocGh5X2lkeCwgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5zYXNfZGV2aWNlX25hbWVfbG93KTsKKworCS8qIFdyaXRlIHRoZSBzb3VyY2UgU0FTIEFkZHJlc3MgKi8KKwl3cml0ZWwocGh5X29lbS0+c2FzX2FkZHJlc3MuaGlnaCwKKwkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5zb3VyY2Vfc2FzX2FkZHJlc3NfaGlnaCk7CisJd3JpdGVsKHBoeV9vZW0tPnNhc19hZGRyZXNzLmxvdywKKwkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5zb3VyY2Vfc2FzX2FkZHJlc3NfbG93KTsKKworCS8qIENsZWFyIGFuZCBTZXQgdGhlIFBIWSBJZGVudGlmaWVyICovCisJd3JpdGVsKDAsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+aWRlbnRpZnlfZnJhbWVfcGh5X2lkKTsKKwl3cml0ZWwoU0NVX1NBU19USVBJRF9HRU5fVkFMVUUoSUQsIHBoeV9pZHgpLAorCQkmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPmlkZW50aWZ5X2ZyYW1lX3BoeV9pZCk7CisKKwkvKiBDaGFuZ2UgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIHBoeSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJcGh5X2NvbmZpZ3VyYXRpb24gPQorCQlyZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKworCS8qIEhvbGQgT09CIHN0YXRlIG1hY2hpbmUgaW4gcmVzZXQgKi8KKwlwaHlfY29uZmlndXJhdGlvbiB8PSAgU0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX1JFU0VUKTsKKwl3cml0ZWwocGh5X2NvbmZpZ3VyYXRpb24sCisJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCisJLyogQ29uZmlndXJlIHRoZSBTTlcgY2FwYWJpbGl0aWVzICovCisJcGh5X2NhcC5hbGwgPSAwOworCXBoeV9jYXAuc3RhcnQgPSAxOworCXBoeV9jYXAuZ2VuM19ub19zc2MgPSAxOworCXBoeV9jYXAuZ2VuMl9ub19zc2MgPSAxOworCXBoeV9jYXAuZ2VuMV9ub19zc2MgPSAxOworCWlmIChpaG9zdC0+b2VtX3BhcmFtZXRlcnMuY29udHJvbGxlci5kb19lbmFibGVfc3NjID09IHRydWUpIHsKKwkJcGh5X2NhcC5nZW4zX3NzYyA9IDE7CisJCXBoeV9jYXAuZ2VuMl9zc2MgPSAxOworCQlwaHlfY2FwLmdlbjFfc3NjID0gMTsKKwl9CisKKwkvKgorCSAqIFRoZSBTQVMgc3BlY2lmaWNhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGh5X2NhcGFiaWxpdGllcyB0aGF0CisJICogYXJlIHRyYW5zbWl0dGVkIHNoYWxsIGhhdmUgYW4gZXZlbiBwYXJpdHkuICBDYWxjdWxhdGUgdGhlIHBhcml0eS4gKi8KKwlwYXJpdHlfY2hlY2sgPSBwaHlfY2FwLmFsbDsKKwl3aGlsZSAocGFyaXR5X2NoZWNrICE9IDApIHsKKwkJaWYgKHBhcml0eV9jaGVjayAmIDB4MSkKKwkJCXBhcml0eV9jb3VudCsrOworCQlwYXJpdHlfY2hlY2sgPj49IDE7CisJfQorCisJLyoKKwkgKiBJZiBwYXJpdHkgaW5kaWNhdGVzIHRoZXJlIGFyZSBhbiBvZGQgbnVtYmVyIG9mIGJpdHMgc2V0LCB0aGVuCisJICogc2V0IHRoZSBwYXJpdHkgYml0IHRvIDEgaW4gdGhlIHBoeSBjYXBhYmlsaXRpZXMuICovCisJaWYgKChwYXJpdHlfY291bnQgJSAyKSAhPSAwKQorCQlwaHlfY2FwLnBhcml0eSA9IDE7CisKKwl3cml0ZWwocGh5X2NhcC5hbGwsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NhcGFiaWxpdGllcyk7CisKKwkvKiBTZXQgdGhlIGVuYWJsZSBzcGludXAgcGVyaW9kIGJ1dCBkaXNhYmxlIHRoZSBhYmlsaXR5IHRvIHNlbmQKKwkgKiBub3RpZnkgZW5hYmxlIHNwaW51cAorCSAqLworCXdyaXRlbChTQ1VfRU5TUElOVVBfR0VOX1ZBTChDT1VOVCwKKwkJCXBoeV91c2VyLT5ub3RpZnlfZW5hYmxlX3NwaW5fdXBfaW5zZXJ0aW9uX2ZyZXF1ZW5jeSksCisJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bm90aWZ5X2VuYWJsZV9zcGludXBfY29udHJvbCk7CisKKwkvKiBXcml0ZSB0aGUgQUxJR04gSW5zZXJ0aW9uIEZlcmVxdWVuY3kgZm9yIGNvbm5lY3RlZCBwaHkgYW5kCisJICogaW5wZW5kZW50IG9mIGNvbm5lY3RlZCBzdGF0ZQorCSAqLworCWNsa3NtX3ZhbHVlID0gU0NVX0FMSUdOX0lOU0VSVElPTl9GUkVRVUVOQ1lfR0VOX1ZBTChDT05ORUNURUQsCisJCQlwaHlfdXNlci0+aW5fY29ubmVjdGlvbl9hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5KTsKKworCWNsa3NtX3ZhbHVlIHw9IFNDVV9BTElHTl9JTlNFUlRJT05fRlJFUVVFTkNZX0dFTl9WQUwoR0VORVJBTCwKKwkJCXBoeV91c2VyLT5hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5KTsKKworCXdyaXRlbChjbGtzbV92YWx1ZSwgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5jbG9ja19za2V3X21hbmFnZW1lbnQpOworCisJLyogQHRvZG8gUHJvdmlkZSBhIHdheSB0byB3cml0ZSB0aGlzIHJlZ2lzdGVyIGNvcnJlY3RseSAqLworCXdyaXRlbCgweDAyMTA4NDIxLAorCQkmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPmFmZV9sb29rdXBfdGFibGVfY29udHJvbCk7CisKKwlsbGN0bCA9IFNDVV9TQVNfTExDVExfR0VOX1ZBTChOT19PVVRCT1VORF9UQVNLX1RJTUVPVVQsCisJCSh1OClpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLm5vX291dGJvdW5kX3Rhc2tfdGltZW91dCk7CisKKwlzd2l0Y2ggKHBoeV91c2VyLT5tYXhfc3BlZWRfZ2VuZXJhdGlvbikgeworCWNhc2UgU0NJQ19TRFNfUEFSTV9HRU4zX1NQRUVEOgorCQlsaW5rX3JhdGUgPSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9NQVhfTElOS19SQVRFX0dFTjM7CisJCWJyZWFrOworCWNhc2UgU0NJQ19TRFNfUEFSTV9HRU4yX1NQRUVEOgorCQlsaW5rX3JhdGUgPSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9NQVhfTElOS19SQVRFX0dFTjI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpbmtfcmF0ZSA9IFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX01BWF9MSU5LX1JBVEVfR0VOMTsKKwkJYnJlYWs7CisJfQorCWxsY3RsIHw9IFNDVV9TQVNfTExDVExfR0VOX1ZBTChNQVhfTElOS19SQVRFLCBsaW5rX3JhdGUpOworCXdyaXRlbChsbGN0bCwgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5saW5rX2xheWVyX2NvbnRyb2wpOworCisJaWYgKGlzX2EyKGlob3N0LT5wZGV2KSkgeworCQkvKiBQcm9ncmFtIHRoZSBtYXggQVJCIHRpbWUgZm9yIHRoZSBQSFkgdG8gNzAwdXMgc28gd2UgaW50ZXItb3BlcmF0ZSB3aXRoCisJCSAqIHRoZSBQTUMgZXhwYW5kZXIgd2hpY2ggc2h1dHMgZG93biBQSFlzIGlmIHRoZSBleHBhbmRlciBQSFkgZ2VuZXJhdGVzIHRvbworCQkgKiBtYW55IGJyZWFrcy4gIFRoaXMgdGltZSB2YWx1ZSB3aWxsIGd1YXJhbnRlZSB0aGF0IHRoZSBpbml0aWF0b3IgUEhZIHdpbGwKKwkJICogZ2VuZXJhdGUgdGhlIGJyZWFrLgorCQkgKi8KKwkJd3JpdGVsKFNDSUNfU0RTX1BIWV9NQVhfQVJCSVRSQVRJT05fV0FJVF9USU1FLAorCQkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5tYXhpbXVtX2FyYml0cmF0aW9uX3dhaXRfdGltZXJfdGltZW91dCk7CisJfQorCisJLyogRGlzYWJsZSBsaW5rIGxheWVyIGhhbmcgZGV0ZWN0aW9uLCByZWx5IG9uIHRoZSBPUyB0aW1lb3V0IGZvciBJL08gdGltZW91dHMuICovCisJd3JpdGVsKDAsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bGlua19sYXllcl9oYW5nX2RldGVjdGlvbl90aW1lb3V0KTsKKworCS8qIFdlIGNhbiBleGl0IHRoZSBpbml0aWFsIHN0YXRlIHRvIHRoZSBzdG9wcGVkIHN0YXRlICovCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RPUFBFRCk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHBoeV9zYXRhX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzY2lfdGltZXIgKnRtciA9IChzdHJ1Y3Qgc2NpX3RpbWVyICopZGF0YTsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2YodG1yLCB0eXBlb2YoKmlwaHkpLCBzYXRhX3RpbWVyKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwaHktPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmICh0bXItPmNhbmNlbCkKKwkJZ290byBkb25lOworCisJZGV2X2RiZyhzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkgIiVzOiBTQ0lDIFNEUyBQaHkgMHglcCBkaWQgbm90IHJlY2VpdmUgc2lnbmF0dXJlIGZpcyBiZWZvcmUgIgorCQkgInRpbWVvdXQuXG4iLAorCQkgX19mdW5jX18sCisJCSBpcGh5KTsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHBvcnQgY3VycmVudGx5IGNvbnRhaW5pbmcgdGhpcyBwaHkuIElmIHRoZSBwaHkgaXMKKyAqICAgIGN1cnJlbnRseSBjb250YWluZWQgYnkgdGhlIGR1bW15IHBvcnQsIHRoZW4gdGhlIHBoeSBpcyBjb25zaWRlcmVkIHRvIG5vdAorICogICAgYmUgcGFydCBvZiBhIHBvcnQuCisgKiBAc2NpX3BoeTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBwaHkgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZQorICogICAgY29udGFpbmluZyBwb3J0LgorICoKKyAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBoYW5kbGUgdG8gYSBwb3J0IHRoYXQgY29udGFpbnMgdGhlIHN1cHBsaWVkIHBoeS4KKyAqIE5VTEwgVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgcGh5IGlzIG5vdCBwYXJ0IG9mIGEgcmVhbAorICogcG9ydCAoaS5lLiBpdCdzIGNvbnRhaW5lZCBpbiB0aGUgZHVtbXkgcG9ydCkuICFOVUxMIEFsbCBvdGhlcgorICogdmFsdWVzIGluZGljYXRlIGEgaGFuZGxlL3BvaW50ZXIgdG8gdGhlIHBvcnQgY29udGFpbmluZyB0aGUgcGh5LgorICovCitzdHJ1Y3QgaXNjaV9wb3J0ICpwaHlfZ2V0X25vbl9kdW1teV9wb3J0KHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlwaHktPm93bmluZ19wb3J0OworCisJaWYgKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID09IFNDSUNfU0RTX0RVTU1ZX1BPUlQpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGlwaHktPm93bmluZ19wb3J0OworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIHdpbGwgYXNzaWduIGEgcG9ydCB0byB0aGUgcGh5IG9iamVjdC4KKyAqIEBvdXRdOiBpcGh5IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcGh5IGZvciB3aGljaCB0byBhc3NpZ24gYSBwb3J0CisgKiAgICBvYmplY3QuCisgKgorICoKKyAqLwordm9pZCBzY2lfcGh5X3NldF9wb3J0KAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwlpcGh5LT5vd25pbmdfcG9ydCA9IGlwb3J0OworCisJaWYgKGlwaHktPmJjbl9yZWNlaXZlZF93aGlsZV9wb3J0X3VuYXNzaWduZWQpIHsKKwkJaXBoeS0+YmNuX3JlY2VpdmVkX3doaWxlX3BvcnRfdW5hc3NpZ25lZCA9IGZhbHNlOworCQlzY2lfcG9ydF9icm9hZGNhc3RfY2hhbmdlX3JlY2VpdmVkKGlwaHktPm93bmluZ19wb3J0LCBpcGh5KTsKKwl9Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X2luaXRpYWxpemUoc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJCSAgIHN0cnVjdCBzY3VfdHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycyBfX2lvbWVtICp0bCwKKwkJCQkgICBzdHJ1Y3Qgc2N1X2xpbmtfbGF5ZXJfcmVnaXN0ZXJzIF9faW9tZW0gKmxsKQoreworCS8qIFBlcmZyb20gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBUTCBoYXJkd2FyZSAqLworCXNjaV9waHlfdHJhbnNwb3J0X2xheWVyX2luaXRpYWxpemF0aW9uKGlwaHksIHRsKTsKKworCS8qIFBlcm9mcm0gdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBQRSBoYXJkd2FyZSAqLworCXNjaV9waHlfbGlua19sYXllcl9pbml0aWFsaXphdGlvbihpcGh5LCBsbCk7CisKKwkvKiBUaGVyZSBpcyBub3RoaW5nIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBpbiB0aGlzIHN0YXRlIGp1c3QKKwkgKiB0cmFuc2l0aW9uIHRvIHRoZSBzdG9wcGVkIHN0YXRlCisJICovCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RPUFBFRCk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICogVGhpcyBtZXRob2QgYXNzaWducyB0aGUgZGlyZWN0IGF0dGFjaGVkIGRldmljZSBJRCBmb3IgdGhpcyBwaHkuCisgKgorICogQGlwaHkgVGhlIHBoeSBmb3Igd2hpY2ggdGhlIGRpcmVjdCBhdHRhY2hlZCBkZXZpY2UgaWQgaXMgdG8KKyAqICAgICAgIGJlIGFzc2lnbmVkLgorICogQGRldmljZV9pZCBUaGUgZGlyZWN0IGF0dGFjaGVkIGRldmljZSBJRCB0byBhc3NpZ24gdG8gdGhlIHBoeS4KKyAqICAgICAgIFRoaXMgd2lsbCBlaXRoZXIgYmUgdGhlIFJOaSBmb3IgdGhlIGRldmljZSBvciBhbiBpbnZhbGlkIFJOaSBpZiB0aGVyZQorICogICAgICAgaXMgbm8gY3VycmVudCBkZXZpY2UgYXNzaWduZWQgdG8gdGhlIHBoeS4KKyAqLwordm9pZCBzY2lfcGh5X3NldHVwX3RyYW5zcG9ydChzdHJ1Y3QgaXNjaV9waHkgKmlwaHksIHUzMiBkZXZpY2VfaWQpCit7CisJdTMyIHRsX2NvbnRyb2w7CisKKwl3cml0ZWwoZGV2aWNlX2lkLCAmaXBoeS0+dHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycy0+c3RwX3JuaSk7CisKKwkvKgorCSAqIFRoZSByZWFkIHNob3VsZCBndWFyYW50ZWUgdGhhdCB0aGUgZmlyc3Qgd3JpdGUgZ2V0cyBwb3N0ZWQKKwkgKiBiZWZvcmUgdGhlIG5leHQgd3JpdGUKKwkgKi8KKwl0bF9jb250cm9sID0gcmVhZGwoJmlwaHktPnRyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMtPmNvbnRyb2wpOworCXRsX2NvbnRyb2wgfD0gU0NVX1RMQ1JfR0VOX0JJVChDTEVBUl9UQ0lfTkNRX01BUFBJTkdfVEFCTEUpOworCXdyaXRlbCh0bF9jb250cm9sLCAmaXBoeS0+dHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycy0+Y29udHJvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3VzcGVuZChzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdTMyIHNjdV9zYXNfcGNmZ192YWx1ZTsKKworCXNjdV9zYXNfcGNmZ192YWx1ZSA9CisJCXJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCXNjdV9zYXNfcGNmZ192YWx1ZSB8PSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChTVVNQRU5EX1BST1RPQ09MX0VOR0lORSk7CisJd3JpdGVsKHNjdV9zYXNfcGNmZ192YWx1ZSwKKwkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisKKwlzY2lfcGh5X3NldHVwX3RyYW5zcG9ydChpcGh5LCBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpOworfQorCit2b2lkIHNjaV9waHlfcmVzdW1lKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwl1MzIgc2N1X3Nhc19wY2ZnX3ZhbHVlOworCisJc2N1X3Nhc19wY2ZnX3ZhbHVlID0KKwkJcmVhZGwoJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisJc2N1X3Nhc19wY2ZnX3ZhbHVlICY9IH5TQ1VfU0FTX1BDRkdfR0VOX0JJVChTVVNQRU5EX1BST1RPQ09MX0VOR0lORSk7CisJd3JpdGVsKHNjdV9zYXNfcGNmZ192YWx1ZSwKKwkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7Cit9CisKK3ZvaWQgc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3Moc3RydWN0IGlzY2lfcGh5ICppcGh5LCBzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzICpzYXMpCit7CisJc2FzLT5oaWdoID0gcmVhZGwoJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5zb3VyY2Vfc2FzX2FkZHJlc3NfaGlnaCk7CisJc2FzLT5sb3cgPSByZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnNvdXJjZV9zYXNfYWRkcmVzc19sb3cpOworfQorCit2b2lkIHNjaV9waHlfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwgc3RydWN0IHNjaV9zYXNfYWRkcmVzcyAqc2FzKQoreworCXN0cnVjdCBzYXNfaWRlbnRpZnlfZnJhbWUgKmlhZjsKKworCWlhZiA9ICZpcGh5LT5mcmFtZV9yY3ZkLmlhZjsKKwltZW1jcHkoc2FzLCBpYWYtPnNhc19hZGRyLCBTQVNfQUREUl9TSVpFKTsKK30KKwordm9pZCBzY2lfcGh5X2dldF9wcm90b2NvbHMoc3RydWN0IGlzY2lfcGh5ICppcGh5LCBzdHJ1Y3Qgc2NpX3BoeV9wcm90byAqcHJvdG8pCit7CisJcHJvdG8tPmFsbCA9IHJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+dHJhbnNtaXRfaWRlbnRpZmljYXRpb24pOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9zdGFydChzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfcGh5X3N0YXRlcyBzdGF0ZSA9IGlwaHktPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgIT0gU0NJX1BIWV9TVE9QUEVEKSB7CisJCWRldl9kYmcoc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfc3RvcChzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfcGh5X3N0YXRlcyBzdGF0ZSA9IGlwaHktPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUEhZX1NVQl9JTklUSUFMOgorCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfT1NTUF9FTjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBU19TUEVFRF9FTjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBU19QT1dFUjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUE9XRVI6CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BIWV9FTjoKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfU1BFRURfRU46CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGOgorCWNhc2UgU0NJX1BIWV9TVUJfRklOQUw6CisJY2FzZSBTQ0lfUEhZX1JFQURZOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RPUFBFRCk7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9yZXNldChzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfcGh5X3N0YXRlcyBzdGF0ZSA9IGlwaHktPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgIT0gU0NJX1BIWV9SRUFEWSkgeworCQlkZXZfZGJnKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfUkVTRVRUSU5HKTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X2NvbnN1bWVfcG93ZXJfaGFuZGxlcihzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJZW51bSBzY2lfcGh5X3N0YXRlcyBzdGF0ZSA9IGlwaHktPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfUE9XRVI6IHsKKwkJdTMyIGVuYWJsZV9zcGludXA7CisKKwkJZW5hYmxlX3NwaW51cCA9IHJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bm90aWZ5X2VuYWJsZV9zcGludXBfY29udHJvbCk7CisJCWVuYWJsZV9zcGludXAgfD0gU0NVX0VOU1BJTlVQX0dFTl9CSVQoRU5BQkxFKTsKKwkJd3JpdGVsKGVuYWJsZV9zcGludXAsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bm90aWZ5X2VuYWJsZV9zcGludXBfY29udHJvbCk7CisKKwkJLyogQ2hhbmdlIHN0YXRlIHRvIHRoZSBmaW5hbCBzdGF0ZSB0aGlzIHN1YnN0YXRlIG1hY2hpbmUgaGFzIHJ1biB0byBjb21wbGV0aW9uICovCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NVQl9GSU5BTCk7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUE9XRVI6IHsKKwkJdTMyIHNjdV9zYXNfcGNmZ192YWx1ZTsKKworCQkvKiBSZWxlYXNlIHRoZSBzcGludXAgaG9sZCBzdGF0ZSBhbmQgcmVzZXQgdGhlIE9PQiBzdGF0ZSBtYWNoaW5lICovCisJCXNjdV9zYXNfcGNmZ192YWx1ZSA9CisJCQlyZWFkbCgmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKwkJc2N1X3Nhc19wY2ZnX3ZhbHVlICY9CisJCQl+KFNDVV9TQVNfUENGR19HRU5fQklUKFNBVEFfU1BJTlVQX0hPTEQpIHwgU0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX0VOQUJMRSkpOworCQlzY3Vfc2FzX3BjZmdfdmFsdWUgfD0gU0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX1JFU0VUKTsKKwkJd3JpdGVsKHNjdV9zYXNfcGNmZ192YWx1ZSwKKwkJCSZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCisJCS8qIE5vdyByZXN0YXJ0IHRoZSBPT0Igb3BlcmF0aW9uICovCisJCXNjdV9zYXNfcGNmZ192YWx1ZSAmPSB+U0NVX1NBU19QQ0ZHX0dFTl9CSVQoT09CX1JFU0VUKTsKKwkJc2N1X3Nhc19wY2ZnX3ZhbHVlIHw9IFNDVV9TQVNfUENGR19HRU5fQklUKE9PQl9FTkFCTEUpOworCQl3cml0ZWwoc2N1X3Nhc19wY2ZnX3ZhbHVlLAorCQkJJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisKKwkJLyogQ2hhbmdlIHN0YXRlIHRvIHRoZSBmaW5hbCBzdGF0ZSB0aGlzIHN1YnN0YXRlIG1hY2hpbmUgaGFzIHJ1biB0byBjb21wbGV0aW9uICovCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BIWV9FTik7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKwlkZWZhdWx0OgorCQlkZXZfZGJnKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0X3Nhc19saW5rX3RyYWluaW5nKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwkvKiBjb250aW51ZSB0aGUgbGluayB0cmFpbmluZyBmb3IgdGhlIHBoeSBhcyBpZiBpdCB3ZXJlIGEgU0FTIFBIWQorCSAqIGluc3RlYWQgb2YgYSBTQVRBIFBIWS4gVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlIGNvbXBsZXRpb24gcXVldWUgaGFkIGEgU0FTCisJICogUEhZIERFVEVDVEVEIGV2ZW50IHdoZW4gdGhlIHN0YXRlIG1hY2hpbmUgd2FzIGV4cGVjdGluZyBhIFNBVEEgUEhZIGV2ZW50LgorCSAqLworCXUzMiBwaHlfY29udHJvbDsKKworCXBoeV9jb250cm9sID0gcmVhZGwoJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisJcGh5X2NvbnRyb2wgfD0gU0NVX1NBU19QQ0ZHX0dFTl9CSVQoU0FUQV9TUElOVVBfSE9MRCk7CisJd3JpdGVsKHBoeV9jb250cm9sLAorCSAgICAgICAmaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMtPnBoeV9jb25maWd1cmF0aW9uKTsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfU1BFRURfRU4pOworCisJaXBoeS0+cHJvdG9jb2wgPSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FTOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0X3NhdGFfbGlua190cmFpbmluZyhzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJLyogVGhpcyBtZXRob2QgY29udGludWVzIHRoZSBsaW5rIHRyYWluaW5nIGZvciB0aGUgcGh5IGFzIGlmIGl0IHdlcmUgYSBTQVRBIFBIWQorCSAqIGluc3RlYWQgb2YgYSBTQVMgUEhZLiAgVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlIGNvbXBsZXRpb24gcXVldWUgaGFkIGEgU0FUQQorCSAqIFNQSU5VUCBIT0xEIGV2ZW50IHdoZW4gdGhlIHN0YXRlIG1hY2hpbmUgd2FzIGV4cGVjdGluZyBhIFNBUyBQSFkgZXZlbnQuIG5vbmUKKwkgKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9QT1dFUik7CisKKwlpcGh5LT5wcm90b2NvbCA9IFNDSUNfU0RTX1BIWV9QUk9UT0NPTF9TQVRBOworfQorCisvKioKKyAqIHNjaV9waHlfY29tcGxldGVfbGlua190cmFpbmluZyAtIHBlcmZvcm0gcHJvY2Vzc2luZyBjb21tb24gdG8KKyAqICAgIGFsbCBwcm90b2NvbHMgdXBvbiBjb21wbGV0aW9uIG9mIGxpbmsgdHJhaW5pbmcuCisgKiBAc2NpX3BoeTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBwaHkgb2JqZWN0IGZvciB3aGljaCBsaW5rIHRyYWluaW5nCisgKiAgICBoYXMgY29tcGxldGVkLgorICogQG1heF9saW5rX3JhdGU6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbWF4aW11bSBsaW5rIHJhdGUgdG8gYmUKKyAqICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBoeS4KKyAqIEBuZXh0X3N0YXRlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG5leHQgc3RhdGUgZm9yIHRoZSBwaHkncyBzdGFydGluZworICogICAgc3ViLXN0YXRlIG1hY2hpbmUuCisgKgorICovCitzdGF0aWMgdm9pZCBzY2lfcGh5X2NvbXBsZXRlX2xpbmtfdHJhaW5pbmcoc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJCQkgICBlbnVtIHNhc19saW5rcmF0ZSBtYXhfbGlua19yYXRlLAorCQkJCQkgICB1MzIgbmV4dF9zdGF0ZSkKK3sKKwlpcGh5LT5tYXhfbmVnb3RpYXRlZF9zcGVlZCA9IG1heF9saW5rX3JhdGU7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgbmV4dF9zdGF0ZSk7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X2V2ZW50X2hhbmRsZXIoc3RydWN0IGlzY2lfcGh5ICppcGh5LCB1MzIgZXZlbnRfY29kZSkKK3sKKwllbnVtIHNjaV9waHlfc3RhdGVzIHN0YXRlID0gaXBoeS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX09TU1BfRU46CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1NBU19QSFlfREVURUNURUQ6CisJCQlzY2lfcGh5X3N0YXJ0X3Nhc19saW5rX3RyYWluaW5nKGlwaHkpOworCQkJaXBoeS0+aXNfaW5fbGlua190cmFpbmluZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV9TUElOVVBfSE9MRDoKKwkJCXNjaV9waHlfc3RhcnRfc2F0YV9saW5rX3RyYWluaW5nKGlwaHkpOworCQkJaXBoeS0+aXNfaW5fbGlua190cmFpbmluZyA9IHRydWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9kYmcoc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkiJXM6IFBIWSBzdGFydGluZyBzdWJzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkICIKKwkJCQkidW5leHBlY3RlZCBldmVudF9jb2RlICV4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWV2ZW50X2NvZGUpOworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBU19TUEVFRF9FTjoKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTX1BIWV9ERVRFQ1RFRDoKKwkJCS8qCisJCQkgKiBXaHkgaXMgdGhpcyBiZWluZyByZXBvcnRlZCBhZ2FpbiBieSB0aGUgY29udHJvbGxlcj8KKwkJCSAqIFdlIHdvdWxkIHJlLWVudGVyIHRoaXMgc3RhdGUgc28ganVzdCBzdGF5IGhlcmUgKi8KKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9TQVNfMTU6CisJCWNhc2UgU0NVX0VWRU5UX1NBU18xNV9TU0M6CisJCQlzY2lfcGh5X2NvbXBsZXRlX2xpbmtfdHJhaW5pbmcoaXBoeSwgU0FTX0xJTktfUkFURV8xXzVfR0JQUywKKwkJCQkJCSAgICAgICBTQ0lfUEhZX1NVQl9BV0FJVF9JQUZfVUYpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBU18zMDoKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTXzMwX1NTQzoKKwkJCXNjaV9waHlfY29tcGxldGVfbGlua190cmFpbmluZyhpcGh5LCBTQVNfTElOS19SQVRFXzNfMF9HQlBTLAorCQkJCQkJICAgICAgIFNDSV9QSFlfU1VCX0FXQUlUX0lBRl9VRik7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTXzYwOgorCQljYXNlIFNDVV9FVkVOVF9TQVNfNjBfU1NDOgorCQkJc2NpX3BoeV9jb21wbGV0ZV9saW5rX3RyYWluaW5nKGlwaHksIFNBU19MSU5LX1JBVEVfNl8wX0dCUFMsCisJCQkJCQkgICAgICAgU0NJX1BIWV9TVUJfQVdBSVRfSUFGX1VGKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9TQVRBX1NQSU5VUF9IT0xEOgorCQkJLyoKKwkJCSAqIFdlIHdlcmUgZG9pbmcgU0FTIFBIWSBsaW5rIHRyYWluaW5nIGFuZCByZWNlaXZlZCBhIFNBVEEgUEhZIGV2ZW50CisJCQkgKiBjb250aW51ZSBPT0IvU04gYXMgaWYgdGhpcyB3ZXJlIGEgU0FUQSBQSFkgKi8KKwkJCXNjaV9waHlfc3RhcnRfc2F0YV9saW5rX3RyYWluaW5nKGlwaHkpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX0xJTktfRkFJTFVSRToKKwkJCS8qIExpbmsgZmFpbHVyZSBjaGFuZ2Ugc3RhdGUgYmFjayB0byB0aGUgc3RhcnRpbmcgc3RhdGUgKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBQSFkgc3RhcnRpbmcgc3Vic3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJICJ1bmV4cGVjdGVkIGV2ZW50X2NvZGUgJXhcbiIsCisJCQkJIF9fZnVuY19fLCBldmVudF9jb2RlKTsKKworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfSUFGX1VGOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9TQVNfUEhZX0RFVEVDVEVEOgorCQkJLyogQmFja3VwIHRoZSBzdGF0ZSBtYWNoaW5lICovCisJCQlzY2lfcGh5X3N0YXJ0X3Nhc19saW5rX3RyYWluaW5nKGlwaHkpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQ6CisJCQkvKiBXZSB3ZXJlIGRvaW5nIFNBUyBQSFkgbGluayB0cmFpbmluZyBhbmQgcmVjZWl2ZWQgYQorCQkJICogU0FUQSBQSFkgZXZlbnQgY29udGludWUgT09CL1NOIGFzIGlmIHRoaXMgd2VyZSBhCisJCQkgKiBTQVRBIFBIWQorCQkJICovCisJCQlzY2lfcGh5X3N0YXJ0X3NhdGFfbGlua190cmFpbmluZyhpcGh5KTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9SRUNFSVZFRF9JREVOVElGWV9USU1FT1VUOgorCQljYXNlIFNDVV9FVkVOVF9MSU5LX0ZBSUxVUkU6CisJCWNhc2UgU0NVX0VWRU5UX0hBUkRfUkVTRVRfUkVDRUlWRUQ6CisJCQkvKiBTdGFydCB0aGUgb29iL3NuIHN0YXRlIG1hY2hpbmUgb3ZlciBhZ2FpbiAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybihzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJCSAiJXM6IFBIWSBzdGFydGluZyBzdWJzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkICIKKwkJCQkgInVuZXhwZWN0ZWQgZXZlbnRfY29kZSAleFxuIiwKKwkJCQkgX19mdW5jX18sIGV2ZW50X2NvZGUpOworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBU19QT1dFUjoKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfTElOS19GQUlMVVJFOgorCQkJLyogTGluayBmYWlsdXJlIGNoYW5nZSBzdGF0ZSBiYWNrIHRvIHRoZSBzdGFydGluZyBzdGF0ZSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybihzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJCSIlczogUEhZIHN0YXJ0aW5nIHN1YnN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgdW5leHBlY3RlZCAiCisJCQkJImV2ZW50X2NvZGUgJXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJZXZlbnRfY29kZSk7CisJCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisJCX0KKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9QT1dFUjoKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfTElOS19GQUlMVVJFOgorCQkJLyogTGluayBmYWlsdXJlIGNoYW5nZSBzdGF0ZSBiYWNrIHRvIHRoZSBzdGFydGluZyBzdGF0ZSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQ6CisJCQkvKiBUaGVzZSBldmVudHMgYXJlIHJlY2VpdmVkIGV2ZXJ5IDEwbXMgYW5kIGFyZQorCQkJICogZXhwZWN0ZWQgd2hpbGUgaW4gdGhpcyBzdGF0ZQorCQkJICovCisJCQlicmVhazsKKworCQljYXNlIFNDVV9FVkVOVF9TQVNfUEhZX0RFVEVDVEVEOgorCQkJLyogVGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgaW4gdGhlIHBoeSB0eXBlIGJlZm9yZSBPT0IvU04gZm9yIHRoZQorCQkJICogU0FUQSBmaW5pc2hlZCBzdGFydCBkb3duIHRoZSBTQVMgbGluayB0cmFuaW5nIHBhdGguCisJCQkgKi8KKwkJCXNjaV9waHlfc3RhcnRfc2FzX2xpbmtfdHJhaW5pbmcoaXBoeSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBQSFkgc3RhcnRpbmcgc3Vic3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJICJ1bmV4cGVjdGVkIGV2ZW50X2NvZGUgJXhcbiIsCisJCQkJIF9fZnVuY19fLCBldmVudF9jb2RlKTsKKworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUEhZX0VOOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfY29kZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9MSU5LX0ZBSUxVUkU6CisJCQkvKiBMaW5rIGZhaWx1cmUgY2hhbmdlIHN0YXRlIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVEFSVElORyk7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV9TUElOVVBfSE9MRDoKKwkJCS8qIFRoZXNlIGV2ZW50cyBtaWdodCBiZSByZWNlaXZlZCBzaW5jZSB3ZSBkb250IGtub3cgaG93IG1hbnkgbWF5IGJlIGluCisJCQkgKiB0aGUgY29tcGxldGlvbiBxdWV1ZSB3aGlsZSB3YWl0aW5nIGZvciBwb3dlcgorCQkJICovCisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV9QSFlfREVURUNURUQ6CisJCQlpcGh5LT5wcm90b2NvbCA9IFNDSUNfU0RTX1BIWV9QUk9UT0NPTF9TQVRBOworCisJCQkvKiBXZSBoYXZlIHJlY2VpdmVkIHRoZSBTQVRBIFBIWSBub3RpZmljYXRpb24gY2hhbmdlIHN0YXRlICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9TUEVFRF9FTik7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTX1BIWV9ERVRFQ1RFRDoKKwkJCS8qIFRoZXJlIGhhcyBiZWVuIGEgY2hhbmdlIGluIHRoZSBwaHkgdHlwZSBiZWZvcmUgT09CL1NOIGZvciB0aGUKKwkJCSAqIFNBVEEgZmluaXNoZWQgc3RhcnQgZG93biB0aGUgU0FTIGxpbmsgdHJhbmluZyBwYXRoLgorCQkJICovCisJCQlzY2lfcGh5X3N0YXJ0X3Nhc19saW5rX3RyYWluaW5nKGlwaHkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybihzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJCSAiJXM6IFBIWSBzdGFydGluZyBzdWJzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkICIKKwkJCQkgInVuZXhwZWN0ZWQgZXZlbnRfY29kZSAleFxuIiwKKwkJCQkgX19mdW5jX18sCisJCQkJIGV2ZW50X2NvZGUpOworCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkU7OworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfU1BFRURfRU46CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfUEhZX0RFVEVDVEVEOgorCQkJLyoKKwkJCSAqIFRoZSBoYXJkd2FyZSByZXBvcnRzIG11bHRpcGxlIFNBVEEgUEhZIGRldGVjdGVkIGV2ZW50cworCQkJICogaWdub3JlIHRoZSBleHRyYXMgKi8KKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9TQVRBXzE1OgorCQljYXNlIFNDVV9FVkVOVF9TQVRBXzE1X1NTQzoKKwkJCXNjaV9waHlfY29tcGxldGVfbGlua190cmFpbmluZyhpcGh5LCBTQVNfTElOS19SQVRFXzFfNV9HQlBTLAorCQkJCQkJICAgICAgIFNDSV9QSFlfU1VCX0FXQUlUX1NJR19GSVNfVUYpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfMzA6CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfMzBfU1NDOgorCQkJc2NpX3BoeV9jb21wbGV0ZV9saW5rX3RyYWluaW5nKGlwaHksIFNBU19MSU5LX1JBVEVfM18wX0dCUFMsCisJCQkJCQkgICAgICAgU0NJX1BIWV9TVUJfQVdBSVRfU0lHX0ZJU19VRik7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV82MDoKKwkJY2FzZSBTQ1VfRVZFTlRfU0FUQV82MF9TU0M6CisJCQlzY2lfcGh5X2NvbXBsZXRlX2xpbmtfdHJhaW5pbmcoaXBoeSwgU0FTX0xJTktfUkFURV82XzBfR0JQUywKKwkJCQkJCSAgICAgICBTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9MSU5LX0ZBSUxVUkU6CisJCQkvKiBMaW5rIGZhaWx1cmUgY2hhbmdlIHN0YXRlIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVEFSVElORyk7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfRVZFTlRfU0FTX1BIWV9ERVRFQ1RFRDoKKwkJCS8qCisJCQkgKiBUaGVyZSBoYXMgYmVlbiBhIGNoYW5nZSBpbiB0aGUgcGh5IHR5cGUgYmVmb3JlIE9PQi9TTiBmb3IgdGhlCisJCQkgKiBTQVRBIGZpbmlzaGVkIHN0YXJ0IGRvd24gdGhlIFNBUyBsaW5rIHRyYW5pbmcgcGF0aC4gKi8KKwkJCXNjaV9waHlfc3RhcnRfc2FzX2xpbmtfdHJhaW5pbmcoaXBoeSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkJICIlczogUEhZIHN0YXJ0aW5nIHN1YnN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgIgorCQkJCSAidW5leHBlY3RlZCBldmVudF9jb2RlICV4XG4iLAorCQkJCSBfX2Z1bmNfXywgZXZlbnRfY29kZSk7CisKKwkJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwkJfQorCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NJR19GSVNfVUY6CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1NBVEFfUEhZX0RFVEVDVEVEOgorCQkJLyogQmFja3VwIHRoZSBzdGF0ZSBtYWNoaW5lICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9TUEVFRF9FTik7CisJCQlicmVhazsKKworCQljYXNlIFNDVV9FVkVOVF9MSU5LX0ZBSUxVUkU6CisJCQkvKiBMaW5rIGZhaWx1cmUgY2hhbmdlIHN0YXRlIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9TVEFSVElORyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBQSFkgc3RhcnRpbmcgc3Vic3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJICJ1bmV4cGVjdGVkIGV2ZW50X2NvZGUgJXhcbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBldmVudF9jb2RlKTsKKworCQkJcmV0dXJuIFNDSV9GQUlMVVJFOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QSFlfUkVBRFk6CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX0xJTktfRkFJTFVSRToKKwkJCS8qIExpbmsgZmFpbHVyZSBjaGFuZ2Ugc3RhdGUgYmFjayB0byB0aGUgc3RhcnRpbmcgc3RhdGUgKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9CUk9BRENBU1RfQ0hBTkdFOgorCQkJLyogQnJvYWRjYXN0IGNoYW5nZSByZWNlaXZlZC4gTm90aWZ5IHRoZSBwb3J0LiAqLworCQkJaWYgKHBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSkgIT0gTlVMTCkKKwkJCQlzY2lfcG9ydF9icm9hZGNhc3RfY2hhbmdlX3JlY2VpdmVkKGlwaHktPm93bmluZ19wb3J0LCBpcGh5KTsKKwkJCWVsc2UKKwkJCQlpcGh5LT5iY25fcmVjZWl2ZWRfd2hpbGVfcG9ydF91bmFzc2lnbmVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzUCBTQ0lDIFBIWSAweCVwIHJlYWR5IHN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgIgorCQkJCSAidW5leHBlY3RlZCBldmVudF9jb2RlICV4XG4iLAorCQkJCSBfX2Z1bmNfXywgaXBoeSwgZXZlbnRfY29kZSk7CisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwkJfQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUEhZX1JFU0VUVElORzoKKwkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkpIHsKKwkJY2FzZSBTQ1VfRVZFTlRfSEFSRF9SRVNFVF9UUkFOU01JVFRFRDoKKwkJCS8qIExpbmsgZmFpbHVyZSBjaGFuZ2Ugc3RhdGUgYmFjayB0byB0aGUgc3RhcnRpbmcgc3RhdGUgKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBTQ0lfUEhZX1NUQVJUSU5HKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBTQ0lDIFBIWSAweCVwIHJlc2V0dGluZyBzdGF0ZSBtYWNoaW5lIHJlY2VpdmVkICIKKwkJCQkgInVuZXhwZWN0ZWQgZXZlbnRfY29kZSAleFxuIiwKKwkJCQkgX19mdW5jX18sIGlwaHksIGV2ZW50X2NvZGUpOworCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKHNjaXBoeV90b19kZXYoaXBoeSksCisJCQkiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9mcmFtZV9oYW5kbGVyKHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwgdTMyIGZyYW1lX2luZGV4KQoreworCWVudW0gc2NpX3BoeV9zdGF0ZXMgc3RhdGUgPSBpcGh5LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBoeS0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCWVudW0gc2NpX3N0YXR1cyByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX0lBRl9VRjogeworCQl1MzIgKmZyYW1lX3dvcmRzOworCQlzdHJ1Y3Qgc2FzX2lkZW50aWZ5X2ZyYW1lIGlhZjsKKworCQlyZXN1bHQgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAodm9pZCAqKikmZnJhbWVfd29yZHMpOworCisJCWlmIChyZXN1bHQgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCXNjaV9zd2FiMzJfY3B5KCZpYWYsIGZyYW1lX3dvcmRzLCBzaXplb2YoaWFmKSAvIHNpemVvZih1MzIpKTsKKwkJaWYgKGlhZi5mcmFtZV90eXBlID09IDApIHsKKwkJCXUzMiBzdGF0ZTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlwaHktPnNhc19waHkuZnJhbWVfcmN2ZF9sb2NrLCBmbGFncyk7CisJCQltZW1jcHkoJmlwaHktPmZyYW1lX3JjdmQuaWFmLCAmaWFmLCBzaXplb2YoaWFmKSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfbG9jaywgZmxhZ3MpOworCQkJaWYgKGlhZi5zbXBfdHBvcnQpIHsKKwkJCQkvKiBXZSBnb3QgdGhlIElBRiBmb3IgYW4gZXhwYW5kZXIgUEhZIGdvIHRvIHRoZSBmaW5hbAorCQkJCSAqIHN0YXRlIHNpbmNlIHRoZXJlIGFyZSBubyBwb3dlciByZXF1aXJlbWVudHMgZm9yCisJCQkJICogZXhwYW5kZXIgcGh5cy4KKwkJCQkgKi8KKwkJCQlzdGF0ZSA9IFNDSV9QSFlfU1VCX0ZJTkFMOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXZSBnb3QgdGhlIElBRiB3ZSBjYW4gbm93IGdvIHRvIHRoZSBhd2FpdCBzcGludXAKKwkJCQkgKiBzZW1hcGhvcmUgc3RhdGUKKwkJCQkgKi8KKwkJCQlzdGF0ZSA9IFNDSV9QSFlfU1VCX0FXQUlUX1NBU19QT1dFUjsKKwkJCX0KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlwaHktPnNtLCBzdGF0ZSk7CisJCQlyZXN1bHQgPSBTQ0lfU1VDQ0VTUzsKKwkJfSBlbHNlCisJCQlkZXZfd2FybihzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJCSIlczogUEhZIHN0YXJ0aW5nIHN1YnN0YXRlIG1hY2hpbmUgcmVjZWl2ZWQgIgorCQkJCSJ1bmV4cGVjdGVkIGZyYW1lIGlkICV4XG4iLAorCQkJCV9fZnVuY19fLCBmcmFtZV9pbmRleCk7CisKKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwljYXNlIFNDSV9QSFlfU1VCX0FXQUlUX1NJR19GSVNfVUY6IHsKKwkJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCQl1MzIgKmZpc19mcmFtZV9kYXRhOworCisJCXJlc3VsdCA9IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICh2b2lkICoqKSZmcmFtZV9oZWFkZXIpOworCisJCWlmIChyZXN1bHQgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWlmICgoZnJhbWVfaGVhZGVyLT5maXNfdHlwZSA9PSBGSVNfUkVHRDJIKSAmJgorCQkgICAgIShmcmFtZV9oZWFkZXItPnN0YXR1cyAmIEFUQV9CVVNZKSkgeworCQkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICh2b2lkICoqKSZmaXNfZnJhbWVfZGF0YSk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfbG9jaywgZmxhZ3MpOworCQkJc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKCZpcGh5LT5mcmFtZV9yY3ZkLmZpcywKKwkJCQkJCQkgIGZyYW1lX2hlYWRlciwKKwkJCQkJCQkgIGZpc19mcmFtZV9kYXRhKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwaHktPnNhc19waHkuZnJhbWVfcmN2ZF9sb2NrLCBmbGFncyk7CisKKwkJCS8qIGdvdCBJQUYgd2UgY2FuIG5vdyBnbyB0byB0aGUgYXdhaXQgc3BpbnVwIHNlbWFwaG9yZSBzdGF0ZSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1VCX0ZJTkFMKTsKKworCQkJcmVzdWx0ID0gU0NJX1NVQ0NFU1M7CisJCX0gZWxzZQorCQkJZGV2X3dhcm4oc2NpcGh5X3RvX2RldihpcGh5KSwKKwkJCQkgIiVzOiBQSFkgc3RhcnRpbmcgc3Vic3RhdGUgbWFjaGluZSByZWNlaXZlZCAiCisJCQkJICJ1bmV4cGVjdGVkIGZyYW1lIGlkICV4XG4iLAorCQkJCSBfX2Z1bmNfXywgZnJhbWVfaW5kZXgpOworCisJCS8qIFJlZ2FyZGxlc3Mgb2YgdGhlIHJlc3VsdCB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgZnJhbWUgd2l0aCBpdCAqLworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJZGVmYXVsdDoKKwkJZGV2X2RiZyhzY2lwaHlfdG9fZGV2KGlwaHkpLAorCQkJIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2luaXRpYWxfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJLyogVGhpcyBpcyBqdXN0IGFuIHRlbXBvcmFyeSBzdGF0ZSBnbyBvZmYgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlICovCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1VCX0FXQUlUX09TU1BfRU4pOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3Nhc19wb3dlcl9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcGh5LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlzY2lfY29udHJvbGxlcl9wb3dlcl9jb250cm9sX3F1ZXVlX2luc2VydChpaG9zdCwgaXBoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2FzX3Bvd2VyX3N1YnN0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBoeS0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJc2NpX2NvbnRyb2xsZXJfcG93ZXJfY29udHJvbF9xdWV1ZV9yZW1vdmUoaWhvc3QsIGlwaHkpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfcG93ZXJfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBoeS0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJc2NpX2NvbnRyb2xsZXJfcG93ZXJfY29udHJvbF9xdWV1ZV9pbnNlcnQoaWhvc3QsIGlwaHkpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfcG93ZXJfc3Vic3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcGh5LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlzY2lfY29udHJvbGxlcl9wb3dlcl9jb250cm9sX3F1ZXVlX3JlbW92ZShpaG9zdCwgaXBoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9waHlfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJc2NpX21vZF90aW1lcigmaXBoeS0+c2F0YV90aW1lciwgU0NJQ19TRFNfU0FUQV9MSU5LX1RSQUlOSU5HX1RJTUVPVVQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfcGh5X3N1YnN0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJc2NpX2RlbF90aW1lcigmaXBoeS0+c2F0YV90aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9zcGVlZF9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisKKwlzY2lfbW9kX3RpbWVyKCZpcGh5LT5zYXRhX3RpbWVyLCBTQ0lDX1NEU19TQVRBX0xJTktfVFJBSU5JTkdfVElNRU9VVCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9zcGVlZF9zdWJzdGF0ZV9leGl0KHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKworCXNjaV9kZWxfdGltZXIoJmlwaHktPnNhdGFfdGltZXIpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NpZ19maXNfdWZfc3Vic3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcGh5KSwgc20pOworCisJaWYgKHNjaV9wb3J0X2xpbmtfZGV0ZWN0ZWQoaXBoeS0+b3duaW5nX3BvcnQsIGlwaHkpKSB7CisKKwkJLyoKKwkJICogQ2xlYXIgdGhlIFBFIHN1c3BlbmQgY29uZGl0aW9uIHNvIHdlIGNhbiBhY3R1YWxseQorCQkgKiByZWNlaXZlIFNJRyBGSVMKKwkJICogVGhlIGhhcmR3YXJlIHdpbGwgbm90IHJlc3BvbmQgdG8gdGhlIFhSRFkgdW50aWwgdGhlIFBFCisJCSAqIHN1c3BlbmQgY29uZGl0aW9uIGlzIGNsZWFyZWQuCisJCSAqLworCQlzY2lfcGh5X3Jlc3VtZShpcGh5KTsKKworCQlzY2lfbW9kX3RpbWVyKCZpcGh5LT5zYXRhX3RpbWVyLAorCQkJICAgICAgU0NJQ19TRFNfU0lHTkFUVVJFX0ZJU19USU1FT1VUKTsKKwl9IGVsc2UKKwkJaXBoeS0+aXNfaW5fbGlua190cmFpbmluZyA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NpZ19maXNfdWZfc3Vic3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisKKwlzY2lfZGVsX3RpbWVyKCZpcGh5LT5zYXRhX3RpbWVyKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydGluZ19maW5hbF9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisKKwkvKiBTdGF0ZSBtYWNoaW5lIGhhcyBydW4gdG8gY29tcGxldGlvbiBzbyBleGl0IG91dCBhbmQgY2hhbmdlCisJICogdGhlIGJhc2Ugc3RhdGUgbWFjaGluZSB0byB0aGUgcmVhZHkgc3RhdGUKKwkgKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpcGh5LT5zbSwgU0NJX1BIWV9SRUFEWSk7Cit9CisKKy8qKgorICoKKyAqIEBzY2lfcGh5OiBUaGlzIGlzIHRoZSBzdHJ1Y3QgaXNjaV9waHkgb2JqZWN0IHRvIHN0b3AuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBzdG9wIHRoZSBzdHJ1Y3QgaXNjaV9waHkgb2JqZWN0LiBUaGlzIGRvZXMgbm90IHJlc2V0IHRoZQorICogcHJvdG9jb2wgZW5naW5lIGl0IGp1c3Qgc3VzcGVuZHMgaXQgYW5kIHBsYWNlcyBpdCBpbiBhIHN0YXRlIHdoZXJlIGl0IHdpbGwKKyAqIG5vdCBjYXVzZSB0aGUgZW5kIGRldmljZSB0byBwb3dlciB1cC4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY3VfbGlua19sYXllcl9zdG9wX3Byb3RvY29sX2VuZ2luZSgKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdTMyIHNjdV9zYXNfcGNmZ192YWx1ZTsKKwl1MzIgZW5hYmxlX3NwaW51cF92YWx1ZTsKKworCS8qIFN1c3BlbmQgdGhlIHByb3RvY29sIGVuZ2luZSBhbmQgcGxhY2UgaXQgaW4gYSBzYXRhIHNwaW51cCBob2xkIHN0YXRlICovCisJc2N1X3Nhc19wY2ZnX3ZhbHVlID0KKwkJcmVhZGwoJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisJc2N1X3Nhc19wY2ZnX3ZhbHVlIHw9CisJCShTQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfUkVTRVQpIHwKKwkJIFNDVV9TQVNfUENGR19HRU5fQklUKFNVU1BFTkRfUFJPVE9DT0xfRU5HSU5FKSB8CisJCSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChTQVRBX1NQSU5VUF9IT0xEKSk7CisJd3JpdGVsKHNjdV9zYXNfcGNmZ192YWx1ZSwKKwkgICAgICAgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7CisKKwkvKiBEaXNhYmxlIHRoZSBub3RpZnkgZW5hYmxlIHNwaW51cCBwcmltaXRpdmVzICovCisJZW5hYmxlX3NwaW51cF92YWx1ZSA9IHJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bm90aWZ5X2VuYWJsZV9zcGludXBfY29udHJvbCk7CisJZW5hYmxlX3NwaW51cF92YWx1ZSAmPSB+U0NVX0VOU1BJTlVQX0dFTl9CSVQoRU5BQkxFKTsKKwl3cml0ZWwoZW5hYmxlX3NwaW51cF92YWx1ZSwgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5ub3RpZnlfZW5hYmxlX3NwaW51cF9jb250cm9sKTsKK30KKworLyoqCisgKgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgc3RhcnQgdGhlIE9PQi9TTiBzdGF0ZSBtYWNoaW5lIGZvciB0aGlzIHN0cnVjdCBpc2NpX3BoeSBvYmplY3QuCisgKi8KK3N0YXRpYyB2b2lkIHNjdV9saW5rX2xheWVyX3N0YXJ0X29vYigKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdTMyIHNjdV9zYXNfcGNmZ192YWx1ZTsKKworCXNjdV9zYXNfcGNmZ192YWx1ZSA9CisJCXJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCXNjdV9zYXNfcGNmZ192YWx1ZSB8PSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfRU5BQkxFKTsKKwlzY3Vfc2FzX3BjZmdfdmFsdWUgJj0KKwkJfihTQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfUkVTRVQpIHwKKwkJU0NVX1NBU19QQ0ZHX0dFTl9CSVQoSEFSRF9SRVNFVCkpOworCXdyaXRlbChzY3Vfc2FzX3BjZmdfdmFsdWUsCisJICAgICAgICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworfQorCisvKioKKyAqCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCB0cmFuc21pdCBhIGhhcmQgcmVzZXQgcmVxdWVzdCBvbiB0aGUgc3BlY2lmaWVkIHBoeS4gVGhlIFNDVQorICogaGFyZHdhcmUgcmVxdWlyZXMgdGhhdCB3ZSByZXNldCB0aGUgT09CIHN0YXRlIG1hY2hpbmUgYW5kIHNldCB0aGUgaGFyZCByZXNldAorICogYml0IGluIHRoZSBwaHkgY29uZmlndXJhdGlvbiByZWdpc3Rlci4gV2UgdGhlbiBtdXN0IHN0YXJ0IE9PQiBvdmVyIHdpdGggdGhlCisgKiBoYXJkIHJlc2V0IGJpdCBzZXQuCisgKi8KK3N0YXRpYyB2b2lkIHNjdV9saW5rX2xheWVyX3R4X2hhcmRfcmVzZXQoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXUzMiBwaHlfY29uZmlndXJhdGlvbl92YWx1ZTsKKworCS8qCisJICogU0FTIFBoeXMgbXVzdCB3YWl0IGZvciB0aGUgSEFSRF9SRVNFVF9UWCBldmVudCBub3RpZmljYXRpb24gdG8gdHJhbnNpdGlvbgorCSAqIHRvIHRoZSBzdGFydGluZyBzdGF0ZS4gKi8KKwlwaHlfY29uZmlndXJhdGlvbl92YWx1ZSA9CisJCXJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCXBoeV9jb25maWd1cmF0aW9uX3ZhbHVlIHw9CisJCShTQ1VfU0FTX1BDRkdfR0VOX0JJVChIQVJEX1JFU0VUKSB8CisJCSBTQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfUkVTRVQpKTsKKwl3cml0ZWwocGh5X2NvbmZpZ3VyYXRpb25fdmFsdWUsCisJICAgICAgICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+cGh5X2NvbmZpZ3VyYXRpb24pOworCisJLyogTm93IHRha2UgdGhlIE9PQiBzdGF0ZSBtYWNoaW5lIG91dCBvZiByZXNldCAqLworCXBoeV9jb25maWd1cmF0aW9uX3ZhbHVlIHw9IFNDVV9TQVNfUENGR19HRU5fQklUKE9PQl9FTkFCTEUpOworCXBoeV9jb25maWd1cmF0aW9uX3ZhbHVlICY9IH5TQ1VfU0FTX1BDRkdfR0VOX0JJVChPT0JfUkVTRVQpOworCXdyaXRlbChwaHlfY29uZmlndXJhdGlvbl92YWx1ZSwKKwkgICAgICAgJmlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzLT5waHlfY29uZmlndXJhdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfc3RvcHBlZF9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpcGh5LT5vd25pbmdfcG9ydDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCS8qCisJICogQHRvZG8gV2UgbmVlZCB0byBnZXQgdG8gdGhlIGNvbnRyb2xsZXIgdG8gcGxhY2UgdGhpcyBQRSBpbiBhCisJICogcmVzZXQgc3RhdGUKKwkgKi8KKwlzY2lfZGVsX3RpbWVyKCZpcGh5LT5zYXRhX3RpbWVyKTsKKworCXNjdV9saW5rX2xheWVyX3N0b3BfcHJvdG9jb2xfZW5naW5lKGlwaHkpOworCisJaWYgKGlwaHktPnNtLnByZXZpb3VzX3N0YXRlX2lkICE9IFNDSV9QSFlfSU5JVElBTCkKKwkJc2NpX2NvbnRyb2xsZXJfbGlua19kb3duKGlob3N0LCBwaHlfZ2V0X25vbl9kdW1teV9wb3J0KGlwaHkpLCBpcGh5KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BoeV9zdGFydGluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpcGh5LT5vd25pbmdfcG9ydDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCXNjdV9saW5rX2xheWVyX3N0b3BfcHJvdG9jb2xfZW5naW5lKGlwaHkpOworCXNjdV9saW5rX2xheWVyX3N0YXJ0X29vYihpcGh5KTsKKworCS8qIFdlIGRvbid0IGtub3cgd2hhdCBraW5kIG9mIHBoeSB3ZSBhcmUgZ29pbmcgdG8gYmUganVzdCB5ZXQgKi8KKwlpcGh5LT5wcm90b2NvbCA9IFNDSUNfU0RTX1BIWV9QUk9UT0NPTF9VTktOT1dOOworCWlwaHktPmJjbl9yZWNlaXZlZF93aGlsZV9wb3J0X3VuYXNzaWduZWQgPSBmYWxzZTsKKworCWlmIChpcGh5LT5zbS5wcmV2aW91c19zdGF0ZV9pZCA9PSBTQ0lfUEhZX1JFQURZKQorCQlzY2lfY29udHJvbGxlcl9saW5rX2Rvd24oaWhvc3QsIHBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSksIGlwaHkpOworCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1VCX0lOSVRJQUwpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcGh5X3JlYWR5X3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlwaHktPm93bmluZ19wb3J0OworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJc2NpX2NvbnRyb2xsZXJfbGlua191cChpaG9zdCwgcGh5X2dldF9ub25fZHVtbXlfcG9ydChpcGh5KSwgaXBoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfcmVhZHlfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwaHkpLCBzbSk7CisKKwlzY2lfcGh5X3N1c3BlbmQoaXBoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9waHlfcmVzZXR0aW5nX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBoeSksIHNtKTsKKworCS8qIFRoZSBwaHkgaXMgYmVpbmcgcmVzZXQsIHRoZXJlZm9yZSBkZWFjdGl2YXRlIGl0IGZyb20gdGhlIHBvcnQuICBJbgorCSAqIHRoZSByZXNldHRpbmcgc3RhdGUgd2UgZG9uJ3Qgbm90aWZ5IHRoZSB1c2VyIHJlZ2FyZGluZyBsaW5rIHVwIGFuZAorCSAqIGxpbmsgZG93biBub3RpZmljYXRpb25zCisJICovCisJc2NpX3BvcnRfZGVhY3RpdmF0ZV9waHkoaXBoeS0+b3duaW5nX3BvcnQsIGlwaHksIGZhbHNlKTsKKworCWlmIChpcGh5LT5wcm90b2NvbCA9PSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FTKSB7CisJCXNjdV9saW5rX2xheWVyX3R4X2hhcmRfcmVzZXQoaXBoeSk7CisJfSBlbHNlIHsKKwkJLyogVGhlIFNDVSBkb2VzIG5vdCBuZWVkIHRvIGhhdmUgYSBkaXNjcmV0ZSByZXNldCBzdGF0ZSBzbworCQkgKiBqdXN0IGdvIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHN0YXRlLgorCQkgKi8KKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXBoeS0+c20sIFNDSV9QSFlfU1RBUlRJTkcpOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSBzY2lfcGh5X3N0YXRlX3RhYmxlW10gPSB7CisJW1NDSV9QSFlfSU5JVElBTF0gPSB7IH0sCisJW1NDSV9QSFlfU1RPUFBFRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9waHlfc3RvcHBlZF9zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUEhZX1NUQVJUSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUEhZX1NVQl9JTklUSUFMXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19pbml0aWFsX3N1YnN0YXRlX2VudGVyLAorCX0sCisJW1NDSV9QSFlfU1VCX0FXQUlUX09TU1BfRU5dID0geyB9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfU1BFRURfRU5dID0geyB9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9JQUZfVUZdID0geyB9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfUE9XRVJdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3Nhc19wb3dlcl9zdWJzdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXNfcG93ZXJfc3Vic3RhdGVfZXhpdCwKKwl9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BPV0VSXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3Bvd2VyX3N1YnN0YXRlX2VudGVyLAorCQkuZXhpdF9zdGF0ZSAgPSBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NhdGFfcG93ZXJfc3Vic3RhdGVfZXhpdAorCX0sCisJW1NDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUEhZX0VOXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3BoeV9zdWJzdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3BoeV9zdWJzdGF0ZV9leGl0CisJfSwKKwlbU0NJX1BIWV9TVUJfQVdBSVRfU0FUQV9TUEVFRF9FTl0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9waHlfc3RhcnRpbmdfYXdhaXRfc2F0YV9zcGVlZF9zdWJzdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zYXRhX3NwZWVkX3N1YnN0YXRlX2V4aXQKKwl9LAorCVtTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19hd2FpdF9zaWdfZmlzX3VmX3N1YnN0YXRlX2VudGVyLAorCQkuZXhpdF9zdGF0ZSAgPSBzY2lfcGh5X3N0YXJ0aW5nX2F3YWl0X3NpZ19maXNfdWZfc3Vic3RhdGVfZXhpdAorCX0sCisJW1NDSV9QSFlfU1VCX0ZJTkFMXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9zdGFydGluZ19maW5hbF9zdWJzdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUEhZX1JFQURZXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BoeV9yZWFkeV9zdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgPSBzY2lfcGh5X3JlYWR5X3N0YXRlX2V4aXQsCisJfSwKKwlbU0NJX1BIWV9SRVNFVFRJTkddID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcGh5X3Jlc2V0dGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUEhZX0ZJTkFMXSA9IHsgfSwKK307CisKK3ZvaWQgc2NpX3BoeV9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJICAgIHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCB1OCBwaHlfaW5kZXgpCit7CisJc2NpX2luaXRfc20oJmlwaHktPnNtLCBzY2lfcGh5X3N0YXRlX3RhYmxlLCBTQ0lfUEhZX0lOSVRJQUwpOworCisJLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgaW5wdXQgZGF0YSB0byBvdXIgbG9jYWxzICovCisJaXBoeS0+b3duaW5nX3BvcnQgPSBpcG9ydDsKKwlpcGh5LT5waHlfaW5kZXggPSBwaHlfaW5kZXg7CisJaXBoeS0+YmNuX3JlY2VpdmVkX3doaWxlX3BvcnRfdW5hc3NpZ25lZCA9IGZhbHNlOworCWlwaHktPnByb3RvY29sID0gU0NJQ19TRFNfUEhZX1BST1RPQ09MX1VOS05PV047CisJaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnMgPSBOVUxMOworCWlwaHktPm1heF9uZWdvdGlhdGVkX3NwZWVkID0gU0FTX0xJTktfUkFURV9VTktOT1dOOworCisJLyogQ3JlYXRlIHRoZSBTSUdOQVRVUkUgRklTIFRpbWVvdXQgdGltZXIgZm9yIHRoaXMgcGh5ICovCisJc2NpX2luaXRfdGltZXIoJmlwaHktPnNhdGFfdGltZXIsIHBoeV9zYXRhX3RpbWVvdXQpOworfQorCit2b2lkIGlzY2lfcGh5X2luaXQoc3RydWN0IGlzY2lfcGh5ICppcGh5LCBzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgaW50IGluZGV4KQoreworCXN0cnVjdCBzY2lfb2VtX3BhcmFtcyAqb2VtID0gJmlob3N0LT5vZW1fcGFyYW1ldGVyczsKKwl1NjQgc2NpX3Nhc19hZGRyOworCV9fYmU2NCBzYXNfYWRkcjsKKworCXNjaV9zYXNfYWRkciA9IG9lbS0+cGh5c1tpbmRleF0uc2FzX2FkZHJlc3MuaGlnaDsKKwlzY2lfc2FzX2FkZHIgPDw9IDMyOworCXNjaV9zYXNfYWRkciB8PSBvZW0tPnBoeXNbaW5kZXhdLnNhc19hZGRyZXNzLmxvdzsKKwlzYXNfYWRkciA9IGNwdV90b19iZTY0KHNjaV9zYXNfYWRkcik7CisJbWVtY3B5KGlwaHktPnNhc19hZGRyLCAmc2FzX2FkZHIsIHNpemVvZihzYXNfYWRkcikpOworCisJaXBoeS0+aXNjaV9wb3J0ID0gTlVMTDsKKwlpcGh5LT5zYXNfcGh5LmVuYWJsZWQgPSAwOworCWlwaHktPnNhc19waHkuaWQgPSBpbmRleDsKKwlpcGh5LT5zYXNfcGh5LnNhc19hZGRyID0gJmlwaHktPnNhc19hZGRyWzBdOworCWlwaHktPnNhc19waHkuZnJhbWVfcmN2ZCA9ICh1OCAqKSZpcGh5LT5mcmFtZV9yY3ZkOworCWlwaHktPnNhc19waHkuaGEgPSAmaWhvc3QtPnNhc19oYTsKKwlpcGh5LT5zYXNfcGh5LmxsZGRfcGh5ID0gaXBoeTsKKwlpcGh5LT5zYXNfcGh5LmVuYWJsZWQgPSAxOworCWlwaHktPnNhc19waHkuY2xhc3MgPSBTQVM7CisJaXBoeS0+c2FzX3BoeS5pcHJvdG8gPSBTQVNfUFJPVE9DT0xfQUxMOworCWlwaHktPnNhc19waHkudHByb3RvID0gMDsKKwlpcGh5LT5zYXNfcGh5LnR5cGUgPSBQSFlfVFlQRV9QSFlTSUNBTDsKKwlpcGh5LT5zYXNfcGh5LnJvbGUgPSBQSFlfUk9MRV9JTklUSUFUT1I7CisJaXBoeS0+c2FzX3BoeS5vb2JfbW9kZSA9IE9PQl9OT1RfQ09OTkVDVEVEOworCWlwaHktPnNhc19waHkubGlua3JhdGUgPSBTQVNfTElOS19SQVRFX1VOS05PV047CisJbWVtc2V0KCZpcGh5LT5mcmFtZV9yY3ZkLCAwLCBzaXplb2YoaXBoeS0+ZnJhbWVfcmN2ZCkpOworfQorCisKKy8qKgorICogaXNjaV9waHlfY29udHJvbCgpIC0gVGhpcyBmdW5jdGlvbiBpcyBvbmUgb2YgdGhlIFNBUyBEb21haW4gVGVtcGxhdGUKKyAqICAgIGZ1bmN0aW9ucy4gVGhpcyBpcyBhIHBoeSBtYW5hZ2VtZW50IGZ1bmN0aW9uLgorICogQHBoeTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzcGh5IGJlaW5nIGNvbnRyb2xsZWQuCisgKiBAZnVuYzogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBwaHkgY29udHJvbCBmdW5jdGlvbiBiZWluZyBpbnZva2VkLgorICogQGJ1ZjogVGhpcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWMgdG8gdGhlIHBoeSBmdW5jdGlvbiBiZWluZyBpbnZva2VkLgorICoKKyAqIHN0YXR1cywgemVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworaW50IGlzY2lfcGh5X2NvbnRyb2woc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5LAorCQkgICAgIGVudW0gcGh5X2Z1bmMgZnVuYywKKwkJICAgICB2b2lkICpidWYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gc2FzX3BoeS0+bGxkZF9waHk7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpcGh5LT5pc2NpX3BvcnQ7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBzYXNfcGh5LT5oYS0+bGxkZF9oYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBwaHkgJXA7IGZ1bmMgJWQ7IGJ1ZiAlcDsgaXNjaSBwaHkgJXAsIHBvcnQgJXBcbiIsCisJCV9fZnVuY19fLCBzYXNfcGh5LCBmdW5jLCBidWYsIGlwaHksIGlwb3J0KTsKKworCXN3aXRjaCAoZnVuYykgeworCWNhc2UgUEhZX0ZVTkNfRElTQUJMRToKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJc2NpX3BoeV9zdG9wKGlwaHkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBQSFlfRlVOQ19MSU5LX1JFU0VUOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQlzY2lfcGh5X3N0b3AoaXBoeSk7CisJCXNjaV9waHlfc3RhcnQoaXBoeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFBIWV9GVU5DX0hBUkRfUkVTRVQ6CisJCWlmICghaXBvcnQpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkvKiBQZXJmb3JtIHRoZSBwb3J0IHJlc2V0LiAqLworCQlyZXQgPSBpc2NpX3BvcnRfcGVyZm9ybV9oYXJkX3Jlc2V0KGlob3N0LCBpcG9ydCwgaXBoeSk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICAgIiVzOiBwaHkgJXA7IGZ1bmMgJWQgTk9UIElNUExFTUVOVEVEIVxuIiwKKwkJCSAgIF9fZnVuY19fLCBzYXNfcGh5LCBmdW5jKTsKKwkJcmV0ID0gLUVOT1NZUzsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9waHkuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3BoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Njk5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9waHkuaApAQCAtMCwwICsxLDUwNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX0lTQ0lfUEhZX0hfCisjZGVmaW5lIF9JU0NJX1BIWV9IXworCisjaW5jbHVkZSA8c2NzaS9zYXMuaD4KKyNpbmNsdWRlIDxzY3NpL2xpYnNhcy5oPgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJzYXMuaCIKKworLyogVGhpcyBpcyB0aGUgdGltZW91dCB2YWx1ZSBmb3IgdGhlIFNBVEEgcGh5IHRvIHdhaXQgZm9yIGEgU0lHTkFUVVJFIEZJUworICogYmVmb3JlIHJlc3RhcnRpbmcgdGhlIHN0YXJ0aW5nIHN0YXRlIG1hY2hpbmUuICBUZWNobmljYWxseSwgdGhlIG9sZCBwYXJhbGxlbAorICogQVRBIHNwZWNpZmljYXRpb24gcmVxdWlyZWQgdXAgdG8gMzAgc2Vjb25kcyBmb3IgYSBkZXZpY2UgdG8gaXNzdWUgaXRzCisgKiBzaWduYXR1cmUgRklTIGFzIGEgcmVzdWx0IG9mIGEgc29mdCByZXNldC4gIE5vdyB3ZSBzZWUgdGhhdCBkZXZpY2VzIHJlc3BvbmQKKyAqIGdlbmVyYWxseSB3aXRoaW4gMTUgc2Vjb25kcywgYnV0IHdlJ2xsIHVzZSAyNSBmb3Igbm93LgorICovCisjZGVmaW5lIFNDSUNfU0RTX1NJR05BVFVSRV9GSVNfVElNRU9VVCAgICAyNTAwMAorCisvKiBUaGlzIGlzIHRoZSB0aW1lb3V0IGZvciB0aGUgU0FUQSBPT0IvU04gYmVjYXVzZSB0aGUgaGFyZHdhcmUgZG9lcyBub3QKKyAqIHJlY29nbml6ZSBhIGhvdCBwbHVnIGFmdGVyIE9PQiBzaWduYWwgYnV0IGJlZm9yZSB0aGUgU04gc2lnbmFscy4gIFdlIG5lZWQgdG8KKyAqIG1ha2Ugc3VyZSBhZnRlciBhIGhvdHBsdWcgdGltZW91dCBpZiB3ZSBoYXZlIG5vdCByZWNlaXZlZCB0aGUgc3BlZWQgZXZlbnQKKyAqIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBoYXJkd2FyZSB0aGF0IHdlIHJlc3RhcnQgdGhlIGhhcmR3YXJlIE9PQiBzdGF0ZQorICogbWFjaGluZS4KKyAqLworI2RlZmluZSBTQ0lDX1NEU19TQVRBX0xJTktfVFJBSU5JTkdfVElNRU9VVCAgMjUwCisKK2VudW0gc2NpX3BoeV9wcm90b2NvbCB7CisJU0NJQ19TRFNfUEhZX1BST1RPQ09MX1VOS05PV04sCisJU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBUywKKwlTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FUQSwKKwlTQ0lDX1NEU19NQVhfUEhZX1BST1RPQ09MUworfTsKKworLyoqCisgKiBpc2NpX3BoeSAtIGhiYSBsb2NhbCBwaHkgaW5mcmFzdHJ1Y3R1cmUKKyAqIEBzbToKKyAqIEBwcm90b2NvbDogYXR0YWNoZWQgZGV2aWNlIHByb3RvY29sCisgKiBAcGh5X2luZGV4OiBwaHlzaWNhbCBpbmRleCByZWxhdGl2ZSB0byB0aGUgY29udHJvbGxlciAoMC0zKQorICogQGJjbl9yZWNlaXZlZF93aGlsZV9wb3J0X3VuYXNzaWduZWQ6IGJjbiB0byByZXBvcnQgYWZ0ZXIgcG9ydCBhc3NvY2lhdGlvbgorICogQHNhdGFfdGltZXI6IHRpbWVvdXQgU0FUQSBzaWduYXR1cmUgRklTIGFycml2YWwKKyAqLworc3RydWN0IGlzY2lfcGh5IHsKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSBzbTsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICpvd25pbmdfcG9ydDsKKwllbnVtIHNhc19saW5rcmF0ZSBtYXhfbmVnb3RpYXRlZF9zcGVlZDsKKwllbnVtIHNjaV9waHlfcHJvdG9jb2wgcHJvdG9jb2w7CisJdTggcGh5X2luZGV4OworCWJvb2wgYmNuX3JlY2VpdmVkX3doaWxlX3BvcnRfdW5hc3NpZ25lZDsKKwlib29sIGlzX2luX2xpbmtfdHJhaW5pbmc7CisJc3RydWN0IHNjaV90aW1lciBzYXRhX3RpbWVyOworCXN0cnVjdCBzY3VfdHJhbnNwb3J0X2xheWVyX3JlZ2lzdGVycyBfX2lvbWVtICp0cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzOworCXN0cnVjdCBzY3VfbGlua19sYXllcl9yZWdpc3RlcnMgX19pb21lbSAqbGlua19sYXllcl9yZWdpc3RlcnM7CisJc3RydWN0IGFzZF9zYXNfcGh5IHNhc19waHk7CisJc3RydWN0IGlzY2lfcG9ydCAqaXNjaV9wb3J0OworCXU4IHNhc19hZGRyW1NBU19BRERSX1NJWkVdOworCXVuaW9uIHsKKwkJc3RydWN0IHNhc19pZGVudGlmeV9mcmFtZSBpYWY7CisJCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgZmlzOworCX0gZnJhbWVfcmN2ZDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlzY2lfcGh5ICp0b19pcGh5KHN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSkKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBjb250YWluZXJfb2Yoc2FzX3BoeSwgdHlwZW9mKCppcGh5KSwgc2FzX3BoeSk7CisKKwlyZXR1cm4gaXBoeTsKK30KKworc3RydWN0IHNjaV9waHlfY2FwIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKgorCQkJICogVGhlIFNBUyBzcGVjaWZpY2F0aW9uIGluZGljYXRlcyB0aGUgc3RhcnQgYml0IHNoYWxsCisJCQkgKiBhbHdheXMgYmUgc2V0IHRvCisJCQkgKiAxLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGhhdmUgdGhlIHN0YXJ0IGJpdCBzZXQKKwkJCSAqIHRvIDAgaWYgdGhlIFBIWSBDQVBBQklMSVRJRVMgd2VyZSBlaXRoZXIgbm90CisJCQkgKiByZWNlaXZlZCBvciBzcGVlZCBuZWdvdGlhdGlvbiBmYWlsZWQuCisJCQkgKi8KKwkJCXU4IHN0YXJ0OjE7CisJCQl1OCB0eF9zc2NfdHlwZToxOworCQkJdTggcmVzMToyOworCQkJdTggcmVxX2xvZ2ljYWxfbGlua3JhdGU6NDsKKworCQkJdTMyIGdlbjFfbm9fc3NjOjE7CisJCQl1MzIgZ2VuMV9zc2M6MTsKKwkJCXUzMiBnZW4yX25vX3NzYzoxOworCQkJdTMyIGdlbjJfc3NjOjE7CisJCQl1MzIgZ2VuM19ub19zc2M6MTsKKwkJCXUzMiBnZW4zX3NzYzoxOworCQkJdTMyIHJlczI6MTc7CisJCQl1MzIgcGFyaXR5OjE7CisJCX07CisJCXUzMiBhbGw7CisJfTsKK30gIF9fcGFja2VkOworCisvKiB0aGlzIGRhdGEgc3RydWN0dXJlIHJlZmxlY3RzIHRoZSBsaW5rIGxheWVyIHRyYW5zbWl0IGlkZW50aWZpY2F0aW9uIHJlZyAqLworc3RydWN0IHNjaV9waHlfcHJvdG8geworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUxNiBfcl9hOjE7CisJCQl1MTYgc21wX2lwb3J0OjE7CisJCQl1MTYgc3RwX2lwb3J0OjE7CisJCQl1MTYgc3NwX2lwb3J0OjE7CisJCQl1MTYgX3JfYjo0OworCQkJdTE2IF9yX2M6MTsKKwkJCXUxNiBzbXBfdHBvcnQ6MTsKKwkJCXUxNiBzdHBfdHBvcnQ6MTsKKwkJCXUxNiBzc3BfdHBvcnQ6MTsKKwkJCXUxNiBfcl9kOjQ7CisJCX07CisJCXUxNiBhbGw7CisJfTsKK30gX19wYWNrZWQ7CisKKworLyoqCisgKiBzdHJ1Y3Qgc2NpX3BoeV9wcm9wZXJ0aWVzIC0gVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgcHJvcGVydGllcyBjb21tb24gdG8KKyAqICAgIGFsbCBwaHlzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2NpX3BoeV9wcm9wZXJ0aWVzIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgcG9ydCB0aGF0IGN1cnJlbnRseSBjb250YWlucyB0aGUKKwkgKiBzdXBwbGllZCBwaHkuICBUaGlzIGZpZWxkIG1heSBiZSBzZXQgdG8gTlVMTAorCSAqIGlmIHRoZSBwaHkgaXMgbm90IGN1cnJlbnRseSBjb250YWluZWQgaW4gYSBwb3J0LgorCSAqLworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0OworCisJLyoqCisJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIGxpbmsgcmF0ZSBhdCB3aGljaCB0aGUgcGh5IGlzCisJICogY3VycmVudGx5IG9wZXJhdGluZy4KKwkgKi8KKwllbnVtIHNhc19saW5rcmF0ZSBuZWdvdGlhdGVkX2xpbmtfcmF0ZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBpbmRleCBvZiB0aGUgcGh5IGluIHJlbGF0aW9uIHRvIG90aGVyCisJICogcGh5cyB3aXRoaW4gdGhlIGNvbnRyb2xsZXIuICBUaGlzIGluZGV4IGlzIHplcm8gcmVsYXRpdmUuCisJICovCisJdTggaW5kZXg7Cit9OworCisvKioKKyAqIHN0cnVjdCBzY2lfc2FzX3BoeV9wcm9wZXJ0aWVzIC0gVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgcHJvcGVydGllcywKKyAqICAgIHNwZWNpZmljIHRvIGEgU0FTIHBoeSwgdGhhdCBjYW4gYmUgcmV0cmlldmVkLgorICoKKyAqCisgKi8KK3N0cnVjdCBzY2lfc2FzX3BoeV9wcm9wZXJ0aWVzIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGRlbGluZWF0ZXMgdGhlIElkZW50aWZ5IEFkZHJlc3MgRnJhbWUgcmVjZWl2ZWQKKwkgKiBmcm9tIHRoZSByZW1vdGUgZW5kIHBvaW50LgorCSAqLworCXN0cnVjdCBzYXNfaWRlbnRpZnlfZnJhbWUgcmN2ZF9pYWY7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGRlbGluZWF0ZXMgdGhlIFBoeSBjYXBhYmlsaXRpZXMgc3RydWN0dXJlIHJlY2VpdmVkCisJICogZnJvbSB0aGUgcmVtb3RlIGVuZCBwb2ludC4KKwkgKi8KKwlzdHJ1Y3Qgc2NpX3BoeV9jYXAgcmN2ZF9jYXA7CisKK307CisKKy8qKgorICogc3RydWN0IHNjaV9zYXRhX3BoeV9wcm9wZXJ0aWVzIC0gVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgcHJvcGVydGllcywKKyAqICAgIHNwZWNpZmljIHRvIGEgU0FUQSBwaHksIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2NpX3NhdGFfcGh5X3Byb3BlcnRpZXMgeworCS8qKgorCSAqIFRoaXMgZmllbGQgZGVsaW5lYXRlcyB0aGUgc2lnbmF0dXJlIEZJUyByZWNlaXZlZCBmcm9tIHRoZQorCSAqIGF0dGFjaGVkIHRhcmdldC4KKwkgKi8KKwlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzIHNpZ25hdHVyZV9maXM7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0byB0aGUgdXNlciBpZiBhIHBvcnQgc2VsZWN0b3IgaXMgY29ubmVjdGVkCisJICogb24gdGhlIHNwZWNpZmllZCBwaHkuCisJICovCisJYm9vbCBpc19wb3J0X3NlbGVjdG9yX3ByZXNlbnQ7CisKK307CisKKy8qKgorICogZW51bSBzY2lfcGh5X2NvdW50ZXJfaWQgLSBUaGlzIGVudW1lcmF0aW9uIGRlcGljdHMgdGhlIHZhcmlvdXMgcGllY2VzIG9mCisgKiAgICBvcHRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZm9yIGEgc3BlY2lmaWMgcGh5LgorICoKKyAqCisgKi8KK2VudW0gc2NpX3BoeV9jb3VudGVyX2lkIHsKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9SRUNFSVZFRF9GUkFNRSwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZC4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1RSQU5TTUlUVEVEX0ZSQU1FLAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgRFdPUkRzIHJlY2VpdmVkLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfUkVDRUlWRURfRlJBTUVfV09SRCwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIERXT1JEcyB0cmFuc21pdHRlZC4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1RSQU5TTUlUVEVEX0ZSQU1FX0RXT1JELAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgdGltZXMgRFdPUkQKKwkgKiBzeW5jaHJvbml6YXRpb24gd2FzIGxvc3QuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9MT1NTX09GX1NZTkNfRVJST1IsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiByZWNlaXZlZCBEV09SRHMgd2l0aAorCSAqIHJ1bm5pbmcgZGlzcGFyaXR5IGVycm9ycy4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX0RJU1BBUklUWV9FUlJPUiwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYW1lcyB3aXRoIGEKKwkgKiBDUkMgZXJyb3IgKG5vdCBpbmNsdWRpbmcgc2hvcnQgb3IgdHJ1bmNhdGVkIGZyYW1lcykuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9SRUNFSVZFRF9GUkFNRV9DUkNfRVJST1IsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiBET05FIChBQ0svTkFLIFRJTUVPVVQpCisJICogcHJpbWl0aXZlcyByZWNlaXZlZC4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX0RPTkVfQUNLX05BS19USU1FT1VULAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgRE9ORSAoQUNLL05BSyBUSU1FT1VUKQorCSAqIHByaW1pdGl2ZXMgdHJhbnNtaXR0ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9UUkFOU01JVFRFRF9ET05FX0FDS19OQUtfVElNRU9VVCwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBpbmFjdGl2aXR5CisJICogdGltZXIgZm9yIGNvbm5lY3Rpb25zIG9uIHRoZSBwaHkgaGFzIGJlZW4gdXRpbGl6ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9JTkFDVElWSVRZX1RJTUVSX0VYUElSRUQsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCB0cmFja3MgdGhlIG51bWJlciBvZiBET05FIChDUkVESVQgVElNRU9VVCkKKwkgKiBwcmltaXRpdmVzIHJlY2VpdmVkLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfUkVDRUlWRURfRE9ORV9DUkVESVRfVElNRU9VVCwKKworCS8qKgorCSAqIFRoaXMgUEhZIGluZm9ybWF0aW9uIGZpZWxkIHRyYWNrcyB0aGUgbnVtYmVyIG9mIERPTkUgKENSRURJVCBUSU1FT1VUKQorCSAqIHByaW1pdGl2ZXMgdHJhbnNtaXR0ZWQuCisJICovCisJU0NJQ19QSFlfQ09VTlRFUl9UUkFOU01JVFRFRF9ET05FX0NSRURJVF9USU1FT1VULAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgdHJhY2tzIHRoZSBudW1iZXIgb2YgQ1JFRElUIEJMT0NLRUQKKwkgKiBwcmltaXRpdmVzIHJlY2VpdmVkLgorCSAqIEBub3RlIERlcGVuZGluZyBvbiByZW1vdGUgZGV2aWNlIGltcGxlbWVudGF0aW9uLCBjcmVkaXQgYmxvY2tzCisJICogICAgICAgbWF5IG9jY3VyIHJlZ3VsYXJseS4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX0NSRURJVF9CTE9DS0VELAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgY29udGFpbnMgdGhlIG51bWJlciBvZiBzaG9ydCBmcmFtZXMKKwkgKiByZWNlaXZlZC4gIEEgc2hvcnQgZnJhbWUgaXMgc2ltcGx5IGEgZnJhbWUgc21hbGxlciB0aGVuIHdoYXQgaXMKKwkgKiBhbGxvd2VkIGJ5IGVpdGhlciB0aGUgU0FTIG9yIFNBVEEgc3BlY2lmaWNhdGlvbi4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX1NIT1JUX0ZSQU1FLAorCisJLyoqCisJICogVGhpcyBQSFkgaW5mb3JtYXRpb24gZmllbGQgY29udGFpbnMgdGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgYWZ0ZXIKKwkgKiBjcmVkaXQgaGFzIGJlZW4gZXhoYXVzdGVkLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfUkVDRUlWRURfRlJBTUVfV0lUSE9VVF9DUkVESVQsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBhZnRlcgorCSAqIGEgRE9ORSBoYXMgYmVlbiByZWNlaXZlZC4KKwkgKi8KKwlTQ0lDX1BIWV9DT1VOVEVSX1JFQ0VJVkVEX0ZSQU1FX0FGVEVSX0RPTkUsCisKKwkvKioKKwkgKiBUaGlzIFBIWSBpbmZvcm1hdGlvbiBmaWVsZCBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBwaHkKKwkgKiBmYWlsZWQgdG8gYWNoaWV2ZSBEV09SRCBzeW5jaHJvbml6YXRpb24gZHVyaW5nIHNwZWVkIG5lZ290aWF0aW9uLgorCSAqLworCVNDSUNfUEhZX0NPVU5URVJfU05fRFdPUkRfU1lOQ19FUlJPUgorfTsKKworZW51bSBzY2lfcGh5X3N0YXRlcyB7CisJLyoqCisJICogU2ltcGx5IHRoZSBpbml0aWFsIHN0YXRlIGZvciB0aGUgYmFzZSBkb21haW4gc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlTQ0lfUEhZX0lOSVRJQUwsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBwaHkgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHN0b3BwZWQuCisJICogSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkIG9uIHRoaXMgcGh5LgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBJTklUSUFMIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVEFSVElORyBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFU0VUVElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lfUEhZX1NUT1BQRUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBwaHkgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVjb21taW5nCisJICogcmVhZHkuICBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQgb24gdGhpcyBwaHkuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUT1BQRUQgc3RhdGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBSRVNFVFRJTkcgc3RhdGUuCisJICovCisJU0NJX1BIWV9TVEFSVElORywKKworCS8qKgorCSAqIEluaXRpYWwgc3RhdGUKKwkgKi8KKwlTQ0lfUEhZX1NVQl9JTklUSUFMLAorCisJLyoqCisJICogV2FpdCBzdGF0ZSBmb3IgdGhlIGhhcmR3YXJlIE9TU1AgZXZlbnQgdHlwZSBub3RpZmljYXRpb24KKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9PU1NQX0VOLAorCisJLyoqCisJICogV2FpdCBzdGF0ZSBmb3IgdGhlIFBIWSBzcGVlZCBub3RpZmljYXRpb24KKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfU1BFRURfRU4sCisKKwkvKioKKwkgKiBXYWl0IHN0YXRlIGZvciB0aGUgSUFGIFVuc29saWNpdGVkIGZyYW1lIG5vdGlmaWNhdGlvbgorCSAqLworCVNDSV9QSFlfU1VCX0FXQUlUX0lBRl9VRiwKKworCS8qKgorCSAqIFdhaXQgc3RhdGUgZm9yIHRoZSByZXF1ZXN0IHRvIGNvbnN1bWUgcG93ZXIKKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9TQVNfUE9XRVIsCisKKwkvKioKKwkgKiBXYWl0IHN0YXRlIGZvciByZXF1ZXN0IHRvIGNvbnN1bWUgcG93ZXIKKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9TQVRBX1BPV0VSLAorCisJLyoqCisJICogV2FpdCBzdGF0ZSBmb3IgdGhlIFNBVEEgUEhZIG5vdGlmaWNhdGlvbgorCSAqLworCVNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfUEhZX0VOLAorCisJLyoqCisJICogV2FpdCBmb3IgdGhlIFNBVEEgUEhZIHNwZWVkIG5vdGlmaWNhdGlvbgorCSAqLworCVNDSV9QSFlfU1VCX0FXQUlUX1NBVEFfU1BFRURfRU4sCisKKwkvKioKKwkgKiBXYWl0IHN0YXRlIGZvciB0aGUgU0lHTkFUVVJFIEZJUyB1bnNvbGljaXRlZCBmcmFtZSBub3RpZmljYXRpb24KKwkgKi8KKwlTQ0lfUEhZX1NVQl9BV0FJVF9TSUdfRklTX1VGLAorCisJLyoqCisJICogRXhpdCBzdGF0ZSBmb3IgdGhpcyBzdGF0ZSBtYWNoaW5lCisJICovCisJU0NJX1BIWV9TVUJfRklOQUwsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGUgdGhlIHBoeSBpcyBub3cgcmVhZHkuICBUaHVzLCB0aGUgdXNlcgorCSAqIGlzIGFibGUgdG8gcGVyZm9ybSBJTyBvcGVyYXRpb25zIHV0aWxpemluZyB0aGlzIHBoeSBhcyBsb25nIGFzIGl0CisJICogaXMgY3VycmVudGx5IHBhcnQgb2YgYSB2YWxpZCBwb3J0LgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVEFSVElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lfUEhZX1JFQURZLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGh5IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHJlc2V0LgorCSAqIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZCBvbiB0aGlzIHBoeS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJX1BIWV9SRVNFVFRJTkcsCisKKwkvKioKKwkgKiBTaW1wbHkgdGhlIGZpbmFsIHN0YXRlIGZvciB0aGUgYmFzZSBwaHkgc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlTQ0lfUEhZX0ZJTkFMLAorfTsKKwordm9pZCBzY2lfcGh5X2NvbnN0cnVjdCgKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJdTggcGh5X2luZGV4KTsKKworc3RydWN0IGlzY2lfcG9ydCAqcGh5X2dldF9ub25fZHVtbXlfcG9ydChzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCit2b2lkIHNjaV9waHlfc2V0X3BvcnQoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfaW5pdGlhbGl6ZSgKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJc3RydWN0IHNjdV90cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzIF9faW9tZW0gKnRyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMsCisJc3RydWN0IHNjdV9saW5rX2xheWVyX3JlZ2lzdGVycyBfX2lvbWVtICpsaW5rX2xheWVyX3JlZ2lzdGVycyk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X3N0YXJ0KAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcGh5X3N0b3AoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfcmVzZXQoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKwordm9pZCBzY2lfcGh5X3Jlc3VtZSgKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCit2b2lkIHNjaV9waHlfc2V0dXBfdHJhbnNwb3J0KAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwl1MzIgZGV2aWNlX2lkKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9waHlfZXZlbnRfaGFuZGxlcigKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJdTMyIGV2ZW50X2NvZGUpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9mcmFtZV9oYW5kbGVyKAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwl1MzIgZnJhbWVfaW5kZXgpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BoeV9jb25zdW1lX3Bvd2VyX2hhbmRsZXIoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKwordm9pZCBzY2lfcGh5X2dldF9zYXNfYWRkcmVzcygKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyAqc2FzX2FkZHJlc3MpOworCit2b2lkIHNjaV9waHlfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKAorCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzICpzYXNfYWRkcmVzcyk7CisKK3N0cnVjdCBzY2lfcGh5X3Byb3RvOwordm9pZCBzY2lfcGh5X2dldF9wcm90b2NvbHMoCisJc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCXN0cnVjdCBzY2lfcGh5X3Byb3RvICpwcm90b2NvbHMpOworZW51bSBzYXNfbGlua3JhdGUgc2NpX3BoeV9saW5rcmF0ZShzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCitzdHJ1Y3QgaXNjaV9ob3N0Owordm9pZCBpc2NpX3BoeV9pbml0KHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwgc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIGludCBpbmRleCk7CitpbnQgaXNjaV9waHlfY29udHJvbChzdHJ1Y3QgYXNkX3Nhc19waHkgKnBoeSwgZW51bSBwaHlfZnVuYyBmdW5jLCB2b2lkICpidWYpOworCisjZW5kaWYgLyogIWRlZmluZWQoX0lTQ0lfUEhZX0hfKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNmY5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmMKQEAgLTAsMCArMSwxNzU3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInBvcnQuaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisKKyNkZWZpbmUgU0NJQ19TRFNfUE9SVF9IQVJEX1JFU0VUX1RJTUVPVVQgICgxMDAwKQorI2RlZmluZSBTQ1VfRFVNTVlfSU5ERVggICAgKDB4RkZGRikKKworc3RhdGljIHZvaWQgaXNjaV9wb3J0X2NoYW5nZV9zdGF0ZShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgZW51bSBpc2NpX3N0YXR1cyBzdGF0dXMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoJmlwb3J0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpcG9ydCA9ICVwLCBzdGF0ZSA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBpcG9ydCwgc3RhdHVzKTsKKworCS8qIFhYWCBwb2ludGxlc3MgbG9jayAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpcG9ydC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCWlwb3J0LT5zdGF0dXMgPSBzdGF0dXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXBvcnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfZ2V0X3Byb3RvY29scyhzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgc3RydWN0IHNjaV9waHlfcHJvdG8gKnByb3RvKQoreworCXU4IGluZGV4OworCisJcHJvdG8tPmFsbCA9IDA7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGlwb3J0LT5waHlfdGFibGVbaW5kZXhdOworCisJCWlmICghaXBoeSkKKwkJCWNvbnRpbnVlOworCQlzY2lfcGh5X2dldF9wcm90b2NvbHMoaXBoeSwgcHJvdG8pOworCX0KK30KKworc3RhdGljIHUzMiBzY2lfcG9ydF9nZXRfcGh5cyhzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwl1MzIgaW5kZXg7CisJdTMyIG1hc2s7CisKKwltYXNrID0gMDsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspCisJCWlmIChpcG9ydC0+cGh5X3RhYmxlW2luZGV4XSkKKwkJCW1hc2sgfD0gKDEgPDwgaW5kZXgpOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICogc2NpX3BvcnRfZ2V0X3Byb3BlcnRpZXMoKSAtIFRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIHRoZSBwcm9wZXJ0aWVzCisgKiAgICByZWdhcmRpbmcgdGhlIHBvcnQsIHN1Y2ggYXM6IHBoeXNpY2FsIGluZGV4LCBwcm90b2NvbHMsIHNhcyBhZGRyZXNzLCBldGMuCisgKiBAcG9ydDogdGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBwb3J0IGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgcGh5c2ljYWwKKyAqICAgIGluZGV4LgorICogQHByb3BlcnRpZXM6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcHJvcGVydGllcyBzdHJ1Y3R1cmUgaW50byB3aGljaCB0bworICogICAgY29weSB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uLgorICoKKyAqIEluZGljYXRlIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBhIHZhbGlkIHBvcnQuIFNDSV9TVUNDRVNTIFRoaXMgdmFsdWUgaXMKKyAqIHJldHVybmVkIGlmIHRoZSBzcGVjaWZpZWQgcG9ydCB3YXMgdmFsaWQuIFNDSV9GQUlMVVJFX0lOVkFMSURfUE9SVCBUaGlzCisgKiB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgc3BlY2lmaWVkIHBvcnQgaXMgbm90IHZhbGlkLiAgV2hlbiB0aGlzIHZhbHVlIGlzCisgKiByZXR1cm5lZCwgbm8gZGF0YSBpcyBjb3BpZWQgdG8gdGhlIHByb3BlcnRpZXMgb3V0cHV0IHBhcmFtZXRlci4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9nZXRfcHJvcGVydGllcyhzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJCXN0cnVjdCBzY2lfcG9ydF9wcm9wZXJ0aWVzICpwcm9wKQoreworCWlmICghaXBvcnQgfHwgaXBvcnQtPmxvZ2ljYWxfcG9ydF9pbmRleCA9PSBTQ0lDX1NEU19EVU1NWV9QT1JUKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9QT1JUOworCisJcHJvcC0+aW5kZXggPSBpcG9ydC0+bG9naWNhbF9wb3J0X2luZGV4OworCXByb3AtPnBoeV9tYXNrID0gc2NpX3BvcnRfZ2V0X3BoeXMoaXBvcnQpOworCXNjaV9wb3J0X2dldF9zYXNfYWRkcmVzcyhpcG9ydCwgJnByb3AtPmxvY2FsLnNhc19hZGRyZXNzKTsKKwlzY2lfcG9ydF9nZXRfcHJvdG9jb2xzKGlwb3J0LCAmcHJvcC0+bG9jYWwucHJvdG9jb2xzKTsKKwlzY2lfcG9ydF9nZXRfYXR0YWNoZWRfc2FzX2FkZHJlc3MoaXBvcnQsICZwcm9wLT5yZW1vdGUuc2FzX2FkZHJlc3MpOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9iY25fZW5hYmxlKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeTsKKwl1MzIgdmFsOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXBvcnQtPnBoeV90YWJsZSk7IGkrKykgeworCQlpcGh5ID0gaXBvcnQtPnBoeV90YWJsZVtpXTsKKwkJaWYgKCFpcGh5KQorCQkJY29udGludWU7CisJCXZhbCA9IHJlYWRsKCZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bGlua19sYXllcl9jb250cm9sKTsKKwkJLyogY2xlYXIgdGhlIGJpdCBieSB3cml0aW5nIDEuICovCisJCXdyaXRlbCh2YWwsICZpcGh5LT5saW5rX2xheWVyX3JlZ2lzdGVycy0+bGlua19sYXllcl9jb250cm9sKTsKKwl9Cit9CisKKy8qIGNhbGxlZCB1bmRlciBzY2lfbG9jayB0byBzdGFiaWxpemUgcGh5OnBvcnQgYXNzb2NpYXRpb25zICovCit2b2lkIGlzY2lfcG9ydF9iY25fZW5hYmxlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwlpbnQgaTsKKworCWNsZWFyX2JpdChJUE9SVF9CQ05fQkxPQ0tFRCwgJmlwb3J0LT5mbGFncyk7CisJd2FrZV91cCgmaWhvc3QtPmV2ZW50cSk7CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChJUE9SVF9CQ05fUEVORElORywgJmlwb3J0LT5mbGFncykpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlwb3J0LT5waHlfdGFibGUpOyBpKyspIHsKKwkJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gaXBvcnQtPnBoeV90YWJsZVtpXTsKKworCQlpZiAoIWlwaHkpCisJCQljb250aW51ZTsKKworCQlpaG9zdC0+c2FzX2hhLm5vdGlmeV9wb3J0X2V2ZW50KCZpcGh5LT5zYXNfcGh5LAorCQkJCQkJUE9SVEVfQlJPQURDQVNUX1JDVkQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfcG9ydF9iY19jaGFuZ2VfcmVjZWl2ZWQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwlpZiAoaXBvcnQgJiYgdGVzdF9iaXQoSVBPUlRfQkNOX0JMT0NLRUQsICZpcG9ydC0+ZmxhZ3MpKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGRpc2FibGVkIEJDTjsgaXNjaV9waHkgPSAlcCwgc2FzX3BoeSA9ICVwXG4iLAorCQkJX19mdW5jX18sIGlwaHksICZpcGh5LT5zYXNfcGh5KTsKKwkJc2V0X2JpdChJUE9SVF9CQ05fUEVORElORywgJmlwb3J0LT5mbGFncyk7CisJCWF0b21pY19pbmMoJmlwb3J0LT5ldmVudCk7CisJCXdha2VfdXAoJmlob3N0LT5ldmVudHEpOworCX0gZWxzZSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlzY2lfcGh5ID0gJXAsIHNhc19waHkgPSAlcFxuIiwKKwkJCV9fZnVuY19fLCBpcGh5LCAmaXBoeS0+c2FzX3BoeSk7CisKKwkJaWhvc3QtPnNhc19oYS5ub3RpZnlfcG9ydF9ldmVudCgmaXBoeS0+c2FzX3BoeSwKKwkJCQkJCVBPUlRFX0JST0FEQ0FTVF9SQ1ZEKTsKKwl9CisJc2NpX3BvcnRfYmNuX2VuYWJsZShpcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfcG9ydF9saW5rX3VwKHN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKKwkJCSAgICAgIHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJICAgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNjaV9wb3J0X3Byb3BlcnRpZXMgcHJvcGVydGllczsKKwl1bnNpZ25lZCBsb25nIHN1Y2Nlc3MgPSB0cnVlOworCisJQlVHX09OKGlwaHktPmlzY2lfcG9ydCAhPSBOVUxMKTsKKworCWlwaHktPmlzY2lfcG9ydCA9IGlwb3J0OworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9wb3J0ID0gJXBcbiIsCisJCV9fZnVuY19fLCBpcG9ydCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXBoeS0+c2FzX3BoeS5mcmFtZV9yY3ZkX2xvY2ssIGZsYWdzKTsKKworCWlzY2lfcG9ydF9jaGFuZ2Vfc3RhdGUoaXBoeS0+aXNjaV9wb3J0LCBpc2NpX3N0YXJ0aW5nKTsKKworCXNjaV9wb3J0X2dldF9wcm9wZXJ0aWVzKGlwb3J0LCAmcHJvcGVydGllcyk7CisKKwlpZiAoaXBoeS0+cHJvdG9jb2wgPT0gU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBVEEpIHsKKwkJdTY0IGF0dGFjaGVkX3Nhc19hZGRyZXNzOworCisJCWlwaHktPnNhc19waHkub29iX21vZGUgPSBTQVRBX09PQl9NT0RFOworCQlpcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzKTsKKworCQkvKgorCQkgKiBGb3IgZGlyZWN0LWF0dGFjaGVkIFNBVEEgZGV2aWNlcywgdGhlIFNDSSBjb3JlIHdpbGwKKwkJICogYXV0b21hZ2ljYWxseSBhc3NpZ24gYSBTQVMgYWRkcmVzcyB0byB0aGUgZW5kIGRldmljZQorCQkgKiBmb3IgdGhlIHB1cnBvc2Ugb2YgY3JlYXRpbmcgYSBwb3J0LiBUaGlzIFNBUyBhZGRyZXNzCisJCSAqIHdpbGwgbm90IGJlIHRoZSBzYW1lIGFzIGFzc2lnbmVkIHRvIHRoZSBQSFkgYW5kIG5lZWRzCisJCSAqIHRvIGJlIG9idGFpbmVkIGZyb20gc3RydWN0IHNjaV9wb3J0X3Byb3BlcnRpZXMgcHJvcGVydGllcy4KKwkJICovCisJCWF0dGFjaGVkX3Nhc19hZGRyZXNzID0gcHJvcGVydGllcy5yZW1vdGUuc2FzX2FkZHJlc3MuaGlnaDsKKwkJYXR0YWNoZWRfc2FzX2FkZHJlc3MgPDw9IDMyOworCQlhdHRhY2hlZF9zYXNfYWRkcmVzcyB8PSBwcm9wZXJ0aWVzLnJlbW90ZS5zYXNfYWRkcmVzcy5sb3c7CisJCXN3YWI2NHMoJmF0dGFjaGVkX3Nhc19hZGRyZXNzKTsKKworCQltZW1jcHkoJmlwaHktPnNhc19waHkuYXR0YWNoZWRfc2FzX2FkZHIsCisJCSAgICAgICAmYXR0YWNoZWRfc2FzX2FkZHJlc3MsIHNpemVvZihhdHRhY2hlZF9zYXNfYWRkcmVzcykpOworCX0gZWxzZSBpZiAoaXBoeS0+cHJvdG9jb2wgPT0gU0NJQ19TRFNfUEhZX1BST1RPQ09MX1NBUykgeworCQlpcGh5LT5zYXNfcGh5Lm9vYl9tb2RlID0gU0FTX09PQl9NT0RFOworCQlpcGh5LT5zYXNfcGh5LmZyYW1lX3JjdmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2FzX2lkZW50aWZ5X2ZyYW1lKTsKKworCQkvKiBDb3B5IHRoZSBhdHRhY2hlZCBTQVMgYWRkcmVzcyBmcm9tIHRoZSBJQUYgKi8KKwkJbWVtY3B5KGlwaHktPnNhc19waHkuYXR0YWNoZWRfc2FzX2FkZHIsCisJCSAgICAgICBpcGh5LT5mcmFtZV9yY3ZkLmlhZi5zYXNfYWRkciwgU0FTX0FERFJfU0laRSk7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmaXNjaV9ob3N0LT5wZGV2LT5kZXYsICIlczogdW5rb3duIHRhcmdldFxuIiwgX19mdW5jX18pOworCQlzdWNjZXNzID0gZmFsc2U7CisJfQorCisJaXBoeS0+c2FzX3BoeS5waHktPm5lZ290aWF0ZWRfbGlua3JhdGUgPSBzY2lfcGh5X2xpbmtyYXRlKGlwaHkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXBoeS0+c2FzX3BoeS5mcmFtZV9yY3ZkX2xvY2ssIGZsYWdzKTsKKworCS8qIE5vdGlmeSBsaWJzYXMgdGhhdCB3ZSBoYXZlIGFuIGFkZHJlc3MgZnJhbWUsIGlmIGluZGVlZAorCSAqIHdlJ3ZlIGZvdW5kIGFuIFNTUCwgU01QLCBvciBTVFAgdGFyZ2V0ICovCisJaWYgKHN1Y2Nlc3MpCisJCWlzY2lfaG9zdC0+c2FzX2hhLm5vdGlmeV9wb3J0X2V2ZW50KCZpcGh5LT5zYXNfcGh5LAorCQkJCQkJICAgIFBPUlRFX0JZVEVTX0RNQUVEKTsKK30KKworCisvKioKKyAqIGlzY2lfcG9ydF9saW5rX2Rvd24oKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzY2kgY29yZSB3aGVuIGEgbGluaworICogICAgYmVjb21lcyBpbmFjdGl2ZS4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBob3N0IG9iamVjdC4KKyAqIEBwaHk6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBwaHkgd2l0aCB0aGUgYWN0aXZlIGxpbmsuCisgKiBAcG9ydDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBpc2NpIHBvcnQgd2l0aCB0aGUgYWN0aXZlIGxpbmsuCisgKgorICovCitzdGF0aWMgdm9pZCBpc2NpX3BvcnRfbGlua19kb3duKHN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKKwkJCQlzdHJ1Y3QgaXNjaV9waHkgKmlzY2lfcGh5LAorCQkJCXN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydCkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZTsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfcG9ydCA9ICVwXG4iLCBfX2Z1bmNfXywgaXNjaV9wb3J0KTsKKworCWlmIChpc2NpX3BvcnQpIHsKKworCQkvKiBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBwaHkgb24gdGhpcyBwb3J0LiAqLworCQlpZiAoaXNjaV9waHktPnNhc19waHkucG9ydCAmJgorCQkgICAgaXNjaV9waHktPnNhc19waHkucG9ydC0+bnVtX3BoeXMgPT0gMSkgeworCQkJYXRvbWljX2luYygmaXNjaV9wb3J0LT5ldmVudCk7CisJCQlpc2NpX3BvcnRfYmNuX2VuYWJsZShpc2NpX2hvc3QsIGlzY2lfcG9ydCk7CisKKwkJCS8qIGNoYW5nZSB0aGUgc3RhdGUgZm9yIGFsbCBkZXZpY2VzIG9uIHRoaXMgcG9ydC4gIFRoZQorCQkJICogbmV4dCB0YXNrIHNlbnQgdG8gdGhpcyBkZXZpY2Ugd2lsbCBiZSByZXR1cm5lZCBhcworCQkJICogU0FTX1RBU0tfVU5ERUxJVkVSRUQsIGFuZCB0aGUgc2NzaSBtaWQgbGF5ZXIgd2lsbAorCQkJICogcmVtb3ZlIHRoZSB0YXJnZXQKKwkJCSAqLworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShpc2NpX2RldmljZSwKKwkJCQkJICAgICZpc2NpX3BvcnQtPnJlbW90ZV9kZXZfbGlzdCwKKwkJCQkJICAgIG5vZGUpIHsKKwkJCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCQkJIiVzOiBpc2NpX2RldmljZSA9ICVwXG4iLAorCQkJCQlfX2Z1bmNfXywgaXNjaV9kZXZpY2UpOworCQkJCXNldF9iaXQoSURFVl9HT05FLCAmaXNjaV9kZXZpY2UtPmZsYWdzKTsKKwkJCX0KKwkJfQorCQlpc2NpX3BvcnRfY2hhbmdlX3N0YXRlKGlzY2lfcG9ydCwgaXNjaV9zdG9wcGluZyk7CisJfQorCisJLyogTm90aWZ5IGxpYnNhcyBvZiB0aGUgYm9ya2VuIGxpbmssIHRoaXMgd2lsbCB0cmlnZ2VyIGNhbGxzIHRvIG91cgorCSAqIGlzY2lfcG9ydF9kZWZvcm1lZCBhbmQgaXNjaV9kZXZfZ29uZSBmdW5jdGlvbnMuCisJICovCisJc2FzX3BoeV9kaXNjb25uZWN0ZWQoJmlzY2lfcGh5LT5zYXNfcGh5KTsKKwlpc2NpX2hvc3QtPnNhc19oYS5ub3RpZnlfcGh5X2V2ZW50KCZpc2NpX3BoeS0+c2FzX3BoeSwKKwkJCQkJICAgUEhZRV9MT1NTX09GX1NJR05BTCk7CisKKwlpc2NpX3BoeS0+aXNjaV9wb3J0ID0gTlVMTDsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfcG9ydCA9ICVwIC0gRG9uZVxuIiwgX19mdW5jX18sIGlzY2lfcG9ydCk7Cit9CisKKworLyoqCisgKiBpc2NpX3BvcnRfcmVhZHkoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzY2kgY29yZSB3aGVuIGEgbGluaworICogICAgYmVjb21lcyByZWFkeS4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBob3N0IG9iamVjdC4KKyAqIEBwb3J0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHNjaSBwb3J0IHdpdGggdGhlIGFjdGl2ZSBsaW5rLgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9wb3J0X3JlYWR5KHN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwgc3RydWN0IGlzY2lfcG9ydCAqaXNjaV9wb3J0KQoreworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfcG9ydCA9ICVwXG4iLCBfX2Z1bmNfXywgaXNjaV9wb3J0KTsKKworCWNvbXBsZXRlX2FsbCgmaXNjaV9wb3J0LT5zdGFydF9jb21wbGV0ZSk7CisJaXNjaV9wb3J0X2NoYW5nZV9zdGF0ZShpc2NpX3BvcnQsIGlzY2lfcmVhZHkpOworCXJldHVybjsKK30KKworLyoqCisgKiBpc2NpX3BvcnRfbm90X3JlYWR5KCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2NpIGNvcmUgd2hlbiBhIGxpbmsKKyAqICAgIGlzIG5vdCByZWFkeS4gQWxsIHJlbW90ZSBkZXZpY2VzIG9uIHRoaXMgbGluayB3aWxsIGJlIHJlbW92ZWQgaWYgdGhleSBhcmUKKyAqICAgIGluIHRoZSBzdG9wcGluZyBzdGF0ZS4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBob3N0IG9iamVjdC4KKyAqIEBwb3J0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHNjaSBwb3J0IHdpdGggdGhlIGFjdGl2ZSBsaW5rLgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9wb3J0X25vdF9yZWFkeShzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QsIHN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydCkKK3sKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX3BvcnQgPSAlcFxuIiwgX19mdW5jX18sIGlzY2lfcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfcG9ydF9zdG9wX2NvbXBsZXRlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgICBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgICAgZW51bSBzY2lfc3RhdHVzIGNvbXBsZXRpb25fc3RhdHVzKQoreworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICJQb3J0IHN0b3AgY29tcGxldGVcbiIpOworfQorCisvKioKKyAqIGlzY2lfcG9ydF9oYXJkX3Jlc2V0X2NvbXBsZXRlKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2NpIGNvcmUKKyAqICAgIHdoZW4gdGhlIGhhcmQgcmVzZXQgY29tcGxldGUgbm90aWZpY2F0aW9uIGhhcyBiZWVuIHJlY2VpdmVkLgorICogQHBvcnQ6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgc2NpIHBvcnQgd2l0aCB0aGUgYWN0aXZlIGxpbmsuCisgKiBAY29tcGxldGlvbl9zdGF0dXM6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgY29yZSBzdGF0dXMgZm9yIHRoZSByZXNldAorICogICAgcHJvY2Vzcy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcG9ydF9oYXJkX3Jlc2V0X2NvbXBsZXRlKHN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydCwKKwkJCQkJICBlbnVtIHNjaV9zdGF0dXMgY29tcGxldGlvbl9zdGF0dXMpCit7CisJZGV2X2RiZygmaXNjaV9wb3J0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX3BvcnQgPSAlcCwgY29tcGxldGlvbl9zdGF0dXM9JXhcbiIsCisJCSAgICAgX19mdW5jX18sIGlzY2lfcG9ydCwgY29tcGxldGlvbl9zdGF0dXMpOworCisJLyogU2F2ZSB0aGUgc3RhdHVzIG9mIHRoZSBoYXJkIHJlc2V0IGZyb20gdGhlIHBvcnQuICovCisJaXNjaV9wb3J0LT5oYXJkX3Jlc2V0X3N0YXR1cyA9IGNvbXBsZXRpb25fc3RhdHVzOworCisJY29tcGxldGVfYWxsKCZpc2NpX3BvcnQtPmhhcmRfcmVzZXRfY29tcGxldGUpOworfQorCisvKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHRydWUgdmFsdWUgaWYgdGhlIHNwZWNpZmllZCBwaHkgY2FuIGJlIGFzc2lnbmVkIHRvCisgKiB0aGlzIHBvcnQgVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgcGh5cyBmb3IgZWFjaCBwb3J0IHRoYXQgYXJlIGFsbG93ZWQ6IC0KKyAqIFBvcnQgMCAtIDMgMiAxIDAgLSBQb3J0IDEgLSAgICAgMSAtIFBvcnQgMiAtIDMgMiAtIFBvcnQgMyAtIDMgVGhpcyBtZXRob2QKKyAqIGRvZXNuJ3QgcHJlY2x1ZGUgYWxsIGNvbmZpZ3VyYXRpb25zLiAgSXQgbWVyZWx5IGVuc3VyZXMgdGhhdCBhIHBoeSBpcyBwYXJ0CisgKiBvZiB0aGUgYWxsb3dhYmxlIHNldCBvZiBwaHkgaWRlbnRpZmllcnMgZm9yIHRoYXQgcG9ydC4gIEZvciBleGFtcGxlLCBvbmUKKyAqIGNvdWxkIGFzc2lnbiBwaHkgMyB0byBwb3J0IDAgYW5kIG5vIG90aGVyIHBoeXMuICBQbGVhc2UgcmVmZXIgdG8KKyAqIHNjaV9wb3J0X2lzX3BoeV9tYXNrX3ZhbGlkKCkgZm9yIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB3aGV0aGVyIHRoZQorICogcGh5X21hc2sgZm9yIGEgcG9ydCBjYW4gYmUgc3VwcG9ydGVkLiBib29sIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlkIHBoeQorICogYXNzaWdubWVudCBmb3IgdGhlIHBvcnQgZmFsc2UgaWYgdGhpcyBpcyBub3QgYSB2YWxpZCBwaHkgYXNzaWdubWVudCBmb3IgdGhlCisgKiBwb3J0CisgKi8KK2Jvb2wgc2NpX3BvcnRfaXNfdmFsaWRfcGh5X2Fzc2lnbm1lbnQoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHUzMiBwaHlfaW5kZXgpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJc3RydWN0IHNjaV91c2VyX3BhcmFtZXRlcnMgKnVzZXIgPSAmaWhvc3QtPnVzZXJfcGFyYW1ldGVyczsKKworCS8qIEluaXRpYWxpemUgdG8gaW52YWxpZCB2YWx1ZS4gKi8KKwl1MzIgZXhpc3RpbmdfcGh5X2luZGV4ID0gU0NJX01BWF9QSFlTOworCXUzMiBpbmRleDsKKworCWlmICgoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gMSkgJiYgKHBoeV9pbmRleCAhPSAxKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID09IDMgJiYgcGh5X2luZGV4ICE9IDMpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA9PSAyICYmCisJICAgIChwaHlfaW5kZXggPT0gMCB8fCBwaHlfaW5kZXggPT0gMSkpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykKKwkJaWYgKGlwb3J0LT5waHlfdGFibGVbaW5kZXhdICYmIGluZGV4ICE9IHBoeV9pbmRleCkKKwkJCWV4aXN0aW5nX3BoeV9pbmRleCA9IGluZGV4OworCisJLyogRW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBwaHlzIGluIHRoZSBwb3J0IGFyZSBjYXBhYmxlIG9mCisJICogb3BlcmF0aW5nIGF0IHRoZSBzYW1lIG1heGltdW0gbGluayByYXRlLgorCSAqLworCWlmIChleGlzdGluZ19waHlfaW5kZXggPCBTQ0lfTUFYX1BIWVMgJiYKKwkgICAgdXNlci0+cGh5c1twaHlfaW5kZXhdLm1heF9zcGVlZF9nZW5lcmF0aW9uICE9CisJICAgIHVzZXItPnBoeXNbZXhpc3RpbmdfcGh5X2luZGV4XS5tYXhfc3BlZWRfZ2VuZXJhdGlvbikKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICoKKyAqIEBzY2lfcG9ydDogVGhpcyBpcyB0aGUgcG9ydCBvYmplY3QgZm9yIHdoaWNoIHRvIGRldGVybWluZSBpZiB0aGUgcGh5IG1hc2sKKyAqICAgIGNhbiBiZSBzdXBwb3J0ZWQuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSB0cnVlIHZhbHVlIGlmIHRoZSBwb3J0J3MgcGh5IG1hc2sgY2FuIGJlIHN1cHBvcnRlZAorICogYnkgdGhlIFNDVS4gVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgdmFsaWQgUEhZIG1hc2sgY29uZmlndXJhdGlvbnMgZm9yCisgKiBlYWNoIHBvcnQ6IC0gUG9ydCAwIC0gW1szICAyXSAxXSAwIC0gUG9ydCAxIC0gICAgICAgIFsxXSAtIFBvcnQgMiAtIFtbM10gMl0KKyAqIC0gUG9ydCAzIC0gIFszXSBUaGlzIG1ldGhvZCByZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW9uIHNwZWNpZnlpbmcgaWYgdGhlCisgKiBwaHkgbWFzayBjYW4gYmUgc3VwcG9ydGVkLiB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBwaHkgYXNzaWdubWVudCBmb3IgdGhlCisgKiBwb3J0IGZhbHNlIGlmIHRoaXMgaXMgbm90IGEgdmFsaWQgcGh5IGFzc2lnbm1lbnQgZm9yIHRoZSBwb3J0CisgKi8KK3N0YXRpYyBib29sIHNjaV9wb3J0X2lzX3BoeV9tYXNrX3ZhbGlkKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXUzMiBwaHlfbWFzaykKK3sKKwlpZiAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gMCkgeworCQlpZiAoKChwaHlfbWFzayAmIDB4MEYpID09IDB4MEYpCisJCSAgICB8fCAoKHBoeV9tYXNrICYgMHgwMykgPT0gMHgwMykKKwkJICAgIHx8ICgocGh5X21hc2sgJiAweDAxKSA9PSAweDAxKQorCQkgICAgfHwgKHBoeV9tYXNrID09IDApKQorCQkJcmV0dXJuIHRydWU7CisJfSBlbHNlIGlmIChpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA9PSAxKSB7CisJCWlmICgoKHBoeV9tYXNrICYgMHgwMikgPT0gMHgwMikKKwkJICAgIHx8IChwaHlfbWFzayA9PSAwKSkKKwkJCXJldHVybiB0cnVlOworCX0gZWxzZSBpZiAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gMikgeworCQlpZiAoKChwaHlfbWFzayAmIDB4MEMpID09IDB4MEMpCisJCSAgICB8fCAoKHBoeV9tYXNrICYgMHgwNCkgPT0gMHgwNCkKKwkJICAgIHx8IChwaHlfbWFzayA9PSAwKSkKKwkJCXJldHVybiB0cnVlOworCX0gZWxzZSBpZiAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gMykgeworCQlpZiAoKChwaHlfbWFzayAmIDB4MDgpID09IDB4MDgpCisJCSAgICB8fCAocGh5X21hc2sgPT0gMCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgYSBjdXJyZW50bHkgYWN0aXZlIChpLmUuIGNvbm5lY3RlZCkgcGh5IGNvbnRhaW5lZCBpbgorICogdGhlIHBvcnQuICBDdXJyZW50bHksIHRoZSBsb3dlc3Qgb3JkZXIgcGh5IHRoYXQgaXMgY29ubmVjdGVkIGlzIHJldHVybmVkLgorICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBTQ0lTX1NEU19QSFkgb2JqZWN0LiBOVUxMIFRoaXMgdmFsdWUgaXMKKyAqIHJldHVybmVkIGlmIHRoZXJlIGFyZSBubyBjdXJyZW50bHkgYWN0aXZlIChpLmUuIGNvbm5lY3RlZCB0byBhIHJlbW90ZSBlbmQKKyAqIHBvaW50KSBwaHlzIGNvbnRhaW5lZCBpbiB0aGUgcG9ydC4gQWxsIG90aGVyIHZhbHVlcyBzcGVjaWZ5IGEgc3RydWN0IHNjaV9waHkKKyAqIG9iamVjdCB0aGF0IGlzIGFjdGl2ZSBpbiB0aGUgcG9ydC4KKyAqLworc3RhdGljIHN0cnVjdCBpc2NpX3BoeSAqc2NpX3BvcnRfZ2V0X2FfY29ubmVjdGVkX3BoeShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwl1MzIgaW5kZXg7CisJc3RydWN0IGlzY2lfcGh5ICppcGh5OworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCS8qIEVuc3VyZSB0aGF0IHRoZSBwaHkgaXMgYm90aCBwYXJ0IG9mIHRoZSBwb3J0IGFuZCBjdXJyZW50bHkKKwkJICogY29ubmVjdGVkIHRvIHRoZSByZW1vdGUgZW5kLXBvaW50LgorCQkgKi8KKwkJaXBoeSA9IGlwb3J0LT5waHlfdGFibGVbaW5kZXhdOworCQlpZiAoaXBoeSAmJiBzY2lfcG9ydF9hY3RpdmVfcGh5KGlwb3J0LCBpcGh5KSkKKwkJCXJldHVybiBpcGh5OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3NldF9waHkoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGFkZCB0aGlzIHBoeSB0byBhIHBvcnQKKwkgKiB0aGF0IG1lYW5zIHRoYXQgdGhlIHBoeSBpcyBub3QgcGFydCBvZiBhIHBvcnQgYW5kIHRoYXQgdGhlIHBvcnQgZG9lcworCSAqIG5vdCBhbHJlYWR5IGhhdmUgYSBwaHkgYXNzaW5nZWQgdG8gdGhlIHBoeSBpbmRleC4KKwkgKi8KKwlpZiAoIWlwb3J0LT5waHlfdGFibGVbaXBoeS0+cGh5X2luZGV4XSAmJgorCSAgICAhcGh5X2dldF9ub25fZHVtbXlfcG9ydChpcGh5KSAmJgorCSAgICBzY2lfcG9ydF9pc192YWxpZF9waHlfYXNzaWdubWVudChpcG9ydCwgaXBoeS0+cGh5X2luZGV4KSkgeworCQkvKiBQaHkgaXMgYmVpbmcgYWRkZWQgaW4gdGhlIHN0b3BwZWQgc3RhdGUgc28gd2UgYXJlIGluIE1QQyBtb2RlCisJCSAqIG1ha2UgbG9naWNhbCBwb3J0IGluZGV4ID0gcGh5c2ljYWwgcG9ydCBpbmRleAorCQkgKi8KKwkJaXBvcnQtPmxvZ2ljYWxfcG9ydF9pbmRleCA9IGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4OworCQlpcG9ydC0+cGh5X3RhYmxlW2lwaHktPnBoeV9pbmRleF0gPSBpcGh5OworCQlzY2lfcGh5X3NldF9wb3J0KGlwaHksIGlwb3J0KTsKKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIFNDSV9GQUlMVVJFOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2NsZWFyX3BoeShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcGh5IGlzIHBhcnQgb2YgdGhpcyBwb3J0ICovCisJaWYgKGlwb3J0LT5waHlfdGFibGVbaXBoeS0+cGh5X2luZGV4XSA9PSBpcGh5ICYmCisJICAgIHBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSkgPT0gaXBvcnQpIHsKKwkJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkJLyogWWVwIGl0IGlzIGFzc2lnbmVkIHRvIHRoaXMgcG9ydCBzbyByZW1vdmUgaXQgKi8KKwkJc2NpX3BoeV9zZXRfcG9ydChpcGh5LCAmaWhvc3QtPnBvcnRzW1NDSV9NQVhfUE9SVFNdKTsKKwkJaXBvcnQtPnBoeV90YWJsZVtpcGh5LT5waHlfaW5kZXhdID0gTlVMTDsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKworCXJldHVybiBTQ0lfRkFJTFVSRTsKK30KKwordm9pZCBzY2lfcG9ydF9nZXRfc2FzX2FkZHJlc3Moc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgKnNhcykKK3sKKwl1MzIgaW5kZXg7CisKKwlzYXMtPmhpZ2ggPSAwOworCXNhcy0+bG93ICA9IDA7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKQorCQlpZiAoaXBvcnQtPnBoeV90YWJsZVtpbmRleF0pCisJCQlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcyhpcG9ydC0+cGh5X3RhYmxlW2luZGV4XSwgc2FzKTsKK30KKwordm9pZCBzY2lfcG9ydF9nZXRfYXR0YWNoZWRfc2FzX2FkZHJlc3Moc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgKnNhcykKK3sKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHk7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBwaHkgaXMgYm90aCBwYXJ0IG9mIHRoZSBwb3J0IGFuZCBjdXJyZW50bHkKKwkgKiBjb25uZWN0ZWQgdG8gdGhlIHJlbW90ZSBlbmQtcG9pbnQuCisJICovCisJaXBoeSA9IHNjaV9wb3J0X2dldF9hX2Nvbm5lY3RlZF9waHkoaXBvcnQpOworCWlmIChpcGh5KSB7CisJCWlmIChpcGh5LT5wcm90b2NvbCAhPSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FUQSkgeworCQkJc2NpX3BoeV9nZXRfYXR0YWNoZWRfc2FzX2FkZHJlc3MoaXBoeSwgc2FzKTsKKwkJfSBlbHNlIHsKKwkJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKGlwaHksIHNhcyk7CisJCQlzYXMtPmxvdyArPSBpcGh5LT5waHlfaW5kZXg7CisJCX0KKwl9IGVsc2UgeworCQlzYXMtPmhpZ2ggPSAwOworCQlzYXMtPmxvdyAgPSAwOworCX0KK30KKworLyoqCisgKiBzY2lfcG9ydF9jb25zdHJ1Y3RfZHVtbXlfcm5jKCkgLSBjcmVhdGUgZHVtbXkgcm5jIGZvciBzaSB3b3JrYXJvdW5kCisgKgorICogQHNjaV9wb3J0OiBsb2dpY2FsIHBvcnQgb24gd2hpY2ggd2UgbmVlZCB0byBjcmVhdGUgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQKKyAqIEBybmk6IHJlbW90ZSBub2RlIGluZGV4IGZvciB0aGlzIHJlbW90ZSBub2RlIGNvbnRleHQuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgY29uc3RydWN0IGEgZHVtbXkgcmVtb3RlIG5vZGUgY29udGV4dCBkYXRhIHN0cnVjdHVyZQorICogVGhpcyBzdHJ1Y3R1cmUgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIGhhcmR3YXJlIHRvIHdvcmsgYXJvdW5kIGEgc2NoZWR1bGVyCisgKiBlcnJvciBpbiB0aGUgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2NvbnN0cnVjdF9kdW1teV9ybmMoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHUxNiBybmkpCit7CisJdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYzsKKworCXJuYyA9ICZpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXItPnJlbW90ZV9ub2RlX2NvbnRleHRfdGFibGVbcm5pXTsKKworCW1lbXNldChybmMsIDAsIHNpemVvZih1bmlvbiBzY3VfcmVtb3RlX25vZGVfY29udGV4dCkpOworCisJcm5jLT5zc3AucmVtb3RlX3Nhc19hZGRyZXNzX2hpID0gMDsKKwlybmMtPnNzcC5yZW1vdGVfc2FzX2FkZHJlc3NfbG8gPSAwOworCisJcm5jLT5zc3AucmVtb3RlX25vZGVfaW5kZXggPSBybmk7CisJcm5jLT5zc3AucmVtb3RlX25vZGVfcG9ydF93aWR0aCA9IDE7CisJcm5jLT5zc3AubG9naWNhbF9wb3J0X2luZGV4ID0gaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXg7CisKKwlybmMtPnNzcC5uZXh1c19sb3NzX3RpbWVyX2VuYWJsZSA9IGZhbHNlOworCXJuYy0+c3NwLmNoZWNrX2JpdCA9IGZhbHNlOworCXJuYy0+c3NwLmlzX3ZhbGlkID0gdHJ1ZTsKKwlybmMtPnNzcC5pc19yZW1vdGVfbm9kZV9jb250ZXh0ID0gdHJ1ZTsKKwlybmMtPnNzcC5mdW5jdGlvbl9udW1iZXIgPSAwOworCXJuYy0+c3NwLmFyYml0cmF0aW9uX3dhaXRfdGltZSA9IDA7Cit9CisKKy8qCisgKiBjb25zdHJ1Y3QgYSBkdW1teSB0YXNrIGNvbnRleHQgZGF0YSBzdHJ1Y3R1cmUuICBUaGlzCisgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIGhhcmR3cmUgdG8gd29yayBhcm91bmQgYSBzY2hlZHVsZXIgZXJyb3IKKyAqIGluIHRoZSBoYXJkd2FyZS4KKyAqLworc3RhdGljIHZvaWQgc2NpX3BvcnRfY29uc3RydWN0X2R1bW15X3Rhc2soc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHUxNiB0YWcpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dDsKKworCXRhc2tfY29udGV4dCA9ICZpaG9zdC0+dGFza19jb250ZXh0X3RhYmxlW0lTQ0lfVEFHX1RDSSh0YWcpXTsKKwltZW1zZXQodGFza19jb250ZXh0LCAwLCBzaXplb2Yoc3RydWN0IHNjdV90YXNrX2NvbnRleHQpKTsKKworCXRhc2tfY29udGV4dC0+aW5pdGlhdG9yX3JlcXVlc3QgPSAxOworCXRhc2tfY29udGV4dC0+Y29ubmVjdGlvbl9yYXRlID0gMTsKKwl0YXNrX2NvbnRleHQtPmxvZ2ljYWxfcG9ydF9pbmRleCA9IGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4OworCXRhc2tfY29udGV4dC0+cHJvdG9jb2xfdHlwZSA9IFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU1NQOworCXRhc2tfY29udGV4dC0+dGFza19pbmRleCA9IElTQ0lfVEFHX1RDSSh0YWcpOworCXRhc2tfY29udGV4dC0+dmFsaWQgPSBTQ1VfVEFTS19DT05URVhUX1ZBTElEOworCXRhc2tfY29udGV4dC0+Y29udGV4dF90eXBlID0gU0NVX1RBU0tfQ09OVEVYVF9UWVBFOworCXRhc2tfY29udGV4dC0+cmVtb3RlX25vZGVfaW5kZXggPSBpcG9ydC0+cmVzZXJ2ZWRfcm5pOworCXRhc2tfY29udGV4dC0+ZG9fbm90X2RtYV9zc3BfZ29vZF9yZXNwb25zZSA9IDE7CisJdGFza19jb250ZXh0LT50YXNrX3BoYXNlID0gMHgwMTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfZGVzdHJveV9kdW1teV9yZXNvdXJjZXMoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpZiAoaXBvcnQtPnJlc2VydmVkX3RhZyAhPSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRykKKwkJaXNjaV9mcmVlX3RhZyhpaG9zdCwgaXBvcnQtPnJlc2VydmVkX3RhZyk7CisKKwlpZiAoaXBvcnQtPnJlc2VydmVkX3JuaSAhPSBTQ1VfRFVNTVlfSU5ERVgpCisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9yZWxlYXNlX3JlbW90ZV9ub2RlX2luZGV4KCZpaG9zdC0+YXZhaWxhYmxlX3JlbW90ZV9ub2RlcywKKwkJCQkJCQkJICAgICAxLCBpcG9ydC0+cmVzZXJ2ZWRfcm5pKTsKKworCWlwb3J0LT5yZXNlcnZlZF9ybmkgPSBTQ1VfRFVNTVlfSU5ERVg7CisJaXBvcnQtPnJlc2VydmVkX3RhZyA9IFNDSV9DT05UUk9MTEVSX0lOVkFMSURfSU9fVEFHOworfQorCit2b2lkIHNjaV9wb3J0X3NldHVwX3RyYW5zcG9ydHMoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHUzMiBkZXZpY2VfaWQpCit7CisJdTggaW5kZXg7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ0lfTUFYX1BIWVM7IGluZGV4KyspIHsKKwkJaWYgKGlwb3J0LT5hY3RpdmVfcGh5X21hc2sgJiAoMSA8PCBpbmRleCkpCisJCQlzY2lfcGh5X3NldHVwX3RyYW5zcG9ydChpcG9ydC0+cGh5X3RhYmxlW2luZGV4XSwgZGV2aWNlX2lkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2FjdGl2YXRlX3BoeShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwgc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJCSAgYm9vbCBkb19ub3RpZnlfdXNlcikKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCWlmIChpcGh5LT5wcm90b2NvbCAhPSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FUQSkKKwkJc2NpX3BoeV9yZXN1bWUoaXBoeSk7CisKKwlpcG9ydC0+YWN0aXZlX3BoeV9tYXNrIHw9IDEgPDwgaXBoeS0+cGh5X2luZGV4OworCisJc2NpX2NvbnRyb2xsZXJfY2xlYXJfaW52YWxpZF9waHkoaWhvc3QsIGlwaHkpOworCisJaWYgKGRvX25vdGlmeV91c2VyID09IHRydWUpCisJCWlzY2lfcG9ydF9saW5rX3VwKGlob3N0LCBpcG9ydCwgaXBoeSk7Cit9CisKK3ZvaWQgc2NpX3BvcnRfZGVhY3RpdmF0ZV9waHkoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSwKKwkJCSAgICAgYm9vbCBkb19ub3RpZnlfdXNlcikKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCWlwb3J0LT5hY3RpdmVfcGh5X21hc2sgJj0gfigxIDw8IGlwaHktPnBoeV9pbmRleCk7CisKKwlpcGh5LT5tYXhfbmVnb3RpYXRlZF9zcGVlZCA9IFNBU19MSU5LX1JBVEVfVU5LTk9XTjsKKworCS8qIFJlLWFzc2lnbiB0aGUgcGh5IGJhY2sgdG8gdGhlIExQIGFzIGlmIGl0IHdlcmUgYSBuYXJyb3cgcG9ydCAqLworCXdyaXRlbChpcGh5LT5waHlfaW5kZXgsCisJCSZpcG9ydC0+cG9ydF9wZV9jb25maWd1cmF0aW9uX3JlZ2lzdGVyW2lwaHktPnBoeV9pbmRleF0pOworCisJaWYgKGRvX25vdGlmeV91c2VyID09IHRydWUpCisJCWlzY2lfcG9ydF9saW5rX2Rvd24oaWhvc3QsIGlwaHksIGlwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfaW52YWxpZF9saW5rX3VwKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVheSByZXBvcnRlZCB0aGlzIGxpbmsgYXMgYmFkIGFuZCBpZgorCSAqIG5vdCBnbyBhaGVhZCBhbmQgdGVsbCB0aGUgU0NJX1VTRVIgdGhhdCB3ZSBoYXZlIGRpc2NvdmVyZWQgYW4KKwkgKiBpbnZhbGlkIGxpbmsuCisJICovCisJaWYgKChpaG9zdC0+aW52YWxpZF9waHlfbWFzayAmICgxIDw8IGlwaHktPnBoeV9pbmRleCkpID09IDApIHsKKwkJaWhvc3QtPmludmFsaWRfcGh5X21hc2sgfD0gMSA8PCBpcGh5LT5waHlfaW5kZXg7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LCAiSW52YWxpZCBsaW5rIHVwIVxuIik7CisJfQorfQorCitzdGF0aWMgYm9vbCBpc19wb3J0X3JlYWR5X3N0YXRlKGVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QT1JUX1JFQURZOgorCWNhc2UgU0NJX1BPUlRfU1VCX1dBSVRJTkc6CisJY2FzZSBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUw6CisJY2FzZSBTQ0lfUE9SVF9TVUJfQ09ORklHVVJJTkc6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKy8qIGZsYWcgZHVtbXkgcm5jIGhhbmxpbmcgd2hlbiBleGl0aW5nIGEgcmVhZHkgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIHBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2Uoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJICAgICAgZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGUpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlwb3J0LT5zbTsKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBvbGRfc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKworCWlmIChpc19wb3J0X3JlYWR5X3N0YXRlKG9sZF9zdGF0ZSkgJiYgIWlzX3BvcnRfcmVhZHlfc3RhdGUoc3RhdGUpKQorCQlpcG9ydC0+cmVhZHlfZXhpdCA9IHRydWU7CisKKwlzY2lfY2hhbmdlX3N0YXRlKHNtLCBzdGF0ZSk7CisJaXBvcnQtPnJlYWR5X2V4aXQgPSBmYWxzZTsKK30KKworLyoqCisgKiBzY2lfcG9ydF9nZW5lcmFsX2xpbmtfdXBfaGFuZGxlciAtIHBoeSBjYW4gYmUgYXNzaWduZWQgdG8gcG9ydD8KKyAqIEBzY2lfcG9ydDogc2NpX3BvcnQgb2JqZWN0IGZvciB3aGljaCBoYXMgYSBwaHkgdGhhdCBoYXMgZ29uZSBsaW5rIHVwLgorICogQHNjaV9waHk6IFRoaXMgaXMgdGhlIHN0cnVjdCBpc2NpX3BoeSBvYmplY3QgdGhhdCBoYXMgZ29uZSBsaW5rIHVwLgorICogQGRvX25vdGlmeV91c2VyOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hldGhlciB0byBpbmZvcm0gdGhlIHVzZXIgKHZpYQorICogICAgc2NpX3BvcnRfbGlua191cCgpKSBhcyB0byB0aGUgZmFjdCB0aGF0IGEgbmV3IHBoeSBhcyBiZWNvbWUgcmVhZHkuCisgKgorICogRGV0ZXJtaW5lIGlmIHRoaXMgcGh5IGNhbiBiZSBhc3NpZ25lZCB0byB0aGlzCisgKiBwb3J0IC4gSWYgdGhlIHBoeSBpcyBub3QgYSB2YWxpZCBQSFkgZm9yCisgKiB0aGlzIHBvcnQgdGhlbiB0aGUgZnVuY3Rpb24gd2lsbCBub3RpZnkgdGhlIHVzZXIuIEEgUEhZIGNhbiBvbmx5IGJlCisgKiBwYXJ0IG9mIGEgcG9ydCBpZiBpdCdzIGF0dGFjaGVkIFNBUyBBRERSRVNTIGlzIHRoZSBzYW1lIGFzIGFsbCBvdGhlciBQSFlzIGluCisgKiB0aGUgc2FtZSBwb3J0LiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2dlbmVyYWxfbGlua191cF9oYW5kbGVyKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCQkJICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJCQkJCQkgIGJvb2wgZG9fbm90aWZ5X3VzZXIpCit7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBwb3J0X3Nhc19hZGRyZXNzOworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcGh5X3Nhc19hZGRyZXNzOworCisJc2NpX3BvcnRfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKGlwb3J0LCAmcG9ydF9zYXNfYWRkcmVzcyk7CisJc2NpX3BoeV9nZXRfYXR0YWNoZWRfc2FzX2FkZHJlc3MoaXBoeSwgJnBoeV9zYXNfYWRkcmVzcyk7CisKKwkvKiBJZiB0aGUgU0FTIGFkZHJlc3Mgb2YgdGhlIG5ldyBwaHkgbWF0Y2hlcyB0aGUgU0FTIGFkZHJlc3Mgb2YKKwkgKiBvdGhlciBwaHlzIGluIHRoZSBwb3J0IE9SIHRoaXMgaXMgdGhlIGZpcnN0IHBoeSBpbiB0aGUgcG9ydCwKKwkgKiB0aGVuIGFjdGl2YXRlIHRoZSBwaHkgYW5kIGFsbG93IGl0IHRvIGJlIHVzZWQgZm9yIG9wZXJhdGlvbnMKKwkgKiBpbiB0aGlzIHBvcnQuCisJICovCisJaWYgKChwaHlfc2FzX2FkZHJlc3MuaGlnaCA9PSBwb3J0X3Nhc19hZGRyZXNzLmhpZ2ggJiYKKwkgICAgIHBoeV9zYXNfYWRkcmVzcy5sb3cgID09IHBvcnRfc2FzX2FkZHJlc3MubG93KSB8fAorCSAgICBpcG9ydC0+YWN0aXZlX3BoeV9tYXNrID09IDApIHsKKwkJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlwb3J0LT5zbTsKKworCQlzY2lfcG9ydF9hY3RpdmF0ZV9waHkoaXBvcnQsIGlwaHksIGRvX25vdGlmeV91c2VyKTsKKwkJaWYgKHNtLT5jdXJyZW50X3N0YXRlX2lkID09IFNDSV9QT1JUX1JFU0VUVElORykKKwkJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsIFNDSV9QT1JUX1JFQURZKTsKKwl9IGVsc2UKKwkJc2NpX3BvcnRfaW52YWxpZF9saW5rX3VwKGlwb3J0LCBpcGh5KTsKK30KKworCisKKy8qKgorICogVGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSBpZiB0aGUgcG9ydCBvbmx5IGhhcyBhIHNpbmdsZSBwaHkgb2JqZWN0IGFzc2lnbmVkLgorICogICAgIElmIHRoZXJlIGFyZSBubyBwaHlzIG9yIG1vcmUgdGhhbiBvbmUgcGh5IHRoZW4gdGhlIG1ldGhvZCB3aWxsIHJldHVybgorICogICAgdHJ1ZS4KKyAqIEBzY2lfcG9ydDogVGhlIHBvcnQgZm9yIHdoaWNoIHRoZSB3aWRlIHBvcnQgY29uZGl0aW9uIGlzIHRvIGJlIGNoZWNrZWQuCisgKgorICogYm9vbCB0cnVlIElzIHJldHVybmVkIGlmIHRoaXMgaXMgYSB3aWRlIHBvcnRlZCBwb3J0LiBmYWxzZSBJcyByZXR1cm5lZCBpZgorICogdGhpcyBpcyBhIG5hcnJvdyBwb3J0LgorICovCitzdGF0aWMgYm9vbCBzY2lfcG9ydF9pc193aWRlKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXUzMiBpbmRleDsKKwl1MzIgcGh5X2NvdW50ID0gMDsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQlpZiAoaXBvcnQtPnBoeV90YWJsZVtpbmRleF0gIT0gTlVMTCkgeworCQkJcGh5X2NvdW50Kys7CisJCX0KKwl9CisKKwlyZXR1cm4gcGh5X2NvdW50ICE9IDE7Cit9CisKKy8qKgorICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBQSFkgb2JqZWN0IHdoZW4gdGhlIGxpbmsgaXMgZGV0ZWN0ZWQuIGlmIHRoZQorICogICAgcG9ydCB3YW50cyB0aGUgUEhZIHRvIGNvbnRpbnVlIG9uIHRvIHRoZSBsaW5rIHVwIHN0YXRlIHRoZW4gdGhlIHBvcnQKKyAqICAgIGxheWVyIG11c3QgcmV0dXJuIHRydWUuICBJZiB0aGUgcG9ydCBvYmplY3QgcmV0dXJucyBmYWxzZSB0aGUgcGh5IG9iamVjdAorICogICAgbXVzdCBoYWx0IGl0cyBhdHRlbXB0IHRvIGdvIGxpbmsgdXAuCisgKiBAc2NpX3BvcnQ6IFRoZSBwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGh5IG9iamVjdC4KKyAqIEBzY2lfcGh5OiBUaGUgcGh5IG9iamVjdCB0aGF0IGlzIHRyeWluZyB0byBnbyBsaW5rIHVwLgorICoKKyAqIHRydWUgaWYgdGhlIHBoeSBvYmplY3QgY2FuIGNvbnRpbnVlIHRvIHRoZSBsaW5rIHVwIGNvbmRpdGlvbi4gdHJ1ZSBJcworICogcmV0dXJuZWQgaWYgdGhpcyBwaHkgY2FuIGNvbnRpbnVlIHRvIHRoZSByZWFkeSBzdGF0ZS4gZmFsc2UgSXMgcmV0dXJuZWQgaWYKKyAqIGNhbiBub3QgY29udGludWUgb24gdG8gdGhlIHJlYWR5IHN0YXRlLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBpbiBwbGFjZSBmb3IKKyAqIHdpZGUgcG9ydHMgYW5kIGRpcmVjdCBhdHRhY2hlZCBwaHlzLiAgU2luY2UgdGhlcmUgYXJlIG5vIHdpZGUgcG9ydGVkIFNBVEEKKyAqIGRldmljZXMgdGhpcyBjb3VsZCBiZWNvbWUgYW4gaW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24uCisgKi8KK2Jvb2wgc2NpX3BvcnRfbGlua19kZXRlY3RlZCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJaWYgKChpcG9ydC0+bG9naWNhbF9wb3J0X2luZGV4ICE9IFNDSUNfU0RTX0RVTU1ZX1BPUlQpICYmCisJICAgIChpcGh5LT5wcm90b2NvbCA9PSBTQ0lDX1NEU19QSFlfUFJPVE9DT0xfU0FUQSkgJiYKKwkgICAgc2NpX3BvcnRfaXNfd2lkZShpcG9ydCkpIHsKKwkJc2NpX3BvcnRfaW52YWxpZF9saW5rX3VwKGlwb3J0LCBpcGh5KTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNjaV90aW1lciAqdG1yID0gKHN0cnVjdCBzY2lfdGltZXIgKilkYXRhOworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHRtciwgdHlwZW9mKCppcG9ydCksIHRpbWVyKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBjdXJyZW50X3N0YXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmICh0bXItPmNhbmNlbCkKKwkJZ290byBkb25lOworCisJY3VycmVudF9zdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJaWYgKGN1cnJlbnRfc3RhdGUgPT0gU0NJX1BPUlRfUkVTRVRUSU5HKSB7CisJCS8qIGlmIHRoZSBwb3J0IGlzIHN0aWxsIGluIHRoZSByZXNldHRpbmcgc3RhdGUgdGhlbiB0aGUgdGltZW91dAorCQkgKiBmaXJlZCBiZWZvcmUgdGhlIHJlc2V0IGNvbXBsZXRlZC4KKwkJICovCisJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsIFNDSV9QT1JUX0ZBSUxFRCk7CisJfSBlbHNlIGlmIChjdXJyZW50X3N0YXRlID09IFNDSV9QT1JUX1NUT1BQRUQpIHsKKwkJLyogaWYgdGhlIHBvcnQgaXMgc3RvcHBlZCB0aGVuIHRoZSBzdGFydCByZXF1ZXN0IGZhaWxlZCBJbiB0aGlzCisJCSAqIGNhc2Ugc3RheSBpbiB0aGUgc3RvcHBlZCBzdGF0ZS4KKwkJICovCisJCWRldl9lcnIoc2NpcG9ydF90b19kZXYoaXBvcnQpLAorCQkJIiVzOiBTQ0lDIFBvcnQgMHglcCBmYWlsZWQgdG8gc3RvcCBiZWZvcmUgdGllbW91dC5cbiIsCisJCQlfX2Z1bmNfXywKKwkJCWlwb3J0KTsKKwl9IGVsc2UgaWYgKGN1cnJlbnRfc3RhdGUgPT0gU0NJX1BPUlRfU1RPUFBJTkcpIHsKKwkJLyogaWYgdGhlIHBvcnQgaXMgc3RpbGwgc3RvcHBpbmcgdGhlbiB0aGUgc3RvcCBoYXMgbm90IGNvbXBsZXRlZCAqLworCQlpc2NpX3BvcnRfc3RvcF9jb21wbGV0ZShpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXIsCisJCQkJCWlwb3J0LAorCQkJCQlTQ0lfRkFJTFVSRV9USU1FT1VUKTsKKwl9IGVsc2UgeworCQkvKiBUaGUgcG9ydCBpcyBpbiB0aGUgcmVhZHkgc3RhdGUgYW5kIHdlIGhhdmUgYSB0aW1lcgorCQkgKiByZXBvcnRpbmcgYSB0aW1lb3V0IHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisJCSAqLworCQlkZXZfZXJyKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSIlczogU0NJQyBQb3J0IDB4JXAgaXMgcHJvY2Vzc2luZyBhIHRpbWVvdXQgb3BlcmF0aW9uICIKKwkJCSJpbiBzdGF0ZSAlZC5cbiIsIF9fZnVuY19fLCBpcG9ydCwgY3VycmVudF9zdGF0ZSk7CisJfQorCitkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBoYXJkd2FyZXMgVklJVCBlbnRyeSBmb3IgdGhpcyBwb3J0LgorICoKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3VwZGF0ZV92aWl0X2VudHJ5KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3Mgc2FzX2FkZHJlc3M7CisKKwlzY2lfcG9ydF9nZXRfc2FzX2FkZHJlc3MoaXBvcnQsICZzYXNfYWRkcmVzcyk7CisKKwl3cml0ZWwoc2FzX2FkZHJlc3MuaGlnaCwKKwkJJmlwb3J0LT52aWl0X3JlZ2lzdGVycy0+aW5pdGlhdG9yX3Nhc19hZGRyZXNzX2hpKTsKKwl3cml0ZWwoc2FzX2FkZHJlc3MubG93LAorCQkmaXBvcnQtPnZpaXRfcmVnaXN0ZXJzLT5pbml0aWF0b3Jfc2FzX2FkZHJlc3NfbG8pOworCisJLyogVGhpcyB2YWx1ZSBnZXQgY2xlYXJlZCBqdXN0IGluIGNhc2UgaXRzIG5vdCBhbHJlYWR5IGNsZWFyZWQgKi8KKwl3cml0ZWwoMCwgJmlwb3J0LT52aWl0X3JlZ2lzdGVycy0+cmVzZXJ2ZWQpOworCisJLyogV2UgYXJlIHJlcXVpcmVkIHRvIHVwZGF0ZSB0aGUgc3RhdHVzIHJlZ2lzdGVyIGxhc3QgKi8KKwl3cml0ZWwoU0NVX1ZJSVRfRU5UUllfSURfVklJVCB8CisJICAgICAgIFNDVV9WSUlUX0lQUFRfSU5JVElBVE9SIHwKKwkgICAgICAgKCgxIDw8IGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4KSA8PCBTQ1VfVklJVF9FTlRSWV9MUFZJRV9TSElGVCkgfAorCSAgICAgICBTQ1VfVklJVF9TVEFUVVNfQUxMX1ZBTElELAorCSAgICAgICAmaXBvcnQtPnZpaXRfcmVnaXN0ZXJzLT5zdGF0dXMpOworfQorCitlbnVtIHNhc19saW5rcmF0ZSBzY2lfcG9ydF9nZXRfbWF4X2FsbG93ZWRfc3BlZWQoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJdTE2IGluZGV4OworCXN0cnVjdCBpc2NpX3BoeSAqaXBoeTsKKwllbnVtIHNhc19saW5rcmF0ZSBtYXhfYWxsb3dlZF9zcGVlZCA9IFNBU19MSU5LX1JBVEVfNl8wX0dCUFM7CisKKwkvKgorCSAqIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIHBoeXMgaW4gdGhpcyBwb3J0IGFuZCBmaW5kIHRoZSBwaHkgd2l0aCB0aGUKKwkgKiBsb3dlc3QgbWF4aW11bSBsaW5rIHJhdGUuICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCWlwaHkgPSBpcG9ydC0+cGh5X3RhYmxlW2luZGV4XTsKKwkJaWYgKGlwaHkgJiYgc2NpX3BvcnRfYWN0aXZlX3BoeShpcG9ydCwgaXBoeSkgJiYKKwkJICAgIGlwaHktPm1heF9uZWdvdGlhdGVkX3NwZWVkIDwgbWF4X2FsbG93ZWRfc3BlZWQpCisJCQltYXhfYWxsb3dlZF9zcGVlZCA9IGlwaHktPm1heF9uZWdvdGlhdGVkX3NwZWVkOworCX0KKworCXJldHVybiBtYXhfYWxsb3dlZF9zcGVlZDsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfc3VzcGVuZF9wb3J0X3Rhc2tfc2NoZWR1bGVyKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXUzMiBwdHNfY29udHJvbF92YWx1ZTsKKworCXB0c19jb250cm9sX3ZhbHVlID0gcmVhZGwoJmlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycy0+Y29udHJvbCk7CisJcHRzX2NvbnRyb2xfdmFsdWUgfD0gU0NVX1BUU3hDUl9HRU5fQklUKFNVU1BFTkQpOworCXdyaXRlbChwdHNfY29udHJvbF92YWx1ZSwgJmlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycy0+Y29udHJvbCk7Cit9CisKKy8qKgorICogc2NpX3BvcnRfcG9zdF9kdW1teV9yZXF1ZXN0KCkgLSBwb3N0IGR1bW15L3dvcmthcm91bmQgcmVxdWVzdAorICogQHNjaV9wb3J0OiBwb3J0IHRvIHBvc3QgdGFzaworICoKKyAqIFByZXZlbnQgdGhlIGhhcmR3YXJlIHNjaGVkdWxlciBmcm9tIHBvc3RpbmcgbmV3IHJlcXVlc3RzIHRvIHRoZSBmcm9udAorICogb2YgdGhlIHNjaGVkdWxlciBxdWV1ZSBjYXVzaW5nIGEgc3RhcnZhdGlvbiBwcm9ibGVtIGZvciBjdXJyZW50bHkKKyAqIG9uZ29pbmcgcmVxdWVzdHMuCisgKgorICovCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9wb3N0X2R1bW15X3JlcXVlc3Qoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJdTE2IHRhZyA9IGlwb3J0LT5yZXNlcnZlZF90YWc7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRjOworCXUzMiBjb21tYW5kOworCisJdGMgPSAmaWhvc3QtPnRhc2tfY29udGV4dF90YWJsZVtJU0NJX1RBR19UQ0kodGFnKV07CisJdGMtPmFib3J0ID0gMDsKKworCWNvbW1hbmQgPSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9QT1NUX1RDIHwKKwkJICBpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCB8CisJCSAgSVNDSV9UQUdfVENJKHRhZyk7CisKKwlzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3QoaWhvc3QsIGNvbW1hbmQpOworfQorCisvKioKKyAqIFRoaXMgcm91dGluZSB3aWxsIGFib3J0IHRoZSBkdW1teSByZXF1ZXN0LiAgVGhpcyB3aWxsIGFsb3cgdGhlIGhhcmR3YXJlIHRvCisgKiBwb3dlciBkb3duIHBhcnRzIG9mIHRoZSBzaWxpY29uIHRvIHNhdmUgcG93ZXIuCisgKgorICogQHNjaV9wb3J0OiBUaGUgcG9ydCBvbiB3aGljaCB0aGUgdGFzayBtdXN0IGJlIGFib3J0ZWQuCisgKgorICovCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9hYm9ydF9kdW1teV9yZXF1ZXN0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCXUxNiB0YWcgPSBpcG9ydC0+cmVzZXJ2ZWRfdGFnOworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YzsKKwl1MzIgY29tbWFuZDsKKworCXRjID0gJmlob3N0LT50YXNrX2NvbnRleHRfdGFibGVbSVNDSV9UQUdfVENJKHRhZyldOworCXRjLT5hYm9ydCA9IDE7CisKKwljb21tYW5kID0gU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1BPU1RfVENfQUJPUlQgfAorCQkgIGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4IDw8IFNDVV9DT05URVhUX0NPTU1BTkRfTE9HSUNBTF9QT1JUX1NISUZUIHwKKwkJICBJU0NJX1RBR19UQ0kodGFnKTsKKworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgY29tbWFuZCk7Cit9CisKKy8qKgorICoKKyAqIEBzY2lfcG9ydDogVGhpcyBpcyB0aGUgc3RydWN0IGlzY2lfcG9ydCBvYmplY3QgdG8gcmVzdW1lLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgcmVzdW1lIHRoZSBwb3J0IHRhc2sgc2NoZWR1bGVyIGZvciB0aGlzIHBvcnQgb2JqZWN0LiBub25lCisgKi8KK3N0YXRpYyB2b2lkCitzY2lfcG9ydF9yZXN1bWVfcG9ydF90YXNrX3NjaGVkdWxlcihzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwl1MzIgcHRzX2NvbnRyb2xfdmFsdWU7CisKKwlwdHNfY29udHJvbF92YWx1ZSA9IHJlYWRsKCZpcG9ydC0+cG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMtPmNvbnRyb2wpOworCXB0c19jb250cm9sX3ZhbHVlICY9IH5TQ1VfUFRTeENSX0dFTl9CSVQoU1VTUEVORCk7CisJd3JpdGVsKHB0c19jb250cm9sX3ZhbHVlLCAmaXBvcnQtPnBvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzLT5jb250cm9sKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfd2FpdGluZ19lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisKKwlzY2lfcG9ydF9zdXNwZW5kX3BvcnRfdGFza19zY2hlZHVsZXIoaXBvcnQpOworCisJaXBvcnQtPm5vdF9yZWFkeV9yZWFzb24gPSBTQ0lDX1BPUlRfTk9UX1JFQURZX05PX0FDVElWRV9QSFlTOworCisJaWYgKGlwb3J0LT5hY3RpdmVfcGh5X21hc2sgIT0gMCkgeworCQkvKiBBdCBsZWFzdCBvbmUgb2YgdGhlIHBoeXMgb24gdGhlIHBvcnQgaXMgcmVhZHkgKi8KKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJICBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUwpOworCX0KK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfb3BlcmF0aW9uYWxfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcG9ydCksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCWlzY2lfcG9ydF9yZWFkeShpaG9zdCwgaXBvcnQpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCWlmIChpcG9ydC0+cGh5X3RhYmxlW2luZGV4XSkgeworCQkJd3JpdGVsKGlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4LAorCQkJCSZpcG9ydC0+cG9ydF9wZV9jb25maWd1cmF0aW9uX3JlZ2lzdGVyWworCQkJCQlpcG9ydC0+cGh5X3RhYmxlW2luZGV4XS0+cGh5X2luZGV4XSk7CisJCX0KKwl9CisKKwlzY2lfcG9ydF91cGRhdGVfdmlpdF9lbnRyeShpcG9ydCk7CisKKwlzY2lfcG9ydF9yZXN1bWVfcG9ydF90YXNrX3NjaGVkdWxlcihpcG9ydCk7CisKKwkvKgorCSAqIFBvc3QgdGhlIGR1bW15IHRhc2sgZm9yIHRoZSBwb3J0IHNvIHRoZSBoYXJkd2FyZSBjYW4gc2NoZWR1bGUKKwkgKiBpbyBjb3JyZWN0bHkKKwkgKi8KKwlzY2lfcG9ydF9wb3N0X2R1bW15X3JlcXVlc3QoaXBvcnQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9pbnZhbGlkYXRlX2R1bW15X3JlbW90ZV9ub2RlKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCXU4IHBoeXNfaW5kZXggPSBpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleDsKKwl1bmlvbiBzY3VfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jOworCXUxNiBybmkgPSBpcG9ydC0+cmVzZXJ2ZWRfcm5pOworCXUzMiBjb21tYW5kOworCisJcm5jID0gJmlob3N0LT5yZW1vdGVfbm9kZV9jb250ZXh0X3RhYmxlW3JuaV07CisKKwlybmMtPnNzcC5pc192YWxpZCA9IGZhbHNlOworCisJLyogZW5zdXJlIHRoZSBwcmVjZWRpbmcgdGMgYWJvcnQgcmVxdWVzdCBoYXMgcmVhY2hlZCB0aGUKKwkgKiBjb250cm9sbGVyIGFuZCBnaXZlIGl0IGFtcGxlIHRpbWUgdG8gYWN0IGJlZm9yZSBwb3N0aW5nIHRoZSBybmMKKwkgKiBpbnZhbGlkYXRlCisJICovCisJcmVhZGwoJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfc3RhdHVzKTsgLyogZmx1c2ggKi8KKwl1ZGVsYXkoMTApOworCisJY29tbWFuZCA9IFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfSU5WQUxJREFURSB8CisJCSAgcGh5c19pbmRleCA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCB8IHJuaTsKKworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgY29tbWFuZCk7Cit9CisKKy8qKgorICoKKyAqIEBvYmplY3Q6IFRoaXMgaXMgdGhlIG9iamVjdCB3aGljaCBpcyBjYXN0IHRvIGEgc3RydWN0IGlzY2lfcG9ydCBvYmplY3QuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBwZXJmb3JtIHRoZSBhY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBzdHJ1Y3QgaXNjaV9wb3J0IG9uCisgKiBleGl0aW5nIHRoZSBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUwuIFRoaXMgZnVuY3Rpb24gcmVwb3J0cworICogdGhlIHBvcnQgbm90IHJlYWR5IGFuZCBzdXNwZW5kcyB0aGUgcG9ydCB0YXNrIHNjaGVkdWxlci4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9yZWFkeV9zdWJzdGF0ZV9vcGVyYXRpb25hbF9leGl0KHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcG9ydCksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCS8qCisJICogS2lsbCB0aGUgZHVtbXkgdGFzayBmb3IgdGhpcyBwb3J0IGlmIGl0IGhhcyBub3QgeWV0IHBvc3RlZAorCSAqIHRoZSBoYXJkd2FyZSB3aWxsIHRyZWF0IHRoaXMgYXMgYSBOT1AgYW5kIGp1c3QgcmV0dXJuIGFib3J0CisJICogY29tcGxldGUuCisJICovCisJc2NpX3BvcnRfYWJvcnRfZHVtbXlfcmVxdWVzdChpcG9ydCk7CisKKwlpc2NpX3BvcnRfbm90X3JlYWR5KGlob3N0LCBpcG9ydCk7CisKKwlpZiAoaXBvcnQtPnJlYWR5X2V4aXQpCisJCXNjaV9wb3J0X2ludmFsaWRhdGVfZHVtbXlfcmVtb3RlX25vZGUoaXBvcnQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9yZWFkeV9zdWJzdGF0ZV9jb25maWd1cmluZ19lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpZiAoaXBvcnQtPmFjdGl2ZV9waHlfbWFzayA9PSAwKSB7CisJCWlzY2lfcG9ydF9ub3RfcmVhZHkoaWhvc3QsIGlwb3J0KTsKKworCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LAorCQkJCQkgIFNDSV9QT1JUX1NVQl9XQUlUSU5HKTsKKwl9IGVsc2UgaWYgKGlwb3J0LT5zdGFydGVkX3JlcXVlc3RfY291bnQgPT0gMCkKKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJICBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUwpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9yZWFkeV9zdWJzdGF0ZV9jb25maWd1cmluZ19leGl0KHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcG9ydCksIHNtKTsKKworCXNjaV9wb3J0X3N1c3BlbmRfcG9ydF90YXNrX3NjaGVkdWxlcihpcG9ydCk7CisJaWYgKGlwb3J0LT5yZWFkeV9leGl0KQorCQlzY2lfcG9ydF9pbnZhbGlkYXRlX2R1bW15X3JlbW90ZV9ub2RlKGlwb3J0KTsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3N0YXJ0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZTsKKwl1MzIgcGh5X21hc2s7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCWlmIChzdGF0ZSAhPSBTQ0lfUE9SVF9TVE9QUEVEKSB7CisJCWRldl93YXJuKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJaWYgKGlwb3J0LT5hc3NpZ25lZF9kZXZpY2VfY291bnQgPiAwKSB7CisJCS8qIFRPRE8gVGhpcyBpcyBhIHN0YXJ0IGZhaWx1cmUgb3BlcmF0aW9uIGJlY2F1c2UKKwkJICogdGhlcmUgYXJlIHN0aWxsIGRldmljZXMgYXNzaWduZWQgdG8gdGhpcyBwb3J0LgorCQkgKiBUaGVyZSBtdXN0IGJlIG5vIGRldmljZXMgYXNzaWduZWQgdG8gYSBwb3J0IG9uIGEKKwkJICogc3RhcnQgb3BlcmF0aW9uLgorCQkgKi8KKwkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTjsKKwl9CisKKwlpZiAoaXBvcnQtPnJlc2VydmVkX3JuaSA9PSBTQ1VfRFVNTVlfSU5ERVgpIHsKKwkJdTE2IHJuaSA9IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9hbGxvY2F0ZV9yZW1vdGVfbm9kZSgKKwkJCQkmaWhvc3QtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXMsIDEpOworCisJCWlmIChybmkgIT0gU0NVX0RVTU1ZX0lOREVYKQorCQkJc2NpX3BvcnRfY29uc3RydWN0X2R1bW15X3JuYyhpcG9ydCwgcm5pKTsKKwkJZWxzZQorCQkJc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU5TVUZGSUNJRU5UX1JFU09VUkNFUzsKKwkJaXBvcnQtPnJlc2VydmVkX3JuaSA9IHJuaTsKKwl9CisKKwlpZiAoaXBvcnQtPnJlc2VydmVkX3RhZyA9PSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRykgeworCQl1MTYgdGFnOworCisJCXRhZyA9IGlzY2lfYWxsb2NfdGFnKGlob3N0KTsKKwkJaWYgKHRhZyA9PSBTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRykKKwkJCXN0YXR1cyA9IFNDSV9GQUlMVVJFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVM7CisJCWVsc2UKKwkJCXNjaV9wb3J0X2NvbnN0cnVjdF9kdW1teV90YXNrKGlwb3J0LCB0YWcpOworCQlpcG9ydC0+cmVzZXJ2ZWRfdGFnID0gdGFnOworCX0KKworCWlmIChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpIHsKKwkJcGh5X21hc2sgPSBzY2lfcG9ydF9nZXRfcGh5cyhpcG9ydCk7CisKKwkJLyoKKwkJICogVGhlcmUgYXJlIG9uZSBvciBtb3JlIHBoeXMgYXNzaWduZWQgdG8gdGhpcyBwb3J0LiAgTWFrZSBzdXJlCisJCSAqIHRoZSBwb3J0J3MgcGh5IG1hc2sgaXMgaW4gZmFjdCBsZWdhbCBhbmQgc3VwcG9ydGVkIGJ5IHRoZQorCQkgKiBzaWxpY29uLgorCQkgKi8KKwkJaWYgKHNjaV9wb3J0X2lzX3BoeV9tYXNrX3ZhbGlkKGlwb3J0LCBwaHlfbWFzaykgPT0gdHJ1ZSkgeworCQkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJCSAgU0NJX1BPUlRfUkVBRFkpOworCisJCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJCX0KKwkJc3RhdHVzID0gU0NJX0ZBSUxVUkU7CisJfQorCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJc2NpX3BvcnRfZGVzdHJveV9kdW1teV9yZXNvdXJjZXMoaXBvcnQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3N0b3Aoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QT1JUX1NUT1BQRUQ6CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QT1JUX1NVQl9XQUlUSU5HOgorCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCWNhc2UgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HOgorCWNhc2UgU0NJX1BPUlRfUkVTRVRUSU5HOgorCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LAorCQkJCQkgIFNDSV9QT1JUX1NUT1BQSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2hhcmRfcmVzZXQoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsIHUzMiB0aW1lb3V0KQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfRkFJTFVSRV9JTlZBTElEX1BIWTsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBOVUxMOworCWVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlOworCXUzMiBwaHlfaW5kZXg7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCWlmIChzdGF0ZSAhPSBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUwpIHsKKwkJZGV2X3dhcm4oc2NpcG9ydF90b19kZXYoaXBvcnQpLAorCQkJICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwkvKiBTZWxlY3QgYSBwaHkgb24gd2hpY2ggd2UgY2FuIHNlbmQgdGhlIGhhcmQgcmVzZXQgcmVxdWVzdC4gKi8KKwlmb3IgKHBoeV9pbmRleCA9IDA7IHBoeV9pbmRleCA8IFNDSV9NQVhfUEhZUyAmJiAhaXBoeTsgcGh5X2luZGV4KyspIHsKKwkJaXBoeSA9IGlwb3J0LT5waHlfdGFibGVbcGh5X2luZGV4XTsKKwkJaWYgKGlwaHkgJiYgIXNjaV9wb3J0X2FjdGl2ZV9waHkoaXBvcnQsIGlwaHkpKSB7CisJCQkvKgorCQkJICogV2UgZm91bmQgYSBwaHkgYnV0IGl0IGlzIG5vdCByZWFkeSBzZWxlY3QKKwkJCSAqIGRpZmZlcmVudCBwaHkKKwkJCSAqLworCQkJaXBoeSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSBoYXZlIGEgcGh5IHRoZW4gZ28gYWhlYWQgYW5kIHN0YXJ0IHRoZSByZXNldCBwcm9jZWR1cmUgKi8KKwlpZiAoIWlwaHkpCisJCXJldHVybiBzdGF0dXM7CisJc3RhdHVzID0gc2NpX3BoeV9yZXNldChpcGh5KTsKKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlzY2lfbW9kX3RpbWVyKCZpcG9ydC0+dGltZXIsIHRpbWVvdXQpOworCWlwb3J0LT5ub3RfcmVhZHlfcmVhc29uID0gU0NJQ19QT1JUX05PVF9SRUFEWV9IQVJEX1JFU0VUX1JFUVVFU1RFRDsKKworCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsIFNDSV9QT1JUX1JFU0VUVElORyk7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKioKKyAqIHNjaV9wb3J0X2FkZF9waHkoKSAtCisgKiBAc2NpX3BvcnQ6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcG9ydCBpbiB3aGljaCB0aGUgcGh5IHdpbGwgYmUgYWRkZWQuCisgKiBAc2NpX3BoeTogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIHBoeSB3aGljaCBpcyB0byBiZSBhZGRlZCB0byB0aGUgcG9ydC4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIGFkZCBhIFBIWSB0byB0aGUgc2VsZWN0ZWQgcG9ydC4gVGhpcyBtZXRob2QgcmV0dXJucyBhbgorICogZW51bSBzY2lfc3RhdHVzLiBTQ0lfU1VDQ0VTUyB0aGUgcGh5IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBwb3J0LiBBbnkgb3RoZXIKKyAqIHN0YXR1cyBpcyBhIGZhaWx1cmUgdG8gYWRkIHRoZSBwaHkgdG8gdGhlIHBvcnQuCisgKi8KK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9hZGRfcGh5KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgICAgIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCWVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlOworCisJc3RhdGUgPSBpcG9ydC0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUE9SVF9TVE9QUEVEOiB7CisJCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcG9ydF9zYXNfYWRkcmVzczsKKworCQkvKiBSZWFkIHRoZSBwb3J0IGFzc2lnbmVkIFNBUyBBZGRyZXNzIGlmIHRoZXJlIGlzIG9uZSAqLworCQlzY2lfcG9ydF9nZXRfc2FzX2FkZHJlc3MoaXBvcnQsICZwb3J0X3Nhc19hZGRyZXNzKTsKKworCQlpZiAocG9ydF9zYXNfYWRkcmVzcy5oaWdoICE9IDAgJiYgcG9ydF9zYXNfYWRkcmVzcy5sb3cgIT0gMCkgeworCQkJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBwaHlfc2FzX2FkZHJlc3M7CisKKwkJCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBQSFkgU0FTIEFkZHJlc3MgbWF0Y2hlcyB0aGUgU0FTIEFkZHJlc3MKKwkJCSAqIGZvciB0aGlzIHBvcnQKKwkJCSAqLworCQkJc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoaXBoeSwgJnBoeV9zYXNfYWRkcmVzcyk7CisKKwkJCWlmIChwb3J0X3Nhc19hZGRyZXNzLmhpZ2ggIT0gcGh5X3Nhc19hZGRyZXNzLmhpZ2ggfHwKKwkJCSAgICBwb3J0X3Nhc19hZGRyZXNzLmxvdyAgIT0gcGh5X3Nhc19hZGRyZXNzLmxvdykKKwkJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCQl9CisJCXJldHVybiBzY2lfcG9ydF9zZXRfcGh5KGlwb3J0LCBpcGh5KTsKKwl9CisJY2FzZSBTQ0lfUE9SVF9TVUJfV0FJVElORzoKKwljYXNlIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTDoKKwkJc3RhdHVzID0gc2NpX3BvcnRfc2V0X3BoeShpcG9ydCwgaXBoeSk7CisKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJc2NpX3BvcnRfZ2VuZXJhbF9saW5rX3VwX2hhbmRsZXIoaXBvcnQsIGlwaHksIHRydWUpOworCQlpcG9ydC0+bm90X3JlYWR5X3JlYXNvbiA9IFNDSUNfUE9SVF9OT1RfUkVBRFlfUkVDT05GSUdVUklORzsKKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HKTsKKworCQlyZXR1cm4gc3RhdHVzOworCWNhc2UgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HOgorCQlzdGF0dXMgPSBzY2lfcG9ydF9zZXRfcGh5KGlwb3J0LCBpcGh5KTsKKworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJc2NpX3BvcnRfZ2VuZXJhbF9saW5rX3VwX2hhbmRsZXIoaXBvcnQsIGlwaHksIHRydWUpOworCisJCS8qIFJlLWVudGVyIHRoZSBjb25maWd1cmluZyBzdGF0ZSBzaW5jZSB0aGlzIG1heSBiZSB0aGUgbGFzdCBwaHkgaW4KKwkJICogdGhlIHBvcnQuCisJCSAqLworCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LAorCQkJCQkgIFNDSV9QT1JUX1NVQl9DT05GSUdVUklORyk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lwb3J0X3RvX2RldihpcG9ydCksCisJCQkgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKworLyoqCisgKiBzY2lfcG9ydF9yZW1vdmVfcGh5KCkgLQorICogQHNjaV9wb3J0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHBvcnQgaW4gd2hpY2ggdGhlIHBoeSB3aWxsIGJlIGFkZGVkLgorICogQHNjaV9waHk6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBwaHkgd2hpY2ggaXMgdG8gYmUgYWRkZWQgdG8gdGhlIHBvcnQuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIFBIWSBmcm9tIHRoZSBzZWxlY3RlZCBQT1JULiBUaGlzIG1ldGhvZCByZXR1cm5zCisgKiBhbiBlbnVtIHNjaV9zdGF0dXMuIFNDSV9TVUNDRVNTIHRoZSBwaHkgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwb3J0LiBBbnkKKyAqIG90aGVyIHN0YXR1cyBpcyBhIGZhaWx1cmUgdG8gYWRkIHRoZSBwaHkgdG8gdGhlIHBvcnQuCisgKi8KK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9yZW1vdmVfcGh5KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCQkgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BPUlRfU1RPUFBFRDoKKwkJcmV0dXJuIHNjaV9wb3J0X2NsZWFyX3BoeShpcG9ydCwgaXBoeSk7CisJY2FzZSBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUw6CisJCXN0YXR1cyA9IHNjaV9wb3J0X2NsZWFyX3BoeShpcG9ydCwgaXBoeSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXNjaV9wb3J0X2RlYWN0aXZhdGVfcGh5KGlwb3J0LCBpcGh5LCB0cnVlKTsKKwkJaXBvcnQtPm5vdF9yZWFkeV9yZWFzb24gPSBTQ0lDX1BPUlRfTk9UX1JFQURZX1JFQ09ORklHVVJJTkc7CisJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJCSAgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HOgorCQlzdGF0dXMgPSBzY2lfcG9ydF9jbGVhcl9waHkoaXBvcnQsIGlwaHkpOworCisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCQlzY2lfcG9ydF9kZWFjdGl2YXRlX3BoeShpcG9ydCwgaXBoeSwgdHJ1ZSk7CisKKwkJLyogUmUtZW50ZXIgdGhlIGNvbmZpZ3VyaW5nIHN0YXRlIHNpbmNlIHRoaXMgbWF5IGJlIHRoZSBsYXN0IHBoeSBpbgorCQkgKiB0aGUgcG9ydAorCQkgKi8KKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJICBTQ0lfUE9SVF9TVUJfQ09ORklHVVJJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcG9ydF90b19kZXYoaXBvcnQpLAorCQkJICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9saW5rX3VwKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgICAgIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gaXBvcnQtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BPUlRfU1VCX1dBSVRJTkc6CisJCS8qIFNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IHBoeSBnb2luZyBsaW5rIHVwIGZvciB0aGUgcG9ydCB3ZQorCQkgKiBjYW4ganVzdCBlbmFibGUgaXQgYW5kIGNvbnRpbnVlCisJCSAqLworCQlzY2lfcG9ydF9hY3RpdmF0ZV9waHkoaXBvcnQsIGlwaHksIHRydWUpOworCisJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJCSAgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCQlzY2lfcG9ydF9nZW5lcmFsX2xpbmtfdXBfaGFuZGxlcihpcG9ydCwgaXBoeSwgdHJ1ZSk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9QT1JUX1JFU0VUVElORzoKKwkJLyogVE9ETyBXZSBzaG91bGQgIG1ha2UgIHN1cmUgIHRoYXQgIHRoZSBwaHkgIHRoYXQgIGhhcyBnb25lCisJCSAqIGxpbmsgdXAgaXMgdGhlIHNhbWUgb25lIG9uIHdoaWNoIHdlIHNlbnQgdGhlIHJlc2V0LiAgSXQgaXMKKwkJICogcG9zc2libGUgdGhhdCB0aGUgcGh5IG9uIHdoaWNoIHdlIHNlbnQgIHRoZSByZXNldCBpcyBub3QgdGhlCisJCSAqIG9uZSB0aGF0IGhhcyAgZ29uZSAgbGluayB1cCAgYW5kIHdlICB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0CisJCSAqIHBoeSBiZWluZyByZXNldCAgY29tZXMgIGJhY2suICBDb25zaWRlciB0aGUgY2FzZSB3aGVyZSBhCisJCSAqIHJlc2V0IGlzIHNlbnQgYnV0IGJlZm9yZSB0aGUgaGFyZHdhcmUgcHJvY2Vzc2VzIHRoZSByZXNldCBpdAorCQkgKiBnZXQgYSBsaW5rIHVwIG9uICB0aGUgIHBvcnQgYmVjYXVzZSBvZiBhIGhvdCBwbHVnIGV2ZW50LgorCQkgKiBiZWNhdXNlICBvZiAgdGhlIHJlc2V0IHJlcXVlc3QgdGhpcyBwaHkgd2lsbCBnbyBsaW5rIGRvd24KKwkJICogYWxtb3N0IGltbWVkaWF0ZWx5LgorCQkgKi8KKworCQkvKiBJbiB0aGUgcmVzZXR0aW5nIHN0YXRlIHdlIGRvbid0IG5vdGlmeSB0aGUgdXNlciByZWdhcmRpbmcKKwkJICogbGluayB1cCBhbmQgbGluayBkb3duIG5vdGlmaWNhdGlvbnMuCisJCSAqLworCQlzY2lfcG9ydF9nZW5lcmFsX2xpbmtfdXBfaGFuZGxlcihpcG9ydCwgaXBoeSwgZmFsc2UpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcG9ydF90b19kZXYoaXBvcnQpLAorCQkJICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9saW5rX2Rvd24oc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gaXBvcnQtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCQlzY2lfcG9ydF9kZWFjdGl2YXRlX3BoeShpcG9ydCwgaXBoeSwgdHJ1ZSk7CisKKwkJLyogSWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBwaHlzIGxlZnQgaW4gdGhlIHBvcnQsIHRoZW4KKwkJICogdHJhbnNpdGlvbiB0aGUgcG9ydCB0byB0aGUgV0FJVElORyBzdGF0ZSB1bnRpbCBzdWNoIHRpbWUKKwkJICogYXMgYSBwaHkgZ29lcyBsaW5rIHVwCisJCSAqLworCQlpZiAoaXBvcnQtPmFjdGl2ZV9waHlfbWFzayA9PSAwKQorCQkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkJCSAgU0NJX1BPUlRfU1VCX1dBSVRJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUE9SVF9SRVNFVFRJTkc6CisJCS8qIEluIHRoZSByZXNldHRpbmcgc3RhdGUgd2UgZG9uJ3Qgbm90aWZ5IHRoZSB1c2VyIHJlZ2FyZGluZworCQkgKiBsaW5rIHVwIGFuZCBsaW5rIGRvd24gbm90aWZpY2F0aW9ucy4gKi8KKwkJc2NpX3BvcnRfZGVhY3RpdmF0ZV9waHkoaXBvcnQsIGlwaHksIGZhbHNlKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfc3RhcnRfaW8oc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCSAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gaXBvcnQtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BPUlRfU1VCX1dBSVRJTkc6CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCQlpcG9ydC0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50Kys7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lwb3J0X3RvX2RldihpcG9ydCksCisJCQkgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2NvbXBsZXRlX2lvKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkgICAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IGlwb3J0LT5zbS5jdXJyZW50X3N0YXRlX2lkOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QT1JUX1NUT1BQRUQ6CisJCWRldl93YXJuKHNjaXBvcnRfdG9fZGV2KGlwb3J0KSwKKwkJCSAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJY2FzZSBTQ0lfUE9SVF9TVE9QUElORzoKKwkJc2NpX3BvcnRfZGVjcmVtZW50X3JlcXVlc3RfY291bnQoaXBvcnQpOworCisJCWlmIChpcG9ydC0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ID09IDApCisJCQlwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKGlwb3J0LAorCQkJCQkJICBTQ0lfUE9SVF9TVE9QUEVEKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0lfUE9SVF9SRUFEWToKKwljYXNlIFNDSV9QT1JUX1JFU0VUVElORzoKKwljYXNlIFNDSV9QT1JUX0ZBSUxFRDoKKwljYXNlIFNDSV9QT1JUX1NVQl9XQUlUSU5HOgorCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgorCQlzY2lfcG9ydF9kZWNyZW1lbnRfcmVxdWVzdF9jb3VudChpcG9ydCk7CisJCWJyZWFrOworCWNhc2UgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HOgorCQlzY2lfcG9ydF9kZWNyZW1lbnRfcmVxdWVzdF9jb3VudChpcG9ydCk7CisJCWlmIChpcG9ydC0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ID09IDApIHsKKwkJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXBvcnQsCisJCQkJCQkgIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTCk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfZW5hYmxlX3BvcnRfdGFza19zY2hlZHVsZXIoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJdTMyIHB0c19jb250cm9sX3ZhbHVlOworCisJIC8qIGVuYWJsZSB0aGUgcG9ydCB0YXNrIHNjaGVkdWxlciBpbiBhIHN1c3BlbmRlZCBzdGF0ZSAqLworCXB0c19jb250cm9sX3ZhbHVlID0gcmVhZGwoJmlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycy0+Y29udHJvbCk7CisJcHRzX2NvbnRyb2xfdmFsdWUgfD0gU0NVX1BUU3hDUl9HRU5fQklUKEVOQUJMRSkgfCBTQ1VfUFRTeENSX0dFTl9CSVQoU1VTUEVORCk7CisJd3JpdGVsKHB0c19jb250cm9sX3ZhbHVlLCAmaXBvcnQtPnBvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzLT5jb250cm9sKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfZGlzYWJsZV9wb3J0X3Rhc2tfc2NoZWR1bGVyKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KQoreworCXUzMiBwdHNfY29udHJvbF92YWx1ZTsKKworCXB0c19jb250cm9sX3ZhbHVlID0gcmVhZGwoJmlwb3J0LT5wb3J0X3Rhc2tfc2NoZWR1bGVyX3JlZ2lzdGVycy0+Y29udHJvbCk7CisJcHRzX2NvbnRyb2xfdmFsdWUgJj0KKwkJfihTQ1VfUFRTeENSX0dFTl9CSVQoRU5BQkxFKSB8IFNDVV9QVFN4Q1JfR0VOX0JJVChTVVNQRU5EKSk7CisJd3JpdGVsKHB0c19jb250cm9sX3ZhbHVlLCAmaXBvcnQtPnBvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzLT5jb250cm9sKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfcG9zdF9kdW1teV9yZW1vdGVfbm9kZShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwl1OCBwaHlzX2luZGV4ID0gaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXg7CisJdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYzsKKwl1MTYgcm5pID0gaXBvcnQtPnJlc2VydmVkX3JuaTsKKwl1MzIgY29tbWFuZDsKKworCXJuYyA9ICZpaG9zdC0+cmVtb3RlX25vZGVfY29udGV4dF90YWJsZVtybmldOworCXJuYy0+c3NwLmlzX3ZhbGlkID0gdHJ1ZTsKKworCWNvbW1hbmQgPSBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DXzMyIHwKKwkJICBwaHlzX2luZGV4IDw8IFNDVV9DT05URVhUX0NPTU1BTkRfTE9HSUNBTF9QT1JUX1NISUZUIHwgcm5pOworCisJc2NpX2NvbnRyb2xsZXJfcG9zdF9yZXF1ZXN0KGlob3N0LCBjb21tYW5kKTsKKworCS8qIGVuc3VyZSBoYXJkd2FyZSBoYXMgc2VlbiB0aGUgcG9zdCBybmMgY29tbWFuZCBhbmQgZ2l2ZSBpdAorCSAqIGFtcGxlIHRpbWUgdG8gYWN0IGJlZm9yZSBzZW5kaW5nIHRoZSBzdXNwZW5kCisJICovCisJcmVhZGwoJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5pbnRlcnJ1cHRfc3RhdHVzKTsgLyogZmx1c2ggKi8KKwl1ZGVsYXkoMTApOworCisJY29tbWFuZCA9IFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfU1VTUEVORF9UWF9SWCB8CisJCSAgcGh5c19pbmRleCA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCB8IHJuaTsKKworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpaG9zdCwgY29tbWFuZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3N0b3BwZWRfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwb3J0KSwgc20pOworCisJaWYgKGlwb3J0LT5zbS5wcmV2aW91c19zdGF0ZV9pZCA9PSBTQ0lfUE9SVF9TVE9QUElORykgeworCQkvKgorCQkgKiBJZiB3ZSBlbnRlciB0aGlzIHN0YXRlIGJlY2FzdXNlIG9mIGEgcmVxdWVzdCB0byBzdG9wCisJCSAqIHRoZSBwb3J0IHRoZW4gd2Ugd2FudCB0byBkaXNhYmxlIHRoZSBoYXJkd2FyZXMgcG9ydAorCQkgKiB0YXNrIHNjaGVkdWxlci4gKi8KKwkJc2NpX3BvcnRfZGlzYWJsZV9wb3J0X3Rhc2tfc2NoZWR1bGVyKGlwb3J0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3N0b3BwZWRfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisKKwkvKiBFbmFibGUgYW5kIHN1c3BlbmQgdGhlIHBvcnQgdGFzayBzY2hlZHVsZXIgKi8KKwlzY2lfcG9ydF9lbmFibGVfcG9ydF90YXNrX3NjaGVkdWxlcihpcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X3JlYWR5X3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcG9ydCksIHNtKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwl1MzIgcHJldl9zdGF0ZTsKKworCXByZXZfc3RhdGUgPSBpcG9ydC0+c20ucHJldmlvdXNfc3RhdGVfaWQ7CisJaWYgKHByZXZfc3RhdGUgID09IFNDSV9QT1JUX1JFU0VUVElORykKKwkJaXNjaV9wb3J0X2hhcmRfcmVzZXRfY29tcGxldGUoaXBvcnQsIFNDSV9TVUNDRVNTKTsKKwllbHNlCisJCWlzY2lfcG9ydF9ub3RfcmVhZHkoaWhvc3QsIGlwb3J0KTsKKworCS8qIFBvc3QgYW5kIHN1c3BlbmQgdGhlIGR1bW15IHJlbW90ZSBub2RlIGNvbnRleHQgZm9yIHRoaXMgcG9ydC4gKi8KKwlzY2lfcG9ydF9wb3N0X2R1bW15X3JlbW90ZV9ub2RlKGlwb3J0KTsKKworCS8qIFN0YXJ0IHRoZSByZWFkeSBzdWJzdGF0ZSBtYWNoaW5lICovCisJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpcG9ydCwKKwkJCQkgIFNDSV9QT1JUX1NVQl9XQUlUSU5HKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfcmVzZXR0aW5nX3N0YXRlX2V4aXQoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwb3J0KSwgc20pOworCisJc2NpX2RlbF90aW1lcigmaXBvcnQtPnRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfc3RvcHBpbmdfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXBvcnQpLCBzbSk7CisKKwlzY2lfZGVsX3RpbWVyKCZpcG9ydC0+dGltZXIpOworCisJc2NpX3BvcnRfZGVzdHJveV9kdW1teV9yZXNvdXJjZXMoaXBvcnQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9mYWlsZWRfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlwb3J0KSwgc20pOworCisJaXNjaV9wb3J0X2hhcmRfcmVzZXRfY29tcGxldGUoaXBvcnQsIFNDSV9GQUlMVVJFX1RJTUVPVVQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSBzY2lfcG9ydF9zdGF0ZV90YWJsZVtdID0geworCVtTQ0lfUE9SVF9TVE9QUEVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BvcnRfc3RvcHBlZF9zdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BvcnRfc3RvcHBlZF9zdGF0ZV9leGl0CisJfSwKKwlbU0NJX1BPUlRfU1RPUFBJTkddID0geworCQkuZXhpdF9zdGF0ZSAgPSBzY2lfcG9ydF9zdG9wcGluZ19zdGF0ZV9leGl0CisJfSwKKwlbU0NJX1BPUlRfUkVBRFldID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcG9ydF9yZWFkeV9zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUE9SVF9TVUJfV0FJVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9wb3J0X3JlYWR5X3N1YnN0YXRlX3dhaXRpbmdfZW50ZXIsCisJfSwKKwlbU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfb3BlcmF0aW9uYWxfZW50ZXIsCisJCS5leGl0X3N0YXRlICA9IHNjaV9wb3J0X3JlYWR5X3N1YnN0YXRlX29wZXJhdGlvbmFsX2V4aXQKKwl9LAorCVtTQ0lfUE9SVF9TVUJfQ09ORklHVVJJTkddID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcG9ydF9yZWFkeV9zdWJzdGF0ZV9jb25maWd1cmluZ19lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3BvcnRfcmVhZHlfc3Vic3RhdGVfY29uZmlndXJpbmdfZXhpdAorCX0sCisJW1NDSV9QT1JUX1JFU0VUVElOR10gPSB7CisJCS5leGl0X3N0YXRlICA9IHNjaV9wb3J0X3Jlc2V0dGluZ19zdGF0ZV9leGl0CisJfSwKKwlbU0NJX1BPUlRfRkFJTEVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3BvcnRfZmFpbGVkX3N0YXRlX2VudGVyLAorCX0KK307CisKK3ZvaWQgc2NpX3BvcnRfY29uc3RydWN0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCB1OCBpbmRleCwKKwkJCSAgICAgc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJc2NpX2luaXRfc20oJmlwb3J0LT5zbSwgc2NpX3BvcnRfc3RhdGVfdGFibGUsIFNDSV9QT1JUX1NUT1BQRUQpOworCisJaXBvcnQtPmxvZ2ljYWxfcG9ydF9pbmRleCAgPSBTQ0lDX1NEU19EVU1NWV9QT1JUOworCWlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID0gaW5kZXg7CisJaXBvcnQtPmFjdGl2ZV9waHlfbWFzayAgICAgPSAwOworCWlwb3J0LT5yZWFkeV9leGl0CSAgICAgID0gZmFsc2U7CisKKwlpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXIgPSBpaG9zdDsKKworCWlwb3J0LT5zdGFydGVkX3JlcXVlc3RfY291bnQgPSAwOworCWlwb3J0LT5hc3NpZ25lZF9kZXZpY2VfY291bnQgPSAwOworCisJaXBvcnQtPnJlc2VydmVkX3JuaSA9IFNDVV9EVU1NWV9JTkRFWDsKKwlpcG9ydC0+cmVzZXJ2ZWRfdGFnID0gU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUc7CisKKwlzY2lfaW5pdF90aW1lcigmaXBvcnQtPnRpbWVyLCBwb3J0X3RpbWVvdXQpOworCisJaXBvcnQtPnBvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzID0gTlVMTDsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykKKwkJaXBvcnQtPnBoeV90YWJsZVtpbmRleF0gPSBOVUxMOworfQorCit2b2lkIGlzY2lfcG9ydF9pbml0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCBzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgaW50IGluZGV4KQoreworCUlOSVRfTElTVF9IRUFEKCZpcG9ydC0+cmVtb3RlX2Rldl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaXBvcnQtPmRvbWFpbl9kZXZfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJmlwb3J0LT5zdGF0ZV9sb2NrKTsKKwlpbml0X2NvbXBsZXRpb24oJmlwb3J0LT5zdGFydF9jb21wbGV0ZSk7CisJaXBvcnQtPmlzY2lfaG9zdCA9IGlob3N0OworCWlzY2lfcG9ydF9jaGFuZ2Vfc3RhdGUoaXBvcnQsIGlzY2lfZnJlZWQpOworCWF0b21pY19zZXQoJmlwb3J0LT5ldmVudCwgMCk7Cit9CisKKy8qKgorICogaXNjaV9wb3J0X2dldF9zdGF0ZSgpIC0gVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBzdGF0dXMgb2YgdGhlIHBvcnQgb2JqZWN0LgorICogQGlzY2lfcG9ydDogVGhpcyBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSBpc2NpX3BvcnQgb2JqZWN0CisgKgorICogc3RhdHVzIG9mIHRoZSBvYmplY3QgYXMgYSBpc2NpX3N0YXR1cyBlbnVtLgorICovCitlbnVtIGlzY2lfc3RhdHVzIGlzY2lfcG9ydF9nZXRfc3RhdGUoCisJc3RydWN0IGlzY2lfcG9ydCAqaXNjaV9wb3J0KQoreworCXJldHVybiBpc2NpX3BvcnQtPnN0YXR1czsKK30KKwordm9pZCBzY2lfcG9ydF9icm9hZGNhc3RfY2hhbmdlX3JlY2VpdmVkKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LCBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkvKiBub3RpZnkgdGhlIHVzZXIuICovCisJaXNjaV9wb3J0X2JjX2NoYW5nZV9yZWNlaXZlZChpaG9zdCwgaXBvcnQsIGlwaHkpOworfQorCitpbnQgaXNjaV9wb3J0X3BlcmZvcm1faGFyZF9yZXNldChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJaW50IGlkeCwgcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogaXBvcnQgPSAlcFxuIiwKKwkJX19mdW5jX18sIGlwb3J0KTsKKworCWluaXRfY29tcGxldGlvbigmaXBvcnQtPmhhcmRfcmVzZXRfY29tcGxldGUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCSNkZWZpbmUgSVNDSV9QT1JUX1JFU0VUX1RJTUVPVVQgU0NJQ19TRFNfU0lHTkFUVVJFX0ZJU19USU1FT1VUCisJc3RhdHVzID0gc2NpX3BvcnRfaGFyZF9yZXNldChpcG9ydCwgSVNDSV9QT1JUX1JFU0VUX1RJTUVPVVQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpcG9ydC0+aGFyZF9yZXNldF9jb21wbGV0ZSk7CisKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogaXBvcnQgPSAlcDsgaGFyZCByZXNldCBjb21wbGV0aW9uXG4iLAorCQkJX19mdW5jX18sIGlwb3J0KTsKKworCQlpZiAoaXBvcnQtPmhhcmRfcmVzZXRfc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisKKwkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogaXBvcnQgPSAlcDsgc2NpX3BvcnRfaGFyZF9yZXNldCBjYWxsIgorCQkJIiBmYWlsZWQgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBpcG9ydCwgc3RhdHVzKTsKKworCX0KKworCS8qIElmIHRoZSBoYXJkIHJlc2V0IGZvciB0aGUgcG9ydCBoYXMgZmFpbGVkLCBjb25zaWRlciB0aGlzCisJICogdGhlIHNhbWUgYXMgbGluayBmYWlsdXJlcyBvbiBhbGwgcGh5cyBpbiB0aGUgcG9ydC4KKwkgKi8KKwlpZiAocmV0ICE9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpIHsKKworCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBpcG9ydCA9ICVwOyBoYXJkIHJlc2V0IGZhaWxlZCAiCisJCQkiKDB4JXgpIC0gZHJpdmluZyBleHBsaWNpdCBsaW5rIGZhaWwgZm9yIGFsbCBwaHlzXG4iLAorCQkJX19mdW5jX18sIGlwb3J0LCBpcG9ydC0+aGFyZF9yZXNldF9zdGF0dXMpOworCisJCS8qIERvd24gYWxsIHBoeXMgaW4gdGhlIHBvcnQuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgU0NJX01BWF9QSFlTOyArK2lkeCkgeworCQkJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gaXBvcnQtPnBoeV90YWJsZVtpZHhdOworCisJCQlpZiAoIWlwaHkpCisJCQkJY29udGludWU7CisJCQlzY2lfcGh5X3N0b3AoaXBoeSk7CisJCQlzY2lfcGh5X3N0YXJ0KGlwaHkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpc2NpX3BvcnRfZGVmb3JtZWQoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpYnNhcyB3aGVuIGEgcG9ydCBiZWNvbWVzCisgKiAgICBpbmFjdGl2ZS4KKyAqIEBwaHk6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbGlic2FzIHBoeSB3aXRoIHRoZSBpbmFjdGl2ZSBwb3J0LgorICoKKyAqLwordm9pZCBpc2NpX3BvcnRfZGVmb3JtZWQoc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkpCit7CisJcHJfZGVidWcoIiVzOiBzYXNfcGh5ID0gJXBcbiIsIF9fZnVuY19fLCBwaHkpOworfQorCisvKioKKyAqIGlzY2lfcG9ydF9mb3JtZWQoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGxpYnNhcyB3aGVuIGEgcG9ydCBiZWNvbWVzCisgKiAgICBhY3RpdmUuCisgKiBAcGh5OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGxpYnNhcyBwaHkgd2l0aCB0aGUgYWN0aXZlIHBvcnQuCisgKgorICovCit2b2lkIGlzY2lfcG9ydF9mb3JtZWQoc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkpCit7CisJcHJfZGVidWcoIiVzOiBzYXNfcGh5ID0gJXAsIHNhc19wb3J0ID0gJXBcbiIsIF9fZnVuY19fLCBwaHksIHBoeS0+cG9ydCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmggYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwZWNkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnQuaApAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfSVNDSV9QT1JUX0hfCisjZGVmaW5lIF9JU0NJX1BPUlRfSF8KKworI2luY2x1ZGUgPHNjc2kvbGlic2FzLmg+CisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInNhcy5oIgorI2luY2x1ZGUgInBoeS5oIgorCisjZGVmaW5lIFNDSUNfU0RTX0RVTU1ZX1BPUlQgICAweEZGCisKK3N0cnVjdCBpc2NpX3BoeTsKK3N0cnVjdCBpc2NpX2hvc3Q7CisKK2VudW0gaXNjaV9zdGF0dXMgeworCWlzY2lfZnJlZWQgICAgICAgID0gMHgwMCwKKwlpc2NpX3N0YXJ0aW5nICAgICA9IDB4MDEsCisJaXNjaV9yZWFkeSAgICAgICAgPSAweDAyLAorCWlzY2lfcmVhZHlfZm9yX2lvID0gMHgwMywKKwlpc2NpX3N0b3BwaW5nICAgICA9IDB4MDQsCisJaXNjaV9zdG9wcGVkICAgICAgPSAweDA1LAorfTsKKworLyoqCisgKiBzdHJ1Y3QgaXNjaV9wb3J0IC0gaXNjaSBkaXJlY3QgYXR0YWNoZWQgc2FzIHBvcnQgb2JqZWN0CisgKiBAZXZlbnQ6IGNvdW50cyBiY25zIGFuZCBwb3J0IHN0b3AgZXZlbnRzIChmb3IgYmNuIGZpbHRlcmluZykKKyAqIEByZWFkeV9leGl0OiBzZXZlcmFsIHN0YXRlcyBjb25zdGl0dXRlICdyZWFkeScuIFdoZW4gZXhpdGluZyByZWFkeSB3ZQorICogICAgICAgICAgICAgIG5lZWQgdG8gdGFrZSBleHRyYSBwb3J0LXRlYXJkb3duIGFjdGlvbnMgdGhhdCBhcmUKKyAqICAgICAgICAgICAgICBza2lwcGVkIHdoZW4gZXhpdGluZyB0byBhbm90aGVyICdyZWFkeScgc3RhdGUuCisgKiBAbG9naWNhbF9wb3J0X2luZGV4OiBzb2Z0d2FyZSBwb3J0IGluZGV4CisgKiBAcGh5c2ljYWxfcG9ydF9pbmRleDogaGFyZHdhcmUgcG9ydCBpbmRleAorICogQGFjdGl2ZV9waHlfbWFzazogaWRlbnRpZmllcyBwaHkgbWVtYmVycworICogQHJlc2VydmVkX3RhZzoKKyAqIEByZXNlcnZlZF9ybmk6IHJlc2VydmVyIGZvciBwb3J0IHRhc2sgc2NoZWR1bGVyIHdvcmthcm91bmQKKyAqIEBzdGFydGVkX3JlcXVlc3RfY291bnQ6IHJlZmVyZW5jZSBjb3VudCBmb3Igb3V0c3RhbmRpbmcgY29tbWFuZHMKKyAqIEBub3RfcmVhZHlfcmVhc29uOiBzZXQgZHVyaW5nIHN0YXRlIHRyYW5zaXRpb25zIGFuZCBub3RpZmllZAorICogQHRpbWVyOiB0aW1lb3V0IHN0YXJ0L3N0b3Agb3BlcmF0aW9ucworICovCitzdHJ1Y3QgaXNjaV9wb3J0IHsKKwllbnVtIGlzY2lfc3RhdHVzIHN0YXR1czsKKwkjZGVmaW5lIElQT1JUX0JDTl9CTE9DS0VEIDAKKwkjZGVmaW5lIElQT1JUX0JDTl9QRU5ESU5HIDEKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWF0b21pY190IGV2ZW50OworCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdDsKKwlzdHJ1Y3QgYXNkX3Nhc19wb3J0IHNhc19wb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgcmVtb3RlX2Rldl9saXN0OworCXNwaW5sb2NrX3Qgc3RhdGVfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRvbWFpbl9kZXZfbGlzdDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBzdGFydF9jb21wbGV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBoYXJkX3Jlc2V0X2NvbXBsZXRlOworCWVudW0gc2NpX3N0YXR1cyBoYXJkX3Jlc2V0X3N0YXR1czsKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSBzbTsKKwlib29sIHJlYWR5X2V4aXQ7CisJdTggbG9naWNhbF9wb3J0X2luZGV4OworCXU4IHBoeXNpY2FsX3BvcnRfaW5kZXg7CisJdTggYWN0aXZlX3BoeV9tYXNrOworCXUxNiByZXNlcnZlZF9ybmk7CisJdTE2IHJlc2VydmVkX3RhZzsKKwl1MzIgc3RhcnRlZF9yZXF1ZXN0X2NvdW50OworCXUzMiBhc3NpZ25lZF9kZXZpY2VfY291bnQ7CisJdTMyIG5vdF9yZWFkeV9yZWFzb247CisJc3RydWN0IGlzY2lfcGh5ICpwaHlfdGFibGVbU0NJX01BWF9QSFlTXTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICpvd25pbmdfY29udHJvbGxlcjsKKwlzdHJ1Y3Qgc2NpX3RpbWVyIHRpbWVyOworCXN0cnVjdCBzY3VfcG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnM7CisJLyogWFhYIHJld29yazogb25seSBvbmUgcmVnaXN0ZXIsIG5vIG5lZWQgdG8gcmVwbGljYXRlIHBlci1wb3J0ICovCisJdTMyIF9faW9tZW0gKnBvcnRfcGVfY29uZmlndXJhdGlvbl9yZWdpc3RlcjsKKwlzdHJ1Y3Qgc2N1X3ZpaXRfZW50cnkgX19pb21lbSAqdmlpdF9yZWdpc3RlcnM7Cit9OworCitlbnVtIHNjaV9wb3J0X25vdF9yZWFkeV9yZWFzb25fY29kZSB7CisJU0NJQ19QT1JUX05PVF9SRUFEWV9OT19BQ1RJVkVfUEhZUywKKwlTQ0lDX1BPUlRfTk9UX1JFQURZX0hBUkRfUkVTRVRfUkVRVUVTVEVELAorCVNDSUNfUE9SVF9OT1RfUkVBRFlfSU5WQUxJRF9QT1JUX0NPTkZJR1VSQVRJT04sCisJU0NJQ19QT1JUX05PVF9SRUFEWV9SRUNPTkZJR1VSSU5HLAorCisJU0NJQ19QT1JUX05PVF9SRUFEWV9SRUFTT05fQ09ERV9NQVgKK307CisKK3N0cnVjdCBzY2lfcG9ydF9lbmRfcG9pbnRfcHJvcGVydGllcyB7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBzYXNfYWRkcmVzczsKKwlzdHJ1Y3Qgc2NpX3BoeV9wcm90byBwcm90b2NvbHM7Cit9OworCitzdHJ1Y3Qgc2NpX3BvcnRfcHJvcGVydGllcyB7CisJdTMyIGluZGV4OworCXN0cnVjdCBzY2lfcG9ydF9lbmRfcG9pbnRfcHJvcGVydGllcyBsb2NhbDsKKwlzdHJ1Y3Qgc2NpX3BvcnRfZW5kX3BvaW50X3Byb3BlcnRpZXMgcmVtb3RlOworCXUzMiBwaHlfbWFzazsKK307CisKKy8qKgorICogZW51bSBzY2lfcG9ydF9zdGF0ZXMgLSBUaGlzIGVudW1lcmF0aW9uIGRlcGljdHMgYWxsIHRoZSBzdGF0ZXMgZm9yIHRoZQorICogICAgY29tbW9uIHBvcnQgc3RhdGUgbWFjaGluZS4KKyAqCisgKgorICovCitlbnVtIHNjaV9wb3J0X3N0YXRlcyB7CisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcG9ydCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gc3RvcHBlZC4KKwkgKiBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFNUT1BQSU5HIHN0YXRlLgorCSAqLworCVNDSV9QT1JUX1NUT1BQRUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBwb3J0IGlzIGluIHRoZSBwcm9jZXNzIG9mIHN0b3BwaW5nLgorCSAqIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZCwgYnV0IGV4aXN0aW5nIElPCisJICogb3BlcmF0aW9ucyBhcmUgYWxsb3dlZCB0byBjb21wbGV0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJX1BPUlRfU1RPUFBJTkcsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGUgcG9ydCBpcyBub3cgcmVhZHkuICBUaHVzLCB0aGUgdXNlciBpcworCSAqIGFibGUgdG8gcGVyZm9ybSBJTyBvcGVyYXRpb25zIG9uIHRoaXMgcG9ydC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRJTkcgc3RhdGUuCisJICovCisJU0NJX1BPUlRfUkVBRFksCisKKwkvKioKKwkgKiBUaGUgc3Vic3RhdGUgd2hlcmUgdGhlIHBvcnQgaXMgc3RhcnRlZCBhbmQgcmVhZHkgYnV0IGhhcyBubworCSAqIGFjdGl2ZSBwaHlzLgorCSAqLworCVNDSV9QT1JUX1NVQl9XQUlUSU5HLAorCisJLyoqCisJICogVGhlIHN1YnN0YXRlIHdoZXJlIHRoZSBwb3J0IGlzIHN0YXJ0ZWQgYW5kIHJlYWR5IGFuZCB0aGVyZSBpcworCSAqIGF0IGxlYXN0IG9uZSBwaHkgb3BlcmF0aW9uYWwuCisJICovCisJU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMLAorCisJLyoqCisJICogVGhlIHN1YnN0YXRlIHdoZXJlIHRoZSBwb3J0IGlzIHN0YXJ0ZWQgYW5kIHRoZXJlIHdhcyBhbgorCSAqIGFkZC9yZW1vdmUgcGh5IGV2ZW50LiAgVGhpcyBzdGF0ZSBpcyBvbmx5IHVzZWQgaW4gQXV0b21hdGljCisJICogUG9ydCBDb25maWd1cmF0aW9uIE1vZGUgKEFQQykKKwkgKi8KKwlTQ0lfUE9SVF9TVUJfQ09ORklHVVJJTkcsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGUgcG9ydCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBwZXJmb3JtaW5nIGEgaGFyZAorCSAqIHJlc2V0LiAgVGh1cywgdGhlIHVzZXIgaXMgdW5hYmxlIHRvIHBlcmZvcm0gSU8gb3BlcmF0aW9ucyBvbiB0aGlzCisJICogcG9ydC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJX1BPUlRfUkVTRVRUSU5HLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIHBvcnQgaGFzIGZhaWxlZCBhIHJlc2V0IHJlcXVlc3QuICBUaGlzIHN0YXRlCisJICogaXMgZW50ZXJlZCB3aGVuIGEgcG9ydCByZXNldCByZXF1ZXN0IHRpbWVzIG91dC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVTRVRUSU5HIHN0YXRlLgorCSAqLworCVNDSV9QT1JUX0ZBSUxFRCwKKworCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc2NpX3BvcnRfZGVjcmVtZW50X3JlcXVlc3RfY291bnQoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJaWYgKFdBUk5fT05DRShpcG9ydC0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ID09IDAsCisJCSAgICAgICAiJXM6IHRyaWVkIHRvIGRlY3JlbWVudCBzdGFydGVkX3JlcXVlc3RfY291bnQgcGFzdCAwIT8iLAorCQkJX19mdW5jX18pKQorCQkvKiBwYXNzICovOworCWVsc2UKKwkJaXBvcnQtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudC0tOworfQorCisjZGVmaW5lIHNjaV9wb3J0X2FjdGl2ZV9waHkocG9ydCwgcGh5KSBcCisJKCgocG9ydCktPmFjdGl2ZV9waHlfbWFzayAmICgxIDw8IChwaHkpLT5waHlfaW5kZXgpKSAhPSAwKQorCit2b2lkIHNjaV9wb3J0X2NvbnN0cnVjdCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwl1OCBwb3J0X2luZGV4LAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3N0YXJ0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KTsKK2VudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9zdG9wKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2FkZF9waHkoCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X3JlbW92ZV9waHkoCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKwordm9pZCBzY2lfcG9ydF9zZXR1cF90cmFuc3BvcnRzKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXUzMiBkZXZpY2VfaWQpOworCit2b2lkIGlzY2lfcG9ydF9iY25fZW5hYmxlKHN0cnVjdCBpc2NpX2hvc3QgKiwgc3RydWN0IGlzY2lfcG9ydCAqKTsKKwordm9pZCBzY2lfcG9ydF9kZWFjdGl2YXRlX3BoeSgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHksCisJYm9vbCBkb19ub3RpZnlfdXNlcik7CisKK2Jvb2wgc2NpX3BvcnRfbGlua19kZXRlY3RlZCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfbGlua191cChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgICAgICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2xpbmtfZG93bihzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKworc3RydWN0IGlzY2lfcmVxdWVzdDsKK3N0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2U7CitlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfc3RhcnRfaW8oCisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2NvbXBsZXRlX2lvKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSk7CisKK2VudW0gc2FzX2xpbmtyYXRlIHNjaV9wb3J0X2dldF9tYXhfYWxsb3dlZF9zcGVlZCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCk7CisKK3ZvaWQgc2NpX3BvcnRfYnJvYWRjYXN0X2NoYW5nZV9yZWNlaXZlZCgKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpOworCitib29sIHNjaV9wb3J0X2lzX3ZhbGlkX3BoeV9hc3NpZ25tZW50KAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXUzMiBwaHlfaW5kZXgpOworCit2b2lkIHNjaV9wb3J0X2dldF9zYXNfYWRkcmVzcygKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzICpzYXNfYWRkcmVzcyk7CisKK3ZvaWQgc2NpX3BvcnRfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgKnNhc19hZGRyZXNzKTsKKworZW51bSBpc2NpX3N0YXR1cyBpc2NpX3BvcnRfZ2V0X3N0YXRlKAorCXN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydCk7CisKK3ZvaWQgaXNjaV9wb3J0X2Zvcm1lZChzdHJ1Y3QgYXNkX3Nhc19waHkgKik7Cit2b2lkIGlzY2lfcG9ydF9kZWZvcm1lZChzdHJ1Y3QgYXNkX3Nhc19waHkgKik7CisKK3ZvaWQgaXNjaV9wb3J0X2luaXQoCisJc3RydWN0IGlzY2lfcG9ydCAqcG9ydCwKKwlzdHJ1Y3QgaXNjaV9ob3N0ICpob3N0LAorCWludCBpbmRleCk7CisKK2ludCBpc2NpX3BvcnRfcGVyZm9ybV9oYXJkX3Jlc2V0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgc3RydWN0IGlzY2lfcGh5ICppcGh5KTsKKyNlbmRpZiAvKiAhZGVmaW5lZChfSVNDSV9QT1JUX0hfKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcG9ydF9jb25maWcuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnRfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2YjExMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnRfY29uZmlnLmMKQEAgLTAsMCArMSw3NTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJob3N0LmgiCisKKyNkZWZpbmUgU0NJQ19TRFNfTVBDX1JFQ09ORklHVVJBVElPTl9USU1FT1VUICAgICgxMCkKKyNkZWZpbmUgU0NJQ19TRFNfQVBDX1JFQ09ORklHVVJBVElPTl9USU1FT1VUICAgICgxMCkKKyNkZWZpbmUgU0NJQ19TRFNfQVBDX1dBSVRfTElOS19VUF9OT1RJRklDQVRJT04gICgxMDApCisKK2VudW0gU0NJQ19TRFNfQVBDX0FDVElWSVRZIHsKKwlTQ0lDX1NEU19BUENfU0tJUF9QSFksCisJU0NJQ19TRFNfQVBDX0FERF9QSFksCisJU0NJQ19TRFNfQVBDX1NUQVJUX1RJTUVSLAorCisJU0NJQ19TRFNfQVBDX0FDVElWSVRZX01BWAorfTsKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2VuZXJhbCBwb3J0IGNvbmZpZ3VyYXRpb24gYWdlbnQgcm91dGluZXMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKioKKyAqCisgKiBAYWRkcmVzc19vbmU6IEEgU0FTIEFkZHJlc3MgdG8gYmUgY29tcGFyZWQuCisgKiBAYWRkcmVzc190d286IEEgU0FTIEFkZHJlc3MgdG8gYmUgY29tcGFyZWQuCisgKgorICogQ29tcGFyZSB0aGUgdHdvIFNBUyBBZGRyZXNzIGFuZCBpZiBTQVMgQWRkcmVzcyBPbmUgaXMgZ3JlYXRlciB0aGFuIFNBUworICogQWRkcmVzcyBUd28gdGhlbiByZXR1cm4gPiAwIGVsc2UgaWYgU0FTIEFkZHJlc3MgT25lIGlzIGxlc3MgdGhhbiBTQVMgQWRkcmVzcworICogVHdvIHJldHVybiA8IDAgT3RoZXJ3aXNlIHRoZXkgYXJlIHRoZSBzYW1lIHJldHVybiAwIEEgc2lnbmVkIHZhbHVlIG9mIHggPiAwCisgKiA+IHkgd2hlcmUgeCBpcyByZXR1cm5lZCBmb3IgQWRkcmVzcyBPbmUgPiBBZGRyZXNzIFR3byB5IGlzIHJldHVybmVkIGZvcgorICogQWRkcmVzcyBPbmUgPCBBZGRyZXNzIFR3byAwIGlzIHJldHVybmVkIG9mciBBZGRyZXNzIE9uZSA9IEFkZHJlc3MgVHdvCisgKi8KK3N0YXRpYyBzMzIgc2NpX3Nhc19hZGRyZXNzX2NvbXBhcmUoCisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBhZGRyZXNzX29uZSwKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIGFkZHJlc3NfdHdvKQoreworCWlmIChhZGRyZXNzX29uZS5oaWdoID4gYWRkcmVzc190d28uaGlnaCkgeworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKGFkZHJlc3Nfb25lLmhpZ2ggPCBhZGRyZXNzX3R3by5oaWdoKSB7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKGFkZHJlc3Nfb25lLmxvdyA+IGFkZHJlc3NfdHdvLmxvdykgeworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKGFkZHJlc3Nfb25lLmxvdyA8IGFkZHJlc3NfdHdvLmxvdykgeworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVGhlIHR3byBTQVMgQWRkcmVzcyBtdXN0IGJlIGlkZW50aWNhbCAqLworCXJldHVybiAwOworfQorCisvKioKKyAqCisgKiBAY29udHJvbGxlcjogVGhlIGNvbnRyb2xsZXIgb2JqZWN0IHVzZWQgZm9yIHRoZSBwb3J0IHNlYXJjaC4KKyAqIEBwaHk6IFRoZSBwaHkgb2JqZWN0IHRvIG1hdGNoLgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGZpbmQgYSBtYXRjaGluZyBwb3J0IGZvciB0aGUgcGh5LiAgVGhpcyBtZWFucyB0aGF0IHRoZQorICogcG9ydCBhbmQgcGh5IGJvdGggaGF2ZSB0aGUgc2FtZSBicm9hZGNhc3Qgc2FzIGFkZHJlc3MgYW5kIHNhbWUgcmVjZWl2ZWQgc2FzCisgKiBhZGRyZXNzLiBUaGUgcG9ydCBhZGRyZXNzIG9yIHRoZSBOVUxMIGlmIHRoZXJlIGlzIG5vIG1hdGNoaW5nCisgKiBwb3J0LiBwb3J0IGFkZHJlc3MgaWYgdGhlIHBvcnQgY2FuIGJlIGZvdW5kIHRvIG1hdGNoIHRoZSBwaHkuCisgKiBOVUxMIGlmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHBvcnQgZm9yIHRoZSBwaHkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXNjaV9wb3J0ICpzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X2ZpbmRfcG9ydCgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdTggaTsKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHBvcnRfc2FzX2FkZHJlc3M7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBwb3J0X2F0dGFjaGVkX2RldmljZV9hZGRyZXNzOworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcGh5X3Nhc19hZGRyZXNzOworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgcGh5X2F0dGFjaGVkX2RldmljZV9hZGRyZXNzOworCisJLyoKKwkgKiBTaW5jZSB0aGlzIHBoeSBjYW4gYmUgYSBtZW1iZXIgb2YgYSB3aWRlIHBvcnQgY2hlY2sgdG8gc2VlIGlmIG9uZSBvcgorCSAqIG1vcmUgcGh5cyBtYXRjaCB0aGUgc2VudCBhbmQgcmVjZWl2ZWQgU0FTIGFkZHJlc3MgYXMgdGhpcyBwaHkgaW4gd2hpY2gKKwkgKiBjYXNlIGl0IHNob3VsZCBwYXJ0aWNpcGF0ZSBpbiB0aGUgc2FtZSBwb3J0LgorCSAqLworCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKGlwaHksICZwaHlfc2FzX2FkZHJlc3MpOworCXNjaV9waHlfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKGlwaHksICZwaHlfYXR0YWNoZWRfZGV2aWNlX2FkZHJlc3MpOworCisJZm9yIChpID0gMDsgaSA8IGlob3N0LT5sb2dpY2FsX3BvcnRfZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gJmlob3N0LT5wb3J0c1tpXTsKKworCQlzY2lfcG9ydF9nZXRfc2FzX2FkZHJlc3MoaXBvcnQsICZwb3J0X3Nhc19hZGRyZXNzKTsKKwkJc2NpX3BvcnRfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyZXNzKGlwb3J0LCAmcG9ydF9hdHRhY2hlZF9kZXZpY2VfYWRkcmVzcyk7CisKKwkJaWYgKHNjaV9zYXNfYWRkcmVzc19jb21wYXJlKHBvcnRfc2FzX2FkZHJlc3MsIHBoeV9zYXNfYWRkcmVzcykgPT0gMCAmJgorCQkgICAgc2NpX3Nhc19hZGRyZXNzX2NvbXBhcmUocG9ydF9hdHRhY2hlZF9kZXZpY2VfYWRkcmVzcywgcGh5X2F0dGFjaGVkX2RldmljZV9hZGRyZXNzKSA9PSAwKQorCQkJcmV0dXJuIGlwb3J0OworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqCisgKiBAY29udHJvbGxlcjogVGhpcyBpcyB0aGUgY29udHJvbGxlciBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgcG9ydCBhZ2VudAorICogQHBvcnRfYWdlbnQ6IFRoaXMgaXMgdGhlIHBvcnQgY29uZmlncnVhdGlvbiBhZ2VudCBmb3IgdGhlIGNvbnRyb2xsZXIuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgdmFsaWRhdGUgdGhlIHBvcnQgY29uZmlndXJhdGlvbiBpcyBjb3JyZWN0IGZvciB0aGUgU0NVCisgKiBoYXJkd2FyZS4gIFRoZSBTQ1UgaGFyZHdhcmUgYWxsb3dzIGZvciBwb3J0IGNvbmZpZ3VyYXRpb25zIGFzIGZvbGxvd3MuIExQMAorICogLT4gKFBFMCksIChQRTAsIFBFMSksIChQRTAsIFBFMSwgUEUyLCBQRTMpIExQMSAtPiAoUEUxKSBMUDIgLT4gKFBFMiksIChQRTIsCisgKiBQRTMpIExQMyAtPiAoUEUzKSBlbnVtIHNjaV9zdGF0dXMgU0NJX1NVQ0NFU1MgdGhlIHBvcnQgY29uZmlndXJhdGlvbiBpcyB2YWxpZCBmb3IKKyAqIHRoaXMgcG9ydCBjb25maWd1cmF0aW9uIGFnZW50LiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QT1JUX0NPTkZJR1VSQVRJT04KKyAqIHRoZSBwb3J0IGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkIGZvciB0aGlzIHBvcnQgY29uZmlndXJhdGlvbiBhZ2VudC4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X3ZhbGlkYXRlX3BvcnRzKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCXN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50KQoreworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgZmlyc3RfYWRkcmVzczsKKwlzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHNlY29uZF9hZGRyZXNzOworCisJLyoKKwkgKiBTYW5pdHkgY2hlY2sgdGhlIG1heCByYW5nZXMgZm9yIGFsbCB0aGUgcGh5cyB0aGUgbWF4IGluZGV4CisJICogaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBwb3J0IHJhbmdlIGluZGV4ICovCisJaWYgKHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzBdLm1heF9pbmRleCAhPSAwIHx8CisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzFdLm1heF9pbmRleCAhPSAxIHx8CisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzJdLm1heF9pbmRleCAhPSAyIHx8CisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzNdLm1heF9pbmRleCAhPSAzKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCisJLyoKKwkgKiBUaGlzIGlzIGEgcmVxdWVzdCB0byBjb25maWd1cmUgYSBzaW5nbGUgeDQgcG9ydCBvciBhdCBsZWFzdCBhdHRlbXB0CisJICogdG8gbWFrZSBhbGwgdGhlIHBoeXMgaW50byBhIHNpbmdsZSBwb3J0ICovCisJaWYgKHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzBdLm1pbl9pbmRleCA9PSAwICYmCisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzFdLm1pbl9pbmRleCA9PSAwICYmCisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzJdLm1pbl9pbmRleCA9PSAwICYmCisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzNdLm1pbl9pbmRleCA9PSAwKQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisKKwkvKgorCSAqIFRoaXMgaXMgYSBkZWdlbmVyYXRlIGNhc2Ugd2hlcmUgcGh5IDEgYW5kIHBoeSAyIGFyZSBhc3NpZ25lZAorCSAqIHRvIHRoZSBzYW1lIHBvcnQgdGhpcyBpcyBleHBsaWNpdGx5IGRpc2FsbG93ZWQgYnkgdGhlIGhhcmR3YXJlCisJICogdW5sZXNzIHRoZXkgYXJlIHBhcnQgb2YgdGhlIHNhbWUgeDQgcG9ydCBhbmQgdGhpcyBjb25kaXRpb24gd2FzCisJICogYWxyZWFkeSBjaGVja2VkIGFib3ZlLiAqLworCWlmIChwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVsyXS5taW5faW5kZXggPT0gMSkgeworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCX0KKworCS8qCisJICogUEUwIGFuZCBQRTMgY2FuIG5ldmVyIGhhdmUgdGhlIHNhbWUgU0FTIEFkZHJlc3MgdW5sZXNzIHRoZXkKKwkgKiBhcmUgcGFydCBvZiB0aGUgc2FtZSB4NCB3aWRlIHBvcnQgYW5kIHdlIGhhdmUgYWxyZWFkeSBjaGVja2VkCisJICogZm9yIHRoaXMgY29uZGl0aW9uLiAqLworCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1swXSwgJmZpcnN0X2FkZHJlc3MpOworCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1szXSwgJnNlY29uZF9hZGRyZXNzKTsKKworCWlmIChzY2lfc2FzX2FkZHJlc3NfY29tcGFyZShmaXJzdF9hZGRyZXNzLCBzZWNvbmRfYWRkcmVzcykgPT0gMCkgeworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCX0KKworCS8qCisJICogUEUwIGFuZCBQRTEgYXJlIGNvbmZpZ3VyZWQgaW50byBhIDJ4MSBwb3J0cyBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiBTQVMgQWRkcmVzcyBmb3IgUEUwIGFuZCBQRTIgYXJlIGRpZmZlcmVudCBzaW5jZSB0aGV5IGNhbiBub3QgYmUKKwkgKiBwYXJ0IG9mIHRoZSBzYW1lIHBvcnQuICovCisJaWYgKHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzBdLm1pbl9pbmRleCA9PSAwICYmCisJICAgIHBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlWzFdLm1pbl9pbmRleCA9PSAxKSB7CisJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1swXSwgJmZpcnN0X2FkZHJlc3MpOworCQlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcygmaWhvc3QtPnBoeXNbMl0sICZzZWNvbmRfYWRkcmVzcyk7CisKKwkJaWYgKHNjaV9zYXNfYWRkcmVzc19jb21wYXJlKGZpcnN0X2FkZHJlc3MsIHNlY29uZF9hZGRyZXNzKSA9PSAwKSB7CisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfVU5TVVBQT1JURURfUE9SVF9DT05GSUdVUkFUSU9OOworCQl9CisJfQorCisJLyoKKwkgKiBQRTIgYW5kIFBFMyBhcmUgY29uZmlndXJlZCBpbnRvIGEgMngxIHBvcnRzIG1ha2Ugc3VyZSB0aGF0IHRoZQorCSAqIFNBUyBBZGRyZXNzIGZvciBQRTEgYW5kIFBFMyBhcmUgZGlmZmVyZW50IHNpbmNlIHRoZXkgY2FuIG5vdCBiZQorCSAqIHBhcnQgb2YgdGhlIHNhbWUgcG9ydC4gKi8KKwlpZiAocG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbMl0ubWluX2luZGV4ID09IDIgJiYKKwkgICAgcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbM10ubWluX2luZGV4ID09IDMpIHsKKwkJc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoJmlob3N0LT5waHlzWzFdLCAmZmlyc3RfYWRkcmVzcyk7CisJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1szXSwgJnNlY29uZF9hZGRyZXNzKTsKKworCQlpZiAoc2NpX3Nhc19hZGRyZXNzX2NvbXBhcmUoZmlyc3RfYWRkcmVzcywgc2Vjb25kX2FkZHJlc3MpID09IDApIHsKKwkJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QT1JUX0NPTkZJR1VSQVRJT047CisJCX0KKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hbnVhbCBwb3J0IGNvbmZpZ3VyYXRpb24gYWdlbnQgcm91dGluZXMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiB2ZXJpZnkgYWxsIG9mIHRoZSBwaHlzIGluIHRoZSBzYW1lIHBvcnQgYXJlIHVzaW5nIHRoZSBzYW1lIFNBUyBhZGRyZXNzICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzY2lfbXBjX2FnZW50X3ZhbGlkYXRlX3BoeV9jb25maWd1cmF0aW9uKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICAgICBzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCkKK3sKKwl1MzIgcGh5X21hc2s7CisJdTMyIGFzc2lnbmVkX3BoeV9tYXNrOworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3Mgc2FzX2FkZHJlc3M7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBwaHlfYXNzaWduZWRfYWRkcmVzczsKKwl1OCBwb3J0X2luZGV4OworCXU4IHBoeV9pbmRleDsKKworCWFzc2lnbmVkX3BoeV9tYXNrID0gMDsKKwlzYXNfYWRkcmVzcy5oaWdoID0gMDsKKwlzYXNfYWRkcmVzcy5sb3cgPSAwOworCisJZm9yIChwb3J0X2luZGV4ID0gMDsgcG9ydF9pbmRleCA8IFNDSV9NQVhfUE9SVFM7IHBvcnRfaW5kZXgrKykgeworCQlwaHlfbWFzayA9IGlob3N0LT5vZW1fcGFyYW1ldGVycy5wb3J0c1twb3J0X2luZGV4XS5waHlfbWFzazsKKworCQlpZiAoIXBoeV9tYXNrKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGF0IG9uZSBvciBtb3JlIG9mIHRoZSBwaHlzIHdlcmUgbm90IGFscmVhZHkgYXNzaW5nZWQgdG8KKwkJICogYSBkaWZmZXJlbnQgcG9ydC4gKi8KKwkJaWYgKChwaHlfbWFzayAmIH5hc3NpZ25lZF9waHlfbWFzaykgPT0gMCkgeworCQkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTjsKKwkJfQorCisJCS8qIEZpbmQgdGhlIHN0YXJ0aW5nIHBoeSBpbmRleCBmb3IgdGhpcyByb3VuZCB0aHJvdWdoIHRoZSBsb29wICovCisJCWZvciAocGh5X2luZGV4ID0gMDsgcGh5X2luZGV4IDwgU0NJX01BWF9QSFlTOyBwaHlfaW5kZXgrKykgeworCQkJaWYgKChwaHlfbWFzayAmICgxIDw8IHBoeV9pbmRleCkpID09IDApCisJCQkJY29udGludWU7CisJCQlzY2lfcGh5X2dldF9zYXNfYWRkcmVzcygmaWhvc3QtPnBoeXNbcGh5X2luZGV4XSwKKwkJCQkJCSAgICAgJnNhc19hZGRyZXNzKTsKKworCQkJLyoKKwkJCSAqIFRoZSBwaHlfaW5kZXggY2FuIGJlIHVzZWQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUKKwkJCSAqIHBvcnQgcmFuZ2Ugc2luY2UgdGhlIGhhcmR3YXJlIHN0YXJ0cyBhbGwgbG9naWNhbCBwb3J0cworCQkJICogdGhlIHNhbWUgYXMgdGhlIFBFIGluZGV4LiAqLworCQkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbcGh5X2luZGV4XS5taW5faW5kZXggPSBwb3J0X2luZGV4OworCQkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbcGh5X2luZGV4XS5tYXhfaW5kZXggPSBwaHlfaW5kZXg7CisKKwkJCWlmIChwaHlfaW5kZXggIT0gcG9ydF9pbmRleCkgeworCQkJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QT1JUX0NPTkZJR1VSQVRJT047CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogU2VlIGhvdyBtYW55IGFkZGl0aW9uYWwgcGh5cyBhcmUgYmVpbmcgYWRkZWQgdG8gdGhpcyBsb2dpY2FsIHBvcnQuCisJCSAqIE5vdGU6IFdlIGhhdmUgbm90IG1vdmVkIHRoZSBjdXJyZW50IHBoeV9pbmRleCBzbyB3ZSB3aWxsIGFjdHVhbGx5CisJCSAqICAgICAgIGNvbXBhcmUgdGhlIHN0YXJ0dGluZyBwaHkgd2l0aCBpdHNlbGYuCisJCSAqICAgICAgIFRoaXMgaXMgZXhwZWN0ZWQgYW5kIHJlcXVpcmVkIHRvIGFkZCB0aGUgcGh5IHRvIHRoZSBwb3J0LiAqLworCQl3aGlsZSAocGh5X2luZGV4IDwgU0NJX01BWF9QSFlTKSB7CisJCQlpZiAoKHBoeV9tYXNrICYgKDEgPDwgcGh5X2luZGV4KSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXNjaV9waHlfZ2V0X3Nhc19hZGRyZXNzKCZpaG9zdC0+cGh5c1twaHlfaW5kZXhdLAorCQkJCQkJICAgICAmcGh5X2Fzc2lnbmVkX2FkZHJlc3MpOworCisJCQlpZiAoc2NpX3Nhc19hZGRyZXNzX2NvbXBhcmUoc2FzX2FkZHJlc3MsIHBoeV9hc3NpZ25lZF9hZGRyZXNzKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgcGh5IG1hc2sgc3BlY2lmaWVkIHRoYXQgdGhpcyBwaHkgaXMgcGFydCBvZiB0aGUgc2FtZSBwb3J0CisJCQkJICogYXMgdGhlIHN0YXJ0aW5nIHBoeSBhbmQgaXQgaXMgbm90IHNvIGZhaWwgdGhpcyBjb25maWd1cmF0aW9uICovCisJCQkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BPUlRfQ09ORklHVVJBVElPTjsKKwkJCX0KKworCQkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbcGh5X2luZGV4XS5taW5faW5kZXggPSBwb3J0X2luZGV4OworCQkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbcGh5X2luZGV4XS5tYXhfaW5kZXggPSBwaHlfaW5kZXg7CisKKwkJCXNjaV9wb3J0X2FkZF9waHkoJmlob3N0LT5wb3J0c1twb3J0X2luZGV4XSwKKwkJCQkJICAgICAgJmlob3N0LT5waHlzW3BoeV9pbmRleF0pOworCisJCQlhc3NpZ25lZF9waHlfbWFzayB8PSAoMSA8PCBwaHlfaW5kZXgpOworCQl9CisKKwkJcGh5X2luZGV4Kys7CisJfQorCisJcmV0dXJuIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfdmFsaWRhdGVfcG9ydHMoaWhvc3QsIHBvcnRfYWdlbnQpOworfQorCitzdGF0aWMgdm9pZCBtcGNfYWdlbnRfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdTggaW5kZXg7CisJc3RydWN0IHNjaV90aW1lciAqdG1yID0gKHN0cnVjdCBzY2lfdGltZXIgKilkYXRhOworCXN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50OworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IGNvbmZpZ3VyZV9waHlfbWFzazsKKworCXBvcnRfYWdlbnQgPSBjb250YWluZXJfb2YodG1yLCB0eXBlb2YoKnBvcnRfYWdlbnQpLCB0aW1lcik7CisJaWhvc3QgPSBjb250YWluZXJfb2YocG9ydF9hZ2VudCwgdHlwZW9mKCppaG9zdCksIHBvcnRfYWdlbnQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmICh0bXItPmNhbmNlbCkKKwkJZ290byBkb25lOworCisJcG9ydF9hZ2VudC0+dGltZXJfcGVuZGluZyA9IGZhbHNlOworCisJLyogRmluZCB0aGUgbWFzayBvZiBwaHlzIHRoYXQgYXJlIHJlcG9ydGVkIHJlYWQgYnV0IGFzIHlldCB1bmNvbmZpZ3VyZWQgaW50byBhIHBvcnQgKi8KKwljb25maWd1cmVfcGh5X21hc2sgPSB+cG9ydF9hZ2VudC0+cGh5X2NvbmZpZ3VyZWRfbWFzayAmIHBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CisJCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9ICZpaG9zdC0+cGh5c1tpbmRleF07CisKKwkJaWYgKGNvbmZpZ3VyZV9waHlfbWFzayAmICgxIDw8IGluZGV4KSkgeworCQkJcG9ydF9hZ2VudC0+bGlua191cF9oYW5kbGVyKGlob3N0LCBwb3J0X2FnZW50LAorCQkJCQkJICAgIHBoeV9nZXRfbm9uX2R1bW15X3BvcnQoaXBoeSksCisJCQkJCQkgICAgaXBoeSk7CisJCX0KKwl9CisKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzY2lfbXBjX2FnZW50X2xpbmtfdXAoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJICAgICAgIHN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50LAorCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgICAgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5KQoreworCS8qIElmIHRoZSBwb3J0IGlzIE5VTEwgdGhlbiB0aGUgcGh5IHdhcyBub3QgYXNzaWduZWQgdG8gYSBwb3J0LgorCSAqIFRoaXMgaXMgYmVjYXVzZSB0aGUgcGh5IHdhcyBub3QgZ2l2ZW4gdGhlIHNhbWUgU0FTIEFkZHJlc3MgYXMKKwkgKiB0aGUgb3RoZXIgUEhZcyBpbiB0aGUgcG9ydC4KKwkgKi8KKwlpZiAoIWlwb3J0KQorCQlyZXR1cm47CisKKwlwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzayB8PSAoMSA8PCBpcGh5LT5waHlfaW5kZXgpOworCXNjaV9wb3J0X2xpbmtfdXAoaXBvcnQsIGlwaHkpOworCWlmICgoaXBvcnQtPmFjdGl2ZV9waHlfbWFzayAmICgxIDw8IGlwaHktPnBoeV9pbmRleCkpKQorCQlwb3J0X2FnZW50LT5waHlfY29uZmlndXJlZF9tYXNrIHw9ICgxIDw8IGlwaHktPnBoeV9pbmRleCk7Cit9CisKKy8qKgorICoKKyAqIEBjb250cm9sbGVyOiBUaGlzIGlzIHRoZSBjb250cm9sbGVyIG9iamVjdCB0aGF0IHJlY2VpdmVzIHRoZSBsaW5rIGRvd24KKyAqICAgIG5vdGlmaWNhdGlvbi4KKyAqIEBwb3J0OiBUaGlzIGlzIHRoZSBwb3J0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBoeS4gIElmIHRoZSBpcyBubworICogICAgYXNzb2NpYXRlZCBwb3J0IHRoaXMgaXMgYW4gTlVMTC4gIFRoZSBwb3J0IGlzIGFuIGludmFsaWQKKyAqICAgIGhhbmRsZSBvbmx5IGlmIHRoZSBwaHkgd2FzIG5ldmVyIHBvcnQgb2YgdGhpcyBwb3J0LiAgVGhpcyBoYXBwZW5zIHdoZW4KKyAqICAgIHRoZSBwaHkgaXMgbm90IGJyb2FkY2FzdGluZyB0aGUgc2FtZSBTQVMgYWRkcmVzcyBhcyB0aGUgb3RoZXIgcGh5cyBpbiB0aGUKKyAqICAgIGFzc2lnbmVkIHBvcnQuCisgKiBAcGh5OiBUaGlzIGlzIHRoZSBwaHkgb2JqZWN0IHdoaWNoIGhhcyBnb25lIGxpbmsgZG93bi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIG1hbnVhbCBwb3J0IGNvbmZpZ3VyYXRpb24gbGluayBkb3duIG5vdGlmaWNhdGlvbnMuCisgKiBTaW5jZSBhbGwgcG9ydHMgYW5kIHBoeXMgYXJlIGFzc29jaWF0ZWQgYXQgaW5pdGlhbGl6YXRpb24gdGltZSB3ZSBqdXN0IHR1cm4KKyAqIGFyb3VuZCBhbmQgbm90aWZpeSB0aGUgcG9ydCBvYmplY3Qgb2YgdGhlIGxpbmsgZG93biBldmVudC4gIElmIHRoaXMgUEhZIGlzCisgKiBub3QgYXNzb2NpYXRlZCB3aXRoIGEgcG9ydCB0aGVyZSBpcyBubyBhY3Rpb24gdGFrZW4uIElzIGl0IHBvc3NpYmxlIHRvIGdldCBhCisgKiBsaW5rIGRvd24gbm90aWZpY2F0aW9uIGZyb20gYSBwaHkgdGhhdCBoYXMgbm8gYXNzb2NvYXRlZCBwb3J0PworICovCitzdGF0aWMgdm9pZCBzY2lfbXBjX2FnZW50X2xpbmtfZG93bigKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJaWYgKGlwb3J0ICE9IE5VTEwpIHsKKwkJLyoKKwkJICogSWYgd2UgY2FuIGZvcm0gYSBuZXcgcG9ydCBmcm9tIHRoZSByZW1haW5kZXIgb2YgdGhlIHBoeXMKKwkJICogdGhlbiB3ZSB3YW50IHRvIHN0YXJ0IHRoZSB0aW1lciB0byBhbGxvdyB0aGUgU0NJIFVzZXIgdG8KKwkJICogY2xlYW51cCBvbGQgZGV2aWNlcyBhbmQgcmVkaXNjb3ZlciB0aGUgcG9ydCBiZWZvcmUKKwkJICogcmVidWlsZGluZyB0aGUgcG9ydCB3aXRoIHRoZSBwaHlzIHRoYXQgcmVtYWluIGluIHRoZSByZWFkeQorCQkgKiBzdGF0ZS4KKwkJICovCisJCXBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrICY9IH4oMSA8PCBpcGh5LT5waHlfaW5kZXgpOworCQlwb3J0X2FnZW50LT5waHlfY29uZmlndXJlZF9tYXNrICY9IH4oMSA8PCBpcGh5LT5waHlfaW5kZXgpOworCisJCS8qCisJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgbW9yZSBwaHlzIHdhaXRpbmcgdG8gYmUKKwkJICogY29uZmlndXJlZCBpbnRvIGEgcG9ydC4gSWYgdGhlcmUgYXJlIGFsbG93IHRoZSBTQ0kgVXNlcgorCQkgKiB0byB0ZWFyIGRvd24gdGhpcyBwb3J0LCBpZiBuZWNlc3NhcnksIGFuZCB0aGVuIHJlY29uc3RydWN0CisJCSAqIHRoZSBwb3J0IGFmdGVyIHRoZSB0aW1lb3V0LgorCQkgKi8KKwkJaWYgKChwb3J0X2FnZW50LT5waHlfY29uZmlndXJlZF9tYXNrID09IDB4MDAwMCkgJiYKKwkJICAgIChwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzayAhPSAweDAwMDApICYmCisJCSAgICAhcG9ydF9hZ2VudC0+dGltZXJfcGVuZGluZykgeworCQkJcG9ydF9hZ2VudC0+dGltZXJfcGVuZGluZyA9IHRydWU7CisKKwkJCXNjaV9tb2RfdGltZXIoJnBvcnRfYWdlbnQtPnRpbWVyLAorCQkJCSAgICAgIFNDSUNfU0RTX01QQ19SRUNPTkZJR1VSQVRJT05fVElNRU9VVCk7CisJCX0KKworCQlzY2lfcG9ydF9saW5rX2Rvd24oaXBvcnQsIGlwaHkpOworCX0KK30KKworLyogdmVyaWZ5IHBoeXMgYXJlIGFzc2lnbmVkIGEgdmFsaWQgU0FTIGFkZHJlc3MgZm9yIGF1dG9tYXRpYyBwb3J0CisgKiBjb25maWd1cmF0aW9uIG1vZGUuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NjaV9hcGNfYWdlbnRfdmFsaWRhdGVfcGh5X2NvbmZpZ3VyYXRpb24oc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgIHN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50KQoreworCXU4IHBoeV9pbmRleDsKKwl1OCBwb3J0X2luZGV4OworCXN0cnVjdCBzY2lfc2FzX2FkZHJlc3Mgc2FzX2FkZHJlc3M7CisJc3RydWN0IHNjaV9zYXNfYWRkcmVzcyBwaHlfYXNzaWduZWRfYWRkcmVzczsKKworCXBoeV9pbmRleCA9IDA7CisKKwl3aGlsZSAocGh5X2luZGV4IDwgU0NJX01BWF9QSFlTKSB7CisJCXBvcnRfaW5kZXggPSBwaHlfaW5kZXg7CisKKwkJLyogR2V0IHRoZSBhc3NpZ25lZCBTQVMgQWRkcmVzcyBmb3IgdGhlIGZpcnN0IFBIWSBvbiB0aGUgY29udHJvbGxlci4gKi8KKwkJc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoJmlob3N0LT5waHlzW3BoeV9pbmRleF0sCisJCQkJCSAgICAmc2FzX2FkZHJlc3MpOworCisJCXdoaWxlICgrK3BoeV9pbmRleCA8IFNDSV9NQVhfUEhZUykgeworCQkJc2NpX3BoeV9nZXRfc2FzX2FkZHJlc3MoJmlob3N0LT5waHlzW3BoeV9pbmRleF0sCisJCQkJCQkgICAgICZwaHlfYXNzaWduZWRfYWRkcmVzcyk7CisKKwkJCS8qIFZlcmlmeSBlYWNoIG9mIHRoZSBTQVMgYWRkcmVzcyBhcmUgYWxsIHRoZSBzYW1lIGZvciBldmVyeSBQSFkgKi8KKwkJCWlmIChzY2lfc2FzX2FkZHJlc3NfY29tcGFyZShzYXNfYWRkcmVzcywgcGh5X2Fzc2lnbmVkX2FkZHJlc3MpID09IDApIHsKKwkJCQlwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVtwaHlfaW5kZXhdLm1pbl9pbmRleCA9IHBvcnRfaW5kZXg7CisJCQkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbcGh5X2luZGV4XS5tYXhfaW5kZXggPSBwaHlfaW5kZXg7CisJCQl9IGVsc2UgeworCQkJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW3BoeV9pbmRleF0ubWluX2luZGV4ID0gcGh5X2luZGV4OworCQkJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW3BoeV9pbmRleF0ubWF4X2luZGV4ID0gcGh5X2luZGV4OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfdmFsaWRhdGVfcG9ydHMoaWhvc3QsIHBvcnRfYWdlbnQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfYXBjX2FnZW50X2NvbmZpZ3VyZV9wb3J0cyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICAgIHN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50LAorCQkJCQkgICAgICAgc3RydWN0IGlzY2lfcGh5ICppcGh5LAorCQkJCQkgICAgICAgYm9vbCBzdGFydF90aW1lcikKK3sKKwl1OCBwb3J0X2luZGV4OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQ7CisJZW51bSBTQ0lDX1NEU19BUENfQUNUSVZJVFkgYXBjX2FjdGl2aXR5ID0gU0NJQ19TRFNfQVBDX1NLSVBfUEhZOworCisJaXBvcnQgPSBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X2ZpbmRfcG9ydChpaG9zdCwgaXBoeSk7CisKKwlpZiAoaXBvcnQpIHsKKwkJaWYgKHNjaV9wb3J0X2lzX3ZhbGlkX3BoeV9hc3NpZ25tZW50KGlwb3J0LCBpcGh5LT5waHlfaW5kZXgpKQorCQkJYXBjX2FjdGl2aXR5ID0gU0NJQ19TRFNfQVBDX0FERF9QSFk7CisJCWVsc2UKKwkJCWFwY19hY3Rpdml0eSA9IFNDSUNfU0RTX0FQQ19TS0lQX1BIWTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGVyZSBpcyBubyBtYXRjaGluZyBQb3J0IGZvciB0aGlzIFBIWSBzbyBsZXRzIHNlYXJjaCB0aHJvdWdoIHRoZQorCQkgKiBQb3J0cyBhbmQgc2VlIGlmIHdlIGNhbiBhZGQgdGhlIFBIWSB0byBpdHMgb3duIHBvcnQgb3IgbWF5YmUgc3RhcnQKKwkJICogdGhlIHRpbWVyIGFuZCB3YWl0IHRvIHNlZSBpZiBhIHdpZGVyIHBvcnQgY2FuIGJlIG1hZGUuCisJCSAqCisJCSAqIE5vdGUgdGhlIGJyZWFrIHdoZW4gd2UgcmVhY2ggdGhlIGNvbmRpdGlvbiBvZiB0aGUgcG9ydCBpZCA9PSBwaHkgaWQgKi8KKwkJZm9yIChwb3J0X2luZGV4ID0gcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbaXBoeS0+cGh5X2luZGV4XS5taW5faW5kZXg7CisJCSAgICAgcG9ydF9pbmRleCA8PSBwb3J0X2FnZW50LT5waHlfdmFsaWRfcG9ydF9yYW5nZVtpcGh5LT5waHlfaW5kZXhdLm1heF9pbmRleDsKKwkJICAgICBwb3J0X2luZGV4KyspIHsKKworCQkJaXBvcnQgPSAmaWhvc3QtPnBvcnRzW3BvcnRfaW5kZXhdOworCisJCQkvKiBGaXJzdCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoaXMgUEhZIGNhbiBiZSBhZGRlZCB0byB0aGlzIFBvcnQuICovCisJCQlpZiAoc2NpX3BvcnRfaXNfdmFsaWRfcGh5X2Fzc2lnbm1lbnQoaXBvcnQsIGlwaHktPnBoeV9pbmRleCkpIHsKKwkJCQkvKgorCQkJCSAqIFBvcnQgY29udGFpbnMgYSBQSFkgd2l0aCBhIGdyZWF0ZXIgUEhZIElEIHRoYW4gdGhlIGN1cnJlbnQKKwkJCQkgKiBQSFkgdGhhdCBoYXMgZ29uZSBsaW5rIHVwLiAgVGhpcyBwaHkgY2FuIG5vdCBiZSBwYXJ0IG9mIGFueQorCQkJCSAqIHBvcnQgc28gc2tpcCBpdCBhbmQgbW92ZSBvbi4gKi8KKwkJCQlpZiAoaXBvcnQtPmFjdGl2ZV9waHlfbWFzayA+ICgxIDw8IGlwaHktPnBoeV9pbmRleCkpIHsKKwkJCQkJYXBjX2FjdGl2aXR5ID0gU0NJQ19TRFNfQVBDX1NLSVBfUEhZOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIFdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIG91ciBQb3J0IGxpc3QgYW5kIGhhdmUgbm90IGZvdW5kCisJCQkJICogYW55IHJlYXNvbiB3aHkgd2Ugc2hvdWxkIG5vdCBlaXRoZXIgYWRkIHRoZSBQSFkgdG8gdGhlIHBvcnQKKwkJCQkgKiBvciB3YWl0IGZvciBtb3JlIHBoeXMgdG8gYmVjb21lIGFjdGl2ZS4gKi8KKwkJCQlpZiAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPT0gaXBoeS0+cGh5X2luZGV4KSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBQb3J0IGVpdGhlciBoYXMgbm8gYWN0aXZlIFBIWXMuCisJCQkJCSAqIENvbnNpZGVyIHRoYXQgaWYgdGhlIHBvcnQgaGFkIGFueSBhY3RpdmUgUEhZcyB3ZSB3b3VsZCBoYXZlCisJCQkJCSAqIG9yIGFjdGl2ZSBQSFlzIHdpdGgKKwkJCQkJICogYSBsb3dlciBQSFkgSWQgdGhhbiB0aGlzIFBIWS4gKi8KKwkJCQkJaWYgKGFwY19hY3Rpdml0eSAhPSBTQ0lDX1NEU19BUENfU1RBUlRfVElNRVIpIHsKKwkJCQkJCWFwY19hY3Rpdml0eSA9IFNDSUNfU0RTX0FQQ19BRERfUEhZOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBUaGUgY3VycmVudCBQb3J0IGhhcyBubyBhY3RpdmUgUEhZcyBhbmQgdGhpcyBQSFkgY291bGQgYmUgcGFydAorCQkJCSAqIG9mIHRoaXMgUG9ydC4gIFNpbmNlIHdlIGRvbnQga25vdyBhcyB5ZXQgc2V0dXAgdG8gc3RhcnQgdGhlCisJCQkJICogdGltZXIgYW5kIHNlZSBpZiB0aGVyZSBpcyBhIGJldHRlciBjb25maWd1cmF0aW9uLiAqLworCQkJCWlmIChpcG9ydC0+YWN0aXZlX3BoeV9tYXNrID09IDApIHsKKwkJCQkJYXBjX2FjdGl2aXR5ID0gU0NJQ19TRFNfQVBDX1NUQVJUX1RJTUVSOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoaXBvcnQtPmFjdGl2ZV9waHlfbWFzayAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgUG9ydCBoYXMgYW4gYWN0aXZlIHBoeSBhbmQgdGhlIGN1cnJlbnQgUGh5IGNhbiBub3QKKwkJCQkgKiBwYXJ0aWNpcGF0ZSBpbiB0aGlzIHBvcnQgc28gc2tpcCB0aGUgUEhZIGFuZCBzZWUgaWYKKwkJCQkgKiB0aGVyZSBpcyBhIGJldHRlciBjb25maWd1cmF0aW9uLiAqLworCQkJCWFwY19hY3Rpdml0eSA9IFNDSUNfU0RTX0FQQ19TS0lQX1BIWTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzdGFydCB0aW1lciBvcGVyYXRpb25zIHNob3VsZCBpbnN0ZWFkIG1hcCB0byBhbgorCSAqIGFkZCBwaHkgb3BlcmF0aW9uLiAgVGhpcyBpcyBjYXVzZWQgYmVjYXVzZSB3ZSBoYXZlIGJlZW4gd2FpdGluZyB0bworCSAqIGFkZCBhIHBoeSB0byBhIHBvcnQgYnV0IGNvdWxkIG5vdCBiZWN1YXNlIHRoZSBhdXRvbWF0aWMgcG9ydAorCSAqIGNvbmZpZ3VyYXRpb24gZW5naW5lIGhhZCBhIGNob2ljZSBvZiBwb3NzaWJsZSBwb3J0cyBmb3IgdGhlIHBoeS4KKwkgKiBTaW5jZSB3ZSBoYXZlIGdvbmUgdGhyb3VnaCBhIHRpbWVvdXQgd2UgYXJlIGdvaW5nIHRvIHJlc3RyaWN0IHRoZQorCSAqIGNob2ljZSB0byB0aGUgc21hbGxlc3QgcG9zc2libGUgcG9ydC4gKi8KKwlpZiAoCisJCShzdGFydF90aW1lciA9PSBmYWxzZSkKKwkJJiYgKGFwY19hY3Rpdml0eSA9PSBTQ0lDX1NEU19BUENfU1RBUlRfVElNRVIpCisJCSkgeworCQlhcGNfYWN0aXZpdHkgPSBTQ0lDX1NEU19BUENfQUREX1BIWTsKKwl9CisKKwlzd2l0Y2ggKGFwY19hY3Rpdml0eSkgeworCWNhc2UgU0NJQ19TRFNfQVBDX0FERF9QSFk6CisJCXN0YXR1cyA9IHNjaV9wb3J0X2FkZF9waHkoaXBvcnQsIGlwaHkpOworCisJCWlmIChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpIHsKKwkJCXBvcnRfYWdlbnQtPnBoeV9jb25maWd1cmVkX21hc2sgfD0gKDEgPDwgaXBoeS0+cGh5X2luZGV4KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0NJQ19TRFNfQVBDX1NUQVJUX1RJTUVSOgorCQkvKgorCQkgKiBUaGlzIGNhbiBvY2N1ciBmb3IgZWl0aGVyIGEgbGluayBkb3duIGV2ZW50LCBvciBhIGxpbmsKKwkJICogdXAgZXZlbnQgd2hlcmUgd2UgY2Fubm90IHlldCB0ZWxsIHRoZSBwb3J0IHRvIHdoaWNoIGEKKwkJICogcGh5IGJlbG9uZ3MuCisJCSAqLworCQlpZiAocG9ydF9hZ2VudC0+dGltZXJfcGVuZGluZykKKwkJCXNjaV9kZWxfdGltZXIoJnBvcnRfYWdlbnQtPnRpbWVyKTsKKworCQlwb3J0X2FnZW50LT50aW1lcl9wZW5kaW5nID0gdHJ1ZTsKKwkJc2NpX21vZF90aW1lcigmcG9ydF9hZ2VudC0+dGltZXIsCisJCQkgICAgICBTQ0lDX1NEU19BUENfV0FJVF9MSU5LX1VQX05PVElGSUNBVElPTik7CisJCWJyZWFrOworCisJY2FzZSBTQ0lDX1NEU19BUENfU0tJUF9QSFk6CisJZGVmYXVsdDoKKwkJLyogZG8gbm90aGluZyB0aGUgUEhZIGNhbiBub3QgYmUgbWFkZSBwYXJ0IG9mIGEgcG9ydCBhdCB0aGlzIHRpbWUuICovCisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBzY2lfYXBjX2FnZW50X2xpbmtfdXAgLSBoYW5kbGUgYXBjIGxpbmsgdXAgZXZlbnRzCisgKiBAc2NpYzogVGhpcyBpcyB0aGUgY29udHJvbGxlciBvYmplY3QgdGhhdCByZWNlaXZlcyB0aGUgbGluayB1cAorICogICAgbm90aWZpY2F0aW9uLgorICogQHNjaV9wb3J0OiBUaGlzIGlzIHRoZSBwb3J0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBoeS4gIElmIHRoZSBpcyBubworICogICAgYXNzb2NpYXRlZCBwb3J0IHRoaXMgaXMgYW4gTlVMTC4KKyAqIEBzY2lfcGh5OiBUaGlzIGlzIHRoZSBwaHkgb2JqZWN0IHdoaWNoIGhhcyBnb25lIGxpbmsgdXAuCisgKgorICogVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgYXV0b21hdGljIHBvcnQgY29uZmlndXJhdGlvbiBmb3IgbGluayB1cAorICogbm90aWZpY2F0aW9ucy4gSXMgaXQgcG9zc2libGUgdG8gZ2V0IGEgbGluayBkb3duIG5vdGlmaWNhdGlvbiBmcm9tIGEgcGh5CisgKiB0aGF0IGhhcyBubyBhc3NvY29hdGVkIHBvcnQ/CisgKi8KK3N0YXRpYyB2b2lkIHNjaV9hcGNfYWdlbnRfbGlua191cChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgICAgc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgKnBvcnRfYWdlbnQsCisJCQkJICAgICAgIHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJdTggcGh5X2luZGV4ICA9IGlwaHktPnBoeV9pbmRleDsKKworCWlmICghaXBvcnQpIHsKKwkJLyogdGhlIHBoeSBpcyBub3QgdGhlIHBhcnQgb2YgdGhpcyBwb3J0ICovCisJCXBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrIHw9IDEgPDwgcGh5X2luZGV4OworCQlzY2lfYXBjX2FnZW50X2NvbmZpZ3VyZV9wb3J0cyhpaG9zdCwgcG9ydF9hZ2VudCwgaXBoeSwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJLyogdGhlIHBoeSBpcyBhbHJlYWR5IHRoZSBwYXJ0IG9mIHRoZSBwb3J0ICovCisJCXUzMiBwb3J0X3N0YXRlID0gaXBvcnQtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwkJLyogaWYgdGhlIFBPUlQnUyBzdGF0ZSBpcyByZXNldHRpbmcgdGhlbiB0aGUgbGluayB1cCBpcyBmcm9tCisJCSAqIHBvcnQgaGFyZCByZXNldCBpbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gdGVsbCB0aGUgcG9ydAorCQkgKiB0aGF0IGxpbmsgdXAgaXMgcmVjaWV2ZWQKKwkJICovCisJCUJVR19PTihwb3J0X3N0YXRlICE9IFNDSV9QT1JUX1JFU0VUVElORyk7CisJCXBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrIHw9IDEgPDwgcGh5X2luZGV4OworCQlzY2lfcG9ydF9saW5rX3VwKGlwb3J0LCBpcGh5KTsKKwl9Cit9CisKKy8qKgorICoKKyAqIEBjb250cm9sbGVyOiBUaGlzIGlzIHRoZSBjb250cm9sbGVyIG9iamVjdCB0aGF0IHJlY2VpdmVzIHRoZSBsaW5rIGRvd24KKyAqICAgIG5vdGlmaWNhdGlvbi4KKyAqIEBpcG9ydDogVGhpcyBpcyB0aGUgcG9ydCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwaHkuICBJZiB0aGUgaXMgbm8KKyAqICAgIGFzc29jaWF0ZWQgcG9ydCB0aGlzIGlzIGFuIE5VTEwuCisgKiBAaXBoeTogVGhpcyBpcyB0aGUgcGh5IG9iamVjdCB3aGljaCBoYXMgZ29uZSBsaW5rIGRvd24uCisgKgorICogVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgYXV0b21hdGljIHBvcnQgY29uZmlndXJhdGlvbiBsaW5rIGRvd24KKyAqIG5vdGlmaWNhdGlvbnMuIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwb3J0IHRoZXJlIGlzIG5vIGFjdGlvbiB0YWtlbi4gSXMgaXQKKyAqIHBvc3NpYmxlIHRvIGdldCBhIGxpbmsgZG93biBub3RpZmljYXRpb24gZnJvbSBhIHBoeSB0aGF0IGhhcyBubyBhc3NvY29hdGVkCisgKiBwb3J0PworICovCitzdGF0aWMgdm9pZCBzY2lfYXBjX2FnZW50X2xpbmtfZG93bigKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCwKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCit7CisJcG9ydF9hZ2VudC0+cGh5X3JlYWR5X21hc2sgJj0gfigxIDw8IGlwaHktPnBoeV9pbmRleCk7CisKKwlpZiAoIWlwb3J0KQorCQlyZXR1cm47CisJaWYgKHBvcnRfYWdlbnQtPnBoeV9jb25maWd1cmVkX21hc2sgJiAoMSA8PCBpcGh5LT5waHlfaW5kZXgpKSB7CisJCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwkJc3RhdHVzID0gc2NpX3BvcnRfcmVtb3ZlX3BoeShpcG9ydCwgaXBoeSk7CisKKwkJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykKKwkJCXBvcnRfYWdlbnQtPnBoeV9jb25maWd1cmVkX21hc2sgJj0gfigxIDw8IGlwaHktPnBoeV9pbmRleCk7CisJfQorfQorCisvKiBjb25maWd1cmUgdGhlIHBoeXMgaW50byBwb3J0cyB3aGVuIHRoZSB0aW1lciBmaXJlcyAqLworc3RhdGljIHZvaWQgYXBjX2FnZW50X3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXUzMiBpbmRleDsKKwlzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIgPSAoc3RydWN0IHNjaV90aW1lciAqKWRhdGE7CisJc3RydWN0IHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnQgKnBvcnRfYWdlbnQ7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgY29uZmlndXJlX3BoeV9tYXNrOworCisJcG9ydF9hZ2VudCA9IGNvbnRhaW5lcl9vZih0bXIsIHR5cGVvZigqcG9ydF9hZ2VudCksIHRpbWVyKTsKKwlpaG9zdCA9IGNvbnRhaW5lcl9vZihwb3J0X2FnZW50LCB0eXBlb2YoKmlob3N0KSwgcG9ydF9hZ2VudCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKHRtci0+Y2FuY2VsKQorCQlnb3RvIGRvbmU7CisKKwlwb3J0X2FnZW50LT50aW1lcl9wZW5kaW5nID0gZmFsc2U7CisKKwljb25maWd1cmVfcGh5X21hc2sgPSB+cG9ydF9hZ2VudC0+cGh5X2NvbmZpZ3VyZWRfbWFzayAmIHBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrOworCisJaWYgKCFjb25maWd1cmVfcGh5X21hc2spCisJCXJldHVybjsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgeworCQlpZiAoKGNvbmZpZ3VyZV9waHlfbWFzayAmICgxIDw8IGluZGV4KSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXNjaV9hcGNfYWdlbnRfY29uZmlndXJlX3BvcnRzKGlob3N0LCBwb3J0X2FnZW50LAorCQkJCQkJICAgJmlob3N0LT5waHlzW2luZGV4XSwgZmFsc2UpOworCX0KKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFB1YmxpYyBwb3J0IGNvbmZpZ3VyYXRpb24gYWdlbnQgcm91dGluZXMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKioKKyAqCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBjb25zdHJ1Y3QgdGhlIHBvcnQgY29uZmlndXJhdGlvbiBhZ2VudCBmb3Igb3BlcmF0aW9uLiBUaGlzCisgKiBjYWxsIGlzIHVuaXZlcnNhbCBmb3IgYm90aCBtYW51YWwgcG9ydCBjb25maWd1cmF0aW9uIGFuZCBhdXRvbWF0aWMgcG9ydAorICogY29uZmlndXJhdGlvbiBtb2Rlcy4KKyAqLwordm9pZCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50X2NvbnN0cnVjdCgKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCkKK3sKKwl1MzIgaW5kZXg7CisKKwlwb3J0X2FnZW50LT5waHlfY29uZmlndXJlZF9tYXNrID0gMHgwMDsKKwlwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzayA9IDB4MDA7CisKKwlwb3J0X2FnZW50LT5saW5rX3VwX2hhbmRsZXIgPSBOVUxMOworCXBvcnRfYWdlbnQtPmxpbmtfZG93bl9oYW5kbGVyID0gTlVMTDsKKworCXBvcnRfYWdlbnQtPnRpbWVyX3BlbmRpbmcgPSBmYWxzZTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUE9SVFM7IGluZGV4KyspIHsKKwkJcG9ydF9hZ2VudC0+cGh5X3ZhbGlkX3BvcnRfcmFuZ2VbaW5kZXhdLm1pbl9pbmRleCA9IDA7CisJCXBvcnRfYWdlbnQtPnBoeV92YWxpZF9wb3J0X3JhbmdlW2luZGV4XS5tYXhfaW5kZXggPSAwOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfaW5pdGlhbGl6ZSgKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCWVudW0gc2NpX3BvcnRfY29uZmlndXJhdGlvbl9tb2RlIG1vZGU7CisKKwltb2RlID0gaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubW9kZV90eXBlOworCisJaWYgKG1vZGUgPT0gU0NJQ19QT1JUX01BTlVBTF9DT05GSUdVUkFUSU9OX01PREUpIHsKKwkJc3RhdHVzID0gc2NpX21wY19hZ2VudF92YWxpZGF0ZV9waHlfY29uZmlndXJhdGlvbigKKwkJCQlpaG9zdCwgcG9ydF9hZ2VudCk7CisKKwkJcG9ydF9hZ2VudC0+bGlua191cF9oYW5kbGVyID0gc2NpX21wY19hZ2VudF9saW5rX3VwOworCQlwb3J0X2FnZW50LT5saW5rX2Rvd25faGFuZGxlciA9IHNjaV9tcGNfYWdlbnRfbGlua19kb3duOworCisJCXNjaV9pbml0X3RpbWVyKCZwb3J0X2FnZW50LT50aW1lciwgbXBjX2FnZW50X3RpbWVvdXQpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IHNjaV9hcGNfYWdlbnRfdmFsaWRhdGVfcGh5X2NvbmZpZ3VyYXRpb24oCisJCQkJaWhvc3QsIHBvcnRfYWdlbnQpOworCisJCXBvcnRfYWdlbnQtPmxpbmtfdXBfaGFuZGxlciA9IHNjaV9hcGNfYWdlbnRfbGlua191cDsKKwkJcG9ydF9hZ2VudC0+bGlua19kb3duX2hhbmRsZXIgPSBzY2lfYXBjX2FnZW50X2xpbmtfZG93bjsKKworCQlzY2lfaW5pdF90aW1lcigmcG9ydF9hZ2VudC0+dGltZXIsIGFwY19hZ2VudF90aW1lb3V0KTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcHJvYmVfcm9tcy5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcHJvYmVfcm9tcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjQzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9wcm9iZV9yb21zLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKi8KKworLyogcHJvYmVfcm9tcyAtIHNjYW4gZm9yIG9lbSBwYXJhbWV0ZXJzICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxhc20vcHJvYmVfcm9tcy5oPgorCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInRhc2suaCIKKyNpbmNsdWRlICJwcm9iZV9yb21zLmgiCisKK3N0YXRpYyBlZmlfY2hhcjE2X3QgaXNjaV9lZml2YXJfbmFtZVtdID0geworCSdSJywgJ3MnLCAndCcsICdTJywgJ2MnLCAndScsICdPJworfTsKKworc3RydWN0IGlzY2lfb3JvbSAqaXNjaV9yZXF1ZXN0X29wcm9tKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXZvaWQgX19pb21lbSAqb3Byb20gPSBwY2lfbWFwX2Jpb3Nyb20ocGRldik7CisJc3RydWN0IGlzY2lfb3JvbSAqcm9tID0gTlVMTDsKKwlzaXplX3QgbGVuLCBpOworCWludCBqOworCWNoYXIgb2VtX3NpZ1s0XTsKKwlzdHJ1Y3QgaXNjaV9vZW1faGRyIG9lbV9oZHI7CisJdTggKnRtcCwgc3VtOworCisJaWYgKCFvcHJvbSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW4gPSBwY2lfYmlvc3JvbV9zaXplKHBkZXYpOworCXJvbSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnJvbSksIEdGUF9LRVJORUwpOworCWlmICghcm9tKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9yb21cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIHJvbTsgaSArPSBJU0NJX09FTV9TSUdfU0laRSkgeworCQltZW1jcHlfZnJvbWlvKG9lbV9zaWcsIG9wcm9tICsgaSwgSVNDSV9PRU1fU0lHX1NJWkUpOworCisJCS8qIHdlIHRoaW5rIHdlIGZvdW5kIHRoZSBPRU0gdGFibGUgKi8KKwkJaWYgKG1lbWNtcChvZW1fc2lnLCBJU0NJX09FTV9TSUcsIElTQ0lfT0VNX1NJR19TSVpFKSA9PSAwKSB7CisJCQlzaXplX3QgY29weV9sZW47CisKKwkJCW1lbWNweV9mcm9taW8oJm9lbV9oZHIsIG9wcm9tICsgaSwgc2l6ZW9mKG9lbV9oZHIpKTsKKworCQkJY29weV9sZW4gPSBtaW4ob2VtX2hkci5sZW4gLSBzaXplb2Yob2VtX2hkciksCisJCQkJICAgICAgIHNpemVvZigqcm9tKSk7CisKKwkJCW1lbWNweV9mcm9taW8ocm9tLAorCQkJCSAgICAgIG9wcm9tICsgaSArIHNpemVvZihvZW1faGRyKSwKKwkJCQkgICAgICBjb3B5X2xlbik7CisKKwkJCS8qIGNhbGN1bGF0ZSBjaGVja3N1bSAqLworCQkJdG1wID0gKHU4ICopJm9lbV9oZHI7CisJCQlmb3IgKGogPSAwLCBzdW0gPSAwOyBqIDwgc2l6ZW9mKG9lbV9oZHIpOyBqKyssIHRtcCsrKQorCQkJCXN1bSArPSAqdG1wOworCisJCQl0bXAgPSAodTggKilyb207CisJCQlmb3IgKGogPSAwOyBqIDwgc2l6ZW9mKCpyb20pOyBqKyssIHRtcCsrKQorCQkJCXN1bSArPSAqdG1wOworCisJCQlpZiAoc3VtICE9IDApIHsKKwkJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCQkgIk9FTSB0YWJsZSBjaGVja3N1bSBmYWlsZWRcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBrZWVwIGdvaW5nIGlmIHRoYXQncyBub3QgdGhlIG9lbSBwYXJhbSB0YWJsZSAqLworCQkJaWYgKG1lbWNtcChyb20tPmhkci5zaWduYXR1cmUsCisJCQkJICAgSVNDSV9ST01fU0lHLAorCQkJCSAgIElTQ0lfUk9NX1NJR19TSVpFKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJCSAiT0VNIHBhcmFtZXRlciB0YWJsZSBmb3VuZCBpbiBPUk9NXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPj0gbGVuKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm9wcm9tIHBhcnNlIGVycm9yXG4iKTsKKwkJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCByb20pOworCQlyb20gPSBOVUxMOworCX0KKwlwY2lfdW5tYXBfYmlvc3JvbShvcHJvbSk7CisKKwlyZXR1cm4gcm9tOworfQorCitlbnVtIHNjaV9zdGF0dXMgaXNjaV9wYXJzZV9vZW1fcGFyYW1ldGVycyhzdHJ1Y3Qgc2NpX29lbV9wYXJhbXMgKm9lbSwKKwkJCQkJICBzdHJ1Y3QgaXNjaV9vcm9tICpvcm9tLCBpbnQgc2N1X2luZGV4KQoreworCS8qIGNoZWNrIGZvciB2YWxpZCBpbnB1dHMgKi8KKwlpZiAoc2N1X2luZGV4IDwgMCB8fCBzY3VfaW5kZXggPj0gU0NJX01BWF9DT05UUk9MTEVSUyB8fAorCSAgICBzY3VfaW5kZXggPiBvcm9tLT5oZHIubnVtX2VsZW1lbnRzIHx8ICFvZW0pCisJCXJldHVybiAtRUlOVkFMOworCisJKm9lbSA9IG9yb20tPmN0cmxbc2N1X2luZGV4XTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlzY2lfb3JvbSAqaXNjaV9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQoreworCXN0cnVjdCBpc2NpX29yb20gKm9yb20gPSBOVUxMLCAqZGF0YTsKKwlpbnQgaSwgajsKKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmdywgSVNDSV9GV19OQU1FLCAmcGRldi0+ZGV2KSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChmdy0+c2l6ZSA8IHNpemVvZigqb3JvbSkpCisJCWdvdG8gb3V0OworCisJZGF0YSA9IChzdHJ1Y3QgaXNjaV9vcm9tICopZnctPmRhdGE7CisKKwlpZiAoc3RybmNtcChJU0NJX1JPTV9TSUcsIGRhdGEtPmhkci5zaWduYXR1cmUsCisJCSAgICBzdHJsZW4oSVNDSV9ST01fU0lHKSkgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlvcm9tID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIGZ3LT5zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9yb20pCisJCWdvdG8gb3V0OworCisJbWVtY3B5KG9yb20sIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisKKwlpZiAoaXNfYzAocGRldikpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBkZXByZWNhdGVkOiBvdmVycmlkZSBkZWZhdWx0IGFtcF9jb250cm9sIGZvciBwcmUtcHJlcHJvZHVjdGlvbgorCSAqIHNpbGljb24gcmV2aXNpb25zCisJICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3JvbS0+Y3RybCk7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUob3JvbS0+Y3RybFtpXS5waHlzKTsgaisrKSB7CisJCQlvcm9tLT5jdHJsW2ldLnBoeXNbal0uYWZlX3R4X2FtcF9jb250cm9sMCA9IDB4ZTdjMDM7CisJCQlvcm9tLT5jdHJsW2ldLnBoeXNbal0uYWZlX3R4X2FtcF9jb250cm9sMSA9IDB4ZTdjMDM7CisJCQlvcm9tLT5jdHJsW2ldLnBoeXNbal0uYWZlX3R4X2FtcF9jb250cm9sMiA9IDB4ZTdjMDM7CisJCQlvcm9tLT5jdHJsW2ldLnBoeXNbal0uYWZlX3R4X2FtcF9jb250cm9sMyA9IDB4ZTdjMDM7CisJCX0KKyBvdXQ6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gb3JvbTsKK30KKworc3RhdGljIHN0cnVjdCBlZmkgKmdldF9lZmkodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfRUZJCisJcmV0dXJuICZlZmk7CisjZWxzZQorCXJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0cnVjdCBpc2NpX29yb20gKmlzY2lfZ2V0X2VmaV92YXIoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwlzdHJ1Y3QgaXNjaV9vcm9tICpyb207CisJc3RydWN0IGlzY2lfb2VtX2hkciAqb2VtX2hkcjsKKwl1OCAqdG1wLCBzdW07CisJaW50IGo7CisJdW5zaWduZWQgbG9uZyBkYXRhX2xlbjsKKwl1OCAqZWZpX2RhdGE7CisJdTMyIGVmaV9hdHRyaWIgPSAwOworCisJZGF0YV9sZW4gPSAxMDI0OworCWVmaV9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIGRhdGFfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVmaV9kYXRhKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEVGSSBkYXRhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcm9tID0gKHN0cnVjdCBpc2NpX29yb20gKikoZWZpX2RhdGEgKyBzaXplb2Yoc3RydWN0IGlzY2lfb2VtX2hkcikpOworCisJaWYgKGdldF9lZmkoKSkKKwkJc3RhdHVzID0gZ2V0X2VmaSgpLT5nZXRfdmFyaWFibGUoaXNjaV9lZml2YXJfbmFtZSwKKwkJCQkJCSAmSVNDSV9FRklfVkVORE9SX0dVSUQsCisJCQkJCQkgJmVmaV9hdHRyaWIsCisJCQkJCQkgJmRhdGFfbGVuLAorCQkJCQkJIGVmaV9kYXRhKTsKKwllbHNlCisJCXN0YXR1cyA9IEVGSV9OT1RfRk9VTkQ7CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIlVuYWJsZSB0byBvYnRhaW4gRUZJIHZhciBkYXRhIGZvciBPRU0gcGFybXNcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlvZW1faGRyID0gKHN0cnVjdCBpc2NpX29lbV9oZHIgKillZmlfZGF0YTsKKworCWlmIChtZW1jbXAob2VtX2hkci0+c2lnLCBJU0NJX09FTV9TSUcsIElTQ0lfT0VNX1NJR19TSVpFKSAhPSAwKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIkludmFsaWQgT0VNIGhlYWRlciBzaWduYXR1cmVcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBjYWxjdWxhdGUgY2hlY2tzdW0gKi8KKwl0bXAgPSAodTggKillZmlfZGF0YTsKKwlmb3IgKGogPSAwLCBzdW0gPSAwOyBqIDwgKHNpemVvZigqb2VtX2hkcikgKyBzaXplb2YoKnJvbSkpOyBqKyssIHRtcCsrKQorCQlzdW0gKz0gKnRtcDsKKworCWlmIChzdW0gIT0gMCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJPRU0gdGFibGUgY2hlY2tzdW0gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKG1lbWNtcChyb20tPmhkci5zaWduYXR1cmUsCisJCSAgIElTQ0lfUk9NX1NJRywKKwkJICAgSVNDSV9ST01fU0lHX1NJWkUpICE9IDApIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSAiSW52YWxpZCBPRU0gdGFibGUgc2lnbmF0dXJlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHJvbTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Byb2JlX3JvbXMuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3Byb2JlX3JvbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzAwN2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcHJvYmVfcm9tcy5oCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfSVNDSV9QUk9CRV9ST01TX0hfCisjZGVmaW5lIF9JU0NJX1BST0JFX1JPTVNfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgImlzY2kuaCIKKworI2RlZmluZSBTQ0lDX1NEU19QQVJNX05PX1NQRUVEICAgMAorCisvKiBnZW5lcmF0aW9uIDEgKGkuZS4gMS41IEdiL3MpICovCisjZGVmaW5lIFNDSUNfU0RTX1BBUk1fR0VOMV9TUEVFRCAxCisKKy8qIGdlbmVyYXRpb24gMiAoaS5lLiAzLjAgR2IvcykgKi8KKyNkZWZpbmUgU0NJQ19TRFNfUEFSTV9HRU4yX1NQRUVEIDIKKworLyogZ2VuZXJhdGlvbiAzIChpLmUuIDYuMCBHYi9zKSAqLworI2RlZmluZSBTQ0lDX1NEU19QQVJNX0dFTjNfU1BFRUQgMworI2RlZmluZSBTQ0lDX1NEU19QQVJNX01BWF9TUEVFRCBTQ0lDX1NEU19QQVJNX0dFTjNfU1BFRUQKKworLyogcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgYnkgbW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBzY2lfdXNlcl9wYXJhbWV0ZXJzIHsKKwlzdHJ1Y3Qgc2NpX3BoeV91c2VyX3BhcmFtcyB7CisJCS8qKgorCQkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgTk9USUZZIChFTkFCTEUgU1BJTiBVUCkgcHJpbWl0aXZlCisJCSAqIGluc2VydGlvbiBmcmVxdWVuY3kgZm9yIHRoaXMgcGh5IGluZGV4LgorCQkgKi8KKwkJdTMyIG5vdGlmeV9lbmFibGVfc3Bpbl91cF9pbnNlcnRpb25fZnJlcXVlbmN5OworCisJCS8qKgorCQkgKiBUaGlzIG1ldGhvZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBEV09SRHMgd2l0aGluIHdoaWNoCisJCSAqIHRvIHRyYW5zbWl0IGEgc2luZ2xlIEFMSUdOIHByaW1pdGl2ZS4gIFRoaXMgdmFsdWUgYXBwbGllcyByZWdhcmRsZXNzCisJCSAqIG9mIHdoYXQgdHlwZSBvZiBkZXZpY2UgaXMgYXR0YWNoZWQgb3IgY29ubmVjdGlvbiBzdGF0ZS4gIEEgdmFsdWUgb2YKKwkJICogMCBpbmRpY2F0ZXMgdGhhdCBubyBBTElHTiBwcmltaXRpdmVzIHdpbGwgYmUgaW5zZXJ0ZWQuCisJCSAqLworCQl1MTYgYWxpZ25faW5zZXJ0aW9uX2ZyZXF1ZW5jeTsKKworCQkvKioKKwkJICogVGhpcyBtZXRob2Qgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgRFdPUkRzIHdpdGhpbiB3aGljaAorCQkgKiB0byB0cmFuc21pdCAyIEFMSUdOIHByaW1pdGl2ZXMuICBUaGlzIGFwcGxpZXMgZm9yIFNBUyBjb25uZWN0aW9ucworCQkgKiBvbmx5LiAgQSBtaW5pbXVtIHZhbHVlIG9mIDMgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZmllbGQuCisJCSAqLworCQl1MTYgaW5fY29ubmVjdGlvbl9hbGlnbl9pbnNlcnRpb25fZnJlcXVlbmN5OworCisJCS8qKgorCQkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbWF4aW11bSBzcGVlZCBnZW5lcmF0aW9uIHRvIGJlIHV0aWxpemVkCisJCSAqIGJ5IHBoeXMgaW4gdGhlIHN1cHBsaWVkIHBvcnQuCisJCSAqIC0gQSB2YWx1ZSBvZiAxIGluZGljYXRlcyBnZW5lcmF0aW9uIDEgKGkuZS4gMS41IEdiL3MpLgorCQkgKiAtIEEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgZ2VuZXJhdGlvbiAyIChpLmUuIDMuMCBHYi9zKS4KKwkJICogLSBBIHZhbHVlIG9mIDMgaW5kaWNhdGVzIGdlbmVyYXRpb24gMyAoaS5lLiA2LjAgR2IvcykuCisJCSAqLworCQl1OCBtYXhfc3BlZWRfZ2VuZXJhdGlvbjsKKworCX0gcGh5c1tTQ0lfTUFYX1BIWVNdOworCisJLyoqCisJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRpcmVjdCBhdHRhY2hlZCBkZXZpY2VzCisJICogdGhhdCBjYW4gaGF2ZSBwb3dlciBzdXBwbGllZCB0byB0aGVtIHNpbXVsdGFuZW91c2x5LgorCSAqLworCXU4IG1heF9udW1iZXJfY29uY3VycmVudF9kZXZpY2Vfc3Bpbl91cDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBhbGxvdyBhIHBoeSB0byBjb25zdW1lCisJICogcG93ZXIgYmVmb3JlIHlpZWxkaW5nIHRvIGFub3RoZXIgcGh5LgorCSAqCisJICovCisJdTggcGh5X3NwaW5fdXBfZGVsYXlfaW50ZXJ2YWw7CisKKwkvKioKKwkgKiBUaGVzZSB0aW1lciB2YWx1ZXMgc3BlY2lmaWVzIGhvdyBsb25nIGEgbGluayB3aWxsIHJlbWFpbiBvcGVuIHdpdGggbm8KKwkgKiBhY3Rpdml0eSBpbiBpbmNyZW1lbnRzIG9mIGEgbWljcm9zZWNvbmQsIGl0IGNhbiBiZSBpbiBpbmNyZW1lbnRzIG9mCisJICogMTAwIG1pY3Jvc2Vjb25kcyBpZiB0aGUgdXBwZXIgbW9zdCBiaXQgaXMgc2V0LgorCSAqCisJICovCisJdTE2IHN0cF9pbmFjdGl2aXR5X3RpbWVvdXQ7CisJdTE2IHNzcF9pbmFjdGl2aXR5X3RpbWVvdXQ7CisKKwkvKioKKwkgKiBUaGVzZSB0aW1lciB2YWx1ZXMgc3BlY2lmaWVzIGhvdyBsb25nIGEgbGluayB3aWxsIHJlbWFpbiBvcGVuIGluIGluY3JlbWVudHMKKwkgKiBvZiAxMDAgbWljcm9zZWNvbmRzLgorCSAqCisJICovCisJdTE2IHN0cF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQ7CisJdTE2IHNzcF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQ7CisKKwkvKioKKwkgKiBUaGlzIHRpbWVyIHZhbHVlIHNwZWNpZmllcyBob3cgbG9uZyBhIGxpbmsgd2lsbCByZW1haW4gb3BlbiB3aXRoIG5vCisJICogb3V0Ym91bmQgdHJhZmZpYyBpbiBpbmNyZW1lbnRzIG9mIGEgbWljcm9zZWNvbmQuCisJICoKKwkgKi8KKwl1OCBub19vdXRib3VuZF90YXNrX3RpbWVvdXQ7CisKK307CisKKyNkZWZpbmUgU0NJQ19TRFNfUEFSTV9QSFlfTUFTS19NSU4gMHgwCisjZGVmaW5lIFNDSUNfU0RTX1BBUk1fUEhZX01BU0tfTUFYIDB4RgorI2RlZmluZSBNQVhfQ09OQ1VSUkVOVF9ERVZJQ0VfU1BJTl9VUF9DT1VOVCA0CisKK3N0cnVjdCBzY2lfb2VtX3BhcmFtczsKK2ludCBzY2lfb2VtX3BhcmFtZXRlcnNfdmFsaWRhdGUoc3RydWN0IHNjaV9vZW1fcGFyYW1zICpvZW0pOworCitzdHJ1Y3QgaXNjaV9vcm9tOworc3RydWN0IGlzY2lfb3JvbSAqaXNjaV9yZXF1ZXN0X29wcm9tKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK2VudW0gc2NpX3N0YXR1cyBpc2NpX3BhcnNlX29lbV9wYXJhbWV0ZXJzKHN0cnVjdCBzY2lfb2VtX3BhcmFtcyAqb2VtLAorCQkJCQkgIHN0cnVjdCBpc2NpX29yb20gKm9yb20sIGludCBzY3VfaW5kZXgpOworc3RydWN0IGlzY2lfb3JvbSAqaXNjaV9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KTsKK3N0cnVjdCBpc2NpX29yb20gKmlzY2lfZ2V0X2VmaV92YXIoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCitzdHJ1Y3QgaXNjaV9vZW1faGRyIHsKKwl1OCBzaWdbNF07CisJdTggcmV2X21ham9yOworCXU4IHJldl9taW5vcjsKKwl1MTYgbGVuOworCXU4IGNoZWNrc3VtOworCXU4IHJlc2VydmVkMTsKKwl1MTYgcmVzZXJ2ZWQyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNlbHNlCisjZGVmaW5lIFNDSV9NQVhfUE9SVFMgNAorI2RlZmluZSBTQ0lfTUFYX1BIWVMgNAorI2RlZmluZSBTQ0lfTUFYX0NPTlRST0xMRVJTIDIKKyNlbmRpZgorCisjZGVmaW5lIElTQ0lfRldfTkFNRQkJImlzY2kvaXNjaV9maXJtd2FyZS5iaW4iCisKKyNkZWZpbmUgUk9NU0lHTkFUVVJFCQkweGFhNTUKKworI2RlZmluZSBJU0NJX09FTV9TSUcJCSIkT0VNIgorI2RlZmluZSBJU0NJX09FTV9TSUdfU0laRQk0CisjZGVmaW5lIElTQ0lfUk9NX1NJRwkJIklTQ1VPRU1CIgorI2RlZmluZSBJU0NJX1JPTV9TSUdfU0laRQk4CisKKyNkZWZpbmUgSVNDSV9FRklfVkVORE9SX0dVSUQJXAorCUVGSV9HVUlEKDB4MTkzZGZlZmEsIDB4YTQ0NSwgMHg0MzAyLCAweDk5LCAweGQ4LCAweGVmLCAweDNhLCAweGFkLCBcCisJCQkweDFhLCAweDA0LCAweGM2KQorI2RlZmluZSBJU0NJX0VGSV9WQVJfTkFNRQkiUnN0U2N1TyIKKworLyogQWxsb3dlZCBQT1JUIGNvbmZpZ3VyYXRpb24gbW9kZXMgQVBDIEF1dG9tYXRpYyBQT1JUIGNvbmZpZ3VyYXRpb24gbW9kZSBpcworICogZGVmaW5lZCBieSB0aGUgT0VNIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBwcm92aWRpbmcgbm8gUEhZX01BU0sgcGFyYW1ldGVycworICogZm9yIGFueSBQT1JULiBpLmUuIFRoZXJlIGFyZSBubyBwaHlzIGFzc2lnbmVkIHRvIGFueSBvZiB0aGUgcG9ydHMgYXQgc3RhcnQuCisgKiBNUEMgTWFudWFsIFBPUlQgY29uZmlndXJhdGlvbiBtb2RlIGlzIGRlZmluZWQgYnkgdGhlIE9FTSBjb25maWd1cmF0aW9uCisgKiBwYXJhbWV0ZXJzIHByb3ZpZGluZyBhIFBIWV9NQVNLIHZhbHVlIGZvciBhbnkgUE9SVC4gIEl0IGlzIGFzc3VtZWQgdGhhdCBhbnkKKyAqIFBPUlQgd2l0aCBubyBQSFlfTUFTSyBpcyBhbiBpbnZhbGlkIHBvcnQgYW5kIG5vdCBhbGwgUEhZcyBtdXN0IGJlIGFzc2lnbmVkLgorICogQSBQT1JUX1BIWSBtYXNrIHRoYXQgYXNzaWducyBqdXN0IGEgc2luZ2xlIFBIWSB0byBhIHBvcnQgYW5kIG5vIG90aGVyIFBIWXMKKyAqIGJlaW5nIGFzc2lnbmVkIGlzIHN1ZmZpY2llbnQgdG8gZGVjbGFyZSBtYW51YWwgUE9SVCBjb25maWd1cmF0aW9uLgorICovCitlbnVtIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fbW9kZSB7CisJU0NJQ19QT1JUX01BTlVBTF9DT05GSUdVUkFUSU9OX01PREUgPSAwLAorCVNDSUNfUE9SVF9BVVRPTUFUSUNfQ09ORklHVVJBVElPTl9NT0RFID0gMQorfTsKKworc3RydWN0IHNjaV9iaW9zX29lbV9wYXJhbV9ibG9ja19oZHIgeworCXVpbnQ4X3Qgc2lnbmF0dXJlW0lTQ0lfUk9NX1NJR19TSVpFXTsKKwl1aW50MTZfdCB0b3RhbF9ibG9ja19sZW5ndGg7CisJdWludDhfdCBoZHJfbGVuZ3RoOworCXVpbnQ4X3QgdmVyc2lvbjsKKwl1aW50OF90IHByZWJvb3Rfc291cmNlOworCXVpbnQ4X3QgbnVtX2VsZW1lbnRzOworCXVpbnQxNl90IGVsZW1lbnRfbGVuZ3RoOworCXVpbnQ4X3QgcmVzZXJ2ZWRbOF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHNjaV9vZW1fcGFyYW1zIHsKKwlzdHJ1Y3QgeworCQl1aW50OF90IG1vZGVfdHlwZTsKKwkJdWludDhfdCBtYXhfY29uY3VycmVudF9kZXZfc3Bpbl91cDsKKwkJdWludDhfdCBkb19lbmFibGVfc3NjOworCQl1aW50OF90IHJlc2VydmVkOworCX0gY29udHJvbGxlcjsKKworCXN0cnVjdCB7CisJCXVpbnQ4X3QgcGh5X21hc2s7CisJfSBwb3J0c1tTQ0lfTUFYX1BPUlRTXTsKKworCXN0cnVjdCBzY2lfcGh5X29lbV9wYXJhbXMgeworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgaGlnaDsKKwkJCXVpbnQzMl90IGxvdzsKKwkJfSBzYXNfYWRkcmVzczsKKworCQl1aW50MzJfdCBhZmVfdHhfYW1wX2NvbnRyb2wwOworCQl1aW50MzJfdCBhZmVfdHhfYW1wX2NvbnRyb2wxOworCQl1aW50MzJfdCBhZmVfdHhfYW1wX2NvbnRyb2wyOworCQl1aW50MzJfdCBhZmVfdHhfYW1wX2NvbnRyb2wzOworCX0gcGh5c1tTQ0lfTUFYX1BIWVNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpc2NpX29yb20geworCXN0cnVjdCBzY2lfYmlvc19vZW1fcGFyYW1fYmxvY2tfaGRyIGhkcjsKKwlzdHJ1Y3Qgc2NpX29lbV9wYXJhbXMgY3RybFtTQ0lfTUFYX0NPTlRST0xMRVJTXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlZ2lzdGVycy5oIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVnaXN0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyNjZjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlZ2lzdGVycy5oCkBAIC0wLDAgKzEsMTkzNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfU0NVX1JFR0lTVEVSU19IXworI2RlZmluZSBfU0NVX1JFR0lTVEVSU19IXworCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzIGZvciB0aGUgU0NVIG1lbW9yeSBtYXBwZWQKKyAqICAgIHJlZ2lzdGVycy4KKyAqCisgKgorICovCisKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfSURfTUFTSyAgICAgICAgICgweEMwMDAwMDAwKQorI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9JRF9TSElGVCAgICAgICAgKDMwKQorCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX0ZVTkNUSU9OX01BU0sgICAoMHgwRkYwMDAwMCkKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfRlVOQ1RJT05fU0hJRlQgICgyMCkKKworI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9JUFBUTU9ERV9NQVNLICAgKDB4MDAwMUY4MDApCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX0lQUFRNT0RFX1NISUZUICAoMTIpCisKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfTFBWSUVfTUFTSyAgICAgICgweDAwMDAwRjAwKQorI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9MUFZJRV9TSElGVCAgICAgKDgpCisKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfU1RBVFVTX01BU0sgICAgICgweDAwMDAwMEZGKQorI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9TVEFUVVNfU0hJRlQgICAgKDApCisKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfSURfSU5WQUxJRCAgICgwIDw8IFNDVV9WSUlUX0VOVFJZX0lEX1NISUZUKQorI2RlZmluZSBTQ1VfVklJVF9FTlRSWV9JRF9WSUlUICAgICAgKDEgPDwgU0NVX1ZJSVRfRU5UUllfSURfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX0VOVFJZX0lEX0lJVCAgICAgICAoMiA8PCBTQ1VfVklJVF9FTlRSWV9JRF9TSElGVCkKKyNkZWZpbmUgU0NVX1ZJSVRfRU5UUllfSURfVklSVF9FWFAgICgzIDw8IFNDVV9WSUlUX0VOVFJZX0lEX1NISUZUKQorCisjZGVmaW5lIFNDVV9WSUlUX0lQUFRfU1NQX0lOSVRJQVRPUiAoMHgwMSA8PCBTQ1VfVklJVF9FTlRSWV9JUFBUTU9ERV9TSElGVCkKKyNkZWZpbmUgU0NVX1ZJSVRfSVBQVF9TTVBfSU5JVElBVE9SICgweDAyIDw8IFNDVV9WSUlUX0VOVFJZX0lQUFRNT0RFX1NISUZUKQorI2RlZmluZSBTQ1VfVklJVF9JUFBUX1NUUF9JTklUSUFUT1IgKDB4MDQgPDwgU0NVX1ZJSVRfRU5UUllfSVBQVE1PREVfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX0lQUFRfSU5JVElBVE9SCSAgICBcCisJKFwKKwkJU0NVX1ZJSVRfSVBQVF9TU1BfSU5JVElBVE9SICBcCisJCXwgU0NVX1ZJSVRfSVBQVF9TTVBfSU5JVElBVE9SICBcCisJCXwgU0NVX1ZJSVRfSVBQVF9TVFBfSU5JVElBVE9SICBcCisJKQorCisjZGVmaW5lIFNDVV9WSUlUX1NUQVRVU19STkNfVkFMSUQgICAgICAoMHgwMSA8PCBTQ1VfVklJVF9FTlRSWV9TVEFUVVNfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX1NUQVRVU19BRERSRVNTX1ZBTElEICAoMHgwMiA8PCBTQ1VfVklJVF9FTlRSWV9TVEFUVVNfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX1NUQVRVU19STklfVkFMSUQgICAgICAoMHgwNCA8PCBTQ1VfVklJVF9FTlRSWV9TVEFUVVNfU0hJRlQpCisjZGVmaW5lIFNDVV9WSUlUX1NUQVRVU19BTExfVkFMSUQgICAgICBcCisJKFwKKwkJU0NVX1ZJSVRfU1RBVFVTX1JOQ19WQUxJRAlcCisJCXwgU0NVX1ZJSVRfU1RBVFVTX0FERFJFU1NfVkFMSUQJICBcCisJCXwgU0NVX1ZJSVRfU1RBVFVTX1JOSV9WQUxJRAkgIFwKKwkpCisKKyNkZWZpbmUgU0NVX1ZJSVRfSVBQVF9TTVBfVEFSR0VUICAgICgweDEwIDw8IFNDVV9WSUlUX0VOVFJZX0lQUFRNT0RFX1NISUZUKQorCisvKioKKyAqIHN0cnVjdCBzY3VfdmlpdF9lbnRyeSAtIFRoaXMgaXMgdGhlIFNDVSBWaXJ0dWFsIEluaXRpYXRvciBUYWJsZSBFbnRyeQorICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfdmlpdF9lbnRyeSB7CisJLyoqCisJICogVGhpcyBtdXN0IGJlIGVuY29kZWQgYXMgdG8gdGhlIHR5cGUgb2YgaW5pdGlhdG9yIHRoYXQgaXMgYmVpbmcgY29uc3RydWN0ZWQKKwkgKiBmb3IgdGhpcyBwb3J0LgorCSAqLworCXUzMiBzdGF0dXM7CisKKwkvKioKKwkgKiBWaXJ0dWFsIGluaXRpYXRvciBoaWdoIFNBUyBBZGRyZXNzCisJICovCisJdTMyIGluaXRpYXRvcl9zYXNfYWRkcmVzc19oaTsKKworCS8qKgorCSAqIFZpcnR1YWwgaW5pdGlhdG9yIGxvdyBTQVMgQWRkcmVzcworCSAqLworCXUzMiBpbml0aWF0b3Jfc2FzX2FkZHJlc3NfbG87CisKKwkvKioKKwkgKiBUaGlzIG11c3QgYmUgMAorCSAqLworCXUzMiByZXNlcnZlZDsKKworfTsKKworCisvKiBJSVQgU3RhdHVzIERlZmluZXMgKi8KKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9JRF9NQVNLICAgICAgICAgICAgICAgICgweEMwMDAwMDAwKQorI2RlZmluZSBTQ1VfSUlUX0VOVFJZX0lEX1NISUZUICAgICAgICAgICAgICAgKDMwKQorCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfU1RBVFVTX1VQREFURV9NQVNLICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9TVEFUVVNfVVBEQVRFX1NISUZUICAgICgyOSkKKworI2RlZmluZSBTQ1VfSUlUX0VOVFJZX0xQSV9NQVNLICAgICAgICAgICAgICAgKDB4MDAwMDBGMDApCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfTFBJX1NISUZUICAgICAgICAgICAgICAoOCkKKworI2RlZmluZSBTQ1VfSUlUX0VOVFJZX1NUQVRVU19NQVNLICAgICAgICAgICAgKDB4MDAwMDAwRkYpCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfU1RBVFVTX1NISUZUICAgICAgICAgICAoMCkKKworLyogSUlUIFJlbW90ZSBJbml0aWF0b3IgRGVmaW5lcyAqLworI2RlZmluZSBTQ1VfSUlUX0VOVFJZX1JFTU9URV9UQUdfTUFTSyAgKDB4MDAwMEZGRkYpCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfUkVNT1RFX1RBR19TSElGVCAoMCkKKworI2RlZmluZSBTQ1VfSUlUX0VOVFJZX1JFTU9URV9STkNfTUFTSyAgKDB4MEZGRjAwMDApCisjZGVmaW5lIFNDVV9JSVRfRU5UUllfUkVNT1RFX1JOQ19TSElGVCAoMTYpCisKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9JRF9JTlZBTElEICAgKDAgPDwgU0NVX0lJVF9FTlRSWV9JRF9TSElGVCkKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9JRF9WSUlUICAgICAgKDEgPDwgU0NVX0lJVF9FTlRSWV9JRF9TSElGVCkKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9JRF9JSVQgICAgICAgKDIgPDwgU0NVX0lJVF9FTlRSWV9JRF9TSElGVCkKKyNkZWZpbmUgU0NVX0lJVF9FTlRSWV9JRF9WSVJUX0VYUCAgKDMgPDwgU0NVX0lJVF9FTlRSWV9JRF9TSElGVCkKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X2lpdF9lbnRyeSAtIFRoaXMgd2lsbCBiZSBpbXBsZW1lbnRlZCBsYXRlciB3aGVuIHdlIHN1cHBvcnQKKyAqICAgIHZpcnR1YWwgZnVuY3Rpb25zCisgKgorICoKKyAqLworc3RydWN0IHNjdV9paXRfZW50cnkgeworCXUzMiBzdGF0dXM7CisJdTMyIHJlbW90ZV9pbml0aWF0b3Jfc2FzX2FkZHJlc3NfaGk7CisJdTMyIHJlbW90ZV9pbml0aWF0b3Jfc2FzX2FkZHJlc3NfbG87CisJdTMyIHJlbW90ZV9pbml0aWF0b3I7CisKK307CisKKy8qIEdlbmVyYXRlIGEgdmFsdWUgZm9yIGFuIFNDVSByZWdpc3RlciAqLworI2RlZmluZSBTQ1VfR0VOX1ZBTFVFKG5hbWUsIHZhbHVlKSBcCisJKCgodmFsdWUpIDw8IG5hbWUgIyMgX1NISUZUKSAmIChuYW1lICMjIF9NQVNLKSkKKworLyoKKyAqIEdlbmVyYXRlIGEgYml0IHZhbHVlIGZvciBhbiBTQ1UgcmVnaXN0ZXIKKyAqIE1ha2Ugc3VyZSB0aGF0IHRoZSByZWdpc3RlciBNQVNLIGlzIGp1c3QgYSBzaW5nbGUgYml0ICovCisjZGVmaW5lIFNDVV9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKG5hbWUsICgodTMyKTEpKQorCisjZGVmaW5lIFNDVV9TRVRfQklUKG5hbWUsIHJlZ192YWx1ZSkgXAorCSgocmVnX3ZhbHVlKSB8IFNDVV9HRU5fQklUKG5hbWUpKQorCisjZGVmaW5lIFNDVV9DTEVBUl9CSVQobmFtZSwgcmVnX3ZhbHVlKSBcCisJKChyZWdfdmFsdWUpJCB+KFNDVV9HRU5fQklUKG5hbWUpKSkKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVbmlvbnMgZm9yIGJpdGZpZWxkIGRlZmluaXRpb25zIG9mIFNDVSBSZWdpc3RlcnMKKyAqIFNNVSBQb3N0IENvbnRleHQgUG9ydAorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX0NPTlRFWFRfSU5ERVhfU0hJRlQgICAgICAgICAoMCkKKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX0NPTlRFWFRfSU5ERVhfTUFTSyAgICAgICAgICAoMHgwMDAwMEZGRikKKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX0xPR0lDQUxfUE9SVF9JTkRFWF9TSElGVCAgICAoMTIpCisjZGVmaW5lIFNNVV9QT1NUX0NPTlRFWFRfUE9SVF9MT0dJQ0FMX1BPUlRfSU5ERVhfTUFTSyAgICAgKDB4MDAwMEYwMDApCisjZGVmaW5lIFNNVV9QT1NUX0NPTlRFWFRfUE9SVF9QUk9UT0NPTF9FTkdJTkVfU0hJRlQgICAgICAgKDE2KQorI2RlZmluZSBTTVVfUE9TVF9DT05URVhUX1BPUlRfUFJPVE9DT0xfRU5HSU5FX01BU0sgICAgICAgICgweDAwMDMwMDAwKQorI2RlZmluZSBTTVVfUE9TVF9DT05URVhUX1BPUlRfQ09NTUFORF9DT05URVhUX1NISUZUICAgICAgICgxOCkKKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX0NPTU1BTkRfQ09OVEVYVF9NQVNLICAgICAgICAoMHgwMEZDMDAwMCkKKyNkZWZpbmUgU01VX1BPU1RfQ09OVEVYVF9QT1JUX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAoMHhGRjAwMDAwMCkKKworI2RlZmluZSBTTVVfUENQX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9QT1NUX0NPTlRFWFRfUE9SVF8gIyMgbmFtZSwgdmFsdWUpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNNVV9JTlRFUlJVUFRfU1RBVFVTX0NPTVBMRVRJT05fU0hJRlQgICAgICAgKDMxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19DT01QTEVUSU9OX01BU0sgICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19RVUVVRV9TVVNQRU5EX1NISUZUICAgICgxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19RVUVVRV9TVVNQRU5EX01BU0sgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19RVUVVRV9FUlJPUl9TSElGVCAgICAgICgwKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19RVUVVRV9FUlJPUl9NQVNLICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX1NUQVRVU19SRVNFUlZFRF9NQVNLICAgICAgICAgICgweDdGRkZGRkZDKQorCisjZGVmaW5lIFNNVV9JU1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU01VX0lOVEVSUlVQVF9TVEFUVVNfICMjIG5hbWUpCisKKyNkZWZpbmUgU01VX0lTUl9RVUVVRV9FUlJPUiAgIFNNVV9JU1JfR0VOX0JJVChRVUVVRV9FUlJPUikKKyNkZWZpbmUgU01VX0lTUl9RVUVVRV9TVVNQRU5EIFNNVV9JU1JfR0VOX0JJVChRVUVVRV9TVVNQRU5EKQorI2RlZmluZSBTTVVfSVNSX0NPTVBMRVRJT04gICAgU01VX0lTUl9HRU5fQklUKENPTVBMRVRJT04pCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNNVV9JTlRFUlJVUFRfTUFTS19DT01QTEVUSU9OX1NISUZUICAgICAgICAgKDMxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfQ09NUExFVElPTl9NQVNLICAgICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfUVVFVUVfU1VTUEVORF9TSElGVCAgICAgICgxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfUVVFVUVfU1VTUEVORF9NQVNLICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfUVVFVUVfRVJST1JfU0hJRlQgICAgICAgICgwKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfUVVFVUVfRVJST1JfTUFTSyAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTTVVfSU5URVJSVVBUX01BU0tfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICgweDdGRkZGRkZDKQorCisjZGVmaW5lIFNNVV9JTVJfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU01VX0lOVEVSUlVQVF9NQVNLXyAjIyBuYW1lKQorCisjZGVmaW5lIFNNVV9JTVJfUVVFVUVfRVJST1IgICBTTVVfSU1SX0dFTl9CSVQoUVVFVUVfRVJST1IpCisjZGVmaW5lIFNNVV9JTVJfUVVFVUVfU1VTUEVORCBTTVVfSU1SX0dFTl9CSVQoUVVFVUVfU1VTUEVORCkKKyNkZWZpbmUgU01VX0lNUl9DT01QTEVUSU9OICAgIFNNVV9JTVJfR0VOX0JJVChDT01QTEVUSU9OKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTTVVfSU5URVJSVVBUX0NPQUxFU0NJTkdfQ09OVFJPTF9USU1FUl9TSElGVCAgICAoMCkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9DT0FMRVNDSU5HX0NPTlRST0xfVElNRVJfTUFTSyAgICAgKDB4MDAwMDAwMUYpCisjZGVmaW5lIFNNVV9JTlRFUlJVUFRfQ09BTEVTQ0lOR19DT05UUk9MX05VTUJFUl9TSElGVCAgICg4KQorI2RlZmluZSBTTVVfSU5URVJSVVBUX0NPQUxFU0NJTkdfQ09OVFJPTF9OVU1CRVJfTUFTSyAgICAoMHgwMDAwRkYwMCkKKyNkZWZpbmUgU01VX0lOVEVSUlVQVF9DT0FMRVNDSU5HX0NPTlRST0xfUkVTRVJWRURfTUFTSyAgKDB4RkZGRjAwRTApCisKKyNkZWZpbmUgU01VX0lDQ19HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTTVVfSU5URVJSVVBUX0NPQUxFU0NJTkdfQ09OVFJPTF8gIyMgbmFtZSwgdmFsdWUpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfUkFOR0VfU1RBUlRfU0hJRlQgICAgICAoMCkKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9SQU5HRV9TVEFSVF9NQVNLICAgICAgICgweDAwMDAwRkZGKQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX1JBTkdFX0VORElOR19TSElGVCAgICAgKDE2KQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX1JBTkdFX0VORElOR19NQVNLICAgICAgKDB4MEZGRjAwMDApCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfUkFOR0VfRU5BQkxFX1NISUZUICAgICAoMzEpCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfUkFOR0VfRU5BQkxFX01BU0sgICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9SQU5HRV9SRVNFUlZFRF9NQVNLICAgICgweDcwMDBGMDAwKQorCisjZGVmaW5lIFNNVV9UQ1JfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU01VX1RBU0tfQ09OVEVYVF9SQU5HRV8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU01VX1RDUl9HRU5fQklUKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9CSVQoU01VX1RBU0tfQ09OVEVYVF9SQU5HRV8gIyMgbmFtZSkKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9QVVRfUE9JTlRFUl9TSElGVCAgICAgICAgICAoMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfUFVUX1BPSU5URVJfTUFTSyAgICAgICAgICAgKDB4MDAwMDNGRkYpCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9DWUNMRV9CSVRfU0hJRlQgICAgICAgICgxNSkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfUFVUX0NZQ0xFX0JJVF9NQVNLICAgICAgICAgKDB4MDAwMDgwMDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9FVkVOVF9QT0lOVEVSX1NISUZUICAgICgxNikKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfUFVUX0VWRU5UX1BPSU5URVJfTUFTSyAgICAgKDB4MDNGRjAwMDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9FVkVOVF9DWUNMRV9CSVRfU0hJRlQgICgyNikKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfUFVUX0VWRU5UX0NZQ0xFX0JJVF9NQVNLICAgKDB4MDQwMDAwMDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF9SRVNFUlZFRF9NQVNLICAgICAgICAgICgweEY4MDA0MDAwKQorCisjZGVmaW5lIFNNVV9DUVBSX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9DT01QTEVUSU9OX1FVRVVFX1BVVF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU01VX0NRUFJfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU01VX0NPTVBMRVRJT05fUVVFVUVfUFVUXyAjIyBuYW1lKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0dFVF9QT0lOVEVSX1NISUZUICAgICAgICAgICgwKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfUE9JTlRFUl9NQVNLICAgICAgICAgICAoMHgwMDAwM0ZGRikKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0NZQ0xFX0JJVF9TSElGVCAgICAgICAgKDE1KQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfQ1lDTEVfQklUX01BU0sgICAgICAgICAoMHgwMDAwODAwMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VWRU5UX1BPSU5URVJfU0hJRlQgICAgKDE2KQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRVZFTlRfUE9JTlRFUl9NQVNLICAgICAoMHgwM0ZGMDAwMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VWRU5UX0NZQ0xFX0JJVF9TSElGVCAgKDI2KQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRVZFTlRfQ1lDTEVfQklUX01BU0sgICAoMHgwNDAwMDAwMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VOQUJMRV9TSElGVCAgICAgICAgICAgKDMwKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRU5BQkxFX01BU0sgICAgICAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX0VWRU5UX0VOQUJMRV9TSElGVCAgICAgKDMxKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfRVZFTlRfRU5BQkxFX01BU0sgICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUX1JFU0VSVkVEX01BU0sgICAgICAgICAgKDB4MzgwMDQwMDApCisKKyNkZWZpbmUgU01VX0NRR1JfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU01VX0NPTVBMRVRJT05fUVVFVUVfR0VUXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTTVVfQ1FHUl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTTVVfQ09NUExFVElPTl9RVUVVRV9HRVRfICMjIG5hbWUpCisKKyNkZWZpbmUgU01VX0NRR1JfQ1lDTEVfQklUIFwKKwlTTVVfQ1FHUl9HRU5fQklUKENZQ0xFX0JJVCkKKworI2RlZmluZSBTTVVfQ1FHUl9FVkVOVF9DWUNMRV9CSVQgXAorCVNNVV9DUUdSX0dFTl9CSVQoRVZFTlRfQ1lDTEVfQklUKQorCisjZGVmaW5lIFNNVV9DUUdSX0dFVF9QT0lOVEVSX1NFVCh2YWx1ZSkJXAorCVNNVV9DUUdSX0dFTl9WQUwoUE9JTlRFUiwgdmFsdWUpCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU01VX0NPTVBMRVRJT05fUVVFVUVfQ09OVFJPTF9RVUVVRV9MSU1JVF9TSElGVCAgKDApCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0NPTlRST0xfUVVFVUVfTElNSVRfTUFTSyAgICgweDAwMDAzRkZGKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9DT05UUk9MX0VWRU5UX0xJTUlUX1NISUZUICAoMTYpCisjZGVmaW5lIFNNVV9DT01QTEVUSU9OX1FVRVVFX0NPTlRST0xfRVZFTlRfTElNSVRfTUFTSyAgICgweDAzRkYwMDAwKQorI2RlZmluZSBTTVVfQ09NUExFVElPTl9RVUVVRV9DT05UUk9MX1JFU0VSVkVEX01BU0sgICAgICAoMHhGQzAwQzAwMCkKKworI2RlZmluZSBTTVVfQ1FDX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9DT01QTEVUSU9OX1FVRVVFX0NPTlRST0xfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNNVV9DUUNfUVVFVUVfTElNSVRfU0VUKHZhbHVlKSBcCisJU01VX0NRQ19HRU5fVkFMKFFVRVVFX0xJTUlULCB2YWx1ZSkKKworI2RlZmluZSBTTVVfQ1FDX0VWRU5UX0xJTUlUX1NFVCh2YWx1ZSkgXAorCVNNVV9DUUNfR0VOX1ZBTChFVkVOVF9MSU1JVCwgdmFsdWUpCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9UQ19TSElGVCAgICAoMCkKKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9UQ19NQVNLICAgICAoMHgwMDAwMEZGRikKKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9MUF9TSElGVCAgICAoMTIpCisjZGVmaW5lIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfTFBfTUFTSyAgICAgKDB4MDAwMDcwMDApCisjZGVmaW5lIFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfUk5DX1NISUZUICAgKDE1KQorI2RlZmluZSBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1JOQ19NQVNLICAgICgweDA3RkY4MDAwKQorI2RlZmluZSBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1BFR19TSElGVCAgICgyNykKKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9QRUdfTUFTSyAgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX1JFU0VSVkVEX01BU0sgICAoMHhGMDAwMDAwMCkKKworI2RlZmluZSBTTVVfRENDX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU01VX0RDQ19HRVRfTUFYX1BFRyh2YWx1ZSkgXAorCShcCisJCSgodmFsdWUpICYgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9QRUdfTUFTSykgXAorCQk+PiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX0xQX1NISUZUIFwKKwkpCisKKyNkZWZpbmUgU01VX0RDQ19HRVRfTUFYX0xQKHZhbHVlKSBcCisJKFwKKwkJKCh2YWx1ZSkgJiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX0xQX01BU0spIFwKKwkJPj4gU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9MUF9TSElGVCBcCisJKQorCisjZGVmaW5lIFNNVV9EQ0NfR0VUX01BWF9UQyh2YWx1ZSkgXAorCShcCisJCSgodmFsdWUpICYgU01VX0RFVklDRV9DT05URVhUX0NBUEFDSVRZX01BWF9UQ19NQVNLKSBcCisJCT4+IFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfVENfU0hJRlQgXAorCSkKKworI2RlZmluZSBTTVVfRENDX0dFVF9NQVhfUk5DKHZhbHVlKSBcCisJKFwKKwkJKCh2YWx1ZSkgJiBTTVVfREVWSUNFX0NPTlRFWFRfQ0FQQUNJVFlfTUFYX1JOQ19NQVNLKSBcCisJCT4+IFNNVV9ERVZJQ0VfQ09OVEVYVF9DQVBBQ0lUWV9NQVhfUk5DX1NISUZUIFwKKwkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX1RBU0tfQ09OVEVYVF9SQU5HRV9FTkFCTEVfU0hJRlQgICAgICAoMCkKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX1RBU0tfQ09OVEVYVF9SQU5HRV9FTkFCTEVfTUFTSyAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX0NPTVBMRVRJT05fQllURV9TV0FQX0VOQUJMRV9TSElGVCAgICAoMSkKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX0NPTVBMRVRJT05fQllURV9TV0FQX0VOQUJMRV9NQVNLICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgU01VX0NPTlRST0xfU1RBVFVTX0NPTlRFWFRfUkFNX0lOSVRfQ09NUExFVEVEX1NISUZUICAgICAoMTYpCisjZGVmaW5lIFNNVV9DT05UUk9MX1NUQVRVU19DT05URVhUX1JBTV9JTklUX0NPTVBMRVRFRF9NQVNLICAgICAgKDB4MDAwMTAwMDApCisjZGVmaW5lIFNNVV9DT05UUk9MX1NUQVRVU19TQ0hFRFVMRVJfUkFNX0lOSVRfQ09NUExFVEVEX1NISUZUICAgKDE3KQorI2RlZmluZSBTTVVfQ09OVFJPTF9TVEFUVVNfU0NIRURVTEVSX1JBTV9JTklUX0NPTVBMRVRFRF9NQVNLICAgICgweDAwMDIwMDAwKQorI2RlZmluZSBTTVVfQ09OVFJPTF9TVEFUVVNfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICgweEZGRkNGRkZDKQorCisjZGVmaW5lIFNNVV9TTVVDU1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU01VX0NPTlRST0xfU1RBVFVTXyAjIyBuYW1lKQorCisjZGVmaW5lIFNNVV9TTVVDU1JfU0NIRURVTEVSX1JBTV9JTklUX0NPTVBMRVRFRAlcCisJKFNNVV9TTVVDU1JfR0VOX0JJVChTQ0hFRFVMRVJfUkFNX0lOSVRfQ09NUExFVEVEKSkKKworI2RlZmluZSBTTVVfU01VQ1NSX0NPTlRFWFRfUkFNX0lOSVRfQ09NUExFVEVECVwKKwkoU01VX1NNVUNTUl9HRU5fQklUKENPTlRFWFRfUkFNX0lOSVRfQ09NUExFVEVEKSkKKworI2RlZmluZSBTQ1VfUkFNX0lOSVRfQ09NUExFVEVEIFwKKwkoXAorCQlTTVVfU01VQ1NSX0NPTlRFWFRfUkFNX0lOSVRfQ09NUExFVEVEIFwKKwkJfCBTTVVfU01VQ1NSX1NDSEVEVUxFUl9SQU1fSU5JVF9DT01QTEVURUQgXAorCSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTBfU0hJRlQgICgwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTBfTUFTSyAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTFfU0hJRlQgICgxKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTFfTUFTSyAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTJfU0hJRlQgICgyKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTJfTUFTSyAgICgweDAwMDAwMDA0KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTNfU0hJRlQgICgzKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9QRTNfTUFTSyAgICgweDAwMDAwMDA4KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9QRTBfU0hJRlQgICg4KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9QRTBfTUFTSyAgICgweDAwMDAwMTAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9QRTFfU0hJRlQgICg5KQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9QRTFfTUFTSyAgICgweDAwMDAwMjAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9QRTJfU0hJRlQgICgxMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfUEUyX01BU0sgICAoMHgwMDAwMDQwMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfUEUzX1NISUZUICAoMTEpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9QRUcxX1BFM19NQVNLICAgKDB4MDAwMDA4MDApCisKKyNkZWZpbmUgU01VX1JFU0VUX1BST1RPQ09MX0VOR0lORShwZWcsIHBlKSBcCisJKCgxIDw8IChwZSkpIDw8ICgocGVnKSAqIDgpKQorCisjZGVmaW5lIFNNVV9SRVNFVF9QRUdfUFJPVE9DT0xfRU5HSU5FUyhwZWcpIFwKKwkoXAorCQlTTVVfUkVTRVRfUFJPVE9DT0xfRU5HSU5FKHBlZywgMCkgXAorCQl8IFNNVV9SRVNFVF9QUk9UT0NPTF9FTkdJTkUocGVnLCAxKSBcCisJCXwgU01VX1JFU0VUX1BST1RPQ09MX0VOR0lORShwZWcsIDIpIFwKKwkJfCBTTVVfUkVTRVRfUFJPVE9DT0xfRU5HSU5FKHBlZywgMykgXAorCSkKKworI2RlZmluZSBTTVVfUkVTRVRfQUxMX1BST1RPQ09MX0VOR0lORVMoKSBcCisJKFwKKwkJU01VX1JFU0VUX1BFR19QUk9UT0NPTF9FTkdJTkVTKDApIFwKKwkJfCBTTVVfUkVTRVRfUEVHX1BST1RPQ09MX0VOR0lORVMoMSkgXAorCSkKKworI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzBfTFAwX1NISUZUICAoMTYpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9XSURFX1BPUlRfUEVHMF9MUDBfTUFTSyAgICgweDAwMDEwMDAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzBfTFAyX1NISUZUICAoMTcpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9XSURFX1BPUlRfUEVHMF9MUDJfTUFTSyAgICgweDAwMDIwMDAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzFfTFAwX1NISUZUICAoMTgpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9XSURFX1BPUlRfUEVHMV9MUDBfTUFTSyAgICgweDAwMDQwMDAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfV0lERV9QT1JUX1BFRzFfTFAyX1NISUZUICAoMTkpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9XSURFX1BPUlRfUEVHMV9MUDJfTUFTSyAgICgweDAwMDgwMDAwKQorCisjZGVmaW5lIFNNVV9SRVNFVF9XSURFX1BPUlRfUVVFVUUocGVnLCB3aWRlX3BvcnQpIFwKKwkoKDEgPDwgKCh3aWRlX3BvcnQpIC8gMikpIDw8ICgocGVnKSAqIDIpIDw8IDE2KQorCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9QRUcwX1NISUZUICAgICAgKDIwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMF9NQVNLICAgICAgICgweDAwMTAwMDAwKQorI2RlZmluZSBTTVVfU09GVFJFU0VUX0NPTlRST0xfUkVTRVRfUEVHMV9TSElGVCAgICAgICgyMSkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1BFRzFfTUFTSyAgICAgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgU01VX1NPRlRSRVNFVF9DT05UUk9MX1JFU0VUX1NDVV9TSElGVCAgICAgICAoMjIpCisjZGVmaW5lIFNNVV9TT0ZUUkVTRVRfQ09OVFJPTF9SRVNFVF9TQ1VfTUFTSyAgICAgICAgKDB4MDA0MDAwMDApCisKKy8qCisgKiBJdCBzZWVtcyB0byBtYWtlIHNlbnNlIHRoYXQgaWYgeW91IGFyZSBnb2luZyB0byByZXNldCB0aGUgcHJvdG9jb2wKKyAqIGVuZ2luZSBncm91cCB0aGF0IHlvdSB3b3VsZCBhbHNvIHJlc2V0IGFsbCBvZiB0aGUgcHJvdG9jb2wgZW5naW5lcyAqLworI2RlZmluZSBTTVVfUkVTRVRfUFJPVE9DT0xfRU5HSU5FX0dST1VQKHBlZykgXAorCShcCisJCSgxIDw8ICgocGVnKSArIDIwKSkgXAorCQl8IFNNVV9SRVNFVF9XSURFX1BPUlRfUVVFVUUocGVnLCAwKSBcCisJCXwgU01VX1JFU0VUX1dJREVfUE9SVF9RVUVVRShwZWcsIDEpIFwKKwkJfCBTTVVfUkVTRVRfUEVHX1BST1RPQ09MX0VOR0lORVMocGVnKSBcCisJKQorCisjZGVmaW5lIFNNVV9SRVNFVF9BTExfUFJPVE9DT0xfRU5HSU5FX0dST1VQUygpIFwKKwkoXAorCQlTTVVfUkVTRVRfUFJPVE9DT0xfRU5HSU5FX0dST1VQKDApIFwKKwkJfCBTTVVfUkVTRVRfUFJPVE9DT0xfRU5HSU5FX0dST1VQKDEpIFwKKwkpCisKKyNkZWZpbmUgU01VX1JFU0VUX1NDVSgpICAoMHhGRkZGRkZGRikKKworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfQVNTSUdOTUVOVF9TVEFSVElOR19TSElGVCAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfQVNTSUdOTUVOVF9TVEFSVElOR19NQVNLICAgICAgICAgICAgICAgKDB4MDAwMDBGRkYpCisjZGVmaW5lIFNNVV9UQVNLX0NPTlRFWFRfQVNTSUdOTUVOVF9FTkRJTkdfU0hJRlQgICAgICAgICAgICAgICAgKDE2KQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX0FTU0lHTk1FTlRfRU5ESU5HX01BU0sgICAgICAgICAgICAgICAgICgweDBGRkYwMDAwKQorI2RlZmluZSBTTVVfVEFTS19DT05URVhUX0FTU0lHTk1FTlRfUkFOR0VfQ0hFQ0tfRU5BQkxFX1NISUZUICAgICgzMSkKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9BU1NJR05NRU5UX1JBTkdFX0NIRUNLX0VOQUJMRV9NQVNLICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU01VX1RBU0tfQ09OVEVYVF9BU1NJR05NRU5UX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAoMHg3MDAwRjAwMCkKKworI2RlZmluZSBTTVVfVENBX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNNVV9UQVNLX0NPTlRFWFRfQVNTSUdOTUVOVF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU01VX1RDQV9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTTVVfVEFTS19DT05URVhUX0FTU0lHTk1FTlRfICMjIG5hbWUpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0NPTlRST0xfUVVFVUVfU0laRV9TSElGVCAgICgwKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9DT05UUk9MX1FVRVVFX1NJWkVfTUFTSyAgICAoMHgwMDAwMEZGRikKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfQ09OVFJPTF9SRVNFUlZFRF9NQVNLICAgICAgKDB4RkZGRkYwMDApCisKKyNkZWZpbmUgU0NVX1VGUUNfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfQ09OVFJPTF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1VGUUNfUVVFVUVfU0laRV9TRVQodmFsdWUpIFwKKwlTQ1VfVUZRQ19HRU5fVkFMKFFVRVVFX1NJWkUsIHZhbHVlKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9QVVRfUE9JTlRFUl9TSElGVCAgICAgICgwKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9QVVRfUE9JTlRFUl9NQVNLICAgICAgICgweDAwMDAwRkZGKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9QVVRfQ1lDTEVfQklUX1NISUZUICAgICgxMikKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfUFVUX0NZQ0xFX0JJVF9NQVNLICAgICAoMHgwMDAwMTAwMCkKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfUFVUX1JFU0VSVkVEX01BU0sgICAgICAoMHhGRkZGRTAwMCkKKworI2RlZmluZSBTQ1VfVUZRUFBfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfUFVUXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfVUZRUFBfR0VOX0JJVChuYW1lKQlcCisJU0NVX0dFTl9CSVQoU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfUFVUXyAjIyBuYW1lKQorCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogU0RNQSBSZWdpc3RlcnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF9QT0lOVEVSX1NISUZUICAgICAgKDApCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF9QT0lOVEVSX01BU0sgICAgICAgKDB4MDAwMDBGRkYpCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF9DWUNMRV9CSVRfU0hJRlQgICAgKDEyKQorI2RlZmluZSBTQ1VfU0RNQV9VTlNPTElDSVRFRF9GUkFNRV9RVUVVRV9HRVRfQ1lDTEVfQklUX01BU0sgICAgICgxMikKKyNkZWZpbmUgU0NVX1NETUFfVU5TT0xJQ0lURURfRlJBTUVfUVVFVUVfR0VUX0VOQUJMRV9CSVRfU0hJRlQgICAoMzEpCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF9FTkFCTEVfQklUX01BU0sgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF9SRVNFUlZFRF9NQVNLICAgICAgKDB4N0ZGRkUwMDApCisKKyNkZWZpbmUgU0NVX1VGUUdQX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1VGUUdQX0dFTl9CSVQobmFtZSkJXAorCVNDVV9HRU5fQklUKFNDVV9TRE1BX1VOU09MSUNJVEVEX0ZSQU1FX1FVRVVFX0dFVF8gIyMgbmFtZSkKKworI2RlZmluZSBTQ1VfVUZRR1BfQ1lDTEVfQklUKHZhbHVlKSBcCisJU0NVX1VGUUdQX0dFTl9CSVQoQ1lDTEVfQklULCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfVUZRR1BfR0VUX1BPSU5URVIodmFsdWUpIFwKKwlTQ1VfVUZRR1BfR0VOX1ZBTFVFKFBPSU5URVIsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9VRlFHUF9FTkFCTEUodmFsdWUpCVwKKwkoU0NVX1VGUUdQX0dFTl9CSVQoRU5BQkxFKSB8IHZhbHVlKQorCisjZGVmaW5lIFNDVV9VRlFHUF9ESVNBQkxFKHZhbHVlKSBcCisJKH5TQ1VfVUZRR1BfR0VOX0JJVChFTkFCTEUpICYgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1VGUUdQX1ZBTFVFKGJpdCwgdmFsdWUpIFwKKwkoU0NVX1VGUUdQX0NZQ0xFX0JJVChiaXQpIHwgU0NVX1VGUUdQX0dFVF9QT0lOVEVSKHZhbHVlKSkKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9BRERSRVNTX01PRElGSUVSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0FERFJFU1NfTU9ESUZJRVJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMEZGRkYpCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fUENJX1JFTEFYRURfT1JERVJJTkdfRU5BQkxFX1NISUZUICAgICAgICAgICAgICAgICAgICAoMTYpCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fUENJX1JFTEFYRURfT1JERVJJTkdfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAgICAoMHgwMDAxMDAwMCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9QQ0lfTk9fU05PT1BfRU5BQkxFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNykKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9QQ0lfTk9fU05PT1BfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDIwMDAwKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0JJR19FTkRJQU5fQ09OVFJPTF9CWVRFX1NXQVBfU0hJRlQgICAgICAgICAgICAgICAgICAgKDE4KQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0JJR19FTkRJQU5fQ09OVFJPTF9CWVRFX1NXQVBfTUFTSyAgICAgICAgICAgICAgICAgICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fQklHX0VORElBTl9DT05UUk9MX1hQSV9TR0xfRkVUQ0hfU0hJRlQgICAgICAgICAgICAgICAoMTkpCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fQklHX0VORElBTl9DT05UUk9MX1hQSV9TR0xfRkVUQ0hfTUFTSyAgICAgICAgICAgICAgICAoMHgwMDA4MDAwMCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9CSUdfRU5ESUFOX0NPTlRST0xfWFBJX1JYX0hFQURFUl9SQU1fV1JJVEVfU0hJRlQgICAgICgyMCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9CSUdfRU5ESUFOX0NPTlRST0xfWFBJX1JYX0hFQURFUl9SQU1fV1JJVEVfTUFTSyAgICAgICgweDAwMTAwMDAwKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0JJR19FTkRJQU5fQ09OVFJPTF9YUElfVUZfQUREUkVTU19GRVRDSF9TSElGVCAgICAgICAgKDIxKQorI2RlZmluZSBTQ1VfUERNQV9DT05GSUdVUkFUSU9OX0JJR19FTkRJQU5fQ09OVFJPTF9YUElfVUZfQUREUkVTU19GRVRDSF9NQVNLICAgICAgICAgKDB4MDAyMDAwMDApCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fQUREUkVTU19NT0RJRklFUl9TRUxFQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAoMjIpCisjZGVmaW5lIFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fQUREUkVTU19NT0RJRklFUl9TRUxFQ1RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMDAwMCkKKyNkZWZpbmUgU0NVX1BETUFfQ09ORklHVVJBVElPTl9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEZGODAwMDAwKQorCisjZGVmaW5lIFNDVV9QRE1BQ1JfR0VOX1ZBTFVFKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfUERNQV9DT05GSUdVUkFUSU9OXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfUERNQUNSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9QRE1BX0NPTkZJR1VSQVRJT05fICMjIG5hbWUpCisKKyNkZWZpbmUgU0NVX1BETUFDUl9CRV9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfUENNQUNSX0dFTl9CSVQoQklHX0VORElBTl9DT05UUk9MXyAjIyBuYW1lKQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfQ0RNQV9DT05GSUdVUkFUSU9OX1BDSV9SRUxBWEVEX09SREVSSU5HX0VOQUJMRV9TSElGVCAgICAgICAgICAgICAgICAgICAgKDgpCisjZGVmaW5lIFNDVV9DRE1BX0NPTkZJR1VSQVRJT05fUENJX1JFTEFYRURfT1JERVJJTkdfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMCkKKworI2RlZmluZSBTQ1VfQ0RNQUNSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9DRE1BX0NPTkZJR1VSQVRJT05fICMjIG5hbWUpCisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKiBTQ1UgTGluayBMYXllciBSZWdpc3RlcnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FR09USUFUSU9OX1RJTUVSX1ZBTFVFU19USU1FT1VUX1NISUZUICAgICAgICAgICAgICgwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUdPVElBVElPTl9USU1FUl9WQUxVRVNfVElNRU9VVF9NQVNLICAgICAgICAgICAgICAoMHgwMDAwMDBGRikKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfU1BFRURfTkVHT1RJQVRJT05fVElNRVJfVkFMVUVTX0xPQ0tfVElNRV9TSElGVCAgICAgICAgICAgKDgpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FR09USUFUSU9OX1RJTUVSX1ZBTFVFU19MT0NLX1RJTUVfTUFTSyAgICAgICAgICAgICgweDAwMDBGRjAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUdPVElBVElPTl9USU1FUl9WQUxVRVNfUkFURV9DSEFOR0VfREVMQVlfU0hJRlQgICAoMTYpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FR09USUFUSU9OX1RJTUVSX1ZBTFVFU19SQVRFX0NIQU5HRV9ERUxBWV9NQVNLICAgICgweDAwRkYwMDAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUdPVElBVElPTl9USU1FUl9WQUxVRVNfRFdPUkRfU1lOQ19USU1FT1VUX1NISUZUICAoMjQpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FR09USUFUSU9OX1RJTUVSX1ZBTFVFU19EV09SRF9TWU5DX1RJTUVPVVRfTUFTSyAgICgweEZGMDAwMDAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9TUEVFRF9ORUNHT0lBVElPTl9USU1FUl9WQUxVRVNfUkVRVUlSRURfTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfU1BFRURfTkVDR09JQVRJT05fVElNRVJfVkFMVUVTX0RFRkFVTFRfTUFTSyAgICAgICAgICAgICAgKDB4N0QwMDY3NkYpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1NQRUVEX05FQ0dPSUFUSU9OX1RJTUVSX1ZBTFVFU19SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICgweDAwRkYwMDAwKQorCisjZGVmaW5lIFNDVV9TQVNfU1BEVE9WX0dFTl9WQUxVRShuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX0xJTktfTEFZRVJfU1BFRURfTkVHT1RJQVRJT05fVElNRVJfVkFMVUVTXyAjIyBuYW1lLCB2YWx1ZSkKKworCisjZGVmaW5lIFNDVV9MSU5LX1NUQVRVU19EV09SRF9TWU5DX0FRVUlSRURfU0hJRlQgICAgICAgICAgICAoMikKKyNkZWZpbmUgU0NVX0xJTktfU1RBVFVTX0RXT1JEX1NZTkNfQVFVSVJFRF9NQVNLICAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBTQ1VfTElOS19TVEFUVVNfVFJBTlNNSVRfUE9SVF9TRUxFQ1RJT05fRE9ORV9TSElGVCAgKDQpCisjZGVmaW5lIFNDVV9MSU5LX1NUQVRVU19UUkFOU01JVF9QT1JUX1NFTEVDVElPTl9ET05FX01BU0sgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgU0NVX0xJTktfU1RBVFVTX1JFQ0VJVkVSX0NSRURJVF9FWEhBVVNURURfU0hJRlQgICAgICg1KQorI2RlZmluZSBTQ1VfTElOS19TVEFUVVNfUkVDRUlWRVJfQ1JFRElUX0VYSEFVU1RFRF9NQVNLICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIFNDVV9MSU5LX1NUQVRVU19SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAoMHhGRkZGRkZDRCkKKworI2RlZmluZSBTQ1VfU0FTX0xMU1RBX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9MSU5LX1NUQVRVU18gIyMgbmFtZSkKKworCisvKiBUT0RPOiBXaGVyZSBpcyB0aGUgU0FUQV9QU0VMVE9WIHJlZ2lzdGVyPyAqLworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogU0NVIFNBUyBNYXhpbXVtIEFyYml0cmF0aW9uIFdhaXQgVGltZSBUaW1lb3V0IFJlZ2lzdGVyCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfU0FTX01BWF9BUkJJVFJBVElPTl9XQUlUX1RJTUVfVElNRU9VVF9WQUxVRV9TSElGVCAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NBU19NQVhfQVJCSVRSQVRJT05fV0FJVF9USU1FX1RJTUVPVVRfVkFMVUVfTUFTSyAgICAgICAgKDB4MDAwMDdGRkYpCisjZGVmaW5lIFNDVV9TQVNfTUFYX0FSQklUUkFUSU9OX1dBSVRfVElNRV9USU1FT1VUX1NDQUxFX1NISUZUICAgICAgICgxNSkKKyNkZWZpbmUgU0NVX1NBU19NQVhfQVJCSVRSQVRJT05fV0FJVF9USU1FX1RJTUVPVVRfU0NBTEVfTUFTSyAgICAgICAgKDB4MDAwMDgwMDApCisKKyNkZWZpbmUgU0NVX1NBU19NQVdUVE9WX0dFTl9WQUxVRShuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NBU19NQVhfQVJCSVRSQVRJT05fV0FJVF9USU1FX1RJTUVPVVRfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TQVNfTUFXVFRPVl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfU0FTX01BWF9BUkJJVFJBVElPTl9XQUlUX1RJTUVfVElNRU9VVF8gIyMgbmFtZSkKKworCisvKgorICogVE9ETzogV2hlcmUgaXMgdGhlIFNBU19MTktUT1YgcmVnc2l0ZXI/CisgKiBUT0RPOiBXaGVyZSBpcyB0aGUgU0FTX1BIWVRPViByZWdpc3Rlcj8gKi8KKworI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NNUF9UQVJHRVRfU0hJRlQgICAgICAgICAgICAoMSkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TTVBfVEFSR0VUX01BU0sgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fU1RQX1RBUkdFVF9TSElGVCAgICAgICAgICAgICgyKQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NUUF9UQVJHRVRfTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TU1BfVEFSR0VUX1NISUZUICAgICAgICAgICAgKDMpCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fU1NQX1RBUkdFVF9NQVNLICAgICAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX0RBX1NBVEFfSE9TVF9TSElGVCAgICAgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9EQV9TQVRBX0hPU1RfTUFTSyAgICAgICAgICAgKDB4MDAwMDAxMDApCisjZGVmaW5lIFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fU01QX0lOSVRJQVRPUl9TSElGVCAgICAgICAgICg5KQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NNUF9JTklUSUFUT1JfTUFTSyAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TVFBfSU5JVElBVE9SX1NISUZUICAgICAgICAgKDEwKQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NUUF9JTklUSUFUT1JfTUFTSyAgICAgICAgICAoMHgwMDAwMDQwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9TU1BfSU5JVElBVE9SX1NISUZUICAgICAgICAgKDExKQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1NTUF9JTklUSUFUT1JfTUFTSyAgICAgICAgICAoMHgwMDAwMDgwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9SRUFTT05fQ09ERV9TSElGVCAgICAgICAgICAgKDE2KQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX1JFQVNPTl9DT0RFX01BU0sgICAgICAgICAgICAoMHgwMDBGMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9BRERSRVNTX0ZSQU1FX1RZUEVfU0hJRlQgICAgKDI0KQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX0FERFJFU1NfRlJBTUVfVFlQRV9NQVNLICAgICAoMHgwRjAwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9ERVZJQ0VfVFlQRV9TSElGVCAgICAgICAgICAgKDI4KQorI2RlZmluZSBTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OX0RFVklDRV9UWVBFX01BU0sgICAgICAgICAgICAoMHg3MDAwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19UUkFOU01JVF9JREVOVElGSUNBVElPTl9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgKDB4ODBGMEYxRjEpCisKKyNkZWZpbmUgU0NVX1NBU19USUlEX0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9TQVNfVFJBTlNNSVRfSURFTlRJRklDQVRJT05fICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TQVNfVElJRF9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfU0FTX1RSQU5TTUlUX0lERU5USUZJQ0FUSU9OXyAjIyBuYW1lKQorCisvKiBTQVMgSWRlbnRpZnkgRnJhbWUgUEhZIElkZW50aWZpZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfSURFTlRJRllfRlJBTUVfUEhZX0lERU5USUZJRVJfQlJFQUtfUkVQTFlfQ0FQQUJMRV9TSElGVCAgICAgICgxNikKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfSURFTlRJRllfRlJBTUVfUEhZX0lERU5USUZJRVJfQlJFQUtfUkVQTFlfQ0FQQUJMRV9NQVNLICAgICAgICgweDAwMDEwMDAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9JREVOVElGWV9GUkFNRV9QSFlfSURFTlRJRklFUl9SRVFVRVNURURfSU5TSURFX1pQU0RTX1NISUZUICAgKDE3KQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9JREVOVElGWV9GUkFNRV9QSFlfSURFTlRJRklFUl9SRVFVRVNURURfSU5TSURFX1pQU0RTX01BU0sgICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSX0lOU0lERV9aUFNEU19QRVJTSVNURU5UX1NISUZUICAoMTgpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSX0lOU0lERV9aUFNEU19QRVJTSVNURU5UX01BU0sgICAoMHgwMDA0MDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfSURFTlRJRllfRlJBTUVfUEhZX0lERU5USUZJRVJfSURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICgyNCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfSURFTlRJRllfRlJBTUVfUEhZX0lERU5USUZJRVJfSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICgweEZGMDAwMDAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9JREVOVElGWV9GUkFNRV9QSFlfSURFTlRJRklFUl9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgICAgKDB4MDBGODAwRkYpCisKKyNkZWZpbmUgU0NVX1NBU19USVBJRF9HRU5fVkFMVUUobmFtZSwgdmFsdWUpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0FTX1RJUElEX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9MSU5LX0xBWUVSX0lERU5USUZZX0ZSQU1FX1BIWV9JREVOVElGSUVSXyAjIyBuYW1lKQorCisKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9UWF9QQVJJVFlfQ0hFQ0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAoNCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9UWF9QQVJJVFlfQ0hFQ0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9UWF9CQURfQ1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAoNikKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9UWF9CQURfQ1JDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX1NDUkFNQkxFUl9TSElGVCAgICAgICAgICAgICAgICAgICAoNykKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX1NDUkFNQkxFUl9NQVNLICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX0RFU0NSQU1CTEVSX1NISUZUICAgICAgICAgICAgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX0RFU0NSQU1CTEVSX01BU0sgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX0NSRURJVF9JTlNFUlRJT05fU0hJRlQgICAgICAgICAgICAoOSkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9ESVNBQkxFX0NSRURJVF9JTlNFUlRJT05fTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9TVVNQRU5EX1BST1RPQ09MX0VOR0lORV9TSElGVCAgICAgICAgICAgICAoMTEpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fU1VTUEVORF9QUk9UT0NPTF9FTkdJTkVfTUFTSyAgICAgICAgICAgICAgKDB4MDAwMDA4MDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fU0FUQV9TUElOVVBfSE9MRF9TSElGVCAgICAgICAgICAgICAgICAgICAgKDEyKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX1NBVEFfU1BJTlVQX0hPTERfTUFTSyAgICAgICAgICAgICAgICAgICAgICgweDAwMDAxMDAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX1RSQU5TTUlUX1BPUlRfU0VMRUNUSU9OX1NJR05BTF9TSElGVCAgICAgICgxMykKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9UUkFOU01JVF9QT1JUX1NFTEVDVElPTl9TSUdOQUxfTUFTSyAgICAgICAoMHgwMDAwMjAwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9IQVJEX1JFU0VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAoMTQpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fSEFSRF9SRVNFVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDQwMDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fT09CX0VOQUJMRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDE1KQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX09PQl9FTkFCTEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDA4MDAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX0VOQUJMRV9GUkFNRV9UWF9JTlNFUlRfQUxJR05fU0hJRlQgICAgICAgICgyMykKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9FTkFCTEVfRlJBTUVfVFhfSU5TRVJUX0FMSUdOX01BU0sgICAgICAgICAoMHgwMDgwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9GT1JXQVJEX0lERU5USUZZX0ZSQU1FX1NISUZUICAgICAgICAgICAgICAoMjcpCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRk9SV0FSRF9JREVOVElGWV9GUkFNRV9NQVNLICAgICAgICAgICAgICAgKDB4MDgwMDAwMDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fRElTQUJMRV9CWVRFX1RSQU5TUE9TRV9TVFBfRlJBTUVfU0hJRlQgICAgKDI4KQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX0RJU0FCTEVfQllURV9UUkFOU1BPU0VfU1RQX0ZSQU1FX01BU0sgICAgICgweDEwMDAwMDAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX09PQl9SRVNFVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgyOSkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9PT0JfUkVTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19QSFlfQ09ORklHVVJBVElPTl9USFJFRV9JQUZfRU5BQkxFX1NISUZUICAgICAgICAgICAgICAgICAgICAoMzApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fVEhSRUVfSUFGX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIFNDVV9TQVNfUEhZX0NPTkZJR1VSQVRJT05fT09CX0FMSUdOMF9FTkFCTEVfU0hJRlQgICAgICAgICAgICAgICAgICAgKDMxKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX09PQl9BTElHTjBfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX1JFUVVJUkVEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAxMDAwMDBGKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX0RFRkFVTFRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQxODAxMDBGKQorI2RlZmluZSBTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorCisjZGVmaW5lIFNDVV9TQVNfUENGR19HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfU0FTX1BIWV9DT05GSUdVUkFUSU9OXyAjIyBuYW1lKQorCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0FMSUdOX0lOU0VSVElPTl9GUkVRVUVOQ1lfR0VORVJBTF9TSElGVCAgICAgICgwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9BTElHTl9JTlNFUlRJT05fRlJFUVVFTkNZX0dFTkVSQUxfTUFTSyAgICAgICAoMHgwMDAwMDdGRikKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfQUxJR05fSU5TRVJUSU9OX0ZSRVFVRU5DWV9DT05ORUNURURfU0hJRlQgICAgKDE2KQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9BTElHTl9JTlNFUlRJT05fRlJFUVVFTkNZX0NPTk5FQ1RFRF9NQVNLICAgICAoMHgwMGZmMDAwMCkKKworI2RlZmluZSBTQ1VfQUxJR05fSU5TRVJUSU9OX0ZSRVFVRU5DWV9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfTElOS19MQVlFUl9BTElHTl9JTlNFUlRJT05fRlJFUVVFTkNZXyMjbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfRU5BQkxFX1NQSU5VUF9DT05UUk9MX0NPVU5UX1NISUZUICAgICgwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9FTkFCTEVfU1BJTlVQX0NPTlRST0xfQ09VTlRfTUFTSyAgICAgKDB4MDAwM0ZGRkYpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0VOQUJMRV9TUElOVVBfQ09OVFJPTF9FTkFCTEVfU0hJRlQgICAoMzEpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX0VOQUJMRV9TUElOVVBfQ09OVFJPTF9FTkFCTEVfTUFTSyAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfRU5BQkxFX1NQSU5VUF9DT05UUk9MX1JFU0VSVkVEX01BU0sgICgweDdGRkMwMDAwKQorCisjZGVmaW5lIFNDVV9FTlNQSU5VUF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfTElOS19MQVlFUl9FTkFCTEVfU1BJTlVQX0NPTlRST0xfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9FTlNQSU5VUF9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfTElOS19MQVlFUl9FTkFCTEVfU1BJTlVQX0NPTlRST0xfICMjIG5hbWUpCisKKworI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1RYU1NDVFlQRV9TSElGVCAgICAgKDEpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfVFhTU0NUWVBFX01BU0sgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19STExSQVRFX1NISUZUICAgICAgICg0KQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1JMTFJBVEVfTUFTSyAgICAgICAgKDB4MDAwMDAwRjApCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1dPMTVHQlBTX1NISUZUICAgICAoOCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TV08xNUdCUFNfTUFTSyAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1NXMTVHQlBTX1NISUZUICAgICAgKDkpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1cxNUdCUFNfTUFTSyAgICAgICAoMHgwMDAwMDIwMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TV08zMEdCUFNfU0hJRlQgICAgICgxMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TV08zMEdCUFNfTUFTSyAgICAgICgweDAwMDAwNDAxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1NXMzBHQlBTX1NISUZUICAgICAgKDExKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1NXMzBHQlBTX01BU0sgICAgICAgKDB4MDAwMDA4MDEpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1dPNjBHQlBTX1NISUZUICAgICAoMTIpCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfU1dPNjBHQlBTX01BU0sgICAgICAoMHgwMDAwMTAwMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TVzYwR0JQU19TSElGVCAgICAgICgxMykKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19TVzYwR0JQU19NQVNLICAgICAgICgweDAwMDAyMDAxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX0VWRU5fUEFSSVRZX1NISUZUICAgKDMxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX0VWRU5fUEFSSVRZX01BU0sgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9DQVBBQklMSVRJRVNfREVGQVVMVF9NQVNLICAgICAgICAoMHgwMDAwM0YwMSkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU19SRVFVSVJFRF9NQVNLICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfQ0FQQUJJTElUSUVTX1JFU0VSVkVEX01BU0sgICAgICAgKDB4N0ZGRkMwMEQpCisKKyNkZWZpbmUgU0NVX1NBU19QSFlDQVBfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU18gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1NBU19QSFlDQVBfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX0xJTktfTEFZRVJfUEhZX0NBUEFCSUxJVElFU18gIyMgbmFtZSkKKworCisjZGVmaW5lIFNDVV9MSU5LX0xBWUVSX1BIWV9TT1VSQ0VfWk9ORV9HUk9VUF9DT05UUk9MX1ZJUlRVQUxfRVhQQU5ERVJfUEhZX1pPTkVfR1JPVVBfU0hJRlQgICgwKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfU09VUkNFX1pPTkVfR1JPVVBfQ09OVFJPTF9WSVJUVUFMX0VYUEFOREVSX1BIWV9aT05FX0dST1VQX01BU0sgICAoMHgwMDAwMDBGRikKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX1NPVVJDRV9aT05FX0dST1VQX0NPTlRST0xfSU5TSURFX1NPVVJDRV9aT05FX0dST1VQX1NISUZUICAgICAgICAgKDMxKQorI2RlZmluZSBTQ1VfTElOS19MQVlFUl9QSFlfU09VUkNFX1pPTkVfR1JPVVBfQ09OVFJPTF9JTlNJREVfU09VUkNFX1pPTkVfR1JPVVBfTUFTSyAgICAgICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgU0NVX0xJTktfTEFZRVJfUEhZX1NPVVJDRV9aT05FX0dST1VQX0NPTlRST0xfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4N0ZGRkZGMDApCisKKyNkZWZpbmUgU0NVX1BTWkdDUl9HRU5fVkFMKG5hbWUsIHZhbHVlKQlcCisJU0NVX0dFTl9WQUxVRShTQ1VfTElOS19MQVlFUl9QSFlfU09VUkNFX1pPTkVfR1JPVVBfQ09OVFJPTF8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1BTWkdDUl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfTElOS19MQVlFUl9QSFlfU09VUkNFX1pPTkVfR1JPVVBfQ09OVFJPTF8gIyMgbmFtZSkKKworI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWk9ORTBfTE9DS0VEX1NISUZUICAgICAgICAoMSkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pPTkUwX0xPQ0tFRF9NQVNLICAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aT05FMF9VUERBVElOR19TSElGVCAgICAgICgyKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWk9ORTBfVVBEQVRJTkdfTUFTSyAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pPTkUxX0xPQ0tFRF9TSElGVCAgICAgICAgKDQpCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aT05FMV9MT0NLRURfTUFTSyAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBTQ1VfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1ZJUlRVQUxfWk9OSU5HX0VYUEFOREVSX0NPTlRST0xfWk9ORTFfVVBEQVRJTkdfU0hJRlQgICAgICAoNSkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pPTkUxX1VQREFUSU5HX01BU0sgICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUwX1NISUZUICgxNikKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pQVF9BU1NPQ0lBVElPTl9QRTBfTUFTSyAgKDB4MDAwMzAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFMF9TSElGVCAgICAgICgxOSkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX0FJUF9FTkFCTEVfUEUwX01BU0sgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUxX1NISUZUICgyMCkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pQVF9BU1NPQ0lBVElPTl9QRTFfTUFTSyAgKDB4MDAzMDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFMV9TSElGVCAgICAgICgyMykKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX0FJUF9FTkFCTEVfUEUxX01BU0sgICAgICAgKDB4MDA4MDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUyX1NISUZUICgyNCkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pQVF9BU1NPQ0lBVElPTl9QRTJfTUFTSyAgKDB4MDMwMDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFMl9TSElGVCAgICAgICgyNykKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX0FJUF9FTkFCTEVfUEUyX01BU0sgICAgICAgKDB4MDgwMDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9aUFRfQVNTT0NJQVRJT05fUEUzX1NISUZUICgyOCkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX1pQVF9BU1NPQ0lBVElPTl9QRTNfTUFTSyAgKDB4MzAwMDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9BSVBfRU5BQkxFX1BFM19TSElGVCAgICAgICgzMSkKKyNkZWZpbmUgU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MX0FJUF9FTkFCTEVfUEUzX01BU0sgICAgICAgKDB4ODAwMDAwMDApCisjZGVmaW5lIFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICgweDQ0NDRGRkM5KQorCisjZGVmaW5lIFNDVV9QRUdfU0NVVlpFQ1JfR0VOX1ZBTChuYW1lLCB2YWwpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfVklSVFVBTF9aT05JTkdfRVhQQU5ERVJfQ09OVFJPTF8gIyMgbmFtZSwgdmFsKQorCisjZGVmaW5lIFNDVV9QRUdfU0NVVlpFQ1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1BST1RPQ09MX0VOR0lORV9HUk9VUF9WSVJUVUFMX1pPTklOR19FWFBBTkRFUl9DT05UUk9MXyAjIyBuYW1lKQorCisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKiBQb3J0IFRhc2sgU2NoZWR1bGVyIHJlZ2lzdGVycyBzaGlmdCBhbmQgbWFzayB2YWx1ZXMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfSVRfTkVYVVNfVElNRU9VVF9TSElGVCAgICAgKDApCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfSVRfTkVYVVNfVElNRU9VVF9NQVNLICAgICAgKDB4MDAwMEZGRkYpCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfVEFTS19USU1FT1VUX1NISUZUICAgICAgICAgKDE2KQorI2RlZmluZSBTQ1VfUFRTR19DT05UUk9MX1RBU0tfVElNRU9VVF9NQVNLICAgICAgICAgICgweDAwRkYwMDAwKQorI2RlZmluZSBTQ1VfUFRTR19DT05UUk9MX1BUU0dfRU5BQkxFX1NISUZUICAgICAgICAgICgyNCkKKyNkZWZpbmUgU0NVX1BUU0dfQ09OVFJPTF9QVFNHX0VOQUJMRV9NQVNLICAgICAgICAgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgU0NVX1BUU0dfQ09OVFJPTF9FVE1fRU5BQkxFX1NISUZUICAgICAgICAgICAoMjUpCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfRVRNX0VOQUJMRV9NQVNLICAgICAgICAgICAgKDB4MDIwMDAwMDApCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfREVGQVVMVF9NQVNLICAgICAgICAgICAgICAgKDB4MDAwMjAwMDIpCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfUkVRVUlSRURfTUFTSyAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIFNDVV9QVFNHX0NPTlRST0xfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgKDB4RkMwMDAwMDApCisKKyNkZWZpbmUgU0NVX1BUU0dDUl9HRU5fVkFMKG5hbWUsIHZhbCkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1BUU0dfQ09OVFJPTF8gIyMgbmFtZSwgdmFsKQorCisjZGVmaW5lIFNDVV9QVFNHQ1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1BUU0dfQ09OVFJPTF8gIyMgbmFtZSkKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfUFRTR19SRUFMX1RJTUVfQ0xPQ0tfU0hJRlQgICAgICAgICAgKDApCisjZGVmaW5lIFNDVV9QVFNHX1JFQUxfVElNRV9DTE9DS19NQVNLICAgICAgICAgICAoMHgwMDAwRkZGRikKKyNkZWZpbmUgU0NVX1BUU0dfUkVBTF9USU1FX0NMT0NLX1JFU0VSVkVEX01BU0sgICgweEZGRkYwMDAwKQorCisjZGVmaW5lIFNDVV9SVENSX0dFTl9WQUwobmFtZSwgdmFsKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfUFRTR18gIyMgbmFtZSwgdmFsKQorCisKKyNkZWZpbmUgU0NVX1BUU0dfUkVBTF9USU1FX0NMT0NLX0NPTlRST0xfUFJFU0NBTEVSX1ZBTFVFX1NISUZUICAoMCkKKyNkZWZpbmUgU0NVX1BUU0dfUkVBTF9USU1FX0NMT0NLX0NPTlRST0xfUFJFU0NBTEVSX1ZBTFVFX01BU0sgICAoMHgwMEZGRkZGRikKKyNkZWZpbmUgU0NVX1BUU0dfUkVBTF9USU1FX0NMT0NLX0NPTlRST0xfUkVTRVJWRURfTUFTSyAgICAgICAgICAoMHhGRjAwMDAwMCkKKworI2RlZmluZSBTQ1VfUlRDQ1JfR0VOX1ZBTChuYW1lLCB2YWwpIFwKKwlTQ1VfR0VOX1ZBTFVFKFNDVV9QVFNHX1JFQUxfVElNRV9DTE9DS19DT05UUk9MXyAjIyBuYW1lLCB2YWwpCisKKworI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX0NPTlRST0xfU1VTUEVORF9TSElGVCAgKDApCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfQ09OVFJPTF9TVVNQRU5EX01BU0sgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgU0NVX1BUU0dfUE9SVF9UQVNLX1NDSEVEVUxFUl9DT05UUk9MX0VOQUJMRV9TSElGVCAgICgxKQorI2RlZmluZSBTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX0NPTlRST0xfRU5BQkxFX01BU0sgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfQ09OVFJPTF9SRVNFUlZFRF9NQVNLICAoMHhGRkZGRkZGQykKKworI2RlZmluZSBTQ1VfUFRTeENSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfQ09OVFJPTF8gIyMgbmFtZSkKKworCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX05FWFRfUk5fVkFMSURfU0hJRlQgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX05FWFRfUk5fVkFMSURfTUFTSyAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX0FDVElWRV9STlNDX0xJU1RfVkFMSURfU0hJRlQgICAgKDEpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX0FDVElWRV9STlNDX0xJU1RfVkFMSURfTUFTSyAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX1BUU19TVVNQRU5ERURfU0hJRlQgICAgICAgICAgICAgKDIpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX1BUU19TVVNQRU5ERURfTUFTSyAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIFNDVV9QVFNHX1BPUlRfVEFTS19TQ0hFRFVMRVJfU1RBVFVTX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAgICAgKDB4RkZGRkZGRjgpCisKKyNkZWZpbmUgU0NVX1BUU3hTUl9HRU5fQklUKG5hbWUpIFwKKwlTQ1VfR0VOX0JJVChTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX1NUQVRVU18gIyMgbmFtZSkKKworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogU0dQSU8gUmVnaXN0ZXIgc2hpZnQgYW5kIG1hc2sgdmFsdWVzCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19FTkFCTEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19FTkFCTEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfQ0xPQ0tfU0VMRUNUX1NISUZUICAgICAgICgxKQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfQ0xPQ0tfU0VMRUNUX01BU0sgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfU0hJRlRfV0lEVEhfU0VMRUNUX1NISUZUICgyKQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfU0hJRlRfV0lEVEhfU0VMRUNUX01BU0sgICgweDAwMDAwMDA0KQorI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19URVNUX0JJVF9TSElGVCAgICAgICAgICAgICAgICAgICgxNSkKKyNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fVEVTVF9CSVRfTUFTSyAgICAgICAgICAgICAgICAgICAoMHgwMDAwODAwMCkKKyNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAgICAoMHhGRkZGN0ZGOCkKKworI2RlZmluZSBTQ1VfU0dJQ1J4X0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9TR1BJT19DT05UUk9MX1NHUElPXyAjIyBuYW1lKQorCisjZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjBfU0hJRlQgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SMF9NQVNLICAgICAgICgweDAwMDAwMDBGKQorI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IxX1NISUZUICAgICAgKDQpCisjZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjFfTUFTSyAgICAgICAoMHgwMDAwMDBGMCkKKyNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SMl9TSElGVCAgICAgICg4KQorI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IyX01BU0sgICAgICAgKDB4MDAwMDBGMDApCisjZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjNfU0hJRlQgICAgICAoMTIpCisjZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjNfTUFTSyAgICAgICAoMHgwMDAwRjAwMCkKKyNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SRVNFUlZFRF9NQVNLICgweEZGRkYwMDAwKQorCisjZGVmaW5lIFNDVV9TR1BCUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkJXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl8gIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IwX1NISUZUICAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IwX01BU0sgICAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IxX1NISUZUICAgICAgICAoNCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IxX01BU0sgICAgICAgICAoMHgwMDAwMDAzMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IyX1NISUZUICAgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IyX01BU0sgICAgICAgICAoMHgwMDAwMDMwMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IzX1NISUZUICAgICAgICAoMTIpCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SM19NQVNLICAgICAgICAgKDB4MDAwMDMwMDApCisjZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SRVNFUlZFRF9NQVNLICAgKDB4RkZGRjg4ODgpCisKKyNkZWZpbmUgU0NVX1NHU0RMUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjBfU0hJRlQgICAgICAgICgwKQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjBfTUFTSyAgICAgICAgICgweDAwMDAwMDAzKQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjFfU0hJRlQgICAgICAgICg0KQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjFfTUFTSyAgICAgICAgICgweDAwMDAwMDMwKQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjJfU0hJRlQgICAgICAgICg4KQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjJfTUFTSyAgICAgICAgICgweDAwMDAwMzAwKQorI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjNfU0hJRlQgICAgICAgICgxMikKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IzX01BU0sgICAgICAgICAoMHgwMDAwMzAwMCkKKyNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1JFU0VSVkVEX01BU0sgICAoMHhGRkZGODg4OCkKKworI2RlZmluZSBTQ1VfU0dTRFVSeF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfTE9XRVJfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EMF9TSElGVCAgICAgICgwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDBfTUFTSyAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QxX1NISUZUICAgICAgKDQpCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EMV9NQVNLICAgICAgICgweDAwMDAwMDMwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDJfU0hJRlQgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QyX01BU0sgICAgICAgKDB4MDAwMDAzMDApCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EM19TSElGVCAgICAgICgxMikKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QzX01BU0sgICAgICAgKDB4MDAwMDMwMDApCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9SRVNFUlZFRF9NQVNLICgweEZGRkY4ODg4KQorCisjZGVmaW5lIFNDVV9TR1NJRExSeF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EMF9TSElGVCAgICAgICgwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDBfTUFTSyAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QxX1NISUZUICAgICAgKDQpCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EMV9NQVNLICAgICAgICgweDAwMDAwMDMwKQorI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDJfU0hJRlQgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QyX01BU0sgICAgICAgKDB4MDAwMDAzMDApCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EM19TSElGVCAgICAgICgxMikKKyNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QzX01BU0sgICAgICAgKDB4MDAwMDMwMDApCisjZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9SRVNFUlZFRF9NQVNLICgweEZGRkY4ODg4KQorCisjZGVmaW5lIFNDVV9TR1NJRFVSeF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TR1BJT19WRU5ET1JfU1BFQ0lGSUNfQ09ERV9TSElGVCAgICAgICAgICAgICgwKQorI2RlZmluZSBTQ1VfU0dQSU9fVkVORE9SX1NQRUNJRklDX0NPREVfTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDAwRikKKyNkZWZpbmUgU0NVX1NHUElPX1ZFTkRPUl9TUEVDSUZJQ19DT0RFX1JFU0VSVkVEX01BU0sgICAgKDB4RkZGRkZGRjApCisKKyNkZWZpbmUgU0NVX1NHVlNDUl9HRU5fVkFMKHZhbHVlKSBcCisJU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fVkVORE9SX1NQRUNJRklDX0NPREUgIyMgbmFtZSwgdmFsdWUpCisKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEwX1NISUZUICAgICAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEwX01BU0sgICAgICAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMF9TSElGVCAgICAoMikKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMF9NQVNLICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTBfU0hJRlQgICAgICAoMykKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTBfTUFTSyAgICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEExX1NISUZUICAgICAgICAgICAoNCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEExX01BU0sgICAgICAgICAgICAoMHgwMDAwMDAzMCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMV9TSElGVCAgICAoNikKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMV9NQVNLICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTFfU0hJRlQgICAgICAoNykKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTFfTUFTSyAgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEyX1NISUZUICAgICAgICAgICAoOCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEyX01BU0sgICAgICAgICAgICAoMHgwMDAwMDMwMCkKKyNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMl9TSElGVCAgICAoMTApCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTJfTUFTSyAgICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9KT0dfRU5BQkxFX0RBVEEyX1NISUZUICAgICAgKDExKQorI2RlZmluZSBTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfSk9HX0VOQUJMRV9EQVRBMl9NQVNLICAgICAgICgweDAwMDAwODAwKQorI2RlZmluZSBTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICgweEZGRkZGMDAwKQorCisjZGVmaW5lIFNDVV9TR09EU1JfR0VOX1ZBTChuYW1lLCB2YWx1ZSkJXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUXyAjIyBuYW1lLCB2YWx1ZSkKKworI2RlZmluZSBTQ1VfU0dPRFNSX0dFTl9CSVQobmFtZSkgXAorCVNDVV9HRU5fQklUKFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF8gIyMgbmFtZSkKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAqIFNNVSBSZWdpc3RlcnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTTVUgUmVnaXN0ZXJzCisgKiBUaGVzZSByZWdpc3RlcnMgYXJlIGJhc2VkIG9mZiBvZiBCQVIwCisgKgorICogVG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIG90aGVyIGZ1bmN0aW9ucyB1c2UKKyAqICAgICAgIEJBUjAgKyBGTiMgKiBTeXN0ZW1QYWdlU2l6ZSAqIDIKKyAqCisgKiBUaGUgVENBIGlzIG9ubHkgYWNjZXNzYWJsZSBmcm9tIEZOIzAgKFBoeXNpY2FsIEZ1bmN0aW9uKSBhbmQgZWFjaAorICogaXMgcHJvZ3JhbW1lZCBieSAoQkFSMCArIFNDVV9TTVVfVENBX09GRlNFVCArIChGTiMgKiAweDA0KSkgb3IKKyAqICAgIFRDQTAgZm9yIEZOIzAgaXMgYXQgQkFSMCArIDB4MDQwMAorICogICAgVENBMSBmb3IgRk4jMSBpcyBhdCBCQVIwICsgMHgwNDA0CisgKiAgICBldGMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBY2Nlc3NhYmxlIHRvIGFsbCBGTiNzICovCisjZGVmaW5lIFNDVV9TTVVfUENQX09GRlNFVCAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgU0NVX1NNVV9BTVJfT0ZGU0VUICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBTQ1VfU01VX0lTUl9PRkZTRVQgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFNDVV9TTVVfSU1SX09GRlNFVCAgICAgICAgICAweDAwMTQKKyNkZWZpbmUgU0NVX1NNVV9JQ0NfT0ZGU0VUICAgICAgICAgIDB4MDAxOAorI2RlZmluZSBTQ1VfU01VX0hUVExCQVJfT0ZGU0VUICAgICAgMHgwMDIwCisjZGVmaW5lIFNDVV9TTVVfSFRUVUJBUl9PRkZTRVQgICAgICAweDAwMjQKKyNkZWZpbmUgU0NVX1NNVV9UQ1JfT0ZGU0VUICAgICAgICAgIDB4MDAyOAorI2RlZmluZSBTQ1VfU01VX0NRTEJBUl9PRkZTRVQgICAgICAgMHgwMDMwCisjZGVmaW5lIFNDVV9TTVVfQ1FVQkFSX09GRlNFVCAgICAgICAweDAwMzQKKyNkZWZpbmUgU0NVX1NNVV9DUVBSX09GRlNFVCAgICAgICAgIDB4MDA0MAorI2RlZmluZSBTQ1VfU01VX0NRR1JfT0ZGU0VUICAgICAgICAgMHgwMDQ0CisjZGVmaW5lIFNDVV9TTVVfQ1FDX09GRlNFVCAgICAgICAgICAweDAwNDgKKy8qIEFjY2Vzc2FibGUgdG8gRk4jMCBvbmx5ICovCisjZGVmaW5lIFNDVV9TTVVfUk5DTEJBUl9PRkZTRVQgICAgICAweDAwODAKKyNkZWZpbmUgU0NVX1NNVV9STkNVQkFSX09GRlNFVCAgICAgIDB4MDA4NAorI2RlZmluZSBTQ1VfU01VX0RDQ19PRkZTRVQgICAgICAgICAgMHgwMDkwCisjZGVmaW5lIFNDVV9TTVVfREZDX09GRlNFVCAgICAgICAgICAweDAwOTQKKyNkZWZpbmUgU0NVX1NNVV9TTVVDU1JfT0ZGU0VUICAgICAgIDB4MDA5OAorI2RlZmluZSBTQ1VfU01VX1NDVVNSQ1JfT0ZGU0VUICAgICAgMHgwMDlDCisjZGVmaW5lIFNDVV9TTVVfU01BV19PRkZTRVQgICAgICAgICAweDAwQTAKKyNkZWZpbmUgU0NVX1NNVV9TTURXX09GRlNFVCAgICAgICAgIDB4MDBBNAorLyogQWNjZXNzYWJsZSB0byBGTiMwIG9ubHkgKi8KKyNkZWZpbmUgU0NVX1NNVV9UQ0FfT0ZGU0VUICAgICAgICAgIDB4MDQwMAorLyogQWNjZXNzYWJsZSB0byBhbGwgRk4jcyAqLworI2RlZmluZSBTQ1VfU01VX01UX01MQVIwX09GRlNFVCAgICAgMHgyMDAwCisjZGVmaW5lIFNDVV9TTVVfTVRfTVVBUjBfT0ZGU0VUICAgICAweDIwMDQKKyNkZWZpbmUgU0NVX1NNVV9NVF9NRFIwX09GRlNFVCAgICAgIDB4MjAwOAorI2RlZmluZSBTQ1VfU01VX01UX1ZDUjBfT0ZGU0VUICAgICAgMHgyMDBDCisjZGVmaW5lIFNDVV9TTVVfTVRfTUxBUjFfT0ZGU0VUICAgICAweDIwMTAKKyNkZWZpbmUgU0NVX1NNVV9NVF9NVUFSMV9PRkZTRVQgICAgIDB4MjAxNAorI2RlZmluZSBTQ1VfU01VX01UX01EUjFfT0ZGU0VUICAgICAgMHgyMDE4CisjZGVmaW5lIFNDVV9TTVVfTVRfVkNSMV9PRkZTRVQgICAgICAweDIwMUMKKyNkZWZpbmUgU0NVX1NNVV9NUEJBX09GRlNFVCAgICAgICAgIDB4MzAwMAorCisvKioKKyAqIHN0cnVjdCBzbXVfcmVnaXN0ZXJzIC0gVGhlc2UgYXJlIHRoZSBTTVUgcmVnaXN0ZXJzCisgKgorICoKKyAqLworc3RydWN0IHNtdV9yZWdpc3RlcnMgeworLyogMHgwMDAwIFBDUCAqLworCXUzMiBwb3N0X2NvbnRleHRfcG9ydDsKKy8qIDB4MDAwNCBBTVIgKi8KKwl1MzIgYWRkcmVzc19tb2RpZmllcjsKKwl1MzIgcmVzZXJ2ZWRfMDg7CisJdTMyIHJlc2VydmVkXzBDOworLyogMHgwMDEwIElTUiAqLworCXUzMiBpbnRlcnJ1cHRfc3RhdHVzOworLyogMHgwMDE0IElNUiAqLworCXUzMiBpbnRlcnJ1cHRfbWFzazsKKy8qIDB4MDAxOCBJQ0MgKi8KKwl1MzIgaW50ZXJydXB0X2NvYWxlc2NlX2NvbnRyb2w7CisJdTMyIHJlc2VydmVkXzFDOworLyogMHgwMDIwIEhUVExCQVIgKi8KKwl1MzIgaG9zdF90YXNrX3RhYmxlX2xvd2VyOworLyogMHgwMDI0IEhUVFVCQVIgKi8KKwl1MzIgaG9zdF90YXNrX3RhYmxlX3VwcGVyOworLyogMHgwMDI4IFRDUiAqLworCXUzMiB0YXNrX2NvbnRleHRfcmFuZ2U7CisJdTMyIHJlc2VydmVkXzJDOworLyogMHgwMDMwIENRTEJBUiAqLworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX2xvd2VyOworLyogMHgwMDM0IENRVUJBUiAqLworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX3VwcGVyOworCXUzMiByZXNlcnZlZF8zODsKKwl1MzIgcmVzZXJ2ZWRfM0M7CisvKiAweDAwNDAgQ1FQUiAqLworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX3B1dDsKKy8qIDB4MDA0NCBDUUdSICovCisJdTMyIGNvbXBsZXRpb25fcXVldWVfZ2V0OworLyogMHgwMDQ4IENRQyAqLworCXUzMiBjb21wbGV0aW9uX3F1ZXVlX2NvbnRyb2w7CisJdTMyIHJlc2VydmVkXzRDOworCXUzMiByZXNlcnZlZF81eFs0XTsKKwl1MzIgcmVzZXJ2ZWRfNnhbNF07CisJdTMyIHJlc2VydmVkXzd4WzRdOworLyoKKyAqIEFjY2Vzc2FibGUgdG8gRk4jMCBvbmx5CisgKiAweDAwODAgUk5DTEJBUiAqLworCXUzMiByZW1vdGVfbm9kZV9jb250ZXh0X2xvd2VyOworLyogMHgwMDg0IFJOQ1VCQVIgKi8KKwl1MzIgcmVtb3RlX25vZGVfY29udGV4dF91cHBlcjsKKwl1MzIgcmVzZXJ2ZWRfODg7CisJdTMyIHJlc2VydmVkXzhDOworLyogMHgwMDkwIERDQyAqLworCXUzMiBkZXZpY2VfY29udGV4dF9jYXBhY2l0eTsKKy8qIDB4MDA5NCBERkMgKi8KKwl1MzIgZGV2aWNlX2Z1bmN0aW9uX2NhcGFjaXR5OworLyogMHgwMDk4IFNNVUNTUiAqLworCXUzMiBjb250cm9sX3N0YXR1czsKKy8qIDB4MDA5QyBTQ1VTUkNSICovCisJdTMyIHNvZnRfcmVzZXRfY29udHJvbDsKKy8qIDB4MDBBMCBTTUFXICovCisJdTMyIG1tcl9hZGRyZXNzX3dpbmRvdzsKKy8qIDB4MDBBNCBTTURXICovCisJdTMyIG1tcl9kYXRhX3dpbmRvdzsKKwl1MzIgcmVzZXJ2ZWRfQTg7CisJdTMyIHJlc2VydmVkX0FDOworLyogQSB3aG9sZSBidW5jaCBvZiByZXNlcnZlZCBzcGFjZSAqLworCXUzMiByZXNlcnZlZF9CeFs0XTsKKwl1MzIgcmVzZXJ2ZWRfQ3hbNF07CisJdTMyIHJlc2VydmVkX0R4WzRdOworCXUzMiByZXNlcnZlZF9FeFs0XTsKKwl1MzIgcmVzZXJ2ZWRfRnhbNF07CisJdTMyIHJlc2VydmVkXzF4eFs2NF07CisJdTMyIHJlc2VydmVkXzJ4eFs2NF07CisJdTMyIHJlc2VydmVkXzN4eFs2NF07CisvKgorICogQWNjZXNzYWJsZSB0byBGTiMwIG9ubHkKKyAqIDB4MDQwMCBUQ0EgKi8KKwl1MzIgdGFza19jb250ZXh0X2Fzc2lnbm1lbnRbMjU2XTsKKy8qIE1TSS1YIHJlZ2lzdGVycyBub3QgaW5jbHVkZWQgKi8KK307CisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0RNQSBSZWdpc3RlcnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9TRE1BX0JBU0UgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgU0NVX1NETUFfUFVGQVRMSEFSX09GRlNFVCAgIDB4MDAwMAorI2RlZmluZSBTQ1VfU0RNQV9QVUZBVFVIQVJfT0ZGU0VUICAgMHgwMDA0CisjZGVmaW5lIFNDVV9TRE1BX1VGTEhCQVJfT0ZGU0VUICAgICAweDAwMDgKKyNkZWZpbmUgU0NVX1NETUFfVUZVSEJBUl9PRkZTRVQgICAgIDB4MDAwQworI2RlZmluZSBTQ1VfU0RNQV9VRlFDX09GRlNFVCAgICAgICAgMHgwMDEwCisjZGVmaW5lIFNDVV9TRE1BX1VGUVBQX09GRlNFVCAgICAgICAweDAwMTQKKyNkZWZpbmUgU0NVX1NETUFfVUZRR1BfT0ZGU0VUICAgICAgIDB4MDAxOAorI2RlZmluZSBTQ1VfU0RNQV9QRE1BQ1JfT0ZGU0VUICAgICAgMHgwMDFDCisjZGVmaW5lIFNDVV9TRE1BX0NETUFDUl9PRkZTRVQgICAgICAweDAwODAKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X3NkbWFfcmVnaXN0ZXJzIC0gVGhlc2UgYXJlIHRoZSBTQ1UgU0RNQSBSZWdpc3RlcnMKKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3NkbWFfcmVnaXN0ZXJzIHsKKy8qIDB4MDAwMCBQVUZBVExIQVIgKi8KKwl1MzIgdWZfYWRkcmVzc190YWJsZV9sb3dlcjsKKy8qIDB4MDAwNCBQVUZBVFVIQVIgKi8KKwl1MzIgdWZfYWRkcmVzc190YWJsZV91cHBlcjsKKy8qIDB4MDAwOCBVRkxIQkFSICovCisJdTMyIHVmX2hlYWRlcl9iYXNlX2FkZHJlc3NfbG93ZXI7CisvKiAweDAwMEMgVUZVSEJBUiAqLworCXUzMiB1Zl9oZWFkZXJfYmFzZV9hZGRyZXNzX3VwcGVyOworLyogMHgwMDEwIFVGUUMgKi8KKwl1MzIgdW5zb2xpY2l0ZWRfZnJhbWVfcXVldWVfY29udHJvbDsKKy8qIDB4MDAxNCBVRlFQUCAqLworCXUzMiB1bnNvbGljaXRlZF9mcmFtZV9wdXRfcG9pbnRlcjsKKy8qIDB4MDAxOCBVRlFHUCAqLworCXUzMiB1bnNvbGljaXRlZF9mcmFtZV9nZXRfcG9pbnRlcjsKKy8qIDB4MDAxQyBQRE1BQ1IgKi8KKwl1MzIgcGRtYV9jb25maWd1cmF0aW9uOworLyogUmVzZXJ2ZWQgdW50aWwgb2Zmc2V0IDB4ODAgKi8KKwl1MzIgcmVzZXJ2ZWRfMDAyMF8wMDdDWzB4MThdOworLyogMHgwMDgwIENETUFDUiAqLworCXUzMiBjZG1hX2NvbmZpZ3VyYXRpb247CisvKiBSZW1haW5kZXIgU0RNQSByZWdpc3RlciBzcGFjZSAqLworCXUzMiByZXNlcnZlZF8wMDg0XzA0MDBbMHhERl07CisKK307CisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKiBTQ1UgTGluayBSZWdpc3RlcnMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisjZGVmaW5lIFNDVV9QRUcwX09GRlNFVCAgICAweDAwMDAKKyNkZWZpbmUgU0NVX1BFRzFfT0ZGU0VUICAgIDB4ODAwMAorCisjZGVmaW5lIFNDVV9UTDBfT0ZGU0VUICAgICAweDAwMDAKKyNkZWZpbmUgU0NVX1RMMV9PRkZTRVQgICAgIDB4MDQwMAorI2RlZmluZSBTQ1VfVEwyX09GRlNFVCAgICAgMHgwODAwCisjZGVmaW5lIFNDVV9UTDNfT0ZGU0VUICAgICAweDBDMDAKKworI2RlZmluZSBTQ1VfTExfT0ZGU0VUICAgICAgMHgwMDgwCisjZGVmaW5lIFNDVV9MTDBfT0ZGU0VUICAgICAoU0NVX1RMMF9PRkZTRVQgKyBTQ1VfTExfT0ZGU0VUKQorI2RlZmluZSBTQ1VfTEwxX09GRlNFVCAgICAgKFNDVV9UTDFfT0ZGU0VUICsgU0NVX0xMX09GRlNFVCkKKyNkZWZpbmUgU0NVX0xMMl9PRkZTRVQgICAgIChTQ1VfVEwyX09GRlNFVCArIFNDVV9MTF9PRkZTRVQpCisjZGVmaW5lIFNDVV9MTDNfT0ZGU0VUICAgICAoU0NVX1RMM19PRkZTRVQgKyBTQ1VfTExfT0ZGU0VUKQorCisvKiBUcmFuc3BvcnQgTGF5ZXIgT2Zmc2V0cyAoUEVHICsgVEwpICovCisjZGVmaW5lIFNDVV9UTENSX09GRlNFVCAgICAgICAgIDB4MDAwMAorI2RlZmluZSBTQ1VfVExBRFRSX09GRlNFVCAgICAgICAweDAwMDQKKyNkZWZpbmUgU0NVX1RMVFRNUl9PRkZTRVQgICAgICAgMHgwMDA4CisjZGVmaW5lIFNDVV9UTEVFQ1IwX09GRlNFVCAgICAgIDB4MDAwQworI2RlZmluZSBTQ1VfU1RQVExEQVJOSV9PRkZTRVQgICAweDAwMTAKKworCisjZGVmaW5lIFNDVV9UTENSX0hBU0hfU0FTX0NIRUNLSU5HX0VOQUJMRV9TSElGVCAgICAoMCkKKyNkZWZpbmUgU0NVX1RMQ1JfSEFTSF9TQVNfQ0hFQ0tJTkdfRU5BQkxFX01BU0sgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBTQ1VfVExDUl9DTEVBUl9UQ0lfTkNRX01BUFBJTkdfVEFCTEVfU0hJRlQgKDEpCisjZGVmaW5lIFNDVV9UTENSX0NMRUFSX1RDSV9OQ1FfTUFQUElOR19UQUJMRV9NQVNLICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgU0NVX1RMQ1JfU1RQX1dSSVRFX0RBVEFfUFJFRkVUQ0hfU0hJRlQgICAgICgzKQorI2RlZmluZSBTQ1VfVExDUl9TVFBfV1JJVEVfREFUQV9QUkVGRVRDSF9NQVNLICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIFNDVV9UTENSX0NNRF9OQUtfU1RBVFVTX0NPREVfU0hJRlQgICAgICAgICAoNCkKKyNkZWZpbmUgU0NVX1RMQ1JfQ01EX05BS19TVEFUVVNfQ09ERV9NQVNLICAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBTQ1VfVExDUl9SRVNFUlZFRF9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4RkZGRkZGRUIpCisKKyNkZWZpbmUgU0NVX1RMQ1JfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1RMQ1JfICMjIG5hbWUpCisKKy8qKgorICogc3RydWN0IHNjdV90cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzIC0gVGhlc2UgYXJlIHRoZSBTQ1UgVHJhbnNwb3J0IExheWVyCisgKiAgICByZWdpc3RlcnMKKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3RyYW5zcG9ydF9sYXllcl9yZWdpc3RlcnMgeworCS8qIDB4MDAwMCBUTENSICovCisJdTMyIGNvbnRyb2w7CisJLyogMHgwMDA0IFRMQURUUiAqLworCXUzMiBhcmJpdHJhdGlvbl9kZWxheV90aW1lcjsKKwkvKiAweDAwMDggVExUVE1SICovCisJdTMyIHRpbWVyX3Rlc3RfbW9kZTsKKwkvKiAweDAwMEMgcmVzZXJ2ZWQgKi8KKwl1MzIgcmVzZXJ2ZWRfMEM7CisJLyogMHgwMDEwIFNUUFRMREFSTkkgKi8KKwl1MzIgc3RwX3JuaTsKKwkvKiAweDAwMTQgVExGRVdQT1JDVFJMICovCisJdTMyIHRsZmVfd3BvX3JlYWRfY29udHJvbDsKKwkvKiAweDAwMTggVExGRVdQT1JEQVRBICovCisJdTMyIHRsZmVfd3BvX3JlYWRfZGF0YTsKKwkvKiAweDAwMUMgUlhUTFNTQ1NSMSAqLworCXUzMiByeHRsX3NpbmdsZV9zdGVwX2NvbnRyb2xfc3RhdHVzXzE7CisJLyogMHgwMDIwIFJYVExTU0NTUjIgKi8KKwl1MzIgcnh0bF9zaW5nbGVfc3RlcF9jb250cm9sX3N0YXR1c18yOworCS8qIDB4MDAyNCBBV1RSRERDUiAqLworCXUzMiB0bGZlX2F3dF9yZXRyeV9kZWxheV9kZWJ1Z19jb250cm9sOworCS8qIFJlbWFpbmRlciBvZiBUTCBtZW1vcnkgc3BhY2UgKi8KKwl1MzIgcmVzZXJ2ZWRfMDAyOF8wMDdGWzB4MTZdOworCit9OworCisvKiBQcm90b2NvbCBFbmdpbmUgR3JvdXAgUmVnaXN0ZXJzICovCisjZGVmaW5lIFNDVV9TQ1VWWkVDUnhfT0ZGU0VUICAgICAgICAweDEwODAKKworLyogTGluayBMYXllciBPZmZzZXRzIChQRUcgKyBUTCArIExMKSAqLworI2RlZmluZSBTQ1VfU0FTX1NQRFRPVl9PRkZTRVQgICAgICAgMHgwMDAwCisjZGVmaW5lIFNDVV9TQVNfTExTVEFfT0ZGU0VUICAgICAgICAweDAwMDQKKyNkZWZpbmUgU0NVX1NBVEFfUFNFTFRPVl9PRkZTRVQgICAgIDB4MDAwOAorI2RlZmluZSBTQ1VfU0FTX1RJTUVUT1ZfT0ZGU0VUICAgICAgMHgwMDEwCisjZGVmaW5lIFNDVV9TQVNfTE9TVE9UX09GRlNFVCAgICAgICAweDAwMTQKKyNkZWZpbmUgU0NVX1NBU19MTktUT1ZfT0ZGU0VUICAgICAgIDB4MDAxOAorI2RlZmluZSBTQ1VfU0FTX1BIWVRPVl9PRkZTRVQgICAgICAgMHgwMDFDCisjZGVmaW5lIFNDVV9TQVNfQUZFUkNOVF9PRkZTRVQgICAgICAweDAwMjAKKyNkZWZpbmUgU0NVX1NBU19XRVJDTlRfT0ZGU0VUICAgICAgIDB4MDAyNAorI2RlZmluZSBTQ1VfU0FTX1RJSURfT0ZGU0VUICAgICAgICAgMHgwMDI4CisjZGVmaW5lIFNDVV9TQVNfVElETkhfT0ZGU0VUICAgICAgICAweDAwMkMKKyNkZWZpbmUgU0NVX1NBU19USUROTF9PRkZTRVQgICAgICAgIDB4MDAzMAorI2RlZmluZSBTQ1VfU0FTX1RJU1NBSF9PRkZTRVQgICAgICAgMHgwMDM0CisjZGVmaW5lIFNDVV9TQVNfVElTU0FMX09GRlNFVCAgICAgICAweDAwMzgKKyNkZWZpbmUgU0NVX1NBU19USVBJRF9PRkZTRVQgICAgICAgIDB4MDAzQworI2RlZmluZSBTQ1VfU0FTX1RJUkVTMl9PRkZTRVQgICAgICAgMHgwMDQwCisjZGVmaW5lIFNDVV9TQVNfQURSU1RBX09GRlNFVCAgICAgICAweDAwNDQKKyNkZWZpbmUgU0NVX1NBU19NQVdUVE9WX09GRlNFVCAgICAgIDB4MDA0OAorI2RlZmluZSBTQ1VfU0FTX0ZSUExERklMX09GRlNFVCAgICAgMHgwMDU0CisjZGVmaW5lIFNDVV9TQVNfUkZDTlRfT0ZGU0VUICAgICAgICAweDAwNjAKKyNkZWZpbmUgU0NVX1NBU19URkNOVF9PRkZTRVQgICAgICAgIDB4MDA2NAorI2RlZmluZSBTQ1VfU0FTX1JGRENOVF9PRkZTRVQgICAgICAgMHgwMDY4CisjZGVmaW5lIFNDVV9TQVNfVEZEQ05UX09GRlNFVCAgICAgICAweDAwNkMKKyNkZWZpbmUgU0NVX1NBU19MRVJDTlRfT0ZGU0VUICAgICAgIDB4MDA3MAorI2RlZmluZSBTQ1VfU0FTX1JESVNFUlJDTlRfT0ZGU0VUICAgMHgwMDc0CisjZGVmaW5lIFNDVV9TQVNfQ1JFUkNOVF9PRkZTRVQgICAgICAweDAwNzgKKyNkZWZpbmUgU0NVX1NUUENUTF9PRkZTRVQgICAgICAgICAgIDB4MDA3QworI2RlZmluZSBTQ1VfU0FTX1BDRkdfT0ZGU0VUICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFNDVV9TQVNfQ0xLU01fT0ZGU0VUICAgICAgICAweDAwODQKKyNkZWZpbmUgU0NVX1NBU19UWENPTVdBS0VfT0ZGU0VUICAgIDB4MDA4OAorI2RlZmluZSBTQ1VfU0FTX1RYQ09NSU5JVF9PRkZTRVQgICAgMHgwMDhDCisjZGVmaW5lIFNDVV9TQVNfVFhDT01TQVNfT0ZGU0VUICAgICAweDAwOTAKKyNkZWZpbmUgU0NVX1NBU19DT01JTklUX09GRlNFVCAgICAgIDB4MDA5NAorI2RlZmluZSBTQ1VfU0FTX0NPTVdBS0VfT0ZGU0VUICAgICAgMHgwMDk4CisjZGVmaW5lIFNDVV9TQVNfQ09NU0FTX09GRlNFVCAgICAgICAweDAwOUMKKyNkZWZpbmUgU0NVX1NBU19TRkVSQ05UX09GRlNFVCAgICAgIDB4MDBBMAorI2RlZmluZSBTQ1VfU0FTX0NERkVSQ05UX09GRlNFVCAgICAgMHgwMEE0CisjZGVmaW5lIFNDVV9TQVNfRE5GRVJDTlRfT0ZGU0VUICAgICAweDAwQTgKKyNkZWZpbmUgU0NVX1NBU19QUlNURVJDTlRfT0ZGU0VUICAgIDB4MDBBQworI2RlZmluZSBTQ1VfU0FTX0NOVENUTF9PRkZTRVQgICAgICAgMHgwMEIwCisjZGVmaW5lIFNDVV9TQVNfU1NQVE9WX09GRlNFVCAgICAgICAweDAwQjQKKyNkZWZpbmUgU0NVX0ZUQ1RMX09GRlNFVCAgICAgICAgICAgIDB4MDBCOAorI2RlZmluZSBTQ1VfRlJDVExfT0ZGU0VUICAgICAgICAgICAgMHgwMEJDCisjZGVmaW5lIFNDVV9GVFdNUktfT0ZGU0VUICAgICAgICAgICAweDAwQzAKKyNkZWZpbmUgU0NVX0VOU1BJTlVQX09GRlNFVCAgICAgICAgIDB4MDBDNAorI2RlZmluZSBTQ1VfU0FTX1RSTlRPVl9PRkZTRVQgICAgICAgMHgwMEM4CisjZGVmaW5lIFNDVV9TQVNfUEhZQ0FQX09GRlNFVCAgICAgICAweDAwQ0MKKyNkZWZpbmUgU0NVX1NBU19QSFlDVExfT0ZGU0VUICAgICAgIDB4MDBEMAorI2RlZmluZSBTQ1VfU0FTX0xMQ1RMX09GRlNFVCAgICAgICAgMHgwMEQ4CisjZGVmaW5lIFNDVV9BRkVfWENWUkNSX09GRlNFVCAgICAgICAweDAwREMKKyNkZWZpbmUgU0NVX0FGRV9MVVRDUl9PRkZTRVQgICAgICAgIDB4MDBFMAorCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX01BWF9MSU5LX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfTUFYX0xJTktfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzKQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9NQVhfTElOS19SQVRFX0dFTjEgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX01BWF9MSU5LX1JBVEVfR0VOMiAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfTUFYX0xJTktfUkFURV9HRU4zICAgICAgICAgICAgICAgICAgICgyKQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9CUk9BRENBU1RfUFJJTUlUSVZFX1NISUZUICAgICAgICAgICAgKDIpCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX0JST0FEQ0FTVF9QUklNSVRJVkVfTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDNGQykKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfQ0xPU0VfTk9fQUNUSVZFX1RBU0tfRElTQUJMRV9TSElGVCAgICgxNikKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfQ0xPU0VfTk9fQUNUSVZFX1RBU0tfRElTQUJMRV9NQVNLICAgICgweDAwMDEwMDAwKQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9DTE9TRV9OT19PVVRCT1VORF9UQVNLX0RJU0FCTEVfU0hJRlQgKDE3KQorI2RlZmluZSBTQ1VfU0FTX0xJTktfTEFZRVJfQ09OVFJPTF9DTE9TRV9OT19PVVRCT1VORF9UQVNLX0RJU0FCTEVfTUFTSyAgKDB4MDAwMjAwMDApCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX05PX09VVEJPVU5EX1RBU0tfVElNRU9VVF9TSElGVCAgICAgICAoMjQpCisjZGVmaW5lIFNDVV9TQVNfTElOS19MQVlFUl9DT05UUk9MX05PX09VVEJPVU5EX1RBU0tfVElNRU9VVF9NQVNLICAgICAgICAoMHhGRjAwMDAwMCkKKyNkZWZpbmUgU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwRkNGQzAwKQorCisjZGVmaW5lIFNDVV9TQVNfTExDVExfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAorCVNDVV9HRU5fVkFMVUUoU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfICMjIG5hbWUsIHZhbHVlKQorCisjZGVmaW5lIFNDVV9TQVNfTExDVExfR0VOX0JJVChuYW1lKSBcCisJU0NVX0dFTl9CSVQoU0NVX1NBU19MSU5LX0xBWUVSX0NPTlRST0xfICMjIG5hbWUpCisKKworLyogI2RlZmluZSBTQ1VfRlJYSEVDUl9EQ05UX09GRlNFVCAgICAgIDB4MDBCMCAqLworI2RlZmluZSBTQ1VfUFNaR0NSX09GRlNFVCAgICAgICAgICAgMHgwMEU0CisjZGVmaW5lIFNDVV9TQVNfUkVDUEhZQ0FQX09GRlNFVCAgICAweDAwRTgKKy8qICNkZWZpbmUgU0NVX1RYX0xVVFNFTF9PRkZTRVQgICAgICAgICAweDAwQjggKi8KKworI2RlZmluZSBTQ1VfU0FTX1BUeENfT0ZGU0VUICAgICAgICAgMHgwMEQ0IC8qIFNhbWUgb2Zmc2V0IGFzIFNBU19UQ1RTVE0gKi8KKworLyoqCisgKiBzdHJ1Y3Qgc2N1X2xpbmtfbGF5ZXJfcmVnaXN0ZXJzIC0gU0NVIExpbmsgTGF5ZXIgUmVnaXN0ZXJzCisgKgorICoKKyAqLworc3RydWN0IHNjdV9saW5rX2xheWVyX3JlZ2lzdGVycyB7CisvKiAweDAwMDAgU0FTX1NQRFRPViAqLworCXUzMiBzcGVlZF9uZWdvdGlhdGlvbl90aW1lcnM7CisvKiAweDAwMDQgU0FTX0xMU1RBICovCisJdTMyIGxpbmtfbGF5ZXJfc3RhdHVzOworLyogMHgwMDA4IFNBVEFfUFNFTFRPViAqLworCXUzMiBwb3J0X3NlbGVjdG9yX3RpbWVvdXQ7CisJdTMyIHJlc2VydmVkMEM7CisvKiAweDAwMTAgU0FTX1RJTUVUT1YgKi8KKwl1MzIgdGltZW91dF91bml0X3ZhbHVlOworLyogMHgwMDE0IFNBU19SQ0RUT1YgKi8KKwl1MzIgcmNkX3RpbWVvdXQ7CisvKiAweDAwMTggU0FTX0xOS1RPViAqLworCXUzMiBsaW5rX3RpbWVyX3RpbWVvdXRzOworLyogMHgwMDFDIFNBU19QSFlUT1YgKi8KKwl1MzIgc2FzX3BoeV90aW1lb3V0czsKKy8qIDB4MDAyMCBTQVNfQUZFUkNOVCAqLworCXUzMiByZWNlaXZlZF9hZGRyZXNzX2ZyYW1lX2Vycm9yX2NvdW50ZXI7CisvKiAweDAwMjQgU0FTX1dFUkNOVCAqLworCXUzMiBpbnZhbGlkX2R3b3JkX2NvdW50ZXI7CisvKiAweDAwMjggU0FTX1RJSUQgKi8KKwl1MzIgdHJhbnNtaXRfaWRlbnRpZmljYXRpb247CisvKiAweDAwMkMgU0FTX1RJRE5IICovCisJdTMyIHNhc19kZXZpY2VfbmFtZV9oaWdoOworLyogMHgwMDMwIFNBU19USUROTCAqLworCXUzMiBzYXNfZGV2aWNlX25hbWVfbG93OworLyogMHgwMDM0IFNBU19USVNTQUggKi8KKwl1MzIgc291cmNlX3Nhc19hZGRyZXNzX2hpZ2g7CisvKiAweDAwMzggU0FTX1RJU1NBTCAqLworCXUzMiBzb3VyY2Vfc2FzX2FkZHJlc3NfbG93OworLyogMHgwMDNDIFNBU19USVBJRCAqLworCXUzMiBpZGVudGlmeV9mcmFtZV9waHlfaWQ7CisvKiAweDAwNDAgU0FTX1RJUkVTMiAqLworCXUzMiBpZGVudGlmeV9mcmFtZV9yZXNlcnZlZDsKKy8qIDB4MDA0NCBTQVNfQURSU1RBICovCisJdTMyIHJlY2VpdmVkX2FkZHJlc3NfZnJhbWU7CisvKiAweDAwNDggU0FTX01BV1RUT1YgKi8KKwl1MzIgbWF4aW11bV9hcmJpdHJhdGlvbl93YWl0X3RpbWVyX3RpbWVvdXQ7CisvKiAweDAwNEMgU0FTX1BUeEMgKi8KKwl1MzIgdHJhbnNtaXRfcHJpbWl0aXZlOworLyogMHgwMDUwIFNBU19ST1JFUyAqLworCXUzMiBlcnJvcl9jb3VudGVyX2V2ZW50X25vdGlmaWNhdGlvbl9jb250cm9sOworLyogMHgwMDU0IFNBU19GUlBMREZJTCAqLworCXUzMiBmcnhxX3BheWxvYWRfZmlsbF90aHJlc2hvbGQ7CisvKiAweDAwNTggU0FTX0xMSEFOR19UT1QgKi8KKwl1MzIgbGlua19sYXllcl9oYW5nX2RldGVjdGlvbl90aW1lb3V0OworCXUzMiByZXNlcnZlZF81QzsKKy8qIDB4MDA2MCBTQVNfUkZDTlQgKi8KKwl1MzIgcmVjZWl2ZWRfZnJhbWVfY291bnQ7CisvKiAweDAwNjQgU0FTX1RGQ05UICovCisJdTMyIHRyYW5zbWl0X2ZyYW1lX2NvdW50OworLyogMHgwMDY4IFNBU19SRkRDTlQgKi8KKwl1MzIgcmVjZWl2ZWRfZHdvcmRfY291bnQ7CisvKiAweDAwNkMgU0FTX1RGRENOVCAqLworCXUzMiB0cmFuc21pdF9kd29yZF9jb3VudDsKKy8qIDB4MDA3MCBTQVNfTEVSQ05UICovCisJdTMyIGxvc3Nfb2Zfc3luY19lcnJvcl9jb3VudDsKKy8qIDB4MDA3NCBTQVNfUkRJU0VSUkNOVCAqLworCXUzMiBydW5uaW5nX2Rpc3Bhcml0eV9lcnJvcl9jb3VudDsKKy8qIDB4MDA3OCBTQVNfQ1JFUkNOVCAqLworCXUzMiByZWNlaXZlZF9mcmFtZV9jcmNfZXJyb3JfY291bnQ7CisvKiAweDAwN0MgU1RQQ1RMICovCisJdTMyIHN0cF9jb250cm9sOworLyogMHgwMDgwIFNBU19QQ0ZHICovCisJdTMyIHBoeV9jb25maWd1cmF0aW9uOworLyogMHgwMDg0IFNBU19DTEtTTSAqLworCXUzMiBjbG9ja19za2V3X21hbmFnZW1lbnQ7CisvKiAweDAwODggU0FTX1RYQ09NV0FLRSAqLworCXUzMiB0cmFuc21pdF9jb213YWtlX3NpZ25hbDsKKy8qIDB4MDA4QyBTQVNfVFhDT01JTklUICovCisJdTMyIHRyYW5zbWl0X2NvbWluaXRfc2lnbmFsOworLyogMHgwMDkwIFNBU19UWENPTVNBUyAqLworCXUzMiB0cmFuc21pdF9jb21zYXNfc2lnbmFsOworLyogMHgwMDk0IFNBU19DT01JTklUICovCisJdTMyIGNvbWluaXRfY29udHJvbDsKKy8qIDB4MDA5OCBTQVNfQ09NV0FLRSAqLworCXUzMiBjb213YWtlX2NvbnRyb2w7CisvKiAweDAwOUMgU0FTX0NPTVNBUyAqLworCXUzMiBjb21zYXNfY29udHJvbDsKKy8qIDB4MDBBMCBTQVNfU0ZFUkNOVCAqLworCXUzMiByZWNlaXZlZF9zaG9ydF9mcmFtZV9jb3VudDsKKy8qIDB4MDBBNCBTQVNfQ0RGRVJDTlQgKi8KKwl1MzIgcmVjZWl2ZWRfZnJhbWVfd2l0aG91dF9jcmVkaXRfY291bnQ7CisvKiAweDAwQTggU0FTX0RORkVSQ05UICovCisJdTMyIHJlY2VpdmVkX2ZyYW1lX2FmdGVyX2RvbmVfY291bnQ7CisvKiAweDAwQUMgU0FTX1BSU1RFUkNOVCAqLworCXUzMiBwaHlfcmVzZXRfcHJvYmxlbV9jb3VudDsKKy8qIDB4MDBCMCBTQVNfQ05UQ1RMICovCisJdTMyIGNvdW50ZXJfY29udHJvbDsKKy8qIDB4MDBCNCBTQVNfU1NQVE9WICovCisJdTMyIHNzcF90aW1lcl90aW1lb3V0X3ZhbHVlczsKKy8qIDB4MDBCOCBGVENUTCAqLworCXUzMiBmdHhfY29udHJvbDsKKy8qIDB4MDBCQyBGUkNUTCAqLworCXUzMiBmcnhfY29udHJvbDsKKy8qIDB4MDBDMCBGVFdNUksgKi8KKwl1MzIgZnR4X3dhdGVybWFyazsKKy8qIDB4MDBDNCBFTlNQSU5VUCAqLworCXUzMiBub3RpZnlfZW5hYmxlX3NwaW51cF9jb250cm9sOworLyogMHgwMEM4IFNBU19UUk5UT1YgKi8KKwl1MzIgc2FzX3RyYWluaW5nX3NlcXVlbmNlX3RpbWVyX3ZhbHVlczsKKy8qIDB4MDBDQyBTQVNfUEhZQ0FQICovCisJdTMyIHBoeV9jYXBhYmlsaXRpZXM7CisvKiAweDAwRDAgU0FTX1BIWUNUTCAqLworCXUzMiBwaHlfY29udHJvbDsKKwl1MzIgcmVzZXJ2ZWRfZDQ7CisvKiAweDAwRDggTExDVEwgKi8KKwl1MzIgbGlua19sYXllcl9jb250cm9sOworLyogMHgwMERDIEFGRV9YQ1ZSQ1IgKi8KKwl1MzIgYWZlX3hjdnJfY29udHJvbDsKKy8qIDB4MDBFMCBBRkVfTFVUQ1IgKi8KKwl1MzIgYWZlX2xvb2t1cF90YWJsZV9jb250cm9sOworLyogMHgwMEU0IFBTWkdDUiAqLworCXUzMiBwaHlfc291cmNlX3pvbmVfZ3JvdXBfY29udHJvbDsKKy8qIDB4MDBFOCBTQVNfUkVDUEhZQ0FQICovCisJdTMyIHJlY2VpdmVfcGh5Y2FwOworCXUzMiByZXNlcnZlZF9lYzsKKy8qIDB4MDBGMCBTTkFGRVJYUlNUQ1RMICovCisJdTMyIHNwZWVkX25lZ290aWF0aW9uX2FmZV9yeF9yZXNldF9jb250cm9sOworLyogMHgwMEY0IFNBU19TU0lQTUNUTCAqLworCXUzMiBwb3dlcl9tYW5hZ2VtZW50X2NvbnRyb2w7CisvKiAweDAwRjggU0FTX1BTUFJFUV9QUklNICovCisJdTMyIHNhc19wbV9wYXJ0aWFsX3JlcXVlc3RfcHJpbWl0aXZlOworLyogMHgwMEZDIFNBU19QU1NSRVFfUFJJTSAqLworCXUzMiBzYXNfcG1fc2x1bWJlcl9yZXF1ZXN0X3ByaW1pdGl2ZTsKKy8qIDB4MDEwMCBTQVNfUFBTQUNLX1BSSU0gKi8KKwl1MzIgc2FzX3BtX2Fja19wcmltaXRpdmVfcmVnaXN0ZXI7CisvKiAweDAxMDQgU0FTX1BTTkFLX1BSSU0gKi8KKwl1MzIgc2FzX3BtX25ha19wcmltaXRpdmVfcmVnaXN0ZXI7CisvKiAweDAxMDggU0FTX1NTSVBNVE9WICovCisJdTMyIHNhc19wcmltaXRpdmVfdGltZW91dDsKKwl1MzIgcmVzZXJ2ZWRfMTBjOworLyogMHgwMTEwIC0gMHgwMTFDIFBMQVBSRENUUkx4UkVHICovCisJdTMyIHBsYV9wcm9kdWN0X2NvbnRyb2xbNF07CisvKiAweDAxMjAgUExBUFJEU1VNUkVHICovCisJdTMyIHBsYV9wcm9kdWN0X3N1bTsKKy8qIDB4MDEyNCBQTEFDT05UUk9MUkVHICovCisJdTMyIHBsYV9jb250cm9sOworLyogUmVtYWluZGVyIG9mIG1lbW9yeSBzcGFjZSA4OTYgYnl0ZXMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDEyOF8wMzdmWzB4OTZdOworCit9OworCisvKgorICogMHgwMEQ0IC8vIFNhbWUgb2Zmc2V0IGFzIFNBU19UQ1RTVE0gU0FTX1BUeEMKKyAqICAgdTMyICAgcHJpbWl0aXZlX3RyYW5zbWl0X2NvbnRyb2w7ICovCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTR1BJTworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBTQ1VfU0dQSU9fT0ZGU0VUICAgICAgICAgMHgxNDAwCisKKy8qICNkZWZpbmUgU0NVX1NHUElPX09GRlNFVCAgICAgICAgIDB4NjAwMCAgIC8vIGxhdGVyIG1vdmVzIHRvIDB4MTQwMCBzZWUgSFNEIDY1MjYyNSAqLworI2RlZmluZSBTQ1VfU0dQSU9fU0dJQ1JfT0ZGU0VUICAgMHgwMDAwCisjZGVmaW5lIFNDVV9TR1BJT19TR1BCUl9PRkZTRVQgICAweDAwMDQKKyNkZWZpbmUgU0NVX1NHUElPX1NHU0RMUl9PRkZTRVQgIDB4MDAwOAorI2RlZmluZSBTQ1VfU0dQSU9fU0dTRFVSX09GRlNFVCAgMHgwMDBDCisjZGVmaW5lIFNDVV9TR1BJT19TR1NJRExSX09GRlNFVCAweDAwMTAKKyNkZWZpbmUgU0NVX1NHUElPX1NHU0lEVVJfT0ZGU0VUIDB4MDAxNAorI2RlZmluZSBTQ1VfU0dQSU9fU0dWU0NSX09GRlNFVCAgMHgwMDE4CisvKiBBZGRyZXNzIGZyb20gMHgwODIwIHRvIDB4MDgzQyAqLworI2RlZmluZSBTQ1VfU0dQSU9fU0dPRFNSX09GRlNFVCAgMHgwMDIwCisKKy8qKgorICogc3RydWN0IHNjdV9zZ3Bpb19yZWdpc3RlcnMgLSBTQ1UgU0dQSU8gUmVnaXN0ZXJzCisgKgorICoKKyAqLworc3RydWN0IHNjdV9zZ3Bpb19yZWdpc3RlcnMgeworLyogMHgwMDAwIFNHUElPX1NHSUNSICovCisJdTMyIGludGVyZmFjZV9jb250cm9sOworLyogMHgwMDA0IFNHUElPX1NHUEJSICovCisJdTMyIGJsaW5rX3JhdGU7CisvKiAweDAwMDggU0dQSU9fU0dTRExSICovCisJdTMyIHN0YXJ0X2RyaXZlX2xvd2VyOworLyogMHgwMDBDIFNHUElPX1NHU0RVUiAqLworCXUzMiBzdGFydF9kcml2ZV91cHBlcjsKKy8qIDB4MDAxMCBTR1BJT19TR1NJRExSICovCisJdTMyIHNlcmlhbF9pbnB1dF9sb3dlcjsKKy8qIDB4MDAxNCBTR1BJT19TR1NJRFVSICovCisJdTMyIHNlcmlhbF9pbnB1dF91cHBlcjsKKy8qIDB4MDAxOCBTR1BJT19TR1ZTQ1IgKi8KKwl1MzIgdmVuZG9yX3NwZWNpZmljX2NvZGU7CisvKiAweDAwMjAgU0dQSU9fU0dPRFNSICovCisJdTMyIG91cHV0X2RhdGFfc2VsZWN0WzhdOworLyogUmVtYWluZGVyIG9mIG1lbW9yeSBzcGFjZSAyNTYgYnl0ZXMgKi8KKwl1MzIgcmVzZXJ2ZWRfMTQ0NF8xNGZmWzB4MzFdOworCit9OworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogRGVmaW5lcyBmb3IgVklJVCBlbnRyeSBvZmZzZXRzCisgKiAqIEFjY2VzcyBhZGRpdGlvbmFsIGVudHJpZXMgYnkgU0NVX1ZJSVRfQkFTRSArIGluZGV4ICogMHgxMAorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgICAgIFNDVV9WSUlUX0JBU0UgICAgIDB4MWMwMAorCitzdHJ1Y3Qgc2N1X3ZpaXRfcmVnaXN0ZXJzIHsKKwl1MzIgcmVnaXN0ZXJzWzI1Nl07Cit9OworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogU0NVIFBPUlQgVEFTSyBTQ0hFRFVMRVIgUkVHSVNURVJTCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjZGVmaW5lIFNDVV9QVFNHX0JBU0UgICAgICAgICAgICAgICAweDEwMDAKKworI2RlZmluZSBTQ1VfUFRTR19QVFNHQ1JfT0ZGU0VUICAgICAgMHgwMDAwCisjZGVmaW5lIFNDVV9QVFNHX1JUQ1JfT0ZGU0VUICAgICAgICAweDAwMDQKKyNkZWZpbmUgU0NVX1BUU0dfUlRDQ1JfT0ZGU0VUICAgICAgIDB4MDAwOAorI2RlZmluZSBTQ1VfUFRTR19QVFMwQ1JfT0ZGU0VUICAgICAgMHgwMDEwCisjZGVmaW5lIFNDVV9QVFNHX1BUUzBTUl9PRkZTRVQgICAgICAweDAwMTQKKyNkZWZpbmUgU0NVX1BUU0dfUFRTMUNSX09GRlNFVCAgICAgIDB4MDAxOAorI2RlZmluZSBTQ1VfUFRTR19QVFMxU1JfT0ZGU0VUICAgICAgMHgwMDFDCisjZGVmaW5lIFNDVV9QVFNHX1BUUzJDUl9PRkZTRVQgICAgICAweDAwMjAKKyNkZWZpbmUgU0NVX1BUU0dfUFRTMlNSX09GRlNFVCAgICAgIDB4MDAyNAorI2RlZmluZSBTQ1VfUFRTR19QVFMzQ1JfT0ZGU0VUICAgICAgMHgwMDI4CisjZGVmaW5lIFNDVV9QVFNHX1BUUzNTUl9PRkZTRVQgICAgICAweDAwMkMKKyNkZWZpbmUgU0NVX1BUU0dfUENTUEUwQ1JfT0ZGU0VUICAgIDB4MDAzMAorI2RlZmluZSBTQ1VfUFRTR19QQ1NQRTFDUl9PRkZTRVQgICAgMHgwMDM0CisjZGVmaW5lIFNDVV9QVFNHX1BDU1BFMkNSX09GRlNFVCAgICAweDAwMzgKKyNkZWZpbmUgU0NVX1BUU0dfUENTUEUzQ1JfT0ZGU0VUICAgIDB4MDAzQworI2RlZmluZSBTQ1VfUFRTR19FVE1UU0NDUl9PRkZTRVQgICAgMHgwMDQwCisjZGVmaW5lIFNDVV9QVFNHX0VUTVJOU0NDUl9PRkZTRVQgICAweDAwNDQKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X3BvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzIC0gVGhlc2UgYXJlIHRoZSBjb250cm9sL3N0YXRzIHBhaXJzCisgKiAgICBmb3IgZWFjaCBQb3J0IFRhc2sgU2NoZWR1bGVyLgorICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfcG9ydF90YXNrX3NjaGVkdWxlcl9yZWdpc3RlcnMgeworCXUzMiBjb250cm9sOworCXUzMiBzdGF0dXM7Cit9OworCisvKioKKyAqIHN0cnVjdCBzY3VfcG9ydF90YXNrX3NjaGVkdWxlcl9ncm91cF9yZWdpc3RlcnMgLSBUaGVzZSBhcmUgdGhlIFBPUlQgVGFzaworICogICAgU2NoZWR1bGVyIHJlZ2lzdGVycworICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfcG9ydF90YXNrX3NjaGVkdWxlcl9ncm91cF9yZWdpc3RlcnMgeworLyogMHgwMDAwIFBUU0dDUiAqLworCXUzMiBjb250cm9sOworLyogMHgwMDA0IFJUQ1IgKi8KKwl1MzIgcmVhbF90aW1lX2Nsb2NrOworLyogMHgwMDA4IFJUQ0NSICovCisJdTMyIHJlYWxfdGltZV9jbG9ja19jb250cm9sOworLyogMHgwMDBDICovCisJdTMyIHJlc2VydmVkXzBDOworLyoKKyAqIDB4MDAxMCBQVFMwQ1IKKyAqIDB4MDAxNCBQVFMwU1IKKyAqIDB4MDAxOCBQVFMxQ1IKKyAqIDB4MDAxQyBQVFMxU1IKKyAqIDB4MDAyMCBQVFMyQ1IKKyAqIDB4MDAyNCBQVFMyU1IKKyAqIDB4MDAyOCBQVFMzQ1IKKyAqIDB4MDAyQyBQVFMzU1IgKi8KKwlzdHJ1Y3Qgc2N1X3BvcnRfdGFza19zY2hlZHVsZXJfcmVnaXN0ZXJzIHBvcnRbNF07CisvKgorICogMHgwMDMwIFBDU1BFMENSCisgKiAweDAwMzQgUENTUEUxQ1IKKyAqIDB4MDAzOCBQQ1NQRTJDUgorICogMHgwMDNDIFBDU1BFM0NSICovCisJdTMyIHByb3RvY29sX2VuZ2luZVs0XTsKKy8qIDB4MDA0MCBFVE1UU0NDUiAqLworCXUzMiB0Y19zY2FubmluZ19pbnRlcnZhbF9jb250cm9sOworLyogMHgwMDQ0IEVUTVJOU0NDUiAqLworCXUzMiBybmNfc2Nhbm5pbmdfaW50ZXJ2YWxfY29udHJvbDsKKy8qIFJlbWFpbmRlciBvZiBtZW1vcnkgc3BhY2UgMTI4IGJ5dGVzICovCisJdTMyIHJlc2VydmVkXzEwNDhfMTA3ZlsweDBFXTsKKworfTsKKworI2RlZmluZSBTQ1VfUFRTR19TQ1VWWkVDUl9PRkZTRVQgICAgICAgIDB4MDAzQworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICogQUZFIFJFR0lTVEVSUworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyNkZWZpbmUgU0NVX0FGRV9NTVJfQkFTRSAgICAgICAgICAgICAgICAgIDB4RTAwMAorCisvKgorICogQUZFIDAgaXMgYXQgb2Zmc2V0IDB4MDgwMAorICogQUZFIDEgaXMgYXQgb2Zmc2V0IDB4MDkwMAorICogQUZFIDIgaXMgYXQgb2Zmc2V0IDB4MGEwMAorICogQUZFIDMgaXMgYXQgb2Zmc2V0IDB4MGIwMCAqLworc3RydWN0IHNjdV9hZmVfdHJhbnNjZWl2ZXIgeworCS8qIDB4MDAwMCBBRkVfWENWUl9DVFJMMCAqLworCXUzMiBhZmVfeGN2cl9jb250cm9sMDsKKwkvKiAweDAwMDQgQUZFX1hDVlJfQ1RSTDEgKi8KKwl1MzIgYWZlX3hjdnJfY29udHJvbDE7CisJLyogMHgwMDA4ICovCisJdTMyIHJlc2VydmVkXzAwMDg7CisJLyogMHgwMDBjIGFmZV9kZnhfcnhfY29udHJvbDAgKi8KKwl1MzIgYWZlX2RmeF9yeF9jb250cm9sMDsKKwkvKiAweDAwMTAgQUZFX0RGWF9SWF9DVFJMMSAqLworCXUzMiBhZmVfZGZ4X3J4X2NvbnRyb2wxOworCS8qIDB4MDAxNCAqLworCXUzMiByZXNlcnZlZF8wMDE0OworCS8qIDB4MDAxOCBBRkVfREZYX1JYX1NUUzAgKi8KKwl1MzIgYWZlX2RmeF9yeF9zdGF0dXMwOworCS8qIDB4MDAxYyBBRkVfREZYX1JYX1NUUzEgKi8KKwl1MzIgYWZlX2RmeF9yeF9zdGF0dXMxOworCS8qIDB4MDAyMCAqLworCXUzMiByZXNlcnZlZF8wMDIwOworCS8qIDB4MDAyNCBBRkVfVFhfQ1RSTCAqLworCXUzMiBhZmVfdHhfY29udHJvbDsKKwkvKiAweDAwMjggQUZFX1RYX0FNUF9DVFJMMCAqLworCXUzMiBhZmVfdHhfYW1wX2NvbnRyb2wwOworCS8qIDB4MDAyYyBBRkVfVFhfQU1QX0NUUkwxICovCisJdTMyIGFmZV90eF9hbXBfY29udHJvbDE7CisJLyogMHgwMDMwIEFGRV9UWF9BTVBfQ1RSTDIgKi8KKwl1MzIgYWZlX3R4X2FtcF9jb250cm9sMjsKKwkvKiAweDAwMzQgQUZFX1RYX0FNUF9DVFJMMyAqLworCXUzMiBhZmVfdHhfYW1wX2NvbnRyb2wzOworCS8qIDB4MDAzOCBhZmVfdHhfc3NjX2NvbnRyb2wgKi8KKwl1MzIgYWZlX3R4X3NzY19jb250cm9sOworCS8qIDB4MDAzYyAqLworCXUzMiByZXNlcnZlZF8wMDNjOworCS8qIDB4MDA0MCBBRkVfUlhfU1NDX0NUUkwwICovCisJdTMyIGFmZV9yeF9zc2NfY29udHJvbDA7CisJLyogMHgwMDQ0IEFGRV9SWF9TU0NfQ1RSTDEgKi8KKwl1MzIgYWZlX3J4X3NzY19jb250cm9sMTsKKwkvKiAweDAwNDggQUZFX1JYX1NTQ19DVFJMMiAqLworCXUzMiBhZmVfcnhfc3NjX2NvbnRyb2wyOworCS8qIDB4MDA0YyBBRkVfUlhfRVFfU1RTMCAqLworCXUzMiBhZmVfcnhfZXFfc3RhdHVzMDsKKwkvKiAweDAwNTAgQUZFX1JYX0VRX1NUUzEgKi8KKwl1MzIgYWZlX3J4X2VxX3N0YXR1czE7CisJLyogMHgwMDU0IEFGRV9SWF9DRFJfU1RTICovCisJdTMyIGFmZV9yeF9jZHJfc3RhdHVzOworCS8qIDB4MDA1OCAqLworCXUzMiByZXNlcnZlZF8wMDU4OworCS8qIDB4MDA1YyBBRkVfQ0hBTl9DVFJMICovCisJdTMyIGFmZV9jaGFubmVsX2NvbnRyb2w7CisJLyogMHgwMDYwLTB4MDA2YyAqLworCXUzMiByZXNlcnZlZF8wMDYwXzAwNmNbMHgwNF07CisJLyogMHgwMDcwIEFGRV9YQ1ZSX0VDX1NUUzAgKi8KKwl1MzIgYWZlX3hjdnJfZXJyb3JfY2FwdHVyZV9zdGF0dXMwOworCS8qIDB4MDA3NCBBRkVfWENWUl9FQ19TVFMxICovCisJdTMyIGFmZV94Y3ZyX2Vycm9yX2NhcHR1cmVfc3RhdHVzMTsKKwkvKiAweDAwNzggQUZFX1hDVlJfRUNfU1RTMiAqLworCXUzMiBhZmVfeGN2cl9lcnJvcl9jYXB0dXJlX3N0YXR1czI7CisJLyogMHgwMDdjIGFmZV94Y3ZyX2VjX3N0YXR1czMgKi8KKwl1MzIgYWZlX3hjdnJfZXJyb3JfY2FwdHVyZV9zdGF0dXMzOworCS8qIDB4MDA4MCBBRkVfWENWUl9FQ19TVFM0ICovCisJdTMyIGFmZV94Y3ZyX2Vycm9yX2NhcHR1cmVfc3RhdHVzNDsKKwkvKiAweDAwODQgQUZFX1hDVlJfRUNfU1RTNSAqLworCXUzMiBhZmVfeGN2cl9lcnJvcl9jYXB0dXJlX3N0YXR1czU7CisJLyogMHgwMDg4LTB4MDBmYyAqLworCXUzMiByZXNlcnZlZF8wMDhjXzAwZmNbMHgxZV07Cit9OworCisvKioKKyAqIHN0cnVjdCBzY3VfYWZlX3JlZ2lzdGVycyAtIEFGRSBSZWdzaXRlcnMKKyAqCisgKgorICovCisvKiBVYW9hIEFGRSByZWdpc3RlcnMgKi8KK3N0cnVjdCBzY3VfYWZlX3JlZ2lzdGVycyB7CisJLyogMFhlMDAwIEFGRV9CSUFTX0NUUkwgKi8KKwl1MzIgYWZlX2JpYXNfY29udHJvbDsKKwl1MzIgcmVzZXJ2ZWRfMDAwNDsKKwkvKiAweDAwMDggQUZFX1BMTF9DVFJMMCAqLworCXUzMiBhZmVfcGxsX2NvbnRyb2wwOworCS8qIDB4MDAwYyBBRkVfUExMX0NUUkwxICovCisJdTMyIGFmZV9wbGxfY29udHJvbDE7CisJLyogMHgwMDEwIEFGRV9QTExfQ1RSTDIgKi8KKwl1MzIgYWZlX3BsbF9jb250cm9sMjsKKwkvKiAweDAwMTQgQUZFX0NCX1NUUyAqLworCXUzMiBhZmVfY29tbW9uX2Jsb2NrX3N0YXR1czsKKwkvKiAweDAwMTgtMHgwMDdjICovCisJdTMyIHJlc2VydmVkXzE4XzdjWzB4MWFdOworCS8qIDB4MDA4MCBBRkVfUE1TTl9NQ1RSTDAgKi8KKwl1MzIgYWZlX3Btc25fbWFzdGVyX2NvbnRyb2wwOworCS8qIDB4MDA4NCBBRkVfUE1TTl9NQ1RSTDEgKi8KKwl1MzIgYWZlX3Btc25fbWFzdGVyX2NvbnRyb2wxOworCS8qIDB4MDA4OCBBRkVfUE1TTl9NQ1RSTDIgKi8KKwl1MzIgYWZlX3Btc25fbWFzdGVyX2NvbnRyb2wyOworCS8qIDB4MDA4Qy0weDAwZmMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDA4Y18wMGZjWzB4MURdOworCS8qIDB4MDEwMCBBRkVfREZYX01TVF9DVFJMMCAqLworCXUzMiBhZmVfZGZ4X21hc3Rlcl9jb250cm9sMDsKKwkvKiAweDAxMDQgQUZFX0RGWF9NU1RfQ1RSTDEgKi8KKwl1MzIgYWZlX2RmeF9tYXN0ZXJfY29udHJvbDE7CisJLyogMHgwMTA4IEFGRV9ERlhfRENMX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9kY2xfY29udHJvbDsKKwkvKiAweDAxMGMgQUZFX0RGWF9ETU9OX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9kaWdpdGFsX21vbml0b3JfY29udHJvbDsKKwkvKiAweDAxMTAgQUZFX0RGWF9BTU9OUF9DVFJMICovCisJdTMyIGFmZV9kZnhfYW5hbG9nX3BfbW9uaXRvcl9jb250cm9sOworCS8qIDB4MDExNCBBRkVfREZYX0FNT05OX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9hbmFsb2dfbl9tb25pdG9yX2NvbnRyb2w7CisJLyogMHgwMTE4IEFGRV9ERlhfTlRMX1NUUyAqLworCXUzMiBhZmVfZGZ4X250bF9zdGF0dXM7CisJLyogMHgwMTFjIEFGRV9ERlhfRklGT19TVFMwICovCisJdTMyIGFmZV9kZnhfZmlmb19zdGF0dXMwOworCS8qIDB4MDEyMCBBRkVfREZYX0ZJRk9fU1RTMSAqLworCXUzMiBhZmVfZGZ4X2ZpZm9fc3RhdHVzMTsKKwkvKiAweDAxMjQgQUZFX0RGWF9NUEFUX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9tYXN0ZXJfcGF0dGVybl9jb250cm9sOworCS8qIDB4MDEyOCBBRkVfREZYX1AwX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9wMF9jb250cm9sOworCS8qIDB4MDEyYy0weDAxYTggQUZFX0RGWF9QMF9EUnggKi8KKwl1MzIgYWZlX2RmeF9wMF9kYXRhWzMyXTsKKwkvKiAweDAxYWMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDFhYzsKKwkvKiAweDAxYjAtMHgwMjBjIEFGRV9ERlhfUDBfSVJ4ICovCisJdTMyIGFmZV9kZnhfcDBfaW5zdHJ1Y3Rpb25bMjRdOworCS8qIDB4MDIxMCAqLworCXUzMiByZXNlcnZlZF8wMjEwOworCS8qIDB4MDIxNCBBRkVfREZYX1AxX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9wMV9jb250cm9sOworCS8qIDB4MDIxOC0weDI0NSBBRkVfREZYX1AxX0RSeCAqLworCXUzMiBhZmVfZGZ4X3AxX2RhdGFbMTZdOworCS8qIDB4MDI1OC0weDAyOWMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDI1OF8wMjljWzB4MTJdOworCS8qIDB4MDJhMC0weDAyYmMgQUZFX0RGWF9QMV9JUnggKi8KKwl1MzIgYWZlX2RmeF9wMV9pbnN0cnVjdGlvbls4XTsKKwkvKiAweDAyYzAtMHgyZmMgKi8KKwl1MzIgcmVzZXJ2ZWRfMDJjMF8wMmZjWzB4MTBdOworCS8qIDB4MDMwMCBBRkVfREZYX1RYX1BNU05fQ1RSTCAqLworCXUzMiBhZmVfZGZ4X3R4X3Btc25fY29udHJvbDsKKwkvKiAweDAzMDQgQUZFX0RGWF9SWF9QTVNOX0NUUkwgKi8KKwl1MzIgYWZlX2RmeF9yeF9wbXNuX2NvbnRyb2w7CisJdTMyIHJlc2VydmVkXzAzMDg7CisJLyogMHgwMzBjIEFGRV9ERlhfTk9BX0NUUkwwICovCisJdTMyIGFmZV9kZnhfbm9hX2NvbnRyb2wwOworCS8qIDB4MDMxMCBBRkVfREZYX05PQV9DVFJMMSAqLworCXUzMiBhZmVfZGZ4X25vYV9jb250cm9sMTsKKwkvKiAweDAzMTQgQUZFX0RGWF9OT0FfQ1RSTDIgKi8KKwl1MzIgYWZlX2RmeF9ub2FfY29udHJvbDI7CisJLyogMHgwMzE4IEFGRV9ERlhfTk9BX0NUUkwzICovCisJdTMyIGFmZV9kZnhfbm9hX2NvbnRyb2wzOworCS8qIDB4MDMxYyBBRkVfREZYX05PQV9DVFJMNCAqLworCXUzMiBhZmVfZGZ4X25vYV9jb250cm9sNDsKKwkvKiAweDAzMjAgQUZFX0RGWF9OT0FfQ1RSTDUgKi8KKwl1MzIgYWZlX2RmeF9ub2FfY29udHJvbDU7CisJLyogMHgwMzI0IEFGRV9ERlhfTk9BX0NUUkw2ICovCisJdTMyIGFmZV9kZnhfbm9hX2NvbnRyb2w2OworCS8qIDB4MDMyOCBBRkVfREZYX05PQV9DVFJMNyAqLworCXUzMiBhZmVfZGZ4X25vYV9jb250cm9sNzsKKwkvKiAweDAzMmMtMHgwN2ZjICovCisJdTMyIHJlc2VydmVkXzAzMmNfMDdmY1sweDEzNV07CisKKwkvKiAweDA4MDAtMHgwYmZjICovCisJc3RydWN0IHNjdV9hZmVfdHJhbnNjZWl2ZXIgc2N1X2FmZV94Y3ZyWzRdOworCisJLyogMHgwYzAwLTB4MGZmYyAqLworCXUzMiByZXNlcnZlZF8wYzAwXzBmZmNbMHgwMTAwXTsKK307CisKK3N0cnVjdCBzY3VfcHJvdG9jb2xfZW5naW5lX2dyb3VwX3JlZ2lzdGVycyB7CisJdTMyIHRhYmxlWzB4RTBdOworfTsKKworCitzdHJ1Y3Qgc2N1X3ZpaXRfaWl0IHsKKwl1MzIgdGFibGVbMjU2XTsKK307CisKKy8qKgorICogUGxhY2Vob2xkZXIgZm9yIHRoZSBaT05FIFBhcnRpdGlvbiBUYWJsZSBpbmZvcm1hdGlvbiBaT05JTkcgd2lsbCBub3QgYmUKKyAqICAgIGluY2x1ZGVkIGluIHRoZSAxLjEgcmVsZWFzZS4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3pvbmVfcGFydGl0aW9uX3RhYmxlIHsKKwl1MzIgdGFibGVbMjA0OF07Cit9OworCisvKioKKyAqIFBsYWNlaG9sZGVyIGZvciB0aGUgQ1JBTSByZWdpc3RlciBzaW5jZSBJIGFtIG5vdCBzdXJlIGlmIHdlIG5lZWQgdG8KKyAqICAgIHJlYWQvd3JpdGUgdG8gdGhlc2UgcmVnaXN0ZXJzIGFzIHlldC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X2NvbXBsZXRpb25fcmFtIHsKKwl1MzIgcmFtWzEyOF07Cit9OworCisvKioKKyAqIFBsYWNlaG9sZGVyIGZvciB0aGUgRkJSQU0gcmVnaXN0ZXJzIHNpbmNlIEkgYW0gbm90IHN1cmUgaWYgd2UgbmVlZCB0bworICogICAgcmVhZC93cml0ZSB0byB0aGVzZSByZWdpc3RlcnMgYXMgeWV0LgorICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfZnJhbWVfYnVmZmVyX3JhbSB7CisJdTMyIHJhbVsxMjhdOworfTsKKworI2RlZmluZSBzY3Vfc2NyYXRjaF9yYW1fU0laRV9JTl9EV09SRFMgIDI1NgorCisvKioKKyAqIFBsYWNlaG9sZGVyIGZvciB0aGUgc2NyYXRjaCBSQU0gcmVnaXN0ZXJzLgorICoKKyAqCisgKi8KK3N0cnVjdCBzY3Vfc2NyYXRjaF9yYW0geworCXUzMiByYW1bc2N1X3NjcmF0Y2hfcmFtX1NJWkVfSU5fRFdPUkRTXTsKK307CisKKy8qKgorICogUGxhY2Vob2xkZXIgc2luY2UgSSBhbSBub3QgeWV0IHN1cmUgd2hhdCB0aGVzZSByZWdpc3RlcnMgYXJlIGhlcmUgZm9yLgorICoKKyAqCisgKi8KK3N0cnVjdCBub2FfcHJvdG9jb2xfZW5naW5lX3BhcnRpdGlvbiB7CisJdTMyIHJlc2VydmVkWzY0XTsKK307CisKKy8qKgorICogUGxhY2Vob2xkZXIgc2luY2UgSSBhbSBub3QgeWV0IHN1cmUgd2hhdCB0aGVzZSByZWdpc3RlcnMgYXJlIGhlcmUgZm9yLgorICoKKyAqCisgKi8KK3N0cnVjdCBub2FfaHViX3BhcnRpdGlvbiB7CisJdTMyIHJlc2VydmVkWzY0XTsKK307CisKKy8qKgorICogUGxhY2Vob2xkZXIgc2luY2UgSSBhbSBub3QgeWV0IHN1cmUgd2hhdCB0aGVzZSByZWdpc3RlcnMgYXJlIGhlcmUgZm9yLgorICoKKyAqCisgKi8KK3N0cnVjdCBub2FfaG9zdF9pbnRlcmZhY2VfcGFydGl0aW9uIHsKKwl1MzIgcmVzZXJ2ZWRbNjRdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdHJhbnNwb3J0X2xpbmtfbGF5ZXJfcGFpciAtIFRoZSBTQ1UgSGFyZHdhcmUgcGFpcnMgdXAgdGhlIFRMCisgKiAgICByZWdpc3RlcnMgd2l0aCB0aGUgTEwgcmVnaXN0ZXJzIHNvIHdlIG11c3QgcGxhY2UgdGhlbSBhZGpjZW50IHRvIG1ha2UgdGhlCisgKiAgICBhcnJheSBvZiByZWdpc3RlcnMgaW4gdGhlIFBFRy4KKyAqCisgKgorICovCitzdHJ1Y3QgdHJhbnNwb3J0X2xpbmtfbGF5ZXJfcGFpciB7CisJc3RydWN0IHNjdV90cmFuc3BvcnRfbGF5ZXJfcmVnaXN0ZXJzIHRsOworCXN0cnVjdCBzY3VfbGlua19sYXllcl9yZWdpc3RlcnMgbGw7Cit9OworCisvKioKKyAqIHN0cnVjdCBzY3VfcGVnX3JlZ2lzdGVycyAtIFNDVSBQcm90b2NvbCBFbmdpbmUgTWVtb3J5IG1hcHBlZCByZWdpc3RlciBzcGFjZS4KKyAqICAgICBUaGVzZSByZWdpc3RlcnMgYXJlIHVuaXF1ZSB0byBlYWNoIHByb3RvY29sIGVuZ2luZSBncm91cC4gIFRoZXJlIGNhbiBiZQorICogICAgYXQgbW9zdCB0d28gUEVHIGZvciBhIHNpbmdsZSBTQ1UgcGFydC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3BlZ19yZWdpc3RlcnMgeworCXN0cnVjdCB0cmFuc3BvcnRfbGlua19sYXllcl9wYWlyIHBlWzRdOworCXN0cnVjdCBzY3VfcG9ydF90YXNrX3NjaGVkdWxlcl9ncm91cF9yZWdpc3RlcnMgcHRzZzsKKwlzdHJ1Y3Qgc2N1X3Byb3RvY29sX2VuZ2luZV9ncm91cF9yZWdpc3RlcnMgcGVnOworCXN0cnVjdCBzY3Vfc2dwaW9fcmVnaXN0ZXJzIHNncGlvOworCXUzMiByZXNlcnZlZF8wMTUwMF8xQkZGWzB4MUMwXTsKKwlzdHJ1Y3Qgc2N1X3ZpaXRfZW50cnkgdmlpdFs2NF07CisJc3RydWN0IHNjdV96b25lX3BhcnRpdGlvbl90YWJsZSB6cHQwOworCXN0cnVjdCBzY3Vfem9uZV9wYXJ0aXRpb25fdGFibGUgenB0MTsKK307CisKKy8qKgorICogc3RydWN0IHNjdV9yZWdpc3RlcnMgLSBTQ1UgcmVnc2l0ZXJzIGluY2x1ZGluZyBib3RoIFBFRyByZWdpc3RlcnMgaWYgd2UgdHVybgorICogICAgb24gdGhhdCBjb21waWxlIG9wdGlvbi4gQWxsIG9mIHRoZXNlIHJlZ2lzdGVycyBhcmUgaW4gdGhlIG1lbW9yeSBtYXBwZWQKKyAqICAgIHNwYWNlIHJldHVybmVkIGZyb20gQkFSMS4KKyAqCisgKgorICovCitzdHJ1Y3Qgc2N1X3JlZ2lzdGVycyB7CisJLyogMHgwMDAwIC0gUEVHIDAgKi8KKwlzdHJ1Y3Qgc2N1X3BlZ19yZWdpc3RlcnMgcGVnMDsKKworCS8qIDB4NjAwMCAtIFNETUEgYW5kIE1pc2NlbGxhbmVvdXMgKi8KKwlzdHJ1Y3Qgc2N1X3NkbWFfcmVnaXN0ZXJzIHNkbWE7CisJc3RydWN0IHNjdV9jb21wbGV0aW9uX3JhbSBjcmFtOworCXN0cnVjdCBzY3VfZnJhbWVfYnVmZmVyX3JhbSBmYnJhbTsKKwl1MzIgcmVzZXJ2ZWRfNjgwMF82OUZGWzB4ODBdOworCXN0cnVjdCBub2FfcHJvdG9jb2xfZW5naW5lX3BhcnRpdGlvbiBub2FfcGU7CisJc3RydWN0IG5vYV9odWJfcGFydGl0aW9uIG5vYV9odWI7CisJc3RydWN0IG5vYV9ob3N0X2ludGVyZmFjZV9wYXJ0aXRpb24gbm9hX2lmOworCXUzMiByZXNlcnZlZF82ZDAwXzdmZmZbMHg0YzBdOworCisJLyogMHg4MDAwIC0gUEVHIDEgKi8KKwlzdHJ1Y3Qgc2N1X3BlZ19yZWdpc3RlcnMgcGVnMTsKKworCS8qIDB4RTAwMCAtIEFGRSBSZWdpc3RlcnMgKi8KKwlzdHJ1Y3Qgc2N1X2FmZV9yZWdpc3RlcnMgYWZlOworCisJLyogMHhGMDAwIC0gcmVzZXJ2ZWQgKi8KKwl1MzIgcmVzZXJ2ZWRfZjAwMF8yMTFmZmZbMHg4MGMwMF07CisKKwkvKiAweDIxMjAwMCAtIHNjcmF0Y2ggUkFNICovCisJc3RydWN0IHNjdV9zY3JhdGNoX3JhbSBzY3JhdGNoX3JhbTsKK307CisKKyNlbmRpZiAgIC8qIF9TQ1VfUkVHSVNURVJTX0hFQURFUl8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU2MzY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX2RldmljZS5jCkBAIC0wLDAgKzEsMTUwMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlIDxzY3NpL3Nhcy5oPgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisjaW5jbHVkZSAicmVtb3RlX2RldmljZS5oIgorI2luY2x1ZGUgInJlcXVlc3QuaCIKKyNpbmNsdWRlICJyZW1vdGVfbm9kZV9jb250ZXh0LmgiCisjaW5jbHVkZSAic2N1X2V2ZW50X2NvZGVzLmgiCisjaW5jbHVkZSAidGFzay5oIgorCisvKioKKyAqIGlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBpaG9zdCB3aGVuCisgKiAgICB0aGUgcmVtb3RlIGRldmljZSBpcyBub3QgcmVhZHkuIFdlIG1hcmsgdGhlIGlzY2kgZGV2aWNlIGFzIHJlYWR5IChub3QKKyAqICAgICJyZWFkeV9mb3JfaW8iKSBhbmQgc2lnbmFsIHRoZSB3YWl0aW5nIHByb2NjZXNzLgorICogQGlzY2lfaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBpc2NpIGhvc3Qgb2JqZWN0LgorICogQGlzY2lfZGV2aWNlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHJlbW90ZSBkZXZpY2UKKyAqCisgKiBzY2lfbG9jayBpcyBoZWxkIG9uIGVudHJhbmNlIHRvIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LCB1MzIgcmVhc29uKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfZGV2aWNlID0gJXBcbiIsIF9fZnVuY19fLCBpZGV2KTsKKworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NUT1BfUkVRVUVTVEVEOgorCQlzZXRfYml0KElERVZfR09ORSwgJmlkZXYtPmZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NBVEFfU0RCX0VSUk9SX0ZJU19SRUNFSVZFRDoKKwkJc2V0X2JpdChJREVWX0lPX05DUUVSUk9SLCAmaWRldi0+ZmxhZ3MpOworCisJCS8qIEtpbGwgYWxsIG91dHN0YW5kaW5nIHJlcXVlc3RzIGZvciB0aGUgZGV2aWNlLiAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlyZXEsICZpZGV2LT5yZXFzX2luX3Byb2Nlc3MsIGRldl9ub2RlKSB7CisKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBpc2NpX2RldmljZSA9ICVwIHJlcXVlc3QgPSAlcFxuIiwKKwkJCQlfX2Z1bmNfXywgaWRldiwgaXJlcSk7CisKKwkJCXNjaV9jb250cm9sbGVyX3Rlcm1pbmF0ZV9yZXF1ZXN0KGlob3N0LAorCQkJCQkJCSAgaWRldiwKKwkJCQkJCQkgIGlyZXEpOworCQl9CisJCS8qIEZhbGwgdGhyb3VnaCBpbnRvIHRoZSBkZWZhdWx0IGNhc2UuLi4gKi8KKwlkZWZhdWx0OgorCQljbGVhcl9iaXQoSURFVl9JT19SRUFEWSwgJmlkZXYtPmZsYWdzKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGlzY2lfcmVtb3RlX2RldmljZV9yZWFkeSgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGlob3N0IHdoZW4gdGhlCisgKiAgICByZW1vdGUgZGV2aWNlIGlzIHJlYWR5LiBXZSBtYXJrIHRoZSBpc2NpIGRldmljZSBhcyByZWFkeSBhbmQgc2lnbmFsIHRoZQorICogICAgd2FpdGluZyBwcm9jY2Vzcy4KKyAqIEBpaG9zdDogb3VyIHZhbGlkIGlzY2lfaG9zdAorICogQGlkZXY6IHJlbW90ZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9yZWFkeShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlkZXYgPSAlcFxuIiwgX19mdW5jX18sIGlkZXYpOworCisJY2xlYXJfYml0KElERVZfSU9fTkNRRVJST1IsICZpZGV2LT5mbGFncyk7CisJc2V0X2JpdChJREVWX0lPX1JFQURZLCAmaWRldi0+ZmxhZ3MpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSURFVl9TVEFSVF9QRU5ESU5HLCAmaWRldi0+ZmxhZ3MpKQorCQl3YWtlX3VwKCZpaG9zdC0+ZXZlbnRxKTsKK30KKworLyogY2FsbGVkIG9uY2UgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaXMgcmVhZHkgdG8gYmUgZnJlZWQuCisgKiBUaGUgcmVtb3RlIGRldmljZSBjYW4gbm93IHJlcG9ydCB0aGF0IGl0cyBzdG9wIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gbm9uZQorICovCitzdGF0aWMgdm9pZCBybmNfZGVzdHJ1Y3RfZG9uZSh2b2lkICpfZGV2KQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBfZGV2OworCisJQlVHX09OKGlkZXYtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCAhPSAwKTsKKwlzY2lfY2hhbmdlX3N0YXRlKCZpZGV2LT5zbSwgU0NJX0RFVl9TVE9QUEVEKTsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV90ZXJtaW5hdGVfcmVxdWVzdHMoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzICA9IFNDSV9TVUNDRVNTOworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfSU9fUkVRVUVTVFM7IGkrKykgeworCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gaWhvc3QtPnJlcXNbaV07CisJCWVudW0gc2NpX3N0YXR1cyBzOworCisJCWlmICghdGVzdF9iaXQoSVJFUV9BQ1RJVkUsICZpcmVxLT5mbGFncykgfHwKKwkJICAgIGlyZXEtPnRhcmdldF9kZXZpY2UgIT0gaWRldikKKwkJCWNvbnRpbnVlOworCisJCXMgPSBzY2lfY29udHJvbGxlcl90ZXJtaW5hdGVfcmVxdWVzdChpaG9zdCwgaWRldiwgaXJlcSk7CisJCWlmIChzICE9IFNDSV9TVUNDRVNTKQorCQkJc3RhdHVzID0gczsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQl1MzIgdGltZW91dCkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9ERVZfSU5JVElBTDoKKwljYXNlIFNDSV9ERVZfRkFJTEVEOgorCWNhc2UgU0NJX0RFVl9GSU5BTDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJY2FzZSBTQ0lfREVWX1NUT1BQRUQ6CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9ERVZfU1RBUlRJTkc6CisJCS8qIGRldmljZSBub3Qgc3RhcnRlZCBzbyB0aGVyZSBoYWQgYmV0dGVyIGJlIG5vIHJlcXVlc3RzICovCisJCUJVR19PTihpZGV2LT5zdGFydGVkX3JlcXVlc3RfY291bnQgIT0gMCk7CisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2Rlc3RydWN0KCZpZGV2LT5ybmMsCisJCQkJCQkgICAgICBybmNfZGVzdHJ1Y3RfZG9uZSwgaWRldik7CisJCS8qIFRyYW5zaXRpb24gdG8gdGhlIHN0b3BwaW5nIHN0YXRlIGFuZCB3YWl0IGZvciB0aGUKKwkJICogcmVtb3RlIG5vZGUgdG8gY29tcGxldGUgYmVpbmcgcG9zdGVkIGFuZCBpbnZhbGlkYXRlZC4KKwkJICovCisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9ERVZfU1RPUFBJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfREVWX1JFQURZOgorCWNhc2UgU0NJX1NUUF9ERVZfSURMRToKKwljYXNlIFNDSV9TVFBfREVWX0NNRDoKKwljYXNlIFNDSV9TVFBfREVWX05DUToKKwljYXNlIFNDSV9TVFBfREVWX05DUV9FUlJPUjoKKwljYXNlIFNDSV9TVFBfREVWX0FXQUlUX1JFU0VUOgorCWNhc2UgU0NJX1NNUF9ERVZfSURMRToKKwljYXNlIFNDSV9TTVBfREVWX0NNRDoKKwkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX0RFVl9TVE9QUElORyk7CisJCWlmIChpZGV2LT5zdGFydGVkX3JlcXVlc3RfY291bnQgPT0gMCkgeworCQkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfZGVzdHJ1Y3QoJmlkZXYtPnJuYywKKwkJCQkJCQkgICAgICBybmNfZGVzdHJ1Y3RfZG9uZSwgaWRldik7CisJCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJCX0gZWxzZQorCQkJcmV0dXJuIHNjaV9yZW1vdGVfZGV2aWNlX3Rlcm1pbmF0ZV9yZXF1ZXN0cyhpZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0lfREVWX1NUT1BQSU5HOgorCQkvKiBBbGwgcmVxdWVzdHMgc2hvdWxkIGhhdmUgYmVlbiB0ZXJtaW5hdGVkLCBidXQgaWYgdGhlcmUgaXMgYW4KKwkJICogYXR0ZW1wdCB0byBzdG9wIGEgZGV2aWNlIGFscmVhZHkgaW4gdGhlIHN0b3BwaW5nIHN0YXRlLCB0aGVuCisJCSAqIHRyeSBhZ2FpbiB0byB0ZXJtaW5hdGUuCisJCSAqLworCQlyZXR1cm4gc2NpX3JlbW90ZV9kZXZpY2VfdGVybWluYXRlX3JlcXVlc3RzKGlkZXYpOworCWNhc2UgU0NJX0RFVl9SRVNFVFRJTkc6CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9ERVZfU1RPUFBJTkcpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXQoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9ERVZfSU5JVElBTDoKKwljYXNlIFNDSV9ERVZfU1RPUFBFRDoKKwljYXNlIFNDSV9ERVZfU1RBUlRJTkc6CisJY2FzZSBTQ0lfU01QX0RFVl9JRExFOgorCWNhc2UgU0NJX1NNUF9ERVZfQ01EOgorCWNhc2UgU0NJX0RFVl9TVE9QUElORzoKKwljYXNlIFNDSV9ERVZfRkFJTEVEOgorCWNhc2UgU0NJX0RFVl9SRVNFVFRJTkc6CisJY2FzZSBTQ0lfREVWX0ZJTkFMOgorCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KGlkZXYpLCAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwljYXNlIFNDSV9ERVZfUkVBRFk6CisJY2FzZSBTQ0lfU1RQX0RFVl9JRExFOgorCWNhc2UgU0NJX1NUUF9ERVZfQ01EOgorCWNhc2UgU0NJX1NUUF9ERVZfTkNROgorCWNhc2UgU0NJX1NUUF9ERVZfTkNRX0VSUk9SOgorCWNhc2UgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQ6CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9ERVZfUkVTRVRUSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0X2NvbXBsZXRlKHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgIT0gU0NJX0RFVl9SRVNFVFRJTkcpIHsKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYoaWRldiksICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9ERVZfUkVBRFkpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJICAgICAgIHUzMiBzdXNwZW5kX3R5cGUpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgIT0gU0NJX1NUUF9ERVZfQ01EKSB7CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KGlkZXYpLCAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlyZXR1cm4gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3VzcGVuZCgmaWRldi0+cm5jLAorCQkJCQkJICAgIHN1c3BlbmRfdHlwZSwgTlVMTCwgTlVMTCk7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9mcmFtZV9oYW5kbGVyKHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCQkgICAgIHUzMiBmcmFtZV9pbmRleCkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX0RFVl9JTklUSUFMOgorCWNhc2UgU0NJX0RFVl9TVE9QUEVEOgorCWNhc2UgU0NJX0RFVl9TVEFSVElORzoKKwljYXNlIFNDSV9TVFBfREVWX0lETEU6CisJY2FzZSBTQ0lfU01QX0RFVl9JRExFOgorCWNhc2UgU0NJX0RFVl9GSU5BTDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJLyogUmV0dXJuIHRoZSBmcmFtZSBiYWNrIHRvIHRoZSBjb250cm9sbGVyICovCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJY2FzZSBTQ0lfREVWX1JFQURZOgorCWNhc2UgU0NJX1NUUF9ERVZfTkNRX0VSUk9SOgorCWNhc2UgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQ6CisJY2FzZSBTQ0lfREVWX1NUT1BQSU5HOgorCWNhc2UgU0NJX0RFVl9GQUlMRUQ6CisJY2FzZSBTQ0lfREVWX1JFU0VUVElORzogeworCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCQlzdHJ1Y3Qgc3NwX2ZyYW1lX2hkciBoZHI7CisJCXZvaWQgKmZyYW1lX2hlYWRlcjsKKwkJc3NpemVfdCB3b3JkX2NudDsKKworCQlzdGF0dXMgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAgJmZyYW1lX2hlYWRlcik7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXdvcmRfY250ID0gc2l6ZW9mKGhkcikgLyBzaXplb2YodTMyKTsKKwkJc2NpX3N3YWIzMl9jcHkoJmhkciwgZnJhbWVfaGVhZGVyLCB3b3JkX2NudCk7CisKKwkJaXJlcSA9IHNjaV9yZXF1ZXN0X2J5X3RhZyhpaG9zdCwgYmUxNl90b19jcHUoaGRyLnRhZykpOworCQlpZiAoaXJlcSAmJiBpcmVxLT50YXJnZXRfZGV2aWNlID09IGlkZXYpIHsKKwkJCS8qIFRoZSBJTyByZXF1ZXN0IGlzIG5vdyBpbiBjaGFyZ2Ugb2YgcmVsZWFzaW5nIHRoZSBmcmFtZSAqLworCQkJc3RhdHVzID0gc2NpX2lvX3JlcXVlc3RfZnJhbWVfaGFuZGxlcihpcmVxLCBmcmFtZV9pbmRleCk7CisJCX0gZWxzZSB7CisJCQkvKiBXZSBjb3VsZCBub3QgbWFwIHRoaXMgdGFnIHRvIGEgdmFsaWQgSU8KKwkJCSAqIHJlcXVlc3QgSnVzdCB0b3NzIHRoZSBmcmFtZSBhbmQgY29udGludWUKKwkJCSAqLworCQkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFNDSV9TVFBfREVWX05DUTogeworCQlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzICpoZHI7CisKKwkJc3RhdHVzID0gc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgICh2b2lkICoqKSZoZHIpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlpZiAoaGRyLT5maXNfdHlwZSA9PSBGSVNfU0VUREVWQklUUyAmJgorCQkgICAgKGhkci0+c3RhdHVzICYgQVRBX0VSUikpIHsKKwkJCWlkZXYtPm5vdF9yZWFkeV9yZWFzb24gPSBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NBVEFfU0RCX0VSUk9SX0ZJU19SRUNFSVZFRDsKKworCQkJLyogVE9ETyBDaGVjayBzYWN0aXZlIGFuZCBjb21wbGV0ZSBhc3NvY2lhdGVkIElPIGlmIGFueS4gKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9TVFBfREVWX05DUV9FUlJPUik7CisJCX0gZWxzZSBpZiAoaGRyLT5maXNfdHlwZSA9PSBGSVNfUkVHRDJIICYmCisJCQkgICAoaGRyLT5zdGF0dXMgJiBBVEFfRVJSKSkgeworCQkJLyoKKwkJCSAqIFNvbWUgZGV2aWNlcyByZXR1cm4gRDJIIEZJUyB3aGVuIGFuIE5DUSBlcnJvciBpcyBkZXRlY3RlZC4KKwkJCSAqIFRyZWF0IHRoaXMgbGlrZSBhbiBTREIgZXJyb3IgRklTIHJlYWR5IHJlYXNvbi4KKwkJCSAqLworCQkJaWRldi0+bm90X3JlYWR5X3JlYXNvbiA9IFNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfU0FUQV9TREJfRVJST1JfRklTX1JFQ0VJVkVEOworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaWRldi0+c20sIFNDSV9TVFBfREVWX05DUV9FUlJPUik7CisJCX0gZWxzZQorCQkJc3RhdHVzID0gU0NJX0ZBSUxVUkU7CisKKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQlicmVhazsKKwl9CisJY2FzZSBTQ0lfU1RQX0RFVl9DTUQ6CisJY2FzZSBTQ0lfU01QX0RFVl9DTUQ6CisJCS8qIFRoZSBkZXZpY2UgZG9lcyBub3QgcHJvY2VzcyBhbnkgVUYgcmVjZWl2ZWQgZnJvbSB0aGUgaGFyZHdhcmUgd2hpbGUKKwkJICogaW4gdGhpcyBzdGF0ZS4gIEFsbCB1bnNvbGljaXRlZCBmcmFtZXMgYXJlIGZvcndhcmRlZCB0byB0aGUgaW8gcmVxdWVzdAorCQkgKiBvYmplY3QuCisJCSAqLworCQlzdGF0dXMgPSBzY2lfaW9fcmVxdWVzdF9mcmFtZV9oYW5kbGVyKGlkZXYtPndvcmtpbmdfcmVxdWVzdCwgZnJhbWVfaW5kZXgpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgYm9vbCBpc19yZW1vdGVfZGV2aWNlX3JlYWR5KHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9ERVZfUkVBRFk6CisJY2FzZSBTQ0lfU1RQX0RFVl9JRExFOgorCWNhc2UgU0NJX1NUUF9ERVZfQ01EOgorCWNhc2UgU0NJX1NUUF9ERVZfTkNROgorCWNhc2UgU0NJX1NUUF9ERVZfTkNRX0VSUk9SOgorCWNhc2UgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQ6CisJY2FzZSBTQ0lfU01QX0RFVl9JRExFOgorCWNhc2UgU0NJX1NNUF9ERVZfQ01EOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJICAgICB1MzIgZXZlbnRfY29kZSkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X3R5cGUoZXZlbnRfY29kZSkpIHsKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19PUFNfTUlTQzoKKwljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYOgorCWNhc2UgU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFhfUlg6CisJCXN0YXR1cyA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2V2ZW50X2hhbmRsZXIoJmlkZXYtPnJuYywgZXZlbnRfY29kZSk7CisJCWJyZWFrOworCWNhc2UgU0NVX0VWRU5UX1RZUEVfUFRYX1NDSEVEVUxFX0VWRU5UOgorCQlpZiAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpID09IFNDVV9FVkVOVF9JVF9ORVhVU19USU1FT1VUKSB7CisJCQlzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCQkJLyogU3VzcGVuZCB0aGUgYXNzb2NpYXRlZCBSTkMgKi8KKwkJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N1c3BlbmQoJmlkZXYtPnJuYywKKwkJCQkJCQkgICAgICBTQ0lfU09GVFdBUkVfU1VTUEVOU0lPTiwKKwkJCQkJCQkgICAgICBOVUxMLCBOVUxMKTsKKworCQkJZGV2X2RiZyhzY2lyZGV2X3RvX2RldihpZGV2KSwKKwkJCQkiJXM6IGRldmljZTogJXAgZXZlbnQgY29kZTogJXg6ICVzXG4iLAorCQkJCV9fZnVuY19fLCBpZGV2LCBldmVudF9jb2RlLAorCQkJCWlzX3JlbW90ZV9kZXZpY2VfcmVhZHkoaWRldikKKwkJCQk/ICJJX1RfTmV4dXNfVGltZW91dCBldmVudCIKKwkJCQk6ICJJX1RfTmV4dXNfVGltZW91dCBldmVudCBpbiB3cm9uZyBzdGF0ZSIpOworCisJCQlicmVhazsKKwkJfQorCS8qIEVsc2UsIGZhbGwgdGhyb3VnaCBhbmQgdHJlYXQgYXMgdW5oYW5kbGVkLi4uICovCisJZGVmYXVsdDoKKwkJZGV2X2RiZyhzY2lyZGV2X3RvX2RldihpZGV2KSwKKwkJCSIlczogZGV2aWNlOiAlcCBldmVudCBjb2RlOiAleDogJXNcbiIsCisJCQlfX2Z1bmNfXywgaWRldiwgZXZlbnRfY29kZSwKKwkJCWlzX3JlbW90ZV9kZXZpY2VfcmVhZHkoaWRldikKKwkJCT8gInVuZXhwZWN0ZWQgZXZlbnQiCisJCQk6ICJ1bmV4cGVjdGVkIGV2ZW50IGluIHdyb25nIHN0YXRlIik7CisJCXN0YXR1cyA9IFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJCWJyZWFrOworCX0KKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoc3RhdGUgPT0gU0NJX1NUUF9ERVZfSURMRSkgeworCisJCS8qIFdlIHBpY2sgdXAgc3VzcGVuc2lvbiBldmVudHMgdG8gaGFuZGxlIHNwZWNpZmljYWxseSB0byB0aGlzCisJCSAqIHN0YXRlLiBXZSByZXN1bWUgdGhlIFJOQyByaWdodCBhd2F5LgorCQkgKi8KKwkJaWYgKHNjdV9nZXRfZXZlbnRfdHlwZShldmVudF9jb2RlKSA9PSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWCB8fAorCQkgICAgc2N1X2dldF9ldmVudF90eXBlKGV2ZW50X2NvZGUpID09IFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYKQorCQkJc3RhdHVzID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKCZpZGV2LT5ybmMsIE5VTEwsIE5VTEwpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0X3JlcXVlc3Qoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCSBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJIGVudW0gc2NpX3N0YXR1cyBzdGF0dXMpCit7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpZGV2LT5vd25pbmdfcG9ydDsKKworCS8qIGNsZWFudXAgcmVxdWVzdHMgdGhhdCBmYWlsZWQgYWZ0ZXIgc3RhcnRpbmcgb24gdGhlIHBvcnQgKi8KKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlzY2lfcG9ydF9jb21wbGV0ZV9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJZWxzZSB7CisJCWtyZWZfZ2V0KCZpZGV2LT5rcmVmKTsKKwkJaWRldi0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50Kys7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfaW8oc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCQlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlkZXYtPm93bmluZ19wb3J0OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfREVWX0lOSVRJQUw6CisJY2FzZSBTQ0lfREVWX1NUT1BQRUQ6CisJY2FzZSBTQ0lfREVWX1NUQVJUSU5HOgorCWNhc2UgU0NJX1NUUF9ERVZfTkNRX0VSUk9SOgorCWNhc2UgU0NJX0RFVl9TVE9QUElORzoKKwljYXNlIFNDSV9ERVZfRkFJTEVEOgorCWNhc2UgU0NJX0RFVl9SRVNFVFRJTkc6CisJY2FzZSBTQ0lfREVWX0ZJTkFMOgorCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KGlkZXYpLCAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwljYXNlIFNDSV9ERVZfUkVBRFk6CisJCS8qIGF0dGVtcHQgdG8gc3RhcnQgYW4gaW8gcmVxdWVzdCBmb3IgdGhpcyBkZXZpY2Ugb2JqZWN0LiBUaGUgcmVtb3RlCisJCSAqIGRldmljZSBvYmplY3Qgd2lsbCBpc3N1ZSB0aGUgc3RhcnQgcmVxdWVzdCBmb3IgdGhlIGlvIGFuZCBpZgorCQkgKiBzdWNjZXNzZnVsIGl0IHdpbGwgc3RhcnQgdGhlIHJlcXVlc3QgZm9yIHRoZSBwb3J0IG9iamVjdCB0aGVuCisJCSAqIGluY3JlbWVudCBpdHMgb3duIHJlcXVlc3QgY291bnQuCisJCSAqLworCQlzdGF0dXMgPSBzY2lfcG9ydF9zdGFydF9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXN0YXR1cyA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXJ0X2lvKCZpZGV2LT5ybmMsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gc2NpX3JlcXVlc3Rfc3RhcnQoaXJlcSk7CisJCWJyZWFrOworCWNhc2UgU0NJX1NUUF9ERVZfSURMRTogeworCQkvKiBoYW5kbGUgdGhlIHN0YXJ0IGlvIG9wZXJhdGlvbiBmb3IgYSBzYXRhIGRldmljZSB0aGF0IGlzIGluCisJCSAqIHRoZSBjb21tYW5kIGlkbGUgc3RhdGUuIC0gRXZhbHV0ZSB0aGUgdHlwZSBvZiBJTyByZXF1ZXN0IHRvCisJCSAqIGJlIHN0YXJ0ZWQgLSBJZiBpdHMgYW4gTkNRIHJlcXVlc3QgY2hhbmdlIHRvIE5DUSBzdWJzdGF0ZSAtCisJCSAqIElmIGl0cyBhbnkgb3RoZXIgY29tbWFuZCBjaGFuZ2UgdG8gdGhlIENNRCBzdWJzdGF0ZQorCQkgKgorCQkgKiBJZiB0aGlzIGlzIGEgc29mdHJlc2V0IHdlIG1heSB3YW50IHRvIGhhdmUgYSBkaWZmZXJlbnQKKwkJICogc3Vic3RhdGUuCisJCSAqLworCQllbnVtIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlcyBuZXdfc3RhdGU7CisJCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKworCQlzdGF0dXMgPSBzY2lfcG9ydF9zdGFydF9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXN0YXR1cyA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXJ0X2lvKCZpZGV2LT5ybmMsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gc2NpX3JlcXVlc3Rfc3RhcnQoaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlpZiAodGFzay0+YXRhX3Rhc2sudXNlX25jcSkKKwkJCW5ld19zdGF0ZSA9IFNDSV9TVFBfREVWX05DUTsKKwkJZWxzZSB7CisJCQlpZGV2LT53b3JraW5nX3JlcXVlc3QgPSBpcmVxOworCQkJbmV3X3N0YXRlID0gU0NJX1NUUF9ERVZfQ01EOworCQl9CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIG5ld19zdGF0ZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFNDSV9TVFBfREVWX05DUTogeworCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisKKwkJaWYgKHRhc2stPmF0YV90YXNrLnVzZV9uY3EpIHsKKwkJCXN0YXR1cyA9IHNjaV9wb3J0X3N0YXJ0X2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwkJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQkJcmV0dXJuIHN0YXR1czsKKworCQkJc3RhdHVzID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3RhcnRfaW8oJmlkZXYtPnJuYywgaXJlcSk7CisJCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJCWJyZWFrOworCisJCQlzdGF0dXMgPSBzY2lfcmVxdWVzdF9zdGFydChpcmVxKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwkJYnJlYWs7CisJfQorCWNhc2UgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQ6CisJCXJldHVybiBTQ0lfRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEOworCWNhc2UgU0NJX1NNUF9ERVZfSURMRToKKwkJc3RhdHVzID0gc2NpX3BvcnRfc3RhcnRfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlzdGF0dXMgPSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF9pbygmaWRldi0+cm5jLCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IHNjaV9yZXF1ZXN0X3N0YXJ0KGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJaWRldi0+d29ya2luZ19yZXF1ZXN0ID0gaXJlcTsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaWRldi0+c20sIFNDSV9TTVBfREVWX0NNRCk7CisJCWJyZWFrOworCWNhc2UgU0NJX1NUUF9ERVZfQ01EOgorCWNhc2UgU0NJX1NNUF9ERVZfQ01EOgorCQkvKiBkZXZpY2UgaXMgYWxyZWFkeSBoYW5kbGluZyBhIGNvbW1hbmQgaXQgY2FuIG5vdCBhY2NlcHQgbmV3IGNvbW1hbmRzCisJCSAqIHVudGlsIHRoaXMgb25lIGlzIGNvbXBsZXRlLgorCQkgKi8KKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfcmVxdWVzdChpZGV2LCBpcmVxLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgY29tbW9uX2NvbXBsZXRlX2lvKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCQkgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJCSAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gc2NpX3JlcXVlc3RfY29tcGxldGUoaXJlcSk7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCXN0YXR1cyA9IHNjaV9wb3J0X2NvbXBsZXRlX2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJc2NpX3JlbW90ZV9kZXZpY2VfZGVjcmVtZW50X3JlcXVlc3RfY291bnQoaWRldik7CisJcmV0dXJuIHN0YXR1czsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX2NvbXBsZXRlX2lvKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkJICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCSAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpZGV2LT5vd25pbmdfcG9ydDsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX0RFVl9JTklUSUFMOgorCWNhc2UgU0NJX0RFVl9TVE9QUEVEOgorCWNhc2UgU0NJX0RFVl9TVEFSVElORzoKKwljYXNlIFNDSV9TVFBfREVWX0lETEU6CisJY2FzZSBTQ0lfU01QX0RFVl9JRExFOgorCWNhc2UgU0NJX0RFVl9GQUlMRUQ6CisJY2FzZSBTQ0lfREVWX0ZJTkFMOgorCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KGlkZXYpLCAiJXM6IGluIHdyb25nIHN0YXRlOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwljYXNlIFNDSV9ERVZfUkVBRFk6CisJY2FzZSBTQ0lfU1RQX0RFVl9BV0FJVF9SRVNFVDoKKwljYXNlIFNDSV9ERVZfUkVTRVRUSU5HOgorCQlzdGF0dXMgPSBjb21tb25fY29tcGxldGVfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCQlicmVhazsKKwljYXNlIFNDSV9TVFBfREVWX0NNRDoKKwljYXNlIFNDSV9TVFBfREVWX05DUToKKwljYXNlIFNDSV9TVFBfREVWX05DUV9FUlJPUjoKKwkJc3RhdHVzID0gY29tbW9uX2NvbXBsZXRlX2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCWlmIChpcmVxLT5zY2lfc3RhdHVzID09IFNDSV9GQUlMVVJFX1JFTU9URV9ERVZJQ0VfUkVTRVRfUkVRVUlSRUQpIHsKKwkJCS8qIFRoaXMgcmVxdWVzdCBjYXVzZXMgaGFyZHdhcmUgZXJyb3IsIGRldmljZSBuZWVkcyB0byBiZSBMdW4gUmVzZXQuCisJCQkgKiBTbyBoZXJlIHdlIGZvcmNlIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIElETEUgc3RhdGUgc28gdGhlIHJlc3QgSU9zCisJCQkgKiBjYW4gcmVhY2ggUk5DIHN0YXRlIGhhbmRsZXIsIHRoZXNlIElPcyB3aWxsIGJlIGNvbXBsZXRlZCBieSBSTkMgd2l0aAorCQkJICogc3RhdHVzIG9mICJERVZJQ0VfUkVTRVRfUkVRVUlSRUQiLCBpbnN0ZWFkIG9mICJJTlZBTElEIFNUQVRFIi4KKwkJCSAqLworCQkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQpOworCQl9IGVsc2UgaWYgKGlkZXYtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCA9PSAwKQorCQkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX1NUUF9ERVZfSURMRSk7CisJCWJyZWFrOworCWNhc2UgU0NJX1NNUF9ERVZfQ01EOgorCQlzdGF0dXMgPSBjb21tb25fY29tcGxldGVfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9TTVBfREVWX0lETEUpOworCQlicmVhazsKKwljYXNlIFNDSV9ERVZfU1RPUFBJTkc6CisJCXN0YXR1cyA9IGNvbW1vbl9jb21wbGV0ZV9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlpZiAoaWRldi0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50ID09IDApCisJCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9kZXN0cnVjdCgmaWRldi0+cm5jLAorCQkJCQkJCSBybmNfZGVzdHJ1Y3RfZG9uZSwKKwkJCQkJCQkgaWRldik7CisJCWJyZWFrOworCX0KKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCWRldl9lcnIoc2NpcmRldl90b19kZXYoaWRldiksCisJCQkiJXM6IFBvcnQ6MHglcCBEZXZpY2U6MHglcCBSZXF1ZXN0OjB4JXAgU3RhdHVzOjB4JXggIgorCQkJImNvdWxkIG5vdCBjb21wbGV0ZVxuIiwgX19mdW5jX18sIGlwb3J0LAorCQkJaWRldiwgaXJlcSwgc3RhdHVzKTsKKwllbHNlCisJCWlzY2lfcHV0X2RldmljZShpZGV2KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX2NvbnRpbnVlX3JlcXVlc3Qodm9pZCAqZGV2KQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBkZXY7CisKKwkvKiB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgcmVxdWVzdCBpcyBzdGlsbCB2YWxpZCB0byBjb250aW51ZS4gKi8KKwlpZiAoaWRldi0+d29ya2luZ19yZXF1ZXN0KQorCQlzY2lfY29udHJvbGxlcl9jb250aW51ZV9pbyhpZGV2LT53b3JraW5nX3JlcXVlc3QpOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfdGFzayhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJCSAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCSAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaWRldi0+c207CisJZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlkZXYtPm93bmluZ19wb3J0OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfREVWX0lOSVRJQUw6CisJY2FzZSBTQ0lfREVWX1NUT1BQRUQ6CisJY2FzZSBTQ0lfREVWX1NUQVJUSU5HOgorCWNhc2UgU0NJX1NNUF9ERVZfSURMRToKKwljYXNlIFNDSV9TTVBfREVWX0NNRDoKKwljYXNlIFNDSV9ERVZfU1RPUFBJTkc6CisJY2FzZSBTQ0lfREVWX0ZBSUxFRDoKKwljYXNlIFNDSV9ERVZfUkVTRVRUSU5HOgorCWNhc2UgU0NJX0RFVl9GSU5BTDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJY2FzZSBTQ0lfU1RQX0RFVl9JRExFOgorCWNhc2UgU0NJX1NUUF9ERVZfQ01EOgorCWNhc2UgU0NJX1NUUF9ERVZfTkNROgorCWNhc2UgU0NJX1NUUF9ERVZfTkNRX0VSUk9SOgorCWNhc2UgU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVQ6CisJCXN0YXR1cyA9IHNjaV9wb3J0X3N0YXJ0X2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJc3RhdHVzID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3RhcnRfdGFzaygmaWRldi0+cm5jLCBpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCWdvdG8gb3V0OworCisJCXN0YXR1cyA9IHNjaV9yZXF1ZXN0X3N0YXJ0KGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJZ290byBvdXQ7CisKKwkJLyogTm90ZTogSWYgdGhlIHJlbW90ZSBkZXZpY2Ugc3RhdGUgaXMgbm90IElETEUgdGhpcyB3aWxsCisJCSAqIHJlcGxhY2UgdGhlIHJlcXVlc3QgdGhhdCBwcm9iYWJseSByZXN1bHRlZCBpbiB0aGUgdGFzaworCQkgKiBtYW5hZ2VtZW50IHJlcXVlc3QuCisJCSAqLworCQlpZGV2LT53b3JraW5nX3JlcXVlc3QgPSBpcmVxOworCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfU1RQX0RFVl9DTUQpOworCisJCS8qIFRoZSByZW1vdGUgbm9kZSBjb250ZXh0IG11c3QgY2xlYW51cCB0aGUgVENpIHRvIE5DUSBtYXBwaW5nCisJCSAqIHRhYmxlLiAgVGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgY29ycmVjdGx5IGlzIHRvIGVpdGhlciB3cml0ZQorCQkgKiB0byB0aGUgVExDUiByZWdpc3RlciBvciB0byBpbnZhbGlkYXRlIGFuZCByZXBvc3QgdGhlIFJOQy4gSW4KKwkJICogZWl0aGVyIGNhc2UgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgc3RhdGUgbWFjaGluZSB3aWxsIHRha2UKKwkJICogdGhlIGNvcnJlY3QgYWN0aW9uIHdoZW4gdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaXMgc3VzcGVuZGVkCisJCSAqIGFuZCBsYXRlciByZXN1bWVkLgorCQkgKi8KKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3VzcGVuZCgmaWRldi0+cm5jLAorCQkJCVNDSV9TT0ZUV0FSRV9TVVNQRU5TSU9OLCBOVUxMLCBOVUxMKTsKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKCZpZGV2LT5ybmMsCisJCQkJc2NpX3JlbW90ZV9kZXZpY2VfY29udGludWVfcmVxdWVzdCwKKwkJCQkJCSAgICBpZGV2KTsKKworCW91dDoKKwkJc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfcmVxdWVzdChpZGV2LCBpcmVxLCBzdGF0dXMpOworCQkvKiBXZSBuZWVkIHRvIGxldCB0aGUgY29udHJvbGxlciBzdGFydCByZXF1ZXN0IGhhbmRsZXIga25vdyB0aGF0CisJCSAqIGl0IGNhbid0IHBvc3QgVEMgeWV0LiBXZSB3aWxsIHByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbiB0bworCQkgKiBwb3N0IFRDIHdoZW4gUk5DIGdldHMgcmVzdW1lZC4KKwkJICovCisJCXJldHVybiBTQ0lfRkFJTFVSRV9SRVNFVF9ERVZJQ0VfUEFSVElBTF9TVUNDRVNTOworCWNhc2UgU0NJX0RFVl9SRUFEWToKKwkJc3RhdHVzID0gc2NpX3BvcnRfc3RhcnRfaW8oaXBvcnQsIGlkZXYsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlzdGF0dXMgPSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF90YXNrKCZpZGV2LT5ybmMsIGlyZXEpOworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gc2NpX3JlcXVlc3Rfc3RhcnQoaXJlcSk7CisJCWJyZWFrOworCX0KKwlzY2lfcmVtb3RlX2RldmljZV9zdGFydF9yZXF1ZXN0KGlkZXYsIGlyZXEsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX3Bvc3RfcmVxdWVzdChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LCB1MzIgcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlkZXYtPm93bmluZ19wb3J0OworCXUzMiBjb250ZXh0OworCisJY29udGV4dCA9IHJlcXVlc3QgfAorCQkgIChJU0NJX1BFRyA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX1BST1RPQ09MX0VOR0lORV9HUk9VUF9TSElGVCkgfAorCQkgIChpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA8PCBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCkgfAorCQkgIGlkZXYtPnJuYy5yZW1vdGVfbm9kZV9pbmRleDsKKworCXNjaV9jb250cm9sbGVyX3Bvc3RfcmVxdWVzdChpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXIsIGNvbnRleHQpOworfQorCisvKiBjYWxsZWQgb25jZSB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBoYXMgdHJhbnNpc2l0aW9uZWQgdG8gYQorICogcmVhZHkgc3RhdGUuICBUaGlzIGlzIHRoZSBpbmRpY2F0aW9uIHRoYXQgdGhlIHJlbW90ZSBkZXZpY2Ugb2JqZWN0IGNhbiBhbHNvCisgKiB0cmFuc2l0aW9uIHRvIHJlYWR5LgorICovCitzdGF0aWMgdm9pZCByZW1vdGVfZGV2aWNlX3Jlc3VtZV9kb25lKHZvaWQgKl9kZXYpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IF9kZXY7CisKKwlpZiAoaXNfcmVtb3RlX2RldmljZV9yZWFkeShpZGV2KSkKKwkJcmV0dXJuOworCisJLyogZ28gJ3JlYWR5JyBpZiB3ZSBhcmUgbm90IGFscmVhZHkgaW4gYSByZWFkeSBzdGF0ZSAqLworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlkZXYtPnNtLCBTQ0lfREVWX1JFQURZKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X2lkbGVfc3Vic3RhdGVfcmVzdW1lX2NvbXBsZXRlX2hhbmRsZXIodm9pZCAqX2RldikKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gX2RldjsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCS8qIEZvciBOQ1Egb3BlcmF0aW9uIHdlIGRvIG5vdCBpc3N1ZSBhIGlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoKS4KKwkgKiBBcyBhIHJlc3VsdCwgYXZvaWQgc2VuZGluZyB0aGUgcmVhZHkgbm90aWZpY2F0aW9uLgorCSAqLworCWlmIChpZGV2LT5zbS5wcmV2aW91c19zdGF0ZV9pZCAhPSBTQ0lfU1RQX0RFVl9OQ1EpCisJCWlzY2lfcmVtb3RlX2RldmljZV9yZWFkeShpaG9zdCwgaWRldik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX2luaXRpYWxfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaWRldiksIHNtKTsKKworCS8qIEluaXRpYWwgc3RhdGUgaXMgYSB0cmFuc2l0aW9uYWwgc3RhdGUgdG8gdGhlIHN0b3BwZWQgc3RhdGUgKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpZGV2LT5zbSwgU0NJX0RFVl9TVE9QUEVEKTsKK30KKworLyoqCisgKiBzY2lfcmVtb3RlX2RldmljZV9kZXN0cnVjdCgpIC0gZnJlZSByZW1vdGUgbm9kZSBjb250ZXh0IGFuZCBkZXN0cnVjdAorICogQHJlbW90ZV9kZXZpY2U6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVtb3RlIGRldmljZSB0byBiZSBkZXN0cnVjdGVkLgorICoKKyAqIFJlbW90ZSBkZXZpY2Ugb2JqZWN0cyBhcmUgYSBsaW1pdGVkIHJlc291cmNlLiAgQXMgc3VjaCwgdGhleSBtdXN0IGJlCisgKiBwcm90ZWN0ZWQuICBUaHVzIGNhbGxzIHRvIGNvbnN0cnVjdCBhbmQgZGVzdHJ1Y3QgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSBhbmQKKyAqIG5vbi1yZWVudHJhbnQuIFRoZSByZXR1cm4gdmFsdWUgc2hhbGwgaW5kaWNhdGUgaWYgdGhlIGRldmljZSB3YXMKKyAqIHN1Y2Nlc3NmdWxseSBkZXN0cnVjdGVkIG9yIGlmIHNvbWUgZmFpbHVyZSBvY2N1cnJlZC4gZW51bSBzY2lfc3RhdHVzIFRoaXMgdmFsdWUKKyAqIGlzIHJldHVybmVkIGlmIHRoZSBkZXZpY2UgaXMgc3VjY2Vzc2Z1bGx5IGRlc3RydWN0ZWQuCisgKiBTQ0lfRkFJTFVSRV9JTlZBTElEX1JFTU9URV9ERVZJQ0UgVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgc3VwcGxpZWQKKyAqIGRldmljZSBpc24ndCB2YWxpZCAoZS5nLiBpdCdzIGFscmVhZHkgYmVlbiBkZXN0b3J5ZWQsIHRoZSBoYW5kbGUgaXNuJ3QKKyAqIHZhbGlkLCBldGMuKS4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9kZXN0cnVjdChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpZGV2LT5zbTsKKwllbnVtIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlcyBzdGF0ZSA9IHNtLT5jdXJyZW50X3N0YXRlX2lkOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0OworCisJaWYgKHN0YXRlICE9IFNDSV9ERVZfU1RPUFBFRCkgeworCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihpZGV2KSwgIiVzOiBpbiB3cm9uZyBzdGF0ZTogJWRcbiIsCisJCQkgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorCisJaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJc2NpX2NvbnRyb2xsZXJfZnJlZV9yZW1vdGVfbm9kZV9jb250ZXh0KGlob3N0LCBpZGV2LAorCQkJCQkJICAgICBpZGV2LT5ybmMucmVtb3RlX25vZGVfaW5kZXgpOworCWlkZXYtPnJuYy5yZW1vdGVfbm9kZV9pbmRleCA9IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWDsKKwlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfREVWX0ZJTkFMKTsKKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworLyoqCisgKiBpc2NpX3JlbW90ZV9kZXZpY2VfZGVjb25zdHJ1Y3QoKSAtIFRoaXMgZnVuY3Rpb24gZnJlZXMgYW4gaXNjaV9yZW1vdGVfZGV2aWNlLgorICogQGlob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGlzY2kgaG9zdCBvYmplY3QuCisgKiBAaWRldjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZW1vdGUgZGV2aWNlIHRvIGJlIGZyZWVkLgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV9yZW1vdGVfZGV2aWNlX2RlY29uc3RydWN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9kZXZpY2UgPSAlcFxuIiwgX19mdW5jX18sIGlkZXYpOworCisJLyogVGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgb3V0c3RhbmRpbmcgaW8ncy4gQWxsIHBhdGhzIHRvCisJICogaGVyZSBzaG91bGQgZ28gdGhyb3VnaCBpc2NpX3JlbW90ZV9kZXZpY2VfbnVrZV9yZXF1ZXN0cy4KKwkgKiBJZiB3ZSBoaXQgdGhpcyBjb25kaXRpb24sIHdlIHdpbGwgbmVlZCBhIHdheSB0byBjb21wbGV0ZQorCSAqIGlvIHJlcXVlc3RzIGluIHByb2Nlc3MgKi8KKwlCVUdfT04oIWxpc3RfZW1wdHkoJmlkZXYtPnJlcXNfaW5fcHJvY2VzcykpOworCisJc2NpX3JlbW90ZV9kZXZpY2VfZGVzdHJ1Y3QoaWRldik7CisJbGlzdF9kZWxfaW5pdCgmaWRldi0+bm9kZSk7CisJaXNjaV9wdXRfZGV2aWNlKGlkZXYpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9zdG9wcGVkX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlkZXYpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJdTMyIHByZXZfc3RhdGU7CisKKwkvKiBJZiB3ZSBhcmUgZW50ZXJpbmcgZnJvbSB0aGUgc3RvcHBpbmcgc3RhdGUgbGV0IHRoZSBTQ0kgVXNlciBrbm93IHRoYXQKKwkgKiB0aGUgc3RvcCBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KKwkgKi8KKwlwcmV2X3N0YXRlID0gaWRldi0+c20ucHJldmlvdXNfc3RhdGVfaWQ7CisJaWYgKHByZXZfc3RhdGUgPT0gU0NJX0RFVl9TVE9QUElORykKKwkJaXNjaV9yZW1vdGVfZGV2aWNlX2RlY29uc3RydWN0KGlob3N0LCBpZGV2KTsKKworCXNjaV9jb250cm9sbGVyX3JlbW90ZV9kZXZpY2Vfc3RvcHBlZChpaG9zdCwgaWRldik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0aW5nX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlkZXYpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpc2NpX3JlbW90ZV9kZXZpY2Vfbm90X3JlYWR5KGlob3N0LCBpZGV2LAorCQkJCSAgICAgU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TVEFSVF9SRVFVRVNURUQpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9yZWFkeV9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYgfHwgKGRldi0+dHByb3RvICYgU0FTX1BST1RPQ09MX1NBVEEpKSB7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlkZXYtPnNtLCBTQ0lfU1RQX0RFVl9JRExFKTsKKwl9IGVsc2UgaWYgKGRldl9pc19leHBhbmRlcihkZXYpKSB7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlkZXYtPnNtLCBTQ0lfU01QX0RFVl9JRExFKTsKKwl9IGVsc2UKKwkJaXNjaV9yZW1vdGVfZGV2aWNlX3JlYWR5KGlob3N0LCBpZGV2KTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9kZXZpY2VfcmVhZHlfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FTX0VORF9ERVYpIHsKKwkJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwkJaXNjaV9yZW1vdGVfZGV2aWNlX25vdF9yZWFkeShpaG9zdCwgaWRldiwKKwkJCQkJICAgICBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NUT1BfUkVRVUVTVEVEKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0dGluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3VzcGVuZCgKKwkJJmlkZXYtPnJuYywgU0NJX1NPRlRXQVJFX1NVU1BFTlNJT04sIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX2RldmljZV9yZXNldHRpbmdfc3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKCZpZGV2LT5ybmMsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBzY2lfc3RwX3JlbW90ZV9kZXZpY2VfcmVhZHlfaWRsZV9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCisJaWRldi0+d29ya2luZ19yZXF1ZXN0ID0gTlVMTDsKKwlpZiAoc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfaXNfcmVhZHkoJmlkZXYtPnJuYykpIHsKKwkJLyoKKwkJICogU2luY2UgdGhlIFJOQyBpcyByZWFkeSwgaXQncyBhbHJpZ2h0IHRvIGZpbmlzaCBjb21wbGV0aW9uCisJCSAqIHByb2Nlc3NpbmcgKGUuZy4gc2lnbmFsIHRoZSByZW1vdGUgZGV2aWNlIGlzIHJlYWR5KS4gKi8KKwkJc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X2lkbGVfc3Vic3RhdGVfcmVzdW1lX2NvbXBsZXRlX2hhbmRsZXIoaWRldik7CisJfSBlbHNlIHsKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKCZpZGV2LT5ybmMsCisJCQlzY2lfc3RwX3JlbW90ZV9kZXZpY2VfcmVhZHlfaWRsZV9zdWJzdGF0ZV9yZXN1bWVfY29tcGxldGVfaGFuZGxlciwKKwkJCWlkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X2NtZF9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJQlVHX09OKGlkZXYtPndvcmtpbmdfcmVxdWVzdCA9PSBOVUxMKTsKKworCWlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoaWhvc3QsIGlkZXYsCisJCQkJICAgICBTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NBVEFfUkVRVUVTVF9TVEFSVEVEKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X25jcV9lcnJvcl9zdWJzdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJaWYgKGlkZXYtPm5vdF9yZWFkeV9yZWFzb24gPT0gU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TQVRBX1NEQl9FUlJPUl9GSVNfUkVDRUlWRUQpCisJCWlzY2lfcmVtb3RlX2RldmljZV9ub3RfcmVhZHkoaWhvc3QsIGlkZXYsCisJCQkJCSAgICAgaWRldi0+bm90X3JlYWR5X3JlYXNvbik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zbXBfcmVtb3RlX2RldmljZV9yZWFkeV9pZGxlX3N1YnN0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlkZXYpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlpc2NpX3JlbW90ZV9kZXZpY2VfcmVhZHkoaWhvc3QsIGlkZXYpOworfQorCitzdGF0aWMgdm9pZCBzY2lfc21wX3JlbW90ZV9kZXZpY2VfcmVhZHlfY21kX3N1YnN0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlkZXYpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlCVUdfT04oaWRldi0+d29ya2luZ19yZXF1ZXN0ID09IE5VTEwpOworCisJaXNjaV9yZW1vdGVfZGV2aWNlX25vdF9yZWFkeShpaG9zdCwgaWRldiwKKwkJCQkgICAgIFNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfU01QX1JFUVVFU1RfU1RBUlRFRCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zbXBfcmVtb3RlX2RldmljZV9yZWFkeV9jbWRfc3Vic3RhdGVfZXhpdChzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppZGV2KSwgc20pOworCisJaWRldi0+d29ya2luZ19yZXF1ZXN0ID0gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZV90YWJsZVtdID0geworCVtTQ0lfREVWX0lOSVRJQUxdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVtb3RlX2RldmljZV9pbml0aWFsX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9ERVZfU1RPUFBFRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfZGV2aWNlX3N0b3BwZWRfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX0RFVl9TVEFSVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0aW5nX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9ERVZfUkVBRFldID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVtb3RlX2RldmljZV9yZWFkeV9zdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3JlbW90ZV9kZXZpY2VfcmVhZHlfc3RhdGVfZXhpdAorCX0sCisJW1NDSV9TVFBfREVWX0lETEVdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfc3RwX3JlbW90ZV9kZXZpY2VfcmVhZHlfaWRsZV9zdWJzdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfU1RQX0RFVl9DTURdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfc3RwX3JlbW90ZV9kZXZpY2VfcmVhZHlfY21kX3N1YnN0YXRlX2VudGVyLAorCX0sCisJW1NDSV9TVFBfREVWX05DUV0gPSB7IH0sCisJW1NDSV9TVFBfREVWX05DUV9FUlJPUl0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9zdHBfcmVtb3RlX2RldmljZV9yZWFkeV9uY3FfZXJyb3Jfc3Vic3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1NUUF9ERVZfQVdBSVRfUkVTRVRdID0geyB9LAorCVtTQ0lfU01QX0RFVl9JRExFXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3NtcF9yZW1vdGVfZGV2aWNlX3JlYWR5X2lkbGVfc3Vic3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1NNUF9ERVZfQ01EXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3NtcF9yZW1vdGVfZGV2aWNlX3JlYWR5X2NtZF9zdWJzdGF0ZV9lbnRlciwKKwkJLmV4aXRfc3RhdGUgID0gc2NpX3NtcF9yZW1vdGVfZGV2aWNlX3JlYWR5X2NtZF9zdWJzdGF0ZV9leGl0LAorCX0sCisJW1NDSV9ERVZfU1RPUFBJTkddID0geyB9LAorCVtTQ0lfREVWX0ZBSUxFRF0gPSB7IH0sCisJW1NDSV9ERVZfUkVTRVRUSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXR0aW5nX3N0YXRlX2VudGVyLAorCQkuZXhpdF9zdGF0ZSAgPSBzY2lfcmVtb3RlX2RldmljZV9yZXNldHRpbmdfc3RhdGVfZXhpdAorCX0sCisJW1NDSV9ERVZfRklOQUxdID0geyB9LAorfTsKKworLyoqCisgKiBzY2lfcmVtb3RlX2RldmljZV9jb25zdHJ1Y3QoKSAtIGNvbW1vbiBjb25zdHJ1Y3Rpb24KKyAqIEBzY2lfcG9ydDogU0FTL1NBVEEgcG9ydCB0aHJvdWdoIHdoaWNoIHRoaXMgZGV2aWNlIGlzIGFjY2Vzc2VkLgorICogQHNjaV9kZXY6IHJlbW90ZSBkZXZpY2UgdG8gY29uc3RydWN0CisgKgorICogVGhpcyByb3V0aW5lIGp1c3QgcGVyZm9ybXMgYmVuaWduIGluaXRpYWxpemF0aW9uIGFuZCBkb2VzIG5vdAorICogYWxsb2NhdGUgdGhlIHJlbW90ZV9ub2RlX2NvbnRleHQgd2hpY2ggaXMgbGVmdCB0bworICogc2NpX3JlbW90ZV9kZXZpY2VfW2RlXWFfY29uc3RydWN0KCkuICBzY2lfcmVtb3RlX2RldmljZV9kZXN0cnVjdCgpCisgKiBmcmVlcyB0aGUgcmVtb3RlX25vZGVfY29udGV4dChzKSBmb3IgdGhlIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9kZXZpY2VfY29uc3RydWN0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCSAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlpZGV2LT5vd25pbmdfcG9ydCA9IGlwb3J0OworCWlkZXYtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCA9IDA7CisKKwlzY2lfaW5pdF9zbSgmaWRldi0+c20sIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlX3RhYmxlLCBTQ0lfREVWX0lOSVRJQUwpOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfY29uc3RydWN0KCZpZGV2LT5ybmMsCisJCQkJCSAgICAgICBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpOworfQorCisvKioKKyAqIHNjaV9yZW1vdGVfZGV2aWNlX2RhX2NvbnN0cnVjdCgpIC0gY29uc3RydWN0IGRpcmVjdCBhdHRhY2hlZCBkZXZpY2UuCisgKgorICogVGhlIGluZm9ybWF0aW9uIChlLmcuIElBRiwgU2lnbmF0dXJlIEZJUywgZXRjLikgbmVjZXNzYXJ5IHRvIGJ1aWxkCisgKiB0aGUgZGV2aWNlIGlzIGtub3duIHRvIHRoZSBTQ0kgQ29yZSBzaW5jZSBpdCBpcyBjb250YWluZWQgaW4gdGhlCisgKiBzY2lfcGh5IG9iamVjdC4gIFJlbW90ZSBub2RlIGNvbnRleHQocykgaXMvYXJlIGEgZ2xvYmFsIHJlc291cmNlCisgKiBhbGxvY2F0ZWQgYnkgdGhpcyByb3V0aW5lLCBmcmVlZCBieSBzY2lfcmVtb3RlX2RldmljZV9kZXN0cnVjdCgpLgorICoKKyAqIFJldHVybnM6CisgKiBTQ0lfRkFJTFVSRV9ERVZJQ0VfRVhJU1RTIC0gZGV2aWNlIGhhcyBhbHJlYWR5IGJlZW4gY29uc3RydWN0ZWQuCisgKiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTCAtIGUuZy4gc2FzIGRldmljZSBhdHRhY2hlZCB0bworICogc2F0YS1vbmx5IGNvbnRyb2xsZXIgaW5zdGFuY2UuCisgKiBTQ0lfRkFJTFVSRV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTIC0gcmVtb3RlIG5vZGUgY29udGV4dHMgZXhoYXVzdGVkLgorICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX2RhX2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisKKwlzY2lfcmVtb3RlX2RldmljZV9jb25zdHJ1Y3QoaXBvcnQsIGlkZXYpOworCisJLyoKKwkgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHJlcXVlc3QgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbW90ZSBub2RlIGNvbnRleHQKKwkgKiBlbnRyaWVzIHdpbGwgYmUgbmVlZGVkIHRvIHN0b3JlIHRoZSByZW1vdGUgbm9kZS4KKwkgKi8KKwlpZGV2LT5pc19kaXJlY3RfYXR0YWNoZWQgPSB0cnVlOworCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX2FsbG9jYXRlX3JlbW90ZV9ub2RlX2NvbnRleHQoaXBvcnQtPm93bmluZ19jb250cm9sbGVyLAorCQkJCQkJCQkgIGlkZXYsCisJCQkJCQkJCSAgJmlkZXYtPnJuYy5yZW1vdGVfbm9kZV9pbmRleCk7CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FTX0VORF9ERVYgfHwgZGV2LT5kZXZfdHlwZSA9PSBTQVRBX0RFViB8fAorCSAgICAoZGV2LT50cHJvdG8gJiBTQVNfUFJPVE9DT0xfU1RQKSB8fCBkZXZfaXNfZXhwYW5kZXIoZGV2KSkKKwkJLyogcGFzcyAqLzsKKwllbHNlCisJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKKworCWlkZXYtPmNvbm5lY3Rpb25fcmF0ZSA9IHNjaV9wb3J0X2dldF9tYXhfYWxsb3dlZF9zcGVlZChpcG9ydCk7CisKKwkvKiAvIEB0b2RvIFNob3VsZCBJIGFzc2lnbiB0aGUgcG9ydCB3aWR0aCBieSByZWFkaW5nIGFsbCBvZiB0aGUgcGh5cyBvbiB0aGUgcG9ydD8gKi8KKwlpZGV2LT5kZXZpY2VfcG9ydF93aWR0aCA9IDE7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc2NpX3JlbW90ZV9kZXZpY2VfZWFfY29uc3RydWN0KCkgLSBjb25zdHJ1Y3QgZXhwYW5kZXIgYXR0YWNoZWQgZGV2aWNlCisgKgorICogUmVtb3RlIG5vZGUgY29udGV4dChzKSBpcy9hcmUgYSBnbG9iYWwgcmVzb3VyY2UgYWxsb2NhdGVkIGJ5IHRoaXMKKyAqIHJvdXRpbmUsIGZyZWVkIGJ5IHNjaV9yZW1vdGVfZGV2aWNlX2Rlc3RydWN0KCkuCisgKgorICogUmV0dXJuczoKKyAqIFNDSV9GQUlMVVJFX0RFVklDRV9FWElTVFMgLSBkZXZpY2UgaGFzIGFscmVhZHkgYmVlbiBjb25zdHJ1Y3RlZC4KKyAqIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MIC0gZS5nLiBzYXMgZGV2aWNlIGF0dGFjaGVkIHRvCisgKiBzYXRhLW9ubHkgY29udHJvbGxlciBpbnN0YW5jZS4KKyAqIFNDSV9GQUlMVVJFX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgLSByZW1vdGUgbm9kZSBjb250ZXh0cyBleGhhdXN0ZWQuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfZWFfY29uc3RydWN0KHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAorCQkJCQkJICAgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCXNjaV9yZW1vdGVfZGV2aWNlX2NvbnN0cnVjdChpcG9ydCwgaWRldik7CisKKwlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl9hbGxvY2F0ZV9yZW1vdGVfbm9kZV9jb250ZXh0KGlwb3J0LT5vd25pbmdfY29udHJvbGxlciwKKwkJCQkJCQkJICBpZGV2LAorCQkJCQkJCQkgICZpZGV2LT5ybmMucmVtb3RlX25vZGVfaW5kZXgpOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBTQVNfRU5EX0RFViB8fCBkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8CisJICAgIChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApIHx8IGRldl9pc19leHBhbmRlcihkZXYpKQorCQkvKiBwYXNzICovOworCWVsc2UKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MOworCisJLyoKKwkgKiBGb3IgU0FTLTIgdGhlIHBoeXNpY2FsIGxpbmsgcmF0ZSBpcyBhY3R1YWxseSBhIGxvZ2ljYWwgbGluaworCSAqIHJhdGUgdGhhdCBpbmNvcnBvcmF0ZXMgbXVsdGlwbGV4aW5nLiAgVGhlIFNDVSBkb2Vzbid0CisJICogaW5jb3Jwb3JhdGUgbXVsdGlwbGV4aW5nIGFuZCBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZQorCSAqIGNvbm5lY3Rpb24gdGhlIGxvZ2ljYWwgbGluayByYXRlIGlzIHRoYXQgc2FtZSBhcyB0aGUKKwkgKiBwaHlzaWNhbC4gIEZ1cnRoZXJtb3JlLCB0aGUgU0FTLTIgYW5kIFNBUy0xLjEgZmllbGRzIG92ZXJsYXkKKwkgKiBvbmUgYW5vdGhlciwgc28gdGhpcyBjb2RlIHdvcmtzIGZvciBib3RoIHNpdHVhdGlvbnMuICovCisJaWRldi0+Y29ubmVjdGlvbl9yYXRlID0gbWluX3QodTE2LCBzY2lfcG9ydF9nZXRfbWF4X2FsbG93ZWRfc3BlZWQoaXBvcnQpLAorCQkJCQkgZGV2LT5saW5rcmF0ZSk7CisKKwkvKiAvIEB0b2RvIFNob3VsZCBJIGFzc2lnbiB0aGUgcG9ydCB3aWR0aCBieSByZWFkaW5nIGFsbCBvZiB0aGUgcGh5cyBvbiB0aGUgcG9ydD8gKi8KKwlpZGV2LT5kZXZpY2VfcG9ydF93aWR0aCA9IDE7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICogc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnQoKSAtIFRoaXMgbWV0aG9kIHdpbGwgc3RhcnQgdGhlIHN1cHBsaWVkIHJlbW90ZQorICogICAgZGV2aWNlLiAgVGhpcyBtZXRob2QgZW5hYmxlcyBub3JtYWwgSU8gcmVxdWVzdHMgdG8gZmxvdyB0aHJvdWdoIHRvIHRoZQorICogICAgcmVtb3RlIGRldmljZS4KKyAqIEByZW1vdGVfZGV2aWNlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGRldmljZSB0byBiZSBzdGFydGVkLgorICogQHRpbWVvdXQ6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiB3aGljaCB0aGUKKyAqICAgIHN0YXJ0IG9wZXJhdGlvbiBzaG91bGQgY29tcGxldGUuCisgKgorICogQW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBkZXZpY2Ugd2FzIHN1Y2Nlc3NmdWxseSBzdGFydGVkLiBTQ0lfU1VDQ0VTUworICogVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgZGV2aWNlIHdhcyBzdWNjZXNzZnVsbHkgc3RhcnRlZC4KKyAqIFNDSV9GQUlMVVJFX0lOVkFMSURfUEhZIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgaWYgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gc3RhcnQKKyAqIHRoZSBkZXZpY2Ugd2hlbiB0aGVyZSBoYXZlIGJlZW4gbm8gcGh5cyBhZGRlZCB0byBpdC4KKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9zdGFydChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkJdTMyIHRpbWVvdXQpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlkZXYtPnNtOworCWVudW0gc2NpX3JlbW90ZV9kZXZpY2Vfc3RhdGVzIHN0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWlmIChzdGF0ZSAhPSBTQ0lfREVWX1NUT1BQRUQpIHsKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYoaWRldiksICIlczogaW4gd3Jvbmcgc3RhdGU6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXN0YXR1cyA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Jlc3VtZSgmaWRldi0+cm5jLAorCQkJCQkJICAgICByZW1vdGVfZGV2aWNlX3Jlc3VtZV9kb25lLAorCQkJCQkJICAgICBpZGV2KTsKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX0RFVl9TVEFSVElORyk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgaXNjaV9yZW1vdGVfZGV2aWNlX2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkJCSAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPmlzY2lfaG9zdDsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKGRldi0+cGFyZW50ICYmIGRldl9pc19leHBhbmRlcihkZXYtPnBhcmVudCkpCisJCXN0YXR1cyA9IHNjaV9yZW1vdGVfZGV2aWNlX2VhX2NvbnN0cnVjdChpcG9ydCwgaWRldik7CisJZWxzZQorCQlzdGF0dXMgPSBzY2lfcmVtb3RlX2RldmljZV9kYV9jb25zdHJ1Y3QoaXBvcnQsIGlkZXYpOworCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGNvbnN0cnVjdCBmYWlsZWQ6ICVkXG4iLAorCQkJX19mdW5jX18sIHN0YXR1cyk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBzdGFydCB0aGUgZGV2aWNlLiAqLworCXN0YXR1cyA9IHNjaV9yZW1vdGVfZGV2aWNlX3N0YXJ0KGlkZXYsIElTQ0lfUkVNT1RFX0RFVklDRV9TVEFSVF9USU1FT1VUKTsKKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LCAicmVtb3RlIGRldmljZSBzdGFydCBmYWlsZWQ6ICVkXG4iLAorCQkJIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9udWtlX3JlcXVlc3RzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGFib3J0ZWRfdGFza19jb21wbGV0aW9uKTsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaWRldiA9ICVwXG4iLCBfX2Z1bmNfXywgaWRldik7CisKKwkvKiBDbGVhbnVwIGFsbCByZXF1ZXN0cyBwZW5kaW5nIGZvciB0aGlzIGRldmljZS4gKi8KKwlpc2NpX3Rlcm1pbmF0ZV9wZW5kaW5nX3JlcXVlc3RzKGlob3N0LCBpZGV2KTsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaWRldiA9ICVwLCBkb25lXG4iLCBfX2Z1bmNfXywgaWRldik7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIGlzY2lfcmVtb3RlX2RldmljZSB3aGVuIGEgbGlic2FzIGRldl9mb3VuZCBtZXNzYWdlCisgKiAgICBpcyByZWNlaXZlZC4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBob3N0IG9iamVjdC4KKyAqIEBwb3J0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGlzY2lfcG9ydCBjb25lY3RlZCB0byB0aGlzIGRldmljZS4KKyAqCisgKiBwb2ludGVyIHRvIG5ldyBpc2NpX3JlbW90ZV9kZXZpY2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICoKK2lzY2lfcmVtb3RlX2RldmljZV9hbGxvYyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTOyBpKyspIHsKKwkJaWRldiA9ICZpaG9zdC0+ZGV2aWNlc1tpXTsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KElERVZfQUxMT0NBVEVELCAmaWRldi0+ZmxhZ3MpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPj0gU0NJX01BWF9SRU1PVEVfREVWSUNFUykgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKFdBUk5fT05DRSghbGlzdF9lbXB0eSgmaWRldi0+cmVxc19pbl9wcm9jZXNzKSwgImZvdW5kIHJlcXVlc3RzIGluIHByb2Nlc3NcbiIpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChXQVJOX09OQ0UoIWxpc3RfZW1wdHkoJmlkZXYtPm5vZGUpLCAiZm91bmQgbm9uLWlkbGUgcmVtb3RlIGRldmljZVxuIikpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGlkZXY7Cit9CisKK3ZvaWQgaXNjaV9yZW1vdGVfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGNvbnRhaW5lcl9vZihrcmVmLCB0eXBlb2YoKmlkZXYpLCBrcmVmKTsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPmlzY2lfcG9ydC0+aXNjaV9ob3N0OworCisJaWRldi0+ZG9tYWluX2RldiA9IE5VTEw7CisJaWRldi0+aXNjaV9wb3J0ID0gTlVMTDsKKwljbGVhcl9iaXQoSURFVl9TVEFSVF9QRU5ESU5HLCAmaWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChJREVWX1NUT1BfUEVORElORywgJmlkZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoSURFVl9JT19SRUFEWSwgJmlkZXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoSURFVl9HT05FLCAmaWRldi0+ZmxhZ3MpOworCWNsZWFyX2JpdChJREVWX0VILCAmaWRldi0+ZmxhZ3MpOworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCWNsZWFyX2JpdChJREVWX0FMTE9DQVRFRCwgJmlkZXYtPmZsYWdzKTsKKwl3YWtlX3VwKCZpaG9zdC0+ZXZlbnRxKTsKK30KKworLyoqCisgKiBpc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcCgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseSB0byBzdG9wIHRoZQorICogICAgcmVtb3RlIGRldmljZS4KKyAqIEBpc2NpX2hvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgaXNjaSBob3N0IG9iamVjdC4KKyAqIEBpc2NpX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZW1vdGUgZGV2aWNlLgorICoKKyAqIFRoZSBzdGF0dXMgb2YgdGhlIGlob3N0IHJlcXVlc3QgdG8gc3RvcC4KKyAqLworZW51bSBzY2lfc3RhdHVzIGlzY2lfcmVtb3RlX2RldmljZV9zdG9wKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9kZXZpY2UgPSAlcFxuIiwgX19mdW5jX18sIGlkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlpZGV2LT5kb21haW5fZGV2LT5sbGRkX2RldiA9IE5VTEw7IC8qIGRpc2FibGUgbmV3IGxvb2t1cHMgKi8KKwlzZXRfYml0KElERVZfR09ORSwgJmlkZXYtPmZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBLaWxsIGFsbCBvdXRzdGFuZGluZyByZXF1ZXN0cy4gKi8KKwlpc2NpX3JlbW90ZV9kZXZpY2VfbnVrZV9yZXF1ZXN0cyhpaG9zdCwgaWRldik7CisKKwlzZXRfYml0KElERVZfU1RPUF9QRU5ESU5HLCAmaWRldi0+ZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSBzY2lfcmVtb3RlX2RldmljZV9zdG9wKGlkZXYsIDUwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBXYWl0IGZvciB0aGUgc3RvcCBjb21wbGV0ZSBjYWxsYmFjay4gKi8KKwlpZiAoV0FSTl9PTkNFKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUywgImZhaWxlZCB0byBzdG9wIGRldmljZVxuIikpCisJCS8qIG5vdGhpbmcgdG8gd2FpdCBmb3IgKi87CisJZWxzZQorCQl3YWl0X2Zvcl9kZXZpY2Vfc3RvcChpaG9zdCwgaWRldik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGlzY2lfcmVtb3RlX2RldmljZV9nb25lKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaWJzYXMgd2hlbiBhIGRvbWFpbgorICogICAgZGV2aWNlIGlzIHJlbW92ZWQuCisgKiBAZG9tYWluX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsaWJzYXMgZG9tYWluIGRldmljZS4KKyAqCisgKi8KK3ZvaWQgaXNjaV9yZW1vdGVfZGV2aWNlX2dvbmUoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGRldl90b19paG9zdChkZXYpOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBkZXYtPmxsZGRfZGV2OworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBkb21haW5fZGV2aWNlID0gJXAsIGlzY2lfZGV2aWNlID0gJXAsIGlzY2lfcG9ydCA9ICVwXG4iLAorCQlfX2Z1bmNfXywgZGV2LCBpZGV2LCBpZGV2LT5pc2NpX3BvcnQpOworCisJaXNjaV9yZW1vdGVfZGV2aWNlX3N0b3AoaWhvc3QsIGlkZXYpOworfQorCisKKy8qKgorICogaXNjaV9yZW1vdGVfZGV2aWNlX2ZvdW5kKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaWJzYXMgd2hlbiBhIHJlbW90ZQorICogICAgZGV2aWNlIGlzIGRpc2NvdmVyZWQuIEEgcmVtb3RlIGRldmljZSBvYmplY3QgaXMgY3JlYXRlZCBhbmQgc3RhcnRlZC4gdGhlCisgKiAgICBmdW5jdGlvbiB0aGVuIHNsZWVwcyB1bnRpbCB0aGUgc2NpIGNvcmUgZGV2aWNlIHN0YXJ0ZWQgbWVzc2FnZSBpcworICogICAgcmVjZWl2ZWQuCisgKiBAZG9tYWluX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsaWJzYXMgZG9tYWluIGRldmljZS4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludCBpc2NpX3JlbW90ZV9kZXZpY2VfZm91bmQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRvbWFpbl9kZXYpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0ID0gZGV2X3RvX2lob3N0KGRvbWFpbl9kZXYpOworCXN0cnVjdCBpc2NpX3BvcnQgKmlzY2lfcG9ydDsKKwlzdHJ1Y3QgaXNjaV9waHkgKmlzY2lfcGh5OworCXN0cnVjdCBhc2Rfc2FzX3BvcnQgKnNhc19wb3J0OworCXN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZTsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogZG9tYWluX2RldmljZSA9ICVwXG4iLCBfX2Z1bmNfXywgZG9tYWluX2Rldik7CisKKwl3YWl0X2Zvcl9zdGFydChpc2NpX2hvc3QpOworCisJc2FzX3BvcnQgPSBkb21haW5fZGV2LT5wb3J0OworCXNhc19waHkgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzYXNfcG9ydC0+cGh5X2xpc3QsIHN0cnVjdCBhc2Rfc2FzX3BoeSwKKwkJCQkgICBwb3J0X3BoeV9lbCk7CisJaXNjaV9waHkgPSB0b19pcGh5KHNhc19waHkpOworCWlzY2lfcG9ydCA9IGlzY2lfcGh5LT5pc2NpX3BvcnQ7CisKKwkvKiB3ZSBhcmUgYmVpbmcgY2FsbGVkIGZvciBhIGRldmljZSBvbiB0aGlzIHBvcnQsCisJICogc28gaXQgaGFzIHRvIGNvbWUgdXAgZXZlbnR1YWxseQorCSAqLworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlzY2lfcG9ydC0+c3RhcnRfY29tcGxldGUpOworCisJaWYgKChpc2NpX3N0b3BwaW5nID09IGlzY2lfcG9ydF9nZXRfc3RhdGUoaXNjaV9wb3J0KSkgfHwKKwkgICAgKGlzY2lfc3RvcHBlZCA9PSBpc2NpX3BvcnRfZ2V0X3N0YXRlKGlzY2lfcG9ydCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlzY2lfZGV2aWNlID0gaXNjaV9yZW1vdGVfZGV2aWNlX2FsbG9jKGlzY2lfaG9zdCwgaXNjaV9wb3J0KTsKKwlpZiAoIWlzY2lfZGV2aWNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWtyZWZfaW5pdCgmaXNjaV9kZXZpY2UtPmtyZWYpOworCUlOSVRfTElTVF9IRUFEKCZpc2NpX2RldmljZS0+bm9kZSk7CisKKwlzcGluX2xvY2tfaXJxKCZpc2NpX2hvc3QtPnNjaWNfbG9jayk7CisJaXNjaV9kZXZpY2UtPmRvbWFpbl9kZXYgPSBkb21haW5fZGV2OworCWlzY2lfZGV2aWNlLT5pc2NpX3BvcnQgPSBpc2NpX3BvcnQ7CisJbGlzdF9hZGRfdGFpbCgmaXNjaV9kZXZpY2UtPm5vZGUsICZpc2NpX3BvcnQtPnJlbW90ZV9kZXZfbGlzdCk7CisKKwlzZXRfYml0KElERVZfU1RBUlRfUEVORElORywgJmlzY2lfZGV2aWNlLT5mbGFncyk7CisJc3RhdHVzID0gaXNjaV9yZW1vdGVfZGV2aWNlX2NvbnN0cnVjdChpc2NpX3BvcnQsIGlzY2lfZGV2aWNlKTsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfZGV2aWNlID0gJXBcbiIsCisJCV9fZnVuY19fLCBpc2NpX2RldmljZSk7CisKKwlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKSB7CisJCS8qIGRldmljZSBjYW1lIHVwLCBhZHZlcnRpc2UgaXQgdG8gdGhlIHdvcmxkICovCisJCWRvbWFpbl9kZXYtPmxsZGRfZGV2ID0gaXNjaV9kZXZpY2U7CisJfSBlbHNlCisJCWlzY2lfcHV0X2RldmljZShpc2NpX2RldmljZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZpc2NpX2hvc3QtPnNjaWNfbG9jayk7CisKKwkvKiB3YWl0IGZvciB0aGUgZGV2aWNlIHJlYWR5IGNhbGxiYWNrLiAqLworCXdhaXRfZm9yX2RldmljZV9zdGFydChpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKTsKKworCXJldHVybiBzdGF0dXMgPT0gU0NJX1NVQ0NFU1MgPyAwIDogLUVOT0RFVjsKK30KKy8qKgorICogaXNjaV9kZXZpY2VfaXNfcmVzZXRfcGVuZGluZygpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIHRoZXJlIGlzIGFueQorICogICAgcGVuZGluZyByZXNldCBjb25kaXRpb24gb24gdGhlIGRldmljZS4KKyAqIEByZXF1ZXN0OiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgaXNjaV9kZXZpY2Ugb2JqZWN0LgorICoKKyAqIHRydWUgaWYgdGhlcmUgaXMgYSByZXNldCBwZW5kaW5nIGZvciB0aGUgZGV2aWNlLgorICovCitib29sIGlzY2lfZGV2aWNlX2lzX3Jlc2V0X3BlbmRpbmcoCisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0LAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlzY2lfZGV2aWNlKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfcmVxdWVzdDsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICp0bXBfcmVxOworCWJvb2wgcmVzZXRfaXNfcGVuZGluZyA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX2RldmljZSA9ICVwXG4iLCBfX2Z1bmNfXywgaXNjaV9kZXZpY2UpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBmb3IgcmVzZXQgb24gYWxsIHBlbmRpbmcgcmVxdWVzdHMuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlzY2lfcmVxdWVzdCwgdG1wX3JlcSwKKwkJCQkgJmlzY2lfZGV2aWNlLT5yZXFzX2luX3Byb2Nlc3MsIGRldl9ub2RlKSB7CisJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBpc2NpX2RldmljZSA9ICVwIHJlcXVlc3QgPSAlcFxuIiwKKwkJCV9fZnVuY19fLCBpc2NpX2RldmljZSwgaXNjaV9yZXF1ZXN0KTsKKworCQlpZiAoaXNjaV9yZXF1ZXN0LT50dHlwZSA9PSBpb190YXNrKSB7CisJCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soCisJCQkJaXNjaV9yZXF1ZXN0KTsKKworCQkJc3Bpbl9sb2NrKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOworCQkJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19ORUVEX0RFVl9SRVNFVCkKKwkJCQlyZXNldF9pc19wZW5kaW5nID0gdHJ1ZTsKKwkJCXNwaW5fdW5sb2NrKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfZGV2aWNlID0gJXAgcmVzZXRfaXNfcGVuZGluZyA9ICVkXG4iLAorCQlfX2Z1bmNfXywgaXNjaV9kZXZpY2UsIHJlc2V0X2lzX3BlbmRpbmcpOworCisJcmV0dXJuIHJlc2V0X2lzX3BlbmRpbmc7Cit9CisKKy8qKgorICogaXNjaV9kZXZpY2VfY2xlYXJfcmVzZXRfcGVuZGluZygpIC0gVGhpcyBmdW5jdGlvbiB3aWxsIGNsZWFyIGlmIGFueSBwZW5kaW5nCisgKiAgICByZXNldCBjb25kaXRpb24gZmxhZ3Mgb24gdGhlIGRldmljZS4KKyAqIEByZXF1ZXN0OiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgaXNjaV9kZXZpY2Ugb2JqZWN0LgorICoKKyAqIHRydWUgaWYgdGhlcmUgaXMgYSByZXNldCBwZW5kaW5nIGZvciB0aGUgZGV2aWNlLgorICovCit2b2lkIGlzY2lfZGV2aWNlX2NsZWFyX3Jlc2V0X3BlbmRpbmcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV9yZXF1ZXN0OworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnRtcF9yZXE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGlkZXY9JXAsIGlob3N0PSVwXG4iLAorCQkgX19mdW5jX18sIGlkZXYsIGlob3N0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBDbGVhciByZXNldCBwZW5kaW5nIG9uIGFsbCBwZW5kaW5nIHJlcXVlc3RzLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpc2NpX3JlcXVlc3QsIHRtcF9yZXEsCisJCQkJICZpZGV2LT5yZXFzX2luX3Byb2Nlc3MsIGRldl9ub2RlKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogaWRldiA9ICVwIHJlcXVlc3QgPSAlcFxuIiwKKwkJCSBfX2Z1bmNfXywgaWRldiwgaXNjaV9yZXF1ZXN0KTsKKworCQlpZiAoaXNjaV9yZXF1ZXN0LT50dHlwZSA9PSBpb190YXNrKSB7CisKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MyOworCQkJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKAorCQkJCWlzY2lfcmVxdWVzdCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzMik7CisJCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19ORUVEX0RFVl9SRVNFVDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MyKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmggYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjY2ZjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuaApAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfSVNDSV9SRU1PVEVfREVWSUNFX0hfCisjZGVmaW5lIF9JU0NJX1JFTU9URV9ERVZJQ0VfSF8KKyNpbmNsdWRlIDxzY3NpL2xpYnNhcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlICJzY3VfcmVtb3RlX25vZGVfY29udGV4dC5oIgorI2luY2x1ZGUgInJlbW90ZV9ub2RlX2NvbnRleHQuaCIKKyNpbmNsdWRlICJwb3J0LmgiCisKK2VudW0gc2NpX3JlbW90ZV9kZXZpY2Vfbm90X3JlYWR5X3JlYXNvbl9jb2RlIHsKKwlTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NUQVJUX1JFUVVFU1RFRCwKKwlTQ0lDX1JFTU9URV9ERVZJQ0VfTk9UX1JFQURZX1NUT1BfUkVRVUVTVEVELAorCVNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfU0FUQV9SRVFVRVNUX1NUQVJURUQsCisJU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TQVRBX1NEQl9FUlJPUl9GSVNfUkVDRUlWRUQsCisJU0NJQ19SRU1PVEVfREVWSUNFX05PVF9SRUFEWV9TTVBfUkVRVUVTVF9TVEFSVEVELAorCVNDSUNfUkVNT1RFX0RFVklDRV9OT1RfUkVBRFlfUkVBU09OX0NPREVfTUFYCit9OworCisvKioKKyAqIGlzY2lfcmVtb3RlX2RldmljZSAtIGlzY2kgcmVwcmVzZW50YXRpb24gb2YgYSBzYXMgZXhwYW5kZXIgLyBlbmQgcG9pbnQKKyAqIEBkZXZpY2VfcG9ydF93aWR0aDogaHcgc2V0dGluZyBmb3IgbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBjb25uZWN0aW9ucworICogQGNvbm5lY3Rpb25fcmF0ZTogcGVyLXRhc2tjb250ZXh0IGNvbm5lY3Rpb24gcmF0ZSBmb3IgdGhpcyBkZXZpY2UKKyAqIEB3b3JraW5nX3JlcXVlc3Q6IFNBVEEgcmVxdWVzdHMgaGF2ZSBubyB0YWcgd2UgZm9yIHVuYWNjZWxlcmF0ZWQKKyAqICAgICAgICAgICAgICAgICAgIHByb3RvY29scyB3ZSBuZWVkIGEgbWV0aG9kIHRvIGFzc29jaWF0ZSB1bnNvbGljaXRlZAorICogICAgICAgICAgICAgICAgICAgZnJhbWVzIHdpdGggYSBwZW5kaW5nIHJlcXVlc3QKKyAqLworc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSB7CisJI2RlZmluZSBJREVWX1NUQVJUX1BFTkRJTkcgMAorCSNkZWZpbmUgSURFVl9TVE9QX1BFTkRJTkcgMQorCSNkZWZpbmUgSURFVl9BTExPQ0FURUQgMgorCSNkZWZpbmUgSURFVl9FSCAzCisJI2RlZmluZSBJREVWX0dPTkUgNAorCSNkZWZpbmUgSURFVl9JT19SRUFEWSA1CisJI2RlZmluZSBJREVWX0lPX05DUUVSUk9SIDYKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IGlzY2lfcG9ydCAqaXNjaV9wb3J0OworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkb21haW5fZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlcXNfaW5fcHJvY2VzczsKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSBzbTsKKwl1MzIgZGV2aWNlX3BvcnRfd2lkdGg7CisJZW51bSBzYXNfbGlua3JhdGUgY29ubmVjdGlvbl9yYXRlOworCWJvb2wgaXNfZGlyZWN0X2F0dGFjaGVkOworCXN0cnVjdCBpc2NpX3BvcnQgKm93bmluZ19wb3J0OworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCBybmM7CisJLyogWFhYIHVuaWZ5IHdpdGggZGV2aWNlIHJlZmVyZW5jZSBjb3VudGluZyBhbmQgZGVsZXRlICovCisJdTMyIHN0YXJ0ZWRfcmVxdWVzdF9jb3VudDsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICp3b3JraW5nX3JlcXVlc3Q7CisJdTMyIG5vdF9yZWFkeV9yZWFzb247Cit9OworCisjZGVmaW5lIElTQ0lfUkVNT1RFX0RFVklDRV9TVEFSVF9USU1FT1VUIDUwMDAKKworLyogZGV2aWNlIHJlZmVyZW5jZSByb3V0aW5lcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBzY2lfbG9jayAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2xvb2t1cF9kZXZpY2Uoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gZGV2LT5sbGRkX2RldjsKKworCWlmIChpZGV2ICYmICF0ZXN0X2JpdChJREVWX0dPTkUsICZpZGV2LT5mbGFncykpIHsKKwkJa3JlZl9nZXQoJmlkZXYtPmtyZWYpOworCQlyZXR1cm4gaWRldjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBpc2NpX3JlbW90ZV9kZXZpY2VfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZik7CitzdGF0aWMgaW5saW5lIHZvaWQgaXNjaV9wdXRfZGV2aWNlKHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJaWYgKGlkZXYpCisJCWtyZWZfcHV0KCZpZGV2LT5rcmVmLCBpc2NpX3JlbW90ZV9kZXZpY2VfcmVsZWFzZSk7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBpc2NpX3JlbW90ZV9kZXZpY2Vfc3RvcChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldik7Cit2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9udWtlX3JlcXVlc3RzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpOwordm9pZCBpc2NpX3JlbW90ZV9kZXZpY2VfZ29uZShzdHJ1Y3QgZG9tYWluX2RldmljZSAqZG9tYWluX2Rldik7CitpbnQgaXNjaV9yZW1vdGVfZGV2aWNlX2ZvdW5kKHN0cnVjdCBkb21haW5fZGV2aWNlICpkb21haW5fZGV2KTsKK2Jvb2wgaXNjaV9kZXZpY2VfaXNfcmVzZXRfcGVuZGluZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpOwordm9pZCBpc2NpX2RldmljZV9jbGVhcl9yZXNldF9wZW5kaW5nKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldik7CisvKioKKyAqIHNjaV9yZW1vdGVfZGV2aWNlX3N0b3AoKSAtIFRoaXMgbWV0aG9kIHdpbGwgc3RvcCBib3RoIHRyYW5zbWlzc2lvbiBhbmQKKyAqICAgIHJlY2VwdGlvbiBvZiBsaW5rIGFjdGl2aXR5IGZvciB0aGUgc3VwcGxpZWQgcmVtb3RlIGRldmljZS4gIFRoaXMgbWV0aG9kCisgKiAgICBkaXNhYmxlcyBub3JtYWwgSU8gcmVxdWVzdHMgZnJvbSBmbG93aW5nIHRocm91Z2ggdG8gdGhlIHJlbW90ZSBkZXZpY2UuCisgKiBAcmVtb3RlX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkZXZpY2UgdG8gYmUgc3RvcHBlZC4KKyAqIEB0aW1lb3V0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gd2hpY2ggdGhlCisgKiAgICBzdG9wIG9wZXJhdGlvbiBzaG91bGQgY29tcGxldGUuCisgKgorICogQW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBkZXZpY2Ugd2FzIHN1Y2Nlc3NmdWxseSBzdG9wcGVkLiBTQ0lfU1VDQ0VTUworICogVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBpZiB0aGUgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gZm9yIHRoZSBkZXZpY2Ugd2FzCisgKiBzdWNjZXNzZnVsbHkgc3RvcHBlZC4KKyAqLworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3N0b3AoCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwl1MzIgdGltZW91dCk7CisKKy8qKgorICogc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXQoKSAtIFRoaXMgbWV0aG9kIHdpbGwgcmVzZXQgdGhlIGRldmljZSBtYWtpbmcgaXQKKyAqICAgIHJlYWR5IGZvciBvcGVyYXRpb24uIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGFueXRpbWUgdGhlIGRldmljZSBpcworICogICAgcmVzZXQgZWl0aGVyIHRocm91Z2ggYSBTTVAgcGh5IGNvbnRyb2wgb3IgYSBwb3J0IGhhcmQgcmVzZXQgcmVxdWVzdC4KKyAqIEByZW1vdGVfZGV2aWNlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGRldmljZSB0byBiZSByZXNldC4KKyAqCisgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY3R1YWxseSBjYXVzZSB0aGUgZGV2aWNlIGhhcmR3YXJlIHRvIGJlIHJlc2V0LiBUaGlzCisgKiBtZXRob2QgcmVzZXRzIHRoZSBzb2Z0d2FyZSBvYmplY3Qgc28gdGhhdCBpdCB3aWxsIGJlIG9wZXJhdGlvbmFsIGFmdGVyIGEKKyAqIGRldmljZSBoYXJkd2FyZSByZXNldCBjb21wbGV0ZXMuIEFuIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGUgZGV2aWNlIHJlc2V0CisgKiB3YXMgYWNjZXB0ZWQuIFNDSV9TVUNDRVNTIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgaWYgdGhlIGRldmljZSByZXNldCBpcworICogc3RhcnRlZC4KKyAqLworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0KAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpOworCisvKioKKyAqIHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0X2NvbXBsZXRlKCkgLSBUaGlzIG1ldGhvZCBpbmZvcm1zIHRoZSBkZXZpY2Ugb2JqZWN0CisgKiAgICB0aGF0IHRoZSByZXNldCBvcGVyYXRpb24gaXMgY29tcGxldGUgYW5kIHRoZSBkZXZpY2UgY2FuIHJlc3VtZSBvcGVyYXRpb24KKyAqICAgIGFnYWluLgorICogQHJlbW90ZV9kZXZpY2U6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZGV2aWNlIHdoaWNoIGlzIHRvIGJlIGluZm9ybWVkCisgKiAgICBvZiB0aGUgcmVzZXQgY29tcGxldGUgb3BlcmF0aW9uLgorICoKKyAqIEFuIGluZGljYXRpb24gdGhhdCB0aGUgZGV2aWNlIGlzIHJlc3VtaW5nIG9wZXJhdGlvbi4gU0NJX1NVQ0NFU1MgdGhlIGRldmljZQorICogaXMgcmVzdW1pbmcgb3BlcmF0aW9uLgorICovCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXRfY29tcGxldGUoCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldik7CisKKy8qKgorICogZW51bSBzY2lfcmVtb3RlX2RldmljZV9zdGF0ZXMgLSBUaGlzIGVudW1lcmF0aW9uIGRlcGljdHMgYWxsIHRoZSBzdGF0ZXMKKyAqICAgIGZvciB0aGUgY29tbW9uIHJlbW90ZSBkZXZpY2Ugc3RhdGUgbWFjaGluZS4KKyAqCisgKgorICovCitlbnVtIHNjaV9yZW1vdGVfZGV2aWNlX3N0YXRlcyB7CisJLyoqCisJICogU2ltcGx5IHRoZSBpbml0aWFsIHN0YXRlIGZvciB0aGUgYmFzZSByZW1vdGUgZGV2aWNlIHN0YXRlIG1hY2hpbmUuCisJICovCisJU0NJX0RFVl9JTklUSUFMLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVtb3RlIGRldmljZSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4KKwkgKiBzdG9wcGVkLiAgSW4gdGhpcyBzdGF0ZSBubyBuZXcgSU8gb3BlcmF0aW9ucyBhcmUgcGVybWl0dGVkLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBJTklUSUFMIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVE9QUElORyBzdGF0ZS4KKwkgKi8KKwlTQ0lfREVWX1NUT1BQRUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGUgdGhlIHJlbW90ZSBkZXZpY2UgaXMgaW4gdGhlIHByb2Nlc3Mgb2YKKwkgKiBiZWNvbWluZyByZWFkeSAoaS5lLiBzdGFydGluZykuICBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zCisJICogYXJlIHBlcm1pdHRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RPUFBFRCBzdGF0ZS4KKwkgKi8KKwlTQ0lfREVWX1NUQVJUSU5HLAorCisJLyoqCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhlIHJlbW90ZSBkZXZpY2UgaXMgbm93IHJlYWR5LiAgVGh1cywgdGhlIHVzZXIKKwkgKiBpcyBhYmxlIHRvIHBlcmZvcm0gSU8gb3BlcmF0aW9ucyBvbiB0aGUgcmVtb3RlIGRldmljZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRJTkcgc3RhdGUuCisJICovCisJU0NJX0RFVl9SRUFEWSwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGlkbGUgc3Vic3RhdGUgZm9yIHRoZSBzdHAgcmVtb3RlIGRldmljZS4gIFdoZW4gdGhlcmUgYXJlIG5vCisJICogYWN0aXZlIElPIGZvciB0aGUgZGV2aWNlIGl0IGlzIGlzIGluIHRoaXMgc3RhdGUuCisJICovCisJU0NJX1NUUF9ERVZfSURMRSwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbW1hbmQgc3RhdGUgZm9yIGZvciB0aGUgU1RQIHJlbW90ZSBkZXZpY2UuICBUaGlzIHN0YXRlIGlzCisJICogZW50ZXJlZCB3aGVuIHRoZSBkZXZpY2UgaXMgcHJvY2Vzc2luZyBhIG5vbi1OQ1EgY29tbWFuZC4gIFRoZSBkZXZpY2Ugb2JqZWN0CisJICogd2lsbCBmYWlsIGFueSBuZXcgc3RhcnQgSU8gcmVxdWVzdHMgdW50aWwgdGhpcyBjb21tYW5kIGlzIGNvbXBsZXRlLgorCSAqLworCVNDSV9TVFBfREVWX0NNRCwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIE5DUSBzdGF0ZSBmb3IgdGhlIFNUUCByZW1vdGUgZGV2aWNlLiAgVGhpcyBzdGF0ZSBpcyBlbnRlcmVkCisJICogd2hlbiB0aGUgZGV2aWNlIGlzIHByb2Nlc3NpbmcgYW4gTkNRIHJldXFlc3QuICBJdCB3aWxsIHJlbWFpbiBpbiB0aGlzIHN0YXRlCisJICogc28gbG9uZyBhcyB0aGVyZSBpcyBvbmUgb3IgbW9yZSBOQ1EgcmVxdWVzdHMgYmVpbmcgcHJvY2Vzc2VkLgorCSAqLworCVNDSV9TVFBfREVWX05DUSwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIE5DUSBlcnJvciBzdGF0ZSBmb3IgdGhlIFNUUCByZW1vdGUgZGV2aWNlLiAgVGhpcyBzdGF0ZSBpcworCSAqIGVudGVyZWQgd2hlbiBhbiBTREIgZXJyb3IgRklTIGlzIHJlY2VpdmVkIGJ5IHRoZSBkZXZpY2Ugb2JqZWN0IHdoaWxlIGluIHRoZQorCSAqIE5DUSBzdGF0ZS4gIFRoZSBkZXZpY2Ugb2JqZWN0IHdpbGwgb25seSBhY2NlcHQgYSBSRUFEIExPRyBjb21tYW5kIHdoaWxlIGluCisJICogdGhpcyBzdGF0ZS4KKwkgKi8KKwlTQ0lfU1RQX0RFVl9OQ1FfRVJST1IsCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBSRUFEWSBzdWJzdGF0ZSBpbmRpY2F0ZXMgdGhlIGRldmljZSBpcyB3YWl0aW5nIGZvciB0aGUgUkVTRVQgdGFzaworCSAqIGNvbWluZyB0byBiZSByZWNvdmVyZWQgZnJvbSBjZXJ0YWluIGhhcmR3YXJlIHNwZWNpZmljIGVycm9yLgorCSAqLworCVNDSV9TVFBfREVWX0FXQUlUX1JFU0VULAorCisJLyoqCisJICogVGhpcyBpcyB0aGUgcmVhZHkgb3BlcmF0aW9uYWwgc3Vic3RhdGUgZm9yIHRoZSByZW1vdGUgZGV2aWNlLiAgVGhpcyBpcyB0aGUKKwkgKiBub3JtYWwgb3BlcmF0aW9uYWwgc3RhdGUgZm9yIGEgcmVtb3RlIGRldmljZS4KKwkgKi8KKwlTQ0lfU01QX0RFVl9JRExFLAorCisJLyoqCisJICogVGhpcyBpcyB0aGUgc3VzcGVuZGVkIHN0YXRlIGZvciB0aGUgcmVtb3RlIGRldmljZS4gIFRoaXMgaXMgdGhlIHN0YXRlIHRoYXQKKwkgKiB0aGUgZGV2aWNlIGlzIHBsYWNlZCBpbiB3aGVuIGEgUk5DIHN1c3BlbmQgaXMgcmVjZWl2ZWQgYnkgdGhlIFNDVSBoYXJkd2FyZS4KKwkgKi8KKwlTQ0lfU01QX0RFVl9DTUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSByZW1vdGUgZGV2aWNlIGlzIGluIHRoZSBwcm9jZXNzIG9mCisJICogc3RvcHBpbmcuICBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQsIGJ1dAorCSAqIGV4aXN0aW5nIElPIG9wZXJhdGlvbnMgYXJlIGFsbG93ZWQgdG8gY29tcGxldGUuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIFJFQURZIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBGQUlMRUQgc3RhdGUuCisJICovCisJU0NJX0RFVl9TVE9QUElORywKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlbW90ZSBkZXZpY2UgaGFzIGZhaWxlZC4KKwkgKiBJbiB0aGlzIHN0YXRlIG5vIG5ldyBJTyBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIElOSVRJQUxJWklORyBzdGF0ZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJX0RFVl9GQUlMRUQsCisKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGluZGljYXRlcyB0aGUgZGV2aWNlIGlzIGJlaW5nIHJlc2V0LgorCSAqIEluIHRoaXMgc3RhdGUgbm8gbmV3IElPIG9wZXJhdGlvbnMgYXJlIHBlcm1pdHRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgUkVBRFkgc3RhdGUuCisJICovCisJU0NJX0RFVl9SRVNFVFRJTkcsCisKKwkvKioKKwkgKiBTaW1wbHkgdGhlIGZpbmFsIHN0YXRlIGZvciB0aGUgYmFzZSByZW1vdGUgZGV2aWNlIHN0YXRlIG1hY2hpbmUuCisJICovCisJU0NJX0RFVl9GSU5BTCwKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqcm5jX3RvX2RldihzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYykKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCisJaWRldiA9IGNvbnRhaW5lcl9vZihybmMsIHR5cGVvZigqaWRldiksIHJuYyk7CisKKwlyZXR1cm4gaWRldjsKK30KKworc3RhdGljIGlubGluZSBib29sIGRldl9pc19leHBhbmRlcihzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPmRldl90eXBlID09IEVER0VfREVWIHx8IGRldi0+ZGV2X3R5cGUgPT0gRkFOT1VUX0RFVjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjaV9yZW1vdGVfZGV2aWNlX2RlY3JlbWVudF9yZXF1ZXN0X2NvdW50KHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJLyogWFhYIGRlbGV0ZSB0aGlzIHZvb2RvbyB3aGVuIGNvbnZlcnRpbmcgdG8gdGhlIHRvcC1sZXZlbCBkZXZpY2UKKwkgKiByZWZlcmVuY2UgY291bnQKKwkgKi8KKwlpZiAoV0FSTl9PTkNFKGlkZXYtPnN0YXJ0ZWRfcmVxdWVzdF9jb3VudCA9PSAwLAorCQkgICAgICAiJXM6IHRyaWVkIHRvIGRlY3JlbWVudCBzdGFydGVkX3JlcXVlc3RfY291bnQgcGFzdCAwIT8iLAorCQkJX19mdW5jX18pKQorCQkvKiBwYXNzICovOworCWVsc2UKKwkJaWRldi0+c3RhcnRlZF9yZXF1ZXN0X2NvdW50LS07Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9mcmFtZV9oYW5kbGVyKAorCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJdTMyIGZyYW1lX2luZGV4KTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX2V2ZW50X2hhbmRsZXIoCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwl1MzIgZXZlbnRfY29kZSk7CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX2RldmljZV9zdGFydF9pbygKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2Vfc3RhcnRfdGFzaygKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfY29tcGxldGVfaW8oCisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX3N1c3BlbmQoCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwl1MzIgc3VzcGVuZF90eXBlKTsKKwordm9pZCBzY2lfcmVtb3RlX2RldmljZV9wb3N0X3JlcXVlc3QoCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwl1MzIgcmVxdWVzdCk7CisKKyNlbmRpZiAvKiAhZGVmaW5lZChfSVNDSV9SRU1PVEVfREVWSUNFX0hfKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfY29udGV4dC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OGU4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfbm9kZV9jb250ZXh0LmMKQEAgLTAsMCArMSw2MjcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInJlbW90ZV9kZXZpY2UuaCIKKyNpbmNsdWRlICJyZW1vdGVfbm9kZV9jb250ZXh0LmgiCisjaW5jbHVkZSAic2N1X2V2ZW50X2NvZGVzLmgiCisjaW5jbHVkZSAic2N1X3Rhc2tfY29udGV4dC5oIgorCisKKy8qKgorICoKKyAqIEBzY2lfcm5jOiBUaGUgUk5DIGZvciB3aGljaCB0aGUgaXMgcG9zdGVkIHJlcXVlc3QgaXMgYmVpbmcgbWFkZS4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBSTkMgaXMgbm90IGluIHRoZSBpbml0aWFsIHN0YXRlLiAgSW4gYWxsCisgKiBvdGhlciBzdGF0ZXMgdGhlIFJOQyBpcyBjb25zaWRlcmVkIGFjdGl2ZSBhbmQgdGhpcyB3aWxsIHJldHVybiB0cnVlLiBUaGUKKyAqIGRlc3Ryb3kgcmVxdWVzdCBvZiB0aGUgc3RhdGUgbWFjaGluZSBkcml2ZXMgdGhlIFJOQyBiYWNrIHRvIHRoZSBpbml0aWFsCisgKiBzdGF0ZS4gIElmIHRoZSBzdGF0ZSBtYWNoaW5lIGNoYW5nZXMgdGhlbiB0aGlzIHJvdXRpbmUgd2lsbCBhbHNvIGhhdmUgdG8gYmUKKyAqIGNoYW5nZWQuIGJvb2wgdHJ1ZSBpZiB0aGUgc3RhdGUgbWFjaGluZSBpcyBub3QgaW4gdGhlIGluaXRpYWwgc3RhdGUgZmFsc2UgaWYKKyAqIHRoZSBzdGF0ZSBtYWNoaW5lIGlzIGluIHRoZSBpbml0aWFsIHN0YXRlCisgKi8KKworLyoqCisgKgorICogQHNjaV9ybmM6IFRoZSBzdGF0ZSBvZiB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBvYmplY3QgdG8gY2hlY2suCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBpcyBpbiBhIFJFQURZIHN0YXRlCisgKiBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gZmFsc2UgYm9vbCB0cnVlIGlmIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IGlzIGluCisgKiB0aGUgcmVhZHkgc3RhdGUuIGZhbHNlIGlmIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IGlzIG5vdCBpbiB0aGUgcmVhZHkgc3RhdGUuCisgKi8KK2Jvb2wgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfaXNfcmVhZHkoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jKQoreworCXUzMiBjdXJyZW50X3N0YXRlID0gc2NpX3JuYy0+c20uY3VycmVudF9zdGF0ZV9pZDsKKworCWlmIChjdXJyZW50X3N0YXRlID09IFNDSV9STkNfUkVBRFkpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmNfYnlfaWQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHUxNiBpZCkKK3sKKwlpZiAoaWQgPCBpaG9zdC0+cmVtb3RlX25vZGVfZW50cmllcyAmJgorCSAgICBpaG9zdC0+ZGV2aWNlX3RhYmxlW2lkXSkKKwkJcmV0dXJuICZpaG9zdC0+cmVtb3RlX25vZGVfY29udGV4dF90YWJsZVtpZF07CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfY29uc3RydWN0X2J1ZmZlcihzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IHJuY190b19kZXYoc2NpX3JuYyk7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisJaW50IHJuaSA9IHNjaV9ybmMtPnJlbW90ZV9ub2RlX2luZGV4OworCXVuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmM7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3Q7CisJX19sZTY0IHNhc19hZGRyOworCisJaWhvc3QgPSBpZGV2LT5vd25pbmdfcG9ydC0+b3duaW5nX2NvbnRyb2xsZXI7CisJcm5jID0gc2NpX3JuY19ieV9pZChpaG9zdCwgcm5pKTsKKworCW1lbXNldChybmMsIDAsIHNpemVvZih1bmlvbiBzY3VfcmVtb3RlX25vZGVfY29udGV4dCkKKwkJKiBzY2lfcmVtb3RlX2RldmljZV9ub2RlX2NvdW50KGlkZXYpKTsKKworCXJuYy0+c3NwLnJlbW90ZV9ub2RlX2luZGV4ID0gcm5pOworCXJuYy0+c3NwLnJlbW90ZV9ub2RlX3BvcnRfd2lkdGggPSBpZGV2LT5kZXZpY2VfcG9ydF93aWR0aDsKKwlybmMtPnNzcC5sb2dpY2FsX3BvcnRfaW5kZXggPSBpZGV2LT5vd25pbmdfcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleDsKKworCS8qIHNhcyBhZGRyZXNzIGlzIF9fYmU2NCwgY29udGV4dCByYW0gZm9ybWF0IGlzIF9fbGU2NCAqLworCXNhc19hZGRyID0gY3B1X3RvX2xlNjQoU0FTX0FERFIoZGV2LT5zYXNfYWRkcikpOworCXJuYy0+c3NwLnJlbW90ZV9zYXNfYWRkcmVzc19oaSA9IHVwcGVyXzMyX2JpdHMoc2FzX2FkZHIpOworCXJuYy0+c3NwLnJlbW90ZV9zYXNfYWRkcmVzc19sbyA9IGxvd2VyXzMyX2JpdHMoc2FzX2FkZHIpOworCisJcm5jLT5zc3AubmV4dXNfbG9zc190aW1lcl9lbmFibGUgPSB0cnVlOworCXJuYy0+c3NwLmNoZWNrX2JpdCAgICAgICAgICAgICAgID0gZmFsc2U7CisJcm5jLT5zc3AuaXNfdmFsaWQgICAgICAgICAgICAgICAgPSBmYWxzZTsKKwlybmMtPnNzcC5pc19yZW1vdGVfbm9kZV9jb250ZXh0ICA9IHRydWU7CisJcm5jLT5zc3AuZnVuY3Rpb25fbnVtYmVyICAgICAgICAgPSAwOworCisJcm5jLT5zc3AuYXJiaXRyYXRpb25fd2FpdF90aW1lID0gMDsKKworCWlmIChkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKSB7CisJCXJuYy0+c3NwLmNvbm5lY3Rpb25fb2NjdXBhbmN5X3RpbWVvdXQgPQorCQkJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5zdHBfbWF4X29jY3VwYW5jeV90aW1lb3V0OworCQlybmMtPnNzcC5jb25uZWN0aW9uX2luYWN0aXZpdHlfdGltZW91dCA9CisJCQlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnN0cF9pbmFjdGl2aXR5X3RpbWVvdXQ7CisJfSBlbHNlIHsKKwkJcm5jLT5zc3AuY29ubmVjdGlvbl9vY2N1cGFuY3lfdGltZW91dCAgPQorCQkJaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5zc3BfbWF4X29jY3VwYW5jeV90aW1lb3V0OworCQlybmMtPnNzcC5jb25uZWN0aW9uX2luYWN0aXZpdHlfdGltZW91dCA9CisJCQlpaG9zdC0+dXNlcl9wYXJhbWV0ZXJzLnNzcF9pbmFjdGl2aXR5X3RpbWVvdXQ7CisJfQorCisJcm5jLT5zc3AuaW5pdGlhbF9hcmJpdHJhdGlvbl93YWl0X3RpbWUgPSAwOworCisJLyogT3BlbiBBZGRyZXNzIEZyYW1lIFBhcmFtZXRlcnMgKi8KKwlybmMtPnNzcC5vYWZfY29ubmVjdGlvbl9yYXRlID0gaWRldi0+Y29ubmVjdGlvbl9yYXRlOworCXJuYy0+c3NwLm9hZl9mZWF0dXJlcyA9IDA7CisJcm5jLT5zc3Aub2FmX3NvdXJjZV96b25lX2dyb3VwID0gMDsKKwlybmMtPnNzcC5vYWZfbW9yZV9jb21wYXRpYmlsaXR5X2ZlYXR1cmVzID0gMDsKK30KKworLyoqCisgKgorICogQHNjaV9ybmM6CisgKiBAY2FsbGJhY2s6CisgKiBAY2FsbGJhY2tfcGFyYW1ldGVyOgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgc2V0dXAgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgb2JqZWN0IHNvIGl0IHdpbGwgdHJhbnNpdGlvbgorICogdG8gaXRzIHJlYWR5IHN0YXRlLiAgSWYgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaXMgYWxyZWFkeSBzZXR1cCB0bworICogdHJhbnNpdGlvbiB0byBpdHMgZmluYWwgc3RhdGUgdGhlbiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zZXR1cF90b19yZXN1bWUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCXNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIGNhbGxiYWNrLAorCXZvaWQgKmNhbGxiYWNrX3BhcmFtZXRlcikKK3sKKwlpZiAoc2NpX3JuYy0+ZGVzdGluYXRpb25fc3RhdGUgIT0gU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfRklOQUwpIHsKKwkJc2NpX3JuYy0+ZGVzdGluYXRpb25fc3RhdGUgPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9ERVNUSU5BVElPTl9TVEFURV9SRUFEWTsKKwkJc2NpX3JuYy0+dXNlcl9jYWxsYmFjayAgICAgPSBjYWxsYmFjazsKKwkJc2NpX3JuYy0+dXNlcl9jb29raWUgICAgICAgPSBjYWxsYmFja19wYXJhbWV0ZXI7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zZXR1cF90b19kZXN0b3J5KAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYywKKwlzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayBjYWxsYmFjaywKKwl2b2lkICpjYWxsYmFja19wYXJhbWV0ZXIpCit7CisJc2NpX3JuYy0+ZGVzdGluYXRpb25fc3RhdGUgPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9ERVNUSU5BVElPTl9TVEFURV9GSU5BTDsKKwlzY2lfcm5jLT51c2VyX2NhbGxiYWNrICAgICA9IGNhbGxiYWNrOworCXNjaV9ybmMtPnVzZXJfY29va2llICAgICAgID0gY2FsbGJhY2tfcGFyYW1ldGVyOworfQorCisvKioKKyAqCisgKgorICogVGhpcyBtZXRob2QganVzdCBjYWxscyB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbiBhbmQgdGhlbiByZXNldHMgdGhlCisgKiBjYWxsYmFjay4KKyAqLworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfbm90aWZ5X3VzZXIoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMpCit7CisJaWYgKHJuYy0+dXNlcl9jYWxsYmFjayAhPSBOVUxMKSB7CisJCSgqcm5jLT51c2VyX2NhbGxiYWNrKShybmMtPnVzZXJfY29va2llKTsKKworCQlybmMtPnVzZXJfY2FsbGJhY2sgPSBOVUxMOworCQlybmMtPnVzZXJfY29va2llID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2NvbnRpbnVlX3N0YXRlX3RyYW5zaXRpb25zKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jKQoreworCWlmIChybmMtPmRlc3RpbmF0aW9uX3N0YXRlID09IFNDSUNfU0RTX1JFTU9URV9OT0RFX0RFU1RJTkFUSU9OX1NUQVRFX1JFQURZKQorCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZXN1bWUocm5jLCBybmMtPnVzZXJfY2FsbGJhY2ssCisJCQkJCQkgICAgcm5jLT51c2VyX2Nvb2tpZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3ZhbGlkYXRlX2NvbnRleHRfYnVmZmVyKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYykKK3sKKwl1bmlvbiBzY3VfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jX2J1ZmZlcjsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gcm5jX3RvX2RldihzY2lfcm5jKTsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlkZXYtPm93bmluZ19wb3J0LT5vd25pbmdfY29udHJvbGxlcjsKKworCXJuY19idWZmZXIgPSBzY2lfcm5jX2J5X2lkKGlob3N0LCBzY2lfcm5jLT5yZW1vdGVfbm9kZV9pbmRleCk7CisKKwlybmNfYnVmZmVyLT5zc3AuaXNfdmFsaWQgPSB0cnVlOworCisJaWYgKCFpZGV2LT5pc19kaXJlY3RfYXR0YWNoZWQgJiYKKwkgICAgKGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYgfHwgKGRldi0+dHByb3RvICYgU0FTX1BST1RPQ09MX1NUUCkpKSB7CisJCXNjaV9yZW1vdGVfZGV2aWNlX3Bvc3RfcmVxdWVzdChpZGV2LCBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DXzk2KTsKKwl9IGVsc2UgeworCQlzY2lfcmVtb3RlX2RldmljZV9wb3N0X3JlcXVlc3QoaWRldiwgU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ18zMik7CisKKwkJaWYgKGlkZXYtPmlzX2RpcmVjdF9hdHRhY2hlZCkKKwkJCXNjaV9wb3J0X3NldHVwX3RyYW5zcG9ydHMoaWRldi0+b3duaW5nX3BvcnQsCisJCQkJCQkgIHNjaV9ybmMtPnJlbW90ZV9ub2RlX2luZGV4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2ludmFsaWRhdGVfY29udGV4dF9idWZmZXIoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jKQoreworCXVuaW9uIHNjdV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmNfYnVmZmVyOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBybmNfdG9fZGV2KHNjaV9ybmMpOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaWRldi0+b3duaW5nX3BvcnQtPm93bmluZ19jb250cm9sbGVyOworCisJcm5jX2J1ZmZlciA9IHNjaV9ybmNfYnlfaWQoaWhvc3QsIHNjaV9ybmMtPnJlbW90ZV9ub2RlX2luZGV4KTsKKworCXJuY19idWZmZXItPnNzcC5pc192YWxpZCA9IGZhbHNlOworCisJc2NpX3JlbW90ZV9kZXZpY2VfcG9zdF9yZXF1ZXN0KHJuY190b19kZXYoc2NpX3JuYyksCisJCQkJICAgICAgIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfSU5WQUxJREFURSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2luaXRpYWxfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKnJuYyksIHNtKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGdvdHRlbiBiYWNrIHRvIHRoZSBpbml0aWFsIHN0YXRlIGJlY2F1c2UKKwkgKiBzb21lb25lIHJlcXVlc3RlZCB0byBkZXN0cm95IHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IG9iamVjdC4KKwkgKi8KKwlpZiAoc20tPnByZXZpb3VzX3N0YXRlX2lkID09IFNDSV9STkNfSU5WQUxJREFUSU5HKSB7CisJCXJuYy0+ZGVzdGluYXRpb25fc3RhdGUgPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9ERVNUSU5BVElPTl9TVEFURV9VTlNQRUNJRklFRDsKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfbm90aWZ5X3VzZXIocm5jKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Bvc3Rpbmdfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYyA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCpzY2lfcm5jKSwgc20pOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfdmFsaWRhdGVfY29udGV4dF9idWZmZXIoc2NpX3JuYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2ludmFsaWRhdGluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqcm5jKSwgc20pOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfaW52YWxpZGF0ZV9jb250ZXh0X2J1ZmZlcihybmMpOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZXN1bWluZ19zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqcm5jKSwgc20pOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldjsKKworCWlkZXYgPSBybmNfdG9fZGV2KHJuYyk7CisJZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKworCS8qCisJICogRm9yIGRpcmVjdCBhdHRhY2hlZCBTQVRBIGRldmljZXMgd2UgbmVlZCB0byBjbGVhciB0aGUgVExDUgorCSAqIE5DUSB0byBUQ2kgdGFnIG1hcHBpbmcgb24gdGhlIHBoeSBhbmQgaW4gY2FzZXMgd2hlcmUgd2UKKwkgKiByZXN1bWUgYmVjYXVzZSBvZiBhIHRhcmdldCByZXNldCB3ZSBhbHNvIG5lZWQgdG8gdXBkYXRlCisJICogdGhlIFNUUFRMREFSTkkgcmVnaXN0ZXIgd2l0aCB0aGUgUk5pIG9mIHRoZSBkZXZpY2UKKwkgKi8KKwlpZiAoKGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYgfHwgKGRldi0+dHByb3RvICYgU0FTX1BST1RPQ09MX1NUUCkpICYmCisJICAgIGlkZXYtPmlzX2RpcmVjdF9hdHRhY2hlZCkKKwkJc2NpX3BvcnRfc2V0dXBfdHJhbnNwb3J0cyhpZGV2LT5vd25pbmdfcG9ydCwKKwkJCQkJICAgICAgIHJuYy0+cmVtb3RlX25vZGVfaW5kZXgpOworCisJc2NpX3JlbW90ZV9kZXZpY2VfcG9zdF9yZXF1ZXN0KGlkZXYsIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfUkVTVU1FKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVhZHlfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqcm5jID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKnJuYyksIHNtKTsKKworCXJuYy0+ZGVzdGluYXRpb25fc3RhdGUgPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9ERVNUSU5BVElPTl9TVEFURV9VTlNQRUNJRklFRDsKKworCWlmIChybmMtPnVzZXJfY2FsbGJhY2spCisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X25vdGlmeV91c2VyKHJuYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3R4X3N1c3BlbmRlZF9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqcm5jKSwgc20pOworCisJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfY29udGludWVfc3RhdGVfdHJhbnNpdGlvbnMocm5jKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfdHhfcnhfc3VzcGVuZGVkX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYyA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCpybmMpLCBzbSk7CisKKwlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9jb250aW51ZV9zdGF0ZV90cmFuc2l0aW9ucyhybmMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjaV9iYXNlX3N0YXRlIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlX3RhYmxlW10gPSB7CisJW1NDSV9STkNfSU5JVElBTF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2luaXRpYWxfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1JOQ19QT1NUSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcG9zdGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUk5DX0lOVkFMSURBVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2ludmFsaWRhdGluZ19zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUk5DX1JFU1VNSU5HXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1pbmdfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1JOQ19SRUFEWV0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3JlYWR5X3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9STkNfVFhfU1VTUEVOREVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfdHhfc3VzcGVuZGVkX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9STkNfVFhfUlhfU1VTUEVOREVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfdHhfcnhfc3VzcGVuZGVkX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9STkNfQVdBSVRfU1VTUEVOU0lPTl0gPSB7IH0sCit9OworCit2b2lkIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2NvbnN0cnVjdChzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnJuYywKKwkJCQkJICAgIHUxNiByZW1vdGVfbm9kZV9pbmRleCkKK3sKKwltZW1zZXQocm5jLCAwLCBzaXplb2Yoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0KSk7CisKKwlybmMtPnJlbW90ZV9ub2RlX2luZGV4ID0gcmVtb3RlX25vZGVfaW5kZXg7CisJcm5jLT5kZXN0aW5hdGlvbl9zdGF0ZSA9IFNDSUNfU0RTX1JFTU9URV9OT0RFX0RFU1RJTkFUSU9OX1NUQVRFX1VOU1BFQ0lGSUVEOworCisJc2NpX2luaXRfc20oJnJuYy0+c20sIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlX3RhYmxlLCBTQ0lfUk5DX0lOSVRJQUwpOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfZXZlbnRfaGFuZGxlcihzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkJICAgdTMyIGV2ZW50X2NvZGUpCit7CisJZW51bSBzY2lzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gc2NpX3JuYy0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUk5DX1BPU1RJTkc6CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1BPU1RfUk5DX0NPTVBMRVRFOgorCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfUkVBRFkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIG91dDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNDSV9STkNfSU5WQUxJREFUSU5HOgorCQlpZiAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpID09IFNDVV9FVkVOVF9QT1NUX1JOQ19JTlZBTElEQVRFX0NPTVBMRVRFKSB7CisJCQlpZiAoc2NpX3JuYy0+ZGVzdGluYXRpb25fc3RhdGUgPT0gU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfRklOQUwpCisJCQkJc3RhdGUgPSBTQ0lfUk5DX0lOSVRJQUw7CisJCQllbHNlCisJCQkJc3RhdGUgPSBTQ0lfUk5DX1BPU1RJTkc7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgc3RhdGUpOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChzY3VfZ2V0X2V2ZW50X3R5cGUoZXZlbnRfY29kZSkpIHsKKwkJCWNhc2UgU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFg6CisJCQljYXNlIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYOgorCQkJCS8qIFdlIHJlYWxseSBkb250IGNhcmUgaWYgdGhlIGhhcmR3YXJlIGlzIGdvaW5nIHRvIHN1c3BlbmQKKwkJCQkgKiB0aGUgZGV2aWNlIHNpbmNlIGl0J3MgYmVpbmcgaW52YWxpZGF0ZWQgYW55d2F5ICovCisJCQkJZGV2X2RiZyhzY2lyZGV2X3RvX2RldihybmNfdG9fZGV2KHNjaV9ybmMpKSwKKwkJCQkJIiVzOiBTQ0lDIFJlbW90ZSBOb2RlIENvbnRleHQgMHglcCB3YXMgIgorCQkJCQkic3VzcGVuZWRlZCBieSBoYXJkd2FyZSB3aGlsZSBiZWluZyAiCisJCQkJCSJpbnZhbGlkYXRlZC5cbiIsIF9fZnVuY19fLCBzY2lfcm5jKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTQ0lfUk5DX1JFU1VNSU5HOgorCQlpZiAoc2N1X2dldF9ldmVudF9jb2RlKGV2ZW50X2NvZGUpID09IFNDVV9FVkVOVF9QT1NUX1JDTl9SRUxFQVNFKSB7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19SRUFEWSk7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfdHlwZShldmVudF9jb2RlKSkgeworCQkJY2FzZSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWDoKKwkJCWNhc2UgU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFhfUlg6CisJCQkJLyogV2UgcmVhbGx5IGRvbnQgY2FyZSBpZiB0aGUgaGFyZHdhcmUgaXMgZ29pbmcgdG8gc3VzcGVuZAorCQkJCSAqIHRoZSBkZXZpY2Ugc2luY2UgaXQncyBiZWluZyByZXN1bWVkIGFueXdheSAqLworCQkJCWRldl9kYmcoc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCQkJCSIlczogU0NJQyBSZW1vdGUgTm9kZSBDb250ZXh0IDB4JXAgd2FzICIKKwkJCQkJInN1c3BlbmVkZWQgYnkgaGFyZHdhcmUgd2hpbGUgYmVpbmcgcmVzdW1lZC5cbiIsCisJCQkJCV9fZnVuY19fLCBzY2lfcm5jKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTQ0lfUk5DX1JFQURZOgorCQlzd2l0Y2ggKHNjdV9nZXRfZXZlbnRfdHlwZShldmVudF9jb2RlKSkgeworCQljYXNlIFNDVV9FVkVOVF9UTF9STkNfU1VTUEVORF9UWDoKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJnNjaV9ybmMtPnNtLCBTQ0lfUk5DX1RYX1NVU1BFTkRFRCk7CisJCQlzY2lfcm5jLT5zdXNwZW5zaW9uX2NvZGUgPSBzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihldmVudF9jb2RlKTsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9FVkVOVF9UTF9STkNfU1VTUEVORF9UWF9SWDoKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJnNjaV9ybmMtPnNtLCBTQ0lfUk5DX1RYX1JYX1NVU1BFTkRFRCk7CisJCQlzY2lfcm5jLT5zdXNwZW5zaW9uX2NvZGUgPSBzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihldmVudF9jb2RlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTQ0lfUk5DX0FXQUlUX1NVU1BFTlNJT046CisJCXN3aXRjaCAoc2N1X2dldF9ldmVudF90eXBlKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgU0NVX0VWRU5UX1RMX1JOQ19TVVNQRU5EX1RYOgorCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfVFhfU1VTUEVOREVEKTsKKwkJCXNjaV9ybmMtPnN1c3BlbnNpb25fY29kZSA9IHNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKGV2ZW50X2NvZGUpOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX0VWRU5UX1RMX1JOQ19TVVNQRU5EX1RYX1JYOgorCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfVFhfUlhfU1VTUEVOREVEKTsKKwkJCXNjaV9ybmMtPnN1c3BlbnNpb25fY29kZSA9IHNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKGV2ZW50X2NvZGUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIG91dDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihybmNfdG9fZGV2KHNjaV9ybmMpKSwKKwkJCSAiJXM6IGludmFsaWQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKwlyZXR1cm4gU0NJX1NVQ0NFU1M7CisKKyBvdXQ6CisJZGV2X3dhcm4oc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCSAiJXM6IGNvZGU6ICUjeCBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBldmVudF9jb2RlLCBzdGF0ZSk7CisJcmV0dXJuIFNDSV9GQUlMVVJFOworCit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9kZXN0cnVjdChzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkgICAgICBzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayBjYl9mbiwKKwkJCQkJCSAgICAgIHZvaWQgKmNiX3ApCit7CisJZW51bSBzY2lzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gc2NpX3JuYy0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUk5DX0lOVkFMSURBVElORzoKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc2V0dXBfdG9fZGVzdG9yeShzY2lfcm5jLCBjYl9mbiwgY2JfcCk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9STkNfUE9TVElORzoKKwljYXNlIFNDSV9STkNfUkVTVU1JTkc6CisJY2FzZSBTQ0lfUk5DX1JFQURZOgorCWNhc2UgU0NJX1JOQ19UWF9TVVNQRU5ERUQ6CisJY2FzZSBTQ0lfUk5DX1RYX1JYX1NVU1BFTkRFRDoKKwljYXNlIFNDSV9STkNfQVdBSVRfU1VTUEVOU0lPTjoKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc2V0dXBfdG9fZGVzdG9yeShzY2lfcm5jLCBjYl9mbiwgY2JfcCk7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJnNjaV9ybmMtPnNtLCBTQ0lfUk5DX0lOVkFMSURBVElORyk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9STkNfSU5JVElBTDoKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCQkgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQkvKiBXZSBoYXZlIGRlY2lkZWQgdGhhdCB0aGUgZGVzdHJ1Y3QgcmVxdWVzdCBvbiB0aGUgcmVtb3RlIG5vZGUgY29udGV4dAorCQkgKiBjYW4gbm90IGZhaWwgc2luY2UgaXQgaXMgZWl0aGVyIGluIHRoZSBpbml0aWFsL2Rlc3Ryb3llZCBzdGF0ZSBvciBpcworCQkgKiBjYW4gYmUgZGVzdHJveWVkLgorCQkgKi8KKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KHJuY190b19kZXYoc2NpX3JuYykpLAorCQkJICIlczogaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3VzcGVuZChzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkgICAgIHUzMiBzdXNwZW5kX3R5cGUsCisJCQkJCQkgICAgIHNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIGNiX2ZuLAorCQkJCQkJICAgICB2b2lkICpjYl9wKQoreworCWVudW0gc2Npc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IHNjaV9ybmMtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJaWYgKHN0YXRlICE9IFNDSV9STkNfUkVBRFkpIHsKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCQkgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwlzY2lfcm5jLT51c2VyX2NhbGxiYWNrICAgPSBjYl9mbjsKKwlzY2lfcm5jLT51c2VyX2Nvb2tpZSAgICAgPSBjYl9wOworCXNjaV9ybmMtPnN1c3BlbnNpb25fY29kZSA9IHN1c3BlbmRfdHlwZTsKKworCWlmIChzdXNwZW5kX3R5cGUgPT0gU0NJX1NPRlRXQVJFX1NVU1BFTlNJT04pIHsKKwkJc2NpX3JlbW90ZV9kZXZpY2VfcG9zdF9yZXF1ZXN0KHJuY190b19kZXYoc2NpX3JuYyksCisJCQkJCQkgICAgU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ19TVVNQRU5EX1RYKTsKKwl9CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19BV0FJVF9TVVNQRU5TSU9OKTsKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZXN1bWUoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJICAgIHNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIGNiX2ZuLAorCQkJCQkJICAgIHZvaWQgKmNiX3ApCit7CisJZW51bSBzY2lzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlcyBzdGF0ZTsKKworCXN0YXRlID0gc2NpX3JuYy0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUk5DX0lOSVRJQUw6CisJCWlmIChzY2lfcm5jLT5yZW1vdGVfbm9kZV9pbmRleCA9PSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKworCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zZXR1cF90b19yZXN1bWUoc2NpX3JuYywgY2JfZm4sIGNiX3ApOworCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9jb25zdHJ1Y3RfYnVmZmVyKHNjaV9ybmMpOworCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19QT1NUSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1JOQ19QT1NUSU5HOgorCWNhc2UgU0NJX1JOQ19JTlZBTElEQVRJTkc6CisJY2FzZSBTQ0lfUk5DX1JFU1VNSU5HOgorCQlpZiAoc2NpX3JuYy0+ZGVzdGluYXRpb25fc3RhdGUgIT0gU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfUkVBRFkpCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKworCQlzY2lfcm5jLT51c2VyX2NhbGxiYWNrID0gY2JfZm47CisJCXNjaV9ybmMtPnVzZXJfY29va2llICAgPSBjYl9wOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUk5DX1RYX1NVU1BFTkRFRDogeworCQlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gcm5jX3RvX2RldihzY2lfcm5jKTsKKwkJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlkZXYtPmRvbWFpbl9kZXY7CisKKwkJc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc2V0dXBfdG9fcmVzdW1lKHNjaV9ybmMsIGNiX2ZuLCBjYl9wKTsKKworCQkvKiBUT0RPOiBjb25zaWRlciBhZGRpbmcgYSByZXN1bWUgYWN0aW9uIG9mIE5PTkUsIElOVkFMSURBVEUsIFdSSVRFX1RMQ1IgKi8KKwkJaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FTX0VORF9ERVYgfHwgZGV2X2lzX2V4cGFuZGVyKGRldikpCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19SRVNVTUlORyk7CisJCWVsc2UgaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYgfHwgKGRldi0+dHByb3RvICYgU0FTX1BST1RPQ09MX1NUUCkpIHsKKwkJCWlmIChpZGV2LT5pc19kaXJlY3RfYXR0YWNoZWQpIHsKKwkJCQkvKiBAdG9kbyBGaXggdGhpcyBzaW5jZSBJIGFtIGJlaW5nIHNpbGx5IGluIHdyaXRpbmcgdG8gdGhlIFNUUFRMREFSTkkgcmVnaXN0ZXIuICovCisJCQkJc2NpX2NoYW5nZV9zdGF0ZSgmc2NpX3JuYy0+c20sIFNDSV9STkNfUkVTVU1JTkcpOworCQkJfSBlbHNlIHsKKwkJCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19JTlZBTElEQVRJTkcpOworCQkJfQorCQl9IGVsc2UKKwkJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKwljYXNlIFNDSV9STkNfVFhfUlhfU1VTUEVOREVEOgorCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zZXR1cF90b19yZXN1bWUoc2NpX3JuYywgY2JfZm4sIGNiX3ApOworCQlzY2lfY2hhbmdlX3N0YXRlKCZzY2lfcm5jLT5zbSwgU0NJX1JOQ19SRVNVTUlORyk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCWNhc2UgU0NJX1JOQ19BV0FJVF9TVVNQRU5TSU9OOgorCQlzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zZXR1cF90b19yZXN1bWUoc2NpX3JuYywgY2JfZm4sIGNiX3ApOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oc2NpcmRldl90b19kZXYocm5jX3RvX2RldihzY2lfcm5jKSksCisJCQkgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF9pbyhzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkJICAgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2Npc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IHNjaV9ybmMtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUk5DX1JFQURZOgorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUk5DX1RYX1NVU1BFTkRFRDoKKwljYXNlIFNDSV9STkNfVFhfUlhfU1VTUEVOREVEOgorCWNhc2UgU0NJX1JOQ19BV0FJVF9TVVNQRU5TSU9OOgorCQlkZXZfd2FybihzY2lyZGV2X3RvX2RldihybmNfdG9fZGV2KHNjaV9ybmMpKSwKKwkJCSAiJXM6IGludmFsaWQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlkZXZfZGJnKHNjaXJkZXZfdG9fZGV2KHJuY190b19kZXYoc2NpX3JuYykpLAorCQkiJXM6IHJlcXVlc3RlZCB0byBzdGFydCBJTyB3aGlsZSBzdGlsbCByZXN1bWluZywgJWRcbiIsCisJCV9fZnVuY19fLCBzdGF0ZSk7CisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9zdGFydF90YXNrKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYywKKwkJCQkJCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2Npc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IHNjaV9ybmMtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1JOQ19SRVNVTUlORzoKKwljYXNlIFNDSV9STkNfUkVBRFk6CisJY2FzZSBTQ0lfUk5DX0FXQUlUX1NVU1BFTlNJT046CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwljYXNlIFNDSV9STkNfVFhfU1VTUEVOREVEOgorCWNhc2UgU0NJX1JOQ19UWF9SWF9TVVNQRU5ERUQ6CisJCXNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3Jlc3VtZShzY2lfcm5jLCBOVUxMLCBOVUxMKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHNjaXJkZXZfdG9fZGV2KHJuY190b19kZXYoc2NpX3JuYykpLAorCQkJICIlczogaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfY29udGV4dC5oIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTgwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfbm9kZV9jb250ZXh0LmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSF8KKyNkZWZpbmUgX1NDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSF8KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMsIGNvbnN0YW50cywgYW5kIHByb3RvdHlwZXMgYXNzb2NpYXRlZCB3aXRoCisgKiAgICB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBpbiB0aGUgc2lsaWNvbi4gIEl0IGV4aXN0cyB0byBtb2RlbCBhbmQgbWFuYWdlCisgKiAgICB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBpbiB0aGUgc2lsaWNvbi4KKyAqCisgKgorICovCisKKyNpbmNsdWRlICJpc2NpLmgiCisKKy8qKgorICoKKyAqCisgKiBUaGlzIGNvbnN0YW50IHJlcHJlc2VudHMgYW4gaW52YWxpZCByZW1vdGUgZGV2aWNlIGlkLCBpdCBpcyB1c2VkIHRvIHByb2dyYW0KKyAqIHRoZSBTVFBEQVJOSSByZWdpc3RlciBzbyB0aGUgZHJpdmVyIGtub3dzIHdoZW4gaXQgaGFzIHJlY2VpdmVkIGEgU0lHTkFUVVJFCisgKiBGSVMgZnJvbSB0aGUgU0NVLgorICovCisjZGVmaW5lIFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWCAgICAweDBGRkYKKworI2RlZmluZSBTQ1VfSEFSRFdBUkVfU1VTUEVOU0lPTiAgKDApCisjZGVmaW5lIFNDSV9TT0ZUV0FSRV9TVVNQRU5TSU9OICAoMSkKKworc3RydWN0IGlzY2lfcmVxdWVzdDsKK3N0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2U7CitzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQ7CisKK3R5cGVkZWYgdm9pZCAoKnNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrKSh2b2lkICopOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGVudW1lcmF0aW9uIG9mIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IHN0YXRlcy4KKyAqLworZW51bSBzY2lzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXRlcyB7CisJLyoqCisJICogVGhpcyBzdGF0ZSBpcyB0aGUgaW5pdGlhbCBzdGF0ZSBmb3IgYSByZW1vdGUgbm9kZSBjb250ZXh0LiAgT24gYSByZXN1bWUKKwkgKiByZXF1ZXN0IHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IHdpbGwgdHJhbnNpdGlvbiB0byB0aGUgcG9zdGluZyBzdGF0ZS4KKwkgKi8KKwlTQ0lfUk5DX0lOSVRJQUwsCisKKwkvKioKKwkgKiBUaGlzIGlzIGEgdHJhbnNpdGlvbiBzdGF0ZSB0aGF0IHBvc3RzIHRoZSBSTmkgdG8gdGhlIGhhcmR3YXJlLiBPbmNlIHRoZSBSTkMKKwkgKiBpcyBwb3N0ZWQgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgd2lsbCBiZSBtYWRlIHJlYWR5LgorCSAqLworCVNDSV9STkNfUE9TVElORywKKworCS8qKgorCSAqIFRoaXMgaXMgYSB0cmFuc2l0aW9uIHN0YXRlIHRoYXQgd2lsbCBwb3N0IGFuIFJOQyBpbnZhbGlkYXRlIHRvIHRoZQorCSAqIGhhcmR3YXJlLiAgT25jZSB0aGUgaW52YWxpZGF0ZSBpcyBjb21wbGV0ZSB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCB3aWxsCisJICogdHJhbnNpdGlvbiB0byB0aGUgcG9zdGluZyBzdGF0ZS4KKwkgKi8KKwlTQ0lfUk5DX0lOVkFMSURBVElORywKKworCS8qKgorCSAqIFRoaXMgaXMgYSB0cmFuc2l0aW9uIHN0YXRlIHRoYXQgd2lsbCBwb3N0IGFuIFJOQyByZXN1bWUgdG8gdGhlIGhhcmRhcmUuCisJICogT25jZSB0aGUgZXZlbnQgbm90aWZpY2F0aW9uIG9mIHJlc3VtZSBjb21wbGV0ZSBpcyByZWNlaXZlZCB0aGUgcmVtb3RlIG5vZGUKKwkgKiBjb250ZXh0IHdpbGwgdHJhbnNpdGlvbiB0byB0aGUgcmVhZHkgc3RhdGUuCisJICovCisJU0NJX1JOQ19SRVNVTUlORywKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHN0YXRlIHRoYXQgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgbXVzdCBiZSBpbiB0byBhY2NlcHQgaW8KKwkgKiByZXF1ZXN0IG9wZXJhdGlvbnMuCisJICovCisJU0NJX1JOQ19SRUFEWSwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHN0YXRlIHRoYXQgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgdHJhbnNpdGlvbnMgdG8gd2hlbiBpdCBnZXRzCisJICogYSBUWCBzdXNwZW5kIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlTQ0lfUk5DX1RYX1NVU1BFTkRFRCwKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIHN0YXRlIHRoYXQgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgdHJhbnNpdGlvbnMgdG8gd2hlbiBpdCBnZXRzCisJICogYSBUWCBSWCBzdXNwZW5kIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlTQ0lfUk5DX1RYX1JYX1NVU1BFTkRFRCwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaXMgYSB3YWl0IHN0YXRlIGZvciB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCB0aGF0IHdhaXRzIGZvciBhCisJICogc3VzcGVuZCBub3RpZmljYXRpb24gZnJvbSB0aGUgaGFyZHdhcmUuICBUaGlzIHN0YXRlIGlzIGVudGVyZWQgd2hlbiBlaXRoZXIKKwkgKiB0aGVyZSBpcyBhIHJlcXVlc3QgdG8gc3VwZW5kIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IG9yIHdoZW4gdGhlcmUgaXMgYSBUQworCSAqIGNvbXBsZXRpb24gd2hlcmUgdGhlIHJlbW90ZSBub2RlIHdpbGwgYmUgc3VzcGVuZGVkIGJ5IHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlTQ0lfUk5DX0FXQUlUX1NVU1BFTlNJT04KK307CisKKy8qKgorICoKKyAqCisgKiBUaGlzIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBlbmQgZGVzdGluYXRpb24gc3RhdGUgZm9yIHRoZSByZW1vdGUKKyAqIG5vZGUgY29udGV4dC4KKyAqLworZW51bSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9kZXN0aW5hdGlvbl9zdGF0ZSB7CisJU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfVU5TUEVDSUZJRUQsCisJU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfUkVBRFksCisJU0NJQ19TRFNfUkVNT1RFX05PREVfREVTVElOQVRJT05fU1RBVEVfRklOQUwKK307CisKKy8qKgorICogc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0IC0gVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGRhdGEKKyAqICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBvYmplY3QuICBUaGUgcmVtb3RlIG5vZGUgY29udGV4dAorICogICAgKFJOQykgb2JqZWN0IG1vZGVscyB0aGUgdGhlIHJlbW90ZSBkZXZpY2UgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIG1hbmFnZQorICogICAgdGhlIHNpbGljb24gUk5DLgorICovCitzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgeworCS8qKgorCSAqIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSByZW1vdGUgbm9kZSBpbmRleCAoUk5JKSBhc3NvY2lhdGVkIHdpdGgKKwkgKiB0aGlzIFJOQy4KKwkgKi8KKwl1MTYgcmVtb3RlX25vZGVfaW5kZXg7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSByZWNvcmVkIHN1c3BlbnNpb24gY29kZSBvciB0aGUgcmVhc29uIGZvciB0aGUgcmVtb3RlIG5vZGUKKwkgKiBjb250ZXh0IHN1c3BlbnNpb24uCisJICovCisJdTMyIHN1c3BlbnNpb25fY29kZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdHJ1ZSBpZiB0aGUgcmVtb3RlIG5vZGUgY29udGV4dCBpcyByZXN1bWluZyBmcm9tIGl0cyBjdXJyZW50CisJICogc3RhdGUuICBUaGlzIGNhbiBjYXVzZSBhbiBhdXRvbWF0aWMgcmVzdW1lIG9uIHJlY2VpdmluZyBhIHN1c3BlbnNpb24KKwkgKiBub3RpZmljYXRpb24uCisJICovCisJZW51bSBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9kZXN0aW5hdGlvbl9zdGF0ZSBkZXN0aW5hdGlvbl9zdGF0ZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgY29udGFpbnMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdGhlIHVzZXIgcmVxdWVzdGVkIHRvIGJlCisJICogY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3RlZCBzdGF0ZSB0cmFuc2l0aW9uIGlzIGNvbXBsZXRlLgorCSAqLworCXNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIHVzZXJfY2FsbGJhY2s7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciByZXF1ZXN0ZWQKKwkgKiBzdGF0ZSB0cmFuc2l0aW9uIGlzIGNvbXBsZXRlZC4KKwkgKi8KKwl2b2lkICp1c2VyX2Nvb2tpZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgY29udGFpbnMgdGhlIGRhdGEgZm9yIHRoZSBvYmplY3QncyBzdGF0ZSBtYWNoaW5lLgorCSAqLworCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lIHNtOworfTsKKwordm9pZCBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9jb25zdHJ1Y3Qoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpybmMsCisJCQkJCSAgICB1MTYgcmVtb3RlX25vZGVfaW5kZXgpOworCisKK2Jvb2wgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfaXNfcmVhZHkoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jKTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X2V2ZW50X2hhbmRsZXIoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJCSAgIHUzMiBldmVudF9jb2RlKTsKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9kZXN0cnVjdChzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkgICAgICBzY2ljc19zZHNfcmVtb3RlX25vZGVfY29udGV4dF9jYWxsYmFjayBjYWxsYmFjaywKKwkJCQkJCSAgICAgIHZvaWQgKmNhbGxiYWNrX3BhcmFtZXRlcik7CitlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfc3VzcGVuZChzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX2NvbnRleHQgKnNjaV9ybmMsCisJCQkJCQkgICAgIHUzMiBzdXNwZW5kX3R5cGUsCisJCQkJCQkgICAgIHNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIGNiX2ZuLAorCQkJCQkJICAgICB2b2lkICpjYl9wKTsKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZXN1bWUoc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJICAgIHNjaWNzX3Nkc19yZW1vdGVfbm9kZV9jb250ZXh0X2NhbGxiYWNrIGNiX2ZuLAorCQkJCQkJICAgIHZvaWQgKmNiX3ApOworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXJ0X3Rhc2soc3RydWN0IHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0ICpzY2lfcm5jLAorCQkJCQkJCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfbm9kZV9jb250ZXh0X3N0YXJ0X2lvKHN0cnVjdCBzY2lfcmVtb3RlX25vZGVfY29udGV4dCAqc2NpX3JuYywKKwkJCQkJCSAgICAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworCisjZW5kaWYgIC8qIF9TQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfbm9kZV90YWJsZS5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFiMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfdGFibGUuYwpAQCAtMCwwICsxLDU5OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRQorICogICAgcHVibGljLCBwcm90ZWN0ZWQsIGFuZCBwcml2YXRlIG1ldGhvZHMuCisgKgorICoKKyAqLworI2luY2x1ZGUgInJlbW90ZV9ub2RlX3RhYmxlLmgiCisjaW5jbHVkZSAicmVtb3RlX25vZGVfY29udGV4dC5oIgorCisvKioKKyAqCisgKiBAcmVtb3RlX25vZGVfdGFibGU6IFRoaXMgaXMgdGhlIHJlbW90ZSBub2RlIGluZGV4IHRhYmxlIGZyb20gd2hpY2ggdGhlCisgKiAgICBzZWxlY3Rpb24gd2lsbCBiZSBtYWRlLgorICogQGdyb3VwX3RhYmxlX2luZGV4OiBUaGlzIGlzIHRoZSBpbmRleCB0byB0aGUgZ3JvdXAgdGFibGUgZnJvbSB3aGljaCB0bworICogICAgc2VhcmNoIGZvciBhbiBhdmFpbGFibGUgc2VsZWN0aW9uLgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGZpbmQgdGhlIGJpdCBwb3NpdGlvbiBpbiBhYnNvbHV0ZSBiaXQgdGVybXMgb2YgdGhlIG5leHQgMzIKKyAqICsgYml0IHBvc2l0aW9uLiAgSWYgdGhlcmUgYXJlIGF2YWlsYWJsZSBiaXRzIGluIHRoZSBmaXJzdCB1MzIgdGhlbiBpdCBpcworICoganVzdCBiaXQgcG9zaXRpb24uIHUzMiBUaGlzIGlzIHRoZSBhYnNvbHV0ZSBiaXQgcG9zaXRpb24gZm9yIGFuIGF2YWlsYWJsZQorICogZ3JvdXAuCisgKi8KK3N0YXRpYyB1MzIgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2dldF9ncm91cF9pbmRleCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgZ3JvdXBfdGFibGVfaW5kZXgpCit7CisJdTMyIGR3b3JkX2luZGV4OworCXUzMiAqZ3JvdXBfdGFibGU7CisJdTMyIGJpdF9pbmRleDsKKworCWdyb3VwX3RhYmxlID0gcmVtb3RlX25vZGVfdGFibGUtPnJlbW90ZV9ub2RlX2dyb3Vwc1tncm91cF90YWJsZV9pbmRleF07CisKKwlmb3IgKGR3b3JkX2luZGV4ID0gMDsgZHdvcmRfaW5kZXggPCByZW1vdGVfbm9kZV90YWJsZS0+Z3JvdXBfYXJyYXlfc2l6ZTsgZHdvcmRfaW5kZXgrKykgeworCQlpZiAoZ3JvdXBfdGFibGVbZHdvcmRfaW5kZXhdICE9IDApIHsKKwkJCWZvciAoYml0X2luZGV4ID0gMDsgYml0X2luZGV4IDwgMzI7IGJpdF9pbmRleCsrKSB7CisJCQkJaWYgKChncm91cF90YWJsZVtkd29yZF9pbmRleF0gJiAoMSA8PCBiaXRfaW5kZXgpKSAhPSAwKSB7CisJCQkJCXJldHVybiAoZHdvcmRfaW5kZXggKiAzMikgKyBiaXRfaW5kZXg7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIFNDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0lOVkFMSURfSU5ERVg7Cit9CisKKy8qKgorICoKKyAqIEBvdXRdOiByZW1vdGVfbm9kZV90YWJsZSBUaGlzIHRoZSByZW1vdGUgbm9kZSB0YWJsZSBpbiB3aGljaCB0byBjbGVhciB0aGUKKyAqICAgIHNlbGVjdG9yLgorICogQHNldF9pbmRleDogVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgc2VsZWN0b3IgaW4gd2hpY2ggdGhlIGNoYW5nZSB3aWxsIGJlCisgKiAgICBtYWRlLgorICogQGdyb3VwX2luZGV4OiBUaGlzIGlzIHRoZSBiaXQgaW5kZXggaW4gdGhlIHRhYmxlIHRvIGJlIG1vZGlmaWVkLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgY2xlYXIgdGhlIGdyb3VwIGluZGV4IGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgZ3JvdXAgaW5kZXgKKyAqIHRhYmxlLiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9jbGVhcl9ncm91cF9pbmRleCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgZ3JvdXBfdGFibGVfaW5kZXgsCisJdTMyIGdyb3VwX2luZGV4KQoreworCXUzMiBkd29yZF9pbmRleDsKKwl1MzIgYml0X2luZGV4OworCXUzMiAqZ3JvdXBfdGFibGU7CisKKwlCVUdfT04oZ3JvdXBfdGFibGVfaW5kZXggPj0gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCk7CisJQlVHX09OKGdyb3VwX2luZGV4ID49ICh1MzIpKHJlbW90ZV9ub2RlX3RhYmxlLT5ncm91cF9hcnJheV9zaXplICogMzIpKTsKKworCWR3b3JkX2luZGV4ID0gZ3JvdXBfaW5kZXggLyAzMjsKKwliaXRfaW5kZXggICA9IGdyb3VwX2luZGV4ICUgMzI7CisJZ3JvdXBfdGFibGUgPSByZW1vdGVfbm9kZV90YWJsZS0+cmVtb3RlX25vZGVfZ3JvdXBzW2dyb3VwX3RhYmxlX2luZGV4XTsKKworCWdyb3VwX3RhYmxlW2R3b3JkX2luZGV4XSA9IGdyb3VwX3RhYmxlW2R3b3JkX2luZGV4XSAmIH4oMSA8PCBiaXRfaW5kZXgpOworfQorCisvKioKKyAqCisgKiBAb3V0XTogcmVtb3RlX25vZGVfdGFibGUgVGhpcyB0aGUgcmVtb3RlIG5vZGUgdGFibGUgaW4gd2hpY2ggdG8gc2V0IHRoZQorICogICAgc2VsZWN0b3IuCisgKiBAZ3JvdXBfdGFibGVfaW5kZXg6IFRoaXMgaXMgdGhlIHJlbW90ZSBub2RlIHNlbGVjdG9yIGluIHdoaWNoIHRoZSBjaGFuZ2UKKyAqICAgIHdpbGwgYmUgbWFkZS4KKyAqIEBncm91cF9pbmRleDogVGhpcyBpcyB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSB0YWJsZSB0byBiZSBtb2RpZmllZC4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgZ3JvdXAgaW5kZXggYml0IGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgZ3JvcHUgaW5kZXgKKyAqIHRhYmxlLiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfZ3JvdXBfaW5kZXgoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIGdyb3VwX3RhYmxlX2luZGV4LAorCXUzMiBncm91cF9pbmRleCkKK3sKKwl1MzIgZHdvcmRfaW5kZXg7CisJdTMyIGJpdF9pbmRleDsKKwl1MzIgKmdyb3VwX3RhYmxlOworCisJQlVHX09OKGdyb3VwX3RhYmxlX2luZGV4ID49IFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpOworCUJVR19PTihncm91cF9pbmRleCA+PSAodTMyKShyZW1vdGVfbm9kZV90YWJsZS0+Z3JvdXBfYXJyYXlfc2l6ZSAqIDMyKSk7CisKKwlkd29yZF9pbmRleCA9IGdyb3VwX2luZGV4IC8gMzI7CisJYml0X2luZGV4ICAgPSBncm91cF9pbmRleCAlIDMyOworCWdyb3VwX3RhYmxlID0gcmVtb3RlX25vZGVfdGFibGUtPnJlbW90ZV9ub2RlX2dyb3Vwc1tncm91cF90YWJsZV9pbmRleF07CisKKwlncm91cF90YWJsZVtkd29yZF9pbmRleF0gPSBncm91cF90YWJsZVtkd29yZF9pbmRleF0gfCAoMSA8PCBiaXRfaW5kZXgpOworfQorCisvKioKKyAqCisgKiBAb3V0XTogcmVtb3RlX25vZGVfdGFibGUgVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgdGFibGUgaW4gd2hpY2ggdG8gbW9kaWZ5CisgKiAgICB0aGUgcmVtb3RlIG5vZGUgYXZhaWxhYmlsaXR5LgorICogQHJlbW90ZV9ub2RlX2luZGV4OiBUaGlzIGlzIHRoZSByZW1vdGUgbm9kZSBpbmRleCB0aGF0IGlzIGJlaW5nIHJldHVybmVkIHRvCisgKiAgICB0aGUgdGFibGUuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIHJlbW90ZSB0byBhdmFpbGFibGUgaW4gdGhlIHJlbW90ZSBub2RlIGFsbG9jYXRpb24KKyAqIHRhYmxlLiBub25lCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfbm9kZV9pbmRleCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgcmVtb3RlX25vZGVfaW5kZXgpCit7CisJdTMyIGR3b3JkX2xvY2F0aW9uOworCXUzMiBkd29yZF9yZW1haW5kZXI7CisJdTMyIHNsb3Rfbm9ybWFsaXplZDsKKwl1MzIgc2xvdF9wb3NpdGlvbjsKKworCUJVR19PTigKKwkJKHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfbm9kZXNfYXJyYXlfc2l6ZSAqIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEKQorCQk8PSAocmVtb3RlX25vZGVfaW5kZXggLyBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKQorCQkpOworCisJZHdvcmRfbG9jYXRpb24gID0gcmVtb3RlX25vZGVfaW5kZXggLyBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfUEVSX0RXT1JEOworCWR3b3JkX3JlbWFpbmRlciA9IHJlbW90ZV9ub2RlX2luZGV4ICUgU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9EV09SRDsKKwlzbG90X25vcm1hbGl6ZWQgPSAoZHdvcmRfcmVtYWluZGVyIC8gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkgKiBzaXplb2YodTMyKTsKKwlzbG90X3Bvc2l0aW9uICAgPSByZW1vdGVfbm9kZV9pbmRleCAlIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQ7CisKKwlyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX3JlbW90ZV9ub2Rlc1tkd29yZF9sb2NhdGlvbl0gfD0KKwkJMSA8PCAoc2xvdF9ub3JtYWxpemVkICsgc2xvdF9wb3NpdGlvbik7Cit9CisKKy8qKgorICoKKyAqIEBvdXRdOiByZW1vdGVfbm9kZV90YWJsZSBUaGlzIGlzIHRoZSByZW1vdGUgbm9kZSB0YWJsZSBmcm9tIHdoaWNoIHRvIGNsZWFyCisgKiAgICB0aGUgYXZhaWxhYmxlIHJlbW90ZSBub2RlIGJpdC4KKyAqIEByZW1vdGVfbm9kZV9pbmRleDogVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgaW5kZXggd2hpY2ggaXMgdG8gYmUgY2xlYXJlZAorICogICAgZnJvbSB0aGUgdGFibGUuCisgKgorICogVGhpcyBtZXRob2QgY2xlYXJzIHRoZSByZW1vdGUgbm9kZSBpbmRleCBmcm9tIHRoZSB0YWJsZSBvZiBhdmFpbGFibGUgcmVtb3RlCisgKiBub2Rlcy4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfY2xlYXJfbm9kZV9pbmRleCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgcmVtb3RlX25vZGVfaW5kZXgpCit7CisJdTMyIGR3b3JkX2xvY2F0aW9uOworCXUzMiBkd29yZF9yZW1haW5kZXI7CisJdTMyIHNsb3RfcG9zaXRpb247CisJdTMyIHNsb3Rfbm9ybWFsaXplZDsKKworCUJVR19PTigKKwkJKHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfbm9kZXNfYXJyYXlfc2l6ZSAqIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEKQorCQk8PSAocmVtb3RlX25vZGVfaW5kZXggLyBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKQorCQkpOworCisJZHdvcmRfbG9jYXRpb24gID0gcmVtb3RlX25vZGVfaW5kZXggLyBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfUEVSX0RXT1JEOworCWR3b3JkX3JlbWFpbmRlciA9IHJlbW90ZV9ub2RlX2luZGV4ICUgU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9EV09SRDsKKwlzbG90X25vcm1hbGl6ZWQgPSAoZHdvcmRfcmVtYWluZGVyIC8gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkgKiBzaXplb2YodTMyKTsKKwlzbG90X3Bvc2l0aW9uICAgPSByZW1vdGVfbm9kZV9pbmRleCAlIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQ7CisKKwlyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX3JlbW90ZV9ub2Rlc1tkd29yZF9sb2NhdGlvbl0gJj0KKwkJfigxIDw8IChzbG90X25vcm1hbGl6ZWQgKyBzbG90X3Bvc2l0aW9uKSk7Cit9CisKKy8qKgorICoKKyAqIEBvdXRdOiByZW1vdGVfbm9kZV90YWJsZSBUaGUgcmVtb3RlIG5vZGUgdGFibGUgZnJvbSB3aGljaCB0aGUgc2xvdCB3aWxsIGJlCisgKiAgICBjbGVhcmVkLgorICogQGdyb3VwX2luZGV4OiBUaGUgaW5kZXggZm9yIHRoZSBzbG90IHRoYXQgaXMgdG8gYmUgY2xlYXJlZC4KKyAqCisgKiBUaGlzIG1ldGhvZCBjbGVhcnMgdGhlIGVudGlyZSB0YWJsZSBzbG90IGF0IHRoZSBzcGVjaWZpZWQgc2xvdCBpbmRleC4gbm9uZQorICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfY2xlYXJfZ3JvdXAoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIGdyb3VwX2luZGV4KQoreworCXUzMiBkd29yZF9sb2NhdGlvbjsKKwl1MzIgZHdvcmRfcmVtYWluZGVyOworCXUzMiBkd29yZF92YWx1ZTsKKworCUJVR19PTigKKwkJKHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfbm9kZXNfYXJyYXlfc2l6ZSAqIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEKQorCQk8PSAoZ3JvdXBfaW5kZXggLyBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKQorCQkpOworCisJZHdvcmRfbG9jYXRpb24gID0gZ3JvdXBfaW5kZXggLyBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9EV09SRDsKKwlkd29yZF9yZW1haW5kZXIgPSBncm91cF9pbmRleCAlIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEOworCisJZHdvcmRfdmFsdWUgPSByZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX3JlbW90ZV9ub2Rlc1tkd29yZF9sb2NhdGlvbl07CisJZHdvcmRfdmFsdWUgJj0gfihTQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9GVUxMX1NMT1RfVkFMVUUgPDwgKGR3b3JkX3JlbWFpbmRlciAqIDQpKTsKKwlyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX3JlbW90ZV9ub2Rlc1tkd29yZF9sb2NhdGlvbl0gPSBkd29yZF92YWx1ZTsKK30KKworLyoqCisgKgorICogQHJlbW90ZV9ub2RlX3RhYmxlOgorICoKKyAqIFRIaXMgbWV0aG9kIHNldHMgYW4gZW50aXJlIHJlbW90ZSBub2RlIGdyb3VwIGluIHRoZSByZW1vdGUgbm9kZSB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgZ3JvdXBfaW5kZXgpCit7CisJdTMyIGR3b3JkX2xvY2F0aW9uOworCXUzMiBkd29yZF9yZW1haW5kZXI7CisJdTMyIGR3b3JkX3ZhbHVlOworCisJQlVHX09OKAorCQkocmVtb3RlX25vZGVfdGFibGUtPmF2YWlsYWJsZV9ub2Rlc19hcnJheV9zaXplICogU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfRFdPUkQpCisJCTw9IChncm91cF9pbmRleCAvIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpCisJCSk7CisKKwlkd29yZF9sb2NhdGlvbiAgPSBncm91cF9pbmRleCAvIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEOworCWR3b3JkX3JlbWFpbmRlciA9IGdyb3VwX2luZGV4ICUgU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfRFdPUkQ7CisKKwlkd29yZF92YWx1ZSA9IHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfcmVtb3RlX25vZGVzW2R3b3JkX2xvY2F0aW9uXTsKKwlkd29yZF92YWx1ZSB8PSAoU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfRlVMTF9TTE9UX1ZBTFVFIDw8IChkd29yZF9yZW1haW5kZXIgKiA0KSk7CisJcmVtb3RlX25vZGVfdGFibGUtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXNbZHdvcmRfbG9jYXRpb25dID0gZHdvcmRfdmFsdWU7Cit9CisKKy8qKgorICoKKyAqIEByZW1vdGVfbm9kZV90YWJsZTogVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgdGFibGUgdGhhdCBmb3Igd2hpY2ggdGhlIGdyb3VwCisgKiAgICB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZC4KKyAqIEBncm91cF9pbmRleDogVGhpcyBpcyB0aGUgZ3JvdXAgaW5kZXggdG8gdXNlIHRvIGZpbmQgdGhlIGdyb3VwIHZhbHVlLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBncm91cCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBncm91cCBpbmRleC4gVGhlCisgKiBiaXQgdmFsdWVzIGF0IHRoZSBzcGVjaWZpZWQgcmVtb3RlIG5vZGUgZ3JvdXAgaW5kZXguCisgKi8KK3N0YXRpYyB1OCBzY2lfcmVtb3RlX25vZGVfdGFibGVfZ2V0X2dyb3VwX3ZhbHVlKAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfdGFibGUgKnJlbW90ZV9ub2RlX3RhYmxlLAorCXUzMiBncm91cF9pbmRleCkKK3sKKwl1MzIgZHdvcmRfbG9jYXRpb247CisJdTMyIGR3b3JkX3JlbWFpbmRlcjsKKwl1MzIgZHdvcmRfdmFsdWU7CisKKwlkd29yZF9sb2NhdGlvbiAgPSBncm91cF9pbmRleCAvIFNDSUNfU0RTX1JFTU9URV9OT0RFX1NFVFNfUEVSX0RXT1JEOworCWR3b3JkX3JlbWFpbmRlciA9IGdyb3VwX2luZGV4ICUgU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfRFdPUkQ7CisKKwlkd29yZF92YWx1ZSA9IHJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfcmVtb3RlX25vZGVzW2R3b3JkX2xvY2F0aW9uXTsKKwlkd29yZF92YWx1ZSAmPSAoU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfRlVMTF9TTE9UX1ZBTFVFIDw8IChkd29yZF9yZW1haW5kZXIgKiA0KSk7CisJZHdvcmRfdmFsdWUgPSBkd29yZF92YWx1ZSA+PiAoZHdvcmRfcmVtYWluZGVyICogNCk7CisKKwlyZXR1cm4gKHU4KWR3b3JkX3ZhbHVlOworfQorCisvKioKKyAqCisgKiBAb3V0XTogcmVtb3RlX25vZGVfdGFibGUgVGhlIHJlbW90ZSB0aGF0IHdoaWNoIGlzIHRvIGJlIGluaXRpYWxpemVkLgorICogQHJlbW90ZV9ub2RlX2VudHJpZXM6IFRoZSBudW1iZXIgb2YgZW50cmllcyB0byBwdXQgaW4gdGhlIHRhYmxlLgorICoKKyAqIFRoaXMgbWV0aG9kIHdpbGwgaW5pdGlhbGl6ZSB0aGUgcmVtb3RlIG5vZGUgdGFibGUgZm9yIHVzZS4gbm9uZQorICovCit2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9pbml0aWFsaXplKAorCXN0cnVjdCBzY2lfcmVtb3RlX25vZGVfdGFibGUgKnJlbW90ZV9ub2RlX3RhYmxlLAorCXUzMiByZW1vdGVfbm9kZV9lbnRyaWVzKQoreworCXUzMiBpbmRleDsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcmF3IGRhdGEgd2UgY291bGQgaW1wcm92ZSB0aGUgc3BlZWQgYnkgb25seSBpbml0aWFsaXppbmcKKwkgKiB0aG9zZSBlbnRyaWVzIHRoYXQgd2UgYXJlIGFjdHVhbGx5IGdvaW5nIHRvIGJlIHVzZWQgKi8KKwltZW1zZXQoCisJCXJlbW90ZV9ub2RlX3RhYmxlLT5hdmFpbGFibGVfcmVtb3RlX25vZGVzLAorCQkweDAwLAorCQlzaXplb2YocmVtb3RlX25vZGVfdGFibGUtPmF2YWlsYWJsZV9yZW1vdGVfbm9kZXMpCisJCSk7CisKKwltZW1zZXQoCisJCXJlbW90ZV9ub2RlX3RhYmxlLT5yZW1vdGVfbm9kZV9ncm91cHMsCisJCTB4MDAsCisJCXNpemVvZihyZW1vdGVfbm9kZV90YWJsZS0+cmVtb3RlX25vZGVfZ3JvdXBzKQorCQkpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgYXZhaWxhYmxlIHJlbW90ZSBub2RlIHNldHMgKi8KKwlyZW1vdGVfbm9kZV90YWJsZS0+YXZhaWxhYmxlX25vZGVzX2FycmF5X3NpemUgPSAodTE2KQorCQkJCQkJCShyZW1vdGVfbm9kZV9lbnRyaWVzIC8gU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9EV09SRCkKKwkJCQkJCQkrICgocmVtb3RlX25vZGVfZW50cmllcyAlIFNDSUNfU0RTX1JFTU9URV9OT0RFU19QRVJfRFdPUkQpICE9IDApOworCisKKwkvKiBJbml0aWFsaXplIGVhY2ggZnVsbCBEV09SRCB0byBhIEZVTEwgU0VUIG9mIHJlbW90ZSBub2RlcyAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHJlbW90ZV9ub2RlX2VudHJpZXM7IGluZGV4KyspIHsKKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ub2RlX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCBpbmRleCk7CisJfQorCisJcmVtb3RlX25vZGVfdGFibGUtPmdyb3VwX2FycmF5X3NpemUgPSAodTE2KQorCQkJCQkgICAgICAocmVtb3RlX25vZGVfZW50cmllcyAvIChTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UICogMzIpKQorCQkJCQkgICAgICArICgocmVtb3RlX25vZGVfZW50cmllcyAlIChTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UICogMzIpKSAhPSAwKTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IChyZW1vdGVfbm9kZV9lbnRyaWVzIC8gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCk7IGluZGV4KyspIHsKKwkJLyoKKwkJICogVGhlc2UgYXJlIGFsbCBndWFyYW50ZWVkIHRvIGJlIGZ1bGwgc2xvdCB2YWx1ZXMgc28gZmlsbCB0aGVtIGluIHRoZQorCQkgKiBhdmFpbGFibGUgc2V0cyBvZiAzIHJlbW90ZSBub2RlcyAqLworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCAyLCBpbmRleCk7CisJfQorCisJLyogTm93IGZpbGwgaW4gYW55IHJlbWFpbmRlcnMgdGhhdCB3ZSBtYXkgZmluZCAqLworCWlmICgocmVtb3RlX25vZGVfZW50cmllcyAlIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpID09IDIpIHsKKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cF9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgMSwgaW5kZXgpOworCX0gZWxzZSBpZiAoKHJlbW90ZV9ub2RlX2VudHJpZXMgJSBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKSA9PSAxKSB7CisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9zZXRfZ3JvdXBfaW5kZXgocmVtb3RlX25vZGVfdGFibGUsIDAsIGluZGV4KTsKKwl9Cit9CisKKy8qKgorICoKKyAqIEBvdXRdOiByZW1vdGVfbm9kZV90YWJsZSBUaGUgcmVtb3RlIG5vZGUgdGFibGUgZnJvbSB3aGljaCB0byBhbGxvY2F0ZSBhCisgKiAgICByZW1vdGUgbm9kZS4KKyAqIEB0YWJsZV9pbmRleDogVGhlIGdyb3VwIGluZGV4IHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHNlYXJjaC4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIGFsbG9jYXRlIGEgc2luZ2xlIFJOaSBmcm9tIHRoZSByZW1vdGUgbm9kZSB0YWJsZS4gIFRoZQorICogdGFibGUgaW5kZXggd2lsbCBkZXRlcm1pbmUgZnJvbSB3aGljaCByZW1vdGUgbm9kZSBncm91cCB0YWJsZSB0byBzZWFyY2guCisgKiBUaGlzIHNlYXJjaCBtYXkgZmFpbCBhbmQgYW5vdGhlciBncm91cCBub2RlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuICBUaGUKKyAqIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGFsbG93IGEgc2VyYWNoIG9mIHRoZSBhdmFpbGFibGUgc2luZ2xlIHJlbW90ZSBub2RlCisgKiBncm91cCB1cCB0byB0aGUgdHJpcGxlIHJlbW90ZSBub2RlIGdyb3VwLiAgSWYgYW4gZW50cnkgaXMgZm91bmQgaW4gdGhlCisgKiBzcGVjaWZpZWQgdGFibGUgdGhlIHJlbW90ZSBub2RlIGlzIHJlbW92ZWQgYW5kIHRoZSByZW1vdGUgbm9kZSBncm91cHMgYXJlCisgKiB1cGRhdGVkLiBUaGUgUk5pIHZhbHVlIG9yIGFuIGludmFsaWQgcmVtb3RlIG5vZGUgY29udGV4dCBpZiBhbiBSTmkgY2FuIG5vdAorICogYmUgZm91bmQuCisgKi8KK3N0YXRpYyB1MTYgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2FsbG9jYXRlX3NpbmdsZV9yZW1vdGVfbm9kZSgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgZ3JvdXBfdGFibGVfaW5kZXgpCit7CisJdTggaW5kZXg7CisJdTggZ3JvdXBfdmFsdWU7CisJdTMyIGdyb3VwX2luZGV4OworCXUxNiByZW1vdGVfbm9kZV9pbmRleCA9IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWDsKKworCWdyb3VwX2luZGV4ID0gc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2dldF9ncm91cF9pbmRleCgKKwkJcmVtb3RlX25vZGVfdGFibGUsIGdyb3VwX3RhYmxlX2luZGV4KTsKKworCS8qIFdlIGNvdWxkIG5vdCBmaW5kIGFuIGF2YWlsYWJsZSBzbG90IGluIHRoZSB0YWJsZSBzZWxlY3RvciAwICovCisJaWYgKGdyb3VwX2luZGV4ICE9IFNDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0lOVkFMSURfSU5ERVgpIHsKKwkJZ3JvdXBfdmFsdWUgPSBzY2lfcmVtb3RlX25vZGVfdGFibGVfZ2V0X2dyb3VwX3ZhbHVlKAorCQkJcmVtb3RlX25vZGVfdGFibGUsIGdyb3VwX2luZGV4KTsKKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UOyBpbmRleCsrKSB7CisJCQlpZiAoKCgxIDw8IGluZGV4KSAmIGdyb3VwX3ZhbHVlKSAhPSAwKSB7CisJCQkJLyogV2UgaGF2ZSBzZWxlY3RlZCBhIGJpdCBub3cgY2xlYXIgaXQgKi8KKwkJCQlyZW1vdGVfbm9kZV9pbmRleCA9ICh1MTYpKGdyb3VwX2luZGV4ICogU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVAorCQkJCQkJCSAgKyBpbmRleCk7CisKKwkJCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfY2xlYXJfZ3JvdXBfaW5kZXgoCisJCQkJCXJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF90YWJsZV9pbmRleCwgZ3JvdXBfaW5kZXgKKwkJCQkJKTsKKworCQkJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9jbGVhcl9ub2RlX2luZGV4KAorCQkJCQlyZW1vdGVfbm9kZV90YWJsZSwgcmVtb3RlX25vZGVfaW5kZXgKKwkJCQkJKTsKKworCQkJCWlmIChncm91cF90YWJsZV9pbmRleCA+IDApIHsKKwkJCQkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cF9pbmRleCgKKwkJCQkJCXJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF90YWJsZV9pbmRleCAtIDEsIGdyb3VwX2luZGV4CisJCQkJCQkpOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJlbW90ZV9ub2RlX2luZGV4OworfQorCisvKioKKyAqCisgKiBAcmVtb3RlX25vZGVfdGFibGU6IFRoaXMgaXMgdGhlIHJlbW90ZSBub2RlIHRhYmxlIGZyb20gd2hpY2ggdG8gYWxsb2NhdGUgdGhlCisgKiAgICByZW1vdGUgbm9kZSBlbnRyaWVzLgorICogQGdyb3VwX3RhYmxlX2luZGV4OiBUSGlzIGlzIHRoZSBncm91cCB0YWJsZSBpbmRleCB3aGljaCBtdXN0IGVxdWFsIHR3byAoMikKKyAqICAgIGZvciB0aGlzIG9wZXJhdGlvbi4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIGFsbG9jYXRlIHRocmVlIGNvbnNlY3V0aXZlIHJlbW90ZSBub2RlIGNvbnRleHQgZW50cmllcy4gSWYKKyAqIHRoZXJlIGFyZSBubyByZW1haW5pbmcgdHJpcGxlIGVudHJpZXMgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgZmFpbHVyZS4KKyAqIFRoZSByZW1vdGUgbm9kZSBpbmRleCB0aGF0IHJlcHJlc2VudHMgdGhyZWUgY29uc2VjdXRpdmUgcmVtb3RlIG5vZGUgZW50cmllcworICogb3IgYW4gaW52YWxpZCByZW1vdGUgbm9kZSBjb250ZXh0IGlmIG5vbmUgY2FuIGJlIGZvdW5kLgorICovCitzdGF0aWMgdTE2IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9hbGxvY2F0ZV90cmlwbGVfcmVtb3RlX25vZGUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIGdyb3VwX3RhYmxlX2luZGV4KQoreworCXUzMiBncm91cF9pbmRleDsKKwl1MTYgcmVtb3RlX25vZGVfaW5kZXggPSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVg7CisKKwlncm91cF9pbmRleCA9IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9nZXRfZ3JvdXBfaW5kZXgoCisJCXJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF90YWJsZV9pbmRleCk7CisKKwlpZiAoZ3JvdXBfaW5kZXggIT0gU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfSU5WQUxJRF9JTkRFWCkgeworCQlyZW1vdGVfbm9kZV9pbmRleCA9ICh1MTYpZ3JvdXBfaW5kZXggKiBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UOworCisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9jbGVhcl9ncm91cF9pbmRleCgKKwkJCXJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF90YWJsZV9pbmRleCwgZ3JvdXBfaW5kZXgKKwkJCSk7CisKKwkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2NsZWFyX2dyb3VwKAorCQkJcmVtb3RlX25vZGVfdGFibGUsIGdyb3VwX2luZGV4CisJCQkpOworCX0KKworCXJldHVybiByZW1vdGVfbm9kZV9pbmRleDsKK30KKworLyoqCisgKgorICogQHJlbW90ZV9ub2RlX3RhYmxlOiBUaGlzIGlzIHRoZSByZW1vdGUgbm9kZSB0YWJsZSBmcm9tIHdoaWNoIHRoZSByZW1vdGUgbm9kZQorICogICAgYWxsb2NhdGlvbiBpcyB0byB0YWtlIHBsYWNlLgorICogQHJlbW90ZV9ub2RlX2NvdW50OiBUaGlzIGlzIHRoZXIgcmVtb3RlIG5vZGUgY291bnQgd2hpY2ggaXMgb25lIG9mCisgKiAgICBTQ1VfU1NQX1JFTU9URV9OT0RFX0NPVU5UKDEpIG9yIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQoMykuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBhbGxvY2F0ZSBhIHJlbW90ZSBub2RlIHRoYXQgbWF0YWNoZXMgdGhlIHJlbW90ZSBub2RlIGNvdW50CisgKiBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlci4gIFZhbGlkIHZhbHVlcyBmb3IgcmVtb3RlIG5vZGUgY291bnQgaXMKKyAqIFNDVV9TU1BfUkVNT1RFX05PREVfQ09VTlQoMSkgb3IgU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCgzKS4gdTE2IFRoaXMgaXMKKyAqIHRoZSByZW1vdGUgbm9kZSBpbmRleCB0aGF0IGlzIHJldHVybmVkIG9yIGFuIGludmFsaWQgcmVtb3RlIG5vZGUgY29udGV4dC4KKyAqLwordTE2IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9hbGxvY2F0ZV9yZW1vdGVfbm9kZSgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgcmVtb3RlX25vZGVfY291bnQpCit7CisJdTE2IHJlbW90ZV9ub2RlX2luZGV4ID0gU0NJQ19TRFNfUkVNT1RFX05PREVfQ09OVEVYVF9JTlZBTElEX0lOREVYOworCisJaWYgKHJlbW90ZV9ub2RlX2NvdW50ID09IFNDVV9TU1BfUkVNT1RFX05PREVfQ09VTlQpIHsKKwkJcmVtb3RlX25vZGVfaW5kZXggPQorCQkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2FsbG9jYXRlX3NpbmdsZV9yZW1vdGVfbm9kZSgKKwkJCQlyZW1vdGVfbm9kZV90YWJsZSwgMCk7CisKKwkJaWYgKHJlbW90ZV9ub2RlX2luZGV4ID09IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWCkgeworCQkJcmVtb3RlX25vZGVfaW5kZXggPQorCQkJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9hbGxvY2F0ZV9zaW5nbGVfcmVtb3RlX25vZGUoCisJCQkJCXJlbW90ZV9ub2RlX3RhYmxlLCAxKTsKKwkJfQorCisJCWlmIChyZW1vdGVfbm9kZV9pbmRleCA9PSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9DT05URVhUX0lOVkFMSURfSU5ERVgpIHsKKwkJCXJlbW90ZV9ub2RlX2luZGV4ID0KKwkJCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfYWxsb2NhdGVfc2luZ2xlX3JlbW90ZV9ub2RlKAorCQkJCQlyZW1vdGVfbm9kZV90YWJsZSwgMik7CisJCX0KKwl9IGVsc2UgaWYgKHJlbW90ZV9ub2RlX2NvdW50ID09IFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQpIHsKKwkJcmVtb3RlX25vZGVfaW5kZXggPQorCQkJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX2FsbG9jYXRlX3RyaXBsZV9yZW1vdGVfbm9kZSgKKwkJCQlyZW1vdGVfbm9kZV90YWJsZSwgMik7CisJfQorCisJcmV0dXJuIHJlbW90ZV9ub2RlX2luZGV4OworfQorCisvKioKKyAqCisgKiBAcmVtb3RlX25vZGVfdGFibGU6CisgKgorICogVGhpcyBtZXRob2Qgd2lsbCBmcmVlIGEgc2luZ2xlIHJlbW90ZSBub2RlIGluZGV4IGJhY2sgdG8gdGhlIHJlbW90ZSBub2RlCisgKiB0YWJsZS4gIFRoaXMgcm91dGluZSB3aWxsIHVwZGF0ZSB0aGUgcmVtb3RlIG5vZGUgZ3JvdXBzCisgKi8KK3N0YXRpYyB2b2lkIHNjaV9yZW1vdGVfbm9kZV90YWJsZV9yZWxlYXNlX3NpbmdsZV9yZW1vdGVfbm9kZSgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MTYgcmVtb3RlX25vZGVfaW5kZXgpCit7CisJdTMyIGdyb3VwX2luZGV4OworCXU4IGdyb3VwX3ZhbHVlOworCisJZ3JvdXBfaW5kZXggPSByZW1vdGVfbm9kZV9pbmRleCAvIFNDVV9TVFBfUkVNT1RFX05PREVfQ09VTlQ7CisKKwlncm91cF92YWx1ZSA9IHNjaV9yZW1vdGVfbm9kZV90YWJsZV9nZXRfZ3JvdXBfdmFsdWUocmVtb3RlX25vZGVfdGFibGUsIGdyb3VwX2luZGV4KTsKKworCS8qCisJICogQXNzZXJ0IHRoYXQgd2UgYXJlIG5vdCB0cnlpbmcgdG8gYWRkIGFuIGVudHJ5IHRvIGEgc2xvdCB0aGF0IGlzIGFscmVhZHkKKwkgKiBmdWxsLiAqLworCUJVR19PTihncm91cF92YWx1ZSA9PSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9GVUxMX1NMT1RfVkFMVUUpOworCisJaWYgKGdyb3VwX3ZhbHVlID09IDB4MDApIHsKKwkJLyoKKwkJICogVGhlcmUgYXJlIG5vIGVudHJpZXMgaW4gdGhpcyBzbG90IHNvIGl0IG11c3QgYmUgYWRkZWQgdG8gdGhlIHNpbmdsZQorCQkgKiBzbG90IHRhYmxlLiAqLworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCAwLCBncm91cF9pbmRleCk7CisJfSBlbHNlIGlmICgoZ3JvdXBfdmFsdWUgJiAoZ3JvdXBfdmFsdWUgLSAxKSkgPT0gMCkgeworCQkvKgorCQkgKiBUaGVyZSBpcyBvbmx5IG9uZSBlbnRyeSBpbiB0aGlzIHNsb3Qgc28gaXQgbXVzdCBiZSBtb3ZlZCBmcm9tIHRoZQorCQkgKiBzaW5nbGUgc2xvdCB0YWJsZSB0byB0aGUgZHVhbCBzbG90IHRhYmxlICovCisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9jbGVhcl9ncm91cF9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgMCwgZ3JvdXBfaW5kZXgpOworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCAxLCBncm91cF9pbmRleCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlcmUgYXJlIHR3byBlbnRyaWVzIGluIHRoZSBzbG90IHNvIGl0IG11c3QgYmUgbW92ZWQgZnJvbSB0aGUgZHVhbAorCQkgKiBzbG90IHRhYmxlIHRvIHRoZSB0cmlwcGxlIHNsb3QgdGFibGUuICovCisJCXNjaV9yZW1vdGVfbm9kZV90YWJsZV9jbGVhcl9ncm91cF9pbmRleChyZW1vdGVfbm9kZV90YWJsZSwgMSwgZ3JvdXBfaW5kZXgpOworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCAyLCBncm91cF9pbmRleCk7CisJfQorCisJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ub2RlX2luZGV4KHJlbW90ZV9ub2RlX3RhYmxlLCByZW1vdGVfbm9kZV9pbmRleCk7Cit9CisKKy8qKgorICoKKyAqIEByZW1vdGVfbm9kZV90YWJsZTogVGhpcyBpcyB0aGUgcmVtb3RlIG5vZGUgdGFibGUgdG8gd2hpY2ggdGhlIHJlbW90ZSBub2RlCisgKiAgICBpbmRleCBpcyB0byBiZSBmcmVlZC4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHJlbGVhc2UgYSBncm91cCBvZiB0aHJlZSBjb25zZWN1dGl2ZSByZW1vdGUgbm9kZXMgYmFjayB0bworICogdGhlIGZyZWUgcmVtb3RlIG5vZGVzLgorICovCitzdGF0aWMgdm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfcmVsZWFzZV90cmlwbGVfcmVtb3RlX25vZGUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTE2IHJlbW90ZV9ub2RlX2luZGV4KQoreworCXUzMiBncm91cF9pbmRleDsKKworCWdyb3VwX2luZGV4ID0gcmVtb3RlX25vZGVfaW5kZXggLyBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UOworCisJc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3NldF9ncm91cF9pbmRleCgKKwkJcmVtb3RlX25vZGVfdGFibGUsIDIsIGdyb3VwX2luZGV4CisJCSk7CisKKwlzY2lfcmVtb3RlX25vZGVfdGFibGVfc2V0X2dyb3VwKHJlbW90ZV9ub2RlX3RhYmxlLCBncm91cF9pbmRleCk7Cit9CisKKy8qKgorICoKKyAqIEByZW1vdGVfbm9kZV90YWJsZTogVGhlIHJlbW90ZSBub2RlIHRhYmxlIHRvIHdoaWNoIHRoZSByZW1vdGUgbm9kZSBpbmRleCBpcworICogICAgdG8gYmUgZnJlZWQuCisgKiBAcmVtb3RlX25vZGVfY291bnQ6IFRoaXMgaXMgdGhlIGNvdW50IG9mIGNvbnNlY3V0aXZlIHJlbW90ZSBub2RlcyB0aGF0IGFyZQorICogICAgdG8gYmUgZnJlZWQuCisgKgorICogVGhpcyBtZXRob2Qgd2lsbCByZWxlYXNlIHRoZSByZW1vdGUgbm9kZSBpbmRleCBiYWNrIGludG8gdGhlIHJlbW90ZSBub2RlCisgKiB0YWJsZSBmcmVlIHBvb2wuCisgKi8KK3ZvaWQgc2NpX3JlbW90ZV9ub2RlX3RhYmxlX3JlbGVhc2VfcmVtb3RlX25vZGVfaW5kZXgoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIHJlbW90ZV9ub2RlX2NvdW50LAorCXUxNiByZW1vdGVfbm9kZV9pbmRleCkKK3sKKwlpZiAocmVtb3RlX25vZGVfY291bnQgPT0gU0NVX1NTUF9SRU1PVEVfTk9ERV9DT1VOVCkgeworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfcmVsZWFzZV9zaW5nbGVfcmVtb3RlX25vZGUoCisJCQlyZW1vdGVfbm9kZV90YWJsZSwgcmVtb3RlX25vZGVfaW5kZXgpOworCX0gZWxzZSBpZiAocmVtb3RlX25vZGVfY291bnQgPT0gU0NVX1NUUF9SRU1PVEVfTk9ERV9DT1VOVCkgeworCQlzY2lfcmVtb3RlX25vZGVfdGFibGVfcmVsZWFzZV90cmlwbGVfcmVtb3RlX25vZGUoCisJCQlyZW1vdGVfbm9kZV90YWJsZSwgcmVtb3RlX25vZGVfaW5kZXgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfdGFibGUuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxYWI5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX3RhYmxlLmgKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0hfCisjZGVmaW5lIF9TQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9IXworCisjaW5jbHVkZSAiaXNjaS5oIgorCisvKioKKyAqCisgKgorICogUmVtb3RlIG5vZGUgc2V0cyBhcmUgc2V0cyBvZiByZW1vdGUgbm9kZSBpbmRleCBpbiB0aGUgcmVtdG9lIG5vZGUgdGFibGUgVGhlCisgKiBTQ1UgaGFyZHdhcmUgcmVxdWlyZXMgdGhhdCBTVFAgcmVtb3RlIG5vZGUgZW50cmllcyB0YWtlIHRocmVlIGNvbnNlY3V0aXZlCisgKiByZW1vdGUgbm9kZSBpbmRleCBzbyB0aGUgdGFibGUgaXMgYXJyYW5nZWQgaW4gc2V0cyBvZiB0aHJlZS4gVGhlIGJpdHMgYXJlCisgKiB1c2VkIGFzIDAxMTEgMDExMSB0byBtYWtlIGEgYnl0ZSBhbmQgdGhlIGJpdHMgZGVmaW5lIHRoZSBzZXQgb2YgdGhyZWUgcmVtb3RlCisgKiBub2RlcyB0byB1c2UgYXMgYSBzZXF1ZW5jZS4KKyAqLworI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9CWVRFIDIKKworLyoqCisgKgorICoKKyAqIFNpbmNlIHRoZSByZW1vdGUgbm9kZSB0YWJsZSBpcyBvcmdhbml6ZWQgYXMgRFdPUkRTIHRha2UgdGhlIHJlbW90ZSBub2RlIHNldHMKKyAqIGluIGJ5dGVzIGFuZCByZXByZXNlbnQgdGhlbSBpbiBEV09SRHMuIFRoZSBsb3dlc3Qgb3JkZXJlZCBiaXRzIGFyZSB0aGUgb25lcworICogdXNlZCBpbiBjYXNlIGZ1bGwgRFdPUkQgaXMgbm90IGJlaW5nIHVzZWQuIGkuZS4gMDAwMCAwMDAwIDAwMDAgMDAwMCAwMTExCisgKiAwMTExIDAxMTEgMDExMSAvLyBpZiBvbmx5IGEgc2luZ2xlIFdPUkQgaXMgaW4gdXNlIGluIHRoZSBEV09SRC4KKyAqLworI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9TRVRTX1BFUl9EV09SRCBcCisJKHNpemVvZih1MzIpICogU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfQllURSkKKy8qKgorICoKKyAqCisgKiBUaGlzIGlzIGEgY291bnQgb2YgdGhlIG51bWViZXIgb2YgcmVtb3RlIG5vZGVzIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGluIGEKKyAqIGJ5dGUKKyAqLworI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfUEVSX0JZVEUJXAorCShTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UICogU0NJQ19TRFNfUkVNT1RFX05PREVfU0VUU19QRVJfQllURSkKKworLyoqCisgKgorICoKKyAqIFRoaXMgaXMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHJlbW90ZSBub2RlcyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBpbiBhCisgKiBEV1JPRAorICovCisjZGVmaW5lIFNDSUNfU0RTX1JFTU9URV9OT0RFU19QRVJfRFdPUkQJXAorCShzaXplb2YodTMyKSAqIFNDSUNfU0RTX1JFTU9URV9OT0RFU19QRVJfQllURSkKKworLyoqCisgKgorICoKKyAqIFRoaXMgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgcmVtb3RlIG5vZGUgZ3JvdXAKKyAqLworI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfQklUU19QRVJfR1JPVVAgICA0CisKKyNkZWZpbmUgU0NJQ19TRFNfUkVNT1RFX05PREVfVEFCTEVfSU5WQUxJRF9JTkRFWCAgICAgICgweEZGRkZGRkZGKQorI2RlZmluZSBTQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9GVUxMX1NMT1RfVkFMVUUgICAgKDB4MDcpCisjZGVmaW5lIFNDSUNfU0RTX1JFTU9URV9OT0RFX1RBQkxFX0VNUFRZX1NMT1RfVkFMVUUgICAoMHgwMCkKKworLyoqCisgKgorICoKKyAqIEV4cGFuZGVyIGF0dGFjaGVkIHNhdGEgcmVtb3RlIG5vZGUgY291bnQKKyAqLworI2RlZmluZSBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UICAgICAgICAzCisKKy8qKgorICoKKyAqCisgKiBFeHBhbmRlciBvciBkaXJlY3QgYXR0YWNoZWQgc3NwIHJlbW90ZSBub2RlIGNvdW50CisgKi8KKyNkZWZpbmUgU0NVX1NTUF9SRU1PVEVfTk9ERV9DT1VOVCAgICAgICAgMQorCisvKioKKyAqCisgKgorICogRGlyZWN0IGF0dGFjaGVkIFNUUCByZW1vdGUgbm9kZSBjb3VudAorICovCisjZGVmaW5lIFNDVV9TQVRBX1JFTU9URV9OT0RFX0NPVU5UICAgICAgIDEKKworLyoqCisgKiBzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlIC0KKyAqCisgKgorICovCitzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBhcnJheSBzaXplIGluIGR3b3JkcworCSAqLworCXUxNiBhdmFpbGFibGVfbm9kZXNfYXJyYXlfc2l6ZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgY29udGFpbnMgdGhlIGFycmF5IHNpemUgb2YgdGhlCisJICovCisJdTE2IGdyb3VwX2FycmF5X3NpemU7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBhcnJheSBvZiBhdmFpbGFibGUgcmVtb3RlIG5vZGUgZW50cmllcyBpbiBiaXRzLgorCSAqIEJlY2F1c2Ugb2YgdGhlIHdheSBTVFAgcmVtb3RlIG5vZGUgZGF0YSBpcyBhbGxvY2F0ZWQgb24gdGhlIFNDVSBoYXJkd2FyZQorCSAqIHRoZSByZW1vdGUgbm9kZXMgbXVzdCBvY2N1cHkgdGhyZWUgY29uc2VjdXRpdmUgcmVtb3RlIG5vZGUgY29udGV4dAorCSAqIGVudHJpZXMuICBGb3IgZWFzZSBvZiBhbGxvY2F0aW9uIGFuZCBkZS1hbGxvY2F0aW9uIHdlIGhhdmUgYnJva2VuIHRoZQorCSAqIHNldHMgb2YgdGhyZWUgaW50byBhIHNpbmdsZSBuaWJibGUuICBXaGVuIHRoZSBTVFAgUk5pIGlzIGFsbG9jYXRlZCBhbGwKKwkgKiBvZiB0aGUgYml0cyBpbiB0aGUgbmliYmxlIGFyZSBjbGVhcmVkLiAgVGhpcyBtYXRoIHJlc3VsdHMgaW4gYSB0YWJsZSBzaXplCisJICogb2YgTUFYX1JFTU9URV9OT0RFUyAvIENPTlNFQ1VUSVZFIFJOaSBFTlRSSUVTIGZvciBTVFAgLyAyIGVudHJpZXMgcGVyIGJ5dGUuCisJICovCisJdTMyIGF2YWlsYWJsZV9yZW1vdGVfbm9kZXNbCisJCShTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTIC8gU0NJQ19TRFNfUkVNT1RFX05PREVTX1BFUl9EV09SRCkKKwkJKyAoKFNDSV9NQVhfUkVNT1RFX0RFVklDRVMgJSBTQ0lDX1NEU19SRU1PVEVfTk9ERVNfUEVSX0RXT1JEKSAhPSAwKV07CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBuaWJibGUgc2VsZWN0b3IgZm9yIHRoZSBhYm92ZSB0YWJsZS4gIFRoZXJlIGFyZSB0aHJlZQorCSAqIHBvc3NpYmxlIHNlbGVjdG9ycyBlYWNoIGZvciBmYXN0IGxvb2t1cCB3aGVuIHRyeWluZyB0byBmaW5kIG9uZSwgdHdvIG9yCisJICogdGhyZWUgcmVtb3RlIG5vZGUgZW50cmllcy4KKwkgKi8KKwl1MzIgcmVtb3RlX25vZGVfZ3JvdXBzWworCQlTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UXVsKKwkJKFNDSV9NQVhfUkVNT1RFX0RFVklDRVMgLyAoMzIgKiBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKSkKKwkJKyAoKFNDSV9NQVhfUkVNT1RFX0RFVklDRVMgJSAoMzIgKiBTQ1VfU1RQX1JFTU9URV9OT0RFX0NPVU5UKSkgIT0gMCldOworCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfaW5pdGlhbGl6ZSgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgcmVtb3RlX25vZGVfZW50cmllcyk7CisKK3UxNiBzY2lfcmVtb3RlX25vZGVfdGFibGVfYWxsb2NhdGVfcmVtb3RlX25vZGUoCisJc3RydWN0IHNjaV9yZW1vdGVfbm9kZV90YWJsZSAqcmVtb3RlX25vZGVfdGFibGUsCisJdTMyIHJlbW90ZV9ub2RlX2NvdW50KTsKKwordm9pZCBzY2lfcmVtb3RlX25vZGVfdGFibGVfcmVsZWFzZV9yZW1vdGVfbm9kZV9pbmRleCgKKwlzdHJ1Y3Qgc2NpX3JlbW90ZV9ub2RlX3RhYmxlICpyZW1vdGVfbm9kZV90YWJsZSwKKwl1MzIgcmVtb3RlX25vZGVfY291bnQsCisJdTE2IHJlbW90ZV9ub2RlX2luZGV4KTsKKworI2VuZGlmIC8qIF9TQ0lDX1NEU19SRU1PVEVfTk9ERV9UQUJMRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NmUwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmMKQEAgLTAsMCArMSwzMzkxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgInRhc2suaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisjaW5jbHVkZSAic2N1X2NvbXBsZXRpb25fY29kZXMuaCIKKyNpbmNsdWRlICJzY3VfZXZlbnRfY29kZXMuaCIKKyNpbmNsdWRlICJzYXMuaCIKKworc3RhdGljIHN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciAqdG9fc2dsX2VsZW1lbnRfcGFpcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJCWludCBpZHgpCit7CisJaWYgKGlkeCA9PSAwKQorCQlyZXR1cm4gJmlyZXEtPnRjLT5zZ2xfcGFpcl9hYjsKKwllbHNlIGlmIChpZHggPT0gMSkKKwkJcmV0dXJuICZpcmVxLT50Yy0+c2dsX3BhaXJfY2Q7CisJZWxzZSBpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZQorCQlyZXR1cm4gJmlyZXEtPnNnX3RhYmxlW2lkeCAtIDJdOworfQorCitzdGF0aWMgZG1hX2FkZHJfdCB0b19zZ2xfZWxlbWVudF9wYWlyX2RtYShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLCB1MzIgaWR4KQoreworCXUzMiBvZmZzZXQ7CisKKwlpZiAoaWR4ID09IDApIHsKKwkJb2Zmc2V0ID0gKHZvaWQgKikgJmlyZXEtPnRjLT5zZ2xfcGFpcl9hYiAtCisJCQkgKHZvaWQgKikgJmlob3N0LT50YXNrX2NvbnRleHRfdGFibGVbMF07CisJCXJldHVybiBpaG9zdC0+dGFza19jb250ZXh0X2RtYSArIG9mZnNldDsKKwl9IGVsc2UgaWYgKGlkeCA9PSAxKSB7CisJCW9mZnNldCA9ICh2b2lkICopICZpcmVxLT50Yy0+c2dsX3BhaXJfY2QgLQorCQkJICh2b2lkICopICZpaG9zdC0+dGFza19jb250ZXh0X3RhYmxlWzBdOworCQlyZXR1cm4gaWhvc3QtPnRhc2tfY29udGV4dF9kbWEgKyBvZmZzZXQ7CisJfQorCisJcmV0dXJuIHNjaV9pb19yZXF1ZXN0X2dldF9kbWFfYWRkcihpcmVxLCAmaXJlcS0+c2dfdGFibGVbaWR4IC0gMl0pOworfQorCitzdGF0aWMgdm9pZCBpbml0X3NnbF9lbGVtZW50KHN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgKmUsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7CisJZS0+bGVuZ3RoID0gc2dfZG1hX2xlbihzZyk7CisJZS0+YWRkcmVzc191cHBlciA9IHVwcGVyXzMyX2JpdHMoc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwllLT5hZGRyZXNzX2xvd2VyID0gbG93ZXJfMzJfYml0cyhzZ19kbWFfYWRkcmVzcyhzZykpOworCWUtPmFkZHJlc3NfbW9kaWZpZXIgPSAwOworfQorCitzdGF0aWMgdm9pZCBzY2lfcmVxdWVzdF9idWlsZF9zZ2woc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlyZXEtPmlzY2lfaG9zdDsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl1MzIgc2dfaWR4ID0gMDsKKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgKnNjdV9zZyAgID0gTlVMTDsKKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgKnByZXZfc2cgID0gTlVMTDsKKworCWlmICh0YXNrLT5udW1fc2NhdHRlciA+IDApIHsKKwkJc2cgPSB0YXNrLT5zY2F0dGVyOworCisJCXdoaWxlIChzZykgeworCQkJc2N1X3NnID0gdG9fc2dsX2VsZW1lbnRfcGFpcihpcmVxLCBzZ19pZHgpOworCQkJaW5pdF9zZ2xfZWxlbWVudCgmc2N1X3NnLT5BLCBzZyk7CisJCQlzZyA9IHNnX25leHQoc2cpOworCQkJaWYgKHNnKSB7CisJCQkJaW5pdF9zZ2xfZWxlbWVudCgmc2N1X3NnLT5CLCBzZyk7CisJCQkJc2cgPSBzZ19uZXh0KHNnKTsKKwkJCX0gZWxzZQorCQkJCW1lbXNldCgmc2N1X3NnLT5CLCAwLCBzaXplb2Yoc2N1X3NnLT5CKSk7CisKKwkJCWlmIChwcmV2X3NnKSB7CisJCQkJZG1hX2FkZHIgPSB0b19zZ2xfZWxlbWVudF9wYWlyX2RtYShpaG9zdCwKKwkJCQkJCQkJICAgaXJlcSwKKwkJCQkJCQkJICAgc2dfaWR4KTsKKworCQkJCXByZXZfc2ctPm5leHRfcGFpcl91cHBlciA9CisJCQkJCXVwcGVyXzMyX2JpdHMoZG1hX2FkZHIpOworCQkJCXByZXZfc2ctPm5leHRfcGFpcl9sb3dlciA9CisJCQkJCWxvd2VyXzMyX2JpdHMoZG1hX2FkZHIpOworCQkJfQorCisJCQlwcmV2X3NnID0gc2N1X3NnOworCQkJc2dfaWR4Kys7CisJCX0KKwl9IGVsc2UgewkvKiBoYW5kbGUgd2hlbiBubyBzZyAqLworCQlzY3Vfc2cgPSB0b19zZ2xfZWxlbWVudF9wYWlyKGlyZXEsIHNnX2lkeCk7CisKKwkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSgmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJICB0YXNrLT5zY2F0dGVyLAorCQkJCQkgIHRhc2stPnRvdGFsX3hmZXJfbGVuLAorCQkJCQkgIHRhc2stPmRhdGFfZGlyKTsKKworCQlpcmVxLT56ZXJvX3NjYXR0ZXJfZGFkZHIgPSBkbWFfYWRkcjsKKworCQlzY3Vfc2ctPkEubGVuZ3RoID0gdGFzay0+dG90YWxfeGZlcl9sZW47CisJCXNjdV9zZy0+QS5hZGRyZXNzX3VwcGVyID0gdXBwZXJfMzJfYml0cyhkbWFfYWRkcik7CisJCXNjdV9zZy0+QS5hZGRyZXNzX2xvd2VyID0gbG93ZXJfMzJfYml0cyhkbWFfYWRkcik7CisJfQorCisJaWYgKHNjdV9zZykgeworCQlzY3Vfc2ctPm5leHRfcGFpcl91cHBlciA9IDA7CisJCXNjdV9zZy0+bmV4dF9wYWlyX2xvd2VyID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9pb19yZXF1ZXN0X2J1aWxkX3NzcF9jb21tYW5kX2l1KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNzcF9jbWRfaXUgKmNtZF9pdTsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisKKwljbWRfaXUgPSAmaXJlcS0+c3NwLmNtZDsKKworCW1lbWNweShjbWRfaXUtPkxVTiwgdGFzay0+c3NwX3Rhc2suTFVOLCA4KTsKKwljbWRfaXUtPmFkZF9jZGJfbGVuID0gMDsKKwljbWRfaXUtPl9yX2EgPSAwOworCWNtZF9pdS0+X3JfYiA9IDA7CisJY21kX2l1LT5lbl9mYnVyc3QgPSAwOyAvKiB1bnN1cHBvcnRlZCAqLworCWNtZF9pdS0+dGFza19wcmlvID0gdGFzay0+c3NwX3Rhc2sudGFza19wcmlvOworCWNtZF9pdS0+dGFza19hdHRyID0gdGFzay0+c3NwX3Rhc2sudGFza19hdHRyOworCWNtZF9pdS0+X3JfYyA9IDA7CisKKwlzY2lfc3dhYjMyX2NweSgmY21kX2l1LT5jZGIsIHRhc2stPnNzcF90YXNrLmNkYiwKKwkJICAgICAgIHNpemVvZih0YXNrLT5zc3BfdGFzay5jZGIpIC8gc2l6ZW9mKHUzMikpOworfQorCitzdGF0aWMgdm9pZCBzY2lfdGFza19yZXF1ZXN0X2J1aWxkX3NzcF90YXNrX2l1KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNzcF90YXNrX2l1ICp0YXNrX2l1OworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwlzdHJ1Y3QgaXNjaV90bWYgKmlzY2lfdG1mID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190bWYoaXJlcSk7CisKKwl0YXNrX2l1ID0gJmlyZXEtPnNzcC50bWY7CisKKwltZW1zZXQodGFza19pdSwgMCwgc2l6ZW9mKHN0cnVjdCBzc3BfdGFza19pdSkpOworCisJbWVtY3B5KHRhc2tfaXUtPkxVTiwgdGFzay0+c3NwX3Rhc2suTFVOLCA4KTsKKworCXRhc2tfaXUtPnRhc2tfZnVuYyA9IGlzY2lfdG1mLT50bWZfY29kZTsKKwl0YXNrX2l1LT50YXNrX3RhZyA9CisJCShpcmVxLT50dHlwZSA9PSB0bWZfdGFzaykgPworCQlpc2NpX3RtZi0+aW9fdGFnIDoKKwkJU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUc7Cit9CisKKy8qKgorICogVGhpcyBtZXRob2QgaXMgd2lsbCBmaWxsIGluIHRoZSBTQ1UgVGFzayBDb250ZXh0IGZvciBhbnkgdHlwZSBvZiBTU1AgcmVxdWVzdC4KKyAqIEBzY2lfcmVxOgorICogQHRhc2tfY29udGV4dDoKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNjdV9zc3BfcmVxZXVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dCkKK3sKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXY7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQ7CisKKwlpZGV2ID0gaXJlcS0+dGFyZ2V0X2RldmljZTsKKwlpcG9ydCA9IGlkZXYtPm93bmluZ19wb3J0OworCisJLyogRmlsbCBpbiB0aGUgVEMgd2l0aCB0aGUgaXRzIHJlcXVpcmVkIGRhdGEgKi8KKwl0YXNrX2NvbnRleHQtPmFib3J0ID0gMDsKKwl0YXNrX2NvbnRleHQtPnByaW9yaXR5ID0gMDsKKwl0YXNrX2NvbnRleHQtPmluaXRpYXRvcl9yZXF1ZXN0ID0gMTsKKwl0YXNrX2NvbnRleHQtPmNvbm5lY3Rpb25fcmF0ZSA9IGlkZXYtPmNvbm5lY3Rpb25fcmF0ZTsKKwl0YXNrX2NvbnRleHQtPnByb3RvY29sX2VuZ2luZV9pbmRleCA9IElTQ0lfUEVHOworCXRhc2tfY29udGV4dC0+bG9naWNhbF9wb3J0X2luZGV4ID0gaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXg7CisJdGFza19jb250ZXh0LT5wcm90b2NvbF90eXBlID0gU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TU1A7CisJdGFza19jb250ZXh0LT52YWxpZCA9IFNDVV9UQVNLX0NPTlRFWFRfVkFMSUQ7CisJdGFza19jb250ZXh0LT5jb250ZXh0X3R5cGUgPSBTQ1VfVEFTS19DT05URVhUX1RZUEU7CisKKwl0YXNrX2NvbnRleHQtPnJlbW90ZV9ub2RlX2luZGV4ID0gaWRldi0+cm5jLnJlbW90ZV9ub2RlX2luZGV4OworCXRhc2tfY29udGV4dC0+Y29tbWFuZF9jb2RlID0gMDsKKworCXRhc2tfY29udGV4dC0+bGlua19sYXllcl9jb250cm9sID0gMDsKKwl0YXNrX2NvbnRleHQtPmRvX25vdF9kbWFfc3NwX2dvb2RfcmVzcG9uc2UgPSAxOworCXRhc2tfY29udGV4dC0+c3RyaWN0X29yZGVyaW5nID0gMDsKKwl0YXNrX2NvbnRleHQtPmNvbnRyb2xfZnJhbWUgPSAwOworCXRhc2tfY29udGV4dC0+dGltZW91dF9lbmFibGUgPSAwOworCXRhc2tfY29udGV4dC0+YmxvY2tfZ3VhcmRfZW5hYmxlID0gMDsKKworCXRhc2tfY29udGV4dC0+YWRkcmVzc19tb2RpZmllciA9IDA7CisKKwkvKiB0YXNrX2NvbnRleHQtPnR5cGUuc3NwLnRhZyA9IGlyZXEtPmlvX3RhZzsgKi8KKwl0YXNrX2NvbnRleHQtPnRhc2tfcGhhc2UgPSAweDAxOworCisJaXJlcS0+cG9zdF9jb250ZXh0ID0gKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfVEMgfAorCQkJICAgICAgKElTQ0lfUEVHIDw8IFNDVV9DT05URVhUX0NPTU1BTkRfUFJPVE9DT0xfRU5HSU5FX0dST1VQX1NISUZUKSB8CisJCQkgICAgICAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPDwKKwkJCSAgICAgICBTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCkgfAorCQkJICAgICAgSVNDSV9UQUdfVENJKGlyZXEtPmlvX3RhZykpOworCisJLyoKKwkgKiBDb3B5IHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgY29tbWFuZCBidWZmZXIgdG8gdGhlCisJICogU0NVIFRhc2sgQ29udGV4dAorCSAqLworCWRtYV9hZGRyID0gc2NpX2lvX3JlcXVlc3RfZ2V0X2RtYV9hZGRyKGlyZXEsICZpcmVxLT5zc3AuY21kKTsKKworCXRhc2tfY29udGV4dC0+Y29tbWFuZF9pdV91cHBlciA9IHVwcGVyXzMyX2JpdHMoZG1hX2FkZHIpOworCXRhc2tfY29udGV4dC0+Y29tbWFuZF9pdV9sb3dlciA9IGxvd2VyXzMyX2JpdHMoZG1hX2FkZHIpOworCisJLyoKKwkgKiBDb3B5IHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgcmVzcG9uc2UgYnVmZmVyIHRvIHRoZQorCSAqIFNDVSBUYXNrIENvbnRleHQKKwkgKi8KKwlkbWFfYWRkciA9IHNjaV9pb19yZXF1ZXN0X2dldF9kbWFfYWRkcihpcmVxLCAmaXJlcS0+c3NwLnJzcCk7CisKKwl0YXNrX2NvbnRleHQtPnJlc3BvbnNlX2l1X3VwcGVyID0gdXBwZXJfMzJfYml0cyhkbWFfYWRkcik7CisJdGFza19jb250ZXh0LT5yZXNwb25zZV9pdV9sb3dlciA9IGxvd2VyXzMyX2JpdHMoZG1hX2FkZHIpOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIGlzIHdpbGwgZmlsbCBpbiB0aGUgU0NVIFRhc2sgQ29udGV4dCBmb3IgYSBTU1AgSU8gcmVxdWVzdC4KKyAqIEBzY2lfcmVxOgorICoKKyAqLworc3RhdGljIHZvaWQgc2N1X3NzcF9pb19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkJCSAgICAgIHUzMiBsZW4pCit7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dCA9IGlyZXEtPnRjOworCisJc2N1X3NzcF9yZXFldXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSwgdGFza19jb250ZXh0KTsKKworCXRhc2tfY29udGV4dC0+c3NwX2NvbW1hbmRfaXVfbGVuZ3RoID0KKwkJc2l6ZW9mKHN0cnVjdCBzc3BfY21kX2l1KSAvIHNpemVvZih1MzIpOworCXRhc2tfY29udGV4dC0+dHlwZS5zc3AuZnJhbWVfdHlwZSA9IFNTUF9DT01NQU5EOworCisJc3dpdGNoIChkaXIpIHsKKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwljYXNlIERNQV9OT05FOgorCWRlZmF1bHQ6CisJCXRhc2tfY29udGV4dC0+dGFza190eXBlID0gU0NVX1RBU0tfVFlQRV9JT1JFQUQ7CisJCWJyZWFrOworCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJdGFza19jb250ZXh0LT50YXNrX3R5cGUgPSBTQ1VfVEFTS19UWVBFX0lPV1JJVEU7CisJCWJyZWFrOworCX0KKworCXRhc2tfY29udGV4dC0+dHJhbnNmZXJfbGVuZ3RoX2J5dGVzID0gbGVuOworCisJaWYgKHRhc2tfY29udGV4dC0+dHJhbnNmZXJfbGVuZ3RoX2J5dGVzID4gMCkKKwkJc2NpX3JlcXVlc3RfYnVpbGRfc2dsKGlyZXEpOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIHdpbGwgZmlsbCBpbiB0aGUgU0NVIFRhc2sgQ29udGV4dCBmb3IgYSBTU1AgVGFzayByZXF1ZXN0LiAgVGhlCisgKiAgICBmb2xsb3dpbmcgaW1wb3J0YW50IHNldHRpbmdzIGFyZSB1dGlsaXplZDogLSMgcHJpb3JpdHkgPT0KKyAqICAgIFNDVV9UQVNLX1BSSU9SSVRZX0hJR0guICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdGFzayByZXF1ZXN0IGlzIGlzc3VlZAorICogICAgYWhlYWQgb2Ygb3RoZXIgdGFzayBkZXN0aW5lZCBmb3IgdGhlIHNhbWUgUmVtb3RlIE5vZGUuIC0jIHRhc2tfdHlwZSA9PQorICogICAgU0NVX1RBU0tfVFlQRV9JT1JFQUQuICBUaGlzIHNpbXBseSBpbmRpY2F0ZXMgdGhhdCBhIG5vcm1hbCByZXF1ZXN0IHR5cGUKKyAqICAgIChpLmUuIG5vbi1yYXcgZnJhbWUpIGlzIGJlaW5nIHV0aWxpemVkIHRvIHBlcmZvcm0gdGFzayBtYW5hZ2VtZW50LiAtIworICogICAgY29udHJvbF9mcmFtZSA9PSAxLiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHByb3BlciBlbmRpYW5lc3MgaXMgc2V0IHNvCisgKiAgICB0aGF0IHRoZSBieXRlcyBhcmUgdHJhbnNtaXR0ZWQgaW4gdGhlIHJpZ2h0IG9yZGVyIGZvciBhIHRhc2sgZnJhbWUuCisgKiBAc2NpX3JlcTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSB0YXNrIHJlcXVlc3Qgb2JqZWN0IGJlaW5nCisgKiAgICBjb25zdHJ1Y3RlZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNjdV9zc3BfdGFza19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCAqdGFza19jb250ZXh0ID0gaXJlcS0+dGM7CisKKwlzY3Vfc3NwX3JlcWV1c3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxLCB0YXNrX2NvbnRleHQpOworCisJdGFza19jb250ZXh0LT5jb250cm9sX2ZyYW1lICAgICAgICAgICAgICAgID0gMTsKKwl0YXNrX2NvbnRleHQtPnByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgPSBTQ1VfVEFTS19QUklPUklUWV9ISUdIOworCXRhc2tfY29udGV4dC0+dGFza190eXBlICAgICAgICAgICAgICAgICAgICA9IFNDVV9UQVNLX1RZUEVfUkFXX0ZSQU1FOworCXRhc2tfY29udGV4dC0+dHJhbnNmZXJfbGVuZ3RoX2J5dGVzICAgICAgICA9IDA7CisJdGFza19jb250ZXh0LT50eXBlLnNzcC5mcmFtZV90eXBlICAgICAgICAgID0gU1NQX1RBU0s7CisJdGFza19jb250ZXh0LT5zc3BfY29tbWFuZF9pdV9sZW5ndGggPQorCQlzaXplb2Yoc3RydWN0IHNzcF90YXNrX2l1KSAvIHNpemVvZih1MzIpOworfQorCisvKioKKyAqIFRoaXMgbWV0aG9kIGlzIHdpbGwgZmlsbCBpbiB0aGUgU0NVIFRhc2sgQ29udGV4dCBmb3IgYW55IHR5cGUgb2YgU0FUQQorICogICAgcmVxdWVzdC4gIFRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIHZhcmlvdXMgU0FUQSBjb25zdHJ1Y3RvcnMuCisgKiBAc2NpX3JlcTogVGhlIGdlbmVyYWwgSU8gcmVxdWVzdCBvYmplY3Qgd2hpY2ggaXMgdG8gYmUgdXNlZCBpbgorICogICAgY29uc3RydWN0aW5nIHRoZSBTQ1UgdGFzayBjb250ZXh0LgorICogQHRhc2tfY29udGV4dDogVGhlIGJ1ZmZlciBwb2ludGVyIGZvciB0aGUgU0NVIHRhc2sgY29udGV4dCB3aGljaCBpcyBiZWluZworICogICAgY29uc3RydWN0ZWQuCisgKgorICogVGhlIGdlbmVyYWwgaW8gcmVxdWVzdCBjb25zdHJ1Y3Rpb24gaXMgY29tcGxldGUuIFRoZSBidWZmZXIgYXNzaWdubWVudCBmb3IKKyAqIHRoZSBjb21tYW5kIGJ1ZmZlciBpcyBjb21wbGV0ZS4gbm9uZSBSZXZpc2l0IHRhc2sgY29udGV4dCBjb25zdHJ1Y3Rpb24gdG8KKyAqIGRldGVybWluZSB3aGF0IGlzIGNvbW1vbiBmb3IgU1NQL1NNUC9TVFAgdGFzayBjb250ZXh0IHN0cnVjdHVyZXMuCisgKi8KK3N0YXRpYyB2b2lkIHNjdV9zYXRhX3JlcWV1c3RfY29uc3RydWN0X3Rhc2tfY29udGV4dCgKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQpCit7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0OworCisJaWRldiA9IGlyZXEtPnRhcmdldF9kZXZpY2U7CisJaXBvcnQgPSBpZGV2LT5vd25pbmdfcG9ydDsKKworCS8qIEZpbGwgaW4gdGhlIFRDIHdpdGggdGhlIGl0cyByZXF1aXJlZCBkYXRhICovCisJdGFza19jb250ZXh0LT5hYm9ydCA9IDA7CisJdGFza19jb250ZXh0LT5wcmlvcml0eSA9IFNDVV9UQVNLX1BSSU9SSVRZX05PUk1BTDsKKwl0YXNrX2NvbnRleHQtPmluaXRpYXRvcl9yZXF1ZXN0ID0gMTsKKwl0YXNrX2NvbnRleHQtPmNvbm5lY3Rpb25fcmF0ZSA9IGlkZXYtPmNvbm5lY3Rpb25fcmF0ZTsKKwl0YXNrX2NvbnRleHQtPnByb3RvY29sX2VuZ2luZV9pbmRleCA9IElTQ0lfUEVHOworCXRhc2tfY29udGV4dC0+bG9naWNhbF9wb3J0X2luZGV4ID0gaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXg7CisJdGFza19jb250ZXh0LT5wcm90b2NvbF90eXBlID0gU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TVFA7CisJdGFza19jb250ZXh0LT52YWxpZCA9IFNDVV9UQVNLX0NPTlRFWFRfVkFMSUQ7CisJdGFza19jb250ZXh0LT5jb250ZXh0X3R5cGUgPSBTQ1VfVEFTS19DT05URVhUX1RZUEU7CisKKwl0YXNrX2NvbnRleHQtPnJlbW90ZV9ub2RlX2luZGV4ID0gaWRldi0+cm5jLnJlbW90ZV9ub2RlX2luZGV4OworCXRhc2tfY29udGV4dC0+Y29tbWFuZF9jb2RlID0gMDsKKworCXRhc2tfY29udGV4dC0+bGlua19sYXllcl9jb250cm9sID0gMDsKKwl0YXNrX2NvbnRleHQtPmRvX25vdF9kbWFfc3NwX2dvb2RfcmVzcG9uc2UgPSAxOworCXRhc2tfY29udGV4dC0+c3RyaWN0X29yZGVyaW5nID0gMDsKKwl0YXNrX2NvbnRleHQtPmNvbnRyb2xfZnJhbWUgPSAwOworCXRhc2tfY29udGV4dC0+dGltZW91dF9lbmFibGUgPSAwOworCXRhc2tfY29udGV4dC0+YmxvY2tfZ3VhcmRfZW5hYmxlID0gMDsKKworCXRhc2tfY29udGV4dC0+YWRkcmVzc19tb2RpZmllciA9IDA7CisJdGFza19jb250ZXh0LT50YXNrX3BoYXNlID0gMHgwMTsKKworCXRhc2tfY29udGV4dC0+c3NwX2NvbW1hbmRfaXVfbGVuZ3RoID0KKwkJKHNpemVvZihzdHJ1Y3QgaG9zdF90b19kZXZfZmlzKSAtIHNpemVvZih1MzIpKSAvIHNpemVvZih1MzIpOworCisJLyogU2V0IHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBIMkQgUkVHIEZJUyAqLworCXRhc2tfY29udGV4dC0+dHlwZS53b3Jkc1swXSA9ICoodTMyICopJmlyZXEtPnN0cC5jbWQ7CisKKwlpcmVxLT5wb3N0X2NvbnRleHQgPSAoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9UQyB8CisJCQkgICAgICAoSVNDSV9QRUcgPDwgU0NVX0NPTlRFWFRfQ09NTUFORF9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfU0hJRlQpIHwKKwkJCSAgICAgIChpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA8PAorCQkJICAgICAgIFNDVV9DT05URVhUX0NPTU1BTkRfTE9HSUNBTF9QT1JUX1NISUZUKSB8CisJCQkgICAgICBJU0NJX1RBR19UQ0koaXJlcS0+aW9fdGFnKSk7CisJLyoKKwkgKiBDb3B5IHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgY29tbWFuZCBidWZmZXIgdG8gdGhlIFNDVSBUYXNrCisJICogQ29udGV4dC4gV2UgbXVzdCBvZmZzZXQgdGhlIGNvbW1hbmQgYnVmZmVyIGJ5IDQgYnl0ZXMgYmVjYXVzZSB0aGUKKwkgKiBmaXJzdCA0IGJ5dGVzIGFyZSB0cmFuc2ZlcmVkIGluIHRoZSBib2R5IG9mIHRoZSBUQy4KKwkgKi8KKwlkbWFfYWRkciA9IHNjaV9pb19yZXF1ZXN0X2dldF9kbWFfYWRkcihpcmVxLAorCQkJCQkJKChjaGFyICopICZpcmVxLT5zdHAuY21kKSArCisJCQkJCQlzaXplb2YodTMyKSk7CisKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfdXBwZXIgPSB1cHBlcl8zMl9iaXRzKGRtYV9hZGRyKTsKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfbG93ZXIgPSBsb3dlcl8zMl9iaXRzKGRtYV9hZGRyKTsKKworCS8qIFNBVEEgUmVxdWVzdHMgZG8gbm90IGhhdmUgYSByZXNwb25zZSBidWZmZXIgKi8KKwl0YXNrX2NvbnRleHQtPnJlc3BvbnNlX2l1X3VwcGVyID0gMDsKKwl0YXNrX2NvbnRleHQtPnJlc3BvbnNlX2l1X2xvd2VyID0gMDsKK30KKworc3RhdGljIHZvaWQgc2N1X3N0cF9yYXdfcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dCA9IGlyZXEtPnRjOworCisJc2N1X3NhdGFfcmVxZXVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KGlyZXEsIHRhc2tfY29udGV4dCk7CisKKwl0YXNrX2NvbnRleHQtPmNvbnRyb2xfZnJhbWUgICAgICAgICA9IDA7CisJdGFza19jb250ZXh0LT5wcmlvcml0eSAgICAgICAgICAgICAgPSBTQ1VfVEFTS19QUklPUklUWV9OT1JNQUw7CisJdGFza19jb250ZXh0LT50YXNrX3R5cGUgICAgICAgICAgICAgPSBTQ1VfVEFTS19UWVBFX1NBVEFfUkFXX0ZSQU1FOworCXRhc2tfY29udGV4dC0+dHlwZS5zdHAuZmlzX3R5cGUgICAgID0gRklTX1JFR0gyRDsKKwl0YXNrX2NvbnRleHQtPnRyYW5zZmVyX2xlbmd0aF9ieXRlcyA9IHNpemVvZihzdHJ1Y3QgaG9zdF90b19kZXZfZmlzKSAtIHNpemVvZih1MzIpOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9zdHBfcGlvX3JlcXVlc3RfY29uc3RydWN0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkJICBib29sIGNvcHlfcnhfZnJhbWUpCit7CisJc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgKnN0cF9yZXEgPSAmaXJlcS0+c3RwLnJlcTsKKworCXNjdV9zdHBfcmF3X3JlcXVlc3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxKTsKKworCXN0cF9yZXEtPnN0YXR1cyA9IDA7CisJc3RwX3JlcS0+c2dsLm9mZnNldCA9IDA7CisJc3RwX3JlcS0+c2dsLnNldCA9IFNDVV9TR0xfRUxFTUVOVF9QQUlSX0E7CisKKwlpZiAoY29weV9yeF9mcmFtZSkgeworCQlzY2lfcmVxdWVzdF9idWlsZF9zZ2woaXJlcSk7CisJCXN0cF9yZXEtPnNnbC5pbmRleCA9IDA7CisJfSBlbHNlIHsKKwkJLyogVGhlIHVzZXIgZG9lcyBub3Qgd2FudCB0aGUgZGF0YSBjb3BpZWQgdG8gdGhlIFNHTCBidWZmZXIgbG9jYXRpb24gKi8KKwkJc3RwX3JlcS0+c2dsLmluZGV4ID0gLTE7CisJfQorCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisvKioKKyAqCisgKiBAc2NpX3JlcTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZXF1ZXN0IHRvIGJlIGNvbnN0cnVjdGVkIGFzIGFuCisgKiAgICBvcHRpbWl6ZWQgcmVxdWVzdC4KKyAqIEBvcHRpbWl6ZWRfdGFza190eXBlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hldGhlciB0aGUgcmVxdWVzdCBpcyB0byBiZQorICogICAgYW4gVURNQSByZXF1ZXN0IG9yIGEgTkNRIHJlcXVlc3QuIC0gQSB2YWx1ZSBvZiAwIGluZGljYXRlcyBVRE1BLiAtIEEKKyAqICAgIHZhbHVlIG9mIDEgaW5kaWNhdGVzIE5DUS4KKyAqCisgKiBUaGlzIG1ldGhvZCB3aWxsIHBlcmZvcm0gcmVxdWVzdCBjb25zdHJ1Y3Rpb24gY29tbW9uIHRvIGFsbCB0eXBlcyBvZiBTVFAKKyAqIHJlcXVlc3RzIHRoYXQgYXJlIG9wdGltaXplZCBieSB0aGUgc2lsaWNvbiAoaS5lLiBVRE1BLCBOQ1EpLiBUaGlzIG1ldGhvZAorICogcmV0dXJucyBhbiBpbmRpY2F0aW9uIGFzIHRvIHdoZXRoZXIgdGhlIGNvbnN0cnVjdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIHZvaWQgc2NpX3N0cF9vcHRpbWl6ZWRfcmVxdWVzdF9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJCSAgICAgdTggb3B0aW1pemVkX3Rhc2tfdHlwZSwKKwkJCQkJCSAgICAgdTMyIGxlbiwKKwkJCQkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQgPSBpcmVxLT50YzsKKworCS8qIEJ1aWxkIHRoZSBTVFAgdGFzayBjb250ZXh0IHN0cnVjdHVyZSAqLworCXNjdV9zYXRhX3JlcWV1c3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxLCB0YXNrX2NvbnRleHQpOworCisJLyogQ29weSBvdmVyIHRoZSBTR0wgZWxlbWVudHMgKi8KKwlzY2lfcmVxdWVzdF9idWlsZF9zZ2woaXJlcSk7CisKKwkvKiBDb3B5IG92ZXIgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc2ZlcmVkICovCisJdGFza19jb250ZXh0LT50cmFuc2Zlcl9sZW5ndGhfYnl0ZXMgPSBsZW47CisKKwlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UpIHsKKwkJLyoKKwkJICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgRE1BIElOIGFuZCBETUEgT1VUIHJlcXVlc3QgdGFzayB0eXBlCisJCSAqIHZhbHVlcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gRlBETUEgUkVBRAorCQkgKiBhbmQgRlBETUEgV1JJVEUgdmFsdWVzLiAgQWRkIHRoZSBzdXBwbGllZCB0YXNrIHR5cGUgcGFyYW1ldGVyCisJCSAqIHRvIHRoaXMgZGlmZmVyZW5jZSB0byBzZXQgdGhlIHRhc2sgdHlwZSBwcm9wZXJseSBmb3IgdGhpcworCQkgKiBEQVRBIE9VVCAoV1JJVEUpIGNhc2UuICovCisJCXRhc2tfY29udGV4dC0+dGFza190eXBlID0gb3B0aW1pemVkX3Rhc2tfdHlwZSArIChTQ1VfVEFTS19UWVBFX0RNQV9PVVQKKwkJCQkJCQkJIC0gU0NVX1RBU0tfVFlQRV9ETUFfSU4pOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEZvciB0aGUgREFUQSBJTiAoUkVBRCkgY2FzZSwgc2ltcGx5IHNhdmUgdGhlIHN1cHBsaWVkCisJCSAqIG9wdGltaXplZCB0YXNrIHR5cGUuICovCisJCXRhc2tfY29udGV4dC0+dGFza190eXBlID0gb3B0aW1pemVkX3Rhc2tfdHlwZTsKKwl9Cit9CisKKworCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3Rfc2F0YShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJICAgICAgIHUzMiBsZW4sCisJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJICAgICAgIGJvb2wgY29weSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCisJLyogY2hlY2sgZm9yIG1hbmFnZW1lbnQgcHJvdG9jb2xzICovCisJaWYgKGlyZXEtPnR0eXBlID09IHRtZl90YXNrKSB7CisJCXN0cnVjdCBpc2NpX3RtZiAqdG1mID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190bWYoaXJlcSk7CisKKwkJaWYgKHRtZi0+dG1mX2NvZGUgPT0gaXNjaV90bWZfc2F0YV9zcnN0X2hpZ2ggfHwKKwkJICAgIHRtZi0+dG1mX2NvZGUgPT0gaXNjaV90bWZfc2F0YV9zcnN0X2xvdykgeworCQkJc2N1X3N0cF9yYXdfcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KGlyZXEpOworCQkJcmV0dXJuIFNDSV9TVUNDRVNTOworCQl9IGVsc2UgeworCQkJZGV2X2VycigmaXJlcS0+b3duaW5nX2NvbnRyb2xsZXItPnBkZXYtPmRldiwKKwkJCQkiJXM6IFJlcXVlc3QgMHglcCByZWNlaXZlZCB1bi1oYW5kbGVkIFNBVCAiCisJCQkJIm1hbmFnZW1lbnQgcHJvdG9jb2wgMHgleC5cbiIsCisJCQkJX19mdW5jX18sIGlyZXEsIHRtZi0+dG1mX2NvZGUpOworCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisJCX0KKwl9CisKKwlpZiAoIXNhc19wcm90b2NvbF9hdGEodGFzay0+dGFza19wcm90bykpIHsKKwkJZGV2X2VycigmaXJlcS0+b3duaW5nX2NvbnRyb2xsZXItPnBkZXYtPmRldiwKKwkJCSIlczogTm9uLUFUQSBwcm90b2NvbCBpbiBTQVRBIHBhdGg6IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXRhc2stPnRhc2tfcHJvdG8pOworCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisKKwl9CisKKwkvKiBub24gZGF0YSAqLworCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfTk9ORSkgeworCQlzY3Vfc3RwX3Jhd19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKKwkvKiBOQ1EgKi8KKwlpZiAodGFzay0+YXRhX3Rhc2sudXNlX25jcSkgeworCQlzY2lfc3RwX29wdGltaXplZF9yZXF1ZXN0X2NvbnN0cnVjdChpcmVxLAorCQkJCQkJCSBTQ1VfVEFTS19UWVBFX0ZQRE1BUV9SRUFELAorCQkJCQkJCSBsZW4sIGRpcik7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKKwkvKiBETUEgKi8KKwlpZiAodGFzay0+YXRhX3Rhc2suZG1hX3hmZXIpIHsKKwkJc2NpX3N0cF9vcHRpbWl6ZWRfcmVxdWVzdF9jb25zdHJ1Y3QoaXJlcSwKKwkJCQkJCQkgU0NVX1RBU0tfVFlQRV9ETUFfSU4sCisJCQkJCQkJIGxlbiwgZGlyKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0gZWxzZSAvKiBQSU8gKi8KKwkJcmV0dXJuIHNjaV9zdHBfcGlvX3JlcXVlc3RfY29uc3RydWN0KGlyZXEsIGNvcHkpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3RfYmFzaWNfc3NwKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCisJaXJlcS0+cHJvdG9jb2wgPSBTQ0lDX1NTUF9QUk9UT0NPTDsKKworCXNjdV9zc3BfaW9fcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KGlyZXEsCisJCQkJCQkgIHRhc2stPmRhdGFfZGlyLAorCQkJCQkJICB0YXNrLT50b3RhbF94ZmVyX2xlbik7CisKKwlzY2lfaW9fcmVxdWVzdF9idWlsZF9zc3BfY29tbWFuZF9pdShpcmVxKTsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTlNUUlVDVEVEKTsKKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0X3NzcCgKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCS8qIENvbnN0cnVjdCB0aGUgU1NQIFRhc2sgU0NVIFRhc2sgQ29udGV4dCAqLworCXNjdV9zc3BfdGFza19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSk7CisKKwkvKiBGaWxsIGluIHRoZSBTU1AgVGFzayBJVSAqLworCXNjaV90YXNrX3JlcXVlc3RfYnVpbGRfc3NwX3Rhc2tfaXUoaXJlcSk7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT05TVFJVQ1RFRCk7CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX2lvX3JlcXVlc3RfY29uc3RydWN0X2Jhc2ljX3NhdGEoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCWJvb2wgY29weSA9IGZhbHNlOworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKworCWlyZXEtPnByb3RvY29sID0gU0NJQ19TVFBfUFJPVE9DT0w7CisKKwljb3B5ID0gKHRhc2stPmRhdGFfZGlyID09IERNQV9OT05FKSA/IGZhbHNlIDogdHJ1ZTsKKworCXN0YXR1cyA9IHNjaV9pb19yZXF1ZXN0X2NvbnN0cnVjdF9zYXRhKGlyZXEsCisJCQkJCQl0YXNrLT50b3RhbF94ZmVyX2xlbiwKKwkJCQkJCXRhc2stPmRhdGFfZGlyLAorCQkJCQkJY29weSk7CisKKwlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKQorCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT05TVFJVQ1RFRCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3Rhc2tfcmVxdWVzdF9jb25zdHJ1Y3Rfc2F0YShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCS8qIGNoZWNrIGZvciBtYW5hZ2VtZW50IHByb3RvY29scyAqLworCWlmIChpcmVxLT50dHlwZSA9PSB0bWZfdGFzaykgeworCQlzdHJ1Y3QgaXNjaV90bWYgKnRtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOworCisJCWlmICh0bWYtPnRtZl9jb2RlID09IGlzY2lfdG1mX3NhdGFfc3JzdF9oaWdoIHx8CisJCSAgICB0bWYtPnRtZl9jb2RlID09IGlzY2lfdG1mX3NhdGFfc3JzdF9sb3cpIHsKKwkJCXNjdV9zdHBfcmF3X3JlcXVlc3RfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJmlyZXEtPm93bmluZ19jb250cm9sbGVyLT5wZGV2LT5kZXYsCisJCQkJIiVzOiBSZXF1ZXN0IDB4JXAgcmVjZWl2ZWQgdW4taGFuZGxlZCBTQVQgIgorCQkJCSJQcm90b2NvbCAweCV4LlxuIiwKKwkJCQlfX2Z1bmNfXywgaXJlcSwgdG1mLT50bWZfY29kZSk7CisKKwkJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwkJfQorCX0KKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09OU1RSVUNURUQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBzY2lfcmVxX3R4X2J5dGVzIC0gYnl0ZXMgdHJhbnNmZXJyZWQgd2hlbiByZXBseSB1bmRlcnJ1bnMgcmVxdWVzdAorICogQHNjaV9yZXE6IHJlcXVlc3QgdGhhdCB3YXMgdGVybWluYXRlZCBlYXJseQorICovCisjZGVmaW5lIFNDVV9UQVNLX0NPTlRFWFRfU1JBTSAweDIwMDAwMAorc3RhdGljIHUzMiBzY2lfcmVxX3R4X2J5dGVzKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKwl1MzIgcmV0X3ZhbCA9IDA7CisKKwlpZiAocmVhZGwoJmlob3N0LT5zbXVfcmVnaXN0ZXJzLT5hZGRyZXNzX21vZGlmaWVyKSA9PSAwKSB7CisJCXZvaWQgX19pb21lbSAqc2N1X3JlZ19iYXNlID0gaWhvc3QtPnNjdV9yZWdpc3RlcnM7CisKKwkJLyogZ2V0IHRoZSBieXRlcyBvZiBkYXRhIGZyb20gdGhlIEFkZHJlc3MgPT0gQkFSMSArIDIwMDAyQ2ggKyAoMjU2KlRDaSkgd2hlcmUKKwkJICogICBCQVIxIGlzIHRoZSBzY3VfcmVnaXN0ZXJzCisJCSAqICAgMHgyMDAwMkMgPSAweDIwMDAwMCArIDB4MmMKKwkJICogICAgICAgICAgICA9IHN0YXJ0IG9mIHRhc2sgY29udGV4dCBTUkFNICsgb2Zmc2V0IG9mICh0eXBlLnNzcC5kYXRhX29mZnNldCkKKwkJICogICBUQ2kgaXMgdGhlIGlvX3RhZyBvZiBzdHJ1Y3Qgc2NpX3JlcXVlc3QKKwkJICovCisJCXJldF92YWwgPSByZWFkbChzY3VfcmVnX2Jhc2UgKworCQkJCShTQ1VfVEFTS19DT05URVhUX1NSQU0gKyBvZmZzZXRvZihzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCwgdHlwZS5zc3AuZGF0YV9vZmZzZXQpKSArCisJCQkJKChzaXplb2Yoc3RydWN0IHNjdV90YXNrX2NvbnRleHQpKSAqIElTQ0lfVEFHX1RDSShpcmVxLT5pb190YWcpKSk7CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVxdWVzdF9zdGFydChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX2Jhc2VfcmVxdWVzdF9zdGF0ZXMgc3RhdGU7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRjID0gaXJlcS0+dGM7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKworCXN0YXRlID0gaXJlcS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlpZiAoc3RhdGUgIT0gU0NJX1JFUV9DT05TVFJVQ1RFRCkgeworCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogU0NJQyBJTyBSZXF1ZXN0IHJlcXVlc3RlZCB0byBzdGFydCB3aGlsZSBpbiB3cm9uZyAiCisJCQkgInN0YXRlICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9CisKKwl0Yy0+dGFza19pbmRleCA9IElTQ0lfVEFHX1RDSShpcmVxLT5pb190YWcpOworCisJc3dpdGNoICh0Yy0+cHJvdG9jb2xfdHlwZSkgeworCWNhc2UgU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TTVA6CisJY2FzZSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX1NTUDoKKwkJLyogU1NQL1NNUCBGcmFtZSAqLworCQl0Yy0+dHlwZS5zc3AudGFnID0gaXJlcS0+aW9fdGFnOworCQl0Yy0+dHlwZS5zc3AudGFyZ2V0X3BvcnRfdHJhbnNmZXJfdGFnID0gMHhGRkZGOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TVFA6CisJCS8qIFNUUC9TQVRBIEZyYW1lCisJCSAqIHRjLT50eXBlLnN0cC5uY3FfdGFnID0gaXJlcS0+bmNxX3RhZzsKKwkJICovCisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX05PTkU6CisJCS8qIC8gQHRvZG8gV2hlbiBkbyB3ZSBzZXQgbm8gcHJvdG9jb2wgdHlwZT8gKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2Ugd2UgYnVpbGQgdGhlIElPCisJCSAqIHJlcXVlc3RzICovCisJCWJyZWFrOworCX0KKworCS8qIEFkZCB0byB0aGUgcG9zdF9jb250ZXh0IHRoZSBpbyB0YWcgdmFsdWUgKi8KKwlpcmVxLT5wb3N0X2NvbnRleHQgfD0gSVNDSV9UQUdfVENJKGlyZXEtPmlvX3RhZyk7CisKKwkvKiBFdmVyeXRoaW5nIGlzIGdvb2QgZ28gYWhlYWQgYW5kIGNoYW5nZSBzdGF0ZSAqLworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUQVJURUQpOworCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitlbnVtIHNjaV9zdGF0dXMKK3NjaV9pb19yZXF1ZXN0X3Rlcm1pbmF0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX2Jhc2VfcmVxdWVzdF9zdGF0ZXMgc3RhdGU7CisKKwlzdGF0ZSA9IGlyZXEtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTQ0lfUkVRX0NPTlNUUlVDVEVEOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9UQVNLX0FCT1JUOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fVEVSTUlOQVRFRDsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1JFUV9TVEFSVEVEOgorCWNhc2UgU0NJX1JFUV9UQVNLX1dBSVRfVENfQ09NUDoKKwljYXNlIFNDSV9SRVFfU01QX1dBSVRfUkVTUDoKKwljYXNlIFNDSV9SRVFfU01QX1dBSVRfVENfQ09NUDoKKwljYXNlIFNDSV9SRVFfU1RQX1VETUFfV0FJVF9UQ19DT01QOgorCWNhc2UgU0NJX1JFUV9TVFBfVURNQV9XQUlUX0QySDoKKwljYXNlIFNDSV9SRVFfU1RQX05PTl9EQVRBX1dBSVRfSDJEOgorCWNhc2UgU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9EMkg6CisJY2FzZSBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9IMkQ6CisJY2FzZSBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRToKKwljYXNlIFNDSV9SRVFfU1RQX1BJT19EQVRBX0lOOgorCWNhc2UgU0NJX1JFUV9TVFBfUElPX0RBVEFfT1VUOgorCWNhc2UgU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0gyRF9BU1NFUlRFRDoKKwljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfRElBRzoKKwljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9EMkg6CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0FCT1JUSU5HKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCWNhc2UgU0NJX1JFUV9UQVNLX1dBSVRfVENfUkVTUDoKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQUJPUlRJTkcpOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUkVRX0FCT1JUSU5HOgorCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJY2FzZSBTQ0lfUkVRX0NPTVBMRVRFRDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaXJlcS0+b3duaW5nX2NvbnRyb2xsZXItPnBkZXYtPmRldiwKKwkJCSAiJXM6IFNDSUMgSU8gUmVxdWVzdCByZXF1ZXN0ZWQgdG8gYWJvcnQgd2hpbGUgaW4gd3JvbmcgIgorCQkJICJzdGF0ZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywKKwkJCSBpcmVxLT5zbS5jdXJyZW50X3N0YXRlX2lkKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7Cit9CisKK2VudW0gc2NpX3N0YXR1cyBzY2lfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCWVudW0gc2NpX2Jhc2VfcmVxdWVzdF9zdGF0ZXMgc3RhdGU7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKworCXN0YXRlID0gaXJlcS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlpZiAoV0FSTl9PTkNFKHN0YXRlICE9IFNDSV9SRVFfQ09NUExFVEVELAorCQkgICAgICAiaXNjaTogcmVxdWVzdCBjb21wbGV0aW9uIGZyb20gd3Jvbmcgc3RhdGUgKCVkKVxuIiwgc3RhdGUpKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKworCWlmIChpcmVxLT5zYXZlZF9yeF9mcmFtZV9pbmRleCAhPSBTQ1VfSU5WQUxJRF9GUkFNRV9JTkRFWCkKKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwKKwkJCQkJCSAgaXJlcS0+c2F2ZWRfcnhfZnJhbWVfaW5kZXgpOworCisJLyogWFhYIGNhbiB3ZSBqdXN0IHN0b3AgdGhlIG1hY2hpbmUgYW5kIHJlbW92ZSB0aGUgJ2ZpbmFsJyBzdGF0ZT8gKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9GSU5BTCk7CisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX2lvX3JlcXVlc3RfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJICB1MzIgZXZlbnRfY29kZSkKK3sKKwllbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIHN0YXRlOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisKKwlzdGF0ZSA9IGlyZXEtPnNtLmN1cnJlbnRfc3RhdGVfaWQ7CisKKwlpZiAoc3RhdGUgIT0gU0NJX1JFUV9TVFBfUElPX0RBVEFfSU4pIHsKKwkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsICIlczogKCV4KSBpbiB3cm9uZyBzdGF0ZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgZXZlbnRfY29kZSwgc3RhdGUpOworCisJCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOworCX0KKworCXN3aXRjaCAoc2N1X2dldF9ldmVudF9zcGVjaWZpZXIoZXZlbnRfY29kZSkpIHsKKwljYXNlIFNDVV9UQVNLX0RPTkVfQ1JDX0VSUiA8PCBTQ1VfRVZFTlRfU1BFQ0lGSUNfQ09ERV9TSElGVDoKKwkJLyogV2UgYXJlIHdhaXRpbmcgZm9yIGRhdGEgYW5kIHRoZSBTQ1UgaGFzIFJfRVJSIHRoZSBkYXRhIGZyYW1lLgorCQkgKiBHbyBiYWNrIHRvIHdhaXRpbmcgZm9yIHRoZSBEMkggUmVnaXN0ZXIgRklTCisJCSAqLworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfUElPX1dBSVRfRlJBTUUpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogcGlvIHJlcXVlc3QgdW5leHBlY3RlZCBldmVudCAlI3hcbiIsCisJCQlfX2Z1bmNfXywgZXZlbnRfY29kZSk7CisKKwkJLyogVE9ETyBTaG91bGQgd2UgZmFpbCB0aGUgUElPIHJlcXVlc3Qgd2hlbiB3ZSBnZXQgYW4KKwkJICogdW5leHBlY3RlZCBldmVudD8KKwkJICovCisJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNvcGllcyByZXNwb25zZSBkYXRhIGZvciByZXF1ZXN0cyByZXR1cm5pbmcgcmVzcG9uc2UgZGF0YQorICogICAgaW5zdGVhZCBvZiBzZW5zZSBkYXRhLgorICogQHNjaV9yZXE6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVxdWVzdCBvYmplY3QgZm9yIHdoaWNoIHRvIGNvcHkKKyAqICAgIHRoZSByZXNwb25zZSBkYXRhLgorICovCitzdGF0aWMgdm9pZCBzY2lfaW9fcmVxdWVzdF9jb3B5X3Jlc3BvbnNlKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJdm9pZCAqcmVzcF9idWY7CisJdTMyIGxlbjsKKwlzdHJ1Y3Qgc3NwX3Jlc3BvbnNlX2l1ICpzc3BfcmVzcG9uc2U7CisJc3RydWN0IGlzY2lfdG1mICppc2NpX3RtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOworCisJc3NwX3Jlc3BvbnNlID0gJmlyZXEtPnNzcC5yc3A7CisKKwlyZXNwX2J1ZiA9ICZpc2NpX3RtZi0+cmVzcC5yZXNwX2l1OworCisJbGVuID0gbWluX3QodTMyLAorCQkgICAgU1NQX1JFU1BfSVVfTUFYX1NJWkUsCisJCSAgICBiZTMyX3RvX2NwdShzc3BfcmVzcG9uc2UtPnJlc3BvbnNlX2RhdGFfbGVuKSk7CisKKwltZW1jcHkocmVzcF9idWYsIHNzcF9yZXNwb25zZS0+cmVzcF9kYXRhLCBsZW4pOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCityZXF1ZXN0X3N0YXJ0ZWRfc3RhdGVfdGNfZXZlbnQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCSAgICAgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN0cnVjdCBzc3BfcmVzcG9uc2VfaXUgKnJlc3BfaXU7CisJdTggZGF0YXByZXM7CisKKwkvKiBUT0RPOiBBbnkgU0RNQSByZXR1cm4gY29kZSBvZiBvdGhlciB0aGFuIDAgaXMgYmFkIGRlY29kZSAweDAwM0MwMDAwCisJICogdG8gZGV0ZXJtaW5lIFNETUEgc3RhdHVzCisJICovCisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0VBUkxZX1JFU1ApOiB7CisJCS8qIFRoZXJlIGFyZSB0aW1lcyB3aGVuIHRoZSBTQ1UgaGFyZHdhcmUgd2lsbCByZXR1cm4gYW4gZWFybHkKKwkJICogcmVzcG9uc2UgYmVjYXVzZSB0aGUgaW8gcmVxdWVzdCBzcGVjaWZpZWQgbW9yZSBkYXRhIHRoYW4gaXMKKwkJICogcmV0dXJuZWQgYnkgdGhlIHRhcmdldCBkZXZpY2UgKG1vZGUgcGFnZXMsIGlucXVpcnkgZGF0YSwKKwkJICogZXRjLikuICBXZSBtdXN0IGNoZWNrIHRoZSByZXNwb25zZSBzdGF0cyB0byBzZWUgaWYgdGhpcyBpcworCQkgKiB0cnVseSBhIGZhaWxlZCByZXF1ZXN0IG9yIGEgZ29vZCByZXF1ZXN0IHRoYXQganVzdCBnb3QKKwkJICogY29tcGxldGVkIGVhcmx5LgorCQkgKi8KKwkJc3RydWN0IHNzcF9yZXNwb25zZV9pdSAqcmVzcCA9ICZpcmVxLT5zc3AucnNwOworCQlzc2l6ZV90IHdvcmRfY250ID0gU1NQX1JFU1BfSVVfTUFYX1NJWkUgLyBzaXplb2YodTMyKTsKKworCQlzY2lfc3dhYjMyX2NweSgmaXJlcS0+c3NwLnJzcCwKKwkJCSAgICAgICAmaXJlcS0+c3NwLnJzcCwKKwkJCSAgICAgICB3b3JkX2NudCk7CisKKwkJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTX0lPX0RPTkVfRUFSTFk7CisJCX0gZWxzZSB7CisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRTsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFKTogeworCQlzc2l6ZV90IHdvcmRfY250ID0gU1NQX1JFU1BfSVVfTUFYX1NJWkUgLyBzaXplb2YodTMyKTsKKworCQlzY2lfc3dhYjMyX2NweSgmaXJlcS0+c3NwLnJzcCwKKwkJCSAgICAgICAmaXJlcS0+c3NwLnJzcCwKKwkJCSAgICAgICB3b3JkX2NudCk7CisKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfQ0hFQ0tfUkVTUE9OU0U7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1JFU1BfTEVOX0VSUik6CisJCS8qIFRPRE8gV2l0aCBUQVNLX0RPTkVfUkVTUF9MRU5fRVJSIGlzIHRoZSByZXNwb25zZSBmcmFtZQorCQkgKiBndWFyYW50ZWVkIHRvIGJlIHJlY2VpdmVkIGJlZm9yZSB0aGlzIGNvbXBsZXRpb24gc3RhdHVzIGlzCisJCSAqIHBvc3RlZD8KKwkJICovCisJCXJlc3BfaXUgPSAmaXJlcS0+c3NwLnJzcDsKKwkJZGF0YXByZXMgPSByZXNwX2l1LT5kYXRhcHJlczsKKworCQlpZiAoZGF0YXByZXMgPT0gMSB8fCBkYXRhcHJlcyA9PSAyKSB7CisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRTsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9JT19SRVNQT05TRV9WQUxJRDsKKwkJfSBlbHNlIHsKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCX0KKwkJYnJlYWs7CisJLyogb25seSBzdHAgZGV2aWNlIGdldHMgc3VzcGVuZGVkLiAqLworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9BQ0tfTkFLX1RPKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfTExfUEVSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX05BS19FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9EQVRBX0xFTl9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9MTF9BQk9SVF9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9YUl9XRF9MRU4pOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9NQVhfUExEX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1VORVhQX1JFU1ApOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9VTkVYUF9TREJGSVMpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9SRUdfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU0RCX0VSUik6CisJCWlmIChpcmVxLT5wcm90b2NvbCA9PSBTQ0lDX1NUUF9QUk9UT0NPTCkgeworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSA+PgorCQkJCQkgICBTQ1VfQ09NUExFVElPTl9UTF9TVEFUVVNfU0hJRlQ7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRDsKKwkJfSBlbHNlIHsKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkgPj4KKwkJCQkJICAgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOworCQl9CisJCWJyZWFrOworCisJLyogYm90aCBzdHAvc3NwIGRldmljZSBnZXRzIHN1c3BlbmRlZCAqLworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9MRl9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfT1BFTl9SRUpFQ1RfV1JPTkdfREVTVElOQVRJT04pOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfT1BFTl9SRUpFQ1RfUkVTRVJWRURfQUJBTkRPTl8xKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX09QRU5fUkVKRUNUX1JFU0VSVkVEX0FCQU5ET05fMik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19PUEVOX1JFSkVDVF9SRVNFUlZFRF9BQkFORE9OXzMpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfT1BFTl9SRUpFQ1RfQkFEX0RFU1RJTkFUSU9OKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX09QRU5fUkVKRUNUX1pPTkVfVklPTEFUSU9OKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX09QRU5fUkVKRUNUX1NUUF9SRVNPVVJDRVNfQlVTWSk6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19PUEVOX1JFSkVDVF9QUk9UT0NPTF9OT1RfU1VQUE9SVEVEKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX09QRU5fUkVKRUNUX0NPTk5FQ1RJT05fUkFURV9OT1RfU1VQUE9SVEVEKToKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSA+PgorCQkJCSAgIFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX1JFTU9URV9ERVZJQ0VfUkVTRVRfUkVRVUlSRUQ7CisJCWJyZWFrOworCisJLyogbmVpdGhlciBzc3Agbm9yIHN0cCBnZXRzIHN1c3BlbmRlZC4gKi8KKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfTkFLX0NNRF9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9VTkVYUF9YUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1hSX0lVX0xFTl9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9TRE1BX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX09GRlNFVF9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9FWENFU1NfREFUQSk6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1NNUF9SRVNQX1RPX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1NNUF9VRklfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU01QX0ZSTV9UWVBFX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1NNUF9MTF9SWF9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9VTkVYUF9EQVRBKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfT1BFTl9GQUlMKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfVklJVF9FTlRSWV9OVik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0lJVF9FTlRSWV9OVik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1JOQ05WX09VVEJPVU5EKToKKwlkZWZhdWx0OgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpID4+CisJCQkJICAgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCWJyZWFrOworCX0KKworCS8qCisJICogVE9ETzogVGhpcyBpcyBwcm9iYWJseSB3cm9uZyBmb3IgQUNLL05BSyB0aW1lb3V0IGNvbmRpdGlvbnMKKwkgKi8KKworCS8qIEluIGFsbCBjYXNlcyB3ZSB3aWxsIHRyZWF0IHRoaXMgYXMgdGhlIGNvbXBsZXRpb24gb2YgdGhlIElPIHJlcS4gKi8KKwlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworcmVxdWVzdF9hYm9ydGluZ19zdGF0ZV90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCXUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIChTQ1VfVEFTS19ET05FX0dPT0QgPDwgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUKToKKwljYXNlIChTQ1VfVEFTS19ET05FX1RBU0tfQUJPUlQgPDwgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUKToKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfVEFTS19BQk9SVDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1RFUk1JTkFURUQ7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogVW5sZXNzIHdlIGdldCBzb21lIHN0cmFuZ2UgZXJyb3Igd2FpdCBmb3IgdGhlIHRhc2sgYWJvcnQgdG8gY29tcGxldGUKKwkJICogVE9ETzogU2hvdWxkIHRoZXJlIGJlIGEgc3RhdGUgY2hhbmdlIGZvciB0aGlzIGNvbXBsZXRpb24/CisJCSAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc3NwX3Rhc2tfcmVxdWVzdF9hd2FpdF90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJICAgICAgIHUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfVEFTS19XQUlUX1RDX1JFU1ApOworCQlicmVhazsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfQUNLX05BS19UTyk6CisJCS8qIEN1cnJlbnRseSwgdGhlIGRlY2lzaW9uIGlzIHRvIHNpbXBseSBhbGxvdyB0aGUgdGFzayByZXF1ZXN0CisJCSAqIHRvIHRpbWVvdXQgaWYgdGhlIHRhc2sgSVUgd2Fzbid0IHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4KKwkJICogVGhlcmUgaXMgYSBwb3RlbnRpYWwgZm9yIHJlY2VpdmluZyBtdWx0aXBsZSB0YXNrIHJlc3BvbnNlcyBpZgorCQkgKiB3ZSBkZWNpZGUgdG8gc2VuZCB0aGUgdGFzayBJVSBhZ2Fpbi4KKwkJICovCisJCWRldl93YXJuKCZpcmVxLT5vd25pbmdfY29udHJvbGxlci0+cGRldi0+ZGV2LAorCQkJICIlczogVGFza1JlcXVlc3Q6MHglcCBDb21wbGV0aW9uQ29kZToleCAtICIKKwkJCSAiQUNLL05BSyB0aW1lb3V0XG4iLCBfX2Z1bmNfXywgaXJlcSwKKwkJCSBjb21wbGV0aW9uX2NvZGUpOworCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1RBU0tfV0FJVF9UQ19SRVNQKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogQWxsIG90aGVyIGNvbXBsZXRpb24gc3RhdHVzIGNhdXNlIHRoZSBJTyB0byBiZSBjb21wbGV0ZS4KKwkJICogSWYgYSBOQUsgd2FzIHJlY2VpdmVkLCB0aGVuIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIHJldHJ5CisJCSAqIHRoZSByZXF1ZXN0LgorCQkgKi8KKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9OT1JNQUxJWkVfQ09NUExFVElPTl9TVEFUVVMoY29tcGxldGlvbl9jb2RlKTsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NtcF9yZXF1ZXN0X2F3YWl0X3Jlc3BvbnNlX3RjX2V2ZW50KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJICAgIHUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCS8qIEluIHRoZSBBV0FJVCBSRVNQT05TRSBzdGF0ZSwgYW55IFRDIGNvbXBsZXRpb24gaXMKKwkJICogdW5leHBlY3RlZC4gIGJ1dCBpZiB0aGUgVEMgaGFzIHN1Y2Nlc3Mgc3RhdHVzLCB3ZQorCQkgKiBjb21wbGV0ZSB0aGUgSU8gYW55d2F5LgorCQkgKi8KKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU01QX1JFU1BfVE9fRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU01QX1VGSV9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9TTVBfRlJNX1RZUEVfRVJSKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfU01QX0xMX1JYX0VSUik6CisJCS8qIFRoZXNlIHN0YXR1cyBoYXMgYmVlbiBzZWVuIGluIGEgc3BlY2lmaWMgTFNJCisJCSAqIGV4cGFuZGVyLCB3aGljaCBzb21ldGltZXMgaXMgbm90IGFibGUgdG8gc2VuZCBzbXAKKwkJICogcmVzcG9uc2Ugd2l0aGluIDIgbXMuIFRoaXMgY2F1c2VzIG91ciBoYXJkd2FyZSBicmVhaworCQkgKiB0aGUgY29ubmVjdGlvbiBhbmQgc2V0IFRDIGNvbXBsZXRpb24gd2l0aCBvbmUgb2YKKwkJICogdGhlc2UgU01QX1hYWF9YWF9FUlIgc3RhdHVzLiBGb3IgdGhlc2UgdHlwZSBvZiBlcnJvciwKKwkJICogd2UgYXNrIGlob3N0IHVzZXIgdG8gcmV0cnkgdGhlIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9TTVBfUkVTUF9UT19FUlI7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9SRVRSWV9SRVFVSVJFRDsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogQWxsIG90aGVyIGNvbXBsZXRpb24gc3RhdHVzIGNhdXNlIHRoZSBJTyB0byBiZSBjb21wbGV0ZS4gIElmIGEgTkFLCisJCSAqIHdhcyByZWNlaXZlZCwgdGhlbiBpdCBpcyB1cCB0byB0aGUgdXNlciB0byByZXRyeSB0aGUgcmVxdWVzdAorCQkgKi8KKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9OT1JNQUxJWkVfQ09NUExFVElPTl9TVEFUVVMoY29tcGxldGlvbl9jb2RlKTsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NtcF9yZXF1ZXN0X2F3YWl0X3RjX2V2ZW50KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUKKwkJICogY29tcGxldGUuICBJZiBhIE5BSyB3YXMgcmVjZWl2ZWQsIHRoZW4gaXQgaXMgdXAgdG8KKwkJICogdGhlIHVzZXIgdG8gcmV0cnkgdGhlIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIHN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgKnBpb19zZ2xfbmV4dChzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSkKK3sKKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50ICpzZ2w7CisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudF9wYWlyICpzZ2xfcGFpcjsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gdG9faXJlcShzdHBfcmVxKTsKKwlzdHJ1Y3QgaXNjaV9zdHBfcGlvX3NnbCAqcGlvX3NnbCA9ICZzdHBfcmVxLT5zZ2w7CisKKwlzZ2xfcGFpciA9IHRvX3NnbF9lbGVtZW50X3BhaXIoaXJlcSwgcGlvX3NnbC0+aW5kZXgpOworCWlmICghc2dsX3BhaXIpCisJCXNnbCA9IE5VTEw7CisJZWxzZSBpZiAocGlvX3NnbC0+c2V0ID09IFNDVV9TR0xfRUxFTUVOVF9QQUlSX0EpIHsKKwkJaWYgKHNnbF9wYWlyLT5CLmFkZHJlc3NfbG93ZXIgPT0gMCAmJgorCQkgICAgc2dsX3BhaXItPkIuYWRkcmVzc191cHBlciA9PSAwKSB7CisJCQlzZ2wgPSBOVUxMOworCQl9IGVsc2UgeworCQkJcGlvX3NnbC0+c2V0ID0gU0NVX1NHTF9FTEVNRU5UX1BBSVJfQjsKKwkJCXNnbCA9ICZzZ2xfcGFpci0+QjsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzZ2xfcGFpci0+bmV4dF9wYWlyX2xvd2VyID09IDAgJiYKKwkJICAgIHNnbF9wYWlyLT5uZXh0X3BhaXJfdXBwZXIgPT0gMCkgeworCQkJc2dsID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXBpb19zZ2wtPmluZGV4Kys7CisJCQlwaW9fc2dsLT5zZXQgPSBTQ1VfU0dMX0VMRU1FTlRfUEFJUl9BOworCQkJc2dsX3BhaXIgPSB0b19zZ2xfZWxlbWVudF9wYWlyKGlyZXEsIHBpb19zZ2wtPmluZGV4KTsKKwkJCXNnbCA9ICZzZ2xfcGFpci0+QTsKKwkJfQorCX0KKworCXJldHVybiBzZ2w7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3N0cF9yZXF1ZXN0X25vbl9kYXRhX2F3YWl0X2gyZF90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQl1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9OT05fREFUQV9XQUlUX0QySCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogQWxsIG90aGVyIGNvbXBsZXRpb24gc3RhdHVzIGNhdXNlIHRoZSBJTyB0byBiZQorCQkgKiBjb21wbGV0ZS4gIElmIGEgTkFLIHdhcyByZWNlaXZlZCwgdGhlbiBpdCBpcyB1cCB0bworCQkgKiB0aGUgdXNlciB0byByZXRyeSB0aGUgcmVxdWVzdC4KKwkJICovCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSk7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCisjZGVmaW5lIFNDVV9NQVhfRlJBTUVfQlVGRkVSX1NJWkUgIDB4NDAwICAvKiAxSyBpcyB0aGUgbWF4aW11bSBTQ1UgZnJhbWUgZGF0YSBwYXlsb2FkICovCisKKy8qIHRyYW5zbWl0IERBVEFfRklTIGZyb20gKGN1cnJlbnQgc2dsICsgb2Zmc2V0KSBmb3IgaW5wdXQKKyAqIHBhcmFtZXRlciBsZW5ndGguIGN1cnJlbnQgc2dsIGFuZCBvZmZzZXQgaXMgYWxyZWF5IHN0b3JlZCBpbiB0aGUgSU8gcmVxdWVzdAorICovCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHNjaV9zdHBfcmVxdWVzdF9waW9fZGF0YV9vdXRfdHJhc21pdF9kYXRhX2ZyYW1lKAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJdTMyIGxlbmd0aCkKK3sKKwlzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSA9ICZpcmVxLT5zdHAucmVxOworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQgPSBpcmVxLT50YzsKKwlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgKnNnbF9wYWlyOworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgKmN1cnJlbnRfc2dsOworCisJLyogUmVjeWNsZSB0aGUgVEMgYW5kIHJlY29uc3RydWN0IGl0IGZvciBzZW5kaW5nIG91dCBEQVRBIEZJUyBjb250YWluaW5nCisJICogZm9yIHRoZSBkYXRhIGZyb20gY3VycmVudF9zZ2wrb2Zmc2V0IGZvciB0aGUgaW5wdXQgbGVuZ3RoCisJICovCisJc2dsX3BhaXIgPSB0b19zZ2xfZWxlbWVudF9wYWlyKGlyZXEsIHN0cF9yZXEtPnNnbC5pbmRleCk7CisJaWYgKHN0cF9yZXEtPnNnbC5zZXQgPT0gU0NVX1NHTF9FTEVNRU5UX1BBSVJfQSkKKwkJY3VycmVudF9zZ2wgPSAmc2dsX3BhaXItPkE7CisJZWxzZQorCQljdXJyZW50X3NnbCA9ICZzZ2xfcGFpci0+QjsKKworCS8qIHVwZGF0ZSB0aGUgVEMgKi8KKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfdXBwZXIgPSBjdXJyZW50X3NnbC0+YWRkcmVzc191cHBlcjsKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfbG93ZXIgPSBjdXJyZW50X3NnbC0+YWRkcmVzc19sb3dlcjsKKwl0YXNrX2NvbnRleHQtPnRyYW5zZmVyX2xlbmd0aF9ieXRlcyA9IGxlbmd0aDsKKwl0YXNrX2NvbnRleHQtPnR5cGUuc3RwLmZpc190eXBlID0gRklTX0RBVEE7CisKKwkvKiBzZW5kIHRoZSBuZXcgVEMgb3V0LiAqLworCXJldHVybiBzY2lfY29udHJvbGxlcl9jb250aW51ZV9pbyhpcmVxKTsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfb3V0X3RyYW5zbWl0X2RhdGEoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSA9ICZpcmVxLT5zdHAucmVxOworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciAqc2dsX3BhaXI7CisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudCAqc2dsOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJdTMyIG9mZnNldDsKKwl1MzIgbGVuID0gMDsKKworCW9mZnNldCA9IHN0cF9yZXEtPnNnbC5vZmZzZXQ7CisJc2dsX3BhaXIgPSB0b19zZ2xfZWxlbWVudF9wYWlyKGlyZXEsIHN0cF9yZXEtPnNnbC5pbmRleCk7CisJaWYgKFdBUk5fT05DRSghc2dsX3BhaXIsICIlczogbnVsbCBzZ2wgZWxlbWVudCIsIF9fZnVuY19fKSkKKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCisJaWYgKHN0cF9yZXEtPnNnbC5zZXQgPT0gU0NVX1NHTF9FTEVNRU5UX1BBSVJfQSkgeworCQlzZ2wgPSAmc2dsX3BhaXItPkE7CisJCWxlbiA9IHNnbF9wYWlyLT5BLmxlbmd0aCAtIG9mZnNldDsKKwl9IGVsc2UgeworCQlzZ2wgPSAmc2dsX3BhaXItPkI7CisJCWxlbiA9IHNnbF9wYWlyLT5CLmxlbmd0aCAtIG9mZnNldDsKKwl9CisKKwlpZiAoc3RwX3JlcS0+cGlvX2xlbiA9PSAwKQorCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisKKwlpZiAoc3RwX3JlcS0+cGlvX2xlbiA+PSBsZW4pIHsKKwkJc3RhdHVzID0gc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX291dF90cmFzbWl0X2RhdGFfZnJhbWUoaXJlcSwgbGVuKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0cF9yZXEtPnBpb19sZW4gLT0gbGVuOworCisJCS8qIHVwZGF0ZSB0aGUgY3VycmVudCBzZ2wsIG9mZnNldCBhbmQgc2F2ZSBmb3IgZnV0dXJlICovCisJCXNnbCA9IHBpb19zZ2xfbmV4dChzdHBfcmVxKTsKKwkJb2Zmc2V0ID0gMDsKKwl9IGVsc2UgaWYgKHN0cF9yZXEtPnBpb19sZW4gPCBsZW4pIHsKKwkJc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX291dF90cmFzbWl0X2RhdGFfZnJhbWUoaXJlcSwgc3RwX3JlcS0+cGlvX2xlbik7CisKKwkJLyogU2dsIG9mZnNldCB3aWxsIGJlIGFkanVzdGVkIGFuZCBzYXZlZCBmb3IgZnV0dXJlICovCisJCW9mZnNldCArPSBzdHBfcmVxLT5waW9fbGVuOworCQlzZ2wtPmFkZHJlc3NfbG93ZXIgKz0gc3RwX3JlcS0+cGlvX2xlbjsKKwkJc3RwX3JlcS0+cGlvX2xlbiA9IDA7CisJfQorCisJc3RwX3JlcS0+c2dsLm9mZnNldCA9IG9mZnNldDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICoKKyAqIEBzdHBfcmVxdWVzdDogVGhlIHJlcXVlc3QgdGhhdCBpcyB1c2VkIGZvciB0aGUgU0dMIHByb2Nlc3NpbmcuCisgKiBAZGF0YV9idWZmZXI6IFRoZSBidWZmZXIgb2YgZGF0YSB0byBiZSBjb3BpZWQuCisgKiBAbGVuZ3RoOiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRyYW5zZmVyLgorICoKKyAqIENvcHkgdGhlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIGZvciB0aGUgbGVuZ3RoIHNwZWNpZmllZCB0byB0aGUgSU8gcmVxZXVzdCBTR0wKKyAqIHNwZWNpZmllZCBkYXRhIHJlZ2lvbi4gZW51bSBzY2lfc3RhdHVzCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NjaV9zdHBfcmVxdWVzdF9waW9fZGF0YV9pbl9jb3B5X2RhdGFfYnVmZmVyKHN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0ICpzdHBfcmVxLAorCQkJCQkJICB1OCAqZGF0YV9idWYsIHUzMiBsZW4pCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcTsKKwl1OCAqc3JjX2FkZHI7CisJaW50IGNvcHlfbGVuOworCXN0cnVjdCBzYXNfdGFzayAqdGFzazsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXZvaWQgKmthZGRyOworCWludCB0b3RhbF9sZW4gPSBsZW47CisKKwlpcmVxID0gdG9faXJlcShzdHBfcmVxKTsKKwl0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCXNyY19hZGRyID0gZGF0YV9idWY7CisKKwlpZiAodGFzay0+bnVtX3NjYXR0ZXIgPiAwKSB7CisJCXNnID0gdGFzay0+c2NhdHRlcjsKKworCQl3aGlsZSAodG90YWxfbGVuID4gMCkgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzZ19wYWdlKHNnKTsKKworCQkJY29weV9sZW4gPSBtaW5fdChpbnQsIHRvdGFsX2xlbiwgc2dfZG1hX2xlbihzZykpOworCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9JUlEwKTsKKwkJCW1lbWNweShrYWRkciArIHNnLT5vZmZzZXQsIHNyY19hZGRyLCBjb3B5X2xlbik7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9JUlEwKTsKKwkJCXRvdGFsX2xlbiAtPSBjb3B5X2xlbjsKKwkJCXNyY19hZGRyICs9IGNvcHlfbGVuOworCQkJc2cgPSBzZ19uZXh0KHNnKTsKKwkJfQorCX0gZWxzZSB7CisJCUJVR19PTih0YXNrLT50b3RhbF94ZmVyX2xlbiA8IHRvdGFsX2xlbik7CisJCW1lbWNweSh0YXNrLT5zY2F0dGVyLCBzcmNfYWRkciwgdG90YWxfbGVuKTsKKwl9CisKKwlyZXR1cm4gU0NJX1NVQ0NFU1M7Cit9CisKKy8qKgorICoKKyAqIEBzY2lfcmVxOiBUaGUgUElPIERBVEEgSU4gcmVxdWVzdCB0aGF0IGlzIHRvIHJlY2VpdmUgdGhlIGRhdGEuCisgKiBAZGF0YV9idWZmZXI6IFRoZSBidWZmZXIgdG8gY29weSBmcm9tLgorICoKKyAqIENvcHkgdGhlIGRhdGEgYnVmZmVyIHRvIHRoZSBpbyByZXF1ZXN0IGRhdGEgcmVnaW9uLiBlbnVtIHNjaV9zdGF0dXMKKyAqLworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfaW5fY29weV9kYXRhKAorCXN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0ICpzdHBfcmVxLAorCXU4ICpkYXRhX2J1ZmZlcikKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBsZXNzIHRoYW4gMUsgcmVtYWluaW5nIGluIHRoZSB0cmFuc2ZlciByZXF1ZXN0CisJICogY29weSBqdXN0IHRoZSBkYXRhIGZvciB0aGUgdHJhbnNmZXIgKi8KKwlpZiAoc3RwX3JlcS0+cGlvX2xlbiA8IFNDVV9NQVhfRlJBTUVfQlVGRkVSX1NJWkUpIHsKKwkJc3RhdHVzID0gc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX2luX2NvcHlfZGF0YV9idWZmZXIoCisJCQlzdHBfcmVxLCBkYXRhX2J1ZmZlciwgc3RwX3JlcS0+cGlvX2xlbik7CisKKwkJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykKKwkJCXN0cF9yZXEtPnBpb19sZW4gPSAwOworCX0gZWxzZSB7CisJCS8qIFdlIGFyZSB0cmFuc2ZlcmluZyB0aGUgd2hvbGUgZnJhbWUgc28gY29weSAqLworCQlzdGF0dXMgPSBzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfaW5fY29weV9kYXRhX2J1ZmZlcigKKwkJCXN0cF9yZXEsIGRhdGFfYnVmZmVyLCBTQ1VfTUFYX0ZSQU1FX0JVRkZFUl9TSVpFKTsKKworCQlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKQorCQkJc3RwX3JlcS0+cGlvX2xlbiAtPSBTQ1VfTUFYX0ZSQU1FX0JVRkZFUl9TSVpFOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3N0cF9yZXF1ZXN0X3Bpb19hd2FpdF9oMmRfY29tcGxldGlvbl90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkgICAgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogQWxsIG90aGVyIGNvbXBsZXRpb24gc3RhdHVzIGNhdXNlIHRoZSBJTyB0byBiZQorCQkgKiBjb21wbGV0ZS4gIElmIGEgTkFLIHdhcyByZWNlaXZlZCwgdGhlbiBpdCBpcyB1cCB0bworCQkgKiB0aGUgdXNlciB0byByZXRyeSB0aGUgcmVxdWVzdC4KKwkJICovCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSk7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworcGlvX2RhdGFfb3V0X3R4X2RvbmVfdGNfZXZlbnQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCSAgICAgIHUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOworCWJvb2wgYWxsX2ZyYW1lc190cmFuc2ZlcnJlZCA9IGZhbHNlOworCXN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0ICpzdHBfcmVxID0gJmlyZXEtPnN0cC5yZXE7CisKKwlzd2l0Y2ggKFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSkgeworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9HT09EKToKKwkJLyogVHJhbnNtaXQgZGF0YSAqLworCQlpZiAoc3RwX3JlcS0+cGlvX2xlbiAhPSAwKSB7CisJCQlzdGF0dXMgPSBzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfb3V0X3RyYW5zbWl0X2RhdGEoaXJlcSk7CisJCQlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKSB7CisJCQkJaWYgKHN0cF9yZXEtPnBpb19sZW4gPT0gMCkKKwkJCQkJYWxsX2ZyYW1lc190cmFuc2ZlcnJlZCA9IHRydWU7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RwX3JlcS0+cGlvX2xlbiA9PSAwKSB7CisJCQkvKgorCQkJICogdGhpcyB3aWxsIGhhcHBlbiBpZiB0aGUgYWxsIGRhdGEgaXMgd3JpdHRlbiBhdCB0aGUKKwkJCSAqIGZpcnN0IHRpbWUgYWZ0ZXIgdGhlIHBpbyBzZXR1cCBmaXMgaXMgcmVjZWl2ZWQKKwkJCSAqLworCQkJYWxsX2ZyYW1lc190cmFuc2ZlcnJlZCAgPSB0cnVlOworCQl9CisKKwkJLyogYWxsIGRhdGEgdHJhbnNmZXJyZWQuICovCisJCWlmIChhbGxfZnJhbWVzX3RyYW5zZmVycmVkKSB7CisJCQkvKgorCQkJICogQ2hhbmdlIHRoZSBzdGF0ZSB0byBTQ0lfUkVRX1NUUF9QSU9fREFUQV9JTgorCQkJICogYW5kIHdhaXQgZm9yIFBJT19TRVRVUCBmaXMgLyBvciBEMkggUkVnIGZpcy4gKi8KKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBBbGwgb3RoZXIgY29tcGxldGlvbiBzdGF0dXMgY2F1c2UgdGhlIElPIHRvIGJlIGNvbXBsZXRlLgorCQkgKiBJZiBhIE5BSyB3YXMgcmVjZWl2ZWQsIHRoZW4gaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gcmV0cnkKKwkJICogdGhlIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc2NpX3N0cF9yZXF1ZXN0X3VkbWFfZ2VuZXJhbF9mcmFtZV9oYW5kbGVyKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkJCSAgICAgICB1MzIgZnJhbWVfaW5kZXgpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKwlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzICpmcmFtZV9oZWFkZXI7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKwl1MzIgKmZyYW1lX2J1ZmZlcjsKKworCXN0YXR1cyA9IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCSAgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkgICAgICAgKHZvaWQgKiopJmZyYW1lX2hlYWRlcik7CisKKwlpZiAoKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykgJiYKKwkgICAgKGZyYW1lX2hlYWRlci0+ZmlzX3R5cGUgPT0gRklTX1JFR0QySCkpIHsKKwkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJICAgICAgKHZvaWQgKiopJmZyYW1lX2J1ZmZlcik7CisKKwkJc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKCZpcmVxLT5zdHAucnNwLAorCQkJCQkJICAgICAgIGZyYW1lX2hlYWRlciwKKwkJCQkJCSAgICAgICBmcmFtZV9idWZmZXIpOworCX0KKworCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2VudW0gc2NpX3N0YXR1cworc2NpX2lvX3JlcXVlc3RfZnJhbWVfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCSAgdTMyIGZyYW1lX2luZGV4KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXJlcS0+b3duaW5nX2NvbnRyb2xsZXI7CisJc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgKnN0cF9yZXEgPSAmaXJlcS0+c3RwLnJlcTsKKwllbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIHN0YXRlOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJc3NpemVfdCB3b3JkX2NudDsKKworCXN0YXRlID0gaXJlcS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKwlzd2l0Y2ggKHN0YXRlKSAgeworCWNhc2UgU0NJX1JFUV9TVEFSVEVEOiB7CisJCXN0cnVjdCBzc3BfZnJhbWVfaGRyIHNzcF9oZHI7CisJCXZvaWQgKmZyYW1lX2hlYWRlcjsKKworCQlzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkgICAgICAmZnJhbWVfaGVhZGVyKTsKKworCQl3b3JkX2NudCA9IHNpemVvZihzdHJ1Y3Qgc3NwX2ZyYW1lX2hkcikgLyBzaXplb2YodTMyKTsKKwkJc2NpX3N3YWIzMl9jcHkoJnNzcF9oZHIsIGZyYW1lX2hlYWRlciwgd29yZF9jbnQpOworCisJCWlmIChzc3BfaGRyLmZyYW1lX3R5cGUgPT0gU1NQX1JFU1BPTlNFKSB7CisJCQlzdHJ1Y3Qgc3NwX3Jlc3BvbnNlX2l1ICpyZXNwX2l1OworCQkJc3NpemVfdCB3b3JkX2NudCA9IFNTUF9SRVNQX0lVX01BWF9TSVpFIC8gc2l6ZW9mKHUzMik7CisKKwkJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgKHZvaWQgKiopJnJlc3BfaXUpOworCisJCQlzY2lfc3dhYjMyX2NweSgmaXJlcS0+c3NwLnJzcCwgcmVzcF9pdSwgd29yZF9jbnQpOworCisJCQlyZXNwX2l1ID0gJmlyZXEtPnNzcC5yc3A7CisKKwkJCWlmIChyZXNwX2l1LT5kYXRhcHJlcyA9PSAweDAxIHx8CisJCQkgICAgcmVzcF9pdS0+ZGF0YXByZXMgPT0gMHgwMikgeworCQkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJCX0gZWxzZSB7CisJCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBub3QgYSByZXNwb25zZSBmcmFtZSwgd2h5IGRpZCBpdCBnZXQgZm9yd2FyZGVkPyAqLworCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IFNDSUMgSU8gUmVxdWVzdCAweCVwIHJlY2VpdmVkIHVuZXhwZWN0ZWQgIgorCQkJCSJmcmFtZSAlZCB0eXBlIDB4JTAyeFxuIiwgX19mdW5jX18sIGlyZXEsCisJCQkJZnJhbWVfaW5kZXgsIHNzcF9oZHIuZnJhbWVfdHlwZSk7CisJCX0KKworCQkvKgorCQkgKiBJbiBhbnkgY2FzZSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgZnJhbWUgYnVmZmVyIHJldHVybiBpdCB0bworCQkgKiB0aGUgY29udHJvbGxlcgorCQkgKi8KKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKKwljYXNlIFNDSV9SRVFfVEFTS19XQUlUX1RDX1JFU1A6CisJCXNjaV9pb19yZXF1ZXN0X2NvcHlfcmVzcG9uc2UoaXJlcSk7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCisJY2FzZSBTQ0lfUkVRX1NNUF9XQUlUX1JFU1A6IHsKKwkJc3RydWN0IHNtcF9yZXNwICpyc3BfaGRyID0gJmlyZXEtPnNtcC5yc3A7CisJCXZvaWQgKmZyYW1lX2hlYWRlcjsKKworCQlzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkgICAgICAmZnJhbWVfaGVhZGVyKTsKKworCQkvKiBieXRlIHN3YXAgdGhlIGhlYWRlci4gKi8KKwkJd29yZF9jbnQgPSBTTVBfUkVTUF9IRFJfU1ogLyBzaXplb2YodTMyKTsKKwkJc2NpX3N3YWIzMl9jcHkocnNwX2hkciwgZnJhbWVfaGVhZGVyLCB3b3JkX2NudCk7CisKKwkJaWYgKHJzcF9oZHItPmZyYW1lX3R5cGUgPT0gU01QX1JFU1BPTlNFKSB7CisJCQl2b2lkICpzbXBfcmVzcDsKKworCQkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAmc21wX3Jlc3ApOworCisJCQl3b3JkX2NudCA9IChzaXplb2Yoc3RydWN0IHNtcF9yZXNwKSAtIFNNUF9SRVNQX0hEUl9TWikgLworCQkJCXNpemVvZih1MzIpOworCisJCQlzY2lfc3dhYjMyX2NweSgoKHU4ICopIHJzcF9oZHIpICsgU01QX1JFU1BfSERSX1NaLAorCQkJCSAgICAgICBzbXBfcmVzcCwgd29yZF9jbnQpOworCisJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfU01QX1dBSVRfVENfQ09NUCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhpcyB3YXMgbm90IGEgcmVzcG9uc2UgZnJhbWUgd2h5IGRpZCBpdCBnZXQKKwkJCSAqIGZvcndhcmRlZD8KKwkJCSAqLworCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IFNDSUMgU01QIFJlcXVlc3QgMHglcCByZWNlaXZlZCB1bmV4cGVjdGVkICIKKwkJCQkiZnJhbWUgJWQgdHlwZSAweCUwMnhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJaXJlcSwKKwkJCQlmcmFtZV9pbmRleCwKKwkJCQlyc3BfaGRyLT5mcmFtZV90eXBlKTsKKworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfU01QX0ZSTV9UWVBFX0VSUjsKKwkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCX0KKworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKworCWNhc2UgU0NJX1JFUV9TVFBfVURNQV9XQUlUX1RDX0NPTVA6CisJCXJldHVybiBzY2lfc3RwX3JlcXVlc3RfdWRtYV9nZW5lcmFsX2ZyYW1lX2hhbmRsZXIoaXJlcSwKKwkJCQkJCQkJICAgICAgIGZyYW1lX2luZGV4KTsKKworCWNhc2UgU0NJX1JFUV9TVFBfVURNQV9XQUlUX0QySDoKKwkJLyogVXNlIHRoZSBnZW5lcmFsIGZyYW1lIGhhbmRsZXIgdG8gY29weSB0aGUgcmVzcG9zbmUgZGF0YSAqLworCQlzdGF0dXMgPSBzY2lfc3RwX3JlcXVlc3RfdWRtYV9nZW5lcmFsX2ZyYW1lX2hhbmRsZXIoaXJlcSwgZnJhbWVfaW5kZXgpOworCisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQ7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKworCWNhc2UgU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9EMkg6IHsKKwkJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCQl1MzIgKmZyYW1lX2J1ZmZlcjsKKworCQlzdGF0dXMgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAgKHZvaWQgKiopJmZyYW1lX2hlYWRlcik7CisKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IFNDSUMgSU8gUmVxdWVzdCAweCVwIGNvdWxkIG5vdCBnZXQgZnJhbWUgIgorCQkJCSJoZWFkZXIgZm9yIGZyYW1lIGluZGV4ICVkLCBzdGF0dXMgJXhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJc3RwX3JlcSwKKwkJCQlmcmFtZV9pbmRleCwKKwkJCQlzdGF0dXMpOworCisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJc3dpdGNoIChmcmFtZV9oZWFkZXItPmZpc190eXBlKSB7CisJCWNhc2UgRklTX1JFR0QySDoKKwkJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgKHZvaWQgKiopJmZyYW1lX2J1ZmZlcik7CisKKwkJCXNjaV9jb250cm9sbGVyX2NvcHlfc2F0YV9yZXNwb25zZSgmaXJlcS0+c3RwLnJzcCwKKwkJCQkJCQkgICAgICAgZnJhbWVfaGVhZGVyLAorCQkJCQkJCSAgICAgICBmcmFtZV9idWZmZXIpOworCisJCQkvKiBUaGUgY29tbWFuZCBoYXMgY29tcGxldGVkIHdpdGggZXJyb3IgKi8KKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSAiJXM6IElPIFJlcXVlc3Q6MHglcCBGcmFtZSBJZDolZCBwcm90b2NvbCAiCisJCQkJICAidmlvbGF0aW9uIG9jY3VycmVkXG4iLCBfX2Z1bmNfXywgc3RwX3JlcSwKKwkJCQkgIGZyYW1lX2luZGV4KTsKKworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfVU5FWFBfRklTOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX1BST1RPQ09MX1ZJT0xBVElPTjsKKwkJCWJyZWFrOworCQl9CisKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKworCQkvKiBGcmFtZSBoYXMgYmVlbiBkZWNvZGVkIHJldHVybiBpdCB0byB0aGUgY29udHJvbGxlciAqLworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwljYXNlIFNDSV9SRVFfU1RQX1BJT19XQUlUX0ZSQU1FOiB7CisJCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwkJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCQl1MzIgKmZyYW1lX2J1ZmZlcjsKKworCQlzdGF0dXMgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAgKHZvaWQgKiopJmZyYW1lX2hlYWRlcik7CisKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IFNDSUMgSU8gUmVxdWVzdCAweCVwIGNvdWxkIG5vdCBnZXQgZnJhbWUgIgorCQkJCSJoZWFkZXIgZm9yIGZyYW1lIGluZGV4ICVkLCBzdGF0dXMgJXhcbiIsCisJCQkJX19mdW5jX18sIHN0cF9yZXEsIGZyYW1lX2luZGV4LCBzdGF0dXMpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCXN3aXRjaCAoZnJhbWVfaGVhZGVyLT5maXNfdHlwZSkgeworCQljYXNlIEZJU19QSU9fU0VUVVA6CisJCQkvKiBHZXQgZnJvbSB0aGUgZnJhbWUgYnVmZmVyIHRoZSBQSU8gU2V0dXAgRGF0YSAqLworCQkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAodm9pZCAqKikmZnJhbWVfYnVmZmVyKTsKKworCQkJLyogR2V0IHRoZSBkYXRhIGZyb20gdGhlIFBJTyBTZXR1cCBUaGUgU0NVIEhhcmR3YXJlCisJCQkgKiByZXR1cm5zIGZpcnN0IHdvcmQgaW4gdGhlIGZyYW1lX2hlYWRlciBhbmQgdGhlIHJlc3QKKwkJCSAqIG9mIHRoZSBkYXRhIGlzIGluIHRoZSBmcmFtZSBidWZmZXIgc28gd2UgbmVlZCB0bworCQkJICogYmFjayB1cCBvbmUgZHdvcmQKKwkJCSAqLworCisJCQkvKiB0cmFuc2Zlcl9jb3VudDogZmlyc3QgMTZiaXRzIGluIHRoZSA0dGggZHdvcmQgKi8KKwkJCXN0cF9yZXEtPnBpb19sZW4gPSBmcmFtZV9idWZmZXJbM10gJiAweGZmZmY7CisKKwkJCS8qIHN0YXR1czogNHRoIGJ5dGUgaW4gdGhlIDNyZCBkd29yZCAqLworCQkJc3RwX3JlcS0+c3RhdHVzID0gKGZyYW1lX2J1ZmZlclsyXSA+PiAyNCkgJiAweGZmOworCisJCQlzY2lfY29udHJvbGxlcl9jb3B5X3NhdGFfcmVzcG9uc2UoJmlyZXEtPnN0cC5yc3AsCisJCQkJCQkJICAgICAgIGZyYW1lX2hlYWRlciwKKwkJCQkJCQkgICAgICAgZnJhbWVfYnVmZmVyKTsKKworCQkJaXJlcS0+c3RwLnJzcC5zdGF0dXMgPSBzdHBfcmVxLT5zdGF0dXM7CisKKwkJCS8qIFRoZSBuZXh0IHN0YXRlIGlzIGRlcGVuZGVudCBvbiB3aGV0aGVyIHRoZQorCQkJICogcmVxdWVzdCB3YXMgUElPIERhdGEtaW4gb3IgRGF0YSBvdXQKKwkJCSAqLworCQkJaWYgKHRhc2stPmRhdGFfZGlyID09IERNQV9GUk9NX0RFVklDRSkgeworCQkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fREFUQV9JTik7CisJCQl9IGVsc2UgaWYgKHRhc2stPmRhdGFfZGlyID09IERNQV9UT19ERVZJQ0UpIHsKKwkJCQkvKiBUcmFuc21pdCBkYXRhICovCisJCQkJc3RhdHVzID0gc2NpX3N0cF9yZXF1ZXN0X3Bpb19kYXRhX291dF90cmFuc21pdF9kYXRhKGlyZXEpOworCQkJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCQkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fREFUQV9PVVQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBGSVNfU0VUREVWQklUUzoKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRSk7CisJCQlicmVhazsKKworCQljYXNlIEZJU19SRUdEMkg6CisJCQlpZiAoZnJhbWVfaGVhZGVyLT5zdGF0dXMgJiBBVEFfQlVTWSkgeworCQkJCS8qCisJCQkJICogTm93IHdoeSBpcyB0aGUgZHJpdmUgc2VuZGluZyBhIEQySCBSZWdpc3RlcgorCQkJCSAqIEZJUyB3aGVuIGl0IGlzIHN0aWxsIGJ1c3k/ICBEbyBub3RoaW5nIHNpbmNlCisJCQkJICogd2UgYXJlIHN0aWxsIGluIHRoZSByaWdodCBzdGF0ZS4KKwkJCQkgKi8KKwkJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkiJXM6IFNDSUMgUElPIFJlcXVlc3QgMHglcCByZWNlaXZlZCAiCisJCQkJCSJEMkggUmVnaXN0ZXIgRklTIHdpdGggQlNZIHN0YXR1cyAiCisJCQkJCSIweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJc3RwX3JlcSwKKwkJCQkJZnJhbWVfaGVhZGVyLT5zdGF0dXMpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfYnVmZmVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJCSAgICAgICh2b2lkICoqKSZmcmFtZV9idWZmZXIpOworCisJCQlzY2lfY29udHJvbGxlcl9jb3B5X3NhdGFfcmVzcG9uc2UoJmlyZXEtPnN0cC5yZXEsCisJCQkJCQkJICAgICAgIGZyYW1lX2hlYWRlciwKKwkJCQkJCQkgICAgICAgZnJhbWVfYnVmZmVyKTsKKworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfQ0hFQ0tfUkVTUE9OU0U7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQ7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIEZJWE1FOiB3aGF0IGRvIHdlIGRvIGhlcmU/ICovCisJCQlicmVhazsKKwkJfQorCisJCS8qIEZyYW1lIGlzIGRlY29kZWQgcmV0dXJuIGl0IHRvIHRoZSBjb250cm9sbGVyICovCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWNhc2UgU0NJX1JFUV9TVFBfUElPX0RBVEFfSU46IHsKKwkJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCQlzdHJ1Y3Qgc2F0YV9maXNfZGF0YSAqZnJhbWVfYnVmZmVyOworCisJCXN0YXR1cyA9IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICAgZnJhbWVfaW5kZXgsCisJCQkJCQkJCSAgICAgICAodm9pZCAqKikmZnJhbWVfaGVhZGVyKTsKKworCQlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogU0NJQyBJTyBSZXF1ZXN0IDB4JXAgY291bGQgbm90IGdldCBmcmFtZSAiCisJCQkJImhlYWRlciBmb3IgZnJhbWUgaW5kZXggJWQsIHN0YXR1cyAleFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzdHBfcmVxLAorCQkJCWZyYW1lX2luZGV4LAorCQkJCXN0YXR1cyk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJaWYgKGZyYW1lX2hlYWRlci0+ZmlzX3R5cGUgIT0gRklTX0RBVEEpIHsKKwkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lDIFBJTyBSZXF1ZXN0IDB4JXAgcmVjZWl2ZWQgZnJhbWUgJWQgIgorCQkJCSJ3aXRoIGZpcyB0eXBlIDB4JTAyeCB3aGVuIGV4cGVjdGluZyBhIGRhdGEgIgorCQkJCSJmaXMuXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXN0cF9yZXEsCisJCQkJZnJhbWVfaW5kZXgsCisJCQkJZnJhbWVfaGVhZGVyLT5maXNfdHlwZSk7CisKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVRVUlSRVNfU0NTSV9BQk9SVDsKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisKKwkJCS8qIEZyYW1lIGlzIGRlY29kZWQgcmV0dXJuIGl0IHRvIHRoZSBjb250cm9sbGVyICovCisJCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJaWYgKHN0cF9yZXEtPnNnbC5pbmRleCA8IDApIHsKKwkJCWlyZXEtPnNhdmVkX3J4X2ZyYW1lX2luZGV4ID0gZnJhbWVfaW5kZXg7CisJCQlzdHBfcmVxLT5waW9fbGVuID0gMDsKKwkJfSBlbHNlIHsKKwkJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCQkgICAgICBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICAgICAgKHZvaWQgKiopJmZyYW1lX2J1ZmZlcik7CisKKwkJCXN0YXR1cyA9IHNjaV9zdHBfcmVxdWVzdF9waW9fZGF0YV9pbl9jb3B5X2RhdGEoc3RwX3JlcSwKKwkJCQkJCQkJCSAgICAodTggKilmcmFtZV9idWZmZXIpOworCisJCQkvKiBGcmFtZSBpcyBkZWNvZGVkIHJldHVybiBpdCB0byB0aGUgY29udHJvbGxlciAqLworCQkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIHRoZSBlbmQgb2YgdGhlIHRyYW5zZmVyLCBhcmUgdGhlcmUgbW9yZQorCQkgKiBieXRlcyByZW1haW5pbmcgZm9yIHRoaXMgZGF0YSB0cmFuc2ZlcgorCQkgKi8KKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUyB8fCBzdHBfcmVxLT5waW9fbGVuICE9IDApCisJCQlyZXR1cm4gc3RhdHVzOworCisJCWlmICgoc3RwX3JlcS0+c3RhdHVzICYgQVRBX0JVU1kpID09IDApIHsKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEOworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJfSBlbHNlIHsKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9GUkFNRSk7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9EMkg6IHsKKwkJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCQl1MzIgKmZyYW1lX2J1ZmZlcjsKKworCQlzdGF0dXMgPSBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfaGVhZGVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCQkJICAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAgKHZvaWQgKiopJmZyYW1lX2hlYWRlcik7CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lDIElPIFJlcXVlc3QgMHglcCBjb3VsZCBub3QgZ2V0IGZyYW1lICIKKwkJCQkiaGVhZGVyIGZvciBmcmFtZSBpbmRleCAlZCwgc3RhdHVzICV4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXN0cF9yZXEsCisJCQkJZnJhbWVfaW5kZXgsCisJCQkJc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlzd2l0Y2ggKGZyYW1lX2hlYWRlci0+ZmlzX3R5cGUpIHsKKwkJY2FzZSBGSVNfUkVHRDJIOgorCQkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJCSAgICAgIGZyYW1lX2luZGV4LAorCQkJCQkJCQkgICAgICAodm9pZCAqKikmZnJhbWVfYnVmZmVyKTsKKworCQkJc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKCZpcmVxLT5zdHAucnNwLAorCQkJCQkJCSAgICAgICBmcmFtZV9oZWFkZXIsCisJCQkJCQkJICAgICAgIGZyYW1lX2J1ZmZlcik7CisKKwkJCS8qIFRoZSBjb21tYW5kIGhhcyBjb21wbGV0ZWQgd2l0aCBlcnJvciAqLworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfQ0hFQ0tfUkVTUE9OU0U7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJICIlczogSU8gUmVxdWVzdDoweCVwIEZyYW1lIElkOiVkIHByb3RvY29sICIKKwkJCQkgInZpb2xhdGlvbiBvY2N1cnJlZFxuIiwKKwkJCQkgX19mdW5jX18sCisJCQkJIHN0cF9yZXEsCisJCQkJIGZyYW1lX2luZGV4KTsKKworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfVU5FWFBfRklTOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX1BST1RPQ09MX1ZJT0xBVElPTjsKKwkJCWJyZWFrOworCQl9CisKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKworCQkvKiBGcmFtZSBoYXMgYmVlbiBkZWNvZGVkIHJldHVybiBpdCB0byB0aGUgY29udHJvbGxlciAqLworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJY2FzZSBTQ0lfUkVRX0FCT1JUSU5HOgorCQkvKgorCQkgKiBUT0RPOiBJcyBpdCBldmVuIHBvc3NpYmxlIHRvIGdldCBhbiB1bnNvbGljaXRlZCBmcmFtZSBpbiB0aGUKKwkJICogYWJvcnRpbmcgc3RhdGU/CisJCSAqLworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogU0NJQyBJTyBSZXF1ZXN0IGdpdmVuIHVuZXhwZWN0ZWQgZnJhbWUgJXggd2hpbGUgIgorCQkJICJpbiBzdGF0ZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywKKwkJCSBmcmFtZV9pbmRleCwKKwkJCSBzdGF0ZSk7CisKKwkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9TVEFURTsKKwl9Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgc3RwX3JlcXVlc3RfdWRtYV9hd2FpdF90Y19ldmVudChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJICAgICAgIHUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOworCisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1VORVhQX0ZJUyk6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX1JFR19FUlIpOgorCQkvKiBXZSBtdXN0IGNoZWNrIHRoZXIgcmVzcG9uc2UgYnVmZmVyIHRvIHNlZSBpZiB0aGUgRDJICisJCSAqIFJlZ2lzdGVyIEZJUyB3YXMgcmVjZWl2ZWQgYmVmb3JlIHdlIGdvdCB0aGUgVEMKKwkJICogY29tcGxldGlvbi4KKwkJICovCisJCWlmIChpcmVxLT5zdHAucnNwLmZpc190eXBlID09IEZJU19SRUdEMkgpIHsKKwkJCXNjaV9yZW1vdGVfZGV2aWNlX3N1c3BlbmQoaXJlcS0+dGFyZ2V0X2RldmljZSwKKwkJCQlTQ1VfRVZFTlRfU1BFQ0lGSUMoU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSk7CisKKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEOworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHdlIGhhdmUgYW4gZXJyb3IgY29tcGxldGlvbiBzdGF0dXMgZm9yIHRoZQorCQkJICogVEMgdGhlbiB3ZSBjYW4gZXhwZWN0IGEgRDJIIHJlZ2lzdGVyIEZJUyBmcm9tCisJCQkgKiB0aGUgZGV2aWNlIHNvIHdlIG11c3QgY2hhbmdlIHN0YXRlIHRvIHdhaXQKKwkJCSAqIGZvciBpdAorCQkJICovCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9TVFBfVURNQV9XQUlUX0QySCk7CisJCX0KKwkJYnJlYWs7CisKKwkvKiBUT0RPIENoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlc2UgY29tcGxldGlvbiBzdGF0dXMgbmVlZCB0bworCSAqIHdhaXQgZm9yIHRoZSBkZXZpY2UgdG8gaG9zdCByZWdpc3RlciBmaXMuCisJICovCisJLyogVE9ETyBXZSBjYW4gcmV0cnkgdGhlIGNvbW1hbmQgZm9yIFNDVV9UQVNLX0RPTkVfQ01EX0xMX1JfRVJSCisJICogLSB0aGlzIGNvbWVzIG9ubHkgZm9yIEIwCisJICovCisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0lOVl9GSVNfTEVOKToKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfTUFYX1BMRF9FUlIpOgorCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9MTF9SX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0NNRF9MTF9SX0VSUik6CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0NSQ19FUlIpOgorCQlzY2lfcmVtb3RlX2RldmljZV9zdXNwZW5kKGlyZXEtPnRhcmdldF9kZXZpY2UsCisJCQlTQ1VfRVZFTlRfU1BFQ0lGSUMoU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSk7CisJLyogRmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IGNhc2UgKi8KKwlkZWZhdWx0OgorCQkvKiBBbGwgb3RoZXIgY29tcGxldGlvbiBzdGF0dXMgY2F1c2UgdGhlIElPIHRvIGJlIGNvbXBsZXRlLiAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3N0cF9yZXF1ZXN0X3NvZnRfcmVzZXRfYXdhaXRfaDJkX2Fzc2VydGVkX3RjX2V2ZW50KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkgICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCXN3aXRjaCAoU0NVX0dFVF9DT01QTEVUSU9OX1RMX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSB7CisJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0dPT0QpOgorCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0RJQUcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qCisJCSAqIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUgY29tcGxldGUuCisJCSAqIElmIGEgTkFLIHdhcyByZWNlaXZlZCwgdGhlbiBpdCBpcyB1cCB0byB0aGUgdXNlciB0byByZXRyeQorCQkgKiB0aGUgcmVxdWVzdC4KKwkJICovCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSk7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFNDSV9TVUNDRVNTOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzCitzdHBfcmVxdWVzdF9zb2Z0X3Jlc2V0X2F3YWl0X2gyZF9kaWFnbm9zdGljX3RjX2V2ZW50KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkgICAgIHUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9EMkgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUgY29tcGxldGUuICBJZgorCQkgKiBhIE5BSyB3YXMgcmVjZWl2ZWQsIHRoZW4gaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gcmV0cnkgdGhlCisJCSAqIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworZW51bSBzY2lfc3RhdHVzCitzY2lfaW9fcmVxdWVzdF90Y19jb21wbGV0aW9uKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJICB1MzIgY29tcGxldGlvbl9jb2RlKQoreworCWVudW0gc2NpX2Jhc2VfcmVxdWVzdF9zdGF0ZXMgc3RhdGU7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKworCXN0YXRlID0gaXJlcS0+c20uY3VycmVudF9zdGF0ZV9pZDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9SRVFfU1RBUlRFRDoKKwkJcmV0dXJuIHJlcXVlc3Rfc3RhcnRlZF9zdGF0ZV90Y19ldmVudChpcmVxLCBjb21wbGV0aW9uX2NvZGUpOworCisJY2FzZSBTQ0lfUkVRX1RBU0tfV0FJVF9UQ19DT01QOgorCQlyZXR1cm4gc3NwX3Rhc2tfcmVxdWVzdF9hd2FpdF90Y19ldmVudChpcmVxLAorCQkJCQkJICAgICAgIGNvbXBsZXRpb25fY29kZSk7CisKKwljYXNlIFNDSV9SRVFfU01QX1dBSVRfUkVTUDoKKwkJcmV0dXJuIHNtcF9yZXF1ZXN0X2F3YWl0X3Jlc3BvbnNlX3RjX2V2ZW50KGlyZXEsCisJCQkJCQkJICAgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TTVBfV0FJVF9UQ19DT01QOgorCQlyZXR1cm4gc21wX3JlcXVlc3RfYXdhaXRfdGNfZXZlbnQoaXJlcSwgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TVFBfVURNQV9XQUlUX1RDX0NPTVA6CisJCXJldHVybiBzdHBfcmVxdWVzdF91ZG1hX2F3YWl0X3RjX2V2ZW50KGlyZXEsCisJCQkJCQkgICAgICAgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9IMkQ6CisJCXJldHVybiBzdHBfcmVxdWVzdF9ub25fZGF0YV9hd2FpdF9oMmRfdGNfZXZlbnQoaXJlcSwKKwkJCQkJCQkgICAgICAgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TVFBfUElPX1dBSVRfSDJEOgorCQlyZXR1cm4gc3RwX3JlcXVlc3RfcGlvX2F3YWl0X2gyZF9jb21wbGV0aW9uX3RjX2V2ZW50KGlyZXEsCisJCQkJCQkJCSAgICAgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TVFBfUElPX0RBVEFfT1VUOgorCQlyZXR1cm4gcGlvX2RhdGFfb3V0X3R4X2RvbmVfdGNfZXZlbnQoaXJlcSwgY29tcGxldGlvbl9jb2RlKTsKKworCWNhc2UgU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0gyRF9BU1NFUlRFRDoKKwkJcmV0dXJuIHN0cF9yZXF1ZXN0X3NvZnRfcmVzZXRfYXdhaXRfaDJkX2Fzc2VydGVkX3RjX2V2ZW50KGlyZXEsCisJCQkJCQkJCQkgIGNvbXBsZXRpb25fY29kZSk7CisKKwljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfRElBRzoKKwkJcmV0dXJuIHN0cF9yZXF1ZXN0X3NvZnRfcmVzZXRfYXdhaXRfaDJkX2RpYWdub3N0aWNfdGNfZXZlbnQoaXJlcSwKKwkJCQkJCQkJCSAgICBjb21wbGV0aW9uX2NvZGUpOworCisJY2FzZSBTQ0lfUkVRX0FCT1JUSU5HOgorCQlyZXR1cm4gcmVxdWVzdF9hYm9ydGluZ19zdGF0ZV90Y19ldmVudChpcmVxLAorCQkJCQkJICAgICAgIGNvbXBsZXRpb25fY29kZSk7CisKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IFNDSUMgSU8gUmVxdWVzdCBnaXZlbiB0YXNrIGNvbXBsZXRpb24gIgorCQkJICJub3RpZmljYXRpb24gJXggd2hpbGUgaW4gd3Jvbmcgc3RhdGUgJWRcbiIsCisJCQkgX19mdW5jX18sCisJCQkgY29tcGxldGlvbl9jb2RlLAorCQkJIHN0YXRlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CisJfQorfQorCisvKioKKyAqIGlzY2lfcmVxdWVzdF9wcm9jZXNzX3Jlc3BvbnNlX2l1KCkgLSBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHN0YXR1cyBhbmQKKyAqICAgIHJlc3BvbnNlIGl1LCBpbiB0aGUgdGFzayBzdHJ1Y3QsIGZyb20gdGhlIHJlcXVlc3Qgb2JqZWN0IGZvciB0aGUgdXBwZXIKKyAqICAgIGxheWVyIGRyaXZlci4KKyAqIEBzYXNfdGFzazogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIHRhc2sgc3RydWN0IGZyb20gdGhlIHVwcGVyIGxheWVyIGRyaXZlci4KKyAqIEByZXNwX2l1OiBUaGlzIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIHJlc3BvbnNlIGl1IG9mIHRoZSBjb21wbGV0ZWQgcmVxdWVzdC4KKyAqIEBkZXY6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbGludXggZGV2aWNlIHN0cnVjdC4KKyAqCisgKiBub25lLgorICovCitzdGF0aWMgdm9pZCBpc2NpX3JlcXVlc3RfcHJvY2Vzc19yZXNwb25zZV9pdSgKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssCisJc3RydWN0IHNzcF9yZXNwb25zZV9pdSAqcmVzcF9pdSwKKwlzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2X2RiZyhkZXYsCisJCSIlczogcmVzcF9pdSA9ICVwICIKKwkJInJlc3BfaXUtPnN0YXR1cyA9IDB4JXgsXG5yZXNwX2l1LT5kYXRhcHJlcyA9ICVkICIKKwkJInJlc3BfaXUtPnJlc3BvbnNlX2RhdGFfbGVuID0gJXgsICIKKwkJInJlc3BfaXUtPnNlbnNlX2RhdGFfbGVuID0gJXhcbnJlcHNvbnNlIGRhdGE6ICIsCisJCV9fZnVuY19fLAorCQlyZXNwX2l1LAorCQlyZXNwX2l1LT5zdGF0dXMsCisJCXJlc3BfaXUtPmRhdGFwcmVzLAorCQlyZXNwX2l1LT5yZXNwb25zZV9kYXRhX2xlbiwKKwkJcmVzcF9pdS0+c2Vuc2VfZGF0YV9sZW4pOworCisJdGFzay0+dGFza19zdGF0dXMuc3RhdCA9IHJlc3BfaXUtPnN0YXR1czsKKworCS8qIGxpYnNhcyB1cGRhdGVzIHRoZSB0YXNrIHN0YXR1cyBmaWVsZHMgYmFzZWQgb24gdGhlIHJlc3BvbnNlIGl1LiAqLworCXNhc19zc3BfdGFza19yZXNwb25zZShkZXYsIHRhc2ssIHJlc3BfaXUpOworfQorCisvKioKKyAqIGlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKCkgLSBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBJL08KKyAqICAgIGNvbXBsZXRpb24gZm9yIE9QRU5fUkVKRUNUIGNvbmRpdGlvbnMuCisgKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbXBsZXRlZCBpc2NpX3JlcXVlc3Qgb2JqZWN0LgorICogQHJlc3BvbnNlX3B0cjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIGZvciB0aGUgSS9PLgorICogQHN0YXR1c19wdHI6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZXhlYyBzdGF0dXMgZm9yIHRoZSBJL08uCisgKiBAY29tcGxldGVfdG9faG9zdF9wdHI6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgYWN0aW9uIHRvIGJlIHRha2VuIGJ5CisgKiAgICB0aGUgTExERCB3aXRoIHJlc3BlY3QgdG8gY29tcGxldGluZyB0aGlzIHJlcXVlc3Qgb3IgZm9yY2luZyBhbiBhYm9ydAorICogICAgY29uZGl0aW9uIG9uIHRoZSBJL08uCisgKiBAb3Blbl9yZWpfcmVhc29uOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGVuY29kZWQgcmVhc29uIGZvciB0aGUKKyAqICAgIGFiYW5kb24tY2xhc3MgcmVqZWN0LgorICoKKyAqIG5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3QsCisJc3RydWN0IHNhc190YXNrICp0YXNrLAorCWVudW0gc2VydmljZV9yZXNwb25zZSAqcmVzcG9uc2VfcHRyLAorCWVudW0gZXhlY19zdGF0dXMgKnN0YXR1c19wdHIsCisJZW51bSBpc2NpX2NvbXBsZXRpb25fc2VsZWN0aW9uICpjb21wbGV0ZV90b19ob3N0X3B0ciwKKwllbnVtIHNhc19vcGVuX3Jlal9yZWFzb24gb3Blbl9yZWpfcmVhc29uKQoreworCS8qIFRhc2sgaW4gdGhlIHRhcmdldCBpcyBkb25lLiAqLworCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisJKnJlc3BvbnNlX3B0ciAgICAgICAgICAgICAgICAgICAgID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJKnN0YXR1c19wdHIgICAgICAgICAgICAgICAgICAgICAgID0gU0FTX09QRU5fUkVKRUNUOworCSpjb21wbGV0ZV90b19ob3N0X3B0ciAgICAgICAgICAgICA9IGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjsKKwl0YXNrLT50YXNrX3N0YXR1cy5vcGVuX3Jlal9yZWFzb24gPSBvcGVuX3Jlal9yZWFzb247Cit9CisKKy8qKgorICogaXNjaV9yZXF1ZXN0X2hhbmRsZV9jb250cm9sbGVyX3NwZWNpZmljX2Vycm9ycygpIC0gVGhpcyBmdW5jdGlvbiBkZWNvZGVzCisgKiAgICBjb250cm9sbGVyLXNwZWNpZmljIEkvTyBjb21wbGV0aW9uIGVycm9yIGNvbmRpdGlvbnMuCisgKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbXBsZXRlZCBpc2NpX3JlcXVlc3Qgb2JqZWN0LgorICogQHJlc3BvbnNlX3B0cjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIGZvciB0aGUgSS9PLgorICogQHN0YXR1c19wdHI6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZXhlYyBzdGF0dXMgZm9yIHRoZSBJL08uCisgKiBAY29tcGxldGVfdG9faG9zdF9wdHI6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgYWN0aW9uIHRvIGJlIHRha2VuIGJ5CisgKiAgICB0aGUgTExERCB3aXRoIHJlc3BlY3QgdG8gY29tcGxldGluZyB0aGlzIHJlcXVlc3Qgb3IgZm9yY2luZyBhbiBhYm9ydAorICogICAgY29uZGl0aW9uIG9uIHRoZSBJL08uCisgKgorICogbm9uZS4KKyAqLworc3RhdGljIHZvaWQgaXNjaV9yZXF1ZXN0X2hhbmRsZV9jb250cm9sbGVyX3NwZWNpZmljX2Vycm9ycygKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3QsCisJc3RydWN0IHNhc190YXNrICp0YXNrLAorCWVudW0gc2VydmljZV9yZXNwb25zZSAqcmVzcG9uc2VfcHRyLAorCWVudW0gZXhlY19zdGF0dXMgKnN0YXR1c19wdHIsCisJZW51bSBpc2NpX2NvbXBsZXRpb25fc2VsZWN0aW9uICpjb21wbGV0ZV90b19ob3N0X3B0cikKK3sKKwl1bnNpZ25lZCBpbnQgY3N0YXR1czsKKworCWNzdGF0dXMgPSByZXF1ZXN0LT5zY3Vfc3RhdHVzOworCisJZGV2X2RiZygmcmVxdWVzdC0+aXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogJXAgU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlIgIgorCQkiLSBjb250cm9sbGVyIHN0YXR1cyA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCByZXF1ZXN0LCBjc3RhdHVzKTsKKworCS8qIERlY29kZSB0aGUgY29udHJvbGxlci1zcGVjaWZpYyBlcnJvcnM7IG1vc3QKKwkgKiBpbXBvcnRhbnQgaXMgdG8gcmVjb2duaXplIHRob3NlIGNvbmRpdGlvbnMgaW4gd2hpY2gKKwkgKiB0aGUgdGFyZ2V0IG1heSBzdGlsbCBoYXZlIGEgdGFzayBvdXRzdGFuZGluZyB0aGF0CisJICogbXVzdCBiZSBhYm9ydGVkLgorCSAqCisJICogTm90ZSB0aGF0IHRoZXJlIGFyZSBTQ1UgY29tcGxldGlvbiBjb2RlcyBiZWluZworCSAqIG5hbWVkIGluIHRoZSBkZWNvZGUgYmVsb3cgZm9yIHdoaWNoIFNDSUMgaGFzIGFscmVhZHkKKwkgKiBkb25lIHdvcmsgdG8gaGFuZGxlIHRoZW0gaW4gYSB3YXkgb3RoZXIgdGhhbiBhcworCSAqIGEgY29udHJvbGxlci1zcGVjaWZpYyBjb21wbGV0aW9uIGNvZGU7IHRoZXNlIGFyZSBsZWZ0CisJICogaW4gdGhlIGRlY29kZSBiZWxvdyBmb3IgY29tcGxldGVuZXNzIHNha2UuCisJICovCisJc3dpdGNoIChjc3RhdHVzKSB7CisJY2FzZSBTQ1VfVEFTS19ET05FX0RNQVNFVFVQX0RJUkVSUjoKKwkvKiBBbHNvIFNDVV9UQVNLX0RPTkVfU01QX0ZSTV9UWVBFX0VSUjogKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfWEZFUkNOVF9FUlI6CisJCS8qIEFsc28gU0NVX1RBU0tfRE9ORV9TTVBfVUZJX0VSUjogKi8KKwkJaWYgKHRhc2stPnRhc2tfcHJvdG8gPT0gU0FTX1BST1RPQ09MX1NNUCkgeworCQkJLyogU0NVX1RBU0tfRE9ORV9TTVBfVUZJX0VSUiA9PSBUYXNrIERvbmUuICovCisJCQkqcmVzcG9uc2VfcHRyID0gU0FTX1RBU0tfQ09NUExFVEU7CisKKwkJCS8qIFNlZSBpZiB0aGUgZGV2aWNlIGhhcyBiZWVuL2lzIGJlaW5nIHN0b3BwZWQuIE5vdGUKKwkJCSAqIHRoYXQgd2UgaWdub3JlIHRoZSBxdWllc2NlIHN0YXRlLCBzaW5jZSB3ZSBhcmUKKwkJCSAqIGNvbmNlcm5lZCBhYm91dCB0aGUgYWN0dWFsIGRldmljZSBzdGF0ZS4KKwkJCSAqLworCQkJaWYgKCFpZGV2KQorCQkJCSpzdGF0dXNfcHRyID0gU0FTX0RFVklDRV9VTktOT1dOOworCQkJZWxzZQorCQkJCSpzdGF0dXNfcHRyID0gU0FTX0FCT1JURURfVEFTSzsKKworCQkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKworCQkJKmNvbXBsZXRlX3RvX2hvc3RfcHRyID0KKwkJCQlpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCX0gZWxzZSB7CisJCQkvKiBUYXNrIGluIHRoZSB0YXJnZXQgaXMgbm90IGRvbmUuICovCisJCQkqcmVzcG9uc2VfcHRyID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisKKwkJCWlmICghaWRldikKKwkJCQkqc3RhdHVzX3B0ciA9IFNBU19ERVZJQ0VfVU5LTk9XTjsKKwkJCWVsc2UKKwkJCQkqc3RhdHVzX3B0ciA9IFNBTV9TVEFUX1RBU0tfQUJPUlRFRDsKKworCQkJY2xlYXJfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCisJCQkqY29tcGxldGVfdG9faG9zdF9wdHIgPQorCQkJCWlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9UQVNLX0RPTkVfQ1JDX0VSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfTkFLX0NNRF9FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX0VYQ0VTU19EQVRBOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9VTkVYUF9GSVM6CisJLyogQWxzbyBTQ1VfVEFTS19ET05FX1VORVhQX1JFU1A6ICovCisJY2FzZSBTQ1VfVEFTS19ET05FX1ZJSVRfRU5UUllfTlY6ICAgICAgIC8qIFRPRE8gLSBjb25kaXRpb25zPyAqLworCWNhc2UgU0NVX1RBU0tfRE9ORV9JSVRfRU5UUllfTlY6ICAgICAgICAvKiBUT0RPIC0gY29uZGl0aW9ucz8gKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfUk5DTlZfT1VUQk9VTkQ6ICAgICAgLyogVE9ETyAtIGNvbmRpdGlvbnM/ICovCisJCS8qIFRoZXNlIGFyZSBjb25kaXRpb25zIGluIHdoaWNoIHRoZSB0YXJnZXQKKwkJICogaGFzIGNvbXBsZXRlZCB0aGUgdGFzaywgc28gdGhhdCBubyBjbGVhbnVwCisJCSAqIGlzIG5lY2Vzc2FyeS4KKwkJICovCisJCSpyZXNwb25zZV9wdHIgPSBTQVNfVEFTS19DT01QTEVURTsKKworCQkvKiBTZWUgaWYgdGhlIGRldmljZSBoYXMgYmVlbi9pcyBiZWluZyBzdG9wcGVkLiBOb3RlCisJCSAqIHRoYXQgd2UgaWdub3JlIHRoZSBxdWllc2NlIHN0YXRlLCBzaW5jZSB3ZSBhcmUKKwkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkgKi8KKwkJaWYgKCFpZGV2KQorCQkJKnN0YXR1c19wdHIgPSBTQVNfREVWSUNFX1VOS05PV047CisJCWVsc2UKKwkJCSpzdGF0dXNfcHRyID0gU0FTX0FCT1JURURfVEFTSzsKKworCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCisJCSpjb21wbGV0ZV90b19ob3N0X3B0ciA9IGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjsKKwkJYnJlYWs7CisKKworCS8qIE5vdGUgdGhhdCB0aGUgb25seSBvcGVuIHJlamVjdCBjb21wbGV0aW9uIGNvZGVzIHNlZW4gaGVyZSB3aWxsIGJlCisJICogYWJhbmRvbi1jbGFzcyBjb2RlczsgYWxsIG90aGVycyBhcmUgYXV0b21hdGljYWxseSByZXRyaWVkIGluIHRoZSBTQ1UuCisJICovCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9XUk9OR19ERVNUSU5BVElPTjoKKworCQlpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwkJCXJlcXVlc3QsIHRhc2ssIHJlc3BvbnNlX3B0ciwgc3RhdHVzX3B0ciwKKwkJCWNvbXBsZXRlX3RvX2hvc3RfcHRyLCBTQVNfT1JFSl9XUk9OR19ERVNUKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9UQVNLX09QRU5fUkVKRUNUX1pPTkVfVklPTEFUSU9OOgorCisJCS8qIE5vdGUgLSB0aGUgcmV0dXJuIG9mIEFCMCB3aWxsIGNoYW5nZSB3aGVuCisJCSAqIGxpYnNhcyBpbXBsZW1lbnRzIGRldGVjdGlvbiBvZiB6b25lIHZpb2xhdGlvbnMuCisJCSAqLworCQlpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwkJCXJlcXVlc3QsIHRhc2ssIHJlc3BvbnNlX3B0ciwgc3RhdHVzX3B0ciwKKwkJCWNvbXBsZXRlX3RvX2hvc3RfcHRyLCBTQVNfT1JFSl9SRVNWX0FCMCk7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9SRVNFUlZFRF9BQkFORE9OXzE6CisKKwkJaXNjaV9yZXF1ZXN0X3NldF9vcGVuX3JlamVjdF9zdGF0dXMoCisJCQlyZXF1ZXN0LCB0YXNrLCByZXNwb25zZV9wdHIsIHN0YXR1c19wdHIsCisJCQljb21wbGV0ZV90b19ob3N0X3B0ciwgU0FTX09SRUpfUkVTVl9BQjEpOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfUkVTRVJWRURfQUJBTkRPTl8yOgorCisJCWlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKAorCQkJcmVxdWVzdCwgdGFzaywgcmVzcG9uc2VfcHRyLCBzdGF0dXNfcHRyLAorCQkJY29tcGxldGVfdG9faG9zdF9wdHIsIFNBU19PUkVKX1JFU1ZfQUIyKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVV9UQVNLX09QRU5fUkVKRUNUX1JFU0VSVkVEX0FCQU5ET05fMzoKKworCQlpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwkJCXJlcXVlc3QsIHRhc2ssIHJlc3BvbnNlX3B0ciwgc3RhdHVzX3B0ciwKKwkJCWNvbXBsZXRlX3RvX2hvc3RfcHRyLCBTQVNfT1JFSl9SRVNWX0FCMyk7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9CQURfREVTVElOQVRJT046CisKKwkJaXNjaV9yZXF1ZXN0X3NldF9vcGVuX3JlamVjdF9zdGF0dXMoCisJCQlyZXF1ZXN0LCB0YXNrLCByZXNwb25zZV9wdHIsIHN0YXR1c19wdHIsCisJCQljb21wbGV0ZV90b19ob3N0X3B0ciwgU0FTX09SRUpfQkFEX0RFU1QpOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfU1RQX1JFU09VUkNFU19CVVNZOgorCisJCWlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKAorCQkJcmVxdWVzdCwgdGFzaywgcmVzcG9uc2VfcHRyLCBzdGF0dXNfcHRyLAorCQkJY29tcGxldGVfdG9faG9zdF9wdHIsIFNBU19PUkVKX1NUUF9OT1JFUyk7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9QUk9UT0NPTF9OT1RfU1VQUE9SVEVEOgorCisJCWlzY2lfcmVxdWVzdF9zZXRfb3Blbl9yZWplY3Rfc3RhdHVzKAorCQkJcmVxdWVzdCwgdGFzaywgcmVzcG9uc2VfcHRyLCBzdGF0dXNfcHRyLAorCQkJY29tcGxldGVfdG9faG9zdF9wdHIsIFNBU19PUkVKX0VQUk9UTyk7CisJCWJyZWFrOworCisJY2FzZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9DT05ORUNUSU9OX1JBVEVfTk9UX1NVUFBPUlRFRDoKKworCQlpc2NpX3JlcXVlc3Rfc2V0X29wZW5fcmVqZWN0X3N0YXR1cygKKwkJCXJlcXVlc3QsIHRhc2ssIHJlc3BvbnNlX3B0ciwgc3RhdHVzX3B0ciwKKwkJCWNvbXBsZXRlX3RvX2hvc3RfcHRyLCBTQVNfT1JFSl9DT05OX1JBVEUpOworCQlicmVhazsKKworCWNhc2UgU0NVX1RBU0tfRE9ORV9MTF9SX0VSUjoKKwkvKiBBbHNvIFNDVV9UQVNLX0RPTkVfQUNLX05BS19UTzogKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfTExfUEVSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfTExfU1lfVEVSTToKKwkvKiBBbHNvIFNDVV9UQVNLX0RPTkVfTkFLX0VSUjoqLworCWNhc2UgU0NVX1RBU0tfRE9ORV9MTF9MRl9URVJNOgorCS8qIEFsc28gU0NVX1RBU0tfRE9ORV9EQVRBX0xFTl9FUlI6ICovCisJY2FzZSBTQ1VfVEFTS19ET05FX0xMX0FCT1JUX0VSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfU0VRX0lOVl9UWVBFOgorCS8qIEFsc28gU0NVX1RBU0tfRE9ORV9VTkVYUF9YUjogKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfWFJfSVVfTEVOX0VSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfSU5WX0ZJU19MRU46CisJLyogQWxzbyBTQ1VfVEFTS19ET05FX1hSX1dEX0xFTjogKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfU0RNQV9FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX09GRlNFVF9FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX01BWF9QTERfRVJSOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9MRl9FUlI6CisJY2FzZSBTQ1VfVEFTS19ET05FX1NNUF9SRVNQX1RPX0VSUjogIC8qIEVzY2FsYXRlIHRvIGRldiByZXNldD8gKi8KKwljYXNlIFNDVV9UQVNLX0RPTkVfU01QX0xMX1JYX0VSUjoKKwljYXNlIFNDVV9UQVNLX0RPTkVfVU5FWFBfREFUQToKKwljYXNlIFNDVV9UQVNLX0RPTkVfVU5FWFBfU0RCRklTOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9SRUdfRVJSOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9TREJfRVJSOgorCWNhc2UgU0NVX1RBU0tfRE9ORV9UQVNLX0FCT1JUOgorCWRlZmF1bHQ6CisJCS8qIFRhc2sgaW4gdGhlIHRhcmdldCBpcyBub3QgZG9uZS4gKi8KKwkJKnJlc3BvbnNlX3B0ciA9IFNBU19UQVNLX1VOREVMSVZFUkVEOworCQkqc3RhdHVzX3B0ciA9IFNBTV9TVEFUX1RBU0tfQUJPUlRFRDsKKworCQlpZiAodGFzay0+dGFza19wcm90byA9PSBTQVNfUFJPVE9DT0xfU01QKSB7CisJCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCisJCQkqY29tcGxldGVfdG9faG9zdF9wdHIgPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCX0gZWxzZSB7CisJCQljbGVhcl9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisKKwkJCSpjb21wbGV0ZV90b19ob3N0X3B0ciA9IGlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOworCQl9CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBpc2NpX3Rhc2tfc2F2ZV9mb3JfdXBwZXJfbGF5ZXJfY29tcGxldGlvbigpIC0gVGhpcyBmdW5jdGlvbiBzYXZlcyB0aGUKKyAqICAgIHJlcXVlc3QgZm9yIGxhdGVyIGNvbXBsZXRpb24gdG8gdGhlIHVwcGVyIGxheWVyIGRyaXZlci4KKyAqIEBob3N0OiBUaGlzIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGhvc3Qgb24gd2hpY2ggdGhlIHRoZSByZXF1ZXN0CisgKiAgICBzaG91bGQgYmUgcXVldWVkIChlaXRoZXIgYXMgYW4gZXJyb3Igb3Igc3VjY2VzcykuCisgKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbXBsZXRlZCByZXF1ZXN0LgorICogQHJlc3BvbnNlOiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgcmVzcG9uc2UgY29kZSBmb3IgdGhlIGNvbXBsZXRlZCB0YXNrLgorICogQHN0YXR1czogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIHN0YXR1cyBjb2RlIGZvciB0aGUgY29tcGxldGVkIHRhc2suCisgKgorICogbm9uZS4KKyAqLworc3RhdGljIHZvaWQgaXNjaV90YXNrX3NhdmVfZm9yX3VwcGVyX2xheWVyX2NvbXBsZXRpb24oCisJc3RydWN0IGlzY2lfaG9zdCAqaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0LAorCWVudW0gc2VydmljZV9yZXNwb25zZSByZXNwb25zZSwKKwllbnVtIGV4ZWNfc3RhdHVzIHN0YXR1cywKKwllbnVtIGlzY2lfY29tcGxldGlvbl9zZWxlY3Rpb24gdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhyZXF1ZXN0KTsKKworCXRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbgorCQk9IGlzY2lfdGFza19zZXRfY29tcGxldGlvbl9zdGF0dXModGFzaywgcmVzcG9uc2UsIHN0YXR1cywKKwkJCQkJCSAgdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uKTsKKworCS8qIFRhc2tzIGFib3J0ZWQgc3BlY2lmaWNhbGx5IGJ5IGEgY2FsbCB0byB0aGUgbGxkZF9hYm9ydF90YXNrCisJICogZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjb21wbGV0ZWQgdG8gdGhlIGhvc3QgaW4gdGhlIHJlZ3VsYXIgcGF0aC4KKwkgKi8KKwlzd2l0Y2ggKHRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbikgeworCisJY2FzZSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb246CisKKwkJLyogTm9ybWFsIG5vdGlmaWNhdGlvbiAodGFza19kb25lKSAqLworCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IE5vcm1hbCAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQgKCVkKSwgc3RhdHVzPSVkICglZClcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXRhc2ssCisJCQl0YXNrLT50YXNrX3N0YXR1cy5yZXNwLCByZXNwb25zZSwKKwkJCXRhc2stPnRhc2tfc3RhdHVzLnN0YXQsIHN0YXR1cyk7CisJCS8qIEFkZCB0byB0aGUgY29tcGxldGVkIGxpc3QuICovCisJCWxpc3RfYWRkKCZyZXF1ZXN0LT5jb21wbGV0ZWRfbm9kZSwKKwkJCSAmaG9zdC0+cmVxdWVzdHNfdG9fY29tcGxldGUpOworCisJCS8qIFRha2UgdGhlIHJlcXVlc3Qgb2ZmIHRoZSBkZXZpY2UncyBwZW5kaW5nIHJlcXVlc3QgbGlzdC4gKi8KKwkJbGlzdF9kZWxfaW5pdCgmcmVxdWVzdC0+ZGV2X25vZGUpOworCQlicmVhazsKKworCWNhc2UgaXNjaV9wZXJmb3JtX2Fib3J0ZWRfaW9fY29tcGxldGlvbjoKKwkJLyogTm8gbm90aWZpY2F0aW9uIHRvIGxpYnNhcyBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcworCQkgKiBhbHJlYWR5IGluIHRoZSBhYm9ydCBwYXRoLgorCQkgKi8KKwkJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogQWJvcnRlZCAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQgKCVkKSwgc3RhdHVzPSVkICglZClcbiIsCisJCQkgX19mdW5jX18sCisJCQkgdGFzaywKKwkJCSB0YXNrLT50YXNrX3N0YXR1cy5yZXNwLCByZXNwb25zZSwKKwkJCSB0YXNrLT50YXNrX3N0YXR1cy5zdGF0LCBzdGF0dXMpOworCisJCS8qIFdha2UgdXAgd2hhdGV2ZXIgcHJvY2VzcyB3YXMgd2FpdGluZyBmb3IgdGhpcworCQkgKiByZXF1ZXN0IHRvIGNvbXBsZXRlLgorCQkgKi8KKwkJV0FSTl9PTihyZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb24gPT0gTlVMTCk7CisKKwkJaWYgKHJlcXVlc3QtPmlvX3JlcXVlc3RfY29tcGxldGlvbiAhPSBOVUxMKSB7CisKKwkJCS8qIFNpZ25hbCB3aG9ldmVyIGlzIHdhaXRpbmcgdGhhdCB0aGlzCisJCQkqIHJlcXVlc3QgaXMgY29tcGxldGUuCisJCQkqLworCQkJY29tcGxldGUocmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgaXNjaV9wZXJmb3JtX2Vycm9yX2lvX2NvbXBsZXRpb246CisJCS8qIFVzZSBzYXNfdGFza19hYm9ydCAqLworCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBFcnJvciAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQgKCVkKSwgc3RhdHVzPSVkICglZClcbiIsCisJCQkgX19mdW5jX18sCisJCQkgdGFzaywKKwkJCSB0YXNrLT50YXNrX3N0YXR1cy5yZXNwLCByZXNwb25zZSwKKwkJCSB0YXNrLT50YXNrX3N0YXR1cy5zdGF0LCBzdGF0dXMpOworCQkvKiBBZGQgdG8gdGhlIGFib3J0ZWQgbGlzdC4gKi8KKwkJbGlzdF9hZGQoJnJlcXVlc3QtPmNvbXBsZXRlZF9ub2RlLAorCQkJICZob3N0LT5yZXF1ZXN0c190b19lcnJvcmJhY2spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IFVua25vd24gLSB0YXNrID0gJXAsIHJlc3BvbnNlPSVkICglZCksIHN0YXR1cz0lZCAoJWQpXG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHRhc2ssCisJCQkgdGFzay0+dGFza19zdGF0dXMucmVzcCwgcmVzcG9uc2UsCisJCQkgdGFzay0+dGFza19zdGF0dXMuc3RhdCwgc3RhdHVzKTsKKworCQkvKiBBZGQgdG8gdGhlIGVycm9yIHRvIGxpYnNhcyBsaXN0LiAqLworCQlsaXN0X2FkZCgmcmVxdWVzdC0+Y29tcGxldGVkX25vZGUsCisJCQkgJmhvc3QtPnJlcXVlc3RzX3RvX2Vycm9yYmFjayk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgaXNjaV9yZXF1ZXN0X3Byb2Nlc3Nfc3RwX3Jlc3BvbnNlKHN0cnVjdCBzYXNfdGFzayAqdGFzaywKKwkJCQkJICAgICAgdm9pZCAqcmVzcG9uc2VfYnVmZmVyKQoreworCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgKmQyaF9yZWdfZmlzID0gcmVzcG9uc2VfYnVmZmVyOworCXN0cnVjdCB0YXNrX3N0YXR1c19zdHJ1Y3QgKnRzID0gJnRhc2stPnRhc2tfc3RhdHVzOworCXN0cnVjdCBhdGFfdGFza19yZXNwICpyZXNwID0gKHZvaWQgKikmdHMtPmJ1ZlswXTsKKworCXJlc3AtPmZyYW1lX2xlbiA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopKHJlc3BvbnNlX2J1ZmZlciArIDYpKTsKKwltZW1jcHkoJnJlc3AtPmVuZGluZ19maXNbMF0sIHJlc3BvbnNlX2J1ZmZlciArIDE2LCAyNCk7CisJdHMtPmJ1Zl92YWxpZF9zaXplID0gc2l6ZW9mKCpyZXNwKTsKKworCS8qKgorCSAqIElmIHRoZSBkZXZpY2UgZmF1bHQgYml0IGlzIHNldCBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyLCB0aGVuCisJICogc2V0IHRoZSBzZW5zZSBkYXRhIGFuZCByZXR1cm4uCisJICovCisJaWYgKGQyaF9yZWdfZmlzLT5zdGF0dXMgJiBBVEFfREYpCisJCXRzLT5zdGF0ID0gU0FTX1BST1RPX1JFU1BPTlNFOworCWVsc2UKKwkJdHMtPnN0YXQgPSBTQU1fU1RBVF9HT09EOworCisJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKK30KKworc3RhdGljIHZvaWQgaXNjaV9yZXF1ZXN0X2lvX3JlcXVlc3RfY29tcGxldGUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqcmVxdWVzdCwKKwkJCQkJICAgICBlbnVtIHNjaV9pb19zdGF0dXMgY29tcGxldGlvbl9zdGF0dXMpCit7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKHJlcXVlc3QpOworCXN0cnVjdCBzc3BfcmVzcG9uc2VfaXUgKnJlc3BfaXU7CisJdm9pZCAqcmVzcF9idWY7CisJdW5zaWduZWQgbG9uZyB0YXNrX2ZsYWdzOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBpc2NpX2xvb2t1cF9kZXZpY2UodGFzay0+ZGV2KTsKKwllbnVtIHNlcnZpY2VfcmVzcG9uc2UgcmVzcG9uc2UgICAgICAgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKwllbnVtIGV4ZWNfc3RhdHVzIHN0YXR1cyAgICAgICAgID0gU0FTX0FCT1JURURfVEFTSzsKKwllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgcmVxdWVzdF9zdGF0dXM7CisJZW51bSBpc2NpX2NvbXBsZXRpb25fc2VsZWN0aW9uIGNvbXBsZXRlX3RvX2hvc3QKKwkJPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IHJlcXVlc3QgPSAlcCwgdGFzayA9ICVwLFxuIgorCQkidGFzay0+ZGF0YV9kaXIgPSAlZCBjb21wbGV0aW9uX3N0YXR1cyA9IDB4JXhcbiIsCisJCV9fZnVuY19fLAorCQlyZXF1ZXN0LAorCQl0YXNrLAorCQl0YXNrLT5kYXRhX2RpciwKKwkJY29tcGxldGlvbl9zdGF0dXMpOworCisJc3Bpbl9sb2NrKCZyZXF1ZXN0LT5zdGF0ZV9sb2NrKTsKKwlyZXF1ZXN0X3N0YXR1cyA9IHJlcXVlc3QtPnN0YXR1czsKKworCS8qIERlY29kZSB0aGUgcmVxdWVzdCBzdGF0dXMuICBOb3RlIHRoYXQgaWYgdGhlIHJlcXVlc3QgaGFzIGJlZW4KKwkgKiBhYm9ydGVkIGJ5IGEgdGFzayBtYW5hZ2VtZW50IGZ1bmN0aW9uLCB3ZSBkb24ndCBjYXJlCisJICogd2hhdCB0aGUgc3RhdHVzIGlzLgorCSAqLworCXN3aXRjaCAocmVxdWVzdF9zdGF0dXMpIHsKKworCWNhc2UgYWJvcnRlZDoKKwkJLyogImFib3J0ZWQiIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0IHdhcyBhYm9ydGVkIGJ5IGEgdGFzaworCQkgKiBtYW5hZ2VtZW50IGZ1bmN0aW9uLCBzaW5jZSBvbmNlIGEgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3QgaXMKKwkJICogcGVyZm9tZWQgYnkgdGhlIGRldmljZSwgdGhlIHJlcXVlc3Qgb25seSBjb21wbGV0ZXMgYmVjYXVzZQorCQkgKiBvZiB0aGUgc3Vic2VxdWVudCBkcml2ZXIgdGVybWluYXRlLgorCQkgKgorCQkgKiBBYm9ydGVkIGFsc28gbWVhbnMgYW4gZXh0ZXJuYWwgdGhyZWFkIGlzIGV4cGxpY2l0bHkgbWFuYWdpbmcKKwkJICogdGhpcyByZXF1ZXN0LCBzbyB0aGF0IHdlIGRvIG5vdCBjb21wbGV0ZSBpdCB1cCB0aGUgc3RhY2suCisJCSAqCisJCSAqIFRoZSB0YXJnZXQgaXMgc3RpbGwgdGhlcmUgKHNpbmNlIHRoZSBUTUYgd2FzIHN1Y2Nlc3NmdWwpLgorCQkgKi8KKwkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKwkJcmVzcG9uc2UgPSBTQVNfVEFTS19DT01QTEVURTsKKworCQkvKiBTZWUgaWYgdGhlIGRldmljZSBoYXMgYmVlbi9pcyBiZWluZyBzdG9wcGVkLiBOb3RlCisJCSAqIHRoYXQgd2UgaWdub3JlIHRoZSBxdWllc2NlIHN0YXRlLCBzaW5jZSB3ZSBhcmUKKwkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkgKi8KKwkJaWYgKCFpZGV2KQorCQkJc3RhdHVzID0gU0FTX0RFVklDRV9VTktOT1dOOworCQllbHNlCisJCQlzdGF0dXMgPSBTQVNfQUJPUlRFRF9UQVNLOworCisJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fYWJvcnRlZF9pb19jb21wbGV0aW9uOworCQkvKiBUaGlzIHdhcyBhbiBhYm9ydGVkIHJlcXVlc3QuICovCisKKwkJc3Bpbl91bmxvY2soJnJlcXVlc3QtPnN0YXRlX2xvY2spOworCQlicmVhazsKKworCWNhc2UgYWJvcnRpbmc6CisJCS8qIGFib3J0aW5nIG1lYW5zIHRoYXQgdGhlIHRhc2sgbWFuYWdlbWVudCBmdW5jdGlvbiB0cmllZCBhbmQKKwkJICogZmFpbGVkIHRvIGFib3J0IHRoZSByZXF1ZXN0LiBXZSBuZWVkIHRvIG5vdGUgdGhlIHJlcXVlc3QKKwkJICogYXMgU0FTX1RBU0tfVU5ERUxJVkVSRUQsIHNvIHRoYXQgdGhlIHNjc2kgbWlkIGxheWVyIG1hcmtzIHRoZQorCQkgKiB0YXJnZXQgYXMgZG93bi4KKwkJICoKKwkJICogQWJvcnRpbmcgYWxzbyBtZWFucyBhbiBleHRlcm5hbCB0aHJlYWQgaXMgZXhwbGljaXRseSBtYW5hZ2luZworCQkgKiB0aGlzIHJlcXVlc3QsIHNvIHRoYXQgd2UgZG8gbm90IGNvbXBsZXRlIGl0IHVwIHRoZSBzdGFjay4KKwkJICovCisJCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisJCXJlc3BvbnNlID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisKKwkJaWYgKCFpZGV2KQorCQkJLyogVGhlIGRldmljZSBoYXMgYmVlbiAvaXMgYmVpbmcgc3RvcHBlZC4gTm90ZSB0aGF0CisJCQkgKiB3ZSBpZ25vcmUgdGhlIHF1aWVzY2Ugc3RhdGUsIHNpbmNlIHdlIGFyZQorCQkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkJICovCisJCQlzdGF0dXMgPSBTQVNfREVWSUNFX1VOS05PV047CisJCWVsc2UKKwkJCXN0YXR1cyA9IFNBU19QSFlfRE9XTjsKKworCQljb21wbGV0ZV90b19ob3N0ID0gaXNjaV9wZXJmb3JtX2Fib3J0ZWRfaW9fY29tcGxldGlvbjsKKworCQkvKiBUaGlzIHdhcyBhbiBhYm9ydGVkIHJlcXVlc3QuICovCisKKwkJc3Bpbl91bmxvY2soJnJlcXVlc3QtPnN0YXRlX2xvY2spOworCQlicmVhazsKKworCWNhc2UgdGVybWluYXRpbmc6CisKKwkJLyogVGhpcyB3YXMgYW4gdGVybWluYXRlZCByZXF1ZXN0LiAgVGhpcyBoYXBwZW5zIHdoZW4KKwkJICogdGhlIEkvTyBpcyBiZWluZyB0ZXJtaW5hdGVkIGJlY2F1c2Ugb2YgYW4gYWN0aW9uIG9uCisJCSAqIHRoZSBkZXZpY2UgKHJlc2V0LCB0ZWFyIGRvd24sIGV0Yy4pLCBhbmQgdGhlIEkvTyBuZWVkcworCQkgKiB0byBiZSBjb21wbGV0ZWQgdXAgdGhlIHN0YWNrLgorCQkgKi8KKwkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKwkJcmVzcG9uc2UgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKworCQkvKiBTZWUgaWYgdGhlIGRldmljZSBoYXMgYmVlbi9pcyBiZWluZyBzdG9wcGVkLiBOb3RlCisJCSAqIHRoYXQgd2UgaWdub3JlIHRoZSBxdWllc2NlIHN0YXRlLCBzaW5jZSB3ZSBhcmUKKwkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkgKi8KKwkJaWYgKCFpZGV2KQorCQkJc3RhdHVzID0gU0FTX0RFVklDRV9VTktOT1dOOworCQllbHNlCisJCQlzdGF0dXMgPSBTQVNfQUJPUlRFRF9UQVNLOworCisJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fYWJvcnRlZF9pb19jb21wbGV0aW9uOworCisJCS8qIFRoaXMgd2FzIGEgdGVybWluYXRlZCByZXF1ZXN0LiAqLworCisJCXNwaW5fdW5sb2NrKCZyZXF1ZXN0LT5zdGF0ZV9sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIGRlYWQ6CisJCS8qIFRoaXMgd2FzIGEgdGVybWluYXRlZCByZXF1ZXN0IHRoYXQgdGltZWQtb3V0IGR1cmluZyB0aGUKKwkJICogdGVybWluYXRpb24gcHJvY2Vzcy4gIFRoZXJlIGlzIG5vIHRhc2sgdG8gY29tcGxldGUgdG8KKwkJICogbGlic2FzLgorCQkgKi8KKwkJY29tcGxldGVfdG9faG9zdCA9IGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjsKKwkJc3Bpbl91bmxvY2soJnJlcXVlc3QtPnN0YXRlX2xvY2spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJLyogVGhlIHJlcXVlc3QgaXMgZG9uZSBmcm9tIGFuIFNDVSBIVyBwZXJzcGVjdGl2ZS4gKi8KKwkJcmVxdWVzdC0+c3RhdHVzID0gY29tcGxldGVkOworCisJCXNwaW5fdW5sb2NrKCZyZXF1ZXN0LT5zdGF0ZV9sb2NrKTsKKworCQkvKiBUaGlzIGlzIGFuIGFjdGl2ZSByZXF1ZXN0IGJlaW5nIGNvbXBsZXRlZCBmcm9tIHRoZSBjb3JlLiAqLworCQlzd2l0Y2ggKGNvbXBsZXRpb25fc3RhdHVzKSB7CisKKwkJY2FzZSBTQ0lfSU9fRkFJTFVSRV9SRVNQT05TRV9WQUxJRDoKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lfSU9fRkFJTFVSRV9SRVNQT05TRV9WQUxJRCAoJXAvJXApXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXJlcXVlc3QsCisJCQkJdGFzayk7CisKKwkJCWlmIChzYXNfcHJvdG9jb2xfYXRhKHRhc2stPnRhc2tfcHJvdG8pKSB7CisJCQkJcmVzcF9idWYgPSAmcmVxdWVzdC0+c3RwLnJzcDsKKwkJCQlpc2NpX3JlcXVlc3RfcHJvY2Vzc19zdHBfcmVzcG9uc2UodGFzaywKKwkJCQkJCQkJICByZXNwX2J1Zik7CisJCQl9IGVsc2UgaWYgKFNBU19QUk9UT0NPTF9TU1AgPT0gdGFzay0+dGFza19wcm90bykgeworCisJCQkJLyogY3JhY2sgdGhlIGl1IHJlc3BvbnNlIGJ1ZmZlci4gKi8KKwkJCQlyZXNwX2l1ID0gJnJlcXVlc3QtPnNzcC5yc3A7CisJCQkJaXNjaV9yZXF1ZXN0X3Byb2Nlc3NfcmVzcG9uc2VfaXUodGFzaywgcmVzcF9pdSwKKwkJCQkJCQkJICZpaG9zdC0+cGRldi0+ZGV2KTsKKworCQkJfSBlbHNlIGlmIChTQVNfUFJPVE9DT0xfU01QID09IHRhc2stPnRhc2tfcHJvdG8pIHsKKworCQkJCWRldl9lcnIoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSIlczogU0NJX0lPX0ZBSUxVUkVfUkVTUE9OU0VfVkFMSUQ6ICIKKwkJCQkJIlNBU19QUk9UT0NPTF9TTVAgcHJvdG9jb2xcbiIsCisJCQkJCV9fZnVuY19fKTsKKworCQkJfSBlbHNlCisJCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJIiVzOiB1bmtub3duIHByb3RvY29sXG4iLCBfX2Z1bmNfXyk7CisKKwkJCS8qIHVzZSB0aGUgdGFzayBzdGF0dXMgc2V0IGluIHRoZSB0YXNrIHN0cnVjdCBieSB0aGUKKwkJCSAqIGlzY2lfcmVxdWVzdF9wcm9jZXNzX3Jlc3BvbnNlX2l1IGNhbGwuCisJCQkgKi8KKwkJCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CisJCQlyZXNwb25zZSA9IHRhc2stPnRhc2tfc3RhdHVzLnJlc3A7CisJCQlzdGF0dXMgPSB0YXNrLT50YXNrX3N0YXR1cy5zdGF0OworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ0lfSU9fU1VDQ0VTUzoKKwkJY2FzZSBTQ0lfSU9fU1VDQ0VTU19JT19ET05FX0VBUkxZOgorCisJCQlyZXNwb25zZSA9IFNBU19UQVNLX0NPTVBMRVRFOworCQkJc3RhdHVzICAgPSBTQU1fU1RBVF9HT09EOworCQkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKworCQkJaWYgKHRhc2stPnRhc2tfcHJvdG8gPT0gU0FTX1BST1RPQ09MX1NNUCkgeworCQkJCXZvaWQgKnJzcCA9ICZyZXF1ZXN0LT5zbXAucnNwOworCisJCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJIiVzOiBTTVAgcHJvdG9jb2wgY29tcGxldGlvblxuIiwKKwkJCQkJX19mdW5jX18pOworCisJCQkJc2dfY29weV9mcm9tX2J1ZmZlcigKKwkJCQkJJnRhc2stPnNtcF90YXNrLnNtcF9yZXNwLCAxLAorCQkJCQlyc3AsIHNpemVvZihzdHJ1Y3Qgc21wX3Jlc3ApKTsKKwkJCX0gZWxzZSBpZiAoY29tcGxldGlvbl9zdGF0dXMKKwkJCQkgICA9PSBTQ0lfSU9fU1VDQ0VTU19JT19ET05FX0VBUkxZKSB7CisKKwkJCQkvKiBUaGlzIHdhcyBhbiBTU1AgLyBTVFAgLyBTQVRBIHRyYW5zZmVyLgorCQkJCSAqIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBsZXNzIGRhdGEgdGhhbgorCQkJCSAqIHRoZSBtYXhpbXVtIHdhcyB0cmFuc2ZlcnJlZC4KKwkJCQkgKi8KKwkJCQl1MzIgdHJhbnNmZXJyZWRfbGVuZ3RoID0gc2NpX3JlcV90eF9ieXRlcyhyZXF1ZXN0KTsKKworCQkJCXRhc2stPnRhc2tfc3RhdHVzLnJlc2lkdWFsCisJCQkJCT0gdGFzay0+dG90YWxfeGZlcl9sZW4gLSB0cmFuc2ZlcnJlZF9sZW5ndGg7CisKKwkJCQkvKiBJZiB0aGVyZSB3ZXJlIHJlc2lkdWFsIGJ5dGVzLCBjYWxsIHRoaXMgYW4KKwkJCQkgKiB1bmRlcnJ1bi4KKwkJCQkgKi8KKwkJCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzaWR1YWwgIT0gMCkKKwkJCQkJc3RhdHVzID0gU0FTX0RBVEFfVU5ERVJSVU47CisKKwkJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkiJXM6IFNDSV9JT19TVUNDRVNTX0lPX0RPTkVfRUFSTFkgJWRcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlzdGF0dXMpOworCisJCQl9IGVsc2UKKwkJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkiJXM6IFNDSV9JT19TVUNDRVNTXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0NJX0lPX0ZBSUxVUkVfVEVSTUlOQVRFRDoKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBTQ0lfSU9fRkFJTFVSRV9URVJNSU5BVEVEICglcC8lcClcbiIsCisJCQkJX19mdW5jX18sCisJCQkJcmVxdWVzdCwKKwkJCQl0YXNrKTsKKworCQkJLyogVGhlIHJlcXVlc3Qgd2FzIHRlcm1pbmF0ZWQgZXhwbGljaXRseS4gIE5vIGhhbmRsaW5nCisJCQkgKiBpcyBuZWVkZWQgaW4gdGhlIFNDU0kgZXJyb3IgaGFuZGxlciBwYXRoLgorCQkJICovCisJCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCQkJcmVzcG9uc2UgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKworCQkJLyogU2VlIGlmIHRoZSBkZXZpY2UgaGFzIGJlZW4vaXMgYmVpbmcgc3RvcHBlZC4gTm90ZQorCQkJICogdGhhdCB3ZSBpZ25vcmUgdGhlIHF1aWVzY2Ugc3RhdGUsIHNpbmNlIHdlIGFyZQorCQkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkJICovCisJCQlpZiAoIWlkZXYpCisJCQkJc3RhdHVzID0gU0FTX0RFVklDRV9VTktOT1dOOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IFNBU19BQk9SVEVEX1RBU0s7CisKKwkJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCQlicmVhazsKKworCQljYXNlIFNDSV9GQUlMVVJFX0NPTlRST0xMRVJfU1BFQ0lGSUNfSU9fRVJSOgorCisJCQlpc2NpX3JlcXVlc3RfaGFuZGxlX2NvbnRyb2xsZXJfc3BlY2lmaWNfZXJyb3JzKAorCQkJCWlkZXYsIHJlcXVlc3QsIHRhc2ssICZyZXNwb25zZSwgJnN0YXR1cywKKwkJCQkmY29tcGxldGVfdG9faG9zdCk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0NJX0lPX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRDoKKwkJCS8qIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UsIGluIHRoYXQgdGhlIEkvTyBjb21wbGV0aW9uCisJCQkgKiBpcyB0ZWxsaW5nIHVzIHRoYXQgdGhlIGRldmljZSBuZWVkcyBhIHJlc2V0LgorCQkJICogSW4gb3JkZXIgZm9yIHRoZSBkZXZpY2UgcmVzZXQgY29uZGl0aW9uIHRvIGJlCisJCQkgKiBub3RpY2VkLCB0aGUgSS9PIGhhcyB0byBiZSBoYW5kbGVkIGluIHRoZSBlcnJvcgorCQkJICogaGFuZGxlci4gIFNldCB0aGUgcmVzZXQgZmxhZyBhbmQgY2F1c2UgdGhlCisJCQkgKiBTQ1NJIGVycm9yIHRocmVhZCB0byBiZSBzY2hlZHVsZWQuCisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIHRhc2tfZmxhZ3MpOworCQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19ORUVEX0RFVl9SRVNFVDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgdGFza19mbGFncyk7CisKKwkJCS8qIEZhaWwgdGhlIEkvTy4gKi8KKwkJCXJlc3BvbnNlID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJCQlzdGF0dXMgPSBTQU1fU1RBVF9UQVNLX0FCT1JURUQ7CisKKwkJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fZXJyb3JfaW9fY29tcGxldGlvbjsKKwkJCWNsZWFyX2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NJX0ZBSUxVUkVfUkVUUllfUkVRVUlSRUQ6CisKKwkJCS8qIEZhaWwgdGhlIEkvTyBzbyBpdCBjYW4gYmUgcmV0cmllZC4gKi8KKwkJCXJlc3BvbnNlID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CisJCQlpZiAoIWlkZXYpCisJCQkJc3RhdHVzID0gU0FTX0RFVklDRV9VTktOT1dOOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IFNBU19BQk9SVEVEX1RBU0s7CisKKwkJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCQkJYnJlYWs7CisKKworCQlkZWZhdWx0OgorCQkJLyogQ2F0Y2ggYW55IG90aGVyd2lzZSB1bmhhbmRsZWQgZXJyb3IgY29kZXMgaGVyZS4gKi8KKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJICIlczogaW52YWxpZCBjb21wbGV0aW9uIGNvZGU6IDB4JXggLSAiCisJCQkJICJpc2NpX3JlcXVlc3QgPSAlcFxuIiwKKwkJCQkgX19mdW5jX18sIGNvbXBsZXRpb25fc3RhdHVzLCByZXF1ZXN0KTsKKworCQkJcmVzcG9uc2UgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKworCQkJLyogU2VlIGlmIHRoZSBkZXZpY2UgaGFzIGJlZW4vaXMgYmVpbmcgc3RvcHBlZC4gTm90ZQorCQkJICogdGhhdCB3ZSBpZ25vcmUgdGhlIHF1aWVzY2Ugc3RhdGUsIHNpbmNlIHdlIGFyZQorCQkJICogY29uY2VybmVkIGFib3V0IHRoZSBhY3R1YWwgZGV2aWNlIHN0YXRlLgorCQkJICovCisJCQlpZiAoIWlkZXYpCisJCQkJc3RhdHVzID0gU0FTX0RFVklDRV9VTktOT1dOOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IFNBU19BQk9SVEVEX1RBU0s7CisKKwkJCWlmIChTQVNfUFJPVE9DT0xfU01QID09IHRhc2stPnRhc2tfcHJvdG8pIHsKKwkJCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOworCQkJCWNvbXBsZXRlX3RvX2hvc3QgPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCQl9IGVsc2UgeworCQkJCWNsZWFyX2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJnJlcXVlc3QtPmZsYWdzKTsKKwkJCQljb21wbGV0ZV90b19ob3N0ID0gaXNjaV9wZXJmb3JtX2Vycm9yX2lvX2NvbXBsZXRpb247CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRhc2stPnRhc2tfcHJvdG8pIHsKKwljYXNlIFNBU19QUk9UT0NPTF9TU1A6CisJCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfTk9ORSkKKwkJCWJyZWFrOworCQlpZiAodGFzay0+bnVtX3NjYXR0ZXIgPT0gMCkKKwkJCS8qIDAgaW5kaWNhdGVzIGEgc2luZ2xlIGRtYSBhZGRyZXNzICovCisJCQlkbWFfdW5tYXBfc2luZ2xlKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkgcmVxdWVzdC0+emVyb19zY2F0dGVyX2RhZGRyLAorCQkJCQkgdGFzay0+dG90YWxfeGZlcl9sZW4sIHRhc2stPmRhdGFfZGlyKTsKKwkJZWxzZSAgLyogdW5tYXAgdGhlIHNnbCBkbWEgYWRkcmVzc2VzICovCisJCQlkbWFfdW5tYXBfc2coJmlob3N0LT5wZGV2LT5kZXYsIHRhc2stPnNjYXR0ZXIsCisJCQkJICAgICByZXF1ZXN0LT5udW1fc2dfZW50cmllcywgdGFzay0+ZGF0YV9kaXIpOworCQlicmVhazsKKwljYXNlIFNBU19QUk9UT0NPTF9TTVA6IHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9ICZ0YXNrLT5zbXBfdGFzay5zbXBfcmVxOworCQlzdHJ1Y3Qgc21wX3JlcSAqc21wX3JlcTsKKwkJdm9pZCAqa2FkZHI7CisKKwkJZG1hX3VubWFwX3NnKCZpaG9zdC0+cGRldi0+ZGV2LCBzZywgMSwgRE1BX1RPX0RFVklDRSk7CisKKwkJLyogbmVlZCB0byBzd2FiIGl0IGJhY2sgaW4gY2FzZSB0aGUgY29tbWFuZCBidWZmZXIgaXMgcmUtdXNlZCAqLworCQlrYWRkciA9IGttYXBfYXRvbWljKHNnX3BhZ2Uoc2cpLCBLTV9JUlEwKTsKKwkJc21wX3JlcSA9IGthZGRyICsgc2ctPm9mZnNldDsKKwkJc2NpX3N3YWIzMl9jcHkoc21wX3JlcSwgc21wX3JlcSwgc2ctPmxlbmd0aCAvIHNpemVvZih1MzIpKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fSVJRMCk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBQdXQgdGhlIGNvbXBsZXRlZCByZXF1ZXN0IG9uIHRoZSBjb3JyZWN0IGxpc3QgKi8KKwlpc2NpX3Rhc2tfc2F2ZV9mb3JfdXBwZXJfbGF5ZXJfY29tcGxldGlvbihpaG9zdCwgcmVxdWVzdCwgcmVzcG9uc2UsCisJCQkJCQkgIHN0YXR1cywgY29tcGxldGVfdG9faG9zdAorCQkJCQkJICApOworCisJLyogY29tcGxldGUgdGhlIGlvIHJlcXVlc3QgdG8gdGhlIGNvcmUuICovCisJc2NpX2NvbnRyb2xsZXJfY29tcGxldGVfaW8oaWhvc3QsIHJlcXVlc3QtPnRhcmdldF9kZXZpY2UsIHJlcXVlc3QpOworCWlzY2lfcHV0X2RldmljZShpZGV2KTsKKworCS8qIHNldCB0ZXJtaW5hdGVkIGhhbmRsZSBzbyBpdCBjYW5ub3QgYmUgY29tcGxldGVkIG9yCisJICogdGVybWluYXRlZCBhZ2FpbiwgYW5kIHRvIGNhdXNlIGFueSBjYWxscyBpbnRvIGFib3J0CisJICogdGFzayB0byByZWNvZ25pemUgdGhlIGFscmVhZHkgY29tcGxldGVkIGNhc2UuCisJICovCisJc2V0X2JpdChJUkVRX1RFUk1JTkFURUQsICZyZXF1ZXN0LT5mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9yZXF1ZXN0X3N0YXJ0ZWRfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXJlcSksIHNtKTsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaXJlcS0+dGFyZ2V0X2RldmljZS0+ZG9tYWluX2RldjsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2s7CisKKwkvKiBYWFggYXMgaGNoIHNhaWQgYWx3YXlzIGNyZWF0aW5nIGFuIGludGVybmFsIHNhc190YXNrIGZvciB0bWYKKwkgKiByZXF1ZXN0cyB3b3VsZCBzaW1wbGlmeSB0aGUgZHJpdmVyCisJICovCisJdGFzayA9IGlyZXEtPnR0eXBlID09IGlvX3Rhc2sgPyBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSkgOiBOVUxMOworCisJLyogYWxsIHVuYWNjZWxlcmF0ZWQgcmVxdWVzdCB0eXBlcyAobm9uIHNzcCBvciBuY3EpIGhhbmRsZWQgd2l0aAorCSAqIHN1YnN0YXRlcworCSAqLworCWlmICghdGFzayAmJiBkZXYtPmRldl90eXBlID09IFNBU19FTkRfREVWKSB7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9SRVFfVEFTS19XQUlUX1RDX0NPTVApOworCX0gZWxzZSBpZiAoIXRhc2sgJiYKKwkJICAgKGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpLT50bWZfY29kZSA9PSBpc2NpX3RtZl9zYXRhX3Nyc3RfaGlnaCB8fAorCQkgICAgaXNjaV9yZXF1ZXN0X2FjY2Vzc190bWYoaXJlcSktPnRtZl9jb2RlID09IGlzY2lfdG1mX3NhdGFfc3JzdF9sb3cpKSB7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfQVNTRVJURUQpOworCX0gZWxzZSBpZiAodGFzayAmJiB0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVApIHsKKwkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX1JFUV9TTVBfV0FJVF9SRVNQKTsKKwl9IGVsc2UgaWYgKHRhc2sgJiYgc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSAmJgorCQkgICAhdGFzay0+YXRhX3Rhc2sudXNlX25jcSkgeworCQl1MzIgc3RhdGU7CisKKwkJaWYgKHRhc2stPmRhdGFfZGlyID09IERNQV9OT05FKQorCQkJc3RhdGUgPSBTQ0lfUkVRX1NUUF9OT05fREFUQV9XQUlUX0gyRDsKKwkJZWxzZSBpZiAodGFzay0+YXRhX3Rhc2suZG1hX3hmZXIpCisJCQlzdGF0ZSA9IFNDSV9SRVFfU1RQX1VETUFfV0FJVF9UQ19DT01QOworCQllbHNlIC8qIFBJTyAqLworCQkJc3RhdGUgPSBTQ0lfUkVRX1NUUF9QSU9fV0FJVF9IMkQ7CisKKwkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgc3RhdGUpOworCX0KK30KKworc3RhdGljIHZvaWQgc2NpX3JlcXVlc3RfY29tcGxldGVkX3N0YXRlX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlyZXEpLCBzbSk7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKworCS8qIFRlbGwgdGhlIFNDSV9VU0VSIHRoYXQgdGhlIElPIHJlcXVlc3QgaXMgY29tcGxldGUgKi8KKwlpZiAoIXRlc3RfYml0KElSRVFfVE1GLCAmaXJlcS0+ZmxhZ3MpKQorCQlpc2NpX3JlcXVlc3RfaW9fcmVxdWVzdF9jb21wbGV0ZShpaG9zdCwgaXJlcSwKKwkJCQkJCSBpcmVxLT5zY2lfc3RhdHVzKTsKKwllbHNlCisJCWlzY2lfdGFza19yZXF1ZXN0X2NvbXBsZXRlKGlob3N0LCBpcmVxLCBpcmVxLT5zY2lfc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgc2NpX3JlcXVlc3RfYWJvcnRpbmdfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXJlcSksIHNtKTsKKworCS8qIFNldHRpbmcgdGhlIGFib3J0IGJpdCBpbiB0aGUgVGFzayBDb250ZXh0IGlzIHJlcXVpcmVkIGJ5IHRoZSBzaWxpY29uLiAqLworCWlyZXEtPnRjLT5hYm9ydCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zdHBfcmVxdWVzdF9zdGFydGVkX25vbl9kYXRhX2F3YWl0X2gyZF9jb21wbGV0aW9uX2VudGVyKHN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gY29udGFpbmVyX29mKHNtLCB0eXBlb2YoKmlyZXEpLCBzbSk7CisKKwlpcmVxLT50YXJnZXRfZGV2aWNlLT53b3JraW5nX3JlcXVlc3QgPSBpcmVxOworfQorCitzdGF0aWMgdm9pZCBzY2lfc3RwX3JlcXVlc3Rfc3RhcnRlZF9waW9fYXdhaXRfaDJkX2NvbXBsZXRpb25fZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXJlcSksIHNtKTsKKworCWlyZXEtPnRhcmdldF9kZXZpY2UtPndvcmtpbmdfcmVxdWVzdCA9IGlyZXE7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zdHBfcmVxdWVzdF9zdGFydGVkX3NvZnRfcmVzZXRfYXdhaXRfaDJkX2Fzc2VydGVkX2NvbXBsZXRpb25fZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXJlcSksIHNtKTsKKworCWlyZXEtPnRhcmdldF9kZXZpY2UtPndvcmtpbmdfcmVxdWVzdCA9IGlyZXE7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9zdHBfcmVxdWVzdF9zdGFydGVkX3NvZnRfcmVzZXRfYXdhaXRfaDJkX2RpYWdub3N0aWNfY29tcGxldGlvbl9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcmVxKSwgc20pOworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YyA9IGlyZXEtPnRjOworCXN0cnVjdCBob3N0X3RvX2Rldl9maXMgKmgyZF9maXM7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCS8qIENsZWFyIHRoZSBTUlNUIGJpdCAqLworCWgyZF9maXMgPSAmaXJlcS0+c3RwLmNtZDsKKwloMmRfZmlzLT5jb250cm9sID0gMDsKKworCS8qIENsZWFyIHRoZSBUQyBjb250cm9sIGJpdCAqLworCXRjLT5jb250cm9sX2ZyYW1lID0gMDsKKworCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX2NvbnRpbnVlX2lvKGlyZXEpOworCVdBUk5fT05DRShzdGF0dXMgIT0gU0NJX1NVQ0NFU1MsICJpc2NpOiBjb250aW51ZSBpbyBmYWlsdXJlXG4iKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2lfYmFzZV9zdGF0ZSBzY2lfcmVxdWVzdF9zdGF0ZV90YWJsZVtdID0geworCVtTQ0lfUkVRX0lOSVRdID0geyB9LAorCVtTQ0lfUkVRX0NPTlNUUlVDVEVEXSA9IHsgfSwKKwlbU0NJX1JFUV9TVEFSVEVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3JlcXVlc3Rfc3RhcnRlZF9zdGF0ZV9lbnRlciwKKwl9LAorCVtTQ0lfUkVRX1NUUF9OT05fREFUQV9XQUlUX0gyRF0gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9zdHBfcmVxdWVzdF9zdGFydGVkX25vbl9kYXRhX2F3YWl0X2gyZF9jb21wbGV0aW9uX2VudGVyLAorCX0sCisJW1NDSV9SRVFfU1RQX05PTl9EQVRBX1dBSVRfRDJIXSA9IHsgfSwKKwlbU0NJX1JFUV9TVFBfUElPX1dBSVRfSDJEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3N0cF9yZXF1ZXN0X3N0YXJ0ZWRfcGlvX2F3YWl0X2gyZF9jb21wbGV0aW9uX2VudGVyLAorCX0sCisJW1NDSV9SRVFfU1RQX1BJT19XQUlUX0ZSQU1FXSA9IHsgfSwKKwlbU0NJX1JFUV9TVFBfUElPX0RBVEFfSU5dID0geyB9LAorCVtTQ0lfUkVRX1NUUF9QSU9fREFUQV9PVVRdID0geyB9LAorCVtTQ0lfUkVRX1NUUF9VRE1BX1dBSVRfVENfQ09NUF0gPSB7IH0sCisJW1NDSV9SRVFfU1RQX1VETUFfV0FJVF9EMkhdID0geyB9LAorCVtTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0FTU0VSVEVEXSA9IHsKKwkJLmVudGVyX3N0YXRlID0gc2NpX3N0cF9yZXF1ZXN0X3N0YXJ0ZWRfc29mdF9yZXNldF9hd2FpdF9oMmRfYXNzZXJ0ZWRfY29tcGxldGlvbl9lbnRlciwKKwl9LAorCVtTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0RJQUddID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfc3RwX3JlcXVlc3Rfc3RhcnRlZF9zb2Z0X3Jlc2V0X2F3YWl0X2gyZF9kaWFnbm9zdGljX2NvbXBsZXRpb25fZW50ZXIsCisJfSwKKwlbU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0QySF0gPSB7IH0sCisJW1NDSV9SRVFfVEFTS19XQUlUX1RDX0NPTVBdID0geyB9LAorCVtTQ0lfUkVRX1RBU0tfV0FJVF9UQ19SRVNQXSA9IHsgfSwKKwlbU0NJX1JFUV9TTVBfV0FJVF9SRVNQXSA9IHsgfSwKKwlbU0NJX1JFUV9TTVBfV0FJVF9UQ19DT01QXSA9IHsgfSwKKwlbU0NJX1JFUV9DT01QTEVURURdID0geworCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVxdWVzdF9jb21wbGV0ZWRfc3RhdGVfZW50ZXIsCisJfSwKKwlbU0NJX1JFUV9BQk9SVElOR10gPSB7CisJCS5lbnRlcl9zdGF0ZSA9IHNjaV9yZXF1ZXN0X2Fib3J0aW5nX3N0YXRlX2VudGVyLAorCX0sCisJW1NDSV9SRVFfRklOQUxdID0geyB9LAorfTsKKworc3RhdGljIHZvaWQKK3NjaV9nZW5lcmFsX3JlcXVlc3RfY29uc3RydWN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzY2lfaW5pdF9zbSgmaXJlcS0+c20sIHNjaV9yZXF1ZXN0X3N0YXRlX3RhYmxlLCBTQ0lfUkVRX0lOSVQpOworCisJaXJlcS0+dGFyZ2V0X2RldmljZSA9IGlkZXY7CisJaXJlcS0+cHJvdG9jb2wgPSBTQ0lDX05PX1BST1RPQ09MOworCWlyZXEtPnNhdmVkX3J4X2ZyYW1lX2luZGV4ID0gU0NVX0lOVkFMSURfRlJBTUVfSU5ERVg7CisKKwlpcmVxLT5zY2lfc3RhdHVzICAgPSBTQ0lfU1VDQ0VTUzsKKwlpcmVxLT5zY3Vfc3RhdHVzICAgPSAwOworCWlyZXEtPnBvc3RfY29udGV4dCA9IDB4RkZGRkZGRkY7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMKK3NjaV9pb19yZXF1ZXN0X2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCSAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCSAgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisKKwkvKiBCdWlsZCB0aGUgY29tbW9uIHBhcnQgb2YgdGhlIHJlcXVlc3QgKi8KKwlzY2lfZ2VuZXJhbF9yZXF1ZXN0X2NvbnN0cnVjdChpaG9zdCwgaWRldiwgaXJlcSk7CisKKwlpZiAoaWRldi0+cm5jLnJlbW90ZV9ub2RlX2luZGV4ID09IFNDSUNfU0RTX1JFTU9URV9OT0RFX0NPTlRFWFRfSU5WQUxJRF9JTkRFWCkKKwkJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfUkVNT1RFX0RFVklDRTsKKworCWlmIChkZXYtPmRldl90eXBlID09IFNBU19FTkRfREVWKQorCQkvKiBwYXNzICovOworCWVsc2UgaWYgKGRldi0+ZGV2X3R5cGUgPT0gU0FUQV9ERVYgfHwgKGRldi0+dHByb3RvICYgU0FTX1BST1RPQ09MX1NUUCkpCisJCW1lbXNldCgmaXJlcS0+c3RwLmNtZCwgMCwgc2l6ZW9mKGlyZXEtPnN0cC5jbWQpKTsKKwllbHNlIGlmIChkZXZfaXNfZXhwYW5kZXIoZGV2KSkKKwkJLyogcGFzcyAqLzsKKwllbHNlCisJCXJldHVybiBTQ0lfRkFJTFVSRV9VTlNVUFBPUlRFRF9QUk9UT0NPTDsKKworCW1lbXNldChpcmVxLT50YywgMCwgb2Zmc2V0b2Yoc3RydWN0IHNjdV90YXNrX2NvbnRleHQsIHNnbF9wYWlyX2FiKSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3Rhc2tfcmVxdWVzdF9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQkgICAgdTE2IGlvX3RhZywgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisKKwkvKiBCdWlsZCB0aGUgY29tbW9uIHBhcnQgb2YgdGhlIHJlcXVlc3QgKi8KKwlzY2lfZ2VuZXJhbF9yZXF1ZXN0X2NvbnN0cnVjdChpaG9zdCwgaWRldiwgaXJlcSk7CisKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBTQVNfRU5EX0RFViB8fAorCSAgICBkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKSB7CisJCXNldF9iaXQoSVJFUV9UTUYsICZpcmVxLT5mbGFncyk7CisJCW1lbXNldChpcmVxLT50YywgMCwgc2l6ZW9mKHN0cnVjdCBzY3VfdGFza19jb250ZXh0KSk7CisJfSBlbHNlCisJCXN0YXR1cyA9IFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBpc2NpX3JlcXVlc3Rfc3NwX3JlcXVlc3RfY29uc3RydWN0KAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWRldl9kYmcoJnJlcXVlc3QtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IHJlcXVlc3QgPSAlcFxuIiwKKwkJX19mdW5jX18sCisJCXJlcXVlc3QpOworCXN0YXR1cyA9IHNjaV9pb19yZXF1ZXN0X2NvbnN0cnVjdF9iYXNpY19zc3AocmVxdWVzdCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBpc2NpX3JlcXVlc3Rfc3RwX3JlcXVlc3RfY29uc3RydWN0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCXN0cnVjdCBob3N0X3RvX2Rldl9maXMgKmZpcyA9ICZpcmVxLT5zdHAuY21kOworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSB0YXNrLT51bGRkX3Rhc2s7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCWRldl9kYmcoJmlyZXEtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlyZXEgPSAlcFxuIiwKKwkJX19mdW5jX18sCisJCWlyZXEpOworCisJbWVtY3B5KGZpcywgJnRhc2stPmF0YV90YXNrLmZpcywgc2l6ZW9mKHN0cnVjdCBob3N0X3RvX2Rldl9maXMpKTsKKwlpZiAoIXRhc2stPmF0YV90YXNrLmRldmljZV9jb250cm9sX3JlZ191cGRhdGUpCisJCWZpcy0+ZmxhZ3MgfD0gMHg4MDsKKwlmaXMtPmZsYWdzICY9IDB4RjA7CisKKwlzdGF0dXMgPSBzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3RfYmFzaWNfc2F0YShpcmVxKTsKKworCWlmIChxYyAmJiAocWMtPnRmLmNvbW1hbmQgPT0gQVRBX0NNRF9GUERNQV9XUklURSB8fAorCQkgICBxYy0+dGYuY29tbWFuZCA9PSBBVEFfQ01EX0ZQRE1BX1JFQUQpKSB7CisJCWZpcy0+c2VjdG9yX2NvdW50ID0gcWMtPnRhZyA8PCAzOworCQlpcmVxLT50Yy0+dHlwZS5zdHAubmNxX3RhZyA9IHFjLT50YWc7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cworc2NpX2lvX3JlcXVlc3RfY29uc3RydWN0X3NtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJICAgICAgc3RydWN0IHNhc190YXNrICp0YXNrKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmdGFzay0+c21wX3Rhc2suc21wX3JlcTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQ7CisJc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQ7CisJc3RydWN0IHNtcF9yZXEgKnNtcF9yZXE7CisJdm9pZCAqa2FkZHI7CisJdTggcmVxX2xlbjsKKwl1MzIgY21kOworCisJa2FkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnKSwgS01fSVJRMCk7CisJc21wX3JlcSA9IGthZGRyICsgc2ctPm9mZnNldDsKKwkvKgorCSAqIExvb2sgYXQgdGhlIFNNUCByZXF1ZXN0cycgaGVhZGVyIGZpZWxkczsgZm9yIGNlcnRhaW4gU0FTIDEueCBTTVAKKwkgKiBmdW5jdGlvbnMgdW5kZXIgU0FTIDIuMCwgYSB6ZXJvIHJlcXVlc3QgbGVuZ3RoIHJlYWxseSBpbmRpY2F0ZXMKKwkgKiBhIG5vbi16ZXJvIGRlZmF1bHQgbGVuZ3RoLgorCSAqLworCWlmIChzbXBfcmVxLT5yZXFfbGVuID09IDApIHsKKwkJc3dpdGNoIChzbXBfcmVxLT5mdW5jKSB7CisJCWNhc2UgU01QX0RJU0NPVkVSOgorCQljYXNlIFNNUF9SRVBPUlRfUEhZX0VSUl9MT0c6CisJCWNhc2UgU01QX1JFUE9SVF9QSFlfU0FUQToKKwkJY2FzZSBTTVBfUkVQT1JUX1JPVVRFX0lORk86CisJCQlzbXBfcmVxLT5yZXFfbGVuID0gMjsKKwkJCWJyZWFrOworCQljYXNlIFNNUF9DT05GX1JPVVRFX0lORk86CisJCWNhc2UgU01QX1BIWV9DT05UUk9MOgorCQljYXNlIFNNUF9QSFlfVEVTVF9GVU5DVElPTjoKKwkJCXNtcF9yZXEtPnJlcV9sZW4gPSA5OworCQkJYnJlYWs7CisJCQkvKiBEZWZhdWx0IC0gemVybyBpcyBhIHZhbGlkIGRlZmF1bHQgZm9yIDIuMC4gKi8KKwkJfQorCX0KKwlyZXFfbGVuID0gc21wX3JlcS0+cmVxX2xlbjsKKwlzY2lfc3dhYjMyX2NweShzbXBfcmVxLCBzbXBfcmVxLCBzZy0+bGVuZ3RoIC8gc2l6ZW9mKHUzMikpOworCWNtZCA9ICoodTMyICopIHNtcF9yZXE7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fSVJRMCk7CisKKwlpZiAoIWRtYV9tYXBfc2coZGV2LCBzZywgMSwgRE1BX1RPX0RFVklDRSkpCisJCXJldHVybiBTQ0lfRkFJTFVSRTsKKworCWlyZXEtPnByb3RvY29sID0gU0NJQ19TTVBfUFJPVE9DT0w7CisKKwkvKiBieXRlIHN3YXAgdGhlIHNtcCByZXF1ZXN0LiAqLworCisJdGFza19jb250ZXh0ID0gaXJlcS0+dGM7CisKKwlpZGV2ID0gaXJlcS0+dGFyZ2V0X2RldmljZTsKKwlpcG9ydCA9IGlkZXYtPm93bmluZ19wb3J0OworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBUQyB3aXRoIHRoZSBpdHMgcmVxdWlyZWQgZGF0YQorCSAqIDAwaAorCSAqLworCXRhc2tfY29udGV4dC0+cHJpb3JpdHkgPSAwOworCXRhc2tfY29udGV4dC0+aW5pdGlhdG9yX3JlcXVlc3QgPSAxOworCXRhc2tfY29udGV4dC0+Y29ubmVjdGlvbl9yYXRlID0gaWRldi0+Y29ubmVjdGlvbl9yYXRlOworCXRhc2tfY29udGV4dC0+cHJvdG9jb2xfZW5naW5lX2luZGV4ID0gSVNDSV9QRUc7CisJdGFza19jb250ZXh0LT5sb2dpY2FsX3BvcnRfaW5kZXggPSBpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleDsKKwl0YXNrX2NvbnRleHQtPnByb3RvY29sX3R5cGUgPSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX1NNUDsKKwl0YXNrX2NvbnRleHQtPmFib3J0ID0gMDsKKwl0YXNrX2NvbnRleHQtPnZhbGlkID0gU0NVX1RBU0tfQ09OVEVYVF9WQUxJRDsKKwl0YXNrX2NvbnRleHQtPmNvbnRleHRfdHlwZSA9IFNDVV9UQVNLX0NPTlRFWFRfVFlQRTsKKworCS8qIDA0aCAqLworCXRhc2tfY29udGV4dC0+cmVtb3RlX25vZGVfaW5kZXggPSBpZGV2LT5ybmMucmVtb3RlX25vZGVfaW5kZXg7CisJdGFza19jb250ZXh0LT5jb21tYW5kX2NvZGUgPSAwOworCXRhc2tfY29udGV4dC0+dGFza190eXBlID0gU0NVX1RBU0tfVFlQRV9TTVBfUkVRVUVTVDsKKworCS8qIDA4aCAqLworCXRhc2tfY29udGV4dC0+bGlua19sYXllcl9jb250cm9sID0gMDsKKwl0YXNrX2NvbnRleHQtPmRvX25vdF9kbWFfc3NwX2dvb2RfcmVzcG9uc2UgPSAxOworCXRhc2tfY29udGV4dC0+c3RyaWN0X29yZGVyaW5nID0gMDsKKwl0YXNrX2NvbnRleHQtPmNvbnRyb2xfZnJhbWUgPSAxOworCXRhc2tfY29udGV4dC0+dGltZW91dF9lbmFibGUgPSAwOworCXRhc2tfY29udGV4dC0+YmxvY2tfZ3VhcmRfZW5hYmxlID0gMDsKKworCS8qIDBjaCAqLworCXRhc2tfY29udGV4dC0+YWRkcmVzc19tb2RpZmllciA9IDA7CisKKwkvKiAxMGggKi8KKwl0YXNrX2NvbnRleHQtPnNzcF9jb21tYW5kX2l1X2xlbmd0aCA9IHJlcV9sZW47CisKKwkvKiAxNGggKi8KKwl0YXNrX2NvbnRleHQtPnRyYW5zZmVyX2xlbmd0aF9ieXRlcyA9IDA7CisKKwkvKgorCSAqIDE4aCB+IDMwaCwgcHJvdG9jb2wgc3BlY2lmaWMKKwkgKiBzaW5jZSBjb21tYW5kSVUgaGFzIGJlZW4gYnVpbGQgYnkgZnJhbWV3b3JrIGF0IHRoaXMgcG9pbnQsIHdlIGp1c3QKKwkgKiBjb3B5IHRoZSBmcmlzdCBEV29yZCBmcm9tIGNvbW1hbmQgSVUgdG8gdGhpcyBsb2NhdGlvbi4gKi8KKwltZW1jcHkoJnRhc2tfY29udGV4dC0+dHlwZS5zbXAsICZjbWQsIHNpemVvZih1MzIpKTsKKworCS8qCisJICogNDBoCisJICogIkZvciBTTVAgeW91IGNvdWxkIHByb2dyYW0gaXQgdG8gemVyby4gV2Ugd291bGQgcHJlZmVyIHRoYXQgd2F5CisJICogc28gdGhhdCBkb25lIGNvZGUgd2lsbCBiZSBjb25zaXN0ZW50LiIgLSBWZW5raQorCSAqLworCXRhc2tfY29udGV4dC0+dGFza19waGFzZSA9IDA7CisKKwlpcmVxLT5wb3N0X2NvbnRleHQgPSAoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9UQyB8CisJCQkgICAgICAoSVNDSV9QRUcgPDwgU0NVX0NPTlRFWFRfQ09NTUFORF9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfU0hJRlQpIHwKKwkJCSAgICAgICAoaXBvcnQtPnBoeXNpY2FsX3BvcnRfaW5kZXggPDwKKwkJCQlTQ1VfQ09OVEVYVF9DT01NQU5EX0xPR0lDQUxfUE9SVF9TSElGVCkgfAorCQkJICAgICAgSVNDSV9UQUdfVENJKGlyZXEtPmlvX3RhZykpOworCS8qCisJICogQ29weSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIGNvbW1hbmQgYnVmZmVyIHRvIHRoZSBTQ1UgVGFzaworCSAqIENvbnRleHQgY29tbWFuZCBidWZmZXIgc2hvdWxkIG5vdCBjb250YWluIGNvbW1hbmQgaGVhZGVyLgorCSAqLworCXRhc2tfY29udGV4dC0+Y29tbWFuZF9pdV91cHBlciA9IHVwcGVyXzMyX2JpdHMoc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwl0YXNrX2NvbnRleHQtPmNvbW1hbmRfaXVfbG93ZXIgPSBsb3dlcl8zMl9iaXRzKHNnX2RtYV9hZGRyZXNzKHNnKSArIHNpemVvZih1MzIpKTsKKworCS8qIFNNUCByZXNwb25zZSBjb21lcyBhcyBVRiwgc28gbm8gbmVlZCB0byBzZXQgcmVzcG9uc2UgSVUgYWRkcmVzcy4gKi8KKwl0YXNrX2NvbnRleHQtPnJlc3BvbnNlX2l1X3VwcGVyID0gMDsKKwl0YXNrX2NvbnRleHQtPnJlc3BvbnNlX2l1X2xvd2VyID0gMDsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTlNUUlVDVEVEKTsKKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworLyoKKyAqIGlzY2lfc21wX3JlcXVlc3RfYnVpbGQoKSAtIFRoaXMgZnVuY3Rpb24gYnVpbGRzIHRoZSBzbXAgcmVxdWVzdC4KKyAqIEBpcmVxOiBUaGlzIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIGlzY2lfcmVxdWVzdCBhbGxvY2F0ZWQgaW4gdGhlCisgKiAgICByZXF1ZXN0IGNvbnN0cnVjdCBmdW5jdGlvbi4KKyAqCisgKiBTQ0lfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsbCBjb21wbGV0aW9uLCBvciBzcGVjaWZpYyBmYWlsdXJlIGNvZGUuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgaXNjaV9zbXBfcmVxdWVzdF9idWlsZChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXJlcS0+aXNjaV9ob3N0LT5wZGV2LT5kZXY7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9GQUlMVVJFOworCisJc3RhdHVzID0gc2NpX2lvX3JlcXVlc3RfY29uc3RydWN0X3NtcChkZXYsIGlyZXEsIHRhc2spOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCWRldl9kYmcoJmlyZXEtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogZmFpbGVkIHdpdGggc3RhdHVzID0gJWRcbiIsCisJCQkgX19mdW5jX18sCisJCQkgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaXNjaV9pb19yZXF1ZXN0X2J1aWxkKCkgLSBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgaW8gcmVxdWVzdCBvYmplY3QuCisgKiBAaWhvc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgSVNDSSBob3N0IG9iamVjdAorICogQHJlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgaXNjaV9yZXF1ZXN0IG9iamVjdCBhbGxvY2F0ZWQgaW4gdGhlCisgKiAgICByZXF1ZXN0IGNvbnN0cnVjdCBmdW5jdGlvbi4KKyAqIEBzY2lfZGV2aWNlOiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgaGFuZGxlIGZvciB0aGUgc2NpIGNvcmUncyByZW1vdGUgZGV2aWNlCisgKiAgICBvYmplY3QgdGhhdCBpcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoaXMgcmVxdWVzdC4KKyAqCisgKiBTQ0lfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsbCBjb21wbGV0aW9uLCBvciBzcGVjaWZpYyBmYWlsdXJlIGNvZGUuCisgKi8KK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgaXNjaV9pb19yZXF1ZXN0X2J1aWxkKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQkgICAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKnJlcXVlc3QsCisJCQkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKHJlcXVlc3QpOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpZGV2ID0gMHglcDsgcmVxdWVzdCA9ICVwLCAiCisJCSJudW1fc2NhdHRlciA9ICVkXG4iLAorCQlfX2Z1bmNfXywKKwkJaWRldiwKKwkJcmVxdWVzdCwKKwkJdGFzay0+bnVtX3NjYXR0ZXIpOworCisJLyogbWFwIHRoZSBzZ2wgYWRkcmVzc2VzLCBpZiBwcmVzZW50LgorCSAqIGxpYmF0YSBkb2VzIHRoZSBtYXBwaW5nIGZvciBzYXRhIGRldmljZXMKKwkgKiBiZWZvcmUgd2UgZ2V0IHRoZSByZXF1ZXN0LgorCSAqLworCWlmICh0YXNrLT5udW1fc2NhdHRlciAmJgorCSAgICAhc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSAmJgorCSAgICAhKFNBU19QUk9UT0NPTF9TTVAgJiB0YXNrLT50YXNrX3Byb3RvKSkgeworCisJCXJlcXVlc3QtPm51bV9zZ19lbnRyaWVzID0gZG1hX21hcF9zZygKKwkJCSZpaG9zdC0+cGRldi0+ZGV2LAorCQkJdGFzay0+c2NhdHRlciwKKwkJCXRhc2stPm51bV9zY2F0dGVyLAorCQkJdGFzay0+ZGF0YV9kaXIKKwkJCSk7CisKKwkJaWYgKHJlcXVlc3QtPm51bV9zZ19lbnRyaWVzID09IDApCisJCQlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5TVUZGSUNJRU5UX1JFU09VUkNFUzsKKwl9CisKKwlzdGF0dXMgPSBzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3QoaWhvc3QsIGlkZXYsIHJlcXVlc3QpOworCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogZmFpbGVkIHJlcXVlc3QgY29uc3RydWN0XG4iLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCX0KKworCXN3aXRjaCAodGFzay0+dGFza19wcm90bykgeworCWNhc2UgU0FTX1BST1RPQ09MX1NNUDoKKwkJc3RhdHVzID0gaXNjaV9zbXBfcmVxdWVzdF9idWlsZChyZXF1ZXN0KTsKKwkJYnJlYWs7CisJY2FzZSBTQVNfUFJPVE9DT0xfU1NQOgorCQlzdGF0dXMgPSBpc2NpX3JlcXVlc3Rfc3NwX3JlcXVlc3RfY29uc3RydWN0KHJlcXVlc3QpOworCQlicmVhazsKKwljYXNlIFNBU19QUk9UT0NPTF9TQVRBOgorCWNhc2UgU0FTX1BST1RPQ09MX1NUUDoKKwljYXNlIFNBU19QUk9UT0NPTF9TQVRBIHwgU0FTX1BST1RPQ09MX1NUUDoKKwkJc3RhdHVzID0gaXNjaV9yZXF1ZXN0X3N0cF9yZXF1ZXN0X2NvbnN0cnVjdChyZXF1ZXN0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHVua25vd24gcHJvdG9jb2xcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCX0KKworCXJldHVybiBTQ0lfU1VDQ0VTUzsKK30KKworc3RhdGljIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfcmVxdWVzdF9mcm9tX3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgdTE2IHRhZykKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCisJaXJlcSA9IGlob3N0LT5yZXFzW0lTQ0lfVEFHX1RDSSh0YWcpXTsKKwlpcmVxLT5pb190YWcgPSB0YWc7CisJaXJlcS0+aW9fcmVxdWVzdF9jb21wbGV0aW9uID0gTlVMTDsKKwlpcmVxLT5mbGFncyA9IDA7CisJaXJlcS0+bnVtX3NnX2VudHJpZXMgPSAwOworCUlOSVRfTElTVF9IRUFEKCZpcmVxLT5jb21wbGV0ZWRfbm9kZSk7CisJSU5JVF9MSVNUX0hFQUQoJmlyZXEtPmRldl9ub2RlKTsKKwlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlyZXEsIGFsbG9jYXRlZCk7CisKKwlyZXR1cm4gaXJlcTsKK30KKworc3RhdGljIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfaW9fcmVxdWVzdF9mcm9tX3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJCSAgICAgc3RydWN0IHNhc190YXNrICp0YXNrLAorCQkJCQkJICAgICB1MTYgdGFnKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CisKKwlpcmVxID0gaXNjaV9yZXF1ZXN0X2Zyb21fdGFnKGlob3N0LCB0YWcpOworCWlyZXEtPnR0eXBlX3B0ci5pb190YXNrX3B0ciA9IHRhc2s7CisJaXJlcS0+dHR5cGUgPSBpb190YXNrOworCXRhc2stPmxsZGRfdGFzayA9IGlyZXE7CisKKwlyZXR1cm4gaXJlcTsKK30KKworc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV90bWZfcmVxdWVzdF9mcm9tX3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICAgIHN0cnVjdCBpc2NpX3RtZiAqaXNjaV90bWYsCisJCQkJCSAgICAgICB1MTYgdGFnKQoreworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CisKKwlpcmVxID0gaXNjaV9yZXF1ZXN0X2Zyb21fdGFnKGlob3N0LCB0YWcpOworCWlyZXEtPnR0eXBlX3B0ci50bWZfdGFza19wdHIgPSBpc2NpX3RtZjsKKwlpcmVxLT50dHlwZSA9IHRtZl90YXNrOworCisJcmV0dXJuIGlyZXE7Cit9CisKK2ludCBpc2NpX3JlcXVlc3RfZXhlY3V0ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCSBzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssIHUxNiB0YWcpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9GQUlMVVJFX1VOU1VQUE9SVEVEX1BST1RPQ09MOworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIGRvIGNvbW1vbiBhbGxvY2F0aW9uIGFuZCBpbml0IG9mIHJlcXVlc3Qgb2JqZWN0LiAqLworCWlyZXEgPSBpc2NpX2lvX3JlcXVlc3RfZnJvbV90YWcoaWhvc3QsIHRhc2ssIHRhZyk7CisKKwlzdGF0dXMgPSBpc2NpX2lvX3JlcXVlc3RfYnVpbGQoaWhvc3QsIGlyZXEsIGlkZXYpOworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHJlcXVlc3RfY29uc3RydWN0IGZhaWxlZCAtIHN0YXR1cyA9IDB4JXhcbiIsCisJCQkgX19mdW5jX18sCisJCQkgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKHRlc3RfYml0KElERVZfSU9fTkNRRVJST1IsICZpZGV2LT5mbGFncykpIHsKKworCQlpZiAoaXNjaV90YXNrX2lzX25jcV9yZWNvdmVyeSh0YXNrKSkgeworCisJCQkvKiBUaGUgZGV2aWNlIGlzIGluIGFuIE5DUSByZWNvdmVyeSBzdGF0ZS4gIElzc3VlIHRoZQorCQkJICogcmVxdWVzdCBvbiB0aGUgdGFzayBzaWRlLiAgTm90ZSB0aGF0IGl0IHdpbGwKKwkJCSAqIGNvbXBsZXRlIG9uIHRoZSBJL08gcmVxdWVzdCBzaWRlIGJlY2F1c2UgdGhlCisJCQkgKiByZXF1ZXN0IHdhcyBidWlsdCB0aGF0IHdheSAoaWUuCisJCQkgKiBpcmVxLT5pc190YXNrX21hbmFnZW1lbnRfcmVxdWVzdCBpcyBmYWxzZSkuCisJCQkgKi8KKwkJCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX3N0YXJ0X3Rhc2soaWhvc3QsCisJCQkJCQkJICAgIGlkZXYsCisJCQkJCQkJICAgIGlyZXEpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gU0NJX0ZBSUxVUkU7CisJCX0KKwl9IGVsc2UgeworCQkvKiBzZW5kIHRoZSByZXF1ZXN0LCBsZXQgdGhlIGNvcmUgYXNzaWduIHRoZSBJTyBUQUcuCSovCisJCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX3N0YXJ0X2lvKGlob3N0LCBpZGV2LAorCQkJCQkJICBpcmVxKTsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTICYmCisJICAgIHN0YXR1cyAhPSBTQ0lfRkFJTFVSRV9SRU1PVEVfREVWSUNFX1JFU0VUX1JFUVVJUkVEKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBmYWlsZWQgcmVxdWVzdCBzdGFydCAoMHgleClcbiIsCisJCQkgX19mdW5jX18sIHN0YXR1cyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBFaXRoZXIgSS9PIHN0YXJ0ZWQgT0ssIG9yIHRoZSBjb3JlIGhhcyBzaWduYWxlZCB0aGF0CisJICogdGhlIGRldmljZSBuZWVkcyBhIHRhcmdldCByZXNldC4KKwkgKgorCSAqIEluIGVpdGhlciBjYXNlLCBob2xkIG9udG8gdGhlIEkvTyBmb3IgbGF0ZXIuCisJICoKKwkgKiBVcGRhdGUgaXQncyBzdGF0dXMgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBpbiB0aGUKKwkgKiByZW1vdGUgZGV2aWNlIG9iamVjdC4KKwkgKi8KKwlsaXN0X2FkZCgmaXJlcS0+ZGV2X25vZGUsICZpZGV2LT5yZXFzX2luX3Byb2Nlc3MpOworCisJaWYgKHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUykgeworCQlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlyZXEsIHN0YXJ0ZWQpOworCX0gZWxzZSB7CisJCS8qIFRoZSByZXF1ZXN0IGRpZCBub3QgcmVhbGx5IHN0YXJ0IGluIHRoZQorCQkgKiBoYXJkd2FyZSwgc28gY2xlYXIgdGhlIHJlcXVlc3QgaGFuZGxlCisJCSAqIGhlcmUgc28gbm8gdGVybWluYXRpb25zIHdpbGwgYmUgZG9uZS4KKwkJICovCisJCXNldF9iaXQoSVJFUV9URVJNSU5BVEVELCAmaXJlcS0+ZmxhZ3MpOworCQlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlyZXEsIGNvbXBsZXRlZCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmIChzdGF0dXMgPT0KKwkgICAgU0NJX0ZBSUxVUkVfUkVNT1RFX0RFVklDRV9SRVNFVF9SRVFVSVJFRCkgeworCQkvKiBTaWduYWwgbGlic2FzIHRoYXQgd2UgbmVlZCB0aGUgU0NTSSBlcnJvcgorCQkgKiBoYW5kbGVyIHRocmVhZCB0byB3b3JrIG9uIHRoaXMgSS9PIGFuZCB0aGF0CisJCSAqIHdlIHdhbnQgYSBkZXZpY2UgcmVzZXQuCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJCS8qIENhdXNlIHRoaXMgdGFzayB0byBiZSBzY2hlZHVsZWQgaW4gdGhlIFNDU0kgZXJyb3IKKwkJICogaGFuZGxlciB0aHJlYWQuCisJCSAqLworCQlpc2NpX2V4ZWNwYXRoX2NhbGxiYWNrKGlob3N0LCB0YXNrLAorCQkJCSAgICAgICBzYXNfdGFza19hYm9ydCk7CisKKwkJLyogQ2hhbmdlIHRoZSBzdGF0dXMsIHNpbmNlIHdlIGFyZSBob2xkaW5nCisJCSAqIHRoZSBJL08gdW50aWwgaXQgaXMgbWFuYWdlZCBieSB0aGUgU0NTSQorCQkgKiBlcnJvciBoYW5kbGVyLgorCQkgKi8KKwkJc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTFkNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5oCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9JU0NJX1JFUVVFU1RfSF8KKyNkZWZpbmUgX0lTQ0lfUkVRVUVTVF9IXworCisjaW5jbHVkZSAiaXNjaS5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJzY3VfdGFza19jb250ZXh0LmgiCisKKy8qKgorICogc3RydWN0IGlzY2lfcmVxdWVzdF9zdGF0dXMgLSBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcG9zc2libGUgc3RhdGVzIG9mIGFuIEkvTworICogICAgcmVxdWVzdC4KKyAqCisgKgorICovCitlbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgeworCXVuYWxsb2NhdGVkID0gMHgwMCwKKwlhbGxvY2F0ZWQgICA9IDB4MDEsCisJc3RhcnRlZCAgICAgPSAweDAyLAorCWNvbXBsZXRlZCAgID0gMHgwMywKKwlhYm9ydGluZyAgICA9IDB4MDQsCisJYWJvcnRlZCAgICAgPSAweDA1LAorCXRlcm1pbmF0aW5nID0gMHgwNiwKKwlkZWFkICAgICAgICA9IDB4MDcKK307CisKK2VudW0gdGFza190eXBlIHsKKwlpb190YXNrICA9IDAsCisJdG1mX3Rhc2sgPSAxCit9OworCitlbnVtIHNjaV9yZXF1ZXN0X3Byb3RvY29sIHsKKwlTQ0lDX05PX1BST1RPQ09MLAorCVNDSUNfU01QX1BST1RPQ09MLAorCVNDSUNfU1NQX1BST1RPQ09MLAorCVNDSUNfU1RQX1BST1RPQ09MCit9OyAvKiBYWFggcmVtb3ZlIG1lLCB1c2Ugc2FzX3Rhc2sue2Rldnx0YXNrX3Byb3RvfSBpbnN0ZWFkICovOworCisvKioKKyAqIGlzY2lfc3RwX3JlcXVlc3QgLSBleHRyYSByZXF1ZXN0IGluZnJhc3RydWN0dXJlIHRvIGhhbmRsZSBwaW8vYXRhcGkgcHJvdG9jb2wKKyAqIEBwaW9fbGVuIC0gbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZCBhdCBQSU8gc2V0dXAKKyAqIEBzdGF0dXMgLSBwaW8gc2V0dXAgZW5kaW5nIHN0YXR1cyB2YWx1ZSB0byB0ZWxsIHVzIGlmIHdlIG5lZWQKKyAqCSAgICAgdG8gd2FpdCBmb3IgYW5vdGhlciBmaXMgb3IgaWYgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLiAgVXBvbgorICogICAgICAgICAgIHJlY2VpcHQgb2YgYSBkMmggZmlzIHRoaXMgd2lsbCBiZSB0aGUgc3RhdHVzIGZpZWxkIG9mIHRoYXQgZmlzLgorICogQHNnbCAtIHRyYWNrIHBpbyB0cmFuc2ZlciBwcm9ncmVzcyBhcyB3ZSBpdGVyYXRlIHRocm91Z2ggdGhlIHNnbAorICogQGRldmljZV9jZGJfbGVuIC0gYXRhcGkgZGV2aWNlIGFkdmVydGlzZXMgaXQncyB0cmFuc2ZlciBjb25zdHJhaW50cyBhdCBzZXR1cAorICovCitzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCB7CisJdTMyIHBpb19sZW47CisJdTggc3RhdHVzOworCisJc3RydWN0IGlzY2lfc3RwX3Bpb19zZ2wgeworCQlpbnQgaW5kZXg7CisJCXU4IHNldDsKKwkJdTMyIG9mZnNldDsKKwl9IHNnbDsKKwl1MzIgZGV2aWNlX2NkYl9sZW47Cit9OworCitzdHJ1Y3QgaXNjaV9yZXF1ZXN0IHsKKwllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgc3RhdHVzOworCSNkZWZpbmUgSVJFUV9DT01QTEVURV9JTl9UQVJHRVQgMAorCSNkZWZpbmUgSVJFUV9URVJNSU5BVEVEIDEKKwkjZGVmaW5lIElSRVFfVE1GIDIKKwkjZGVmaW5lIElSRVFfQUNUSVZFIDMKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qIFhYWCBraWxsIHR0eXBlIGFuZCB0dHlwZV9wdHIsIGFsbG9jYXRlIGZ1bGwgc2FzX3Rhc2sgKi8KKwllbnVtIHRhc2tfdHlwZSB0dHlwZTsKKwl1bmlvbiB0dHlwZV9wdHJfdW5pb24geworCQlzdHJ1Y3Qgc2FzX3Rhc2sgKmlvX3Rhc2tfcHRyOyAgIC8qIFdoZW4gdHR5cGU9PWlvX3Rhc2sgICovCisJCXN0cnVjdCBpc2NpX3RtZiAqdG1mX3Rhc2tfcHRyOyAgLyogV2hlbiB0dHlwZT09dG1mX3Rhc2sgKi8KKwl9IHR0eXBlX3B0cjsKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3Q7CisJLyogRm9yIHVzZSBpbiB0aGUgcmVxdWVzdHNfdG9fe2NvbXBsZXRlfGFib3J0fSBsaXN0czogKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvbXBsZXRlZF9ub2RlOworCS8qIEZvciB1c2UgaW4gdGhlIHJlcXNfaW5fcHJvY2VzcyBsaXN0OiAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2X25vZGU7CisJc3BpbmxvY2tfdCBzdGF0ZV9sb2NrOworCWRtYV9hZGRyX3QgcmVxdWVzdF9kYWRkcjsKKwlkbWFfYWRkcl90IHplcm9fc2NhdHRlcl9kYWRkcjsKKwl1bnNpZ25lZCBpbnQgbnVtX3NnX2VudHJpZXM7CisJLyogTm90ZTogImlvX3JlcXVlc3RfY29tcGxldGlvbiIgaXMgY29tcGxldGVkIGluIHR3byBkaWZmZXJlbnQgd2F5cworCSAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoaXMgaXMgYSBUTUYgb3IgcmVndWxhciByZXF1ZXN0LgorCSAqIC0gVE1GIHJlcXVlc3RzIGFyZSBjb21wbGV0ZWQgaW4gdGhlIHRocmVhZCB0aGF0IHN0YXJ0ZWQgdGhlbTsKKwkgKiAtIHJlZ3VsYXIgcmVxdWVzdHMgYXJlIGNvbXBsZXRlZCBpbiB0aGUgcmVxdWVzdCBjb21wbGV0aW9uIGNhbGxiYWNrCisJICogICBmdW5jdGlvbi4KKwkgKiBUaGlzIGRpZmZlcmVuY2UgaW4gb3BlcmF0aW9uIGFsbG93cyB0aGUgYWJvcnRlciBvZiBhIFRNRiByZXF1ZXN0CisJICogdG8gYmUgc3VyZSB0aGF0IG9uY2UgdGhlIFRNRiByZXF1ZXN0IGNvbXBsZXRlcywgdGhlIEkvTyB0aGF0IHRoZQorCSAqIFRNRiB3YXMgYWJvcnRpbmcgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGNvbXBsZXRlZC4KKwkgKgorCSAqIFhYWCBraWxsIGlvX3JlcXVlc3RfY29tcGxldGlvbgorCSAqLworCXN0cnVjdCBjb21wbGV0aW9uICppb19yZXF1ZXN0X2NvbXBsZXRpb247CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgc207CisJc3RydWN0IGlzY2lfaG9zdCAqb3duaW5nX2NvbnRyb2xsZXI7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqdGFyZ2V0X2RldmljZTsKKwl1MTYgaW9fdGFnOworCWVudW0gc2NpX3JlcXVlc3RfcHJvdG9jb2wgcHJvdG9jb2w7CisJdTMyIHNjdV9zdGF0dXM7IC8qIGhhcmR3YXJlIHJlc3VsdCAqLworCXUzMiBzY2lfc3RhdHVzOyAvKiB1cHBlciBsYXllciBkaXNwb3NpdGlvbiAqLworCXUzMiBwb3N0X2NvbnRleHQ7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRjOworCS8qIGNvdWxkIGJlIGxhcmdlciB3aXRoIHNnIGNoYWluaW5nICovCisJI2RlZmluZSBTQ1VfU0dMX1NJWkUgKChTQ0lfTUFYX1NDQVRURVJfR0FUSEVSX0VMRU1FTlRTICsgMSkgLyAyKQorCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciBzZ190YWJsZVtTQ1VfU0dMX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCS8qIFRoaXMgZmllbGQgaXMgYSBwb2ludGVyIHRvIHRoZSBzdG9yZWQgcnggZnJhbWUgZGF0YS4gIEl0IGlzIHVzZWQgaW4KKwkgKiBTVFAgaW50ZXJuYWwgcmVxdWVzdHMgYW5kIFNNUCByZXNwb25zZSBmcmFtZXMuICBJZiB0aGlzIGZpZWxkIGlzCisJICogbm9uLU5VTEwgdGhlIHNhdmVkIGZyYW1lIG11c3QgYmUgcmVsZWFzZWQgb24gSU8gcmVxdWVzdCBjb21wbGV0aW9uLgorCSAqLworCXUzMiBzYXZlZF9yeF9mcmFtZV9pbmRleDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuaW9uIHsKKwkJCQlzdHJ1Y3Qgc3NwX2NtZF9pdSBjbWQ7CisJCQkJc3RydWN0IHNzcF90YXNrX2l1IHRtZjsKKwkJCX07CisJCQl1bmlvbiB7CisJCQkJc3RydWN0IHNzcF9yZXNwb25zZV9pdSByc3A7CisJCQkJdTggcnNwX2J1ZltTU1BfUkVTUF9JVV9NQVhfU0laRV07CisJCQl9OworCQl9IHNzcDsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBzbXBfcmVzcCByc3A7CisJCX0gc21wOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgcmVxOworCQkJc3RydWN0IGhvc3RfdG9fZGV2X2ZpcyBjbWQ7CisJCQlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzIHJzcDsKKwkJfSBzdHA7CisJfTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlzY2lfcmVxdWVzdCAqdG9faXJlcShzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCisJaXJlcSA9IGNvbnRhaW5lcl9vZihzdHBfcmVxLCB0eXBlb2YoKmlyZXEpLCBzdHAucmVxKTsKKwlyZXR1cm4gaXJlcTsKK30KKworLyoqCisgKiBlbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIC0gVGhpcyBlbnVtZXJhdGlvbiBkZXBpY3RzIGFsbCB0aGUgc3RhdGVzIGZvcgorICogICAgdGhlIGNvbW1vbiByZXF1ZXN0IHN0YXRlIG1hY2hpbmUuCisgKgorICoKKyAqLworZW51bSBzY2lfYmFzZV9yZXF1ZXN0X3N0YXRlcyB7CisJLyoKKwkgKiBTaW1wbHkgdGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoZSBiYXNlIHJlcXVlc3Qgc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlTQ0lfUkVRX0lOSVQsCisKKwkvKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29uc3RydWN0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIElOSVRJQUwgc3RhdGUuCisJICovCisJU0NJX1JFUV9DT05TVFJVQ1RFRCwKKworCS8qCisJICogVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzdGFydGVkLiBUaGlzIHN0YXRlCisJICogaXMgZW50ZXJlZCBmcm9tIHRoZSBDT05TVFJVQ1RFRCBzdGF0ZS4KKwkgKi8KKwlTQ0lfUkVRX1NUQVJURUQsCisKKwlTQ0lfUkVRX1NUUF9VRE1BX1dBSVRfVENfQ09NUCwKKwlTQ0lfUkVRX1NUUF9VRE1BX1dBSVRfRDJILAorCisJU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9IMkQsCisJU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9EMkgsCisKKwlTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0FTU0VSVEVELAorCVNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfRElBRywKKwlTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfRDJILAorCisJLyoKKwkgKiBXaGlsZSBpbiB0aGlzIHN0YXRlIHRoZSBJTyByZXF1ZXN0IG9iamVjdCBpcyB3YWl0aW5nIGZvciB0aGUgVEMKKwkgKiBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBmb3IgdGhlIEgyRCBSZWdpc3RlciBGSVMKKwkgKi8KKwlTQ0lfUkVRX1NUUF9QSU9fV0FJVF9IMkQsCisKKwkvKgorCSAqIFdoaWxlIGluIHRoaXMgc3RhdGUgdGhlIElPIHJlcXVlc3Qgb2JqZWN0IGlzIHdhaXRpbmcgZm9yIGVpdGhlciBhCisJICogUElPIFNldHVwIEZJUyBvciBhIEQySCByZWdpc3RlciBGSVMuICBUaGUgdHlwZSBvZiBmcmFtZSByZWNlaXZlZCBpcworCSAqIGJhc2VkIG9uIHRoZSByZXN1bHQgb2YgdGhlIHByaW9yIGZyYW1lIGFuZCBsaW5lIGNvbmRpdGlvbnMuCisJICovCisJU0NJX1JFUV9TVFBfUElPX1dBSVRfRlJBTUUsCisKKwkvKgorCSAqIFdoaWxlIGluIHRoaXMgc3RhdGUgdGhlIElPIHJlcXVlc3Qgb2JqZWN0IGlzIHdhaXRpbmcgZm9yIGEgREFUQQorCSAqIGZyYW1lIGZyb20gdGhlIGRldmljZS4KKwkgKi8KKwlTQ0lfUkVRX1NUUF9QSU9fREFUQV9JTiwKKworCS8qCisJICogV2hpbGUgaW4gdGhpcyBzdGF0ZSB0aGUgSU8gcmVxdWVzdCBvYmplY3QgaXMgd2FpdGluZyB0byB0cmFuc21pdAorCSAqIHRoZSBuZXh0IGRhdGEgZnJhbWUgdG8gdGhlIGRldmljZS4KKwkgKi8KKwlTQ0lfUkVRX1NUUF9QSU9fREFUQV9PVVQsCisKKwkvKgorCSAqIFRoZSBBV0FJVF9UQ19DT01QTEVUSU9OIHN1Yi1zdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhcnRlZCByYXcKKwkgKiB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdCBpcyB3YWl0aW5nIGZvciB0aGUgdHJhbnNtaXNzaW9uIG9mIHRoZQorCSAqIGluaXRpYWwgZnJhbWUgKGkuZS4gY29tbWFuZCwgdGFzaywgZXRjLikuCisJICovCisJU0NJX1JFUV9UQVNLX1dBSVRfVENfQ09NUCwKKworCS8qCisJICogVGhpcyBzdWItc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YXJ0ZWQgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3QKKwkgKiBpcyB3YWl0aW5nIGZvciB0aGUgcmVjZXB0aW9uIG9mIGFuIHVuc29saWNpdGVkIGZyYW1lCisJICogKGkuZS4gcmVzcG9uc2UgSVUpLgorCSAqLworCVNDSV9SRVFfVEFTS19XQUlUX1RDX1JFU1AsCisKKwkvKgorCSAqIFRoaXMgc3ViLXN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBzdGFydGVkIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0CisJICogaXMgd2FpdGluZyBmb3IgdGhlIHJlY2VwdGlvbiBvZiBhbiB1bnNvbGljaXRlZCBmcmFtZQorCSAqIChpLmUuIHJlc3BvbnNlIElVKS4KKwkgKi8KKwlTQ0lfUkVRX1NNUF9XQUlUX1JFU1AsCisKKwkvKgorCSAqIFRoZSBBV0FJVF9UQ19DT01QTEVUSU9OIHN1Yi1zdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhcnRlZCBTTVAKKwkgKiByZXF1ZXN0IGlzIHdhaXRpbmcgZm9yIHRoZSB0cmFuc21pc3Npb24gb2YgdGhlIGluaXRpYWwgZnJhbWUKKwkgKiAoaS5lLiBjb21tYW5kLCB0YXNrLCBldGMuKS4KKwkgKi8KKwlTQ0lfUkVRX1NNUF9XQUlUX1RDX0NPTVAsCisKKwkvKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3QgaGFzIGNvbXBsZXRlZC4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgZnJvbSB0aGUgU1RBUlRFRCBzdGF0ZS4gVGhpcyBzdGF0ZSBpcyBlbnRlcmVkCisJICogZnJvbSB0aGUgQUJPUlRJTkcgc3RhdGUuCisJICovCisJU0NJX1JFUV9DT01QTEVURUQsCisKKwkvKgorCSAqIFRoaXMgc3RhdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3QgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcKKwkgKiB0ZXJtaW5hdGVkL2Fib3J0ZWQuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIGZyb20gdGhlIENPTlNUUlVDVEVEIHN0YXRlLgorCSAqIFRoaXMgc3RhdGUgaXMgZW50ZXJlZCBmcm9tIHRoZSBTVEFSVEVEIHN0YXRlLgorCSAqLworCVNDSV9SRVFfQUJPUlRJTkcsCisKKwkvKgorCSAqIFNpbXBseSB0aGUgZmluYWwgc3RhdGUgZm9yIHRoZSBiYXNlIHJlcXVlc3Qgc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlTQ0lfUkVRX0ZJTkFMLAorfTsKKworZW51bSBzY2lfc3RhdHVzIHNjaV9yZXF1ZXN0X3N0YXJ0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworZW51bSBzY2lfc3RhdHVzIHNjaV9pb19yZXF1ZXN0X3Rlcm1pbmF0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2VudW0gc2NpX3N0YXR1cworc2NpX2lvX3JlcXVlc3RfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCSAgdTMyIGV2ZW50X2NvZGUpOworZW51bSBzY2lfc3RhdHVzCitzY2lfaW9fcmVxdWVzdF9mcmFtZV9oYW5kbGVyKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJICB1MzIgZnJhbWVfaW5kZXgpOworZW51bSBzY2lfc3RhdHVzCitzY2lfdGFza19yZXF1ZXN0X3Rlcm1pbmF0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2V4dGVybiBlbnVtIHNjaV9zdGF0dXMKK3NjaV9yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworZXh0ZXJuIGVudW0gc2NpX3N0YXR1cworc2NpX2lvX3JlcXVlc3RfdGNfY29tcGxldGlvbihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLCB1MzIgY29kZSk7CisKKy8qIFhYWCBvcGVuIGNvZGUgaW4gY2FsbGVyICovCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QKK3NjaV9pb19yZXF1ZXN0X2dldF9kbWFfYWRkcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLCB2b2lkICp2aXJ0X2FkZHIpCit7CisKKwljaGFyICpyZXF1ZXN0ZWRfYWRkciA9IChjaGFyICopdmlydF9hZGRyOworCWNoYXIgKmJhc2VfYWRkciA9IChjaGFyICopaXJlcTsKKworCUJVR19PTihyZXF1ZXN0ZWRfYWRkciA8IGJhc2VfYWRkcik7CisJQlVHX09OKChyZXF1ZXN0ZWRfYWRkciAtIGJhc2VfYWRkcikgPj0gc2l6ZW9mKCppcmVxKSk7CisKKwlyZXR1cm4gaXJlcS0+cmVxdWVzdF9kYWRkciArIChyZXF1ZXN0ZWRfYWRkciAtIGJhc2VfYWRkcik7Cit9CisKKy8qKgorICogaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZSgpIC0gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzdGF0dXMgb2YgdGhlIHJlcXVlc3QKKyAqICAgIG9iamVjdC4KKyAqIEByZXF1ZXN0OiBUaGlzIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIGlzY2lfcmVxdWVzdCBvYmplY3QKKyAqIEBzdGF0dXM6IFRoaXMgUGFyYW1ldGVyIGlzIHRoZSBuZXcgc3RhdHVzIG9mIHRoZSBvYmplY3QKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzCitpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfcmVxdWVzdCwKKwkJCSAgZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIHN0YXR1cykKK3sKKwllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgb2xkX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKCZpc2NpX3JlcXVlc3QtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IGlzY2lfcmVxdWVzdCA9ICVwLCBzdGF0ZSA9IDB4JXhcbiIsCisJCV9fZnVuY19fLAorCQlpc2NpX3JlcXVlc3QsCisJCXN0YXR1cyk7CisKKwlCVUdfT04oaXNjaV9yZXF1ZXN0ID09IE5VTEwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfcmVxdWVzdC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCW9sZF9zdGF0ZSA9IGlzY2lfcmVxdWVzdC0+c3RhdHVzOworCWlzY2lfcmVxdWVzdC0+c3RhdHVzID0gc3RhdHVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfcmVxdWVzdC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG9sZF9zdGF0ZTsKK30KKworLyoqCisgKiBpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXJ0ZWRfdG9fbmV3c3RhdGUoKSAtIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgc3RhdHVzIG9mCisgKiAgICB0aGUgcmVxdWVzdCBvYmplY3QuCisgKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSBpc2NpX3JlcXVlc3Qgb2JqZWN0CisgKiBAc3RhdHVzOiBUaGlzIFBhcmFtZXRlciBpcyB0aGUgbmV3IHN0YXR1cyBvZiB0aGUgb2JqZWN0CisgKgorICogc3RhdGUgcHJldmlvdXMgdG8gYW55IGNoYW5nZS4KKyAqLworc3RhdGljIGlubGluZSBlbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMKK2lzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhcnRlZF90b19uZXdzdGF0ZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3QsCisJCQkJCXN0cnVjdCBjb21wbGV0aW9uICpjb21wbGV0aW9uX3B0ciwKKwkJCQkJZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIG5ld3N0YXRlKQoreworCWVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cyBvbGRfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NpX3JlcXVlc3QtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCW9sZF9zdGF0ZSA9IGlzY2lfcmVxdWVzdC0+c3RhdHVzOworCisJaWYgKG9sZF9zdGF0ZSA9PSBzdGFydGVkIHx8IG9sZF9zdGF0ZSA9PSBhYm9ydGluZykgeworCQlCVUdfT04oaXNjaV9yZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb24gIT0gTlVMTCk7CisKKwkJaXNjaV9yZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb24gPSBjb21wbGV0aW9uX3B0cjsKKwkJaXNjaV9yZXF1ZXN0LT5zdGF0dXMgPSBuZXdzdGF0ZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX3JlcXVlc3QtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoJmlzY2lfcmVxdWVzdC0+aXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9yZXF1ZXN0ID0gJXAsIG9sZF9zdGF0ZSA9IDB4JXhcbiIsCisJCV9fZnVuY19fLAorCQlpc2NpX3JlcXVlc3QsCisJCW9sZF9zdGF0ZSk7CisKKwlyZXR1cm4gb2xkX3N0YXRlOworfQorCisvKioKKyAqIGlzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhcnRlZF90b19hYm9ydGVkKCkgLSBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHN0YXR1cyBvZgorICogICAgdGhlIHJlcXVlc3Qgb2JqZWN0LgorICogQHJlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgaXNjaV9yZXF1ZXN0IG9iamVjdAorICogQGNvbXBsZXRpb25fcHRyOiBUaGlzIHBhcmFtZXRlciBpcyBzYXZlZCBhcyB0aGUga2VybmVsIGNvbXBsZXRpb24gc3RydWN0dXJlCisgKiAgICBzaWduYWxsZWQgd2hlbiB0aGUgb2xkIHJlcXVlc3QgY29tcGxldGVzLgorICoKKyAqIHN0YXRlIHByZXZpb3VzIHRvIGFueSBjaGFuZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzCitpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXJ0ZWRfdG9fYWJvcnRlZChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3QsCisJCQkJICAgICAgIHN0cnVjdCBjb21wbGV0aW9uICpjb21wbGV0aW9uX3B0cikKK3sKKwlyZXR1cm4gaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGFydGVkX3RvX25ld3N0YXRlKGlzY2lfcmVxdWVzdCwKKwkJCQkJCSAgICAgICBjb21wbGV0aW9uX3B0ciwKKwkJCQkJCSAgICAgICBhYm9ydGVkKTsKK30KKworI2RlZmluZSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2socmVxKSAoKHJlcSktPnR0eXBlX3B0ci5pb190YXNrX3B0cikKKworI2RlZmluZSBpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihyZXEpICgocmVxKS0+dHR5cGVfcHRyLnRtZl90YXNrX3B0cikKKworc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV90bWZfcmVxdWVzdF9mcm9tX3RhZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkJICAgICAgIHN0cnVjdCBpc2NpX3RtZiAqaXNjaV90bWYsCisJCQkJCSAgICAgICB1MTYgdGFnKTsKK2ludCBpc2NpX3JlcXVlc3RfZXhlY3V0ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCSBzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssIHUxNiB0YWcpOwordm9pZCBpc2NpX3Rlcm1pbmF0ZV9wZW5kaW5nX3JlcXVlc3RzKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldik7CitlbnVtIHNjaV9zdGF0dXMKK3NjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkgICAgdTE2IGlvX3RhZywKKwkJCSAgICBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKK2VudW0gc2NpX3N0YXR1cworc2NpX3Rhc2tfcmVxdWVzdF9jb25zdHJ1Y3Rfc3NwKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOworZW51bSBzY2lfc3RhdHVzCitzY2lfdGFza19yZXF1ZXN0X2NvbnN0cnVjdF9zYXRhKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpOwordm9pZCBzY2lfc21wX3JlcXVlc3RfY29weV9yZXNwb25zZShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKTsKKworc3RhdGljIGlubGluZSBpbnQgaXNjaV90YXNrX2lzX25jcV9yZWNvdmVyeShzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJcmV0dXJuIChzYXNfcHJvdG9jb2xfYXRhKHRhc2stPnRhc2tfcHJvdG8pICYmCisJCXRhc2stPmF0YV90YXNrLmZpcy5jb21tYW5kID09IEFUQV9DTURfUkVBRF9MT0dfRVhUICYmCisJCXRhc2stPmF0YV90YXNrLmZpcy5sYmFsID09IEFUQV9MT0dfU0FUQV9OQ1EpOworCit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChfSVNDSV9SRVFVRVNUX0hfKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvc2FzLmggYi9kcml2ZXJzL3Njc2kvaXNjaS9zYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjJiMTUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvc2FzLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDSV9TQVNfSF8KKyNkZWZpbmUgX1NDSV9TQVNfSF8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisvKgorICogU0FUQSBGSVMgVHlwZXMgVGhlc2UgY29uc3RhbnRzIGRlcGljdCB0aGUgdmFyaW91cyBTQVRBIEZJUyB0eXBlcyBkZXZpbmVkIGluCisgKiB0aGUgc2VyaWFsIEFUQSBzcGVjaWZpY2F0aW9uLgorICogWFhYOiBUaGlzIG5lZWRzIHRvIGdvIGludG8gPHNjc2kvc2FzLmg+CisgKi8KKyNkZWZpbmUgRklTX1JFR0gyRCAgICAgICAgICAweDI3CisjZGVmaW5lIEZJU19SRUdEMkggICAgICAgICAgMHgzNAorI2RlZmluZSBGSVNfU0VUREVWQklUUyAgICAgIDB4QTEKKyNkZWZpbmUgRklTX0RNQV9BQ1RJVkFURSAgICAweDM5CisjZGVmaW5lIEZJU19ETUFfU0VUVVAgICAgICAgMHg0MQorI2RlZmluZSBGSVNfQklTVF9BQ1RJVkFURSAgIDB4NTgKKyNkZWZpbmUgRklTX1BJT19TRVRVUCAgICAgICAweDVGCisjZGVmaW5lIEZJU19EQVRBICAgICAgICAgICAgMHg0NgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNTUF9SRVNQX0lVX01BWF9TSVpFCTI4MAorCisvKgorICogY29udGVudHMgb2YgdGhlIFNTUCBDT01NQU5EIElORk9STUFUSU9OIFVOSVQuCisgKiBGb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGVzZSBpbmRpdmlkdWFsIGZpZWxkcyBwbGVhc2UKKyAqIHJlZmVyZW5jZSB0aGUgU0FTIHNwZWNpZmljYXRpb24gU1NQIHRyYW5zcG9ydCBsYXllciBzZWN0aW9uLgorICogWFhYOiBUaGlzIG5lZWRzIHRvIGdvIGludG8gPHNjc2kvc2FzLmg+CisgKi8KK3N0cnVjdCBzc3BfY21kX2l1IHsKKwl1OCBMVU5bOF07CisJdTggYWRkX2NkYl9sZW46NjsKKwl1OCBfcl9hOjI7CisJdTggX3JfYjsKKwl1OCBlbl9mYnVyc3Q6MTsKKwl1OCB0YXNrX3ByaW86NDsKKwl1OCB0YXNrX2F0dHI6MzsKKwl1OCBfcl9jOworCisJdTggY2RiWzE2XTsKK30gIF9fcGFja2VkOworCisvKgorICogY29udGVudHMgb2YgdGhlIFNTUCBUQVNLIElORk9STUFUSU9OIFVOSVQuCisgKiBGb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGVzZSBpbmRpdmlkdWFsIGZpZWxkcyBwbGVhc2UKKyAqIHJlZmVyZW5jZSB0aGUgU0FTIHNwZWNpZmljYXRpb24gU1NQIHRyYW5zcG9ydCBsYXllciBzZWN0aW9uLgorICogWFhYOiBUaGlzIG5lZWRzIHRvIGdvIGludG8gPHNjc2kvc2FzLmg+CisgKi8KK3N0cnVjdCBzc3BfdGFza19pdSB7CisJdTggTFVOWzhdOworCXU4IF9yX2E7CisJdTggdGFza19mdW5jOworCXU4IF9yX2JbNF07CisJdTE2IHRhc2tfdGFnOworCXU4IF9yX2NbMTJdOworfSAgX19wYWNrZWQ7CisKKworLyoKKyAqIHN0cnVjdCBzbXBfcmVxX3BoeV9pZCAtIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRlbnRzIG9mCisgKiAgICBhbiBTTVAgUmVxdWVzdCB0aGF0IGlzIGNvbXByaXNlZCBvZiB0aGUgc3RydWN0IHNtcF9yZXF1ZXN0X2hlYWRlciBhbmQgYQorICogICAgcGh5IGlkZW50aWZpZXIuCisgKiAgICBFeGFtcGxlczogU01QX1JFUVVFU1RfRElTQ09WRVIsIFNNUF9SRVFVRVNUX1JFUE9SVF9QSFlfU0FUQS4KKyAqCisgKiBGb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGVzZSBpbmRpdmlkdWFsIGZpZWxkcyBwbGVhc2UgcmVmZXJlbmNlCisgKiB0aGUgU0FTIHNwZWNpZmljYXRpb24uCisgKi8KK3N0cnVjdCBzbXBfcmVxX3BoeV9pZCB7CisJdTggX3JfYVs0XTsJCS8qIGJ5dGVzIDQtNyAqLworCisJdTggaWduX3pvbmVfZ3JwOjE7CS8qIGJ5dGUgOCAqLworCXU4IF9yX2I6NzsKKworCXU4IHBoeV9pZDsJCS8qIGJ5dGUgOSAqLworCXU4IF9yX2M7CQkvKiBieXRlIDEwICovCisJdTggX3JfZDsJCS8qIGJ5dGUgMTEgKi8KK30gIF9fcGFja2VkOworCisvKgorICogc3RydWN0IHNtcF9yZXFfY29uZmlnX3JvdXRlX2luZm8gLSBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZQorICogICAgY29udGVudHMgb2YgYW4gU01QIENvbmZpZ3VyZSBSb3V0ZSBJbmZvcm1hdGlvbiByZXF1ZXN0LgorICoKKyAqIEZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRoZXNlIGluZGl2aWR1YWwgZmllbGRzIHBsZWFzZSByZWZlcmVuY2UKKyAqIHRoZSBTQVMgc3BlY2lmaWNhdGlvbi4KKyAqLworc3RydWN0IHNtcF9yZXFfY29uZl9ydGluZm8geworCXUxNiBleHBfY2hhbmdlX2NudDsJCS8qIGJ5dGVzIDQtNSAqLworCXU4IGV4cF9ydF9pZHhfaGk7CQkvKiBieXRlIDYgKi8KKwl1OCBleHBfcnRfaWR4OwkJCS8qIGJ5dGUgNyAqLworCisJdTggX3JfYTsJCQkvKiBieXRlIDggKi8KKwl1OCBwaHlfaWQ7CQkJLyogYnl0ZSA5ICovCisJdTE2IF9yX2I7CQkJLyogYnl0ZXMgMTAtMTEgKi8KKworCXU4IF9yX2M6NzsJCQkvKiBieXRlIDEyICovCisJdTggZGlzX3J0X2VudHJ5OjE7CisJdTggX3JfZFszXTsJCQkvKiBieXRlcyAxMy0xNSAqLworCisJdTggcnRfc2FzX2FkZHJbOF07CQkvKiBieXRlcyAxNi0yMyAqLworCXU4IF9yX2VbMTZdOwkJCS8qIGJ5dGVzIDI0LTM5ICovCit9ICBfX3BhY2tlZDsKKworLyoKKyAqIHN0cnVjdCBzbXBfcmVxX3BoeWNudGwgLSBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb250ZW50cyBvZiBhbgorICogICAgU01QIFBoeSBDb250cm9sbGVyIHJlcXVlc3QuCisgKgorICogRm9yIHNwZWNpZmljIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlc2UgaW5kaXZpZHVhbCBmaWVsZHMgcGxlYXNlIHJlZmVyZW5jZQorICogdGhlIFNBUyBzcGVjaWZpY2F0aW9uLgorICovCitzdHJ1Y3Qgc21wX3JlcV9waHljbnRsIHsKKwl1MTYgZXhwX2NoYW5nZV9jbnQ7CQkvKiBieXRlIDQtNSAqLworCisJdTggX3JfYVszXTsJCQkvKiBieXRlcyA2LTggKi8KKworCXU4IHBoeV9pZDsJCQkvKiBieXRlIDkgKi8KKwl1OCBwaHlfb3A7CQkJLyogYnl0ZSAxMCAqLworCisJdTggdXBkX3BhdGh3YXk6MTsJCS8qIGJ5dGUgMTEgKi8KKwl1OCBfcl9iOjc7CisKKwl1OCBfcl9jWzEyXTsJCQkvKiBieXRlIDEyLTIzICovCisKKwl1OCBhdHRfZGV2X25hbWVbOF07ICAgICAgICAgICAgIC8qIGJ5dGUgMjQtMzEgKi8KKworCXU4IF9yX2Q6NDsJCQkvKiBieXRlIDMyICovCisJdTggbWluX2xpbmtyYXRlOjQ7CisKKwl1OCBfcl9lOjQ7CQkJLyogYnl0ZSAzMyAqLworCXU4IG1heF9saW5rcmF0ZTo0OworCisJdTggX3JfZlsyXTsJCQkvKiBieXRlIDM0LTM1ICovCisKKwl1OCBwYXRod2F5OjQ7CQkJLyogYnl0ZSAzNiAqLworCXU4IF9yX2c6NDsKKworCXU4IF9yX2hbM107CQkJLyogYnl0ZXMgMzctMzkgKi8KK30gIF9fcGFja2VkOworCisvKgorICogc3RydWN0IHNtcF9yZXEgLSBUaGlzIHN0cnVjdHVyZSBzaW1wbHkgdW5pb25pemVzIHRoZSBleGlzdGluZyByZXF1ZXN0CisgKiAgICBzdHJ1Y3R1cmVzIGludG8gYSBjb21tb24gcmVxdWVzdCB0eXBlLgorICoKKyAqIFhYWDogVGhpcyBkYXRhIHN0cnVjdHVyZSBtYXkgbmVlZCB0byBnbyB0byBzY3NpL3Nhcy5oCisgKi8KK3N0cnVjdCBzbXBfcmVxIHsKKwl1OCB0eXBlOwkJLyogYnl0ZSAwICovCisJdTggZnVuYzsJCS8qIGJ5dGUgMSAqLworCXU4IGFsbG9jX3Jlc3BfbGVuOwkvKiBieXRlIDIgKi8KKwl1OCByZXFfbGVuOwkJLyogYnl0ZSAzICovCisJdTggcmVxX2RhdGFbMF07Cit9ICBfX3BhY2tlZDsKKworI2RlZmluZSBTTVBfUkVTUF9IRFJfU1oJNAorCisvKgorICogc3RydWN0IHNjaV9zYXNfYWRkcmVzcyAtIFRoaXMgc3RydWN0dXJlIGRlcGljdHMgaG93IGEgU0FTIGFkZHJlc3MgaXMKKyAqICAgIHJlcHJlc2VudGVkIGJ5IFNDSS4KKyAqIFhYWCBjb252ZXJ0IHRoaXMgdG8gdTggW1NBU19BRERSX1NJWkVdIGxpa2UgdGhlIHJlc3Qgb2YgbGlic2FzCisgKgorICovCitzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIHsKKwl1MzIgaGlnaDsKKwl1MzIgbG93OworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvc2N1X2NvbXBsZXRpb25fY29kZXMuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3NjdV9jb21wbGV0aW9uX2NvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiMzI5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3NjdV9jb21wbGV0aW9uX2NvZGVzLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDVV9DT01QTEVUSU9OX0NPREVTX0hFQURFUl8KKyNkZWZpbmUgX1NDVV9DT01QTEVUSU9OX0NPREVTX0hFQURFUl8KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbnN0YW50cyBhbmQgbWFjcm9zIGZvciB0aGUgU0NVIGhhcmR3YXJlIGNvbXBsZXRpb24KKyAqICAgIGNvZGVzLgorICoKKyAqCisgKi8KKworI2RlZmluZSBTQ1VfQ09NUExFVElPTl9UWVBFX1NISUZUICAgICAgMjgKKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fVFlQRV9NQVNLICAgICAgIDB4NzAwMDAwMDAKKworLyoqCisgKiBTQ1VfQ09NUExFVElPTl9UWVBFKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gY29uc3RydWN0cyBhbiBTQ1UgY29tcGxldGlvbiB0eXBlCisgKi8KKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fVFlQRSh0eXBlKSBcCisJKCh1MzIpKHR5cGUpIDw8IFNDVV9DT01QTEVUSU9OX1RZUEVfU0hJRlQpCisKKy8qKgorICogU0NVX0NPTVBMRVRJT05fVFlQRSgpIC0KKyAqCisgKiBUaGVzZSBtYWNyb3MgY29udGFpbiB0aGUgU0NVIGNvbXBsZXRpb24gdHlwZXMgU0NVX0NPTVBMRVRJT05fVFlQRQorICovCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEVfVEFTSyAgICAgICBTQ1VfQ09NUExFVElPTl9UWVBFKDApCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEVfU0RNQSAgICAgICBTQ1VfQ09NUExFVElPTl9UWVBFKDEpCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEVfVUZJICAgICAgICBTQ1VfQ09NUExFVElPTl9UWVBFKDIpCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEVfRVZFTlQgICAgICBTQ1VfQ09NUExFVElPTl9UWVBFKDMpCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RZUEVfTk9USUZZICAgICBTQ1VfQ09NUExFVElPTl9UWVBFKDQpCisKKy8qKgorICoKKyAqCisgKiBUaGVzZSBjb25zdGFudHMgcHJvdmlkZSB0aGUgc2hpZnQgYW5kIG1hc2sgdmFsdWVzIGZvciB0aGUgdmFyaW91cyBwYXJ0cyBvZgorICogYW4gU0NVIGNvbXBsZXRpb24gY29kZS4KKyAqLworI2RlZmluZSBTQ1VfQ09NUExFVElPTl9TVEFUVVNfTUFTSyAgICAgICAweDBGRkMwMDAwCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19NQVNLICAgIDB4MEZDMDAwMDAKKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUICAgMjIKKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fU0RNQV9TVEFUVVNfTUFTSyAgMHgwMDNDMDAwMAorI2RlZmluZSBTQ1VfQ09NUExFVElPTl9QRUdfTUFTSyAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1BPUlRfTUFTSyAgICAgICAgIDB4MDAwMDcwMDAKKyNkZWZpbmUgU0NVX0NPTVBMRVRJT05fUEVfTUFTSyAgICAgICAgICAgU0NVX0NPTVBMRVRJT05fUE9SVF9NQVNLCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX1BFX1NISUZUICAgICAgICAgIDEyCisjZGVmaW5lIFNDVV9DT01QTEVUSU9OX0lOREVYX01BU0sgICAgICAgIDB4MDAwMDBGRkYKKworLyoqCisgKiBTQ1VfR0VUX0NPTVBMRVRJT05fVFlQRSgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIFNDVSBjb21wbGV0aW9uIHR5cGUuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9DT01QTEVUSU9OX1RZUEUoY29tcGxldGlvbl9jb2RlKSBcCisJKChjb21wbGV0aW9uX2NvZGUpICYgU0NVX0NPTVBMRVRJT05fVFlQRV9NQVNLKQorCisvKioKKyAqIFNDVV9HRVRfQ09NUExFVElPTl9TVEFUVVMoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIHRoZSBTQ1UgY29tcGxldGlvbiBzdGF0dXMuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpIFwKKwkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfQ09NUExFVElPTl9TVEFUVVNfTUFTSykKKworLyoqCisgKiBTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgdHJhbnNwb3J0IGxheWVyIGNvbXBsZXRpb24gc3RhdHVzLgorICovCisjZGVmaW5lIFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSBcCisJKChjb21wbGV0aW9uX2NvZGUpICYgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX01BU0spCisKKy8qKgorICogU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoKSAtCisgKgorICogVGhpcyBtYWNybyB0YWtlcyBhIGNvbXBsZXRpb24gY29kZSBhbmQgcGVyZm9ybXMgdGhlIHNoaWZ0IGFuZCBtYXNrCisgKiBvcGVyYXRpb25zIHRvIHR1cm4gaXQgaW50byBhIGNvbXBsZXRpb24gY29kZSB0aGF0IGNhbiBiZSBjb21wYXJlZCB0byBhCisgKiBTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTLgorICovCisjZGVmaW5lIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSkgXAorCSgodTMyKShjb21wbGV0aW9uX2NvZGUpIDw8IFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVCkKKworLyoqCisgKiBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gdGFrZXMgYSBTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTIGFuZCBub3JtYWxpemVzIGl0IGZvciBhCisgKiByZXR1cm4gY29kZS4KKyAqLworI2RlZmluZSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSkgXAorCShcCisJCSgoY29tcGxldGlvbl9jb2RlKSAmIFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19NQVNLKSBcCisJCT4+IFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVCBcCisJKQorCisvKioKKyAqIFNDVV9HRVRfQ09NUExFVElPTl9TRE1BX1NUQVRVUygpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIFNETUEgY29tcGxldGlvbiBzdGF0dXMuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9DT01QTEVUSU9OX1NETUFfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkJXAorCSgoY29tcGxldGlvbl9jb2RlKSAmIFNDVV9DT01QTEVUSU9OX1NETUFfU1RBVFVTX01BU0spCisKKy8qKgorICogU0NVX0dFVF9DT01QTEVUSU9OX1BFRygpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIFByb3RvY29sIEVuZ2luZSBHcm91cCBmcm9tIHRoZSBjb21wbGV0aW9uIGNvZGUuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9DT01QTEVUSU9OX1BFRyhjb21wbGV0aW9uX2NvZGUpCVwKKwkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfQ09NUExFVElPTl9QRUdfTUFTSykKKworLyoqCisgKiBTQ1VfR0VUX0NPTVBMRVRJT05fUE9SVCgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldXR1cm5zIHRoZSBsb2dpY2FsIHBvcnQgaW5kZXggZnJvbSB0aGUgY29tcGxldGlvbiBjb2RlLgorICovCisjZGVmaW5lIFNDVV9HRVRfQ09NUExFVElPTl9QT1JUKGNvbXBsZXRpb25fY29kZSkgXAorCSgoY29tcGxldGlvbl9jb2RlKSAmIFNDVV9DT01QTEVUSU9OX1BPUlRfTUFTSykKKworLyoqCisgKiBTQ1VfR0VUX1BST1RPQ09MX0VOR0lORV9JTkRFWCgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIFBFIGluZGV4IGZyb20gdGhlIGNvbXBsZXRpb24gY29kZS4KKyAqLworI2RlZmluZSBTQ1VfR0VUX1BST1RPQ09MX0VOR0lORV9JTkRFWChjb21wbGV0aW9uX2NvZGUpIFwKKwkoKChjb21wbGV0aW9uX2NvZGUpICYgU0NVX0NPTVBMRVRJT05fUEVfTUFTSykgPj4gU0NVX0NPTVBMRVRJT05fUEVfU0hJRlQpCisKKy8qKgorICogU0NVX0dFVF9DT01QTEVUSU9OX0lOREVYKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNvbXBsZXRpb24gd2hpY2ggaXMgZWl0aGVyIGEgVENpIG9yIGFuCisgKiBSTmkgZGVwZW5kaW5nIG9uIHRoZSBjb21wbGV0aW9uIHR5cGUuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9DT01QTEVUSU9OX0lOREVYKGNvbXBsZXRpb25fY29kZSkgXAorCSgoY29tcGxldGlvbl9jb2RlKSAmIFNDVV9DT01QTEVUSU9OX0lOREVYX01BU0spCisKKyNkZWZpbmUgU0NVX1VOU09MSUNJVEVEX0ZSQU1FX01BU0sgICAgIDB4MEZGRjAwMDAKKyNkZWZpbmUgU0NVX1VOU09MSUNJVEVEX0ZSQU1FX1NISUZUICAgIDE2CisKKy8qKgorICogU0NVX0dFVF9GUkFNRV9JTkRFWCgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgYSBub3JtYWxpemVkIGZyYW1lIGluZGV4IGZyb20gYW4gdW5zb2xpY2l0ZWQgZnJhbWUKKyAqIGNvbXBsZXRpb24uCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9GUkFNRV9JTkRFWChjb21wbGV0aW9uX2NvZGUpIFwKKwkoXAorCQkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfTUFTSykgXAorCQk+PiBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfU0hJRlQgXAorCSkKKworI2RlZmluZSBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfRVJST1JfTUFTSyAgMHgwMDAwODAwMAorCisvKioKKyAqIFNDVV9HRVRfRlJBTUVfRVJST1IoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIGEgemVybyAoMCkgdmFsdWUgaWYgdGhlcmUgaXMgbm8gZnJhbWUgZXJyb3Igb3RoZXJ3aXNlIGl0CisgKiByZXR1cm5zIG5vbi16ZXJvICghMCkuCisgKi8KKyNkZWZpbmUgU0NVX0dFVF9GUkFNRV9FUlJPUihjb21wbGV0aW9uX2NvZGUpIFwKKwkoKGNvbXBsZXRpb25fY29kZSkgJiBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfRVJST1JfTUFTSykKKworLyoqCisgKgorICoKKyAqIFRoZXNlIGNvbnN0YW50cyByZXByZXNlbnQgbm9ybWFsaXplZCBjb21wbGV0aW9uIGNvZGVzIHdoaWNoIG11c3QgYmUgc2hpZnRlZAorICogMTggYml0cyB0byBtYXRjaCBpdCB3aXRoIHRoZSBoYXJkd2FyZSBjb21wbGV0aW9uIGNvZGUuIEluIGEgMTYtYml0IGNvbXBpbGVyLAorICogaW1tZWRpYXRlIGNvbnN0YW50cyBhcmUgMTYtYml0IHZhbHVlcyAodGhlIHNpemUgb2YgYW4gaW50KS4gSWYgd2Ugc2hpZnQKKyAqIHRob3NlIGJ5IDE4IGJpdHMsIHdlIGNvbXBsZXRlbHkgbG9zZSB0aGUgdmFsdWUuIFRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgYQorICogMzItYml0IHZhbHVlIGxpa2Ugd2Ugd2FudCwgZWFjaCBpbW1lZGlhdGUgdmFsdWUgbXVzdCBiZSBjYXN0IHRvIGEgdTMyLgorICovCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfR09PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDAwKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0NSQ19FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxNCkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9DSEVDS19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MTQpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfR0VOX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDE1KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX05BS19DTURfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxNikKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9DTURfTExfUl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MTYpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfTExfUl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDE3KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0FDS19OQUtfVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxNykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9MTF9QRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MTgpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfTExfU1lfVEVSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDE5KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX05BS19FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxOSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9MTF9MRl9URVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MUEpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfREFUQV9MRU5fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFBKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0xMX0NMX1RFUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxQikKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9MTF9BQk9SVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MUIpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfU0VRX0lOVl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFDKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1VORVhQX1hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxQykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9JTlZfRklTX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MUQpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfWFJfSVVfTEVOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFEKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0lOVl9GSVNfTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgxRSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9YUl9XRF9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MUUpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfU0RNQV9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDFGKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX09GRlNFVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyMCkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9NQVhfUExEX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjEpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfRVhDRVNTX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDIyKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0xGX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyMykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9VTkVYUF9GSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjQpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfVU5FWFBfUkVTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDI0KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0VBUkxZX1JFU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyNSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9TTVBfUkVTUF9UT19FUlIgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjYpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfRE1BU0VUVVBfRElSRVJSICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDI3KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1NNUF9VRklfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyNykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9YRkVSQ05UX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MjgpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfU01QX0ZSTV9UWVBFX0VSUiAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDI4KQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1NNUF9MTF9SWF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyOSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9SRVNQX0xFTl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MkEpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfVU5FWFBfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDJCKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX09QRU5fRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyQykKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9VTkVYUF9TREJGSVMgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MkQpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfUkVHX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDJFKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1NEQl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgyRikKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9UQVNLX0FCT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4MzApCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfQ01EX1NETUFfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAoKFUzMikweDMyKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX0NNRF9MTF9BQk9SVF9FUlIgICAgICAgICAgICAgICAgICAgICAgKChVMzIpMHgzMykKKyNkZWZpbmUgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfV1JPTkdfREVTVElOQVRJT04gICAgICAgICAgICAgICgodTMyKTB4MzQpCisjZGVmaW5lIFNDVV9UQVNLX09QRU5fUkVKRUNUX1JFU0VSVkVEX0FCQU5ET05fMSAgICAgICAgICAgICAoKHUzMikweDM1KQorI2RlZmluZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9SRVNFUlZFRF9BQkFORE9OXzIgICAgICAgICAgICAgKCh1MzIpMHgzNikKKyNkZWZpbmUgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfUkVTRVJWRURfQUJBTkRPTl8zICAgICAgICAgICAgICgodTMyKTB4MzcpCisjZGVmaW5lIFNDVV9UQVNLX09QRU5fUkVKRUNUX0JBRF9ERVNUSU5BVElPTiAgICAgICAgICAgICAgICAoKHUzMikweDM4KQorI2RlZmluZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9aT05FX1ZJT0xBVElPTiAgICAgICAgICAgICAgICAgKCh1MzIpMHgzOSkKKyNkZWZpbmUgU0NVX1RBU0tfRE9ORV9WSUlUX0VOVFJZX05WICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKTB4M0EpCisjZGVmaW5lIFNDVV9UQVNLX0RPTkVfSUlUX0VOVFJZX05WICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikweDNCKQorI2RlZmluZSBTQ1VfVEFTS19ET05FX1JOQ05WX09VVEJPVU5EICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpMHgzQykKKyNkZWZpbmUgU0NVX1RBU0tfT1BFTl9SRUpFQ1RfU1RQX1JFU09VUkNFU19CVVNZICAgICAgICAgICAgICgodTMyKTB4M0QpCisjZGVmaW5lIFNDVV9UQVNLX09QRU5fUkVKRUNUX1BST1RPQ09MX05PVF9TVVBQT1JURUQgICAgICAgICAoKHUzMikweDNFKQorI2RlZmluZSBTQ1VfVEFTS19PUEVOX1JFSkVDVF9DT05ORUNUSU9OX1JBVEVfTk9UX1NVUFBPUlRFRCAgKCh1MzIpMHgzRikKKworI2VuZGlmIC8qIF9TQ1VfQ09NUExFVElPTl9DT0RFU19IRUFERVJfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfZXZlbnRfY29kZXMuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3NjdV9ldmVudF9jb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTk0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfZXZlbnRfY29kZXMuaApAQCAtMCwwICsxLDMzNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX1NDVV9FVkVOVF9DT0RFU19IRUFERVJfXworI2RlZmluZSBfX1NDVV9FVkVOVF9DT0RFU19IRUFERVJfXworCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29uc3RhbnRzIGFuZCBtYWNyb3MgZm9yIHRoZSBTQ1UgZXZlbnQgY29kZXMuCisgKgorICoKKyAqLworCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX0NPREVfU0hJRlQgICAgICAyNAorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9DT0RFX01BU0sgICAgICAgMHgwRjAwMDAwMAorCisjZGVmaW5lIFNDVV9FVkVOVF9TUEVDSUZJQ19DT0RFX1NISUZUICAxOAorI2RlZmluZSBTQ1VfRVZFTlRfU1BFQ0lGSUNfQ09ERV9NQVNLICAgMHgwMEZDMDAwMAorCisjZGVmaW5lIFNDVV9FVkVOVF9DT0RFX01BU0sgXAorCShTQ1VfRVZFTlRfVFlQRV9DT0RFX01BU0sgfCBTQ1VfRVZFTlRfU1BFQ0lGSUNfQ09ERV9NQVNLKQorCisvKioKKyAqIFNDVV9FVkVOVF9UWVBFKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gY29uc3RydWN0cyBhbiBTQ1UgZXZlbnQgdHlwZSBmcm9tIHRoZSB0eXBlIHZhbHVlLgorICovCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFKHR5cGUpIFwKKwkoKHUzMikodHlwZSkgPDwgU0NVX0VWRU5UX1RZUEVfQ09ERV9TSElGVCkKKworLyoqCisgKiBTQ1VfRVZFTlRfU1BFQ0lGSUMoKSAtCisgKgorICogVGhpcyBtYWNybyBjb25zdHJ1Y3RzIGFuIFNDVSBldmVudCBzcGVjaWZpZXIgZnJvbSB0aGUgY29kZSB2YWx1ZS4KKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfU1BFQ0lGSUMoY29kZSkgXAorCSgodTMyKShjb2RlKSA8PCBTQ1VfRVZFTlRfU1BFQ0lGSUNfQ09ERV9TSElGVCkKKworLyoqCisgKiBTQ1VfRVZFTlRfTUVTU0FHRSgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIGNvbnN0cnVjdHMgYSBjb21iaW5lcyBhbiBTQ1UgZXZlbnQgdHlwZSBhbmQgU0NVIGV2ZW50IHNwZWNpZmllcgorICogZnJvbSB0aGUgdHlwZSBhbmQgY29kZSB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX01FU1NBR0UodHlwZSwgY29kZSkgXAorCSgodHlwZSkgfCBTQ1VfRVZFTlRfU1BFQ0lGSUMoY29kZSkpCisKKy8qKgorICogU0NVX0VWRU5UX1RZUEUoKSAtCisgKgorICogU0NVX0VWRU5UX1RZUEVTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfU01VX0NPTU1BTkRfRVJST1IgIFNDVV9FVkVOVF9UWVBFKDB4MDgpCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX1NNVV9QQ1FfRVJST1IgICAgICBTQ1VfRVZFTlRfVFlQRSgweDA5KQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9TTVVfRVJST1IgICAgICAgICAgU0NVX0VWRU5UX1RZUEUoMHgwMCkKKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfVFJBTlNQT1JUX0VSUk9SICAgIFNDVV9FVkVOVF9UWVBFKDB4MDEpCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UgICBTQ1VfRVZFTlRfVFlQRSgweDAyKQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5UICAgICAgICAgU0NVX0VWRU5UX1RZUEUoMHgwMykKKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfRkFUQUxfTUVNT1JZX0VSUk9SIFNDVV9FVkVOVF9UWVBFKDB4MEYpCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYICAgICBTQ1VfRVZFTlRfVFlQRSgweDA0KQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWF9SWCAgU0NVX0VWRU5UX1RZUEUoMHgwNSkKKyNkZWZpbmUgU0NVX0VWRU5UX1RZUEVfUk5DX09QU19NSVNDICAgICAgIFNDVV9FVkVOVF9UWVBFKDB4MDYpCisjZGVmaW5lIFNDVV9FVkVOVF9UWVBFX1BUWF9TQ0hFRFVMRV9FVkVOVCBTQ1VfRVZFTlRfVFlQRSgweDA3KQorI2RlZmluZSBTQ1VfRVZFTlRfVFlQRV9FUlJfQ05UX0VWRU5UICAgICAgU0NVX0VWRU5UX1RZUEUoMHgwQSkKKworLyoqCisgKgorICoKKyAqIFNDVV9FVkVOVF9TUEVDSUZJRVJTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1NQRUNJRklFUl9EUklWRVJfU1VTUEVORCAweDIwCisjZGVmaW5lIFNDVV9FVkVOVF9TUEVDSUZJRVJfUk5DX1JFTEVBU0UgICAgMHgwMAorCisvKioKKyAqCisgKgorICogU01VX0NPTU1BTkRfRVZFTlRTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX0lOVkFMSURfQ09OVEVYVF9DT01NQU5EIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9TTVVfQ09NTUFORF9FUlJPUiwgMHgwMCkKKworLyoqCisgKgorICoKKyAqIFNNVV9QQ1FfRVZFTlRTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1VOQ09SUkVDVEFCTEVfUENRX0VSUk9SIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9TTVVfUENRX0VSUk9SLCAweDAwKQorCisvKioKKyAqCisgKgorICogU01VX0VWRU5UUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9VTkNPUlJFQ1RBQkxFX1JFR0lTVEVSX1dSSVRFIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9TTVVfRVJST1IsIDB4MDIpCisjZGVmaW5lIFNDVV9FVkVOVF9VTkNPUlJFQ1RBQkxFX1JFR0lTVEVSX1JFQUQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1NNVV9FUlJPUiwgMHgwMykKKyNkZWZpbmUgU0NVX0VWRU5UX1BDSUVfSU5URVJGQUNFX0VSUk9SIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9TTVVfRVJST1IsIDB4MDQpCisjZGVmaW5lIFNDVV9FVkVOVF9GVU5DVElPTl9MRVZFTF9SRVNFVCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfU01VX0VSUk9SLCAweDA1KQorCisvKioKKyAqCisgKgorICogVFJBTlNQT1JUX0xFVkVMX0VSUk9SUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9BQ0tfTkFLX1RJTUVPVVRfRVJST1IJXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1RSQU5TUE9SVF9FUlJPUiwgMHgwMCkKKworLyoqCisgKgorICoKKyAqIEJST0FEQ0FTVF9DSEFOR0VfRVZFTlRTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX0JST0FEQ0FTVF9DSEFOR0UgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDEpCisjZGVmaW5lIFNDVV9FVkVOVF9CUk9BRENBU1RfUkVTRVJWRUQwIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9CUk9BRENBU1RfQ0hBTkdFLCAweDAyKQorI2RlZmluZSBTQ1VfRVZFTlRfQlJPQURDQVNUX1JFU0VSVkVEMSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfQlJPQURDQVNUX0NIQU5HRSwgMHgwMykKKyNkZWZpbmUgU0NVX0VWRU5UX0JST0FEQ0FTVF9TRVMJXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDQpCisjZGVmaW5lIFNDVV9FVkVOVF9CUk9BRENBU1RfRVhQQU5ERVIgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDUpCisjZGVmaW5lIFNDVV9FVkVOVF9CUk9BRENBU1RfQUVOCVwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9CUk9BRENBU1RfQ0hBTkdFLCAweDA2KQorI2RlZmluZSBTQ1VfRVZFTlRfQlJPQURDQVNUX1JFU0VSVkVEMyBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfQlJPQURDQVNUX0NIQU5HRSwgMHgwNykKKyNkZWZpbmUgU0NVX0VWRU5UX0JST0FEQ0FTVF9SRVNFUlZFRDQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDgpCisjZGVmaW5lIFNDVV9FVkVOVF9QRV9TVVNQRU5ERUQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0JST0FEQ0FTVF9DSEFOR0UsIDB4MDkpCisKKy8qKgorICoKKyAqCisgKiBPU1NQX0VWRU5UUworICovCisjZGVmaW5lIFNDVV9FVkVOVF9QT1JUX1NFTEVDVE9SX0RFVEVDVEVEIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDEwKQorI2RlZmluZSBTQ1VfRVZFTlRfU0VOVF9QT1JUX1NFTEVDVElPTiBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxMSkKKyNkZWZpbmUgU0NVX0VWRU5UX0hBUkRfUkVTRVRfVFJBTlNNSVRURUQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MTIpCisjZGVmaW5lIFNDVV9FVkVOVF9IQVJEX1JFU0VUX1JFQ0VJVkVEIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDEzKQorI2RlZmluZSBTQ1VfRVZFTlRfUkVDRUlWRURfSURFTlRJRllfVElNRU9VVCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxNSkKKyNkZWZpbmUgU0NVX0VWRU5UX0xJTktfRkFJTFVSRSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxNikKKyNkZWZpbmUgU0NVX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MTcpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVNfMTVfU1NDIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDE4KQorI2RlZmluZSBTQ1VfRVZFTlRfU0FTXzE1IFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDE5KQorI2RlZmluZSBTQ1VfRVZFTlRfU0FTXzMwX1NTQyBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxQSkKKyNkZWZpbmUgU0NVX0VWRU5UX1NBU18zMCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxQikKKyNkZWZpbmUgU0NVX0VWRU5UX1NBU182MF9TU0MgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MUMpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVNfNjAgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MUQpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVRBXzE1X1NTQyBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgxRSkKKyNkZWZpbmUgU0NVX0VWRU5UX1NBVEFfMTUgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MUYpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVRBXzMwX1NTQyBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgyMCkKKyNkZWZpbmUgU0NVX0VWRU5UX1NBVEFfMzAgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MjEpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVRBXzYwX1NTQyBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfT1NTUF9FVkVOVCwgMHgyMikKKyNkZWZpbmUgU0NVX0VWRU5UX1NBVEFfNjAgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MjMpCisjZGVmaW5lIFNDVV9FVkVOVF9TQVNfUEhZX0RFVEVDVEVEIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9PU1NQX0VWRU5ULCAweDI0KQorI2RlZmluZSBTQ1VfRVZFTlRfU0FUQV9QSFlfREVURUNURUQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX09TU1BfRVZFTlQsIDB4MjUpCisKKy8qKgorICoKKyAqCisgKiBGQVRBTF9JTlRFUk5BTF9NRU1PUllfRVJST1JfRVZFTlRTCisgKi8KKyNkZWZpbmUgU0NVX0VWRU5UX1RTQ19STlNDX1VOQ09SUkVDVEFCTEVfRVJST1IgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0ZBVEFMX01FTU9SWV9FUlJPUiwgIDB4MDApCisjZGVmaW5lIFNDVV9FVkVOVF9UQ19STkNfVU5DT1JSRUNUQUJMRV9FUlJPUiBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfRkFUQUxfTUVNT1JZX0VSUk9SLCAgMHgwMSkKKyNkZWZpbmUgU0NVX0VWRU5UX1pQVF9VTkNPUlJFQ1RBQkxFX0VSUk9SIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9GQVRBTF9NRU1PUllfRVJST1IsICAweDAyKQorCisvKioKKyAqCisgKgorICogUkVNT1RFX05PREVfU1VTUEVORF9FVkVOVFMKKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfVExfUk5DX1NVU1BFTkRfVFggXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYLCAweDAwKQorI2RlZmluZSBTQ1VfRVZFTlRfVExfUk5DX1NVU1BFTkRfVFhfUlggXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYLCAweDAwKQorI2RlZmluZSBTQ1VfRVZFTlRfRFJJVkVSX1BPU1RfUk5DX1NVU1BFTkRfVFggXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYLCAweDIwKQorI2RlZmluZSBTQ1VfRVZFTlRfRFJJVkVSX1BPU1RfUk5DX1NVU1BFTkRfVFhfUlgJXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYLCAweDIwKQorCisvKioKKyAqCisgKgorICogUkVNT1RFX05PREVfTUlTQ19FVkVOVFMKKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfUE9TVF9SQ05fUkVMRUFTRSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfUk5DX09QU19NSVNDLCBTQ1VfRVZFTlRfU1BFQ0lGSUVSX1JOQ19SRUxFQVNFKQorI2RlZmluZSBTQ1VfRVZFTlRfUE9TVF9JVF9ORVhVU19MT1NTX1RJTUVSX0VOQUJMRSBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfUk5DX09QU19NSVNDLCAweDAxKQorI2RlZmluZSBTQ1VfRVZFTlRfUE9TVF9JVF9ORVhVU19MT1NTX1RJTUVSX0RJU0FCTEUgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX1JOQ19PUFNfTUlTQywgMHgwMikKKyNkZWZpbmUgU0NVX0VWRU5UX1BPU1RfUk5DX0NPTVBMRVRFIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9STkNfT1BTX01JU0MsIDB4MDMpCisjZGVmaW5lIFNDVV9FVkVOVF9QT1NUX1JOQ19JTlZBTElEQVRFX0NPTVBMRVRFIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9STkNfT1BTX01JU0MsIDB4MDQpCisKKy8qKgorICoKKyAqCisgKiBFUlJPUl9DT1VOVF9FVkVOVAorICovCisjZGVmaW5lIFNDVV9FVkVOVF9SWF9DUkVESVRfQkxPQ0tFRF9SRUNFSVZFRCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfRVJSX0NOVF9FVkVOVCwgMHgwMCkKKyNkZWZpbmUgU0NVX0VWRU5UX1RYX0RPTkVfQ1JFRElUX1RJTUVPVVQgXAorCVNDVV9FVkVOVF9NRVNTQUdFKFNDVV9FVkVOVF9UWVBFX0VSUl9DTlRfRVZFTlQsIDB4MDEpCisjZGVmaW5lIFNDVV9FVkVOVF9SWF9ET05FX0NSRURJVF9USU1FT1VUIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9FUlJfQ05UX0VWRU5ULCAweDAyKQorCisvKioKKyAqIHNjdV9nZXRfZXZlbnRfdHlwZSgpIC0KKyAqCisgKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIFNDVSBldmVudCB0eXBlIGZyb20gdGhlIGV2ZW50IGNvZGUuCisgKi8KKyNkZWZpbmUgc2N1X2dldF9ldmVudF90eXBlKGV2ZW50X2NvZGUpIFwKKwkoKGV2ZW50X2NvZGUpICYgU0NVX0VWRU5UX1RZUEVfQ09ERV9NQVNLKQorCisvKioKKyAqIHNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKCkgLQorICoKKyAqIFRoaXMgbWFjcm8gcmV0dXJucyB0aGUgU0NVIGV2ZW50IHNwZWNpZmllciBmcm9tIHRoZSBldmVudCBjb2RlLgorICovCisjZGVmaW5lIHNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKGV2ZW50X2NvZGUpIFwKKwkoKGV2ZW50X2NvZGUpICYgU0NVX0VWRU5UX1NQRUNJRklDX0NPREVfTUFTSykKKworLyoqCisgKiBzY3VfZ2V0X2V2ZW50X2NvZGUoKSAtCisgKgorICogVGhpcyBtYWNybyByZXR1cm5zIHRoZSBjb21iaW5lZCBTQ1UgZXZlbnQgdHlwZSBhbmQgU0NVIGV2ZW50IHNwZWNpZmllciBmcm9tCisgKiB0aGUgZXZlbnQgY29kZS4KKyAqLworI2RlZmluZSBzY3VfZ2V0X2V2ZW50X2NvZGUoZXZlbnRfY29kZSkgXAorCSgoZXZlbnRfY29kZSkgJiBTQ1VfRVZFTlRfQ09ERV9NQVNLKQorCisKKy8qKgorICoKKyAqCisgKiBQVFNfU0NIRURVTEVfRVZFTlQKKyAqLworI2RlZmluZSBTQ1VfRVZFTlRfU01QX1JFU1BPTlNFX05PX1BFIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9QVFhfU0NIRURVTEVfRVZFTlQsIDB4MDApCisjZGVmaW5lIFNDVV9FVkVOVF9TUEVDSUZJQ19TTVBfUkVTUE9OU0VfTk9fUEUgXAorCXNjdV9nZXRfZXZlbnRfc3BlY2lmaWVyKFNDVV9FVkVOVF9TTVBfUkVTUE9OU0VfTk9fUEUpCisKKyNkZWZpbmUgU0NVX0VWRU5UX1RBU0tfVElNRU9VVCBcCisJU0NVX0VWRU5UX01FU1NBR0UoU0NVX0VWRU5UX1RZUEVfUFRYX1NDSEVEVUxFX0VWRU5ULCAweDAxKQorI2RlZmluZSBTQ1VfRVZFTlRfU1BFQ0lGSUNfVEFTS19USU1FT1VUCVwKKwlzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihTQ1VfRVZFTlRfVEFTS19USU1FT1VUKQorCisjZGVmaW5lIFNDVV9FVkVOVF9JVF9ORVhVU19USU1FT1VUIFwKKwlTQ1VfRVZFTlRfTUVTU0FHRShTQ1VfRVZFTlRfVFlQRV9QVFhfU0NIRURVTEVfRVZFTlQsIDB4MDIpCisjZGVmaW5lIFNDVV9FVkVOVF9TUEVDSUZJQ19JVF9ORVhVU19USU1FT1VUIFwKKwlzY3VfZ2V0X2V2ZW50X3NwZWNpZmllcihTQ1VfRVZFTlRfSVRfTkVYVVNfVElNRU9VVCkKKworCisjZW5kaWYgLyogX19TQ1VfRVZFTlRfQ09ERVNfSEVBREVSX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3NjdV9yZW1vdGVfbm9kZV9jb250ZXh0LmggYi9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfcmVtb3RlX25vZGVfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzQ1YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfcmVtb3RlX25vZGVfY29udGV4dC5oCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fU0NVX1JFTU9URV9OT0RFX0NPTlRFWFRfSEVBREVSX18KKyNkZWZpbmUgX19TQ1VfUkVNT1RFX05PREVfQ09OVEVYVF9IRUFERVJfXworCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RydWN0dXJlcyBhbmQgY29uc3RhdG5zIHVzZWQgYnkgdGhlIFNDVSBoYXJkd2FyZSB0bworICogICAgZGVzY3JpYmUgYSByZW1vdGUgbm9kZSBjb250ZXh0LgorICoKKyAqCisgKi8KKworLyoqCisgKiBzdHJ1Y3Qgc3NwX3JlbW90ZV9ub2RlX2NvbnRleHQgLSBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgU0NVIGhhcmR3YXJlCisgKiAgICBkZWZpbml0aW9uIGZvciBhbiBTU1AgcmVtb3RlIG5vZGUuCisgKgorICoKKyAqLworc3RydWN0IHNzcF9yZW1vdGVfbm9kZV9jb250ZXh0IHsKKwkvKiBXT1JEIDAgKi8KKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIHJlbW90ZSBub2RlIGluZGV4IGFzc2lnbmVkIGZvciB0aGlzIHJlbW90ZSBub2RlLiBBbGwKKwkgKiByZW1vdGUgbm9kZXMgbXVzdCBoYXZlIGEgdW5pcXVlIHJlbW90ZSBub2RlIGluZGV4LiBUaGUgdmFsdWUgb2YgdGhlIHJlbW90ZQorCSAqIG5vZGUgaW5kZXggY2FuIG5vdCBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlbW90ZSBub2RlcyByZXBvcnRlZCBpbgorCSAqIHRoZSBTQ1UgZGV2aWNlIGNvbnRleHQgY2FwYWNpdHkgcmVnaXN0ZXIuCisJICovCisJdTMyIHJlbW90ZV9ub2RlX2luZGV4OjEyOworCXUzMiByZXNlcnZlZDBfMTo0OworCisJLyoqCisJICogVGhpcyBmaWVsZCB0ZWxscyB0aGUgU0NVIGhhcmR3YXJlIGhvdyBtYW55IHNpbXVsdGFuZW91cyBjb25uZWN0aW9ucyB0aGF0CisJICogdGhpcyByZW1vdGUgbm9kZSB3aWxsIHN1cHBvcnQuCisJICovCisJdTMyIHJlbW90ZV9ub2RlX3BvcnRfd2lkdGg6NDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgdGVsbHMgdGhlIFNDVSBoYXJkd2FyZSB3aGljaCBsb2dpY2FsIHBvcnQgdG8gYXNzb2NpYXRlIHdpdGggdGhpcworCSAqIHJlbW90ZSBub2RlLgorCSAqLworCXUzMiBsb2dpY2FsX3BvcnRfaW5kZXg6MzsKKwl1MzIgcmVzZXJ2ZWQwXzI6NTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgd2lsbCBlbmFibGUgdGhlIElfVCBuZXh1cyBsb3NzIHRpbWVyIGZvciB0aGlzIHJlbW90ZSBub2RlLgorCSAqLworCXUzMiBuZXh1c19sb3NzX3RpbWVyX2VuYWJsZToxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgZm9yIGRyaXZlciBkZWJ1ZyBvbmx5IGFuZCBpcyBub3QgdXNlZC4KKwkgKi8KKwl1MzIgY2hlY2tfYml0OjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHRydWUgd2hlbiB0aGUgaGFyZHdhcmUgRE1BcyB0aGUgcmVtb3RlIG5vZGUKKwkgKiBjb250ZXh0IHRvIHRoZSBoYXJkd2FyZSBTUkFNLiAgV2hlbiB0aGUgcmVtb3RlIG5vZGUgaXMgYmVpbmcgaW52YWxpZGF0ZWQKKwkgKiB0aGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIGZhbHNlLgorCSAqLworCXUzMiBpc192YWxpZDoxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB0cnVlLgorCSAqLworCXUzMiBpc19yZW1vdGVfbm9kZV9jb250ZXh0OjE7CisKKwkvKiBXT1JEIDEgLSAyICovCisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBsb3cgd29yZCBvZiB0aGUgcmVtb3RlIGRldmljZSBTQVMgQWRkcmVzcworCSAqLworCXUzMiByZW1vdGVfc2FzX2FkZHJlc3NfbG87CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBoaWdoIHdvcmQgb2YgdGhlIHJlbW90ZSBkZXZpY2UgU0FTIEFkZHJlc3MKKwkgKi8KKwl1MzIgcmVtb3RlX3Nhc19hZGRyZXNzX2hpOworCisJLyogV09SRCAzICovCisJLyoqCisJICogVGhpcyBmaWVsZCByZXByZW5zZXRzIHRoZSBmdW5jdGlvbiBudW1iZXIgYXNzaWduZWQgdG8gdGhpcyByZW1vdGUgZGV2aWNlLgorCSAqIFRoaXMgdmFsdWUgbXVzdCBtYXRjaCB0aGUgdmlydHVhbCBmdW5jdGlvbiBudW1iZXIgdGhhdCBpcyBiZWluZyB1c2VkIHRvCisJICogY29tbXVuaWNhdGUgdG8gdGhlIGRldmljZS4KKwkgKi8KKwl1MzIgZnVuY3Rpb25fbnVtYmVyOjg7CisJdTMyIHJlc2VydmVkM18xOjg7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHByb3ZpZGVzIHRoZSBkcml2ZXIgYSB3YXkgdG8gY2hlYXQgb24gdGhlIGFyYml0cmF0aW9uIHdhaXQgdGltZQorCSAqIGZvciB0aGlzIHJlbW90ZSBub2RlLgorCSAqLworCXUzMiBhcmJpdHJhdGlvbl93YWl0X3RpbWU6MTY7CisKKwkvKiBXT1JEIDQgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIHRlbGxzIHRoZSBTQ1UgaGFyZHdhcmUgaG93IGxvbmcgdGhpcyBkZXZpY2UgbWF5IG9jY3VweSB0aGUKKwkgKiBjb25uZWN0aW9uIGJlZm9yZSBpdCBtdXN0IGJlIGNsb3NlZC4KKwkgKi8KKwl1MzIgY29ubmVjdGlvbl9vY2N1cGFuY3lfdGltZW91dDoxNjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgdGVsbHMgdGhlIFNDVSBoYXJkd2FyZSBob3cgbG9uZyB0byBtYWludGFpbiBhIGNvbm5lY3Rpb24gd2hlbgorCSAqIHRoZXJlIGFyZSBubyBmcmFtZXMgYmVpbmcgdHJhbnNtaXR0ZWQgb24gdGhlIGxpbmsuCisJICovCisJdTMyIGNvbm5lY3Rpb25faW5hY3Rpdml0eV90aW1lb3V0OjE2OworCisJLyogV09SRCAgNSAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgYWxsb3dzIHRoZSBkcml2ZXIgdG8gY2hlYXQgb24gdGhlIGFyYml0cmF0aW9uIHdhaXQgdGltZSBmb3IgdGhpcworCSAqIHJlbW90ZSBub2RlLgorCSAqLworCXUzMiBpbml0aWFsX2FyYml0cmF0aW9uX3dhaXRfdGltZToxNjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGVsbHMgdGhlIGhhcmR3YXJlIHdoYXQgdG8gcHJvZ3JhbSBmb3IgdGhlIGNvbm5lY3Rpb24gcmF0ZSBpbgorCSAqIHRoZSBvcGVuIGFkZHJlc3MgZnJhbWUuICBTZWUgdGhlIFNBUyBzcGVjIGZvciB2YWxpZCB2YWx1ZXMuCisJICovCisJdTMyIG9hZl9jb25uZWN0aW9uX3JhdGU6NDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgdGVsbHMgdGhlIFNDVSBoYXJkd2FyZSB3aGF0IHRvIHByb2dyYW0gZm9yIHRoZSBmZWF0dXJlcyBpbiB0aGUKKwkgKiBvcGVuIGFkZHJlc3MgZnJhbWUuICBTZWUgdGhlIFNBUyBzcGVjIGZvciB2YWxpZCB2YWx1ZXMuCisJICovCisJdTMyIG9hZl9mZWF0dXJlczo0OworCisJLyoqCisJICogVGhpcyBmaWVsZCB0ZWxscyB0aGUgU0NVIGhhcmR3YXJlIHdoYXQgdG8gdXNlIGZvciB0aGUgc291cmNlIHpvbmUgZ3JvdXAgaW4KKwkgKiB0aGUgb3BlbiBhZGRyZXNzIGZyYW1lLiAgU2VlIHRoZSBTQVMgc3BlYyBmb3IgbW9yZSBkZXRhaWxzIG9uIHpvbmluZy4KKwkgKi8KKwl1MzIgb2FmX3NvdXJjZV96b25lX2dyb3VwOjg7CisKKwkvKiBXT1JEIDYgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIHRlbGxzIHRoZSBTQ1UgaGFyZHdhcmUgd2hhdCB0byB1c2UgYXMgdGhlIG1vcmUgY2FwaWJpbGl0aWVzIGluCisJICogdGhlIG9wZW4gYWRkcmVzcyBmcmFtZS4gU2VlIHRoZSBTQVMgU3BlYyBmb3IgZGV0YWlscy4KKwkgKi8KKwl1MzIgb2FmX21vcmVfY29tcGF0aWJpbGl0eV9mZWF0dXJlczsKKworCS8qIFdPUkQgNyAqLworCXUzMiByZXNlcnZlZDc7CisKK307CisKKy8qKgorICogc3RydWN0IHN0cF9yZW1vdGVfbm9kZV9jb250ZXh0IC0gVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIFNDVSBoYXJkd2FyZQorICogICAgZGVmaW5pdGlvbiBmb3IgYSBTVFAgcmVtb3RlIG5vZGUuCisgKgorICogU1RQIFRhcmdldHMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIHNvIHRoaXMgZGVmaW5pdGlvbiBpcyBhIHBsYWNlaG9sZGVyIHVudGlsCisgKiB3ZSBkbyBzdXBwb3J0IHRoZW0uCisgKi8KK3N0cnVjdCBzdHBfcmVtb3RlX25vZGVfY29udGV4dCB7CisJLyoqCisJICogUGxhY2Vob2xkZXIgZGF0YSBmb3IgdGhlIFNUUCByZW1vdGUgbm9kZS4KKwkgKi8KKwl1MzIgZGF0YVs4XTsKKworfTsKKworLyoqCisgKiBUaGlzIHVuaW9uIGNvbWJpbmVzIHRoZSBTQVMgYW5kIFNBVEEgcmVtb3RlIG5vZGUgZGVmaW5pdGlvbnMuCisgKgorICogdW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQKKyAqLwordW5pb24gc2N1X3JlbW90ZV9ub2RlX2NvbnRleHQgeworCS8qKgorCSAqIFNTUCBSZW1vdGUgTm9kZQorCSAqLworCXN0cnVjdCBzc3BfcmVtb3RlX25vZGVfY29udGV4dCBzc3A7CisKKwkvKioKKwkgKiBTVFAgUmVtb3RlIE5vZGUKKwkgKi8KKwlzdHJ1Y3Qgc3RwX3JlbW90ZV9ub2RlX2NvbnRleHQgc3RwOworCit9OworCisjZW5kaWYgLyogX19TQ1VfUkVNT1RFX05PREVfQ09OVEVYVF9IRUFERVJfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvc2N1X3Rhc2tfY29udGV4dC5oIGIvZHJpdmVycy9zY3NpL2lzY2kvc2N1X3Rhc2tfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjg3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9zY3VfdGFza19jb250ZXh0LmgKQEAgLTAsMCArMSw5NDIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1NDVV9UQVNLX0NPTlRFWFRfSF8KKyNkZWZpbmUgX1NDVV9UQVNLX0NPTlRFWFRfSF8KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyBmb3IgdGhlIFNDVSBoYXJkd2FyZSB0YXNrCisgKiAgICBjb250ZXh0LgorICoKKyAqCisgKi8KKworCisvKioKKyAqIGVudW0gc2N1X3NzcF90YXNrX3R5cGUgLSBUaGlzIGVudW1iZXJhdGlvbiBkZWZpbmVzIHRoZSB2YXJpb3VzIFNTUCB0YXNrCisgKiAgICB0eXBlcyB0aGUgU0NVIGhhcmR3YXJlIHdpbGwgYWNjZXB0LiBUaGUgZGVmaW5pdGlvbiBmb3IgdGhlIHZhcmlvdXMgdGFzaworICogICAgdHlwZXMgdGhlIFNDVSBoYXJkd2FyZSB3aWxsIGFjY2VwdCBjYW4gYmUgZm91bmQgaW4gdGhlIERTIHNwZWNpZmljYXRpb24uCisgKgorICoKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlTQ1VfVEFTS19UWVBFX0lPUkVBRCwgICAgICAgICAgIC8qIC88IElPIFJFQUQgZGlyZWN0aW9uIG9yIG5vIGRpcmVjdGlvbiAqLworCVNDVV9UQVNLX1RZUEVfSU9XUklURSwgICAgICAgICAgLyogLzwgSU8gV3JpdGUgZGlyZWN0aW9uICovCisJU0NVX1RBU0tfVFlQRV9TTVBfUkVRVUVTVCwgICAgICAvKiAvPCBTTVAgUmVxdWVzdCB0eXBlICovCisJU0NVX1RBU0tfVFlQRV9SRVNQT05TRSwgICAgICAgICAvKiAvPCBEcml2ZXIgZ2VuZXJhdGVkIHJlc3BvbnNlIGZyYW1lICh0YXJndCBtb2RlKSAqLworCVNDVV9UQVNLX1RZUEVfUkFXX0ZSQU1FLCAgICAgICAgLyogLzwgUmF3IGZyYW1lIHJlcXVlc3QgdHlwZSAqLworCVNDVV9UQVNLX1RZUEVfUFJJTUlUSVZFICAgICAgICAgLyogLzwgUmVxdWVzdCBmb3IgYSBwcmltaXRpdmUgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KK30gc2N1X3NzcF90YXNrX3R5cGU7CisKKy8qKgorICogZW51bSBzY3Vfc2F0YV90YXNrX3R5cGUgLSBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZhcmlvdXMgU0FUQSB0YXNrCisgKiAgICB0eXBlcyB0aGUgU0NVIGhhcmR3YXJlIHdpbGwgYWNjZXB0LiBUaGUgZGVmaW5pdGlvbiBmb3IgdGhlIHZhcmlvdXMgdGFzaworICogICAgdHlwZXMgdGhlIFNDVSBoYXJkd2FyZSB3aWxsIGFjY2VwdCBjYW4gYmUgZm91bmQgaW4gdGhlIERTIHNwZWNpZmljYXRpb24uCisgKgorICoKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlTQ1VfVEFTS19UWVBFX0RNQV9JTiwgICAgICAgICAgIC8qIC88IFJlYWQgcmVxdWVzdCAqLworCVNDVV9UQVNLX1RZUEVfRlBETUFRX1JFQUQsICAgICAgLyogLzwgTkNRIHJlYWQgcmVxdWVzdCAqLworCVNDVV9UQVNLX1RZUEVfUEFDS0VUX0RNQV9JTiwgICAgLyogLzwgUGFja2V0IHJlYWQgcmVxdWVzdCAqLworCVNDVV9UQVNLX1RZUEVfU0FUQV9SQVdfRlJBTUUsICAgLyogLzwgUmF3IGZyYW1lIHJlcXVlc3QgKi8KKwlSRVNFUlZFRF80LAorCVJFU0VSVkVEXzUsCisJUkVTRVJWRURfNiwKKwlSRVNFUlZFRF83LAorCVNDVV9UQVNLX1RZUEVfRE1BX09VVCwgICAgICAgICAgLyogLzwgV3JpdGUgcmVxdWVzdCAqLworCVNDVV9UQVNLX1RZUEVfRlBETUFRX1dSSVRFLCAgICAgLyogLzwgTkNRIHdyaXRlIFJlcXVlc3QgKi8KKwlTQ1VfVEFTS19UWVBFX1BBQ0tFVF9ETUFfT1VUICAgIC8qIC88IFBhY2tldCB3cml0ZSByZXF1ZXN0ICovCit9IHNjdV9zYXRhX3Rhc2tfdHlwZTsKKworCisvKioKKyAqCisgKgorICogU0NVX0NPTlRFWFRfVFlQRQorICovCisjZGVmaW5lIFNDVV9UQVNLX0NPTlRFWFRfVFlQRSAgMAorI2RlZmluZSBTQ1VfUk5DX0NPTlRFWFRfVFlQRSAgIDEKKworLyoqCisgKgorICoKKyAqIFNDVV9UQVNLX0NPTlRFWFRfVkFMSURJVFkKKyAqLworI2RlZmluZSBTQ1VfVEFTS19DT05URVhUX0lOVkFMSUQgICAgICAgICAgMAorI2RlZmluZSBTQ1VfVEFTS19DT05URVhUX1ZBTElEICAgICAgICAgICAgMQorCisvKioKKyAqCisgKgorICogU0NVX0NPTU1BTkRfQ09ERQorICovCisjZGVmaW5lIFNDVV9DT01NQU5EX0NPREVfSU5JVElBVE9SX05FV19UQVNLICAgMAorI2RlZmluZSBTQ1VfQ09NTUFORF9DT0RFX0FDVElWRV9UQVNLICAgICAgICAgIDEKKyNkZWZpbmUgU0NVX0NPTU1BTkRfQ09ERV9QUklNSVRJVkVfU0VRX1RBU0sgICAyCisjZGVmaW5lIFNDVV9DT01NQU5EX0NPREVfVEFSR0VUX1JBV19GUkFNRVMgICAgMworCisvKioKKyAqCisgKgorICogU0NVX1RBU0tfUFJJT1JJVFkKKyAqLworLyoqCisgKgorICoKKyAqIFRoaXMgcHJpb3JpdHkgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByaW9yaXR5IHJlcXVlc3QgZm9yIHRoaXMgcmVxdWVzdC4KKyAqLworI2RlZmluZSBTQ1VfVEFTS19QUklPUklUWV9OT1JNQUwgICAgICAgICAgMAorCisvKioKKyAqCisgKgorICogVGhpcyBwcmlvcml0eSBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBzaG91bGQgYmUgc2NoZWR1bGVkIHRvIHRoZSBoZWFkIG9mIHRoZQorICogcXVldWUuICBUaGUgdGFzayB3aWxsIE5PVCBiZSBleGVjdXRlZCBpZiB0aGUgVFggaXMgc3VzcGVuZGVkIGZvciB0aGUgcmVtb3RlCisgKiBub2RlLgorICovCisjZGVmaW5lIFNDVV9UQVNLX1BSSU9SSVRZX0hFQURfT0ZfUSAgICAgICAxCisKKy8qKgorICoKKyAqCisgKiBUaGlzIHByaW9yaXR5IGluZGljYXRlcyB0aGF0IHRoZSB0YXNrIHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlIGFsbAorICogU0NVX1RBU0tfUFJJT1JJVFlfTk9STUFMIGFuZCBTQ1VfVEFTS19QUklPUklUWV9IRUFEX09GX1EgdGFza3MuIFRoZSB0YXNrCisgKiBXSUxMIGJlIGV4ZWN1dGVkIGlmIHRoZSBUWCBpcyBzdXNwZW5kZWQgZm9yIHRoZSByZW1vdGUgbm9kZS4KKyAqLworI2RlZmluZSBTQ1VfVEFTS19QUklPUklUWV9ISUdIICAgICAgICAgICAgMgorCisvKioKKyAqCisgKgorICogVGhpcyB0YXNrIHByaW9yaXR5IGlzIHJlc2VydmVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuCisgKi8KKyNkZWZpbmUgU0NVX1RBU0tfUFJJT1JJVFlfUkVTRVJWRUQgICAgICAgIDMKKworI2RlZmluZSBTQ1VfVEFTS19JTklUSUFUT1JfTU9ERSAgICAgICAgICAgMQorI2RlZmluZSBTQ1VfVEFTS19UQVJHRVRfTU9ERSAgICAgICAgICAgICAgMAorCisjZGVmaW5lIFNDVV9UQVNLX1JFR1VMQVIgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNDVV9UQVNLX0FCT1JURUQgICAgICAgICAgICAgICAgICAxCisKKy8qIGRpcmVjdGlvbiBiaXQgZGVmaW50aW9uICovCisvKioKKyAqCisgKgorICogU0FUQV9ESVJFQ1RJT04KKyAqLworI2RlZmluZSBTQ1VfU0FUQV9XUklURV9EQVRBX0RJUkVDVElPTiAgICAgMAorI2RlZmluZSBTQ1VfU0FUQV9SRUFEX0RBVEFfRElSRUNUSU9OICAgICAgMQorCisvKioKKyAqCisgKgorICogU0NVX0NPTU1BTkRfQ09OVEVYVF9NQUNST1MgVGhlc2UgbWFjcm9zIHByb3ZpZGUgdGhlIG1hc2sgYW5kIHNoaWZ0CisgKiBvcGVyYXRpb25zIHRvIGNvbnN0cnVjdCB0aGUgdmFyaW91cyBTQ1UgY29tbWFuZHMKKyAqLworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9TSElGVCAgICAgICAgICAgMjEKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfTUFTSyAgICAgICAgICAgIDB4MDBFMDAwMDAKKyNkZWZpbmUgc2N1X2dldF9jb21tYW5kX3JlcXVlc3RfdHlwZSh4KQlcCisJKCh4KSAmIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX01BU0spCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1NVQlRZUEVfU0hJRlQgICAgICAgIDE4CisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9TVUJUWVBFX01BU0sgICAgICAgICAweDAwMUMwMDAwCisjZGVmaW5lIHNjdV9nZXRfY29tbWFuZF9yZXF1ZXN0X3N1YnR5cGUoeCkgXAorCSgoeCkgJiBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfU1VCVFlQRV9NQVNLKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9GVUxMVFlQRV9NQVNLCSBcCisJKFwKKwkJU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfTUFTSwkJICBcCisJCXwgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1NVQlRZUEVfTUFTSwkgICAgXAorCSkKKyNkZWZpbmUgc2N1X2dldF9jb21tYW5kX3JlcXVlc3RfZnVsbF90eXBlKHgpIFwKKwkoKHgpICYgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX0ZVTExUWVBFX01BU0spCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9QUk9UT0NPTF9FTkdJTkVfR1JPVVBfU0hJRlQgIDE2CisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUFJPVE9DT0xfRU5HSU5FX0dST1VQX01BU0sgICAweDAwMDEwMDAwCisjZGVmaW5lIHNjdV9nZXRfY29tbWFuZF9wcm90b2NsX2VuZ2luZV9ncm91cCh4KQlcCisJKCh4KSAmIFNDVV9DT05URVhUX0NPTU1BTkRfUFJPVE9DT0xfRU5HSU5FX0dST1VQX01BU0spCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9MT0dJQ0FMX1BPUlRfU0hJRlQgICAgICAgICAgIDEyCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfTE9HSUNBTF9QT1JUX01BU0sgICAgICAgICAgICAweDAwMDA3MDAwCisjZGVmaW5lIHNjdV9nZXRfY29tbWFuZF9yZXFldXN0X2xvZ2ljYWxfcG9ydCh4KQlcCisJKCh4KSAmIFNDVV9DT05URVhUX0NPTU1BTkRfTE9HSUNBTF9QT1JUX01BU0spCisKKworI2RlZmluZSBNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfVFlQRSh0eXBlKSBcCisJKCh1MzIpKHR5cGUpIDw8IFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1NISUZUKQorCisvKioKKyAqIE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9UWVBFKCkgLQorICoKKyAqIFNDVV9DT01NQU5EX1RZUEVTIFRoZXNlIGNvbnN0YW50cyBwcm92aWRlIHRoZSBncm91cGluZyBvZiB0aGUgZGlmZmVyZW50IFNDVQorICogY29tbWFuZCB0eXBlcy4KKyAqLworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9QT1NUX1RDICAgIE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9UWVBFKDApCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX0RVTVBfVEMgICAgTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1RZUEUoMSkKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9STkMgICBNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfVFlQRSgyKQorI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9EVU1QX1JOQyAgIE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9UWVBFKDMpCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX09USEVSX1JOQyAgTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1RZUEUoNikKKworI2RlZmluZSBNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVCh0eXBlLCBjb21tYW5kKQlcCisJKCh0eXBlKSB8ICgoY29tbWFuZCkgPDwgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1NVQlRZUEVfU0hJRlQpKQorCisvKioKKyAqCisgKgorICogU0NVX1JFUVVFU1RfVFlQRVMgVGhlc2UgY29uc3RhbnRzIGFyZSB0aGUgdmFyaW91cyByZXF1ZXN0IHR5cGVzIHRoYXQgY2FuIGJlCisgKiBwb3N0ZWQgdG8gdGhlIFNDVSBoYXJkd2FyZS4KKyAqLworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVTVF9QT1NUX1RDIFwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9UQywgMCkpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1BPU1RfVENfQUJPUlQgXAorCShNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVChTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9QT1NUX1RDLCAxKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVTVF9EVU1QX1RDIFwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfRFVNUF9UQywgMCkpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ18zMglcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfUk5DLCAwKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DXzk2CVwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfUE9TVF9STkMsIDEpKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfSU5WQUxJREFURQlcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX1BPU1RfUk5DLCAyKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX0RVTVBfUk5DXzMyCVwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfRFVNUF9STkMsIDApKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfRFVNUF9STkNfOTYJXAorCShNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVChTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9EVU1QX1JOQywgMSkpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfQ09NTUFORF9QT1NUX1JOQ19TVVNQRU5EX1RYCVwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfT1RIRVJfUk5DLCAwKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9DT01NQU5EX1BPU1RfUk5DX1NVU1BFTkRfVFhfUlggXAorCShNQUtFX1NDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVChTQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1RfVFlQRV9PVEhFUl9STkMsIDEpKQorCisjZGVmaW5lIFNDVV9DT05URVhUX0NPTU1BTkRfUE9TVF9STkNfUkVTVU1FIFwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfT1RIRVJfUk5DLCAyKSkKKworI2RlZmluZSBTQ1VfQ09OVEVYVF9JVF9ORVhVU19MT1NTX1RJTUVSX0VOQUJMRSBcCisJKE1BS0VfU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUKFNDVV9DT05URVhUX0NPTU1BTkRfUkVRVUVTVF9UWVBFX09USEVSX1JOQywgMykpCisKKyNkZWZpbmUgU0NVX0NPTlRFWFRfSVRfTkVYVVNfTE9TU19USU1FUl9ESVNBQkxFCVwKKwkoTUFLRV9TQ1VfQ09OVEVYVF9DT01NQU5EX1JFUVVFU1QoU0NVX0NPTlRFWFRfQ09NTUFORF9SRVFVRVNUX1RZUEVfT1RIRVJfUk5DLCA0KSkKKworLyoqCisgKgorICoKKyAqIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0wgU0NVIFRhc2sgY29udGV4dCBwcm90b2NvbCB0eXBlcyB0aGlzIGlzIHVlc2QgdG8KKyAqIHByb2dyYW0gdGhlIFNDVSBUYXNrIGNvbnRleHQgcHJvdG9jb2wgZmllbGQgaW4gd29yZCAweDAwLgorICovCisjZGVmaW5lIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU01QICAgIDB4MDAKKyNkZWZpbmUgU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TU1AgICAgMHgwMQorI2RlZmluZSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX1NUUCAgICAweDAyCisjZGVmaW5lIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfTk9ORSAgIDB4MDcKKworLyoqCisgKiBzdHJ1Y3Qgc3NwX3Rhc2tfY29udGV4dCAtIFRoaXMgaXMgdGhlIFNDVSBoYXJkd2FyZSBkZWZpbml0aW9uIGZvciBhbiBTU1AKKyAqICAgIHJlcXVlc3QuCisgKgorICoKKyAqLworc3RydWN0IHNzcF90YXNrX2NvbnRleHQgeworCS8qIE9GRlNFVCAweDE4ICovCisJdTMyIHJlc2VydmVkMDA6MjQ7CisJdTMyIGZyYW1lX3R5cGU6ODsKKworCS8qIE9GRlNFVCAweDFDICovCisJdTMyIHJlc2VydmVkMDE7CisKKwkvKiBPRkZTRVQgMHgyMCAqLworCXUzMiBmaWxsX2J5dGVzOjI7CisJdTMyIHJlc2VydmVkMDI6NjsKKwl1MzIgY2hhbmdpbmdfZGF0YV9wb2ludGVyOjE7CisJdTMyIHJldHJhbnNtaXQ6MTsKKwl1MzIgcmV0cnlfZGF0YV9mcmFtZToxOworCXUzMiB0bHJfY29udHJvbDoyOworCXUzMiByZXNlcnZlZDAzOjE5OworCisJLyogT0ZGU0VUIDB4MjQgKi8KKwl1MzIgdWlSc3ZkNDsKKworCS8qIE9GRlNFVCAweDI4ICovCisJdTMyIHRhcmdldF9wb3J0X3RyYW5zZmVyX3RhZzoxNjsKKwl1MzIgdGFnOjE2OworCisJLyogT0ZGU0VUIDB4MkMgKi8KKwl1MzIgZGF0YV9vZmZzZXQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBzdHBfdGFza19jb250ZXh0IC0gVGhpcyBpcyB0aGUgU0NVIGhhcmR3YXJlIGRlZmluaXRpb24gZm9yIGFuIFNUUAorICogICAgcmVxdWVzdC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc3RwX3Rhc2tfY29udGV4dCB7CisJLyogT0ZGU0VUIDB4MTggKi8KKwl1MzIgZmlzX3R5cGU6ODsKKwl1MzIgcG1fcG9ydDo0OworCXUzMiByZXNlcnZlZDA6MzsKKwl1MzIgY29udHJvbDoxOworCXUzMiBjb21tYW5kOjg7CisJdTMyIGZlYXR1cmVzOjg7CisKKwkvKiBPRkZTRVQgMHgxQyAqLworCXUzMiByZXNlcnZlZDE7CisKKwkvKiBPRkZTRVQgMHgyMCAqLworCXUzMiByZXNlcnZlZDI7CisKKwkvKiBPRkZTRVQgMHgyNCAqLworCXUzMiByZXNlcnZlZDM7CisKKwkvKiBPRkZTRVQgMHgyOCAqLworCXUzMiBuY3FfdGFnOjU7CisJdTMyIHJlc2VydmVkNDoyNzsKKworCS8qIE9GRlNFVCAweDJDICovCisJdTMyIGRhdGFfb2Zmc2V0OyAvKiBUT0RPOiBXaGF0IGlzIHRoaXMgdXNlZCBmb3I/ICovCit9OworCisvKioKKyAqIHN0cnVjdCBzbXBfdGFza19jb250ZXh0IC0gVGhpcyBpcyB0aGUgU0NVIGhhcmR3YXJlIGRlZmluaXRpb24gZm9yIGFuIFNNUAorICogICAgcmVxdWVzdC4KKyAqCisgKgorICovCitzdHJ1Y3Qgc21wX3Rhc2tfY29udGV4dCB7CisJLyogT0ZGU0VUIDB4MTggKi8KKwl1MzIgcmVzcG9uc2VfbGVuZ3RoOjg7CisJdTMyIGZ1bmN0aW9uX3Jlc3VsdDo4OworCXUzMiBmdW5jdGlvbjo4OworCXUzMiBmcmFtZV90eXBlOjg7CisKKwkvKiBPRkZTRVQgMHgxQyAqLworCXUzMiBzbXBfcmVzcG9uc2VfdWZpOjEyOworCXUzMiByZXNlcnZlZDE6MjA7CisKKwkvKiBPRkZTRVQgMHgyMCAqLworCXUzMiByZXNlcnZlZDI7CisKKwkvKiBPRkZTRVQgMHgyNCAqLworCXUzMiByZXNlcnZlZDM7CisKKwkvKiBPRkZTRVQgMHgyOCAqLworCXUzMiByZXNlcnZlZDQ7CisKKwkvKiBPRkZTRVQgMHgyQyAqLworCXUzMiByZXNlcnZlZDU7Cit9OworCisvKioKKyAqIHN0cnVjdCBwcmltaXRpdmVfdGFza19jb250ZXh0IC0gVGhpcyBpcyB0aGUgU0NVIGhhcmR3YXJlIGRlZmluaXRpb24gdXNlZAorICogICAgd2hlbiB0aGUgZHJpdmVyIHdhbnRzIHRvIHNlbmQgYSBwcmltaXRpdmUgb24gdGhlIGxpbmsuCisgKgorICoKKyAqLworc3RydWN0IHByaW1pdGl2ZV90YXNrX2NvbnRleHQgeworCS8qIE9GRlNFVCAweDE4ICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgY29udHJvbCB3b3JkIGFuZCBpdCBtdXN0IGJlIDAuCisJICovCisJdTMyIGNvbnRyb2w7IC8qIC88IG11c3QgYmUgc2V0IHRvIDAgKi8KKworCS8qIE9GRlNFVCAweDFDICovCisJLyoqCisJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIHByaW1pdGl2ZSB0aGF0IGlzIHRvIGJlIHRyYW5zbWl0dGVkLgorCSAqLworCXUzMiBzZXF1ZW5jZTsKKworCS8qIE9GRlNFVCAweDIwICovCisJdTMyIHJlc2VydmVkMDsKKworCS8qIE9GRlNFVCAweDI0ICovCisJdTMyIHJlc2VydmVkMTsKKworCS8qIE9GRlNFVCAweDI4ICovCisJdTMyIHJlc2VydmVkMjsKKworCS8qIE9GRlNFVCAweDJDICovCisJdTMyIHJlc2VydmVkMzsKK307CisKKy8qKgorICogVGhlIHVuaW9uIG9mIHRoZSBwcm90b2NvbHMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgaW4gdGhlIFNDVSB0YXNrIGNvbnRleHQKKyAqICAgIGZpZWxkLgorICoKKyAqIHByb3RvY29sX2NvbnRleHQKKyAqLwordW5pb24gcHJvdG9jb2xfY29udGV4dCB7CisJc3RydWN0IHNzcF90YXNrX2NvbnRleHQgc3NwOworCXN0cnVjdCBzdHBfdGFza19jb250ZXh0IHN0cDsKKwlzdHJ1Y3Qgc21wX3Rhc2tfY29udGV4dCBzbXA7CisJc3RydWN0IHByaW1pdGl2ZV90YXNrX2NvbnRleHQgcHJpbWl0aXZlOworCXUzMiB3b3Jkc1s2XTsKK307CisKKy8qKgorICogc3RydWN0IHNjdV9zZ2xfZWxlbWVudCAtIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBzaW5nbGUgU0NVIGRlZmluZWQgU0dMCisgKiAgICBlbGVtZW50LiBTQ1UgU0dMcyBjb250YWluIGEgNjQgYml0IGFkZHJlc3Mgd2l0aCB0aGUgbWF4aW11bSBkYXRhIHRyYW5zZmVyCisgKiAgICBiZWluZyAyNCBiaXRzIGluIHNpemUuICBUaGUgU0dMIGNhbiBub3QgY3Jvc3MgYSA0R0IgYm91bmRhcnkuCisgKgorICogc3RydWN0IHNjdV9zZ2xfZWxlbWVudAorICovCitzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50IHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSB1cHBlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcy4KKwkgKi8KKwl1MzIgYWRkcmVzc191cHBlcjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIDY0IGJpdCBwaHlzaWNhbCBhZGRyZXNzLgorCSAqLworCXUzMiBhZGRyZXNzX2xvd2VyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyLgorCSAqLworCXUzMiBsZW5ndGg6MjQ7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBhZGRyZXNzIG1vZGlmaWVyIHRvIGJlIHVzZWQgd2hlbiBhIHZpcnR1YWwgZnVuY3Rpb24gaXMKKwkgKiByZXF1ZXN0aW5nIGEgZGF0YSB0cmFuc2Zlci4KKwkgKi8KKwl1MzIgYWRkcmVzc19tb2RpZmllcjo4OworCit9OworCisjZGVmaW5lIFNDVV9TR0xfRUxFTUVOVF9QQUlSX0EgICAwCisjZGVmaW5lIFNDVV9TR0xfRUxFTUVOVF9QQUlSX0IgICAxCisKKy8qKgorICogc3RydWN0IHNjdV9zZ2xfZWxlbWVudF9wYWlyIC0gVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIFNDVSBoYXJkd2FyZSBkZWZpbml0aW9uCisgKiAgICBvZiBhIHBhaXIgb2YgU0dMIGVsZW1lbnRzLiBUaGUgU0NVIGhhcmR3YXJlIGFsd2F5cyB3b3JrcyBvbiBTR0wgcGFpcnMuCisgKiAgICBUaGV5IGFyZSByZWZlcmVkIHRvIGluIHRoZSBEUyBzcGVjaWZpY2F0aW9uIGFzIFNHTCBBIGFuZCBTR0wgQi4gIEVhY2ggU0dMCisgKiAgICBwYWlyIGlzIGZvbGxvd2VkIGJ5IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IHBhaXIuCisgKgorICoKKyAqLworc3RydWN0IHNjdV9zZ2xfZWxlbWVudF9wYWlyIHsKKwkvKiBPRkZTRVQgMHg2MC0weDY4ICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgU0dMIGVsZW1lbnQgQSBvZiB0aGUgU0dMIHBhaXIuCisJICovCisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudCBBOworCisJLyogT0ZGU0VUIDB4NkMtMHg3NCAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIFNHTCBlbGVtZW50IEIgb2YgdGhlIFNHTCBwYWlyLgorCSAqLworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgQjsKKworCS8qIE9GRlNFVCAweDc4LTB4N0MgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSB1cHBlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgYWRkcmVzcyB0byB0aGUgbmV4dCBTR0wKKwkgKiBlbGVtZW50IHBhaXIuCisJICovCisJdTMyIG5leHRfcGFpcl91cHBlcjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIDY0IGJpdCBhZGRyZXNzIHRvIHRoZSBuZXh0IFNHTAorCSAqIGVsZW1lbnQgcGFpci4KKwkgKi8KKwl1MzIgbmV4dF9wYWlyX2xvd2VyOworCit9OworCisvKioKKyAqIHN0cnVjdCB0cmFuc3BvcnRfc25hcHNob3QgLSBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgU0NVIGhhcmR3YXJlIHNjcmF0Y2ggYXJlYQorICogICAgZm9yIHRoZSB0YXNrIGNvbnRleHQuIFRoaXMgaXMgc2V0IHRvIDAgYnkgdGhlIGRyaXZlciBidXQgY2FuIGJlIHJlYWQgYnkKKyAqICAgIGlzc3VpbmcgYSBkdW1wIFRDIHJlcXVlc3QgdG8gdGhlIFNDVS4KKyAqCisgKgorICovCitzdHJ1Y3QgdHJhbnNwb3J0X3NuYXBzaG90IHsKKwkvKiBPRkZTRVQgMHg0OCAqLworCXUzMiB4ZmVyX3JkeV93cml0ZV9kYXRhX2xlbmd0aDsKKworCS8qIE9GRlNFVCAweDRDICovCisJdTMyIGRhdGFfb2Zmc2V0OworCisJLyogT0ZGU0VUIDB4NTAgKi8KKwl1MzIgZGF0YV90cmFuc2Zlcl9zaXplOjI0OworCXUzMiByZXNlcnZlZF81MF8wOjg7CisKKwkvKiBPRkZTRVQgMHg1NCAqLworCXUzMiBuZXh0X2luaXRpYXRvcl93cml0ZV9kYXRhX29mZnNldDsKKworCS8qIE9GRlNFVCAweDU4ICovCisJdTMyIG5leHRfaW5pdGlhdG9yX3dyaXRlX2RhdGFfeGZlcl9zaXplOjI0OworCXUzMiByZXNlcnZlZF81OF8wOjg7Cit9OworCisvKioKKyAqIHN0cnVjdCBzY3VfdGFza19jb250ZXh0IC0gVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGVudHMgb2YgdGhlIFNDVQorICogICAgc2lsaWNvbiB0YXNrIGNvbnRleHQuIEl0IGxheXMgb3V0IGFsbCBvZiB0aGUgZmllbGRzIGFjY29yZGluZyB0byB0aGUKKyAqICAgIGV4cGVjdGVkIG9yZGVyIGFuZCBsb2NhdGlvbiBmb3IgdGhlIFN0b3JhZ2UgQ29udHJvbGxlciB1bml0LgorICoKKyAqCisgKi8KK3N0cnVjdCBzY3VfdGFza19jb250ZXh0IHsKKwkvKiBPRkZTRVQgMHgwMCAtLS0tLS0gKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c3QgYmUgZW5jb2RlZCB0byBvbmUgb2YgdGhlIHZhbGlkIFNDVSB0YXNrIHByaW9yaXR5IHZhbHVlcworCSAqICAgIC0gU0NVX1RBU0tfUFJJT1JJVFlfTk9STUFMCisJICogICAgLSBTQ1VfVEFTS19QUklPUklUWV9IRUFEX09GX1EKKwkgKiAgICAtIFNDVV9UQVNLX1BSSU9SSVRZX0hJR0gKKwkgKi8KKwl1MzIgcHJpb3JpdHk6MjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBpZiB0aGlzIGlzIGFuIGluaXRpYXRvciBnZW5lcmF0ZWQgcmVxdWVzdC4KKwkgKiBVbnRpbCB0YXJnZXQgbW9kZSBpcyBzdXBwb3J0ZWQgYWxsIHRhc2sgcmVxdWVzdHMgYXJlIGluaXRpYXRvciByZXF1ZXN0cy4KKwkgKi8KKwl1MzIgaW5pdGlhdG9yX3JlcXVlc3Q6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gb25lIG9mIHRoZSB2YWxpZCBjb25uZWN0aW9uIHJhdGVzIHZhbGlkIHZhbHVlcworCSAqIGFyZSAweDgsIDB4OSwgYW5kIDB4QS4KKwkgKi8KKwl1MzIgY29ubmVjdGlvbl9yYXRlOjQ7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c2UgYmUgcHJvZ3JhbWVkIHdoZW4gZ2VuZXJhdGluZyBhbiBTTVAgcmVzcG9uc2Ugc2luY2UgdGhlIFNNUAorCSAqIGNvbm5lY3Rpb24gcmVtYWlucyBvcGVuIHVudGlsIHRoZSBTTVAgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkLgorCSAqLworCXUzMiBwcm90b2NvbF9lbmdpbmVfaW5kZXg6MzsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBjb250YWluIHRoZSBsb2dpY2FsIHBvcnQgZm9yIHRoZSB0YXNrIHJlcXVlc3QuCisJICovCisJdTMyIGxvZ2ljYWxfcG9ydF9pbmRleDozOworCisJLyoqCisJICogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byBvbmUgb2YgdGhlIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0wgdmFsdWVzCisJICogICAgLSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX1NNUAorCSAqICAgIC0gU0NVX1RBU0tfQ09OVEVYVF9QUk9UT0NPTF9TU1AKKwkgKiAgICAtIFNDVV9UQVNLX0NPTlRFWFRfUFJPVE9DT0xfU1RQCisJICogICAgLSBTQ1VfVEFTS19DT05URVhUX1BST1RPQ09MX05PTkUKKwkgKi8KKwl1MzIgcHJvdG9jb2xfdHlwZTozOworCisJLyoqCisJICogVGhpcyBmaWxlZCBtdXN0IGJlIHNldCB0byB0aGUgVENpIGFsbG9jYXRlZCBmb3IgdGhpcyB0YXNrCisJICovCisJdTMyIHRhc2tfaW5kZXg6MTI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCBtdXN0IGJlIHNldCB0byAweDAwCisJICovCisJdTMyIHJlc2VydmVkXzAwXzA6MTsKKworCS8qKgorCSAqIEZvciBhIG5vcm1hbCB0YXNrIHJlcXVlc3QgdGhpcyBtdXN0IGJlIHNldCB0byAwLiAgSWYgdGhpcyBpcyBhbiBhYm9ydCBvZgorCSAqIHRoaXMgdGFzayByZXF1ZXN0IGl0IG11c3QgYmUgc2V0IHRvIDEuCisJICovCisJdTMyIGFib3J0OjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHRydWUgZm9yIHRoZSBTQ1UgaGFyZHdhcmUgdG8gcHJvY2VzcyB0aGUgdGFzay4KKwkgKi8KKwl1MzIgdmFsaWQ6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gU0NVX1RBU0tfQ09OVEVYVF9UWVBFCisJICovCisJdTMyIGNvbnRleHRfdHlwZToxOworCisJLyogT0ZGU0VUIDB4MDQgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBSTmkgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoaXMgcmVxdWVzdC4KKwkgKi8KKwl1MzIgcmVtb3RlX25vZGVfaW5kZXg6MTI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHByb2dyYW1tZWQgaWYgdGhpcyBpcyBhIG1pcnJvcmVkIHJlcXVlc3QsIHdoaWNoIHdlIGFyZSBub3QKKwkgKiB1c2luZywgaW4gd2hpY2ggY2FzZSBpdCBpcyB0aGUgUk5pIGZvciB0aGUgbWlycm9yZWQgdGFyZ2V0LgorCSAqLworCXUzMiBtaXJyb3JlZF9ub2RlX2luZGV4OjEyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBwcm9ncmFtbWVkIHdpdGggdGhlIGRpcmVjdGlvbiBvZiB0aGUgU0FUQSByZXFldXN0CisJICogICAgLSBTQ1VfU0FUQV9XUklURV9EQVRBX0RJUkVDVElPTgorCSAqICAgIC0gU0NVX1NBVEFfUkVBRF9EQVRBX0RJUkVDVElPTgorCSAqLworCXUzMiBzYXRhX2RpcmVjdGlvbjoxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBwcm9ncmFtbXNlZCB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIFNDVV9DT01NQU5EX0NPREUKKwkgKiAgICAtIFNDVV9DT01NQU5EX0NPREVfSU5JVElBVE9SX05FV19UQVNLCisJICogICAgLSBTQ1VfQ09NTUFORF9DT0RFX0FDVElWRV9UQVNLCisJICogICAgLSBTQ1VfQ09NTUFORF9DT0RFX1BSSU1JVElWRV9TRVFfVEFTSworCSAqICAgIC0gU0NVX0NPTU1BTkRfQ09ERV9UQVJHRVRfUkFXX0ZSQU1FUworCSAqLworCXUzMiBjb21tYW5kX2NvZGU6MjsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHRvIHRydWUgaWYgdGhlIHJlbW90ZSBub2RlIHNob3VsZCBiZSBzdXNwZW5kZWQuCisJICogVGhpcyBiaXQgaXMgb25seSB2YWxpZCBmb3IgU1NQICYgU01QIHRhcmdldCBkZXZpY2VzLgorCSAqLworCXUzMiBzdXNwZW5kX25vZGU6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgcHJvZ3JhbW1lZCB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmQgdHlwZSBjb2RlcworCSAqCisJICogRm9yIFNBUyByZXF1ZXN0cyB1c2UgdGhlIHNjdV9zc3BfdGFza190eXBlCisJICogICAgLSBTQ1VfVEFTS19UWVBFX0lPUkVBRAorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9JT1dSSVRFCisJICogICAgLSBTQ1VfVEFTS19UWVBFX1NNUF9SRVFVRVNUCisJICogICAgLSBTQ1VfVEFTS19UWVBFX1JFU1BPTlNFCisJICogICAgLSBTQ1VfVEFTS19UWVBFX1JBV19GUkFNRQorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9QUklNSVRJVkUKKwkgKgorCSAqIEZvciBTQVRBIHJlcXVlc3RzIHVzZSB0aGUgc2N1X3NhdGFfdGFza190eXBlCisJICogICAgLSBTQ1VfVEFTS19UWVBFX0RNQV9JTgorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9GUERNQVFfUkVBRAorCSAqICAgIC0gU0NVX1RBU0tfVFlQRV9QQUNLRVRfRE1BX0lOCisJICogICAgLSBTQ1VfVEFTS19UWVBFX1NBVEFfUkFXX0ZSQU1FCisJICogICAgLSBTQ1VfVEFTS19UWVBFX0RNQV9PVVQKKwkgKiAgICAtIFNDVV9UQVNLX1RZUEVfRlBETUFRX1dSSVRFCisJICogICAgLSBTQ1VfVEFTS19UWVBFX1BBQ0tFVF9ETUFfT1VUCisJICovCisJdTMyIHRhc2tfdHlwZTo0OworCisJLyogT0ZGU0VUIDB4MDggKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCB0aGUgbXVzdCBiZSBzZXQgdG8gMHgwMAorCSAqLworCXUzMiBsaW5rX2xheWVyX2NvbnRyb2w6ODsgLyogcHJlc2VudGx5IGFsbCByZXNlcnZlZCAqLworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIFRMUiBpcyB0byBiZSBlbmFibGVkCisJICovCisJdTMyIHNzcF90bHJfZW5hYmxlOjE7CisKKwkvKioKKwkgKiBUaGlzIGlzIGZpZWxkIHNwZWNpZmllcyBpZiB0aGUgU0NVIERNQXMgYSByZXNwb25zZSBmcmFtZSB0byBob3N0CisJICogbWVtb3J5IGZvciBnb29kIHJlc3BvbnNlIGZyYW1lcyB3aGVuIG9wZXJhdGluZyBpbiB0YXJnZXQgbW9kZS4KKwkgKi8KKwl1MzIgZG1hX3NzcF90YXJnZXRfZ29vZF9yZXNwb25zZToxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgaWYgdGhlIFNDVSBzaG91bGQgRE1BIHRoZSByZXNwb25zZSBmcmFtZSB0bworCSAqIGhvc3QgbWVtb3J5LgorCSAqLworCXUzMiBkb19ub3RfZG1hX3NzcF9nb29kX3Jlc3BvbnNlOjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHNldCB0byB0cnVlIHdoZW4gc3RyaWN0IG9yZGVyaW5nIGlzIHRvIGJlIGVuYWJsZWQKKwkgKi8KKwl1MzIgc3RyaWN0X29yZGVyaW5nOjE7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgdHlwZSBvZiBlbmRpYW5lc3MgdG8gYmUgdXRpbGl6ZWQgZm9yIHRoZQorCSAqIGZyYW1lLiAgY29tbWFuZCwgdGFzaywgYW5kIHJlc3BvbnNlIGZyYW1lcyB1dGlsaXplZCBjb250cm9sX2ZyYW1lCisJICogc2V0IHRvIDEuCisJICovCisJdTMyIGNvbnRyb2xfZnJhbWU6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgYW5kIHRoZSBkcml2ZXIgc2hvdWxkIHNldCB0byAweDAwCisJICovCisJdTMyIHRsX2NvbnRyb2xfcmVzZXJ2ZWQ6MzsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHRvIHRydWUgd2hlbiB0aGUgU0NVIGhhcmR3YXJlIHRhc2sgdGltZW91dCBjb250cm9sIGlzIHRvCisJICogYmUgZW5hYmxlZAorCSAqLworCXUzMiB0aW1lb3V0X2VuYWJsZToxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBhbmQgdGhlIGRyaXZlciBzaG91bGQgc2V0IGl0IHRvIDB4MDAKKwkgKi8KKwl1MzIgcHRzX2NvbnRyb2xfcmVzZXJ2ZWQ6NzsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIHNldCB0byB0cnVlIHdoZW4gYmxvY2sgZ3VhcmQgaXMgdG8gYmUgZW5hYmxlZAorCSAqLworCXUzMiBibG9ja19ndWFyZF9lbmFibGU6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgYW5kIHRoZSBkcml2ZXIgc2hvdWxkIHNldCB0byAweDAwCisJICovCisJdTMyIHNkbWFfY29udHJvbF9yZXNlcnZlZDo3OworCisJLyogT0ZGU0VUIDB4MEMgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBhZGRyZXNzIG1vZGlmaWVyIGZvciB0aGlzIGlvIHJlcXVlc3QgaXQgc2hvdWxkIGJlCisJICogcHJvZ3JhbW1lZCB3aXRoIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRoYXQgaXMgbWFraW5nIHRoZSByZXF1ZXN0LgorCSAqLworCXUzMiBhZGRyZXNzX21vZGlmaWVyOjE2OworCisJLyoqCisJICogQHRvZG8gV2hhdCB3ZSBzdXBwb3J0IG1pcnJvcmVkIFNNUCByZXNwb25zZSBmcmFtZT8KKwkgKi8KKwl1MzIgbWlycm9yZWRfcHJvdG9jb2xfZW5naW5lOjM7ICAvKiBtaXJyb3JlZCBwcm90b2NvbCBFbmdpbmUgSW5kZXggKi8KKworCS8qKgorCSAqIElmIHRoaXMgaXMgYSBtaXJyb3JlZCByZXF1ZXN0IHRoZSBsb2dpY2FsIHBvcnQgaW5kZXggZm9yIHRoZSBtaXJyb3JlZCBSTmkKKwkgKiBtdXN0IGJlIHByb2dyYW1tZWQuCisJICovCisJdTMyIG1pcnJvcmVkX2xvZ2ljYWxfcG9ydDo0OyAgLyogbWlycm9yZWQgbG9jYWwgcG9ydCBpbmRleCAqLworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBhbmQgdGhlIGRyaXZlciBtdXN0IHNldCBpdCB0byAweDAwCisJICovCisJdTMyIHJlc2VydmVkXzBDXzA6ODsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBpZiB0aGUgbWlycm9yZWQgcmVxdWVzdCBwcm9jZXNzaW5nIGlzIHRvIGJlCisJICogZW5hYmxlZC4KKwkgKi8KKwl1MzIgbWlycm9yX3JlcXVlc3RfZW5hYmxlOjE7ICAvKiBNaXJyb3JlZCByZXF1ZXN0IEVuYWJsZSAqLworCisJLyogT0ZGU0VUIDB4MTAgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBjb21tYW5kIGl1IGxlbmd0aCBpbiBkd29yZHMKKwkgKi8KKwl1MzIgc3NwX2NvbW1hbmRfaXVfbGVuZ3RoOjg7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSB0YXJnZXQgVExSIGVuYWJsZSBiaXQgaXQgbXVzdCBiZSBzZXQgdG8gMCB3aGVuIGNyZWF0bmluZyB0aGUKKwkgKiB0YXNrIGNvbnRleHQuCisJICovCisJdTMyIHhmZXJfcmVhZHlfdGxyX2VuYWJsZToxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBhbmQgdGhlIGRyaXZlciBtdXN0IHNldCBpdCB0byAweDAwCisJICovCisJdTMyIHJlc2VydmVkXzEwXzA6NzsKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1heGltdW0gYnVyc3Qgc2l6ZSB0aGF0IHRoZSBTQ1UgaGFyZHdhcmUgd2lsbCBzZW5kIGluIG9uZQorCSAqIGNvbm5lY3Rpb24gaXRzIHZhbHVlIGlzIChOIHggNTEyKSBhbmQgTiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4gIElmIHRoZQorCSAqIHZhbHVlIGlzIDB4MDAgdGhlbiBtYXhpbXVtIGJ1cnN0IHNpemUgaXMgZGlzYWJsZWQuCisJICovCisJdTMyIHNzcF9tYXhfYnVyc3Rfc2l6ZToxNjsKKworCS8qIE9GRlNFVCAweDE0ICovCisJLyoqCisJICogVGhpcyBmaWxlZCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc2ZlcmVkIGluIHRoZSByZXF1ZXN0LgorCSAqLworCXUzMiB0cmFuc2Zlcl9sZW5ndGhfYnl0ZXM6MjQ7IC8qIEluIHRlcm1zIG9mIGJ5dGVzICovCisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCB0aGUgZHJpdmVyIHNob3VsZCBzZXQgaXQgdG8gMHgwMAorCSAqLworCXUzMiByZXNlcnZlZF8xNF8wOjg7CisKKwkvKiBPRkZTRVQgMHgxOC0weDJDICovCisJLyoqCisJICogVGhpcyB1bmlvbiBwcm92aWRlcyBmb3IgdGhlIHByb3RvY29sIHNwZWNpZiBwYXJ0IG9mIHRoZSBTQ1UgVGFzayBDb250ZXh0LgorCSAqLworCXVuaW9uIHByb3RvY29sX2NvbnRleHQgdHlwZTsKKworCS8qIE9GRlNFVCAweDMwLTB4MzQgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSB1cHBlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUKKwkgKiBjb21tYW5kIGl1IGJ1ZmZlcgorCSAqLworCXUzMiBjb21tYW5kX2l1X3VwcGVyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgNjQgYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlCisJICogY29tbWFuZCBpdSBidWZmZXIKKwkgKi8KKwl1MzIgY29tbWFuZF9pdV9sb3dlcjsKKworCS8qIE9GRlNFVCAweDM4LTB4M0MgKi8KKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSB1cHBlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUKKwkgKiByZXNwb25zZSBpdSBidWZmZXIKKwkgKi8KKwl1MzIgcmVzcG9uc2VfaXVfdXBwZXI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUKKwkgKiByZXNwb25zZSBpdSBidWZmZXIKKwkgKi8KKwl1MzIgcmVzcG9uc2VfaXVfbG93ZXI7CisKKwkvKiBPRkZTRVQgMHg0MCAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHRvIHRoZSB0YXNrIHBoYXNlIG9mIHRoZSBTQ1UgaGFyZHdhcmUuIFRoZSBkcml2ZXIgbXVzdAorCSAqIHNldCB0aGlzIHRvIDB4MDEKKwkgKi8KKwl1MzIgdGFza19waGFzZTo4OworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyBzZXQgdG8gdGhlIHRyYW5zcG9ydCBsYXllciB0YXNrIHN0YXR1cy4gIFRoZSBkcml2ZXIgbXVzdCBzZXQKKwkgKiB0aGlzIHRvIDB4MDAKKwkgKi8KKwl1MzIgdGFza19zdGF0dXM6ODsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdXNlZCBkdXJpbmcgaW5pdGlhdG9yIHdyaXRlIFRMUgorCSAqLworCXUzMiBwcmV2aW91c19leHRlbmRlZF90YWc6NDsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGZvciBhIFNUUCBub24tZGF0YSBGSVMKKwkgKi8KKwl1MzIgc3RwX3JldHJ5X2NvdW50OjI7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCB0aGUgZHJpdmVyIG11c3Qgc2V0IGl0IHRvIDB4MDAKKwkgKi8KKwl1MzIgcmVzZXJ2ZWRfNDBfMToyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB1c2VkIGJ5IHRoZSBTQ1UgVEwgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gdGFrZSBhIHNuYXBzaG90IHdoZW4KKwkgKiB0cmFubWl0dGluZyByZWFkIGRhdGEgZnJhbWVzLgorCSAqICAgIC0gMHgwMCBUaGUgZW50aXJlIElPCisJICogICAgLSAweDAxIDMyaworCSAqICAgIC0gMHgwMiA2NGsKKwkgKiAgICAtIDB4MDQgMTI4aworCSAqICAgIC0gMHgwOCAyNTZrCisJICovCisJdTMyIHNzcF90bHJfdGhyZXNob2xkOjQ7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGFuZCB0aGUgZHJpdmVyIG11c3Qgc2V0IGl0IHRvIDB4MDAKKwkgKi8KKwl1MzIgcmVzZXJ2ZWRfNDBfMjo0OworCisJLyogT0ZGU0VUIDB4NDQgKi8KKwl1MzIgd3JpdGVfZGF0YV9sZW5ndGg7IC8qIHJlYWQgb25seSBzZXQgdG8gMCAqLworCisJLyogT0ZGU0VUIDB4NDgtMHg1OCAqLworCXN0cnVjdCB0cmFuc3BvcnRfc25hcHNob3Qgc25hcHNob3Q7IC8qIHJlYWQgb25seSBzZXQgdG8gMCAqLworCisJLyogT0ZGU0VUIDB4NUMgKi8KKwl1MzIgYmxvY2tfcHJvdGVjdGlvbl9lbmFibGU6MTsKKwl1MzIgYmxvY2tfc2l6ZToyOworCXUzMiBibG9ja19wcm90ZWN0aW9uX2Z1bmN0aW9uOjI7CisJdTMyIHJlc2VydmVkXzVDXzA6OTsKKwl1MzIgYWN0aXZlX3NnbF9lbGVtZW50OjI7ICAvKiByZWFkIG9ubHkgc2V0IHRvIDAgKi8KKwl1MzIgc2dsX2V4aGF1c3RlZDoxOyAgLyogcmVhZCBvbmx5IHNldCB0byAwICovCisJdTMyIHBheWxvYWRfZGF0YV90cmFuc2Zlcl9lcnJvcjo0OyAgLyogcmVhZCBvbmx5IHNldCB0byAwICovCisJdTMyIGZyYW1lX2J1ZmZlcl9vZmZzZXQ6MTE7IC8qIHJlYWQgb25seSBzZXQgdG8gMCAqLworCisJLyogT0ZGU0VUIDB4NjAtMHg3QyAqLworCS8qKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIGZpcnN0IFNHTCBlbGVtZW50IHBhaXIgZm91bmQgaW4gdGhlIFRDIGRhdGEgc3RydWN0dXJlLgorCSAqLworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciBzZ2xfcGFpcl9hYjsKKwkvKiBPRkZTRVQgMHg4MC0weDlDICovCisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgc2Vjb25kIFNHTCBlbGVtZW50IHBhaXIgZm91bmQgaW4gdGhlIFRDIGRhdGEgc3RydWN0dXJlLgorCSAqLworCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciBzZ2xfcGFpcl9jZDsKKworCS8qIE9GRlNFVCAweEEwLUJDICovCisJc3RydWN0IHNjdV9zZ2xfZWxlbWVudF9wYWlyIHNnbF9zbmFwc2hvdF9hYzsKKworCS8qIE9GRlNFVCAweEMwICovCisJdTMyIGFjdGl2ZV9zZ2xfZWxlbWVudF9wYWlyOyAvKiByZWFkIG9ubHkgc2V0IHRvIDAgKi8KKworCS8qIE9GRlNFVCAweEM0LTB4Q0MgKi8KKwl1MzIgcmVzZXJ2ZWRfQzRfQ0NbM107CisKKwkvKiBPRkZTRVQgMHhEMCAqLworCXUzMiBpbnRlcm1lZGlhdGVfY3JjX3ZhbHVlOjE2OworCXUzMiBpbml0aWFsX2NyY19zZWVkOjE2OworCisJLyogT0ZGU0VUIDB4RDQgKi8KKwl1MzIgYXBwbGljYXRpb25fdGFnX2Zvcl92ZXJpZnk6MTY7CisJdTMyIGFwcGxpY2F0aW9uX3RhZ19mb3JfZ2VuZXJhdGU6MTY7CisKKwkvKiBPRkZTRVQgMHhEOCAqLworCXUzMiByZWZlcmVuY2VfdGFnX3NlZWRfZm9yX3ZlcmlmeV9mdW5jdGlvbjsKKworCS8qIE9GRlNFVCAweERDICovCisJdTMyIHJlc2VydmVkX0RDOworCisJLyogT0ZGU0VUIDB4RTAgKi8KKwl1MzIgcmVzZXJ2ZWRfRTBfMDoxNjsKKwl1MzIgYXBwbGljYXRpb25fdGFnX21hc2tfZm9yX2dlbmVyYXRlOjE2OworCisJLyogT0ZGU0VUIDB4RTQgKi8KKwl1MzIgYmxvY2tfcHJvdGVjdGlvbl9jb250cm9sOjE2OworCXUzMiBhcHBsaWNhdGlvbl90YWdfbWFza19mb3JfdmVyaWZ5OjE2OworCisJLyogT0ZGU0VUIDB4RTggKi8KKwl1MzIgYmxvY2tfcHJvdGVjdGlvbl9lcnJvcjo4OworCXUzMiByZXNlcnZlZF9FOF8wOjI0OworCisJLyogT0ZGU0VUIDB4RUMgKi8KKwl1MzIgcmVmZXJlbmNlX3RhZ19zZWVkX2Zvcl92ZXJpZnk7CisKKwkvKiBPRkZTRVQgMHhGMCAqLworCXUzMiBpbnRlcm1lZGlhdGVfY3JjX3ZhbGlkX3NuYXBzaG90OjE2OworCXUzMiByZXNlcnZlZF9GMF8wOjE2OworCisJLyogT0ZGU0VUIDB4RjQgKi8KKwl1MzIgcmVmZXJlbmNlX3RhZ19zZWVkX2Zvcl92ZXJpZnlfZnVuY3Rpb25fc25hcHNob3Q7CisKKwkvKiBPRkZTRVQgMHhGOCAqLworCXUzMiBzbmFwc2hvdF9vZl9yZXNlcnZlZF9kd29yZF9EQ19vZl90YzsKKworCS8qIE9GRlNFVCAweEZDICovCisJdTMyIHJlZmVyZW5jZV90YWdfc2VlZF9mb3JfZ2VuZXJhdGVfZnVuY3Rpb25fc25hcHNob3Q7CisKK307CisKKyNlbmRpZiAvKiBfU0NVX1RBU0tfQ09OVEVYVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5jIGIvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YmNkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS90YXNrLmMKQEAgLTAsMCArMSwxNjc2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CisjaW5jbHVkZSAic2FzLmgiCisjaW5jbHVkZSA8c2NzaS9saWJzYXMuaD4KKyNpbmNsdWRlICJyZW1vdGVfZGV2aWNlLmgiCisjaW5jbHVkZSAicmVtb3RlX25vZGVfY29udGV4dC5oIgorI2luY2x1ZGUgImlzY2kuaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgImhvc3QuaCIKKworLyoqCisqIGlzY2lfdGFza19yZWZ1c2UoKSAtIGNvbXBsZXRlIHRoZSByZXF1ZXN0IHRvIHRoZSB1cHBlciBsYXllciBkcml2ZXIgaW4KKyogICAgIHRoZSBjYXNlIHdoZXJlIGFuIEkvTyBuZWVkcyB0byBiZSBjb21wbGV0ZWQgYmFjayBpbiB0aGUgc3VibWl0IHBhdGguCisqIEBpaG9zdDogaG9zdCBvbiB3aGljaCB0aGUgdGhlIHJlcXVlc3Qgd2FzIHF1ZXVlZAorKiBAdGFzazogcmVxdWVzdCB0byBjb21wbGV0ZQorKiBAcmVzcG9uc2U6IHJlc3BvbnNlIGNvZGUgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKyogQHN0YXR1czogc3RhdHVzIGNvZGUgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKyoKKyovCitzdGF0aWMgdm9pZCBpc2NpX3Rhc2tfcmVmdXNlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssCisJCQkgICAgIGVudW0gc2VydmljZV9yZXNwb25zZSByZXNwb25zZSwKKwkJCSAgICAgZW51bSBleGVjX3N0YXR1cyBzdGF0dXMpCisKK3sKKwllbnVtIGlzY2lfY29tcGxldGlvbl9zZWxlY3Rpb24gZGlzcG9zaXRpb247CisKKwlkaXNwb3NpdGlvbiA9IGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjsKKwlkaXNwb3NpdGlvbiA9IGlzY2lfdGFza19zZXRfY29tcGxldGlvbl9zdGF0dXModGFzaywgcmVzcG9uc2UsIHN0YXR1cywKKwkJCQkJCSAgICAgIGRpc3Bvc2l0aW9uKTsKKworCS8qIFRhc2tzIGFib3J0ZWQgc3BlY2lmaWNhbGx5IGJ5IGEgY2FsbCB0byB0aGUgbGxkZF9hYm9ydF90YXNrCisJICogZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjb21wbGV0ZWQgdG8gdGhlIGhvc3QgaW4gdGhlIHJlZ3VsYXIgcGF0aC4KKwkgKi8KKwlzd2l0Y2ggKGRpc3Bvc2l0aW9uKSB7CisJY2FzZSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb246CisJCS8qIE5vcm1hbCBub3RpZmljYXRpb24gKHRhc2tfZG9uZSkgKi8KKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogTm9ybWFsIC0gdGFzayA9ICVwLCByZXNwb25zZT0lZCwgIgorCQkJInN0YXR1cz0lZFxuIiwKKwkJCV9fZnVuY19fLCB0YXNrLCByZXNwb25zZSwgc3RhdHVzKTsKKworCQl0YXNrLT5sbGRkX3Rhc2sgPSBOVUxMOworCisJCWlzY2lfZXhlY3BhdGhfY2FsbGJhY2soaWhvc3QsIHRhc2ssIHRhc2stPnRhc2tfZG9uZSk7CisJCWJyZWFrOworCisJY2FzZSBpc2NpX3BlcmZvcm1fYWJvcnRlZF9pb19jb21wbGV0aW9uOgorCQkvKgorCQkgKiBObyBub3RpZmljYXRpb24gYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgYWxyZWFkeSBpbiB0aGUKKwkJICogYWJvcnQgcGF0aC4KKwkJICovCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IEFib3J0ZWQgLSB0YXNrID0gJXAsIHJlc3BvbnNlPSVkLCAiCisJCQkic3RhdHVzPSVkXG4iLAorCQkJX19mdW5jX18sIHRhc2ssIHJlc3BvbnNlLCBzdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgaXNjaV9wZXJmb3JtX2Vycm9yX2lvX2NvbXBsZXRpb246CisJCS8qIFVzZSBzYXNfdGFza19hYm9ydCAqLworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBFcnJvciAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQsICIKKwkJCSJzdGF0dXM9JWRcbiIsCisJCQlfX2Z1bmNfXywgdGFzaywgcmVzcG9uc2UsIHN0YXR1cyk7CisKKwkJaXNjaV9leGVjcGF0aF9jYWxsYmFjayhpaG9zdCwgdGFzaywgc2FzX3Rhc2tfYWJvcnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlzY2kgdGFzayBub3RpZmljYXRpb24gZGVmYXVsdCBjYXNlISIsCisJCQlfX2Z1bmNfXyk7CisJCXNhc190YXNrX2Fib3J0KHRhc2spOworCQlicmVhazsKKwl9Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfc2FzX3Rhc2sobnVtLCB0YXNrKSBcCisJZm9yICg7IG51bSA+IDA7IG51bS0tLFwKKwkgICAgIHRhc2sgPSBsaXN0X2VudHJ5KHRhc2stPmxpc3QubmV4dCwgc3RydWN0IHNhc190YXNrLCBsaXN0KSkKKworCitzdGF0aWMgaW5saW5lIGludCBpc2NpX2RldmljZV9pb19yZWFkeShzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJcmV0dXJuIGlkZXYgPyB0ZXN0X2JpdChJREVWX0lPX1JFQURZLCAmaWRldi0+ZmxhZ3MpIHx8CisJCSAgICAgICh0ZXN0X2JpdChJREVWX0lPX05DUUVSUk9SLCAmaWRldi0+ZmxhZ3MpICYmCisJCSAgICAgICBpc2NpX3Rhc2tfaXNfbmNxX3JlY292ZXJ5KHRhc2spKQorCQkgICAgOiAwOworfQorLyoqCisgKiBpc2NpX3Rhc2tfZXhlY3V0ZV90YXNrKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIG9uZSBvZiB0aGUgU0FTIERvbWFpbiBUZW1wbGF0ZQorICogICAgZnVuY3Rpb25zLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBsaWJzYXMgdG8gc2VuZCBhIHRhc2sgZG93biB0bworICogICAgaGFyZHdhcmUuCisgKiBAdGFzazogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBTQVMgdGFzayB0byBzZW5kLgorICogQG51bTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGFza3MgdG8gcXVldWUuCisgKiBAZ2ZwX2ZsYWdzOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGNvbnRleHQgb2YgdGhpcyBjYWxsLgorICoKKyAqIHN0YXR1cywgemVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworaW50IGlzY2lfdGFza19leGVjdXRlX3Rhc2soc3RydWN0IHNhc190YXNrICp0YXNrLCBpbnQgbnVtLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBkZXZfdG9faWhvc3QodGFzay0+ZGV2KTsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBpb19yZWFkeTsKKwl1MTYgdGFnOworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiBudW09JWRcbiIsIF9fZnVuY19fLCBudW0pOworCisJZm9yX2VhY2hfc2FzX3Rhc2sobnVtLCB0YXNrKSB7CisJCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfRkFJTFVSRTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQlpZGV2ID0gaXNjaV9sb29rdXBfZGV2aWNlKHRhc2stPmRldik7CisJCWlvX3JlYWR5ID0gaXNjaV9kZXZpY2VfaW9fcmVhZHkoaWRldiwgdGFzayk7CisJCXRhZyA9IGlzY2lfYWxsb2NfdGFnKGlob3N0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkidGFzazogJXAsIG51bTogJWQgZGV2OiAlcCBpZGV2OiAlcDolI2x4IGNtZCA9ICVwXG4iLAorCQkJdGFzaywgbnVtLCB0YXNrLT5kZXYsIGlkZXYsIGlkZXYgPyBpZGV2LT5mbGFncyA6IDAsCisJCQl0YXNrLT51bGRkX3Rhc2spOworCisJCWlmICghaWRldikgeworCQkJaXNjaV90YXNrX3JlZnVzZShpaG9zdCwgdGFzaywgU0FTX1RBU0tfVU5ERUxJVkVSRUQsCisJCQkJCSBTQVNfREVWSUNFX1VOS05PV04pOworCQl9IGVsc2UgaWYgKCFpb19yZWFkeSB8fCB0YWcgPT0gU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUcpIHsKKwkJCS8qIEluZGljYXRlIFFVRVVFX0ZVTEwgc28gdGhhdCB0aGUgc2NzaSBtaWRsYXllcgorCQkJICogcmV0cmllcy4KKwkJCSAgKi8KKwkJCWlzY2lfdGFza19yZWZ1c2UoaWhvc3QsIHRhc2ssIFNBU19UQVNLX0NPTVBMRVRFLAorCQkJCQkgU0FTX1FVRVVFX0ZVTEwpOworCQl9IGVsc2UgeworCQkJLyogVGhlcmUgaXMgYSBkZXZpY2UgYW5kIGl0J3MgcmVhZHkgZm9yIEkvTy4gKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCQkJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSB7CisJCQkJLyogVGhlIEkvTyB3YXMgYWJvcnRlZC4gKi8KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssCisJCQkJCQkgICAgICAgZmxhZ3MpOworCisJCQkJaXNjaV90YXNrX3JlZnVzZShpaG9zdCwgdGFzaywKKwkJCQkJCSBTQVNfVEFTS19VTkRFTElWRVJFRCwKKwkJCQkJCSBTQU1fU1RBVF9UQVNLX0FCT1JURUQpOworCQkJfSBlbHNlIHsKKwkJCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX0FUX0lOSVRJQVRPUjsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCQkJCS8qIGJ1aWxkIGFuZCBzZW5kIHRoZSByZXF1ZXN0LiAqLworCQkJCXN0YXR1cyA9IGlzY2lfcmVxdWVzdF9leGVjdXRlKGlob3N0LCBpZGV2LCB0YXNrLCB0YWcpOworCisJCQkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCQkJLyogRGlkIG5vdCByZWFsbHkgc3RhcnQgdGhpcyBjb21tYW5kLiAqLworCQkJCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19BVF9JTklUSUFUT1I7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJCQkJCS8qIEluZGljYXRlIFFVRVVFX0ZVTEwgc28gdGhhdCB0aGUgc2NzaQorCQkJCQkqIG1pZGxheWVyIHJldHJpZXMuIGlmIHRoZSByZXF1ZXN0CisJCQkJCSogZmFpbGVkIGZvciByZW1vdGUgZGV2aWNlIHJlYXNvbnMsCisJCQkJCSogaXQgZ2V0cyByZXR1cm5lZCBhcworCQkJCQkqIFNBU19UQVNLX1VOREVMSVZFUkVEIG5leHQgdGltZQorCQkJCQkqIHRocm91Z2guCisJCQkJCSovCisJCQkJCWlzY2lfdGFza19yZWZ1c2UoaWhvc3QsIHRhc2ssCisJCQkJCQkJIFNBU19UQVNLX0NPTVBMRVRFLAorCQkJCQkJCSBTQVNfUVVFVUVfRlVMTCk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MgJiYgdGFnICE9IFNDSV9DT05UUk9MTEVSX0lOVkFMSURfSU9fVEFHKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQkJLyogY29tbWFuZCBuZXZlciBoaXQgdGhlIGRldmljZSwgc28ganVzdCBmcmVlCisJCQkgKiB0aGUgdGNpIGFuZCBza2lwIHRoZSBzZXF1ZW5jZSBpbmNyZW1lbnQKKwkJCSAqLworCQkJaXNjaV90Y2lfZnJlZShpaG9zdCwgSVNDSV9UQUdfVENJKHRhZykpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQl9CisJCWlzY2lfcHV0X2RldmljZShpZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgaXNjaV9zYXRhX21hbmFnZW1lbnRfdGFza19yZXF1ZXN0X2J1aWxkKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGlzY2lfdG1mICppc2NpX3RtZjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKHRtZl90YXNrICE9IGlyZXEtPnR0eXBlKQorCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CisKKwlpc2NpX3RtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOworCisJc3dpdGNoIChpc2NpX3RtZi0+dG1mX2NvZGUpIHsKKworCWNhc2UgaXNjaV90bWZfc2F0YV9zcnN0X2hpZ2g6CisJY2FzZSBpc2NpX3RtZl9zYXRhX3Nyc3RfbG93OiB7CisJCXN0cnVjdCBob3N0X3RvX2Rldl9maXMgKmZpcyA9ICZpcmVxLT5zdHAuY21kOworCisJCW1lbXNldChmaXMsIDAsIHNpemVvZigqZmlzKSk7CisKKwkJZmlzLT5maXNfdHlwZSAgPSAgMHgyNzsKKwkJZmlzLT5mbGFncyAgICAgJj0gfjB4ODA7CisJCWZpcy0+ZmxhZ3MgICAgICY9IDB4RjA7CisJCWlmIChpc2NpX3RtZi0+dG1mX2NvZGUgPT0gaXNjaV90bWZfc2F0YV9zcnN0X2hpZ2gpCisJCQlmaXMtPmNvbnRyb2wgfD0gQVRBX1NSU1Q7CisJCWVsc2UKKwkJCWZpcy0+Y29udHJvbCAmPSB+QVRBX1NSU1Q7CisJCWJyZWFrOworCX0KKwkvKiBvdGhlciBtYW5hZ2VtZW50IGNvbW1uZCBnbyBoZXJlLi4uICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCX0KKworCS8qIGNvcmUgYnVpbGRzIHRoZSBwcm90b2NvbCBzcGVjaWZpYyByZXF1ZXN0CisJICogIGJhc2VkIG9uIHRoZSBoMmQgZmlzLgorCSAqLworCXN0YXR1cyA9IHNjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0X3NhdGEoaXJlcSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV90YXNrX3JlcXVlc3RfYnVpbGQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCQkgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKKwkJCQkJCSAgICB1MTYgdGFnLCBzdHJ1Y3QgaXNjaV90bWYgKmlzY2lfdG1mKQoreworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfRkFJTFVSRTsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gTlVMTDsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2OworCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX3RtZiA9ICVwXG4iLCBfX2Z1bmNfXywgaXNjaV90bWYpOworCisJZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKKworCS8qIGRvIGNvbW1vbiBhbGxvY2F0aW9uIGFuZCBpbml0IG9mIHJlcXVlc3Qgb2JqZWN0LiAqLworCWlyZXEgPSBpc2NpX3RtZl9yZXF1ZXN0X2Zyb21fdGFnKGlob3N0LCBpc2NpX3RtZiwgdGFnKTsKKwlpZiAoIWlyZXEpCisJCXJldHVybiBOVUxMOworCisJLyogbGV0IHRoZSBjb3JlIGRvIGl0J3MgY29uc3RydWN0LiAqLworCXN0YXR1cyA9IHNjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0KGlob3N0LCBpZGV2LCB0YWcsCisJCQkJCSAgICAgaXJlcSk7CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogc2NpX3Rhc2tfcmVxdWVzdF9jb25zdHJ1Y3QgZmFpbGVkIC0gIgorCQkJICJzdGF0dXMgPSAweCV4XG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHN0YXR1cyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFhYWCBjb252ZXJ0IHRvIGdldCB0aGlzIGZyb20gdGFzay0+dHByb3RvIGxpa2Ugb3RoZXIgZHJpdmVycyAqLworCWlmIChkZXYtPmRldl90eXBlID09IFNBU19FTkRfREVWKSB7CisJCWlzY2lfdG1mLT5wcm90byA9IFNBU19QUk9UT0NPTF9TU1A7CisJCXN0YXR1cyA9IHNjaV90YXNrX3JlcXVlc3RfY29uc3RydWN0X3NzcChpcmVxKTsKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkZXYtPmRldl90eXBlID09IFNBVEFfREVWIHx8IChkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TVFApKSB7CisJCWlzY2lfdG1mLT5wcm90byA9IFNBU19QUk9UT0NPTF9TQVRBOworCQlzdGF0dXMgPSBpc2NpX3NhdGFfbWFuYWdlbWVudF90YXNrX3JlcXVlc3RfYnVpbGQoaXJlcSk7CisKKwkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gaXJlcTsKK30KKworc3RhdGljIGludCBpc2NpX3Rhc2tfZXhlY3V0ZV90bWYoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCisJCQkJIHN0cnVjdCBpc2NpX3RtZiAqdG1mLCB1bnNpZ25lZCBsb25nIHRpbWVvdXRfbXMpCit7CisJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soY29tcGxldGlvbik7CisJZW51bSBzY2lfdGFza19zdGF0dXMgc3RhdHVzID0gU0NJX1RBU0tfRkFJTFVSRTsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOworCWludCByZXQgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdGltZWxlZnQ7CisJdTE2IHRhZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJdGFnID0gaXNjaV9hbGxvY190YWcoaWhvc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCWlmICh0YWcgPT0gU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUcpCisJCXJldHVybiByZXQ7CisKKwkvKiBzYW5pdHkgY2hlY2ssIHJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRAorCSAqIGlmIHRoZSBkZXZpY2UgaXMgbm90IHRoZXJlIGFuZCByZWFkeS4KKwkgKi8KKwlpZiAoIWlkZXYgfHwKKwkgICAgKCF0ZXN0X2JpdChJREVWX0lPX1JFQURZLCAmaWRldi0+ZmxhZ3MpICYmCisJICAgICAhdGVzdF9iaXQoSURFVl9JT19OQ1FFUlJPUiwgJmlkZXYtPmZsYWdzKSkpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogaWRldiA9ICVwIG5vdCByZWFkeSAoJSNseClcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWlkZXYsIGlkZXYgPyBpZGV2LT5mbGFncyA6IDApOworCQlnb3RvIGVycl90Y2k7CisJfSBlbHNlCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlkZXYgPSAlcFxuIiwKKwkJCV9fZnVuY19fLCBpZGV2KTsKKworCS8qIEFzc2lnbiB0aGUgcG9pbnRlciB0byB0aGUgVE1GJ3MgY29tcGxldGlvbiBrZXJuZWwgd2FpdCBzdHJ1Y3R1cmUuICovCisJdG1mLT5jb21wbGV0ZSA9ICZjb21wbGV0aW9uOworCisJaXJlcSA9IGlzY2lfdGFza19yZXF1ZXN0X2J1aWxkKGlob3N0LCBpZGV2LCB0YWcsIHRtZik7CisJaWYgKCFpcmVxKQorCQlnb3RvIGVycl90Y2k7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJLyogc3RhcnQgdGhlIFRNRiBpby4gKi8KKwlzdGF0dXMgPSBzY2lfY29udHJvbGxlcl9zdGFydF90YXNrKGlob3N0LCBpZGV2LCBpcmVxKTsKKworCWlmIChzdGF0dXMgIT0gU0NJX1RBU0tfU1VDQ0VTUykgeworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogc3RhcnRfaW8gZmFpbGVkIC0gc3RhdHVzID0gMHgleCwgcmVxdWVzdCA9ICVwXG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHN0YXR1cywKKwkJCSBpcmVxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQlnb3RvIGVycl90Y2k7CisJfQorCisJaWYgKHRtZi0+Y2Jfc3RhdGVfZnVuYyAhPSBOVUxMKQorCQl0bWYtPmNiX3N0YXRlX2Z1bmMoaXNjaV90bWZfc3RhcnRlZCwgdG1mLCB0bWYtPmNiX2RhdGEpOworCisJaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZShpcmVxLCBzdGFydGVkKTsKKworCS8qIGFkZCB0aGUgcmVxdWVzdCB0byB0aGUgcmVtb3RlIGRldmljZSByZXF1ZXN0IGxpc3QuICovCisJbGlzdF9hZGQoJmlyZXEtPmRldl9ub2RlLCAmaWRldi0+cmVxc19pbl9wcm9jZXNzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCS8qIFdhaXQgZm9yIHRoZSBUTUYgdG8gY29tcGxldGUsIG9yIGEgdGltZW91dC4gKi8KKwl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29tcGxldGlvbiwKKwkJCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9tcykpOworCisJaWYgKHRpbWVsZWZ0ID09IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCQlpZiAodG1mLT5jYl9zdGF0ZV9mdW5jICE9IE5VTEwpCisJCQl0bWYtPmNiX3N0YXRlX2Z1bmMoaXNjaV90bWZfdGltZWRfb3V0LCB0bWYsIHRtZi0+Y2JfZGF0YSk7CisKKwkJc2NpX2NvbnRyb2xsZXJfdGVybWluYXRlX3JlcXVlc3QoaWhvc3QsCisJCQkJCQkgIGlkZXYsCisJCQkJCQkgIGlyZXEpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKHRtZi0+Y29tcGxldGUpOworCX0KKworCWlzY2lfcHJpbnRfdG1mKHRtZik7CisKKwlpZiAodG1mLT5zdGF0dXMgPT0gU0NJX1NVQ0NFU1MpCisJCXJldCA9ICBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOworCWVsc2UgaWYgKHRtZi0+c3RhdHVzID09IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IHRtZi5zdGF0dXMgPT0gIgorCQkJIlNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAgVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwl9CisJLyogRWxzZSAtIGxlYXZlIHRoZSBkZWZhdWx0ICJmYWlsZWQiIHN0YXR1cyBhbG9uZS4gKi8KKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogY29tcGxldGVkIHJlcXVlc3QgPSAlcFxuIiwKKwkJX19mdW5jX18sCisJCWlyZXEpOworCisJcmV0dXJuIHJldDsKKworIGVycl90Y2k6CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlpc2NpX3RjaV9mcmVlKGlob3N0LCBJU0NJX1RBR19UQ0kodGFnKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaXNjaV90YXNrX2J1aWxkX3RtZihzdHJ1Y3QgaXNjaV90bWYgKnRtZiwKKwkJCQllbnVtIGlzY2lfdG1mX2Z1bmN0aW9uX2NvZGVzIGNvZGUsCisJCQkJdm9pZCAoKnRtZl9zZW50X2NiKShlbnVtIGlzY2lfdG1mX2NiX3N0YXRlLAorCQkJCQkJICAgIHN0cnVjdCBpc2NpX3RtZiAqLAorCQkJCQkJICAgIHZvaWQgKiksCisJCQkJdm9pZCAqY2JfZGF0YSkKK3sKKwltZW1zZXQodG1mLCAwLCBzaXplb2YoKnRtZikpOworCisJdG1mLT50bWZfY29kZSAgICAgID0gY29kZTsKKwl0bWYtPmNiX3N0YXRlX2Z1bmMgPSB0bWZfc2VudF9jYjsKKwl0bWYtPmNiX2RhdGEgICAgICAgPSBjYl9kYXRhOworfQorCitzdGF0aWMgdm9pZCBpc2NpX3Rhc2tfYnVpbGRfYWJvcnRfdGFza190bWYoc3RydWN0IGlzY2lfdG1mICp0bWYsCisJCQkJCSAgIGVudW0gaXNjaV90bWZfZnVuY3Rpb25fY29kZXMgY29kZSwKKwkJCQkJICAgdm9pZCAoKnRtZl9zZW50X2NiKShlbnVtIGlzY2lfdG1mX2NiX3N0YXRlLAorCQkJCQkJCSAgICAgICBzdHJ1Y3QgaXNjaV90bWYgKiwKKwkJCQkJCQkgICAgICAgdm9pZCAqKSwKKwkJCQkJICAgc3RydWN0IGlzY2lfcmVxdWVzdCAqb2xkX3JlcXVlc3QpCit7CisJaXNjaV90YXNrX2J1aWxkX3RtZih0bWYsIGNvZGUsIHRtZl9zZW50X2NiLCBvbGRfcmVxdWVzdCk7CisJdG1mLT5pb190YWcgPSBvbGRfcmVxdWVzdC0+aW9fdGFnOworfQorCisvKioKKyAqIGlzY2lfdGFza192YWxpZGF0ZV9yZXF1ZXN0X3RvX2Fib3J0KCkgLSBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgZ2l2ZW4gSS9PCisgKiAgICBhZ2FpbnN0IHRoZSAic3RhcnRlZCIgc3RhdGUuICBJZiB0aGUgcmVxdWVzdCBpcyBzdGlsbCAic3RhcnRlZCIsIGl0J3MKKyAqICAgIHN0YXRlIGlzIGNoYW5nZWQgdG8gYWJvcnRlZC4gTk9URTogaXNjaV9ob3N0LT5zY2ljX2xvY2sgTVVTVCBCRSBIRUxECisgKiAgICBCRUZPUkUgQ0FMTElORyBUSElTIEZVTkNUSU9OLgorICogQGlzY2lfcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZXF1ZXN0IG9iamVjdCB0byBjb250cm9sLgorICogQGlzY2lfaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBJU0NJIGhvc3Qgb2JqZWN0CisgKiBAaXNjaV9kZXZpY2U6IFRoaXMgaXMgdGhlIGRldmljZSB0byB3aGljaCB0aGUgcmVxdWVzdCBpcyBwZW5kaW5nLgorICogQGFib3J0ZWRfaW9fY29tcGxldGlvbjogVGhpcyBpcyBhIGNvbXBsZXRpb24gc3RydWN0dXJlIHRoYXQgd2lsbCBiZSBhZGRlZCB0bworICogICAgdGhlIHJlcXVlc3QgaW4gY2FzZSBpdCBpcyBjaGFuZ2VkIHRvIGFib3J0aW5nOyB0aGlzIGNvbXBsZXRpb24gaXMKKyAqICAgIHRyaWdnZXJlZCB3aGVuIHRoZSByZXF1ZXN0IGlzIGZ1bGx5IGNvbXBsZXRlZC4KKyAqCisgKiBFaXRoZXIgInN0YXJ0ZWQiIG9uIHN1Y2Nlc3NmdWwgY2hhbmdlIG9mIHRoZSB0YXNrIHN0YXR1cyB0byAiYWJvcnRlZCIsIG9yCisgKiAidW5hbGxvY2F0ZWQiIGlmIHRoZSB0YXNrIGNhbm5vdCBiZSBjb250cm9sbGVkLgorICovCitzdGF0aWMgZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIGlzY2lfdGFza192YWxpZGF0ZV9yZXF1ZXN0X3RvX2Fib3J0KAorCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfcmVxdWVzdCwKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QsCisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaXNjaV9kZXZpY2UsCisJc3RydWN0IGNvbXBsZXRpb24gKmFib3J0ZWRfaW9fY29tcGxldGlvbikKK3sKKwllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgb2xkX3N0YXRlID0gdW5hbGxvY2F0ZWQ7CisKKwkvKiBPbmx5IGFib3J0IHRoZSB0YXNrIGlmIGl0J3MgaW4gdGhlCisJICogIGRldmljZSdzIHJlcXVlc3RfaW5fcHJvY2VzcyBsaXN0CisJICovCisJaWYgKGlzY2lfcmVxdWVzdCAmJiAhbGlzdF9lbXB0eSgmaXNjaV9yZXF1ZXN0LT5kZXZfbm9kZSkpIHsKKwkJb2xkX3N0YXRlID0gaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGFydGVkX3RvX2Fib3J0ZWQoCisJCQlpc2NpX3JlcXVlc3QsIGFib3J0ZWRfaW9fY29tcGxldGlvbik7CisKKwl9CisKKwlyZXR1cm4gb2xkX3N0YXRlOworfQorCisvKioKKyogaXNjaV9yZXF1ZXN0X2NsZWFudXBfY29tcGxldGVkX2xvaXRlcmVyKCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSBjYXJlIG9mCisqICAgIHRoZSBmaW5hbCBjbGVhbnVwIG9uIGFueSByZXF1ZXN0IHdoaWNoIGhhcyBiZWVuIGV4cGxpY2l0bHkgdGVybWluYXRlZC4KKyogQGlzY2lfaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBJU0NJIGhvc3Qgb2JqZWN0CisqIEBpc2NpX2RldmljZTogVGhpcyBpcyB0aGUgZGV2aWNlIHRvIHdoaWNoIHRoZSByZXF1ZXN0IGlzIHBlbmRpbmcuCisqIEBpc2NpX3JlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgdGVybWluYXRlZCByZXF1ZXN0IG9iamVjdC4KKyogQHRhc2s6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBsaWJzYXMgSS9PIHJlcXVlc3QuCisqLworc3RhdGljIHZvaWQgaXNjaV9yZXF1ZXN0X2NsZWFudXBfY29tcGxldGVkX2xvaXRlcmVyKAorCXN0cnVjdCBpc2NpX2hvc3QgICAgICAgICAgKmlzY2lfaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZSwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICAgICAgICppc2NpX3JlcXVlc3QsCisJc3RydWN0IHNhc190YXNrICAgICAgICAgICAqdGFzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9kZXZpY2U9JXAsIHJlcXVlc3Q9JXAsIHRhc2s9JXBcbiIsCisJCV9fZnVuY19fLCBpc2NpX2RldmljZSwgaXNjaV9yZXF1ZXN0LCB0YXNrKTsKKworCWlmICh0YXNrICE9IE5VTEwpIHsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXRhc2stPmxsZGRfdGFzayA9IE5VTEw7CisKKwkJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQ7CisKKwkJaXNjaV9zZXRfdGFza19kb25lZmxhZ3ModGFzayk7CisKKwkJLyogSWYgdGhpcyB0YXNrIGlzIG5vdCBpbiB0aGUgYWJvcnQgcGF0aCwgY2FsbCB0YXNrX2RvbmUuICovCisJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSkgeworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKKwkJfSBlbHNlCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoaXNjaV9yZXF1ZXN0ICE9IE5VTEwpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJCWxpc3RfZGVsX2luaXQoJmlzY2lfcmVxdWVzdC0+ZGV2X25vZGUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCX0KK30KKworLyoqCisgKiBpc2NpX3Rlcm1pbmF0ZV9yZXF1ZXN0X2NvcmUoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCB0ZXJtaW5hdGUgdGhlIGdpdmVuCisgKiAgICByZXF1ZXN0LCBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuICBUaGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZSBjYWxsZWQKKyAqICAgIGZyb20gYSB0aHJlYWQgdGhhdCBjYW4gd2FpdC4gIE5vdGUgdGhhdCB0aGUgcmVxdWVzdCBpcyB0ZXJtaW5hdGVkIGFuZAorICogICAgY29tcGxldGVkIChiYWNrIHRvIHRoZSBob3N0LCBpZiBzdGFydGVkIHRoZXJlKS4KKyAqIEBpaG9zdDogVGhpcyBTQ1UuCisgKiBAaWRldjogVGhlIHRhcmdldC4KKyAqIEBpc2NpX3JlcXVlc3Q6IFRoZSBJL08gcmVxdWVzdCB0byBiZSB0ZXJtaW5hdGVkLgorICoKKyAqLworc3RhdGljIHZvaWQgaXNjaV90ZXJtaW5hdGVfcmVxdWVzdF9jb3JlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCQlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAorCQkJCQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3QpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyAgICAgID0gU0NJX1NVQ0NFU1M7CisJYm9vbCB3YXNfdGVybWluYXRlZCAgICAgICAgID0gZmFsc2U7CisJYm9vbCBuZWVkc19jbGVhbnVwX2hhbmRsaW5nID0gZmFsc2U7CisJZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIHJlcXVlc3Rfc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgICAgIHRlcm1pbmF0aW9uX2NvbXBsZXRlZCA9IDE7CisJc3RydWN0IGNvbXBsZXRpb24gKmlvX3JlcXVlc3RfY29tcGxldGlvbjsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgICAqdGFzazsKKworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogZGV2aWNlID0gJXA7IHJlcXVlc3QgPSAlcFxuIiwKKwkJX19mdW5jX18sIGlkZXYsIGlzY2lfcmVxdWVzdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJaW9fcmVxdWVzdF9jb21wbGV0aW9uID0gaXNjaV9yZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb247CisKKwl0YXNrID0gKGlzY2lfcmVxdWVzdC0+dHR5cGUgPT0gaW9fdGFzaykKKwkJPyBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXNjaV9yZXF1ZXN0KQorCQk6IE5VTEw7CisKKwkvKiBOb3RlIHRoYXQgd2UgYXJlIG5vdCBnb2luZyB0byBjb250cm9sCisJICogdGhlIHRhcmdldCB0byBhYm9ydCB0aGUgcmVxdWVzdC4KKwkgKi8KKwlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmaXNjaV9yZXF1ZXN0LT5mbGFncyk7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHJlcXVlc3Qgd2Fzbid0IGp1c3Qgc2l0dGluZyBhcm91bmQgc2lnbmFsbGluZworCSAqIGRldmljZSBjb25kaXRpb24gKGlmIHRoZSByZXF1ZXN0IGhhbmRsZSBpcyBOVUxMLCB0aGVuIHRoZQorCSAqIHJlcXVlc3QgY29tcGxldGVkIGJ1dCBuZWVkZWQgYWRkaXRpb25hbCBoYW5kbGluZyBoZXJlKS4KKwkgKi8KKwlpZiAoIXRlc3RfYml0KElSRVFfVEVSTUlOQVRFRCwgJmlzY2lfcmVxdWVzdC0+ZmxhZ3MpKSB7CisJCXdhc190ZXJtaW5hdGVkID0gdHJ1ZTsKKwkJbmVlZHNfY2xlYW51cF9oYW5kbGluZyA9IHRydWU7CisJCXN0YXR1cyA9IHNjaV9jb250cm9sbGVyX3Rlcm1pbmF0ZV9yZXF1ZXN0KGlob3N0LAorCQkJCQkJCSAgIGlkZXYsCisJCQkJCQkJICAgaXNjaV9yZXF1ZXN0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBUaGUgb25seSB0aW1lIHRoZSByZXF1ZXN0IHRvIHRlcm1pbmF0ZSB3aWxsCisJICogZmFpbCBpcyB3aGVuIHRoZSBpbyByZXF1ZXN0IGlzIGNvbXBsZXRlZCBhbmQKKwkgKiBiZWluZyBhYm9ydGVkLgorCSAqLworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogc2NpX2NvbnRyb2xsZXJfdGVybWluYXRlX3JlcXVlc3QiCisJCQkiIHJldHVybmVkID0gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMpOworCisJCWlzY2lfcmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uID0gTlVMTDsKKworCX0gZWxzZSB7CisJCWlmICh3YXNfdGVybWluYXRlZCkgeworCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IGJlZm9yZSBjb21wbGV0aW9uIHdhaXQgKCVwLyVwKVxuIiwKKwkJCQlfX2Z1bmNfXywgaXNjaV9yZXF1ZXN0LCBpb19yZXF1ZXN0X2NvbXBsZXRpb24pOworCisJCQkvKiBXYWl0IGhlcmUgZm9yIHRoZSByZXF1ZXN0IHRvIGNvbXBsZXRlLiAqLworCQkJI2RlZmluZSBURVJNSU5BVElPTl9USU1FT1VUX01TRUMgNTAwCisJCQl0ZXJtaW5hdGlvbl9jb21wbGV0ZWQKKwkJCQk9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwkJCQkgICBpb19yZXF1ZXN0X2NvbXBsZXRpb24sCisJCQkJICAgbXNlY3NfdG9famlmZmllcyhURVJNSU5BVElPTl9USU1FT1VUX01TRUMpKTsKKworCQkJaWYgKCF0ZXJtaW5hdGlvbl9jb21wbGV0ZWQpIHsKKworCQkJCS8qIFRoZSByZXF1ZXN0IHRvIHRlcm1pbmF0ZSBoYXMgdGltZWQgb3V0LiAgKi8KKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywKKwkJCQkJCSAgZmxhZ3MpOworCisJCQkJLyogQ2hlY2sgZm9yIHN0YXRlIGNoYW5nZXMuICovCisJCQkJaWYgKCF0ZXN0X2JpdChJUkVRX1RFUk1JTkFURUQsICZpc2NpX3JlcXVlc3QtPmZsYWdzKSkgeworCisJCQkJCS8qIFRoZSBiZXN0IHdlIGNhbiBkbyBpcyB0byBoYXZlIHRoZQorCQkJCQkgKiByZXF1ZXN0IGRpZSBhIHNpbGVudCBkZWF0aCBpZiBpdAorCQkJCQkgKiBldmVyIHJlYWxseSBjb21wbGV0ZXMuCisJCQkJCSAqCisJCQkJCSAqIFNldCB0aGUgcmVxdWVzdCBzdGF0ZSB0byAiZGVhZCIsCisJCQkJCSAqIGFuZCBjbGVhciB0aGUgdGFzayBwb2ludGVyIHNvIHRoYXQKKwkJCQkJICogYW4gYWN0dWFsIGNvbXBsZXRpb24gZXZlbnQgY2FsbGJhY2sKKwkJCQkJICogZG9lc24ndCBkbyBhbnl0aGluZy4KKwkJCQkJICovCisJCQkJCWlzY2lfcmVxdWVzdC0+c3RhdHVzID0gZGVhZDsKKwkJCQkJaXNjaV9yZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb24KKwkJCQkJCT0gTlVMTDsKKworCQkJCQlpZiAoaXNjaV9yZXF1ZXN0LT50dHlwZSA9PSBpb190YXNrKSB7CisKKwkJCQkJCS8qIEJyZWFrIGxpbmtzIHdpdGggdGhlCisJCQkJCQkqIHNhc190YXNrLgorCQkJCQkJKi8KKwkJCQkJCWlzY2lfcmVxdWVzdC0+dHR5cGVfcHRyLmlvX3Rhc2tfcHRyCisJCQkJCQkJPSBOVUxMOworCQkJCQl9CisJCQkJfSBlbHNlCisJCQkJCXRlcm1pbmF0aW9uX2NvbXBsZXRlZCA9IDE7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLAorCQkJCQkJICAgICAgIGZsYWdzKTsKKworCQkJCWlmICghdGVybWluYXRpb25fY29tcGxldGVkKSB7CisKKwkJCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkJCSIlczogKioqIFRpbWVvdXQgd2FpdGluZyBmb3IgIgorCQkJCQkJInRlcm1pbmF0aW9uKCVwLyVwKVxuIiwKKwkJCQkJCV9fZnVuY19fLCBpb19yZXF1ZXN0X2NvbXBsZXRpb24sCisJCQkJCQlpc2NpX3JlcXVlc3QpOworCisJCQkJCS8qIFRoZSByZXF1ZXN0IGNhbiBubyBsb25nZXIgYmUgcmVmZXJlbmNlZAorCQkJCQkgKiBzYWZlbHkgc2luY2UgaXQgbWF5IGdvIGF3YXkgaWYgdGhlCisJCQkJCSAqIHRlcm1pbmF0aW9uIGV2ZXJ5IHJlYWxseSBkb2VzIGNvbXBsZXRlLgorCQkJCQkgKi8KKwkJCQkJaXNjaV9yZXF1ZXN0ID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCQlpZiAodGVybWluYXRpb25fY29tcGxldGVkKQorCQkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSIlczogYWZ0ZXIgY29tcGxldGlvbiB3YWl0ICglcC8lcClcbiIsCisJCQkJCV9fZnVuY19fLCBpc2NpX3JlcXVlc3QsIGlvX3JlcXVlc3RfY29tcGxldGlvbik7CisJCX0KKworCQlpZiAodGVybWluYXRpb25fY29tcGxldGVkKSB7CisKKwkJCWlzY2lfcmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uID0gTlVMTDsKKworCQkJLyogUGVlayBhdCB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0LiAgVGhpcyB3aWxsIHRlbGwKKwkJCSAqIHVzIGlmIHRoZXJlIHdhcyBzcGVjaWFsIGhhbmRsaW5nIG9uIHRoZSByZXF1ZXN0IHN1Y2ggdGhhdCBpdAorCQkJICogbmVlZHMgdG8gYmUgZGV0YWNoZWQgYW5kIGZyZWVkIGhlcmUuCisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NpX3JlcXVlc3QtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCXJlcXVlc3Rfc3RhdHVzID0gaXNjaV9yZXF1ZXN0LT5zdGF0dXM7CisKKwkJCWlmICgoaXNjaV9yZXF1ZXN0LT50dHlwZSA9PSBpb190YXNrKSAvKiBUTUZzIGFyZSBpbiB0aGVpciBvd24gdGhyZWFkICovCisJCQkgICAgJiYgKChyZXF1ZXN0X3N0YXR1cyA9PSBhYm9ydGVkKQorCQkJCXx8IChyZXF1ZXN0X3N0YXR1cyA9PSBhYm9ydGluZykKKwkJCQl8fCAocmVxdWVzdF9zdGF0dXMgPT0gdGVybWluYXRpbmcpCisJCQkJfHwgKHJlcXVlc3Rfc3RhdHVzID09IGNvbXBsZXRlZCkKKwkJCQl8fCAocmVxdWVzdF9zdGF0dXMgPT0gZGVhZCkKKwkJCQkpCisJCQkgICAgKSB7CisKKwkJCQkvKiBUaGUgY29tcGxldGlvbiByb3V0aW5lIHdvbid0IGZyZWUgYSByZXF1ZXN0IGluCisJCQkJICogdGhlIGFib3J0ZWQvYWJvcnRpbmcvZXRjLiBzdGF0ZXMsIHNvIHdlIGRvCisJCQkJICogaXQgaGVyZS4KKwkJCQkgKi8KKwkJCQluZWVkc19jbGVhbnVwX2hhbmRsaW5nID0gdHJ1ZTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfcmVxdWVzdC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCisJCX0KKwkJaWYgKG5lZWRzX2NsZWFudXBfaGFuZGxpbmcpCisJCQlpc2NpX3JlcXVlc3RfY2xlYW51cF9jb21wbGV0ZWRfbG9pdGVyZXIoCisJCQkJaWhvc3QsIGlkZXYsIGlzY2lfcmVxdWVzdCwgdGFzayk7CisJfQorfQorCisvKioKKyAqIGlzY2lfdGVybWluYXRlX3BlbmRpbmdfcmVxdWVzdHMoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdGhlIGFsbCBvZiB0aGUKKyAqICAgIHJlcXVlc3RzIG9uIHRoZSBnaXZlbiBkZXZpY2UncyBzdGF0ZSB0byAiYWJvcnRpbmciLCB3aWxsIHRlcm1pbmF0ZSB0aGUKKyAqICAgIHJlcXVlc3RzLCBhbmQgd2FpdCBmb3IgdGhlbSB0byBjb21wbGV0ZS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlCisgKiAgICBjYWxsZWQgZnJvbSBhIHRocmVhZCB0aGF0IGNhbiB3YWl0LiAgTm90ZSB0aGF0IHRoZSByZXF1ZXN0cyBhcmUgYWxsCisgKiAgICB0ZXJtaW5hdGVkIGFuZCBjb21wbGV0ZWQgKGJhY2sgdG8gdGhlIGhvc3QsIGlmIHN0YXJ0ZWQgdGhlcmUpLgorICogQGlzY2lfaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIFNDVS4KKyAqIEBpZGV2OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHRhcmdldC4KKyAqCisgKi8KK3ZvaWQgaXNjaV90ZXJtaW5hdGVfcGVuZGluZ19yZXF1ZXN0cyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpCit7CisJc3RydWN0IGNvbXBsZXRpb24gcmVxdWVzdF9jb21wbGV0aW9uOworCWVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cyBvbGRfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlMSVNUX0hFQUQobGlzdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCWxpc3Rfc3BsaWNlX2luaXQoJmlkZXYtPnJlcXNfaW5fcHJvY2VzcywgJmxpc3QpOworCisJLyogYXNzdW1lcyB0aGF0IGlzY2lfdGVybWluYXRlX3JlcXVlc3RfY29yZSBkZWxldGVzIGZyb20gdGhlIGxpc3QgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmxpc3QpKSB7CisJCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBsaXN0X2VudHJ5KGxpc3QubmV4dCwgdHlwZW9mKCppcmVxKSwgZGV2X25vZGUpOworCisJCS8qIENoYW5nZSBzdGF0ZSB0byAidGVybWluYXRpbmciIGlmIGl0IGlzIGN1cnJlbnRseQorCQkgKiAic3RhcnRlZCIuCisJCSAqLworCQlvbGRfc3RhdGUgPSBpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXJ0ZWRfdG9fbmV3c3RhdGUoaXJlcSwKKwkJCQkJCQkJICAgICZyZXF1ZXN0X2NvbXBsZXRpb24sCisJCQkJCQkJCSAgICB0ZXJtaW5hdGluZyk7CisJCXN3aXRjaCAob2xkX3N0YXRlKSB7CisJCWNhc2Ugc3RhcnRlZDoKKwkJY2FzZSBjb21wbGV0ZWQ6CisJCWNhc2UgYWJvcnRpbmc6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIHRlcm1pbmF0aW9uIGluIHByb2dyZXNzLCBvciBvdGhlcndpc2UgZGlzcG9zaXRpb25lZC4KKwkJCSAqIFdlIGtub3cgdGhlIHJlcXVlc3Qgd2FzIG9uICdsaXN0JyBzbyBzaG91bGQgYmUgc2FmZQorCQkJICogdG8gbW92ZSBpdCBiYWNrIHRvIHJlcXNfaW5fcHJvY2VzcworCQkJICovCisJCQlsaXN0X21vdmUoJmlyZXEtPmRldl9ub2RlLCAmaWRldi0+cmVxc19pbl9wcm9jZXNzKTsKKwkJCWlyZXEgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWlyZXEpCisJCQljb250aW51ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJCWluaXRfY29tcGxldGlvbigmcmVxdWVzdF9jb21wbGV0aW9uKTsKKworCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJICIlczogaWRldj0lcCByZXF1ZXN0PSVwOyB0YXNrPSVwIG9sZF9zdGF0ZT0lZFxuIiwKKwkJCSBfX2Z1bmNfXywgaWRldiwgaXJlcSwKKwkJCWlyZXEtPnR0eXBlID09IGlvX3Rhc2sgPyBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSkgOiBOVUxMLAorCQkJb2xkX3N0YXRlKTsKKworCQkvKiBJZiB0aGUgb2xkX3N0YXRlIGlzIHN0YXJ0ZWQ6CisJCSAqIFRoaXMgcmVxdWVzdCB3YXMgbm90IGFscmVhZHkgYmVpbmcgYWJvcnRlZC4gSWYgaXQgaGFkIGJlZW4sCisJCSAqIHRoZW4gdGhlIGFib3J0aW5nIEkvTyAoaWUuIHRoZSBUTUYgcmVxdWVzdCkgd291bGQgbm90IGJlIGluCisJCSAqIHRoZSBhYm9ydGluZyBzdGF0ZSwgYW5kIHRodXMgd291bGQgYmUgdGVybWluYXRlZCBoZXJlLiAgTm90ZQorCQkgKiB0aGF0IHNpbmNlIHRoZSBUTUYgY29tcGxldGlvbidzIGNhbGwgdG8gdGhlIGtlcm5lbCBmdW5jdGlvbgorCQkgKiAiY29tcGxldGUoKSIgZG9lcyBub3QgaGFwcGVuIHVudGlsIHRoZSBwZW5kaW5nIEkvTyByZXF1ZXN0CisJCSAqIHRlcm1pbmF0ZSBmdWxseSBjb21wbGV0ZXMsIHdlIGRvIG5vdCBoYXZlIHRvIGltcGxlbWVudCBhCisJCSAqIHNwZWNpYWwgd2FpdCBoZXJlIGZvciBhbHJlYWR5IGFib3J0aW5nIHJlcXVlc3RzIC0gdGhlCisJCSAqIHRlcm1pbmF0aW9uIG9mIHRoZSBUTUYgcmVxdWVzdCB3aWxsIGZvcmNlIHRoZSByZXF1ZXN0CisJCSAqIHRvIGZpbmlzaCBpdCdzIGFscmVhZHkgc3RhcnRlZCB0ZXJtaW5hdGUuCisJCSAqCisJCSAqIElmIG9sZF9zdGF0ZSA9PSBjb21wbGV0ZWQ6CisJCSAqIFRoaXMgcmVxdWVzdCBjb21wbGV0ZWQgZnJvbSB0aGUgU0NVIGhhcmR3YXJlIHBlcnNwZWN0aXZlCisJCSAqIGFuZCBub3cganVzdCBuZWVkcyBjbGVhbmluZyB1cCBpbiB0ZXJtcyBvZiBmcmVlaW5nIHRoZQorCQkgKiByZXF1ZXN0IGFuZCBwb3RlbnRpYWxseSBjYWxsaW5nIHVwIHRvIGxpYnNhcy4KKwkJICoKKwkJICogSWYgb2xkX3N0YXRlID09IGFib3J0aW5nOgorCQkgKiBUaGlzIHJlcXVlc3QgaGFzIGFscmVhZHkgZ29uZSB0aHJvdWdoIGEgVE1GIHRpbWVvdXQsIGJ1dCBtYXkKKwkJICogbm90IGhhdmUgYmVlbiB0ZXJtaW5hdGVkOyBuZWVkcyBjbGVhbmluZyB1cCBhdCBsZWFzdC4KKwkJICovCisJCWlzY2lfdGVybWluYXRlX3JlcXVlc3RfY29yZShpaG9zdCwgaWRldiwgaXJlcSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBpc2NpX3Rhc2tfc2VuZF9sdV9yZXNldF9zYXMoKSAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IG9mIHRoZSBTQVMgRG9tYWluCisgKiAgICBUZW1wbGF0ZSBmdW5jdGlvbnMuCisgKiBAbHVuOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGx1biB0byBiZSByZXNldC4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgaXNjaV90YXNrX3NlbmRfbHVfcmVzZXRfc2FzKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZSwKKwl1OCAqbHVuKQoreworCXN0cnVjdCBpc2NpX3RtZiB0bWY7CisJaW50IHJldCA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9ob3N0ID0gJXAsIGlzY2lfZGV2aWNlID0gJXBcbiIsCisJCV9fZnVuY19fLCBpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKTsKKwkvKiBTZW5kIHRoZSBMVU4gcmVzZXQgdG8gdGhlIHRhcmdldC4gIEJ5IHRoZSB0aW1lIHRoZSBjYWxsIHJldHVybnMsCisJICogdGhlIFRNRiBoYXMgZnVsbHkgZXhlY3RlZCBpbiB0aGUgdGFyZ2V0IChpbiB3aGljaCBjYXNlIHRoZSByZXR1cm4KKwkgKiB2YWx1ZSBpcyAiVE1GX1JFU1BfRlVOQ19DT01QTEVURSIsIG9yIHRoZSByZXF1ZXN0IHRpbWVkLW91dCAob3IKKwkgKiB3YXMgb3RoZXJ3aXNlIHVuYWJsZSB0byBiZSBleGVjdXRlZCAoIlRNRl9SRVNQX0ZVTkNfRkFJTEVEIikuCisJICovCisJaXNjaV90YXNrX2J1aWxkX3RtZigmdG1mLCBpc2NpX3RtZl9zc3BfbHVuX3Jlc2V0LCBOVUxMLCBOVUxMKTsKKworCSNkZWZpbmUgSVNDSV9MVV9SRVNFVF9USU1FT1VUX01TIDIwMDAgLyogMiBzZWNvbmQgdGltZW91dC4gKi8KKwlyZXQgPSBpc2NpX3Rhc2tfZXhlY3V0ZV90bWYoaXNjaV9ob3N0LCBpc2NpX2RldmljZSwgJnRtZiwgSVNDSV9MVV9SRVNFVF9USU1FT1VUX01TKTsKKworCWlmIChyZXQgPT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkKKwkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6ICVwOiBUTUZfTFVfUkVTRVQgcGFzc2VkXG4iLAorCQkJX19mdW5jX18sIGlzY2lfZGV2aWNlKTsKKwllbHNlCisJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiAlcDogVE1GX0xVX1JFU0VUIGZhaWxlZCAoJXgpXG4iLAorCQkJX19mdW5jX18sIGlzY2lfZGV2aWNlLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc2NpX3Rhc2tfc2VuZF9sdV9yZXNldF9zYXRhKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LCB1OCAqbHVuKQoreworCWludCByZXQgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwlzdHJ1Y3QgaXNjaV90bWYgdG1mOworCisJLyogU2VuZCB0aGUgc29mdCByZXNldCB0byB0aGUgdGFyZ2V0ICovCisJI2RlZmluZSBJU0NJX1NSU1RfVElNRU9VVF9NUyAyNTAwMCAvKiAyNSBzZWNvbmQgdGltZW91dC4gKi8KKwlpc2NpX3Rhc2tfYnVpbGRfdG1mKCZ0bWYsIGlzY2lfdG1mX3NhdGFfc3JzdF9oaWdoLCBOVUxMLCBOVUxMKTsKKworCXJldCA9IGlzY2lfdGFza19leGVjdXRlX3RtZihpaG9zdCwgaWRldiwgJnRtZiwgSVNDSV9TUlNUX1RJTUVPVVRfTVMpOworCisJaWYgKHJldCAhPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFKSB7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkgIiVzOiBBc3NlcnQgU1JTVCBmYWlsZWQgKCVwKSA9ICV4IiwKKwkJCSBfX2Z1bmNfXywgaWRldiwgcmV0KTsKKworCQkvKiBSZXR1cm4gdGhlIGZhaWx1cmUgc28gdGhhdCB0aGUgTFVOIHJlc2V0IGlzIGVzY2FsYXRlZAorCQkgKiB0byBhIHRhcmdldCByZXNldC4KKwkJICovCisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXNjaV90YXNrX2x1X3Jlc2V0KCkgLSBUaGlzIGZ1bmN0aW9uIGlzIG9uZSBvZiB0aGUgU0FTIERvbWFpbiBUZW1wbGF0ZQorICogICAgZnVuY3Rpb25zLiBUaGlzIGlzIG9uZSBvZiB0aGUgVGFzayBNYW5hZ2VtZW50IGZ1bmN0b2lucyBjYWxsZWQgYnkgbGlic2FzLAorICogICAgdG8gcmVzZXQgdGhlIGdpdmVuIGx1bi4gTm90ZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHdoaWxlIHRoaXMgY2FsbCBpcworICogICAgZXhlY3V0aW5nLCBubyBJL08gd2lsbCBiZSBzZW50IGJ5IHRoZSBob3N0IHRvIHRoZSBkZXZpY2UuCisgKiBAbHVuOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGx1biB0byBiZSByZXNldC4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludCBpc2NpX3Rhc2tfbHVfcmVzZXQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRvbWFpbl9kZXZpY2UsIHU4ICpsdW4pCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0ID0gZGV2X3RvX2lob3N0KGRvbWFpbl9kZXZpY2UpOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlzY2lfZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCWlzY2lfZGV2aWNlID0gaXNjaV9sb29rdXBfZGV2aWNlKGRvbWFpbl9kZXZpY2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBkb21haW5fZGV2aWNlPSVwLCBpc2NpX2hvc3Q9JXA7IGlzY2lfZGV2aWNlPSVwXG4iLAorCQkgX19mdW5jX18sIGRvbWFpbl9kZXZpY2UsIGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UpOworCisJaWYgKGlzY2lfZGV2aWNlKQorCQlzZXRfYml0KElERVZfRUgsICZpc2NpX2RldmljZS0+ZmxhZ3MpOworCisJLyogSWYgdGhlcmUgaXMgYSBkZXZpY2UgcmVzZXQgcGVuZGluZyBvbiBhbnkgcmVxdWVzdCBpbiB0aGUKKwkgKiBkZXZpY2UncyBsaXN0LCBmYWlsIHRoaXMgTFVOIHJlc2V0IHJlcXVlc3QgaW4gb3JkZXIgdG8KKwkgKiBlc2NhbGF0ZSB0byB0aGUgZGV2aWNlIHJlc2V0LgorCSAqLworCWlmICghaXNjaV9kZXZpY2UgfHwKKwkgICAgaXNjaV9kZXZpY2VfaXNfcmVzZXRfcGVuZGluZyhpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKSkgeworCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IE5vIGRldiAoJXApLCBvciAiCisJCQkgIlJFU0VUIFBFTkRJTkc6IGRvbWFpbl9kZXZpY2U9JXBcbiIsCisJCQkgX19mdW5jX18sIGlzY2lfZGV2aWNlLCBkb21haW5fZGV2aWNlKTsKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFNlbmQgdGhlIHRhc2sgbWFuYWdlbWVudCBwYXJ0IG9mIHRoZSByZXNldC4gKi8KKwlpZiAoc2FzX3Byb3RvY29sX2F0YShkb21haW5fZGV2aWNlLT50cHJvdG8pKSB7CisJCXJldCA9IGlzY2lfdGFza19zZW5kX2x1X3Jlc2V0X3NhdGEoaXNjaV9ob3N0LCBpc2NpX2RldmljZSwgbHVuKTsKKwl9IGVsc2UKKwkJcmV0ID0gaXNjaV90YXNrX3NlbmRfbHVfcmVzZXRfc2FzKGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UsIGx1bik7CisKKwkvKiBJZiB0aGUgTFVOIHJlc2V0IHdvcmtlZCwgYWxsIHRoZSBJL08gY2FuIG5vdyBiZSB0ZXJtaW5hdGVkLiAqLworCWlmIChyZXQgPT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkKKwkJLyogVGVybWluYXRlIGFsbCBJL08gbm93LiAqLworCQlpc2NpX3Rlcm1pbmF0ZV9wZW5kaW5nX3JlcXVlc3RzKGlzY2lfaG9zdCwKKwkJCQkJCWlzY2lfZGV2aWNlKTsKKworIG91dDoKKwlpc2NpX3B1dF9kZXZpY2UoaXNjaV9kZXZpY2UpOworCXJldHVybiByZXQ7Cit9CisKKworLyoJIGludCAoKmxsZGRfY2xlYXJfbmV4dXNfcG9ydCkoc3RydWN0IGFzZF9zYXNfcG9ydCAqKTsgKi8KK2ludCBpc2NpX3Rhc2tfY2xlYXJfbmV4dXNfcG9ydChzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0KQoreworCXJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKK30KKworCisKK2ludCBpc2NpX3Rhc2tfY2xlYXJfbmV4dXNfaGEoc3RydWN0IHNhc19oYV9zdHJ1Y3QgKmhhKQoreworCXJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKK30KKworLyogVGFzayBNYW5hZ2VtZW50IEZ1bmN0aW9ucy4gTXVzdCBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQuCSAqLworCisvKioKKyAqIGlzY2lfYWJvcnRfdGFza19wcm9jZXNzX2NiKCkgLSBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgYWJvcnQgdGFzaworICogICAgVE1GIGNvbW1hbmQuICBJdCBtYW5hZ2VzIHRoZSByZXF1ZXN0IHN0YXRlIHdpdGggcmVzcGVjdCB0byB0aGUgc3VjY2Vzc2Z1bAorICogICAgdHJhbnNtaXNzaW9uIC8gY29tcGxldGlvbiBvZiB0aGUgYWJvcnQgdGFzayByZXF1ZXN0LgorICogQGNiX3N0YXRlOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlbiB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgLSBhZnRlcgorICogICAgdGhlIFRNRiByZXF1ZXN0IGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIGFmdGVyIGl0IGhhcyB0aW1lZC1vdXQuCisgKiBAdG1mOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIFRNRiBpbiBwcm9ncmVzcy4KKyAqCisgKgorICovCitzdGF0aWMgdm9pZCBpc2NpX2Fib3J0X3Rhc2tfcHJvY2Vzc19jYigKKwllbnVtIGlzY2lfdG1mX2NiX3N0YXRlIGNiX3N0YXRlLAorCXN0cnVjdCBpc2NpX3RtZiAqdG1mLAorCXZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGlzY2lfcmVxdWVzdCAqb2xkX3JlcXVlc3Q7CisKKwlvbGRfcmVxdWVzdCA9IChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICopY2JfZGF0YTsKKworCWRldl9kYmcoJm9sZF9yZXF1ZXN0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiB0bWY9JXAsIG9sZF9yZXF1ZXN0PSVwXG4iLAorCQlfX2Z1bmNfXywgdG1mLCBvbGRfcmVxdWVzdCk7CisKKwlzd2l0Y2ggKGNiX3N0YXRlKSB7CisKKwljYXNlIGlzY2lfdG1mX3N0YXJ0ZWQ6CisJCS8qIFRoZSBUTUYgaGFzIGJlZW4gc3RhcnRlZC4gIE5vdGhpbmcgdG8gZG8gaGVyZSwgc2luY2UgdGhlCisJCSAqIHJlcXVlc3Qgc3RhdGUgd2FzIGFscmVhZHkgc2V0IHRvICJhYm9ydGVkIiBieSB0aGUgYWJvcnQKKwkJICogdGFzayBmdW5jdGlvbi4KKwkJICovCisJCWlmICgob2xkX3JlcXVlc3QtPnN0YXR1cyAhPSBhYm9ydGVkKQorCQkJJiYgKG9sZF9yZXF1ZXN0LT5zdGF0dXMgIT0gY29tcGxldGVkKSkKKwkJCWRldl9kYmcoJm9sZF9yZXF1ZXN0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IEJhZCByZXF1ZXN0IHN0YXR1cyAoJWQpOiB0bWY9JXAsIG9sZF9yZXF1ZXN0PSVwXG4iLAorCQkJCV9fZnVuY19fLCBvbGRfcmVxdWVzdC0+c3RhdHVzLCB0bWYsIG9sZF9yZXF1ZXN0KTsKKwkJYnJlYWs7CisKKwljYXNlIGlzY2lfdG1mX3RpbWVkX291dDoKKworCQkvKiBTZXQgdGhlIHRhc2sncyBzdGF0ZSB0byAiYWJvcnRpbmciLCBzaW5jZSB0aGUgYWJvcnQgdGFzaworCQkgKiBmdW5jdGlvbiB0aHJlYWQgc2V0IGl0IHRvICJhYm9ydGVkIiAoYWJvdmUpIGluIGFudGljaXBhdGlvbgorCQkgKiBvZiB0aGUgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3Qgd29ya2luZyBjb3JyZWN0bHkuICBTaW5jZSB0aGUKKwkJICogdGltZW91dCBoYXMgbm93IGZpcmVkLCB0aGUgVE1GIHJlcXVlc3QgZmFpbGVkLiAgV2Ugc2V0IHRoZQorCQkgKiBzdGF0ZSBzdWNoIHRoYXQgdGhlIHJlcXVlc3QgY29tcGxldGlvbiB3aWxsIGluZGljYXRlIHRoZQorCQkgKiBkZXZpY2UgaXMgbm8gbG9uZ2VyIHByZXNlbnQuCisJCSAqLworCQlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKG9sZF9yZXF1ZXN0LCBhYm9ydGluZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2RiZygmb2xkX3JlcXVlc3QtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBCYWQgY2Jfc3RhdGUgKCVkKTogdG1mPSVwLCBvbGRfcmVxdWVzdD0lcFxuIiwKKwkJCV9fZnVuY19fLCBjYl9zdGF0ZSwgdG1mLCBvbGRfcmVxdWVzdCk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBpc2NpX3Rhc2tfYWJvcnRfdGFzaygpIC0gVGhpcyBmdW5jdGlvbiBpcyBvbmUgb2YgdGhlIFNBUyBEb21haW4gVGVtcGxhdGUKKyAqICAgIGZ1bmN0aW9ucy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbGlic2FzIHRvIGFib3J0IGEgc3BlY2lmaWVkIHRhc2suCisgKiBAdGFzazogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBTQVMgdGFzayB0byBhYm9ydC4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludCBpc2NpX3Rhc2tfYWJvcnRfdGFzayhzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0ID0gZGV2X3RvX2lob3N0KHRhc2stPmRldik7CisJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soYWJvcnRlZF9pb19jb21wbGV0aW9uKTsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICAgICAgICpvbGRfcmVxdWVzdCA9IE5VTEw7CisJZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzICBvbGRfc3RhdGU7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaXNjaV9kZXZpY2UgPSBOVUxMOworCXN0cnVjdCBpc2NpX3RtZiAgICAgICAgICAgdG1mOworCWludCAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICBmbGFnczsKKwlib29sICAgICAgICAgICAgICAgICAgICAgIGFueV9kZXZfcmVzZXQgPSBmYWxzZTsKKworCS8qIEdldCB0aGUgaXNjaV9yZXF1ZXN0IHJlZmVyZW5jZSBmcm9tIHRoZSB0YXNrLiAgTm90ZSB0aGF0CisJICogdGhpcyBjaGVjayBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIHBlbmRpbmcgcmVxdWVzdCBsaXN0CisJICogaW4gdGhlIGRldmljZSwgYmVjYXVzZSB0YXNrcyBkcml2aW5nIHJlc2V0cyBtYXkgbGFuZCBoZXJlCisJICogYWZ0ZXIgY29tcGxldGlvbiBpbiB0aGUgY29yZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7CisKKwlvbGRfcmVxdWVzdCA9IHRhc2stPmxsZGRfdGFzazsKKworCS8qIElmIHRhc2sgaXMgYWxyZWFkeSBkb25lLCB0aGUgcmVxdWVzdCBpc24ndCB2YWxpZCAqLworCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSAmJgorCSAgICAodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX0FUX0lOSVRJQVRPUikgJiYKKwkgICAgb2xkX3JlcXVlc3QpCisJCWlzY2lfZGV2aWNlID0gaXNjaV9sb29rdXBfZGV2aWNlKHRhc2stPmRldik7CisKKwlzcGluX3VubG9jaygmdGFzay0+dGFza19zdGF0ZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogdGFzayA9ICVwXG4iLCBfX2Z1bmNfXywgdGFzayk7CisKKwlpZiAoIWlzY2lfZGV2aWNlIHx8ICFvbGRfcmVxdWVzdCkKKwkJZ290byBvdXQ7CisKKwlzZXRfYml0KElERVZfRUgsICZpc2NpX2RldmljZS0+ZmxhZ3MpOworCisJLyogVGhpcyB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgd2lsbCBmYWlsIGFib3J0IHJlcXVlc3RzIGZvcgorCSAqIFNBVEEvU1RQLiAgRmFpbGluZyB0aGUgYWJvcnQgcmVxdWVzdCB0aGlzIHdheSB3aWxsIGNhdXNlIHRoZQorCSAqIFNDU0kgZXJyb3IgaGFuZGxlciB0aHJlYWQgdG8gZXNjYWxhdGUgdG8gTFVOIHJlc2V0CisJICovCisJaWYgKHNhc19wcm90b2NvbF9hdGEodGFzay0+dGFza19wcm90bykpIHsKKwkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkgICAgIiB0YXNrICVwIGlzIGZvciBhIFNUUC9TQVRBIGRldmljZTsiCisJCQkgICAgIiByZXR1cm5pbmcgVE1GX1JFU1BfRlVOQ19GQUlMRURcbiIKKwkJCSAgICAiIHRvIGNhdXNlIGEgTFVOIHJlc2V0Li4uXG4iLCB0YXNrKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCSIlczogb2xkX3JlcXVlc3QgPT0gJXBcbiIsIF9fZnVuY19fLCBvbGRfcmVxdWVzdCk7CisKKwlhbnlfZGV2X3Jlc2V0ID0gaXNjaV9kZXZpY2VfaXNfcmVzZXRfcGVuZGluZyhpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCWFueV9kZXZfcmVzZXQgPSBhbnlfZGV2X3Jlc2V0IHx8ICh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQpOworCisJLyogSWYgdGhlIGV4dHJhY3Rpb24gb2YgdGhlIHJlcXVlc3QgcmVmZXJlbmNlIGZyb20gdGhlIHRhc2sKKwkgKiBmYWlsZWQsIHRoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkIChvciBpZiB0aGVyZSBpcyBhCisJICogcGVuZGluZyByZXNldCB0aGVuIHRoaXMgYWJvcnQgcmVxdWVzdCBmdW5jdGlvbiBtdXN0IGJlIGZhaWxlZAorCSAqIGluIG9yZGVyIHRvIGVzY2FsYXRlIHRvIHRoZSB0YXJnZXQgcmVzZXQpLgorCSAqLworCWlmICgob2xkX3JlcXVlc3QgPT0gTlVMTCkgfHwgYW55X2Rldl9yZXNldCkgeworCisJCS8qIElmIHRoZSBkZXZpY2UgcmVzZXQgdGFzayBmbGFnIGlzIHNldCwgZmFpbCB0aGUgdGFzaworCQkgKiBtYW5hZ2VtZW50IHJlcXVlc3QuICBPdGhlcndpc2UsIHRoZSBvcmlnaW5hbCByZXF1ZXN0CisJCSAqIGhhcyBjb21wbGV0ZWQuCisJCSAqLworCQlpZiAoYW55X2Rldl9yZXNldCkgeworCisJCQkvKiBUdXJuIG9mZiB0aGUgdGFzaydzIERPTkUgdG8gbWFrZSBzdXJlIHRoaXMKKwkJCSAqIHRhc2sgaXMgZXNjYWxhdGVkIHRvIGEgdGFyZ2V0IHJlc2V0LgorCQkJICovCisJCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19TVEFURV9ET05FOworCisJCQkvKiBNYWtlIHRoZSByZXNldCBoYXBwZW4gYXMgc29vbiBhcyBwb3NzaWJsZS4gKi8KKwkJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQ7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJCQkvKiBGYWlsIHRoZSB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdCBpbiBvcmRlciB0bworCQkJICogZXNjYWxhdGUgdG8gdGhlIHRhcmdldCByZXNldC4KKwkJCSAqLworCQkJcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisKKwkJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogRmFpbGluZyB0YXNrIGFib3J0IGluIG9yZGVyIHRvICIKKwkJCQkiZXNjYWxhdGUgdG8gdGFyZ2V0IHJlc2V0IGJlY2F1c2VcbiIKKwkJCQkiU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQgaXMgc2V0IGZvciAiCisJCQkJInRhc2sgJXAgb24gZGV2ICVwXG4iLAorCQkJCV9fZnVuY19fLCB0YXNrLCBpc2NpX2RldmljZSk7CisKKworCQl9IGVsc2UgeworCQkJLyogVGhlIHJlcXVlc3QgaGFzIGFscmVhZHkgY29tcGxldGVkIGFuZCB0aGVyZQorCQkJICogaXMgbm90aGluZyB0byBkbyBoZXJlIG90aGVyIHRoYW4gdG8gc2V0IHRoZSB0YXNrCisJCQkgKiBkb25lIGJpdCwgYW5kIGluZGljYXRlIHRoYXQgdGhlIHRhc2sgYWJvcnQgZnVuY3Rpb24KKwkJCSAqIHdhcyBzdWNlc3NmdWwuCisJCQkgKi8KKwkJCWlzY2lfc2V0X3Rhc2tfZG9uZWZsYWdzKHRhc2spOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCQkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKworCQkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBhYm9ydCB0YXNrIG5vdCBuZWVkZWQgZm9yICVwXG4iLAorCQkJCV9fZnVuY19fLCB0YXNrKTsKKwkJfQorCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIHRoZSByZXF1ZXN0IHN0YXR1cyBhbmQgY2hhbmdlIHRvICJhYm9ydGVkIiBpZiBjdXJyZW50bHkKKwkgKiAic3RhcnRpbmciOyBpZiB0cnVlIHRoZW4gc2V0IHRoZSBJL08ga2VybmVsIGNvbXBsZXRpb24KKwkgKiBzdHJ1Y3QgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSByZXF1ZXN0IGNvbXBsZXRlcy4KKwkgKi8KKwlvbGRfc3RhdGUgPSBpc2NpX3Rhc2tfdmFsaWRhdGVfcmVxdWVzdF90b19hYm9ydCgKKwkJCQlvbGRfcmVxdWVzdCwgaXNjaV9ob3N0LCBpc2NpX2RldmljZSwKKwkJCQkmYWJvcnRlZF9pb19jb21wbGV0aW9uKTsKKwlpZiAoKG9sZF9zdGF0ZSAhPSBzdGFydGVkKSAmJgorCSAgICAob2xkX3N0YXRlICE9IGNvbXBsZXRlZCkgJiYKKwkgICAgKG9sZF9zdGF0ZSAhPSBhYm9ydGluZykpIHsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJCS8qIFRoZSByZXF1ZXN0IHdhcyBhbHJlYWR5IGJlaW5nIGhhbmRsZWQgYnkgc29tZW9uZSBlbHNlIChiZWNhdXNlCisJCSogdGhleSBnb3QgdG8gc2V0IHRoZSBzdGF0ZSBhd2F5IGZyb20gc3RhcnRlZCkuCisJCSovCisJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiAgZGV2aWNlID0gJXA7IG9sZF9yZXF1ZXN0ICVwIGFscmVhZHkgYmVpbmcgYWJvcnRlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJaXNjaV9kZXZpY2UsIG9sZF9yZXF1ZXN0KTsKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwkJZ290byBvdXQ7CisJfQorCWlmICh0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVAgfHwKKwkgICAgdGVzdF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZvbGRfcmVxdWVzdC0+ZmxhZ3MpKSB7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogU01QIHJlcXVlc3QgKCVkKSIKKwkJCSIgb3IgY29tcGxldGVfaW5fdGFyZ2V0ICglZCksIHRodXMgbm8gVE1GXG4iLAorCQkJX19mdW5jX18sICh0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVApLAorCQkJdGVzdF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZvbGRfcmVxdWVzdC0+ZmxhZ3MpKTsKKworCQkvKiBTZXQgdGhlIHN0YXRlIG9uIHRoZSB0YXNrLiAqLworCQlpc2NpX3Rhc2tfYWxsX2RvbmUodGFzayk7CisKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKworCQkvKiBTdG9wcGluZyBhbmQgU01QIGRldmljZXMgYXJlIG5vdCBzZW50IGEgVE1GLCBhbmQgYXJlIG5vdAorCQkgKiByZXNldCwgYnV0IHRoZSBvdXRzdGFuZGluZyBJL08gcmVxdWVzdCBpcyB0ZXJtaW5hdGVkIGJlbG93LgorCQkgKi8KKwl9IGVsc2UgeworCQkvKiBGaWxsIGluIHRoZSB0bWYgc3R1Y3R1cmUgKi8KKwkJaXNjaV90YXNrX2J1aWxkX2Fib3J0X3Rhc2tfdG1mKCZ0bWYsIGlzY2lfdG1mX3NzcF90YXNrX2Fib3J0LAorCQkJCQkgICAgICAgaXNjaV9hYm9ydF90YXNrX3Byb2Nlc3NfY2IsCisJCQkJCSAgICAgICBvbGRfcmVxdWVzdCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKworCQkjZGVmaW5lIElTQ0lfQUJPUlRfVEFTS19USU1FT1VUX01TIDUwMCAvKiBoYWxmIHNlY29uZCB0aW1lb3V0LiAqLworCQlyZXQgPSBpc2NpX3Rhc2tfZXhlY3V0ZV90bWYoaXNjaV9ob3N0LCBpc2NpX2RldmljZSwgJnRtZiwKKwkJCQkJICAgIElTQ0lfQUJPUlRfVEFTS19USU1FT1VUX01TKTsKKworCQlpZiAocmV0ICE9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpCisJCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IGlzY2lfdGFza19zZW5kX3RtZiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCX0KKwlpZiAocmV0ID09IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpIHsKKwkJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJm9sZF9yZXF1ZXN0LT5mbGFncyk7CisKKwkJLyogQ2xlYW4gdXAgdGhlIHJlcXVlc3Qgb24gb3VyIHNpZGUsIGFuZCB3YWl0IGZvciB0aGUgYWJvcnRlZAorCQkgKiBJL08gdG8gY29tcGxldGUuCisJCSAqLworCQlpc2NpX3Rlcm1pbmF0ZV9yZXF1ZXN0X2NvcmUoaXNjaV9ob3N0LCBpc2NpX2RldmljZSwgb2xkX3JlcXVlc3QpOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBkbyBub3QgbGVhdmUgYSByZWZlcmVuY2UgdG8gYWJvcnRlZF9pb19jb21wbGV0aW9uICovCisJb2xkX3JlcXVlc3QtPmlvX3JlcXVlc3RfY29tcGxldGlvbiA9IE5VTEw7Cisgb3V0OgorCWlzY2lfcHV0X2RldmljZShpc2NpX2RldmljZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpc2NpX3Rhc2tfYWJvcnRfdGFza19zZXQoKSAtIFRoaXMgZnVuY3Rpb24gaXMgb25lIG9mIHRoZSBTQVMgRG9tYWluIFRlbXBsYXRlCisgKiAgICBmdW5jdGlvbnMuIFRoaXMgaXMgb25lIG9mIHRoZSBUYXNrIE1hbmFnZW1lbnQgZnVuY3RvaW5zIGNhbGxlZCBieSBsaWJzYXMsCisgKiAgICB0byBhYm9ydCBhbGwgdGFzayBmb3IgdGhlIGdpdmVuIGx1bi4KKyAqIEBkX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkb21haW4gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiAgICByZXF1ZXN0LgorICogQGx1bjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsdW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4KKyAqCisgKiBzdGF0dXMsIHplcm8gaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KK2ludCBpc2NpX3Rhc2tfYWJvcnRfdGFza19zZXQoCisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRfZGV2aWNlLAorCXU4ICpsdW4pCit7CisJcmV0dXJuIFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworfQorCisKKy8qKgorICogaXNjaV90YXNrX2NsZWFyX2FjYSgpIC0gVGhpcyBmdW5jdGlvbiBpcyBvbmUgb2YgdGhlIFNBUyBEb21haW4gVGVtcGxhdGUKKyAqICAgIGZ1bmN0aW9ucy4gVGhpcyBpcyBvbmUgb2YgdGhlIFRhc2sgTWFuYWdlbWVudCBmdW5jdG9pbnMgY2FsbGVkIGJ5IGxpYnNhcy4KKyAqIEBkX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkb21haW4gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiAgICByZXF1ZXN0LgorICogQGx1bjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsdW4JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgKgorICogc3RhdHVzLCB6ZXJvIGluZGljYXRlcyBzdWNjZXNzLgorICovCitpbnQgaXNjaV90YXNrX2NsZWFyX2FjYSgKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZF9kZXZpY2UsCisJdTggKmx1bikKK3sKKwlyZXR1cm4gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7Cit9CisKKworCisvKioKKyAqIGlzY2lfdGFza19jbGVhcl90YXNrX3NldCgpIC0gVGhpcyBmdW5jdGlvbiBpcyBvbmUgb2YgdGhlIFNBUyBEb21haW4gVGVtcGxhdGUKKyAqICAgIGZ1bmN0aW9ucy4gVGhpcyBpcyBvbmUgb2YgdGhlIFRhc2sgTWFuYWdlbWVudCBmdW5jdG9pbnMgY2FsbGVkIGJ5IGxpYnNhcy4KKyAqIEBkX2RldmljZTogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkb21haW4gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiAgICByZXF1ZXN0LgorICogQGx1bjogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBsdW4JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgKgorICogc3RhdHVzLCB6ZXJvIGluZGljYXRlcyBzdWNjZXNzLgorICovCitpbnQgaXNjaV90YXNrX2NsZWFyX3Rhc2tfc2V0KAorCXN0cnVjdCBkb21haW5fZGV2aWNlICpkX2RldmljZSwKKwl1OCAqbHVuKQoreworCXJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKK30KKworCisvKioKKyAqIGlzY2lfdGFza19xdWVyeV90YXNrKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIHRvIGNhdXNlIGxpYnNhcyB0bworICogICAgY29ycmVjdGx5IGVzY2FsYXRlIHRoZSBmYWlsZWQgYWJvcnQgdG8gYSBMVU4gb3IgdGFyZ2V0IHJlc2V0ICh0aGlzIGlzCisgKiAgICBiZWNhdXNlIHNhc19zY3NpX2ZpbmRfdGFzayBsaWJzYXMgZnVuY3Rpb24gZG9lcyBub3QgY29ycmVjdGx5IGludGVycHJldAorICogICAgYWxsIHJldHVybiBjb2RlcyBmcm9tIHRoZSBhYm9ydCB0YXNrIGNhbGwpLiAgV2hlbiBUTUZfUkVTUF9GVU5DX1NVQ0MgaXMKKyAqICAgIHJldHVybmVkLCBsaWJzYXMgdHVybnMgdGhpcyBpbnRvIGEgTFVOIHJlc2V0OyB3aGVuIEZVTkNfRkFJTEVEIGlzCisgKiAgICByZXR1cm5lZCwgbGlic2FzIHdpbGwgdHVybiB0aGlzIGludG8gYSB0YXJnZXQgcmVzZXQKKyAqIEB0YXNrOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHNhcyB0YXNrIGJlaW5nIHF1ZXJpZWQuCisgKiBAbHVuOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGx1biBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LgorICoKKyAqIHN0YXR1cywgemVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworaW50IGlzY2lfdGFza19xdWVyeV90YXNrKAorCXN0cnVjdCBzYXNfdGFzayAqdGFzaykKK3sKKwkvKiBTZWUgaWYgdGhlcmUgaXMgYSBwZW5kaW5nIGRldmljZSByZXNldCBmb3IgdGhpcyBkZXZpY2UuICovCisJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19ORUVEX0RFVl9SRVNFVCkKKwkJcmV0dXJuIFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCWVsc2UKKwkJcmV0dXJuIFRNRl9SRVNQX0ZVTkNfU1VDQzsKK30KKworLyoKKyAqIGlzY2lfdGFza19yZXF1ZXN0X2NvbXBsZXRlKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2NpIGNvcmUgd2hlbgorICogICAgYW4gdGFzayByZXF1ZXN0IGNvbXBsZXRlcy4KKyAqIEBpaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBJU0NJIGhvc3Qgb2JqZWN0CisgKiBAaXJlcTogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbXBsZXRlZCBpc2NpX3JlcXVlc3Qgb2JqZWN0LgorICogQGNvbXBsZXRpb25fc3RhdHVzOiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGNvbXBsZXRpb24gc3RhdHVzIGZyb20gdGhlCisgKiAgICBzY2kgY29yZS4KKyAqCisgKiBub25lLgorICovCit2b2lkCitpc2NpX3Rhc2tfcmVxdWVzdF9jb21wbGV0ZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCSAgIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkgICBlbnVtIHNjaV90YXNrX3N0YXR1cyBjb21wbGV0aW9uX3N0YXR1cykKK3sKKwlzdHJ1Y3QgaXNjaV90bWYgKnRtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOworCXN0cnVjdCBjb21wbGV0aW9uICp0bWZfY29tcGxldGU7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkiJXM6IHJlcXVlc3QgPSAlcCwgc3RhdHVzPSVkXG4iLAorCQlfX2Z1bmNfXywgaXJlcSwgY29tcGxldGlvbl9zdGF0dXMpOworCisJaXNjaV9yZXF1ZXN0X2NoYW5nZV9zdGF0ZShpcmVxLCBjb21wbGV0ZWQpOworCisJdG1mLT5zdGF0dXMgPSBjb21wbGV0aW9uX3N0YXR1czsKKwlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmaXJlcS0+ZmxhZ3MpOworCisJaWYgKHRtZi0+cHJvdG8gPT0gU0FTX1BST1RPQ09MX1NTUCkgeworCQltZW1jcHkoJnRtZi0+cmVzcC5yZXNwX2l1LAorCQkgICAgICAgJmlyZXEtPnNzcC5yc3AsCisJCSAgICAgICBTU1BfUkVTUF9JVV9NQVhfU0laRSk7CisJfSBlbHNlIGlmICh0bWYtPnByb3RvID09IFNBU19QUk9UT0NPTF9TQVRBKSB7CisJCW1lbWNweSgmdG1mLT5yZXNwLmQyaF9maXMsCisJCSAgICAgICAmaXJlcS0+c3RwLnJzcCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzKSk7CisJfQorCisJLyogUFJJTlRfVE1GKCAoKHN0cnVjdCBpc2NpX3RtZiAqKXJlcXVlc3QtPnRhc2spKTsgKi8KKwl0bWZfY29tcGxldGUgPSB0bWYtPmNvbXBsZXRlOworCisJc2NpX2NvbnRyb2xsZXJfY29tcGxldGVfaW8oaWhvc3QsIGlyZXEtPnRhcmdldF9kZXZpY2UsIGlyZXEpOworCS8qIHNldCB0aGUgJ3Rlcm1pbmF0ZWQnIGZsYWcgaGFuZGxlIHRvIG1ha2Ugc3VyZSBpdCBjYW5ub3QgYmUgdGVybWluYXRlZAorCSAqICBvciBjb21wbGV0ZWQgYWdhaW4uCisJICovCisJc2V0X2JpdChJUkVRX1RFUk1JTkFURUQsICZpcmVxLT5mbGFncyk7CisKKwlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlyZXEsIHVuYWxsb2NhdGVkKTsKKwlsaXN0X2RlbF9pbml0KCZpcmVxLT5kZXZfbm9kZSk7CisKKwkvKiBUaGUgdGFzayBtYW5hZ2VtZW50IHBhcnQgY29tcGxldGVzIGxhc3QuICovCisJY29tcGxldGUodG1mX2NvbXBsZXRlKTsKK30KKworc3RhdGljIHZvaWQgaXNjaV9zbXBfdGFza190aW1lZG91dCh1bnNpZ25lZCBsb25nIF90YXNrKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9ICh2b2lkICopIF90YXNrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKCEodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0RPTkUpKQorCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX1NUQVRFX0FCT1JURUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwljb21wbGV0ZSgmdGFzay0+Y29tcGxldGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfc21wX3Rhc2tfZG9uZShzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJaWYgKCFkZWxfdGltZXIoJnRhc2stPnRpbWVyKSkKKwkJcmV0dXJuOworCWNvbXBsZXRlKCZ0YXNrLT5jb21wbGV0aW9uKTsKK30KKworc3RhdGljIHN0cnVjdCBzYXNfdGFzayAqaXNjaV9hbGxvY190YXNrKHZvaWQpCit7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0ga3phbGxvYyhzaXplb2YoKnRhc2spLCBHRlBfS0VSTkVMKTsKKworCWlmICh0YXNrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZ0YXNrLT5saXN0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7CisJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgPSBTQVNfVEFTS19TVEFURV9QRU5ESU5HOworCQlpbml0X3RpbWVyKCZ0YXNrLT50aW1lcik7CisJCWluaXRfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7CisJfQorCisJcmV0dXJuIHRhc2s7Cit9CisKK3N0YXRpYyB2b2lkIGlzY2lfZnJlZV90YXNrKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3Qgc2FzX3Rhc2sgICp0YXNrKQoreworCWlmICh0YXNrKSB7CisJCUJVR19PTighbGlzdF9lbXB0eSgmdGFzay0+bGlzdCkpOworCQlrZnJlZSh0YXNrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaXNjaV9zbXBfZXhlY3V0ZV90YXNrKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAorCQkJCSBzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCB2b2lkICpyZXEsCisJCQkJIGludCByZXFfc2l6ZSwgdm9pZCAqcmVzcCwgaW50IHJlc3Bfc2l6ZSkKK3sKKwlpbnQgcmVzLCByZXRyeTsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBOVUxMOworCisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMzsgcmV0cnkrKykgeworCQl0YXNrID0gaXNjaV9hbGxvY190YXNrKCk7CisJCWlmICghdGFzaykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXRhc2stPmRldiA9IGRldjsKKwkJdGFzay0+dGFza19wcm90byA9IGRldi0+dHByb3RvOworCQlzZ19pbml0X29uZSgmdGFzay0+c21wX3Rhc2suc21wX3JlcSwgcmVxLCByZXFfc2l6ZSk7CisJCXNnX2luaXRfb25lKCZ0YXNrLT5zbXBfdGFzay5zbXBfcmVzcCwgcmVzcCwgcmVzcF9zaXplKTsKKworCQl0YXNrLT50YXNrX2RvbmUgPSBpc2NpX3NtcF90YXNrX2RvbmU7CisKKwkJdGFzay0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0YXNrOworCQl0YXNrLT50aW1lci5mdW5jdGlvbiA9IGlzY2lfc21wX3Rhc2tfdGltZWRvdXQ7CisJCXRhc2stPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTAqSFo7CisJCWFkZF90aW1lcigmdGFzay0+dGltZXIpOworCisJCXJlcyA9IGlzY2lfdGFza19leGVjdXRlX3Rhc2sodGFzaywgMSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKHJlcykgeworCQkJZGVsX3RpbWVyKCZ0YXNrLT50aW1lcik7CisJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogZXhlY3V0aW5nIFNNUCB0YXNrIGZhaWxlZDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmVzKTsKKwkJCWdvdG8gZXhfZXJyOworCQl9CisKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7CisJCXJlcyA9IC1FQ09NTTsKKwkJaWYgKCh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCkpIHsKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBzbXAgdGFzayB0aW1lZCBvdXQgb3IgYWJvcnRlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlpc2NpX3Rhc2tfYWJvcnRfdGFzayh0YXNrKTsKKwkJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkgeworCQkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJCSIlczogU01QIHRhc2sgYWJvcnRlZCBhbmQgbm90IGRvbmVcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlnb3RvIGV4X2VycjsKKwkJCX0KKwkJfQorCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzcCA9PSBTQVNfVEFTS19DT01QTEVURSAmJgorCQkgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fU1RBVF9HT09EKSB7CisJCQlyZXMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKKwkJICAgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQVNfREFUQV9VTkRFUlJVTikgeworCQkJLyogbm8gZXJyb3IsIGJ1dCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZgorCQkJKiB1bmRlcnJ1biAqLworCQkJcmVzID0gdGFzay0+dGFza19zdGF0dXMucmVzaWR1YWw7CisJCQlicmVhazsKKwkJfQorCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzcCA9PSBTQVNfVEFTS19DT01QTEVURSAmJgorCQkgICAgICB0YXNrLT50YXNrX3N0YXR1cy5zdGF0ID09IFNBU19EQVRBX09WRVJSVU4pIHsKKwkJCXJlcyA9IC1FTVNHU0laRTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IHRhc2sgdG8gZGV2ICUwMTZsbHggcmVzcG9uc2U6IDB4JXggIgorCQkJCSJzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sCisJCQkJU0FTX0FERFIoZGV2LT5zYXNfYWRkciksCisJCQkJdGFzay0+dGFza19zdGF0dXMucmVzcCwKKwkJCQl0YXNrLT50YXNrX3N0YXR1cy5zdGF0KTsKKwkJCWlzY2lfZnJlZV90YXNrKGlob3N0LCB0YXNrKTsKKwkJCXRhc2sgPSBOVUxMOworCQl9CisJfQorZXhfZXJyOgorCUJVR19PTihyZXRyeSA9PSAzICYmIHRhc2sgIT0gTlVMTCk7CisJaXNjaV9mcmVlX3Rhc2soaWhvc3QsIHRhc2spOworCXJldHVybiByZXM7Cit9CisKKyNkZWZpbmUgRElTQ09WRVJfUkVRX1NJWkUgIDE2CisjZGVmaW5lIERJU0NPVkVSX1JFU1BfU0laRSA1NgorCitpbnQgaXNjaV9zbXBfZ2V0X3BoeV9hdHRhY2hlZF9kZXZfdHlwZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCQkgICAgICAgc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgaW50IHBoeV9pZCwgaW50ICphZHQpCit7CisJc3RydWN0IHNtcF9yZXNwICpkaXNjX3Jlc3A7CisJdTggKmRpc2NfcmVxOworCWludCByZXM7CisKKwlkaXNjX3Jlc3AgPSBremFsbG9jKERJU0NPVkVSX1JFU1BfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkaXNjX3Jlc3ApCisJCXJldHVybiAtRU5PTUVNOworCisJZGlzY19yZXEgPSBremFsbG9jKERJU0NPVkVSX1JFUV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGlzY19yZXEpIHsKKwkJZGlzY19yZXFbMF0gPSBTTVBfUkVRVUVTVDsKKwkJZGlzY19yZXFbMV0gPSBTTVBfRElTQ09WRVI7CisJCWRpc2NfcmVxWzldID0gcGh5X2lkOworCX0gZWxzZSB7CisJCWtmcmVlKGRpc2NfcmVzcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXMgPSBpc2NpX3NtcF9leGVjdXRlX3Rhc2soaWhvc3QsIGRldiwgZGlzY19yZXEsIERJU0NPVkVSX1JFUV9TSVpFLAorCQkJCSAgICBkaXNjX3Jlc3AsIERJU0NPVkVSX1JFU1BfU0laRSk7CisJaWYgKCFyZXMpIHsKKwkJaWYgKGRpc2NfcmVzcC0+cmVzdWx0ICE9IFNNUF9SRVNQX0ZVTkNfQUNDKQorCQkJcmVzID0gZGlzY19yZXNwLT5yZXN1bHQ7CisJCWVsc2UKKwkJCSphZHQgPSBkaXNjX3Jlc3AtPmRpc2MuYXR0YWNoZWRfZGV2X3R5cGU7CisJfQorCWtmcmVlKGRpc2NfcmVxKTsKKwlrZnJlZShkaXNjX3Jlc3ApOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgaXNjaV93YWl0X2Zvcl9zbXBfcGh5X3Jlc2V0KHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsIGludCBwaHlfbnVtKQoreworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gaWRldi0+aXNjaV9wb3J0OworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPmlzY2lfaG9zdDsKKwlpbnQgcmVzLCBpdGVyYXRpb24gPSAwLCBhdHRhY2hlZF9kZXZpY2VfdHlwZTsKKwkjZGVmaW5lIFNUUF9XQUlUX01TRUNTIDI1MDAwCisJdW5zaWduZWQgbG9uZyB0bW8gPSBtc2Vjc190b19qaWZmaWVzKFNUUF9XQUlUX01TRUNTKTsKKwl1bnNpZ25lZCBsb25nIGRlYWRsaW5lID0gamlmZmllcyArIHRtbzsKKwllbnVtIHsKKwkJU01QX1BIWVdBSVRfUEhZRE9XTiwKKwkJU01QX1BIWVdBSVRfUEhZVVAsCisJCVNNUF9QSFlXQUlUX0RPTkUKKwl9IHBoeV9zdGF0ZSA9IFNNUF9QSFlXQUlUX1BIWURPV047CisKKwkvKiBXaGlsZSB0aGVyZSBpcyB0aW1lLCB3YWl0IGZvciB0aGUgcGh5IHRvIGdvIGF3YXkgYW5kIGNvbWUgYmFjayAqLworCXdoaWxlICh0aW1lX2lzX2FmdGVyX2ppZmZpZXMoZGVhZGxpbmUpICYmIHBoeV9zdGF0ZSAhPSBTTVBfUEhZV0FJVF9ET05FKSB7CisJCWludCBldmVudCA9IGF0b21pY19yZWFkKCZpcG9ydC0+ZXZlbnQpOworCisJCSsraXRlcmF0aW9uOworCisJCXRtbyA9IHdhaXRfZXZlbnRfdGltZW91dChpaG9zdC0+ZXZlbnRxLAorCQkJCQkgZXZlbnQgIT0gYXRvbWljX3JlYWQoJmlwb3J0LT5ldmVudCkgfHwKKwkJCQkJICF0ZXN0X2JpdChJUE9SVF9CQ05fQkxPQ0tFRCwgJmlwb3J0LT5mbGFncyksCisJCQkJCSB0bW8pOworCQkvKiBsaW5rIGRvd24sIHN0b3AgcG9sbGluZyAqLworCQlpZiAoIXRlc3RfYml0KElQT1JUX0JDTl9CTE9DS0VELCAmaXBvcnQtPmZsYWdzKSkKKwkJCWJyZWFrOworCisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkiJXM6IGlwb3J0ICVwLCBpdGVyYXRpb24gJWQsIgorCQkJIiBwaGFzZSAlZDogdGltZV9yZW1haW5pbmcgJWx1LCBiY25zID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgaXBvcnQsIGl0ZXJhdGlvbiwgcGh5X3N0YXRlLAorCQkJdG1vLCB0ZXN0X2JpdChJUE9SVF9CQ05fUEVORElORywgJmlwb3J0LT5mbGFncykpOworCisJCXJlcyA9IGlzY2lfc21wX2dldF9waHlfYXR0YWNoZWRfZGV2X3R5cGUoaWhvc3QsIGRldiwgcGh5X251bSwKKwkJCQkJCQkgJmF0dGFjaGVkX2RldmljZV90eXBlKTsKKwkJdG1vID0gZGVhZGxpbmUgLSBqaWZmaWVzOworCisJCWlmIChyZXMpIHsKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJICIlczogaXRlcmF0aW9uICVkLCBwaGFzZSAlZDoiCisJCQkJICIgU01QIGVycm9yPSVkLCB0aW1lX3JlbWFpbmluZz0lbHVcbiIsCisJCQkJIF9fZnVuY19fLCBpdGVyYXRpb24sIHBoeV9zdGF0ZSwgcmVzLCB0bW8pOworCQkJYnJlYWs7CisJCX0KKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogaXBvcnQgJXAsIGl0ZXJhdGlvbiAlZCwiCisJCQkiIHBoYXNlICVkOiB0aW1lX3JlbWFpbmluZyAlbHUsIGJjbnMgPSAlZCwgIgorCQkJImF0dGRldnR5cGUgPSAleFxuIiwKKwkJCV9fZnVuY19fLCBpcG9ydCwgaXRlcmF0aW9uLCBwaHlfc3RhdGUsCisJCQl0bW8sIHRlc3RfYml0KElQT1JUX0JDTl9QRU5ESU5HLCAmaXBvcnQtPmZsYWdzKSwKKwkJCWF0dGFjaGVkX2RldmljZV90eXBlKTsKKworCQlzd2l0Y2ggKHBoeV9zdGF0ZSkgeworCQljYXNlIFNNUF9QSFlXQUlUX1BIWURPV046CisJCQkvKiBIYXMgdGhlIGRldmljZSBnb25lIGF3YXk/ICovCisJCQlpZiAoIWF0dGFjaGVkX2RldmljZV90eXBlKQorCQkJCXBoeV9zdGF0ZSA9IFNNUF9QSFlXQUlUX1BIWVVQOworCisJCQlicmVhazsKKworCQljYXNlIFNNUF9QSFlXQUlUX1BIWVVQOgorCQkJLyogSGFzIHRoZSBkZXZpY2UgY29tZSBiYWNrPyAqLworCQkJaWYgKGF0dGFjaGVkX2RldmljZV90eXBlKQorCQkJCXBoeV9zdGF0ZSA9IFNNUF9QSFlXQUlUX0RPTkU7CisJCQlicmVhazsKKworCQljYXNlIFNNUF9QSFlXQUlUX0RPTkU6CisJCQlicmVhazsKKwkJfQorCisJfQorCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogZG9uZVxuIiwgIF9fZnVuY19fKTsKK30KKworc3RhdGljIGludCBpc2NpX3Jlc2V0X2RldmljZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKKwkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKK3sKKwlzdHJ1Y3Qgc2FzX3BoeSAqcGh5ID0gc2FzX2ZpbmRfbG9jYWxfcGh5KGlkZXYtPmRvbWFpbl9kZXYpOworCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gaWRldi0+aXNjaV9wb3J0OworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGlkZXYgJXBcbiIsIF9fZnVuY19fLCBpZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXQoaWRldik7CisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0KCVwKSByZXR1cm5lZCAlZCFcbiIsCisJCQkgX19mdW5jX18sIGlkZXYsIHN0YXR1cyk7CisKKwkJcmV0dXJuIFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBNYWtlIHN1cmUgYWxsIHBlbmRpbmcgcmVxdWVzdHMgYXJlIGFibGUgdG8gYmUgZnVsbHkgdGVybWluYXRlZC4gKi8KKwlpc2NpX2RldmljZV9jbGVhcl9yZXNldF9wZW5kaW5nKGlob3N0LCBpZGV2KTsKKworCS8qIElmIHRoaXMgaXMgYSBkZXZpY2Ugb24gYW4gZXhwYW5kZXIsIGRpc2FibGUgQkNOIHByb2Nlc3NpbmcuICovCisJaWYgKCFzY3NpX2lzX3Nhc19waHlfbG9jYWwocGh5KSkKKwkJc2V0X2JpdChJUE9SVF9CQ05fQkxPQ0tFRCwgJmlwb3J0LT5mbGFncyk7CisKKwlyYyA9IHNhc19waHlfcmVzZXQocGh5LCB0cnVlKTsKKworCS8qIFRlcm1pbmF0ZSBpbi1wcm9ncmVzcyBJL08gbm93LiAqLworCWlzY2lfcmVtb3RlX2RldmljZV9udWtlX3JlcXVlc3RzKGlob3N0LCBpZGV2KTsKKworCS8qIFNpbmNlIGFsbCBwZW5kaW5nIFRDcyBoYXZlIGJlZW4gY2xlYW5lZCwgcmVzdW1lIHRoZSBSTkMuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSBzY2lfcmVtb3RlX2RldmljZV9yZXNldF9jb21wbGV0ZShpZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB0aGlzIGlzIGEgZGV2aWNlIG9uIGFuIGV4cGFuZGVyLCBicmluZyB0aGUgcGh5IGJhY2sgdXAuICovCisJaWYgKCFzY3NpX2lzX3Nhc19waHlfbG9jYWwocGh5KSkgeworCQkvKiBBIHBoeSByZXNldCB3aWxsIGNhdXNlIHRoZSBkZXZpY2UgdG8gZ28gYXdheSB0aGVuIHJlYXBwZWFyLgorCQkgKiBTaW5jZSBsaWJzYXMgd2lsbCB0YWtlIGFjdGlvbiBvbiBpbmNvbWluZyBCQ05zIChlZy4gcmVtb3ZlCisJCSAqIGEgZGV2aWNlIGdvaW5nIHRocm91Z2ggYW4gU01QIHBoeS1jb250cm9sIGRyaXZlbiByZXNldCksCisJCSAqIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgcGh5IGNvbWVzIGJhY2sgdXAgYmVmb3JlIGxldHRpbmcKKwkJICogZGlzY292ZXJ5IHByb2NlZWQgaW4gbGlic2FzLgorCQkgKi8KKwkJaXNjaV93YWl0X2Zvcl9zbXBfcGh5X3Jlc2V0KGlkZXYsIHBoeS0+bnVtYmVyKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQlpc2NpX3BvcnRfYmNuX2VuYWJsZShpaG9zdCwgaWRldi0+aXNjaV9wb3J0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCX0KKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCSAiJXM6IHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0X2NvbXBsZXRlKCVwKSAiCisJCQkgInJldHVybmVkICVkIVxuIiwgX19mdW5jX18sIGlkZXYsIHN0YXR1cyk7CisJfQorCisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiBpZGV2ICVwIGNvbXBsZXRlLlxuIiwgX19mdW5jX18sIGlkZXYpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgaXNjaV90YXNrX0lfVF9uZXh1c19yZXNldChzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gZGV2X3RvX2lob3N0KGRldik7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCWlkZXYgPSBpc2NpX2xvb2t1cF9kZXZpY2UoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAoIWlkZXYgfHwgIXRlc3RfYml0KElERVZfRUgsICZpZGV2LT5mbGFncykpIHsKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gaXNjaV9yZXNldF9kZXZpY2UoaWhvc3QsIGlkZXYpOworIG91dDoKKwlpc2NpX3B1dF9kZXZpY2UoaWRldik7CisJcmV0dXJuIHJldDsKK30KKworaW50IGlzY2lfYnVzX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBzZGV2X3RvX2RvbWFpbl9kZXYoY21kLT5kZXZpY2UpOworCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gZGV2X3RvX2lob3N0KGRldik7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCWlkZXYgPSBpc2NpX2xvb2t1cF9kZXZpY2UoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwlpZiAoIWlkZXYpIHsKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gaXNjaV9yZXNldF9kZXZpY2UoaWhvc3QsIGlkZXYpOworIG91dDoKKwlpc2NpX3B1dF9kZXZpY2UoaWRldik7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTdmYTkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5oCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfSVNDSV9UQVNLX0hfCisjZGVmaW5lIF9JU0NJX1RBU0tfSF8KKworI2luY2x1ZGUgPHNjc2kvc2FzX2F0YS5oPgorI2luY2x1ZGUgImhvc3QuaCIKKworc3RydWN0IGlzY2lfcmVxdWVzdDsKKworLyoqCisgKiBlbnVtIGlzY2lfdG1mX2NiX3N0YXRlIC0gVGhpcyBlbnVtIGRlZmluZXMgdGhlIHBvc3NpYmxlIHN0YXRlcyBpbiB3aGljaCB0aGUKKyAqICAgIFRNRiBjYWxsYmFjayBmdW5jdGlvbiBpcyBpbnZva2VkIGR1cmluZyB0aGUgVE1GIGV4ZWN1dGlvbiBwcm9jZXNzLgorICoKKyAqCisgKi8KK2VudW0gaXNjaV90bWZfY2Jfc3RhdGUgeworCisJaXNjaV90bWZfaW5pdF9zdGF0ZSA9IDAsCisJaXNjaV90bWZfc3RhcnRlZCwKKwlpc2NpX3RtZl90aW1lZF9vdXQKK307CisKKy8qKgorICogZW51bSBpc2NpX3RtZl9mdW5jdGlvbl9jb2RlcyAtIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBwb3NzaWJsZSBwcmVwYXJhdGlvbnMKKyAqICAgIG9mIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0cy4KKyAqCisgKgorICovCitlbnVtIGlzY2lfdG1mX2Z1bmN0aW9uX2NvZGVzIHsKKworCWlzY2lfdG1mX2Z1bmNfbm9uZSAgICAgID0gMCwKKwlpc2NpX3RtZl9zc3BfdGFza19hYm9ydCA9IFRNRl9BQk9SVF9UQVNLLAorCWlzY2lfdG1mX3NzcF9sdW5fcmVzZXQgID0gVE1GX0xVX1JFU0VULAorCWlzY2lfdG1mX3NhdGFfc3JzdF9oaWdoID0gVE1GX0xVX1JFU0VUICsgMHgxMDAsIC8qIE5vbiBTQ1NJICovCisJaXNjaV90bWZfc2F0YV9zcnN0X2xvdyAgPSBUTUZfTFVfUkVTRVQgKyAweDEwMSAgLyogTm9uIFNDU0kgKi8KK307CisvKioKKyAqIHN0cnVjdCBpc2NpX3RtZiAtIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgdGFzayBtYW5hZ2VtZW50IG9iamVjdCB3aGljaAorICogICAgYWN0cyBhcyBhbiBpbnRlcmZhY2UgdG8gbGlic2FzIGZvciBwcm9jZXNzaW5nIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0cworICoKKyAqCisgKi8KK3N0cnVjdCBpc2NpX3RtZiB7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGU7CisJZW51bSBzYXNfcHJvdG9jb2wgcHJvdG87CisJdW5pb24geworCQlzdHJ1Y3Qgc3NwX3Jlc3BvbnNlX2l1IHJlc3BfaXU7CisJCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgZDJoX2ZpczsKKwkJdTggcnNwX2J1ZltTU1BfUkVTUF9JVV9NQVhfU0laRV07CisJfSByZXNwOworCXVuc2lnbmVkIGNoYXIgbHVuWzhdOworCXUxNiBpb190YWc7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqZGV2aWNlOworCWVudW0gaXNjaV90bWZfZnVuY3Rpb25fY29kZXMgdG1mX2NvZGU7CisJaW50IHN0YXR1czsKKworCS8qIFRoZSBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiBhbGxvd3MgdGhlIHVzZXIgcHJvY2VzcyB0bworCSAqIHRyYWNrIHRoZSBUTUYgdHJhbnNtaXQgLyB0aW1lb3V0IGNvbmRpdGlvbnMuCisJICovCisJdm9pZCAoKmNiX3N0YXRlX2Z1bmMpKAorCQllbnVtIGlzY2lfdG1mX2NiX3N0YXRlLAorCQlzdHJ1Y3QgaXNjaV90bWYgKiwgdm9pZCAqKTsKKwl2b2lkICpjYl9kYXRhOworCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgaXNjaV9wcmludF90bWYoc3RydWN0IGlzY2lfdG1mICp0bWYpCit7CisJaWYgKFNBU19QUk9UT0NPTF9TQVRBID09IHRtZi0+cHJvdG8pCisJCWRldl9kYmcoJnRtZi0+ZGV2aWNlLT5pc2NpX3BvcnQtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBzdGF0dXMgPSAleFxuIgorCQkJInRtZi0+cmVzcC5kMmhfZmlzLnN0YXR1cyA9ICV4XG4iCisJCQkidG1mLT5yZXNwLmQyaF9maXMuZXJyb3IgPSAleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJdG1mLT5zdGF0dXMsCisJCQl0bWYtPnJlc3AuZDJoX2Zpcy5zdGF0dXMsCisJCQl0bWYtPnJlc3AuZDJoX2Zpcy5lcnJvcik7CisJZWxzZQorCQlkZXZfZGJnKCZ0bWYtPmRldmljZS0+aXNjaV9wb3J0LT5pc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogc3RhdHVzID0gJXhcbiIKKwkJCSJ0bWYtPnJlc3AucmVzcF9pdS5kYXRhX3ByZXNlbnQgPSAleFxuIgorCQkJInRtZi0+cmVzcC5yZXNwX2l1LnN0YXR1cyA9ICV4XG4iCisJCQkidG1mLT5yZXNwLnJlc3BfaXUuZGF0YV9sZW5ndGggPSAleFxuIgorCQkJInRtZi0+cmVzcC5yZXNwX2l1LmRhdGFbMF0gPSAleFxuIgorCQkJInRtZi0+cmVzcC5yZXNwX2l1LmRhdGFbMV0gPSAleFxuIgorCQkJInRtZi0+cmVzcC5yZXNwX2l1LmRhdGFbMl0gPSAleFxuIgorCQkJInRtZi0+cmVzcC5yZXNwX2l1LmRhdGFbM10gPSAleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJdG1mLT5zdGF0dXMsCisJCQl0bWYtPnJlc3AucmVzcF9pdS5kYXRhcHJlcywKKwkJCXRtZi0+cmVzcC5yZXNwX2l1LnN0YXR1cywKKwkJCWJlMzJfdG9fY3B1KHRtZi0+cmVzcC5yZXNwX2l1LnJlc3BvbnNlX2RhdGFfbGVuKSwKKwkJCXRtZi0+cmVzcC5yZXNwX2l1LnJlc3BfZGF0YVswXSwKKwkJCXRtZi0+cmVzcC5yZXNwX2l1LnJlc3BfZGF0YVsxXSwKKwkJCXRtZi0+cmVzcC5yZXNwX2l1LnJlc3BfZGF0YVsyXSwKKwkJCXRtZi0+cmVzcC5yZXNwX2l1LnJlc3BfZGF0YVszXSk7Cit9CisKKworaW50IGlzY2lfdGFza19leGVjdXRlX3Rhc2soCisJc3RydWN0IHNhc190YXNrICp0YXNrLAorCWludCBudW0sCisJZ2ZwX3QgZ2ZwX2ZsYWdzKTsKKworaW50IGlzY2lfdGFza19hYm9ydF90YXNrKAorCXN0cnVjdCBzYXNfdGFzayAqdGFzayk7CisKK2ludCBpc2NpX3Rhc2tfYWJvcnRfdGFza19zZXQoCisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRfZGV2aWNlLAorCXU4ICpsdW4pOworCitpbnQgaXNjaV90YXNrX2NsZWFyX2FjYSgKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZF9kZXZpY2UsCisJdTggKmx1bik7CisKK2ludCBpc2NpX3Rhc2tfY2xlYXJfdGFza19zZXQoCisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRfZGV2aWNlLAorCXU4ICpsdW4pOworCitpbnQgaXNjaV90YXNrX3F1ZXJ5X3Rhc2soCisJc3RydWN0IHNhc190YXNrICp0YXNrKTsKKworaW50IGlzY2lfdGFza19sdV9yZXNldCgKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZF9kZXZpY2UsCisJdTggKmx1bik7CisKK2ludCBpc2NpX3Rhc2tfY2xlYXJfbmV4dXNfcG9ydCgKKwlzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0KTsKKworaW50IGlzY2lfdGFza19jbGVhcl9uZXh1c19oYSgKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqaGEpOworCitpbnQgaXNjaV90YXNrX0lfVF9uZXh1c19yZXNldCgKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZF9kZXZpY2UpOworCit2b2lkIGlzY2lfdGFza19yZXF1ZXN0X2NvbXBsZXRlKAorCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0LAorCWVudW0gc2NpX3Rhc2tfc3RhdHVzIGNvbXBsZXRpb25fc3RhdHVzKTsKKwordTE2IGlzY2lfdGFza19zc3BfcmVxdWVzdF9nZXRfaW9fdGFnX3RvX21hbmFnZSgKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0KTsKKwordTggaXNjaV90YXNrX3NzcF9yZXF1ZXN0X2dldF9mdW5jdGlvbigKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0KTsKKworCit2b2lkICppc2NpX3Rhc2tfc3NwX3JlcXVlc3RfZ2V0X3Jlc3BvbnNlX2RhdGFfYWRkcmVzcygKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICpyZXF1ZXN0KTsKKwordTMyIGlzY2lfdGFza19zc3BfcmVxdWVzdF9nZXRfcmVzcG9uc2VfZGF0YV9sZW5ndGgoCisJc3RydWN0IGlzY2lfcmVxdWVzdCAqcmVxdWVzdCk7CisKK2ludCBpc2NpX3F1ZXVlY29tbWFuZCgKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZCwKKwl2b2lkICgqZG9uZWZ1bmMpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworCitpbnQgaXNjaV9idXNfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworCisvKioKKyAqIGVudW0gaXNjaV9jb21wbGV0aW9uX3NlbGVjdGlvbiAtIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBwb3NzaWJsZSBhY3Rpb25zIHRvCisgKiAgICB0YWtlIHdpdGggcmVzcGVjdCB0byBhIGdpdmVuIHJlcXVlc3QncyBub3RpZmljYXRpb24gYmFjayB0byBsaWJzYXMuCisgKgorICoKKyAqLworZW51bSBpc2NpX2NvbXBsZXRpb25fc2VsZWN0aW9uIHsKKworCWlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbiwgICAgICAvKiBOb3JtYWwgbm90aWZ5ICh0YXNrX2RvbmUpICovCisJaXNjaV9wZXJmb3JtX2Fib3J0ZWRfaW9fY29tcGxldGlvbiwgICAgIC8qIE5vIG5vdGlmaWNhdGlvbi4gICAqLworCWlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uICAgICAgICAvKiBVc2Ugc2FzX3Rhc2tfYWJvcnQgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2NpX3NldF90YXNrX2RvbmVmbGFncygKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJLyogU2luY2Ugbm8gZnV0aGVyIGFjdGlvbiB3aWxsIGJlIHRha2VuIG9uIHRoaXMgdGFzaywKKwkgKiBtYWtlIHN1cmUgdG8gbWFyayBpdCBjb21wbGV0ZSBmcm9tIHRoZSBsbGRkIHBlcnNwZWN0aXZlLgorCSAqLworCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfU1RBVEVfRE9ORTsKKwl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19BVF9JTklUSUFUT1I7CisJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfU1RBVEVfUEVORElORzsKK30KKy8qKgorICogaXNjaV90YXNrX2FsbF9kb25lKCkgLSBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgdGFzayBiaXRzIHRvIGluZGljYXRlIHRoZQorICogICAgTExERCBpcyBkb25lIHdpdGggdGhlIHRhc2suCisgKgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlzY2lfdGFza19hbGxfZG9uZSgKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFNpbmNlIG5vIGZ1dGhlciBhY3Rpb24gd2lsbCBiZSB0YWtlbiBvbiB0aGlzIHRhc2ssCisJICogbWFrZSBzdXJlIHRvIG1hcmsgaXQgY29tcGxldGUgZnJvbSB0aGUgbGxkZCBwZXJzcGVjdGl2ZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJaXNjaV9zZXRfdGFza19kb25lZmxhZ3ModGFzayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogaXNjaV90YXNrX3NldF9jb21wbGV0aW9uX3N0YXR1cygpIC0gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBjb21wbGV0aW9uIHN0YXR1cworICogICAgZm9yIHRoZSByZXF1ZXN0LgorICogQHRhc2s6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBjb21wbGV0ZWQgcmVxdWVzdC4KKyAqIEByZXNwb25zZTogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIHJlc3BvbnNlIGNvZGUgZm9yIHRoZSBjb21wbGV0ZWQgdGFzay4KKyAqIEBzdGF0dXM6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBzdGF0dXMgY29kZSBmb3IgdGhlIGNvbXBsZXRlZCB0YXNrLgorICoKKyogQHJldHVybiBUaGUgbmV3IG5vdGlmaWNhdGlvbiBtb2RlIGZvciB0aGUgcmVxdWVzdC4KKyovCitzdGF0aWMgaW5saW5lIGVudW0gaXNjaV9jb21wbGV0aW9uX3NlbGVjdGlvbgoraXNjaV90YXNrX3NldF9jb21wbGV0aW9uX3N0YXR1cygKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssCisJZW51bSBzZXJ2aWNlX3Jlc3BvbnNlIHJlc3BvbnNlLAorCWVudW0gZXhlY19zdGF0dXMgc3RhdHVzLAorCWVudW0gaXNjaV9jb21wbGV0aW9uX3NlbGVjdGlvbiB0YXNrX25vdGlmaWNhdGlvbl9zZWxlY3Rpb24pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCS8qIElmIGEgZGV2aWNlIHJlc2V0IGlzIGJlaW5nIGluZGljYXRlZCwgbWFrZSBzdXJlIHRoZSBJL08KKwkqIGlzIGluIHRoZSBlcnJvciBwYXRoLgorCSovCisJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19ORUVEX0RFVl9SRVNFVCkgeworCQkvKiBGYWlsIHRoZSBJL08gdG8gbWFrZSBzdXJlIGl0IGdvZXMgaW50byB0aGUgZXJyb3IgcGF0aC4gKi8KKwkJcmVzcG9uc2UgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKwkJc3RhdHVzID0gU0FNX1NUQVRfVEFTS19BQk9SVEVEOworCisJCXRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbiA9IGlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOworCX0KKwl0YXNrLT50YXNrX3N0YXR1cy5yZXNwID0gcmVzcG9uc2U7CisJdGFzay0+dGFza19zdGF0dXMuc3RhdCA9IHN0YXR1czsKKworCXN3aXRjaCAodGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uKSB7CisKKwljYXNlIGlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOgorCisJCWlmICh0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVApIHsKKwkJCS8qIFRoZXJlIGlzIG5vIGVycm9yIGVzY2FsYXRpb24gaW4gdGhlIFNNUCBjYXNlLgorCQkJICogQ29udmVydCB0byBhIG5vcm1hbCBjb21wbGV0aW9uIHRvIGF2b2lkIHRoZQorCQkJICogdGltZW91dCBpbiB0aGUgZGlzY292ZXJ5IHBhdGggYW5kIHRvIGxldCB0aGUKKwkJCSAqIG5leHQgYWN0aW9uIHRha2UgcGxhY2UgcXVpY2tseS4KKwkJCSAqLworCQkJdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uCisJCQkJPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisKKwkJCS8qIEZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIGNhc2UuLi4gKi8KKwkJfSBlbHNlIHsKKwkJCS8qIFVzZSBzYXNfdGFza19hYm9ydCAqLworCQkJLyogTGVhdmUgU0FTX1RBU0tfU1RBVEVfRE9ORSBjbGVhcgorCQkJICogTGVhdmUgU0FTX1RBU0tfQVRfSU5JVElBVE9SIHNldC4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgaXNjaV9wZXJmb3JtX2Fib3J0ZWRfaW9fY29tcGxldGlvbjoKKwkJLyogVGhpcyBwYXRoIGNhbiBvY2N1ciB3aXRoIHRhc2stbWFuYWdlZCByZXF1ZXN0cyBhcyB3ZWxsIGFzCisJCSAqIHJlcXVlc3RzIHRlcm1pbmF0ZWQgYmVjYXVzZSBvZiBMVU4gb3IgZGV2aWNlIHJlc2V0cy4KKwkJICovCisJCS8qIEZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIGNhc2UuLi4gKi8KKwljYXNlIGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjoKKwkJLyogTm9ybWFsIG5vdGlmaWNhdGlvbiAodGFza19kb25lKSAqLworCQlpc2NpX3NldF90YXNrX2RvbmVmbGFncyh0YXNrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTkNFKDEsICJ1bmtub3duIHRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbjogJWRcbiIsCisJCQkgdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uOworCit9CisvKioKKyogaXNjaV9leGVjcGF0aF9jYWxsYmFjaygpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgdGFzaworKiBleGVjdXRlIHBhdGggd2hlbiB0aGUgdGFzayBuZWVkcyB0byBjYWxsYmFjayBsaWJzYXMgYWJvdXQgdGhlIHN1Ym1pdC10aW1lCisqIHRhc2sgZmFpbHVyZS4gIFRoZSBjYWxsYmFjayBvY2N1cnMgZWl0aGVyIHRocm91Z2ggdGhlIHRhc2sncyBkb25lIGZ1bmN0aW9uCisqIG9yIHRocm91Z2ggc2FzX3Rhc2tfYWJvcnQuICBJbiB0aGUgY2FzZSBvZiByZWd1bGFyIG5vbi1kaXNjb3ZlcnkgU0FUQS9TVFAgSS9PCisqIHJlcXVlc3RzLCBsaWJzYXMgdGFrZXMgdGhlIGhvc3QgbG9jayBiZWZvcmUgY2FsbGluZyBleGVjdXRlIHRhc2suICBUaGVyZWZvcmUKKyogaW4gdGhpcyBzaXR1YXRpb24gdGhlIGhvc3QgbG9jayBtdXN0IGJlIG1hbmFnZWQgYmVmb3JlIGNhbGxpbmcgdGhlIGZ1bmMuCisqCisqIEBpaG9zdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGNvbnRyb2xsZXIgdG8gd2hpY2ggdGhlIEkvTyByZXF1ZXN0IHdhcyBzZW50LgorKiBAdGFzazogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIEkvTyByZXF1ZXN0LgorKiBAZnVuYzogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW4gdGhlIGNvcnJlY3QgY29udGV4dC4KKyogQHN0YXR1czogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIHN0YXR1cyBjb2RlIGZvciB0aGUgY29tcGxldGVkIHRhc2suCisqCisqLworc3RhdGljIGlubGluZSB2b2lkIGlzY2lfZXhlY3BhdGhfY2FsbGJhY2soc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCisJCQkJCSAgc3RydWN0IHNhc190YXNrICAqdGFzaywKKwkJCQkJICB2b2lkICgqZnVuYykoc3RydWN0IHNhc190YXNrICopKQoreworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSB0YXNrLT5kZXY7CisKKwlpZiAoZGV2X2lzX3NhdGEoZGV2KSAmJiB0YXNrLT51bGRkX3Rhc2spIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkvKiBTaW5jZSB3ZSBhcmUgc3RpbGwgaW4gdGhlIHN1Ym1pdCBwYXRoLCBhbmQgc2luY2UKKwkJICogbGlic2FzIHRha2VzIHRoZSBob3N0IGxvY2sgb24gYmVoYWxmIG9mIFNBVEEKKwkJICogZGV2aWNlcyBiZWZvcmUgSS9PIHN0YXJ0cyAoaW4gdGhlIG5vbi1kaXNjb3ZlcnkgY2FzZSksCisJCSAqIHdlIG5lZWQgdG8gdW5sb2NrIGJlZm9yZSB3ZSBjYW4gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCisJCSAqLworCQlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlzcGluX3VubG9jayhkZXYtPnNhdGFfZGV2LmFwLT5sb2NrKTsKKwkJZnVuYyh0YXNrKTsKKwkJc3Bpbl9sb2NrKGRldi0+c2F0YV9kZXYuYXAtPmxvY2spOworCQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0gZWxzZQorCQlmdW5jKHRhc2spOworfQorI2VuZGlmIC8qICFkZWZpbmVkKF9TQ0lfVEFTS19IXykgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWUxZTJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbC5jCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgInVuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJyZWdpc3RlcnMuaCIKKworaW50IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2NvbnN0cnVjdChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgKnVmX2NvbnRyb2wgPSAmaWhvc3QtPnVmX2NvbnRyb2w7CisJc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZSAqdWY7CisJdTMyIGJ1Zl9sZW4sIGhlYWRlcl9sZW4sIGk7CisJZG1hX2FkZHJfdCBkbWE7CisJc2l6ZV90IHNpemU7CisJdm9pZCAqdmlydDsKKworCS8qCisJICogUHJlcGFyZSBhbGwgb2YgdGhlIG1lbW9yeSBzaXplcyBmb3IgdGhlIFVGIGhlYWRlcnMsIFVGIGFkZHJlc3MKKwkgKiB0YWJsZSwgYW5kIFVGIGJ1ZmZlcnMgdGhlbXNlbHZlcy4KKwkgKi8KKwlidWZfbGVuID0gU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMgKiBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfQlVGRkVSX1NJWkU7CisJaGVhZGVyX2xlbiA9IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTICogc2l6ZW9mKHN0cnVjdCBzY3VfdW5zb2xpY2l0ZWRfZnJhbWVfaGVhZGVyKTsKKwlzaXplID0gYnVmX2xlbiArIGhlYWRlcl9sZW4gKyBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyAqIHNpemVvZihkbWFfYWRkcl90KTsKKworCS8qCisJICogVGhlIFVuc29saWNpdGVkIEZyYW1lIGJ1ZmZlcnMgYXJlIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIFVGCisJICogbWVtb3J5IGRlc2NyaXB0b3IgZW50cnkuIFRoZSBoZWFkZXJzIGFuZCBhZGRyZXNzIHRhYmxlIHdpbGwgYmUKKwkgKiBwbGFjZWQgYWZ0ZXIgdGhlIGJ1ZmZlcnMuCisJICovCisJdmlydCA9IGRtYW1fYWxsb2NfY29oZXJlbnQoJmlob3N0LT5wZGV2LT5kZXYsIHNpemUsICZkbWEsIEdGUF9LRVJORUwpOworCWlmICghdmlydCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFByb2dyYW0gdGhlIGxvY2F0aW9uIG9mIHRoZSBVRiBoZWFkZXIgdGFibGUgaW50byB0aGUgU0NVLgorCSAqIE5vdGVzOgorCSAqIC0gVGhlIGFkZHJlc3MgbXVzdCBhbGlnbiBvbiBhIDY0LWJ5dGUgYm91bmRhcnkuIEd1YXJhbnRlZWQgdG8gYmUKKwkgKiAgIG9uIDY0LWJ5dGUgYm91bmRhcnkgYWxyZWFkeSAxS0IgYm91bmRhcnkgZm9yIHVuc29saWNpdGVkIGZyYW1lcy4KKwkgKiAtIFByb2dyYW0gdW51c2VkIGhlYWRlciBlbnRyaWVzIHRvIG92ZXJsYXAgd2l0aCB0aGUgbGFzdAorCSAqICAgdW5zb2xpY2l0ZWQgZnJhbWUuICBUaGUgc2lsaWNvbiB3aWxsIG5ldmVyIERNQSB0byB0aGVzZSB1bnVzZWQKKwkgKiAgIGhlYWRlcnMsIHNpbmNlIHdlIHByb2dyYW0gdGhlIFVGIGFkZHJlc3MgdGFibGUgcG9pbnRlcnMgdG8KKwkgKiAgIE5VTEwuCisJICovCisJdWZfY29udHJvbC0+aGVhZGVycy5waHlzaWNhbF9hZGRyZXNzID0gZG1hICsgYnVmX2xlbjsKKwl1Zl9jb250cm9sLT5oZWFkZXJzLmFycmF5ID0gdmlydCArIGJ1Zl9sZW47CisKKwkvKgorCSAqIFByb2dyYW0gdGhlIGxvY2F0aW9uIG9mIHRoZSBVRiBhZGRyZXNzIHRhYmxlIGludG8gdGhlIFNDVS4KKwkgKiBOb3RlczoKKwkgKiAtIFRoZSBhZGRyZXNzIG11c3QgYWxpZ24gb24gYSA2NC1iaXQgYm91bmRhcnkuIEd1YXJhbnRlZWQgdG8gYmUgb24gNjQKKwkgKiAgIGJ5dGUgYm91bmRhcnkgYWxyZWFkeSBkdWUgdG8gYWJvdmUgcHJvZ3JhbW1pbmcgaGVhZGVycyBiZWluZyBvbiBhCisJICogICA2NC1iaXQgYm91bmRhcnkgYW5kIGhlYWRlcnMgYXJlIG9uIGEgNjQtYnl0ZXMgaW4gc2l6ZS4KKwkgKi8KKwl1Zl9jb250cm9sLT5hZGRyZXNzX3RhYmxlLnBoeXNpY2FsX2FkZHJlc3MgPSBkbWEgKyBidWZfbGVuICsgaGVhZGVyX2xlbjsKKwl1Zl9jb250cm9sLT5hZGRyZXNzX3RhYmxlLmFycmF5ID0gdmlydCArIGJ1Zl9sZW4gKyBoZWFkZXJfbGVuOworCXVmX2NvbnRyb2wtPmdldCA9IDA7CisKKwkvKgorCSAqIFVGIGJ1ZmZlciByZXF1aXJlbWVudHMgYXJlOgorCSAqIC0gVGhlIGxhc3QgZW50cnkgaW4gdGhlIFVGIHF1ZXVlIGlzIG5vdCBOVUxMLgorCSAqIC0gVGhlcmUgaXMgYSBwb3dlciBvZiAyIG51bWJlciBvZiBlbnRyaWVzIChOVUxMIG9yIG5vdC1OVUxMKQorCSAqICAgcHJvZ3JhbW1lZCBpbnRvIHRoZSBxdWV1ZS4KKwkgKiAtIEFsaWduZWQgb24gYSAxS0IgYm91bmRhcnkuICovCisKKwkvKgorCSAqIFByb2dyYW0gdGhlIGFjdHVhbCB1c2VkIFVGIGJ1ZmZlcnMgaW50byB0aGUgVUYgYWRkcmVzcyB0YWJsZSBhbmQKKwkgKiB0aGUgY29udHJvbGxlcidzIGFycmF5IG9mIFVGcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVM7IGkrKykgeworCQl1ZiA9ICZ1Zl9jb250cm9sLT5idWZmZXJzLmFycmF5W2ldOworCisJCXVmX2NvbnRyb2wtPmFkZHJlc3NfdGFibGUuYXJyYXlbaV0gPSBkbWE7CisKKwkJdWYtPmJ1ZmZlciA9IHZpcnQ7CisJCXVmLT5oZWFkZXIgPSAmdWZfY29udHJvbC0+aGVhZGVycy5hcnJheVtpXTsKKwkJdWYtPnN0YXRlICA9IFVOU09MSUNJVEVEX0ZSQU1FX0VNUFRZOworCisJCS8qCisJCSAqIEluY3JlbWVudCB0aGUgYWRkcmVzcyBvZiB0aGUgcGh5c2ljYWwgYW5kIHZpcnR1YWwgbWVtb3J5CisJCSAqIHBvaW50ZXJzLiBFdmVyeXRoaW5nIGlzIGFsaWduZWQgb24gMWsgYm91bmRhcnkgd2l0aCBhbgorCQkgKiBpbmNyZW1lbnQgb2YgMWsuCisJCSAqLworCQl2aXJ0ICs9IFNDVV9VTlNPTElDSVRFRF9GUkFNRV9CVUZGRVJfU0laRTsKKwkJZG1hICs9IFNDVV9VTlNPTElDSVRFRF9GUkFNRV9CVUZGRVJfU0laRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworZW51bSBzY2lfc3RhdHVzIHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sICp1Zl9jb250cm9sLAorCQkJCQkJCSB1MzIgZnJhbWVfaW5kZXgsCisJCQkJCQkJIHZvaWQgKipmcmFtZV9oZWFkZXIpCit7CisJaWYgKGZyYW1lX2luZGV4IDwgU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMpIHsKKwkJLyogU2tpcCB0aGUgZmlyc3Qgd29yZCBpbiB0aGUgZnJhbWUgc2luY2UgdGhpcyBpcyBhIGNvbnRyb2xsIHdvcmQgdXNlZAorCQkgKiBieSB0aGUgaGFyZHdhcmUuCisJCSAqLworCQkqZnJhbWVfaGVhZGVyID0gJnVmX2NvbnRyb2wtPmJ1ZmZlcnMuYXJyYXlbZnJhbWVfaW5kZXhdLmhlYWRlci0+ZGF0YTsKKworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFOworfQorCitlbnVtIHNjaV9zdGF0dXMgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcihzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgKnVmX2NvbnRyb2wsCisJCQkJCQkJIHUzMiBmcmFtZV9pbmRleCwKKwkJCQkJCQkgdm9pZCAqKmZyYW1lX2J1ZmZlcikKK3sKKwlpZiAoZnJhbWVfaW5kZXggPCBTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUykgeworCQkqZnJhbWVfYnVmZmVyID0gdWZfY29udHJvbC0+YnVmZmVycy5hcnJheVtmcmFtZV9pbmRleF0uYnVmZmVyOworCisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gU0NJX0ZBSUxVUkVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUU7Cit9CisKK2Jvb2wgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfcmVsZWFzZV9mcmFtZShzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgKnVmX2NvbnRyb2wsCisJCQkJCQkgdTMyIGZyYW1lX2luZGV4KQoreworCXUzMiBmcmFtZV9nZXQ7CisJdTMyIGZyYW1lX2N5Y2xlOworCisJZnJhbWVfZ2V0ICAgPSB1Zl9jb250cm9sLT5nZXQgJiAoU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMgLSAxKTsKKwlmcmFtZV9jeWNsZSA9IHVmX2NvbnRyb2wtPmdldCAmIFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTOworCisJLyoKKwkgKiBJbiB0aGUgZXZlbnQgdGhlcmUgYXJlIE5VTEwgZW50cmllcyBpbiB0aGUgVUYgdGFibGUsIHdlIG5lZWQgdG8KKwkgKiBhZHZhbmNlIHRoZSBnZXQgcG9pbnRlciBpbiBvcmRlciB0byBmaW5kIG91dCBpZiB0aGlzIGZyYW1lIHNob3VsZAorCSAqIGJlIHJlbGVhc2VkIChpLmUuIHVwZGF0ZSB0aGUgZ2V0IHBvaW50ZXIpCisJICovCisJd2hpbGUgKGxvd2VyXzMyX2JpdHModWZfY29udHJvbC0+YWRkcmVzc190YWJsZS5hcnJheVtmcmFtZV9nZXRdKSA9PSAwICYmCisJICAgICAgIHVwcGVyXzMyX2JpdHModWZfY29udHJvbC0+YWRkcmVzc190YWJsZS5hcnJheVtmcmFtZV9nZXRdKSA9PSAwICYmCisJICAgICAgIGZyYW1lX2dldCA8IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTKQorCQlmcmFtZV9nZXQrKzsKKworCS8qCisJICogVGhlIHRhYmxlIGhhcyBhIE5VTEwgZW50cnkgYXMgaXQncyBsYXN0IGVsZW1lbnQuICBUaGlzIGlzCisJICogaWxsZWdhbC4KKwkgKi8KKwlCVUdfT04oZnJhbWVfZ2V0ID49IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTKTsKKwlpZiAoZnJhbWVfaW5kZXggPj0gU0NVX01BWF9VTlNPTElDSVRFRF9GUkFNRVMpCisJCXJldHVybiBmYWxzZTsKKworCXVmX2NvbnRyb2wtPmJ1ZmZlcnMuYXJyYXlbZnJhbWVfaW5kZXhdLnN0YXRlID0gVU5TT0xJQ0lURURfRlJBTUVfUkVMRUFTRUQ7CisKKwlpZiAoZnJhbWVfZ2V0ICE9IGZyYW1lX2luZGV4KSB7CisJCS8qCisJCSAqIEZyYW1lcyByZW1haW4gaW4gdXNlIHVudGlsIHdlIGFkdmFuY2UgdGhlIGdldCBwb2ludGVyCisJCSAqIHNvIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUKKwkJICovCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIFRoZSBmcmFtZSBpbmRleCBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBnZXQgcG9pbnRlciBzbyB3ZQorCSAqIGNhbiBub3cgZnJlZSB1cCBhbGwgb2YgdGhlIGZyYW1lIGVudHJpZXMgdGhhdAorCSAqLworCXdoaWxlICh1Zl9jb250cm9sLT5idWZmZXJzLmFycmF5W2ZyYW1lX2dldF0uc3RhdGUgPT0gVU5TT0xJQ0lURURfRlJBTUVfUkVMRUFTRUQpIHsKKwkJdWZfY29udHJvbC0+YnVmZmVycy5hcnJheVtmcmFtZV9nZXRdLnN0YXRlID0gVU5TT0xJQ0lURURfRlJBTUVfRU1QVFk7CisKKwkJaWYgKGZyYW1lX2dldCsxID09IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTLTEpIHsKKwkJCWZyYW1lX2N5Y2xlIF49IFNDVV9NQVhfVU5TT0xJQ0lURURfRlJBTUVTOworCQkJZnJhbWVfZ2V0ID0gMDsKKwkJfSBlbHNlCisJCQlmcmFtZV9nZXQrKzsKKwl9CisKKwl1Zl9jb250cm9sLT5nZXQgPSBTQ1VfVUZRR1BfR0VOX0JJVChFTkFCTEVfQklUKSB8IGZyYW1lX2N5Y2xlIHwgZnJhbWVfZ2V0OworCisJcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sLmggYi9kcml2ZXJzL3Njc2kvaXNjaS91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjYjk1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wuaApAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfU0NJQ19TRFNfVU5TT0xJQ0lURURfRlJBTUVfQ09OVFJPTF9IXworI2RlZmluZSBfU0NJQ19TRFNfVU5TT0xJQ0lURURfRlJBTUVfQ09OVFJPTF9IXworCisjaW5jbHVkZSAiaXNjaS5oIgorCisjZGVmaW5lIFNDVV9VTlNPTElDSVRFRF9GUkFNRV9IRUFERVJfREFUQV9EV09SRFMgMTUKKworLyoqCisgKiBzdHJ1Y3Qgc2N1X3Vuc29saWNpdGVkX2ZyYW1lX2hlYWRlciAtCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVsaW5lYXRlcyB0aGUgZm9ybWF0IG9mIGFuIHVuc29saWNpdGVkIGZyYW1lIGhlYWRlci4gVGhlCisgKiBmaXJzdCBEV09SRCBhcmUgVUYgYXR0cmlidXRlcyBkZWZpbmVkIGJ5IHRoZSBzaWxpY29uIGFyY2hpdGVjdHVyZS4gVGhlIGRhdGEKKyAqIGRlcGljdHMgYWN0dWFsIGhlYWRlciBpbmZvcm1hdGlvbiByZWNlaXZlZCBvbiB0aGUgbGluay4KKyAqLworc3RydWN0IHNjdV91bnNvbGljaXRlZF9mcmFtZV9oZWFkZXIgeworCS8qKgorCSAqIFRoaXMgZmllbGQgaW5kaWNhdGVzIGlmIHRoZXJlIGlzIGFuIEluaXRpYXRvciBJbmRleCBUYWJsZSBlbnRyeSB3aXRoCisJICogd2hpY2ggdGhpcyBoZWFkZXIgaXMgYXNzb2NpYXRlZC4KKwkgKi8KKwl1MzIgaWl0X2V4aXN0czoxOworCisJLyoqCisJICogVGhpcyBmaWVsZCBzaW1wbHkgaW5kaWNhdGVzIHRoZSBwcm90b2NvbCB0eXBlIChpLmUuIFNTUCwgU1RQLCBTTVApLgorCSAqLworCXUzMiBwcm90b2NvbF90eXBlOjM7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGluZGljYXRlcyBpZiB0aGUgZnJhbWUgaXMgYW4gYWRkcmVzcyBmcmFtZSAoSUFGIG9yIE9BRikKKwkgKiBvciBpZiBpdCBpcyBhIGluZm9ybWF0aW9uIHVuaXQgZnJhbWUuCisJICovCisJdTMyIGlzX2FkZHJlc3NfZnJhbWU6MTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc2ltcGx5IGluZGljYXRlcyB0aGUgY29ubmVjdGlvbiByYXRlIGF0IHdoaWNoIHRoZSBmcmFtZQorCSAqIHdhcyByZWNlaXZlZC4KKwkgKi8KKwl1MzIgY29ubmVjdGlvbl9yYXRlOjQ7CisKKwl1MzIgcmVzZXJ2ZWQ6MjM7CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBoZWFkZXIgZGF0YSByZWNlaXZlZCBvbiB0aGUgbGluay4KKwkgKi8KKwl1MzIgZGF0YVtTQ1VfVU5TT0xJQ0lURURfRlJBTUVfSEVBREVSX0RBVEFfRFdPUkRTXTsKKworfTsKKworCisKKy8qKgorICogZW51bSB1bnNvbGljaXRlZF9mcmFtZV9zdGF0ZSAtCisgKgorICogVGhpcyBlbnVtZXJhdGlvbiByZXByZXNlbnRzIHRoZSBjdXJyZW50IHVuc29saWNpdGVkIGZyYW1lIHN0YXRlLiAgVGhlCisgKiBjb250cm9sbGVyIG9iamVjdCBjYW4gbm90IHVwZHRhdGUgdGhlIGhhcmR3YXJlIHVuc29saWNpdGVkIGZyYW1lIHB1dCBwb2ludGVyCisgKiB1bmxlc3MgaXQgaGFzIGFscmVhZHkgcHJvY2Vzc2VkIHRoZSBwcmlyb3IgdW5zb2xpY2l0ZWQgZnJhbWVzLgorICovCitlbnVtIHVuc29saWNpdGVkX2ZyYW1lX3N0YXRlIHsKKwkvKioKKwkgKiBUaGlzIHN0YXRlIGlzIHdoZW4gdGhlIGZyYW1lIGlzIGVtcHR5IGFuZCBub3QgaW4gdXNlLiAgSXQgaXMKKwkgKiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVsZWFzZWQgc3RhdGUgaW4gdGhhdCB0aGUgaGFyZHdhcmUgY291bGQgRE1BCisJICogZGF0YSB0byB0aGlzIGZyYW1lIGJ1ZmZlci4KKwkgKi8KKwlVTlNPTElDSVRFRF9GUkFNRV9FTVBUWSwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaXMgc2V0IHdoZW4gdGhlIGZyYW1lIGJ1ZmZlciBpcyBpbiB1c2UgYnkgYnkgc29tZQorCSAqIG9iamVjdCBpbiB0aGUgc3lzdGVtLgorCSAqLworCVVOU09MSUNJVEVEX0ZSQU1FX0lOX1VTRSwKKworCS8qKgorCSAqIFRoaXMgc3RhdGUgaXMgc2V0IHdoZW4gdGhlIGZyYW1lIGlzIHJldHVybmVkIHRvIHRoZSBmcmVlIHBvb2wKKwkgKiBidXQgb25lIG9yIG1vcmUgZnJhbWVzIHByaW9yIHRvIHRoaXMgb25lIGFyZSBzdGlsbCBpbiB1c2UuCisJICogT25jZSBhbGwgb2YgdGhlIGZyYW1lIGJlZm9yZSB0aGlzIG9uZSBhcmUgZnJlZWQgaXQgd2lsbCBnbyB0bworCSAqIHRoZSBlbXB0eSBzdGF0ZS4KKwkgKi8KKwlVTlNPTElDSVRFRF9GUkFNRV9SRUxFQVNFRCwKKworCVVOU09MSUNJVEVEX0ZSQU1FX01BWF9TVEFURVMKK307CisKKy8qKgorICogc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZSAtCisgKgorICogVGhpcyBpcyB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgZGF0YSBzdHJ1Y3R1cmUgaXQgYWN0cyBhcyB0aGUgY29udGFpbmVyIGZvcgorICogdGhlIGN1cnJlbnQgZnJhbWUgc3RhdGUsIGZyYW1lIGhlYWRlciBhbmQgZnJhbWUgYnVmZmVyLgorICovCitzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBjdXJyZW50IGZyYW1lIHN0YXRlCisJICovCisJZW51bSB1bnNvbGljaXRlZF9mcmFtZV9zdGF0ZSBzdGF0ZTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgcG9pbnRzIHRvIHRoZSBmcmFtZSBoZWFkZXIgZGF0YS4KKwkgKi8KKwlzdHJ1Y3Qgc2N1X3Vuc29saWNpdGVkX2ZyYW1lX2hlYWRlciAqaGVhZGVyOworCisJLyoqCisJICogVGhpcyBmaWVsZCBwb2ludHMgdG8gdGhlIGZyYW1lIGJ1ZmZlciBkYXRhLgorCSAqLworCXZvaWQgKmJ1ZmZlcjsKKworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2NpX3VmX2hlYWRlcl9hcnJheSAtCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIG9mIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBoZWFkZXIgaW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCBzY2lfdWZfaGVhZGVyX2FycmF5IHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHJlcHJlc2VudHMgYSB2aXJ0dWFsIHBvaW50ZXIgdG8gdGhlIHN0YXJ0CisJICogYWRkcmVzcyBvZiB0aGUgVUYgYWRkcmVzcyB0YWJsZS4gIFRoZSB0YWJsZSBjb250YWlucworCSAqIDY0LWJpdCBwb2ludGVycyBhcyByZXF1aXJlZCBieSB0aGUgaGFyZHdhcmUuCisJICovCisJc3RydWN0IHNjdV91bnNvbGljaXRlZF9mcmFtZV9oZWFkZXIgKmFycmF5OworCisJLyoqCisJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MgbG9jYXRpb24gZm9yIHRoZSBVRgorCSAqIGJ1ZmZlciBhcnJheS4KKwkgKi8KKwlkbWFfYWRkcl90IHBoeXNpY2FsX2FkZHJlc3M7CisKK307CisKKy8qKgorICogc3RydWN0IHNjaV91Zl9idWZmZXJfYXJyYXkgLQorICoKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBvZiB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgYnVmZmVyIChhY3R1YWwgcGF5bG9hZCkKKyAqIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3Qgc2NpX3VmX2J1ZmZlcl9hcnJheSB7CisJLyoqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgdW5zb2xpY2l0ZWQgZnJhbWUgZGF0YSBpdHMgdXNlZCB0byBtYW5hZ2UKKwkgKiB0aGUgZGF0YSBmb3IgdGhlIHVuc29saWNpdGVkIGZyYW1lIHJlcXVlc3RzLiAgSXQgYWxzbyByZXByZXNlbnRzCisJICogdGhlIHZpcnR1YWwgYWRkcmVzcyBsb2NhdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQorCSAqIHBoeXNpY2FsX2FkZHJlc3MgZmllbGQuCisJICovCisJc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZSBhcnJheVtTQ1VfTUFYX1VOU09MSUNJVEVEX0ZSQU1FU107CisKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBsb2NhdGlvbiBmb3IgdGhlIFVGCisJICogYnVmZmVyIGFycmF5LgorCSAqLworCWRtYV9hZGRyX3QgcGh5c2ljYWxfYWRkcmVzczsKK307CisKKy8qKgorICogc3RydWN0IHNjaV91Zl9hZGRyZXNzX3RhYmxlX2FycmF5IC0KKyAqCisgKiBUaGlzIG9iamVjdCBtYWludGFpbnMgYWxsIG9mIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBhZGRyZXNzIHRhYmxlIHNwZWNpZmljCisgKiBkYXRhLiAgVGhlIGFkZHJlc3MgdGFibGUgaXMgYSBjb2xsZWN0aW9uIG9mIDY0LWJpdCBwb2ludGVycyB0aGF0IHBvaW50IHRvCisgKiAxS0IgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBzaWxpY29uIHdpbGwgRE1BIHVuc29saWNpdGVkIGZyYW1lcy4KKyAqLworc3RydWN0IHNjaV91Zl9hZGRyZXNzX3RhYmxlX2FycmF5IHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIHJlcHJlc2VudHMgYSB2aXJ0dWFsIHBvaW50ZXIgdGhhdCByZWZlcnMgdG8gdGhlCisJICogc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgVUYgYWRkcmVzcyB0YWJsZS4KKwkgKiA2NC1iaXQgcG9pbnRlcnMgYXJlIHJlcXVpcmVkIGJ5IHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlkbWFfYWRkcl90ICphcnJheTsKKworCS8qKgorCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGxvY2F0aW9uIGZvciB0aGUgVUYKKwkgKiBhZGRyZXNzIHRhYmxlLgorCSAqLworCWRtYV9hZGRyX3QgcGh5c2ljYWxfYWRkcmVzczsKKworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgLQorICoKKyAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZGF0YSBuZWNlc3NhcnkgdG8gaGFuZGxlIHVuc29saWNpdGVkIGZyYW1lcy4KKyAqLworc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sIHsKKwkvKioKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSBzb2Z0d2FyZSBjb3B5IG9mIHRoZSB1bnNvbGljaXRlZCBmcmFtZSBxdWV1ZQorCSAqIGdldCBwb2ludGVyLiAgVGhlIGNvbnRyb2xsZXIgb2JqZWN0IHdyaXRlcyB0aGlzIHZhbHVlIHRvIHRoZQorCSAqIGhhcmR3YXJlIHRvIGxldCB0aGUgaGFyZHdhcmUgcHV0IG1vcmUgdW5zb2xpY2l0ZWQgZnJhbWUgZW50cmllcy4KKwkgKi8KKwl1MzIgZ2V0OworCisJLyoqCisJICogVGhpcyBmaWVsZCBjb250YWlucyBhbGwgb2YgdGhlIHVuc29saWNpdGVkIGZyYW1lIGhlYWRlcgorCSAqIHNwZWNpZmljIGZpZWxkcy4KKwkgKi8KKwlzdHJ1Y3Qgc2NpX3VmX2hlYWRlcl9hcnJheSBoZWFkZXJzOworCisJLyoqCisJICogVGhpcyBmaWVsZCBjb250YWlucyBhbGwgb2YgdGhlIHVuc29saWNpdGVkIGZyYW1lIGJ1ZmZlcgorCSAqIHNwZWNpZmljIGZpZWxkcy4KKwkgKi8KKwlzdHJ1Y3Qgc2NpX3VmX2J1ZmZlcl9hcnJheSBidWZmZXJzOworCisJLyoqCisJICogVGhpcyBmaWVsZCBjb250YWlucyBhbGwgb2YgdGhlIHVuc29saWNpdGVkIGZyYW1lIGFkZHJlc3MgdGFibGUKKwkgKiBzcGVjaWZpYyBmaWVsZHMuCisJICovCisJc3RydWN0IHNjaV91Zl9hZGRyZXNzX3RhYmxlX2FycmF5IGFkZHJlc3NfdGFibGU7CisKK307CisKK3N0cnVjdCBpc2NpX2hvc3Q7CisKK2ludCBzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigKKwlzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgKnVmX2NvbnRyb2wsCisJdTMyIGZyYW1lX2luZGV4LAorCXZvaWQgKipmcmFtZV9oZWFkZXIpOworCitlbnVtIHNjaV9zdGF0dXMgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigKKwlzdHJ1Y3Qgc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2wgKnVmX2NvbnRyb2wsCisJdTMyIGZyYW1lX2luZGV4LAorCXZvaWQgKipmcmFtZV9idWZmZXIpOworCitib29sIHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX3JlbGVhc2VfZnJhbWUoCisJc3RydWN0IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sICp1Zl9jb250cm9sLAorCXUzMiBmcmFtZV9pbmRleCk7CisKKyNlbmRpZiAvKiBfU0NJQ19TRFNfVU5TT0xJQ0lURURfRlJBTUVfQ09OVFJPTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY3NpX2Jvb3Rfc3lzZnMuYyBiL2RyaXZlcnMvc2NzaS9pc2NzaV9ib290X3N5c2ZzLmMKaW5kZXggZGY2YmZmNy4uODk3MDBjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY3NpX2Jvb3Rfc3lzZnMuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjc2lfYm9vdF9zeXNmcy5jCkBAIC02NCw3ICs2NCw4IEBACiAJc3RydWN0IGlzY3NpX2Jvb3Rfa29iaiAqYm9vdF9rb2JqID0KIAkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqLCBrb2JqKTsKIAotCWtmcmVlKGJvb3Rfa29iai0+ZGF0YSk7CisJaWYgKGJvb3Rfa29iai0+cmVsZWFzZSkKKwkJYm9vdF9rb2JqLT5yZWxlYXNlKGJvb3Rfa29iai0+ZGF0YSk7CiAJa2ZyZWUoYm9vdF9rb2JqKTsKIH0KIApAQCAtMzA1LDcgKzMwNiw4IEBACiAJCSAgICAgICBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRyX2dyb3VwLAogCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGluZGV4LCB2b2lkICpkYXRhLAogCQkgICAgICAgc3NpemVfdCAoKnNob3cpICh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKSwKLQkJICAgICAgIG1vZGVfdCAoKmlzX3Zpc2libGUpICh2b2lkICpkYXRhLCBpbnQgdHlwZSkpCisJCSAgICAgICBtb2RlX3QgKCppc192aXNpYmxlKSAodm9pZCAqZGF0YSwgaW50IHR5cGUpLAorCQkgICAgICAgdm9pZCAoKnJlbGVhc2UpICh2b2lkICpkYXRhKSkKIHsKIAlzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqICpib290X2tvYmo7CiAKQEAgLTMyMyw2ICszMjUsNyBAQAogCWJvb3Rfa29iai0+ZGF0YSA9IGRhdGE7CiAJYm9vdF9rb2JqLT5zaG93ID0gc2hvdzsKIAlib290X2tvYmotPmlzX3Zpc2libGUgPSBpc192aXNpYmxlOworCWJvb3Rfa29iai0+cmVsZWFzZSA9IHJlbGVhc2U7CiAKIAlpZiAoc3lzZnNfY3JlYXRlX2dyb3VwKCZib290X2tvYmotPmtvYmosIGF0dHJfZ3JvdXApKSB7CiAJCS8qCkBAIC0zMzEsNyArMzM0LDcgQEAKIAkJICogdGhlIGJvb3Qga29iaiB3YXMgbm90IHNldHVwIGFuZCB0aGUgbm9ybWFsIHJlbGVhc2UKIAkJICogcGF0aCBpcyBub3QgYmVpbmcgcnVuLgogCQkgKi8KLQkJYm9vdF9rb2JqLT5kYXRhID0gTlVMTDsKKwkJYm9vdF9rb2JqLT5yZWxlYXNlID0gTlVMTDsKIAkJa29iamVjdF9wdXQoJmJvb3Rfa29iai0+a29iaik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTM1Nyw2ICszNjAsNyBAQAogICogQGRhdGE6IGRyaXZlciBzcGVjaWZpYyBkYXRhIGZvciB0YXJnZXQKICAqIEBzaG93OiBhdHRyIHNob3cgZnVuY3Rpb24KICAqIEBpc192aXNpYmxlOiBhdHRyIHZpc2liaWxpdHkgZnVuY3Rpb24KKyAqIEByZWxlYXNlOiByZWxlYXNlIGZ1bmN0aW9uCiAgKgogICogTm90ZTogVGhlIGJvb3Qgc3lzZnMgbGliIHdpbGwgZnJlZSB0aGUgZGF0YSBwYXNzZWQgaW4gZm9yIHRoZSBjYWxsZXIKICAqIHdoZW4gYWxsIHJlZnMgdG8gdGhlIHRhcmdldCBrb2JqZWN0IGhhdmUgYmVlbiByZWxlYXNlZC4KQEAgLTM2NSwxMCArMzY5LDEyIEBACiBpc2NzaV9ib290X2NyZWF0ZV90YXJnZXQoc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqYm9vdF9rc2V0LCBpbnQgaW5kZXgsCiAJCQkgdm9pZCAqZGF0YSwKIAkJCSBzc2l6ZV90ICgqc2hvdykgKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpLAotCQkJIG1vZGVfdCAoKmlzX3Zpc2libGUpICh2b2lkICpkYXRhLCBpbnQgdHlwZSkpCisJCQkgbW9kZV90ICgqaXNfdmlzaWJsZSkgKHZvaWQgKmRhdGEsIGludCB0eXBlKSwKKwkJCSB2b2lkICgqcmVsZWFzZSkgKHZvaWQgKmRhdGEpKQogewogCXJldHVybiBpc2NzaV9ib290X2NyZWF0ZV9rb2JqKGJvb3Rfa3NldCwgJmlzY3NpX2Jvb3RfdGFyZ2V0X2F0dHJfZ3JvdXAsCi0JCQkJICAgICAgInRhcmdldCVkIiwgaW5kZXgsIGRhdGEsIHNob3csIGlzX3Zpc2libGUpOworCQkJCSAgICAgICJ0YXJnZXQlZCIsIGluZGV4LCBkYXRhLCBzaG93LCBpc192aXNpYmxlLAorCQkJCSAgICAgIHJlbGVhc2UpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfYm9vdF9jcmVhdGVfdGFyZ2V0KTsKIApAQCAtMzc5LDYgKzM4NSw3IEBACiAgKiBAZGF0YTogZHJpdmVyIHNwZWNpZmljIGRhdGEKICAqIEBzaG93OiBhdHRyIHNob3cgZnVuY3Rpb24KICAqIEBpc192aXNpYmxlOiBhdHRyIHZpc2liaWxpdHkgZnVuY3Rpb24KKyAqIEByZWxlYXNlOiByZWxlYXNlIGZ1bmN0aW9uCiAgKgogICogTm90ZTogVGhlIGJvb3Qgc3lzZnMgbGliIHdpbGwgZnJlZSB0aGUgZGF0YSBwYXNzZWQgaW4gZm9yIHRoZSBjYWxsZXIKICAqIHdoZW4gYWxsIHJlZnMgdG8gdGhlIGluaXRpYXRvciBrb2JqZWN0IGhhdmUgYmVlbiByZWxlYXNlZC4KQEAgLTM4NywxMiArMzk0LDEzIEBACiBpc2NzaV9ib290X2NyZWF0ZV9pbml0aWF0b3Ioc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqYm9vdF9rc2V0LCBpbnQgaW5kZXgsCiAJCQkgICAgdm9pZCAqZGF0YSwKIAkJCSAgICBzc2l6ZV90ICgqc2hvdykgKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpLAotCQkJICAgIG1vZGVfdCAoKmlzX3Zpc2libGUpICh2b2lkICpkYXRhLCBpbnQgdHlwZSkpCisJCQkgICAgbW9kZV90ICgqaXNfdmlzaWJsZSkgKHZvaWQgKmRhdGEsIGludCB0eXBlKSwKKwkJCSAgICB2b2lkICgqcmVsZWFzZSkgKHZvaWQgKmRhdGEpKQogewogCXJldHVybiBpc2NzaV9ib290X2NyZWF0ZV9rb2JqKGJvb3Rfa3NldCwKIAkJCQkgICAgICAmaXNjc2lfYm9vdF9pbml0aWF0b3JfYXR0cl9ncm91cCwKIAkJCQkgICAgICAiaW5pdGlhdG9yIiwgaW5kZXgsIGRhdGEsIHNob3csCi0JCQkJICAgICAgaXNfdmlzaWJsZSk7CisJCQkJICAgICAgaXNfdmlzaWJsZSwgcmVsZWFzZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9ib290X2NyZWF0ZV9pbml0aWF0b3IpOwogCkBAIC00MDMsNiArNDExLDcgQEAKICAqIEBkYXRhOiBkcml2ZXIgc3BlY2lmaWMgZGF0YQogICogQHNob3c6IGF0dHIgc2hvdyBmdW5jdGlvbgogICogQGlzX3Zpc2libGU6IGF0dHIgdmlzaWJpbGl0eSBmdW5jdGlvbgorICogQHJlbGVhc2U6IHJlbGVhc2UgZnVuY3Rpb24KICAqCiAgKiBOb3RlOiBUaGUgYm9vdCBzeXNmcyBsaWIgd2lsbCBmcmVlIHRoZSBkYXRhIHBhc3NlZCBpbiBmb3IgdGhlIGNhbGxlcgogICogd2hlbiBhbGwgcmVmcyB0byB0aGUgZXRoZXJuZXQga29iamVjdCBoYXZlIGJlZW4gcmVsZWFzZWQuCkBAIC00MTEsMTIgKzQyMCwxMyBAQAogaXNjc2lfYm9vdF9jcmVhdGVfZXRoZXJuZXQoc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqYm9vdF9rc2V0LCBpbnQgaW5kZXgsCiAJCQkgICB2b2lkICpkYXRhLAogCQkJICAgc3NpemVfdCAoKnNob3cpICh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKSwKLQkJCSAgIG1vZGVfdCAoKmlzX3Zpc2libGUpICh2b2lkICpkYXRhLCBpbnQgdHlwZSkpCisJCQkgICBtb2RlX3QgKCppc192aXNpYmxlKSAodm9pZCAqZGF0YSwgaW50IHR5cGUpLAorCQkJICAgdm9pZCAoKnJlbGVhc2UpICh2b2lkICpkYXRhKSkKIHsKIAlyZXR1cm4gaXNjc2lfYm9vdF9jcmVhdGVfa29iaihib290X2tzZXQsCiAJCQkJICAgICAgJmlzY3NpX2Jvb3RfZXRoZXJuZXRfYXR0cl9ncm91cCwKIAkJCQkgICAgICAiZXRoZXJuZXQlZCIsIGluZGV4LCBkYXRhLCBzaG93LAotCQkJCSAgICAgIGlzX3Zpc2libGUpOworCQkJCSAgICAgIGlzX3Zpc2libGUsIHJlbGVhc2UpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfYm9vdF9jcmVhdGVfZXRoZXJuZXQpOwogCkBAIC00NzIsNiArNDgyLDkgQEAKIHsKIAlzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqICpib290X2tvYmosICp0bXBfa29iajsKIAorCWlmICghYm9vdF9rc2V0KQorCQlyZXR1cm47CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYm9vdF9rb2JqLCB0bXBfa29iaiwKIAkJCQkgJmJvb3Rfa3NldC0+a29ial9saXN0LCBsaXN0KQogCQlpc2NzaV9ib290X3JlbW92ZV9rb2JqKGJvb3Rfa29iaik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMgYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKaW5kZXggM2RmOTg1My4uNzcyNDQxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwpAQCAtMTA3LDEwICsxMDcsMTIgQEAKICAqIElmIHRoZSBzb2NrZXQgaXMgaW4gQ0xPU0Ugb3IgQ0xPU0VfV0FJVCB3ZSBzaG91bGQKICAqIG5vdCBjbG9zZSB0aGUgY29ubmVjdGlvbiBpZiB0aGVyZSBpcyBzdGlsbCBzb21lCiAgKiBkYXRhIHBlbmRpbmcuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBza19jYWxsYmFja19sb2NrLgogICovCiBzdGF0aWMgaW5saW5lIGludCBpc2NzaV9zd19za19zdGF0ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2spCiB7Ci0Jc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSAoc3RydWN0IGlzY3NpX2Nvbm4qKXNrLT5za191c2VyX2RhdGE7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBzay0+c2tfdXNlcl9kYXRhOwogCiAJaWYgKChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFX1dBSVQgfHwgc2stPnNrX3N0YXRlID09IFRDUF9DTE9TRSkgJiYKIAkgICAgIWF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykpIHsKQEAgLTEyMywxMSArMTI1LDE3IEBACiAKIHN0YXRpYyB2b2lkIGlzY3NpX3N3X3RjcF9kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWcpCiB7Ci0Jc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBzay0+c2tfdXNlcl9kYXRhOwotCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOworCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm47CiAJcmVhZF9kZXNjcmlwdG9yX3QgcmRfZGVzYzsKIAogCXJlYWRfbG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCWNvbm4gPSBzay0+c2tfdXNlcl9kYXRhOworCWlmICghY29ubikgeworCQlyZWFkX3VubG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCQlyZXR1cm47CisJfQorCXRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKIAogCS8qCiAJICogVXNlIHJkX2Rlc2MgdG8gcGFzcyAnY29ubicgdG8gaXNjc2lfdGNwX3JlY3YuCkBAIC0xNDEsMTEgKzE0OSwxMCBAQAogCiAJaXNjc2lfc3dfc2tfc3RhdGVfY2hlY2soc2spOwogCi0JcmVhZF91bmxvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKLQogCS8qIElmIHdlIGhhZCB0byAoYXRvbWljYWxseSkgbWFwIGEgaGlnaG1lbSBwYWdlLAogCSAqIHVubWFwIGl0IG5vdy4gKi8KIAlpc2NzaV90Y3Bfc2VnbWVudF91bm1hcCgmdGNwX2Nvbm4tPmluLnNlZ21lbnQpOworCXJlYWRfdW5sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGlzY3NpX3N3X3RjcF9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHNvY2sgKnNrKQpAQCAtMTU3LDggKzE2NCwxMSBAQAogCXZvaWQgKCpvbGRfc3RhdGVfY2hhbmdlKShzdHJ1Y3Qgc29jayAqKTsKIAogCXJlYWRfbG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOwotCi0JY29ubiA9IChzdHJ1Y3QgaXNjc2lfY29ubiopc2stPnNrX3VzZXJfZGF0YTsKKwljb25uID0gc2stPnNrX3VzZXJfZGF0YTsKKwlpZiAoIWNvbm4pIHsKKwkJcmVhZF91bmxvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwkJcmV0dXJuOworCX0KIAlzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKIAogCWlzY3NpX3N3X3NrX3N0YXRlX2NoZWNrKHNrKTsKQEAgLTE3OCwxMSArMTg4LDI1IEBACiAgKiovCiBzdGF0aWMgdm9pZCBpc2NzaV9zd190Y3Bfd3JpdGVfc3BhY2Uoc3RydWN0IHNvY2sgKnNrKQogewotCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gKHN0cnVjdCBpc2NzaV9jb25uKilzay0+c2tfdXNlcl9kYXRhOwotCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOwotCXN0cnVjdCBpc2NzaV9zd190Y3BfY29ubiAqdGNwX3N3X2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKKwlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uOworCXN0cnVjdCBpc2NzaV9zd190Y3BfY29ubiAqdGNwX3N3X2Nvbm47CisJdm9pZCAoKm9sZF93cml0ZV9zcGFjZSkoc3RydWN0IHNvY2sgKik7CiAKLQl0Y3Bfc3dfY29ubi0+b2xkX3dyaXRlX3NwYWNlKHNrKTsKKwlyZWFkX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwljb25uID0gc2stPnNrX3VzZXJfZGF0YTsKKwlpZiAoIWNvbm4pIHsKKwkJcmVhZF91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCXRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwl0Y3Bfc3dfY29ubiA9IHRjcF9jb25uLT5kZF9kYXRhOworCW9sZF93cml0ZV9zcGFjZSA9IHRjcF9zd19jb25uLT5vbGRfd3JpdGVfc3BhY2U7CisJcmVhZF91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKworCW9sZF93cml0ZV9zcGFjZShzayk7CisKIAlJU0NTSV9TV19UQ1BfREJHKGNvbm4sICJpc2NzaV93cml0ZV9zcGFjZVxuIik7CiAJaXNjc2lfY29ubl9xdWV1ZV93b3JrKGNvbm4pOwogfQpAQCAtNTkyLDIwICs2MTYsMTcgQEAKIAkvKiB1c2Vyc3BhY2UgbWF5IGhhdmUgZ29vZmVkIHVwIGFuZCBub3QgYm91bmQgdXMgKi8KIAlpZiAoIXNvY2spCiAJCXJldHVybjsKLQkvKgotCSAqIE1ha2Ugc3VyZSBvdXIgcmVjdiBzaWRlIGlzIHN0b3BwZWQuCi0JICogT2xkZXIgdG9vbHMgY2FsbGVkIGNvbm4gc3RvcCBiZWZvcmUgZXBfZGlzY29ubmVjdAotCSAqIHNvIElPIGNvdWxkIHN0aWxsIGJlIGNvbWluZyBpbi4KLQkgKi8KLQl3cml0ZV9sb2NrX2JoKCZ0Y3Bfc3dfY29ubi0+c29jay0+c2stPnNrX2NhbGxiYWNrX2xvY2spOwotCXNldF9iaXQoSVNDU0lfU1VTUEVORF9CSVQsICZjb25uLT5zdXNwZW5kX3J4KTsKLQl3cml0ZV91bmxvY2tfYmgoJnRjcF9zd19jb25uLT5zb2NrLT5zay0+c2tfY2FsbGJhY2tfbG9jayk7CiAKIAlzb2NrLT5zay0+c2tfZXJyID0gRUlPOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZShza19zbGVlcChzb2NrLT5zaykpOwogCi0JaXNjc2lfY29ubl9zdG9wKGNsc19jb25uLCBmbGFnKTsKKwkvKiBzdG9wIHhtaXQgc2lkZSAqLworCWlzY3NpX3N1c3BlbmRfdHgoY29ubik7CisKKwkvKiBzdG9wIHJlY3Ygc2lkZSBhbmQgcmVsZWFzZSBzb2NrZXQgKi8KIAlpc2NzaV9zd190Y3BfcmVsZWFzZV9jb25uKGNvbm4pOworCisJaXNjc2lfY29ubl9zdG9wKGNsc19jb25uLCBmbGFnKTsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19leGNoLmMKaW5kZXggM2I4YTY0NS4uZjVhMDY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZXhjaC5jCkBAIC05NjUsOCArOTY1LDMwIEBACiAJCXNwID0gJmVwLT5zZXE7CiAJCWlmIChzcC0+aWQgIT0gZmgtPmZoX3NlcV9pZCkgewogCQkJYXRvbWljX2luYygmbXAtPnN0YXRzLnNlcV9ub3RfZm91bmQpOwotCQkJcmVqZWN0ID0gRkNfUkpUX1NFUV9JRDsJLyogc2VxdWVuY2UvZXhjaCBzaG91bGQgZXhpc3QgKi8KLQkJCWdvdG8gcmVsOworCQkJaWYgKGZfY3RsICYgRkNfRkNfRU5EX1NFUSkgeworCQkJCS8qCisJCQkJICogVXBkYXRlIHNlcXVlbmNlX2lkIGJhc2VkIG9uIGluY29taW5nIGxhc3QKKwkJCQkgKiBmcmFtZSBvZiBzZXF1ZW5jZSBleGNoYW5nZS4gVGhpcyBpcyBuZWVkZWQKKwkJCQkgKiBmb3IgRkNvRSB0YXJnZXQgd2hlcmUgRERQIGhhcyBiZWVuIHVzZWQKKwkJCQkgKiBvbiB0YXJnZXQgd2hlcmUsIHN0YWNrIGlzIGluZGljYXRlZCBvbmx5CisJCQkJICogYWJvdXQgbGFzdCBmcmFtZSdzIChwYXlsb2FkIF9oZWFkZXIpIGhlYWRlci4KKwkJCQkgKiBXaGVyZWFzICJzZXFfaWQiIHdoaWNoIGlzIHBhcnQgb2YKKwkJCQkgKiBmcmFtZV9oZWFkZXIgaXMgYWxsb2NhdGVkIGJ5IGluaXRpYXRvcgorCQkJCSAqIHdoaWNoIGlzIHRvdGFsbHkgZGlmZmVyZW50IGZyb20gInNlcV9pZCIKKwkJCQkgKiBhbGxvY2F0ZWQgd2hlbiBYRkVSX1JEWSB3YXMgc2VudCBieSB0YXJnZXQuCisJCQkJICogVG8gYXZvaWQgZmFsc2UgLXZlIHdoaWNoIHJlc3VsdHMgaW50byBub3QKKwkJCQkgKiBzZW5kaW5nIFJTUCwgaGVuY2Ugd3JpdGUgcmVxdWVzdCBvbiBvdGhlcgorCQkJCSAqIGVuZCBuZXZlciBmaW5pc2hlcy4KKwkJCQkgKi8KKwkJCQlzcGluX2xvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwkJCQlzcC0+c3NiX3N0YXQgfD0gU1NCX1NUX1JFU1A7CisJCQkJc3AtPmlkID0gZmgtPmZoX3NlcV9pZDsKKwkJCQlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOworCQkJfSBlbHNlIHsKKwkJCQkvKiBzZXF1ZW5jZS9leGNoIHNob3VsZCBleGlzdCAqLworCQkJCXJlamVjdCA9IEZDX1JKVF9TRVFfSUQ7CisJCQkJZ290byByZWw7CisJCQl9CiAJCX0KIAl9CiAJV0FSTl9PTihlcCAhPSBmY19zZXFfZXhjaChzcCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYwppbmRleCAzODlhYjgwLi5lMDA4YjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYwpAQCAtMTAyNSw2ICsxMDI1LDggQEAKIAkJCWZjX3Zwb3J0X3NldF9zdGF0ZShscG9ydC0+dnBvcnQsIEZDX1ZQT1JUX0xJTktET1dOKTsKIAl9CiAJZmNfbHBvcnRfc3RhdGVfZW50ZXIobHBvcnQsIExQT1JUX1NUX1JFU0VUKTsKKwlmY19ob3N0X3Bvc3RfZXZlbnQobHBvcnQtPmhvc3QsIGZjX2dldF9ldmVudF9udW1iZXIoKSwKKwkJCSAgIEZDSF9FVlRfTElQUkVTRVQsIDApOwogCWZjX3Zwb3J0c19saW5rY2hhbmdlKGxwb3J0KTsKIAlmY19scG9ydF9yZXNldF9sb2NrZWQobHBvcnQpOwogCWlmIChscG9ydC0+bGlua191cCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ycG9ydC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMKaW5kZXggNDllMWNjYy4uNzYwZGI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMKQEAgLTE1MywxOCArMTUzLDYgQEAKIH0KIAogLyoqCi0gKiBmY19ycG9ydF9mcmVlX3JjdSgpIC0gRnJlZSBhIHJlbW90ZSBwb3J0Ci0gKiBAcmN1OiBUaGUgcmN1X2hlYWQgc3RydWN0dXJlIGluc2lkZSB0aGUgcmVtb3RlIHBvcnQKLSAqLwotc3RhdGljIHZvaWQgZmNfcnBvcnRfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCi17Ci0Jc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhOwotCi0JcmRhdGEgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgZmNfcnBvcnRfcHJpdiwgcmN1KTsKLQlrZnJlZShyZGF0YSk7Ci19Ci0KLS8qKgogICogZmNfcnBvcnRfZGVzdHJveSgpIC0gRnJlZSBhIHJlbW90ZSBwb3J0IGFmdGVyIGxhc3QgcmVmZXJlbmNlIGlzIHJlbGVhc2VkCiAgKiBAa3JlZjogVGhlIHJlbW90ZSBwb3J0J3Mga3JlZgogICovCkBAIC0xNzMsNyArMTYxLDcgQEAKIAlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGE7CiAKIAlyZGF0YSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZmNfcnBvcnRfcHJpdiwga3JlZik7Ci0JY2FsbF9yY3UoJnJkYXRhLT5yY3UsIGZjX3Jwb3J0X2ZyZWVfcmN1KTsKKwlrZnJlZV9yY3UocmRhdGEsIHJjdSk7CiB9CiAKIC8qKgpAQCAtODAxLDYgKzc4OSwyMCBAQAogCiAJc3dpdGNoIChyZGF0YS0+cnBfc3RhdGUpIHsKIAljYXNlIFJQT1JUX1NUX0lOSVQ6CisJCS8qCisJCSAqIElmIHJlY2VpdmVkIHRoZSBGTE9HSSByZXF1ZXN0IG9uIFJQT1JUIHdoaWNoIGlzIElOSVQgc3RhdGUKKwkJICogKG1lYW5zIG5vdCB0cmFuc2l0aW9uIHRvIEZMT0dJIGVpdGhlciBmY19ycG9ydCB0aW1lb3V0CisJCSAqIGZ1bmN0aW9uIGRpZG47dCB0cmlnZ2VyIG9yIHRoaXMgZW5kIGhhc247dCByZWNlaXZlZAorCQkgKiBiZWFjb24geWV0IGZyb20gb3RoZXIgZW5kLiBJbiB0aGF0IGNhc2Ugb25seSwgYWxsb3cgUlBPUlQKKwkJICogc3RhdGUgbWFjaGluZSB0byBjb250aW51ZSwgb3RoZXJ3aXNlIGZhbGwgdGhyb3VnaCB3aGljaAorCQkgKiBjYXVzZXMgdGhlIGNvZGUgdG8gc2VuZCByZWplY3QgcmVzcG9uc2UuCisJCSAqIE5PVEU7IE5vdCBjaGVja2luZyBmb3IgRklQLT5zdGF0ZSBzdWNoIGFzIFZOTVBfVVAgb3IKKwkJICogVk5NUF9DTEFJTSBiZWNhdXNlIGlmIEZJUCBzdGF0ZSBpcyBub3Qgb25lIG9mIHRob3NlLAorCQkgKiBSUE9SVCB3b3VsZG47dCBoYXZlIGNyZWF0ZWQgYW5kICdycG9ydF9sb29rdXAnIHdvdWxkIGhhdmUKKwkJICogZmFpbGVkIGFueXdheSBpbiB0aGF0IGNhc2UuCisJCSAqLworCQlpZiAobHBvcnQtPnBvaW50X3RvX211bHRpcG9pbnQpCisJCQlicmVhazsKIAljYXNlIFJQT1JUX1NUX0RFTEVURToKIAkJbXV0ZXhfdW5sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOwogCQlyanRfZGF0YS5yZWFzb24gPSBFTFNfUkpUX0ZJUDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKaW5kZXggMGM1NTBkNS4uZDdhNDEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCWhkci0+ZGF0YXNuID0gY3B1X3RvX2JlMzIocjJ0LT5kYXRhc24pOwogCXIydC0+ZGF0YXNuKys7CiAJaGRyLT5vcGNvZGUgPSBJU0NTSV9PUF9TQ1NJX0RBVEFfT1VUOwotCW1lbWNweShoZHItPmx1biwgdGFzay0+bHVuLCBzaXplb2YoaGRyLT5sdW4pKTsKKwloZHItPmx1biA9IHRhc2stPmx1bjsKIAloZHItPml0dCA9IHRhc2stPmhkcl9pdHQ7CiAJaGRyLT5leHBfc3RhdHNuID0gcjJ0LT5leHBfc3RhdHNuOwogCWhkci0+b2Zmc2V0ID0gY3B1X3RvX2JlMzIocjJ0LT5kYXRhX29mZnNldCArIHIydC0+c2VudCk7CkBAIC0yOTYsNyArMjk2LDcgQEAKIAkJLyoKIAkJICogQWxsb3cgUERVcyBmb3IgdW5yZWxhdGVkIExVTnMKIAkJICovCi0JCWhkcl9sdW4gPSBzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopdG1mLT5sdW4pOworCQloZHJfbHVuID0gc2NzaWx1bl90b19pbnQoJnRtZi0+bHVuKTsKIAkJaWYgKGhkcl9sdW4gIT0gdGFzay0+c2MtPmRldmljZS0+bHVuKQogCQkJcmV0dXJuIDA7CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwpAQCAtMzg5LDggKzM4OSw4IEBACiAJCXJldHVybiByYzsKIAloZHItPm9wY29kZSA9IElTQ1NJX09QX1NDU0lfQ01EOwogCWhkci0+ZmxhZ3MgPSBJU0NTSV9BVFRSX1NJTVBMRTsKLQlpbnRfdG9fc2NzaWx1bihzYy0+ZGV2aWNlLT5sdW4sIChzdHJ1Y3Qgc2NzaV9sdW4gKiloZHItPmx1bik7Ci0JbWVtY3B5KHRhc2stPmx1biwgaGRyLT5sdW4sIHNpemVvZih0YXNrLT5sdW4pKTsKKwlpbnRfdG9fc2NzaWx1bihzYy0+ZGV2aWNlLT5sdW4sICZoZHItPmx1bik7CisJdGFzay0+bHVuID0gaGRyLT5sdW47CiAJaGRyLT5leHBfc3RhdHNuID0gY3B1X3RvX2JlMzIoY29ubi0+ZXhwX3N0YXRzbik7CiAJY21kX2xlbiA9IHNjLT5jbWRfbGVuOwogCWlmIChjbWRfbGVuIDwgSVNDU0lfQ0RCX1NJWkUpCkBAIC05NjgsNyArOTY4LDcgQEAKIAloZHIuZmxhZ3MgPSBJU0NTSV9GTEFHX0NNRF9GSU5BTDsKIAogCWlmIChyaGRyKSB7Ci0JCW1lbWNweShoZHIubHVuLCByaGRyLT5sdW4sIDgpOworCQloZHIubHVuID0gcmhkci0+bHVuOwogCQloZHIudHR0ID0gcmhkci0+dHR0OwogCQloZHIuaXR0ID0gUkVTRVJWRURfSVRUOwogCX0gZWxzZQpAQCAtMjA5Miw3ICsyMDkyLDcgQEAKIAloZHItPm9wY29kZSA9IElTQ1NJX09QX1NDU0lfVE1GVU5DIHwgSVNDU0lfT1BfSU1NRURJQVRFOwogCWhkci0+ZmxhZ3MgPSBJU0NTSV9UTV9GVU5DX0FCT1JUX1RBU0sgJiBJU0NTSV9GTEFHX1RNX0ZVTkNfTUFTSzsKIAloZHItPmZsYWdzIHw9IElTQ1NJX0ZMQUdfQ01EX0ZJTkFMOwotCW1lbWNweShoZHItPmx1biwgdGFzay0+bHVuLCBzaXplb2YoaGRyLT5sdW4pKTsKKwloZHItPmx1biA9IHRhc2stPmx1bjsKIAloZHItPnJ0dCA9IHRhc2stPmhkcl9pdHQ7CiAJaGRyLT5yZWZjbWRzbiA9IHRhc2stPmNtZHNuOwogfQpAQCAtMjIzMyw3ICsyMjMzLDcgQEAKIAloZHItPm9wY29kZSA9IElTQ1NJX09QX1NDU0lfVE1GVU5DIHwgSVNDU0lfT1BfSU1NRURJQVRFOwogCWhkci0+ZmxhZ3MgPSBJU0NTSV9UTV9GVU5DX0xPR0lDQUxfVU5JVF9SRVNFVCAmIElTQ1NJX0ZMQUdfVE1fRlVOQ19NQVNLOwogCWhkci0+ZmxhZ3MgfD0gSVNDU0lfRkxBR19DTURfRklOQUw7Ci0JaW50X3RvX3Njc2lsdW4oc2MtPmRldmljZS0+bHVuLCAoc3RydWN0IHNjc2lfbHVuICopaGRyLT5sdW4pOworCWludF90b19zY3NpbHVuKHNjLT5kZXZpY2UtPmx1biwgJmhkci0+bHVuKTsKIAloZHItPnJ0dCA9IFJFU0VSVkVEX0lUVDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jCmluZGV4IGU5OGFlMzMuLjA5YjIzMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYworKysgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2lfdGNwLmMKQEAgLTEwODQsNyArMTA4NCw4IEBACiAJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubjsKIAlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uOwogCi0JY2xzX2Nvbm4gPSBpc2NzaV9jb25uX3NldHVwKGNsc19zZXNzaW9uLCBzaXplb2YoKnRjcF9jb25uKSwgY29ubl9pZHgpOworCWNsc19jb25uID0gaXNjc2lfY29ubl9zZXR1cChjbHNfc2Vzc2lvbiwKKwkJCQkgICAgc2l6ZW9mKCp0Y3BfY29ubikgKyBkZF9kYXRhX3NpemUsIGNvbm5faWR4KTsKIAlpZiAoIWNsc19jb25uKQogCQlyZXR1cm4gTlVMTDsKIAljb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CkBAIC0xMDk2LDIyICsxMDk3LDEzIEBACiAKIAl0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CiAJdGNwX2Nvbm4tPmlzY3NpX2Nvbm4gPSBjb25uOwotCi0JdGNwX2Nvbm4tPmRkX2RhdGEgPSBremFsbG9jKGRkX2RhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0Y3BfY29ubi0+ZGRfZGF0YSkgewotCQlpc2NzaV9jb25uX3RlYXJkb3duKGNsc19jb25uKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorCXRjcF9jb25uLT5kZF9kYXRhID0gY29ubi0+ZGRfZGF0YSArIHNpemVvZigqdGNwX2Nvbm4pOwogCXJldHVybiBjbHNfY29ubjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3RjcF9jb25uX3NldHVwKTsKIAogdm9pZCBpc2NzaV90Y3BfY29ubl90ZWFyZG93bihzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uKQogewotCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7Ci0Jc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7Ci0KLQlrZnJlZSh0Y3BfY29ubi0+ZGRfZGF0YSk7CiAJaXNjc2lfY29ubl90ZWFyZG93bihjbHNfY29ubik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV90Y3BfY29ubl90ZWFyZG93bik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCmluZGV4IGZmZTgyZDEuLjMwYjI1YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCkBAIC0xMTQ3LDcgKzExNDcsOCBAQAogewogCWNoYXIgbXlidWZbNjRdOwogCWNoYXIgKnBidWYsICpzdGVwX3N0cjsKLQlpbnQgYnNpemUsIGk7CisJaW50IGk7CisJc2l6ZV90IGJzaXplOwogCiAJLyogUHJvdGVjdCBjb3B5IGZyb20gdXNlciAqLwogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIG5ieXRlcykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmgKaW5kZXggOTA1OTUyNC4uYWI0YzRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaApAQCAtMjk1NSwxOCArMjk1NSwxOCBAQAogdHlwZWRlZiBzdHJ1Y3QgX1BDQiB7CiAjaWZkZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECiAJdWludDMyX3QgdHlwZTo4OwotI2RlZmluZSBUWVBFX05BVElWRV9TTEkyICAgICAgIDB4MDE7CisjZGVmaW5lIFRZUEVfTkFUSVZFX1NMSTIgICAgICAgMHgwMQogCXVpbnQzMl90IGZlYXR1cmU6ODsKLSNkZWZpbmUgRkVBVFVSRV9JTklUSUFMX1NMSTIgICAweDAxOworI2RlZmluZSBGRUFUVVJFX0lOSVRJQUxfU0xJMiAgIDB4MDEKIAl1aW50MzJfdCByc3ZkOjEyOwogCXVpbnQzMl90IG1heFJpbmc6NDsKICNlbHNlCS8qICBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQgKi8KIAl1aW50MzJfdCBtYXhSaW5nOjQ7CiAJdWludDMyX3QgcnN2ZDoxMjsKIAl1aW50MzJfdCBmZWF0dXJlOjg7Ci0jZGVmaW5lIEZFQVRVUkVfSU5JVElBTF9TTEkyICAgMHgwMTsKKyNkZWZpbmUgRkVBVFVSRV9JTklUSUFMX1NMSTIgICAweDAxCiAJdWludDMyX3QgdHlwZTo4OwotI2RlZmluZSBUWVBFX05BVElWRV9TTEkyICAgICAgIDB4MDE7CisjZGVmaW5lIFRZUEVfTkFUSVZFX1NMSTIgICAgICAgMHgwMQogI2VuZGlmCiAKIAl1aW50MzJfdCBtYWlsQm94U2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tYWNfc2NzaS5jIGIvZHJpdmVycy9zY3NpL21hY19zY3NpLmMKaW5kZXggYmYyYTFjNS4uYWYzYTZhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21hY19zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL21hY19zY3NpLmMKQEAgLTIxNSwxMyArMjE1LDYgQEAKIF9fc2V0dXAoIm1hYzUzODA9IiwgbWFjX3Njc2lfc2V0dXApOwogCiAvKgotICogSWYgeW91IHdhbnQgdG8gZmluZCB0aGUgaW5zdGFuY2Ugd2l0aCAoaylnZGIgLi4uCi0gKi8KLSNpZiBOREVCVUcKLXN0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpkZWZhdWx0X2luc3RhbmNlOwotI2VuZGlmCi0KLS8qCiAgKiBGdW5jdGlvbiA6IGludCBtYWNzY3NpX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKICAqCiAgKiBQdXJwb3NlIDogaW5pdGlhbGl6ZXMgbWFjIE5DUjUzODAgZHJpdmVyIGJhc2VkIG9uIHRoZQpAQCAtMjMzLDcgKzIyNiw3IEBACiAgKgogICovCiAgCi1pbnQgbWFjc2NzaV9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqIHRwbnQpCitpbnQgX19pbml0IG1hY3Njc2lfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKiB0cG50KQogewogICAgIHN0YXRpYyBpbnQgY2FsbGVkID0gMDsKICAgICBpbnQgZmxhZ3MgPSAwOwpAQCAtMjY4LDEwICsyNjEsNyBAQAogICAgIC8qIE9uY2Ugd2Ugc3VwcG9ydCBtdWx0aXBsZSA1MzgwcyAoZS5nLiBEdW9Eb2NrKSB3ZSdsbCBkbwogICAgICAgIHNvbWV0aGluZyBkaWZmZXJlbnQgaGVyZSAqLwogICAgIGluc3RhbmNlID0gc2NzaV9yZWdpc3RlciAodHBudCwgc2l6ZW9mKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhKSk7Ci0jaWYgTkRFQlVHCi0gICAgZGVmYXVsdF9pbnN0YW5jZSA9IGluc3RhbmNlOwotI2VuZGlmCi0gICAgCisKICAgICBpZiAobWFjaW50b3NoX2NvbmZpZy0+aWRlbnQgPT0gTUFDX01PREVMX0lJRlgpIHsKIAltYWNfc2NzaV9yZWdwICA9IHZpYTErMHg4MDAwOwogCW1hY19zY3NpX2RycSAgID0gdmlhMSsweEUwMDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMi5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTIuaAppbmRleCBhM2U2MDM4Li4zMTA1ZDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMi5oCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyLmgKQEAgLTgsNyArOCw3IEBACiAgKiAgICAgICAgICAgICAgICAgIHNjYXR0ZXIvZ2F0aGVyIGZvcm1hdHMuCiAgKiAgQ3JlYXRpb24gRGF0ZTogIEp1bmUgMjEsIDIwMDYKICAqCi0gKiAgbXBpMi5oIFZlcnNpb246ICAwMi4wMC4xNworICogIG1waTIuaCBWZXJzaW9uOiAgMDIuMDAuMTgKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC02NCw2ICs2NCw4IEBACiAgKiAgMDUtMTItMTAgIDAyLjAwLjE2ICBCdW1wZWQgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklULgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgYWx0ZXJuYXRpdmUgZGVmaW5lcyBmb3IgdGhlIFNHRSBEaXJlY3Rpb24gYml0LgogICogIDA4LTExLTEwICAwMi4wMC4xNyAgQnVtcGVkIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAxMS0xMC0xMCAgMDIuMDAuMTggIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUEkyX0lFRUVfU0dFX0ZMQUdTX1NZU1RFTVBMQkNQSV9BRERSIGRlZmluZS4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTg5LDcgKzkxLDcgQEAKICNkZWZpbmUgTVBJMl9WRVJTSU9OXzAyXzAwICAgICAgICAgICAgICAgICAgKDB4MDIwMCkKIAogLyogdmVyc2lvbmluZyBmb3IgdGhpcyBNUEkgaGVhZGVyIHNldCAqLwotI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQgICAgICAgICAgICAoMHgxMSkKKyNkZWZpbmUgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklUICAgICAgICAgICAgKDB4MTIpCiAjZGVmaW5lIE1QSTJfSEVBREVSX1ZFUlNJT05fREVWICAgICAgICAgICAgICgweDAwKQogI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVRfTUFTSyAgICAgICAoMHhGRjAwKQogI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVRfU0hJRlQgICAgICAoOCkKQEAgLTEwNjAsMTAgKzEwNjIsMTQgQEAKIAogI2RlZmluZSBNUEkyX0lFRUVfU0dFX0ZMQUdTX0FERFJfTUFTSyAgICAgICAgICAgKDB4MDMpCiAjZGVmaW5lIE1QSTJfSUVFRV9TR0VfRkxBR1NfU1lTVEVNX0FERFIgICAgICAgICAoMHgwMCkKKwkJCQkJCS8qIElFRUUgU2ltcGxlIEVsZW1lbnQgb25seSAqLwogI2RlZmluZSBNUEkyX0lFRUVfU0dFX0ZMQUdTX0lPQ0REUl9BRERSICAgICAgICAgKDB4MDEpCisJCQkJCQkvKiBJRUVFIFNpbXBsZSBFbGVtZW50IG9ubHkgKi8KICNkZWZpbmUgTVBJMl9JRUVFX1NHRV9GTEFHU19JT0NQTEJfQUREUiAgICAgICAgICgweDAyKQogI2RlZmluZSBNUEkyX0lFRUVfU0dFX0ZMQUdTX0lPQ1BMQk5UQV9BRERSICAgICAgKDB4MDMpCi0KKwkJCQkJCS8qIElFRUUgU2ltcGxlIEVsZW1lbnQgb25seSAqLworI2RlZmluZSBNUEkyX0lFRUVfU0dFX0ZMQUdTX1NZU1RFTVBMQkNQSV9BRERSICAgKDB4MDMpCisJCQkJCQkvKiBJRUVFIENoYWluIEVsZW1lbnQgb25seSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgSUVFRSBTR0Ugb3BlcmF0aW9uIE1hY3JvcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfY25mZy5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfY25mZy5oCmluZGV4IGY1YjljNzYuLjYxNDc1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2NuZmcuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9jbmZnLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGFuZCBwYWdlcwogICogIENyZWF0aW9uIERhdGU6ICBOb3ZlbWJlciAxMCwgMjAwNgogICoKLSAqICAgIG1waTJfY25mZy5oIFZlcnNpb246ICAwMi4wMC4xNgorICogICAgbXBpMl9jbmZnLmggVmVyc2lvbjogIDAyLjAwLjE3CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtMTI3LDYgKzEyNywxMyBAQAogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9TQVNfTkVHX0xJTktfUkFURV9VTlNVUFBPUlRFRF9QSFkgZGVmaW5lLgogICogIDA4LTExLTEwICAwMi4wMC4xNiAgUmVtb3ZlZCBJTyBVbml0IFBhZ2UgMSBkZXZpY2UgcGF0aCAobXVsdGktcGF0aGluZykKICAqICAgICAgICAgICAgICAgICAgICAgIGRlZmluZXMuCisgKiAgMTEtMTAtMTAgIDAyLjAwLjE3ICBBZGRlZCBSZWNlcHRhY2xlSUQgZmllbGQgKHJlcGxhY2luZyBSZXNlcnZlZDEpIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBNUEkyX01BTlBBR0U3X0NPTk5FQ1RPUl9JTkZPIGFuZCByZXdvcmtlZCBkZWZpbmVzIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgdGhlIFBpbm91dCBmaWVsZC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEJvYXJkVGVtcGVyYXR1cmUgYW5kIEJvYXJkVGVtcGVyYXR1cmVVbml0cyBmaWVsZHMKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIE1QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF83LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9DT05GSUdfRVhUUEFHRVRZUEVfRVhUX01BTlVGQUNUVVJJTkcgZGVmaW5lCisgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgTVBJMl9DT05GSUdfUEFHRV9FWFRfTUFOX1BTIHN0cnVjdHVyZS4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTIxMCw2ICsyMTcsNyBAQAogI2RlZmluZSBNUEkyX0NPTkZJR19FWFRQQUdFVFlQRV9EUklWRVJfTUFQUElORyAgICAgICgweDE3KQogI2RlZmluZSBNUEkyX0NPTkZJR19FWFRQQUdFVFlQRV9TQVNfUE9SVCAgICAgICAgICAgICgweDE4KQogI2RlZmluZSBNUEkyX0NPTkZJR19FWFRQQUdFVFlQRV9FVEhFUk5FVCAgICAgICAgICAgICgweDE5KQorI2RlZmluZSBNUEkyX0NPTkZJR19FWFRQQUdFVFlQRV9FWFRfTUFOVUZBQ1RVUklORyAgICgweDFBKQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjEyLDIzICs2MjAsMzEgQEAKICAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgUGlub3V0OyAgICAgICAgICAgICAgICAgLyogMHgwMCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0b3JbMTZdOyAgICAgICAgICAvKiAweDA0ICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uOyAgICAgICAgICAgICAgIC8qIDB4MTQgKi8KLSAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgLyogMHgxNSAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNlcHRhY2xlSUQ7ICAgICAgICAgICAvKiAweDE1ICovCiAgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3Q7ICAgICAgICAgICAgICAgICAgIC8qIDB4MTYgKi8KICAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgLyogMHgxOCAqLwogfSBNUEkyX01BTlBBR0U3X0NPTk5FQ1RPUl9JTkZPLCBNUEkyX1BPSU5URVIgUFRSX01QSTJfTUFOUEFHRTdfQ09OTkVDVE9SX0lORk8sCiAgIE1waTJNYW5QYWdlN0Nvbm5lY3RvckluZm9fdCwgTVBJMl9QT0lOVEVSIHBNcGkyTWFuUGFnZTdDb25uZWN0b3JJbmZvX3Q7CiAKIC8qIGRlZmluZXMgZm9yIHRoZSBQaW5vdXQgZmllbGQgKi8KLSNkZWZpbmUgTVBJMl9NQU5QQUdFN19QSU5PVVRfU0ZGXzg0ODRfTDQgICAgICAgICAgICAgICAgKDB4MDAwODAwMDApCi0jZGVmaW5lIE1QSTJfTUFOUEFHRTdfUElOT1VUX1NGRl84NDg0X0wzICAgICAgICAgICAgICAgICgweDAwMDQwMDAwKQotI2RlZmluZSBNUEkyX01BTlBBR0U3X1BJTk9VVF9TRkZfODQ4NF9MMiAgICAgICAgICAgICAgICAoMHgwMDAyMDAwMCkKLSNkZWZpbmUgTVBJMl9NQU5QQUdFN19QSU5PVVRfU0ZGXzg0ODRfTDEgICAgICAgICAgICAgICAgKDB4MDAwMTAwMDApCi0jZGVmaW5lIE1QSTJfTUFOUEFHRTdfUElOT1VUX1NGRl84NDcwX0w0ICAgICAgICAgICAgICAgICgweDAwMDAwODAwKQotI2RlZmluZSBNUEkyX01BTlBBR0U3X1BJTk9VVF9TRkZfODQ3MF9MMyAgICAgICAgICAgICAgICAoMHgwMDAwMDQwMCkKLSNkZWZpbmUgTVBJMl9NQU5QQUdFN19QSU5PVVRfU0ZGXzg0NzBfTDIgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCi0jZGVmaW5lIE1QSTJfTUFOUEFHRTdfUElOT1VUX1NGRl84NDcwX0wxICAgICAgICAgICAgICAgICgweDAwMDAwMTAwKQotI2RlZmluZSBNUEkyX01BTlBBR0U3X1BJTk9VVF9TRkZfODQ4MiAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKLSNkZWZpbmUgTVBJMl9NQU5QQUdFN19QSU5PVVRfQ09OTkVDVElPTl9VTktOT1dOICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1QSTJfTUFOUEFHRTdfUElOT1VUX0xBTkVfTUFTSyAgICAgICAgICAgICAgICAgICgweDAwMDBGRjAwKQorI2RlZmluZSBNUEkyX01BTlBBR0U3X1BJTk9VVF9MQU5FX1NISUZUICAgICAgICAgICAgICAgICAoOCkKKworI2RlZmluZSBNUEkyX01BTlBBR0U3X1BJTk9VVF9UWVBFX01BU0sgICAgICAgICAgICAgICAgICAoMHgwMDAwMDBGRikKKyNkZWZpbmUgTVBJMl9NQU5QQUdFN19QSU5PVVRfVFlQRV9VTktOT1dOICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSTJfTUFOUEFHRTdfUElOT1VUX1NBVEFfU0lOR0xFICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUEkyX01BTlBBR0U3X1BJTk9VVF9TRkZfODQ4MiAgICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJMl9NQU5QQUdFN19QSU5PVVRfU0ZGXzg0ODYgICAgICAgICAgICAgICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSTJfTUFOUEFHRTdfUElOT1VUX1NGRl84NDg0ICAgICAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNUEkyX01BTlBBR0U3X1BJTk9VVF9TRkZfODA4NyAgICAgICAgICAgICAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJMl9NQU5QQUdFN19QSU5PVVRfU0ZGXzg2NDNfNEkgICAgICAgICAgICAgICAgKDB4MDYpCisjZGVmaW5lIE1QSTJfTUFOUEFHRTdfUElOT1VUX1NGRl84NjQzXzhJICAgICAgICAgICAgICAgICgweDA3KQorI2RlZmluZSBNUEkyX01BTlBBR0U3X1BJTk9VVF9TRkZfODQ3MCAgICAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJMl9NQU5QQUdFN19QSU5PVVRfU0ZGXzgwODggICAgICAgICAgICAgICAgICAgKDB4MDkpCisjZGVmaW5lIE1QSTJfTUFOUEFHRTdfUElOT1VUX1NGRl84NjQ0XzRYICAgICAgICAgICAgICAgICgweDBBKQorI2RlZmluZSBNUEkyX01BTlBBR0U3X1BJTk9VVF9TRkZfODY0NF84WCAgICAgICAgICAgICAgICAoMHgwQikKKyNkZWZpbmUgTVBJMl9NQU5QQUdFN19QSU5PVVRfU0ZGXzg2NDRfMTZYICAgICAgICAgICAgICAgKDB4MEMpCisjZGVmaW5lIE1QSTJfTUFOUEFHRTdfUElOT1VUX1NGRl84NDM2ICAgICAgICAgICAgICAgICAgICgweDBEKQogCiAvKiBkZWZpbmVzIGZvciB0aGUgTG9jYXRpb24gZmllbGQgKi8KICNkZWZpbmUgTVBJMl9NQU5QQUdFN19MT0NBVElPTl9VTktOT1dOICAgICAgICAgICAgICAgICAgKDB4MDEpCkBAIC02NjIsNyArNjc4LDcgQEAKICAgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0NPTkZJR19QQUdFX01BTl83LAogICBNcGkyTWFudWZhY3R1cmluZ1BhZ2U3X3QsIE1QSTJfUE9JTlRFUiBwTXBpMk1hbnVmYWN0dXJpbmdQYWdlN190OwogCi0jZGVmaW5lIE1QSTJfTUFOVUZBQ1RVUklORzdfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUEkyX01BTlVGQUNUVVJJTkc3X1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAoMHgwMSkKIAogLyogZGVmaW5lcyBmb3IgdGhlIEZsYWdzIGZpZWxkICovCiAjZGVmaW5lIE1QSTJfTUFOUEFHRTdfRkxBR19VU0VfU0xPVF9JTkZPICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQpAQCAtODQ5LDExICs4NjUsMTMgQEAKICAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NUZW1wZXJhdHVyZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgxMCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIElPQ1RlbXBlcmF0dXJlVW5pdHM7ICAgICAgICAgICAgICAgICAgICAvKiAweDEyICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgSU9DU3BlZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTMgKi8KLSAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgxNCAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIEJvYXJkVGVtcGVyYXR1cmU7ICAgICAgICAgICAgICAvKiAweDE0ICovCisJVTggICAgICAgICAgICAgICAgICAgICAgQm9hcmRUZW1wZXJhdHVyZVVuaXRzOyAgICAgICAgIC8qIDB4MTYgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgICAgLyogMHgxNyAqLwogfSBNUEkyX0NPTkZJR19QQUdFX0lPX1VOSVRfNywgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0NPTkZJR19QQUdFX0lPX1VOSVRfNywKICAgTXBpMklPVW5pdFBhZ2U3X3QsIE1QSTJfUE9JTlRFUiBwTXBpMklPVW5pdFBhZ2U3X3Q7CiAKLSNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICgweDAyKQogCiAvKiBkZWZpbmVzIGZvciBJTyBVbml0IFBhZ2UgNyBQQ0llV2lkdGggZmllbGQgKi8KICNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19QQ0lFX1dJRFRIX1gxICAgICAgICAgICAgICAoMHgwMSkKQEAgLTg4MSw3ICs4OTksNiBAQAogI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X1BNQ0FQX1BDSUVfV0lEVEhfQ0hBTkdFICAgICgweDAwMDAwMDA4KQogI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U3X1BNQ0FQX1BDSUVfU1BFRURfQ0hBTkdFICAgICgweDAwMDAwMDA0KQogCi0KIC8qIGRlZmluZXMgZm9yIElPIFVuaXQgUGFnZSA3IElPQ1RlbXBlcmF0dXJlVW5pdHMgZmllbGQgKi8KICNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19JT0NfVEVNUF9OT1RfUFJFU0VOVCAgICAgICAoMHgwMCkKICNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19JT0NfVEVNUF9GQUhSRU5IRUlUICAgICAgICAoMHgwMSkKQEAgLTg5Myw2ICs5MTAsMTEgQEAKICNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19JT0NfU1BFRURfUVVBUlRFUiAgICAgICAgICAoMHgwNCkKICNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19JT0NfU1BFRURfRUlHSFRIICAgICAgICAgICAoMHgwOCkKIAorLyogZGVmaW5lcyBmb3IgSU8gVW5pdCBQYWdlIDcgQm9hcmRUZW1wZXJhdHVyZVVuaXRzIGZpZWxkICovCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfQk9BUkRfVEVNUF9OT1RfUFJFU0VOVCAgICAgKDB4MDApCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfQk9BUkRfVEVNUF9GQUhSRU5IRUlUICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfQk9BUkRfVEVNUF9DRUxTSVVTICAgICAgICAgKDB4MDIpCisKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjc5OSw1ICsyODIxLDI1IEBACiAjZGVmaW5lIE1QSTJfRVRIUEcxX01TX0RBVEFfUkFURV8xR0JJVCAgICAgICAgICAgICAgKDB4MDMpCiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBFeHRlbmRlZCBNYW51ZmFjdHVyaW5nIENvbmZpZyBQYWdlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEdlbmVyaWMgc3RydWN0dXJlIHRvIHVzZSBmb3IgcHJvZHVjdC1zcGVjaWZpYyBleHRlbmRlZCBtYW51ZmFjdHVyaW5nIHBhZ2VzCisgKiAoY3VycmVudGx5IEV4dGVuZGVkIE1hbnVmYWN0dXJpbmcgUGFnZSA0MCB0aHJvdWdoIEV4dGVuZGVkIE1hbnVmYWN0dXJpbmcKKyAqIFBhZ2UgNjApLgorICovCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX0NPTkZJR19QQUdFX0VYVF9NQU5fUFMgeworCU1QSTJfQ09ORklHX0VYVEVOREVEX1BBR0VfSEVBREVSICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0U3BlY2lmaWNJbmZvOyAgICAvKiAweDA4ICovCit9CU1QSTJfQ09ORklHX1BBR0VfRVhUX01BTl9QUywKKwlNUEkyX1BPSU5URVIgUFRSX01QSTJfQ09ORklHX1BBR0VfRVhUX01BTl9QUywKKwlNcGkyRXh0TWFudWZhY3R1cmluZ1BhZ2VQU190LAorCU1QSTJfUE9JTlRFUiBwTXBpMkV4dE1hbnVmYWN0dXJpbmdQYWdlUFNfdDsKKworLyogUGFnZVZlcnNpb24gc2hvdWxkIGJlIHByb3ZpZGVkIGJ5IHByb2R1Y3Qtc3BlY2lmaWMgY29kZSAqLworCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW5pdC5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW5pdC5oCmluZGV4IDE2NTQ1NGQuLmRlOTAxNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2luaXQuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9pbml0LmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBTQ1NJIGluaXRpYXRvciBtb2RlIG1lc3NhZ2VzIGFuZCBzdHJ1Y3R1cmVzCiAgKiAgQ3JlYXRpb24gRGF0ZTogIEp1bmUgMjMsIDIwMDYKICAqCi0gKiAgICBtcGkyX2luaXQuaCBWZXJzaW9uOiAgMDIuMDAuMTAKKyAqICAgIG1waTJfaW5pdC5oIFZlcnNpb246ICAwMi4wMC4xMQogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTMzLDYgKzMzLDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfU0NTSVRBU0tNR01UX1JTUF9UTV9PVkVSTEFQUEVEX1RBRyBkZWZpbmUuCiAgKiAgMDItMTAtMTAgIDAyLjAwLjA5ICBSZW1vdmVkIHVudXNlZCBzdHJ1Y3R1cmUgdGhhdCBoYWQgIiNpZiAwIiBhcm91bmQgaXQuCiAgKiAgMDUtMTItMTAgIDAyLjAwLjEwICBBZGRlZCBvcHRpb25hbCB2ZW5kb3ItdW5pcXVlIHJlZ2lvbiB0byBTQ1NJIElPIFJlcXVlc3QuCisgKiAgMTEtMTAtMTAgIDAyLjAwLjExICBBZGRlZCBNUEkyX1NDU0lJT19OVU1fU0dMT0ZGU0VUUyBkZWZpbmUuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC0xMzksNiArMTQwLDkgQEAKICNkZWZpbmUgTVBJMl9TQ1NJSU9fU0dMRkxBR1NfU0dMMV9TSElGVCAgICAgICAgICAgICAoNCkKICNkZWZpbmUgTVBJMl9TQ1NJSU9fU0dMRkxBR1NfU0dMMF9TSElGVCAgICAgICAgICAgICAoMCkKIAorLyogbnVtYmVyIG9mIFNHTE9mZnNldCBmaWVsZHMgKi8KKyNkZWZpbmUgTVBJMl9TQ1NJSU9fTlVNX1NHTE9GRlNFVFMgICAgICAgICAgICAgICAgICAoNCkKKwogLyogU0NTSSBJTyBJb0ZsYWdzIGJpdHMgKi8KIAogLyogTGFyZ2UgQ0RCIEFkZHJlc3MgU3BhY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW9jLmgKaW5kZXggNzYxY2JkYi4uMWYwYzE5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW9jLmgKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW9jLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBJT0MsIFBvcnQsIEV2ZW50LCBGVyBEb3dubG9hZCwgYW5kIEZXIFVwbG9hZCBtZXNzYWdlcwogICogIENyZWF0aW9uIERhdGU6ICBPY3RvYmVyIDExLCAyMDA2CiAgKgotICogIG1waTJfaW9jLmggVmVyc2lvbjogIDAyLjAwLjE1CisgKiAgbXBpMl9pb2MuaCBWZXJzaW9uOiAgMDIuMDAuMTYKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDMsNiArMTAzLDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIGRlZmluZXMuCiAgKiAgMDUtMTItMTAgIDAyLjAwLjE1ICBNYXJrZWQgVGFzayBTZXQgRnVsbCBFdmVudCBhcyBvYnNvbGV0ZS4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfRVZFTlRfU0FTX1RPUE9fTFJfVU5TVVBQT1JURURfUEhZIGRlZmluZS4KKyAqICAxMS0xMC0xMCAgMDIuMDAuMTYgIEFkZGVkIE1QSTJfRldfRE9XTkxPQURfSVRZUEVfTUlOX1BST0RVQ1RfU1BFQ0lGSUMuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC0xMDMyLDYgKzEwMzMsNyBAQAogI2RlZmluZSBNUEkyX0ZXX0RPV05MT0FEX0lUWVBFX01FR0FSQUlEICAgICAgICAgICAgICgweDA5KQogI2RlZmluZSBNUEkyX0ZXX0RPV05MT0FEX0lUWVBFX0NPTVBMRVRFICAgICAgICAgICAgICgweDBBKQogI2RlZmluZSBNUEkyX0ZXX0RPV05MT0FEX0lUWVBFX0NPTU1PTl9CT09UX0JMT0NLICAgICgweDBCKQorI2RlZmluZSBNUEkyX0ZXX0RPV05MT0FEX0lUWVBFX01JTl9QUk9EVUNUX1NQRUNJRklDICgweEYwKQogCiAvKiBGV0Rvd25sb2FkIFRyYW5zYWN0aW9uQ29udGV4dCBFbGVtZW50ICovCiB0eXBlZGVmIHN0cnVjdCBfTVBJMl9GV19ET1dOTE9BRF9UQ1NHRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuYwppbmRleCBlZmEwMjU1Li44MzAzNWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuYwpAQCAtOTQsNyArOTQsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhkaWFnX2J1ZmZlcl9lbmFibGUsICIgcG9zdCBkaWFnIGJ1ZmZlcnMgIgogICAgICIoVFJBQ0U9MS9TTkFQU0hPVD0yL0VYVEVOREVEPTQvZGVmYXVsdD0wKSIpOwogCi1pbnQgbXB0MnNhc19md2ZhdWx0X2RlYnVnOworc3RhdGljIGludCBtcHQyc2FzX2Z3ZmF1bHRfZGVidWc7CiBNT0RVTEVfUEFSTV9ERVNDKG1wdDJzYXNfZndmYXVsdF9kZWJ1ZywgIiBlbmFibGUgZGV0ZWN0aW9uIG9mIGZpcm13YXJlIGZhdWx0ICIKICAgICAiYW5kIGhhbHQgZmlybXdhcmUgLSAoZGVmYXVsdD0wKSIpOwogCkBAIC04NTcsNyArODU3LDcgQEAKIAljb21wbGV0ZWRfY21kcyA9IDA7CiAJY2JfaWR4ID0gMHhGRjsKIAlkbyB7Ci0JCXJkLndvcmQgPSBycGYtPldvcmRzOworCQlyZC53b3JkID0gbGU2NF90b19jcHUocnBmLT5Xb3Jkcyk7CiAJCWlmIChyZC51LmxvdyA9PSBVSU5UX01BWCB8fCByZC51LmhpZ2ggPT0gVUlOVF9NQVgpCiAJCQlnb3RvIG91dDsKIAkJcmVwbHkgPSAwOwpAQCAtOTA2LDcgKzkwNiw3IEBACiAKICBuZXh0OgogCi0JCXJwZi0+V29yZHMgPSBVTExPTkdfTUFYOworCQlycGYtPldvcmRzID0gY3B1X3RvX2xlNjQoVUxMT05HX01BWCk7CiAJCWlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4ID0gKGlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4ID09CiAJCSAgICAoaW9jLT5yZXBseV9wb3N0X3F1ZXVlX2RlcHRoIC0gMSkpID8gMCA6CiAJCSAgICBpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleCArIDE7CkBAIC0xNzQwLDkgKzE3NDAsMTEgQEAKIHN0YXRpYyB2b2lkCiBfYmFzZV9kaXNwbGF5X2ludGVsX2JyYW5kaW5nKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYykKIHsKLQlpZiAoaW9jLT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfSU5URUwgJiYKLQkgICAgaW9jLT5wZGV2LT5kZXZpY2UgPT0gTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIwMDgpIHsKKwlpZiAoaW9jLT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yICE9IFBDSV9WRU5ET1JfSURfSU5URUwpCisJCXJldHVybjsKIAorCXN3aXRjaCAoaW9jLT5wZGV2LT5kZXZpY2UpIHsKKwljYXNlIE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMDA4OgogCQlzd2l0Y2ggKGlvYy0+cGRldi0+c3Vic3lzdGVtX2RldmljZSkgewogCQljYXNlIE1QVDJTQVNfSU5URUxfUk1TMkxMMDgwX1NTRElEOgogCQkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCkBAIC0xNzUyLDcgKzE3NTQsMjAgQEAKIAkJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlc1xuIiwgaW9jLT5uYW1lLAogCQkJICAgIE1QVDJTQVNfSU5URUxfUk1TMkxMMDQwX0JSQU5ESU5HKTsKIAkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CiAJCX0KKwljYXNlIE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMzA4XzI6CisJCXN3aXRjaCAoaW9jLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CisJCWNhc2UgTVBUMlNBU19JTlRFTF9SUzI1R0IwMDhfU1NESUQ6CisJCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKKwkJCSAgICBNUFQyU0FTX0lOVEVMX1JTMjVHQjAwOF9CUkFORElORyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogfQogCkBAIC0xODE3LDcgKzE4MzIsOSBAQAogCWNoYXIgZGVzY1sxNl07CiAJdTggcmV2aXNpb247CiAJdTMyIGlvdW5pdF9wZzFfZmxhZ3M7CisJdTMyIGJpb3NfdmVyc2lvbjsKIAorCWJpb3NfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KGlvYy0+Ymlvc19wZzMuQmlvc1ZlcnNpb24pOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGlvYy0+cGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmcmV2aXNpb24pOwogCXN0cm5jcHkoZGVzYywgaW9jLT5tYW51X3BnMC5DaGlwTmFtZSwgMTYpOwogCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogRldWZXJzaW9uKCUwMmQuJTAyZC4lMDJkLiUwMmQpLCAiCkBAIC0xODI4LDEwICsxODQ1LDEwIEBACiAJICAgKGlvYy0+ZmFjdHMuRldWZXJzaW9uLldvcmQgJiAweDAwMDBGRjAwKSA+PiA4LAogCSAgIGlvYy0+ZmFjdHMuRldWZXJzaW9uLldvcmQgJiAweDAwMDAwMEZGLAogCSAgIHJldmlzaW9uLAotCSAgIChpb2MtPmJpb3NfcGczLkJpb3NWZXJzaW9uICYgMHhGRjAwMDAwMCkgPj4gMjQsCi0JICAgKGlvYy0+Ymlvc19wZzMuQmlvc1ZlcnNpb24gJiAweDAwRkYwMDAwKSA+PiAxNiwKLQkgICAoaW9jLT5iaW9zX3BnMy5CaW9zVmVyc2lvbiAmIDB4MDAwMEZGMDApID4+IDgsCi0JICAgIGlvYy0+Ymlvc19wZzMuQmlvc1ZlcnNpb24gJiAweDAwMDAwMEZGKTsKKwkgICAoYmlvc192ZXJzaW9uICYgMHhGRjAwMDAwMCkgPj4gMjQsCisJICAgKGJpb3NfdmVyc2lvbiAmIDB4MDBGRjAwMDApID4+IDE2LAorCSAgIChiaW9zX3ZlcnNpb24gJiAweDAwMDBGRjAwKSA+PiA4LAorCSAgICBiaW9zX3ZlcnNpb24gJiAweDAwMDAwMEZGKTsKIAogCV9iYXNlX2Rpc3BsYXlfZGVsbF9icmFuZGluZyhpb2MpOwogCV9iYXNlX2Rpc3BsYXlfaW50ZWxfYnJhbmRpbmcoaW9jKTsKQEAgLTIxNTAsNyArMjE2Nyw3IEBACiBzdGF0aWMgaW50CiBfYmFzZV9hbGxvY2F0ZV9tZW1vcnlfcG9vbHMoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCAgaW50IHNsZWVwX2ZsYWcpCiB7Ci0JTXBpMklPQ0ZhY3RzUmVwbHlfdCAqZmFjdHM7CisJc3RydWN0IG1wdDJzYXNfZmFjdHMgKmZhY3RzOwogCXUzMiBxdWV1ZV9zaXplLCBxdWV1ZV9kaWZmOwogCXUxNiBtYXhfc2dlX2VsZW1lbnRzOwogCXUxNiBudW1fb2ZfcmVwbHlfZnJhbWVzOwpAQCAtMjc4Myw3ICsyODAwLDcgQEAKIAlpbnQgaTsKIAl1OCBmYWlsZWQ7CiAJdTE2IGR1bW15OwotCXUzMiAqbWZwOworCV9fbGUzMiAqbWZwOwogCiAJLyogbWFrZSBzdXJlIGRvb3JiZWxsIGlzIG5vdCBpbiB1c2UgKi8KIAlpZiAoKHJlYWRsKCZpb2MtPmNoaXAtPkRvb3JiZWxsKSAmIE1QSTJfRE9PUkJFTExfVVNFRCkpIHsKQEAgLTI4NzEsNyArMjg4OCw3IEBACiAJd3JpdGVsKDAsICZpb2MtPmNoaXAtPkhvc3RJbnRlcnJ1cHRTdGF0dXMpOwogCiAJaWYgKGlvYy0+bG9nZ2luZ19sZXZlbCAmIE1QVF9ERUJVR19JTklUKSB7Ci0JCW1mcCA9ICh1MzIgKilyZXBseTsKKwkJbWZwID0gKF9fbGUzMiAqKXJlcGx5OwogCQlwcmludGsoS0VSTl9JTkZPICJcdG9mZnNldDpkYXRhXG4iKTsKIAkJZm9yIChpID0gMDsgaSA8IHJlcGx5X2J5dGVzLzQ7IGkrKykKIAkJCXByaW50ayhLRVJOX0lORk8gIlx0WzB4JTAyeF06JTA4eFxuIiwgaSo0LApAQCAtMzA5Nyw3ICszMTE0LDggQEAKIF9iYXNlX2dldF9wb3J0X2ZhY3RzKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgaW50IHBvcnQsIGludCBzbGVlcF9mbGFnKQogewogCU1waTJQb3J0RmFjdHNSZXF1ZXN0X3QgbXBpX3JlcXVlc3Q7Ci0JTXBpMlBvcnRGYWN0c1JlcGx5X3QgbXBpX3JlcGx5LCAqcGZhY3RzOworCU1waTJQb3J0RmFjdHNSZXBseV90IG1waV9yZXBseTsKKwlzdHJ1Y3QgbXB0MnNhc19wb3J0X2ZhY3RzICpwZmFjdHM7CiAJaW50IG1waV9yZXBseV9zeiwgbXBpX3JlcXVlc3Rfc3osIHI7CiAKIAlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlc1xuIiwgaW9jLT5uYW1lLApAQCAtMzEzOSw3ICszMTU3LDggQEAKIF9iYXNlX2dldF9pb2NfZmFjdHMoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBfZmxhZykKIHsKIAlNcGkySU9DRmFjdHNSZXF1ZXN0X3QgbXBpX3JlcXVlc3Q7Ci0JTXBpMklPQ0ZhY3RzUmVwbHlfdCBtcGlfcmVwbHksICpmYWN0czsKKwlNcGkySU9DRmFjdHNSZXBseV90IG1waV9yZXBseTsKKwlzdHJ1Y3QgbXB0MnNhc19mYWN0cyAqZmFjdHM7CiAJaW50IG1waV9yZXBseV9zeiwgbXBpX3JlcXVlc3Rfc3osIHI7CiAKIAlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlc1xuIiwgaW9jLT5uYW1lLApAQCAtMzIyNSwxNyArMzI0NCw2IEBACiAJbXBpX3JlcXVlc3QuTXNnVmVyc2lvbiA9IGNwdV90b19sZTE2KE1QSTJfVkVSU0lPTik7CiAJbXBpX3JlcXVlc3QuSGVhZGVyVmVyc2lvbiA9IGNwdV90b19sZTE2KE1QSTJfSEVBREVSX1ZFUlNJT04pOwogCi0JLyogSW4gTVBJIFJldmlzaW9uIEkgKDB4QSksIHRoZSBTeXN0ZW1SZXBseUZyYW1lU2l6ZShvZmZzZXQgMHgxOCkgd2FzCi0JICogcmVtb3ZlZCBhbmQgbWFkZSByZXNlcnZlZC4gIEZvciB0aG9zZSB3aXRoIG9sZGVyIGZpcm13YXJlIHdpbGwgbmVlZAotCSAqIHRoaXMgZml4LiBJdCB3YXMgZGVjaWRlZCB0aGF0IHRoZSBSZXBseSBhbmQgUmVxdWVzdCBmcmFtZSBzaXplcyBhcmUKLQkgKiB0aGUgc2FtZS4KLQkgKi8KLQlpZiAoKGlvYy0+ZmFjdHMuSGVhZGVyVmVyc2lvbiA+PiA4KSA8IDB4QSkgewotCQltcGlfcmVxdWVzdC5SZXNlcnZlZDcgPSBjcHVfdG9fbGUxNihpb2MtPnJlcGx5X3N6KTsKLS8qCQltcGlfcmVxdWVzdC5TeXN0ZW1SZXBseUZyYW1lU2l6ZSA9Ci0gKgkJIGNwdV90b19sZTE2KGlvYy0+cmVwbHlfc3opOwotICovCi0JfQogCiAJbXBpX3JlcXVlc3QuU3lzdGVtUmVxdWVzdEZyYW1lU2l6ZSA9IGNwdV90b19sZTE2KGlvYy0+cmVxdWVzdF9zei80KTsKIAltcGlfcmVxdWVzdC5SZXBseURlc2NyaXB0b3JQb3N0UXVldWVEZXB0aCA9CkBAIC0zMjQzLDI1ICszMjUxLDE3IEBACiAJbXBpX3JlcXVlc3QuUmVwbHlGcmVlUXVldWVEZXB0aCA9CiAJICAgIGNwdV90b19sZTE2KGlvYy0+cmVwbHlfZnJlZV9xdWV1ZV9kZXB0aCk7CiAKLSNpZiBCSVRTX1BFUl9MT05HID4gMzIKIAltcGlfcmVxdWVzdC5TZW5zZUJ1ZmZlckFkZHJlc3NIaWdoID0KLQkgICAgY3B1X3RvX2xlMzIoaW9jLT5zZW5zZV9kbWEgPj4gMzIpOworCSAgICBjcHVfdG9fbGUzMigodTY0KWlvYy0+c2Vuc2VfZG1hID4+IDMyKTsKIAltcGlfcmVxdWVzdC5TeXN0ZW1SZXBseUFkZHJlc3NIaWdoID0KLQkgICAgY3B1X3RvX2xlMzIoaW9jLT5yZXBseV9kbWEgPj4gMzIpOworCSAgICBjcHVfdG9fbGUzMigodTY0KWlvYy0+cmVwbHlfZG1hID4+IDMyKTsKIAltcGlfcmVxdWVzdC5TeXN0ZW1SZXF1ZXN0RnJhbWVCYXNlQWRkcmVzcyA9Ci0JICAgIGNwdV90b19sZTY0KGlvYy0+cmVxdWVzdF9kbWEpOworCSAgICBjcHVfdG9fbGU2NCgodTY0KWlvYy0+cmVxdWVzdF9kbWEpOwogCW1waV9yZXF1ZXN0LlJlcGx5RnJlZVF1ZXVlQWRkcmVzcyA9Ci0JICAgIGNwdV90b19sZTY0KGlvYy0+cmVwbHlfZnJlZV9kbWEpOworCSAgICBjcHVfdG9fbGU2NCgodTY0KWlvYy0+cmVwbHlfZnJlZV9kbWEpOwogCW1waV9yZXF1ZXN0LlJlcGx5RGVzY3JpcHRvclBvc3RRdWV1ZUFkZHJlc3MgPQotCSAgICBjcHVfdG9fbGU2NChpb2MtPnJlcGx5X3Bvc3RfZnJlZV9kbWEpOwotI2Vsc2UKLQltcGlfcmVxdWVzdC5TeXN0ZW1SZXF1ZXN0RnJhbWVCYXNlQWRkcmVzcyA9Ci0JICAgIGNwdV90b19sZTMyKGlvYy0+cmVxdWVzdF9kbWEpOwotCW1waV9yZXF1ZXN0LlJlcGx5RnJlZVF1ZXVlQWRkcmVzcyA9Ci0JICAgIGNwdV90b19sZTMyKGlvYy0+cmVwbHlfZnJlZV9kbWEpOwotCW1waV9yZXF1ZXN0LlJlcGx5RGVzY3JpcHRvclBvc3RRdWV1ZUFkZHJlc3MgPQotCSAgICBjcHVfdG9fbGUzMihpb2MtPnJlcGx5X3Bvc3RfZnJlZV9kbWEpOwotI2VuZGlmCisJICAgIGNwdV90b19sZTY0KCh1NjQpaW9jLT5yZXBseV9wb3N0X2ZyZWVfZG1hKTsKKwogCiAJLyogVGhpcyB0aW1lIHN0YW1wIHNwZWNpZmllcyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCiAJICogc2luY2UgZXBvY2ggfiBtaWRuaWdodCBKYW51YXJ5IDEsIDE5NzAuCkBAIC0zMjcxLDEwICszMjcxLDEwIEBACiAJICAgIChjdXJyZW50X3RpbWUudHZfdXNlYyAvIDEwMDApKTsKIAogCWlmIChpb2MtPmxvZ2dpbmdfbGV2ZWwgJiBNUFRfREVCVUdfSU5JVCkgewotCQl1MzIgKm1mcDsKKwkJX19sZTMyICptZnA7CiAJCWludCBpOwogCi0JCW1mcCA9ICh1MzIgKikmbXBpX3JlcXVlc3Q7CisJCW1mcCA9IChfX2xlMzIgKikmbXBpX3JlcXVlc3Q7CiAJCXByaW50ayhLRVJOX0lORk8gIlx0b2Zmc2V0OmRhdGFcbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKE1waTJJT0NJbml0UmVxdWVzdF90KS80OyBpKyspCiAJCQlwcmludGsoS0VSTl9JTkZPICJcdFsweCUwMnhdOiUwOHhcbiIsIGkqNCwKQEAgLTM3NTksNyArMzc1OSw3IEBACiAKIAkvKiBpbml0aWFsaXplIFJlcGx5IFBvc3QgRnJlZSBRdWV1ZSAqLwogCWZvciAoaSA9IDA7IGkgPCBpb2MtPnJlcGx5X3Bvc3RfcXVldWVfZGVwdGg7IGkrKykKLQkJaW9jLT5yZXBseV9wb3N0X2ZyZWVbaV0uV29yZHMgPSBVTExPTkdfTUFYOworCQlpb2MtPnJlcGx5X3Bvc3RfZnJlZVtpXS5Xb3JkcyA9IGNwdV90b19sZTY0KFVMTE9OR19NQVgpOwogCiAJciA9IF9iYXNlX3NlbmRfaW9jX2luaXQoaW9jLCBzbGVlcF9mbGFnKTsKIAlpZiAocikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmgKaW5kZXggZGNjMjg5Yy4uOGQ1YmUyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmgKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmgKQEAgLTY5LDExICs2OSwxMSBAQAogI2RlZmluZSBNUFQyU0FTX0RSSVZFUl9OQU1FCQkibXB0MnNhcyIKICNkZWZpbmUgTVBUMlNBU19BVVRIT1IJIkxTSSBDb3Jwb3JhdGlvbiA8REwtTVBURnVzaW9uTGludXhAbHNpLmNvbT4iCiAjZGVmaW5lIE1QVDJTQVNfREVTQ1JJUFRJT04JIkxTSSBNUFQgRnVzaW9uIFNBUyAyLjAgRGV2aWNlIERyaXZlciIKLSNkZWZpbmUgTVBUMlNBU19EUklWRVJfVkVSU0lPTgkJIjA4LjEwMC4wMC4wMiIKLSNkZWZpbmUgTVBUMlNBU19NQUpPUl9WRVJTSU9OCQkwOAorI2RlZmluZSBNUFQyU0FTX0RSSVZFUl9WRVJTSU9OCQkiMDkuMTAwLjAwLjAwIgorI2RlZmluZSBNUFQyU0FTX01BSk9SX1ZFUlNJT04JCTA5CiAjZGVmaW5lIE1QVDJTQVNfTUlOT1JfVkVSU0lPTgkJMTAwCiAjZGVmaW5lIE1QVDJTQVNfQlVJTERfVkVSU0lPTgkJMDAKLSNkZWZpbmUgTVBUMlNBU19SRUxFQVNFX1ZFUlNJT04JCTAyCisjZGVmaW5lIE1QVDJTQVNfUkVMRUFTRV9WRVJTSU9OCQkwMAogCiAvKgogICogU2V0IE1QVDJTQVNfU0dfREVQVEggdmFsdWUgYmFzZWQgb24gdXNlciBpbnB1dC4KQEAgLTE2MSwxMiArMTYxLDE1IEBACiAJCQkJIkludGVsIEludGVncmF0ZWQgUkFJRCBNb2R1bGUgUk1TMkxMMDgwIgogI2RlZmluZSBNUFQyU0FTX0lOVEVMX1JNUzJMTDA0MF9CUkFORElORwlcCiAJCQkJIkludGVsIEludGVncmF0ZWQgUkFJRCBNb2R1bGUgUk1TMkxMMDQwIgorI2RlZmluZSBNUFQyU0FTX0lOVEVMX1JTMjVHQjAwOF9CUkFORElORyAgICAgICBcCisJCQkJIkludGVsKFIpIFJBSUQgQ29udHJvbGxlciBSUzI1R0IwMDgiCiAKIC8qCiAgKiBJbnRlbCBIQkEgU1NESURzCiAgKi8KICNkZWZpbmUgTVBUMlNBU19JTlRFTF9STVMyTEwwODBfU1NESUQgICAgICAgICAgMHgzNTBFCiAjZGVmaW5lIE1QVDJTQVNfSU5URUxfUk1TMkxMMDQwX1NTRElEICAgICAgICAgIDB4MzUwRgorI2RlZmluZSBNUFQyU0FTX0lOVEVMX1JTMjVHQjAwOF9TU0RJRCAgICAgICAgICAweDMwMDAKIAogCiAvKgpAQCAtNTQxLDYgKzU0NCw2MyBAQAogCiB0eXBlZGVmIHZvaWQgKCpNUFRfQUREX1NHRSkodm9pZCAqcGFkZHIsIHUzMiBmbGFnc19sZW5ndGgsIGRtYV9hZGRyX3QgZG1hX2FkZHIpOwogCisvKiBJT0MgRmFjdHMgYW5kIFBvcnQgRmFjdHMgY29udmVydGVkIGZyb20gbGl0dGxlIGVuZGlhbiB0byBjcHUgKi8KK3VuaW9uIG1waTJfdmVyc2lvbl91bmlvbiB7CisJTVBJMl9WRVJTSU9OX1NUUlVDVAkJU3RydWN0OworCXUzMgkJCQlXb3JkOworfTsKKworc3RydWN0IG1wdDJzYXNfZmFjdHMgeworCXUxNgkJCU1zZ1ZlcnNpb247CisJdTE2CQkJSGVhZGVyVmVyc2lvbjsKKwl1OAkJCUlPQ051bWJlcjsKKwl1OAkJCVZQX0lEOworCXU4CQkJVkZfSUQ7CisJdTE2CQkJSU9DRXhjZXB0aW9uczsKKwl1MTYJCQlJT0NTdGF0dXM7CisJdTMyCQkJSU9DTG9nSW5mbzsKKwl1OAkJCU1heENoYWluRGVwdGg7CisJdTgJCQlXaG9Jbml0OworCXU4CQkJTnVtYmVyT2ZQb3J0czsKKwl1OAkJCU1heE1TSXhWZWN0b3JzOworCXUxNgkJCVJlcXVlc3RDcmVkaXQ7CisJdTE2CQkJUHJvZHVjdElEOworCXUzMgkJCUlPQ0NhcGFiaWxpdGllczsKKwl1bmlvbiBtcGkyX3ZlcnNpb25fdW5pb24JRldWZXJzaW9uOworCXUxNgkJCUlPQ1JlcXVlc3RGcmFtZVNpemU7CisJdTE2CQkJUmVzZXJ2ZWQzOworCXUxNgkJCU1heEluaXRpYXRvcnM7CisJdTE2CQkJTWF4VGFyZ2V0czsKKwl1MTYJCQlNYXhTYXNFeHBhbmRlcnM7CisJdTE2CQkJTWF4RW5jbG9zdXJlczsKKwl1MTYJCQlQcm90b2NvbEZsYWdzOworCXUxNgkJCUhpZ2hQcmlvcml0eUNyZWRpdDsKKwl1MTYJCQlNYXhSZXBseURlc2NyaXB0b3JQb3N0UXVldWVEZXB0aDsKKwl1OAkJCVJlcGx5RnJhbWVTaXplOworCXU4CQkJTWF4Vm9sdW1lczsKKwl1MTYJCQlNYXhEZXZIYW5kbGU7CisJdTE2CQkJTWF4UGVyc2lzdGVudEVudHJpZXM7CisJdTE2CQkJTWluRGV2SGFuZGxlOworfTsKKworc3RydWN0IG1wdDJzYXNfcG9ydF9mYWN0cyB7CisJdTgJCQlQb3J0TnVtYmVyOworCXU4CQkJVlBfSUQ7CisJdTgJCQlWRl9JRDsKKwl1OAkJCVBvcnRUeXBlOworCXUxNgkJCU1heFBvc3RlZENtZEJ1ZmZlcnM7Cit9OworCisvKioKKyAqIGVudW0gbXV0ZXhfdHlwZSAtIHRhc2sgbWFuYWdlbWVudCBtdXRleCB0eXBlCisgKiBAVE1fTVVURVhfT0ZGOiBtdXRleCBpcyBub3QgcmVxdWlyZWQgYmVjdWFzZSBjYWxsaW5nIGZ1bmN0aW9uIGlzIGFjcXVpcmluZyBpdAorICogQFRNX01VVEVYX09OOiBtdXRleCBpcyByZXF1aXJlZAorICovCitlbnVtIG11dGV4X3R5cGUgeworCVRNX01VVEVYX09GRiA9IDAsCisJVE1fTVVURVhfT04gPSAxLAorfTsKKwogLyoqCiAgKiBzdHJ1Y3QgTVBUMlNBU19BREFQVEVSIC0gcGVyIGFkYXB0ZXIgc3RydWN0CiAgKiBAbGlzdDogaW9jX2xpc3QKQEAgLTcwMyw2ICs3NjMsNyBAQAogCSAvKiBtaXNjIGZsYWdzICovCiAJaW50CQlhZW5fZXZlbnRfcmVhZF9mbGFnOwogCXU4CQlicm9hZGNhc3RfYWVuX2J1c3k7CisJdTE2CQlicm9hZGNhc3RfYWVuX3BlbmRpbmc7CiAJdTgJCXNob3N0X3JlY292ZXJ5OwogCiAJc3RydWN0IG11dGV4CXJlc2V0X2luX3Byb2dyZXNzX211dGV4OwpAQCAtNzQ5LDggKzgxMCw4IEBACiAJdTMyCQlldmVudF9tYXNrc1tNUEkyX0VWRU5UX05PVElGWV9FVkVOVE1BU0tfV09SRFNdOwogCiAJLyogc3RhdGljIGNvbmZpZyBwYWdlcyAqLwotCU1waTJJT0NGYWN0c1JlcGx5X3QgZmFjdHM7Ci0JTXBpMlBvcnRGYWN0c1JlcGx5X3QgKnBmYWN0czsKKwlzdHJ1Y3QgbXB0MnNhc19mYWN0cyBmYWN0czsKKwlzdHJ1Y3QgbXB0MnNhc19wb3J0X2ZhY3RzICpwZmFjdHM7CiAJTXBpMk1hbnVmYWN0dXJpbmdQYWdlMF90IG1hbnVfcGcwOwogCU1waTJCaW9zUGFnZTJfdAliaW9zX3BnMjsKIAlNcGkyQmlvc1BhZ2UzX3QJYmlvc19wZzM7CkBAIC04NDAsNyArOTAxLDcgQEAKIAogCS8qIHJlcGx5IGZyZWUgcXVldWUgKi8KIAl1MTYgCQlyZXBseV9mcmVlX3F1ZXVlX2RlcHRoOwotCXUzMgkJKnJlcGx5X2ZyZWU7CisJX19sZTMyCQkqcmVwbHlfZnJlZTsKIAlkbWFfYWRkcl90CXJlcGx5X2ZyZWVfZG1hOwogCXN0cnVjdCBkbWFfcG9vbCAqcmVwbHlfZnJlZV9kbWFfcG9vbDsKIAl1MzIJCXJlcGx5X2ZyZWVfaG9zdF9pbmRleDsKQEAgLTkzMiw4ICs5OTMsOCBAQAogdTggbXB0MnNhc19zY3NpaF9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IG1zaXhfaW5kZXgsCiAgICAgdTMyIHJlcGx5KTsKIGludCBtcHQyc2FzX3Njc2loX2lzc3VlX3RtKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IGhhbmRsZSwKLSAgICB1aW50IGNoYW5uZWwsIHVpbnQgaWQsIHVpbnQgbHVuLCB1OCB0eXBlLCB1MTYgc21pZF90YXNrLAotICAgIHVsb25nIHRpbWVvdXQsIHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpOworCXVpbnQgY2hhbm5lbCwgdWludCBpZCwgdWludCBsdW4sIHU4IHR5cGUsIHUxNiBzbWlkX3Rhc2ssCisJdWxvbmcgdGltZW91dCwgdW5zaWduZWQgbG9uZyBzZXJpYWxfbnVtYmVyLCBlbnVtIG11dGV4X3R5cGUgbV90eXBlKTsKIHZvaWQgbXB0MnNhc19zY3NpaF9zZXRfdG1fZmxhZyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUpOwogdm9pZCBtcHQyc2FzX3Njc2loX2NsZWFyX3RtX2ZsYWcoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgaGFuZGxlKTsKIHZvaWQgbXB0MnNhc19leHBhbmRlcl9yZW1vdmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1NjQgc2FzX2FkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuYyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY3RsLmMKaW5kZXggNDM3YzJkOS4uMzhlZDAyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2N0bC5jCkBAIC05OTQsNyArOTk0LDcgQEAKIAkJCW1wdDJzYXNfc2NzaWhfaXNzdWVfdG0oaW9jLAogCQkJICAgIGxlMTZfdG9fY3B1KG1waV9yZXF1ZXN0LT5GdW5jdGlvbkRlcGVuZGVudDEpLCAwLCAwLAogCQkJICAgIDAsIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1RBUkdFVF9SRVNFVCwgMCwgMTAsCi0JCQkgICAgTlVMTCk7CisJCQkgICAgMCwgVE1fTVVURVhfT04pOwogCQkJaW9jLT50bV9jbWRzLnN0YXR1cyA9IE1QVDJfQ01EX05PVF9VU0VEOwogCQl9IGVsc2UKIAkJCW1wdDJzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBDQU5fU0xFRVAsCkBAIC0yNzA2LDEzICsyNzA2LDEzIEBACiAgICAgX2N0bF9pb2NfcmVzZXRfY291bnRfc2hvdywgTlVMTCk7CiAKIHN0cnVjdCBESUFHX0JVRkZFUl9TVEFSVCB7Ci0JdTMyIFNpemU7Ci0JdTMyIERpYWdWZXJzaW9uOworCV9fbGUzMiBTaXplOworCV9fbGUzMiBEaWFnVmVyc2lvbjsKIAl1OCBCdWZmZXJUeXBlOwogCXU4IFJlc2VydmVkWzNdOwotCXUzMiBSZXNlcnZlZDE7Ci0JdTMyIFJlc2VydmVkMjsKLQl1MzIgUmVzZXJ2ZWQzOworCV9fbGUzMiBSZXNlcnZlZDE7CisJX19sZTMyIFJlc2VydmVkMjsKKwlfX2xlMzIgUmVzZXJ2ZWQzOwogfTsKIC8qKgogICogX2N0bF9ob3N0X3RyYWNlX2J1ZmZlcl9zaXplX3Nob3cgLSBob3N0IGJ1ZmZlciBzaXplICh0cmFjZSBvbmx5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19kZWJ1Zy5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19kZWJ1Zy5oCmluZGV4IDNkY2RkZmUuLjk3MzFmOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfZGVidWcuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2RlYnVnLmgKQEAgLTE2NCw3ICsxNjQsNyBAQAogX2RlYnVnX2R1bXBfbWYodm9pZCAqbXBpX3JlcXVlc3QsIGludCBzeikKIHsKIAlpbnQgaTsKLQl1MzIgKm1mcCA9ICh1MzIgKiltcGlfcmVxdWVzdDsKKwlfX2xlMzIgKm1mcCA9IChfX2xlMzIgKiltcGlfcmVxdWVzdDsKIAogCXByaW50ayhLRVJOX0lORk8gIm1mOlxuXHQiKTsKIAlmb3IgKGkgPSAwOyBpIDwgc3o7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jCmluZGV4IGE3ZGJjNjguLjkzOWYyODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMKQEAgLTk0LDYgKzk0LDEwIEBACiBNT0RVTEVfUEFSTV9ERVNDKGxvZ2dpbmdfbGV2ZWwsICIgYml0cyBmb3IgZW5hYmxpbmcgYWRkaXRpb25hbCBsb2dnaW5nIGluZm8gIgogICAgICIoZGVmYXVsdD0wKSIpOwogCitzdGF0aWMgdXNob3J0IG1heF9zZWN0b3JzID0gMHhGRkZGOworbW9kdWxlX3BhcmFtKG1heF9zZWN0b3JzLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc2VjdG9ycywgIm1heCBzZWN0b3JzLCByYW5nZSA2NCB0byA4MTkyICBkZWZhdWx0PTgxOTIiKTsKKwogLyogc2NzaS1taWQgbGF5ZXIgZ2xvYmFsIHBhcm1ldGVyIGlzIG1heF9yZXBvcnRfbHVucywgd2hpY2ggaXMgNTExICovCiAjZGVmaW5lIE1QVDJTQVNfTUFYX0xVTiAoMTY4OTUpCiBzdGF0aWMgaW50IG1heF9sdW4gPSBNUFQyU0FTX01BWF9MVU47CkBAIC0xOTU2LDcgKzE5NjAsNyBAQAogCQljYXNlIE1QSTJfUkFJRF9WT0xfVFlQRV9SQUlEMUU6CiAJCQlxZGVwdGggPSBNUFQyU0FTX1JBSURfUVVFVUVfREVQVEg7CiAJCQlpZiAoaW9jLT5tYW51X3BnMTAuT0VNSWRlbnRpZmllciAmJgotCQkJICAgIChpb2MtPm1hbnVfcGcxMC5HZW5lcmljRmxhZ3MwICYKKwkJCSAgICAobGUzMl90b19jcHUoaW9jLT5tYW51X3BnMTAuR2VuZXJpY0ZsYWdzMCkgJgogCQkJICAgIE1GRzEwX0dGMF9SMTBfRElTUExBWSkgJiYKIAkJCSAgICAhKHJhaWRfZGV2aWNlLT5udW1fcGRzICUgMikpCiAJCQkJcl9sZXZlbCA9ICJSQUlEMTAiOwpAQCAtMjIzNiw2ICsyMjQwLDggQEAKICAqIEB0eXBlOiBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9fWFhYIChkZWZpbmVkIGluIG1waTJfaW5pdC5oKQogICogQHNtaWRfdGFzazogc21pZCBhc3NpZ25lZCB0byB0aGUgdGFzawogICogQHRpbWVvdXQ6IHRpbWVvdXQgaW4gc2Vjb25kcworICogQHNlcmlhbF9udW1iZXI6IHRoZSBzZXJpYWxfbnVtYmVyIGZyb20gc2NtZAorICogQG1fdHlwZTogVE1fTVVURVhfT04gb3IgVE1fTVVURVhfT0ZGCiAgKiBDb250ZXh0OiB1c2VyCiAgKgogICogQSBnZW5lcmljIEFQSSBmb3Igc2VuZGluZyB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdHMgdG8gZmlybXdhcmUuCkBAIC0yMjQ3LDE3ICsyMjUzLDE4IEBACiBpbnQKIG1wdDJzYXNfc2NzaWhfaXNzdWVfdG0oc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgaGFuZGxlLCB1aW50IGNoYW5uZWwsCiAgICAgdWludCBpZCwgdWludCBsdW4sIHU4IHR5cGUsIHUxNiBzbWlkX3Rhc2ssIHVsb25nIHRpbWVvdXQsCi0gICAgc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKKwl1bnNpZ25lZCBsb25nIHNlcmlhbF9udW1iZXIsIGVudW0gbXV0ZXhfdHlwZSBtX3R5cGUpCiB7CiAJTXBpMlNDU0lUYXNrTWFuYWdlbWVudFJlcXVlc3RfdCAqbXBpX3JlcXVlc3Q7CiAJTXBpMlNDU0lUYXNrTWFuYWdlbWVudFJlcGx5X3QgKm1waV9yZXBseTsKIAl1MTYgc21pZCA9IDA7CiAJdTMyIGlvY19zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIHRpbWVsZWZ0OwotCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWRfbG9va3VwOworCXN0cnVjdCBzY3NpaW9fdHJhY2tlciAqc2NzaV9sb29rdXAgPSBOVUxMOwogCWludCByYzsKIAotCW11dGV4X2xvY2soJmlvYy0+dG1fY21kcy5tdXRleCk7CisJaWYgKG1fdHlwZSA9PSBUTV9NVVRFWF9PTikKKwkJbXV0ZXhfbG9jaygmaW9jLT50bV9jbWRzLm11dGV4KTsKIAlpZiAoaW9jLT50bV9jbWRzLnN0YXR1cyAhPSBNUFQyX0NNRF9OT1RfVVNFRCkgewogCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IHRtX2NtZCBidXN5ISEhXG4iLAogCQkgICAgX19mdW5jX18sIGlvYy0+bmFtZSk7CkBAIC0yMjc3LDE4ICsyMjg0LDE4IEBACiAJaWYgKGlvY19zdGF0ZSAmIE1QSTJfRE9PUkJFTExfVVNFRCkgewogCQlkaHNwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAidW5leHBlY3RlZCBkb29yYmVsbCAiCiAJCSAgICAiYWN0aXZlIVxuIiwgaW9jLT5uYW1lKSk7Ci0JCW1wdDJzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBDQU5fU0xFRVAsCisJCXJjID0gbXB0MnNhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwKIAkJICAgIEZPUkNFX0JJR19IQU1NRVIpOwotCQlyYyA9IFNVQ0NFU1M7CisJCXJjID0gKCFyYykgPyBTVUNDRVNTIDogRkFJTEVEOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCiAJaWYgKChpb2Nfc3RhdGUgJiBNUEkyX0lPQ19TVEFURV9NQVNLKSA9PSBNUEkyX0lPQ19TVEFURV9GQVVMVCkgewogCQltcHQyc2FzX2Jhc2VfZmF1bHRfaW5mbyhpb2MsIGlvY19zdGF0ZSAmCiAJCSAgICBNUEkyX0RPT1JCRUxMX0RBVEFfTUFTSyk7Ci0JCW1wdDJzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBDQU5fU0xFRVAsCisJCXJjID0gbXB0MnNhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwKIAkJICAgIEZPUkNFX0JJR19IQU1NRVIpOwotCQlyYyA9IFNVQ0NFU1M7CisJCXJjID0gKCFyYykgPyBTVUNDRVNTIDogRkFJTEVEOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCkBAIC0yMzAwLDYgKzIzMDcsOSBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJaWYgKHR5cGUgPT0gTVBJMl9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfQUJPUlRfVEFTSykKKwkJc2NzaV9sb29rdXAgPSAmaW9jLT5zY3NpX2xvb2t1cFtzbWlkX3Rhc2sgLSAxXTsKKwogCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzZW5kaW5nIHRtOiBoYW5kbGUoMHglMDR4KSwiCiAJICAgICIgdGFza190eXBlKDB4JTAyeCksIHNtaWQoJWQpXG4iLCBpb2MtPm5hbWUsIGhhbmRsZSwgdHlwZSwKIAkgICAgc21pZF90YXNrKSk7CkBAIC0yMzA3LDYgKzIzMTcsNyBAQAogCW1waV9yZXF1ZXN0ID0gbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWUoaW9jLCBzbWlkKTsKIAlpb2MtPnRtX2NtZHMuc21pZCA9IHNtaWQ7CiAJbWVtc2V0KG1waV9yZXF1ZXN0LCAwLCBzaXplb2YoTXBpMlNDU0lUYXNrTWFuYWdlbWVudFJlcXVlc3RfdCkpOworCW1lbXNldChpb2MtPnRtX2NtZHMucmVwbHksIDAsIHNpemVvZihNcGkyU0NTSVRhc2tNYW5hZ2VtZW50UmVwbHlfdCkpOwogCW1waV9yZXF1ZXN0LT5GdW5jdGlvbiA9IE1QSTJfRlVOQ1RJT05fU0NTSV9UQVNLX01HTVQ7CiAJbXBpX3JlcXVlc3QtPkRldkhhbmRsZSA9IGNwdV90b19sZTE2KGhhbmRsZSk7CiAJbXBpX3JlcXVlc3QtPlRhc2tUeXBlID0gdHlwZTsKQEAgLTIzMjIsOSArMjMzMyw5IEBACiAJCV9kZWJ1Z19kdW1wX21mKG1waV9yZXF1ZXN0LAogCQkgICAgc2l6ZW9mKE1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXF1ZXN0X3QpLzQpOwogCQlpZiAoIShpb2MtPnRtX2NtZHMuc3RhdHVzICYgTVBUMl9DTURfUkVTRVQpKSB7Ci0JCQltcHQyc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgQ0FOX1NMRUVQLAorCQkJcmMgPSBtcHQyc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgQ0FOX1NMRUVQLAogCQkJICAgIEZPUkNFX0JJR19IQU1NRVIpOwotCQkJcmMgPSBTVUNDRVNTOworCQkJcmMgPSAoIXJjKSA/IFNVQ0NFU1MgOiBGQUlMRUQ7CiAJCQlpb2MtPnRtX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CiAJCQltcHQyc2FzX3Njc2loX2NsZWFyX3RtX2ZsYWcoaW9jLCBoYW5kbGUpOwogCQkJZ290byBlcnJfb3V0OwpAQCAtMjM0NiwyMCArMjM1NywxMiBAQAogCQl9CiAJfQogCi0JLyogc2FuaXR5IGNoZWNrOgotCSAqIENoZWNrIHRvIHNlZSB0aGUgY29tbWFuZHMgd2VyZSB0ZXJtaW5hdGVkLgotCSAqIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGVoIGNhbGxiYWNrcywgaGVuY2UgdGhlIHNjbWQgY2hlY2suCi0JICovCi0JcmMgPSBGQUlMRUQ7Ci0JaWYgKHNjbWQgPT0gTlVMTCkKLQkJZ290byBieXBhc3Nfc2FuaXR5X2NoZWNrczsKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0FCT1JUX1RBU0s6Ci0JCXNjbWRfbG9va3VwID0gX3Njc2loX3Njc2lfbG9va3VwX2dldChpb2MsIHNtaWRfdGFzayk7Ci0JCWlmIChzY21kX2xvb2t1cCkKLQkJCXJjID0gRkFJTEVEOwotCQllbHNlCi0JCQlyYyA9IFNVQ0NFU1M7CisJCXJjID0gU1VDQ0VTUzsKKwkJaWYgKHNjc2lfbG9va3VwLT5zY21kID09IE5VTEwpCisJCQlicmVhazsKKwkJcmMgPSBGQUlMRUQ7CiAJCWJyZWFrOwogCiAJY2FzZSBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9UQVJHRVRfUkVTRVQ6CkBAIC0yMzY5LDI0ICsyMzcyLDMxIEBACiAJCQlyYyA9IFNVQ0NFU1M7CiAJCWJyZWFrOwogCisJY2FzZSBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9BQlJUX1RBU0tfU0VUOgogCWNhc2UgTVBJMl9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfTE9HSUNBTF9VTklUX1JFU0VUOgogCQlpZiAoX3Njc2loX3Njc2lfbG9va3VwX2ZpbmRfYnlfbHVuKGlvYywgaWQsIGx1biwgY2hhbm5lbCkpCiAJCQlyYyA9IEZBSUxFRDsKIAkJZWxzZQogCQkJcmMgPSBTVUNDRVNTOwogCQlicmVhazsKKwljYXNlIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1FVRVJZX1RBU0s6CisJCXJjID0gU1VDQ0VTUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSBGQUlMRUQ7CisJCWJyZWFrOwogCX0KIAotIGJ5cGFzc19zYW5pdHlfY2hlY2tzOgotCiAJbXB0MnNhc19zY3NpaF9jbGVhcl90bV9mbGFnKGlvYywgaGFuZGxlKTsKIAlpb2MtPnRtX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7Ci0JbXV0ZXhfdW5sb2NrKCZpb2MtPnRtX2NtZHMubXV0ZXgpOworCWlmIChtX3R5cGUgPT0gVE1fTVVURVhfT04pCisJCW11dGV4X3VubG9jaygmaW9jLT50bV9jbWRzLm11dGV4KTsKIAogCXJldHVybiByYzsKIAogIGVycl9vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZpb2MtPnRtX2NtZHMubXV0ZXgpOworCWlmIChtX3R5cGUgPT0gVE1fTVVURVhfT04pCisJCW11dGV4X3VubG9jaygmaW9jLT50bV9jbWRzLm11dGV4KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTI0OTYsNyArMjUwNiw4IEBACiAJaGFuZGxlID0gc2FzX2RldmljZV9wcml2X2RhdGEtPnNhc190YXJnZXQtPmhhbmRsZTsKIAlyID0gbXB0MnNhc19zY3NpaF9pc3N1ZV90bShpb2MsIGhhbmRsZSwgc2NtZC0+ZGV2aWNlLT5jaGFubmVsLAogCSAgICBzY21kLT5kZXZpY2UtPmlkLCBzY21kLT5kZXZpY2UtPmx1biwKLQkgICAgTVBJMl9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfQUJPUlRfVEFTSywgc21pZCwgMzAsIHNjbWQpOworCSAgICBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9BQk9SVF9UQVNLLCBzbWlkLCAzMCwKKwkgICAgc2NtZC0+c2VyaWFsX251bWJlciwgVE1fTVVURVhfT04pOwogCiAgb3V0OgogCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2NtZC0+ZGV2aWNlLCAidGFzayBhYm9ydDogJXMgc2NtZCglcClcbiIsCkBAIC0yNTU3LDcgKzI1NjgsOCBAQAogCiAJciA9IG1wdDJzYXNfc2NzaWhfaXNzdWVfdG0oaW9jLCBoYW5kbGUsIHNjbWQtPmRldmljZS0+Y2hhbm5lbCwKIAkgICAgc2NtZC0+ZGV2aWNlLT5pZCwgc2NtZC0+ZGV2aWNlLT5sdW4sCi0JICAgIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0xPR0lDQUxfVU5JVF9SRVNFVCwgMCwgMzAsIHNjbWQpOworCSAgICBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9MT0dJQ0FMX1VOSVRfUkVTRVQsIDAsIDMwLCAwLAorCSAgICBUTV9NVVRFWF9PTik7CiAKICBvdXQ6CiAJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzY21kLT5kZXZpY2UsICJkZXZpY2UgcmVzZXQ6ICVzIHNjbWQoJXApXG4iLApAQCAtMjYxNyw3ICsyNjI5LDcgQEAKIAogCXIgPSBtcHQyc2FzX3Njc2loX2lzc3VlX3RtKGlvYywgaGFuZGxlLCBzY21kLT5kZXZpY2UtPmNoYW5uZWwsCiAJICAgIHNjbWQtPmRldmljZS0+aWQsIDAsIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1RBUkdFVF9SRVNFVCwgMCwKLQkgICAgMzAsIHNjbWQpOworCSAgICAzMCwgMCwgVE1fTVVURVhfT04pOwogCiAgb3V0OgogCXN0YXJnZXRfcHJpbnRrKEtFUk5fSU5GTywgc3RhcmdldCwgInRhcmdldCByZXNldDogJXMgc2NtZCglcClcbiIsCkBAIC0yNzUwLDYgKzI3NjIsMzEgQEAKIH0KIAogLyoqCisgKiBfc2NzaWhfdWJsb2NrX2lvX2FsbF9kZXZpY2UgLSB1bmJsb2NrIGV2ZXJ5IGRldmljZQorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKgorICogY2hhbmdlIHRoZSBkZXZpY2Ugc3RhdGUgZnJvbSBibG9jayB0byBydW5uaW5nCisgKi8KK3N0YXRpYyB2b2lkCitfc2NzaWhfdWJsb2NrX2lvX2FsbF9kZXZpY2Uoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQoreworCXN0cnVjdCBNUFQyU0FTX0RFVklDRSAqc2FzX2RldmljZV9wcml2X2RhdGE7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIGlvYy0+c2hvc3QpIHsKKwkJc2FzX2RldmljZV9wcml2X2RhdGEgPSBzZGV2LT5ob3N0ZGF0YTsKKwkJaWYgKCFzYXNfZGV2aWNlX3ByaXZfZGF0YSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXNhc19kZXZpY2VfcHJpdl9kYXRhLT5ibG9jaykKKwkJCWNvbnRpbnVlOworCQlzYXNfZGV2aWNlX3ByaXZfZGF0YS0+YmxvY2sgPSAwOworCQlkZXd0cHJpbnRrKGlvYywgc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzZGV2LCAiZGV2aWNlX3J1bm5pbmcsICIKKwkJICAgICJoYW5kbGUoMHglMDR4KVxuIiwKKwkJICAgIHNhc19kZXZpY2VfcHJpdl9kYXRhLT5zYXNfdGFyZ2V0LT5oYW5kbGUpKTsKKwkJc2NzaV9pbnRlcm5hbF9kZXZpY2VfdW5ibG9jayhzZGV2KTsKKwl9Cit9CisvKioKICAqIF9zY3NpaF91YmxvY2tfaW9fZGV2aWNlIC0gc2V0IHRoZSBkZXZpY2Ugc3RhdGUgdG8gU0RFVl9SVU5OSU5HCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBoYW5kbGU6IGRldmljZSBoYW5kbGUKQEAgLTI3NzksNiArMjgxNiwzNCBAQAogfQogCiAvKioKKyAqIF9zY3NpaF9ibG9ja19pb19hbGxfZGV2aWNlIC0gc2V0IHRoZSBkZXZpY2Ugc3RhdGUgdG8gU0RFVl9CTE9DSworICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKiBAaGFuZGxlOiBkZXZpY2UgaGFuZGxlCisgKgorICogRHVyaW5nIGRldmljZSBwdWxsIHdlIG5lZWQgdG8gYXBwcm9waWF0ZWx5IHNldCB0aGUgc2RldiBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK19zY3NpaF9ibG9ja19pb19hbGxfZGV2aWNlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYykKK3sKKwlzdHJ1Y3QgTVBUMlNBU19ERVZJQ0UgKnNhc19kZXZpY2VfcHJpdl9kYXRhOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBpb2MtPnNob3N0KSB7CisJCXNhc19kZXZpY2VfcHJpdl9kYXRhID0gc2Rldi0+aG9zdGRhdGE7CisJCWlmICghc2FzX2RldmljZV9wcml2X2RhdGEpCisJCQljb250aW51ZTsKKwkJaWYgKHNhc19kZXZpY2VfcHJpdl9kYXRhLT5ibG9jaykKKwkJCWNvbnRpbnVlOworCQlzYXNfZGV2aWNlX3ByaXZfZGF0YS0+YmxvY2sgPSAxOworCQlkZXd0cHJpbnRrKGlvYywgc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzZGV2LCAiZGV2aWNlX2Jsb2NrZWQsICIKKwkJICAgICJoYW5kbGUoMHglMDR4KVxuIiwKKwkJICAgIHNhc19kZXZpY2VfcHJpdl9kYXRhLT5zYXNfdGFyZ2V0LT5oYW5kbGUpKTsKKwkJc2NzaV9pbnRlcm5hbF9kZXZpY2VfYmxvY2soc2Rldik7CisJfQorfQorCisKKy8qKgogICogX3Njc2loX2Jsb2NrX2lvX2RldmljZSAtIHNldCB0aGUgZGV2aWNlIHN0YXRlIHRvIFNERVZfQkxPQ0sKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQGhhbmRsZTogZGV2aWNlIGhhbmRsZQpAQCAtMzY5OCw3ICszNzYzLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KSB7CisJaWYgKGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5IHx8IGlvYy0+cmVtb3ZlX2hvc3QpIHsKIAkJc2NtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CiAJCXNjbWQtPnNjc2lfZG9uZShzY21kKTsKIAkJcmV0dXJuIDA7CkBAIC00NTk4LDcgKzQ2NjMsNyBAQAogCU1waTJTYXNFbmNsb3N1cmVQYWdlMF90IGVuY2xvc3VyZV9wZzA7CiAJdTMyIGlvY19zdGF0dXM7CiAJdTE2IHBhcmVudF9oYW5kbGU7Ci0JX19sZTY0IHNhc19hZGRyZXNzLCBzYXNfYWRkcmVzc19wYXJlbnQgPSAwOworCXU2NCBzYXNfYWRkcmVzcywgc2FzX2FkZHJlc3NfcGFyZW50ID0gMDsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBfc2FzX3BvcnQgKm1wdDJzYXNfcG9ydCA9IE5VTEw7CkBAIC01MzgwLDkgKzU0NDUsMTAgQEAKIAkJYnJlYWs7CiAJfQogCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJkZXZpY2Ugc3RhdHVzIGNoYW5nZTogKCVzKVxuIgotCSAgICAiXHRoYW5kbGUoMHglMDR4KSwgc2FzIGFkZHJlc3MoMHglMDE2bGx4KSIsIGlvYy0+bmFtZSwKLQkgICAgcmVhc29uX3N0ciwgbGUxNl90b19jcHUoZXZlbnRfZGF0YS0+RGV2SGFuZGxlKSwKLQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShldmVudF9kYXRhLT5TQVNBZGRyZXNzKSk7CisJICAgICJcdGhhbmRsZSgweCUwNHgpLCBzYXMgYWRkcmVzcygweCUwMTZsbHgpLCB0YWcoJWQpIiwKKwkgICAgaW9jLT5uYW1lLCByZWFzb25fc3RyLCBsZTE2X3RvX2NwdShldmVudF9kYXRhLT5EZXZIYW5kbGUpLAorCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGV2ZW50X2RhdGEtPlNBU0FkZHJlc3MpLAorCSAgICBsZTE2X3RvX2NwdShldmVudF9kYXRhLT5UYXNrVGFnKSk7CiAJaWYgKGV2ZW50X2RhdGEtPlJlYXNvbkNvZGUgPT0gTVBJMl9FVkVOVF9TQVNfREVWX1NUQVRfUkNfU01BUlRfREFUQSkKIAkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiwgQVNDKDB4JXgpLCBBU0NRKDB4JXgpXG4iLCBpb2MtPm5hbWUsCiAJCSAgICBldmVudF9kYXRhLT5BU0MsIGV2ZW50X2RhdGEtPkFTQ1EpOwpAQCAtNTQwNCw3ICs1NDcwLDcgQEAKIHsKIAlzdHJ1Y3QgTVBUMlNBU19UQVJHRVQgKnRhcmdldF9wcml2X2RhdGE7CiAJc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlOwotCV9fbGU2NCBzYXNfYWRkcmVzczsKKwl1NjQgc2FzX2FkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlNcGkyRXZlbnREYXRhU2FzRGV2aWNlU3RhdHVzQ2hhbmdlX3QgKmV2ZW50X2RhdGEgPQogCSAgICBmd19ldmVudC0+ZXZlbnRfZGF0YTsKQEAgLTU1MjIsMjUgKzU1ODgsMzggQEAKIAl1MzIgdGVybWluYXRpb25fY291bnQ7CiAJdTMyIHF1ZXJ5X2NvdW50OwogCU1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXBseV90ICptcGlfcmVwbHk7Ci0jaWZkZWYgQ09ORklHX1NDU0lfTVBUMlNBU19MT0dHSU5HCiAJTXBpMkV2ZW50RGF0YVNhc0Jyb2FkY2FzdFByaW1pdGl2ZV90ICpldmVudF9kYXRhID0gZndfZXZlbnQtPmV2ZW50X2RhdGE7Ci0jZW5kaWYKIAl1MTYgaW9jX3N0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByOworCXU4IG1heF9yZXRyaWVzID0gMDsKKwl1OCB0YXNrX2Fib3J0X3JldHJpZXM7CiAKLQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImJyb2FkY2FzdCBwcmltaXRpdmU6ICIKLQkgICAgInBoeSBudW1iZXIoJWQpLCB3aWR0aCglZClcbiIsIGlvYy0+bmFtZSwgZXZlbnRfZGF0YS0+UGh5TnVtLAotCSAgICBldmVudF9kYXRhLT5Qb3J0V2lkdGgpKTsKLQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGVudGVyXG4iLCBpb2MtPm5hbWUsCi0JICAgIF9fZnVuY19fKSk7CisJbXV0ZXhfbG9jaygmaW9jLT50bV9jbWRzLm11dGV4KTsKKwlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBlbnRlcjogcGh5IG51bWJlciglZCksICIKKwkgICAgIndpZHRoKCVkKVxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXywgZXZlbnRfZGF0YS0+UGh5TnVtLAorCSAgICAgZXZlbnRfZGF0YS0+UG9ydFdpZHRoKSk7CisKKwlfc2NzaWhfYmxvY2tfaW9fYWxsX2RldmljZShpb2MpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOwotCWlvYy0+YnJvYWRjYXN0X2Flbl9idXN5ID0gMDsKKwltcGlfcmVwbHkgPSBpb2MtPnRtX2NtZHMucmVwbHk7Citicm9hZGNhc3RfYWVuX3JldHJ5OgorCisJLyogc2FuaXR5IGNoZWNrcyBmb3IgcmV0cnlpbmcgdGhpcyBsb29wICovCisJaWYgKG1heF9yZXRyaWVzKysgPT0gNSkgeworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBnaXZpbmcgdXBcbiIsCisJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKSk7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAobWF4X3JldHJpZXMgPiAxKQorCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiAlZCByZXRyeVxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18sIG1heF9yZXRyaWVzIC0gMSkpOworCiAJdGVybWluYXRpb25fY291bnQgPSAwOwogCXF1ZXJ5X2NvdW50ID0gMDsKLQltcGlfcmVwbHkgPSBpb2MtPnRtX2NtZHMucmVwbHk7CiAJZm9yIChzbWlkID0gMTsgc21pZCA8PSBpb2MtPnNjc2lpb19kZXB0aDsgc21pZCsrKSB7CisJCWlmIChpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzc19zdGF0dXMpCisJCQlnb3RvIG91dDsKIAkJc2NtZCA9IF9zY3NpaF9zY3NpX2xvb2t1cF9nZXQoaW9jLCBzbWlkKTsKIAkJaWYgKCFzY21kKQogCQkJY29udGludWU7CkBAIC01NTYxLDM0ICs1NjQwLDkwIEBACiAJCWx1biA9IHNhc19kZXZpY2VfcHJpdl9kYXRhLT5sdW47CiAJCXF1ZXJ5X2NvdW50Kys7CiAKKwkJaWYgKGlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzX3N0YXR1cykKKwkJCWdvdG8gb3V0OworCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOwotCQltcHQyc2FzX3Njc2loX2lzc3VlX3RtKGlvYywgaGFuZGxlLCAwLCAwLCBsdW4sCi0JCSAgICBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9RVUVSWV9UQVNLLCBzbWlkLCAzMCwgTlVMTCk7Ci0JCWlvYy0+dG1fY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9OT1RfVVNFRDsKKwkJciA9IG1wdDJzYXNfc2NzaWhfaXNzdWVfdG0oaW9jLCBoYW5kbGUsIDAsIDAsIGx1biwKKwkJICAgIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1FVRVJZX1RBU0ssIHNtaWQsIDMwLCAwLAorCQkgICAgVE1fTVVURVhfT0ZGKTsKKwkJaWYgKHIgPT0gRkFJTEVEKSB7CisJCQlzZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIHNkZXYsCisJCQkgICAgIm1wdDJzYXNfc2NzaWhfaXNzdWVfdG06IEZBSUxFRCB3aGVuIHNlbmRpbmcgIgorCQkJICAgICJRVUVSWV9UQVNLOiBzY21kKCVwKVxuIiwgc2NtZCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7CisJCQlnb3RvIGJyb2FkY2FzdF9hZW5fcmV0cnk7CisJCX0KIAkJaW9jX3N0YXR1cyA9IGxlMTZfdG9fY3B1KG1waV9yZXBseS0+SU9DU3RhdHVzKQogCQkgICAgJiBNUEkyX0lPQ1NUQVRVU19NQVNLOwotCQlpZiAoKGlvY19zdGF0dXMgPT0gTVBJMl9JT0NTVEFUVVNfU1VDQ0VTUykgJiYKLQkJICAgIChtcGlfcmVwbHktPlJlc3BvbnNlQ29kZSA9PQorCQlpZiAoaW9jX3N0YXR1cyAhPSBNUEkyX0lPQ1NUQVRVU19TVUNDRVNTKSB7CisJCQlzZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIHNkZXYsICJxdWVyeSB0YXNrOiBGQUlMRUQgIgorCQkJICAgICJ3aXRoIElPQ1NUQVRVUygweCUwNHgpLCBzY21kKCVwKVxuIiwgaW9jX3N0YXR1cywKKwkJCSAgICBzY21kKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKKwkJCWdvdG8gYnJvYWRjYXN0X2Flbl9yZXRyeTsKKwkJfQorCisJCS8qIHNlZSBpZiBJTyBpcyBzdGlsbCBvd25lZCBieSBJT0MgYW5kIHRhcmdldCAqLworCQlpZiAobXBpX3JlcGx5LT5SZXNwb25zZUNvZGUgPT0KIAkJICAgICBNUEkyX1NDU0lUQVNLTUdNVF9SU1BfVE1fU1VDQ0VFREVEIHx8CiAJCSAgICAgbXBpX3JlcGx5LT5SZXNwb25zZUNvZGUgPT0KLQkJICAgICBNUEkyX1NDU0lUQVNLTUdNVF9SU1BfSU9fUVVFVUVEX09OX0lPQykpIHsKKwkJICAgICBNUEkyX1NDU0lUQVNLTUdNVF9SU1BfSU9fUVVFVUVEX09OX0lPQykgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOwogCQkJY29udGludWU7CiAJCX0KKwkJdGFza19hYm9ydF9yZXRyaWVzID0gMDsKKyB0bV9yZXRyeToKKwkJaWYgKHRhc2tfYWJvcnRfcmV0cmllcysrID09IDYwKSB7CisJCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKKwkJCSAgICAiJXM6IEFCT1JUX1RBU0s6IGdpdmluZyB1cFxuIiwgaW9jLT5uYW1lLAorCQkJICAgIF9fZnVuY19fKSk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7CisJCQlnb3RvIGJyb2FkY2FzdF9hZW5fcmV0cnk7CisJCX0KKworCQlpZiAoaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3Nfc3RhdHVzKQorCQkJZ290byBvdXRfbm9fbG9jazsKKwogCQlyID0gbXB0MnNhc19zY3NpaF9pc3N1ZV90bShpb2MsIGhhbmRsZSwgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsCiAJCSAgICBzZGV2LT5sdW4sIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0FCT1JUX1RBU0ssIHNtaWQsIDMwLAotCQkgICAgc2NtZCk7Ci0JCWlmIChyID09IEZBSUxFRCkKLQkJCXNkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgc2RldiwgInRhc2sgYWJvcnQ6IEZBSUxFRCAiCisJCSAgICBzY21kLT5zZXJpYWxfbnVtYmVyLCBUTV9NVVRFWF9PRkYpOworCQlpZiAociA9PSBGQUlMRUQpIHsKKwkJCXNkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgc2RldiwKKwkJCSAgICAibXB0MnNhc19zY3NpaF9pc3N1ZV90bTogQUJPUlRfVEFTSzogRkFJTEVEIDogIgogCQkJICAgICJzY21kKCVwKVxuIiwgc2NtZCk7CisJCQlnb3RvIHRtX3JldHJ5OworCQl9CisKKwkJaWYgKHRhc2tfYWJvcnRfcmV0cmllcyA+IDEpCisJCQlzZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIHNkZXYsCisJCQkgICAgIm1wdDJzYXNfc2NzaWhfaXNzdWVfdG06IEFCT1JUX1RBU0s6IFJFVFJJRVMgKCVkKToiCisJCQkgICAgIiBzY21kKCVwKVxuIiwKKwkJCSAgICB0YXNrX2Fib3J0X3JldHJpZXMgLSAxLCBzY21kKTsKKwogCQl0ZXJtaW5hdGlvbl9jb3VudCArPSBsZTMyX3RvX2NwdShtcGlfcmVwbHktPlRlcm1pbmF0aW9uQ291bnQpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOwogCi0JZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKKwlpZiAoaW9jLT5icm9hZGNhc3RfYWVuX3BlbmRpbmcpIHsKKwkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogbG9vcCBiYWNrIGR1ZSB0byIKKwkJICAgICAiIHBlbmRpbmcgQUVOXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fKSk7CisJCSBpb2MtPmJyb2FkY2FzdF9hZW5fcGVuZGluZyA9IDA7CisJCSBnb3RvIGJyb2FkY2FzdF9hZW5fcmV0cnk7CisJfQorCisgb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOworIG91dF9ub19sb2NrOgorCisJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UCiAJICAgICIlcyAtIGV4aXQsIHF1ZXJ5X2NvdW50ID0gJWQgdGVybWluYXRpb25fY291bnQgPSAlZFxuIiwKIAkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXywgcXVlcnlfY291bnQsIHRlcm1pbmF0aW9uX2NvdW50KSk7CisKKwlpb2MtPmJyb2FkY2FzdF9hZW5fYnVzeSA9IDA7CisJaWYgKCFpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzc19zdGF0dXMpCisJCV9zY3NpaF91YmxvY2tfaW9fYWxsX2RldmljZShpb2MpOworCW11dGV4X3VubG9jaygmaW9jLT50bV9jbWRzLm11dGV4KTsKIH0KIAogLyoqCkBAIC02NTY2LDcgKzY3MDEsNyBAQAogCU1waTJFeHBhbmRlclBhZ2UwX3QgZXhwYW5kZXJfcGcwOwogCU1waTJDb25maWdSZXBseV90IG1waV9yZXBseTsKIAl1MTYgaW9jX3N0YXR1czsKLQlfX2xlNjQgc2FzX2FkZHJlc3M7CisJdTY0IHNhc19hZGRyZXNzOwogCXUxNiBoYW5kbGU7CiAKIAlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pOwpAQCAtNjg2MiwxMCArNjk5NywxNCBAQAogCQkgICAgbXBpX3JlcGx5LT5FdmVudERhdGE7CiAKIAkJaWYgKGJhZW5fZGF0YS0+UHJpbWl0aXZlICE9Ci0JCSAgICBNUEkyX0VWRU5UX1BSSU1JVElWRV9BU1lOQ0hST05PVVNfRVZFTlQgfHwKLQkJICAgIGlvYy0+YnJvYWRjYXN0X2Flbl9idXN5KQorCQkgICAgTVBJMl9FVkVOVF9QUklNSVRJVkVfQVNZTkNIUk9OT1VTX0VWRU5UKQogCQkJcmV0dXJuIDE7Ci0JCWlvYy0+YnJvYWRjYXN0X2Flbl9idXN5ID0gMTsKKworCQlpZiAoaW9jLT5icm9hZGNhc3RfYWVuX2J1c3kpIHsKKwkJCWlvYy0+YnJvYWRjYXN0X2Flbl9wZW5kaW5nKys7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlpb2MtPmJyb2FkY2FzdF9hZW5fYnVzeSA9IDE7CiAJCWJyZWFrOwogCX0KIApAQCAtNzIxMSw3ICs3MzUwLDYgQEAKIAl9CiAKIAlzYXNfcmVtb3ZlX2hvc3Qoc2hvc3QpOwotCV9zY3NpaF9zaHV0ZG93bihwZGV2KTsKIAlsaXN0X2RlbCgmaW9jLT5saXN0KTsKIAlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKIAlzY3NpX2hvc3RfcHV0KHNob3N0KTsKQEAgLTc0MzYsNiArNzU3NCwyNSBAQAogCXNob3N0LT50cmFuc3BvcnR0ID0gbXB0MnNhc190cmFuc3BvcnRfdGVtcGxhdGU7CiAJc2hvc3QtPnVuaXF1ZV9pZCA9IGlvYy0+aWQ7CiAKKwlpZiAobWF4X3NlY3RvcnMgIT0gMHhGRkZGKSB7CisJCWlmIChtYXhfc2VjdG9ycyA8IDY0KSB7CisJCQlzaG9zdC0+bWF4X3NlY3RvcnMgPSA2NDsKKwkJCXByaW50ayhNUFQyU0FTX1dBUk5fRk1UICJJbnZhbGlkIHZhbHVlICVkIHBhc3NlZCAiCisJCQkgICAgImZvciBtYXhfc2VjdG9ycywgcmFuZ2UgaXMgNjQgdG8gODE5Mi4gQXNzaWduaW5nICIKKwkJCSAgICAidmFsdWUgb2YgNjQuXG4iLCBpb2MtPm5hbWUsIG1heF9zZWN0b3JzKTsKKwkJfSBlbHNlIGlmIChtYXhfc2VjdG9ycyA+IDgxOTIpIHsKKwkJCXNob3N0LT5tYXhfc2VjdG9ycyA9IDgxOTI7CisJCQlwcmludGsoTVBUMlNBU19XQVJOX0ZNVCAiSW52YWxpZCB2YWx1ZSAlZCBwYXNzZWQgIgorCQkJICAgICJmb3IgbWF4X3NlY3RvcnMsIHJhbmdlIGlzIDY0IHRvIDgxOTIuIEFzc2lnbmluZyAiCisJCQkgICAgImRlZmF1bHQgdmFsdWUgb2YgODE5Mi5cbiIsIGlvYy0+bmFtZSwKKwkJCSAgICBtYXhfc2VjdG9ycyk7CisJCX0gZWxzZSB7CisJCQlzaG9zdC0+bWF4X3NlY3RvcnMgPSBtYXhfc2VjdG9ycyAmIDB4RkZGRTsKKwkJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJUaGUgbWF4X3NlY3RvcnMgdmFsdWUgaXMgIgorCQkJICAgICJzZXQgdG8gJWRcbiIsIGlvYy0+bmFtZSwgc2hvc3QtPm1heF9zZWN0b3JzKTsKKwkJfQorCX0KKwogCWlmICgoc2NzaV9hZGRfaG9zdChzaG9zdCwgJnBkZXYtPmRldikpKSB7CiAJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsCiAJCSAgICBpb2MtPm5hbWUsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwpAQCAtNzUwNSw3ICs3NjYyLDcgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MgPSBzaG9zdF9wcml2KHNob3N0KTsKLQl1MzIgZGV2aWNlX3N0YXRlOworCXBjaV9wb3dlcl90IGRldmljZV9zdGF0ZTsKIAogCW1wdDJzYXNfYmFzZV9zdG9wX3dhdGNoZG9nKGlvYyk7CiAJc2NzaV9ibG9ja19yZXF1ZXN0cyhzaG9zdCk7CkBAIC03NTMyLDcgKzc2ODksNyBAQAogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyA9IHNob3N0X3ByaXYoc2hvc3QpOwotCXUzMiBkZXZpY2Vfc3RhdGUgPSBwZGV2LT5jdXJyZW50X3N0YXRlOworCXBjaV9wb3dlcl90IGRldmljZV9zdGF0ZSA9IHBkZXYtPmN1cnJlbnRfc3RhdGU7CiAJaW50IHI7CiAKIAlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicGRldj0weCVwLCBzbG90PSVzLCBwcmV2aW91cyAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc190cmFuc3BvcnQuYwppbmRleCBjYjFjZGVjLi4xNWM3OTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfdHJhbnNwb3J0LmMKQEAgLTI5OSw3ICsyOTksNiBAQAogCXZvaWQgKmRhdGFfb3V0ID0gTlVMTDsKIAlkbWFfYWRkcl90IGRhdGFfb3V0X2RtYTsKIAl1MzIgc3o7Ci0JdTY0ICpzYXNfYWRkcmVzc19sZTsKIAl1MTYgd2FpdF9zdGF0ZV9jb3VudDsKIAogCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KSB7CkBAIC0zNzIsOCArMzcxLDcgQEAKIAltcGlfcmVxdWVzdC0+UGh5c2ljYWxQb3J0ID0gMHhGRjsKIAltcGlfcmVxdWVzdC0+VkZfSUQgPSAwOyAvKiBUT0RPICovCiAJbXBpX3JlcXVlc3QtPlZQX0lEID0gMDsKLQlzYXNfYWRkcmVzc19sZSA9ICh1NjQgKikmbXBpX3JlcXVlc3QtPlNBU0FkZHJlc3M7Ci0JKnNhc19hZGRyZXNzX2xlID0gY3B1X3RvX2xlNjQoc2FzX2FkZHJlc3MpOworCW1waV9yZXF1ZXN0LT5TQVNBZGRyZXNzID0gY3B1X3RvX2xlNjQoc2FzX2FkZHJlc3MpOwogCW1waV9yZXF1ZXN0LT5SZXF1ZXN0RGF0YUxlbmd0aCA9CiAJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgcmVwX21hbnVfcmVxdWVzdCkpOwogCXBzZ2UgPSAmbXBpX3JlcXVlc3QtPlNHTDsKQEAgLTEwNDksMTQgKzEwNDcsMTQgQEAKIAl1OCBmdW5jdGlvbjsgLyogMHgxMSAqLwogCXU4IGZ1bmN0aW9uX3Jlc3VsdDsKIAl1OCByZXNwb25zZV9sZW5ndGg7Ci0JdTE2IGV4cGFuZGVyX2NoYW5nZV9jb3VudDsKKwlfX2JlMTYgZXhwYW5kZXJfY2hhbmdlX2NvdW50OwogCXU4IHJlc2VydmVkXzFbM107CiAJdTggcGh5X2lkZW50aWZpZXI7CiAJdTggcmVzZXJ2ZWRfMlsyXTsKLQl1MzIgaW52YWxpZF9kd29yZDsKLQl1MzIgcnVubmluZ19kaXNwYXJpdHlfZXJyb3I7Ci0JdTMyIGxvc3Nfb2ZfZHdvcmRfc3luYzsKLQl1MzIgcGh5X3Jlc2V0X3Byb2JsZW07CisJX19iZTMyIGludmFsaWRfZHdvcmQ7CisJX19iZTMyIHJ1bm5pbmdfZGlzcGFyaXR5X2Vycm9yOworCV9fYmUzMiBsb3NzX29mX2R3b3JkX3N5bmM7CisJX19iZTMyIHBoeV9yZXNldF9wcm9ibGVtOwogfTsKIAogLyoqCkBAIC0xMDg1LDcgKzEwODMsNiBAQAogCXZvaWQgKmRhdGFfb3V0ID0gTlVMTDsKIAlkbWFfYWRkcl90IGRhdGFfb3V0X2RtYTsKIAl1MzIgc3o7Ci0JdTY0ICpzYXNfYWRkcmVzc19sZTsKIAl1MTYgd2FpdF9zdGF0ZV9jb3VudDsKIAogCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KSB7CkBAIC0xMTYwLDggKzExNTcsNyBAQAogCW1waV9yZXF1ZXN0LT5QaHlzaWNhbFBvcnQgPSAweEZGOwogCW1waV9yZXF1ZXN0LT5WRl9JRCA9IDA7IC8qIFRPRE8gKi8KIAltcGlfcmVxdWVzdC0+VlBfSUQgPSAwOwotCXNhc19hZGRyZXNzX2xlID0gKHU2NCAqKSZtcGlfcmVxdWVzdC0+U0FTQWRkcmVzczsKLQkqc2FzX2FkZHJlc3NfbGUgPSBjcHVfdG9fbGU2NChwaHktPmlkZW50aWZ5LnNhc19hZGRyZXNzKTsKKwltcGlfcmVxdWVzdC0+U0FTQWRkcmVzcyA9IGNwdV90b19sZTY0KHBoeS0+aWRlbnRpZnkuc2FzX2FkZHJlc3MpOwogCW1waV9yZXF1ZXN0LT5SZXF1ZXN0RGF0YUxlbmd0aCA9CiAJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgcGh5X2Vycm9yX2xvZ19yZXF1ZXN0KSk7CiAJcHNnZSA9ICZtcGlfcmVxdWVzdC0+U0dMOwpAQCAtMTQwNiw3ICsxNDAyLDYgQEAKIAl2b2lkICpkYXRhX291dCA9IE5VTEw7CiAJZG1hX2FkZHJfdCBkYXRhX291dF9kbWE7CiAJdTMyIHN6OwotCXU2NCAqc2FzX2FkZHJlc3NfbGU7CiAJdTE2IHdhaXRfc3RhdGVfY291bnQ7CiAKIAlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSkgewpAQCAtMTQ4Niw4ICsxNDgxLDcgQEAKIAltcGlfcmVxdWVzdC0+UGh5c2ljYWxQb3J0ID0gMHhGRjsKIAltcGlfcmVxdWVzdC0+VkZfSUQgPSAwOyAvKiBUT0RPICovCiAJbXBpX3JlcXVlc3QtPlZQX0lEID0gMDsKLQlzYXNfYWRkcmVzc19sZSA9ICh1NjQgKikmbXBpX3JlcXVlc3QtPlNBU0FkZHJlc3M7Ci0JKnNhc19hZGRyZXNzX2xlID0gY3B1X3RvX2xlNjQocGh5LT5pZGVudGlmeS5zYXNfYWRkcmVzcyk7CisJbXBpX3JlcXVlc3QtPlNBU0FkZHJlc3MgPSBjcHVfdG9fbGU2NChwaHktPmlkZW50aWZ5LnNhc19hZGRyZXNzKTsKIAltcGlfcmVxdWVzdC0+UmVxdWVzdERhdGFMZW5ndGggPQogCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IHBoeV9lcnJvcl9sb2dfcmVxdWVzdCkpOwogCXBzZ2UgPSAmbXBpX3JlcXVlc3QtPlNHTDsKQEAgLTE5MTQsNyArMTkwOCw3IEBACiAJbXBpX3JlcXVlc3QtPlBoeXNpY2FsUG9ydCA9IDB4RkY7CiAJbXBpX3JlcXVlc3QtPlZGX0lEID0gMDsgLyogVE9ETyAqLwogCW1waV9yZXF1ZXN0LT5WUF9JRCA9IDA7Ci0JKigodTY0ICopJm1waV9yZXF1ZXN0LT5TQVNBZGRyZXNzKSA9IChycGh5KSA/CisJbXBpX3JlcXVlc3QtPlNBU0FkZHJlc3MgPSAocnBoeSkgPwogCSAgICBjcHVfdG9fbGU2NChycGh5LT5pZGVudGlmeS5zYXNfYWRkcmVzcykgOgogCSAgICBjcHVfdG9fbGU2NChpb2MtPnNhc19oYmEuc2FzX2FkZHJlc3MpOwogCW1waV9yZXF1ZXN0LT5SZXF1ZXN0RGF0YUxlbmd0aCA9IGNwdV90b19sZTE2KGJsa19ycV9ieXRlcyhyZXEpIC0gNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKaW5kZXggMWI2MGE5NS4uYWU4ZTI5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpAQCAtNjMsNyArNjMsNyBAQAogCiAJCQkvKgogCQkJICogSXNzdWUgYSAiSEFSRCIgcmVzZXQgaW4gb3JkZXIgZm9yIHRoZSBSSVNDIGludGVycnVwdAotCQkJICogYml0IHRvIGJlIGNsZWFyZWQuICBTY2hlZHVsZSBhIGJpZyBoYW1tbWVyIHRvIGdldAorCQkJICogYml0IHRvIGJlIGNsZWFyZWQuICBTY2hlZHVsZSBhIGJpZyBoYW1tZXIgdG8gZ2V0CiAJCQkgKiBvdXQgb2YgdGhlIFJJU0MgUEFVU0VEIHN0YXRlLgogCQkJICovCiAJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9SRVNFVF9SSVNDKTsKQEAgLTE2OSw3ICsxNjksNyBAQAogCQkJLyoKIAkJCSAqIElzc3VlIGEgIkhBUkQiIHJlc2V0IGluIG9yZGVyIGZvciB0aGUgUklTQwogCQkJICogaW50ZXJydXB0IGJpdCB0byBiZSBjbGVhcmVkLiAgU2NoZWR1bGUgYSBiaWcKLQkJCSAqIGhhbW1tZXIgdG8gZ2V0IG91dCBvZiB0aGUgUklTQyBQQVVTRUQgc3RhdGUuCisJCQkgKiBoYW1tZXIgdG8gZ2V0IG91dCBvZiB0aGUgUklTQyBQQVVTRUQgc3RhdGUuCiAJCQkgKi8KIAkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1JFU0VUX1JJU0MpOwogCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMKaW5kZXggODJlOWU1Yy4uY2Y4ZGZhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYwpAQCAtMTk3LDYgKzE5Nyw3IEBACiAJeyJJQk0iLCAiUHJvRmlicmUgNDAwMFIiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX0xBUkdFTFVOfSwKIAl7IklCTSIsICIyMTA1IiwgTlVMTCwgQkxJU1RfUkVUUllfSFdFUlJPUn0sCiAJeyJpb21lZ2EiLCAiamF6IDFHQiIsICJKLjg2IiwgQkxJU1RfTk9UUSB8IEJMSVNUX05PTFVOfSwKKwl7IklPTUVHQSIsICJaSVAiLCBOVUxMLCBCTElTVF9OT1RRIHwgQkxJU1RfTk9MVU59LAogCXsiSU9NRUdBIiwgIklvMjBTICAgICAgICAgKkYiLCBOVUxMLCBCTElTVF9LRVl9LAogCXsiSU5TSVRFIiwgIkZsb3B0aWNhbCAgIEYqOEkiLCBOVUxMLCBCTElTVF9LRVl9LAogCXsiSU5TSVRFIiwgIkkzMjVWTSIsIE5VTEwsIEJMSVNUX0tFWX0sCkBAIC0yNDMsNiArMjQ0LDcgQEAKIAl7IlRvcm5hZG8tIiwgIkY0IiwgIioiLCBCTElTVF9OT1JFUE9SVExVTn0sCiAJeyJUT1NISUJBIiwgIkNEUk9NIiwgTlVMTCwgQkxJU1RfSVNST019LAogCXsiVE9TSElCQSIsICJDRC1ST00iLCBOVUxMLCBCTElTVF9JU1JPTX0sCisJeyJUcmF4ZGF0YSIsICJDRFI0MTIwIiwgTlVMTCwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLwogCXsiVVNCMi4wIiwgIlNNQVJUTUVESUEvWEQiLCBOVUxMLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX0lOUVVJUllfMzZ9LAogCXsiV2FuZ0RBVCIsICJNb2RlbCAyNjAwIiwgIjAxLjciLCBCTElTVF9TRUxFQ1RfTk9fQVROfSwKIAl7IldhbmdEQVQiLCAiTW9kZWwgMzIwMCIsICIwMi4yIiwgQkxJU1RfU0VMRUNUX05PX0FUTn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCmluZGV4IGVjMTgwM2EuLjI4ZDljOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC0yMTMsNiArMjEzLDggQEAKIAlpbnQgcmV0ID0gRFJJVkVSX0VSUk9SIDw8IDI0OwogCiAJcmVxID0gYmxrX2dldF9yZXF1ZXN0KHNkZXYtPnJlcXVlc3RfcXVldWUsIHdyaXRlLCBfX0dGUF9XQUlUKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChidWZmbGVuICYmCWJsa19ycV9tYXBfa2VybihzZGV2LT5yZXF1ZXN0X3F1ZXVlLCByZXEsCiAJCQkJCWJ1ZmZlciwgYnVmZmxlbiwgX19HRlBfV0FJVCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9wbS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfcG0uYwppbmRleCBkNzBlOTFhLi5kODJhMDIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfcG0uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9wbS5jCkBAIC0xNDQsOSArMTQ0LDkgQEAKIAlpbnQJZXJyOwogCiAJZXJyID0gcG1fcnVudGltZV9nZXRfc3luYygmc2Rldi0+c2Rldl9nZW5kZXYpOwotCWlmIChlcnIgPCAwKQorCWlmIChlcnIgPCAwICYmIGVyciAhPS1FQUNDRVMpCiAJCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKLQllbHNlIGlmIChlcnIgPiAwKQorCWVsc2UKIAkJZXJyID0gMDsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTczLDkgKzE3Myw5IEBACiAJaW50CWVycjsKIAogCWVyciA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnNob3N0LT5zaG9zdF9nZW5kZXYpOwotCWlmIChlcnIgPCAwKQorCWlmIChlcnIgPCAwICYmIGVyciAhPS1FQUNDRVMpCiAJCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnNob3N0LT5zaG9zdF9nZW5kZXYpOwotCWVsc2UgaWYgKGVyciA+IDApCisJZWxzZQogCQllcnIgPSAwOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2VzLmMgYi9kcml2ZXJzL3Njc2kvc2VzLmMKaW5kZXggZWI3YTNlOC4uZWJhMTgzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Nlcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZXMuYwpAQCAtMTYwLDYgKzE2MCwxMCBAQAogCXJldHVybiBOVUxMOwogfQogCisvKiBGb3IgZGV2aWNlIHNsb3QgYW5kIGFycmF5IGRldmljZSBzbG90IGVsZW1lbnRzLCBieXRlIDMgYml0IDYKKyAqIGlzICJmYXVsdCBzZW5zZWQiIHdoaWxlIGJ5dGUgMyBiaXQgNSBpcyAiZmF1bHQgcmVxc3RkIi4gQXMgdGhpcworICogY29kZSBzdGFuZHMgdGhlc2UgYml0cyBhcmUgc2hpZnRlZCA0IHBvc2l0aW9ucyByaWdodCBzbyBpbgorICogc3lzZnMgdGhleSB3aWxsIGFwcGVhciBhcyBiaXRzIDIgYW5kIDEgcmVzcGVjdGl2ZWx5LiBTdHJhbmdlLiAqLwogc3RhdGljIHZvaWQgc2VzX2dldF9mYXVsdChzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqZWRldiwKIAkJCSAgc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgKmVjb21wKQogewpAQCAtMTgxLDcgKzE4NSw3IEBACiAJCS8qIHplcm8gaXMgZGlzYWJsZWQgKi8KIAkJYnJlYWs7CiAJY2FzZSBFTkNMT1NVUkVfU0VUVElOR19FTkFCTEVEOgotCQlkZXNjWzJdID0gMHgwMjsKKwkJZGVzY1szXSA9IDB4MjA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIFNFUyBkb2Vzbid0IGRvIHRoZSBTR1BJTyBibGluayBzZXR0aW5ncyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyLmMgYi9kcml2ZXJzL3Njc2kvc3IuYwppbmRleCA0Nzc4ZTI3Li41ZmM5N2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3IuYworKysgYi9kcml2ZXJzL3Njc2kvc3IuYwpAQCAtMjIxLDE0ICsyMjEsMzMgQEAKIAkJcmV0dXJuIDA7CiAKIAlldmVudHMgPSBzcl9nZXRfZXZlbnRzKGNkLT5kZXZpY2UpOworCWNkLT5nZXRfZXZlbnRfY2hhbmdlZCB8PSBldmVudHMgJiBESVNLX0VWRU5UX01FRElBX0NIQU5HRTsKKworCS8qCisJICogSWYgZWFybGllciBHRVRfRVZFTlRfU1RBVFVTX05PVElGSUNBVElPTiBhbmQgVFVSIGRpZCBub3QgYWdyZWUKKwkgKiBmb3Igc2V2ZXJhbCB0aW1lcyBpbiBhIHJvdy4gIFdlIHJlbHkgb24gVFVSIG9ubHkgZm9yIHRoaXMgbGlrZWx5CisJICogYnJva2VuIGRldmljZSwgdG8gcHJldmVudCBnZW5lcmF0aW5nIGluY29ycmVjdCBtZWRpYSBjaGFuZ2VkCisJICogZXZlbnRzIGZvciBldmVyeSBvcGVuKCkuCisJICovCisJaWYgKGNkLT5pZ25vcmVfZ2V0X2V2ZW50KSB7CisJCWV2ZW50cyAmPSB+RElTS19FVkVOVF9NRURJQV9DSEFOR0U7CisJCWdvdG8gZG9fdHVyOworCX0KKwogCS8qCiAJICogR0VUX0VWRU5UX1NUQVRVU19OT1RJRklDQVRJT04gaXMgZW5vdWdoIHVubGVzcyBNRURJQV9DSEFOR0UKIAkgKiBpcyBiZWluZyBjbGVhcmVkLiAgTm90ZSB0aGF0IHRoZXJlIGFyZSBkZXZpY2VzIHdoaWNoIGhhbmcKIAkgKiBpZiBhc2tlZCB0byBleGVjdXRlIFRVUiByZXBlYXRlZGx5LgogCSAqLwotCWlmICghKGNsZWFyaW5nICYgRElTS19FVkVOVF9NRURJQV9DSEFOR0UpKQotCQlnb3RvIHNraXBfdHVyOworCWlmIChjZC0+ZGV2aWNlLT5jaGFuZ2VkKSB7CisJCWV2ZW50cyB8PSBESVNLX0VWRU5UX01FRElBX0NIQU5HRTsKKwkJY2QtPmRldmljZS0+Y2hhbmdlZCA9IDA7CisJCWNkLT50dXJfY2hhbmdlZCA9IHRydWU7CisJfQogCisJaWYgKCEoY2xlYXJpbmcgJiBESVNLX0VWRU5UX01FRElBX0NIQU5HRSkpCisJCXJldHVybiBldmVudHM7Citkb190dXI6CiAJLyogbGV0J3Mgc2VlIHdoZXRoZXIgdGhlIG1lZGlhIGlzIHRoZXJlIHdpdGggVFVSICovCiAJbGFzdF9wcmVzZW50ID0gY2QtPm1lZGlhX3ByZXNlbnQ7CiAJcmV0ID0gc2NzaV90ZXN0X3VuaXRfcmVhZHkoY2QtPmRldmljZSwgU1JfVElNRU9VVCwgTUFYX1JFVFJJRVMsICZzc2hkcik7CkBAIC0yNDIsMTMgKzI2MSwzMiBAQAogCQkoc2NzaV9zZW5zZV92YWxpZCgmc3NoZHIpICYmIHNzaGRyLmFzYyAhPSAweDNhKTsKIAogCWlmIChsYXN0X3ByZXNlbnQgIT0gY2QtPm1lZGlhX3ByZXNlbnQpCi0JCWV2ZW50cyB8PSBESVNLX0VWRU5UX01FRElBX0NIQU5HRTsKLXNraXBfdHVyOgorCQljZC0+ZGV2aWNlLT5jaGFuZ2VkID0gMTsKKwogCWlmIChjZC0+ZGV2aWNlLT5jaGFuZ2VkKSB7CiAJCWV2ZW50cyB8PSBESVNLX0VWRU5UX01FRElBX0NIQU5HRTsKIAkJY2QtPmRldmljZS0+Y2hhbmdlZCA9IDA7CisJCWNkLT50dXJfY2hhbmdlZCA9IHRydWU7CiAJfQogCisJaWYgKGNkLT5pZ25vcmVfZ2V0X2V2ZW50KQorCQlyZXR1cm4gZXZlbnRzOworCisJLyogY2hlY2sgd2hldGhlciBHRVRfRVZFTlQgaXMgcmVwb3J0aW5nIHNwdXJpb3VzIE1FRElBX0NIQU5HRSAqLworCWlmICghY2QtPnR1cl9jaGFuZ2VkKSB7CisJCWlmIChjZC0+Z2V0X2V2ZW50X2NoYW5nZWQpIHsKKwkJCWlmIChjZC0+dHVyX21pc21hdGNoKysgPiA4KSB7CisJCQkJc2Rldl9wcmludGsoS0VSTl9XQVJOSU5HLCBjZC0+ZGV2aWNlLAorCQkJCQkgICAgIkdFVF9FVkVOVCBhbmQgVFVSIGRpc2FncmVlIGNvbnRpbnVvdXNseSwgc3VwcHJlc3MgR0VUX0VWRU5UIGV2ZW50c1xuIik7CisJCQkJY2QtPmlnbm9yZV9nZXRfZXZlbnQgPSB0cnVlOworCQkJfQorCQl9IGVsc2UgeworCQkJY2QtPnR1cl9taXNtYXRjaCA9IDA7CisJCX0KKwl9CisJY2QtPnR1cl9jaGFuZ2VkID0gZmFsc2U7CisJY2QtPmdldF9ldmVudF9jaGFuZ2VkID0gZmFsc2U7CisKIAlyZXR1cm4gZXZlbnRzOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3IuaCBiL2RyaXZlcnMvc2NzaS9zci5oCmluZGV4IGUwMzZmMWQuLjM3YzhmNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zci5oCisrKyBiL2RyaXZlcnMvc2NzaS9zci5oCkBAIC00MSw2ICs0MSwxMyBAQAogCXVuc2lnbmVkIHJlYWRjZF9rbm93bjoxOwkvKiBkcml2ZSBzdXBwb3J0cyBSRUFEX0NEICgweGJlKSAqLwogCXVuc2lnbmVkIHJlYWRjZF9jZGRhOjE7CS8qIHJlYWRpbmcgYXVkaW8gZGF0YSB1c2luZyBSRUFEX0NEICovCiAJdW5zaWduZWQgbWVkaWFfcHJlc2VudDoxOwkvKiBtZWRpYSBpcyBwcmVzZW50ICovCisKKwkvKiBHRVRfRVZFTlQgc3B1cmlvdXMgZXZlbnQgaGFuZGxpbmcsIGJsayBsYXllciBndWFyYW50ZWVzIGV4Y2x1c2lvbiAqLworCWludCB0dXJfbWlzbWF0Y2g7CQkvKiBuciBvZiBnZXRfZXZlbnQgVFVSIG1pc21hdGNoZXMgKi8KKwlib29sIHR1cl9jaGFuZ2VkOjE7CQkvKiBjaGFuZ2VkIGFjY29yZGluZyB0byBUVVIgKi8KKwlib29sIGdldF9ldmVudF9jaGFuZ2VkOjE7CS8qIGNoYW5nZWQgYWNjb3JkaW5nIHRvIEdFVF9FVkVOVCAqLworCWJvb2wgaWdub3JlX2dldF9ldmVudDoxOwkvKiBHRVRfRVZFTlQgaXMgdW5yZWxpYWJsZSwgdXNlIFRVUiAqLworCiAJc3RydWN0IGNkcm9tX2RldmljZV9pbmZvIGNkaTsKIAkvKiBXZSBob2xkIGdlbmRpc2sgYW5kIHNjc2lfZGV2aWNlIHJlZmVyZW5jZXMgb24gcHJvYmUgYW5kIHVzZQogCSAqIHRoZSByZWZzIG9uIHRoaXMga3JlZiB0byBkZWNpZGUgd2hlbiB0byByZWxlYXNlIHRoZW0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdW4zX05DUjUzODAuYyBiL2RyaXZlcnMvc2NzaS9zdW4zX05DUjUzODAuYwppbmRleCAwN2VhZWYxLi43ZTEyYTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3VuM19OQ1I1MzgwLmMKKysrIGIvZHJpdmVycy9zY3NpL3N1bjNfTkNSNTM4MC5jCkBAIC00OSwxMyArNDksNiBAQAogICogICAgaW5zaWRlIHRoZSBleGVjdXRpb24gb2YgTkNSNTM4MF9pbnRyKCksIGxlYWRpbmcgdG8gcmVjdXJzaXZlCiAgKiAgICBjYWxscy4KICAqCi0gKiAgLSBJJ3ZlIGFkZGVkIGEgZnVuY3Rpb24gbWVyZ2VfY29udGlndW91c19idWZmZXJzKCkgdGhhdCB0cmllcyB0bwotICogICAgbWVyZ2Ugc2NhdHRlci1nYXRoZXIgYnVmZmVycyB0aGF0IGFyZSBsb2NhdGVkIGF0IGNvbnRpZ3VvdXMKLSAqICAgIHBoeXNpY2FsIGFkZHJlc3NlcyBhbmQgY2FuIGJlIHByb2Nlc3NlZCB3aXRoIHRoZSBzYW1lIERNQSBzZXR1cC4KLSAqICAgIFNpbmNlIG1vc3Qgc2NhdHRlci1nYXRoZXIgb3BlcmF0aW9ucyB3b3JrIG9uIGEgcGFnZSAoNEspIG9mCi0gKiAgICA0IGJ1ZmZlcnMgKDFLKSwgaW4gbW9yZSB0aGFuIDkwJSBvZiBhbGwgY2FzZXMgdGhyZWUgaW50ZXJydXB0cyBhbmQKLSAqICAgIERNQSBzZXR1cCBhY3Rpb25zIGFyZSBzYXZlZC4KLSAqCiAgKiAtIEkndmUgZGVsZXRlZCBhbGwgdGhlIHN0dWZmIGZvciBBVVRPUFJPQkVfSVJRLCBSRUFMX0RNQV9QT0xMLCBQU0VVRE9fRE1BCiAgKiAgICBhbmQgVVNMRUVQLCBiZWNhdXNlIHRoZXNlIHdlcmUgbWVzc2luZyB1cCByZWFkYWJpbGl0eSBhbmQgd2lsbCBuZXZlciBiZQogICogICAgbmVlZGVkIGZvciBBdGFyaSBTQ1NJLgpAQCAtMjY2LDggKzI1OSw5IEBACiAJKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopKGluKS0+aG9zdGRhdGEKICNkZWZpbmUJSE9TVERBVEEoaW4pICgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikoaW4pLT5ob3N0ZGF0YSkKIAotI2RlZmluZQlORVhUKGNtZCkJKCooc3RydWN0IHNjc2lfY21uZCAqKikmKChjbWQpLT5ob3N0X3NjcmliYmxlKSkKLSNkZWZpbmUJTkVYVEFERFIoY21kKQkoKHN0cnVjdCBzY3NpX2NtbmQgKiopJigoY21kKS0+aG9zdF9zY3JpYmJsZSkpCisjZGVmaW5lCU5FWFQoY21kKQkJKChzdHJ1Y3Qgc2NzaV9jbW5kICopKGNtZCktPmhvc3Rfc2NyaWJibGUpCisjZGVmaW5lCVNFVF9ORVhUKGNtZCwgbmV4dCkJKChjbWQpLT5ob3N0X3NjcmliYmxlID0gKHZvaWQgKikobmV4dCkpCisjZGVmaW5lCU5FWFRBRERSKGNtZCkJCSgoc3RydWN0IHNjc2lfY21uZCAqKikmKChjbWQpLT5ob3N0X3NjcmliYmxlKSkKIAogI2RlZmluZQlIT1NUTk8JCWluc3RhbmNlLT5ob3N0X25vCiAjZGVmaW5lCUhfTk8oY21kKQkoY21kKS0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vCkBAIC00NTksNDcgKzQ1Myw2IEBACiAKIAogLyoKLSAqIEZ1bmN0aW9uOiB2b2lkIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCi0gKgotICogUHVycG9zZTogVHJ5IHRvIG1lcmdlIHNldmVyYWwgc2NhdHRlci1nYXRoZXIgcmVxdWVzdHMgaW50byBvbmUgRE1BCi0gKiAgICB0cmFuc2Zlci4gVGhpcyBpcyBwb3NzaWJsZSBpZiB0aGUgc2NhdHRlciBidWZmZXJzIGxpZSBvbgotICogICAgcGh5c2ljYWwgY29udGlndW91cyBhZGRyZXNzZXMuCi0gKgotICogUGFyYW1ldGVyczogc3RydWN0IHNjc2lfY21uZCAqY21kCi0gKiAgICBUaGUgY29tbWFuZCB0byB3b3JrIG9uLiBUaGUgZmlyc3Qgc2NhdHRlciBidWZmZXIncyBkYXRhIGFyZQotICogICAgYXNzdW1lZCB0byBiZSBhbHJlYWR5IHRyYW5zZmVycmVkIGludG8gcHRyL3RoaXNfcmVzaWR1YWwuCi0gKi8KLQotc3RhdGljIHZvaWQgbWVyZ2VfY29udGlndW91c19idWZmZXJzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIGVuZGFkZHI7Ci0jaWYgKE5ERUJVRyAmIE5ERUJVR19NRVJHSU5HKQotICAgIHVuc2lnbmVkIGxvbmcgb2xkbGVuID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbDsKLSAgICBpbnQJCSAgY250ID0gMTsKLSNlbmRpZgotCi0gICAgZm9yIChlbmRhZGRyID0gdmlydF90b19waHlzKGNtZC0+U0NwLnB0ciArIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgLSAxKSArIDE7Ci0JIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgJiYKLQkgdmlydF90b19waHlzKFNHQUREUigmKGNtZC0+U0NwLmJ1ZmZlclsxXSkpKSA9PSBlbmRhZGRyOyApIHsKLQkKLQlNRVJfUFJJTlRLKCJWVE9QKCVwKSA9PSAlMDhseCAtPiBtZXJnaW5nXG4iLAotCQkgICBTR0FERFIoJihjbWQtPlNDcC5idWZmZXJbMV0pKSwgZW5kYWRkcik7Ci0jaWYgKE5ERUJVRyAmIE5ERUJVR19NRVJHSU5HKQotCSsrY250OwotI2VuZGlmCi0JKytjbWQtPlNDcC5idWZmZXI7Ci0JLS1jbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOwotCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgKz0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7Ci0JZW5kYWRkciArPSBjbWQtPlNDcC5idWZmZXItPmxlbmd0aDsKLSAgICB9Ci0jaWYgKE5ERUJVRyAmIE5ERUJVR19NRVJHSU5HKQotICAgIGlmIChvbGRsZW4gIT0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCkKLQlNRVJfUFJJTlRLKCJtZXJnZWQgJWQgYnVmZmVycyBmcm9tICVwLCBuZXcgbGVuZ3RoICUwOHhcbiIsCi0JCSAgIGNudCwgY21kLT5TQ3AucHRyLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKLSNlbmRpZgotfQotCi0vKgogICogRnVuY3Rpb24gOiB2b2lkIGluaXRpYWxpemVfU0NwKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKICAqCiAgKiBQdXJwb3NlIDogaW5pdGlhbGl6ZSB0aGUgc2F2ZWQgZGF0YSBwb2ludGVycyBmb3IgY21kIHRvIHBvaW50IHRvIHRoZSAKQEAgLTUyMCwxMSArNDczLDYgQEAKIAljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gc2NzaV9zZ19jb3VudChjbWQpIC0gMTsKIAljbWQtPlNDcC5wdHIgPSAoY2hhciAqKSBTR0FERFIoY21kLT5TQ3AuYnVmZmVyKTsKIAljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7Ci0KLQkvKiArK3JvbWFuOiBUcnkgdG8gbWVyZ2Ugc29tZSBzY2F0dGVyLWJ1ZmZlcnMgaWYgdGhleSBhcmUgYXQKLQkgKiBjb250aWd1b3VzIHBoeXNpY2FsIGFkZHJlc3Nlcy4KLQkgKi8KLS8vCW1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycyggY21kICk7CiAgICAgfSBlbHNlIHsKIAljbWQtPlNDcC5idWZmZXIgPSBOVUxMOwogCWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSAwOwpAQCAtODQxLDcgKzc4OSw3IEBACiAgKiAKICAqLwogCi1zdGF0aWMgaW50IE5DUjUzODBfaW5pdCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCBmbGFncykKK3N0YXRpYyBpbnQgX19pbml0IE5DUjUzODBfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgaW50IGZsYWdzKQogewogICAgIGludCBpOwogICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKQEAgLTg4OSw2ICs4MzcsMTEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgTkNSNTM4MF9leGl0KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCS8qIEVtcHR5LCBhcyB3ZSBkaWRuJ3Qgc2NoZWR1bGUgYW55IGRlbGF5ZWQgd29yayAqLworfQorCiAvKiAKICAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfcXVldWVfY29tbWFuZCAoc3RydWN0IHNjc2lfY21uZCAqY21kLAogICoJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCkBAIC05NjIsNyArOTE1LDcgQEAKICAgICAgKiBpbiBhIHF1ZXVlIAogICAgICAqLwogCi0gICAgTkVYVChjbWQpID0gTlVMTDsKKyAgICBTRVRfTkVYVChjbWQsIE5VTEwpOwogICAgIGNtZC0+c2NzaV9kb25lID0gZG9uZTsKIAogICAgIGNtZC0+cmVzdWx0ID0gMDsKQEAgLTk5MCwxNCArOTQzLDE0IEBACiAgICAgICovCiAgICAgaWYgKCEoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKSB8fCAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpKSB7CiAJTElTVChjbWQsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7Ci0JTkVYVChjbWQpID0gaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCVNFVF9ORVhUKGNtZCwgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKTsKIAlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBjbWQ7CiAgICAgfSBlbHNlIHsKIAlmb3IgKHRtcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOwogCSAgICAgTkVYVCh0bXApOyB0bXAgPSBORVhUKHRtcCkpCiAJICAgIDsKIAlMSVNUKGNtZCwgdG1wKTsKLQlORVhUKHRtcCkgPSBjbWQ7CisJU0VUX05FWFQodG1wLCBjbWQpOwogICAgIH0KIAogICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTExMDUsMTIgKzEwNTgsMTIgQEAKIAkJICAgIGxvY2FsX2lycV9kaXNhYmxlKCk7CiAJCSAgICBpZiAocHJldikgewogCQkgICAgICAgIFJFTU9WRShwcmV2LCBORVhUKHByZXYpLCB0bXAsIE5FWFQodG1wKSk7Ci0JCQlORVhUKHByZXYpID0gTkVYVCh0bXApOworCQkJU0VUX05FWFQocHJldiwgTkVYVCh0bXApKTsKIAkJICAgIH0gZWxzZSB7CiAJCSAgICAgICAgUkVNT1ZFKC0xLCBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIHRtcCwgTkVYVCh0bXApKTsKIAkJCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IE5FWFQodG1wKTsKIAkJICAgIH0KLQkJICAgIE5FWFQodG1wKSA9IE5VTEw7CisJCSAgICBTRVRfTkVYVCh0bXAsIE5VTEwpOwogCQkgICAgCiAJCSAgICAvKiByZWVuYWJsZSBpbnRlcnJ1cHRzIGFmdGVyIGZpbmRpbmcgb25lICovCiAJCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CkBAIC0xMTQ0LDcgKzEwOTcsNyBAQAogCQkgICAgfSBlbHNlIHsKIAkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJCQlMSVNUKHRtcCwgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKTsKLQkJCU5FWFQodG1wKSA9IGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwkJCVNFVF9ORVhUKHRtcCwgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKTsKIAkJCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IHRtcDsKICNpZmRlZiBTVVBQT1JUX1RBR1MKIAkJCWNtZF9mcmVlX3RhZyggdG1wICk7CkBAIC0xNDM5LDcgKzEzOTIsNyBAQAogICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogICAgIC8qIFdhaXQgZm9yIGFyYml0cmF0aW9uIGxvZ2ljIHRvIGNvbXBsZXRlICovCi0jaWYgTkNSX1RJTUVPVVQKKyNpZmRlZiBOQ1JfVElNRU9VVAogICAgIHsKICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyAyKk5DUl9USU1FT1VUOwogCkBAIC0yMDcwLDExICsyMDIzLDYgQEAKIAkJICAgIC0tY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKIAkJICAgIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPlNDcC5idWZmZXItPmxlbmd0aDsKIAkJICAgIGNtZC0+U0NwLnB0ciA9IFNHQUREUihjbWQtPlNDcC5idWZmZXIpOwotCi0JCSAgICAvKiArK3JvbWFuOiBUcnkgdG8gbWVyZ2Ugc29tZSBzY2F0dGVyLWJ1ZmZlcnMgaWYKLQkJICAgICAqIHRoZXkgYXJlIGF0IGNvbnRpZ3VvdXMgcGh5c2ljYWwgYWRkcmVzc2VzLgotCQkgICAgICovCi0vLwkJICAgIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycyggY21kICk7CiAJCSAgICBJTkZfUFJJTlRLKCJzY3NpJWQ6ICVkIGJ5dGVzIGFuZCAlZCBidWZmZXJzIGxlZnRcbiIsCiAJCQkgICAgICAgSE9TVE5PLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsLAogCQkJICAgICAgIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpOwpAQCAtMjI3NCw3ICsyMjIyLDcgQEAKIAogCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQkJTElTVChjbWQsaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKTsKLQkJCU5FWFQoY21kKSA9IGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwkJCVNFVF9ORVhUKGNtZCwgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKTsKIAkJICAgICAgICBob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjbWQ7CiAJCSAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQkJUVVfUFJJTlRLKCJzY3NpJWQ6IFJFUVVFU1QgU0VOU0UgYWRkZWQgdG8gaGVhZCBvZiAiCkBAIC0yMzMwLDcgKzIyNzgsNyBAQAogCQkgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQkgICAgY21kLT5kZXZpY2UtPmRpc2Nvbm5lY3QgPSAxOwogCQkgICAgTElTVChjbWQsaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSk7Ci0JCSAgICBORVhUKGNtZCkgPSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOworCQkgICAgU0VUX05FWFQoY21kLCBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlKTsKIAkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOwogCQkgICAgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSA9IGNtZDsKIAkJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTI1ODksMTIgKzI1MzcsMTIgQEAKIAkgICAgKSB7CiAJICAgIGlmIChwcmV2KSB7CiAJCVJFTU9WRShwcmV2LCBORVhUKHByZXYpLCB0bXAsIE5FWFQodG1wKSk7Ci0JCU5FWFQocHJldikgPSBORVhUKHRtcCk7CisJCVNFVF9ORVhUKHByZXYsIE5FWFQodG1wKSk7CiAJICAgIH0gZWxzZSB7CiAJCVJFTU9WRSgtMSwgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSwgdG1wLCBORVhUKHRtcCkpOwogCQlob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlID0gTkVYVCh0bXApOwogCSAgICB9Ci0JICAgIE5FWFQodG1wKSA9IE5VTEw7CisJICAgIFNFVF9ORVhUKHRtcCwgTlVMTCk7CiAJICAgIGJyZWFrOwogCX0KICAgICB9CkBAIC0yNzYyLDcgKzI3MTAsNyBAQAogCWlmIChjbWQgPT0gdG1wKSB7CiAJICAgIFJFTU9WRSg1LCAqcHJldiwgdG1wLCBORVhUKHRtcCkpOwogCSAgICAoKnByZXYpID0gTkVYVCh0bXApOwotCSAgICBORVhUKHRtcCkgPSBOVUxMOworCSAgICBTRVRfTkVYVCh0bXAsIE5VTEwpOwogCSAgICB0bXAtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKIAkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCSAgICBBQlJUX1BSSU5USygic2NzaSVkOiBhYm9ydCByZW1vdmVkIGNvbW1hbmQgZnJvbSBpc3N1ZSBxdWV1ZS5cbiIsCkBAIC0yODM1LDcgKzI3ODMsNyBAQAogCQkgICAgaWYgKGNtZCA9PSB0bXApIHsKIAkJICAgIFJFTU9WRSg1LCAqcHJldiwgdG1wLCBORVhUKHRtcCkpOwogCQkgICAgKnByZXYgPSBORVhUKHRtcCk7Ci0JCSAgICBORVhUKHRtcCkgPSBOVUxMOworCQkgICAgU0VUX05FWFQodG1wLCBOVUxMKTsKIAkJICAgIHRtcC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OwogCQkgICAgLyogV2UgbXVzdCB1bmxvY2sgdGhlIHRhZy9MVU4gaW1tZWRpYXRlbHkgaGVyZSwgc2luY2UgdGhlCiAJCSAgICAgKiB0YXJnZXQgZ29lcyB0byBCVVMgRlJFRSBhbmQgZG9lc24ndCBzZW5kIHVzIGFub3RoZXIKQEAgLTI5NDMsNyArMjg5MSw3IEBACiAKICAgICBmb3IgKGkgPSAwOyAoY21kID0gZGlzY29ubmVjdGVkX3F1ZXVlKTsgKytpKSB7CiAJZGlzY29ubmVjdGVkX3F1ZXVlID0gTkVYVChjbWQpOwotCU5FWFQoY21kKSA9IE5VTEw7CisJU0VUX05FWFQoY21kLCBOVUxMKTsKIAljbWQtPnJlc3VsdCA9IChjbWQtPnJlc3VsdCAmIDB4ZmZmZikgfCAoRElEX1JFU0VUIDw8IDE2KTsKIAljbWQtPnNjc2lfZG9uZSggY21kICk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5jIGIvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5jCmluZGV4IDYxM2Y1ODguLmJhZjczMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc3VuM19zY3NpLmMKQEAgLTcwLDYgKzcwLDEyIEBACiAjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoaW5lcy5oPgogCisjZGVmaW5lIE5ERUJVRyAwCisKKyNkZWZpbmUgTkRFQlVHX0FCT1JUCQkweDAwMTAwMDAwCisjZGVmaW5lIE5ERUJVR19UQUdTCQkweDAwMjAwMDAwCisjZGVmaW5lIE5ERUJVR19NRVJHSU5HCQkweDAwNDAwMDAwCisKIC8qIGRtYSBvbiEgKi8KICNkZWZpbmUgUkVBTF9ETUEKIApAQCAtODYsOCArOTIsNiBAQAogLyojZGVmaW5lIFJFU0VUX0JPT1QgKi8KICNkZWZpbmUgRFJJVkVSX1NFVFVQCiAKLSNkZWZpbmUgTkRFQlVHIDAKLQogLyoKICAqIEJVRyBjYW4gYmUgdXNlZCB0byB0cmlnZ2VyIGEgc3RyYW5nZSBjb2RlLXNpemUgcmVsYXRlZCBoYW5nIG9uIDIuMSBrZXJuZWxzCiAgKi8KQEAgLTE5NSw3ICsxOTksNyBAQAogICoKICAqLwogIAotaW50IHN1bjNzY3NpX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKK2ludCBfX2luaXQgc3VuM3Njc2lfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKiB0cG50KQogewogCXVuc2lnbmVkIGxvbmcgaW9hZGRyOwogCXN0YXRpYyBpbnQgY2FsbGVkID0gMDsKQEAgLTMxNCw2ICszMTgsNyBAQAogCiAJaW91bm1hcCgodm9pZCAqKXN1bjNfc2NzaV9yZWdwKTsKIAorCU5DUjUzODBfZXhpdChzaHBudCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2lfdm1lLmMgYi9kcml2ZXJzL3Njc2kvc3VuM19zY3NpX3ZtZS5jCmluZGV4IDdjNTI2YjguLmZiYmE3OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2lfdm1lLmMKKysrIGIvZHJpdmVycy9zY3NpL3N1bjNfc2NzaV92bWUuYwpAQCAtMzksNiArMzksMTIgQEAKIC8qIGRtYSBvbiEgKi8KICNkZWZpbmUgUkVBTF9ETUEKIAorI2RlZmluZSBOREVCVUcgMAorCisjZGVmaW5lIE5ERUJVR19BQk9SVAkJMHgwMDEwMDAwMAorI2RlZmluZSBOREVCVUdfVEFHUwkJMHgwMDIwMDAwMAorI2RlZmluZSBOREVCVUdfTUVSR0lORwkJMHgwMDQwMDAwMAorCiAjaW5jbHVkZSAic2NzaS5oIgogI2luY2x1ZGUgImluaXRpby5oIgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CkBAIC01MCw4ICs1Niw2IEBACiAvKiNkZWZpbmUgUkVTRVRfQk9PVCAqLwogI2RlZmluZSBEUklWRVJfU0VUVVAKIAotI2RlZmluZSBOREVCVUcgMAotCiAvKgogICogQlVHIGNhbiBiZSB1c2VkIHRvIHRyaWdnZXIgYSBzdHJhbmdlIGNvZGUtc2l6ZSByZWxhdGVkIGhhbmcgb24gMi4xIGtlcm5lbHMKICAqLwpAQCAtMTM3LDcgKzE0MSw3IEBACiAgKgogICovCiAgCi1zdGF0aWMgaW50IHN1bjNzY3NpX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKK3N0YXRpYyBpbnQgX19pbml0IHN1bjNzY3NpX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKIHsKIAl1bnNpZ25lZCBsb25nIGlvYWRkciwgaXJxID0gMDsKIAlzdGF0aWMgaW50IGNhbGxlZCA9IDA7CkBAIC0yODMsNiArMjg3LDcgQEAKIAogCWlvdW5tYXAoKHZvaWQgKilzdW4zX3Njc2lfcmVncCk7CiAKKwlOQ1I1MzgwX2V4aXQoc2hwbnQpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL2Nsay9jb3JlLmMgYi9kcml2ZXJzL3NoL2Nsay9jb3JlLmMKaW5kZXggNGY2NDE4My4uZDY3MDJlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9jbGsvY29yZS5jCisrKyBiL2RyaXZlcnMvc2gvY2xrL2NvcmUuYwpAQCAtNjM1LDcgKzYzNSw3IEBACiAJc3RydWN0IGNsayAqY2xrcDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xrcCwgJmNsb2NrX2xpc3QsIG5vZGUpIHsKLQkJaWYgKGxpa2VseShjbGtwLT5vcHMpKSB7CisJCWlmIChsaWtlbHkoY2xrcC0+dXNlY291bnQgJiYgY2xrcC0+b3BzKSkgewogCQkJdW5zaWduZWQgbG9uZyByYXRlID0gY2xrcC0+cmF0ZTsKIAogCQkJaWYgKGxpa2VseShjbGtwLT5vcHMtPnNldF9wYXJlbnQpKQpAQCAtNjcwLDcgKzY3MCw3IEBACiBzdGF0aWMgaW50IGNsa19kZWJ1Z2ZzX3JlZ2lzdGVyX29uZShzdHJ1Y3QgY2xrICpjKQogewogCWludCBlcnI7Ci0Jc3RydWN0IGRlbnRyeSAqZCwgKmNoaWxkLCAqY2hpbGRfdG1wOworCXN0cnVjdCBkZW50cnkgKmQ7CiAJc3RydWN0IGNsayAqcGEgPSBjLT5wYXJlbnQ7CiAJY2hhciBzWzI1NV07CiAJY2hhciAqcCA9IHM7CkBAIC02OTksMTAgKzY5OSw3IEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXQ6Ci0JZCA9IGMtPmRlbnRyeTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hpbGQsIGNoaWxkX3RtcCwgJmQtPmRfc3ViZGlycywgZF91LmRfY2hpbGQpCi0JCWRlYnVnZnNfcmVtb3ZlKGNoaWxkKTsKLQlkZWJ1Z2ZzX3JlbW92ZShjLT5kZW50cnkpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShjLT5kZW50cnkpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmluZGV4IGRlMzVjM2EuLjUyZTI5MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtODYsOSArODYsNiBAQAogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBhIFNQSSBidXMgdmlhIHRoZSBCbGFja2ZpbiBTUE9SVCBwZXJpcGhlcmFsLgogCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBzcGlfYmZpbl9zcG9ydC4KLQogY29uZmlnIFNQSV9BVTE1NTAKIAl0cmlzdGF0ZSAiQXUxNTUwL0F1MTJ4MCBTUEkgQ29udHJvbGxlciIKIAlkZXBlbmRzIG9uIChTT0NfQVUxNTUwIHx8IFNPQ19BVTEyMDApICYmIEVYUEVSSU1FTlRBTApAQCAtOTcsOSArOTQsNiBAQAogCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlCiAJICBBdTE1NTAgU1BJIGNvbnRyb2xsZXIgKG1heSBhbHNvIHdvcmsgd2l0aCBBdTEyMDAsQXUxMjEwLEF1MTI1MCkuCiAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGF1MTU1MF9zcGkuCi0KIGNvbmZpZyBTUElfQklUQkFORwogCXRyaXN0YXRlICJVdGlsaXRpZXMgZm9yIEJpdGJhbmdpbmcgU1BJIG1hc3RlcnMiCiAJaGVscApAQCAtMTMwLDkgKzEyNCw2IEBACiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIENvbGRmaXJlIFFTUEkgY29udHJvbGxlciBpbiBtYXN0ZXIKIAkgIG1vZGUuCiAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGNvbGRmaXJlX3FzcGkuCi0KIGNvbmZpZyBTUElfREFWSU5DSQogCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBEYVZpbmNpL0RBOHgvT01BUC1ML0FNMXggU29DIFNQSSBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBBUkNIX0RBVklOQ0kKQEAgLTE0MCw5ICsxMzEsNiBAQAogCWhlbHAKIAkgIFNQSSBtYXN0ZXIgY29udHJvbGxlciBmb3IgRGFWaW5jaS9EQTh4L09NQVAtTC9BTTF4IFNQSSBtb2R1bGVzLgogCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAotCSAgZGF2aW5jaV9zcGkuCi0KIGNvbmZpZyBTUElfRVA5M1hYCiAJdHJpc3RhdGUgIkNpcnJ1cyBMb2dpYyBFUDkzeHggU1BJIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBBUkNIX0VQOTNYWApAQCAtMTUwLDkgKzEzOCw2IEBACiAJICBUaGlzIGVuYWJsZXMgdXNpbmcgdGhlIENpcnJ1cyBFUDkzeHggU1BJIGNvbnRyb2xsZXIgaW4gbWFzdGVyCiAJICBtb2RlLgogCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgbW9kdWxlIHdpbGwgYmUKLQkgIGNhbGxlZCBlcDkzeHhfc3BpLgotCiBjb25maWcgU1BJX0dQSU8KIAl0cmlzdGF0ZSAiR1BJTy1iYXNlZCBiaXRiYW5naW5nIFNQSSBNYXN0ZXIiCiAJZGVwZW5kcyBvbiBHRU5FUklDX0dQSU8KQEAgLTE2OSwyMSArMTU0LDYgQEAKIAkgIEdQSU8gb3BlcmF0aW9ucywgeW91IHNob3VsZCBiZSBhYmxlIHRvIGxldmVyYWdlIHRoYXQgZm9yIGJldHRlcgogCSAgc3BlZWQgd2l0aCBhIGN1c3RvbSB2ZXJzaW9uIG9mIHRoaXMgZHJpdmVyOyBzZWUgdGhlIHNvdXJjZSBjb2RlLgogCi1jb25maWcgU1BJX0lNWF9WRVJfSU1YMQotCWRlZl9ib29sIHkgaWYgU09DX0lNWDEKLQotY29uZmlnIFNQSV9JTVhfVkVSXzBfMAotCWRlZl9ib29sIHkgaWYgU09DX0lNWDIxIHx8IFNPQ19JTVgyNwotCi1jb25maWcgU1BJX0lNWF9WRVJfMF80Ci0JZGVmX2Jvb2wgeSBpZiBTT0NfSU1YMzEKLQotY29uZmlnIFNQSV9JTVhfVkVSXzBfNwotCWRlZl9ib29sIHkgaWYgQVJDSF9NWDI1IHx8IFNPQ19JTVgzNSB8fCBTT0NfSU1YNTEgfHwgU09DX0lNWDUzCi0KLWNvbmZpZyBTUElfSU1YX1ZFUl8yXzMKLQlkZWZfYm9vbCB5IGlmIFNPQ19JTVg1MSB8fCBTT0NfSU1YNTMKLQogY29uZmlnIFNQSV9JTVgKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIGkuTVggU1BJIGNvbnRyb2xsZXJzIgogCWRlcGVuZHMgb24gQVJDSF9NWEMKQEAgLTMyOCwxNiArMjk4LDYgQEAKIAkgIG5vIGZyZWUgRE1BIGNoYW5uZWxzLCBvciB3aGVuIGRvaW5nIHRyYW5zZmVycyB0aGF0IHJlcXVpcmVkIGJvdGgKIAkgIFRYIGFuZCBSWCBkYXRhIHBhdGhzLgogCi1jb25maWcgU1BJX1MzQzI0WFhfR1BJTwotCXRyaXN0YXRlICJTYW1zdW5nIFMzQzI0WFggc2VyaWVzIFNQSSBieSBHUElPIgotCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBTUElfQklUQkFORwotCWhlbHAKLQkgIFNQSSBkcml2ZXIgZm9yIFNhbXN1bmcgUzNDMjRYWCBzZXJpZXMgQVJNIFNvQ3MgdXNpbmcKLQkgIEdQSU8gbGluZXMgdG8gcHJvdmlkZSB0aGUgU1BJIGJ1cy4gVGhpcyBjYW4gYmUgdXNlZCB3aGVyZQotCSAgdGhlIGluYnVpbHQgaGFyZHdhcmUgY2Fubm90IHByb3ZpZGUgdGhlIHRyYW5zZmVyIG1vZGUsIG9yCi0JICB3aGVyZSB0aGUgYm9hcmQgaXMgdXNpbmcgbm9uIGhhcmR3YXJlIGNvbm5lY3RlZCBwaW5zLgotCiBjb25maWcgU1BJX1MzQzY0WFgKIAl0cmlzdGF0ZSAiU2Ftc3VuZyBTM0M2NFhYIHNlcmllcyB0eXBlIFNQSSIKIAlkZXBlbmRzIG9uIChBUkNIX1MzQzY0WFggfHwgQVJDSF9TNVA2NFgwKQpAQCAtMzg1LDE2ICszNDUsMTYgQEAKIAkgIFRoaXMgc2VsZWN0cyBhbiBTUEkgbWFzdGVyIGltcGxlbWVudGF0aW9uIHVzaW5nIGEgVEkgc2VxdWVuY2VyCiAJICBzZXJpYWwgcG9ydC4KIAotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdGktc3NwLXNwaS4KLQogY29uZmlnIFNQSV9UT1BDTElGRl9QQ0gKLQl0cmlzdGF0ZSAiVG9wY2xpZmYgUENIIFNQSSBDb250cm9sbGVyIgorCXRyaXN0YXRlICJJbnRlbCBFRzIwVCBQQ0gvT0tJIFNFTUlDT05EVUNUT1IgTUw3MjEzIElPSCBTUEkgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIFBDSQogCWhlbHAKIAkgIFNQSSBkcml2ZXIgZm9yIHRoZSBUb3BjbGlmZiBQQ0ggKFBsYXRmb3JtIENvbnRyb2xsZXIgSHViKSBTUEkgYnVzCiAJICB1c2VkIGluIHNvbWUgeDg2IGVtYmVkZGVkIHByb2Nlc3NvcnMuCiAKKwkgIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIE1MNzIxMywgYSBjb21wYW5pb24gY2hpcCBmb3IgdGhlCisJICBBdG9tIEU2eHggc2VyaWVzIGFuZCBjb21wYXRpYmxlIHdpdGggdGhlIEludGVsIEVHMjBUIFBDSC4KKwogY29uZmlnIFNQSV9UWFg5CiAJdHJpc3RhdGUgIlRvc2hpYmEgVFh4OSBTUEkgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEdFTkVSSUNfR1BJTyAmJiBDUFVfVFg0OVhYCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9NYWtlZmlsZSBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCmluZGV4IDBmOGM2OWIuLjYxYzMyNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCkBAIC03LDY4ICs3LDU1IEBACiAjIHNtYWxsIGNvcmUsIG1vc3RseSB0cmFuc2xhdGluZyBib2FyZC1zcGVjaWZpYwogIyBjb25maWcgZGVjbGFyYXRpb25zIGludG8gZHJpdmVyIG1vZGVsIGNvZGUKIG9iai0kKENPTkZJR19TUElfTUFTVEVSKQkJKz0gc3BpLm8KK29iai0kKENPTkZJR19TUElfU1BJREVWKQkJKz0gc3BpZGV2Lm8KIAogIyBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVycyAoYnVzKQotb2JqLSQoQ09ORklHX1NQSV9BTFRFUkEpCQkrPSBzcGlfYWx0ZXJhLm8KLW9iai0kKENPTkZJR19TUElfQVRNRUwpCQkJKz0gYXRtZWxfc3BpLm8KLW9iai0kKENPTkZJR19TUElfQVRINzkpCQkJKz0gYXRoNzlfc3BpLm8KLW9iai0kKENPTkZJR19TUElfQkZJTikJCQkrPSBzcGlfYmZpbjV4eC5vCi1vYmotJChDT05GSUdfU1BJX0JGSU5fU1BPUlQpCQkrPSBzcGlfYmZpbl9zcG9ydC5vCi1vYmotJChDT05GSUdfU1BJX0JJVEJBTkcpCQkrPSBzcGlfYml0YmFuZy5vCi1vYmotJChDT05GSUdfU1BJX0FVMTU1MCkJCSs9IGF1MTU1MF9zcGkubwotb2JqLSQoQ09ORklHX1NQSV9CVVRURVJGTFkpCQkrPSBzcGlfYnV0dGVyZmx5Lm8KLW9iai0kKENPTkZJR19TUElfQ09MREZJUkVfUVNQSSkJCSs9IGNvbGRmaXJlX3FzcGkubwotb2JqLSQoQ09ORklHX1NQSV9EQVZJTkNJKQkJKz0gZGF2aW5jaV9zcGkubwotb2JqLSQoQ09ORklHX1NQSV9ERVNJR05XQVJFKQkJKz0gZHdfc3BpLm8KLW9iai0kKENPTkZJR19TUElfRFdfUENJKQkJKz0gZHdfc3BpX21pZHBjaS5vCi1kd19zcGlfbWlkcGNpLW9ianMJCQk6PSBkd19zcGlfcGNpLm8gZHdfc3BpX21pZC5vCi1vYmotJChDT05GSUdfU1BJX0RXX01NSU8pCQkrPSBkd19zcGlfbW1pby5vCi1vYmotJChDT05GSUdfU1BJX0VQOTNYWCkJCSs9IGVwOTN4eF9zcGkubwotb2JqLSQoQ09ORklHX1NQSV9HUElPKQkJCSs9IHNwaV9ncGlvLm8KLW9iai0kKENPTkZJR19TUElfSU1YKQkJCSs9IHNwaV9pbXgubwotb2JqLSQoQ09ORklHX1NQSV9MTTcwX0xMUCkJCSs9IHNwaV9sbTcwbGxwLm8KLW9iai0kKENPTkZJR19TUElfUFhBMlhYKQkJKz0gcHhhMnh4X3NwaS5vCi1vYmotJChDT05GSUdfU1BJX1BYQTJYWF9QQ0kpCQkrPSBweGEyeHhfc3BpX3BjaS5vCi1vYmotJChDT05GSUdfU1BJX09DX1RJTlkpCQkrPSBzcGlfb2NfdGlueS5vCi1vYmotJChDT05GSUdfU1BJX09NQVBfVVdJUkUpCQkrPSBvbWFwX3V3aXJlLm8KLW9iai0kKENPTkZJR19TUElfT01BUDI0WFgpCQkrPSBvbWFwMl9tY3NwaS5vCi1vYmotJChDT05GSUdfU1BJX09NQVBfMTAwSykJCSs9IG9tYXBfc3BpXzEwMGsubwotb2JqLSQoQ09ORklHX1NQSV9PUklPTikJCQkrPSBvcmlvbl9zcGkubwotb2JqLSQoQ09ORklHX1NQSV9QTDAyMikJCQkrPSBhbWJhLXBsMDIyLm8KLW9iai0kKENPTkZJR19TUElfTVBDNTEyeF9QU0MpCQkrPSBtcGM1MTJ4X3BzY19zcGkubwotb2JqLSQoQ09ORklHX1NQSV9NUEM1Mnh4X1BTQykJCSs9IG1wYzUyeHhfcHNjX3NwaS5vCi1vYmotJChDT05GSUdfU1BJX01QQzUyeHgpCQkrPSBtcGM1Mnh4X3NwaS5vCi1vYmotJChDT05GSUdfU1BJX0ZTTF9MSUIpCQkrPSBzcGlfZnNsX2xpYi5vCi1vYmotJChDT05GSUdfU1BJX0ZTTF9FU1BJKQkJKz0gc3BpX2ZzbF9lc3BpLm8KLW9iai0kKENPTkZJR19TUElfRlNMX1NQSSkJCSs9IHNwaV9mc2xfc3BpLm8KLW9iai0kKENPTkZJR19TUElfUFBDNHh4KQkJKz0gc3BpX3BwYzR4eC5vCi1vYmotJChDT05GSUdfU1BJX1MzQzI0WFhfR1BJTykJCSs9IHNwaV9zM2MyNHh4X2dwaW8ubwotb2JqLSQoQ09ORklHX1NQSV9TM0MyNFhYKQkJKz0gc3BpX3MzYzI0eHhfaHcubwotb2JqLSQoQ09ORklHX1NQSV9TM0M2NFhYKQkJKz0gc3BpX3MzYzY0eHgubwotb2JqLSQoQ09ORklHX1NQSV9URUdSQSkJCQkrPSBzcGlfdGVncmEubwotb2JqLSQoQ09ORklHX1NQSV9USV9TU1ApCQkrPSB0aS1zc3Atc3BpLm8KLW9iai0kKENPTkZJR19TUElfVE9QQ0xJRkZfUENIKQkJKz0gc3BpX3RvcGNsaWZmX3BjaC5vCi1vYmotJChDT05GSUdfU1BJX1RYWDkpCQkJKz0gc3BpX3R4eDkubwotb2JqLSQoQ09ORklHX1NQSV9YSUxJTlgpCQkrPSB4aWxpbnhfc3BpLm8KLW9iai0kKENPTkZJR19TUElfU0gpCQkJKz0gc3BpX3NoLm8KLW9iai0kKENPTkZJR19TUElfU0hfU0NJKQkJKz0gc3BpX3NoX3NjaS5vCi1vYmotJChDT05GSUdfU1BJX1NIX01TSU9GKQkJKz0gc3BpX3NoX21zaW9mLm8KLW9iai0kKENPTkZJR19TUElfU1RNUDNYWFgpCQkrPSBzcGlfc3RtcC5vCi1vYmotJChDT05GSUdfU1BJX05VQzkwMCkJCSs9IHNwaV9udWM5MDAubworb2JqLSQoQ09ORklHX1NQSV9BTFRFUkEpCQkrPSBzcGktYWx0ZXJhLm8KK29iai0kKENPTkZJR19TUElfQVRNRUwpCQkJKz0gc3BpLWF0bWVsLm8KK29iai0kKENPTkZJR19TUElfQVRINzkpCQkJKz0gc3BpLWF0aDc5Lm8KK29iai0kKENPTkZJR19TUElfQVUxNTUwKQkJKz0gc3BpLWF1MTU1MC5vCitvYmotJChDT05GSUdfU1BJX0JGSU4pCQkJKz0gc3BpLWJmaW41eHgubworb2JqLSQoQ09ORklHX1NQSV9CRklOX1NQT1JUKQkJKz0gc3BpLWJmaW4tc3BvcnQubworb2JqLSQoQ09ORklHX1NQSV9CSVRCQU5HKQkJKz0gc3BpLWJpdGJhbmcubworb2JqLSQoQ09ORklHX1NQSV9CVVRURVJGTFkpCQkrPSBzcGktYnV0dGVyZmx5Lm8KK29iai0kKENPTkZJR19TUElfQ09MREZJUkVfUVNQSSkJCSs9IHNwaS1jb2xkZmlyZS1xc3BpLm8KK29iai0kKENPTkZJR19TUElfREFWSU5DSSkJCSs9IHNwaS1kYXZpbmNpLm8KK29iai0kKENPTkZJR19TUElfREVTSUdOV0FSRSkJCSs9IHNwaS1kdy5vCitvYmotJChDT05GSUdfU1BJX0RXX01NSU8pCQkrPSBzcGktZHctbW1pby5vCitvYmotJChDT05GSUdfU1BJX0RXX1BDSSkJCSs9IHNwaS1kdy1taWRwY2kubworc3BpLWR3LW1pZHBjaS1vYmpzCQkJOj0gc3BpLWR3LXBjaS5vIHNwaS1kdy1taWQubworb2JqLSQoQ09ORklHX1NQSV9FUDkzWFgpCQkrPSBzcGktZXA5M3h4Lm8KK29iai0kKENPTkZJR19TUElfRlNMX0xJQikJCSs9IHNwaS1mc2wtbGliLm8KK29iai0kKENPTkZJR19TUElfRlNMX0VTUEkpCQkrPSBzcGktZnNsLWVzcGkubworb2JqLSQoQ09ORklHX1NQSV9GU0xfU1BJKQkJKz0gc3BpLWZzbC1zcGkubworb2JqLSQoQ09ORklHX1NQSV9HUElPKQkJCSs9IHNwaS1ncGlvLm8KK29iai0kKENPTkZJR19TUElfSU1YKQkJCSs9IHNwaS1pbXgubworb2JqLSQoQ09ORklHX1NQSV9MTTcwX0xMUCkJCSs9IHNwaS1sbTcwbGxwLm8KK29iai0kKENPTkZJR19TUElfTVBDNTEyeF9QU0MpCQkrPSBzcGktbXBjNTEyeC1wc2Mubworb2JqLSQoQ09ORklHX1NQSV9NUEM1Mnh4X1BTQykJCSs9IHNwaS1tcGM1Mnh4LXBzYy5vCitvYmotJChDT05GSUdfU1BJX01QQzUyeHgpCQkrPSBzcGktbXBjNTJ4eC5vCitvYmotJChDT05GSUdfU1BJX05VQzkwMCkJCSs9IHNwaS1udWM5MDAubworb2JqLSQoQ09ORklHX1NQSV9PQ19USU5ZKQkJKz0gc3BpLW9jLXRpbnkubworb2JqLSQoQ09ORklHX1NQSV9PTUFQX1VXSVJFKQkJKz0gc3BpLW9tYXAtdXdpcmUubworb2JqLSQoQ09ORklHX1NQSV9PTUFQXzEwMEspCQkrPSBzcGktb21hcC0xMDBrLm8KK29iai0kKENPTkZJR19TUElfT01BUDI0WFgpCQkrPSBzcGktb21hcDItbWNzcGkubworb2JqLSQoQ09ORklHX1NQSV9PUklPTikJCQkrPSBzcGktb3Jpb24ubworb2JqLSQoQ09ORklHX1NQSV9QTDAyMikJCQkrPSBzcGktcGwwMjIubworb2JqLSQoQ09ORklHX1NQSV9QUEM0eHgpCQkrPSBzcGktcHBjNHh4Lm8KK29iai0kKENPTkZJR19TUElfUFhBMlhYKQkJKz0gc3BpLXB4YTJ4eC5vCitvYmotJChDT05GSUdfU1BJX1BYQTJYWF9QQ0kpCQkrPSBzcGktcHhhMnh4LXBjaS5vCitvYmotJChDT05GSUdfU1BJX1MzQzI0WFgpCQkrPSBzcGktczNjMjR4eC1ody5vCitzcGktczNjMjR4eC1ody15CQkJOj0gc3BpLXMzYzI0eHgubworc3BpLXMzYzI0eHgtaHctJChDT05GSUdfU1BJX1MzQzI0WFhfRklRKSArPSBzcGktczNjMjR4eC1maXEubworb2JqLSQoQ09ORklHX1NQSV9TM0M2NFhYKQkJKz0gc3BpLXMzYzY0eHgubworb2JqLSQoQ09ORklHX1NQSV9TSCkJCQkrPSBzcGktc2gubworb2JqLSQoQ09ORklHX1NQSV9TSF9NU0lPRikJCSs9IHNwaS1zaC1tc2lvZi5vCitvYmotJChDT05GSUdfU1BJX1NIX1NDSSkJCSs9IHNwaS1zaC1zY2kubworb2JqLSQoQ09ORklHX1NQSV9TVE1QM1hYWCkJCSs9IHNwaS1zdG1wLm8KK29iai0kKENPTkZJR19TUElfVEVHUkEpCQkJKz0gc3BpLXRlZ3JhLm8KK29iai0kKENPTkZJR19TUElfVElfU1NQKQkJKz0gc3BpLXRpLXNzcC5vCitvYmotJChDT05GSUdfU1BJX1RMRTYyWDApCQkrPSBzcGktdGxlNjJ4MC5vCitvYmotJChDT05GSUdfU1BJX1RPUENMSUZGX1BDSCkJCSs9IHNwaS10b3BjbGlmZi1wY2gubworb2JqLSQoQ09ORklHX1NQSV9UWFg5KQkJCSs9IHNwaS10eHg5Lm8KK29iai0kKENPTkZJR19TUElfWElMSU5YKQkJKz0gc3BpLXhpbGlueC5vCiAKLSMgc3BlY2lhbCBidWlsZCBmb3IgczNjMjR4eCBzcGkgZHJpdmVyIHdpdGggZmlxIHN1cHBvcnQKLXNwaV9zM2MyNHh4X2h3LXkJCQk6PSBzcGlfczNjMjR4eC5vCi1zcGlfczNjMjR4eF9ody0kKENPTkZJR19TUElfUzNDMjRYWF9GSVEpICs9IHNwaV9zM2MyNHh4X2ZpcS5vCi0KLSMgCS4uLiBhZGQgYWJvdmUgdGhpcyBsaW5lIC4uLgotCi0jIFNQSSBwcm90b2NvbCBkcml2ZXJzIChkZXZpY2UvbGluayBvbiBidXMpCi1vYmotJChDT05GSUdfU1BJX1NQSURFVikJKz0gc3BpZGV2Lm8KLW9iai0kKENPTkZJR19TUElfVExFNjJYMCkJKz0gdGxlNjJ4MC5vCi0jIAkuLi4gYWRkIGFib3ZlIHRoaXMgbGluZSAuLi4KLQotIyBTUEkgc2xhdmUgY29udHJvbGxlciBkcml2ZXJzICh1cHN0cmVhbSBsaW5rKQotIyAJLi4uIGFkZCBhYm92ZSB0aGlzIGxpbmUgLi4uCi0KLSMgU1BJIHNsYXZlIGRyaXZlcnMgKHByb3RvY29sIGZvciB0aGF0IGxpbmspCi0jIAkuLi4gYWRkIGFib3ZlIHRoaXMgbGluZSAuLi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL2FtYmEtcGwwMjIuYyBiL2RyaXZlcnMvc3BpL2FtYmEtcGwwMjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5ZTU4ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NwaS9hbWJhLXBsMDIyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQ0ICswLDAgQEAKLS8qCi0gKiBkcml2ZXJzL3NwaS9hbWJhLXBsMDIyLmMKLSAqCi0gKiBBIGRyaXZlciBmb3IgdGhlIEFSTSBQTDAyMiBQcmltZUNlbGwgU1NQL1NQSSBidXMgbWFzdGVyLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFNULUVyaWNzc29uIEFCCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgU1RNaWNyb2VsZWN0cm9uaWNzIFB2dC4gTHRkLgotICoKLSAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4KLSAqCi0gKiBJbml0aWFsIHZlcnNpb24gaW5zcGlyZWQgYnk6Ci0gKglsaW51eC0yLjYuMTctcmMzLW1tMS9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKLSAqIEluaXRpYWwgYWRvcHRpb24gdG8gUEwwMjIgYnk6Ci0gKiAgICAgIFNhY2hpbiBWZXJtYSA8c2FjaGluLnZlcm1hQHN0LmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9wbDAyMi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KLQotLyoKLSAqIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBkZWZpbmUgc29tZSByZWdpc3RlciBkZWZhdWx0IHZhbHVlcy4KLSAqIHJlZyBpcyBtYXNrZWQgd2l0aCBtYXNrLCB0aGUgT1I6ZWQgd2l0aCBhbiAoYWdhaW4gbWFza2VkKQotICogdmFsIHNoaWZ0ZWQgc2Igc3RlcHMgdG8gdGhlIGxlZnQuCi0gKi8KLSNkZWZpbmUgU1NQX1dSSVRFX0JJVFMocmVnLCB2YWwsIG1hc2ssIHNiKSBcCi0gKChyZWcpID0gKCgocmVnKSAmIH4obWFzaykpIHwgKCgodmFsKTw8KHNiKSkgJiAobWFzaykpKSkKLQotLyoKLSAqIFRoaXMgbWFjcm8gaXMgYWxzbyB1c2VkIHRvIGRlZmluZSBzb21lIGRlZmF1bHQgdmFsdWVzLgotICogSXQgd2lsbCBqdXN0IHNoaWZ0IHZhbCBieSBzYiBzdGVwcyB0byB0aGUgbGVmdCBhbmQgbWFzawotICogdGhlIHJlc3VsdCB3aXRoIG1hc2suCi0gKi8KLSNkZWZpbmUgR0VOX01BU0tfQklUUyh2YWwsIG1hc2ssIHNiKSBcCi0gKCgodmFsKTw8KHNiKSkgJiAobWFzaykpCi0KLSNkZWZpbmUgRFJJVkVfVFgJCTAKLSNkZWZpbmUgRE9fTk9UX0RSSVZFX1RYCQkxCi0KLSNkZWZpbmUgRE9fTk9UX1FVRVVFX0RNQQkwCi0jZGVmaW5lIFFVRVVFX0RNQQkJMQotCi0jZGVmaW5lIFJYX1RSQU5TRkVSCQkxCi0jZGVmaW5lIFRYX1RSQU5TRkVSCQkyCi0KLS8qCi0gKiBNYWNyb3MgdG8gYWNjZXNzIFNTUCBSZWdpc3RlcnMgd2l0aCB0aGVpciBvZmZzZXRzCi0gKi8KLSNkZWZpbmUgU1NQX0NSMChyKQkociArIDB4MDAwKQotI2RlZmluZSBTU1BfQ1IxKHIpCShyICsgMHgwMDQpCi0jZGVmaW5lIFNTUF9EUihyKQkociArIDB4MDA4KQotI2RlZmluZSBTU1BfU1IocikJKHIgKyAweDAwQykKLSNkZWZpbmUgU1NQX0NQU1IocikJKHIgKyAweDAxMCkKLSNkZWZpbmUgU1NQX0lNU0MocikJKHIgKyAweDAxNCkKLSNkZWZpbmUgU1NQX1JJUyhyKQkociArIDB4MDE4KQotI2RlZmluZSBTU1BfTUlTKHIpCShyICsgMHgwMUMpCi0jZGVmaW5lIFNTUF9JQ1IocikJKHIgKyAweDAyMCkKLSNkZWZpbmUgU1NQX0RNQUNSKHIpCShyICsgMHgwMjQpCi0jZGVmaW5lIFNTUF9JVENSKHIpCShyICsgMHgwODApCi0jZGVmaW5lIFNTUF9JVElQKHIpCShyICsgMHgwODQpCi0jZGVmaW5lIFNTUF9JVE9QKHIpCShyICsgMHgwODgpCi0jZGVmaW5lIFNTUF9URFIocikJKHIgKyAweDA4QykKLQotI2RlZmluZSBTU1BfUElEMChyKQkociArIDB4RkUwKQotI2RlZmluZSBTU1BfUElEMShyKQkociArIDB4RkU0KQotI2RlZmluZSBTU1BfUElEMihyKQkociArIDB4RkU4KQotI2RlZmluZSBTU1BfUElEMyhyKQkociArIDB4RkVDKQotCi0jZGVmaW5lIFNTUF9DSUQwKHIpCShyICsgMHhGRjApCi0jZGVmaW5lIFNTUF9DSUQxKHIpCShyICsgMHhGRjQpCi0jZGVmaW5lIFNTUF9DSUQyKHIpCShyICsgMHhGRjgpCi0jZGVmaW5lIFNTUF9DSUQzKHIpCShyICsgMHhGRkMpCi0KLS8qCi0gKiBTU1AgQ29udHJvbCBSZWdpc3RlciAwICAtIFNTUF9DUjAKLSAqLwotI2RlZmluZSBTU1BfQ1IwX01BU0tfRFNTCSgweDBGVUwgPDwgMCkKLSNkZWZpbmUgU1NQX0NSMF9NQVNLX0ZSRgkoMHgzVUwgPDwgNCkKLSNkZWZpbmUgU1NQX0NSMF9NQVNLX1NQTwkoMHgxVUwgPDwgNikKLSNkZWZpbmUgU1NQX0NSMF9NQVNLX1NQSAkoMHgxVUwgPDwgNykKLSNkZWZpbmUgU1NQX0NSMF9NQVNLX1NDUgkoMHhGRlVMIDw8IDgpCi0KLS8qCi0gKiBUaGUgU1QgdmVyc2lvbiBvZiB0aGlzIGJsb2NrIG1vdmVzIHNvbSBiaXRzCi0gKiBpbiBTU1BfQ1IwIGFuZCBleHRlbmRzIGl0IHRvIDMyIGJpdHMKLSAqLwotI2RlZmluZSBTU1BfQ1IwX01BU0tfRFNTX1NUCSgweDFGVUwgPDwgMCkKLSNkZWZpbmUgU1NQX0NSMF9NQVNLX0hBTEZEVVBfU1QJKDB4MVVMIDw8IDUpCi0jZGVmaW5lIFNTUF9DUjBfTUFTS19DU1NfU1QJKDB4MUZVTCA8PCAxNikKLSNkZWZpbmUgU1NQX0NSMF9NQVNLX0ZSRl9TVAkoMHgzVUwgPDwgMjEpCi0KLQotLyoKLSAqIFNTUCBDb250cm9sIFJlZ2lzdGVyIDAgIC0gU1NQX0NSMQotICovCi0jZGVmaW5lIFNTUF9DUjFfTUFTS19MQk0JKDB4MVVMIDw8IDApCi0jZGVmaW5lIFNTUF9DUjFfTUFTS19TU0UJKDB4MVVMIDw8IDEpCi0jZGVmaW5lIFNTUF9DUjFfTUFTS19NUwkJKDB4MVVMIDw8IDIpCi0jZGVmaW5lIFNTUF9DUjFfTUFTS19TT0QJKDB4MVVMIDw8IDMpCi0KLS8qCi0gKiBUaGUgU1QgdmVyc2lvbiBvZiB0aGlzIGJsb2NrIGFkZHMgc29tZSBiaXRzCi0gKiBpbiBTU1BfQ1IxCi0gKi8KLSNkZWZpbmUgU1NQX0NSMV9NQVNLX1JFTkROX1NUCSgweDFVTCA8PCA0KQotI2RlZmluZSBTU1BfQ1IxX01BU0tfVEVORE5fU1QJKDB4MVVMIDw8IDUpCi0jZGVmaW5lIFNTUF9DUjFfTUFTS19NV0FJVF9TVAkoMHgxVUwgPDwgNikKLSNkZWZpbmUgU1NQX0NSMV9NQVNLX1JYSUZMU0VMX1NUICgweDdVTCA8PCA3KQotI2RlZmluZSBTU1BfQ1IxX01BU0tfVFhJRkxTRUxfU1QgKDB4N1VMIDw8IDEwKQotLyogVGhpcyBvbmUgaXMgb25seSBpbiB0aGUgUEwwMjMgdmFyaWFudCAqLwotI2RlZmluZSBTU1BfQ1IxX01BU0tfRkJDTEtERUxfU1QgKDB4N1VMIDw8IDEzKQotCi0vKgotICogU1NQIFN0YXR1cyBSZWdpc3RlciAtIFNTUF9TUgotICovCi0jZGVmaW5lIFNTUF9TUl9NQVNLX1RGRQkJKDB4MVVMIDw8IDApIC8qIFRyYW5zbWl0IEZJRk8gZW1wdHkgKi8KLSNkZWZpbmUgU1NQX1NSX01BU0tfVE5GCQkoMHgxVUwgPDwgMSkgLyogVHJhbnNtaXQgRklGTyBub3QgZnVsbCAqLwotI2RlZmluZSBTU1BfU1JfTUFTS19STkUJCSgweDFVTCA8PCAyKSAvKiBSZWNlaXZlIEZJRk8gbm90IGVtcHR5ICovCi0jZGVmaW5lIFNTUF9TUl9NQVNLX1JGRgkJKDB4MVVMIDw8IDMpIC8qIFJlY2VpdmUgRklGTyBmdWxsICovCi0jZGVmaW5lIFNTUF9TUl9NQVNLX0JTWQkJKDB4MVVMIDw8IDQpIC8qIEJ1c3kgRmxhZyAqLwotCi0vKgotICogU1NQIENsb2NrIFByZXNjYWxlIFJlZ2lzdGVyICAtIFNTUF9DUFNSCi0gKi8KLSNkZWZpbmUgU1NQX0NQU1JfTUFTS19DUFNEVlNSCSgweEZGVUwgPDwgMCkKLQotLyoKLSAqIFNTUCBJbnRlcnJ1cHQgTWFzayBTZXQvQ2xlYXIgUmVnaXN0ZXIgLSBTU1BfSU1TQwotICovCi0jZGVmaW5lIFNTUF9JTVNDX01BU0tfUk9SSU0gKDB4MVVMIDw8IDApIC8qIFJlY2VpdmUgT3ZlcnJ1biBJbnRlcnJ1cHQgbWFzayAqLwotI2RlZmluZSBTU1BfSU1TQ19NQVNLX1JUSU0gICgweDFVTCA8PCAxKSAvKiBSZWNlaXZlIHRpbWVvdXQgSW50ZXJydXB0IG1hc2sgKi8KLSNkZWZpbmUgU1NQX0lNU0NfTUFTS19SWElNICAoMHgxVUwgPDwgMikgLyogUmVjZWl2ZSBGSUZPIEludGVycnVwdCBtYXNrICovCi0jZGVmaW5lIFNTUF9JTVNDX01BU0tfVFhJTSAgKDB4MVVMIDw8IDMpIC8qIFRyYW5zbWl0IEZJRk8gSW50ZXJydXB0IG1hc2sgKi8KLQotLyoKLSAqIFNTUCBSYXcgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAtIFNTUF9SSVMKLSAqLwotLyogUmVjZWl2ZSBPdmVycnVuIFJhdyBJbnRlcnJ1cHQgc3RhdHVzICovCi0jZGVmaW5lIFNTUF9SSVNfTUFTS19ST1JSSVMJCSgweDFVTCA8PCAwKQotLyogUmVjZWl2ZSBUaW1lb3V0IFJhdyBJbnRlcnJ1cHQgc3RhdHVzICovCi0jZGVmaW5lIFNTUF9SSVNfTUFTS19SVFJJUwkJKDB4MVVMIDw8IDEpCi0vKiBSZWNlaXZlIEZJRk8gUmF3IEludGVycnVwdCBzdGF0dXMgKi8KLSNkZWZpbmUgU1NQX1JJU19NQVNLX1JYUklTCQkoMHgxVUwgPDwgMikKLS8qIFRyYW5zbWl0IEZJRk8gUmF3IEludGVycnVwdCBzdGF0dXMgKi8KLSNkZWZpbmUgU1NQX1JJU19NQVNLX1RYUklTCQkoMHgxVUwgPDwgMykKLQotLyoKLSAqIFNTUCBNYXNrZWQgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAtIFNTUF9NSVMKLSAqLwotLyogUmVjZWl2ZSBPdmVycnVuIE1hc2tlZCBJbnRlcnJ1cHQgc3RhdHVzICovCi0jZGVmaW5lIFNTUF9NSVNfTUFTS19ST1JNSVMJCSgweDFVTCA8PCAwKQotLyogUmVjZWl2ZSBUaW1lb3V0IE1hc2tlZCBJbnRlcnJ1cHQgc3RhdHVzICovCi0jZGVmaW5lIFNTUF9NSVNfTUFTS19SVE1JUwkJKDB4MVVMIDw8IDEpCi0vKiBSZWNlaXZlIEZJRk8gTWFza2VkIEludGVycnVwdCBzdGF0dXMgKi8KLSNkZWZpbmUgU1NQX01JU19NQVNLX1JYTUlTCQkoMHgxVUwgPDwgMikKLS8qIFRyYW5zbWl0IEZJRk8gTWFza2VkIEludGVycnVwdCBzdGF0dXMgKi8KLSNkZWZpbmUgU1NQX01JU19NQVNLX1RYTUlTCQkoMHgxVUwgPDwgMykKLQotLyoKLSAqIFNTUCBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIgLSBTU1BfSUNSCi0gKi8KLS8qIFJlY2VpdmUgT3ZlcnJ1biBSYXcgQ2xlYXIgSW50ZXJydXB0IGJpdCAqLwotI2RlZmluZSBTU1BfSUNSX01BU0tfUk9SSUMJCSgweDFVTCA8PCAwKQotLyogUmVjZWl2ZSBUaW1lb3V0IENsZWFyIEludGVycnVwdCBiaXQgKi8KLSNkZWZpbmUgU1NQX0lDUl9NQVNLX1JUSUMJCSgweDFVTCA8PCAxKQotCi0vKgotICogU1NQIERNQSBDb250cm9sIFJlZ2lzdGVyIC0gU1NQX0RNQUNSCi0gKi8KLS8qIFJlY2VpdmUgRE1BIEVuYWJsZSBiaXQgKi8KLSNkZWZpbmUgU1NQX0RNQUNSX01BU0tfUlhETUFFCQkoMHgxVUwgPDwgMCkKLS8qIFRyYW5zbWl0IERNQSBFbmFibGUgYml0ICovCi0jZGVmaW5lIFNTUF9ETUFDUl9NQVNLX1RYRE1BRQkJKDB4MVVMIDw8IDEpCi0KLS8qCi0gKiBTU1AgSW50ZWdyYXRpb24gVGVzdCBjb250cm9sIFJlZ2lzdGVyIC0gU1NQX0lUQ1IKLSAqLwotI2RlZmluZSBTU1BfSVRDUl9NQVNLX0lURU4JCSgweDFVTCA8PCAwKQotI2RlZmluZSBTU1BfSVRDUl9NQVNLX1RFU1RGSUZPCQkoMHgxVUwgPDwgMSkKLQotLyoKLSAqIFNTUCBJbnRlZ3JhdGlvbiBUZXN0IElucHV0IFJlZ2lzdGVyIC0gU1NQX0lUSVAKLSAqLwotI2RlZmluZSBJVElQX01BU0tfU1NQUlhECQkgKDB4MVVMIDw8IDApCi0jZGVmaW5lIElUSVBfTUFTS19TU1BGU1NJTgkJICgweDFVTCA8PCAxKQotI2RlZmluZSBJVElQX01BU0tfU1NQQ0xLSU4JCSAoMHgxVUwgPDwgMikKLSNkZWZpbmUgSVRJUF9NQVNLX1JYRE1BQwkJICgweDFVTCA8PCAzKQotI2RlZmluZSBJVElQX01BU0tfVFhETUFDCQkgKDB4MVVMIDw8IDQpCi0jZGVmaW5lIElUSVBfTUFTS19TU1BUWERJTgkJICgweDFVTCA8PCA1KQotCi0vKgotICogU1NQIEludGVncmF0aW9uIFRlc3Qgb3V0cHV0IFJlZ2lzdGVyIC0gU1NQX0lUT1AKLSAqLwotI2RlZmluZSBJVE9QX01BU0tfU1NQVFhECQkgKDB4MVVMIDw8IDApCi0jZGVmaW5lIElUT1BfTUFTS19TU1BGU1NPVVQJCSAoMHgxVUwgPDwgMSkKLSNkZWZpbmUgSVRPUF9NQVNLX1NTUENMS09VVAkJICgweDFVTCA8PCAyKQotI2RlZmluZSBJVE9QX01BU0tfU1NQT0VuCQkgKDB4MVVMIDw8IDMpCi0jZGVmaW5lIElUT1BfTUFTS19TU1BDVExPRW4JCSAoMHgxVUwgPDwgNCkKLSNkZWZpbmUgSVRPUF9NQVNLX1JPUklOVFIJCSAoMHgxVUwgPDwgNSkKLSNkZWZpbmUgSVRPUF9NQVNLX1JUSU5UUgkJICgweDFVTCA8PCA2KQotI2RlZmluZSBJVE9QX01BU0tfUlhJTlRSCQkgKDB4MVVMIDw8IDcpCi0jZGVmaW5lIElUT1BfTUFTS19UWElOVFIJCSAoMHgxVUwgPDwgOCkKLSNkZWZpbmUgSVRPUF9NQVNLX0lOVFIJCQkgKDB4MVVMIDw8IDkpCi0jZGVmaW5lIElUT1BfTUFTS19SWERNQUJSRVEJCSAoMHgxVUwgPDwgMTApCi0jZGVmaW5lIElUT1BfTUFTS19SWERNQVNSRVEJCSAoMHgxVUwgPDwgMTEpCi0jZGVmaW5lIElUT1BfTUFTS19UWERNQUJSRVEJCSAoMHgxVUwgPDwgMTIpCi0jZGVmaW5lIElUT1BfTUFTS19UWERNQVNSRVEJCSAoMHgxVUwgPDwgMTMpCi0KLS8qCi0gKiBTU1AgVGVzdCBEYXRhIFJlZ2lzdGVyIC0gU1NQX1REUgotICovCi0jZGVmaW5lIFREUl9NQVNLX1RFU1REQVRBCQkoMHhGRkZGRkZGRikKLQotLyoKLSAqIE1lc3NhZ2UgU3RhdGUKLSAqIHdlIHVzZSB0aGUgc3BpX21lc3NhZ2Uuc3RhdGUgKHZvaWQgKikgcG9pbnRlciB0bwotICogaG9sZCBhIHNpbmdsZSBzdGF0ZSB2YWx1ZSwgdGhhdCdzIHdoeSBhbGwgdGhpcwotICogKHZvaWQgKikgY2FzdGluZyBpcyBkb25lIGhlcmUuCi0gKi8KLSNkZWZpbmUgU1RBVEVfU1RBUlQJCQkoKHZvaWQgKikgMCkKLSNkZWZpbmUgU1RBVEVfUlVOTklORwkJCSgodm9pZCAqKSAxKQotI2RlZmluZSBTVEFURV9ET05FCQkJKCh2b2lkICopIDIpCi0jZGVmaW5lIFNUQVRFX0VSUk9SCQkJKCh2b2lkICopIC0xKQotCi0vKgotICogU1NQIFN0YXRlIC0gV2hldGhlciBFbmFibGVkIG9yIERpc2FibGVkCi0gKi8KLSNkZWZpbmUgU1NQX0RJU0FCTEVECQkJKDApCi0jZGVmaW5lIFNTUF9FTkFCTEVECQkJKDEpCi0KLS8qCi0gKiBTU1AgRE1BIFN0YXRlIC0gV2hldGhlciBETUEgRW5hYmxlZCBvciBEaXNhYmxlZAotICovCi0jZGVmaW5lIFNTUF9ETUFfRElTQUJMRUQJCSgwKQotI2RlZmluZSBTU1BfRE1BX0VOQUJMRUQJCQkoMSkKLQotLyoKLSAqIFNTUCBDbG9jayBEZWZhdWx0cwotICovCi0jZGVmaW5lIFNTUF9ERUZBVUxUX0NMS1JBVEUgMHgyCi0jZGVmaW5lIFNTUF9ERUZBVUxUX1BSRVNDQUxFIDB4NDAKLQotLyoKLSAqIFNTUCBDbG9jayBQYXJhbWV0ZXIgcmFuZ2VzCi0gKi8KLSNkZWZpbmUgQ1BTRFZSX01JTiAweDAyCi0jZGVmaW5lIENQU0RWUl9NQVggMHhGRQotI2RlZmluZSBTQ1JfTUlOIDB4MDAKLSNkZWZpbmUgU0NSX01BWCAweEZGCi0KLS8qCi0gKiBTU1AgSW50ZXJydXB0IHJlbGF0ZWQgTWFjcm9zCi0gKi8KLSNkZWZpbmUgREVGQVVMVF9TU1BfUkVHX0lNU0MgIDB4MFVMCi0jZGVmaW5lIERJU0FCTEVfQUxMX0lOVEVSUlVQVFMgREVGQVVMVF9TU1BfUkVHX0lNU0MKLSNkZWZpbmUgRU5BQkxFX0FMTF9JTlRFUlJVUFRTICh+REVGQVVMVF9TU1BfUkVHX0lNU0MpCi0KLSNkZWZpbmUgQ0xFQVJfQUxMX0lOVEVSUlVQVFMgIDB4MwotCi0jZGVmaW5lIFNQSV9QT0xMSU5HX1RJTUVPVVQgMTAwMAotCi0KLS8qCi0gKiBUaGUgdHlwZSBvZiByZWFkaW5nIGdvaW5nIG9uIG9uIHRoaXMgY2hpcAotICovCi1lbnVtIHNzcF9yZWFkaW5nIHsKLQlSRUFESU5HX05VTEwsCi0JUkVBRElOR19VOCwKLQlSRUFESU5HX1UxNiwKLQlSRUFESU5HX1UzMgotfTsKLQotLyoqCi0gKiBUaGUgdHlwZSBvZiB3cml0aW5nIGdvaW5nIG9uIG9uIHRoaXMgY2hpcAotICovCi1lbnVtIHNzcF93cml0aW5nIHsKLQlXUklUSU5HX05VTEwsCi0JV1JJVElOR19VOCwKLQlXUklUSU5HX1UxNiwKLQlXUklUSU5HX1UzMgotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgdmVuZG9yX2RhdGEgLSB2ZW5kb3Itc3BlY2lmaWMgY29uZmlnIHBhcmFtZXRlcnMKLSAqIGZvciBQTDAyMiBkZXJpdmF0ZXMKLSAqIEBmaWZvZGVwdGg6IGRlcHRoIG9mIEZJRk9zIChib3RoKQotICogQG1heF9icHc6IG1heGltdW0gbnVtYmVyIG9mIGJpdHMgcGVyIHdvcmQKLSAqIEB1bmlkaXI6IHN1cHBvcnRzIHVuaWRpcmVjdGlvbiB0cmFuc2ZlcnMKLSAqIEBleHRlbmRlZF9jcjogMzIgYml0IHdpZGUgY29udHJvbCByZWdpc3RlciAwIHdpdGggZXh0cmEKLSAqIGZlYXR1cmVzIGFuZCBleHRyYSBmZWF0dXJlcyBpbiBDUjEgYXMgZm91bmQgaW4gdGhlIFNUIHZhcmlhbnRzCi0gKiBAcGwwMjM6IHN1cHBvcnRzIGEgc3Vic2V0IG9mIHRoZSBTVCBleHRlbnNpb25zIGNhbGxlZCAiUEwwMjMiCi0gKi8KLXN0cnVjdCB2ZW5kb3JfZGF0YSB7Ci0JaW50IGZpZm9kZXB0aDsKLQlpbnQgbWF4X2JwdzsKLQlib29sIHVuaWRpcjsKLQlib29sIGV4dGVuZGVkX2NyOwotCWJvb2wgcGwwMjM7Ci0JYm9vbCBsb29wYmFjazsKLX07Ci0KLS8qKgotICogc3RydWN0IHBsMDIyIC0gVGhpcyBpcyB0aGUgcHJpdmF0ZSBTU1AgZHJpdmVyIGRhdGEgc3RydWN0dXJlCi0gKiBAYWRldjogQU1CQSBkZXZpY2UgbW9kZWwgaG9va3VwCi0gKiBAdmVuZG9yOiB2ZW5kb3IgZGF0YSBmb3IgdGhlIElQIGJsb2NrCi0gKiBAcGh5YmFzZTogdGhlIHBoeXNpY2FsIG1lbW9yeSB3aGVyZSB0aGUgU1NQIGRldmljZSByZXNpZGVzCi0gKiBAdmlydGJhc2U6IHRoZSB2aXJ0dWFsIG1lbW9yeSB3aGVyZSB0aGUgU1NQIGlzIG1hcHBlZAotICogQGNsazogb3V0Z29pbmcgY2xvY2sgIlNQSUNMSyIgZm9yIHRoZSBTUEkgYnVzCi0gKiBAbWFzdGVyOiBTUEkgZnJhbWV3b3JrIGhvb2t1cAotICogQG1hc3Rlcl9pbmZvOiBjb250cm9sbGVyLXNwZWNpZmljIGRhdGEgZnJvbSBtYWNoaW5lIHNldHVwCi0gKiBAd29ya3F1ZXVlOiBhIHdvcmtxdWV1ZSBvbiB3aGljaCBhbnkgc3BpX21lc3NhZ2UgcmVxdWVzdCBpcyBxdWV1ZWQKLSAqIEBwdW1wX21lc3NhZ2VzOiB3b3JrIHN0cnVjdCBmb3Igc2NoZWR1bGluZyB3b3JrIHRvIHRoZSB3b3JrcXVldWUKLSAqIEBxdWV1ZV9sb2NrOiBzcGlubG9jayB0byBzeW5jcm9uaXNlIGFjY2VzcyB0byBtZXNzYWdlIHF1ZXVlCi0gKiBAcXVldWU6IG1lc3NhZ2UgcXVldWUKLSAqIEBidXN5OiB3b3JrcXVldWUgaXMgYnVzeQotICogQHJ1bm5pbmc6IHdvcmtxdWV1ZSBpcyBydW5uaW5nCi0gKiBAcHVtcF90cmFuc2ZlcnM6IFRhc2tsZXQgdXNlZCBpbiBJbnRlcnJ1cHQgVHJhbnNmZXIgbW9kZQotICogQGN1cl9tc2c6IFBvaW50ZXIgdG8gY3VycmVudCBzcGlfbWVzc2FnZSBiZWluZyBwcm9jZXNzZWQKLSAqIEBjdXJfdHJhbnNmZXI6IFBvaW50ZXIgdG8gY3VycmVudCBzcGlfdHJhbnNmZXIKLSAqIEBjdXJfY2hpcDogcG9pbnRlciB0byBjdXJyZW50IGNsaWVudHMgY2hpcChhc3NpZ25lZCBmcm9tIGNvbnRyb2xsZXJfc3RhdGUpCi0gKiBAdHg6IGN1cnJlbnQgcG9zaXRpb24gaW4gVFggYnVmZmVyIHRvIGJlIHJlYWQKLSAqIEB0eF9lbmQ6IGVuZCBwb3NpdGlvbiBpbiBUWCBidWZmZXIgdG8gYmUgcmVhZAotICogQHJ4OiBjdXJyZW50IHBvc2l0aW9uIGluIFJYIGJ1ZmZlciB0byBiZSB3cml0dGVuCi0gKiBAcnhfZW5kOiBlbmQgcG9zaXRpb24gaW4gUlggYnVmZmVyIHRvIGJlIHdyaXR0ZW4KLSAqIEByZWFkOiB0aGUgdHlwZSBvZiByZWFkIGN1cnJlbnRseSBnb2luZyBvbgotICogQHdyaXRlOiB0aGUgdHlwZSBvZiB3cml0ZSBjdXJyZW50bHkgZ29pbmcgb24KLSAqIEBleHBfZmlmb19sZXZlbDogZXhwZWN0ZWQgRklGTyBsZXZlbAotICogQGRtYV9yeF9jaGFubmVsOiBvcHRpb25hbCBjaGFubmVsIGZvciBSWCBETUEKLSAqIEBkbWFfdHhfY2hhbm5lbDogb3B0aW9uYWwgY2hhbm5lbCBmb3IgVFggRE1BCi0gKiBAc2d0X3J4OiBzY2F0dGVydGFibGUgZm9yIHRoZSBSWCB0cmFuc2ZlcgotICogQHNndF90eDogc2NhdHRlcnRhYmxlIGZvciB0aGUgVFggdHJhbnNmZXIKLSAqIEBkdW1teXBhZ2U6IGEgZHVtbXkgcGFnZSB1c2VkIGZvciBkcml2aW5nIGRhdGEgb24gdGhlIGJ1cyB3aXRoIERNQQotICovCi1zdHJ1Y3QgcGwwMjIgewotCXN0cnVjdCBhbWJhX2RldmljZQkJKmFkZXY7Ci0Jc3RydWN0IHZlbmRvcl9kYXRhCQkqdmVuZG9yOwotCXJlc291cmNlX3NpemVfdAkJCXBoeWJhc2U7Ci0Jdm9pZCBfX2lvbWVtCQkJKnZpcnRiYXNlOwotCXN0cnVjdCBjbGsJCQkqY2xrOwotCXN0cnVjdCBzcGlfbWFzdGVyCQkqbWFzdGVyOwotCXN0cnVjdCBwbDAyMl9zc3BfY29udHJvbGxlcgkqbWFzdGVyX2luZm87Ci0JLyogRHJpdmVyIG1lc3NhZ2UgcXVldWUgKi8KLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkJKndvcmtxdWV1ZTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXB1bXBfbWVzc2FnZXM7Ci0Jc3BpbmxvY2tfdAkJCXF1ZXVlX2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJcXVldWU7Ci0JYm9vbAkJCQlidXN5OwotCWJvb2wJCQkJcnVubmluZzsKLQkvKiBNZXNzYWdlIHRyYW5zZmVyIHB1bXAgKi8KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJCXB1bXBfdHJhbnNmZXJzOwotCXN0cnVjdCBzcGlfbWVzc2FnZQkJKmN1cl9tc2c7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlcgkJKmN1cl90cmFuc2ZlcjsKLQlzdHJ1Y3QgY2hpcF9kYXRhCQkqY3VyX2NoaXA7Ci0Jdm9pZAkJCQkqdHg7Ci0Jdm9pZAkJCQkqdHhfZW5kOwotCXZvaWQJCQkJKnJ4OwotCXZvaWQJCQkJKnJ4X2VuZDsKLQllbnVtIHNzcF9yZWFkaW5nCQlyZWFkOwotCWVudW0gc3NwX3dyaXRpbmcJCXdyaXRlOwotCXUzMgkJCQlleHBfZmlmb19sZXZlbDsKLQkvKiBETUEgc2V0dGluZ3MgKi8KLSNpZmRlZiBDT05GSUdfRE1BX0VOR0lORQotCXN0cnVjdCBkbWFfY2hhbgkJCSpkbWFfcnhfY2hhbm5lbDsKLQlzdHJ1Y3QgZG1hX2NoYW4JCQkqZG1hX3R4X2NoYW5uZWw7Ci0Jc3RydWN0IHNnX3RhYmxlCQkJc2d0X3J4OwotCXN0cnVjdCBzZ190YWJsZQkJCXNndF90eDsKLQljaGFyCQkJCSpkdW1teXBhZ2U7Ci0jZW5kaWYKLX07Ci0KLS8qKgotICogc3RydWN0IGNoaXBfZGF0YSAtIFRvIG1haW50YWluIHJ1bnRpbWUgc3RhdGUgb2YgU1NQIGZvciBlYWNoIGNsaWVudCBjaGlwCi0gKiBAY3IwOiBWYWx1ZSBvZiBjb250cm9sIHJlZ2lzdGVyIENSMCBvZiBTU1AgLSBvbiBsYXRlciBTVCB2YXJpYW50cyB0aGlzCi0gKiAgICAgICByZWdpc3RlciBpcyAzMiBiaXRzIHdpZGUgcmF0aGVyIHRoYW4ganVzdCAxNgotICogQGNyMTogVmFsdWUgb2YgY29udHJvbCByZWdpc3RlciBDUjEgb2YgU1NQCi0gKiBAZG1hY3I6IFZhbHVlIG9mIERNQSBjb250cm9sIFJlZ2lzdGVyIG9mIFNTUAotICogQGNwc3I6IFZhbHVlIG9mIENsb2NrIHByZXNjYWxlIHJlZ2lzdGVyCi0gKiBAbl9ieXRlczogaG93IG1hbnkgYnl0ZXMocG93ZXIgb2YgMikgcmVxZCBmb3IgYSBnaXZlbiBkYXRhIHdpZHRoIG9mIGNsaWVudAotICogQGVuYWJsZV9kbWE6IFdoZXRoZXIgdG8gZW5hYmxlIERNQSBvciBub3QKLSAqIEByZWFkOiBmdW5jdGlvbiBwdHIgdG8gYmUgdXNlZCB0byByZWFkIHdoZW4gZG9pbmcgeGZlciBmb3IgdGhpcyBjaGlwCi0gKiBAd3JpdGU6IGZ1bmN0aW9uIHB0ciB0byBiZSB1c2VkIHRvIHdyaXRlIHdoZW4gZG9pbmcgeGZlciBmb3IgdGhpcyBjaGlwCi0gKiBAY3NfY29udHJvbDogY2hpcCBzZWxlY3QgY2FsbGJhY2sgcHJvdmlkZWQgYnkgY2hpcAotICogQHhmZXJfdHlwZTogcG9sbGluZy9pbnRlcnJ1cHQvRE1BCi0gKgotICogUnVudGltZSBzdGF0ZSBvZiB0aGUgU1NQIGNvbnRyb2xsZXIsIG1haW50YWluZWQgcGVyIGNoaXAsCi0gKiBUaGlzIHdvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbWVzc2FnZSB0aGF0IHdvdWxkIGJlIHNlcnZlZAotICovCi1zdHJ1Y3QgY2hpcF9kYXRhIHsKLQl1MzIgY3IwOwotCXUxNiBjcjE7Ci0JdTE2IGRtYWNyOwotCXUxNiBjcHNyOwotCXU4IG5fYnl0ZXM7Ci0JYm9vbCBlbmFibGVfZG1hOwotCWVudW0gc3NwX3JlYWRpbmcgcmVhZDsKLQllbnVtIHNzcF93cml0aW5nIHdyaXRlOwotCXZvaWQgKCpjc19jb250cm9sKSAodTMyIGNvbW1hbmQpOwotCWludCB4ZmVyX3R5cGU7Ci19OwotCi0vKioKLSAqIG51bGxfY3NfY29udHJvbCAtIER1bW15IGNoaXAgc2VsZWN0IGZ1bmN0aW9uCi0gKiBAY29tbWFuZDogc2VsZWN0L2RlbGVjdCB0aGUgY2hpcAotICoKLSAqIElmIG5vIGNoaXAgc2VsZWN0IGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGJ5IGNsaWVudCB0aGlzIGlzIHVzZWQgYXMgZHVtbXkKLSAqIGNoaXAgc2VsZWN0Ci0gKi8KLXN0YXRpYyB2b2lkIG51bGxfY3NfY29udHJvbCh1MzIgY29tbWFuZCkKLXsKLQlwcl9kZWJ1ZygicGwwMjI6IGR1bW15IGNoaXAgc2VsZWN0IGNvbnRyb2wsIENTPTB4JXhcbiIsIGNvbW1hbmQpOwotfQotCi0vKioKLSAqIGdpdmViYWNrIC0gY3VycmVudCBzcGlfbWVzc2FnZSBpcyBvdmVyLCBzY2hlZHVsZSBuZXh0IG1lc3NhZ2UgYW5kIGNhbGwKLSAqIGNhbGxiYWNrIG9mIHRoaXMgbWVzc2FnZS4gQXNzdW1lcyB0aGF0IGNhbGxlciBhbHJlYWR5Ci0gKiBzZXQgbWVzc2FnZS0+c3RhdHVzOyBkbWEgYW5kIHBpbyBpcnFzIGFyZSBibG9ja2VkCi0gKiBAcGwwMjI6IFNTUCBkcml2ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQotICovCi1zdGF0aWMgdm9pZCBnaXZlYmFjayhzdHJ1Y3QgcGwwMjIgKnBsMDIyKQotewotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKmxhc3RfdHJhbnNmZXI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZzsKLQl2b2lkICgqY3Vycl9jc19jb250cm9sKSAodTMyIGNvbW1hbmQpOwotCi0JLyoKLQkgKiBUaGlzIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgY2hpcCBzZWxlY3QgZnVuY3Rpb24KLQkgKiBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBzZXQgY3Vycl9jaGlwIHRvIE5VTEwKLQkgKiBhcyBhIHN0ZXAgdG93YXJkIHRlcm1pbmluYXRpbmcgdGhlIG1lc3NhZ2UuCi0JICovCi0JY3Vycl9jc19jb250cm9sID0gcGwwMjItPmN1cl9jaGlwLT5jc19jb250cm9sOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwbDAyMi0+cXVldWVfbG9jaywgZmxhZ3MpOwotCW1zZyA9IHBsMDIyLT5jdXJfbXNnOwotCXBsMDIyLT5jdXJfbXNnID0gTlVMTDsKLQlwbDAyMi0+Y3VyX3RyYW5zZmVyID0gTlVMTDsKLQlwbDAyMi0+Y3VyX2NoaXAgPSBOVUxMOwotCXF1ZXVlX3dvcmsocGwwMjItPndvcmtxdWV1ZSwgJnBsMDIyLT5wdW1wX21lc3NhZ2VzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbDAyMi0+cXVldWVfbG9jaywgZmxhZ3MpOwotCi0JbGFzdF90cmFuc2ZlciA9IGxpc3RfZW50cnkobXNnLT50cmFuc2ZlcnMucHJldiwKLQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwKLQkJCQkJdHJhbnNmZXJfbGlzdCk7Ci0KLQkvKiBEZWxheSBpZiByZXF1ZXN0ZWQgYmVmb3JlIGFueSBjaGFuZ2UgaW4gY2hpcCBzZWxlY3QgKi8KLQlpZiAobGFzdF90cmFuc2Zlci0+ZGVsYXlfdXNlY3MpCi0JCS8qCi0JCSAqIEZJWE1FOiBUaGlzIHJ1bnMgaW4gaW50ZXJydXB0IGNvbnRleHQuCi0JCSAqIElzIHRoaXMgcmVhbGx5IHNtYXJ0PwotCQkgKi8KLQkJdWRlbGF5KGxhc3RfdHJhbnNmZXItPmRlbGF5X3VzZWNzKTsKLQotCS8qCi0JICogRHJvcCBjaGlwIHNlbGVjdCBVTkxFU1MgY3NfY2hhbmdlIGlzIHRydWUgb3Igd2UgYXJlIHJldHVybmluZwotCSAqIGEgbWVzc2FnZSB3aXRoIGFuIGVycm9yLCBvciBuZXh0IG1lc3NhZ2UgaXMgZm9yIGFub3RoZXIgY2hpcAotCSAqLwotCWlmICghbGFzdF90cmFuc2Zlci0+Y3NfY2hhbmdlKQotCQljdXJyX2NzX2NvbnRyb2woU1NQX0NISVBfREVTRUxFQ1QpOwotCWVsc2UgewotCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm5leHRfbXNnOwotCi0JCS8qIEhvbGRpbmcgb2YgY3Mgd2FzIGhpbnRlZCwgYnV0IHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0JCSAqIHRoZSBuZXh0IG1lc3NhZ2UgaXMgZm9yIHRoZSBzYW1lIGNoaXAuICBEb24ndCB3YXN0ZQotCQkgKiB0aW1lIHdpdGggdGhlIGZvbGxvd2luZyB0ZXN0cyB1bmxlc3MgdGhpcyB3YXMgaGludGVkLgotCQkgKgotCQkgKiBXZSBjYW5ub3QgcG9zdHBvbmUgdGhpcyB1bnRpbCBwdW1wX21lc3NhZ2VzLCBiZWNhdXNlCi0JCSAqIGFmdGVyIGNhbGxpbmcgbXNnLT5jb21wbGV0ZSAoYmVsb3cpIHRoZSBkcml2ZXIgdGhhdAotCQkgKiBzZW50IHRoZSBjdXJyZW50IG1lc3NhZ2UgY291bGQgYmUgdW5sb2FkZWQsIHdoaWNoCi0JCSAqIGNvdWxkIGludmFsaWRhdGUgdGhlIGNzX2NvbnRyb2woKSBjYWxsYmFjay4uLgotCQkgKi8KLQotCQkvKiBnZXQgYSBwb2ludGVyIHRvIHRoZSBuZXh0IG1lc3NhZ2UsIGlmIGFueSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGwwMjItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQkJaWYgKGxpc3RfZW1wdHkoJnBsMDIyLT5xdWV1ZSkpCi0JCQluZXh0X21zZyA9IE5VTEw7Ci0JCWVsc2UKLQkJCW5leHRfbXNnID0gbGlzdF9lbnRyeShwbDAyMi0+cXVldWUubmV4dCwKLQkJCQkJc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQkJLyogc2VlIGlmIHRoZSBuZXh0IGFuZCBjdXJyZW50IG1lc3NhZ2VzIHBvaW50Ci0JCSAqIHRvIHRoZSBzYW1lIGNoaXAKLQkJICovCi0JCWlmIChuZXh0X21zZyAmJiBuZXh0X21zZy0+c3BpICE9IG1zZy0+c3BpKQotCQkJbmV4dF9tc2cgPSBOVUxMOwotCQlpZiAoIW5leHRfbXNnIHx8IG1zZy0+c3RhdGUgPT0gU1RBVEVfRVJST1IpCi0JCQljdXJyX2NzX2NvbnRyb2woU1NQX0NISVBfREVTRUxFQ1QpOwotCX0KLQltc2ctPnN0YXRlID0gTlVMTDsKLQlpZiAobXNnLT5jb21wbGV0ZSkKLQkJbXNnLT5jb21wbGV0ZShtc2ctPmNvbnRleHQpOwotCS8qIFRoaXMgbWVzc2FnZSBpcyBjb21wbGV0ZWQsIHNvIGxldCdzIHR1cm4gb2ZmIHRoZSBjbG9ja3MgJiBwb3dlciAqLwotCWNsa19kaXNhYmxlKHBsMDIyLT5jbGspOwotCWFtYmFfcGNsa19kaXNhYmxlKHBsMDIyLT5hZGV2KTsKLQlhbWJhX3Zjb3JlX2Rpc2FibGUocGwwMjItPmFkZXYpOwotfQotCi0vKioKLSAqIGZsdXNoIC0gZmx1c2ggdGhlIEZJRk8gdG8gcmVhY2ggYSBjbGVhbiBzdGF0ZQotICogQHBsMDIyOiBTU1AgZHJpdmVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKLSAqLwotc3RhdGljIGludCBmbHVzaChzdHJ1Y3QgcGwwMjIgKnBsMDIyKQotewotCXVuc2lnbmVkIGxvbmcgbGltaXQgPSBsb29wc19wZXJfamlmZnkgPDwgMTsKLQotCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsICJmbHVzaFxuIik7Ci0JZG8gewotCQl3aGlsZSAocmVhZHcoU1NQX1NSKHBsMDIyLT52aXJ0YmFzZSkpICYgU1NQX1NSX01BU0tfUk5FKQotCQkJcmVhZHcoU1NQX0RSKHBsMDIyLT52aXJ0YmFzZSkpOwotCX0gd2hpbGUgKChyZWFkdyhTU1BfU1IocGwwMjItPnZpcnRiYXNlKSkgJiBTU1BfU1JfTUFTS19CU1kpICYmIGxpbWl0LS0pOwotCi0JcGwwMjItPmV4cF9maWZvX2xldmVsID0gMDsKLQotCXJldHVybiBsaW1pdDsKLX0KLQotLyoqCi0gKiByZXN0b3JlX3N0YXRlIC0gTG9hZCBjb25maWd1cmF0aW9uIG9mIGN1cnJlbnQgY2hpcAotICogQHBsMDIyOiBTU1AgZHJpdmVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKLSAqLwotc3RhdGljIHZvaWQgcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgcGwwMjIgKnBsMDIyKQotewotCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPSBwbDAyMi0+Y3VyX2NoaXA7Ci0KLQlpZiAocGwwMjItPnZlbmRvci0+ZXh0ZW5kZWRfY3IpCi0JCXdyaXRlbChjaGlwLT5jcjAsIFNTUF9DUjAocGwwMjItPnZpcnRiYXNlKSk7Ci0JZWxzZQotCQl3cml0ZXcoY2hpcC0+Y3IwLCBTU1BfQ1IwKHBsMDIyLT52aXJ0YmFzZSkpOwotCXdyaXRldyhjaGlwLT5jcjEsIFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSk7Ci0Jd3JpdGV3KGNoaXAtPmRtYWNyLCBTU1BfRE1BQ1IocGwwMjItPnZpcnRiYXNlKSk7Ci0Jd3JpdGV3KGNoaXAtPmNwc3IsIFNTUF9DUFNSKHBsMDIyLT52aXJ0YmFzZSkpOwotCXdyaXRldyhESVNBQkxFX0FMTF9JTlRFUlJVUFRTLCBTU1BfSU1TQyhwbDAyMi0+dmlydGJhc2UpKTsKLQl3cml0ZXcoQ0xFQVJfQUxMX0lOVEVSUlVQVFMsIFNTUF9JQ1IocGwwMjItPnZpcnRiYXNlKSk7Ci19Ci0KLS8qCi0gKiBEZWZhdWx0IFNTUCBSZWdpc3RlciBWYWx1ZXMKLSAqLwotI2RlZmluZSBERUZBVUxUX1NTUF9SRUdfQ1IwICggXAotCUdFTl9NQVNLX0JJVFMoU1NQX0RBVEFfQklUU18xMiwgU1NQX0NSMF9NQVNLX0RTUywgMCkJfCBcCi0JR0VOX01BU0tfQklUUyhTU1BfSU5URVJGQUNFX01PVE9ST0xBX1NQSSwgU1NQX0NSMF9NQVNLX0ZSRiwgNCkgfCBcCi0JR0VOX01BU0tfQklUUyhTU1BfQ0xLX1BPTF9JRExFX0xPVywgU1NQX0NSMF9NQVNLX1NQTywgNikgfCBcCi0JR0VOX01BU0tfQklUUyhTU1BfQ0xLX1NFQ09ORF9FREdFLCBTU1BfQ1IwX01BU0tfU1BILCA3KSB8IFwKLQlHRU5fTUFTS19CSVRTKFNTUF9ERUZBVUxUX0NMS1JBVEUsIFNTUF9DUjBfTUFTS19TQ1IsIDgpIFwKLSkKLQotLyogU1QgdmVyc2lvbnMgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgYml0IGxheW91dCAqLwotI2RlZmluZSBERUZBVUxUX1NTUF9SRUdfQ1IwX1NUICggXAotCUdFTl9NQVNLX0JJVFMoU1NQX0RBVEFfQklUU18xMiwgU1NQX0NSMF9NQVNLX0RTU19TVCwgMCkJfCBcCi0JR0VOX01BU0tfQklUUyhTU1BfTUlDUk9XSVJFX0NIQU5ORUxfRlVMTF9EVVBMRVgsIFNTUF9DUjBfTUFTS19IQUxGRFVQX1NULCA1KSB8IFwKLQlHRU5fTUFTS19CSVRTKFNTUF9DTEtfUE9MX0lETEVfTE9XLCBTU1BfQ1IwX01BU0tfU1BPLCA2KSB8IFwKLQlHRU5fTUFTS19CSVRTKFNTUF9DTEtfU0VDT05EX0VER0UsIFNTUF9DUjBfTUFTS19TUEgsIDcpIHwgXAotCUdFTl9NQVNLX0JJVFMoU1NQX0RFRkFVTFRfQ0xLUkFURSwgU1NQX0NSMF9NQVNLX1NDUiwgOCkgfCBcCi0JR0VOX01BU0tfQklUUyhTU1BfQklUU184LCBTU1BfQ1IwX01BU0tfQ1NTX1NULCAxNikJfCBcCi0JR0VOX01BU0tfQklUUyhTU1BfSU5URVJGQUNFX01PVE9ST0xBX1NQSSwgU1NQX0NSMF9NQVNLX0ZSRl9TVCwgMjEpIFwKLSkKLQotLyogVGhlIFBMMDIzIHZlcnNpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGFnYWluICovCi0jZGVmaW5lIERFRkFVTFRfU1NQX1JFR19DUjBfU1RfUEwwMjMgKCBcCi0JR0VOX01BU0tfQklUUyhTU1BfREFUQV9CSVRTXzEyLCBTU1BfQ1IwX01BU0tfRFNTX1NULCAwKQl8IFwKLQlHRU5fTUFTS19CSVRTKFNTUF9DTEtfUE9MX0lETEVfTE9XLCBTU1BfQ1IwX01BU0tfU1BPLCA2KSB8IFwKLQlHRU5fTUFTS19CSVRTKFNTUF9DTEtfU0VDT05EX0VER0UsIFNTUF9DUjBfTUFTS19TUEgsIDcpIHwgXAotCUdFTl9NQVNLX0JJVFMoU1NQX0RFRkFVTFRfQ0xLUkFURSwgU1NQX0NSMF9NQVNLX1NDUiwgOCkgXAotKQotCi0jZGVmaW5lIERFRkFVTFRfU1NQX1JFR19DUjEgKCBcCi0JR0VOX01BU0tfQklUUyhMT09QQkFDS19ESVNBQkxFRCwgU1NQX0NSMV9NQVNLX0xCTSwgMCkgfCBcCi0JR0VOX01BU0tfQklUUyhTU1BfRElTQUJMRUQsIFNTUF9DUjFfTUFTS19TU0UsIDEpIHwgXAotCUdFTl9NQVNLX0JJVFMoU1NQX01BU1RFUiwgU1NQX0NSMV9NQVNLX01TLCAyKSB8IFwKLQlHRU5fTUFTS19CSVRTKERPX05PVF9EUklWRV9UWCwgU1NQX0NSMV9NQVNLX1NPRCwgMykgXAotKQotCi0vKiBTVCB2ZXJzaW9ucyBleHRlbmQgdGhpcyByZWdpc3RlciB0byB1c2UgYWxsIDE2IGJpdHMgKi8KLSNkZWZpbmUgREVGQVVMVF9TU1BfUkVHX0NSMV9TVCAoIFwKLQlERUZBVUxUX1NTUF9SRUdfQ1IxIHwgXAotCUdFTl9NQVNLX0JJVFMoU1NQX1JYX01TQiwgU1NQX0NSMV9NQVNLX1JFTkROX1NULCA0KSB8IFwKLQlHRU5fTUFTS19CSVRTKFNTUF9UWF9NU0IsIFNTUF9DUjFfTUFTS19URU5ETl9TVCwgNSkgfCBcCi0JR0VOX01BU0tfQklUUyhTU1BfTVdJUkVfV0FJVF9aRVJPLCBTU1BfQ1IxX01BU0tfTVdBSVRfU1QsIDYpIHxcCi0JR0VOX01BU0tfQklUUyhTU1BfUlhfMV9PUl9NT1JFX0VMRU0sIFNTUF9DUjFfTUFTS19SWElGTFNFTF9TVCwgNykgfCBcCi0JR0VOX01BU0tfQklUUyhTU1BfVFhfMV9PUl9NT1JFX0VNUFRZX0xPQywgU1NQX0NSMV9NQVNLX1RYSUZMU0VMX1NULCAxMCkgXAotKQotCi0vKgotICogVGhlIFBMMDIzIHZhcmlhbnQgaGFzIGZ1cnRoZXIgZGlmZmVyZW5jZXM6IG5vIGxvb3BiYWNrIG1vZGUsIG5vIG1pY3Jvd2lyZQotICogc3VwcG9ydCwgYW5kIGEgbmV3IGNsb2NrIGZlZWRiYWNrIGRlbGF5IHNldHRpbmcuCi0gKi8KLSNkZWZpbmUgREVGQVVMVF9TU1BfUkVHX0NSMV9TVF9QTDAyMyAoIFwKLQlHRU5fTUFTS19CSVRTKFNTUF9ESVNBQkxFRCwgU1NQX0NSMV9NQVNLX1NTRSwgMSkgfCBcCi0JR0VOX01BU0tfQklUUyhTU1BfTUFTVEVSLCBTU1BfQ1IxX01BU0tfTVMsIDIpIHwgXAotCUdFTl9NQVNLX0JJVFMoRE9fTk9UX0RSSVZFX1RYLCBTU1BfQ1IxX01BU0tfU09ELCAzKSB8IFwKLQlHRU5fTUFTS19CSVRTKFNTUF9SWF9NU0IsIFNTUF9DUjFfTUFTS19SRU5ETl9TVCwgNCkgfCBcCi0JR0VOX01BU0tfQklUUyhTU1BfVFhfTVNCLCBTU1BfQ1IxX01BU0tfVEVORE5fU1QsIDUpIHwgXAotCUdFTl9NQVNLX0JJVFMoU1NQX1JYXzFfT1JfTU9SRV9FTEVNLCBTU1BfQ1IxX01BU0tfUlhJRkxTRUxfU1QsIDcpIHwgXAotCUdFTl9NQVNLX0JJVFMoU1NQX1RYXzFfT1JfTU9SRV9FTVBUWV9MT0MsIFNTUF9DUjFfTUFTS19UWElGTFNFTF9TVCwgMTApIHwgXAotCUdFTl9NQVNLX0JJVFMoU1NQX0ZFRURCQUNLX0NMS19ERUxBWV9OT05FLCBTU1BfQ1IxX01BU0tfRkJDTEtERUxfU1QsIDEzKSBcCi0pCi0KLSNkZWZpbmUgREVGQVVMVF9TU1BfUkVHX0NQU1IgKCBcCi0JR0VOX01BU0tfQklUUyhTU1BfREVGQVVMVF9QUkVTQ0FMRSwgU1NQX0NQU1JfTUFTS19DUFNEVlNSLCAwKSBcCi0pCi0KLSNkZWZpbmUgREVGQVVMVF9TU1BfUkVHX0RNQUNSIChcCi0JR0VOX01BU0tfQklUUyhTU1BfRE1BX0RJU0FCTEVELCBTU1BfRE1BQ1JfTUFTS19SWERNQUUsIDApIHwgXAotCUdFTl9NQVNLX0JJVFMoU1NQX0RNQV9ESVNBQkxFRCwgU1NQX0RNQUNSX01BU0tfVFhETUFFLCAxKSBcCi0pCi0KLS8qKgotICogbG9hZF9zc3BfZGVmYXVsdF9jb25maWcgLSBMb2FkIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgU1NQCi0gKiBAcGwwMjI6IFNTUCBkcml2ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQotICovCi1zdGF0aWMgdm9pZCBsb2FkX3NzcF9kZWZhdWx0X2NvbmZpZyhzdHJ1Y3QgcGwwMjIgKnBsMDIyKQotewotCWlmIChwbDAyMi0+dmVuZG9yLT5wbDAyMykgewotCQl3cml0ZWwoREVGQVVMVF9TU1BfUkVHX0NSMF9TVF9QTDAyMywgU1NQX0NSMChwbDAyMi0+dmlydGJhc2UpKTsKLQkJd3JpdGV3KERFRkFVTFRfU1NQX1JFR19DUjFfU1RfUEwwMjMsIFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSk7Ci0JfSBlbHNlIGlmIChwbDAyMi0+dmVuZG9yLT5leHRlbmRlZF9jcikgewotCQl3cml0ZWwoREVGQVVMVF9TU1BfUkVHX0NSMF9TVCwgU1NQX0NSMChwbDAyMi0+dmlydGJhc2UpKTsKLQkJd3JpdGV3KERFRkFVTFRfU1NQX1JFR19DUjFfU1QsIFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSk7Ci0JfSBlbHNlIHsKLQkJd3JpdGV3KERFRkFVTFRfU1NQX1JFR19DUjAsIFNTUF9DUjAocGwwMjItPnZpcnRiYXNlKSk7Ci0JCXdyaXRldyhERUZBVUxUX1NTUF9SRUdfQ1IxLCBTU1BfQ1IxKHBsMDIyLT52aXJ0YmFzZSkpOwotCX0KLQl3cml0ZXcoREVGQVVMVF9TU1BfUkVHX0RNQUNSLCBTU1BfRE1BQ1IocGwwMjItPnZpcnRiYXNlKSk7Ci0Jd3JpdGV3KERFRkFVTFRfU1NQX1JFR19DUFNSLCBTU1BfQ1BTUihwbDAyMi0+dmlydGJhc2UpKTsKLQl3cml0ZXcoRElTQUJMRV9BTExfSU5URVJSVVBUUywgU1NQX0lNU0MocGwwMjItPnZpcnRiYXNlKSk7Ci0Jd3JpdGV3KENMRUFSX0FMTF9JTlRFUlJVUFRTLCBTU1BfSUNSKHBsMDIyLT52aXJ0YmFzZSkpOwotfQotCi0vKioKLSAqIFRoaXMgd2lsbCB3cml0ZSB0byBUWCBhbmQgcmVhZCBmcm9tIFJYIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVycwotICogc2V0IGluIHBsMDIyLgotICovCi1zdGF0aWMgdm9pZCByZWFkd3JpdGVyKHN0cnVjdCBwbDAyMiAqcGwwMjIpCi17Ci0KLQkvKgotCSAqIFRoZSBGSUZPIGRlcHRoIGlzIGRpZmZlcmVudCBiZXR3ZWVuIHByaW1lY2VsbCB2YXJpYW50cy4KLQkgKiBJIGJlbGlldmUgZmlsbGluZyBpbiB0b28gbXVjaCBpbiB0aGUgRklGTyBtaWdodCBjYXVzZQotCSAqIGVycm9ucyBpbiA4Yml0IHdpZGUgdHJhbnNmZXJzIG9uIEFSTSB2YXJpYW50cyAoanVzdCA4IHdvcmRzCi0JICogRklGTywgbWVhbnMgb25seSA4eDggPSA2NCBiaXRzIGluIEZJRk8pIGF0IGxlYXN0LgotCSAqCi0JICogVG8gcHJldmVudCB0aGlzIGlzc3VlLCB0aGUgVFggRklGTyBpcyBvbmx5IGZpbGxlZCB0byB0aGUKLQkgKiB1bnVzZWQgUlggRklGTyBmaWxsIGxlbmd0aCwgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBUWAotCSAqIEZJRk8gc3RhdHVzIGZsYWcgaW5kaWNhdGVzLgotCSAqLwotCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsCi0JCSIlcywgcng6ICVwLCByeGVuZDogJXAsIHR4OiAlcCwgdHhlbmQ6ICVwXG4iLAotCQlfX2Z1bmNfXywgcGwwMjItPnJ4LCBwbDAyMi0+cnhfZW5kLCBwbDAyMi0+dHgsIHBsMDIyLT50eF9lbmQpOwotCi0JLyogUmVhZCBhcyBtdWNoIGFzIHlvdSBjYW4gKi8KLQl3aGlsZSAoKHJlYWR3KFNTUF9TUihwbDAyMi0+dmlydGJhc2UpKSAmIFNTUF9TUl9NQVNLX1JORSkKLQkgICAgICAgJiYgKHBsMDIyLT5yeCA8IHBsMDIyLT5yeF9lbmQpKSB7Ci0JCXN3aXRjaCAocGwwMjItPnJlYWQpIHsKLQkJY2FzZSBSRUFESU5HX05VTEw6Ci0JCQlyZWFkdyhTU1BfRFIocGwwMjItPnZpcnRiYXNlKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRUFESU5HX1U4OgotCQkJKih1OCAqKSAocGwwMjItPnJ4KSA9Ci0JCQkJcmVhZHcoU1NQX0RSKHBsMDIyLT52aXJ0YmFzZSkpICYgMHhGRlU7Ci0JCQlicmVhazsKLQkJY2FzZSBSRUFESU5HX1UxNjoKLQkJCSoodTE2ICopIChwbDAyMi0+cngpID0KLQkJCQkodTE2KSByZWFkdyhTU1BfRFIocGwwMjItPnZpcnRiYXNlKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRUFESU5HX1UzMjoKLQkJCSoodTMyICopIChwbDAyMi0+cngpID0KLQkJCQlyZWFkbChTU1BfRFIocGwwMjItPnZpcnRiYXNlKSk7Ci0JCQlicmVhazsKLQkJfQotCQlwbDAyMi0+cnggKz0gKHBsMDIyLT5jdXJfY2hpcC0+bl9ieXRlcyk7Ci0JCXBsMDIyLT5leHBfZmlmb19sZXZlbC0tOwotCX0KLQkvKgotCSAqIFdyaXRlIGFzIG11Y2ggYXMgcG9zc2libGUgdXAgdG8gdGhlIFJYIEZJRk8gc2l6ZQotCSAqLwotCXdoaWxlICgocGwwMjItPmV4cF9maWZvX2xldmVsIDwgcGwwMjItPnZlbmRvci0+Zmlmb2RlcHRoKQotCSAgICAgICAmJiAocGwwMjItPnR4IDwgcGwwMjItPnR4X2VuZCkpIHsKLQkJc3dpdGNoIChwbDAyMi0+d3JpdGUpIHsKLQkJY2FzZSBXUklUSU5HX05VTEw6Ci0JCQl3cml0ZXcoMHgwLCBTU1BfRFIocGwwMjItPnZpcnRiYXNlKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBXUklUSU5HX1U4OgotCQkJd3JpdGV3KCoodTggKikgKHBsMDIyLT50eCksIFNTUF9EUihwbDAyMi0+dmlydGJhc2UpKTsKLQkJCWJyZWFrOwotCQljYXNlIFdSSVRJTkdfVTE2OgotCQkJd3JpdGV3KCgqKHUxNiAqKSAocGwwMjItPnR4KSksIFNTUF9EUihwbDAyMi0+dmlydGJhc2UpKTsKLQkJCWJyZWFrOwotCQljYXNlIFdSSVRJTkdfVTMyOgotCQkJd3JpdGVsKCoodTMyICopIChwbDAyMi0+dHgpLCBTU1BfRFIocGwwMjItPnZpcnRiYXNlKSk7Ci0JCQlicmVhazsKLQkJfQotCQlwbDAyMi0+dHggKz0gKHBsMDIyLT5jdXJfY2hpcC0+bl9ieXRlcyk7Ci0JCXBsMDIyLT5leHBfZmlmb19sZXZlbCsrOwotCQkvKgotCQkgKiBUaGlzIGlubmVyIHJlYWRlciB0YWtlcyBjYXJlIG9mIHRoaW5ncyBhcHBlYXJpbmcgaW4gdGhlIFJYCi0JCSAqIEZJRk8gYXMgd2UncmUgdHJhbnNtaXR0aW5nLiBUaGlzIHdpbGwgaGFwcGVuIGEgbG90IHNpbmNlIHRoZQotCQkgKiBjbG9jayBzdGFydHMgcnVubmluZyB3aGVuIHlvdSBwdXQgdGhpbmdzIGludG8gdGhlIFRYIEZJRk8sCi0JCSAqIGFuZCB0aGVuIHRoaW5ncyBhcmUgY29udGludW91c2x5IGNsb2NrZWQgaW50byB0aGUgUlggRklGTy4KLQkJICovCi0JCXdoaWxlICgocmVhZHcoU1NQX1NSKHBsMDIyLT52aXJ0YmFzZSkpICYgU1NQX1NSX01BU0tfUk5FKQotCQkgICAgICAgJiYgKHBsMDIyLT5yeCA8IHBsMDIyLT5yeF9lbmQpKSB7Ci0JCQlzd2l0Y2ggKHBsMDIyLT5yZWFkKSB7Ci0JCQljYXNlIFJFQURJTkdfTlVMTDoKLQkJCQlyZWFkdyhTU1BfRFIocGwwMjItPnZpcnRiYXNlKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFQURJTkdfVTg6Ci0JCQkJKih1OCAqKSAocGwwMjItPnJ4KSA9Ci0JCQkJCXJlYWR3KFNTUF9EUihwbDAyMi0+dmlydGJhc2UpKSAmIDB4RkZVOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUFESU5HX1UxNjoKLQkJCQkqKHUxNiAqKSAocGwwMjItPnJ4KSA9Ci0JCQkJCSh1MTYpIHJlYWR3KFNTUF9EUihwbDAyMi0+dmlydGJhc2UpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVBRElOR19VMzI6Ci0JCQkJKih1MzIgKikgKHBsMDIyLT5yeCkgPQotCQkJCQlyZWFkbChTU1BfRFIocGwwMjItPnZpcnRiYXNlKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwbDAyMi0+cnggKz0gKHBsMDIyLT5jdXJfY2hpcC0+bl9ieXRlcyk7Ci0JCQlwbDAyMi0+ZXhwX2ZpZm9fbGV2ZWwtLTsKLQkJfQotCX0KLQkvKgotCSAqIFdoZW4gd2UgZXhpdCBoZXJlIHRoZSBUWCBGSUZPIHNob3VsZCBiZSBmdWxsIGFuZCB0aGUgUlggRklGTwotCSAqIHNob3VsZCBiZSBlbXB0eQotCSAqLwotfQotCi0KLS8qKgotICogbmV4dF90cmFuc2ZlciAtIE1vdmUgdG8gdGhlIE5leHQgdHJhbnNmZXIgaW4gdGhlIGN1cnJlbnQgc3BpIG1lc3NhZ2UKLSAqIEBwbDAyMjogU1NQIGRyaXZlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlCi0gKgotICogVGhpcyBmdW5jdGlvbiBtb3ZlcyB0aG91Z2ggdGhlIGxpbmtlZCBsaXN0IG9mIHNwaSB0cmFuc2ZlcnMgaW4gdGhlCi0gKiBjdXJyZW50IHNwaSBtZXNzYWdlIGFuZCByZXR1cm5zIHdpdGggdGhlIHN0YXRlIG9mIGN1cnJlbnQgc3BpCi0gKiBtZXNzYWdlIGkuZSB3aGV0aGVyIGl0cyBsYXN0IHRyYW5zZmVyIGlzIGRvbmUoU1RBVEVfRE9ORSkgb3IKLSAqIE5leHQgdHJhbnNmZXIgaXMgcmVhZHkoU1RBVEVfUlVOTklORykKLSAqLwotc3RhdGljIHZvaWQgKm5leHRfdHJhbnNmZXIoc3RydWN0IHBsMDIyICpwbDAyMikKLXsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IHBsMDIyLT5jdXJfbXNnOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zID0gcGwwMjItPmN1cl90cmFuc2ZlcjsKLQotCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciAqLwotCWlmICh0cmFucy0+dHJhbnNmZXJfbGlzdC5uZXh0ICE9ICZtc2ctPnRyYW5zZmVycykgewotCQlwbDAyMi0+Y3VyX3RyYW5zZmVyID0KLQkJICAgIGxpc3RfZW50cnkodHJhbnMtPnRyYW5zZmVyX2xpc3QubmV4dCwKLQkJCSAgICAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLCB0cmFuc2Zlcl9saXN0KTsKLQkJcmV0dXJuIFNUQVRFX1JVTk5JTkc7Ci0JfQotCXJldHVybiBTVEFURV9ET05FOwotfQotCi0vKgotICogVGhpcyBETUEgZnVuY3Rpb25hbGl0eSBpcyBvbmx5IGNvbXBpbGVkIGluIGlmIHdlIGhhdmUKLSAqIGFjY2VzcyB0byB0aGUgZ2VuZXJpYyBETUEgZGV2aWNlcy9ETUEgZW5naW5lLgotICovCi0jaWZkZWYgQ09ORklHX0RNQV9FTkdJTkUKLXN0YXRpYyB2b2lkIHVubWFwX2ZyZWVfZG1hX3NjYXR0ZXIoc3RydWN0IHBsMDIyICpwbDAyMikKLXsKLQkvKiBVbm1hcCBhbmQgZnJlZSB0aGUgU0cgdGFibGVzICovCi0JZG1hX3VubWFwX3NnKHBsMDIyLT5kbWFfdHhfY2hhbm5lbC0+ZGV2aWNlLT5kZXYsIHBsMDIyLT5zZ3RfdHguc2dsLAotCQkgICAgIHBsMDIyLT5zZ3RfdHgubmVudHMsIERNQV9UT19ERVZJQ0UpOwotCWRtYV91bm1hcF9zZyhwbDAyMi0+ZG1hX3J4X2NoYW5uZWwtPmRldmljZS0+ZGV2LCBwbDAyMi0+c2d0X3J4LnNnbCwKLQkJICAgICBwbDAyMi0+c2d0X3J4Lm5lbnRzLCBETUFfRlJPTV9ERVZJQ0UpOwotCXNnX2ZyZWVfdGFibGUoJnBsMDIyLT5zZ3RfcngpOwotCXNnX2ZyZWVfdGFibGUoJnBsMDIyLT5zZ3RfdHgpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfY2FsbGJhY2sodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gZGF0YTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IHBsMDIyLT5jdXJfbXNnOwotCi0JQlVHX09OKCFwbDAyMi0+c2d0X3J4LnNnbCk7Ci0KLSNpZmRlZiBWRVJCT1NFX0RFQlVHCi0JLyoKLQkgKiBPcHRpb25hbGx5IGR1bXAgb3V0IGJ1ZmZlcnMgdG8gaW5zcGVjdCBjb250ZW50cywgdGhpcyBpcwotCSAqIGdvb2QgaWYgeW91IHdhbnQgdG8gY29udmluY2UgeW91cnNlbGYgdGhhdCB0aGUgbG9vcGJhY2sKLQkgKiByZWFkL3dyaXRlIGNvbnRlbnRzIGFyZSB0aGUgc2FtZSwgd2hlbiBhZG9wdGluZyB0byBhIG5ldwotCSAqIERNQSBlbmdpbmUuCi0JICovCi0JewotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCQl1bnNpZ25lZCBpbnQgaTsKLQotCQlkbWFfc3luY19zZ19mb3JfY3B1KCZwbDAyMi0+YWRldi0+ZGV2LAotCQkJCSAgICBwbDAyMi0+c2d0X3J4LnNnbCwKLQkJCQkgICAgcGwwMjItPnNndF9yeC5uZW50cywKLQkJCQkgICAgRE1BX0ZST01fREVWSUNFKTsKLQotCQlmb3JfZWFjaF9zZyhwbDAyMi0+c2d0X3J4LnNnbCwgc2csIHBsMDIyLT5zZ3RfcngubmVudHMsIGkpIHsKLQkJCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsICJTUEkgUlggU0cgRU5UUlk6ICVkIiwgaSk7Ci0JCQlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgIlNQSSBSWDogIiwKLQkJCQkgICAgICAgRFVNUF9QUkVGSVhfT0ZGU0VULAotCQkJCSAgICAgICAxNiwKLQkJCQkgICAgICAgMSwKLQkJCQkgICAgICAgc2dfdmlydChzZyksCi0JCQkJICAgICAgIHNnX2RtYV9sZW4oc2cpLAotCQkJCSAgICAgICAxKTsKLQkJfQotCQlmb3JfZWFjaF9zZyhwbDAyMi0+c2d0X3R4LnNnbCwgc2csIHBsMDIyLT5zZ3RfdHgubmVudHMsIGkpIHsKLQkJCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsICJTUEkgVFggU0cgRU5UUlk6ICVkIiwgaSk7Ci0JCQlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgIlNQSSBUWDogIiwKLQkJCQkgICAgICAgRFVNUF9QUkVGSVhfT0ZGU0VULAotCQkJCSAgICAgICAxNiwKLQkJCQkgICAgICAgMSwKLQkJCQkgICAgICAgc2dfdmlydChzZyksCi0JCQkJICAgICAgIHNnX2RtYV9sZW4oc2cpLAotCQkJCSAgICAgICAxKTsKLQkJfQotCX0KLSNlbmRpZgotCi0JdW5tYXBfZnJlZV9kbWFfc2NhdHRlcihwbDAyMik7Ci0KLQkvKiBVcGRhdGUgdG90YWwgYnl0ZXMgdHJhbnNmZXJyZWQgKi8KLQltc2ctPmFjdHVhbF9sZW5ndGggKz0gcGwwMjItPmN1cl90cmFuc2Zlci0+bGVuOwotCWlmIChwbDAyMi0+Y3VyX3RyYW5zZmVyLT5jc19jaGFuZ2UpCi0JCXBsMDIyLT5jdXJfY2hpcC0+Ci0JCQljc19jb250cm9sKFNTUF9DSElQX0RFU0VMRUNUKTsKLQotCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciAqLwotCW1zZy0+c3RhdGUgPSBuZXh0X3RyYW5zZmVyKHBsMDIyKTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZwbDAyMi0+cHVtcF90cmFuc2ZlcnMpOwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cF9kbWFfc2NhdHRlcihzdHJ1Y3QgcGwwMjIgKnBsMDIyLAotCQkJICAgICAgdm9pZCAqYnVmZmVyLAotCQkJICAgICAgdW5zaWduZWQgaW50IGxlbmd0aCwKLQkJCSAgICAgIHN0cnVjdCBzZ190YWJsZSAqc2d0YWIpCi17Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQlpbnQgYnl0ZXNsZWZ0ID0gbGVuZ3RoOwotCXZvaWQgKmJ1ZnAgPSBidWZmZXI7Ci0JaW50IG1hcGJ5dGVzOwotCWludCBpOwotCi0JaWYgKGJ1ZmZlcikgewotCQlmb3JfZWFjaF9zZyhzZ3RhYi0+c2dsLCBzZywgc2d0YWItPm5lbnRzLCBpKSB7Ci0JCQkvKgotCQkJICogSWYgdGhlcmUgYXJlIGxlc3MgYnl0ZXMgbGVmdCB0aGFuIHdoYXQgZml0cwotCQkJICogaW4gdGhlIGN1cnJlbnQgcGFnZSAocGx1cyBwYWdlIGFsaWdubWVudCBvZmZzZXQpCi0JCQkgKiB3ZSBqdXN0IGZlZWQgaW4gdGhpcywgZWxzZSB3ZSBzdHVmZiBpbiBhcyBtdWNoCi0JCQkgKiBhcyB3ZSBjYW4uCi0JCQkgKi8KLQkJCWlmIChieXRlc2xlZnQgPCAoUEFHRV9TSVpFIC0gb2Zmc2V0X2luX3BhZ2UoYnVmcCkpKQotCQkJCW1hcGJ5dGVzID0gYnl0ZXNsZWZ0OwotCQkJZWxzZQotCQkJCW1hcGJ5dGVzID0gUEFHRV9TSVpFIC0gb2Zmc2V0X2luX3BhZ2UoYnVmcCk7Ci0JCQlzZ19zZXRfcGFnZShzZywgdmlydF90b19wYWdlKGJ1ZnApLAotCQkJCSAgICBtYXBieXRlcywgb2Zmc2V0X2luX3BhZ2UoYnVmcCkpOwotCQkJYnVmcCArPSBtYXBieXRlczsKLQkJCWJ5dGVzbGVmdCAtPSBtYXBieXRlczsKLQkJCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsCi0JCQkJInNldCBSWC9UWCB0YXJnZXQgcGFnZSBAICVwLCAlZCBieXRlcywgJWQgbGVmdFxuIiwKLQkJCQlidWZwLCBtYXBieXRlcywgYnl0ZXNsZWZ0KTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIE1hcCB0aGUgZHVtbXkgYnVmZmVyIG9uIGV2ZXJ5IHBhZ2UgKi8KLQkJZm9yX2VhY2hfc2coc2d0YWItPnNnbCwgc2csIHNndGFiLT5uZW50cywgaSkgewotCQkJaWYgKGJ5dGVzbGVmdCA8IFBBR0VfU0laRSkKLQkJCQltYXBieXRlcyA9IGJ5dGVzbGVmdDsKLQkJCWVsc2UKLQkJCQltYXBieXRlcyA9IFBBR0VfU0laRTsKLQkJCXNnX3NldF9wYWdlKHNnLCB2aXJ0X3RvX3BhZ2UocGwwMjItPmR1bW15cGFnZSksCi0JCQkJICAgIG1hcGJ5dGVzLCAwKTsKLQkJCWJ5dGVzbGVmdCAtPSBtYXBieXRlczsKLQkJCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsCi0JCQkJInNldCBSWC9UWCB0byBkdW1teSBwYWdlICVkIGJ5dGVzLCAlZCBsZWZ0XG4iLAotCQkJCW1hcGJ5dGVzLCBieXRlc2xlZnQpOwotCi0JCX0KLQl9Ci0JQlVHX09OKGJ5dGVzbGVmdCk7Ci19Ci0KLS8qKgotICogY29uZmlndXJlX2RtYSAtIGNvbmZpZ3VyZXMgdGhlIGNoYW5uZWxzIGZvciB0aGUgbmV4dCB0cmFuc2ZlcgotICogQHBsMDIyOiBTU1AgZHJpdmVyJ3MgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQotICovCi1zdGF0aWMgaW50IGNvbmZpZ3VyZV9kbWEoc3RydWN0IHBsMDIyICpwbDAyMikKLXsKLQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyByeF9jb25mID0gewotCQkuc3JjX2FkZHIgPSBTU1BfRFIocGwwMjItPnBoeWJhc2UpLAotCQkuZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFLAotCQkuc3JjX21heGJ1cnN0ID0gcGwwMjItPnZlbmRvci0+Zmlmb2RlcHRoID4+IDEsCi0JfTsKLQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyB0eF9jb25mID0gewotCQkuZHN0X2FkZHIgPSBTU1BfRFIocGwwMjItPnBoeWJhc2UpLAotCQkuZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRSwKLQkJLmRzdF9tYXhidXJzdCA9IHBsMDIyLT52ZW5kb3ItPmZpZm9kZXB0aCA+PiAxLAotCX07Ci0JdW5zaWduZWQgaW50IHBhZ2VzOwotCWludCByZXQ7Ci0JaW50IHJ4X3NnbGVuLCB0eF9zZ2xlbjsKLQlzdHJ1Y3QgZG1hX2NoYW4gKnJ4Y2hhbiA9IHBsMDIyLT5kbWFfcnhfY2hhbm5lbDsKLQlzdHJ1Y3QgZG1hX2NoYW4gKnR4Y2hhbiA9IHBsMDIyLT5kbWFfdHhfY2hhbm5lbDsKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnJ4ZGVzYzsKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ZGVzYzsKLQotCS8qIENoZWNrIHRoYXQgdGhlIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUgKi8KLQlpZiAoIXJ4Y2hhbiB8fCAhdHhjaGFuKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXN3aXRjaCAocGwwMjItPnJlYWQpIHsKLQljYXNlIFJFQURJTkdfTlVMTDoKLQkJLyogVXNlIHRoZSBzYW1lIGFzIGZvciB3cml0aW5nICovCi0JCXJ4X2NvbmYuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfVU5ERUZJTkVEOwotCQlicmVhazsKLQljYXNlIFJFQURJTkdfVTg6Ci0JCXJ4X2NvbmYuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOwotCQlicmVhazsKLQljYXNlIFJFQURJTkdfVTE2OgotCQlyeF9jb25mLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM7Ci0JCWJyZWFrOwotCWNhc2UgUkVBRElOR19VMzI6Ci0JCXJ4X2NvbmYuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzsKLQkJYnJlYWs7Ci0JfQotCi0Jc3dpdGNoIChwbDAyMi0+d3JpdGUpIHsKLQljYXNlIFdSSVRJTkdfTlVMTDoKLQkJLyogVXNlIHRoZSBzYW1lIGFzIGZvciByZWFkaW5nICovCi0JCXR4X2NvbmYuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfVU5ERUZJTkVEOwotCQlicmVhazsKLQljYXNlIFdSSVRJTkdfVTg6Ci0JCXR4X2NvbmYuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOwotCQlicmVhazsKLQljYXNlIFdSSVRJTkdfVTE2OgotCQl0eF9jb25mLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM7Ci0JCWJyZWFrOwotCWNhc2UgV1JJVElOR19VMzI6Ci0JCXR4X2NvbmYuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzsKLQkJYnJlYWs7Ci0JfQotCi0JLyogU1BJIHBlY3VsYXJpdHk6IHdlIG5lZWQgdG8gcmVhZCBhbmQgd3JpdGUgdGhlIHNhbWUgd2lkdGggKi8KLQlpZiAocnhfY29uZi5zcmNfYWRkcl93aWR0aCA9PSBETUFfU0xBVkVfQlVTV0lEVEhfVU5ERUZJTkVEKQotCQlyeF9jb25mLnNyY19hZGRyX3dpZHRoID0gdHhfY29uZi5kc3RfYWRkcl93aWR0aDsKLQlpZiAodHhfY29uZi5kc3RfYWRkcl93aWR0aCA9PSBETUFfU0xBVkVfQlVTV0lEVEhfVU5ERUZJTkVEKQotCQl0eF9jb25mLmRzdF9hZGRyX3dpZHRoID0gcnhfY29uZi5zcmNfYWRkcl93aWR0aDsKLQlCVUdfT04ocnhfY29uZi5zcmNfYWRkcl93aWR0aCAhPSB0eF9jb25mLmRzdF9hZGRyX3dpZHRoKTsKLQotCWRtYWVuZ2luZV9zbGF2ZV9jb25maWcocnhjaGFuLCAmcnhfY29uZik7Ci0JZG1hZW5naW5lX3NsYXZlX2NvbmZpZyh0eGNoYW4sICZ0eF9jb25mKTsKLQotCS8qIENyZWF0ZSBzZ2xpc3RzIGZvciB0aGUgdHJhbnNmZXJzICovCi0JcGFnZXMgPSAocGwwMjItPmN1cl90cmFuc2Zlci0+bGVuID4+IFBBR0VfU0hJRlQpICsgMTsKLQlkZXZfZGJnKCZwbDAyMi0+YWRldi0+ZGV2LCAidXNpbmcgJWQgcGFnZXMgZm9yIHRyYW5zZmVyXG4iLCBwYWdlcyk7Ci0KLQlyZXQgPSBzZ19hbGxvY190YWJsZSgmcGwwMjItPnNndF9yeCwgcGFnZXMsIEdGUF9LRVJORUwpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2FsbG9jX3J4X3NnOwotCi0JcmV0ID0gc2dfYWxsb2NfdGFibGUoJnBsMDIyLT5zZ3RfdHgsIHBhZ2VzLCBHRlBfS0VSTkVMKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9hbGxvY190eF9zZzsKLQotCS8qIEZpbGwgaW4gdGhlIHNjYXR0ZXJsaXN0cyBmb3IgdGhlIFJYK1RYIGJ1ZmZlcnMgKi8KLQlzZXR1cF9kbWFfc2NhdHRlcihwbDAyMiwgcGwwMjItPnJ4LAotCQkJICBwbDAyMi0+Y3VyX3RyYW5zZmVyLT5sZW4sICZwbDAyMi0+c2d0X3J4KTsKLQlzZXR1cF9kbWFfc2NhdHRlcihwbDAyMiwgcGwwMjItPnR4LAotCQkJICBwbDAyMi0+Y3VyX3RyYW5zZmVyLT5sZW4sICZwbDAyMi0+c2d0X3R4KTsKLQotCS8qIE1hcCBETUEgYnVmZmVycyAqLwotCXJ4X3NnbGVuID0gZG1hX21hcF9zZyhyeGNoYW4tPmRldmljZS0+ZGV2LCBwbDAyMi0+c2d0X3J4LnNnbCwKLQkJCSAgIHBsMDIyLT5zZ3RfcngubmVudHMsIERNQV9GUk9NX0RFVklDRSk7Ci0JaWYgKCFyeF9zZ2xlbikKLQkJZ290byBlcnJfcnhfc2dtYXA7Ci0KLQl0eF9zZ2xlbiA9IGRtYV9tYXBfc2codHhjaGFuLT5kZXZpY2UtPmRldiwgcGwwMjItPnNndF90eC5zZ2wsCi0JCQkgICBwbDAyMi0+c2d0X3R4Lm5lbnRzLCBETUFfVE9fREVWSUNFKTsKLQlpZiAoIXR4X3NnbGVuKQotCQlnb3RvIGVycl90eF9zZ21hcDsKLQotCS8qIFNlbmQgYm90aCBzY2F0dGVybGlzdHMgKi8KLQlyeGRlc2MgPSByeGNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2cocnhjaGFuLAotCQkJCSAgICAgIHBsMDIyLT5zZ3Rfcnguc2dsLAotCQkJCSAgICAgIHJ4X3NnbGVuLAotCQkJCSAgICAgIERNQV9GUk9NX0RFVklDRSwKLQkJCQkgICAgICBETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ1RSTF9BQ0spOwotCWlmICghcnhkZXNjKQotCQlnb3RvIGVycl9yeGRlc2M7Ci0KLQl0eGRlc2MgPSB0eGNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2codHhjaGFuLAotCQkJCSAgICAgIHBsMDIyLT5zZ3RfdHguc2dsLAotCQkJCSAgICAgIHR4X3NnbGVuLAotCQkJCSAgICAgIERNQV9UT19ERVZJQ0UsCi0JCQkJICAgICAgRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLKTsKLQlpZiAoIXR4ZGVzYykKLQkJZ290byBlcnJfdHhkZXNjOwotCi0JLyogUHV0IHRoZSBjYWxsYmFjayBvbiB0aGUgUlggdHJhbnNmZXIgb25seSwgdGhhdCBzaG91bGQgZmluaXNoIGxhc3QgKi8KLQlyeGRlc2MtPmNhbGxiYWNrID0gZG1hX2NhbGxiYWNrOwotCXJ4ZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBwbDAyMjsKLQotCS8qIFN1Ym1pdCBhbmQgZmlyZSBSWCBhbmQgVFggd2l0aCBUWCBsYXN0IHNvIHdlJ3JlIHJlYWR5IHRvIHJlYWQhICovCi0JZG1hZW5naW5lX3N1Ym1pdChyeGRlc2MpOwotCWRtYWVuZ2luZV9zdWJtaXQodHhkZXNjKTsKLQlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhyeGNoYW4pOwotCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKHR4Y2hhbik7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3R4ZGVzYzoKLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbCh0eGNoYW4pOwotZXJyX3J4ZGVzYzoKLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChyeGNoYW4pOwotCWRtYV91bm1hcF9zZyh0eGNoYW4tPmRldmljZS0+ZGV2LCBwbDAyMi0+c2d0X3R4LnNnbCwKLQkJICAgICBwbDAyMi0+c2d0X3R4Lm5lbnRzLCBETUFfVE9fREVWSUNFKTsKLWVycl90eF9zZ21hcDoKLQlkbWFfdW5tYXBfc2cocnhjaGFuLT5kZXZpY2UtPmRldiwgcGwwMjItPnNndF9yeC5zZ2wsCi0JCSAgICAgcGwwMjItPnNndF90eC5uZW50cywgRE1BX0ZST01fREVWSUNFKTsKLWVycl9yeF9zZ21hcDoKLQlzZ19mcmVlX3RhYmxlKCZwbDAyMi0+c2d0X3R4KTsKLWVycl9hbGxvY190eF9zZzoKLQlzZ19mcmVlX3RhYmxlKCZwbDAyMi0+c2d0X3J4KTsKLWVycl9hbGxvY19yeF9zZzoKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcGwwMjJfZG1hX3Byb2JlKHN0cnVjdCBwbDAyMiAqcGwwMjIpCi17Ci0JZG1hX2NhcF9tYXNrX3QgbWFzazsKLQotCS8qIFRyeSB0byBhY3F1aXJlIGEgZ2VuZXJpYyBETUEgZW5naW5lIHNsYXZlIGNoYW5uZWwgKi8KLQlkbWFfY2FwX3plcm8obWFzayk7Ci0JZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKLQkvKgotCSAqIFdlIG5lZWQgYm90aCBSWCBhbmQgVFggY2hhbm5lbHMgdG8gZG8gRE1BLCBlbHNlIGRvIG5vbmUKLQkgKiBvZiB0aGVtLgotCSAqLwotCXBsMDIyLT5kbWFfcnhfY2hhbm5lbCA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywKLQkJCQkJICAgIHBsMDIyLT5tYXN0ZXJfaW5mby0+ZG1hX2ZpbHRlciwKLQkJCQkJICAgIHBsMDIyLT5tYXN0ZXJfaW5mby0+ZG1hX3J4X3BhcmFtKTsKLQlpZiAoIXBsMDIyLT5kbWFfcnhfY2hhbm5lbCkgewotCQlkZXZfZGJnKCZwbDAyMi0+YWRldi0+ZGV2LCAibm8gUlggRE1BIGNoYW5uZWwhXG4iKTsKLQkJZ290byBlcnJfbm9fcnhjaGFuOwotCX0KLQotCXBsMDIyLT5kbWFfdHhfY2hhbm5lbCA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywKLQkJCQkJICAgIHBsMDIyLT5tYXN0ZXJfaW5mby0+ZG1hX2ZpbHRlciwKLQkJCQkJICAgIHBsMDIyLT5tYXN0ZXJfaW5mby0+ZG1hX3R4X3BhcmFtKTsKLQlpZiAoIXBsMDIyLT5kbWFfdHhfY2hhbm5lbCkgewotCQlkZXZfZGJnKCZwbDAyMi0+YWRldi0+ZGV2LCAibm8gVFggRE1BIGNoYW5uZWwhXG4iKTsKLQkJZ290byBlcnJfbm9fdHhjaGFuOwotCX0KLQotCXBsMDIyLT5kdW1teXBhZ2UgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbDAyMi0+ZHVtbXlwYWdlKSB7Ci0JCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsICJubyBETUEgZHVtbXlwYWdlIVxuIik7Ci0JCWdvdG8gZXJyX25vX2R1bW15cGFnZTsKLQl9Ci0KLQlkZXZfaW5mbygmcGwwMjItPmFkZXYtPmRldiwgInNldHVwIGZvciBETUEgb24gUlggJXMsIFRYICVzXG4iLAotCQkgZG1hX2NoYW5fbmFtZShwbDAyMi0+ZG1hX3J4X2NoYW5uZWwpLAotCQkgZG1hX2NoYW5fbmFtZShwbDAyMi0+ZG1hX3R4X2NoYW5uZWwpKTsKLQotCXJldHVybiAwOwotCi1lcnJfbm9fZHVtbXlwYWdlOgotCWRtYV9yZWxlYXNlX2NoYW5uZWwocGwwMjItPmRtYV90eF9jaGFubmVsKTsKLWVycl9ub190eGNoYW46Ci0JZG1hX3JlbGVhc2VfY2hhbm5lbChwbDAyMi0+ZG1hX3J4X2NoYW5uZWwpOwotCXBsMDIyLT5kbWFfcnhfY2hhbm5lbCA9IE5VTEw7Ci1lcnJfbm9fcnhjaGFuOgotCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCi0JCQkiRmFpbGVkIHRvIHdvcmsgaW4gZG1hIG1vZGUsIHdvcmsgd2l0aG91dCBkbWEhXG4iKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIHZvaWQgdGVybWluYXRlX2RtYShzdHJ1Y3QgcGwwMjIgKnBsMDIyKQotewotCXN0cnVjdCBkbWFfY2hhbiAqcnhjaGFuID0gcGwwMjItPmRtYV9yeF9jaGFubmVsOwotCXN0cnVjdCBkbWFfY2hhbiAqdHhjaGFuID0gcGwwMjItPmRtYV90eF9jaGFubmVsOwotCi0JZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwocnhjaGFuKTsKLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbCh0eGNoYW4pOwotCXVubWFwX2ZyZWVfZG1hX3NjYXR0ZXIocGwwMjIpOwotfQotCi1zdGF0aWMgdm9pZCBwbDAyMl9kbWFfcmVtb3ZlKHN0cnVjdCBwbDAyMiAqcGwwMjIpCi17Ci0JaWYgKHBsMDIyLT5idXN5KQotCQl0ZXJtaW5hdGVfZG1hKHBsMDIyKTsKLQlpZiAocGwwMjItPmRtYV90eF9jaGFubmVsKQotCQlkbWFfcmVsZWFzZV9jaGFubmVsKHBsMDIyLT5kbWFfdHhfY2hhbm5lbCk7Ci0JaWYgKHBsMDIyLT5kbWFfcnhfY2hhbm5lbCkKLQkJZG1hX3JlbGVhc2VfY2hhbm5lbChwbDAyMi0+ZG1hX3J4X2NoYW5uZWwpOwotCWtmcmVlKHBsMDIyLT5kdW1teXBhZ2UpOwotfQotCi0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgY29uZmlndXJlX2RtYShzdHJ1Y3QgcGwwMjIgKnBsMDIyKQotewotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBwbDAyMl9kbWFfcHJvYmUoc3RydWN0IHBsMDIyICpwbDAyMikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBsMDIyX2RtYV9yZW1vdmUoc3RydWN0IHBsMDIyICpwbDAyMikKLXsKLX0KLSNlbmRpZgotCi0vKioKLSAqIHBsMDIyX2ludGVycnVwdF9oYW5kbGVyIC0gSW50ZXJydXB0IGhhbmRsZXIgZm9yIFNTUCBjb250cm9sbGVyCi0gKgotICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGludGVycnVwdHMgZ2VuZXJhdGVkIGZvciBhbiBpbnRlcnJ1cHQgYmFzZWQgdHJhbnNmZXIuCi0gKiBJZiBhIHJlY2VpdmUgb3ZlcnJ1biAoUk9SKSBpbnRlcnJ1cHQgaXMgdGhlcmUgdGhlbiB3ZSBkaXNhYmxlIFNTUCwgZmxhZyB0aGUKLSAqIGN1cnJlbnQgbWVzc2FnZSdzIHN0YXRlIGFzIFNUQVRFX0VSUk9SIGFuZCBzY2hlZHVsZSB0aGUgdGFza2xldAotICogcHVtcF90cmFuc2ZlcnMgd2hpY2ggd2lsbCBkbyB0aGUgcG9zdHByb2Nlc3Npbmcgb2YgdGhlIGN1cnJlbnQgbWVzc2FnZSBieQotICogY2FsbGluZyBnaXZlYmFjaygpLiBPdGhlcndpc2UgaXQgcmVhZHMgZGF0YSBmcm9tIFJYIEZJRk8gdGlsbCB0aGVyZSBpcyBubwotICogbW9yZSBkYXRhLCBhbmQgd3JpdGVzIGRhdGEgaW4gVFggRklGTyB0aWxsIGl0IGlzIG5vdCBmdWxsLiBJZiB3ZSBjb21wbGV0ZQotICogdGhlIHRyYW5zZmVyIHdlIG1vdmUgdG8gdGhlIG5leHQgdHJhbnNmZXIgYW5kIHNjaGVkdWxlIHRoZSB0YXNrbGV0LgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgcGwwMjJfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBkZXZfaWQ7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICptc2cgPSBwbDAyMi0+Y3VyX21zZzsKLQl1MTYgaXJxX3N0YXR1cyA9IDA7Ci0JdTE2IGZsYWcgPSAwOwotCi0JaWYgKHVubGlrZWx5KCFtc2cpKSB7Ci0JCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCi0JCQkiYmFkIG1lc3NhZ2Ugc3RhdGUgaW4gaW50ZXJydXB0IGhhbmRsZXIiKTsKLQkJLyogTmV2ZXIgZmFpbCAqLwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JLyogUmVhZCB0aGUgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotCWlycV9zdGF0dXMgPSByZWFkdyhTU1BfTUlTKHBsMDIyLT52aXJ0YmFzZSkpOwotCi0JaWYgKHVubGlrZWx5KCFpcnFfc3RhdHVzKSkKLQkJcmV0dXJuIElSUV9OT05FOwotCi0JLyoKLQkgKiBUaGlzIGhhbmRsZXMgdGhlIEZJRk8gaW50ZXJydXB0cywgdGhlIHRpbWVvdXQKLQkgKiBpbnRlcnJ1cHRzIGFyZSBmbGF0bHkgaWdub3JlZCwgdGhleSBjYW5ub3QgYmUKLQkgKiB0cnVzdGVkLgotCSAqLwotCWlmICh1bmxpa2VseShpcnFfc3RhdHVzICYgU1NQX01JU19NQVNLX1JPUk1JUykpIHsKLQkJLyoKLQkJICogT3ZlcnJ1biBpbnRlcnJ1cHQgLSBiYWlsIG91dCBzaW5jZSBvdXIgRGF0YSBoYXMgYmVlbgotCQkgKiBjb3JydXB0ZWQKLQkJICovCi0JCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsICJGSUZPIG92ZXJydW5cbiIpOwotCQlpZiAocmVhZHcoU1NQX1NSKHBsMDIyLT52aXJ0YmFzZSkpICYgU1NQX1NSX01BU0tfUkZGKQotCQkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKLQkJCQkiUlhGSUZPIGlzIGZ1bGxcbiIpOwotCQlpZiAocmVhZHcoU1NQX1NSKHBsMDIyLT52aXJ0YmFzZSkpICYgU1NQX1NSX01BU0tfVE5GKQotCQkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKLQkJCQkiVFhGSUZPIGlzIGZ1bGxcbiIpOwotCi0JCS8qCi0JCSAqIERpc2FibGUgYW5kIGNsZWFyIGludGVycnVwdHMsIGRpc2FibGUgU1NQLAotCQkgKiBtYXJrIG1lc3NhZ2Ugd2l0aCBiYWQgc3RhdHVzIHNvIGl0IGNhbiBiZQotCQkgKiByZXRyaWVkLgotCQkgKi8KLQkJd3JpdGV3KERJU0FCTEVfQUxMX0lOVEVSUlVQVFMsCi0JCSAgICAgICBTU1BfSU1TQyhwbDAyMi0+dmlydGJhc2UpKTsKLQkJd3JpdGV3KENMRUFSX0FMTF9JTlRFUlJVUFRTLCBTU1BfSUNSKHBsMDIyLT52aXJ0YmFzZSkpOwotCQl3cml0ZXcoKHJlYWR3KFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSkgJgotCQkJKH5TU1BfQ1IxX01BU0tfU1NFKSksIFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSk7Ci0JCW1zZy0+c3RhdGUgPSBTVEFURV9FUlJPUjsKLQotCQkvKiBTY2hlZHVsZSBtZXNzYWdlIHF1ZXVlIGhhbmRsZXIgKi8KLQkJdGFza2xldF9zY2hlZHVsZSgmcGwwMjItPnB1bXBfdHJhbnNmZXJzKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCXJlYWR3cml0ZXIocGwwMjIpOwotCi0JaWYgKChwbDAyMi0+dHggPT0gcGwwMjItPnR4X2VuZCkgJiYgKGZsYWcgPT0gMCkpIHsKLQkJZmxhZyA9IDE7Ci0JCS8qIERpc2FibGUgVHJhbnNtaXQgaW50ZXJydXB0ICovCi0JCXdyaXRldyhyZWFkdyhTU1BfSU1TQyhwbDAyMi0+dmlydGJhc2UpKSAmCi0JCSAgICAgICAoflNTUF9JTVNDX01BU0tfVFhJTSksCi0JCSAgICAgICBTU1BfSU1TQyhwbDAyMi0+dmlydGJhc2UpKTsKLQl9Ci0KLQkvKgotCSAqIFNpbmNlIGFsbCB0cmFuc2FjdGlvbnMgbXVzdCB3cml0ZSBhcyBtdWNoIGFzIHNoYWxsIGJlIHJlYWQsCi0JICogd2UgY2FuIGNvbmNsdWRlIHRoZSBlbnRpcmUgdHJhbnNhY3Rpb24gb25jZSBSWCBpcyBjb21wbGV0ZS4KLQkgKiBBdCB0aGlzIHBvaW50LCBhbGwgVFggd2lsbCBhbHdheXMgYmUgZmluaXNoZWQuCi0JICovCi0JaWYgKHBsMDIyLT5yeCA+PSBwbDAyMi0+cnhfZW5kKSB7Ci0JCXdyaXRldyhESVNBQkxFX0FMTF9JTlRFUlJVUFRTLAotCQkgICAgICAgU1NQX0lNU0MocGwwMjItPnZpcnRiYXNlKSk7Ci0JCXdyaXRldyhDTEVBUl9BTExfSU5URVJSVVBUUywgU1NQX0lDUihwbDAyMi0+dmlydGJhc2UpKTsKLQkJaWYgKHVubGlrZWx5KHBsMDIyLT5yeCA+IHBsMDIyLT5yeF9lbmQpKSB7Ci0JCQlkZXZfd2FybigmcGwwMjItPmFkZXYtPmRldiwgInJlYWQgJXUgc3VycGx1cyAiCi0JCQkJICJieXRlcyAoZGlkIHlvdSByZXF1ZXN0IGFuIG9kZCAiCi0JCQkJICJudW1iZXIgb2YgYnl0ZXMgb24gYSAxNmJpdCBidXM/KVxuIiwKLQkJCQkgKHUzMikgKHBsMDIyLT5yeCAtIHBsMDIyLT5yeF9lbmQpKTsKLQkJfQotCQkvKiBVcGRhdGUgdG90YWwgYnl0ZXMgdHJhbnNmZXJyZWQgKi8KLQkJbXNnLT5hY3R1YWxfbGVuZ3RoICs9IHBsMDIyLT5jdXJfdHJhbnNmZXItPmxlbjsKLQkJaWYgKHBsMDIyLT5jdXJfdHJhbnNmZXItPmNzX2NoYW5nZSkKLQkJCXBsMDIyLT5jdXJfY2hpcC0+Ci0JCQkJY3NfY29udHJvbChTU1BfQ0hJUF9ERVNFTEVDVCk7Ci0JCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciAqLwotCQltc2ctPnN0YXRlID0gbmV4dF90cmFuc2ZlcihwbDAyMik7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJnBsMDIyLT5wdW1wX3RyYW5zZmVycyk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogVGhpcyBzZXRzIHVwIHRoZSBwb2ludGVycyB0byBtZW1vcnkgZm9yIHRoZSBuZXh0IG1lc3NhZ2UgdG8KLSAqIHNlbmQgb3V0IG9uIHRoZSBTUEkgYnVzLgotICovCi1zdGF0aWMgaW50IHNldF91cF9uZXh0X3RyYW5zZmVyKHN0cnVjdCBwbDAyMiAqcGwwMjIsCi0JCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnNmZXIpCi17Ci0JaW50IHJlc2lkdWU7Ci0KLQkvKiBTYW5pdHkgY2hlY2sgdGhlIG1lc3NhZ2UgZm9yIHRoaXMgYnVzIHdpZHRoICovCi0JcmVzaWR1ZSA9IHBsMDIyLT5jdXJfdHJhbnNmZXItPmxlbiAlIHBsMDIyLT5jdXJfY2hpcC0+bl9ieXRlczsKLQlpZiAodW5saWtlbHkocmVzaWR1ZSAhPSAwKSkgewotCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAotCQkJIm1lc3NhZ2Ugb2YgJXUgYnl0ZXMgdG8gdHJhbnNtaXQgYnV0IHRoZSBjdXJyZW50ICIKLQkJCSJjaGlwIGJ1cyBoYXMgYSBkYXRhIHdpZHRoIG9mICV1IGJ5dGVzIVxuIiwKLQkJCXBsMDIyLT5jdXJfdHJhbnNmZXItPmxlbiwKLQkJCXBsMDIyLT5jdXJfY2hpcC0+bl9ieXRlcyk7Ci0JCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsICJza2lwcGluZyB0aGlzIG1lc3NhZ2VcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcGwwMjItPnR4ID0gKHZvaWQgKil0cmFuc2Zlci0+dHhfYnVmOwotCXBsMDIyLT50eF9lbmQgPSBwbDAyMi0+dHggKyBwbDAyMi0+Y3VyX3RyYW5zZmVyLT5sZW47Ci0JcGwwMjItPnJ4ID0gKHZvaWQgKil0cmFuc2Zlci0+cnhfYnVmOwotCXBsMDIyLT5yeF9lbmQgPSBwbDAyMi0+cnggKyBwbDAyMi0+Y3VyX3RyYW5zZmVyLT5sZW47Ci0JcGwwMjItPndyaXRlID0KLQkgICAgcGwwMjItPnR4ID8gcGwwMjItPmN1cl9jaGlwLT53cml0ZSA6IFdSSVRJTkdfTlVMTDsKLQlwbDAyMi0+cmVhZCA9IHBsMDIyLT5yeCA/IHBsMDIyLT5jdXJfY2hpcC0+cmVhZCA6IFJFQURJTkdfTlVMTDsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBwdW1wX3RyYW5zZmVycyAtIFRhc2tsZXQgZnVuY3Rpb24gd2hpY2ggc2NoZWR1bGVzIG5leHQgdHJhbnNmZXIKLSAqIHdoZW4gcnVubmluZyBpbiBpbnRlcnJ1cHQgb3IgRE1BIHRyYW5zZmVyIG1vZGUuCi0gKiBAZGF0YTogU1NQIGRyaXZlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlCi0gKgotICovCi1zdGF0aWMgdm9pZCBwdW1wX3RyYW5zZmVycyh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHBsMDIyICpwbDAyMiA9IChzdHJ1Y3QgcGwwMjIgKikgZGF0YTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UgPSBOVUxMOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zZmVyID0gTlVMTDsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpwcmV2aW91cyA9IE5VTEw7Ci0KLQkvKiBHZXQgY3VycmVudCBzdGF0ZSBpbmZvcm1hdGlvbiAqLwotCW1lc3NhZ2UgPSBwbDAyMi0+Y3VyX21zZzsKLQl0cmFuc2ZlciA9IHBsMDIyLT5jdXJfdHJhbnNmZXI7Ci0KLQkvKiBIYW5kbGUgZm9yIGFib3J0ICovCi0JaWYgKG1lc3NhZ2UtPnN0YXRlID09IFNUQVRFX0VSUk9SKSB7Ci0JCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU87Ci0JCWdpdmViYWNrKHBsMDIyKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEhhbmRsZSBlbmQgb2YgbWVzc2FnZSAqLwotCWlmIChtZXNzYWdlLT5zdGF0ZSA9PSBTVEFURV9ET05FKSB7Ci0JCW1lc3NhZ2UtPnN0YXR1cyA9IDA7Ci0JCWdpdmViYWNrKHBsMDIyKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIERlbGF5IGlmIHJlcXVlc3RlZCBhdCBlbmQgb2YgdHJhbnNmZXIgYmVmb3JlIENTIGNoYW5nZSAqLwotCWlmIChtZXNzYWdlLT5zdGF0ZSA9PSBTVEFURV9SVU5OSU5HKSB7Ci0JCXByZXZpb3VzID0gbGlzdF9lbnRyeSh0cmFuc2Zlci0+dHJhbnNmZXJfbGlzdC5wcmV2LAotCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAotCQkJCQl0cmFuc2Zlcl9saXN0KTsKLQkJaWYgKHByZXZpb3VzLT5kZWxheV91c2VjcykKLQkJCS8qCi0JCQkgKiBGSVhNRTogVGhpcyBydW5zIGluIGludGVycnVwdCBjb250ZXh0LgotCQkJICogSXMgdGhpcyByZWFsbHkgc21hcnQ/Ci0JCQkgKi8KLQkJCXVkZWxheShwcmV2aW91cy0+ZGVsYXlfdXNlY3MpOwotCi0JCS8qIERyb3AgY2hpcCBzZWxlY3Qgb25seSBpZiBjc19jaGFuZ2UgaXMgcmVxdWVzdGVkICovCi0JCWlmIChwcmV2aW91cy0+Y3NfY2hhbmdlKQotCQkJcGwwMjItPmN1cl9jaGlwLT5jc19jb250cm9sKFNTUF9DSElQX1NFTEVDVCk7Ci0JfSBlbHNlIHsKLQkJLyogU1RBVEVfU1RBUlQgKi8KLQkJbWVzc2FnZS0+c3RhdGUgPSBTVEFURV9SVU5OSU5HOwotCX0KLQotCWlmIChzZXRfdXBfbmV4dF90cmFuc2ZlcihwbDAyMiwgdHJhbnNmZXIpKSB7Ci0JCW1lc3NhZ2UtPnN0YXRlID0gU1RBVEVfRVJST1I7Ci0JCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU87Ci0JCWdpdmViYWNrKHBsMDIyKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBGbHVzaCB0aGUgRklGT3MgYW5kIGxldCdzIGdvISAqLwotCWZsdXNoKHBsMDIyKTsKLQotCWlmIChwbDAyMi0+Y3VyX2NoaXAtPmVuYWJsZV9kbWEpIHsKLQkJaWYgKGNvbmZpZ3VyZV9kbWEocGwwMjIpKSB7Ci0JCQlkZXZfZGJnKCZwbDAyMi0+YWRldi0+ZGV2LAotCQkJCSJjb25maWd1cmF0aW9uIG9mIERNQSBmYWlsZWQsIGZhbGwgYmFjayB0byBpbnRlcnJ1cHQgbW9kZVxuIik7Ci0JCQlnb3RvIGVycl9jb25maWdfZG1hOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLWVycl9jb25maWdfZG1hOgotCXdyaXRldyhFTkFCTEVfQUxMX0lOVEVSUlVQVFMsIFNTUF9JTVNDKHBsMDIyLT52aXJ0YmFzZSkpOwotfQotCi1zdGF0aWMgdm9pZCBkb19pbnRlcnJ1cHRfZG1hX3RyYW5zZmVyKHN0cnVjdCBwbDAyMiAqcGwwMjIpCi17Ci0JdTMyIGlycWZsYWdzID0gRU5BQkxFX0FMTF9JTlRFUlJVUFRTOwotCi0JLyogRW5hYmxlIHRhcmdldCBjaGlwICovCi0JcGwwMjItPmN1cl9jaGlwLT5jc19jb250cm9sKFNTUF9DSElQX1NFTEVDVCk7Ci0JaWYgKHNldF91cF9uZXh0X3RyYW5zZmVyKHBsMDIyLCBwbDAyMi0+Y3VyX3RyYW5zZmVyKSkgewotCQkvKiBFcnJvciBwYXRoICovCi0JCXBsMDIyLT5jdXJfbXNnLT5zdGF0ZSA9IFNUQVRFX0VSUk9SOwotCQlwbDAyMi0+Y3VyX21zZy0+c3RhdHVzID0gLUVJTzsKLQkJZ2l2ZWJhY2socGwwMjIpOwotCQlyZXR1cm47Ci0JfQotCS8qIElmIHdlJ3JlIHVzaW5nIERNQSwgc2V0IHVwIERNQSBoZXJlICovCi0JaWYgKHBsMDIyLT5jdXJfY2hpcC0+ZW5hYmxlX2RtYSkgewotCQkvKiBDb25maWd1cmUgRE1BIHRyYW5zZmVyICovCi0JCWlmIChjb25maWd1cmVfZG1hKHBsMDIyKSkgewotCQkJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwKLQkJCQkiY29uZmlndXJhdGlvbiBvZiBETUEgZmFpbGVkLCBmYWxsIGJhY2sgdG8gaW50ZXJydXB0IG1vZGVcbiIpOwotCQkJZ290byBlcnJfY29uZmlnX2RtYTsKLQkJfQotCQkvKiBEaXNhYmxlIGludGVycnVwdHMgaW4gRE1BIG1vZGUsIElSUSBmcm9tIERNQSBjb250cm9sbGVyICovCi0JCWlycWZsYWdzID0gRElTQUJMRV9BTExfSU5URVJSVVBUUzsKLQl9Ci1lcnJfY29uZmlnX2RtYToKLQkvKiBFbmFibGUgU1NQLCB0dXJuIG9uIGludGVycnVwdHMgKi8KLQl3cml0ZXcoKHJlYWR3KFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSkgfCBTU1BfQ1IxX01BU0tfU1NFKSwKLQkgICAgICAgU1NQX0NSMShwbDAyMi0+dmlydGJhc2UpKTsKLQl3cml0ZXcoaXJxZmxhZ3MsIFNTUF9JTVNDKHBsMDIyLT52aXJ0YmFzZSkpOwotfQotCi1zdGF0aWMgdm9pZCBkb19wb2xsaW5nX3RyYW5zZmVyKHN0cnVjdCBwbDAyMiAqcGwwMjIpCi17Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICptZXNzYWdlID0gTlVMTDsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFuc2ZlciA9IE5VTEw7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqcHJldmlvdXMgPSBOVUxMOwotCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXA7Ci0JdW5zaWduZWQgbG9uZyB0aW1lLCB0aW1lb3V0OwotCi0JY2hpcCA9IHBsMDIyLT5jdXJfY2hpcDsKLQltZXNzYWdlID0gcGwwMjItPmN1cl9tc2c7Ci0KLQl3aGlsZSAobWVzc2FnZS0+c3RhdGUgIT0gU1RBVEVfRE9ORSkgewotCQkvKiBIYW5kbGUgZm9yIGFib3J0ICovCi0JCWlmIChtZXNzYWdlLT5zdGF0ZSA9PSBTVEFURV9FUlJPUikKLQkJCWJyZWFrOwotCQl0cmFuc2ZlciA9IHBsMDIyLT5jdXJfdHJhbnNmZXI7Ci0KLQkJLyogRGVsYXkgaWYgcmVxdWVzdGVkIGF0IGVuZCBvZiB0cmFuc2ZlciAqLwotCQlpZiAobWVzc2FnZS0+c3RhdGUgPT0gU1RBVEVfUlVOTklORykgewotCQkJcHJldmlvdXMgPQotCQkJICAgIGxpc3RfZW50cnkodHJhbnNmZXItPnRyYW5zZmVyX2xpc3QucHJldiwKLQkJCQkgICAgICAgc3RydWN0IHNwaV90cmFuc2ZlciwgdHJhbnNmZXJfbGlzdCk7Ci0JCQlpZiAocHJldmlvdXMtPmRlbGF5X3VzZWNzKQotCQkJCXVkZWxheShwcmV2aW91cy0+ZGVsYXlfdXNlY3MpOwotCQkJaWYgKHByZXZpb3VzLT5jc19jaGFuZ2UpCi0JCQkJcGwwMjItPmN1cl9jaGlwLT5jc19jb250cm9sKFNTUF9DSElQX1NFTEVDVCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBTVEFURV9TVEFSVCAqLwotCQkJbWVzc2FnZS0+c3RhdGUgPSBTVEFURV9SVU5OSU5HOwotCQkJcGwwMjItPmN1cl9jaGlwLT5jc19jb250cm9sKFNTUF9DSElQX1NFTEVDVCk7Ci0JCX0KLQotCQkvKiBDb25maWd1cmF0aW9uIENoYW5naW5nIFBlciBUcmFuc2ZlciAqLwotCQlpZiAoc2V0X3VwX25leHRfdHJhbnNmZXIocGwwMjIsIHRyYW5zZmVyKSkgewotCQkJLyogRXJyb3IgcGF0aCAqLwotCQkJbWVzc2FnZS0+c3RhdGUgPSBTVEFURV9FUlJPUjsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIEZsdXNoIEZJRk9zIGFuZCBlbmFibGUgU1NQICovCi0JCWZsdXNoKHBsMDIyKTsKLQkJd3JpdGV3KChyZWFkdyhTU1BfQ1IxKHBsMDIyLT52aXJ0YmFzZSkpIHwgU1NQX0NSMV9NQVNLX1NTRSksCi0JCSAgICAgICBTU1BfQ1IxKHBsMDIyLT52aXJ0YmFzZSkpOwotCi0JCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsICJwb2xsaW5nIHRyYW5zZmVyIG9uZ29pbmcgLi4uXG4iKTsKLQotCQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoU1BJX1BPTExJTkdfVElNRU9VVCk7Ci0JCXdoaWxlIChwbDAyMi0+dHggPCBwbDAyMi0+dHhfZW5kIHx8IHBsMDIyLT5yeCA8IHBsMDIyLT5yeF9lbmQpIHsKLQkJCXRpbWUgPSBqaWZmaWVzOwotCQkJcmVhZHdyaXRlcihwbDAyMik7Ci0JCQlpZiAodGltZV9hZnRlcih0aW1lLCB0aW1lb3V0KSkgewotCQkJCWRldl93YXJuKCZwbDAyMi0+YWRldi0+ZGV2LAotCQkJCSIlczogdGltZW91dCFcbiIsIF9fZnVuY19fKTsKLQkJCQltZXNzYWdlLT5zdGF0ZSA9IFNUQVRFX0VSUk9SOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJY3B1X3JlbGF4KCk7Ci0JCX0KLQotCQkvKiBVcGRhdGUgdG90YWwgYnl0ZSB0cmFuc2ZlcnJlZCAqLwotCQltZXNzYWdlLT5hY3R1YWxfbGVuZ3RoICs9IHBsMDIyLT5jdXJfdHJhbnNmZXItPmxlbjsKLQkJaWYgKHBsMDIyLT5jdXJfdHJhbnNmZXItPmNzX2NoYW5nZSkKLQkJCXBsMDIyLT5jdXJfY2hpcC0+Y3NfY29udHJvbChTU1BfQ0hJUF9ERVNFTEVDVCk7Ci0JCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciAqLwotCQltZXNzYWdlLT5zdGF0ZSA9IG5leHRfdHJhbnNmZXIocGwwMjIpOwotCX0KLW91dDoKLQkvKiBIYW5kbGUgZW5kIG9mIG1lc3NhZ2UgKi8KLQlpZiAobWVzc2FnZS0+c3RhdGUgPT0gU1RBVEVfRE9ORSkKLQkJbWVzc2FnZS0+c3RhdHVzID0gMDsKLQllbHNlCi0JCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU87Ci0KLQlnaXZlYmFjayhwbDAyMik7Ci0JcmV0dXJuOwotfQotCi0vKioKLSAqIHB1bXBfbWVzc2FnZXMgLSBXb3JrcXVldWUgZnVuY3Rpb24gd2hpY2ggcHJvY2Vzc2VzIHNwaSBtZXNzYWdlIHF1ZXVlCi0gKiBAZGF0YTogcG9pbnRlciB0byBwcml2YXRlIGRhdGEgb2YgU1NQIGRyaXZlcgotICoKLSAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZXJlIGlzIGFueSBzcGkgbWVzc2FnZSBpbiB0aGUgcXVldWUgdGhhdAotICogbmVlZHMgcHJvY2Vzc2luZyBhbmQgZGVsZWdhdGUgY29udHJvbCB0byBhcHByb3ByaWF0ZSBmdW5jdGlvbgotICogZG9fcG9sbGluZ190cmFuc2ZlcigpL2RvX2ludGVycnVwdF9kbWFfdHJhbnNmZXIoKQotICogYmFzZWQgb24gdGhlIGtpbmQgb2YgdGhlIHRyYW5zZmVyCi0gKgotICovCi1zdGF0aWMgdm9pZCBwdW1wX21lc3NhZ2VzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwbDAyMiwgcHVtcF9tZXNzYWdlcyk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIExvY2sgcXVldWUgYW5kIGNoZWNrIGZvciBxdWV1ZSB3b3JrICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKGxpc3RfZW1wdHkoJnBsMDIyLT5xdWV1ZSkgfHwgIXBsMDIyLT5ydW5uaW5nKSB7Ci0JCXBsMDIyLT5idXN5ID0gZmFsc2U7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0JLyogTWFrZSBzdXJlIHdlIGFyZSBub3QgYWxyZWFkeSBydW5uaW5nIGEgbWVzc2FnZSAqLwotCWlmIChwbDAyMi0+Y3VyX21zZykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbDAyMi0+cXVldWVfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCS8qIEV4dHJhY3QgaGVhZCBvZiBxdWV1ZSAqLwotCXBsMDIyLT5jdXJfbXNnID0KLQkgICAgbGlzdF9lbnRyeShwbDAyMi0+cXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7Ci0KLQlsaXN0X2RlbF9pbml0KCZwbDAyMi0+Y3VyX21zZy0+cXVldWUpOwotCXBsMDIyLT5idXN5ID0gdHJ1ZTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbDAyMi0+cXVldWVfbG9jaywgZmxhZ3MpOwotCi0JLyogSW5pdGlhbCBtZXNzYWdlIHN0YXRlICovCi0JcGwwMjItPmN1cl9tc2ctPnN0YXRlID0gU1RBVEVfU1RBUlQ7Ci0JcGwwMjItPmN1cl90cmFuc2ZlciA9IGxpc3RfZW50cnkocGwwMjItPmN1cl9tc2ctPnRyYW5zZmVycy5uZXh0LAotCQkJCQkgICAgc3RydWN0IHNwaV90cmFuc2ZlciwKLQkJCQkJICAgIHRyYW5zZmVyX2xpc3QpOwotCi0JLyogU2V0dXAgdGhlIFNQSSB1c2luZyB0aGUgcGVyIGNoaXAgY29uZmlndXJhdGlvbiAqLwotCXBsMDIyLT5jdXJfY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShwbDAyMi0+Y3VyX21zZy0+c3BpKTsKLQkvKgotCSAqIFdlIGVuYWJsZSB0aGUgY29yZSB2b2x0YWdlIGFuZCBjbG9ja3MgaGVyZSwgdGhlbiB0aGUgY2xvY2tzCi0JICogYW5kIGNvcmUgd2lsbCBiZSBkaXNhYmxlZCB3aGVuIGdpdmViYWNrKCkgaXMgY2FsbGVkIGluIGVhY2ggbWV0aG9kCi0JICogKHBvbGwvaW50ZXJydXB0L0RNQSkKLQkgKi8KLQlhbWJhX3Zjb3JlX2VuYWJsZShwbDAyMi0+YWRldik7Ci0JYW1iYV9wY2xrX2VuYWJsZShwbDAyMi0+YWRldik7Ci0JY2xrX2VuYWJsZShwbDAyMi0+Y2xrKTsKLQlyZXN0b3JlX3N0YXRlKHBsMDIyKTsKLQlmbHVzaChwbDAyMik7Ci0KLQlpZiAocGwwMjItPmN1cl9jaGlwLT54ZmVyX3R5cGUgPT0gUE9MTElOR19UUkFOU0ZFUikKLQkJZG9fcG9sbGluZ190cmFuc2ZlcihwbDAyMik7Ci0JZWxzZQotCQlkb19pbnRlcnJ1cHRfZG1hX3RyYW5zZmVyKHBsMDIyKTsKLX0KLQotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X3F1ZXVlKHN0cnVjdCBwbDAyMiAqcGwwMjIpCi17Ci0JSU5JVF9MSVNUX0hFQUQoJnBsMDIyLT5xdWV1ZSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnBsMDIyLT5xdWV1ZV9sb2NrKTsKLQotCXBsMDIyLT5ydW5uaW5nID0gZmFsc2U7Ci0JcGwwMjItPmJ1c3kgPSBmYWxzZTsKLQotCXRhc2tsZXRfaW5pdCgmcGwwMjItPnB1bXBfdHJhbnNmZXJzLAotCQkJcHVtcF90cmFuc2ZlcnMsCSh1bnNpZ25lZCBsb25nKXBsMDIyKTsKLQotCUlOSVRfV09SSygmcGwwMjItPnB1bXBfbWVzc2FnZXMsIHB1bXBfbWVzc2FnZXMpOwotCXBsMDIyLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKLQkJCQkJZGV2X25hbWUocGwwMjItPm1hc3Rlci0+ZGV2LnBhcmVudCkpOwotCWlmIChwbDAyMi0+d29ya3F1ZXVlID09IE5VTEwpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHN0YXJ0X3F1ZXVlKHN0cnVjdCBwbDAyMiAqcGwwMjIpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwbDAyMi0+cXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKHBsMDIyLT5ydW5uaW5nIHx8IHBsMDIyLT5idXN5KSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcGwwMjItPnJ1bm5pbmcgPSB0cnVlOwotCXBsMDIyLT5jdXJfbXNnID0gTlVMTDsKLQlwbDAyMi0+Y3VyX3RyYW5zZmVyID0gTlVMTDsKLQlwbDAyMi0+Y3VyX2NoaXAgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlxdWV1ZV93b3JrKHBsMDIyLT53b3JrcXVldWUsICZwbDAyMi0+cHVtcF9tZXNzYWdlcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHN0b3BfcXVldWUoc3RydWN0IHBsMDIyICpwbDAyMikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxpbWl0ID0gNTAwOwotCWludCBzdGF0dXMgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQkvKiBUaGlzIGlzIGEgYml0IGxhbWUsIGJ1dCBpcyBvcHRpbWl6ZWQgZm9yIHRoZSBjb21tb24gZXhlY3V0aW9uIHBhdGguCi0JICogQSB3YWl0X3F1ZXVlIG9uIHRoZSBwbDAyMi0+YnVzeSBjb3VsZCBiZSB1c2VkLCBidXQgdGhlbiB0aGUgY29tbW9uCi0JICogZXhlY3V0aW9uIHBhdGggKHB1bXBfbWVzc2FnZXMpIHdvdWxkIGJlIHJlcXVpcmVkIHRvIGNhbGwgd2FrZV91cCBvcgotCSAqIGZyaWVuZHMgb24gZXZlcnkgU1BJIG1lc3NhZ2UuIERvIHRoaXMgaW5zdGVhZCAqLwotCXdoaWxlICgoIWxpc3RfZW1wdHkoJnBsMDIyLT5xdWV1ZSkgfHwgcGwwMjItPmJ1c3kpICYmIGxpbWl0LS0pIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGwwMjItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQkJbXNsZWVwKDEwKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKCFsaXN0X2VtcHR5KCZwbDAyMi0+cXVldWUpIHx8IHBsMDIyLT5idXN5KQotCQlzdGF0dXMgPSAtRUJVU1k7Ci0JZWxzZQotCQlwbDAyMi0+cnVubmluZyA9IGZhbHNlOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGwwMjItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgZGVzdHJveV9xdWV1ZShzdHJ1Y3QgcGwwMjIgKnBsMDIyKQotewotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBzdG9wX3F1ZXVlKHBsMDIyKTsKLQkvKiB3ZSBhcmUgdW5sb2FkaW5nIHRoZSBtb2R1bGUgb3IgZmFpbGluZyB0byBsb2FkIChvbmx5IHR3byBjYWxscwotCSAqIHRvIHRoaXMgcm91dGluZSksIGFuZCBuZWl0aGVyIGNhbGwgY2FuIGhhbmRsZSBhIHJldHVybiB2YWx1ZS4KLQkgKiBIb3dldmVyLCBkZXN0cm95X3dvcmtxdWV1ZSBjYWxscyBmbHVzaF93b3JrcXVldWUsIGFuZCB0aGF0IHdpbGwKLQkgKiBibG9jayB1bnRpbCBhbGwgd29yayBpcyBkb25lLiAgSWYgdGhlIHJlYXNvbiB0aGF0IHN0b3BfcXVldWUKLQkgKiB0aW1lZCBvdXQgaXMgdGhhdCB0aGUgd29yayB3aWxsIG5ldmVyIGZpbmlzaCwgdGhlbiBpdCBkb2VzIG5vCi0JICogZ29vZCB0byBjYWxsIGRlc3Ryb3lfd29ya3F1ZXVlLCBzbyByZXR1cm4gYW55d2F5LiAqLwotCWlmIChzdGF0dXMgIT0gMCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCWRlc3Ryb3lfd29ya3F1ZXVlKHBsMDIyLT53b3JrcXVldWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmVyaWZ5X2NvbnRyb2xsZXJfcGFyYW1ldGVycyhzdHJ1Y3QgcGwwMjIgKnBsMDIyLAotCQkJCXN0cnVjdCBwbDAyMl9jb25maWdfY2hpcCBjb25zdCAqY2hpcF9pbmZvKQotewotCWlmICgoY2hpcF9pbmZvLT5pZmFjZSA8IFNTUF9JTlRFUkZBQ0VfTU9UT1JPTEFfU1BJKQotCSAgICB8fCAoY2hpcF9pbmZvLT5pZmFjZSA+IFNTUF9JTlRFUkZBQ0VfVU5JRElSRUNUSU9OQUwpKSB7Ci0JCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCi0JCQkiaW50ZXJmYWNlIGlzIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHlcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKChjaGlwX2luZm8tPmlmYWNlID09IFNTUF9JTlRFUkZBQ0VfVU5JRElSRUNUSU9OQUwpICYmCi0JICAgICghcGwwMjItPnZlbmRvci0+dW5pZGlyKSkgewotCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAotCQkJInVuaWRpcmVjdGlvbmFsIG1vZGUgbm90IHN1cHBvcnRlZCBpbiB0aGlzICIKLQkJCSJoYXJkd2FyZSB2ZXJzaW9uXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICgoY2hpcF9pbmZvLT5oaWVyYXJjaHkgIT0gU1NQX01BU1RFUikKLQkgICAgJiYgKGNoaXBfaW5mby0+aGllcmFyY2h5ICE9IFNTUF9TTEFWRSkpIHsKLQkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKLQkJCSJoaWVyYXJjaHkgaXMgY29uZmlndXJlZCBpbmNvcnJlY3RseVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoKGNoaXBfaW5mby0+Y29tX21vZGUgIT0gSU5URVJSVVBUX1RSQU5TRkVSKQotCSAgICAmJiAoY2hpcF9pbmZvLT5jb21fbW9kZSAhPSBETUFfVFJBTlNGRVIpCi0JICAgICYmIChjaGlwX2luZm8tPmNvbV9tb2RlICE9IFBPTExJTkdfVFJBTlNGRVIpKSB7Ci0JCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCi0JCQkiQ29tbXVuaWNhdGlvbiBtb2RlIGlzIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHlcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKChjaGlwX2luZm8tPnJ4X2xldl90cmlnIDwgU1NQX1JYXzFfT1JfTU9SRV9FTEVNKQotCSAgICB8fCAoY2hpcF9pbmZvLT5yeF9sZXZfdHJpZyA+IFNTUF9SWF8zMl9PUl9NT1JFX0VMRU0pKSB7Ci0JCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCi0JCQkiUlggRklGTyBUcmlnZ2VyIExldmVsIGlzIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHlcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKChjaGlwX2luZm8tPnR4X2xldl90cmlnIDwgU1NQX1RYXzFfT1JfTU9SRV9FTVBUWV9MT0MpCi0JICAgIHx8IChjaGlwX2luZm8tPnR4X2xldl90cmlnID4gU1NQX1RYXzMyX09SX01PUkVfRU1QVFlfTE9DKSkgewotCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAotCQkJIlRYIEZJRk8gVHJpZ2dlciBMZXZlbCBpcyBjb25maWd1cmVkIGluY29ycmVjdGx5XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChjaGlwX2luZm8tPmlmYWNlID09IFNTUF9JTlRFUkZBQ0VfTkFUSU9OQUxfTUlDUk9XSVJFKSB7Ci0JCWlmICgoY2hpcF9pbmZvLT5jdHJsX2xlbiA8IFNTUF9CSVRTXzQpCi0JCSAgICB8fCAoY2hpcF9pbmZvLT5jdHJsX2xlbiA+IFNTUF9CSVRTXzMyKSkgewotCQkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKLQkJCQkiQ1RSTCBMRU4gaXMgY29uZmlndXJlZCBpbmNvcnJlY3RseVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAoKGNoaXBfaW5mby0+d2FpdF9zdGF0ZSAhPSBTU1BfTVdJUkVfV0FJVF9aRVJPKQotCQkgICAgJiYgKGNoaXBfaW5mby0+d2FpdF9zdGF0ZSAhPSBTU1BfTVdJUkVfV0FJVF9PTkUpKSB7Ci0JCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAotCQkJCSJXYWl0IFN0YXRlIGlzIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHlcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJLyogSGFsZiBkdXBsZXggaXMgb25seSBhdmFpbGFibGUgaW4gdGhlIFNUIE1pY3JvIHZlcnNpb24gKi8KLQkJaWYgKHBsMDIyLT52ZW5kb3ItPmV4dGVuZGVkX2NyKSB7Ci0JCQlpZiAoKGNoaXBfaW5mby0+ZHVwbGV4ICE9Ci0JCQkgICAgIFNTUF9NSUNST1dJUkVfQ0hBTk5FTF9GVUxMX0RVUExFWCkKLQkJCSAgICAmJiAoY2hpcF9pbmZvLT5kdXBsZXggIT0KLQkJCQlTU1BfTUlDUk9XSVJFX0NIQU5ORUxfSEFMRl9EVVBMRVgpKSB7Ci0JCQkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKLQkJCQkJIk1pY3Jvd2lyZSBkdXBsZXggbW9kZSBpcyBjb25maWd1cmVkIGluY29ycmVjdGx5XG4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChjaGlwX2luZm8tPmR1cGxleCAhPSBTU1BfTUlDUk9XSVJFX0NIQU5ORUxfRlVMTF9EVVBMRVgpCi0JCQkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKLQkJCQkJIk1pY3Jvd2lyZSBoYWxmIGR1cGxleCBtb2RlIHJlcXVlc3RlZCwiCi0JCQkJCSIgYnV0IHRoaXMgaXMgb25seSBhdmFpbGFibGUgaW4gdGhlIgotCQkJCQkiIFNUIHZlcnNpb24gb2YgUEwwMjJcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogcGwwMjJfdHJhbnNmZXIgLSB0cmFuc2ZlciBmdW5jdGlvbiByZWdpc3RlcmVkIHRvIFNQSSBtYXN0ZXIgZnJhbWV3b3JrCi0gKiBAc3BpOiBzcGkgZGV2aWNlIHdoaWNoIGlzIHJlcXVlc3RpbmcgdHJhbnNmZXIKLSAqIEBtc2c6IHNwaSBtZXNzYWdlIHdoaWNoIGlzIHRvIGhhbmRsZWQgaXMgcXVldWVkIHRvIGRyaXZlciBxdWV1ZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCB0byB0aGUgU1BJIGZyYW1ld29yayBmb3IgdGhpcyBTUEkgbWFzdGVyCi0gKiBjb250cm9sbGVyLiBJdCB3aWxsIHF1ZXVlIHRoZSBzcGlfbWVzc2FnZSBpbiB0aGUgcXVldWUgb2YgZHJpdmVyIGlmCi0gKiB0aGUgcXVldWUgaXMgbm90IHN0b3BwZWQgYW5kIHJldHVybi4KLSAqLwotc3RhdGljIGludCBwbDAyMl90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKLXsKLQlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwbDAyMi0+cXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFwbDAyMi0+cnVubmluZykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbDAyMi0+cXVldWVfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVTSFVURE9XTjsKLQl9Ci0JbXNnLT5hY3R1YWxfbGVuZ3RoID0gMDsKLQltc2ctPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKLQltc2ctPnN0YXRlID0gU1RBVEVfU1RBUlQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZtc2ctPnF1ZXVlLCAmcGwwMjItPnF1ZXVlKTsKLQlpZiAocGwwMjItPnJ1bm5pbmcgJiYgIXBsMDIyLT5idXN5KQotCQlxdWV1ZV93b3JrKHBsMDIyLT53b3JrcXVldWUsICZwbDAyMi0+cHVtcF9tZXNzYWdlcyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbDAyMi0+cXVldWVfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNhbGN1bGF0ZV9lZmZlY3RpdmVfZnJlcShzdHJ1Y3QgcGwwMjIgKnBsMDIyLAotCQkJCSAgICBpbnQgZnJlcSwKLQkJCQkgICAgc3RydWN0IHNzcF9jbG9ja19wYXJhbXMgKmNsa19mcmVxKQotewotCS8qIExldHMgY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3kgcGFyYW1ldGVycyAqLwotCXUxNiBjcHNkdnNyID0gMjsKLQl1MTYgc2NyID0gMDsKLQlib29sIGZyZXFfZm91bmQgPSBmYWxzZTsKLQl1MzIgcmF0ZTsKLQl1MzIgbWF4X3RjbGs7Ci0JdTMyIG1pbl90Y2xrOwotCi0JcmF0ZSA9IGNsa19nZXRfcmF0ZShwbDAyMi0+Y2xrKTsKLQkvKiBjcHNkdnNjciA9IDIgJiBzY3IgMCAqLwotCW1heF90Y2xrID0gKHJhdGUgLyAoQ1BTRFZSX01JTiAqICgxICsgU0NSX01JTikpKTsKLQkvKiBjcHNkdnNyID0gMjU0ICYgc2NyID0gMjU1ICovCi0JbWluX3RjbGsgPSAocmF0ZSAvIChDUFNEVlJfTUFYICogKDEgKyBTQ1JfTUFYKSkpOwotCi0JaWYgKChmcmVxIDw9IG1heF90Y2xrKSAmJiAoZnJlcSA+PSBtaW5fdGNsaykpIHsKLQkJd2hpbGUgKGNwc2R2c3IgPD0gQ1BTRFZSX01BWCAmJiAhZnJlcV9mb3VuZCkgewotCQkJd2hpbGUgKHNjciA8PSBTQ1JfTUFYICYmICFmcmVxX2ZvdW5kKSB7Ci0JCQkJaWYgKChyYXRlIC8KLQkJCQkgICAgIChjcHNkdnNyICogKDEgKyBzY3IpKSkgPiBmcmVxKQotCQkJCQlzY3IgKz0gMTsKLQkJCQllbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogVGhpcyBib29sIGlzIG1hZGUgdHJ1ZSB3aGVuCi0JCQkJCSAqIGVmZmVjdGl2ZSBmcmVxdWVuY3kgPj0KLQkJCQkJICogdGFyZ2V0IGZyZXF1ZW5jeSBpcyBmb3VuZAotCQkJCQkgKi8KLQkJCQkJZnJlcV9mb3VuZCA9IHRydWU7Ci0JCQkJCWlmICgocmF0ZSAvCi0JCQkJCSAgICAgKGNwc2R2c3IgKiAoMSArIHNjcikpKSAhPSBmcmVxKSB7Ci0JCQkJCQlpZiAoc2NyID09IFNDUl9NSU4pIHsKLQkJCQkJCQljcHNkdnNyIC09IDI7Ci0JCQkJCQkJc2NyID0gU0NSX01BWDsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCXNjciAtPSAxOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmcmVxX2ZvdW5kKSB7Ci0JCQkJY3BzZHZzciArPSAyOwotCQkJCXNjciA9IFNDUl9NSU47Ci0JCQl9Ci0JCX0KLQkJaWYgKGNwc2R2c3IgIT0gMCkgewotCQkJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwKLQkJCQkiU1NQIEVmZmVjdGl2ZSBGcmVxdWVuY3kgaXMgJXVcbiIsCi0JCQkJKHJhdGUgLyAoY3BzZHZzciAqICgxICsgc2NyKSkpKTsKLQkJCWNsa19mcmVxLT5jcHNkdnNyID0gKHU4KSAoY3BzZHZzciAmIDB4RkYpOwotCQkJY2xrX2ZyZXEtPnNjciA9ICh1OCkgKHNjciAmIDB4RkYpOwotCQkJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwKLQkJCQkiU1NQIGNwc2R2c3IgPSAlZCwgc2NyID0gJWRcbiIsCi0JCQkJY2xrX2ZyZXEtPmNwc2R2c3IsIGNsa19mcmVxLT5zY3IpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKLQkJCSJjb250cm9sbGVyIGRhdGEgaXMgaW5jb3JyZWN0OiBvdXQgb2YgcmFuZ2UgZnJlcXVlbmN5Iik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogQSBwaWVjZSBvZiBkZWZhdWx0IGNoaXAgaW5mbyB1bmxlc3MgdGhlIHBsYXRmb3JtCi0gKiBzdXBwbGllcyBpdC4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBwbDAyMl9jb25maWdfY2hpcCBwbDAyMl9kZWZhdWx0X2NoaXBfaW5mbyA9IHsKLQkuY29tX21vZGUgPSBQT0xMSU5HX1RSQU5TRkVSLAotCS5pZmFjZSA9IFNTUF9JTlRFUkZBQ0VfTU9UT1JPTEFfU1BJLAotCS5oaWVyYXJjaHkgPSBTU1BfU0xBVkUsCi0JLnNsYXZlX3R4X2Rpc2FibGUgPSBET19OT1RfRFJJVkVfVFgsCi0JLnJ4X2xldl90cmlnID0gU1NQX1JYXzFfT1JfTU9SRV9FTEVNLAotCS50eF9sZXZfdHJpZyA9IFNTUF9UWF8xX09SX01PUkVfRU1QVFlfTE9DLAotCS5jdHJsX2xlbiA9IFNTUF9CSVRTXzgsCi0JLndhaXRfc3RhdGUgPSBTU1BfTVdJUkVfV0FJVF9aRVJPLAotCS5kdXBsZXggPSBTU1BfTUlDUk9XSVJFX0NIQU5ORUxfRlVMTF9EVVBMRVgsCi0JLmNzX2NvbnRyb2wgPSBudWxsX2NzX2NvbnRyb2wsCi19OwotCi0KLS8qKgotICogcGwwMjJfc2V0dXAgLSBzZXR1cCBmdW5jdGlvbiByZWdpc3RlcmVkIHRvIFNQSSBtYXN0ZXIgZnJhbWV3b3JrCi0gKiBAc3BpOiBzcGkgZGV2aWNlIHdoaWNoIGlzIHJlcXVlc3Rpbmcgc2V0dXAKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgdG8gdGhlIFNQSSBmcmFtZXdvcmsgZm9yIHRoaXMgU1BJIG1hc3RlcgotICogY29udHJvbGxlci4gSWYgaXQgaXMgdGhlIGZpcnN0IHRpbWUgd2hlbiBzZXR1cCBpcyBjYWxsZWQgYnkgdGhpcyBkZXZpY2UsCi0gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSB0aGUgcnVudGltZSBzdGF0ZSBmb3IgdGhpcyBjaGlwIGFuZCBzYXZlCi0gKiB0aGUgc2FtZSBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gRWxzZSBpdCB3aWxsIHVwZGF0ZSB0aGUgcnVudGltZSBpbmZvCi0gKiB3aXRoIHRoZSB1cGRhdGVkIGNoaXAgaW5mby4gTm90aGluZyBpcyByZWFsbHkgYmVpbmcgd3JpdHRlbiB0byB0aGUKLSAqIGNvbnRyb2xsZXIgaGFyZHdhcmUgaGVyZSwgdGhhdCBpcyBub3QgZG9uZSB1bnRpbCB0aGUgYWN0dWFsIHRyYW5zZmVyCi0gKiBjb21tZW5jZS4KLSAqLwotc3RhdGljIGludCBwbDAyMl9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBwbDAyMl9jb25maWdfY2hpcCBjb25zdCAqY2hpcF9pbmZvOwotCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXA7Ci0Jc3RydWN0IHNzcF9jbG9ja19wYXJhbXMgY2xrX2ZyZXEgPSB7MCwgfTsKLQlpbnQgc3RhdHVzID0gMDsKLQlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JdW5zaWduZWQgaW50IGJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JdTMyIHRtcDsKLQotCWlmICghc3BpLT5tYXhfc3BlZWRfaHopCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogR2V0IGNvbnRyb2xsZXJfc3RhdGUgaWYgb25lIGlzIHN1cHBsaWVkICovCi0JY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwotCi0JaWYgKGNoaXAgPT0gTlVMTCkgewotCQljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoaXBfZGF0YSksIEdGUF9LRVJORUwpOwotCQlpZiAoIWNoaXApIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJCSJjYW5ub3QgYWxsb2NhdGUgY29udHJvbGxlciBzdGF0ZVxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlkZXZfZGJnKCZzcGktPmRldiwKLQkJCSJhbGxvY2F0ZWQgbWVtb3J5IGZvciBjb250cm9sbGVyJ3MgcnVudGltZSBzdGF0ZVxuIik7Ci0JfQotCi0JLyogR2V0IGNvbnRyb2xsZXIgZGF0YSBpZiBvbmUgaXMgc3VwcGxpZWQgKi8KLQljaGlwX2luZm8gPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKLQotCWlmIChjaGlwX2luZm8gPT0gTlVMTCkgewotCQljaGlwX2luZm8gPSAmcGwwMjJfZGVmYXVsdF9jaGlwX2luZm87Ci0JCS8qIHNwaV9ib2FyZF9pbmZvLmNvbnRyb2xsZXJfZGF0YSBub3QgaXMgc3VwcGxpZWQgKi8KLQkJZGV2X2RiZygmc3BpLT5kZXYsCi0JCQkidXNpbmcgZGVmYXVsdCBjb250cm9sbGVyX2RhdGEgc2V0dGluZ3NcbiIpOwotCX0gZWxzZQotCQlkZXZfZGJnKCZzcGktPmRldiwKLQkJCSJ1c2luZyB1c2VyIHN1cHBsaWVkIGNvbnRyb2xsZXJfZGF0YSBzZXR0aW5nc1xuIik7Ci0KLQkvKgotCSAqIFdlIGNhbiBvdmVycmlkZSB3aXRoIGN1c3RvbSBkaXZpc29ycywgZWxzZSB3ZSB1c2UgdGhlIGJvYXJkCi0JICogZnJlcXVlbmN5IHNldHRpbmcKLQkgKi8KLQlpZiAoKDAgPT0gY2hpcF9pbmZvLT5jbGtfZnJlcS5jcHNkdnNyKQotCSAgICAmJiAoMCA9PSBjaGlwX2luZm8tPmNsa19mcmVxLnNjcikpIHsKLQkJc3RhdHVzID0gY2FsY3VsYXRlX2VmZmVjdGl2ZV9mcmVxKHBsMDIyLAotCQkJCQkJICBzcGktPm1heF9zcGVlZF9oeiwKLQkJCQkJCSAgJmNsa19mcmVxKTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlnb3RvIGVycl9jb25maWdfcGFyYW1zOwotCX0gZWxzZSB7Ci0JCW1lbWNweSgmY2xrX2ZyZXEsICZjaGlwX2luZm8tPmNsa19mcmVxLCBzaXplb2YoY2xrX2ZyZXEpKTsKLQkJaWYgKChjbGtfZnJlcS5jcHNkdnNyICUgMikgIT0gMCkKLQkJCWNsa19mcmVxLmNwc2R2c3IgPQotCQkJCWNsa19mcmVxLmNwc2R2c3IgLSAxOwotCX0KLQlpZiAoKGNsa19mcmVxLmNwc2R2c3IgPCBDUFNEVlJfTUlOKQotCSAgICB8fCAoY2xrX2ZyZXEuY3BzZHZzciA+IENQU0RWUl9NQVgpKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJImNwc2R2c3IgaXMgY29uZmlndXJlZCBpbmNvcnJlY3RseVxuIik7Ci0JCWdvdG8gZXJyX2NvbmZpZ19wYXJhbXM7Ci0JfQotCi0KLQlzdGF0dXMgPSB2ZXJpZnlfY29udHJvbGxlcl9wYXJhbWV0ZXJzKHBsMDIyLCBjaGlwX2luZm8pOwotCWlmIChzdGF0dXMpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJjb250cm9sbGVyIGRhdGEgaXMgaW5jb3JyZWN0Iik7Ci0JCWdvdG8gZXJyX2NvbmZpZ19wYXJhbXM7Ci0JfQotCi0JLyogTm93IHNldCBjb250cm9sbGVyIHN0YXRlIGJhc2VkIG9uIGNvbnRyb2xsZXIgZGF0YSAqLwotCWNoaXAtPnhmZXJfdHlwZSA9IGNoaXBfaW5mby0+Y29tX21vZGU7Ci0JaWYgKCFjaGlwX2luZm8tPmNzX2NvbnRyb2wpIHsKLQkJY2hpcC0+Y3NfY29udHJvbCA9IG51bGxfY3NfY29udHJvbDsKLQkJZGV2X3dhcm4oJnNwaS0+ZGV2LAotCQkJICJjaGlwIHNlbGVjdCBmdW5jdGlvbiBpcyBOVUxMIGZvciB0aGlzIGNoaXBcbiIpOwotCX0gZWxzZQotCQljaGlwLT5jc19jb250cm9sID0gY2hpcF9pbmZvLT5jc19jb250cm9sOwotCi0JaWYgKGJpdHMgPD0gMykgewotCQkvKiBQTDAyMiBkb2Vzbid0IHN1cHBvcnQgbGVzcyB0aGFuIDQtYml0cyAqLwotCQlzdGF0dXMgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gZXJyX2NvbmZpZ19wYXJhbXM7Ci0JfSBlbHNlIGlmIChiaXRzIDw9IDgpIHsKLQkJZGV2X2RiZygmc3BpLT5kZXYsICI0IDw9IG4gPD04IGJpdHMgcGVyIHdvcmRcbiIpOwotCQljaGlwLT5uX2J5dGVzID0gMTsKLQkJY2hpcC0+cmVhZCA9IFJFQURJTkdfVTg7Ci0JCWNoaXAtPndyaXRlID0gV1JJVElOR19VODsKLQl9IGVsc2UgaWYgKGJpdHMgPD0gMTYpIHsKLQkJZGV2X2RiZygmc3BpLT5kZXYsICI5IDw9IG4gPD0gMTYgYml0cyBwZXIgd29yZFxuIik7Ci0JCWNoaXAtPm5fYnl0ZXMgPSAyOwotCQljaGlwLT5yZWFkID0gUkVBRElOR19VMTY7Ci0JCWNoaXAtPndyaXRlID0gV1JJVElOR19VMTY7Ci0JfSBlbHNlIHsKLQkJaWYgKHBsMDIyLT52ZW5kb3ItPm1heF9icHcgPj0gMzIpIHsKLQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiMTcgPD0gbiA8PSAzMiBiaXRzIHBlciB3b3JkXG4iKTsKLQkJCWNoaXAtPm5fYnl0ZXMgPSA0OwotCQkJY2hpcC0+cmVhZCA9IFJFQURJTkdfVTMyOwotCQkJY2hpcC0+d3JpdGUgPSBXUklUSU5HX1UzMjsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJCSJpbGxlZ2FsIGRhdGEgc2l6ZSBmb3IgdGhpcyBjb250cm9sbGVyIVxuIik7Ci0JCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCQkiYSBzdGFuZGFyZCBwbDAyMiBjYW4gb25seSBoYW5kbGUgIgotCQkJCSIxIDw9IG4gPD0gMTYgYml0IHdvcmRzXG4iKTsKLQkJCXN0YXR1cyA9IC1FTk9UU1VQUDsKLQkJCWdvdG8gZXJyX2NvbmZpZ19wYXJhbXM7Ci0JCX0KLQl9Ci0KLQkvKiBOb3cgSW5pdGlhbGl6ZSBhbGwgcmVnaXN0ZXIgc2V0dGluZ3MgcmVxdWlyZWQgZm9yIHRoaXMgY2hpcCAqLwotCWNoaXAtPmNyMCA9IDA7Ci0JY2hpcC0+Y3IxID0gMDsKLQljaGlwLT5kbWFjciA9IDA7Ci0JY2hpcC0+Y3BzciA9IDA7Ci0JaWYgKChjaGlwX2luZm8tPmNvbV9tb2RlID09IERNQV9UUkFOU0ZFUikKLQkgICAgJiYgKChwbDAyMi0+bWFzdGVyX2luZm8pLT5lbmFibGVfZG1hKSkgewotCQljaGlwLT5lbmFibGVfZG1hID0gdHJ1ZTsKLQkJZGV2X2RiZygmc3BpLT5kZXYsICJETUEgbW9kZSBzZXQgaW4gY29udHJvbGxlciBzdGF0ZVxuIik7Ci0JCVNTUF9XUklURV9CSVRTKGNoaXAtPmRtYWNyLCBTU1BfRE1BX0VOQUJMRUQsCi0JCQkgICAgICAgU1NQX0RNQUNSX01BU0tfUlhETUFFLCAwKTsKLQkJU1NQX1dSSVRFX0JJVFMoY2hpcC0+ZG1hY3IsIFNTUF9ETUFfRU5BQkxFRCwKLQkJCSAgICAgICBTU1BfRE1BQ1JfTUFTS19UWERNQUUsIDEpOwotCX0gZWxzZSB7Ci0JCWNoaXAtPmVuYWJsZV9kbWEgPSBmYWxzZTsKLQkJZGV2X2RiZygmc3BpLT5kZXYsICJETUEgbW9kZSBOT1Qgc2V0IGluIGNvbnRyb2xsZXIgc3RhdGVcbiIpOwotCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5kbWFjciwgU1NQX0RNQV9ESVNBQkxFRCwKLQkJCSAgICAgICBTU1BfRE1BQ1JfTUFTS19SWERNQUUsIDApOwotCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5kbWFjciwgU1NQX0RNQV9ESVNBQkxFRCwKLQkJCSAgICAgICBTU1BfRE1BQ1JfTUFTS19UWERNQUUsIDEpOwotCX0KLQotCWNoaXAtPmNwc3IgPSBjbGtfZnJlcS5jcHNkdnNyOwotCi0JLyogU3BlY2lhbCBzZXR1cCBmb3IgdGhlIFNUIG1pY3JvIGV4dGVuZGVkIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0JaWYgKHBsMDIyLT52ZW5kb3ItPmV4dGVuZGVkX2NyKSB7Ci0JCXUzMiBldHg7Ci0KLQkJaWYgKHBsMDIyLT52ZW5kb3ItPnBsMDIzKSB7Ci0JCQkvKiBUaGVzZSBiaXRzIGFyZSBvbmx5IGluIHRoZSBQTDAyMyAqLwotCQkJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCBjaGlwX2luZm8tPmNsa2RlbGF5LAotCQkJCSAgICAgICBTU1BfQ1IxX01BU0tfRkJDTEtERUxfU1QsIDEzKTsKLQkJfSBlbHNlIHsKLQkJCS8qIFRoZXNlIGJpdHMgYXJlIGluIHRoZSBQTDAyMiBidXQgbm90IFBMMDIzICovCi0JCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjAsIGNoaXBfaW5mby0+ZHVwbGV4LAotCQkJCSAgICAgICBTU1BfQ1IwX01BU0tfSEFMRkRVUF9TVCwgNSk7Ci0JCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjAsIGNoaXBfaW5mby0+Y3RybF9sZW4sCi0JCQkJICAgICAgIFNTUF9DUjBfTUFTS19DU1NfU1QsIDE2KTsKLQkJCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMCwgY2hpcF9pbmZvLT5pZmFjZSwKLQkJCQkgICAgICAgU1NQX0NSMF9NQVNLX0ZSRl9TVCwgMjEpOwotCQkJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCBjaGlwX2luZm8tPndhaXRfc3RhdGUsCi0JCQkJICAgICAgIFNTUF9DUjFfTUFTS19NV0FJVF9TVCwgNik7Ci0JCX0KLQkJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IwLCBiaXRzIC0gMSwKLQkJCSAgICAgICBTU1BfQ1IwX01BU0tfRFNTX1NULCAwKTsKLQotCQlpZiAoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkgewotCQkJdG1wID0gU1NQX1JYX0xTQjsKLQkJCWV0eCA9IFNTUF9UWF9MU0I7Ci0JCX0gZWxzZSB7Ci0JCQl0bXAgPSBTU1BfUlhfTVNCOwotCQkJZXR4ID0gU1NQX1RYX01TQjsKLQkJfQotCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjEsIHRtcCwgU1NQX0NSMV9NQVNLX1JFTkROX1NULCA0KTsKLQkJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCBldHgsIFNTUF9DUjFfTUFTS19URU5ETl9TVCwgNSk7Ci0JCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMSwgY2hpcF9pbmZvLT5yeF9sZXZfdHJpZywKLQkJCSAgICAgICBTU1BfQ1IxX01BU0tfUlhJRkxTRUxfU1QsIDcpOwotCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjEsIGNoaXBfaW5mby0+dHhfbGV2X3RyaWcsCi0JCQkgICAgICAgU1NQX0NSMV9NQVNLX1RYSUZMU0VMX1NULCAxMCk7Ci0JfSBlbHNlIHsKLQkJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IwLCBiaXRzIC0gMSwKLQkJCSAgICAgICBTU1BfQ1IwX01BU0tfRFNTLCAwKTsKLQkJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IwLCBjaGlwX2luZm8tPmlmYWNlLAotCQkJICAgICAgIFNTUF9DUjBfTUFTS19GUkYsIDQpOwotCX0KLQotCS8qIFN0dWZmIHRoYXQgaXMgY29tbW9uIGZvciBhbGwgdmVyc2lvbnMgKi8KLQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCi0JCXRtcCA9IFNTUF9DTEtfUE9MX0lETEVfSElHSDsKLQllbHNlCi0JCXRtcCA9IFNTUF9DTEtfUE9MX0lETEVfTE9XOwotCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMCwgdG1wLCBTU1BfQ1IwX01BU0tfU1BPLCA2KTsKLQotCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKLQkJdG1wID0gU1NQX0NMS19TRUNPTkRfRURHRTsKLQllbHNlCi0JCXRtcCA9IFNTUF9DTEtfRklSU1RfRURHRTsKLQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjAsIHRtcCwgU1NQX0NSMF9NQVNLX1NQSCwgNyk7Ci0KLQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjAsIGNsa19mcmVxLnNjciwgU1NQX0NSMF9NQVNLX1NDUiwgOCk7Ci0JLyogTG9vcGJhY2sgaXMgYXZhaWxhYmxlIG9uIGFsbCB2ZXJzaW9ucyBleGNlcHQgUEwwMjMgKi8KLQlpZiAocGwwMjItPnZlbmRvci0+bG9vcGJhY2spIHsKLQkJaWYgKHNwaS0+bW9kZSAmIFNQSV9MT09QKQotCQkJdG1wID0gTE9PUEJBQ0tfRU5BQkxFRDsKLQkJZWxzZQotCQkJdG1wID0gTE9PUEJBQ0tfRElTQUJMRUQ7Ci0JCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMSwgdG1wLCBTU1BfQ1IxX01BU0tfTEJNLCAwKTsKLQl9Ci0JU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCBTU1BfRElTQUJMRUQsIFNTUF9DUjFfTUFTS19TU0UsIDEpOwotCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMSwgY2hpcF9pbmZvLT5oaWVyYXJjaHksIFNTUF9DUjFfTUFTS19NUywgMik7Ci0JU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCBjaGlwX2luZm8tPnNsYXZlX3R4X2Rpc2FibGUsIFNTUF9DUjFfTUFTS19TT0QsIDMpOwotCi0JLyogU2F2ZSBjb250cm9sbGVyX3N0YXRlICovCi0Jc3BpX3NldF9jdGxkYXRhKHNwaSwgY2hpcCk7Ci0JcmV0dXJuIHN0YXR1czsKLSBlcnJfY29uZmlnX3BhcmFtczoKLQlzcGlfc2V0X2N0bGRhdGEoc3BpLCBOVUxMKTsKLQlrZnJlZShjaGlwKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKioKLSAqIHBsMDIyX2NsZWFudXAgLSBjbGVhbnVwIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgdG8gU1BJIG1hc3RlciBmcmFtZXdvcmsKLSAqIEBzcGk6IHNwaSBkZXZpY2Ugd2hpY2ggaXMgcmVxdWVzdGluZyBjbGVhbnVwCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHRvIHRoZSBTUEkgZnJhbWV3b3JrIGZvciB0aGlzIFNQSSBtYXN0ZXIKLSAqIGNvbnRyb2xsZXIuIEl0IHdpbGwgZnJlZSB0aGUgcnVudGltZSBzdGF0ZSBvZiBjaGlwLgotICovCi1zdGF0aWMgdm9pZCBwbDAyMl9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwotCi0Jc3BpX3NldF9jdGxkYXRhKHNwaSwgTlVMTCk7Ci0Ja2ZyZWUoY2hpcCk7Ci19Ci0KLQotc3RhdGljIGludCBfX2RldmluaXQKLXBsMDIyX3Byb2JlKHN0cnVjdCBhbWJhX2RldmljZSAqYWRldiwgY29uc3Qgc3RydWN0IGFtYmFfaWQgKmlkKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGV2LT5kZXY7Ci0Jc3RydWN0IHBsMDIyX3NzcF9jb250cm9sbGVyICpwbGF0Zm9ybV9pbmZvID0gYWRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKLQlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gTlVMTDsJLypEYXRhIGZvciB0aGlzIGRyaXZlciAqLwotCWludCBzdGF0dXMgPSAwOwotCi0JZGV2X2luZm8oJmFkZXYtPmRldiwKLQkJICJBUk0gUEwwMjIgZHJpdmVyLCBkZXZpY2UgSUQ6IDB4JTA4eFxuIiwgYWRldi0+cGVyaXBoaWQpOwotCWlmIChwbGF0Zm9ybV9pbmZvID09IE5VTEwpIHsKLQkJZGV2X2VycigmYWRldi0+ZGV2LCAicHJvYmUgLSBubyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKLQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJZ290byBlcnJfbm9fcGRhdGE7Ci0JfQotCi0JLyogQWxsb2NhdGUgbWFzdGVyIHdpdGggc3BhY2UgZm9yIGRhdGEgKi8KLQltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKGRldiwgc2l6ZW9mKHN0cnVjdCBwbDAyMikpOwotCWlmIChtYXN0ZXIgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJwcm9iZSAtIGNhbm5vdCBhbGxvYyBTUEkgbWFzdGVyXG4iKTsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBlcnJfbm9fbWFzdGVyOwotCX0KLQotCXBsMDIyID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXBsMDIyLT5tYXN0ZXIgPSBtYXN0ZXI7Ci0JcGwwMjItPm1hc3Rlcl9pbmZvID0gcGxhdGZvcm1faW5mbzsKLQlwbDAyMi0+YWRldiA9IGFkZXY7Ci0JcGwwMjItPnZlbmRvciA9IGlkLT5kYXRhOwotCi0JLyoKLQkgKiBCdXMgTnVtYmVyIFdoaWNoIGhhcyBiZWVuIEFzc2lnbmVkIHRvIHRoaXMgU1NQIGNvbnRyb2xsZXIKLQkgKiBvbiB0aGlzIGJvYXJkCi0JICovCi0JbWFzdGVyLT5idXNfbnVtID0gcGxhdGZvcm1faW5mby0+YnVzX2lkOwotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBwbGF0Zm9ybV9pbmZvLT5udW1fY2hpcHNlbGVjdDsKLQltYXN0ZXItPmNsZWFudXAgPSBwbDAyMl9jbGVhbnVwOwotCW1hc3Rlci0+c2V0dXAgPSBwbDAyMl9zZXR1cDsKLQltYXN0ZXItPnRyYW5zZmVyID0gcGwwMjJfdHJhbnNmZXI7Ci0KLQkvKgotCSAqIFN1cHBvcnRzIG1vZGUgMC0zLCBsb29wYmFjaywgYW5kIGFjdGl2ZSBsb3cgQ1MuIFRyYW5zZmVycyBhcmUKLQkgKiBhbHdheXMgTVMgYml0IGZpcnN0IG9uIHRoZSBvcmlnaW5hbCBwbDAyMi4KLQkgKi8KLQltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCB8IFNQSV9MT09QOwotCWlmIChwbDAyMi0+dmVuZG9yLT5leHRlbmRlZF9jcikKLQkJbWFzdGVyLT5tb2RlX2JpdHMgfD0gU1BJX0xTQl9GSVJTVDsKLQotCWRldl9kYmcoJmFkZXYtPmRldiwgIkJVU05POiAlZFxuIiwgbWFzdGVyLT5idXNfbnVtKTsKLQotCXN0YXR1cyA9IGFtYmFfcmVxdWVzdF9yZWdpb25zKGFkZXYsIE5VTEwpOwotCWlmIChzdGF0dXMpCi0JCWdvdG8gZXJyX25vX2lvcmVnaW9uOwotCi0JcGwwMjItPnBoeWJhc2UgPSBhZGV2LT5yZXMuc3RhcnQ7Ci0JcGwwMjItPnZpcnRiYXNlID0gaW9yZW1hcChhZGV2LT5yZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJmFkZXYtPnJlcykpOwotCWlmIChwbDAyMi0+dmlydGJhc2UgPT0gTlVMTCkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9ub19pb3JlbWFwOwotCX0KLQlwcmludGsoS0VSTl9JTkZPICJwbDAyMjogbWFwcGVkIHJlZ2lzdGVycyBmcm9tIDB4JTA4eCB0byAlcFxuIiwKLQkgICAgICAgYWRldi0+cmVzLnN0YXJ0LCBwbDAyMi0+dmlydGJhc2UpOwotCi0JcGwwMjItPmNsayA9IGNsa19nZXQoJmFkZXYtPmRldiwgTlVMTCk7Ci0JaWYgKElTX0VSUihwbDAyMi0+Y2xrKSkgewotCQlzdGF0dXMgPSBQVFJfRVJSKHBsMDIyLT5jbGspOwotCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJjb3VsZCBub3QgcmV0cmlldmUgU1NQL1NQSSBidXMgY2xvY2tcbiIpOwotCQlnb3RvIGVycl9ub19jbGs7Ci0JfQotCi0JLyogRGlzYWJsZSBTU1AgKi8KLQl3cml0ZXcoKHJlYWR3KFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSkgJiAoflNTUF9DUjFfTUFTS19TU0UpKSwKLQkgICAgICAgU1NQX0NSMShwbDAyMi0+dmlydGJhc2UpKTsKLQlsb2FkX3NzcF9kZWZhdWx0X2NvbmZpZyhwbDAyMik7Ci0KLQlzdGF0dXMgPSByZXF1ZXN0X2lycShhZGV2LT5pcnFbMF0sIHBsMDIyX2ludGVycnVwdF9oYW5kbGVyLCAwLCAicGwwMjIiLAotCQkJICAgICBwbDAyMik7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2VycigmYWRldi0+ZGV2LCAicHJvYmUgLSBjYW5ub3QgZ2V0IElSUSAoJWQpXG4iLCBzdGF0dXMpOwotCQlnb3RvIGVycl9ub19pcnE7Ci0JfQotCi0JLyogR2V0IERNQSBjaGFubmVscyAqLwotCWlmIChwbGF0Zm9ybV9pbmZvLT5lbmFibGVfZG1hKSB7Ci0JCXN0YXR1cyA9IHBsMDIyX2RtYV9wcm9iZShwbDAyMik7Ci0JCWlmIChzdGF0dXMgIT0gMCkKLQkJCXBsYXRmb3JtX2luZm8tPmVuYWJsZV9kbWEgPSAwOwotCX0KLQotCS8qIEluaXRpYWxpemUgYW5kIHN0YXJ0IHF1ZXVlICovCi0Jc3RhdHVzID0gaW5pdF9xdWV1ZShwbDAyMik7Ci0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWRldl9lcnIoJmFkZXYtPmRldiwgInByb2JlIC0gcHJvYmxlbSBpbml0aWFsaXppbmcgcXVldWVcbiIpOwotCQlnb3RvIGVycl9pbml0X3F1ZXVlOwotCX0KLQlzdGF0dXMgPSBzdGFydF9xdWV1ZShwbDAyMik7Ci0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWRldl9lcnIoJmFkZXYtPmRldiwgInByb2JlIC0gcHJvYmxlbSBzdGFydGluZyBxdWV1ZVxuIik7Ci0JCWdvdG8gZXJyX3N0YXJ0X3F1ZXVlOwotCX0KLQkvKiBSZWdpc3RlciB3aXRoIHRoZSBTUEkgZnJhbWV3b3JrICovCi0JYW1iYV9zZXRfZHJ2ZGF0YShhZGV2LCBwbDAyMik7Ci0Jc3RhdHVzID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlkZXZfZXJyKCZhZGV2LT5kZXYsCi0JCQkicHJvYmUgLSBwcm9ibGVtIHJlZ2lzdGVyaW5nIHNwaSBtYXN0ZXJcbiIpOwotCQlnb3RvIGVycl9zcGlfcmVnaXN0ZXI7Ci0JfQotCWRldl9kYmcoZGV2LCAicHJvYmUgc3VjY2VlZGVkXG4iKTsKLQkvKgotCSAqIERpc2FibGUgdGhlIHNpbGljb24gYmxvY2sgcGNsayBhbmQgYW55IHZvbHRhZ2UgZG9tYWluIGFuZCBqdXN0Ci0JICogcG93ZXIgaXQgdXAgYW5kIGNsb2NrIGl0IHdoZW4gaXQncyBuZWVkZWQKLQkgKi8KLQlhbWJhX3BjbGtfZGlzYWJsZShhZGV2KTsKLQlhbWJhX3Zjb3JlX2Rpc2FibGUoYWRldik7Ci0JcmV0dXJuIDA7Ci0KLSBlcnJfc3BpX3JlZ2lzdGVyOgotIGVycl9zdGFydF9xdWV1ZToKLSBlcnJfaW5pdF9xdWV1ZToKLQlkZXN0cm95X3F1ZXVlKHBsMDIyKTsKLQlwbDAyMl9kbWFfcmVtb3ZlKHBsMDIyKTsKLQlmcmVlX2lycShhZGV2LT5pcnFbMF0sIHBsMDIyKTsKLSBlcnJfbm9faXJxOgotCWNsa19wdXQocGwwMjItPmNsayk7Ci0gZXJyX25vX2NsazoKLQlpb3VubWFwKHBsMDIyLT52aXJ0YmFzZSk7Ci0gZXJyX25vX2lvcmVtYXA6Ci0JYW1iYV9yZWxlYXNlX3JlZ2lvbnMoYWRldik7Ci0gZXJyX25vX2lvcmVnaW9uOgotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0gZXJyX25vX21hc3RlcjoKLSBlcnJfbm9fcGRhdGE6Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQKLXBsMDIyX3JlbW92ZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IHBsMDIyICpwbDAyMiA9IGFtYmFfZ2V0X2RydmRhdGEoYWRldik7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JaWYgKCFwbDAyMikKLQkJcmV0dXJuIDA7Ci0KLQkvKiBSZW1vdmUgdGhlIHF1ZXVlICovCi0Jc3RhdHVzID0gZGVzdHJveV9xdWV1ZShwbDAyMik7Ci0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWRldl9lcnIoJmFkZXYtPmRldiwKLQkJCSJxdWV1ZSByZW1vdmUgZmFpbGVkICglZClcbiIsIHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCWxvYWRfc3NwX2RlZmF1bHRfY29uZmlnKHBsMDIyKTsKLQlwbDAyMl9kbWFfcmVtb3ZlKHBsMDIyKTsKLQlmcmVlX2lycShhZGV2LT5pcnFbMF0sIHBsMDIyKTsKLQljbGtfZGlzYWJsZShwbDAyMi0+Y2xrKTsKLQljbGtfcHV0KHBsMDIyLT5jbGspOwotCWlvdW5tYXAocGwwMjItPnZpcnRiYXNlKTsKLQlhbWJhX3JlbGVhc2VfcmVnaW9ucyhhZGV2KTsKLQl0YXNrbGV0X2Rpc2FibGUoJnBsMDIyLT5wdW1wX3RyYW5zZmVycyk7Ci0Jc3BpX3VucmVnaXN0ZXJfbWFzdGVyKHBsMDIyLT5tYXN0ZXIpOwotCXNwaV9tYXN0ZXJfcHV0KHBsMDIyLT5tYXN0ZXIpOwotCWFtYmFfc2V0X2RydmRhdGEoYWRldiwgTlVMTCk7Ci0JZGV2X2RiZygmYWRldi0+ZGV2LCAicmVtb3ZlIHN1Y2NlZWRlZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgcGwwMjJfc3VzcGVuZChzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gYW1iYV9nZXRfZHJ2ZGF0YShhZGV2KTsKLQlpbnQgc3RhdHVzID0gMDsKLQotCXN0YXR1cyA9IHN0b3BfcXVldWUocGwwMjIpOwotCWlmIChzdGF0dXMpIHsKLQkJZGV2X3dhcm4oJmFkZXYtPmRldiwgInN1c3BlbmQgY2Fubm90IHN0b3AgcXVldWVcbiIpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCWFtYmFfdmNvcmVfZW5hYmxlKGFkZXYpOwotCWFtYmFfcGNsa19lbmFibGUoYWRldik7Ci0JbG9hZF9zc3BfZGVmYXVsdF9jb25maWcocGwwMjIpOwotCWFtYmFfcGNsa19kaXNhYmxlKGFkZXYpOwotCWFtYmFfdmNvcmVfZGlzYWJsZShhZGV2KTsKLQlkZXZfZGJnKCZhZGV2LT5kZXYsICJzdXNwZW5kZWRcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBsMDIyX3Jlc3VtZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IHBsMDIyICpwbDAyMiA9IGFtYmFfZ2V0X2RydmRhdGEoYWRldik7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQkvKiBTdGFydCB0aGUgcXVldWUgcnVubmluZyAqLwotCXN0YXR1cyA9IHN0YXJ0X3F1ZXVlKHBsMDIyKTsKLQlpZiAoc3RhdHVzKQotCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJwcm9ibGVtIHN0YXJ0aW5nIHF1ZXVlICglZClcbiIsIHN0YXR1cyk7Ci0JZWxzZQotCQlkZXZfZGJnKCZhZGV2LT5kZXYsICJyZXN1bWVkXG4iKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0jZWxzZQotI2RlZmluZSBwbDAyMl9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgcGwwMjJfcmVzdW1lIE5VTEwKLSNlbmRpZgkvKiBDT05GSUdfUE0gKi8KLQotc3RhdGljIHN0cnVjdCB2ZW5kb3JfZGF0YSB2ZW5kb3JfYXJtID0gewotCS5maWZvZGVwdGggPSA4LAotCS5tYXhfYnB3ID0gMTYsCi0JLnVuaWRpciA9IGZhbHNlLAotCS5leHRlbmRlZF9jciA9IGZhbHNlLAotCS5wbDAyMyA9IGZhbHNlLAotCS5sb29wYmFjayA9IHRydWUsCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX3N0ID0gewotCS5maWZvZGVwdGggPSAzMiwKLQkubWF4X2JwdyA9IDMyLAotCS51bmlkaXIgPSBmYWxzZSwKLQkuZXh0ZW5kZWRfY3IgPSB0cnVlLAotCS5wbDAyMyA9IGZhbHNlLAotCS5sb29wYmFjayA9IHRydWUsCi19OwotCi1zdGF0aWMgc3RydWN0IHZlbmRvcl9kYXRhIHZlbmRvcl9zdF9wbDAyMyA9IHsKLQkuZmlmb2RlcHRoID0gMzIsCi0JLm1heF9icHcgPSAzMiwKLQkudW5pZGlyID0gZmFsc2UsCi0JLmV4dGVuZGVkX2NyID0gdHJ1ZSwKLQkucGwwMjMgPSB0cnVlLAotCS5sb29wYmFjayA9IGZhbHNlLAotfTsKLQotc3RhdGljIHN0cnVjdCB2ZW5kb3JfZGF0YSB2ZW5kb3JfZGI1NTAwX3BsMDIzID0gewotCS5maWZvZGVwdGggPSAzMiwKLQkubWF4X2JwdyA9IDMyLAotCS51bmlkaXIgPSBmYWxzZSwKLQkuZXh0ZW5kZWRfY3IgPSB0cnVlLAotCS5wbDAyMyA9IHRydWUsCi0JLmxvb3BiYWNrID0gdHJ1ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYW1iYV9pZCBwbDAyMl9pZHNbXSA9IHsKLQl7Ci0JCS8qCi0JCSAqIEFSTSBQTDAyMiB2YXJpYW50LCB0aGlzIGhhcyBhIDE2Yml0IHdpZGUKLQkJICogYW5kIDggbG9jYXRpb25zIGRlZXAgVFgvUlggRklGTwotCQkgKi8KLQkJLmlkCT0gMHgwMDA0MTAyMiwKLQkJLm1hc2sJPSAweDAwMGZmZmZmLAotCQkuZGF0YQk9ICZ2ZW5kb3JfYXJtLAotCX0sCi0JewotCQkvKgotCQkgKiBTVCBNaWNybyBkZXJpdmF0aXZlLCB0aGlzIGhhcyAzMmJpdCB3aWRlCi0JCSAqIGFuZCAzMiBsb2NhdGlvbnMgZGVlcCBUWC9SWCBGSUZPCi0JCSAqLwotCQkuaWQJPSAweDAxMDgwMDIyLAotCQkubWFzawk9IDB4ZmZmZmZmZmYsCi0JCS5kYXRhCT0gJnZlbmRvcl9zdCwKLQl9LAotCXsKLQkJLyoKLQkJICogU1QtRXJpY3Nzb24gZGVyaXZhdGl2ZSAiUEwwMjMiICh0aGlzIGlzIG5vdAotCQkgKiBhbiBvZmZpY2lhbCBBUk0gbnVtYmVyKSwgdGhpcyBpcyBhIFBMMDIyIFNTUCBibG9jawotCQkgKiBzdHJpcHBlZCB0byBTUEkgbW9kZSBvbmx5LCBpdCBoYXMgMzJiaXQgd2lkZQotCQkgKiBhbmQgMzIgbG9jYXRpb25zIGRlZXAgVFgvUlggRklGTyBidXQgbm8gZXh0ZW5kZWQKLQkJICogQ1IwL0NSMSByZWdpc3RlcgotCQkgKi8KLQkJLmlkICAgICA9IDB4MDAwODAwMjMsCi0JCS5tYXNrICAgPSAweGZmZmZmZmZmLAotCQkuZGF0YSAgID0gJnZlbmRvcl9zdF9wbDAyMywKLQl9LAotCXsKLQkJLmlkCT0gMHgxMDA4MDAyMywKLQkJLm1hc2sJPSAweGZmZmZmZmZmLAotCQkuZGF0YQk9ICZ2ZW5kb3JfZGI1NTAwX3BsMDIzLAotCX0sCi0JeyAwLCAwIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFtYmFfZHJpdmVyIHBsMDIyX2RyaXZlciA9IHsKLQkuZHJ2ID0gewotCQkubmFtZQk9ICJzc3AtcGwwMjIiLAotCX0sCi0JLmlkX3RhYmxlCT0gcGwwMjJfaWRzLAotCS5wcm9iZQkJPSBwbDAyMl9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHBsMDIyX3JlbW92ZSksCi0JLnN1c3BlbmQgICAgICAgID0gcGwwMjJfc3VzcGVuZCwKLQkucmVzdW1lICAgICAgICAgPSBwbDAyMl9yZXN1bWUsCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IHBsMDIyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gYW1iYV9kcml2ZXJfcmVnaXN0ZXIoJnBsMDIyX2RyaXZlcik7Ci19Ci0KLXN1YnN5c19pbml0Y2FsbChwbDAyMl9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHBsMDIyX2V4aXQodm9pZCkKLXsKLQlhbWJhX2RyaXZlcl91bnJlZ2lzdGVyKCZwbDAyMl9kcml2ZXIpOwotfQotCi1tb2R1bGVfZXhpdChwbDAyMl9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUEwwMjIgU1NQIENvbnRyb2xsZXIgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9hdGg3OV9zcGkuYyBiL2RyaXZlcnMvc3BpL2F0aDc5X3NwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2ZmODEwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3BpL2F0aDc5X3NwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qCi0gKiBTUEkgY29udHJvbGxlciBkcml2ZXIgZm9yIHRoZSBBdGhlcm9zIEFSNzFYWC9BUjcyNFgvQVI5MTNYIFNvQ3MKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBHYWJvciBKdWhvcyA8anVob3NnQG9wZW53cnQub3JnPgotICoKLSAqIFRoaXMgZHJpdmVyIGhhcyBiZWVuIGJhc2VkIG9uIHRoZSBzcGktZ3Bpby5jOgotICoJQ29weXJpZ2h0IChDKSAyMDA2LDIwMDggRGF2aWQgQnJvd25lbGwKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdGg3OS9hcjcxeHhfcmVncy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLWF0aDc5L2F0aDc5X3NwaV9wbGF0Zm9ybS5oPgotCi0jZGVmaW5lIERSVl9OQU1FCSJhdGg3OS1zcGkiCi0KLXN0cnVjdCBhdGg3OV9zcGkgewotCXN0cnVjdCBzcGlfYml0YmFuZwliaXRiYW5nOwotCXUzMgkJCWlvY19iYXNlOwotCXUzMgkJCXJlZ19jdHJsOwotCXZvaWQgX19pb21lbQkJKmJhc2U7Ci19OwotCi1zdGF0aWMgaW5saW5lIHUzMiBhdGg3OV9zcGlfcnIoc3RydWN0IGF0aDc5X3NwaSAqc3AsIHVuc2lnbmVkIHJlZykKLXsKLQlyZXR1cm4gaW9yZWFkMzIoc3AtPmJhc2UgKyByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRoNzlfc3BpX3dyKHN0cnVjdCBhdGg3OV9zcGkgKnNwLCB1bnNpZ25lZCByZWcsIHUzMiB2YWwpCi17Ci0JaW93cml0ZTMyKHZhbCwgc3AtPmJhc2UgKyByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBhdGg3OV9zcGkgKmF0aDc5X3NwaWRldl90b19zcChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXJldHVybiBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgYXRoNzlfc3BpX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX2FjdGl2ZSkKLXsKLQlzdHJ1Y3QgYXRoNzlfc3BpICpzcCA9IGF0aDc5X3NwaWRldl90b19zcChzcGkpOwotCWludCBjc19oaWdoID0gKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSA/IGlzX2FjdGl2ZSA6ICFpc19hY3RpdmU7Ci0KLQlpZiAoaXNfYWN0aXZlKSB7Ci0JCS8qIHNldCBpbml0aWFsIGNsb2NrIHBvbGFyaXR5ICovCi0JCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKLQkJCXNwLT5pb2NfYmFzZSB8PSBBUjcxWFhfU1BJX0lPQ19DTEs7Ci0JCWVsc2UKLQkJCXNwLT5pb2NfYmFzZSAmPSB+QVI3MVhYX1NQSV9JT0NfQ0xLOwotCi0JCWF0aDc5X3NwaV93cihzcCwgQVI3MVhYX1NQSV9SRUdfSU9DLCBzcC0+aW9jX2Jhc2UpOwotCX0KLQotCWlmIChzcGktPmNoaXBfc2VsZWN0KSB7Ci0JCXN0cnVjdCBhdGg3OV9zcGlfY29udHJvbGxlcl9kYXRhICpjZGF0YSA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOwotCi0JCS8qIFNQSSBpcyBub3JtYWxseSBhY3RpdmUtbG93ICovCi0JCWdwaW9fc2V0X3ZhbHVlKGNkYXRhLT5ncGlvLCBjc19oaWdoKTsKLQl9IGVsc2UgewotCQlpZiAoY3NfaGlnaCkKLQkJCXNwLT5pb2NfYmFzZSB8PSBBUjcxWFhfU1BJX0lPQ19DUzA7Ci0JCWVsc2UKLQkJCXNwLT5pb2NfYmFzZSAmPSB+QVI3MVhYX1NQSV9JT0NfQ1MwOwotCi0JCWF0aDc5X3NwaV93cihzcCwgQVI3MVhYX1NQSV9SRUdfSU9DLCBzcC0+aW9jX2Jhc2UpOwotCX0KLQotfQotCi1zdGF0aWMgaW50IGF0aDc5X3NwaV9zZXR1cF9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBhdGg3OV9zcGkgKnNwID0gYXRoNzlfc3BpZGV2X3RvX3NwKHNwaSk7Ci0Jc3RydWN0IGF0aDc5X3NwaV9jb250cm9sbGVyX2RhdGEgKmNkYXRhOwotCi0JY2RhdGEgPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKLQlpZiAoc3BpLT5jaGlwX3NlbGVjdCAmJiAhY2RhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogZW5hYmxlIEdQSU8gbW9kZSAqLwotCWF0aDc5X3NwaV93cihzcCwgQVI3MVhYX1NQSV9SRUdfRlMsIEFSNzFYWF9TUElfRlNfR1BJTyk7Ci0KLQkvKiBzYXZlIENUUkwgcmVnaXN0ZXIgKi8KLQlzcC0+cmVnX2N0cmwgPSBhdGg3OV9zcGlfcnIoc3AsIEFSNzFYWF9TUElfUkVHX0NUUkwpOwotCXNwLT5pb2NfYmFzZSA9IGF0aDc5X3NwaV9ycihzcCwgQVI3MVhYX1NQSV9SRUdfSU9DKTsKLQotCS8qIFRPRE86IHNldHVwIHNwZWVkPyAqLwotCWF0aDc5X3NwaV93cihzcCwgQVI3MVhYX1NQSV9SRUdfQ1RSTCwgMHg0Myk7Ci0KLQlpZiAoc3BpLT5jaGlwX3NlbGVjdCkgewotCQlpbnQgc3RhdHVzID0gMDsKLQotCQlzdGF0dXMgPSBncGlvX3JlcXVlc3QoY2RhdGEtPmdwaW8sIGRldl9uYW1lKCZzcGktPmRldikpOwotCQlpZiAoc3RhdHVzKQotCQkJcmV0dXJuIHN0YXR1czsKLQotCQlzdGF0dXMgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoY2RhdGEtPmdwaW8sCi0JCQkJCSAgICAgICBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCk7Ci0JCWlmIChzdGF0dXMpIHsKLQkJCWdwaW9fZnJlZShjZGF0YS0+Z3Bpbyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKQotCQkJc3AtPmlvY19iYXNlIHw9IEFSNzFYWF9TUElfSU9DX0NTMDsKLQkJZWxzZQotCQkJc3AtPmlvY19iYXNlICY9IH5BUjcxWFhfU1BJX0lPQ19DUzA7Ci0JCWF0aDc5X3NwaV93cihzcCwgQVI3MVhYX1NQSV9SRUdfSU9DLCBzcC0+aW9jX2Jhc2UpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdGg3OV9zcGlfY2xlYW51cF9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBhdGg3OV9zcGkgKnNwID0gYXRoNzlfc3BpZGV2X3RvX3NwKHNwaSk7Ci0KLQlpZiAoc3BpLT5jaGlwX3NlbGVjdCkgewotCQlzdHJ1Y3QgYXRoNzlfc3BpX2NvbnRyb2xsZXJfZGF0YSAqY2RhdGEgPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKLQkJZ3Bpb19mcmVlKGNkYXRhLT5ncGlvKTsKLQl9Ci0KLQkvKiByZXN0b3JlIENUUkwgcmVnaXN0ZXIgKi8KLQlhdGg3OV9zcGlfd3Ioc3AsIEFSNzFYWF9TUElfUkVHX0NUUkwsIHNwLT5yZWdfY3RybCk7Ci0JLyogZGlzYWJsZSBHUElPIG1vZGUgKi8KLQlhdGg3OV9zcGlfd3Ioc3AsIEFSNzFYWF9TUElfUkVHX0ZTLCAwKTsKLX0KLQotc3RhdGljIGludCBhdGg3OV9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQotCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPiAzMikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIXNwaS0+Y29udHJvbGxlcl9zdGF0ZSkgewotCQlzdGF0dXMgPSBhdGg3OV9zcGlfc2V0dXBfY3Moc3BpKTsKLQkJaWYgKHN0YXR1cykKLQkJCXJldHVybiBzdGF0dXM7Ci0JfQotCi0Jc3RhdHVzID0gc3BpX2JpdGJhbmdfc2V0dXAoc3BpKTsKLQlpZiAoc3RhdHVzICYmICFzcGktPmNvbnRyb2xsZXJfc3RhdGUpCi0JCWF0aDc5X3NwaV9jbGVhbnVwX2NzKHNwaSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBhdGg3OV9zcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCWF0aDc5X3NwaV9jbGVhbnVwX2NzKHNwaSk7Ci0Jc3BpX2JpdGJhbmdfY2xlYW51cChzcGkpOwotfQotCi1zdGF0aWMgdTMyIGF0aDc5X3NwaV90eHJ4X21vZGUwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIG5zZWNzLAotCQkJICAgICAgIHUzMiB3b3JkLCB1OCBiaXRzKQotewotCXN0cnVjdCBhdGg3OV9zcGkgKnNwID0gYXRoNzlfc3BpZGV2X3RvX3NwKHNwaSk7Ci0JdTMyIGlvYyA9IHNwLT5pb2NfYmFzZTsKLQotCS8qIGNsb2NrIHN0YXJ0cyBhdCBpbmFjdGl2ZSBwb2xhcml0eSAqLwotCWZvciAod29yZCA8PD0gKDMyIC0gYml0cyk7IGxpa2VseShiaXRzKTsgYml0cy0tKSB7Ci0JCXUzMiBvdXQ7Ci0KLQkJaWYgKHdvcmQgJiAoMSA8PCAzMSkpCi0JCQlvdXQgPSBpb2MgfCBBUjcxWFhfU1BJX0lPQ19ETzsKLQkJZWxzZQotCQkJb3V0ID0gaW9jICYgfkFSNzFYWF9TUElfSU9DX0RPOwotCi0JCS8qIHNldHVwIE1TQiAodG8gc2xhdmUpIG9uIHRyYWlsaW5nIGVkZ2UgKi8KLQkJYXRoNzlfc3BpX3dyKHNwLCBBUjcxWFhfU1BJX1JFR19JT0MsIG91dCk7Ci0JCWF0aDc5X3NwaV93cihzcCwgQVI3MVhYX1NQSV9SRUdfSU9DLCBvdXQgfCBBUjcxWFhfU1BJX0lPQ19DTEspOwotCi0JCXdvcmQgPDw9IDE7Ci0JfQotCi0JcmV0dXJuIGF0aDc5X3NwaV9ycihzcCwgQVI3MVhYX1NQSV9SRUdfUkRTKTsKLX0KLQotc3RhdGljIF9fZGV2aW5pdCBpbnQgYXRoNzlfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKLQlzdHJ1Y3QgYXRoNzlfc3BpICpzcDsKLQlzdHJ1Y3QgYXRoNzlfc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwotCXN0cnVjdCByZXNvdXJjZQkqcjsKLQlpbnQgcmV0OwotCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YoKnNwKSk7Ci0JaWYgKG1hc3RlciA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBzcGkgbWFzdGVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jc3AgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc3ApOwotCi0JcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCW1hc3Rlci0+c2V0dXAgPSBhdGg3OV9zcGlfc2V0dXA7Ci0JbWFzdGVyLT5jbGVhbnVwID0gYXRoNzlfc3BpX2NsZWFudXA7Ci0JaWYgKHBkYXRhKSB7Ci0JCW1hc3Rlci0+YnVzX251bSA9IHBkYXRhLT5idXNfbnVtOwotCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcGRhdGEtPm51bV9jaGlwc2VsZWN0OwotCX0gZWxzZSB7Ci0JCW1hc3Rlci0+YnVzX251bSA9IC0xOwotCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMTsKLQl9Ci0KLQlzcC0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOwotCXNwLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBhdGg3OV9zcGlfY2hpcHNlbGVjdDsKLQlzcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBhdGg3OV9zcGlfdHhyeF9tb2RlMDsKLQlzcC0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IHNwaV9iaXRiYW5nX3NldHVwX3RyYW5zZmVyOwotCXNwLT5iaXRiYW5nLmZsYWdzID0gU1BJX0NTX0hJR0g7Ci0KLQlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAociA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyX3B1dF9tYXN0ZXI7Ci0JfQotCi0Jc3AtPmJhc2UgPSBpb3JlbWFwKHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCArIDEpOwotCWlmICghc3AtPmJhc2UpIHsKLQkJcmV0ID0gLUVOWElPOwotCQlnb3RvIGVycl9wdXRfbWFzdGVyOwotCX0KLQotCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZzcC0+Yml0YmFuZyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfdW5tYXA7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3VubWFwOgotCWlvdW5tYXAoc3AtPmJhc2UpOwotZXJyX3B1dF9tYXN0ZXI6Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0Jc3BpX21hc3Rlcl9wdXQoc3AtPmJpdGJhbmcubWFzdGVyKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBfX2RldmV4aXQgaW50IGF0aDc5X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgYXRoNzlfc3BpICpzcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0Jc3BpX2JpdGJhbmdfc3RvcCgmc3AtPmJpdGJhbmcpOwotCWlvdW5tYXAoc3AtPmJhc2UpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCXNwaV9tYXN0ZXJfcHV0KHNwLT5iaXRiYW5nLm1hc3Rlcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXRoNzlfc3BpX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gYXRoNzlfc3BpX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXRoNzlfc3BpX3JlbW92ZSksCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gRFJWX05BTUUsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgX19pbml0IGludCBhdGg3OV9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF0aDc5X3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoYXRoNzlfc3BpX2luaXQpOwotCi1zdGF0aWMgX19leGl0IHZvaWQgYXRoNzlfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXRoNzlfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChhdGg3OV9zcGlfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiU1BJIGNvbnRyb2xsZXIgZHJpdmVyIGZvciBBdGhlcm9zIEFSNzFYWC9BUjcyNFgvQVI5MTNYIik7Ci1NT0RVTEVfQVVUSE9SKCJHYWJvciBKdWhvcyA8anVob3NnQG9wZW53cnQub3JnPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVl9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jIGIvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NzExZTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NDAgKzAsMCBAQAotLyoKLSAqIERyaXZlciBmb3IgQXRtZWwgQVQzMiBhbmQgQVQ5MSBTUEkgQ29udHJvbGxlcnMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXRtZWwgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9jcHUuaD4KLQotI2luY2x1ZGUgImF0bWVsX3NwaS5oIgotCi0vKgotICogVGhlIGNvcmUgU1BJIHRyYW5zZmVyIGVuZ2luZSBqdXN0IHRhbGtzIHRvIGEgcmVnaXN0ZXIgYmFuayB0byBzZXQgdXAKLSAqIERNQSB0cmFuc2ZlcnM7IHRyYW5zZmVyIHF1ZXVlIHByb2dyZXNzIGlzIGRyaXZlbiBieSBJUlFzLiAgVGhlIGNsb2NrCi0gKiBmcmFtZXdvcmsgcHJvdmlkZXMgdGhlIGJhc2UgY2xvY2ssIHN1YmRpdmlkZWQgZm9yIGVhY2ggc3BpX2RldmljZS4KLSAqLwotc3RydWN0IGF0bWVsX3NwaSB7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQotCXZvaWQgX19pb21lbQkJKnJlZ3M7Ci0JaW50CQkJaXJxOwotCXN0cnVjdCBjbGsJCSpjbGs7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKLQlzdHJ1Y3Qgc3BpX2RldmljZQkqc3RheTsKLQotCXU4CQkJc3RvcHBpbmc7Ci0Jc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSpjdXJyZW50X3RyYW5zZmVyOwotCXVuc2lnbmVkIGxvbmcJCWN1cnJlbnRfcmVtYWluaW5nX2J5dGVzOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIJKm5leHRfdHJhbnNmZXI7Ci0JdW5zaWduZWQgbG9uZwkJbmV4dF9yZW1haW5pbmdfYnl0ZXM7Ci0KLQl2b2lkCQkJKmJ1ZmZlcjsKLQlkbWFfYWRkcl90CQlidWZmZXJfZG1hOwotfTsKLQotLyogQ29udHJvbGxlci1zcGVjaWZpYyBwZXItc2xhdmUgc3RhdGUgKi8KLXN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlIHsKLQl1bnNpZ25lZCBpbnQJCW5wY3NfcGluOwotCXUzMgkJCWNzcjsKLX07Ci0KLSNkZWZpbmUgQlVGRkVSX1NJWkUJCVBBR0VfU0laRQotI2RlZmluZSBJTlZBTElEX0RNQV9BRERSRVNTCTB4ZmZmZmZmZmYKLQotLyoKLSAqIFZlcnNpb24gMiBvZiB0aGUgU1BJIGNvbnRyb2xsZXIgaGFzCi0gKiAgLSBDUi5MQVNUWEZFUgotICogIC0gU1BJX01SLkRJVjMyIG1heSBiZWNvbWUgRkRJViBvciBtdXN0LWJlLXplcm8gKGhlcmU6IGFsd2F5cyB6ZXJvKQotICogIC0gU1BJX1NSLlRYRU1QVFksIFNQSV9TUi5OU1NSIChhbmQgY29ycmVzcG9uZGluZyBpcnFzKQotICogIC0gU1BJX0NTUnguQ1NBQVQKLSAqICAtIFNQSV9DU1J4LlNCQ1IgYWxsb3dzIGZhc3RlciBjbG9ja2luZwotICoKLSAqIFdlIGNhbiBkZXRlcm1pbmUgdGhlIGNvbnRyb2xsZXIgdmVyc2lvbiBieSByZWFkaW5nIHRoZSBWRVJTSU9OCi0gKiByZWdpc3RlciwgYnV0IEkgaGF2ZW4ndCBjaGVja2VkIHRoYXQgaXQgZXhpc3RzIG9uIGFsbCBjaGlwcywgYW5kCi0gKiB0aGlzIGlzIGNoZWFwZXIgYW55d2F5LgotICovCi1zdGF0aWMgYm9vbCBhdG1lbF9zcGlfaXNfdjIodm9pZCkKLXsKLQlyZXR1cm4gIWNwdV9pc19hdDkxcm05MjAwKCk7Ci19Ci0KLS8qCi0gKiBFYXJsaWVyIFNQSSBjb250cm9sbGVycyAoZS5nLiBvbiBhdDkxcm05MjAwKSBoYXZlIGEgZGVzaWduIGJ1ZyB3aGVyZWJ5Ci0gKiB0aGV5IGFzc3VtZSB0aGF0IHNwaSBzbGF2ZSBkZXZpY2Ugc3RhdGUgd2lsbCBub3QgY2hhbmdlIG9uIGRlc2VsZWN0LCBzbwotICogdGhhdCBhdXRvbWFnaWMgZGVzZWxlY3Rpb24gaXMgT0suICAoIk5QQ1N4IHJpc2VzIGlmIG5vIGRhdGEgaXMgdG8gYmUKLSAqIHRyYW5zbWl0dGVkIikgIE5vdCBzbyEgIFdvcmthcm91bmQgdXNlcyBuQ1N4IHBpbnMgYXMgR1BJT3M7IG9yIG5ld2VyCi0gKiBjb250cm9sbGVycyBoYXZlIENTQUFUIGFuZCBmcmllbmRzLgotICoKLSAqIFNpbmNlIHRoZSBDU0FBVCBmdW5jdGlvbmFsaXR5IGlzIGEgYml0IHdlaXJkIG9uIG5ld2VyIGNvbnRyb2xsZXJzIGFzCi0gKiB3ZWxsLCB3ZSB1c2UgR1BJTyB0byBjb250cm9sIG5DU3ggcGlucyBvbiBhbGwgY29udHJvbGxlcnMsIHVwZGF0aW5nCi0gKiBNUi5QQ1MgdG8gYXZvaWQgY29uZnVzaW5nIHRoZSBjb250cm9sbGVyLiAgVXNpbmcgR1BJT3MgYWxzbyBsZXRzIHVzCi0gKiBzdXBwb3J0IGFjdGl2ZS1oaWdoIGNoaXBzZWxlY3RzIGRlc3BpdGUgdGhlIGNvbnRyb2xsZXIncyBiZWxpZWYgdGhhdAotICogb25seSBhY3RpdmUtbG93IGRldmljZXMvc3lzdGVtcyBleGlzdHMuCi0gKgotICogSG93ZXZlciwgYXQ5MXJtOTIwMCBoYXMgYSBzZWNvbmQgZXJyYXR1bSB3aGVyZWJ5IG5DUzAgZG9lc24ndCB3b3JrCi0gKiByaWdodCB3aGVuIGRyaXZlbiB3aXRoIEdQSU8uICAoIk1vZGUgRmF1bHQgZG9lcyBub3QgYWxsb3cgbW9yZSB0aGFuIG9uZQotICogTWFzdGVyIG9uIENoaXAgU2VsZWN0IDAuIikgIE5vIHdvcmthcm91bmQgZXhpc3RzIGZvciB0aGF0IC4uLiBzbyBmb3IKLSAqIG5DUzAgb24gdGhhdCBjaGlwLCB3ZSAoYSkgZG9uJ3QgdXNlIHRoZSBHUElPLCAoYikgY2FuJ3Qgc3VwcG9ydCBDU19ISUdILAotICogYW5kIChjKSB3aWxsIHRyaWdnZXIgdGhhdCBmaXJzdCBlcnJhdHVtIGluIHNvbWUgY2FzZXMuCi0gKgotICogVE9ETzogVGVzdCBpZiB0aGUgYXRtZWxfc3BpX2lzX3YyKCkgYnJhbmNoIGJlbG93IHdvcmtzIG9uCi0gKiBBVDkxUk05MjAwIGlmIHdlIHVzZSBzb21lIG90aGVyIHJlZ2lzdGVyIHRoYW4gQ1NSMC4gSG93ZXZlciwgZG9uJ3QKLSAqIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5IHNpbmNlIEFQNzAwMCBoYXMgYW4gZXJyYXRhIHdoZXJlIHRoZSBCSVRTCi0gKiBmaWVsZCBpbiBDU1IwIG92ZXJyaWRlcyBhbGwgb3RoZXIgQ1NScy4KLSAqLwotCi1zdGF0aWMgdm9pZCBjc19hY3RpdmF0ZShzdHJ1Y3QgYXRtZWxfc3BpICphcywgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZSAqYXNkID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCXVuc2lnbmVkIGFjdGl2ZSA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIOwotCXUzMiBtcjsKLQotCWlmIChhdG1lbF9zcGlfaXNfdjIoKSkgewotCQkvKgotCQkgKiBBbHdheXMgdXNlIENTUjAuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBjbG9jawotCQkgKiBzd2l0Y2hlcyB0byB0aGUgY29ycmVjdCBpZGxlIHBvbGFyaXR5IGJlZm9yZSB3ZQotCQkgKiB0b2dnbGUgdGhlIENTLgotCQkgKi8KLQkJc3BpX3dyaXRlbChhcywgQ1NSMCwgYXNkLT5jc3IpOwotCQlzcGlfd3JpdGVsKGFzLCBNUiwgU1BJX0JGKFBDUywgMHgwZSkgfCBTUElfQklUKE1PREZESVMpCi0JCQkJfCBTUElfQklUKE1TVFIpKTsKLQkJbXIgPSBzcGlfcmVhZGwoYXMsIE1SKTsKLQkJZ3Bpb19zZXRfdmFsdWUoYXNkLT5ucGNzX3BpbiwgYWN0aXZlKTsKLQl9IGVsc2UgewotCQl1MzIgY3BvbCA9IChzcGktPm1vZGUgJiBTUElfQ1BPTCkgPyBTUElfQklUKENQT0wpIDogMDsKLQkJaW50IGk7Ci0JCXUzMiBjc3I7Ci0KLQkJLyogTWFrZSBzdXJlIGNsb2NrIHBvbGFyaXR5IGlzIGNvcnJlY3QgKi8KLQkJZm9yIChpID0gMDsgaSA8IHNwaS0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdDsgaSsrKSB7Ci0JCQljc3IgPSBzcGlfcmVhZGwoYXMsIENTUjAgKyA0ICogaSk7Ci0JCQlpZiAoKGNzciBeIGNwb2wpICYgU1BJX0JJVChDUE9MKSkKLQkJCQlzcGlfd3JpdGVsKGFzLCBDU1IwICsgNCAqIGksCi0JCQkJCQljc3IgXiBTUElfQklUKENQT0wpKTsKLQkJfQotCi0JCW1yID0gc3BpX3JlYWRsKGFzLCBNUik7Ci0JCW1yID0gU1BJX0JGSU5TKFBDUywgfigxIDw8IHNwaS0+Y2hpcF9zZWxlY3QpLCBtcik7Ci0JCWlmIChzcGktPmNoaXBfc2VsZWN0ICE9IDApCi0JCQlncGlvX3NldF92YWx1ZShhc2QtPm5wY3NfcGluLCBhY3RpdmUpOwotCQlzcGlfd3JpdGVsKGFzLCBNUiwgbXIpOwotCX0KLQotCWRldl9kYmcoJnNwaS0+ZGV2LCAiYWN0aXZhdGUgJXUlcywgbXIgJTA4eFxuIiwKLQkJCWFzZC0+bnBjc19waW4sIGFjdGl2ZSA/ICIgKGhpZ2gpIiA6ICIiLAotCQkJbXIpOwotfQotCi1zdGF0aWMgdm9pZCBjc19kZWFjdGl2YXRlKHN0cnVjdCBhdG1lbF9zcGkgKmFzLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlICphc2QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0JdW5zaWduZWQgYWN0aXZlID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0g7Ci0JdTMyIG1yOwotCi0JLyogb25seSBkZWFjdGl2YXRlICp0aGlzKiBkZXZpY2U7IHNvbWV0aW1lcyB0cmFuc2ZlcnMgdG8KLQkgKiBhbm90aGVyIGRldmljZSBtYXkgYmUgYWN0aXZlIHdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZC4KLQkgKi8KLQltciA9IHNwaV9yZWFkbChhcywgTVIpOwotCWlmICh+U1BJX0JGRVhUKFBDUywgbXIpICYgKDEgPDwgc3BpLT5jaGlwX3NlbGVjdCkpIHsKLQkJbXIgPSBTUElfQkZJTlMoUENTLCAweGYsIG1yKTsKLQkJc3BpX3dyaXRlbChhcywgTVIsIG1yKTsKLQl9Ci0KLQlkZXZfZGJnKCZzcGktPmRldiwgIkRFYWN0aXZhdGUgJXUlcywgbXIgJTA4eFxuIiwKLQkJCWFzZC0+bnBjc19waW4sIGFjdGl2ZSA/ICIgKGxvdykiIDogIiIsCi0JCQltcik7Ci0KLQlpZiAoYXRtZWxfc3BpX2lzX3YyKCkgfHwgc3BpLT5jaGlwX3NlbGVjdCAhPSAwKQotCQlncGlvX3NldF92YWx1ZShhc2QtPm5wY3NfcGluLCAhYWN0aXZlKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXRtZWxfc3BpX3hmZXJfaXNfbGFzdChzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZywKLQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKLXsKLQlyZXR1cm4gbXNnLT50cmFuc2ZlcnMucHJldiA9PSAmeGZlci0+dHJhbnNmZXJfbGlzdDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXRtZWxfc3BpX3hmZXJfY2FuX2JlX2NoYWluZWQoc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKLXsKLQlyZXR1cm4geGZlci0+ZGVsYXlfdXNlY3MgPT0gMCAmJiAheGZlci0+Y3NfY2hhbmdlOwotfQotCi1zdGF0aWMgdm9pZCBhdG1lbF9zcGlfbmV4dF94ZmVyX2RhdGEoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKLQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyLAotCQkJCWRtYV9hZGRyX3QgKnR4X2RtYSwKLQkJCQlkbWFfYWRkcl90ICpyeF9kbWEsCi0JCQkJdTMyICpwbGVuKQotewotCXN0cnVjdCBhdG1lbF9zcGkJKmFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXUzMgkJCWxlbiA9ICpwbGVuOwotCi0JLyogdXNlIHNjcmF0Y2ggYnVmZmVyIG9ubHkgd2hlbiByeCBvciB0eCBkYXRhIGlzIHVuc3BlY2lmaWVkICovCi0JaWYgKHhmZXItPnJ4X2J1ZikKLQkJKnJ4X2RtYSA9IHhmZXItPnJ4X2RtYSArIHhmZXItPmxlbiAtICpwbGVuOwotCWVsc2UgewotCQkqcnhfZG1hID0gYXMtPmJ1ZmZlcl9kbWE7Ci0JCWlmIChsZW4gPiBCVUZGRVJfU0laRSkKLQkJCWxlbiA9IEJVRkZFUl9TSVpFOwotCX0KLQlpZiAoeGZlci0+dHhfYnVmKQotCQkqdHhfZG1hID0geGZlci0+dHhfZG1hICsgeGZlci0+bGVuIC0gKnBsZW47Ci0JZWxzZSB7Ci0JCSp0eF9kbWEgPSBhcy0+YnVmZmVyX2RtYTsKLQkJaWYgKGxlbiA+IEJVRkZFUl9TSVpFKQotCQkJbGVuID0gQlVGRkVSX1NJWkU7Ci0JCW1lbXNldChhcy0+YnVmZmVyLCAwLCBsZW4pOwotCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgmYXMtPnBkZXYtPmRldiwKLQkJCQlhcy0+YnVmZmVyX2RtYSwgbGVuLCBETUFfVE9fREVWSUNFKTsKLQl9Ci0KLQkqcGxlbiA9IGxlbjsKLX0KLQotLyoKLSAqIFN1Ym1pdCBuZXh0IHRyYW5zZmVyIGZvciBETUEuCi0gKiBsb2NrIGlzIGhlbGQsIHNwaSBpcnEgaXMgYmxvY2tlZAotICovCi1zdGF0aWMgdm9pZCBhdG1lbF9zcGlfbmV4dF94ZmVyKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCi0JCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCi17Ci0Jc3RydWN0IGF0bWVsX3NwaQkqYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlcgkqeGZlcjsKLQl1MzIJCQlsZW4sIHJlbWFpbmluZzsKLQl1MzIJCQlpZXZhbDsKLQlkbWFfYWRkcl90CQl0eF9kbWEsIHJ4X2RtYTsKLQotCWlmICghYXMtPmN1cnJlbnRfdHJhbnNmZXIpCi0JCXhmZXIgPSBsaXN0X2VudHJ5KG1zZy0+dHJhbnNmZXJzLm5leHQsCi0JCQkJc3RydWN0IHNwaV90cmFuc2ZlciwgdHJhbnNmZXJfbGlzdCk7Ci0JZWxzZSBpZiAoIWFzLT5uZXh0X3RyYW5zZmVyKQotCQl4ZmVyID0gbGlzdF9lbnRyeShhcy0+Y3VycmVudF90cmFuc2Zlci0+dHJhbnNmZXJfbGlzdC5uZXh0LAotCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOwotCWVsc2UKLQkJeGZlciA9IE5VTEw7Ci0KLQlpZiAoeGZlcikgewotCQlzcGlfd3JpdGVsKGFzLCBQVENSLCBTUElfQklUKFJYVERJUykgfCBTUElfQklUKFRYVERJUykpOwotCi0JCWxlbiA9IHhmZXItPmxlbjsKLQkJYXRtZWxfc3BpX25leHRfeGZlcl9kYXRhKG1hc3RlciwgeGZlciwgJnR4X2RtYSwgJnJ4X2RtYSwgJmxlbik7Ci0JCXJlbWFpbmluZyA9IHhmZXItPmxlbiAtIGxlbjsKLQotCQlzcGlfd3JpdGVsKGFzLCBSUFIsIHJ4X2RtYSk7Ci0JCXNwaV93cml0ZWwoYXMsIFRQUiwgdHhfZG1hKTsKLQotCQlpZiAobXNnLT5zcGktPmJpdHNfcGVyX3dvcmQgPiA4KQotCQkJbGVuID4+PSAxOwotCQlzcGlfd3JpdGVsKGFzLCBSQ1IsIGxlbik7Ci0JCXNwaV93cml0ZWwoYXMsIFRDUiwgbGVuKTsKLQotCQlkZXZfZGJnKCZtc2ctPnNwaS0+ZGV2LAotCQkJIiAgc3RhcnQgeGZlciAlcDogbGVuICV1IHR4ICVwLyUwOHggcnggJXAvJTA4eFxuIiwKLQkJCXhmZXIsIHhmZXItPmxlbiwgeGZlci0+dHhfYnVmLCB4ZmVyLT50eF9kbWEsCi0JCQl4ZmVyLT5yeF9idWYsIHhmZXItPnJ4X2RtYSk7Ci0JfSBlbHNlIHsKLQkJeGZlciA9IGFzLT5uZXh0X3RyYW5zZmVyOwotCQlyZW1haW5pbmcgPSBhcy0+bmV4dF9yZW1haW5pbmdfYnl0ZXM7Ci0JfQotCi0JYXMtPmN1cnJlbnRfdHJhbnNmZXIgPSB4ZmVyOwotCWFzLT5jdXJyZW50X3JlbWFpbmluZ19ieXRlcyA9IHJlbWFpbmluZzsKLQotCWlmIChyZW1haW5pbmcgPiAwKQotCQlsZW4gPSByZW1haW5pbmc7Ci0JZWxzZSBpZiAoIWF0bWVsX3NwaV94ZmVyX2lzX2xhc3QobXNnLCB4ZmVyKQotCQkJJiYgYXRtZWxfc3BpX3hmZXJfY2FuX2JlX2NoYWluZWQoeGZlcikpIHsKLQkJeGZlciA9IGxpc3RfZW50cnkoeGZlci0+dHJhbnNmZXJfbGlzdC5uZXh0LAotCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOwotCQlsZW4gPSB4ZmVyLT5sZW47Ci0JfSBlbHNlCi0JCXhmZXIgPSBOVUxMOwotCi0JYXMtPm5leHRfdHJhbnNmZXIgPSB4ZmVyOwotCi0JaWYgKHhmZXIpIHsKLQkJdTMyCXRvdGFsOwotCi0JCXRvdGFsID0gbGVuOwotCQlhdG1lbF9zcGlfbmV4dF94ZmVyX2RhdGEobWFzdGVyLCB4ZmVyLCAmdHhfZG1hLCAmcnhfZG1hLCAmbGVuKTsKLQkJYXMtPm5leHRfcmVtYWluaW5nX2J5dGVzID0gdG90YWwgLSBsZW47Ci0KLQkJc3BpX3dyaXRlbChhcywgUk5QUiwgcnhfZG1hKTsKLQkJc3BpX3dyaXRlbChhcywgVE5QUiwgdHhfZG1hKTsKLQotCQlpZiAobXNnLT5zcGktPmJpdHNfcGVyX3dvcmQgPiA4KQotCQkJbGVuID4+PSAxOwotCQlzcGlfd3JpdGVsKGFzLCBSTkNSLCBsZW4pOwotCQlzcGlfd3JpdGVsKGFzLCBUTkNSLCBsZW4pOwotCi0JCWRldl9kYmcoJm1zZy0+c3BpLT5kZXYsCi0JCQkiICBuZXh0IHhmZXIgJXA6IGxlbiAldSB0eCAlcC8lMDh4IHJ4ICVwLyUwOHhcbiIsCi0JCQl4ZmVyLCB4ZmVyLT5sZW4sIHhmZXItPnR4X2J1ZiwgeGZlci0+dHhfZG1hLAotCQkJeGZlci0+cnhfYnVmLCB4ZmVyLT5yeF9kbWEpOwotCQlpZXZhbCA9IFNQSV9CSVQoRU5EUlgpIHwgU1BJX0JJVChPVlJFUyk7Ci0JfSBlbHNlIHsKLQkJc3BpX3dyaXRlbChhcywgUk5DUiwgMCk7Ci0JCXNwaV93cml0ZWwoYXMsIFROQ1IsIDApOwotCQlpZXZhbCA9IFNQSV9CSVQoUlhCVUZGKSB8IFNQSV9CSVQoRU5EUlgpIHwgU1BJX0JJVChPVlJFUyk7Ci0JfQotCi0JLyogUkVWSVNJVDogV2UncmUgd2FpdGluZyBmb3IgRU5EUlggYmVmb3JlIHdlIHN0YXJ0IHRoZSBuZXh0Ci0JICogdHJhbnNmZXIgYmVjYXVzZSB3ZSBuZWVkIHRvIGhhbmRsZSBzb21lIGRpZmZpY3VsdCB0aW1pbmcKLQkgKiBpc3N1ZXMgb3RoZXJ3aXNlLiBJZiB3ZSB3YWl0IGZvciBFTkRUWCBpbiBvbmUgdHJhbnNmZXIgYW5kCi0JICogdGhlbiBzdGFydHMgd2FpdGluZyBmb3IgRU5EUlggaW4gdGhlIG5leHQsIGl0J3MgZGlmZmljdWx0Ci0JICogdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBFTkRSWCBpbnRlcnJ1cHQgd2UncmUKLQkgKiBhY3R1YWxseSB3YWl0aW5nIGZvciBhbmQgdGhlIEVORFJYIGludGVycnVwdCBvZiB0aGUKLQkgKiBwcmV2aW91cyB0cmFuc2Zlci4KLQkgKgotCSAqIEl0IHNob3VsZCBiZSBkb2FibGUsIHRob3VnaC4gSnVzdCBub3Qgbm93Li4uCi0JICovCi0Jc3BpX3dyaXRlbChhcywgSUVSLCBpZXZhbCk7Ci0Jc3BpX3dyaXRlbChhcywgUFRDUiwgU1BJX0JJVChUWFRFTikgfCBTUElfQklUKFJYVEVOKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0bWVsX3NwaV9uZXh0X21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKLXsKLQlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UJKm1zZzsKLQlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOwotCi0JQlVHX09OKGFzLT5jdXJyZW50X3RyYW5zZmVyKTsKLQotCW1zZyA9IGxpc3RfZW50cnkoYXMtPnF1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOwotCXNwaSA9IG1zZy0+c3BpOwotCi0JZGV2X2RiZyhtYXN0ZXItPmRldi5wYXJlbnQsICJzdGFydCBtZXNzYWdlICVwIGZvciAlc1xuIiwKLQkJCW1zZywgZGV2X25hbWUoJnNwaS0+ZGV2KSk7Ci0KLQkvKiBzZWxlY3QgY2hpcCBpZiBpdCdzIG5vdCBzdGlsbCBhY3RpdmUgKi8KLQlpZiAoYXMtPnN0YXkpIHsKLQkJaWYgKGFzLT5zdGF5ICE9IHNwaSkgewotCQkJY3NfZGVhY3RpdmF0ZShhcywgYXMtPnN0YXkpOwotCQkJY3NfYWN0aXZhdGUoYXMsIHNwaSk7Ci0JCX0KLQkJYXMtPnN0YXkgPSBOVUxMOwotCX0gZWxzZQotCQljc19hY3RpdmF0ZShhcywgc3BpKTsKLQotCWF0bWVsX3NwaV9uZXh0X3hmZXIobWFzdGVyLCBtc2cpOwotfQotCi0vKgotICogRm9yIERNQSwgdHhfYnVmL3R4X2RtYSBoYXZlIHRoZSBzYW1lIHJlbGF0aW9uc2hpcCBhcyByeF9idWYvcnhfZG1hOgotICogIC0gVGhlIGJ1ZmZlciBpcyBlaXRoZXIgdmFsaWQgZm9yIENQVSBhY2Nlc3MsIGVsc2UgTlVMTAotICogIC0gSWYgdGhlIGJ1ZmZlciBpcyB2YWxpZCwgc28gaXMgaXRzIERNQSBhZGRyZXNzCi0gKgotICogVGhpcyBkcml2ZXIgbWFuYWdlcyB0aGUgZG1hIGFkZHJlc3MgdW5sZXNzIG1lc3NhZ2UtPmlzX2RtYV9tYXBwZWQuCi0gKi8KLXN0YXRpYyBpbnQKLWF0bWVsX3NwaV9kbWFfbWFwX3hmZXIoc3RydWN0IGF0bWVsX3NwaSAqYXMsIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCi17Ci0Jc3RydWN0IGRldmljZQkqZGV2ID0gJmFzLT5wZGV2LT5kZXY7Ci0KLQl4ZmVyLT50eF9kbWEgPSB4ZmVyLT5yeF9kbWEgPSBJTlZBTElEX0RNQV9BRERSRVNTOwotCWlmICh4ZmVyLT50eF9idWYpIHsKLQkJLyogdHhfYnVmIGlzIGEgY29uc3Qgdm9pZCogd2hlcmUgd2UgbmVlZCBhIHZvaWQgKiBmb3IgdGhlIGRtYQotCQkgKiBtYXBwaW5nICovCi0JCXZvaWQgKm5vbmNvbnN0X3R4ID0gKHZvaWQgKil4ZmVyLT50eF9idWY7Ci0KLQkJeGZlci0+dHhfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LAotCQkJCW5vbmNvbnN0X3R4LCB4ZmVyLT5sZW4sCi0JCQkJRE1BX1RPX0RFVklDRSk7Ci0JCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIHhmZXItPnR4X2RtYSkpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JaWYgKHhmZXItPnJ4X2J1ZikgewotCQl4ZmVyLT5yeF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsCi0JCQkJeGZlci0+cnhfYnVmLCB4ZmVyLT5sZW4sCi0JCQkJRE1BX0ZST01fREVWSUNFKTsKLQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgeGZlci0+cnhfZG1hKSkgewotCQkJaWYgKHhmZXItPnR4X2J1ZikKLQkJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwKLQkJCQkJCXhmZXItPnR4X2RtYSwgeGZlci0+bGVuLAotCQkJCQkJRE1BX1RPX0RFVklDRSk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXRtZWxfc3BpX2RtYV91bm1hcF94ZmVyKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCi0JCQkJICAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQotewotCWlmICh4ZmVyLT50eF9kbWEgIT0gSU5WQUxJRF9ETUFfQUREUkVTUykKLQkJZG1hX3VubWFwX3NpbmdsZShtYXN0ZXItPmRldi5wYXJlbnQsIHhmZXItPnR4X2RtYSwKLQkJCQkgeGZlci0+bGVuLCBETUFfVE9fREVWSUNFKTsKLQlpZiAoeGZlci0+cnhfZG1hICE9IElOVkFMSURfRE1BX0FERFJFU1MpCi0JCWRtYV91bm1hcF9zaW5nbGUobWFzdGVyLT5kZXYucGFyZW50LCB4ZmVyLT5yeF9kbWEsCi0JCQkJIHhmZXItPmxlbiwgRE1BX0ZST01fREVWSUNFKTsKLX0KLQotc3RhdGljIHZvaWQKLWF0bWVsX3NwaV9tc2dfZG9uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3QgYXRtZWxfc3BpICphcywKLQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2csIGludCBzdGF0dXMsIGludCBzdGF5KQotewotCWlmICghc3RheSB8fCBzdGF0dXMgPCAwKQotCQljc19kZWFjdGl2YXRlKGFzLCBtc2ctPnNwaSk7Ci0JZWxzZQotCQlhcy0+c3RheSA9IG1zZy0+c3BpOwotCi0JbGlzdF9kZWwoJm1zZy0+cXVldWUpOwotCW1zZy0+c3RhdHVzID0gc3RhdHVzOwotCi0JZGV2X2RiZyhtYXN0ZXItPmRldi5wYXJlbnQsCi0JCSJ4ZmVyIGNvbXBsZXRlOiAldSBieXRlcyB0cmFuc2ZlcnJlZFxuIiwKLQkJbXNnLT5hY3R1YWxfbGVuZ3RoKTsKLQotCXNwaW5fdW5sb2NrKCZhcy0+bG9jayk7Ci0JbXNnLT5jb21wbGV0ZShtc2ctPmNvbnRleHQpOwotCXNwaW5fbG9jaygmYXMtPmxvY2spOwotCi0JYXMtPmN1cnJlbnRfdHJhbnNmZXIgPSBOVUxMOwotCWFzLT5uZXh0X3RyYW5zZmVyID0gTlVMTDsKLQotCS8qIGNvbnRpbnVlIGlmIG5lZWRlZCAqLwotCWlmIChsaXN0X2VtcHR5KCZhcy0+cXVldWUpIHx8IGFzLT5zdG9wcGluZykKLQkJc3BpX3dyaXRlbChhcywgUFRDUiwgU1BJX0JJVChSWFRESVMpIHwgU1BJX0JJVChUWFRESVMpKTsKLQllbHNlCi0JCWF0bWVsX3NwaV9uZXh0X21lc3NhZ2UobWFzdGVyKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90Ci1hdG1lbF9zcGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyID0gZGV2X2lkOwotCXN0cnVjdCBhdG1lbF9zcGkJKmFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXN0cnVjdCBzcGlfbWVzc2FnZQkqbXNnOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIJKnhmZXI7Ci0JdTMyCQkJc3RhdHVzLCBwZW5kaW5nLCBpbXI7Ci0JaW50CQkJcmV0ID0gSVJRX05PTkU7Ci0KLQlzcGluX2xvY2soJmFzLT5sb2NrKTsKLQotCXhmZXIgPSBhcy0+Y3VycmVudF90cmFuc2ZlcjsKLQltc2cgPSBsaXN0X2VudHJ5KGFzLT5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsIHF1ZXVlKTsKLQotCWltciA9IHNwaV9yZWFkbChhcywgSU1SKTsKLQlzdGF0dXMgPSBzcGlfcmVhZGwoYXMsIFNSKTsKLQlwZW5kaW5nID0gc3RhdHVzICYgaW1yOwotCi0JaWYgKHBlbmRpbmcgJiBTUElfQklUKE9WUkVTKSkgewotCQlpbnQgdGltZW91dDsKLQotCQlyZXQgPSBJUlFfSEFORExFRDsKLQotCQlzcGlfd3JpdGVsKGFzLCBJRFIsIChTUElfQklUKFJYQlVGRikgfCBTUElfQklUKEVORFJYKQotCQkJCSAgICAgfCBTUElfQklUKE9WUkVTKSkpOwotCi0JCS8qCi0JCSAqIFdoZW4gd2UgZ2V0IGFuIG92ZXJydW4sIHdlIGRpc3JlZ2FyZCB0aGUgY3VycmVudAotCQkgKiB0cmFuc2Zlci4gRGF0YSB3aWxsIG5vdCBiZSBjb3BpZWQgYmFjayBmcm9tIGFueQotCQkgKiBib3VuY2UgYnVmZmVyIGFuZCBtc2ctPmFjdHVhbF9sZW4gd2lsbCBub3QgYmUKLQkJICogdXBkYXRlZCB3aXRoIHRoZSBsYXN0IHhmZXIuCi0JCSAqCi0JCSAqIFdlIHdpbGwgYWxzbyBub3QgcHJvY2VzcyBhbnkgcmVtYW5pbmcgdHJhbnNmZXJzIGluCi0JCSAqIHRoZSBtZXNzYWdlLgotCQkgKgotCQkgKiBGaXJzdCwgc3RvcCB0aGUgdHJhbnNmZXIgYW5kIHVubWFwIHRoZSBETUEgYnVmZmVycy4KLQkJICovCi0JCXNwaV93cml0ZWwoYXMsIFBUQ1IsIFNQSV9CSVQoUlhURElTKSB8IFNQSV9CSVQoVFhURElTKSk7Ci0JCWlmICghbXNnLT5pc19kbWFfbWFwcGVkKQotCQkJYXRtZWxfc3BpX2RtYV91bm1hcF94ZmVyKG1hc3RlciwgeGZlcik7Ci0KLQkJLyogUkVWSVNJVDogdWRlbGF5IGluIGlycSBpcyB1bmZyaWVuZGx5ICovCi0JCWlmICh4ZmVyLT5kZWxheV91c2VjcykKLQkJCXVkZWxheSh4ZmVyLT5kZWxheV91c2Vjcyk7Ci0KLQkJZGV2X3dhcm4obWFzdGVyLT5kZXYucGFyZW50LCAib3ZlcnJ1biAoJXUvJXUgcmVtYWluaW5nKVxuIiwKLQkJCSBzcGlfcmVhZGwoYXMsIFRDUiksIHNwaV9yZWFkbChhcywgUkNSKSk7Ci0KLQkJLyoKLQkJICogQ2xlYW4gdXAgRE1BIHJlZ2lzdGVycyBhbmQgbWFrZSBzdXJlIHRoZSBkYXRhCi0JCSAqIHJlZ2lzdGVycyBhcmUgZW1wdHkuCi0JCSAqLwotCQlzcGlfd3JpdGVsKGFzLCBSTkNSLCAwKTsKLQkJc3BpX3dyaXRlbChhcywgVE5DUiwgMCk7Ci0JCXNwaV93cml0ZWwoYXMsIFJDUiwgMCk7Ci0JCXNwaV93cml0ZWwoYXMsIFRDUiwgMCk7Ci0JCWZvciAodGltZW91dCA9IDEwMDA7IHRpbWVvdXQ7IHRpbWVvdXQtLSkKLQkJCWlmIChzcGlfcmVhZGwoYXMsIFNSKSAmIFNQSV9CSVQoVFhFTVBUWSkpCi0JCQkJYnJlYWs7Ci0JCWlmICghdGltZW91dCkKLQkJCWRldl93YXJuKG1hc3Rlci0+ZGV2LnBhcmVudCwKLQkJCQkgInRpbWVvdXQgd2FpdGluZyBmb3IgVFhFTVBUWSIpOwotCQl3aGlsZSAoc3BpX3JlYWRsKGFzLCBTUikgJiBTUElfQklUKFJEUkYpKQotCQkJc3BpX3JlYWRsKGFzLCBSRFIpOwotCi0JCS8qIENsZWFyIGFueSBvdmVycnVuIGhhcHBlbmluZyB3aGlsZSBjbGVhbmluZyB1cCAqLwotCQlzcGlfcmVhZGwoYXMsIFNSKTsKLQotCQlhdG1lbF9zcGlfbXNnX2RvbmUobWFzdGVyLCBhcywgbXNnLCAtRUlPLCAwKTsKLQl9IGVsc2UgaWYgKHBlbmRpbmcgJiAoU1BJX0JJVChSWEJVRkYpIHwgU1BJX0JJVChFTkRSWCkpKSB7Ci0JCXJldCA9IElSUV9IQU5ETEVEOwotCi0JCXNwaV93cml0ZWwoYXMsIElEUiwgcGVuZGluZyk7Ci0KLQkJaWYgKGFzLT5jdXJyZW50X3JlbWFpbmluZ19ieXRlcyA9PSAwKSB7Ci0JCQltc2ctPmFjdHVhbF9sZW5ndGggKz0geGZlci0+bGVuOwotCi0JCQlpZiAoIW1zZy0+aXNfZG1hX21hcHBlZCkKLQkJCQlhdG1lbF9zcGlfZG1hX3VubWFwX3hmZXIobWFzdGVyLCB4ZmVyKTsKLQotCQkJLyogUkVWSVNJVDogdWRlbGF5IGluIGlycSBpcyB1bmZyaWVuZGx5ICovCi0JCQlpZiAoeGZlci0+ZGVsYXlfdXNlY3MpCi0JCQkJdWRlbGF5KHhmZXItPmRlbGF5X3VzZWNzKTsKLQotCQkJaWYgKGF0bWVsX3NwaV94ZmVyX2lzX2xhc3QobXNnLCB4ZmVyKSkgewotCQkJCS8qIHJlcG9ydCBjb21wbGV0ZWQgbWVzc2FnZSAqLwotCQkJCWF0bWVsX3NwaV9tc2dfZG9uZShtYXN0ZXIsIGFzLCBtc2csIDAsCi0JCQkJCQl4ZmVyLT5jc19jaGFuZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoeGZlci0+Y3NfY2hhbmdlKSB7Ci0JCQkJCWNzX2RlYWN0aXZhdGUoYXMsIG1zZy0+c3BpKTsKLQkJCQkJdWRlbGF5KDEpOwotCQkJCQljc19hY3RpdmF0ZShhcywgbXNnLT5zcGkpOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogTm90IGRvbmUgeWV0LiBTdWJtaXQgdGhlIG5leHQgdHJhbnNmZXIuCi0JCQkJICoKLQkJCQkgKiBGSVhNRSBoYW5kbGUgcHJvdG9jb2wgb3B0aW9ucyBmb3IgeGZlcgotCQkJCSAqLwotCQkJCWF0bWVsX3NwaV9uZXh0X3hmZXIobWFzdGVyLCBtc2cpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIEtlZXAgZ29pbmcsIHdlIHN0aWxsIGhhdmUgZGF0YSB0byBzZW5kIGluCi0JCQkgKiB0aGUgY3VycmVudCB0cmFuc2Zlci4KLQkJCSAqLwotCQkJYXRtZWxfc3BpX25leHRfeGZlcihtYXN0ZXIsIG1zZyk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9jaygmYXMtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdG1lbF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgYXRtZWxfc3BpCSphczsKLQlzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZQkqYXNkOwotCXUzMgkJCXNjYnIsIGNzcjsKLQl1bnNpZ25lZCBpbnQJCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JdW5zaWduZWQgbG9uZwkJYnVzX2h6OwotCXVuc2lnbmVkIGludAkJbnBjc19waW47Ci0JaW50CQkJcmV0OwotCi0JYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQotCWlmIChhcy0+c3RvcHBpbmcpCi0JCXJldHVybiAtRVNIVVRET1dOOwotCi0JaWYgKHNwaS0+Y2hpcF9zZWxlY3QgPiBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpIHsKLQkJZGV2X2RiZygmc3BpLT5kZXYsCi0JCQkJInNldHVwOiBpbnZhbGlkIGNoaXBzZWxlY3QgJXUgKCV1IGRlZmluZWQpXG4iLAotCQkJCXNwaS0+Y2hpcF9zZWxlY3QsIHNwaS0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChiaXRzIDwgOCB8fCBiaXRzID4gMTYpIHsKLQkJZGV2X2RiZygmc3BpLT5kZXYsCi0JCQkJInNldHVwOiBpbnZhbGlkIGJpdHNfcGVyX3dvcmQgJXUgKDggdG8gMTYpXG4iLAotCQkJCWJpdHMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBzZWUgbm90ZXMgYWJvdmUgcmUgY2hpcHNlbGVjdCAqLwotCWlmICghYXRtZWxfc3BpX2lzX3YyKCkKLQkJCSYmIHNwaS0+Y2hpcF9zZWxlY3QgPT0gMAotCQkJJiYgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSkgewotCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiBjYW4ndCBiZSBhY3RpdmUtaGlnaFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIHYxIGNoaXBzIHN0YXJ0IG91dCBhdCBoYWxmIHRoZSBwZXJpcGhlcmFsIGJ1cyBzcGVlZC4gKi8KLQlidXNfaHogPSBjbGtfZ2V0X3JhdGUoYXMtPmNsayk7Ci0JaWYgKCFhdG1lbF9zcGlfaXNfdjIoKSkKLQkJYnVzX2h6IC89IDI7Ci0KLQlpZiAoc3BpLT5tYXhfc3BlZWRfaHopIHsKLQkJLyoKLQkJICogQ2FsY3VsYXRlIHRoZSBsb3dlc3QgZGl2aWRlciB0aGF0IHNhdGlzZmllcyB0aGUKLQkJICogY29uc3RyYWludCwgYXNzdW1pbmcgZGl2MzIvZmRpdi9tYnogPT0gMC4KLQkJICovCi0JCXNjYnIgPSBESVZfUk9VTkRfVVAoYnVzX2h6LCBzcGktPm1heF9zcGVlZF9oeik7Ci0KLQkJLyoKLQkJICogSWYgdGhlIHJlc3VsdGluZyBkaXZpZGVyIGRvZXNuJ3QgZml0IGludG8gdGhlCi0JCSAqIHJlZ2lzdGVyIGJpdGZpZWxkLCB3ZSBjYW4ndCBzYXRpc2Z5IHRoZSBjb25zdHJhaW50LgotCQkgKi8KLQkJaWYgKHNjYnIgPj0gKDEgPDwgU1BJX1NDQlJfU0laRSkpIHsKLQkJCWRldl9kYmcoJnNwaS0+ZGV2LAotCQkJCSJzZXR1cDogJWQgSHogdG9vIHNsb3csIHNjYnIgJXU7IG1pbiAlbGQgSHpcbiIsCi0JCQkJc3BpLT5tYXhfc3BlZWRfaHosIHNjYnIsIGJ1c19oei8yNTUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UKLQkJLyogc3BlZWQgemVybyBtZWFucyAiYXMgc2xvdyBhcyBwb3NzaWJsZSIgKi8KLQkJc2NiciA9IDB4ZmY7Ci0KLQljc3IgPSBTUElfQkYoU0NCUiwgc2NicikgfCBTUElfQkYoQklUUywgYml0cyAtIDgpOwotCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKLQkJY3NyIHw9IFNQSV9CSVQoQ1BPTCk7Ci0JaWYgKCEoc3BpLT5tb2RlICYgU1BJX0NQSEEpKQotCQljc3IgfD0gU1BJX0JJVChOQ1BIQSk7Ci0KLQkvKiBETFlCUyBpcyBtb3N0bHkgaXJyZWxldmFudCBzaW5jZSB3ZSBtYW5hZ2UgY2hpcHNlbGVjdCB1c2luZyBHUElPcy4KLQkgKgotCSAqIERMWUJDVCB3b3VsZCBhZGQgZGVsYXlzIGJldHdlZW4gd29yZHMsIHNsb3dpbmcgZG93biB0cmFuc2ZlcnMuCi0JICogSXQgY291bGQgcG90ZW50aWFsbHkgYmUgdXNlZnVsIHRvIGNvcGUgd2l0aCBETUEgYm90dGxlbmVja3MsIGJ1dAotCSAqIGluIHRob3NlIGNhc2VzIGl0J3MgcHJvYmFibHkgYmVzdCB0byBqdXN0IHVzZSBhIGxvd2VyIGJpdHJhdGUuCi0JICovCi0JY3NyIHw9IFNQSV9CRihETFlCUywgMCk7Ci0JY3NyIHw9IFNQSV9CRihETFlCQ1QsIDApOwotCi0JLyogY2hpcHNlbGVjdCBtdXN0IGhhdmUgYmVlbiBtdXhlZCBhcyBHUElPIChlLmcuIGluIGJvYXJkIHNldHVwKSAqLwotCW5wY3NfcGluID0gKHVuc2lnbmVkIGludClzcGktPmNvbnRyb2xsZXJfZGF0YTsKLQlhc2QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0JaWYgKCFhc2QpIHsKLQkJYXNkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFhc2QpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlyZXQgPSBncGlvX3JlcXVlc3QobnBjc19waW4sIGRldl9uYW1lKCZzcGktPmRldikpOwotCQlpZiAocmV0KSB7Ci0JCQlrZnJlZShhc2QpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCWFzZC0+bnBjc19waW4gPSBucGNzX3BpbjsKLQkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gYXNkOwotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobnBjc19waW4sICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXMtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGFzLT5zdGF5ID09IHNwaSkKLQkJCWFzLT5zdGF5ID0gTlVMTDsKLQkJY3NfZGVhY3RpdmF0ZShhcywgc3BpKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXMtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlhc2QtPmNzciA9IGNzcjsKLQotCWRldl9kYmcoJnNwaS0+ZGV2LAotCQkic2V0dXA6ICVsdSBIeiBicHcgJXUgbW9kZSAweCV4IC0+IGNzciVkICUwOHhcbiIsCi0JCWJ1c19oeiAvIHNjYnIsIGJpdHMsIHNwaS0+bW9kZSwgc3BpLT5jaGlwX3NlbGVjdCwgY3NyKTsKLQotCWlmICghYXRtZWxfc3BpX2lzX3YyKCkpCi0JCXNwaV93cml0ZWwoYXMsIENTUjAgKyA0ICogc3BpLT5jaGlwX3NlbGVjdCwgY3NyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0bWVsX3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKLXsKLQlzdHJ1Y3QgYXRtZWxfc3BpCSphczsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp4ZmVyOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCXN0cnVjdCBkZXZpY2UJCSpjb250cm9sbGVyID0gc3BpLT5tYXN0ZXItPmRldi5wYXJlbnQ7Ci0JdTgJCQliaXRzOwotCXN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlCSphc2Q7Ci0KLQlhcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JZGV2X2RiZyhjb250cm9sbGVyLCAibmV3IG1lc3NhZ2UgJXAgc3VibWl0dGVkIGZvciAlc1xuIiwKLQkJCW1zZywgZGV2X25hbWUoJnNwaS0+ZGV2KSk7Ci0KLQlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmbXNnLT50cmFuc2ZlcnMpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoYXMtPnN0b3BwaW5nKQotCQlyZXR1cm4gLUVTSFVURE9XTjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmICghKHhmZXItPnR4X2J1ZiB8fCB4ZmVyLT5yeF9idWYpICYmIHhmZXItPmxlbikgewotCQkJZGV2X2RiZygmc3BpLT5kZXYsICJtaXNzaW5nIHJ4IG9yIHR4IGJ1ZlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmICh4ZmVyLT5iaXRzX3Blcl93b3JkKSB7Ci0JCQlhc2QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0JCQliaXRzID0gKGFzZC0+Y3NyID4+IDQpICYgMHhmOwotCQkJaWYgKGJpdHMgIT0geGZlci0+Yml0c19wZXJfd29yZCAtIDgpIHsKLQkJCQlkZXZfZGJnKCZzcGktPmRldiwgInlvdSBjYW4ndCB5ZXQgY2hhbmdlICIKLQkJCQkJICJiaXRzX3Blcl93b3JkIGluIHRyYW5zZmVyc1xuIik7Ci0JCQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKLQkJCX0KLQkJfQotCi0JCS8qIEZJWE1FIGltcGxlbWVudCB0aGVzZSBwcm90b2NvbCBvcHRpb25zISEgKi8KLQkJaWYgKHhmZXItPnNwZWVkX2h6KSB7Ci0JCQlkZXZfZGJnKCZzcGktPmRldiwgIm5vIHByb3RvY29sIG9wdGlvbnMgeWV0XG4iKTsKLQkJCXJldHVybiAtRU5PUFJPVE9PUFQ7Ci0JCX0KLQotCQkvKgotCQkgKiBETUEgbWFwIGVhcmx5LCBmb3IgcGVyZm9ybWFuY2UgKGVtcHRpZXMgZGNhY2hlIEFTQVApIGFuZAotCQkgKiBiZXR0ZXIgZmF1bHQgcmVwb3J0aW5nLiAgVGhpcyBpcyBhIERNQS1vbmx5IGRyaXZlci4KLQkJICoKLQkJICogTk9URSB0aGF0IGlmIGRtYV91bm1hcF9zaW5nbGUoKSBldmVyIHN0YXJ0cyB0byBkbyB3b3JrIG9uCi0JCSAqIHBsYXRmb3JtcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIsIHdlIHdvdWxkIG5lZWQgdG8gY2xlYW4KLQkJICogdXAgbWFwcGluZ3MgZm9yIHByZXZpb3VzbHktbWFwcGVkIHRyYW5zZmVycy4KLQkJICovCi0JCWlmICghbXNnLT5pc19kbWFfbWFwcGVkKSB7Ci0JCQlpZiAoYXRtZWxfc3BpX2RtYV9tYXBfeGZlcihhcywgeGZlcikgPCAwKQotCQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCi0jaWZkZWYgVkVSQk9TRQotCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWRldl9kYmcoY29udHJvbGxlciwKLQkJCSIgIHhmZXIgJXA6IGxlbiAldSB0eCAlcC8lMDh4IHJ4ICVwLyUwOHhcbiIsCi0JCQl4ZmVyLCB4ZmVyLT5sZW4sCi0JCQl4ZmVyLT50eF9idWYsIHhmZXItPnR4X2RtYSwKLQkJCXhmZXItPnJ4X2J1ZiwgeGZlci0+cnhfZG1hKTsKLQl9Ci0jZW5kaWYKLQotCW1zZy0+c3RhdHVzID0gLUVJTlBST0dSRVNTOwotCW1zZy0+YWN0dWFsX2xlbmd0aCA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXMtPmxvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZtc2ctPnF1ZXVlLCAmYXMtPnF1ZXVlKTsKLQlpZiAoIWFzLT5jdXJyZW50X3RyYW5zZmVyKQotCQlhdG1lbF9zcGlfbmV4dF9tZXNzYWdlKHNwaS0+bWFzdGVyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcy0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0bWVsX3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IGF0bWVsX3NwaQkqYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZQkqYXNkID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCXVuc2lnbmVkCQlncGlvID0gKHVuc2lnbmVkKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCWlmICghYXNkKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXMtPmxvY2ssIGZsYWdzKTsKLQlpZiAoYXMtPnN0YXkgPT0gc3BpKSB7Ci0JCWFzLT5zdGF5ID0gTlVMTDsKLQkJY3NfZGVhY3RpdmF0ZShhcywgc3BpKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXMtPmxvY2ssIGZsYWdzKTsKLQotCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IE5VTEw7Ci0JZ3Bpb19mcmVlKGdwaW8pOwotCWtmcmVlKGFzZCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgX19pbml0IGF0bWVsX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCByZXNvdXJjZQkJKnJlZ3M7Ci0JaW50CQkJaXJxOwotCXN0cnVjdCBjbGsJCSpjbGs7Ci0JaW50CQkJcmV0OwotCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7Ci0Jc3RydWN0IGF0bWVsX3NwaQkqYXM7Ci0KLQlyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlZ3MpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChpcnEgPCAwKQotCQlyZXR1cm4gaXJxOwotCi0JY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAic3BpX2NsayIpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKLQotCS8qIHNldHVwIHNwaSBjb3JlIHRoZW4gYXRtZWwtc3BlY2lmaWMgZHJpdmVyIHN0YXRlICovCi0JcmV0ID0gLUVOT01FTTsKLQltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZiAqYXMpOwotCWlmICghbWFzdGVyKQotCQlnb3RvIG91dF9mcmVlOwotCi0JLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCi0JbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7Ci0KLQltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKLQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gNDsKLQltYXN0ZXItPnNldHVwID0gYXRtZWxfc3BpX3NldHVwOwotCW1hc3Rlci0+dHJhbnNmZXIgPSBhdG1lbF9zcGlfdHJhbnNmZXI7Ci0JbWFzdGVyLT5jbGVhbnVwID0gYXRtZWxfc3BpX2NsZWFudXA7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKLQotCWFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCi0JLyoKLQkgKiBTY3JhdGNoIGJ1ZmZlciBpcyB1c2VkIGZvciB0aHJvd2F3YXkgcnggYW5kIHR4IGRhdGEuCi0JICogSXQncyBjb2hlcmVudCB0byBtaW5pbWl6ZSBkY2FjaGUgcG9sbHV0aW9uLgotCSAqLwotCWFzLT5idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgQlVGRkVSX1NJWkUsCi0JCQkJCSZhcy0+YnVmZmVyX2RtYSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhcy0+YnVmZmVyKQotCQlnb3RvIG91dF9mcmVlOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmFzLT5sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmYXMtPnF1ZXVlKTsKLQlhcy0+cGRldiA9IHBkZXY7Ci0JYXMtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKLQlpZiAoIWFzLT5yZWdzKQotCQlnb3RvIG91dF9mcmVlX2J1ZmZlcjsKLQlhcy0+aXJxID0gaXJxOwotCWFzLT5jbGsgPSBjbGs7Ci0KLQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGF0bWVsX3NwaV9pbnRlcnJ1cHQsIDAsCi0JCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwgbWFzdGVyKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF91bm1hcF9yZWdzOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgKi8KLQljbGtfZW5hYmxlKGNsayk7Ci0Jc3BpX3dyaXRlbChhcywgQ1IsIFNQSV9CSVQoU1dSU1QpKTsKLQlzcGlfd3JpdGVsKGFzLCBDUiwgU1BJX0JJVChTV1JTVCkpOyAvKiBBVDkxU0FNOTI2MyBSZXYgQiB3b3JrYXJvdW5kICovCi0Jc3BpX3dyaXRlbChhcywgTVIsIFNQSV9CSVQoTVNUUikgfCBTUElfQklUKE1PREZESVMpKTsKLQlzcGlfd3JpdGVsKGFzLCBQVENSLCBTUElfQklUKFJYVERJUykgfCBTUElfQklUKFRYVERJUykpOwotCXNwaV93cml0ZWwoYXMsIENSLCBTUElfQklUKFNQSUVOKSk7Ci0KLQkvKiBnbyEgKi8KLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQXRtZWwgU1BJIENvbnRyb2xsZXIgYXQgMHglMDhseCAoaXJxICVkKVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKXJlZ3MtPnN0YXJ0LCBpcnEpOwotCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3Jlc2V0X2h3OwotCi0JcmV0dXJuIDA7Ci0KLW91dF9yZXNldF9odzoKLQlzcGlfd3JpdGVsKGFzLCBDUiwgU1BJX0JJVChTV1JTVCkpOwotCXNwaV93cml0ZWwoYXMsIENSLCBTUElfQklUKFNXUlNUKSk7IC8qIEFUOTFTQU05MjYzIFJldiBCIHdvcmthcm91bmQgKi8KLQljbGtfZGlzYWJsZShjbGspOwotCWZyZWVfaXJxKGlycSwgbWFzdGVyKTsKLW91dF91bm1hcF9yZWdzOgotCWlvdW5tYXAoYXMtPnJlZ3MpOwotb3V0X2ZyZWVfYnVmZmVyOgotCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIEJVRkZFUl9TSVpFLCBhcy0+YnVmZmVyLAotCQkJYXMtPmJ1ZmZlcl9kbWEpOwotb3V0X2ZyZWU6Ci0JY2xrX3B1dChjbGspOwotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgYXRtZWxfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UJKm1zZzsKLQotCS8qIHJlc2V0IHRoZSBoYXJkd2FyZSBhbmQgYmxvY2sgcXVldWUgcHJvZ3Jlc3MgKi8KLQlzcGluX2xvY2tfaXJxKCZhcy0+bG9jayk7Ci0JYXMtPnN0b3BwaW5nID0gMTsKLQlzcGlfd3JpdGVsKGFzLCBDUiwgU1BJX0JJVChTV1JTVCkpOwotCXNwaV93cml0ZWwoYXMsIENSLCBTUElfQklUKFNXUlNUKSk7IC8qIEFUOTFTQU05MjYzIFJldiBCIHdvcmthcm91bmQgKi8KLQlzcGlfcmVhZGwoYXMsIFNSKTsKLQlzcGluX3VubG9ja19pcnEoJmFzLT5sb2NrKTsKLQotCS8qIFRlcm1pbmF0ZSByZW1haW5pbmcgcXVldWVkIHRyYW5zZmVycyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkobXNnLCAmYXMtPnF1ZXVlLCBxdWV1ZSkgewotCQkvKiBSRVZJU0lUIHVubWFwcGluZyB0aGUgZG1hIGlzIGEgTk9QIG9uIEFSTSBhbmQgQVZSMzIKLQkJICogYnV0IHdlIHNob3VsZG4ndCBkZXBlbmQgb24gdGhhdC4uLgotCQkgKi8KLQkJbXNnLT5zdGF0dXMgPSAtRVNIVVRET1dOOwotCQltc2ctPmNvbXBsZXRlKG1zZy0+Y29udGV4dCk7Ci0JfQotCi0JZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgQlVGRkVSX1NJWkUsIGFzLT5idWZmZXIsCi0JCQlhcy0+YnVmZmVyX2RtYSk7Ci0KLQljbGtfZGlzYWJsZShhcy0+Y2xrKTsKLQljbGtfcHV0KGFzLT5jbGspOwotCWZyZWVfaXJxKGFzLT5pcnEsIG1hc3Rlcik7Ci0JaW91bm1hcChhcy0+cmVncyk7Ci0KLQlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYJQ09ORklHX1BNCi0KLXN0YXRpYyBpbnQgYXRtZWxfc3BpX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCi17Ci0Jc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBhdG1lbF9zcGkJKmFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCi0JY2xrX2Rpc2FibGUoYXMtPmNsayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXRtZWxfc3BpX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQotCWNsa19lbmFibGUoYXMtPmNsayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi0jZGVmaW5lCWF0bWVsX3NwaV9zdXNwZW5kCU5VTEwKLSNkZWZpbmUJYXRtZWxfc3BpX3Jlc3VtZQlOVUxMCi0jZW5kaWYKLQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdG1lbF9zcGlfZHJpdmVyID0gewotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJhdG1lbF9zcGkiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotCS5zdXNwZW5kCT0gYXRtZWxfc3BpX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBhdG1lbF9zcGlfcmVzdW1lLAotCS5yZW1vdmUJCT0gX19leGl0X3AoYXRtZWxfc3BpX3JlbW92ZSksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdG1lbF9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmF0bWVsX3NwaV9kcml2ZXIsIGF0bWVsX3NwaV9wcm9iZSk7Ci19Ci1tb2R1bGVfaW5pdChhdG1lbF9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdG1lbF9zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdG1lbF9zcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGF0bWVsX3NwaV9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJBdG1lbCBBVDMyL0FUOTEgU1BJIENvbnRyb2xsZXIgZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJIYWF2YXJkIFNraW5uZW1vZW4gKEF0bWVsKSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphdG1lbF9zcGkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5oIGIvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMDZiNmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIFJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciBBdG1lbCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXRtZWwgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0jaWZuZGVmIF9fQVRNRUxfU1BJX0hfXwotI2RlZmluZSBfX0FUTUVMX1NQSV9IX18KLQotLyogU1BJIHJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgU1BJX0NSCQkJCQkweDAwMDAKLSNkZWZpbmUgU1BJX01SCQkJCQkweDAwMDQKLSNkZWZpbmUgU1BJX1JEUgkJCQkJMHgwMDA4Ci0jZGVmaW5lIFNQSV9URFIJCQkJCTB4MDAwYwotI2RlZmluZSBTUElfU1IJCQkJCTB4MDAxMAotI2RlZmluZSBTUElfSUVSCQkJCQkweDAwMTQKLSNkZWZpbmUgU1BJX0lEUgkJCQkJMHgwMDE4Ci0jZGVmaW5lIFNQSV9JTVIJCQkJCTB4MDAxYwotI2RlZmluZSBTUElfQ1NSMAkJCQkweDAwMzAKLSNkZWZpbmUgU1BJX0NTUjEJCQkJMHgwMDM0Ci0jZGVmaW5lIFNQSV9DU1IyCQkJCTB4MDAzOAotI2RlZmluZSBTUElfQ1NSMwkJCQkweDAwM2MKLSNkZWZpbmUgU1BJX1JQUgkJCQkJMHgwMTAwCi0jZGVmaW5lIFNQSV9SQ1IJCQkJCTB4MDEwNAotI2RlZmluZSBTUElfVFBSCQkJCQkweDAxMDgKLSNkZWZpbmUgU1BJX1RDUgkJCQkJMHgwMTBjCi0jZGVmaW5lIFNQSV9STlBSCQkJCTB4MDExMAotI2RlZmluZSBTUElfUk5DUgkJCQkweDAxMTQKLSNkZWZpbmUgU1BJX1ROUFIJCQkJMHgwMTE4Ci0jZGVmaW5lIFNQSV9UTkNSCQkJCTB4MDExYwotI2RlZmluZSBTUElfUFRDUgkJCQkweDAxMjAKLSNkZWZpbmUgU1BJX1BUU1IJCQkJMHgwMTI0Ci0KLS8qIEJpdGZpZWxkcyBpbiBDUiAqLwotI2RlZmluZSBTUElfU1BJRU5fT0ZGU0VUCQkJMAotI2RlZmluZSBTUElfU1BJRU5fU0laRQkJCQkxCi0jZGVmaW5lIFNQSV9TUElESVNfT0ZGU0VUCQkJMQotI2RlZmluZSBTUElfU1BJRElTX1NJWkUJCQkJMQotI2RlZmluZSBTUElfU1dSU1RfT0ZGU0VUCQkJNwotI2RlZmluZSBTUElfU1dSU1RfU0laRQkJCQkxCi0jZGVmaW5lIFNQSV9MQVNUWEZFUl9PRkZTRVQJCQkyNAotI2RlZmluZSBTUElfTEFTVFhGRVJfU0laRQkJCTEKLQotLyogQml0ZmllbGRzIGluIE1SICovCi0jZGVmaW5lIFNQSV9NU1RSX09GRlNFVAkJCQkwCi0jZGVmaW5lIFNQSV9NU1RSX1NJWkUJCQkJMQotI2RlZmluZSBTUElfUFNfT0ZGU0VUCQkJCTEKLSNkZWZpbmUgU1BJX1BTX1NJWkUJCQkJMQotI2RlZmluZSBTUElfUENTREVDX09GRlNFVAkJCTIKLSNkZWZpbmUgU1BJX1BDU0RFQ19TSVpFCQkJCTEKLSNkZWZpbmUgU1BJX0ZESVZfT0ZGU0VUCQkJCTMKLSNkZWZpbmUgU1BJX0ZESVZfU0laRQkJCQkxCi0jZGVmaW5lIFNQSV9NT0RGRElTX09GRlNFVAkJCTQKLSNkZWZpbmUgU1BJX01PREZESVNfU0laRQkJCTEKLSNkZWZpbmUgU1BJX0xMQl9PRkZTRVQJCQkJNwotI2RlZmluZSBTUElfTExCX1NJWkUJCQkJMQotI2RlZmluZSBTUElfUENTX09GRlNFVAkJCQkxNgotI2RlZmluZSBTUElfUENTX1NJWkUJCQkJNAotI2RlZmluZSBTUElfRExZQkNTX09GRlNFVAkJCTI0Ci0jZGVmaW5lIFNQSV9ETFlCQ1NfU0laRQkJCQk4Ci0KLS8qIEJpdGZpZWxkcyBpbiBSRFIgKi8KLSNkZWZpbmUgU1BJX1JEX09GRlNFVAkJCQkwCi0jZGVmaW5lIFNQSV9SRF9TSVpFCQkJCTE2Ci0KLS8qIEJpdGZpZWxkcyBpbiBURFIgKi8KLSNkZWZpbmUgU1BJX1REX09GRlNFVAkJCQkwCi0jZGVmaW5lIFNQSV9URF9TSVpFCQkJCTE2Ci0KLS8qIEJpdGZpZWxkcyBpbiBTUiAqLwotI2RlZmluZSBTUElfUkRSRl9PRkZTRVQJCQkJMAotI2RlZmluZSBTUElfUkRSRl9TSVpFCQkJCTEKLSNkZWZpbmUgU1BJX1REUkVfT0ZGU0VUCQkJCTEKLSNkZWZpbmUgU1BJX1REUkVfU0laRQkJCQkxCi0jZGVmaW5lIFNQSV9NT0RGX09GRlNFVAkJCQkyCi0jZGVmaW5lIFNQSV9NT0RGX1NJWkUJCQkJMQotI2RlZmluZSBTUElfT1ZSRVNfT0ZGU0VUCQkJMwotI2RlZmluZSBTUElfT1ZSRVNfU0laRQkJCQkxCi0jZGVmaW5lIFNQSV9FTkRSWF9PRkZTRVQJCQk0Ci0jZGVmaW5lIFNQSV9FTkRSWF9TSVpFCQkJCTEKLSNkZWZpbmUgU1BJX0VORFRYX09GRlNFVAkJCTUKLSNkZWZpbmUgU1BJX0VORFRYX1NJWkUJCQkJMQotI2RlZmluZSBTUElfUlhCVUZGX09GRlNFVAkJCTYKLSNkZWZpbmUgU1BJX1JYQlVGRl9TSVpFCQkJCTEKLSNkZWZpbmUgU1BJX1RYQlVGRV9PRkZTRVQJCQk3Ci0jZGVmaW5lIFNQSV9UWEJVRkVfU0laRQkJCQkxCi0jZGVmaW5lIFNQSV9OU1NSX09GRlNFVAkJCQk4Ci0jZGVmaW5lIFNQSV9OU1NSX1NJWkUJCQkJMQotI2RlZmluZSBTUElfVFhFTVBUWV9PRkZTRVQJCQk5Ci0jZGVmaW5lIFNQSV9UWEVNUFRZX1NJWkUJCQkxCi0jZGVmaW5lIFNQSV9TUElFTlNfT0ZGU0VUCQkJMTYKLSNkZWZpbmUgU1BJX1NQSUVOU19TSVpFCQkJCTEKLQotLyogQml0ZmllbGRzIGluIENTUjAgKi8KLSNkZWZpbmUgU1BJX0NQT0xfT0ZGU0VUCQkJCTAKLSNkZWZpbmUgU1BJX0NQT0xfU0laRQkJCQkxCi0jZGVmaW5lIFNQSV9OQ1BIQV9PRkZTRVQJCQkxCi0jZGVmaW5lIFNQSV9OQ1BIQV9TSVpFCQkJCTEKLSNkZWZpbmUgU1BJX0NTQUFUX09GRlNFVAkJCTMKLSNkZWZpbmUgU1BJX0NTQUFUX1NJWkUJCQkJMQotI2RlZmluZSBTUElfQklUU19PRkZTRVQJCQkJNAotI2RlZmluZSBTUElfQklUU19TSVpFCQkJCTQKLSNkZWZpbmUgU1BJX1NDQlJfT0ZGU0VUCQkJCTgKLSNkZWZpbmUgU1BJX1NDQlJfU0laRQkJCQk4Ci0jZGVmaW5lIFNQSV9ETFlCU19PRkZTRVQJCQkxNgotI2RlZmluZSBTUElfRExZQlNfU0laRQkJCQk4Ci0jZGVmaW5lIFNQSV9ETFlCQ1RfT0ZGU0VUCQkJMjQKLSNkZWZpbmUgU1BJX0RMWUJDVF9TSVpFCQkJCTgKLQotLyogQml0ZmllbGRzIGluIFJDUiAqLwotI2RlZmluZSBTUElfUlhDVFJfT0ZGU0VUCQkJMAotI2RlZmluZSBTUElfUlhDVFJfU0laRQkJCQkxNgotCi0vKiBCaXRmaWVsZHMgaW4gVENSICovCi0jZGVmaW5lIFNQSV9UWENUUl9PRkZTRVQJCQkwCi0jZGVmaW5lIFNQSV9UWENUUl9TSVpFCQkJCTE2Ci0KLS8qIEJpdGZpZWxkcyBpbiBSTkNSICovCi0jZGVmaW5lIFNQSV9SWE5DUl9PRkZTRVQJCQkwCi0jZGVmaW5lIFNQSV9SWE5DUl9TSVpFCQkJCTE2Ci0KLS8qIEJpdGZpZWxkcyBpbiBUTkNSICovCi0jZGVmaW5lIFNQSV9UWE5DUl9PRkZTRVQJCQkwCi0jZGVmaW5lIFNQSV9UWE5DUl9TSVpFCQkJCTE2Ci0KLS8qIEJpdGZpZWxkcyBpbiBQVENSICovCi0jZGVmaW5lIFNQSV9SWFRFTl9PRkZTRVQJCQkwCi0jZGVmaW5lIFNQSV9SWFRFTl9TSVpFCQkJCTEKLSNkZWZpbmUgU1BJX1JYVERJU19PRkZTRVQJCQkxCi0jZGVmaW5lIFNQSV9SWFRESVNfU0laRQkJCQkxCi0jZGVmaW5lIFNQSV9UWFRFTl9PRkZTRVQJCQk4Ci0jZGVmaW5lIFNQSV9UWFRFTl9TSVpFCQkJCTEKLSNkZWZpbmUgU1BJX1RYVERJU19PRkZTRVQJCQk5Ci0jZGVmaW5lIFNQSV9UWFRESVNfU0laRQkJCQkxCi0KLS8qIENvbnN0YW50cyBmb3IgQklUUyAqLwotI2RlZmluZSBTUElfQklUU184X0JQVAkJCQkwCi0jZGVmaW5lIFNQSV9CSVRTXzlfQlBUCQkJCTEKLSNkZWZpbmUgU1BJX0JJVFNfMTBfQlBUCQkJCTIKLSNkZWZpbmUgU1BJX0JJVFNfMTFfQlBUCQkJCTMKLSNkZWZpbmUgU1BJX0JJVFNfMTJfQlBUCQkJCTQKLSNkZWZpbmUgU1BJX0JJVFNfMTNfQlBUCQkJCTUKLSNkZWZpbmUgU1BJX0JJVFNfMTRfQlBUCQkJCTYKLSNkZWZpbmUgU1BJX0JJVFNfMTVfQlBUCQkJCTcKLSNkZWZpbmUgU1BJX0JJVFNfMTZfQlBUCQkJCTgKLQotLyogQml0IG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KLSNkZWZpbmUgU1BJX0JJVChuYW1lKSBcCi0JKDEgPDwgU1BJXyMjbmFtZSMjX09GRlNFVCkKLSNkZWZpbmUgU1BJX0JGKG5hbWUsdmFsdWUpIFwKLQkoKCh2YWx1ZSkgJiAoKDEgPDwgU1BJXyMjbmFtZSMjX1NJWkUpIC0gMSkpIDw8IFNQSV8jI25hbWUjI19PRkZTRVQpCi0jZGVmaW5lIFNQSV9CRkVYVChuYW1lLHZhbHVlKSBcCi0JKCgodmFsdWUpID4+IFNQSV8jI25hbWUjI19PRkZTRVQpICYgKCgxIDw8IFNQSV8jI25hbWUjI19TSVpFKSAtIDEpKQotI2RlZmluZSBTUElfQkZJTlMobmFtZSx2YWx1ZSxvbGQpIFwKLQkoICgob2xkKSAmIH4oKCgxIDw8IFNQSV8jI25hbWUjI19TSVpFKSAtIDEpIDw8IFNQSV8jI25hbWUjI19PRkZTRVQpKSBcCi0JICB8IFNQSV9CRihuYW1lLHZhbHVlKSkKLQotLyogUmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLwotI2RlZmluZSBzcGlfcmVhZGwocG9ydCxyZWcpIFwKLQlfX3Jhd19yZWFkbCgocG9ydCktPnJlZ3MgKyBTUElfIyNyZWcpCi0jZGVmaW5lIHNwaV93cml0ZWwocG9ydCxyZWcsdmFsdWUpIFwKLQlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKHBvcnQpLT5yZWdzICsgU1BJXyMjcmVnKQotCi0jZW5kaWYgLyogX19BVE1FTF9TUElfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9hdTE1NTBfc3BpLmMgYi9kcml2ZXJzL3NwaS9hdTE1NTBfc3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MDU2M2QuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvYXUxNTUwX3NwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMiArMCwwIEBACi0vKgotICogYXUxNTUwX3NwaS5jIC0gYXUxNTUwIHBzYyBzcGkgY29udHJvbGxlciBkcml2ZXIKLSAqIG1heSB3b3JrIGFsc28gd2l0aCBhdTEyMDAsIGF1MTIxMCwgYXUxMjUwCi0gKiB3aWxsIG5vdCB3b3JrIG9uIGF1MTAwMCwgYXUxMTAwIGFuZCBhdTE1MDAgKG5vIGZ1bGwgc3BpIGNvbnRyb2xsZXIgdGhlcmUpCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEFUUk9OIGVsZWN0cm9uaWMgR21iSAotICogQXV0aG9yOiBKYW4gTmlraXRlbmtvIDxqYW4ubmlraXRlbmtvQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9wc2MuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxNTUwX3NwaS5oPgotCi1zdGF0aWMgdW5zaWduZWQgdXNlZG1hID0gMTsKLW1vZHVsZV9wYXJhbSh1c2VkbWEsIHVpbnQsIDA2NDQpOwotCi0vKgotI2RlZmluZSBBVTE1NTBfU1BJX0RFQlVHX0xPT1BCQUNLCi0qLwotCi0KLSNkZWZpbmUgQVUxNTUwX1NQSV9EQkRNQV9ERVNDUklQVE9SUyAxCi0jZGVmaW5lIEFVMTU1MF9TUElfRE1BX1JYVE1QX01JTlNJWkUgMjA0OFUKLQotc3RydWN0IGF1MTU1MF9zcGkgewotCXN0cnVjdCBzcGlfYml0YmFuZyBiaXRiYW5nOwotCi0Jdm9sYXRpbGUgcHNjX3NwaV90IF9faW9tZW0gKnJlZ3M7Ci0JaW50IGlycTsKLQl1bnNpZ25lZCBmcmVxX21heDsKLQl1bnNpZ25lZCBmcmVxX21pbjsKLQotCXVuc2lnbmVkIGxlbjsKLQl1bnNpZ25lZCB0eF9jb3VudDsKLQl1bnNpZ25lZCByeF9jb3VudDsKLQljb25zdCB1OCAqdHg7Ci0JdTggKnJ4OwotCi0Jdm9pZCAoKnJ4X3dvcmQpKHN0cnVjdCBhdTE1NTBfc3BpICpodyk7Ci0Jdm9pZCAoKnR4X3dvcmQpKHN0cnVjdCBhdTE1NTBfc3BpICpodyk7Ci0JaW50ICgqdHhyeF9idWZzKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KTsKLQlpcnFyZXR1cm5fdCAoKmlycV9jYWxsYmFjaykoc3RydWN0IGF1MTU1MF9zcGkgKmh3KTsKLQotCXN0cnVjdCBjb21wbGV0aW9uIG1hc3Rlcl9kb25lOwotCi0JdW5zaWduZWQgdXNlZG1hOwotCXUzMiBkbWFfdHhfaWQ7Ci0JdTMyIGRtYV9yeF9pZDsKLQl1MzIgZG1hX3R4X2NoOwotCXUzMiBkbWFfcnhfY2g7Ci0KLQl1OCAqZG1hX3J4X3RtcGJ1ZjsKLQl1bnNpZ25lZCBkbWFfcnhfdG1wYnVmX3NpemU7Ci0JdTMyIGRtYV9yeF90bXBidWZfYWRkcjsKLQotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBhdTE1NTBfc3BpX2luZm8gKnBkYXRhOwotCXN0cnVjdCByZXNvdXJjZSAqaW9hcmVhOwotfTsKLQotCi0vKiB3ZSB1c2UgYW4gOC1iaXQgbWVtb3J5IGRldmljZSBmb3IgZG1hIHRyYW5zZmVycyB0by9mcm9tIHNwaSBmaWZvICovCi1zdGF0aWMgZGJkZXZfdGFiX3QgYXUxNTUwX3NwaV9tZW1fZGJkZXYgPQotewotCS5kZXZfaWQJCQk9IERCRE1BX01FTV9DSEFOLAotCS5kZXZfZmxhZ3MJCT0gREVWX0ZMQUdTX0FOWVVTRXxERVZfRkxBR1NfU1lOQywKLQkuZGV2X3RzaXplCQk9IDAsCi0JLmRldl9kZXZ3aWR0aAkJPSA4LAotCS5kZXZfcGh5c2FkZHIJCT0gMHgwMDAwMDAwMCwKLQkuZGV2X2ludGxldmVsCQk9IDAsCi0JLmRldl9pbnRwb2xhcml0eQk9IDAKLX07Ci0KLXN0YXRpYyBpbnQgZGRtYV9tZW1pZDsJLyogaWQgdG8gYWJvdmUgbWVtIGRtYSBkZXZpY2UgKi8KLQotc3RhdGljIHZvaWQgYXUxNTUwX3NwaV9iaXRzX2hhbmRsZXJzX3NldChzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcsIGludCBicHcpOwotCi0KLS8qCi0gKiAgY29tcHV0ZSBCUkcgYW5kIERJViBiaXRzIHRvIHNldHVwIHNwaSBjbG9jayBiYXNlZCBvbiBtYWluIGlucHV0IGNsb2NrIHJhdGUKLSAqICB0aGF0IHdhcyBzcGVjaWZpZWQgaW4gcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUKLSAqICBhY2NvcmRpbmcgdG8gYXUxNTUwIGRhdGFzaGVldDoKLSAqICAgIHBzY190ZW1wY2xrID0gcHNjX21haW5jbGsgLyAoMiA8PCBESVYpCi0gKiAgICBzcGljbGsgPSBwc2NfdGVtcGNsayAvICgyICogKEJSRyArIDEpKQotICogICAgQlJHIHZhbGlkIHJhbmdlIGlzIDQuLjYzCi0gKiAgICBESVYgdmFsaWQgcmFuZ2UgaXMgMC4uMwotICovCi1zdGF0aWMgdTMyIGF1MTU1MF9zcGlfYmF1ZGNmZyhzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcsIHVuc2lnbmVkIHNwZWVkX2h6KQotewotCXUzMiBtYWluY2xrX2h6ID0gaHctPnBkYXRhLT5tYWluY2xrX2h6OwotCXUzMiBkaXYsIGJyZzsKLQotCWZvciAoZGl2ID0gMDsgZGl2IDwgNDsgZGl2KyspIHsKLQkJYnJnID0gbWFpbmNsa19oeiAvIHNwZWVkX2h6IC8gKDQgPDwgZGl2KTsKLQkJLyogbm93IHdlIGhhdmUgQlJHKzEgaW4gYnJnLCBzbyBjb3VudCB3aXRoIHRoYXQgKi8KLQkJaWYgKGJyZyA8ICg0ICsgMSkpIHsKLQkJCWJyZyA9ICg0ICsgMSk7CS8qIHNwZWVkX2h6IHRvbyBiaWcgKi8KLQkJCWJyZWFrOwkJLyogc2V0IGxvd2VzdCBicmcgKGRpdiBpcyA9PSAwKSAqLwotCQl9Ci0JCWlmIChicmcgPD0gKDYzICsgMSkpCi0JCQlicmVhazsJCS8qIHdlIGhhdmUgdmFsaWQgYnJnIGFuZCBkaXYgKi8KLQl9Ci0JaWYgKGRpdiA9PSA0KSB7Ci0JCWRpdiA9IDM7CQkvKiBzcGVlZF9oeiB0b28gc21hbGwgKi8KLQkJYnJnID0gKDYzICsgMSk7CQkvKiBzZXQgaGlnaGVzdCBicmcgYW5kIGRpdiAqLwotCX0KLQlicmctLTsKLQlyZXR1cm4gUFNDX1NQSUNGR19TRVRfQkFVRChicmcpIHwgUFNDX1NQSUNGR19TRVRfRElWKGRpdik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdTE1NTBfc3BpX21hc2tfYWNrX2FsbChzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcpCi17Ci0JaHctPnJlZ3MtPnBzY19zcGltc2sgPQotCQkgIFBTQ19TUElNU0tfTU0gfCBQU0NfU1BJTVNLX1JSIHwgUFNDX1NQSU1TS19STwotCQl8IFBTQ19TUElNU0tfUlUgfCBQU0NfU1BJTVNLX1RSIHwgUFNDX1NQSU1TS19UTwotCQl8IFBTQ19TUElNU0tfVFUgfCBQU0NfU1BJTVNLX1NEIHwgUFNDX1NQSU1TS19NRDsKLQlhdV9zeW5jKCk7Ci0KLQlody0+cmVncy0+cHNjX3NwaWV2ZW50ID0KLQkJICBQU0NfU1BJRVZOVF9NTSB8IFBTQ19TUElFVk5UX1JSIHwgUFNDX1NQSUVWTlRfUk8KLQkJfCBQU0NfU1BJRVZOVF9SVSB8IFBTQ19TUElFVk5UX1RSIHwgUFNDX1NQSUVWTlRfVE8KLQkJfCBQU0NfU1BJRVZOVF9UVSB8IFBTQ19TUElFVk5UX1NEIHwgUFNDX1NQSUVWTlRfTUQ7Ci0JYXVfc3luYygpOwotfQotCi1zdGF0aWMgdm9pZCBhdTE1NTBfc3BpX3Jlc2V0X2ZpZm9zKHN0cnVjdCBhdTE1NTBfc3BpICpodykKLXsKLQl1MzIgcGNyOwotCi0JaHctPnJlZ3MtPnBzY19zcGlwY3IgPSBQU0NfU1BJUENSX1JDIHwgUFNDX1NQSVBDUl9UQzsKLQlhdV9zeW5jKCk7Ci0JZG8gewotCQlwY3IgPSBody0+cmVncy0+cHNjX3NwaXBjcjsKLQkJYXVfc3luYygpOwotCX0gd2hpbGUgKHBjciAhPSAwKTsKLX0KLQotLyoKLSAqIGRtYSB0cmFuc2ZlcnMgYXJlIHVzZWQgZm9yIHRoZSBtb3N0IGNvbW1vbiBzcGkgd29yZCBzaXplIG9mIDgtYml0cwotICogd2UgY2Fubm90IGVhc2lseSBjaGFuZ2UgYWxyZWFkeSBzZXQgdXAgZG1hIGNoYW5uZWxzJyB3aWR0aCwgc28gaWYgd2Ugd2FudGVkCi0gKiBkbWEgc3VwcG9ydCBmb3IgbW9yZSB0aGFuIDgtYml0IHdvcmRzICh1cCB0byAyNCBiaXRzKSwgd2Ugd291bGQgbmVlZCB0bwotICogc2V0dXAgZG1hIGNoYW5uZWxzIGZyb20gc2NyYXRjaCBvbiBlYWNoIHNwaSB0cmFuc2ZlciwgYmFzZWQgb24gYml0c19wZXJfd29yZAotICogaW5zdGVhZCB3ZSBoYXZlIHByZSBzZXQgdXAgOCBiaXQgZG1hIGNoYW5uZWxzIHN1cHBvcnRpbmcgc3BpIDQgdG8gOCBiaXRzCi0gKiB0cmFuc2ZlcnMsIGFuZCA5IHRvIDI0IGJpdHMgc3BpIHRyYW5zZmVycyB3aWxsIGJlIGRvbmUgaW4gcGlvIGlycSBiYXNlZCBtb2RlCi0gKiBjYWxsYmFja3MgdG8gaGFuZGxlIGRtYSBvciBwaW8gYXJlIHNldCB1cCBpbiBhdTE1NTBfc3BpX2JpdHNfaGFuZGxlcnNfc2V0KCkKLSAqLwotc3RhdGljIHZvaWQgYXUxNTUwX3NwaV9jaGlwc2VsKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQl1bnNpZ25lZCBjc3BvbCA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIID8gMSA6IDA7Ci0JdTMyIGNmZywgc3RhdDsKLQotCXN3aXRjaCAodmFsdWUpIHsKLQljYXNlIEJJVEJBTkdfQ1NfSU5BQ1RJVkU6Ci0JCWlmIChody0+cGRhdGEtPmRlYWN0aXZhdGVfY3MpCi0JCQlody0+cGRhdGEtPmRlYWN0aXZhdGVfY3MoaHctPnBkYXRhLCBzcGktPmNoaXBfc2VsZWN0LAotCQkJCQljc3BvbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBCSVRCQU5HX0NTX0FDVElWRToKLQkJYXUxNTUwX3NwaV9iaXRzX2hhbmRsZXJzX3NldChodywgc3BpLT5iaXRzX3Blcl93b3JkKTsKLQotCQljZmcgPSBody0+cmVncy0+cHNjX3NwaWNmZzsKLQkJYXVfc3luYygpOwotCQlody0+cmVncy0+cHNjX3NwaWNmZyA9IGNmZyAmIH5QU0NfU1BJQ0ZHX0RFX0VOQUJMRTsKLQkJYXVfc3luYygpOwotCi0JCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKLQkJCWNmZyB8PSBQU0NfU1BJQ0ZHX0JJOwotCQllbHNlCi0JCQljZmcgJj0gflBTQ19TUElDRkdfQkk7Ci0JCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKLQkJCWNmZyAmPSB+UFNDX1NQSUNGR19DREU7Ci0JCWVsc2UKLQkJCWNmZyB8PSBQU0NfU1BJQ0ZHX0NERTsKLQotCQlpZiAoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkKLQkJCWNmZyB8PSBQU0NfU1BJQ0ZHX01MRjsKLQkJZWxzZQotCQkJY2ZnICY9IH5QU0NfU1BJQ0ZHX01MRjsKLQotCQlpZiAoaHctPnVzZWRtYSAmJiBzcGktPmJpdHNfcGVyX3dvcmQgPD0gOCkKLQkJCWNmZyAmPSB+UFNDX1NQSUNGR19ERF9ESVNBQkxFOwotCQllbHNlCi0JCQljZmcgfD0gUFNDX1NQSUNGR19ERF9ESVNBQkxFOwotCQljZmcgPSBQU0NfU1BJQ0ZHX0NMUl9MRU4oY2ZnKTsKLQkJY2ZnIHw9IFBTQ19TUElDRkdfU0VUX0xFTihzcGktPmJpdHNfcGVyX3dvcmQpOwotCi0JCWNmZyA9IFBTQ19TUElDRkdfQ0xSX0JBVUQoY2ZnKTsKLQkJY2ZnICY9IH5QU0NfU1BJQ0ZHX1NFVF9ESVYoMyk7Ci0JCWNmZyB8PSBhdTE1NTBfc3BpX2JhdWRjZmcoaHcsIHNwaS0+bWF4X3NwZWVkX2h6KTsKLQotCQlody0+cmVncy0+cHNjX3NwaWNmZyA9IGNmZyB8IFBTQ19TUElDRkdfREVfRU5BQkxFOwotCQlhdV9zeW5jKCk7Ci0JCWRvIHsKLQkJCXN0YXQgPSBody0+cmVncy0+cHNjX3NwaXN0YXQ7Ci0JCQlhdV9zeW5jKCk7Ci0JCX0gd2hpbGUgKChzdGF0ICYgUFNDX1NQSVNUQVRfRFIpID09IDApOwotCi0JCWlmIChody0+cGRhdGEtPmFjdGl2YXRlX2NzKQotCQkJaHctPnBkYXRhLT5hY3RpdmF0ZV9jcyhody0+cGRhdGEsIHNwaS0+Y2hpcF9zZWxlY3QsCi0JCQkJCWNzcG9sKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IGF1MTU1MF9zcGlfc2V0dXB4ZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0Jc3RydWN0IGF1MTU1MF9zcGkgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JdW5zaWduZWQgYnB3LCBoejsKLQl1MzIgY2ZnLCBzdGF0OwotCi0JYnB3ID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0JaWYgKHQpIHsKLQkJaWYgKHQtPmJpdHNfcGVyX3dvcmQpCi0JCQlicHcgPSB0LT5iaXRzX3Blcl93b3JkOwotCQlpZiAodC0+c3BlZWRfaHopCi0JCQloeiA9IHQtPnNwZWVkX2h6OwotCX0KLQotCWlmIChicHcgPCA0IHx8IGJwdyA+IDI0KSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAic2V0dXB4ZmVyOiBpbnZhbGlkIGJpdHNfcGVyX3dvcmQ9JWRcbiIsCi0JCQlicHcpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGh6ID4gc3BpLT5tYXhfc3BlZWRfaHogfHwgaHogPiBody0+ZnJlcV9tYXggfHwgaHogPCBody0+ZnJlcV9taW4pIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJzZXR1cHhmZXI6IGNsb2NrIHJhdGU9JWQgb3V0IG9mIHJhbmdlXG4iLAotCQkJaHopOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlhdTE1NTBfc3BpX2JpdHNfaGFuZGxlcnNfc2V0KGh3LCBzcGktPmJpdHNfcGVyX3dvcmQpOwotCi0JY2ZnID0gaHctPnJlZ3MtPnBzY19zcGljZmc7Ci0JYXVfc3luYygpOwotCWh3LT5yZWdzLT5wc2Nfc3BpY2ZnID0gY2ZnICYgflBTQ19TUElDRkdfREVfRU5BQkxFOwotCWF1X3N5bmMoKTsKLQotCWlmIChody0+dXNlZG1hICYmIGJwdyA8PSA4KQotCQljZmcgJj0gflBTQ19TUElDRkdfRERfRElTQUJMRTsKLQllbHNlCi0JCWNmZyB8PSBQU0NfU1BJQ0ZHX0REX0RJU0FCTEU7Ci0JY2ZnID0gUFNDX1NQSUNGR19DTFJfTEVOKGNmZyk7Ci0JY2ZnIHw9IFBTQ19TUElDRkdfU0VUX0xFTihicHcpOwotCi0JY2ZnID0gUFNDX1NQSUNGR19DTFJfQkFVRChjZmcpOwotCWNmZyAmPSB+UFNDX1NQSUNGR19TRVRfRElWKDMpOwotCWNmZyB8PSBhdTE1NTBfc3BpX2JhdWRjZmcoaHcsIGh6KTsKLQotCWh3LT5yZWdzLT5wc2Nfc3BpY2ZnID0gY2ZnOwotCWF1X3N5bmMoKTsKLQotCWlmIChjZmcgJiBQU0NfU1BJQ0ZHX0RFX0VOQUJMRSkgewotCQlkbyB7Ci0JCQlzdGF0ID0gaHctPnJlZ3MtPnBzY19zcGlzdGF0OwotCQkJYXVfc3luYygpOwotCQl9IHdoaWxlICgoc3RhdCAmIFBTQ19TUElTVEFUX0RSKSA9PSAwKTsKLQl9Ci0KLQlhdTE1NTBfc3BpX3Jlc2V0X2ZpZm9zKGh3KTsKLQlhdTE1NTBfc3BpX21hc2tfYWNrX2FsbChodyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXUxNTUwX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBhdTE1NTBfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JaWYgKHNwaS0+Yml0c19wZXJfd29yZCA8IDQgfHwgc3BpLT5iaXRzX3Blcl93b3JkID4gMjQpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJzZXR1cDogaW52YWxpZCBiaXRzX3Blcl93b3JkPSVkXG4iLAotCQkJc3BpLT5iaXRzX3Blcl93b3JkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHNwaS0+bWF4X3NwZWVkX2h6ID09IDApCi0JCXNwaS0+bWF4X3NwZWVkX2h6ID0gaHctPmZyZXFfbWF4OwotCWlmIChzcGktPm1heF9zcGVlZF9oeiA+IGh3LT5mcmVxX21heAotCQkJfHwgc3BpLT5tYXhfc3BlZWRfaHogPCBody0+ZnJlcV9taW4pCi0JCXJldHVybiAtRUlOVkFMOwotCS8qCi0JICogTk9URTogY2Fubm90IGNoYW5nZSBzcGVlZCBhbmQgb3RoZXIgaHcgc2V0dGluZ3MgaW1tZWRpYXRlbHksCi0JICogICAgICAgb3RoZXJ3aXNlIHNoYXJpbmcgb2Ygc3BpIGJ1cyBpcyBub3QgcG9zc2libGUsCi0JICogICAgICAgc28gZG8gbm90IGNhbGwgc2V0dXB4ZmVyKHNwaSwgTlVMTCkgaGVyZQotCSAqLwotCXJldHVybiAwOwotfQotCi0vKgotICogZm9yIGRtYSBzcGkgdHJhbnNmZXJzLCB3ZSBoYXZlIHRvIHNldHVwIHJ4IGNoYW5uZWwsIG90aGVyd2lzZSB0aGVyZSBpcwotICogbm8gcmVsaWFibGUgd2F5IGhvdyB0byByZWNvZ25pemUgdGhhdCBzcGkgdHJhbnNmZXIgaXMgZG9uZQotICogZG1hIGNvbXBsZXRlIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGJlZm9yZSByZWFsIHNwaSB0cmFuc2ZlciBpcyBmaW5pc2hlZAotICogYW5kIGlmIG9ubHkgdHggZG1hIGNoYW5uZWwgaXMgc2V0IHVwIChhbmQgcnggZmlmbyBvdmVyZmxvdyBldmVudCBtYXNrZWQpCi0gKiBzcGkgbWFzdGVyIGRvbmUgZXZlbnQgaXJxIGlzIG5vdCBnZW5lcmF0ZWQgdW5sZXNzIHJ4IGZpZm8gaXMgZW1wdHkgKGVtcHRpZWQpCi0gKiBzbyB3ZSBuZWVkIHJ4IHRtcCBidWZmZXIgdG8gdXNlIGZvciByeCBkbWEgaWYgdXNlciBkb2VzIG5vdCBwcm92aWRlIG9uZQotICovCi1zdGF0aWMgaW50IGF1MTU1MF9zcGlfZG1hX3J4dG1wX2FsbG9jKHN0cnVjdCBhdTE1NTBfc3BpICpodywgdW5zaWduZWQgc2l6ZSkKLXsKLQlody0+ZG1hX3J4X3RtcGJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFody0+ZG1hX3J4X3RtcGJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaHctPmRtYV9yeF90bXBidWZfc2l6ZSA9IHNpemU7Ci0JaHctPmRtYV9yeF90bXBidWZfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGh3LT5kZXYsIGh3LT5kbWFfcnhfdG1wYnVmLAotCQkJc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKLQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoaHctPmRldiwgaHctPmRtYV9yeF90bXBidWZfYWRkcikpIHsKLQkJa2ZyZWUoaHctPmRtYV9yeF90bXBidWYpOwotCQlody0+ZG1hX3J4X3RtcGJ1ZiA9IDA7Ci0JCWh3LT5kbWFfcnhfdG1wYnVmX3NpemUgPSAwOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1MTU1MF9zcGlfZG1hX3J4dG1wX2ZyZWUoc3RydWN0IGF1MTU1MF9zcGkgKmh3KQotewotCWRtYV91bm1hcF9zaW5nbGUoaHctPmRldiwgaHctPmRtYV9yeF90bXBidWZfYWRkciwKLQkJCWh3LT5kbWFfcnhfdG1wYnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7Ci0Ja2ZyZWUoaHctPmRtYV9yeF90bXBidWYpOwotCWh3LT5kbWFfcnhfdG1wYnVmID0gMDsKLQlody0+ZG1hX3J4X3RtcGJ1Zl9zaXplID0gMDsKLX0KLQotc3RhdGljIGludCBhdTE1NTBfc3BpX2RtYV90eHJ4YihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXN0cnVjdCBhdTE1NTBfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCWRtYV9hZGRyX3QgZG1hX3R4X2FkZHI7Ci0JZG1hX2FkZHJfdCBkbWFfcnhfYWRkcjsKLQl1MzIgcmVzOwotCi0JaHctPmxlbiA9IHQtPmxlbjsKLQlody0+dHhfY291bnQgPSAwOwotCWh3LT5yeF9jb3VudCA9IDA7Ci0KLQlody0+dHggPSB0LT50eF9idWY7Ci0JaHctPnJ4ID0gdC0+cnhfYnVmOwotCWRtYV90eF9hZGRyID0gdC0+dHhfZG1hOwotCWRtYV9yeF9hZGRyID0gdC0+cnhfZG1hOwotCi0JLyoKLQkgKiBjaGVjayBpZiBidWZmZXJzIGFyZSBhbHJlYWR5IGRtYSBtYXBwZWQsIG1hcCB0aGVtIG90aGVyd2lzZToKLQkgKiAtIGZpcnN0IG1hcCB0aGUgVFggYnVmZmVyLCBzbyBjYWNoZSBkYXRhIGdldHMgd3JpdHRlbiB0byBtZW1vcnkKLQkgKiAtIHRoZW4gbWFwIHRoZSBSWCBidWZmZXIsIHNvIHRoYXQgY2FjaGUgZW50cmllcyAod2l0aAotCSAqICAgc29vbi10by1iZS1zdGFsZSBkYXRhKSBnZXQgcmVtb3ZlZAotCSAqIHVzZSByeCBidWZmZXIgaW4gcGxhY2Ugb2YgdHggaWYgdHggYnVmZmVyIHdhcyBub3QgcHJvdmlkZWQKLQkgKiB1c2UgdGVtcCByeCBidWZmZXIgKHByZWFsbG9jYXRlZCBvciByZWFsbG9jIHRvIGZpdCkgZm9yIHJ4IGRtYQotCSAqLwotCWlmICh0LT50eF9idWYpIHsKLQkJaWYgKHQtPnR4X2RtYSA9PSAwKSB7CS8qIGlmIERNQV9BRERSX0lOVkFMSUQsIG1hcCBpdCAqLwotCQkJZG1hX3R4X2FkZHIgPSBkbWFfbWFwX3NpbmdsZShody0+ZGV2LAotCQkJCQkodm9pZCAqKXQtPnR4X2J1ZiwKLQkJCQkJdC0+bGVuLCBETUFfVE9fREVWSUNFKTsKLQkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihody0+ZGV2LCBkbWFfdHhfYWRkcikpCi0JCQkJZGV2X2Vycihody0+ZGV2LCAidHggZG1hIG1hcCBlcnJvclxuIik7Ci0JCX0KLQl9Ci0KLQlpZiAodC0+cnhfYnVmKSB7Ci0JCWlmICh0LT5yeF9kbWEgPT0gMCkgewkvKiBpZiBETUFfQUREUl9JTlZBTElELCBtYXAgaXQgKi8KLQkJCWRtYV9yeF9hZGRyID0gZG1hX21hcF9zaW5nbGUoaHctPmRldiwKLQkJCQkJKHZvaWQgKil0LT5yeF9idWYsCi0JCQkJCXQtPmxlbiwgRE1BX0ZST01fREVWSUNFKTsKLQkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihody0+ZGV2LCBkbWFfcnhfYWRkcikpCi0JCQkJZGV2X2Vycihody0+ZGV2LCAicnggZG1hIG1hcCBlcnJvclxuIik7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAodC0+bGVuID4gaHctPmRtYV9yeF90bXBidWZfc2l6ZSkgewotCQkJaW50IHJldDsKLQotCQkJYXUxNTUwX3NwaV9kbWFfcnh0bXBfZnJlZShodyk7Ci0JCQlyZXQgPSBhdTE1NTBfc3BpX2RtYV9yeHRtcF9hbGxvYyhodywgbWF4KHQtPmxlbiwKLQkJCQkJQVUxNTUwX1NQSV9ETUFfUlhUTVBfTUlOU0laRSkpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCQlody0+cnggPSBody0+ZG1hX3J4X3RtcGJ1ZjsKLQkJZG1hX3J4X2FkZHIgPSBody0+ZG1hX3J4X3RtcGJ1Zl9hZGRyOwotCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShody0+ZGV2LCBkbWFfcnhfYWRkciwKLQkJCXQtPmxlbiwgRE1BX0ZST01fREVWSUNFKTsKLQl9Ci0KLQlpZiAoIXQtPnR4X2J1ZikgewotCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShody0+ZGV2LCBkbWFfcnhfYWRkciwKLQkJCQl0LT5sZW4sIERNQV9CSURJUkVDVElPTkFMKTsKLQkJaHctPnR4ID0gaHctPnJ4OwotCX0KLQotCS8qIHB1dCBidWZmZXJzIG9uIHRoZSByaW5nICovCi0JcmVzID0gYXUxeHh4X2RiZG1hX3B1dF9kZXN0KGh3LT5kbWFfcnhfY2gsIHZpcnRfdG9fcGh5cyhody0+cngpLAotCQkJCSAgICB0LT5sZW4sIERETUFfRkxBR1NfSUUpOwotCWlmICghcmVzKQotCQlkZXZfZXJyKGh3LT5kZXYsICJyeCBkbWEgcHV0IGRlc3QgZXJyb3JcbiIpOwotCi0JcmVzID0gYXUxeHh4X2RiZG1hX3B1dF9zb3VyY2UoaHctPmRtYV90eF9jaCwgdmlydF90b19waHlzKGh3LT50eCksCi0JCQkJICAgICAgdC0+bGVuLCBERE1BX0ZMQUdTX0lFKTsKLQlpZiAoIXJlcykKLQkJZGV2X2Vycihody0+ZGV2LCAidHggZG1hIHB1dCBzb3VyY2UgZXJyb3JcbiIpOwotCi0JYXUxeHh4X2RiZG1hX3N0YXJ0KGh3LT5kbWFfcnhfY2gpOwotCWF1MXh4eF9kYmRtYV9zdGFydChody0+ZG1hX3R4X2NoKTsKLQotCS8qIGJ5IGRlZmF1bHQgZW5hYmxlIG5lYXJseSBhbGwgZXZlbnRzIGludGVycnVwdCAqLwotCWh3LT5yZWdzLT5wc2Nfc3BpbXNrID0gUFNDX1NQSU1TS19TRDsKLQlhdV9zeW5jKCk7Ci0KLQkvKiBzdGFydCB0aGUgdHJhbnNmZXIgKi8KLQlody0+cmVncy0+cHNjX3NwaXBjciA9IFBTQ19TUElQQ1JfTVM7Ci0JYXVfc3luYygpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmaHctPm1hc3Rlcl9kb25lKTsKLQotCWF1MXh4eF9kYmRtYV9zdG9wKGh3LT5kbWFfdHhfY2gpOwotCWF1MXh4eF9kYmRtYV9zdG9wKGh3LT5kbWFfcnhfY2gpOwotCi0JaWYgKCF0LT5yeF9idWYpIHsKLQkJLyogdXNpbmcgdGhlIHRlbXBvcmFsIHByZWFsbG9jYXRlZCBhbmQgcHJlbWFwcGVkIGJ1ZmZlciAqLwotCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShody0+ZGV2LCBkbWFfcnhfYWRkciwgdC0+bGVuLAotCQkJRE1BX0ZST01fREVWSUNFKTsKLQl9Ci0JLyogdW5tYXAgYnVmZmVycyBpZiBtYXBwZWQgYWJvdmUgKi8KLQlpZiAodC0+cnhfYnVmICYmIHQtPnJ4X2RtYSA9PSAwICkKLQkJZG1hX3VubWFwX3NpbmdsZShody0+ZGV2LCBkbWFfcnhfYWRkciwgdC0+bGVuLAotCQkJRE1BX0ZST01fREVWSUNFKTsKLQlpZiAodC0+dHhfYnVmICYmIHQtPnR4X2RtYSA9PSAwICkKLQkJZG1hX3VubWFwX3NpbmdsZShody0+ZGV2LCBkbWFfdHhfYWRkciwgdC0+bGVuLAotCQkJRE1BX1RPX0RFVklDRSk7Ci0KLQlyZXR1cm4gaHctPnJ4X2NvdW50IDwgaHctPnR4X2NvdW50ID8gaHctPnJ4X2NvdW50IDogaHctPnR4X2NvdW50OwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYXUxNTUwX3NwaV9kbWFfaXJxX2NhbGxiYWNrKHN0cnVjdCBhdTE1NTBfc3BpICpodykKLXsKLQl1MzIgc3RhdCwgZXZudDsKLQotCXN0YXQgPSBody0+cmVncy0+cHNjX3NwaXN0YXQ7Ci0JZXZudCA9IGh3LT5yZWdzLT5wc2Nfc3BpZXZlbnQ7Ci0JYXVfc3luYygpOwotCWlmICgoc3RhdCAmIFBTQ19TUElTVEFUX0RJKSA9PSAwKSB7Ci0JCWRldl9lcnIoaHctPmRldiwgIlVuZXhwZWN0ZWQgSVJRIVxuIik7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQlpZiAoKGV2bnQgJiAoUFNDX1NQSUVWTlRfTU0gfCBQU0NfU1BJRVZOVF9STwotCQkJCXwgUFNDX1NQSUVWTlRfUlUgfCBQU0NfU1BJRVZOVF9UTwotCQkJCXwgUFNDX1NQSUVWTlRfVFUgfCBQU0NfU1BJRVZOVF9TRCkpCi0JCQkhPSAwKSB7Ci0JCS8qCi0JCSAqIGR1ZSB0byBhbiBzcGkgZXJyb3Igd2UgY29uc2lkZXIgdHJhbnNmZXIgYXMgZG9uZSwKLQkJICogc28gbWFzayBhbGwgZXZlbnRzIHVudGlsIGJlZm9yZSBuZXh0IHRyYW5zZmVyIHN0YXJ0Ci0JCSAqIGFuZCBzdG9wIHRoZSBwb3NzaWJseSBydW5uaW5nIGRtYSBpbW1lZGlhdGVsbHkKLQkJICovCi0JCWF1MTU1MF9zcGlfbWFza19hY2tfYWxsKGh3KTsKLQkJYXUxeHh4X2RiZG1hX3N0b3AoaHctPmRtYV9yeF9jaCk7Ci0JCWF1MXh4eF9kYmRtYV9zdG9wKGh3LT5kbWFfdHhfY2gpOwotCi0JCS8qIGdldCBudW1iZXIgb2YgdHJhbnNmZXJyZWQgYnl0ZXMgKi8KLQkJaHctPnJ4X2NvdW50ID0gaHctPmxlbiAtIGF1MXh4eF9nZXRfZG1hX3Jlc2lkdWUoaHctPmRtYV9yeF9jaCk7Ci0JCWh3LT50eF9jb3VudCA9IGh3LT5sZW4gLSBhdTF4eHhfZ2V0X2RtYV9yZXNpZHVlKGh3LT5kbWFfdHhfY2gpOwotCi0JCWF1MXh4eF9kYmRtYV9yZXNldChody0+ZG1hX3J4X2NoKTsKLQkJYXUxeHh4X2RiZG1hX3Jlc2V0KGh3LT5kbWFfdHhfY2gpOwotCQlhdTE1NTBfc3BpX3Jlc2V0X2ZpZm9zKGh3KTsKLQotCQlpZiAoZXZudCA9PSBQU0NfU1BJRVZOVF9STykKLQkJCWRldl9lcnIoaHctPmRldiwKLQkJCQkiZG1hIHRyYW5zZmVyOiByZWNlaXZlIEZJRk8gb3ZlcmZsb3chXG4iKTsKLQkJZWxzZQotCQkJZGV2X2Vycihody0+ZGV2LAotCQkJCSJkbWEgdHJhbnNmZXI6IHVuZXhwZWN0ZWQgU1BJIGVycm9yICIKLQkJCQkiKGV2ZW50PTB4JXggc3RhdD0weCV4KSFcbiIsIGV2bnQsIHN0YXQpOwotCi0JCWNvbXBsZXRlKCZody0+bWFzdGVyX2RvbmUpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKChldm50ICYgUFNDX1NQSUVWTlRfTUQpICE9IDApIHsKLQkJLyogdHJhbnNmZXIgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLwotCQlhdTE1NTBfc3BpX21hc2tfYWNrX2FsbChodyk7Ci0JCWh3LT5yeF9jb3VudCA9IGh3LT5sZW47Ci0JCWh3LT50eF9jb3VudCA9IGh3LT5sZW47Ci0JCWNvbXBsZXRlKCZody0+bWFzdGVyX2RvbmUpOwotCX0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotLyogcm91dGluZXMgdG8gaGFuZGxlIGRpZmZlcmVudCB3b3JkIHNpemVzIGluIHBpbyBtb2RlICovCi0jZGVmaW5lIEFVMTU1MF9TUElfUlhfV09SRChzaXplLCBtYXNrKQkJCQkJXAotc3RhdGljIHZvaWQgYXUxNTUwX3NwaV9yeF93b3JkXyMjc2l6ZShzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcpCQlcCi17CQkJCQkJCQkJXAotCXUzMiBmaWZvd29yZCA9IGh3LT5yZWdzLT5wc2Nfc3BpdHhyeCAmICh1MzIpKG1hc2spOwkJXAotCWF1X3N5bmMoKTsJCQkJCQkJXAotCWlmIChody0+cngpIHsJCQkJCQkJXAotCQkqKHUjI3NpemUgKilody0+cnggPSAodSMjc2l6ZSlmaWZvd29yZDsJCQlcCi0JCWh3LT5yeCArPSAoc2l6ZSkgLyA4OwkJCQkJXAotCX0JCQkJCQkJCVwKLQlody0+cnhfY291bnQgKz0gKHNpemUpIC8gODsJCQkJCVwKLX0KLQotI2RlZmluZSBBVTE1NTBfU1BJX1RYX1dPUkQoc2l6ZSwgbWFzaykJCQkJCVwKLXN0YXRpYyB2b2lkIGF1MTU1MF9zcGlfdHhfd29yZF8jI3NpemUoc3RydWN0IGF1MTU1MF9zcGkgKmh3KQkJXAotewkJCQkJCQkJCVwKLQl1MzIgZmlmb3dvcmQgPSAwOwkJCQkJCVwKLQlpZiAoaHctPnR4KSB7CQkJCQkJCVwKLQkJZmlmb3dvcmQgPSAqKHUjI3NpemUgKilody0+dHggJiAodTMyKShtYXNrKTsJCVwKLQkJaHctPnR4ICs9IChzaXplKSAvIDg7CQkJCQlcCi0JfQkJCQkJCQkJXAotCWh3LT50eF9jb3VudCArPSAoc2l6ZSkgLyA4OwkJCQkJXAotCWlmIChody0+dHhfY291bnQgPj0gaHctPmxlbikJCQkJCVwKLQkJZmlmb3dvcmQgfD0gUFNDX1NQSVRYUlhfTEM7CQkJCVwKLQlody0+cmVncy0+cHNjX3NwaXR4cnggPSBmaWZvd29yZDsJCQkJXAotCWF1X3N5bmMoKTsJCQkJCQkJXAotfQotCi1BVTE1NTBfU1BJX1JYX1dPUkQoOCwweGZmKQotQVUxNTUwX1NQSV9SWF9XT1JEKDE2LDB4ZmZmZikKLUFVMTU1MF9TUElfUlhfV09SRCgzMiwweGZmZmZmZikKLUFVMTU1MF9TUElfVFhfV09SRCg4LDB4ZmYpCi1BVTE1NTBfU1BJX1RYX1dPUkQoMTYsMHhmZmZmKQotQVUxNTUwX1NQSV9UWF9XT1JEKDMyLDB4ZmZmZmZmKQotCi1zdGF0aWMgaW50IGF1MTU1MF9zcGlfcGlvX3R4cnhiKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0JdTMyIHN0YXQsIG1hc2s7Ci0Jc3RydWN0IGF1MTU1MF9zcGkgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0KLQlody0+dHggPSB0LT50eF9idWY7Ci0JaHctPnJ4ID0gdC0+cnhfYnVmOwotCWh3LT5sZW4gPSB0LT5sZW47Ci0JaHctPnR4X2NvdW50ID0gMDsKLQlody0+cnhfY291bnQgPSAwOwotCi0JLyogYnkgZGVmYXVsdCBlbmFibGUgbmVhcmx5IGFsbCBldmVudHMgYWZ0ZXIgZmlsbGluZyB0eCBmaWZvICovCi0JbWFzayA9IFBTQ19TUElNU0tfU0Q7Ci0KLQkvKiBmaWxsIHRoZSB0cmFuc21pdCBGSUZPICovCi0Jd2hpbGUgKGh3LT50eF9jb3VudCA8IGh3LT5sZW4pIHsKLQotCQlody0+dHhfd29yZChodyk7Ci0KLQkJaWYgKGh3LT50eF9jb3VudCA+PSBody0+bGVuKSB7Ci0JCQkvKiBtYXNrIHR4IGZpZm8gcmVxdWVzdCBpbnRlcnJ1cHQgYXMgd2UgYXJlIGRvbmUgKi8KLQkJCW1hc2sgfD0gUFNDX1NQSU1TS19UUjsKLQkJfQotCi0JCXN0YXQgPSBody0+cmVncy0+cHNjX3NwaXN0YXQ7Ci0JCWF1X3N5bmMoKTsKLQkJaWYgKHN0YXQgJiBQU0NfU1BJU1RBVF9URikKLQkJCWJyZWFrOwotCX0KLQotCS8qIGVuYWJsZSBldmVudCBpbnRlcnJ1cHRzICovCi0JaHctPnJlZ3MtPnBzY19zcGltc2sgPSBtYXNrOwotCWF1X3N5bmMoKTsKLQotCS8qIHN0YXJ0IHRoZSB0cmFuc2ZlciAqLwotCWh3LT5yZWdzLT5wc2Nfc3BpcGNyID0gUFNDX1NQSVBDUl9NUzsKLQlhdV9zeW5jKCk7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZody0+bWFzdGVyX2RvbmUpOwotCi0JcmV0dXJuIGh3LT5yeF9jb3VudCA8IGh3LT50eF9jb3VudCA/IGh3LT5yeF9jb3VudCA6IGh3LT50eF9jb3VudDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGF1MTU1MF9zcGlfcGlvX2lycV9jYWxsYmFjayhzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcpCi17Ci0JaW50IGJ1c3k7Ci0JdTMyIHN0YXQsIGV2bnQ7Ci0KLQlzdGF0ID0gaHctPnJlZ3MtPnBzY19zcGlzdGF0OwotCWV2bnQgPSBody0+cmVncy0+cHNjX3NwaWV2ZW50OwotCWF1X3N5bmMoKTsKLQlpZiAoKHN0YXQgJiBQU0NfU1BJU1RBVF9ESSkgPT0gMCkgewotCQlkZXZfZXJyKGh3LT5kZXYsICJVbmV4cGVjdGVkIElSUSFcbiIpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0JaWYgKChldm50ICYgKFBTQ19TUElFVk5UX01NIHwgUFNDX1NQSUVWTlRfUk8KLQkJCQl8IFBTQ19TUElFVk5UX1JVIHwgUFNDX1NQSUVWTlRfVE8KLQkJCQl8IFBTQ19TUElFVk5UX1NEKSkKLQkJCSE9IDApIHsKLQkJLyoKLQkJICogZHVlIHRvIGFuIGVycm9yIHdlIGNvbnNpZGVyIHRyYW5zZmVyIGFzIGRvbmUsCi0JCSAqIHNvIG1hc2sgYWxsIGV2ZW50cyB1bnRpbCBiZWZvcmUgbmV4dCB0cmFuc2ZlciBzdGFydAotCQkgKi8KLQkJYXUxNTUwX3NwaV9tYXNrX2Fja19hbGwoaHcpOwotCQlhdTE1NTBfc3BpX3Jlc2V0X2ZpZm9zKGh3KTsKLQkJZGV2X2Vycihody0+ZGV2LAotCQkJInBpbyB0cmFuc2ZlcjogdW5leHBlY3RlZCBTUEkgZXJyb3IgIgotCQkJIihldmVudD0weCV4IHN0YXQ9MHgleCkhXG4iLCBldm50LCBzdGF0KTsKLQkJY29tcGxldGUoJmh3LT5tYXN0ZXJfZG9uZSk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQkvKgotCSAqIHdoaWxlIHRoZXJlIGlzIHNvbWV0aGluZyB0byByZWFkIGZyb20gcnggZmlmbwotCSAqIG9yIHRoZXJlIGlzIGEgc3BhY2UgdG8gd3JpdGUgdG8gdHggZmlmbzoKLQkgKi8KLQlkbyB7Ci0JCWJ1c3kgPSAwOwotCQlzdGF0ID0gaHctPnJlZ3MtPnBzY19zcGlzdGF0OwotCQlhdV9zeW5jKCk7Ci0KLQkJLyoKLQkJICogVGFrZSBjYXJlIHRvIG5vdCBsZXQgdGhlIFJ4IEZJRk8gb3ZlcmZsb3cuCi0JCSAqCi0JCSAqIFdlIG9ubHkgd3JpdGUgYSBieXRlIGlmIHdlIGhhdmUgcmVhZCBvbmUgYXQgbGVhc3QuIEluaXRpYWxseSwKLQkJICogdGhlIHdyaXRlIGZpZm8gaXMgZnVsbCwgc28gd2Ugc2hvdWxkIHJlYWQgZnJvbSB0aGUgcmVhZCBmaWZvCi0JCSAqIGZpcnN0LgotCQkgKiBJbiBjYXNlIHdlIG1pc3MgYSB3b3JkIGZyb20gdGhlIHJlYWQgZmlmbywgd2Ugc2hvdWxkIGdldCBhCi0JCSAqIFJPIGV2ZW50IGFuZCBzaG91bGQgYmFjayBvdXQuCi0JCSAqLwotCQlpZiAoIShzdGF0ICYgUFNDX1NQSVNUQVRfUkUpICYmIGh3LT5yeF9jb3VudCA8IGh3LT5sZW4pIHsKLQkJCWh3LT5yeF93b3JkKGh3KTsKLQkJCWJ1c3kgPSAxOwotCi0JCQlpZiAoIShzdGF0ICYgUFNDX1NQSVNUQVRfVEYpICYmIGh3LT50eF9jb3VudCA8IGh3LT5sZW4pCi0JCQkJaHctPnR4X3dvcmQoaHcpOwotCQl9Ci0JfSB3aGlsZSAoYnVzeSk7Ci0KLQlody0+cmVncy0+cHNjX3NwaWV2ZW50ID0gUFNDX1NQSUVWTlRfUlIgfCBQU0NfU1BJRVZOVF9UUjsKLQlhdV9zeW5jKCk7Ci0KLQkvKgotCSAqIFJlc3RhcnQgdGhlIFNQSSB0cmFuc21pc3Npb24gaW4gY2FzZSBvZiBhIHRyYW5zbWl0IHVuZGVyZmxvdy4KLQkgKiBUaGlzIHNlZW1zIHRvIHdvcmsgZGVzcGl0ZSB0aGUgbm90ZXMgaW4gdGhlIEF1MTU1MCBkYXRhIGJvb2sKLQkgKiBvZiBGaWd1cmUgOC00IHdpdGggZmxvd2NoYXJ0IGZvciBTUEkgbWFzdGVyIG9wZXJhdGlvbjoKLQkgKgotCSAqICIiIk5vdGUgMTogQW4gWEZSIEVycm9yIEludGVycnVwdCBvY2N1cnMsIHVubGVzcyBtYXNrZWQsCi0JICogZm9yIGFueSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50czogVHggRklGTyBVbmRlcmZsb3csCi0JICogUnggRklGTyBPdmVyZmxvdywgb3IgTXVsdGlwbGUtbWFzdGVyIEVycm9yCi0JICogICAgTm90ZSAyOiBJbiBjYXNlIG9mIGEgVHggVW5kZXJmbG93IEVycm9yLCBhbGwgemVyb2VzIGFyZQotCSAqIHRyYW5zbWl0dGVkLiIiIgotCSAqCi0JICogQnkgc2ltcGx5IHJlc3RhcnRpbmcgdGhlIHNwaSB0cmFuc2ZlciBvbiBUeCBVbmRlcmZsb3cgRXJyb3IsCi0JICogd2UgYXNzdW1lIHRoYXQgc3BpIHRyYW5zZmVyIHdhcyBwYXVzZWQgaW5zdGVhZCBvZiB6ZXJvZXMKLQkgKiB0cmFuc21pdHRpb24gbWVudGlvbmVkIGluIHRoZSBOb3RlIDIgb2YgQXUxNTUwIGRhdGEgYm9vay4KLQkgKi8KLQlpZiAoZXZudCAmIFBTQ19TUElFVk5UX1RVKSB7Ci0JCWh3LT5yZWdzLT5wc2Nfc3BpZXZlbnQgPSBQU0NfU1BJRVZOVF9UVSB8IFBTQ19TUElFVk5UX01EOwotCQlhdV9zeW5jKCk7Ci0JCWh3LT5yZWdzLT5wc2Nfc3BpcGNyID0gUFNDX1NQSVBDUl9NUzsKLQkJYXVfc3luYygpOwotCX0KLQotCWlmIChody0+cnhfY291bnQgPj0gaHctPmxlbikgewotCQkvKiB0cmFuc2ZlciBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCi0JCWF1MTU1MF9zcGlfbWFza19hY2tfYWxsKGh3KTsKLQkJY29tcGxldGUoJmh3LT5tYXN0ZXJfZG9uZSk7Ci0JfQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBhdTE1NTBfc3BpX3R4cnhfYnVmcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXN0cnVjdCBhdTE1NTBfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXJldHVybiBody0+dHhyeF9idWZzKHNwaSwgdCk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhdTE1NTBfc3BpX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCi17Ci0Jc3RydWN0IGF1MTU1MF9zcGkgKmh3ID0gZGV2OwotCXJldHVybiBody0+aXJxX2NhbGxiYWNrKGh3KTsKLX0KLQotc3RhdGljIHZvaWQgYXUxNTUwX3NwaV9iaXRzX2hhbmRsZXJzX3NldChzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcsIGludCBicHcpCi17Ci0JaWYgKGJwdyA8PSA4KSB7Ci0JCWlmIChody0+dXNlZG1hKSB7Ci0JCQlody0+dHhyeF9idWZzID0gJmF1MTU1MF9zcGlfZG1hX3R4cnhiOwotCQkJaHctPmlycV9jYWxsYmFjayA9ICZhdTE1NTBfc3BpX2RtYV9pcnFfY2FsbGJhY2s7Ci0JCX0gZWxzZSB7Ci0JCQlody0+cnhfd29yZCA9ICZhdTE1NTBfc3BpX3J4X3dvcmRfODsKLQkJCWh3LT50eF93b3JkID0gJmF1MTU1MF9zcGlfdHhfd29yZF84OwotCQkJaHctPnR4cnhfYnVmcyA9ICZhdTE1NTBfc3BpX3Bpb190eHJ4YjsKLQkJCWh3LT5pcnFfY2FsbGJhY2sgPSAmYXUxNTUwX3NwaV9waW9faXJxX2NhbGxiYWNrOwotCQl9Ci0JfSBlbHNlIGlmIChicHcgPD0gMTYpIHsKLQkJaHctPnJ4X3dvcmQgPSAmYXUxNTUwX3NwaV9yeF93b3JkXzE2OwotCQlody0+dHhfd29yZCA9ICZhdTE1NTBfc3BpX3R4X3dvcmRfMTY7Ci0JCWh3LT50eHJ4X2J1ZnMgPSAmYXUxNTUwX3NwaV9waW9fdHhyeGI7Ci0JCWh3LT5pcnFfY2FsbGJhY2sgPSAmYXUxNTUwX3NwaV9waW9faXJxX2NhbGxiYWNrOwotCX0gZWxzZSB7Ci0JCWh3LT5yeF93b3JkID0gJmF1MTU1MF9zcGlfcnhfd29yZF8zMjsKLQkJaHctPnR4X3dvcmQgPSAmYXUxNTUwX3NwaV90eF93b3JkXzMyOwotCQlody0+dHhyeF9idWZzID0gJmF1MTU1MF9zcGlfcGlvX3R4cnhiOwotCQlody0+aXJxX2NhbGxiYWNrID0gJmF1MTU1MF9zcGlfcGlvX2lycV9jYWxsYmFjazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBhdTE1NTBfc3BpX3NldHVwX3BzY19hc19zcGkoc3RydWN0IGF1MTU1MF9zcGkgKmh3KQotewotCXUzMiBzdGF0LCBjZmc7Ci0KLQkvKiBzZXQgdXAgdGhlIFBTQyBmb3IgU1BJIG1vZGUgKi8KLQlody0+cmVncy0+cHNjX2N0cmwgPSBQU0NfQ1RSTF9ESVNBQkxFOwotCWF1X3N5bmMoKTsKLQlody0+cmVncy0+cHNjX3NlbCA9IFBTQ19TRUxfUFNfU1BJTU9ERTsKLQlhdV9zeW5jKCk7Ci0KLQlody0+cmVncy0+cHNjX3NwaWNmZyA9IDA7Ci0JYXVfc3luYygpOwotCi0JaHctPnJlZ3MtPnBzY19jdHJsID0gUFNDX0NUUkxfRU5BQkxFOwotCWF1X3N5bmMoKTsKLQotCWRvIHsKLQkJc3RhdCA9IGh3LT5yZWdzLT5wc2Nfc3Bpc3RhdDsKLQkJYXVfc3luYygpOwotCX0gd2hpbGUgKChzdGF0ICYgUFNDX1NQSVNUQVRfU1IpID09IDApOwotCi0KLQljZmcgPSBody0+dXNlZG1hID8gMCA6IFBTQ19TUElDRkdfRERfRElTQUJMRTsKLQljZmcgfD0gUFNDX1NQSUNGR19TRVRfTEVOKDgpOwotCWNmZyB8PSBQU0NfU1BJQ0ZHX1JUX0ZJRk84IHwgUFNDX1NQSUNGR19UVF9GSUZPODsKLQkvKiB1c2UgbWluaW1hbCBhbGxvd2VkIGJyZyBhbmQgZGl2IHZhbHVlcyBhcyBpbml0aWFsIHNldHRpbmc6ICovCi0JY2ZnIHw9IFBTQ19TUElDRkdfU0VUX0JBVUQoNCkgfCBQU0NfU1BJQ0ZHX1NFVF9ESVYoMCk7Ci0KLSNpZmRlZiBBVTE1NTBfU1BJX0RFQlVHX0xPT1BCQUNLCi0JY2ZnIHw9IFBTQ19TUElDRkdfTEI7Ci0jZW5kaWYKLQotCWh3LT5yZWdzLT5wc2Nfc3BpY2ZnID0gY2ZnOwotCWF1X3N5bmMoKTsKLQotCWF1MTU1MF9zcGlfbWFza19hY2tfYWxsKGh3KTsKLQotCWh3LT5yZWdzLT5wc2Nfc3BpY2ZnIHw9IFBTQ19TUElDRkdfREVfRU5BQkxFOwotCWF1X3N5bmMoKTsKLQotCWRvIHsKLQkJc3RhdCA9IGh3LT5yZWdzLT5wc2Nfc3Bpc3RhdDsKLQkJYXVfc3luYygpOwotCX0gd2hpbGUgKChzdGF0ICYgUFNDX1NQSVNUQVRfRFIpID09IDApOwotCi0JYXUxNTUwX3NwaV9yZXNldF9maWZvcyhodyk7Ci19Ci0KLQotc3RhdGljIGludCBfX2luaXQgYXUxNTUwX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBhdTE1NTBfc3BpICpodzsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCByZXNvdXJjZSAqcjsKLQlpbnQgZXJyID0gMDsKLQotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBhdTE1NTBfc3BpKSk7Ci0JaWYgKG1hc3RlciA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIG1lbW9yeSBmb3Igc3BpX21hc3RlclxuIik7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX25vbWVtOwotCX0KLQotCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLwotCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIIHwgU1BJX0xTQl9GSVJTVDsKLQotCWh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCi0JaHctPm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7Ci0JaHctPnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaHctPmRldiA9ICZwZGV2LT5kZXY7Ci0KLQlpZiAoaHctPnBkYXRhID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBzdXBwbGllZFxuIik7Ci0JCWVyciA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyX25vX3BkYXRhOwotCX0KLQotCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOwotCWlmICghcikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBJUlFcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGVycl9ub19pb3JlczsKLQl9Ci0JaHctPmlycSA9IHItPnN0YXJ0OwotCi0JaHctPnVzZWRtYSA9IDA7Ci0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7Ci0JaWYgKHIpIHsKLQkJaHctPmRtYV90eF9pZCA9IHItPnN0YXJ0OwotCQlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKLQkJaWYgKHIpIHsKLQkJCWh3LT5kbWFfcnhfaWQgPSByLT5zdGFydDsKLQkJCWlmICh1c2VkbWEgJiYgZGRtYV9tZW1pZCkgewotCQkJCWlmIChwZGV2LT5kZXYuZG1hX21hc2sgPT0gTlVMTCkKLQkJCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIm5vIGRtYSBtYXNrXG4iKTsKLQkJCQllbHNlCi0JCQkJCWh3LT51c2VkbWEgPSAxOwotCQkJfQotCQl9Ci0JfQotCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1taW8gcmVzb3VyY2VcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGVycl9ub19pb3JlczsKLQl9Ci0KLQlody0+aW9hcmVhID0gcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCBzaXplb2YocHNjX3NwaV90KSwKLQkJCQkJcGRldi0+bmFtZSk7Ci0JaWYgKCFody0+aW9hcmVhKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCByZXNlcnZlIGlvbWVtIHJlZ2lvblxuIik7Ci0JCWVyciA9IC1FTlhJTzsKLQkJZ290byBlcnJfbm9faW9yZXM7Ci0JfQotCi0JaHctPnJlZ3MgPSAocHNjX3NwaV90IF9faW9tZW0gKilpb3JlbWFwKHItPnN0YXJ0LCBzaXplb2YocHNjX3NwaV90KSk7Ci0JaWYgKCFody0+cmVncykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgaW9yZW1hcFxuIik7Ci0JCWVyciA9IC1FTlhJTzsKLQkJZ290byBlcnJfaW9yZW1hcDsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7Ci0KLQlpbml0X2NvbXBsZXRpb24oJmh3LT5tYXN0ZXJfZG9uZSk7Ci0KLQlody0+Yml0YmFuZy5tYXN0ZXIgPSBody0+bWFzdGVyOwotCWh3LT5iaXRiYW5nLnNldHVwX3RyYW5zZmVyID0gYXUxNTUwX3NwaV9zZXR1cHhmZXI7Ci0JaHctPmJpdGJhbmcuY2hpcHNlbGVjdCA9IGF1MTU1MF9zcGlfY2hpcHNlbDsKLQlody0+Yml0YmFuZy5tYXN0ZXItPnNldHVwID0gYXUxNTUwX3NwaV9zZXR1cDsKLQlody0+Yml0YmFuZy50eHJ4X2J1ZnMgPSBhdTE1NTBfc3BpX3R4cnhfYnVmczsKLQotCWlmIChody0+dXNlZG1hKSB7Ci0JCWh3LT5kbWFfdHhfY2ggPSBhdTF4eHhfZGJkbWFfY2hhbl9hbGxvYyhkZG1hX21lbWlkLAotCQkJaHctPmRtYV90eF9pZCwgTlVMTCwgKHZvaWQgKilodyk7Ci0JCWlmIChody0+ZG1hX3R4X2NoID09IDApIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkiQ2Fubm90IGFsbG9jYXRlIHR4IGRtYSBjaGFubmVsXG4iKTsKLQkJCWVyciA9IC1FTlhJTzsKLQkJCWdvdG8gZXJyX25vX3R4ZG1hOwotCQl9Ci0JCWF1MXh4eF9kYmRtYV9zZXRfZGV2d2lkdGgoaHctPmRtYV90eF9jaCwgOCk7Ci0JCWlmIChhdTF4eHhfZGJkbWFfcmluZ19hbGxvYyhody0+ZG1hX3R4X2NoLAotCQkJQVUxNTUwX1NQSV9EQkRNQV9ERVNDUklQVE9SUykgPT0gMCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCSJDYW5ub3QgYWxsb2NhdGUgdHggZG1hIGRlc2NyaXB0b3JzXG4iKTsKLQkJCWVyciA9IC1FTlhJTzsKLQkJCWdvdG8gZXJyX25vX3R4ZG1hX2Rlc2NyOwotCQl9Ci0KLQotCQlody0+ZG1hX3J4X2NoID0gYXUxeHh4X2RiZG1hX2NoYW5fYWxsb2MoaHctPmRtYV9yeF9pZCwKLQkJCWRkbWFfbWVtaWQsIE5VTEwsICh2b2lkICopaHcpOwotCQlpZiAoaHctPmRtYV9yeF9jaCA9PSAwKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIkNhbm5vdCBhbGxvY2F0ZSByeCBkbWEgY2hhbm5lbFxuIik7Ci0JCQllcnIgPSAtRU5YSU87Ci0JCQlnb3RvIGVycl9ub19yeGRtYTsKLQkJfQotCQlhdTF4eHhfZGJkbWFfc2V0X2RldndpZHRoKGh3LT5kbWFfcnhfY2gsIDgpOwotCQlpZiAoYXUxeHh4X2RiZG1hX3JpbmdfYWxsb2MoaHctPmRtYV9yeF9jaCwKLQkJCUFVMTU1MF9TUElfREJETUFfREVTQ1JJUFRPUlMpID09IDApIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkiQ2Fubm90IGFsbG9jYXRlIHJ4IGRtYSBkZXNjcmlwdG9yc1xuIik7Ci0JCQllcnIgPSAtRU5YSU87Ci0JCQlnb3RvIGVycl9ub19yeGRtYV9kZXNjcjsKLQkJfQotCi0JCWVyciA9IGF1MTU1MF9zcGlfZG1hX3J4dG1wX2FsbG9jKGh3LAotCQkJQVUxNTUwX1NQSV9ETUFfUlhUTVBfTUlOU0laRSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIkNhbm5vdCBhbGxvY2F0ZSBpbml0aWFsIHJ4IGRtYSB0bXAgYnVmZmVyXG4iKTsKLQkJCWdvdG8gZXJyX2RtYV9yeHRtcF9hbGxvYzsKLQkJfQotCX0KLQotCWF1MTU1MF9zcGlfYml0c19oYW5kbGVyc19zZXQoaHcsIDgpOwotCi0JZXJyID0gcmVxdWVzdF9pcnEoaHctPmlycSwgYXUxNTUwX3NwaV9pcnEsIDAsIHBkZXYtPm5hbWUsIGh3KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBjbGFpbSBJUlFcbiIpOwotCQlnb3RvIGVycl9ub19pcnE7Ci0JfQotCi0JbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7Ci0JbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IGh3LT5wZGF0YS0+bnVtX2NoaXBzZWxlY3Q7Ci0KLQkvKgotCSAqICBwcmVjb21wdXRlIHZhbGlkIHJhbmdlIGZvciBzcGkgZnJlcSAtIGZyb20gYXUxNTUwIGRhdGFzaGVldDoKLQkgKiAgICBwc2NfdGVtcGNsayA9IHBzY19tYWluY2xrIC8gKDIgPDwgRElWKQotCSAqICAgIHNwaWNsayA9IHBzY190ZW1wY2xrIC8gKDIgKiAoQlJHICsgMSkpCi0JICogICAgQlJHIHZhbGlkIHJhbmdlIGlzIDQuLjYzCi0JICogICAgRElWIHZhbGlkIHJhbmdlIGlzIDAuLjMKLQkgKiAgcm91bmQgdGhlIG1pbiBhbmQgbWF4IGZyZXF1ZW5jaWVzIHRvIHZhbHVlcyB0aGF0IHdvdWxkIHN0aWxsCi0JICogIHByb2R1Y2UgdmFsaWQgYnJnIGFuZCBkaXYKLQkgKi8KLQl7Ci0JCWludCBtaW5fZGl2ID0gKDIgPDwgMCkgKiAoMiAqICg0ICsgMSkpOwotCQlpbnQgbWF4X2RpdiA9ICgyIDw8IDMpICogKDIgKiAoNjMgKyAxKSk7Ci0JCWh3LT5mcmVxX21heCA9IGh3LT5wZGF0YS0+bWFpbmNsa19oeiAvIG1pbl9kaXY7Ci0JCWh3LT5mcmVxX21pbiA9IGh3LT5wZGF0YS0+bWFpbmNsa19oeiAvIChtYXhfZGl2ICsgMSkgKyAxOwotCX0KLQotCWF1MTU1MF9zcGlfc2V0dXBfcHNjX2FzX3NwaShodyk7Ci0KLQllcnIgPSBzcGlfYml0YmFuZ19zdGFydCgmaHctPmJpdGJhbmcpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFNQSSBtYXN0ZXJcbiIpOwotCQlnb3RvIGVycl9yZWdpc3RlcjsKLQl9Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LAotCQkic3BpIG1hc3RlciByZWdpc3RlcmVkOiBidXNfbnVtPSVkIG51bV9jaGlwc2VsZWN0PSVkXG4iLAotCQltYXN0ZXItPmJ1c19udW0sIG1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9yZWdpc3RlcjoKLQlmcmVlX2lycShody0+aXJxLCBodyk7Ci0KLWVycl9ub19pcnE6Ci0JYXUxNTUwX3NwaV9kbWFfcnh0bXBfZnJlZShodyk7Ci0KLWVycl9kbWFfcnh0bXBfYWxsb2M6Ci1lcnJfbm9fcnhkbWFfZGVzY3I6Ci0JaWYgKGh3LT51c2VkbWEpCi0JCWF1MXh4eF9kYmRtYV9jaGFuX2ZyZWUoaHctPmRtYV9yeF9jaCk7Ci0KLWVycl9ub19yeGRtYToKLWVycl9ub190eGRtYV9kZXNjcjoKLQlpZiAoaHctPnVzZWRtYSkKLQkJYXUxeHh4X2RiZG1hX2NoYW5fZnJlZShody0+ZG1hX3R4X2NoKTsKLQotZXJyX25vX3R4ZG1hOgotCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWh3LT5yZWdzKTsKLQotZXJyX2lvcmVtYXA6Ci0JcmVsZWFzZV9yZXNvdXJjZShody0+aW9hcmVhKTsKLQlrZnJlZShody0+aW9hcmVhKTsKLQotZXJyX25vX2lvcmVzOgotZXJyX25vX3BkYXRhOgotCXNwaV9tYXN0ZXJfcHV0KGh3LT5tYXN0ZXIpOwotCi1lcnJfbm9tZW06Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgYXUxNTUwX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJzcGkgbWFzdGVyIHJlbW92ZTogYnVzX251bT0lZFxuIiwKLQkJaHctPm1hc3Rlci0+YnVzX251bSk7Ci0KLQlzcGlfYml0YmFuZ19zdG9wKCZody0+Yml0YmFuZyk7Ci0JZnJlZV9pcnEoaHctPmlycSwgaHcpOwotCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWh3LT5yZWdzKTsKLQlyZWxlYXNlX3Jlc291cmNlKGh3LT5pb2FyZWEpOwotCWtmcmVlKGh3LT5pb2FyZWEpOwotCi0JaWYgKGh3LT51c2VkbWEpIHsKLQkJYXUxNTUwX3NwaV9kbWFfcnh0bXBfZnJlZShodyk7Ci0JCWF1MXh4eF9kYmRtYV9jaGFuX2ZyZWUoaHctPmRtYV9yeF9jaCk7Ci0JCWF1MXh4eF9kYmRtYV9jaGFuX2ZyZWUoaHctPmRtYV90eF9jaCk7Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlzcGlfbWFzdGVyX3B1dChody0+bWFzdGVyKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCi1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmF1MTU1MC1zcGkiKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXUxNTUwX3NwaV9kcnYgPSB7Ci0JLnJlbW92ZSA9IF9fZXhpdF9wKGF1MTU1MF9zcGlfcmVtb3ZlKSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJhdTE1NTAtc3BpIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1MTU1MF9zcGlfaW5pdCh2b2lkKQotewotCS8qCi0JICogY3JlYXRlIG1lbW9yeSBkZXZpY2Ugd2l0aCA4IGJpdHMgZGV2X2RldndpZHRoCi0JICogbmVlZGVkIGZvciBwcm9wZXIgYnl0ZSBvcmRlcmluZyB0byBzcGkgZmlmbwotCSAqLwotCWlmICh1c2VkbWEpIHsKLQkJZGRtYV9tZW1pZCA9IGF1MXh4eF9kZG1hX2FkZF9kZXZpY2UoJmF1MTU1MF9zcGlfbWVtX2RiZGV2KTsKLQkJaWYgKCFkZG1hX21lbWlkKQotCQkJcHJpbnRrKEtFUk5fRVJSICJhdTE1NTAtc3BpOiBjYW5ub3QgYWRkIG1lbW9yeSIKLQkJCQkJImRiZG1hIGRldmljZVxuIik7Ci0JfQotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmF1MTU1MF9zcGlfZHJ2LCBhdTE1NTBfc3BpX3Byb2JlKTsKLX0KLW1vZHVsZV9pbml0KGF1MTU1MF9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdTE1NTBfc3BpX2V4aXQodm9pZCkKLXsKLQlpZiAodXNlZG1hICYmIGRkbWFfbWVtaWQpCi0JCWF1MXh4eF9kZG1hX2RlbF9kZXZpY2UoZGRtYV9tZW1pZCk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1MTU1MF9zcGlfZHJ2KTsKLX0KLW1vZHVsZV9leGl0KGF1MTU1MF9zcGlfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiQXUxNTUwIFBTQyBTUEkgRHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJKYW4gTmlraXRlbmtvIDxqYW4ubmlraXRlbmtvQGdtYWlsLmNvbT4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL2R3X3NwaS5jIGIvZHJpdmVycy9zcGkvZHdfc3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOWZhOWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvZHdfc3BpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MzYgKzAsMCBAQAotLyoKLSAqIGR3X3NwaS5jIC0gRGVzaWdud2FyZSBTUEkgY29yZSBjb250cm9sbGVyIGRyaXZlciAocmVmZXIgcHhhMnh4X3NwaS5jKQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotCi0jaW5jbHVkZSAiZHdfc3BpLmgiCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBTVEFSVF9TVEFURQkoKHZvaWQgKikwKQotI2RlZmluZSBSVU5OSU5HX1NUQVRFCSgodm9pZCAqKTEpCi0jZGVmaW5lIERPTkVfU1RBVEUJKCh2b2lkICopMikKLSNkZWZpbmUgRVJST1JfU1RBVEUJKCh2b2lkICopLTEpCi0KLSNkZWZpbmUgUVVFVUVfUlVOTklORwkwCi0jZGVmaW5lIFFVRVVFX1NUT1BQRUQJMQotCi0jZGVmaW5lIE1SU1RfU1BJX0RFQVNTRVJUCTAKLSNkZWZpbmUgTVJTVF9TUElfQVNTRVJUCQkxCi0KLS8qIFNsYXZlIHNwaV9kZXYgcmVsYXRlZCAqLwotc3RydWN0IGNoaXBfZGF0YSB7Ci0JdTE2IGNyMDsKLQl1OCBjczsJCQkvKiBjaGlwIHNlbGVjdCBwaW4gKi8KLQl1OCBuX2J5dGVzOwkJLyogY3VycmVudCBpcyBhIDEvMi80IGJ5dGUgb3AgKi8KLQl1OCB0bW9kZTsJCS8qIFRSL1RPL1JPL0VFUFJPTSAqLwotCXU4IHR5cGU7CQkvKiBTUEkvU1NQL01pY3JvV2lyZSAqLwotCi0JdTggcG9sbF9tb2RlOwkJLyogMSBtZWFucyB1c2UgcG9sbCBtb2RlICovCi0KLQl1MzIgZG1hX3dpZHRoOwotCXUzMiByeF90aHJlc2hvbGQ7Ci0JdTMyIHR4X3RocmVzaG9sZDsKLQl1OCBlbmFibGVfZG1hOwotCXU4IGJpdHNfcGVyX3dvcmQ7Ci0JdTE2IGNsa19kaXY7CQkvKiBiYXVkIHJhdGUgZGl2aWRlciAqLwotCXUzMiBzcGVlZF9oejsJCS8qIGJhdWQgcmF0ZSAqLwotCXZvaWQgKCpjc19jb250cm9sKSh1MzIgY29tbWFuZCk7Ci19OwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgaW50IHNwaV9zaG93X3JlZ3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIFNQSV9SRUdTX0JVRlNJWkUJMTAyNAotc3RhdGljIHNzaXplX3QgIHNwaV9zaG93X3JlZ3Moc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgZHdfc3BpICpkd3M7Ci0JY2hhciAqYnVmOwotCXUzMiBsZW4gPSAwOwotCXNzaXplX3QgcmV0OwotCi0JZHdzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JYnVmID0ga3phbGxvYyhTUElfUkVHU19CVUZTSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIDA7Ci0KLQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIk1SU1QgU1BJMCByZWdpc3RlcnM6XG4iKTsKLQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJDVFJMMDogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBjdHJsMCkpOwotCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiQ1RSTDE6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgY3RybDEpKTsKLQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIlNTSUVOUjogXHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgc3NpZW5yKSk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJTRVI6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgc2VyKSk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJCQVVEUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBiYXVkcikpOwotCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiVFhGVExSOiBcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCB0eGZsdHIpKTsKLQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIlJYRlRMUjogXHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgcnhmbHRyKSk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJUWEZMUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCB0eGZscikpOwotCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiUlhGTFI6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgcnhmbHIpKTsKLQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIlNSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIHNyKSk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJJTVI6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgaW1yKSk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJJU1I6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgaXNyKSk7Ci0JbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJETUFDUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBkbWFjcikpOwotCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiRE1BVERMUjogXHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgZG1hdGRscikpOwotCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiRE1BUkRMUjogXHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgZG1hcmRscikpOwotCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQotCXJldCA9ICBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1yc3Rfc3BpX3JlZ3Nfb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBzcGlfc2hvd19yZWdzX29wZW4sCi0JLnJlYWQJCT0gc3BpX3Nob3dfcmVncywKLQkubGxzZWVrCQk9IGRlZmF1bHRfbGxzZWVrLAotfTsKLQotc3RhdGljIGludCBtcnN0X3NwaV9kZWJ1Z2ZzX2luaXQoc3RydWN0IGR3X3NwaSAqZHdzKQotewotCWR3cy0+ZGVidWdmcyA9IGRlYnVnZnNfY3JlYXRlX2RpcigibXJzdF9zcGkiLCBOVUxMKTsKLQlpZiAoIWR3cy0+ZGVidWdmcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZWdpc3RlcnMiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJZHdzLT5kZWJ1Z2ZzLCAodm9pZCAqKWR3cywgJm1yc3Rfc3BpX3JlZ3Nfb3BzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXJzdF9zcGlfZGVidWdmc19yZW1vdmUoc3RydWN0IGR3X3NwaSAqZHdzKQotewotCWlmIChkd3MtPmRlYnVnZnMpCi0JCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkd3MtPmRlYnVnZnMpOwotfQotCi0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgbXJzdF9zcGlfZGVidWdmc19pbml0KHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1yc3Rfc3BpX2RlYnVnZnNfcmVtb3ZlKHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLX0KLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KLQotLyogUmV0dXJuIHRoZSBtYXggZW50cmllcyB3ZSBjYW4gZmlsbCBpbnRvIHR4IGZpZm8gKi8KLXN0YXRpYyBpbmxpbmUgdTMyIHR4X21heChzdHJ1Y3QgZHdfc3BpICpkd3MpCi17Ci0JdTMyIHR4X2xlZnQsIHR4X3Jvb20sIHJ4dHhfZ2FwOwotCi0JdHhfbGVmdCA9IChkd3MtPnR4X2VuZCAtIGR3cy0+dHgpIC8gZHdzLT5uX2J5dGVzOwotCXR4X3Jvb20gPSBkd3MtPmZpZm9fbGVuIC0gZHdfcmVhZHcoZHdzLCB0eGZscik7Ci0KLQkvKgotCSAqIEFub3RoZXIgY29uY2VybiBpcyBhYm91dCB0aGUgdHgvcnggbWlzbWF0Y2gsIHdlCi0JICogdGhvdWdoIHRvIHVzZSAoZHdzLT5maWZvX2xlbiAtIHJ4ZmxyIC0gdHhmbHIpIGFzCi0JICogb25lIG1heGltdW0gdmFsdWUgZm9yIHR4LCBidXQgaXQgZG9lc24ndCBjb3ZlciB0aGUKLQkgKiBkYXRhIHdoaWNoIGlzIG91dCBvZiB0eC9yeCBmaWZvIGFuZCBpbnNpZGUgdGhlCi0JICogc2hpZnQgcmVnaXN0ZXJzLiBTbyBhIGNvbnRyb2wgZnJvbSBzdyBwb2ludCBvZgotCSAqIHZpZXcgaXMgdGFrZW4uCi0JICovCi0Jcnh0eF9nYXAgPSAgKChkd3MtPnJ4X2VuZCAtIGR3cy0+cngpIC0gKGR3cy0+dHhfZW5kIC0gZHdzLT50eCkpCi0JCQkvIGR3cy0+bl9ieXRlczsKLQotCXJldHVybiBtaW4zKHR4X2xlZnQsIHR4X3Jvb20sICh1MzIpIChkd3MtPmZpZm9fbGVuIC0gcnh0eF9nYXApKTsKLX0KLQotLyogUmV0dXJuIHRoZSBtYXggZW50cmllcyB3ZSBzaG91bGQgcmVhZCBvdXQgb2YgcnggZmlmbyAqLwotc3RhdGljIGlubGluZSB1MzIgcnhfbWF4KHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQl1MzIgcnhfbGVmdCA9IChkd3MtPnJ4X2VuZCAtIGR3cy0+cngpIC8gZHdzLT5uX2J5dGVzOwotCi0JcmV0dXJuIG1pbihyeF9sZWZ0LCAodTMyKWR3X3JlYWR3KGR3cywgcnhmbHIpKTsKLX0KLQotc3RhdGljIHZvaWQgZHdfd3JpdGVyKHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQl1MzIgbWF4ID0gdHhfbWF4KGR3cyk7Ci0JdTE2IHR4dyA9IDA7Ci0KLQl3aGlsZSAobWF4LS0pIHsKLQkJLyogU2V0IHRoZSB0eCB3b3JkIGlmIHRoZSB0cmFuc2ZlcidzIG9yaWdpbmFsICJ0eCIgaXMgbm90IG51bGwgKi8KLQkJaWYgKGR3cy0+dHhfZW5kIC0gZHdzLT5sZW4pIHsKLQkJCWlmIChkd3MtPm5fYnl0ZXMgPT0gMSkKLQkJCQl0eHcgPSAqKHU4ICopKGR3cy0+dHgpOwotCQkJZWxzZQotCQkJCXR4dyA9ICoodTE2ICopKGR3cy0+dHgpOwotCQl9Ci0JCWR3X3dyaXRldyhkd3MsIGRyLCB0eHcpOwotCQlkd3MtPnR4ICs9IGR3cy0+bl9ieXRlczsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGR3X3JlYWRlcihzdHJ1Y3QgZHdfc3BpICpkd3MpCi17Ci0JdTMyIG1heCA9IHJ4X21heChkd3MpOwotCXUxNiByeHc7Ci0KLQl3aGlsZSAobWF4LS0pIHsKLQkJcnh3ID0gZHdfcmVhZHcoZHdzLCBkcik7Ci0JCS8qIENhcmUgcnggb25seSBpZiB0aGUgdHJhbnNmZXIncyBvcmlnaW5hbCAicngiIGlzIG5vdCBudWxsICovCi0JCWlmIChkd3MtPnJ4X2VuZCAtIGR3cy0+bGVuKSB7Ci0JCQlpZiAoZHdzLT5uX2J5dGVzID09IDEpCi0JCQkJKih1OCAqKShkd3MtPnJ4KSA9IHJ4dzsKLQkJCWVsc2UKLQkJCQkqKHUxNiAqKShkd3MtPnJ4KSA9IHJ4dzsKLQkJfQotCQlkd3MtPnJ4ICs9IGR3cy0+bl9ieXRlczsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkICpuZXh0X3RyYW5zZmVyKHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGR3cy0+Y3VyX21zZzsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFucyA9IGR3cy0+Y3VyX3RyYW5zZmVyOwotCi0JLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyICovCi0JaWYgKHRyYW5zLT50cmFuc2Zlcl9saXN0Lm5leHQgIT0gJm1zZy0+dHJhbnNmZXJzKSB7Ci0JCWR3cy0+Y3VyX3RyYW5zZmVyID0KLQkJCWxpc3RfZW50cnkodHJhbnMtPnRyYW5zZmVyX2xpc3QubmV4dCwKLQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwKLQkJCQkJdHJhbnNmZXJfbGlzdCk7Ci0JCXJldHVybiBSVU5OSU5HX1NUQVRFOwotCX0gZWxzZQotCQlyZXR1cm4gRE9ORV9TVEFURTsKLX0KLQotLyoKLSAqIE5vdGU6IGZpcnN0IHN0ZXAgaXMgdGhlIHByb3RvY29sIGRyaXZlciBwcmVwYXJlcwotICogYSBkbWEtY2FwYWJsZSBtZW1vcnksIGFuZCB0aGlzIGZ1bmMganVzdCBuZWVkIHRyYW5zbGF0ZQotICogdGhlIHZpcnQgYWRkciB0byBwaHlzaWNhbAotICovCi1zdGF0aWMgaW50IG1hcF9kbWFfYnVmZmVycyhzdHJ1Y3QgZHdfc3BpICpkd3MpCi17Ci0JaWYgKCFkd3MtPmN1cl9tc2ctPmlzX2RtYV9tYXBwZWQKLQkJfHwgIWR3cy0+ZG1hX2luaXRlZAotCQl8fCAhZHdzLT5jdXJfY2hpcC0+ZW5hYmxlX2RtYQotCQl8fCAhZHdzLT5kbWFfb3BzKQotCQlyZXR1cm4gMDsKLQotCWlmIChkd3MtPmN1cl90cmFuc2Zlci0+dHhfZG1hKQotCQlkd3MtPnR4X2RtYSA9IGR3cy0+Y3VyX3RyYW5zZmVyLT50eF9kbWE7Ci0KLQlpZiAoZHdzLT5jdXJfdHJhbnNmZXItPnJ4X2RtYSkKLQkJZHdzLT5yeF9kbWEgPSBkd3MtPmN1cl90cmFuc2Zlci0+cnhfZG1hOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIENhbGxlciBhbHJlYWR5IHNldCBtZXNzYWdlLT5zdGF0dXM7IGRtYSBhbmQgcGlvIGlycXMgYXJlIGJsb2NrZWQgKi8KLXN0YXRpYyB2b2lkIGdpdmViYWNrKHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpsYXN0X3RyYW5zZmVyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICptc2c7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZHdzLT5sb2NrLCBmbGFncyk7Ci0JbXNnID0gZHdzLT5jdXJfbXNnOwotCWR3cy0+Y3VyX21zZyA9IE5VTEw7Ci0JZHdzLT5jdXJfdHJhbnNmZXIgPSBOVUxMOwotCWR3cy0+cHJldl9jaGlwID0gZHdzLT5jdXJfY2hpcDsKLQlkd3MtPmN1cl9jaGlwID0gTlVMTDsKLQlkd3MtPmRtYV9tYXBwZWQgPSAwOwotCXF1ZXVlX3dvcmsoZHdzLT53b3JrcXVldWUsICZkd3MtPnB1bXBfbWVzc2FnZXMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOwotCi0JbGFzdF90cmFuc2ZlciA9IGxpc3RfZW50cnkobXNnLT50cmFuc2ZlcnMucHJldiwKLQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwKLQkJCQkJdHJhbnNmZXJfbGlzdCk7Ci0KLQlpZiAoIWxhc3RfdHJhbnNmZXItPmNzX2NoYW5nZSAmJiBkd3MtPmNzX2NvbnRyb2wpCi0JCWR3cy0+Y3NfY29udHJvbChNUlNUX1NQSV9ERUFTU0VSVCk7Ci0KLQltc2ctPnN0YXRlID0gTlVMTDsKLQlpZiAobXNnLT5jb21wbGV0ZSkKLQkJbXNnLT5jb21wbGV0ZShtc2ctPmNvbnRleHQpOwotfQotCi1zdGF0aWMgdm9pZCBpbnRfZXJyb3Jfc3RvcChzdHJ1Y3QgZHdfc3BpICpkd3MsIGNvbnN0IGNoYXIgKm1zZykKLXsKLQkvKiBTdG9wIHRoZSBodyAqLwotCXNwaV9lbmFibGVfY2hpcChkd3MsIDApOwotCi0JZGV2X2VycigmZHdzLT5tYXN0ZXItPmRldiwgIiVzXG4iLCBtc2cpOwotCWR3cy0+Y3VyX21zZy0+c3RhdGUgPSBFUlJPUl9TVEFURTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZkd3MtPnB1bXBfdHJhbnNmZXJzKTsKLX0KLQotdm9pZCBkd19zcGlfeGZlcl9kb25lKHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQkvKiBVcGRhdGUgdG90YWwgYnl0ZSB0cmFuc2ZlcnJlZCByZXR1cm4gY291bnQgYWN0dWFsIGJ5dGVzIHJlYWQgKi8KLQlkd3MtPmN1cl9tc2ctPmFjdHVhbF9sZW5ndGggKz0gZHdzLT5sZW47Ci0KLQkvKiBNb3ZlIHRvIG5leHQgdHJhbnNmZXIgKi8KLQlkd3MtPmN1cl9tc2ctPnN0YXRlID0gbmV4dF90cmFuc2Zlcihkd3MpOwotCi0JLyogSGFuZGxlIGVuZCBvZiBtZXNzYWdlICovCi0JaWYgKGR3cy0+Y3VyX21zZy0+c3RhdGUgPT0gRE9ORV9TVEFURSkgewotCQlkd3MtPmN1cl9tc2ctPnN0YXR1cyA9IDA7Ci0JCWdpdmViYWNrKGR3cyk7Ci0JfSBlbHNlCi0JCXRhc2tsZXRfc2NoZWR1bGUoJmR3cy0+cHVtcF90cmFuc2ZlcnMpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZHdfc3BpX3hmZXJfZG9uZSk7Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfdHJhbnNmZXIoc3RydWN0IGR3X3NwaSAqZHdzKQotewotCXUxNiBpcnFfc3RhdHVzID0gZHdfcmVhZHcoZHdzLCBpc3IpOwotCi0JLyogRXJyb3IgaGFuZGxpbmcgKi8KLQlpZiAoaXJxX3N0YXR1cyAmIChTUElfSU5UX1RYT0kgfCBTUElfSU5UX1JYT0kgfCBTUElfSU5UX1JYVUkpKSB7Ci0JCWR3X3JlYWR3KGR3cywgdHhvaWNyKTsKLQkJZHdfcmVhZHcoZHdzLCByeG9pY3IpOwotCQlkd19yZWFkdyhkd3MsIHJ4dWljcik7Ci0JCWludF9lcnJvcl9zdG9wKGR3cywgImludGVycnVwdF90cmFuc2ZlcjogZmlmbyBvdmVycnVuL3VuZGVycnVuIik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlkd19yZWFkZXIoZHdzKTsKLQlpZiAoZHdzLT5yeF9lbmQgPT0gZHdzLT5yeCkgewotCQlzcGlfbWFza19pbnRyKGR3cywgU1BJX0lOVF9UWEVJKTsKLQkJZHdfc3BpX3hmZXJfZG9uZShkd3MpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCWlmIChpcnFfc3RhdHVzICYgU1BJX0lOVF9UWEVJKSB7Ci0JCXNwaV9tYXNrX2ludHIoZHdzLCBTUElfSU5UX1RYRUkpOwotCQlkd193cml0ZXIoZHdzKTsKLQkJLyogRW5hYmxlIFRYIGlycSBhbHdheXMsIGl0IHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBSWCBmaW5pc2hlZCAqLwotCQlzcGlfdW1hc2tfaW50cihkd3MsIFNQSV9JTlRfVFhFSSk7Ci0JfQotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgZHdfc3BpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGR3X3NwaSAqZHdzID0gZGV2X2lkOwotCXUxNiBpcnFfc3RhdHVzID0gZHdfcmVhZHcoZHdzLCBpc3IpICYgMHgzZjsKLQotCWlmICghaXJxX3N0YXR1cykKLQkJcmV0dXJuIElSUV9OT05FOwotCi0JaWYgKCFkd3MtPmN1cl9tc2cpIHsKLQkJc3BpX21hc2tfaW50cihkd3MsIFNQSV9JTlRfVFhFSSk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlyZXR1cm4gZHdzLT50cmFuc2Zlcl9oYW5kbGVyKGR3cyk7Ci19Ci0KLS8qIE11c3QgYmUgY2FsbGVkIGluc2lkZSBwdW1wX3RyYW5zZmVycygpICovCi1zdGF0aWMgdm9pZCBwb2xsX3RyYW5zZmVyKHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQlkbyB7Ci0JCWR3X3dyaXRlcihkd3MpOwotCQlkd19yZWFkZXIoZHdzKTsKLQkJY3B1X3JlbGF4KCk7Ci0JfSB3aGlsZSAoZHdzLT5yeF9lbmQgPiBkd3MtPnJ4KTsKLQotCWR3X3NwaV94ZmVyX2RvbmUoZHdzKTsKLX0KLQotc3RhdGljIHZvaWQgcHVtcF90cmFuc2ZlcnModW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBkd19zcGkgKmR3cyA9IChzdHJ1Y3QgZHdfc3BpICopZGF0YTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UgPSBOVUxMOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zZmVyID0gTlVMTDsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpwcmV2aW91cyA9IE5VTEw7Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IE5VTEw7Ci0Jc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9IE5VTEw7Ci0JdTggYml0cyA9IDA7Ci0JdTggaW1hc2sgPSAwOwotCXU4IGNzX2NoYW5nZSA9IDA7Ci0JdTE2IHR4aW50X2xldmVsID0gMDsKLQl1MTYgY2xrX2RpdiA9IDA7Ci0JdTMyIHNwZWVkID0gMDsKLQl1MzIgY3IwID0gMDsKLQotCS8qIEdldCBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uICovCi0JbWVzc2FnZSA9IGR3cy0+Y3VyX21zZzsKLQl0cmFuc2ZlciA9IGR3cy0+Y3VyX3RyYW5zZmVyOwotCWNoaXAgPSBkd3MtPmN1cl9jaGlwOwotCXNwaSA9IG1lc3NhZ2UtPnNwaTsKLQotCWlmICh1bmxpa2VseSghY2hpcC0+Y2xrX2RpdikpCi0JCWNoaXAtPmNsa19kaXYgPSBkd3MtPm1heF9mcmVxIC8gY2hpcC0+c3BlZWRfaHo7Ci0KLQlpZiAobWVzc2FnZS0+c3RhdGUgPT0gRVJST1JfU1RBVEUpIHsKLQkJbWVzc2FnZS0+c3RhdHVzID0gLUVJTzsKLQkJZ290byBlYXJseV9leGl0OwotCX0KLQotCS8qIEhhbmRsZSBlbmQgb2YgbWVzc2FnZSAqLwotCWlmIChtZXNzYWdlLT5zdGF0ZSA9PSBET05FX1NUQVRFKSB7Ci0JCW1lc3NhZ2UtPnN0YXR1cyA9IDA7Ci0JCWdvdG8gZWFybHlfZXhpdDsKLQl9Ci0KLQkvKiBEZWxheSBpZiByZXF1ZXN0ZWQgYXQgZW5kIG9mIHRyYW5zZmVyKi8KLQlpZiAobWVzc2FnZS0+c3RhdGUgPT0gUlVOTklOR19TVEFURSkgewotCQlwcmV2aW91cyA9IGxpc3RfZW50cnkodHJhbnNmZXItPnRyYW5zZmVyX2xpc3QucHJldiwKLQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwKLQkJCQkJdHJhbnNmZXJfbGlzdCk7Ci0JCWlmIChwcmV2aW91cy0+ZGVsYXlfdXNlY3MpCi0JCQl1ZGVsYXkocHJldmlvdXMtPmRlbGF5X3VzZWNzKTsKLQl9Ci0KLQlkd3MtPm5fYnl0ZXMgPSBjaGlwLT5uX2J5dGVzOwotCWR3cy0+ZG1hX3dpZHRoID0gY2hpcC0+ZG1hX3dpZHRoOwotCWR3cy0+Y3NfY29udHJvbCA9IGNoaXAtPmNzX2NvbnRyb2w7Ci0KLQlkd3MtPnJ4X2RtYSA9IHRyYW5zZmVyLT5yeF9kbWE7Ci0JZHdzLT50eF9kbWEgPSB0cmFuc2Zlci0+dHhfZG1hOwotCWR3cy0+dHggPSAodm9pZCAqKXRyYW5zZmVyLT50eF9idWY7Ci0JZHdzLT50eF9lbmQgPSBkd3MtPnR4ICsgdHJhbnNmZXItPmxlbjsKLQlkd3MtPnJ4ID0gdHJhbnNmZXItPnJ4X2J1ZjsKLQlkd3MtPnJ4X2VuZCA9IGR3cy0+cnggKyB0cmFuc2Zlci0+bGVuOwotCWR3cy0+Y3NfY2hhbmdlID0gdHJhbnNmZXItPmNzX2NoYW5nZTsKLQlkd3MtPmxlbiA9IGR3cy0+Y3VyX3RyYW5zZmVyLT5sZW47Ci0JaWYgKGNoaXAgIT0gZHdzLT5wcmV2X2NoaXApCi0JCWNzX2NoYW5nZSA9IDE7Ci0KLQljcjAgPSBjaGlwLT5jcjA7Ci0KLQkvKiBIYW5kbGUgcGVyIHRyYW5zZmVyIG9wdGlvbnMgZm9yIGJwdyBhbmQgc3BlZWQgKi8KLQlpZiAodHJhbnNmZXItPnNwZWVkX2h6KSB7Ci0JCXNwZWVkID0gY2hpcC0+c3BlZWRfaHo7Ci0KLQkJaWYgKHRyYW5zZmVyLT5zcGVlZF9oeiAhPSBzcGVlZCkgewotCQkJc3BlZWQgPSB0cmFuc2Zlci0+c3BlZWRfaHo7Ci0JCQlpZiAoc3BlZWQgPiBkd3MtPm1heF9mcmVxKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJNUlNUIFNQSTA6IHVuc3VwcG9ydGVkIgotCQkJCQkiZnJlcTogJWRIelxuIiwgc3BlZWQpOwotCQkJCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU87Ci0JCQkJZ290byBlYXJseV9leGl0OwotCQkJfQotCi0JCQkvKiBjbGtfZGl2IGRvZXNuJ3Qgc3VwcG9ydCBvZGQgbnVtYmVyICovCi0JCQljbGtfZGl2ID0gZHdzLT5tYXhfZnJlcSAvIHNwZWVkOwotCQkJY2xrX2RpdiA9IChjbGtfZGl2ICsgMSkgJiAweGZmZmU7Ci0KLQkJCWNoaXAtPnNwZWVkX2h6ID0gc3BlZWQ7Ci0JCQljaGlwLT5jbGtfZGl2ID0gY2xrX2RpdjsKLQkJfQotCX0KLQlpZiAodHJhbnNmZXItPmJpdHNfcGVyX3dvcmQpIHsKLQkJYml0cyA9IHRyYW5zZmVyLT5iaXRzX3Blcl93b3JkOwotCi0JCXN3aXRjaCAoYml0cykgewotCQljYXNlIDg6Ci0JCWNhc2UgMTY6Ci0JCQlkd3MtPm5fYnl0ZXMgPSBkd3MtPmRtYV93aWR0aCA9IGJpdHMgPj4gMzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJNUlNUIFNQSTA6IHVuc3VwcG9ydGVkIGJpdHM6IgotCQkJCSIlZGJcbiIsIGJpdHMpOwotCQkJbWVzc2FnZS0+c3RhdHVzID0gLUVJTzsKLQkJCWdvdG8gZWFybHlfZXhpdDsKLQkJfQotCi0JCWNyMCA9IChiaXRzIC0gMSkKLQkJCXwgKGNoaXAtPnR5cGUgPDwgU1BJX0ZSRl9PRkZTRVQpCi0JCQl8IChzcGktPm1vZGUgPDwgU1BJX01PREVfT0ZGU0VUKQotCQkJfCAoY2hpcC0+dG1vZGUgPDwgU1BJX1RNT0RfT0ZGU0VUKTsKLQl9Ci0JbWVzc2FnZS0+c3RhdGUgPSBSVU5OSU5HX1NUQVRFOwotCi0JLyoKLQkgKiBBZGp1c3QgdHJhbnNmZXIgbW9kZSBpZiBuZWNlc3NhcnkuIFJlcXVpcmVzIHBsYXRmb3JtIGRlcGVuZGVudAotCSAqIGNoaXBzZWxlY3QgbWVjaGFuaXNtLgotCSAqLwotCWlmIChkd3MtPmNzX2NvbnRyb2wpIHsKLQkJaWYgKGR3cy0+cnggJiYgZHdzLT50eCkKLQkJCWNoaXAtPnRtb2RlID0gU1BJX1RNT0RfVFI7Ci0JCWVsc2UgaWYgKGR3cy0+cngpCi0JCQljaGlwLT50bW9kZSA9IFNQSV9UTU9EX1JPOwotCQllbHNlCi0JCQljaGlwLT50bW9kZSA9IFNQSV9UTU9EX1RPOwotCi0JCWNyMCAmPSB+U1BJX1RNT0RfTUFTSzsKLQkJY3IwIHw9IChjaGlwLT50bW9kZSA8PCBTUElfVE1PRF9PRkZTRVQpOwotCX0KLQotCS8qIENoZWNrIGlmIGN1cnJlbnQgdHJhbnNmZXIgaXMgYSBETUEgdHJhbnNhY3Rpb24gKi8KLQlkd3MtPmRtYV9tYXBwZWQgPSBtYXBfZG1hX2J1ZmZlcnMoZHdzKTsKLQotCS8qCi0JICogSW50ZXJydXB0IG1vZGUKLQkgKiB3ZSBvbmx5IG5lZWQgc2V0IHRoZSBUWEVJIElSUSwgYXMgVFgvUlggYWx3YXlzIGhhcHBlbiBzeW5jcm9uaXplbHkKLQkgKi8KLQlpZiAoIWR3cy0+ZG1hX21hcHBlZCAmJiAhY2hpcC0+cG9sbF9tb2RlKSB7Ci0JCWludCB0ZW1wbGVuID0gZHdzLT5sZW4gLyBkd3MtPm5fYnl0ZXM7Ci0JCXR4aW50X2xldmVsID0gZHdzLT5maWZvX2xlbiAvIDI7Ci0JCXR4aW50X2xldmVsID0gKHRlbXBsZW4gPiB0eGludF9sZXZlbCkgPyB0eGludF9sZXZlbCA6IHRlbXBsZW47Ci0KLQkJaW1hc2sgfD0gU1BJX0lOVF9UWEVJIHwgU1BJX0lOVF9UWE9JIHwgU1BJX0lOVF9SWFVJIHwgU1BJX0lOVF9SWE9JOwotCQlkd3MtPnRyYW5zZmVyX2hhbmRsZXIgPSBpbnRlcnJ1cHRfdHJhbnNmZXI7Ci0JfQotCi0JLyoKLQkgKiBSZXByb2dyYW0gcmVnaXN0ZXJzIG9ubHkgaWYKLQkgKgkxLiBjaGlwIHNlbGVjdCBjaGFuZ2VzCi0JICoJMi4gY2xrX2RpdiBpcyBjaGFuZ2VkCi0JICoJMy4gY29udHJvbCB2YWx1ZSBjaGFuZ2VzCi0JICovCi0JaWYgKGR3X3JlYWR3KGR3cywgY3RybDApICE9IGNyMCB8fCBjc19jaGFuZ2UgfHwgY2xrX2RpdiB8fCBpbWFzaykgewotCQlzcGlfZW5hYmxlX2NoaXAoZHdzLCAwKTsKLQotCQlpZiAoZHdfcmVhZHcoZHdzLCBjdHJsMCkgIT0gY3IwKQotCQkJZHdfd3JpdGV3KGR3cywgY3RybDAsIGNyMCk7Ci0KLQkJc3BpX3NldF9jbGsoZHdzLCBjbGtfZGl2ID8gY2xrX2RpdiA6IGNoaXAtPmNsa19kaXYpOwotCQlzcGlfY2hpcF9zZWwoZHdzLCBzcGktPmNoaXBfc2VsZWN0KTsKLQotCQkvKiBTZXQgdGhlIGludGVycnVwdCBtYXNrLCBmb3IgcG9sbCBtb2RlIGp1c3QgZGlzYWJsZSBhbGwgaW50ICovCi0JCXNwaV9tYXNrX2ludHIoZHdzLCAweGZmKTsKLQkJaWYgKGltYXNrKQotCQkJc3BpX3VtYXNrX2ludHIoZHdzLCBpbWFzayk7Ci0JCWlmICh0eGludF9sZXZlbCkKLQkJCWR3X3dyaXRldyhkd3MsIHR4Zmx0ciwgdHhpbnRfbGV2ZWwpOwotCi0JCXNwaV9lbmFibGVfY2hpcChkd3MsIDEpOwotCQlpZiAoY3NfY2hhbmdlKQotCQkJZHdzLT5wcmV2X2NoaXAgPSBjaGlwOwotCX0KLQotCWlmIChkd3MtPmRtYV9tYXBwZWQpCi0JCWR3cy0+ZG1hX29wcy0+ZG1hX3RyYW5zZmVyKGR3cywgY3NfY2hhbmdlKTsKLQotCWlmIChjaGlwLT5wb2xsX21vZGUpCi0JCXBvbGxfdHJhbnNmZXIoZHdzKTsKLQotCXJldHVybjsKLQotZWFybHlfZXhpdDoKLQlnaXZlYmFjayhkd3MpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgcHVtcF9tZXNzYWdlcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGR3X3NwaSAqZHdzID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkd19zcGksIHB1bXBfbWVzc2FnZXMpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBMb2NrIHF1ZXVlIGFuZCBjaGVjayBmb3IgcXVldWUgd29yayAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZkd3MtPmxvY2ssIGZsYWdzKTsKLQlpZiAobGlzdF9lbXB0eSgmZHdzLT5xdWV1ZSkgfHwgZHdzLT5ydW4gPT0gUVVFVUVfU1RPUFBFRCkgewotCQlkd3MtPmJ1c3kgPSAwOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd3MtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGFscmVhZHkgcnVubmluZyBhIG1lc3NhZ2UgKi8KLQlpZiAoZHdzLT5jdXJfbXNnKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogRXh0cmFjdCBoZWFkIG9mIHF1ZXVlICovCi0JZHdzLT5jdXJfbXNnID0gbGlzdF9lbnRyeShkd3MtPnF1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOwotCWxpc3RfZGVsX2luaXQoJmR3cy0+Y3VyX21zZy0+cXVldWUpOwotCi0JLyogSW5pdGlhbCBtZXNzYWdlIHN0YXRlKi8KLQlkd3MtPmN1cl9tc2ctPnN0YXRlID0gU1RBUlRfU1RBVEU7Ci0JZHdzLT5jdXJfdHJhbnNmZXIgPSBsaXN0X2VudHJ5KGR3cy0+Y3VyX21zZy0+dHJhbnNmZXJzLm5leHQsCi0JCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAotCQkJCQkJdHJhbnNmZXJfbGlzdCk7Ci0JZHdzLT5jdXJfY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShkd3MtPmN1cl9tc2ctPnNwaSk7Ci0KLQkvKiBNYXJrIGFzIGJ1c3kgYW5kIGxhdW5jaCB0cmFuc2ZlcnMgKi8KLQl0YXNrbGV0X3NjaGVkdWxlKCZkd3MtPnB1bXBfdHJhbnNmZXJzKTsKLQotCWR3cy0+YnVzeSA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHdzLT5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIHNwaV9kZXZpY2UgdXNlIHRoaXMgdG8gcXVldWUgaW4gdGhlaXIgc3BpX21zZyAqLwotc3RhdGljIGludCBkd19zcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCi17Ci0Jc3RydWN0IGR3X3NwaSAqZHdzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkd3MtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChkd3MtPnJ1biA9PSBRVUVVRV9TVE9QUEVEKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVTSFVURE9XTjsKLQl9Ci0KLQltc2ctPmFjdHVhbF9sZW5ndGggPSAwOwotCW1zZy0+c3RhdHVzID0gLUVJTlBST0dSRVNTOwotCW1zZy0+c3RhdGUgPSBTVEFSVF9TVEFURTsKLQotCWxpc3RfYWRkX3RhaWwoJm1zZy0+cXVldWUsICZkd3MtPnF1ZXVlKTsKLQotCWlmIChkd3MtPnJ1biA9PSBRVUVVRV9SVU5OSU5HICYmICFkd3MtPmJ1c3kpIHsKLQotCQlpZiAoZHdzLT5jdXJfdHJhbnNmZXIgfHwgZHdzLT5jdXJfbXNnKQotCQkJcXVldWVfd29yayhkd3MtPndvcmtxdWV1ZSwKLQkJCQkJJmR3cy0+cHVtcF9tZXNzYWdlcyk7Ci0JCWVsc2UgewotCQkJLyogSWYgbm8gb3RoZXIgZGF0YSB0cmFuc2FjdGlvbiBpbiBhaXIsIGp1c3QgZ28gKi8KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOwotCQkJcHVtcF9tZXNzYWdlcygmZHdzLT5wdW1wX21lc3NhZ2VzKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHdzLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgbWF5IGJlIGNhbGxlZCB0d2ljZSBmb3IgZWFjaCBzcGkgZGV2ICovCi1zdGF0aWMgaW50IGR3X3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBkd19zcGlfY2hpcCAqY2hpcF9pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwOwotCi0JaWYgKHNwaS0+Yml0c19wZXJfd29yZCAhPSA4ICYmIHNwaS0+Yml0c19wZXJfd29yZCAhPSAxNikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBPbmx5IGFsbG9jIG9uIGZpcnN0IHNldHVwICovCi0JY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwotCWlmICghY2hpcCkgewotCQljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoaXBfZGF0YSksIEdGUF9LRVJORUwpOwotCQlpZiAoIWNoaXApCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKgotCSAqIFByb3RvY29sIGRyaXZlcnMgbWF5IGNoYW5nZSB0aGUgY2hpcCBzZXR0aW5ncywgc28uLi4KLQkgKiBpZiBjaGlwX2luZm8gZXhpc3RzLCB1c2UgaXQKLQkgKi8KLQljaGlwX2luZm8gPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKLQotCS8qIGNoaXBfaW5mbyBkb2Vzbid0IGFsd2F5cyBleGlzdCAqLwotCWlmIChjaGlwX2luZm8pIHsKLQkJaWYgKGNoaXBfaW5mby0+Y3NfY29udHJvbCkKLQkJCWNoaXAtPmNzX2NvbnRyb2wgPSBjaGlwX2luZm8tPmNzX2NvbnRyb2w7Ci0KLQkJY2hpcC0+cG9sbF9tb2RlID0gY2hpcF9pbmZvLT5wb2xsX21vZGU7Ci0JCWNoaXAtPnR5cGUgPSBjaGlwX2luZm8tPnR5cGU7Ci0KLQkJY2hpcC0+cnhfdGhyZXNob2xkID0gMDsKLQkJY2hpcC0+dHhfdGhyZXNob2xkID0gMDsKLQotCQljaGlwLT5lbmFibGVfZG1hID0gY2hpcF9pbmZvLT5lbmFibGVfZG1hOwotCX0KLQotCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPD0gOCkgewotCQljaGlwLT5uX2J5dGVzID0gMTsKLQkJY2hpcC0+ZG1hX3dpZHRoID0gMTsKLQl9IGVsc2UgaWYgKHNwaS0+Yml0c19wZXJfd29yZCA8PSAxNikgewotCQljaGlwLT5uX2J5dGVzID0gMjsKLQkJY2hpcC0+ZG1hX3dpZHRoID0gMjsKLQl9IGVsc2UgewotCQkvKiBOZXZlciB0YWtlID4xNmIgY2FzZSBmb3IgTVJTVCBTUElDICovCi0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiaW52YWxpZCB3b3Jkc2l6ZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQljaGlwLT5iaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCi0JaWYgKCFzcGktPm1heF9zcGVlZF9oeikgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIk5vIG1heCBzcGVlZCBIWiBwYXJhbWV0ZXJcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JY2hpcC0+c3BlZWRfaHogPSBzcGktPm1heF9zcGVlZF9oejsKLQotCWNoaXAtPnRtb2RlID0gMDsgLyogVHggJiBSeCAqLwotCS8qIERlZmF1bHQgU1BJIG1vZGUgaXMgU0NQT0wgPSAwLCBTQ1BIID0gMCAqLwotCWNoaXAtPmNyMCA9IChjaGlwLT5iaXRzX3Blcl93b3JkIC0gMSkKLQkJCXwgKGNoaXAtPnR5cGUgPDwgU1BJX0ZSRl9PRkZTRVQpCi0JCQl8IChzcGktPm1vZGUgIDw8IFNQSV9NT0RFX09GRlNFVCkKLQkJCXwgKGNoaXAtPnRtb2RlIDw8IFNQSV9UTU9EX09GRlNFVCk7Ci0KLQlzcGlfc2V0X2N0bGRhdGEoc3BpLCBjaGlwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZHdfc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7Ci0Ja2ZyZWUoY2hpcCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfcXVldWUoc3RydWN0IGR3X3NwaSAqZHdzKQotewotCUlOSVRfTElTVF9IRUFEKCZkd3MtPnF1ZXVlKTsKLQlzcGluX2xvY2tfaW5pdCgmZHdzLT5sb2NrKTsKLQotCWR3cy0+cnVuID0gUVVFVUVfU1RPUFBFRDsKLQlkd3MtPmJ1c3kgPSAwOwotCi0JdGFza2xldF9pbml0KCZkd3MtPnB1bXBfdHJhbnNmZXJzLAotCQkJcHVtcF90cmFuc2ZlcnMsCSh1bnNpZ25lZCBsb25nKWR3cyk7Ci0KLQlJTklUX1dPUksoJmR3cy0+cHVtcF9tZXNzYWdlcywgcHVtcF9tZXNzYWdlcyk7Ci0JZHdzLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKLQkJCQkJZGV2X25hbWUoZHdzLT5tYXN0ZXItPmRldi5wYXJlbnQpKTsKLQlpZiAoZHdzLT53b3JrcXVldWUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0YXJ0X3F1ZXVlKHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmR3cy0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGR3cy0+cnVuID09IFFVRVVFX1JVTk5JTkcgfHwgZHdzLT5idXN5KSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWR3cy0+cnVuID0gUVVFVUVfUlVOTklORzsKLQlkd3MtPmN1cl9tc2cgPSBOVUxMOwotCWR3cy0+Y3VyX3RyYW5zZmVyID0gTlVMTDsKLQlkd3MtPmN1cl9jaGlwID0gTlVMTDsKLQlkd3MtPnByZXZfY2hpcCA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHdzLT5sb2NrLCBmbGFncyk7Ci0KLQlxdWV1ZV93b3JrKGR3cy0+d29ya3F1ZXVlLCAmZHdzLT5wdW1wX21lc3NhZ2VzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0b3BfcXVldWUoc3RydWN0IGR3X3NwaSAqZHdzKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbGltaXQgPSA1MDsKLQlpbnQgc3RhdHVzID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkd3MtPmxvY2ssIGZsYWdzKTsKLQlkd3MtPnJ1biA9IFFVRVVFX1NUT1BQRUQ7Ci0Jd2hpbGUgKCghbGlzdF9lbXB0eSgmZHdzLT5xdWV1ZSkgfHwgZHdzLT5idXN5KSAmJiBsaW1pdC0tKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOwotCQltc2xlZXAoMTApOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHdzLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKCFsaXN0X2VtcHR5KCZkd3MtPnF1ZXVlKSB8fCBkd3MtPmJ1c3kpCi0JCXN0YXR1cyA9IC1FQlVTWTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd3MtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgZGVzdHJveV9xdWV1ZShzdHJ1Y3QgZHdfc3BpICpkd3MpCi17Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IHN0b3BfcXVldWUoZHdzKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiBzdGF0dXM7Ci0JZGVzdHJveV93b3JrcXVldWUoZHdzLT53b3JrcXVldWUpOwotCXJldHVybiAwOwotfQotCi0vKiBSZXN0YXJ0IHRoZSBjb250cm9sbGVyLCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLCBjbGVhbiByeCBmaWZvICovCi1zdGF0aWMgdm9pZCBzcGlfaHdfaW5pdChzdHJ1Y3QgZHdfc3BpICpkd3MpCi17Ci0Jc3BpX2VuYWJsZV9jaGlwKGR3cywgMCk7Ci0Jc3BpX21hc2tfaW50cihkd3MsIDB4ZmYpOwotCXNwaV9lbmFibGVfY2hpcChkd3MsIDEpOwotCi0JLyoKLQkgKiBUcnkgdG8gZGV0ZWN0IHRoZSBGSUZPIGRlcHRoIGlmIG5vdCBzZXQgYnkgaW50ZXJmYWNlIGRyaXZlciwKLQkgKiB0aGUgZGVwdGggY291bGQgYmUgZnJvbSAyIHRvIDI1NiBmcm9tIEhXIHNwZWMKLQkgKi8KLQlpZiAoIWR3cy0+Zmlmb19sZW4pIHsKLQkJdTMyIGZpZm87Ci0JCWZvciAoZmlmbyA9IDI7IGZpZm8gPD0gMjU3OyBmaWZvKyspIHsKLQkJCWR3X3dyaXRldyhkd3MsIHR4Zmx0ciwgZmlmbyk7Ci0JCQlpZiAoZmlmbyAhPSBkd19yZWFkdyhkd3MsIHR4Zmx0cikpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlkd3MtPmZpZm9fbGVuID0gKGZpZm8gPT0gMjU3KSA/IDAgOiBmaWZvOwotCQlkd193cml0ZXcoZHdzLCB0eGZsdHIsIDApOwotCX0KLX0KLQotaW50IF9fZGV2aW5pdCBkd19zcGlfYWRkX2hvc3Qoc3RydWN0IGR3X3NwaSAqZHdzKQotewotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7Ci0JaW50IHJldDsKLQotCUJVR19PTihkd3MgPT0gTlVMTCk7Ci0KLQltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKGR3cy0+cGFyZW50X2RldiwgMCk7Ci0JaWYgKCFtYXN0ZXIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQotCWR3cy0+bWFzdGVyID0gbWFzdGVyOwotCWR3cy0+dHlwZSA9IFNTSV9NT1RPX1NQSTsKLQlkd3MtPnByZXZfY2hpcCA9IE5VTEw7Ci0JZHdzLT5kbWFfaW5pdGVkID0gMDsKLQlkd3MtPmRtYV9hZGRyID0gKGRtYV9hZGRyX3QpKGR3cy0+cGFkZHIgKyAweDYwKTsKLQotCXJldCA9IHJlcXVlc3RfaXJxKGR3cy0+aXJxLCBkd19zcGlfaXJxLCBJUlFGX1NIQVJFRCwKLQkJCSJkd19zcGkiLCBkd3MpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAiY2FuIG5vdCBnZXQgSVJRXG4iKTsKLQkJZ290byBlcnJfZnJlZV9tYXN0ZXI7Ci0JfQotCi0JbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBOwotCW1hc3Rlci0+YnVzX251bSA9IGR3cy0+YnVzX251bTsKLQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gZHdzLT5udW1fY3M7Ci0JbWFzdGVyLT5jbGVhbnVwID0gZHdfc3BpX2NsZWFudXA7Ci0JbWFzdGVyLT5zZXR1cCA9IGR3X3NwaV9zZXR1cDsKLQltYXN0ZXItPnRyYW5zZmVyID0gZHdfc3BpX3RyYW5zZmVyOwotCi0JLyogQmFzaWMgSFcgaW5pdCAqLwotCXNwaV9od19pbml0KGR3cyk7Ci0KLQlpZiAoZHdzLT5kbWFfb3BzICYmIGR3cy0+ZG1hX29wcy0+ZG1hX2luaXQpIHsKLQkJcmV0ID0gZHdzLT5kbWFfb3BzLT5kbWFfaW5pdChkd3MpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfd2FybigmbWFzdGVyLT5kZXYsICJETUEgaW5pdCBmYWlsZWRcbiIpOwotCQkJZHdzLT5kbWFfaW5pdGVkID0gMDsKLQkJfQotCX0KLQotCS8qIEluaXRpYWwgYW5kIHN0YXJ0IHF1ZXVlICovCi0JcmV0ID0gaW5pdF9xdWV1ZShkd3MpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmbWFzdGVyLT5kZXYsICJwcm9ibGVtIGluaXRpYWxpemluZyBxdWV1ZVxuIik7Ci0JCWdvdG8gZXJyX2RpYWJsZV9odzsKLQl9Ci0JcmV0ID0gc3RhcnRfcXVldWUoZHdzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAicHJvYmxlbSBzdGFydGluZyBxdWV1ZVxuIik7Ci0JCWdvdG8gZXJyX2RpYWJsZV9odzsKLQl9Ci0KLQlzcGlfbWFzdGVyX3NldF9kZXZkYXRhKG1hc3RlciwgZHdzKTsKLQlyZXQgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgInByb2JsZW0gcmVnaXN0ZXJpbmcgc3BpIG1hc3RlclxuIik7Ci0JCWdvdG8gZXJyX3F1ZXVlX2FsbG9jOwotCX0KLQotCW1yc3Rfc3BpX2RlYnVnZnNfaW5pdChkd3MpOwotCXJldHVybiAwOwotCi1lcnJfcXVldWVfYWxsb2M6Ci0JZGVzdHJveV9xdWV1ZShkd3MpOwotCWlmIChkd3MtPmRtYV9vcHMgJiYgZHdzLT5kbWFfb3BzLT5kbWFfZXhpdCkKLQkJZHdzLT5kbWFfb3BzLT5kbWFfZXhpdChkd3MpOwotZXJyX2RpYWJsZV9odzoKLQlzcGlfZW5hYmxlX2NoaXAoZHdzLCAwKTsKLQlmcmVlX2lycShkd3MtPmlycSwgZHdzKTsKLWVycl9mcmVlX21hc3RlcjoKLQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZHdfc3BpX2FkZF9ob3N0KTsKLQotdm9pZCBfX2RldmV4aXQgZHdfc3BpX3JlbW92ZV9ob3N0KHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQotCWlmICghZHdzKQotCQlyZXR1cm47Ci0JbXJzdF9zcGlfZGVidWdmc19yZW1vdmUoZHdzKTsKLQotCS8qIFJlbW92ZSB0aGUgcXVldWUgKi8KLQlzdGF0dXMgPSBkZXN0cm95X3F1ZXVlKGR3cyk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlkZXZfZXJyKCZkd3MtPm1hc3Rlci0+ZGV2LCAiZHdfc3BpX3JlbW92ZTogd29ya3F1ZXVlIHdpbGwgbm90ICIKLQkJCSJjb21wbGV0ZSwgbWVzc2FnZSBtZW1vcnkgbm90IGZyZWVkXG4iKTsKLQotCWlmIChkd3MtPmRtYV9vcHMgJiYgZHdzLT5kbWFfb3BzLT5kbWFfZXhpdCkKLQkJZHdzLT5kbWFfb3BzLT5kbWFfZXhpdChkd3MpOwotCXNwaV9lbmFibGVfY2hpcChkd3MsIDApOwotCS8qIERpc2FibGUgY2xrICovCi0Jc3BpX3NldF9jbGsoZHdzLCAwKTsKLQlmcmVlX2lycShkd3MtPmlycSwgZHdzKTsKLQotCS8qIERpc2Nvbm5lY3QgZnJvbSB0aGUgU1BJIGZyYW1ld29yayAqLwotCXNwaV91bnJlZ2lzdGVyX21hc3Rlcihkd3MtPm1hc3Rlcik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChkd19zcGlfcmVtb3ZlX2hvc3QpOwotCi1pbnQgZHdfc3BpX3N1c3BlbmRfaG9zdChzdHJ1Y3QgZHdfc3BpICpkd3MpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBzdG9wX3F1ZXVlKGR3cyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlzcGlfZW5hYmxlX2NoaXAoZHdzLCAwKTsKLQlzcGlfc2V0X2Nsayhkd3MsIDApOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChkd19zcGlfc3VzcGVuZF9ob3N0KTsKLQotaW50IGR3X3NwaV9yZXN1bWVfaG9zdChzdHJ1Y3QgZHdfc3BpICpkd3MpCi17Ci0JaW50IHJldDsKLQotCXNwaV9od19pbml0KGR3cyk7Ci0JcmV0ID0gc3RhcnRfcXVldWUoZHdzKTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKCZkd3MtPm1hc3Rlci0+ZGV2LCAiZmFpbCB0byBzdGFydCBxdWV1ZSAoJWQpXG4iLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChkd19zcGlfcmVzdW1lX2hvc3QpOwotCi1NT0RVTEVfQVVUSE9SKCJGZW5nIFRhbmcgPGZlbmcudGFuZ0BpbnRlbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgRGVzaWduV2FyZSBTUEkgY29udHJvbGxlciBjb3JlIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9kd19zcGkuaCBiL2RyaXZlcnMvc3BpL2R3X3NwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTVlNzhkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3BpL2R3X3NwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLSNpZm5kZWYgRFdfU1BJX0hFQURFUl9ICi0jZGVmaW5lIERXX1NQSV9IRUFERVJfSAotCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgotCi0vKiBCaXQgZmllbGRzIGluIENUUkxSMCAqLwotI2RlZmluZSBTUElfREZTX09GRlNFVAkJCTAKLQotI2RlZmluZSBTUElfRlJGX09GRlNFVAkJCTQKLSNkZWZpbmUgU1BJX0ZSRl9TUEkJCQkweDAKLSNkZWZpbmUgU1BJX0ZSRl9TU1AJCQkweDEKLSNkZWZpbmUgU1BJX0ZSRl9NSUNST1dJUkUJCTB4MgotI2RlZmluZSBTUElfRlJGX1JFU1YJCQkweDMKLQotI2RlZmluZSBTUElfTU9ERV9PRkZTRVQJCQk2Ci0jZGVmaW5lIFNQSV9TQ1BIX09GRlNFVAkJCTYKLSNkZWZpbmUgU1BJX1NDT0xfT0ZGU0VUCQkJNwotCi0jZGVmaW5lIFNQSV9UTU9EX09GRlNFVAkJCTgKLSNkZWZpbmUgU1BJX1RNT0RfTUFTSwkJCSgweDMgPDwgU1BJX1RNT0RfT0ZGU0VUKQotI2RlZmluZQlTUElfVE1PRF9UUgkJCTB4MAkJLyogeG1pdCAmIHJlY3YgKi8KLSNkZWZpbmUgU1BJX1RNT0RfVE8JCQkweDEJCS8qIHhtaXQgb25seSAqLwotI2RlZmluZSBTUElfVE1PRF9STwkJCTB4MgkJLyogcmVjdiBvbmx5ICovCi0jZGVmaW5lIFNQSV9UTU9EX0VQUk9NUkVBRAkJMHgzCQkvKiBlZXByb20gcmVhZCBtb2RlICovCi0KLSNkZWZpbmUgU1BJX1NMVk9FX09GRlNFVAkJMTAKLSNkZWZpbmUgU1BJX1NSTF9PRkZTRVQJCQkxMQotI2RlZmluZSBTUElfQ0ZTX09GRlNFVAkJCTEyCi0KLS8qIEJpdCBmaWVsZHMgaW4gU1IsIDcgYml0cyAqLwotI2RlZmluZSBTUl9NQVNLCQkJCTB4N2YJCS8qIGNvdmVyIDcgYml0cyAqLwotI2RlZmluZSBTUl9CVVNZCQkJCSgxIDw8IDApCi0jZGVmaW5lIFNSX1RGX05PVF9GVUxMCQkJKDEgPDwgMSkKLSNkZWZpbmUgU1JfVEZfRU1QVAkJCSgxIDw8IDIpCi0jZGVmaW5lIFNSX1JGX05PVF9FTVBUCQkJKDEgPDwgMykKLSNkZWZpbmUgU1JfUkZfRlVMTAkJCSgxIDw8IDQpCi0jZGVmaW5lIFNSX1RYX0VSUgkJCSgxIDw8IDUpCi0jZGVmaW5lIFNSX0RDT0wJCQkJKDEgPDwgNikKLQotLyogQml0IGZpZWxkcyBpbiBJU1IsIElNUiwgUklTUiwgNyBiaXRzICovCi0jZGVmaW5lIFNQSV9JTlRfVFhFSQkJCSgxIDw8IDApCi0jZGVmaW5lIFNQSV9JTlRfVFhPSQkJCSgxIDw8IDEpCi0jZGVmaW5lIFNQSV9JTlRfUlhVSQkJCSgxIDw8IDIpCi0jZGVmaW5lIFNQSV9JTlRfUlhPSQkJCSgxIDw8IDMpCi0jZGVmaW5lIFNQSV9JTlRfUlhGSQkJCSgxIDw8IDQpCi0jZGVmaW5lIFNQSV9JTlRfTVNUSQkJCSgxIDw8IDUpCi0KLS8qIFRYIFJYIGludGVycnVwdCBsZXZlbCB0aHJlc2hvbGQsIG1heCBjYW4gYmUgMjU2ICovCi0jZGVmaW5lIFNQSV9JTlRfVEhSRVNIT0xECQkzMgotCi1lbnVtIGR3X3NzaV90eXBlIHsKLQlTU0lfTU9UT19TUEkgPSAwLAotCVNTSV9USV9TU1AsCi0JU1NJX05TX01JQ1JPV0lSRSwKLX07Ci0KLXN0cnVjdCBkd19zcGlfcmVnIHsKLQl1MzIJY3RybDA7Ci0JdTMyCWN0cmwxOwotCXUzMglzc2llbnI7Ci0JdTMyCW13Y3I7Ci0JdTMyCXNlcjsKLQl1MzIJYmF1ZHI7Ci0JdTMyCXR4Zmx0cjsKLQl1MzIJcnhmbHRyOwotCXUzMgl0eGZscjsKLQl1MzIJcnhmbHI7Ci0JdTMyCXNyOwotCXUzMglpbXI7Ci0JdTMyCWlzcjsKLQl1MzIJcmlzcjsKLQl1MzIJdHhvaWNyOwotCXUzMglyeG9pY3I7Ci0JdTMyCXJ4dWljcjsKLQl1MzIJbXN0aWNyOwotCXUzMglpY3I7Ci0JdTMyCWRtYWNyOwotCXUzMglkbWF0ZGxyOwotCXUzMglkbWFyZGxyOwotCXUzMglpZHI7Ci0JdTMyCXZlcnNpb247Ci0JdTMyCWRyOwkJLyogQ3VycmVudGx5IG9wZXIgYXMgMzIgYml0cywKLQkJCQl0aG91Z2ggb25seSBsb3cgMTYgYml0cyBtYXR0ZXJzICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgZHdfc3BpOwotc3RydWN0IGR3X3NwaV9kbWFfb3BzIHsKLQlpbnQgKCpkbWFfaW5pdCkoc3RydWN0IGR3X3NwaSAqZHdzKTsKLQl2b2lkICgqZG1hX2V4aXQpKHN0cnVjdCBkd19zcGkgKmR3cyk7Ci0JaW50ICgqZG1hX3RyYW5zZmVyKShzdHJ1Y3QgZHdfc3BpICpkd3MsIGludCBjc19jaGFuZ2UpOwotfTsKLQotc3RydWN0IGR3X3NwaSB7Ci0Jc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKLQlzdHJ1Y3Qgc3BpX2RldmljZQkqY3VyX2RldjsKLQlzdHJ1Y3QgZGV2aWNlCQkqcGFyZW50X2RldjsKLQllbnVtIGR3X3NzaV90eXBlCXR5cGU7Ci0KLQl2b2lkIF9faW9tZW0JCSpyZWdzOwotCXVuc2lnbmVkIGxvbmcJCXBhZGRyOwotCXUzMgkJCWlvbGVuOwotCWludAkJCWlycTsKLQl1MzIJCQlmaWZvX2xlbjsJLyogZGVwdGggb2YgdGhlIEZJRk8gYnVmZmVyICovCi0JdTMyCQkJbWF4X2ZyZXE7CS8qIG1heCBidXMgZnJlcSBzdXBwb3J0ZWQgKi8KLQotCXUxNgkJCWJ1c19udW07Ci0JdTE2CQkJbnVtX2NzOwkJLyogc3VwcG9ydGVkIHNsYXZlIG51bWJlcnMgKi8KLQotCS8qIERyaXZlciBtZXNzYWdlIHF1ZXVlICovCi0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKndvcmtxdWV1ZTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcHVtcF9tZXNzYWdlczsKLQlzcGlubG9ja190CQlsb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7Ci0JaW50CQkJYnVzeTsKLQlpbnQJCQlydW47Ci0KLQkvKiBNZXNzYWdlIFRyYW5zZmVyIHB1bXAgKi8KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcHVtcF90cmFuc2ZlcnM7Ci0KLQkvKiBDdXJyZW50IG1lc3NhZ2UgdHJhbnNmZXIgc3RhdGUgaW5mbyAqLwotCXN0cnVjdCBzcGlfbWVzc2FnZQkqY3VyX21zZzsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSpjdXJfdHJhbnNmZXI7Ci0Jc3RydWN0IGNoaXBfZGF0YQkqY3VyX2NoaXA7Ci0Jc3RydWN0IGNoaXBfZGF0YQkqcHJldl9jaGlwOwotCXNpemVfdAkJCWxlbjsKLQl2b2lkCQkJKnR4OwotCXZvaWQJCQkqdHhfZW5kOwotCXZvaWQJCQkqcng7Ci0Jdm9pZAkJCSpyeF9lbmQ7Ci0JaW50CQkJZG1hX21hcHBlZDsKLQlkbWFfYWRkcl90CQlyeF9kbWE7Ci0JZG1hX2FkZHJfdAkJdHhfZG1hOwotCXNpemVfdAkJCXJ4X21hcF9sZW47Ci0Jc2l6ZV90CQkJdHhfbWFwX2xlbjsKLQl1OAkJCW5fYnl0ZXM7CS8qIGN1cnJlbnQgaXMgYSAxLzIgYnl0ZXMgb3AgKi8KLQl1OAkJCW1heF9iaXRzX3Blcl93b3JkOwkvKiBtYXhpbSBpcyAxNmIgKi8KLQl1MzIJCQlkbWFfd2lkdGg7Ci0JaW50CQkJY3NfY2hhbmdlOwotCWlycXJldHVybl90CQkoKnRyYW5zZmVyX2hhbmRsZXIpKHN0cnVjdCBkd19zcGkgKmR3cyk7Ci0Jdm9pZAkJCSgqY3NfY29udHJvbCkodTMyIGNvbW1hbmQpOwotCi0JLyogRG1hIGluZm8gKi8KLQlpbnQJCQlkbWFfaW5pdGVkOwotCXN0cnVjdCBkbWFfY2hhbgkJKnR4Y2hhbjsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QJdHhfc2dsOwotCXN0cnVjdCBkbWFfY2hhbgkJKnJ4Y2hhbjsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QJcnhfc2dsOwotCWludAkJCWRtYV9jaGFuX2RvbmU7Ci0Jc3RydWN0IGRldmljZQkJKmRtYV9kZXY7Ci0JZG1hX2FkZHJfdAkJZG1hX2FkZHI7IC8qIHBoeSBhZGRyZXNzIG9mIHRoZSBEYXRhIHJlZ2lzdGVyICovCi0Jc3RydWN0IGR3X3NwaV9kbWFfb3BzCSpkbWFfb3BzOwotCXZvaWQJCQkqZG1hX3ByaXY7IC8qIHBsYXRmb3JtIHJlbGF0ZSBpbmZvICovCi0Jc3RydWN0IHBjaV9kZXYJCSpkbWFjOwotCi0JLyogQnVzIGludGVyZmFjZSBpbmZvICovCi0Jdm9pZAkJCSpwcml2OwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRlYnVnZnM7Ci0jZW5kaWYKLX07Ci0KLSNkZWZpbmUgZHdfcmVhZGwoZHcsIG5hbWUpIFwKLQlfX3Jhd19yZWFkbCgmKCgoc3RydWN0IGR3X3NwaV9yZWcgKilkdy0+cmVncyktPm5hbWUpKQotI2RlZmluZSBkd193cml0ZWwoZHcsIG5hbWUsIHZhbCkgXAotCV9fcmF3X3dyaXRlbCgodmFsKSwgJigoKHN0cnVjdCBkd19zcGlfcmVnICopZHctPnJlZ3MpLT5uYW1lKSkKLSNkZWZpbmUgZHdfcmVhZHcoZHcsIG5hbWUpIFwKLQlfX3Jhd19yZWFkdygmKCgoc3RydWN0IGR3X3NwaV9yZWcgKilkdy0+cmVncyktPm5hbWUpKQotI2RlZmluZSBkd193cml0ZXcoZHcsIG5hbWUsIHZhbCkgXAotCV9fcmF3X3dyaXRldygodmFsKSwgJigoKHN0cnVjdCBkd19zcGlfcmVnICopZHctPnJlZ3MpLT5uYW1lKSkKLQotc3RhdGljIGlubGluZSB2b2lkIHNwaV9lbmFibGVfY2hpcChzdHJ1Y3QgZHdfc3BpICpkd3MsIGludCBlbmFibGUpCi17Ci0JZHdfd3JpdGVsKGR3cywgc3NpZW5yLCAoZW5hYmxlID8gMSA6IDApKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNwaV9zZXRfY2xrKHN0cnVjdCBkd19zcGkgKmR3cywgdTE2IGRpdikKLXsKLQlkd193cml0ZWwoZHdzLCBiYXVkciwgZGl2KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNwaV9jaGlwX3NlbChzdHJ1Y3QgZHdfc3BpICpkd3MsIHUxNiBjcykKLXsKLQlpZiAoY3MgPiBkd3MtPm51bV9jcykKLQkJcmV0dXJuOwotCi0JaWYgKGR3cy0+Y3NfY29udHJvbCkKLQkJZHdzLT5jc19jb250cm9sKDEpOwotCi0JZHdfd3JpdGVsKGR3cywgc2VyLCAxIDw8IGNzKTsKLX0KLQotLyogRGlzYWJsZSBJUlEgYml0cyAqLwotc3RhdGljIGlubGluZSB2b2lkIHNwaV9tYXNrX2ludHIoc3RydWN0IGR3X3NwaSAqZHdzLCB1MzIgbWFzaykKLXsKLQl1MzIgbmV3X21hc2s7Ci0KLQluZXdfbWFzayA9IGR3X3JlYWRsKGR3cywgaW1yKSAmIH5tYXNrOwotCWR3X3dyaXRlbChkd3MsIGltciwgbmV3X21hc2spOwotfQotCi0vKiBFbmFibGUgSVJRIGJpdHMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzcGlfdW1hc2tfaW50cihzdHJ1Y3QgZHdfc3BpICpkd3MsIHUzMiBtYXNrKQotewotCXUzMiBuZXdfbWFzazsKLQotCW5ld19tYXNrID0gZHdfcmVhZGwoZHdzLCBpbXIpIHwgbWFzazsKLQlkd193cml0ZWwoZHdzLCBpbXIsIG5ld19tYXNrKTsKLX0KLQotLyoKLSAqIEVhY2ggU1BJIHNsYXZlIGRldmljZSB0byB3b3JrIHdpdGggZHdfYXBpIGNvbnRyb2xsZXIgc2hvdWxkCi0gKiBoYXMgc3VjaCBhIHN0cnVjdHVyZSBjbGFpbWluZyBpdHMgd29ya2luZyBtb2RlIChQSU8vRE1BIGV0YyksCi0gKiB3aGljaCBjYW4gYmUgc2F2ZSBpbiB0aGUgImNvbnRyb2xsZXJfZGF0YSIgbWVtYmVyIG9mIHRoZQotICogc3RydWN0IHNwaV9kZXZpY2UKLSAqLwotc3RydWN0IGR3X3NwaV9jaGlwIHsKLQl1OCBwb2xsX21vZGU7CS8qIDAgZm9yIGNvbnRvbGxlciBwb2xsaW5nIG1vZGUgKi8KLQl1OCB0eXBlOwkvKiBTUEkvU1NQL01pY3J3aXJlICovCi0JdTggZW5hYmxlX2RtYTsKLQl2b2lkICgqY3NfY29udHJvbCkodTMyIGNvbW1hbmQpOwotfTsKLQotZXh0ZXJuIGludCBkd19zcGlfYWRkX2hvc3Qoc3RydWN0IGR3X3NwaSAqZHdzKTsKLWV4dGVybiB2b2lkIGR3X3NwaV9yZW1vdmVfaG9zdChzdHJ1Y3QgZHdfc3BpICpkd3MpOwotZXh0ZXJuIGludCBkd19zcGlfc3VzcGVuZF9ob3N0KHN0cnVjdCBkd19zcGkgKmR3cyk7Ci1leHRlcm4gaW50IGR3X3NwaV9yZXN1bWVfaG9zdChzdHJ1Y3QgZHdfc3BpICpkd3MpOwotZXh0ZXJuIHZvaWQgZHdfc3BpX3hmZXJfZG9uZShzdHJ1Y3QgZHdfc3BpICpkd3MpOwotCi0vKiBwbGF0Zm9ybSByZWxhdGVkIHNldHVwICovCi1leHRlcm4gaW50IGR3X3NwaV9taWRfaW5pdChzdHJ1Y3QgZHdfc3BpICpkd3MpOyAvKiBJbnRlbCBNSUQgcGxhdGZvcm1zICovCi0jZW5kaWYgLyogRFdfU1BJX0hFQURFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9kd19zcGlfbWlkLmMgYi9kcml2ZXJzL3NwaS9kd19zcGlfbWlkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTE3ODIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvZHdfc3BpX21pZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qCi0gKiBkd19zcGlfbWlkLmMgLSBzcGVjaWFsIGhhbmRsaW5nIGZvciBEVyBjb3JlIG9uIEludGVsIE1JRCBwbGF0Zm9ybQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotCi0jaW5jbHVkZSAiZHdfc3BpLmgiCi0KLSNpZmRlZiBDT05GSUdfU1BJX0RXX01JRF9ETUEKLSNpbmNsdWRlIDxsaW51eC9pbnRlbF9taWRfZG1hLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0KLXN0cnVjdCBtaWRfZG1hIHsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9zbGF2ZQlkbWFzX3R4OwotCXN0cnVjdCBpbnRlbF9taWRfZG1hX3NsYXZlCWRtYXNfcng7Ci19OwotCi1zdGF0aWMgYm9vbCBtaWRfc3BpX2RtYV9jaGFuX2ZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKnBhcmFtKQotewotCXN0cnVjdCBkd19zcGkgKmR3cyA9IHBhcmFtOwotCi0JcmV0dXJuIGR3cy0+ZG1hYyAmJiAoJmR3cy0+ZG1hYy0+ZGV2ID09IGNoYW4tPmRldmljZS0+ZGV2KTsKLX0KLQotc3RhdGljIGludCBtaWRfc3BpX2RtYV9pbml0KHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQlzdHJ1Y3QgbWlkX2RtYSAqZHdfZG1hID0gZHdzLT5kbWFfcHJpdjsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9zbGF2ZSAqcnhzLCAqdHhzOwotCWRtYV9jYXBfbWFza190IG1hc2s7Ci0KLQkvKgotCSAqIEdldCBwY2kgZGV2aWNlIGZvciBETUEgY29udHJvbGxlciwgY3VycmVudGx5IGl0IGNvdWxkIG9ubHkKLQkgKiBiZSB0aGUgRE1BIGNvbnRyb2xsZXIgb2YgZWl0aGVyIE1vb3Jlc3Rvd24gb3IgTWVkZmllbGQKLQkgKi8KLQlkd3MtPmRtYWMgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDA4MTMsIE5VTEwpOwotCWlmICghZHdzLT5kbWFjKQotCQlkd3MtPmRtYWMgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDA4MjcsIE5VTEwpOwotCi0JZG1hX2NhcF96ZXJvKG1hc2spOwotCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgbWFzayk7Ci0KLQkvKiAxLiBJbml0IHJ4IGNoYW5uZWwgKi8KLQlkd3MtPnJ4Y2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgbWlkX3NwaV9kbWFfY2hhbl9maWx0ZXIsIGR3cyk7Ci0JaWYgKCFkd3MtPnJ4Y2hhbikKLQkJZ290byBlcnJfZXhpdDsKLQlyeHMgPSAmZHdfZG1hLT5kbWFzX3J4OwotCXJ4cy0+aHNfbW9kZSA9IExOV19ETUFfSFdfSFM7Ci0JcnhzLT5jZmdfbW9kZSA9IExOV19ETUFfUEVSX1RPX01FTTsKLQlkd3MtPnJ4Y2hhbi0+cHJpdmF0ZSA9IHJ4czsKLQotCS8qIDIuIEluaXQgdHggY2hhbm5lbCAqLwotCWR3cy0+dHhjaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBtaWRfc3BpX2RtYV9jaGFuX2ZpbHRlciwgZHdzKTsKLQlpZiAoIWR3cy0+dHhjaGFuKQotCQlnb3RvIGZyZWVfcnhjaGFuOwotCXR4cyA9ICZkd19kbWEtPmRtYXNfdHg7Ci0JdHhzLT5oc19tb2RlID0gTE5XX0RNQV9IV19IUzsKLQl0eHMtPmNmZ19tb2RlID0gTE5XX0RNQV9NRU1fVE9fUEVSOwotCWR3cy0+dHhjaGFuLT5wcml2YXRlID0gdHhzOwotCi0JZHdzLT5kbWFfaW5pdGVkID0gMTsKLQlyZXR1cm4gMDsKLQotZnJlZV9yeGNoYW46Ci0JZG1hX3JlbGVhc2VfY2hhbm5lbChkd3MtPnJ4Y2hhbik7Ci1lcnJfZXhpdDoKLQlyZXR1cm4gLTE7Ci0KLX0KLQotc3RhdGljIHZvaWQgbWlkX3NwaV9kbWFfZXhpdChzdHJ1Y3QgZHdfc3BpICpkd3MpCi17Ci0JZG1hX3JlbGVhc2VfY2hhbm5lbChkd3MtPnR4Y2hhbik7Ci0JZG1hX3JlbGVhc2VfY2hhbm5lbChkd3MtPnJ4Y2hhbik7Ci19Ci0KLS8qCi0gKiBkd3MtPmRtYV9jaGFuX2RvbmUgaXMgY2xlYXJlZCBiZWZvcmUgdGhlIGRtYSB0cmFuc2ZlciBzdGFydHMsCi0gKiBjYWxsYmFjayBmb3IgcngvdHggY2hhbm5lbCB3aWxsIGVhY2ggaW5jcmVtZW50IGl0IGJ5IDEuCi0gKiBSZWFjaGluZyAyIG1lYW5zIHRoZSB3aG9sZSBzcGkgdHJhbnNhY3Rpb24gaXMgZG9uZS4KLSAqLwotc3RhdGljIHZvaWQgZHdfc3BpX2RtYV9kb25lKHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgZHdfc3BpICpkd3MgPSBhcmc7Ci0KLQlpZiAoKytkd3MtPmRtYV9jaGFuX2RvbmUgIT0gMikKLQkJcmV0dXJuOwotCWR3X3NwaV94ZmVyX2RvbmUoZHdzKTsKLX0KLQotc3RhdGljIGludCBtaWRfc3BpX2RtYV90cmFuc2ZlcihzdHJ1Y3QgZHdfc3BpICpkd3MsIGludCBjc19jaGFuZ2UpCi17Ci0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eGRlc2MgPSBOVUxMLCAqcnhkZXNjID0gTlVMTDsKLQlzdHJ1Y3QgZG1hX2NoYW4gKnR4Y2hhbiwgKnJ4Y2hhbjsKLQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyB0eGNvbmYsIHJ4Y29uZjsKLQl1MTYgZG1hX2N0cmwgPSAwOwotCi0JLyogMS4gc2V0dXAgRE1BIHJlbGF0ZWQgcmVnaXN0ZXJzICovCi0JaWYgKGNzX2NoYW5nZSkgewotCQlzcGlfZW5hYmxlX2NoaXAoZHdzLCAwKTsKLQkJZHdfd3JpdGV3KGR3cywgZG1hcmRsciwgMHhmKTsKLQkJZHdfd3JpdGV3KGR3cywgZG1hdGRsciwgMHgxMCk7Ci0JCWlmIChkd3MtPnR4X2RtYSkKLQkJCWRtYV9jdHJsIHw9IDB4MjsKLQkJaWYgKGR3cy0+cnhfZG1hKQotCQkJZG1hX2N0cmwgfD0gMHgxOwotCQlkd193cml0ZXcoZHdzLCBkbWFjciwgZG1hX2N0cmwpOwotCQlzcGlfZW5hYmxlX2NoaXAoZHdzLCAxKTsKLQl9Ci0KLQlkd3MtPmRtYV9jaGFuX2RvbmUgPSAwOwotCXR4Y2hhbiA9IGR3cy0+dHhjaGFuOwotCXJ4Y2hhbiA9IGR3cy0+cnhjaGFuOwotCi0JLyogMi4gUHJlcGFyZSB0aGUgVFggZG1hIHRyYW5zZmVyICovCi0JdHhjb25mLmRpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7Ci0JdHhjb25mLmRzdF9hZGRyID0gZHdzLT5kbWFfYWRkcjsKLQl0eGNvbmYuZHN0X21heGJ1cnN0ID0gTE5XX0RNQV9NU0laRV8xNjsKLQl0eGNvbmYuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzsKLQl0eGNvbmYuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzsKLQotCXR4Y2hhbi0+ZGV2aWNlLT5kZXZpY2VfY29udHJvbCh0eGNoYW4sIERNQV9TTEFWRV9DT05GSUcsCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSAmdHhjb25mKTsKLQotCW1lbXNldCgmZHdzLT50eF9zZ2wsIDAsIHNpemVvZihkd3MtPnR4X3NnbCkpOwotCWR3cy0+dHhfc2dsLmRtYV9hZGRyZXNzID0gZHdzLT50eF9kbWE7Ci0JZHdzLT50eF9zZ2wubGVuZ3RoID0gZHdzLT5sZW47Ci0KLQl0eGRlc2MgPSB0eGNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2codHhjaGFuLAotCQkJCSZkd3MtPnR4X3NnbCwKLQkJCQkxLAotCQkJCURNQV9UT19ERVZJQ0UsCi0JCQkJRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NPTVBMX1NLSVBfREVTVF9VTk1BUCk7Ci0JdHhkZXNjLT5jYWxsYmFjayA9IGR3X3NwaV9kbWFfZG9uZTsKLQl0eGRlc2MtPmNhbGxiYWNrX3BhcmFtID0gZHdzOwotCi0JLyogMy4gUHJlcGFyZSB0aGUgUlggZG1hIHRyYW5zZmVyICovCi0Jcnhjb25mLmRpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKLQlyeGNvbmYuc3JjX2FkZHIgPSBkd3MtPmRtYV9hZGRyOwotCXJ4Y29uZi5zcmNfbWF4YnVyc3QgPSBMTldfRE1BX01TSVpFXzE2OwotCXJ4Y29uZi5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOwotCXJ4Y29uZi5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOwotCi0JcnhjaGFuLT5kZXZpY2UtPmRldmljZV9jb250cm9sKHJ4Y2hhbiwgRE1BX1NMQVZFX0NPTkZJRywKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpICZyeGNvbmYpOwotCi0JbWVtc2V0KCZkd3MtPnJ4X3NnbCwgMCwgc2l6ZW9mKGR3cy0+cnhfc2dsKSk7Ci0JZHdzLT5yeF9zZ2wuZG1hX2FkZHJlc3MgPSBkd3MtPnJ4X2RtYTsKLQlkd3MtPnJ4X3NnbC5sZW5ndGggPSBkd3MtPmxlbjsKLQotCXJ4ZGVzYyA9IHJ4Y2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhyeGNoYW4sCi0JCQkJJmR3cy0+cnhfc2dsLAotCQkJCTEsCi0JCQkJRE1BX0ZST01fREVWSUNFLAotCQkJCURNQV9QUkVQX0lOVEVSUlVQVCB8IERNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVApOwotCXJ4ZGVzYy0+Y2FsbGJhY2sgPSBkd19zcGlfZG1hX2RvbmU7Ci0JcnhkZXNjLT5jYWxsYmFja19wYXJhbSA9IGR3czsKLQotCS8qIHJ4IG11c3QgYmUgc3RhcnRlZCBiZWZvcmUgdHggZHVlIHRvIHNwaSBpbnN0aW5jdCAqLwotCXJ4ZGVzYy0+dHhfc3VibWl0KHJ4ZGVzYyk7Ci0JdHhkZXNjLT50eF9zdWJtaXQodHhkZXNjKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBkd19zcGlfZG1hX29wcyBtaWRfZG1hX29wcyA9IHsKLQkuZG1hX2luaXQJPSBtaWRfc3BpX2RtYV9pbml0LAotCS5kbWFfZXhpdAk9IG1pZF9zcGlfZG1hX2V4aXQsCi0JLmRtYV90cmFuc2Zlcgk9IG1pZF9zcGlfZG1hX3RyYW5zZmVyLAotfTsKLSNlbmRpZgotCi0vKiBTb21lIHNwZWNpZmljIGluZm8gZm9yIFNQSTAgY29udHJvbGxlciBvbiBNb29yZXN0b3duICovCi0KLS8qIEhXIGluZm8gZm9yIE1SU1QgQ0xrIENvbnRyb2wgVW5pdCwgb25lIDMyYiByZWcgKi8KLSNkZWZpbmUgTVJTVF9TUElfQ0xLX0JBU0UJMTAwMDAwMDAwCS8qIDEwMG0gKi8KLSNkZWZpbmUgTVJTVF9DTEtfU1BJMF9SRUcJMHhmZjExZDg2YwotI2RlZmluZSBDTEtfU1BJX0JESVZfT0ZGU0VUCTAKLSNkZWZpbmUgQ0xLX1NQSV9CRElWX01BU0sJMHgwMDAwMDAwNwotI2RlZmluZSBDTEtfU1BJX0NESVZfT0ZGU0VUCTkKLSNkZWZpbmUgQ0xLX1NQSV9DRElWX01BU0sJMHgwMDAwMGUwMAotI2RlZmluZSBDTEtfU1BJX0RJU0FCTEVfT0ZGU0VUCTgKLQotaW50IGR3X3NwaV9taWRfaW5pdChzdHJ1Y3QgZHdfc3BpICpkd3MpCi17Ci0JdTMyICpjbGtfcmVnLCBjbGtfY2RpdjsKLQotCWNsa19yZWcgPSBpb3JlbWFwX25vY2FjaGUoTVJTVF9DTEtfU1BJMF9SRUcsIDE2KTsKLQlpZiAoIWNsa19yZWcpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogZ2V0IFNQSSBjb250cm9sbGVyIG9wZXJhdGluZyBmcmVxIGluZm8gKi8KLQljbGtfY2RpdiAgPSAocmVhZGwoY2xrX3JlZykgJiBDTEtfU1BJX0NESVZfTUFTSykgPj4gQ0xLX1NQSV9DRElWX09GRlNFVDsKLQlkd3MtPm1heF9mcmVxID0gTVJTVF9TUElfQ0xLX0JBU0UgLyAoY2xrX2NkaXYgKyAxKTsKLQlpb3VubWFwKGNsa19yZWcpOwotCi0JZHdzLT5udW1fY3MgPSAxNjsKLQlkd3MtPmZpZm9fbGVuID0gNDA7CS8qIEZJRk8gaGFzIDQwIHdvcmRzIGJ1ZmZlciAqLwotCi0jaWZkZWYgQ09ORklHX1NQSV9EV19NSURfRE1BCi0JZHdzLT5kbWFfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRfZG1hKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkd3MtPmRtYV9wcml2KQotCQlyZXR1cm4gLUVOT01FTTsKLQlkd3MtPmRtYV9vcHMgPSAmbWlkX2RtYV9vcHM7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL2R3X3NwaV9tbWlvLmMgYi9kcml2ZXJzL3NwaS9kd19zcGlfbW1pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGU4MTNkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3BpL2R3X3NwaV9tbWlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIGR3X3NwaV9tbWlvLmMgLSBNZW1vcnktbWFwcGVkIGludGVyZmFjZSBkcml2ZXIgZm9yIERXIFNQSSBDb3JlCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBPY3Rhc2ljIHNlbWljb25kdWN0b3IuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Ci0KLSNpbmNsdWRlICJkd19zcGkuaCIKLQotI2RlZmluZSBEUklWRVJfTkFNRSAiZHdfc3BpX21taW8iCi0KLXN0cnVjdCBkd19zcGlfbW1pbyB7Ci0Jc3RydWN0IGR3X3NwaSAgZHdzOwotCXN0cnVjdCBjbGsgICAgICpjbGs7Ci19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBkd19zcGlfbW1pb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBkd19zcGlfbW1pbyAqZHdzbW1pbzsKLQlzdHJ1Y3QgZHdfc3BpICpkd3M7Ci0Jc3RydWN0IHJlc291cmNlICptZW0sICppb2FyZWE7Ci0JaW50IHJldDsKLQotCWR3c21taW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHdfc3BpX21taW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWR3c21taW8pIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfZW5kOwotCX0KLQotCWR3cyA9ICZkd3NtbWlvLT5kd3M7Ci0KLQkvKiBHZXQgYmFzaWMgaW8gcmVzb3VyY2UgYW5kIG1hcCBpdCAqLwotCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFtZW0pIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gbWVtIHJlc291cmNlP1xuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX2tmcmVlOwotCX0KLQotCWlvYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSksCi0JCQlwZGV2LT5uYW1lKTsKLQlpZiAoIWlvYXJlYSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJTUEkgcmVnaW9uIGFscmVhZHkgY2xhaW1lZFxuIik7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnJfa2ZyZWU7Ci0JfQotCi0JZHdzLT5yZWdzID0gaW9yZW1hcF9ub2NhY2hlKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7Ci0JaWYgKCFkd3MtPnJlZ3MpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiU1BJIHJlZ2lvbiBhbHJlYWR5IG1hcHBlZFxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3JlbGVhc2VfcmVnOwotCX0KLQotCWR3cy0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoZHdzLT5pcnEgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSByZXNvdXJjZT9cbiIpOwotCQlyZXQgPSBkd3MtPmlycTsgLyogLUVOWElPICovCi0JCWdvdG8gZXJyX3VubWFwOwotCX0KLQotCWR3c21taW8tPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7Ci0JaWYgKElTX0VSUihkd3NtbWlvLT5jbGspKSB7Ci0JCXJldCA9IFBUUl9FUlIoZHdzbW1pby0+Y2xrKTsKLQkJZ290byBlcnJfaXJxOwotCX0KLQljbGtfZW5hYmxlKGR3c21taW8tPmNsayk7Ci0KLQlkd3MtPnBhcmVudF9kZXYgPSAmcGRldi0+ZGV2OwotCWR3cy0+YnVzX251bSA9IDA7Ci0JZHdzLT5udW1fY3MgPSA0OwotCWR3cy0+bWF4X2ZyZXEgPSBjbGtfZ2V0X3JhdGUoZHdzbW1pby0+Y2xrKTsKLQotCXJldCA9IGR3X3NwaV9hZGRfaG9zdChkd3MpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2NsazsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGR3c21taW8pOwotCXJldHVybiAwOwotCi1lcnJfY2xrOgotCWNsa19kaXNhYmxlKGR3c21taW8tPmNsayk7Ci0JY2xrX3B1dChkd3NtbWlvLT5jbGspOwotCWR3c21taW8tPmNsayA9IE5VTEw7Ci1lcnJfaXJxOgotCWZyZWVfaXJxKGR3cy0+aXJxLCBkd3MpOwotZXJyX3VubWFwOgotCWlvdW5tYXAoZHdzLT5yZWdzKTsKLWVycl9yZWxlYXNlX3JlZzoKLQlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKLWVycl9rZnJlZToKLQlrZnJlZShkd3NtbWlvKTsKLWVycl9lbmQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgZHdfc3BpX21taW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGR3X3NwaV9tbWlvICpkd3NtbWlvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IHJlc291cmNlICptZW07Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQotCWNsa19kaXNhYmxlKGR3c21taW8tPmNsayk7Ci0JY2xrX3B1dChkd3NtbWlvLT5jbGspOwotCWR3c21taW8tPmNsayA9IE5VTEw7Ci0KLQlmcmVlX2lycShkd3NtbWlvLT5kd3MuaXJxLCAmZHdzbW1pby0+ZHdzKTsKLQlkd19zcGlfcmVtb3ZlX2hvc3QoJmR3c21taW8tPmR3cyk7Ci0JaW91bm1hcChkd3NtbWlvLT5kd3MucmVncyk7Ci0Ja2ZyZWUoZHdzbW1pbyk7Ci0KLQltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkd19zcGlfbW1pb19kcml2ZXIgPSB7Ci0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkd19zcGlfbW1pb19yZW1vdmUpLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9IERSSVZFUl9OQU1FLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZHdfc3BpX21taW9faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmR3X3NwaV9tbWlvX2RyaXZlciwgZHdfc3BpX21taW9fcHJvYmUpOwotfQotbW9kdWxlX2luaXQoZHdfc3BpX21taW9faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBkd19zcGlfbW1pb19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmR3X3NwaV9tbWlvX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChkd19zcGlfbW1pb19leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiSmVhbi1IdWd1ZXMgRGVzY2hlbmVzIDxqZWFuLWh1Z3Vlcy5kZXNjaGVuZXNAb2N0YXNpYy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1lbW9yeS1tYXBwZWQgSS9PIGludGVyZmFjZSBkcml2ZXIgZm9yIERXIFNQSSBDb3JlIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9kd19zcGlfcGNpLmMgYi9kcml2ZXJzL3NwaS9kd19zcGlfcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjYwYWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvZHdfc3BpX3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qCi0gKiBkd19zcGlfcGNpLmMgLSBQQ0kgaW50ZXJmYWNlIGRyaXZlciBmb3IgRFcgU1BJIENvcmUKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0KLSNpbmNsdWRlICJkd19zcGkuaCIKLQotI2RlZmluZSBEUklWRVJfTkFNRSAiZHdfc3BpX3BjaSIKLQotc3RydWN0IGR3X3NwaV9wY2kgewotCXN0cnVjdCBwY2lfZGV2CSpwZGV2OwotCXN0cnVjdCBkd19zcGkJZHdzOwotfTsKLQotc3RhdGljIGludCBfX2RldmluaXQgc3BpX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQotewotCXN0cnVjdCBkd19zcGlfcGNpICpkd3BjaTsKLQlzdHJ1Y3QgZHdfc3BpICpkd3M7Ci0JaW50IHBjaV9iYXIgPSAwOwotCWludCByZXQ7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJEVzogZm91bmQgUENJIFNQSSBjb250cm9sbGVyKElEOiAlMDR4OiUwNHgpXG4iLAotCQlwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSk7Ci0KLQlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JZHdwY2kgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHdfc3BpX3BjaSksIEdGUF9LRVJORUwpOwotCWlmICghZHdwY2kpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfZGlzYWJsZTsKLQl9Ci0KLQlkd3BjaS0+cGRldiA9IHBkZXY7Ci0JZHdzID0gJmR3cGNpLT5kd3M7Ci0KLQkvKiBHZXQgYmFzaWMgaW8gcmVzb3VyY2UgYW5kIG1hcCBpdCAqLwotCWR3cy0+cGFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgcGNpX2Jhcik7Ci0JZHdzLT5pb2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgcGNpX2Jhcik7Ci0KLQlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgcGNpX2JhciwgZGV2X25hbWUoJnBkZXYtPmRldikpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2tmcmVlOwotCi0JZHdzLT5yZWdzID0gaW9yZW1hcF9ub2NhY2hlKCh1bnNpZ25lZCBsb25nKWR3cy0+cGFkZHIsCi0JCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCBwY2lfYmFyKSk7Ci0JaWYgKCFkd3MtPnJlZ3MpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfcmVsZWFzZV9yZWc7Ci0JfQotCi0JZHdzLT5wYXJlbnRfZGV2ID0gJnBkZXYtPmRldjsKLQlkd3MtPmJ1c19udW0gPSAwOwotCWR3cy0+bnVtX2NzID0gNDsKLQlkd3MtPmlycSA9IHBkZXYtPmlycTsKLQotCS8qCi0JICogU3BlY2lmaWMgaGFuZGxpbmcgZm9yIEludGVsIE1JRCBwYWx0Zm9ybXMsIGxpa2UgZG1hIHNldHVwLAotCSAqIGNsb2NrIHJhdGUsIEZJRk8gZGVwdGguCi0JICovCi0JaWYgKHBkZXYtPmRldmljZSA9PSAweDA4MDApIHsKLQkJcmV0ID0gZHdfc3BpX21pZF9pbml0KGR3cyk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycl91bm1hcDsKLQl9Ci0KLQlyZXQgPSBkd19zcGlfYWRkX2hvc3QoZHdzKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl91bm1hcDsKLQotCS8qIFBDSSBob29rIGFuZCBTUEkgaG9vayB1c2UgdGhlIHNhbWUgZHJ2IGRhdGEgKi8KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgZHdwY2kpOwotCXJldHVybiAwOwotCi1lcnJfdW5tYXA6Ci0JaW91bm1hcChkd3MtPnJlZ3MpOwotZXJyX3JlbGVhc2VfcmVnOgotCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBwY2lfYmFyKTsKLWVycl9rZnJlZToKLQlrZnJlZShkd3BjaSk7Ci1lcnJfZGlzYWJsZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IHNwaV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBkd19zcGlfcGNpICpkd3BjaSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlkd19zcGlfcmVtb3ZlX2hvc3QoJmR3cGNpLT5kd3MpOwotCWlvdW5tYXAoZHdwY2ktPmR3cy5yZWdzKTsKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7Ci0Ja2ZyZWUoZHdwY2kpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBzcGlfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBkd19zcGlfcGNpICpkd3BjaSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZHdfc3BpX3N1c3BlbmRfaG9zdCgmZHdwY2ktPmR3cyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzcGlfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBkd19zcGlfcGNpICpkd3BjaSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgcmV0OwotCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwotCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwotCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGR3X3NwaV9yZXN1bWVfaG9zdCgmZHdwY2ktPmR3cyk7Ci19Ci0jZWxzZQotI2RlZmluZSBzcGlfc3VzcGVuZAlOVUxMCi0jZGVmaW5lIHNwaV9yZXN1bWUJTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKLQkvKiBJbnRlbCBNSUQgcGxhdGZvcm0gU1BJIGNvbnRyb2xsZXIgMCAqLwotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDA4MDApIH0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHdfc3BpX2RyaXZlciA9IHsKLQkubmFtZSA9CQlEUklWRVJfTkFNRSwKLQkuaWRfdGFibGUgPQlwY2lfaWRzLAotCS5wcm9iZSA9CXNwaV9wY2lfcHJvYmUsCi0JLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKHNwaV9wY2lfcmVtb3ZlKSwKLQkuc3VzcGVuZCA9CXNwaV9zdXNwZW5kLAotCS5yZXN1bWUJPQlzcGlfcmVzdW1lLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXJzdF9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkd19zcGlfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1yc3Rfc3BpX2V4aXQodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmR3X3NwaV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChtcnN0X3NwaV9pbml0KTsKLW1vZHVsZV9leGl0KG1yc3Rfc3BpX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJGZW5nIFRhbmcgPGZlbmcudGFuZ0BpbnRlbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlBDSSBpbnRlcmZhY2UgZHJpdmVyIGZvciBEVyBTUEkgQ29yZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvZXA5M3h4X3NwaS5jIGIvZHJpdmVycy9zcGkvZXA5M3h4X3NwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzU3MDA3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3BpL2VwOTN4eF9zcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDkzOCArMCwwIEBACi0vKgotICogRHJpdmVyIGZvciBDaXJydXMgTG9naWMgRVA5M3h4IFNQSSBjb250cm9sbGVyLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBNaWthIFdlc3RlcmJlcmcKLSAqCi0gKiBFeHBsaWNpdCBGSUZPIGhhbmRsaW5nIGNvZGUgd2FzIGluc3BpcmVkIGJ5IGFtYmEtcGwwMjIgZHJpdmVyLgotICoKLSAqIENoaXAgc2VsZWN0IHN1cHBvcnQgdXNpbmcgb3RoZXIgdGhhbiBidWlsdC1pbiBHUElPcyBieSBILiBIYXJ0bGV5IFN3ZWV0ZW4uCi0gKgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFNQSSBjb250cm9sbGVyIHNlZSBkb2N1bWVudGF0aW9uIG9uIENpcnJ1cwotICogTG9naWMgd2ViIHNpdGU6Ci0gKiAgICAgaHR0cDovL3d3dy5jaXJydXMuY29tL2VuL3B1YnMvbWFudWFsL0VQOTN4eF9Vc2Vyc19HdWlkZV9VTTEucGRmCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotCi0jaW5jbHVkZSA8bWFjaC9lcDkzeHhfc3BpLmg+Ci0KLSNkZWZpbmUgU1NQQ1IwCQkJMHgwMDAwCi0jZGVmaW5lIFNTUENSMF9NT0RFX1NISUZUCTYKLSNkZWZpbmUgU1NQQ1IwX1NDUl9TSElGVAk4Ci0KLSNkZWZpbmUgU1NQQ1IxCQkJMHgwMDA0Ci0jZGVmaW5lIFNTUENSMV9SSUUJCUJJVCgwKQotI2RlZmluZSBTU1BDUjFfVElFCQlCSVQoMSkKLSNkZWZpbmUgU1NQQ1IxX1JPUklFCQlCSVQoMikKLSNkZWZpbmUgU1NQQ1IxX0xCTQkJQklUKDMpCi0jZGVmaW5lIFNTUENSMV9TU0UJCUJJVCg0KQotI2RlZmluZSBTU1BDUjFfTVMJCUJJVCg1KQotI2RlZmluZSBTU1BDUjFfU09ECQlCSVQoNikKLQotI2RlZmluZSBTU1BEUgkJCTB4MDAwOAotCi0jZGVmaW5lIFNTUFNSCQkJMHgwMDBjCi0jZGVmaW5lIFNTUFNSX1RGRQkJQklUKDApCi0jZGVmaW5lIFNTUFNSX1RORgkJQklUKDEpCi0jZGVmaW5lIFNTUFNSX1JORQkJQklUKDIpCi0jZGVmaW5lIFNTUFNSX1JGRgkJQklUKDMpCi0jZGVmaW5lIFNTUFNSX0JTWQkJQklUKDQpCi0jZGVmaW5lIFNTUENQU1IJCQkweDAwMTAKLQotI2RlZmluZSBTU1BJSVIJCQkweDAwMTQKLSNkZWZpbmUgU1NQSUlSX1JJUwkJQklUKDApCi0jZGVmaW5lIFNTUElJUl9USVMJCUJJVCgxKQotI2RlZmluZSBTU1BJSVJfUk9SSVMJCUJJVCgyKQotI2RlZmluZSBTU1BJQ1IJCQlTU1BJSVIKLQotLyogdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi8KLSNkZWZpbmUgU1BJX1RJTUVPVVQJCTUKLS8qIG1heGltdW0gZGVwdGggb2YgUlgvVFggRklGTyAqLwotI2RlZmluZSBTUElfRklGT19TSVpFCQk4Ci0KLS8qKgotICogc3RydWN0IGVwOTN4eF9zcGkgLSBFUDkzeHggU1BJIGNvbnRyb2xsZXIgc3RydWN0dXJlCi0gKiBAbG9jazogc3BpbmxvY2sgdGhhdCBwcm90ZWN0cyBjb25jdXJyZW50IGFjY2Vzc2VzIHRvIGZpZWxkcyBAcnVubmluZywKLSAqICAgICAgICBAY3VycmVudF9tc2cgYW5kIEBtc2dfcXVldWUKLSAqIEBwZGV2OiBwb2ludGVyIHRvIHBsYXRmb3JtIGRldmljZQotICogQGNsazogY2xvY2sgZm9yIHRoZSBjb250cm9sbGVyCi0gKiBAcmVnc19iYXNlOiBwb2ludGVyIHRvIGlvcmVtYXAoKSdkIHJlZ2lzdGVycwotICogQGlycTogSVJRIG51bWJlciB1c2VkIGJ5IHRoZSBkcml2ZXIKLSAqIEBtaW5fcmF0ZTogbWluaW11bSBjbG9jayByYXRlIChpbiBIeikgc3VwcG9ydGVkIGJ5IHRoZSBjb250cm9sbGVyCi0gKiBAbWF4X3JhdGU6IG1heGltdW0gY2xvY2sgcmF0ZSAoaW4gSHopIHN1cHBvcnRlZCBieSB0aGUgY29udHJvbGxlcgotICogQHJ1bm5pbmc6IGlzIHRoZSBxdWV1ZSBydW5uaW5nCi0gKiBAd3E6IHdvcmtxdWV1ZSB1c2VkIGJ5IHRoZSBkcml2ZXIKLSAqIEBtc2dfd29yazogd29yayB0aGF0IGlzIHF1ZXVlZCBmb3IgdGhlIGRyaXZlcgotICogQHdhaXQ6IHdhaXQgaGVyZSB1bnRpbCBnaXZlbiB0cmFuc2ZlciBpcyBjb21wbGV0ZWQKLSAqIEBtc2dfcXVldWU6IHF1ZXVlIGZvciB0aGUgbWVzc2FnZXMKLSAqIEBjdXJyZW50X21zZzogbWVzc2FnZSB0aGF0IGlzIGN1cnJlbnRseSBwcm9jZXNzZWQgKG9yICVOVUxMIGlmIG5vbmUpCi0gKiBAdHg6IGN1cnJlbnQgYnl0ZSBpbiB0cmFuc2ZlciB0byB0cmFuc21pdAotICogQHJ4OiBjdXJyZW50IGJ5dGUgaW4gdHJhbnNmZXIgdG8gcmVjZWl2ZQotICogQGZpZm9fbGV2ZWw6IGhvdyBmdWxsIGlzIEZJRk8gKCUwLi4lU1BJX0ZJRk9fU0laRSAtICUxKS4gUmVjZWl2aW5nIG9uZQotICogICAgICAgICAgICAgIGZyYW1lIGRlY3JlYXNlcyB0aGlzIGxldmVsIGFuZCBzZW5kaW5nIG9uZSBmcmFtZSBpbmNyZWFzZXMgaXQuCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgRVA5M3h4IFNQSSBjb250cm9sbGVyIHNwZWNpZmljIGluZm9ybWF0aW9uLiBXaGVuCi0gKiBAcnVubmluZyBpcyAldHJ1ZSwgZHJpdmVyIGFjY2VwdHMgdHJhbnNmZXIgcmVxdWVzdHMgZnJvbSBwcm90b2NvbCBkcml2ZXJzLgotICogQGN1cnJlbnRfbXNnIGlzIHVzZWQgdG8gaG9sZCBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIHRoYXQgaXMgY3VycmVudGx5Ci0gKiBwcm9jZXNzZWQuIElmIEBjdXJyZW50X21zZyBpcyAlTlVMTCwgaXQgbWVhbnMgdGhhdCBubyBwcm9jZXNzaW5nIGlzIGdvaW5nCi0gKiBvbi4KLSAqCi0gKiBNb3N0IG9mIHRoZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiBvbmNlIGFuZCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCB3aXRob3V0Ci0gKiB0YWtpbmcgdGhlIEBsb2NrLiBGaWVsZHMgdGhhdCBhcmUgYWNjZXNzZWQgY29uY3VycmVudGx5IGFyZTogQGN1cnJlbnRfbXNnLAotICogQHJ1bm5pbmcsIGFuZCBAbXNnX3F1ZXVlLgotICovCi1zdHJ1Y3QgZXA5M3h4X3NwaSB7Ci0Jc3BpbmxvY2tfdAkJCWxvY2s7Ci0JY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKLQlzdHJ1Y3QgY2xrCQkJKmNsazsKLQl2b2lkIF9faW9tZW0JCQkqcmVnc19iYXNlOwotCWludAkJCQlpcnE7Ci0JdW5zaWduZWQgbG9uZwkJCW1pbl9yYXRlOwotCXVuc2lnbmVkIGxvbmcJCQltYXhfcmF0ZTsKLQlib29sCQkJCXJ1bm5pbmc7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSp3cTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCW1zZ193b3JrOwotCXN0cnVjdCBjb21wbGV0aW9uCQl3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQJCW1zZ19xdWV1ZTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UJCSpjdXJyZW50X21zZzsKLQlzaXplX3QJCQkJdHg7Ci0Jc2l6ZV90CQkJCXJ4OwotCXNpemVfdAkJCQlmaWZvX2xldmVsOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgZXA5M3h4X3NwaV9jaGlwIC0gU1BJIGRldmljZSBoYXJkd2FyZSBzZXR0aW5ncwotICogQHNwaTogYmFjayBwb2ludGVyIHRvIHRoZSBTUEkgZGV2aWNlCi0gKiBAcmF0ZTogbWF4IHJhdGUgaW4gaHogdGhpcyBjaGlwIHN1cHBvcnRzCi0gKiBAZGl2X2Nwc3I6IGNwc3IgKHByZS1zY2FsZXIpIGRpdmlkZXIKLSAqIEBkaXZfc2NyOiBzY3IgZGl2aWRlcgotICogQGRzczogYml0cyBwZXIgd29yZCAoNCAtIDE2IGJpdHMpCi0gKiBAb3BzOiBwcml2YXRlIGNoaXAgb3BlcmF0aW9ucwotICoKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RvcmUgaGFyZHdhcmUgcmVnaXN0ZXIgc3BlY2lmaWMgc2V0dGluZ3MgZm9yIGVhY2gKLSAqIFNQSSBkZXZpY2UuIFNldHRpbmdzIGFyZSB3cml0dGVuIHRvIGhhcmR3YXJlIGJ5IGZ1bmN0aW9uCi0gKiBlcDkzeHhfc3BpX2NoaXBfc2V0dXAoKS4KLSAqLwotc3RydWN0IGVwOTN4eF9zcGlfY2hpcCB7Ci0JY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UJCSpzcGk7Ci0JdW5zaWduZWQgbG9uZwkJCXJhdGU7Ci0JdTgJCQkJZGl2X2Nwc3I7Ci0JdTgJCQkJZGl2X3NjcjsKLQl1OAkJCQlkc3M7Ci0Jc3RydWN0IGVwOTN4eF9zcGlfY2hpcF9vcHMJKm9wczsKLX07Ci0KLS8qIGNvbnZlcnRzIGJpdHMgcGVyIHdvcmQgdG8gQ1IwLkRTUyB2YWx1ZSAqLwotI2RlZmluZSBiaXRzX3Blcl93b3JkX3RvX2RzcyhicHcpCSgoYnB3KSAtIDEpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZXA5M3h4X3NwaV93cml0ZV91OChjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSwgdTE2IHJlZywgdTggdmFsdWUpCi17Ci0JX19yYXdfd3JpdGViKHZhbHVlLCBlc3BpLT5yZWdzX2Jhc2UgKyByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHU4Ci1lcDkzeHhfc3BpX3JlYWRfdTgoY29uc3Qgc3RydWN0IGVwOTN4eF9zcGkgKnNwaSwgdTE2IHJlZykKLXsKLQlyZXR1cm4gX19yYXdfcmVhZGIoc3BpLT5yZWdzX2Jhc2UgKyByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWVwOTN4eF9zcGlfd3JpdGVfdTE2KGNvbnN0IHN0cnVjdCBlcDkzeHhfc3BpICplc3BpLCB1MTYgcmVnLCB1MTYgdmFsdWUpCi17Ci0JX19yYXdfd3JpdGV3KHZhbHVlLCBlc3BpLT5yZWdzX2Jhc2UgKyByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHUxNgotZXA5M3h4X3NwaV9yZWFkX3UxNihjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaSAqc3BpLCB1MTYgcmVnKQotewotCXJldHVybiBfX3Jhd19yZWFkdyhzcGktPnJlZ3NfYmFzZSArIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbnQgZXA5M3h4X3NwaV9lbmFibGUoY29uc3Qgc3RydWN0IGVwOTN4eF9zcGkgKmVzcGkpCi17Ci0JdTggcmVndmFsOwotCWludCBlcnI7Ci0KLQllcnIgPSBjbGtfZW5hYmxlKGVzcGktPmNsayk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXJlZ3ZhbCA9IGVwOTN4eF9zcGlfcmVhZF91OChlc3BpLCBTU1BDUjEpOwotCXJlZ3ZhbCB8PSBTU1BDUjFfU1NFOwotCWVwOTN4eF9zcGlfd3JpdGVfdTgoZXNwaSwgU1NQQ1IxLCByZWd2YWwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGVwOTN4eF9zcGlfZGlzYWJsZShjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSkKLXsKLQl1OCByZWd2YWw7Ci0KLQlyZWd2YWwgPSBlcDkzeHhfc3BpX3JlYWRfdTgoZXNwaSwgU1NQQ1IxKTsKLQlyZWd2YWwgJj0gflNTUENSMV9TU0U7Ci0JZXA5M3h4X3NwaV93cml0ZV91OChlc3BpLCBTU1BDUjEsIHJlZ3ZhbCk7Ci0KLQljbGtfZGlzYWJsZShlc3BpLT5jbGspOwotfQotCi1zdGF0aWMgdm9pZCBlcDkzeHhfc3BpX2VuYWJsZV9pbnRlcnJ1cHRzKGNvbnN0IHN0cnVjdCBlcDkzeHhfc3BpICplc3BpKQotewotCXU4IHJlZ3ZhbDsKLQotCXJlZ3ZhbCA9IGVwOTN4eF9zcGlfcmVhZF91OChlc3BpLCBTU1BDUjEpOwotCXJlZ3ZhbCB8PSAoU1NQQ1IxX1JPUklFIHwgU1NQQ1IxX1RJRSB8IFNTUENSMV9SSUUpOwotCWVwOTN4eF9zcGlfd3JpdGVfdTgoZXNwaSwgU1NQQ1IxLCByZWd2YWwpOwotfQotCi1zdGF0aWMgdm9pZCBlcDkzeHhfc3BpX2Rpc2FibGVfaW50ZXJydXB0cyhjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSkKLXsKLQl1OCByZWd2YWw7Ci0KLQlyZWd2YWwgPSBlcDkzeHhfc3BpX3JlYWRfdTgoZXNwaSwgU1NQQ1IxKTsKLQlyZWd2YWwgJj0gfihTU1BDUjFfUk9SSUUgfCBTU1BDUjFfVElFIHwgU1NQQ1IxX1JJRSk7Ci0JZXA5M3h4X3NwaV93cml0ZV91OChlc3BpLCBTU1BDUjEsIHJlZ3ZhbCk7Ci19Ci0KLS8qKgotICogZXA5M3h4X3NwaV9jYWxjX2Rpdmlzb3JzKCkgLSBjYWxjdWxhdGVzIFNQSSBjbG9jayBkaXZpc29ycwotICogQGVzcGk6IGVwOTN4eCBTUEkgY29udHJvbGxlciBzdHJ1Y3QKLSAqIEBjaGlwOiBkaXZpc29ycyBhcmUgY2FsY3VsYXRlZCBmb3IgdGhpcyBjaGlwCi0gKiBAcmF0ZTogZGVzaXJlZCBTUEkgb3V0cHV0IGNsb2NrIHJhdGUKLSAqCi0gKiBGdW5jdGlvbiBjYWxjdWxhdGVzIGNwc3IgKGNsb2NrIHByZS1zY2FsZXIpIGFuZCBzY3IgZGl2aXNvcnMgYmFzZWQgb24KLSAqIGdpdmVuIEByYXRlIGFuZCBwbGFjZXMgdGhlbSB0byBAY2hpcC0+ZGl2X2Nwc3IgYW5kIEBjaGlwLT5kaXZfc2NyLiBJZiwKLSAqIGZvciBzb21lIHJlYXNvbiwgZGl2aXNvcnMgY2Fubm90IGJlIGNhbGN1bGF0ZWQgbm90aGluZyBpcyBzdG9yZWQgYW5kCi0gKiAlLUVJTlZBTCBpcyByZXR1cm5lZC4KLSAqLwotc3RhdGljIGludCBlcDkzeHhfc3BpX2NhbGNfZGl2aXNvcnMoY29uc3Qgc3RydWN0IGVwOTN4eF9zcGkgKmVzcGksCi0JCQkJICAgIHN0cnVjdCBlcDkzeHhfc3BpX2NoaXAgKmNoaXAsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHNwaV9jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShlc3BpLT5jbGspOwotCWludCBjcHNyLCBzY3I7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGF0IG1heCB2YWx1ZSBpcyBiZXR3ZWVuIHZhbHVlcyBzdXBwb3J0ZWQgYnkgdGhlCi0JICogY29udHJvbGxlci4gTm90ZSB0aGF0IG1pbmltdW0gdmFsdWUgaXMgYWxyZWFkeSBjaGVja2VkIGluCi0JICogZXA5M3h4X3NwaV90cmFuc2ZlcigpLgotCSAqLwotCXJhdGUgPSBjbGFtcChyYXRlLCBlc3BpLT5taW5fcmF0ZSwgZXNwaS0+bWF4X3JhdGUpOwotCi0JLyoKLQkgKiBDYWxjdWxhdGUgZGl2aXNvcnMgc28gdGhhdCB3ZSBjYW4gZ2V0IHNwZWVkIGFjY29yZGluZyB0aGUKLQkgKiBmb2xsb3dpbmcgZm9ybXVsYToKLQkgKglyYXRlID0gc3BpX2Nsb2NrX3JhdGUgLyAoY3BzciAqICgxICsgc2NyKSkKLQkgKgotCSAqIGNwc3IgbXVzdCBiZSBldmVuIG51bWJlciBhbmQgc3RhcnRzIGZyb20gMiwgc2NyIGNhbiBiZSBhbnkgbnVtYmVyCi0JICogYmV0d2VlbiAwIGFuZCAyNTUuCi0JICovCi0JZm9yIChjcHNyID0gMjsgY3BzciA8PSAyNTQ7IGNwc3IgKz0gMikgewotCQlmb3IgKHNjciA9IDA7IHNjciA8PSAyNTU7IHNjcisrKSB7Ci0JCQlpZiAoKHNwaV9jbGtfcmF0ZSAvIChjcHNyICogKHNjciArIDEpKSkgPD0gcmF0ZSkgewotCQkJCWNoaXAtPmRpdl9zY3IgPSAodTgpc2NyOwotCQkJCWNoaXAtPmRpdl9jcHNyID0gKHU4KWNwc3I7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHZvaWQgZXA5M3h4X3NwaV9jc19jb250cm9sKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGJvb2wgY29udHJvbCkKLXsKLQlzdHJ1Y3QgZXA5M3h4X3NwaV9jaGlwICpjaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7Ci0JaW50IHZhbHVlID0gKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSA/IGNvbnRyb2wgOiAhY29udHJvbDsKLQotCWlmIChjaGlwLT5vcHMgJiYgY2hpcC0+b3BzLT5jc19jb250cm9sKQotCQljaGlwLT5vcHMtPmNzX2NvbnRyb2woc3BpLCB2YWx1ZSk7Ci19Ci0KLS8qKgotICogZXA5M3h4X3NwaV9zZXR1cCgpIC0gc2V0dXAgYW4gU1BJIGRldmljZQotICogQHNwaTogU1BJIGRldmljZSB0byBzZXR1cAotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCBTUEkgZGV2aWNlIG1vZGUsIHNwZWVkIGV0Yy4gQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZQotICogdGltZXMgZm9yIGEgc2luZ2xlIGRldmljZS4gUmV0dXJucyAlMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGluCi0gKiBjYXNlIG9mIGZhaWx1cmUuIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3MsIHRoZSBkZXZpY2UgaXMKLSAqIGRlc2VsZWN0ZWQuCi0gKi8KLXN0YXRpYyBpbnQgZXA5M3h4X3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBlcDkzeHhfc3BpICplc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3RydWN0IGVwOTN4eF9zcGlfY2hpcCAqY2hpcDsKLQotCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPCA0IHx8IHNwaS0+Yml0c19wZXJfd29yZCA+IDE2KSB7Ci0JCWRldl9lcnIoJmVzcGktPnBkZXYtPmRldiwgImludmFsaWQgYml0cyBwZXIgd29yZCAlZFxuIiwKLQkJCXNwaS0+Yml0c19wZXJfd29yZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKLQlpZiAoIWNoaXApIHsKLQkJZGV2X2RiZygmZXNwaS0+cGRldi0+ZGV2LCAiaW5pdGlhbCBzZXR1cCBmb3IgJXNcbiIsCi0JCQlzcGktPm1vZGFsaWFzKTsKLQotCQljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjaGlwKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJY2hpcC0+c3BpID0gc3BpOwotCQljaGlwLT5vcHMgPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKLQotCQlpZiAoY2hpcC0+b3BzICYmIGNoaXAtPm9wcy0+c2V0dXApIHsKLQkJCWludCByZXQgPSBjaGlwLT5vcHMtPnNldHVwKHNwaSk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJa2ZyZWUoY2hpcCk7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJfQotCi0JCXNwaV9zZXRfY3RsZGF0YShzcGksIGNoaXApOwotCX0KLQotCWlmIChzcGktPm1heF9zcGVlZF9oeiAhPSBjaGlwLT5yYXRlKSB7Ci0JCWludCBlcnI7Ci0KLQkJZXJyID0gZXA5M3h4X3NwaV9jYWxjX2Rpdmlzb3JzKGVzcGksIGNoaXAsIHNwaS0+bWF4X3NwZWVkX2h6KTsKLQkJaWYgKGVyciAhPSAwKSB7Ci0JCQlzcGlfc2V0X2N0bGRhdGEoc3BpLCBOVUxMKTsKLQkJCWtmcmVlKGNoaXApOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCQljaGlwLT5yYXRlID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0JfQotCi0JY2hpcC0+ZHNzID0gYml0c19wZXJfd29yZF90b19kc3Moc3BpLT5iaXRzX3Blcl93b3JkKTsKLQotCWVwOTN4eF9zcGlfY3NfY29udHJvbChzcGksIGZhbHNlKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBlcDkzeHhfc3BpX3RyYW5zZmVyKCkgLSBxdWV1ZSBtZXNzYWdlIHRvIGJlIHRyYW5zZmVycmVkCi0gKiBAc3BpOiB0YXJnZXQgU1BJIGRldmljZQotICogQG1zZzogbWVzc2FnZSB0byBiZSB0cmFuc2ZlcnJlZAotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFNQSSBkZXZpY2UgZHJpdmVycyB3aGVuIHRoZXkgYXJlIGdvaW5nIHRvIHRyYW5zZmVyCi0gKiBhIG5ldyBtZXNzYWdlLiBJdCBzaW1wbHkgcHV0cyB0aGUgbWVzc2FnZSBpbiB0aGUgcXVldWUgYW5kIHNjaGVkdWxlcwotICogd29ya3F1ZXVlIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCB0cmFuc2ZlciBsYXRlciBvbi4KLSAqCi0gKiBSZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIGVycm9yIGluIGNhc2Ugb2YgZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBlcDkzeHhfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCBlcDkzeHhfc3BpICplc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFtc2cgfHwgIW1zZy0+Y29tcGxldGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogZmlyc3QgdmFsaWRhdGUgZWFjaCB0cmFuc2ZlciAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmICh0LT5iaXRzX3Blcl93b3JkKSB7Ci0JCQlpZiAodC0+Yml0c19wZXJfd29yZCA8IDQgfHwgdC0+Yml0c19wZXJfd29yZCA+IDE2KQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmICh0LT5zcGVlZF9oeiAmJiB0LT5zcGVlZF9oeiA8IGVzcGktPm1pbl9yYXRlKQotCQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qCi0JICogTm93IHRoYXQgd2Ugb3duIHRoZSBtZXNzYWdlLCBsZXQncyBpbml0aWFsaXplIGl0IHNvIHRoYXQgaXQgaXMKLQkgKiBzdWl0YWJsZSBmb3IgdXMuIFdlIHVzZSBAbXNnLT5zdGF0dXMgdG8gc2lnbmFsIHdoZXRoZXIgdGhlcmUgd2FzCi0JICogZXJyb3IgaW4gdHJhbnNmZXIgYW5kIEBtc2ctPnN0YXRlIGlzIHVzZWQgdG8gaG9sZCBwb2ludGVyIHRvIHRoZQotCSAqIGN1cnJlbnQgdHJhbnNmZXIgKG9yICVOVUxMIGlmIG5vIGFjdGl2ZSBjdXJyZW50IHRyYW5zZmVyKS4KLQkgKi8KLQltc2ctPnN0YXRlID0gTlVMTDsKLQltc2ctPnN0YXR1cyA9IDA7Ci0JbXNnLT5hY3R1YWxfbGVuZ3RoID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZlc3BpLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCFlc3BpLT5ydW5uaW5nKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVzcGktPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FU0hVVERPV047Ci0JfQotCWxpc3RfYWRkX3RhaWwoJm1zZy0+cXVldWUsICZlc3BpLT5tc2dfcXVldWUpOwotCXF1ZXVlX3dvcmsoZXNwaS0+d3EsICZlc3BpLT5tc2dfd29yayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXNwaS0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZXA5M3h4X3NwaV9jbGVhbnVwKCkgLSBjbGVhbnMgdXAgbWFzdGVyIGNvbnRyb2xsZXIgc3BlY2lmaWMgc3RhdGUKLSAqIEBzcGk6IFNQSSBkZXZpY2UgdG8gY2xlYW51cAotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgbWFzdGVyIGNvbnRyb2xsZXIgc3BlY2lmaWMgc3RhdGUgZm9yIGdpdmVuIEBzcGkKLSAqIGRldmljZS4KLSAqLwotc3RhdGljIHZvaWQgZXA5M3h4X3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IGVwOTN4eF9zcGlfY2hpcCAqY2hpcDsKLQotCWNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKLQlpZiAoY2hpcCkgewotCQlpZiAoY2hpcC0+b3BzICYmIGNoaXAtPm9wcy0+Y2xlYW51cCkKLQkJCWNoaXAtPm9wcy0+Y2xlYW51cChzcGkpOwotCQlzcGlfc2V0X2N0bGRhdGEoc3BpLCBOVUxMKTsKLQkJa2ZyZWUoY2hpcCk7Ci0JfQotfQotCi0vKioKLSAqIGVwOTN4eF9zcGlfY2hpcF9zZXR1cCgpIC0gY29uZmlndXJlcyBoYXJkd2FyZSBhY2NvcmRpbmcgdG8gZ2l2ZW4gQGNoaXAKLSAqIEBlc3BpOiBlcDkzeHggU1BJIGNvbnRyb2xsZXIgc3RydWN0Ci0gKiBAY2hpcDogY2hpcCBzcGVjaWZpYyBzZXR0aW5ncwotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgYWN0dWFsIGhhcmR3YXJlIHJlZ2lzdGVycyB3aXRoIHNldHRpbmdzIGdpdmVuIGluCi0gKiBAY2hpcC4gTm90ZSB0aGF0IG5vIHZhbGlkYXRpb24gaXMgZG9uZSBzbyBtYWtlIHN1cmUgdGhhdCBjYWxsZXJzIHZhbGlkYXRlCi0gKiBzZXR0aW5ncyBiZWZvcmUgY2FsbGluZyB0aGlzLgotICovCi1zdGF0aWMgdm9pZCBlcDkzeHhfc3BpX2NoaXBfc2V0dXAoY29uc3Qgc3RydWN0IGVwOTN4eF9zcGkgKmVzcGksCi0JCQkJICBjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaV9jaGlwICpjaGlwKQotewotCXUxNiBjcjA7Ci0KLQljcjAgPSBjaGlwLT5kaXZfc2NyIDw8IFNTUENSMF9TQ1JfU0hJRlQ7Ci0JY3IwIHw9IChjaGlwLT5zcGktPm1vZGUgJiAoU1BJX0NQSEF8U1BJX0NQT0wpKSA8PCBTU1BDUjBfTU9ERV9TSElGVDsKLQljcjAgfD0gY2hpcC0+ZHNzOwotCi0JZGV2X2RiZygmZXNwaS0+cGRldi0+ZGV2LCAic2V0dXA6IG1vZGUgJWQsIGNwc3IgJWQsIHNjciAlZCwgZHNzICVkXG4iLAotCQljaGlwLT5zcGktPm1vZGUsIGNoaXAtPmRpdl9jcHNyLCBjaGlwLT5kaXZfc2NyLCBjaGlwLT5kc3MpOwotCWRldl9kYmcoJmVzcGktPnBkZXYtPmRldiwgInNldHVwOiBjcjAgJSN4IiwgY3IwKTsKLQotCWVwOTN4eF9zcGlfd3JpdGVfdTgoZXNwaSwgU1NQQ1BTUiwgY2hpcC0+ZGl2X2Nwc3IpOwotCWVwOTN4eF9zcGlfd3JpdGVfdTE2KGVzcGksIFNTUENSMCwgY3IwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYml0c19wZXJfd29yZChjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSkKLXsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGVzcGktPmN1cnJlbnRfbXNnOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQgPSBtc2ctPnN0YXRlOwotCi0JcmV0dXJuIHQtPmJpdHNfcGVyX3dvcmQgPyB0LT5iaXRzX3Blcl93b3JkIDogbXNnLT5zcGktPmJpdHNfcGVyX3dvcmQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGVwOTN4eF9kb193cml0ZShzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlpZiAoYml0c19wZXJfd29yZChlc3BpKSA+IDgpIHsKLQkJdTE2IHR4X3ZhbCA9IDA7Ci0KLQkJaWYgKHQtPnR4X2J1ZikKLQkJCXR4X3ZhbCA9ICgodTE2ICopdC0+dHhfYnVmKVtlc3BpLT50eF07Ci0JCWVwOTN4eF9zcGlfd3JpdGVfdTE2KGVzcGksIFNTUERSLCB0eF92YWwpOwotCQllc3BpLT50eCArPSBzaXplb2YodHhfdmFsKTsKLQl9IGVsc2UgewotCQl1OCB0eF92YWwgPSAwOwotCi0JCWlmICh0LT50eF9idWYpCi0JCQl0eF92YWwgPSAoKHU4ICopdC0+dHhfYnVmKVtlc3BpLT50eF07Ci0JCWVwOTN4eF9zcGlfd3JpdGVfdTgoZXNwaSwgU1NQRFIsIHR4X3ZhbCk7Ci0JCWVzcGktPnR4ICs9IHNpemVvZih0eF92YWwpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZXA5M3h4X2RvX3JlYWQoc3RydWN0IGVwOTN4eF9zcGkgKmVzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0JaWYgKGJpdHNfcGVyX3dvcmQoZXNwaSkgPiA4KSB7Ci0JCXUxNiByeF92YWw7Ci0KLQkJcnhfdmFsID0gZXA5M3h4X3NwaV9yZWFkX3UxNihlc3BpLCBTU1BEUik7Ci0JCWlmICh0LT5yeF9idWYpCi0JCQkoKHUxNiAqKXQtPnJ4X2J1ZilbZXNwaS0+cnhdID0gcnhfdmFsOwotCQllc3BpLT5yeCArPSBzaXplb2YocnhfdmFsKTsKLQl9IGVsc2UgewotCQl1OCByeF92YWw7Ci0KLQkJcnhfdmFsID0gZXA5M3h4X3NwaV9yZWFkX3U4KGVzcGksIFNTUERSKTsKLQkJaWYgKHQtPnJ4X2J1ZikKLQkJCSgodTggKil0LT5yeF9idWYpW2VzcGktPnJ4XSA9IHJ4X3ZhbDsKLQkJZXNwaS0+cnggKz0gc2l6ZW9mKHJ4X3ZhbCk7Ci0JfQotfQotCi0vKioKLSAqIGVwOTN4eF9zcGlfcmVhZF93cml0ZSgpIC0gcGVyZm9ybSBuZXh0IFJYL1RYIHRyYW5zZmVyCi0gKiBAZXNwaTogZXA5M3h4IFNQSSBjb250cm9sbGVyIHN0cnVjdAotICoKLSAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmZXJzIG5leHQgYnl0ZXMgKG9yIGhhbGYtd29yZHMpIHRvL2Zyb20gUlgvVFggRklGT3MuIElmCi0gKiBjYWxsZWQgc2V2ZXJhbCB0aW1lcywgdGhlIHdob2xlIHRyYW5zZmVyIHdpbGwgYmUgY29tcGxldGVkLiBSZXR1cm5zCi0gKiAlLUVJTlBST0dSRVNTIHdoZW4gY3VycmVudCB0cmFuc2ZlciB3YXMgbm90IHlldCBjb21wbGV0ZWQgb3RoZXJ3aXNlICUwLgotICoKLSAqIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBmaW5pc2hlZCwgUlggRklGTyBzaG91bGQgYmUgZW1wdHkgYW5kIFRYIEZJRk8gc2hvdWxkIGJlCi0gKiBmdWxsLgotICovCi1zdGF0aWMgaW50IGVwOTN4eF9zcGlfcmVhZF93cml0ZShzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSkKLXsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGVzcGktPmN1cnJlbnRfbXNnOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQgPSBtc2ctPnN0YXRlOwotCi0JLyogcmVhZCBhcyBsb25nIGFzIFJYIEZJRk8gaGFzIGZyYW1lcyBpbiBpdCAqLwotCXdoaWxlICgoZXA5M3h4X3NwaV9yZWFkX3U4KGVzcGksIFNTUFNSKSAmIFNTUFNSX1JORSkpIHsKLQkJZXA5M3h4X2RvX3JlYWQoZXNwaSwgdCk7Ci0JCWVzcGktPmZpZm9fbGV2ZWwtLTsKLQl9Ci0KLQkvKiB3cml0ZSBhcyBsb25nIGFzIFRYIEZJRk8gaGFzIHJvb20gKi8KLQl3aGlsZSAoZXNwaS0+Zmlmb19sZXZlbCA8IFNQSV9GSUZPX1NJWkUgJiYgZXNwaS0+dHggPCB0LT5sZW4pIHsKLQkJZXA5M3h4X2RvX3dyaXRlKGVzcGksIHQpOwotCQllc3BpLT5maWZvX2xldmVsKys7Ci0JfQotCi0JaWYgKGVzcGktPnJ4ID09IHQtPmxlbikgewotCQltc2ctPmFjdHVhbF9sZW5ndGggKz0gdC0+bGVuOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gLUVJTlBST0dSRVNTOwotfQotCi0vKioKLSAqIGVwOTN4eF9zcGlfcHJvY2Vzc190cmFuc2ZlcigpIC0gcHJvY2Vzc2VzIG9uZSBTUEkgdHJhbnNmZXIKLSAqIEBlc3BpOiBlcDkzeHggU1BJIGNvbnRyb2xsZXIgc3RydWN0Ci0gKiBAbXNnOiBjdXJyZW50IG1lc3NhZ2UKLSAqIEB0OiB0cmFuc2ZlciB0byBwcm9jZXNzCi0gKgotICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgb25lIFNQSSB0cmFuc2ZlciBnaXZlbiBpbiBAdC4gRnVuY3Rpb24gd2FpdHMgdW50aWwKLSAqIHRyYW5zZmVyIGlzIGNvbXBsZXRlIChtYXkgc2xlZXApIGFuZCB1cGRhdGVzIEBtc2ctPnN0YXR1cyBiYXNlZCBvbiB3aGV0aGVyCi0gKiB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBvciBub3QuCi0gKi8KLXN0YXRpYyB2b2lkIGVwOTN4eF9zcGlfcHJvY2Vzc190cmFuc2ZlcihzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSwKLQkJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2csCi0JCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0Jc3RydWN0IGVwOTN4eF9zcGlfY2hpcCAqY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShtc2ctPnNwaSk7Ci0KLQltc2ctPnN0YXRlID0gdDsKLQotCS8qCi0JICogSGFuZGxlIGFueSB0cmFuc2ZlciBzcGVjaWZpYyBzZXR0aW5ncyBpZiBuZWVkZWQuIFdlIHVzZQotCSAqIHRlbXBvcmFyeSBjaGlwIHNldHRpbmdzIGhlcmUgYW5kIHJlc3RvcmUgb3JpZ2luYWwgbGF0ZXIgd2hlbgotCSAqIHRoZSB0cmFuc2ZlciBpcyBmaW5pc2hlZC4KLQkgKi8KLQlpZiAodC0+c3BlZWRfaHogfHwgdC0+Yml0c19wZXJfd29yZCkgewotCQlzdHJ1Y3QgZXA5M3h4X3NwaV9jaGlwIHRtcF9jaGlwID0gKmNoaXA7Ci0KLQkJaWYgKHQtPnNwZWVkX2h6KSB7Ci0JCQlpbnQgZXJyOwotCi0JCQllcnIgPSBlcDkzeHhfc3BpX2NhbGNfZGl2aXNvcnMoZXNwaSwgJnRtcF9jaGlwLAotCQkJCQkJICAgICAgIHQtPnNwZWVkX2h6KTsKLQkJCWlmIChlcnIpIHsKLQkJCQlkZXZfZXJyKCZlc3BpLT5wZGV2LT5kZXYsCi0JCQkJCSJmYWlsZWQgdG8gYWRqdXN0IHNwZWVkXG4iKTsKLQkJCQltc2ctPnN0YXR1cyA9IGVycjsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlpZiAodC0+Yml0c19wZXJfd29yZCkKLQkJCXRtcF9jaGlwLmRzcyA9IGJpdHNfcGVyX3dvcmRfdG9fZHNzKHQtPmJpdHNfcGVyX3dvcmQpOwotCi0JCS8qCi0JCSAqIFNldCB1cCB0ZW1wb3JhcnkgbmV3IGh3IHNldHRpbmdzIGZvciB0aGlzIHRyYW5zZmVyLgotCQkgKi8KLQkJZXA5M3h4X3NwaV9jaGlwX3NldHVwKGVzcGksICZ0bXBfY2hpcCk7Ci0JfQotCi0JZXNwaS0+cnggPSAwOwotCWVzcGktPnR4ID0gMDsKLQotCS8qCi0JICogTm93IGV2ZXJ5dGhpbmcgaXMgc2V0IHVwIGZvciB0aGUgY3VycmVudCB0cmFuc2Zlci4gV2UgcHJpbWUgdGhlIFRYCi0JICogRklGTywgZW5hYmxlIGludGVycnVwdHMsIGFuZCB3YWl0IGZvciB0aGUgdHJhbnNmZXIgdG8gY29tcGxldGUuCi0JICovCi0JaWYgKGVwOTN4eF9zcGlfcmVhZF93cml0ZShlc3BpKSkgewotCQllcDkzeHhfc3BpX2VuYWJsZV9pbnRlcnJ1cHRzKGVzcGkpOwotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZlc3BpLT53YWl0KTsKLQl9Ci0KLQkvKgotCSAqIEluIGNhc2Ugb2YgZXJyb3IgZHVyaW5nIHRyYW5zbWl0LCB3ZSBiYWlsIG91dCBmcm9tIHByb2Nlc3NpbmcKLQkgKiB0aGUgbWVzc2FnZS4KLQkgKi8KLQlpZiAobXNnLT5zdGF0dXMpCi0JCXJldHVybjsKLQotCS8qCi0JICogQWZ0ZXIgdGhpcyB0cmFuc2ZlciBpcyBmaW5pc2hlZCwgcGVyZm9ybSBhbnkgcG9zc2libGUKLQkgKiBwb3N0LXRyYW5zZmVyIGFjdGlvbnMgcmVxdWVzdGVkIGJ5IHRoZSBwcm90b2NvbCBkcml2ZXIuCi0JICovCi0JaWYgKHQtPmRlbGF5X3VzZWNzKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCh1c2Vjc190b19qaWZmaWVzKHQtPmRlbGF5X3VzZWNzKSk7Ci0JfQotCWlmICh0LT5jc19jaGFuZ2UpIHsKLQkJaWYgKCFsaXN0X2lzX2xhc3QoJnQtPnRyYW5zZmVyX2xpc3QsICZtc2ctPnRyYW5zZmVycykpIHsKLQkJCS8qCi0JCQkgKiBJbiBjYXNlIHByb3RvY29sIGRyaXZlciBpcyBhc2tpbmcgdXMgdG8gZHJvcCB0aGUKLQkJCSAqIGNoaXBzZWxlY3QgYnJpZWZseSwgd2UgbGV0IHRoZSBzY2hlZHVsZXIgdG8gaGFuZGxlCi0JCQkgKiBhbnkgImRlbGF5IiBoZXJlLgotCQkJICovCi0JCQllcDkzeHhfc3BpX2NzX2NvbnRyb2wobXNnLT5zcGksIGZhbHNlKTsKLQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJZXA5M3h4X3NwaV9jc19jb250cm9sKG1zZy0+c3BpLCB0cnVlKTsKLQkJfQotCX0KLQotCWlmICh0LT5zcGVlZF9oeiB8fCB0LT5iaXRzX3Blcl93b3JkKQotCQllcDkzeHhfc3BpX2NoaXBfc2V0dXAoZXNwaSwgY2hpcCk7Ci19Ci0KLS8qCi0gKiBlcDkzeHhfc3BpX3Byb2Nlc3NfbWVzc2FnZSgpIC0gcHJvY2VzcyBvbmUgU1BJIG1lc3NhZ2UKLSAqIEBlc3BpOiBlcDkzeHggU1BJIGNvbnRyb2xsZXIgc3RydWN0Ci0gKiBAbXNnOiBtZXNzYWdlIHRvIHByb2Nlc3MKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhIHNpbmdsZSBTUEkgbWVzc2FnZS4gV2UgZ28gdGhyb3VnaCBhbGwgdHJhbnNmZXJzIGluCi0gKiB0aGUgbWVzc2FnZSBhbmQgcGFzcyB0aGVtIHRvIGVwOTN4eF9zcGlfcHJvY2Vzc190cmFuc2ZlcigpLiBDaGlwc2VsZWN0IGlzCi0gKiBhc3NlcnRlZCBkdXJpbmcgdGhlIHdob2xlIG1lc3NhZ2UgKHVubGVzcyBwZXIgdHJhbnNmZXIgY3NfY2hhbmdlIGlzIHNldCkuCi0gKgotICogQG1zZy0+c3RhdHVzIGNvbnRhaW5zICUwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YKLSAqIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyB2b2lkIGVwOTN4eF9zcGlfcHJvY2Vzc19tZXNzYWdlKHN0cnVjdCBlcDkzeHhfc3BpICplc3BpLAotCQkJCSAgICAgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQlpbnQgZXJyOwotCi0JLyoKLQkgKiBFbmFibGUgdGhlIFNQSSBjb250cm9sbGVyIGFuZCBpdHMgY2xvY2suCi0JICovCi0JZXJyID0gZXA5M3h4X3NwaV9lbmFibGUoZXNwaSk7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZlc3BpLT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIFNQSSBjb250cm9sbGVyXG4iKTsKLQkJbXNnLT5zdGF0dXMgPSBlcnI7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIEp1c3QgdG8gYmUgc3VyZTogZmx1c2ggYW55IGRhdGEgZnJvbSBSWCBGSUZPLgotCSAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhTUElfVElNRU9VVCk7Ci0Jd2hpbGUgKGVwOTN4eF9zcGlfcmVhZF91MTYoZXNwaSwgU1NQU1IpICYgU1NQU1JfUk5FKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlkZXZfd2FybigmZXNwaS0+cGRldi0+ZGV2LAotCQkJCSAidGltZW91dCB3aGlsZSBmbHVzaGluZyBSWCBGSUZPXG4iKTsKLQkJCW1zZy0+c3RhdHVzID0gLUVUSU1FRE9VVDsKLQkJCXJldHVybjsKLQkJfQotCQllcDkzeHhfc3BpX3JlYWRfdTE2KGVzcGksIFNTUERSKTsKLQl9Ci0KLQkvKgotCSAqIFdlIGV4cGxpY2l0bHkgaGFuZGxlIEZJRk8gbGV2ZWwuIFRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgVFgKLQkgKiBGSUZPIHN0YXR1cyB1c2luZyAlU1NQU1JfVE5GIGJpdCB3aGljaCBtYXkgY2F1c2UgUlggRklGTyBvdmVycnVucy4KLQkgKi8KLQllc3BpLT5maWZvX2xldmVsID0gMDsKLQotCS8qCi0JICogVXBkYXRlIFNQSSBjb250cm9sbGVyIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gc3BpIGRldmljZSBhbmQgYXNzZXJ0Ci0JICogdGhlIGNoaXBzZWxlY3QuCi0JICovCi0JZXA5M3h4X3NwaV9jaGlwX3NldHVwKGVzcGksIHNwaV9nZXRfY3RsZGF0YShtc2ctPnNwaSkpOwotCWVwOTN4eF9zcGlfY3NfY29udHJvbChtc2ctPnNwaSwgdHJ1ZSk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQllcDkzeHhfc3BpX3Byb2Nlc3NfdHJhbnNmZXIoZXNwaSwgbXNnLCB0KTsKLQkJaWYgKG1zZy0+c3RhdHVzKQotCQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBOb3cgdGhlIHdob2xlIG1lc3NhZ2UgaXMgdHJhbnNmZXJyZWQgKG9yIGZhaWxlZCBmb3Igc29tZSByZWFzb24pLiBXZQotCSAqIGRlc2VsZWN0IHRoZSBkZXZpY2UgYW5kIGRpc2FibGUgdGhlIFNQSSBjb250cm9sbGVyLgotCSAqLwotCWVwOTN4eF9zcGlfY3NfY29udHJvbChtc2ctPnNwaSwgZmFsc2UpOwotCWVwOTN4eF9zcGlfZGlzYWJsZShlc3BpKTsKLX0KLQotI2RlZmluZSB3b3JrX3RvX2VzcGkod29yaykgKGNvbnRhaW5lcl9vZigod29yayksIHN0cnVjdCBlcDkzeHhfc3BpLCBtc2dfd29yaykpCi0KLS8qKgotICogZXA5M3h4X3NwaV93b3JrKCkgLSBFUDkzeHggU1BJIHdvcmtxdWV1ZSB3b3JrZXIgZnVuY3Rpb24KLSAqIEB3b3JrOiB3b3JrIHN0cnVjdAotICoKLSAqIFdvcmtxdWV1ZSB3b3JrZXIgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlcmUgYXJlIG5ldwotICogU1BJIG1lc3NhZ2VzIHRvIGJlIHByb2Nlc3NlZC4gTWVzc2FnZSBpcyB0YWtlbiBvdXQgZnJvbSB0aGUgcXVldWUgYW5kIHRoZW4KLSAqIHBhc3NlZCB0byBlcDkzeHhfc3BpX3Byb2Nlc3NfbWVzc2FnZSgpLgotICoKLSAqIEFmdGVyIG1lc3NhZ2UgaXMgdHJhbnNmZXJyZWQsIHByb3RvY29sIGRyaXZlciBpcyBub3RpZmllZCBieSBjYWxsaW5nCi0gKiBAbXNnLT5jb21wbGV0ZSgpLiBJbiBjYXNlIG9mIGVycm9yLCBAbXNnLT5zdGF0dXMgaXMgc2V0IHRvIG5lZ2F0aXZlIGVycm9yCi0gKiBudW1iZXIsIG90aGVyd2lzZSBpdCBjb250YWlucyB6ZXJvIChhbmQgQG1zZy0+YWN0dWFsX2xlbmd0aCBpcyB1cGRhdGVkKS4KLSAqLwotc3RhdGljIHZvaWQgZXA5M3h4X3NwaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSA9IHdvcmtfdG9fZXNwaSh3b3JrKTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZzsKLQotCXNwaW5fbG9ja19pcnEoJmVzcGktPmxvY2spOwotCWlmICghZXNwaS0+cnVubmluZyB8fCBlc3BpLT5jdXJyZW50X21zZyB8fAotCQlsaXN0X2VtcHR5KCZlc3BpLT5tc2dfcXVldWUpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmZXNwaS0+bG9jayk7Ci0JCXJldHVybjsKLQl9Ci0JbXNnID0gbGlzdF9maXJzdF9lbnRyeSgmZXNwaS0+bXNnX3F1ZXVlLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsIHF1ZXVlKTsKLQlsaXN0X2RlbF9pbml0KCZtc2ctPnF1ZXVlKTsKLQllc3BpLT5jdXJyZW50X21zZyA9IG1zZzsKLQlzcGluX3VubG9ja19pcnEoJmVzcGktPmxvY2spOwotCi0JZXA5M3h4X3NwaV9wcm9jZXNzX21lc3NhZ2UoZXNwaSwgbXNnKTsKLQotCS8qCi0JICogVXBkYXRlIHRoZSBjdXJyZW50IG1lc3NhZ2UgYW5kIHJlLXNjaGVkdWxlIG91cnNlbHZlcyBpZiB0aGVyZSBhcmUKLQkgKiBtb3JlIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZS4KLQkgKi8KLQlzcGluX2xvY2tfaXJxKCZlc3BpLT5sb2NrKTsKLQllc3BpLT5jdXJyZW50X21zZyA9IE5VTEw7Ci0JaWYgKGVzcGktPnJ1bm5pbmcgJiYgIWxpc3RfZW1wdHkoJmVzcGktPm1zZ19xdWV1ZSkpCi0JCXF1ZXVlX3dvcmsoZXNwaS0+d3EsICZlc3BpLT5tc2dfd29yayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZlc3BpLT5sb2NrKTsKLQotCS8qIG5vdGlmeSB0aGUgcHJvdG9jb2wgZHJpdmVyIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIG1lc3NhZ2UgKi8KLQltc2ctPmNvbXBsZXRlKG1zZy0+Y29udGV4dCk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBlcDkzeHhfc3BpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGVwOTN4eF9zcGkgKmVzcGkgPSBkZXZfaWQ7Ci0JdTggaXJxX3N0YXR1cyA9IGVwOTN4eF9zcGlfcmVhZF91OChlc3BpLCBTU1BJSVIpOwotCi0JLyoKLQkgKiBJZiB3ZSBnb3QgUk9SIChyZWNlaXZlIG92ZXJydW4pIGludGVycnVwdCB3ZSBrbm93IHRoYXQgc29tZXRoaW5nIGlzCi0JICogd3JvbmcuIEp1c3QgYWJvcnQgdGhlIG1lc3NhZ2UuCi0JICovCi0JaWYgKHVubGlrZWx5KGlycV9zdGF0dXMgJiBTU1BJSVJfUk9SSVMpKSB7Ci0JCS8qIGNsZWFyIHRoZSBvdmVycnVuIGludGVycnVwdCAqLwotCQllcDkzeHhfc3BpX3dyaXRlX3U4KGVzcGksIFNTUElDUiwgMCk7Ci0JCWRldl93YXJuKCZlc3BpLT5wZGV2LT5kZXYsCi0JCQkgInJlY2VpdmUgb3ZlcnJ1biwgYWJvcnRpbmcgdGhlIG1lc3NhZ2VcbiIpOwotCQllc3BpLT5jdXJyZW50X21zZy0+c3RhdHVzID0gLUVJTzsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBJbnRlcnJ1cHQgaXMgZWl0aGVyIFJYIChSSVMpIG9yIFRYIChUSVMpLiBGb3IgYm90aCBjYXNlcyB3ZQotCQkgKiBzaW1wbHkgZXhlY3V0ZSBuZXh0IGRhdGEgdHJhbnNmZXIuCi0JCSAqLwotCQlpZiAoZXA5M3h4X3NwaV9yZWFkX3dyaXRlKGVzcGkpKSB7Ci0JCQkvKgotCQkJICogSW4gbm9ybWFsIGNhc2UsIHRoZXJlIHN0aWxsIGlzIHNvbWUgcHJvY2Vzc2luZyBsZWZ0Ci0JCQkgKiBmb3IgY3VycmVudCB0cmFuc2Zlci4gTGV0J3Mgd2FpdCBmb3IgdGhlIG5leHQKLQkJCSAqIGludGVycnVwdCB0aGVuLgotCQkJICovCi0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEN1cnJlbnQgdHJhbnNmZXIgaXMgZmluaXNoZWQsIGVpdGhlciB3aXRoIGVycm9yIG9yIHdpdGggc3VjY2Vzcy4gSW4KLQkgKiBhbnkgY2FzZSB3ZSBkaXNhYmxlIGludGVycnVwdHMgYW5kIG5vdGlmeSB0aGUgd29ya2VyIHRvIGhhbmRsZQotCSAqIGFueSBwb3N0LXByb2Nlc3Npbmcgb2YgdGhlIG1lc3NhZ2UuCi0JICovCi0JZXA5M3h4X3NwaV9kaXNhYmxlX2ludGVycnVwdHMoZXNwaSk7Ci0JY29tcGxldGUoJmVzcGktPndhaXQpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgZXA5M3h4X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7Ci0Jc3RydWN0IGVwOTN4eF9zcGlfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgZXJyb3I7Ci0KLQlpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZigqZXNwaSkpOwotCWlmICghbWFzdGVyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBzcGkgbWFzdGVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbWFzdGVyLT5zZXR1cCA9IGVwOTN4eF9zcGlfc2V0dXA7Ci0JbWFzdGVyLT50cmFuc2ZlciA9IGVwOTN4eF9zcGlfdHJhbnNmZXI7Ci0JbWFzdGVyLT5jbGVhbnVwID0gZXA5M3h4X3NwaV9jbGVhbnVwOwotCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOwotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBpbmZvLT5udW1fY2hpcHNlbGVjdDsKLQltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7Ci0KLQllc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCi0JZXNwaS0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKLQlpZiAoSVNfRVJSKGVzcGktPmNsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBzcGkgY2xvY2tcbiIpOwotCQllcnJvciA9IFBUUl9FUlIoZXNwaS0+Y2xrKTsKLQkJZ290byBmYWlsX3JlbGVhc2VfbWFzdGVyOwotCX0KLQotCXNwaW5fbG9ja19pbml0KCZlc3BpLT5sb2NrKTsKLQlpbml0X2NvbXBsZXRpb24oJmVzcGktPndhaXQpOwotCi0JLyoKLQkgKiBDYWxjdWxhdGUgbWF4aW11bSBhbmQgbWluaW11bSBzdXBwb3J0ZWQgY2xvY2sgcmF0ZXMKLQkgKiBmb3IgdGhlIGNvbnRyb2xsZXIuCi0JICovCi0JZXNwaS0+bWF4X3JhdGUgPSBjbGtfZ2V0X3JhdGUoZXNwaS0+Y2xrKSAvIDI7Ci0JZXNwaS0+bWluX3JhdGUgPSBjbGtfZ2V0X3JhdGUoZXNwaS0+Y2xrKSAvICgyNTQgKiAyNTYpOwotCWVzcGktPnBkZXYgPSBwZGV2OwotCi0JZXNwaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoZXNwaS0+aXJxIDwgMCkgewotCQllcnJvciA9IC1FQlVTWTsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBpcnEgcmVzb3VyY2VzXG4iKTsKLQkJZ290byBmYWlsX3B1dF9jbG9jazsKLQl9Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgaW9tZW0gcmVzb3VyY2VcbiIpOwotCQllcnJvciA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbF9wdXRfY2xvY2s7Ci0JfQotCi0JcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSk7Ci0JaWYgKCFyZXMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlcXVlc3QgaW9tZW0gcmVzb3VyY2VzXG4iKTsKLQkJZXJyb3IgPSAtRUJVU1k7Ci0JCWdvdG8gZmFpbF9wdXRfY2xvY2s7Ci0JfQotCi0JZXNwaS0+cmVnc19iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghZXNwaS0+cmVnc19iYXNlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBtYXAgcmVzb3VyY2VzXG4iKTsKLQkJZXJyb3IgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxfZnJlZV9tZW07Ci0JfQotCi0JZXJyb3IgPSByZXF1ZXN0X2lycShlc3BpLT5pcnEsIGVwOTN4eF9zcGlfaW50ZXJydXB0LCAwLAotCQkJICAgICJlcDkzeHgtc3BpIiwgZXNwaSk7Ci0JaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycVxuIik7Ci0JCWdvdG8gZmFpbF91bm1hcF9yZWdzOwotCX0KLQotCWVzcGktPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImVwOTN4eF9zcGlkIik7Ci0JaWYgKCFlc3BpLT53cSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIik7Ci0JCWdvdG8gZmFpbF9mcmVlX2lycTsKLQl9Ci0JSU5JVF9XT1JLKCZlc3BpLT5tc2dfd29yaywgZXA5M3h4X3NwaV93b3JrKTsKLQlJTklUX0xJU1RfSEVBRCgmZXNwaS0+bXNnX3F1ZXVlKTsKLQllc3BpLT5ydW5uaW5nID0gdHJ1ZTsKLQotCS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBoYXJkd2FyZSBpcyBkaXNhYmxlZCAqLwotCWVwOTN4eF9zcGlfd3JpdGVfdTgoZXNwaSwgU1NQQ1IxLCAwKTsKLQotCWVycm9yID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgU1BJIG1hc3RlclxuIik7Ci0JCWdvdG8gZmFpbF9mcmVlX3F1ZXVlOwotCX0KLQotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJFUDkzeHggU1BJIENvbnRyb2xsZXIgYXQgMHglMDhseCBpcnEgJWRcbiIsCi0JCSAodW5zaWduZWQgbG9uZylyZXMtPnN0YXJ0LCBlc3BpLT5pcnEpOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWxfZnJlZV9xdWV1ZToKLQlkZXN0cm95X3dvcmtxdWV1ZShlc3BpLT53cSk7Ci1mYWlsX2ZyZWVfaXJxOgotCWZyZWVfaXJxKGVzcGktPmlycSwgZXNwaSk7Ci1mYWlsX3VubWFwX3JlZ3M6Ci0JaW91bm1hcChlc3BpLT5yZWdzX2Jhc2UpOwotZmFpbF9mcmVlX21lbToKLQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLWZhaWxfcHV0X2Nsb2NrOgotCWNsa19wdXQoZXNwaS0+Y2xrKTsKLWZhaWxfcmVsZWFzZV9tYXN0ZXI6Ci0Jc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgZXA5M3h4X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGVwOTN4eF9zcGkgKmVzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0KLQlzcGluX2xvY2tfaXJxKCZlc3BpLT5sb2NrKTsKLQllc3BpLT5ydW5uaW5nID0gZmFsc2U7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZlc3BpLT5sb2NrKTsKLQotCWRlc3Ryb3lfd29ya3F1ZXVlKGVzcGktPndxKTsKLQotCS8qCi0JICogQ29tcGxldGUgcmVtYWluaW5nIG1lc3NhZ2VzIHdpdGggJS1FU0hVVERPV04gc3RhdHVzLgotCSAqLwotCXNwaW5fbG9ja19pcnEoJmVzcGktPmxvY2spOwotCXdoaWxlICghbGlzdF9lbXB0eSgmZXNwaS0+bXNnX3F1ZXVlKSkgewotCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZzsKLQotCQltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZlc3BpLT5tc2dfcXVldWUsCi0JCQkJICAgICAgIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOwotCQlsaXN0X2RlbF9pbml0KCZtc2ctPnF1ZXVlKTsKLQkJbXNnLT5zdGF0dXMgPSAtRVNIVVRET1dOOwotCQlzcGluX3VubG9ja19pcnEoJmVzcGktPmxvY2spOwotCQltc2ctPmNvbXBsZXRlKG1zZy0+Y29udGV4dCk7Ci0JCXNwaW5fbG9ja19pcnEoJmVzcGktPmxvY2spOwotCX0KLQlzcGluX3VubG9ja19pcnEoJmVzcGktPmxvY2spOwotCi0JZnJlZV9pcnEoZXNwaS0+aXJxLCBlc3BpKTsKLQlpb3VubWFwKGVzcGktPnJlZ3NfYmFzZSk7Ci0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQljbGtfcHV0KGVzcGktPmNsayk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZXA5M3h4X3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gImVwOTN4eC1zcGkiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotCS5yZW1vdmUJCT0gX19leGl0X3AoZXA5M3h4X3NwaV9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZXA5M3h4X3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZXA5M3h4X3NwaV9kcml2ZXIsIGVwOTN4eF9zcGlfcHJvYmUpOwotfQotbW9kdWxlX2luaXQoZXA5M3h4X3NwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGVwOTN4eF9zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZlcDkzeHhfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChlcDkzeHhfc3BpX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkVQOTN4eCBTUEkgQ29udHJvbGxlciBkcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIk1pa2EgV2VzdGVyYmVyZyA8bWlrYS53ZXN0ZXJiZXJnQGlraS5maT4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06ZXA5M3h4LXNwaSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvb21hcDJfbWNzcGkuYyBiL2RyaXZlcnMvc3BpL29tYXAyX21jc3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmODZiYTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvb21hcDJfbWNzcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOTMgKzAsMCBAQAotLyoKLSAqIE9NQVAyIE1jU1BJIGNvbnRyb2xsZXIgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IE5va2lhIENvcnBvcmF0aW9uCi0gKiBBdXRob3I6CVNhbXVlbCBPcnRpeiA8c2FtdWVsLm9ydGl6QG5va2lhLmNvbT4gYW5kCi0gKgkJSnVoYSBZcmrvv71s77+9IDxqdWhhLnlyam9sYUBub2tpYS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2RtYS5oPgotI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KLSNpbmNsdWRlIDxwbGF0L21jc3BpLmg+Ci0KLSNkZWZpbmUgT01BUDJfTUNTUElfTUFYX0ZSRVEJCTQ4MDAwMDAwCi0KLS8qIE9NQVAyIGhhcyAzIFNQSSBjb250cm9sbGVycywgd2hpbGUgT01BUDMgaGFzIDQgKi8KLSNkZWZpbmUgT01BUDJfTUNTUElfTUFYX0NUUkwgCQk0Ci0KLSNkZWZpbmUgT01BUDJfTUNTUElfUkVWSVNJT04JCTB4MDAKLSNkZWZpbmUgT01BUDJfTUNTUElfU1lTU1RBVFVTCQkweDE0Ci0jZGVmaW5lIE9NQVAyX01DU1BJX0lSUVNUQVRVUwkJMHgxOAotI2RlZmluZSBPTUFQMl9NQ1NQSV9JUlFFTkFCTEUJCTB4MWMKLSNkZWZpbmUgT01BUDJfTUNTUElfV0FLRVVQRU5BQkxFCTB4MjAKLSNkZWZpbmUgT01BUDJfTUNTUElfU1lTVAkJMHgyNAotI2RlZmluZSBPTUFQMl9NQ1NQSV9NT0RVTENUUkwJCTB4MjgKLQotLyogcGVyLWNoYW5uZWwgYmFua3MsIDB4MTQgYnl0ZXMgZWFjaCwgZmlyc3QgaXM6ICovCi0jZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORjAJCTB4MmMKLSNkZWZpbmUgT01BUDJfTUNTUElfQ0hTVEFUMAkJMHgzMAotI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENUUkwwCQkweDM0Ci0jZGVmaW5lIE9NQVAyX01DU1BJX1RYMAkJCTB4MzgKLSNkZWZpbmUgT01BUDJfTUNTUElfUlgwCQkJMHgzYwotCi0vKiBwZXItcmVnaXN0ZXIgYml0bWFza3M6ICovCi0KLSNkZWZpbmUgT01BUDJfTUNTUElfTU9EVUxDVFJMX1NJTkdMRQlCSVQoMCkKLSNkZWZpbmUgT01BUDJfTUNTUElfTU9EVUxDVFJMX01TCUJJVCgyKQotI2RlZmluZSBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfU1RFU1QJQklUKDMpCi0KLSNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1BIQQkJQklUKDApCi0jZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9QT0wJCUJJVCgxKQotI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfQ0xLRF9NQVNLCSgweDBmIDw8IDIpCi0jZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9FUE9MCQlCSVQoNikKLSNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1dMX01BU0sJKDB4MWYgPDwgNykKLSNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1RSTV9SWF9PTkxZCUJJVCgxMikKLSNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1RSTV9UWF9PTkxZCUJJVCgxMykKLSNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1RSTV9NQVNLCSgweDAzIDw8IDEyKQotI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRE1BVwkJQklUKDE0KQotI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRE1BUgkJQklUKDE1KQotI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRFBFMAkJQklUKDE2KQotI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRFBFMQkJQklUKDE3KQotI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfSVMJCUJJVCgxOCkKLSNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1RVUkJPCUJJVCgxOSkKLSNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0ZPUkNFCUJJVCgyMCkKLQotI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTCQlCSVQoMCkKLSNkZWZpbmUgT01BUDJfTUNTUElfQ0hTVEFUX1RYUwkJQklUKDEpCi0jZGVmaW5lIE9NQVAyX01DU1BJX0NIU1RBVF9FT1QJCUJJVCgyKQotCi0jZGVmaW5lIE9NQVAyX01DU1BJX0NIQ1RSTF9FTgkJQklUKDApCi0KLSNkZWZpbmUgT01BUDJfTUNTUElfV0FLRVVQRU5BQkxFX1dLRU4JQklUKDApCi0KLS8qIFdlIGhhdmUgMiBETUEgY2hhbm5lbHMgcGVyIENTLCBvbmUgZm9yIFJYIGFuZCBvbmUgZm9yIFRYICovCi1zdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hIHsKLQlpbnQgZG1hX3R4X2NoYW5uZWw7Ci0JaW50IGRtYV9yeF9jaGFubmVsOwotCi0JaW50IGRtYV90eF9zeW5jX2RldjsKLQlpbnQgZG1hX3J4X3N5bmNfZGV2OwotCi0Jc3RydWN0IGNvbXBsZXRpb24gZG1hX3R4X2NvbXBsZXRpb247Ci0Jc3RydWN0IGNvbXBsZXRpb24gZG1hX3J4X2NvbXBsZXRpb247Ci19OwotCi0vKiB1c2UgUElPIGZvciBzbWFsbCB0cmFuc2ZlcnMsIGF2b2lkaW5nIERNQSBzZXR1cC90ZWFyZG93biBvdmVyaGVhZCBhbmQKLSAqIGNhY2hlIG9wZXJhdGlvbnM7IGJldHRlciBoZXVyaXN0aWNzIGNvbnNpZGVyIHdvcmRzaXplIGFuZCBiaXRyYXRlLgotICovCi0jZGVmaW5lIERNQV9NSU5fQllURVMJCQkxNjAKLQotCi1zdHJ1Y3Qgb21hcDJfbWNzcGkgewotCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwotCS8qIGxvY2sgcHJvdGVjdHMgcXVldWUgYW5kIHJlZ2lzdGVycyAqLwotCXNwaW5sb2NrX3QJCWxvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZAltc2dfcXVldWU7Ci0Jc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKLQkvKiBWaXJ0dWFsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlciAqLwotCXZvaWQgX19pb21lbQkJKmJhc2U7Ci0JdW5zaWduZWQgbG9uZwkJcGh5czsKLQkvKiBTUEkxIGhhcyA0IGNoYW5uZWxzLCB3aGlsZSBTUEkyIGhhcyAyICovCi0Jc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqZG1hX2NoYW5uZWxzOwotCXN0cnVjdCAgZGV2aWNlCQkqZGV2OwotfTsKLQotc3RydWN0IG9tYXAyX21jc3BpX2NzIHsKLQl2b2lkIF9faW9tZW0JCSpiYXNlOwotCXVuc2lnbmVkIGxvbmcJCXBoeXM7Ci0JaW50CQkJd29yZF9sZW47Ci0Jc3RydWN0IGxpc3RfaGVhZAlub2RlOwotCS8qIENvbnRleHQgc2F2ZSBhbmQgcmVzdG9yZSBzaGFkb3cgcmVnaXN0ZXIgKi8KLQl1MzIJCQljaGNvbmYwOwotfTsKLQotLyogdXNlZCBmb3IgY29udGV4dCBzYXZlIGFuZCByZXN0b3JlLCBzdHJ1Y3R1cmUgbWVtYmVycyB0byBiZSB1cGRhdGVkIHdoZW5ldmVyCi0gKiBjb3JyZXNwb25kaW5nIHJlZ2lzdGVycyBhcmUgbW9kaWZpZWQuCi0gKi8KLXN0cnVjdCBvbWFwMl9tY3NwaV9yZWdzIHsKLQl1MzIgbW9kdWxjdHJsOwotCXUzMiB3YWtldXBlbmFibGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcDJfbWNzcGlfcmVncyBvbWFwMl9tY3NwaV9jdHhbT01BUDJfTUNTUElfTUFYX0NUUkxdOwotCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm9tYXAyX21jc3BpX3dxOwotCi0jZGVmaW5lIE1PRF9SRUdfQklUKHZhbCwgbWFzaywgc2V0KSBkbyB7IFwKLQlpZiAoc2V0KSBcCi0JCXZhbCB8PSBtYXNrOyBcCi0JZWxzZSBcCi0JCXZhbCAmPSB+bWFzazsgXAotfSB3aGlsZSAoMCkKLQotc3RhdGljIGlubGluZSB2b2lkIG1jc3BpX3dyaXRlX3JlZyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAotCQlpbnQgaWR4LCB1MzIgdmFsKQotewotCXN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0KLQlfX3Jhd193cml0ZWwodmFsLCBtY3NwaS0+YmFzZSArIGlkeCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIG1jc3BpX3JlYWRfcmVnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIGludCBpZHgpCi17Ci0Jc3RydWN0IG9tYXAyX21jc3BpICptY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQotCXJldHVybiBfX3Jhd19yZWFkbChtY3NwaS0+YmFzZSArIGlkeCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtY3NwaV93cml0ZV9jc19yZWcoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJaW50IGlkeCwgdTMyIHZhbCkKLXsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCi0JX19yYXdfd3JpdGVsKHZhbCwgY3MtPmJhc2UgKyAgaWR4KTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgbWNzcGlfcmVhZF9jc19yZWcoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlkeCkKLXsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCi0JcmV0dXJuIF9fcmF3X3JlYWRsKGNzLT5iYXNlICsgaWR4KTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgbWNzcGlfY2FjaGVkX2NoY29uZjAoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCi0JcmV0dXJuIGNzLT5jaGNvbmYwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWNzcGlfd3JpdGVfY2hjb25mMChjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1MzIgdmFsKQotewotCXN0cnVjdCBvbWFwMl9tY3NwaV9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0KLQljcy0+Y2hjb25mMCA9IHZhbDsKLQltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwLCB2YWwpOwotCW1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXAyX21jc3BpX3NldF9kbWFfcmVxKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCWludCBpc19yZWFkLCBpbnQgZW5hYmxlKQotewotCXUzMiBsLCBydzsKLQotCWwgPSBtY3NwaV9jYWNoZWRfY2hjb25mMChzcGkpOwotCi0JaWYgKGlzX3JlYWQpIC8qIDEgaXMgcmVhZCwgMCB3cml0ZSAqLwotCQlydyA9IE9NQVAyX01DU1BJX0NIQ09ORl9ETUFSOwotCWVsc2UKLQkJcncgPSBPTUFQMl9NQ1NQSV9DSENPTkZfRE1BVzsKLQotCU1PRF9SRUdfQklUKGwsIHJ3LCBlbmFibGUpOwotCW1jc3BpX3dyaXRlX2NoY29uZjAoc3BpLCBsKTsKLX0KLQotc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfc2V0X2VuYWJsZShjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgZW5hYmxlKQotewotCXUzMiBsOwotCi0JbCA9IGVuYWJsZSA/IE9NQVAyX01DU1BJX0NIQ1RSTF9FTiA6IDA7Ci0JbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDVFJMMCwgbCk7Ci0JLyogRmxhc2ggcG9zdC13cml0ZXMgKi8KLQltY3NwaV9yZWFkX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ1RSTDApOwotfQotCi1zdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9mb3JjZV9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgY3NfYWN0aXZlKQotewotCXUzMiBsOwotCi0JbCA9IG1jc3BpX2NhY2hlZF9jaGNvbmYwKHNwaSk7Ci0JTU9EX1JFR19CSVQobCwgT01BUDJfTUNTUElfQ0hDT05GX0ZPUkNFLCBjc19hY3RpdmUpOwotCW1jc3BpX3dyaXRlX2NoY29uZjAoc3BpLCBsKTsKLX0KLQotc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfc2V0X21hc3Rlcl9tb2RlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCi17Ci0JdTMyIGw7Ci0KLQkvKiBzZXR1cCB3aGVuIHN3aXRjaGluZyBmcm9tIChyZXNldCBkZWZhdWx0KSBzbGF2ZSBtb2RlCi0JICogdG8gc2luZ2xlLWNoYW5uZWwgbWFzdGVyIG1vZGUKLQkgKi8KLQlsID0gbWNzcGlfcmVhZF9yZWcobWFzdGVyLCBPTUFQMl9NQ1NQSV9NT0RVTENUUkwpOwotCU1PRF9SRUdfQklUKGwsIE9NQVAyX01DU1BJX01PRFVMQ1RSTF9TVEVTVCwgMCk7Ci0JTU9EX1JFR19CSVQobCwgT01BUDJfTUNTUElfTU9EVUxDVFJMX01TLCAwKTsKLQlNT0RfUkVHX0JJVChsLCBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfU0lOR0xFLCAxKTsKLQltY3NwaV93cml0ZV9yZWcobWFzdGVyLCBPTUFQMl9NQ1NQSV9NT0RVTENUUkwsIGwpOwotCi0Jb21hcDJfbWNzcGlfY3R4W21hc3Rlci0+YnVzX251bSAtIDFdLm1vZHVsY3RybCA9IGw7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXAyX21jc3BpX3Jlc3RvcmVfY3R4KHN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGkpCi17Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKnNwaV9jbnRybDsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MgKmNzOwotCXNwaV9jbnRybCA9IG1jc3BpLT5tYXN0ZXI7Ci0KLQkvKiBNY1NQSTogY29udGV4dCByZXN0b3JlICovCi0JbWNzcGlfd3JpdGVfcmVnKHNwaV9jbnRybCwgT01BUDJfTUNTUElfTU9EVUxDVFJMLAotCQkJb21hcDJfbWNzcGlfY3R4W3NwaV9jbnRybC0+YnVzX251bSAtIDFdLm1vZHVsY3RybCk7Ci0KLQltY3NwaV93cml0ZV9yZWcoc3BpX2NudHJsLCBPTUFQMl9NQ1NQSV9XQUtFVVBFTkFCTEUsCi0JCQlvbWFwMl9tY3NwaV9jdHhbc3BpX2NudHJsLT5idXNfbnVtIC0gMV0ud2FrZXVwZW5hYmxlKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3MsICZvbWFwMl9tY3NwaV9jdHhbc3BpX2NudHJsLT5idXNfbnVtIC0gMV0uY3MsCi0JCQlub2RlKQotCQlfX3Jhd193cml0ZWwoY3MtPmNoY29uZjAsIGNzLT5iYXNlICsgT01BUDJfTUNTUElfQ0hDT05GMCk7Ci19Ci1zdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9kaXNhYmxlX2Nsb2NrcyhzdHJ1Y3Qgb21hcDJfbWNzcGkgKm1jc3BpKQotewotCXBtX3J1bnRpbWVfcHV0X3N5bmMobWNzcGktPmRldik7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcDJfbWNzcGlfZW5hYmxlX2Nsb2NrcyhzdHJ1Y3Qgb21hcDJfbWNzcGkgKm1jc3BpKQotewotCXJldHVybiBwbV9ydW50aW1lX2dldF9zeW5jKG1jc3BpLT5kZXYpOwotfQotCi1zdGF0aWMgaW50IG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQodm9pZCBfX2lvbWVtICpyZWcsIHVuc2lnbmVkIGxvbmcgYml0KQotewotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKLQl3aGlsZSAoIShfX3Jhd19yZWFkbChyZWcpICYgYml0KSkgewotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKLQkJCXJldHVybiAtMTsKLQkJY3B1X3JlbGF4KCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQKLW9tYXAyX21jc3BpX3R4cnhfZG1hKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCi17Ci0Jc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEgICptY3NwaV9kbWE7Ci0JdW5zaWduZWQgaW50CQljb3VudCwgYzsKLQl1bnNpZ25lZCBsb25nCQliYXNlLCB0eF9yZWcsIHJ4X3JlZzsKLQlpbnQJCQl3b3JkX2xlbiwgZGF0YV90eXBlLCBlbGVtZW50X2NvdW50OwotCWludAkJCWVsZW1lbnRzOwotCXUzMgkJCWw7Ci0JdTgJCQkqIHJ4OwotCWNvbnN0IHU4CQkqIHR4OwotCXZvaWQgX19pb21lbQkJKmNoc3RhdF9yZWc7Ci0KLQltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCW1jc3BpX2RtYSA9ICZtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdOwotCWwgPSBtY3NwaV9jYWNoZWRfY2hjb25mMChzcGkpOwotCi0JY2hzdGF0X3JlZyA9IGNzLT5iYXNlICsgT01BUDJfTUNTUElfQ0hTVEFUMDsKLQotCWNvdW50ID0geGZlci0+bGVuOwotCWMgPSBjb3VudDsKLQl3b3JkX2xlbiA9IGNzLT53b3JkX2xlbjsKLQotCWJhc2UgPSBjcy0+cGh5czsKLQl0eF9yZWcgPSBiYXNlICsgT01BUDJfTUNTUElfVFgwOwotCXJ4X3JlZyA9IGJhc2UgKyBPTUFQMl9NQ1NQSV9SWDA7Ci0JcnggPSB4ZmVyLT5yeF9idWY7Ci0JdHggPSB4ZmVyLT50eF9idWY7Ci0KLQlpZiAod29yZF9sZW4gPD0gOCkgewotCQlkYXRhX3R5cGUgPSBPTUFQX0RNQV9EQVRBX1RZUEVfUzg7Ci0JCWVsZW1lbnRfY291bnQgPSBjb3VudDsKLQl9IGVsc2UgaWYgKHdvcmRfbGVuIDw9IDE2KSB7Ci0JCWRhdGFfdHlwZSA9IE9NQVBfRE1BX0RBVEFfVFlQRV9TMTY7Ci0JCWVsZW1lbnRfY291bnQgPSBjb3VudCA+PiAxOwotCX0gZWxzZSAvKiB3b3JkX2xlbiA8PSAzMiAqLyB7Ci0JCWRhdGFfdHlwZSA9IE9NQVBfRE1BX0RBVEFfVFlQRV9TMzI7Ci0JCWVsZW1lbnRfY291bnQgPSBjb3VudCA+PiAyOwotCX0KLQotCWlmICh0eCAhPSBOVUxMKSB7Ci0JCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCwKLQkJCQlkYXRhX3R5cGUsIGVsZW1lbnRfY291bnQsIDEsCi0JCQkJT01BUF9ETUFfU1lOQ19FTEVNRU5ULAotCQkJCW1jc3BpX2RtYS0+ZG1hX3R4X3N5bmNfZGV2LCAwKTsKLQotCQlvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXMobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCwgMCwKLQkJCQlPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKLQkJCQl0eF9yZWcsIDAsIDApOwotCi0JCW9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKG1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwsIDAsCi0JCQkJT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCi0JCQkJeGZlci0+dHhfZG1hLCAwLCAwKTsKLQl9Ci0KLQlpZiAocnggIT0gTlVMTCkgewotCQllbGVtZW50cyA9IGVsZW1lbnRfY291bnQgLSAxOwotCQlpZiAobCAmIE9NQVAyX01DU1BJX0NIQ09ORl9UVVJCTykKLQkJCWVsZW1lbnRzLS07Ci0KLQkJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsLAotCQkJCWRhdGFfdHlwZSwgZWxlbWVudHMsIDEsCi0JCQkJT01BUF9ETUFfU1lOQ19FTEVNRU5ULAotCQkJCW1jc3BpX2RtYS0+ZG1hX3J4X3N5bmNfZGV2LCAxKTsKLQotCQlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsLCAwLAotCQkJCU9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULAotCQkJCXJ4X3JlZywgMCwgMCk7Ci0KLQkJb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwsIDAsCi0JCQkJT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCi0JCQkJeGZlci0+cnhfZG1hLCAwLCAwKTsKLQl9Ci0KLQlpZiAodHggIT0gTlVMTCkgewotCQlvbWFwX3N0YXJ0X2RtYShtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsKTsKLQkJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAwLCAxKTsKLQl9Ci0KLQlpZiAocnggIT0gTlVMTCkgewotCQlvbWFwX3N0YXJ0X2RtYShtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKTsKLQkJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAxLCAxKTsKLQl9Ci0KLQlpZiAodHggIT0gTlVMTCkgewotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtY3NwaV9kbWEtPmRtYV90eF9jb21wbGV0aW9uKTsKLQkJZG1hX3VubWFwX3NpbmdsZSgmc3BpLT5kZXYsIHhmZXItPnR4X2RtYSwgY291bnQsIERNQV9UT19ERVZJQ0UpOwotCi0JCS8qIGZvciBUWF9PTkxZIG1vZGUsIGJlIHN1cmUgYWxsIHdvcmRzIGhhdmUgc2hpZnRlZCBvdXQgKi8KLQkJaWYgKHJ4ID09IE5VTEwpIHsKLQkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCi0JCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfVFhTKSA8IDApCi0JCQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKLQkJCWVsc2UgaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKLQkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9FT1QpIDwgMCkKLQkJCQlkZXZfZXJyKCZzcGktPmRldiwgIkVPVCB0aW1lZCBvdXRcbiIpOwotCQl9Ci0JfQotCi0JaWYgKHJ4ICE9IE5VTEwpIHsKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmbWNzcGlfZG1hLT5kbWFfcnhfY29tcGxldGlvbik7Ci0JCWRtYV91bm1hcF9zaW5nbGUoJnNwaS0+ZGV2LCB4ZmVyLT5yeF9kbWEsIGNvdW50LCBETUFfRlJPTV9ERVZJQ0UpOwotCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMCk7Ci0KLQkJaWYgKGwgJiBPTUFQMl9NQ1NQSV9DSENPTkZfVFVSQk8pIHsKLQotCQkJaWYgKGxpa2VseShtY3NwaV9yZWFkX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIU1RBVDApCi0JCQkJICAgJiBPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTKSkgewotCQkJCXUzMiB3OwotCi0JCQkJdyA9IG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfUlgwKTsKLQkJCQlpZiAod29yZF9sZW4gPD0gOCkKLQkJCQkJKCh1OCAqKXhmZXItPnJ4X2J1ZilbZWxlbWVudHMrK10gPSB3OwotCQkJCWVsc2UgaWYgKHdvcmRfbGVuIDw9IDE2KQotCQkJCQkoKHUxNiAqKXhmZXItPnJ4X2J1ZilbZWxlbWVudHMrK10gPSB3OwotCQkJCWVsc2UgLyogd29yZF9sZW4gPD0gMzIgKi8KLQkJCQkJKCh1MzIgKil4ZmVyLT5yeF9idWYpW2VsZW1lbnRzKytdID0gdzsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJCSJETUEgUlggcGVudWx0aW1hdGUgd29yZCBlbXB0eSIpOwotCQkJCWNvdW50IC09ICh3b3JkX2xlbiA8PSA4KSAgPyAyIDoKLQkJCQkJKHdvcmRfbGVuIDw9IDE2KSA/IDQgOgotCQkJCQkvKiB3b3JkX2xlbiA8PSAzMiAqLyA4OwotCQkJCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAxKTsKLQkJCQlyZXR1cm4gY291bnQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGlrZWx5KG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hTVEFUMCkKLQkJCQkmIE9NQVAyX01DU1BJX0NIU1RBVF9SWFMpKSB7Ci0JCQl1MzIgdzsKLQotCQkJdyA9IG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfUlgwKTsKLQkJCWlmICh3b3JkX2xlbiA8PSA4KQotCQkJCSgodTggKil4ZmVyLT5yeF9idWYpW2VsZW1lbnRzXSA9IHc7Ci0JCQllbHNlIGlmICh3b3JkX2xlbiA8PSAxNikKLQkJCQkoKHUxNiAqKXhmZXItPnJ4X2J1ZilbZWxlbWVudHNdID0gdzsKLQkJCWVsc2UgLyogd29yZF9sZW4gPD0gMzIgKi8KLQkJCQkoKHUzMiAqKXhmZXItPnJ4X2J1ZilbZWxlbWVudHNdID0gdzsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRE1BIFJYIGxhc3Qgd29yZCBlbXB0eSIpOwotCQkJY291bnQgLT0gKHdvcmRfbGVuIDw9IDgpICA/IDEgOgotCQkJCSAod29yZF9sZW4gPD0gMTYpID8gMiA6Ci0JCQkgICAgICAgLyogd29yZF9sZW4gPD0gMzIgKi8gNDsKLQkJfQotCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMSk7Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHVuc2lnbmVkCi1vbWFwMl9tY3NwaV90eHJ4X3BpbyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQotewotCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7Ci0Jc3RydWN0IG9tYXAyX21jc3BpX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQl1bnNpZ25lZCBpbnQJCWNvdW50LCBjOwotCXUzMgkJCWw7Ci0Jdm9pZCBfX2lvbWVtCQkqYmFzZSA9IGNzLT5iYXNlOwotCXZvaWQgX19pb21lbQkJKnR4X3JlZzsKLQl2b2lkIF9faW9tZW0JCSpyeF9yZWc7Ci0Jdm9pZCBfX2lvbWVtCQkqY2hzdGF0X3JlZzsKLQlpbnQJCQl3b3JkX2xlbjsKLQotCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JY291bnQgPSB4ZmVyLT5sZW47Ci0JYyA9IGNvdW50OwotCXdvcmRfbGVuID0gY3MtPndvcmRfbGVuOwotCi0JbCA9IG1jc3BpX2NhY2hlZF9jaGNvbmYwKHNwaSk7Ci0KLQkvKiBXZSBzdG9yZSB0aGUgcHJlLWNhbGN1bGF0ZWQgcmVnaXN0ZXIgYWRkcmVzc2VzIG9uIHN0YWNrIHRvIHNwZWVkCi0JICogdXAgdGhlIHRyYW5zZmVyIGxvb3AuICovCi0JdHhfcmVnCQk9IGJhc2UgKyBPTUFQMl9NQ1NQSV9UWDA7Ci0JcnhfcmVnCQk9IGJhc2UgKyBPTUFQMl9NQ1NQSV9SWDA7Ci0JY2hzdGF0X3JlZwk9IGJhc2UgKyBPTUFQMl9NQ1NQSV9DSFNUQVQwOwotCi0JaWYgKGMgPCAod29yZF9sZW4+PjMpKQotCQlyZXR1cm4gMDsKLQotCWlmICh3b3JkX2xlbiA8PSA4KSB7Ci0JCXU4CQkqcng7Ci0JCWNvbnN0IHU4CSp0eDsKLQotCQlyeCA9IHhmZXItPnJ4X2J1ZjsKLQkJdHggPSB4ZmVyLT50eF9idWY7Ci0KLQkJZG8gewotCQkJYyAtPSAxOwotCQkJaWYgKHR4ICE9IE5VTEwpIHsKLQkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAotCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1RYUykgPCAwKSB7Ci0JCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVFhTIHRpbWVkIG91dFxuIik7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCQlkZXZfdmRiZygmc3BpLT5kZXYsICJ3cml0ZS0lZCAlMDJ4XG4iLAotCQkJCQkJd29yZF9sZW4sICp0eCk7Ci0JCQkJX19yYXdfd3JpdGVsKCp0eCsrLCB0eF9yZWcpOwotCQkJfQotCQkJaWYgKHJ4ICE9IE5VTEwpIHsKLQkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAotCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7Ci0JCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUlhTIHRpbWVkIG91dFxuIik7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQotCQkJCWlmIChjID09IDEgJiYgdHggPT0gTlVMTCAmJgotCQkJCSAgICAobCAmIE9NQVAyX01DU1BJX0NIQ09ORl9UVVJCTykpIHsKLQkJCQkJb21hcDJfbWNzcGlfc2V0X2VuYWJsZShzcGksIDApOwotCQkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7Ci0JCQkJCWRldl92ZGJnKCZzcGktPmRldiwgInJlYWQtJWQgJTAyeFxuIiwKLQkJCQkJCSAgICB3b3JkX2xlbiwgKihyeCAtIDEpKTsKLQkJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKLQkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9SWFMpIDwgMCkgewotCQkJCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJCQkJIlJYUyB0aW1lZCBvdXRcbiIpOwotCQkJCQkJZ290byBvdXQ7Ci0JCQkJCX0KLQkJCQkJYyA9IDA7Ci0JCQkJfSBlbHNlIGlmIChjID09IDAgJiYgdHggPT0gTlVMTCkgewotCQkJCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMCk7Ci0JCQkJfQotCi0JCQkJKnJ4KysgPSBfX3Jhd19yZWFkbChyeF9yZWcpOwotCQkJCWRldl92ZGJnKCZzcGktPmRldiwgInJlYWQtJWQgJTAyeFxuIiwKLQkJCQkJCXdvcmRfbGVuLCAqKHJ4IC0gMSkpOwotCQkJfQotCQl9IHdoaWxlIChjKTsKLQl9IGVsc2UgaWYgKHdvcmRfbGVuIDw9IDE2KSB7Ci0JCXUxNgkJKnJ4OwotCQljb25zdCB1MTYJKnR4OwotCi0JCXJ4ID0geGZlci0+cnhfYnVmOwotCQl0eCA9IHhmZXItPnR4X2J1ZjsKLQkJZG8gewotCQkJYyAtPSAyOwotCQkJaWYgKHR4ICE9IE5VTEwpIHsKLQkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAotCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1RYUykgPCAwKSB7Ci0JCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVFhTIHRpbWVkIG91dFxuIik7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCQlkZXZfdmRiZygmc3BpLT5kZXYsICJ3cml0ZS0lZCAlMDR4XG4iLAotCQkJCQkJd29yZF9sZW4sICp0eCk7Ci0JCQkJX19yYXdfd3JpdGVsKCp0eCsrLCB0eF9yZWcpOwotCQkJfQotCQkJaWYgKHJ4ICE9IE5VTEwpIHsKLQkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAotCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7Ci0JCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUlhTIHRpbWVkIG91dFxuIik7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQotCQkJCWlmIChjID09IDIgJiYgdHggPT0gTlVMTCAmJgotCQkJCSAgICAobCAmIE9NQVAyX01DU1BJX0NIQ09ORl9UVVJCTykpIHsKLQkJCQkJb21hcDJfbWNzcGlfc2V0X2VuYWJsZShzcGksIDApOwotCQkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7Ci0JCQkJCWRldl92ZGJnKCZzcGktPmRldiwgInJlYWQtJWQgJTA0eFxuIiwKLQkJCQkJCSAgICB3b3JkX2xlbiwgKihyeCAtIDEpKTsKLQkJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKLQkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9SWFMpIDwgMCkgewotCQkJCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJCQkJIlJYUyB0aW1lZCBvdXRcbiIpOwotCQkJCQkJZ290byBvdXQ7Ci0JCQkJCX0KLQkJCQkJYyA9IDA7Ci0JCQkJfSBlbHNlIGlmIChjID09IDAgJiYgdHggPT0gTlVMTCkgewotCQkJCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMCk7Ci0JCQkJfQotCi0JCQkJKnJ4KysgPSBfX3Jhd19yZWFkbChyeF9yZWcpOwotCQkJCWRldl92ZGJnKCZzcGktPmRldiwgInJlYWQtJWQgJTA0eFxuIiwKLQkJCQkJCXdvcmRfbGVuLCAqKHJ4IC0gMSkpOwotCQkJfQotCQl9IHdoaWxlIChjID49IDIpOwotCX0gZWxzZSBpZiAod29yZF9sZW4gPD0gMzIpIHsKLQkJdTMyCQkqcng7Ci0JCWNvbnN0IHUzMgkqdHg7Ci0KLQkJcnggPSB4ZmVyLT5yeF9idWY7Ci0JCXR4ID0geGZlci0+dHhfYnVmOwotCQlkbyB7Ci0JCQljIC09IDQ7Ci0JCQlpZiAodHggIT0gTlVMTCkgewotCQkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCi0JCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfVFhTKSA8IDApIHsKLQkJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJCWRldl92ZGJnKCZzcGktPmRldiwgIndyaXRlLSVkICUwOHhcbiIsCi0JCQkJCQl3b3JkX2xlbiwgKnR4KTsKLQkJCQlfX3Jhd193cml0ZWwoKnR4KyssIHR4X3JlZyk7Ci0JCQl9Ci0JCQlpZiAocnggIT0gTlVMTCkgewotCQkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCi0JCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTKSA8IDApIHsKLQkJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJSWFMgdGltZWQgb3V0XG4iKTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCi0JCQkJaWYgKGMgPT0gNCAmJiB0eCA9PSBOVUxMICYmCi0JCQkJICAgIChsICYgT01BUDJfTUNTUElfQ0hDT05GX1RVUkJPKSkgewotCQkJCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMCk7Ci0JCQkJCSpyeCsrID0gX19yYXdfcmVhZGwocnhfcmVnKTsKLQkJCQkJZGV2X3ZkYmcoJnNwaS0+ZGV2LCAicmVhZC0lZCAlMDh4XG4iLAotCQkJCQkJICAgIHdvcmRfbGVuLCAqKHJ4IC0gMSkpOwotCQkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAotCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7Ci0JCQkJCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCQkJCQkiUlhTIHRpbWVkIG91dFxuIik7Ci0JCQkJCQlnb3RvIG91dDsKLQkJCQkJfQotCQkJCQljID0gMDsKLQkJCQl9IGVsc2UgaWYgKGMgPT0gMCAmJiB0eCA9PSBOVUxMKSB7Ci0JCQkJCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAwKTsKLQkJCQl9Ci0KLQkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7Ci0JCQkJZGV2X3ZkYmcoJnNwaS0+ZGV2LCAicmVhZC0lZCAlMDh4XG4iLAotCQkJCQkJd29yZF9sZW4sICoocnggLSAxKSk7Ci0JCQl9Ci0JCX0gd2hpbGUgKGMgPj0gNCk7Ci0JfQotCi0JLyogZm9yIFRYX09OTFkgbW9kZSwgYmUgc3VyZSBhbGwgd29yZHMgaGF2ZSBzaGlmdGVkIG91dCAqLwotCWlmICh4ZmVyLT5yeF9idWYgPT0gTlVMTCkgewotCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAotCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9UWFMpIDwgMCkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKLQkJfSBlbHNlIGlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCi0JCQkJT01BUDJfTUNTUElfQ0hTVEFUX0VPVCkgPCAwKQotCQkJZGV2X2Vycigmc3BpLT5kZXYsICJFT1QgdGltZWQgb3V0XG4iKTsKLQotCQkvKiBkaXNhYmxlIGNoYW4gdG8gcHVyZ2UgcnggZGF0YXMgcmVjZWl2ZWQgaW4gVFhfT05MWSB0cmFuc2ZlciwKLQkJICogb3RoZXJ3aXNlIHRoZXNlIHJ4IGRhdGFzIHdpbGwgYWZmZWN0IHRoZSBkaXJlY3QgZm9sbG93aW5nCi0JCSAqIFJYX09OTFkgdHJhbnNmZXIuCi0JCSAqLwotCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMCk7Ci0JfQotb3V0OgotCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAxKTsKLQlyZXR1cm4gY291bnQgLSBjOwotfQotCi1zdGF0aWMgdTMyIG9tYXAyX21jc3BpX2NhbGNfZGl2aXNvcih1MzIgc3BlZWRfaHopCi17Ci0JdTMyIGRpdjsKLQotCWZvciAoZGl2ID0gMDsgZGl2IDwgMTU7IGRpdisrKQotCQlpZiAoc3BlZWRfaHogPj0gKE9NQVAyX01DU1BJX01BWF9GUkVRID4+IGRpdikpCi0JCQlyZXR1cm4gZGl2OwotCi0JcmV0dXJuIDE1OwotfQotCi0vKiBjYWxsZWQgb25seSB3aGVuIG5vIHRyYW5zZmVyIGlzIGFjdGl2ZSB0byB0aGlzIGRldmljZSAqLwotc3RhdGljIGludCBvbWFwMl9tY3NwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXN0cnVjdCBvbWFwMl9tY3NwaV9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0Jc3RydWN0IG9tYXAyX21jc3BpICptY3NwaTsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqc3BpX2NudHJsOwotCXUzMiBsID0gMCwgZGl2ID0gMDsKLQl1OCB3b3JkX2xlbiA9IHNwaS0+Yml0c19wZXJfd29yZDsKLQl1MzIgc3BlZWRfaHogPSBzcGktPm1heF9zcGVlZF9oejsKLQotCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3BpX2NudHJsID0gbWNzcGktPm1hc3RlcjsKLQotCWlmICh0ICE9IE5VTEwgJiYgdC0+Yml0c19wZXJfd29yZCkKLQkJd29yZF9sZW4gPSB0LT5iaXRzX3Blcl93b3JkOwotCi0JY3MtPndvcmRfbGVuID0gd29yZF9sZW47Ci0KLQlpZiAodCAmJiB0LT5zcGVlZF9oeikKLQkJc3BlZWRfaHogPSB0LT5zcGVlZF9oejsKLQotCXNwZWVkX2h6ID0gbWluX3QodTMyLCBzcGVlZF9oeiwgT01BUDJfTUNTUElfTUFYX0ZSRVEpOwotCWRpdiA9IG9tYXAyX21jc3BpX2NhbGNfZGl2aXNvcihzcGVlZF9oeik7Ci0KLQlsID0gbWNzcGlfY2FjaGVkX2NoY29uZjAoc3BpKTsKLQotCS8qIHN0YW5kYXJkIDQtd2lyZSBtYXN0ZXIgbW9kZTogIFNDSywgTU9TSS9vdXQsIE1JU08vaW4sIG5DUwotCSAqIFJFVklTSVQ6IHRoaXMgY29udHJvbGxlciBjb3VsZCBzdXBwb3J0IFNQSV8zV0lSRSBtb2RlLgotCSAqLwotCWwgJj0gfihPTUFQMl9NQ1NQSV9DSENPTkZfSVN8T01BUDJfTUNTUElfQ0hDT05GX0RQRTEpOwotCWwgfD0gT01BUDJfTUNTUElfQ0hDT05GX0RQRTA7Ci0KLQkvKiB3b3JkbGVuZ3RoICovCi0JbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX1dMX01BU0s7Ci0JbCB8PSAod29yZF9sZW4gLSAxKSA8PCA3OwotCi0JLyogc2V0IGNoaXBzZWxlY3QgcG9sYXJpdHk7IG1hbmFnZSB3aXRoIEZPUkNFICovCi0JaWYgKCEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKQotCQlsIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9FUE9MOwkvKiBhY3RpdmUtbG93OyBub3JtYWwgKi8KLQllbHNlCi0JCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9FUE9MOwotCi0JLyogc2V0IGNsb2NrIGRpdmlzb3IgKi8KLQlsICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfQ0xLRF9NQVNLOwotCWwgfD0gZGl2IDw8IDI7Ci0KLQkvKiBzZXQgU1BJIG1vZGUgMC4uMyAqLwotCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKLQkJbCB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfUE9MOwotCWVsc2UKLQkJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX1BPTDsKLQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCi0JCWwgfD0gT01BUDJfTUNTUElfQ0hDT05GX1BIQTsKLQllbHNlCi0JCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9QSEE7Ci0KLQltY3NwaV93cml0ZV9jaGNvbmYwKHNwaSwgbCk7Ci0KLQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiBzcGVlZCAlZCwgc2FtcGxlICVzIGVkZ2UsIGNsayAlc1xuIiwKLQkJCU9NQVAyX01DU1BJX01BWF9GUkVRID4+IGRpdiwKLQkJCShzcGktPm1vZGUgJiBTUElfQ1BIQSkgPyAidHJhaWxpbmciIDogImxlYWRpbmciLAotCQkJKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSA/ICJpbnZlcnRlZCIgOiAibm9ybWFsIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfZG1hX3J4X2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IGRhdGE7Ci0Jc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSptY3NwaV9kbWE7Ci0KLQltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCW1jc3BpX2RtYSA9ICYobWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XSk7Ci0KLQljb21wbGV0ZSgmbWNzcGlfZG1hLT5kbWFfcnhfY29tcGxldGlvbik7Ci0KLQkvKiBXZSBtdXN0IGRpc2FibGUgdGhlIERNQSBSWCByZXF1ZXN0ICovCi0Jb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAxLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfZG1hX3R4X2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IGRhdGE7Ci0Jc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSptY3NwaV9kbWE7Ci0KLQltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCW1jc3BpX2RtYSA9ICYobWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XSk7Ci0KLQljb21wbGV0ZSgmbWNzcGlfZG1hLT5kbWFfdHhfY29tcGxldGlvbik7Ci0KLQkvKiBXZSBtdXN0IGRpc2FibGUgdGhlIERNQSBUWCByZXF1ZXN0ICovCi0Jb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAwLCAwKTsKLX0KLQotc3RhdGljIGludCBvbWFwMl9tY3NwaV9yZXF1ZXN0X2RtYShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXIgPSBzcGktPm1hc3RlcjsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOwotCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKm1jc3BpX2RtYTsKLQotCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCW1jc3BpX2RtYSA9IG1jc3BpLT5kbWFfY2hhbm5lbHMgKyBzcGktPmNoaXBfc2VsZWN0OwotCi0JaWYgKG9tYXBfcmVxdWVzdF9kbWEobWNzcGlfZG1hLT5kbWFfcnhfc3luY19kZXYsICJNY1NQSSBSWCIsCi0JCQlvbWFwMl9tY3NwaV9kbWFfcnhfY2FsbGJhY2ssIHNwaSwKLQkJCSZtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKSkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIFJYIERNQSBjaGFubmVsIGZvciBNY1NQSVxuIik7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCWlmIChvbWFwX3JlcXVlc3RfZG1hKG1jc3BpX2RtYS0+ZG1hX3R4X3N5bmNfZGV2LCAiTWNTUEkgVFgiLAotCQkJb21hcDJfbWNzcGlfZG1hX3R4X2NhbGxiYWNrLCBzcGksCi0JCQkmbWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCkpIHsKLQkJb21hcF9mcmVlX2RtYShtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKTsKLQkJbWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCA9IC0xOwotCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIFRYIERNQSBjaGFubmVsIGZvciBNY1NQSVxuIik7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCWluaXRfY29tcGxldGlvbigmbWNzcGlfZG1hLT5kbWFfcnhfY29tcGxldGlvbik7Ci0JaW5pdF9jb21wbGV0aW9uKCZtY3NwaV9kbWEtPmRtYV90eF9jb21wbGV0aW9uKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9tYXAyX21jc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0JaW50CQkJcmV0OwotCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7Ci0Jc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqbWNzcGlfZG1hOwotCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0KLQlpZiAoc3BpLT5iaXRzX3Blcl93b3JkIDwgNCB8fCBzcGktPmJpdHNfcGVyX3dvcmQgPiAzMikgewotCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCAlZCBiaXQgd29yZHNcbiIsCi0JCQlzcGktPmJpdHNfcGVyX3dvcmQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCW1jc3BpX2RtYSA9ICZtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdOwotCi0JaWYgKCFjcykgewotCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY3MpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJY3MtPmJhc2UgPSBtY3NwaS0+YmFzZSArIHNwaS0+Y2hpcF9zZWxlY3QgKiAweDE0OwotCQljcy0+cGh5cyA9IG1jc3BpLT5waHlzICsgc3BpLT5jaGlwX3NlbGVjdCAqIDB4MTQ7Ci0JCWNzLT5jaGNvbmYwID0gMDsKLQkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gY3M7Ci0JCS8qIExpbmsgdGhpcyB0byBjb250ZXh0IHNhdmUgbGlzdCAqLwotCQlsaXN0X2FkZF90YWlsKCZjcy0+bm9kZSwKLQkJCSZvbWFwMl9tY3NwaV9jdHhbbWNzcGktPm1hc3Rlci0+YnVzX251bSAtIDFdLmNzKTsKLQl9Ci0KLQlpZiAobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCA9PSAtMQotCQkJfHwgbWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCA9PSAtMSkgewotCQlyZXQgPSBvbWFwMl9tY3NwaV9yZXF1ZXN0X2RtYShzcGkpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gb21hcDJfbWNzcGlfZW5hYmxlX2Nsb2NrcyhtY3NwaSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBvbWFwMl9tY3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOwotCW9tYXAyX21jc3BpX2Rpc2FibGVfY2xvY2tzKG1jc3BpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXAyX21jc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOwotCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKm1jc3BpX2RtYTsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJKmNzOwotCi0JbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQotCWlmIChzcGktPmNvbnRyb2xsZXJfc3RhdGUpIHsKLQkJLyogVW5saW5rIGNvbnRyb2xsZXIgc3RhdGUgZnJvbSBjb250ZXh0IHNhdmUgbGlzdCAqLwotCQljcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQkJbGlzdF9kZWwoJmNzLT5ub2RlKTsKLQotCQlrZnJlZShzcGktPmNvbnRyb2xsZXJfc3RhdGUpOwotCX0KLQotCWlmIChzcGktPmNoaXBfc2VsZWN0IDwgc3BpLT5tYXN0ZXItPm51bV9jaGlwc2VsZWN0KSB7Ci0JCW1jc3BpX2RtYSA9ICZtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdOwotCi0JCWlmIChtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsICE9IC0xKSB7Ci0JCQlvbWFwX2ZyZWVfZG1hKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwpOwotCQkJbWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCA9IC0xOwotCQl9Ci0JCWlmIChtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsICE9IC0xKSB7Ci0JCQlvbWFwX2ZyZWVfZG1hKG1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwpOwotCQkJbWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCA9IC0xOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOwotCi0JbWNzcGkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG9tYXAyX21jc3BpLCB3b3JrKTsKLQotCWlmIChvbWFwMl9tY3NwaV9lbmFibGVfY2xvY2tzKG1jc3BpKSA8IDApCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKLQotCS8qIFdlIG9ubHkgZW5hYmxlIG9uZSBjaGFubmVsIGF0IGEgdGltZSAtLSB0aGUgb25lIHdob3NlIG1lc3NhZ2UgaXMKLQkgKiBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgLS0gYWx0aG91Z2ggdGhpcyBjb250cm9sbGVyIHdvdWxkIGdsYWRseQotCSAqIGFyYml0cmF0ZSBhbW9uZyBtdWx0aXBsZSBjaGFubmVscy4gIFRoaXMgY29ycmVzcG9uZHMgdG8gInNpbmdsZQotCSAqIGNoYW5uZWwiIG1hc3RlciBtb2RlLiAgQXMgYSBzaWRlIGVmZmVjdCwgd2UgbmVlZCB0byBtYW5hZ2UgdGhlCi0JICogY2hpcHNlbGVjdCB3aXRoIHRoZSBGT1JDRSBiaXQgLi4uIENTICE9IGNoYW5uZWwgZW5hYmxlLgotCSAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgmbWNzcGktPm1zZ19xdWV1ZSkpIHsKLQkJc3RydWN0IHNwaV9tZXNzYWdlCQkqbTsKLQkJc3RydWN0IHNwaV9kZXZpY2UJCSpzcGk7Ci0JCXN0cnVjdCBzcGlfdHJhbnNmZXIJCSp0ID0gTlVMTDsKLQkJaW50CQkJCWNzX2FjdGl2ZSA9IDA7Ci0JCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkJKmNzOwotCQlzdHJ1Y3Qgb21hcDJfbWNzcGlfZGV2aWNlX2NvbmZpZyAqY2Q7Ci0JCWludAkJCQlwYXJfb3ZlcnJpZGUgPSAwOwotCQlpbnQJCQkJc3RhdHVzID0gMDsKLQkJdTMyCQkJCWNoY29uZjsKLQotCQltID0gY29udGFpbmVyX29mKG1jc3BpLT5tc2dfcXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLAotCQkJCSBxdWV1ZSk7Ci0KLQkJbGlzdF9kZWxfaW5pdCgmbS0+cXVldWUpOwotCQlzcGluX3VubG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKLQotCQlzcGkgPSBtLT5zcGk7Ci0JCWNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCQljZCA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOwotCi0JCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAxKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCQlpZiAodC0+dHhfYnVmID09IE5VTEwgJiYgdC0+cnhfYnVmID09IE5VTEwgJiYgdC0+bGVuKSB7Ci0JCQkJc3RhdHVzID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChwYXJfb3ZlcnJpZGUgfHwgdC0+c3BlZWRfaHogfHwgdC0+Yml0c19wZXJfd29yZCkgewotCQkJCXBhcl9vdmVycmlkZSA9IDE7Ci0JCQkJc3RhdHVzID0gb21hcDJfbWNzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKLQkJCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKCF0LT5zcGVlZF9oeiAmJiAhdC0+Yml0c19wZXJfd29yZCkKLQkJCQkJcGFyX292ZXJyaWRlID0gMDsKLQkJCX0KLQotCQkJaWYgKCFjc19hY3RpdmUpIHsKLQkJCQlvbWFwMl9tY3NwaV9mb3JjZV9jcyhzcGksIDEpOwotCQkJCWNzX2FjdGl2ZSA9IDE7Ci0JCQl9Ci0KLQkJCWNoY29uZiA9IG1jc3BpX2NhY2hlZF9jaGNvbmYwKHNwaSk7Ci0JCQljaGNvbmYgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9UUk1fTUFTSzsKLQkJCWNoY29uZiAmPSB+T01BUDJfTUNTUElfQ0hDT05GX1RVUkJPOwotCi0JCQlpZiAodC0+dHhfYnVmID09IE5VTEwpCi0JCQkJY2hjb25mIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9UUk1fUlhfT05MWTsKLQkJCWVsc2UgaWYgKHQtPnJ4X2J1ZiA9PSBOVUxMKQotCQkJCWNoY29uZiB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX1RYX09OTFk7Ci0KLQkJCWlmIChjZCAmJiBjZC0+dHVyYm9fbW9kZSAmJiB0LT50eF9idWYgPT0gTlVMTCkgewotCQkJCS8qIFR1cmJvIG1vZGUgaXMgZm9yIG1vcmUgdGhhbiBvbmUgd29yZCAqLwotCQkJCWlmICh0LT5sZW4gPiAoKGNzLT53b3JkX2xlbiArIDcpID4+IDMpKQotCQkJCQljaGNvbmYgfD0gT01BUDJfTUNTUElfQ0hDT05GX1RVUkJPOwotCQkJfQotCi0JCQltY3NwaV93cml0ZV9jaGNvbmYwKHNwaSwgY2hjb25mKTsKLQotCQkJaWYgKHQtPmxlbikgewotCQkJCXVuc2lnbmVkCWNvdW50OwotCi0JCQkJLyogUlhfT05MWSBtb2RlIG5lZWRzIGR1bW15IGRhdGEgaW4gVFggcmVnICovCi0JCQkJaWYgKHQtPnR4X2J1ZiA9PSBOVUxMKQotCQkJCQlfX3Jhd193cml0ZWwoMCwgY3MtPmJhc2UKLQkJCQkJCQkrIE9NQVAyX01DU1BJX1RYMCk7Ci0KLQkJCQlpZiAobS0+aXNfZG1hX21hcHBlZCB8fCB0LT5sZW4gPj0gRE1BX01JTl9CWVRFUykKLQkJCQkJY291bnQgPSBvbWFwMl9tY3NwaV90eHJ4X2RtYShzcGksIHQpOwotCQkJCWVsc2UKLQkJCQkJY291bnQgPSBvbWFwMl9tY3NwaV90eHJ4X3BpbyhzcGksIHQpOwotCQkJCW0tPmFjdHVhbF9sZW5ndGggKz0gY291bnQ7Ci0KLQkJCQlpZiAoY291bnQgIT0gdC0+bGVuKSB7Ci0JCQkJCXN0YXR1cyA9IC1FSU87Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHQtPmRlbGF5X3VzZWNzKQotCQkJCXVkZWxheSh0LT5kZWxheV91c2Vjcyk7Ci0KLQkJCS8qIGlnbm9yZSB0aGUgImxlYXZlIGl0IG9uIGFmdGVyIGxhc3QgeGZlciIgaGludCAqLwotCQkJaWYgKHQtPmNzX2NoYW5nZSkgewotCQkJCW9tYXAyX21jc3BpX2ZvcmNlX2NzKHNwaSwgMCk7Ci0JCQkJY3NfYWN0aXZlID0gMDsKLQkJCX0KLQkJfQotCi0JCS8qIFJlc3RvcmUgZGVmYXVsdHMgaWYgdGhleSB3ZXJlIG92ZXJyaWRlbiAqLwotCQlpZiAocGFyX292ZXJyaWRlKSB7Ci0JCQlwYXJfb3ZlcnJpZGUgPSAwOwotCQkJc3RhdHVzID0gb21hcDJfbWNzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKLQkJfQotCi0JCWlmIChjc19hY3RpdmUpCi0JCQlvbWFwMl9tY3NwaV9mb3JjZV9jcyhzcGksIDApOwotCi0JCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAwKTsKLQotCQltLT5zdGF0dXMgPSBzdGF0dXM7Ci0JCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOwotCi0JCXNwaW5fbG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKLQotCW9tYXAyX21jc3BpX2Rpc2FibGVfY2xvY2tzKG1jc3BpKTsKLX0KLQotc3RhdGljIGludCBvbWFwMl9tY3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCi17Ci0Jc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0OwotCi0JbS0+YWN0dWFsX2xlbmd0aCA9IDA7Ci0JbS0+c3RhdHVzID0gMDsKLQotCS8qIHJlamVjdCBpbnZhbGlkIG1lc3NhZ2VzIGFuZCB0cmFuc2ZlcnMgKi8KLQlpZiAobGlzdF9lbXB0eSgmbS0+dHJhbnNmZXJzKSB8fCAhbS0+Y29tcGxldGUpCi0JCXJldHVybiAtRUlOVkFMOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQljb25zdCB2b2lkCSp0eF9idWYgPSB0LT50eF9idWY7Ci0JCXZvaWQJCSpyeF9idWYgPSB0LT5yeF9idWY7Ci0JCXVuc2lnbmVkCWxlbiA9IHQtPmxlbjsKLQotCQlpZiAodC0+c3BlZWRfaHogPiBPTUFQMl9NQ1NQSV9NQVhfRlJFUQotCQkJCXx8IChsZW4gJiYgIShyeF9idWYgfHwgdHhfYnVmKSkKLQkJCQl8fCAodC0+Yml0c19wZXJfd29yZCAmJgotCQkJCQkoICB0LT5iaXRzX3Blcl93b3JkIDwgNAotCQkJCQl8fCB0LT5iaXRzX3Blcl93b3JkID4gMzIpKSkgewotCQkJZGV2X2RiZygmc3BpLT5kZXYsICJ0cmFuc2ZlcjogJWQgSHosICVkICVzJXMsICVkIGJwd1xuIiwKLQkJCQkJdC0+c3BlZWRfaHosCi0JCQkJCWxlbiwKLQkJCQkJdHhfYnVmID8gInR4IiA6ICIiLAotCQkJCQlyeF9idWYgPyAicngiIDogIiIsCi0JCQkJCXQtPmJpdHNfcGVyX3dvcmQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJaWYgKHQtPnNwZWVkX2h6ICYmIHQtPnNwZWVkX2h6IDwgKE9NQVAyX01DU1BJX01BWF9GUkVRID4+IDE1KSkgewotCQkJZGV2X2RiZygmc3BpLT5kZXYsICJzcGVlZF9oeiAlZCBiZWxvdyBtaW5pbXVtICVkIEh6XG4iLAotCQkJCXQtPnNwZWVkX2h6LAotCQkJCU9NQVAyX01DU1BJX01BWF9GUkVRID4+IDE1KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKG0tPmlzX2RtYV9tYXBwZWQgfHwgbGVuIDwgRE1BX01JTl9CWVRFUykKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh0eF9idWYgIT0gTlVMTCkgewotCQkJdC0+dHhfZG1hID0gZG1hX21hcF9zaW5nbGUoJnNwaS0+ZGV2LCAodm9pZCAqKSB0eF9idWYsCi0JCQkJCWxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJnNwaS0+ZGV2LCB0LT50eF9kbWEpKSB7Ci0JCQkJZGV2X2RiZygmc3BpLT5kZXYsICJkbWEgJWNYICVkIGJ5dGVzIGVycm9yXG4iLAotCQkJCQkJJ1QnLCBsZW4pOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0JCWlmIChyeF9idWYgIT0gTlVMTCkgewotCQkJdC0+cnhfZG1hID0gZG1hX21hcF9zaW5nbGUoJnNwaS0+ZGV2LCByeF9idWYsIHQtPmxlbiwKLQkJCQkJRE1BX0ZST01fREVWSUNFKTsKLQkJCWlmIChkbWFfbWFwcGluZ19lcnJvcigmc3BpLT5kZXYsIHQtPnJ4X2RtYSkpIHsKLQkJCQlkZXZfZGJnKCZzcGktPmRldiwgImRtYSAlY1ggJWQgYnl0ZXMgZXJyb3JcbiIsCi0JCQkJCQknUicsIGxlbik7Ci0JCQkJaWYgKHR4X2J1ZiAhPSBOVUxMKQotCQkJCQlkbWFfdW5tYXBfc2luZ2xlKCZzcGktPmRldiwgdC0+dHhfZG1hLAotCQkJCQkJCWxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1jc3BpLT5sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZtY3NwaS0+bXNnX3F1ZXVlKTsKLQlxdWV1ZV93b3JrKG9tYXAyX21jc3BpX3dxLCAmbWNzcGktPndvcmspOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jc3BpLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgb21hcDJfbWNzcGlfbWFzdGVyX3NldHVwKHN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGkpCi17Ci0Jc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlciA9IG1jc3BpLT5tYXN0ZXI7Ci0JdTMyCQkJdG1wOwotCWludCByZXQgPSAwOwotCi0JcmV0ID0gb21hcDJfbWNzcGlfZW5hYmxlX2Nsb2NrcyhtY3NwaSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQl0bXAgPSBPTUFQMl9NQ1NQSV9XQUtFVVBFTkFCTEVfV0tFTjsKLQltY3NwaV93cml0ZV9yZWcobWFzdGVyLCBPTUFQMl9NQ1NQSV9XQUtFVVBFTkFCTEUsIHRtcCk7Ci0Jb21hcDJfbWNzcGlfY3R4W21hc3Rlci0+YnVzX251bSAtIDFdLndha2V1cGVuYWJsZSA9IHRtcDsKLQotCW9tYXAyX21jc3BpX3NldF9tYXN0ZXJfbW9kZShtYXN0ZXIpOwotCW9tYXAyX21jc3BpX2Rpc2FibGVfY2xvY2tzKG1jc3BpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvbWFwX21jc3BpX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOwotCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7Ci0KLQltYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlvbWFwMl9tY3NwaV9yZXN0b3JlX2N0eChtY3NwaSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IF9faW5pdCBvbWFwMl9tY3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7Ci0Jc3RydWN0IG9tYXAyX21jc3BpX3BsYXRmb3JtX2NvbmZpZyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOwotCXN0cnVjdCByZXNvdXJjZQkJKnI7Ci0JaW50CQkJc3RhdHVzID0gMCwgaTsKLQotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mICptY3NwaSk7Ci0JaWYgKG1hc3RlciA9PSBOVUxMKSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwgIm1hc3RlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLwotCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOwotCi0JaWYgKHBkZXYtPmlkICE9IC0xKQotCQltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKLQotCW1hc3Rlci0+c2V0dXAgPSBvbWFwMl9tY3NwaV9zZXR1cDsKLQltYXN0ZXItPnRyYW5zZmVyID0gb21hcDJfbWNzcGlfdHJhbnNmZXI7Ci0JbWFzdGVyLT5jbGVhbnVwID0gb21hcDJfbWNzcGlfY2xlYW51cDsKLQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcGRhdGEtPm51bV9jczsKLQotCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBtYXN0ZXIpOwotCi0JbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0JbWNzcGktPm1hc3RlciA9IG1hc3RlcjsKLQotCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmIChyID09IE5VTEwpIHsKLQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJZ290byBlcnIxOwotCX0KLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgKHItPmVuZCAtIHItPnN0YXJ0KSArIDEsCi0JCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSkpIHsKLQkJc3RhdHVzID0gLUVCVVNZOwotCQlnb3RvIGVycjE7Ci0JfQotCi0Jci0+c3RhcnQgKz0gcGRhdGEtPnJlZ3Nfb2Zmc2V0OwotCXItPmVuZCArPSBwZGF0YS0+cmVnc19vZmZzZXQ7Ci0JbWNzcGktPnBoeXMgPSByLT5zdGFydDsKLQltY3NwaS0+YmFzZSA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7Ci0JaWYgKCFtY3NwaS0+YmFzZSkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBpb3JlbWFwIE1DU1BJXG4iKTsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBlcnIyOwotCX0KLQotCW1jc3BpLT5kZXYgPSAmcGRldi0+ZGV2OwotCUlOSVRfV09SSygmbWNzcGktPndvcmssIG9tYXAyX21jc3BpX3dvcmspOwotCi0Jc3Bpbl9sb2NrX2luaXQoJm1jc3BpLT5sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmbWNzcGktPm1zZ19xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJm9tYXAyX21jc3BpX2N0eFttYXN0ZXItPmJ1c19udW0gLSAxXS5jcyk7Ci0KLQltY3NwaS0+ZG1hX2NoYW5uZWxzID0ga2NhbGxvYyhtYXN0ZXItPm51bV9jaGlwc2VsZWN0LAotCQkJc2l6ZW9mKHN0cnVjdCBvbWFwMl9tY3NwaV9kbWEpLAotCQkJR0ZQX0tFUk5FTCk7Ci0KLQlpZiAobWNzcGktPmRtYV9jaGFubmVscyA9PSBOVUxMKQotCQlnb3RvIGVycjI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5udW1fY2hpcHNlbGVjdDsgaSsrKSB7Ci0JCWNoYXIgZG1hX2NoX25hbWVbMTRdOwotCQlzdHJ1Y3QgcmVzb3VyY2UgKmRtYV9yZXM7Ci0KLQkJc3ByaW50ZihkbWFfY2hfbmFtZSwgInJ4JWQiLCBpKTsKLQkJZG1hX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9ETUEsCi0JCQkJCQkJZG1hX2NoX25hbWUpOwotCQlpZiAoIWRtYV9yZXMpIHsKLQkJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgRE1BIFJYIGNoYW5uZWxcbiIpOwotCQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJbWNzcGktPmRtYV9jaGFubmVsc1tpXS5kbWFfcnhfY2hhbm5lbCA9IC0xOwotCQltY3NwaS0+ZG1hX2NoYW5uZWxzW2ldLmRtYV9yeF9zeW5jX2RldiA9IGRtYV9yZXMtPnN0YXJ0OwotCQlzcHJpbnRmKGRtYV9jaF9uYW1lLCAidHglZCIsIGkpOwotCQlkbWFfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX0RNQSwKLQkJCQkJCQlkbWFfY2hfbmFtZSk7Ci0JCWlmICghZG1hX3JlcykgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2Fubm90IGdldCBETUEgVFggY2hhbm5lbFxuIik7Ci0JCQlzdGF0dXMgPSAtRU5PREVWOwotCQkJYnJlYWs7Ci0JCX0KLQotCQltY3NwaS0+ZG1hX2NoYW5uZWxzW2ldLmRtYV90eF9jaGFubmVsID0gLTE7Ci0JCW1jc3BpLT5kbWFfY2hhbm5lbHNbaV0uZG1hX3R4X3N5bmNfZGV2ID0gZG1hX3Jlcy0+c3RhcnQ7Ci0JfQotCi0JcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7Ci0KLQlpZiAoc3RhdHVzIHx8IG9tYXAyX21jc3BpX21hc3Rlcl9zZXR1cChtY3NwaSkgPCAwKQotCQlnb3RvIGVycjM7Ci0KLQlzdGF0dXMgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCWdvdG8gZXJyNDsKLQotCXJldHVybiBzdGF0dXM7Ci0KLWVycjQ6Ci0Jc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKLWVycjM6Ci0Ja2ZyZWUobWNzcGktPmRtYV9jaGFubmVscyk7Ci1lcnIyOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihyLT5zdGFydCwgKHItPmVuZCAtIHItPnN0YXJ0KSArIDEpOwotCWlvdW5tYXAobWNzcGktPmJhc2UpOwotZXJyMToKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCBvbWFwMl9tY3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOwotCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7Ci0Jc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqZG1hX2NoYW5uZWxzOwotCXN0cnVjdCByZXNvdXJjZQkJKnI7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwotCi0JbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwotCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCWRtYV9jaGFubmVscyA9IG1jc3BpLT5kbWFfY2hhbm5lbHM7Ci0KLQlvbWFwMl9tY3NwaV9kaXNhYmxlX2Nsb2NrcyhtY3NwaSk7Ci0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCAoci0+ZW5kIC0gci0+c3RhcnQpICsgMSk7Ci0KLQliYXNlID0gbWNzcGktPmJhc2U7Ci0Jc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7Ci0JaW91bm1hcChiYXNlKTsKLQlrZnJlZShkbWFfY2hhbm5lbHMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpvbWFwMl9tY3NwaSIpOwotCi0jaWZkZWYJQ09ORklHX1NVU1BFTkQKLS8qCi0gKiBXaGVuIFNQSSB3YWtlIHVwIGZyb20gb2ZmLW1vZGUsIENTIGlzIGluIGFjdGl2YXRlIHN0YXRlLiBJZiBpdCB3YXMgaW4KLSAqIHVuYWN0aXZlIHN0YXRlIHdoZW4gZHJpdmVyIHdhcyBzdXNwZW5kLCB0aGVuIGZvcmNlIGl0IHRvIHVuYWN0aXZlIHN0YXRlIGF0Ci0gKiB3YWtlIHVwLgotICovCi1zdGF0aWMgaW50IG9tYXAyX21jc3BpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3RydWN0IG9tYXAyX21jc3BpX2NzICpjczsKLQotCW9tYXAyX21jc3BpX2VuYWJsZV9jbG9ja3MobWNzcGkpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3MsICZvbWFwMl9tY3NwaV9jdHhbbWFzdGVyLT5idXNfbnVtIC0gMV0uY3MsCi0JCQkgICAgbm9kZSkgewotCQlpZiAoKGNzLT5jaGNvbmYwICYgT01BUDJfTUNTUElfQ0hDT05GX0ZPUkNFKSA9PSAwKSB7Ci0KLQkJCS8qCi0JCQkgKiBXZSBuZWVkIHRvIHRvZ2dsZSBDUyBzdGF0ZSBmb3IgT01BUCB0YWtlIHRoaXMKLQkJCSAqIGNoYW5nZSBpbiBhY2NvdW50LgotCQkJICovCi0JCQlNT0RfUkVHX0JJVChjcy0+Y2hjb25mMCwgT01BUDJfTUNTUElfQ0hDT05GX0ZPUkNFLCAxKTsKLQkJCV9fcmF3X3dyaXRlbChjcy0+Y2hjb25mMCwgY3MtPmJhc2UgKyBPTUFQMl9NQ1NQSV9DSENPTkYwKTsKLQkJCU1PRF9SRUdfQklUKGNzLT5jaGNvbmYwLCBPTUFQMl9NQ1NQSV9DSENPTkZfRk9SQ0UsIDApOwotCQkJX19yYXdfd3JpdGVsKGNzLT5jaGNvbmYwLCBjcy0+YmFzZSArIE9NQVAyX01DU1BJX0NIQ09ORjApOwotCQl9Ci0JfQotCW9tYXAyX21jc3BpX2Rpc2FibGVfY2xvY2tzKG1jc3BpKTsKLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lCW9tYXAyX21jc3BpX3Jlc3VtZQlOVUxMCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIG9tYXAyX21jc3BpX3BtX29wcyA9IHsKLQkucmVzdW1lID0gb21hcDJfbWNzcGlfcmVzdW1lLAotCS5ydW50aW1lX3Jlc3VtZQk9IG9tYXBfbWNzcGlfcnVudGltZV9yZXN1bWUsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwMl9tY3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPQkJIm9tYXAyX21jc3BpIiwKLQkJLm93bmVyID0JVEhJU19NT0RVTEUsCi0JCS5wbSA9CQkmb21hcDJfbWNzcGlfcG1fb3BzCi0JfSwKLQkucmVtb3ZlID0JX19leGl0X3Aob21hcDJfbWNzcGlfcmVtb3ZlKSwKLX07Ci0KLQotc3RhdGljIGludCBfX2luaXQgb21hcDJfbWNzcGlfaW5pdCh2b2lkKQotewotCW9tYXAyX21jc3BpX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCi0JCQkJb21hcDJfbWNzcGlfZHJpdmVyLmRyaXZlci5uYW1lKTsKLQlpZiAob21hcDJfbWNzcGlfd3EgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm9tYXAyX21jc3BpX2RyaXZlciwgb21hcDJfbWNzcGlfcHJvYmUpOwotfQotc3Vic3lzX2luaXRjYWxsKG9tYXAyX21jc3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgb21hcDJfbWNzcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvbWFwMl9tY3NwaV9kcml2ZXIpOwotCi0JZGVzdHJveV93b3JrcXVldWUob21hcDJfbWNzcGlfd3EpOwotfQotbW9kdWxlX2V4aXQob21hcDJfbWNzcGlfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL29tYXBfdXdpcmUuYyBiL2RyaXZlcnMvc3BpL29tYXBfdXdpcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwZDMyNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NwaS9vbWFwX3V3aXJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotLyoKLSAqIG9tYXBfdXdpcmUuYyAtLSBNaWNyb1dpcmUgaW50ZXJmYWNlIGRyaXZlciBmb3IgT01BUAotICoKLSAqIENvcHlyaWdodCAyMDAzIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0gKgotICogUG9ydGVkIHRvIDIuNiBPTUFQIHV3aXJlIGludGVyZmFjZS4KLSAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cy4KLSAqCi0gKiBHZW5lcmFsaXphdGlvbiBwYXRjaGVzIGJ5IEp1aGEgWXJqb2xhIDxqdWhhLnlyam9sYUBub2tpYS5jb20+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIEJyb3duZWxsIChwb3J0ZWQgdG8gMi42IFNQSSBpbnRlcmZhY2UpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgTm9raWEKLSAqCi0gKiBNYW55IHVwZGF0ZXMgYnkgSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L211eC5oPgotI2luY2x1ZGUgPHBsYXQvb21hcDd4eC5oPgkvKiBPTUFQN1hYX0lPX0NPTkYgcmVnaXN0ZXJzICovCi0KLQotLyogRklYTUUgYWRkcmVzcyBpcyBub3cgYSBwbGF0Zm9ybSBkZXZpY2UgcmVzb3VyY2UsCi0gKiBhbmQgaXJxcyBzaG91bGQgc2hvdyB0aGVyZSB0b28uLi4KLSAqLwotI2RlZmluZSBVV0lSRV9CQVNFX1BIWVMJCTB4RkZGQjMwMDAKLQotLyogdVdpcmUgUmVnaXN0ZXJzOiAqLwotI2RlZmluZSBVV0lSRV9JT19TSVpFIDB4MjAKLSNkZWZpbmUgVVdJUkVfVERSICAgICAweDAwCi0jZGVmaW5lIFVXSVJFX1JEUiAgICAgMHgwMAotI2RlZmluZSBVV0lSRV9DU1IgICAgIDB4MDEKLSNkZWZpbmUgVVdJUkVfU1IxICAgICAweDAyCi0jZGVmaW5lIFVXSVJFX1NSMiAgICAgMHgwMwotI2RlZmluZSBVV0lSRV9TUjMgICAgIDB4MDQKLSNkZWZpbmUgVVdJUkVfU1I0ICAgICAweDA1Ci0jZGVmaW5lIFVXSVJFX1NSNSAgICAgMHgwNgotCi0vKiBDU1IgYml0cyAqLwotI2RlZmluZQlSRFJCCSgxIDw8IDE1KQotI2RlZmluZQlDU1JCCSgxIDw8IDE0KQotI2RlZmluZQlTVEFSVAkoMSA8PCAxMykKLSNkZWZpbmUJQ1NfQ01ECSgxIDw8IDEyKQotCi0vKiBTUjEgb3IgU1IyIGJpdHMgKi8KLSNkZWZpbmUgVVdJUkVfUkVBRF9GQUxMSU5HX0VER0UJCTB4MDAwMQotI2RlZmluZSBVV0lSRV9SRUFEX1JJU0lOR19FREdFCQkweDAwMDAKLSNkZWZpbmUgVVdJUkVfV1JJVEVfRkFMTElOR19FREdFCTB4MDAwMAotI2RlZmluZSBVV0lSRV9XUklURV9SSVNJTkdfRURHRQkJMHgwMDAyCi0jZGVmaW5lIFVXSVJFX0NTX0FDVElWRV9MT1cJCTB4MDAwMAotI2RlZmluZSBVV0lSRV9DU19BQ1RJVkVfSElHSAkJMHgwMDA0Ci0jZGVmaW5lIFVXSVJFX0ZSRVFfRElWXzIJCTB4MDAwMAotI2RlZmluZSBVV0lSRV9GUkVRX0RJVl80CQkweDAwMDgKLSNkZWZpbmUgVVdJUkVfRlJFUV9ESVZfOAkJMHgwMDEwCi0jZGVmaW5lIFVXSVJFX0NIS19SRUFEWQkJCTB4MDAyMAotI2RlZmluZSBVV0lSRV9DTEtfSU5WRVJURUQJCTB4MDA0MAotCi0KLXN0cnVjdCB1d2lyZV9zcGkgewotCXN0cnVjdCBzcGlfYml0YmFuZwliaXRiYW5nOwotCXN0cnVjdCBjbGsJCSpjazsKLX07Ci0KLXN0cnVjdCB1d2lyZV9zdGF0ZSB7Ci0JdW5zaWduZWQJYml0c19wZXJfd29yZDsKLQl1bnNpZ25lZAlkaXYxX2lkeDsKLX07Ci0KLS8qIFJFVklTSVQgY29tcGlsZSB0aW1lIGNvbnN0YW50IGZvciBpZHhfc2hpZnQ/ICovCi0vKgotICogT3IsIHB1dCBpdCBpbiBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGRyaXZlcjsKLSAqIHRoYXQgYXZvaWRzIGhhdmluZyB0byBpc3N1ZSB0d28gbG9hZHMgZm9yIGVhY2ggYml0IG9mIHN0YXRpYyBkYXRhLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHV3aXJlX2lkeF9zaGlmdDsKLXN0YXRpYyB2b2lkIF9faW9tZW0gKnV3aXJlX2Jhc2U7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1d2lyZV93cml0ZV9yZWcoaW50IGlkeCwgdTE2IHZhbCkKLXsKLQlfX3Jhd193cml0ZXcodmFsLCB1d2lyZV9iYXNlICsgKGlkeCA8PCB1d2lyZV9pZHhfc2hpZnQpKTsKLX0KLQotc3RhdGljIGlubGluZSB1MTYgdXdpcmVfcmVhZF9yZWcoaW50IGlkeCkKLXsKLQlyZXR1cm4gX19yYXdfcmVhZHcodXdpcmVfYmFzZSArIChpZHggPDwgdXdpcmVfaWR4X3NoaWZ0KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3V3aXJlX2NvbmZpZ3VyZV9tb2RlKHU4IGNzLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXUxNgl3LCB2YWwgPSAwOwotCWludAlzaGlmdCwgcmVnOwotCi0JaWYgKGZsYWdzICYgVVdJUkVfQ0xLX0lOVkVSVEVEKQotCQl2YWwgXj0gMHgwMzsKLQl2YWwgPSBmbGFncyAmIDB4M2Y7Ci0JaWYgKGNzICYgMSkKLQkJc2hpZnQgPSA2OwotCWVsc2UKLQkJc2hpZnQgPSAwOwotCWlmIChjcyA8PSAxKQotCQlyZWcgPSBVV0lSRV9TUjE7Ci0JZWxzZQotCQlyZWcgPSBVV0lSRV9TUjI7Ci0KLQl3ID0gdXdpcmVfcmVhZF9yZWcocmVnKTsKLQl3ICY9IH4oMHgzZiA8PCBzaGlmdCk7Ci0JdyB8PSB2YWwgPDwgc2hpZnQ7Ci0JdXdpcmVfd3JpdGVfcmVnKHJlZywgdyk7Ci19Ci0KLXN0YXRpYyBpbnQgd2FpdF91d2lyZV9jc3JfZmxhZyh1MTYgbWFzaywgdTE2IHZhbCwgaW50IG1pZ2h0X25vdF9jYXRjaCkKLXsKLQl1MTYgdzsKLQlpbnQgYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBtYXhfamlmZmllcyA9IGppZmZpZXMgKyBIWjsKLQotCWZvciAoOzspIHsKLQkJdyA9IHV3aXJlX3JlYWRfcmVnKFVXSVJFX0NTUik7Ci0JCWlmICgodyAmIG1hc2spID09IHZhbCkKLQkJCWJyZWFrOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBtYXhfamlmZmllcykpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRpbWVvdXQuIHJlZz0lIzA2eCAiCi0JCQkJCSJtYXNrPSUjMDZ4IHZhbD0lIzA2eFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgdywgbWFzaywgdmFsKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQljKys7Ci0JCWlmIChtaWdodF9ub3RfY2F0Y2ggJiYgYyA+IDY0KQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB1d2lyZV9zZXRfY2xrMV9kaXYoaW50IGRpdjFfaWR4KQotewotCXUxNiB3OwotCi0JdyA9IHV3aXJlX3JlYWRfcmVnKFVXSVJFX1NSMyk7Ci0JdyAmPSB+KDB4MDMgPDwgMSk7Ci0JdyB8PSBkaXYxX2lkeCA8PCAxOwotCXV3aXJlX3dyaXRlX3JlZyhVV0lSRV9TUjMsIHcpOwotfQotCi1zdGF0aWMgdm9pZCB1d2lyZV9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QJdXdpcmVfc3RhdGUgKnVzdCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQl1MTYJdzsKLQlpbnQJb2xkX2NzOwotCi0KLQlCVUdfT04od2FpdF91d2lyZV9jc3JfZmxhZyhDU1JCLCAwLCAwKSk7Ci0KLQl3ID0gdXdpcmVfcmVhZF9yZWcoVVdJUkVfQ1NSKTsKLQlvbGRfY3MgPSAodyA+PiAxMCkgJiAweDAzOwotCWlmICh2YWx1ZSA9PSBCSVRCQU5HX0NTX0lOQUNUSVZFIHx8IG9sZF9jcyAhPSBzcGktPmNoaXBfc2VsZWN0KSB7Ci0JCS8qIERlc2VsZWN0IHRoaXMgQ1MsIG9yIHRoZSBwcmV2aW91cyBDUyAqLwotCQl3ICY9IH5DU19DTUQ7Ci0JCXV3aXJlX3dyaXRlX3JlZyhVV0lSRV9DU1IsIHcpOwotCX0KLQkvKiBhY3RpdmF0ZSBzcGVjZmllZCBjaGlwc2VsZWN0ICovCi0JaWYgKHZhbHVlID09IEJJVEJBTkdfQ1NfQUNUSVZFKSB7Ci0JCXV3aXJlX3NldF9jbGsxX2Rpdih1c3QtPmRpdjFfaWR4KTsKLQkJLyogaW52ZXJ0IGNsb2NrPyAqLwotCQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCi0JCQl1d2lyZV93cml0ZV9yZWcoVVdJUkVfU1I0LCAxKTsKLQkJZWxzZQotCQkJdXdpcmVfd3JpdGVfcmVnKFVXSVJFX1NSNCwgMCk7Ci0KLQkJdyA9IHNwaS0+Y2hpcF9zZWxlY3QgPDwgMTA7Ci0JCXcgfD0gQ1NfQ01EOwotCQl1d2lyZV93cml0ZV9yZWcoVVdJUkVfQ1NSLCB3KTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdXdpcmVfdHhyeChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXN0cnVjdCB1d2lyZV9zdGF0ZSAqdXN0ID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCXVuc2lnbmVkCWxlbiA9IHQtPmxlbjsKLQl1bnNpZ25lZAliaXRzID0gdXN0LT5iaXRzX3Blcl93b3JkOwotCXVuc2lnbmVkCWJ5dGVzOwotCXUxNgkJdmFsLCB3OwotCWludAkJc3RhdHVzID0gMDsKLQotCWlmICghdC0+dHhfYnVmICYmICF0LT5yeF9idWYpCi0JCXJldHVybiAwOwotCi0JLyogTWljcm93aXJlIGRvZXNuJ3QgcmVhZCBhbmQgd3JpdGUgY29uY3VycmVudGx5ICovCi0JaWYgKHQtPnR4X2J1ZiAmJiB0LT5yeF9idWYpCi0JCXJldHVybiAtRVBFUk07Ci0KLQl3ID0gc3BpLT5jaGlwX3NlbGVjdCA8PCAxMDsKLQl3IHw9IENTX0NNRDsKLQotCWlmICh0LT50eF9idWYpIHsKLQkJY29uc3QgdTgJKmJ1ZiA9IHQtPnR4X2J1ZjsKLQotCQkvKiBOT1RFOiAgRE1BIGNvdWxkIGJlIHVzZWQgZm9yIFRYIHRyYW5zZmVycyAqLwotCi0JCS8qIHdyaXRlIG9uZSBvciB0d28gYnl0ZXMgYXQgYSB0aW1lICovCi0JCXdoaWxlIChsZW4gPj0gMSkgewotCQkJLyogdHggYml0IDE1IGlzIGZpcnN0IHNlbnQ7IHdlIGJ5dGVzd2FwIG11bHRpYnl0ZSB3b3JkcwotCQkJICogKG1zYi1maXJzdCkgb24gdGhlIHdheSBvdXQgZnJvbSBtZW1vcnkuCi0JCQkgKi8KLQkJCXZhbCA9ICpidWYrKzsKLQkJCWlmIChiaXRzID4gOCkgewotCQkJCWJ5dGVzID0gMjsKLQkJCQl2YWwgfD0gKmJ1ZisrIDw8IDg7Ci0JCQl9IGVsc2UKLQkJCQlieXRlcyA9IDE7Ci0JCQl2YWwgPDw9IDE2IC0gYml0czsKLQotI2lmZGVmCVZFUkJPU0UKLQkJCXByX2RlYnVnKCIlczogd3JpdGUtJWQgPSUwNHhcbiIsCi0JCQkJCWRldl9uYW1lKCZzcGktPmRldiksIGJpdHMsIHZhbCk7Ci0jZW5kaWYKLQkJCWlmICh3YWl0X3V3aXJlX2Nzcl9mbGFnKENTUkIsIDAsIDApKQotCQkJCWdvdG8gZWlvOwotCi0JCQl1d2lyZV93cml0ZV9yZWcoVVdJUkVfVERSLCB2YWwpOwotCi0JCQkvKiBzdGFydCB3cml0ZSAqLwotCQkJdmFsID0gU1RBUlQgfCB3IHwgKGJpdHMgPDwgNSk7Ci0KLQkJCXV3aXJlX3dyaXRlX3JlZyhVV0lSRV9DU1IsIHZhbCk7Ci0JCQlsZW4gLT0gYnl0ZXM7Ci0KLQkJCS8qIFdhaXQgdGlsbCB3cml0ZSBhY3R1YWxseSBzdGFydHMuCi0JCQkgKiBUaGlzIGlzIG5lZWRlZCB3aXRoIE1QVSBjbG9jayA2MCsgTUh6LgotCQkJICogUkVWSVNJVDogd2UgbWF5IG5vdCBoYXZlIHRpbWUgdG8gY2F0Y2ggaXQuLi4KLQkJCSAqLwotCQkJaWYgKHdhaXRfdXdpcmVfY3NyX2ZsYWcoQ1NSQiwgQ1NSQiwgMSkpCi0JCQkJZ290byBlaW87Ci0KLQkJCXN0YXR1cyArPSBieXRlczsKLQkJfQotCi0JCS8qIFJFVklTSVQ6ICBzYXZlIHRoaXMgZm9yIGxhdGVyIHRvIGdldCBtb3JlIGkvbyBvdmVybGFwICovCi0JCWlmICh3YWl0X3V3aXJlX2Nzcl9mbGFnKENTUkIsIDAsIDApKQotCQkJZ290byBlaW87Ci0KLQl9IGVsc2UgaWYgKHQtPnJ4X2J1ZikgewotCQl1OAkJKmJ1ZiA9IHQtPnJ4X2J1ZjsKLQotCQkvKiByZWFkIG9uZSBvciB0d28gYnl0ZXMgYXQgYSB0aW1lICovCi0JCXdoaWxlIChsZW4pIHsKLQkJCWlmIChiaXRzID4gOCkgewotCQkJCWJ5dGVzID0gMjsKLQkJCX0gZWxzZQotCQkJCWJ5dGVzID0gMTsKLQotCQkJLyogc3RhcnQgcmVhZCAqLwotCQkJdmFsID0gU1RBUlQgfCB3IHwgKGJpdHMgPDwgMCk7Ci0JCQl1d2lyZV93cml0ZV9yZWcoVVdJUkVfQ1NSLCB2YWwpOwotCQkJbGVuIC09IGJ5dGVzOwotCi0JCQkvKiBXYWl0IHRpbGwgcmVhZCBhY3R1YWxseSBzdGFydHMgKi8KLQkJCSh2b2lkKSB3YWl0X3V3aXJlX2Nzcl9mbGFnKENTUkIsIENTUkIsIDEpOwotCi0JCQlpZiAod2FpdF91d2lyZV9jc3JfZmxhZyhSRFJCIHwgQ1NSQiwKLQkJCQkJCVJEUkIsIDApKQotCQkJCWdvdG8gZWlvOwotCi0JCQkvKiByeCBiaXQgMCBpcyBsYXN0IHJlY2VpdmVkOyBtdWx0aWJ5dGUgd29yZHMgd2lsbAotCQkJICogYmUgcHJvcGVybHkgYnl0ZXN3YXBwZWQgb24gdGhlIHdheSB0byBtZW1vcnkuCi0JCQkgKi8KLQkJCXZhbCA9IHV3aXJlX3JlYWRfcmVnKFVXSVJFX1JEUik7Ci0JCQl2YWwgJj0gKDEgPDwgYml0cykgLSAxOwotCQkJKmJ1ZisrID0gKHU4KSB2YWw7Ci0JCQlpZiAoYnl0ZXMgPT0gMikKLQkJCQkqYnVmKysgPSB2YWwgPj4gODsKLQkJCXN0YXR1cyArPSBieXRlczsKLSNpZmRlZglWRVJCT1NFCi0JCQlwcl9kZWJ1ZygiJXM6IHJlYWQtJWQgPSUwNHhcbiIsCi0JCQkJCWRldl9uYW1lKCZzcGktPmRldiksIGJpdHMsIHZhbCk7Ci0jZW5kaWYKLQotCQl9Ci0JfQotCXJldHVybiBzdGF0dXM7Ci1laW86Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLXN0YXRpYyBpbnQgdXdpcmVfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlzdHJ1Y3QgdXdpcmVfc3RhdGUJKnVzdCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQlzdHJ1Y3QgdXdpcmVfc3BpCSp1d2lyZTsKLQl1bnNpZ25lZAkJZmxhZ3MgPSAwOwotCXVuc2lnbmVkCQliaXRzOwotCXVuc2lnbmVkCQloejsKLQl1bnNpZ25lZCBsb25nCQlyYXRlOwotCWludAkJCWRpdjFfaWR4OwotCWludAkJCWRpdjE7Ci0JaW50CQkJZGl2MjsKLQlpbnQJCQlzdGF0dXM7Ci0KLQl1d2lyZSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JaWYgKHNwaS0+Y2hpcF9zZWxlY3QgPiAzKSB7Ci0JCXByX2RlYnVnKCIlczogY3MlZD9cbiIsIGRldl9uYW1lKCZzcGktPmRldiksIHNwaS0+Y2hpcF9zZWxlY3QpOwotCQlzdGF0dXMgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYml0cyA9IHNwaS0+Yml0c19wZXJfd29yZDsKLQlpZiAodCAhPSBOVUxMICYmIHQtPmJpdHNfcGVyX3dvcmQpCi0JCWJpdHMgPSB0LT5iaXRzX3Blcl93b3JkOwotCi0JaWYgKGJpdHMgPiAxNikgewotCQlwcl9kZWJ1ZygiJXM6IHdvcmRzaXplICVkP1xuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSwgYml0cyk7Ci0JCXN0YXR1cyA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JdXN0LT5iaXRzX3Blcl93b3JkID0gYml0czsKLQotCS8qIG1vZGUgMC4uMywgY2xvY2sgaW52ZXJ0ZWQgc2VwYXJhdGVseTsKLQkgKiBzdGFuZGFyZCBuQ1Mgc2lnbmFsaW5nOwotCSAqIGRvbid0IHRyZWF0IERJPWhpZ2ggYXMgIm5vdCByZWFkeSIKLQkgKi8KLQlpZiAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpCi0JCWZsYWdzIHw9IFVXSVJFX0NTX0FDVElWRV9ISUdIOwotCi0JaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQotCQlmbGFncyB8PSBVV0lSRV9DTEtfSU5WRVJURUQ7Ci0KLQlzd2l0Y2ggKHNwaS0+bW9kZSAmIChTUElfQ1BPTCB8IFNQSV9DUEhBKSkgewotCWNhc2UgU1BJX01PREVfMDoKLQljYXNlIFNQSV9NT0RFXzM6Ci0JCWZsYWdzIHw9IFVXSVJFX1dSSVRFX0ZBTExJTkdfRURHRSB8IFVXSVJFX1JFQURfUklTSU5HX0VER0U7Ci0JCWJyZWFrOwotCWNhc2UgU1BJX01PREVfMToKLQljYXNlIFNQSV9NT0RFXzI6Ci0JCWZsYWdzIHw9IFVXSVJFX1dSSVRFX1JJU0lOR19FREdFIHwgVVdJUkVfUkVBRF9GQUxMSU5HX0VER0U7Ci0JCWJyZWFrOwotCX0KLQotCS8qIGFzc3VtZSBpdCdzIGFscmVhZHkgZW5hYmxlZCAqLwotCXJhdGUgPSBjbGtfZ2V0X3JhdGUodXdpcmUtPmNrKTsKLQotCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0JaWYgKHQgIT0gTlVMTCAmJiB0LT5zcGVlZF9oeikKLQkJaHogPSB0LT5zcGVlZF9oejsKLQotCWlmICghaHopIHsKLQkJcHJfZGVidWcoIiVzOiB6ZXJvIHNwZWVkP1xuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSk7Ci0JCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBGX0lOVCA9IG1wdV94b3JfY2xrIC8gRElWMSAqLwotCWZvciAoZGl2MV9pZHggPSAwOyBkaXYxX2lkeCA8IDQ7IGRpdjFfaWR4KyspIHsKLQkJc3dpdGNoIChkaXYxX2lkeCkgewotCQljYXNlIDA6Ci0JCQlkaXYxID0gMjsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlkaXYxID0gNDsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlkaXYxID0gNzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQljYXNlIDM6Ci0JCQlkaXYxID0gMTA7Ci0JCQlicmVhazsKLQkJfQotCQlkaXYyID0gKHJhdGUgLyBkaXYxICsgaHogLSAxKSAvIGh6OwotCQlpZiAoZGl2MiA8PSA4KQotCQkJYnJlYWs7Ci0JfQotCWlmIChkaXYxX2lkeCA9PSA0KSB7Ci0JCXByX2RlYnVnKCIlczogbG93ZXN0IGNsb2NrICVsZCwgbmVlZCAlZFxuIiwKLQkJCWRldl9uYW1lKCZzcGktPmRldiksIHJhdGUgLyAxMCAvIDgsIGh6KTsKLQkJc3RhdHVzID0gLUVET007Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiB3ZSBoYXZlIHRvIGNhY2hlIHRoaXMgYW5kIHJlc2V0IGluIHV3aXJlX2NoaXBzZWxlY3QgYXMgdGhpcyBpcyBhCi0JICogZ2xvYmFsIHBhcmFtZXRlciBhbmQgYW5vdGhlciB1d2lyZSBkZXZpY2UgY2FuIGNoYW5nZSBpdCB1bmRlcgotCSAqIHVzICovCi0JdXN0LT5kaXYxX2lkeCA9IGRpdjFfaWR4OwotCXV3aXJlX3NldF9jbGsxX2RpdihkaXYxX2lkeCk7Ci0KLQlyYXRlIC89IGRpdjE7Ci0KLQlzd2l0Y2ggKGRpdjIpIHsKLQljYXNlIDA6Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJZmxhZ3MgfD0gVVdJUkVfRlJFUV9ESVZfMjsKLQkJcmF0ZSAvPSAyOwotCQlicmVhazsKLQljYXNlIDM6Ci0JY2FzZSA0OgotCQlmbGFncyB8PSBVV0lSRV9GUkVRX0RJVl80OwotCQlyYXRlIC89IDQ7Ci0JCWJyZWFrOwotCWNhc2UgNToKLQljYXNlIDY6Ci0JY2FzZSA3OgotCWNhc2UgODoKLQkJZmxhZ3MgfD0gVVdJUkVfRlJFUV9ESVZfODsKLQkJcmF0ZSAvPSA4OwotCQlicmVhazsKLQl9Ci0Jb21hcF91d2lyZV9jb25maWd1cmVfbW9kZShzcGktPmNoaXBfc2VsZWN0LCBmbGFncyk7Ci0JcHJfZGVidWcoIiVzOiB1d2lyZSBmbGFncyAlMDJ4LCBhcm14b3IgJWx1IEtIeiwgU0NLICVsdSBLSHpcbiIsCi0JCQlfX2Z1bmNfXywgZmxhZ3MsCi0JCQljbGtfZ2V0X3JhdGUodXdpcmUtPmNrKSAvIDEwMDAsCi0JCQlyYXRlIC8gMTAwMCk7Ci0Jc3RhdHVzID0gMDsKLWRvbmU6Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCB1d2lyZV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCB1d2lyZV9zdGF0ZSAqdXN0ID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCi0JaWYgKHVzdCA9PSBOVUxMKSB7Ci0JCXVzdCA9IGt6YWxsb2Moc2l6ZW9mKCp1c3QpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHVzdCA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IHVzdDsKLQl9Ci0KLQlyZXR1cm4gdXdpcmVfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgdXdpcmVfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCWtmcmVlKHNwaS0+Y29udHJvbGxlcl9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHV3aXJlX29mZihzdHJ1Y3QgdXdpcmVfc3BpICp1d2lyZSkKLXsKLQl1d2lyZV93cml0ZV9yZWcoVVdJUkVfU1IzLCAwKTsKLQljbGtfZGlzYWJsZSh1d2lyZS0+Y2spOwotCWNsa19wdXQodXdpcmUtPmNrKTsKLQlzcGlfbWFzdGVyX3B1dCh1d2lyZS0+Yml0YmFuZy5tYXN0ZXIpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCB1d2lyZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7Ci0Jc3RydWN0IHV3aXJlX3NwaQkqdXdpcmU7Ci0JaW50CQkJc3RhdHVzOwotCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YgKnV3aXJlKTsKLQlpZiAoIW1hc3RlcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl1d2lyZSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQotCXV3aXJlX2Jhc2UgPSBpb3JlbWFwKFVXSVJFX0JBU0VfUEhZUywgVVdJUkVfSU9fU0laRSk7Ci0JaWYgKCF1d2lyZV9iYXNlKSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbid0IGlvcmVtYXAgVVdJUkVcbiIpOwotCQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgdXdpcmUpOwotCi0JdXdpcmUtPmNrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiZmNrIik7Ci0JaWYgKElTX0VSUih1d2lyZS0+Y2spKSB7Ci0JCXN0YXR1cyA9IFBUUl9FUlIodXdpcmUtPmNrKTsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAibm8gZnVuY3Rpb25hbCBjbG9jaz9cbiIpOwotCQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQljbGtfZW5hYmxlKHV3aXJlLT5jayk7Ci0KLQlpZiAoY3B1X2lzX29tYXA3eHgoKSkKLQkJdXdpcmVfaWR4X3NoaWZ0ID0gMTsKLQllbHNlCi0JCXV3aXJlX2lkeF9zaGlmdCA9IDI7Ci0KLQl1d2lyZV93cml0ZV9yZWcoVVdJUkVfU1IzLCAxKTsKLQotCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLwotCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOwotCi0JbWFzdGVyLT5mbGFncyA9IFNQSV9NQVNURVJfSEFMRl9EVVBMRVg7Ci0KLQltYXN0ZXItPmJ1c19udW0gPSAyOwkvKiAib2ZmaWNpYWwiICovCi0JbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDQ7Ci0JbWFzdGVyLT5zZXR1cCA9IHV3aXJlX3NldHVwOwotCW1hc3Rlci0+Y2xlYW51cCA9IHV3aXJlX2NsZWFudXA7Ci0KLQl1d2lyZS0+Yml0YmFuZy5tYXN0ZXIgPSBtYXN0ZXI7Ci0JdXdpcmUtPmJpdGJhbmcuY2hpcHNlbGVjdCA9IHV3aXJlX2NoaXBzZWxlY3Q7Ci0JdXdpcmUtPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSB1d2lyZV9zZXR1cF90cmFuc2ZlcjsKLQl1d2lyZS0+Yml0YmFuZy50eHJ4X2J1ZnMgPSB1d2lyZV90eHJ4OwotCi0Jc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RhcnQoJnV3aXJlLT5iaXRiYW5nKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQl1d2lyZV9vZmYodXdpcmUpOwotCQlpb3VubWFwKHV3aXJlX2Jhc2UpOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCB1d2lyZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgdXdpcmVfc3BpCSp1d2lyZSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQlpbnQJCQlzdGF0dXM7Ci0KLQkvLyBGSVhNRSByZW1vdmUgYWxsIGNoaWxkIGRldmljZXMsIHNvbWV3aGVyZSAuLi4KLQotCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3N0b3AoJnV3aXJlLT5iaXRiYW5nKTsKLQl1d2lyZV9vZmYodXdpcmUpOwotCWlvdW5tYXAodXdpcmVfYmFzZSk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCi1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOm9tYXBfdXdpcmUiKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdXdpcmVfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCQk9ICJvbWFwX3V3aXJlIiwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCX0sCi0JLnJlbW92ZQkJPSBfX2V4aXRfcCh1d2lyZV9yZW1vdmUpLAotCS8vIHN1c3BlbmQgLi4uIHVudXNlIGNrCi0JLy8gcmVzdW1lIC4uLiB1c2UgY2sKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9tYXBfdXdpcmVfaW5pdCh2b2lkKQotewotCS8qIEZJWE1FIG1vdmUgdGhlc2UgaW50byB0aGUgcmVsZXZhbnQgYm9hcmQgaW5pdCBjb2RlLiBhbHNvLCBpbmNsdWRlCi0JICogSDMgc3VwcG9ydDsgaXQgdXNlcyB0c2MyMTAxIGxpa2UgSDIgKG9uIGEgZGlmZmVyZW50IGNoaXBzZWxlY3QpLgotCSAqLwotCi0JaWYgKG1hY2hpbmVfaXNfb21hcF9oMigpKSB7Ci0JCS8qIGRlZmF1bHRzOiBXMjEgU0RPLCBVMTggU0RJLCBWMTkgU0NMICovCi0JCW9tYXBfY2ZnX3JlZyhOMTRfMTYxMF9VV0lSRV9DUzApOwotCQlvbWFwX2NmZ19yZWcoTjE1XzE2MTBfVVdJUkVfQ1MxKTsKLQl9Ci0JaWYgKG1hY2hpbmVfaXNfb21hcF9wZXJzZXVzMigpKSB7Ci0JCS8qIGNvbmZpZ3VyZSBwaW5zOiBNUFVfVVdfblNDUzEsIE1QVV9VV19TRE8sIE1QVV9VV19TQ0xLICovCi0JCWludCB2YWwgPSBvbWFwX3JlYWRsKE9NQVA3WFhfSU9fQ09ORl85KSAmIH4weDAwRUVFMDAwOwotCQlvbWFwX3dyaXRlbCh2YWwgfCAweDAwQUFBMDAwLCBPTUFQN1hYX0lPX0NPTkZfOSk7Ci0JfQotCi0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmdXdpcmVfZHJpdmVyLCB1d2lyZV9wcm9iZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBvbWFwX3V3aXJlX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdXdpcmVfZHJpdmVyKTsKLX0KLQotc3Vic3lzX2luaXRjYWxsKG9tYXBfdXdpcmVfaW5pdCk7Ci1tb2R1bGVfZXhpdChvbWFwX3V3aXJlX2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL29yaW9uX3NwaS5jIGIvZHJpdmVycy9zcGkvb3Jpb25fc3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjc3ZGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvb3Jpb25fc3BpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzMgKzAsMCBAQAotLyoKLSAqIG9yaW9uX3NwaS5jIC0tIE1hcnZlbGwgT3Jpb24gU1BJIGNvbnRyb2xsZXIgZHJpdmVyCi0gKgotICogQXV0aG9yOiBTaGFkaSBBbW1vdXJpIDxzaGFkaUBtYXJ2ZWxsLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IE1hcnZlbGwgTHRkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9vcmlvbl9zcGkuaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0KLSNkZWZpbmUgRFJJVkVSX05BTUUJCQkib3Jpb25fc3BpIgotCi0jZGVmaW5lIE9SSU9OX05VTV9DSElQU0VMRUNUUwkJMSAvKiBvbmx5IG9uZSBzbGF2ZSBpcyBzdXBwb3J0ZWQqLwotI2RlZmluZSBPUklPTl9TUElfV0FJVF9SRFlfTUFYX0xPT1AJMjAwMCAvKiBpbiB1c2VjICovCi0KLSNkZWZpbmUgT1JJT05fU1BJX0lGX0NUUkxfUkVHCQkweDAwCi0jZGVmaW5lIE9SSU9OX1NQSV9JRl9DT05GSUdfUkVHCQkweDA0Ci0jZGVmaW5lIE9SSU9OX1NQSV9EQVRBX09VVF9SRUcJCTB4MDgKLSNkZWZpbmUgT1JJT05fU1BJX0RBVEFfSU5fUkVHCQkweDBjCi0jZGVmaW5lIE9SSU9OX1NQSV9JTlRfQ0FVU0VfUkVHCQkweDEwCi0KLSNkZWZpbmUgT1JJT05fU1BJX0lGXzhfMTZfQklUX01PREUJKDEgPDwgNSkKLSNkZWZpbmUgT1JJT05fU1BJX0NMS19QUkVTQ0FMRV9NQVNLCTB4MUYKLQotc3RydWN0IG9yaW9uX3NwaSB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CXdvcms7Ci0KLQkvKiBMb2NrIGFjY2VzcyB0byB0cmFuc2ZlciBsaXN0LgkqLwotCXNwaW5sb2NrX3QJCWxvY2s7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkCW1zZ19xdWV1ZTsKLQlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOwotCXZvaWQgX19pb21lbQkJKmJhc2U7Ci0JdW5zaWduZWQgaW50CQltYXhfc3BlZWQ7Ci0JdW5zaWduZWQgaW50CQltaW5fc3BlZWQ7Ci0Jc3RydWN0IG9yaW9uX3NwaV9pbmZvCSpzcGlfaW5mbzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqb3Jpb25fc3BpX3dxOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqc3BpX3JlZyhzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGksIHUzMiByZWcpCi17Ci0JcmV0dXJuIG9yaW9uX3NwaS0+YmFzZSArIHJlZzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1vcmlvbl9zcGlfc2V0Yml0cyhzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGksIHUzMiByZWcsIHUzMiBtYXNrKQotewotCXZvaWQgX19pb21lbSAqcmVnX2FkZHIgPSBzcGlfcmVnKG9yaW9uX3NwaSwgcmVnKTsKLQl1MzIgdmFsOwotCi0JdmFsID0gcmVhZGwocmVnX2FkZHIpOwotCXZhbCB8PSBtYXNrOwotCXdyaXRlbCh2YWwsIHJlZ19hZGRyKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1vcmlvbl9zcGlfY2xyYml0cyhzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGksIHUzMiByZWcsIHUzMiBtYXNrKQotewotCXZvaWQgX19pb21lbSAqcmVnX2FkZHIgPSBzcGlfcmVnKG9yaW9uX3NwaSwgcmVnKTsKLQl1MzIgdmFsOwotCi0JdmFsID0gcmVhZGwocmVnX2FkZHIpOwotCXZhbCAmPSB+bWFzazsKLQl3cml0ZWwodmFsLCByZWdfYWRkcik7Ci19Ci0KLXN0YXRpYyBpbnQgb3Jpb25fc3BpX3NldF90cmFuc2Zlcl9zaXplKHN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaSwgaW50IHNpemUpCi17Ci0JaWYgKHNpemUgPT0gMTYpIHsKLQkJb3Jpb25fc3BpX3NldGJpdHMob3Jpb25fc3BpLCBPUklPTl9TUElfSUZfQ09ORklHX1JFRywKLQkJCQkgIE9SSU9OX1NQSV9JRl84XzE2X0JJVF9NT0RFKTsKLQl9IGVsc2UgaWYgKHNpemUgPT0gOCkgewotCQlvcmlvbl9zcGlfY2xyYml0cyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JRl9DT05GSUdfUkVHLAotCQkJCSAgT1JJT05fU1BJX0lGXzhfMTZfQklUX01PREUpOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJCYWQgYml0cyBwZXIgd29yZCB2YWx1ZSAlZCAob25seSA4IG9yIDE2IGFyZSAiCi0JCQkgImFsbG93ZWQpLlxuIiwgc2l6ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9yaW9uX3NwaV9iYXVkcmF0ZV9zZXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgaW50IHNwZWVkKQotewotCXUzMiB0Y2xrX2h6OwotCXUzMiByYXRlOwotCXUzMiBwcmVzY2FsZTsKLQl1MzIgcmVnOwotCXN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaTsKLQotCW9yaW9uX3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JdGNsa19oeiA9IG9yaW9uX3NwaS0+c3BpX2luZm8tPnRjbGs7Ci0KLQkvKgotCSAqIHRoZSBzdXBwb3J0ZWQgcmF0ZXMgYXJlOiA0LDYsOC4uLjMwCi0JICogcm91bmQgdXAgYXMgd2UgbG9vayBmb3IgZXF1YWwgb3IgbGVzcyBzcGVlZAotCSAqLwotCXJhdGUgPSBESVZfUk9VTkRfVVAodGNsa19oeiwgc3BlZWQpOwotCXJhdGUgPSByb3VuZHVwKHJhdGUsIDIpOwotCi0JLyogY2hlY2sgaWYgcmVxdWVzdGVkIHNwZWVkIGlzIHRvbyBzbWFsbCAqLwotCWlmIChyYXRlID4gMzApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHJhdGUgPCA0KQotCQlyYXRlID0gNDsKLQotCS8qIENvbnZlcnQgdGhlIHJhdGUgdG8gU1BJIGNsb2NrIGRpdmlzb3IgdmFsdWUuCSovCi0JcHJlc2NhbGUgPSAweDEwICsgcmF0ZS8yOwotCi0JcmVnID0gcmVhZGwoc3BpX3JlZyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JRl9DT05GSUdfUkVHKSk7Ci0JcmVnID0gKChyZWcgJiB+T1JJT05fU1BJX0NMS19QUkVTQ0FMRV9NQVNLKSB8IHByZXNjYWxlKTsKLQl3cml0ZWwocmVnLCBzcGlfcmVnKG9yaW9uX3NwaSwgT1JJT05fU1BJX0lGX0NPTkZJR19SRUcpKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogY2FsbGVkIG9ubHkgd2hlbiBubyB0cmFuc2ZlciBpcyBhY3RpdmUgb24gdGhlIGJ1cwotICovCi1zdGF0aWMgaW50Ci1vcmlvbl9zcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGk7Ci0JdW5zaWduZWQgaW50IHNwZWVkID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0JdW5zaWduZWQgaW50IGJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaW50CXJjOwotCi0Jb3Jpb25fc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0KLQlpZiAoKHQgIT0gTlVMTCkgJiYgdC0+c3BlZWRfaHopCi0JCXNwZWVkID0gdC0+c3BlZWRfaHo7Ci0KLQlpZiAoKHQgIT0gTlVMTCkgJiYgdC0+Yml0c19wZXJfd29yZCkKLQkJYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7Ci0KLQlyYyA9IG9yaW9uX3NwaV9iYXVkcmF0ZV9zZXQoc3BpLCBzcGVlZCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gb3Jpb25fc3BpX3NldF90cmFuc2Zlcl9zaXplKG9yaW9uX3NwaSwgYml0c19wZXJfd29yZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9yaW9uX3NwaV9zZXRfY3Moc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpLCBpbnQgZW5hYmxlKQotewotCWlmIChlbmFibGUpCi0JCW9yaW9uX3NwaV9zZXRiaXRzKG9yaW9uX3NwaSwgT1JJT05fU1BJX0lGX0NUUkxfUkVHLCAweDEpOwotCWVsc2UKLQkJb3Jpb25fc3BpX2NscmJpdHMob3Jpb25fc3BpLCBPUklPTl9TUElfSUZfQ1RSTF9SRUcsIDB4MSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG9yaW9uX3NwaV93YWl0X3RpbGxfcmVhZHkoc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE9SSU9OX1NQSV9XQUlUX1JEWV9NQVhfTE9PUDsgaSsrKSB7Ci0JCWlmIChyZWFkbChzcGlfcmVnKG9yaW9uX3NwaSwgT1JJT05fU1BJX0lOVF9DQVVTRV9SRUcpKSkKLQkJCXJldHVybiAxOwotCQllbHNlCi0JCQl1ZGVsYXkoMSk7Ci0JfQotCi0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotb3Jpb25fc3BpX3dyaXRlX3JlYWRfOGJpdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJICBjb25zdCB1OCAqKnR4X2J1ZiwgdTggKipyeF9idWYpCi17Ci0Jdm9pZCBfX2lvbWVtICp0eF9yZWcsICpyeF9yZWcsICppbnRfcmVnOwotCXN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaTsKLQotCW9yaW9uX3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXR4X3JlZyA9IHNwaV9yZWcob3Jpb25fc3BpLCBPUklPTl9TUElfREFUQV9PVVRfUkVHKTsKLQlyeF9yZWcgPSBzcGlfcmVnKG9yaW9uX3NwaSwgT1JJT05fU1BJX0RBVEFfSU5fUkVHKTsKLQlpbnRfcmVnID0gc3BpX3JlZyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JTlRfQ0FVU0VfUkVHKTsKLQotCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgY2F1c2UgcmVnaXN0ZXIgKi8KLQl3cml0ZWwoMHgwLCBpbnRfcmVnKTsKLQotCWlmICh0eF9idWYgJiYgKnR4X2J1ZikKLQkJd3JpdGVsKCooKnR4X2J1ZikrKywgdHhfcmVnKTsKLQllbHNlCi0JCXdyaXRlbCgwLCB0eF9yZWcpOwotCi0JaWYgKG9yaW9uX3NwaV93YWl0X3RpbGxfcmVhZHkob3Jpb25fc3BpKSA8IDApIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChyeF9idWYgJiYgKnJ4X2J1ZikKLQkJKigqcnhfYnVmKSsrID0gcmVhZGwocnhfcmVnKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotb3Jpb25fc3BpX3dyaXRlX3JlYWRfMTZiaXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCSAgIGNvbnN0IHUxNiAqKnR4X2J1ZiwgdTE2ICoqcnhfYnVmKQotewotCXZvaWQgX19pb21lbSAqdHhfcmVnLCAqcnhfcmVnLCAqaW50X3JlZzsKLQlzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGk7Ci0KLQlvcmlvbl9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQl0eF9yZWcgPSBzcGlfcmVnKG9yaW9uX3NwaSwgT1JJT05fU1BJX0RBVEFfT1VUX1JFRyk7Ci0JcnhfcmVnID0gc3BpX3JlZyhvcmlvbl9zcGksIE9SSU9OX1NQSV9EQVRBX0lOX1JFRyk7Ci0JaW50X3JlZyA9IHNwaV9yZWcob3Jpb25fc3BpLCBPUklPTl9TUElfSU5UX0NBVVNFX1JFRyk7Ci0KLQkvKiBjbGVhciB0aGUgaW50ZXJydXB0IGNhdXNlIHJlZ2lzdGVyICovCi0Jd3JpdGVsKDB4MCwgaW50X3JlZyk7Ci0KLQlpZiAodHhfYnVmICYmICp0eF9idWYpCi0JCXdyaXRlbChfX2NwdV90b19sZTE2KGdldF91bmFsaWduZWQoKCp0eF9idWYpKyspKSwgdHhfcmVnKTsKLQllbHNlCi0JCXdyaXRlbCgwLCB0eF9yZWcpOwotCi0JaWYgKG9yaW9uX3NwaV93YWl0X3RpbGxfcmVhZHkob3Jpb25fc3BpKSA8IDApIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChyeF9idWYgJiYgKnJ4X2J1ZikKLQkJcHV0X3VuYWxpZ25lZChfX2xlMTZfdG9fY3B1KHJlYWRsKHJ4X3JlZykpLCAoKnJ4X2J1ZikrKyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotb3Jpb25fc3BpX3dyaXRlX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKLXsKLQlzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGk7Ci0JdW5zaWduZWQgaW50IGNvdW50OwotCWludCB3b3JkX2xlbjsKLQotCW9yaW9uX3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXdvcmRfbGVuID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCWNvdW50ID0geGZlci0+bGVuOwotCi0JaWYgKHdvcmRfbGVuID09IDgpIHsKLQkJY29uc3QgdTggKnR4ID0geGZlci0+dHhfYnVmOwotCQl1OCAqcnggPSB4ZmVyLT5yeF9idWY7Ci0KLQkJZG8gewotCQkJaWYgKG9yaW9uX3NwaV93cml0ZV9yZWFkXzhiaXQoc3BpLCAmdHgsICZyeCkgPCAwKQotCQkJCWdvdG8gb3V0OwotCQkJY291bnQtLTsKLQkJfSB3aGlsZSAoY291bnQpOwotCX0gZWxzZSBpZiAod29yZF9sZW4gPT0gMTYpIHsKLQkJY29uc3QgdTE2ICp0eCA9IHhmZXItPnR4X2J1ZjsKLQkJdTE2ICpyeCA9IHhmZXItPnJ4X2J1ZjsKLQotCQlkbyB7Ci0JCQlpZiAob3Jpb25fc3BpX3dyaXRlX3JlYWRfMTZiaXQoc3BpLCAmdHgsICZyeCkgPCAwKQotCQkJCWdvdG8gb3V0OwotCQkJY291bnQgLT0gMjsKLQkJfSB3aGlsZSAoY291bnQpOwotCX0KLQotb3V0OgotCXJldHVybiB4ZmVyLT5sZW4gLSBjb3VudDsKLX0KLQotCi1zdGF0aWMgdm9pZCBvcmlvbl9zcGlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvcmlvbl9zcGksIHdvcmspOwotCi0Jc3Bpbl9sb2NrX2lycSgmb3Jpb25fc3BpLT5sb2NrKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJm9yaW9uX3NwaS0+bXNnX3F1ZXVlKSkgewotCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm07Ci0JCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7Ci0JCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQgPSBOVUxMOwotCQlpbnQgcGFyX292ZXJyaWRlID0gMDsKLQkJaW50IHN0YXR1cyA9IDA7Ci0JCWludCBjc19hY3RpdmUgPSAwOwotCi0JCW0gPSBjb250YWluZXJfb2Yob3Jpb25fc3BpLT5tc2dfcXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLAotCQkJCSBxdWV1ZSk7Ci0KLQkJbGlzdF9kZWxfaW5pdCgmbS0+cXVldWUpOwotCQlzcGluX3VubG9ja19pcnEoJm9yaW9uX3NwaS0+bG9jayk7Ci0KLQkJc3BpID0gbS0+c3BpOwotCi0JCS8qIExvYWQgZGVmYXVsdHMgKi8KLQkJc3RhdHVzID0gb3Jpb25fc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7Ci0KLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlnb3RvIG1zZ19kb25lOwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQkJaWYgKHBhcl9vdmVycmlkZSB8fCB0LT5zcGVlZF9oeiB8fCB0LT5iaXRzX3Blcl93b3JkKSB7Ci0JCQkJcGFyX292ZXJyaWRlID0gMTsKLQkJCQlzdGF0dXMgPSBvcmlvbl9zcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKLQkJCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKCF0LT5zcGVlZF9oeiAmJiAhdC0+Yml0c19wZXJfd29yZCkKLQkJCQkJcGFyX292ZXJyaWRlID0gMDsKLQkJCX0KLQotCQkJaWYgKCFjc19hY3RpdmUpIHsKLQkJCQlvcmlvbl9zcGlfc2V0X2NzKG9yaW9uX3NwaSwgMSk7Ci0JCQkJY3NfYWN0aXZlID0gMTsKLQkJCX0KLQotCQkJaWYgKHQtPmxlbikKLQkJCQltLT5hY3R1YWxfbGVuZ3RoICs9Ci0JCQkJCW9yaW9uX3NwaV93cml0ZV9yZWFkKHNwaSwgdCk7Ci0KLQkJCWlmICh0LT5kZWxheV91c2VjcykKLQkJCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOwotCi0JCQlpZiAodC0+Y3NfY2hhbmdlKSB7Ci0JCQkJb3Jpb25fc3BpX3NldF9jcyhvcmlvbl9zcGksIDApOwotCQkJCWNzX2FjdGl2ZSA9IDA7Ci0JCQl9Ci0JCX0KLQotbXNnX2RvbmU6Ci0JCWlmIChjc19hY3RpdmUpCi0JCQlvcmlvbl9zcGlfc2V0X2NzKG9yaW9uX3NwaSwgMCk7Ci0KLQkJbS0+c3RhdHVzID0gc3RhdHVzOwotCQltLT5jb21wbGV0ZShtLT5jb250ZXh0KTsKLQotCQlzcGluX2xvY2tfaXJxKCZvcmlvbl9zcGktPmxvY2spOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycSgmb3Jpb25fc3BpLT5sb2NrKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgb3Jpb25fc3BpX3Jlc2V0KHN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaSkKLXsKLQkvKiBWZXJpZnkgdGhhdCB0aGUgQ1MgaXMgZGVhc3NlcnRlZCAqLwotCW9yaW9uX3NwaV9zZXRfY3Mob3Jpb25fc3BpLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9yaW9uX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaTsKLQotCW9yaW9uX3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JLyogRml4IGFjIHRpbWluZyBpZiByZXF1aXJlZC4gICAqLwotCWlmIChvcmlvbl9zcGktPnNwaV9pbmZvLT5lbmFibGVfY2xvY2tfZml4KQotCQlvcmlvbl9zcGlfc2V0Yml0cyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JRl9DT05GSUdfUkVHLAotCQkJCSAgKDEgPDwgMTQpKTsKLQotCWlmICgoc3BpLT5tYXhfc3BlZWRfaHogPT0gMCkKLQkJCXx8IChzcGktPm1heF9zcGVlZF9oeiA+IG9yaW9uX3NwaS0+bWF4X3NwZWVkKSkKLQkJc3BpLT5tYXhfc3BlZWRfaHogPSBvcmlvbl9zcGktPm1heF9zcGVlZDsKLQotCWlmIChzcGktPm1heF9zcGVlZF9oeiA8IG9yaW9uX3NwaS0+bWluX3NwZWVkKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAic2V0dXA6IHJlcXVlc3RlZCBzcGVlZCB0b28gbG93ICVkIEh6XG4iLAotCQkJc3BpLT5tYXhfc3BlZWRfaHopOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKgotCSAqIGJhdWRyYXRlICYgd2lkdGggd2lsbCBiZSBzZXQgb3Jpb25fc3BpX3NldHVwX3RyYW5zZmVyCi0JICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Jpb25fc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKLXsKLQlzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGk7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdCA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW0tPmFjdHVhbF9sZW5ndGggPSAwOwotCW0tPnN0YXR1cyA9IDA7Ci0KLQkvKiByZWplY3QgaW52YWxpZCBtZXNzYWdlcyBhbmQgdHJhbnNmZXJzICovCi0JaWYgKGxpc3RfZW1wdHkoJm0tPnRyYW5zZmVycykgfHwgIW0tPmNvbXBsZXRlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW9yaW9uX3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCXVuc2lnbmVkIGludCBiaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCi0JCWlmICh0LT50eF9idWYgPT0gTlVMTCAmJiB0LT5yeF9idWYgPT0gTlVMTCAmJiB0LT5sZW4pIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJCSJtZXNzYWdlIHJlamVjdGVkIDogIgotCQkJCSJpbnZhbGlkIHRyYW5zZmVyIGRhdGEgYnVmZmVyc1xuIik7Ci0JCQlnb3RvIG1zZ19yZWplY3RlZDsKLQkJfQotCi0JCWlmICh0LT5iaXRzX3Blcl93b3JkKQotCQkJYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7Ci0KLQkJaWYgKChiaXRzX3Blcl93b3JkICE9IDgpICYmIChiaXRzX3Blcl93b3JkICE9IDE2KSkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJIm1lc3NhZ2UgcmVqZWN0ZWQgOiAiCi0JCQkJImludmFsaWQgdHJhbnNmZXIgYml0c19wZXJfd29yZCAoJWQgYml0cylcbiIsCi0JCQkJYml0c19wZXJfd29yZCk7Ci0JCQlnb3RvIG1zZ19yZWplY3RlZDsKLQkJfQotCQkvKm1ha2Ugc3VyZSBidWZmZXIgbGVuZ3RoIGlzIGV2ZW4gd2hlbiB3b3JraW5nIGluIDE2IGJpdCBtb2RlKi8KLQkJaWYgKCh0LT5iaXRzX3Blcl93b3JkID09IDE2KSAmJiAodC0+bGVuICYgMSkpIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJCSJtZXNzYWdlIHJlamVjdGVkIDogIgotCQkJCSJvZGQgZGF0YSBsZW5ndGggKCVkKSB3aGlsZSBpbiAxNiBiaXQgbW9kZVxuIiwKLQkJCQl0LT5sZW4pOwotCQkJZ290byBtc2dfcmVqZWN0ZWQ7Ci0JCX0KLQotCQlpZiAodC0+c3BlZWRfaHogJiYgdC0+c3BlZWRfaHogPCBvcmlvbl9zcGktPm1pbl9zcGVlZCkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJIm1lc3NhZ2UgcmVqZWN0ZWQgOiAiCi0JCQkJImRldmljZSBtaW4gc3BlZWQgKCVkIEh6KSBleGNlZWRzICIKLQkJCQkicmVxdWlyZWQgdHJhbnNmZXIgc3BlZWQgKCVkIEh6KVxuIiwKLQkJCQlvcmlvbl9zcGktPm1pbl9zcGVlZCwgdC0+c3BlZWRfaHopOwotCQkJZ290byBtc2dfcmVqZWN0ZWQ7Ci0JCX0KLQl9Ci0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZvcmlvbl9zcGktPmxvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZtLT5xdWV1ZSwgJm9yaW9uX3NwaS0+bXNnX3F1ZXVlKTsKLQlxdWV1ZV93b3JrKG9yaW9uX3NwaV93cSwgJm9yaW9uX3NwaS0+d29yayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3Jpb25fc3BpLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLW1zZ19yZWplY3RlZDoKLQkvKiBNZXNzYWdlIHJlamVjdGVkIGFuZCBub3QgcXVldWVkICovCi0JbS0+c3RhdHVzID0gLUVJTlZBTDsKLQlpZiAobS0+Y29tcGxldGUpCi0JCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBvcmlvbl9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCBvcmlvbl9zcGkgKnNwaTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnI7Ci0Jc3RydWN0IG9yaW9uX3NwaV9pbmZvICpzcGlfaW5mbzsKLQlpbnQgc3RhdHVzID0gMDsKLQotCXNwaV9pbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZiAqc3BpKTsKLQlpZiAobWFzdGVyID09IE5VTEwpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAibWFzdGVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaWYgKHBkZXYtPmlkICE9IC0xKQotCQltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKLQotCS8qIHdlIHN1cHBvcnQgb25seSBtb2RlIDAsIGFuZCBubyBvcHRpb25zICovCi0JbWFzdGVyLT5tb2RlX2JpdHMgPSAwOwotCi0JbWFzdGVyLT5zZXR1cCA9IG9yaW9uX3NwaV9zZXR1cDsKLQltYXN0ZXItPnRyYW5zZmVyID0gb3Jpb25fc3BpX3RyYW5zZmVyOwotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBPUklPTl9OVU1fQ0hJUFNFTEVDVFM7Ci0KLQlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgbWFzdGVyKTsKLQotCXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzcGktPm1hc3RlciA9IG1hc3RlcjsKLQlzcGktPnNwaV9pbmZvID0gc3BpX2luZm87Ci0KLQlzcGktPm1heF9zcGVlZCA9IERJVl9ST1VORF9VUChzcGlfaW5mby0+dGNsaywgNCk7Ci0Jc3BpLT5taW5fc3BlZWQgPSBESVZfUk9VTkRfVVAoc3BpX2luZm8tPnRjbGssIDMwKTsKLQotCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmIChyID09IE5VTEwpIHsKLQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oci0+c3RhcnQsIChyLT5lbmQgLSByLT5zdGFydCkgKyAxLAotCQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpKSkgewotCQlzdGF0dXMgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQlzcGktPmJhc2UgPSBpb3JlbWFwKHItPnN0YXJ0LCBTWl8xSyk7Ci0KLQlJTklUX1dPUksoJnNwaS0+d29yaywgb3Jpb25fc3BpX3dvcmspOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnNwaS0+bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNwaS0+bXNnX3F1ZXVlKTsKLQotCWlmIChvcmlvbl9zcGlfcmVzZXQoc3BpKSA8IDApCi0JCWdvdG8gb3V0X3JlbF9tZW07Ci0KLQlzdGF0dXMgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCWdvdG8gb3V0X3JlbF9tZW07Ci0KLQlyZXR1cm4gc3RhdHVzOwotCi1vdXRfcmVsX21lbToKLQlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIChyLT5lbmQgLSByLT5zdGFydCkgKyAxKTsKLQotb3V0OgotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotCi1zdGF0aWMgaW50IF9fZXhpdCBvcmlvbl9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKLQlzdHJ1Y3Qgb3Jpb25fc3BpICpzcGk7Ci0Jc3RydWN0IHJlc291cmNlICpyOwotCi0JbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwotCXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQotCWNhbmNlbF93b3JrX3N5bmMoJnNwaS0+d29yayk7Ci0KLQlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIChyLT5lbmQgLSByLT5zdGFydCkgKyAxKTsKLQotCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLU1PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUklWRVJfTkFNRSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9yaW9uX3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSBEUklWRVJfTkFNRSwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucmVtb3ZlCQk9IF9fZXhpdF9wKG9yaW9uX3NwaV9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgb3Jpb25fc3BpX2luaXQodm9pZCkKLXsKLQlvcmlvbl9zcGlfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKLQkJCQlvcmlvbl9zcGlfZHJpdmVyLmRyaXZlci5uYW1lKTsKLQlpZiAob3Jpb25fc3BpX3dxID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmb3Jpb25fc3BpX2RyaXZlciwgb3Jpb25fc3BpX3Byb2JlKTsKLX0KLW1vZHVsZV9pbml0KG9yaW9uX3NwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG9yaW9uX3NwaV9leGl0KHZvaWQpCi17Ci0JZmx1c2hfd29ya3F1ZXVlKG9yaW9uX3NwaV93cSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9yaW9uX3NwaV9kcml2ZXIpOwotCi0JZGVzdHJveV93b3JrcXVldWUob3Jpb25fc3BpX3dxKTsKLX0KLW1vZHVsZV9leGl0KG9yaW9uX3NwaV9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJPcmlvbiBTUEkgZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJTaGFkaSBBbW1vdXJpIDxzaGFkaUBtYXJ2ZWxsLmNvbT4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9hbHRlcmEuYyBiL2RyaXZlcnMvc3BpL3NwaS1hbHRlcmEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zcGkvc3BpX2FsdGVyYS5jCnJlbmFtZSB0byBkcml2ZXJzL3NwaS9zcGktYWx0ZXJhLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jIGIvZHJpdmVycy9zcGkvc3BpLWF0aDc5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwMTliZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogU1BJIGNvbnRyb2xsZXIgZHJpdmVyIGZvciB0aGUgQXRoZXJvcyBBUjcxWFgvQVI3MjRYL0FSOTEzWCBTb0NzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgR2Fib3IgSnVob3MgPGp1aG9zZ0BvcGVud3J0Lm9yZz4KKyAqCisgKiBUaGlzIGRyaXZlciBoYXMgYmVlbiBiYXNlZCBvbiB0aGUgc3BpLWdwaW8uYzoKKyAqCUNvcHlyaWdodCAoQykgMjAwNiwyMDA4IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtYXRoNzkvYXI3MXh4X3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdGg3OS9hdGg3OV9zcGlfcGxhdGZvcm0uaD4KKworI2RlZmluZSBEUlZfTkFNRQkiYXRoNzktc3BpIgorCitzdHJ1Y3QgYXRoNzlfc3BpIHsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJYml0YmFuZzsKKwl1MzIJCQlpb2NfYmFzZTsKKwl1MzIJCQlyZWdfY3RybDsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworfTsKKworc3RhdGljIGlubGluZSB1MzIgYXRoNzlfc3BpX3JyKHN0cnVjdCBhdGg3OV9zcGkgKnNwLCB1bnNpZ25lZCByZWcpCit7CisJcmV0dXJuIGlvcmVhZDMyKHNwLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0aDc5X3NwaV93cihzdHJ1Y3QgYXRoNzlfc3BpICpzcCwgdW5zaWduZWQgcmVnLCB1MzIgdmFsKQoreworCWlvd3JpdGUzMih2YWwsIHNwLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXRoNzlfc3BpICphdGg3OV9zcGlkZXZfdG9fc3Aoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDc5X3NwaV9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19hY3RpdmUpCit7CisJc3RydWN0IGF0aDc5X3NwaSAqc3AgPSBhdGg3OV9zcGlkZXZfdG9fc3Aoc3BpKTsKKwlpbnQgY3NfaGlnaCA9IChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkgPyBpc19hY3RpdmUgOiAhaXNfYWN0aXZlOworCisJaWYgKGlzX2FjdGl2ZSkgeworCQkvKiBzZXQgaW5pdGlhbCBjbG9jayBwb2xhcml0eSAqLworCQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCQlzcC0+aW9jX2Jhc2UgfD0gQVI3MVhYX1NQSV9JT0NfQ0xLOworCQllbHNlCisJCQlzcC0+aW9jX2Jhc2UgJj0gfkFSNzFYWF9TUElfSU9DX0NMSzsKKworCQlhdGg3OV9zcGlfd3Ioc3AsIEFSNzFYWF9TUElfUkVHX0lPQywgc3AtPmlvY19iYXNlKTsKKwl9CisKKwlpZiAoc3BpLT5jaGlwX3NlbGVjdCkgeworCQlzdHJ1Y3QgYXRoNzlfc3BpX2NvbnRyb2xsZXJfZGF0YSAqY2RhdGEgPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKworCQkvKiBTUEkgaXMgbm9ybWFsbHkgYWN0aXZlLWxvdyAqLworCQlncGlvX3NldF92YWx1ZShjZGF0YS0+Z3BpbywgY3NfaGlnaCk7CisJfSBlbHNlIHsKKwkJaWYgKGNzX2hpZ2gpCisJCQlzcC0+aW9jX2Jhc2UgfD0gQVI3MVhYX1NQSV9JT0NfQ1MwOworCQllbHNlCisJCQlzcC0+aW9jX2Jhc2UgJj0gfkFSNzFYWF9TUElfSU9DX0NTMDsKKworCQlhdGg3OV9zcGlfd3Ioc3AsIEFSNzFYWF9TUElfUkVHX0lPQywgc3AtPmlvY19iYXNlKTsKKwl9CisKK30KKworc3RhdGljIGludCBhdGg3OV9zcGlfc2V0dXBfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYXRoNzlfc3BpICpzcCA9IGF0aDc5X3NwaWRldl90b19zcChzcGkpOworCXN0cnVjdCBhdGg3OV9zcGlfY29udHJvbGxlcl9kYXRhICpjZGF0YTsKKworCWNkYXRhID0gc3BpLT5jb250cm9sbGVyX2RhdGE7CisJaWYgKHNwaS0+Y2hpcF9zZWxlY3QgJiYgIWNkYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGVuYWJsZSBHUElPIG1vZGUgKi8KKwlhdGg3OV9zcGlfd3Ioc3AsIEFSNzFYWF9TUElfUkVHX0ZTLCBBUjcxWFhfU1BJX0ZTX0dQSU8pOworCisJLyogc2F2ZSBDVFJMIHJlZ2lzdGVyICovCisJc3AtPnJlZ19jdHJsID0gYXRoNzlfc3BpX3JyKHNwLCBBUjcxWFhfU1BJX1JFR19DVFJMKTsKKwlzcC0+aW9jX2Jhc2UgPSBhdGg3OV9zcGlfcnIoc3AsIEFSNzFYWF9TUElfUkVHX0lPQyk7CisKKwkvKiBUT0RPOiBzZXR1cCBzcGVlZD8gKi8KKwlhdGg3OV9zcGlfd3Ioc3AsIEFSNzFYWF9TUElfUkVHX0NUUkwsIDB4NDMpOworCisJaWYgKHNwaS0+Y2hpcF9zZWxlY3QpIHsKKwkJaW50IHN0YXR1cyA9IDA7CisKKwkJc3RhdHVzID0gZ3Bpb19yZXF1ZXN0KGNkYXRhLT5ncGlvLCBkZXZfbmFtZSgmc3BpLT5kZXYpKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJc3RhdHVzID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGNkYXRhLT5ncGlvLAorCQkJCQkgICAgICAgc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpOworCQlpZiAoc3RhdHVzKSB7CisJCQlncGlvX2ZyZWUoY2RhdGEtPmdwaW8pOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkKKwkJCXNwLT5pb2NfYmFzZSB8PSBBUjcxWFhfU1BJX0lPQ19DUzA7CisJCWVsc2UKKwkJCXNwLT5pb2NfYmFzZSAmPSB+QVI3MVhYX1NQSV9JT0NfQ1MwOworCQlhdGg3OV9zcGlfd3Ioc3AsIEFSNzFYWF9TUElfUkVHX0lPQywgc3AtPmlvY19iYXNlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXRoNzlfc3BpX2NsZWFudXBfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYXRoNzlfc3BpICpzcCA9IGF0aDc5X3NwaWRldl90b19zcChzcGkpOworCisJaWYgKHNwaS0+Y2hpcF9zZWxlY3QpIHsKKwkJc3RydWN0IGF0aDc5X3NwaV9jb250cm9sbGVyX2RhdGEgKmNkYXRhID0gc3BpLT5jb250cm9sbGVyX2RhdGE7CisJCWdwaW9fZnJlZShjZGF0YS0+Z3Bpbyk7CisJfQorCisJLyogcmVzdG9yZSBDVFJMIHJlZ2lzdGVyICovCisJYXRoNzlfc3BpX3dyKHNwLCBBUjcxWFhfU1BJX1JFR19DVFJMLCBzcC0+cmVnX2N0cmwpOworCS8qIGRpc2FibGUgR1BJTyBtb2RlICovCisJYXRoNzlfc3BpX3dyKHNwLCBBUjcxWFhfU1BJX1JFR19GUywgMCk7Cit9CisKK3N0YXRpYyBpbnQgYXRoNzlfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkID4gMzIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzcGktPmNvbnRyb2xsZXJfc3RhdGUpIHsKKwkJc3RhdHVzID0gYXRoNzlfc3BpX3NldHVwX2NzKHNwaSk7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3NldHVwKHNwaSk7CisJaWYgKHN0YXR1cyAmJiAhc3BpLT5jb250cm9sbGVyX3N0YXRlKQorCQlhdGg3OV9zcGlfY2xlYW51cF9jcyhzcGkpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgYXRoNzlfc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlhdGg3OV9zcGlfY2xlYW51cF9jcyhzcGkpOworCXNwaV9iaXRiYW5nX2NsZWFudXAoc3BpKTsKK30KKworc3RhdGljIHUzMiBhdGg3OV9zcGlfdHhyeF9tb2RlMChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBuc2VjcywKKwkJCSAgICAgICB1MzIgd29yZCwgdTggYml0cykKK3sKKwlzdHJ1Y3QgYXRoNzlfc3BpICpzcCA9IGF0aDc5X3NwaWRldl90b19zcChzcGkpOworCXUzMiBpb2MgPSBzcC0+aW9jX2Jhc2U7CisKKwkvKiBjbG9jayBzdGFydHMgYXQgaW5hY3RpdmUgcG9sYXJpdHkgKi8KKwlmb3IgKHdvcmQgPDw9ICgzMiAtIGJpdHMpOyBsaWtlbHkoYml0cyk7IGJpdHMtLSkgeworCQl1MzIgb3V0OworCisJCWlmICh3b3JkICYgKDEgPDwgMzEpKQorCQkJb3V0ID0gaW9jIHwgQVI3MVhYX1NQSV9JT0NfRE87CisJCWVsc2UKKwkJCW91dCA9IGlvYyAmIH5BUjcxWFhfU1BJX0lPQ19ETzsKKworCQkvKiBzZXR1cCBNU0IgKHRvIHNsYXZlKSBvbiB0cmFpbGluZyBlZGdlICovCisJCWF0aDc5X3NwaV93cihzcCwgQVI3MVhYX1NQSV9SRUdfSU9DLCBvdXQpOworCQlhdGg3OV9zcGlfd3Ioc3AsIEFSNzFYWF9TUElfUkVHX0lPQywgb3V0IHwgQVI3MVhYX1NQSV9JT0NfQ0xLKTsKKworCQl3b3JkIDw8PSAxOworCX0KKworCXJldHVybiBhdGg3OV9zcGlfcnIoc3AsIEFSNzFYWF9TUElfUkVHX1JEUyk7Cit9CisKK3N0YXRpYyBfX2RldmluaXQgaW50IGF0aDc5X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IGF0aDc5X3NwaSAqc3A7CisJc3RydWN0IGF0aDc5X3NwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcmVzb3VyY2UJKnI7CisJaW50IHJldDsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKCpzcCkpOworCWlmIChtYXN0ZXIgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgc3BpIG1hc3RlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNwKTsKKworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwltYXN0ZXItPnNldHVwID0gYXRoNzlfc3BpX3NldHVwOworCW1hc3Rlci0+Y2xlYW51cCA9IGF0aDc5X3NwaV9jbGVhbnVwOworCWlmIChwZGF0YSkgeworCQltYXN0ZXItPmJ1c19udW0gPSBwZGF0YS0+YnVzX251bTsKKwkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHBkYXRhLT5udW1fY2hpcHNlbGVjdDsKKwl9IGVsc2UgeworCQltYXN0ZXItPmJ1c19udW0gPSAtMTsKKwkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDE7CisJfQorCisJc3AtPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKKwlzcC0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gYXRoNzlfc3BpX2NoaXBzZWxlY3Q7CisJc3AtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzBdID0gYXRoNzlfc3BpX3R4cnhfbW9kZTA7CisJc3AtPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlcjsKKwlzcC0+Yml0YmFuZy5mbGFncyA9IFNQSV9DU19ISUdIOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHIgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycl9wdXRfbWFzdGVyOworCX0KKworCXNwLT5iYXNlID0gaW9yZW1hcChyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CisJaWYgKCFzcC0+YmFzZSkgeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyX3B1dF9tYXN0ZXI7CisJfQorCisJcmV0ID0gc3BpX2JpdGJhbmdfc3RhcnQoJnNwLT5iaXRiYW5nKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bm1hcDsKKworCXJldHVybiAwOworCitlcnJfdW5tYXA6CisJaW91bm1hcChzcC0+YmFzZSk7CitlcnJfcHV0X21hc3RlcjoKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlzcGlfbWFzdGVyX3B1dChzcC0+Yml0YmFuZy5tYXN0ZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9fZGV2ZXhpdCBpbnQgYXRoNzlfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhdGg3OV9zcGkgKnNwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzcGlfYml0YmFuZ19zdG9wKCZzcC0+Yml0YmFuZyk7CisJaW91bm1hcChzcC0+YmFzZSk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJc3BpX21hc3Rlcl9wdXQoc3AtPmJpdGJhbmcubWFzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdGg3OV9zcGlfZHJpdmVyID0geworCS5wcm9iZQkJPSBhdGg3OV9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhdGg3OV9zcGlfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBEUlZfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGF0aDc5X3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXRoNzlfc3BpX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhdGg3OV9zcGlfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhdGg3OV9zcGlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdGg3OV9zcGlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGF0aDc5X3NwaV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUEkgY29udHJvbGxlciBkcml2ZXIgZm9yIEF0aGVyb3MgQVI3MVhYL0FSNzI0WC9BUjkxM1giKTsKK01PRFVMRV9BVVRIT1IoIkdhYm9yIEp1aG9zIDxqdWhvc2dAb3BlbndydC5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWF0bWVsLmMgYi9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmRlZTlhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLWF0bWVsLmMKQEAgLTAsMCArMSwxMDkzIEBACisvKgorICogRHJpdmVyIGZvciBBdG1lbCBBVDMyIGFuZCBBVDkxIFNQSSBDb250cm9sbGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBdG1lbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2NwdS5oPgorCisvKiBTUEkgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBTUElfQ1IJCQkJCTB4MDAwMAorI2RlZmluZSBTUElfTVIJCQkJCTB4MDAwNAorI2RlZmluZSBTUElfUkRSCQkJCQkweDAwMDgKKyNkZWZpbmUgU1BJX1REUgkJCQkJMHgwMDBjCisjZGVmaW5lIFNQSV9TUgkJCQkJMHgwMDEwCisjZGVmaW5lIFNQSV9JRVIJCQkJCTB4MDAxNAorI2RlZmluZSBTUElfSURSCQkJCQkweDAwMTgKKyNkZWZpbmUgU1BJX0lNUgkJCQkJMHgwMDFjCisjZGVmaW5lIFNQSV9DU1IwCQkJCTB4MDAzMAorI2RlZmluZSBTUElfQ1NSMQkJCQkweDAwMzQKKyNkZWZpbmUgU1BJX0NTUjIJCQkJMHgwMDM4CisjZGVmaW5lIFNQSV9DU1IzCQkJCTB4MDAzYworI2RlZmluZSBTUElfUlBSCQkJCQkweDAxMDAKKyNkZWZpbmUgU1BJX1JDUgkJCQkJMHgwMTA0CisjZGVmaW5lIFNQSV9UUFIJCQkJCTB4MDEwOAorI2RlZmluZSBTUElfVENSCQkJCQkweDAxMGMKKyNkZWZpbmUgU1BJX1JOUFIJCQkJMHgwMTEwCisjZGVmaW5lIFNQSV9STkNSCQkJCTB4MDExNAorI2RlZmluZSBTUElfVE5QUgkJCQkweDAxMTgKKyNkZWZpbmUgU1BJX1ROQ1IJCQkJMHgwMTFjCisjZGVmaW5lIFNQSV9QVENSCQkJCTB4MDEyMAorI2RlZmluZSBTUElfUFRTUgkJCQkweDAxMjQKKworLyogQml0ZmllbGRzIGluIENSICovCisjZGVmaW5lIFNQSV9TUElFTl9PRkZTRVQJCQkwCisjZGVmaW5lIFNQSV9TUElFTl9TSVpFCQkJCTEKKyNkZWZpbmUgU1BJX1NQSURJU19PRkZTRVQJCQkxCisjZGVmaW5lIFNQSV9TUElESVNfU0laRQkJCQkxCisjZGVmaW5lIFNQSV9TV1JTVF9PRkZTRVQJCQk3CisjZGVmaW5lIFNQSV9TV1JTVF9TSVpFCQkJCTEKKyNkZWZpbmUgU1BJX0xBU1RYRkVSX09GRlNFVAkJCTI0CisjZGVmaW5lIFNQSV9MQVNUWEZFUl9TSVpFCQkJMQorCisvKiBCaXRmaWVsZHMgaW4gTVIgKi8KKyNkZWZpbmUgU1BJX01TVFJfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgU1BJX01TVFJfU0laRQkJCQkxCisjZGVmaW5lIFNQSV9QU19PRkZTRVQJCQkJMQorI2RlZmluZSBTUElfUFNfU0laRQkJCQkxCisjZGVmaW5lIFNQSV9QQ1NERUNfT0ZGU0VUCQkJMgorI2RlZmluZSBTUElfUENTREVDX1NJWkUJCQkJMQorI2RlZmluZSBTUElfRkRJVl9PRkZTRVQJCQkJMworI2RlZmluZSBTUElfRkRJVl9TSVpFCQkJCTEKKyNkZWZpbmUgU1BJX01PREZESVNfT0ZGU0VUCQkJNAorI2RlZmluZSBTUElfTU9ERkRJU19TSVpFCQkJMQorI2RlZmluZSBTUElfTExCX09GRlNFVAkJCQk3CisjZGVmaW5lIFNQSV9MTEJfU0laRQkJCQkxCisjZGVmaW5lIFNQSV9QQ1NfT0ZGU0VUCQkJCTE2CisjZGVmaW5lIFNQSV9QQ1NfU0laRQkJCQk0CisjZGVmaW5lIFNQSV9ETFlCQ1NfT0ZGU0VUCQkJMjQKKyNkZWZpbmUgU1BJX0RMWUJDU19TSVpFCQkJCTgKKworLyogQml0ZmllbGRzIGluIFJEUiAqLworI2RlZmluZSBTUElfUkRfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgU1BJX1JEX1NJWkUJCQkJMTYKKworLyogQml0ZmllbGRzIGluIFREUiAqLworI2RlZmluZSBTUElfVERfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgU1BJX1REX1NJWkUJCQkJMTYKKworLyogQml0ZmllbGRzIGluIFNSICovCisjZGVmaW5lIFNQSV9SRFJGX09GRlNFVAkJCQkwCisjZGVmaW5lIFNQSV9SRFJGX1NJWkUJCQkJMQorI2RlZmluZSBTUElfVERSRV9PRkZTRVQJCQkJMQorI2RlZmluZSBTUElfVERSRV9TSVpFCQkJCTEKKyNkZWZpbmUgU1BJX01PREZfT0ZGU0VUCQkJCTIKKyNkZWZpbmUgU1BJX01PREZfU0laRQkJCQkxCisjZGVmaW5lIFNQSV9PVlJFU19PRkZTRVQJCQkzCisjZGVmaW5lIFNQSV9PVlJFU19TSVpFCQkJCTEKKyNkZWZpbmUgU1BJX0VORFJYX09GRlNFVAkJCTQKKyNkZWZpbmUgU1BJX0VORFJYX1NJWkUJCQkJMQorI2RlZmluZSBTUElfRU5EVFhfT0ZGU0VUCQkJNQorI2RlZmluZSBTUElfRU5EVFhfU0laRQkJCQkxCisjZGVmaW5lIFNQSV9SWEJVRkZfT0ZGU0VUCQkJNgorI2RlZmluZSBTUElfUlhCVUZGX1NJWkUJCQkJMQorI2RlZmluZSBTUElfVFhCVUZFX09GRlNFVAkJCTcKKyNkZWZpbmUgU1BJX1RYQlVGRV9TSVpFCQkJCTEKKyNkZWZpbmUgU1BJX05TU1JfT0ZGU0VUCQkJCTgKKyNkZWZpbmUgU1BJX05TU1JfU0laRQkJCQkxCisjZGVmaW5lIFNQSV9UWEVNUFRZX09GRlNFVAkJCTkKKyNkZWZpbmUgU1BJX1RYRU1QVFlfU0laRQkJCTEKKyNkZWZpbmUgU1BJX1NQSUVOU19PRkZTRVQJCQkxNgorI2RlZmluZSBTUElfU1BJRU5TX1NJWkUJCQkJMQorCisvKiBCaXRmaWVsZHMgaW4gQ1NSMCAqLworI2RlZmluZSBTUElfQ1BPTF9PRkZTRVQJCQkJMAorI2RlZmluZSBTUElfQ1BPTF9TSVpFCQkJCTEKKyNkZWZpbmUgU1BJX05DUEhBX09GRlNFVAkJCTEKKyNkZWZpbmUgU1BJX05DUEhBX1NJWkUJCQkJMQorI2RlZmluZSBTUElfQ1NBQVRfT0ZGU0VUCQkJMworI2RlZmluZSBTUElfQ1NBQVRfU0laRQkJCQkxCisjZGVmaW5lIFNQSV9CSVRTX09GRlNFVAkJCQk0CisjZGVmaW5lIFNQSV9CSVRTX1NJWkUJCQkJNAorI2RlZmluZSBTUElfU0NCUl9PRkZTRVQJCQkJOAorI2RlZmluZSBTUElfU0NCUl9TSVpFCQkJCTgKKyNkZWZpbmUgU1BJX0RMWUJTX09GRlNFVAkJCTE2CisjZGVmaW5lIFNQSV9ETFlCU19TSVpFCQkJCTgKKyNkZWZpbmUgU1BJX0RMWUJDVF9PRkZTRVQJCQkyNAorI2RlZmluZSBTUElfRExZQkNUX1NJWkUJCQkJOAorCisvKiBCaXRmaWVsZHMgaW4gUkNSICovCisjZGVmaW5lIFNQSV9SWENUUl9PRkZTRVQJCQkwCisjZGVmaW5lIFNQSV9SWENUUl9TSVpFCQkJCTE2CisKKy8qIEJpdGZpZWxkcyBpbiBUQ1IgKi8KKyNkZWZpbmUgU1BJX1RYQ1RSX09GRlNFVAkJCTAKKyNkZWZpbmUgU1BJX1RYQ1RSX1NJWkUJCQkJMTYKKworLyogQml0ZmllbGRzIGluIFJOQ1IgKi8KKyNkZWZpbmUgU1BJX1JYTkNSX09GRlNFVAkJCTAKKyNkZWZpbmUgU1BJX1JYTkNSX1NJWkUJCQkJMTYKKworLyogQml0ZmllbGRzIGluIFROQ1IgKi8KKyNkZWZpbmUgU1BJX1RYTkNSX09GRlNFVAkJCTAKKyNkZWZpbmUgU1BJX1RYTkNSX1NJWkUJCQkJMTYKKworLyogQml0ZmllbGRzIGluIFBUQ1IgKi8KKyNkZWZpbmUgU1BJX1JYVEVOX09GRlNFVAkJCTAKKyNkZWZpbmUgU1BJX1JYVEVOX1NJWkUJCQkJMQorI2RlZmluZSBTUElfUlhURElTX09GRlNFVAkJCTEKKyNkZWZpbmUgU1BJX1JYVERJU19TSVpFCQkJCTEKKyNkZWZpbmUgU1BJX1RYVEVOX09GRlNFVAkJCTgKKyNkZWZpbmUgU1BJX1RYVEVOX1NJWkUJCQkJMQorI2RlZmluZSBTUElfVFhURElTX09GRlNFVAkJCTkKKyNkZWZpbmUgU1BJX1RYVERJU19TSVpFCQkJCTEKKworLyogQ29uc3RhbnRzIGZvciBCSVRTICovCisjZGVmaW5lIFNQSV9CSVRTXzhfQlBUCQkJCTAKKyNkZWZpbmUgU1BJX0JJVFNfOV9CUFQJCQkJMQorI2RlZmluZSBTUElfQklUU18xMF9CUFQJCQkJMgorI2RlZmluZSBTUElfQklUU18xMV9CUFQJCQkJMworI2RlZmluZSBTUElfQklUU18xMl9CUFQJCQkJNAorI2RlZmluZSBTUElfQklUU18xM19CUFQJCQkJNQorI2RlZmluZSBTUElfQklUU18xNF9CUFQJCQkJNgorI2RlZmluZSBTUElfQklUU18xNV9CUFQJCQkJNworI2RlZmluZSBTUElfQklUU18xNl9CUFQJCQkJOAorCisvKiBCaXQgbWFuaXB1bGF0aW9uIG1hY3JvcyAqLworI2RlZmluZSBTUElfQklUKG5hbWUpIFwKKwkoMSA8PCBTUElfIyNuYW1lIyNfT0ZGU0VUKQorI2RlZmluZSBTUElfQkYobmFtZSx2YWx1ZSkgXAorCSgoKHZhbHVlKSAmICgoMSA8PCBTUElfIyNuYW1lIyNfU0laRSkgLSAxKSkgPDwgU1BJXyMjbmFtZSMjX09GRlNFVCkKKyNkZWZpbmUgU1BJX0JGRVhUKG5hbWUsdmFsdWUpIFwKKwkoKCh2YWx1ZSkgPj4gU1BJXyMjbmFtZSMjX09GRlNFVCkgJiAoKDEgPDwgU1BJXyMjbmFtZSMjX1NJWkUpIC0gMSkpCisjZGVmaW5lIFNQSV9CRklOUyhuYW1lLHZhbHVlLG9sZCkgXAorCSggKChvbGQpICYgfigoKDEgPDwgU1BJXyMjbmFtZSMjX1NJWkUpIC0gMSkgPDwgU1BJXyMjbmFtZSMjX09GRlNFVCkpIFwKKwkgIHwgU1BJX0JGKG5hbWUsdmFsdWUpKQorCisvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCisjZGVmaW5lIHNwaV9yZWFkbChwb3J0LHJlZykgXAorCV9fcmF3X3JlYWRsKChwb3J0KS0+cmVncyArIFNQSV8jI3JlZykKKyNkZWZpbmUgc3BpX3dyaXRlbChwb3J0LHJlZyx2YWx1ZSkgXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAocG9ydCktPnJlZ3MgKyBTUElfIyNyZWcpCisKKworLyoKKyAqIFRoZSBjb3JlIFNQSSB0cmFuc2ZlciBlbmdpbmUganVzdCB0YWxrcyB0byBhIHJlZ2lzdGVyIGJhbmsgdG8gc2V0IHVwCisgKiBETUEgdHJhbnNmZXJzOyB0cmFuc2ZlciBxdWV1ZSBwcm9ncmVzcyBpcyBkcml2ZW4gYnkgSVJRcy4gIFRoZSBjbG9jaworICogZnJhbWV3b3JrIHByb3ZpZGVzIHRoZSBiYXNlIGNsb2NrLCBzdWJkaXZpZGVkIGZvciBlYWNoIHNwaV9kZXZpY2UuCisgKi8KK3N0cnVjdCBhdG1lbF9zcGkgeworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwl2b2lkIF9faW9tZW0JCSpyZWdzOworCWludAkJCWlycTsKKwlzdHJ1Y3QgY2xrCQkqY2xrOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UJKnN0YXk7CisKKwl1OAkJCXN0b3BwaW5nOworCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkqY3VycmVudF90cmFuc2ZlcjsKKwl1bnNpZ25lZCBsb25nCQljdXJyZW50X3JlbWFpbmluZ19ieXRlczsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSpuZXh0X3RyYW5zZmVyOworCXVuc2lnbmVkIGxvbmcJCW5leHRfcmVtYWluaW5nX2J5dGVzOworCisJdm9pZAkJCSpidWZmZXI7CisJZG1hX2FkZHJfdAkJYnVmZmVyX2RtYTsKK307CisKKy8qIENvbnRyb2xsZXItc3BlY2lmaWMgcGVyLXNsYXZlIHN0YXRlICovCitzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZSB7CisJdW5zaWduZWQgaW50CQlucGNzX3BpbjsKKwl1MzIJCQljc3I7Cit9OworCisjZGVmaW5lIEJVRkZFUl9TSVpFCQlQQUdFX1NJWkUKKyNkZWZpbmUgSU5WQUxJRF9ETUFfQUREUkVTUwkweGZmZmZmZmZmCisKKy8qCisgKiBWZXJzaW9uIDIgb2YgdGhlIFNQSSBjb250cm9sbGVyIGhhcworICogIC0gQ1IuTEFTVFhGRVIKKyAqICAtIFNQSV9NUi5ESVYzMiBtYXkgYmVjb21lIEZESVYgb3IgbXVzdC1iZS16ZXJvIChoZXJlOiBhbHdheXMgemVybykKKyAqICAtIFNQSV9TUi5UWEVNUFRZLCBTUElfU1IuTlNTUiAoYW5kIGNvcnJlc3BvbmRpbmcgaXJxcykKKyAqICAtIFNQSV9DU1J4LkNTQUFUCisgKiAgLSBTUElfQ1NSeC5TQkNSIGFsbG93cyBmYXN0ZXIgY2xvY2tpbmcKKyAqCisgKiBXZSBjYW4gZGV0ZXJtaW5lIHRoZSBjb250cm9sbGVyIHZlcnNpb24gYnkgcmVhZGluZyB0aGUgVkVSU0lPTgorICogcmVnaXN0ZXIsIGJ1dCBJIGhhdmVuJ3QgY2hlY2tlZCB0aGF0IGl0IGV4aXN0cyBvbiBhbGwgY2hpcHMsIGFuZAorICogdGhpcyBpcyBjaGVhcGVyIGFueXdheS4KKyAqLworc3RhdGljIGJvb2wgYXRtZWxfc3BpX2lzX3YyKHZvaWQpCit7CisJcmV0dXJuICFjcHVfaXNfYXQ5MXJtOTIwMCgpOworfQorCisvKgorICogRWFybGllciBTUEkgY29udHJvbGxlcnMgKGUuZy4gb24gYXQ5MXJtOTIwMCkgaGF2ZSBhIGRlc2lnbiBidWcgd2hlcmVieQorICogdGhleSBhc3N1bWUgdGhhdCBzcGkgc2xhdmUgZGV2aWNlIHN0YXRlIHdpbGwgbm90IGNoYW5nZSBvbiBkZXNlbGVjdCwgc28KKyAqIHRoYXQgYXV0b21hZ2ljIGRlc2VsZWN0aW9uIGlzIE9LLiAgKCJOUENTeCByaXNlcyBpZiBubyBkYXRhIGlzIHRvIGJlCisgKiB0cmFuc21pdHRlZCIpICBOb3Qgc28hICBXb3JrYXJvdW5kIHVzZXMgbkNTeCBwaW5zIGFzIEdQSU9zOyBvciBuZXdlcgorICogY29udHJvbGxlcnMgaGF2ZSBDU0FBVCBhbmQgZnJpZW5kcy4KKyAqCisgKiBTaW5jZSB0aGUgQ1NBQVQgZnVuY3Rpb25hbGl0eSBpcyBhIGJpdCB3ZWlyZCBvbiBuZXdlciBjb250cm9sbGVycyBhcworICogd2VsbCwgd2UgdXNlIEdQSU8gdG8gY29udHJvbCBuQ1N4IHBpbnMgb24gYWxsIGNvbnRyb2xsZXJzLCB1cGRhdGluZworICogTVIuUENTIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUgY29udHJvbGxlci4gIFVzaW5nIEdQSU9zIGFsc28gbGV0cyB1cworICogc3VwcG9ydCBhY3RpdmUtaGlnaCBjaGlwc2VsZWN0cyBkZXNwaXRlIHRoZSBjb250cm9sbGVyJ3MgYmVsaWVmIHRoYXQKKyAqIG9ubHkgYWN0aXZlLWxvdyBkZXZpY2VzL3N5c3RlbXMgZXhpc3RzLgorICoKKyAqIEhvd2V2ZXIsIGF0OTFybTkyMDAgaGFzIGEgc2Vjb25kIGVycmF0dW0gd2hlcmVieSBuQ1MwIGRvZXNuJ3Qgd29yaworICogcmlnaHQgd2hlbiBkcml2ZW4gd2l0aCBHUElPLiAgKCJNb2RlIEZhdWx0IGRvZXMgbm90IGFsbG93IG1vcmUgdGhhbiBvbmUKKyAqIE1hc3RlciBvbiBDaGlwIFNlbGVjdCAwLiIpICBObyB3b3JrYXJvdW5kIGV4aXN0cyBmb3IgdGhhdCAuLi4gc28gZm9yCisgKiBuQ1MwIG9uIHRoYXQgY2hpcCwgd2UgKGEpIGRvbid0IHVzZSB0aGUgR1BJTywgKGIpIGNhbid0IHN1cHBvcnQgQ1NfSElHSCwKKyAqIGFuZCAoYykgd2lsbCB0cmlnZ2VyIHRoYXQgZmlyc3QgZXJyYXR1bSBpbiBzb21lIGNhc2VzLgorICoKKyAqIFRPRE86IFRlc3QgaWYgdGhlIGF0bWVsX3NwaV9pc192MigpIGJyYW5jaCBiZWxvdyB3b3JrcyBvbgorICogQVQ5MVJNOTIwMCBpZiB3ZSB1c2Ugc29tZSBvdGhlciByZWdpc3RlciB0aGFuIENTUjAuIEhvd2V2ZXIsIGRvbid0CisgKiBkbyB0aGlzIHVuY29uZGl0aW9uYWxseSBzaW5jZSBBUDcwMDAgaGFzIGFuIGVycmF0YSB3aGVyZSB0aGUgQklUUworICogZmllbGQgaW4gQ1NSMCBvdmVycmlkZXMgYWxsIG90aGVyIENTUnMuCisgKi8KKworc3RhdGljIHZvaWQgY3NfYWN0aXZhdGUoc3RydWN0IGF0bWVsX3NwaSAqYXMsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UgKmFzZCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwl1bnNpZ25lZCBhY3RpdmUgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKKwl1MzIgbXI7CisKKwlpZiAoYXRtZWxfc3BpX2lzX3YyKCkpIHsKKwkJLyoKKwkJICogQWx3YXlzIHVzZSBDU1IwLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgY2xvY2sKKwkJICogc3dpdGNoZXMgdG8gdGhlIGNvcnJlY3QgaWRsZSBwb2xhcml0eSBiZWZvcmUgd2UKKwkJICogdG9nZ2xlIHRoZSBDUy4KKwkJICovCisJCXNwaV93cml0ZWwoYXMsIENTUjAsIGFzZC0+Y3NyKTsKKwkJc3BpX3dyaXRlbChhcywgTVIsIFNQSV9CRihQQ1MsIDB4MGUpIHwgU1BJX0JJVChNT0RGRElTKQorCQkJCXwgU1BJX0JJVChNU1RSKSk7CisJCW1yID0gc3BpX3JlYWRsKGFzLCBNUik7CisJCWdwaW9fc2V0X3ZhbHVlKGFzZC0+bnBjc19waW4sIGFjdGl2ZSk7CisJfSBlbHNlIHsKKwkJdTMyIGNwb2wgPSAoc3BpLT5tb2RlICYgU1BJX0NQT0wpID8gU1BJX0JJVChDUE9MKSA6IDA7CisJCWludCBpOworCQl1MzIgY3NyOworCisJCS8qIE1ha2Ugc3VyZSBjbG9jayBwb2xhcml0eSBpcyBjb3JyZWN0ICovCisJCWZvciAoaSA9IDA7IGkgPCBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykgeworCQkJY3NyID0gc3BpX3JlYWRsKGFzLCBDU1IwICsgNCAqIGkpOworCQkJaWYgKChjc3IgXiBjcG9sKSAmIFNQSV9CSVQoQ1BPTCkpCisJCQkJc3BpX3dyaXRlbChhcywgQ1NSMCArIDQgKiBpLAorCQkJCQkJY3NyIF4gU1BJX0JJVChDUE9MKSk7CisJCX0KKworCQltciA9IHNwaV9yZWFkbChhcywgTVIpOworCQltciA9IFNQSV9CRklOUyhQQ1MsIH4oMSA8PCBzcGktPmNoaXBfc2VsZWN0KSwgbXIpOworCQlpZiAoc3BpLT5jaGlwX3NlbGVjdCAhPSAwKQorCQkJZ3Bpb19zZXRfdmFsdWUoYXNkLT5ucGNzX3BpbiwgYWN0aXZlKTsKKwkJc3BpX3dyaXRlbChhcywgTVIsIG1yKTsKKwl9CisKKwlkZXZfZGJnKCZzcGktPmRldiwgImFjdGl2YXRlICV1JXMsIG1yICUwOHhcbiIsCisJCQlhc2QtPm5wY3NfcGluLCBhY3RpdmUgPyAiIChoaWdoKSIgOiAiIiwKKwkJCW1yKTsKK30KKworc3RhdGljIHZvaWQgY3NfZGVhY3RpdmF0ZShzdHJ1Y3QgYXRtZWxfc3BpICphcywgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZSAqYXNkID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXVuc2lnbmVkIGFjdGl2ZSA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIOworCXUzMiBtcjsKKworCS8qIG9ubHkgZGVhY3RpdmF0ZSAqdGhpcyogZGV2aWNlOyBzb21ldGltZXMgdHJhbnNmZXJzIHRvCisJICogYW5vdGhlciBkZXZpY2UgbWF5IGJlIGFjdGl2ZSB3aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQuCisJICovCisJbXIgPSBzcGlfcmVhZGwoYXMsIE1SKTsKKwlpZiAoflNQSV9CRkVYVChQQ1MsIG1yKSAmICgxIDw8IHNwaS0+Y2hpcF9zZWxlY3QpKSB7CisJCW1yID0gU1BJX0JGSU5TKFBDUywgMHhmLCBtcik7CisJCXNwaV93cml0ZWwoYXMsIE1SLCBtcik7CisJfQorCisJZGV2X2RiZygmc3BpLT5kZXYsICJERWFjdGl2YXRlICV1JXMsIG1yICUwOHhcbiIsCisJCQlhc2QtPm5wY3NfcGluLCBhY3RpdmUgPyAiIChsb3cpIiA6ICIiLAorCQkJbXIpOworCisJaWYgKGF0bWVsX3NwaV9pc192MigpIHx8IHNwaS0+Y2hpcF9zZWxlY3QgIT0gMCkKKwkJZ3Bpb19zZXRfdmFsdWUoYXNkLT5ucGNzX3BpbiwgIWFjdGl2ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0bWVsX3NwaV94ZmVyX2lzX2xhc3Qoc3RydWN0IHNwaV9tZXNzYWdlICptc2csCisJCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJcmV0dXJuIG1zZy0+dHJhbnNmZXJzLnByZXYgPT0gJnhmZXItPnRyYW5zZmVyX2xpc3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0bWVsX3NwaV94ZmVyX2Nhbl9iZV9jaGFpbmVkKHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJcmV0dXJuIHhmZXItPmRlbGF5X3VzZWNzID09IDAgJiYgIXhmZXItPmNzX2NoYW5nZTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfc3BpX25leHRfeGZlcl9kYXRhKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciwKKwkJCQlkbWFfYWRkcl90ICp0eF9kbWEsCisJCQkJZG1hX2FkZHJfdCAqcnhfZG1hLAorCQkJCXUzMiAqcGxlbikKK3sKKwlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl1MzIJCQlsZW4gPSAqcGxlbjsKKworCS8qIHVzZSBzY3JhdGNoIGJ1ZmZlciBvbmx5IHdoZW4gcnggb3IgdHggZGF0YSBpcyB1bnNwZWNpZmllZCAqLworCWlmICh4ZmVyLT5yeF9idWYpCisJCSpyeF9kbWEgPSB4ZmVyLT5yeF9kbWEgKyB4ZmVyLT5sZW4gLSAqcGxlbjsKKwllbHNlIHsKKwkJKnJ4X2RtYSA9IGFzLT5idWZmZXJfZG1hOworCQlpZiAobGVuID4gQlVGRkVSX1NJWkUpCisJCQlsZW4gPSBCVUZGRVJfU0laRTsKKwl9CisJaWYgKHhmZXItPnR4X2J1ZikKKwkJKnR4X2RtYSA9IHhmZXItPnR4X2RtYSArIHhmZXItPmxlbiAtICpwbGVuOworCWVsc2UgeworCQkqdHhfZG1hID0gYXMtPmJ1ZmZlcl9kbWE7CisJCWlmIChsZW4gPiBCVUZGRVJfU0laRSkKKwkJCWxlbiA9IEJVRkZFUl9TSVpFOworCQltZW1zZXQoYXMtPmJ1ZmZlciwgMCwgbGVuKTsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoJmFzLT5wZGV2LT5kZXYsCisJCQkJYXMtPmJ1ZmZlcl9kbWEsIGxlbiwgRE1BX1RPX0RFVklDRSk7CisJfQorCisJKnBsZW4gPSBsZW47Cit9CisKKy8qCisgKiBTdWJtaXQgbmV4dCB0cmFuc2ZlciBmb3IgRE1BLgorICogbG9jayBpcyBoZWxkLCBzcGkgaXJxIGlzIGJsb2NrZWQKKyAqLworc3RhdGljIHZvaWQgYXRtZWxfc3BpX25leHRfeGZlcihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBhdG1lbF9zcGkJKmFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJKnhmZXI7CisJdTMyCQkJbGVuLCByZW1haW5pbmc7CisJdTMyCQkJaWV2YWw7CisJZG1hX2FkZHJfdAkJdHhfZG1hLCByeF9kbWE7CisKKwlpZiAoIWFzLT5jdXJyZW50X3RyYW5zZmVyKQorCQl4ZmVyID0gbGlzdF9lbnRyeShtc2ctPnRyYW5zZmVycy5uZXh0LAorCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOworCWVsc2UgaWYgKCFhcy0+bmV4dF90cmFuc2ZlcikKKwkJeGZlciA9IGxpc3RfZW50cnkoYXMtPmN1cnJlbnRfdHJhbnNmZXItPnRyYW5zZmVyX2xpc3QubmV4dCwKKwkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLCB0cmFuc2Zlcl9saXN0KTsKKwllbHNlCisJCXhmZXIgPSBOVUxMOworCisJaWYgKHhmZXIpIHsKKwkJc3BpX3dyaXRlbChhcywgUFRDUiwgU1BJX0JJVChSWFRESVMpIHwgU1BJX0JJVChUWFRESVMpKTsKKworCQlsZW4gPSB4ZmVyLT5sZW47CisJCWF0bWVsX3NwaV9uZXh0X3hmZXJfZGF0YShtYXN0ZXIsIHhmZXIsICZ0eF9kbWEsICZyeF9kbWEsICZsZW4pOworCQlyZW1haW5pbmcgPSB4ZmVyLT5sZW4gLSBsZW47CisKKwkJc3BpX3dyaXRlbChhcywgUlBSLCByeF9kbWEpOworCQlzcGlfd3JpdGVsKGFzLCBUUFIsIHR4X2RtYSk7CisKKwkJaWYgKG1zZy0+c3BpLT5iaXRzX3Blcl93b3JkID4gOCkKKwkJCWxlbiA+Pj0gMTsKKwkJc3BpX3dyaXRlbChhcywgUkNSLCBsZW4pOworCQlzcGlfd3JpdGVsKGFzLCBUQ1IsIGxlbik7CisKKwkJZGV2X2RiZygmbXNnLT5zcGktPmRldiwKKwkJCSIgIHN0YXJ0IHhmZXIgJXA6IGxlbiAldSB0eCAlcC8lMDh4IHJ4ICVwLyUwOHhcbiIsCisJCQl4ZmVyLCB4ZmVyLT5sZW4sIHhmZXItPnR4X2J1ZiwgeGZlci0+dHhfZG1hLAorCQkJeGZlci0+cnhfYnVmLCB4ZmVyLT5yeF9kbWEpOworCX0gZWxzZSB7CisJCXhmZXIgPSBhcy0+bmV4dF90cmFuc2ZlcjsKKwkJcmVtYWluaW5nID0gYXMtPm5leHRfcmVtYWluaW5nX2J5dGVzOworCX0KKworCWFzLT5jdXJyZW50X3RyYW5zZmVyID0geGZlcjsKKwlhcy0+Y3VycmVudF9yZW1haW5pbmdfYnl0ZXMgPSByZW1haW5pbmc7CisKKwlpZiAocmVtYWluaW5nID4gMCkKKwkJbGVuID0gcmVtYWluaW5nOworCWVsc2UgaWYgKCFhdG1lbF9zcGlfeGZlcl9pc19sYXN0KG1zZywgeGZlcikKKwkJCSYmIGF0bWVsX3NwaV94ZmVyX2Nhbl9iZV9jaGFpbmVkKHhmZXIpKSB7CisJCXhmZXIgPSBsaXN0X2VudHJ5KHhmZXItPnRyYW5zZmVyX2xpc3QubmV4dCwKKwkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLCB0cmFuc2Zlcl9saXN0KTsKKwkJbGVuID0geGZlci0+bGVuOworCX0gZWxzZQorCQl4ZmVyID0gTlVMTDsKKworCWFzLT5uZXh0X3RyYW5zZmVyID0geGZlcjsKKworCWlmICh4ZmVyKSB7CisJCXUzMgl0b3RhbDsKKworCQl0b3RhbCA9IGxlbjsKKwkJYXRtZWxfc3BpX25leHRfeGZlcl9kYXRhKG1hc3RlciwgeGZlciwgJnR4X2RtYSwgJnJ4X2RtYSwgJmxlbik7CisJCWFzLT5uZXh0X3JlbWFpbmluZ19ieXRlcyA9IHRvdGFsIC0gbGVuOworCisJCXNwaV93cml0ZWwoYXMsIFJOUFIsIHJ4X2RtYSk7CisJCXNwaV93cml0ZWwoYXMsIFROUFIsIHR4X2RtYSk7CisKKwkJaWYgKG1zZy0+c3BpLT5iaXRzX3Blcl93b3JkID4gOCkKKwkJCWxlbiA+Pj0gMTsKKwkJc3BpX3dyaXRlbChhcywgUk5DUiwgbGVuKTsKKwkJc3BpX3dyaXRlbChhcywgVE5DUiwgbGVuKTsKKworCQlkZXZfZGJnKCZtc2ctPnNwaS0+ZGV2LAorCQkJIiAgbmV4dCB4ZmVyICVwOiBsZW4gJXUgdHggJXAvJTA4eCByeCAlcC8lMDh4XG4iLAorCQkJeGZlciwgeGZlci0+bGVuLCB4ZmVyLT50eF9idWYsIHhmZXItPnR4X2RtYSwKKwkJCXhmZXItPnJ4X2J1ZiwgeGZlci0+cnhfZG1hKTsKKwkJaWV2YWwgPSBTUElfQklUKEVORFJYKSB8IFNQSV9CSVQoT1ZSRVMpOworCX0gZWxzZSB7CisJCXNwaV93cml0ZWwoYXMsIFJOQ1IsIDApOworCQlzcGlfd3JpdGVsKGFzLCBUTkNSLCAwKTsKKwkJaWV2YWwgPSBTUElfQklUKFJYQlVGRikgfCBTUElfQklUKEVORFJYKSB8IFNQSV9CSVQoT1ZSRVMpOworCX0KKworCS8qIFJFVklTSVQ6IFdlJ3JlIHdhaXRpbmcgZm9yIEVORFJYIGJlZm9yZSB3ZSBzdGFydCB0aGUgbmV4dAorCSAqIHRyYW5zZmVyIGJlY2F1c2Ugd2UgbmVlZCB0byBoYW5kbGUgc29tZSBkaWZmaWN1bHQgdGltaW5nCisJICogaXNzdWVzIG90aGVyd2lzZS4gSWYgd2Ugd2FpdCBmb3IgRU5EVFggaW4gb25lIHRyYW5zZmVyIGFuZAorCSAqIHRoZW4gc3RhcnRzIHdhaXRpbmcgZm9yIEVORFJYIGluIHRoZSBuZXh0LCBpdCdzIGRpZmZpY3VsdAorCSAqIHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgRU5EUlggaW50ZXJydXB0IHdlJ3JlCisJICogYWN0dWFsbHkgd2FpdGluZyBmb3IgYW5kIHRoZSBFTkRSWCBpbnRlcnJ1cHQgb2YgdGhlCisJICogcHJldmlvdXMgdHJhbnNmZXIuCisJICoKKwkgKiBJdCBzaG91bGQgYmUgZG9hYmxlLCB0aG91Z2guIEp1c3Qgbm90IG5vdy4uLgorCSAqLworCXNwaV93cml0ZWwoYXMsIElFUiwgaWV2YWwpOworCXNwaV93cml0ZWwoYXMsIFBUQ1IsIFNQSV9CSVQoVFhURU4pIHwgU1BJX0JJVChSWFRFTikpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zcGlfbmV4dF9tZXNzYWdlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJc3RydWN0IGF0bWVsX3NwaQkqYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJc3RydWN0IHNwaV9tZXNzYWdlCSptc2c7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKKworCUJVR19PTihhcy0+Y3VycmVudF90cmFuc2Zlcik7CisKKwltc2cgPSBsaXN0X2VudHJ5KGFzLT5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsIHF1ZXVlKTsKKwlzcGkgPSBtc2ctPnNwaTsKKworCWRldl9kYmcobWFzdGVyLT5kZXYucGFyZW50LCAic3RhcnQgbWVzc2FnZSAlcCBmb3IgJXNcbiIsCisJCQltc2csIGRldl9uYW1lKCZzcGktPmRldikpOworCisJLyogc2VsZWN0IGNoaXAgaWYgaXQncyBub3Qgc3RpbGwgYWN0aXZlICovCisJaWYgKGFzLT5zdGF5KSB7CisJCWlmIChhcy0+c3RheSAhPSBzcGkpIHsKKwkJCWNzX2RlYWN0aXZhdGUoYXMsIGFzLT5zdGF5KTsKKwkJCWNzX2FjdGl2YXRlKGFzLCBzcGkpOworCQl9CisJCWFzLT5zdGF5ID0gTlVMTDsKKwl9IGVsc2UKKwkJY3NfYWN0aXZhdGUoYXMsIHNwaSk7CisKKwlhdG1lbF9zcGlfbmV4dF94ZmVyKG1hc3RlciwgbXNnKTsKK30KKworLyoKKyAqIEZvciBETUEsIHR4X2J1Zi90eF9kbWEgaGF2ZSB0aGUgc2FtZSByZWxhdGlvbnNoaXAgYXMgcnhfYnVmL3J4X2RtYToKKyAqICAtIFRoZSBidWZmZXIgaXMgZWl0aGVyIHZhbGlkIGZvciBDUFUgYWNjZXNzLCBlbHNlIE5VTEwKKyAqICAtIElmIHRoZSBidWZmZXIgaXMgdmFsaWQsIHNvIGlzIGl0cyBETUEgYWRkcmVzcworICoKKyAqIFRoaXMgZHJpdmVyIG1hbmFnZXMgdGhlIGRtYSBhZGRyZXNzIHVubGVzcyBtZXNzYWdlLT5pc19kbWFfbWFwcGVkLgorICovCitzdGF0aWMgaW50CithdG1lbF9zcGlfZG1hX21hcF94ZmVyKHN0cnVjdCBhdG1lbF9zcGkgKmFzLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXN0cnVjdCBkZXZpY2UJKmRldiA9ICZhcy0+cGRldi0+ZGV2OworCisJeGZlci0+dHhfZG1hID0geGZlci0+cnhfZG1hID0gSU5WQUxJRF9ETUFfQUREUkVTUzsKKwlpZiAoeGZlci0+dHhfYnVmKSB7CisJCS8qIHR4X2J1ZiBpcyBhIGNvbnN0IHZvaWQqIHdoZXJlIHdlIG5lZWQgYSB2b2lkICogZm9yIHRoZSBkbWEKKwkJICogbWFwcGluZyAqLworCQl2b2lkICpub25jb25zdF90eCA9ICh2b2lkICopeGZlci0+dHhfYnVmOworCisJCXhmZXItPnR4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwKKwkJCQlub25jb25zdF90eCwgeGZlci0+bGVuLAorCQkJCURNQV9UT19ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCB4ZmVyLT50eF9kbWEpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICh4ZmVyLT5yeF9idWYpIHsKKwkJeGZlci0+cnhfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LAorCQkJCXhmZXItPnJ4X2J1ZiwgeGZlci0+bGVuLAorCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIHhmZXItPnJ4X2RtYSkpIHsKKwkJCWlmICh4ZmVyLT50eF9idWYpCisJCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsCisJCQkJCQl4ZmVyLT50eF9kbWEsIHhmZXItPmxlbiwKKwkJCQkJCURNQV9UT19ERVZJQ0UpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3NwaV9kbWFfdW5tYXBfeGZlcihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlpZiAoeGZlci0+dHhfZG1hICE9IElOVkFMSURfRE1BX0FERFJFU1MpCisJCWRtYV91bm1hcF9zaW5nbGUobWFzdGVyLT5kZXYucGFyZW50LCB4ZmVyLT50eF9kbWEsCisJCQkJIHhmZXItPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJaWYgKHhmZXItPnJ4X2RtYSAhPSBJTlZBTElEX0RNQV9BRERSRVNTKQorCQlkbWFfdW5tYXBfc2luZ2xlKG1hc3Rlci0+ZGV2LnBhcmVudCwgeGZlci0+cnhfZG1hLAorCQkJCSB4ZmVyLT5sZW4sIERNQV9GUk9NX0RFVklDRSk7Cit9CisKK3N0YXRpYyB2b2lkCithdG1lbF9zcGlfbXNnX2RvbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IGF0bWVsX3NwaSAqYXMsCisJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnLCBpbnQgc3RhdHVzLCBpbnQgc3RheSkKK3sKKwlpZiAoIXN0YXkgfHwgc3RhdHVzIDwgMCkKKwkJY3NfZGVhY3RpdmF0ZShhcywgbXNnLT5zcGkpOworCWVsc2UKKwkJYXMtPnN0YXkgPSBtc2ctPnNwaTsKKworCWxpc3RfZGVsKCZtc2ctPnF1ZXVlKTsKKwltc2ctPnN0YXR1cyA9IHN0YXR1czsKKworCWRldl9kYmcobWFzdGVyLT5kZXYucGFyZW50LAorCQkieGZlciBjb21wbGV0ZTogJXUgYnl0ZXMgdHJhbnNmZXJyZWRcbiIsCisJCW1zZy0+YWN0dWFsX2xlbmd0aCk7CisKKwlzcGluX3VubG9jaygmYXMtPmxvY2spOworCW1zZy0+Y29tcGxldGUobXNnLT5jb250ZXh0KTsKKwlzcGluX2xvY2soJmFzLT5sb2NrKTsKKworCWFzLT5jdXJyZW50X3RyYW5zZmVyID0gTlVMTDsKKwlhcy0+bmV4dF90cmFuc2ZlciA9IE5VTEw7CisKKwkvKiBjb250aW51ZSBpZiBuZWVkZWQgKi8KKwlpZiAobGlzdF9lbXB0eSgmYXMtPnF1ZXVlKSB8fCBhcy0+c3RvcHBpbmcpCisJCXNwaV93cml0ZWwoYXMsIFBUQ1IsIFNQSV9CSVQoUlhURElTKSB8IFNQSV9CSVQoVFhURElTKSk7CisJZWxzZQorCQlhdG1lbF9zcGlfbmV4dF9tZXNzYWdlKG1hc3Rlcik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorYXRtZWxfc3BpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlciA9IGRldl9pZDsKKwlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJKm1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp4ZmVyOworCXUzMgkJCXN0YXR1cywgcGVuZGluZywgaW1yOworCWludAkJCXJldCA9IElSUV9OT05FOworCisJc3Bpbl9sb2NrKCZhcy0+bG9jayk7CisKKwl4ZmVyID0gYXMtPmN1cnJlbnRfdHJhbnNmZXI7CisJbXNnID0gbGlzdF9lbnRyeShhcy0+cXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7CisKKwlpbXIgPSBzcGlfcmVhZGwoYXMsIElNUik7CisJc3RhdHVzID0gc3BpX3JlYWRsKGFzLCBTUik7CisJcGVuZGluZyA9IHN0YXR1cyAmIGltcjsKKworCWlmIChwZW5kaW5nICYgU1BJX0JJVChPVlJFUykpIHsKKwkJaW50IHRpbWVvdXQ7CisKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwkJc3BpX3dyaXRlbChhcywgSURSLCAoU1BJX0JJVChSWEJVRkYpIHwgU1BJX0JJVChFTkRSWCkKKwkJCQkgICAgIHwgU1BJX0JJVChPVlJFUykpKTsKKworCQkvKgorCQkgKiBXaGVuIHdlIGdldCBhbiBvdmVycnVuLCB3ZSBkaXNyZWdhcmQgdGhlIGN1cnJlbnQKKwkJICogdHJhbnNmZXIuIERhdGEgd2lsbCBub3QgYmUgY29waWVkIGJhY2sgZnJvbSBhbnkKKwkJICogYm91bmNlIGJ1ZmZlciBhbmQgbXNnLT5hY3R1YWxfbGVuIHdpbGwgbm90IGJlCisJCSAqIHVwZGF0ZWQgd2l0aCB0aGUgbGFzdCB4ZmVyLgorCQkgKgorCQkgKiBXZSB3aWxsIGFsc28gbm90IHByb2Nlc3MgYW55IHJlbWFuaW5nIHRyYW5zZmVycyBpbgorCQkgKiB0aGUgbWVzc2FnZS4KKwkJICoKKwkJICogRmlyc3QsIHN0b3AgdGhlIHRyYW5zZmVyIGFuZCB1bm1hcCB0aGUgRE1BIGJ1ZmZlcnMuCisJCSAqLworCQlzcGlfd3JpdGVsKGFzLCBQVENSLCBTUElfQklUKFJYVERJUykgfCBTUElfQklUKFRYVERJUykpOworCQlpZiAoIW1zZy0+aXNfZG1hX21hcHBlZCkKKwkJCWF0bWVsX3NwaV9kbWFfdW5tYXBfeGZlcihtYXN0ZXIsIHhmZXIpOworCisJCS8qIFJFVklTSVQ6IHVkZWxheSBpbiBpcnEgaXMgdW5mcmllbmRseSAqLworCQlpZiAoeGZlci0+ZGVsYXlfdXNlY3MpCisJCQl1ZGVsYXkoeGZlci0+ZGVsYXlfdXNlY3MpOworCisJCWRldl93YXJuKG1hc3Rlci0+ZGV2LnBhcmVudCwgIm92ZXJydW4gKCV1LyV1IHJlbWFpbmluZylcbiIsCisJCQkgc3BpX3JlYWRsKGFzLCBUQ1IpLCBzcGlfcmVhZGwoYXMsIFJDUikpOworCisJCS8qCisJCSAqIENsZWFuIHVwIERNQSByZWdpc3RlcnMgYW5kIG1ha2Ugc3VyZSB0aGUgZGF0YQorCQkgKiByZWdpc3RlcnMgYXJlIGVtcHR5LgorCQkgKi8KKwkJc3BpX3dyaXRlbChhcywgUk5DUiwgMCk7CisJCXNwaV93cml0ZWwoYXMsIFROQ1IsIDApOworCQlzcGlfd3JpdGVsKGFzLCBSQ1IsIDApOworCQlzcGlfd3JpdGVsKGFzLCBUQ1IsIDApOworCQlmb3IgKHRpbWVvdXQgPSAxMDAwOyB0aW1lb3V0OyB0aW1lb3V0LS0pCisJCQlpZiAoc3BpX3JlYWRsKGFzLCBTUikgJiBTUElfQklUKFRYRU1QVFkpKQorCQkJCWJyZWFrOworCQlpZiAoIXRpbWVvdXQpCisJCQlkZXZfd2FybihtYXN0ZXItPmRldi5wYXJlbnQsCisJCQkJICJ0aW1lb3V0IHdhaXRpbmcgZm9yIFRYRU1QVFkiKTsKKwkJd2hpbGUgKHNwaV9yZWFkbChhcywgU1IpICYgU1BJX0JJVChSRFJGKSkKKwkJCXNwaV9yZWFkbChhcywgUkRSKTsKKworCQkvKiBDbGVhciBhbnkgb3ZlcnJ1biBoYXBwZW5pbmcgd2hpbGUgY2xlYW5pbmcgdXAgKi8KKwkJc3BpX3JlYWRsKGFzLCBTUik7CisKKwkJYXRtZWxfc3BpX21zZ19kb25lKG1hc3RlciwgYXMsIG1zZywgLUVJTywgMCk7CisJfSBlbHNlIGlmIChwZW5kaW5nICYgKFNQSV9CSVQoUlhCVUZGKSB8IFNQSV9CSVQoRU5EUlgpKSkgeworCQlyZXQgPSBJUlFfSEFORExFRDsKKworCQlzcGlfd3JpdGVsKGFzLCBJRFIsIHBlbmRpbmcpOworCisJCWlmIChhcy0+Y3VycmVudF9yZW1haW5pbmdfYnl0ZXMgPT0gMCkgeworCQkJbXNnLT5hY3R1YWxfbGVuZ3RoICs9IHhmZXItPmxlbjsKKworCQkJaWYgKCFtc2ctPmlzX2RtYV9tYXBwZWQpCisJCQkJYXRtZWxfc3BpX2RtYV91bm1hcF94ZmVyKG1hc3RlciwgeGZlcik7CisKKwkJCS8qIFJFVklTSVQ6IHVkZWxheSBpbiBpcnEgaXMgdW5mcmllbmRseSAqLworCQkJaWYgKHhmZXItPmRlbGF5X3VzZWNzKQorCQkJCXVkZWxheSh4ZmVyLT5kZWxheV91c2Vjcyk7CisKKwkJCWlmIChhdG1lbF9zcGlfeGZlcl9pc19sYXN0KG1zZywgeGZlcikpIHsKKwkJCQkvKiByZXBvcnQgY29tcGxldGVkIG1lc3NhZ2UgKi8KKwkJCQlhdG1lbF9zcGlfbXNnX2RvbmUobWFzdGVyLCBhcywgbXNnLCAwLAorCQkJCQkJeGZlci0+Y3NfY2hhbmdlKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHhmZXItPmNzX2NoYW5nZSkgeworCQkJCQljc19kZWFjdGl2YXRlKGFzLCBtc2ctPnNwaSk7CisJCQkJCXVkZWxheSgxKTsKKwkJCQkJY3NfYWN0aXZhdGUoYXMsIG1zZy0+c3BpKTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIE5vdCBkb25lIHlldC4gU3VibWl0IHRoZSBuZXh0IHRyYW5zZmVyLgorCQkJCSAqCisJCQkJICogRklYTUUgaGFuZGxlIHByb3RvY29sIG9wdGlvbnMgZm9yIHhmZXIKKwkJCQkgKi8KKwkJCQlhdG1lbF9zcGlfbmV4dF94ZmVyKG1hc3RlciwgbXNnKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBLZWVwIGdvaW5nLCB3ZSBzdGlsbCBoYXZlIGRhdGEgdG8gc2VuZCBpbgorCQkJICogdGhlIGN1cnJlbnQgdHJhbnNmZXIuCisJCQkgKi8KKwkJCWF0bWVsX3NwaV9uZXh0X3hmZXIobWFzdGVyLCBtc2cpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmFzLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGF0bWVsX3NwaQkqYXM7CisJc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UJKmFzZDsKKwl1MzIJCQlzY2JyLCBjc3I7CisJdW5zaWduZWQgaW50CQliaXRzID0gc3BpLT5iaXRzX3Blcl93b3JkOworCXVuc2lnbmVkIGxvbmcJCWJ1c19oejsKKwl1bnNpZ25lZCBpbnQJCW5wY3NfcGluOworCWludAkJCXJldDsKKworCWFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlpZiAoYXMtPnN0b3BwaW5nKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCWlmIChzcGktPmNoaXBfc2VsZWN0ID4gc3BpLT5tYXN0ZXItPm51bV9jaGlwc2VsZWN0KSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LAorCQkJCSJzZXR1cDogaW52YWxpZCBjaGlwc2VsZWN0ICV1ICgldSBkZWZpbmVkKVxuIiwKKwkJCQlzcGktPmNoaXBfc2VsZWN0LCBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYml0cyA8IDggfHwgYml0cyA+IDE2KSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LAorCQkJCSJzZXR1cDogaW52YWxpZCBiaXRzX3Blcl93b3JkICV1ICg4IHRvIDE2KVxuIiwKKwkJCQliaXRzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc2VlIG5vdGVzIGFib3ZlIHJlIGNoaXBzZWxlY3QgKi8KKwlpZiAoIWF0bWVsX3NwaV9pc192MigpCisJCQkmJiBzcGktPmNoaXBfc2VsZWN0ID09IDAKKwkJCSYmIChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogY2FuJ3QgYmUgYWN0aXZlLWhpZ2hcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB2MSBjaGlwcyBzdGFydCBvdXQgYXQgaGFsZiB0aGUgcGVyaXBoZXJhbCBidXMgc3BlZWQuICovCisJYnVzX2h6ID0gY2xrX2dldF9yYXRlKGFzLT5jbGspOworCWlmICghYXRtZWxfc3BpX2lzX3YyKCkpCisJCWJ1c19oeiAvPSAyOworCisJaWYgKHNwaS0+bWF4X3NwZWVkX2h6KSB7CisJCS8qCisJCSAqIENhbGN1bGF0ZSB0aGUgbG93ZXN0IGRpdmlkZXIgdGhhdCBzYXRpc2ZpZXMgdGhlCisJCSAqIGNvbnN0cmFpbnQsIGFzc3VtaW5nIGRpdjMyL2ZkaXYvbWJ6ID09IDAuCisJCSAqLworCQlzY2JyID0gRElWX1JPVU5EX1VQKGJ1c19oeiwgc3BpLT5tYXhfc3BlZWRfaHopOworCisJCS8qCisJCSAqIElmIHRoZSByZXN1bHRpbmcgZGl2aWRlciBkb2Vzbid0IGZpdCBpbnRvIHRoZQorCQkgKiByZWdpc3RlciBiaXRmaWVsZCwgd2UgY2FuJ3Qgc2F0aXNmeSB0aGUgY29uc3RyYWludC4KKwkJICovCisJCWlmIChzY2JyID49ICgxIDw8IFNQSV9TQ0JSX1NJWkUpKSB7CisJCQlkZXZfZGJnKCZzcGktPmRldiwKKwkJCQkic2V0dXA6ICVkIEh6IHRvbyBzbG93LCBzY2JyICV1OyBtaW4gJWxkIEh6XG4iLAorCQkJCXNwaS0+bWF4X3NwZWVkX2h6LCBzY2JyLCBidXNfaHovMjU1KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlCisJCS8qIHNwZWVkIHplcm8gbWVhbnMgImFzIHNsb3cgYXMgcG9zc2libGUiICovCisJCXNjYnIgPSAweGZmOworCisJY3NyID0gU1BJX0JGKFNDQlIsIHNjYnIpIHwgU1BJX0JGKEJJVFMsIGJpdHMgLSA4KTsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCWNzciB8PSBTUElfQklUKENQT0wpOworCWlmICghKHNwaS0+bW9kZSAmIFNQSV9DUEhBKSkKKwkJY3NyIHw9IFNQSV9CSVQoTkNQSEEpOworCisJLyogRExZQlMgaXMgbW9zdGx5IGlycmVsZXZhbnQgc2luY2Ugd2UgbWFuYWdlIGNoaXBzZWxlY3QgdXNpbmcgR1BJT3MuCisJICoKKwkgKiBETFlCQ1Qgd291bGQgYWRkIGRlbGF5cyBiZXR3ZWVuIHdvcmRzLCBzbG93aW5nIGRvd24gdHJhbnNmZXJzLgorCSAqIEl0IGNvdWxkIHBvdGVudGlhbGx5IGJlIHVzZWZ1bCB0byBjb3BlIHdpdGggRE1BIGJvdHRsZW5lY2tzLCBidXQKKwkgKiBpbiB0aG9zZSBjYXNlcyBpdCdzIHByb2JhYmx5IGJlc3QgdG8ganVzdCB1c2UgYSBsb3dlciBiaXRyYXRlLgorCSAqLworCWNzciB8PSBTUElfQkYoRExZQlMsIDApOworCWNzciB8PSBTUElfQkYoRExZQkNULCAwKTsKKworCS8qIGNoaXBzZWxlY3QgbXVzdCBoYXZlIGJlZW4gbXV4ZWQgYXMgR1BJTyAoZS5nLiBpbiBib2FyZCBzZXR1cCkgKi8KKwlucGNzX3BpbiA9ICh1bnNpZ25lZCBpbnQpc3BpLT5jb250cm9sbGVyX2RhdGE7CisJYXNkID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCWlmICghYXNkKSB7CisJCWFzZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYXNkKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KG5wY3NfcGluLCBkZXZfbmFtZSgmc3BpLT5kZXYpKTsKKwkJaWYgKHJldCkgeworCQkJa2ZyZWUoYXNkKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlhc2QtPm5wY3NfcGluID0gbnBjc19waW47CisJCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IGFzZDsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG5wY3NfcGluLCAhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFzLT5sb2NrLCBmbGFncyk7CisJCWlmIChhcy0+c3RheSA9PSBzcGkpCisJCQlhcy0+c3RheSA9IE5VTEw7CisJCWNzX2RlYWN0aXZhdGUoYXMsIHNwaSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzLT5sb2NrLCBmbGFncyk7CisJfQorCisJYXNkLT5jc3IgPSBjc3I7CisKKwlkZXZfZGJnKCZzcGktPmRldiwKKwkJInNldHVwOiAlbHUgSHogYnB3ICV1IG1vZGUgMHgleCAtPiBjc3IlZCAlMDh4XG4iLAorCQlidXNfaHogLyBzY2JyLCBiaXRzLCBzcGktPm1vZGUsIHNwaS0+Y2hpcF9zZWxlY3QsIGNzcik7CisKKwlpZiAoIWF0bWVsX3NwaV9pc192MigpKQorCQlzcGlfd3JpdGVsKGFzLCBDU1IwICsgNCAqIHNwaS0+Y2hpcF9zZWxlY3QsIGNzcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IGF0bWVsX3NwaQkqYXM7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkqeGZlcjsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlzdHJ1Y3QgZGV2aWNlCQkqY29udHJvbGxlciA9IHNwaS0+bWFzdGVyLT5kZXYucGFyZW50OworCXU4CQkJYml0czsKKwlzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZQkqYXNkOworCisJYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCWRldl9kYmcoY29udHJvbGxlciwgIm5ldyBtZXNzYWdlICVwIHN1Ym1pdHRlZCBmb3IgJXNcbiIsCisJCQltc2csIGRldl9uYW1lKCZzcGktPmRldikpOworCisJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJm1zZy0+dHJhbnNmZXJzKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFzLT5zdG9wcGluZykKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQlpZiAoISh4ZmVyLT50eF9idWYgfHwgeGZlci0+cnhfYnVmKSAmJiB4ZmVyLT5sZW4pIHsKKwkJCWRldl9kYmcoJnNwaS0+ZGV2LCAibWlzc2luZyByeCBvciB0eCBidWZcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoeGZlci0+Yml0c19wZXJfd29yZCkgeworCQkJYXNkID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCQkJYml0cyA9IChhc2QtPmNzciA+PiA0KSAmIDB4ZjsKKwkJCWlmIChiaXRzICE9IHhmZXItPmJpdHNfcGVyX3dvcmQgLSA4KSB7CisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJ5b3UgY2FuJ3QgeWV0IGNoYW5nZSAiCisJCQkJCSAiYml0c19wZXJfd29yZCBpbiB0cmFuc2ZlcnNcbiIpOworCQkJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJCQl9CisJCX0KKworCQkvKiBGSVhNRSBpbXBsZW1lbnQgdGhlc2UgcHJvdG9jb2wgb3B0aW9ucyEhICovCisJCWlmICh4ZmVyLT5zcGVlZF9oeikgeworCQkJZGV2X2RiZygmc3BpLT5kZXYsICJubyBwcm90b2NvbCBvcHRpb25zIHlldFxuIik7CisJCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCQl9CisKKwkJLyoKKwkJICogRE1BIG1hcCBlYXJseSwgZm9yIHBlcmZvcm1hbmNlIChlbXB0aWVzIGRjYWNoZSBBU0FQKSBhbmQKKwkJICogYmV0dGVyIGZhdWx0IHJlcG9ydGluZy4gIFRoaXMgaXMgYSBETUEtb25seSBkcml2ZXIuCisJCSAqCisJCSAqIE5PVEUgdGhhdCBpZiBkbWFfdW5tYXBfc2luZ2xlKCkgZXZlciBzdGFydHMgdG8gZG8gd29yayBvbgorCQkgKiBwbGF0Zm9ybXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLCB3ZSB3b3VsZCBuZWVkIHRvIGNsZWFuCisJCSAqIHVwIG1hcHBpbmdzIGZvciBwcmV2aW91c2x5LW1hcHBlZCB0cmFuc2ZlcnMuCisJCSAqLworCQlpZiAoIW1zZy0+aXNfZG1hX21hcHBlZCkgeworCQkJaWYgKGF0bWVsX3NwaV9kbWFfbWFwX3hmZXIoYXMsIHhmZXIpIDwgMCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworI2lmZGVmIFZFUkJPU0UKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQlkZXZfZGJnKGNvbnRyb2xsZXIsCisJCQkiICB4ZmVyICVwOiBsZW4gJXUgdHggJXAvJTA4eCByeCAlcC8lMDh4XG4iLAorCQkJeGZlciwgeGZlci0+bGVuLAorCQkJeGZlci0+dHhfYnVmLCB4ZmVyLT50eF9kbWEsCisJCQl4ZmVyLT5yeF9idWYsIHhmZXItPnJ4X2RtYSk7CisJfQorI2VuZGlmCisKKwltc2ctPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwltc2ctPmFjdHVhbF9sZW5ndGggPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFzLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbXNnLT5xdWV1ZSwgJmFzLT5xdWV1ZSk7CisJaWYgKCFhcy0+Y3VycmVudF90cmFuc2ZlcikKKwkJYXRtZWxfc3BpX25leHRfbWVzc2FnZShzcGktPm1hc3Rlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhdG1lbF9zcGkJKmFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UJKmFzZCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwl1bnNpZ25lZAkJZ3BpbyA9ICh1bnNpZ25lZCkgc3BpLT5jb250cm9sbGVyX2RhdGE7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwlpZiAoIWFzZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFzLT5sb2NrLCBmbGFncyk7CisJaWYgKGFzLT5zdGF5ID09IHNwaSkgeworCQlhcy0+c3RheSA9IE5VTEw7CisJCWNzX2RlYWN0aXZhdGUoYXMsIHNwaSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzLT5sb2NrLCBmbGFncyk7CisKKwlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBOVUxMOworCWdwaW9fZnJlZShncGlvKTsKKwlrZnJlZShhc2QpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IF9faW5pdCBhdG1lbF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UJCSpyZWdzOworCWludAkJCWlycTsKKwlzdHJ1Y3QgY2xrCQkqY2xrOworCWludAkJCXJldDsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXN0cnVjdCBhdG1lbF9zcGkJKmFzOworCisJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZWdzKQorCQlyZXR1cm4gLUVOWElPOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInNwaV9jbGsiKTsKKwlpZiAoSVNfRVJSKGNsaykpCisJCXJldHVybiBQVFJfRVJSKGNsayk7CisKKwkvKiBzZXR1cCBzcGkgY29yZSB0aGVuIGF0bWVsLXNwZWNpZmljIGRyaXZlciBzdGF0ZSAqLworCXJldCA9IC1FTk9NRU07CisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YgKmFzKTsKKwlpZiAoIW1hc3RlcikKKwkJZ290byBvdXRfZnJlZTsKKworCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOworCisJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDQ7CisJbWFzdGVyLT5zZXR1cCA9IGF0bWVsX3NwaV9zZXR1cDsKKwltYXN0ZXItPnRyYW5zZmVyID0gYXRtZWxfc3BpX3RyYW5zZmVyOworCW1hc3Rlci0+Y2xlYW51cCA9IGF0bWVsX3NwaV9jbGVhbnVwOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CisKKwlhcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCS8qCisJICogU2NyYXRjaCBidWZmZXIgaXMgdXNlZCBmb3IgdGhyb3dhd2F5IHJ4IGFuZCB0eCBkYXRhLgorCSAqIEl0J3MgY29oZXJlbnQgdG8gbWluaW1pemUgZGNhY2hlIHBvbGx1dGlvbi4KKwkgKi8KKwlhcy0+YnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsIEJVRkZFUl9TSVpFLAorCQkJCQkmYXMtPmJ1ZmZlcl9kbWEsIEdGUF9LRVJORUwpOworCWlmICghYXMtPmJ1ZmZlcikKKwkJZ290byBvdXRfZnJlZTsKKworCXNwaW5fbG9ja19pbml0KCZhcy0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmFzLT5xdWV1ZSk7CisJYXMtPnBkZXYgPSBwZGV2OworCWFzLT5yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZWdzKSk7CisJaWYgKCFhcy0+cmVncykKKwkJZ290byBvdXRfZnJlZV9idWZmZXI7CisJYXMtPmlycSA9IGlycTsKKwlhcy0+Y2xrID0gY2xrOworCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBhdG1lbF9zcGlfaW50ZXJydXB0LCAwLAorCQkJZGV2X25hbWUoJnBkZXYtPmRldiksIG1hc3Rlcik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5tYXBfcmVnczsKKworCS8qIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlICovCisJY2xrX2VuYWJsZShjbGspOworCXNwaV93cml0ZWwoYXMsIENSLCBTUElfQklUKFNXUlNUKSk7CisJc3BpX3dyaXRlbChhcywgQ1IsIFNQSV9CSVQoU1dSU1QpKTsgLyogQVQ5MVNBTTkyNjMgUmV2IEIgd29ya2Fyb3VuZCAqLworCXNwaV93cml0ZWwoYXMsIE1SLCBTUElfQklUKE1TVFIpIHwgU1BJX0JJVChNT0RGRElTKSk7CisJc3BpX3dyaXRlbChhcywgUFRDUiwgU1BJX0JJVChSWFRESVMpIHwgU1BJX0JJVChUWFRESVMpKTsKKwlzcGlfd3JpdGVsKGFzLCBDUiwgU1BJX0JJVChTUElFTikpOworCisJLyogZ28hICovCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkF0bWVsIFNQSSBDb250cm9sbGVyIGF0IDB4JTA4bHggKGlycSAlZClcbiIsCisJCQkodW5zaWduZWQgbG9uZylyZWdzLT5zdGFydCwgaXJxKTsKKworCXJldCA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9yZXNldF9odzsKKworCXJldHVybiAwOworCitvdXRfcmVzZXRfaHc6CisJc3BpX3dyaXRlbChhcywgQ1IsIFNQSV9CSVQoU1dSU1QpKTsKKwlzcGlfd3JpdGVsKGFzLCBDUiwgU1BJX0JJVChTV1JTVCkpOyAvKiBBVDkxU0FNOTI2MyBSZXYgQiB3b3JrYXJvdW5kICovCisJY2xrX2Rpc2FibGUoY2xrKTsKKwlmcmVlX2lycShpcnEsIG1hc3Rlcik7CitvdXRfdW5tYXBfcmVnczoKKwlpb3VubWFwKGFzLT5yZWdzKTsKK291dF9mcmVlX2J1ZmZlcjoKKwlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBCVUZGRVJfU0laRSwgYXMtPmJ1ZmZlciwKKwkJCWFzLT5idWZmZXJfZG1hKTsKK291dF9mcmVlOgorCWNsa19wdXQoY2xrKTsKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGF0bWVsX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0bWVsX3NwaQkqYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJc3RydWN0IHNwaV9tZXNzYWdlCSptc2c7CisKKwkvKiByZXNldCB0aGUgaGFyZHdhcmUgYW5kIGJsb2NrIHF1ZXVlIHByb2dyZXNzICovCisJc3Bpbl9sb2NrX2lycSgmYXMtPmxvY2spOworCWFzLT5zdG9wcGluZyA9IDE7CisJc3BpX3dyaXRlbChhcywgQ1IsIFNQSV9CSVQoU1dSU1QpKTsKKwlzcGlfd3JpdGVsKGFzLCBDUiwgU1BJX0JJVChTV1JTVCkpOyAvKiBBVDkxU0FNOTI2MyBSZXYgQiB3b3JrYXJvdW5kICovCisJc3BpX3JlYWRsKGFzLCBTUik7CisJc3Bpbl91bmxvY2tfaXJxKCZhcy0+bG9jayk7CisKKwkvKiBUZXJtaW5hdGUgcmVtYWluaW5nIHF1ZXVlZCB0cmFuc2ZlcnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1zZywgJmFzLT5xdWV1ZSwgcXVldWUpIHsKKwkJLyogUkVWSVNJVCB1bm1hcHBpbmcgdGhlIGRtYSBpcyBhIE5PUCBvbiBBUk0gYW5kIEFWUjMyCisJCSAqIGJ1dCB3ZSBzaG91bGRuJ3QgZGVwZW5kIG9uIHRoYXQuLi4KKwkJICovCisJCW1zZy0+c3RhdHVzID0gLUVTSFVURE9XTjsKKwkJbXNnLT5jb21wbGV0ZShtc2ctPmNvbnRleHQpOworCX0KKworCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIEJVRkZFUl9TSVpFLCBhcy0+YnVmZmVyLAorCQkJYXMtPmJ1ZmZlcl9kbWEpOworCisJY2xrX2Rpc2FibGUoYXMtPmNsayk7CisJY2xrX3B1dChhcy0+Y2xrKTsKKwlmcmVlX2lycShhcy0+aXJxLCBtYXN0ZXIpOworCWlvdW5tYXAoYXMtPnJlZ3MpOworCisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmCUNPTkZJR19QTQorCitzdGF0aWMgaW50IGF0bWVsX3NwaV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCWNsa19kaXNhYmxlKGFzLT5jbGspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NwaV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0bWVsX3NwaQkqYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwljbGtfZW5hYmxlKGFzLT5jbGspOworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZQlhdG1lbF9zcGlfc3VzcGVuZAlOVUxMCisjZGVmaW5lCWF0bWVsX3NwaV9yZXN1bWUJTlVMTAorI2VuZGlmCisKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXRtZWxfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYXRtZWxfc3BpIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkuc3VzcGVuZAk9IGF0bWVsX3NwaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXRtZWxfc3BpX3Jlc3VtZSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGF0bWVsX3NwaV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXRtZWxfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhdG1lbF9zcGlfZHJpdmVyLCBhdG1lbF9zcGlfcHJvYmUpOworfQorbW9kdWxlX2luaXQoYXRtZWxfc3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRtZWxfc3BpX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXRtZWxfc3BpX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhdG1lbF9zcGlfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQXRtZWwgQVQzMi9BVDkxIFNQSSBDb250cm9sbGVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSGFhdmFyZCBTa2lubmVtb2VuIChBdG1lbCkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YXRtZWxfc3BpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYXUxNTUwLmMgYi9kcml2ZXJzL3NwaS9zcGktYXUxNTUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkZWU1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktYXUxNTUwLmMKQEAgLTAsMCArMSwxMDMyIEBACisvKgorICogYXUxNTUwIHBzYyBzcGkgY29udHJvbGxlciBkcml2ZXIKKyAqIG1heSB3b3JrIGFsc28gd2l0aCBhdTEyMDAsIGF1MTIxMCwgYXUxMjUwCisgKiB3aWxsIG5vdCB3b3JrIG9uIGF1MTAwMCwgYXUxMTAwIGFuZCBhdTE1MDAgKG5vIGZ1bGwgc3BpIGNvbnRyb2xsZXIgdGhlcmUpCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEFUUk9OIGVsZWN0cm9uaWMgR21iSAorICogQXV0aG9yOiBKYW4gTmlraXRlbmtvIDxqYW4ubmlraXRlbmtvQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9wc2MuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxNTUwX3NwaS5oPgorCitzdGF0aWMgdW5zaWduZWQgdXNlZG1hID0gMTsKK21vZHVsZV9wYXJhbSh1c2VkbWEsIHVpbnQsIDA2NDQpOworCisvKgorI2RlZmluZSBBVTE1NTBfU1BJX0RFQlVHX0xPT1BCQUNLCisqLworCisKKyNkZWZpbmUgQVUxNTUwX1NQSV9EQkRNQV9ERVNDUklQVE9SUyAxCisjZGVmaW5lIEFVMTU1MF9TUElfRE1BX1JYVE1QX01JTlNJWkUgMjA0OFUKKworc3RydWN0IGF1MTU1MF9zcGkgeworCXN0cnVjdCBzcGlfYml0YmFuZyBiaXRiYW5nOworCisJdm9sYXRpbGUgcHNjX3NwaV90IF9faW9tZW0gKnJlZ3M7CisJaW50IGlycTsKKwl1bnNpZ25lZCBmcmVxX21heDsKKwl1bnNpZ25lZCBmcmVxX21pbjsKKworCXVuc2lnbmVkIGxlbjsKKwl1bnNpZ25lZCB0eF9jb3VudDsKKwl1bnNpZ25lZCByeF9jb3VudDsKKwljb25zdCB1OCAqdHg7CisJdTggKnJ4OworCisJdm9pZCAoKnJ4X3dvcmQpKHN0cnVjdCBhdTE1NTBfc3BpICpodyk7CisJdm9pZCAoKnR4X3dvcmQpKHN0cnVjdCBhdTE1NTBfc3BpICpodyk7CisJaW50ICgqdHhyeF9idWZzKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KTsKKwlpcnFyZXR1cm5fdCAoKmlycV9jYWxsYmFjaykoc3RydWN0IGF1MTU1MF9zcGkgKmh3KTsKKworCXN0cnVjdCBjb21wbGV0aW9uIG1hc3Rlcl9kb25lOworCisJdW5zaWduZWQgdXNlZG1hOworCXUzMiBkbWFfdHhfaWQ7CisJdTMyIGRtYV9yeF9pZDsKKwl1MzIgZG1hX3R4X2NoOworCXUzMiBkbWFfcnhfY2g7CisKKwl1OCAqZG1hX3J4X3RtcGJ1ZjsKKwl1bnNpZ25lZCBkbWFfcnhfdG1wYnVmX3NpemU7CisJdTMyIGRtYV9yeF90bXBidWZfYWRkcjsKKworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBhdTE1NTBfc3BpX2luZm8gKnBkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqaW9hcmVhOworfTsKKworCisvKiB3ZSB1c2UgYW4gOC1iaXQgbWVtb3J5IGRldmljZSBmb3IgZG1hIHRyYW5zZmVycyB0by9mcm9tIHNwaSBmaWZvICovCitzdGF0aWMgZGJkZXZfdGFiX3QgYXUxNTUwX3NwaV9tZW1fZGJkZXYgPQoreworCS5kZXZfaWQJCQk9IERCRE1BX01FTV9DSEFOLAorCS5kZXZfZmxhZ3MJCT0gREVWX0ZMQUdTX0FOWVVTRXxERVZfRkxBR1NfU1lOQywKKwkuZGV2X3RzaXplCQk9IDAsCisJLmRldl9kZXZ3aWR0aAkJPSA4LAorCS5kZXZfcGh5c2FkZHIJCT0gMHgwMDAwMDAwMCwKKwkuZGV2X2ludGxldmVsCQk9IDAsCisJLmRldl9pbnRwb2xhcml0eQk9IDAKK307CisKK3N0YXRpYyBpbnQgZGRtYV9tZW1pZDsJLyogaWQgdG8gYWJvdmUgbWVtIGRtYSBkZXZpY2UgKi8KKworc3RhdGljIHZvaWQgYXUxNTUwX3NwaV9iaXRzX2hhbmRsZXJzX3NldChzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcsIGludCBicHcpOworCisKKy8qCisgKiAgY29tcHV0ZSBCUkcgYW5kIERJViBiaXRzIHRvIHNldHVwIHNwaSBjbG9jayBiYXNlZCBvbiBtYWluIGlucHV0IGNsb2NrIHJhdGUKKyAqICB0aGF0IHdhcyBzcGVjaWZpZWQgaW4gcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUKKyAqICBhY2NvcmRpbmcgdG8gYXUxNTUwIGRhdGFzaGVldDoKKyAqICAgIHBzY190ZW1wY2xrID0gcHNjX21haW5jbGsgLyAoMiA8PCBESVYpCisgKiAgICBzcGljbGsgPSBwc2NfdGVtcGNsayAvICgyICogKEJSRyArIDEpKQorICogICAgQlJHIHZhbGlkIHJhbmdlIGlzIDQuLjYzCisgKiAgICBESVYgdmFsaWQgcmFuZ2UgaXMgMC4uMworICovCitzdGF0aWMgdTMyIGF1MTU1MF9zcGlfYmF1ZGNmZyhzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcsIHVuc2lnbmVkIHNwZWVkX2h6KQoreworCXUzMiBtYWluY2xrX2h6ID0gaHctPnBkYXRhLT5tYWluY2xrX2h6OworCXUzMiBkaXYsIGJyZzsKKworCWZvciAoZGl2ID0gMDsgZGl2IDwgNDsgZGl2KyspIHsKKwkJYnJnID0gbWFpbmNsa19oeiAvIHNwZWVkX2h6IC8gKDQgPDwgZGl2KTsKKwkJLyogbm93IHdlIGhhdmUgQlJHKzEgaW4gYnJnLCBzbyBjb3VudCB3aXRoIHRoYXQgKi8KKwkJaWYgKGJyZyA8ICg0ICsgMSkpIHsKKwkJCWJyZyA9ICg0ICsgMSk7CS8qIHNwZWVkX2h6IHRvbyBiaWcgKi8KKwkJCWJyZWFrOwkJLyogc2V0IGxvd2VzdCBicmcgKGRpdiBpcyA9PSAwKSAqLworCQl9CisJCWlmIChicmcgPD0gKDYzICsgMSkpCisJCQlicmVhazsJCS8qIHdlIGhhdmUgdmFsaWQgYnJnIGFuZCBkaXYgKi8KKwl9CisJaWYgKGRpdiA9PSA0KSB7CisJCWRpdiA9IDM7CQkvKiBzcGVlZF9oeiB0b28gc21hbGwgKi8KKwkJYnJnID0gKDYzICsgMSk7CQkvKiBzZXQgaGlnaGVzdCBicmcgYW5kIGRpdiAqLworCX0KKwlicmctLTsKKwlyZXR1cm4gUFNDX1NQSUNGR19TRVRfQkFVRChicmcpIHwgUFNDX1NQSUNGR19TRVRfRElWKGRpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdTE1NTBfc3BpX21hc2tfYWNrX2FsbChzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcpCit7CisJaHctPnJlZ3MtPnBzY19zcGltc2sgPQorCQkgIFBTQ19TUElNU0tfTU0gfCBQU0NfU1BJTVNLX1JSIHwgUFNDX1NQSU1TS19STworCQl8IFBTQ19TUElNU0tfUlUgfCBQU0NfU1BJTVNLX1RSIHwgUFNDX1NQSU1TS19UTworCQl8IFBTQ19TUElNU0tfVFUgfCBQU0NfU1BJTVNLX1NEIHwgUFNDX1NQSU1TS19NRDsKKwlhdV9zeW5jKCk7CisKKwlody0+cmVncy0+cHNjX3NwaWV2ZW50ID0KKwkJICBQU0NfU1BJRVZOVF9NTSB8IFBTQ19TUElFVk5UX1JSIHwgUFNDX1NQSUVWTlRfUk8KKwkJfCBQU0NfU1BJRVZOVF9SVSB8IFBTQ19TUElFVk5UX1RSIHwgUFNDX1NQSUVWTlRfVE8KKwkJfCBQU0NfU1BJRVZOVF9UVSB8IFBTQ19TUElFVk5UX1NEIHwgUFNDX1NQSUVWTlRfTUQ7CisJYXVfc3luYygpOworfQorCitzdGF0aWMgdm9pZCBhdTE1NTBfc3BpX3Jlc2V0X2ZpZm9zKHN0cnVjdCBhdTE1NTBfc3BpICpodykKK3sKKwl1MzIgcGNyOworCisJaHctPnJlZ3MtPnBzY19zcGlwY3IgPSBQU0NfU1BJUENSX1JDIHwgUFNDX1NQSVBDUl9UQzsKKwlhdV9zeW5jKCk7CisJZG8geworCQlwY3IgPSBody0+cmVncy0+cHNjX3NwaXBjcjsKKwkJYXVfc3luYygpOworCX0gd2hpbGUgKHBjciAhPSAwKTsKK30KKworLyoKKyAqIGRtYSB0cmFuc2ZlcnMgYXJlIHVzZWQgZm9yIHRoZSBtb3N0IGNvbW1vbiBzcGkgd29yZCBzaXplIG9mIDgtYml0cworICogd2UgY2Fubm90IGVhc2lseSBjaGFuZ2UgYWxyZWFkeSBzZXQgdXAgZG1hIGNoYW5uZWxzJyB3aWR0aCwgc28gaWYgd2Ugd2FudGVkCisgKiBkbWEgc3VwcG9ydCBmb3IgbW9yZSB0aGFuIDgtYml0IHdvcmRzICh1cCB0byAyNCBiaXRzKSwgd2Ugd291bGQgbmVlZCB0bworICogc2V0dXAgZG1hIGNoYW5uZWxzIGZyb20gc2NyYXRjaCBvbiBlYWNoIHNwaSB0cmFuc2ZlciwgYmFzZWQgb24gYml0c19wZXJfd29yZAorICogaW5zdGVhZCB3ZSBoYXZlIHByZSBzZXQgdXAgOCBiaXQgZG1hIGNoYW5uZWxzIHN1cHBvcnRpbmcgc3BpIDQgdG8gOCBiaXRzCisgKiB0cmFuc2ZlcnMsIGFuZCA5IHRvIDI0IGJpdHMgc3BpIHRyYW5zZmVycyB3aWxsIGJlIGRvbmUgaW4gcGlvIGlycSBiYXNlZCBtb2RlCisgKiBjYWxsYmFja3MgdG8gaGFuZGxlIGRtYSBvciBwaW8gYXJlIHNldCB1cCBpbiBhdTE1NTBfc3BpX2JpdHNfaGFuZGxlcnNfc2V0KCkKKyAqLworc3RhdGljIHZvaWQgYXUxNTUwX3NwaV9jaGlwc2VsKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1bnNpZ25lZCBjc3BvbCA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIID8gMSA6IDA7CisJdTMyIGNmZywgc3RhdDsKKworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIEJJVEJBTkdfQ1NfSU5BQ1RJVkU6CisJCWlmIChody0+cGRhdGEtPmRlYWN0aXZhdGVfY3MpCisJCQlody0+cGRhdGEtPmRlYWN0aXZhdGVfY3MoaHctPnBkYXRhLCBzcGktPmNoaXBfc2VsZWN0LAorCQkJCQljc3BvbCk7CisJCWJyZWFrOworCisJY2FzZSBCSVRCQU5HX0NTX0FDVElWRToKKwkJYXUxNTUwX3NwaV9iaXRzX2hhbmRsZXJzX3NldChodywgc3BpLT5iaXRzX3Blcl93b3JkKTsKKworCQljZmcgPSBody0+cmVncy0+cHNjX3NwaWNmZzsKKwkJYXVfc3luYygpOworCQlody0+cmVncy0+cHNjX3NwaWNmZyA9IGNmZyAmIH5QU0NfU1BJQ0ZHX0RFX0VOQUJMRTsKKwkJYXVfc3luYygpOworCisJCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJCWNmZyB8PSBQU0NfU1BJQ0ZHX0JJOworCQllbHNlCisJCQljZmcgJj0gflBTQ19TUElDRkdfQkk7CisJCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJCWNmZyAmPSB+UFNDX1NQSUNGR19DREU7CisJCWVsc2UKKwkJCWNmZyB8PSBQU0NfU1BJQ0ZHX0NERTsKKworCQlpZiAoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkKKwkJCWNmZyB8PSBQU0NfU1BJQ0ZHX01MRjsKKwkJZWxzZQorCQkJY2ZnICY9IH5QU0NfU1BJQ0ZHX01MRjsKKworCQlpZiAoaHctPnVzZWRtYSAmJiBzcGktPmJpdHNfcGVyX3dvcmQgPD0gOCkKKwkJCWNmZyAmPSB+UFNDX1NQSUNGR19ERF9ESVNBQkxFOworCQllbHNlCisJCQljZmcgfD0gUFNDX1NQSUNGR19ERF9ESVNBQkxFOworCQljZmcgPSBQU0NfU1BJQ0ZHX0NMUl9MRU4oY2ZnKTsKKwkJY2ZnIHw9IFBTQ19TUElDRkdfU0VUX0xFTihzcGktPmJpdHNfcGVyX3dvcmQpOworCisJCWNmZyA9IFBTQ19TUElDRkdfQ0xSX0JBVUQoY2ZnKTsKKwkJY2ZnICY9IH5QU0NfU1BJQ0ZHX1NFVF9ESVYoMyk7CisJCWNmZyB8PSBhdTE1NTBfc3BpX2JhdWRjZmcoaHcsIHNwaS0+bWF4X3NwZWVkX2h6KTsKKworCQlody0+cmVncy0+cHNjX3NwaWNmZyA9IGNmZyB8IFBTQ19TUElDRkdfREVfRU5BQkxFOworCQlhdV9zeW5jKCk7CisJCWRvIHsKKwkJCXN0YXQgPSBody0+cmVncy0+cHNjX3NwaXN0YXQ7CisJCQlhdV9zeW5jKCk7CisJCX0gd2hpbGUgKChzdGF0ICYgUFNDX1NQSVNUQVRfRFIpID09IDApOworCisJCWlmIChody0+cGRhdGEtPmFjdGl2YXRlX2NzKQorCQkJaHctPnBkYXRhLT5hY3RpdmF0ZV9jcyhody0+cGRhdGEsIHNwaS0+Y2hpcF9zZWxlY3QsCisJCQkJCWNzcG9sKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGF1MTU1MF9zcGlfc2V0dXB4ZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IGF1MTU1MF9zcGkgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdW5zaWduZWQgYnB3LCBoejsKKwl1MzIgY2ZnLCBzdGF0OworCisJYnB3ID0gc3BpLT5iaXRzX3Blcl93b3JkOworCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CisJaWYgKHQpIHsKKwkJaWYgKHQtPmJpdHNfcGVyX3dvcmQpCisJCQlicHcgPSB0LT5iaXRzX3Blcl93b3JkOworCQlpZiAodC0+c3BlZWRfaHopCisJCQloeiA9IHQtPnNwZWVkX2h6OworCX0KKworCWlmIChicHcgPCA0IHx8IGJwdyA+IDI0KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAic2V0dXB4ZmVyOiBpbnZhbGlkIGJpdHNfcGVyX3dvcmQ9JWRcbiIsCisJCQlicHcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGh6ID4gc3BpLT5tYXhfc3BlZWRfaHogfHwgaHogPiBody0+ZnJlcV9tYXggfHwgaHogPCBody0+ZnJlcV9taW4pIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJzZXR1cHhmZXI6IGNsb2NrIHJhdGU9JWQgb3V0IG9mIHJhbmdlXG4iLAorCQkJaHopOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhdTE1NTBfc3BpX2JpdHNfaGFuZGxlcnNfc2V0KGh3LCBzcGktPmJpdHNfcGVyX3dvcmQpOworCisJY2ZnID0gaHctPnJlZ3MtPnBzY19zcGljZmc7CisJYXVfc3luYygpOworCWh3LT5yZWdzLT5wc2Nfc3BpY2ZnID0gY2ZnICYgflBTQ19TUElDRkdfREVfRU5BQkxFOworCWF1X3N5bmMoKTsKKworCWlmIChody0+dXNlZG1hICYmIGJwdyA8PSA4KQorCQljZmcgJj0gflBTQ19TUElDRkdfRERfRElTQUJMRTsKKwllbHNlCisJCWNmZyB8PSBQU0NfU1BJQ0ZHX0REX0RJU0FCTEU7CisJY2ZnID0gUFNDX1NQSUNGR19DTFJfTEVOKGNmZyk7CisJY2ZnIHw9IFBTQ19TUElDRkdfU0VUX0xFTihicHcpOworCisJY2ZnID0gUFNDX1NQSUNGR19DTFJfQkFVRChjZmcpOworCWNmZyAmPSB+UFNDX1NQSUNGR19TRVRfRElWKDMpOworCWNmZyB8PSBhdTE1NTBfc3BpX2JhdWRjZmcoaHcsIGh6KTsKKworCWh3LT5yZWdzLT5wc2Nfc3BpY2ZnID0gY2ZnOworCWF1X3N5bmMoKTsKKworCWlmIChjZmcgJiBQU0NfU1BJQ0ZHX0RFX0VOQUJMRSkgeworCQlkbyB7CisJCQlzdGF0ID0gaHctPnJlZ3MtPnBzY19zcGlzdGF0OworCQkJYXVfc3luYygpOworCQl9IHdoaWxlICgoc3RhdCAmIFBTQ19TUElTVEFUX0RSKSA9PSAwKTsKKwl9CisKKwlhdTE1NTBfc3BpX3Jlc2V0X2ZpZm9zKGh3KTsKKwlhdTE1NTBfc3BpX21hc2tfYWNrX2FsbChodyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXUxNTUwX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhdTE1NTBfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJaWYgKHNwaS0+Yml0c19wZXJfd29yZCA8IDQgfHwgc3BpLT5iaXRzX3Blcl93b3JkID4gMjQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJzZXR1cDogaW52YWxpZCBiaXRzX3Blcl93b3JkPSVkXG4iLAorCQkJc3BpLT5iaXRzX3Blcl93b3JkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNwaS0+bWF4X3NwZWVkX2h6ID09IDApCisJCXNwaS0+bWF4X3NwZWVkX2h6ID0gaHctPmZyZXFfbWF4OworCWlmIChzcGktPm1heF9zcGVlZF9oeiA+IGh3LT5mcmVxX21heAorCQkJfHwgc3BpLT5tYXhfc3BlZWRfaHogPCBody0+ZnJlcV9taW4pCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogTk9URTogY2Fubm90IGNoYW5nZSBzcGVlZCBhbmQgb3RoZXIgaHcgc2V0dGluZ3MgaW1tZWRpYXRlbHksCisJICogICAgICAgb3RoZXJ3aXNlIHNoYXJpbmcgb2Ygc3BpIGJ1cyBpcyBub3QgcG9zc2libGUsCisJICogICAgICAgc28gZG8gbm90IGNhbGwgc2V0dXB4ZmVyKHNwaSwgTlVMTCkgaGVyZQorCSAqLworCXJldHVybiAwOworfQorCisvKgorICogZm9yIGRtYSBzcGkgdHJhbnNmZXJzLCB3ZSBoYXZlIHRvIHNldHVwIHJ4IGNoYW5uZWwsIG90aGVyd2lzZSB0aGVyZSBpcworICogbm8gcmVsaWFibGUgd2F5IGhvdyB0byByZWNvZ25pemUgdGhhdCBzcGkgdHJhbnNmZXIgaXMgZG9uZQorICogZG1hIGNvbXBsZXRlIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGJlZm9yZSByZWFsIHNwaSB0cmFuc2ZlciBpcyBmaW5pc2hlZAorICogYW5kIGlmIG9ubHkgdHggZG1hIGNoYW5uZWwgaXMgc2V0IHVwIChhbmQgcnggZmlmbyBvdmVyZmxvdyBldmVudCBtYXNrZWQpCisgKiBzcGkgbWFzdGVyIGRvbmUgZXZlbnQgaXJxIGlzIG5vdCBnZW5lcmF0ZWQgdW5sZXNzIHJ4IGZpZm8gaXMgZW1wdHkgKGVtcHRpZWQpCisgKiBzbyB3ZSBuZWVkIHJ4IHRtcCBidWZmZXIgdG8gdXNlIGZvciByeCBkbWEgaWYgdXNlciBkb2VzIG5vdCBwcm92aWRlIG9uZQorICovCitzdGF0aWMgaW50IGF1MTU1MF9zcGlfZG1hX3J4dG1wX2FsbG9jKHN0cnVjdCBhdTE1NTBfc3BpICpodywgdW5zaWduZWQgc2l6ZSkKK3sKKwlody0+ZG1hX3J4X3RtcGJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFody0+ZG1hX3J4X3RtcGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJaHctPmRtYV9yeF90bXBidWZfc2l6ZSA9IHNpemU7CisJaHctPmRtYV9yeF90bXBidWZfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGh3LT5kZXYsIGh3LT5kbWFfcnhfdG1wYnVmLAorCQkJc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoaHctPmRldiwgaHctPmRtYV9yeF90bXBidWZfYWRkcikpIHsKKwkJa2ZyZWUoaHctPmRtYV9yeF90bXBidWYpOworCQlody0+ZG1hX3J4X3RtcGJ1ZiA9IDA7CisJCWh3LT5kbWFfcnhfdG1wYnVmX3NpemUgPSAwOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF1MTU1MF9zcGlfZG1hX3J4dG1wX2ZyZWUoc3RydWN0IGF1MTU1MF9zcGkgKmh3KQoreworCWRtYV91bm1hcF9zaW5nbGUoaHctPmRldiwgaHctPmRtYV9yeF90bXBidWZfYWRkciwKKwkJCWh3LT5kbWFfcnhfdG1wYnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CisJa2ZyZWUoaHctPmRtYV9yeF90bXBidWYpOworCWh3LT5kbWFfcnhfdG1wYnVmID0gMDsKKwlody0+ZG1hX3J4X3RtcGJ1Zl9zaXplID0gMDsKK30KKworc3RhdGljIGludCBhdTE1NTBfc3BpX2RtYV90eHJ4YihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBhdTE1NTBfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCWRtYV9hZGRyX3QgZG1hX3R4X2FkZHI7CisJZG1hX2FkZHJfdCBkbWFfcnhfYWRkcjsKKwl1MzIgcmVzOworCisJaHctPmxlbiA9IHQtPmxlbjsKKwlody0+dHhfY291bnQgPSAwOworCWh3LT5yeF9jb3VudCA9IDA7CisKKwlody0+dHggPSB0LT50eF9idWY7CisJaHctPnJ4ID0gdC0+cnhfYnVmOworCWRtYV90eF9hZGRyID0gdC0+dHhfZG1hOworCWRtYV9yeF9hZGRyID0gdC0+cnhfZG1hOworCisJLyoKKwkgKiBjaGVjayBpZiBidWZmZXJzIGFyZSBhbHJlYWR5IGRtYSBtYXBwZWQsIG1hcCB0aGVtIG90aGVyd2lzZToKKwkgKiAtIGZpcnN0IG1hcCB0aGUgVFggYnVmZmVyLCBzbyBjYWNoZSBkYXRhIGdldHMgd3JpdHRlbiB0byBtZW1vcnkKKwkgKiAtIHRoZW4gbWFwIHRoZSBSWCBidWZmZXIsIHNvIHRoYXQgY2FjaGUgZW50cmllcyAod2l0aAorCSAqICAgc29vbi10by1iZS1zdGFsZSBkYXRhKSBnZXQgcmVtb3ZlZAorCSAqIHVzZSByeCBidWZmZXIgaW4gcGxhY2Ugb2YgdHggaWYgdHggYnVmZmVyIHdhcyBub3QgcHJvdmlkZWQKKwkgKiB1c2UgdGVtcCByeCBidWZmZXIgKHByZWFsbG9jYXRlZCBvciByZWFsbG9jIHRvIGZpdCkgZm9yIHJ4IGRtYQorCSAqLworCWlmICh0LT50eF9idWYpIHsKKwkJaWYgKHQtPnR4X2RtYSA9PSAwKSB7CS8qIGlmIERNQV9BRERSX0lOVkFMSUQsIG1hcCBpdCAqLworCQkJZG1hX3R4X2FkZHIgPSBkbWFfbWFwX3NpbmdsZShody0+ZGV2LAorCQkJCQkodm9pZCAqKXQtPnR4X2J1ZiwKKwkJCQkJdC0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihody0+ZGV2LCBkbWFfdHhfYWRkcikpCisJCQkJZGV2X2Vycihody0+ZGV2LCAidHggZG1hIG1hcCBlcnJvclxuIik7CisJCX0KKwl9CisKKwlpZiAodC0+cnhfYnVmKSB7CisJCWlmICh0LT5yeF9kbWEgPT0gMCkgewkvKiBpZiBETUFfQUREUl9JTlZBTElELCBtYXAgaXQgKi8KKwkJCWRtYV9yeF9hZGRyID0gZG1hX21hcF9zaW5nbGUoaHctPmRldiwKKwkJCQkJKHZvaWQgKil0LT5yeF9idWYsCisJCQkJCXQtPmxlbiwgRE1BX0ZST01fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihody0+ZGV2LCBkbWFfcnhfYWRkcikpCisJCQkJZGV2X2Vycihody0+ZGV2LCAicnggZG1hIG1hcCBlcnJvclxuIik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodC0+bGVuID4gaHctPmRtYV9yeF90bXBidWZfc2l6ZSkgeworCQkJaW50IHJldDsKKworCQkJYXUxNTUwX3NwaV9kbWFfcnh0bXBfZnJlZShodyk7CisJCQlyZXQgPSBhdTE1NTBfc3BpX2RtYV9yeHRtcF9hbGxvYyhodywgbWF4KHQtPmxlbiwKKwkJCQkJQVUxNTUwX1NQSV9ETUFfUlhUTVBfTUlOU0laRSkpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlody0+cnggPSBody0+ZG1hX3J4X3RtcGJ1ZjsKKwkJZG1hX3J4X2FkZHIgPSBody0+ZG1hX3J4X3RtcGJ1Zl9hZGRyOworCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShody0+ZGV2LCBkbWFfcnhfYWRkciwKKwkJCXQtPmxlbiwgRE1BX0ZST01fREVWSUNFKTsKKwl9CisKKwlpZiAoIXQtPnR4X2J1ZikgeworCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShody0+ZGV2LCBkbWFfcnhfYWRkciwKKwkJCQl0LT5sZW4sIERNQV9CSURJUkVDVElPTkFMKTsKKwkJaHctPnR4ID0gaHctPnJ4OworCX0KKworCS8qIHB1dCBidWZmZXJzIG9uIHRoZSByaW5nICovCisJcmVzID0gYXUxeHh4X2RiZG1hX3B1dF9kZXN0KGh3LT5kbWFfcnhfY2gsIHZpcnRfdG9fcGh5cyhody0+cngpLAorCQkJCSAgICB0LT5sZW4sIERETUFfRkxBR1NfSUUpOworCWlmICghcmVzKQorCQlkZXZfZXJyKGh3LT5kZXYsICJyeCBkbWEgcHV0IGRlc3QgZXJyb3JcbiIpOworCisJcmVzID0gYXUxeHh4X2RiZG1hX3B1dF9zb3VyY2UoaHctPmRtYV90eF9jaCwgdmlydF90b19waHlzKGh3LT50eCksCisJCQkJICAgICAgdC0+bGVuLCBERE1BX0ZMQUdTX0lFKTsKKwlpZiAoIXJlcykKKwkJZGV2X2Vycihody0+ZGV2LCAidHggZG1hIHB1dCBzb3VyY2UgZXJyb3JcbiIpOworCisJYXUxeHh4X2RiZG1hX3N0YXJ0KGh3LT5kbWFfcnhfY2gpOworCWF1MXh4eF9kYmRtYV9zdGFydChody0+ZG1hX3R4X2NoKTsKKworCS8qIGJ5IGRlZmF1bHQgZW5hYmxlIG5lYXJseSBhbGwgZXZlbnRzIGludGVycnVwdCAqLworCWh3LT5yZWdzLT5wc2Nfc3BpbXNrID0gUFNDX1NQSU1TS19TRDsKKwlhdV9zeW5jKCk7CisKKwkvKiBzdGFydCB0aGUgdHJhbnNmZXIgKi8KKwlody0+cmVncy0+cHNjX3NwaXBjciA9IFBTQ19TUElQQ1JfTVM7CisJYXVfc3luYygpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmaHctPm1hc3Rlcl9kb25lKTsKKworCWF1MXh4eF9kYmRtYV9zdG9wKGh3LT5kbWFfdHhfY2gpOworCWF1MXh4eF9kYmRtYV9zdG9wKGh3LT5kbWFfcnhfY2gpOworCisJaWYgKCF0LT5yeF9idWYpIHsKKwkJLyogdXNpbmcgdGhlIHRlbXBvcmFsIHByZWFsbG9jYXRlZCBhbmQgcHJlbWFwcGVkIGJ1ZmZlciAqLworCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShody0+ZGV2LCBkbWFfcnhfYWRkciwgdC0+bGVuLAorCQkJRE1BX0ZST01fREVWSUNFKTsKKwl9CisJLyogdW5tYXAgYnVmZmVycyBpZiBtYXBwZWQgYWJvdmUgKi8KKwlpZiAodC0+cnhfYnVmICYmIHQtPnJ4X2RtYSA9PSAwICkKKwkJZG1hX3VubWFwX3NpbmdsZShody0+ZGV2LCBkbWFfcnhfYWRkciwgdC0+bGVuLAorCQkJRE1BX0ZST01fREVWSUNFKTsKKwlpZiAodC0+dHhfYnVmICYmIHQtPnR4X2RtYSA9PSAwICkKKwkJZG1hX3VubWFwX3NpbmdsZShody0+ZGV2LCBkbWFfdHhfYWRkciwgdC0+bGVuLAorCQkJRE1BX1RPX0RFVklDRSk7CisKKwlyZXR1cm4gaHctPnJ4X2NvdW50IDwgaHctPnR4X2NvdW50ID8gaHctPnJ4X2NvdW50IDogaHctPnR4X2NvdW50OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXUxNTUwX3NwaV9kbWFfaXJxX2NhbGxiYWNrKHN0cnVjdCBhdTE1NTBfc3BpICpodykKK3sKKwl1MzIgc3RhdCwgZXZudDsKKworCXN0YXQgPSBody0+cmVncy0+cHNjX3NwaXN0YXQ7CisJZXZudCA9IGh3LT5yZWdzLT5wc2Nfc3BpZXZlbnQ7CisJYXVfc3luYygpOworCWlmICgoc3RhdCAmIFBTQ19TUElTVEFUX0RJKSA9PSAwKSB7CisJCWRldl9lcnIoaHctPmRldiwgIlVuZXhwZWN0ZWQgSVJRIVxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoKGV2bnQgJiAoUFNDX1NQSUVWTlRfTU0gfCBQU0NfU1BJRVZOVF9STworCQkJCXwgUFNDX1NQSUVWTlRfUlUgfCBQU0NfU1BJRVZOVF9UTworCQkJCXwgUFNDX1NQSUVWTlRfVFUgfCBQU0NfU1BJRVZOVF9TRCkpCisJCQkhPSAwKSB7CisJCS8qCisJCSAqIGR1ZSB0byBhbiBzcGkgZXJyb3Igd2UgY29uc2lkZXIgdHJhbnNmZXIgYXMgZG9uZSwKKwkJICogc28gbWFzayBhbGwgZXZlbnRzIHVudGlsIGJlZm9yZSBuZXh0IHRyYW5zZmVyIHN0YXJ0CisJCSAqIGFuZCBzdG9wIHRoZSBwb3NzaWJseSBydW5uaW5nIGRtYSBpbW1lZGlhdGVsbHkKKwkJICovCisJCWF1MTU1MF9zcGlfbWFza19hY2tfYWxsKGh3KTsKKwkJYXUxeHh4X2RiZG1hX3N0b3AoaHctPmRtYV9yeF9jaCk7CisJCWF1MXh4eF9kYmRtYV9zdG9wKGh3LT5kbWFfdHhfY2gpOworCisJCS8qIGdldCBudW1iZXIgb2YgdHJhbnNmZXJyZWQgYnl0ZXMgKi8KKwkJaHctPnJ4X2NvdW50ID0gaHctPmxlbiAtIGF1MXh4eF9nZXRfZG1hX3Jlc2lkdWUoaHctPmRtYV9yeF9jaCk7CisJCWh3LT50eF9jb3VudCA9IGh3LT5sZW4gLSBhdTF4eHhfZ2V0X2RtYV9yZXNpZHVlKGh3LT5kbWFfdHhfY2gpOworCisJCWF1MXh4eF9kYmRtYV9yZXNldChody0+ZG1hX3J4X2NoKTsKKwkJYXUxeHh4X2RiZG1hX3Jlc2V0KGh3LT5kbWFfdHhfY2gpOworCQlhdTE1NTBfc3BpX3Jlc2V0X2ZpZm9zKGh3KTsKKworCQlpZiAoZXZudCA9PSBQU0NfU1BJRVZOVF9STykKKwkJCWRldl9lcnIoaHctPmRldiwKKwkJCQkiZG1hIHRyYW5zZmVyOiByZWNlaXZlIEZJRk8gb3ZlcmZsb3chXG4iKTsKKwkJZWxzZQorCQkJZGV2X2Vycihody0+ZGV2LAorCQkJCSJkbWEgdHJhbnNmZXI6IHVuZXhwZWN0ZWQgU1BJIGVycm9yICIKKwkJCQkiKGV2ZW50PTB4JXggc3RhdD0weCV4KSFcbiIsIGV2bnQsIHN0YXQpOworCisJCWNvbXBsZXRlKCZody0+bWFzdGVyX2RvbmUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKChldm50ICYgUFNDX1NQSUVWTlRfTUQpICE9IDApIHsKKwkJLyogdHJhbnNmZXIgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworCQlhdTE1NTBfc3BpX21hc2tfYWNrX2FsbChodyk7CisJCWh3LT5yeF9jb3VudCA9IGh3LT5sZW47CisJCWh3LT50eF9jb3VudCA9IGh3LT5sZW47CisJCWNvbXBsZXRlKCZody0+bWFzdGVyX2RvbmUpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyogcm91dGluZXMgdG8gaGFuZGxlIGRpZmZlcmVudCB3b3JkIHNpemVzIGluIHBpbyBtb2RlICovCisjZGVmaW5lIEFVMTU1MF9TUElfUlhfV09SRChzaXplLCBtYXNrKQkJCQkJXAorc3RhdGljIHZvaWQgYXUxNTUwX3NwaV9yeF93b3JkXyMjc2l6ZShzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcpCQlcCit7CQkJCQkJCQkJXAorCXUzMiBmaWZvd29yZCA9IGh3LT5yZWdzLT5wc2Nfc3BpdHhyeCAmICh1MzIpKG1hc2spOwkJXAorCWF1X3N5bmMoKTsJCQkJCQkJXAorCWlmIChody0+cngpIHsJCQkJCQkJXAorCQkqKHUjI3NpemUgKilody0+cnggPSAodSMjc2l6ZSlmaWZvd29yZDsJCQlcCisJCWh3LT5yeCArPSAoc2l6ZSkgLyA4OwkJCQkJXAorCX0JCQkJCQkJCVwKKwlody0+cnhfY291bnQgKz0gKHNpemUpIC8gODsJCQkJCVwKK30KKworI2RlZmluZSBBVTE1NTBfU1BJX1RYX1dPUkQoc2l6ZSwgbWFzaykJCQkJCVwKK3N0YXRpYyB2b2lkIGF1MTU1MF9zcGlfdHhfd29yZF8jI3NpemUoc3RydWN0IGF1MTU1MF9zcGkgKmh3KQkJXAorewkJCQkJCQkJCVwKKwl1MzIgZmlmb3dvcmQgPSAwOwkJCQkJCVwKKwlpZiAoaHctPnR4KSB7CQkJCQkJCVwKKwkJZmlmb3dvcmQgPSAqKHUjI3NpemUgKilody0+dHggJiAodTMyKShtYXNrKTsJCVwKKwkJaHctPnR4ICs9IChzaXplKSAvIDg7CQkJCQlcCisJfQkJCQkJCQkJXAorCWh3LT50eF9jb3VudCArPSAoc2l6ZSkgLyA4OwkJCQkJXAorCWlmIChody0+dHhfY291bnQgPj0gaHctPmxlbikJCQkJCVwKKwkJZmlmb3dvcmQgfD0gUFNDX1NQSVRYUlhfTEM7CQkJCVwKKwlody0+cmVncy0+cHNjX3NwaXR4cnggPSBmaWZvd29yZDsJCQkJXAorCWF1X3N5bmMoKTsJCQkJCQkJXAorfQorCitBVTE1NTBfU1BJX1JYX1dPUkQoOCwweGZmKQorQVUxNTUwX1NQSV9SWF9XT1JEKDE2LDB4ZmZmZikKK0FVMTU1MF9TUElfUlhfV09SRCgzMiwweGZmZmZmZikKK0FVMTU1MF9TUElfVFhfV09SRCg4LDB4ZmYpCitBVTE1NTBfU1BJX1RYX1dPUkQoMTYsMHhmZmZmKQorQVUxNTUwX1NQSV9UWF9XT1JEKDMyLDB4ZmZmZmZmKQorCitzdGF0aWMgaW50IGF1MTU1MF9zcGlfcGlvX3R4cnhiKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJdTMyIHN0YXQsIG1hc2s7CisJc3RydWN0IGF1MTU1MF9zcGkgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlody0+dHggPSB0LT50eF9idWY7CisJaHctPnJ4ID0gdC0+cnhfYnVmOworCWh3LT5sZW4gPSB0LT5sZW47CisJaHctPnR4X2NvdW50ID0gMDsKKwlody0+cnhfY291bnQgPSAwOworCisJLyogYnkgZGVmYXVsdCBlbmFibGUgbmVhcmx5IGFsbCBldmVudHMgYWZ0ZXIgZmlsbGluZyB0eCBmaWZvICovCisJbWFzayA9IFBTQ19TUElNU0tfU0Q7CisKKwkvKiBmaWxsIHRoZSB0cmFuc21pdCBGSUZPICovCisJd2hpbGUgKGh3LT50eF9jb3VudCA8IGh3LT5sZW4pIHsKKworCQlody0+dHhfd29yZChodyk7CisKKwkJaWYgKGh3LT50eF9jb3VudCA+PSBody0+bGVuKSB7CisJCQkvKiBtYXNrIHR4IGZpZm8gcmVxdWVzdCBpbnRlcnJ1cHQgYXMgd2UgYXJlIGRvbmUgKi8KKwkJCW1hc2sgfD0gUFNDX1NQSU1TS19UUjsKKwkJfQorCisJCXN0YXQgPSBody0+cmVncy0+cHNjX3NwaXN0YXQ7CisJCWF1X3N5bmMoKTsKKwkJaWYgKHN0YXQgJiBQU0NfU1BJU1RBVF9URikKKwkJCWJyZWFrOworCX0KKworCS8qIGVuYWJsZSBldmVudCBpbnRlcnJ1cHRzICovCisJaHctPnJlZ3MtPnBzY19zcGltc2sgPSBtYXNrOworCWF1X3N5bmMoKTsKKworCS8qIHN0YXJ0IHRoZSB0cmFuc2ZlciAqLworCWh3LT5yZWdzLT5wc2Nfc3BpcGNyID0gUFNDX1NQSVBDUl9NUzsKKwlhdV9zeW5jKCk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZody0+bWFzdGVyX2RvbmUpOworCisJcmV0dXJuIGh3LT5yeF9jb3VudCA8IGh3LT50eF9jb3VudCA/IGh3LT5yeF9jb3VudCA6IGh3LT50eF9jb3VudDsKK30KKworc3RhdGljIGlycXJldHVybl90IGF1MTU1MF9zcGlfcGlvX2lycV9jYWxsYmFjayhzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcpCit7CisJaW50IGJ1c3k7CisJdTMyIHN0YXQsIGV2bnQ7CisKKwlzdGF0ID0gaHctPnJlZ3MtPnBzY19zcGlzdGF0OworCWV2bnQgPSBody0+cmVncy0+cHNjX3NwaWV2ZW50OworCWF1X3N5bmMoKTsKKwlpZiAoKHN0YXQgJiBQU0NfU1BJU1RBVF9ESSkgPT0gMCkgeworCQlkZXZfZXJyKGh3LT5kZXYsICJVbmV4cGVjdGVkIElSUSFcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKChldm50ICYgKFBTQ19TUElFVk5UX01NIHwgUFNDX1NQSUVWTlRfUk8KKwkJCQl8IFBTQ19TUElFVk5UX1JVIHwgUFNDX1NQSUVWTlRfVE8KKwkJCQl8IFBTQ19TUElFVk5UX1NEKSkKKwkJCSE9IDApIHsKKwkJLyoKKwkJICogZHVlIHRvIGFuIGVycm9yIHdlIGNvbnNpZGVyIHRyYW5zZmVyIGFzIGRvbmUsCisJCSAqIHNvIG1hc2sgYWxsIGV2ZW50cyB1bnRpbCBiZWZvcmUgbmV4dCB0cmFuc2ZlciBzdGFydAorCQkgKi8KKwkJYXUxNTUwX3NwaV9tYXNrX2Fja19hbGwoaHcpOworCQlhdTE1NTBfc3BpX3Jlc2V0X2ZpZm9zKGh3KTsKKwkJZGV2X2Vycihody0+ZGV2LAorCQkJInBpbyB0cmFuc2ZlcjogdW5leHBlY3RlZCBTUEkgZXJyb3IgIgorCQkJIihldmVudD0weCV4IHN0YXQ9MHgleCkhXG4iLCBldm50LCBzdGF0KTsKKwkJY29tcGxldGUoJmh3LT5tYXN0ZXJfZG9uZSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKgorCSAqIHdoaWxlIHRoZXJlIGlzIHNvbWV0aGluZyB0byByZWFkIGZyb20gcnggZmlmbworCSAqIG9yIHRoZXJlIGlzIGEgc3BhY2UgdG8gd3JpdGUgdG8gdHggZmlmbzoKKwkgKi8KKwlkbyB7CisJCWJ1c3kgPSAwOworCQlzdGF0ID0gaHctPnJlZ3MtPnBzY19zcGlzdGF0OworCQlhdV9zeW5jKCk7CisKKwkJLyoKKwkJICogVGFrZSBjYXJlIHRvIG5vdCBsZXQgdGhlIFJ4IEZJRk8gb3ZlcmZsb3cuCisJCSAqCisJCSAqIFdlIG9ubHkgd3JpdGUgYSBieXRlIGlmIHdlIGhhdmUgcmVhZCBvbmUgYXQgbGVhc3QuIEluaXRpYWxseSwKKwkJICogdGhlIHdyaXRlIGZpZm8gaXMgZnVsbCwgc28gd2Ugc2hvdWxkIHJlYWQgZnJvbSB0aGUgcmVhZCBmaWZvCisJCSAqIGZpcnN0LgorCQkgKiBJbiBjYXNlIHdlIG1pc3MgYSB3b3JkIGZyb20gdGhlIHJlYWQgZmlmbywgd2Ugc2hvdWxkIGdldCBhCisJCSAqIFJPIGV2ZW50IGFuZCBzaG91bGQgYmFjayBvdXQuCisJCSAqLworCQlpZiAoIShzdGF0ICYgUFNDX1NQSVNUQVRfUkUpICYmIGh3LT5yeF9jb3VudCA8IGh3LT5sZW4pIHsKKwkJCWh3LT5yeF93b3JkKGh3KTsKKwkJCWJ1c3kgPSAxOworCisJCQlpZiAoIShzdGF0ICYgUFNDX1NQSVNUQVRfVEYpICYmIGh3LT50eF9jb3VudCA8IGh3LT5sZW4pCisJCQkJaHctPnR4X3dvcmQoaHcpOworCQl9CisJfSB3aGlsZSAoYnVzeSk7CisKKwlody0+cmVncy0+cHNjX3NwaWV2ZW50ID0gUFNDX1NQSUVWTlRfUlIgfCBQU0NfU1BJRVZOVF9UUjsKKwlhdV9zeW5jKCk7CisKKwkvKgorCSAqIFJlc3RhcnQgdGhlIFNQSSB0cmFuc21pc3Npb24gaW4gY2FzZSBvZiBhIHRyYW5zbWl0IHVuZGVyZmxvdy4KKwkgKiBUaGlzIHNlZW1zIHRvIHdvcmsgZGVzcGl0ZSB0aGUgbm90ZXMgaW4gdGhlIEF1MTU1MCBkYXRhIGJvb2sKKwkgKiBvZiBGaWd1cmUgOC00IHdpdGggZmxvd2NoYXJ0IGZvciBTUEkgbWFzdGVyIG9wZXJhdGlvbjoKKwkgKgorCSAqICIiIk5vdGUgMTogQW4gWEZSIEVycm9yIEludGVycnVwdCBvY2N1cnMsIHVubGVzcyBtYXNrZWQsCisJICogZm9yIGFueSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50czogVHggRklGTyBVbmRlcmZsb3csCisJICogUnggRklGTyBPdmVyZmxvdywgb3IgTXVsdGlwbGUtbWFzdGVyIEVycm9yCisJICogICAgTm90ZSAyOiBJbiBjYXNlIG9mIGEgVHggVW5kZXJmbG93IEVycm9yLCBhbGwgemVyb2VzIGFyZQorCSAqIHRyYW5zbWl0dGVkLiIiIgorCSAqCisJICogQnkgc2ltcGx5IHJlc3RhcnRpbmcgdGhlIHNwaSB0cmFuc2ZlciBvbiBUeCBVbmRlcmZsb3cgRXJyb3IsCisJICogd2UgYXNzdW1lIHRoYXQgc3BpIHRyYW5zZmVyIHdhcyBwYXVzZWQgaW5zdGVhZCBvZiB6ZXJvZXMKKwkgKiB0cmFuc21pdHRpb24gbWVudGlvbmVkIGluIHRoZSBOb3RlIDIgb2YgQXUxNTUwIGRhdGEgYm9vay4KKwkgKi8KKwlpZiAoZXZudCAmIFBTQ19TUElFVk5UX1RVKSB7CisJCWh3LT5yZWdzLT5wc2Nfc3BpZXZlbnQgPSBQU0NfU1BJRVZOVF9UVSB8IFBTQ19TUElFVk5UX01EOworCQlhdV9zeW5jKCk7CisJCWh3LT5yZWdzLT5wc2Nfc3BpcGNyID0gUFNDX1NQSVBDUl9NUzsKKwkJYXVfc3luYygpOworCX0KKworCWlmIChody0+cnhfY291bnQgPj0gaHctPmxlbikgeworCQkvKiB0cmFuc2ZlciBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisJCWF1MTU1MF9zcGlfbWFza19hY2tfYWxsKGh3KTsKKwkJY29tcGxldGUoJmh3LT5tYXN0ZXJfZG9uZSk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBhdTE1NTBfc3BpX3R4cnhfYnVmcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBhdTE1NTBfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXJldHVybiBody0+dHhyeF9idWZzKHNwaSwgdCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhdTE1NTBfc3BpX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IGF1MTU1MF9zcGkgKmh3ID0gZGV2OworCXJldHVybiBody0+aXJxX2NhbGxiYWNrKGh3KTsKK30KKworc3RhdGljIHZvaWQgYXUxNTUwX3NwaV9iaXRzX2hhbmRsZXJzX3NldChzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcsIGludCBicHcpCit7CisJaWYgKGJwdyA8PSA4KSB7CisJCWlmIChody0+dXNlZG1hKSB7CisJCQlody0+dHhyeF9idWZzID0gJmF1MTU1MF9zcGlfZG1hX3R4cnhiOworCQkJaHctPmlycV9jYWxsYmFjayA9ICZhdTE1NTBfc3BpX2RtYV9pcnFfY2FsbGJhY2s7CisJCX0gZWxzZSB7CisJCQlody0+cnhfd29yZCA9ICZhdTE1NTBfc3BpX3J4X3dvcmRfODsKKwkJCWh3LT50eF93b3JkID0gJmF1MTU1MF9zcGlfdHhfd29yZF84OworCQkJaHctPnR4cnhfYnVmcyA9ICZhdTE1NTBfc3BpX3Bpb190eHJ4YjsKKwkJCWh3LT5pcnFfY2FsbGJhY2sgPSAmYXUxNTUwX3NwaV9waW9faXJxX2NhbGxiYWNrOworCQl9CisJfSBlbHNlIGlmIChicHcgPD0gMTYpIHsKKwkJaHctPnJ4X3dvcmQgPSAmYXUxNTUwX3NwaV9yeF93b3JkXzE2OworCQlody0+dHhfd29yZCA9ICZhdTE1NTBfc3BpX3R4X3dvcmRfMTY7CisJCWh3LT50eHJ4X2J1ZnMgPSAmYXUxNTUwX3NwaV9waW9fdHhyeGI7CisJCWh3LT5pcnFfY2FsbGJhY2sgPSAmYXUxNTUwX3NwaV9waW9faXJxX2NhbGxiYWNrOworCX0gZWxzZSB7CisJCWh3LT5yeF93b3JkID0gJmF1MTU1MF9zcGlfcnhfd29yZF8zMjsKKwkJaHctPnR4X3dvcmQgPSAmYXUxNTUwX3NwaV90eF93b3JkXzMyOworCQlody0+dHhyeF9idWZzID0gJmF1MTU1MF9zcGlfcGlvX3R4cnhiOworCQlody0+aXJxX2NhbGxiYWNrID0gJmF1MTU1MF9zcGlfcGlvX2lycV9jYWxsYmFjazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhdTE1NTBfc3BpX3NldHVwX3BzY19hc19zcGkoc3RydWN0IGF1MTU1MF9zcGkgKmh3KQoreworCXUzMiBzdGF0LCBjZmc7CisKKwkvKiBzZXQgdXAgdGhlIFBTQyBmb3IgU1BJIG1vZGUgKi8KKwlody0+cmVncy0+cHNjX2N0cmwgPSBQU0NfQ1RSTF9ESVNBQkxFOworCWF1X3N5bmMoKTsKKwlody0+cmVncy0+cHNjX3NlbCA9IFBTQ19TRUxfUFNfU1BJTU9ERTsKKwlhdV9zeW5jKCk7CisKKwlody0+cmVncy0+cHNjX3NwaWNmZyA9IDA7CisJYXVfc3luYygpOworCisJaHctPnJlZ3MtPnBzY19jdHJsID0gUFNDX0NUUkxfRU5BQkxFOworCWF1X3N5bmMoKTsKKworCWRvIHsKKwkJc3RhdCA9IGh3LT5yZWdzLT5wc2Nfc3Bpc3RhdDsKKwkJYXVfc3luYygpOworCX0gd2hpbGUgKChzdGF0ICYgUFNDX1NQSVNUQVRfU1IpID09IDApOworCisKKwljZmcgPSBody0+dXNlZG1hID8gMCA6IFBTQ19TUElDRkdfRERfRElTQUJMRTsKKwljZmcgfD0gUFNDX1NQSUNGR19TRVRfTEVOKDgpOworCWNmZyB8PSBQU0NfU1BJQ0ZHX1JUX0ZJRk84IHwgUFNDX1NQSUNGR19UVF9GSUZPODsKKwkvKiB1c2UgbWluaW1hbCBhbGxvd2VkIGJyZyBhbmQgZGl2IHZhbHVlcyBhcyBpbml0aWFsIHNldHRpbmc6ICovCisJY2ZnIHw9IFBTQ19TUElDRkdfU0VUX0JBVUQoNCkgfCBQU0NfU1BJQ0ZHX1NFVF9ESVYoMCk7CisKKyNpZmRlZiBBVTE1NTBfU1BJX0RFQlVHX0xPT1BCQUNLCisJY2ZnIHw9IFBTQ19TUElDRkdfTEI7CisjZW5kaWYKKworCWh3LT5yZWdzLT5wc2Nfc3BpY2ZnID0gY2ZnOworCWF1X3N5bmMoKTsKKworCWF1MTU1MF9zcGlfbWFza19hY2tfYWxsKGh3KTsKKworCWh3LT5yZWdzLT5wc2Nfc3BpY2ZnIHw9IFBTQ19TUElDRkdfREVfRU5BQkxFOworCWF1X3N5bmMoKTsKKworCWRvIHsKKwkJc3RhdCA9IGh3LT5yZWdzLT5wc2Nfc3Bpc3RhdDsKKwkJYXVfc3luYygpOworCX0gd2hpbGUgKChzdGF0ICYgUFNDX1NQSVNUQVRfRFIpID09IDApOworCisJYXUxNTUwX3NwaV9yZXNldF9maWZvcyhodyk7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgYXUxNTUwX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhdTE1NTBfc3BpICpodzsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlpbnQgZXJyID0gMDsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBhdTE1NTBfc3BpKSk7CisJaWYgKG1hc3RlciA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIG1lbW9yeSBmb3Igc3BpX21hc3RlclxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX25vbWVtOworCX0KKworCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIIHwgU1BJX0xTQl9GSVJTVDsKKworCWh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJaHctPm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJaHctPnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaHctPmRldiA9ICZwZGV2LT5kZXY7CisKKwlpZiAoaHctPnBkYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBzdXBwbGllZFxuIik7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX25vX3BkYXRhOworCX0KKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmICghcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBJUlFcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9ub19pb3JlczsKKwl9CisJaHctPmlycSA9IHItPnN0YXJ0OworCisJaHctPnVzZWRtYSA9IDA7CisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7CisJaWYgKHIpIHsKKwkJaHctPmRtYV90eF9pZCA9IHItPnN0YXJ0OworCQlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKKwkJaWYgKHIpIHsKKwkJCWh3LT5kbWFfcnhfaWQgPSByLT5zdGFydDsKKwkJCWlmICh1c2VkbWEgJiYgZGRtYV9tZW1pZCkgeworCQkJCWlmIChwZGV2LT5kZXYuZG1hX21hc2sgPT0gTlVMTCkKKwkJCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIm5vIGRtYSBtYXNrXG4iKTsKKwkJCQllbHNlCisJCQkJCWh3LT51c2VkbWEgPSAxOworCQkJfQorCQl9CisJfQorCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1taW8gcmVzb3VyY2VcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9ub19pb3JlczsKKwl9CisKKwlody0+aW9hcmVhID0gcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCBzaXplb2YocHNjX3NwaV90KSwKKwkJCQkJcGRldi0+bmFtZSk7CisJaWYgKCFody0+aW9hcmVhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCByZXNlcnZlIGlvbWVtIHJlZ2lvblxuIik7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBlcnJfbm9faW9yZXM7CisJfQorCisJaHctPnJlZ3MgPSAocHNjX3NwaV90IF9faW9tZW0gKilpb3JlbWFwKHItPnN0YXJ0LCBzaXplb2YocHNjX3NwaV90KSk7CisJaWYgKCFody0+cmVncykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgaW9yZW1hcFxuIik7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7CisKKwlpbml0X2NvbXBsZXRpb24oJmh3LT5tYXN0ZXJfZG9uZSk7CisKKwlody0+Yml0YmFuZy5tYXN0ZXIgPSBody0+bWFzdGVyOworCWh3LT5iaXRiYW5nLnNldHVwX3RyYW5zZmVyID0gYXUxNTUwX3NwaV9zZXR1cHhmZXI7CisJaHctPmJpdGJhbmcuY2hpcHNlbGVjdCA9IGF1MTU1MF9zcGlfY2hpcHNlbDsKKwlody0+Yml0YmFuZy5tYXN0ZXItPnNldHVwID0gYXUxNTUwX3NwaV9zZXR1cDsKKwlody0+Yml0YmFuZy50eHJ4X2J1ZnMgPSBhdTE1NTBfc3BpX3R4cnhfYnVmczsKKworCWlmIChody0+dXNlZG1hKSB7CisJCWh3LT5kbWFfdHhfY2ggPSBhdTF4eHhfZGJkbWFfY2hhbl9hbGxvYyhkZG1hX21lbWlkLAorCQkJaHctPmRtYV90eF9pZCwgTlVMTCwgKHZvaWQgKilodyk7CisJCWlmIChody0+ZG1hX3R4X2NoID09IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiQ2Fubm90IGFsbG9jYXRlIHR4IGRtYSBjaGFubmVsXG4iKTsKKwkJCWVyciA9IC1FTlhJTzsKKwkJCWdvdG8gZXJyX25vX3R4ZG1hOworCQl9CisJCWF1MXh4eF9kYmRtYV9zZXRfZGV2d2lkdGgoaHctPmRtYV90eF9jaCwgOCk7CisJCWlmIChhdTF4eHhfZGJkbWFfcmluZ19hbGxvYyhody0+ZG1hX3R4X2NoLAorCQkJQVUxNTUwX1NQSV9EQkRNQV9ERVNDUklQVE9SUykgPT0gMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJDYW5ub3QgYWxsb2NhdGUgdHggZG1hIGRlc2NyaXB0b3JzXG4iKTsKKwkJCWVyciA9IC1FTlhJTzsKKwkJCWdvdG8gZXJyX25vX3R4ZG1hX2Rlc2NyOworCQl9CisKKworCQlody0+ZG1hX3J4X2NoID0gYXUxeHh4X2RiZG1hX2NoYW5fYWxsb2MoaHctPmRtYV9yeF9pZCwKKwkJCWRkbWFfbWVtaWQsIE5VTEwsICh2b2lkICopaHcpOworCQlpZiAoaHctPmRtYV9yeF9jaCA9PSAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkNhbm5vdCBhbGxvY2F0ZSByeCBkbWEgY2hhbm5lbFxuIik7CisJCQllcnIgPSAtRU5YSU87CisJCQlnb3RvIGVycl9ub19yeGRtYTsKKwkJfQorCQlhdTF4eHhfZGJkbWFfc2V0X2RldndpZHRoKGh3LT5kbWFfcnhfY2gsIDgpOworCQlpZiAoYXUxeHh4X2RiZG1hX3JpbmdfYWxsb2MoaHctPmRtYV9yeF9jaCwKKwkJCUFVMTU1MF9TUElfREJETUFfREVTQ1JJUFRPUlMpID09IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiQ2Fubm90IGFsbG9jYXRlIHJ4IGRtYSBkZXNjcmlwdG9yc1xuIik7CisJCQllcnIgPSAtRU5YSU87CisJCQlnb3RvIGVycl9ub19yeGRtYV9kZXNjcjsKKwkJfQorCisJCWVyciA9IGF1MTU1MF9zcGlfZG1hX3J4dG1wX2FsbG9jKGh3LAorCQkJQVUxNTUwX1NQSV9ETUFfUlhUTVBfTUlOU0laRSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkNhbm5vdCBhbGxvY2F0ZSBpbml0aWFsIHJ4IGRtYSB0bXAgYnVmZmVyXG4iKTsKKwkJCWdvdG8gZXJyX2RtYV9yeHRtcF9hbGxvYzsKKwkJfQorCX0KKworCWF1MTU1MF9zcGlfYml0c19oYW5kbGVyc19zZXQoaHcsIDgpOworCisJZXJyID0gcmVxdWVzdF9pcnEoaHctPmlycSwgYXUxNTUwX3NwaV9pcnEsIDAsIHBkZXYtPm5hbWUsIGh3KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBjbGFpbSBJUlFcbiIpOworCQlnb3RvIGVycl9ub19pcnE7CisJfQorCisJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IGh3LT5wZGF0YS0+bnVtX2NoaXBzZWxlY3Q7CisKKwkvKgorCSAqICBwcmVjb21wdXRlIHZhbGlkIHJhbmdlIGZvciBzcGkgZnJlcSAtIGZyb20gYXUxNTUwIGRhdGFzaGVldDoKKwkgKiAgICBwc2NfdGVtcGNsayA9IHBzY19tYWluY2xrIC8gKDIgPDwgRElWKQorCSAqICAgIHNwaWNsayA9IHBzY190ZW1wY2xrIC8gKDIgKiAoQlJHICsgMSkpCisJICogICAgQlJHIHZhbGlkIHJhbmdlIGlzIDQuLjYzCisJICogICAgRElWIHZhbGlkIHJhbmdlIGlzIDAuLjMKKwkgKiAgcm91bmQgdGhlIG1pbiBhbmQgbWF4IGZyZXF1ZW5jaWVzIHRvIHZhbHVlcyB0aGF0IHdvdWxkIHN0aWxsCisJICogIHByb2R1Y2UgdmFsaWQgYnJnIGFuZCBkaXYKKwkgKi8KKwl7CisJCWludCBtaW5fZGl2ID0gKDIgPDwgMCkgKiAoMiAqICg0ICsgMSkpOworCQlpbnQgbWF4X2RpdiA9ICgyIDw8IDMpICogKDIgKiAoNjMgKyAxKSk7CisJCWh3LT5mcmVxX21heCA9IGh3LT5wZGF0YS0+bWFpbmNsa19oeiAvIG1pbl9kaXY7CisJCWh3LT5mcmVxX21pbiA9IGh3LT5wZGF0YS0+bWFpbmNsa19oeiAvIChtYXhfZGl2ICsgMSkgKyAxOworCX0KKworCWF1MTU1MF9zcGlfc2V0dXBfcHNjX2FzX3NwaShodyk7CisKKwllcnIgPSBzcGlfYml0YmFuZ19zdGFydCgmaHctPmJpdGJhbmcpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFNQSSBtYXN0ZXJcbiIpOworCQlnb3RvIGVycl9yZWdpc3RlcjsKKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkic3BpIG1hc3RlciByZWdpc3RlcmVkOiBidXNfbnVtPSVkIG51bV9jaGlwc2VsZWN0PSVkXG4iLAorCQltYXN0ZXItPmJ1c19udW0sIG1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpOworCisJcmV0dXJuIDA7CisKK2Vycl9yZWdpc3RlcjoKKwlmcmVlX2lycShody0+aXJxLCBodyk7CisKK2Vycl9ub19pcnE6CisJYXUxNTUwX3NwaV9kbWFfcnh0bXBfZnJlZShodyk7CisKK2Vycl9kbWFfcnh0bXBfYWxsb2M6CitlcnJfbm9fcnhkbWFfZGVzY3I6CisJaWYgKGh3LT51c2VkbWEpCisJCWF1MXh4eF9kYmRtYV9jaGFuX2ZyZWUoaHctPmRtYV9yeF9jaCk7CisKK2Vycl9ub19yeGRtYToKK2Vycl9ub190eGRtYV9kZXNjcjoKKwlpZiAoaHctPnVzZWRtYSkKKwkJYXUxeHh4X2RiZG1hX2NoYW5fZnJlZShody0+ZG1hX3R4X2NoKTsKKworZXJyX25vX3R4ZG1hOgorCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWh3LT5yZWdzKTsKKworZXJyX2lvcmVtYXA6CisJcmVsZWFzZV9yZXNvdXJjZShody0+aW9hcmVhKTsKKwlrZnJlZShody0+aW9hcmVhKTsKKworZXJyX25vX2lvcmVzOgorZXJyX25vX3BkYXRhOgorCXNwaV9tYXN0ZXJfcHV0KGh3LT5tYXN0ZXIpOworCitlcnJfbm9tZW06CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2V4aXQgYXUxNTUwX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXUxNTUwX3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJzcGkgbWFzdGVyIHJlbW92ZTogYnVzX251bT0lZFxuIiwKKwkJaHctPm1hc3Rlci0+YnVzX251bSk7CisKKwlzcGlfYml0YmFuZ19zdG9wKCZody0+Yml0YmFuZyk7CisJZnJlZV9pcnEoaHctPmlycSwgaHcpOworCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWh3LT5yZWdzKTsKKwlyZWxlYXNlX3Jlc291cmNlKGh3LT5pb2FyZWEpOworCWtmcmVlKGh3LT5pb2FyZWEpOworCisJaWYgKGh3LT51c2VkbWEpIHsKKwkJYXUxNTUwX3NwaV9kbWFfcnh0bXBfZnJlZShodyk7CisJCWF1MXh4eF9kYmRtYV9jaGFuX2ZyZWUoaHctPmRtYV9yeF9jaCk7CisJCWF1MXh4eF9kYmRtYV9jaGFuX2ZyZWUoaHctPmRtYV90eF9jaCk7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlzcGlfbWFzdGVyX3B1dChody0+bWFzdGVyKTsKKwlyZXR1cm4gMDsKK30KKworLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmF1MTU1MC1zcGkiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXUxNTUwX3NwaV9kcnYgPSB7CisJLnJlbW92ZSA9IF9fZXhpdF9wKGF1MTU1MF9zcGlfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhdTE1NTAtc3BpIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF1MTU1MF9zcGlfaW5pdCh2b2lkKQoreworCS8qCisJICogY3JlYXRlIG1lbW9yeSBkZXZpY2Ugd2l0aCA4IGJpdHMgZGV2X2RldndpZHRoCisJICogbmVlZGVkIGZvciBwcm9wZXIgYnl0ZSBvcmRlcmluZyB0byBzcGkgZmlmbworCSAqLworCWlmICh1c2VkbWEpIHsKKwkJZGRtYV9tZW1pZCA9IGF1MXh4eF9kZG1hX2FkZF9kZXZpY2UoJmF1MTU1MF9zcGlfbWVtX2RiZGV2KTsKKwkJaWYgKCFkZG1hX21lbWlkKQorCQkJcHJpbnRrKEtFUk5fRVJSICJhdTE1NTAtc3BpOiBjYW5ub3QgYWRkIG1lbW9yeSIKKwkJCQkJImRiZG1hIGRldmljZVxuIik7CisJfQorCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmF1MTU1MF9zcGlfZHJ2LCBhdTE1NTBfc3BpX3Byb2JlKTsKK30KK21vZHVsZV9pbml0KGF1MTU1MF9zcGlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdTE1NTBfc3BpX2V4aXQodm9pZCkKK3sKKwlpZiAodXNlZG1hICYmIGRkbWFfbWVtaWQpCisJCWF1MXh4eF9kZG1hX2RlbF9kZXZpY2UoZGRtYV9tZW1pZCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1MTU1MF9zcGlfZHJ2KTsKK30KK21vZHVsZV9leGl0KGF1MTU1MF9zcGlfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQXUxNTUwIFBTQyBTUEkgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJKYW4gTmlraXRlbmtvIDxqYW4ubmlraXRlbmtvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9iZmluX3Nwb3J0LmMgYi9kcml2ZXJzL3NwaS9zcGktYmZpbi1zcG9ydC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3NwaS9zcGlfYmZpbl9zcG9ydC5jCnJlbmFtZSB0byBkcml2ZXJzL3NwaS9zcGktYmZpbi1zcG9ydC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYmZpbjV4eC5jIGIvZHJpdmVycy9zcGkvc3BpLWJmaW41eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQyNWYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJmaW41eHguYwpAQCAtMCwwICsxLDE0OTEgQEAKKy8qCisgKiBCbGFja2ZpbiBPbi1DaGlwIFNQSSBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KKyNpbmNsdWRlIDxhc20vYmZpbjV4eF9zcGkuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJiZmluLXNwaSIKKyNkZWZpbmUgRFJWX0FVVEhPUgkiQnJ5YW4gV3UsIEx1a2UgWWFuZyIKKyNkZWZpbmUgRFJWX0RFU0MJIkJsYWNrZmluIG9uLWNoaXAgU1BJIENvbnRyb2xsZXIgRHJpdmVyIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wIgorCitNT0RVTEVfQVVUSE9SKERSVl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBTVEFSVF9TVEFURQkoKHZvaWQgKikwKQorI2RlZmluZSBSVU5OSU5HX1NUQVRFCSgodm9pZCAqKTEpCisjZGVmaW5lIERPTkVfU1RBVEUJKCh2b2lkICopMikKKyNkZWZpbmUgRVJST1JfU1RBVEUJKCh2b2lkICopLTEpCisKK3N0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YTsKKworc3RydWN0IGJmaW5fc3BpX3RyYW5zZmVyX29wcyB7CisJdm9pZCAoKndyaXRlKSAoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICopOworCXZvaWQgKCpyZWFkKSAoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICopOworCXZvaWQgKCpkdXBsZXgpIChzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKik7Cit9OworCitzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgeworCS8qIERyaXZlciBtb2RlbCBob29rdXAgKi8KKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCisJLyogU1BJIGZyYW1ld29yayBob29rdXAgKi8KKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCisJLyogUmVncyBiYXNlIG9mIFNQSSBjb250cm9sbGVyICovCisJc3RydWN0IGJmaW5fc3BpX3JlZ3MgX19pb21lbSAqcmVnczsKKworCS8qIFBpbiByZXF1ZXN0IGxpc3QgKi8KKwl1MTYgKnBpbl9yZXE7CisKKwkvKiBCRklOIGhvb2t1cCAqLworCXN0cnVjdCBiZmluNXh4X3NwaV9tYXN0ZXIgKm1hc3Rlcl9pbmZvOworCisJLyogRHJpdmVyIG1lc3NhZ2UgcXVldWUgKi8KKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOworCXN0cnVjdCB3b3JrX3N0cnVjdCBwdW1wX21lc3NhZ2VzOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOworCWludCBidXN5OworCWJvb2wgcnVubmluZzsKKworCS8qIE1lc3NhZ2UgVHJhbnNmZXIgcHVtcCAqLworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwdW1wX3RyYW5zZmVyczsKKworCS8qIEN1cnJlbnQgbWVzc2FnZSB0cmFuc2ZlciBzdGF0ZSBpbmZvICovCisJc3RydWN0IHNwaV9tZXNzYWdlICpjdXJfbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKmN1cl90cmFuc2ZlcjsKKwlzdHJ1Y3QgYmZpbl9zcGlfc2xhdmVfZGF0YSAqY3VyX2NoaXA7CisJc2l6ZV90IGxlbl9pbl9ieXRlczsKKwlzaXplX3QgbGVuOworCXZvaWQgKnR4OworCXZvaWQgKnR4X2VuZDsKKwl2b2lkICpyeDsKKwl2b2lkICpyeF9lbmQ7CisKKwkvKiBETUEgc3R1ZmZzICovCisJaW50IGRtYV9jaGFubmVsOworCWludCBkbWFfbWFwcGVkOworCWludCBkbWFfcmVxdWVzdGVkOworCWRtYV9hZGRyX3QgcnhfZG1hOworCWRtYV9hZGRyX3QgdHhfZG1hOworCisJaW50IGlycV9yZXF1ZXN0ZWQ7CisJaW50IHNwaV9pcnE7CisKKwlzaXplX3QgcnhfbWFwX2xlbjsKKwlzaXplX3QgdHhfbWFwX2xlbjsKKwl1OCBuX2J5dGVzOworCXUxNiBjdHJsX3JlZzsKKwl1MTYgZmxhZ19yZWc7CisKKwlpbnQgY3NfY2hhbmdlOworCWNvbnN0IHN0cnVjdCBiZmluX3NwaV90cmFuc2Zlcl9vcHMgKm9wczsKK307CisKK3N0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhIHsKKwl1MTYgY3RsX3JlZzsKKwl1MTYgYmF1ZDsKKwl1MTYgZmxhZzsKKworCXU4IGNoaXBfc2VsZWN0X251bTsKKwl1OCBlbmFibGVfZG1hOworCXUxNiBjc19jaGdfdWRlbGF5OwkvKiBTb21lIGRldmljZXMgcmVxdWlyZSA+IDI1NXVzZWMgZGVsYXkgKi8KKwl1MzIgY3NfZ3BpbzsKKwl1MTYgaWRsZV90eF92YWw7CisJdTggcGlvX2ludGVycnVwdDsJLyogdXNlIHNwaSBkYXRhIGlycSAqLworCWNvbnN0IHN0cnVjdCBiZmluX3NwaV90cmFuc2Zlcl9vcHMgKm9wczsKK307CisKK3N0YXRpYyB2b2lkIGJmaW5fc3BpX2VuYWJsZShzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQoreworCWJmaW5fd3JpdGVfb3IoJmRydl9kYXRhLT5yZWdzLT5jdGwsIEJJVF9DVExfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgYmZpbl9zcGlfZGlzYWJsZShzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQoreworCWJmaW5fd3JpdGVfYW5kKCZkcnZfZGF0YS0+cmVncy0+Y3RsLCB+QklUX0NUTF9FTkFCTEUpOworfQorCisvKiBDYWN1bGF0ZSB0aGUgU1BJX0JBVUQgcmVnaXN0ZXIgdmFsdWUgYmFzZWQgb24gaW5wdXQgSFogKi8KK3N0YXRpYyB1MTYgaHpfdG9fc3BpX2JhdWQodTMyIHNwZWVkX2h6KQoreworCXVfbG9uZyBzY2xrID0gZ2V0X3NjbGsoKTsKKwl1MTYgc3BpX2JhdWQgPSAoc2NsayAvICgyICogc3BlZWRfaHopKTsKKworCWlmICgoc2NsayAlICgyICogc3BlZWRfaHopKSA+IDApCisJCXNwaV9iYXVkKys7CisKKwlpZiAoc3BpX2JhdWQgPCBNSU5fU1BJX0JBVURfVkFMKQorCQlzcGlfYmF1ZCA9IE1JTl9TUElfQkFVRF9WQUw7CisKKwlyZXR1cm4gc3BpX2JhdWQ7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9zcGlfZmx1c2goc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGxpbWl0ID0gbG9vcHNfcGVyX2ppZmZ5IDw8IDE7CisKKwkvKiB3YWl0IGZvciBzdG9wIGFuZCBjbGVhciBzdGF0ICovCisJd2hpbGUgKCEoYmZpbl9yZWFkKCZkcnZfZGF0YS0+cmVncy0+c3RhdCkgJiBCSVRfU1RBVF9TUElGKSAmJiAtLWxpbWl0KQorCQljcHVfcmVsYXgoKTsKKworCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT5zdGF0LCBCSVRfU1RBVF9DTFIpOworCisJcmV0dXJuIGxpbWl0OworfQorCisvKiBDaGlwIHNlbGVjdCBvcGVyYXRpb24gZnVuY3Rpb25zIGZvciBjc19jaGFuZ2UgZmxhZyAqLworc3RhdGljIHZvaWQgYmZpbl9zcGlfY3NfYWN0aXZlKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEsIHN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjaGlwKQoreworCWlmIChsaWtlbHkoY2hpcC0+Y2hpcF9zZWxlY3RfbnVtIDwgTUFYX0NUUkxfQ1MpKQorCQliZmluX3dyaXRlX2FuZCgmZHJ2X2RhdGEtPnJlZ3MtPmZsZywgfmNoaXAtPmZsYWcpOworCWVsc2UKKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+Y3NfZ3BpbywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGJmaW5fc3BpX2NzX2RlYWN0aXZlKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZpbl9zcGlfc2xhdmVfZGF0YSAqY2hpcCkKK3sKKwlpZiAobGlrZWx5KGNoaXAtPmNoaXBfc2VsZWN0X251bSA8IE1BWF9DVFJMX0NTKSkKKwkJYmZpbl93cml0ZV9vcigmZHJ2X2RhdGEtPnJlZ3MtPmZsZywgY2hpcC0+ZmxhZyk7CisJZWxzZQorCQlncGlvX3NldF92YWx1ZShjaGlwLT5jc19ncGlvLCAxKTsKKworCS8qIE1vdmUgZGVsYXkgaGVyZSBmb3IgY29uc2lzdGVuY3kgKi8KKwlpZiAoY2hpcC0+Y3NfY2hnX3VkZWxheSkKKwkJdWRlbGF5KGNoaXAtPmNzX2NoZ191ZGVsYXkpOworfQorCisvKiBlbmFibGUgb3IgZGlzYWJsZSB0aGUgcGluIG11eGVkIGJ5IEdQSU8gYW5kIFNQSSBDUyB0byB3b3JrIGFzIFNQSSBDUyAqLworc3RhdGljIGlubGluZSB2b2lkIGJmaW5fc3BpX2NzX2VuYWJsZShzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZpbl9zcGlfc2xhdmVfZGF0YSAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+Y2hpcF9zZWxlY3RfbnVtIDwgTUFYX0NUUkxfQ1MpCisJCWJmaW5fd3JpdGVfb3IoJmRydl9kYXRhLT5yZWdzLT5mbGcsIGNoaXAtPmZsYWcgPj4gOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZmluX3NwaV9jc19kaXNhYmxlKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZpbl9zcGlfc2xhdmVfZGF0YSAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+Y2hpcF9zZWxlY3RfbnVtIDwgTUFYX0NUUkxfQ1MpCisJCWJmaW5fd3JpdGVfYW5kKCZkcnZfZGF0YS0+cmVncy0+ZmxnLCB+KGNoaXAtPmZsYWcgPj4gOCkpOworfQorCisvKiBzdG9wIGNvbnRyb2xsZXIgYW5kIHJlLWNvbmZpZyBjdXJyZW50IGNoaXAqLworc3RhdGljIHZvaWQgYmZpbl9zcGlfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQoreworCXN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjaGlwID0gZHJ2X2RhdGEtPmN1cl9jaGlwOworCisJLyogQ2xlYXIgc3RhdHVzIGFuZCBkaXNhYmxlIGNsb2NrICovCisJYmZpbl93cml0ZSgmZHJ2X2RhdGEtPnJlZ3MtPnN0YXQsIEJJVF9TVEFUX0NMUik7CisJYmZpbl9zcGlfZGlzYWJsZShkcnZfZGF0YSk7CisJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwgInJlc3RvcmluZyBzcGkgY3RsIHN0YXRlXG4iKTsKKworCVNTWU5DKCk7CisKKwkvKiBMb2FkIHRoZSByZWdpc3RlcnMgKi8KKwliZmluX3dyaXRlKCZkcnZfZGF0YS0+cmVncy0+Y3RsLCBjaGlwLT5jdGxfcmVnKTsKKwliZmluX3dyaXRlKCZkcnZfZGF0YS0+cmVncy0+YmF1ZCwgY2hpcC0+YmF1ZCk7CisKKwliZmluX3NwaV9lbmFibGUoZHJ2X2RhdGEpOworCWJmaW5fc3BpX2NzX2FjdGl2ZShkcnZfZGF0YSwgY2hpcCk7Cit9CisKKy8qIHVzZWQgdG8ga2ljayBvZmYgdHJhbnNmZXIgaW4gcnggbW9kZSBhbmQgcmVhZCB1bndhbnRlZCBSWCBkYXRhICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmZpbl9zcGlfZHVtbXlfcmVhZChzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQoreworCSh2b2lkKSBiZmluX3JlYWQoJmRydl9kYXRhLT5yZWdzLT5yZGJyKTsKK30KKworc3RhdGljIHZvaWQgYmZpbl9zcGlfdThfd3JpdGVyKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCit7CisJLyogY2xlYXIgUlhTICh3ZSBjaGVjayBmb3IgUlhTIGluc2lkZSB0aGUgbG9vcCkgKi8KKwliZmluX3NwaV9kdW1teV9yZWFkKGRydl9kYXRhKTsKKworCXdoaWxlIChkcnZfZGF0YS0+dHggPCBkcnZfZGF0YS0+dHhfZW5kKSB7CisJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT50ZGJyLCAoKih1OCAqKSAoZHJ2X2RhdGEtPnR4KyspKSk7CisJCS8qIHdhaXQgdW50aWwgdHJhbnNmZXIgZmluaXNoZWQuCisJCSAgIGNoZWNraW5nIFNQSUYgb3IgVFhTIG1heSBub3QgZ3VhcmFudGVlIHRyYW5zZmVyIGNvbXBsZXRpb24gKi8KKwkJd2hpbGUgKCEoYmZpbl9yZWFkKCZkcnZfZGF0YS0+cmVncy0+c3RhdCkgJiBCSVRfU1RBVF9SWFMpKQorCQkJY3B1X3JlbGF4KCk7CisJCS8qIGRpc2NhcmQgUlggZGF0YSBhbmQgY2xlYXIgUlhTICovCisJCWJmaW5fc3BpX2R1bW15X3JlYWQoZHJ2X2RhdGEpOworCX0KK30KKworc3RhdGljIHZvaWQgYmZpbl9zcGlfdThfcmVhZGVyKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCit7CisJdTE2IHR4X3ZhbCA9IGRydl9kYXRhLT5jdXJfY2hpcC0+aWRsZV90eF92YWw7CisKKwkvKiBkaXNjYXJkIG9sZCBSWCBkYXRhIGFuZCBjbGVhciBSWFMgKi8KKwliZmluX3NwaV9kdW1teV9yZWFkKGRydl9kYXRhKTsKKworCXdoaWxlIChkcnZfZGF0YS0+cnggPCBkcnZfZGF0YS0+cnhfZW5kKSB7CisJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT50ZGJyLCB0eF92YWwpOworCQl3aGlsZSAoIShiZmluX3JlYWQoJmRydl9kYXRhLT5yZWdzLT5zdGF0KSAmIEJJVF9TVEFUX1JYUykpCisJCQljcHVfcmVsYXgoKTsKKwkJKih1OCAqKSAoZHJ2X2RhdGEtPnJ4KyspID0gYmZpbl9yZWFkKCZkcnZfZGF0YS0+cmVncy0+cmRicik7CisJfQorfQorCitzdGF0aWMgdm9pZCBiZmluX3NwaV91OF9kdXBsZXgoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSkKK3sKKwkvKiBkaXNjYXJkIG9sZCBSWCBkYXRhIGFuZCBjbGVhciBSWFMgKi8KKwliZmluX3NwaV9kdW1teV9yZWFkKGRydl9kYXRhKTsKKworCXdoaWxlIChkcnZfZGF0YS0+cnggPCBkcnZfZGF0YS0+cnhfZW5kKSB7CisJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT50ZGJyLCAoKih1OCAqKSAoZHJ2X2RhdGEtPnR4KyspKSk7CisJCXdoaWxlICghKGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnN0YXQpICYgQklUX1NUQVRfUlhTKSkKKwkJCWNwdV9yZWxheCgpOworCQkqKHU4ICopIChkcnZfZGF0YS0+cngrKykgPSBiZmluX3JlYWQoJmRydl9kYXRhLT5yZWdzLT5yZGJyKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmZpbl9zcGlfdHJhbnNmZXJfb3BzIGJmaW5fYmZpbl9zcGlfdHJhbnNmZXJfb3BzX3U4ID0geworCS53cml0ZSAgPSBiZmluX3NwaV91OF93cml0ZXIsCisJLnJlYWQgICA9IGJmaW5fc3BpX3U4X3JlYWRlciwKKwkuZHVwbGV4ID0gYmZpbl9zcGlfdThfZHVwbGV4LAorfTsKKworc3RhdGljIHZvaWQgYmZpbl9zcGlfdTE2X3dyaXRlcihzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQoreworCS8qIGNsZWFyIFJYUyAod2UgY2hlY2sgZm9yIFJYUyBpbnNpZGUgdGhlIGxvb3ApICovCisJYmZpbl9zcGlfZHVtbXlfcmVhZChkcnZfZGF0YSk7CisKKwl3aGlsZSAoZHJ2X2RhdGEtPnR4IDwgZHJ2X2RhdGEtPnR4X2VuZCkgeworCQliZmluX3dyaXRlKCZkcnZfZGF0YS0+cmVncy0+dGRiciwgKCoodTE2ICopIChkcnZfZGF0YS0+dHgpKSk7CisJCWRydl9kYXRhLT50eCArPSAyOworCQkvKiB3YWl0IHVudGlsIHRyYW5zZmVyIGZpbmlzaGVkLgorCQkgICBjaGVja2luZyBTUElGIG9yIFRYUyBtYXkgbm90IGd1YXJhbnRlZSB0cmFuc2ZlciBjb21wbGV0aW9uICovCisJCXdoaWxlICghKGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnN0YXQpICYgQklUX1NUQVRfUlhTKSkKKwkJCWNwdV9yZWxheCgpOworCQkvKiBkaXNjYXJkIFJYIGRhdGEgYW5kIGNsZWFyIFJYUyAqLworCQliZmluX3NwaV9kdW1teV9yZWFkKGRydl9kYXRhKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJmaW5fc3BpX3UxNl9yZWFkZXIoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSkKK3sKKwl1MTYgdHhfdmFsID0gZHJ2X2RhdGEtPmN1cl9jaGlwLT5pZGxlX3R4X3ZhbDsKKworCS8qIGRpc2NhcmQgb2xkIFJYIGRhdGEgYW5kIGNsZWFyIFJYUyAqLworCWJmaW5fc3BpX2R1bW15X3JlYWQoZHJ2X2RhdGEpOworCisJd2hpbGUgKGRydl9kYXRhLT5yeCA8IGRydl9kYXRhLT5yeF9lbmQpIHsKKwkJYmZpbl93cml0ZSgmZHJ2X2RhdGEtPnJlZ3MtPnRkYnIsIHR4X3ZhbCk7CisJCXdoaWxlICghKGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnN0YXQpICYgQklUX1NUQVRfUlhTKSkKKwkJCWNwdV9yZWxheCgpOworCQkqKHUxNiAqKSAoZHJ2X2RhdGEtPnJ4KSA9IGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnJkYnIpOworCQlkcnZfZGF0YS0+cnggKz0gMjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJmaW5fc3BpX3UxNl9kdXBsZXgoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSkKK3sKKwkvKiBkaXNjYXJkIG9sZCBSWCBkYXRhIGFuZCBjbGVhciBSWFMgKi8KKwliZmluX3NwaV9kdW1teV9yZWFkKGRydl9kYXRhKTsKKworCXdoaWxlIChkcnZfZGF0YS0+cnggPCBkcnZfZGF0YS0+cnhfZW5kKSB7CisJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT50ZGJyLCAoKih1MTYgKikgKGRydl9kYXRhLT50eCkpKTsKKwkJZHJ2X2RhdGEtPnR4ICs9IDI7CisJCXdoaWxlICghKGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnN0YXQpICYgQklUX1NUQVRfUlhTKSkKKwkJCWNwdV9yZWxheCgpOworCQkqKHUxNiAqKSAoZHJ2X2RhdGEtPnJ4KSA9IGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnJkYnIpOworCQlkcnZfZGF0YS0+cnggKz0gMjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmZpbl9zcGlfdHJhbnNmZXJfb3BzIGJmaW5fYmZpbl9zcGlfdHJhbnNmZXJfb3BzX3UxNiA9IHsKKwkud3JpdGUgID0gYmZpbl9zcGlfdTE2X3dyaXRlciwKKwkucmVhZCAgID0gYmZpbl9zcGlfdTE2X3JlYWRlciwKKwkuZHVwbGV4ID0gYmZpbl9zcGlfdTE2X2R1cGxleCwKK307CisKKy8qIHRlc3QgaWYgdGhlcmUgaXMgbW9yZSB0cmFuc2ZlciB0byBiZSBkb25lICovCitzdGF0aWMgdm9pZCAqYmZpbl9zcGlfbmV4dF90cmFuc2ZlcihzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnID0gZHJ2X2RhdGEtPmN1cl9tc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnMgPSBkcnZfZGF0YS0+Y3VyX3RyYW5zZmVyOworCisJLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyICovCisJaWYgKHRyYW5zLT50cmFuc2Zlcl9saXN0Lm5leHQgIT0gJm1zZy0+dHJhbnNmZXJzKSB7CisJCWRydl9kYXRhLT5jdXJfdHJhbnNmZXIgPQorCQkgICAgbGlzdF9lbnRyeSh0cmFucy0+dHJhbnNmZXJfbGlzdC5uZXh0LAorCQkJICAgICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOworCQlyZXR1cm4gUlVOTklOR19TVEFURTsKKwl9IGVsc2UKKwkJcmV0dXJuIERPTkVfU1RBVEU7Cit9CisKKy8qCisgKiBjYWxsZXIgYWxyZWFkeSBzZXQgbWVzc2FnZS0+c3RhdHVzOworICogZG1hIGFuZCBwaW8gaXJxcyBhcmUgYmxvY2tlZCBnaXZlIGZpbmlzaGVkIG1lc3NhZ2UgYmFjaworICovCitzdGF0aWMgdm9pZCBiZmluX3NwaV9naXZlYmFjayhzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQoreworCXN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjaGlwID0gZHJ2X2RhdGEtPmN1cl9jaGlwOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKmxhc3RfdHJhbnNmZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworCW1zZyA9IGRydl9kYXRhLT5jdXJfbXNnOworCWRydl9kYXRhLT5jdXJfbXNnID0gTlVMTDsKKwlkcnZfZGF0YS0+Y3VyX3RyYW5zZmVyID0gTlVMTDsKKwlkcnZfZGF0YS0+Y3VyX2NoaXAgPSBOVUxMOworCXF1ZXVlX3dvcmsoZHJ2X2RhdGEtPndvcmtxdWV1ZSwgJmRydl9kYXRhLT5wdW1wX21lc3NhZ2VzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworCisJbGFzdF90cmFuc2ZlciA9IGxpc3RfZW50cnkobXNnLT50cmFuc2ZlcnMucHJldiwKKwkJCQkgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLCB0cmFuc2Zlcl9saXN0KTsKKworCW1zZy0+c3RhdGUgPSBOVUxMOworCisJaWYgKCFkcnZfZGF0YS0+Y3NfY2hhbmdlKQorCQliZmluX3NwaV9jc19kZWFjdGl2ZShkcnZfZGF0YSwgY2hpcCk7CisKKwkvKiBOb3Qgc3RvcCBzcGkgaW4gYXV0b2J1ZmZlciBtb2RlICovCisJaWYgKGRydl9kYXRhLT50eF9kbWEgIT0gMHhGRkZGKQorCQliZmluX3NwaV9kaXNhYmxlKGRydl9kYXRhKTsKKworCWlmIChtc2ctPmNvbXBsZXRlKQorCQltc2ctPmNvbXBsZXRlKG1zZy0+Y29udGV4dCk7Cit9CisKKy8qIHNwaSBkYXRhIGlycSBoYW5kbGVyICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYmZpbl9zcGlfcGlvX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhID0gZGV2X2lkOworCXN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjaGlwID0gZHJ2X2RhdGEtPmN1cl9jaGlwOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnID0gZHJ2X2RhdGEtPmN1cl9tc2c7CisJaW50IG5fYnl0ZXMgPSBkcnZfZGF0YS0+bl9ieXRlczsKKwlpbnQgbG9vcCA9IDA7CisKKwkvKiB3YWl0IHVudGlsIHRyYW5zZmVyIGZpbmlzaGVkLiAqLworCXdoaWxlICghKGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnN0YXQpICYgQklUX1NUQVRfUlhTKSkKKwkJY3B1X3JlbGF4KCk7CisKKwlpZiAoKGRydl9kYXRhLT50eCAmJiBkcnZfZGF0YS0+dHggPj0gZHJ2X2RhdGEtPnR4X2VuZCkgfHwKKwkJKGRydl9kYXRhLT5yeCAmJiBkcnZfZGF0YS0+cnggPj0gKGRydl9kYXRhLT5yeF9lbmQgLSBuX2J5dGVzKSkpIHsKKwkJLyogbGFzdCByZWFkICovCisJCWlmIChkcnZfZGF0YS0+cngpIHsKKwkJCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsICJsYXN0IHJlYWRcbiIpOworCQkJaWYgKG5fYnl0ZXMgJSAyKSB7CisJCQkJdTE2ICpidWYgPSAodTE2ICopZHJ2X2RhdGEtPnJ4OworCQkJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBuX2J5dGVzIC8gMjsgbG9vcCsrKQorCQkJCQkqYnVmKysgPSBiZmluX3JlYWQoJmRydl9kYXRhLT5yZWdzLT5yZGJyKTsKKwkJCX0gZWxzZSB7CisJCQkJdTggKmJ1ZiA9ICh1OCAqKWRydl9kYXRhLT5yeDsKKwkJCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgbl9ieXRlczsgbG9vcCsrKQorCQkJCQkqYnVmKysgPSBiZmluX3JlYWQoJmRydl9kYXRhLT5yZWdzLT5yZGJyKTsKKwkJCX0KKwkJCWRydl9kYXRhLT5yeCArPSBuX2J5dGVzOworCQl9CisKKwkJbXNnLT5hY3R1YWxfbGVuZ3RoICs9IGRydl9kYXRhLT5sZW5faW5fYnl0ZXM7CisJCWlmIChkcnZfZGF0YS0+Y3NfY2hhbmdlKQorCQkJYmZpbl9zcGlfY3NfZGVhY3RpdmUoZHJ2X2RhdGEsIGNoaXApOworCQkvKiBNb3ZlIHRvIG5leHQgdHJhbnNmZXIgKi8KKwkJbXNnLT5zdGF0ZSA9IGJmaW5fc3BpX25leHRfdHJhbnNmZXIoZHJ2X2RhdGEpOworCisJCWRpc2FibGVfaXJxX25vc3luYyhkcnZfZGF0YS0+c3BpX2lycSk7CisKKwkJLyogU2NoZWR1bGUgdHJhbnNmZXIgdGFza2xldCAqLworCQl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGRydl9kYXRhLT5yeCAmJiBkcnZfZGF0YS0+dHgpIHsKKwkJLyogZHVwbGV4ICovCisJCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsICJkdXBsZXg6IHdyaXRlX1REQlJcbiIpOworCQlpZiAobl9ieXRlcyAlIDIpIHsKKwkJCXUxNiAqYnVmID0gKHUxNiAqKWRydl9kYXRhLT5yeDsKKwkJCXUxNiAqYnVmMiA9ICh1MTYgKilkcnZfZGF0YS0+dHg7CisJCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgbl9ieXRlcyAvIDI7IGxvb3ArKykgeworCQkJCSpidWYrKyA9IGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnJkYnIpOworCQkJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT50ZGJyLCAqYnVmMisrKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXU4ICpidWYgPSAodTggKilkcnZfZGF0YS0+cng7CisJCQl1OCAqYnVmMiA9ICh1OCAqKWRydl9kYXRhLT50eDsKKwkJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBuX2J5dGVzOyBsb29wKyspIHsKKwkJCQkqYnVmKysgPSBiZmluX3JlYWQoJmRydl9kYXRhLT5yZWdzLT5yZGJyKTsKKwkJCQliZmluX3dyaXRlKCZkcnZfZGF0YS0+cmVncy0+dGRiciwgKmJ1ZjIrKyk7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGRydl9kYXRhLT5yeCkgeworCQkvKiByZWFkICovCisJCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsICJyZWFkOiB3cml0ZV9UREJSXG4iKTsKKwkJaWYgKG5fYnl0ZXMgJSAyKSB7CisJCQl1MTYgKmJ1ZiA9ICh1MTYgKilkcnZfZGF0YS0+cng7CisJCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgbl9ieXRlcyAvIDI7IGxvb3ArKykgeworCQkJCSpidWYrKyA9IGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnJkYnIpOworCQkJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT50ZGJyLCBjaGlwLT5pZGxlX3R4X3ZhbCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl1OCAqYnVmID0gKHU4ICopZHJ2X2RhdGEtPnJ4OworCQkJZm9yIChsb29wID0gMDsgbG9vcCA8IG5fYnl0ZXM7IGxvb3ArKykgeworCQkJCSpidWYrKyA9IGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnJkYnIpOworCQkJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT50ZGJyLCBjaGlwLT5pZGxlX3R4X3ZhbCk7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGRydl9kYXRhLT50eCkgeworCQkvKiB3cml0ZSAqLworCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAid3JpdGU6IHdyaXRlX1REQlJcbiIpOworCQlpZiAobl9ieXRlcyAlIDIpIHsKKwkJCXUxNiAqYnVmID0gKHUxNiAqKWRydl9kYXRhLT50eDsKKwkJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBuX2J5dGVzIC8gMjsgbG9vcCsrKSB7CisJCQkJYmZpbl9yZWFkKCZkcnZfZGF0YS0+cmVncy0+cmRicik7CisJCQkJYmZpbl93cml0ZSgmZHJ2X2RhdGEtPnJlZ3MtPnRkYnIsICpidWYrKyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl1OCAqYnVmID0gKHU4ICopZHJ2X2RhdGEtPnR4OworCQkJZm9yIChsb29wID0gMDsgbG9vcCA8IG5fYnl0ZXM7IGxvb3ArKykgeworCQkJCWJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnJkYnIpOworCQkJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT50ZGJyLCAqYnVmKyspOworCQkJfQorCQl9CisJfQorCisJaWYgKGRydl9kYXRhLT50eCkKKwkJZHJ2X2RhdGEtPnR4ICs9IG5fYnl0ZXM7CisJaWYgKGRydl9kYXRhLT5yeCkKKwkJZHJ2X2RhdGEtPnJ4ICs9IG5fYnl0ZXM7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBiZmluX3NwaV9kbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEgPSBkZXZfaWQ7CisJc3RydWN0IGJmaW5fc3BpX3NsYXZlX2RhdGEgKmNoaXAgPSBkcnZfZGF0YS0+Y3VyX2NoaXA7CisJc3RydWN0IHNwaV9tZXNzYWdlICptc2cgPSBkcnZfZGF0YS0+Y3VyX21zZzsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgc2hvcnQgZG1hc3RhdCA9IGdldF9kbWFfY3Vycl9pcnFzdGF0KGRydl9kYXRhLT5kbWFfY2hhbm5lbCk7CisJdTE2IHNwaXN0YXQgPSBiZmluX3JlYWQoJmRydl9kYXRhLT5yZWdzLT5zdGF0KTsKKworCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsCisJCSJpbiBkbWFfaXJxX2hhbmRsZXIgZG1hc3RhdDoweCV4IHNwaXN0YXQ6MHgleFxuIiwKKwkJZG1hc3RhdCwgc3Bpc3RhdCk7CisKKwlpZiAoZHJ2X2RhdGEtPnJ4ICE9IE5VTEwpIHsKKwkJdTE2IGNyID0gYmZpbl9yZWFkKCZkcnZfZGF0YS0+cmVncy0+Y3RsKTsKKwkJLyogZGlzY2FyZCBvbGQgUlggZGF0YSBhbmQgY2xlYXIgUlhTICovCisJCWJmaW5fc3BpX2R1bW15X3JlYWQoZHJ2X2RhdGEpOworCQliZmluX3dyaXRlKCZkcnZfZGF0YS0+cmVncy0+Y3RsLCBjciAmIH5CSVRfQ1RMX0VOQUJMRSk7IC8qIERpc2FibGUgU1BJICovCisJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT5jdGwsIGNyICYgfkJJVF9DVExfVElNT0QpOyAvKiBSZXN0b3JlIFN0YXRlICovCisJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT5zdGF0LCBCSVRfU1RBVF9DTFIpOyAvKiBDbGVhciBTdGF0dXMgKi8KKwl9CisKKwljbGVhcl9kbWFfaXJxc3RhdChkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOworCisJLyoKKwkgKiB3YWl0IGZvciB0aGUgbGFzdCB0cmFuc2FjdGlvbiBzaGlmdGVkIG91dC4gIEhSTSBzdGF0ZXM6CisJICogYXQgdGhpcyBwb2ludCB0aGVyZSBtYXkgc3RpbGwgYmUgZGF0YSBpbiB0aGUgU1BJIERNQSBGSUZPIHdhaXRpbmcKKwkgKiB0byBiZSB0cmFuc21pdHRlZCAuLi4gc29mdHdhcmUgbmVlZHMgdG8gcG9sbCBUWFMgaW4gdGhlIFNQSV9TVEFUCisJICogcmVnaXN0ZXIgdW50aWwgaXQgZ29lcyBsb3cgZm9yIDIgc3VjY2Vzc2l2ZSByZWFkcworCSAqLworCWlmIChkcnZfZGF0YS0+dHggIT0gTlVMTCkgeworCQl3aGlsZSAoKGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnN0YXQpICYgQklUX1NUQVRfVFhTKSB8fAorCQkgICAgICAgKGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnN0YXQpICYgQklUX1NUQVRfVFhTKSkKKwkJCWNwdV9yZWxheCgpOworCX0KKworCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsCisJCSJpbiBkbWFfaXJxX2hhbmRsZXIgZG1hc3RhdDoweCV4IHNwaXN0YXQ6MHgleFxuIiwKKwkJZG1hc3RhdCwgYmZpbl9yZWFkKCZkcnZfZGF0YS0+cmVncy0+c3RhdCkpOworCisJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKwl3aGlsZSAoIShiZmluX3JlYWQoJmRydl9kYXRhLT5yZWdzLT5zdGF0KSAmIEJJVF9TVEFUX1NQSUYpKQorCQlpZiAoIXRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlkZXZfd2FybigmZHJ2X2RhdGEtPnBkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgU1BJRiIpOworCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJY3B1X3JlbGF4KCk7CisKKwlpZiAoKGRtYXN0YXQgJiBETUFfRVJSKSAmJiAoc3Bpc3RhdCAmIEJJVF9TVEFUX1JCU1kpKSB7CisJCW1zZy0+c3RhdGUgPSBFUlJPUl9TVEFURTsKKwkJZGV2X2VycigmZHJ2X2RhdGEtPnBkZXYtPmRldiwgImRtYSByZWNlaXZlOiBmaWZvL2J1ZmZlciBvdmVyZmxvd1xuIik7CisJfSBlbHNlIHsKKwkJbXNnLT5hY3R1YWxfbGVuZ3RoICs9IGRydl9kYXRhLT5sZW5faW5fYnl0ZXM7CisKKwkJaWYgKGRydl9kYXRhLT5jc19jaGFuZ2UpCisJCQliZmluX3NwaV9jc19kZWFjdGl2ZShkcnZfZGF0YSwgY2hpcCk7CisKKwkJLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyICovCisJCW1zZy0+c3RhdGUgPSBiZmluX3NwaV9uZXh0X3RyYW5zZmVyKGRydl9kYXRhKTsKKwl9CisKKwkvKiBTY2hlZHVsZSB0cmFuc2ZlciB0YXNrbGV0ICovCisJdGFza2xldF9zY2hlZHVsZSgmZHJ2X2RhdGEtPnB1bXBfdHJhbnNmZXJzKTsKKworCS8qIGZyZWUgdGhlIGlycSBoYW5kbGVyIGJlZm9yZSBuZXh0IHRyYW5zZmVyICovCisJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwKKwkJImRpc2FibGUgZG1hIGNoYW5uZWwgaXJxJWRcbiIsCisJCWRydl9kYXRhLT5kbWFfY2hhbm5lbCk7CisJZG1hX2Rpc2FibGVfaXJxX25vc3luYyhkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBiZmluX3NwaV9wdW1wX3RyYW5zZmVycyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSA9IChzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKilkYXRhOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzc2FnZSA9IE5VTEw7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnNmZXIgPSBOVUxMOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnByZXZpb3VzID0gTlVMTDsKKwlzdHJ1Y3QgYmZpbl9zcGlfc2xhdmVfZGF0YSAqY2hpcCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGJpdHNfcGVyX3dvcmQ7CisJdTE2IGNyLCBjcl93aWR0aCwgZG1hX3dpZHRoLCBkbWFfY29uZmlnOworCXUzMiB0cmFuZl9zdWNjZXNzID0gMTsKKwl1OCBmdWxsX2R1cGxleCA9IDA7CisKKwkvKiBHZXQgY3VycmVudCBzdGF0ZSBpbmZvcm1hdGlvbiAqLworCW1lc3NhZ2UgPSBkcnZfZGF0YS0+Y3VyX21zZzsKKwl0cmFuc2ZlciA9IGRydl9kYXRhLT5jdXJfdHJhbnNmZXI7CisJY2hpcCA9IGRydl9kYXRhLT5jdXJfY2hpcDsKKworCS8qCisJICogaWYgbXNnIGlzIGVycm9yIG9yIGRvbmUsIHJlcG9ydCBpdCBiYWNrIHVzaW5nIGNvbXBsZXRlKCkgY2FsbGJhY2sKKwkgKi8KKworCSAvKiBIYW5kbGUgZm9yIGFib3J0ICovCisJaWYgKG1lc3NhZ2UtPnN0YXRlID09IEVSUk9SX1NUQVRFKSB7CisJCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsICJ0cmFuc2Zlcjogd2UndmUgaGl0IGFuIGVycm9yXG4iKTsKKwkJbWVzc2FnZS0+c3RhdHVzID0gLUVJTzsKKwkJYmZpbl9zcGlfZ2l2ZWJhY2soZHJ2X2RhdGEpOworCQlyZXR1cm47CisJfQorCisJLyogSGFuZGxlIGVuZCBvZiBtZXNzYWdlICovCisJaWYgKG1lc3NhZ2UtPnN0YXRlID09IERPTkVfU1RBVEUpIHsKKwkJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwgInRyYW5zZmVyOiBhbGwgZG9uZSFcbiIpOworCQltZXNzYWdlLT5zdGF0dXMgPSAwOworCQliZmluX3NwaV9naXZlYmFjayhkcnZfZGF0YSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBEZWxheSBpZiByZXF1ZXN0ZWQgYXQgZW5kIG9mIHRyYW5zZmVyICovCisJaWYgKG1lc3NhZ2UtPnN0YXRlID09IFJVTk5JTkdfU1RBVEUpIHsKKwkJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwgInRyYW5zZmVyOiBzdGlsbCBydW5uaW5nIC4uLlxuIik7CisJCXByZXZpb3VzID0gbGlzdF9lbnRyeSh0cmFuc2Zlci0+dHJhbnNmZXJfbGlzdC5wcmV2LAorCQkJCSAgICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOworCQlpZiAocHJldmlvdXMtPmRlbGF5X3VzZWNzKQorCQkJdWRlbGF5KHByZXZpb3VzLT5kZWxheV91c2Vjcyk7CisJfQorCisJLyogRmx1c2ggYW55IGV4aXN0aW5nIHRyYW5zZmVycyB0aGF0IG1heSBiZSBzaXR0aW5nIGluIHRoZSBoYXJkd2FyZSAqLworCWlmIChiZmluX3NwaV9mbHVzaChkcnZfZGF0YSkgPT0gMCkgeworCQlkZXZfZXJyKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAicHVtcF90cmFuc2ZlcnM6IGZsdXNoIGZhaWxlZFxuIik7CisJCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU87CisJCWJmaW5fc3BpX2dpdmViYWNrKGRydl9kYXRhKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh0cmFuc2Zlci0+bGVuID09IDApIHsKKwkJLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyIG9mIHRoaXMgbXNnICovCisJCW1lc3NhZ2UtPnN0YXRlID0gYmZpbl9zcGlfbmV4dF90cmFuc2ZlcihkcnZfZGF0YSk7CisJCS8qIFNjaGVkdWxlIG5leHQgdHJhbnNmZXIgdGFza2xldCAqLworCQl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOworCQlyZXR1cm47CisJfQorCisJaWYgKHRyYW5zZmVyLT50eF9idWYgIT0gTlVMTCkgeworCQlkcnZfZGF0YS0+dHggPSAodm9pZCAqKXRyYW5zZmVyLT50eF9idWY7CisJCWRydl9kYXRhLT50eF9lbmQgPSBkcnZfZGF0YS0+dHggKyB0cmFuc2Zlci0+bGVuOworCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAidHhfYnVmIGlzICVwLCB0eF9lbmQgaXMgJXBcbiIsCisJCQl0cmFuc2Zlci0+dHhfYnVmLCBkcnZfZGF0YS0+dHhfZW5kKTsKKwl9IGVsc2UgeworCQlkcnZfZGF0YS0+dHggPSBOVUxMOworCX0KKworCWlmICh0cmFuc2Zlci0+cnhfYnVmICE9IE5VTEwpIHsKKwkJZnVsbF9kdXBsZXggPSB0cmFuc2Zlci0+dHhfYnVmICE9IE5VTEw7CisJCWRydl9kYXRhLT5yeCA9IHRyYW5zZmVyLT5yeF9idWY7CisJCWRydl9kYXRhLT5yeF9lbmQgPSBkcnZfZGF0YS0+cnggKyB0cmFuc2Zlci0+bGVuOworCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAicnhfYnVmIGlzICVwLCByeF9lbmQgaXMgJXBcbiIsCisJCQl0cmFuc2Zlci0+cnhfYnVmLCBkcnZfZGF0YS0+cnhfZW5kKTsKKwl9IGVsc2UgeworCQlkcnZfZGF0YS0+cnggPSBOVUxMOworCX0KKworCWRydl9kYXRhLT5yeF9kbWEgPSB0cmFuc2Zlci0+cnhfZG1hOworCWRydl9kYXRhLT50eF9kbWEgPSB0cmFuc2Zlci0+dHhfZG1hOworCWRydl9kYXRhLT5sZW5faW5fYnl0ZXMgPSB0cmFuc2Zlci0+bGVuOworCWRydl9kYXRhLT5jc19jaGFuZ2UgPSB0cmFuc2Zlci0+Y3NfY2hhbmdlOworCisJLyogQml0cyBwZXIgd29yZCBzZXR1cCAqLworCWJpdHNfcGVyX3dvcmQgPSB0cmFuc2Zlci0+Yml0c19wZXJfd29yZCA/IDoKKwkJbWVzc2FnZS0+c3BpLT5iaXRzX3Blcl93b3JkID8gOiA4OworCWlmIChiaXRzX3Blcl93b3JkICUgMTYgPT0gMCkgeworCQlkcnZfZGF0YS0+bl9ieXRlcyA9IGJpdHNfcGVyX3dvcmQvODsKKwkJZHJ2X2RhdGEtPmxlbiA9ICh0cmFuc2Zlci0+bGVuKSA+PiAxOworCQljcl93aWR0aCA9IEJJVF9DVExfV09SRFNJWkU7CisJCWRydl9kYXRhLT5vcHMgPSAmYmZpbl9iZmluX3NwaV90cmFuc2Zlcl9vcHNfdTE2OworCX0gZWxzZSBpZiAoYml0c19wZXJfd29yZCAlIDggPT0gMCkgeworCQlkcnZfZGF0YS0+bl9ieXRlcyA9IGJpdHNfcGVyX3dvcmQvODsKKwkJZHJ2X2RhdGEtPmxlbiA9IHRyYW5zZmVyLT5sZW47CisJCWNyX3dpZHRoID0gMDsKKwkJZHJ2X2RhdGEtPm9wcyA9ICZiZmluX2JmaW5fc3BpX3RyYW5zZmVyX29wc191ODsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAidHJhbnNmZXI6IHVuc3VwcG9ydGVkIGJpdHNfcGVyX3dvcmRcbiIpOworCQltZXNzYWdlLT5zdGF0dXMgPSAtRUlOVkFMOworCQliZmluX3NwaV9naXZlYmFjayhkcnZfZGF0YSk7CisJCXJldHVybjsKKwl9CisJY3IgPSBiZmluX3JlYWQoJmRydl9kYXRhLT5yZWdzLT5jdGwpICYgfihCSVRfQ1RMX1RJTU9EIHwgQklUX0NUTF9XT1JEU0laRSk7CisJY3IgfD0gY3Jfd2lkdGg7CisJYmZpbl93cml0ZSgmZHJ2X2RhdGEtPnJlZ3MtPmN0bCwgY3IpOworCisJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwKKwkJInRyYW5zZmVyOiBkcnZfZGF0YS0+b3BzIGlzICVwLCBjaGlwLT5vcHMgaXMgJXAsIHU4X29wcyBpcyAlcFxuIiwKKwkJZHJ2X2RhdGEtPm9wcywgY2hpcC0+b3BzLCAmYmZpbl9iZmluX3NwaV90cmFuc2Zlcl9vcHNfdTgpOworCisJbWVzc2FnZS0+c3RhdGUgPSBSVU5OSU5HX1NUQVRFOworCWRtYV9jb25maWcgPSAwOworCisJLyogU3BlZWQgc2V0dXAgKHN1cmVseSB2YWxpZCBiZWNhdXNlIGFscmVhZHkgY2hlY2tlZCkgKi8KKwlpZiAodHJhbnNmZXItPnNwZWVkX2h6KQorCQliZmluX3dyaXRlKCZkcnZfZGF0YS0+cmVncy0+YmF1ZCwgaHpfdG9fc3BpX2JhdWQodHJhbnNmZXItPnNwZWVkX2h6KSk7CisJZWxzZQorCQliZmluX3dyaXRlKCZkcnZfZGF0YS0+cmVncy0+YmF1ZCwgY2hpcC0+YmF1ZCk7CisKKwliZmluX3dyaXRlKCZkcnZfZGF0YS0+cmVncy0+c3RhdCwgQklUX1NUQVRfQ0xSKTsKKwliZmluX3NwaV9jc19hY3RpdmUoZHJ2X2RhdGEsIGNoaXApOworCisJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwKKwkJIm5vdyBwdW1waW5nIGEgdHJhbnNmZXI6IHdpZHRoIGlzICVkLCBsZW4gaXMgJWRcbiIsCisJCWNyX3dpZHRoLCB0cmFuc2Zlci0+bGVuKTsKKworCS8qCisJICogVHJ5IHRvIG1hcCBkbWEgYnVmZmVyIGFuZCBkbyBhIGRtYSB0cmFuc2Zlci4gIElmIHN1Y2Nlc3NmdWwgdXNlLAorCSAqIGRpZmZlcmVudCB3YXkgdG8gci93IGFjY29yZGluZyB0byB0aGUgZW5hYmxlX2RtYSBzZXR0aW5ncyBhbmQgaWYKKwkgKiB3ZSBhcmUgbm90IGRvaW5nIGEgZnVsbCBkdXBsZXggdHJhbnNmZXIgKHNpbmNlIHRoZSBoYXJkd2FyZSBkb2VzCisJICogbm90IHN1cHBvcnQgZnVsbCBkdXBsZXggRE1BIHRyYW5zZmVycykuCisJICovCisJaWYgKCFmdWxsX2R1cGxleCAmJiBkcnZfZGF0YS0+Y3VyX2NoaXAtPmVuYWJsZV9kbWEKKwkJCQkmJiBkcnZfZGF0YS0+bGVuID4gNikgeworCisJCXVuc2lnbmVkIGxvbmcgZG1hX3N0YXJ0X2FkZHIsIGZsYWdzOworCisJCWRpc2FibGVfZG1hKGRydl9kYXRhLT5kbWFfY2hhbm5lbCk7CisJCWNsZWFyX2RtYV9pcnFzdGF0KGRydl9kYXRhLT5kbWFfY2hhbm5lbCk7CisKKwkJLyogY29uZmlnIGRtYSBjaGFubmVsICovCisJCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsICJkb2luZyBkbWEgdHJhbnNmZXJcbiIpOworCQlzZXRfZG1hX3hfY291bnQoZHJ2X2RhdGEtPmRtYV9jaGFubmVsLCBkcnZfZGF0YS0+bGVuKTsKKwkJaWYgKGNyX3dpZHRoID09IEJJVF9DVExfV09SRFNJWkUpIHsKKwkJCXNldF9kbWFfeF9tb2RpZnkoZHJ2X2RhdGEtPmRtYV9jaGFubmVsLCAyKTsKKwkJCWRtYV93aWR0aCA9IFdEU0laRV8xNjsKKwkJfSBlbHNlIHsKKwkJCXNldF9kbWFfeF9tb2RpZnkoZHJ2X2RhdGEtPmRtYV9jaGFubmVsLCAxKTsKKwkJCWRtYV93aWR0aCA9IFdEU0laRV84OworCQl9CisKKwkJLyogcG9sbCBmb3IgU1BJIGNvbXBsZXRpb24gYmVmb3JlIHN0YXJ0ICovCisJCXdoaWxlICghKGJmaW5fcmVhZCgmZHJ2X2RhdGEtPnJlZ3MtPnN0YXQpICYgQklUX1NUQVRfU1BJRikpCisJCQljcHVfcmVsYXgoKTsKKworCQkvKiBkaXJ0eSBoYWNrIGZvciBhdXRvYnVmZmVyIERNQSBtb2RlICovCisJCWlmIChkcnZfZGF0YS0+dHhfZG1hID09IDB4RkZGRikgeworCQkJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwKKwkJCQkiZG9pbmcgYXV0b2J1ZmZlciBETUEgb3V0LlxuIik7CisKKwkJCS8qIG5vIGlycSBpbiBhdXRvYnVmZmVyIG1vZGUgKi8KKwkJCWRtYV9jb25maWcgPQorCQkJICAgIChETUFGTE9XX0FVVE8gfCBSRVNUQVJUIHwgZG1hX3dpZHRoIHwgRElfRU4pOworCQkJc2V0X2RtYV9jb25maWcoZHJ2X2RhdGEtPmRtYV9jaGFubmVsLCBkbWFfY29uZmlnKTsKKwkJCXNldF9kbWFfc3RhcnRfYWRkcihkcnZfZGF0YS0+ZG1hX2NoYW5uZWwsCisJCQkJCSh1bnNpZ25lZCBsb25nKWRydl9kYXRhLT50eCk7CisJCQllbmFibGVfZG1hKGRydl9kYXRhLT5kbWFfY2hhbm5lbCk7CisKKwkJCS8qIHN0YXJ0IFNQSSB0cmFuc2ZlciAqLworCQkJYmZpbl93cml0ZSgmZHJ2X2RhdGEtPnJlZ3MtPmN0bCwgY3IgfCBCSVRfQ1RMX1RJTU9EX0RNQV9UWCk7CisKKwkJCS8qIGp1c3QgcmV0dXJuIGhlcmUsIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSB0cmFuc2ZlcgorCQkJICogaW4gdGhpcyBtb2RlCisJCQkgKi8KKwkJCW1lc3NhZ2UtPnN0YXR1cyA9IDA7CisJCQliZmluX3NwaV9naXZlYmFjayhkcnZfZGF0YSk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBJbiBkbWEgbW9kZSwgcnggb3IgdHggbXVzdCBiZSBOVUxMIGluIG9uZSB0cmFuc2ZlciAqLworCQlkbWFfY29uZmlnID0gKFJFU1RBUlQgfCBkbWFfd2lkdGggfCBESV9FTik7CisJCWlmIChkcnZfZGF0YS0+cnggIT0gTlVMTCkgeworCQkJLyogc2V0IHRyYW5zZmVyIG1vZGUsIGFuZCBlbmFibGUgU1BJICovCisJCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAiZG9pbmcgRE1BIGluIHRvICVwIChzaXplICV6eClcbiIsCisJCQkJZHJ2X2RhdGEtPnJ4LCBkcnZfZGF0YS0+bGVuX2luX2J5dGVzKTsKKworCQkJLyogaW52YWxpZGF0ZSBjYWNoZXMsIGlmIG5lZWRlZCAqLworCQkJaWYgKGJmaW5fYWRkcl9kY2FjaGVhYmxlKCh1bnNpZ25lZCBsb25nKSBkcnZfZGF0YS0+cngpKQorCQkJCWludmFsaWRhdGVfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBkcnZfZGF0YS0+cngsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIChkcnZfZGF0YS0+cnggKworCQkJCQkJCWRydl9kYXRhLT5sZW5faW5fYnl0ZXMpKTsKKworCQkJZG1hX2NvbmZpZyB8PSBXTlI7CisJCQlkbWFfc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKWRydl9kYXRhLT5yeDsKKwkJCWNyIHw9IEJJVF9DVExfVElNT0RfRE1BX1JYIHwgQklUX0NUTF9TRU5ET1BUOworCisJCX0gZWxzZSBpZiAoZHJ2X2RhdGEtPnR4ICE9IE5VTEwpIHsKKwkJCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsICJkb2luZyBETUEgb3V0LlxuIik7CisKKwkJCS8qIGZsdXNoIGNhY2hlcywgaWYgbmVlZGVkICovCisJCQlpZiAoYmZpbl9hZGRyX2RjYWNoZWFibGUoKHVuc2lnbmVkIGxvbmcpIGRydl9kYXRhLT50eCkpCisJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBkcnZfZGF0YS0+dHgsCisJCQkJCQkodW5zaWduZWQgbG9uZykgKGRydl9kYXRhLT50eCArCisJCQkJCQlkcnZfZGF0YS0+bGVuX2luX2J5dGVzKSk7CisKKwkJCWRtYV9zdGFydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpZHJ2X2RhdGEtPnR4OworCQkJY3IgfD0gQklUX0NUTF9USU1PRF9ETUFfVFg7CisKKwkJfSBlbHNlCisJCQlCVUcoKTsKKworCQkvKiBvaCBtYW4sIGhlcmUgdGhlcmUgYmUgbW9uc3RlcnMgLi4uIGFuZCBpIGRvbnQgbWVhbiB0aGUKKwkJICogZmx1ZmZ5IGN1dGUgb25lcyBmcm9tIHBpeGFyLCBpIG1lYW4gdGhlIGtpbmQgdGhhdCdsbCBlYXQKKwkJICogeW91ciBkYXRhLCBraWNrIHlvdXIgZG9nLCBhbmQgbG92ZSBpdCBhbGwuICBkbyAqbm90KiB0cnkKKwkJICogYW5kIGNoYW5nZSB0aGVzZSBsaW5lcyB1bmxlc3MgeW91ICgxKSBoZWF2aWx5IHRlc3QgRE1BCisJCSAqIHdpdGggU1BJIGZsYXNoZXMgb24gYSBsb2FkZWQgc3lzdGVtIChlLmcuIHBpbmcgZmxvb2RzKSwKKwkJICogKDIpIGtub3cganVzdCBob3cgYnJva2VuIHRoZSBETUEgZW5naW5lIGludGVyYWN0aW9uIHdpdGgKKwkJICogdGhlIFNQSSBwZXJpcGhlcmFsIGlzLCBhbmQgKDMpIGhhdmUgc29tZW9uZSBlbHNlIHRvIGJsYW1lCisJCSAqIHdoZW4geW91IHNjcmV3IGl0IGFsbCB1cCBhbnl3YXlzLgorCQkgKi8KKwkJc2V0X2RtYV9zdGFydF9hZGRyKGRydl9kYXRhLT5kbWFfY2hhbm5lbCwgZG1hX3N0YXJ0X2FkZHIpOworCQlzZXRfZG1hX2NvbmZpZyhkcnZfZGF0YS0+ZG1hX2NoYW5uZWwsIGRtYV9jb25maWcpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCVNTWU5DKCk7CisJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT5jdGwsIGNyKTsKKwkJZW5hYmxlX2RtYShkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOworCQlkbWFfZW5hYmxlX2lycShkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2UgYWx3YXlzIHVzZSBTUElfV1JJVEUgbW9kZSAodHJhbnNmZXIgc3RhcnRzIHdpdGggVERCUiB3cml0ZSkuCisJICogU1BJX1JFQUQgbW9kZSAodHJhbnNmZXIgc3RhcnRzIHdpdGggUkRCUiByZWFkKSBzZWVtcyB0byBoYXZlCisJICogcHJvYmxlbXMgd2l0aCBzZXR0aW5nIHVwIHRoZSBvdXRwdXQgdmFsdWUgaW4gVERCUiBwcmlvciB0byB0aGUKKwkgKiBzdGFydCBvZiB0aGUgdHJhbnNmZXIuCisJICovCisJYmZpbl93cml0ZSgmZHJ2X2RhdGEtPnJlZ3MtPmN0bCwgY3IgfCBCSVRfQ1RMX1RYTU9EKTsKKworCWlmIChjaGlwLT5waW9faW50ZXJydXB0KSB7CisJCS8qIFNQSSBpcnEgc2hvdWxkIGhhdmUgYmVlbiBkaXNhYmxlZCBieSBub3cgKi8KKworCQkvKiBkaXNjYXJkIG9sZCBSWCBkYXRhIGFuZCBjbGVhciBSWFMgKi8KKwkJYmZpbl9zcGlfZHVtbXlfcmVhZChkcnZfZGF0YSk7CisKKwkJLyogc3RhcnQgdHJhbnNmZXIgKi8KKwkJaWYgKGRydl9kYXRhLT50eCA9PSBOVUxMKQorCQkJYmZpbl93cml0ZSgmZHJ2X2RhdGEtPnJlZ3MtPnRkYnIsIGNoaXAtPmlkbGVfdHhfdmFsKTsKKwkJZWxzZSB7CisJCQlpbnQgbG9vcDsKKwkJCWlmIChiaXRzX3Blcl93b3JkICUgMTYgPT0gMCkgeworCQkJCXUxNiAqYnVmID0gKHUxNiAqKWRydl9kYXRhLT50eDsKKwkJCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgYml0c19wZXJfd29yZCAvIDE2OworCQkJCQkJbG9vcCsrKSB7CisJCQkJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT50ZGJyLCAqYnVmKyspOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoYml0c19wZXJfd29yZCAlIDggPT0gMCkgeworCQkJCXU4ICpidWYgPSAodTggKilkcnZfZGF0YS0+dHg7CisJCQkJZm9yIChsb29wID0gMDsgbG9vcCA8IGJpdHNfcGVyX3dvcmQgLyA4OyBsb29wKyspCisJCQkJCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT50ZGJyLCAqYnVmKyspOworCQkJfQorCisJCQlkcnZfZGF0YS0+dHggKz0gZHJ2X2RhdGEtPm5fYnl0ZXM7CisJCX0KKworCQkvKiBvbmNlIFREQlIgaXMgZW1wdHksIGludGVycnVwdCBpcyB0cmlnZ2VyZWQgKi8KKwkJZW5hYmxlX2lycShkcnZfZGF0YS0+c3BpX2lycSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJTyBtb2RlICovCisJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwgImRvaW5nIElPIHRyYW5zZmVyXG4iKTsKKworCWlmIChmdWxsX2R1cGxleCkgeworCQkvKiBmdWxsIGR1cGxleCBtb2RlICovCisJCUJVR19PTigoZHJ2X2RhdGEtPnR4X2VuZCAtIGRydl9kYXRhLT50eCkgIT0KKwkJICAgICAgIChkcnZfZGF0YS0+cnhfZW5kIC0gZHJ2X2RhdGEtPnJ4KSk7CisJCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsCisJCQkiSU8gZHVwbGV4OiBjciBpcyAweCV4XG4iLCBjcik7CisKKwkJZHJ2X2RhdGEtPm9wcy0+ZHVwbGV4KGRydl9kYXRhKTsKKworCQlpZiAoZHJ2X2RhdGEtPnR4ICE9IGRydl9kYXRhLT50eF9lbmQpCisJCQl0cmFuZl9zdWNjZXNzID0gMDsKKwl9IGVsc2UgaWYgKGRydl9kYXRhLT50eCAhPSBOVUxMKSB7CisJCS8qIHdyaXRlIG9ubHkgaGFsZiBkdXBsZXggKi8KKwkJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwKKwkJCSJJTyB3cml0ZTogY3IgaXMgMHgleFxuIiwgY3IpOworCisJCWRydl9kYXRhLT5vcHMtPndyaXRlKGRydl9kYXRhKTsKKworCQlpZiAoZHJ2X2RhdGEtPnR4ICE9IGRydl9kYXRhLT50eF9lbmQpCisJCQl0cmFuZl9zdWNjZXNzID0gMDsKKwl9IGVsc2UgaWYgKGRydl9kYXRhLT5yeCAhPSBOVUxMKSB7CisJCS8qIHJlYWQgb25seSBoYWxmIGR1cGxleCAqLworCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LAorCQkJIklPIHJlYWQ6IGNyIGlzIDB4JXhcbiIsIGNyKTsKKworCQlkcnZfZGF0YS0+b3BzLT5yZWFkKGRydl9kYXRhKTsKKwkJaWYgKGRydl9kYXRhLT5yeCAhPSBkcnZfZGF0YS0+cnhfZW5kKQorCQkJdHJhbmZfc3VjY2VzcyA9IDA7CisJfQorCisJaWYgKCF0cmFuZl9zdWNjZXNzKSB7CisJCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsCisJCQkiSU8gd3JpdGUgZXJyb3IhXG4iKTsKKwkJbWVzc2FnZS0+c3RhdGUgPSBFUlJPUl9TVEFURTsKKwl9IGVsc2UgeworCQkvKiBVcGRhdGUgdG90YWwgYnl0ZSB0cmFuc2ZlcnJlZCAqLworCQltZXNzYWdlLT5hY3R1YWxfbGVuZ3RoICs9IGRydl9kYXRhLT5sZW5faW5fYnl0ZXM7CisJCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciBvZiB0aGlzIG1zZyAqLworCQltZXNzYWdlLT5zdGF0ZSA9IGJmaW5fc3BpX25leHRfdHJhbnNmZXIoZHJ2X2RhdGEpOworCQlpZiAoZHJ2X2RhdGEtPmNzX2NoYW5nZSkKKwkJCWJmaW5fc3BpX2NzX2RlYWN0aXZlKGRydl9kYXRhLCBjaGlwKTsKKwl9CisKKwkvKiBTY2hlZHVsZSBuZXh0IHRyYW5zZmVyIHRhc2tsZXQgKi8KKwl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOworfQorCisvKiBwb3AgYSBtc2cgZnJvbSBxdWV1ZSBhbmQga2ljayBvZmYgcmVhbCB0cmFuc2ZlciAqLworc3RhdGljIHZvaWQgYmZpbl9zcGlfcHVtcF9tZXNzYWdlcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZHJ2X2RhdGEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhLCBwdW1wX21lc3NhZ2VzKTsKKworCS8qIExvY2sgcXVldWUgYW5kIGNoZWNrIGZvciBxdWV1ZSB3b3JrICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJmRydl9kYXRhLT5xdWV1ZSkgfHwgIWRydl9kYXRhLT5ydW5uaW5nKSB7CisJCS8qIHB1bXBlciBraWNrZWQgb2ZmIGJ1dCBubyB3b3JrIHRvIGRvICovCisJCWRydl9kYXRhLT5idXN5ID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGFscmVhZHkgcnVubmluZyBhIG1lc3NhZ2UgKi8KKwlpZiAoZHJ2X2RhdGEtPmN1cl9tc2cpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEV4dHJhY3QgaGVhZCBvZiBxdWV1ZSAqLworCWRydl9kYXRhLT5jdXJfbXNnID0gbGlzdF9lbnRyeShkcnZfZGF0YS0+cXVldWUubmV4dCwKKwkJCQkgICAgICAgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7CisKKwkvKiBTZXR1cCB0aGUgU1NQIHVzaW5nIHRoZSBwZXIgY2hpcCBjb25maWd1cmF0aW9uICovCisJZHJ2X2RhdGEtPmN1cl9jaGlwID0gc3BpX2dldF9jdGxkYXRhKGRydl9kYXRhLT5jdXJfbXNnLT5zcGkpOworCWJmaW5fc3BpX3Jlc3RvcmVfc3RhdGUoZHJ2X2RhdGEpOworCisJbGlzdF9kZWxfaW5pdCgmZHJ2X2RhdGEtPmN1cl9tc2ctPnF1ZXVlKTsKKworCS8qIEluaXRpYWwgbWVzc2FnZSBzdGF0ZSAqLworCWRydl9kYXRhLT5jdXJfbXNnLT5zdGF0ZSA9IFNUQVJUX1NUQVRFOworCWRydl9kYXRhLT5jdXJfdHJhbnNmZXIgPSBsaXN0X2VudHJ5KGRydl9kYXRhLT5jdXJfbXNnLT50cmFuc2ZlcnMubmV4dCwKKwkJCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOworCisJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwgImdvdCBhIG1lc3NhZ2UgdG8gcHVtcCwgIgorCQkic3RhdGUgaXMgc2V0IHRvOiBiYXVkICVkLCBmbGFnIDB4JXgsIGN0bCAweCV4XG4iLAorCQlkcnZfZGF0YS0+Y3VyX2NoaXAtPmJhdWQsIGRydl9kYXRhLT5jdXJfY2hpcC0+ZmxhZywKKwkJZHJ2X2RhdGEtPmN1cl9jaGlwLT5jdGxfcmVnKTsKKworCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsCisJCSJ0aGUgZmlyc3QgdHJhbnNmZXIgbGVuIGlzICVkXG4iLAorCQlkcnZfZGF0YS0+Y3VyX3RyYW5zZmVyLT5sZW4pOworCisJLyogTWFyayBhcyBidXN5IGFuZCBsYXVuY2ggdHJhbnNmZXJzICovCisJdGFza2xldF9zY2hlZHVsZSgmZHJ2X2RhdGEtPnB1bXBfdHJhbnNmZXJzKTsKKworCWRydl9kYXRhLT5idXN5ID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogZ290IGEgbXNnIHRvIHRyYW5zZmVyLCBxdWV1ZSBpdCBpbiBkcnZfZGF0YS0+cXVldWUuCisgKiBBbmQga2ljayBvZmYgbWVzc2FnZSBwdW1wZXIKKyAqLworc3RhdGljIGludCBiZmluX3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFkcnZfZGF0YS0+cnVubmluZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9CisKKwltc2ctPmFjdHVhbF9sZW5ndGggPSAwOworCW1zZy0+c3RhdHVzID0gLUVJTlBST0dSRVNTOworCW1zZy0+c3RhdGUgPSBTVEFSVF9TVEFURTsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiYWRkaW5nIGFuIG1zZyBpbiB0cmFuc2ZlcigpIFxuIik7CisJbGlzdF9hZGRfdGFpbCgmbXNnLT5xdWV1ZSwgJmRydl9kYXRhLT5xdWV1ZSk7CisKKwlpZiAoZHJ2X2RhdGEtPnJ1bm5pbmcgJiYgIWRydl9kYXRhLT5idXN5KQorCQlxdWV1ZV93b3JrKGRydl9kYXRhLT53b3JrcXVldWUsICZkcnZfZGF0YS0+cHVtcF9tZXNzYWdlcyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX1NQSV9TU0VMCTcKKworc3RhdGljIGNvbnN0IHUxNiBzc2VsW11bTUFYX1NQSV9TU0VMXSA9IHsKKwl7UF9TUEkwX1NTRUwxLCBQX1NQSTBfU1NFTDIsIFBfU1BJMF9TU0VMMywKKwlQX1NQSTBfU1NFTDQsIFBfU1BJMF9TU0VMNSwKKwlQX1NQSTBfU1NFTDYsIFBfU1BJMF9TU0VMN30sCisKKwl7UF9TUEkxX1NTRUwxLCBQX1NQSTFfU1NFTDIsIFBfU1BJMV9TU0VMMywKKwlQX1NQSTFfU1NFTDQsIFBfU1BJMV9TU0VMNSwKKwlQX1NQSTFfU1NFTDYsIFBfU1BJMV9TU0VMN30sCisKKwl7UF9TUEkyX1NTRUwxLCBQX1NQSTJfU1NFTDIsIFBfU1BJMl9TU0VMMywKKwlQX1NQSTJfU1NFTDQsIFBfU1BJMl9TU0VMNSwKKwlQX1NQSTJfU1NFTDYsIFBfU1BJMl9TU0VMN30sCit9OworCisvKiBzZXR1cCBmb3IgZGV2aWNlcyAobWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyAtLSBub3QganVzdCBmaXJzdCBzZXR1cCkgKi8KK3N0YXRpYyBpbnQgYmZpbl9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCAqY2hpcF9pbmZvOworCXN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjaGlwID0gTlVMTDsKKwlzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdTE2IGJmaW5fY3RsX3JlZzsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCS8qIE9ubHkgYWxsb2MgKG9yIHVzZSBjaGlwX2luZm8pIG9uIGZpcnN0IHNldHVwICovCisJY2hpcF9pbmZvID0gTlVMTDsKKwljaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7CisJaWYgKGNoaXAgPT0gTlVMTCkgeworCQljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjaGlwKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBjaGlwIGRhdGFcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQljaGlwLT5lbmFibGVfZG1hID0gMDsKKwkJY2hpcF9pbmZvID0gc3BpLT5jb250cm9sbGVyX2RhdGE7CisJfQorCisJLyogTGV0IHBlb3BsZSBzZXQgbm9uLXN0YW5kYXJkIGJpdHMgZGlyZWN0bHkgKi8KKwliZmluX2N0bF9yZWcgPSBCSVRfQ1RMX09QRU5EUkFJTiB8IEJJVF9DVExfRU1JU08gfAorCQlCSVRfQ1RMX1BTU0UgfCBCSVRfQ1RMX0dNIHwgQklUX0NUTF9TWjsKKworCS8qIGNoaXBfaW5mbyBpc24ndCBhbHdheXMgbmVlZGVkICovCisJaWYgKGNoaXBfaW5mbykgeworCQkvKiBNYWtlIHN1cmUgcGVvcGxlIHN0b3AgdHJ5aW5nIHRvIHNldCBmaWVsZHMgdmlhIGN0bF9yZWcKKwkJICogd2hlbiB0aGV5IHNob3VsZCBhY3R1YWxseSBiZSB1c2luZyBjb21tb24gU1BJIGZyYW1ld29yay4KKwkJICogQ3VycmVudGx5IHdlIGxldCB0aHJvdWdoOiBXT00gRU1JU08gUFNTRSBHTSBTWi4KKwkJICogTm90IHN1cmUgaWYgYSB1c2VyIGFjdHVhbGx5IG5lZWRzL3VzZXMgYW55IG9mIHRoZXNlLAorCQkgKiBidXQgbGV0J3MgYXNzdW1lIChmb3Igbm93KSB0aGV5IGRvLgorCQkgKi8KKwkJaWYgKGNoaXBfaW5mby0+Y3RsX3JlZyAmIH5iZmluX2N0bF9yZWcpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZG8gbm90IHNldCBiaXRzIGluIGN0bF9yZWcgIgorCQkJCSJ0aGF0IHRoZSBTUEkgZnJhbWV3b3JrIG1hbmFnZXNcbiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQljaGlwLT5lbmFibGVfZG1hID0gY2hpcF9pbmZvLT5lbmFibGVfZG1hICE9IDAKKwkJICAgICYmIGRydl9kYXRhLT5tYXN0ZXJfaW5mby0+ZW5hYmxlX2RtYTsKKwkJY2hpcC0+Y3RsX3JlZyA9IGNoaXBfaW5mby0+Y3RsX3JlZzsKKwkJY2hpcC0+Y3NfY2hnX3VkZWxheSA9IGNoaXBfaW5mby0+Y3NfY2hnX3VkZWxheTsKKwkJY2hpcC0+aWRsZV90eF92YWwgPSBjaGlwX2luZm8tPmlkbGVfdHhfdmFsOworCQljaGlwLT5waW9faW50ZXJydXB0ID0gY2hpcF9pbmZvLT5waW9faW50ZXJydXB0OworCQlzcGktPmJpdHNfcGVyX3dvcmQgPSBjaGlwX2luZm8tPmJpdHNfcGVyX3dvcmQ7CisJfSBlbHNlIHsKKwkJLyogZm9yY2UgYSBkZWZhdWx0IGJhc2Ugc3RhdGUgKi8KKwkJY2hpcC0+Y3RsX3JlZyAmPSBiZmluX2N0bF9yZWc7CisJfQorCisJaWYgKHNwaS0+Yml0c19wZXJfd29yZCAlIDgpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlZCBiaXRzX3Blcl93b3JkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJc3BpLT5iaXRzX3Blcl93b3JkKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiB0cmFuc2xhdGUgY29tbW9uIHNwaSBmcmFtZXdvcmsgaW50byBvdXIgcmVnaXN0ZXIgKi8KKwlpZiAoc3BpLT5tb2RlICYgfihTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0xTQl9GSVJTVCkpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bnN1cHBvcnRlZCBzcGkgbW9kZXMgZGV0ZWN0ZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCWNoaXAtPmN0bF9yZWcgfD0gQklUX0NUTF9DUE9MOworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJY2hpcC0+Y3RsX3JlZyB8PSBCSVRfQ1RMX0NQSEE7CisJaWYgKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpCisJCWNoaXAtPmN0bF9yZWcgfD0gQklUX0NUTF9MU0JGOworCS8qIHdlIGRvbnQgc3VwcG9ydCBydW5uaW5nIGluIHNsYXZlIG1vZGUgKHlldD8pICovCisJY2hpcC0+Y3RsX3JlZyB8PSBCSVRfQ1RMX01BU1RFUjsKKworCS8qCisJICogTm90aWNlOiBmb3IgYmxhY2tmaW4sIHRoZSBzcGVlZF9oeiBpcyB0aGUgdmFsdWUgb2YgcmVnaXN0ZXIKKwkgKiBTUElfQkFVRCwgbm90IHRoZSByZWFsIGJhdWRyYXRlCisJICovCisJY2hpcC0+YmF1ZCA9IGh6X3RvX3NwaV9iYXVkKHNwaS0+bWF4X3NwZWVkX2h6KTsKKwljaGlwLT5jaGlwX3NlbGVjdF9udW0gPSBzcGktPmNoaXBfc2VsZWN0OworCWlmIChjaGlwLT5jaGlwX3NlbGVjdF9udW0gPCBNQVhfQ1RSTF9DUykgeworCQlpZiAoIShzcGktPm1vZGUgJiBTUElfQ1BIQSkpCisJCQlkZXZfd2Fybigmc3BpLT5kZXYsICJXYXJuaW5nOiBTUEkgQ1BIQSBub3Qgc2V0OiIKKwkJCQkiIFNsYXZlIFNlbGVjdCBub3QgdW5kZXIgc29mdHdhcmUgY29udHJvbCFcbiIKKwkJCQkiIFNlZSBEb2N1bWVudGF0aW9uL2JsYWNrZmluL2JmaW4tc3BpLW5vdGVzLnR4dCIpOworCisJCWNoaXAtPmZsYWcgPSAoMSA8PCBzcGktPmNoaXBfc2VsZWN0KSA8PCA4OworCX0gZWxzZQorCQljaGlwLT5jc19ncGlvID0gY2hpcC0+Y2hpcF9zZWxlY3RfbnVtIC0gTUFYX0NUUkxfQ1M7CisKKwlpZiAoY2hpcC0+ZW5hYmxlX2RtYSAmJiBjaGlwLT5waW9faW50ZXJydXB0KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZW5hYmxlX2RtYSBpcyBzZXQsICIKKwkJCQkiZG8gbm90IHNldCBwaW9faW50ZXJydXB0XG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJLyoKKwkgKiBpZiBhbnkgb25lIFNQSSBjaGlwIGlzIHJlZ2lzdGVyZWQgYW5kIHdhbnRzIERNQSwgcmVxdWVzdCB0aGUKKwkgKiBETUEgY2hhbm5lbCBmb3IgaXQKKwkgKi8KKwlpZiAoY2hpcC0+ZW5hYmxlX2RtYSAmJiAhZHJ2X2RhdGEtPmRtYV9yZXF1ZXN0ZWQpIHsKKwkJLyogcmVnaXN0ZXIgZG1hIGlycSBoYW5kbGVyICovCisJCXJldCA9IHJlcXVlc3RfZG1hKGRydl9kYXRhLT5kbWFfY2hhbm5lbCwgIkJGSU5fU1BJX0RNQSIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCQkiVW5hYmxlIHRvIHJlcXVlc3QgQmxhY2tGaW4gU1BJIERNQSBjaGFubmVsXG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZHJ2X2RhdGEtPmRtYV9yZXF1ZXN0ZWQgPSAxOworCisJCXJldCA9IHNldF9kbWFfY2FsbGJhY2soZHJ2X2RhdGEtPmRtYV9jaGFubmVsLAorCQkJYmZpbl9zcGlfZG1hX2lycV9oYW5kbGVyLCBkcnZfZGF0YSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVW5hYmxlIHRvIHNldCBkbWEgY2FsbGJhY2tcbiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkbWFfZGlzYWJsZV9pcnEoZHJ2X2RhdGEtPmRtYV9jaGFubmVsKTsKKwl9CisKKwlpZiAoY2hpcC0+cGlvX2ludGVycnVwdCAmJiAhZHJ2X2RhdGEtPmlycV9yZXF1ZXN0ZWQpIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoZHJ2X2RhdGEtPnNwaV9pcnEsIGJmaW5fc3BpX3Bpb19pcnFfaGFuZGxlciwKKwkJCUlSUUZfRElTQUJMRUQsICJCRklOX1NQSSIsIGRydl9kYXRhKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJVbmFibGUgdG8gcmVnaXN0ZXIgc3BpIElSUVxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWRydl9kYXRhLT5pcnFfcmVxdWVzdGVkID0gMTsKKwkJLyogd2UgdXNlIHdyaXRlIG1vZGUsIHNwaSBpcnEgaGFzIHRvIGJlIGRpc2FibGVkIGhlcmUgKi8KKwkJZGlzYWJsZV9pcnEoZHJ2X2RhdGEtPnNwaV9pcnEpOworCX0KKworCWlmIChjaGlwLT5jaGlwX3NlbGVjdF9udW0gPj0gTUFYX0NUUkxfQ1MpIHsKKwkJLyogT25seSByZXF1ZXN0IG9uIGZpcnN0IHNldHVwICovCisJCWlmIChzcGlfZ2V0X2N0bGRhdGEoc3BpKSA9PSBOVUxMKSB7CisJCQlyZXQgPSBncGlvX3JlcXVlc3QoY2hpcC0+Y3NfZ3Bpbywgc3BpLT5tb2RhbGlhcyk7CisJCQlpZiAocmV0KSB7CisJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJncGlvX3JlcXVlc3QoKSBlcnJvclxuIik7CisJCQkJZ290byBwaW5fZXJyb3I7CisJCQl9CisJCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoY2hpcC0+Y3NfZ3BpbywgMSk7CisJCX0KKwl9CisKKwlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwIHNwaSBjaGlwICVzLCB3aWR0aCBpcyAlZCwgZG1hIGlzICVkXG4iLAorCQkJc3BpLT5tb2RhbGlhcywgc3BpLT5iaXRzX3Blcl93b3JkLCBjaGlwLT5lbmFibGVfZG1hKTsKKwlkZXZfZGJnKCZzcGktPmRldiwgImN0bF9yZWcgaXMgMHgleCwgZmxhZ19yZWcgaXMgMHgleFxuIiwKKwkJCWNoaXAtPmN0bF9yZWcsIGNoaXAtPmZsYWcpOworCisJc3BpX3NldF9jdGxkYXRhKHNwaSwgY2hpcCk7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgImNoaXAgc2VsZWN0IG51bWJlciBpcyAlZFxuIiwgY2hpcC0+Y2hpcF9zZWxlY3RfbnVtKTsKKwlpZiAoY2hpcC0+Y2hpcF9zZWxlY3RfbnVtIDwgTUFYX0NUUkxfQ1MpIHsKKwkJcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KHNzZWxbc3BpLT5tYXN0ZXItPmJ1c19udW1dCisJCSAgICAgICAgICAgICAgICAgICAgICAgICBbY2hpcC0+Y2hpcF9zZWxlY3RfbnVtLTFdLCBzcGktPm1vZGFsaWFzKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJwZXJpcGhlcmFsX3JlcXVlc3QoKSBlcnJvclxuIik7CisJCQlnb3RvIHBpbl9lcnJvcjsKKwkJfQorCX0KKworCWJmaW5fc3BpX2NzX2VuYWJsZShkcnZfZGF0YSwgY2hpcCk7CisJYmZpbl9zcGlfY3NfZGVhY3RpdmUoZHJ2X2RhdGEsIGNoaXApOworCisJcmV0dXJuIDA7CisKKyBwaW5fZXJyb3I6CisJaWYgKGNoaXAtPmNoaXBfc2VsZWN0X251bSA+PSBNQVhfQ1RSTF9DUykKKwkJZ3Bpb19mcmVlKGNoaXAtPmNzX2dwaW8pOworCWVsc2UKKwkJcGVyaXBoZXJhbF9mcmVlKHNzZWxbc3BpLT5tYXN0ZXItPmJ1c19udW1dCisJCQlbY2hpcC0+Y2hpcF9zZWxlY3RfbnVtIC0gMV0pOworIGVycm9yOgorCWlmIChjaGlwKSB7CisJCWlmIChkcnZfZGF0YS0+ZG1hX3JlcXVlc3RlZCkKKwkJCWZyZWVfZG1hKGRydl9kYXRhLT5kbWFfY2hhbm5lbCk7CisJCWRydl9kYXRhLT5kbWFfcmVxdWVzdGVkID0gMDsKKworCQlrZnJlZShjaGlwKTsKKwkJLyogcHJldmVudCBmcmVlICdjaGlwJyB0d2ljZSAqLworCQlzcGlfc2V0X2N0bGRhdGEoc3BpLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY2FsbGJhY2sgZm9yIHNwaSBmcmFtZXdvcmsuCisgKiBjbGVhbiBkcml2ZXIgc3BlY2lmaWMgZGF0YQorICovCitzdGF0aWMgdm9pZCBiZmluX3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGJmaW5fc3BpX3NsYXZlX2RhdGEgKmNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKKwlzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlpZiAoIWNoaXApCisJCXJldHVybjsKKworCWlmIChjaGlwLT5jaGlwX3NlbGVjdF9udW0gPCBNQVhfQ1RSTF9DUykgeworCQlwZXJpcGhlcmFsX2ZyZWUoc3NlbFtzcGktPm1hc3Rlci0+YnVzX251bV0KKwkJCQkJW2NoaXAtPmNoaXBfc2VsZWN0X251bS0xXSk7CisJCWJmaW5fc3BpX2NzX2Rpc2FibGUoZHJ2X2RhdGEsIGNoaXApOworCX0gZWxzZQorCQlncGlvX2ZyZWUoY2hpcC0+Y3NfZ3Bpbyk7CisKKwlrZnJlZShjaGlwKTsKKwkvKiBwcmV2ZW50IGZyZWUgJ2NoaXAnIHR3aWNlICovCisJc3BpX3NldF9jdGxkYXRhKHNwaSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9zcGlfaW5pdF9xdWV1ZShzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQoreworCUlOSVRfTElTVF9IRUFEKCZkcnZfZGF0YS0+cXVldWUpOworCXNwaW5fbG9ja19pbml0KCZkcnZfZGF0YS0+bG9jayk7CisKKwlkcnZfZGF0YS0+cnVubmluZyA9IGZhbHNlOworCWRydl9kYXRhLT5idXN5ID0gMDsKKworCS8qIGluaXQgdHJhbnNmZXIgdGFza2xldCAqLworCXRhc2tsZXRfaW5pdCgmZHJ2X2RhdGEtPnB1bXBfdHJhbnNmZXJzLAorCQkgICAgIGJmaW5fc3BpX3B1bXBfdHJhbnNmZXJzLCAodW5zaWduZWQgbG9uZylkcnZfZGF0YSk7CisKKwkvKiBpbml0IG1lc3NhZ2VzIHdvcmtxdWV1ZSAqLworCUlOSVRfV09SSygmZHJ2X2RhdGEtPnB1bXBfbWVzc2FnZXMsIGJmaW5fc3BpX3B1bXBfbWVzc2FnZXMpOworCWRydl9kYXRhLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKKwkJCQlkZXZfbmFtZShkcnZfZGF0YS0+bWFzdGVyLT5kZXYucGFyZW50KSk7CisJaWYgKGRydl9kYXRhLT53b3JrcXVldWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJmaW5fc3BpX3N0YXJ0X3F1ZXVlKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGRydl9kYXRhLT5ydW5uaW5nIHx8IGRydl9kYXRhLT5idXN5KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZHJ2X2RhdGEtPnJ1bm5pbmcgPSB0cnVlOworCWRydl9kYXRhLT5jdXJfbXNnID0gTlVMTDsKKwlkcnZfZGF0YS0+Y3VyX3RyYW5zZmVyID0gTlVMTDsKKwlkcnZfZGF0YS0+Y3VyX2NoaXAgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7CisKKwlxdWV1ZV93b3JrKGRydl9kYXRhLT53b3JrcXVldWUsICZkcnZfZGF0YS0+cHVtcF9tZXNzYWdlcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZmluX3NwaV9zdG9wX3F1ZXVlKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsaW1pdCA9IDUwMDsKKwlpbnQgc3RhdHVzID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IGxhbWUsIGJ1dCBpcyBvcHRpbWl6ZWQgZm9yIHRoZSBjb21tb24gZXhlY3V0aW9uIHBhdGguCisJICogQSB3YWl0X3F1ZXVlIG9uIHRoZSBkcnZfZGF0YS0+YnVzeSBjb3VsZCBiZSB1c2VkLCBidXQgdGhlbiB0aGUgY29tbW9uCisJICogZXhlY3V0aW9uIHBhdGggKHB1bXBfbWVzc2FnZXMpIHdvdWxkIGJlIHJlcXVpcmVkIHRvIGNhbGwgd2FrZV91cCBvcgorCSAqIGZyaWVuZHMgb24gZXZlcnkgU1BJIG1lc3NhZ2UuIERvIHRoaXMgaW5zdGVhZAorCSAqLworCWRydl9kYXRhLT5ydW5uaW5nID0gZmFsc2U7CisJd2hpbGUgKCghbGlzdF9lbXB0eSgmZHJ2X2RhdGEtPnF1ZXVlKSB8fCBkcnZfZGF0YS0+YnVzeSkgJiYgbGltaXQtLSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworCQltc2xlZXAoMTApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJmRydl9kYXRhLT5xdWV1ZSkgfHwgZHJ2X2RhdGEtPmJ1c3kpCisJCXN0YXR1cyA9IC1FQlVTWTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGJmaW5fc3BpX2Rlc3Ryb3lfcXVldWUoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSkKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gYmZpbl9zcGlfc3RvcF9xdWV1ZShkcnZfZGF0YSk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJZGVzdHJveV93b3JrcXVldWUoZHJ2X2RhdGEtPndvcmtxdWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgYmZpbl9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBiZmluNXh4X3NwaV9tYXN0ZXIgKnBsYXRmb3JtX2luZm87CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBzdGF0dXMgPSAwOworCisJcGxhdGZvcm1faW5mbyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKworCS8qIEFsbG9jYXRlIG1hc3RlciB3aXRoIHNwYWNlIGZvciBkcnZfZGF0YSAqLworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2YoKmRydl9kYXRhKSk7CisJaWYgKCFtYXN0ZXIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuIG5vdCBhbGxvYyBzcGlfbWFzdGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZHJ2X2RhdGEgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJZHJ2X2RhdGEtPm1hc3RlciA9IG1hc3RlcjsKKwlkcnZfZGF0YS0+bWFzdGVyX2luZm8gPSBwbGF0Zm9ybV9pbmZvOworCWRydl9kYXRhLT5wZGV2ID0gcGRldjsKKwlkcnZfZGF0YS0+cGluX3JlcSA9IHBsYXRmb3JtX2luZm8tPnBpbl9yZXE7CisKKwkvKiB0aGUgc3BpLT5tb2RlIGJpdHMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyOiAqLworCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9MU0JfRklSU1Q7CisKKwltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcGxhdGZvcm1faW5mby0+bnVtX2NoaXBzZWxlY3Q7CisJbWFzdGVyLT5jbGVhbnVwID0gYmZpbl9zcGlfY2xlYW51cDsKKwltYXN0ZXItPnNldHVwID0gYmZpbl9zcGlfc2V0dXA7CisJbWFzdGVyLT50cmFuc2ZlciA9IGJmaW5fc3BpX3RyYW5zZmVyOworCisJLyogRmluZCBhbmQgbWFwIG91ciByZXNvdXJjZXMgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBnZXQgSU9SRVNPVVJDRV9NRU1cbiIpOworCQlzdGF0dXMgPSAtRU5PRU5UOworCQlnb3RvIG91dF9lcnJvcl9nZXRfcmVzOworCX0KKworCWRydl9kYXRhLT5yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmIChkcnZfZGF0YS0+cmVncyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IG1hcCBJT1xuIik7CisJCXN0YXR1cyA9IC1FTlhJTzsKKwkJZ290byBvdXRfZXJyb3JfaW9yZW1hcDsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIk5vIERNQSBjaGFubmVsIHNwZWNpZmllZFxuIik7CisJCXN0YXR1cyA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0X2Vycm9yX2ZyZWVfaW87CisJfQorCWRydl9kYXRhLT5kbWFfY2hhbm5lbCA9IHJlcy0+c3RhcnQ7CisKKwlkcnZfZGF0YS0+c3BpX2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGRydl9kYXRhLT5zcGlfaXJxIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIk5vIHNwaSBwaW8gaXJxIHNwZWNpZmllZFxuIik7CisJCXN0YXR1cyA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0X2Vycm9yX2ZyZWVfaW87CisJfQorCisJLyogSW5pdGlhbCBhbmQgc3RhcnQgcXVldWUgKi8KKwlzdGF0dXMgPSBiZmluX3NwaV9pbml0X3F1ZXVlKGRydl9kYXRhKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIGluaXRpYWxpemluZyBxdWV1ZVxuIik7CisJCWdvdG8gb3V0X2Vycm9yX3F1ZXVlX2FsbG9jOworCX0KKworCXN0YXR1cyA9IGJmaW5fc3BpX3N0YXJ0X3F1ZXVlKGRydl9kYXRhKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHN0YXJ0aW5nIHF1ZXVlXG4iKTsKKwkJZ290byBvdXRfZXJyb3JfcXVldWVfYWxsb2M7CisJfQorCisJc3RhdHVzID0gcGVyaXBoZXJhbF9yZXF1ZXN0X2xpc3QoZHJ2X2RhdGEtPnBpbl9yZXEsIERSVl9OQU1FKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiOiBSZXF1ZXN0aW5nIFBlcmlwaGVyYWxzIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X2Vycm9yX3F1ZXVlX2FsbG9jOworCX0KKworCS8qIFJlc2V0IFNQSSByZWdpc3RlcnMuIElmIHRoZXNlIHJlZ2lzdGVycyB3ZXJlIHVzZWQgYnkgdGhlIGJvb3QgbG9hZGVyLAorCSAqIHRoZSBza3kgbWF5IGZhbGwgb24geW91ciBoZWFkIGlmIHlvdSBlbmFibGUgdGhlIGRtYSBjb250cm9sbGVyLgorCSAqLworCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT5jdGwsIEJJVF9DVExfQ1BIQSB8IEJJVF9DVExfTUFTVEVSKTsKKwliZmluX3dyaXRlKCZkcnZfZGF0YS0+cmVncy0+ZmxnLCAweEZGMDApOworCisJLyogUmVnaXN0ZXIgd2l0aCB0aGUgU1BJIGZyYW1ld29yayAqLworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRydl9kYXRhKTsKKwlzdGF0dXMgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldl9lcnIoZGV2LCAicHJvYmxlbSByZWdpc3RlcmluZyBzcGkgbWFzdGVyXG4iKTsKKwkJZ290byBvdXRfZXJyb3JfcXVldWVfYWxsb2M7CisJfQorCisJZGV2X2luZm8oZGV2LCAiJXMsIFZlcnNpb24gJXMsIHJlZ3NAJXAsIGRtYSBjaGFubmVsQCVkXG4iLAorCQlEUlZfREVTQywgRFJWX1ZFUlNJT04sIGRydl9kYXRhLT5yZWdzLAorCQlkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOworCXJldHVybiBzdGF0dXM7CisKK291dF9lcnJvcl9xdWV1ZV9hbGxvYzoKKwliZmluX3NwaV9kZXN0cm95X3F1ZXVlKGRydl9kYXRhKTsKK291dF9lcnJvcl9mcmVlX2lvOgorCWlvdW5tYXAoZHJ2X2RhdGEtPnJlZ3MpOworb3V0X2Vycm9yX2lvcmVtYXA6CitvdXRfZXJyb3JfZ2V0X3JlczoKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogc3RvcCBoYXJkd2FyZSBhbmQgcmVtb3ZlIHRoZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IGJmaW5fc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmICghZHJ2X2RhdGEpCisJCXJldHVybiAwOworCisJLyogUmVtb3ZlIHRoZSBxdWV1ZSAqLworCXN0YXR1cyA9IGJmaW5fc3BpX2Rlc3Ryb3lfcXVldWUoZHJ2X2RhdGEpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIERpc2FibGUgdGhlIFNTUCBhdCB0aGUgcGVyaXBoZXJhbCBhbmQgU09DIGxldmVsICovCisJYmZpbl9zcGlfZGlzYWJsZShkcnZfZGF0YSk7CisKKwkvKiBSZWxlYXNlIERNQSAqLworCWlmIChkcnZfZGF0YS0+bWFzdGVyX2luZm8tPmVuYWJsZV9kbWEpIHsKKwkJaWYgKGRtYV9jaGFubmVsX2FjdGl2ZShkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpKQorCQkJZnJlZV9kbWEoZHJ2X2RhdGEtPmRtYV9jaGFubmVsKTsKKwl9CisKKwlpZiAoZHJ2X2RhdGEtPmlycV9yZXF1ZXN0ZWQpIHsKKwkJZnJlZV9pcnEoZHJ2X2RhdGEtPnNwaV9pcnEsIGRydl9kYXRhKTsKKwkJZHJ2X2RhdGEtPmlycV9yZXF1ZXN0ZWQgPSAwOworCX0KKworCS8qIERpc2Nvbm5lY3QgZnJvbSB0aGUgU1BJIGZyYW1ld29yayAqLworCXNwaV91bnJlZ2lzdGVyX21hc3RlcihkcnZfZGF0YS0+bWFzdGVyKTsKKworCXBlcmlwaGVyYWxfZnJlZV9saXN0KGRydl9kYXRhLT5waW5fcmVxKTsKKworCS8qIFByZXZlbnQgZG91YmxlIHJlbW92ZSAqLworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYmZpbl9zcGlfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBzdGF0dXMgPSAwOworCisJc3RhdHVzID0gYmZpbl9zcGlfc3RvcF9xdWV1ZShkcnZfZGF0YSk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJZHJ2X2RhdGEtPmN0cmxfcmVnID0gYmZpbl9yZWFkKCZkcnZfZGF0YS0+cmVncy0+Y3RsKTsKKwlkcnZfZGF0YS0+ZmxhZ19yZWcgPSBiZmluX3JlYWQoJmRydl9kYXRhLT5yZWdzLT5mbGcpOworCisJLyoKKwkgKiByZXNldCBTUElfQ1RMIGFuZCBTUElfRkxHIHJlZ2lzdGVycworCSAqLworCWJmaW5fd3JpdGUoJmRydl9kYXRhLT5yZWdzLT5jdGwsIEJJVF9DVExfQ1BIQSB8IEJJVF9DVExfTUFTVEVSKTsKKwliZmluX3dyaXRlKCZkcnZfZGF0YS0+cmVncy0+ZmxnLCAweEZGMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9zcGlfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBzdGF0dXMgPSAwOworCisJYmZpbl93cml0ZSgmZHJ2X2RhdGEtPnJlZ3MtPmN0bCwgZHJ2X2RhdGEtPmN0cmxfcmVnKTsKKwliZmluX3dyaXRlKCZkcnZfZGF0YS0+cmVncy0+ZmxnLCBkcnZfZGF0YS0+ZmxhZ19yZWcpOworCisJLyogU3RhcnQgdGhlIHF1ZXVlIHJ1bm5pbmcgKi8KKwlzdGF0dXMgPSBiZmluX3NwaV9zdGFydF9xdWV1ZShkcnZfZGF0YSk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInByb2JsZW0gc3RhcnRpbmcgcXVldWUgKCVkKVxuIiwgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGJmaW5fc3BpX3N1c3BlbmQgTlVMTAorI2RlZmluZSBiZmluX3NwaV9yZXN1bWUgTlVMTAorI2VuZGlmCQkJCS8qIENPTkZJR19QTSAqLworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJmaW4tc3BpIik7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiZmluX3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSBEUlZfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkuc3VzcGVuZAk9IGJmaW5fc3BpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBiZmluX3NwaV9yZXN1bWUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChiZmluX3NwaV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmZpbl9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmJmaW5fc3BpX2RyaXZlciwgYmZpbl9zcGlfcHJvYmUpOworfQorc3Vic3lzX2luaXRjYWxsKGJmaW5fc3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYmZpbl9zcGlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZiZmluX3NwaV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYmZpbl9zcGlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZ190eHJ4LmggYi9kcml2ZXJzL3NwaS9zcGktYml0YmFuZy10eHJ4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3BpL3NwaV9iaXRiYW5nX3R4cnguaApyZW5hbWUgdG8gZHJpdmVycy9zcGkvc3BpLWJpdGJhbmctdHhyeC5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYml0YmFuZy5jIGIvZHJpdmVycy9zcGkvc3BpLWJpdGJhbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQ1N2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJpdGJhbmcuYwpAQCAtMCwwICsxLDUwNSBAQAorLyoKKyAqIHBvbGxpbmcvYml0YmFuZ2luZyBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyIHV0aWxpdGllcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogRklSU1QgUEFSVCAoT1BUSU9OQUwpOiAgd29yZC1hdC1hLXRpbWUgc3BpX3RyYW5zZmVyIHN1cHBvcnQuCisgKiBVc2UgdGhpcyBmb3IgR1BJTyBvciBzaGlmdC1yZWdpc3RlciBsZXZlbCBoYXJkd2FyZSBBUElzLgorICoKKyAqIHNwaV9iaXRiYW5nX2NzIGlzIGluIHNwaV9kZXZpY2UtPmNvbnRyb2xsZXJfc3RhdGUsIHdoaWNoIGlzIHVuYXZhaWxhYmxlCisgKiB0byBnbHVlIGNvZGUuICBUaGVzZSBiaXRiYW5nIHNldHVwKCkgYW5kIGNsZWFudXAoKSByb3V0aW5lcyBhcmUgYWx3YXlzCisgKiB1c2VkLCB0aG91Z2ggbWF5YmUgdGhleSdyZSBjYWxsZWQgZnJvbSBjb250cm9sbGVyLWF3YXJlIGNvZGUuCisgKgorICogY2hpcHNlbGVjdCgpIGFuZCBmcmllbmRzIG1heSB1c2UgdXNlIHNwaV9kZXZpY2UtPmNvbnRyb2xsZXJfZGF0YSBhbmQKKyAqIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGFzIGFwcHJvcHJpYXRlLgorICoKKyAqCisgKiBOT1RFOiAgU1BJIGNvbnRyb2xsZXIgcGlucyBjYW4gb2Z0ZW4gYmUgdXNlZCBhcyBHUElPIHBpbnMgaW5zdGVhZCwKKyAqIHdoaWNoIG1lYW5zIHlvdSBjb3VsZCB1c2UgYSBiaXRiYW5nIGRyaXZlciBlaXRoZXIgdG8gZ2V0IGhhcmR3YXJlCisgKiB3b3JraW5nIHF1aWNrbHksIG9yIHRlc3RpbmcgZm9yIGRpZmZlcmVuY2VzIHRoYXQgYXJlbid0IHNwZWVkIHJlbGF0ZWQuCisgKi8KKworc3RydWN0IHNwaV9iaXRiYW5nX2NzIHsKKwl1bnNpZ25lZAluc2VjczsJLyogKGNsb2NrIGN5Y2xlIHRpbWUpLzIgKi8KKwl1MzIJCSgqdHhyeF93b3JkKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBuc2VjcywKKwkJCQkJdTMyIHdvcmQsIHU4IGJpdHMpOworCXVuc2lnbmVkCSgqdHhyeF9idWZzKShzdHJ1Y3Qgc3BpX2RldmljZSAqLAorCQkJCQl1MzIgKCp0eHJ4X3dvcmQpKAorCQkJCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkJCXVuc2lnbmVkIG5zZWNzLAorCQkJCQkJdTMyIHdvcmQsIHU4IGJpdHMpLAorCQkJCQl1bnNpZ25lZCwgc3RydWN0IHNwaV90cmFuc2ZlciAqKTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBiaXRiYW5nX3R4cnhfOCgKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpLAorCXUzMgkJCSgqdHhyeF93b3JkKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQl1bnNpZ25lZCBuc2VjcywKKwkJCQkJdTMyIHdvcmQsIHU4IGJpdHMpLAorCXVuc2lnbmVkCQlucywKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0CispIHsKKwl1bnNpZ25lZAkJYml0cyA9IHQtPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKKwl1bnNpZ25lZAkJY291bnQgPSB0LT5sZW47CisJY29uc3QgdTgJCSp0eCA9IHQtPnR4X2J1ZjsKKwl1OAkJCSpyeCA9IHQtPnJ4X2J1ZjsKKworCXdoaWxlIChsaWtlbHkoY291bnQgPiAwKSkgeworCQl1OAkJd29yZCA9IDA7CisKKwkJaWYgKHR4KQorCQkJd29yZCA9ICp0eCsrOworCQl3b3JkID0gdHhyeF93b3JkKHNwaSwgbnMsIHdvcmQsIGJpdHMpOworCQlpZiAocngpCisJCQkqcngrKyA9IHdvcmQ7CisJCWNvdW50IC09IDE7CisJfQorCXJldHVybiB0LT5sZW4gLSBjb3VudDsKK30KKworc3RhdGljIHVuc2lnbmVkIGJpdGJhbmdfdHhyeF8xNigKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpLAorCXUzMgkJCSgqdHhyeF93b3JkKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQl1bnNpZ25lZCBuc2VjcywKKwkJCQkJdTMyIHdvcmQsIHU4IGJpdHMpLAorCXVuc2lnbmVkCQlucywKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0CispIHsKKwl1bnNpZ25lZAkJYml0cyA9IHQtPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKKwl1bnNpZ25lZAkJY291bnQgPSB0LT5sZW47CisJY29uc3QgdTE2CQkqdHggPSB0LT50eF9idWY7CisJdTE2CQkJKnJ4ID0gdC0+cnhfYnVmOworCisJd2hpbGUgKGxpa2VseShjb3VudCA+IDEpKSB7CisJCXUxNgkJd29yZCA9IDA7CisKKwkJaWYgKHR4KQorCQkJd29yZCA9ICp0eCsrOworCQl3b3JkID0gdHhyeF93b3JkKHNwaSwgbnMsIHdvcmQsIGJpdHMpOworCQlpZiAocngpCisJCQkqcngrKyA9IHdvcmQ7CisJCWNvdW50IC09IDI7CisJfQorCXJldHVybiB0LT5sZW4gLSBjb3VudDsKK30KKworc3RhdGljIHVuc2lnbmVkIGJpdGJhbmdfdHhyeF8zMigKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpLAorCXUzMgkJCSgqdHhyeF93b3JkKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQl1bnNpZ25lZCBuc2VjcywKKwkJCQkJdTMyIHdvcmQsIHU4IGJpdHMpLAorCXVuc2lnbmVkCQlucywKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0CispIHsKKwl1bnNpZ25lZAkJYml0cyA9IHQtPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKKwl1bnNpZ25lZAkJY291bnQgPSB0LT5sZW47CisJY29uc3QgdTMyCQkqdHggPSB0LT50eF9idWY7CisJdTMyCQkJKnJ4ID0gdC0+cnhfYnVmOworCisJd2hpbGUgKGxpa2VseShjb3VudCA+IDMpKSB7CisJCXUzMgkJd29yZCA9IDA7CisKKwkJaWYgKHR4KQorCQkJd29yZCA9ICp0eCsrOworCQl3b3JkID0gdHhyeF93b3JkKHNwaSwgbnMsIHdvcmQsIGJpdHMpOworCQlpZiAocngpCisJCQkqcngrKyA9IHdvcmQ7CisJCWNvdW50IC09IDQ7CisJfQorCXJldHVybiB0LT5sZW4gLSBjb3VudDsKK30KKworaW50IHNwaV9iaXRiYW5nX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IHNwaV9iaXRiYW5nX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwl1OAkJCWJpdHNfcGVyX3dvcmQ7CisJdTMyCQkJaHo7CisKKwlpZiAodCkgeworCQliaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZDsKKwkJaHogPSB0LT5zcGVlZF9oejsKKwl9IGVsc2UgeworCQliaXRzX3Blcl93b3JkID0gMDsKKwkJaHogPSAwOworCX0KKworCS8qIHNwaV90cmFuc2ZlciBsZXZlbCBjYWxscyB0aGF0IHdvcmsgcGVyLXdvcmQgKi8KKwlpZiAoIWJpdHNfcGVyX3dvcmQpCisJCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisJaWYgKGJpdHNfcGVyX3dvcmQgPD0gOCkKKwkJY3MtPnR4cnhfYnVmcyA9IGJpdGJhbmdfdHhyeF84OworCWVsc2UgaWYgKGJpdHNfcGVyX3dvcmQgPD0gMTYpCisJCWNzLT50eHJ4X2J1ZnMgPSBiaXRiYW5nX3R4cnhfMTY7CisJZWxzZSBpZiAoYml0c19wZXJfd29yZCA8PSAzMikKKwkJY3MtPnR4cnhfYnVmcyA9IGJpdGJhbmdfdHhyeF8zMjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJLyogbnNlY3MgPSAoY2xvY2sgcGVyaW9kKS8yICovCisJaWYgKCFoeikKKwkJaHogPSBzcGktPm1heF9zcGVlZF9oejsKKwlpZiAoaHopIHsKKwkJY3MtPm5zZWNzID0gKDEwMDAwMDAwMDAvMikgLyBoejsKKwkJaWYgKGNzLT5uc2VjcyA+IChNQVhfVURFTEFZX01TICogMTAwMCAqIDEwMDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfYml0YmFuZ19zZXR1cF90cmFuc2Zlcik7CisKKy8qKgorICogc3BpX2JpdGJhbmdfc2V0dXAgLSBkZWZhdWx0IHNldHVwIGZvciBwZXItd29yZCBJL08gbG9vcHMKKyAqLworaW50IHNwaV9iaXRiYW5nX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHNwaV9iaXRiYW5nX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJKmJpdGJhbmc7CisJaW50CQkJcmV0dmFsOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJYml0YmFuZyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJaWYgKCFjcykgeworCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7CisJCWlmICghY3MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gY3M7CisJfQorCisJLyogcGVyLXdvcmQgc2hpZnQgcmVnaXN0ZXIgYWNjZXNzLCBpbiBoYXJkd2FyZSBvciBiaXRiYW5naW5nICovCisJY3MtPnR4cnhfd29yZCA9IGJpdGJhbmctPnR4cnhfd29yZFtzcGktPm1vZGUgJiAoU1BJX0NQT0x8U1BJX0NQSEEpXTsKKwlpZiAoIWNzLT50eHJ4X3dvcmQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dmFsID0gYml0YmFuZy0+c2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXMsICV1IG5zZWMvYml0XG4iLCBfX2Z1bmNfXywgMiAqIGNzLT5uc2Vjcyk7CisKKwkvKiBOT1RFIHdlIF9uZWVkXyB0byBjYWxsIGNoaXBzZWxlY3QoKSBlYXJseSwgaWRlYWxseSB3aXRoIGFkYXB0ZXIKKwkgKiBzZXR1cCwgdW5sZXNzIHRoZSBoYXJkd2FyZSBkZWZhdWx0cyBjb29wZXJhdGUgdG8gYXZvaWQgY29uZnVzaW9uCisJICogYmV0d2VlbiBub3JtYWwgKGFjdGl2ZSBsb3cpIGFuZCBpbnZlcnRlZCBjaGlwc2VsZWN0cy4KKwkgKi8KKworCS8qIGRlc2VsZWN0IGNoaXAgKGxvdyBvciBoaWdoKSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7CisJaWYgKCFiaXRiYW5nLT5idXN5KSB7CisJCWJpdGJhbmctPmNoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0lOQUNUSVZFKTsKKwkJbmRlbGF5KGNzLT5uc2Vjcyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdGJhbmctPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2JpdGJhbmdfc2V0dXApOworCisvKioKKyAqIHNwaV9iaXRiYW5nX2NsZWFudXAgLSBkZWZhdWx0IGNsZWFudXAgZm9yIHBlci13b3JkIEkvTyBsb29wcworICovCit2b2lkIHNwaV9iaXRiYW5nX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlrZnJlZShzcGktPmNvbnRyb2xsZXJfc3RhdGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2JpdGJhbmdfY2xlYW51cCk7CisKK3N0YXRpYyBpbnQgc3BpX2JpdGJhbmdfYnVmcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBzcGlfYml0YmFuZ19jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJdW5zaWduZWQJCW5zZWNzID0gY3MtPm5zZWNzOworCisJcmV0dXJuIGNzLT50eHJ4X2J1ZnMoc3BpLCBjcy0+dHhyeF93b3JkLCBuc2VjcywgdCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTRUNPTkQgUEFSVCAuLi4gc2ltcGxlIHRyYW5zZmVyIHF1ZXVlIHJ1bm5lci4KKyAqCisgKiBUaGlzIGNvc3RzIGEgdGFzayBjb250ZXh0IHBlciBjb250cm9sbGVyLCBydW5uaW5nIHRoZSBxdWV1ZSBieQorICogcGVyZm9ybWluZyBlYWNoIHRyYW5zZmVyIGluIHNlcXVlbmNlLiAgU21hcnRlciBoYXJkd2FyZSBjYW4gcXVldWUKKyAqIHNldmVyYWwgRE1BIHRyYW5zZmVycyBhdCBvbmNlLCBhbmQgcHJvY2VzcyBzZXZlcmFsIGNvbnRyb2xsZXIgcXVldWVzCisgKiBpbiBwYXJhbGxlbDsgdGhpcyBkcml2ZXIgZG9lc24ndCBtYXRjaCBzdWNoIGhhcmR3YXJlIHZlcnkgd2VsbC4KKyAqCisgKiBEcml2ZXJzIGNhbiBwcm92aWRlIHdvcmQtYXQtYS10aW1lIGkvbyBwcmltaXRpdmVzLCBvciBwcm92aWRlCisgKiB0cmFuc2Zlci1hdC1hLXRpbWUgb25lcyB0byBsZXZlcmFnZSBkbWEgb3IgZmlmbyBoYXJkd2FyZS4KKyAqLworc3RhdGljIHZvaWQgYml0YmFuZ193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJKmJpdGJhbmcgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNwaV9iaXRiYW5nLCB3b3JrKTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7CisJYml0YmFuZy0+YnVzeSA9IDE7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZiaXRiYW5nLT5xdWV1ZSkpIHsKKwkJc3RydWN0IHNwaV9tZXNzYWdlCSptOworCQlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCQl1bnNpZ25lZAkJbnNlY3M7CisJCXN0cnVjdCBzcGlfdHJhbnNmZXIJKnQgPSBOVUxMOworCQl1bnNpZ25lZAkJdG1wOworCQl1bnNpZ25lZAkJY3NfY2hhbmdlOworCQlpbnQJCQlzdGF0dXM7CisJCWludAkJCWRvX3NldHVwID0gLTE7CisKKwkJbSA9IGNvbnRhaW5lcl9vZihiaXRiYW5nLT5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsCisJCQkJcXVldWUpOworCQlsaXN0X2RlbF9pbml0KCZtLT5xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdGJhbmctPmxvY2ssIGZsYWdzKTsKKworCQkvKiBGSVhNRSB0aGlzIGlzIG1hZGUtdXAgLi4uIHRoZSBjb3JyZWN0IHZhbHVlIGlzIGtub3duIHRvCisJCSAqIHdvcmQtYXQtYS10aW1lIGJpdGJhbmcgY29kZSwgYW5kIHByZXN1bWFibHkgY2hpcHNlbGVjdCgpCisJCSAqIHNob3VsZCBlbmZvcmNlIHRoZXNlIHJlcXVpcmVtZW50cyB0b28/CisJCSAqLworCQluc2VjcyA9IDEwMDsKKworCQlzcGkgPSBtLT5zcGk7CisJCXRtcCA9IDA7CisJCWNzX2NoYW5nZSA9IDE7CisJCXN0YXR1cyA9IDA7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSAodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCisJCQkvKiBvdmVycmlkZSBzcGVlZCBvciB3b3Jkc2l6ZT8gKi8KKwkJCWlmICh0LT5zcGVlZF9oeiB8fCB0LT5iaXRzX3Blcl93b3JkKQorCQkJCWRvX3NldHVwID0gMTsKKworCQkJLyogaW5pdCAoLTEpIG9yIG92ZXJyaWRlICgxKSB0cmFuc2ZlciBwYXJhbXMgKi8KKwkJCWlmIChkb19zZXR1cCAhPSAwKSB7CisJCQkJc3RhdHVzID0gYml0YmFuZy0+c2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKKwkJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGRvX3NldHVwID09IC0xKQorCQkJCQlkb19zZXR1cCA9IDA7CisJCQl9CisKKwkJCS8qIHNldCB1cCBkZWZhdWx0IGNsb2NrIHBvbGFyaXR5LCBhbmQgYWN0aXZhdGUgY2hpcDsKKwkJCSAqIHRoaXMgaW1wbGljaXRseSB1cGRhdGVzIGNsb2NrIGFuZCBzcGkgbW9kZXMgYXMKKwkJCSAqIHByZXZpb3VzbHkgcmVjb3JkZWQgZm9yIHRoaXMgZGV2aWNlIHZpYSBzZXR1cCgpLgorCQkJICogKGFuZCBhbHNvIGRlc2VsZWN0cyBhbnkgb3RoZXIgY2hpcCB0aGF0IG1pZ2h0IGJlCisJCQkgKiBzZWxlY3RlZCAuLi4pCisJCQkgKi8KKwkJCWlmIChjc19jaGFuZ2UpIHsKKwkJCQliaXRiYW5nLT5jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19BQ1RJVkUpOworCQkJCW5kZWxheShuc2Vjcyk7CisJCQl9CisJCQljc19jaGFuZ2UgPSB0LT5jc19jaGFuZ2U7CisJCQlpZiAoIXQtPnR4X2J1ZiAmJiAhdC0+cnhfYnVmICYmIHQtPmxlbikgeworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHRyYW5zZmVyIGRhdGEuICB0aGUgbG93ZXIgbGV2ZWwgY29kZSBoYW5kbGVzIGFueQorCQkJICogbmV3IGRtYSBtYXBwaW5ncyBpdCBuZWVkcy4gb3VyIGNhbGxlciBhbHdheXMgZ2F2ZQorCQkJICogdXMgZG1hLXNhZmUgYnVmZmVycy4KKwkJCSAqLworCQkJaWYgKHQtPmxlbikgeworCQkJCS8qIFJFVklTSVQgZG1hIEFQSSBzdGlsbCBuZWVkcyBhIGRlc2lnbmF0ZWQKKwkJCQkgKiBETUFfQUREUl9JTlZBTElEOyB+MCBtaWdodCBiZSBiZXR0ZXIuCisJCQkJICovCisJCQkJaWYgKCFtLT5pc19kbWFfbWFwcGVkKQorCQkJCQl0LT5yeF9kbWEgPSB0LT50eF9kbWEgPSAwOworCQkJCXN0YXR1cyA9IGJpdGJhbmctPnR4cnhfYnVmcyhzcGksIHQpOworCQkJfQorCQkJaWYgKHN0YXR1cyA+IDApCisJCQkJbS0+YWN0dWFsX2xlbmd0aCArPSBzdGF0dXM7CisJCQlpZiAoc3RhdHVzICE9IHQtPmxlbikgeworCQkJCS8qIGFsd2F5cyByZXBvcnQgc29tZSBraW5kIG9mIGVycm9yICovCisJCQkJaWYgKHN0YXR1cyA+PSAwKQorCQkJCQlzdGF0dXMgPSAtRVJFTU9URUlPOworCQkJCWJyZWFrOworCQkJfQorCQkJc3RhdHVzID0gMDsKKworCQkJLyogcHJvdG9jb2wgdHdlYWtzIGJlZm9yZSBuZXh0IHRyYW5zZmVyICovCisJCQlpZiAodC0+ZGVsYXlfdXNlY3MpCisJCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKKworCQkJaWYgKCFjc19jaGFuZ2UpCisJCQkJY29udGludWU7CisJCQlpZiAodC0+dHJhbnNmZXJfbGlzdC5uZXh0ID09ICZtLT50cmFuc2ZlcnMpCisJCQkJYnJlYWs7CisKKwkJCS8qIHNvbWV0aW1lcyBhIHNob3J0IG1pZC1tZXNzYWdlIGRlc2VsZWN0IG9mIHRoZSBjaGlwCisJCQkgKiBtYXkgYmUgbmVlZGVkIHRvIHRlcm1pbmF0ZSBhIG1vZGUgb3IgY29tbWFuZAorCQkJICovCisJCQluZGVsYXkobnNlY3MpOworCQkJYml0YmFuZy0+Y2hpcHNlbGVjdChzcGksIEJJVEJBTkdfQ1NfSU5BQ1RJVkUpOworCQkJbmRlbGF5KG5zZWNzKTsKKwkJfQorCisJCW0tPnN0YXR1cyA9IHN0YXR1czsKKwkJbS0+Y29tcGxldGUobS0+Y29udGV4dCk7CisKKwkJLyogbm9ybWFsbHkgZGVhY3RpdmF0ZSBjaGlwc2VsZWN0IC4uLiB1bmxlc3Mgbm8gZXJyb3IgYW5kCisJCSAqIGNzX2NoYW5nZSBoYXMgaGludGVkIHRoYXQgdGhlIG5leHQgbWVzc2FnZSB3aWxsIHByb2JhYmx5CisJCSAqIGJlIGZvciB0aGlzIGNoaXAgdG9vLgorCQkgKi8KKwkJaWYgKCEoc3RhdHVzID09IDAgJiYgY3NfY2hhbmdlKSkgeworCQkJbmRlbGF5KG5zZWNzKTsKKwkJCWJpdGJhbmctPmNoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0lOQUNUSVZFKTsKKwkJCW5kZWxheShuc2Vjcyk7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0YmFuZy0+bG9jaywgZmxhZ3MpOworCX0KKwliaXRiYW5nLT5idXN5ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogc3BpX2JpdGJhbmdfdHJhbnNmZXIgLSBkZWZhdWx0IHN1Ym1pdCB0byB0cmFuc2ZlciBxdWV1ZQorICovCitpbnQgc3BpX2JpdGJhbmdfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBzcGlfYml0YmFuZwkqYml0YmFuZzsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQlzdGF0dXMgPSAwOworCisJbS0+YWN0dWFsX2xlbmd0aCA9IDA7CisJbS0+c3RhdHVzID0gLUVJTlBST0dSRVNTOworCisJYml0YmFuZyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJpdGJhbmctPmxvY2ssIGZsYWdzKTsKKwlpZiAoIXNwaS0+bWF4X3NwZWVkX2h6KQorCQlzdGF0dXMgPSAtRU5FVERPV047CisJZWxzZSB7CisJCWxpc3RfYWRkX3RhaWwoJm0tPnF1ZXVlLCAmYml0YmFuZy0+cXVldWUpOworCQlxdWV1ZV93b3JrKGJpdGJhbmctPndvcmtxdWV1ZSwgJmJpdGJhbmctPndvcmspOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2JpdGJhbmdfdHJhbnNmZXIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIHNwaV9iaXRiYW5nX3N0YXJ0IC0gc3RhcnQgdXAgYSBwb2xsZWQvYml0YmFuZ2luZyBTUEkgbWFzdGVyIGRyaXZlcgorICogQGJpdGJhbmc6IGRyaXZlciBoYW5kbGUKKyAqCisgKiBDYWxsZXIgc2hvdWxkIGhhdmUgemVyby1pbml0aWFsaXplZCBhbGwgcGFydHMgb2YgdGhlIHN0cnVjdHVyZSwgYW5kIHRoZW4KKyAqIHByb3ZpZGVkIGNhbGxiYWNrcyBmb3IgY2hpcCBzZWxlY3Rpb24gYW5kIEkvTyBsb29wcy4gIElmIHRoZSBtYXN0ZXIgaGFzCisgKiBhIHRyYW5zZmVyIG1ldGhvZCwgaXRzIGZpbmFsIHN0ZXAgc2hvdWxkIGNhbGwgc3BpX2JpdGJhbmdfdHJhbnNmZXI7IG9yLAorICogdGhhdCdzIHRoZSBkZWZhdWx0IGlmIHRoZSB0cmFuc2ZlciByb3V0aW5lIGlzIG5vdCBpbml0aWFsaXplZC4gIEl0IHNob3VsZAorICogYWxzbyBzZXQgdXAgdGhlIGJ1cyBudW1iZXIgYW5kIG51bWJlciBvZiBjaGlwc2VsZWN0cy4KKyAqCisgKiBGb3IgaS9vIGxvb3BzLCBwcm92aWRlIGNhbGxiYWNrcyBlaXRoZXIgcGVyLXdvcmQgKGZvciBiaXRiYW5naW5nLCBvciBmb3IKKyAqIGhhcmR3YXJlIHRoYXQgYmFzaWNhbGx5IGV4cG9zZXMgYSBzaGlmdCByZWdpc3Rlcikgb3IgcGVyLXNwaV90cmFuc2ZlcgorICogKHdoaWNoIHRha2VzIGJldHRlciBhZHZhbnRhZ2Ugb2YgaGFyZHdhcmUgbGlrZSBmaWZvcyBvciBETUEgZW5naW5lcykuCisgKgorICogRHJpdmVycyB1c2luZyBwZXItd29yZCBJL08gbG9vcHMgc2hvdWxkIHVzZSAob3IgY2FsbCkgc3BpX2JpdGJhbmdfc2V0dXAsCisgKiBzcGlfYml0YmFuZ19jbGVhbnVwIGFuZCBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlciB0byBoYW5kbGUgdGhvc2Ugc3BpCisgKiBtYXN0ZXIgbWV0aG9kcy4gIFRob3NlIG1ldGhvZHMgYXJlIHRoZSBkZWZhdWx0cyBpZiB0aGUgYml0YmFuZy0+dHhyeF9idWZzCisgKiByb3V0aW5lIGlzbid0IGluaXRpYWxpemVkLgorICoKKyAqIFRoaXMgcm91dGluZSByZWdpc3RlcnMgdGhlIHNwaV9tYXN0ZXIsIHdoaWNoIHdpbGwgcHJvY2VzcyByZXF1ZXN0cyBpbiBhCisgKiBkZWRpY2F0ZWQgdGFzaywga2VlcGluZyBJUlFzIHVuYmxvY2tlZCBtb3N0IG9mIHRoZSB0aW1lLiAgVG8gc3RvcAorICogcHJvY2Vzc2luZyB0aG9zZSByZXF1ZXN0cywgY2FsbCBzcGlfYml0YmFuZ19zdG9wKCkuCisgKi8KK2ludCBzcGlfYml0YmFuZ19zdGFydChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKmJpdGJhbmcpCit7CisJaW50CXN0YXR1czsKKworCWlmICghYml0YmFuZy0+bWFzdGVyIHx8ICFiaXRiYW5nLT5jaGlwc2VsZWN0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUlOSVRfV09SSygmYml0YmFuZy0+d29yaywgYml0YmFuZ193b3JrKTsKKwlzcGluX2xvY2tfaW5pdCgmYml0YmFuZy0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmJpdGJhbmctPnF1ZXVlKTsKKworCWlmICghYml0YmFuZy0+bWFzdGVyLT5tb2RlX2JpdHMpCisJCWJpdGJhbmctPm1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IGJpdGJhbmctPmZsYWdzOworCisJaWYgKCFiaXRiYW5nLT5tYXN0ZXItPnRyYW5zZmVyKQorCQliaXRiYW5nLT5tYXN0ZXItPnRyYW5zZmVyID0gc3BpX2JpdGJhbmdfdHJhbnNmZXI7CisJaWYgKCFiaXRiYW5nLT50eHJ4X2J1ZnMpIHsKKwkJYml0YmFuZy0+dXNlX2RtYSA9IDA7CisJCWJpdGJhbmctPnR4cnhfYnVmcyA9IHNwaV9iaXRiYW5nX2J1ZnM7CisJCWlmICghYml0YmFuZy0+bWFzdGVyLT5zZXR1cCkgeworCQkJaWYgKCFiaXRiYW5nLT5zZXR1cF90cmFuc2ZlcikKKwkJCQliaXRiYW5nLT5zZXR1cF90cmFuc2ZlciA9CisJCQkJCSBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlcjsKKwkJCWJpdGJhbmctPm1hc3Rlci0+c2V0dXAgPSBzcGlfYml0YmFuZ19zZXR1cDsKKwkJCWJpdGJhbmctPm1hc3Rlci0+Y2xlYW51cCA9IHNwaV9iaXRiYW5nX2NsZWFudXA7CisJCX0KKwl9IGVsc2UgaWYgKCFiaXRiYW5nLT5tYXN0ZXItPnNldHVwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYml0YmFuZy0+bWFzdGVyLT50cmFuc2ZlciA9PSBzcGlfYml0YmFuZ190cmFuc2ZlciAmJgorCQkJIWJpdGJhbmctPnNldHVwX3RyYW5zZmVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHRoaXMgdGFzayBpcyB0aGUgb25seSB0aGluZyB0byB0b3VjaCB0aGUgU1BJIGJpdHMgKi8KKwliaXRiYW5nLT5idXN5ID0gMDsKKwliaXRiYW5nLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKKwkJCWRldl9uYW1lKGJpdGJhbmctPm1hc3Rlci0+ZGV2LnBhcmVudCkpOworCWlmIChiaXRiYW5nLT53b3JrcXVldWUgPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRUJVU1k7CisJCWdvdG8gZXJyMTsKKwl9CisKKwkvKiBkcml2ZXIgbWF5IGdldCBidXN5IGJlZm9yZSByZWdpc3RlcigpIHJldHVybnMsIGVzcGVjaWFsbHkKKwkgKiBpZiBzb21lb25lIHJlZ2lzdGVyZWQgYm9hcmRpbmZvIGZvciBkZXZpY2VzCisJICovCisJc3RhdHVzID0gc3BpX3JlZ2lzdGVyX21hc3RlcihiaXRiYW5nLT5tYXN0ZXIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycjI7CisKKwlyZXR1cm4gc3RhdHVzOworCitlcnIyOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGJpdGJhbmctPndvcmtxdWV1ZSk7CitlcnIxOgorCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGlfYml0YmFuZ19zdGFydCk7CisKKy8qKgorICogc3BpX2JpdGJhbmdfc3RvcCAtIHN0b3BzIHRoZSB0YXNrIHByb3ZpZGluZyBzcGkgY29tbXVuaWNhdGlvbgorICovCitpbnQgc3BpX2JpdGJhbmdfc3RvcChzdHJ1Y3Qgc3BpX2JpdGJhbmcgKmJpdGJhbmcpCit7CisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKGJpdGJhbmctPm1hc3Rlcik7CisKKwlXQVJOX09OKCFsaXN0X2VtcHR5KCZiaXRiYW5nLT5xdWV1ZSkpOworCisJZGVzdHJveV93b3JrcXVldWUoYml0YmFuZy0+d29ya3F1ZXVlKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2JpdGJhbmdfc3RvcCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJ1dHRlcmZseS5jIGIvZHJpdmVycy9zcGkvc3BpLWJ1dHRlcmZseS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTA3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktYnV0dGVyZmx5LmMKQEAgLTAsMCArMSwzNTYgQEAKKy8qCisgKiBwYXJwb3J0LXRvLWJ1dHRlcmZseSBhZGFwdGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKworLyoKKyAqIFRoaXMgdXNlcyBTUEkgdG8gdGFsayB3aXRoIGFuICJBVlIgQnV0dGVyZmx5Iiwgd2hpY2ggaXMgYSAkVVMyMCBjYXJkCisgKiB3aXRoIGEgYmF0dGVyeSBwb3dlcmVkIEFWUiBtaWNyb2NvbnRyb2xsZXIgYW5kIGxvdHMgb2YgZ29vZGllcy4gIFlvdQorICogY2FuIHVzZSBHQ0MgdG8gZGV2ZWxvcCBmaXJtd2FyZSBmb3IgdGhpcy4KKyAqCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9zcGkvYnV0dGVyZmx5IGZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gYnVpbGQKKyAqIGFuZCB1c2UgdGhpcyBjdXN0b20gcGFyYWxsZWwgcG9ydCBjYWJsZS4KKyAqLworCisKKy8qIERBVEEgb3V0cHV0IGJpdHMgKHBpbnMgMi4uOSA9PSBEMC4uRDcpICovCisjZGVmaW5lCWJ1dHRlcmZseV9ucmVzZXQgKDEgPDwgMSkJCS8qIHBpbiAzICovCisKKyNkZWZpbmUJc3BpX3Nja19iaXQJKDEgPDwgMCkJCS8qIHBpbiAyICovCisjZGVmaW5lCXNwaV9tb3NpX2JpdAkoMSA8PCA3KQkJLyogcGluIDkgKi8KKworI2RlZmluZQl2Y2NfYml0cwkoKDEgPDwgNikgfCAoMSA8PCA1KSkJLyogcGlucyA3LCA4ICovCisKKy8qIFNUQVRVUyBpbnB1dCBiaXRzICovCisjZGVmaW5lCXNwaV9taXNvX2JpdAlQQVJQT1JUX1NUQVRVU19CVVNZCS8qIHBpbiAxMSAqLworCisvKiBDT05UUk9MIG91dHB1dCBiaXRzICovCisjZGVmaW5lCXNwaV9jc19iaXQJUEFSUE9SVF9DT05UUk9MX1NFTEVDVAkvKiBwaW4gMTcgKi8KKworCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ1dHRlcmZseSAqc3BpZGV2X3RvX3BwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIHNwaS0+Y29udHJvbGxlcl9kYXRhOworfQorCisKK3N0cnVjdCBidXR0ZXJmbHkgeworCS8qIFJFVklTSVQgLi4uIGZvciBub3csIHRoaXMgbXVzdCBiZSBmaXJzdCAqLworCXN0cnVjdCBzcGlfYml0YmFuZwliaXRiYW5nOworCisJc3RydWN0IHBhcnBvcnQJCSpwb3J0OworCXN0cnVjdCBwYXJkZXZpY2UJKnBkOworCisJdTgJCQlsYXN0Ynl0ZTsKKworCXN0cnVjdCBzcGlfZGV2aWNlCSpkYXRhZmxhc2g7CisJc3RydWN0IHNwaV9kZXZpY2UJKmJ1dHRlcmZseTsKKwlzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8JaW5mb1syXTsKKworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRzY2soc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoreworCXN0cnVjdCBidXR0ZXJmbHkJKnBwID0gc3BpZGV2X3RvX3BwKHNwaSk7CisJdTgJCQliaXQsIGJ5dGUgPSBwcC0+bGFzdGJ5dGU7CisKKwliaXQgPSBzcGlfc2NrX2JpdDsKKworCWlmIChpc19vbikKKwkJYnl0ZSB8PSBiaXQ7CisJZWxzZQorCQlieXRlICY9IH5iaXQ7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBieXRlKTsKKwlwcC0+bGFzdGJ5dGUgPSBieXRlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldG1vc2koc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoreworCXN0cnVjdCBidXR0ZXJmbHkJKnBwID0gc3BpZGV2X3RvX3BwKHNwaSk7CisJdTgJCQliaXQsIGJ5dGUgPSBwcC0+bGFzdGJ5dGU7CisKKwliaXQgPSBzcGlfbW9zaV9iaXQ7CisKKwlpZiAoaXNfb24pCisJCWJ5dGUgfD0gYml0OworCWVsc2UKKwkJYnl0ZSAmPSB+Yml0OworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgYnl0ZSk7CisJcHAtPmxhc3RieXRlID0gYnl0ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0bWlzbyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBidXR0ZXJmbHkJKnBwID0gc3BpZGV2X3RvX3BwKHNwaSk7CisJaW50CQkJdmFsdWU7CisJdTgJCQliaXQ7CisKKwliaXQgPSBzcGlfbWlzb19iaXQ7CisKKwkvKiBvbmx5IFNUQVRVU19CVVNZIGlzIE5PVCBuZWdhdGVkICovCisJdmFsdWUgPSAhKHBhcnBvcnRfcmVhZF9zdGF0dXMocHAtPnBvcnQpICYgYml0KTsKKwlyZXR1cm4gKGJpdCA9PSBQQVJQT1JUX1NUQVRVU19CVVNZKSA/IHZhbHVlIDogIXZhbHVlOworfQorCitzdGF0aWMgdm9pZCBidXR0ZXJmbHlfY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGJ1dHRlcmZseQkqcHAgPSBzcGlkZXZfdG9fcHAoc3BpKTsKKworCS8qIHNldCBkZWZhdWx0IGNsb2NrIHBvbGFyaXR5ICovCisJaWYgKHZhbHVlICE9IEJJVEJBTkdfQ1NfSU5BQ1RJVkUpCisJCXNldHNjayhzcGksIHNwaS0+bW9kZSAmIFNQSV9DUE9MKTsKKworCS8qIGhlcmUsIHZhbHVlID09ICJhY3RpdmF0ZSBvciBub3QiOworCSAqIG1vc3QgUEFSUE9SVF9DT05UUk9MXyogYml0cyBhcmUgbmVnYXRlZCwgc28gd2UgbXVzdAorCSAqIG1vcnBoIGl0IHRvIHZhbHVlID09ICJiaXQgdmFsdWUgdG8gd3JpdGUgaW4gY29udHJvbCByZWdpc3RlciIKKwkgKi8KKwlpZiAoc3BpX2NzX2JpdCA9PSBQQVJQT1JUX0NPTlRST0xfSU5JVCkKKwkJdmFsdWUgPSAhdmFsdWU7CisKKwlwYXJwb3J0X2Zyb2JfY29udHJvbChwcC0+cG9ydCwgc3BpX2NzX2JpdCwgdmFsdWUgPyBzcGlfY3NfYml0IDogMCk7Cit9CisKKworLyogd2Ugb25seSBuZWVkZWQgdG8gaW1wbGVtZW50IG9uZSBtb2RlIGhlcmUsIGFuZCBjaG9vc2UgU1BJX01PREVfMCAqLworCisjZGVmaW5lCXNwaWRlbGF5KFgpCWRve313aGlsZSgwKQorLy8jZGVmaW5lCXNwaWRlbGF5CW5kZWxheQorCisjaW5jbHVkZSAic3BpLWJpdGJhbmctdHhyeC5oIgorCitzdGF0aWMgdTMyCitidXR0ZXJmbHlfdHhyeF93b3JkX21vZGUwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLAorCQl1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIDAsIHdvcmQsIGJpdHMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBvdmVycmlkZSBkZWZhdWx0IHBhcnRpdGlvbmluZyB3aXRoIGNtZGxpbmVwYXJ0ICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uc1tdID0geyB7CisJLyogSkZGUzIgd2FudHMgcGFydGl0aW9ucyBvZiA0Kk4gYmxvY2tzIGZvciB0aGlzIGRldmljZSwKKwkgKiBzbyBzZWN0b3JzIDAgYW5kIDEgY2FuJ3QgYmUgcGFydGl0aW9ucyBieSB0aGVtc2VsdmVzLgorCSAqLworCisJLyogc2VjdG9yIDAgPSA4IHBhZ2VzICogMjY0IGJ5dGVzL3BhZ2UgKDEgYmxvY2spCisJICogc2VjdG9yIDEgPSAyNDggcGFnZXMgKiAyNjQgYnl0ZXMvcGFnZQorCSAqLworCS5uYW1lCQk9ICJib29ra2VlcGluZyIsCS8vIDY2IEtCCisJLm9mZnNldAkJPSAwLAorCS5zaXplCQk9ICg4ICsgMjQ4KSAqIDI2NCwKKy8vCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwKK30sIHsKKwkvKiBzZWN0b3IgMiA9IDI1NiBwYWdlcyAqIDI2NCBieXRlcy9wYWdlCisJICogc2VjdG9ycyAzLTUgPSA1MTIgcGFnZXMgKiAyNjQgYnl0ZXMvcGFnZQorCSAqLworCS5uYW1lCQk9ICJmaWxlc3lzdGVtIiwJCS8vIDQ2MiBLQgorCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCit9IH07CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBmbGFzaCA9IHsKKwkubmFtZQkJPSAiYnV0dGVyZmxhc2giLAorCS5wYXJ0cwkJPSBwYXJ0aXRpb25zLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUocGFydGl0aW9ucyksCit9OworCisKKy8qIFJFVklTSVQgcmVtb3ZlIHRoaXMgdWdseSBnbG9iYWwgYW5kIGl0cyAib25seSBvbmUiIGxpbWl0YXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgYnV0dGVyZmx5ICpidXR0ZXJmbHk7CisKK3N0YXRpYyB2b2lkIGJ1dHRlcmZseV9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IHBhcmRldmljZQkqcGQ7CisJaW50CQkJc3RhdHVzOworCXN0cnVjdCBidXR0ZXJmbHkJKnBwOworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisJc3RydWN0IGRldmljZQkJKmRldiA9IHAtPnBoeXNwb3J0LT5kZXY7CisKKwlpZiAoYnV0dGVyZmx5IHx8ICFkZXYpCisJCXJldHVybjsKKworCS8qIFJFVklTSVQ6ICB0aGlzIGp1c3QgX2Fzc3VtZXNfIGEgYnV0dGVyZmx5IGlzIHRoZXJlIC4uLiBubyBwcm9iZSwKKwkgKiBhbmQgbm8gd2F5IHRvIGJlIHNlbGVjdGl2ZSBhYm91dCB3aGF0IGl0IGJpbmRzIHRvLgorCSAqLworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZiAqcHApOworCWlmICghbWFzdGVyKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisJcHAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwkvKgorCSAqIFNQSSBhbmQgYml0YmFuZyBob29rdXAKKwkgKgorCSAqIHVzZSBkZWZhdWx0IHNldHVwKCksIGNsZWFudXAoKSwgYW5kIHRyYW5zZmVyKCkgbWV0aG9kczsgYW5kCisJICogb25seSBib3RoZXIgaW1wbGVtZW50aW5nIG1vZGUgMC4gIFN0YXJ0IGl0IGxhdGVyLgorCSAqLworCW1hc3Rlci0+YnVzX251bSA9IDQyOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAyOworCisJcHAtPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKKwlwcC0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gYnV0dGVyZmx5X2NoaXBzZWxlY3Q7CisJcHAtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzBdID0gYnV0dGVyZmx5X3R4cnhfd29yZF9tb2RlMDsKKworCS8qCisJICogcGFycG9ydCBob29rdXAKKwkgKi8KKwlwcC0+cG9ydCA9IHA7CisJcGQgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwLCAic3BpX2J1dHRlcmZseSIsCisJCQlOVUxMLCBOVUxMLCBOVUxMLAorCQkJMCAvKiBGTEFHUyAqLywgcHApOworCWlmICghcGQpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBjbGVhbjA7CisJfQorCXBwLT5wZCA9IHBkOworCisJc3RhdHVzID0gcGFycG9ydF9jbGFpbShwZCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gY2xlYW4xOworCisJLyoKKwkgKiBCdXR0ZXJmbHkgcmVzZXQsIHBvd2VydXAsIHJ1biBmaXJtd2FyZQorCSAqLworCXByX2RlYnVnKCIlczogcG93ZXJ1cC9yZXNldCBCdXR0ZXJmbHlcbiIsIHAtPm5hbWUpOworCisJLyogbkNTIGZvciBkYXRhZmxhc2ggKHRoaXMgYml0IGlzIGludmVydGVkIG9uIG91dHB1dCkgKi8KKwlwYXJwb3J0X2Zyb2JfY29udHJvbChwcC0+cG9ydCwgc3BpX2NzX2JpdCwgMCk7CisKKwkvKiBzdGFiaWxpemUgcG93ZXIgd2l0aCBjaGlwIGluIHJlc2V0IChuUkVTRVQpLCBhbmQKKwkgKiBzcGlfc2NrX2JpdCBjbGVhciAoQ1BPTD0wKQorCSAqLworCXBwLT5sYXN0Ynl0ZSB8PSB2Y2NfYml0czsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIHBwLT5sYXN0Ynl0ZSk7CisJbXNsZWVwKDUpOworCisJLyogdGFrZSBpdCBvdXQgb2YgcmVzZXQ7IGFzc3VtZSBsb25nIHJlc2V0IGRlbGF5ICovCisJcHAtPmxhc3RieXRlIHw9IGJ1dHRlcmZseV9ucmVzZXQ7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBwcC0+bGFzdGJ5dGUpOworCW1zbGVlcCgxMDApOworCisKKwkvKgorCSAqIFN0YXJ0IFNQSSAuLi4gZm9yIG5vdywgaGlkZSB0aGF0IHdlJ3JlIHR3byBwaHlzaWNhbCBidXNzZXMuCisJICovCisJc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RhcnQoJnBwLT5iaXRiYW5nKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBjbGVhbjI7CisKKwkvKiBCdXMgMSBsZXRzIHVzIHRhbGsgdG8gYXQ0NWRiMDQxYiAoZmlybXdhcmUgZGlzYWJsZXMgQVZSIFNQSSksIEFWUgorCSAqIChmaXJtd2FyZSByZXNldHMgYXQ0NSwgYWN0cyBhcyBzcGkgc2xhdmUpIG9yIG5laXRoZXIgKHdlIGlnbm9yZQorCSAqIGJvdGgsIEFWUiB1c2VzIEFUNDUpLiAgSGVyZSB3ZSBleHBlY3QgZmlybXdhcmUgZm9yIHRoZSBmaXJzdCBvcHRpb24uCisJICovCisKKwlwcC0+aW5mb1swXS5tYXhfc3BlZWRfaHogPSAxNSAqIDEwMDAgKiAxMDAwOworCXN0cmNweShwcC0+aW5mb1swXS5tb2RhbGlhcywgIm10ZF9kYXRhZmxhc2giKTsKKwlwcC0+aW5mb1swXS5wbGF0Zm9ybV9kYXRhID0gJmZsYXNoOworCXBwLT5pbmZvWzBdLmNoaXBfc2VsZWN0ID0gMTsKKwlwcC0+aW5mb1swXS5jb250cm9sbGVyX2RhdGEgPSBwcDsKKwlwcC0+ZGF0YWZsYXNoID0gc3BpX25ld19kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLCAmcHAtPmluZm9bMF0pOworCWlmIChwcC0+ZGF0YWZsYXNoKQorCQlwcl9kZWJ1ZygiJXM6IGRhdGFmbGFzaCBhdCAlc1xuIiwgcC0+bmFtZSwKKwkJCQlkZXZfbmFtZSgmcHAtPmRhdGFmbGFzaC0+ZGV2KSk7CisKKwkvLyBkZXZfaW5mbyhfd2hhdD9fLCAuLi4pCisJcHJfaW5mbygiJXM6IEFWUiBCdXR0ZXJmbHlcbiIsIHAtPm5hbWUpOworCWJ1dHRlcmZseSA9IHBwOworCXJldHVybjsKKworY2xlYW4yOgorCS8qIHR1cm4gb2ZmIFZDQyAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgMCk7CisKKwlwYXJwb3J0X3JlbGVhc2UocHAtPnBkKTsKK2NsZWFuMToKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBkKTsKK2NsZWFuMDoKKwkodm9pZCkgc3BpX21hc3Rlcl9wdXQocHAtPmJpdGJhbmcubWFzdGVyKTsKK2RvbmU6CisJcHJfZGVidWcoIiVzOiBidXR0ZXJmbHkgcHJvYmUsIGZhaWwgJWRcbiIsIHAtPm5hbWUsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1dHRlcmZseV9kZXRhY2goc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IGJ1dHRlcmZseQkqcHA7CisJaW50CQkJc3RhdHVzOworCisJLyogRklYTUUgdGhpcyBnbG9iYWwgaXMgdWdseSAuLi4gYnV0LCBob3cgdG8gcXVpY2tseSBnZXQgZnJvbQorCSAqIHRoZSBwYXJwb3J0IHRvIHRoZSAic3RydWN0IGJ1dHRlcmZseSIgYXNzb2NpYXRlZCB3aXRoIGl0PworCSAqICJvbGQgc2Nob29sIiBkcml2ZXItaW50ZXJuYWwgZGV2aWNlIGxpc3RzPworCSAqLworCWlmICghYnV0dGVyZmx5IHx8IGJ1dHRlcmZseS0+cG9ydCAhPSBwKQorCQlyZXR1cm47CisJcHAgPSBidXR0ZXJmbHk7CisJYnV0dGVyZmx5ID0gTlVMTDsKKworCS8qIHN0b3AoKSB1bnJlZ2lzdGVycyBjaGlsZCBkZXZpY2VzIHRvbyAqLworCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3N0b3AoJnBwLT5iaXRiYW5nKTsKKworCS8qIHR1cm4gb2ZmIFZDQyAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgMCk7CisJbXNsZWVwKDEwKTsKKworCXBhcnBvcnRfcmVsZWFzZShwcC0+cGQpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHAtPnBkKTsKKworCSh2b2lkKSBzcGlfbWFzdGVyX3B1dChwcC0+Yml0YmFuZy5tYXN0ZXIpOworfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIGJ1dHRlcmZseV9kcml2ZXIgPSB7CisJLm5hbWUgPQkJInNwaV9idXR0ZXJmbHkiLAorCS5hdHRhY2ggPQlidXR0ZXJmbHlfYXR0YWNoLAorCS5kZXRhY2ggPQlidXR0ZXJmbHlfZGV0YWNoLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBidXR0ZXJmbHlfaW5pdCh2b2lkKQoreworCXJldHVybiBwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlcigmYnV0dGVyZmx5X2RyaXZlcik7Cit9CitkZXZpY2VfaW5pdGNhbGwoYnV0dGVyZmx5X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYnV0dGVyZmx5X2V4aXQodm9pZCkKK3sKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZidXR0ZXJmbHlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGJ1dHRlcmZseV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJQYXJwb3J0IEFkYXB0ZXIgZHJpdmVyIGZvciBBVlIgQnV0dGVyZmx5Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9jb2xkZmlyZV9xc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktY29sZGZpcmUtcXNwaS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3NwaS9jb2xkZmlyZV9xc3BpLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3BpL3NwaS1jb2xkZmlyZS1xc3BpLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL2RhdmluY2lfc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktZGF2aW5jaS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3NwaS9kYXZpbmNpX3NwaS5jCnJlbmFtZSB0byBkcml2ZXJzL3NwaS9zcGktZGF2aW5jaS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZHctbWlkLmMgYi9kcml2ZXJzL3NwaS9zcGktZHctbWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwZTU1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kdy1taWQuYwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIFNwZWNpYWwgaGFuZGxpbmcgZm9yIERXIGNvcmUgb24gSW50ZWwgTUlEIHBsYXRmb3JtCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICJzcGktZHcuaCIKKworI2lmZGVmIENPTkZJR19TUElfRFdfTUlEX0RNQQorI2luY2x1ZGUgPGxpbnV4L2ludGVsX21pZF9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworc3RydWN0IG1pZF9kbWEgeworCXN0cnVjdCBpbnRlbF9taWRfZG1hX3NsYXZlCWRtYXNfdHg7CisJc3RydWN0IGludGVsX21pZF9kbWFfc2xhdmUJZG1hc19yeDsKK307CisKK3N0YXRpYyBib29sIG1pZF9zcGlfZG1hX2NoYW5fZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGR3X3NwaSAqZHdzID0gcGFyYW07CisKKwlyZXR1cm4gZHdzLT5kbWFjICYmICgmZHdzLT5kbWFjLT5kZXYgPT0gY2hhbi0+ZGV2aWNlLT5kZXYpOworfQorCitzdGF0aWMgaW50IG1pZF9zcGlfZG1hX2luaXQoc3RydWN0IGR3X3NwaSAqZHdzKQoreworCXN0cnVjdCBtaWRfZG1hICpkd19kbWEgPSBkd3MtPmRtYV9wcml2OworCXN0cnVjdCBpbnRlbF9taWRfZG1hX3NsYXZlICpyeHMsICp0eHM7CisJZG1hX2NhcF9tYXNrX3QgbWFzazsKKworCS8qCisJICogR2V0IHBjaSBkZXZpY2UgZm9yIERNQSBjb250cm9sbGVyLCBjdXJyZW50bHkgaXQgY291bGQgb25seQorCSAqIGJlIHRoZSBETUEgY29udHJvbGxlciBvZiBlaXRoZXIgTW9vcmVzdG93biBvciBNZWRmaWVsZAorCSAqLworCWR3cy0+ZG1hYyA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDgxMywgTlVMTCk7CisJaWYgKCFkd3MtPmRtYWMpCisJCWR3cy0+ZG1hYyA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDgyNywgTlVMTCk7CisKKwlkbWFfY2FwX3plcm8obWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKKworCS8qIDEuIEluaXQgcnggY2hhbm5lbCAqLworCWR3cy0+cnhjaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBtaWRfc3BpX2RtYV9jaGFuX2ZpbHRlciwgZHdzKTsKKwlpZiAoIWR3cy0+cnhjaGFuKQorCQlnb3RvIGVycl9leGl0OworCXJ4cyA9ICZkd19kbWEtPmRtYXNfcng7CisJcnhzLT5oc19tb2RlID0gTE5XX0RNQV9IV19IUzsKKwlyeHMtPmNmZ19tb2RlID0gTE5XX0RNQV9QRVJfVE9fTUVNOworCWR3cy0+cnhjaGFuLT5wcml2YXRlID0gcnhzOworCisJLyogMi4gSW5pdCB0eCBjaGFubmVsICovCisJZHdzLT50eGNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIG1pZF9zcGlfZG1hX2NoYW5fZmlsdGVyLCBkd3MpOworCWlmICghZHdzLT50eGNoYW4pCisJCWdvdG8gZnJlZV9yeGNoYW47CisJdHhzID0gJmR3X2RtYS0+ZG1hc190eDsKKwl0eHMtPmhzX21vZGUgPSBMTldfRE1BX0hXX0hTOworCXR4cy0+Y2ZnX21vZGUgPSBMTldfRE1BX01FTV9UT19QRVI7CisJZHdzLT50eGNoYW4tPnByaXZhdGUgPSB0eHM7CisKKwlkd3MtPmRtYV9pbml0ZWQgPSAxOworCXJldHVybiAwOworCitmcmVlX3J4Y2hhbjoKKwlkbWFfcmVsZWFzZV9jaGFubmVsKGR3cy0+cnhjaGFuKTsKK2Vycl9leGl0OgorCXJldHVybiAtMTsKKworfQorCitzdGF0aWMgdm9pZCBtaWRfc3BpX2RtYV9leGl0KHN0cnVjdCBkd19zcGkgKmR3cykKK3sKKwlkbWFfcmVsZWFzZV9jaGFubmVsKGR3cy0+dHhjaGFuKTsKKwlkbWFfcmVsZWFzZV9jaGFubmVsKGR3cy0+cnhjaGFuKTsKK30KKworLyoKKyAqIGR3cy0+ZG1hX2NoYW5fZG9uZSBpcyBjbGVhcmVkIGJlZm9yZSB0aGUgZG1hIHRyYW5zZmVyIHN0YXJ0cywKKyAqIGNhbGxiYWNrIGZvciByeC90eCBjaGFubmVsIHdpbGwgZWFjaCBpbmNyZW1lbnQgaXQgYnkgMS4KKyAqIFJlYWNoaW5nIDIgbWVhbnMgdGhlIHdob2xlIHNwaSB0cmFuc2FjdGlvbiBpcyBkb25lLgorICovCitzdGF0aWMgdm9pZCBkd19zcGlfZG1hX2RvbmUodm9pZCAqYXJnKQoreworCXN0cnVjdCBkd19zcGkgKmR3cyA9IGFyZzsKKworCWlmICgrK2R3cy0+ZG1hX2NoYW5fZG9uZSAhPSAyKQorCQlyZXR1cm47CisJZHdfc3BpX3hmZXJfZG9uZShkd3MpOworfQorCitzdGF0aWMgaW50IG1pZF9zcGlfZG1hX3RyYW5zZmVyKHN0cnVjdCBkd19zcGkgKmR3cywgaW50IGNzX2NoYW5nZSkKK3sKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ZGVzYyA9IE5VTEwsICpyeGRlc2MgPSBOVUxMOworCXN0cnVjdCBkbWFfY2hhbiAqdHhjaGFuLCAqcnhjaGFuOworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIHR4Y29uZiwgcnhjb25mOworCXUxNiBkbWFfY3RybCA9IDA7CisKKwkvKiAxLiBzZXR1cCBETUEgcmVsYXRlZCByZWdpc3RlcnMgKi8KKwlpZiAoY3NfY2hhbmdlKSB7CisJCXNwaV9lbmFibGVfY2hpcChkd3MsIDApOworCQlkd193cml0ZXcoZHdzLCBkbWFyZGxyLCAweGYpOworCQlkd193cml0ZXcoZHdzLCBkbWF0ZGxyLCAweDEwKTsKKwkJaWYgKGR3cy0+dHhfZG1hKQorCQkJZG1hX2N0cmwgfD0gMHgyOworCQlpZiAoZHdzLT5yeF9kbWEpCisJCQlkbWFfY3RybCB8PSAweDE7CisJCWR3X3dyaXRldyhkd3MsIGRtYWNyLCBkbWFfY3RybCk7CisJCXNwaV9lbmFibGVfY2hpcChkd3MsIDEpOworCX0KKworCWR3cy0+ZG1hX2NoYW5fZG9uZSA9IDA7CisJdHhjaGFuID0gZHdzLT50eGNoYW47CisJcnhjaGFuID0gZHdzLT5yeGNoYW47CisKKwkvKiAyLiBQcmVwYXJlIHRoZSBUWCBkbWEgdHJhbnNmZXIgKi8KKwl0eGNvbmYuZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKwl0eGNvbmYuZHN0X2FkZHIgPSBkd3MtPmRtYV9hZGRyOworCXR4Y29uZi5kc3RfbWF4YnVyc3QgPSBMTldfRE1BX01TSVpFXzE2OworCXR4Y29uZi5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOworCXR4Y29uZi5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOworCisJdHhjaGFuLT5kZXZpY2UtPmRldmljZV9jb250cm9sKHR4Y2hhbiwgRE1BX1NMQVZFX0NPTkZJRywKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpICZ0eGNvbmYpOworCisJbWVtc2V0KCZkd3MtPnR4X3NnbCwgMCwgc2l6ZW9mKGR3cy0+dHhfc2dsKSk7CisJZHdzLT50eF9zZ2wuZG1hX2FkZHJlc3MgPSBkd3MtPnR4X2RtYTsKKwlkd3MtPnR4X3NnbC5sZW5ndGggPSBkd3MtPmxlbjsKKworCXR4ZGVzYyA9IHR4Y2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyh0eGNoYW4sCisJCQkJJmR3cy0+dHhfc2dsLAorCQkJCTEsCisJCQkJRE1BX1RPX0RFVklDRSwKKwkJCQlETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ09NUExfU0tJUF9ERVNUX1VOTUFQKTsKKwl0eGRlc2MtPmNhbGxiYWNrID0gZHdfc3BpX2RtYV9kb25lOworCXR4ZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBkd3M7CisKKwkvKiAzLiBQcmVwYXJlIHRoZSBSWCBkbWEgdHJhbnNmZXIgKi8KKwlyeGNvbmYuZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCXJ4Y29uZi5zcmNfYWRkciA9IGR3cy0+ZG1hX2FkZHI7CisJcnhjb25mLnNyY19tYXhidXJzdCA9IExOV19ETUFfTVNJWkVfMTY7CisJcnhjb25mLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7CisJcnhjb25mLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM7CisKKwlyeGNoYW4tPmRldmljZS0+ZGV2aWNlX2NvbnRyb2wocnhjaGFuLCBETUFfU0xBVkVfQ09ORklHLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZykgJnJ4Y29uZik7CisKKwltZW1zZXQoJmR3cy0+cnhfc2dsLCAwLCBzaXplb2YoZHdzLT5yeF9zZ2wpKTsKKwlkd3MtPnJ4X3NnbC5kbWFfYWRkcmVzcyA9IGR3cy0+cnhfZG1hOworCWR3cy0+cnhfc2dsLmxlbmd0aCA9IGR3cy0+bGVuOworCisJcnhkZXNjID0gcnhjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKHJ4Y2hhbiwKKwkJCQkmZHdzLT5yeF9zZ2wsCisJCQkJMSwKKwkJCQlETUFfRlJPTV9ERVZJQ0UsCisJCQkJRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NPTVBMX1NLSVBfREVTVF9VTk1BUCk7CisJcnhkZXNjLT5jYWxsYmFjayA9IGR3X3NwaV9kbWFfZG9uZTsKKwlyeGRlc2MtPmNhbGxiYWNrX3BhcmFtID0gZHdzOworCisJLyogcnggbXVzdCBiZSBzdGFydGVkIGJlZm9yZSB0eCBkdWUgdG8gc3BpIGluc3RpbmN0ICovCisJcnhkZXNjLT50eF9zdWJtaXQocnhkZXNjKTsKKwl0eGRlc2MtPnR4X3N1Ym1pdCh0eGRlc2MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGR3X3NwaV9kbWFfb3BzIG1pZF9kbWFfb3BzID0geworCS5kbWFfaW5pdAk9IG1pZF9zcGlfZG1hX2luaXQsCisJLmRtYV9leGl0CT0gbWlkX3NwaV9kbWFfZXhpdCwKKwkuZG1hX3RyYW5zZmVyCT0gbWlkX3NwaV9kbWFfdHJhbnNmZXIsCit9OworI2VuZGlmCisKKy8qIFNvbWUgc3BlY2lmaWMgaW5mbyBmb3IgU1BJMCBjb250cm9sbGVyIG9uIE1vb3Jlc3Rvd24gKi8KKworLyogSFcgaW5mbyBmb3IgTVJTVCBDTGsgQ29udHJvbCBVbml0LCBvbmUgMzJiIHJlZyAqLworI2RlZmluZSBNUlNUX1NQSV9DTEtfQkFTRQkxMDAwMDAwMDAJLyogMTAwbSAqLworI2RlZmluZSBNUlNUX0NMS19TUEkwX1JFRwkweGZmMTFkODZjCisjZGVmaW5lIENMS19TUElfQkRJVl9PRkZTRVQJMAorI2RlZmluZSBDTEtfU1BJX0JESVZfTUFTSwkweDAwMDAwMDA3CisjZGVmaW5lIENMS19TUElfQ0RJVl9PRkZTRVQJOQorI2RlZmluZSBDTEtfU1BJX0NESVZfTUFTSwkweDAwMDAwZTAwCisjZGVmaW5lIENMS19TUElfRElTQUJMRV9PRkZTRVQJOAorCitpbnQgZHdfc3BpX21pZF9pbml0KHN0cnVjdCBkd19zcGkgKmR3cykKK3sKKwl1MzIgKmNsa19yZWcsIGNsa19jZGl2OworCisJY2xrX3JlZyA9IGlvcmVtYXBfbm9jYWNoZShNUlNUX0NMS19TUEkwX1JFRywgMTYpOworCWlmICghY2xrX3JlZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBnZXQgU1BJIGNvbnRyb2xsZXIgb3BlcmF0aW5nIGZyZXEgaW5mbyAqLworCWNsa19jZGl2ICA9IChyZWFkbChjbGtfcmVnKSAmIENMS19TUElfQ0RJVl9NQVNLKSA+PiBDTEtfU1BJX0NESVZfT0ZGU0VUOworCWR3cy0+bWF4X2ZyZXEgPSBNUlNUX1NQSV9DTEtfQkFTRSAvIChjbGtfY2RpdiArIDEpOworCWlvdW5tYXAoY2xrX3JlZyk7CisKKwlkd3MtPm51bV9jcyA9IDE2OworCWR3cy0+Zmlmb19sZW4gPSA0MDsJLyogRklGTyBoYXMgNDAgd29yZHMgYnVmZmVyICovCisKKyNpZmRlZiBDT05GSUdfU1BJX0RXX01JRF9ETUEKKwlkd3MtPmRtYV9wcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1pZF9kbWEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWR3cy0+ZG1hX3ByaXYpCisJCXJldHVybiAtRU5PTUVNOworCWR3cy0+ZG1hX29wcyA9ICZtaWRfZG1hX29wczsKKyNlbmRpZgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWR3LW1taW8uYyBiL2RyaXZlcnMvc3BpL3NwaS1kdy1tbWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlYjY2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kdy1tbWlvLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBNZW1vcnktbWFwcGVkIGludGVyZmFjZSBkcml2ZXIgZm9yIERXIFNQSSBDb3JlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBPY3Rhc2ljIHNlbWljb25kdWN0b3IuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisKKyNpbmNsdWRlICJzcGktZHcuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRSAiZHdfc3BpX21taW8iCisKK3N0cnVjdCBkd19zcGlfbW1pbyB7CisJc3RydWN0IGR3X3NwaSAgZHdzOworCXN0cnVjdCBjbGsgICAgICpjbGs7Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkd19zcGlfbW1pb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkd19zcGlfbW1pbyAqZHdzbW1pbzsKKwlzdHJ1Y3QgZHdfc3BpICpkd3M7CisJc3RydWN0IHJlc291cmNlICptZW0sICppb2FyZWE7CisJaW50IHJldDsKKworCWR3c21taW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHdfc3BpX21taW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWR3c21taW8pIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZW5kOworCX0KKworCWR3cyA9ICZkd3NtbWlvLT5kd3M7CisKKwkvKiBHZXQgYmFzaWMgaW8gcmVzb3VyY2UgYW5kIG1hcCBpdCAqLworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFtZW0pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gbWVtIHJlc291cmNlP1xuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2tmcmVlOworCX0KKworCWlvYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSksCisJCQlwZGV2LT5uYW1lKTsKKwlpZiAoIWlvYXJlYSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJTUEkgcmVnaW9uIGFscmVhZHkgY2xhaW1lZFxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfa2ZyZWU7CisJfQorCisJZHdzLT5yZWdzID0gaW9yZW1hcF9ub2NhY2hlKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CisJaWYgKCFkd3MtPnJlZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiU1BJIHJlZ2lvbiBhbHJlYWR5IG1hcHBlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnOworCX0KKworCWR3cy0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoZHdzLT5pcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSByZXNvdXJjZT9cbiIpOworCQlyZXQgPSBkd3MtPmlycTsgLyogLUVOWElPICovCisJCWdvdG8gZXJyX3VubWFwOworCX0KKworCWR3c21taW8tPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihkd3NtbWlvLT5jbGspKSB7CisJCXJldCA9IFBUUl9FUlIoZHdzbW1pby0+Y2xrKTsKKwkJZ290byBlcnJfaXJxOworCX0KKwljbGtfZW5hYmxlKGR3c21taW8tPmNsayk7CisKKwlkd3MtPnBhcmVudF9kZXYgPSAmcGRldi0+ZGV2OworCWR3cy0+YnVzX251bSA9IDA7CisJZHdzLT5udW1fY3MgPSA0OworCWR3cy0+bWF4X2ZyZXEgPSBjbGtfZ2V0X3JhdGUoZHdzbW1pby0+Y2xrKTsKKworCXJldCA9IGR3X3NwaV9hZGRfaG9zdChkd3MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2NsazsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGR3c21taW8pOworCXJldHVybiAwOworCitlcnJfY2xrOgorCWNsa19kaXNhYmxlKGR3c21taW8tPmNsayk7CisJY2xrX3B1dChkd3NtbWlvLT5jbGspOworCWR3c21taW8tPmNsayA9IE5VTEw7CitlcnJfaXJxOgorCWZyZWVfaXJxKGR3cy0+aXJxLCBkd3MpOworZXJyX3VubWFwOgorCWlvdW5tYXAoZHdzLT5yZWdzKTsKK2Vycl9yZWxlYXNlX3JlZzoKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKK2Vycl9rZnJlZToKKwlrZnJlZShkd3NtbWlvKTsKK2Vycl9lbmQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZHdfc3BpX21taW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGR3X3NwaV9tbWlvICpkd3NtbWlvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJlc291cmNlICptZW07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWNsa19kaXNhYmxlKGR3c21taW8tPmNsayk7CisJY2xrX3B1dChkd3NtbWlvLT5jbGspOworCWR3c21taW8tPmNsayA9IE5VTEw7CisKKwlmcmVlX2lycShkd3NtbWlvLT5kd3MuaXJxLCAmZHdzbW1pby0+ZHdzKTsKKwlkd19zcGlfcmVtb3ZlX2hvc3QoJmR3c21taW8tPmR3cyk7CisJaW91bm1hcChkd3NtbWlvLT5kd3MucmVncyk7CisJa2ZyZWUoZHdzbW1pbyk7CisKKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkd19zcGlfbW1pb19kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkd19zcGlfbW1pb19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IERSSVZFUl9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHdfc3BpX21taW9faW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmR3X3NwaV9tbWlvX2RyaXZlciwgZHdfc3BpX21taW9fcHJvYmUpOworfQorbW9kdWxlX2luaXQoZHdfc3BpX21taW9faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkd19zcGlfbW1pb19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmR3X3NwaV9tbWlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkd19zcGlfbW1pb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSmVhbi1IdWd1ZXMgRGVzY2hlbmVzIDxqZWFuLWh1Z3Vlcy5kZXNjaGVuZXNAb2N0YXNpYy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lbW9yeS1tYXBwZWQgSS9PIGludGVyZmFjZSBkcml2ZXIgZm9yIERXIFNQSSBDb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZHctcGNpLmMgYi9kcml2ZXJzL3NwaS9zcGktZHctcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmMzdmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kdy1wY2kuYwpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIFBDSSBpbnRlcmZhY2UgZHJpdmVyIGZvciBEVyBTUEkgQ29yZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgInNwaS1kdy5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FICJkd19zcGlfcGNpIgorCitzdHJ1Y3QgZHdfc3BpX3BjaSB7CisJc3RydWN0IHBjaV9kZXYJKnBkZXY7CisJc3RydWN0IGR3X3NwaQlkd3M7Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzcGlfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGR3X3NwaV9wY2kgKmR3cGNpOworCXN0cnVjdCBkd19zcGkgKmR3czsKKwlpbnQgcGNpX2JhciA9IDA7CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX0lORk8gIkRXOiBmb3VuZCBQQ0kgU1BJIGNvbnRyb2xsZXIoSUQ6ICUwNHg6JTA0eClcbiIsCisJCXBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlKTsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkd3BjaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkd19zcGlfcGNpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkd3BjaSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kaXNhYmxlOworCX0KKworCWR3cGNpLT5wZGV2ID0gcGRldjsKKwlkd3MgPSAmZHdwY2ktPmR3czsKKworCS8qIEdldCBiYXNpYyBpbyByZXNvdXJjZSBhbmQgbWFwIGl0ICovCisJZHdzLT5wYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBwY2lfYmFyKTsKKwlkd3MtPmlvbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBwY2lfYmFyKTsKKworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCBwY2lfYmFyLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfa2ZyZWU7CisKKwlkd3MtPnJlZ3MgPSBpb3JlbWFwX25vY2FjaGUoKHVuc2lnbmVkIGxvbmcpZHdzLT5wYWRkciwKKwkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIHBjaV9iYXIpKTsKKwlpZiAoIWR3cy0+cmVncykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9yZWxlYXNlX3JlZzsKKwl9CisKKwlkd3MtPnBhcmVudF9kZXYgPSAmcGRldi0+ZGV2OworCWR3cy0+YnVzX251bSA9IDA7CisJZHdzLT5udW1fY3MgPSA0OworCWR3cy0+aXJxID0gcGRldi0+aXJxOworCisJLyoKKwkgKiBTcGVjaWZpYyBoYW5kbGluZyBmb3IgSW50ZWwgTUlEIHBhbHRmb3JtcywgbGlrZSBkbWEgc2V0dXAsCisJICogY2xvY2sgcmF0ZSwgRklGTyBkZXB0aC4KKwkgKi8KKwlpZiAocGRldi0+ZGV2aWNlID09IDB4MDgwMCkgeworCQlyZXQgPSBkd19zcGlfbWlkX2luaXQoZHdzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3VubWFwOworCX0KKworCXJldCA9IGR3X3NwaV9hZGRfaG9zdChkd3MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VubWFwOworCisJLyogUENJIGhvb2sgYW5kIFNQSSBob29rIHVzZSB0aGUgc2FtZSBkcnYgZGF0YSAqLworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkd3BjaSk7CisJcmV0dXJuIDA7CisKK2Vycl91bm1hcDoKKwlpb3VubWFwKGR3cy0+cmVncyk7CitlcnJfcmVsZWFzZV9yZWc6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIHBjaV9iYXIpOworZXJyX2tmcmVlOgorCWtmcmVlKGR3cGNpKTsKK2Vycl9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc3BpX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGR3X3NwaV9wY2kgKmR3cGNpID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWR3X3NwaV9yZW1vdmVfaG9zdCgmZHdwY2ktPmR3cyk7CisJaW91bm1hcChkd3BjaS0+ZHdzLnJlZ3MpOworCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKKwlrZnJlZShkd3BjaSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHNwaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGR3X3NwaV9wY2kgKmR3cGNpID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBkd19zcGlfc3VzcGVuZF9ob3N0KCZkd3BjaS0+ZHdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNwaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGR3X3NwaV9wY2kgKmR3cGNpID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gZHdfc3BpX3Jlc3VtZV9ob3N0KCZkd3BjaS0+ZHdzKTsKK30KKyNlbHNlCisjZGVmaW5lIHNwaV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgc3BpX3Jlc3VtZQlOVUxMCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV9pZHNbXSBfX2RldmluaXRkYXRhID0geworCS8qIEludGVsIE1JRCBwbGF0Zm9ybSBTUEkgY29udHJvbGxlciAwICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDgwMCkgfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkd19zcGlfZHJpdmVyID0geworCS5uYW1lID0JCURSSVZFUl9OQU1FLAorCS5pZF90YWJsZSA9CXBjaV9pZHMsCisJLnByb2JlID0Jc3BpX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0JX19kZXZleGl0X3Aoc3BpX3BjaV9yZW1vdmUpLAorCS5zdXNwZW5kID0Jc3BpX3N1c3BlbmQsCisJLnJlc3VtZQk9CXNwaV9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtcnN0X3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmR3X3NwaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXJzdF9zcGlfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHdfc3BpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1yc3Rfc3BpX2luaXQpOworbW9kdWxlX2V4aXQobXJzdF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkZlbmcgVGFuZyA8ZmVuZy50YW5nQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGludGVyZmFjZSBkcml2ZXIgZm9yIERXIFNQSSBDb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZHcuYyBiL2RyaXZlcnMvc3BpL3NwaS1kdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1N2NkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktZHcuYwpAQCAtMCwwICsxLDkzOCBAQAorLyoKKyAqIERlc2lnbndhcmUgU1BJIGNvcmUgY29udHJvbGxlciBkcml2ZXIgKHJlZmVyIHB4YTJ4eF9zcGkuYykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgInNwaS1kdy5oIgorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2VuZGlmCisKKyNkZWZpbmUgU1RBUlRfU1RBVEUJKCh2b2lkICopMCkKKyNkZWZpbmUgUlVOTklOR19TVEFURQkoKHZvaWQgKikxKQorI2RlZmluZSBET05FX1NUQVRFCSgodm9pZCAqKTIpCisjZGVmaW5lIEVSUk9SX1NUQVRFCSgodm9pZCAqKS0xKQorCisjZGVmaW5lIFFVRVVFX1JVTk5JTkcJMAorI2RlZmluZSBRVUVVRV9TVE9QUEVECTEKKworI2RlZmluZSBNUlNUX1NQSV9ERUFTU0VSVAkwCisjZGVmaW5lIE1SU1RfU1BJX0FTU0VSVAkJMQorCisvKiBTbGF2ZSBzcGlfZGV2IHJlbGF0ZWQgKi8KK3N0cnVjdCBjaGlwX2RhdGEgeworCXUxNiBjcjA7CisJdTggY3M7CQkJLyogY2hpcCBzZWxlY3QgcGluICovCisJdTggbl9ieXRlczsJCS8qIGN1cnJlbnQgaXMgYSAxLzIvNCBieXRlIG9wICovCisJdTggdG1vZGU7CQkvKiBUUi9UTy9STy9FRVBST00gKi8KKwl1OCB0eXBlOwkJLyogU1BJL1NTUC9NaWNyb1dpcmUgKi8KKworCXU4IHBvbGxfbW9kZTsJCS8qIDEgbWVhbnMgdXNlIHBvbGwgbW9kZSAqLworCisJdTMyIGRtYV93aWR0aDsKKwl1MzIgcnhfdGhyZXNob2xkOworCXUzMiB0eF90aHJlc2hvbGQ7CisJdTggZW5hYmxlX2RtYTsKKwl1OCBiaXRzX3Blcl93b3JkOworCXUxNiBjbGtfZGl2OwkJLyogYmF1ZCByYXRlIGRpdmlkZXIgKi8KKwl1MzIgc3BlZWRfaHo7CQkvKiBiYXVkIHJhdGUgKi8KKwl2b2lkICgqY3NfY29udHJvbCkodTMyIGNvbW1hbmQpOworfTsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIGludCBzcGlfc2hvd19yZWdzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBTUElfUkVHU19CVUZTSVpFCTEwMjQKK3N0YXRpYyBzc2l6ZV90ICBzcGlfc2hvd19yZWdzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGR3X3NwaSAqZHdzOworCWNoYXIgKmJ1ZjsKKwl1MzIgbGVuID0gMDsKKwlzc2l6ZV90IHJldDsKKworCWR3cyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWJ1ZiA9IGt6YWxsb2MoU1BJX1JFR1NfQlVGU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAwOworCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKKwkJCSJNUlNUIFNQSTAgcmVnaXN0ZXJzOlxuIik7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKKwkJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCisJCQkiQ1RSTDA6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgY3RybDApKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAorCQkJIkNUUkwxOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIGN0cmwxKSk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKKwkJCSJTU0lFTlI6IFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIHNzaWVucikpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCisJCQkiU0VSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIHNlcikpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCisJCQkiQkFVRFI6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgYmF1ZHIpKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAorCQkJIlRYRlRMUjogXHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgdHhmbHRyKSk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKKwkJCSJSWEZUTFI6IFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIHJ4Zmx0cikpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCisJCQkiVFhGTFI6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgdHhmbHIpKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAorCQkJIlJYRkxSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIHJ4ZmxyKSk7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKKwkJCSJTUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBzcikpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCisJCQkiSU1SOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIGltcikpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCisJCQkiSVNSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIGlzcikpOworCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCisJCQkiRE1BQ1I6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgZG1hY3IpKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAorCQkJIkRNQVRETFI6IFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIGRtYXRkbHIpKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAorCQkJIkRNQVJETFI6IFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIGRtYXJkbHIpKTsKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAorCQkJIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisKKwlyZXQgPSAgc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtcnN0X3NwaV9yZWdzX29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gc3BpX3Nob3dfcmVnc19vcGVuLAorCS5yZWFkCQk9IHNwaV9zaG93X3JlZ3MsCisJLmxsc2VlawkJPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBpbnQgbXJzdF9zcGlfZGVidWdmc19pbml0KHN0cnVjdCBkd19zcGkgKmR3cykKK3sKKwlkd3MtPmRlYnVnZnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIm1yc3Rfc3BpIiwgTlVMTCk7CisJaWYgKCFkd3MtPmRlYnVnZnMpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXJzIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCWR3cy0+ZGVidWdmcywgKHZvaWQgKilkd3MsICZtcnN0X3NwaV9yZWdzX29wcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1yc3Rfc3BpX2RlYnVnZnNfcmVtb3ZlKHN0cnVjdCBkd19zcGkgKmR3cykKK3sKKwlpZiAoZHdzLT5kZWJ1Z2ZzKQorCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZHdzLT5kZWJ1Z2ZzKTsKK30KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG1yc3Rfc3BpX2RlYnVnZnNfaW5pdChzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcnN0X3NwaV9kZWJ1Z2ZzX3JlbW92ZShzdHJ1Y3QgZHdfc3BpICpkd3MpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0RFQlVHX0ZTICovCisKKy8qIFJldHVybiB0aGUgbWF4IGVudHJpZXMgd2UgY2FuIGZpbGwgaW50byB0eCBmaWZvICovCitzdGF0aWMgaW5saW5lIHUzMiB0eF9tYXgoc3RydWN0IGR3X3NwaSAqZHdzKQoreworCXUzMiB0eF9sZWZ0LCB0eF9yb29tLCByeHR4X2dhcDsKKworCXR4X2xlZnQgPSAoZHdzLT50eF9lbmQgLSBkd3MtPnR4KSAvIGR3cy0+bl9ieXRlczsKKwl0eF9yb29tID0gZHdzLT5maWZvX2xlbiAtIGR3X3JlYWR3KGR3cywgdHhmbHIpOworCisJLyoKKwkgKiBBbm90aGVyIGNvbmNlcm4gaXMgYWJvdXQgdGhlIHR4L3J4IG1pc21hdGNoLCB3ZQorCSAqIHRob3VnaCB0byB1c2UgKGR3cy0+Zmlmb19sZW4gLSByeGZsciAtIHR4ZmxyKSBhcworCSAqIG9uZSBtYXhpbXVtIHZhbHVlIGZvciB0eCwgYnV0IGl0IGRvZXNuJ3QgY292ZXIgdGhlCisJICogZGF0YSB3aGljaCBpcyBvdXQgb2YgdHgvcnggZmlmbyBhbmQgaW5zaWRlIHRoZQorCSAqIHNoaWZ0IHJlZ2lzdGVycy4gU28gYSBjb250cm9sIGZyb20gc3cgcG9pbnQgb2YKKwkgKiB2aWV3IGlzIHRha2VuLgorCSAqLworCXJ4dHhfZ2FwID0gICgoZHdzLT5yeF9lbmQgLSBkd3MtPnJ4KSAtIChkd3MtPnR4X2VuZCAtIGR3cy0+dHgpKQorCQkJLyBkd3MtPm5fYnl0ZXM7CisKKwlyZXR1cm4gbWluMyh0eF9sZWZ0LCB0eF9yb29tLCAodTMyKSAoZHdzLT5maWZvX2xlbiAtIHJ4dHhfZ2FwKSk7Cit9CisKKy8qIFJldHVybiB0aGUgbWF4IGVudHJpZXMgd2Ugc2hvdWxkIHJlYWQgb3V0IG9mIHJ4IGZpZm8gKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJ4X21heChzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisJdTMyIHJ4X2xlZnQgPSAoZHdzLT5yeF9lbmQgLSBkd3MtPnJ4KSAvIGR3cy0+bl9ieXRlczsKKworCXJldHVybiBtaW4ocnhfbGVmdCwgKHUzMilkd19yZWFkdyhkd3MsIHJ4ZmxyKSk7Cit9CisKK3N0YXRpYyB2b2lkIGR3X3dyaXRlcihzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisJdTMyIG1heCA9IHR4X21heChkd3MpOworCXUxNiB0eHcgPSAwOworCisJd2hpbGUgKG1heC0tKSB7CisJCS8qIFNldCB0aGUgdHggd29yZCBpZiB0aGUgdHJhbnNmZXIncyBvcmlnaW5hbCAidHgiIGlzIG5vdCBudWxsICovCisJCWlmIChkd3MtPnR4X2VuZCAtIGR3cy0+bGVuKSB7CisJCQlpZiAoZHdzLT5uX2J5dGVzID09IDEpCisJCQkJdHh3ID0gKih1OCAqKShkd3MtPnR4KTsKKwkJCWVsc2UKKwkJCQl0eHcgPSAqKHUxNiAqKShkd3MtPnR4KTsKKwkJfQorCQlkd193cml0ZXcoZHdzLCBkciwgdHh3KTsKKwkJZHdzLT50eCArPSBkd3MtPm5fYnl0ZXM7CisJfQorfQorCitzdGF0aWMgdm9pZCBkd19yZWFkZXIoc3RydWN0IGR3X3NwaSAqZHdzKQoreworCXUzMiBtYXggPSByeF9tYXgoZHdzKTsKKwl1MTYgcnh3OworCisJd2hpbGUgKG1heC0tKSB7CisJCXJ4dyA9IGR3X3JlYWR3KGR3cywgZHIpOworCQkvKiBDYXJlIHJ4IG9ubHkgaWYgdGhlIHRyYW5zZmVyJ3Mgb3JpZ2luYWwgInJ4IiBpcyBub3QgbnVsbCAqLworCQlpZiAoZHdzLT5yeF9lbmQgLSBkd3MtPmxlbikgeworCQkJaWYgKGR3cy0+bl9ieXRlcyA9PSAxKQorCQkJCSoodTggKikoZHdzLT5yeCkgPSByeHc7CisJCQllbHNlCisJCQkJKih1MTYgKikoZHdzLT5yeCkgPSByeHc7CisJCX0KKwkJZHdzLT5yeCArPSBkd3MtPm5fYnl0ZXM7CisJfQorfQorCitzdGF0aWMgdm9pZCAqbmV4dF90cmFuc2ZlcihzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlICptc2cgPSBkd3MtPmN1cl9tc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnMgPSBkd3MtPmN1cl90cmFuc2ZlcjsKKworCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciAqLworCWlmICh0cmFucy0+dHJhbnNmZXJfbGlzdC5uZXh0ICE9ICZtc2ctPnRyYW5zZmVycykgeworCQlkd3MtPmN1cl90cmFuc2ZlciA9CisJCQlsaXN0X2VudHJ5KHRyYW5zLT50cmFuc2Zlcl9saXN0Lm5leHQsCisJCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsCisJCQkJCXRyYW5zZmVyX2xpc3QpOworCQlyZXR1cm4gUlVOTklOR19TVEFURTsKKwl9IGVsc2UKKwkJcmV0dXJuIERPTkVfU1RBVEU7Cit9CisKKy8qCisgKiBOb3RlOiBmaXJzdCBzdGVwIGlzIHRoZSBwcm90b2NvbCBkcml2ZXIgcHJlcGFyZXMKKyAqIGEgZG1hLWNhcGFibGUgbWVtb3J5LCBhbmQgdGhpcyBmdW5jIGp1c3QgbmVlZCB0cmFuc2xhdGUKKyAqIHRoZSB2aXJ0IGFkZHIgdG8gcGh5c2ljYWwKKyAqLworc3RhdGljIGludCBtYXBfZG1hX2J1ZmZlcnMoc3RydWN0IGR3X3NwaSAqZHdzKQoreworCWlmICghZHdzLT5jdXJfbXNnLT5pc19kbWFfbWFwcGVkCisJCXx8ICFkd3MtPmRtYV9pbml0ZWQKKwkJfHwgIWR3cy0+Y3VyX2NoaXAtPmVuYWJsZV9kbWEKKwkJfHwgIWR3cy0+ZG1hX29wcykKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHdzLT5jdXJfdHJhbnNmZXItPnR4X2RtYSkKKwkJZHdzLT50eF9kbWEgPSBkd3MtPmN1cl90cmFuc2Zlci0+dHhfZG1hOworCisJaWYgKGR3cy0+Y3VyX3RyYW5zZmVyLT5yeF9kbWEpCisJCWR3cy0+cnhfZG1hID0gZHdzLT5jdXJfdHJhbnNmZXItPnJ4X2RtYTsKKworCXJldHVybiAxOworfQorCisvKiBDYWxsZXIgYWxyZWFkeSBzZXQgbWVzc2FnZS0+c3RhdHVzOyBkbWEgYW5kIHBpbyBpcnFzIGFyZSBibG9ja2VkICovCitzdGF0aWMgdm9pZCBnaXZlYmFjayhzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqbGFzdF90cmFuc2ZlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR3cy0+bG9jaywgZmxhZ3MpOworCW1zZyA9IGR3cy0+Y3VyX21zZzsKKwlkd3MtPmN1cl9tc2cgPSBOVUxMOworCWR3cy0+Y3VyX3RyYW5zZmVyID0gTlVMTDsKKwlkd3MtPnByZXZfY2hpcCA9IGR3cy0+Y3VyX2NoaXA7CisJZHdzLT5jdXJfY2hpcCA9IE5VTEw7CisJZHdzLT5kbWFfbWFwcGVkID0gMDsKKwlxdWV1ZV93b3JrKGR3cy0+d29ya3F1ZXVlLCAmZHdzLT5wdW1wX21lc3NhZ2VzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd3MtPmxvY2ssIGZsYWdzKTsKKworCWxhc3RfdHJhbnNmZXIgPSBsaXN0X2VudHJ5KG1zZy0+dHJhbnNmZXJzLnByZXYsCisJCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsCisJCQkJCXRyYW5zZmVyX2xpc3QpOworCisJaWYgKCFsYXN0X3RyYW5zZmVyLT5jc19jaGFuZ2UgJiYgZHdzLT5jc19jb250cm9sKQorCQlkd3MtPmNzX2NvbnRyb2woTVJTVF9TUElfREVBU1NFUlQpOworCisJbXNnLT5zdGF0ZSA9IE5VTEw7CisJaWYgKG1zZy0+Y29tcGxldGUpCisJCW1zZy0+Y29tcGxldGUobXNnLT5jb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQgaW50X2Vycm9yX3N0b3Aoc3RydWN0IGR3X3NwaSAqZHdzLCBjb25zdCBjaGFyICptc2cpCit7CisJLyogU3RvcCB0aGUgaHcgKi8KKwlzcGlfZW5hYmxlX2NoaXAoZHdzLCAwKTsKKworCWRldl9lcnIoJmR3cy0+bWFzdGVyLT5kZXYsICIlc1xuIiwgbXNnKTsKKwlkd3MtPmN1cl9tc2ctPnN0YXRlID0gRVJST1JfU1RBVEU7CisJdGFza2xldF9zY2hlZHVsZSgmZHdzLT5wdW1wX3RyYW5zZmVycyk7Cit9CisKK3ZvaWQgZHdfc3BpX3hmZXJfZG9uZShzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisJLyogVXBkYXRlIHRvdGFsIGJ5dGUgdHJhbnNmZXJyZWQgcmV0dXJuIGNvdW50IGFjdHVhbCBieXRlcyByZWFkICovCisJZHdzLT5jdXJfbXNnLT5hY3R1YWxfbGVuZ3RoICs9IGR3cy0+bGVuOworCisJLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyICovCisJZHdzLT5jdXJfbXNnLT5zdGF0ZSA9IG5leHRfdHJhbnNmZXIoZHdzKTsKKworCS8qIEhhbmRsZSBlbmQgb2YgbWVzc2FnZSAqLworCWlmIChkd3MtPmN1cl9tc2ctPnN0YXRlID09IERPTkVfU1RBVEUpIHsKKwkJZHdzLT5jdXJfbXNnLT5zdGF0dXMgPSAwOworCQlnaXZlYmFjayhkd3MpOworCX0gZWxzZQorCQl0YXNrbGV0X3NjaGVkdWxlKCZkd3MtPnB1bXBfdHJhbnNmZXJzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGR3X3NwaV94ZmVyX2RvbmUpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgaW50ZXJydXB0X3RyYW5zZmVyKHN0cnVjdCBkd19zcGkgKmR3cykKK3sKKwl1MTYgaXJxX3N0YXR1cyA9IGR3X3JlYWR3KGR3cywgaXNyKTsKKworCS8qIEVycm9yIGhhbmRsaW5nICovCisJaWYgKGlycV9zdGF0dXMgJiAoU1BJX0lOVF9UWE9JIHwgU1BJX0lOVF9SWE9JIHwgU1BJX0lOVF9SWFVJKSkgeworCQlkd19yZWFkdyhkd3MsIHR4b2ljcik7CisJCWR3X3JlYWR3KGR3cywgcnhvaWNyKTsKKwkJZHdfcmVhZHcoZHdzLCByeHVpY3IpOworCQlpbnRfZXJyb3Jfc3RvcChkd3MsICJpbnRlcnJ1cHRfdHJhbnNmZXI6IGZpZm8gb3ZlcnJ1bi91bmRlcnJ1biIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJZHdfcmVhZGVyKGR3cyk7CisJaWYgKGR3cy0+cnhfZW5kID09IGR3cy0+cngpIHsKKwkJc3BpX21hc2tfaW50cihkd3MsIFNQSV9JTlRfVFhFSSk7CisJCWR3X3NwaV94ZmVyX2RvbmUoZHdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlpZiAoaXJxX3N0YXR1cyAmIFNQSV9JTlRfVFhFSSkgeworCQlzcGlfbWFza19pbnRyKGR3cywgU1BJX0lOVF9UWEVJKTsKKwkJZHdfd3JpdGVyKGR3cyk7CisJCS8qIEVuYWJsZSBUWCBpcnEgYWx3YXlzLCBpdCB3aWxsIGJlIGRpc2FibGVkIHdoZW4gUlggZmluaXNoZWQgKi8KKwkJc3BpX3VtYXNrX2ludHIoZHdzLCBTUElfSU5UX1RYRUkpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGR3X3NwaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBkd19zcGkgKmR3cyA9IGRldl9pZDsKKwl1MTYgaXJxX3N0YXR1cyA9IGR3X3JlYWR3KGR3cywgaXNyKSAmIDB4M2Y7CisKKwlpZiAoIWlycV9zdGF0dXMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlmICghZHdzLT5jdXJfbXNnKSB7CisJCXNwaV9tYXNrX2ludHIoZHdzLCBTUElfSU5UX1RYRUkpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIGR3cy0+dHJhbnNmZXJfaGFuZGxlcihkd3MpOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCBpbnNpZGUgcHVtcF90cmFuc2ZlcnMoKSAqLworc3RhdGljIHZvaWQgcG9sbF90cmFuc2ZlcihzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisJZG8geworCQlkd193cml0ZXIoZHdzKTsKKwkJZHdfcmVhZGVyKGR3cyk7CisJCWNwdV9yZWxheCgpOworCX0gd2hpbGUgKGR3cy0+cnhfZW5kID4gZHdzLT5yeCk7CisKKwlkd19zcGlfeGZlcl9kb25lKGR3cyk7Cit9CisKK3N0YXRpYyB2b2lkIHB1bXBfdHJhbnNmZXJzKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZHdfc3BpICpkd3MgPSAoc3RydWN0IGR3X3NwaSAqKWRhdGE7CisJc3RydWN0IHNwaV9tZXNzYWdlICptZXNzYWdlID0gTlVMTDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFuc2ZlciA9IE5VTEw7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqcHJldmlvdXMgPSBOVUxMOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBOVUxMOworCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPSBOVUxMOworCXU4IGJpdHMgPSAwOworCXU4IGltYXNrID0gMDsKKwl1OCBjc19jaGFuZ2UgPSAwOworCXUxNiB0eGludF9sZXZlbCA9IDA7CisJdTE2IGNsa19kaXYgPSAwOworCXUzMiBzcGVlZCA9IDA7CisJdTMyIGNyMCA9IDA7CisKKwkvKiBHZXQgY3VycmVudCBzdGF0ZSBpbmZvcm1hdGlvbiAqLworCW1lc3NhZ2UgPSBkd3MtPmN1cl9tc2c7CisJdHJhbnNmZXIgPSBkd3MtPmN1cl90cmFuc2ZlcjsKKwljaGlwID0gZHdzLT5jdXJfY2hpcDsKKwlzcGkgPSBtZXNzYWdlLT5zcGk7CisKKwlpZiAodW5saWtlbHkoIWNoaXAtPmNsa19kaXYpKQorCQljaGlwLT5jbGtfZGl2ID0gZHdzLT5tYXhfZnJlcSAvIGNoaXAtPnNwZWVkX2h6OworCisJaWYgKG1lc3NhZ2UtPnN0YXRlID09IEVSUk9SX1NUQVRFKSB7CisJCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU87CisJCWdvdG8gZWFybHlfZXhpdDsKKwl9CisKKwkvKiBIYW5kbGUgZW5kIG9mIG1lc3NhZ2UgKi8KKwlpZiAobWVzc2FnZS0+c3RhdGUgPT0gRE9ORV9TVEFURSkgeworCQltZXNzYWdlLT5zdGF0dXMgPSAwOworCQlnb3RvIGVhcmx5X2V4aXQ7CisJfQorCisJLyogRGVsYXkgaWYgcmVxdWVzdGVkIGF0IGVuZCBvZiB0cmFuc2ZlciovCisJaWYgKG1lc3NhZ2UtPnN0YXRlID09IFJVTk5JTkdfU1RBVEUpIHsKKwkJcHJldmlvdXMgPSBsaXN0X2VudHJ5KHRyYW5zZmVyLT50cmFuc2Zlcl9saXN0LnByZXYsCisJCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsCisJCQkJCXRyYW5zZmVyX2xpc3QpOworCQlpZiAocHJldmlvdXMtPmRlbGF5X3VzZWNzKQorCQkJdWRlbGF5KHByZXZpb3VzLT5kZWxheV91c2Vjcyk7CisJfQorCisJZHdzLT5uX2J5dGVzID0gY2hpcC0+bl9ieXRlczsKKwlkd3MtPmRtYV93aWR0aCA9IGNoaXAtPmRtYV93aWR0aDsKKwlkd3MtPmNzX2NvbnRyb2wgPSBjaGlwLT5jc19jb250cm9sOworCisJZHdzLT5yeF9kbWEgPSB0cmFuc2Zlci0+cnhfZG1hOworCWR3cy0+dHhfZG1hID0gdHJhbnNmZXItPnR4X2RtYTsKKwlkd3MtPnR4ID0gKHZvaWQgKil0cmFuc2Zlci0+dHhfYnVmOworCWR3cy0+dHhfZW5kID0gZHdzLT50eCArIHRyYW5zZmVyLT5sZW47CisJZHdzLT5yeCA9IHRyYW5zZmVyLT5yeF9idWY7CisJZHdzLT5yeF9lbmQgPSBkd3MtPnJ4ICsgdHJhbnNmZXItPmxlbjsKKwlkd3MtPmNzX2NoYW5nZSA9IHRyYW5zZmVyLT5jc19jaGFuZ2U7CisJZHdzLT5sZW4gPSBkd3MtPmN1cl90cmFuc2Zlci0+bGVuOworCWlmIChjaGlwICE9IGR3cy0+cHJldl9jaGlwKQorCQljc19jaGFuZ2UgPSAxOworCisJY3IwID0gY2hpcC0+Y3IwOworCisJLyogSGFuZGxlIHBlciB0cmFuc2ZlciBvcHRpb25zIGZvciBicHcgYW5kIHNwZWVkICovCisJaWYgKHRyYW5zZmVyLT5zcGVlZF9oeikgeworCQlzcGVlZCA9IGNoaXAtPnNwZWVkX2h6OworCisJCWlmICh0cmFuc2Zlci0+c3BlZWRfaHogIT0gc3BlZWQpIHsKKwkJCXNwZWVkID0gdHJhbnNmZXItPnNwZWVkX2h6OworCQkJaWYgKHNwZWVkID4gZHdzLT5tYXhfZnJlcSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiTVJTVCBTUEkwOiB1bnN1cHBvcnRlZCIKKwkJCQkJImZyZXE6ICVkSHpcbiIsIHNwZWVkKTsKKwkJCQltZXNzYWdlLT5zdGF0dXMgPSAtRUlPOworCQkJCWdvdG8gZWFybHlfZXhpdDsKKwkJCX0KKworCQkJLyogY2xrX2RpdiBkb2Vzbid0IHN1cHBvcnQgb2RkIG51bWJlciAqLworCQkJY2xrX2RpdiA9IGR3cy0+bWF4X2ZyZXEgLyBzcGVlZDsKKwkJCWNsa19kaXYgPSAoY2xrX2RpdiArIDEpICYgMHhmZmZlOworCisJCQljaGlwLT5zcGVlZF9oeiA9IHNwZWVkOworCQkJY2hpcC0+Y2xrX2RpdiA9IGNsa19kaXY7CisJCX0KKwl9CisJaWYgKHRyYW5zZmVyLT5iaXRzX3Blcl93b3JkKSB7CisJCWJpdHMgPSB0cmFuc2Zlci0+Yml0c19wZXJfd29yZDsKKworCQlzd2l0Y2ggKGJpdHMpIHsKKwkJY2FzZSA4OgorCQljYXNlIDE2OgorCQkJZHdzLT5uX2J5dGVzID0gZHdzLT5kbWFfd2lkdGggPSBiaXRzID4+IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiTVJTVCBTUEkwOiB1bnN1cHBvcnRlZCBiaXRzOiIKKwkJCQkiJWRiXG4iLCBiaXRzKTsKKwkJCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU87CisJCQlnb3RvIGVhcmx5X2V4aXQ7CisJCX0KKworCQljcjAgPSAoYml0cyAtIDEpCisJCQl8IChjaGlwLT50eXBlIDw8IFNQSV9GUkZfT0ZGU0VUKQorCQkJfCAoc3BpLT5tb2RlIDw8IFNQSV9NT0RFX09GRlNFVCkKKwkJCXwgKGNoaXAtPnRtb2RlIDw8IFNQSV9UTU9EX09GRlNFVCk7CisJfQorCW1lc3NhZ2UtPnN0YXRlID0gUlVOTklOR19TVEFURTsKKworCS8qCisJICogQWRqdXN0IHRyYW5zZmVyIG1vZGUgaWYgbmVjZXNzYXJ5LiBSZXF1aXJlcyBwbGF0Zm9ybSBkZXBlbmRlbnQKKwkgKiBjaGlwc2VsZWN0IG1lY2hhbmlzbS4KKwkgKi8KKwlpZiAoZHdzLT5jc19jb250cm9sKSB7CisJCWlmIChkd3MtPnJ4ICYmIGR3cy0+dHgpCisJCQljaGlwLT50bW9kZSA9IFNQSV9UTU9EX1RSOworCQllbHNlIGlmIChkd3MtPnJ4KQorCQkJY2hpcC0+dG1vZGUgPSBTUElfVE1PRF9STzsKKwkJZWxzZQorCQkJY2hpcC0+dG1vZGUgPSBTUElfVE1PRF9UTzsKKworCQljcjAgJj0gflNQSV9UTU9EX01BU0s7CisJCWNyMCB8PSAoY2hpcC0+dG1vZGUgPDwgU1BJX1RNT0RfT0ZGU0VUKTsKKwl9CisKKwkvKiBDaGVjayBpZiBjdXJyZW50IHRyYW5zZmVyIGlzIGEgRE1BIHRyYW5zYWN0aW9uICovCisJZHdzLT5kbWFfbWFwcGVkID0gbWFwX2RtYV9idWZmZXJzKGR3cyk7CisKKwkvKgorCSAqIEludGVycnVwdCBtb2RlCisJICogd2Ugb25seSBuZWVkIHNldCB0aGUgVFhFSSBJUlEsIGFzIFRYL1JYIGFsd2F5cyBoYXBwZW4gc3luY3Jvbml6ZWx5CisJICovCisJaWYgKCFkd3MtPmRtYV9tYXBwZWQgJiYgIWNoaXAtPnBvbGxfbW9kZSkgeworCQlpbnQgdGVtcGxlbiA9IGR3cy0+bGVuIC8gZHdzLT5uX2J5dGVzOworCQl0eGludF9sZXZlbCA9IGR3cy0+Zmlmb19sZW4gLyAyOworCQl0eGludF9sZXZlbCA9ICh0ZW1wbGVuID4gdHhpbnRfbGV2ZWwpID8gdHhpbnRfbGV2ZWwgOiB0ZW1wbGVuOworCisJCWltYXNrIHw9IFNQSV9JTlRfVFhFSSB8IFNQSV9JTlRfVFhPSSB8IFNQSV9JTlRfUlhVSSB8IFNQSV9JTlRfUlhPSTsKKwkJZHdzLT50cmFuc2Zlcl9oYW5kbGVyID0gaW50ZXJydXB0X3RyYW5zZmVyOworCX0KKworCS8qCisJICogUmVwcm9ncmFtIHJlZ2lzdGVycyBvbmx5IGlmCisJICoJMS4gY2hpcCBzZWxlY3QgY2hhbmdlcworCSAqCTIuIGNsa19kaXYgaXMgY2hhbmdlZAorCSAqCTMuIGNvbnRyb2wgdmFsdWUgY2hhbmdlcworCSAqLworCWlmIChkd19yZWFkdyhkd3MsIGN0cmwwKSAhPSBjcjAgfHwgY3NfY2hhbmdlIHx8IGNsa19kaXYgfHwgaW1hc2spIHsKKwkJc3BpX2VuYWJsZV9jaGlwKGR3cywgMCk7CisKKwkJaWYgKGR3X3JlYWR3KGR3cywgY3RybDApICE9IGNyMCkKKwkJCWR3X3dyaXRldyhkd3MsIGN0cmwwLCBjcjApOworCisJCXNwaV9zZXRfY2xrKGR3cywgY2xrX2RpdiA/IGNsa19kaXYgOiBjaGlwLT5jbGtfZGl2KTsKKwkJc3BpX2NoaXBfc2VsKGR3cywgc3BpLT5jaGlwX3NlbGVjdCk7CisKKwkJLyogU2V0IHRoZSBpbnRlcnJ1cHQgbWFzaywgZm9yIHBvbGwgbW9kZSBqdXN0IGRpc2FibGUgYWxsIGludCAqLworCQlzcGlfbWFza19pbnRyKGR3cywgMHhmZik7CisJCWlmIChpbWFzaykKKwkJCXNwaV91bWFza19pbnRyKGR3cywgaW1hc2spOworCQlpZiAodHhpbnRfbGV2ZWwpCisJCQlkd193cml0ZXcoZHdzLCB0eGZsdHIsIHR4aW50X2xldmVsKTsKKworCQlzcGlfZW5hYmxlX2NoaXAoZHdzLCAxKTsKKwkJaWYgKGNzX2NoYW5nZSkKKwkJCWR3cy0+cHJldl9jaGlwID0gY2hpcDsKKwl9CisKKwlpZiAoZHdzLT5kbWFfbWFwcGVkKQorCQlkd3MtPmRtYV9vcHMtPmRtYV90cmFuc2Zlcihkd3MsIGNzX2NoYW5nZSk7CisKKwlpZiAoY2hpcC0+cG9sbF9tb2RlKQorCQlwb2xsX3RyYW5zZmVyKGR3cyk7CisKKwlyZXR1cm47CisKK2Vhcmx5X2V4aXQ6CisJZ2l2ZWJhY2soZHdzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHB1bXBfbWVzc2FnZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkd19zcGkgKmR3cyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZHdfc3BpLCBwdW1wX21lc3NhZ2VzKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogTG9jayBxdWV1ZSBhbmQgY2hlY2sgZm9yIHF1ZXVlIHdvcmsgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHdzLT5sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJmR3cy0+cXVldWUpIHx8IGR3cy0+cnVuID09IFFVRVVFX1NUT1BQRUQpIHsKKwkJZHdzLT5idXN5ID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHdzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBhbHJlYWR5IHJ1bm5pbmcgYSBtZXNzYWdlICovCisJaWYgKGR3cy0+Y3VyX21zZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd3MtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEV4dHJhY3QgaGVhZCBvZiBxdWV1ZSAqLworCWR3cy0+Y3VyX21zZyA9IGxpc3RfZW50cnkoZHdzLT5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsIHF1ZXVlKTsKKwlsaXN0X2RlbF9pbml0KCZkd3MtPmN1cl9tc2ctPnF1ZXVlKTsKKworCS8qIEluaXRpYWwgbWVzc2FnZSBzdGF0ZSovCisJZHdzLT5jdXJfbXNnLT5zdGF0ZSA9IFNUQVJUX1NUQVRFOworCWR3cy0+Y3VyX3RyYW5zZmVyID0gbGlzdF9lbnRyeShkd3MtPmN1cl9tc2ctPnRyYW5zZmVycy5uZXh0LAorCQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwKKwkJCQkJCXRyYW5zZmVyX2xpc3QpOworCWR3cy0+Y3VyX2NoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoZHdzLT5jdXJfbXNnLT5zcGkpOworCisJLyogTWFyayBhcyBidXN5IGFuZCBsYXVuY2ggdHJhbnNmZXJzICovCisJdGFza2xldF9zY2hlZHVsZSgmZHdzLT5wdW1wX3RyYW5zZmVycyk7CisKKwlkd3MtPmJ1c3kgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOworfQorCisvKiBzcGlfZGV2aWNlIHVzZSB0aGlzIHRvIHF1ZXVlIGluIHRoZWlyIHNwaV9tc2cgKi8KK3N0YXRpYyBpbnQgZHdfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBkd19zcGkgKmR3cyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHdzLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZHdzLT5ydW4gPT0gUVVFVUVfU1RPUFBFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd3MtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJbXNnLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwltc2ctPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwltc2ctPnN0YXRlID0gU1RBUlRfU1RBVEU7CisKKwlsaXN0X2FkZF90YWlsKCZtc2ctPnF1ZXVlLCAmZHdzLT5xdWV1ZSk7CisKKwlpZiAoZHdzLT5ydW4gPT0gUVVFVUVfUlVOTklORyAmJiAhZHdzLT5idXN5KSB7CisKKwkJaWYgKGR3cy0+Y3VyX3RyYW5zZmVyIHx8IGR3cy0+Y3VyX21zZykKKwkJCXF1ZXVlX3dvcmsoZHdzLT53b3JrcXVldWUsCisJCQkJCSZkd3MtPnB1bXBfbWVzc2FnZXMpOworCQllbHNlIHsKKwkJCS8qIElmIG5vIG90aGVyIGRhdGEgdHJhbnNhY3Rpb24gaW4gYWlyLCBqdXN0IGdvICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd3MtPmxvY2ssIGZsYWdzKTsKKwkJCXB1bXBfbWVzc2FnZXMoJmR3cy0+cHVtcF9tZXNzYWdlcyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiBUaGlzIG1heSBiZSBjYWxsZWQgdHdpY2UgZm9yIGVhY2ggc3BpIGRldiAqLworc3RhdGljIGludCBkd19zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgZHdfc3BpX2NoaXAgKmNoaXBfaW5mbyA9IE5VTEw7CisJc3RydWN0IGNoaXBfZGF0YSAqY2hpcDsKKworCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgIT0gOCAmJiBzcGktPmJpdHNfcGVyX3dvcmQgIT0gMTYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT25seSBhbGxvYyBvbiBmaXJzdCBzZXR1cCAqLworCWNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKKwlpZiAoIWNoaXApIHsKKwkJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGlwX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjaGlwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBQcm90b2NvbCBkcml2ZXJzIG1heSBjaGFuZ2UgdGhlIGNoaXAgc2V0dGluZ3MsIHNvLi4uCisJICogaWYgY2hpcF9pbmZvIGV4aXN0cywgdXNlIGl0CisJICovCisJY2hpcF9pbmZvID0gc3BpLT5jb250cm9sbGVyX2RhdGE7CisKKwkvKiBjaGlwX2luZm8gZG9lc24ndCBhbHdheXMgZXhpc3QgKi8KKwlpZiAoY2hpcF9pbmZvKSB7CisJCWlmIChjaGlwX2luZm8tPmNzX2NvbnRyb2wpCisJCQljaGlwLT5jc19jb250cm9sID0gY2hpcF9pbmZvLT5jc19jb250cm9sOworCisJCWNoaXAtPnBvbGxfbW9kZSA9IGNoaXBfaW5mby0+cG9sbF9tb2RlOworCQljaGlwLT50eXBlID0gY2hpcF9pbmZvLT50eXBlOworCisJCWNoaXAtPnJ4X3RocmVzaG9sZCA9IDA7CisJCWNoaXAtPnR4X3RocmVzaG9sZCA9IDA7CisKKwkJY2hpcC0+ZW5hYmxlX2RtYSA9IGNoaXBfaW5mby0+ZW5hYmxlX2RtYTsKKwl9CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkIDw9IDgpIHsKKwkJY2hpcC0+bl9ieXRlcyA9IDE7CisJCWNoaXAtPmRtYV93aWR0aCA9IDE7CisJfSBlbHNlIGlmIChzcGktPmJpdHNfcGVyX3dvcmQgPD0gMTYpIHsKKwkJY2hpcC0+bl9ieXRlcyA9IDI7CisJCWNoaXAtPmRtYV93aWR0aCA9IDI7CisJfSBlbHNlIHsKKwkJLyogTmV2ZXIgdGFrZSA+MTZiIGNhc2UgZm9yIE1SU1QgU1BJQyAqLworCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgd29yZHNpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY2hpcC0+Yml0c19wZXJfd29yZCA9IHNwaS0+Yml0c19wZXJfd29yZDsKKworCWlmICghc3BpLT5tYXhfc3BlZWRfaHopIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJObyBtYXggc3BlZWQgSFogcGFyYW1ldGVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNoaXAtPnNwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CisKKwljaGlwLT50bW9kZSA9IDA7IC8qIFR4ICYgUnggKi8KKwkvKiBEZWZhdWx0IFNQSSBtb2RlIGlzIFNDUE9MID0gMCwgU0NQSCA9IDAgKi8KKwljaGlwLT5jcjAgPSAoY2hpcC0+Yml0c19wZXJfd29yZCAtIDEpCisJCQl8IChjaGlwLT50eXBlIDw8IFNQSV9GUkZfT0ZGU0VUKQorCQkJfCAoc3BpLT5tb2RlICA8PCBTUElfTU9ERV9PRkZTRVQpCisJCQl8IChjaGlwLT50bW9kZSA8PCBTUElfVE1PRF9PRkZTRVQpOworCisJc3BpX3NldF9jdGxkYXRhKHNwaSwgY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR3X3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOworCWtmcmVlKGNoaXApOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X3F1ZXVlKHN0cnVjdCBkd19zcGkgKmR3cykKK3sKKwlJTklUX0xJU1RfSEVBRCgmZHdzLT5xdWV1ZSk7CisJc3Bpbl9sb2NrX2luaXQoJmR3cy0+bG9jayk7CisKKwlkd3MtPnJ1biA9IFFVRVVFX1NUT1BQRUQ7CisJZHdzLT5idXN5ID0gMDsKKworCXRhc2tsZXRfaW5pdCgmZHdzLT5wdW1wX3RyYW5zZmVycywKKwkJCXB1bXBfdHJhbnNmZXJzLAkodW5zaWduZWQgbG9uZylkd3MpOworCisJSU5JVF9XT1JLKCZkd3MtPnB1bXBfbWVzc2FnZXMsIHB1bXBfbWVzc2FnZXMpOworCWR3cy0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCisJCQkJCWRldl9uYW1lKGR3cy0+bWFzdGVyLT5kZXYucGFyZW50KSk7CisJaWYgKGR3cy0+d29ya3F1ZXVlID09IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFydF9xdWV1ZShzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkd3MtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkd3MtPnJ1biA9PSBRVUVVRV9SVU5OSU5HIHx8IGR3cy0+YnVzeSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd3MtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlkd3MtPnJ1biA9IFFVRVVFX1JVTk5JTkc7CisJZHdzLT5jdXJfbXNnID0gTlVMTDsKKwlkd3MtPmN1cl90cmFuc2ZlciA9IE5VTEw7CisJZHdzLT5jdXJfY2hpcCA9IE5VTEw7CisJZHdzLT5wcmV2X2NoaXAgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOworCisJcXVldWVfd29yayhkd3MtPndvcmtxdWV1ZSwgJmR3cy0+cHVtcF9tZXNzYWdlcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdG9wX3F1ZXVlKHN0cnVjdCBkd19zcGkgKmR3cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxpbWl0ID0gNTA7CisJaW50IHN0YXR1cyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHdzLT5sb2NrLCBmbGFncyk7CisJZHdzLT5ydW4gPSBRVUVVRV9TVE9QUEVEOworCXdoaWxlICgoIWxpc3RfZW1wdHkoJmR3cy0+cXVldWUpIHx8IGR3cy0+YnVzeSkgJiYgbGltaXQtLSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkd3MtPmxvY2ssIGZsYWdzKTsKKwkJbXNsZWVwKDEwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmR3cy0+bG9jaywgZmxhZ3MpOworCX0KKworCWlmICghbGlzdF9lbXB0eSgmZHdzLT5xdWV1ZSkgfHwgZHdzLT5idXN5KQorCQlzdGF0dXMgPSAtRUJVU1k7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHdzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlc3Ryb3lfcXVldWUoc3RydWN0IGR3X3NwaSAqZHdzKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBzdG9wX3F1ZXVlKGR3cyk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCWRlc3Ryb3lfd29ya3F1ZXVlKGR3cy0+d29ya3F1ZXVlKTsKKwlyZXR1cm4gMDsKK30KKworLyogUmVzdGFydCB0aGUgY29udHJvbGxlciwgZGlzYWJsZSBhbGwgaW50ZXJydXB0cywgY2xlYW4gcnggZmlmbyAqLworc3RhdGljIHZvaWQgc3BpX2h3X2luaXQoc3RydWN0IGR3X3NwaSAqZHdzKQoreworCXNwaV9lbmFibGVfY2hpcChkd3MsIDApOworCXNwaV9tYXNrX2ludHIoZHdzLCAweGZmKTsKKwlzcGlfZW5hYmxlX2NoaXAoZHdzLCAxKTsKKworCS8qCisJICogVHJ5IHRvIGRldGVjdCB0aGUgRklGTyBkZXB0aCBpZiBub3Qgc2V0IGJ5IGludGVyZmFjZSBkcml2ZXIsCisJICogdGhlIGRlcHRoIGNvdWxkIGJlIGZyb20gMiB0byAyNTYgZnJvbSBIVyBzcGVjCisJICovCisJaWYgKCFkd3MtPmZpZm9fbGVuKSB7CisJCXUzMiBmaWZvOworCQlmb3IgKGZpZm8gPSAyOyBmaWZvIDw9IDI1NzsgZmlmbysrKSB7CisJCQlkd193cml0ZXcoZHdzLCB0eGZsdHIsIGZpZm8pOworCQkJaWYgKGZpZm8gIT0gZHdfcmVhZHcoZHdzLCB0eGZsdHIpKQorCQkJCWJyZWFrOworCQl9CisKKwkJZHdzLT5maWZvX2xlbiA9IChmaWZvID09IDI1NykgPyAwIDogZmlmbzsKKwkJZHdfd3JpdGV3KGR3cywgdHhmbHRyLCAwKTsKKwl9Cit9CisKK2ludCBfX2RldmluaXQgZHdfc3BpX2FkZF9ob3N0KHN0cnVjdCBkd19zcGkgKmR3cykKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCWludCByZXQ7CisKKwlCVUdfT04oZHdzID09IE5VTEwpOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3Rlcihkd3MtPnBhcmVudF9kZXYsIDApOworCWlmICghbWFzdGVyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwlkd3MtPm1hc3RlciA9IG1hc3RlcjsKKwlkd3MtPnR5cGUgPSBTU0lfTU9UT19TUEk7CisJZHdzLT5wcmV2X2NoaXAgPSBOVUxMOworCWR3cy0+ZG1hX2luaXRlZCA9IDA7CisJZHdzLT5kbWFfYWRkciA9IChkbWFfYWRkcl90KShkd3MtPnBhZGRyICsgMHg2MCk7CisJc25wcmludGYoZHdzLT5uYW1lLCBzaXplb2YoZHdzLT5uYW1lKSwgImR3X3NwaSVkIiwKKwkJCWR3cy0+YnVzX251bSk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShkd3MtPmlycSwgZHdfc3BpX2lycSwgSVJRRl9TSEFSRUQsCisJCQlkd3MtPm5hbWUsIGR3cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmbWFzdGVyLT5kZXYsICJjYW4gbm90IGdldCBJUlFcbiIpOworCQlnb3RvIGVycl9mcmVlX21hc3RlcjsKKwl9CisKKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEE7CisJbWFzdGVyLT5idXNfbnVtID0gZHdzLT5idXNfbnVtOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBkd3MtPm51bV9jczsKKwltYXN0ZXItPmNsZWFudXAgPSBkd19zcGlfY2xlYW51cDsKKwltYXN0ZXItPnNldHVwID0gZHdfc3BpX3NldHVwOworCW1hc3Rlci0+dHJhbnNmZXIgPSBkd19zcGlfdHJhbnNmZXI7CisKKwkvKiBCYXNpYyBIVyBpbml0ICovCisJc3BpX2h3X2luaXQoZHdzKTsKKworCWlmIChkd3MtPmRtYV9vcHMgJiYgZHdzLT5kbWFfb3BzLT5kbWFfaW5pdCkgeworCQlyZXQgPSBkd3MtPmRtYV9vcHMtPmRtYV9pbml0KGR3cyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl93YXJuKCZtYXN0ZXItPmRldiwgIkRNQSBpbml0IGZhaWxlZFxuIik7CisJCQlkd3MtPmRtYV9pbml0ZWQgPSAwOworCQl9CisJfQorCisJLyogSW5pdGlhbCBhbmQgc3RhcnQgcXVldWUgKi8KKwlyZXQgPSBpbml0X3F1ZXVlKGR3cyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgInByb2JsZW0gaW5pdGlhbGl6aW5nIHF1ZXVlXG4iKTsKKwkJZ290byBlcnJfZGlhYmxlX2h3OworCX0KKwlyZXQgPSBzdGFydF9xdWV1ZShkd3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmbWFzdGVyLT5kZXYsICJwcm9ibGVtIHN0YXJ0aW5nIHF1ZXVlXG4iKTsKKwkJZ290byBlcnJfZGlhYmxlX2h3OworCX0KKworCXNwaV9tYXN0ZXJfc2V0X2RldmRhdGEobWFzdGVyLCBkd3MpOworCXJldCA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAicHJvYmxlbSByZWdpc3RlcmluZyBzcGkgbWFzdGVyXG4iKTsKKwkJZ290byBlcnJfcXVldWVfYWxsb2M7CisJfQorCisJbXJzdF9zcGlfZGVidWdmc19pbml0KGR3cyk7CisJcmV0dXJuIDA7CisKK2Vycl9xdWV1ZV9hbGxvYzoKKwlkZXN0cm95X3F1ZXVlKGR3cyk7CisJaWYgKGR3cy0+ZG1hX29wcyAmJiBkd3MtPmRtYV9vcHMtPmRtYV9leGl0KQorCQlkd3MtPmRtYV9vcHMtPmRtYV9leGl0KGR3cyk7CitlcnJfZGlhYmxlX2h3OgorCXNwaV9lbmFibGVfY2hpcChkd3MsIDApOworCWZyZWVfaXJxKGR3cy0+aXJxLCBkd3MpOworZXJyX2ZyZWVfbWFzdGVyOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CitleGl0OgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkd19zcGlfYWRkX2hvc3QpOworCit2b2lkIF9fZGV2ZXhpdCBkd19zcGlfcmVtb3ZlX2hvc3Qoc3RydWN0IGR3X3NwaSAqZHdzKQoreworCWludCBzdGF0dXMgPSAwOworCisJaWYgKCFkd3MpCisJCXJldHVybjsKKwltcnN0X3NwaV9kZWJ1Z2ZzX3JlbW92ZShkd3MpOworCisJLyogUmVtb3ZlIHRoZSBxdWV1ZSAqLworCXN0YXR1cyA9IGRlc3Ryb3lfcXVldWUoZHdzKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWRldl9lcnIoJmR3cy0+bWFzdGVyLT5kZXYsICJkd19zcGlfcmVtb3ZlOiB3b3JrcXVldWUgd2lsbCBub3QgIgorCQkJImNvbXBsZXRlLCBtZXNzYWdlIG1lbW9yeSBub3QgZnJlZWRcbiIpOworCisJaWYgKGR3cy0+ZG1hX29wcyAmJiBkd3MtPmRtYV9vcHMtPmRtYV9leGl0KQorCQlkd3MtPmRtYV9vcHMtPmRtYV9leGl0KGR3cyk7CisJc3BpX2VuYWJsZV9jaGlwKGR3cywgMCk7CisJLyogRGlzYWJsZSBjbGsgKi8KKwlzcGlfc2V0X2Nsayhkd3MsIDApOworCWZyZWVfaXJxKGR3cy0+aXJxLCBkd3MpOworCisJLyogRGlzY29ubmVjdCBmcm9tIHRoZSBTUEkgZnJhbWV3b3JrICovCisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKGR3cy0+bWFzdGVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGR3X3NwaV9yZW1vdmVfaG9zdCk7CisKK2ludCBkd19zcGlfc3VzcGVuZF9ob3N0KHN0cnVjdCBkd19zcGkgKmR3cykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHN0b3BfcXVldWUoZHdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXNwaV9lbmFibGVfY2hpcChkd3MsIDApOworCXNwaV9zZXRfY2xrKGR3cywgMCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGR3X3NwaV9zdXNwZW5kX2hvc3QpOworCitpbnQgZHdfc3BpX3Jlc3VtZV9ob3N0KHN0cnVjdCBkd19zcGkgKmR3cykKK3sKKwlpbnQgcmV0OworCisJc3BpX2h3X2luaXQoZHdzKTsKKwlyZXQgPSBzdGFydF9xdWV1ZShkd3MpOworCWlmIChyZXQpCisJCWRldl9lcnIoJmR3cy0+bWFzdGVyLT5kZXYsICJmYWlsIHRvIHN0YXJ0IHF1ZXVlICglZClcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGR3X3NwaV9yZXN1bWVfaG9zdCk7CisKK01PRFVMRV9BVVRIT1IoIkZlbmcgVGFuZyA8ZmVuZy50YW5nQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBEZXNpZ25XYXJlIFNQSSBjb250cm9sbGVyIGNvcmUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kdy5oIGIvZHJpdmVycy9zcGkvc3BpLWR3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3YjA3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kdy5oCkBAIC0wLDAgKzEsMjMzIEBACisjaWZuZGVmIERXX1NQSV9IRUFERVJfSAorI2RlZmluZSBEV19TUElfSEVBREVSX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKworLyogQml0IGZpZWxkcyBpbiBDVFJMUjAgKi8KKyNkZWZpbmUgU1BJX0RGU19PRkZTRVQJCQkwCisKKyNkZWZpbmUgU1BJX0ZSRl9PRkZTRVQJCQk0CisjZGVmaW5lIFNQSV9GUkZfU1BJCQkJMHgwCisjZGVmaW5lIFNQSV9GUkZfU1NQCQkJMHgxCisjZGVmaW5lIFNQSV9GUkZfTUlDUk9XSVJFCQkweDIKKyNkZWZpbmUgU1BJX0ZSRl9SRVNWCQkJMHgzCisKKyNkZWZpbmUgU1BJX01PREVfT0ZGU0VUCQkJNgorI2RlZmluZSBTUElfU0NQSF9PRkZTRVQJCQk2CisjZGVmaW5lIFNQSV9TQ09MX09GRlNFVAkJCTcKKworI2RlZmluZSBTUElfVE1PRF9PRkZTRVQJCQk4CisjZGVmaW5lIFNQSV9UTU9EX01BU0sJCQkoMHgzIDw8IFNQSV9UTU9EX09GRlNFVCkKKyNkZWZpbmUJU1BJX1RNT0RfVFIJCQkweDAJCS8qIHhtaXQgJiByZWN2ICovCisjZGVmaW5lIFNQSV9UTU9EX1RPCQkJMHgxCQkvKiB4bWl0IG9ubHkgKi8KKyNkZWZpbmUgU1BJX1RNT0RfUk8JCQkweDIJCS8qIHJlY3Ygb25seSAqLworI2RlZmluZSBTUElfVE1PRF9FUFJPTVJFQUQJCTB4MwkJLyogZWVwcm9tIHJlYWQgbW9kZSAqLworCisjZGVmaW5lIFNQSV9TTFZPRV9PRkZTRVQJCTEwCisjZGVmaW5lIFNQSV9TUkxfT0ZGU0VUCQkJMTEKKyNkZWZpbmUgU1BJX0NGU19PRkZTRVQJCQkxMgorCisvKiBCaXQgZmllbGRzIGluIFNSLCA3IGJpdHMgKi8KKyNkZWZpbmUgU1JfTUFTSwkJCQkweDdmCQkvKiBjb3ZlciA3IGJpdHMgKi8KKyNkZWZpbmUgU1JfQlVTWQkJCQkoMSA8PCAwKQorI2RlZmluZSBTUl9URl9OT1RfRlVMTAkJCSgxIDw8IDEpCisjZGVmaW5lIFNSX1RGX0VNUFQJCQkoMSA8PCAyKQorI2RlZmluZSBTUl9SRl9OT1RfRU1QVAkJCSgxIDw8IDMpCisjZGVmaW5lIFNSX1JGX0ZVTEwJCQkoMSA8PCA0KQorI2RlZmluZSBTUl9UWF9FUlIJCQkoMSA8PCA1KQorI2RlZmluZSBTUl9EQ09MCQkJCSgxIDw8IDYpCisKKy8qIEJpdCBmaWVsZHMgaW4gSVNSLCBJTVIsIFJJU1IsIDcgYml0cyAqLworI2RlZmluZSBTUElfSU5UX1RYRUkJCQkoMSA8PCAwKQorI2RlZmluZSBTUElfSU5UX1RYT0kJCQkoMSA8PCAxKQorI2RlZmluZSBTUElfSU5UX1JYVUkJCQkoMSA8PCAyKQorI2RlZmluZSBTUElfSU5UX1JYT0kJCQkoMSA8PCAzKQorI2RlZmluZSBTUElfSU5UX1JYRkkJCQkoMSA8PCA0KQorI2RlZmluZSBTUElfSU5UX01TVEkJCQkoMSA8PCA1KQorCisvKiBUWCBSWCBpbnRlcnJ1cHQgbGV2ZWwgdGhyZXNob2xkLCBtYXggY2FuIGJlIDI1NiAqLworI2RlZmluZSBTUElfSU5UX1RIUkVTSE9MRAkJMzIKKworZW51bSBkd19zc2lfdHlwZSB7CisJU1NJX01PVE9fU1BJID0gMCwKKwlTU0lfVElfU1NQLAorCVNTSV9OU19NSUNST1dJUkUsCit9OworCitzdHJ1Y3QgZHdfc3BpX3JlZyB7CisJdTMyCWN0cmwwOworCXUzMgljdHJsMTsKKwl1MzIJc3NpZW5yOworCXUzMgltd2NyOworCXUzMglzZXI7CisJdTMyCWJhdWRyOworCXUzMgl0eGZsdHI7CisJdTMyCXJ4Zmx0cjsKKwl1MzIJdHhmbHI7CisJdTMyCXJ4ZmxyOworCXUzMglzcjsKKwl1MzIJaW1yOworCXUzMglpc3I7CisJdTMyCXJpc3I7CisJdTMyCXR4b2ljcjsKKwl1MzIJcnhvaWNyOworCXUzMglyeHVpY3I7CisJdTMyCW1zdGljcjsKKwl1MzIJaWNyOworCXUzMglkbWFjcjsKKwl1MzIJZG1hdGRscjsKKwl1MzIJZG1hcmRscjsKKwl1MzIJaWRyOworCXUzMgl2ZXJzaW9uOworCXUzMglkcjsJCS8qIEN1cnJlbnRseSBvcGVyIGFzIDMyIGJpdHMsCisJCQkJdGhvdWdoIG9ubHkgbG93IDE2IGJpdHMgbWF0dGVycyAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGR3X3NwaTsKK3N0cnVjdCBkd19zcGlfZG1hX29wcyB7CisJaW50ICgqZG1hX2luaXQpKHN0cnVjdCBkd19zcGkgKmR3cyk7CisJdm9pZCAoKmRtYV9leGl0KShzdHJ1Y3QgZHdfc3BpICpkd3MpOworCWludCAoKmRtYV90cmFuc2Zlcikoc3RydWN0IGR3X3NwaSAqZHdzLCBpbnQgY3NfY2hhbmdlKTsKK307CisKK3N0cnVjdCBkd19zcGkgeworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisJc3RydWN0IHNwaV9kZXZpY2UJKmN1cl9kZXY7CisJc3RydWN0IGRldmljZQkJKnBhcmVudF9kZXY7CisJZW51bSBkd19zc2lfdHlwZQl0eXBlOworCWNoYXIJCQluYW1lWzE2XTsKKworCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJdW5zaWduZWQgbG9uZwkJcGFkZHI7CisJdTMyCQkJaW9sZW47CisJaW50CQkJaXJxOworCXUzMgkJCWZpZm9fbGVuOwkvKiBkZXB0aCBvZiB0aGUgRklGTyBidWZmZXIgKi8KKwl1MzIJCQltYXhfZnJlcTsJLyogbWF4IGJ1cyBmcmVxIHN1cHBvcnRlZCAqLworCisJdTE2CQkJYnVzX251bTsKKwl1MTYJCQludW1fY3M7CQkvKiBzdXBwb3J0ZWQgc2xhdmUgbnVtYmVycyAqLworCisJLyogRHJpdmVyIG1lc3NhZ2UgcXVldWUgKi8KKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqd29ya3F1ZXVlOworCXN0cnVjdCB3b3JrX3N0cnVjdAlwdW1wX21lc3NhZ2VzOworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKKwlpbnQJCQlidXN5OworCWludAkJCXJ1bjsKKworCS8qIE1lc3NhZ2UgVHJhbnNmZXIgcHVtcCAqLworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlwdW1wX3RyYW5zZmVyczsKKworCS8qIEN1cnJlbnQgbWVzc2FnZSB0cmFuc2ZlciBzdGF0ZSBpbmZvICovCisJc3RydWN0IHNwaV9tZXNzYWdlCSpjdXJfbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJKmN1cl90cmFuc2ZlcjsKKwlzdHJ1Y3QgY2hpcF9kYXRhCSpjdXJfY2hpcDsKKwlzdHJ1Y3QgY2hpcF9kYXRhCSpwcmV2X2NoaXA7CisJc2l6ZV90CQkJbGVuOworCXZvaWQJCQkqdHg7CisJdm9pZAkJCSp0eF9lbmQ7CisJdm9pZAkJCSpyeDsKKwl2b2lkCQkJKnJ4X2VuZDsKKwlpbnQJCQlkbWFfbWFwcGVkOworCWRtYV9hZGRyX3QJCXJ4X2RtYTsKKwlkbWFfYWRkcl90CQl0eF9kbWE7CisJc2l6ZV90CQkJcnhfbWFwX2xlbjsKKwlzaXplX3QJCQl0eF9tYXBfbGVuOworCXU4CQkJbl9ieXRlczsJLyogY3VycmVudCBpcyBhIDEvMiBieXRlcyBvcCAqLworCXU4CQkJbWF4X2JpdHNfcGVyX3dvcmQ7CS8qIG1heGltIGlzIDE2YiAqLworCXUzMgkJCWRtYV93aWR0aDsKKwlpbnQJCQljc19jaGFuZ2U7CisJaXJxcmV0dXJuX3QJCSgqdHJhbnNmZXJfaGFuZGxlcikoc3RydWN0IGR3X3NwaSAqZHdzKTsKKwl2b2lkCQkJKCpjc19jb250cm9sKSh1MzIgY29tbWFuZCk7CisKKwkvKiBEbWEgaW5mbyAqLworCWludAkJCWRtYV9pbml0ZWQ7CisJc3RydWN0IGRtYV9jaGFuCQkqdHhjaGFuOworCXN0cnVjdCBzY2F0dGVybGlzdAl0eF9zZ2w7CisJc3RydWN0IGRtYV9jaGFuCQkqcnhjaGFuOworCXN0cnVjdCBzY2F0dGVybGlzdAlyeF9zZ2w7CisJaW50CQkJZG1hX2NoYW5fZG9uZTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZG1hX2RldjsKKwlkbWFfYWRkcl90CQlkbWFfYWRkcjsgLyogcGh5IGFkZHJlc3Mgb2YgdGhlIERhdGEgcmVnaXN0ZXIgKi8KKwlzdHJ1Y3QgZHdfc3BpX2RtYV9vcHMJKmRtYV9vcHM7CisJdm9pZAkJCSpkbWFfcHJpdjsgLyogcGxhdGZvcm0gcmVsYXRlIGluZm8gKi8KKwlzdHJ1Y3QgcGNpX2RldgkJKmRtYWM7CisKKwkvKiBCdXMgaW50ZXJmYWNlIGluZm8gKi8KKwl2b2lkCQkJKnByaXY7CisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJc3RydWN0IGRlbnRyeSAqZGVidWdmczsKKyNlbmRpZgorfTsKKworI2RlZmluZSBkd19yZWFkbChkdywgbmFtZSkgXAorCV9fcmF3X3JlYWRsKCYoKChzdHJ1Y3QgZHdfc3BpX3JlZyAqKWR3LT5yZWdzKS0+bmFtZSkpCisjZGVmaW5lIGR3X3dyaXRlbChkdywgbmFtZSwgdmFsKSBcCisJX19yYXdfd3JpdGVsKCh2YWwpLCAmKCgoc3RydWN0IGR3X3NwaV9yZWcgKilkdy0+cmVncyktPm5hbWUpKQorI2RlZmluZSBkd19yZWFkdyhkdywgbmFtZSkgXAorCV9fcmF3X3JlYWR3KCYoKChzdHJ1Y3QgZHdfc3BpX3JlZyAqKWR3LT5yZWdzKS0+bmFtZSkpCisjZGVmaW5lIGR3X3dyaXRldyhkdywgbmFtZSwgdmFsKSBcCisJX19yYXdfd3JpdGV3KCh2YWwpLCAmKCgoc3RydWN0IGR3X3NwaV9yZWcgKilkdy0+cmVncyktPm5hbWUpKQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX2VuYWJsZV9jaGlwKHN0cnVjdCBkd19zcGkgKmR3cywgaW50IGVuYWJsZSkKK3sKKwlkd193cml0ZWwoZHdzLCBzc2llbnIsIChlbmFibGUgPyAxIDogMCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX3NldF9jbGsoc3RydWN0IGR3X3NwaSAqZHdzLCB1MTYgZGl2KQoreworCWR3X3dyaXRlbChkd3MsIGJhdWRyLCBkaXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX2NoaXBfc2VsKHN0cnVjdCBkd19zcGkgKmR3cywgdTE2IGNzKQoreworCWlmIChjcyA+IGR3cy0+bnVtX2NzKQorCQlyZXR1cm47CisKKwlpZiAoZHdzLT5jc19jb250cm9sKQorCQlkd3MtPmNzX2NvbnRyb2woMSk7CisKKwlkd193cml0ZWwoZHdzLCBzZXIsIDEgPDwgY3MpOworfQorCisvKiBEaXNhYmxlIElSUSBiaXRzICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX21hc2tfaW50cihzdHJ1Y3QgZHdfc3BpICpkd3MsIHUzMiBtYXNrKQoreworCXUzMiBuZXdfbWFzazsKKworCW5ld19tYXNrID0gZHdfcmVhZGwoZHdzLCBpbXIpICYgfm1hc2s7CisJZHdfd3JpdGVsKGR3cywgaW1yLCBuZXdfbWFzayk7Cit9CisKKy8qIEVuYWJsZSBJUlEgYml0cyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwaV91bWFza19pbnRyKHN0cnVjdCBkd19zcGkgKmR3cywgdTMyIG1hc2spCit7CisJdTMyIG5ld19tYXNrOworCisJbmV3X21hc2sgPSBkd19yZWFkbChkd3MsIGltcikgfCBtYXNrOworCWR3X3dyaXRlbChkd3MsIGltciwgbmV3X21hc2spOworfQorCisvKgorICogRWFjaCBTUEkgc2xhdmUgZGV2aWNlIHRvIHdvcmsgd2l0aCBkd19hcGkgY29udHJvbGxlciBzaG91bGQKKyAqIGhhcyBzdWNoIGEgc3RydWN0dXJlIGNsYWltaW5nIGl0cyB3b3JraW5nIG1vZGUgKFBJTy9ETUEgZXRjKSwKKyAqIHdoaWNoIGNhbiBiZSBzYXZlIGluIHRoZSAiY29udHJvbGxlcl9kYXRhIiBtZW1iZXIgb2YgdGhlCisgKiBzdHJ1Y3Qgc3BpX2RldmljZQorICovCitzdHJ1Y3QgZHdfc3BpX2NoaXAgeworCXU4IHBvbGxfbW9kZTsJLyogMCBmb3IgY29udG9sbGVyIHBvbGxpbmcgbW9kZSAqLworCXU4IHR5cGU7CS8qIFNQSS9TU1AvTWljcndpcmUgKi8KKwl1OCBlbmFibGVfZG1hOworCXZvaWQgKCpjc19jb250cm9sKSh1MzIgY29tbWFuZCk7Cit9OworCitleHRlcm4gaW50IGR3X3NwaV9hZGRfaG9zdChzdHJ1Y3QgZHdfc3BpICpkd3MpOworZXh0ZXJuIHZvaWQgZHdfc3BpX3JlbW92ZV9ob3N0KHN0cnVjdCBkd19zcGkgKmR3cyk7CitleHRlcm4gaW50IGR3X3NwaV9zdXNwZW5kX2hvc3Qoc3RydWN0IGR3X3NwaSAqZHdzKTsKK2V4dGVybiBpbnQgZHdfc3BpX3Jlc3VtZV9ob3N0KHN0cnVjdCBkd19zcGkgKmR3cyk7CitleHRlcm4gdm9pZCBkd19zcGlfeGZlcl9kb25lKHN0cnVjdCBkd19zcGkgKmR3cyk7CisKKy8qIHBsYXRmb3JtIHJlbGF0ZWQgc2V0dXAgKi8KK2V4dGVybiBpbnQgZHdfc3BpX21pZF9pbml0KHN0cnVjdCBkd19zcGkgKmR3cyk7IC8qIEludGVsIE1JRCBwbGF0Zm9ybXMgKi8KKyNlbmRpZiAvKiBEV19TUElfSEVBREVSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1lcDkzeHguYyBiL2RyaXZlcnMvc3BpL3NwaS1lcDkzeHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Y2NDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLWVwOTN4eC5jCkBAIC0wLDAgKzEsMTIxNyBAQAorLyoKKyAqIERyaXZlciBmb3IgQ2lycnVzIExvZ2ljIEVQOTN4eCBTUEkgY29udHJvbGxlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBNaWthIFdlc3RlcmJlcmcKKyAqCisgKiBFeHBsaWNpdCBGSUZPIGhhbmRsaW5nIGNvZGUgd2FzIGluc3BpcmVkIGJ5IGFtYmEtcGwwMjIgZHJpdmVyLgorICoKKyAqIENoaXAgc2VsZWN0IHN1cHBvcnQgdXNpbmcgb3RoZXIgdGhhbiBidWlsdC1pbiBHUElPcyBieSBILiBIYXJ0bGV5IFN3ZWV0ZW4uCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFNQSSBjb250cm9sbGVyIHNlZSBkb2N1bWVudGF0aW9uIG9uIENpcnJ1cworICogTG9naWMgd2ViIHNpdGU6CisgKiAgICAgaHR0cDovL3d3dy5jaXJydXMuY29tL2VuL3B1YnMvbWFudWFsL0VQOTN4eF9Vc2Vyc19HdWlkZV9VTTEucGRmCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvZXA5M3h4X3NwaS5oPgorCisjZGVmaW5lIFNTUENSMAkJCTB4MDAwMAorI2RlZmluZSBTU1BDUjBfTU9ERV9TSElGVAk2CisjZGVmaW5lIFNTUENSMF9TQ1JfU0hJRlQJOAorCisjZGVmaW5lIFNTUENSMQkJCTB4MDAwNAorI2RlZmluZSBTU1BDUjFfUklFCQlCSVQoMCkKKyNkZWZpbmUgU1NQQ1IxX1RJRQkJQklUKDEpCisjZGVmaW5lIFNTUENSMV9ST1JJRQkJQklUKDIpCisjZGVmaW5lIFNTUENSMV9MQk0JCUJJVCgzKQorI2RlZmluZSBTU1BDUjFfU1NFCQlCSVQoNCkKKyNkZWZpbmUgU1NQQ1IxX01TCQlCSVQoNSkKKyNkZWZpbmUgU1NQQ1IxX1NPRAkJQklUKDYpCisKKyNkZWZpbmUgU1NQRFIJCQkweDAwMDgKKworI2RlZmluZSBTU1BTUgkJCTB4MDAwYworI2RlZmluZSBTU1BTUl9URkUJCUJJVCgwKQorI2RlZmluZSBTU1BTUl9UTkYJCUJJVCgxKQorI2RlZmluZSBTU1BTUl9STkUJCUJJVCgyKQorI2RlZmluZSBTU1BTUl9SRkYJCUJJVCgzKQorI2RlZmluZSBTU1BTUl9CU1kJCUJJVCg0KQorI2RlZmluZSBTU1BDUFNSCQkJMHgwMDEwCisKKyNkZWZpbmUgU1NQSUlSCQkJMHgwMDE0CisjZGVmaW5lIFNTUElJUl9SSVMJCUJJVCgwKQorI2RlZmluZSBTU1BJSVJfVElTCQlCSVQoMSkKKyNkZWZpbmUgU1NQSUlSX1JPUklTCQlCSVQoMikKKyNkZWZpbmUgU1NQSUNSCQkJU1NQSUlSCisKKy8qIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIFNQSV9USU1FT1VUCQk1CisvKiBtYXhpbXVtIGRlcHRoIG9mIFJYL1RYIEZJRk8gKi8KKyNkZWZpbmUgU1BJX0ZJRk9fU0laRQkJOAorCisvKioKKyAqIHN0cnVjdCBlcDkzeHhfc3BpIC0gRVA5M3h4IFNQSSBjb250cm9sbGVyIHN0cnVjdHVyZQorICogQGxvY2s6IHNwaW5sb2NrIHRoYXQgcHJvdGVjdHMgY29uY3VycmVudCBhY2Nlc3NlcyB0byBmaWVsZHMgQHJ1bm5pbmcsCisgKiAgICAgICAgQGN1cnJlbnRfbXNnIGFuZCBAbXNnX3F1ZXVlCisgKiBAcGRldjogcG9pbnRlciB0byBwbGF0Zm9ybSBkZXZpY2UKKyAqIEBjbGs6IGNsb2NrIGZvciB0aGUgY29udHJvbGxlcgorICogQHJlZ3NfYmFzZTogcG9pbnRlciB0byBpb3JlbWFwKCknZCByZWdpc3RlcnMKKyAqIEBzc3Bkcl9waHlzOiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBTU1BEUiByZWdpc3RlcgorICogQGlycTogSVJRIG51bWJlciB1c2VkIGJ5IHRoZSBkcml2ZXIKKyAqIEBtaW5fcmF0ZTogbWluaW11bSBjbG9jayByYXRlIChpbiBIeikgc3VwcG9ydGVkIGJ5IHRoZSBjb250cm9sbGVyCisgKiBAbWF4X3JhdGU6IG1heGltdW0gY2xvY2sgcmF0ZSAoaW4gSHopIHN1cHBvcnRlZCBieSB0aGUgY29udHJvbGxlcgorICogQHJ1bm5pbmc6IGlzIHRoZSBxdWV1ZSBydW5uaW5nCisgKiBAd3E6IHdvcmtxdWV1ZSB1c2VkIGJ5IHRoZSBkcml2ZXIKKyAqIEBtc2dfd29yazogd29yayB0aGF0IGlzIHF1ZXVlZCBmb3IgdGhlIGRyaXZlcgorICogQHdhaXQ6IHdhaXQgaGVyZSB1bnRpbCBnaXZlbiB0cmFuc2ZlciBpcyBjb21wbGV0ZWQKKyAqIEBtc2dfcXVldWU6IHF1ZXVlIGZvciB0aGUgbWVzc2FnZXMKKyAqIEBjdXJyZW50X21zZzogbWVzc2FnZSB0aGF0IGlzIGN1cnJlbnRseSBwcm9jZXNzZWQgKG9yICVOVUxMIGlmIG5vbmUpCisgKiBAdHg6IGN1cnJlbnQgYnl0ZSBpbiB0cmFuc2ZlciB0byB0cmFuc21pdAorICogQHJ4OiBjdXJyZW50IGJ5dGUgaW4gdHJhbnNmZXIgdG8gcmVjZWl2ZQorICogQGZpZm9fbGV2ZWw6IGhvdyBmdWxsIGlzIEZJRk8gKCUwLi4lU1BJX0ZJRk9fU0laRSAtICUxKS4gUmVjZWl2aW5nIG9uZQorICogICAgICAgICAgICAgIGZyYW1lIGRlY3JlYXNlcyB0aGlzIGxldmVsIGFuZCBzZW5kaW5nIG9uZSBmcmFtZSBpbmNyZWFzZXMgaXQuCisgKiBAZG1hX3J4OiBSWCBETUEgY2hhbm5lbAorICogQGRtYV90eDogVFggRE1BIGNoYW5uZWwKKyAqIEBkbWFfcnhfZGF0YTogUlggcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIERNQSBlbmdpbmUKKyAqIEBkbWFfdHhfZGF0YTogVFggcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIERNQSBlbmdpbmUKKyAqIEByeF9zZ3Q6IHNnIHRhYmxlIGZvciBSWCB0cmFuc2ZlcnMKKyAqIEB0eF9zZ3Q6IHNnIHRhYmxlIGZvciBUWCB0cmFuc2ZlcnMKKyAqIEB6ZXJvcGFnZTogZHVtbXkgcGFnZSB1c2VkIGFzIFJYIGJ1ZmZlciB3aGVuIG9ubHkgVFggYnVmZmVyIGlzIHBhc3NlZCBpbiBieQorICogICAgICAgICAgICB0aGUgY2xpZW50CisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgRVA5M3h4IFNQSSBjb250cm9sbGVyIHNwZWNpZmljIGluZm9ybWF0aW9uLiBXaGVuCisgKiBAcnVubmluZyBpcyAldHJ1ZSwgZHJpdmVyIGFjY2VwdHMgdHJhbnNmZXIgcmVxdWVzdHMgZnJvbSBwcm90b2NvbCBkcml2ZXJzLgorICogQGN1cnJlbnRfbXNnIGlzIHVzZWQgdG8gaG9sZCBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIHRoYXQgaXMgY3VycmVudGx5CisgKiBwcm9jZXNzZWQuIElmIEBjdXJyZW50X21zZyBpcyAlTlVMTCwgaXQgbWVhbnMgdGhhdCBubyBwcm9jZXNzaW5nIGlzIGdvaW5nCisgKiBvbi4KKyAqCisgKiBNb3N0IG9mIHRoZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiBvbmNlIGFuZCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCB3aXRob3V0CisgKiB0YWtpbmcgdGhlIEBsb2NrLiBGaWVsZHMgdGhhdCBhcmUgYWNjZXNzZWQgY29uY3VycmVudGx5IGFyZTogQGN1cnJlbnRfbXNnLAorICogQHJ1bm5pbmcsIGFuZCBAbXNnX3F1ZXVlLgorICovCitzdHJ1Y3QgZXA5M3h4X3NwaSB7CisJc3BpbmxvY2tfdAkJCWxvY2s7CisJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKKwlzdHJ1Y3QgY2xrCQkJKmNsazsKKwl2b2lkIF9faW9tZW0JCQkqcmVnc19iYXNlOworCXVuc2lnbmVkIGxvbmcJCQlzc3Bkcl9waHlzOworCWludAkJCQlpcnE7CisJdW5zaWduZWQgbG9uZwkJCW1pbl9yYXRlOworCXVuc2lnbmVkIGxvbmcJCQltYXhfcmF0ZTsKKwlib29sCQkJCXJ1bm5pbmc7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSp3cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCW1zZ193b3JrOworCXN0cnVjdCBjb21wbGV0aW9uCQl3YWl0OworCXN0cnVjdCBsaXN0X2hlYWQJCW1zZ19xdWV1ZTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJCSpjdXJyZW50X21zZzsKKwlzaXplX3QJCQkJdHg7CisJc2l6ZV90CQkJCXJ4OworCXNpemVfdAkJCQlmaWZvX2xldmVsOworCXN0cnVjdCBkbWFfY2hhbgkJCSpkbWFfcng7CisJc3RydWN0IGRtYV9jaGFuCQkJKmRtYV90eDsKKwlzdHJ1Y3QgZXA5M3h4X2RtYV9kYXRhCQlkbWFfcnhfZGF0YTsKKwlzdHJ1Y3QgZXA5M3h4X2RtYV9kYXRhCQlkbWFfdHhfZGF0YTsKKwlzdHJ1Y3Qgc2dfdGFibGUJCQlyeF9zZ3Q7CisJc3RydWN0IHNnX3RhYmxlCQkJdHhfc2d0OworCXZvaWQJCQkJKnplcm9wYWdlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZXA5M3h4X3NwaV9jaGlwIC0gU1BJIGRldmljZSBoYXJkd2FyZSBzZXR0aW5ncworICogQHNwaTogYmFjayBwb2ludGVyIHRvIHRoZSBTUEkgZGV2aWNlCisgKiBAcmF0ZTogbWF4IHJhdGUgaW4gaHogdGhpcyBjaGlwIHN1cHBvcnRzCisgKiBAZGl2X2Nwc3I6IGNwc3IgKHByZS1zY2FsZXIpIGRpdmlkZXIKKyAqIEBkaXZfc2NyOiBzY3IgZGl2aWRlcgorICogQGRzczogYml0cyBwZXIgd29yZCAoNCAtIDE2IGJpdHMpCisgKiBAb3BzOiBwcml2YXRlIGNoaXAgb3BlcmF0aW9ucworICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RvcmUgaGFyZHdhcmUgcmVnaXN0ZXIgc3BlY2lmaWMgc2V0dGluZ3MgZm9yIGVhY2gKKyAqIFNQSSBkZXZpY2UuIFNldHRpbmdzIGFyZSB3cml0dGVuIHRvIGhhcmR3YXJlIGJ5IGZ1bmN0aW9uCisgKiBlcDkzeHhfc3BpX2NoaXBfc2V0dXAoKS4KKyAqLworc3RydWN0IGVwOTN4eF9zcGlfY2hpcCB7CisJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UJCSpzcGk7CisJdW5zaWduZWQgbG9uZwkJCXJhdGU7CisJdTgJCQkJZGl2X2Nwc3I7CisJdTgJCQkJZGl2X3NjcjsKKwl1OAkJCQlkc3M7CisJc3RydWN0IGVwOTN4eF9zcGlfY2hpcF9vcHMJKm9wczsKK307CisKKy8qIGNvbnZlcnRzIGJpdHMgcGVyIHdvcmQgdG8gQ1IwLkRTUyB2YWx1ZSAqLworI2RlZmluZSBiaXRzX3Blcl93b3JkX3RvX2RzcyhicHcpCSgoYnB3KSAtIDEpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZXA5M3h4X3NwaV93cml0ZV91OChjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSwgdTE2IHJlZywgdTggdmFsdWUpCit7CisJX19yYXdfd3JpdGViKHZhbHVlLCBlc3BpLT5yZWdzX2Jhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHU4CitlcDkzeHhfc3BpX3JlYWRfdTgoY29uc3Qgc3RydWN0IGVwOTN4eF9zcGkgKnNwaSwgdTE2IHJlZykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGIoc3BpLT5yZWdzX2Jhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2VwOTN4eF9zcGlfd3JpdGVfdTE2KGNvbnN0IHN0cnVjdCBlcDkzeHhfc3BpICplc3BpLCB1MTYgcmVnLCB1MTYgdmFsdWUpCit7CisJX19yYXdfd3JpdGV3KHZhbHVlLCBlc3BpLT5yZWdzX2Jhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHUxNgorZXA5M3h4X3NwaV9yZWFkX3UxNihjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaSAqc3BpLCB1MTYgcmVnKQoreworCXJldHVybiBfX3Jhd19yZWFkdyhzcGktPnJlZ3NfYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgZXA5M3h4X3NwaV9lbmFibGUoY29uc3Qgc3RydWN0IGVwOTN4eF9zcGkgKmVzcGkpCit7CisJdTggcmVndmFsOworCWludCBlcnI7CisKKwllcnIgPSBjbGtfZW5hYmxlKGVzcGktPmNsayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJlZ3ZhbCA9IGVwOTN4eF9zcGlfcmVhZF91OChlc3BpLCBTU1BDUjEpOworCXJlZ3ZhbCB8PSBTU1BDUjFfU1NFOworCWVwOTN4eF9zcGlfd3JpdGVfdTgoZXNwaSwgU1NQQ1IxLCByZWd2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVwOTN4eF9zcGlfZGlzYWJsZShjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSkKK3sKKwl1OCByZWd2YWw7CisKKwlyZWd2YWwgPSBlcDkzeHhfc3BpX3JlYWRfdTgoZXNwaSwgU1NQQ1IxKTsKKwlyZWd2YWwgJj0gflNTUENSMV9TU0U7CisJZXA5M3h4X3NwaV93cml0ZV91OChlc3BpLCBTU1BDUjEsIHJlZ3ZhbCk7CisKKwljbGtfZGlzYWJsZShlc3BpLT5jbGspOworfQorCitzdGF0aWMgdm9pZCBlcDkzeHhfc3BpX2VuYWJsZV9pbnRlcnJ1cHRzKGNvbnN0IHN0cnVjdCBlcDkzeHhfc3BpICplc3BpKQoreworCXU4IHJlZ3ZhbDsKKworCXJlZ3ZhbCA9IGVwOTN4eF9zcGlfcmVhZF91OChlc3BpLCBTU1BDUjEpOworCXJlZ3ZhbCB8PSAoU1NQQ1IxX1JPUklFIHwgU1NQQ1IxX1RJRSB8IFNTUENSMV9SSUUpOworCWVwOTN4eF9zcGlfd3JpdGVfdTgoZXNwaSwgU1NQQ1IxLCByZWd2YWwpOworfQorCitzdGF0aWMgdm9pZCBlcDkzeHhfc3BpX2Rpc2FibGVfaW50ZXJydXB0cyhjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSkKK3sKKwl1OCByZWd2YWw7CisKKwlyZWd2YWwgPSBlcDkzeHhfc3BpX3JlYWRfdTgoZXNwaSwgU1NQQ1IxKTsKKwlyZWd2YWwgJj0gfihTU1BDUjFfUk9SSUUgfCBTU1BDUjFfVElFIHwgU1NQQ1IxX1JJRSk7CisJZXA5M3h4X3NwaV93cml0ZV91OChlc3BpLCBTU1BDUjEsIHJlZ3ZhbCk7Cit9CisKKy8qKgorICogZXA5M3h4X3NwaV9jYWxjX2Rpdmlzb3JzKCkgLSBjYWxjdWxhdGVzIFNQSSBjbG9jayBkaXZpc29ycworICogQGVzcGk6IGVwOTN4eCBTUEkgY29udHJvbGxlciBzdHJ1Y3QKKyAqIEBjaGlwOiBkaXZpc29ycyBhcmUgY2FsY3VsYXRlZCBmb3IgdGhpcyBjaGlwCisgKiBAcmF0ZTogZGVzaXJlZCBTUEkgb3V0cHV0IGNsb2NrIHJhdGUKKyAqCisgKiBGdW5jdGlvbiBjYWxjdWxhdGVzIGNwc3IgKGNsb2NrIHByZS1zY2FsZXIpIGFuZCBzY3IgZGl2aXNvcnMgYmFzZWQgb24KKyAqIGdpdmVuIEByYXRlIGFuZCBwbGFjZXMgdGhlbSB0byBAY2hpcC0+ZGl2X2Nwc3IgYW5kIEBjaGlwLT5kaXZfc2NyLiBJZiwKKyAqIGZvciBzb21lIHJlYXNvbiwgZGl2aXNvcnMgY2Fubm90IGJlIGNhbGN1bGF0ZWQgbm90aGluZyBpcyBzdG9yZWQgYW5kCisgKiAlLUVJTlZBTCBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBlcDkzeHhfc3BpX2NhbGNfZGl2aXNvcnMoY29uc3Qgc3RydWN0IGVwOTN4eF9zcGkgKmVzcGksCisJCQkJICAgIHN0cnVjdCBlcDkzeHhfc3BpX2NoaXAgKmNoaXAsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNwaV9jbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShlc3BpLT5jbGspOworCWludCBjcHNyLCBzY3I7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IG1heCB2YWx1ZSBpcyBiZXR3ZWVuIHZhbHVlcyBzdXBwb3J0ZWQgYnkgdGhlCisJICogY29udHJvbGxlci4gTm90ZSB0aGF0IG1pbmltdW0gdmFsdWUgaXMgYWxyZWFkeSBjaGVja2VkIGluCisJICogZXA5M3h4X3NwaV90cmFuc2ZlcigpLgorCSAqLworCXJhdGUgPSBjbGFtcChyYXRlLCBlc3BpLT5taW5fcmF0ZSwgZXNwaS0+bWF4X3JhdGUpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgZGl2aXNvcnMgc28gdGhhdCB3ZSBjYW4gZ2V0IHNwZWVkIGFjY29yZGluZyB0aGUKKwkgKiBmb2xsb3dpbmcgZm9ybXVsYToKKwkgKglyYXRlID0gc3BpX2Nsb2NrX3JhdGUgLyAoY3BzciAqICgxICsgc2NyKSkKKwkgKgorCSAqIGNwc3IgbXVzdCBiZSBldmVuIG51bWJlciBhbmQgc3RhcnRzIGZyb20gMiwgc2NyIGNhbiBiZSBhbnkgbnVtYmVyCisJICogYmV0d2VlbiAwIGFuZCAyNTUuCisJICovCisJZm9yIChjcHNyID0gMjsgY3BzciA8PSAyNTQ7IGNwc3IgKz0gMikgeworCQlmb3IgKHNjciA9IDA7IHNjciA8PSAyNTU7IHNjcisrKSB7CisJCQlpZiAoKHNwaV9jbGtfcmF0ZSAvIChjcHNyICogKHNjciArIDEpKSkgPD0gcmF0ZSkgeworCQkJCWNoaXAtPmRpdl9zY3IgPSAodTgpc2NyOworCQkJCWNoaXAtPmRpdl9jcHNyID0gKHU4KWNwc3I7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgZXA5M3h4X3NwaV9jc19jb250cm9sKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGJvb2wgY29udHJvbCkKK3sKKwlzdHJ1Y3QgZXA5M3h4X3NwaV9jaGlwICpjaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7CisJaW50IHZhbHVlID0gKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSA/IGNvbnRyb2wgOiAhY29udHJvbDsKKworCWlmIChjaGlwLT5vcHMgJiYgY2hpcC0+b3BzLT5jc19jb250cm9sKQorCQljaGlwLT5vcHMtPmNzX2NvbnRyb2woc3BpLCB2YWx1ZSk7Cit9CisKKy8qKgorICogZXA5M3h4X3NwaV9zZXR1cCgpIC0gc2V0dXAgYW4gU1BJIGRldmljZQorICogQHNwaTogU1BJIGRldmljZSB0byBzZXR1cAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCBTUEkgZGV2aWNlIG1vZGUsIHNwZWVkIGV0Yy4gQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZQorICogdGltZXMgZm9yIGEgc2luZ2xlIGRldmljZS4gUmV0dXJucyAlMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGluCisgKiBjYXNlIG9mIGZhaWx1cmUuIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3MsIHRoZSBkZXZpY2UgaXMKKyAqIGRlc2VsZWN0ZWQuCisgKi8KK3N0YXRpYyBpbnQgZXA5M3h4X3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBlcDkzeHhfc3BpICplc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3RydWN0IGVwOTN4eF9zcGlfY2hpcCAqY2hpcDsKKworCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPCA0IHx8IHNwaS0+Yml0c19wZXJfd29yZCA+IDE2KSB7CisJCWRldl9lcnIoJmVzcGktPnBkZXYtPmRldiwgImludmFsaWQgYml0cyBwZXIgd29yZCAlZFxuIiwKKwkJCXNwaS0+Yml0c19wZXJfd29yZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKKwlpZiAoIWNoaXApIHsKKwkJZGV2X2RiZygmZXNwaS0+cGRldi0+ZGV2LCAiaW5pdGlhbCBzZXR1cCBmb3IgJXNcbiIsCisJCQlzcGktPm1vZGFsaWFzKTsKKworCQljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjaGlwKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJY2hpcC0+c3BpID0gc3BpOworCQljaGlwLT5vcHMgPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKworCQlpZiAoY2hpcC0+b3BzICYmIGNoaXAtPm9wcy0+c2V0dXApIHsKKwkJCWludCByZXQgPSBjaGlwLT5vcHMtPnNldHVwKHNwaSk7CisJCQlpZiAocmV0KSB7CisJCQkJa2ZyZWUoY2hpcCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCisJCXNwaV9zZXRfY3RsZGF0YShzcGksIGNoaXApOworCX0KKworCWlmIChzcGktPm1heF9zcGVlZF9oeiAhPSBjaGlwLT5yYXRlKSB7CisJCWludCBlcnI7CisKKwkJZXJyID0gZXA5M3h4X3NwaV9jYWxjX2Rpdmlzb3JzKGVzcGksIGNoaXAsIHNwaS0+bWF4X3NwZWVkX2h6KTsKKwkJaWYgKGVyciAhPSAwKSB7CisJCQlzcGlfc2V0X2N0bGRhdGEoc3BpLCBOVUxMKTsKKwkJCWtmcmVlKGNoaXApOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQljaGlwLT5yYXRlID0gc3BpLT5tYXhfc3BlZWRfaHo7CisJfQorCisJY2hpcC0+ZHNzID0gYml0c19wZXJfd29yZF90b19kc3Moc3BpLT5iaXRzX3Blcl93b3JkKTsKKworCWVwOTN4eF9zcGlfY3NfY29udHJvbChzcGksIGZhbHNlKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlcDkzeHhfc3BpX3RyYW5zZmVyKCkgLSBxdWV1ZSBtZXNzYWdlIHRvIGJlIHRyYW5zZmVycmVkCisgKiBAc3BpOiB0YXJnZXQgU1BJIGRldmljZQorICogQG1zZzogbWVzc2FnZSB0byBiZSB0cmFuc2ZlcnJlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFNQSSBkZXZpY2UgZHJpdmVycyB3aGVuIHRoZXkgYXJlIGdvaW5nIHRvIHRyYW5zZmVyCisgKiBhIG5ldyBtZXNzYWdlLiBJdCBzaW1wbHkgcHV0cyB0aGUgbWVzc2FnZSBpbiB0aGUgcXVldWUgYW5kIHNjaGVkdWxlcworICogd29ya3F1ZXVlIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCB0cmFuc2ZlciBsYXRlciBvbi4KKyAqCisgKiBSZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIGVycm9yIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBlcDkzeHhfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBlcDkzeHhfc3BpICplc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFtc2cgfHwgIW1zZy0+Y29tcGxldGUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZmlyc3QgdmFsaWRhdGUgZWFjaCB0cmFuc2ZlciAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCWlmICh0LT5iaXRzX3Blcl93b3JkKSB7CisJCQlpZiAodC0+Yml0c19wZXJfd29yZCA8IDQgfHwgdC0+Yml0c19wZXJfd29yZCA+IDE2KQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICh0LT5zcGVlZF9oeiAmJiB0LT5zcGVlZF9oeiA8IGVzcGktPm1pbl9yYXRlKQorCQkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogTm93IHRoYXQgd2Ugb3duIHRoZSBtZXNzYWdlLCBsZXQncyBpbml0aWFsaXplIGl0IHNvIHRoYXQgaXQgaXMKKwkgKiBzdWl0YWJsZSBmb3IgdXMuIFdlIHVzZSBAbXNnLT5zdGF0dXMgdG8gc2lnbmFsIHdoZXRoZXIgdGhlcmUgd2FzCisJICogZXJyb3IgaW4gdHJhbnNmZXIgYW5kIEBtc2ctPnN0YXRlIGlzIHVzZWQgdG8gaG9sZCBwb2ludGVyIHRvIHRoZQorCSAqIGN1cnJlbnQgdHJhbnNmZXIgKG9yICVOVUxMIGlmIG5vIGFjdGl2ZSBjdXJyZW50IHRyYW5zZmVyKS4KKwkgKi8KKwltc2ctPnN0YXRlID0gTlVMTDsKKwltc2ctPnN0YXR1cyA9IDA7CisJbXNnLT5hY3R1YWxfbGVuZ3RoID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlc3BpLT5sb2NrLCBmbGFncyk7CisJaWYgKCFlc3BpLT5ydW5uaW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVzcGktPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCWxpc3RfYWRkX3RhaWwoJm1zZy0+cXVldWUsICZlc3BpLT5tc2dfcXVldWUpOworCXF1ZXVlX3dvcmsoZXNwaS0+d3EsICZlc3BpLT5tc2dfd29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXNwaS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZXA5M3h4X3NwaV9jbGVhbnVwKCkgLSBjbGVhbnMgdXAgbWFzdGVyIGNvbnRyb2xsZXIgc3BlY2lmaWMgc3RhdGUKKyAqIEBzcGk6IFNQSSBkZXZpY2UgdG8gY2xlYW51cAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgbWFzdGVyIGNvbnRyb2xsZXIgc3BlY2lmaWMgc3RhdGUgZm9yIGdpdmVuIEBzcGkKKyAqIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgZXA5M3h4X3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGVwOTN4eF9zcGlfY2hpcCAqY2hpcDsKKworCWNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKKwlpZiAoY2hpcCkgeworCQlpZiAoY2hpcC0+b3BzICYmIGNoaXAtPm9wcy0+Y2xlYW51cCkKKwkJCWNoaXAtPm9wcy0+Y2xlYW51cChzcGkpOworCQlzcGlfc2V0X2N0bGRhdGEoc3BpLCBOVUxMKTsKKwkJa2ZyZWUoY2hpcCk7CisJfQorfQorCisvKioKKyAqIGVwOTN4eF9zcGlfY2hpcF9zZXR1cCgpIC0gY29uZmlndXJlcyBoYXJkd2FyZSBhY2NvcmRpbmcgdG8gZ2l2ZW4gQGNoaXAKKyAqIEBlc3BpOiBlcDkzeHggU1BJIGNvbnRyb2xsZXIgc3RydWN0CisgKiBAY2hpcDogY2hpcCBzcGVjaWZpYyBzZXR0aW5ncworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgYWN0dWFsIGhhcmR3YXJlIHJlZ2lzdGVycyB3aXRoIHNldHRpbmdzIGdpdmVuIGluCisgKiBAY2hpcC4gTm90ZSB0aGF0IG5vIHZhbGlkYXRpb24gaXMgZG9uZSBzbyBtYWtlIHN1cmUgdGhhdCBjYWxsZXJzIHZhbGlkYXRlCisgKiBzZXR0aW5ncyBiZWZvcmUgY2FsbGluZyB0aGlzLgorICovCitzdGF0aWMgdm9pZCBlcDkzeHhfc3BpX2NoaXBfc2V0dXAoY29uc3Qgc3RydWN0IGVwOTN4eF9zcGkgKmVzcGksCisJCQkJICBjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaV9jaGlwICpjaGlwKQoreworCXUxNiBjcjA7CisKKwljcjAgPSBjaGlwLT5kaXZfc2NyIDw8IFNTUENSMF9TQ1JfU0hJRlQ7CisJY3IwIHw9IChjaGlwLT5zcGktPm1vZGUgJiAoU1BJX0NQSEF8U1BJX0NQT0wpKSA8PCBTU1BDUjBfTU9ERV9TSElGVDsKKwljcjAgfD0gY2hpcC0+ZHNzOworCisJZGV2X2RiZygmZXNwaS0+cGRldi0+ZGV2LCAic2V0dXA6IG1vZGUgJWQsIGNwc3IgJWQsIHNjciAlZCwgZHNzICVkXG4iLAorCQljaGlwLT5zcGktPm1vZGUsIGNoaXAtPmRpdl9jcHNyLCBjaGlwLT5kaXZfc2NyLCBjaGlwLT5kc3MpOworCWRldl9kYmcoJmVzcGktPnBkZXYtPmRldiwgInNldHVwOiBjcjAgJSN4IiwgY3IwKTsKKworCWVwOTN4eF9zcGlfd3JpdGVfdTgoZXNwaSwgU1NQQ1BTUiwgY2hpcC0+ZGl2X2Nwc3IpOworCWVwOTN4eF9zcGlfd3JpdGVfdTE2KGVzcGksIFNTUENSMCwgY3IwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYml0c19wZXJfd29yZChjb25zdCBzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGVzcGktPmN1cnJlbnRfbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQgPSBtc2ctPnN0YXRlOworCisJcmV0dXJuIHQtPmJpdHNfcGVyX3dvcmQgPyB0LT5iaXRzX3Blcl93b3JkIDogbXNnLT5zcGktPmJpdHNfcGVyX3dvcmQ7Cit9CisKK3N0YXRpYyB2b2lkIGVwOTN4eF9kb193cml0ZShzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlpZiAoYml0c19wZXJfd29yZChlc3BpKSA+IDgpIHsKKwkJdTE2IHR4X3ZhbCA9IDA7CisKKwkJaWYgKHQtPnR4X2J1ZikKKwkJCXR4X3ZhbCA9ICgodTE2ICopdC0+dHhfYnVmKVtlc3BpLT50eF07CisJCWVwOTN4eF9zcGlfd3JpdGVfdTE2KGVzcGksIFNTUERSLCB0eF92YWwpOworCQllc3BpLT50eCArPSBzaXplb2YodHhfdmFsKTsKKwl9IGVsc2UgeworCQl1OCB0eF92YWwgPSAwOworCisJCWlmICh0LT50eF9idWYpCisJCQl0eF92YWwgPSAoKHU4ICopdC0+dHhfYnVmKVtlc3BpLT50eF07CisJCWVwOTN4eF9zcGlfd3JpdGVfdTgoZXNwaSwgU1NQRFIsIHR4X3ZhbCk7CisJCWVzcGktPnR4ICs9IHNpemVvZih0eF92YWwpOworCX0KK30KKworc3RhdGljIHZvaWQgZXA5M3h4X2RvX3JlYWQoc3RydWN0IGVwOTN4eF9zcGkgKmVzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJaWYgKGJpdHNfcGVyX3dvcmQoZXNwaSkgPiA4KSB7CisJCXUxNiByeF92YWw7CisKKwkJcnhfdmFsID0gZXA5M3h4X3NwaV9yZWFkX3UxNihlc3BpLCBTU1BEUik7CisJCWlmICh0LT5yeF9idWYpCisJCQkoKHUxNiAqKXQtPnJ4X2J1ZilbZXNwaS0+cnhdID0gcnhfdmFsOworCQllc3BpLT5yeCArPSBzaXplb2YocnhfdmFsKTsKKwl9IGVsc2UgeworCQl1OCByeF92YWw7CisKKwkJcnhfdmFsID0gZXA5M3h4X3NwaV9yZWFkX3U4KGVzcGksIFNTUERSKTsKKwkJaWYgKHQtPnJ4X2J1ZikKKwkJCSgodTggKil0LT5yeF9idWYpW2VzcGktPnJ4XSA9IHJ4X3ZhbDsKKwkJZXNwaS0+cnggKz0gc2l6ZW9mKHJ4X3ZhbCk7CisJfQorfQorCisvKioKKyAqIGVwOTN4eF9zcGlfcmVhZF93cml0ZSgpIC0gcGVyZm9ybSBuZXh0IFJYL1RYIHRyYW5zZmVyCisgKiBAZXNwaTogZXA5M3h4IFNQSSBjb250cm9sbGVyIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmZXJzIG5leHQgYnl0ZXMgKG9yIGhhbGYtd29yZHMpIHRvL2Zyb20gUlgvVFggRklGT3MuIElmCisgKiBjYWxsZWQgc2V2ZXJhbCB0aW1lcywgdGhlIHdob2xlIHRyYW5zZmVyIHdpbGwgYmUgY29tcGxldGVkLiBSZXR1cm5zCisgKiAlLUVJTlBST0dSRVNTIHdoZW4gY3VycmVudCB0cmFuc2ZlciB3YXMgbm90IHlldCBjb21wbGV0ZWQgb3RoZXJ3aXNlICUwLgorICoKKyAqIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBmaW5pc2hlZCwgUlggRklGTyBzaG91bGQgYmUgZW1wdHkgYW5kIFRYIEZJRk8gc2hvdWxkIGJlCisgKiBmdWxsLgorICovCitzdGF0aWMgaW50IGVwOTN4eF9zcGlfcmVhZF93cml0ZShzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGVzcGktPmN1cnJlbnRfbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQgPSBtc2ctPnN0YXRlOworCisJLyogcmVhZCBhcyBsb25nIGFzIFJYIEZJRk8gaGFzIGZyYW1lcyBpbiBpdCAqLworCXdoaWxlICgoZXA5M3h4X3NwaV9yZWFkX3U4KGVzcGksIFNTUFNSKSAmIFNTUFNSX1JORSkpIHsKKwkJZXA5M3h4X2RvX3JlYWQoZXNwaSwgdCk7CisJCWVzcGktPmZpZm9fbGV2ZWwtLTsKKwl9CisKKwkvKiB3cml0ZSBhcyBsb25nIGFzIFRYIEZJRk8gaGFzIHJvb20gKi8KKwl3aGlsZSAoZXNwaS0+Zmlmb19sZXZlbCA8IFNQSV9GSUZPX1NJWkUgJiYgZXNwaS0+dHggPCB0LT5sZW4pIHsKKwkJZXA5M3h4X2RvX3dyaXRlKGVzcGksIHQpOworCQllc3BpLT5maWZvX2xldmVsKys7CisJfQorCisJaWYgKGVzcGktPnJ4ID09IHQtPmxlbikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgdm9pZCBlcDkzeHhfc3BpX3Bpb190cmFuc2ZlcihzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSkKK3sKKwkvKgorCSAqIE5vdyBldmVyeXRoaW5nIGlzIHNldCB1cCBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmZXIuIFdlIHByaW1lIHRoZSBUWAorCSAqIEZJRk8sIGVuYWJsZSBpbnRlcnJ1cHRzLCBhbmQgd2FpdCBmb3IgdGhlIHRyYW5zZmVyIHRvIGNvbXBsZXRlLgorCSAqLworCWlmIChlcDkzeHhfc3BpX3JlYWRfd3JpdGUoZXNwaSkpIHsKKwkJZXA5M3h4X3NwaV9lbmFibGVfaW50ZXJydXB0cyhlc3BpKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmZXNwaS0+d2FpdCk7CisJfQorfQorCisvKioKKyAqIGVwOTN4eF9zcGlfZG1hX3ByZXBhcmUoKSAtIHByZXBhcmVzIGEgRE1BIHRyYW5zZmVyCisgKiBAZXNwaTogZXA5M3h4IFNQSSBjb250cm9sbGVyIHN0cnVjdAorICogQGRpcjogRE1BIHRyYW5zZmVyIGRpcmVjdGlvbgorICoKKyAqIEZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIERNQSwgbWFwcyB0aGUgYnVmZmVyIGFuZCBwcmVwYXJlcyB0aGUgRE1BCisgKiBkZXNjcmlwdG9yLiBSZXR1cm5zIGEgdmFsaWQgRE1BIGRlc2NyaXB0b3IgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBFUlJfUFRSCisgKiBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorZXA5M3h4X3NwaV9kbWFfcHJlcGFyZShzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQgPSBlc3BpLT5jdXJyZW50X21zZy0+c3RhdGU7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eGQ7CisJZW51bSBkbWFfc2xhdmVfYnVzd2lkdGggYnVzd2lkdGg7CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY29uZjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXN0cnVjdCBzZ190YWJsZSAqc2d0OworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwljb25zdCB2b2lkICpidWYsICpwYnVmOworCXNpemVfdCBsZW4gPSB0LT5sZW47CisJaW50IGksIHJldCwgbmVudHM7CisKKwlpZiAoYml0c19wZXJfd29yZChlc3BpKSA+IDgpCisJCWJ1c3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM7CisJZWxzZQorCQlidXN3aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7CisKKwltZW1zZXQoJmNvbmYsIDAsIHNpemVvZihjb25mKSk7CisJY29uZi5kaXJlY3Rpb24gPSBkaXI7CisKKwlpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkgeworCQljaGFuID0gZXNwaS0+ZG1hX3J4OworCQlidWYgPSB0LT5yeF9idWY7CisJCXNndCA9ICZlc3BpLT5yeF9zZ3Q7CisKKwkJY29uZi5zcmNfYWRkciA9IGVzcGktPnNzcGRyX3BoeXM7CisJCWNvbmYuc3JjX2FkZHJfd2lkdGggPSBidXN3aWR0aDsKKwl9IGVsc2UgeworCQljaGFuID0gZXNwaS0+ZG1hX3R4OworCQlidWYgPSB0LT50eF9idWY7CisJCXNndCA9ICZlc3BpLT50eF9zZ3Q7CisKKwkJY29uZi5kc3RfYWRkciA9IGVzcGktPnNzcGRyX3BoeXM7CisJCWNvbmYuZHN0X2FkZHJfd2lkdGggPSBidXN3aWR0aDsKKwl9CisKKwlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKGNoYW4sICZjb25mKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIHNwbGl0IHRoZSB0cmFuc2ZlciBpbnRvIFBBR0VfU0laRSdkIGNodW5rcy4gVGhpcyBpcworCSAqIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIEBlc3BpLT56ZXJvcGFnZSB0byBwcm92aWRlIGEgemVybyBSWCBidWZmZXIKKwkgKiBmb3IgdGhlIFRYIHRyYW5zZmVycyBhbmQgd2UgaGF2ZSBvbmx5IGFsbG9jYXRlZCBvbmUgcGFnZSBmb3IgdGhhdC4KKwkgKgorCSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIGFsbG9jYXRlIGEgbmV3IHNnX3RhYmxlIG9ubHkgd2hlbgorCSAqIG5lZWRlZC4gT3RoZXJ3aXNlIHdlIHdpbGwgcmUtdXNlIHRoZSBjdXJyZW50IG9uZS4gRXZlbnR1YWxseSB0aGUKKwkgKiBsYXN0IHNnX3RhYmxlIGlzIHJlbGVhc2VkIGluIGVwOTN4eF9zcGlfcmVsZWFzZV9kbWEoKS4KKwkgKi8KKworCW5lbnRzID0gRElWX1JPVU5EX1VQKGxlbiwgUEFHRV9TSVpFKTsKKwlpZiAobmVudHMgIT0gc2d0LT5uZW50cykgeworCQlzZ19mcmVlX3RhYmxlKHNndCk7CisKKwkJcmV0ID0gc2dfYWxsb2NfdGFibGUoc2d0LCBuZW50cywgR0ZQX0tFUk5FTCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXBidWYgPSBidWY7CisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXNpemVfdCBieXRlcyA9IG1pbl90KHNpemVfdCwgbGVuLCBQQUdFX1NJWkUpOworCisJCWlmIChidWYpIHsKKwkJCXNnX3NldF9wYWdlKHNnLCB2aXJ0X3RvX3BhZ2UocGJ1ZiksIGJ5dGVzLAorCQkJCSAgICBvZmZzZXRfaW5fcGFnZShwYnVmKSk7CisJCX0gZWxzZSB7CisJCQlzZ19zZXRfcGFnZShzZywgdmlydF90b19wYWdlKGVzcGktPnplcm9wYWdlKSwKKwkJCQkgICAgYnl0ZXMsIDApOworCQl9CisKKwkJcGJ1ZiArPSBieXRlczsKKwkJbGVuIC09IGJ5dGVzOworCX0KKworCWlmIChXQVJOX09OKGxlbikpIHsKKwkJZGV2X3dhcm4oJmVzcGktPnBkZXYtPmRldiwgImxlbiA9ICVkIGV4cGVjdGVkIDAhIiwgbGVuKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJbmVudHMgPSBkbWFfbWFwX3NnKGNoYW4tPmRldmljZS0+ZGV2LCBzZ3QtPnNnbCwgc2d0LT5uZW50cywgZGlyKTsKKwlpZiAoIW5lbnRzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXR4ZCA9IGNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbiwgc2d0LT5zZ2wsIG5lbnRzLAorCQkJCQkJIGRpciwgRE1BX0NUUkxfQUNLKTsKKwlpZiAoIXR4ZCkgeworCQlkbWFfdW5tYXBfc2coY2hhbi0+ZGV2aWNlLT5kZXYsIHNndC0+c2dsLCBzZ3QtPm5lbnRzLCBkaXIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJcmV0dXJuIHR4ZDsKK30KKworLyoqCisgKiBlcDkzeHhfc3BpX2RtYV9maW5pc2goKSAtIGZpbmlzaGVzIHdpdGggYSBETUEgdHJhbnNmZXIKKyAqIEBlc3BpOiBlcDkzeHggU1BJIGNvbnRyb2xsZXIgc3RydWN0CisgKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uCisgKgorICogRnVuY3Rpb24gZmluaXNoZXMgd2l0aCB0aGUgRE1BIHRyYW5zZmVyLiBBZnRlciB0aGlzLCB0aGUgRE1BIGJ1ZmZlciBpcworICogdW5tYXBwZWQuCisgKi8KK3N0YXRpYyB2b2lkIGVwOTN4eF9zcGlfZG1hX2ZpbmlzaChzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSwKKwkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CisJc3RydWN0IHNnX3RhYmxlICpzZ3Q7CisKKwlpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkgeworCQljaGFuID0gZXNwaS0+ZG1hX3J4OworCQlzZ3QgPSAmZXNwaS0+cnhfc2d0OworCX0gZWxzZSB7CisJCWNoYW4gPSBlc3BpLT5kbWFfdHg7CisJCXNndCA9ICZlc3BpLT50eF9zZ3Q7CisJfQorCisJZG1hX3VubWFwX3NnKGNoYW4tPmRldmljZS0+ZGV2LCBzZ3QtPnNnbCwgc2d0LT5uZW50cywgZGlyKTsKK30KKworc3RhdGljIHZvaWQgZXA5M3h4X3NwaV9kbWFfY2FsbGJhY2sodm9pZCAqY2FsbGJhY2tfcGFyYW0pCit7CisJY29tcGxldGUoY2FsbGJhY2tfcGFyYW0pOworfQorCitzdGF0aWMgdm9pZCBlcDkzeHhfc3BpX2RtYV90cmFuc2ZlcihzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGVzcGktPmN1cnJlbnRfbXNnOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqcnhkLCAqdHhkOworCisJcnhkID0gZXA5M3h4X3NwaV9kbWFfcHJlcGFyZShlc3BpLCBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChJU19FUlIocnhkKSkgeworCQlkZXZfZXJyKCZlc3BpLT5wZGV2LT5kZXYsICJETUEgUlggZmFpbGVkOiAlbGRcbiIsIFBUUl9FUlIocnhkKSk7CisJCW1zZy0+c3RhdHVzID0gUFRSX0VSUihyeGQpOworCQlyZXR1cm47CisJfQorCisJdHhkID0gZXA5M3h4X3NwaV9kbWFfcHJlcGFyZShlc3BpLCBETUFfVE9fREVWSUNFKTsKKwlpZiAoSVNfRVJSKHR4ZCkpIHsKKwkJZXA5M3h4X3NwaV9kbWFfZmluaXNoKGVzcGksIERNQV9GUk9NX0RFVklDRSk7CisJCWRldl9lcnIoJmVzcGktPnBkZXYtPmRldiwgIkRNQSBUWCBmYWlsZWQ6ICVsZFxuIiwgUFRSX0VSUihyeGQpKTsKKwkJbXNnLT5zdGF0dXMgPSBQVFJfRVJSKHR4ZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBXZSBhcmUgcmVhZHkgd2hlbiBSWCBpcyBkb25lICovCisJcnhkLT5jYWxsYmFjayA9IGVwOTN4eF9zcGlfZG1hX2NhbGxiYWNrOworCXJ4ZC0+Y2FsbGJhY2tfcGFyYW0gPSAmZXNwaS0+d2FpdDsKKworCS8qIE5vdyBzdWJtaXQgYm90aCBkZXNjcmlwdG9ycyBhbmQgd2FpdCB3aGlsZSB0aGV5IGZpbmlzaCAqLworCWRtYWVuZ2luZV9zdWJtaXQocnhkKTsKKwlkbWFlbmdpbmVfc3VibWl0KHR4ZCk7CisKKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhlc3BpLT5kbWFfcngpOworCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKGVzcGktPmRtYV90eCk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZlc3BpLT53YWl0KTsKKworCWVwOTN4eF9zcGlfZG1hX2ZpbmlzaChlc3BpLCBETUFfVE9fREVWSUNFKTsKKwllcDkzeHhfc3BpX2RtYV9maW5pc2goZXNwaSwgRE1BX0ZST01fREVWSUNFKTsKK30KKworLyoqCisgKiBlcDkzeHhfc3BpX3Byb2Nlc3NfdHJhbnNmZXIoKSAtIHByb2Nlc3NlcyBvbmUgU1BJIHRyYW5zZmVyCisgKiBAZXNwaTogZXA5M3h4IFNQSSBjb250cm9sbGVyIHN0cnVjdAorICogQG1zZzogY3VycmVudCBtZXNzYWdlCisgKiBAdDogdHJhbnNmZXIgdG8gcHJvY2VzcworICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIG9uZSBTUEkgdHJhbnNmZXIgZ2l2ZW4gaW4gQHQuIEZ1bmN0aW9uIHdhaXRzIHVudGlsCisgKiB0cmFuc2ZlciBpcyBjb21wbGV0ZSAobWF5IHNsZWVwKSBhbmQgdXBkYXRlcyBAbXNnLT5zdGF0dXMgYmFzZWQgb24gd2hldGhlcgorICogdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgb3Igbm90LgorICovCitzdGF0aWMgdm9pZCBlcDkzeHhfc3BpX3Byb2Nlc3NfdHJhbnNmZXIoc3RydWN0IGVwOTN4eF9zcGkgKmVzcGksCisJCQkJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnLAorCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBlcDkzeHhfc3BpX2NoaXAgKmNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEobXNnLT5zcGkpOworCisJbXNnLT5zdGF0ZSA9IHQ7CisKKwkvKgorCSAqIEhhbmRsZSBhbnkgdHJhbnNmZXIgc3BlY2lmaWMgc2V0dGluZ3MgaWYgbmVlZGVkLiBXZSB1c2UKKwkgKiB0ZW1wb3JhcnkgY2hpcCBzZXR0aW5ncyBoZXJlIGFuZCByZXN0b3JlIG9yaWdpbmFsIGxhdGVyIHdoZW4KKwkgKiB0aGUgdHJhbnNmZXIgaXMgZmluaXNoZWQuCisJICovCisJaWYgKHQtPnNwZWVkX2h6IHx8IHQtPmJpdHNfcGVyX3dvcmQpIHsKKwkJc3RydWN0IGVwOTN4eF9zcGlfY2hpcCB0bXBfY2hpcCA9ICpjaGlwOworCisJCWlmICh0LT5zcGVlZF9oeikgeworCQkJaW50IGVycjsKKworCQkJZXJyID0gZXA5M3h4X3NwaV9jYWxjX2Rpdmlzb3JzKGVzcGksICZ0bXBfY2hpcCwKKwkJCQkJCSAgICAgICB0LT5zcGVlZF9oeik7CisJCQlpZiAoZXJyKSB7CisJCQkJZGV2X2VycigmZXNwaS0+cGRldi0+ZGV2LAorCQkJCQkiZmFpbGVkIHRvIGFkanVzdCBzcGVlZFxuIik7CisJCQkJbXNnLT5zdGF0dXMgPSBlcnI7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJaWYgKHQtPmJpdHNfcGVyX3dvcmQpCisJCQl0bXBfY2hpcC5kc3MgPSBiaXRzX3Blcl93b3JkX3RvX2Rzcyh0LT5iaXRzX3Blcl93b3JkKTsKKworCQkvKgorCQkgKiBTZXQgdXAgdGVtcG9yYXJ5IG5ldyBodyBzZXR0aW5ncyBmb3IgdGhpcyB0cmFuc2Zlci4KKwkJICovCisJCWVwOTN4eF9zcGlfY2hpcF9zZXR1cChlc3BpLCAmdG1wX2NoaXApOworCX0KKworCWVzcGktPnJ4ID0gMDsKKwllc3BpLT50eCA9IDA7CisKKwkvKgorCSAqIFRoZXJlIGlzIG5vIHBvaW50IG9mIHNldHRpbmcgdXAgRE1BIGZvciB0aGUgdHJhbnNmZXJzIHdoaWNoIHdpbGwKKwkgKiBmaXQgaW50byB0aGUgRklGTyBhbmQgY2FuIGJlIHRyYW5zZmVycmVkIHdpdGggYSBzaW5nbGUgaW50ZXJydXB0LgorCSAqIFNvIGluIHRoZXNlIGNhc2VzIHdlIHdpbGwgYmUgdXNpbmcgUElPIGFuZCBkb24ndCBib3RoZXIgZm9yIERNQS4KKwkgKi8KKwlpZiAoZXNwaS0+ZG1hX3J4ICYmIHQtPmxlbiA+IFNQSV9GSUZPX1NJWkUpCisJCWVwOTN4eF9zcGlfZG1hX3RyYW5zZmVyKGVzcGkpOworCWVsc2UKKwkJZXA5M3h4X3NwaV9waW9fdHJhbnNmZXIoZXNwaSk7CisKKwkvKgorCSAqIEluIGNhc2Ugb2YgZXJyb3IgZHVyaW5nIHRyYW5zbWl0LCB3ZSBiYWlsIG91dCBmcm9tIHByb2Nlc3NpbmcKKwkgKiB0aGUgbWVzc2FnZS4KKwkgKi8KKwlpZiAobXNnLT5zdGF0dXMpCisJCXJldHVybjsKKworCW1zZy0+YWN0dWFsX2xlbmd0aCArPSB0LT5sZW47CisKKwkvKgorCSAqIEFmdGVyIHRoaXMgdHJhbnNmZXIgaXMgZmluaXNoZWQsIHBlcmZvcm0gYW55IHBvc3NpYmxlCisJICogcG9zdC10cmFuc2ZlciBhY3Rpb25zIHJlcXVlc3RlZCBieSB0aGUgcHJvdG9jb2wgZHJpdmVyLgorCSAqLworCWlmICh0LT5kZWxheV91c2VjcykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQodXNlY3NfdG9famlmZmllcyh0LT5kZWxheV91c2VjcykpOworCX0KKwlpZiAodC0+Y3NfY2hhbmdlKSB7CisJCWlmICghbGlzdF9pc19sYXN0KCZ0LT50cmFuc2Zlcl9saXN0LCAmbXNnLT50cmFuc2ZlcnMpKSB7CisJCQkvKgorCQkJICogSW4gY2FzZSBwcm90b2NvbCBkcml2ZXIgaXMgYXNraW5nIHVzIHRvIGRyb3AgdGhlCisJCQkgKiBjaGlwc2VsZWN0IGJyaWVmbHksIHdlIGxldCB0aGUgc2NoZWR1bGVyIHRvIGhhbmRsZQorCQkJICogYW55ICJkZWxheSIgaGVyZS4KKwkJCSAqLworCQkJZXA5M3h4X3NwaV9jc19jb250cm9sKG1zZy0+c3BpLCBmYWxzZSk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCWVwOTN4eF9zcGlfY3NfY29udHJvbChtc2ctPnNwaSwgdHJ1ZSk7CisJCX0KKwl9CisKKwlpZiAodC0+c3BlZWRfaHogfHwgdC0+Yml0c19wZXJfd29yZCkKKwkJZXA5M3h4X3NwaV9jaGlwX3NldHVwKGVzcGksIGNoaXApOworfQorCisvKgorICogZXA5M3h4X3NwaV9wcm9jZXNzX21lc3NhZ2UoKSAtIHByb2Nlc3Mgb25lIFNQSSBtZXNzYWdlCisgKiBAZXNwaTogZXA5M3h4IFNQSSBjb250cm9sbGVyIHN0cnVjdAorICogQG1zZzogbWVzc2FnZSB0byBwcm9jZXNzCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgYSBzaW5nbGUgU1BJIG1lc3NhZ2UuIFdlIGdvIHRocm91Z2ggYWxsIHRyYW5zZmVycyBpbgorICogdGhlIG1lc3NhZ2UgYW5kIHBhc3MgdGhlbSB0byBlcDkzeHhfc3BpX3Byb2Nlc3NfdHJhbnNmZXIoKS4gQ2hpcHNlbGVjdCBpcworICogYXNzZXJ0ZWQgZHVyaW5nIHRoZSB3aG9sZSBtZXNzYWdlICh1bmxlc3MgcGVyIHRyYW5zZmVyIGNzX2NoYW5nZSBpcyBzZXQpLgorICoKKyAqIEBtc2ctPnN0YXR1cyBjb250YWlucyAlMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mCisgKiBmYWlsdXJlLgorICovCitzdGF0aWMgdm9pZCBlcDkzeHhfc3BpX3Byb2Nlc3NfbWVzc2FnZShzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSwKKwkJCQkgICAgICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CisJaW50IGVycjsKKworCS8qCisJICogRW5hYmxlIHRoZSBTUEkgY29udHJvbGxlciBhbmQgaXRzIGNsb2NrLgorCSAqLworCWVyciA9IGVwOTN4eF9zcGlfZW5hYmxlKGVzcGkpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmZXNwaS0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBTUEkgY29udHJvbGxlclxuIik7CisJCW1zZy0+c3RhdHVzID0gZXJyOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBKdXN0IHRvIGJlIHN1cmU6IGZsdXNoIGFueSBkYXRhIGZyb20gUlggRklGTy4KKwkgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoU1BJX1RJTUVPVVQpOworCXdoaWxlIChlcDkzeHhfc3BpX3JlYWRfdTE2KGVzcGksIFNTUFNSKSAmIFNTUFNSX1JORSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJZGV2X3dhcm4oJmVzcGktPnBkZXYtPmRldiwKKwkJCQkgInRpbWVvdXQgd2hpbGUgZmx1c2hpbmcgUlggRklGT1xuIik7CisJCQltc2ctPnN0YXR1cyA9IC1FVElNRURPVVQ7CisJCQlyZXR1cm47CisJCX0KKwkJZXA5M3h4X3NwaV9yZWFkX3UxNihlc3BpLCBTU1BEUik7CisJfQorCisJLyoKKwkgKiBXZSBleHBsaWNpdGx5IGhhbmRsZSBGSUZPIGxldmVsLiBUaGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIFRYCisJICogRklGTyBzdGF0dXMgdXNpbmcgJVNTUFNSX1RORiBiaXQgd2hpY2ggbWF5IGNhdXNlIFJYIEZJRk8gb3ZlcnJ1bnMuCisJICovCisJZXNwaS0+Zmlmb19sZXZlbCA9IDA7CisKKwkvKgorCSAqIFVwZGF0ZSBTUEkgY29udHJvbGxlciByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHNwaSBkZXZpY2UgYW5kIGFzc2VydAorCSAqIHRoZSBjaGlwc2VsZWN0LgorCSAqLworCWVwOTN4eF9zcGlfY2hpcF9zZXR1cChlc3BpLCBzcGlfZ2V0X2N0bGRhdGEobXNnLT5zcGkpKTsKKwllcDkzeHhfc3BpX2NzX2NvbnRyb2wobXNnLT5zcGksIHRydWUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJZXA5M3h4X3NwaV9wcm9jZXNzX3RyYW5zZmVyKGVzcGksIG1zZywgdCk7CisJCWlmIChtc2ctPnN0YXR1cykKKwkJCWJyZWFrOworCX0KKworCS8qCisJICogTm93IHRoZSB3aG9sZSBtZXNzYWdlIGlzIHRyYW5zZmVycmVkIChvciBmYWlsZWQgZm9yIHNvbWUgcmVhc29uKS4gV2UKKwkgKiBkZXNlbGVjdCB0aGUgZGV2aWNlIGFuZCBkaXNhYmxlIHRoZSBTUEkgY29udHJvbGxlci4KKwkgKi8KKwllcDkzeHhfc3BpX2NzX2NvbnRyb2wobXNnLT5zcGksIGZhbHNlKTsKKwllcDkzeHhfc3BpX2Rpc2FibGUoZXNwaSk7Cit9CisKKyNkZWZpbmUgd29ya190b19lc3BpKHdvcmspIChjb250YWluZXJfb2YoKHdvcmspLCBzdHJ1Y3QgZXA5M3h4X3NwaSwgbXNnX3dvcmspKQorCisvKioKKyAqIGVwOTN4eF9zcGlfd29yaygpIC0gRVA5M3h4IFNQSSB3b3JrcXVldWUgd29ya2VyIGZ1bmN0aW9uCisgKiBAd29yazogd29yayBzdHJ1Y3QKKyAqCisgKiBXb3JrcXVldWUgd29ya2VyIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGFyZSBuZXcKKyAqIFNQSSBtZXNzYWdlcyB0byBiZSBwcm9jZXNzZWQuIE1lc3NhZ2UgaXMgdGFrZW4gb3V0IGZyb20gdGhlIHF1ZXVlIGFuZCB0aGVuCisgKiBwYXNzZWQgdG8gZXA5M3h4X3NwaV9wcm9jZXNzX21lc3NhZ2UoKS4KKyAqCisgKiBBZnRlciBtZXNzYWdlIGlzIHRyYW5zZmVycmVkLCBwcm90b2NvbCBkcml2ZXIgaXMgbm90aWZpZWQgYnkgY2FsbGluZworICogQG1zZy0+Y29tcGxldGUoKS4gSW4gY2FzZSBvZiBlcnJvciwgQG1zZy0+c3RhdHVzIGlzIHNldCB0byBuZWdhdGl2ZSBlcnJvcgorICogbnVtYmVyLCBvdGhlcndpc2UgaXQgY29udGFpbnMgemVybyAoYW5kIEBtc2ctPmFjdHVhbF9sZW5ndGggaXMgdXBkYXRlZCkuCisgKi8KK3N0YXRpYyB2b2lkIGVwOTN4eF9zcGlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGVwOTN4eF9zcGkgKmVzcGkgPSB3b3JrX3RvX2VzcGkod29yayk7CisJc3RydWN0IHNwaV9tZXNzYWdlICptc2c7CisKKwlzcGluX2xvY2tfaXJxKCZlc3BpLT5sb2NrKTsKKwlpZiAoIWVzcGktPnJ1bm5pbmcgfHwgZXNwaS0+Y3VycmVudF9tc2cgfHwKKwkJbGlzdF9lbXB0eSgmZXNwaS0+bXNnX3F1ZXVlKSkgeworCQlzcGluX3VubG9ja19pcnEoJmVzcGktPmxvY2spOworCQlyZXR1cm47CisJfQorCW1zZyA9IGxpc3RfZmlyc3RfZW50cnkoJmVzcGktPm1zZ19xdWV1ZSwgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7CisJbGlzdF9kZWxfaW5pdCgmbXNnLT5xdWV1ZSk7CisJZXNwaS0+Y3VycmVudF9tc2cgPSBtc2c7CisJc3Bpbl91bmxvY2tfaXJxKCZlc3BpLT5sb2NrKTsKKworCWVwOTN4eF9zcGlfcHJvY2Vzc19tZXNzYWdlKGVzcGksIG1zZyk7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgY3VycmVudCBtZXNzYWdlIGFuZCByZS1zY2hlZHVsZSBvdXJzZWx2ZXMgaWYgdGhlcmUgYXJlCisJICogbW9yZSBtZXNzYWdlcyBpbiB0aGUgcXVldWUuCisJICovCisJc3Bpbl9sb2NrX2lycSgmZXNwaS0+bG9jayk7CisJZXNwaS0+Y3VycmVudF9tc2cgPSBOVUxMOworCWlmIChlc3BpLT5ydW5uaW5nICYmICFsaXN0X2VtcHR5KCZlc3BpLT5tc2dfcXVldWUpKQorCQlxdWV1ZV93b3JrKGVzcGktPndxLCAmZXNwaS0+bXNnX3dvcmspOworCXNwaW5fdW5sb2NrX2lycSgmZXNwaS0+bG9jayk7CisKKwkvKiBub3RpZnkgdGhlIHByb3RvY29sIGRyaXZlciB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhpcyBtZXNzYWdlICovCisJbXNnLT5jb21wbGV0ZShtc2ctPmNvbnRleHQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZXA5M3h4X3NwaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBlcDkzeHhfc3BpICplc3BpID0gZGV2X2lkOworCXU4IGlycV9zdGF0dXMgPSBlcDkzeHhfc3BpX3JlYWRfdTgoZXNwaSwgU1NQSUlSKTsKKworCS8qCisJICogSWYgd2UgZ290IFJPUiAocmVjZWl2ZSBvdmVycnVuKSBpbnRlcnJ1cHQgd2Uga25vdyB0aGF0IHNvbWV0aGluZyBpcworCSAqIHdyb25nLiBKdXN0IGFib3J0IHRoZSBtZXNzYWdlLgorCSAqLworCWlmICh1bmxpa2VseShpcnFfc3RhdHVzICYgU1NQSUlSX1JPUklTKSkgeworCQkvKiBjbGVhciB0aGUgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKwkJZXA5M3h4X3NwaV93cml0ZV91OChlc3BpLCBTU1BJQ1IsIDApOworCQlkZXZfd2FybigmZXNwaS0+cGRldi0+ZGV2LAorCQkJICJyZWNlaXZlIG92ZXJydW4sIGFib3J0aW5nIHRoZSBtZXNzYWdlXG4iKTsKKwkJZXNwaS0+Y3VycmVudF9tc2ctPnN0YXR1cyA9IC1FSU87CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSW50ZXJydXB0IGlzIGVpdGhlciBSWCAoUklTKSBvciBUWCAoVElTKS4gRm9yIGJvdGggY2FzZXMgd2UKKwkJICogc2ltcGx5IGV4ZWN1dGUgbmV4dCBkYXRhIHRyYW5zZmVyLgorCQkgKi8KKwkJaWYgKGVwOTN4eF9zcGlfcmVhZF93cml0ZShlc3BpKSkgeworCQkJLyoKKwkJCSAqIEluIG5vcm1hbCBjYXNlLCB0aGVyZSBzdGlsbCBpcyBzb21lIHByb2Nlc3NpbmcgbGVmdAorCQkJICogZm9yIGN1cnJlbnQgdHJhbnNmZXIuIExldCdzIHdhaXQgZm9yIHRoZSBuZXh0CisJCQkgKiBpbnRlcnJ1cHQgdGhlbi4KKwkJCSAqLworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJfQorCisJLyoKKwkgKiBDdXJyZW50IHRyYW5zZmVyIGlzIGZpbmlzaGVkLCBlaXRoZXIgd2l0aCBlcnJvciBvciB3aXRoIHN1Y2Nlc3MuIEluCisJICogYW55IGNhc2Ugd2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBub3RpZnkgdGhlIHdvcmtlciB0byBoYW5kbGUKKwkgKiBhbnkgcG9zdC1wcm9jZXNzaW5nIG9mIHRoZSBtZXNzYWdlLgorCSAqLworCWVwOTN4eF9zcGlfZGlzYWJsZV9pbnRlcnJ1cHRzKGVzcGkpOworCWNvbXBsZXRlKCZlc3BpLT53YWl0KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBib29sIGVwOTN4eF9zcGlfZG1hX2ZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKmZpbHRlcl9wYXJhbSkKK3sKKwlpZiAoZXA5M3h4X2RtYV9jaGFuX2lzX20ycChjaGFuKSkKKwkJcmV0dXJuIGZhbHNlOworCisJY2hhbi0+cHJpdmF0ZSA9IGZpbHRlcl9wYXJhbTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBlcDkzeHhfc3BpX3NldHVwX2RtYShzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSkKK3sKKwlkbWFfY2FwX21hc2tfdCBtYXNrOworCWludCByZXQ7CisKKwllc3BpLT56ZXJvcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghZXNwaS0+emVyb3BhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJZG1hX2NhcF96ZXJvKG1hc2spOworCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgbWFzayk7CisKKwllc3BpLT5kbWFfcnhfZGF0YS5wb3J0ID0gRVA5M1hYX0RNQV9TU1A7CisJZXNwaS0+ZG1hX3J4X2RhdGEuZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCWVzcGktPmRtYV9yeF9kYXRhLm5hbWUgPSAiZXA5M3h4LXNwaS1yeCI7CisKKwllc3BpLT5kbWFfcnggPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGVwOTN4eF9zcGlfZG1hX2ZpbHRlciwKKwkJCQkJICAgJmVzcGktPmRtYV9yeF9kYXRhKTsKKwlpZiAoIWVzcGktPmRtYV9yeCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfZnJlZV9wYWdlOworCX0KKworCWVzcGktPmRtYV90eF9kYXRhLnBvcnQgPSBFUDkzWFhfRE1BX1NTUDsKKwllc3BpLT5kbWFfdHhfZGF0YS5kaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOworCWVzcGktPmRtYV90eF9kYXRhLm5hbWUgPSAiZXA5M3h4LXNwaS10eCI7CisKKwllc3BpLT5kbWFfdHggPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGVwOTN4eF9zcGlfZG1hX2ZpbHRlciwKKwkJCQkJICAgJmVzcGktPmRtYV90eF9kYXRhKTsKKwlpZiAoIWVzcGktPmRtYV90eCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfcmVsZWFzZV9yeDsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbF9yZWxlYXNlX3J4OgorCWRtYV9yZWxlYXNlX2NoYW5uZWwoZXNwaS0+ZG1hX3J4KTsKKwllc3BpLT5kbWFfcnggPSBOVUxMOworZmFpbF9mcmVlX3BhZ2U6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWVzcGktPnplcm9wYWdlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVwOTN4eF9zcGlfcmVsZWFzZV9kbWEoc3RydWN0IGVwOTN4eF9zcGkgKmVzcGkpCit7CisJaWYgKGVzcGktPmRtYV9yeCkgeworCQlkbWFfcmVsZWFzZV9jaGFubmVsKGVzcGktPmRtYV9yeCk7CisJCXNnX2ZyZWVfdGFibGUoJmVzcGktPnJ4X3NndCk7CisJfQorCWlmIChlc3BpLT5kbWFfdHgpIHsKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChlc3BpLT5kbWFfdHgpOworCQlzZ19mcmVlX3RhYmxlKCZlc3BpLT50eF9zZ3QpOworCX0KKworCWlmIChlc3BpLT56ZXJvcGFnZSkKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWVzcGktPnplcm9wYWdlKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZXA5M3h4X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IGVwOTN4eF9zcGlfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgZXJyb3I7CisKKwlpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZigqZXNwaSkpOworCWlmICghbWFzdGVyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBzcGkgbWFzdGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWFzdGVyLT5zZXR1cCA9IGVwOTN4eF9zcGlfc2V0dXA7CisJbWFzdGVyLT50cmFuc2ZlciA9IGVwOTN4eF9zcGlfdHJhbnNmZXI7CisJbWFzdGVyLT5jbGVhbnVwID0gZXA5M3h4X3NwaV9jbGVhbnVwOworCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBpbmZvLT5udW1fY2hpcHNlbGVjdDsKKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CisKKwllc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJZXNwaS0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKGVzcGktPmNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBzcGkgY2xvY2tcbiIpOworCQllcnJvciA9IFBUUl9FUlIoZXNwaS0+Y2xrKTsKKwkJZ290byBmYWlsX3JlbGVhc2VfbWFzdGVyOworCX0KKworCXNwaW5fbG9ja19pbml0KCZlc3BpLT5sb2NrKTsKKwlpbml0X2NvbXBsZXRpb24oJmVzcGktPndhaXQpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgbWF4aW11bSBhbmQgbWluaW11bSBzdXBwb3J0ZWQgY2xvY2sgcmF0ZXMKKwkgKiBmb3IgdGhlIGNvbnRyb2xsZXIuCisJICovCisJZXNwaS0+bWF4X3JhdGUgPSBjbGtfZ2V0X3JhdGUoZXNwaS0+Y2xrKSAvIDI7CisJZXNwaS0+bWluX3JhdGUgPSBjbGtfZ2V0X3JhdGUoZXNwaS0+Y2xrKSAvICgyNTQgKiAyNTYpOworCWVzcGktPnBkZXYgPSBwZGV2OworCisJZXNwaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoZXNwaS0+aXJxIDwgMCkgeworCQllcnJvciA9IC1FQlVTWTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBpcnEgcmVzb3VyY2VzXG4iKTsKKwkJZ290byBmYWlsX3B1dF9jbG9jazsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgaW9tZW0gcmVzb3VyY2VcbiIpOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9wdXRfY2xvY2s7CisJfQorCisJcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlcXVlc3QgaW9tZW0gcmVzb3VyY2VzXG4iKTsKKwkJZXJyb3IgPSAtRUJVU1k7CisJCWdvdG8gZmFpbF9wdXRfY2xvY2s7CisJfQorCisJZXNwaS0+c3NwZHJfcGh5cyA9IHJlcy0+c3RhcnQgKyBTU1BEUjsKKwllc3BpLT5yZWdzX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFlc3BpLT5yZWdzX2Jhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIG1hcCByZXNvdXJjZXNcbiIpOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9mcmVlX21lbTsKKwl9CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGVzcGktPmlycSwgZXA5M3h4X3NwaV9pbnRlcnJ1cHQsIDAsCisJCQkgICAgImVwOTN4eC1zcGkiLCBlc3BpKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxXG4iKTsKKwkJZ290byBmYWlsX3VubWFwX3JlZ3M7CisJfQorCisJaWYgKGluZm8tPnVzZV9kbWEgJiYgZXA5M3h4X3NwaV9zZXR1cF9kbWEoZXNwaSkpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJETUEgc2V0dXAgZmFpbGVkLiBGYWxsaW5nIGJhY2sgdG8gUElPXG4iKTsKKworCWVzcGktPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImVwOTN4eF9zcGlkIik7CisJaWYgKCFlc3BpLT53cSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIik7CisJCWdvdG8gZmFpbF9mcmVlX2RtYTsKKwl9CisJSU5JVF9XT1JLKCZlc3BpLT5tc2dfd29yaywgZXA5M3h4X3NwaV93b3JrKTsKKwlJTklUX0xJU1RfSEVBRCgmZXNwaS0+bXNnX3F1ZXVlKTsKKwllc3BpLT5ydW5uaW5nID0gdHJ1ZTsKKworCS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBoYXJkd2FyZSBpcyBkaXNhYmxlZCAqLworCWVwOTN4eF9zcGlfd3JpdGVfdTgoZXNwaSwgU1NQQ1IxLCAwKTsKKworCWVycm9yID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgU1BJIG1hc3RlclxuIik7CisJCWdvdG8gZmFpbF9mcmVlX3F1ZXVlOworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJFUDkzeHggU1BJIENvbnRyb2xsZXIgYXQgMHglMDhseCBpcnEgJWRcbiIsCisJCSAodW5zaWduZWQgbG9uZylyZXMtPnN0YXJ0LCBlc3BpLT5pcnEpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfZnJlZV9xdWV1ZToKKwlkZXN0cm95X3dvcmtxdWV1ZShlc3BpLT53cSk7CitmYWlsX2ZyZWVfZG1hOgorCWVwOTN4eF9zcGlfcmVsZWFzZV9kbWEoZXNwaSk7CisJZnJlZV9pcnEoZXNwaS0+aXJxLCBlc3BpKTsKK2ZhaWxfdW5tYXBfcmVnczoKKwlpb3VubWFwKGVzcGktPnJlZ3NfYmFzZSk7CitmYWlsX2ZyZWVfbWVtOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworZmFpbF9wdXRfY2xvY2s6CisJY2xrX3B1dChlc3BpLT5jbGspOworZmFpbF9yZWxlYXNlX21hc3RlcjoKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBlcDkzeHhfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZXA5M3h4X3NwaSAqZXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXNwaW5fbG9ja19pcnEoJmVzcGktPmxvY2spOworCWVzcGktPnJ1bm5pbmcgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnEoJmVzcGktPmxvY2spOworCisJZGVzdHJveV93b3JrcXVldWUoZXNwaS0+d3EpOworCisJLyoKKwkgKiBDb21wbGV0ZSByZW1haW5pbmcgbWVzc2FnZXMgd2l0aCAlLUVTSFVURE9XTiBzdGF0dXMuCisJICovCisJc3Bpbl9sb2NrX2lycSgmZXNwaS0+bG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZlc3BpLT5tc2dfcXVldWUpKSB7CisJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnOworCisJCW1zZyA9IGxpc3RfZmlyc3RfZW50cnkoJmVzcGktPm1zZ19xdWV1ZSwKKwkJCQkgICAgICAgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7CisJCWxpc3RfZGVsX2luaXQoJm1zZy0+cXVldWUpOworCQltc2ctPnN0YXR1cyA9IC1FU0hVVERPV047CisJCXNwaW5fdW5sb2NrX2lycSgmZXNwaS0+bG9jayk7CisJCW1zZy0+Y29tcGxldGUobXNnLT5jb250ZXh0KTsKKwkJc3Bpbl9sb2NrX2lycSgmZXNwaS0+bG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmZXNwaS0+bG9jayk7CisKKwllcDkzeHhfc3BpX3JlbGVhc2VfZG1hKGVzcGkpOworCWZyZWVfaXJxKGVzcGktPmlycSwgZXNwaSk7CisJaW91bm1hcChlc3BpLT5yZWdzX2Jhc2UpOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJY2xrX3B1dChlc3BpLT5jbGspOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGVwOTN4eF9zcGlfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJlcDkzeHgtc3BpIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGVwOTN4eF9zcGlfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVwOTN4eF9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmVwOTN4eF9zcGlfZHJpdmVyLCBlcDkzeHhfc3BpX3Byb2JlKTsKK30KK21vZHVsZV9pbml0KGVwOTN4eF9zcGlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlcDkzeHhfc3BpX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZXA5M3h4X3NwaV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZXA5M3h4X3NwaV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJFUDkzeHggU1BJIENvbnRyb2xsZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0Bpa2kuZmk+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmVwOTN4eC1zcGkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtZXNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlNDk5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtZXNwaS5jCkBAIC0wLDAgKzEsNzYyIEBACisvKgorICogRnJlZXNjYWxlIGVTUEkgY29udHJvbGxlciBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCisjaW5jbHVkZSAic3BpLWZzbC1saWIuaCIKKworLyogZVNQSSBDb250cm9sbGVyIHJlZ2lzdGVycyAqLworc3RydWN0IGZzbF9lc3BpX3JlZyB7CisJX19iZTMyIG1vZGU7CQkvKiAweDAwMCAtIGVTUEkgbW9kZSByZWdpc3RlciAqLworCV9fYmUzMiBldmVudDsJCS8qIDB4MDA0IC0gZVNQSSBldmVudCByZWdpc3RlciAqLworCV9fYmUzMiBtYXNrOwkJLyogMHgwMDggLSBlU1BJIG1hc2sgcmVnaXN0ZXIgKi8KKwlfX2JlMzIgY29tbWFuZDsJCS8qIDB4MDBjIC0gZVNQSSBjb21tYW5kIHJlZ2lzdGVyICovCisJX19iZTMyIHRyYW5zbWl0OwkvKiAweDAxMCAtIGVTUEkgdHJhbnNtaXQgRklGTyBhY2Nlc3MgcmVnaXN0ZXIqLworCV9fYmUzMiByZWNlaXZlOwkJLyogMHgwMTQgLSBlU1BJIHJlY2VpdmUgRklGTyBhY2Nlc3MgcmVnaXN0ZXIqLworCXU4IHJlc1s4XTsJCS8qIDB4MDE4IC0gMHgwMWMgcmVzZXJ2ZWQgKi8KKwlfX2JlMzIgY3Ntb2RlWzRdOwkvKiAweDAyMCAtIDB4MDJjIGVTUEkgY3MgbW9kZSByZWdpc3RlciAqLworfTsKKworc3RydWN0IGZzbF9lc3BpX3RyYW5zZmVyIHsKKwljb25zdCB2b2lkICp0eF9idWY7CisJdm9pZCAqcnhfYnVmOworCXVuc2lnbmVkIGxlbjsKKwl1bnNpZ25lZCBuX3R4OworCXVuc2lnbmVkIG5fcng7CisJdW5zaWduZWQgYWN0dWFsX2xlbmd0aDsKKwlpbnQgc3RhdHVzOworfTsKKworLyogZVNQSSBDb250cm9sbGVyIG1vZGUgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU1BNT0RFX0VOQUJMRQkJKDEgPDwgMzEpCisjZGVmaW5lIFNQTU9ERV9MT09QCQkoMSA8PCAzMCkKKyNkZWZpbmUgU1BNT0RFX1RYVEhSKHgpCQkoKHgpIDw8IDgpCisjZGVmaW5lIFNQTU9ERV9SWFRIUih4KQkJKCh4KSA8PCAwKQorCisvKiBlU1BJIENvbnRyb2xsZXIgQ1MgbW9kZSByZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBDU01PREVfQ0lfSU5BQ1RJVkVISUdICSgxIDw8IDMxKQorI2RlZmluZSBDU01PREVfQ1BfQkVHSU5fRURHRUNMSwkoMSA8PCAzMCkKKyNkZWZpbmUgQ1NNT0RFX1JFVgkJKDEgPDwgMjkpCisjZGVmaW5lIENTTU9ERV9ESVYxNgkJKDEgPDwgMjgpCisjZGVmaW5lIENTTU9ERV9QTSh4KQkJKCh4KSA8PCAyNCkKKyNkZWZpbmUgQ1NNT0RFX1BPTF8xCQkoMSA8PCAyMCkKKyNkZWZpbmUgQ1NNT0RFX0xFTih4KQkJKCh4KSA8PCAxNikKKyNkZWZpbmUgQ1NNT0RFX0JFRih4KQkJKCh4KSA8PCAxMikKKyNkZWZpbmUgQ1NNT0RFX0FGVCh4KQkJKCh4KSA8PCA4KQorI2RlZmluZSBDU01PREVfQ0coeCkJCSgoeCkgPDwgMykKKworLyogRGVmYXVsdCBtb2RlL2NzbW9kZSBmb3IgZVNQSSBjb250cm9sbGVyICovCisjZGVmaW5lIFNQTU9ERV9JTklUX1ZBTCAoU1BNT0RFX1RYVEhSKDQpIHwgU1BNT0RFX1JYVEhSKDMpKQorI2RlZmluZSBDU01PREVfSU5JVF9WQUwgKENTTU9ERV9QT0xfMSB8IENTTU9ERV9CRUYoMCkgXAorCQl8IENTTU9ERV9BRlQoMCkgfCBDU01PREVfQ0coMSkpCisKKy8qIFNQSUUgcmVnaXN0ZXIgdmFsdWVzICovCisjZGVmaW5lCVNQSUVfTkUJCTB4MDAwMDAyMDAJLyogTm90IGVtcHR5ICovCisjZGVmaW5lCVNQSUVfTkYJCTB4MDAwMDAxMDAJLyogTm90IGZ1bGwgKi8KKworLyogU1BJTSByZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUJU1BJTV9ORQkJMHgwMDAwMDIwMAkvKiBOb3QgZW1wdHkgKi8KKyNkZWZpbmUJU1BJTV9ORgkJMHgwMDAwMDEwMAkvKiBOb3QgZnVsbCAqLworI2RlZmluZSBTUElFX1JYQ05UKHJlZykgICAgICgocmVnID4+IDI0KSAmIDB4M0YpCisjZGVmaW5lIFNQSUVfVFhDTlQocmVnKSAgICAgKChyZWcgPj4gMTYpICYgMHgzRikKKworLyogU1BDT00gcmVnaXN0ZXIgdmFsdWVzICovCisjZGVmaW5lIFNQQ09NX0NTKHgpCQkoKHgpIDw8IDMwKQorI2RlZmluZSBTUENPTV9UUkFOTEVOKHgpCSgoeCkgPDwgMCkKKyNkZWZpbmUJU1BDT01fVFJBTkxFTl9NQVgJMHhGRkZGCS8qIE1heCB0cmFuc2FjdGlvbiBsZW5ndGggKi8KKworc3RhdGljIHZvaWQgZnNsX2VzcGlfY2hhbmdlX21vZGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlzdHJ1Y3Qgc3BpX21wYzh4eHhfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7CisJX19iZTMyIF9faW9tZW0gKm1vZGUgPSAmcmVnX2Jhc2UtPmNzbW9kZVtzcGktPmNoaXBfc2VsZWN0XTsKKwlfX2JlMzIgX19pb21lbSAqZXNwaV9tb2RlID0gJnJlZ19iYXNlLT5tb2RlOworCXUzMiB0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFR1cm4gb2ZmIElSUXMgbG9jYWxseSB0byBtaW5pbWl6ZSB0aW1lIHRoYXQgU1BJIGlzIGRpc2FibGVkLiAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIFR1cm4gb2ZmIFNQSSB1bml0IHByaW9yIGNoYW5naW5nIG1vZGUgKi8KKwl0bXAgPSBtcGM4eHh4X3NwaV9yZWFkX3JlZyhlc3BpX21vZGUpOworCW1wYzh4eHhfc3BpX3dyaXRlX3JlZyhlc3BpX21vZGUsIHRtcCAmIH5TUE1PREVfRU5BQkxFKTsKKwltcGM4eHh4X3NwaV93cml0ZV9yZWcobW9kZSwgY3MtPmh3X21vZGUpOworCW1wYzh4eHhfc3BpX3dyaXRlX3JlZyhlc3BpX21vZGUsIHRtcCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB1MzIgZnNsX2VzcGlfdHhfYnVmX2xzYihzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpKQoreworCXUzMiBkYXRhOworCXUxNiBkYXRhX2g7CisJdTE2IGRhdGFfbDsKKwljb25zdCB1MzIgKnR4ID0gbXBjOHh4eF9zcGktPnR4OworCisJaWYgKCF0eCkKKwkJcmV0dXJuIDA7CisKKwlkYXRhID0gKnR4KysgPDwgbXBjOHh4eF9zcGktPnR4X3NoaWZ0OworCWRhdGFfbCA9IGRhdGEgJiAweGZmZmY7CisJZGF0YV9oID0gKGRhdGEgPj4gMTYpICYgMHhmZmZmOworCXN3YWIxNnMoJmRhdGFfbCk7CisJc3dhYjE2cygmZGF0YV9oKTsKKwlkYXRhID0gZGF0YV9oIHwgZGF0YV9sOworCisJbXBjOHh4eF9zcGktPnR4ID0gdHg7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgZnNsX2VzcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJaW50IGJpdHNfcGVyX3dvcmQgPSAwOworCXU4IHBtOworCXUzMiBoeiA9IDA7CisJc3RydWN0IHNwaV9tcGM4eHh4X2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKworCWlmICh0KSB7CisJCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOworCQloeiA9IHQtPnNwZWVkX2h6OworCX0KKworCS8qIHNwaV90cmFuc2ZlciBsZXZlbCBjYWxscyB0aGF0IHdvcmsgcGVyLXdvcmQgKi8KKwlpZiAoIWJpdHNfcGVyX3dvcmQpCisJCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisKKwkvKiBNYWtlIHN1cmUgaXRzIGEgYml0IHdpZHRoIHdlIHN1cHBvcnQgWzQuLjE2XSAqLworCWlmICgoYml0c19wZXJfd29yZCA8IDQpIHx8IChiaXRzX3Blcl93b3JkID4gMTYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghaHopCisJCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CisKKwljcy0+cnhfc2hpZnQgPSAwOworCWNzLT50eF9zaGlmdCA9IDA7CisJY3MtPmdldF9yeCA9IG1wYzh4eHhfc3BpX3J4X2J1Zl91MzI7CisJY3MtPmdldF90eCA9IG1wYzh4eHhfc3BpX3R4X2J1Zl91MzI7CisJaWYgKGJpdHNfcGVyX3dvcmQgPD0gOCkgeworCQljcy0+cnhfc2hpZnQgPSA4IC0gYml0c19wZXJfd29yZDsKKwl9IGVsc2UgaWYgKGJpdHNfcGVyX3dvcmQgPD0gMTYpIHsKKwkJY3MtPnJ4X3NoaWZ0ID0gMTYgLSBiaXRzX3Blcl93b3JkOworCQlpZiAoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkKKwkJCWNzLT5nZXRfdHggPSBmc2xfZXNwaV90eF9idWZfbHNiOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1wYzh4eHhfc3BpLT5yeF9zaGlmdCA9IGNzLT5yeF9zaGlmdDsKKwltcGM4eHh4X3NwaS0+dHhfc2hpZnQgPSBjcy0+dHhfc2hpZnQ7CisJbXBjOHh4eF9zcGktPmdldF9yeCA9IGNzLT5nZXRfcng7CisJbXBjOHh4eF9zcGktPmdldF90eCA9IGNzLT5nZXRfdHg7CisKKwliaXRzX3Blcl93b3JkID0gYml0c19wZXJfd29yZCAtIDE7CisKKwkvKiBtYXNrIG91dCBiaXRzIHdlIGFyZSBnb2luZyB0byBzZXQgKi8KKwljcy0+aHdfbW9kZSAmPSB+KENTTU9ERV9MRU4oMHhGKSB8IENTTU9ERV9ESVYxNiB8IENTTU9ERV9QTSgweEYpKTsKKworCWNzLT5od19tb2RlIHw9IENTTU9ERV9MRU4oYml0c19wZXJfd29yZCk7CisKKwlpZiAoKG1wYzh4eHhfc3BpLT5zcGlicmcgLyBoeikgPiA2NCkgeworCQljcy0+aHdfbW9kZSB8PSBDU01PREVfRElWMTY7CisJCXBtID0gKG1wYzh4eHhfc3BpLT5zcGlicmcgLSAxKSAvIChoeiAqIDY0KSArIDE7CisKKwkJV0FSTl9PTkNFKHBtID4gMTYsICIlczogUmVxdWVzdGVkIHNwZWVkIGlzIHRvbyBsb3c6ICVkIEh6LiAiCisJCQkgICJXaWxsIHVzZSAlZCBIeiBpbnN0ZWFkLlxuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSwKKwkJCSAgaHosIG1wYzh4eHhfc3BpLT5zcGlicmcgLyAxMDI0KTsKKwkJaWYgKHBtID4gMTYpCisJCQlwbSA9IDE2OworCX0gZWxzZSB7CisJCXBtID0gKG1wYzh4eHhfc3BpLT5zcGlicmcgLSAxKSAvIChoeiAqIDQpICsgMTsKKwl9CisJaWYgKHBtKQorCQlwbS0tOworCisJY3MtPmh3X21vZGUgfD0gQ1NNT0RFX1BNKHBtKTsKKworCWZzbF9lc3BpX2NoYW5nZV9tb2RlKHNwaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNsX2VzcGlfY3B1X2J1ZnMoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LAorCQl1bnNpZ25lZCBpbnQgbGVuKQoreworCXUzMiB3b3JkOworCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7CisKKwltc3BpLT5jb3VudCA9IGxlbjsKKworCS8qIGVuYWJsZSByeCBpbnRzICovCisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bWFzaywgU1BJTV9ORSk7CisKKwkvKiB0cmFuc21pdCB3b3JkICovCisJd29yZCA9IG1zcGktPmdldF90eChtc3BpKTsKKwltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT50cmFuc21pdCwgd29yZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2xfZXNwaV9idWZzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlID0gbXBjOHh4eF9zcGktPnJlZ19iYXNlOworCXVuc2lnbmVkIGludCBsZW4gPSB0LT5sZW47CisJdTggYml0c19wZXJfd29yZDsKKwlpbnQgcmV0OworCisJYml0c19wZXJfd29yZCA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwlpZiAodC0+Yml0c19wZXJfd29yZCkKKwkJYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7CisKKwltcGM4eHh4X3NwaS0+bGVuID0gdC0+bGVuOworCWxlbiA9IHJvdW5kdXAobGVuLCA0KSAvIDQ7CisKKwltcGM4eHh4X3NwaS0+dHggPSB0LT50eF9idWY7CisJbXBjOHh4eF9zcGktPnJ4ID0gdC0+cnhfYnVmOworCisJSU5JVF9DT01QTEVUSU9OKG1wYzh4eHhfc3BpLT5kb25lKTsKKworCS8qIFNldCBTUENPTVtDU10gYW5kIFNQQ09NW1RSQU5MRU5dIGZpZWxkICovCisJaWYgKCh0LT5sZW4gLSAxKSA+IFNQQ09NX1RSQU5MRU5fTUFYKSB7CisJCWRldl9lcnIobXBjOHh4eF9zcGktPmRldiwgIlRyYW5zYWN0aW9uIGxlbmd0aCAoJWQpIgorCQkJCSIgYmV5b25kIHRoZSBTUENPTVtUUkFOTEVOXSBmaWVsZFxuIiwgdC0+bGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmNvbW1hbmQsCisJCShTUENPTV9DUyhzcGktPmNoaXBfc2VsZWN0KSB8IFNQQ09NX1RSQU5MRU4odC0+bGVuIC0gMSkpKTsKKworCXJldCA9IGZzbF9lc3BpX2NwdV9idWZzKG1wYzh4eHhfc3BpLCB0LCBsZW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtcGM4eHh4X3NwaS0+ZG9uZSk7CisKKwkvKiBkaXNhYmxlIHJ4IGludHMgKi8KKwltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tYXNrLCAwKTsKKworCXJldHVybiBtcGM4eHh4X3NwaS0+Y291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmc2xfZXNwaV9hZGRyMmNtZCh1bnNpZ25lZCBpbnQgYWRkciwgdTggKmNtZCkKK3sKKwlpZiAoY21kKSB7CisJCWNtZFsxXSA9ICh1OCkoYWRkciA+PiAxNik7CisJCWNtZFsyXSA9ICh1OCkoYWRkciA+PiA4KTsKKwkJY21kWzNdID0gKHU4KShhZGRyID4+IDApOworCX0KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZnNsX2VzcGlfY21kMmFkZHIodTggKmNtZCkKK3sKKwlpZiAoY21kKQorCQlyZXR1cm4gY21kWzFdIDw8IDE2IHwgY21kWzJdIDw8IDggfCBjbWRbM10gPDwgMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmc2xfZXNwaV9kb190cmFucyhzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0sCisJCQkJc3RydWN0IGZzbF9lc3BpX3RyYW5zZmVyICp0cikKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gbS0+c3BpOworCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciAqZXNwaV90cmFucyA9IHRyOworCXN0cnVjdCBzcGlfbWVzc2FnZSBtZXNzYWdlOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQsICpmaXJzdCwgdHJhbnM7CisJaW50IHN0YXR1cyA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtZXNzYWdlKTsKKwltZW1zZXQoJnRyYW5zLCAwLCBzaXplb2YodHJhbnMpKTsKKworCWZpcnN0ID0gbGlzdF9maXJzdF9lbnRyeSgmbS0+dHJhbnNmZXJzLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAorCQkJdHJhbnNmZXJfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCWlmICgoZmlyc3QtPmJpdHNfcGVyX3dvcmQgIT0gdC0+Yml0c19wZXJfd29yZCkgfHwKKwkJCShmaXJzdC0+c3BlZWRfaHogIT0gdC0+c3BlZWRfaHopKSB7CisJCQllc3BpX3RyYW5zLT5zdGF0dXMgPSAtRUlOVkFMOworCQkJZGV2X2Vycihtc3BpLT5kZXYsICJiaXRzX3Blcl93b3JkL3NwZWVkX2h6IHNob3VsZCBiZSIKKwkJCQkJIiBzYW1lIGZvciB0aGUgc2FtZSBTUEkgdHJhbnNmZXJcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJdHJhbnMuc3BlZWRfaHogPSB0LT5zcGVlZF9oejsKKwkJdHJhbnMuYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7CisJCXRyYW5zLmRlbGF5X3VzZWNzID0gbWF4KGZpcnN0LT5kZWxheV91c2VjcywgdC0+ZGVsYXlfdXNlY3MpOworCX0KKworCXRyYW5zLmxlbiA9IGVzcGlfdHJhbnMtPmxlbjsKKwl0cmFucy50eF9idWYgPSBlc3BpX3RyYW5zLT50eF9idWY7CisJdHJhbnMucnhfYnVmID0gZXNwaV90cmFucy0+cnhfYnVmOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0cmFucywgJm1lc3NhZ2UpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbWVzc2FnZS50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJaWYgKHQtPmJpdHNfcGVyX3dvcmQgfHwgdC0+c3BlZWRfaHopIHsKKwkJCXN0YXR1cyA9IC1FSU5WQUw7CisKKwkJCXN0YXR1cyA9IGZzbF9lc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgdCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICh0LT5sZW4pCisJCQlzdGF0dXMgPSBmc2xfZXNwaV9idWZzKHNwaSwgdCk7CisKKwkJaWYgKHN0YXR1cykgeworCQkJc3RhdHVzID0gLUVNU0dTSVpFOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodC0+ZGVsYXlfdXNlY3MpCisJCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOworCX0KKworCWVzcGlfdHJhbnMtPnN0YXR1cyA9IHN0YXR1czsKKwlmc2xfZXNwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBmc2xfZXNwaV9jbWRfdHJhbnMoc3RydWN0IHNwaV9tZXNzYWdlICptLAorCQkJCXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciAqdHJhbnMsIHU4ICpyeF9idWZmKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CisJdTggKmxvY2FsX2J1ZjsKKwlpbnQgaSA9IDA7CisJc3RydWN0IGZzbF9lc3BpX3RyYW5zZmVyICplc3BpX3RyYW5zID0gdHJhbnM7CisKKwlsb2NhbF9idWYgPSBremFsbG9jKFNQQ09NX1RSQU5MRU5fTUFYLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxvY2FsX2J1ZikgeworCQllc3BpX3RyYW5zLT5zdGF0dXMgPSAtRU5PTUVNOworCQlyZXR1cm47CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCWlmICh0LT50eF9idWYpIHsKKwkJCW1lbWNweShsb2NhbF9idWYgKyBpLCB0LT50eF9idWYsIHQtPmxlbik7CisJCQlpICs9IHQtPmxlbjsKKwkJfQorCX0KKworCWVzcGlfdHJhbnMtPnR4X2J1ZiA9IGxvY2FsX2J1ZjsKKwllc3BpX3RyYW5zLT5yeF9idWYgPSBsb2NhbF9idWYgKyBlc3BpX3RyYW5zLT5uX3R4OworCWZzbF9lc3BpX2RvX3RyYW5zKG0sIGVzcGlfdHJhbnMpOworCisJZXNwaV90cmFucy0+YWN0dWFsX2xlbmd0aCA9IGVzcGlfdHJhbnMtPmxlbjsKKwlrZnJlZShsb2NhbF9idWYpOworfQorCitzdGF0aWMgdm9pZCBmc2xfZXNwaV9yd190cmFucyhzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0sCisJCQkJc3RydWN0IGZzbF9lc3BpX3RyYW5zZmVyICp0cmFucywgdTggKnJ4X2J1ZmYpCit7CisJc3RydWN0IGZzbF9lc3BpX3RyYW5zZmVyICplc3BpX3RyYW5zID0gdHJhbnM7CisJdW5zaWduZWQgaW50IG5fdHggPSBlc3BpX3RyYW5zLT5uX3R4OworCXVuc2lnbmVkIGludCBuX3J4ID0gZXNwaV90cmFucy0+bl9yeDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OworCXU4ICpsb2NhbF9idWY7CisJdTggKnJ4X2J1ZiA9IHJ4X2J1ZmY7CisJdW5zaWduZWQgaW50IHRyYW5zX2xlbjsKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwlpbnQgaSwgcG9zLCBsb29wOworCisJbG9jYWxfYnVmID0ga3phbGxvYyhTUENPTV9UUkFOTEVOX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsb2NhbF9idWYpIHsKKwkJZXNwaV90cmFucy0+c3RhdHVzID0gLUVOT01FTTsKKwkJcmV0dXJuOworCX0KKworCWZvciAocG9zID0gMCwgbG9vcCA9IDA7IHBvcyA8IG5fcng7IHBvcyArPSB0cmFuc19sZW4sIGxvb3ArKykgeworCQl0cmFuc19sZW4gPSBuX3J4IC0gcG9zOworCQlpZiAodHJhbnNfbGVuID4gU1BDT01fVFJBTkxFTl9NQVggLSBuX3R4KQorCQkJdHJhbnNfbGVuID0gU1BDT01fVFJBTkxFTl9NQVggLSBuX3R4OworCisJCWkgPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJCWlmICh0LT50eF9idWYpIHsKKwkJCQltZW1jcHkobG9jYWxfYnVmICsgaSwgdC0+dHhfYnVmLCB0LT5sZW4pOworCQkJCWkgKz0gdC0+bGVuOworCQkJfQorCQl9CisKKwkJaWYgKHBvcyA+IDApIHsKKwkJCWFkZHIgPSBmc2xfZXNwaV9jbWQyYWRkcihsb2NhbF9idWYpOworCQkJYWRkciArPSBwb3M7CisJCQlmc2xfZXNwaV9hZGRyMmNtZChhZGRyLCBsb2NhbF9idWYpOworCQl9CisKKwkJZXNwaV90cmFucy0+bl90eCA9IG5fdHg7CisJCWVzcGlfdHJhbnMtPm5fcnggPSB0cmFuc19sZW47CisJCWVzcGlfdHJhbnMtPmxlbiA9IHRyYW5zX2xlbiArIG5fdHg7CisJCWVzcGlfdHJhbnMtPnR4X2J1ZiA9IGxvY2FsX2J1ZjsKKwkJZXNwaV90cmFucy0+cnhfYnVmID0gbG9jYWxfYnVmICsgbl90eDsKKwkJZnNsX2VzcGlfZG9fdHJhbnMobSwgZXNwaV90cmFucyk7CisKKwkJbWVtY3B5KHJ4X2J1ZiArIHBvcywgZXNwaV90cmFucy0+cnhfYnVmICsgbl90eCwgdHJhbnNfbGVuKTsKKworCQlpZiAobG9vcCA+IDApCisJCQllc3BpX3RyYW5zLT5hY3R1YWxfbGVuZ3RoICs9IGVzcGlfdHJhbnMtPmxlbiAtIG5fdHg7CisJCWVsc2UKKwkJCWVzcGlfdHJhbnMtPmFjdHVhbF9sZW5ndGggKz0gZXNwaV90cmFucy0+bGVuOworCX0KKworCWtmcmVlKGxvY2FsX2J1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9lc3BpX2RvX29uZV9tc2coc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CisJdTggKnJ4X2J1ZiA9IE5VTEw7CisJdW5zaWduZWQgaW50IG5fdHggPSAwOworCXVuc2lnbmVkIGludCBuX3J4ID0gMDsKKwlzdHJ1Y3QgZnNsX2VzcGlfdHJhbnNmZXIgZXNwaV90cmFuczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQlpZiAodC0+dHhfYnVmKQorCQkJbl90eCArPSB0LT5sZW47CisJCWlmICh0LT5yeF9idWYpIHsKKwkJCW5fcnggKz0gdC0+bGVuOworCQkJcnhfYnVmID0gdC0+cnhfYnVmOworCQl9CisJfQorCisJZXNwaV90cmFucy5uX3R4ID0gbl90eDsKKwllc3BpX3RyYW5zLm5fcnggPSBuX3J4OworCWVzcGlfdHJhbnMubGVuID0gbl90eCArIG5fcng7CisJZXNwaV90cmFucy5hY3R1YWxfbGVuZ3RoID0gMDsKKwllc3BpX3RyYW5zLnN0YXR1cyA9IDA7CisKKwlpZiAoIXJ4X2J1ZikKKwkJZnNsX2VzcGlfY21kX3RyYW5zKG0sICZlc3BpX3RyYW5zLCBOVUxMKTsKKwllbHNlCisJCWZzbF9lc3BpX3J3X3RyYW5zKG0sICZlc3BpX3RyYW5zLCByeF9idWYpOworCisJbS0+YWN0dWFsX2xlbmd0aCA9IGVzcGlfdHJhbnMuYWN0dWFsX2xlbmd0aDsKKwltLT5zdGF0dXMgPSBlc3BpX3RyYW5zLnN0YXR1czsKKwltLT5jb21wbGV0ZShtLT5jb250ZXh0KTsKK30KKworc3RhdGljIGludCBmc2xfZXNwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGk7CisJc3RydWN0IGZzbF9lc3BpX3JlZyAqcmVnX2Jhc2U7CisJaW50IHJldHZhbDsKKwl1MzIgaHdfbW9kZTsKKwl1MzIgbG9vcF9tb2RlOworCXN0cnVjdCBzcGlfbXBjOHh4eF9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwlpZiAoIXNwaS0+bWF4X3NwZWVkX2h6KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY3MpIHsKKwkJY3MgPSBremFsbG9jKHNpemVvZiAqY3MsIEdGUF9LRVJORUwpOworCQlpZiAoIWNzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IGNzOworCX0KKworCW1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJcmVnX2Jhc2UgPSBtcGM4eHh4X3NwaS0+cmVnX2Jhc2U7CisKKwlod19tb2RlID0gY3MtPmh3X21vZGU7IC8qIFNhdmUgb3JpZ2luYWwgc2V0dGluZ3MgKi8KKwljcy0+aHdfbW9kZSA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKAorCQkJJnJlZ19iYXNlLT5jc21vZGVbc3BpLT5jaGlwX3NlbGVjdF0pOworCS8qIG1hc2sgb3V0IGJpdHMgd2UgYXJlIGdvaW5nIHRvIHNldCAqLworCWNzLT5od19tb2RlICY9IH4oQ1NNT0RFX0NQX0JFR0lOX0VER0VDTEsgfCBDU01PREVfQ0lfSU5BQ1RJVkVISUdICisJCQkgfCBDU01PREVfUkVWKTsKKworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJY3MtPmh3X21vZGUgfD0gQ1NNT0RFX0NQX0JFR0lOX0VER0VDTEs7CisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQorCQljcy0+aHdfbW9kZSB8PSBDU01PREVfQ0lfSU5BQ1RJVkVISUdIOworCWlmICghKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpKQorCQljcy0+aHdfbW9kZSB8PSBDU01PREVfUkVWOworCisJLyogSGFuZGxlIHRoZSBsb29wIG1vZGUgKi8KKwlsb29wX21vZGUgPSBtcGM4eHh4X3NwaV9yZWFkX3JlZygmcmVnX2Jhc2UtPm1vZGUpOworCWxvb3BfbW9kZSAmPSB+U1BNT0RFX0xPT1A7CisJaWYgKHNwaS0+bW9kZSAmIFNQSV9MT09QKQorCQlsb29wX21vZGUgfD0gU1BNT0RFX0xPT1A7CisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bW9kZSwgbG9vcF9tb2RlKTsKKworCXJldHZhbCA9IGZzbF9lc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJY3MtPmh3X21vZGUgPSBod19tb2RlOyAvKiBSZXN0b3JlIHNldHRpbmdzICovCisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGZzbF9lc3BpX2NwdV9pcnEoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLCB1MzIgZXZlbnRzKQoreworCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7CisKKwkvKiBXZSBuZWVkIGhhbmRsZSBSWCBmaXJzdCAqLworCWlmIChldmVudHMgJiBTUElFX05FKSB7CisJCXUzMiByeF9kYXRhLCB0bXA7CisJCXU4IHJ4X2RhdGFfODsKKworCQkvKiBTcGluIHVudGlsIFJYIGlzIGRvbmUgKi8KKwkJd2hpbGUgKFNQSUVfUlhDTlQoZXZlbnRzKSA8IG1pbig0LCBtc3BpLT5sZW4pKSB7CisJCQljcHVfcmVsYXgoKTsKKwkJCWV2ZW50cyA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZyZWdfYmFzZS0+ZXZlbnQpOworCQl9CisKKwkJaWYgKG1zcGktPmxlbiA+PSA0KSB7CisJCQlyeF9kYXRhID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoJnJlZ19iYXNlLT5yZWNlaXZlKTsKKwkJfSBlbHNlIHsKKwkJCXRtcCA9IG1zcGktPmxlbjsKKwkJCXJ4X2RhdGEgPSAwOworCQkJd2hpbGUgKHRtcC0tKSB7CisJCQkJcnhfZGF0YV84ID0gaW5fOCgodTggKikmcmVnX2Jhc2UtPnJlY2VpdmUpOworCQkJCXJ4X2RhdGEgfD0gKHJ4X2RhdGFfOCA8PCAodG1wICogOCkpOworCQkJfQorCisJCQlyeF9kYXRhIDw8PSAoNCAtIG1zcGktPmxlbikgKiA4OworCQl9CisKKwkJbXNwaS0+bGVuIC09IDQ7CisKKwkJaWYgKG1zcGktPnJ4KQorCQkJbXNwaS0+Z2V0X3J4KHJ4X2RhdGEsIG1zcGkpOworCX0KKworCWlmICghKGV2ZW50cyAmIFNQSUVfTkYpKSB7CisJCWludCByZXQ7CisKKwkJLyogc3BpbiB1bnRpbCBUWCBpcyBkb25lICovCisJCXJldCA9IHNwaW5fZXZlbnRfdGltZW91dCgoKGV2ZW50cyA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKAorCQkJCSZyZWdfYmFzZS0+ZXZlbnQpKSAmIFNQSUVfTkYpID09IDAsIDEwMDAsIDApOworCQlpZiAoIXJldCkgeworCQkJZGV2X2Vycihtc3BpLT5kZXYsICJ0aXJlZCB3YWl0aW5nIGZvciBTUElFX05GXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIENsZWFyIHRoZSBldmVudHMgKi8KKwltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5ldmVudCwgZXZlbnRzKTsKKworCW1zcGktPmNvdW50IC09IDE7CisJaWYgKG1zcGktPmNvdW50KSB7CisJCXUzMiB3b3JkID0gbXNwaS0+Z2V0X3R4KG1zcGkpOworCisJCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPnRyYW5zbWl0LCB3b3JkKTsKKwl9IGVsc2UgeworCQljb21wbGV0ZSgmbXNwaS0+ZG9uZSk7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX2VzcGlfaXJxKHMzMiBpcnEsIHZvaWQgKmNvbnRleHRfZGF0YSkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGkgPSBjb250ZXh0X2RhdGE7CisJc3RydWN0IGZzbF9lc3BpX3JlZyAqcmVnX2Jhc2UgPSBtc3BpLT5yZWdfYmFzZTsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKwl1MzIgZXZlbnRzOworCisJLyogR2V0IGludGVycnVwdCBldmVudHModHgvcngpICovCisJZXZlbnRzID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoJnJlZ19iYXNlLT5ldmVudCk7CisJaWYgKGV2ZW50cykKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwlkZXZfdmRiZyhtc3BpLT5kZXYsICIlczogZXZlbnRzICV4XG4iLCBfX2Z1bmNfXywgZXZlbnRzKTsKKworCWZzbF9lc3BpX2NwdV9pcnEobXNwaSwgZXZlbnRzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9lc3BpX3JlbW92ZShzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGkpCit7CisJaW91bm1hcChtc3BpLT5yZWdfYmFzZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX21hc3RlciAqIF9fZGV2aW5pdCBmc2xfZXNwaV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCByZXNvdXJjZSAqbWVtLCB1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaTsKKwlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZTsKKwl1MzIgcmVndmFsOworCWludCBpLCByZXQgPSAwOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZihzdHJ1Y3QgbXBjOHh4eF9zcGkpKTsKKwlpZiAoIW1hc3RlcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBtYXN0ZXIpOworCisJcmV0ID0gbXBjOHh4eF9zcGlfcHJvYmUoZGV2LCBtZW0sIGlycSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcHJvYmU7CisKKwltYXN0ZXItPnNldHVwID0gZnNsX2VzcGlfc2V0dXA7CisKKwltcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwltcGM4eHh4X3NwaS0+c3BpX2RvX29uZV9tc2cgPSBmc2xfZXNwaV9kb19vbmVfbXNnOworCW1wYzh4eHhfc3BpLT5zcGlfcmVtb3ZlID0gZnNsX2VzcGlfcmVtb3ZlOworCisJbXBjOHh4eF9zcGktPnJlZ19iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCWlmICghbXBjOHh4eF9zcGktPnJlZ19iYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3Byb2JlOworCX0KKworCXJlZ19iYXNlID0gbXBjOHh4eF9zcGktPnJlZ19iYXNlOworCisJLyogUmVnaXN0ZXIgZm9yIFNQSSBJbnRlcnJ1cHQgKi8KKwlyZXQgPSByZXF1ZXN0X2lycShtcGM4eHh4X3NwaS0+aXJxLCBmc2xfZXNwaV9pcnEsCisJCQkgIDAsICJmc2xfZXNwaSIsIG1wYzh4eHhfc3BpKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfaXJxOworCisJaWYgKG1wYzh4eHhfc3BpLT5mbGFncyAmIFNQSV9RRV9DUFVfTU9ERSkgeworCQltcGM4eHh4X3NwaS0+cnhfc2hpZnQgPSAxNjsKKwkJbXBjOHh4eF9zcGktPnR4X3NoaWZ0ID0gMjQ7CisJfQorCisJLyogU1BJIGNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb25zICovCisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bW9kZSwgMCk7CisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bWFzaywgMCk7CisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+Y29tbWFuZCwgMCk7CisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+ZXZlbnQsIDB4ZmZmZmZmZmYpOworCisJLyogSW5pdCBlU1BJIENTIG1vZGUgcmVnaXN0ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm1heF9jaGlwc2VsZWN0OyBpKyspCisJCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmNzbW9kZVtpXSwgQ1NNT0RFX0lOSVRfVkFMKTsKKworCS8qIEVuYWJsZSBTUEkgaW50ZXJmYWNlICovCisJcmVndmFsID0gcGRhdGEtPmluaXRpYWxfc3Btb2RlIHwgU1BNT0RFX0lOSVRfVkFMIHwgU1BNT0RFX0VOQUJMRTsKKworCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1vZGUsIHJlZ3ZhbCk7CisKKwlyZXQgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdW5yZWdfbWFzdGVyOworCisJZGV2X2luZm8oZGV2LCAiYXQgMHglcCAoaXJxID0gJWQpXG4iLCByZWdfYmFzZSwgbXBjOHh4eF9zcGktPmlycSk7CisKKwlyZXR1cm4gbWFzdGVyOworCit1bnJlZ19tYXN0ZXI6CisJZnJlZV9pcnEobXBjOHh4eF9zcGktPmlycSwgbXBjOHh4eF9zcGkpOworZnJlZV9pcnE6CisJaW91bm1hcChtcGM4eHh4X3NwaS0+cmVnX2Jhc2UpOworZXJyX3Byb2JlOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CitlcnI6CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworc3RhdGljIGludCBvZl9mc2xfZXNwaV9nZXRfY2hpcHNlbGVjdHMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IGZzbF9zcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJY29uc3QgdTMyICpwcm9wOworCWludCBsZW47CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZnNsLGVzcGktbnVtLWNoaXBzZWxlY3RzIiwgJmxlbik7CisJaWYgKCFwcm9wIHx8IGxlbiA8IHNpemVvZigqcHJvcCkpIHsKKwkJZGV2X2VycihkZXYsICJObyAnZnNsLGVzcGktbnVtLWNoaXBzZWxlY3RzJyBwcm9wZXJ0eVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBkYXRhLT5tYXhfY2hpcHNlbGVjdCA9ICpwcm9wOworCXBkYXRhLT5jc19jb250cm9sID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBvZl9mc2xfZXNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmb2ZkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb2ZkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHJlc291cmNlIG1lbTsKKwlzdHJ1Y3QgcmVzb3VyY2UgaXJxOworCWludCByZXQgPSAtRU5PTUVNOworCisJcmV0ID0gb2ZfbXBjOHh4eF9zcGlfcHJvYmUob2ZkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBvZl9mc2xfZXNwaV9nZXRfY2hpcHNlbGVjdHMoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZtZW0pOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gb2ZfaXJxX3RvX3Jlc291cmNlKG5wLCAwLCAmaXJxKTsKKwlpZiAoIXJldCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwltYXN0ZXIgPSBmc2xfZXNwaV9wcm9iZShkZXYsICZtZW0sIGlycS5zdGFydCk7CisJaWYgKElTX0VSUihtYXN0ZXIpKSB7CisJCXJldCA9IFBUUl9FUlIobWFzdGVyKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CisKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBvZl9mc2xfZXNwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXJldHVybiBtcGM4eHh4X3NwaV9yZW1vdmUoJmRldi0+ZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfZnNsX2VzcGlfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWVzcGkiIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9mc2xfZXNwaV9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZzbF9lc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJmc2xfZXNwaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9mc2xfZXNwaV9tYXRjaCwKKwl9LAorCS5wcm9iZQkJPSBvZl9mc2xfZXNwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG9mX2ZzbF9lc3BpX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBmc2xfZXNwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnNsX2VzcGlfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGZzbF9lc3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZnNsX2VzcGlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmc2xfZXNwaV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZnNsX2VzcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pbmdrYWkgSHUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRW5oYW5jZWQgRnJlZXNjYWxlIFNQSSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtbGliLmMgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NzRmYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWxpYi5jCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogRnJlZXNjYWxlIFNQSS9lU1BJIGNvbnRyb2xsZXIgZHJpdmVyIGxpYnJhcnkuCisgKgorICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBQb2x5Y29tLCBJbmMuCisgKgorICogQ1BNIFNQSSBhbmQgUUUgYnVmZmVyIGRlc2NyaXB0b3JzIG1vZGUgc3VwcG9ydDoKKyAqIENvcHlyaWdodCAoYykgMjAwOSAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogQXV0aG9yOiBBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAcnUubXZpc3RhLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3NwaS5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisKKyNpbmNsdWRlICJzcGktZnNsLWxpYi5oIgorCisjZGVmaW5lIE1QQzhYWFhfU1BJX1JYX0JVRih0eXBlKSAJCQkJCSAgXAordm9pZCBtcGM4eHh4X3NwaV9yeF9idWZfIyN0eXBlKHUzMiBkYXRhLCBzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpKSBcCit7CQkJCQkJCQkJICBcCisJdHlwZSAqcnggPSBtcGM4eHh4X3NwaS0+cng7CQkJCQkgIFwKKwkqcngrKyA9ICh0eXBlKShkYXRhID4+IG1wYzh4eHhfc3BpLT5yeF9zaGlmdCk7CQkJICBcCisJbXBjOHh4eF9zcGktPnJ4ID0gcng7CQkJCQkJICBcCit9CisKKyNkZWZpbmUgTVBDOFhYWF9TUElfVFhfQlVGKHR5cGUpCQkJCVwKK3UzMiBtcGM4eHh4X3NwaV90eF9idWZfIyN0eXBlKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkpCVwKK3sJCQkJCQkJCVwKKwl1MzIgZGF0YTsJCQkJCQlcCisJY29uc3QgdHlwZSAqdHggPSBtcGM4eHh4X3NwaS0+dHg7CQkJXAorCWlmICghdHgpCQkJCQkJXAorCQlyZXR1cm4gMDsJCQkJCVwKKwlkYXRhID0gKnR4KysgPDwgbXBjOHh4eF9zcGktPnR4X3NoaWZ0OwkJCVwKKwltcGM4eHh4X3NwaS0+dHggPSB0eDsJCQkJCVwKKwlyZXR1cm4gZGF0YTsJCQkJCQlcCit9CisKK01QQzhYWFhfU1BJX1JYX0JVRih1OCkKK01QQzhYWFhfU1BJX1JYX0JVRih1MTYpCitNUEM4WFhYX1NQSV9SWF9CVUYodTMyKQorTVBDOFhYWF9TUElfVFhfQlVGKHU4KQorTVBDOFhYWF9TUElfVFhfQlVGKHUxNikKK01QQzhYWFhfU1BJX1RYX0JVRih1MzIpCisKK3N0cnVjdCBtcGM4eHh4X3NwaV9wcm9iZV9pbmZvICp0b19vZl9waW5mbyhzdHJ1Y3QgZnNsX3NwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHBkYXRhLCBzdHJ1Y3QgbXBjOHh4eF9zcGlfcHJvYmVfaW5mbywgcGRhdGEpOworfQorCit2b2lkIG1wYzh4eHhfc3BpX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1wYzh4eHhfc3BpLAorCQkJCQkJICAgICAgIHdvcmspOworCisJc3Bpbl9sb2NrX2lycSgmbXBjOHh4eF9zcGktPmxvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmbXBjOHh4eF9zcGktPnF1ZXVlKSkgeworCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0gPSBjb250YWluZXJfb2YobXBjOHh4eF9zcGktPnF1ZXVlLm5leHQsCisJCQkJCQkgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UsIHF1ZXVlKTsKKworCQlsaXN0X2RlbF9pbml0KCZtLT5xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycSgmbXBjOHh4eF9zcGktPmxvY2spOworCisJCWlmIChtcGM4eHh4X3NwaS0+c3BpX2RvX29uZV9tc2cpCisJCQltcGM4eHh4X3NwaS0+c3BpX2RvX29uZV9tc2cobSk7CisKKwkJc3Bpbl9sb2NrX2lycSgmbXBjOHh4eF9zcGktPmxvY2spOworCX0KKwlzcGluX3VubG9ja19pcnEoJm1wYzh4eHhfc3BpLT5sb2NrKTsKK30KKworaW50IG1wYzh4eHhfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbS0+YWN0dWFsX2xlbmd0aCA9IDA7CisJbS0+c3RhdHVzID0gLUVJTlBST0dSRVNTOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfc3BpLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZtcGM4eHh4X3NwaS0+cXVldWUpOworCXF1ZXVlX3dvcmsobXBjOHh4eF9zcGktPndvcmtxdWV1ZSwgJm1wYzh4eHhfc3BpLT53b3JrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X3NwaS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXBjOHh4eF9zcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWtmcmVlKHNwaS0+Y29udHJvbGxlcl9zdGF0ZSk7Cit9CisKK2NvbnN0IGNoYXIgKm1wYzh4eHhfc3BpX3N0cm1vZGUodW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmIChmbGFncyAmIFNQSV9RRV9DUFVfTU9ERSkgeworCQlyZXR1cm4gIlFFIENQVSI7CisJfSBlbHNlIGlmIChmbGFncyAmIFNQSV9DUE1fTU9ERSkgeworCQlpZiAoZmxhZ3MgJiBTUElfUUUpCisJCQlyZXR1cm4gIlFFIjsKKwkJZWxzZSBpZiAoZmxhZ3MgJiBTUElfQ1BNMikKKwkJCXJldHVybiAiQ1BNMiI7CisJCWVsc2UKKwkJCXJldHVybiAiQ1BNMSI7CisJfQorCXJldHVybiAiQ1BVIjsKK30KKworaW50IG1wYzh4eHhfc3BpX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlc291cmNlICptZW0sCisJCQl1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaTsKKwlpbnQgcmV0ID0gMDsKKworCW1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0gKKwkJCXwgU1BJX0xTQl9GSVJTVCB8IFNQSV9MT09QOworCisJbWFzdGVyLT50cmFuc2ZlciA9IG1wYzh4eHhfc3BpX3RyYW5zZmVyOworCW1hc3Rlci0+Y2xlYW51cCA9IG1wYzh4eHhfc3BpX2NsZWFudXA7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IGRldi0+b2Zfbm9kZTsKKworCW1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCW1wYzh4eHhfc3BpLT5kZXYgPSBkZXY7CisJbXBjOHh4eF9zcGktPmdldF9yeCA9IG1wYzh4eHhfc3BpX3J4X2J1Zl91ODsKKwltcGM4eHh4X3NwaS0+Z2V0X3R4ID0gbXBjOHh4eF9zcGlfdHhfYnVmX3U4OworCW1wYzh4eHhfc3BpLT5mbGFncyA9IHBkYXRhLT5mbGFnczsKKwltcGM4eHh4X3NwaS0+c3BpYnJnID0gcGRhdGEtPnN5c2NsazsKKwltcGM4eHh4X3NwaS0+aXJxID0gaXJxOworCisJbXBjOHh4eF9zcGktPnJ4X3NoaWZ0ID0gMDsKKwltcGM4eHh4X3NwaS0+dHhfc2hpZnQgPSAwOworCisJaW5pdF9jb21wbGV0aW9uKCZtcGM4eHh4X3NwaS0+ZG9uZSk7CisKKwltYXN0ZXItPmJ1c19udW0gPSBwZGF0YS0+YnVzX251bTsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcGRhdGEtPm1heF9jaGlwc2VsZWN0OworCisJc3Bpbl9sb2NrX2luaXQoJm1wYzh4eHhfc3BpLT5sb2NrKTsKKwlpbml0X2NvbXBsZXRpb24oJm1wYzh4eHhfc3BpLT5kb25lKTsKKwlJTklUX1dPUksoJm1wYzh4eHhfc3BpLT53b3JrLCBtcGM4eHh4X3NwaV93b3JrKTsKKwlJTklUX0xJU1RfSEVBRCgmbXBjOHh4eF9zcGktPnF1ZXVlKTsKKworCW1wYzh4eHhfc3BpLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKKwkJZGV2X25hbWUobWFzdGVyLT5kZXYucGFyZW50KSk7CisJaWYgKG1wYzh4eHhfc3BpLT53b3JrcXVldWUgPT0gTlVMTCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworCitlcnI6CisJcmV0dXJuIHJldDsKK30KKworaW50IF9fZGV2ZXhpdCBtcGM4eHh4X3NwaV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGk7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKworCW1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCW1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJZmx1c2hfd29ya3F1ZXVlKG1wYzh4eHhfc3BpLT53b3JrcXVldWUpOworCWRlc3Ryb3lfd29ya3F1ZXVlKG1wYzh4eHhfc3BpLT53b3JrcXVldWUpOworCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCisJZnJlZV9pcnEobXBjOHh4eF9zcGktPmlycSwgbXBjOHh4eF9zcGkpOworCisJaWYgKG1wYzh4eHhfc3BpLT5zcGlfcmVtb3ZlKQorCQltcGM4eHh4X3NwaS0+c3BpX3JlbW92ZShtcGM4eHh4X3NwaSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9fZGV2aW5pdCBvZl9tcGM4eHh4X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmb2ZkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb2ZkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBtcGM4eHh4X3NwaV9wcm9iZV9pbmZvICpwaW5mbzsKKwlzdHJ1Y3QgZnNsX3NwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwljb25zdCB2b2lkICpwcm9wOworCWludCByZXQgPSAtRU5PTUVNOworCisJcGluZm8gPSBremFsbG9jKHNpemVvZigqcGluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBkYXRhID0gJnBpbmZvLT5wZGF0YTsKKwlkZXYtPnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKKworCS8qIEFsbG9jYXRlIGJ1cyBudW0gZHluYW1pY2FsbHkuICovCisJcGRhdGEtPmJ1c19udW0gPSAtMTsKKworCS8qIFNQSSBjb250cm9sbGVyIGlzIGVpdGhlciBjbG9ja2VkIGZyb20gUUUgb3IgU29DIGNsb2NrLiAqLworCXBkYXRhLT5zeXNjbGsgPSBnZXRfYnJnZnJlcSgpOworCWlmIChwZGF0YS0+c3lzY2xrID09IC0xKSB7CisJCXBkYXRhLT5zeXNjbGsgPSBmc2xfZ2V0X3N5c19mcmVxKCk7CisJCWlmIChwZGF0YS0+c3lzY2xrID09IC0xKSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZSIsIE5VTEwpOworCWlmIChwcm9wICYmICFzdHJjbXAocHJvcCwgImNwdS1xZSIpKQorCQlwZGF0YS0+ZmxhZ3MgPSBTUElfUUVfQ1BVX01PREU7CisJZWxzZSBpZiAocHJvcCAmJiAhc3RyY21wKHByb3AsICJxZSIpKQorCQlwZGF0YS0+ZmxhZ3MgPSBTUElfQ1BNX01PREUgfCBTUElfUUU7CisJZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsY3BtMi1zcGkiKSkKKwkJcGRhdGEtPmZsYWdzID0gU1BJX0NQTV9NT0RFIHwgU1BJX0NQTTI7CisJZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsY3BtMS1zcGkiKSkKKwkJcGRhdGEtPmZsYWdzID0gU1BJX0NQTV9NT0RFIHwgU1BJX0NQTTE7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWtmcmVlKHBpbmZvKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2ZzbF9saWIuaCBiL2RyaXZlcnMvc3BpL3NwaS1mc2wtbGliLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3BpL3NwaV9mc2xfbGliLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3BpL3NwaS1mc2wtbGliLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktZnNsLXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNDA3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLXNwaS5jCkBAIC0wLDAgKzEsMTE4NiBAQAorLyoKKyAqIEZyZWVzY2FsZSBTUEkgY29udHJvbGxlciBkcml2ZXIuCisgKgorICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBQb2x5Y29tLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIENQTSBTUEkgYW5kIFFFIGJ1ZmZlciBkZXNjcmlwdG9ycyBtb2RlIHN1cHBvcnQ6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIEF1dGhvcjogQW50b24gVm9yb250c292IDxhdm9yb250c292QHJ1Lm12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKworI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8YXNtL2NwbS5oPgorI2luY2x1ZGUgPGFzbS9xZS5oPgorCisjaW5jbHVkZSAic3BpLWZzbC1saWIuaCIKKworLyogQ1BNMSBhbmQgQ1BNMiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAqLworI2lmZGVmIENPTkZJR19DUE0xCisjaW5jbHVkZSA8YXNtL2NwbTEuaD4KKyNkZWZpbmUgQ1BNX1NQSV9DTUQgbWtfY3JfY21kKENQTV9DUl9DSF9TUEksIDApCisjZWxzZQorI2luY2x1ZGUgPGFzbS9jcG0yLmg+CisjZGVmaW5lIENQTV9TUElfQ01EIG1rX2NyX2NtZChDUE1fQ1JfU1BJX1BBR0UsIENQTV9DUl9TUElfU0JMT0NLLCAwLCAwKQorI2VuZGlmCisKKy8qIFNQSSBDb250cm9sbGVyIHJlZ2lzdGVycyAqLworc3RydWN0IGZzbF9zcGlfcmVnIHsKKwl1OCByZXMxWzB4MjBdOworCV9fYmUzMiBtb2RlOworCV9fYmUzMiBldmVudDsKKwlfX2JlMzIgbWFzazsKKwlfX2JlMzIgY29tbWFuZDsKKwlfX2JlMzIgdHJhbnNtaXQ7CisJX19iZTMyIHJlY2VpdmU7Cit9OworCisvKiBTUEkgQ29udHJvbGxlciBtb2RlIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lCVNQTU9ERV9MT09QCQkoMSA8PCAzMCkKKyNkZWZpbmUJU1BNT0RFX0NJX0lOQUNUSVZFSElHSAkoMSA8PCAyOSkKKyNkZWZpbmUJU1BNT0RFX0NQX0JFR0lOX0VER0VDTEsJKDEgPDwgMjgpCisjZGVmaW5lCVNQTU9ERV9ESVYxNgkJKDEgPDwgMjcpCisjZGVmaW5lCVNQTU9ERV9SRVYJCSgxIDw8IDI2KQorI2RlZmluZQlTUE1PREVfTVMJCSgxIDw8IDI1KQorI2RlZmluZQlTUE1PREVfRU5BQkxFCQkoMSA8PCAyNCkKKyNkZWZpbmUJU1BNT0RFX0xFTih4KQkJKCh4KSA8PCAyMCkKKyNkZWZpbmUJU1BNT0RFX1BNKHgpCQkoKHgpIDw8IDE2KQorI2RlZmluZQlTUE1PREVfT1AJCSgxIDw8IDE0KQorI2RlZmluZQlTUE1PREVfQ0coeCkJCSgoeCkgPDwgNykKKworLyoKKyAqIERlZmF1bHQgZm9yIFNQSSBNb2RlOgorICoJU1BJIE1PREUgMCAoaW5hY3RpdmUgbG93LCBwaGFzZSBtaWRkbGUsIE1TQiwgOC1iaXQgbGVuZ3RoLCBzbG93IGNsaworICovCisjZGVmaW5lCVNQTU9ERV9JTklUX1ZBTCAoU1BNT0RFX0NJX0lOQUNUSVZFSElHSCB8IFNQTU9ERV9ESVYxNiB8IFNQTU9ERV9SRVYgfCBcCisJCQkgU1BNT0RFX01TIHwgU1BNT0RFX0xFTig3KSB8IFNQTU9ERV9QTSgweGYpKQorCisvKiBTUElFIHJlZ2lzdGVyIHZhbHVlcyAqLworI2RlZmluZQlTUElFX05FCQkweDAwMDAwMjAwCS8qIE5vdCBlbXB0eSAqLworI2RlZmluZQlTUElFX05GCQkweDAwMDAwMTAwCS8qIE5vdCBmdWxsICovCisKKy8qIFNQSU0gcmVnaXN0ZXIgdmFsdWVzICovCisjZGVmaW5lCVNQSU1fTkUJCTB4MDAwMDAyMDAJLyogTm90IGVtcHR5ICovCisjZGVmaW5lCVNQSU1fTkYJCTB4MDAwMDAxMDAJLyogTm90IGZ1bGwgKi8KKworI2RlZmluZQlTUElFX1RYQgkweDAwMDAwMjAwCS8qIExhc3QgY2hhciBpcyB3cml0dGVuIHRvIHR4IGZpZm8gKi8KKyNkZWZpbmUJU1BJRV9SWEIJMHgwMDAwMDEwMAkvKiBMYXN0IGNoYXIgaXMgd3JpdHRlbiB0byByeCBidWYgKi8KKworLyogU1BDT00gcmVnaXN0ZXIgdmFsdWVzICovCisjZGVmaW5lCVNQQ09NX1NUUgkoMSA8PCAyMykJLyogU3RhcnQgdHJhbnNtaXQgKi8KKworI2RlZmluZQlTUElfUFJBTV9TSVpFCTB4MTAwCisjZGVmaW5lCVNQSV9NUkJMUgkoKHVuc2lnbmVkIGludClQQUdFX1NJWkUpCisKK3N0YXRpYyB2b2lkICpmc2xfZHVtbXlfcng7CitzdGF0aWMgREVGSU5FX01VVEVYKGZzbF9kdW1teV9yeF9sb2NrKTsKK3N0YXRpYyBpbnQgZnNsX2R1bW15X3J4X3JlZmNudDsKKworc3RhdGljIHZvaWQgZnNsX3NwaV9jaGFuZ2VfbW9kZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXN0cnVjdCBzcGlfbXBjOHh4eF9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJc3RydWN0IGZzbF9zcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOworCV9fYmUzMiBfX2lvbWVtICptb2RlID0gJnJlZ19iYXNlLT5tb2RlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoY3MtPmh3X21vZGUgPT0gbXBjOHh4eF9zcGlfcmVhZF9yZWcobW9kZSkpCisJCXJldHVybjsKKworCS8qIFR1cm4gb2ZmIElSUXMgbG9jYWxseSB0byBtaW5pbWl6ZSB0aW1lIHRoYXQgU1BJIGlzIGRpc2FibGVkLiAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIFR1cm4gb2ZmIFNQSSB1bml0IHByaW9yIGNoYW5naW5nIG1vZGUgKi8KKwltcGM4eHh4X3NwaV93cml0ZV9yZWcobW9kZSwgY3MtPmh3X21vZGUgJiB+U1BNT0RFX0VOQUJMRSk7CisKKwkvKiBXaGVuIGluIENQTSBtb2RlLCB3ZSBuZWVkIHRvIHJlaW5pdCB0eCBhbmQgcnguICovCisJaWYgKG1zcGktPmZsYWdzICYgU1BJX0NQTV9NT0RFKSB7CisJCWlmIChtc3BpLT5mbGFncyAmIFNQSV9RRSkgeworCQkJcWVfaXNzdWVfY21kKFFFX0lOSVRfVFhfUlgsIG1zcGktPnN1YmJsb2NrLAorCQkJCSAgICAgUUVfQ1JfUFJPVE9DT0xfVU5TUEVDSUZJRUQsIDApOworCQl9IGVsc2UgeworCQkJY3BtX2NvbW1hbmQoQ1BNX1NQSV9DTUQsIENQTV9DUl9JTklUX1RSWCk7CisJCQlpZiAobXNwaS0+ZmxhZ3MgJiBTUElfQ1BNMSkgeworCQkJCW91dF9iZTE2KCZtc3BpLT5wcmFtLT5yYnB0ciwKKwkJCQkJIGluX2JlMTYoJm1zcGktPnByYW0tPnJiYXNlKSk7CisJCQkJb3V0X2JlMTYoJm1zcGktPnByYW0tPnRicHRyLAorCQkJCQkgaW5fYmUxNigmbXNwaS0+cHJhbS0+dGJhc2UpKTsKKwkJCX0KKwkJfQorCX0KKwltcGM4eHh4X3NwaV93cml0ZV9yZWcobW9kZSwgY3MtPmh3X21vZGUpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZnNsX3NwaV9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3RydWN0IGZzbF9zcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBzcGktPmRldi5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7CisJYm9vbCBwb2wgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKKwlzdHJ1Y3Qgc3BpX21wYzh4eHhfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCisJaWYgKHZhbHVlID09IEJJVEJBTkdfQ1NfSU5BQ1RJVkUpIHsKKwkJaWYgKHBkYXRhLT5jc19jb250cm9sKQorCQkJcGRhdGEtPmNzX2NvbnRyb2woc3BpLCAhcG9sKTsKKwl9CisKKwlpZiAodmFsdWUgPT0gQklUQkFOR19DU19BQ1RJVkUpIHsKKwkJbXBjOHh4eF9zcGktPnJ4X3NoaWZ0ID0gY3MtPnJ4X3NoaWZ0OworCQltcGM4eHh4X3NwaS0+dHhfc2hpZnQgPSBjcy0+dHhfc2hpZnQ7CisJCW1wYzh4eHhfc3BpLT5nZXRfcnggPSBjcy0+Z2V0X3J4OworCQltcGM4eHh4X3NwaS0+Z2V0X3R4ID0gY3MtPmdldF90eDsKKworCQlmc2xfc3BpX2NoYW5nZV9tb2RlKHNwaSk7CisKKwkJaWYgKHBkYXRhLT5jc19jb250cm9sKQorCQkJcGRhdGEtPmNzX2NvbnRyb2woc3BpLCBwb2wpOworCX0KK30KKworc3RhdGljIGludCBtc3BpX2FwcGx5X2NwdV9tb2RlX3F1aXJrcyhzdHJ1Y3Qgc3BpX21wYzh4eHhfY3MgKmNzLAorCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSwKKwkJCQlpbnQgYml0c19wZXJfd29yZCkKK3sKKwljcy0+cnhfc2hpZnQgPSAwOworCWNzLT50eF9zaGlmdCA9IDA7CisJaWYgKGJpdHNfcGVyX3dvcmQgPD0gOCkgeworCQljcy0+Z2V0X3J4ID0gbXBjOHh4eF9zcGlfcnhfYnVmX3U4OworCQljcy0+Z2V0X3R4ID0gbXBjOHh4eF9zcGlfdHhfYnVmX3U4OworCQlpZiAobXBjOHh4eF9zcGktPmZsYWdzICYgU1BJX1FFX0NQVV9NT0RFKSB7CisJCQljcy0+cnhfc2hpZnQgPSAxNjsKKwkJCWNzLT50eF9zaGlmdCA9IDI0OworCQl9CisJfSBlbHNlIGlmIChiaXRzX3Blcl93b3JkIDw9IDE2KSB7CisJCWNzLT5nZXRfcnggPSBtcGM4eHh4X3NwaV9yeF9idWZfdTE2OworCQljcy0+Z2V0X3R4ID0gbXBjOHh4eF9zcGlfdHhfYnVmX3UxNjsKKwkJaWYgKG1wYzh4eHhfc3BpLT5mbGFncyAmIFNQSV9RRV9DUFVfTU9ERSkgeworCQkJY3MtPnJ4X3NoaWZ0ID0gMTY7CisJCQljcy0+dHhfc2hpZnQgPSAxNjsKKwkJfQorCX0gZWxzZSBpZiAoYml0c19wZXJfd29yZCA8PSAzMikgeworCQljcy0+Z2V0X3J4ID0gbXBjOHh4eF9zcGlfcnhfYnVmX3UzMjsKKwkJY3MtPmdldF90eCA9IG1wYzh4eHhfc3BpX3R4X2J1Zl91MzI7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1wYzh4eHhfc3BpLT5mbGFncyAmIFNQSV9RRV9DUFVfTU9ERSAmJgorCSAgICBzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSB7CisJCWNzLT50eF9zaGlmdCA9IDA7CisJCWlmIChiaXRzX3Blcl93b3JkIDw9IDgpCisJCQljcy0+cnhfc2hpZnQgPSA4OworCQllbHNlCisJCQljcy0+cnhfc2hpZnQgPSAwOworCX0KKwltcGM4eHh4X3NwaS0+cnhfc2hpZnQgPSBjcy0+cnhfc2hpZnQ7CisJbXBjOHh4eF9zcGktPnR4X3NoaWZ0ID0gY3MtPnR4X3NoaWZ0OworCW1wYzh4eHhfc3BpLT5nZXRfcnggPSBjcy0+Z2V0X3J4OworCW1wYzh4eHhfc3BpLT5nZXRfdHggPSBjcy0+Z2V0X3R4OworCisJcmV0dXJuIGJpdHNfcGVyX3dvcmQ7Cit9CisKK3N0YXRpYyBpbnQgbXNwaV9hcHBseV9xZV9tb2RlX3F1aXJrcyhzdHJ1Y3Qgc3BpX21wYzh4eHhfY3MgKmNzLAorCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJaW50IGJpdHNfcGVyX3dvcmQpCit7CisJLyogUUUgdXNlcyBMaXR0bGUgRW5kaWFuIGZvciB3b3JkcyA+IDgKKwkgKiBzbyB0cmFuc2Zvcm0gYWxsIHdvcmRzID4gOCBpbnRvIDggYml0cworCSAqIFVuZm9ydG5hdGx5IHRoYXQgZG9lc24ndCB3b3JrIGZvciBMU0Igc28KKwkgKiByZWplY3QgdGhlc2UgZm9yIG5vdyAqLworCS8qIE5vdGU6IDMyIGJpdHMgd29yZCwgTFNCIHdvcmtzIGlmZgorCSAqIHRmY3IvcmZjciBpcyBzZXQgdG8gQ1BNRkNSX0dCTCAqLworCWlmIChzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUICYmCisJICAgIGJpdHNfcGVyX3dvcmQgPiA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYml0c19wZXJfd29yZCA+IDgpCisJCXJldHVybiA4OyAvKiBwcmV0ZW5kIGl0cyA4IGJpdHMgKi8KKwlyZXR1cm4gYml0c19wZXJfd29yZDsKK30KKworc3RhdGljIGludCBmc2xfc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaTsKKwlpbnQgYml0c19wZXJfd29yZCA9IDA7CisJdTggcG07CisJdTMyIGh6ID0gMDsKKwlzdHJ1Y3Qgc3BpX21wYzh4eHhfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCisJbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCWlmICh0KSB7CisJCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOworCQloeiA9IHQtPnNwZWVkX2h6OworCX0KKworCS8qIHNwaV90cmFuc2ZlciBsZXZlbCBjYWxscyB0aGF0IHdvcmsgcGVyLXdvcmQgKi8KKwlpZiAoIWJpdHNfcGVyX3dvcmQpCisJCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisKKwkvKiBNYWtlIHN1cmUgaXRzIGEgYml0IHdpZHRoIHdlIHN1cHBvcnQgWzQuLjE2LCAzMl0gKi8KKwlpZiAoKGJpdHNfcGVyX3dvcmQgPCA0KQorCSAgICB8fCAoKGJpdHNfcGVyX3dvcmQgPiAxNikgJiYgKGJpdHNfcGVyX3dvcmQgIT0gMzIpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWh6KQorCQloeiA9IHNwaS0+bWF4X3NwZWVkX2h6OworCisJaWYgKCEobXBjOHh4eF9zcGktPmZsYWdzICYgU1BJX0NQTV9NT0RFKSkKKwkJYml0c19wZXJfd29yZCA9IG1zcGlfYXBwbHlfY3B1X21vZGVfcXVpcmtzKGNzLCBzcGksCisJCQkJCQkJICAgbXBjOHh4eF9zcGksCisJCQkJCQkJICAgYml0c19wZXJfd29yZCk7CisJZWxzZSBpZiAobXBjOHh4eF9zcGktPmZsYWdzICYgU1BJX1FFKQorCQliaXRzX3Blcl93b3JkID0gbXNwaV9hcHBseV9xZV9tb2RlX3F1aXJrcyhjcywgc3BpLAorCQkJCQkJCSAgYml0c19wZXJfd29yZCk7CisKKwlpZiAoYml0c19wZXJfd29yZCA8IDApCisJCXJldHVybiBiaXRzX3Blcl93b3JkOworCisJaWYgKGJpdHNfcGVyX3dvcmQgPT0gMzIpCisJCWJpdHNfcGVyX3dvcmQgPSAwOworCWVsc2UKKwkJYml0c19wZXJfd29yZCA9IGJpdHNfcGVyX3dvcmQgLSAxOworCisJLyogbWFzayBvdXQgYml0cyB3ZSBhcmUgZ29pbmcgdG8gc2V0ICovCisJY3MtPmh3X21vZGUgJj0gfihTUE1PREVfTEVOKDB4RikgfCBTUE1PREVfRElWMTYKKwkJCQkgIHwgU1BNT0RFX1BNKDB4RikpOworCisJY3MtPmh3X21vZGUgfD0gU1BNT0RFX0xFTihiaXRzX3Blcl93b3JkKTsKKworCWlmICgobXBjOHh4eF9zcGktPnNwaWJyZyAvIGh6KSA+IDY0KSB7CisJCWNzLT5od19tb2RlIHw9IFNQTU9ERV9ESVYxNjsKKwkJcG0gPSAobXBjOHh4eF9zcGktPnNwaWJyZyAtIDEpIC8gKGh6ICogNjQpICsgMTsKKworCQlXQVJOX09OQ0UocG0gPiAxNiwgIiVzOiBSZXF1ZXN0ZWQgc3BlZWQgaXMgdG9vIGxvdzogJWQgSHouICIKKwkJCSAgIldpbGwgdXNlICVkIEh6IGluc3RlYWQuXG4iLCBkZXZfbmFtZSgmc3BpLT5kZXYpLAorCQkJICBoeiwgbXBjOHh4eF9zcGktPnNwaWJyZyAvIDEwMjQpOworCQlpZiAocG0gPiAxNikKKwkJCXBtID0gMTY7CisJfSBlbHNlIHsKKwkJcG0gPSAobXBjOHh4eF9zcGktPnNwaWJyZyAtIDEpIC8gKGh6ICogNCkgKyAxOworCX0KKwlpZiAocG0pCisJCXBtLS07CisKKwljcy0+aHdfbW9kZSB8PSBTUE1PREVfUE0ocG0pOworCisJZnNsX3NwaV9jaGFuZ2VfbW9kZShzcGkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmc2xfc3BpX2NwbV9idWZzX3N0YXJ0KHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSkKK3sKKwlzdHJ1Y3QgY3BtX2J1Zl9kZXNjIF9faW9tZW0gKnR4X2JkID0gbXNwaS0+dHhfYmQ7CisJc3RydWN0IGNwbV9idWZfZGVzYyBfX2lvbWVtICpyeF9iZCA9IG1zcGktPnJ4X2JkOworCXVuc2lnbmVkIGludCB4ZmVyX2xlbiA9IG1pbihtc3BpLT5jb3VudCwgU1BJX01SQkxSKTsKKwl1bnNpZ25lZCBpbnQgeGZlcl9vZnM7CisJc3RydWN0IGZzbF9zcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOworCisJeGZlcl9vZnMgPSBtc3BpLT54ZmVyX2luX3Byb2dyZXNzLT5sZW4gLSBtc3BpLT5jb3VudDsKKworCWlmIChtc3BpLT5yeF9kbWEgPT0gbXNwaS0+ZG1hX2R1bW15X3J4KQorCQlvdXRfYmUzMigmcnhfYmQtPmNiZF9idWZhZGRyLCBtc3BpLT5yeF9kbWEpOworCWVsc2UKKwkJb3V0X2JlMzIoJnJ4X2JkLT5jYmRfYnVmYWRkciwgbXNwaS0+cnhfZG1hICsgeGZlcl9vZnMpOworCW91dF9iZTE2KCZyeF9iZC0+Y2JkX2RhdGxlbiwgMCk7CisJb3V0X2JlMTYoJnJ4X2JkLT5jYmRfc2MsIEJEX1NDX0VNUFRZIHwgQkRfU0NfSU5UUlBUIHwgQkRfU0NfV1JBUCk7CisKKwlpZiAobXNwaS0+dHhfZG1hID09IG1zcGktPmRtYV9kdW1teV90eCkKKwkJb3V0X2JlMzIoJnR4X2JkLT5jYmRfYnVmYWRkciwgbXNwaS0+dHhfZG1hKTsKKwllbHNlCisJCW91dF9iZTMyKCZ0eF9iZC0+Y2JkX2J1ZmFkZHIsIG1zcGktPnR4X2RtYSArIHhmZXJfb2ZzKTsKKwlvdXRfYmUxNigmdHhfYmQtPmNiZF9kYXRsZW4sIHhmZXJfbGVuKTsKKwlvdXRfYmUxNigmdHhfYmQtPmNiZF9zYywgQkRfU0NfUkVBRFkgfCBCRF9TQ19JTlRSUFQgfCBCRF9TQ19XUkFQIHwKKwkJCQkgQkRfU0NfTEFTVCk7CisKKwkvKiBzdGFydCB0cmFuc2ZlciAqLworCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmNvbW1hbmQsIFNQQ09NX1NUUik7Cit9CisKK3N0YXRpYyBpbnQgZnNsX3NwaV9jcG1fYnVmcyhzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCwgYm9vbCBpc19kbWFfbWFwcGVkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG1zcGktPmRldjsKKwlzdHJ1Y3QgZnNsX3NwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7CisKKwlpZiAoaXNfZG1hX21hcHBlZCkgeworCQltc3BpLT5tYXBfdHhfZG1hID0gMDsKKwkJbXNwaS0+bWFwX3J4X2RtYSA9IDA7CisJfSBlbHNlIHsKKwkJbXNwaS0+bWFwX3R4X2RtYSA9IDE7CisJCW1zcGktPm1hcF9yeF9kbWEgPSAxOworCX0KKworCWlmICghdC0+dHhfYnVmKSB7CisJCW1zcGktPnR4X2RtYSA9IG1zcGktPmRtYV9kdW1teV90eDsKKwkJbXNwaS0+bWFwX3R4X2RtYSA9IDA7CisJfQorCisJaWYgKCF0LT5yeF9idWYpIHsKKwkJbXNwaS0+cnhfZG1hID0gbXNwaS0+ZG1hX2R1bW15X3J4OworCQltc3BpLT5tYXBfcnhfZG1hID0gMDsKKwl9CisKKwlpZiAobXNwaS0+bWFwX3R4X2RtYSkgeworCQl2b2lkICpub25jb25zdF90eCA9ICh2b2lkICopbXNwaS0+dHg7IC8qIHNodXQgdXAgZ2NjICovCisKKwkJbXNwaS0+dHhfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LCBub25jb25zdF90eCwgdC0+bGVuLAorCQkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgbXNwaS0+dHhfZG1hKSkgeworCQkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gbWFwIHR4IGRtYVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0gZWxzZSBpZiAodC0+dHhfYnVmKSB7CisJCW1zcGktPnR4X2RtYSA9IHQtPnR4X2RtYTsKKwl9CisKKwlpZiAobXNwaS0+bWFwX3J4X2RtYSkgeworCQltc3BpLT5yeF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsIG1zcGktPnJ4LCB0LT5sZW4sCisJCQkJCSAgICAgIERNQV9GUk9NX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIG1zcGktPnJ4X2RtYSkpIHsKKwkJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIG1hcCByeCBkbWFcbiIpOworCQkJZ290byBlcnJfcnhfZG1hOworCQl9CisJfSBlbHNlIGlmICh0LT5yeF9idWYpIHsKKwkJbXNwaS0+cnhfZG1hID0gdC0+cnhfZG1hOworCX0KKworCS8qIGVuYWJsZSByeCBpbnRzICovCisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bWFzaywgU1BJRV9SWEIpOworCisJbXNwaS0+eGZlcl9pbl9wcm9ncmVzcyA9IHQ7CisJbXNwaS0+Y291bnQgPSB0LT5sZW47CisKKwkvKiBzdGFydCBDUE0gdHJhbnNmZXJzICovCisJZnNsX3NwaV9jcG1fYnVmc19zdGFydChtc3BpKTsKKworCXJldHVybiAwOworCitlcnJfcnhfZG1hOgorCWlmIChtc3BpLT5tYXBfdHhfZG1hKQorCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgbXNwaS0+dHhfZG1hLCB0LT5sZW4sIERNQV9UT19ERVZJQ0UpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBmc2xfc3BpX2NwbV9idWZzX2NvbXBsZXRlKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtc3BpLT5kZXY7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdCA9IG1zcGktPnhmZXJfaW5fcHJvZ3Jlc3M7CisKKwlpZiAobXNwaS0+bWFwX3R4X2RtYSkKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYsIG1zcGktPnR4X2RtYSwgdC0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwlpZiAobXNwaS0+bWFwX3J4X2RtYSkKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYsIG1zcGktPnJ4X2RtYSwgdC0+bGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCW1zcGktPnhmZXJfaW5fcHJvZ3Jlc3MgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGZzbF9zcGlfY3B1X2J1ZnMoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLAorCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdTMyIHdvcmQ7CisJc3RydWN0IGZzbF9zcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOworCisJbXNwaS0+Y291bnQgPSBsZW47CisKKwkvKiBlbmFibGUgcnggaW50cyAqLworCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1hc2ssIFNQSU1fTkUpOworCisJLyogdHJhbnNtaXQgd29yZCAqLworCXdvcmQgPSBtc3BpLT5nZXRfdHgobXNwaSk7CisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+dHJhbnNtaXQsIHdvcmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNsX3NwaV9idWZzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQsCisJCQkgICAgYm9vbCBpc19kbWFfbWFwcGVkKQoreworCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlzdHJ1Y3QgZnNsX3NwaV9yZWcgKnJlZ19iYXNlOworCXVuc2lnbmVkIGludCBsZW4gPSB0LT5sZW47CisJdTggYml0c19wZXJfd29yZDsKKwlpbnQgcmV0OworCisJcmVnX2Jhc2UgPSBtcGM4eHh4X3NwaS0+cmVnX2Jhc2U7CisJYml0c19wZXJfd29yZCA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwlpZiAodC0+Yml0c19wZXJfd29yZCkKKwkJYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7CisKKwlpZiAoYml0c19wZXJfd29yZCA+IDgpIHsKKwkJLyogaW52YWxpZCBsZW5ndGg/ICovCisJCWlmIChsZW4gJiAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWxlbiAvPSAyOworCX0KKwlpZiAoYml0c19wZXJfd29yZCA+IDE2KSB7CisJCS8qIGludmFsaWQgbGVuZ3RoPyAqLworCQlpZiAobGVuICYgMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlsZW4gLz0gMjsKKwl9CisKKwltcGM4eHh4X3NwaS0+dHggPSB0LT50eF9idWY7CisJbXBjOHh4eF9zcGktPnJ4ID0gdC0+cnhfYnVmOworCisJSU5JVF9DT01QTEVUSU9OKG1wYzh4eHhfc3BpLT5kb25lKTsKKworCWlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfQ1BNX01PREUpCisJCXJldCA9IGZzbF9zcGlfY3BtX2J1ZnMobXBjOHh4eF9zcGksIHQsIGlzX2RtYV9tYXBwZWQpOworCWVsc2UKKwkJcmV0ID0gZnNsX3NwaV9jcHVfYnVmcyhtcGM4eHh4X3NwaSwgdCwgbGVuKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJd2FpdF9mb3JfY29tcGxldGlvbigmbXBjOHh4eF9zcGktPmRvbmUpOworCisJLyogZGlzYWJsZSByeCBpbnRzICovCisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bWFzaywgMCk7CisKKwlpZiAobXBjOHh4eF9zcGktPmZsYWdzICYgU1BJX0NQTV9NT0RFKQorCQlmc2xfc3BpX2NwbV9idWZzX2NvbXBsZXRlKG1wYzh4eHhfc3BpKTsKKworCXJldHVybiBtcGM4eHh4X3NwaS0+Y291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9zcGlfZG9fb25lX21zZyhzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG0tPnNwaTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OworCXVuc2lnbmVkIGludCBjc19jaGFuZ2U7CisJY29uc3QgaW50IG5zZWNzID0gNTA7CisJaW50IHN0YXR1czsKKworCWNzX2NoYW5nZSA9IDE7CisJc3RhdHVzID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJaWYgKHQtPmJpdHNfcGVyX3dvcmQgfHwgdC0+c3BlZWRfaHopIHsKKwkJCS8qIERvbid0IGFsbG93IGNoYW5nZXMgaWYgQ1MgaXMgYWN0aXZlICovCisJCQlzdGF0dXMgPSAtRUlOVkFMOworCisJCQlpZiAoY3NfY2hhbmdlKQorCQkJCXN0YXR1cyA9IGZzbF9zcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNzX2NoYW5nZSkgeworCQkJZnNsX3NwaV9jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19BQ1RJVkUpOworCQkJbmRlbGF5KG5zZWNzKTsKKwkJfQorCQljc19jaGFuZ2UgPSB0LT5jc19jaGFuZ2U7CisJCWlmICh0LT5sZW4pCisJCQlzdGF0dXMgPSBmc2xfc3BpX2J1ZnMoc3BpLCB0LCBtLT5pc19kbWFfbWFwcGVkKTsKKwkJaWYgKHN0YXR1cykgeworCQkJc3RhdHVzID0gLUVNU0dTSVpFOworCQkJYnJlYWs7CisJCX0KKwkJbS0+YWN0dWFsX2xlbmd0aCArPSB0LT5sZW47CisKKwkJaWYgKHQtPmRlbGF5X3VzZWNzKQorCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKKworCQlpZiAoY3NfY2hhbmdlKSB7CisJCQluZGVsYXkobnNlY3MpOworCQkJZnNsX3NwaV9jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19JTkFDVElWRSk7CisJCQluZGVsYXkobnNlY3MpOworCQl9CisJfQorCisJbS0+c3RhdHVzID0gc3RhdHVzOworCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOworCisJaWYgKHN0YXR1cyB8fCAhY3NfY2hhbmdlKSB7CisJCW5kZWxheShuc2Vjcyk7CisJCWZzbF9zcGlfY2hpcHNlbGVjdChzcGksIEJJVEJBTkdfQ1NfSU5BQ1RJVkUpOworCX0KKworCWZzbF9zcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKK30KKworc3RhdGljIGludCBmc2xfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaTsKKwlzdHJ1Y3QgZnNsX3NwaV9yZWcgKnJlZ19iYXNlOworCWludCByZXR2YWw7CisJdTMyIGh3X21vZGU7CisJc3RydWN0IHNwaV9tcGM4eHh4X2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKworCWlmICghc3BpLT5tYXhfc3BlZWRfaHopCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFjcykgeworCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7CisJCWlmICghY3MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gY3M7CisJfQorCW1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlyZWdfYmFzZSA9IG1wYzh4eHhfc3BpLT5yZWdfYmFzZTsKKworCWh3X21vZGUgPSBjcy0+aHdfbW9kZTsgLyogU2F2ZSBvcmlnaW5hbCBzZXR0aW5ncyAqLworCWNzLT5od19tb2RlID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoJnJlZ19iYXNlLT5tb2RlKTsKKwkvKiBtYXNrIG91dCBiaXRzIHdlIGFyZSBnb2luZyB0byBzZXQgKi8KKwljcy0+aHdfbW9kZSAmPSB+KFNQTU9ERV9DUF9CRUdJTl9FREdFQ0xLIHwgU1BNT0RFX0NJX0lOQUNUSVZFSElHSAorCQkJIHwgU1BNT0RFX1JFViB8IFNQTU9ERV9MT09QKTsKKworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJY3MtPmh3X21vZGUgfD0gU1BNT0RFX0NQX0JFR0lOX0VER0VDTEs7CisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQorCQljcy0+aHdfbW9kZSB8PSBTUE1PREVfQ0lfSU5BQ1RJVkVISUdIOworCWlmICghKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpKQorCQljcy0+aHdfbW9kZSB8PSBTUE1PREVfUkVWOworCWlmIChzcGktPm1vZGUgJiBTUElfTE9PUCkKKwkJY3MtPmh3X21vZGUgfD0gU1BNT0RFX0xPT1A7CisKKwlyZXR2YWwgPSBmc2xfc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJY3MtPmh3X21vZGUgPSBod19tb2RlOyAvKiBSZXN0b3JlIHNldHRpbmdzICovCisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmc2xfc3BpX2NwbV9pcnEoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLCB1MzIgZXZlbnRzKQoreworCXUxNiBsZW47CisJc3RydWN0IGZzbF9zcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOworCisJZGV2X2RiZyhtc3BpLT5kZXYsICIlczogYmQgZGF0bGVuICVkLCBjb3VudCAlZFxuIiwgX19mdW5jX18sCisJCWluX2JlMTYoJm1zcGktPnJ4X2JkLT5jYmRfZGF0bGVuKSwgbXNwaS0+Y291bnQpOworCisJbGVuID0gaW5fYmUxNigmbXNwaS0+cnhfYmQtPmNiZF9kYXRsZW4pOworCWlmIChsZW4gPiBtc3BpLT5jb3VudCkgeworCQlXQVJOX09OKDEpOworCQlsZW4gPSBtc3BpLT5jb3VudDsKKwl9CisKKwkvKiBDbGVhciB0aGUgZXZlbnRzICovCisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+ZXZlbnQsIGV2ZW50cyk7CisKKwltc3BpLT5jb3VudCAtPSBsZW47CisJaWYgKG1zcGktPmNvdW50KQorCQlmc2xfc3BpX2NwbV9idWZzX3N0YXJ0KG1zcGkpOworCWVsc2UKKwkJY29tcGxldGUoJm1zcGktPmRvbmUpOworfQorCitzdGF0aWMgdm9pZCBmc2xfc3BpX2NwdV9pcnEoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLCB1MzIgZXZlbnRzKQoreworCXN0cnVjdCBmc2xfc3BpX3JlZyAqcmVnX2Jhc2UgPSBtc3BpLT5yZWdfYmFzZTsKKworCS8qIFdlIG5lZWQgaGFuZGxlIFJYIGZpcnN0ICovCisJaWYgKGV2ZW50cyAmIFNQSUVfTkUpIHsKKwkJdTMyIHJ4X2RhdGEgPSBtcGM4eHh4X3NwaV9yZWFkX3JlZygmcmVnX2Jhc2UtPnJlY2VpdmUpOworCisJCWlmIChtc3BpLT5yeCkKKwkJCW1zcGktPmdldF9yeChyeF9kYXRhLCBtc3BpKTsKKwl9CisKKwlpZiAoKGV2ZW50cyAmIFNQSUVfTkYpID09IDApCisJCS8qIHNwaW4gdW50aWwgVFggaXMgZG9uZSAqLworCQl3aGlsZSAoKChldmVudHMgPQorCQkJbXBjOHh4eF9zcGlfcmVhZF9yZWcoJnJlZ19iYXNlLT5ldmVudCkpICYKKwkJCQkJCVNQSUVfTkYpID09IDApCisJCQljcHVfcmVsYXgoKTsKKworCS8qIENsZWFyIHRoZSBldmVudHMgKi8KKwltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5ldmVudCwgZXZlbnRzKTsKKworCW1zcGktPmNvdW50IC09IDE7CisJaWYgKG1zcGktPmNvdW50KSB7CisJCXUzMiB3b3JkID0gbXNwaS0+Z2V0X3R4KG1zcGkpOworCisJCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPnRyYW5zbWl0LCB3b3JkKTsKKwl9IGVsc2UgeworCQljb21wbGV0ZSgmbXNwaS0+ZG9uZSk7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX3NwaV9pcnEoczMyIGlycSwgdm9pZCAqY29udGV4dF9kYXRhKQoreworCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSA9IGNvbnRleHRfZGF0YTsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKwl1MzIgZXZlbnRzOworCXN0cnVjdCBmc2xfc3BpX3JlZyAqcmVnX2Jhc2UgPSBtc3BpLT5yZWdfYmFzZTsKKworCS8qIEdldCBpbnRlcnJ1cHQgZXZlbnRzKHR4L3J4KSAqLworCWV2ZW50cyA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZyZWdfYmFzZS0+ZXZlbnQpOworCWlmIChldmVudHMpCisJCXJldCA9IElSUV9IQU5ETEVEOworCisJZGV2X2RiZyhtc3BpLT5kZXYsICIlczogZXZlbnRzICV4XG4iLCBfX2Z1bmNfXywgZXZlbnRzKTsKKworCWlmIChtc3BpLT5mbGFncyAmIFNQSV9DUE1fTU9ERSkKKwkJZnNsX3NwaV9jcG1faXJxKG1zcGksIGV2ZW50cyk7CisJZWxzZQorCQlmc2xfc3BpX2NwdV9pcnEobXNwaSwgZXZlbnRzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkICpmc2xfc3BpX2FsbG9jX2R1bW15X3J4KHZvaWQpCit7CisJbXV0ZXhfbG9jaygmZnNsX2R1bW15X3J4X2xvY2spOworCisJaWYgKCFmc2xfZHVtbXlfcngpCisJCWZzbF9kdW1teV9yeCA9IGttYWxsb2MoU1BJX01SQkxSLCBHRlBfS0VSTkVMKTsKKwlpZiAoZnNsX2R1bW15X3J4KQorCQlmc2xfZHVtbXlfcnhfcmVmY250Kys7CisKKwltdXRleF91bmxvY2soJmZzbF9kdW1teV9yeF9sb2NrKTsKKworCXJldHVybiBmc2xfZHVtbXlfcng7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9zcGlfZnJlZV9kdW1teV9yeCh2b2lkKQoreworCW11dGV4X2xvY2soJmZzbF9kdW1teV9yeF9sb2NrKTsKKworCXN3aXRjaCAoZnNsX2R1bW15X3J4X3JlZmNudCkgeworCWNhc2UgMDoKKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlrZnJlZShmc2xfZHVtbXlfcngpOworCQlmc2xfZHVtbXlfcnggPSBOVUxMOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQlmc2xfZHVtbXlfcnhfcmVmY250LS07CisJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmZnNsX2R1bW15X3J4X2xvY2spOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmc2xfc3BpX2NwbV9nZXRfcHJhbShzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGkpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbXNwaS0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJY29uc3QgdTMyICppcHJvcDsKKwlpbnQgc2l6ZTsKKwl2b2lkIF9faW9tZW0gKnNwaV9iYXNlOworCXVuc2lnbmVkIGxvbmcgcHJhbV9vZnMgPSAtRU5PTUVNOworCisJLyogQ2FuJ3QgdXNlIG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoKSwgUUUgbXVyYW0gaXNuJ3QgYXQgMC4gKi8KKwlpcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsICZzaXplKTsKKworCS8qIFFFIHdpdGggYSBmaXhlZCBwcmFtIGxvY2F0aW9uPyAqLworCWlmIChtc3BpLT5mbGFncyAmIFNQSV9RRSAmJiBpcHJvcCAmJiBzaXplID09IHNpemVvZigqaXByb3ApICogNCkKKwkJcmV0dXJuIGNwbV9tdXJhbV9hbGxvY19maXhlZChpcHJvcFsyXSwgU1BJX1BSQU1fU0laRSk7CisKKwkvKiBRRSBidXQgd2l0aCBhIGR5bmFtaWMgcHJhbSBsb2NhdGlvbj8gKi8KKwlpZiAobXNwaS0+ZmxhZ3MgJiBTUElfUUUpIHsKKwkJcHJhbV9vZnMgPSBjcG1fbXVyYW1fYWxsb2MoU1BJX1BSQU1fU0laRSwgNjQpOworCQlxZV9pc3N1ZV9jbWQoUUVfQVNTSUdOX1BBR0VfVE9fREVWSUNFLCBtc3BpLT5zdWJibG9jaywKKwkJCQlRRV9DUl9QUk9UT0NPTF9VTlNQRUNJRklFRCwgcHJhbV9vZnMpOworCQlyZXR1cm4gcHJhbV9vZnM7CisJfQorCisJc3BpX2Jhc2UgPSBvZl9pb21hcChucCwgMSk7CisJaWYgKHNwaV9iYXNlID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1zcGktPmZsYWdzICYgU1BJX0NQTTIpIHsKKwkJcHJhbV9vZnMgPSBjcG1fbXVyYW1fYWxsb2MoU1BJX1BSQU1fU0laRSwgNjQpOworCQlvdXRfYmUxNihzcGlfYmFzZSwgcHJhbV9vZnMpOworCX0gZWxzZSB7CisJCXN0cnVjdCBzcGlfcHJhbSBfX2lvbWVtICpwcmFtID0gc3BpX2Jhc2U7CisJCXUxNiBycGJhc2UgPSBpbl9iZTE2KCZwcmFtLT5ycGJhc2UpOworCisJCS8qIE1pY3JvY29kZSByZWxvY2F0aW9uIHBhdGNoIGFwcGxpZWQ/ICovCisJCWlmIChycGJhc2UpCisJCQlwcmFtX29mcyA9IHJwYmFzZTsKKwkJZWxzZSB7CisJCQlwcmFtX29mcyA9IGNwbV9tdXJhbV9hbGxvYyhTUElfUFJBTV9TSVpFLCA2NCk7CisJCQlvdXRfYmUxNihzcGlfYmFzZSwgcHJhbV9vZnMpOworCQl9CisJfQorCisJaW91bm1hcChzcGlfYmFzZSk7CisJcmV0dXJuIHByYW1fb2ZzOworfQorCitzdGF0aWMgaW50IGZzbF9zcGlfY3BtX2luaXQoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG1zcGktPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCWNvbnN0IHUzMiAqaXByb3A7CisJaW50IHNpemU7CisJdW5zaWduZWQgbG9uZyBwcmFtX29mczsKKwl1bnNpZ25lZCBsb25nIGJkc19vZnM7CisKKwlpZiAoIShtc3BpLT5mbGFncyAmIFNQSV9DUE1fTU9ERSkpCisJCXJldHVybiAwOworCisJaWYgKCFmc2xfc3BpX2FsbG9jX2R1bW15X3J4KCkpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKG1zcGktPmZsYWdzICYgU1BJX1FFKSB7CisJCWlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY2VsbC1pbmRleCIsICZzaXplKTsKKwkJaWYgKGlwcm9wICYmIHNpemUgPT0gc2l6ZW9mKCppcHJvcCkpCisJCQltc3BpLT5zdWJibG9jayA9ICppcHJvcDsKKworCQlzd2l0Y2ggKG1zcGktPnN1YmJsb2NrKSB7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybihkZXYsICJjZWxsLWluZGV4IHVuc3BlY2lmaWVkLCBhc3N1bWluZyBTUEkxIik7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAwOgorCQkJbXNwaS0+c3ViYmxvY2sgPSBRRV9DUl9TVUJCTE9DS19TUEkxOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW1zcGktPnN1YmJsb2NrID0gUUVfQ1JfU1VCQkxPQ0tfU1BJMjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcHJhbV9vZnMgPSBmc2xfc3BpX2NwbV9nZXRfcHJhbShtc3BpKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHByYW1fb2ZzKSkgeworCQlkZXZfZXJyKGRldiwgImNhbid0IGFsbG9jYXRlIHNwaSBwYXJhbWV0ZXIgcmFtXG4iKTsKKwkJZ290byBlcnJfcHJhbTsKKwl9CisKKwliZHNfb2ZzID0gY3BtX211cmFtX2FsbG9jKHNpemVvZigqbXNwaS0+dHhfYmQpICsKKwkJCQkgIHNpemVvZigqbXNwaS0+cnhfYmQpLCA4KTsKKwlpZiAoSVNfRVJSX1ZBTFVFKGJkc19vZnMpKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgYWxsb2NhdGUgYmRzXG4iKTsKKwkJZ290byBlcnJfYmRzOworCX0KKworCW1zcGktPmRtYV9kdW1teV90eCA9IGRtYV9tYXBfc2luZ2xlKGRldiwgZW1wdHlfemVyb19wYWdlLCBQQUdFX1NJWkUsCisJCQkJCSAgICBETUFfVE9fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBtc3BpLT5kbWFfZHVtbXlfdHgpKSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIG1hcCBkdW1teSB0eCBidWZmZXJcbiIpOworCQlnb3RvIGVycl9kdW1teV90eDsKKwl9CisKKwltc3BpLT5kbWFfZHVtbXlfcnggPSBkbWFfbWFwX3NpbmdsZShkZXYsIGZzbF9kdW1teV9yeCwgU1BJX01SQkxSLAorCQkJCQkgICAgRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBtc3BpLT5kbWFfZHVtbXlfcngpKSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIG1hcCBkdW1teSByeCBidWZmZXJcbiIpOworCQlnb3RvIGVycl9kdW1teV9yeDsKKwl9CisKKwltc3BpLT5wcmFtID0gY3BtX211cmFtX2FkZHIocHJhbV9vZnMpOworCisJbXNwaS0+dHhfYmQgPSBjcG1fbXVyYW1fYWRkcihiZHNfb2ZzKTsKKwltc3BpLT5yeF9iZCA9IGNwbV9tdXJhbV9hZGRyKGJkc19vZnMgKyBzaXplb2YoKm1zcGktPnR4X2JkKSk7CisKKwkvKiBJbml0aWFsaXplIHBhcmFtZXRlciByYW0uICovCisJb3V0X2JlMTYoJm1zcGktPnByYW0tPnRiYXNlLCBjcG1fbXVyYW1fb2Zmc2V0KG1zcGktPnR4X2JkKSk7CisJb3V0X2JlMTYoJm1zcGktPnByYW0tPnJiYXNlLCBjcG1fbXVyYW1fb2Zmc2V0KG1zcGktPnJ4X2JkKSk7CisJb3V0XzgoJm1zcGktPnByYW0tPnRmY3IsIENQTUZDUl9FQiB8IENQTUZDUl9HQkwpOworCW91dF84KCZtc3BpLT5wcmFtLT5yZmNyLCBDUE1GQ1JfRUIgfCBDUE1GQ1JfR0JMKTsKKwlvdXRfYmUxNigmbXNwaS0+cHJhbS0+bXJibHIsIFNQSV9NUkJMUik7CisJb3V0X2JlMzIoJm1zcGktPnByYW0tPnJzdGF0ZSwgMCk7CisJb3V0X2JlMzIoJm1zcGktPnByYW0tPnJkcCwgMCk7CisJb3V0X2JlMTYoJm1zcGktPnByYW0tPnJicHRyLCAwKTsKKwlvdXRfYmUxNigmbXNwaS0+cHJhbS0+cmJjLCAwKTsKKwlvdXRfYmUzMigmbXNwaS0+cHJhbS0+cnh0bXAsIDApOworCW91dF9iZTMyKCZtc3BpLT5wcmFtLT50c3RhdGUsIDApOworCW91dF9iZTMyKCZtc3BpLT5wcmFtLT50ZHAsIDApOworCW91dF9iZTE2KCZtc3BpLT5wcmFtLT50YnB0ciwgMCk7CisJb3V0X2JlMTYoJm1zcGktPnByYW0tPnRiYywgMCk7CisJb3V0X2JlMzIoJm1zcGktPnByYW0tPnR4dG1wLCAwKTsKKworCXJldHVybiAwOworCitlcnJfZHVtbXlfcng6CisJZG1hX3VubWFwX3NpbmdsZShkZXYsIG1zcGktPmRtYV9kdW1teV90eCwgUEFHRV9TSVpFLCBETUFfVE9fREVWSUNFKTsKK2Vycl9kdW1teV90eDoKKwljcG1fbXVyYW1fZnJlZShiZHNfb2ZzKTsKK2Vycl9iZHM6CisJY3BtX211cmFtX2ZyZWUocHJhbV9vZnMpOworZXJyX3ByYW06CisJZnNsX3NwaV9mcmVlX2R1bW15X3J4KCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9zcGlfY3BtX2ZyZWUoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG1zcGktPmRldjsKKworCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBtc3BpLT5kbWFfZHVtbXlfcngsIFNQSV9NUkJMUiwgRE1BX0ZST01fREVWSUNFKTsKKwlkbWFfdW5tYXBfc2luZ2xlKGRldiwgbXNwaS0+ZG1hX2R1bW15X3R4LCBQQUdFX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCWNwbV9tdXJhbV9mcmVlKGNwbV9tdXJhbV9vZmZzZXQobXNwaS0+dHhfYmQpKTsKKwljcG1fbXVyYW1fZnJlZShjcG1fbXVyYW1fb2Zmc2V0KG1zcGktPnByYW0pKTsKKwlmc2xfc3BpX2ZyZWVfZHVtbXlfcngoKTsKK30KKworc3RhdGljIHZvaWQgZnNsX3NwaV9yZW1vdmUoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpKQoreworCWlvdW5tYXAobXNwaS0+cmVnX2Jhc2UpOworCWZzbF9zcGlfY3BtX2ZyZWUobXNwaSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX21hc3RlciAqIF9fZGV2aW5pdCBmc2xfc3BpX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHJlc291cmNlICptZW0sIHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGZzbF9zcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpOworCXN0cnVjdCBmc2xfc3BpX3JlZyAqcmVnX2Jhc2U7CisJdTMyIHJlZ3ZhbDsKKwlpbnQgcmV0ID0gMDsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2Yoc3RydWN0IG1wYzh4eHhfc3BpKSk7CisJaWYgKG1hc3RlciA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7CisKKwlyZXQgPSBtcGM4eHh4X3NwaV9wcm9iZShkZXYsIG1lbSwgaXJxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wcm9iZTsKKworCW1hc3Rlci0+c2V0dXAgPSBmc2xfc3BpX3NldHVwOworCisJbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJbXBjOHh4eF9zcGktPnNwaV9kb19vbmVfbXNnID0gZnNsX3NwaV9kb19vbmVfbXNnOworCW1wYzh4eHhfc3BpLT5zcGlfcmVtb3ZlID0gZnNsX3NwaV9yZW1vdmU7CisKKworCXJldCA9IGZzbF9zcGlfY3BtX2luaXQobXBjOHh4eF9zcGkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2NwbV9pbml0OworCisJaWYgKG1wYzh4eHhfc3BpLT5mbGFncyAmIFNQSV9RRV9DUFVfTU9ERSkgeworCQltcGM4eHh4X3NwaS0+cnhfc2hpZnQgPSAxNjsKKwkJbXBjOHh4eF9zcGktPnR4X3NoaWZ0ID0gMjQ7CisJfQorCisJbXBjOHh4eF9zcGktPnJlZ19iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCWlmIChtcGM4eHh4X3NwaS0+cmVnX2Jhc2UgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pb3JlbWFwOworCX0KKworCS8qIFJlZ2lzdGVyIGZvciBTUEkgSW50ZXJydXB0ICovCisJcmV0ID0gcmVxdWVzdF9pcnEobXBjOHh4eF9zcGktPmlycSwgZnNsX3NwaV9pcnEsCisJCQkgIDAsICJmc2xfc3BpIiwgbXBjOHh4eF9zcGkpOworCisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGZyZWVfaXJxOworCisJcmVnX2Jhc2UgPSBtcGM4eHh4X3NwaS0+cmVnX2Jhc2U7CisKKwkvKiBTUEkgY29udHJvbGxlciBpbml0aWFsaXphdGlvbnMgKi8KKwltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tb2RlLCAwKTsKKwltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tYXNrLCAwKTsKKwltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5jb21tYW5kLCAwKTsKKwltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5ldmVudCwgMHhmZmZmZmZmZik7CisKKwkvKiBFbmFibGUgU1BJIGludGVyZmFjZSAqLworCXJlZ3ZhbCA9IHBkYXRhLT5pbml0aWFsX3NwbW9kZSB8IFNQTU9ERV9JTklUX1ZBTCB8IFNQTU9ERV9FTkFCTEU7CisJaWYgKG1wYzh4eHhfc3BpLT5mbGFncyAmIFNQSV9RRV9DUFVfTU9ERSkKKwkJcmVndmFsIHw9IFNQTU9ERV9PUDsKKworCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1vZGUsIHJlZ3ZhbCk7CisKKwlyZXQgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdW5yZWdfbWFzdGVyOworCisJZGV2X2luZm8oZGV2LCAiYXQgMHglcCAoaXJxID0gJWQpLCAlcyBtb2RlXG4iLCByZWdfYmFzZSwKKwkJIG1wYzh4eHhfc3BpLT5pcnEsIG1wYzh4eHhfc3BpX3N0cm1vZGUobXBjOHh4eF9zcGktPmZsYWdzKSk7CisKKwlyZXR1cm4gbWFzdGVyOworCit1bnJlZ19tYXN0ZXI6CisJZnJlZV9pcnEobXBjOHh4eF9zcGktPmlycSwgbXBjOHh4eF9zcGkpOworZnJlZV9pcnE6CisJaW91bm1hcChtcGM4eHh4X3NwaS0+cmVnX2Jhc2UpOworZXJyX2lvcmVtYXA6CisJZnNsX3NwaV9jcG1fZnJlZShtcGM4eHh4X3NwaSk7CitlcnJfY3BtX2luaXQ6CitlcnJfcHJvYmU6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKK2VycjoKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgdm9pZCBmc2xfc3BpX2NzX2NvbnRyb2woc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgYm9vbCBvbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzcGktPmRldi5wYXJlbnQ7CisJc3RydWN0IG1wYzh4eHhfc3BpX3Byb2JlX2luZm8gKnBpbmZvID0gdG9fb2ZfcGluZm8oZGV2LT5wbGF0Zm9ybV9kYXRhKTsKKwl1MTYgY3MgPSBzcGktPmNoaXBfc2VsZWN0OworCWludCBncGlvID0gcGluZm8tPmdwaW9zW2NzXTsKKwlib29sIGFsb3cgPSBwaW5mby0+YWxvd19mbGFnc1tjc107CisKKwlncGlvX3NldF92YWx1ZShncGlvLCBvbiBeIGFsb3cpOworfQorCitzdGF0aWMgaW50IG9mX2ZzbF9zcGlfZ2V0X2NoaXBzZWxlY3RzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCXN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtcGM4eHh4X3NwaV9wcm9iZV9pbmZvICpwaW5mbyA9IHRvX29mX3BpbmZvKHBkYXRhKTsKKwl1bnNpZ25lZCBpbnQgbmdwaW9zOworCWludCBpID0gMDsKKwlpbnQgcmV0OworCisJbmdwaW9zID0gb2ZfZ3Bpb19jb3VudChucCk7CisJaWYgKCFuZ3Bpb3MpIHsKKwkJLyoKKwkJICogU1BJIHcvbyBjaGlwLXNlbGVjdCBsaW5lLiBPbmUgU1BJIGRldmljZSBpcyBzdGlsbCBwZXJtaXR0ZWQKKwkJICogdGhvdWdoLgorCQkgKi8KKwkJcGRhdGEtPm1heF9jaGlwc2VsZWN0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGluZm8tPmdwaW9zID0ga21hbGxvYyhuZ3Bpb3MgKiBzaXplb2YoKnBpbmZvLT5ncGlvcyksIEdGUF9LRVJORUwpOworCWlmICghcGluZm8tPmdwaW9zKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocGluZm8tPmdwaW9zLCAtMSwgbmdwaW9zICogc2l6ZW9mKCpwaW5mby0+Z3Bpb3MpKTsKKworCXBpbmZvLT5hbG93X2ZsYWdzID0ga3phbGxvYyhuZ3Bpb3MgKiBzaXplb2YoKnBpbmZvLT5hbG93X2ZsYWdzKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaW5mby0+YWxvd19mbGFncykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvY19mbGFnczsKKwl9CisKKwlmb3IgKDsgaSA8IG5ncGlvczsgaSsrKSB7CisJCWludCBncGlvOworCQllbnVtIG9mX2dwaW9fZmxhZ3MgZmxhZ3M7CisKKwkJZ3BpbyA9IG9mX2dldF9ncGlvX2ZsYWdzKG5wLCBpLCAmZmxhZ3MpOworCQlpZiAoIWdwaW9faXNfdmFsaWQoZ3BpbykpIHsKKwkJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBncGlvICMlZDogJWRcbiIsIGksIGdwaW8pOworCQkJcmV0ID0gZ3BpbzsKKwkJCWdvdG8gZXJyX2xvb3A7CisJCX0KKworCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3BpbywgZGV2X25hbWUoZGV2KSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiY2FuJ3QgcmVxdWVzdCBncGlvICMlZDogJWRcbiIsIGksIHJldCk7CisJCQlnb3RvIGVycl9sb29wOworCQl9CisKKwkJcGluZm8tPmdwaW9zW2ldID0gZ3BpbzsKKwkJcGluZm8tPmFsb3dfZmxhZ3NbaV0gPSBmbGFncyAmIE9GX0dQSU9fQUNUSVZFX0xPVzsKKworCQlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQocGluZm8tPmdwaW9zW2ldLAorCQkJCQkgICAgcGluZm8tPmFsb3dfZmxhZ3NbaV0pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgImNhbid0IHNldCBvdXRwdXQgZGlyZWN0aW9uIGZvciBncGlvICIKKwkJCQkiIyVkOiAlZFxuIiwgaSwgcmV0KTsKKwkJCWdvdG8gZXJyX2xvb3A7CisJCX0KKwl9CisKKwlwZGF0YS0+bWF4X2NoaXBzZWxlY3QgPSBuZ3Bpb3M7CisJcGRhdGEtPmNzX2NvbnRyb2wgPSBmc2xfc3BpX2NzX2NvbnRyb2w7CisKKwlyZXR1cm4gMDsKKworZXJyX2xvb3A6CisJd2hpbGUgKGkgPj0gMCkgeworCQlpZiAoZ3Bpb19pc192YWxpZChwaW5mby0+Z3Bpb3NbaV0pKQorCQkJZ3Bpb19mcmVlKHBpbmZvLT5ncGlvc1tpXSk7CisJCWktLTsKKwl9CisKKwlrZnJlZShwaW5mby0+YWxvd19mbGFncyk7CisJcGluZm8tPmFsb3dfZmxhZ3MgPSBOVUxMOworZXJyX2FsbG9jX2ZsYWdzOgorCWtmcmVlKHBpbmZvLT5ncGlvcyk7CisJcGluZm8tPmdwaW9zID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9mX2ZzbF9zcGlfZnJlZV9jaGlwc2VsZWN0cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZzbF9zcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG1wYzh4eHhfc3BpX3Byb2JlX2luZm8gKnBpbmZvID0gdG9fb2ZfcGluZm8ocGRhdGEpOworCWludCBpOworCisJaWYgKCFwaW5mby0+Z3Bpb3MpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5tYXhfY2hpcHNlbGVjdDsgaSsrKSB7CisJCWlmIChncGlvX2lzX3ZhbGlkKHBpbmZvLT5ncGlvc1tpXSkpCisJCQlncGlvX2ZyZWUocGluZm8tPmdwaW9zW2ldKTsKKwl9CisKKwlrZnJlZShwaW5mby0+Z3Bpb3MpOworCWtmcmVlKHBpbmZvLT5hbG93X2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgb2ZfZnNsX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmb2ZkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb2ZkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHJlc291cmNlIG1lbTsKKwlzdHJ1Y3QgcmVzb3VyY2UgaXJxOworCWludCByZXQgPSAtRU5PTUVNOworCisJcmV0ID0gb2ZfbXBjOHh4eF9zcGlfcHJvYmUob2ZkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBvZl9mc2xfc3BpX2dldF9jaGlwc2VsZWN0cyhkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJm1lbSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZpcnEpOworCWlmICghcmV0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCW1hc3RlciA9IGZzbF9zcGlfcHJvYmUoZGV2LCAmbWVtLCBpcnEuc3RhcnQpOworCWlmIChJU19FUlIobWFzdGVyKSkgeworCQlyZXQgPSBQVFJfRVJSKG1hc3Rlcik7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworCitlcnI6CisJb2ZfZnNsX3NwaV9mcmVlX2NoaXBzZWxlY3RzKGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgb2ZfZnNsX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IG1wYzh4eHhfc3BpX3JlbW92ZSgmb2ZkZXYtPmRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlvZl9mc2xfc3BpX2ZyZWVfY2hpcHNlbGVjdHMoJm9mZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9mc2xfc3BpX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsc3BpIiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2ZfZnNsX3NwaV9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9mX2ZzbF9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImZzbF9zcGkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfZnNsX3NwaV9tYXRjaCwKKwl9LAorCS5wcm9iZQkJPSBvZl9mc2xfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aob2ZfZnNsX3NwaV9yZW1vdmUpLAorfTsKKworI2lmZGVmIENPTkZJR19NUEM4MzJ4X1JEQgorLyoKKyAqIFhYWCBYWFggWFhYCisgKiBUaGlzIGlzICJsZWdhY3kiIHBsYXRmb3JtIGRyaXZlciwgd2FzIHVzZWQgYnkgdGhlIE1QQzgzMjNFLVJEQiBib2FyZHMKKyAqIG9ubHkuIFRoZSBkcml2ZXIgc2hvdWxkIGdvIGF3YXkgc29vbiwgc2luY2UgbmV3ZXIgTVBDODMyM0UtUkRCJ3MgZGV2aWNlCisgKiB0cmVlIGNhbiB3b3JrIHdpdGggT3BlbkZpcm13YXJlIGRyaXZlci4gQnV0IGZvciBub3cgd2Ugc3VwcG9ydCBvbGQgdHJlZXMKKyAqIGFzIHdlbGwuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHBsYXRfbXBjOHh4eF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwlpbnQgaXJxOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisKKwlpZiAoIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFtZW0pCisJCXJldHVybiAtRUlOVkFMOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbWFzdGVyID0gZnNsX3NwaV9wcm9iZSgmcGRldi0+ZGV2LCBtZW0sIGlycSk7CisJaWYgKElTX0VSUihtYXN0ZXIpKQorCQlyZXR1cm4gUFRSX0VSUihtYXN0ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBwbGF0X21wYzh4eHhfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBtcGM4eHh4X3NwaV9yZW1vdmUoJnBkZXYtPmRldik7Cit9CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06bXBjOHh4eF9zcGkiKTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1wYzh4eHhfc3BpX2RyaXZlciA9IHsKKwkucHJvYmUgPSBwbGF0X21wYzh4eHhfc3BpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChwbGF0X21wYzh4eHhfc3BpX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXBjOHh4eF9zcGkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGJvb2wgbGVnYWN5X2RyaXZlcl9mYWlsZWQ7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBsZWdhY3lfZHJpdmVyX3JlZ2lzdGVyKHZvaWQpCit7CisJbGVnYWN5X2RyaXZlcl9mYWlsZWQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1wYzh4eHhfc3BpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsZWdhY3lfZHJpdmVyX3VucmVnaXN0ZXIodm9pZCkKK3sKKwlpZiAobGVnYWN5X2RyaXZlcl9mYWlsZWQpCisJCXJldHVybjsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXBjOHh4eF9zcGlfZHJpdmVyKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgbGVnYWN5X2RyaXZlcl9yZWdpc3Rlcih2b2lkKSB7fQorc3RhdGljIHZvaWQgX19leGl0IGxlZ2FjeV9kcml2ZXJfdW5yZWdpc3Rlcih2b2lkKSB7fQorI2VuZGlmIC8qIENPTkZJR19NUEM4MzJ4X1JEQiAqLworCitzdGF0aWMgaW50IF9faW5pdCBmc2xfc3BpX2luaXQodm9pZCkKK3sKKwlsZWdhY3lfZHJpdmVyX3JlZ2lzdGVyKCk7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb2ZfZnNsX3NwaV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoZnNsX3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGZzbF9zcGlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvZl9mc2xfc3BpX2RyaXZlcik7CisJbGVnYWN5X2RyaXZlcl91bnJlZ2lzdGVyKCk7Cit9Cittb2R1bGVfZXhpdChmc2xfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJLdW1hciBHYWxhIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSBGcmVlc2NhbGUgU1BJIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWdwaW8uYyBiL2RyaXZlcnMvc3BpL3NwaS1ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4OGFiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1ncGlvLmMKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBTUEkgbWFzdGVyIGRyaXZlciB1c2luZyBnZW5lcmljIGJpdGJhbmdlZCBHUElPCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LDIwMDggRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9ncGlvLmg+CisKKworLyoKKyAqIFRoaXMgYml0YmFuZ2luZyBTUEkgbWFzdGVyIGRyaXZlciBzaG91bGQgaGVscCBtYWtlIHN5c3RlbXMgdXNhYmxlCisgKiB3aGVuIGEgbmF0aXZlIGhhcmR3YXJlIFNQSSBlbmdpbmUgaXMgbm90IGF2YWlsYWJsZSwgcGVyaGFwcyBiZWNhdXNlCisgKiBpdHMgZHJpdmVyIGlzbid0IHlldCB3b3JraW5nIG9yIGJlY2F1c2UgdGhlIEkvTyBwaW5zIGl0IHJlcXVpcmVzCisgKiBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMuCisgKgorICogcGxhdGZvcm1fZGV2aWNlLT5kcml2ZXJfZGF0YSAuLi4gcG9pbnRzIHRvIHNwaV9ncGlvCisgKgorICogc3BpLT5jb250cm9sbGVyX3N0YXRlIC4uLiByZXNlcnZlZCBmb3IgYml0YmFuZyBmcmFtZXdvcmsgY29kZQorICogc3BpLT5jb250cm9sbGVyX2RhdGEgLi4uIGhvbGRzIGNoaXBzZWxlY3QgR1BJTworICoKKyAqIHNwaS0+bWFzdGVyLT5kZXYuZHJpdmVyX2RhdGEgLi4uIHBvaW50cyB0byBzcGlfZ3Bpby0+Yml0YmFuZworICovCisKK3N0cnVjdCBzcGlfZ3BpbyB7CisJc3RydWN0IHNwaV9iaXRiYW5nCQliaXRiYW5nOworCXN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhCXBkYXRhOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEJlY2F1c2UgdGhlIG92ZXJoZWFkIG9mIGdvaW5nIHRocm91Z2ggZm91ciBHUElPIHByb2NlZHVyZSBjYWxscworICogcGVyIHRyYW5zZmVycmVkIGJpdCBjYW4gbWFrZSBwZXJmb3JtYW5jZSBhIHByb2JsZW0sIHRoaXMgY29kZQorICogaXMgc2V0IHVwIHNvIHRoYXQgeW91IGNhbiB1c2UgaXQgaW4gZWl0aGVyIG9mIHR3byB3YXlzOgorICoKKyAqICAgLSBUaGUgc2xvdyBnZW5lcmljIHdheTogIHNldCB1cCBwbGF0Zm9ybV9kYXRhIHRvIGhvbGQgdGhlIEdQSU8KKyAqICAgICBudW1iZXJzIHVzZWQgZm9yIE1JU08vTU9TSS9TQ0ssIGFuZCBpc3N1ZSBwcm9jZWR1cmUgY2FsbHMgZm9yCisgKiAgICAgZWFjaCBvZiB0aGVtLiAgVGhpcyBkcml2ZXIgY2FuIGhhbmRsZSBzZXZlcmFsIHN1Y2ggYnVzc2VzLgorICoKKyAqICAgLSBUaGUgcXVpY2tlciBpbmxpbmVkIHdheTogIG9ubHkgaGVscHMgd2l0aCBwbGF0Zm9ybSBHUElPIGNvZGUKKyAqICAgICB0aGF0IGlubGluZXMgb3BlcmF0aW9ucyBmb3IgY29uc3RhbnQgR1BJT3MuICBUaGlzIGNhbiBnaXZlCisgKiAgICAgeW91IHRpZ2h0IChmYXN0ISkgaW5uZXIgbG9vcHMsIGJ1dCBlYWNoIHN1Y2ggYnVzIG5lZWRzIGEKKyAqICAgICBuZXcgZHJpdmVyLiAgWW91J2xsIGRlZmluZSBhIG5ldyBDIGZpbGUsIHdpdGggTWFrZWZpbGUgYW5kCisgKiAgICAgS2NvbmZpZyBzdXBwb3J0OyB0aGUgQyBjb2RlIGNhbiBiZSBhIHRvdGFsIG9mIHNpeCBsaW5lczoKKyAqCisgKgkJI2RlZmluZSBEUklWRVJfTkFNRQkibXlib2FyZF9zcGkyIgorICoJCSNkZWZpbmUJU1BJX01JU09fR1BJTwkxMTkKKyAqCQkjZGVmaW5lCVNQSV9NT1NJX0dQSU8JMTIwCisgKgkJI2RlZmluZQlTUElfU0NLX0dQSU8JMTIxCisgKgkJI2RlZmluZQlTUElfTl9DSElQU0VMCTQKKyAqCQkjaW5jbHVkZSAic3BpLWdwaW8uYyIKKyAqLworCisjaWZuZGVmIERSSVZFUl9OQU1FCisjZGVmaW5lIERSSVZFUl9OQU1FCSJzcGlfZ3BpbyIKKworI2RlZmluZSBHRU5FUklDX0JJVEJBTkcJLyogdnMgdGlnaHQgaW5saW5lcyAqLworCisvKiBhbGwgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIHRoZXNlIHN5bWJvbHMgbXVzdCBkZWZpbmUgcGRhdGEgKi8KKyNkZWZpbmUgU1BJX01JU09fR1BJTwkoKHBkYXRhKS0+bWlzbykKKyNkZWZpbmUgU1BJX01PU0lfR1BJTwkoKHBkYXRhKS0+bW9zaSkKKyNkZWZpbmUgU1BJX1NDS19HUElPCSgocGRhdGEpLT5zY2spCisKKyNkZWZpbmUgU1BJX05fQ0hJUFNFTAkoKHBkYXRhKS0+bnVtX2NoaXBzZWxlY3QpCisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhICogX19wdXJlCitzcGlfdG9fcGRhdGEoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwljb25zdCBzdHJ1Y3Qgc3BpX2JpdGJhbmcJKmJhbmc7CisJY29uc3Qgc3RydWN0IHNwaV9ncGlvCQkqc3BpX2dwaW87CisKKwliYW5nID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3BpX2dwaW8gPSBjb250YWluZXJfb2YoYmFuZywgc3RydWN0IHNwaV9ncGlvLCBiaXRiYW5nKTsKKwlyZXR1cm4gJnNwaV9ncGlvLT5wZGF0YTsKK30KKworLyogdGhpcyBpcyAjZGVmaW5lZCB0byBhdm9pZCB1bnVzZWQtdmFyaWFibGUgd2FybmluZ3Mgd2hlbiBpbmxpbmluZyAqLworI2RlZmluZSBwZGF0YQkJc3BpX3RvX3BkYXRhKHNwaSkKKworc3RhdGljIGlubGluZSB2b2lkIHNldHNjayhjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCit7CisJZ3Bpb19zZXRfdmFsdWUoU1BJX1NDS19HUElPLCBpc19vbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRtb3NpKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19vbikKK3sKKwlncGlvX3NldF92YWx1ZShTUElfTU9TSV9HUElPLCBpc19vbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldG1pc28oY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gISFncGlvX2dldF92YWx1ZShTUElfTUlTT19HUElPKTsKK30KKworI3VuZGVmIHBkYXRhCisKKy8qCisgKiBOT1RFOiAgdGhpcyBjbG9ja3MgImFzIGZhc3QgYXMgd2UgY2FuIi4gIEl0ICJzaG91bGQiIGJlIGEgZnVuY3Rpb24gb2YgdGhlCisgKiByZXF1ZXN0ZWQgZGV2aWNlIGNsb2NrLiAgU29mdHdhcmUgb3ZlcmhlYWQgbWVhbnMgd2UgdXN1YWxseSBoYXZlIHRyb3VibGUKKyAqIHJlYWNoaW5nIGV2ZW4gb25lIE1iaXQvc2VjIChleGNlcHQgd2hlbiB3ZSBjYW4gaW5saW5lIGJpdG9wcyksIHNvIGZvciBub3cKKyAqIHdlJ2xsIGp1c3QgYXNzdW1lIHdlIG5ldmVyIG5lZWQgYWRkaXRpb25hbCBwZXItYml0IHNsb3dkb3ducy4KKyAqLworI2RlZmluZSBzcGlkZWxheShuc2VjcykJZG8ge30gd2hpbGUgKDApCisKKyNpbmNsdWRlICJzcGktYml0YmFuZy10eHJ4LmgiCisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgY2FuIGxldmVyYWdlIGlubGluZSBleHBhbnNpb24gb2YgR1BJTyBjYWxscyB0byBzaHJpbmsKKyAqIGNvc3RzIGZvciBhIHR4cnggYml0LCBvZnRlbiBieSBmYWN0b3JzIG9mIGFyb3VuZCB0ZW4gKGJ5IGluc3RydWN0aW9uCisgKiBjb3VudCkuICBUaGF0IGlzIHBhcnRpY3VsYXJseSB2aXNpYmxlIGZvciBsYXJnZXIgd29yZCBzaXplcywgYnV0IGhlbHBzCisgKiBldmVuIHdpdGggZGVmYXVsdCA4LWJpdCB3b3Jkcy4KKyAqCisgKiBSRVZJU0lUIG92ZXJoZWFkcyBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyBmb3IgZWFjaCB3b3JkIGFsc28gaGF2ZQorICogc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgY29zdHMuICBIYXZpbmcgdHhyeF9idWZzKCkgY2FsbHMgdGhhdCBpbmxpbmUKKyAqIHRoZSB0eHJ4X3dvcmQoKSBsb2dpYyB3b3VsZCBoZWxwIHBlcmZvcm1hbmNlLCBlLmcuIG9uIGxhcmdlciBibG9ja3MKKyAqIHVzZWQgd2l0aCBmbGFzaCBzdG9yYWdlIG9yIE1NQy9TRC4gIFRoZXJlIHNob3VsZCBhbHNvIGJlIHdheXMgdG8gbWFrZQorICogR0NDIGJlIGxlc3Mgc3R1cGlkIGFib3V0IHJlbG9hZGluZyByZWdpc3RlcnMgaW5zaWRlIHRoZSBJL08gbG9vcHMsCisgKiBldmVuIHdpdGhvdXQgaW5saW5lZCBHUElPIGNhbGxzOyBfX2F0dHJpYnV0ZV9fKChob3QpKSBvbiBHQ0MgNC4zPworICovCisKK3N0YXRpYyB1MzIgc3BpX2dwaW9fdHhyeF93b3JkX21vZGUwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIDAsIHdvcmQsIGJpdHMpOworfQorCitzdGF0aWMgdTMyIHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQl1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMShzcGksIG5zZWNzLCAwLCAwLCB3b3JkLCBiaXRzKTsKK30KKworc3RhdGljIHUzMiBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMSwgMCwgd29yZCwgYml0cyk7Cit9CisKK3N0YXRpYyB1MzIgc3BpX2dwaW9fdHhyeF93b3JkX21vZGUzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGExKHNwaSwgbnNlY3MsIDEsIDAsIHdvcmQsIGJpdHMpOworfQorCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBjYWxsIHNldG1vc2kgb3IgZ2V0bWlzbyBpZiByZXNwZWN0aXZlIGZsYWcKKyAqIChTUElfTUFTVEVSX05PX1JYIG9yIFNQSV9NQVNURVJfTk9fVFgpIGlzIHNldCwgc28gdGhleSBhcmUgc2FmZSB0bworICogY2FsbCB3aGVuIHN1Y2ggcGluIGlzIG5vdCBwcmVzZW50IG9yIGRlZmluZWQgaW4gdGhlIGNvbnRyb2xsZXIuCisgKiBBIHNlcGFyYXRlIHNldCBvZiBjYWxsYmFja3MgaXMgZGVmaW5lZCB0byBnZXQgaGlnaGVzdCBwb3NzaWJsZQorICogc3BlZWQgaW4gdGhlIGdlbmVyaWMgY2FzZSAod2hlbiBib3RoIE1JU08gYW5kIE1PU0kgbGluZXMgYXJlCisgKiBhdmFpbGFibGUpLCBhcyBvcHRpbWlzZXIgd2lsbCByZW1vdmUgdGhlIGNoZWNrcyB3aGVuIGFyZ3VtZW50IGlzCisgKiBjb25zdGFudC4KKyAqLworCitzdGF0aWMgdTMyIHNwaV9ncGlvX3NwZWNfdHhyeF93b3JkX21vZGUwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwl1bnNpZ25lZCBmbGFncyA9IHNwaS0+bWFzdGVyLT5mbGFnczsKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIGZsYWdzLCB3b3JkLCBiaXRzKTsKK30KKworc3RhdGljIHUzMiBzcGlfZ3Bpb19zcGVjX3R4cnhfd29yZF9tb2RlMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQl1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJdW5zaWduZWQgZmxhZ3MgPSBzcGktPm1hc3Rlci0+ZmxhZ3M7CisJcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMShzcGksIG5zZWNzLCAwLCBmbGFncywgd29yZCwgYml0cyk7Cit9CisKK3N0YXRpYyB1MzIgc3BpX2dwaW9fc3BlY190eHJ4X3dvcmRfbW9kZTIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXVuc2lnbmVkIGZsYWdzID0gc3BpLT5tYXN0ZXItPmZsYWdzOworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMSwgZmxhZ3MsIHdvcmQsIGJpdHMpOworfQorCitzdGF0aWMgdTMyIHNwaV9ncGlvX3NwZWNfdHhyeF93b3JkX21vZGUzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwl1bnNpZ25lZCBmbGFncyA9IHNwaS0+bWFzdGVyLT5mbGFnczsKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGExKHNwaSwgbnNlY3MsIDEsIGZsYWdzLCB3b3JkLCBiaXRzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgc3BpX2dwaW9fY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfYWN0aXZlKQoreworCXVuc2lnbmVkIGxvbmcgY3MgPSAodW5zaWduZWQgbG9uZykgc3BpLT5jb250cm9sbGVyX2RhdGE7CisKKwkvKiBzZXQgaW5pdGlhbCBjbG9jayBwb2xhcml0eSAqLworCWlmIChpc19hY3RpdmUpCisJCXNldHNjayhzcGksIHNwaS0+bW9kZSAmIFNQSV9DUE9MKTsKKworCWlmIChjcyAhPSBTUElfR1BJT19OT19DSElQU0VMRUNUKSB7CisJCS8qIFNQSSBpcyBub3JtYWxseSBhY3RpdmUtbG93ICovCisJCWdwaW9fc2V0X3ZhbHVlKGNzLCAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpID8gaXNfYWN0aXZlIDogIWlzX2FjdGl2ZSk7CisJfQorfQorCitzdGF0aWMgaW50IHNwaV9ncGlvX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdW5zaWduZWQgbG9uZwljcyA9ICh1bnNpZ25lZCBsb25nKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwlpbnQJCXN0YXR1cyA9IDA7CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkID4gMzIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzcGktPmNvbnRyb2xsZXJfc3RhdGUpIHsKKwkJaWYgKGNzICE9IFNQSV9HUElPX05PX0NISVBTRUxFQ1QpIHsKKwkJCXN0YXR1cyA9IGdwaW9fcmVxdWVzdChjcywgZGV2X25hbWUoJnNwaS0+ZGV2KSk7CisJCQlpZiAoc3RhdHVzKQorCQkJCXJldHVybiBzdGF0dXM7CisJCQlzdGF0dXMgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoY3MsIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKTsKKwkJfQorCX0KKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gc3BpX2JpdGJhbmdfc2V0dXAoc3BpKTsKKwlpZiAoc3RhdHVzKSB7CisJCWlmICghc3BpLT5jb250cm9sbGVyX3N0YXRlICYmIGNzICE9IFNQSV9HUElPX05PX0NISVBTRUxFQ1QpCisJCQlncGlvX2ZyZWUoY3MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzcGlfZ3Bpb19jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdW5zaWduZWQgbG9uZwljcyA9ICh1bnNpZ25lZCBsb25nKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKworCWlmIChjcyAhPSBTUElfR1BJT19OT19DSElQU0VMRUNUKQorCQlncGlvX2ZyZWUoY3MpOworCXNwaV9iaXRiYW5nX2NsZWFudXAoc3BpKTsKK30KKworc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9fYWxsb2ModW5zaWduZWQgcGluLCBjb25zdCBjaGFyICpsYWJlbCwgYm9vbCBpc19pbikKK3sKKwlpbnQgdmFsdWU7CisKKwl2YWx1ZSA9IGdwaW9fcmVxdWVzdChwaW4sIGxhYmVsKTsKKwlpZiAodmFsdWUgPT0gMCkgeworCQlpZiAoaXNfaW4pCisJCQl2YWx1ZSA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KHBpbik7CisJCWVsc2UKKwkJCXZhbHVlID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBpbiwgMCk7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBfX2luaXQKK3NwaV9ncGlvX3JlcXVlc3Qoc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhLCBjb25zdCBjaGFyICpsYWJlbCwKKwl1MTYgKnJlc19mbGFncykKK3sKKwlpbnQgdmFsdWU7CisKKwkvKiBOT1RFOiAgU1BJXypfR1BJTyBzeW1ib2xzIG1heSByZWZlcmVuY2UgInBkYXRhIiAqLworCisJaWYgKFNQSV9NT1NJX0dQSU8gIT0gU1BJX0dQSU9fTk9fTU9TSSkgeworCQl2YWx1ZSA9IHNwaV9ncGlvX2FsbG9jKFNQSV9NT1NJX0dQSU8sIGxhYmVsLCBmYWxzZSk7CisJCWlmICh2YWx1ZSkKKwkJCWdvdG8gZG9uZTsKKwl9IGVsc2UgeworCQkvKiBIVyBjb25maWd1cmF0aW9uIHdpdGhvdXQgTU9TSSBwaW4gKi8KKwkJKnJlc19mbGFncyB8PSBTUElfTUFTVEVSX05PX1RYOworCX0KKworCWlmIChTUElfTUlTT19HUElPICE9IFNQSV9HUElPX05PX01JU08pIHsKKwkJdmFsdWUgPSBzcGlfZ3Bpb19hbGxvYyhTUElfTUlTT19HUElPLCBsYWJlbCwgdHJ1ZSk7CisJCWlmICh2YWx1ZSkKKwkJCWdvdG8gZnJlZV9tb3NpOworCX0gZWxzZSB7CisJCS8qIEhXIGNvbmZpZ3VyYXRpb24gd2l0aG91dCBNSVNPIHBpbiAqLworCQkqcmVzX2ZsYWdzIHw9IFNQSV9NQVNURVJfTk9fUlg7CisJfQorCisJdmFsdWUgPSBzcGlfZ3Bpb19hbGxvYyhTUElfU0NLX0dQSU8sIGxhYmVsLCBmYWxzZSk7CisJaWYgKHZhbHVlKQorCQlnb3RvIGZyZWVfbWlzbzsKKworCWdvdG8gZG9uZTsKKworZnJlZV9taXNvOgorCWlmIChTUElfTUlTT19HUElPICE9IFNQSV9HUElPX05PX01JU08pCisJCWdwaW9fZnJlZShTUElfTUlTT19HUElPKTsKK2ZyZWVfbW9zaToKKwlpZiAoU1BJX01PU0lfR1BJTyAhPSBTUElfR1BJT19OT19NT1NJKQorCQlncGlvX2ZyZWUoU1BJX01PU0lfR1BJTyk7Citkb25lOgorCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQJCQkJc3RhdHVzOworCXN0cnVjdCBzcGlfbWFzdGVyCQkqbWFzdGVyOworCXN0cnVjdCBzcGlfZ3BpbwkJCSpzcGlfZ3BpbzsKKwlzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YQkqcGRhdGE7CisJdTE2IG1hc3Rlcl9mbGFncyA9IDA7CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworI2lmZGVmIEdFTkVSSUNfQklUQkFORworCWlmICghcGRhdGEgfHwgIXBkYXRhLT5udW1fY2hpcHNlbGVjdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisjZW5kaWYKKworCXN0YXR1cyA9IHNwaV9ncGlvX3JlcXVlc3QocGRhdGEsIGRldl9uYW1lKCZwZGV2LT5kZXYpLCAmbWFzdGVyX2ZsYWdzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mICpzcGlfZ3Bpbyk7CisJaWYgKCFtYXN0ZXIpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBncGlvX2ZyZWU7CisJfQorCXNwaV9ncGlvID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNwaV9ncGlvKTsKKworCXNwaV9ncGlvLT5wZGV2ID0gcGRldjsKKwlpZiAocGRhdGEpCisJCXNwaV9ncGlvLT5wZGF0YSA9ICpwZGF0YTsKKworCW1hc3Rlci0+ZmxhZ3MgPSBtYXN0ZXJfZmxhZ3M7CisJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IFNQSV9OX0NISVBTRUw7CisJbWFzdGVyLT5zZXR1cCA9IHNwaV9ncGlvX3NldHVwOworCW1hc3Rlci0+Y2xlYW51cCA9IHNwaV9ncGlvX2NsZWFudXA7CisKKwlzcGlfZ3Bpby0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOworCXNwaV9ncGlvLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBzcGlfZ3Bpb19jaGlwc2VsZWN0OworCisJaWYgKChtYXN0ZXJfZmxhZ3MgJiAoU1BJX01BU1RFUl9OT19UWCB8IFNQSV9NQVNURVJfTk9fUlgpKSA9PSAwKSB7CisJCXNwaV9ncGlvLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8wXSA9IHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMDsKKwkJc3BpX2dwaW8tPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzFdID0gc3BpX2dwaW9fdHhyeF93b3JkX21vZGUxOworCQlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMl0gPSBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTI7CisJCXNwaV9ncGlvLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8zXSA9IHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMzsKKwl9IGVsc2UgeworCQlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBzcGlfZ3Bpb19zcGVjX3R4cnhfd29yZF9tb2RlMDsKKwkJc3BpX2dwaW8tPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzFdID0gc3BpX2dwaW9fc3BlY190eHJ4X3dvcmRfbW9kZTE7CisJCXNwaV9ncGlvLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8yXSA9IHNwaV9ncGlvX3NwZWNfdHhyeF93b3JkX21vZGUyOworCQlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfM10gPSBzcGlfZ3Bpb19zcGVjX3R4cnhfd29yZF9tb2RlMzsKKwl9CisJc3BpX2dwaW8tPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlcjsKKwlzcGlfZ3Bpby0+Yml0YmFuZy5mbGFncyA9IFNQSV9DU19ISUdIOworCisJc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RhcnQoJnNwaV9ncGlvLT5iaXRiYW5nKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlzcGlfbWFzdGVyX3B1dChzcGlfZ3Bpby0+Yml0YmFuZy5tYXN0ZXIpOworZ3Bpb19mcmVlOgorCQlpZiAoU1BJX01JU09fR1BJTyAhPSBTUElfR1BJT19OT19NSVNPKQorCQkJZ3Bpb19mcmVlKFNQSV9NSVNPX0dQSU8pOworCQlpZiAoU1BJX01PU0lfR1BJTyAhPSBTUElfR1BJT19OT19NT1NJKQorCQkJZ3Bpb19mcmVlKFNQSV9NT1NJX0dQSU8pOworCQlncGlvX2ZyZWUoU1BJX1NDS19HUElPKTsKKwkJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBzcGlfZ3Bpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX2dwaW8JCQkqc3BpX2dwaW87CisJc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEJKnBkYXRhOworCWludAkJCQlzdGF0dXM7CisKKwlzcGlfZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwkvKiBzdG9wKCkgdW5yZWdpc3RlcnMgY2hpbGQgZGV2aWNlcyB0b28gKi8KKwlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdG9wKCZzcGlfZ3Bpby0+Yml0YmFuZyk7CisJc3BpX21hc3Rlcl9wdXQoc3BpX2dwaW8tPmJpdGJhbmcubWFzdGVyKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJaWYgKFNQSV9NSVNPX0dQSU8gIT0gU1BJX0dQSU9fTk9fTUlTTykKKwkJZ3Bpb19mcmVlKFNQSV9NSVNPX0dQSU8pOworCWlmIChTUElfTU9TSV9HUElPICE9IFNQSV9HUElPX05PX01PU0kpCisJCWdwaW9fZnJlZShTUElfTU9TSV9HUElPKTsKKwlncGlvX2ZyZWUoU1BJX1NDS19HUElPKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUklWRVJfTkFNRSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwaV9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyLm5hbWUJPSBEUklWRVJfTkFNRSwKKwkuZHJpdmVyLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcChzcGlfZ3Bpb19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9faW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnNwaV9ncGlvX2RyaXZlciwgc3BpX2dwaW9fcHJvYmUpOworfQorbW9kdWxlX2luaXQoc3BpX2dwaW9faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzcGlfZ3Bpb19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwaV9ncGlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChzcGlfZ3Bpb19leGl0KTsKKworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNQSSBtYXN0ZXIgZHJpdmVyIHVzaW5nIGdlbmVyaWMgYml0YmFuZ2VkIEdQSU8gIik7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBCcm93bmVsbCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWlteC5jIGIvZHJpdmVycy9zcGkvc3BpLWlteC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzY1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktaW14LmMKQEAgLTAsMCArMSw5NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSnVlcmdlbiBCZWlzZXJ0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisKKyNpbmNsdWRlIDxtYWNoL3NwaS5oPgorCisjZGVmaW5lIERSSVZFUl9OQU1FICJzcGlfaW14IgorCisjZGVmaW5lIE1YQ19DU1BJUlhEQVRBCQkweDAwCisjZGVmaW5lIE1YQ19DU1BJVFhEQVRBCQkweDA0CisjZGVmaW5lIE1YQ19DU1BJQ1RSTAkJMHgwOAorI2RlZmluZSBNWENfQ1NQSUlOVAkJMHgwYworI2RlZmluZSBNWENfUkVTRVQJCTB4MWMKKworLyogZ2VuZXJpYyBkZWZpbmVzIHRvIGFic3RyYWN0IGZyb20gdGhlIGRpZmZlcmVudCByZWdpc3RlciBsYXlvdXRzICovCisjZGVmaW5lIE1YQ19JTlRfUlIJKDEgPDwgMCkgLyogUmVjZWl2ZSBkYXRhIHJlYWR5IGludGVycnVwdCAqLworI2RlZmluZSBNWENfSU5UX1RFCSgxIDw8IDEpIC8qIFRyYW5zbWl0IEZJRk8gZW1wdHkgaW50ZXJydXB0ICovCisKK3N0cnVjdCBzcGlfaW14X2NvbmZpZyB7CisJdW5zaWduZWQgaW50IHNwZWVkX2h6OworCXVuc2lnbmVkIGludCBicHc7CisJdW5zaWduZWQgaW50IG1vZGU7CisJdTggY3M7Cit9OworCitlbnVtIHNwaV9pbXhfZGV2dHlwZSB7CisJSU1YMV9DU1BJLAorCUlNWDIxX0NTUEksCisJSU1YMjdfQ1NQSSwKKwlJTVgzMV9DU1BJLAorCUlNWDM1X0NTUEksCS8qIENTUEkgb24gYWxsIGkubXggZXhjZXB0IGFib3ZlICovCisJSU1YNTFfRUNTUEksCS8qIEVDU1BJIG9uIGkubXg1MSBhbmQgbGF0ZXIgKi8KK307CisKK3N0cnVjdCBzcGlfaW14X2RhdGE7CisKK3N0cnVjdCBzcGlfaW14X2RldnR5cGVfZGF0YSB7CisJdm9pZCAoKmludGN0cmwpKHN0cnVjdCBzcGlfaW14X2RhdGEgKiwgaW50KTsKKwlpbnQgKCpjb25maWcpKHN0cnVjdCBzcGlfaW14X2RhdGEgKiwgc3RydWN0IHNwaV9pbXhfY29uZmlnICopOworCXZvaWQgKCp0cmlnZ2VyKShzdHJ1Y3Qgc3BpX2lteF9kYXRhICopOworCWludCAoKnJ4X2F2YWlsYWJsZSkoc3RydWN0IHNwaV9pbXhfZGF0YSAqKTsKKwl2b2lkICgqcmVzZXQpKHN0cnVjdCBzcGlfaW14X2RhdGEgKik7CisJZW51bSBzcGlfaW14X2RldnR5cGUgZGV2dHlwZTsKK307CisKK3N0cnVjdCBzcGlfaW14X2RhdGEgeworCXN0cnVjdCBzcGlfYml0YmFuZyBiaXRiYW5nOworCisJc3RydWN0IGNvbXBsZXRpb24geGZlcl9kb25lOworCXZvaWQgKmJhc2U7CisJaW50IGlycTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdW5zaWduZWQgbG9uZyBzcGlfY2xrOworCisJdW5zaWduZWQgaW50IGNvdW50OworCXZvaWQgKCp0eCkoc3RydWN0IHNwaV9pbXhfZGF0YSAqKTsKKwl2b2lkICgqcngpKHN0cnVjdCBzcGlfaW14X2RhdGEgKik7CisJdm9pZCAqcnhfYnVmOworCWNvbnN0IHZvaWQgKnR4X2J1ZjsKKwl1bnNpZ25lZCBpbnQgdHhmaWZvOyAvKiBudW1iZXIgb2Ygd29yZHMgcHVzaGVkIGluIHR4IEZJRk8gKi8KKworCXN0cnVjdCBzcGlfaW14X2RldnR5cGVfZGF0YSAqZGV2dHlwZV9kYXRhOworCWludCBjaGlwc2VsZWN0WzBdOworfTsKKworc3RhdGljIGlubGluZSBpbnQgaXNfaW14MjdfY3NwaShzdHJ1Y3Qgc3BpX2lteF9kYXRhICpkKQoreworCXJldHVybiBkLT5kZXZ0eXBlX2RhdGEtPmRldnR5cGUgPT0gSU1YMjdfQ1NQSTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaW14MzVfY3NwaShzdHJ1Y3Qgc3BpX2lteF9kYXRhICpkKQoreworCXJldHVybiBkLT5kZXZ0eXBlX2RhdGEtPmRldnR5cGUgPT0gSU1YMzVfQ1NQSTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzcGlfaW14X2dldF9maWZvc2l6ZShzdHJ1Y3Qgc3BpX2lteF9kYXRhICpkKQoreworCXJldHVybiAoZC0+ZGV2dHlwZV9kYXRhLT5kZXZ0eXBlID09IElNWDUxX0VDU1BJKSA/IDY0IDogODsKK30KKworI2RlZmluZSBNWENfU1BJX0JVRl9SWCh0eXBlKQkJCQkJCVwKK3N0YXRpYyB2b2lkIHNwaV9pbXhfYnVmX3J4XyMjdHlwZShzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14KQkJXAorewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgdmFsID0gcmVhZGwoc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJUlhEQVRBKTsJXAorCQkJCQkJCQkJXAorCWlmIChzcGlfaW14LT5yeF9idWYpIHsJCQkJCQlcCisJCSoodHlwZSAqKXNwaV9pbXgtPnJ4X2J1ZiA9IHZhbDsJCQkJXAorCQlzcGlfaW14LT5yeF9idWYgKz0gc2l6ZW9mKHR5cGUpOwkJCVwKKwl9CQkJCQkJCQlcCit9CisKKyNkZWZpbmUgTVhDX1NQSV9CVUZfVFgodHlwZSkJCQkJCQlcCitzdGF0aWMgdm9pZCBzcGlfaW14X2J1Zl90eF8jI3R5cGUoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkJCVwKK3sJCQkJCQkJCQlcCisJdHlwZSB2YWwgPSAwOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKHNwaV9pbXgtPnR4X2J1ZikgewkJCQkJCVwKKwkJdmFsID0gKih0eXBlICopc3BpX2lteC0+dHhfYnVmOwkJCQlcCisJCXNwaV9pbXgtPnR4X2J1ZiArPSBzaXplb2YodHlwZSk7CQkJXAorCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlzcGlfaW14LT5jb3VudCAtPSBzaXplb2YodHlwZSk7CQkJCQlcCisJCQkJCQkJCQlcCisJd3JpdGVsKHZhbCwgc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJVFhEQVRBKTsJCQlcCit9CisKK01YQ19TUElfQlVGX1JYKHU4KQorTVhDX1NQSV9CVUZfVFgodTgpCitNWENfU1BJX0JVRl9SWCh1MTYpCitNWENfU1BJX0JVRl9UWCh1MTYpCitNWENfU1BJX0JVRl9SWCh1MzIpCitNWENfU1BJX0JVRl9UWCh1MzIpCisKKy8qIEZpcnN0IGVudHJ5IGlzIHJlc2VydmVkLCBzZWNvbmQgZW50cnkgaXMgdmFsaWQgb25seSBpZiBTREhDX1NQSUVOIGlzIHNldAorICogKHdoaWNoIGlzIGN1cnJlbnRseSBub3QgdGhlIGNhc2UgaW4gdGhpcyBkcml2ZXIpCisgKi8KK3N0YXRpYyBpbnQgbXhjX2Nsa2RpdnNbXSA9IHswLCAzLCA0LCA2LCA4LCAxMiwgMTYsIDI0LCAzMiwgNDgsIDY0LCA5NiwgMTI4LCAxOTIsCisJMjU2LCAzODQsIDUxMiwgNzY4LCAxMDI0fTsKKworLyogTVgyMSwgTVgyNyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzcGlfaW14X2Nsa2Rpdl8xKHVuc2lnbmVkIGludCBmaW4sCisJCXVuc2lnbmVkIGludCBmc3BpLCB1bnNpZ25lZCBpbnQgbWF4KQoreworCWludCBpOworCisJZm9yIChpID0gMjsgaSA8IG1heDsgaSsrKQorCQlpZiAoZnNwaSAqIG14Y19jbGtkaXZzW2ldID49IGZpbikKKwkJCXJldHVybiBpOworCisJcmV0dXJuIG1heDsKK30KKworLyogTVgxLCBNWDMxLCBNWDM1LCBNWDUxIENTUEkgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3BpX2lteF9jbGtkaXZfMih1bnNpZ25lZCBpbnQgZmluLAorCQl1bnNpZ25lZCBpbnQgZnNwaSkKK3sKKwlpbnQgaSwgZGl2ID0gNDsKKworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJaWYgKGZzcGkgKiBkaXYgPj0gZmluKQorCQkJcmV0dXJuIGk7CisJCWRpdiA8PD0gMTsKKwl9CisKKwlyZXR1cm4gNzsKK30KKworI2RlZmluZSBNWDUxX0VDU1BJX0NUUkwJCTB4MDgKKyNkZWZpbmUgTVg1MV9FQ1NQSV9DVFJMX0VOQUJMRQkJKDEgPDwgIDApCisjZGVmaW5lIE1YNTFfRUNTUElfQ1RSTF9YQ0gJCSgxIDw8ICAyKQorI2RlZmluZSBNWDUxX0VDU1BJX0NUUkxfTU9ERV9NQVNLCSgweGYgPDwgNCkKKyNkZWZpbmUgTVg1MV9FQ1NQSV9DVFJMX1BPU1RESVZfT0ZGU0VUCTgKKyNkZWZpbmUgTVg1MV9FQ1NQSV9DVFJMX1BSRURJVl9PRkZTRVQJMTIKKyNkZWZpbmUgTVg1MV9FQ1NQSV9DVFJMX0NTKGNzKQkJKChjcykgPDwgMTgpCisjZGVmaW5lIE1YNTFfRUNTUElfQ1RSTF9CTF9PRkZTRVQJMjAKKworI2RlZmluZSBNWDUxX0VDU1BJX0NPTkZJRwkweDBjCisjZGVmaW5lIE1YNTFfRUNTUElfQ09ORklHX1NDTEtQSEEoY3MpCSgxIDw8ICgoY3MpICsgIDApKQorI2RlZmluZSBNWDUxX0VDU1BJX0NPTkZJR19TQ0xLUE9MKGNzKQkoMSA8PCAoKGNzKSArICA0KSkKKyNkZWZpbmUgTVg1MV9FQ1NQSV9DT05GSUdfU0JCQ1RSTChjcykJKDEgPDwgKChjcykgKyAgOCkpCisjZGVmaW5lIE1YNTFfRUNTUElfQ09ORklHX1NTQlBPTChjcykJKDEgPDwgKChjcykgKyAxMikpCisKKyNkZWZpbmUgTVg1MV9FQ1NQSV9JTlQJCTB4MTAKKyNkZWZpbmUgTVg1MV9FQ1NQSV9JTlRfVEVFTgkJKDEgPDwgIDApCisjZGVmaW5lIE1YNTFfRUNTUElfSU5UX1JSRU4JCSgxIDw8ICAzKQorCisjZGVmaW5lIE1YNTFfRUNTUElfU1RBVAkJMHgxOAorI2RlZmluZSBNWDUxX0VDU1BJX1NUQVRfUlIJCSgxIDw8ICAzKQorCisvKiBNWDUxIGVDU1BJICovCitzdGF0aWMgdW5zaWduZWQgaW50IG14NTFfZWNzcGlfY2xrZGl2KHVuc2lnbmVkIGludCBmaW4sIHVuc2lnbmVkIGludCBmc3BpKQoreworCS8qCisJICogdGhlcmUgYXJlIHR3byA0LWJpdCBkaXZpZGVycywgdGhlIHByZS1kaXZpZGVyIGRpdmlkZXMgYnkKKwkgKiAkcHJlLCB0aGUgcG9zdC1kaXZpZGVyIGJ5IDJeJHBvc3QKKwkgKi8KKwl1bnNpZ25lZCBpbnQgcHJlLCBwb3N0OworCisJaWYgKHVubGlrZWx5KGZzcGkgPiBmaW4pKQorCQlyZXR1cm4gMDsKKworCXBvc3QgPSBmbHMoZmluKSAtIGZscyhmc3BpKTsKKwlpZiAoZmluID4gZnNwaSA8PCBwb3N0KQorCQlwb3N0Kys7CisKKwkvKiBub3cgd2UgaGF2ZTogKGZpbiA8PSBmc3BpIDw8IHBvc3QpIHdpdGggcG9zdCBiZWluZyBtaW5pbWFsICovCisKKwlwb3N0ID0gbWF4KDRVLCBwb3N0KSAtIDQ7CisJaWYgKHVubGlrZWx5KHBvc3QgPiAweGYpKSB7CisJCXByX2VycigiJXM6IGNhbm5vdCBzZXQgY2xvY2sgZnJlcTogJXUgKGJhc2UgZnJlcTogJXUpXG4iLAorCQkJCV9fZnVuY19fLCBmc3BpLCBmaW4pOworCQlyZXR1cm4gMHhmZjsKKwl9CisKKwlwcmUgPSBESVZfUk9VTkRfVVAoZmluLCBmc3BpIDw8IHBvc3QpIC0gMTsKKworCXByX2RlYnVnKCIlczogZmluOiAldSwgZnNwaTogJXUsIHBvc3Q6ICV1LCBwcmU6ICV1XG4iLAorCQkJX19mdW5jX18sIGZpbiwgZnNwaSwgcG9zdCwgcHJlKTsKKwlyZXR1cm4gKHByZSA8PCBNWDUxX0VDU1BJX0NUUkxfUFJFRElWX09GRlNFVCkgfAorCQkocG9zdCA8PCBNWDUxX0VDU1BJX0NUUkxfUE9TVERJVl9PRkZTRVQpOworfQorCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBteDUxX2Vjc3BpX2ludGN0cmwoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCwgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCB2YWwgPSAwOworCisJaWYgKGVuYWJsZSAmIE1YQ19JTlRfVEUpCisJCXZhbCB8PSBNWDUxX0VDU1BJX0lOVF9URUVOOworCisJaWYgKGVuYWJsZSAmIE1YQ19JTlRfUlIpCisJCXZhbCB8PSBNWDUxX0VDU1BJX0lOVF9SUkVOOworCisJd3JpdGVsKHZhbCwgc3BpX2lteC0+YmFzZSArIE1YNTFfRUNTUElfSU5UKTsKK30KKworc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgbXg1MV9lY3NwaV90cmlnZ2VyKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCit7CisJdTMyIHJlZzsKKworCXJlZyA9IHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWDUxX0VDU1BJX0NUUkwpOworCXJlZyB8PSBNWDUxX0VDU1BJX0NUUkxfWENIOworCXdyaXRlbChyZWcsIHNwaV9pbXgtPmJhc2UgKyBNWDUxX0VDU1BJX0NUUkwpOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIG14NTFfZWNzcGlfY29uZmlnKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgsCisJCXN0cnVjdCBzcGlfaW14X2NvbmZpZyAqY29uZmlnKQoreworCXUzMiBjdHJsID0gTVg1MV9FQ1NQSV9DVFJMX0VOQUJMRSwgY2ZnID0gMDsKKworCS8qCisJICogVGhlIGhhcmR3YXJlIHNlZW1zIHRvIGhhdmUgYSByYWNlIGNvbmRpdGlvbiB3aGVuIGNoYW5naW5nIG1vZGVzLiBUaGUKKwkgKiBjdXJyZW50IGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgc2VsZWN0aW9uIG9mIHRoZSBjaGFubmVsIGFycml2ZXMKKwkgKiBlYXJsaWVyIGluIHRoZSBoYXJkd2FyZSB0aGFuIHRoZSBtb2RlIGJpdHMgd2hlbiB0aGV5IGFyZSB3cml0dGVuIGF0CisJICogdGhlIHNhbWUgdGltZS4KKwkgKiBTbyBzZXQgbWFzdGVyIG1vZGUgZm9yIGFsbCBjaGFubmVscyBhcyB3ZSBkbyBub3Qgc3VwcG9ydCBzbGF2ZSBtb2RlLgorCSAqLworCWN0cmwgfD0gTVg1MV9FQ1NQSV9DVFJMX01PREVfTUFTSzsKKworCS8qIHNldCBjbG9jayBzcGVlZCAqLworCWN0cmwgfD0gbXg1MV9lY3NwaV9jbGtkaXYoc3BpX2lteC0+c3BpX2NsaywgY29uZmlnLT5zcGVlZF9oeik7CisKKwkvKiBzZXQgY2hpcCBzZWxlY3QgdG8gdXNlICovCisJY3RybCB8PSBNWDUxX0VDU1BJX0NUUkxfQ1MoY29uZmlnLT5jcyk7CisKKwljdHJsIHw9IChjb25maWctPmJwdyAtIDEpIDw8IE1YNTFfRUNTUElfQ1RSTF9CTF9PRkZTRVQ7CisKKwljZmcgfD0gTVg1MV9FQ1NQSV9DT05GSUdfU0JCQ1RSTChjb25maWctPmNzKTsKKworCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1BIQSkKKwkJY2ZnIHw9IE1YNTFfRUNTUElfQ09ORklHX1NDTEtQSEEoY29uZmlnLT5jcyk7CisKKwlpZiAoY29uZmlnLT5tb2RlICYgU1BJX0NQT0wpCisJCWNmZyB8PSBNWDUxX0VDU1BJX0NPTkZJR19TQ0xLUE9MKGNvbmZpZy0+Y3MpOworCisJaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DU19ISUdIKQorCQljZmcgfD0gTVg1MV9FQ1NQSV9DT05GSUdfU1NCUE9MKGNvbmZpZy0+Y3MpOworCisJd3JpdGVsKGN0cmwsIHNwaV9pbXgtPmJhc2UgKyBNWDUxX0VDU1BJX0NUUkwpOworCXdyaXRlbChjZmcsIHNwaV9pbXgtPmJhc2UgKyBNWDUxX0VDU1BJX0NPTkZJRyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBteDUxX2Vjc3BpX3J4X2F2YWlsYWJsZShzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14KQoreworCXJldHVybiByZWFkbChzcGlfaW14LT5iYXNlICsgTVg1MV9FQ1NQSV9TVEFUKSAmIE1YNTFfRUNTUElfU1RBVF9SUjsKK30KKworc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgbXg1MV9lY3NwaV9yZXNldChzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14KQoreworCS8qIGRyYWluIHJlY2VpdmUgYnVmZmVyICovCisJd2hpbGUgKG14NTFfZWNzcGlfcnhfYXZhaWxhYmxlKHNwaV9pbXgpKQorCQlyZWFkbChzcGlfaW14LT5iYXNlICsgTVhDX0NTUElSWERBVEEpOworfQorCisjZGVmaW5lIE1YMzFfSU5UUkVHX1RFRU4JKDEgPDwgMCkKKyNkZWZpbmUgTVgzMV9JTlRSRUdfUlJFTgkoMSA8PCAzKQorCisjZGVmaW5lIE1YMzFfQ1NQSUNUUkxfRU5BQkxFCSgxIDw8IDApCisjZGVmaW5lIE1YMzFfQ1NQSUNUUkxfTUFTVEVSCSgxIDw8IDEpCisjZGVmaW5lIE1YMzFfQ1NQSUNUUkxfWENICSgxIDw8IDIpCisjZGVmaW5lIE1YMzFfQ1NQSUNUUkxfUE9MCSgxIDw8IDQpCisjZGVmaW5lIE1YMzFfQ1NQSUNUUkxfUEhBCSgxIDw8IDUpCisjZGVmaW5lIE1YMzFfQ1NQSUNUUkxfU1NDVEwJKDEgPDwgNikKKyNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9TU1BPTAkoMSA8PCA3KQorI2RlZmluZSBNWDMxX0NTUElDVFJMX0JDX1NISUZUCTgKKyNkZWZpbmUgTVgzNV9DU1BJQ1RSTF9CTF9TSElGVAkyMAorI2RlZmluZSBNWDMxX0NTUElDVFJMX0NTX1NISUZUCTI0CisjZGVmaW5lIE1YMzVfQ1NQSUNUUkxfQ1NfU0hJRlQJMTIKKyNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9EUl9TSElGVAkxNgorCisjZGVmaW5lIE1YMzFfQ1NQSVNUQVRVUwkJMHgxNAorI2RlZmluZSBNWDMxX1NUQVRVU19SUgkJKDEgPDwgMykKKworLyogVGhlc2UgZnVuY3Rpb25zIGFsc28gd29yayBmb3IgdGhlIGkuTVgzNSwgYnV0IGJlIGF3YXJlIHRoYXQKKyAqIHRoZSBpLk1YMzUgaGFzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHJlZ2lzdGVyIGxheW91dCBmb3IgYml0cworICogd2UgZG8gbm90IHVzZSBoZXJlLgorICovCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBteDMxX2ludGN0cmwoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCwgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKworCWlmIChlbmFibGUgJiBNWENfSU5UX1RFKQorCQl2YWwgfD0gTVgzMV9JTlRSRUdfVEVFTjsKKwlpZiAoZW5hYmxlICYgTVhDX0lOVF9SUikKKwkJdmFsIHw9IE1YMzFfSU5UUkVHX1JSRU47CisKKwl3cml0ZWwodmFsLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElJTlQpOworfQorCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBteDMxX3RyaWdnZXIoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gcmVhZGwoc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7CisJcmVnIHw9IE1YMzFfQ1NQSUNUUkxfWENIOworCXdyaXRlbChyZWcsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIG14MzFfY29uZmlnKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgsCisJCXN0cnVjdCBzcGlfaW14X2NvbmZpZyAqY29uZmlnKQoreworCXVuc2lnbmVkIGludCByZWcgPSBNWDMxX0NTUElDVFJMX0VOQUJMRSB8IE1YMzFfQ1NQSUNUUkxfTUFTVEVSOworCWludCBjcyA9IHNwaV9pbXgtPmNoaXBzZWxlY3RbY29uZmlnLT5jc107CisKKwlyZWcgfD0gc3BpX2lteF9jbGtkaXZfMihzcGlfaW14LT5zcGlfY2xrLCBjb25maWctPnNwZWVkX2h6KSA8PAorCQlNWDMxX0NTUElDVFJMX0RSX1NISUZUOworCisJaWYgKGlzX2lteDM1X2NzcGkoc3BpX2lteCkpIHsKKwkJcmVnIHw9IChjb25maWctPmJwdyAtIDEpIDw8IE1YMzVfQ1NQSUNUUkxfQkxfU0hJRlQ7CisJCXJlZyB8PSBNWDMxX0NTUElDVFJMX1NTQ1RMOworCX0gZWxzZSB7CisJCXJlZyB8PSAoY29uZmlnLT5icHcgLSAxKSA8PCBNWDMxX0NTUElDVFJMX0JDX1NISUZUOworCX0KKworCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1BIQSkKKwkJcmVnIHw9IE1YMzFfQ1NQSUNUUkxfUEhBOworCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1BPTCkKKwkJcmVnIHw9IE1YMzFfQ1NQSUNUUkxfUE9MOworCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1NfSElHSCkKKwkJcmVnIHw9IE1YMzFfQ1NQSUNUUkxfU1NQT0w7CisJaWYgKGNzIDwgMCkKKwkJcmVnIHw9IChjcyArIDMyKSA8PAorCQkJKGlzX2lteDM1X2NzcGkoc3BpX2lteCkgPyBNWDM1X0NTUElDVFJMX0NTX1NISUZUIDoKKwkJCQkJCSAgTVgzMV9DU1BJQ1RSTF9DU19TSElGVCk7CisKKwl3cml0ZWwocmVnLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElDVFJMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIG14MzFfcnhfYXZhaWxhYmxlKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCit7CisJcmV0dXJuIHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWDMxX0NTUElTVEFUVVMpICYgTVgzMV9TVEFUVVNfUlI7Cit9CisKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIG14MzFfcmVzZXQoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkKK3sKKwkvKiBkcmFpbiByZWNlaXZlIGJ1ZmZlciAqLworCXdoaWxlIChyZWFkbChzcGlfaW14LT5iYXNlICsgTVgzMV9DU1BJU1RBVFVTKSAmIE1YMzFfU1RBVFVTX1JSKQorCQlyZWFkbChzcGlfaW14LT5iYXNlICsgTVhDX0NTUElSWERBVEEpOworfQorCisjZGVmaW5lIE1YMjFfSU5UUkVHX1JSCQkoMSA8PCA0KQorI2RlZmluZSBNWDIxX0lOVFJFR19URUVOCSgxIDw8IDkpCisjZGVmaW5lIE1YMjFfSU5UUkVHX1JSRU4JKDEgPDwgMTMpCisKKyNkZWZpbmUgTVgyMV9DU1BJQ1RSTF9QT0wJKDEgPDwgNSkKKyNkZWZpbmUgTVgyMV9DU1BJQ1RSTF9QSEEJKDEgPDwgNikKKyNkZWZpbmUgTVgyMV9DU1BJQ1RSTF9TU1BPTAkoMSA8PCA4KQorI2RlZmluZSBNWDIxX0NTUElDVFJMX1hDSAkoMSA8PCA5KQorI2RlZmluZSBNWDIxX0NTUElDVFJMX0VOQUJMRQkoMSA8PCAxMCkKKyNkZWZpbmUgTVgyMV9DU1BJQ1RSTF9NQVNURVIJKDEgPDwgMTEpCisjZGVmaW5lIE1YMjFfQ1NQSUNUUkxfRFJfU0hJRlQJMTQKKyNkZWZpbmUgTVgyMV9DU1BJQ1RSTF9DU19TSElGVAkxOQorCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBteDIxX2ludGN0cmwoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCwgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKworCWlmIChlbmFibGUgJiBNWENfSU5UX1RFKQorCQl2YWwgfD0gTVgyMV9JTlRSRUdfVEVFTjsKKwlpZiAoZW5hYmxlICYgTVhDX0lOVF9SUikKKwkJdmFsIHw9IE1YMjFfSU5UUkVHX1JSRU47CisKKwl3cml0ZWwodmFsLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElJTlQpOworfQorCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBteDIxX3RyaWdnZXIoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gcmVhZGwoc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7CisJcmVnIHw9IE1YMjFfQ1NQSUNUUkxfWENIOworCXdyaXRlbChyZWcsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIG14MjFfY29uZmlnKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgsCisJCXN0cnVjdCBzcGlfaW14X2NvbmZpZyAqY29uZmlnKQoreworCXVuc2lnbmVkIGludCByZWcgPSBNWDIxX0NTUElDVFJMX0VOQUJMRSB8IE1YMjFfQ1NQSUNUUkxfTUFTVEVSOworCWludCBjcyA9IHNwaV9pbXgtPmNoaXBzZWxlY3RbY29uZmlnLT5jc107CisJdW5zaWduZWQgaW50IG1heCA9IGlzX2lteDI3X2NzcGkoc3BpX2lteCkgPyAxNiA6IDE4OworCisJcmVnIHw9IHNwaV9pbXhfY2xrZGl2XzEoc3BpX2lteC0+c3BpX2NsaywgY29uZmlnLT5zcGVlZF9oeiwgbWF4KSA8PAorCQlNWDIxX0NTUElDVFJMX0RSX1NISUZUOworCXJlZyB8PSBjb25maWctPmJwdyAtIDE7CisKKwlpZiAoY29uZmlnLT5tb2RlICYgU1BJX0NQSEEpCisJCXJlZyB8PSBNWDIxX0NTUElDVFJMX1BIQTsKKwlpZiAoY29uZmlnLT5tb2RlICYgU1BJX0NQT0wpCisJCXJlZyB8PSBNWDIxX0NTUElDVFJMX1BPTDsKKwlpZiAoY29uZmlnLT5tb2RlICYgU1BJX0NTX0hJR0gpCisJCXJlZyB8PSBNWDIxX0NTUElDVFJMX1NTUE9MOworCWlmIChjcyA8IDApCisJCXJlZyB8PSAoY3MgKyAzMikgPDwgTVgyMV9DU1BJQ1RSTF9DU19TSElGVDsKKworCXdyaXRlbChyZWcsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbXgyMV9yeF9hdmFpbGFibGUoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkKK3sKKwlyZXR1cm4gcmVhZGwoc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJSU5UKSAmIE1YMjFfSU5UUkVHX1JSOworfQorCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBteDIxX3Jlc2V0KHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCit7CisJd3JpdGVsKDEsIHNwaV9pbXgtPmJhc2UgKyBNWENfUkVTRVQpOworfQorCisjZGVmaW5lIE1YMV9JTlRSRUdfUlIJCSgxIDw8IDMpCisjZGVmaW5lIE1YMV9JTlRSRUdfVEVFTgkJKDEgPDwgOCkKKyNkZWZpbmUgTVgxX0lOVFJFR19SUkVOCQkoMSA8PCAxMSkKKworI2RlZmluZSBNWDFfQ1NQSUNUUkxfUE9MCSgxIDw8IDQpCisjZGVmaW5lIE1YMV9DU1BJQ1RSTF9QSEEJKDEgPDwgNSkKKyNkZWZpbmUgTVgxX0NTUElDVFJMX1hDSAkoMSA8PCA4KQorI2RlZmluZSBNWDFfQ1NQSUNUUkxfRU5BQkxFCSgxIDw8IDkpCisjZGVmaW5lIE1YMV9DU1BJQ1RSTF9NQVNURVIJKDEgPDwgMTApCisjZGVmaW5lIE1YMV9DU1BJQ1RSTF9EUl9TSElGVAkxMworCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBteDFfaW50Y3RybChzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14LCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJaWYgKGVuYWJsZSAmIE1YQ19JTlRfVEUpCisJCXZhbCB8PSBNWDFfSU5UUkVHX1RFRU47CisJaWYgKGVuYWJsZSAmIE1YQ19JTlRfUlIpCisJCXZhbCB8PSBNWDFfSU5UUkVHX1JSRU47CisKKwl3cml0ZWwodmFsLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElJTlQpOworfQorCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBteDFfdHJpZ2dlcihzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14KQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSByZWFkbChzcGlfaW14LT5iYXNlICsgTVhDX0NTUElDVFJMKTsKKwlyZWcgfD0gTVgxX0NTUElDVFJMX1hDSDsKKwl3cml0ZWwocmVnLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElDVFJMKTsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBteDFfY29uZmlnKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgsCisJCXN0cnVjdCBzcGlfaW14X2NvbmZpZyAqY29uZmlnKQoreworCXVuc2lnbmVkIGludCByZWcgPSBNWDFfQ1NQSUNUUkxfRU5BQkxFIHwgTVgxX0NTUElDVFJMX01BU1RFUjsKKworCXJlZyB8PSBzcGlfaW14X2Nsa2Rpdl8yKHNwaV9pbXgtPnNwaV9jbGssIGNvbmZpZy0+c3BlZWRfaHopIDw8CisJCU1YMV9DU1BJQ1RSTF9EUl9TSElGVDsKKwlyZWcgfD0gY29uZmlnLT5icHcgLSAxOworCisJaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUEhBKQorCQlyZWcgfD0gTVgxX0NTUElDVFJMX1BIQTsKKwlpZiAoY29uZmlnLT5tb2RlICYgU1BJX0NQT0wpCisJCXJlZyB8PSBNWDFfQ1NQSUNUUkxfUE9MOworCisJd3JpdGVsKHJlZywgc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBteDFfcnhfYXZhaWxhYmxlKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCit7CisJcmV0dXJuIHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUlOVCkgJiBNWDFfSU5UUkVHX1JSOworfQorCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBteDFfcmVzZXQoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkKK3sKKwl3cml0ZWwoMSwgc3BpX2lteC0+YmFzZSArIE1YQ19SRVNFVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2lteF9kZXZ0eXBlX2RhdGEgaW14MV9jc3BpX2RldnR5cGVfZGF0YSA9IHsKKwkuaW50Y3RybCA9IG14MV9pbnRjdHJsLAorCS5jb25maWcgPSBteDFfY29uZmlnLAorCS50cmlnZ2VyID0gbXgxX3RyaWdnZXIsCisJLnJ4X2F2YWlsYWJsZSA9IG14MV9yeF9hdmFpbGFibGUsCisJLnJlc2V0ID0gbXgxX3Jlc2V0LAorCS5kZXZ0eXBlID0gSU1YMV9DU1BJLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfaW14X2RldnR5cGVfZGF0YSBpbXgyMV9jc3BpX2RldnR5cGVfZGF0YSA9IHsKKwkuaW50Y3RybCA9IG14MjFfaW50Y3RybCwKKwkuY29uZmlnID0gbXgyMV9jb25maWcsCisJLnRyaWdnZXIgPSBteDIxX3RyaWdnZXIsCisJLnJ4X2F2YWlsYWJsZSA9IG14MjFfcnhfYXZhaWxhYmxlLAorCS5yZXNldCA9IG14MjFfcmVzZXQsCisJLmRldnR5cGUgPSBJTVgyMV9DU1BJLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfaW14X2RldnR5cGVfZGF0YSBpbXgyN19jc3BpX2RldnR5cGVfZGF0YSA9IHsKKwkvKiBpLm14MjcgY3NwaSBzaGFyZXMgdGhlIGZ1bmN0aW9ucyB3aXRoIGkubXgyMSBvbmUgKi8KKwkuaW50Y3RybCA9IG14MjFfaW50Y3RybCwKKwkuY29uZmlnID0gbXgyMV9jb25maWcsCisJLnRyaWdnZXIgPSBteDIxX3RyaWdnZXIsCisJLnJ4X2F2YWlsYWJsZSA9IG14MjFfcnhfYXZhaWxhYmxlLAorCS5yZXNldCA9IG14MjFfcmVzZXQsCisJLmRldnR5cGUgPSBJTVgyN19DU1BJLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfaW14X2RldnR5cGVfZGF0YSBpbXgzMV9jc3BpX2RldnR5cGVfZGF0YSA9IHsKKwkuaW50Y3RybCA9IG14MzFfaW50Y3RybCwKKwkuY29uZmlnID0gbXgzMV9jb25maWcsCisJLnRyaWdnZXIgPSBteDMxX3RyaWdnZXIsCisJLnJ4X2F2YWlsYWJsZSA9IG14MzFfcnhfYXZhaWxhYmxlLAorCS5yZXNldCA9IG14MzFfcmVzZXQsCisJLmRldnR5cGUgPSBJTVgzMV9DU1BJLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfaW14X2RldnR5cGVfZGF0YSBpbXgzNV9jc3BpX2RldnR5cGVfZGF0YSA9IHsKKwkvKiBpLm14MzUgYW5kIGxhdGVyIGNzcGkgc2hhcmVzIHRoZSBmdW5jdGlvbnMgd2l0aCBpLm14MzEgb25lICovCisJLmludGN0cmwgPSBteDMxX2ludGN0cmwsCisJLmNvbmZpZyA9IG14MzFfY29uZmlnLAorCS50cmlnZ2VyID0gbXgzMV90cmlnZ2VyLAorCS5yeF9hdmFpbGFibGUgPSBteDMxX3J4X2F2YWlsYWJsZSwKKwkucmVzZXQgPSBteDMxX3Jlc2V0LAorCS5kZXZ0eXBlID0gSU1YMzVfQ1NQSSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2lteF9kZXZ0eXBlX2RhdGEgaW14NTFfZWNzcGlfZGV2dHlwZV9kYXRhID0geworCS5pbnRjdHJsID0gbXg1MV9lY3NwaV9pbnRjdHJsLAorCS5jb25maWcgPSBteDUxX2Vjc3BpX2NvbmZpZywKKwkudHJpZ2dlciA9IG14NTFfZWNzcGlfdHJpZ2dlciwKKwkucnhfYXZhaWxhYmxlID0gbXg1MV9lY3NwaV9yeF9hdmFpbGFibGUsCisJLnJlc2V0ID0gbXg1MV9lY3NwaV9yZXNldCwKKwkuZGV2dHlwZSA9IElNWDUxX0VDU1BJLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgc3BpX2lteF9kZXZ0eXBlW10gPSB7CisJeworCQkubmFtZSA9ICJpbXgxLWNzcGkiLAorCQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpICZpbXgxX2NzcGlfZGV2dHlwZV9kYXRhLAorCX0sIHsKKwkJLm5hbWUgPSAiaW14MjEtY3NwaSIsCisJCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkgJmlteDIxX2NzcGlfZGV2dHlwZV9kYXRhLAorCX0sIHsKKwkJLm5hbWUgPSAiaW14MjctY3NwaSIsCisJCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkgJmlteDI3X2NzcGlfZGV2dHlwZV9kYXRhLAorCX0sIHsKKwkJLm5hbWUgPSAiaW14MzEtY3NwaSIsCisJCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkgJmlteDMxX2NzcGlfZGV2dHlwZV9kYXRhLAorCX0sIHsKKwkJLm5hbWUgPSAiaW14MzUtY3NwaSIsCisJCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkgJmlteDM1X2NzcGlfZGV2dHlwZV9kYXRhLAorCX0sIHsKKwkJLm5hbWUgPSAiaW14NTEtZWNzcGkiLAorCQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpICZpbXg1MV9lY3NwaV9kZXZ0eXBlX2RhdGEsCisJfSwgeworCQkvKiBzZW50aW5lbCAqLworCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNwaV9pbXhfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MS1jc3BpIiwgLmRhdGEgPSAmaW14MV9jc3BpX2RldnR5cGVfZGF0YSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyMS1jc3BpIiwgLmRhdGEgPSAmaW14MjFfY3NwaV9kZXZ0eXBlX2RhdGEsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MjctY3NwaSIsIC5kYXRhID0gJmlteDI3X2NzcGlfZGV2dHlwZV9kYXRhLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDMxLWNzcGkiLCAuZGF0YSA9ICZpbXgzMV9jc3BpX2RldnR5cGVfZGF0YSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgzNS1jc3BpIiwgLmRhdGEgPSAmaW14MzVfY3NwaV9kZXZ0eXBlX2RhdGEsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZWNzcGkiLCAuZGF0YSA9ICZpbXg1MV9lY3NwaV9kZXZ0eXBlX2RhdGEsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgdm9pZCBzcGlfaW14X2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX2FjdGl2ZSkKK3sKKwlzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJaW50IGdwaW8gPSBzcGlfaW14LT5jaGlwc2VsZWN0W3NwaS0+Y2hpcF9zZWxlY3RdOworCWludCBhY3RpdmUgPSBpc19hY3RpdmUgIT0gQklUQkFOR19DU19JTkFDVElWRTsKKwlpbnQgZGV2X2lzX2xvd2FjdGl2ZSA9ICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpOworCisJaWYgKGdwaW8gPCAwKQorCQlyZXR1cm47CisKKwlncGlvX3NldF92YWx1ZShncGlvLCBkZXZfaXNfbG93YWN0aXZlIF4gYWN0aXZlKTsKK30KKworc3RhdGljIHZvaWQgc3BpX2lteF9wdXNoKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCit7CisJd2hpbGUgKHNwaV9pbXgtPnR4ZmlmbyA8IHNwaV9pbXhfZ2V0X2ZpZm9zaXplKHNwaV9pbXgpKSB7CisJCWlmICghc3BpX2lteC0+Y291bnQpCisJCQlicmVhazsKKwkJc3BpX2lteC0+dHgoc3BpX2lteCk7CisJCXNwaV9pbXgtPnR4ZmlmbysrOworCX0KKworCXNwaV9pbXgtPmRldnR5cGVfZGF0YS0+dHJpZ2dlcihzcGlfaW14KTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNwaV9pbXhfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14ID0gZGV2X2lkOworCisJd2hpbGUgKHNwaV9pbXgtPmRldnR5cGVfZGF0YS0+cnhfYXZhaWxhYmxlKHNwaV9pbXgpKSB7CisJCXNwaV9pbXgtPnJ4KHNwaV9pbXgpOworCQlzcGlfaW14LT50eGZpZm8tLTsKKwl9CisKKwlpZiAoc3BpX2lteC0+Y291bnQpIHsKKwkJc3BpX2lteF9wdXNoKHNwaV9pbXgpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKHNwaV9pbXgtPnR4ZmlmbykgeworCQkvKiBObyBkYXRhIGxlZnQgdG8gcHVzaCwgYnV0IHN0aWxsIHdhaXRpbmcgZm9yIHJ4IGRhdGEsCisJCSAqIGVuYWJsZSByZWNlaXZlIGRhdGEgYXZhaWxhYmxlIGludGVycnVwdC4KKwkJICovCisJCXNwaV9pbXgtPmRldnR5cGVfZGF0YS0+aW50Y3RybCgKKwkJCQlzcGlfaW14LCBNWENfSU5UX1JSKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXNwaV9pbXgtPmRldnR5cGVfZGF0YS0+aW50Y3RybChzcGlfaW14LCAwKTsKKwljb21wbGV0ZSgmc3BpX2lteC0+eGZlcl9kb25lKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzcGlfaW14X3NldHVweGZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCSBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXggPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlzdHJ1Y3Qgc3BpX2lteF9jb25maWcgY29uZmlnOworCisJY29uZmlnLmJwdyA9IHQgPyB0LT5iaXRzX3Blcl93b3JkIDogc3BpLT5iaXRzX3Blcl93b3JkOworCWNvbmZpZy5zcGVlZF9oeiAgPSB0ID8gdC0+c3BlZWRfaHogOiBzcGktPm1heF9zcGVlZF9oejsKKwljb25maWcubW9kZSA9IHNwaS0+bW9kZTsKKwljb25maWcuY3MgPSBzcGktPmNoaXBfc2VsZWN0OworCisJaWYgKCFjb25maWcuc3BlZWRfaHopCisJCWNvbmZpZy5zcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6OworCWlmICghY29uZmlnLmJwdykKKwkJY29uZmlnLmJwdyA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwlpZiAoIWNvbmZpZy5zcGVlZF9oeikKKwkJY29uZmlnLnNwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CisKKwkvKiBJbml0aWFsaXplIHRoZSBmdW5jdGlvbnMgZm9yIHRyYW5zZmVyICovCisJaWYgKGNvbmZpZy5icHcgPD0gOCkgeworCQlzcGlfaW14LT5yeCA9IHNwaV9pbXhfYnVmX3J4X3U4OworCQlzcGlfaW14LT50eCA9IHNwaV9pbXhfYnVmX3R4X3U4OworCX0gZWxzZSBpZiAoY29uZmlnLmJwdyA8PSAxNikgeworCQlzcGlfaW14LT5yeCA9IHNwaV9pbXhfYnVmX3J4X3UxNjsKKwkJc3BpX2lteC0+dHggPSBzcGlfaW14X2J1Zl90eF91MTY7CisJfSBlbHNlIGlmIChjb25maWcuYnB3IDw9IDMyKSB7CisJCXNwaV9pbXgtPnJ4ID0gc3BpX2lteF9idWZfcnhfdTMyOworCQlzcGlfaW14LT50eCA9IHNwaV9pbXhfYnVmX3R4X3UzMjsKKwl9IGVsc2UKKwkJQlVHKCk7CisKKwlzcGlfaW14LT5kZXZ0eXBlX2RhdGEtPmNvbmZpZyhzcGlfaW14LCAmY29uZmlnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwaV9pbXhfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFuc2ZlcikKK3sKKwlzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlzcGlfaW14LT50eF9idWYgPSB0cmFuc2Zlci0+dHhfYnVmOworCXNwaV9pbXgtPnJ4X2J1ZiA9IHRyYW5zZmVyLT5yeF9idWY7CisJc3BpX2lteC0+Y291bnQgPSB0cmFuc2Zlci0+bGVuOworCXNwaV9pbXgtPnR4ZmlmbyA9IDA7CisKKwlpbml0X2NvbXBsZXRpb24oJnNwaV9pbXgtPnhmZXJfZG9uZSk7CisKKwlzcGlfaW14X3B1c2goc3BpX2lteCk7CisKKwlzcGlfaW14LT5kZXZ0eXBlX2RhdGEtPmludGN0cmwoc3BpX2lteCwgTVhDX0lOVF9URSk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzcGlfaW14LT54ZmVyX2RvbmUpOworCisJcmV0dXJuIHRyYW5zZmVyLT5sZW47Cit9CisKK3N0YXRpYyBpbnQgc3BpX2lteF9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXggPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlpbnQgZ3BpbyA9IHNwaV9pbXgtPmNoaXBzZWxlY3Rbc3BpLT5jaGlwX3NlbGVjdF07CisKKwlkZXZfZGJnKCZzcGktPmRldiwgIiVzOiBtb2RlICVkLCAldSBicHcsICVkIGh6XG4iLCBfX2Z1bmNfXywKKwkJIHNwaS0+bW9kZSwgc3BpLT5iaXRzX3Blcl93b3JkLCBzcGktPm1heF9zcGVlZF9oeik7CisKKwlpZiAoZ3BpbyA+PSAwKQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3Bpbywgc3BpLT5tb2RlICYgU1BJX0NTX0hJR0ggPyAwIDogMSk7CisKKwlzcGlfaW14X2NoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0lOQUNUSVZFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzcGlfaW14X2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc3BpX2lteF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9CisJCQlvZl9tYXRjaF9kZXZpY2Uoc3BpX2lteF9kdF9pZHMsICZwZGV2LT5kZXYpOworCXN0cnVjdCBzcGlfaW14X21hc3RlciAqbXhjX3BsYXRmb3JtX2luZm8gPQorCQkJZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXg7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGksIHJldCwgbnVtX2NzOworCisJaWYgKCFucCAmJiAhbXhjX3BsYXRmb3JtX2luZm8pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IHRoZSBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmc2wsc3BpLW51bS1jaGlwc2VsZWN0cyIsICZudW1fY3MpOworCWlmIChyZXQgPCAwKQorCQludW1fY3MgPSBteGNfcGxhdGZvcm1faW5mby0+bnVtX2NoaXBzZWxlY3Q7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsCisJCQlzaXplb2Yoc3RydWN0IHNwaV9pbXhfZGF0YSkgKyBzaXplb2YoaW50KSAqIG51bV9jcyk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKKworCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBudW1fY3M7CisKKwlzcGlfaW14ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXNwaV9pbXgtPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm51bV9jaGlwc2VsZWN0OyBpKyspIHsKKwkJaW50IGNzX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgImNzLWdwaW9zIiwgaSk7CisJCWlmIChjc19ncGlvIDwgMCkKKwkJCWNzX2dwaW8gPSBteGNfcGxhdGZvcm1faW5mby0+Y2hpcHNlbGVjdFtpXTsKKwkJaWYgKGNzX2dwaW8gPCAwKQorCQkJY29udGludWU7CisJCXNwaV9pbXgtPmNoaXBzZWxlY3RbaV0gPSBjc19ncGlvOworCQlyZXQgPSBncGlvX3JlcXVlc3Qoc3BpX2lteC0+Y2hpcHNlbGVjdFtpXSwgRFJJVkVSX05BTUUpOworCQlpZiAocmV0KSB7CisJCQl3aGlsZSAoaSA+IDApIHsKKwkJCQlpLS07CisJCQkJaWYgKHNwaV9pbXgtPmNoaXBzZWxlY3RbaV0gPj0gMCkKKwkJCQkJZ3Bpb19mcmVlKHNwaV9pbXgtPmNoaXBzZWxlY3RbaV0pOworCQkJfQorCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGNzIGdwaW9zXG4iKTsKKwkJCWdvdG8gb3V0X21hc3Rlcl9wdXQ7CisJCX0KKwl9CisKKwlzcGlfaW14LT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBzcGlfaW14X2NoaXBzZWxlY3Q7CisJc3BpX2lteC0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IHNwaV9pbXhfc2V0dXB4ZmVyOworCXNwaV9pbXgtPmJpdGJhbmcudHhyeF9idWZzID0gc3BpX2lteF90cmFuc2ZlcjsKKwlzcGlfaW14LT5iaXRiYW5nLm1hc3Rlci0+c2V0dXAgPSBzcGlfaW14X3NldHVwOworCXNwaV9pbXgtPmJpdGJhbmcubWFzdGVyLT5jbGVhbnVwID0gc3BpX2lteF9jbGVhbnVwOworCXNwaV9pbXgtPmJpdGJhbmcubWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7CisKKwlpbml0X2NvbXBsZXRpb24oJnNwaV9pbXgtPnhmZXJfZG9uZSk7CisKKwlzcGlfaW14LT5kZXZ0eXBlX2RhdGEgPSBvZl9pZCA/IG9mX2lkLT5kYXRhIDoKKwkJKHN0cnVjdCBzcGlfaW14X2RldnR5cGVfZGF0YSAqKSBwZGV2LT5pZF9lbnRyeS0+ZHJpdmVyX2RhdGE7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBwbGF0Zm9ybSByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2dwaW9fZnJlZTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWRcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X2dwaW9fZnJlZTsKKwl9CisKKwlzcGlfaW14LT5iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghc3BpX2lteC0+YmFzZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9yZWxlYXNlX21lbTsKKwl9CisKKwlzcGlfaW14LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChzcGlfaW14LT5pcnEgPCAwKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2lvdW5tYXA7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEoc3BpX2lteC0+aXJxLCBzcGlfaW14X2lzciwgMCwgRFJJVkVSX05BTUUsIHNwaV9pbXgpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSVkOiAlZFxuIiwgc3BpX2lteC0+aXJxLCByZXQpOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKworCXNwaV9pbXgtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihzcGlfaW14LT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKHNwaV9pbXgtPmNsayk7CisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCX0KKworCWNsa19lbmFibGUoc3BpX2lteC0+Y2xrKTsKKwlzcGlfaW14LT5zcGlfY2xrID0gY2xrX2dldF9yYXRlKHNwaV9pbXgtPmNsayk7CisKKwlzcGlfaW14LT5kZXZ0eXBlX2RhdGEtPnJlc2V0KHNwaV9pbXgpOworCisJc3BpX2lteC0+ZGV2dHlwZV9kYXRhLT5pbnRjdHJsKHNwaV9pbXgsIDApOworCisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZzcGlfaW14LT5iaXRiYW5nKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImJpdGJhbmcgc3RhcnQgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X2Nsa19wdXQ7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgInByb2JlZFxuIik7CisKKwlyZXR1cm4gcmV0OworCitvdXRfY2xrX3B1dDoKKwljbGtfZGlzYWJsZShzcGlfaW14LT5jbGspOworCWNsa19wdXQoc3BpX2lteC0+Y2xrKTsKK291dF9mcmVlX2lycToKKwlmcmVlX2lycShzcGlfaW14LT5pcnEsIHNwaV9pbXgpOworb3V0X2lvdW5tYXA6CisJaW91bm1hcChzcGlfaW14LT5iYXNlKTsKK291dF9yZWxlYXNlX21lbToKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKK291dF9ncGlvX2ZyZWU6CisJZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykKKwkJaWYgKHNwaV9pbXgtPmNoaXBzZWxlY3RbaV0gPj0gMCkKKwkJCWdwaW9fZnJlZShzcGlfaW14LT5jaGlwc2VsZWN0W2ldKTsKK291dF9tYXN0ZXJfcHV0OgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJa2ZyZWUobWFzdGVyKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzcGlfaW14X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgaTsKKworCXNwaV9iaXRiYW5nX3N0b3AoJnNwaV9pbXgtPmJpdGJhbmcpOworCisJd3JpdGVsKDAsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOworCWNsa19kaXNhYmxlKHNwaV9pbXgtPmNsayk7CisJY2xrX3B1dChzcGlfaW14LT5jbGspOworCWZyZWVfaXJxKHNwaV9pbXgtPmlycSwgc3BpX2lteCk7CisJaW91bm1hcChzcGlfaW14LT5iYXNlKTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm51bV9jaGlwc2VsZWN0OyBpKyspCisJCWlmIChzcGlfaW14LT5jaGlwc2VsZWN0W2ldID49IDApCisJCQlncGlvX2ZyZWUoc3BpX2lteC0+Y2hpcHNlbGVjdFtpXSk7CisKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGlfaW14X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9IERSSVZFUl9OQU1FLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgLm9mX21hdGNoX3RhYmxlID0gc3BpX2lteF9kdF9pZHMsCisJCSAgIH0sCisJLmlkX3RhYmxlID0gc3BpX2lteF9kZXZ0eXBlLAorCS5wcm9iZSA9IHNwaV9pbXhfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNwaV9pbXhfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNwaV9pbXhfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNwaV9pbXhfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNwaV9pbXhfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzcGlfaW14X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNwaV9pbXhfaW5pdCk7Cittb2R1bGVfZXhpdChzcGlfaW14X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNQSSBNYXN0ZXIgQ29udHJvbGxlciBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXgiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1sbTcwbGxwLmMgYi9kcml2ZXJzL3NwaS9zcGktbG03MGxscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzM2ViOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktbG03MGxscC5jCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogRHJpdmVyIGZvciBMTTcwRVZBTC1MTFAgYm9hcmQgZm9yIHRoZSBMTTcwIHNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBLYWl3YW4gTiBCaWxsaW1vcmlhIDxrYWl3YW5AZGVzaWduZXJncmFwaGl4LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKworCisvKgorICogVGhlIExNNzAgY29tbXVuaWNhdGVzIHdpdGggYSBob3N0IHByb2Nlc3NvciB1c2luZyBhIDMtd2lyZSB2YXJpYW50IG9mCisgKiB0aGUgU1BJL01pY3Jvd2lyZSBidXMgaW50ZXJmYWNlLiBUaGlzIGRyaXZlciBzcGVjaWZpY2FsbHkgc3VwcG9ydHMgYW4KKyAqIE5TIExNNzAgTExQIEV2YWx1YXRpb24gQm9hcmQsIGludGVyZmFjaW5nIHRvIGEgUEMgdXNpbmcgaXRzIHBhcmFsbGVsCisgKiBwb3J0IHRvIGJpdGJhbmcgYW4gU1BJLXBhcnBvcnQgYnJpZGdlLiAgQWNjb3JkaW5nbHksIHRoaXMgaXMgYW4gU1BJCisgKiBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXIuICBUaGUgaHdtb24vbG03MCBkcml2ZXIgaXMgYSAiU1BJIHByb3RvY29sCisgKiBkcml2ZXIiLCBsYXllcmVkIG9uIHRvcCBvZiB0aGlzIG9uZSBhbmQgdXNhYmxlIHdpdGhvdXQgdGhlIGxtNzBsbHAuCisgKgorICogRGF0YXNoZWV0IGFuZCBTY2hlbWF0aWM6CisgKiBUaGUgTE03MCBpcyBhIHRlbXBlcmF0dXJlIHNlbnNvciBjaGlwIGZyb20gTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcjsgaXRzCisgKiBkYXRhc2hlZXQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNNzAuaHRtbAorICogVGhlIHNjaGVtYXRpYyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGJvYXJkICh0aGUgTE03MEVWQUwtTExQKSBpcworICogYXZhaWxhYmxlIChvbiBwYWdlIDQpIGhlcmU6CisgKiAgaHR0cDovL3d3dy5uYXRpb25hbC5jb20vYXBwaW5mby90ZW1wc2Vuc29ycy9maWxlcy9MTTcwTExQRVZBTG1hbnVhbC5wZGYKKyAqCisgKiBBbHNvIHNlZSBEb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscC4gIFRoZSBTUEk8LT5wYXJwb3J0IGNvZGUgaGVyZSBpcworICogKGhlYXZpbHkpIGJhc2VkIG9uIHNwaS1idXR0ZXJmbHkgYnkgRGF2aWQgQnJvd25lbGwuCisgKgorICogVGhlIExNNzAgTExQIGNvbm5lY3RzIHRvIHRoZSBQQyBwYXJhbGxlbCBwb3J0IGluIHRoZSBmb2xsb3dpbmcgbWFubmVyOgorICoKKyAqICAgUGFyYWxsZWwgICAgICAgICAgICAgICAgIExNNzAgTExQCisgKiAgICAgUG9ydCAgICAgIERpcmVjdGlvbiAgIEpQMiBIZWFkZXIKKyAqICAtLS0tLS0tLS0tLSAgLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0KKyAqICAgICAgRDAgICAgMiAgICAgIC0gICAgICAgICAtCisgKiAgICAgIEQxICAgIDMgICAgIC0tPiAgICAgIFYrICAgNQorICogICAgICBEMiAgICA0ICAgICAtLT4gICAgICBWKyAgIDUKKyAqICAgICAgRDMgICAgNSAgICAgLS0+ICAgICAgVisgICA1CisgKiAgICAgIEQ0ICAgIDYgICAgIC0tPiAgICAgIFYrICAgNQorICogICAgICBENSAgICA3ICAgICAtLT4gICAgICBuQ1MgIDgKKyAqICAgICAgRDYgICAgOCAgICAgLS0+ICAgICAgU0NMSyAzCisgKiAgICAgIEQ3ICAgIDkgICAgIC0tPiAgICAgIFNJL08gNQorICogICAgIEdORCAgIDI1ICAgICAgLSAgICAgICBHTkQgIDcKKyAqICAgIFNlbGVjdCAxMyAgICAgPC0tICAgICAgU0kvTyAxCisgKgorICogTm90ZSB0aGF0IHBhcnBvcnQgcGluIDEzIGFjdHVhbGx5IGdldHMgaW52ZXJ0ZWQgYnkgdGhlIHRyYW5zaXN0b3IKKyAqIGFycmFuZ2VtZW50IHdoaWNoIGxldHMgZWl0aGVyIHRoZSBwYXJwb3J0IG9yIHRoZSBMTTcwIGRyaXZlIHRoZQorICogU0kvU08gc2lnbmFsIChzZWUgdGhlIHNjaGVtYXRpYyBmb3IgZGV0YWlscykuCisgKi8KKworI2RlZmluZSBEUlZOQU1FCQkic3BpLWxtNzBsbHAiCisKKyNkZWZpbmUgbG03MF9JTklUCTB4QkUKKyNkZWZpbmUgU0lPCQkweDEwCisjZGVmaW5lIG5DUwkJMHgyMAorI2RlZmluZSBTQ0xLCQkweDQwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBzcGlfbG03MGxscCB7CisJc3RydWN0IHNwaV9iaXRiYW5nCWJpdGJhbmc7CisJc3RydWN0IHBhcnBvcnQJCSpwb3J0OworCXN0cnVjdCBwYXJkZXZpY2UJKnBkOworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGlkZXZfbG03MDsKKwlzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8JaW5mbzsKKwkvL3N0cnVjdCBkZXZpY2UJCSpkZXY7Cit9OworCisvKiBSRVZJU0lUIDogdWdseSBnbG9iYWwgOyBwcm92aWRlcyAiZXhjbHVzaXZlIG9wZW4iIGZhY2lsaXR5ICovCitzdGF0aWMgc3RydWN0IHNwaV9sbTcwbGxwICpsbTcwbGxwOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNwaV9sbTcwbGxwICpzcGlkZXZfdG9fcHAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gc3BpLT5jb250cm9sbGVyX2RhdGE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMTTcwIExMUCBldmFsIGJvYXJkLXNwZWNpZmljIGlubGluZXMgZm9sbG93ICovCisKKy8qIE5PVEU6ICB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIHJlcmVhZCB0aGUgb3V0cHV0IHZhbHVlcywgc2luY2UgdGhleSdsbAorICogc3RpbGwgYmUgd2hhdCB3ZSB3cm90ZSBiZWZvcmUuICBQbHVzLCBnb2luZyB0aHJvdWdoIHBhcnBvcnQgYnVpbGRzIGluCisgKiBhIH4xbXMvb3BlcmF0aW9uIGRlbGF5OyB0aGVzZSBTUEkgdHJhbnNmZXJzIGNvdWxkIGVhc2lseSBiZSBmYXN0ZXIuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGRlYXNzZXJ0Q1Moc3RydWN0IHNwaV9sbTcwbGxwICpwcCkKK3sKKwl1OCBkYXRhID0gcGFycG9ydF9yZWFkX2RhdGEocHAtPnBvcnQpOworCisJZGF0YSAmPSB+MHg4MDsJCS8qIHB1bGwgRDcvU0ktb3V0IGxvdyB3aGlsZSBkZS1hc3NlcnRlZCAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgZGF0YSB8IG5DUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRDUyhzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwKQoreworCXU4IGRhdGEgPSBwYXJwb3J0X3JlYWRfZGF0YShwcC0+cG9ydCk7CisKKwlkYXRhIHw9IDB4ODA7CQkvKiBwdWxsIEQ3L1NJLW91dCBoaWdoIHNvIGxtNzAgZHJpdmVzIFNPLWluICovCisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBkYXRhICYgfm5DUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGtIaWdoKHN0cnVjdCBzcGlfbG03MGxscCAqcHApCit7CisJdTggZGF0YSA9IHBhcnBvcnRfcmVhZF9kYXRhKHBwLT5wb3J0KTsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGRhdGEgfCBTQ0xLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsa0xvdyhzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwKQoreworCXU4IGRhdGEgPSBwYXJwb3J0X3JlYWRfZGF0YShwcC0+cG9ydCk7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBkYXRhICYgflNDTEspOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BJLUxNNzAtc3BlY2lmaWMgaW5saW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNwaWRlbGF5KHVuc2lnbmVkIGQpCit7CisJdWRlbGF5KGQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0c2NrKHN0cnVjdCBzcGlfZGV2aWNlICpzLCBpbnQgaXNfb24pCit7CisJc3RydWN0IHNwaV9sbTcwbGxwICpwcCA9IHNwaWRldl90b19wcChzKTsKKworCWlmIChpc19vbikKKwkJY2xrSGlnaChwcCk7CisJZWxzZQorCQljbGtMb3cocHApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0bW9zaShzdHJ1Y3Qgc3BpX2RldmljZSAqcywgaW50IGlzX29uKQoreworCS8qIEZJWE1FIHVwZGF0ZSBENyAuLi4gdGhpcyB3YXkgd2UgY2FuIHB1dCB0aGUgY2hpcAorCSAqIGludG8gc2h1dGRvd24gbW9kZSBhbmQgcmVhZCB0aGUgbWFudWZhY3R1cmVyIElELAorCSAqIGJ1dCB3ZSBjYW4ndCBwdXQgaXQgYmFjayBpbnRvIG9wZXJhdGlvbmFsIG1vZGUuCisJICovCit9CisKKy8qCisgKiBnZXRtaXNvOgorICogV2h5IGRvIHdlIHJldHVybiAwIHdoZW4gdGhlIFNJTyBsaW5lIGlzIGhpZ2ggYW5kIHZpY2UtdmVyc2E/CisgKiBUaGUgZmFjdCBpcywgdGhlIGxtNzAgZXZhbCBib2FyZCBmcm9tIE5TICh3aGljaCB0aGlzIGRyaXZlciBkcml2ZXMpLAorICogaXMgd2lyZWQgaW4ganVzdCBzdWNoIGEgd2F5IDogd2hlbiB0aGUgbG03MCdzIFNJTyBnb2VzIGhpZ2gsIGEgdHJhbnNpc3RvcgorICogc3dpdGNoZXMgaXQgdG8gbG93IHJlZmxlY3RpbmcgdGhpcyBvbiB0aGUgcGFycG9ydCAocGluIDEzKSwgYW5kIHZpY2UtdmVyc2EuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldG1pc28oc3RydWN0IHNwaV9kZXZpY2UgKnMpCit7CisJc3RydWN0IHNwaV9sbTcwbGxwICpwcCA9IHNwaWRldl90b19wcChzKTsKKwlyZXR1cm4gKChTSU8gPT0gKHBhcnBvcnRfcmVhZF9zdGF0dXMocHAtPnBvcnQpICYgU0lPKSkgPyAwIDogMSApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJzcGktYml0YmFuZy10eHJ4LmgiCisKK3N0YXRpYyB2b2lkIGxtNzBfY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHNwaV9sbTcwbGxwICpwcCA9IHNwaWRldl90b19wcChzcGkpOworCisJaWYgKHZhbHVlKQorCQlhc3NlcnRDUyhwcCk7CisJZWxzZQorCQlkZWFzc2VydENTKHBwKTsKK30KKworLyoKKyAqIE91ciBhY3R1YWwgYml0YmFuZ2VyIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB1MzIgbG03MF90eHJ4KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIDAsIHdvcmQsIGJpdHMpOworfQorCitzdGF0aWMgdm9pZCBzcGlfbG03MGxscF9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IHBhcmRldmljZQkqcGQ7CisJc3RydWN0IHNwaV9sbTcwbGxwCSpwcDsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCWludAkJCXN0YXR1czsKKworCWlmIChsbTcwbGxwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlczogc3BpX2xtNzBsbHAgaW5zdGFuY2UgYWxyZWFkeSBsb2FkZWQuIEFib3J0aW5nLlxuIiwKKwkJCURSVk5BTUUpOworCQlyZXR1cm47CisJfQorCisJLyogVE9ETzogIHRoaXMganVzdCBfYXNzdW1lc18gYSBsbTcwIGlzIHRoZXJlIC4uLiBubyBwcm9iZTsKKwkgKiB0aGUgbG03MCBkcml2ZXIgY291bGQgdmVyaWZ5IGl0LCByZWFkaW5nIHRoZSBtYW5mIElELgorCSAqLworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihwLT5waHlzcG9ydC0+ZGV2LCBzaXplb2YgKnBwKTsKKwlpZiAoIW1hc3RlcikgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mYWlsOworCX0KKwlwcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCW1hc3Rlci0+YnVzX251bSA9IC0xOwkvKiBkeW5hbWljIGFsbG9jIG9mIGEgYnVzIG51bWJlciAqLworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAxOworCisJLyoKKwkgKiBTUEkgYW5kIGJpdGJhbmcgaG9va3VwLgorCSAqLworCXBwLT5iaXRiYW5nLm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJcHAtPmJpdGJhbmcuY2hpcHNlbGVjdCA9IGxtNzBfY2hpcHNlbGVjdDsKKwlwcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBsbTcwX3R4cng7CisJcHAtPmJpdGJhbmcuZmxhZ3MgPSBTUElfM1dJUkU7CisKKwkvKgorCSAqIFBhcnBvcnQgaG9va3VwCisJICovCisJcHAtPnBvcnQgPSBwOworCXBkID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocCwgRFJWTkFNRSwKKwkJCU5VTEwsIE5VTEwsIE5VTEwsCisJCQlQQVJQT1JUX0ZMQUdfRVhDTCwgcHApOworCWlmICghcGQpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9tYXN0ZXI7CisJfQorCXBwLT5wZCA9IHBkOworCisJc3RhdHVzID0gcGFycG9ydF9jbGFpbShwZCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0X3BhcnBvcnRfdW5yZWc7CisKKwkvKgorCSAqIFN0YXJ0IFNQSSAuLi4KKwkgKi8KKwlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdGFydCgmcHAtPmJpdGJhbmcpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlczogc3BpX2JpdGJhbmdfc3RhcnQgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLAorCQkJRFJWTkFNRSwgc3RhdHVzKTsKKwkJZ290byBvdXRfb2ZmX2FuZF9yZWxlYXNlOworCX0KKworCS8qCisJICogVGhlIG1vZGFsaWFzIG5hbWUgTVVTVCBtYXRjaCB0aGUgZGV2aWNlX2RyaXZlciBuYW1lCisJICogZm9yIHRoZSBidXMgZ2x1ZSBjb2RlIHRvIG1hdGNoIGFuZCBzdWJzZXF1ZW50bHkgYmluZCB0aGVtLgorCSAqIFdlIGFyZSBiaW5kaW5nIHRvIHRoZSBnZW5lcmljIGRyaXZlcnMvaHdtb24vbG03MC5jIGRldmljZQorCSAqIGRyaXZlci4KKwkgKi8KKwlzdHJjcHkocHAtPmluZm8ubW9kYWxpYXMsICJsbTcwIik7CisJcHAtPmluZm8ubWF4X3NwZWVkX2h6ID0gNiAqIDEwMDAgKiAxMDAwOworCXBwLT5pbmZvLmNoaXBfc2VsZWN0ID0gMDsKKwlwcC0+aW5mby5tb2RlID0gU1BJXzNXSVJFIHwgU1BJX01PREVfMDsKKworCS8qIHBvd2VyIHVwIHRoZSBjaGlwLCBhbmQgbGV0IHRoZSBMTTcwIGNvbnRyb2wgU0kvU08gKi8KKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGxtNzBfSU5JVCk7CisKKwkvKiBFbmFibGUgYWNjZXNzIHRvIG91ciBwcmltYXJ5IGRhdGEgc3RydWN0dXJlIHZpYQorCSAqIHRoZSBib2FyZCBpbmZvJ3MgKHZvaWQgKiljb250cm9sbGVyX2RhdGEuCisJICovCisJcHAtPmluZm8uY29udHJvbGxlcl9kYXRhID0gcHA7CisJcHAtPnNwaWRldl9sbTcwID0gc3BpX25ld19kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLCAmcHAtPmluZm8pOworCWlmIChwcC0+c3BpZGV2X2xtNzApCisJCWRldl9kYmcoJnBwLT5zcGlkZXZfbG03MC0+ZGV2LCAic3BpZGV2X2xtNzAgYXQgJXNcbiIsCisJCQkJZGV2X25hbWUoJnBwLT5zcGlkZXZfbG03MC0+ZGV2KSk7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzcGlfbmV3X2RldmljZSBmYWlsZWRcbiIsIERSVk5BTUUpOworCQlzdGF0dXMgPSAtRU5PREVWOworCQlnb3RvIG91dF9iaXRiYW5nX3N0b3A7CisJfQorCXBwLT5zcGlkZXZfbG03MC0+Yml0c19wZXJfd29yZCA9IDg7CisKKwlsbTcwbGxwID0gcHA7CisJcmV0dXJuOworCitvdXRfYml0YmFuZ19zdG9wOgorCXNwaV9iaXRiYW5nX3N0b3AoJnBwLT5iaXRiYW5nKTsKK291dF9vZmZfYW5kX3JlbGVhc2U6CisJLyogcG93ZXIgZG93biAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgMCk7CisJbWRlbGF5KDEwKTsKKwlwYXJwb3J0X3JlbGVhc2UocHAtPnBkKTsKK291dF9wYXJwb3J0X3VucmVnOgorCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocGQpOworb3V0X2ZyZWVfbWFzdGVyOgorCSh2b2lkKSBzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworb3V0X2ZhaWw6CisJcHJfaW5mbygiJXM6IHNwaV9sbTcwbGxwIHByb2JlIGZhaWwsIHN0YXR1cyAlZFxuIiwgRFJWTkFNRSwgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgc3BpX2xtNzBsbHBfZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBzcGlfbG03MGxscAkJKnBwOworCisJaWYgKCFsbTcwbGxwIHx8IGxtNzBsbHAtPnBvcnQgIT0gcCkKKwkJcmV0dXJuOworCisJcHAgPSBsbTcwbGxwOworCXNwaV9iaXRiYW5nX3N0b3AoJnBwLT5iaXRiYW5nKTsKKworCS8qIHBvd2VyIGRvd24gKi8KKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIDApOworCisJcGFycG9ydF9yZWxlYXNlKHBwLT5wZCk7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcC0+cGQpOworCisJKHZvaWQpIHNwaV9tYXN0ZXJfcHV0KHBwLT5iaXRiYW5nLm1hc3Rlcik7CisKKwlsbTcwbGxwID0gTlVMTDsKK30KKworCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHNwaV9sbTcwbGxwX2RydiA9IHsKKwkubmFtZSA9CQlEUlZOQU1FLAorCS5hdHRhY2ggPQlzcGlfbG03MGxscF9hdHRhY2gsCisJLmRldGFjaCA9CXNwaV9sbTcwbGxwX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc3BpX2xtNzBsbHAodm9pZCkKK3sKKwlyZXR1cm4gcGFycG9ydF9yZWdpc3Rlcl9kcml2ZXIoJnNwaV9sbTcwbGxwX2Rydik7Cit9Cittb2R1bGVfaW5pdChpbml0X3NwaV9sbTcwbGxwKTsKKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfc3BpX2xtNzBsbHAodm9pZCkKK3sKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZzcGlfbG03MGxscF9kcnYpOworfQorbW9kdWxlX2V4aXQoY2xlYW51cF9zcGlfbG03MGxscCk7CisKK01PRFVMRV9BVVRIT1IoIkthaXdhbiBOIEJpbGxpbW9yaWEgPGthaXdhbkBkZXNpZ25lcmdyYXBoaXguY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKAorCSJQYXJwb3J0IGFkYXB0ZXIgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzAgTExQIGV2YWwgYm9hcmQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL21wYzUxMnhfcHNjX3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3BpL21wYzUxMnhfcHNjX3NwaS5jCnJlbmFtZSB0byBkcml2ZXJzL3NwaS9zcGktbXBjNTEyeC1wc2MuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC1wc2MuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LXBzYy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9tcGM1Mnh4X3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zcGkvbXBjNTJ4eF9zcGkuYwpyZW5hbWUgdG8gZHJpdmVycy9zcGkvc3BpLW1wYzUyeHguYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW51YzkwMC5jIGIvZHJpdmVycy9zcGkvc3BpLW51YzkwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTZjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktbnVjOTAwLmMKQEAgLTAsMCArMSw1MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgTnV2b3RvbiB0ZWNobm9sb2d5LgorICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorCisjaW5jbHVkZSA8bWFjaC9udWM5MDBfc3BpLmg+CisKKy8qIHVzaSByZWdpc3RlcnMgb2Zmc2V0ICovCisjZGVmaW5lIFVTSV9DTlQJCTB4MDAKKyNkZWZpbmUgVVNJX0RJVgkJMHgwNAorI2RlZmluZSBVU0lfU1NSCQkweDA4CisjZGVmaW5lIFVTSV9SWDAJCTB4MTAKKyNkZWZpbmUgVVNJX1RYMAkJMHgxMAorCisvKiB1c2kgcmVnaXN0ZXIgYml0ICovCisjZGVmaW5lIEVOSU5UCQkoMHgwMSA8PCAxNykKKyNkZWZpbmUgRU5GTEcJCSgweDAxIDw8IDE2KQorI2RlZmluZSBUWE5VTQkJKDB4MDMgPDwgOCkKKyNkZWZpbmUgVFhORUcJCSgweDAxIDw8IDIpCisjZGVmaW5lIFJYTkVHCQkoMHgwMSA8PCAxKQorI2RlZmluZSBMU0IJCSgweDAxIDw8IDEwKQorI2RlZmluZSBTRUxFQ1RMRVYJKDB4MDEgPDwgMikKKyNkZWZpbmUgU0VMRUNUUE9MCSgweDAxIDw8IDMxKQorI2RlZmluZSBTRUxFQ1RTTEFWRQkweDAxCisjZGVmaW5lIEdPQlVTWQkJMHgwMQorCitzdHJ1Y3QgbnVjOTAwX3NwaSB7CisJc3RydWN0IHNwaV9iaXRiYW5nCSBiaXRiYW5nOworCXN0cnVjdCBjb21wbGV0aW9uCSBkb25lOworCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJaW50CQkJIGlycTsKKwlpbnQJCQkgbGVuOworCWludAkJCSBjb3VudDsKKwljb25zdCB1bnNpZ25lZCBjaGFyCSp0eDsKKwl1bnNpZ25lZCBjaGFyCQkqcng7CisJc3RydWN0IGNsawkJKmNsazsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSppb2FyZWE7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqY3VyZGV2OworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IG51YzkwMF9zcGlfaW5mbyAqcGRhdGE7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSpyZXM7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBudWM5MDBfc3BpICp0b19odyhzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldikKK3sKKwlyZXR1cm4gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzZGV2LT5tYXN0ZXIpOworfQorCitzdGF0aWMgdm9pZCBudWM5MDBfc2xhdmVfc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIGludCBzc3IpCit7CisJc3RydWN0IG51YzkwMF9zcGkgKmh3ID0gdG9faHcoc3BpKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGludCBjcyA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIID8gMSA6IDA7CisJdW5zaWduZWQgaW50IGNwb2wgPSBzcGktPm1vZGUgJiBTUElfQ1BPTCA/IDEgOiAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX1NTUik7CisKKwlpZiAoIWNzKQorCQl2YWwgJj0gflNFTEVDVExFVjsKKwllbHNlCisJCXZhbCB8PSBTRUxFQ1RMRVY7CisKKwlpZiAoIXNzcikKKwkJdmFsICY9IH5TRUxFQ1RTTEFWRTsKKwllbHNlCisJCXZhbCB8PSBTRUxFQ1RTTEFWRTsKKworCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX1NTUik7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOworCisJaWYgKCFjcG9sKQorCQl2YWwgJj0gflNFTEVDVFBPTDsKKwllbHNlCisJCXZhbCB8PSBTRUxFQ1RQT0w7CisKKwlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbnVjOTAwX3NwaV9jaGlwc2VsKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKK3sKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSBCSVRCQU5HX0NTX0lOQUNUSVZFOgorCQludWM5MDBfc2xhdmVfc2VsZWN0KHNwaSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBCSVRCQU5HX0NTX0FDVElWRToKKwkJbnVjOTAwX3NsYXZlX3NlbGVjdChzcGksIDEpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG51YzkwMF9zcGlfc2V0dXBfdHhudW0oc3RydWN0IG51YzkwMF9zcGkgKmh3LAorCQkJCQkJCXVuc2lnbmVkIGludCB0eG51bSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlpZiAoIXR4bnVtKQorCQl2YWwgJj0gflRYTlVNOworCWVsc2UKKwkJdmFsIHw9IHR4bnVtIDw8IDB4MDg7CisKKwlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKKworfQorCitzdGF0aWMgdm9pZCBudWM5MDBfc3BpX3NldHVwX3R4Yml0bGVuKHN0cnVjdCBudWM5MDBfc3BpICpodywKKwkJCQkJCQl1bnNpZ25lZCBpbnQgdHhiaXRsZW4pCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOworCisJdmFsIHw9ICh0eGJpdGxlbiA8PCAweDAzKTsKKworCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBudWM5MDBfc3BpX2dvYnVzeShzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOworCisJdmFsIHw9IEdPQlVTWTsKKworCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG51YzkwMF9zcGlfc2V0dXB4ZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnVjOTAwX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBod190eGJ5dGUoc3RydWN0IG51YzkwMF9zcGkgKmh3LCBpbnQgY291bnQpCit7CisJcmV0dXJuIGh3LT50eCA/IGh3LT50eFtjb3VudF0gOiAwOworfQorCitzdGF0aWMgaW50IG51YzkwMF9zcGlfdHhyeChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBudWM5MDBfc3BpICpodyA9IHRvX2h3KHNwaSk7CisKKwlody0+dHggPSB0LT50eF9idWY7CisJaHctPnJ4ID0gdC0+cnhfYnVmOworCWh3LT5sZW4gPSB0LT5sZW47CisJaHctPmNvdW50ID0gMDsKKworCV9fcmF3X3dyaXRlbChod190eGJ5dGUoaHcsIDB4MCksIGh3LT5yZWdzICsgVVNJX1RYMCk7CisKKwludWM5MDBfc3BpX2dvYnVzeShodyk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZody0+ZG9uZSk7CisKKwlyZXR1cm4gaHctPmNvdW50OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbnVjOTAwX3NwaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBudWM5MDBfc3BpICpodyA9IGRldjsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBjb3VudCA9IGh3LT5jb3VudDsKKworCXN0YXR1cyA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisJX19yYXdfd3JpdGVsKHN0YXR1cywgaHctPnJlZ3MgKyBVU0lfQ05UKTsKKworCWlmIChzdGF0dXMgJiBFTkZMRykgeworCQlody0+Y291bnQrKzsKKworCQlpZiAoaHctPnJ4KQorCQkJaHctPnJ4W2NvdW50XSA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX1JYMCk7CisJCWNvdW50Kys7CisKKwkJaWYgKGNvdW50IDwgaHctPmxlbikgeworCQkJX19yYXdfd3JpdGVsKGh3X3R4Ynl0ZShodywgY291bnQpLCBody0+cmVncyArIFVTSV9UWDApOworCQkJbnVjOTAwX3NwaV9nb2J1c3koaHcpOworCQl9IGVsc2UgeworCQkJY29tcGxldGUoJmh3LT5kb25lKTsKKwkJfQorCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwljb21wbGV0ZSgmaHctPmRvbmUpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbnVjOTAwX3R4X2VkZ2Uoc3RydWN0IG51YzkwMF9zcGkgKmh3LCB1bnNpZ25lZCBpbnQgZWRnZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlpZiAoZWRnZSkKKwkJdmFsIHw9IFRYTkVHOworCWVsc2UKKwkJdmFsICY9IH5UWE5FRzsKKwlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbnVjOTAwX3J4X2VkZ2Uoc3RydWN0IG51YzkwMF9zcGkgKmh3LCB1bnNpZ25lZCBpbnQgZWRnZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlpZiAoZWRnZSkKKwkJdmFsIHw9IFJYTkVHOworCWVsc2UKKwkJdmFsICY9IH5SWE5FRzsKKwlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbnVjOTAwX3NlbmRfZmlyc3Qoc3RydWN0IG51YzkwMF9zcGkgKmh3LCB1bnNpZ25lZCBpbnQgbHNiKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKTsKKworCWlmIChsc2IpCisJCXZhbCB8PSBMU0I7CisJZWxzZQorCQl2YWwgJj0gfkxTQjsKKwlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbnVjOTAwX3NldF9zbGVlcChzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcsIHVuc2lnbmVkIGludCBzbGVlcCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlpZiAoc2xlZXApCisJCXZhbCB8PSAoc2xlZXAgPDwgMTIpOworCWVsc2UKKwkJdmFsICY9IH4oMHgwZiA8PCAxMik7CisJX19yYXdfd3JpdGVsKHZhbCwgaHctPnJlZ3MgKyBVU0lfQ05UKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG51YzkwMF9lbmFibGVfaW50KHN0cnVjdCBudWM5MDBfc3BpICpodykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwl2YWwgfD0gRU5JTlQ7CisKKwlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbnVjOTAwX3NldF9kaXZpZGVyKHN0cnVjdCBudWM5MDBfc3BpICpodykKK3sKKwlfX3Jhd193cml0ZWwoaHctPnBkYXRhLT5kaXZpZGVyLCBody0+cmVncyArIFVTSV9ESVYpOworfQorCitzdGF0aWMgdm9pZCBudWM5MDBfaW5pdF9zcGkoc3RydWN0IG51YzkwMF9zcGkgKmh3KQoreworCWNsa19lbmFibGUoaHctPmNsayk7CisJc3Bpbl9sb2NrX2luaXQoJmh3LT5sb2NrKTsKKworCW51YzkwMF90eF9lZGdlKGh3LCBody0+cGRhdGEtPnR4bmVnKTsKKwludWM5MDBfcnhfZWRnZShodywgaHctPnBkYXRhLT5yeG5lZyk7CisJbnVjOTAwX3NlbmRfZmlyc3QoaHcsIGh3LT5wZGF0YS0+bHNiKTsKKwludWM5MDBfc2V0X3NsZWVwKGh3LCBody0+cGRhdGEtPnNsZWVwKTsKKwludWM5MDBfc3BpX3NldHVwX3R4Yml0bGVuKGh3LCBody0+cGRhdGEtPnR4Yml0bGVuKTsKKwludWM5MDBfc3BpX3NldHVwX3R4bnVtKGh3LCBody0+cGRhdGEtPnR4bnVtKTsKKwludWM5MDBfc2V0X2RpdmlkZXIoaHcpOworCW51YzkwMF9lbmFibGVfaW50KGh3KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbnVjOTAwX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBudWM5MDBfc3BpICpodzsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCWludCBlcnIgPSAwOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG51YzkwMF9zcGkpKTsKKwlpZiAobWFzdGVyID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gbWVtb3J5IGZvciBzcGlfbWFzdGVyXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfbm9tZW07CisJfQorCisJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJbWVtc2V0KGh3LCAwLCBzaXplb2Yoc3RydWN0IG51YzkwMF9zcGkpKTsKKworCWh3LT5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOworCWh3LT5wZGF0YSAgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlody0+ZGV2ID0gJnBkZXYtPmRldjsKKworCWlmIChody0+cGRhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBlcnJfcGRhdGE7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaHcpOworCWluaXRfY29tcGxldGlvbigmaHctPmRvbmUpOworCisJbWFzdGVyLT5tb2RlX2JpdHMgICAgICAgICAgPSBTUElfTU9ERV8wOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgICAgID0gaHctPnBkYXRhLT5udW1fY3M7CisJbWFzdGVyLT5idXNfbnVtICAgICAgICAgICAgPSBody0+cGRhdGEtPmJ1c19udW07CisJaHctPmJpdGJhbmcubWFzdGVyICAgICAgICAgPSBody0+bWFzdGVyOworCWh3LT5iaXRiYW5nLnNldHVwX3RyYW5zZmVyID0gbnVjOTAwX3NwaV9zZXR1cHhmZXI7CisJaHctPmJpdGJhbmcuY2hpcHNlbGVjdCAgICAgPSBudWM5MDBfc3BpX2NoaXBzZWw7CisJaHctPmJpdGJhbmcudHhyeF9idWZzICAgICAgPSBudWM5MDBfc3BpX3R4cng7CisJaHctPmJpdGJhbmcubWFzdGVyLT5zZXR1cCAgPSBudWM5MDBfc3BpX3NldHVwOworCisJaHctPnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKGh3LT5yZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZ2V0IElPUkVTT1VSQ0VfTUVNXG4iKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBlcnJfcGRhdGE7CisJfQorCisJaHctPmlvYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihody0+cmVzLT5zdGFydCwKKwkJCQkJcmVzb3VyY2Vfc2l6ZShody0+cmVzKSwgcGRldi0+bmFtZSk7CisKKwlpZiAoaHctPmlvYXJlYSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCByZXNlcnZlIHJlZ2lvblxuIik7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBlcnJfcGRhdGE7CisJfQorCisJaHctPnJlZ3MgPSBpb3JlbWFwKGh3LT5yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGh3LT5yZXMpKTsKKwlpZiAoaHctPnJlZ3MgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgbWFwIElPXG4iKTsKKwkJZXJyID0gLUVOWElPOworCQlnb3RvIGVycl9pb21hcDsKKwl9CisKKwlody0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaHctPmlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gSVJRIHNwZWNpZmllZFxuIik7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwllcnIgPSByZXF1ZXN0X2lycShody0+aXJxLCBudWM5MDBfc3BpX2lycSwgMCwgcGRldi0+bmFtZSwgaHcpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGNsYWltIElSUVxuIik7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwlody0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAic3BpIik7CisJaWYgKElTX0VSUihody0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBjbG9jayBmb3IgZGV2aWNlXG4iKTsKKwkJZXJyID0gUFRSX0VSUihody0+Y2xrKTsKKwkJZ290byBlcnJfY2xrOworCX0KKworCW1mcF9zZXRfZ3JvdXBnKCZwZGV2LT5kZXYpOworCW51YzkwMF9pbml0X3NwaShodyk7CisKKwllcnIgPSBzcGlfYml0YmFuZ19zdGFydCgmaHctPmJpdGJhbmcpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFNQSSBtYXN0ZXJcbiIpOworCQlnb3RvIGVycl9yZWdpc3RlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3JlZ2lzdGVyOgorCWNsa19kaXNhYmxlKGh3LT5jbGspOworCWNsa19wdXQoaHctPmNsayk7CitlcnJfY2xrOgorCWZyZWVfaXJxKGh3LT5pcnEsIGh3KTsKK2Vycl9pcnE6CisJaW91bm1hcChody0+cmVncyk7CitlcnJfaW9tYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGh3LT5yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGh3LT5yZXMpKTsKKwlrZnJlZShody0+aW9hcmVhKTsKK2Vycl9wZGF0YToKKwlzcGlfbWFzdGVyX3B1dChody0+bWFzdGVyKTsKKworZXJyX25vbWVtOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG51YzkwMF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCisJZnJlZV9pcnEoaHctPmlycSwgaHcpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKworCXNwaV9iaXRiYW5nX3N0b3AoJmh3LT5iaXRiYW5nKTsKKworCWNsa19kaXNhYmxlKGh3LT5jbGspOworCWNsa19wdXQoaHctPmNsayk7CisKKwlpb3VubWFwKGh3LT5yZWdzKTsKKworCXJlbGVhc2VfbWVtX3JlZ2lvbihody0+cmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShody0+cmVzKSk7CisJa2ZyZWUoaHctPmlvYXJlYSk7CisKKwlzcGlfbWFzdGVyX3B1dChody0+bWFzdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbnVjOTAwX3NwaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG51YzkwMF9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChudWM5MDBfc3BpX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gIm51YzkwMC1zcGkiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbnVjOTAwX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbnVjOTAwX3NwaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbnVjOTAwX3NwaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm51YzkwMF9zcGlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobnVjOTAwX3NwaV9pbml0KTsKK21vZHVsZV9leGl0KG51YzkwMF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIldhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigibnVjOTAwIHNwaSBkcml2ZXIhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm51YzkwMC1zcGkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9vY190aW55LmMgYi9kcml2ZXJzL3NwaS9zcGktb2MtdGlueS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3NwaS9zcGlfb2NfdGlueS5jCnJlbmFtZSB0byBkcml2ZXJzL3NwaS9zcGktb2MtdGlueS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9vbWFwX3NwaV8xMDBrLmMgYi9kcml2ZXJzL3NwaS9zcGktb21hcC0xMDBrLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3BpL29tYXBfc3BpXzEwMGsuYwpyZW5hbWUgdG8gZHJpdmVycy9zcGkvc3BpLW9tYXAtMTAway5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb21hcC11d2lyZS5jIGIvZHJpdmVycy9zcGkvc3BpLW9tYXAtdXdpcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGE4ZTlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9tYXAtdXdpcmUuYwpAQCAtMCwwICsxLDU5MyBAQAorLyoKKyAqIE1pY3JvV2lyZSBpbnRlcmZhY2UgZHJpdmVyIGZvciBPTUFQCisgKgorICogQ29weXJpZ2h0IDIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiBQb3J0ZWQgdG8gMi42IE9NQVAgdXdpcmUgaW50ZXJmYWNlLgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzLgorICoKKyAqIEdlbmVyYWxpemF0aW9uIHBhdGNoZXMgYnkgSnVoYSBZcmpvbGEgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgQnJvd25lbGwgKHBvcnRlZCB0byAyLjYgU1BJIGludGVyZmFjZSkKKyAqIENvcHlyaWdodCAoQykgMjAwNiBOb2tpYQorICoKKyAqIE1hbnkgdXBkYXRlcyBieSBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CisjaW5jbHVkZSA8cGxhdC9vbWFwN3h4Lmg+CS8qIE9NQVA3WFhfSU9fQ09ORiByZWdpc3RlcnMgKi8KKworCisvKiBGSVhNRSBhZGRyZXNzIGlzIG5vdyBhIHBsYXRmb3JtIGRldmljZSByZXNvdXJjZSwKKyAqIGFuZCBpcnFzIHNob3VsZCBzaG93IHRoZXJlIHRvby4uLgorICovCisjZGVmaW5lIFVXSVJFX0JBU0VfUEhZUwkJMHhGRkZCMzAwMAorCisvKiB1V2lyZSBSZWdpc3RlcnM6ICovCisjZGVmaW5lIFVXSVJFX0lPX1NJWkUgMHgyMAorI2RlZmluZSBVV0lSRV9URFIgICAgIDB4MDAKKyNkZWZpbmUgVVdJUkVfUkRSICAgICAweDAwCisjZGVmaW5lIFVXSVJFX0NTUiAgICAgMHgwMQorI2RlZmluZSBVV0lSRV9TUjEgICAgIDB4MDIKKyNkZWZpbmUgVVdJUkVfU1IyICAgICAweDAzCisjZGVmaW5lIFVXSVJFX1NSMyAgICAgMHgwNAorI2RlZmluZSBVV0lSRV9TUjQgICAgIDB4MDUKKyNkZWZpbmUgVVdJUkVfU1I1ICAgICAweDA2CisKKy8qIENTUiBiaXRzICovCisjZGVmaW5lCVJEUkIJKDEgPDwgMTUpCisjZGVmaW5lCUNTUkIJKDEgPDwgMTQpCisjZGVmaW5lCVNUQVJUCSgxIDw8IDEzKQorI2RlZmluZQlDU19DTUQJKDEgPDwgMTIpCisKKy8qIFNSMSBvciBTUjIgYml0cyAqLworI2RlZmluZSBVV0lSRV9SRUFEX0ZBTExJTkdfRURHRQkJMHgwMDAxCisjZGVmaW5lIFVXSVJFX1JFQURfUklTSU5HX0VER0UJCTB4MDAwMAorI2RlZmluZSBVV0lSRV9XUklURV9GQUxMSU5HX0VER0UJMHgwMDAwCisjZGVmaW5lIFVXSVJFX1dSSVRFX1JJU0lOR19FREdFCQkweDAwMDIKKyNkZWZpbmUgVVdJUkVfQ1NfQUNUSVZFX0xPVwkJMHgwMDAwCisjZGVmaW5lIFVXSVJFX0NTX0FDVElWRV9ISUdICQkweDAwMDQKKyNkZWZpbmUgVVdJUkVfRlJFUV9ESVZfMgkJMHgwMDAwCisjZGVmaW5lIFVXSVJFX0ZSRVFfRElWXzQJCTB4MDAwOAorI2RlZmluZSBVV0lSRV9GUkVRX0RJVl84CQkweDAwMTAKKyNkZWZpbmUgVVdJUkVfQ0hLX1JFQURZCQkJMHgwMDIwCisjZGVmaW5lIFVXSVJFX0NMS19JTlZFUlRFRAkJMHgwMDQwCisKKworc3RydWN0IHV3aXJlX3NwaSB7CisJc3RydWN0IHNwaV9iaXRiYW5nCWJpdGJhbmc7CisJc3RydWN0IGNsawkJKmNrOworfTsKKworc3RydWN0IHV3aXJlX3N0YXRlIHsKKwl1bnNpZ25lZAliaXRzX3Blcl93b3JkOworCXVuc2lnbmVkCWRpdjFfaWR4OworfTsKKworLyogUkVWSVNJVCBjb21waWxlIHRpbWUgY29uc3RhbnQgZm9yIGlkeF9zaGlmdD8gKi8KKy8qCisgKiBPciwgcHV0IGl0IGluIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgZHJpdmVyOworICogdGhhdCBhdm9pZHMgaGF2aW5nIHRvIGlzc3VlIHR3byBsb2FkcyBmb3IgZWFjaCBiaXQgb2Ygc3RhdGljIGRhdGEuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXdpcmVfaWR4X3NoaWZ0Oworc3RhdGljIHZvaWQgX19pb21lbSAqdXdpcmVfYmFzZTsKKworc3RhdGljIGlubGluZSB2b2lkIHV3aXJlX3dyaXRlX3JlZyhpbnQgaWR4LCB1MTYgdmFsKQoreworCV9fcmF3X3dyaXRldyh2YWwsIHV3aXJlX2Jhc2UgKyAoaWR4IDw8IHV3aXJlX2lkeF9zaGlmdCkpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiB1d2lyZV9yZWFkX3JlZyhpbnQgaWR4KQoreworCXJldHVybiBfX3Jhd19yZWFkdyh1d2lyZV9iYXNlICsgKGlkeCA8PCB1d2lyZV9pZHhfc2hpZnQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9tYXBfdXdpcmVfY29uZmlndXJlX21vZGUodTggY3MsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJdTE2CXcsIHZhbCA9IDA7CisJaW50CXNoaWZ0LCByZWc7CisKKwlpZiAoZmxhZ3MgJiBVV0lSRV9DTEtfSU5WRVJURUQpCisJCXZhbCBePSAweDAzOworCXZhbCA9IGZsYWdzICYgMHgzZjsKKwlpZiAoY3MgJiAxKQorCQlzaGlmdCA9IDY7CisJZWxzZQorCQlzaGlmdCA9IDA7CisJaWYgKGNzIDw9IDEpCisJCXJlZyA9IFVXSVJFX1NSMTsKKwllbHNlCisJCXJlZyA9IFVXSVJFX1NSMjsKKworCXcgPSB1d2lyZV9yZWFkX3JlZyhyZWcpOworCXcgJj0gfigweDNmIDw8IHNoaWZ0KTsKKwl3IHw9IHZhbCA8PCBzaGlmdDsKKwl1d2lyZV93cml0ZV9yZWcocmVnLCB3KTsKK30KKworc3RhdGljIGludCB3YWl0X3V3aXJlX2Nzcl9mbGFnKHUxNiBtYXNrLCB1MTYgdmFsLCBpbnQgbWlnaHRfbm90X2NhdGNoKQoreworCXUxNiB3OworCWludCBjID0gMDsKKwl1bnNpZ25lZCBsb25nIG1heF9qaWZmaWVzID0gamlmZmllcyArIEhaOworCisJZm9yICg7OykgeworCQl3ID0gdXdpcmVfcmVhZF9yZWcoVVdJUkVfQ1NSKTsKKwkJaWYgKCh3ICYgbWFzaykgPT0gdmFsKQorCQkJYnJlYWs7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG1heF9qaWZmaWVzKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dC4gcmVnPSUjMDZ4ICIKKwkJCQkJIm1hc2s9JSMwNnggdmFsPSUjMDZ4XG4iLAorCQkJICAgICAgIF9fZnVuY19fLCB3LCBtYXNrLCB2YWwpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWMrKzsKKwkJaWYgKG1pZ2h0X25vdF9jYXRjaCAmJiBjID4gNjQpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHV3aXJlX3NldF9jbGsxX2RpdihpbnQgZGl2MV9pZHgpCit7CisJdTE2IHc7CisKKwl3ID0gdXdpcmVfcmVhZF9yZWcoVVdJUkVfU1IzKTsKKwl3ICY9IH4oMHgwMyA8PCAxKTsKKwl3IHw9IGRpdjFfaWR4IDw8IDE7CisJdXdpcmVfd3JpdGVfcmVnKFVXSVJFX1NSMywgdyk7Cit9CisKK3N0YXRpYyB2b2lkIHV3aXJlX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQoreworCXN0cnVjdAl1d2lyZV9zdGF0ZSAqdXN0ID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXUxNgl3OworCWludAlvbGRfY3M7CisKKworCUJVR19PTih3YWl0X3V3aXJlX2Nzcl9mbGFnKENTUkIsIDAsIDApKTsKKworCXcgPSB1d2lyZV9yZWFkX3JlZyhVV0lSRV9DU1IpOworCW9sZF9jcyA9ICh3ID4+IDEwKSAmIDB4MDM7CisJaWYgKHZhbHVlID09IEJJVEJBTkdfQ1NfSU5BQ1RJVkUgfHwgb2xkX2NzICE9IHNwaS0+Y2hpcF9zZWxlY3QpIHsKKwkJLyogRGVzZWxlY3QgdGhpcyBDUywgb3IgdGhlIHByZXZpb3VzIENTICovCisJCXcgJj0gfkNTX0NNRDsKKwkJdXdpcmVfd3JpdGVfcmVnKFVXSVJFX0NTUiwgdyk7CisJfQorCS8qIGFjdGl2YXRlIHNwZWNmaWVkIGNoaXBzZWxlY3QgKi8KKwlpZiAodmFsdWUgPT0gQklUQkFOR19DU19BQ1RJVkUpIHsKKwkJdXdpcmVfc2V0X2NsazFfZGl2KHVzdC0+ZGl2MV9pZHgpOworCQkvKiBpbnZlcnQgY2xvY2s/ICovCisJCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJCXV3aXJlX3dyaXRlX3JlZyhVV0lSRV9TUjQsIDEpOworCQllbHNlCisJCQl1d2lyZV93cml0ZV9yZWcoVVdJUkVfU1I0LCAwKTsKKworCQl3ID0gc3BpLT5jaGlwX3NlbGVjdCA8PCAxMDsKKwkJdyB8PSBDU19DTUQ7CisJCXV3aXJlX3dyaXRlX3JlZyhVV0lSRV9DU1IsIHcpOworCX0KK30KKworc3RhdGljIGludCB1d2lyZV90eHJ4KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IHV3aXJlX3N0YXRlICp1c3QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJdW5zaWduZWQJbGVuID0gdC0+bGVuOworCXVuc2lnbmVkCWJpdHMgPSB1c3QtPmJpdHNfcGVyX3dvcmQ7CisJdW5zaWduZWQJYnl0ZXM7CisJdTE2CQl2YWwsIHc7CisJaW50CQlzdGF0dXMgPSAwOworCisJaWYgKCF0LT50eF9idWYgJiYgIXQtPnJ4X2J1ZikKKwkJcmV0dXJuIDA7CisKKwkvKiBNaWNyb3dpcmUgZG9lc24ndCByZWFkIGFuZCB3cml0ZSBjb25jdXJyZW50bHkgKi8KKwlpZiAodC0+dHhfYnVmICYmIHQtPnJ4X2J1ZikKKwkJcmV0dXJuIC1FUEVSTTsKKworCXcgPSBzcGktPmNoaXBfc2VsZWN0IDw8IDEwOworCXcgfD0gQ1NfQ01EOworCisJaWYgKHQtPnR4X2J1ZikgeworCQljb25zdCB1OAkqYnVmID0gdC0+dHhfYnVmOworCisJCS8qIE5PVEU6ICBETUEgY291bGQgYmUgdXNlZCBmb3IgVFggdHJhbnNmZXJzICovCisKKwkJLyogd3JpdGUgb25lIG9yIHR3byBieXRlcyBhdCBhIHRpbWUgKi8KKwkJd2hpbGUgKGxlbiA+PSAxKSB7CisJCQkvKiB0eCBiaXQgMTUgaXMgZmlyc3Qgc2VudDsgd2UgYnl0ZXN3YXAgbXVsdGlieXRlIHdvcmRzCisJCQkgKiAobXNiLWZpcnN0KSBvbiB0aGUgd2F5IG91dCBmcm9tIG1lbW9yeS4KKwkJCSAqLworCQkJdmFsID0gKmJ1ZisrOworCQkJaWYgKGJpdHMgPiA4KSB7CisJCQkJYnl0ZXMgPSAyOworCQkJCXZhbCB8PSAqYnVmKysgPDwgODsKKwkJCX0gZWxzZQorCQkJCWJ5dGVzID0gMTsKKwkJCXZhbCA8PD0gMTYgLSBiaXRzOworCisjaWZkZWYJVkVSQk9TRQorCQkJcHJfZGVidWcoIiVzOiB3cml0ZS0lZCA9JTA0eFxuIiwKKwkJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgYml0cywgdmFsKTsKKyNlbmRpZgorCQkJaWYgKHdhaXRfdXdpcmVfY3NyX2ZsYWcoQ1NSQiwgMCwgMCkpCisJCQkJZ290byBlaW87CisKKwkJCXV3aXJlX3dyaXRlX3JlZyhVV0lSRV9URFIsIHZhbCk7CisKKwkJCS8qIHN0YXJ0IHdyaXRlICovCisJCQl2YWwgPSBTVEFSVCB8IHcgfCAoYml0cyA8PCA1KTsKKworCQkJdXdpcmVfd3JpdGVfcmVnKFVXSVJFX0NTUiwgdmFsKTsKKwkJCWxlbiAtPSBieXRlczsKKworCQkJLyogV2FpdCB0aWxsIHdyaXRlIGFjdHVhbGx5IHN0YXJ0cy4KKwkJCSAqIFRoaXMgaXMgbmVlZGVkIHdpdGggTVBVIGNsb2NrIDYwKyBNSHouCisJCQkgKiBSRVZJU0lUOiB3ZSBtYXkgbm90IGhhdmUgdGltZSB0byBjYXRjaCBpdC4uLgorCQkJICovCisJCQlpZiAod2FpdF91d2lyZV9jc3JfZmxhZyhDU1JCLCBDU1JCLCAxKSkKKwkJCQlnb3RvIGVpbzsKKworCQkJc3RhdHVzICs9IGJ5dGVzOworCQl9CisKKwkJLyogUkVWSVNJVDogIHNhdmUgdGhpcyBmb3IgbGF0ZXIgdG8gZ2V0IG1vcmUgaS9vIG92ZXJsYXAgKi8KKwkJaWYgKHdhaXRfdXdpcmVfY3NyX2ZsYWcoQ1NSQiwgMCwgMCkpCisJCQlnb3RvIGVpbzsKKworCX0gZWxzZSBpZiAodC0+cnhfYnVmKSB7CisJCXU4CQkqYnVmID0gdC0+cnhfYnVmOworCisJCS8qIHJlYWQgb25lIG9yIHR3byBieXRlcyBhdCBhIHRpbWUgKi8KKwkJd2hpbGUgKGxlbikgeworCQkJaWYgKGJpdHMgPiA4KSB7CisJCQkJYnl0ZXMgPSAyOworCQkJfSBlbHNlCisJCQkJYnl0ZXMgPSAxOworCisJCQkvKiBzdGFydCByZWFkICovCisJCQl2YWwgPSBTVEFSVCB8IHcgfCAoYml0cyA8PCAwKTsKKwkJCXV3aXJlX3dyaXRlX3JlZyhVV0lSRV9DU1IsIHZhbCk7CisJCQlsZW4gLT0gYnl0ZXM7CisKKwkJCS8qIFdhaXQgdGlsbCByZWFkIGFjdHVhbGx5IHN0YXJ0cyAqLworCQkJKHZvaWQpIHdhaXRfdXdpcmVfY3NyX2ZsYWcoQ1NSQiwgQ1NSQiwgMSk7CisKKwkJCWlmICh3YWl0X3V3aXJlX2Nzcl9mbGFnKFJEUkIgfCBDU1JCLAorCQkJCQkJUkRSQiwgMCkpCisJCQkJZ290byBlaW87CisKKwkJCS8qIHJ4IGJpdCAwIGlzIGxhc3QgcmVjZWl2ZWQ7IG11bHRpYnl0ZSB3b3JkcyB3aWxsCisJCQkgKiBiZSBwcm9wZXJseSBieXRlc3dhcHBlZCBvbiB0aGUgd2F5IHRvIG1lbW9yeS4KKwkJCSAqLworCQkJdmFsID0gdXdpcmVfcmVhZF9yZWcoVVdJUkVfUkRSKTsKKwkJCXZhbCAmPSAoMSA8PCBiaXRzKSAtIDE7CisJCQkqYnVmKysgPSAodTgpIHZhbDsKKwkJCWlmIChieXRlcyA9PSAyKQorCQkJCSpidWYrKyA9IHZhbCA+PiA4OworCQkJc3RhdHVzICs9IGJ5dGVzOworI2lmZGVmCVZFUkJPU0UKKwkJCXByX2RlYnVnKCIlczogcmVhZC0lZCA9JTA0eFxuIiwKKwkJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgYml0cywgdmFsKTsKKyNlbmRpZgorCisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK2VpbzoKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCB1d2lyZV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCB1d2lyZV9zdGF0ZQkqdXN0ID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXN0cnVjdCB1d2lyZV9zcGkJKnV3aXJlOworCXVuc2lnbmVkCQlmbGFncyA9IDA7CisJdW5zaWduZWQJCWJpdHM7CisJdW5zaWduZWQJCWh6OworCXVuc2lnbmVkIGxvbmcJCXJhdGU7CisJaW50CQkJZGl2MV9pZHg7CisJaW50CQkJZGl2MTsKKwlpbnQJCQlkaXYyOworCWludAkJCXN0YXR1czsKKworCXV3aXJlID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlpZiAoc3BpLT5jaGlwX3NlbGVjdCA+IDMpIHsKKwkJcHJfZGVidWcoIiVzOiBjcyVkP1xuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSwgc3BpLT5jaGlwX3NlbGVjdCk7CisJCXN0YXR1cyA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisKKwliaXRzID0gc3BpLT5iaXRzX3Blcl93b3JkOworCWlmICh0ICE9IE5VTEwgJiYgdC0+Yml0c19wZXJfd29yZCkKKwkJYml0cyA9IHQtPmJpdHNfcGVyX3dvcmQ7CisKKwlpZiAoYml0cyA+IDE2KSB7CisJCXByX2RlYnVnKCIlczogd29yZHNpemUgJWQ/XG4iLCBkZXZfbmFtZSgmc3BpLT5kZXYpLCBiaXRzKTsKKwkJc3RhdHVzID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKwl1c3QtPmJpdHNfcGVyX3dvcmQgPSBiaXRzOworCisJLyogbW9kZSAwLi4zLCBjbG9jayBpbnZlcnRlZCBzZXBhcmF0ZWx5OworCSAqIHN0YW5kYXJkIG5DUyBzaWduYWxpbmc7CisJICogZG9uJ3QgdHJlYXQgREk9aGlnaCBhcyAibm90IHJlYWR5IgorCSAqLworCWlmIChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkKKwkJZmxhZ3MgfD0gVVdJUkVfQ1NfQUNUSVZFX0hJR0g7CisKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCWZsYWdzIHw9IFVXSVJFX0NMS19JTlZFUlRFRDsKKworCXN3aXRjaCAoc3BpLT5tb2RlICYgKFNQSV9DUE9MIHwgU1BJX0NQSEEpKSB7CisJY2FzZSBTUElfTU9ERV8wOgorCWNhc2UgU1BJX01PREVfMzoKKwkJZmxhZ3MgfD0gVVdJUkVfV1JJVEVfRkFMTElOR19FREdFIHwgVVdJUkVfUkVBRF9SSVNJTkdfRURHRTsKKwkJYnJlYWs7CisJY2FzZSBTUElfTU9ERV8xOgorCWNhc2UgU1BJX01PREVfMjoKKwkJZmxhZ3MgfD0gVVdJUkVfV1JJVEVfUklTSU5HX0VER0UgfCBVV0lSRV9SRUFEX0ZBTExJTkdfRURHRTsKKwkJYnJlYWs7CisJfQorCisJLyogYXNzdW1lIGl0J3MgYWxyZWFkeSBlbmFibGVkICovCisJcmF0ZSA9IGNsa19nZXRfcmF0ZSh1d2lyZS0+Y2spOworCisJaHogPSBzcGktPm1heF9zcGVlZF9oejsKKwlpZiAodCAhPSBOVUxMICYmIHQtPnNwZWVkX2h6KQorCQloeiA9IHQtPnNwZWVkX2h6OworCisJaWYgKCFoeikgeworCQlwcl9kZWJ1ZygiJXM6IHplcm8gc3BlZWQ/XG4iLCBkZXZfbmFtZSgmc3BpLT5kZXYpKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCS8qIEZfSU5UID0gbXB1X3hvcl9jbGsgLyBESVYxICovCisJZm9yIChkaXYxX2lkeCA9IDA7IGRpdjFfaWR4IDwgNDsgZGl2MV9pZHgrKykgeworCQlzd2l0Y2ggKGRpdjFfaWR4KSB7CisJCWNhc2UgMDoKKwkJCWRpdjEgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWRpdjEgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWRpdjEgPSA3OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgMzoKKwkJCWRpdjEgPSAxMDsKKwkJCWJyZWFrOworCQl9CisJCWRpdjIgPSAocmF0ZSAvIGRpdjEgKyBoeiAtIDEpIC8gaHo7CisJCWlmIChkaXYyIDw9IDgpCisJCQlicmVhazsKKwl9CisJaWYgKGRpdjFfaWR4ID09IDQpIHsKKwkJcHJfZGVidWcoIiVzOiBsb3dlc3QgY2xvY2sgJWxkLCBuZWVkICVkXG4iLAorCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgcmF0ZSAvIDEwIC8gOCwgaHopOworCQlzdGF0dXMgPSAtRURPTTsKKwkJZ290byBkb25lOworCX0KKworCS8qIHdlIGhhdmUgdG8gY2FjaGUgdGhpcyBhbmQgcmVzZXQgaW4gdXdpcmVfY2hpcHNlbGVjdCBhcyB0aGlzIGlzIGEKKwkgKiBnbG9iYWwgcGFyYW1ldGVyIGFuZCBhbm90aGVyIHV3aXJlIGRldmljZSBjYW4gY2hhbmdlIGl0IHVuZGVyCisJICogdXMgKi8KKwl1c3QtPmRpdjFfaWR4ID0gZGl2MV9pZHg7CisJdXdpcmVfc2V0X2NsazFfZGl2KGRpdjFfaWR4KTsKKworCXJhdGUgLz0gZGl2MTsKKworCXN3aXRjaCAoZGl2MikgeworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCQlmbGFncyB8PSBVV0lSRV9GUkVRX0RJVl8yOworCQlyYXRlIC89IDI7CisJCWJyZWFrOworCWNhc2UgMzoKKwljYXNlIDQ6CisJCWZsYWdzIHw9IFVXSVJFX0ZSRVFfRElWXzQ7CisJCXJhdGUgLz0gNDsKKwkJYnJlYWs7CisJY2FzZSA1OgorCWNhc2UgNjoKKwljYXNlIDc6CisJY2FzZSA4OgorCQlmbGFncyB8PSBVV0lSRV9GUkVRX0RJVl84OworCQlyYXRlIC89IDg7CisJCWJyZWFrOworCX0KKwlvbWFwX3V3aXJlX2NvbmZpZ3VyZV9tb2RlKHNwaS0+Y2hpcF9zZWxlY3QsIGZsYWdzKTsKKwlwcl9kZWJ1ZygiJXM6IHV3aXJlIGZsYWdzICUwMngsIGFybXhvciAlbHUgS0h6LCBTQ0sgJWx1IEtIelxuIiwKKwkJCV9fZnVuY19fLCBmbGFncywKKwkJCWNsa19nZXRfcmF0ZSh1d2lyZS0+Y2spIC8gMTAwMCwKKwkJCXJhdGUgLyAxMDAwKTsKKwlzdGF0dXMgPSAwOworZG9uZToKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHV3aXJlX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHV3aXJlX3N0YXRlICp1c3QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwlpZiAodXN0ID09IE5VTEwpIHsKKwkJdXN0ID0ga3phbGxvYyhzaXplb2YoKnVzdCksIEdGUF9LRVJORUwpOworCQlpZiAodXN0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gdXN0OworCX0KKworCXJldHVybiB1d2lyZV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCB1d2lyZV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJa2ZyZWUoc3BpLT5jb250cm9sbGVyX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQgdXdpcmVfb2ZmKHN0cnVjdCB1d2lyZV9zcGkgKnV3aXJlKQoreworCXV3aXJlX3dyaXRlX3JlZyhVV0lSRV9TUjMsIDApOworCWNsa19kaXNhYmxlKHV3aXJlLT5jayk7CisJY2xrX3B1dCh1d2lyZS0+Y2spOworCXNwaV9tYXN0ZXJfcHV0KHV3aXJlLT5iaXRiYW5nLm1hc3Rlcik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHV3aXJlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlzdHJ1Y3QgdXdpcmVfc3BpCSp1d2lyZTsKKwlpbnQJCQlzdGF0dXM7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZiAqdXdpcmUpOworCWlmICghbWFzdGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXV3aXJlID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJdXdpcmVfYmFzZSA9IGlvcmVtYXAoVVdJUkVfQkFTRV9QSFlTLCBVV0lSRV9JT19TSVpFKTsKKwlpZiAoIXV3aXJlX2Jhc2UpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgaW9yZW1hcCBVV0lSRVxuIik7CisJCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCB1d2lyZSk7CisKKwl1d2lyZS0+Y2sgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJmY2siKTsKKwlpZiAoSVNfRVJSKHV3aXJlLT5jaykpIHsKKwkJc3RhdHVzID0gUFRSX0VSUih1d2lyZS0+Y2spOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJubyBmdW5jdGlvbmFsIGNsb2NrP1xuIik7CisJCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWNsa19lbmFibGUodXdpcmUtPmNrKTsKKworCWlmIChjcHVfaXNfb21hcDd4eCgpKQorCQl1d2lyZV9pZHhfc2hpZnQgPSAxOworCWVsc2UKKwkJdXdpcmVfaWR4X3NoaWZ0ID0gMjsKKworCXV3aXJlX3dyaXRlX3JlZyhVV0lSRV9TUjMsIDEpOworCisJLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7CisKKwltYXN0ZXItPmZsYWdzID0gU1BJX01BU1RFUl9IQUxGX0RVUExFWDsKKworCW1hc3Rlci0+YnVzX251bSA9IDI7CS8qICJvZmZpY2lhbCIgKi8KKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gNDsKKwltYXN0ZXItPnNldHVwID0gdXdpcmVfc2V0dXA7CisJbWFzdGVyLT5jbGVhbnVwID0gdXdpcmVfY2xlYW51cDsKKworCXV3aXJlLT5iaXRiYW5nLm1hc3RlciA9IG1hc3RlcjsKKwl1d2lyZS0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gdXdpcmVfY2hpcHNlbGVjdDsKKwl1d2lyZS0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IHV3aXJlX3NldHVwX3RyYW5zZmVyOworCXV3aXJlLT5iaXRiYW5nLnR4cnhfYnVmcyA9IHV3aXJlX3R4cng7CisKKwlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdGFydCgmdXdpcmUtPmJpdGJhbmcpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXV3aXJlX29mZih1d2lyZSk7CisJCWlvdW5tYXAodXdpcmVfYmFzZSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHV3aXJlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB1d2lyZV9zcGkJKnV3aXJlID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCWludAkJCXN0YXR1czsKKworCS8vIEZJWE1FIHJlbW92ZSBhbGwgY2hpbGQgZGV2aWNlcywgc29tZXdoZXJlIC4uLgorCisJc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RvcCgmdXdpcmUtPmJpdGJhbmcpOworCXV3aXJlX29mZih1d2lyZSk7CisJaW91bm1hcCh1d2lyZV9iYXNlKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KK01PRFVMRV9BTElBUygicGxhdGZvcm06b21hcF91d2lyZSIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1d2lyZV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gIm9tYXBfdXdpcmUiLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHV3aXJlX3JlbW92ZSksCisJLy8gc3VzcGVuZCAuLi4gdW51c2UgY2sKKwkvLyByZXN1bWUgLi4uIHVzZSBjaworfTsKKworc3RhdGljIGludCBfX2luaXQgb21hcF91d2lyZV9pbml0KHZvaWQpCit7CisJLyogRklYTUUgbW92ZSB0aGVzZSBpbnRvIHRoZSByZWxldmFudCBib2FyZCBpbml0IGNvZGUuIGFsc28sIGluY2x1ZGUKKwkgKiBIMyBzdXBwb3J0OyBpdCB1c2VzIHRzYzIxMDEgbGlrZSBIMiAob24gYSBkaWZmZXJlbnQgY2hpcHNlbGVjdCkuCisJICovCisKKwlpZiAobWFjaGluZV9pc19vbWFwX2gyKCkpIHsKKwkJLyogZGVmYXVsdHM6IFcyMSBTRE8sIFUxOCBTREksIFYxOSBTQ0wgKi8KKwkJb21hcF9jZmdfcmVnKE4xNF8xNjEwX1VXSVJFX0NTMCk7CisJCW9tYXBfY2ZnX3JlZyhOMTVfMTYxMF9VV0lSRV9DUzEpOworCX0KKwlpZiAobWFjaGluZV9pc19vbWFwX3BlcnNldXMyKCkpIHsKKwkJLyogY29uZmlndXJlIHBpbnM6IE1QVV9VV19uU0NTMSwgTVBVX1VXX1NETywgTVBVX1VXX1NDTEsgKi8KKwkJaW50IHZhbCA9IG9tYXBfcmVhZGwoT01BUDdYWF9JT19DT05GXzkpICYgfjB4MDBFRUUwMDA7CisJCW9tYXBfd3JpdGVsKHZhbCB8IDB4MDBBQUEwMDAsIE9NQVA3WFhfSU9fQ09ORl85KTsKKwl9CisKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZ1d2lyZV9kcml2ZXIsIHV3aXJlX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9tYXBfdXdpcmVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ1d2lyZV9kcml2ZXIpOworfQorCitzdWJzeXNfaW5pdGNhbGwob21hcF91d2lyZV9pbml0KTsKK21vZHVsZV9leGl0KG9tYXBfdXdpcmVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW9tYXAyLW1jc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktb21hcDItbWNzcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGUzYTJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9tYXAyLW1jc3BpLmMKQEAgLTAsMCArMSwxMjkzIEBACisvKgorICogT01BUDIgTWNTUEkgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjoJU2FtdWVsIE9ydGl6IDxzYW11ZWwub3J0aXpAbm9raWEuY29tPiBhbmQKKyAqCQlKdWhhIFlyau+/vWzvv70gPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgPHBsYXQvZG1hLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvbWNzcGkuaD4KKworI2RlZmluZSBPTUFQMl9NQ1NQSV9NQVhfRlJFUQkJNDgwMDAwMDAKKworLyogT01BUDIgaGFzIDMgU1BJIGNvbnRyb2xsZXJzLCB3aGlsZSBPTUFQMyBoYXMgNCAqLworI2RlZmluZSBPTUFQMl9NQ1NQSV9NQVhfQ1RSTCAJCTQKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9SRVZJU0lPTgkJMHgwMAorI2RlZmluZSBPTUFQMl9NQ1NQSV9TWVNTVEFUVVMJCTB4MTQKKyNkZWZpbmUgT01BUDJfTUNTUElfSVJRU1RBVFVTCQkweDE4CisjZGVmaW5lIE9NQVAyX01DU1BJX0lSUUVOQUJMRQkJMHgxYworI2RlZmluZSBPTUFQMl9NQ1NQSV9XQUtFVVBFTkFCTEUJMHgyMAorI2RlZmluZSBPTUFQMl9NQ1NQSV9TWVNUCQkweDI0CisjZGVmaW5lIE9NQVAyX01DU1BJX01PRFVMQ1RSTAkJMHgyOAorCisvKiBwZXItY2hhbm5lbCBiYW5rcywgMHgxNCBieXRlcyBlYWNoLCBmaXJzdCBpczogKi8KKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GMAkJMHgyYworI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVQwCQkweDMwCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ1RSTDAJCTB4MzQKKyNkZWZpbmUgT01BUDJfTUNTUElfVFgwCQkJMHgzOAorI2RlZmluZSBPTUFQMl9NQ1NQSV9SWDAJCQkweDNjCisKKy8qIHBlci1yZWdpc3RlciBiaXRtYXNrczogKi8KKworI2RlZmluZSBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfU0lOR0xFCUJJVCgwKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfTVMJQklUKDIpCisjZGVmaW5lIE9NQVAyX01DU1BJX01PRFVMQ1RSTF9TVEVTVAlCSVQoMykKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfUEhBCQlCSVQoMCkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1BPTAkJQklUKDEpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9DTEtEX01BU0sJKDB4MGYgPDwgMikKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0VQT0wJCUJJVCg2KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfV0xfTUFTSwkoMHgxZiA8PCA3KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX1JYX09OTFkJQklUKDEyKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX1RYX09OTFkJQklUKDEzKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX01BU0sJKDB4MDMgPDwgMTIpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9ETUFXCQlCSVQoMTQpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9ETUFSCQlCSVQoMTUpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9EUEUwCQlCSVQoMTYpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9EUEUxCQlCSVQoMTcpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9JUwkJQklUKDE4KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfVFVSQk8JQklUKDE5KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRk9SQ0UJQklUKDIwKQorCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIU1RBVF9SWFMJCUJJVCgwKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVRfVFhTCQlCSVQoMSkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hTVEFUX0VPVAkJQklUKDIpCisKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDVFJMX0VOCQlCSVQoMCkKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9XQUtFVVBFTkFCTEVfV0tFTglCSVQoMCkKKworLyogV2UgaGF2ZSAyIERNQSBjaGFubmVscyBwZXIgQ1MsIG9uZSBmb3IgUlggYW5kIG9uZSBmb3IgVFggKi8KK3N0cnVjdCBvbWFwMl9tY3NwaV9kbWEgeworCWludCBkbWFfdHhfY2hhbm5lbDsKKwlpbnQgZG1hX3J4X2NoYW5uZWw7CisKKwlpbnQgZG1hX3R4X3N5bmNfZGV2OworCWludCBkbWFfcnhfc3luY19kZXY7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiBkbWFfdHhfY29tcGxldGlvbjsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkbWFfcnhfY29tcGxldGlvbjsKK307CisKKy8qIHVzZSBQSU8gZm9yIHNtYWxsIHRyYW5zZmVycywgYXZvaWRpbmcgRE1BIHNldHVwL3RlYXJkb3duIG92ZXJoZWFkIGFuZAorICogY2FjaGUgb3BlcmF0aW9uczsgYmV0dGVyIGhldXJpc3RpY3MgY29uc2lkZXIgd29yZHNpemUgYW5kIGJpdHJhdGUuCisgKi8KKyNkZWZpbmUgRE1BX01JTl9CWVRFUwkJCTE2MAorCisKK3N0cnVjdCBvbWFwMl9tY3NwaSB7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJLyogbG9jayBwcm90ZWN0cyBxdWV1ZSBhbmQgcmVnaXN0ZXJzICovCisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW1zZ19xdWV1ZTsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCS8qIFZpcnR1YWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVyICovCisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwl1bnNpZ25lZCBsb25nCQlwaHlzOworCS8qIFNQSTEgaGFzIDQgY2hhbm5lbHMsIHdoaWxlIFNQSTIgaGFzIDIgKi8KKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSpkbWFfY2hhbm5lbHM7CisJc3RydWN0ICBkZXZpY2UJCSpkZXY7Cit9OworCitzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MgeworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJdW5zaWduZWQgbG9uZwkJcGh5czsKKwlpbnQJCQl3b3JkX2xlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisJLyogQ29udGV4dCBzYXZlIGFuZCByZXN0b3JlIHNoYWRvdyByZWdpc3RlciAqLworCXUzMgkJCWNoY29uZjA7Cit9OworCisvKiB1c2VkIGZvciBjb250ZXh0IHNhdmUgYW5kIHJlc3RvcmUsIHN0cnVjdHVyZSBtZW1iZXJzIHRvIGJlIHVwZGF0ZWQgd2hlbmV2ZXIKKyAqIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXJzIGFyZSBtb2RpZmllZC4KKyAqLworc3RydWN0IG9tYXAyX21jc3BpX3JlZ3MgeworCXUzMiBtb2R1bGN0cmw7CisJdTMyIHdha2V1cGVuYWJsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNzOworfTsKKworc3RhdGljIHN0cnVjdCBvbWFwMl9tY3NwaV9yZWdzIG9tYXAyX21jc3BpX2N0eFtPTUFQMl9NQ1NQSV9NQVhfQ1RSTF07CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqb21hcDJfbWNzcGlfd3E7CisKKyNkZWZpbmUgTU9EX1JFR19CSVQodmFsLCBtYXNrLCBzZXQpIGRvIHsgXAorCWlmIChzZXQpIFwKKwkJdmFsIHw9IG1hc2s7IFwKKwllbHNlIFwKKwkJdmFsICY9IH5tYXNrOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWNzcGlfd3JpdGVfcmVnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCWludCBpZHgsIHUzMiB2YWwpCit7CisJc3RydWN0IG9tYXAyX21jc3BpICptY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCV9fcmF3X3dyaXRlbCh2YWwsIG1jc3BpLT5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbWNzcGlfcmVhZF9yZWcoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkgKm1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJcmV0dXJuIF9fcmF3X3JlYWRsKG1jc3BpLT5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1jc3BpX3dyaXRlX2NzX3JlZyhjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlpbnQgaWR4LCB1MzIgdmFsKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwlfX3Jhd193cml0ZWwodmFsLCBjcy0+YmFzZSArICBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtY3NwaV9yZWFkX2NzX3JlZyhjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaWR4KQoreworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwlyZXR1cm4gX19yYXdfcmVhZGwoY3MtPmJhc2UgKyBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtY3NwaV9jYWNoZWRfY2hjb25mMChjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwlyZXR1cm4gY3MtPmNoY29uZjA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY3NwaV93cml0ZV9jaGNvbmYwKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHUzMiB2YWwpCit7CisJc3RydWN0IG9tYXAyX21jc3BpX2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKworCWNzLT5jaGNvbmYwID0gdmFsOworCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjAsIHZhbCk7CisJbWNzcGlfcmVhZF9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwKTsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJaW50IGlzX3JlYWQsIGludCBlbmFibGUpCit7CisJdTMyIGwsIHJ3OworCisJbCA9IG1jc3BpX2NhY2hlZF9jaGNvbmYwKHNwaSk7CisKKwlpZiAoaXNfcmVhZCkgLyogMSBpcyByZWFkLCAwIHdyaXRlICovCisJCXJ3ID0gT01BUDJfTUNTUElfQ0hDT05GX0RNQVI7CisJZWxzZQorCQlydyA9IE9NQVAyX01DU1BJX0NIQ09ORl9ETUFXOworCisJTU9EX1JFR19CSVQobCwgcncsIGVuYWJsZSk7CisJbWNzcGlfd3JpdGVfY2hjb25mMChzcGksIGwpOworfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBlbmFibGUpCit7CisJdTMyIGw7CisKKwlsID0gZW5hYmxlID8gT01BUDJfTUNTUElfQ0hDVFJMX0VOIDogMDsKKwltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENUUkwwLCBsKTsKKwkvKiBGbGFzaCBwb3N0LXdyaXRlcyAqLworCW1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDVFJMMCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX2ZvcmNlX2NzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBjc19hY3RpdmUpCit7CisJdTMyIGw7CisKKwlsID0gbWNzcGlfY2FjaGVkX2NoY29uZjAoc3BpKTsKKwlNT0RfUkVHX0JJVChsLCBPTUFQMl9NQ1NQSV9DSENPTkZfRk9SQ0UsIGNzX2FjdGl2ZSk7CisJbWNzcGlfd3JpdGVfY2hjb25mMChzcGksIGwpOworfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9zZXRfbWFzdGVyX21vZGUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwl1MzIgbDsKKworCS8qIHNldHVwIHdoZW4gc3dpdGNoaW5nIGZyb20gKHJlc2V0IGRlZmF1bHQpIHNsYXZlIG1vZGUKKwkgKiB0byBzaW5nbGUtY2hhbm5lbCBtYXN0ZXIgbW9kZQorCSAqLworCWwgPSBtY3NwaV9yZWFkX3JlZyhtYXN0ZXIsIE9NQVAyX01DU1BJX01PRFVMQ1RSTCk7CisJTU9EX1JFR19CSVQobCwgT01BUDJfTUNTUElfTU9EVUxDVFJMX1NURVNULCAwKTsKKwlNT0RfUkVHX0JJVChsLCBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfTVMsIDApOworCU1PRF9SRUdfQklUKGwsIE9NQVAyX01DU1BJX01PRFVMQ1RSTF9TSU5HTEUsIDEpOworCW1jc3BpX3dyaXRlX3JlZyhtYXN0ZXIsIE9NQVAyX01DU1BJX01PRFVMQ1RSTCwgbCk7CisKKwlvbWFwMl9tY3NwaV9jdHhbbWFzdGVyLT5idXNfbnVtIC0gMV0ubW9kdWxjdHJsID0gbDsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfcmVzdG9yZV9jdHgoc3RydWN0IG9tYXAyX21jc3BpICptY3NwaSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqc3BpX2NudHJsOworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcyAqY3M7CisJc3BpX2NudHJsID0gbWNzcGktPm1hc3RlcjsKKworCS8qIE1jU1BJOiBjb250ZXh0IHJlc3RvcmUgKi8KKwltY3NwaV93cml0ZV9yZWcoc3BpX2NudHJsLCBPTUFQMl9NQ1NQSV9NT0RVTENUUkwsCisJCQlvbWFwMl9tY3NwaV9jdHhbc3BpX2NudHJsLT5idXNfbnVtIC0gMV0ubW9kdWxjdHJsKTsKKworCW1jc3BpX3dyaXRlX3JlZyhzcGlfY250cmwsIE9NQVAyX01DU1BJX1dBS0VVUEVOQUJMRSwKKwkJCW9tYXAyX21jc3BpX2N0eFtzcGlfY250cmwtPmJ1c19udW0gLSAxXS53YWtldXBlbmFibGUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcywgJm9tYXAyX21jc3BpX2N0eFtzcGlfY250cmwtPmJ1c19udW0gLSAxXS5jcywKKwkJCW5vZGUpCisJCV9fcmF3X3dyaXRlbChjcy0+Y2hjb25mMCwgY3MtPmJhc2UgKyBPTUFQMl9NQ1NQSV9DSENPTkYwKTsKK30KK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX2Rpc2FibGVfY2xvY2tzKHN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGkpCit7CisJcG1fcnVudGltZV9wdXRfc3luYyhtY3NwaS0+ZGV2KTsKK30KKworc3RhdGljIGludCBvbWFwMl9tY3NwaV9lbmFibGVfY2xvY2tzKHN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGkpCit7CisJcmV0dXJuIHBtX3J1bnRpbWVfZ2V0X3N5bmMobWNzcGktPmRldik7Cit9CisKK3N0YXRpYyBpbnQgbWNzcGlfd2FpdF9mb3JfcmVnX2JpdCh2b2lkIF9faW9tZW0gKnJlZywgdW5zaWduZWQgbG9uZyBiaXQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCXdoaWxlICghKF9fcmF3X3JlYWRsKHJlZykgJiBiaXQpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJcmV0dXJuIC0xOworCQljcHVfcmVsYXgoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorb21hcDJfbWNzcGlfdHhyeF9kbWEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJc3RydWN0IG9tYXAyX21jc3BpX2RtYSAgKm1jc3BpX2RtYTsKKwl1bnNpZ25lZCBpbnQJCWNvdW50LCBjOworCXVuc2lnbmVkIGxvbmcJCWJhc2UsIHR4X3JlZywgcnhfcmVnOworCWludAkJCXdvcmRfbGVuLCBkYXRhX3R5cGUsIGVsZW1lbnRfY291bnQ7CisJaW50CQkJZWxlbWVudHMgPSAwOworCXUzMgkJCWw7CisJdTgJCQkqIHJ4OworCWNvbnN0IHU4CQkqIHR4OworCXZvaWQgX19pb21lbQkJKmNoc3RhdF9yZWc7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICZtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdOworCWwgPSBtY3NwaV9jYWNoZWRfY2hjb25mMChzcGkpOworCisJY2hzdGF0X3JlZyA9IGNzLT5iYXNlICsgT01BUDJfTUNTUElfQ0hTVEFUMDsKKworCWNvdW50ID0geGZlci0+bGVuOworCWMgPSBjb3VudDsKKwl3b3JkX2xlbiA9IGNzLT53b3JkX2xlbjsKKworCWJhc2UgPSBjcy0+cGh5czsKKwl0eF9yZWcgPSBiYXNlICsgT01BUDJfTUNTUElfVFgwOworCXJ4X3JlZyA9IGJhc2UgKyBPTUFQMl9NQ1NQSV9SWDA7CisJcnggPSB4ZmVyLT5yeF9idWY7CisJdHggPSB4ZmVyLT50eF9idWY7CisKKwlpZiAod29yZF9sZW4gPD0gOCkgeworCQlkYXRhX3R5cGUgPSBPTUFQX0RNQV9EQVRBX1RZUEVfUzg7CisJCWVsZW1lbnRfY291bnQgPSBjb3VudDsKKwl9IGVsc2UgaWYgKHdvcmRfbGVuIDw9IDE2KSB7CisJCWRhdGFfdHlwZSA9IE9NQVBfRE1BX0RBVEFfVFlQRV9TMTY7CisJCWVsZW1lbnRfY291bnQgPSBjb3VudCA+PiAxOworCX0gZWxzZSAvKiB3b3JkX2xlbiA8PSAzMiAqLyB7CisJCWRhdGFfdHlwZSA9IE9NQVBfRE1BX0RBVEFfVFlQRV9TMzI7CisJCWVsZW1lbnRfY291bnQgPSBjb3VudCA+PiAyOworCX0KKworCWlmICh0eCAhPSBOVUxMKSB7CisJCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCwKKwkJCQlkYXRhX3R5cGUsIGVsZW1lbnRfY291bnQsIDEsCisJCQkJT01BUF9ETUFfU1lOQ19FTEVNRU5ULAorCQkJCW1jc3BpX2RtYS0+ZG1hX3R4X3N5bmNfZGV2LCAwKTsKKworCQlvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXMobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCwgMCwKKwkJCQlPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKKwkJCQl0eF9yZWcsIDAsIDApOworCisJCW9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKG1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwsIDAsCisJCQkJT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCisJCQkJeGZlci0+dHhfZG1hLCAwLCAwKTsKKwl9CisKKwlpZiAocnggIT0gTlVMTCkgeworCQllbGVtZW50cyA9IGVsZW1lbnRfY291bnQgLSAxOworCQlpZiAobCAmIE9NQVAyX01DU1BJX0NIQ09ORl9UVVJCTykKKwkJCWVsZW1lbnRzLS07CisKKwkJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsLAorCQkJCWRhdGFfdHlwZSwgZWxlbWVudHMsIDEsCisJCQkJT01BUF9ETUFfU1lOQ19FTEVNRU5ULAorCQkJCW1jc3BpX2RtYS0+ZG1hX3J4X3N5bmNfZGV2LCAxKTsKKworCQlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsLCAwLAorCQkJCU9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULAorCQkJCXJ4X3JlZywgMCwgMCk7CisKKwkJb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwsIDAsCisJCQkJT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCisJCQkJeGZlci0+cnhfZG1hLCAwLCAwKTsKKwl9CisKKwlpZiAodHggIT0gTlVMTCkgeworCQlvbWFwX3N0YXJ0X2RtYShtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsKTsKKwkJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAwLCAxKTsKKwl9CisKKwlpZiAocnggIT0gTlVMTCkgeworCQlvbWFwX3N0YXJ0X2RtYShtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKTsKKwkJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAxLCAxKTsKKwl9CisKKwlpZiAodHggIT0gTlVMTCkgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtY3NwaV9kbWEtPmRtYV90eF9jb21wbGV0aW9uKTsKKwkJZG1hX3VubWFwX3NpbmdsZSgmc3BpLT5kZXYsIHhmZXItPnR4X2RtYSwgY291bnQsIERNQV9UT19ERVZJQ0UpOworCisJCS8qIGZvciBUWF9PTkxZIG1vZGUsIGJlIHN1cmUgYWxsIHdvcmRzIGhhdmUgc2hpZnRlZCBvdXQgKi8KKwkJaWYgKHJ4ID09IE5VTEwpIHsKKwkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfVFhTKSA8IDApCisJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKKwkJCWVsc2UgaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9FT1QpIDwgMCkKKwkJCQlkZXZfZXJyKCZzcGktPmRldiwgIkVPVCB0aW1lZCBvdXRcbiIpOworCQl9CisJfQorCisJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmbWNzcGlfZG1hLT5kbWFfcnhfY29tcGxldGlvbik7CisJCWRtYV91bm1hcF9zaW5nbGUoJnNwaS0+ZGV2LCB4ZmVyLT5yeF9kbWEsIGNvdW50LCBETUFfRlJPTV9ERVZJQ0UpOworCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMCk7CisKKwkJaWYgKGwgJiBPTUFQMl9NQ1NQSV9DSENPTkZfVFVSQk8pIHsKKworCQkJaWYgKGxpa2VseShtY3NwaV9yZWFkX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIU1RBVDApCisJCQkJICAgJiBPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTKSkgeworCQkJCXUzMiB3OworCisJCQkJdyA9IG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfUlgwKTsKKwkJCQlpZiAod29yZF9sZW4gPD0gOCkKKwkJCQkJKCh1OCAqKXhmZXItPnJ4X2J1ZilbZWxlbWVudHMrK10gPSB3OworCQkJCWVsc2UgaWYgKHdvcmRfbGVuIDw9IDE2KQorCQkJCQkoKHUxNiAqKXhmZXItPnJ4X2J1ZilbZWxlbWVudHMrK10gPSB3OworCQkJCWVsc2UgLyogd29yZF9sZW4gPD0gMzIgKi8KKwkJCQkJKCh1MzIgKil4ZmVyLT5yeF9idWYpW2VsZW1lbnRzKytdID0gdzsKKwkJCX0gZWxzZSB7CisJCQkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkJCSJETUEgUlggcGVudWx0aW1hdGUgd29yZCBlbXB0eSIpOworCQkJCWNvdW50IC09ICh3b3JkX2xlbiA8PSA4KSAgPyAyIDoKKwkJCQkJKHdvcmRfbGVuIDw9IDE2KSA/IDQgOgorCQkJCQkvKiB3b3JkX2xlbiA8PSAzMiAqLyA4OworCQkJCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAxKTsKKwkJCQlyZXR1cm4gY291bnQ7CisJCQl9CisJCX0KKworCQlpZiAobGlrZWx5KG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hTVEFUMCkKKwkJCQkmIE9NQVAyX01DU1BJX0NIU1RBVF9SWFMpKSB7CisJCQl1MzIgdzsKKworCQkJdyA9IG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfUlgwKTsKKwkJCWlmICh3b3JkX2xlbiA8PSA4KQorCQkJCSgodTggKil4ZmVyLT5yeF9idWYpW2VsZW1lbnRzXSA9IHc7CisJCQllbHNlIGlmICh3b3JkX2xlbiA8PSAxNikKKwkJCQkoKHUxNiAqKXhmZXItPnJ4X2J1ZilbZWxlbWVudHNdID0gdzsKKwkJCWVsc2UgLyogd29yZF9sZW4gPD0gMzIgKi8KKwkJCQkoKHUzMiAqKXhmZXItPnJ4X2J1ZilbZWxlbWVudHNdID0gdzsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRE1BIFJYIGxhc3Qgd29yZCBlbXB0eSIpOworCQkJY291bnQgLT0gKHdvcmRfbGVuIDw9IDgpICA/IDEgOgorCQkJCSAod29yZF9sZW4gPD0gMTYpID8gMiA6CisJCQkgICAgICAgLyogd29yZF9sZW4gPD0gMzIgKi8gNDsKKwkJfQorCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMSk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHVuc2lnbmVkCitvbWFwMl9tY3NwaV90eHJ4X3BpbyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQJCWNvdW50LCBjOworCXUzMgkJCWw7CisJdm9pZCBfX2lvbWVtCQkqYmFzZSA9IGNzLT5iYXNlOworCXZvaWQgX19pb21lbQkJKnR4X3JlZzsKKwl2b2lkIF9faW9tZW0JCSpyeF9yZWc7CisJdm9pZCBfX2lvbWVtCQkqY2hzdGF0X3JlZzsKKwlpbnQJCQl3b3JkX2xlbjsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJY291bnQgPSB4ZmVyLT5sZW47CisJYyA9IGNvdW50OworCXdvcmRfbGVuID0gY3MtPndvcmRfbGVuOworCisJbCA9IG1jc3BpX2NhY2hlZF9jaGNvbmYwKHNwaSk7CisKKwkvKiBXZSBzdG9yZSB0aGUgcHJlLWNhbGN1bGF0ZWQgcmVnaXN0ZXIgYWRkcmVzc2VzIG9uIHN0YWNrIHRvIHNwZWVkCisJICogdXAgdGhlIHRyYW5zZmVyIGxvb3AuICovCisJdHhfcmVnCQk9IGJhc2UgKyBPTUFQMl9NQ1NQSV9UWDA7CisJcnhfcmVnCQk9IGJhc2UgKyBPTUFQMl9NQ1NQSV9SWDA7CisJY2hzdGF0X3JlZwk9IGJhc2UgKyBPTUFQMl9NQ1NQSV9DSFNUQVQwOworCisJaWYgKGMgPCAod29yZF9sZW4+PjMpKQorCQlyZXR1cm4gMDsKKworCWlmICh3b3JkX2xlbiA8PSA4KSB7CisJCXU4CQkqcng7CisJCWNvbnN0IHU4CSp0eDsKKworCQlyeCA9IHhmZXItPnJ4X2J1ZjsKKwkJdHggPSB4ZmVyLT50eF9idWY7CisKKwkJZG8geworCQkJYyAtPSAxOworCQkJaWYgKHR4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1RYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVFhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlkZXZfdmRiZygmc3BpLT5kZXYsICJ3cml0ZS0lZCAlMDJ4XG4iLAorCQkJCQkJd29yZF9sZW4sICp0eCk7CisJCQkJX19yYXdfd3JpdGVsKCp0eCsrLCB0eF9yZWcpOworCQkJfQorCQkJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUlhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKworCQkJCWlmIChjID09IDEgJiYgdHggPT0gTlVMTCAmJgorCQkJCSAgICAobCAmIE9NQVAyX01DU1BJX0NIQ09ORl9UVVJCTykpIHsKKwkJCQkJb21hcDJfbWNzcGlfc2V0X2VuYWJsZShzcGksIDApOworCQkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7CisJCQkJCWRldl92ZGJnKCZzcGktPmRldiwgInJlYWQtJWQgJTAyeFxuIiwKKwkJCQkJCSAgICB3b3JkX2xlbiwgKihyeCAtIDEpKTsKKwkJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9SWFMpIDwgMCkgeworCQkJCQkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkJCQkJIlJYUyB0aW1lZCBvdXRcbiIpOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0KKwkJCQkJYyA9IDA7CisJCQkJfSBlbHNlIGlmIChjID09IDAgJiYgdHggPT0gTlVMTCkgeworCQkJCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMCk7CisJCQkJfQorCisJCQkJKnJ4KysgPSBfX3Jhd19yZWFkbChyeF9yZWcpOworCQkJCWRldl92ZGJnKCZzcGktPmRldiwgInJlYWQtJWQgJTAyeFxuIiwKKwkJCQkJCXdvcmRfbGVuLCAqKHJ4IC0gMSkpOworCQkJfQorCQl9IHdoaWxlIChjKTsKKwl9IGVsc2UgaWYgKHdvcmRfbGVuIDw9IDE2KSB7CisJCXUxNgkJKnJ4OworCQljb25zdCB1MTYJKnR4OworCisJCXJ4ID0geGZlci0+cnhfYnVmOworCQl0eCA9IHhmZXItPnR4X2J1ZjsKKwkJZG8geworCQkJYyAtPSAyOworCQkJaWYgKHR4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1RYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVFhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlkZXZfdmRiZygmc3BpLT5kZXYsICJ3cml0ZS0lZCAlMDR4XG4iLAorCQkJCQkJd29yZF9sZW4sICp0eCk7CisJCQkJX19yYXdfd3JpdGVsKCp0eCsrLCB0eF9yZWcpOworCQkJfQorCQkJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUlhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKworCQkJCWlmIChjID09IDIgJiYgdHggPT0gTlVMTCAmJgorCQkJCSAgICAobCAmIE9NQVAyX01DU1BJX0NIQ09ORl9UVVJCTykpIHsKKwkJCQkJb21hcDJfbWNzcGlfc2V0X2VuYWJsZShzcGksIDApOworCQkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7CisJCQkJCWRldl92ZGJnKCZzcGktPmRldiwgInJlYWQtJWQgJTA0eFxuIiwKKwkJCQkJCSAgICB3b3JkX2xlbiwgKihyeCAtIDEpKTsKKwkJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9SWFMpIDwgMCkgeworCQkJCQkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkJCQkJIlJYUyB0aW1lZCBvdXRcbiIpOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0KKwkJCQkJYyA9IDA7CisJCQkJfSBlbHNlIGlmIChjID09IDAgJiYgdHggPT0gTlVMTCkgeworCQkJCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMCk7CisJCQkJfQorCisJCQkJKnJ4KysgPSBfX3Jhd19yZWFkbChyeF9yZWcpOworCQkJCWRldl92ZGJnKCZzcGktPmRldiwgInJlYWQtJWQgJTA0eFxuIiwKKwkJCQkJCXdvcmRfbGVuLCAqKHJ4IC0gMSkpOworCQkJfQorCQl9IHdoaWxlIChjID49IDIpOworCX0gZWxzZSBpZiAod29yZF9sZW4gPD0gMzIpIHsKKwkJdTMyCQkqcng7CisJCWNvbnN0IHUzMgkqdHg7CisKKwkJcnggPSB4ZmVyLT5yeF9idWY7CisJCXR4ID0geGZlci0+dHhfYnVmOworCQlkbyB7CisJCQljIC09IDQ7CisJCQlpZiAodHggIT0gTlVMTCkgeworCQkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfVFhTKSA8IDApIHsKKwkJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWRldl92ZGJnKCZzcGktPmRldiwgIndyaXRlLSVkICUwOHhcbiIsCisJCQkJCQl3b3JkX2xlbiwgKnR4KTsKKwkJCQlfX3Jhd193cml0ZWwoKnR4KyssIHR4X3JlZyk7CisJCQl9CisJCQlpZiAocnggIT0gTlVMTCkgeworCQkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTKSA8IDApIHsKKwkJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJSWFMgdGltZWQgb3V0XG4iKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCisJCQkJaWYgKGMgPT0gNCAmJiB0eCA9PSBOVUxMICYmCisJCQkJICAgIChsICYgT01BUDJfTUNTUElfQ0hDT05GX1RVUkJPKSkgeworCQkJCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMCk7CisJCQkJCSpyeCsrID0gX19yYXdfcmVhZGwocnhfcmVnKTsKKwkJCQkJZGV2X3ZkYmcoJnNwaS0+ZGV2LCAicmVhZC0lZCAlMDh4XG4iLAorCQkJCQkJICAgIHdvcmRfbGVuLCAqKHJ4IC0gMSkpOworCQkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7CisJCQkJCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCQkJCQkiUlhTIHRpbWVkIG91dFxuIik7CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQljID0gMDsKKwkJCQl9IGVsc2UgaWYgKGMgPT0gMCAmJiB0eCA9PSBOVUxMKSB7CisJCQkJCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAwKTsKKwkJCQl9CisKKwkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7CisJCQkJZGV2X3ZkYmcoJnNwaS0+ZGV2LCAicmVhZC0lZCAlMDh4XG4iLAorCQkJCQkJd29yZF9sZW4sICoocnggLSAxKSk7CisJCQl9CisJCX0gd2hpbGUgKGMgPj0gNCk7CisJfQorCisJLyogZm9yIFRYX09OTFkgbW9kZSwgYmUgc3VyZSBhbGwgd29yZHMgaGF2ZSBzaGlmdGVkIG91dCAqLworCWlmICh4ZmVyLT5yeF9idWYgPT0gTlVMTCkgeworCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9UWFMpIDwgMCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKKwkJfSBlbHNlIGlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJT01BUDJfTUNTUElfQ0hTVEFUX0VPVCkgPCAwKQorCQkJZGV2X2Vycigmc3BpLT5kZXYsICJFT1QgdGltZWQgb3V0XG4iKTsKKworCQkvKiBkaXNhYmxlIGNoYW4gdG8gcHVyZ2UgcnggZGF0YXMgcmVjZWl2ZWQgaW4gVFhfT05MWSB0cmFuc2ZlciwKKwkJICogb3RoZXJ3aXNlIHRoZXNlIHJ4IGRhdGFzIHdpbGwgYWZmZWN0IHRoZSBkaXJlY3QgZm9sbG93aW5nCisJCSAqIFJYX09OTFkgdHJhbnNmZXIuCisJCSAqLworCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMCk7CisJfQorb3V0OgorCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAxKTsKKwlyZXR1cm4gY291bnQgLSBjOworfQorCitzdGF0aWMgdTMyIG9tYXAyX21jc3BpX2NhbGNfZGl2aXNvcih1MzIgc3BlZWRfaHopCit7CisJdTMyIGRpdjsKKworCWZvciAoZGl2ID0gMDsgZGl2IDwgMTU7IGRpdisrKQorCQlpZiAoc3BlZWRfaHogPj0gKE9NQVAyX01DU1BJX01BWF9GUkVRID4+IGRpdikpCisJCQlyZXR1cm4gZGl2OworCisJcmV0dXJuIDE1OworfQorCisvKiBjYWxsZWQgb25seSB3aGVuIG5vIHRyYW5zZmVyIGlzIGFjdGl2ZSB0byB0aGlzIGRldmljZSAqLworc3RhdGljIGludCBvbWFwMl9tY3NwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJc3RydWN0IG9tYXAyX21jc3BpICptY3NwaTsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqc3BpX2NudHJsOworCXUzMiBsID0gMCwgZGl2ID0gMDsKKwl1OCB3b3JkX2xlbiA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwl1MzIgc3BlZWRfaHogPSBzcGktPm1heF9zcGVlZF9oejsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3BpX2NudHJsID0gbWNzcGktPm1hc3RlcjsKKworCWlmICh0ICE9IE5VTEwgJiYgdC0+Yml0c19wZXJfd29yZCkKKwkJd29yZF9sZW4gPSB0LT5iaXRzX3Blcl93b3JkOworCisJY3MtPndvcmRfbGVuID0gd29yZF9sZW47CisKKwlpZiAodCAmJiB0LT5zcGVlZF9oeikKKwkJc3BlZWRfaHogPSB0LT5zcGVlZF9oejsKKworCXNwZWVkX2h6ID0gbWluX3QodTMyLCBzcGVlZF9oeiwgT01BUDJfTUNTUElfTUFYX0ZSRVEpOworCWRpdiA9IG9tYXAyX21jc3BpX2NhbGNfZGl2aXNvcihzcGVlZF9oeik7CisKKwlsID0gbWNzcGlfY2FjaGVkX2NoY29uZjAoc3BpKTsKKworCS8qIHN0YW5kYXJkIDQtd2lyZSBtYXN0ZXIgbW9kZTogIFNDSywgTU9TSS9vdXQsIE1JU08vaW4sIG5DUworCSAqIFJFVklTSVQ6IHRoaXMgY29udHJvbGxlciBjb3VsZCBzdXBwb3J0IFNQSV8zV0lSRSBtb2RlLgorCSAqLworCWwgJj0gfihPTUFQMl9NQ1NQSV9DSENPTkZfSVN8T01BUDJfTUNTUElfQ0hDT05GX0RQRTEpOworCWwgfD0gT01BUDJfTUNTUElfQ0hDT05GX0RQRTA7CisKKwkvKiB3b3JkbGVuZ3RoICovCisJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX1dMX01BU0s7CisJbCB8PSAod29yZF9sZW4gLSAxKSA8PCA3OworCisJLyogc2V0IGNoaXBzZWxlY3QgcG9sYXJpdHk7IG1hbmFnZSB3aXRoIEZPUkNFICovCisJaWYgKCEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKQorCQlsIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9FUE9MOwkvKiBhY3RpdmUtbG93OyBub3JtYWwgKi8KKwllbHNlCisJCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9FUE9MOworCisJLyogc2V0IGNsb2NrIGRpdmlzb3IgKi8KKwlsICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfQ0xLRF9NQVNLOworCWwgfD0gZGl2IDw8IDI7CisKKwkvKiBzZXQgU1BJIG1vZGUgMC4uMyAqLworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJbCB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfUE9MOworCWVsc2UKKwkJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX1BPTDsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCisJCWwgfD0gT01BUDJfTUNTUElfQ0hDT05GX1BIQTsKKwllbHNlCisJCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9QSEE7CisKKwltY3NwaV93cml0ZV9jaGNvbmYwKHNwaSwgbCk7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiBzcGVlZCAlZCwgc2FtcGxlICVzIGVkZ2UsIGNsayAlc1xuIiwKKwkJCU9NQVAyX01DU1BJX01BWF9GUkVRID4+IGRpdiwKKwkJCShzcGktPm1vZGUgJiBTUElfQ1BIQSkgPyAidHJhaWxpbmciIDogImxlYWRpbmciLAorCQkJKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSA/ICJpbnZlcnRlZCIgOiAibm9ybWFsIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfZG1hX3J4X2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IGRhdGE7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSptY3NwaV9kbWE7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICYobWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XSk7CisKKwljb21wbGV0ZSgmbWNzcGlfZG1hLT5kbWFfcnhfY29tcGxldGlvbik7CisKKwkvKiBXZSBtdXN0IGRpc2FibGUgdGhlIERNQSBSWCByZXF1ZXN0ICovCisJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAxLCAwKTsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfZG1hX3R4X2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IGRhdGE7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSptY3NwaV9kbWE7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICYobWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XSk7CisKKwljb21wbGV0ZSgmbWNzcGlfZG1hLT5kbWFfdHhfY29tcGxldGlvbik7CisKKwkvKiBXZSBtdXN0IGRpc2FibGUgdGhlIERNQSBUWCByZXF1ZXN0ICovCisJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAwLCAwKTsKK30KKworc3RhdGljIGludCBvbWFwMl9tY3NwaV9yZXF1ZXN0X2RtYShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXIgPSBzcGktPm1hc3RlcjsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKm1jc3BpX2RtYTsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCW1jc3BpX2RtYSA9IG1jc3BpLT5kbWFfY2hhbm5lbHMgKyBzcGktPmNoaXBfc2VsZWN0OworCisJaWYgKG9tYXBfcmVxdWVzdF9kbWEobWNzcGlfZG1hLT5kbWFfcnhfc3luY19kZXYsICJNY1NQSSBSWCIsCisJCQlvbWFwMl9tY3NwaV9kbWFfcnhfY2FsbGJhY2ssIHNwaSwKKwkJCSZtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIFJYIERNQSBjaGFubmVsIGZvciBNY1NQSVxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmIChvbWFwX3JlcXVlc3RfZG1hKG1jc3BpX2RtYS0+ZG1hX3R4X3N5bmNfZGV2LCAiTWNTUEkgVFgiLAorCQkJb21hcDJfbWNzcGlfZG1hX3R4X2NhbGxiYWNrLCBzcGksCisJCQkmbWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCkpIHsKKwkJb21hcF9mcmVlX2RtYShtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKTsKKwkJbWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCA9IC0xOworCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIFRYIERNQSBjaGFubmVsIGZvciBNY1NQSVxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWluaXRfY29tcGxldGlvbigmbWNzcGlfZG1hLT5kbWFfcnhfY29tcGxldGlvbik7CisJaW5pdF9jb21wbGV0aW9uKCZtY3NwaV9kbWEtPmRtYV90eF9jb21wbGV0aW9uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXAyX21jc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50CQkJcmV0OworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqbWNzcGlfZG1hOworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkIDwgNCB8fCBzcGktPmJpdHNfcGVyX3dvcmQgPiAzMikgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCAlZCBiaXQgd29yZHNcbiIsCisJCQlzcGktPmJpdHNfcGVyX3dvcmQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICZtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdOworCisJaWYgKCFjcykgeworCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7CisJCWlmICghY3MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJY3MtPmJhc2UgPSBtY3NwaS0+YmFzZSArIHNwaS0+Y2hpcF9zZWxlY3QgKiAweDE0OworCQljcy0+cGh5cyA9IG1jc3BpLT5waHlzICsgc3BpLT5jaGlwX3NlbGVjdCAqIDB4MTQ7CisJCWNzLT5jaGNvbmYwID0gMDsKKwkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gY3M7CisJCS8qIExpbmsgdGhpcyB0byBjb250ZXh0IHNhdmUgbGlzdCAqLworCQlsaXN0X2FkZF90YWlsKCZjcy0+bm9kZSwKKwkJCSZvbWFwMl9tY3NwaV9jdHhbbWNzcGktPm1hc3Rlci0+YnVzX251bSAtIDFdLmNzKTsKKwl9CisKKwlpZiAobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCA9PSAtMQorCQkJfHwgbWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCA9PSAtMSkgeworCQlyZXQgPSBvbWFwMl9tY3NwaV9yZXF1ZXN0X2RtYShzcGkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gb21hcDJfbWNzcGlfZW5hYmxlX2Nsb2NrcyhtY3NwaSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBvbWFwMl9tY3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOworCW9tYXAyX21jc3BpX2Rpc2FibGVfY2xvY2tzKG1jc3BpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKm1jc3BpX2RtYTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJKmNzOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCWlmIChzcGktPmNvbnRyb2xsZXJfc3RhdGUpIHsKKwkJLyogVW5saW5rIGNvbnRyb2xsZXIgc3RhdGUgZnJvbSBjb250ZXh0IHNhdmUgbGlzdCAqLworCQljcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwkJbGlzdF9kZWwoJmNzLT5ub2RlKTsKKworCQlrZnJlZShzcGktPmNvbnRyb2xsZXJfc3RhdGUpOworCX0KKworCWlmIChzcGktPmNoaXBfc2VsZWN0IDwgc3BpLT5tYXN0ZXItPm51bV9jaGlwc2VsZWN0KSB7CisJCW1jc3BpX2RtYSA9ICZtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdOworCisJCWlmIChtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsICE9IC0xKSB7CisJCQlvbWFwX2ZyZWVfZG1hKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwpOworCQkJbWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCA9IC0xOworCQl9CisJCWlmIChtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsICE9IC0xKSB7CisJCQlvbWFwX2ZyZWVfZG1hKG1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwpOworCQkJbWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCA9IC0xOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCisJbWNzcGkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG9tYXAyX21jc3BpLCB3b3JrKTsKKworCWlmIChvbWFwMl9tY3NwaV9lbmFibGVfY2xvY2tzKG1jc3BpKSA8IDApCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKKworCS8qIFdlIG9ubHkgZW5hYmxlIG9uZSBjaGFubmVsIGF0IGEgdGltZSAtLSB0aGUgb25lIHdob3NlIG1lc3NhZ2UgaXMKKwkgKiBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgLS0gYWx0aG91Z2ggdGhpcyBjb250cm9sbGVyIHdvdWxkIGdsYWRseQorCSAqIGFyYml0cmF0ZSBhbW9uZyBtdWx0aXBsZSBjaGFubmVscy4gIFRoaXMgY29ycmVzcG9uZHMgdG8gInNpbmdsZQorCSAqIGNoYW5uZWwiIG1hc3RlciBtb2RlLiAgQXMgYSBzaWRlIGVmZmVjdCwgd2UgbmVlZCB0byBtYW5hZ2UgdGhlCisJICogY2hpcHNlbGVjdCB3aXRoIHRoZSBGT1JDRSBiaXQgLi4uIENTICE9IGNoYW5uZWwgZW5hYmxlLgorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmbWNzcGktPm1zZ19xdWV1ZSkpIHsKKwkJc3RydWN0IHNwaV9tZXNzYWdlCQkqbTsKKwkJc3RydWN0IHNwaV9kZXZpY2UJCSpzcGk7CisJCXN0cnVjdCBzcGlfdHJhbnNmZXIJCSp0ID0gTlVMTDsKKwkJaW50CQkJCWNzX2FjdGl2ZSA9IDA7CisJCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkJKmNzOworCQlzdHJ1Y3Qgb21hcDJfbWNzcGlfZGV2aWNlX2NvbmZpZyAqY2Q7CisJCWludAkJCQlwYXJfb3ZlcnJpZGUgPSAwOworCQlpbnQJCQkJc3RhdHVzID0gMDsKKwkJdTMyCQkJCWNoY29uZjsKKworCQltID0gY29udGFpbmVyX29mKG1jc3BpLT5tc2dfcXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLAorCQkJCSBxdWV1ZSk7CisKKwkJbGlzdF9kZWxfaW5pdCgmbS0+cXVldWUpOworCQlzcGluX3VubG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKKworCQlzcGkgPSBtLT5zcGk7CisJCWNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCQljZCA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOworCisJCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAxKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCQlpZiAodC0+dHhfYnVmID09IE5VTEwgJiYgdC0+cnhfYnVmID09IE5VTEwgJiYgdC0+bGVuKSB7CisJCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwYXJfb3ZlcnJpZGUgfHwgdC0+c3BlZWRfaHogfHwgdC0+Yml0c19wZXJfd29yZCkgeworCQkJCXBhcl9vdmVycmlkZSA9IDE7CisJCQkJc3RhdHVzID0gb21hcDJfbWNzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKKwkJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCF0LT5zcGVlZF9oeiAmJiAhdC0+Yml0c19wZXJfd29yZCkKKwkJCQkJcGFyX292ZXJyaWRlID0gMDsKKwkJCX0KKworCQkJaWYgKCFjc19hY3RpdmUpIHsKKwkJCQlvbWFwMl9tY3NwaV9mb3JjZV9jcyhzcGksIDEpOworCQkJCWNzX2FjdGl2ZSA9IDE7CisJCQl9CisKKwkJCWNoY29uZiA9IG1jc3BpX2NhY2hlZF9jaGNvbmYwKHNwaSk7CisJCQljaGNvbmYgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9UUk1fTUFTSzsKKwkJCWNoY29uZiAmPSB+T01BUDJfTUNTUElfQ0hDT05GX1RVUkJPOworCisJCQlpZiAodC0+dHhfYnVmID09IE5VTEwpCisJCQkJY2hjb25mIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9UUk1fUlhfT05MWTsKKwkJCWVsc2UgaWYgKHQtPnJ4X2J1ZiA9PSBOVUxMKQorCQkJCWNoY29uZiB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX1RYX09OTFk7CisKKwkJCWlmIChjZCAmJiBjZC0+dHVyYm9fbW9kZSAmJiB0LT50eF9idWYgPT0gTlVMTCkgeworCQkJCS8qIFR1cmJvIG1vZGUgaXMgZm9yIG1vcmUgdGhhbiBvbmUgd29yZCAqLworCQkJCWlmICh0LT5sZW4gPiAoKGNzLT53b3JkX2xlbiArIDcpID4+IDMpKQorCQkJCQljaGNvbmYgfD0gT01BUDJfTUNTUElfQ0hDT05GX1RVUkJPOworCQkJfQorCisJCQltY3NwaV93cml0ZV9jaGNvbmYwKHNwaSwgY2hjb25mKTsKKworCQkJaWYgKHQtPmxlbikgeworCQkJCXVuc2lnbmVkCWNvdW50OworCisJCQkJLyogUlhfT05MWSBtb2RlIG5lZWRzIGR1bW15IGRhdGEgaW4gVFggcmVnICovCisJCQkJaWYgKHQtPnR4X2J1ZiA9PSBOVUxMKQorCQkJCQlfX3Jhd193cml0ZWwoMCwgY3MtPmJhc2UKKwkJCQkJCQkrIE9NQVAyX01DU1BJX1RYMCk7CisKKwkJCQlpZiAobS0+aXNfZG1hX21hcHBlZCB8fCB0LT5sZW4gPj0gRE1BX01JTl9CWVRFUykKKwkJCQkJY291bnQgPSBvbWFwMl9tY3NwaV90eHJ4X2RtYShzcGksIHQpOworCQkJCWVsc2UKKwkJCQkJY291bnQgPSBvbWFwMl9tY3NwaV90eHJ4X3BpbyhzcGksIHQpOworCQkJCW0tPmFjdHVhbF9sZW5ndGggKz0gY291bnQ7CisKKwkJCQlpZiAoY291bnQgIT0gdC0+bGVuKSB7CisJCQkJCXN0YXR1cyA9IC1FSU87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHQtPmRlbGF5X3VzZWNzKQorCQkJCXVkZWxheSh0LT5kZWxheV91c2Vjcyk7CisKKwkJCS8qIGlnbm9yZSB0aGUgImxlYXZlIGl0IG9uIGFmdGVyIGxhc3QgeGZlciIgaGludCAqLworCQkJaWYgKHQtPmNzX2NoYW5nZSkgeworCQkJCW9tYXAyX21jc3BpX2ZvcmNlX2NzKHNwaSwgMCk7CisJCQkJY3NfYWN0aXZlID0gMDsKKwkJCX0KKwkJfQorCisJCS8qIFJlc3RvcmUgZGVmYXVsdHMgaWYgdGhleSB3ZXJlIG92ZXJyaWRlbiAqLworCQlpZiAocGFyX292ZXJyaWRlKSB7CisJCQlwYXJfb3ZlcnJpZGUgPSAwOworCQkJc3RhdHVzID0gb21hcDJfbWNzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKKwkJfQorCisJCWlmIChjc19hY3RpdmUpCisJCQlvbWFwMl9tY3NwaV9mb3JjZV9jcyhzcGksIDApOworCisJCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAwKTsKKworCQltLT5zdGF0dXMgPSBzdGF0dXM7CisJCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOworCisJCXNwaW5fbG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKKworCW9tYXAyX21jc3BpX2Rpc2FibGVfY2xvY2tzKG1jc3BpKTsKK30KKworc3RhdGljIGludCBvbWFwMl9tY3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0OworCisJbS0+YWN0dWFsX2xlbmd0aCA9IDA7CisJbS0+c3RhdHVzID0gMDsKKworCS8qIHJlamVjdCBpbnZhbGlkIG1lc3NhZ2VzIGFuZCB0cmFuc2ZlcnMgKi8KKwlpZiAobGlzdF9lbXB0eSgmbS0+dHJhbnNmZXJzKSB8fCAhbS0+Y29tcGxldGUpCisJCXJldHVybiAtRUlOVkFMOworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQljb25zdCB2b2lkCSp0eF9idWYgPSB0LT50eF9idWY7CisJCXZvaWQJCSpyeF9idWYgPSB0LT5yeF9idWY7CisJCXVuc2lnbmVkCWxlbiA9IHQtPmxlbjsKKworCQlpZiAodC0+c3BlZWRfaHogPiBPTUFQMl9NQ1NQSV9NQVhfRlJFUQorCQkJCXx8IChsZW4gJiYgIShyeF9idWYgfHwgdHhfYnVmKSkKKwkJCQl8fCAodC0+Yml0c19wZXJfd29yZCAmJgorCQkJCQkoICB0LT5iaXRzX3Blcl93b3JkIDwgNAorCQkJCQl8fCB0LT5iaXRzX3Blcl93b3JkID4gMzIpKSkgeworCQkJZGV2X2RiZygmc3BpLT5kZXYsICJ0cmFuc2ZlcjogJWQgSHosICVkICVzJXMsICVkIGJwd1xuIiwKKwkJCQkJdC0+c3BlZWRfaHosCisJCQkJCWxlbiwKKwkJCQkJdHhfYnVmID8gInR4IiA6ICIiLAorCQkJCQlyeF9idWYgPyAicngiIDogIiIsCisJCQkJCXQtPmJpdHNfcGVyX3dvcmQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHQtPnNwZWVkX2h6ICYmIHQtPnNwZWVkX2h6IDwgKE9NQVAyX01DU1BJX01BWF9GUkVRID4+IDE1KSkgeworCQkJZGV2X2RiZygmc3BpLT5kZXYsICJzcGVlZF9oeiAlZCBiZWxvdyBtaW5pbXVtICVkIEh6XG4iLAorCQkJCXQtPnNwZWVkX2h6LAorCQkJCU9NQVAyX01DU1BJX01BWF9GUkVRID4+IDE1KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKG0tPmlzX2RtYV9tYXBwZWQgfHwgbGVuIDwgRE1BX01JTl9CWVRFUykKKwkJCWNvbnRpbnVlOworCisJCWlmICh0eF9idWYgIT0gTlVMTCkgeworCQkJdC0+dHhfZG1hID0gZG1hX21hcF9zaW5nbGUoJnNwaS0+ZGV2LCAodm9pZCAqKSB0eF9idWYsCisJCQkJCWxlbiwgRE1BX1RPX0RFVklDRSk7CisJCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJnNwaS0+ZGV2LCB0LT50eF9kbWEpKSB7CisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJkbWEgJWNYICVkIGJ5dGVzIGVycm9yXG4iLAorCQkJCQkJJ1QnLCBsZW4pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJCWlmIChyeF9idWYgIT0gTlVMTCkgeworCQkJdC0+cnhfZG1hID0gZG1hX21hcF9zaW5nbGUoJnNwaS0+ZGV2LCByeF9idWYsIHQtPmxlbiwKKwkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcigmc3BpLT5kZXYsIHQtPnJ4X2RtYSkpIHsKKwkJCQlkZXZfZGJnKCZzcGktPmRldiwgImRtYSAlY1ggJWQgYnl0ZXMgZXJyb3JcbiIsCisJCQkJCQknUicsIGxlbik7CisJCQkJaWYgKHR4X2J1ZiAhPSBOVUxMKQorCQkJCQlkbWFfdW5tYXBfc2luZ2xlKCZzcGktPmRldiwgdC0+dHhfZG1hLAorCQkJCQkJCWxlbiwgRE1BX1RPX0RFVklDRSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1jc3BpLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZtY3NwaS0+bXNnX3F1ZXVlKTsKKwlxdWV1ZV93b3JrKG9tYXAyX21jc3BpX3dxLCAmbWNzcGktPndvcmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jc3BpLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgb21hcDJfbWNzcGlfbWFzdGVyX3NldHVwKHN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGkpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlciA9IG1jc3BpLT5tYXN0ZXI7CisJdTMyCQkJdG1wOworCWludCByZXQgPSAwOworCisJcmV0ID0gb21hcDJfbWNzcGlfZW5hYmxlX2Nsb2NrcyhtY3NwaSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl0bXAgPSBPTUFQMl9NQ1NQSV9XQUtFVVBFTkFCTEVfV0tFTjsKKwltY3NwaV93cml0ZV9yZWcobWFzdGVyLCBPTUFQMl9NQ1NQSV9XQUtFVVBFTkFCTEUsIHRtcCk7CisJb21hcDJfbWNzcGlfY3R4W21hc3Rlci0+YnVzX251bSAtIDFdLndha2V1cGVuYWJsZSA9IHRtcDsKKworCW9tYXAyX21jc3BpX3NldF9tYXN0ZXJfbW9kZShtYXN0ZXIpOworCW9tYXAyX21jc3BpX2Rpc2FibGVfY2xvY2tzKG1jc3BpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX21jc3BpX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisKKwltYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlvbWFwMl9tY3NwaV9yZXN0b3JlX2N0eChtY3NwaSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9tY3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisJc3RydWN0IG9tYXAyX21jc3BpX3BsYXRmb3JtX2NvbmZpZyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCByZXNvdXJjZQkJKnI7CisJaW50CQkJc3RhdHVzID0gMCwgaTsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mICptY3NwaSk7CisJaWYgKG1hc3RlciA9PSBOVUxMKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm1hc3RlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOworCisJaWYgKHBkZXYtPmlkICE9IC0xKQorCQltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKKworCW1hc3Rlci0+c2V0dXAgPSBvbWFwMl9tY3NwaV9zZXR1cDsKKwltYXN0ZXItPnRyYW5zZmVyID0gb21hcDJfbWNzcGlfdHJhbnNmZXI7CisJbWFzdGVyLT5jbGVhbnVwID0gb21hcDJfbWNzcGlfY2xlYW51cDsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcGRhdGEtPm51bV9jczsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBtYXN0ZXIpOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJbWNzcGktPm1hc3RlciA9IG1hc3RlcjsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT0RFVjsKKwkJZ290byBlcnIxOworCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSwKKwkJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSkpIHsKKwkJc3RhdHVzID0gLUVCVVNZOworCQlnb3RvIGVycjE7CisJfQorCisJci0+c3RhcnQgKz0gcGRhdGEtPnJlZ3Nfb2Zmc2V0OworCXItPmVuZCArPSBwZGF0YS0+cmVnc19vZmZzZXQ7CisJbWNzcGktPnBoeXMgPSByLT5zdGFydDsKKwltY3NwaS0+YmFzZSA9IGlvcmVtYXAoci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworCWlmICghbWNzcGktPmJhc2UpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgaW9yZW1hcCBNQ1NQSVxuIik7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZXJyMjsKKwl9CisKKwltY3NwaS0+ZGV2ID0gJnBkZXYtPmRldjsKKwlJTklUX1dPUksoJm1jc3BpLT53b3JrLCBvbWFwMl9tY3NwaV93b3JrKTsKKworCXNwaW5fbG9ja19pbml0KCZtY3NwaS0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJm1jc3BpLT5tc2dfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZvbWFwMl9tY3NwaV9jdHhbbWFzdGVyLT5idXNfbnVtIC0gMV0uY3MpOworCisJbWNzcGktPmRtYV9jaGFubmVscyA9IGtjYWxsb2MobWFzdGVyLT5udW1fY2hpcHNlbGVjdCwKKwkJCXNpemVvZihzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hKSwKKwkJCUdGUF9LRVJORUwpOworCisJaWYgKG1jc3BpLT5kbWFfY2hhbm5lbHMgPT0gTlVMTCkKKwkJZ290byBlcnIyOworCisJZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykgeworCQljaGFyIGRtYV9jaF9uYW1lWzE0XTsKKwkJc3RydWN0IHJlc291cmNlICpkbWFfcmVzOworCisJCXNwcmludGYoZG1hX2NoX25hbWUsICJyeCVkIiwgaSk7CisJCWRtYV9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfRE1BLAorCQkJCQkJCWRtYV9jaF9uYW1lKTsKKwkJaWYgKCFkbWFfcmVzKSB7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IERNQSBSWCBjaGFubmVsXG4iKTsKKwkJCXN0YXR1cyA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCisJCW1jc3BpLT5kbWFfY2hhbm5lbHNbaV0uZG1hX3J4X2NoYW5uZWwgPSAtMTsKKwkJbWNzcGktPmRtYV9jaGFubmVsc1tpXS5kbWFfcnhfc3luY19kZXYgPSBkbWFfcmVzLT5zdGFydDsKKwkJc3ByaW50ZihkbWFfY2hfbmFtZSwgInR4JWQiLCBpKTsKKwkJZG1hX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9ETUEsCisJCQkJCQkJZG1hX2NoX25hbWUpOworCQlpZiAoIWRtYV9yZXMpIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgRE1BIFRYIGNoYW5uZWxcbiIpOworCQkJc3RhdHVzID0gLUVOT0RFVjsKKwkJCWJyZWFrOworCQl9CisKKwkJbWNzcGktPmRtYV9jaGFubmVsc1tpXS5kbWFfdHhfY2hhbm5lbCA9IC0xOworCQltY3NwaS0+ZG1hX2NoYW5uZWxzW2ldLmRtYV90eF9zeW5jX2RldiA9IGRtYV9yZXMtPnN0YXJ0OworCX0KKworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCisJaWYgKHN0YXR1cyB8fCBvbWFwMl9tY3NwaV9tYXN0ZXJfc2V0dXAobWNzcGkpIDwgMCkKKwkJZ290byBlcnIzOworCisJc3RhdHVzID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycjQ7CisKKwlyZXR1cm4gc3RhdHVzOworCitlcnI0OgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CitlcnIzOgorCWtmcmVlKG1jc3BpLT5kbWFfY2hhbm5lbHMpOworZXJyMjoKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworCWlvdW5tYXAobWNzcGktPmJhc2UpOworZXJyMToKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBvbWFwMl9tY3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqZG1hX2NoYW5uZWxzOworCXN0cnVjdCByZXNvdXJjZQkJKnI7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCisJbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWRtYV9jaGFubmVscyA9IG1jc3BpLT5kbWFfY2hhbm5lbHM7CisKKwlvbWFwMl9tY3NwaV9kaXNhYmxlX2Nsb2NrcyhtY3NwaSk7CisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKworCWJhc2UgPSBtY3NwaS0+YmFzZTsKKwlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwlpb3VubWFwKGJhc2UpOworCWtmcmVlKGRtYV9jaGFubmVscyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm9tYXAyX21jc3BpIik7CisKKyNpZmRlZglDT05GSUdfU1VTUEVORAorLyoKKyAqIFdoZW4gU1BJIHdha2UgdXAgZnJvbSBvZmYtbW9kZSwgQ1MgaXMgaW4gYWN0aXZhdGUgc3RhdGUuIElmIGl0IHdhcyBpbgorICogdW5hY3RpdmUgc3RhdGUgd2hlbiBkcml2ZXIgd2FzIHN1c3BlbmQsIHRoZW4gZm9yY2UgaXQgdG8gdW5hY3RpdmUgc3RhdGUgYXQKKyAqIHdha2UgdXAuCisgKi8KK3N0YXRpYyBpbnQgb21hcDJfbWNzcGlfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MgKmNzOworCisJb21hcDJfbWNzcGlfZW5hYmxlX2Nsb2NrcyhtY3NwaSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcywgJm9tYXAyX21jc3BpX2N0eFttYXN0ZXItPmJ1c19udW0gLSAxXS5jcywKKwkJCSAgICBub2RlKSB7CisJCWlmICgoY3MtPmNoY29uZjAgJiBPTUFQMl9NQ1NQSV9DSENPTkZfRk9SQ0UpID09IDApIHsKKworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gdG9nZ2xlIENTIHN0YXRlIGZvciBPTUFQIHRha2UgdGhpcworCQkJICogY2hhbmdlIGluIGFjY291bnQuCisJCQkgKi8KKwkJCU1PRF9SRUdfQklUKGNzLT5jaGNvbmYwLCBPTUFQMl9NQ1NQSV9DSENPTkZfRk9SQ0UsIDEpOworCQkJX19yYXdfd3JpdGVsKGNzLT5jaGNvbmYwLCBjcy0+YmFzZSArIE9NQVAyX01DU1BJX0NIQ09ORjApOworCQkJTU9EX1JFR19CSVQoY3MtPmNoY29uZjAsIE9NQVAyX01DU1BJX0NIQ09ORl9GT1JDRSwgMCk7CisJCQlfX3Jhd193cml0ZWwoY3MtPmNoY29uZjAsIGNzLT5iYXNlICsgT01BUDJfTUNTUElfQ0hDT05GMCk7CisJCX0KKwl9CisJb21hcDJfbWNzcGlfZGlzYWJsZV9jbG9ja3MobWNzcGkpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUJb21hcDJfbWNzcGlfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgb21hcDJfbWNzcGlfcG1fb3BzID0geworCS5yZXN1bWUgPSBvbWFwMl9tY3NwaV9yZXN1bWUsCisJLnJ1bnRpbWVfcmVzdW1lCT0gb21hcF9tY3NwaV9ydW50aW1lX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXAyX21jc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9CQkib21hcDJfbWNzcGkiLAorCQkub3duZXIgPQlUSElTX01PRFVMRSwKKwkJLnBtID0JCSZvbWFwMl9tY3NwaV9wbV9vcHMKKwl9LAorCS5yZW1vdmUgPQlfX2V4aXRfcChvbWFwMl9tY3NwaV9yZW1vdmUpLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9tY3NwaV9pbml0KHZvaWQpCit7CisJb21hcDJfbWNzcGlfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKKwkJCQlvbWFwMl9tY3NwaV9kcml2ZXIuZHJpdmVyLm5hbWUpOworCWlmIChvbWFwMl9tY3NwaV93cSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmb21hcDJfbWNzcGlfZHJpdmVyLCBvbWFwMl9tY3NwaV9wcm9iZSk7Cit9CitzdWJzeXNfaW5pdGNhbGwob21hcDJfbWNzcGlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbWFwMl9tY3NwaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXAyX21jc3BpX2RyaXZlcik7CisKKwlkZXN0cm95X3dvcmtxdWV1ZShvbWFwMl9tY3NwaV93cSk7Cit9Cittb2R1bGVfZXhpdChvbWFwMl9tY3NwaV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW9yaW9uLmMgYi9kcml2ZXJzL3NwaS9zcGktb3Jpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDIxYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9yaW9uLmMKQEAgLTAsMCArMSw1NzMgQEAKKy8qCisgKiBNYXJ2ZWxsIE9yaW9uIFNQSSBjb250cm9sbGVyIGRyaXZlcgorICoKKyAqIEF1dGhvcjogU2hhZGkgQW1tb3VyaSA8c2hhZGlAbWFydmVsbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNYXJ2ZWxsIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvb3Jpb25fc3BpLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkJIm9yaW9uX3NwaSIKKworI2RlZmluZSBPUklPTl9OVU1fQ0hJUFNFTEVDVFMJCTEgLyogb25seSBvbmUgc2xhdmUgaXMgc3VwcG9ydGVkKi8KKyNkZWZpbmUgT1JJT05fU1BJX1dBSVRfUkRZX01BWF9MT09QCTIwMDAgLyogaW4gdXNlYyAqLworCisjZGVmaW5lIE9SSU9OX1NQSV9JRl9DVFJMX1JFRwkJMHgwMAorI2RlZmluZSBPUklPTl9TUElfSUZfQ09ORklHX1JFRwkJMHgwNAorI2RlZmluZSBPUklPTl9TUElfREFUQV9PVVRfUkVHCQkweDA4CisjZGVmaW5lIE9SSU9OX1NQSV9EQVRBX0lOX1JFRwkJMHgwYworI2RlZmluZSBPUklPTl9TUElfSU5UX0NBVVNFX1JFRwkJMHgxMAorCisjZGVmaW5lIE9SSU9OX1NQSV9JRl84XzE2X0JJVF9NT0RFCSgxIDw8IDUpCisjZGVmaW5lIE9SSU9OX1NQSV9DTEtfUFJFU0NBTEVfTUFTSwkweDFGCisKK3N0cnVjdCBvcmlvbl9zcGkgeworCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOworCisJLyogTG9jayBhY2Nlc3MgdG8gdHJhbnNmZXIgbGlzdC4JKi8KKwlzcGlubG9ja190CQlsb2NrOworCisJc3RydWN0IGxpc3RfaGVhZAltc2dfcXVldWU7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXVuc2lnbmVkIGludAkJbWF4X3NwZWVkOworCXVuc2lnbmVkIGludAkJbWluX3NwZWVkOworCXN0cnVjdCBvcmlvbl9zcGlfaW5mbwkqc3BpX2luZm87Cit9OworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm9yaW9uX3NwaV93cTsKKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKnNwaV9yZWcoc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpLCB1MzIgcmVnKQoreworCXJldHVybiBvcmlvbl9zcGktPmJhc2UgKyByZWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorb3Jpb25fc3BpX3NldGJpdHMoc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpLCB1MzIgcmVnLCB1MzIgbWFzaykKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ19hZGRyID0gc3BpX3JlZyhvcmlvbl9zcGksIHJlZyk7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKHJlZ19hZGRyKTsKKwl2YWwgfD0gbWFzazsKKwl3cml0ZWwodmFsLCByZWdfYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorb3Jpb25fc3BpX2NscmJpdHMoc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpLCB1MzIgcmVnLCB1MzIgbWFzaykKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ19hZGRyID0gc3BpX3JlZyhvcmlvbl9zcGksIHJlZyk7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKHJlZ19hZGRyKTsKKwl2YWwgJj0gfm1hc2s7CisJd3JpdGVsKHZhbCwgcmVnX2FkZHIpOworfQorCitzdGF0aWMgaW50IG9yaW9uX3NwaV9zZXRfdHJhbnNmZXJfc2l6ZShzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGksIGludCBzaXplKQoreworCWlmIChzaXplID09IDE2KSB7CisJCW9yaW9uX3NwaV9zZXRiaXRzKG9yaW9uX3NwaSwgT1JJT05fU1BJX0lGX0NPTkZJR19SRUcsCisJCQkJICBPUklPTl9TUElfSUZfOF8xNl9CSVRfTU9ERSk7CisJfSBlbHNlIGlmIChzaXplID09IDgpIHsKKwkJb3Jpb25fc3BpX2NscmJpdHMob3Jpb25fc3BpLCBPUklPTl9TUElfSUZfQ09ORklHX1JFRywKKwkJCQkgIE9SSU9OX1NQSV9JRl84XzE2X0JJVF9NT0RFKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiQmFkIGJpdHMgcGVyIHdvcmQgdmFsdWUgJWQgKG9ubHkgOCBvciAxNiBhcmUgIgorCQkJICJhbGxvd2VkKS5cbiIsIHNpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlvbl9zcGlfYmF1ZHJhdGVfc2V0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIGludCBzcGVlZCkKK3sKKwl1MzIgdGNsa19oejsKKwl1MzIgcmF0ZTsKKwl1MzIgcHJlc2NhbGU7CisJdTMyIHJlZzsKKwlzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGk7CisKKwlvcmlvbl9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCXRjbGtfaHogPSBvcmlvbl9zcGktPnNwaV9pbmZvLT50Y2xrOworCisJLyoKKwkgKiB0aGUgc3VwcG9ydGVkIHJhdGVzIGFyZTogNCw2LDguLi4zMAorCSAqIHJvdW5kIHVwIGFzIHdlIGxvb2sgZm9yIGVxdWFsIG9yIGxlc3Mgc3BlZWQKKwkgKi8KKwlyYXRlID0gRElWX1JPVU5EX1VQKHRjbGtfaHosIHNwZWVkKTsKKwlyYXRlID0gcm91bmR1cChyYXRlLCAyKTsKKworCS8qIGNoZWNrIGlmIHJlcXVlc3RlZCBzcGVlZCBpcyB0b28gc21hbGwgKi8KKwlpZiAocmF0ZSA+IDMwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyYXRlIDwgNCkKKwkJcmF0ZSA9IDQ7CisKKwkvKiBDb252ZXJ0IHRoZSByYXRlIHRvIFNQSSBjbG9jayBkaXZpc29yIHZhbHVlLgkqLworCXByZXNjYWxlID0gMHgxMCArIHJhdGUvMjsKKworCXJlZyA9IHJlYWRsKHNwaV9yZWcob3Jpb25fc3BpLCBPUklPTl9TUElfSUZfQ09ORklHX1JFRykpOworCXJlZyA9ICgocmVnICYgfk9SSU9OX1NQSV9DTEtfUFJFU0NBTEVfTUFTSykgfCBwcmVzY2FsZSk7CisJd3JpdGVsKHJlZywgc3BpX3JlZyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JRl9DT05GSUdfUkVHKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNhbGxlZCBvbmx5IHdoZW4gbm8gdHJhbnNmZXIgaXMgYWN0aXZlIG9uIHRoZSBidXMKKyAqLworc3RhdGljIGludAorb3Jpb25fc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpOworCXVuc2lnbmVkIGludCBzcGVlZCA9IHNwaS0+bWF4X3NwZWVkX2h6OworCXVuc2lnbmVkIGludCBiaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOworCWludAlyYzsKKworCW9yaW9uX3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJaWYgKCh0ICE9IE5VTEwpICYmIHQtPnNwZWVkX2h6KQorCQlzcGVlZCA9IHQtPnNwZWVkX2h6OworCisJaWYgKCh0ICE9IE5VTEwpICYmIHQtPmJpdHNfcGVyX3dvcmQpCisJCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOworCisJcmMgPSBvcmlvbl9zcGlfYmF1ZHJhdGVfc2V0KHNwaSwgc3BlZWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIG9yaW9uX3NwaV9zZXRfdHJhbnNmZXJfc2l6ZShvcmlvbl9zcGksIGJpdHNfcGVyX3dvcmQpOworfQorCitzdGF0aWMgdm9pZCBvcmlvbl9zcGlfc2V0X2NzKHN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaSwgaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQlvcmlvbl9zcGlfc2V0Yml0cyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JRl9DVFJMX1JFRywgMHgxKTsKKwllbHNlCisJCW9yaW9uX3NwaV9jbHJiaXRzKG9yaW9uX3NwaSwgT1JJT05fU1BJX0lGX0NUUkxfUkVHLCAweDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBvcmlvbl9zcGlfd2FpdF90aWxsX3JlYWR5KHN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBPUklPTl9TUElfV0FJVF9SRFlfTUFYX0xPT1A7IGkrKykgeworCQlpZiAocmVhZGwoc3BpX3JlZyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JTlRfQ0FVU0VfUkVHKSkpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJdWRlbGF5KDEpOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK29yaW9uX3NwaV93cml0ZV9yZWFkXzhiaXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgY29uc3QgdTggKip0eF9idWYsIHU4ICoqcnhfYnVmKQoreworCXZvaWQgX19pb21lbSAqdHhfcmVnLCAqcnhfcmVnLCAqaW50X3JlZzsKKwlzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGk7CisKKwlvcmlvbl9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl0eF9yZWcgPSBzcGlfcmVnKG9yaW9uX3NwaSwgT1JJT05fU1BJX0RBVEFfT1VUX1JFRyk7CisJcnhfcmVnID0gc3BpX3JlZyhvcmlvbl9zcGksIE9SSU9OX1NQSV9EQVRBX0lOX1JFRyk7CisJaW50X3JlZyA9IHNwaV9yZWcob3Jpb25fc3BpLCBPUklPTl9TUElfSU5UX0NBVVNFX1JFRyk7CisKKwkvKiBjbGVhciB0aGUgaW50ZXJydXB0IGNhdXNlIHJlZ2lzdGVyICovCisJd3JpdGVsKDB4MCwgaW50X3JlZyk7CisKKwlpZiAodHhfYnVmICYmICp0eF9idWYpCisJCXdyaXRlbCgqKCp0eF9idWYpKyssIHR4X3JlZyk7CisJZWxzZQorCQl3cml0ZWwoMCwgdHhfcmVnKTsKKworCWlmIChvcmlvbl9zcGlfd2FpdF90aWxsX3JlYWR5KG9yaW9uX3NwaSkgPCAwKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVFhTIHRpbWVkIG91dFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocnhfYnVmICYmICpyeF9idWYpCisJCSooKnJ4X2J1ZikrKyA9IHJlYWRsKHJ4X3JlZyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK29yaW9uX3NwaV93cml0ZV9yZWFkXzE2Yml0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkgICBjb25zdCB1MTYgKip0eF9idWYsIHUxNiAqKnJ4X2J1ZikKK3sKKwl2b2lkIF9faW9tZW0gKnR4X3JlZywgKnJ4X3JlZywgKmludF9yZWc7CisJc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpOworCisJb3Jpb25fc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdHhfcmVnID0gc3BpX3JlZyhvcmlvbl9zcGksIE9SSU9OX1NQSV9EQVRBX09VVF9SRUcpOworCXJ4X3JlZyA9IHNwaV9yZWcob3Jpb25fc3BpLCBPUklPTl9TUElfREFUQV9JTl9SRUcpOworCWludF9yZWcgPSBzcGlfcmVnKG9yaW9uX3NwaSwgT1JJT05fU1BJX0lOVF9DQVVTRV9SRUcpOworCisJLyogY2xlYXIgdGhlIGludGVycnVwdCBjYXVzZSByZWdpc3RlciAqLworCXdyaXRlbCgweDAsIGludF9yZWcpOworCisJaWYgKHR4X2J1ZiAmJiAqdHhfYnVmKQorCQl3cml0ZWwoX19jcHVfdG9fbGUxNihnZXRfdW5hbGlnbmVkKCgqdHhfYnVmKSsrKSksIHR4X3JlZyk7CisJZWxzZQorCQl3cml0ZWwoMCwgdHhfcmVnKTsKKworCWlmIChvcmlvbl9zcGlfd2FpdF90aWxsX3JlYWR5KG9yaW9uX3NwaSkgPCAwKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVFhTIHRpbWVkIG91dFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocnhfYnVmICYmICpyeF9idWYpCisJCXB1dF91bmFsaWduZWQoX19sZTE2X3RvX2NwdShyZWFkbChyeF9yZWcpKSwgKCpyeF9idWYpKyspOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK29yaW9uX3NwaV93cml0ZV9yZWFkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpOworCXVuc2lnbmVkIGludCBjb3VudDsKKwlpbnQgd29yZF9sZW47CisKKwlvcmlvbl9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl3b3JkX2xlbiA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwljb3VudCA9IHhmZXItPmxlbjsKKworCWlmICh3b3JkX2xlbiA9PSA4KSB7CisJCWNvbnN0IHU4ICp0eCA9IHhmZXItPnR4X2J1ZjsKKwkJdTggKnJ4ID0geGZlci0+cnhfYnVmOworCisJCWRvIHsKKwkJCWlmIChvcmlvbl9zcGlfd3JpdGVfcmVhZF84Yml0KHNwaSwgJnR4LCAmcngpIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWNvdW50LS07CisJCX0gd2hpbGUgKGNvdW50KTsKKwl9IGVsc2UgaWYgKHdvcmRfbGVuID09IDE2KSB7CisJCWNvbnN0IHUxNiAqdHggPSB4ZmVyLT50eF9idWY7CisJCXUxNiAqcnggPSB4ZmVyLT5yeF9idWY7CisKKwkJZG8geworCQkJaWYgKG9yaW9uX3NwaV93cml0ZV9yZWFkXzE2Yml0KHNwaSwgJnR4LCAmcngpIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWNvdW50IC09IDI7CisJCX0gd2hpbGUgKGNvdW50KTsKKwl9CisKK291dDoKKwlyZXR1cm4geGZlci0+bGVuIC0gY291bnQ7Cit9CisKKworc3RhdGljIHZvaWQgb3Jpb25fc3BpX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBvcmlvbl9zcGkgKm9yaW9uX3NwaSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgb3Jpb25fc3BpLCB3b3JrKTsKKworCXNwaW5fbG9ja19pcnEoJm9yaW9uX3NwaS0+bG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZvcmlvbl9zcGktPm1zZ19xdWV1ZSkpIHsKKwkJc3RydWN0IHNwaV9tZXNzYWdlICptOworCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpOworCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ID0gTlVMTDsKKwkJaW50IHBhcl9vdmVycmlkZSA9IDA7CisJCWludCBzdGF0dXMgPSAwOworCQlpbnQgY3NfYWN0aXZlID0gMDsKKworCQltID0gY29udGFpbmVyX29mKG9yaW9uX3NwaS0+bXNnX3F1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwKKwkJCQkgcXVldWUpOworCisJCWxpc3RfZGVsX2luaXQoJm0tPnF1ZXVlKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZvcmlvbl9zcGktPmxvY2spOworCisJCXNwaSA9IG0tPnNwaTsKKworCQkvKiBMb2FkIGRlZmF1bHRzICovCisJCXN0YXR1cyA9IG9yaW9uX3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOworCisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBtc2dfZG9uZTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJCWlmIChwYXJfb3ZlcnJpZGUgfHwgdC0+c3BlZWRfaHogfHwgdC0+Yml0c19wZXJfd29yZCkgeworCQkJCXBhcl9vdmVycmlkZSA9IDE7CisJCQkJc3RhdHVzID0gb3Jpb25fc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgdCk7CisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWJyZWFrOworCQkJCWlmICghdC0+c3BlZWRfaHogJiYgIXQtPmJpdHNfcGVyX3dvcmQpCisJCQkJCXBhcl9vdmVycmlkZSA9IDA7CisJCQl9CisKKwkJCWlmICghY3NfYWN0aXZlKSB7CisJCQkJb3Jpb25fc3BpX3NldF9jcyhvcmlvbl9zcGksIDEpOworCQkJCWNzX2FjdGl2ZSA9IDE7CisJCQl9CisKKwkJCWlmICh0LT5sZW4pCisJCQkJbS0+YWN0dWFsX2xlbmd0aCArPQorCQkJCQlvcmlvbl9zcGlfd3JpdGVfcmVhZChzcGksIHQpOworCisJCQlpZiAodC0+ZGVsYXlfdXNlY3MpCisJCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKKworCQkJaWYgKHQtPmNzX2NoYW5nZSkgeworCQkJCW9yaW9uX3NwaV9zZXRfY3Mob3Jpb25fc3BpLCAwKTsKKwkJCQljc19hY3RpdmUgPSAwOworCQkJfQorCQl9CisKK21zZ19kb25lOgorCQlpZiAoY3NfYWN0aXZlKQorCQkJb3Jpb25fc3BpX3NldF9jcyhvcmlvbl9zcGksIDApOworCisJCW0tPnN0YXR1cyA9IHN0YXR1czsKKwkJbS0+Y29tcGxldGUobS0+Y29udGV4dCk7CisKKwkJc3Bpbl9sb2NrX2lycSgmb3Jpb25fc3BpLT5sb2NrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJm9yaW9uX3NwaS0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9yaW9uX3NwaV9yZXNldChzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGkpCit7CisJLyogVmVyaWZ5IHRoYXQgdGhlIENTIGlzIGRlYXNzZXJ0ZWQgKi8KKwlvcmlvbl9zcGlfc2V0X2NzKG9yaW9uX3NwaSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlvbl9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgb3Jpb25fc3BpICpvcmlvbl9zcGk7CisKKwlvcmlvbl9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCS8qIEZpeCBhYyB0aW1pbmcgaWYgcmVxdWlyZWQuICAgKi8KKwlpZiAob3Jpb25fc3BpLT5zcGlfaW5mby0+ZW5hYmxlX2Nsb2NrX2ZpeCkKKwkJb3Jpb25fc3BpX3NldGJpdHMob3Jpb25fc3BpLCBPUklPTl9TUElfSUZfQ09ORklHX1JFRywKKwkJCQkgICgxIDw8IDE0KSk7CisKKwlpZiAoKHNwaS0+bWF4X3NwZWVkX2h6ID09IDApCisJCQl8fCAoc3BpLT5tYXhfc3BlZWRfaHogPiBvcmlvbl9zcGktPm1heF9zcGVlZCkpCisJCXNwaS0+bWF4X3NwZWVkX2h6ID0gb3Jpb25fc3BpLT5tYXhfc3BlZWQ7CisKKwlpZiAoc3BpLT5tYXhfc3BlZWRfaHogPCBvcmlvbl9zcGktPm1pbl9zcGVlZCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgInNldHVwOiByZXF1ZXN0ZWQgc3BlZWQgdG9vIGxvdyAlZCBIelxuIiwKKwkJCXNwaS0+bWF4X3NwZWVkX2h6KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBiYXVkcmF0ZSAmIHdpZHRoIHdpbGwgYmUgc2V0IG9yaW9uX3NwaV9zZXR1cF90cmFuc2ZlcgorCSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW9uX3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJc3RydWN0IG9yaW9uX3NwaSAqb3Jpb25fc3BpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwltLT5zdGF0dXMgPSAwOworCisJLyogcmVqZWN0IGludmFsaWQgbWVzc2FnZXMgYW5kIHRyYW5zZmVycyAqLworCWlmIChsaXN0X2VtcHR5KCZtLT50cmFuc2ZlcnMpIHx8ICFtLT5jb21wbGV0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvcmlvbl9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQl1bnNpZ25lZCBpbnQgYml0c19wZXJfd29yZCA9IHNwaS0+Yml0c19wZXJfd29yZDsKKworCQlpZiAodC0+dHhfYnVmID09IE5VTEwgJiYgdC0+cnhfYnVmID09IE5VTEwgJiYgdC0+bGVuKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCQkibWVzc2FnZSByZWplY3RlZCA6ICIKKwkJCQkiaW52YWxpZCB0cmFuc2ZlciBkYXRhIGJ1ZmZlcnNcbiIpOworCQkJZ290byBtc2dfcmVqZWN0ZWQ7CisJCX0KKworCQlpZiAodC0+Yml0c19wZXJfd29yZCkKKwkJCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOworCisJCWlmICgoYml0c19wZXJfd29yZCAhPSA4KSAmJiAoYml0c19wZXJfd29yZCAhPSAxNikpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LAorCQkJCSJtZXNzYWdlIHJlamVjdGVkIDogIgorCQkJCSJpbnZhbGlkIHRyYW5zZmVyIGJpdHNfcGVyX3dvcmQgKCVkIGJpdHMpXG4iLAorCQkJCWJpdHNfcGVyX3dvcmQpOworCQkJZ290byBtc2dfcmVqZWN0ZWQ7CisJCX0KKwkJLyptYWtlIHN1cmUgYnVmZmVyIGxlbmd0aCBpcyBldmVuIHdoZW4gd29ya2luZyBpbiAxNiBiaXQgbW9kZSovCisJCWlmICgodC0+Yml0c19wZXJfd29yZCA9PSAxNikgJiYgKHQtPmxlbiAmIDEpKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCQkibWVzc2FnZSByZWplY3RlZCA6ICIKKwkJCQkib2RkIGRhdGEgbGVuZ3RoICglZCkgd2hpbGUgaW4gMTYgYml0IG1vZGVcbiIsCisJCQkJdC0+bGVuKTsKKwkJCWdvdG8gbXNnX3JlamVjdGVkOworCQl9CisKKwkJaWYgKHQtPnNwZWVkX2h6ICYmIHQtPnNwZWVkX2h6IDwgb3Jpb25fc3BpLT5taW5fc3BlZWQpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LAorCQkJCSJtZXNzYWdlIHJlamVjdGVkIDogIgorCQkJCSJkZXZpY2UgbWluIHNwZWVkICglZCBIeikgZXhjZWVkcyAiCisJCQkJInJlcXVpcmVkIHRyYW5zZmVyIHNwZWVkICglZCBIeilcbiIsCisJCQkJb3Jpb25fc3BpLT5taW5fc3BlZWQsIHQtPnNwZWVkX2h6KTsKKwkJCWdvdG8gbXNnX3JlamVjdGVkOworCQl9CisJfQorCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3Jpb25fc3BpLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZvcmlvbl9zcGktPm1zZ19xdWV1ZSk7CisJcXVldWVfd29yayhvcmlvbl9zcGlfd3EsICZvcmlvbl9zcGktPndvcmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9yaW9uX3NwaS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cittc2dfcmVqZWN0ZWQ6CisJLyogTWVzc2FnZSByZWplY3RlZCBhbmQgbm90IHF1ZXVlZCAqLworCW0tPnN0YXR1cyA9IC1FSU5WQUw7CisJaWYgKG0tPmNvbXBsZXRlKQorCQltLT5jb21wbGV0ZShtLT5jb250ZXh0KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBfX2luaXQgb3Jpb25fc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3Qgb3Jpb25fc3BpICpzcGk7CisJc3RydWN0IHJlc291cmNlICpyOworCXN0cnVjdCBvcmlvbl9zcGlfaW5mbyAqc3BpX2luZm87CisJaW50IHN0YXR1cyA9IDA7CisKKwlzcGlfaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YgKnNwaSk7CisJaWYgKG1hc3RlciA9PSBOVUxMKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm1hc3RlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChwZGV2LT5pZCAhPSAtMSkKKwkJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CisKKwkvKiB3ZSBzdXBwb3J0IG9ubHkgbW9kZSAwLCBhbmQgbm8gb3B0aW9ucyAqLworCW1hc3Rlci0+bW9kZV9iaXRzID0gMDsKKworCW1hc3Rlci0+c2V0dXAgPSBvcmlvbl9zcGlfc2V0dXA7CisJbWFzdGVyLT50cmFuc2ZlciA9IG9yaW9uX3NwaV90cmFuc2ZlcjsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gT1JJT05fTlVNX0NISVBTRUxFQ1RTOworCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIG1hc3Rlcik7CisKKwlzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJc3BpLT5tYXN0ZXIgPSBtYXN0ZXI7CisJc3BpLT5zcGlfaW5mbyA9IHNwaV9pbmZvOworCisJc3BpLT5tYXhfc3BlZWQgPSBESVZfUk9VTkRfVVAoc3BpX2luZm8tPnRjbGssIDQpOworCXNwaS0+bWluX3NwZWVkID0gRElWX1JPVU5EX1VQKHNwaV9pbmZvLT50Y2xrLCAzMCk7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAociA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpLAorCQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpKSkgeworCQlzdGF0dXMgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlzcGktPmJhc2UgPSBpb3JlbWFwKHItPnN0YXJ0LCBTWl8xSyk7CisKKwlJTklUX1dPUksoJnNwaS0+d29yaywgb3Jpb25fc3BpX3dvcmspOworCisJc3Bpbl9sb2NrX2luaXQoJnNwaS0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnNwaS0+bXNnX3F1ZXVlKTsKKworCWlmIChvcmlvbl9zcGlfcmVzZXQoc3BpKSA8IDApCisJCWdvdG8gb3V0X3JlbF9tZW07CisKKwlzdGF0dXMgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0X3JlbF9tZW07CisKKwlyZXR1cm4gc3RhdHVzOworCitvdXRfcmVsX21lbToKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworCitvdXQ6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQgX19leGl0IG9yaW9uX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBvcmlvbl9zcGkgKnNwaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisKKwltYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJY2FuY2VsX3dvcmtfc3luYygmc3BpLT53b3JrKTsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CisKKwlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJJVkVSX05BTUUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvcmlvbl9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gRFJJVkVSX05BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZQkJPSBfX2V4aXRfcChvcmlvbl9zcGlfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9yaW9uX3NwaV9pbml0KHZvaWQpCit7CisJb3Jpb25fc3BpX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCisJCQkJb3Jpb25fc3BpX2RyaXZlci5kcml2ZXIubmFtZSk7CisJaWYgKG9yaW9uX3NwaV93cSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm9yaW9uX3NwaV9kcml2ZXIsIG9yaW9uX3NwaV9wcm9iZSk7Cit9Cittb2R1bGVfaW5pdChvcmlvbl9zcGlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvcmlvbl9zcGlfZXhpdCh2b2lkKQoreworCWZsdXNoX3dvcmtxdWV1ZShvcmlvbl9zcGlfd3EpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvcmlvbl9zcGlfZHJpdmVyKTsKKworCWRlc3Ryb3lfd29ya3F1ZXVlKG9yaW9uX3NwaV93cSk7Cit9Cittb2R1bGVfZXhpdChvcmlvbl9zcGlfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiT3Jpb24gU1BJIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiU2hhZGkgQW1tb3VyaSA8c2hhZGlAbWFydmVsbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcGwwMjIuYyBiL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTg4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktcGwwMjIuYwpAQCAtMCwwICsxLDI0NDAgQEAKKy8qCisgKiBBIGRyaXZlciBmb3IgdGhlIEFSTSBQTDAyMiBQcmltZUNlbGwgU1NQL1NQSSBidXMgbWFzdGVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFNULUVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU1RNaWNyb2VsZWN0cm9uaWNzIFB2dC4gTHRkLgorICoKKyAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4KKyAqCisgKiBJbml0aWFsIHZlcnNpb24gaW5zcGlyZWQgYnk6CisgKglsaW51eC0yLjYuMTctcmMzLW1tMS9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKKyAqIEluaXRpYWwgYWRvcHRpb24gdG8gUEwwMjIgYnk6CisgKiAgICAgIFNhY2hpbiBWZXJtYSA8c2FjaGluLnZlcm1hQHN0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDAyMi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisKKy8qCisgKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gZGVmaW5lIHNvbWUgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZXMuCisgKiByZWcgaXMgbWFza2VkIHdpdGggbWFzaywgdGhlIE9SOmVkIHdpdGggYW4gKGFnYWluIG1hc2tlZCkKKyAqIHZhbCBzaGlmdGVkIHNiIHN0ZXBzIHRvIHRoZSBsZWZ0LgorICovCisjZGVmaW5lIFNTUF9XUklURV9CSVRTKHJlZywgdmFsLCBtYXNrLCBzYikgXAorICgocmVnKSA9ICgoKHJlZykgJiB+KG1hc2spKSB8ICgoKHZhbCk8PChzYikpICYgKG1hc2spKSkpCisKKy8qCisgKiBUaGlzIG1hY3JvIGlzIGFsc28gdXNlZCB0byBkZWZpbmUgc29tZSBkZWZhdWx0IHZhbHVlcy4KKyAqIEl0IHdpbGwganVzdCBzaGlmdCB2YWwgYnkgc2Igc3RlcHMgdG8gdGhlIGxlZnQgYW5kIG1hc2sKKyAqIHRoZSByZXN1bHQgd2l0aCBtYXNrLgorICovCisjZGVmaW5lIEdFTl9NQVNLX0JJVFModmFsLCBtYXNrLCBzYikgXAorICgoKHZhbCk8PChzYikpICYgKG1hc2spKQorCisjZGVmaW5lIERSSVZFX1RYCQkwCisjZGVmaW5lIERPX05PVF9EUklWRV9UWAkJMQorCisjZGVmaW5lIERPX05PVF9RVUVVRV9ETUEJMAorI2RlZmluZSBRVUVVRV9ETUEJCTEKKworI2RlZmluZSBSWF9UUkFOU0ZFUgkJMQorI2RlZmluZSBUWF9UUkFOU0ZFUgkJMgorCisvKgorICogTWFjcm9zIHRvIGFjY2VzcyBTU1AgUmVnaXN0ZXJzIHdpdGggdGhlaXIgb2Zmc2V0cworICovCisjZGVmaW5lIFNTUF9DUjAocikJKHIgKyAweDAwMCkKKyNkZWZpbmUgU1NQX0NSMShyKQkociArIDB4MDA0KQorI2RlZmluZSBTU1BfRFIocikJKHIgKyAweDAwOCkKKyNkZWZpbmUgU1NQX1NSKHIpCShyICsgMHgwMEMpCisjZGVmaW5lIFNTUF9DUFNSKHIpCShyICsgMHgwMTApCisjZGVmaW5lIFNTUF9JTVNDKHIpCShyICsgMHgwMTQpCisjZGVmaW5lIFNTUF9SSVMocikJKHIgKyAweDAxOCkKKyNkZWZpbmUgU1NQX01JUyhyKQkociArIDB4MDFDKQorI2RlZmluZSBTU1BfSUNSKHIpCShyICsgMHgwMjApCisjZGVmaW5lIFNTUF9ETUFDUihyKQkociArIDB4MDI0KQorI2RlZmluZSBTU1BfSVRDUihyKQkociArIDB4MDgwKQorI2RlZmluZSBTU1BfSVRJUChyKQkociArIDB4MDg0KQorI2RlZmluZSBTU1BfSVRPUChyKQkociArIDB4MDg4KQorI2RlZmluZSBTU1BfVERSKHIpCShyICsgMHgwOEMpCisKKyNkZWZpbmUgU1NQX1BJRDAocikJKHIgKyAweEZFMCkKKyNkZWZpbmUgU1NQX1BJRDEocikJKHIgKyAweEZFNCkKKyNkZWZpbmUgU1NQX1BJRDIocikJKHIgKyAweEZFOCkKKyNkZWZpbmUgU1NQX1BJRDMocikJKHIgKyAweEZFQykKKworI2RlZmluZSBTU1BfQ0lEMChyKQkociArIDB4RkYwKQorI2RlZmluZSBTU1BfQ0lEMShyKQkociArIDB4RkY0KQorI2RlZmluZSBTU1BfQ0lEMihyKQkociArIDB4RkY4KQorI2RlZmluZSBTU1BfQ0lEMyhyKQkociArIDB4RkZDKQorCisvKgorICogU1NQIENvbnRyb2wgUmVnaXN0ZXIgMCAgLSBTU1BfQ1IwCisgKi8KKyNkZWZpbmUgU1NQX0NSMF9NQVNLX0RTUwkoMHgwRlVMIDw8IDApCisjZGVmaW5lIFNTUF9DUjBfTUFTS19GUkYJKDB4M1VMIDw8IDQpCisjZGVmaW5lIFNTUF9DUjBfTUFTS19TUE8JKDB4MVVMIDw8IDYpCisjZGVmaW5lIFNTUF9DUjBfTUFTS19TUEgJKDB4MVVMIDw8IDcpCisjZGVmaW5lIFNTUF9DUjBfTUFTS19TQ1IJKDB4RkZVTCA8PCA4KQorCisvKgorICogVGhlIFNUIHZlcnNpb24gb2YgdGhpcyBibG9jayBtb3ZlcyBzb20gYml0cworICogaW4gU1NQX0NSMCBhbmQgZXh0ZW5kcyBpdCB0byAzMiBiaXRzCisgKi8KKyNkZWZpbmUgU1NQX0NSMF9NQVNLX0RTU19TVAkoMHgxRlVMIDw8IDApCisjZGVmaW5lIFNTUF9DUjBfTUFTS19IQUxGRFVQX1NUCSgweDFVTCA8PCA1KQorI2RlZmluZSBTU1BfQ1IwX01BU0tfQ1NTX1NUCSgweDFGVUwgPDwgMTYpCisjZGVmaW5lIFNTUF9DUjBfTUFTS19GUkZfU1QJKDB4M1VMIDw8IDIxKQorCisKKy8qCisgKiBTU1AgQ29udHJvbCBSZWdpc3RlciAwICAtIFNTUF9DUjEKKyAqLworI2RlZmluZSBTU1BfQ1IxX01BU0tfTEJNCSgweDFVTCA8PCAwKQorI2RlZmluZSBTU1BfQ1IxX01BU0tfU1NFCSgweDFVTCA8PCAxKQorI2RlZmluZSBTU1BfQ1IxX01BU0tfTVMJCSgweDFVTCA8PCAyKQorI2RlZmluZSBTU1BfQ1IxX01BU0tfU09ECSgweDFVTCA8PCAzKQorCisvKgorICogVGhlIFNUIHZlcnNpb24gb2YgdGhpcyBibG9jayBhZGRzIHNvbWUgYml0cworICogaW4gU1NQX0NSMQorICovCisjZGVmaW5lIFNTUF9DUjFfTUFTS19SRU5ETl9TVAkoMHgxVUwgPDwgNCkKKyNkZWZpbmUgU1NQX0NSMV9NQVNLX1RFTkROX1NUCSgweDFVTCA8PCA1KQorI2RlZmluZSBTU1BfQ1IxX01BU0tfTVdBSVRfU1QJKDB4MVVMIDw8IDYpCisjZGVmaW5lIFNTUF9DUjFfTUFTS19SWElGTFNFTF9TVCAoMHg3VUwgPDwgNykKKyNkZWZpbmUgU1NQX0NSMV9NQVNLX1RYSUZMU0VMX1NUICgweDdVTCA8PCAxMCkKKy8qIFRoaXMgb25lIGlzIG9ubHkgaW4gdGhlIFBMMDIzIHZhcmlhbnQgKi8KKyNkZWZpbmUgU1NQX0NSMV9NQVNLX0ZCQ0xLREVMX1NUICgweDdVTCA8PCAxMykKKworLyoKKyAqIFNTUCBTdGF0dXMgUmVnaXN0ZXIgLSBTU1BfU1IKKyAqLworI2RlZmluZSBTU1BfU1JfTUFTS19URkUJCSgweDFVTCA8PCAwKSAvKiBUcmFuc21pdCBGSUZPIGVtcHR5ICovCisjZGVmaW5lIFNTUF9TUl9NQVNLX1RORgkJKDB4MVVMIDw8IDEpIC8qIFRyYW5zbWl0IEZJRk8gbm90IGZ1bGwgKi8KKyNkZWZpbmUgU1NQX1NSX01BU0tfUk5FCQkoMHgxVUwgPDwgMikgLyogUmVjZWl2ZSBGSUZPIG5vdCBlbXB0eSAqLworI2RlZmluZSBTU1BfU1JfTUFTS19SRkYJCSgweDFVTCA8PCAzKSAvKiBSZWNlaXZlIEZJRk8gZnVsbCAqLworI2RlZmluZSBTU1BfU1JfTUFTS19CU1kJCSgweDFVTCA8PCA0KSAvKiBCdXN5IEZsYWcgKi8KKworLyoKKyAqIFNTUCBDbG9jayBQcmVzY2FsZSBSZWdpc3RlciAgLSBTU1BfQ1BTUgorICovCisjZGVmaW5lIFNTUF9DUFNSX01BU0tfQ1BTRFZTUgkoMHhGRlVMIDw8IDApCisKKy8qCisgKiBTU1AgSW50ZXJydXB0IE1hc2sgU2V0L0NsZWFyIFJlZ2lzdGVyIC0gU1NQX0lNU0MKKyAqLworI2RlZmluZSBTU1BfSU1TQ19NQVNLX1JPUklNICgweDFVTCA8PCAwKSAvKiBSZWNlaXZlIE92ZXJydW4gSW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgU1NQX0lNU0NfTUFTS19SVElNICAoMHgxVUwgPDwgMSkgLyogUmVjZWl2ZSB0aW1lb3V0IEludGVycnVwdCBtYXNrICovCisjZGVmaW5lIFNTUF9JTVNDX01BU0tfUlhJTSAgKDB4MVVMIDw8IDIpIC8qIFJlY2VpdmUgRklGTyBJbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBTU1BfSU1TQ19NQVNLX1RYSU0gICgweDFVTCA8PCAzKSAvKiBUcmFuc21pdCBGSUZPIEludGVycnVwdCBtYXNrICovCisKKy8qCisgKiBTU1AgUmF3IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgLSBTU1BfUklTCisgKi8KKy8qIFJlY2VpdmUgT3ZlcnJ1biBSYXcgSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBTU1BfUklTX01BU0tfUk9SUklTCQkoMHgxVUwgPDwgMCkKKy8qIFJlY2VpdmUgVGltZW91dCBSYXcgSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBTU1BfUklTX01BU0tfUlRSSVMJCSgweDFVTCA8PCAxKQorLyogUmVjZWl2ZSBGSUZPIFJhdyBJbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFNTUF9SSVNfTUFTS19SWFJJUwkJKDB4MVVMIDw8IDIpCisvKiBUcmFuc21pdCBGSUZPIFJhdyBJbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFNTUF9SSVNfTUFTS19UWFJJUwkJKDB4MVVMIDw8IDMpCisKKy8qCisgKiBTU1AgTWFza2VkIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgLSBTU1BfTUlTCisgKi8KKy8qIFJlY2VpdmUgT3ZlcnJ1biBNYXNrZWQgSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBTU1BfTUlTX01BU0tfUk9STUlTCQkoMHgxVUwgPDwgMCkKKy8qIFJlY2VpdmUgVGltZW91dCBNYXNrZWQgSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBTU1BfTUlTX01BU0tfUlRNSVMJCSgweDFVTCA8PCAxKQorLyogUmVjZWl2ZSBGSUZPIE1hc2tlZCBJbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFNTUF9NSVNfTUFTS19SWE1JUwkJKDB4MVVMIDw8IDIpCisvKiBUcmFuc21pdCBGSUZPIE1hc2tlZCBJbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFNTUF9NSVNfTUFTS19UWE1JUwkJKDB4MVVMIDw8IDMpCisKKy8qCisgKiBTU1AgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyIC0gU1NQX0lDUgorICovCisvKiBSZWNlaXZlIE92ZXJydW4gUmF3IENsZWFyIEludGVycnVwdCBiaXQgKi8KKyNkZWZpbmUgU1NQX0lDUl9NQVNLX1JPUklDCQkoMHgxVUwgPDwgMCkKKy8qIFJlY2VpdmUgVGltZW91dCBDbGVhciBJbnRlcnJ1cHQgYml0ICovCisjZGVmaW5lIFNTUF9JQ1JfTUFTS19SVElDCQkoMHgxVUwgPDwgMSkKKworLyoKKyAqIFNTUCBETUEgQ29udHJvbCBSZWdpc3RlciAtIFNTUF9ETUFDUgorICovCisvKiBSZWNlaXZlIERNQSBFbmFibGUgYml0ICovCisjZGVmaW5lIFNTUF9ETUFDUl9NQVNLX1JYRE1BRQkJKDB4MVVMIDw8IDApCisvKiBUcmFuc21pdCBETUEgRW5hYmxlIGJpdCAqLworI2RlZmluZSBTU1BfRE1BQ1JfTUFTS19UWERNQUUJCSgweDFVTCA8PCAxKQorCisvKgorICogU1NQIEludGVncmF0aW9uIFRlc3QgY29udHJvbCBSZWdpc3RlciAtIFNTUF9JVENSCisgKi8KKyNkZWZpbmUgU1NQX0lUQ1JfTUFTS19JVEVOCQkoMHgxVUwgPDwgMCkKKyNkZWZpbmUgU1NQX0lUQ1JfTUFTS19URVNURklGTwkJKDB4MVVMIDw8IDEpCisKKy8qCisgKiBTU1AgSW50ZWdyYXRpb24gVGVzdCBJbnB1dCBSZWdpc3RlciAtIFNTUF9JVElQCisgKi8KKyNkZWZpbmUgSVRJUF9NQVNLX1NTUFJYRAkJICgweDFVTCA8PCAwKQorI2RlZmluZSBJVElQX01BU0tfU1NQRlNTSU4JCSAoMHgxVUwgPDwgMSkKKyNkZWZpbmUgSVRJUF9NQVNLX1NTUENMS0lOCQkgKDB4MVVMIDw8IDIpCisjZGVmaW5lIElUSVBfTUFTS19SWERNQUMJCSAoMHgxVUwgPDwgMykKKyNkZWZpbmUgSVRJUF9NQVNLX1RYRE1BQwkJICgweDFVTCA8PCA0KQorI2RlZmluZSBJVElQX01BU0tfU1NQVFhESU4JCSAoMHgxVUwgPDwgNSkKKworLyoKKyAqIFNTUCBJbnRlZ3JhdGlvbiBUZXN0IG91dHB1dCBSZWdpc3RlciAtIFNTUF9JVE9QCisgKi8KKyNkZWZpbmUgSVRPUF9NQVNLX1NTUFRYRAkJICgweDFVTCA8PCAwKQorI2RlZmluZSBJVE9QX01BU0tfU1NQRlNTT1VUCQkgKDB4MVVMIDw8IDEpCisjZGVmaW5lIElUT1BfTUFTS19TU1BDTEtPVVQJCSAoMHgxVUwgPDwgMikKKyNkZWZpbmUgSVRPUF9NQVNLX1NTUE9FbgkJICgweDFVTCA8PCAzKQorI2RlZmluZSBJVE9QX01BU0tfU1NQQ1RMT0VuCQkgKDB4MVVMIDw8IDQpCisjZGVmaW5lIElUT1BfTUFTS19ST1JJTlRSCQkgKDB4MVVMIDw8IDUpCisjZGVmaW5lIElUT1BfTUFTS19SVElOVFIJCSAoMHgxVUwgPDwgNikKKyNkZWZpbmUgSVRPUF9NQVNLX1JYSU5UUgkJICgweDFVTCA8PCA3KQorI2RlZmluZSBJVE9QX01BU0tfVFhJTlRSCQkgKDB4MVVMIDw8IDgpCisjZGVmaW5lIElUT1BfTUFTS19JTlRSCQkJICgweDFVTCA8PCA5KQorI2RlZmluZSBJVE9QX01BU0tfUlhETUFCUkVRCQkgKDB4MVVMIDw8IDEwKQorI2RlZmluZSBJVE9QX01BU0tfUlhETUFTUkVRCQkgKDB4MVVMIDw8IDExKQorI2RlZmluZSBJVE9QX01BU0tfVFhETUFCUkVRCQkgKDB4MVVMIDw8IDEyKQorI2RlZmluZSBJVE9QX01BU0tfVFhETUFTUkVRCQkgKDB4MVVMIDw8IDEzKQorCisvKgorICogU1NQIFRlc3QgRGF0YSBSZWdpc3RlciAtIFNTUF9URFIKKyAqLworI2RlZmluZSBURFJfTUFTS19URVNUREFUQQkJKDB4RkZGRkZGRkYpCisKKy8qCisgKiBNZXNzYWdlIFN0YXRlCisgKiB3ZSB1c2UgdGhlIHNwaV9tZXNzYWdlLnN0YXRlICh2b2lkICopIHBvaW50ZXIgdG8KKyAqIGhvbGQgYSBzaW5nbGUgc3RhdGUgdmFsdWUsIHRoYXQncyB3aHkgYWxsIHRoaXMKKyAqICh2b2lkICopIGNhc3RpbmcgaXMgZG9uZSBoZXJlLgorICovCisjZGVmaW5lIFNUQVRFX1NUQVJUCQkJKCh2b2lkICopIDApCisjZGVmaW5lIFNUQVRFX1JVTk5JTkcJCQkoKHZvaWQgKikgMSkKKyNkZWZpbmUgU1RBVEVfRE9ORQkJCSgodm9pZCAqKSAyKQorI2RlZmluZSBTVEFURV9FUlJPUgkJCSgodm9pZCAqKSAtMSkKKworLyoKKyAqIFNTUCBTdGF0ZSAtIFdoZXRoZXIgRW5hYmxlZCBvciBEaXNhYmxlZAorICovCisjZGVmaW5lIFNTUF9ESVNBQkxFRAkJCSgwKQorI2RlZmluZSBTU1BfRU5BQkxFRAkJCSgxKQorCisvKgorICogU1NQIERNQSBTdGF0ZSAtIFdoZXRoZXIgRE1BIEVuYWJsZWQgb3IgRGlzYWJsZWQKKyAqLworI2RlZmluZSBTU1BfRE1BX0RJU0FCTEVECQkoMCkKKyNkZWZpbmUgU1NQX0RNQV9FTkFCTEVECQkJKDEpCisKKy8qCisgKiBTU1AgQ2xvY2sgRGVmYXVsdHMKKyAqLworI2RlZmluZSBTU1BfREVGQVVMVF9DTEtSQVRFIDB4MgorI2RlZmluZSBTU1BfREVGQVVMVF9QUkVTQ0FMRSAweDQwCisKKy8qCisgKiBTU1AgQ2xvY2sgUGFyYW1ldGVyIHJhbmdlcworICovCisjZGVmaW5lIENQU0RWUl9NSU4gMHgwMgorI2RlZmluZSBDUFNEVlJfTUFYIDB4RkUKKyNkZWZpbmUgU0NSX01JTiAweDAwCisjZGVmaW5lIFNDUl9NQVggMHhGRgorCisvKgorICogU1NQIEludGVycnVwdCByZWxhdGVkIE1hY3JvcworICovCisjZGVmaW5lIERFRkFVTFRfU1NQX1JFR19JTVNDICAweDBVTAorI2RlZmluZSBESVNBQkxFX0FMTF9JTlRFUlJVUFRTIERFRkFVTFRfU1NQX1JFR19JTVNDCisjZGVmaW5lIEVOQUJMRV9BTExfSU5URVJSVVBUUyAofkRFRkFVTFRfU1NQX1JFR19JTVNDKQorCisjZGVmaW5lIENMRUFSX0FMTF9JTlRFUlJVUFRTICAweDMKKworI2RlZmluZSBTUElfUE9MTElOR19USU1FT1VUIDEwMDAKKworCisvKgorICogVGhlIHR5cGUgb2YgcmVhZGluZyBnb2luZyBvbiBvbiB0aGlzIGNoaXAKKyAqLworZW51bSBzc3BfcmVhZGluZyB7CisJUkVBRElOR19OVUxMLAorCVJFQURJTkdfVTgsCisJUkVBRElOR19VMTYsCisJUkVBRElOR19VMzIKK307CisKKy8qKgorICogVGhlIHR5cGUgb2Ygd3JpdGluZyBnb2luZyBvbiBvbiB0aGlzIGNoaXAKKyAqLworZW51bSBzc3Bfd3JpdGluZyB7CisJV1JJVElOR19OVUxMLAorCVdSSVRJTkdfVTgsCisJV1JJVElOR19VMTYsCisJV1JJVElOR19VMzIKK307CisKKy8qKgorICogc3RydWN0IHZlbmRvcl9kYXRhIC0gdmVuZG9yLXNwZWNpZmljIGNvbmZpZyBwYXJhbWV0ZXJzCisgKiBmb3IgUEwwMjIgZGVyaXZhdGVzCisgKiBAZmlmb2RlcHRoOiBkZXB0aCBvZiBGSUZPcyAoYm90aCkKKyAqIEBtYXhfYnB3OiBtYXhpbXVtIG51bWJlciBvZiBiaXRzIHBlciB3b3JkCisgKiBAdW5pZGlyOiBzdXBwb3J0cyB1bmlkaXJlY3Rpb24gdHJhbnNmZXJzCisgKiBAZXh0ZW5kZWRfY3I6IDMyIGJpdCB3aWRlIGNvbnRyb2wgcmVnaXN0ZXIgMCB3aXRoIGV4dHJhCisgKiBmZWF0dXJlcyBhbmQgZXh0cmEgZmVhdHVyZXMgaW4gQ1IxIGFzIGZvdW5kIGluIHRoZSBTVCB2YXJpYW50cworICogQHBsMDIzOiBzdXBwb3J0cyBhIHN1YnNldCBvZiB0aGUgU1QgZXh0ZW5zaW9ucyBjYWxsZWQgIlBMMDIzIgorICovCitzdHJ1Y3QgdmVuZG9yX2RhdGEgeworCWludCBmaWZvZGVwdGg7CisJaW50IG1heF9icHc7CisJYm9vbCB1bmlkaXI7CisJYm9vbCBleHRlbmRlZF9jcjsKKwlib29sIHBsMDIzOworCWJvb2wgbG9vcGJhY2s7Cit9OworCisvKioKKyAqIHN0cnVjdCBwbDAyMiAtIFRoaXMgaXMgdGhlIHByaXZhdGUgU1NQIGRyaXZlciBkYXRhIHN0cnVjdHVyZQorICogQGFkZXY6IEFNQkEgZGV2aWNlIG1vZGVsIGhvb2t1cAorICogQHZlbmRvcjogdmVuZG9yIGRhdGEgZm9yIHRoZSBJUCBibG9jaworICogQHBoeWJhc2U6IHRoZSBwaHlzaWNhbCBtZW1vcnkgd2hlcmUgdGhlIFNTUCBkZXZpY2UgcmVzaWRlcworICogQHZpcnRiYXNlOiB0aGUgdmlydHVhbCBtZW1vcnkgd2hlcmUgdGhlIFNTUCBpcyBtYXBwZWQKKyAqIEBjbGs6IG91dGdvaW5nIGNsb2NrICJTUElDTEsiIGZvciB0aGUgU1BJIGJ1cworICogQG1hc3RlcjogU1BJIGZyYW1ld29yayBob29rdXAKKyAqIEBtYXN0ZXJfaW5mbzogY29udHJvbGxlci1zcGVjaWZpYyBkYXRhIGZyb20gbWFjaGluZSBzZXR1cAorICogQHdvcmtxdWV1ZTogYSB3b3JrcXVldWUgb24gd2hpY2ggYW55IHNwaV9tZXNzYWdlIHJlcXVlc3QgaXMgcXVldWVkCisgKiBAcHVtcF9tZXNzYWdlczogd29yayBzdHJ1Y3QgZm9yIHNjaGVkdWxpbmcgd29yayB0byB0aGUgd29ya3F1ZXVlCisgKiBAcXVldWVfbG9jazogc3BpbmxvY2sgdG8gc3luY3JvbmlzZSBhY2Nlc3MgdG8gbWVzc2FnZSBxdWV1ZQorICogQHF1ZXVlOiBtZXNzYWdlIHF1ZXVlCisgKiBAYnVzeTogd29ya3F1ZXVlIGlzIGJ1c3kKKyAqIEBydW5uaW5nOiB3b3JrcXVldWUgaXMgcnVubmluZworICogQHB1bXBfdHJhbnNmZXJzOiBUYXNrbGV0IHVzZWQgaW4gSW50ZXJydXB0IFRyYW5zZmVyIG1vZGUKKyAqIEBjdXJfbXNnOiBQb2ludGVyIHRvIGN1cnJlbnQgc3BpX21lc3NhZ2UgYmVpbmcgcHJvY2Vzc2VkCisgKiBAY3VyX3RyYW5zZmVyOiBQb2ludGVyIHRvIGN1cnJlbnQgc3BpX3RyYW5zZmVyCisgKiBAY3VyX2NoaXA6IHBvaW50ZXIgdG8gY3VycmVudCBjbGllbnRzIGNoaXAoYXNzaWduZWQgZnJvbSBjb250cm9sbGVyX3N0YXRlKQorICogQHR4OiBjdXJyZW50IHBvc2l0aW9uIGluIFRYIGJ1ZmZlciB0byBiZSByZWFkCisgKiBAdHhfZW5kOiBlbmQgcG9zaXRpb24gaW4gVFggYnVmZmVyIHRvIGJlIHJlYWQKKyAqIEByeDogY3VycmVudCBwb3NpdGlvbiBpbiBSWCBidWZmZXIgdG8gYmUgd3JpdHRlbgorICogQHJ4X2VuZDogZW5kIHBvc2l0aW9uIGluIFJYIGJ1ZmZlciB0byBiZSB3cml0dGVuCisgKiBAcmVhZDogdGhlIHR5cGUgb2YgcmVhZCBjdXJyZW50bHkgZ29pbmcgb24KKyAqIEB3cml0ZTogdGhlIHR5cGUgb2Ygd3JpdGUgY3VycmVudGx5IGdvaW5nIG9uCisgKiBAZXhwX2ZpZm9fbGV2ZWw6IGV4cGVjdGVkIEZJRk8gbGV2ZWwKKyAqIEBkbWFfcnhfY2hhbm5lbDogb3B0aW9uYWwgY2hhbm5lbCBmb3IgUlggRE1BCisgKiBAZG1hX3R4X2NoYW5uZWw6IG9wdGlvbmFsIGNoYW5uZWwgZm9yIFRYIERNQQorICogQHNndF9yeDogc2NhdHRlcnRhYmxlIGZvciB0aGUgUlggdHJhbnNmZXIKKyAqIEBzZ3RfdHg6IHNjYXR0ZXJ0YWJsZSBmb3IgdGhlIFRYIHRyYW5zZmVyCisgKiBAZHVtbXlwYWdlOiBhIGR1bW15IHBhZ2UgdXNlZCBmb3IgZHJpdmluZyBkYXRhIG9uIHRoZSBidXMgd2l0aCBETUEKKyAqLworc3RydWN0IHBsMDIyIHsKKwlzdHJ1Y3QgYW1iYV9kZXZpY2UJCSphZGV2OworCXN0cnVjdCB2ZW5kb3JfZGF0YQkJKnZlbmRvcjsKKwlyZXNvdXJjZV9zaXplX3QJCQlwaHliYXNlOworCXZvaWQgX19pb21lbQkJCSp2aXJ0YmFzZTsKKwlzdHJ1Y3QgY2xrCQkJKmNsazsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkJKm1hc3RlcjsKKwlzdHJ1Y3QgcGwwMjJfc3NwX2NvbnRyb2xsZXIJKm1hc3Rlcl9pbmZvOworCS8qIERyaXZlciBtZXNzYWdlIHF1ZXVlICovCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSp3b3JrcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0CQlwdW1wX21lc3NhZ2VzOworCXNwaW5sb2NrX3QJCQlxdWV1ZV9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJCXF1ZXVlOworCWJvb2wJCQkJYnVzeTsKKwlib29sCQkJCXJ1bm5pbmc7CisJLyogTWVzc2FnZSB0cmFuc2ZlciBwdW1wICovCisJc3RydWN0IHRhc2tsZXRfc3RydWN0CQlwdW1wX3RyYW5zZmVyczsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJCSpjdXJfbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJCSpjdXJfdHJhbnNmZXI7CisJc3RydWN0IGNoaXBfZGF0YQkJKmN1cl9jaGlwOworCXZvaWQJCQkJKnR4OworCXZvaWQJCQkJKnR4X2VuZDsKKwl2b2lkCQkJCSpyeDsKKwl2b2lkCQkJCSpyeF9lbmQ7CisJZW51bSBzc3BfcmVhZGluZwkJcmVhZDsKKwllbnVtIHNzcF93cml0aW5nCQl3cml0ZTsKKwl1MzIJCQkJZXhwX2ZpZm9fbGV2ZWw7CisJZW51bSBzc3BfcnhfbGV2ZWxfdHJpZwkJcnhfbGV2X3RyaWc7CisJZW51bSBzc3BfdHhfbGV2ZWxfdHJpZwkJdHhfbGV2X3RyaWc7CisJLyogRE1BIHNldHRpbmdzICovCisjaWZkZWYgQ09ORklHX0RNQV9FTkdJTkUKKwlzdHJ1Y3QgZG1hX2NoYW4JCQkqZG1hX3J4X2NoYW5uZWw7CisJc3RydWN0IGRtYV9jaGFuCQkJKmRtYV90eF9jaGFubmVsOworCXN0cnVjdCBzZ190YWJsZQkJCXNndF9yeDsKKwlzdHJ1Y3Qgc2dfdGFibGUJCQlzZ3RfdHg7CisJY2hhcgkJCQkqZHVtbXlwYWdlOworI2VuZGlmCit9OworCisvKioKKyAqIHN0cnVjdCBjaGlwX2RhdGEgLSBUbyBtYWludGFpbiBydW50aW1lIHN0YXRlIG9mIFNTUCBmb3IgZWFjaCBjbGllbnQgY2hpcAorICogQGNyMDogVmFsdWUgb2YgY29udHJvbCByZWdpc3RlciBDUjAgb2YgU1NQIC0gb24gbGF0ZXIgU1QgdmFyaWFudHMgdGhpcworICogICAgICAgcmVnaXN0ZXIgaXMgMzIgYml0cyB3aWRlIHJhdGhlciB0aGFuIGp1c3QgMTYKKyAqIEBjcjE6IFZhbHVlIG9mIGNvbnRyb2wgcmVnaXN0ZXIgQ1IxIG9mIFNTUAorICogQGRtYWNyOiBWYWx1ZSBvZiBETUEgY29udHJvbCBSZWdpc3RlciBvZiBTU1AKKyAqIEBjcHNyOiBWYWx1ZSBvZiBDbG9jayBwcmVzY2FsZSByZWdpc3RlcgorICogQG5fYnl0ZXM6IGhvdyBtYW55IGJ5dGVzKHBvd2VyIG9mIDIpIHJlcWQgZm9yIGEgZ2l2ZW4gZGF0YSB3aWR0aCBvZiBjbGllbnQKKyAqIEBlbmFibGVfZG1hOiBXaGV0aGVyIHRvIGVuYWJsZSBETUEgb3Igbm90CisgKiBAcmVhZDogZnVuY3Rpb24gcHRyIHRvIGJlIHVzZWQgdG8gcmVhZCB3aGVuIGRvaW5nIHhmZXIgZm9yIHRoaXMgY2hpcAorICogQHdyaXRlOiBmdW5jdGlvbiBwdHIgdG8gYmUgdXNlZCB0byB3cml0ZSB3aGVuIGRvaW5nIHhmZXIgZm9yIHRoaXMgY2hpcAorICogQGNzX2NvbnRyb2w6IGNoaXAgc2VsZWN0IGNhbGxiYWNrIHByb3ZpZGVkIGJ5IGNoaXAKKyAqIEB4ZmVyX3R5cGU6IHBvbGxpbmcvaW50ZXJydXB0L0RNQQorICoKKyAqIFJ1bnRpbWUgc3RhdGUgb2YgdGhlIFNTUCBjb250cm9sbGVyLCBtYWludGFpbmVkIHBlciBjaGlwLAorICogVGhpcyB3b3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IG1lc3NhZ2UgdGhhdCB3b3VsZCBiZSBzZXJ2ZWQKKyAqLworc3RydWN0IGNoaXBfZGF0YSB7CisJdTMyIGNyMDsKKwl1MTYgY3IxOworCXUxNiBkbWFjcjsKKwl1MTYgY3BzcjsKKwl1OCBuX2J5dGVzOworCWJvb2wgZW5hYmxlX2RtYTsKKwllbnVtIHNzcF9yZWFkaW5nIHJlYWQ7CisJZW51bSBzc3Bfd3JpdGluZyB3cml0ZTsKKwl2b2lkICgqY3NfY29udHJvbCkgKHUzMiBjb21tYW5kKTsKKwlpbnQgeGZlcl90eXBlOworfTsKKworLyoqCisgKiBudWxsX2NzX2NvbnRyb2wgLSBEdW1teSBjaGlwIHNlbGVjdCBmdW5jdGlvbgorICogQGNvbW1hbmQ6IHNlbGVjdC9kZWxlY3QgdGhlIGNoaXAKKyAqCisgKiBJZiBubyBjaGlwIHNlbGVjdCBmdW5jdGlvbiBpcyBwcm92aWRlZCBieSBjbGllbnQgdGhpcyBpcyB1c2VkIGFzIGR1bW15CisgKiBjaGlwIHNlbGVjdAorICovCitzdGF0aWMgdm9pZCBudWxsX2NzX2NvbnRyb2wodTMyIGNvbW1hbmQpCit7CisJcHJfZGVidWcoInBsMDIyOiBkdW1teSBjaGlwIHNlbGVjdCBjb250cm9sLCBDUz0weCV4XG4iLCBjb21tYW5kKTsKK30KKworLyoqCisgKiBnaXZlYmFjayAtIGN1cnJlbnQgc3BpX21lc3NhZ2UgaXMgb3Zlciwgc2NoZWR1bGUgbmV4dCBtZXNzYWdlIGFuZCBjYWxsCisgKiBjYWxsYmFjayBvZiB0aGlzIG1lc3NhZ2UuIEFzc3VtZXMgdGhhdCBjYWxsZXIgYWxyZWFkeQorICogc2V0IG1lc3NhZ2UtPnN0YXR1czsgZG1hIGFuZCBwaW8gaXJxcyBhcmUgYmxvY2tlZAorICogQHBsMDIyOiBTU1AgZHJpdmVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgZ2l2ZWJhY2soc3RydWN0IHBsMDIyICpwbDAyMikKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpsYXN0X3RyYW5zZmVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNwaV9tZXNzYWdlICptc2c7CisJdm9pZCAoKmN1cnJfY3NfY29udHJvbCkgKHUzMiBjb21tYW5kKTsKKworCS8qCisJICogVGhpcyBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIGNoaXAgc2VsZWN0IGZ1bmN0aW9uCisJICogaXMgbmVlZGVkIGJlY2F1c2Ugd2Ugc2V0IGN1cnJfY2hpcCB0byBOVUxMCisJICogYXMgYSBzdGVwIHRvd2FyZCB0ZXJtaW5pbmF0aW5nIHRoZSBtZXNzYWdlLgorCSAqLworCWN1cnJfY3NfY29udHJvbCA9IHBsMDIyLT5jdXJfY2hpcC0+Y3NfY29udHJvbDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGwwMjItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwltc2cgPSBwbDAyMi0+Y3VyX21zZzsKKwlwbDAyMi0+Y3VyX21zZyA9IE5VTEw7CisJcGwwMjItPmN1cl90cmFuc2ZlciA9IE5VTEw7CisJcGwwMjItPmN1cl9jaGlwID0gTlVMTDsKKwlxdWV1ZV93b3JrKHBsMDIyLT53b3JrcXVldWUsICZwbDAyMi0+cHVtcF9tZXNzYWdlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGwwMjItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWxhc3RfdHJhbnNmZXIgPSBsaXN0X2VudHJ5KG1zZy0+dHJhbnNmZXJzLnByZXYsCisJCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsCisJCQkJCXRyYW5zZmVyX2xpc3QpOworCisJLyogRGVsYXkgaWYgcmVxdWVzdGVkIGJlZm9yZSBhbnkgY2hhbmdlIGluIGNoaXAgc2VsZWN0ICovCisJaWYgKGxhc3RfdHJhbnNmZXItPmRlbGF5X3VzZWNzKQorCQkvKgorCQkgKiBGSVhNRTogVGhpcyBydW5zIGluIGludGVycnVwdCBjb250ZXh0LgorCQkgKiBJcyB0aGlzIHJlYWxseSBzbWFydD8KKwkJICovCisJCXVkZWxheShsYXN0X3RyYW5zZmVyLT5kZWxheV91c2Vjcyk7CisKKwkvKgorCSAqIERyb3AgY2hpcCBzZWxlY3QgVU5MRVNTIGNzX2NoYW5nZSBpcyB0cnVlIG9yIHdlIGFyZSByZXR1cm5pbmcKKwkgKiBhIG1lc3NhZ2Ugd2l0aCBhbiBlcnJvciwgb3IgbmV4dCBtZXNzYWdlIGlzIGZvciBhbm90aGVyIGNoaXAKKwkgKi8KKwlpZiAoIWxhc3RfdHJhbnNmZXItPmNzX2NoYW5nZSkKKwkJY3Vycl9jc19jb250cm9sKFNTUF9DSElQX0RFU0VMRUNUKTsKKwllbHNlIHsKKwkJc3RydWN0IHNwaV9tZXNzYWdlICpuZXh0X21zZzsKKworCQkvKiBIb2xkaW5nIG9mIGNzIHdhcyBoaW50ZWQsIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorCQkgKiB0aGUgbmV4dCBtZXNzYWdlIGlzIGZvciB0aGUgc2FtZSBjaGlwLiAgRG9uJ3Qgd2FzdGUKKwkJICogdGltZSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVzdHMgdW5sZXNzIHRoaXMgd2FzIGhpbnRlZC4KKwkJICoKKwkJICogV2UgY2Fubm90IHBvc3Rwb25lIHRoaXMgdW50aWwgcHVtcF9tZXNzYWdlcywgYmVjYXVzZQorCQkgKiBhZnRlciBjYWxsaW5nIG1zZy0+Y29tcGxldGUgKGJlbG93KSB0aGUgZHJpdmVyIHRoYXQKKwkJICogc2VudCB0aGUgY3VycmVudCBtZXNzYWdlIGNvdWxkIGJlIHVubG9hZGVkLCB3aGljaAorCQkgKiBjb3VsZCBpbnZhbGlkYXRlIHRoZSBjc19jb250cm9sKCkgY2FsbGJhY2suLi4KKwkJICovCisKKwkJLyogZ2V0IGEgcG9pbnRlciB0byB0aGUgbmV4dCBtZXNzYWdlLCBpZiBhbnkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCWlmIChsaXN0X2VtcHR5KCZwbDAyMi0+cXVldWUpKQorCQkJbmV4dF9tc2cgPSBOVUxMOworCQllbHNlCisJCQluZXh0X21zZyA9IGxpc3RfZW50cnkocGwwMjItPnF1ZXVlLm5leHQsCisJCQkJCXN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbDAyMi0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJCS8qIHNlZSBpZiB0aGUgbmV4dCBhbmQgY3VycmVudCBtZXNzYWdlcyBwb2ludAorCQkgKiB0byB0aGUgc2FtZSBjaGlwCisJCSAqLworCQlpZiAobmV4dF9tc2cgJiYgbmV4dF9tc2ctPnNwaSAhPSBtc2ctPnNwaSkKKwkJCW5leHRfbXNnID0gTlVMTDsKKwkJaWYgKCFuZXh0X21zZyB8fCBtc2ctPnN0YXRlID09IFNUQVRFX0VSUk9SKQorCQkJY3Vycl9jc19jb250cm9sKFNTUF9DSElQX0RFU0VMRUNUKTsKKwl9CisJbXNnLT5zdGF0ZSA9IE5VTEw7CisJaWYgKG1zZy0+Y29tcGxldGUpCisJCW1zZy0+Y29tcGxldGUobXNnLT5jb250ZXh0KTsKKwkvKiBUaGlzIG1lc3NhZ2UgaXMgY29tcGxldGVkLCBzbyBsZXQncyB0dXJuIG9mZiB0aGUgY2xvY2tzICYgcG93ZXIgKi8KKwljbGtfZGlzYWJsZShwbDAyMi0+Y2xrKTsKKwlhbWJhX3BjbGtfZGlzYWJsZShwbDAyMi0+YWRldik7CisJYW1iYV92Y29yZV9kaXNhYmxlKHBsMDIyLT5hZGV2KTsKKwlwbV9ydW50aW1lX3B1dCgmcGwwMjItPmFkZXYtPmRldik7Cit9CisKKy8qKgorICogZmx1c2ggLSBmbHVzaCB0aGUgRklGTyB0byByZWFjaCBhIGNsZWFuIHN0YXRlCisgKiBAcGwwMjI6IFNTUCBkcml2ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW50IGZsdXNoKHN0cnVjdCBwbDAyMiAqcGwwMjIpCit7CisJdW5zaWduZWQgbG9uZyBsaW1pdCA9IGxvb3BzX3Blcl9qaWZmeSA8PCAxOworCisJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwgImZsdXNoXG4iKTsKKwlkbyB7CisJCXdoaWxlIChyZWFkdyhTU1BfU1IocGwwMjItPnZpcnRiYXNlKSkgJiBTU1BfU1JfTUFTS19STkUpCisJCQlyZWFkdyhTU1BfRFIocGwwMjItPnZpcnRiYXNlKSk7CisJfSB3aGlsZSAoKHJlYWR3KFNTUF9TUihwbDAyMi0+dmlydGJhc2UpKSAmIFNTUF9TUl9NQVNLX0JTWSkgJiYgbGltaXQtLSk7CisKKwlwbDAyMi0+ZXhwX2ZpZm9fbGV2ZWwgPSAwOworCisJcmV0dXJuIGxpbWl0OworfQorCisvKioKKyAqIHJlc3RvcmVfc3RhdGUgLSBMb2FkIGNvbmZpZ3VyYXRpb24gb2YgY3VycmVudCBjaGlwCisgKiBAcGwwMjI6IFNTUCBkcml2ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCByZXN0b3JlX3N0YXRlKHN0cnVjdCBwbDAyMiAqcGwwMjIpCit7CisJc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9IHBsMDIyLT5jdXJfY2hpcDsKKworCWlmIChwbDAyMi0+dmVuZG9yLT5leHRlbmRlZF9jcikKKwkJd3JpdGVsKGNoaXAtPmNyMCwgU1NQX0NSMChwbDAyMi0+dmlydGJhc2UpKTsKKwllbHNlCisJCXdyaXRldyhjaGlwLT5jcjAsIFNTUF9DUjAocGwwMjItPnZpcnRiYXNlKSk7CisJd3JpdGV3KGNoaXAtPmNyMSwgU1NQX0NSMShwbDAyMi0+dmlydGJhc2UpKTsKKwl3cml0ZXcoY2hpcC0+ZG1hY3IsIFNTUF9ETUFDUihwbDAyMi0+dmlydGJhc2UpKTsKKwl3cml0ZXcoY2hpcC0+Y3BzciwgU1NQX0NQU1IocGwwMjItPnZpcnRiYXNlKSk7CisJd3JpdGV3KERJU0FCTEVfQUxMX0lOVEVSUlVQVFMsIFNTUF9JTVNDKHBsMDIyLT52aXJ0YmFzZSkpOworCXdyaXRldyhDTEVBUl9BTExfSU5URVJSVVBUUywgU1NQX0lDUihwbDAyMi0+dmlydGJhc2UpKTsKK30KKworLyoKKyAqIERlZmF1bHQgU1NQIFJlZ2lzdGVyIFZhbHVlcworICovCisjZGVmaW5lIERFRkFVTFRfU1NQX1JFR19DUjAgKCBcCisJR0VOX01BU0tfQklUUyhTU1BfREFUQV9CSVRTXzEyLCBTU1BfQ1IwX01BU0tfRFNTLCAwKQl8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9JTlRFUkZBQ0VfTU9UT1JPTEFfU1BJLCBTU1BfQ1IwX01BU0tfRlJGLCA0KSB8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9DTEtfUE9MX0lETEVfTE9XLCBTU1BfQ1IwX01BU0tfU1BPLCA2KSB8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9DTEtfU0VDT05EX0VER0UsIFNTUF9DUjBfTUFTS19TUEgsIDcpIHwgXAorCUdFTl9NQVNLX0JJVFMoU1NQX0RFRkFVTFRfQ0xLUkFURSwgU1NQX0NSMF9NQVNLX1NDUiwgOCkgXAorKQorCisvKiBTVCB2ZXJzaW9ucyBoYXZlIHNsaWdodGx5IGRpZmZlcmVudCBiaXQgbGF5b3V0ICovCisjZGVmaW5lIERFRkFVTFRfU1NQX1JFR19DUjBfU1QgKCBcCisJR0VOX01BU0tfQklUUyhTU1BfREFUQV9CSVRTXzEyLCBTU1BfQ1IwX01BU0tfRFNTX1NULCAwKQl8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9NSUNST1dJUkVfQ0hBTk5FTF9GVUxMX0RVUExFWCwgU1NQX0NSMF9NQVNLX0hBTEZEVVBfU1QsIDUpIHwgXAorCUdFTl9NQVNLX0JJVFMoU1NQX0NMS19QT0xfSURMRV9MT1csIFNTUF9DUjBfTUFTS19TUE8sIDYpIHwgXAorCUdFTl9NQVNLX0JJVFMoU1NQX0NMS19TRUNPTkRfRURHRSwgU1NQX0NSMF9NQVNLX1NQSCwgNykgfCBcCisJR0VOX01BU0tfQklUUyhTU1BfREVGQVVMVF9DTEtSQVRFLCBTU1BfQ1IwX01BU0tfU0NSLCA4KSB8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9CSVRTXzgsIFNTUF9DUjBfTUFTS19DU1NfU1QsIDE2KQl8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9JTlRFUkZBQ0VfTU9UT1JPTEFfU1BJLCBTU1BfQ1IwX01BU0tfRlJGX1NULCAyMSkgXAorKQorCisvKiBUaGUgUEwwMjMgdmVyc2lvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQgYWdhaW4gKi8KKyNkZWZpbmUgREVGQVVMVF9TU1BfUkVHX0NSMF9TVF9QTDAyMyAoIFwKKwlHRU5fTUFTS19CSVRTKFNTUF9EQVRBX0JJVFNfMTIsIFNTUF9DUjBfTUFTS19EU1NfU1QsIDApCXwgXAorCUdFTl9NQVNLX0JJVFMoU1NQX0NMS19QT0xfSURMRV9MT1csIFNTUF9DUjBfTUFTS19TUE8sIDYpIHwgXAorCUdFTl9NQVNLX0JJVFMoU1NQX0NMS19TRUNPTkRfRURHRSwgU1NQX0NSMF9NQVNLX1NQSCwgNykgfCBcCisJR0VOX01BU0tfQklUUyhTU1BfREVGQVVMVF9DTEtSQVRFLCBTU1BfQ1IwX01BU0tfU0NSLCA4KSBcCispCisKKyNkZWZpbmUgREVGQVVMVF9TU1BfUkVHX0NSMSAoIFwKKwlHRU5fTUFTS19CSVRTKExPT1BCQUNLX0RJU0FCTEVELCBTU1BfQ1IxX01BU0tfTEJNLCAwKSB8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9ESVNBQkxFRCwgU1NQX0NSMV9NQVNLX1NTRSwgMSkgfCBcCisJR0VOX01BU0tfQklUUyhTU1BfTUFTVEVSLCBTU1BfQ1IxX01BU0tfTVMsIDIpIHwgXAorCUdFTl9NQVNLX0JJVFMoRE9fTk9UX0RSSVZFX1RYLCBTU1BfQ1IxX01BU0tfU09ELCAzKSBcCispCisKKy8qIFNUIHZlcnNpb25zIGV4dGVuZCB0aGlzIHJlZ2lzdGVyIHRvIHVzZSBhbGwgMTYgYml0cyAqLworI2RlZmluZSBERUZBVUxUX1NTUF9SRUdfQ1IxX1NUICggXAorCURFRkFVTFRfU1NQX1JFR19DUjEgfCBcCisJR0VOX01BU0tfQklUUyhTU1BfUlhfTVNCLCBTU1BfQ1IxX01BU0tfUkVORE5fU1QsIDQpIHwgXAorCUdFTl9NQVNLX0JJVFMoU1NQX1RYX01TQiwgU1NQX0NSMV9NQVNLX1RFTkROX1NULCA1KSB8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9NV0lSRV9XQUlUX1pFUk8sIFNTUF9DUjFfTUFTS19NV0FJVF9TVCwgNikgfFwKKwlHRU5fTUFTS19CSVRTKFNTUF9SWF8xX09SX01PUkVfRUxFTSwgU1NQX0NSMV9NQVNLX1JYSUZMU0VMX1NULCA3KSB8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9UWF8xX09SX01PUkVfRU1QVFlfTE9DLCBTU1BfQ1IxX01BU0tfVFhJRkxTRUxfU1QsIDEwKSBcCispCisKKy8qCisgKiBUaGUgUEwwMjMgdmFyaWFudCBoYXMgZnVydGhlciBkaWZmZXJlbmNlczogbm8gbG9vcGJhY2sgbW9kZSwgbm8gbWljcm93aXJlCisgKiBzdXBwb3J0LCBhbmQgYSBuZXcgY2xvY2sgZmVlZGJhY2sgZGVsYXkgc2V0dGluZy4KKyAqLworI2RlZmluZSBERUZBVUxUX1NTUF9SRUdfQ1IxX1NUX1BMMDIzICggXAorCUdFTl9NQVNLX0JJVFMoU1NQX0RJU0FCTEVELCBTU1BfQ1IxX01BU0tfU1NFLCAxKSB8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9NQVNURVIsIFNTUF9DUjFfTUFTS19NUywgMikgfCBcCisJR0VOX01BU0tfQklUUyhET19OT1RfRFJJVkVfVFgsIFNTUF9DUjFfTUFTS19TT0QsIDMpIHwgXAorCUdFTl9NQVNLX0JJVFMoU1NQX1JYX01TQiwgU1NQX0NSMV9NQVNLX1JFTkROX1NULCA0KSB8IFwKKwlHRU5fTUFTS19CSVRTKFNTUF9UWF9NU0IsIFNTUF9DUjFfTUFTS19URU5ETl9TVCwgNSkgfCBcCisJR0VOX01BU0tfQklUUyhTU1BfUlhfMV9PUl9NT1JFX0VMRU0sIFNTUF9DUjFfTUFTS19SWElGTFNFTF9TVCwgNykgfCBcCisJR0VOX01BU0tfQklUUyhTU1BfVFhfMV9PUl9NT1JFX0VNUFRZX0xPQywgU1NQX0NSMV9NQVNLX1RYSUZMU0VMX1NULCAxMCkgfCBcCisJR0VOX01BU0tfQklUUyhTU1BfRkVFREJBQ0tfQ0xLX0RFTEFZX05PTkUsIFNTUF9DUjFfTUFTS19GQkNMS0RFTF9TVCwgMTMpIFwKKykKKworI2RlZmluZSBERUZBVUxUX1NTUF9SRUdfQ1BTUiAoIFwKKwlHRU5fTUFTS19CSVRTKFNTUF9ERUZBVUxUX1BSRVNDQUxFLCBTU1BfQ1BTUl9NQVNLX0NQU0RWU1IsIDApIFwKKykKKworI2RlZmluZSBERUZBVUxUX1NTUF9SRUdfRE1BQ1IgKFwKKwlHRU5fTUFTS19CSVRTKFNTUF9ETUFfRElTQUJMRUQsIFNTUF9ETUFDUl9NQVNLX1JYRE1BRSwgMCkgfCBcCisJR0VOX01BU0tfQklUUyhTU1BfRE1BX0RJU0FCTEVELCBTU1BfRE1BQ1JfTUFTS19UWERNQUUsIDEpIFwKKykKKworLyoqCisgKiBsb2FkX3NzcF9kZWZhdWx0X2NvbmZpZyAtIExvYWQgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBTU1AKKyAqIEBwbDAyMjogU1NQIGRyaXZlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGxvYWRfc3NwX2RlZmF1bHRfY29uZmlnKHN0cnVjdCBwbDAyMiAqcGwwMjIpCit7CisJaWYgKHBsMDIyLT52ZW5kb3ItPnBsMDIzKSB7CisJCXdyaXRlbChERUZBVUxUX1NTUF9SRUdfQ1IwX1NUX1BMMDIzLCBTU1BfQ1IwKHBsMDIyLT52aXJ0YmFzZSkpOworCQl3cml0ZXcoREVGQVVMVF9TU1BfUkVHX0NSMV9TVF9QTDAyMywgU1NQX0NSMShwbDAyMi0+dmlydGJhc2UpKTsKKwl9IGVsc2UgaWYgKHBsMDIyLT52ZW5kb3ItPmV4dGVuZGVkX2NyKSB7CisJCXdyaXRlbChERUZBVUxUX1NTUF9SRUdfQ1IwX1NULCBTU1BfQ1IwKHBsMDIyLT52aXJ0YmFzZSkpOworCQl3cml0ZXcoREVGQVVMVF9TU1BfUkVHX0NSMV9TVCwgU1NQX0NSMShwbDAyMi0+dmlydGJhc2UpKTsKKwl9IGVsc2UgeworCQl3cml0ZXcoREVGQVVMVF9TU1BfUkVHX0NSMCwgU1NQX0NSMChwbDAyMi0+dmlydGJhc2UpKTsKKwkJd3JpdGV3KERFRkFVTFRfU1NQX1JFR19DUjEsIFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSk7CisJfQorCXdyaXRldyhERUZBVUxUX1NTUF9SRUdfRE1BQ1IsIFNTUF9ETUFDUihwbDAyMi0+dmlydGJhc2UpKTsKKwl3cml0ZXcoREVGQVVMVF9TU1BfUkVHX0NQU1IsIFNTUF9DUFNSKHBsMDIyLT52aXJ0YmFzZSkpOworCXdyaXRldyhESVNBQkxFX0FMTF9JTlRFUlJVUFRTLCBTU1BfSU1TQyhwbDAyMi0+dmlydGJhc2UpKTsKKwl3cml0ZXcoQ0xFQVJfQUxMX0lOVEVSUlVQVFMsIFNTUF9JQ1IocGwwMjItPnZpcnRiYXNlKSk7Cit9CisKKy8qKgorICogVGhpcyB3aWxsIHdyaXRlIHRvIFRYIGFuZCByZWFkIGZyb20gUlggYWNjb3JkaW5nIHRvIHRoZSBwYXJhbWV0ZXJzCisgKiBzZXQgaW4gcGwwMjIuCisgKi8KK3N0YXRpYyB2b2lkIHJlYWR3cml0ZXIoc3RydWN0IHBsMDIyICpwbDAyMikKK3sKKworCS8qCisJICogVGhlIEZJRk8gZGVwdGggaXMgZGlmZmVyZW50IGJldHdlZW4gcHJpbWVjZWxsIHZhcmlhbnRzLgorCSAqIEkgYmVsaWV2ZSBmaWxsaW5nIGluIHRvbyBtdWNoIGluIHRoZSBGSUZPIG1pZ2h0IGNhdXNlCisJICogZXJyb25zIGluIDhiaXQgd2lkZSB0cmFuc2ZlcnMgb24gQVJNIHZhcmlhbnRzIChqdXN0IDggd29yZHMKKwkgKiBGSUZPLCBtZWFucyBvbmx5IDh4OCA9IDY0IGJpdHMgaW4gRklGTykgYXQgbGVhc3QuCisJICoKKwkgKiBUbyBwcmV2ZW50IHRoaXMgaXNzdWUsIHRoZSBUWCBGSUZPIGlzIG9ubHkgZmlsbGVkIHRvIHRoZQorCSAqIHVudXNlZCBSWCBGSUZPIGZpbGwgbGVuZ3RoLCByZWdhcmRsZXNzIG9mIHdoYXQgdGhlIFRYCisJICogRklGTyBzdGF0dXMgZmxhZyBpbmRpY2F0ZXMuCisJICovCisJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwKKwkJIiVzLCByeDogJXAsIHJ4ZW5kOiAlcCwgdHg6ICVwLCB0eGVuZDogJXBcbiIsCisJCV9fZnVuY19fLCBwbDAyMi0+cngsIHBsMDIyLT5yeF9lbmQsIHBsMDIyLT50eCwgcGwwMjItPnR4X2VuZCk7CisKKwkvKiBSZWFkIGFzIG11Y2ggYXMgeW91IGNhbiAqLworCXdoaWxlICgocmVhZHcoU1NQX1NSKHBsMDIyLT52aXJ0YmFzZSkpICYgU1NQX1NSX01BU0tfUk5FKQorCSAgICAgICAmJiAocGwwMjItPnJ4IDwgcGwwMjItPnJ4X2VuZCkpIHsKKwkJc3dpdGNoIChwbDAyMi0+cmVhZCkgeworCQljYXNlIFJFQURJTkdfTlVMTDoKKwkJCXJlYWR3KFNTUF9EUihwbDAyMi0+dmlydGJhc2UpKTsKKwkJCWJyZWFrOworCQljYXNlIFJFQURJTkdfVTg6CisJCQkqKHU4ICopIChwbDAyMi0+cngpID0KKwkJCQlyZWFkdyhTU1BfRFIocGwwMjItPnZpcnRiYXNlKSkgJiAweEZGVTsKKwkJCWJyZWFrOworCQljYXNlIFJFQURJTkdfVTE2OgorCQkJKih1MTYgKikgKHBsMDIyLT5yeCkgPQorCQkJCSh1MTYpIHJlYWR3KFNTUF9EUihwbDAyMi0+dmlydGJhc2UpKTsKKwkJCWJyZWFrOworCQljYXNlIFJFQURJTkdfVTMyOgorCQkJKih1MzIgKikgKHBsMDIyLT5yeCkgPQorCQkJCXJlYWRsKFNTUF9EUihwbDAyMi0+dmlydGJhc2UpKTsKKwkJCWJyZWFrOworCQl9CisJCXBsMDIyLT5yeCArPSAocGwwMjItPmN1cl9jaGlwLT5uX2J5dGVzKTsKKwkJcGwwMjItPmV4cF9maWZvX2xldmVsLS07CisJfQorCS8qCisJICogV3JpdGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB1cCB0byB0aGUgUlggRklGTyBzaXplCisJICovCisJd2hpbGUgKChwbDAyMi0+ZXhwX2ZpZm9fbGV2ZWwgPCBwbDAyMi0+dmVuZG9yLT5maWZvZGVwdGgpCisJICAgICAgICYmIChwbDAyMi0+dHggPCBwbDAyMi0+dHhfZW5kKSkgeworCQlzd2l0Y2ggKHBsMDIyLT53cml0ZSkgeworCQljYXNlIFdSSVRJTkdfTlVMTDoKKwkJCXdyaXRldygweDAsIFNTUF9EUihwbDAyMi0+dmlydGJhc2UpKTsKKwkJCWJyZWFrOworCQljYXNlIFdSSVRJTkdfVTg6CisJCQl3cml0ZXcoKih1OCAqKSAocGwwMjItPnR4KSwgU1NQX0RSKHBsMDIyLT52aXJ0YmFzZSkpOworCQkJYnJlYWs7CisJCWNhc2UgV1JJVElOR19VMTY6CisJCQl3cml0ZXcoKCoodTE2ICopIChwbDAyMi0+dHgpKSwgU1NQX0RSKHBsMDIyLT52aXJ0YmFzZSkpOworCQkJYnJlYWs7CisJCWNhc2UgV1JJVElOR19VMzI6CisJCQl3cml0ZWwoKih1MzIgKikgKHBsMDIyLT50eCksIFNTUF9EUihwbDAyMi0+dmlydGJhc2UpKTsKKwkJCWJyZWFrOworCQl9CisJCXBsMDIyLT50eCArPSAocGwwMjItPmN1cl9jaGlwLT5uX2J5dGVzKTsKKwkJcGwwMjItPmV4cF9maWZvX2xldmVsKys7CisJCS8qCisJCSAqIFRoaXMgaW5uZXIgcmVhZGVyIHRha2VzIGNhcmUgb2YgdGhpbmdzIGFwcGVhcmluZyBpbiB0aGUgUlgKKwkJICogRklGTyBhcyB3ZSdyZSB0cmFuc21pdHRpbmcuIFRoaXMgd2lsbCBoYXBwZW4gYSBsb3Qgc2luY2UgdGhlCisJCSAqIGNsb2NrIHN0YXJ0cyBydW5uaW5nIHdoZW4geW91IHB1dCB0aGluZ3MgaW50byB0aGUgVFggRklGTywKKwkJICogYW5kIHRoZW4gdGhpbmdzIGFyZSBjb250aW51b3VzbHkgY2xvY2tlZCBpbnRvIHRoZSBSWCBGSUZPLgorCQkgKi8KKwkJd2hpbGUgKChyZWFkdyhTU1BfU1IocGwwMjItPnZpcnRiYXNlKSkgJiBTU1BfU1JfTUFTS19STkUpCisJCSAgICAgICAmJiAocGwwMjItPnJ4IDwgcGwwMjItPnJ4X2VuZCkpIHsKKwkJCXN3aXRjaCAocGwwMjItPnJlYWQpIHsKKwkJCWNhc2UgUkVBRElOR19OVUxMOgorCQkJCXJlYWR3KFNTUF9EUihwbDAyMi0+dmlydGJhc2UpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVBRElOR19VODoKKwkJCQkqKHU4ICopIChwbDAyMi0+cngpID0KKwkJCQkJcmVhZHcoU1NQX0RSKHBsMDIyLT52aXJ0YmFzZSkpICYgMHhGRlU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFQURJTkdfVTE2OgorCQkJCSoodTE2ICopIChwbDAyMi0+cngpID0KKwkJCQkJKHUxNikgcmVhZHcoU1NQX0RSKHBsMDIyLT52aXJ0YmFzZSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUFESU5HX1UzMjoKKwkJCQkqKHUzMiAqKSAocGwwMjItPnJ4KSA9CisJCQkJCXJlYWRsKFNTUF9EUihwbDAyMi0+dmlydGJhc2UpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBsMDIyLT5yeCArPSAocGwwMjItPmN1cl9jaGlwLT5uX2J5dGVzKTsKKwkJCXBsMDIyLT5leHBfZmlmb19sZXZlbC0tOworCQl9CisJfQorCS8qCisJICogV2hlbiB3ZSBleGl0IGhlcmUgdGhlIFRYIEZJRk8gc2hvdWxkIGJlIGZ1bGwgYW5kIHRoZSBSWCBGSUZPCisJICogc2hvdWxkIGJlIGVtcHR5CisJICovCit9CisKKworLyoqCisgKiBuZXh0X3RyYW5zZmVyIC0gTW92ZSB0byB0aGUgTmV4dCB0cmFuc2ZlciBpbiB0aGUgY3VycmVudCBzcGkgbWVzc2FnZQorICogQHBsMDIyOiBTU1AgZHJpdmVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1vdmVzIHRob3VnaCB0aGUgbGlua2VkIGxpc3Qgb2Ygc3BpIHRyYW5zZmVycyBpbiB0aGUKKyAqIGN1cnJlbnQgc3BpIG1lc3NhZ2UgYW5kIHJldHVybnMgd2l0aCB0aGUgc3RhdGUgb2YgY3VycmVudCBzcGkKKyAqIG1lc3NhZ2UgaS5lIHdoZXRoZXIgaXRzIGxhc3QgdHJhbnNmZXIgaXMgZG9uZShTVEFURV9ET05FKSBvcgorICogTmV4dCB0cmFuc2ZlciBpcyByZWFkeShTVEFURV9SVU5OSU5HKQorICovCitzdGF0aWMgdm9pZCAqbmV4dF90cmFuc2ZlcihzdHJ1Y3QgcGwwMjIgKnBsMDIyKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnID0gcGwwMjItPmN1cl9tc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnMgPSBwbDAyMi0+Y3VyX3RyYW5zZmVyOworCisJLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyICovCisJaWYgKHRyYW5zLT50cmFuc2Zlcl9saXN0Lm5leHQgIT0gJm1zZy0+dHJhbnNmZXJzKSB7CisJCXBsMDIyLT5jdXJfdHJhbnNmZXIgPQorCQkgICAgbGlzdF9lbnRyeSh0cmFucy0+dHJhbnNmZXJfbGlzdC5uZXh0LAorCQkJICAgICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOworCQlyZXR1cm4gU1RBVEVfUlVOTklORzsKKwl9CisJcmV0dXJuIFNUQVRFX0RPTkU7Cit9CisKKy8qCisgKiBUaGlzIERNQSBmdW5jdGlvbmFsaXR5IGlzIG9ubHkgY29tcGlsZWQgaW4gaWYgd2UgaGF2ZQorICogYWNjZXNzIHRvIHRoZSBnZW5lcmljIERNQSBkZXZpY2VzL0RNQSBlbmdpbmUuCisgKi8KKyNpZmRlZiBDT05GSUdfRE1BX0VOR0lORQorc3RhdGljIHZvaWQgdW5tYXBfZnJlZV9kbWFfc2NhdHRlcihzdHJ1Y3QgcGwwMjIgKnBsMDIyKQoreworCS8qIFVubWFwIGFuZCBmcmVlIHRoZSBTRyB0YWJsZXMgKi8KKwlkbWFfdW5tYXBfc2cocGwwMjItPmRtYV90eF9jaGFubmVsLT5kZXZpY2UtPmRldiwgcGwwMjItPnNndF90eC5zZ2wsCisJCSAgICAgcGwwMjItPnNndF90eC5uZW50cywgRE1BX1RPX0RFVklDRSk7CisJZG1hX3VubWFwX3NnKHBsMDIyLT5kbWFfcnhfY2hhbm5lbC0+ZGV2aWNlLT5kZXYsIHBsMDIyLT5zZ3Rfcnguc2dsLAorCQkgICAgIHBsMDIyLT5zZ3RfcngubmVudHMsIERNQV9GUk9NX0RFVklDRSk7CisJc2dfZnJlZV90YWJsZSgmcGwwMjItPnNndF9yeCk7CisJc2dfZnJlZV90YWJsZSgmcGwwMjItPnNndF90eCk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9jYWxsYmFjayh2b2lkICpkYXRhKQoreworCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBkYXRhOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnID0gcGwwMjItPmN1cl9tc2c7CisKKwlCVUdfT04oIXBsMDIyLT5zZ3Rfcnguc2dsKTsKKworI2lmZGVmIFZFUkJPU0VfREVCVUcKKwkvKgorCSAqIE9wdGlvbmFsbHkgZHVtcCBvdXQgYnVmZmVycyB0byBpbnNwZWN0IGNvbnRlbnRzLCB0aGlzIGlzCisJICogZ29vZCBpZiB5b3Ugd2FudCB0byBjb252aW5jZSB5b3Vyc2VsZiB0aGF0IHRoZSBsb29wYmFjaworCSAqIHJlYWQvd3JpdGUgY29udGVudHMgYXJlIHRoZSBzYW1lLCB3aGVuIGFkb3B0aW5nIHRvIGEgbmV3CisJICogRE1BIGVuZ2luZS4KKwkgKi8KKwl7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJCXVuc2lnbmVkIGludCBpOworCisJCWRtYV9zeW5jX3NnX2Zvcl9jcHUoJnBsMDIyLT5hZGV2LT5kZXYsCisJCQkJICAgIHBsMDIyLT5zZ3Rfcnguc2dsLAorCQkJCSAgICBwbDAyMi0+c2d0X3J4Lm5lbnRzLAorCQkJCSAgICBETUFfRlJPTV9ERVZJQ0UpOworCisJCWZvcl9lYWNoX3NnKHBsMDIyLT5zZ3Rfcnguc2dsLCBzZywgcGwwMjItPnNndF9yeC5uZW50cywgaSkgeworCQkJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwgIlNQSSBSWCBTRyBFTlRSWTogJWQiLCBpKTsKKwkJCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiU1BJIFJYOiAiLAorCQkJCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsCisJCQkJICAgICAgIDE2LAorCQkJCSAgICAgICAxLAorCQkJCSAgICAgICBzZ192aXJ0KHNnKSwKKwkJCQkgICAgICAgc2dfZG1hX2xlbihzZyksCisJCQkJICAgICAgIDEpOworCQl9CisJCWZvcl9lYWNoX3NnKHBsMDIyLT5zZ3RfdHguc2dsLCBzZywgcGwwMjItPnNndF90eC5uZW50cywgaSkgeworCQkJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwgIlNQSSBUWCBTRyBFTlRSWTogJWQiLCBpKTsKKwkJCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiU1BJIFRYOiAiLAorCQkJCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsCisJCQkJICAgICAgIDE2LAorCQkJCSAgICAgICAxLAorCQkJCSAgICAgICBzZ192aXJ0KHNnKSwKKwkJCQkgICAgICAgc2dfZG1hX2xlbihzZyksCisJCQkJICAgICAgIDEpOworCQl9CisJfQorI2VuZGlmCisKKwl1bm1hcF9mcmVlX2RtYV9zY2F0dGVyKHBsMDIyKTsKKworCS8qIFVwZGF0ZSB0b3RhbCBieXRlcyB0cmFuc2ZlcnJlZCAqLworCW1zZy0+YWN0dWFsX2xlbmd0aCArPSBwbDAyMi0+Y3VyX3RyYW5zZmVyLT5sZW47CisJaWYgKHBsMDIyLT5jdXJfdHJhbnNmZXItPmNzX2NoYW5nZSkKKwkJcGwwMjItPmN1cl9jaGlwLT4KKwkJCWNzX2NvbnRyb2woU1NQX0NISVBfREVTRUxFQ1QpOworCisJLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyICovCisJbXNnLT5zdGF0ZSA9IG5leHRfdHJhbnNmZXIocGwwMjIpOworCXRhc2tsZXRfc2NoZWR1bGUoJnBsMDIyLT5wdW1wX3RyYW5zZmVycyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2RtYV9zY2F0dGVyKHN0cnVjdCBwbDAyMiAqcGwwMjIsCisJCQkgICAgICB2b2lkICpidWZmZXIsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoLAorCQkJICAgICAgc3RydWN0IHNnX3RhYmxlICpzZ3RhYikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBieXRlc2xlZnQgPSBsZW5ndGg7CisJdm9pZCAqYnVmcCA9IGJ1ZmZlcjsKKwlpbnQgbWFwYnl0ZXM7CisJaW50IGk7CisKKwlpZiAoYnVmZmVyKSB7CisJCWZvcl9lYWNoX3NnKHNndGFiLT5zZ2wsIHNnLCBzZ3RhYi0+bmVudHMsIGkpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGVyZSBhcmUgbGVzcyBieXRlcyBsZWZ0IHRoYW4gd2hhdCBmaXRzCisJCQkgKiBpbiB0aGUgY3VycmVudCBwYWdlIChwbHVzIHBhZ2UgYWxpZ25tZW50IG9mZnNldCkKKwkJCSAqIHdlIGp1c3QgZmVlZCBpbiB0aGlzLCBlbHNlIHdlIHN0dWZmIGluIGFzIG11Y2gKKwkJCSAqIGFzIHdlIGNhbi4KKwkJCSAqLworCQkJaWYgKGJ5dGVzbGVmdCA8IChQQUdFX1NJWkUgLSBvZmZzZXRfaW5fcGFnZShidWZwKSkpCisJCQkJbWFwYnl0ZXMgPSBieXRlc2xlZnQ7CisJCQllbHNlCisJCQkJbWFwYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXRfaW5fcGFnZShidWZwKTsKKwkJCXNnX3NldF9wYWdlKHNnLCB2aXJ0X3RvX3BhZ2UoYnVmcCksCisJCQkJICAgIG1hcGJ5dGVzLCBvZmZzZXRfaW5fcGFnZShidWZwKSk7CisJCQlidWZwICs9IG1hcGJ5dGVzOworCQkJYnl0ZXNsZWZ0IC09IG1hcGJ5dGVzOworCQkJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwKKwkJCQkic2V0IFJYL1RYIHRhcmdldCBwYWdlIEAgJXAsICVkIGJ5dGVzLCAlZCBsZWZ0XG4iLAorCQkJCWJ1ZnAsIG1hcGJ5dGVzLCBieXRlc2xlZnQpOworCQl9CisJfSBlbHNlIHsKKwkJLyogTWFwIHRoZSBkdW1teSBidWZmZXIgb24gZXZlcnkgcGFnZSAqLworCQlmb3JfZWFjaF9zZyhzZ3RhYi0+c2dsLCBzZywgc2d0YWItPm5lbnRzLCBpKSB7CisJCQlpZiAoYnl0ZXNsZWZ0IDwgUEFHRV9TSVpFKQorCQkJCW1hcGJ5dGVzID0gYnl0ZXNsZWZ0OworCQkJZWxzZQorCQkJCW1hcGJ5dGVzID0gUEFHRV9TSVpFOworCQkJc2dfc2V0X3BhZ2Uoc2csIHZpcnRfdG9fcGFnZShwbDAyMi0+ZHVtbXlwYWdlKSwKKwkJCQkgICAgbWFwYnl0ZXMsIDApOworCQkJYnl0ZXNsZWZ0IC09IG1hcGJ5dGVzOworCQkJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwKKwkJCQkic2V0IFJYL1RYIHRvIGR1bW15IHBhZ2UgJWQgYnl0ZXMsICVkIGxlZnRcbiIsCisJCQkJbWFwYnl0ZXMsIGJ5dGVzbGVmdCk7CisKKwkJfQorCX0KKwlCVUdfT04oYnl0ZXNsZWZ0KTsKK30KKworLyoqCisgKiBjb25maWd1cmVfZG1hIC0gY29uZmlndXJlcyB0aGUgY2hhbm5lbHMgZm9yIHRoZSBuZXh0IHRyYW5zZmVyCisgKiBAcGwwMjI6IFNTUCBkcml2ZXIncyBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbnQgY29uZmlndXJlX2RtYShzdHJ1Y3QgcGwwMjIgKnBsMDIyKQoreworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIHJ4X2NvbmYgPSB7CisJCS5zcmNfYWRkciA9IFNTUF9EUihwbDAyMi0+cGh5YmFzZSksCisJCS5kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0UsCisJfTsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyB0eF9jb25mID0geworCQkuZHN0X2FkZHIgPSBTU1BfRFIocGwwMjItPnBoeWJhc2UpLAorCQkuZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRSwKKwl9OworCXVuc2lnbmVkIGludCBwYWdlczsKKwlpbnQgcmV0OworCWludCByeF9zZ2xlbiwgdHhfc2dsZW47CisJc3RydWN0IGRtYV9jaGFuICpyeGNoYW4gPSBwbDAyMi0+ZG1hX3J4X2NoYW5uZWw7CisJc3RydWN0IGRtYV9jaGFuICp0eGNoYW4gPSBwbDAyMi0+ZG1hX3R4X2NoYW5uZWw7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpyeGRlc2M7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eGRlc2M7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjaGFubmVscyBhcmUgYXZhaWxhYmxlICovCisJaWYgKCFyeGNoYW4gfHwgIXR4Y2hhbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIElmIHN1cHBsaWVkLCB0aGUgRE1BIGJ1cnN0c2l6ZSBzaG91bGQgZXF1YWwgdGhlIEZJRk8gdHJpZ2dlciBsZXZlbC4KKwkgKiBOb3RpY2UgdGhhdCB0aGUgRE1BIGVuZ2luZSB1c2VzIG9uZS10by1vbmUgbWFwcGluZy4gU2luY2Ugd2UgY2FuCisJICogbm90IHRyaWdnZXIgb24gMiBlbGVtZW50cyB0aGlzIG5lZWRzIGV4cGxpY2l0IG1hcHBpbmcgcmF0aGVyIHRoYW4KKwkgKiBjYWxjdWxhdGlvbi4KKwkgKi8KKwlzd2l0Y2ggKHBsMDIyLT5yeF9sZXZfdHJpZykgeworCWNhc2UgU1NQX1JYXzFfT1JfTU9SRV9FTEVNOgorCQlyeF9jb25mLnNyY19tYXhidXJzdCA9IDE7CisJCWJyZWFrOworCWNhc2UgU1NQX1JYXzRfT1JfTU9SRV9FTEVNOgorCQlyeF9jb25mLnNyY19tYXhidXJzdCA9IDQ7CisJCWJyZWFrOworCWNhc2UgU1NQX1JYXzhfT1JfTU9SRV9FTEVNOgorCQlyeF9jb25mLnNyY19tYXhidXJzdCA9IDg7CisJCWJyZWFrOworCWNhc2UgU1NQX1JYXzE2X09SX01PUkVfRUxFTToKKwkJcnhfY29uZi5zcmNfbWF4YnVyc3QgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBTU1BfUlhfMzJfT1JfTU9SRV9FTEVNOgorCQlyeF9jb25mLnNyY19tYXhidXJzdCA9IDMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyeF9jb25mLnNyY19tYXhidXJzdCA9IHBsMDIyLT52ZW5kb3ItPmZpZm9kZXB0aCA+PiAxOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHBsMDIyLT50eF9sZXZfdHJpZykgeworCWNhc2UgU1NQX1RYXzFfT1JfTU9SRV9FTVBUWV9MT0M6CisJCXR4X2NvbmYuZHN0X21heGJ1cnN0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTU1BfVFhfNF9PUl9NT1JFX0VNUFRZX0xPQzoKKwkJdHhfY29uZi5kc3RfbWF4YnVyc3QgPSA0OworCQlicmVhazsKKwljYXNlIFNTUF9UWF84X09SX01PUkVfRU1QVFlfTE9DOgorCQl0eF9jb25mLmRzdF9tYXhidXJzdCA9IDg7CisJCWJyZWFrOworCWNhc2UgU1NQX1RYXzE2X09SX01PUkVfRU1QVFlfTE9DOgorCQl0eF9jb25mLmRzdF9tYXhidXJzdCA9IDE2OworCQlicmVhazsKKwljYXNlIFNTUF9UWF8zMl9PUl9NT1JFX0VNUFRZX0xPQzoKKwkJdHhfY29uZi5kc3RfbWF4YnVyc3QgPSAzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHhfY29uZi5kc3RfbWF4YnVyc3QgPSBwbDAyMi0+dmVuZG9yLT5maWZvZGVwdGggPj4gMTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChwbDAyMi0+cmVhZCkgeworCWNhc2UgUkVBRElOR19OVUxMOgorCQkvKiBVc2UgdGhlIHNhbWUgYXMgZm9yIHdyaXRpbmcgKi8KKwkJcnhfY29uZi5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF9VTkRFRklORUQ7CisJCWJyZWFrOworCWNhc2UgUkVBRElOR19VODoKKwkJcnhfY29uZi5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7CisJCWJyZWFrOworCWNhc2UgUkVBRElOR19VMTY6CisJCXJ4X2NvbmYuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzsKKwkJYnJlYWs7CisJY2FzZSBSRUFESU5HX1UzMjoKKwkJcnhfY29uZi5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHBsMDIyLT53cml0ZSkgeworCWNhc2UgV1JJVElOR19OVUxMOgorCQkvKiBVc2UgdGhlIHNhbWUgYXMgZm9yIHJlYWRpbmcgKi8KKwkJdHhfY29uZi5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF9VTkRFRklORUQ7CisJCWJyZWFrOworCWNhc2UgV1JJVElOR19VODoKKwkJdHhfY29uZi5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7CisJCWJyZWFrOworCWNhc2UgV1JJVElOR19VMTY6CisJCXR4X2NvbmYuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzsKKwkJYnJlYWs7CisJY2FzZSBXUklUSU5HX1UzMjoKKwkJdHhfY29uZi5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOworCQlicmVhazsKKwl9CisKKwkvKiBTUEkgcGVjdWxhcml0eTogd2UgbmVlZCB0byByZWFkIGFuZCB3cml0ZSB0aGUgc2FtZSB3aWR0aCAqLworCWlmIChyeF9jb25mLnNyY19hZGRyX3dpZHRoID09IERNQV9TTEFWRV9CVVNXSURUSF9VTkRFRklORUQpCisJCXJ4X2NvbmYuc3JjX2FkZHJfd2lkdGggPSB0eF9jb25mLmRzdF9hZGRyX3dpZHRoOworCWlmICh0eF9jb25mLmRzdF9hZGRyX3dpZHRoID09IERNQV9TTEFWRV9CVVNXSURUSF9VTkRFRklORUQpCisJCXR4X2NvbmYuZHN0X2FkZHJfd2lkdGggPSByeF9jb25mLnNyY19hZGRyX3dpZHRoOworCUJVR19PTihyeF9jb25mLnNyY19hZGRyX3dpZHRoICE9IHR4X2NvbmYuZHN0X2FkZHJfd2lkdGgpOworCisJZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhyeGNoYW4sICZyeF9jb25mKTsKKwlkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHR4Y2hhbiwgJnR4X2NvbmYpOworCisJLyogQ3JlYXRlIHNnbGlzdHMgZm9yIHRoZSB0cmFuc2ZlcnMgKi8KKwlwYWdlcyA9IChwbDAyMi0+Y3VyX3RyYW5zZmVyLT5sZW4gPj4gUEFHRV9TSElGVCkgKyAxOworCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsICJ1c2luZyAlZCBwYWdlcyBmb3IgdHJhbnNmZXJcbiIsIHBhZ2VzKTsKKworCXJldCA9IHNnX2FsbG9jX3RhYmxlKCZwbDAyMi0+c2d0X3J4LCBwYWdlcywgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfYWxsb2Nfcnhfc2c7CisKKwlyZXQgPSBzZ19hbGxvY190YWJsZSgmcGwwMjItPnNndF90eCwgcGFnZXMsIEdGUF9LRVJORUwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2FsbG9jX3R4X3NnOworCisJLyogRmlsbCBpbiB0aGUgc2NhdHRlcmxpc3RzIGZvciB0aGUgUlgrVFggYnVmZmVycyAqLworCXNldHVwX2RtYV9zY2F0dGVyKHBsMDIyLCBwbDAyMi0+cngsCisJCQkgIHBsMDIyLT5jdXJfdHJhbnNmZXItPmxlbiwgJnBsMDIyLT5zZ3RfcngpOworCXNldHVwX2RtYV9zY2F0dGVyKHBsMDIyLCBwbDAyMi0+dHgsCisJCQkgIHBsMDIyLT5jdXJfdHJhbnNmZXItPmxlbiwgJnBsMDIyLT5zZ3RfdHgpOworCisJLyogTWFwIERNQSBidWZmZXJzICovCisJcnhfc2dsZW4gPSBkbWFfbWFwX3NnKHJ4Y2hhbi0+ZGV2aWNlLT5kZXYsIHBsMDIyLT5zZ3Rfcnguc2dsLAorCQkJICAgcGwwMjItPnNndF9yeC5uZW50cywgRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoIXJ4X3NnbGVuKQorCQlnb3RvIGVycl9yeF9zZ21hcDsKKworCXR4X3NnbGVuID0gZG1hX21hcF9zZyh0eGNoYW4tPmRldmljZS0+ZGV2LCBwbDAyMi0+c2d0X3R4LnNnbCwKKwkJCSAgIHBsMDIyLT5zZ3RfdHgubmVudHMsIERNQV9UT19ERVZJQ0UpOworCWlmICghdHhfc2dsZW4pCisJCWdvdG8gZXJyX3R4X3NnbWFwOworCisJLyogU2VuZCBib3RoIHNjYXR0ZXJsaXN0cyAqLworCXJ4ZGVzYyA9IHJ4Y2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhyeGNoYW4sCisJCQkJICAgICAgcGwwMjItPnNndF9yeC5zZ2wsCisJCQkJICAgICAgcnhfc2dsZW4sCisJCQkJICAgICAgRE1BX0ZST01fREVWSUNFLAorCQkJCSAgICAgIERNQV9QUkVQX0lOVEVSUlVQVCB8IERNQV9DVFJMX0FDSyk7CisJaWYgKCFyeGRlc2MpCisJCWdvdG8gZXJyX3J4ZGVzYzsKKworCXR4ZGVzYyA9IHR4Y2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyh0eGNoYW4sCisJCQkJICAgICAgcGwwMjItPnNndF90eC5zZ2wsCisJCQkJICAgICAgdHhfc2dsZW4sCisJCQkJICAgICAgRE1BX1RPX0RFVklDRSwKKwkJCQkgICAgICBETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ1RSTF9BQ0spOworCWlmICghdHhkZXNjKQorCQlnb3RvIGVycl90eGRlc2M7CisKKwkvKiBQdXQgdGhlIGNhbGxiYWNrIG9uIHRoZSBSWCB0cmFuc2ZlciBvbmx5LCB0aGF0IHNob3VsZCBmaW5pc2ggbGFzdCAqLworCXJ4ZGVzYy0+Y2FsbGJhY2sgPSBkbWFfY2FsbGJhY2s7CisJcnhkZXNjLT5jYWxsYmFja19wYXJhbSA9IHBsMDIyOworCisJLyogU3VibWl0IGFuZCBmaXJlIFJYIGFuZCBUWCB3aXRoIFRYIGxhc3Qgc28gd2UncmUgcmVhZHkgdG8gcmVhZCEgKi8KKwlkbWFlbmdpbmVfc3VibWl0KHJ4ZGVzYyk7CisJZG1hZW5naW5lX3N1Ym1pdCh0eGRlc2MpOworCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKHJ4Y2hhbik7CisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcodHhjaGFuKTsKKworCXJldHVybiAwOworCitlcnJfdHhkZXNjOgorCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHR4Y2hhbik7CitlcnJfcnhkZXNjOgorCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHJ4Y2hhbik7CisJZG1hX3VubWFwX3NnKHR4Y2hhbi0+ZGV2aWNlLT5kZXYsIHBsMDIyLT5zZ3RfdHguc2dsLAorCQkgICAgIHBsMDIyLT5zZ3RfdHgubmVudHMsIERNQV9UT19ERVZJQ0UpOworZXJyX3R4X3NnbWFwOgorCWRtYV91bm1hcF9zZyhyeGNoYW4tPmRldmljZS0+ZGV2LCBwbDAyMi0+c2d0X3J4LnNnbCwKKwkJICAgICBwbDAyMi0+c2d0X3R4Lm5lbnRzLCBETUFfRlJPTV9ERVZJQ0UpOworZXJyX3J4X3NnbWFwOgorCXNnX2ZyZWVfdGFibGUoJnBsMDIyLT5zZ3RfdHgpOworZXJyX2FsbG9jX3R4X3NnOgorCXNnX2ZyZWVfdGFibGUoJnBsMDIyLT5zZ3RfcngpOworZXJyX2FsbG9jX3J4X3NnOgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwbDAyMl9kbWFfcHJvYmUoc3RydWN0IHBsMDIyICpwbDAyMikKK3sKKwlkbWFfY2FwX21hc2tfdCBtYXNrOworCisJLyogVHJ5IHRvIGFjcXVpcmUgYSBnZW5lcmljIERNQSBlbmdpbmUgc2xhdmUgY2hhbm5lbCAqLworCWRtYV9jYXBfemVybyhtYXNrKTsKKwlkbWFfY2FwX3NldChETUFfU0xBVkUsIG1hc2spOworCS8qCisJICogV2UgbmVlZCBib3RoIFJYIGFuZCBUWCBjaGFubmVscyB0byBkbyBETUEsIGVsc2UgZG8gbm9uZQorCSAqIG9mIHRoZW0uCisJICovCisJcGwwMjItPmRtYV9yeF9jaGFubmVsID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLAorCQkJCQkgICAgcGwwMjItPm1hc3Rlcl9pbmZvLT5kbWFfZmlsdGVyLAorCQkJCQkgICAgcGwwMjItPm1hc3Rlcl9pbmZvLT5kbWFfcnhfcGFyYW0pOworCWlmICghcGwwMjItPmRtYV9yeF9jaGFubmVsKSB7CisJCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsICJubyBSWCBETUEgY2hhbm5lbCFcbiIpOworCQlnb3RvIGVycl9ub19yeGNoYW47CisJfQorCisJcGwwMjItPmRtYV90eF9jaGFubmVsID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLAorCQkJCQkgICAgcGwwMjItPm1hc3Rlcl9pbmZvLT5kbWFfZmlsdGVyLAorCQkJCQkgICAgcGwwMjItPm1hc3Rlcl9pbmZvLT5kbWFfdHhfcGFyYW0pOworCWlmICghcGwwMjItPmRtYV90eF9jaGFubmVsKSB7CisJCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsICJubyBUWCBETUEgY2hhbm5lbCFcbiIpOworCQlnb3RvIGVycl9ub190eGNoYW47CisJfQorCisJcGwwMjItPmR1bW15cGFnZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBsMDIyLT5kdW1teXBhZ2UpIHsKKwkJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwgIm5vIERNQSBkdW1teXBhZ2UhXG4iKTsKKwkJZ290byBlcnJfbm9fZHVtbXlwYWdlOworCX0KKworCWRldl9pbmZvKCZwbDAyMi0+YWRldi0+ZGV2LCAic2V0dXAgZm9yIERNQSBvbiBSWCAlcywgVFggJXNcbiIsCisJCSBkbWFfY2hhbl9uYW1lKHBsMDIyLT5kbWFfcnhfY2hhbm5lbCksCisJCSBkbWFfY2hhbl9uYW1lKHBsMDIyLT5kbWFfdHhfY2hhbm5lbCkpOworCisJcmV0dXJuIDA7CisKK2Vycl9ub19kdW1teXBhZ2U6CisJZG1hX3JlbGVhc2VfY2hhbm5lbChwbDAyMi0+ZG1hX3R4X2NoYW5uZWwpOworZXJyX25vX3R4Y2hhbjoKKwlkbWFfcmVsZWFzZV9jaGFubmVsKHBsMDIyLT5kbWFfcnhfY2hhbm5lbCk7CisJcGwwMjItPmRtYV9yeF9jaGFubmVsID0gTlVMTDsKK2Vycl9ub19yeGNoYW46CisJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gd29yayBpbiBkbWEgbW9kZSwgd29yayB3aXRob3V0IGRtYSFcbiIpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCB0ZXJtaW5hdGVfZG1hKHN0cnVjdCBwbDAyMiAqcGwwMjIpCit7CisJc3RydWN0IGRtYV9jaGFuICpyeGNoYW4gPSBwbDAyMi0+ZG1hX3J4X2NoYW5uZWw7CisJc3RydWN0IGRtYV9jaGFuICp0eGNoYW4gPSBwbDAyMi0+ZG1hX3R4X2NoYW5uZWw7CisKKwlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChyeGNoYW4pOworCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHR4Y2hhbik7CisJdW5tYXBfZnJlZV9kbWFfc2NhdHRlcihwbDAyMik7Cit9CisKK3N0YXRpYyB2b2lkIHBsMDIyX2RtYV9yZW1vdmUoc3RydWN0IHBsMDIyICpwbDAyMikKK3sKKwlpZiAocGwwMjItPmJ1c3kpCisJCXRlcm1pbmF0ZV9kbWEocGwwMjIpOworCWlmIChwbDAyMi0+ZG1hX3R4X2NoYW5uZWwpCisJCWRtYV9yZWxlYXNlX2NoYW5uZWwocGwwMjItPmRtYV90eF9jaGFubmVsKTsKKwlpZiAocGwwMjItPmRtYV9yeF9jaGFubmVsKQorCQlkbWFfcmVsZWFzZV9jaGFubmVsKHBsMDIyLT5kbWFfcnhfY2hhbm5lbCk7CisJa2ZyZWUocGwwMjItPmR1bW15cGFnZSk7Cit9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBjb25maWd1cmVfZG1hKHN0cnVjdCBwbDAyMiAqcGwwMjIpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBsMDIyX2RtYV9wcm9iZShzdHJ1Y3QgcGwwMjIgKnBsMDIyKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGwwMjJfZG1hX3JlbW92ZShzdHJ1Y3QgcGwwMjIgKnBsMDIyKQoreworfQorI2VuZGlmCisKKy8qKgorICogcGwwMjJfaW50ZXJydXB0X2hhbmRsZXIgLSBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgU1NQIGNvbnRyb2xsZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgaW50ZXJydXB0cyBnZW5lcmF0ZWQgZm9yIGFuIGludGVycnVwdCBiYXNlZCB0cmFuc2Zlci4KKyAqIElmIGEgcmVjZWl2ZSBvdmVycnVuIChST1IpIGludGVycnVwdCBpcyB0aGVyZSB0aGVuIHdlIGRpc2FibGUgU1NQLCBmbGFnIHRoZQorICogY3VycmVudCBtZXNzYWdlJ3Mgc3RhdGUgYXMgU1RBVEVfRVJST1IgYW5kIHNjaGVkdWxlIHRoZSB0YXNrbGV0CisgKiBwdW1wX3RyYW5zZmVycyB3aGljaCB3aWxsIGRvIHRoZSBwb3N0cHJvY2Vzc2luZyBvZiB0aGUgY3VycmVudCBtZXNzYWdlIGJ5CisgKiBjYWxsaW5nIGdpdmViYWNrKCkuIE90aGVyd2lzZSBpdCByZWFkcyBkYXRhIGZyb20gUlggRklGTyB0aWxsIHRoZXJlIGlzIG5vCisgKiBtb3JlIGRhdGEsIGFuZCB3cml0ZXMgZGF0YSBpbiBUWCBGSUZPIHRpbGwgaXQgaXMgbm90IGZ1bGwuIElmIHdlIGNvbXBsZXRlCisgKiB0aGUgdHJhbnNmZXIgd2UgbW92ZSB0byB0aGUgbmV4dCB0cmFuc2ZlciBhbmQgc2NoZWR1bGUgdGhlIHRhc2tsZXQuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBwbDAyMl9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHBsMDIyICpwbDAyMiA9IGRldl9pZDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IHBsMDIyLT5jdXJfbXNnOworCXUxNiBpcnFfc3RhdHVzID0gMDsKKwl1MTYgZmxhZyA9IDA7CisKKwlpZiAodW5saWtlbHkoIW1zZykpIHsKKwkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKKwkJCSJiYWQgbWVzc2FnZSBzdGF0ZSBpbiBpbnRlcnJ1cHQgaGFuZGxlciIpOworCQkvKiBOZXZlciBmYWlsICovCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBSZWFkIHRoZSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisJaXJxX3N0YXR1cyA9IHJlYWR3KFNTUF9NSVMocGwwMjItPnZpcnRiYXNlKSk7CisKKwlpZiAodW5saWtlbHkoIWlycV9zdGF0dXMpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKgorCSAqIFRoaXMgaGFuZGxlcyB0aGUgRklGTyBpbnRlcnJ1cHRzLCB0aGUgdGltZW91dAorCSAqIGludGVycnVwdHMgYXJlIGZsYXRseSBpZ25vcmVkLCB0aGV5IGNhbm5vdCBiZQorCSAqIHRydXN0ZWQuCisJICovCisJaWYgKHVubGlrZWx5KGlycV9zdGF0dXMgJiBTU1BfTUlTX01BU0tfUk9STUlTKSkgeworCQkvKgorCQkgKiBPdmVycnVuIGludGVycnVwdCAtIGJhaWwgb3V0IHNpbmNlIG91ciBEYXRhIGhhcyBiZWVuCisJCSAqIGNvcnJ1cHRlZAorCQkgKi8KKwkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwgIkZJRk8gb3ZlcnJ1blxuIik7CisJCWlmIChyZWFkdyhTU1BfU1IocGwwMjItPnZpcnRiYXNlKSkgJiBTU1BfU1JfTUFTS19SRkYpCisJCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJCSJSWEZJRk8gaXMgZnVsbFxuIik7CisJCWlmIChyZWFkdyhTU1BfU1IocGwwMjItPnZpcnRiYXNlKSkgJiBTU1BfU1JfTUFTS19UTkYpCisJCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJCSJUWEZJRk8gaXMgZnVsbFxuIik7CisKKwkJLyoKKwkJICogRGlzYWJsZSBhbmQgY2xlYXIgaW50ZXJydXB0cywgZGlzYWJsZSBTU1AsCisJCSAqIG1hcmsgbWVzc2FnZSB3aXRoIGJhZCBzdGF0dXMgc28gaXQgY2FuIGJlCisJCSAqIHJldHJpZWQuCisJCSAqLworCQl3cml0ZXcoRElTQUJMRV9BTExfSU5URVJSVVBUUywKKwkJICAgICAgIFNTUF9JTVNDKHBsMDIyLT52aXJ0YmFzZSkpOworCQl3cml0ZXcoQ0xFQVJfQUxMX0lOVEVSUlVQVFMsIFNTUF9JQ1IocGwwMjItPnZpcnRiYXNlKSk7CisJCXdyaXRldygocmVhZHcoU1NQX0NSMShwbDAyMi0+dmlydGJhc2UpKSAmCisJCQkoflNTUF9DUjFfTUFTS19TU0UpKSwgU1NQX0NSMShwbDAyMi0+dmlydGJhc2UpKTsKKwkJbXNnLT5zdGF0ZSA9IFNUQVRFX0VSUk9SOworCisJCS8qIFNjaGVkdWxlIG1lc3NhZ2UgcXVldWUgaGFuZGxlciAqLworCQl0YXNrbGV0X3NjaGVkdWxlKCZwbDAyMi0+cHVtcF90cmFuc2ZlcnMpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmVhZHdyaXRlcihwbDAyMik7CisKKwlpZiAoKHBsMDIyLT50eCA9PSBwbDAyMi0+dHhfZW5kKSAmJiAoZmxhZyA9PSAwKSkgeworCQlmbGFnID0gMTsKKwkJLyogRGlzYWJsZSBUcmFuc21pdCBpbnRlcnJ1cHQgKi8KKwkJd3JpdGV3KHJlYWR3KFNTUF9JTVNDKHBsMDIyLT52aXJ0YmFzZSkpICYKKwkJICAgICAgICh+U1NQX0lNU0NfTUFTS19UWElNKSwKKwkJICAgICAgIFNTUF9JTVNDKHBsMDIyLT52aXJ0YmFzZSkpOworCX0KKworCS8qCisJICogU2luY2UgYWxsIHRyYW5zYWN0aW9ucyBtdXN0IHdyaXRlIGFzIG11Y2ggYXMgc2hhbGwgYmUgcmVhZCwKKwkgKiB3ZSBjYW4gY29uY2x1ZGUgdGhlIGVudGlyZSB0cmFuc2FjdGlvbiBvbmNlIFJYIGlzIGNvbXBsZXRlLgorCSAqIEF0IHRoaXMgcG9pbnQsIGFsbCBUWCB3aWxsIGFsd2F5cyBiZSBmaW5pc2hlZC4KKwkgKi8KKwlpZiAocGwwMjItPnJ4ID49IHBsMDIyLT5yeF9lbmQpIHsKKwkJd3JpdGV3KERJU0FCTEVfQUxMX0lOVEVSUlVQVFMsCisJCSAgICAgICBTU1BfSU1TQyhwbDAyMi0+dmlydGJhc2UpKTsKKwkJd3JpdGV3KENMRUFSX0FMTF9JTlRFUlJVUFRTLCBTU1BfSUNSKHBsMDIyLT52aXJ0YmFzZSkpOworCQlpZiAodW5saWtlbHkocGwwMjItPnJ4ID4gcGwwMjItPnJ4X2VuZCkpIHsKKwkJCWRldl93YXJuKCZwbDAyMi0+YWRldi0+ZGV2LCAicmVhZCAldSBzdXJwbHVzICIKKwkJCQkgImJ5dGVzIChkaWQgeW91IHJlcXVlc3QgYW4gb2RkICIKKwkJCQkgIm51bWJlciBvZiBieXRlcyBvbiBhIDE2Yml0IGJ1cz8pXG4iLAorCQkJCSAodTMyKSAocGwwMjItPnJ4IC0gcGwwMjItPnJ4X2VuZCkpOworCQl9CisJCS8qIFVwZGF0ZSB0b3RhbCBieXRlcyB0cmFuc2ZlcnJlZCAqLworCQltc2ctPmFjdHVhbF9sZW5ndGggKz0gcGwwMjItPmN1cl90cmFuc2Zlci0+bGVuOworCQlpZiAocGwwMjItPmN1cl90cmFuc2Zlci0+Y3NfY2hhbmdlKQorCQkJcGwwMjItPmN1cl9jaGlwLT4KKwkJCQljc19jb250cm9sKFNTUF9DSElQX0RFU0VMRUNUKTsKKwkJLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyICovCisJCW1zZy0+c3RhdGUgPSBuZXh0X3RyYW5zZmVyKHBsMDIyKTsKKwkJdGFza2xldF9zY2hlZHVsZSgmcGwwMjItPnB1bXBfdHJhbnNmZXJzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBUaGlzIHNldHMgdXAgdGhlIHBvaW50ZXJzIHRvIG1lbW9yeSBmb3IgdGhlIG5leHQgbWVzc2FnZSB0bworICogc2VuZCBvdXQgb24gdGhlIFNQSSBidXMuCisgKi8KK3N0YXRpYyBpbnQgc2V0X3VwX25leHRfdHJhbnNmZXIoc3RydWN0IHBsMDIyICpwbDAyMiwKKwkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFuc2ZlcikKK3sKKwlpbnQgcmVzaWR1ZTsKKworCS8qIFNhbml0eSBjaGVjayB0aGUgbWVzc2FnZSBmb3IgdGhpcyBidXMgd2lkdGggKi8KKwlyZXNpZHVlID0gcGwwMjItPmN1cl90cmFuc2Zlci0+bGVuICUgcGwwMjItPmN1cl9jaGlwLT5uX2J5dGVzOworCWlmICh1bmxpa2VseShyZXNpZHVlICE9IDApKSB7CisJCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCisJCQkibWVzc2FnZSBvZiAldSBieXRlcyB0byB0cmFuc21pdCBidXQgdGhlIGN1cnJlbnQgIgorCQkJImNoaXAgYnVzIGhhcyBhIGRhdGEgd2lkdGggb2YgJXUgYnl0ZXMhXG4iLAorCQkJcGwwMjItPmN1cl90cmFuc2Zlci0+bGVuLAorCQkJcGwwMjItPmN1cl9jaGlwLT5uX2J5dGVzKTsKKwkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwgInNraXBwaW5nIHRoaXMgbWVzc2FnZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlwbDAyMi0+dHggPSAodm9pZCAqKXRyYW5zZmVyLT50eF9idWY7CisJcGwwMjItPnR4X2VuZCA9IHBsMDIyLT50eCArIHBsMDIyLT5jdXJfdHJhbnNmZXItPmxlbjsKKwlwbDAyMi0+cnggPSAodm9pZCAqKXRyYW5zZmVyLT5yeF9idWY7CisJcGwwMjItPnJ4X2VuZCA9IHBsMDIyLT5yeCArIHBsMDIyLT5jdXJfdHJhbnNmZXItPmxlbjsKKwlwbDAyMi0+d3JpdGUgPQorCSAgICBwbDAyMi0+dHggPyBwbDAyMi0+Y3VyX2NoaXAtPndyaXRlIDogV1JJVElOR19OVUxMOworCXBsMDIyLT5yZWFkID0gcGwwMjItPnJ4ID8gcGwwMjItPmN1cl9jaGlwLT5yZWFkIDogUkVBRElOR19OVUxMOworCXJldHVybiAwOworfQorCisvKioKKyAqIHB1bXBfdHJhbnNmZXJzIC0gVGFza2xldCBmdW5jdGlvbiB3aGljaCBzY2hlZHVsZXMgbmV4dCB0cmFuc2ZlcgorICogd2hlbiBydW5uaW5nIGluIGludGVycnVwdCBvciBETUEgdHJhbnNmZXIgbW9kZS4KKyAqIEBkYXRhOiBTU1AgZHJpdmVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHB1bXBfdHJhbnNmZXJzKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gKHN0cnVjdCBwbDAyMiAqKSBkYXRhOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzc2FnZSA9IE5VTEw7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnNmZXIgPSBOVUxMOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnByZXZpb3VzID0gTlVMTDsKKworCS8qIEdldCBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uICovCisJbWVzc2FnZSA9IHBsMDIyLT5jdXJfbXNnOworCXRyYW5zZmVyID0gcGwwMjItPmN1cl90cmFuc2ZlcjsKKworCS8qIEhhbmRsZSBmb3IgYWJvcnQgKi8KKwlpZiAobWVzc2FnZS0+c3RhdGUgPT0gU1RBVEVfRVJST1IpIHsKKwkJbWVzc2FnZS0+c3RhdHVzID0gLUVJTzsKKwkJZ2l2ZWJhY2socGwwMjIpOworCQlyZXR1cm47CisJfQorCisJLyogSGFuZGxlIGVuZCBvZiBtZXNzYWdlICovCisJaWYgKG1lc3NhZ2UtPnN0YXRlID09IFNUQVRFX0RPTkUpIHsKKwkJbWVzc2FnZS0+c3RhdHVzID0gMDsKKwkJZ2l2ZWJhY2socGwwMjIpOworCQlyZXR1cm47CisJfQorCisJLyogRGVsYXkgaWYgcmVxdWVzdGVkIGF0IGVuZCBvZiB0cmFuc2ZlciBiZWZvcmUgQ1MgY2hhbmdlICovCisJaWYgKG1lc3NhZ2UtPnN0YXRlID09IFNUQVRFX1JVTk5JTkcpIHsKKwkJcHJldmlvdXMgPSBsaXN0X2VudHJ5KHRyYW5zZmVyLT50cmFuc2Zlcl9saXN0LnByZXYsCisJCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsCisJCQkJCXRyYW5zZmVyX2xpc3QpOworCQlpZiAocHJldmlvdXMtPmRlbGF5X3VzZWNzKQorCQkJLyoKKwkJCSAqIEZJWE1FOiBUaGlzIHJ1bnMgaW4gaW50ZXJydXB0IGNvbnRleHQuCisJCQkgKiBJcyB0aGlzIHJlYWxseSBzbWFydD8KKwkJCSAqLworCQkJdWRlbGF5KHByZXZpb3VzLT5kZWxheV91c2Vjcyk7CisKKwkJLyogRHJvcCBjaGlwIHNlbGVjdCBvbmx5IGlmIGNzX2NoYW5nZSBpcyByZXF1ZXN0ZWQgKi8KKwkJaWYgKHByZXZpb3VzLT5jc19jaGFuZ2UpCisJCQlwbDAyMi0+Y3VyX2NoaXAtPmNzX2NvbnRyb2woU1NQX0NISVBfU0VMRUNUKTsKKwl9IGVsc2UgeworCQkvKiBTVEFURV9TVEFSVCAqLworCQltZXNzYWdlLT5zdGF0ZSA9IFNUQVRFX1JVTk5JTkc7CisJfQorCisJaWYgKHNldF91cF9uZXh0X3RyYW5zZmVyKHBsMDIyLCB0cmFuc2ZlcikpIHsKKwkJbWVzc2FnZS0+c3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJbWVzc2FnZS0+c3RhdHVzID0gLUVJTzsKKwkJZ2l2ZWJhY2socGwwMjIpOworCQlyZXR1cm47CisJfQorCS8qIEZsdXNoIHRoZSBGSUZPcyBhbmQgbGV0J3MgZ28hICovCisJZmx1c2gocGwwMjIpOworCisJaWYgKHBsMDIyLT5jdXJfY2hpcC0+ZW5hYmxlX2RtYSkgeworCQlpZiAoY29uZmlndXJlX2RtYShwbDAyMikpIHsKKwkJCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsCisJCQkJImNvbmZpZ3VyYXRpb24gb2YgRE1BIGZhaWxlZCwgZmFsbCBiYWNrIHRvIGludGVycnVwdCBtb2RlXG4iKTsKKwkJCWdvdG8gZXJyX2NvbmZpZ19kbWE7CisJCX0KKwkJcmV0dXJuOworCX0KKworZXJyX2NvbmZpZ19kbWE6CisJd3JpdGV3KEVOQUJMRV9BTExfSU5URVJSVVBUUywgU1NQX0lNU0MocGwwMjItPnZpcnRiYXNlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2ludGVycnVwdF9kbWFfdHJhbnNmZXIoc3RydWN0IHBsMDIyICpwbDAyMikKK3sKKwl1MzIgaXJxZmxhZ3MgPSBFTkFCTEVfQUxMX0lOVEVSUlVQVFM7CisKKwkvKiBFbmFibGUgdGFyZ2V0IGNoaXAgKi8KKwlwbDAyMi0+Y3VyX2NoaXAtPmNzX2NvbnRyb2woU1NQX0NISVBfU0VMRUNUKTsKKwlpZiAoc2V0X3VwX25leHRfdHJhbnNmZXIocGwwMjIsIHBsMDIyLT5jdXJfdHJhbnNmZXIpKSB7CisJCS8qIEVycm9yIHBhdGggKi8KKwkJcGwwMjItPmN1cl9tc2ctPnN0YXRlID0gU1RBVEVfRVJST1I7CisJCXBsMDIyLT5jdXJfbXNnLT5zdGF0dXMgPSAtRUlPOworCQlnaXZlYmFjayhwbDAyMik7CisJCXJldHVybjsKKwl9CisJLyogSWYgd2UncmUgdXNpbmcgRE1BLCBzZXQgdXAgRE1BIGhlcmUgKi8KKwlpZiAocGwwMjItPmN1cl9jaGlwLT5lbmFibGVfZG1hKSB7CisJCS8qIENvbmZpZ3VyZSBETUEgdHJhbnNmZXIgKi8KKwkJaWYgKGNvbmZpZ3VyZV9kbWEocGwwMjIpKSB7CisJCQlkZXZfZGJnKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJCSJjb25maWd1cmF0aW9uIG9mIERNQSBmYWlsZWQsIGZhbGwgYmFjayB0byBpbnRlcnJ1cHQgbW9kZVxuIik7CisJCQlnb3RvIGVycl9jb25maWdfZG1hOworCQl9CisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBpbiBETUEgbW9kZSwgSVJRIGZyb20gRE1BIGNvbnRyb2xsZXIgKi8KKwkJaXJxZmxhZ3MgPSBESVNBQkxFX0FMTF9JTlRFUlJVUFRTOworCX0KK2Vycl9jb25maWdfZG1hOgorCS8qIEVuYWJsZSBTU1AsIHR1cm4gb24gaW50ZXJydXB0cyAqLworCXdyaXRldygocmVhZHcoU1NQX0NSMShwbDAyMi0+dmlydGJhc2UpKSB8IFNTUF9DUjFfTUFTS19TU0UpLAorCSAgICAgICBTU1BfQ1IxKHBsMDIyLT52aXJ0YmFzZSkpOworCXdyaXRldyhpcnFmbGFncywgU1NQX0lNU0MocGwwMjItPnZpcnRiYXNlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3BvbGxpbmdfdHJhbnNmZXIoc3RydWN0IHBsMDIyICpwbDAyMikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UgPSBOVUxMOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zZmVyID0gTlVMTDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpwcmV2aW91cyA9IE5VTEw7CisJc3RydWN0IGNoaXBfZGF0YSAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIHRpbWUsIHRpbWVvdXQ7CisKKwljaGlwID0gcGwwMjItPmN1cl9jaGlwOworCW1lc3NhZ2UgPSBwbDAyMi0+Y3VyX21zZzsKKworCXdoaWxlIChtZXNzYWdlLT5zdGF0ZSAhPSBTVEFURV9ET05FKSB7CisJCS8qIEhhbmRsZSBmb3IgYWJvcnQgKi8KKwkJaWYgKG1lc3NhZ2UtPnN0YXRlID09IFNUQVRFX0VSUk9SKQorCQkJYnJlYWs7CisJCXRyYW5zZmVyID0gcGwwMjItPmN1cl90cmFuc2ZlcjsKKworCQkvKiBEZWxheSBpZiByZXF1ZXN0ZWQgYXQgZW5kIG9mIHRyYW5zZmVyICovCisJCWlmIChtZXNzYWdlLT5zdGF0ZSA9PSBTVEFURV9SVU5OSU5HKSB7CisJCQlwcmV2aW91cyA9CisJCQkgICAgbGlzdF9lbnRyeSh0cmFuc2Zlci0+dHJhbnNmZXJfbGlzdC5wcmV2LAorCQkJCSAgICAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLCB0cmFuc2Zlcl9saXN0KTsKKwkJCWlmIChwcmV2aW91cy0+ZGVsYXlfdXNlY3MpCisJCQkJdWRlbGF5KHByZXZpb3VzLT5kZWxheV91c2Vjcyk7CisJCQlpZiAocHJldmlvdXMtPmNzX2NoYW5nZSkKKwkJCQlwbDAyMi0+Y3VyX2NoaXAtPmNzX2NvbnRyb2woU1NQX0NISVBfU0VMRUNUKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNUQVRFX1NUQVJUICovCisJCQltZXNzYWdlLT5zdGF0ZSA9IFNUQVRFX1JVTk5JTkc7CisJCQlwbDAyMi0+Y3VyX2NoaXAtPmNzX2NvbnRyb2woU1NQX0NISVBfU0VMRUNUKTsKKwkJfQorCisJCS8qIENvbmZpZ3VyYXRpb24gQ2hhbmdpbmcgUGVyIFRyYW5zZmVyICovCisJCWlmIChzZXRfdXBfbmV4dF90cmFuc2ZlcihwbDAyMiwgdHJhbnNmZXIpKSB7CisJCQkvKiBFcnJvciBwYXRoICovCisJCQltZXNzYWdlLT5zdGF0ZSA9IFNUQVRFX0VSUk9SOworCQkJYnJlYWs7CisJCX0KKwkJLyogRmx1c2ggRklGT3MgYW5kIGVuYWJsZSBTU1AgKi8KKwkJZmx1c2gocGwwMjIpOworCQl3cml0ZXcoKHJlYWR3KFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSkgfCBTU1BfQ1IxX01BU0tfU1NFKSwKKwkJICAgICAgIFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSk7CisKKwkJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwgInBvbGxpbmcgdHJhbnNmZXIgb25nb2luZyAuLi5cbiIpOworCisJCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhTUElfUE9MTElOR19USU1FT1VUKTsKKwkJd2hpbGUgKHBsMDIyLT50eCA8IHBsMDIyLT50eF9lbmQgfHwgcGwwMjItPnJ4IDwgcGwwMjItPnJ4X2VuZCkgeworCQkJdGltZSA9IGppZmZpZXM7CisJCQlyZWFkd3JpdGVyKHBsMDIyKTsKKwkJCWlmICh0aW1lX2FmdGVyKHRpbWUsIHRpbWVvdXQpKSB7CisJCQkJZGV2X3dhcm4oJnBsMDIyLT5hZGV2LT5kZXYsCisJCQkJIiVzOiB0aW1lb3V0IVxuIiwgX19mdW5jX18pOworCQkJCW1lc3NhZ2UtPnN0YXRlID0gU1RBVEVfRVJST1I7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQljcHVfcmVsYXgoKTsKKwkJfQorCisJCS8qIFVwZGF0ZSB0b3RhbCBieXRlIHRyYW5zZmVycmVkICovCisJCW1lc3NhZ2UtPmFjdHVhbF9sZW5ndGggKz0gcGwwMjItPmN1cl90cmFuc2Zlci0+bGVuOworCQlpZiAocGwwMjItPmN1cl90cmFuc2Zlci0+Y3NfY2hhbmdlKQorCQkJcGwwMjItPmN1cl9jaGlwLT5jc19jb250cm9sKFNTUF9DSElQX0RFU0VMRUNUKTsKKwkJLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyICovCisJCW1lc3NhZ2UtPnN0YXRlID0gbmV4dF90cmFuc2ZlcihwbDAyMik7CisJfQorb3V0OgorCS8qIEhhbmRsZSBlbmQgb2YgbWVzc2FnZSAqLworCWlmIChtZXNzYWdlLT5zdGF0ZSA9PSBTVEFURV9ET05FKQorCQltZXNzYWdlLT5zdGF0dXMgPSAwOworCWVsc2UKKwkJbWVzc2FnZS0+c3RhdHVzID0gLUVJTzsKKworCWdpdmViYWNrKHBsMDIyKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogcHVtcF9tZXNzYWdlcyAtIFdvcmtxdWV1ZSBmdW5jdGlvbiB3aGljaCBwcm9jZXNzZXMgc3BpIG1lc3NhZ2UgcXVldWUKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBvZiBTU1AgZHJpdmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlcmUgaXMgYW55IHNwaSBtZXNzYWdlIGluIHRoZSBxdWV1ZSB0aGF0CisgKiBuZWVkcyBwcm9jZXNzaW5nIGFuZCBkZWxlZ2F0ZSBjb250cm9sIHRvIGFwcHJvcHJpYXRlIGZ1bmN0aW9uCisgKiBkb19wb2xsaW5nX3RyYW5zZmVyKCkvZG9faW50ZXJydXB0X2RtYV90cmFuc2ZlcigpCisgKiBiYXNlZCBvbiB0aGUga2luZCBvZiB0aGUgdHJhbnNmZXIKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHB1bXBfbWVzc2FnZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBwbDAyMiAqcGwwMjIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHBsMDIyLCBwdW1wX21lc3NhZ2VzKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogTG9jayBxdWV1ZSBhbmQgY2hlY2sgZm9yIHF1ZXVlIHdvcmsgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGwwMjItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmcGwwMjItPnF1ZXVlKSB8fCAhcGwwMjItPnJ1bm5pbmcpIHsKKwkJcGwwMjItPmJ1c3kgPSBmYWxzZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGwwMjItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwkvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBhbHJlYWR5IHJ1bm5pbmcgYSBtZXNzYWdlICovCisJaWYgKHBsMDIyLT5jdXJfbXNnKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJLyogRXh0cmFjdCBoZWFkIG9mIHF1ZXVlICovCisJcGwwMjItPmN1cl9tc2cgPQorCSAgICBsaXN0X2VudHJ5KHBsMDIyLT5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsIHF1ZXVlKTsKKworCWxpc3RfZGVsX2luaXQoJnBsMDIyLT5jdXJfbXNnLT5xdWV1ZSk7CisJcGwwMjItPmJ1c3kgPSB0cnVlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwkvKiBJbml0aWFsIG1lc3NhZ2Ugc3RhdGUgKi8KKwlwbDAyMi0+Y3VyX21zZy0+c3RhdGUgPSBTVEFURV9TVEFSVDsKKwlwbDAyMi0+Y3VyX3RyYW5zZmVyID0gbGlzdF9lbnRyeShwbDAyMi0+Y3VyX21zZy0+dHJhbnNmZXJzLm5leHQsCisJCQkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAorCQkJCQkgICAgdHJhbnNmZXJfbGlzdCk7CisKKwkvKiBTZXR1cCB0aGUgU1BJIHVzaW5nIHRoZSBwZXIgY2hpcCBjb25maWd1cmF0aW9uICovCisJcGwwMjItPmN1cl9jaGlwID0gc3BpX2dldF9jdGxkYXRhKHBsMDIyLT5jdXJfbXNnLT5zcGkpOworCS8qCisJICogV2UgZW5hYmxlIHRoZSBjb3JlIHZvbHRhZ2UgYW5kIGNsb2NrcyBoZXJlLCB0aGVuIHRoZSBjbG9ja3MKKwkgKiBhbmQgY29yZSB3aWxsIGJlIGRpc2FibGVkIHdoZW4gZ2l2ZWJhY2soKSBpcyBjYWxsZWQgaW4gZWFjaCBtZXRob2QKKwkgKiAocG9sbC9pbnRlcnJ1cHQvRE1BKQorCSAqLworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBsMDIyLT5hZGV2LT5kZXYpOworCWFtYmFfdmNvcmVfZW5hYmxlKHBsMDIyLT5hZGV2KTsKKwlhbWJhX3BjbGtfZW5hYmxlKHBsMDIyLT5hZGV2KTsKKwljbGtfZW5hYmxlKHBsMDIyLT5jbGspOworCXJlc3RvcmVfc3RhdGUocGwwMjIpOworCWZsdXNoKHBsMDIyKTsKKworCWlmIChwbDAyMi0+Y3VyX2NoaXAtPnhmZXJfdHlwZSA9PSBQT0xMSU5HX1RSQU5TRkVSKQorCQlkb19wb2xsaW5nX3RyYW5zZmVyKHBsMDIyKTsKKwllbHNlCisJCWRvX2ludGVycnVwdF9kbWFfdHJhbnNmZXIocGwwMjIpOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcXVldWUoc3RydWN0IHBsMDIyICpwbDAyMikKK3sKKwlJTklUX0xJU1RfSEVBRCgmcGwwMjItPnF1ZXVlKTsKKwlzcGluX2xvY2tfaW5pdCgmcGwwMjItPnF1ZXVlX2xvY2spOworCisJcGwwMjItPnJ1bm5pbmcgPSBmYWxzZTsKKwlwbDAyMi0+YnVzeSA9IGZhbHNlOworCisJdGFza2xldF9pbml0KCZwbDAyMi0+cHVtcF90cmFuc2ZlcnMsCisJCQlwdW1wX3RyYW5zZmVycywJKHVuc2lnbmVkIGxvbmcpcGwwMjIpOworCisJSU5JVF9XT1JLKCZwbDAyMi0+cHVtcF9tZXNzYWdlcywgcHVtcF9tZXNzYWdlcyk7CisJcGwwMjItPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAorCQkJCQlkZXZfbmFtZShwbDAyMi0+bWFzdGVyLT5kZXYucGFyZW50KSk7CisJaWYgKHBsMDIyLT53b3JrcXVldWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc3RhcnRfcXVldWUoc3RydWN0IHBsMDIyICpwbDAyMikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocGwwMjItPnJ1bm5pbmcgfHwgcGwwMjItPmJ1c3kpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGwwMjItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlwbDAyMi0+cnVubmluZyA9IHRydWU7CisJcGwwMjItPmN1cl9tc2cgPSBOVUxMOworCXBsMDIyLT5jdXJfdHJhbnNmZXIgPSBOVUxMOworCXBsMDIyLT5jdXJfY2hpcCA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGwwMjItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXF1ZXVlX3dvcmsocGwwMjItPndvcmtxdWV1ZSwgJnBsMDIyLT5wdW1wX21lc3NhZ2VzKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc3RvcF9xdWV1ZShzdHJ1Y3QgcGwwMjIgKnBsMDIyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbGltaXQgPSA1MDA7CisJaW50IHN0YXR1cyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGwwMjItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCS8qIFRoaXMgaXMgYSBiaXQgbGFtZSwgYnV0IGlzIG9wdGltaXplZCBmb3IgdGhlIGNvbW1vbiBleGVjdXRpb24gcGF0aC4KKwkgKiBBIHdhaXRfcXVldWUgb24gdGhlIHBsMDIyLT5idXN5IGNvdWxkIGJlIHVzZWQsIGJ1dCB0aGVuIHRoZSBjb21tb24KKwkgKiBleGVjdXRpb24gcGF0aCAocHVtcF9tZXNzYWdlcykgd291bGQgYmUgcmVxdWlyZWQgdG8gY2FsbCB3YWtlX3VwIG9yCisJICogZnJpZW5kcyBvbiBldmVyeSBTUEkgbWVzc2FnZS4gRG8gdGhpcyBpbnN0ZWFkICovCisJd2hpbGUgKCghbGlzdF9lbXB0eSgmcGwwMjItPnF1ZXVlKSB8fCBwbDAyMi0+YnVzeSkgJiYgbGltaXQtLSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbDAyMi0+cXVldWVfbG9jaywgZmxhZ3MpOworCQltc2xlZXAoMTApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGwwMjItPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJnBsMDIyLT5xdWV1ZSkgfHwgcGwwMjItPmJ1c3kpCisJCXN0YXR1cyA9IC1FQlVTWTsKKwllbHNlCisJCXBsMDIyLT5ydW5uaW5nID0gZmFsc2U7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbDAyMi0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZXN0cm95X3F1ZXVlKHN0cnVjdCBwbDAyMiAqcGwwMjIpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHN0b3BfcXVldWUocGwwMjIpOworCS8qIHdlIGFyZSB1bmxvYWRpbmcgdGhlIG1vZHVsZSBvciBmYWlsaW5nIHRvIGxvYWQgKG9ubHkgdHdvIGNhbGxzCisJICogdG8gdGhpcyByb3V0aW5lKSwgYW5kIG5laXRoZXIgY2FsbCBjYW4gaGFuZGxlIGEgcmV0dXJuIHZhbHVlLgorCSAqIEhvd2V2ZXIsIGRlc3Ryb3lfd29ya3F1ZXVlIGNhbGxzIGZsdXNoX3dvcmtxdWV1ZSwgYW5kIHRoYXQgd2lsbAorCSAqIGJsb2NrIHVudGlsIGFsbCB3b3JrIGlzIGRvbmUuICBJZiB0aGUgcmVhc29uIHRoYXQgc3RvcF9xdWV1ZQorCSAqIHRpbWVkIG91dCBpcyB0aGF0IHRoZSB3b3JrIHdpbGwgbmV2ZXIgZmluaXNoLCB0aGVuIGl0IGRvZXMgbm8KKwkgKiBnb29kIHRvIGNhbGwgZGVzdHJveV93b3JrcXVldWUsIHNvIHJldHVybiBhbnl3YXkuICovCisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJZGVzdHJveV93b3JrcXVldWUocGwwMjItPndvcmtxdWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY29udHJvbGxlcl9wYXJhbWV0ZXJzKHN0cnVjdCBwbDAyMiAqcGwwMjIsCisJCQkJc3RydWN0IHBsMDIyX2NvbmZpZ19jaGlwIGNvbnN0ICpjaGlwX2luZm8pCit7CisJaWYgKChjaGlwX2luZm8tPmlmYWNlIDwgU1NQX0lOVEVSRkFDRV9NT1RPUk9MQV9TUEkpCisJICAgIHx8IChjaGlwX2luZm8tPmlmYWNlID4gU1NQX0lOVEVSRkFDRV9VTklESVJFQ1RJT05BTCkpIHsKKwkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKKwkJCSJpbnRlcmZhY2UgaXMgY29uZmlndXJlZCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoKGNoaXBfaW5mby0+aWZhY2UgPT0gU1NQX0lOVEVSRkFDRV9VTklESVJFQ1RJT05BTCkgJiYKKwkgICAgKCFwbDAyMi0+dmVuZG9yLT51bmlkaXIpKSB7CisJCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCisJCQkidW5pZGlyZWN0aW9uYWwgbW9kZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgIgorCQkJImhhcmR3YXJlIHZlcnNpb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKChjaGlwX2luZm8tPmhpZXJhcmNoeSAhPSBTU1BfTUFTVEVSKQorCSAgICAmJiAoY2hpcF9pbmZvLT5oaWVyYXJjaHkgIT0gU1NQX1NMQVZFKSkgeworCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJImhpZXJhcmNoeSBpcyBjb25maWd1cmVkIGluY29ycmVjdGx5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgoY2hpcF9pbmZvLT5jb21fbW9kZSAhPSBJTlRFUlJVUFRfVFJBTlNGRVIpCisJICAgICYmIChjaGlwX2luZm8tPmNvbV9tb2RlICE9IERNQV9UUkFOU0ZFUikKKwkgICAgJiYgKGNoaXBfaW5mby0+Y29tX21vZGUgIT0gUE9MTElOR19UUkFOU0ZFUikpIHsKKwkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKKwkJCSJDb21tdW5pY2F0aW9uIG1vZGUgaXMgY29uZmlndXJlZCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzd2l0Y2ggKGNoaXBfaW5mby0+cnhfbGV2X3RyaWcpIHsKKwljYXNlIFNTUF9SWF8xX09SX01PUkVfRUxFTToKKwljYXNlIFNTUF9SWF80X09SX01PUkVfRUxFTToKKwljYXNlIFNTUF9SWF84X09SX01PUkVfRUxFTToKKwkJLyogVGhlc2UgYXJlIGFsd2F5cyBPSywgYWxsIHZhcmlhbnRzIGNhbiBoYW5kbGUgdGhpcyAqLworCQlicmVhazsKKwljYXNlIFNTUF9SWF8xNl9PUl9NT1JFX0VMRU06CisJCWlmIChwbDAyMi0+dmVuZG9yLT5maWZvZGVwdGggPCAxNikgeworCQkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKKwkJCSJSWCBGSUZPIFRyaWdnZXIgTGV2ZWwgaXMgY29uZmlndXJlZCBpbmNvcnJlY3RseVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNTUF9SWF8zMl9PUl9NT1JFX0VMRU06CisJCWlmIChwbDAyMi0+dmVuZG9yLT5maWZvZGVwdGggPCAzMikgeworCQkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKKwkJCSJSWCBGSUZPIFRyaWdnZXIgTGV2ZWwgaXMgY29uZmlndXJlZCBpbmNvcnJlY3RseVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJIlJYIEZJRk8gVHJpZ2dlciBMZXZlbCBpcyBjb25maWd1cmVkIGluY29ycmVjdGx5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlzd2l0Y2ggKGNoaXBfaW5mby0+dHhfbGV2X3RyaWcpIHsKKwljYXNlIFNTUF9UWF8xX09SX01PUkVfRU1QVFlfTE9DOgorCWNhc2UgU1NQX1RYXzRfT1JfTU9SRV9FTVBUWV9MT0M6CisJY2FzZSBTU1BfVFhfOF9PUl9NT1JFX0VNUFRZX0xPQzoKKwkJLyogVGhlc2UgYXJlIGFsd2F5cyBPSywgYWxsIHZhcmlhbnRzIGNhbiBoYW5kbGUgdGhpcyAqLworCQlicmVhazsKKwljYXNlIFNTUF9UWF8xNl9PUl9NT1JFX0VNUFRZX0xPQzoKKwkJaWYgKHBsMDIyLT52ZW5kb3ItPmZpZm9kZXB0aCA8IDE2KSB7CisJCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJIlRYIEZJRk8gVHJpZ2dlciBMZXZlbCBpcyBjb25maWd1cmVkIGluY29ycmVjdGx5XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgU1NQX1RYXzMyX09SX01PUkVfRU1QVFlfTE9DOgorCQlpZiAocGwwMjItPnZlbmRvci0+Zmlmb2RlcHRoIDwgMzIpIHsKKwkJCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCisJCQkiVFggRklGTyBUcmlnZ2VyIExldmVsIGlzIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHlcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmcGwwMjItPmFkZXYtPmRldiwKKwkJCSJUWCBGSUZPIFRyaWdnZXIgTGV2ZWwgaXMgY29uZmlndXJlZCBpbmNvcnJlY3RseVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisJaWYgKGNoaXBfaW5mby0+aWZhY2UgPT0gU1NQX0lOVEVSRkFDRV9OQVRJT05BTF9NSUNST1dJUkUpIHsKKwkJaWYgKChjaGlwX2luZm8tPmN0cmxfbGVuIDwgU1NQX0JJVFNfNCkKKwkJICAgIHx8IChjaGlwX2luZm8tPmN0cmxfbGVuID4gU1NQX0JJVFNfMzIpKSB7CisJCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJCSJDVFJMIExFTiBpcyBjb25maWd1cmVkIGluY29ycmVjdGx5XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICgoY2hpcF9pbmZvLT53YWl0X3N0YXRlICE9IFNTUF9NV0lSRV9XQUlUX1pFUk8pCisJCSAgICAmJiAoY2hpcF9pbmZvLT53YWl0X3N0YXRlICE9IFNTUF9NV0lSRV9XQUlUX09ORSkpIHsKKwkJCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCisJCQkJIldhaXQgU3RhdGUgaXMgY29uZmlndXJlZCBpbmNvcnJlY3RseVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBIYWxmIGR1cGxleCBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgU1QgTWljcm8gdmVyc2lvbiAqLworCQlpZiAocGwwMjItPnZlbmRvci0+ZXh0ZW5kZWRfY3IpIHsKKwkJCWlmICgoY2hpcF9pbmZvLT5kdXBsZXggIT0KKwkJCSAgICAgU1NQX01JQ1JPV0lSRV9DSEFOTkVMX0ZVTExfRFVQTEVYKQorCQkJICAgICYmIChjaGlwX2luZm8tPmR1cGxleCAhPQorCQkJCVNTUF9NSUNST1dJUkVfQ0hBTk5FTF9IQUxGX0RVUExFWCkpIHsKKwkJCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJCQkiTWljcm93aXJlIGR1cGxleCBtb2RlIGlzIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHlcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNoaXBfaW5mby0+ZHVwbGV4ICE9IFNTUF9NSUNST1dJUkVfQ0hBTk5FTF9GVUxMX0RVUExFWCkKKwkJCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJCQkiTWljcm93aXJlIGhhbGYgZHVwbGV4IG1vZGUgcmVxdWVzdGVkLCIKKwkJCQkJIiBidXQgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUiCisJCQkJCSIgU1QgdmVyc2lvbiBvZiBQTDAyMlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwbDAyMl90cmFuc2ZlciAtIHRyYW5zZmVyIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgdG8gU1BJIG1hc3RlciBmcmFtZXdvcmsKKyAqIEBzcGk6IHNwaSBkZXZpY2Ugd2hpY2ggaXMgcmVxdWVzdGluZyB0cmFuc2ZlcgorICogQG1zZzogc3BpIG1lc3NhZ2Ugd2hpY2ggaXMgdG8gaGFuZGxlZCBpcyBxdWV1ZWQgdG8gZHJpdmVyIHF1ZXVlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHRvIHRoZSBTUEkgZnJhbWV3b3JrIGZvciB0aGlzIFNQSSBtYXN0ZXIKKyAqIGNvbnRyb2xsZXIuIEl0IHdpbGwgcXVldWUgdGhlIHNwaV9tZXNzYWdlIGluIHRoZSBxdWV1ZSBvZiBkcml2ZXIgaWYKKyAqIHRoZSBxdWV1ZSBpcyBub3Qgc3RvcHBlZCBhbmQgcmV0dXJuLgorICovCitzdGF0aWMgaW50IHBsMDIyX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoIXBsMDIyLT5ydW5uaW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRVNIVVRET1dOOworCX0KKwltc2ctPmFjdHVhbF9sZW5ndGggPSAwOworCW1zZy0+c3RhdHVzID0gLUVJTlBST0dSRVNTOworCW1zZy0+c3RhdGUgPSBTVEFURV9TVEFSVDsKKworCWxpc3RfYWRkX3RhaWwoJm1zZy0+cXVldWUsICZwbDAyMi0+cXVldWUpOworCWlmIChwbDAyMi0+cnVubmluZyAmJiAhcGwwMjItPmJ1c3kpCisJCXF1ZXVlX3dvcmsocGwwMjItPndvcmtxdWV1ZSwgJnBsMDIyLT5wdW1wX21lc3NhZ2VzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsMDIyLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FsY3VsYXRlX2VmZmVjdGl2ZV9mcmVxKHN0cnVjdCBwbDAyMiAqcGwwMjIsCisJCQkJICAgIGludCBmcmVxLAorCQkJCSAgICBzdHJ1Y3Qgc3NwX2Nsb2NrX3BhcmFtcyAqY2xrX2ZyZXEpCit7CisJLyogTGV0cyBjYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeSBwYXJhbWV0ZXJzICovCisJdTE2IGNwc2R2c3IgPSAyOworCXUxNiBzY3IgPSAwOworCWJvb2wgZnJlcV9mb3VuZCA9IGZhbHNlOworCXUzMiByYXRlOworCXUzMiBtYXhfdGNsazsKKwl1MzIgbWluX3RjbGs7CisKKwlyYXRlID0gY2xrX2dldF9yYXRlKHBsMDIyLT5jbGspOworCS8qIGNwc2R2c2NyID0gMiAmIHNjciAwICovCisJbWF4X3RjbGsgPSAocmF0ZSAvIChDUFNEVlJfTUlOICogKDEgKyBTQ1JfTUlOKSkpOworCS8qIGNwc2R2c3IgPSAyNTQgJiBzY3IgPSAyNTUgKi8KKwltaW5fdGNsayA9IChyYXRlIC8gKENQU0RWUl9NQVggKiAoMSArIFNDUl9NQVgpKSk7CisKKwlpZiAoKGZyZXEgPD0gbWF4X3RjbGspICYmIChmcmVxID49IG1pbl90Y2xrKSkgeworCQl3aGlsZSAoY3BzZHZzciA8PSBDUFNEVlJfTUFYICYmICFmcmVxX2ZvdW5kKSB7CisJCQl3aGlsZSAoc2NyIDw9IFNDUl9NQVggJiYgIWZyZXFfZm91bmQpIHsKKwkJCQlpZiAoKHJhdGUgLworCQkJCSAgICAgKGNwc2R2c3IgKiAoMSArIHNjcikpKSA+IGZyZXEpCisJCQkJCXNjciArPSAxOworCQkJCWVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBUaGlzIGJvb2wgaXMgbWFkZSB0cnVlIHdoZW4KKwkJCQkJICogZWZmZWN0aXZlIGZyZXF1ZW5jeSA+PQorCQkJCQkgKiB0YXJnZXQgZnJlcXVlbmN5IGlzIGZvdW5kCisJCQkJCSAqLworCQkJCQlmcmVxX2ZvdW5kID0gdHJ1ZTsKKwkJCQkJaWYgKChyYXRlIC8KKwkJCQkJICAgICAoY3BzZHZzciAqICgxICsgc2NyKSkpICE9IGZyZXEpIHsKKwkJCQkJCWlmIChzY3IgPT0gU0NSX01JTikgeworCQkJCQkJCWNwc2R2c3IgLT0gMjsKKwkJCQkJCQlzY3IgPSBTQ1JfTUFYOworCQkJCQkJfSBlbHNlCisJCQkJCQkJc2NyIC09IDE7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoIWZyZXFfZm91bmQpIHsKKwkJCQljcHNkdnNyICs9IDI7CisJCQkJc2NyID0gU0NSX01JTjsKKwkJCX0KKwkJfQorCQlpZiAoY3BzZHZzciAhPSAwKSB7CisJCQlkZXZfZGJnKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJCSJTU1AgRWZmZWN0aXZlIEZyZXF1ZW5jeSBpcyAldVxuIiwKKwkJCQkocmF0ZSAvIChjcHNkdnNyICogKDEgKyBzY3IpKSkpOworCQkJY2xrX2ZyZXEtPmNwc2R2c3IgPSAodTgpIChjcHNkdnNyICYgMHhGRik7CisJCQljbGtfZnJlcS0+c2NyID0gKHU4KSAoc2NyICYgMHhGRik7CisJCQlkZXZfZGJnKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJCSJTU1AgY3BzZHZzciA9ICVkLCBzY3IgPSAlZFxuIiwKKwkJCQljbGtfZnJlcS0+Y3BzZHZzciwgY2xrX2ZyZXEtPnNjcik7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkJImNvbnRyb2xsZXIgZGF0YSBpcyBpbmNvcnJlY3Q6IG91dCBvZiByYW5nZSBmcmVxdWVuY3kiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBBIHBpZWNlIG9mIGRlZmF1bHQgY2hpcCBpbmZvIHVubGVzcyB0aGUgcGxhdGZvcm0KKyAqIHN1cHBsaWVzIGl0LgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsMDIyX2NvbmZpZ19jaGlwIHBsMDIyX2RlZmF1bHRfY2hpcF9pbmZvID0geworCS5jb21fbW9kZSA9IFBPTExJTkdfVFJBTlNGRVIsCisJLmlmYWNlID0gU1NQX0lOVEVSRkFDRV9NT1RPUk9MQV9TUEksCisJLmhpZXJhcmNoeSA9IFNTUF9TTEFWRSwKKwkuc2xhdmVfdHhfZGlzYWJsZSA9IERPX05PVF9EUklWRV9UWCwKKwkucnhfbGV2X3RyaWcgPSBTU1BfUlhfMV9PUl9NT1JFX0VMRU0sCisJLnR4X2xldl90cmlnID0gU1NQX1RYXzFfT1JfTU9SRV9FTVBUWV9MT0MsCisJLmN0cmxfbGVuID0gU1NQX0JJVFNfOCwKKwkud2FpdF9zdGF0ZSA9IFNTUF9NV0lSRV9XQUlUX1pFUk8sCisJLmR1cGxleCA9IFNTUF9NSUNST1dJUkVfQ0hBTk5FTF9GVUxMX0RVUExFWCwKKwkuY3NfY29udHJvbCA9IG51bGxfY3NfY29udHJvbCwKK307CisKKworLyoqCisgKiBwbDAyMl9zZXR1cCAtIHNldHVwIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgdG8gU1BJIG1hc3RlciBmcmFtZXdvcmsKKyAqIEBzcGk6IHNwaSBkZXZpY2Ugd2hpY2ggaXMgcmVxdWVzdGluZyBzZXR1cAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCB0byB0aGUgU1BJIGZyYW1ld29yayBmb3IgdGhpcyBTUEkgbWFzdGVyCisgKiBjb250cm9sbGVyLiBJZiBpdCBpcyB0aGUgZmlyc3QgdGltZSB3aGVuIHNldHVwIGlzIGNhbGxlZCBieSB0aGlzIGRldmljZSwKKyAqIHRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIHRoZSBydW50aW1lIHN0YXRlIGZvciB0aGlzIGNoaXAgYW5kIHNhdmUKKyAqIHRoZSBzYW1lIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiBFbHNlIGl0IHdpbGwgdXBkYXRlIHRoZSBydW50aW1lIGluZm8KKyAqIHdpdGggdGhlIHVwZGF0ZWQgY2hpcCBpbmZvLiBOb3RoaW5nIGlzIHJlYWxseSBiZWluZyB3cml0dGVuIHRvIHRoZQorICogY29udHJvbGxlciBoYXJkd2FyZSBoZXJlLCB0aGF0IGlzIG5vdCBkb25lIHVudGlsIHRoZSBhY3R1YWwgdHJhbnNmZXIKKyAqIGNvbW1lbmNlLgorICovCitzdGF0aWMgaW50IHBsMDIyX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHBsMDIyX2NvbmZpZ19jaGlwIGNvbnN0ICpjaGlwX2luZm87CisJc3RydWN0IGNoaXBfZGF0YSAqY2hpcDsKKwlzdHJ1Y3Qgc3NwX2Nsb2NrX3BhcmFtcyBjbGtfZnJlcSA9IHswLCB9OworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1bnNpZ25lZCBpbnQgYml0cyA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwl1MzIgdG1wOworCisJaWYgKCFzcGktPm1heF9zcGVlZF9oeikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBHZXQgY29udHJvbGxlcl9zdGF0ZSBpZiBvbmUgaXMgc3VwcGxpZWQgKi8KKwljaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7CisKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hpcF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY2hpcCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkJImNhbm5vdCBhbGxvY2F0ZSBjb250cm9sbGVyIHN0YXRlXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWRldl9kYmcoJnNwaS0+ZGV2LAorCQkJImFsbG9jYXRlZCBtZW1vcnkgZm9yIGNvbnRyb2xsZXIncyBydW50aW1lIHN0YXRlXG4iKTsKKwl9CisKKwkvKiBHZXQgY29udHJvbGxlciBkYXRhIGlmIG9uZSBpcyBzdXBwbGllZCAqLworCWNoaXBfaW5mbyA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOworCisJaWYgKGNoaXBfaW5mbyA9PSBOVUxMKSB7CisJCWNoaXBfaW5mbyA9ICZwbDAyMl9kZWZhdWx0X2NoaXBfaW5mbzsKKwkJLyogc3BpX2JvYXJkX2luZm8uY29udHJvbGxlcl9kYXRhIG5vdCBpcyBzdXBwbGllZCAqLworCQlkZXZfZGJnKCZzcGktPmRldiwKKwkJCSJ1c2luZyBkZWZhdWx0IGNvbnRyb2xsZXJfZGF0YSBzZXR0aW5nc1xuIik7CisJfSBlbHNlCisJCWRldl9kYmcoJnNwaS0+ZGV2LAorCQkJInVzaW5nIHVzZXIgc3VwcGxpZWQgY29udHJvbGxlcl9kYXRhIHNldHRpbmdzXG4iKTsKKworCS8qCisJICogV2UgY2FuIG92ZXJyaWRlIHdpdGggY3VzdG9tIGRpdmlzb3JzLCBlbHNlIHdlIHVzZSB0aGUgYm9hcmQKKwkgKiBmcmVxdWVuY3kgc2V0dGluZworCSAqLworCWlmICgoMCA9PSBjaGlwX2luZm8tPmNsa19mcmVxLmNwc2R2c3IpCisJICAgICYmICgwID09IGNoaXBfaW5mby0+Y2xrX2ZyZXEuc2NyKSkgeworCQlzdGF0dXMgPSBjYWxjdWxhdGVfZWZmZWN0aXZlX2ZyZXEocGwwMjIsCisJCQkJCQkgIHNwaS0+bWF4X3NwZWVkX2h6LAorCQkJCQkJICAmY2xrX2ZyZXEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyX2NvbmZpZ19wYXJhbXM7CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZjbGtfZnJlcSwgJmNoaXBfaW5mby0+Y2xrX2ZyZXEsIHNpemVvZihjbGtfZnJlcSkpOworCQlpZiAoKGNsa19mcmVxLmNwc2R2c3IgJSAyKSAhPSAwKQorCQkJY2xrX2ZyZXEuY3BzZHZzciA9CisJCQkJY2xrX2ZyZXEuY3BzZHZzciAtIDE7CisJfQorCWlmICgoY2xrX2ZyZXEuY3BzZHZzciA8IENQU0RWUl9NSU4pCisJICAgIHx8IChjbGtfZnJlcS5jcHNkdnNyID4gQ1BTRFZSX01BWCkpIHsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkiY3BzZHZzciBpcyBjb25maWd1cmVkIGluY29ycmVjdGx5XG4iKTsKKwkJZ290byBlcnJfY29uZmlnX3BhcmFtczsKKwl9CisKKworCXN0YXR1cyA9IHZlcmlmeV9jb250cm9sbGVyX3BhcmFtZXRlcnMocGwwMjIsIGNoaXBfaW5mbyk7CisJaWYgKHN0YXR1cykgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImNvbnRyb2xsZXIgZGF0YSBpcyBpbmNvcnJlY3QiKTsKKwkJZ290byBlcnJfY29uZmlnX3BhcmFtczsKKwl9CisKKwlwbDAyMi0+cnhfbGV2X3RyaWcgPSBjaGlwX2luZm8tPnJ4X2xldl90cmlnOworCXBsMDIyLT50eF9sZXZfdHJpZyA9IGNoaXBfaW5mby0+dHhfbGV2X3RyaWc7CisKKwkvKiBOb3cgc2V0IGNvbnRyb2xsZXIgc3RhdGUgYmFzZWQgb24gY29udHJvbGxlciBkYXRhICovCisJY2hpcC0+eGZlcl90eXBlID0gY2hpcF9pbmZvLT5jb21fbW9kZTsKKwlpZiAoIWNoaXBfaW5mby0+Y3NfY29udHJvbCkgeworCQljaGlwLT5jc19jb250cm9sID0gbnVsbF9jc19jb250cm9sOworCQlkZXZfd2Fybigmc3BpLT5kZXYsCisJCQkgImNoaXAgc2VsZWN0IGZ1bmN0aW9uIGlzIE5VTEwgZm9yIHRoaXMgY2hpcFxuIik7CisJfSBlbHNlCisJCWNoaXAtPmNzX2NvbnRyb2wgPSBjaGlwX2luZm8tPmNzX2NvbnRyb2w7CisKKwlpZiAoYml0cyA8PSAzKSB7CisJCS8qIFBMMDIyIGRvZXNuJ3Qgc3VwcG9ydCBsZXNzIHRoYW4gNC1iaXRzICovCisJCXN0YXR1cyA9IC1FTk9UU1VQUDsKKwkJZ290byBlcnJfY29uZmlnX3BhcmFtczsKKwl9IGVsc2UgaWYgKGJpdHMgPD0gOCkgeworCQlkZXZfZGJnKCZzcGktPmRldiwgIjQgPD0gbiA8PTggYml0cyBwZXIgd29yZFxuIik7CisJCWNoaXAtPm5fYnl0ZXMgPSAxOworCQljaGlwLT5yZWFkID0gUkVBRElOR19VODsKKwkJY2hpcC0+d3JpdGUgPSBXUklUSU5HX1U4OworCX0gZWxzZSBpZiAoYml0cyA8PSAxNikgeworCQlkZXZfZGJnKCZzcGktPmRldiwgIjkgPD0gbiA8PSAxNiBiaXRzIHBlciB3b3JkXG4iKTsKKwkJY2hpcC0+bl9ieXRlcyA9IDI7CisJCWNoaXAtPnJlYWQgPSBSRUFESU5HX1UxNjsKKwkJY2hpcC0+d3JpdGUgPSBXUklUSU5HX1UxNjsKKwl9IGVsc2UgeworCQlpZiAocGwwMjItPnZlbmRvci0+bWF4X2JwdyA+PSAzMikgeworCQkJZGV2X2RiZygmc3BpLT5kZXYsICIxNyA8PSBuIDw9IDMyIGJpdHMgcGVyIHdvcmRcbiIpOworCQkJY2hpcC0+bl9ieXRlcyA9IDQ7CisJCQljaGlwLT5yZWFkID0gUkVBRElOR19VMzI7CisJCQljaGlwLT53cml0ZSA9IFdSSVRJTkdfVTMyOworCQl9IGVsc2UgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkJImlsbGVnYWwgZGF0YSBzaXplIGZvciB0aGlzIGNvbnRyb2xsZXIhXG4iKTsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LAorCQkJCSJhIHN0YW5kYXJkIHBsMDIyIGNhbiBvbmx5IGhhbmRsZSAiCisJCQkJIjEgPD0gbiA8PSAxNiBiaXQgd29yZHNcbiIpOworCQkJc3RhdHVzID0gLUVOT1RTVVBQOworCQkJZ290byBlcnJfY29uZmlnX3BhcmFtczsKKwkJfQorCX0KKworCS8qIE5vdyBJbml0aWFsaXplIGFsbCByZWdpc3RlciBzZXR0aW5ncyByZXF1aXJlZCBmb3IgdGhpcyBjaGlwICovCisJY2hpcC0+Y3IwID0gMDsKKwljaGlwLT5jcjEgPSAwOworCWNoaXAtPmRtYWNyID0gMDsKKwljaGlwLT5jcHNyID0gMDsKKwlpZiAoKGNoaXBfaW5mby0+Y29tX21vZGUgPT0gRE1BX1RSQU5TRkVSKQorCSAgICAmJiAoKHBsMDIyLT5tYXN0ZXJfaW5mbyktPmVuYWJsZV9kbWEpKSB7CisJCWNoaXAtPmVuYWJsZV9kbWEgPSB0cnVlOworCQlkZXZfZGJnKCZzcGktPmRldiwgIkRNQSBtb2RlIHNldCBpbiBjb250cm9sbGVyIHN0YXRlXG4iKTsKKwkJU1NQX1dSSVRFX0JJVFMoY2hpcC0+ZG1hY3IsIFNTUF9ETUFfRU5BQkxFRCwKKwkJCSAgICAgICBTU1BfRE1BQ1JfTUFTS19SWERNQUUsIDApOworCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5kbWFjciwgU1NQX0RNQV9FTkFCTEVELAorCQkJICAgICAgIFNTUF9ETUFDUl9NQVNLX1RYRE1BRSwgMSk7CisJfSBlbHNlIHsKKwkJY2hpcC0+ZW5hYmxlX2RtYSA9IGZhbHNlOworCQlkZXZfZGJnKCZzcGktPmRldiwgIkRNQSBtb2RlIE5PVCBzZXQgaW4gY29udHJvbGxlciBzdGF0ZVxuIik7CisJCVNTUF9XUklURV9CSVRTKGNoaXAtPmRtYWNyLCBTU1BfRE1BX0RJU0FCTEVELAorCQkJICAgICAgIFNTUF9ETUFDUl9NQVNLX1JYRE1BRSwgMCk7CisJCVNTUF9XUklURV9CSVRTKGNoaXAtPmRtYWNyLCBTU1BfRE1BX0RJU0FCTEVELAorCQkJICAgICAgIFNTUF9ETUFDUl9NQVNLX1RYRE1BRSwgMSk7CisJfQorCisJY2hpcC0+Y3BzciA9IGNsa19mcmVxLmNwc2R2c3I7CisKKwkvKiBTcGVjaWFsIHNldHVwIGZvciB0aGUgU1QgbWljcm8gZXh0ZW5kZWQgY29udHJvbCByZWdpc3RlcnMgKi8KKwlpZiAocGwwMjItPnZlbmRvci0+ZXh0ZW5kZWRfY3IpIHsKKwkJdTMyIGV0eDsKKworCQlpZiAocGwwMjItPnZlbmRvci0+cGwwMjMpIHsKKwkJCS8qIFRoZXNlIGJpdHMgYXJlIG9ubHkgaW4gdGhlIFBMMDIzICovCisJCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjEsIGNoaXBfaW5mby0+Y2xrZGVsYXksCisJCQkJICAgICAgIFNTUF9DUjFfTUFTS19GQkNMS0RFTF9TVCwgMTMpOworCQl9IGVsc2UgeworCQkJLyogVGhlc2UgYml0cyBhcmUgaW4gdGhlIFBMMDIyIGJ1dCBub3QgUEwwMjMgKi8KKwkJCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMCwgY2hpcF9pbmZvLT5kdXBsZXgsCisJCQkJICAgICAgIFNTUF9DUjBfTUFTS19IQUxGRFVQX1NULCA1KTsKKwkJCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMCwgY2hpcF9pbmZvLT5jdHJsX2xlbiwKKwkJCQkgICAgICAgU1NQX0NSMF9NQVNLX0NTU19TVCwgMTYpOworCQkJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IwLCBjaGlwX2luZm8tPmlmYWNlLAorCQkJCSAgICAgICBTU1BfQ1IwX01BU0tfRlJGX1NULCAyMSk7CisJCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjEsIGNoaXBfaW5mby0+d2FpdF9zdGF0ZSwKKwkJCQkgICAgICAgU1NQX0NSMV9NQVNLX01XQUlUX1NULCA2KTsKKwkJfQorCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjAsIGJpdHMgLSAxLAorCQkJICAgICAgIFNTUF9DUjBfTUFTS19EU1NfU1QsIDApOworCisJCWlmIChzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSB7CisJCQl0bXAgPSBTU1BfUlhfTFNCOworCQkJZXR4ID0gU1NQX1RYX0xTQjsKKwkJfSBlbHNlIHsKKwkJCXRtcCA9IFNTUF9SWF9NU0I7CisJCQlldHggPSBTU1BfVFhfTVNCOworCQl9CisJCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMSwgdG1wLCBTU1BfQ1IxX01BU0tfUkVORE5fU1QsIDQpOworCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjEsIGV0eCwgU1NQX0NSMV9NQVNLX1RFTkROX1NULCA1KTsKKwkJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCBjaGlwX2luZm8tPnJ4X2xldl90cmlnLAorCQkJICAgICAgIFNTUF9DUjFfTUFTS19SWElGTFNFTF9TVCwgNyk7CisJCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMSwgY2hpcF9pbmZvLT50eF9sZXZfdHJpZywKKwkJCSAgICAgICBTU1BfQ1IxX01BU0tfVFhJRkxTRUxfU1QsIDEwKTsKKwl9IGVsc2UgeworCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjAsIGJpdHMgLSAxLAorCQkJICAgICAgIFNTUF9DUjBfTUFTS19EU1MsIDApOworCQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjAsIGNoaXBfaW5mby0+aWZhY2UsCisJCQkgICAgICAgU1NQX0NSMF9NQVNLX0ZSRiwgNCk7CisJfQorCisJLyogU3R1ZmYgdGhhdCBpcyBjb21tb24gZm9yIGFsbCB2ZXJzaW9ucyAqLworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJdG1wID0gU1NQX0NMS19QT0xfSURMRV9ISUdIOworCWVsc2UKKwkJdG1wID0gU1NQX0NMS19QT0xfSURMRV9MT1c7CisJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IwLCB0bXAsIFNTUF9DUjBfTUFTS19TUE8sIDYpOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQl0bXAgPSBTU1BfQ0xLX1NFQ09ORF9FREdFOworCWVsc2UKKwkJdG1wID0gU1NQX0NMS19GSVJTVF9FREdFOworCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMCwgdG1wLCBTU1BfQ1IwX01BU0tfU1BILCA3KTsKKworCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMCwgY2xrX2ZyZXEuc2NyLCBTU1BfQ1IwX01BU0tfU0NSLCA4KTsKKwkvKiBMb29wYmFjayBpcyBhdmFpbGFibGUgb24gYWxsIHZlcnNpb25zIGV4Y2VwdCBQTDAyMyAqLworCWlmIChwbDAyMi0+dmVuZG9yLT5sb29wYmFjaykgeworCQlpZiAoc3BpLT5tb2RlICYgU1BJX0xPT1ApCisJCQl0bXAgPSBMT09QQkFDS19FTkFCTEVEOworCQllbHNlCisJCQl0bXAgPSBMT09QQkFDS19ESVNBQkxFRDsKKwkJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCB0bXAsIFNTUF9DUjFfTUFTS19MQk0sIDApOworCX0KKwlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjEsIFNTUF9ESVNBQkxFRCwgU1NQX0NSMV9NQVNLX1NTRSwgMSk7CisJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCBjaGlwX2luZm8tPmhpZXJhcmNoeSwgU1NQX0NSMV9NQVNLX01TLCAyKTsKKwlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjEsIGNoaXBfaW5mby0+c2xhdmVfdHhfZGlzYWJsZSwgU1NQX0NSMV9NQVNLX1NPRCwgMyk7CisKKwkvKiBTYXZlIGNvbnRyb2xsZXJfc3RhdGUgKi8KKwlzcGlfc2V0X2N0bGRhdGEoc3BpLCBjaGlwKTsKKwlyZXR1cm4gc3RhdHVzOworIGVycl9jb25maWdfcGFyYW1zOgorCXNwaV9zZXRfY3RsZGF0YShzcGksIE5VTEwpOworCWtmcmVlKGNoaXApOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogcGwwMjJfY2xlYW51cCAtIGNsZWFudXAgZnVuY3Rpb24gcmVnaXN0ZXJlZCB0byBTUEkgbWFzdGVyIGZyYW1ld29yaworICogQHNwaTogc3BpIGRldmljZSB3aGljaCBpcyByZXF1ZXN0aW5nIGNsZWFudXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgdG8gdGhlIFNQSSBmcmFtZXdvcmsgZm9yIHRoaXMgU1BJIG1hc3RlcgorICogY29udHJvbGxlci4gSXQgd2lsbCBmcmVlIHRoZSBydW50aW1lIHN0YXRlIG9mIGNoaXAuCisgKi8KK3N0YXRpYyB2b2lkIHBsMDIyX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7CisKKwlzcGlfc2V0X2N0bGRhdGEoc3BpLCBOVUxMKTsKKwlrZnJlZShjaGlwKTsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcGwwMjJfcHJvYmUoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2LCBjb25zdCBzdHJ1Y3QgYW1iYV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkZXYtPmRldjsKKwlzdHJ1Y3QgcGwwMjJfc3NwX2NvbnRyb2xsZXIgKnBsYXRmb3JtX2luZm8gPSBhZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBOVUxMOwkvKkRhdGEgZm9yIHRoaXMgZHJpdmVyICovCisJaW50IHN0YXR1cyA9IDA7CisKKwlkZXZfaW5mbygmYWRldi0+ZGV2LAorCQkgIkFSTSBQTDAyMiBkcml2ZXIsIGRldmljZSBJRDogMHglMDh4XG4iLCBhZGV2LT5wZXJpcGhpZCk7CisJaWYgKHBsYXRmb3JtX2luZm8gPT0gTlVMTCkgeworCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJwcm9iZSAtIG5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOworCQlzdGF0dXMgPSAtRU5PREVWOworCQlnb3RvIGVycl9ub19wZGF0YTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBtYXN0ZXIgd2l0aCBzcGFjZSBmb3IgZGF0YSAqLworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2Yoc3RydWN0IHBsMDIyKSk7CisJaWYgKG1hc3RlciA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmFkZXYtPmRldiwgInByb2JlIC0gY2Fubm90IGFsbG9jIFNQSSBtYXN0ZXJcbiIpOworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9ub19tYXN0ZXI7CisJfQorCisJcGwwMjIgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJcGwwMjItPm1hc3RlciA9IG1hc3RlcjsKKwlwbDAyMi0+bWFzdGVyX2luZm8gPSBwbGF0Zm9ybV9pbmZvOworCXBsMDIyLT5hZGV2ID0gYWRldjsKKwlwbDAyMi0+dmVuZG9yID0gaWQtPmRhdGE7CisKKwkvKgorCSAqIEJ1cyBOdW1iZXIgV2hpY2ggaGFzIGJlZW4gQXNzaWduZWQgdG8gdGhpcyBTU1AgY29udHJvbGxlcgorCSAqIG9uIHRoaXMgYm9hcmQKKwkgKi8KKwltYXN0ZXItPmJ1c19udW0gPSBwbGF0Zm9ybV9pbmZvLT5idXNfaWQ7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHBsYXRmb3JtX2luZm8tPm51bV9jaGlwc2VsZWN0OworCW1hc3Rlci0+Y2xlYW51cCA9IHBsMDIyX2NsZWFudXA7CisJbWFzdGVyLT5zZXR1cCA9IHBsMDIyX3NldHVwOworCW1hc3Rlci0+dHJhbnNmZXIgPSBwbDAyMl90cmFuc2ZlcjsKKworCS8qCisJICogU3VwcG9ydHMgbW9kZSAwLTMsIGxvb3BiYWNrLCBhbmQgYWN0aXZlIGxvdyBDUy4gVHJhbnNmZXJzIGFyZQorCSAqIGFsd2F5cyBNUyBiaXQgZmlyc3Qgb24gdGhlIG9yaWdpbmFsIHBsMDIyLgorCSAqLworCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIIHwgU1BJX0xPT1A7CisJaWYgKHBsMDIyLT52ZW5kb3ItPmV4dGVuZGVkX2NyKQorCQltYXN0ZXItPm1vZGVfYml0cyB8PSBTUElfTFNCX0ZJUlNUOworCisJZGV2X2RiZygmYWRldi0+ZGV2LCAiQlVTTk86ICVkXG4iLCBtYXN0ZXItPmJ1c19udW0pOworCisJc3RhdHVzID0gYW1iYV9yZXF1ZXN0X3JlZ2lvbnMoYWRldiwgTlVMTCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBlcnJfbm9faW9yZWdpb247CisKKwlwbDAyMi0+cGh5YmFzZSA9IGFkZXYtPnJlcy5zdGFydDsKKwlwbDAyMi0+dmlydGJhc2UgPSBpb3JlbWFwKGFkZXYtPnJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmYWRldi0+cmVzKSk7CisJaWYgKHBsMDIyLT52aXJ0YmFzZSA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX25vX2lvcmVtYXA7CisJfQorCXByaW50ayhLRVJOX0lORk8gInBsMDIyOiBtYXBwZWQgcmVnaXN0ZXJzIGZyb20gMHglMDh4IHRvICVwXG4iLAorCSAgICAgICBhZGV2LT5yZXMuc3RhcnQsIHBsMDIyLT52aXJ0YmFzZSk7CisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwlwbV9ydW50aW1lX3Jlc3VtZShkZXYpOworCisJcGwwMjItPmNsayA9IGNsa19nZXQoJmFkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihwbDAyMi0+Y2xrKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKHBsMDIyLT5jbGspOworCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJjb3VsZCBub3QgcmV0cmlldmUgU1NQL1NQSSBidXMgY2xvY2tcbiIpOworCQlnb3RvIGVycl9ub19jbGs7CisJfQorCisJLyogRGlzYWJsZSBTU1AgKi8KKwl3cml0ZXcoKHJlYWR3KFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSkgJiAoflNTUF9DUjFfTUFTS19TU0UpKSwKKwkgICAgICAgU1NQX0NSMShwbDAyMi0+dmlydGJhc2UpKTsKKwlsb2FkX3NzcF9kZWZhdWx0X2NvbmZpZyhwbDAyMik7CisKKwlzdGF0dXMgPSByZXF1ZXN0X2lycShhZGV2LT5pcnFbMF0sIHBsMDIyX2ludGVycnVwdF9oYW5kbGVyLCAwLCAicGwwMjIiLAorCQkJICAgICBwbDAyMik7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGV2X2VycigmYWRldi0+ZGV2LCAicHJvYmUgLSBjYW5ub3QgZ2V0IElSUSAoJWQpXG4iLCBzdGF0dXMpOworCQlnb3RvIGVycl9ub19pcnE7CisJfQorCisJLyogR2V0IERNQSBjaGFubmVscyAqLworCWlmIChwbGF0Zm9ybV9pbmZvLT5lbmFibGVfZG1hKSB7CisJCXN0YXR1cyA9IHBsMDIyX2RtYV9wcm9iZShwbDAyMik7CisJCWlmIChzdGF0dXMgIT0gMCkKKwkJCXBsYXRmb3JtX2luZm8tPmVuYWJsZV9kbWEgPSAwOworCX0KKworCS8qIEluaXRpYWxpemUgYW5kIHN0YXJ0IHF1ZXVlICovCisJc3RhdHVzID0gaW5pdF9xdWV1ZShwbDAyMik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldl9lcnIoJmFkZXYtPmRldiwgInByb2JlIC0gcHJvYmxlbSBpbml0aWFsaXppbmcgcXVldWVcbiIpOworCQlnb3RvIGVycl9pbml0X3F1ZXVlOworCX0KKwlzdGF0dXMgPSBzdGFydF9xdWV1ZShwbDAyMik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldl9lcnIoJmFkZXYtPmRldiwgInByb2JlIC0gcHJvYmxlbSBzdGFydGluZyBxdWV1ZVxuIik7CisJCWdvdG8gZXJyX3N0YXJ0X3F1ZXVlOworCX0KKwkvKiBSZWdpc3RlciB3aXRoIHRoZSBTUEkgZnJhbWV3b3JrICovCisJYW1iYV9zZXRfZHJ2ZGF0YShhZGV2LCBwbDAyMik7CisJc3RhdHVzID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlkZXZfZXJyKCZhZGV2LT5kZXYsCisJCQkicHJvYmUgLSBwcm9ibGVtIHJlZ2lzdGVyaW5nIHNwaSBtYXN0ZXJcbiIpOworCQlnb3RvIGVycl9zcGlfcmVnaXN0ZXI7CisJfQorCWRldl9kYmcoZGV2LCAicHJvYmUgc3VjY2VlZGVkXG4iKTsKKwkvKgorCSAqIERpc2FibGUgdGhlIHNpbGljb24gYmxvY2sgcGNsayBhbmQgYW55IHZvbHRhZ2UgZG9tYWluIGFuZCBqdXN0CisJICogcG93ZXIgaXQgdXAgYW5kIGNsb2NrIGl0IHdoZW4gaXQncyBuZWVkZWQKKwkgKi8KKwlhbWJhX3BjbGtfZGlzYWJsZShhZGV2KTsKKwlhbWJhX3Zjb3JlX2Rpc2FibGUoYWRldik7CisJcmV0dXJuIDA7CisKKyBlcnJfc3BpX3JlZ2lzdGVyOgorIGVycl9zdGFydF9xdWV1ZToKKyBlcnJfaW5pdF9xdWV1ZToKKwlkZXN0cm95X3F1ZXVlKHBsMDIyKTsKKwlwbDAyMl9kbWFfcmVtb3ZlKHBsMDIyKTsKKwlmcmVlX2lycShhZGV2LT5pcnFbMF0sIHBsMDIyKTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJmFkZXYtPmRldik7CisgZXJyX25vX2lycToKKwljbGtfcHV0KHBsMDIyLT5jbGspOworIGVycl9ub19jbGs6CisJaW91bm1hcChwbDAyMi0+dmlydGJhc2UpOworIGVycl9ub19pb3JlbWFwOgorCWFtYmFfcmVsZWFzZV9yZWdpb25zKGFkZXYpOworIGVycl9ub19pb3JlZ2lvbjoKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworIGVycl9ub19tYXN0ZXI6CisgZXJyX25vX3BkYXRhOgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0CitwbDAyMl9yZW1vdmUoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2KQoreworCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBhbWJhX2dldF9kcnZkYXRhKGFkZXYpOworCWludCBzdGF0dXMgPSAwOworCWlmICghcGwwMjIpCisJCXJldHVybiAwOworCisJLyogUmVtb3ZlIHRoZSBxdWV1ZSAqLworCXN0YXR1cyA9IGRlc3Ryb3lfcXVldWUocGwwMjIpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlkZXZfZXJyKCZhZGV2LT5kZXYsCisJCQkicXVldWUgcmVtb3ZlIGZhaWxlZCAoJWQpXG4iLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlsb2FkX3NzcF9kZWZhdWx0X2NvbmZpZyhwbDAyMik7CisJcGwwMjJfZG1hX3JlbW92ZShwbDAyMik7CisJZnJlZV9pcnEoYWRldi0+aXJxWzBdLCBwbDAyMik7CisJY2xrX2Rpc2FibGUocGwwMjItPmNsayk7CisJY2xrX3B1dChwbDAyMi0+Y2xrKTsKKwlpb3VubWFwKHBsMDIyLT52aXJ0YmFzZSk7CisJYW1iYV9yZWxlYXNlX3JlZ2lvbnMoYWRldik7CisJdGFza2xldF9kaXNhYmxlKCZwbDAyMi0+cHVtcF90cmFuc2ZlcnMpOworCXNwaV91bnJlZ2lzdGVyX21hc3RlcihwbDAyMi0+bWFzdGVyKTsKKwlzcGlfbWFzdGVyX3B1dChwbDAyMi0+bWFzdGVyKTsKKwlhbWJhX3NldF9kcnZkYXRhKGFkZXYsIE5VTEwpOworCWRldl9kYmcoJmFkZXYtPmRldiwgInJlbW92ZSBzdWNjZWVkZWRcbiIpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHBsMDIyX3N1c3BlbmQoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHBsMDIyICpwbDAyMiA9IGFtYmFfZ2V0X2RydmRhdGEoYWRldik7CisJaW50IHN0YXR1cyA9IDA7CisKKwlzdGF0dXMgPSBzdG9wX3F1ZXVlKHBsMDIyKTsKKwlpZiAoc3RhdHVzKSB7CisJCWRldl93YXJuKCZhZGV2LT5kZXYsICJzdXNwZW5kIGNhbm5vdCBzdG9wIHF1ZXVlXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlhbWJhX3Zjb3JlX2VuYWJsZShhZGV2KTsKKwlhbWJhX3BjbGtfZW5hYmxlKGFkZXYpOworCWxvYWRfc3NwX2RlZmF1bHRfY29uZmlnKHBsMDIyKTsKKwlhbWJhX3BjbGtfZGlzYWJsZShhZGV2KTsKKwlhbWJhX3Zjb3JlX2Rpc2FibGUoYWRldik7CisJZGV2X2RiZygmYWRldi0+ZGV2LCAic3VzcGVuZGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbDAyMl9yZXN1bWUoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2KQoreworCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBhbWJhX2dldF9kcnZkYXRhKGFkZXYpOworCWludCBzdGF0dXMgPSAwOworCisJLyogU3RhcnQgdGhlIHF1ZXVlIHJ1bm5pbmcgKi8KKwlzdGF0dXMgPSBzdGFydF9xdWV1ZShwbDAyMik7CisJaWYgKHN0YXR1cykKKwkJZGV2X2VycigmYWRldi0+ZGV2LCAicHJvYmxlbSBzdGFydGluZyBxdWV1ZSAoJWQpXG4iLCBzdGF0dXMpOworCWVsc2UKKwkJZGV2X2RiZygmYWRldi0+ZGV2LCAicmVzdW1lZFxuIik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorI2Vsc2UKKyNkZWZpbmUgcGwwMjJfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHBsMDIyX3Jlc3VtZSBOVUxMCisjZW5kaWYJLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX2FybSA9IHsKKwkuZmlmb2RlcHRoID0gOCwKKwkubWF4X2JwdyA9IDE2LAorCS51bmlkaXIgPSBmYWxzZSwKKwkuZXh0ZW5kZWRfY3IgPSBmYWxzZSwKKwkucGwwMjMgPSBmYWxzZSwKKwkubG9vcGJhY2sgPSB0cnVlLAorfTsKKworCitzdGF0aWMgc3RydWN0IHZlbmRvcl9kYXRhIHZlbmRvcl9zdCA9IHsKKwkuZmlmb2RlcHRoID0gMzIsCisJLm1heF9icHcgPSAzMiwKKwkudW5pZGlyID0gZmFsc2UsCisJLmV4dGVuZGVkX2NyID0gdHJ1ZSwKKwkucGwwMjMgPSBmYWxzZSwKKwkubG9vcGJhY2sgPSB0cnVlLAorfTsKKworc3RhdGljIHN0cnVjdCB2ZW5kb3JfZGF0YSB2ZW5kb3Jfc3RfcGwwMjMgPSB7CisJLmZpZm9kZXB0aCA9IDMyLAorCS5tYXhfYnB3ID0gMzIsCisJLnVuaWRpciA9IGZhbHNlLAorCS5leHRlbmRlZF9jciA9IHRydWUsCisJLnBsMDIzID0gdHJ1ZSwKKwkubG9vcGJhY2sgPSBmYWxzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX2RiNTUwMF9wbDAyMyA9IHsKKwkuZmlmb2RlcHRoID0gMzIsCisJLm1heF9icHcgPSAzMiwKKwkudW5pZGlyID0gZmFsc2UsCisJLmV4dGVuZGVkX2NyID0gdHJ1ZSwKKwkucGwwMjMgPSB0cnVlLAorCS5sb29wYmFjayA9IHRydWUsCit9OworCitzdGF0aWMgc3RydWN0IGFtYmFfaWQgcGwwMjJfaWRzW10gPSB7CisJeworCQkvKgorCQkgKiBBUk0gUEwwMjIgdmFyaWFudCwgdGhpcyBoYXMgYSAxNmJpdCB3aWRlCisJCSAqIGFuZCA4IGxvY2F0aW9ucyBkZWVwIFRYL1JYIEZJRk8KKwkJICovCisJCS5pZAk9IDB4MDAwNDEwMjIsCisJCS5tYXNrCT0gMHgwMDBmZmZmZiwKKwkJLmRhdGEJPSAmdmVuZG9yX2FybSwKKwl9LAorCXsKKwkJLyoKKwkJICogU1QgTWljcm8gZGVyaXZhdGl2ZSwgdGhpcyBoYXMgMzJiaXQgd2lkZQorCQkgKiBhbmQgMzIgbG9jYXRpb25zIGRlZXAgVFgvUlggRklGTworCQkgKi8KKwkJLmlkCT0gMHgwMTA4MDAyMiwKKwkJLm1hc2sJPSAweGZmZmZmZmZmLAorCQkuZGF0YQk9ICZ2ZW5kb3Jfc3QsCisJfSwKKwl7CisJCS8qCisJCSAqIFNULUVyaWNzc29uIGRlcml2YXRpdmUgIlBMMDIzIiAodGhpcyBpcyBub3QKKwkJICogYW4gb2ZmaWNpYWwgQVJNIG51bWJlciksIHRoaXMgaXMgYSBQTDAyMiBTU1AgYmxvY2sKKwkJICogc3RyaXBwZWQgdG8gU1BJIG1vZGUgb25seSwgaXQgaGFzIDMyYml0IHdpZGUKKwkJICogYW5kIDMyIGxvY2F0aW9ucyBkZWVwIFRYL1JYIEZJRk8gYnV0IG5vIGV4dGVuZGVkCisJCSAqIENSMC9DUjEgcmVnaXN0ZXIKKwkJICovCisJCS5pZCAgICAgPSAweDAwMDgwMDIzLAorCQkubWFzayAgID0gMHhmZmZmZmZmZiwKKwkJLmRhdGEgICA9ICZ2ZW5kb3Jfc3RfcGwwMjMsCisJfSwKKwl7CisJCS5pZAk9IDB4MTAwODAwMjMsCisJCS5tYXNrCT0gMHhmZmZmZmZmZiwKKwkJLmRhdGEJPSAmdmVuZG9yX2RiNTUwMF9wbDAyMywKKwl9LAorCXsgMCwgMCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RyaXZlciBwbDAyMl9kcml2ZXIgPSB7CisJLmRydiA9IHsKKwkJLm5hbWUJPSAic3NwLXBsMDIyIiwKKwl9LAorCS5pZF90YWJsZQk9IHBsMDIyX2lkcywKKwkucHJvYmUJCT0gcGwwMjJfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwbDAyMl9yZW1vdmUpLAorCS5zdXNwZW5kICAgICAgICA9IHBsMDIyX3N1c3BlbmQsCisJLnJlc3VtZSAgICAgICAgID0gcGwwMjJfcmVzdW1lLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBwbDAyMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGFtYmFfZHJpdmVyX3JlZ2lzdGVyKCZwbDAyMl9kcml2ZXIpOworfQorCitzdWJzeXNfaW5pdGNhbGwocGwwMjJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwbDAyMl9leGl0KHZvaWQpCit7CisJYW1iYV9kcml2ZXJfdW5yZWdpc3RlcigmcGwwMjJfZHJpdmVyKTsKK30KKworbW9kdWxlX2V4aXQocGwwMjJfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkxpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBMMDIyIFNTUCBDb250cm9sbGVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXBwYzR4eC5jIGIvZHJpdmVycy9zcGkvc3BpLXBwYzR4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjdmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktcHBjNHh4LmMKQEAgLTAsMCArMSw2MTIgQEAKKy8qCisgKiBTUElfUFBDNFhYIFNQSSBjb250cm9sbGVyIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgR2FyeSBKZW5uZWpvaG4gPGdhcnlqQGRlbnguZGU+CisgKiBDb3B5cmlnaHQgMjAwOCBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+LCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKiBDb3B5cmlnaHQgMjAwOSBIYXJyaXMgQ29ycG9yYXRpb24sIFN0ZXZlbiBBLiBGYWxjbyA8c2ZhbGNvQGhhcnJpcy5jb20+CisgKgorICogQmFzZWQgaW4gcGFydCBvbiBkcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEJlbiBEb29rcworICogQ29weXJpZ2h0IChjKSAyMDA2IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBUaGUgUFBDNHh4IFNQSSBjb250cm9sbGVyIGhhcyBubyBGSUZPIHNvIGVhY2ggc2VudC9yZWNlaXZlZCBieXRlIHdpbGwKKyAqIGdlbmVyYXRlIGFuIGludGVycnVwdCB0byB0aGUgQ1BVLiBUaGlzIGNhbiBjYXVzZSBoaWdoIENQVSB1dGlsaXphdGlvbi4KKyAqIFRoaXMgZHJpdmVyIGFsbG93cyBwbGF0Zm9ybXMgdG8gcmVkdWNlIHRoZSBpbnRlcnJ1cHQgbG9hZCBvbiB0aGUgQ1BVCisgKiBkdXJpbmcgU1BJIHRyYW5zZmVycyBieSBzZXR0aW5nIG1heF9zcGVlZF9oeiB2aWEgdGhlIGRldmljZSB0cmVlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZGNyLmg+CisjaW5jbHVkZSA8YXNtL2Rjci1yZWdzLmg+CisKKy8qIGJpdHMgaW4gbW9kZSByZWdpc3RlciAtIGJpdCAwIGlzIE1TYiAqLworCisvKgorICogU1BJX1BQQzRYWF9NT0RFX1NDUCA9IDAgbWVhbnMgImRhdGEgbGF0Y2hlZCBvbiB0cmFpbGluZyBlZGdlIG9mIGNsb2NrIgorICogU1BJX1BQQzRYWF9NT0RFX1NDUCA9IDEgbWVhbnMgImRhdGEgbGF0Y2hlZCBvbiBsZWFkaW5nIGVkZ2Ugb2YgY2xvY2siCisgKiBOb3RlOiBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIENQSEEuCisgKi8KKyNkZWZpbmUgU1BJX1BQQzRYWF9NT0RFX1NDUAkoMHg4MCA+PiAzKQorCisvKiBTUElfUFBDNFhYX01PREVfU1BFID0gMSBtZWFucyAicG9ydCBlbmFibGVkIiAqLworI2RlZmluZSBTUElfUFBDNFhYX01PREVfU1BFCSgweDgwID4+IDQpCisKKy8qCisgKiBTUElfUFBDNFhYX01PREVfUkQgPSAwIG1lYW5zICJNU0IgZmlyc3QiIC0gdGhpcyBpcyB0aGUgbm9ybWFsIG1vZGUKKyAqIFNQSV9QUEM0WFhfTU9ERV9SRCA9IDEgbWVhbnMgIkxTQiBmaXJzdCIgLSB0aGlzIGlzIGJpdC1yZXZlcnNlZCBtb2RlCisgKiBOb3RlOiBUaGlzIGlzIGlkZW50aWNhbCB0byBTUElfTFNCX0ZJUlNULgorICovCisjZGVmaW5lIFNQSV9QUEM0WFhfTU9ERV9SRAkoMHg4MCA+PiA1KQorCisvKgorICogU1BJX1BQQzRYWF9NT0RFX0NJID0gMCBtZWFucyAiY2xvY2sgaWRsZXMgbG93IgorICogU1BJX1BQQzRYWF9NT0RFX0NJID0gMSBtZWFucyAiY2xvY2sgaWRsZXMgaGlnaCIKKyAqIE5vdGU6IFRoaXMgaXMgaWRlbnRpY2FsIHRvIENQT0wuCisgKi8KKyNkZWZpbmUgU1BJX1BQQzRYWF9NT0RFX0NJCSgweDgwID4+IDYpCisKKy8qCisgKiBTUElfUFBDNFhYX01PREVfSUwgPSAwIG1lYW5zICJsb29wYmFjayBkaXNhYmxlIgorICogU1BJX1BQQzRYWF9NT0RFX0lMID0gMSBtZWFucyAibG9vcGJhY2sgZW5hYmxlIgorICovCisjZGVmaW5lIFNQSV9QUEM0WFhfTU9ERV9JTAkoMHg4MCA+PiA3KQorCisvKiBiaXRzIGluIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKy8qIHN0YXJ0cyBhIHRyYW5zZmVyIHdoZW4gc2V0ICovCisjZGVmaW5lIFNQSV9QUEM0WFhfQ1JfU1RSCSgweDgwID4+IDcpCisKKy8qIGJpdHMgaW4gc3RhdHVzIHJlZ2lzdGVyICovCisvKiBwb3J0IGlzIGJ1c3kgd2l0aCBhIHRyYW5zZmVyICovCisjZGVmaW5lIFNQSV9QUEM0WFhfU1JfQlNZCSgweDgwID4+IDYpCisvKiBSeEQgcmVhZHkgKi8KKyNkZWZpbmUgU1BJX1BQQzRYWF9TUl9SQlIJKDB4ODAgPj4gNykKKworLyogY2xvY2sgc2V0dGluZ3MgKFNDUCBhbmQgQ0kpIGZvciB2YXJpb3VzIFNQSSBtb2RlcyAqLworI2RlZmluZSBTUElfQ0xLX01PREUwCShTUElfUFBDNFhYX01PREVfU0NQIHwgMCkKKyNkZWZpbmUgU1BJX0NMS19NT0RFMQkoMCB8IDApCisjZGVmaW5lIFNQSV9DTEtfTU9ERTIJKFNQSV9QUEM0WFhfTU9ERV9TQ1AgfCBTUElfUFBDNFhYX01PREVfQ0kpCisjZGVmaW5lIFNQSV9DTEtfTU9ERTMJKDAgfCBTUElfUFBDNFhYX01PREVfQ0kpCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJInNwaV9wcGM0eHhfb2YiCisKK3N0cnVjdCBzcGlfcHBjNHh4X3JlZ3MgeworCXU4IG1vZGU7CisJdTggcnhkOworCXU4IHR4ZDsKKwl1OCBjcjsKKwl1OCBzcjsKKwl1OCBkdW1teTsKKwkvKgorCSAqIENsb2NrIGRpdmlzb3IgbW9kdWx1cyByZWdpc3RlcgorCSAqIFRoaXMgdXNlcyB0aGUgZm9sbHdpbmcgZm9ybXVsYToKKwkgKiAgICBTQ1BDbGtPdXQgPSBPUEJDTEsvKDQoQ0RNICsgMSkpCisJICogb3IKKwkgKiAgICBDRE0gPSAoT1BCQ0xLLzQqU0NQQ2xrT3V0KSAtIDEKKwkgKiBiaXQgMCBpcyB0aGUgTVNiIQorCSAqLworCXU4IGNkbTsKK307CisKKy8qIFNQSSBDb250cm9sbGVyIGRyaXZlcidzIHByaXZhdGUgZGF0YS4gKi8KK3N0cnVjdCBwcGM0eHhfc3BpIHsKKwkvKiBiaXRiYW5nIGhhcyB0byBiZSBmaXJzdCAqLworCXN0cnVjdCBzcGlfYml0YmFuZyBiaXRiYW5nOworCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CisKKwl1NjQgbWFwYmFzZTsKKwl1NjQgbWFwc2l6ZTsKKwlpbnQgaXJxbnVtOworCS8qIG5lZWQgdGhpcyB0byBzZXQgdGhlIFNQSSBjbG9jayAqLworCXVuc2lnbmVkIGludCBvcGJfZnJlcTsKKworCS8qIGZvciB0cmFuc2ZlcnMgKi8KKwlpbnQgbGVuOworCWludCBjb3VudDsKKwkvKiBkYXRhIGJ1ZmZlcnMgKi8KKwljb25zdCB1bnNpZ25lZCBjaGFyICp0eDsKKwl1bnNpZ25lZCBjaGFyICpyeDsKKworCWludCAqZ3Bpb3M7CisKKwlzdHJ1Y3Qgc3BpX3BwYzR4eF9yZWdzIF9faW9tZW0gKnJlZ3M7IC8qIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVycyAqLworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IGRldmljZSAqZGV2OworfTsKKworLyogbmVlZCB0aGlzIHNvIHdlIGNhbiBzZXQgdGhlIGNsb2NrIGluIHRoZSBjaGlwc2VsZWN0IHJvdXRpbmUgKi8KK3N0cnVjdCBzcGlfcHBjNHh4X2NzIHsKKwl1OCBtb2RlOworfTsKKworc3RhdGljIGludCBzcGlfcHBjNHh4X3R4cngoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlzdHJ1Y3QgcHBjNHh4X3NwaSAqaHc7CisJdTggZGF0YTsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAidHhyeDogdHggJXAsIHJ4ICVwLCBsZW4gJWRcbiIsCisJCXQtPnR4X2J1ZiwgdC0+cnhfYnVmLCB0LT5sZW4pOworCisJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCWh3LT50eCA9IHQtPnR4X2J1ZjsKKwlody0+cnggPSB0LT5yeF9idWY7CisJaHctPmxlbiA9IHQtPmxlbjsKKwlody0+Y291bnQgPSAwOworCisJLyogc2VuZCB0aGUgZmlyc3QgYnl0ZSAqLworCWRhdGEgPSBody0+dHggPyBody0+dHhbMF0gOiAwOworCW91dF84KCZody0+cmVncy0+dHhkLCBkYXRhKTsKKwlvdXRfOCgmaHctPnJlZ3MtPmNyLCBTUElfUFBDNFhYX0NSX1NUUik7CisJd2FpdF9mb3JfY29tcGxldGlvbigmaHctPmRvbmUpOworCisJcmV0dXJuIGh3LT5jb3VudDsKK30KKworc3RhdGljIGludCBzcGlfcHBjNHh4X3NldHVweGZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBwcGM0eHhfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXN0cnVjdCBzcGlfcHBjNHh4X2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwlpbnQgc2NyOworCXU4IGNkbSA9IDA7CisJdTMyIHNwZWVkOworCXU4IGJpdHNfcGVyX3dvcmQ7CisKKwkvKiBTdGFydCB3aXRoIHRoZSBnZW5lcmljIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgZGV2aWNlLiAqLworCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisJc3BlZWQgPSBzcGktPm1heF9zcGVlZF9oejsKKworCS8qCisJICogTW9kaWZ5IHRoZSBjb25maWd1cmF0aW9uIGlmIHRoZSB0cmFuc2ZlciBvdmVycmlkZXMgaXQuICBEbyBub3QgYWxsb3cKKwkgKiB0aGUgdHJhbnNmZXIgdG8gb3ZlcndyaXRlIHRoZSBnZW5lcmljIGNvbmZpZ3VyYXRpb24gd2l0aCB6ZXJvcy4KKwkgKi8KKwlpZiAodCkgeworCQlpZiAodC0+Yml0c19wZXJfd29yZCkKKwkJCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOworCisJCWlmICh0LT5zcGVlZF9oeikKKwkJCXNwZWVkID0gbWluKHQtPnNwZWVkX2h6LCBzcGktPm1heF9zcGVlZF9oeik7CisJfQorCisJaWYgKGJpdHNfcGVyX3dvcmQgIT0gOCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgYml0cy1wZXItd29yZCAoJWQpXG4iLAorCQkJCWJpdHNfcGVyX3dvcmQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXNwZWVkIHx8IChzcGVlZCA+IHNwaS0+bWF4X3NwZWVkX2h6KSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgc3BlZWRfaHogKCVkKVxuIiwgc3BlZWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBXcml0ZSBuZXcgY29uZmlncmF0aW9uICovCisJb3V0XzgoJmh3LT5yZWdzLT5tb2RlLCBjcy0+bW9kZSk7CisKKwkvKiBTZXQgdGhlIGNsb2NrICovCisJLyogb3BiX2ZyZXEgd2FzIGFscmVhZHkgZGl2aWRlZCBieSA0ICovCisJc2NyID0gKGh3LT5vcGJfZnJlcSAvIHNwZWVkKSAtIDE7CisJaWYgKHNjciA+IDApCisJCWNkbSA9IG1pbihzY3IsIDB4ZmYpOworCisJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR0aW5nIHByZS1zY2FsZXIgdG8gJWQgKGh6ICVkKVxuIiwgY2RtLCBzcGVlZCk7CisKKwlpZiAoaW5fOCgmaHctPnJlZ3MtPmNkbSkgIT0gY2RtKQorCQlvdXRfOCgmaHctPnJlZ3MtPmNkbSwgY2RtKTsKKworCXNwaW5fbG9jaygmaHctPmJpdGJhbmcubG9jayk7CisJaWYgKCFody0+Yml0YmFuZy5idXN5KSB7CisJCWh3LT5iaXRiYW5nLmNoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0lOQUNUSVZFKTsKKwkJLyogTmVlZCB0byBuZGVsYXkgaGVyZT8gKi8KKwl9CisJc3Bpbl91bmxvY2soJmh3LT5iaXRiYW5nLmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3BwYzR4eF9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBzcGlfcHBjNHh4X2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKworCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgIT0gOCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgYml0cy1wZXItd29yZCAoJWQpXG4iLAorCQkJc3BpLT5iaXRzX3Blcl93b3JkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFzcGktPm1heF9zcGVlZF9oeikgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgbWF4X3NwZWVkX2h6IChtdXN0IGJlIG5vbi16ZXJvKVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjcyA9PSBOVUxMKSB7CisJCWNzID0ga3phbGxvYyhzaXplb2YgKmNzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjcykKKwkJCXJldHVybiAtRU5PTUVNOworCQlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBjczsKKwl9CisKKwkvKgorCSAqIFdlIHNldCBhbGwgYml0cyBvZiB0aGUgU1BJMF9NT0RFIHJlZ2lzdGVyLCBzbywKKwkgKiBubyBuZWVkIHRvIHJlYWQtbW9kaWZ5LXdyaXRlCisJICovCisJY3MtPm1vZGUgPSBTUElfUFBDNFhYX01PREVfU1BFOworCisJc3dpdGNoIChzcGktPm1vZGUgJiAoU1BJX0NQSEEgfCBTUElfQ1BPTCkpIHsKKwljYXNlIFNQSV9NT0RFXzA6CisJCWNzLT5tb2RlIHw9IFNQSV9DTEtfTU9ERTA7CisJCWJyZWFrOworCWNhc2UgU1BJX01PREVfMToKKwkJY3MtPm1vZGUgfD0gU1BJX0NMS19NT0RFMTsKKwkJYnJlYWs7CisJY2FzZSBTUElfTU9ERV8yOgorCQljcy0+bW9kZSB8PSBTUElfQ0xLX01PREUyOworCQlicmVhazsKKwljYXNlIFNQSV9NT0RFXzM6CisJCWNzLT5tb2RlIHw9IFNQSV9DTEtfTU9ERTM7CisJCWJyZWFrOworCX0KKworCWlmIChzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKQorCQljcy0+bW9kZSB8PSBTUElfUFBDNFhYX01PREVfUkQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3BpX3BwYzR4eF9jaGlwc2VsKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcHBjNHh4X3NwaSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1bnNpZ25lZCBpbnQgY3MgPSBzcGktPmNoaXBfc2VsZWN0OworCXVuc2lnbmVkIGludCBjc3BvbDsKKworCS8qCisJICogSWYgdGhlcmUgYXJlIG5vIGNoaXAgc2VsZWN0cyBhdCBhbGwsIG9yIGlmIHRoaXMgaXMgdGhlIHNwZWNpYWwKKwkgKiBjYXNlIG9mIGEgbm9uLWV4aXN0ZW50IChkdW1teSkgY2hpcCBzZWxlY3QsIGRvIG5vdGhpbmcuCisJICovCisKKwlpZiAoIWh3LT5tYXN0ZXItPm51bV9jaGlwc2VsZWN0IHx8IGh3LT5ncGlvc1tjc10gPT0gLUVFWElTVCkKKwkJcmV0dXJuOworCisJY3Nwb2wgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCA/IDEgOiAwOworCWlmICh2YWx1ZSA9PSBCSVRCQU5HX0NTX0lOQUNUSVZFKQorCQljc3BvbCA9ICFjc3BvbDsKKworCWdwaW9fc2V0X3ZhbHVlKGh3LT5ncGlvc1tjc10sIGNzcG9sKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNwaV9wcGM0eHhfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcHBjNHh4X3NwaSAqaHc7CisJdTggc3RhdHVzOworCXU4IGRhdGE7CisJdW5zaWduZWQgaW50IGNvdW50OworCisJaHcgPSAoc3RydWN0IHBwYzR4eF9zcGkgKilkZXZfaWQ7CisKKwlzdGF0dXMgPSBpbl84KCZody0+cmVncy0+c3IpOworCWlmICghc3RhdHVzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKgorCSAqIEJTWSBkZS1hc3NlcnRzIG9uZSBjeWNsZSBhZnRlciB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuICBUaGUKKwkgKiBpbnRlcnJ1cHQgaXMgYXNzZXJ0ZWQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLiAgVGhlIGV4YWN0CisJICogcmVsYXRpb25zaGlwIGlzIG5vdCBkb2N1bWVudGVkLCBoZW5jZSB0aGlzIGNvZGUuCisJICovCisKKwlpZiAodW5saWtlbHkoc3RhdHVzICYgU1BJX1BQQzRYWF9TUl9CU1kpKSB7CisJCXU4IGxzdGF0dXM7CisJCWludCBjbnQgPSAwOworCisJCWRldl9kYmcoaHctPmRldiwgImdvdCBpbnRlcnJ1cHQgYnV0IHNwaSBzdGlsbCBidXN5P1xuIik7CisJCWRvIHsKKwkJCW5kZWxheSgxMCk7CisJCQlsc3RhdHVzID0gaW5fOCgmaHctPnJlZ3MtPnNyKTsKKwkJfSB3aGlsZSAoKytjbnQgPCAxMDAgJiYgbHN0YXR1cyAmIFNQSV9QUEM0WFhfU1JfQlNZKTsKKworCQlpZiAoY250ID49IDEwMCkgeworCQkJZGV2X2Vycihody0+ZGV2LCAiYnVzeXdhaXQ6IHRvbyBtYW55IGxvb3BzIVxuIik7CisJCQljb21wbGV0ZSgmaHctPmRvbmUpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IGVsc2UgeworCQkJLyogc3RhdHVzIGlzIGFsd2F5cyAxIChSQlIpIGhlcmUgKi8KKwkJCXN0YXR1cyA9IGluXzgoJmh3LT5yZWdzLT5zcik7CisJCQlkZXZfZGJnKGh3LT5kZXYsICJsb29wcyAlZCBzdGF0dXMgJXhcbiIsIGNudCwgc3RhdHVzKTsKKwkJfQorCX0KKworCWNvdW50ID0gaHctPmNvdW50OworCWh3LT5jb3VudCsrOworCisJLyogUkJSIHRyaWdnZXJlZCB0aGlzIGludGVycnVwdC4gIFRoZXJlZm9yZSwgZGF0YSBtdXN0IGJlIHJlYWR5LiAqLworCWRhdGEgPSBpbl84KCZody0+cmVncy0+cnhkKTsKKwlpZiAoaHctPnJ4KQorCQlody0+cnhbY291bnRdID0gZGF0YTsKKworCWNvdW50Kys7CisKKwlpZiAoY291bnQgPCBody0+bGVuKSB7CisJCWRhdGEgPSBody0+dHggPyBody0+dHhbY291bnRdIDogMDsKKwkJb3V0XzgoJmh3LT5yZWdzLT50eGQsIGRhdGEpOworCQlvdXRfOCgmaHctPnJlZ3MtPmNyLCBTUElfUFBDNFhYX0NSX1NUUik7CisJfSBlbHNlIHsKKwkJY29tcGxldGUoJmh3LT5kb25lKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHNwaV9wcGM0eHhfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWtmcmVlKHNwaS0+Y29udHJvbGxlcl9zdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNwaV9wcGM0eHhfZW5hYmxlKHN0cnVjdCBwcGM0eHhfc3BpICpodykKK3sKKwkvKgorCSAqIE9uIGFsbCA0eHggUFBDJ3MgdGhlIFNQSSBidXMgaXMgc2hhcmVkL211bHRpcGxleGVkIHdpdGgKKwkgKiB0aGUgMm5kIEkyQyBidXMuIFdlIG5lZWQgdG8gZW5hYmxlIHRoZSB0aGUgU1BJIGJ1cyBiZWZvcmUKKwkgKiB1c2luZyBpdC4KKwkgKi8KKworCS8qIG5lZWQgdG8gY2xlYXIgYml0IDE0IHRvIGVuYWJsZSBTUEMgKi8KKwlkY3JpX2NscnNldChTRFIwLCBTRFIwX1BGQzEsIDB4ODAwMDAwMDAgPj4gMTQsIDApOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2dwaW9zKHN0cnVjdCBwcGM0eHhfc3BpICpodykKK3sKKwlpZiAoaHctPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBody0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdDsgaSsrKQorCQkJaWYgKGdwaW9faXNfdmFsaWQoaHctPmdwaW9zW2ldKSkKKwkJCQlncGlvX2ZyZWUoaHctPmdwaW9zW2ldKTsKKworCQlrZnJlZShody0+Z3Bpb3MpOworCQlody0+Z3Bpb3MgPSBOVUxMOworCX0KK30KKworLyoKKyAqIHBsYXRmb3JtX2RldmljZSBsYXllciBzdHVmZi4uLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzcGlfcHBjNHh4X29mX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wKQoreworCXN0cnVjdCBwcGM0eHhfc3BpICpodzsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBzcGlfYml0YmFuZyAqYmJwOworCXN0cnVjdCByZXNvdXJjZSByZXNvdXJjZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb3AtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZvcC0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb3BibnA7CisJaW50IHJldDsKKwlpbnQgbnVtX2dwaW9zOworCWNvbnN0IHVuc2lnbmVkIGludCAqY2xrOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZiAqaHcpOworCWlmIChtYXN0ZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IG5wOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7CisJaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaHctPm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJaHctPmRldiA9IGRldjsKKworCWluaXRfY29tcGxldGlvbigmaHctPmRvbmUpOworCisJLyoKKwkgKiBBIGNvdW50IG9mIHplcm8gaW1wbGllcyBhIHNpbmdsZSBTUEkgZGV2aWNlIHdpdGhvdXQgYW55IGNoaXAtc2VsZWN0LgorCSAqIE5vdGUgdGhhdCBvZl9ncGlvX2NvdW50IGNvdW50cyBhbGwgZ3Bpb3MgYXNzaWduZWQgdG8gdGhpcyBzcGkgbWFzdGVyLgorCSAqIFRoaXMgaW5jbHVkZXMgYm90aCAibnVsbCIgZ3BpbydzIGFuZCByZWFsIG9uZXMuCisJICovCisJbnVtX2dwaW9zID0gb2ZfZ3Bpb19jb3VudChucCk7CisJaWYgKG51bV9ncGlvcykgeworCQlpbnQgaTsKKworCQlody0+Z3Bpb3MgPSBremFsbG9jKHNpemVvZihpbnQpICogbnVtX2dwaW9zLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFody0+Z3Bpb3MpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGZyZWVfbWFzdGVyOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9ncGlvczsgaSsrKSB7CisJCQlpbnQgZ3BpbzsKKwkJCWVudW0gb2ZfZ3Bpb19mbGFncyBmbGFnczsKKworCQkJZ3BpbyA9IG9mX2dldF9ncGlvX2ZsYWdzKG5wLCBpLCAmZmxhZ3MpOworCQkJaHctPmdwaW9zW2ldID0gZ3BpbzsKKworCQkJaWYgKGdwaW9faXNfdmFsaWQoZ3BpbykpIHsKKwkJCQkvKiBSZWFsIENTIC0gc2V0IHRoZSBpbml0aWFsIHN0YXRlLiAqLworCQkJCXJldCA9IGdwaW9fcmVxdWVzdChncGlvLCBucC0+bmFtZSk7CisJCQkJaWYgKHJldCA8IDApIHsKKwkJCQkJZGV2X2VycihkZXYsICJjYW4ndCByZXF1ZXN0IGdwaW8gIgorCQkJCQkJCSIjJWQ6ICVkXG4iLCBpLCByZXQpOworCQkJCQlnb3RvIGZyZWVfZ3Bpb3M7CisJCQkJfQorCisJCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sCisJCQkJCQkhIShmbGFncyAmIE9GX0dQSU9fQUNUSVZFX0xPVykpOworCQkJfSBlbHNlIGlmIChncGlvID09IC1FRVhJU1QpIHsKKwkJCQk7IC8qIE5vIENTLCBidXQgdGhhdCdzIE9LLiAqLworCQkJfSBlbHNlIHsKKwkJCQlkZXZfZXJyKGRldiwgImludmFsaWQgZ3BpbyAjJWQ6ICVkXG4iLCBpLCBncGlvKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZnJlZV9ncGlvczsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNldHVwIHRoZSBzdGF0ZSBmb3IgdGhlIGJpdGJhbmcgZHJpdmVyICovCisJYmJwID0gJmh3LT5iaXRiYW5nOworCWJicC0+bWFzdGVyID0gaHctPm1hc3RlcjsKKwliYnAtPnNldHVwX3RyYW5zZmVyID0gc3BpX3BwYzR4eF9zZXR1cHhmZXI7CisJYmJwLT5jaGlwc2VsZWN0ID0gc3BpX3BwYzR4eF9jaGlwc2VsOworCWJicC0+dHhyeF9idWZzID0gc3BpX3BwYzR4eF90eHJ4OworCWJicC0+dXNlX2RtYSA9IDA7CisJYmJwLT5tYXN0ZXItPnNldHVwID0gc3BpX3BwYzR4eF9zZXR1cDsKKwliYnAtPm1hc3Rlci0+Y2xlYW51cCA9IHNwaV9wcGM0eHhfY2xlYW51cDsKKworCS8qIEFsbG9jYXRlIGJ1cyBudW0gZHluYW1pY2FsbHkuICovCisJYmJwLT5tYXN0ZXItPmJ1c19udW0gPSAtMTsKKworCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworCWJicC0+bWFzdGVyLT5tb2RlX2JpdHMgPQorCQlTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX0NTX0hJR0ggfCBTUElfTFNCX0ZJUlNUOworCisJLyogdGhpcyBtYW55IHBpbnMgaW4gYWxsIEdQSU8gY29udHJvbGxlcnMgKi8KKwliYnAtPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBudW1fZ3Bpb3M7CisKKwkvKiBHZXQgdGhlIGNsb2NrIGZvciB0aGUgT1BCICovCisJb3BibnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiaWJtLG9wYiIpOworCWlmIChvcGJucCA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiT1BCOiBjYW5ub3QgZmluZCBub2RlXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX2dwaW9zOworCX0KKwkvKiBHZXQgdGhlIGNsb2NrIChIeikgZm9yIHRoZSBPUEIgKi8KKwljbGsgPSBvZl9nZXRfcHJvcGVydHkob3BibnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwlpZiAoY2xrID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJPUEI6IG5vIGNsb2NrLWZyZXF1ZW5jeSBwcm9wZXJ0eSBzZXRcbiIpOworCQlvZl9ub2RlX3B1dChvcGJucCk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9ncGlvczsKKwl9CisJaHctPm9wYl9mcmVxID0gKmNsazsKKwlody0+b3BiX2ZyZXEgPj49IDI7CisJb2Zfbm9kZV9wdXQob3BibnApOworCisJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlc291cmNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZXJyb3Igd2hpbGUgcGFyc2luZyBkZXZpY2Ugbm9kZSByZXNvdXJjZVxuIik7CisJCWdvdG8gZnJlZV9ncGlvczsKKwl9CisJaHctPm1hcGJhc2UgPSByZXNvdXJjZS5zdGFydDsKKwlody0+bWFwc2l6ZSA9IHJlc291cmNlX3NpemUoJnJlc291cmNlKTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChody0+bWFwc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgc3BpX3BwYzR4eF9yZWdzKSkgeworCQlkZXZfZXJyKGRldiwgInRvbyBzbWFsbCB0byBtYXAgcmVnaXN0ZXJzXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmcmVlX2dwaW9zOworCX0KKworCS8qIFJlcXVlc3QgSVJRICovCisJaHctPmlycW51bSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwlyZXQgPSByZXF1ZXN0X2lycShody0+aXJxbnVtLCBzcGlfcHBjNHh4X2ludCwKKwkJCSAgSVJRRl9ESVNBQkxFRCwgInNwaV9wcGM0eHhfb2YiLCAodm9pZCAqKWh3KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdFxuIik7CisJCWdvdG8gZnJlZV9ncGlvczsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihody0+bWFwYmFzZSwgaHctPm1hcHNpemUsIERSSVZFUl9OQU1FKSkgeworCQlkZXZfZXJyKGRldiwgInJlc291cmNlIHVuYXZhaWxhYmxlXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIHJlcXVlc3RfbWVtX2Vycm9yOworCX0KKworCWh3LT5yZWdzID0gaW9yZW1hcChody0+bWFwYmFzZSwgc2l6ZW9mKHN0cnVjdCBzcGlfcHBjNHh4X3JlZ3MpKTsKKworCWlmICghaHctPnJlZ3MpIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gbWVtb3J5IG1hcCByZWdpc3RlcnNcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gbWFwX2lvX2Vycm9yOworCX0KKworCXNwaV9wcGM0eHhfZW5hYmxlKGh3KTsKKworCS8qIEZpbmFsbHkgcmVnaXN0ZXIgb3VyIHNwaSBjb250cm9sbGVyICovCisJZGV2LT5kbWFfbWFzayA9IDA7CisJcmV0ID0gc3BpX2JpdGJhbmdfc3RhcnQoYmJwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIFNQSSBtYXN0ZXJcbiIpOworCQlnb3RvIHVubWFwX3JlZ3M7CisJfQorCisJZGV2X2luZm8oZGV2LCAiZHJpdmVyIGluaXRpYWxpemVkXG4iKTsKKworCXJldHVybiAwOworCit1bm1hcF9yZWdzOgorCWlvdW5tYXAoaHctPnJlZ3MpOworbWFwX2lvX2Vycm9yOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihody0+bWFwYmFzZSwgaHctPm1hcHNpemUpOworcmVxdWVzdF9tZW1fZXJyb3I6CisJZnJlZV9pcnEoaHctPmlycW51bSwgaHcpOworZnJlZV9ncGlvczoKKwlmcmVlX2dwaW9zKGh3KTsKK2ZyZWVfbWFzdGVyOgorCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisKKwlkZXZfZXJyKGRldiwgImluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgc3BpX3BwYzR4eF9vZl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisJc3RydWN0IHBwYzR4eF9zcGkgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJc3BpX2JpdGJhbmdfc3RvcCgmaHctPmJpdGJhbmcpOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGh3LT5tYXBiYXNlLCBody0+bWFwc2l6ZSk7CisJZnJlZV9pcnEoaHctPmlycW51bSwgaHcpOworCWlvdW5tYXAoaHctPnJlZ3MpOworCWZyZWVfZ3Bpb3MoaHcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzcGlfcHBjNHh4X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJpYm0scHBjNHh4LXNwaSIsIH0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzcGlfcHBjNHh4X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3BpX3BwYzR4eF9vZl9kcml2ZXIgPSB7CisJLnByb2JlID0gc3BpX3BwYzR4eF9vZl9wcm9iZSwKKwkucmVtb3ZlID0gX19leGl0X3Aoc3BpX3BwYzR4eF9vZl9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzcGlfcHBjNHh4X29mX21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzcGlfcHBjNHh4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzcGlfcHBjNHh4X29mX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChzcGlfcHBjNHh4X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BpX3BwYzR4eF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwaV9wcGM0eHhfb2ZfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNwaV9wcGM0eHhfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkdhcnkgSmVubmVqb2huICYgU3RlZmFuIFJvZXNlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSBQUEM0eHggU1BJIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaV9wY2kuYyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtcGNpLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3BpL3B4YTJ4eF9zcGlfcGNpLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3BpL3NwaS1weGEyeHgtcGNpLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCnJlbmFtZSB0byBkcml2ZXJzL3NwaS9zcGktcHhhMnh4LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zM2MyNHh4LWZpcS5TIGIvZHJpdmVycy9zcGkvc3BpLXMzYzI0eHgtZmlxLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5ZjJkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zM2MyNHh4LWZpcS5TCkBAIC0wLDAgKzEsMTE2IEBACisvKiBsaW51eC9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eF9maXEuUworICoKKyAqIENvcHlyaWdodCAyMDA5IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQzI0WFggU1BJIC0gRklRIHBzZXVkby1ETUEgdHJhbnNmZXIgY29kZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWlycS5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zcGkuaD4KKworI2luY2x1ZGUgInNwaS1zM2MyNHh4LWZpcS5oIgorCisJLnRleHQKKworCUAgZW50cnkgdG8gdGhlc2Ugcm91dGluZXMgaXMgYXMgZm9sbG93cywgd2l0aCB0aGUgcmVnaXN0ZXIgbmFtZXMKKwlAIGRlZmluZWQgaW4gZmlxLmggc28gdGhhdCB0aGV5IGNhbiBiZSBzaGFyZWQgd2l0aCB0aGUgQyBmaWxlcyB3aGljaAorCUAgc2V0dXAgdGhlIGNhbGxpbmcgcmVnaXN0ZXJzLgorCUAKKwlAIGZpcV9yaXJxCVRoZSBiYXNlIG9mIHRoZSBJUlEgcmVnaXN0ZXJzIHRvIGZpbmQgUzNDMjQxMF9TUkNQTkQKKwlAIGZpcV9ydG1wCVRlbXBvcmFyeSByZWdpc3RlciB0byBob2xkIHR4L3J4IGRhdGEKKwlAIGZpcV9yc3BpCVRoZSBiYXNlIG9mIHRoZSBTUEkgcmVnaXN0ZXIgYmxvY2sKKwlAIGZpcV9ydHgJVGhlIHR4IGJ1ZmZlciBwb2ludGVyCisJQCBmaXFfcnJ4CVRoZSByeCBidWZmZXIgcG9pbnRlcgorCUAgZmlxX3Jjb3VudAlUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG1vdmUKKworCUAgZWFjaCBlbnRyeSBzdGFydHMgd2l0aCBhIHdvcmQgZW50cnkgb2YgaG93IGxvbmcgaXQgaXMKKwlAIGFuZCBhbiBvZmZzZXQgdG8gdGhlIGlycSBhY2tub3dsZWRnbWVudCB3b3JkCisKK0VOVFJZKHMzYzI0eHhfc3BpX2ZpcV9yeCkKK3MzYzI0eHhfc3BpX2ZpeF9yeDoKKwkud29yZAlmaXFfcnhfZW5kIC0gZmlxX3J4X3N0YXJ0CisJLndvcmQJZmlxX3J4X2lycV9hY2sgLSBmaXFfcnhfc3RhcnQKK2ZpcV9yeF9zdGFydDoKKwlsZHIJZmlxX3J0bXAsIGZpcV9yeF9pcnFfYWNrCisJc3RyCWZpcV9ydG1wLCBbIGZpcV9yaXJxLCAjIFMzQzI0MTBfU1JDUE5EIC0gUzNDMjRYWF9WQV9JUlEgXQorCisJbGRyYglmaXFfcnRtcCwgWyBmaXFfcnNwaSwgIyAgUzNDMjQxMF9TUFJEQVQgXQorCXN0cmIJZmlxX3J0bXAsIFsgZmlxX3JyeCBdLCAjMQorCisJbW92CWZpcV9ydG1wLCAjMHhmZgorCXN0cmIJZmlxX3J0bXAsIFsgZmlxX3JzcGksICMgUzNDMjQxMF9TUFREQVQgXQorCisJc3VicwlmaXFfcmNvdW50LCBmaXFfcmNvdW50LCAjMQorCXN1Ym5lcwlwYywgbHIsICM0CQlAQCByZXR1cm4sIHN0aWxsIGhhdmUgd29yayB0byBkbworCisJQEAgc2V0IElSUSBjb250cm9sbGVyIHNvIHRoYXQgbmV4dCBvcCB3aWxsIHRyaWdnZXIgSVJRCisJbW92CWZpcV9ydG1wLCAjMAorCXN0cglmaXFfcnRtcCwgWyBmaXFfcmlycSwgIyBTM0MyNDEwX0lOVE1PRCAgLSBTM0MyNFhYX1ZBX0lSUSBdCisJc3VicwlwYywgbHIsICM0CisKK2ZpcV9yeF9pcnFfYWNrOgorCS53b3JkCTAKK2ZpcV9yeF9lbmQ6CisKK0VOVFJZKHMzYzI0eHhfc3BpX2ZpcV90eHJ4KQorczNjMjR4eF9zcGlfZmlxX3R4cng6CisJLndvcmQJZmlxX3R4cnhfZW5kIC0gZmlxX3R4cnhfc3RhcnQKKwkud29yZAlmaXFfdHhyeF9pcnFfYWNrIC0gZmlxX3R4cnhfc3RhcnQKK2ZpcV90eHJ4X3N0YXJ0OgorCisJbGRyYglmaXFfcnRtcCwgWyBmaXFfcnNwaSwgIyAgUzNDMjQxMF9TUFJEQVQgXQorCXN0cmIJZmlxX3J0bXAsIFsgZmlxX3JyeCBdLCAjMQorCisJbGRyCWZpcV9ydG1wLCBmaXFfdHhyeF9pcnFfYWNrCisJc3RyCWZpcV9ydG1wLCBbIGZpcV9yaXJxLCAjIFMzQzI0MTBfU1JDUE5EIC0gUzNDMjRYWF9WQV9JUlEgXQorCisJbGRyYglmaXFfcnRtcCwgWyBmaXFfcnR4IF0sICMxCisJc3RyYglmaXFfcnRtcCwgWyBmaXFfcnNwaSwgIyBTM0MyNDEwX1NQVERBVCBdCisKKwlzdWJzCWZpcV9yY291bnQsIGZpcV9yY291bnQsICMxCisJc3VibmVzCXBjLCBsciwgIzQJCUBAIHJldHVybiwgc3RpbGwgaGF2ZSB3b3JrIHRvIGRvCisKKwltb3YJZmlxX3J0bXAsICMwCisJc3RyCWZpcV9ydG1wLCBbIGZpcV9yaXJxLCAjIFMzQzI0MTBfSU5UTU9EICAtIFMzQzI0WFhfVkFfSVJRIF0KKwlzdWJzCXBjLCBsciwgIzQKKworZmlxX3R4cnhfaXJxX2FjazoKKwkud29yZAkwCisKK2ZpcV90eHJ4X2VuZDoKKworRU5UUlkoczNjMjR4eF9zcGlfZmlxX3R4KQorczNjMjR4eF9zcGlfZml4X3R4OgorCS53b3JkCWZpcV90eF9lbmQgLSBmaXFfdHhfc3RhcnQKKwkud29yZAlmaXFfdHhfaXJxX2FjayAtIGZpcV90eF9zdGFydAorZmlxX3R4X3N0YXJ0OgorCWxkcmIJZmlxX3J0bXAsIFsgZmlxX3JzcGksICMgIFMzQzI0MTBfU1BSREFUIF0KKworCWxkcglmaXFfcnRtcCwgZmlxX3R4X2lycV9hY2sKKwlzdHIJZmlxX3J0bXAsIFsgZmlxX3JpcnEsICMgUzNDMjQxMF9TUkNQTkQgLSBTM0MyNFhYX1ZBX0lSUSBdCisKKwlsZHJiCWZpcV9ydG1wLCBbIGZpcV9ydHggXSwgIzEKKwlzdHJiCWZpcV9ydG1wLCBbIGZpcV9yc3BpLCAjIFMzQzI0MTBfU1BUREFUIF0KKworCXN1YnMJZmlxX3Jjb3VudCwgZmlxX3Jjb3VudCwgIzEKKwlzdWJuZXMJcGMsIGxyLCAjNAkJQEAgcmV0dXJuLCBzdGlsbCBoYXZlIHdvcmsgdG8gZG8KKworCW1vdglmaXFfcnRtcCwgIzAKKwlzdHIJZmlxX3J0bXAsIFsgZmlxX3JpcnEsICMgUzNDMjQxMF9JTlRNT0QgIC0gUzNDMjRYWF9WQV9JUlEgXQorCXN1YnMJcGMsIGxyLCAjNAorCitmaXFfdHhfaXJxX2FjazoKKwkud29yZAkwCisKK2ZpcV90eF9lbmQ6CisKKwkuZW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eF9maXEuaCBiL2RyaXZlcnMvc3BpL3NwaS1zM2MyNHh4LWZpcS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3NwaS9zcGlfczNjMjR4eF9maXEuaApyZW5hbWUgdG8gZHJpdmVycy9zcGkvc3BpLXMzYzI0eHgtZmlxLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zM2MyNHh4LmMgYi9kcml2ZXJzL3NwaS9zcGktczNjMjR4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OTZhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktczNjMjR4eC5jCkBAIC0wLDAgKzEsNzQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEJlbiBEb29rcworICogQ29weXJpZ2h0IDIwMDYtMjAwOSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorCisjaW5jbHVkZSA8cGxhdC9yZWdzLXNwaS5oPgorI2luY2x1ZGUgPG1hY2gvc3BpLmg+CisKKyNpbmNsdWRlIDxwbGF0L2ZpcS5oPgorI2luY2x1ZGUgPGFzbS9maXEuaD4KKworI2luY2x1ZGUgInNwaS1zM2MyNHh4LWZpcS5oIgorCisvKioKKyAqIHMzYzI0eHhfc3BpX2RldnN0YXRlIC0gcGVyIGRldmljZSBkYXRhCisgKiBAaHo6IExhc3QgZnJlcXVlbmN5IGNhbGN1bGF0ZWQgZm9yIEBzcHByZSBmaWVsZC4KKyAqIEBtb2RlOiBMYXN0IG1vZGUgc2V0dGluZyBmb3IgdGhlIEBzcGNvbiBmaWVsZC4KKyAqIEBzcGNvbjogVmFsdWUgdG8gd3JpdGUgdG8gdGhlIFNQQ09OIHJlZ2lzdGVyLgorICogQHNwcHJlOiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgU1BQUkUgcmVnaXN0ZXIuCisgKi8KK3N0cnVjdCBzM2MyNHh4X3NwaV9kZXZzdGF0ZSB7CisJdW5zaWduZWQgaW50CWh6OworCXVuc2lnbmVkIGludAltb2RlOworCXU4CQlzcGNvbjsKKwl1OAkJc3BwcmU7Cit9OworCitlbnVtIHNwaV9maXFfbW9kZSB7CisJRklRX01PREVfTk9ORQk9IDAsCisJRklRX01PREVfVFgJPSAxLAorCUZJUV9NT0RFX1JYCT0gMiwKKwlGSVFfTU9ERV9UWFJYCT0gMywKK307CisKK3N0cnVjdCBzM2MyNHh4X3NwaSB7CisJLyogYml0YmFuZyBoYXMgdG8gYmUgZmlyc3QgKi8KKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJIGJpdGJhbmc7CisJc3RydWN0IGNvbXBsZXRpb24JIGRvbmU7CisKKwl2b2lkIF9faW9tZW0JCSpyZWdzOworCWludAkJCSBpcnE7CisJaW50CQkJIGxlbjsKKwlpbnQJCQkgY291bnQ7CisKKwlzdHJ1Y3QgZmlxX2hhbmRsZXIJIGZpcV9oYW5kbGVyOworCWVudW0gc3BpX2ZpcV9tb2RlCSBmaXFfbW9kZTsKKwl1bnNpZ25lZCBjaGFyCQkgZmlxX2ludXNlOworCXVuc2lnbmVkIGNoYXIJCSBmaXFfY2xhaW1lZDsKKworCXZvaWQJCQkoKnNldF9jcykoc3RydWN0IHMzYzI0MTBfc3BpX2luZm8gKnNwaSwKKwkJCQkJICBpbnQgY3MsIGludCBwb2wpOworCisJLyogZGF0YSBidWZmZXJzICovCisJY29uc3QgdW5zaWduZWQgY2hhcgkqdHg7CisJdW5zaWduZWQgY2hhcgkJKnJ4OworCisJc3RydWN0IGNsawkJKmNsazsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSppb2FyZWE7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqY3VyZGV2OworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IHMzYzI0MTBfc3BpX2luZm8gKnBkYXRhOworfTsKKworCisjZGVmaW5lIFNQQ09OX0RFRkFVTFQgKFMzQzI0MTBfU1BDT05fTVNUUiB8IFMzQzI0MTBfU1BDT05fU01PRF9JTlQpCisjZGVmaW5lIFNQUElOX0RFRkFVTFQgKFMzQzI0MTBfU1BQSU5fS0VFUCkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4eF9zcGkgKnRvX2h3KHN0cnVjdCBzcGlfZGV2aWNlICpzZGV2KQoreworCXJldHVybiBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNkZXYtPm1hc3Rlcik7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0eHhfc3BpX2dwaW9jcyhzdHJ1Y3QgczNjMjQxMF9zcGlfaW5mbyAqc3BpLCBpbnQgY3MsIGludCBwb2wpCit7CisJZ3Bpb19zZXRfdmFsdWUoc3BpLT5waW5fY3MsIHBvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0eHhfc3BpX2NoaXBzZWwoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQoreworCXN0cnVjdCBzM2MyNHh4X3NwaV9kZXZzdGF0ZSAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJc3RydWN0IHMzYzI0eHhfc3BpICpodyA9IHRvX2h3KHNwaSk7CisJdW5zaWduZWQgaW50IGNzcG9sID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0ggPyAxIDogMDsKKworCS8qIGNoYW5nZSB0aGUgY2hpcHNlbGVjdCBzdGF0ZSBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzcGkgZW5naW5lIGNsb2NrICovCisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSBCSVRCQU5HX0NTX0lOQUNUSVZFOgorCQlody0+c2V0X2NzKGh3LT5wZGF0YSwgc3BpLT5jaGlwX3NlbGVjdCwgY3Nwb2xeMSk7CisJCXdyaXRlYihjcy0+c3Bjb24sIGh3LT5yZWdzICsgUzNDMjQxMF9TUENPTik7CisJCWJyZWFrOworCisJY2FzZSBCSVRCQU5HX0NTX0FDVElWRToKKwkJd3JpdGViKGNzLT5zcGNvbiB8IFMzQzI0MTBfU1BDT05fRU5TQ0ssCisJCSAgICAgICBody0+cmVncyArIFMzQzI0MTBfU1BDT04pOworCQlody0+c2V0X2NzKGh3LT5wZGF0YSwgc3BpLT5jaGlwX3NlbGVjdCwgY3Nwb2wpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgczNjMjR4eF9zcGlfdXBkYXRlX3N0YXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IHMzYzI0eHhfc3BpICpodyA9IHRvX2h3KHNwaSk7CisJc3RydWN0IHMzYzI0eHhfc3BpX2RldnN0YXRlICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgYnB3OworCXVuc2lnbmVkIGludCBoejsKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVuc2lnbmVkIGxvbmcgY2xrOworCisJYnB3ID0gdCA/IHQtPmJpdHNfcGVyX3dvcmQgOiBzcGktPmJpdHNfcGVyX3dvcmQ7CisJaHogID0gdCA/IHQtPnNwZWVkX2h6IDogc3BpLT5tYXhfc3BlZWRfaHo7CisKKwlpZiAoIWJwdykKKwkJYnB3ID0gODsKKworCWlmICghaHopCisJCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CisKKwlpZiAoYnB3ICE9IDgpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJpbnZhbGlkIGJpdHMtcGVyLXdvcmQgKCVkKVxuIiwgYnB3KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNwaS0+bW9kZSAhPSBjcy0+bW9kZSkgeworCQl1OCBzcGNvbiA9IFNQQ09OX0RFRkFVTFQgfCBTM0MyNDEwX1NQQ09OX0VOU0NLOworCisJCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJCXNwY29uIHw9IFMzQzI0MTBfU1BDT05fQ1BIQV9GTVRCOworCisJCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJCXNwY29uIHw9IFMzQzI0MTBfU1BDT05fQ1BPTF9ISUdIOworCisJCWNzLT5tb2RlID0gc3BpLT5tb2RlOworCQljcy0+c3Bjb24gPSBzcGNvbjsKKwl9CisKKwlpZiAoY3MtPmh6ICE9IGh6KSB7CisJCWNsayA9IGNsa19nZXRfcmF0ZShody0+Y2xrKTsKKwkJZGl2ID0gRElWX1JPVU5EX1VQKGNsaywgaHogKiAyKSAtIDE7CisKKwkJaWYgKGRpdiA+IDI1NSkKKwkJCWRpdiA9IDI1NTsKKworCQlkZXZfZGJnKCZzcGktPmRldiwgInByZS1zY2FsZXI9JWQgKHdhbnRlZCAlZCwgZ290ICVsZClcbiIsCisJCQlkaXYsIGh6LCBjbGsgLyAoMiAqIChkaXYgKyAxKSkpOworCisJCWNzLT5oeiA9IGh6OworCQljcy0+c3BwcmUgPSBkaXY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjR4eF9zcGlfc2V0dXB4ZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IHMzYzI0eHhfc3BpX2RldnN0YXRlICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gdG9faHcoc3BpKTsKKwlpbnQgcmV0OworCisJcmV0ID0gczNjMjR4eF9zcGlfdXBkYXRlX3N0YXRlKHNwaSwgdCk7CisJaWYgKCFyZXQpCisJCXdyaXRlYihjcy0+c3BwcmUsIGh3LT5yZWdzICsgUzNDMjQxMF9TUFBSRSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHMzYzI0eHhfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHMzYzI0eHhfc3BpX2RldnN0YXRlICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gdG9faHcoc3BpKTsKKwlpbnQgcmV0OworCisJLyogYWxsb2NhdGUgc2V0dGluZ3Mgb24gdGhlIGZpcnN0IGNhbGwgKi8KKwlpZiAoIWNzKSB7CisJCWNzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHMzYzI0eHhfc3BpX2RldnN0YXRlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY3MpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gbWVtb3J5IGZvciBjb250cm9sbGVyIHN0YXRlXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJY3MtPnNwY29uID0gU1BDT05fREVGQVVMVDsKKwkJY3MtPmh6ID0gLTE7CisJCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IGNzOworCX0KKworCS8qIGluaXRpYWxpc2UgdGhlIHN0YXRlIGZyb20gdGhlIGRldmljZSAqLworCXJldCA9IHMzYzI0eHhfc3BpX3VwZGF0ZV9zdGF0ZShzcGksIE5VTEwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2soJmh3LT5iaXRiYW5nLmxvY2spOworCWlmICghaHctPmJpdGJhbmcuYnVzeSkgeworCQlody0+Yml0YmFuZy5jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19JTkFDVElWRSk7CisJCS8qIG5lZWQgdG8gbmRlbGF5IGZvciAwLjUgY2xvY2t0aWNrID8gKi8KKwl9CisJc3Bpbl91bmxvY2soJmh3LT5iaXRiYW5nLmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0eHhfc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlrZnJlZShzcGktPmNvbnRyb2xsZXJfc3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBod190eGJ5dGUoc3RydWN0IHMzYzI0eHhfc3BpICpodywgaW50IGNvdW50KQoreworCXJldHVybiBody0+dHggPyBody0+dHhbY291bnRdIDogMDsKK30KKworI2lmZGVmIENPTkZJR19TUElfUzNDMjRYWF9GSVEKKy8qIFN1cHBvcnQgZm9yIEZJUSBiYXNlZCBwc2V1ZG8tRE1BIHRvIGltcHJvdmUgdGhlIHRyYW5zZmVyIHNwZWVkLgorICoKKyAqIFRoaXMgY29kZSB1c2VzIHRoZSBhc3NlbWJseSBoZWxwZXIgaW4gc3BpX3MzYzI0eHhfc3BpLlMgd2hpY2ggaXMKKyAqIHVzZWQgYnkgdGhlIEZJUSBjb3JlIHRvIG1vdmUgZGF0YSBiZXR3ZWVuIG1haW4gbWVtb3J5IGFuZCB0aGUgcGVyaXBoZXJhbAorICogYmxvY2suIFNpbmNlIHRoaXMgaXMgY29kZSBydW5uaW5nIG9uIHRoZSBwcm9jZXNzb3IsIHRoZXJlIGlzIG5vIHByb2JsZW0KKyAqIHdpdGggY2FjaGUgY29oZXJlbmN5IG9mIHRoZSBidWZmZXJzLCBzbyB3ZSBjYW4gdXNlIGFueSBidWZmZXIgd2UgbGlrZS4KKyAqLworCisvKioKKyAqIHN0cnVjdCBzcGlfZmlxX2NvZGUgLSBGSVEgY29kZSBhbmQgaGVhZGVyCisgKiBAbGVuZ3RoOiBUaGUgbGVuZ3RoIG9mIHRoZSBjb2RlIGZyYWdtZW50LCBleGNsdWRpbmcgdGhpcyBoZWFkZXIuCisgKiBAYWNrX29mZnNldDogVGhlIG9mZnNldCBmcm9tIEBkYXRhIHRvIHRoZSB3b3JkIHRvIHBsYWNlIHRoZSBJUlEgQUNLIGJpdCBhdC4KKyAqIEBkYXRhOiBUaGUgY29kZSBpdHNlbGYgdG8gaW5zdGFsbCBhcyBhIEZJUSBoYW5kbGVyLgorICovCitzdHJ1Y3Qgc3BpX2ZpcV9jb2RlIHsKKwl1MzIJbGVuZ3RoOworCXUzMglhY2tfb2Zmc2V0OworCXU4CWRhdGFbMF07Cit9OworCitleHRlcm4gc3RydWN0IHNwaV9maXFfY29kZSBzM2MyNHh4X3NwaV9maXFfdHhyeDsKK2V4dGVybiBzdHJ1Y3Qgc3BpX2ZpcV9jb2RlIHMzYzI0eHhfc3BpX2ZpcV90eDsKK2V4dGVybiBzdHJ1Y3Qgc3BpX2ZpcV9jb2RlIHMzYzI0eHhfc3BpX2ZpcV9yeDsKKworLyoqCisgKiBhY2tfYml0IC0gdHVybiBJUlEgaW50byBJUlEgYWNrbm93bGVkZ2VtZW50IGJpdAorICogQGlycTogVGhlIGludGVycnVwdCBudW1iZXIKKyAqCisgKiBSZXR1cm5zIHRoZSBiaXQgdG8gd3JpdGUgdG8gdGhlIGludGVycnVwdCBhY2tub3dsZWRnZSByZWdpc3Rlci4KKyAqLworc3RhdGljIGlubGluZSB1MzIgYWNrX2JpdCh1bnNpZ25lZCBpbnQgaXJxKQoreworCXJldHVybiAxIDw8IChpcnEgLSBJUlFfRUlOVDApOworfQorCisvKioKKyAqIHMzYzI0eHhfc3BpX3RyeWZpcSAtIGF0dGVtcHQgdG8gY2xhaW0gYW5kIHNldHVwIEZJUSBmb3IgdHJhbnNmZXIKKyAqIEBodzogVGhlIGhhcmR3YXJlIHN0YXRlLgorICoKKyAqIENsYWltIHRoZSBGSVEgaGFuZGxlciAob25seSBvbmUgY2FuIGJlIGFjdGl2ZSBhdCBhbnkgb25lIHRpbWUpIGFuZAorICogdGhlbiBzZXR1cCB0aGUgY29ycmVjdCB0cmFuc2ZlciBjb2RlIGZvciB0aGlzIHRyYW5zZmVyLgorICoKKyAqIFRoaXMgY2FsbCB1cGRhdGVzIGFsbCB0aGUgbmVjZXNzYXJ5IHN0YXRlIGluZm9ybWF0aW9uIGlmIHN1Y2Nlc3NmdWwsCisgKiBzbyB0aGUgY2FsbGVyIGRvZXMgbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgbW9yZSB0aGFuIHN0YXJ0IHRoZSB0cmFuc2ZlcgorICogYXMgbm9ybWFsLCBzaW5jZSB0aGUgSVJRIHdpbGwgaGF2ZSBiZWVuIHJlLXJvdXRlZCB0byB0aGUgRklRIGhhbmRsZXIuCisqLwordm9pZCBzM2MyNHh4X3NwaV90cnlmaXEoc3RydWN0IHMzYzI0eHhfc3BpICpodykKK3sKKwlzdHJ1Y3QgcHRfcmVncyByZWdzOworCWVudW0gc3BpX2ZpcV9tb2RlIG1vZGU7CisJc3RydWN0IHNwaV9maXFfY29kZSAqY29kZTsKKwlpbnQgcmV0OworCisJaWYgKCFody0+ZmlxX2NsYWltZWQpIHsKKwkJLyogdHJ5IGFuZCBjbGFpbSBmaXEgaWYgd2UgaGF2ZW4ndCBnb3QgaXQsIGFuZCBpZiBub3QKKwkJICogdGhlbiByZXR1cm4gYW5kIHNpbXBseSB1c2UgYW5vdGhlciB0cmFuc2ZlciBtZXRob2QgKi8KKworCQlyZXQgPSBjbGFpbV9maXEoJmh3LT5maXFfaGFuZGxlcik7CisJCWlmIChyZXQpCisJCQlyZXR1cm47CisJfQorCisJaWYgKGh3LT50eCAmJiAhaHctPnJ4KQorCQltb2RlID0gRklRX01PREVfVFg7CisJZWxzZSBpZiAoaHctPnJ4ICYmICFody0+dHgpCisJCW1vZGUgPSBGSVFfTU9ERV9SWDsKKwllbHNlCisJCW1vZGUgPSBGSVFfTU9ERV9UWFJYOworCisJcmVncy51cmVnc1tmaXFfcnNwaV0gPSAobG9uZylody0+cmVnczsKKwlyZWdzLnVyZWdzW2ZpcV9ycnhdICA9IChsb25nKWh3LT5yeDsKKwlyZWdzLnVyZWdzW2ZpcV9ydHhdICA9IChsb25nKWh3LT50eCArIDE7CisJcmVncy51cmVnc1tmaXFfcmNvdW50XSA9IGh3LT5sZW4gLSAxOworCXJlZ3MudXJlZ3NbZmlxX3JpcnFdID0gKGxvbmcpUzNDMjRYWF9WQV9JUlE7CisKKwlzZXRfZmlxX3JlZ3MoJnJlZ3MpOworCisJaWYgKGh3LT5maXFfbW9kZSAhPSBtb2RlKSB7CisJCXUzMiAqYWNrX3B0cjsKKworCQlody0+ZmlxX21vZGUgPSBtb2RlOworCisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIEZJUV9NT0RFX1RYOgorCQkJY29kZSA9ICZzM2MyNHh4X3NwaV9maXFfdHg7CisJCQlicmVhazsKKwkJY2FzZSBGSVFfTU9ERV9SWDoKKwkJCWNvZGUgPSAmczNjMjR4eF9zcGlfZmlxX3J4OworCQkJYnJlYWs7CisJCWNhc2UgRklRX01PREVfVFhSWDoKKwkJCWNvZGUgPSAmczNjMjR4eF9zcGlfZmlxX3R4cng7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvZGUgPSBOVUxMOworCQl9CisKKwkJQlVHX09OKCFjb2RlKTsKKworCQlhY2tfcHRyID0gKHUzMiAqKSZjb2RlLT5kYXRhW2NvZGUtPmFja19vZmZzZXRdOworCQkqYWNrX3B0ciA9IGFja19iaXQoaHctPmlycSk7CisKKwkJc2V0X2ZpcV9oYW5kbGVyKCZjb2RlLT5kYXRhLCBjb2RlLT5sZW5ndGgpOworCX0KKworCXMzYzI0eHhfc2V0X2ZpcShody0+aXJxLCB0cnVlKTsKKworCWh3LT5maXFfbW9kZSA9IG1vZGU7CisJaHctPmZpcV9pbnVzZSA9IDE7Cit9CisKKy8qKgorICogczNjMjR4eF9zcGlfZmlxb3AgLSBGSVEgY29yZSBjb2RlIGNhbGxiYWNrCisgKiBAcHc6IERhdGEgcmVnaXN0ZXJlZCB3aXRoIHRoZSBoYW5kbGVyCisgKiBAcmVsZWFzZTogV2hldGhlciB0aGlzIGlzIGEgcmVsZWFzZSBvciBhIHJldHVybi4KKyAqCisgKiBDYWxsZWQgYnkgdGhlIEZJUSBjb2RlIHdoZW4gYW5vdGhlciBtb2R1bGUgd2FudHMgdG8gdXNlIHRoZSBGSVEsIHNvCisgKiByZXR1cm4gd2hldGhlciB3ZSBhcmUgY3VycmVudGx5IHVzaW5nIHRoaXMgb3Igbm90IGFuZCB0aGVuIHVwZGF0ZSBvdXIKKyAqIGludGVybmFsIHN0YXRlLgorICovCitzdGF0aWMgaW50IHMzYzI0eHhfc3BpX2ZpcW9wKHZvaWQgKnB3LCBpbnQgcmVsZWFzZSkKK3sKKwlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gcHc7CisJaW50IHJldCA9IDA7CisKKwlpZiAocmVsZWFzZSkgeworCQlpZiAoaHctPmZpcV9pbnVzZSkKKwkJCXJldCA9IC1FQlVTWTsKKworCQkvKiBub3RlLCB3ZSBkbyBub3QgbmVlZCB0byB1bnJvdXRlIHRoZSBGSVEsIGFzIHRoZSBGSVEKKwkJICogdmVjdG9yIGNvZGUgZGUtcm91dGVzIGl0IHRvIHNpZ25hbCB0aGUgZW5kIG9mIHRyYW5zZmVyICovCisKKwkJaHctPmZpcV9tb2RlID0gRklRX01PREVfTk9ORTsKKwkJaHctPmZpcV9jbGFpbWVkID0gMDsKKwl9IGVsc2UgeworCQlody0+ZmlxX2NsYWltZWQgPSAxOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogczNjMjR4eF9zcGlfaW5pdGZpcSAtIHNldHVwIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIEZJUSBjb3JlCisgKiBAaHc6IFRoZSBoYXJkd2FyZSBzdGF0ZS4KKyAqCisgKiBTZXR1cCB0aGUgZmlxX2hhbmRsZXIgYmxvY2sgdG8gcGFzcyB0byB0aGUgRklRIGNvcmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNHh4X3NwaV9pbml0ZmlxKHN0cnVjdCBzM2MyNHh4X3NwaSAqaHcpCit7CisJaHctPmZpcV9oYW5kbGVyLmRldl9pZCA9IGh3OworCWh3LT5maXFfaGFuZGxlci5uYW1lID0gZGV2X25hbWUoaHctPmRldik7CisJaHctPmZpcV9oYW5kbGVyLmZpcV9vcCA9IHMzYzI0eHhfc3BpX2ZpcW9wOworfQorCisvKioKKyAqIHMzYzI0eHhfc3BpX3VzZWZpcSAtIHJldHVybiBpZiB3ZSBzaG91bGQgYmUgdXNpbmcgRklRLgorICogQGh3OiBUaGUgaGFyZHdhcmUgc3RhdGUuCisgKgorICogUmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGRhdGEgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBjaGFubmVsIGlzCisgKiBhbGxvd2VkIHRvIHVzZSB0aGUgRklRLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgczNjMjR4eF9zcGlfdXNlZmlxKHN0cnVjdCBzM2MyNHh4X3NwaSAqaHcpCit7CisJcmV0dXJuIGh3LT5wZGF0YS0+dXNlX2ZpcTsKK30KKworLyoqCisgKiBzM2MyNHh4X3NwaV91c2luZ2ZpcSAtIHJldHVybiBpZiBjaGFubmVsIGlzIHVzaW5nIEZJUQorICogQHNwaTogVGhlIGhhcmR3YXJlIHN0YXRlLgorICoKKyAqIFJldHVybiB3aGV0aGVyIHRoZSBjaGFubmVsIGlzIGN1cnJlbnRseSB1c2luZyB0aGUgRklRIChzZXBhcmF0ZSBmcm9tCisgKiB3aGV0aGVyIHRoZSBGSVEgaXMgY2xhaW1lZCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBzM2MyNHh4X3NwaV91c2luZ2ZpcShzdHJ1Y3QgczNjMjR4eF9zcGkgKnNwaSkKK3sKKwlyZXR1cm4gc3BpLT5maXFfaW51c2U7Cit9CisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjMjR4eF9zcGlfaW5pdGZpcShzdHJ1Y3QgczNjMjR4eF9zcGkgKnMpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHMzYzI0eHhfc3BpX3RyeWZpcShzdHJ1Y3QgczNjMjR4eF9zcGkgKnMpIHsgfQorc3RhdGljIGlubGluZSBib29sIHMzYzI0eHhfc3BpX3VzZWZpcShzdHJ1Y3QgczNjMjR4eF9zcGkgKnMpIHsgcmV0dXJuIGZhbHNlOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgczNjMjR4eF9zcGlfdXNpbmdmaXEoc3RydWN0IHMzYzI0eHhfc3BpICpzKSB7IHJldHVybiBmYWxzZTsgfQorCisjZW5kaWYgLyogQ09ORklHX1NQSV9TM0MyNFhYX0ZJUSAqLworCitzdGF0aWMgaW50IHMzYzI0eHhfc3BpX3R4cngoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gdG9faHcoc3BpKTsKKworCWh3LT50eCA9IHQtPnR4X2J1ZjsKKwlody0+cnggPSB0LT5yeF9idWY7CisJaHctPmxlbiA9IHQtPmxlbjsKKwlody0+Y291bnQgPSAwOworCisJaW5pdF9jb21wbGV0aW9uKCZody0+ZG9uZSk7CisKKwlody0+ZmlxX2ludXNlID0gMDsKKwlpZiAoczNjMjR4eF9zcGlfdXNlZmlxKGh3KSAmJiB0LT5sZW4gPj0gMykKKwkJczNjMjR4eF9zcGlfdHJ5ZmlxKGh3KTsKKworCS8qIHNlbmQgdGhlIGZpcnN0IGJ5dGUgKi8KKwl3cml0ZWIoaHdfdHhieXRlKGh3LCAwKSwgaHctPnJlZ3MgKyBTM0MyNDEwX1NQVERBVCk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZody0+ZG9uZSk7CisJcmV0dXJuIGh3LT5jb3VudDsKK30KKworc3RhdGljIGlycXJldHVybl90IHMzYzI0eHhfc3BpX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IHMzYzI0eHhfc3BpICpodyA9IGRldjsKKwl1bnNpZ25lZCBpbnQgc3BzdGEgPSByZWFkYihody0+cmVncyArIFMzQzI0MTBfU1BTVEEpOworCXVuc2lnbmVkIGludCBjb3VudCA9IGh3LT5jb3VudDsKKworCWlmIChzcHN0YSAmIFMzQzI0MTBfU1BTVEFfRENPTCkgeworCQlkZXZfZGJnKGh3LT5kZXYsICJkYXRhLWNvbGxpc2lvblxuIik7CisJCWNvbXBsZXRlKCZody0+ZG9uZSk7CisJCWdvdG8gaXJxX2RvbmU7CisJfQorCisJaWYgKCEoc3BzdGEgJiBTM0MyNDEwX1NQU1RBX1JFQURZKSkgeworCQlkZXZfZGJnKGh3LT5kZXYsICJzcGkgbm90IHJlYWR5IGZvciB0eD9cbiIpOworCQljb21wbGV0ZSgmaHctPmRvbmUpOworCQlnb3RvIGlycV9kb25lOworCX0KKworCWlmICghczNjMjR4eF9zcGlfdXNpbmdmaXEoaHcpKSB7CisJCWh3LT5jb3VudCsrOworCisJCWlmIChody0+cngpCisJCQlody0+cnhbY291bnRdID0gcmVhZGIoaHctPnJlZ3MgKyBTM0MyNDEwX1NQUkRBVCk7CisKKwkJY291bnQrKzsKKworCQlpZiAoY291bnQgPCBody0+bGVuKQorCQkJd3JpdGViKGh3X3R4Ynl0ZShodywgY291bnQpLCBody0+cmVncyArIFMzQzI0MTBfU1BUREFUKTsKKwkJZWxzZQorCQkJY29tcGxldGUoJmh3LT5kb25lKTsKKwl9IGVsc2UgeworCQlody0+Y291bnQgPSBody0+bGVuOworCQlody0+ZmlxX2ludXNlID0gMDsKKworCQlpZiAoaHctPnJ4KQorCQkJaHctPnJ4W2h3LT5sZW4tMV0gPSByZWFkYihody0+cmVncyArIFMzQzI0MTBfU1BSREFUKTsKKworCQljb21wbGV0ZSgmaHctPmRvbmUpOworCX0KKworIGlycV9kb25lOgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgczNjMjR4eF9zcGlfaW5pdGlhbHNldHVwKHN0cnVjdCBzM2MyNHh4X3NwaSAqaHcpCit7CisJLyogZm9yIHRoZSBtb21lbnQsIHBlcm1hbmVudGx5IGVuYWJsZSB0aGUgY2xvY2sgKi8KKworCWNsa19lbmFibGUoaHctPmNsayk7CisKKwkvKiBwcm9ncmFtIGRlZmF1bHRzIGludG8gdGhlIHJlZ2lzdGVycyAqLworCisJd3JpdGViKDB4ZmYsIGh3LT5yZWdzICsgUzNDMjQxMF9TUFBSRSk7CisJd3JpdGViKFNQUElOX0RFRkFVTFQsIGh3LT5yZWdzICsgUzNDMjQxMF9TUFBJTik7CisJd3JpdGViKFNQQ09OX0RFRkFVTFQsIGh3LT5yZWdzICsgUzNDMjQxMF9TUENPTik7CisKKwlpZiAoaHctPnBkYXRhKSB7CisJCWlmIChody0+c2V0X2NzID09IHMzYzI0eHhfc3BpX2dwaW9jcykKKwkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChody0+cGRhdGEtPnBpbl9jcywgMSk7CisKKwkJaWYgKGh3LT5wZGF0YS0+Z3Bpb19zZXR1cCkKKwkJCWh3LT5wZGF0YS0+Z3Bpb19zZXR1cChody0+cGRhdGEsIDEpOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgczNjMjQxMF9zcGlfaW5mbyAqcGRhdGE7CisJc3RydWN0IHMzYzI0eHhfc3BpICpodzsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBlcnIgPSAwOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHMzYzI0eHhfc3BpKSk7CisJaWYgKG1hc3RlciA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIG1lbW9yeSBmb3Igc3BpX21hc3RlclxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX25vbWVtOworCX0KKworCWh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCW1lbXNldChodywgMCwgc2l6ZW9mKHN0cnVjdCBzM2MyNHh4X3NwaSkpOworCisJaHctPm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJaHctPnBkYXRhID0gcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlody0+ZGV2ID0gJnBkZXYtPmRldjsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGVycl9ub19wZGF0YTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7CisJaW5pdF9jb21wbGV0aW9uKCZody0+ZG9uZSk7CisKKwkvKiBpbml0aWFsaXNlIGZpcSBoYW5kbGVyICovCisKKwlzM2MyNHh4X3NwaV9pbml0ZmlxKGh3KTsKKworCS8qIHNldHVwIHRoZSBtYXN0ZXIgc3RhdGUuICovCisKKwkvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKKworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBody0+cGRhdGEtPm51bV9jczsKKwltYXN0ZXItPmJ1c19udW0gPSBwZGF0YS0+YnVzX251bTsKKworCS8qIHNldHVwIHRoZSBzdGF0ZSBmb3IgdGhlIGJpdGJhbmcgZHJpdmVyICovCisKKwlody0+Yml0YmFuZy5tYXN0ZXIgICAgICAgICA9IGh3LT5tYXN0ZXI7CisJaHctPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSBzM2MyNHh4X3NwaV9zZXR1cHhmZXI7CisJaHctPmJpdGJhbmcuY2hpcHNlbGVjdCAgICAgPSBzM2MyNHh4X3NwaV9jaGlwc2VsOworCWh3LT5iaXRiYW5nLnR4cnhfYnVmcyAgICAgID0gczNjMjR4eF9zcGlfdHhyeDsKKworCWh3LT5tYXN0ZXItPnNldHVwICA9IHMzYzI0eHhfc3BpX3NldHVwOworCWh3LT5tYXN0ZXItPmNsZWFudXAgPSBzM2MyNHh4X3NwaV9jbGVhbnVwOworCisJZGV2X2RiZyhody0+ZGV2LCAiYml0YmFuZyBhdCAlcFxuIiwgJmh3LT5iaXRiYW5nKTsKKworCS8qIGZpbmQgYW5kIG1hcCBvdXIgcmVzb3VyY2VzICovCisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZ2V0IElPUkVTT1VSQ0VfTUVNXG4iKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBlcnJfbm9faW9yZXM7CisJfQorCisJaHctPmlvYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCisJCQkJCXBkZXYtPm5hbWUpOworCisJaWYgKGh3LT5pb2FyZWEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVzZXJ2ZSByZWdpb25cbiIpOworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gZXJyX25vX2lvcmVzOworCX0KKworCWh3LT5yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmIChody0+cmVncyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBtYXAgSU9cbiIpOworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gZXJyX25vX2lvbWFwOworCX0KKworCWh3LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChody0+aXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgc3BlY2lmaWVkXG4iKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBlcnJfbm9faXJxOworCX0KKworCWVyciA9IHJlcXVlc3RfaXJxKGh3LT5pcnEsIHMzYzI0eHhfc3BpX2lycSwgMCwgcGRldi0+bmFtZSwgaHcpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGNsYWltIElSUVxuIik7CisJCWdvdG8gZXJyX25vX2lycTsKKwl9CisKKwlody0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAic3BpIik7CisJaWYgKElTX0VSUihody0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBjbG9jayBmb3IgZGV2aWNlXG4iKTsKKwkJZXJyID0gUFRSX0VSUihody0+Y2xrKTsKKwkJZ290byBlcnJfbm9fY2xrOworCX0KKworCS8qIHNldHVwIGFueSBncGlvIHdlIGNhbiAqLworCisJaWYgKCFwZGF0YS0+c2V0X2NzKSB7CisJCWlmIChwZGF0YS0+cGluX2NzIDwgMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gY2hpcHNlbGVjdCBwaW5cbiIpOworCQkJZ290byBlcnJfcmVnaXN0ZXI7CisJCX0KKworCQllcnIgPSBncGlvX3JlcXVlc3QocGRhdGEtPnBpbl9jcywgZGV2X25hbWUoJnBkZXYtPmRldikpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGdwaW8gZm9yIGNzXG4iKTsKKwkJCWdvdG8gZXJyX3JlZ2lzdGVyOworCQl9CisKKwkJaHctPnNldF9jcyA9IHMzYzI0eHhfc3BpX2dwaW9jczsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5waW5fY3MsIDEpOworCX0gZWxzZQorCQlody0+c2V0X2NzID0gcGRhdGEtPnNldF9jczsKKworCXMzYzI0eHhfc3BpX2luaXRpYWxzZXR1cChodyk7CisKKwkvKiByZWdpc3RlciBvdXIgc3BpIGNvbnRyb2xsZXIgKi8KKworCWVyciA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZody0+Yml0YmFuZyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgU1BJIG1hc3RlclxuIik7CisJCWdvdG8gZXJyX3JlZ2lzdGVyOworCX0KKworCXJldHVybiAwOworCisgZXJyX3JlZ2lzdGVyOgorCWlmIChody0+c2V0X2NzID09IHMzYzI0eHhfc3BpX2dwaW9jcykKKwkJZ3Bpb19mcmVlKHBkYXRhLT5waW5fY3MpOworCisJY2xrX2Rpc2FibGUoaHctPmNsayk7CisJY2xrX3B1dChody0+Y2xrKTsKKworIGVycl9ub19jbGs6CisJZnJlZV9pcnEoaHctPmlycSwgaHcpOworCisgZXJyX25vX2lycToKKwlpb3VubWFwKGh3LT5yZWdzKTsKKworIGVycl9ub19pb21hcDoKKwlyZWxlYXNlX3Jlc291cmNlKGh3LT5pb2FyZWEpOworCWtmcmVlKGh3LT5pb2FyZWEpOworCisgZXJyX25vX2lvcmVzOgorIGVycl9ub19wZGF0YToKKwlzcGlfbWFzdGVyX3B1dChody0+bWFzdGVyKTsKKworIGVycl9ub21lbToKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBzM2MyNHh4X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzM2MyNHh4X3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKworCXNwaV9iaXRiYW5nX3N0b3AoJmh3LT5iaXRiYW5nKTsKKworCWNsa19kaXNhYmxlKGh3LT5jbGspOworCWNsa19wdXQoaHctPmNsayk7CisKKwlmcmVlX2lycShody0+aXJxLCBodyk7CisJaW91bm1hcChody0+cmVncyk7CisKKwlpZiAoaHctPnNldF9jcyA9PSBzM2MyNHh4X3NwaV9ncGlvY3MpCisJCWdwaW9fZnJlZShody0+cGRhdGEtPnBpbl9jcyk7CisKKwlyZWxlYXNlX3Jlc291cmNlKGh3LT5pb2FyZWEpOworCWtmcmVlKGh3LT5pb2FyZWEpOworCisJc3BpX21hc3Rlcl9wdXQoaHctPm1hc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHMzYzI0eHhfc3BpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzM2MyNHh4X3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7CisKKwlpZiAoaHctPnBkYXRhICYmIGh3LT5wZGF0YS0+Z3Bpb19zZXR1cCkKKwkJaHctPnBkYXRhLT5ncGlvX3NldHVwKGh3LT5wZGF0YSwgMCk7CisKKwljbGtfZGlzYWJsZShody0+Y2xrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNHh4X3NwaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzM2MyNHh4X3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7CisKKwlzM2MyNHh4X3NwaV9pbml0aWFsc2V0dXAoaHcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgczNjMjR4eF9zcGlfcG1vcHMgPSB7CisJLnN1c3BlbmQJPSBzM2MyNHh4X3NwaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gczNjMjR4eF9zcGlfcmVzdW1lLAorfTsKKworI2RlZmluZSBTM0MyNFhYX1NQSV9QTU9QUyAmczNjMjR4eF9zcGlfcG1vcHMKKyNlbHNlCisjZGVmaW5lIFMzQzI0WFhfU1BJX1BNT1BTIE5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzM2MyNDEwLXNwaSIpOworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjMjR4eF9zcGlfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19leGl0X3AoczNjMjR4eF9zcGlfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiczNjMjQxMC1zcGkiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gUzNDMjRYWF9TUElfUE1PUFMsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHMzYzI0eHhfc3BpX2luaXQodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmczNjMjR4eF9zcGlfZHJpdmVyLCBzM2MyNHh4X3NwaV9wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzM2MyNHh4X3NwaV9leGl0KHZvaWQpCit7CisgICAgICAgIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzM2MyNHh4X3NwaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzM2MyNHh4X3NwaV9pbml0KTsKK21vZHVsZV9leGl0KHMzYzI0eHhfc3BpX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlMzQzI0WFggU1BJIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzLCA8YmVuQHNpbXRlYy5jby51az4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zM2M2NHh4LmMgYi9kcml2ZXJzL3NwaS9zcGktczNjNjR4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWRhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktczNjNjR4eC5jCkBAIC0wLDAgKzEsMTI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIEx0ZC4KKyAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgorI2luY2x1ZGUgPHBsYXQvczNjNjR4eC1zcGkuaD4KKworLyogUmVnaXN0ZXJzIGFuZCBiaXQtZmllbGRzICovCisKKyNkZWZpbmUgUzNDNjRYWF9TUElfQ0hfQ0ZHCQkweDAwCisjZGVmaW5lIFMzQzY0WFhfU1BJX0NMS19DRkcJCTB4MDQKKyNkZWZpbmUgUzNDNjRYWF9TUElfTU9ERV9DRkcJMHgwOAorI2RlZmluZSBTM0M2NFhYX1NQSV9TTEFWRV9TRUwJMHgwQworI2RlZmluZSBTM0M2NFhYX1NQSV9JTlRfRU4JCTB4MTAKKyNkZWZpbmUgUzNDNjRYWF9TUElfU1RBVFVTCQkweDE0CisjZGVmaW5lIFMzQzY0WFhfU1BJX1RYX0RBVEEJCTB4MTgKKyNkZWZpbmUgUzNDNjRYWF9TUElfUlhfREFUQQkJMHgxQworI2RlZmluZSBTM0M2NFhYX1NQSV9QQUNLRVRfQ05UCTB4MjAKKyNkZWZpbmUgUzNDNjRYWF9TUElfUEVORElOR19DTFIJMHgyNAorI2RlZmluZSBTM0M2NFhYX1NQSV9TV0FQX0NGRwkweDI4CisjZGVmaW5lIFMzQzY0WFhfU1BJX0ZCX0NMSwkJMHgyQworCisjZGVmaW5lIFMzQzY0WFhfU1BJX0NIX0hTX0VOCQkoMTw8NikJLyogSGlnaCBTcGVlZCBFbmFibGUgKi8KKyNkZWZpbmUgUzNDNjRYWF9TUElfQ0hfU1dfUlNUCQkoMTw8NSkKKyNkZWZpbmUgUzNDNjRYWF9TUElfQ0hfU0xBVkUJCSgxPDw0KQorI2RlZmluZSBTM0M2NFhYX1NQSV9DUE9MX0wJCSgxPDwzKQorI2RlZmluZSBTM0M2NFhYX1NQSV9DUEhBX0IJCSgxPDwyKQorI2RlZmluZSBTM0M2NFhYX1NQSV9DSF9SWENIX09OCQkoMTw8MSkKKyNkZWZpbmUgUzNDNjRYWF9TUElfQ0hfVFhDSF9PTgkJKDE8PDApCisKKyNkZWZpbmUgUzNDNjRYWF9TUElfQ0xLU0VMX1NSQ01TSwkoMzw8OSkKKyNkZWZpbmUgUzNDNjRYWF9TUElfQ0xLU0VMX1NSQ1NIRlQJOQorI2RlZmluZSBTM0M2NFhYX1NQSV9FTkNMS19FTkFCTEUJKDE8PDgpCisjZGVmaW5lIFMzQzY0WFhfU1BJX1BTUl9NQVNLIAkJMHhmZgorCisjZGVmaW5lIFMzQzY0WFhfU1BJX01PREVfQ0hfVFNaX0JZVEUJCSgwPDwyOSkKKyNkZWZpbmUgUzNDNjRYWF9TUElfTU9ERV9DSF9UU1pfSEFMRldPUkQJKDE8PDI5KQorI2RlZmluZSBTM0M2NFhYX1NQSV9NT0RFX0NIX1RTWl9XT1JECQkoMjw8MjkpCisjZGVmaW5lIFMzQzY0WFhfU1BJX01PREVfQ0hfVFNaX01BU0sJCSgzPDwyOSkKKyNkZWZpbmUgUzNDNjRYWF9TUElfTU9ERV9CVVNfVFNaX0JZVEUJCSgwPDwxNykKKyNkZWZpbmUgUzNDNjRYWF9TUElfTU9ERV9CVVNfVFNaX0hBTEZXT1JECSgxPDwxNykKKyNkZWZpbmUgUzNDNjRYWF9TUElfTU9ERV9CVVNfVFNaX1dPUkQJCSgyPDwxNykKKyNkZWZpbmUgUzNDNjRYWF9TUElfTU9ERV9CVVNfVFNaX01BU0sJCSgzPDwxNykKKyNkZWZpbmUgUzNDNjRYWF9TUElfTU9ERV9SWERNQV9PTgkJKDE8PDIpCisjZGVmaW5lIFMzQzY0WFhfU1BJX01PREVfVFhETUFfT04JCSgxPDwxKQorI2RlZmluZSBTM0M2NFhYX1NQSV9NT0RFXzRCVVJTVAkJCSgxPDwwKQorCisjZGVmaW5lIFMzQzY0WFhfU1BJX1NMQVZFX0FVVE8JCQkoMTw8MSkKKyNkZWZpbmUgUzNDNjRYWF9TUElfU0xBVkVfU0lHX0lOQUNUCQkoMTw8MCkKKworI2RlZmluZSBTM0M2NFhYX1NQSV9BQ1QoYykgd3JpdGVsKDAsIChjKS0+cmVncyArIFMzQzY0WFhfU1BJX1NMQVZFX1NFTCkKKworI2RlZmluZSBTM0M2NFhYX1NQSV9ERUFDVChjKSB3cml0ZWwoUzNDNjRYWF9TUElfU0xBVkVfU0lHX0lOQUNULCBcCisJCQkJCShjKS0+cmVncyArIFMzQzY0WFhfU1BJX1NMQVZFX1NFTCkKKworI2RlZmluZSBTM0M2NFhYX1NQSV9JTlRfVFJBSUxJTkdfRU4JCSgxPDw2KQorI2RlZmluZSBTM0M2NFhYX1NQSV9JTlRfUlhfT1ZFUlJVTl9FTgkJKDE8PDUpCisjZGVmaW5lIFMzQzY0WFhfU1BJX0lOVF9SWF9VTkRFUlJVTl9FTgkJKDE8PDQpCisjZGVmaW5lIFMzQzY0WFhfU1BJX0lOVF9UWF9PVkVSUlVOX0VOCQkoMTw8MykKKyNkZWZpbmUgUzNDNjRYWF9TUElfSU5UX1RYX1VOREVSUlVOX0VOCQkoMTw8MikKKyNkZWZpbmUgUzNDNjRYWF9TUElfSU5UX1JYX0ZJRk9SRFlfRU4JCSgxPDwxKQorI2RlZmluZSBTM0M2NFhYX1NQSV9JTlRfVFhfRklGT1JEWV9FTgkJKDE8PDApCisKKyNkZWZpbmUgUzNDNjRYWF9TUElfU1RfUlhfT1ZFUlJVTl9FUlIJCSgxPDw1KQorI2RlZmluZSBTM0M2NFhYX1NQSV9TVF9SWF9VTkRFUlJVTl9FUlIJKDE8PDQpCisjZGVmaW5lIFMzQzY0WFhfU1BJX1NUX1RYX09WRVJSVU5fRVJSCQkoMTw8MykKKyNkZWZpbmUgUzNDNjRYWF9TUElfU1RfVFhfVU5ERVJSVU5fRVJSCSgxPDwyKQorI2RlZmluZSBTM0M2NFhYX1NQSV9TVF9SWF9GSUZPUkRZCQkoMTw8MSkKKyNkZWZpbmUgUzNDNjRYWF9TUElfU1RfVFhfRklGT1JEWQkJKDE8PDApCisKKyNkZWZpbmUgUzNDNjRYWF9TUElfUEFDS0VUX0NOVF9FTgkJKDE8PDE2KQorCisjZGVmaW5lIFMzQzY0WFhfU1BJX1BORF9UWF9VTkRFUlJVTl9DTFIJCSgxPDw0KQorI2RlZmluZSBTM0M2NFhYX1NQSV9QTkRfVFhfT1ZFUlJVTl9DTFIJCSgxPDwzKQorI2RlZmluZSBTM0M2NFhYX1NQSV9QTkRfUlhfVU5ERVJSVU5fQ0xSCQkoMTw8MikKKyNkZWZpbmUgUzNDNjRYWF9TUElfUE5EX1JYX09WRVJSVU5fQ0xSCQkoMTw8MSkKKyNkZWZpbmUgUzNDNjRYWF9TUElfUE5EX1RSQUlMSU5HX0NMUgkJKDE8PDApCisKKyNkZWZpbmUgUzNDNjRYWF9TUElfU1dBUF9SWF9IQUxGX1dPUkQJCSgxPDw3KQorI2RlZmluZSBTM0M2NFhYX1NQSV9TV0FQX1JYX0JZVEUJCSgxPDw2KQorI2RlZmluZSBTM0M2NFhYX1NQSV9TV0FQX1JYX0JJVAkJCSgxPDw1KQorI2RlZmluZSBTM0M2NFhYX1NQSV9TV0FQX1JYX0VOCQkJKDE8PDQpCisjZGVmaW5lIFMzQzY0WFhfU1BJX1NXQVBfVFhfSEFMRl9XT1JECQkoMTw8MykKKyNkZWZpbmUgUzNDNjRYWF9TUElfU1dBUF9UWF9CWVRFCQkoMTw8MikKKyNkZWZpbmUgUzNDNjRYWF9TUElfU1dBUF9UWF9CSVQJCQkoMTw8MSkKKyNkZWZpbmUgUzNDNjRYWF9TUElfU1dBUF9UWF9FTgkJCSgxPDwwKQorCisjZGVmaW5lIFMzQzY0WFhfU1BJX0ZCQ0xLX01TSwkJKDM8PDApCisKKyNkZWZpbmUgUzNDNjRYWF9TUElfU1RfVFJMQ05UWih2LCBpKSAoKCgodikgPj4gKGkpLT5yeF9sdmxfb2Zmc2V0KSAmIFwKKwkJCQkJKCgoaSktPmZpZm9fbHZsX21hc2sgKyAxKSkpIFwKKwkJCQkJPyAxIDogMCkKKworI2RlZmluZSBTM0M2NFhYX1NQSV9TVF9UWF9ET05FKHYsIGkpICgoKHYpICYgKDEgPDwgKGkpLT50eF9zdF9kb25lKSkgPyAxIDogMCkKKyNkZWZpbmUgVFhfRklGT19MVkwodiwgaSkgKCgodikgPj4gNikgJiAoaSktPmZpZm9fbHZsX21hc2spCisjZGVmaW5lIFJYX0ZJRk9fTFZMKHYsIGkpICgoKHYpID4+IChpKS0+cnhfbHZsX29mZnNldCkgJiAoaSktPmZpZm9fbHZsX21hc2spCisKKyNkZWZpbmUgUzNDNjRYWF9TUElfTUFYX1RSQUlMQ05UCTB4M2ZmCisjZGVmaW5lIFMzQzY0WFhfU1BJX1RSQUlMQ05UX09GRgkxOQorCisjZGVmaW5lIFMzQzY0WFhfU1BJX1RSQUlMQ05UCQlTM0M2NFhYX1NQSV9NQVhfVFJBSUxDTlQKKworI2RlZmluZSBtc2Vjc190b19sb29wcyh0KSAobG9vcHNfcGVyX2ppZmZ5IC8gMTAwMCAqIEhaICogdCkKKworI2RlZmluZSBTVVNQTkQgICAgKDE8PDApCisjZGVmaW5lIFNQSUJVU1kgICAoMTw8MSkKKyNkZWZpbmUgUlhCVVNZICAgICgxPDwyKQorI2RlZmluZSBUWEJVU1kgICAgKDE8PDMpCisKKy8qKgorICogc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhIC0gUnVudGltZSBpbmZvIGhvbGRlciBmb3IgU1BJIGRyaXZlci4KKyAqIEBjbGs6IFBvaW50ZXIgdG8gdGhlIHNwaSBjbG9jay4KKyAqIEBzcmNfY2xrOiBQb2ludGVyIHRvIHRoZSBjbG9jayB1c2VkIHRvIGdlbmVyYXRlIFNQSSBzaWduYWxzLgorICogQG1hc3RlcjogUG9pbnRlciB0byB0aGUgU1BJIFByb3RvY29sIG1hc3Rlci4KKyAqIEB3b3JrcXVldWU6IFdvcmsgcXVldWUgZm9yIHRoZSBTUEkgeGZlciByZXF1ZXN0cy4KKyAqIEBjbnRybHJfaW5mbzogUGxhdGZvcm0gc3BlY2lmaWMgZGF0YSBmb3IgdGhlIGNvbnRyb2xsZXIgdGhpcyBkcml2ZXIgbWFuYWdlcy4KKyAqIEB0Z2xfc3BpOiBQb2ludGVyIHRvIHRoZSBsYXN0IENTIGxlZnQgdW50b2dnbGVkIGJ5IHRoZSBjc19jaGFuZ2UgaGludC4KKyAqIEB3b3JrOiBXb3JrCisgKiBAcXVldWU6IFRvIGxvZyBTUEkgeGZlciByZXF1ZXN0cy4KKyAqIEBsb2NrOiBDb250cm9sbGVyIHNwZWNpZmljIGxvY2suCisgKiBAc3RhdGU6IFNldCBvZiBGTEFHUyB0byBpbmRpY2F0ZSBzdGF0dXMuCisgKiBAcnhfZG1hY2g6IENvbnRyb2xsZXIncyBETUEgY2hhbm5lbCBmb3IgUnguCisgKiBAdHhfZG1hY2g6IENvbnRyb2xsZXIncyBETUEgY2hhbm5lbCBmb3IgVHguCisgKiBAc2ZyX3N0YXJ0OiBCVVMgYWRkcmVzcyBvZiBTUEkgY29udHJvbGxlciByZWdzLgorICogQHJlZ3M6IFBvaW50ZXIgdG8gaW9yZW1hcCdlZCBjb250cm9sbGVyIHJlZ2lzdGVycy4KKyAqIEB4ZmVyX2NvbXBsZXRpb246IFRvIGluZGljYXRlIGNvbXBsZXRpb24gb2YgeGZlciB0YXNrLgorICogQGN1cl9tb2RlOiBTdG9yZXMgdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjb250cm9sbGVyLgorICogQGN1cl9icHc6IFN0b3JlcyB0aGUgYWN0aXZlIGJpdHMgcGVyIHdvcmQgc2V0dGluZ3MuCisgKiBAY3VyX3NwZWVkOiBTdG9yZXMgdGhlIGFjdGl2ZSB4ZmVyIGNsb2NrIHNwZWVkLgorICovCitzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgeworCXZvaWQgX19pb21lbSAgICAgICAgICAgICAgICAgICAgKnJlZ3M7CisJc3RydWN0IGNsayAgICAgICAgICAgICAgICAgICAgICAqY2xrOworCXN0cnVjdCBjbGsgICAgICAgICAgICAgICAgICAgICAgKnNyY19jbGs7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAgICAgICAgICAqcGRldjsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAgICAgICAgICAgICAgICptYXN0ZXI7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJICAgICAgICAqd29ya3F1ZXVlOworCXN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvICAqY250cmxyX2luZm87CisJc3RydWN0IHNwaV9kZXZpY2UgICAgICAgICAgICAgICAqdGdsX3NwaTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICAgICAgICAgIHdvcms7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgICAgICBxdWV1ZTsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgICAgIGxvY2s7CisJZW51bSBkbWFfY2ggICAgICAgICAgICAgICAgICAgICByeF9kbWFjaDsKKwllbnVtIGRtYV9jaCAgICAgICAgICAgICAgICAgICAgIHR4X2RtYWNoOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgc2ZyX3N0YXJ0OworCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgICAgICAgeGZlcl9jb21wbGV0aW9uOworCXVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU7CisJdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbW9kZSwgY3VyX2JwdzsKKwl1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9zcGVlZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50IHMzYzY0eHhfc3BpX2RtYV9jbGllbnQgPSB7CisJLm5hbWUgPSAic2Ftc3VuZy1zcGktZG1hIiwKK307CisKK3N0YXRpYyB2b2lkIGZsdXNoX2ZpZm8oc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQpCit7CisJc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gKnNjaSA9IHNkZC0+Y250cmxyX2luZm87CisJdm9pZCBfX2lvbWVtICpyZWdzID0gc2RkLT5yZWdzOworCXVuc2lnbmVkIGxvbmcgbG9vcHM7CisJdTMyIHZhbDsKKworCXdyaXRlbCgwLCByZWdzICsgUzNDNjRYWF9TUElfUEFDS0VUX0NOVCk7CisKKwl2YWwgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfQ0hfQ0ZHKTsKKwl2YWwgfD0gUzNDNjRYWF9TUElfQ0hfU1dfUlNUOworCXZhbCAmPSB+UzNDNjRYWF9TUElfQ0hfSFNfRU47CisJd3JpdGVsKHZhbCwgcmVncyArIFMzQzY0WFhfU1BJX0NIX0NGRyk7CisKKwkvKiBGbHVzaCBUeEZJRk8qLworCWxvb3BzID0gbXNlY3NfdG9fbG9vcHMoMSk7CisJZG8geworCQl2YWwgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfU1RBVFVTKTsKKwl9IHdoaWxlIChUWF9GSUZPX0xWTCh2YWwsIHNjaSkgJiYgbG9vcHMtLSk7CisKKwlpZiAobG9vcHMgPT0gMCkKKwkJZGV2X3dhcm4oJnNkZC0+cGRldi0+ZGV2LCAiVGltZWQgb3V0IGZsdXNoaW5nIFRYIEZJRk9cbiIpOworCisJLyogRmx1c2ggUnhGSUZPKi8KKwlsb29wcyA9IG1zZWNzX3RvX2xvb3BzKDEpOworCWRvIHsKKwkJdmFsID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX1NUQVRVUyk7CisJCWlmIChSWF9GSUZPX0xWTCh2YWwsIHNjaSkpCisJCQlyZWFkbChyZWdzICsgUzNDNjRYWF9TUElfUlhfREFUQSk7CisJCWVsc2UKKwkJCWJyZWFrOworCX0gd2hpbGUgKGxvb3BzLS0pOworCisJaWYgKGxvb3BzID09IDApCisJCWRldl93YXJuKCZzZGQtPnBkZXYtPmRldiwgIlRpbWVkIG91dCBmbHVzaGluZyBSWCBGSUZPXG4iKTsKKworCXZhbCA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9DSF9DRkcpOworCXZhbCAmPSB+UzNDNjRYWF9TUElfQ0hfU1dfUlNUOworCXdyaXRlbCh2YWwsIHJlZ3MgKyBTM0M2NFhYX1NQSV9DSF9DRkcpOworCisJdmFsID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX01PREVfQ0ZHKTsKKwl2YWwgJj0gfihTM0M2NFhYX1NQSV9NT0RFX1RYRE1BX09OIHwgUzNDNjRYWF9TUElfTU9ERV9SWERNQV9PTik7CisJd3JpdGVsKHZhbCwgcmVncyArIFMzQzY0WFhfU1BJX01PREVfQ0ZHKTsKKworCXZhbCA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9DSF9DRkcpOworCXZhbCAmPSB+KFMzQzY0WFhfU1BJX0NIX1JYQ0hfT04gfCBTM0M2NFhYX1NQSV9DSF9UWENIX09OKTsKKwl3cml0ZWwodmFsLCByZWdzICsgUzNDNjRYWF9TUElfQ0hfQ0ZHKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2RhdGFwYXRoKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAorCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciwgaW50IGRtYV9tb2RlKQoreworCXN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvICpzY2kgPSBzZGQtPmNudHJscl9pbmZvOworCXZvaWQgX19pb21lbSAqcmVncyA9IHNkZC0+cmVnczsKKwl1MzIgbW9kZWNmZywgY2hjZmc7CisKKwltb2RlY2ZnID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX01PREVfQ0ZHKTsKKwltb2RlY2ZnICY9IH4oUzNDNjRYWF9TUElfTU9ERV9UWERNQV9PTiB8IFMzQzY0WFhfU1BJX01PREVfUlhETUFfT04pOworCisJY2hjZmcgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfQ0hfQ0ZHKTsKKwljaGNmZyAmPSB+UzNDNjRYWF9TUElfQ0hfVFhDSF9PTjsKKworCWlmIChkbWFfbW9kZSkgeworCQljaGNmZyAmPSB+UzNDNjRYWF9TUElfQ0hfUlhDSF9PTjsKKwl9IGVsc2UgeworCQkvKiBBbHdheXMgc2hpZnQgaW4gZGF0YSBpbiBGSUZPLCBldmVuIGlmIHhmZXIgaXMgVHggb25seSwKKwkJICogdGhpcyBoZWxwcyBzZXR0aW5nIFBDS1RfQ05UIHZhbHVlIGZvciBnZW5lcmF0aW5nIGNsb2NrcworCQkgKiBhcyBleGFjdGx5IG5lZWRlZC4KKwkJICovCisJCWNoY2ZnIHw9IFMzQzY0WFhfU1BJX0NIX1JYQ0hfT047CisJCXdyaXRlbCgoKHhmZXItPmxlbiAqIDggLyBzZGQtPmN1cl9icHcpICYgMHhmZmZmKQorCQkJCQl8IFMzQzY0WFhfU1BJX1BBQ0tFVF9DTlRfRU4sCisJCQkJCXJlZ3MgKyBTM0M2NFhYX1NQSV9QQUNLRVRfQ05UKTsKKwl9CisKKwlpZiAoeGZlci0+dHhfYnVmICE9IE5VTEwpIHsKKwkJc2RkLT5zdGF0ZSB8PSBUWEJVU1k7CisJCWNoY2ZnIHw9IFMzQzY0WFhfU1BJX0NIX1RYQ0hfT047CisJCWlmIChkbWFfbW9kZSkgeworCQkJbW9kZWNmZyB8PSBTM0M2NFhYX1NQSV9NT0RFX1RYRE1BX09OOworCQkJczNjMjQxMF9kbWFfY29uZmlnKHNkZC0+dHhfZG1hY2gsIHNkZC0+Y3VyX2JwdyAvIDgpOworCQkJczNjMjQxMF9kbWFfZW5xdWV1ZShzZGQtPnR4X2RtYWNoLCAodm9pZCAqKXNkZCwKKwkJCQkJCXhmZXItPnR4X2RtYSwgeGZlci0+bGVuKTsKKwkJCXMzYzI0MTBfZG1hX2N0cmwoc2RkLT50eF9kbWFjaCwgUzNDMjQxMF9ETUFPUF9TVEFSVCk7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHNkZC0+Y3VyX2JwdykgeworCQkJY2FzZSAzMjoKKwkJCQlpb3dyaXRlMzJfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9UWF9EQVRBLAorCQkJCQl4ZmVyLT50eF9idWYsIHhmZXItPmxlbiAvIDQpOworCQkJCWJyZWFrOworCQkJY2FzZSAxNjoKKwkJCQlpb3dyaXRlMTZfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9UWF9EQVRBLAorCQkJCQl4ZmVyLT50eF9idWYsIHhmZXItPmxlbiAvIDIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpb3dyaXRlOF9yZXAocmVncyArIFMzQzY0WFhfU1BJX1RYX0RBVEEsCisJCQkJCXhmZXItPnR4X2J1ZiwgeGZlci0+bGVuKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTCkgeworCQlzZGQtPnN0YXRlIHw9IFJYQlVTWTsKKworCQlpZiAoc2NpLT5oaWdoX3NwZWVkICYmIHNkZC0+Y3VyX3NwZWVkID49IDMwMDAwMDAwVUwKKwkJCQkJJiYgIShzZGQtPmN1cl9tb2RlICYgU1BJX0NQSEEpKQorCQkJY2hjZmcgfD0gUzNDNjRYWF9TUElfQ0hfSFNfRU47CisKKwkJaWYgKGRtYV9tb2RlKSB7CisJCQltb2RlY2ZnIHw9IFMzQzY0WFhfU1BJX01PREVfUlhETUFfT047CisJCQljaGNmZyB8PSBTM0M2NFhYX1NQSV9DSF9SWENIX09OOworCQkJd3JpdGVsKCgoeGZlci0+bGVuICogOCAvIHNkZC0+Y3VyX2JwdykgJiAweGZmZmYpCisJCQkJCXwgUzNDNjRYWF9TUElfUEFDS0VUX0NOVF9FTiwKKwkJCQkJcmVncyArIFMzQzY0WFhfU1BJX1BBQ0tFVF9DTlQpOworCQkJczNjMjQxMF9kbWFfY29uZmlnKHNkZC0+cnhfZG1hY2gsIHNkZC0+Y3VyX2JwdyAvIDgpOworCQkJczNjMjQxMF9kbWFfZW5xdWV1ZShzZGQtPnJ4X2RtYWNoLCAodm9pZCAqKXNkZCwKKwkJCQkJCXhmZXItPnJ4X2RtYSwgeGZlci0+bGVuKTsKKwkJCXMzYzI0MTBfZG1hX2N0cmwoc2RkLT5yeF9kbWFjaCwgUzNDMjQxMF9ETUFPUF9TVEFSVCk7CisJCX0KKwl9CisKKwl3cml0ZWwobW9kZWNmZywgcmVncyArIFMzQzY0WFhfU1BJX01PREVfQ0ZHKTsKKwl3cml0ZWwoY2hjZmcsIHJlZ3MgKyBTM0M2NFhYX1NQSV9DSF9DRkcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2NzKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAorCQkJCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfY3NpbmZvICpjczsKKworCWlmIChzZGQtPnRnbF9zcGkgIT0gTlVMTCkgeyAvKiBJZiBsYXN0IGRldmljZSB0b2dnbGVkIGFmdGVyIG1zc2cgKi8KKwkJaWYgKHNkZC0+dGdsX3NwaSAhPSBzcGkpIHsgLyogaWYgbGFzdCBtc3NnIG9uIGRpZmYgZGV2aWNlICovCisJCQkvKiBEZXNlbGVjdCB0aGUgbGFzdCB0b2dnbGVkIGRldmljZSAqLworCQkJY3MgPSBzZGQtPnRnbF9zcGktPmNvbnRyb2xsZXJfZGF0YTsKKwkJCWNzLT5zZXRfbGV2ZWwoY3MtPmxpbmUsCisJCQkJCXNwaS0+bW9kZSAmIFNQSV9DU19ISUdIID8gMCA6IDEpOworCQl9CisJCXNkZC0+dGdsX3NwaSA9IE5VTEw7CisJfQorCisJY3MgPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwljcy0+c2V0X2xldmVsKGNzLT5saW5lLCBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCA/IDEgOiAwKTsKK30KKworc3RhdGljIGludCB3YWl0X2Zvcl94ZmVyKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAorCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIsIGludCBkbWFfbW9kZSkKK3sKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyAqc2NpID0gc2RkLT5jbnRybHJfaW5mbzsKKwl2b2lkIF9faW9tZW0gKnJlZ3MgPSBzZGQtPnJlZ3M7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IG1zOworCisJLyogbWlsbGlzZWNzIHRvIHhmZXIgJ2xlbicgYnl0ZXMgQCAnY3VyX3NwZWVkJyAqLworCW1zID0geGZlci0+bGVuICogOCAqIDEwMDAgLyBzZGQtPmN1cl9zcGVlZDsKKwltcyArPSAxMDsgLyogc29tZSB0b2xlcmFuY2UgKi8KKworCWlmIChkbWFfbW9kZSkgeworCQl2YWwgPSBtc2Vjc190b19qaWZmaWVzKG1zKSArIDEwOworCQl2YWwgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnNkZC0+eGZlcl9jb21wbGV0aW9uLCB2YWwpOworCX0gZWxzZSB7CisJCXUzMiBzdGF0dXM7CisJCXZhbCA9IG1zZWNzX3RvX2xvb3BzKG1zKTsKKwkJZG8geworCQkJc3RhdHVzID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX1NUQVRVUyk7CisJCX0gd2hpbGUgKFJYX0ZJRk9fTFZMKHN0YXR1cywgc2NpKSA8IHhmZXItPmxlbiAmJiAtLXZhbCk7CisJfQorCisJaWYgKCF2YWwpCisJCXJldHVybiAtRUlPOworCisJaWYgKGRtYV9tb2RlKSB7CisJCXUzMiBzdGF0dXM7CisKKwkJLyoKKwkJICogRG1hVHggcmV0dXJucyBhZnRlciBzaW1wbHkgd3JpdGluZyBkYXRhIGluIHRoZSBGSUZPLAorCQkgKiB3L28gd2FpdGluZyBmb3IgcmVhbCB0cmFuc21pc3Npb24gb24gdGhlIGJ1cyB0byBmaW5pc2guCisJCSAqIERtYVJ4IHJldHVybnMgb25seSBhZnRlciBEbWEgcmVhZCBkYXRhIGZyb20gRklGTyB3aGljaAorCQkgKiBuZWVkcyBidXMgdHJhbnNtaXNzaW9uIHRvIGZpbmlzaCwgc28gd2UgZG9uJ3Qgd29ycnkgaWYKKwkJICogWGZlciBpbnZvbHZlZCBSeCh3aXRoIG9yIHdpdGhvdXQgVHgpLgorCQkgKi8KKwkJaWYgKHhmZXItPnJ4X2J1ZiA9PSBOVUxMKSB7CisJCQl2YWwgPSBtc2Vjc190b19sb29wcygxMCk7CisJCQlzdGF0dXMgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfU1RBVFVTKTsKKwkJCXdoaWxlICgoVFhfRklGT19MVkwoc3RhdHVzLCBzY2kpCisJCQkJfHwgIVMzQzY0WFhfU1BJX1NUX1RYX0RPTkUoc3RhdHVzLCBzY2kpKQorCQkJCQkmJiAtLXZhbCkgeworCQkJCWNwdV9yZWxheCgpOworCQkJCXN0YXR1cyA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9TVEFUVVMpOworCQkJfQorCisJCQlpZiAoIXZhbCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIElmIGl0IHdhcyBvbmx5IFR4ICovCisJCWlmICh4ZmVyLT5yeF9idWYgPT0gTlVMTCkgeworCQkJc2RkLT5zdGF0ZSAmPSB+VFhCVVNZOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlzd2l0Y2ggKHNkZC0+Y3VyX2JwdykgeworCQljYXNlIDMyOgorCQkJaW9yZWFkMzJfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9SWF9EQVRBLAorCQkJCXhmZXItPnJ4X2J1ZiwgeGZlci0+bGVuIC8gNCk7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCWlvcmVhZDE2X3JlcChyZWdzICsgUzNDNjRYWF9TUElfUlhfREFUQSwKKwkJCQl4ZmVyLT5yeF9idWYsIHhmZXItPmxlbiAvIDIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpb3JlYWQ4X3JlcChyZWdzICsgUzNDNjRYWF9TUElfUlhfREFUQSwKKwkJCQl4ZmVyLT5yeF9idWYsIHhmZXItPmxlbik7CisJCQlicmVhazsKKwkJfQorCQlzZGQtPnN0YXRlICY9IH5SWEJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2NzKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAorCQkJCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfY3NpbmZvICpjcyA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOworCisJaWYgKHNkZC0+dGdsX3NwaSA9PSBzcGkpCisJCXNkZC0+dGdsX3NwaSA9IE5VTEw7CisKKwljcy0+c2V0X2xldmVsKGNzLT5saW5lLCBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCA/IDAgOiAxKTsKK30KKworc3RhdGljIHZvaWQgczNjNjR4eF9zcGlfY29uZmlnKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkKQoreworCXN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvICpzY2kgPSBzZGQtPmNudHJscl9pbmZvOworCXZvaWQgX19pb21lbSAqcmVncyA9IHNkZC0+cmVnczsKKwl1MzIgdmFsOworCisJLyogRGlzYWJsZSBDbG9jayAqLworCWlmIChzY2ktPmNsa19mcm9tX2NtdSkgeworCQljbGtfZGlzYWJsZShzZGQtPnNyY19jbGspOworCX0gZWxzZSB7CisJCXZhbCA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9DTEtfQ0ZHKTsKKwkJdmFsICY9IH5TM0M2NFhYX1NQSV9FTkNMS19FTkFCTEU7CisJCXdyaXRlbCh2YWwsIHJlZ3MgKyBTM0M2NFhYX1NQSV9DTEtfQ0ZHKTsKKwl9CisKKwkvKiBTZXQgUG9sYXJpdHkgYW5kIFBoYXNlICovCisJdmFsID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX0NIX0NGRyk7CisJdmFsICY9IH4oUzNDNjRYWF9TUElfQ0hfU0xBVkUgfAorCQkJUzNDNjRYWF9TUElfQ1BPTF9MIHwKKwkJCVMzQzY0WFhfU1BJX0NQSEFfQik7CisKKwlpZiAoc2RkLT5jdXJfbW9kZSAmIFNQSV9DUE9MKQorCQl2YWwgfD0gUzNDNjRYWF9TUElfQ1BPTF9MOworCisJaWYgKHNkZC0+Y3VyX21vZGUgJiBTUElfQ1BIQSkKKwkJdmFsIHw9IFMzQzY0WFhfU1BJX0NQSEFfQjsKKworCXdyaXRlbCh2YWwsIHJlZ3MgKyBTM0M2NFhYX1NQSV9DSF9DRkcpOworCisJLyogU2V0IENoYW5uZWwgJiBETUEgTW9kZSAqLworCXZhbCA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9NT0RFX0NGRyk7CisJdmFsICY9IH4oUzNDNjRYWF9TUElfTU9ERV9CVVNfVFNaX01BU0sKKwkJCXwgUzNDNjRYWF9TUElfTU9ERV9DSF9UU1pfTUFTSyk7CisKKwlzd2l0Y2ggKHNkZC0+Y3VyX2JwdykgeworCWNhc2UgMzI6CisJCXZhbCB8PSBTM0M2NFhYX1NQSV9NT0RFX0JVU19UU1pfV09SRDsKKwkJdmFsIHw9IFMzQzY0WFhfU1BJX01PREVfQ0hfVFNaX1dPUkQ7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXZhbCB8PSBTM0M2NFhYX1NQSV9NT0RFX0JVU19UU1pfSEFMRldPUkQ7CisJCXZhbCB8PSBTM0M2NFhYX1NQSV9NT0RFX0NIX1RTWl9IQUxGV09SRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsIHw9IFMzQzY0WFhfU1BJX01PREVfQlVTX1RTWl9CWVRFOworCQl2YWwgfD0gUzNDNjRYWF9TUElfTU9ERV9DSF9UU1pfQllURTsKKwkJYnJlYWs7CisJfQorCisJd3JpdGVsKHZhbCwgcmVncyArIFMzQzY0WFhfU1BJX01PREVfQ0ZHKTsKKworCWlmIChzY2ktPmNsa19mcm9tX2NtdSkgeworCQkvKiBDb25maWd1cmUgQ2xvY2sgKi8KKwkJLyogVGhlcmUgaXMgaGFsZi1tdWx0aXBsaWVyIGJlZm9yZSB0aGUgU1BJICovCisJCWNsa19zZXRfcmF0ZShzZGQtPnNyY19jbGssIHNkZC0+Y3VyX3NwZWVkICogMik7CisJCS8qIEVuYWJsZSBDbG9jayAqLworCQljbGtfZW5hYmxlKHNkZC0+c3JjX2Nsayk7CisJfSBlbHNlIHsKKwkJLyogQ29uZmlndXJlIENsb2NrICovCisJCXZhbCA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9DTEtfQ0ZHKTsKKwkJdmFsICY9IH5TM0M2NFhYX1NQSV9QU1JfTUFTSzsKKwkJdmFsIHw9ICgoY2xrX2dldF9yYXRlKHNkZC0+c3JjX2NsaykgLyBzZGQtPmN1cl9zcGVlZCAvIDIgLSAxKQorCQkJCSYgUzNDNjRYWF9TUElfUFNSX01BU0spOworCQl3cml0ZWwodmFsLCByZWdzICsgUzNDNjRYWF9TUElfQ0xLX0NGRyk7CisKKwkJLyogRW5hYmxlIENsb2NrICovCisJCXZhbCA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9DTEtfQ0ZHKTsKKwkJdmFsIHw9IFMzQzY0WFhfU1BJX0VOQ0xLX0VOQUJMRTsKKwkJd3JpdGVsKHZhbCwgcmVncyArIFMzQzY0WFhfU1BJX0NMS19DRkcpOworCX0KK30KKworc3RhdGljIHZvaWQgczNjNjR4eF9zcGlfZG1hX3J4Y2Ioc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4sIHZvaWQgKmJ1Zl9pZCwKKwkJCQkgaW50IHNpemUsIGVudW0gczNjMjQxMF9kbWFfYnVmZnJlc3VsdCByZXMpCit7CisJc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQgPSBidWZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChyZXMgPT0gUzNDMjQxMF9SRVNfT0spCisJCXNkZC0+c3RhdGUgJj0gflJYQlVTWTsKKwllbHNlCisJCWRldl9lcnIoJnNkZC0+cGRldi0+ZGV2LCAiRG1hQWJydFJ4LSVkXG4iLCBzaXplKTsKKworCS8qIElmIHRoZSBvdGhlciBkb25lICovCisJaWYgKCEoc2RkLT5zdGF0ZSAmIFRYQlVTWSkpCisJCWNvbXBsZXRlKCZzZGQtPnhmZXJfY29tcGxldGlvbik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgczNjNjR4eF9zcGlfZG1hX3R4Y2Ioc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4sIHZvaWQgKmJ1Zl9pZCwKKwkJCQkgaW50IHNpemUsIGVudW0gczNjMjQxMF9kbWFfYnVmZnJlc3VsdCByZXMpCit7CisJc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQgPSBidWZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChyZXMgPT0gUzNDMjQxMF9SRVNfT0spCisJCXNkZC0+c3RhdGUgJj0gflRYQlVTWTsKKwllbHNlCisJCWRldl9lcnIoJnNkZC0+cGRldi0+ZGV2LCAiRG1hQWJydFR4LSVkIFxuIiwgc2l6ZSk7CisKKwkvKiBJZiB0aGUgb3RoZXIgZG9uZSAqLworCWlmICghKHNkZC0+c3RhdGUgJiBSWEJVU1kpKQorCQljb21wbGV0ZSgmc2RkLT54ZmVyX2NvbXBsZXRpb24pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7Cit9CisKKyNkZWZpbmUgWEZFUl9ETUFBRERSX0lOVkFMSUQgRE1BX0JJVF9NQVNLKDMyKQorCitzdGF0aWMgaW50IHMzYzY0eHhfc3BpX21hcF9tc3NnKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAorCQkJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gKnNjaSA9IHNkZC0+Y250cmxyX2luZm87CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnNkZC0+cGRldi0+ZGV2OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7CisKKwlpZiAobXNnLT5pc19kbWFfbWFwcGVkKQorCQlyZXR1cm4gMDsKKworCS8qIEZpcnN0IG1hcmsgYWxsIHhmZXIgdW5tYXBwZWQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQl4ZmVyLT5yeF9kbWEgPSBYRkVSX0RNQUFERFJfSU5WQUxJRDsKKwkJeGZlci0+dHhfZG1hID0gWEZFUl9ETUFBRERSX0lOVkFMSUQ7CisJfQorCisJLyogTWFwIHVudGlsIGVuZCBvciBmaXJzdCBmYWlsICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKworCQlpZiAoeGZlci0+bGVuIDw9ICgoc2NpLT5maWZvX2x2bF9tYXNrID4+IDEpICsgMSkpCisJCQljb250aW51ZTsKKworCQlpZiAoeGZlci0+dHhfYnVmICE9IE5VTEwpIHsKKwkJCXhmZXItPnR4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwKKwkJCQkJKHZvaWQgKil4ZmVyLT50eF9idWYsIHhmZXItPmxlbiwKKwkJCQkJRE1BX1RPX0RFVklDRSk7CisJCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCB4ZmVyLT50eF9kbWEpKSB7CisJCQkJZGV2X2VycihkZXYsICJkbWFfbWFwX3NpbmdsZSBUeCBmYWlsZWRcbiIpOworCQkJCXhmZXItPnR4X2RtYSA9IFhGRVJfRE1BQUREUl9JTlZBTElEOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9CisKKwkJaWYgKHhmZXItPnJ4X2J1ZiAhPSBOVUxMKSB7CisJCQl4ZmVyLT5yeF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsIHhmZXItPnJ4X2J1ZiwKKwkJCQkJCXhmZXItPmxlbiwgRE1BX0ZST01fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIHhmZXItPnJ4X2RtYSkpIHsKKwkJCQlkZXZfZXJyKGRldiwgImRtYV9tYXBfc2luZ2xlIFJ4IGZhaWxlZFxuIik7CisJCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIHhmZXItPnR4X2RtYSwKKwkJCQkJCXhmZXItPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJCQkJeGZlci0+dHhfZG1hID0gWEZFUl9ETUFBRERSX0lOVkFMSUQ7CisJCQkJeGZlci0+cnhfZG1hID0gWEZFUl9ETUFBRERSX0lOVkFMSUQ7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgczNjNjR4eF9zcGlfdW5tYXBfbXNzZyhzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKKwkJCQkJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvICpzY2kgPSBzZGQtPmNudHJscl9pbmZvOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzZGQtPnBkZXYtPmRldjsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOworCisJaWYgKG1zZy0+aXNfZG1hX21hcHBlZCkKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKworCQlpZiAoeGZlci0+bGVuIDw9ICgoc2NpLT5maWZvX2x2bF9tYXNrID4+IDEpICsgMSkpCisJCQljb250aW51ZTsKKworCQlpZiAoeGZlci0+cnhfYnVmICE9IE5VTEwKKwkJCQkmJiB4ZmVyLT5yeF9kbWEgIT0gWEZFUl9ETUFBRERSX0lOVkFMSUQpCisJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgeGZlci0+cnhfZG1hLAorCQkJCQkJeGZlci0+bGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCisJCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTAorCQkJCSYmIHhmZXItPnR4X2RtYSAhPSBYRkVSX0RNQUFERFJfSU5WQUxJRCkKKwkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCB4ZmVyLT50eF9kbWEsCisJCQkJCQl4ZmVyLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCX0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX21zZyhzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKKwkJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gKnNjaSA9IHNkZC0+Y250cmxyX2luZm87CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG1zZy0+c3BpOworCXN0cnVjdCBzM2M2NHh4X3NwaV9jc2luZm8gKmNzID0gc3BpLT5jb250cm9sbGVyX2RhdGE7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKKwlpbnQgc3RhdHVzID0gMCwgY3NfdG9nZ2xlID0gMDsKKwl1MzIgc3BlZWQ7CisJdTggYnB3OworCisJLyogSWYgTWFzdGVyJ3MoY29udHJvbGxlcikgc3RhdGUgZGlmZmVycyBmcm9tIHRoYXQgbmVlZGVkIGJ5IFNsYXZlICovCisJaWYgKHNkZC0+Y3VyX3NwZWVkICE9IHNwaS0+bWF4X3NwZWVkX2h6CisJCQl8fCBzZGQtPmN1cl9tb2RlICE9IHNwaS0+bW9kZQorCQkJfHwgc2RkLT5jdXJfYnB3ICE9IHNwaS0+Yml0c19wZXJfd29yZCkgeworCQlzZGQtPmN1cl9icHcgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisJCXNkZC0+Y3VyX3NwZWVkID0gc3BpLT5tYXhfc3BlZWRfaHo7CisJCXNkZC0+Y3VyX21vZGUgPSBzcGktPm1vZGU7CisJCXMzYzY0eHhfc3BpX2NvbmZpZyhzZGQpOworCX0KKworCS8qIE1hcCBhbGwgdGhlIHRyYW5zZmVycyBpZiBuZWVkZWQgKi8KKwlpZiAoczNjNjR4eF9zcGlfbWFwX21zc2coc2RkLCBtc2cpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LAorCQkJIlhmZXI6IFVuYWJsZSB0byBtYXAgbWVzc2FnZSBidWZmZXJzIVxuIik7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCS8qIENvbmZpZ3VyZSBmZWVkYmFjayBkZWxheSAqLworCXdyaXRlbChjcy0+ZmJfZGVsYXkgJiAweDMsIHNkZC0+cmVncyArIFMzQzY0WFhfU1BJX0ZCX0NMSyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWludCB1c2VfZG1hOworCisJCUlOSVRfQ09NUExFVElPTihzZGQtPnhmZXJfY29tcGxldGlvbik7CisKKwkJLyogT25seSBCUFcgYW5kIFNwZWVkIG1heSBjaGFuZ2UgYWNyb3NzIHRyYW5zZmVycyAqLworCQlicHcgPSB4ZmVyLT5iaXRzX3Blcl93b3JkID8gOiBzcGktPmJpdHNfcGVyX3dvcmQ7CisJCXNwZWVkID0geGZlci0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OworCisJCWlmICh4ZmVyLT5sZW4gJSAoYnB3IC8gOCkpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LAorCQkJCSJYZmVyIGxlbmd0aCgldSkgbm90IGEgbXVsdGlwbGUgb2Ygd29yZCBzaXplKCV1KVxuIiwKKwkJCQl4ZmVyLT5sZW4sIGJwdyAvIDgpOworCQkJc3RhdHVzID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGJwdyAhPSBzZGQtPmN1cl9icHcgfHwgc3BlZWQgIT0gc2RkLT5jdXJfc3BlZWQpIHsKKwkJCXNkZC0+Y3VyX2JwdyA9IGJwdzsKKwkJCXNkZC0+Y3VyX3NwZWVkID0gc3BlZWQ7CisJCQlzM2M2NHh4X3NwaV9jb25maWcoc2RkKTsKKwkJfQorCisJCS8qIFBvbGxpbmcgbWV0aG9kIGZvciB4ZmVycyBub3QgYmlnZ2VyIHRoYW4gRklGTyBjYXBhY2l0eSAqLworCQlpZiAoeGZlci0+bGVuIDw9ICgoc2NpLT5maWZvX2x2bF9tYXNrID4+IDEpICsgMSkpCisJCQl1c2VfZG1hID0gMDsKKwkJZWxzZQorCQkJdXNlX2RtYSA9IDE7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNkZC0+bG9jaywgZmxhZ3MpOworCisJCS8qIFBlbmRpbmcgb25seSB3aGljaCBpcyB0byBiZSBkb25lICovCisJCXNkZC0+c3RhdGUgJj0gflJYQlVTWTsKKwkJc2RkLT5zdGF0ZSAmPSB+VFhCVVNZOworCisJCWVuYWJsZV9kYXRhcGF0aChzZGQsIHNwaSwgeGZlciwgdXNlX2RtYSk7CisKKwkJLyogU2xhdmUgU2VsZWN0ICovCisJCWVuYWJsZV9jcyhzZGQsIHNwaSk7CisKKwkJLyogU3RhcnQgdGhlIHNpZ25hbHMgKi8KKwkJUzNDNjRYWF9TUElfQUNUKHNkZCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CisKKwkJc3RhdHVzID0gd2FpdF9mb3JfeGZlcihzZGQsIHhmZXIsIHVzZV9kbWEpOworCisJCS8qIFF1aWVzZSB0aGUgc2lnbmFscyAqLworCQlTM0M2NFhYX1NQSV9ERUFDVChzZGQpOworCisJCWlmIChzdGF0dXMpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiSS9PIEVycm9yOiAiCisJCQkJInJ4LSVkIHR4LSVkIHJlczpyeC0lYyB0eC0lYyBsZW4tJWRcbiIsCisJCQkJeGZlci0+cnhfYnVmID8gMSA6IDAsIHhmZXItPnR4X2J1ZiA/IDEgOiAwLAorCQkJCShzZGQtPnN0YXRlICYgUlhCVVNZKSA/ICdmJyA6ICdwJywKKwkJCQkoc2RkLT5zdGF0ZSAmIFRYQlVTWSkgPyAnZicgOiAncCcsCisJCQkJeGZlci0+bGVuKTsKKworCQkJaWYgKHVzZV9kbWEpIHsKKwkJCQlpZiAoeGZlci0+dHhfYnVmICE9IE5VTEwKKwkJCQkJCSYmIChzZGQtPnN0YXRlICYgVFhCVVNZKSkKKwkJCQkJczNjMjQxMF9kbWFfY3RybChzZGQtPnR4X2RtYWNoLAorCQkJCQkJCVMzQzI0MTBfRE1BT1BfRkxVU0gpOworCQkJCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTAorCQkJCQkJJiYgKHNkZC0+c3RhdGUgJiBSWEJVU1kpKQorCQkJCQlzM2MyNDEwX2RtYV9jdHJsKHNkZC0+cnhfZG1hY2gsCisJCQkJCQkJUzNDMjQxMF9ETUFPUF9GTFVTSCk7CisJCQl9CisKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHhmZXItPmRlbGF5X3VzZWNzKQorCQkJdWRlbGF5KHhmZXItPmRlbGF5X3VzZWNzKTsKKworCQlpZiAoeGZlci0+Y3NfY2hhbmdlKSB7CisJCQkvKiBIaW50IHRoYXQgdGhlIG5leHQgbXNzZyBpcyBnb25uYSBiZQorCQkJICAgZm9yIHRoZSBzYW1lIGRldmljZSAqLworCQkJaWYgKGxpc3RfaXNfbGFzdCgmeGZlci0+dHJhbnNmZXJfbGlzdCwKKwkJCQkJCSZtc2ctPnRyYW5zZmVycykpCisJCQkJY3NfdG9nZ2xlID0gMTsKKwkJCWVsc2UKKwkJCQlkaXNhYmxlX2NzKHNkZCwgc3BpKTsKKwkJfQorCisJCW1zZy0+YWN0dWFsX2xlbmd0aCArPSB4ZmVyLT5sZW47CisKKwkJZmx1c2hfZmlmbyhzZGQpOworCX0KKworb3V0OgorCWlmICghY3NfdG9nZ2xlIHx8IHN0YXR1cykKKwkJZGlzYWJsZV9jcyhzZGQsIHNwaSk7CisJZWxzZQorCQlzZGQtPnRnbF9zcGkgPSBzcGk7CisKKwlzM2M2NHh4X3NwaV91bm1hcF9tc3NnKHNkZCwgbXNnKTsKKworCW1zZy0+c3RhdHVzID0gc3RhdHVzOworCisJaWYgKG1zZy0+Y29tcGxldGUpCisJCW1zZy0+Y29tcGxldGUobXNnLT5jb250ZXh0KTsKK30KKworc3RhdGljIGludCBhY3F1aXJlX2RtYShzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCkKK3sKKwlpZiAoczNjMjQxMF9kbWFfcmVxdWVzdChzZGQtPnJ4X2RtYWNoLAorCQkJCQkmczNjNjR4eF9zcGlfZG1hX2NsaWVudCwgTlVMTCkgPCAwKSB7CisJCWRldl9lcnIoJnNkZC0+cGRldi0+ZGV2LCAiY2Fubm90IGdldCBSeERNQVxuIik7CisJCXJldHVybiAwOworCX0KKwlzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4oc2RkLT5yeF9kbWFjaCwgczNjNjR4eF9zcGlfZG1hX3J4Y2IpOworCXMzYzI0MTBfZG1hX2RldmNvbmZpZyhzZGQtPnJ4X2RtYWNoLCBTM0MyNDEwX0RNQVNSQ19IVywKKwkJCQkJc2RkLT5zZnJfc3RhcnQgKyBTM0M2NFhYX1NQSV9SWF9EQVRBKTsKKworCWlmIChzM2MyNDEwX2RtYV9yZXF1ZXN0KHNkZC0+dHhfZG1hY2gsCisJCQkJCSZzM2M2NHh4X3NwaV9kbWFfY2xpZW50LCBOVUxMKSA8IDApIHsKKwkJZGV2X2Vycigmc2RkLT5wZGV2LT5kZXYsICJjYW5ub3QgZ2V0IFR4RE1BXG4iKTsKKwkJczNjMjQxMF9kbWFfZnJlZShzZGQtPnJ4X2RtYWNoLCAmczNjNjR4eF9zcGlfZG1hX2NsaWVudCk7CisJCXJldHVybiAwOworCX0KKwlzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4oc2RkLT50eF9kbWFjaCwgczNjNjR4eF9zcGlfZG1hX3R4Y2IpOworCXMzYzI0MTBfZG1hX2RldmNvbmZpZyhzZGQtPnR4X2RtYWNoLCBTM0MyNDEwX0RNQVNSQ19NRU0sCisJCQkJCXNkZC0+c2ZyX3N0YXJ0ICsgUzNDNjRYWF9TUElfVFhfREFUQSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgczNjNjR4eF9zcGlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhLCB3b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQWNxdWlyZSBETUEgY2hhbm5lbHMgKi8KKwl3aGlsZSAoIWFjcXVpcmVfZG1hKHNkZCkpCisJCW1zbGVlcCgxMCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2RkLT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnNkZC0+cXVldWUpCisJCQkJJiYgIShzZGQtPnN0YXRlICYgU1VTUE5EKSkgeworCisJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnOworCisJCW1zZyA9IGNvbnRhaW5lcl9vZihzZGQtPnF1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOworCisJCWxpc3RfZGVsX2luaXQoJm1zZy0+cXVldWUpOworCisJCS8qIFNldCBYZmVyIGJ1c3kgZmxhZyAqLworCQlzZGQtPnN0YXRlIHw9IFNQSUJVU1k7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CisKKwkJaGFuZGxlX21zZyhzZGQsIG1zZyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNkZC0+bG9jaywgZmxhZ3MpOworCisJCXNkZC0+c3RhdGUgJj0gflNQSUJVU1k7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CisKKwkvKiBGcmVlIERNQSBjaGFubmVscyAqLworCXMzYzI0MTBfZG1hX2ZyZWUoc2RkLT50eF9kbWFjaCwgJnMzYzY0eHhfc3BpX2RtYV9jbGllbnQpOworCXMzYzI0MTBfZG1hX2ZyZWUoc2RkLT5yeF9kbWFjaCwgJnMzYzY0eHhfc3BpX2RtYV9jbGllbnQpOworfQorCitzdGF0aWMgaW50IHMzYzY0eHhfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2RkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2RkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc2RkLT5zdGF0ZSAmIFNVU1BORCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJbXNnLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisJbXNnLT5hY3R1YWxfbGVuZ3RoID0gMDsKKworCWxpc3RfYWRkX3RhaWwoJm1zZy0+cXVldWUsICZzZGQtPnF1ZXVlKTsKKworCXF1ZXVlX3dvcmsoc2RkLT53b3JrcXVldWUsICZzZGQtPndvcmspOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhlcmUgd2Ugb25seSBjaGVjayB0aGUgdmFsaWRpdHkgb2YgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24KKyAqIGFuZCBzYXZlIHRoZSBjb25maWd1cmF0aW9uIGluIGEgbG9jYWwgZGF0YS1zdHJ1Y3R1cmUuCisgKiBUaGUgY29udHJvbGxlciBpcyBhY3R1YWxseSBjb25maWd1cmVkIG9ubHkganVzdCBiZWZvcmUgd2UKKyAqIGdldCBhIG1lc3NhZ2UgdG8gdHJhbnNmZXIuCisgKi8KK3N0YXRpYyBpbnQgczNjNjR4eF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfY3NpbmZvICpjcyA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOworCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkOworCXN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvICpzY2k7CisJc3RydWN0IHNwaV9tZXNzYWdlICptc2c7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gMDsKKworCWlmIChjcyA9PSBOVUxMIHx8IGNzLT5zZXRfbGV2ZWwgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIk5vIENTIGZvciBTUEkoJWQpXG4iLCBzcGktPmNoaXBfc2VsZWN0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc2RkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc2NpID0gc2RkLT5jbnRybHJfaW5mbzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGQtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobXNnLCAmc2RkLT5xdWV1ZSwgcXVldWUpIHsKKwkJLyogSXMgc29tZSBtc3NnIGlzIGFscmVhZHkgcXVldWVkIGZvciB0aGlzIGRldmljZSAqLworCQlpZiAobXNnLT5zcGkgPT0gc3BpKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCQkic2V0dXA6IGF0dGVtcHQgd2hpbGUgbXNzZyBpbiBxdWV1ZSFcbiIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCisJaWYgKHNkZC0+c3RhdGUgJiBTVVNQTkQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CisJCWRldl9lcnIoJnNwaS0+ZGV2LAorCQkJInNldHVwOiBTUEktJWQgbm90IGFjdGl2ZSFcbiIsIHNwaS0+bWFzdGVyLT5idXNfbnVtKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkICE9IDgKKwkJCSYmIHNwaS0+Yml0c19wZXJfd29yZCAhPSAxNgorCQkJJiYgc3BpLT5iaXRzX3Blcl93b3JkICE9IDMyKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAic2V0dXA6ICVkYml0cy93cmQgbm90IHN1cHBvcnRlZCFcbiIsCisJCQkJCQkJc3BpLT5iaXRzX3Blcl93b3JkKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBzZXR1cF9leGl0OworCX0KKworCS8qIENoZWNrIGlmIHdlIGNhbiBwcm92aWRlIHRoZSByZXF1ZXN0ZWQgcmF0ZSAqLworCWlmICghc2NpLT5jbGtfZnJvbV9jbXUpIHsKKwkJdTMyIHBzciwgc3BlZWQ7CisKKwkJLyogTWF4IHBvc3NpYmxlICovCisJCXNwZWVkID0gY2xrX2dldF9yYXRlKHNkZC0+c3JjX2NsaykgLyAyIC8gKDAgKyAxKTsKKworCQlpZiAoc3BpLT5tYXhfc3BlZWRfaHogPiBzcGVlZCkKKwkJCXNwaS0+bWF4X3NwZWVkX2h6ID0gc3BlZWQ7CisKKwkJcHNyID0gY2xrX2dldF9yYXRlKHNkZC0+c3JjX2NsaykgLyAyIC8gc3BpLT5tYXhfc3BlZWRfaHogLSAxOworCQlwc3IgJj0gUzNDNjRYWF9TUElfUFNSX01BU0s7CisJCWlmIChwc3IgPT0gUzNDNjRYWF9TUElfUFNSX01BU0spCisJCQlwc3ItLTsKKworCQlzcGVlZCA9IGNsa19nZXRfcmF0ZShzZGQtPnNyY19jbGspIC8gMiAvIChwc3IgKyAxKTsKKwkJaWYgKHNwaS0+bWF4X3NwZWVkX2h6IDwgc3BlZWQpIHsKKwkJCWlmIChwc3IrMSA8IFMzQzY0WFhfU1BJX1BTUl9NQVNLKSB7CisJCQkJcHNyKys7CisJCQl9IGVsc2UgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBzZXR1cF9leGl0OworCQkJfQorCQl9CisKKwkJc3BlZWQgPSBjbGtfZ2V0X3JhdGUoc2RkLT5zcmNfY2xrKSAvIDIgLyAocHNyICsgMSk7CisJCWlmIChzcGktPm1heF9zcGVlZF9oeiA+PSBzcGVlZCkKKwkJCXNwaS0+bWF4X3NwZWVkX2h6ID0gc3BlZWQ7CisJCWVsc2UKKwkJCWVyciA9IC1FSU5WQUw7CisJfQorCitzZXR1cF9leGl0OgorCisJLyogc2V0dXAoKSByZXR1cm5zIHdpdGggZGV2aWNlIGRlLXNlbGVjdGVkICovCisJZGlzYWJsZV9jcyhzZGQsIHNwaSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV9od2luaXQoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsIGludCBjaGFubmVsKQoreworCXN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvICpzY2kgPSBzZGQtPmNudHJscl9pbmZvOworCXZvaWQgX19pb21lbSAqcmVncyA9IHNkZC0+cmVnczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJc2RkLT5jdXJfc3BlZWQgPSAwOworCisJUzNDNjRYWF9TUElfREVBQ1Qoc2RkKTsKKworCS8qIERpc2FibGUgSW50ZXJydXB0cyAtIHdlIHVzZSBQb2xsaW5nIGlmIG5vdCBETUEgbW9kZSAqLworCXdyaXRlbCgwLCByZWdzICsgUzNDNjRYWF9TUElfSU5UX0VOKTsKKworCWlmICghc2NpLT5jbGtfZnJvbV9jbXUpCisJCXdyaXRlbChzY2ktPnNyY19jbGtfbnIgPDwgUzNDNjRYWF9TUElfQ0xLU0VMX1NSQ1NIRlQsCisJCQkJcmVncyArIFMzQzY0WFhfU1BJX0NMS19DRkcpOworCXdyaXRlbCgwLCByZWdzICsgUzNDNjRYWF9TUElfTU9ERV9DRkcpOworCXdyaXRlbCgwLCByZWdzICsgUzNDNjRYWF9TUElfUEFDS0VUX0NOVCk7CisKKwkvKiBDbGVhciBhbnkgaXJxIHBlbmRpbmcgYml0cyAqLworCXdyaXRlbChyZWFkbChyZWdzICsgUzNDNjRYWF9TUElfUEVORElOR19DTFIpLAorCQkJCXJlZ3MgKyBTM0M2NFhYX1NQSV9QRU5ESU5HX0NMUik7CisKKwl3cml0ZWwoMCwgcmVncyArIFMzQzY0WFhfU1BJX1NXQVBfQ0ZHKTsKKworCXZhbCA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9NT0RFX0NGRyk7CisJdmFsICY9IH5TM0M2NFhYX1NQSV9NT0RFXzRCVVJTVDsKKwl2YWwgJj0gfihTM0M2NFhYX1NQSV9NQVhfVFJBSUxDTlQgPDwgUzNDNjRYWF9TUElfVFJBSUxDTlRfT0ZGKTsKKwl2YWwgfD0gKFMzQzY0WFhfU1BJX1RSQUlMQ05UIDw8IFMzQzY0WFhfU1BJX1RSQUlMQ05UX09GRik7CisJd3JpdGVsKHZhbCwgcmVncyArIFMzQzY0WFhfU1BJX01PREVfQ0ZHKTsKKworCWZsdXNoX2ZpZm8oc2RkKTsKK30KKworc3RhdGljIGludCBfX2luaXQgczNjNjR4eF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UJKm1lbV9yZXMsICpkbWF0eF9yZXMsICpkbWFyeF9yZXM7CisJc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQ7CisJc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gKnNjaTsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCWludCByZXQ7CisKKwlpZiAocGRldi0+aWQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiSW52YWxpZCBwbGF0Zm9ybSBkZXZpY2UgaWQtJWRcbiIsIHBkZXYtPmlkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm1fZGF0YSBtaXNzaW5nIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNjaSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghc2NpLT5zcmNfY2xrX25hbWUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkJvYXJkIGluaXQgbXVzdCBjYWxsIHMzYzY0eHhfc3BpX3NldF9pbmZvKClcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIG5lY2Vzc2FyeSByZXNvdXJjZSAqLworCisJZG1hdHhfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKKwlpZiAoZG1hdHhfcmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBTUEktVHggZG1hIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlkbWFyeF9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDEpOworCWlmIChkbWFyeF9yZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IFNQSS1SeCBkbWEgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCW1lbV9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChtZW1fcmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBTUEkgTUVNIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSkpOworCWlmIChtYXN0ZXIgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgU1BJIE1hc3RlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CisKKwlzZGQgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJc2RkLT5tYXN0ZXIgPSBtYXN0ZXI7CisJc2RkLT5jbnRybHJfaW5mbyA9IHNjaTsKKwlzZGQtPnBkZXYgPSBwZGV2OworCXNkZC0+c2ZyX3N0YXJ0ID0gbWVtX3Jlcy0+c3RhcnQ7CisJc2RkLT50eF9kbWFjaCA9IGRtYXR4X3Jlcy0+c3RhcnQ7CisJc2RkLT5yeF9kbWFjaCA9IGRtYXJ4X3Jlcy0+c3RhcnQ7CisKKwlzZGQtPmN1cl9icHcgPSA4OworCisJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CisJbWFzdGVyLT5zZXR1cCA9IHMzYzY0eHhfc3BpX3NldHVwOworCW1hc3Rlci0+dHJhbnNmZXIgPSBzM2M2NHh4X3NwaV90cmFuc2ZlcjsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gc2NpLT5udW1fY3M7CisJbWFzdGVyLT5kbWFfYWxpZ25tZW50ID0gODsKKwkvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24obWVtX3Jlcy0+c3RhcnQsCisJCQlyZXNvdXJjZV9zaXplKG1lbV9yZXMpLCBwZGV2LT5uYW1lKSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlcSBtZW0gcmVnaW9uIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBlcnIwOworCX0KKworCXNkZC0+cmVncyA9IGlvcmVtYXAobWVtX3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtX3JlcykpOworCWlmIChzZGQtPnJlZ3MgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gcmVtYXAgSU9cbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyMTsKKwl9CisKKwlpZiAoc2NpLT5jZmdfZ3BpbyA9PSBOVUxMIHx8IHNjaS0+Y2ZnX2dwaW8ocGRldikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGNvbmZpZyBncGlvXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycjI7CisJfQorCisJLyogU2V0dXAgY2xvY2tzICovCisJc2RkLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJzcGkiKTsKKwlpZiAoSVNfRVJSKHNkZC0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWNxdWlyZSBjbG9jayAnc3BpJ1xuIik7CisJCXJldCA9IFBUUl9FUlIoc2RkLT5jbGspOworCQlnb3RvIGVycjM7CisJfQorCisJaWYgKGNsa19lbmFibGUoc2RkLT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IGVuYWJsZSBjbG9jayAnc3BpJ1xuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnI0OworCX0KKworCXNkZC0+c3JjX2NsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgc2NpLT5zcmNfY2xrX25hbWUpOworCWlmIChJU19FUlIoc2RkLT5zcmNfY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiVW5hYmxlIHRvIGFjcXVpcmUgY2xvY2sgJyVzJ1xuIiwgc2NpLT5zcmNfY2xrX25hbWUpOworCQlyZXQgPSBQVFJfRVJSKHNkZC0+c3JjX2Nsayk7CisJCWdvdG8gZXJyNTsKKwl9CisKKwlpZiAoY2xrX2VuYWJsZShzZGQtPnNyY19jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IGVuYWJsZSBjbG9jayAnJXMnXG4iLAorCQkJCQkJCXNjaS0+c3JjX2Nsa19uYW1lKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycjY7CisJfQorCisJc2RkLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKKwkJCQkJCWRldl9uYW1lKG1hc3Rlci0+ZGV2LnBhcmVudCkpOworCWlmIChzZGQtPndvcmtxdWV1ZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBjcmVhdGUgd29ya3F1ZXVlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI3OworCX0KKworCS8qIFNldHVwIERldWZ1bHQgTW9kZSAqLworCXMzYzY0eHhfc3BpX2h3aW5pdChzZGQsIHBkZXYtPmlkKTsKKworCXNwaW5fbG9ja19pbml0KCZzZGQtPmxvY2spOworCWluaXRfY29tcGxldGlvbigmc2RkLT54ZmVyX2NvbXBsZXRpb24pOworCUlOSVRfV09SSygmc2RkLT53b3JrLCBzM2M2NHh4X3NwaV93b3JrKTsKKwlJTklUX0xJU1RfSEVBRCgmc2RkLT5xdWV1ZSk7CisKKwlpZiAoc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCByZWdpc3RlciBTUEkgbWFzdGVyXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycjg7CisJfQorCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiU2Ftc3VuZyBTb0MgU1BJIERyaXZlciBsb2FkZWQgZm9yIEJ1cyBTUEktJWQgIgorCQkJCQkid2l0aCAlZCBTbGF2ZXMgYXR0YWNoZWRcbiIsCisJCQkJCXBkZXYtPmlkLCBtYXN0ZXItPm51bV9jaGlwc2VsZWN0KTsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJcdElPbWVtPVsweCV4LTB4JXhdXHRETUE9W1J4LSVkLCBUeC0lZF1cbiIsCisJCQkJCW1lbV9yZXMtPmVuZCwgbWVtX3Jlcy0+c3RhcnQsCisJCQkJCXNkZC0+cnhfZG1hY2gsIHNkZC0+dHhfZG1hY2gpOworCisJcmV0dXJuIDA7CisKK2Vycjg6CisJZGVzdHJveV93b3JrcXVldWUoc2RkLT53b3JrcXVldWUpOworZXJyNzoKKwljbGtfZGlzYWJsZShzZGQtPnNyY19jbGspOworZXJyNjoKKwljbGtfcHV0KHNkZC0+c3JjX2Nsayk7CitlcnI1OgorCWNsa19kaXNhYmxlKHNkZC0+Y2xrKTsKK2VycjQ6CisJY2xrX3B1dChzZGQtPmNsayk7CitlcnIzOgorZXJyMjoKKwlpb3VubWFwKCh2b2lkICopIHNkZC0+cmVncyk7CitlcnIxOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW1fcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW1fcmVzKSk7CitlcnIwOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHMzYzY0eHhfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7CisJc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJc3RydWN0IHJlc291cmNlCSptZW1fcmVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2RkLT5sb2NrLCBmbGFncyk7CisJc2RkLT5zdGF0ZSB8PSBTVVNQTkQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoc2RkLT5zdGF0ZSAmIFNQSUJVU1kpCisJCW1zbGVlcCgxMCk7CisKKwlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKworCWRlc3Ryb3lfd29ya3F1ZXVlKHNkZC0+d29ya3F1ZXVlKTsKKworCWNsa19kaXNhYmxlKHNkZC0+c3JjX2Nsayk7CisJY2xrX3B1dChzZGQtPnNyY19jbGspOworCisJY2xrX2Rpc2FibGUoc2RkLT5jbGspOworCWNsa19wdXQoc2RkLT5jbGspOworCisJaW91bm1hcCgodm9pZCAqKSBzZGQtPnJlZ3MpOworCisJbWVtX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKG1lbV9yZXMgIT0gTlVMTCkKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbV9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbV9yZXMpKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBzM2M2NHh4X3NwaV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpX21hc3Rlcl9nZXQocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpOworCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2RkLT5sb2NrLCBmbGFncyk7CisJc2RkLT5zdGF0ZSB8PSBTVVNQTkQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoc2RkLT5zdGF0ZSAmIFNQSUJVU1kpCisJCW1zbGVlcCgxMCk7CisKKwkvKiBEaXNhYmxlIHRoZSBjbG9jayAqLworCWNsa19kaXNhYmxlKHNkZC0+c3JjX2Nsayk7CisJY2xrX2Rpc2FibGUoc2RkLT5jbGspOworCisJc2RkLT5jdXJfc3BlZWQgPSAwOyAvKiBPdXRwdXQgQ2xvY2sgaXMgc3RvcHBlZCAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjNjR4eF9zcGlfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKTsKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyAqc2NpID0gc2RkLT5jbnRybHJfaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2NpLT5jZmdfZ3BpbyhwZGV2KTsKKworCS8qIEVuYWJsZSB0aGUgY2xvY2sgKi8KKwljbGtfZW5hYmxlKHNkZC0+c3JjX2Nsayk7CisJY2xrX2VuYWJsZShzZGQtPmNsayk7CisKKwlzM2M2NHh4X3NwaV9od2luaXQoc2RkLCBwZGV2LT5pZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2RkLT5sb2NrLCBmbGFncyk7CisJc2RkLT5zdGF0ZSAmPSB+U1VTUE5EOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBzM2M2NHh4X3NwaV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgczNjNjR4eF9zcGlfcmVzdW1lCU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjNjR4eF9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInMzYzY0eHgtc3BpIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlID0gczNjNjR4eF9zcGlfcmVtb3ZlLAorCS5zdXNwZW5kID0gczNjNjR4eF9zcGlfc3VzcGVuZCwKKwkucmVzdW1lID0gczNjNjR4eF9zcGlfcmVzdW1lLAorfTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06czNjNjR4eC1zcGkiKTsKKworc3RhdGljIGludCBfX2luaXQgczNjNjR4eF9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnMzYzY0eHhfc3BpX2RyaXZlciwgczNjNjR4eF9zcGlfcHJvYmUpOworfQorc3Vic3lzX2luaXRjYWxsKHMzYzY0eHhfc3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgczNjNjR4eF9zcGlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzM2M2NHh4X3NwaV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoczNjNjR4eF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUzNDNjRYWCBTUEkgQ29udHJvbGxlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9zaF9tc2lvZi5jIGIvZHJpdmVycy9zcGkvc3BpLXNoLW1zaW9mLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3BpL3NwaV9zaF9tc2lvZi5jCnJlbmFtZSB0byBkcml2ZXJzL3NwaS9zcGktc2gtbXNpb2YuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXNoLXNjaS5jIGIvZHJpdmVycy9zcGkvc3BpLXNoLXNjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3Nzc5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktc2gtc2NpLmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBTSCBTQ0kgU1BJIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYWdudXMgRGFtbQorICoKKyAqIEJhc2VkIG9uIFMzQzI0WFggR1BJTyBiYXNlZCBTUEkgZHJpdmVyLCB3aGljaCBpczoKKyAqICAgQ29weXJpZ2h0IChjKSAyMDA2IEJlbiBEb29rcworICogICBDb3B5cmlnaHQgKGMpIDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisKKyNpbmNsdWRlIDxhc20vc3BpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0cnVjdCBzaF9zY2lfc3BpIHsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcgYml0YmFuZzsKKworCXZvaWQgX19pb21lbSAqbWVtYmFzZTsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlzdHJ1Y3Qgc2hfc3BpX2luZm8gKmluZm87CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2OworfTsKKworI2RlZmluZSBTQ1NQVFIoc3ApCShzcC0+bWVtYmFzZSArIDB4MWMpCisjZGVmaW5lIFBJTl9TQ0sJCSgxIDw8IDIpCisjZGVmaW5lIFBJTl9UWEQJCSgxIDw8IDApCisjZGVmaW5lIFBJTl9SWEQJCVBJTl9UWEQKKyNkZWZpbmUgUElOX0lOSVQJKCgxIDw8IDEpIHwgKDEgPDwgMykgfCBQSU5fU0NLIHwgUElOX1RYRCkKKworc3RhdGljIGlubGluZSB2b2lkIHNldGJpdHMoc3RydWN0IHNoX3NjaV9zcGkgKnNwLCBpbnQgYml0cywgaW50IG9uKQoreworCS8qCisJICogV2UgYXJlIHRoZSBvbmx5IHVzZXIgb2YgU0NTUFRSIHNvIG5vIGxvY2tpbmcgaXMgcmVxdWlyZWQuCisJICogUmVhZGluZyBiaXQgMiBhbmQgMCBpbiBTQ1NQVFIgZ2l2ZXMgcGluIHN0YXRlIGFzIGlucHV0LgorCSAqIFdyaXRpbmcgdGhlIHNhbWUgYml0cyBzZXRzIHRoZSBvdXRwdXQgdmFsdWUuCisJICogVGhpcyBtYWtlcyByZWd1bGFyIHJlYWQtbW9kaWZ5LXdyaXRlIGRpZmZpY3VsdCBzbyB3ZQorCSAqIHVzZSBzcC0+dmFsIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhdGVzdCByZWdpc3RlciB2YWx1ZS4KKwkgKi8KKworCWlmIChvbikKKwkJc3AtPnZhbCB8PSBiaXRzOworCWVsc2UKKwkJc3AtPnZhbCAmPSB+Yml0czsKKworCWlvd3JpdGU4KHNwLT52YWwsIFNDU1BUUihzcCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0c2NrKHN0cnVjdCBzcGlfZGV2aWNlICpkZXYsIGludCBvbikKK3sKKwlzZXRiaXRzKHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoZGV2LT5tYXN0ZXIpLCBQSU5fU0NLLCBvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRtb3NpKHN0cnVjdCBzcGlfZGV2aWNlICpkZXYsIGludCBvbikKK3sKKwlzZXRiaXRzKHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoZGV2LT5tYXN0ZXIpLCBQSU5fVFhELCBvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGdldG1pc28oc3RydWN0IHNwaV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2hfc2NpX3NwaSAqc3AgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKGRldi0+bWFzdGVyKTsKKworCXJldHVybiAoaW9yZWFkOChTQ1NQVFIoc3ApKSAmIFBJTl9SWEQpID8gMSA6IDA7Cit9CisKKyNkZWZpbmUgc3BpZGVsYXkoeCkgbmRlbGF5KHgpCisKKyNpbmNsdWRlICJzcGktYml0YmFuZy10eHJ4LmgiCisKK3N0YXRpYyB1MzIgc2hfc2NpX3NwaV90eHJ4X21vZGUwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICAgICAgdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMCwgMCwgd29yZCwgYml0cyk7Cit9CisKK3N0YXRpYyB1MzIgc2hfc2NpX3NwaV90eHJ4X21vZGUxKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICAgICAgdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTEoc3BpLCBuc2VjcywgMCwgMCwgd29yZCwgYml0cyk7Cit9CisKK3N0YXRpYyB1MzIgc2hfc2NpX3NwaV90eHJ4X21vZGUyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICAgICAgdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMSwgMCwgd29yZCwgYml0cyk7Cit9CisKK3N0YXRpYyB1MzIgc2hfc2NpX3NwaV90eHJ4X21vZGUzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICAgICAgdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTEoc3BpLCBuc2VjcywgMSwgMCwgd29yZCwgYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNoX3NjaV9zcGlfY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHNoX3NjaV9zcGkgKnNwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShkZXYtPm1hc3Rlcik7CisKKwlpZiAoc3AtPmluZm8gJiYgc3AtPmluZm8tPmNoaXBfc2VsZWN0KQorCQkoc3AtPmluZm8tPmNoaXBfc2VsZWN0KShzcC0+aW5mbywgZGV2LT5jaGlwX3NlbGVjdCwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IHNoX3NjaV9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCByZXNvdXJjZQkqcjsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBzaF9zY2lfc3BpICpzcDsKKwlpbnQgcmV0OworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc2hfc2NpX3NwaSkpOworCWlmIChtYXN0ZXIgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBzcGkgbWFzdGVyXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnIwOworCX0KKworCXNwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBzcCk7CisJc3AtPmluZm8gPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJLyogc2V0dXAgc3BpIGJpdGJhbmcgYWRhcHRvciAqLworCXNwLT5iaXRiYW5nLm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJc3AtPmJpdGJhbmcubWFzdGVyLT5idXNfbnVtID0gc3AtPmluZm8tPmJ1c19udW07CisJc3AtPmJpdGJhbmcubWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHNwLT5pbmZvLT5udW1fY2hpcHNlbGVjdDsKKwlzcC0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gc2hfc2NpX3NwaV9jaGlwc2VsZWN0OworCisJc3AtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzBdID0gc2hfc2NpX3NwaV90eHJ4X21vZGUwOworCXNwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8xXSA9IHNoX3NjaV9zcGlfdHhyeF9tb2RlMTsKKwlzcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMl0gPSBzaF9zY2lfc3BpX3R4cnhfbW9kZTI7CisJc3AtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzNdID0gc2hfc2NpX3NwaV90eHJ4X21vZGUzOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAociA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyMTsKKwl9CisJc3AtPm1lbWJhc2UgPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwlpZiAoIXNwLT5tZW1iYXNlKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBlcnIxOworCX0KKwlzcC0+dmFsID0gaW9yZWFkOChTQ1NQVFIoc3ApKTsKKwlzZXRiaXRzKHNwLCBQSU5fSU5JVCwgMSk7CisKKwlyZXQgPSBzcGlfYml0YmFuZ19zdGFydCgmc3AtPmJpdGJhbmcpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCXNldGJpdHMoc3AsIFBJTl9JTklULCAwKTsKKwlpb3VubWFwKHNwLT5tZW1iYXNlKTsKKyBlcnIxOgorCXNwaV9tYXN0ZXJfcHV0KHNwLT5iaXRiYW5nLm1hc3Rlcik7CisgZXJyMDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNoX3NjaV9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2hfc2NpX3NwaSAqc3AgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCisJaW91bm1hcChzcC0+bWVtYmFzZSk7CisJc2V0Yml0cyhzcCwgUElOX0lOSVQsIDApOworCXNwaV9iaXRiYW5nX3N0b3AoJnNwLT5iaXRiYW5nKTsKKwlzcGlfbWFzdGVyX3B1dChzcC0+Yml0YmFuZy5tYXN0ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzaF9zY2lfc3BpX2RydiA9IHsKKwkucHJvYmUJCT0gc2hfc2NpX3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IHNoX3NjaV9zcGlfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJzcGlfc2hfc2NpIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoX3NjaV9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNoX3NjaV9zcGlfZHJ2KTsKK30KK21vZHVsZV9pbml0KHNoX3NjaV9zcGlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaF9zY2lfc3BpX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2hfc2NpX3NwaV9kcnYpOworfQorbW9kdWxlX2V4aXQoc2hfc2NpX3NwaV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTSCBTQ0kgU1BJIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c3BpX3NoX3NjaSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX3NoLmMgYi9kcml2ZXJzL3NwaS9zcGktc2guYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zcGkvc3BpX3NoLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3BpL3NwaS1zaC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfc3RtcC5jIGIvZHJpdmVycy9zcGkvc3BpLXN0bXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zcGkvc3BpX3N0bXAuYwpyZW5hbWUgdG8gZHJpdmVycy9zcGkvc3BpLXN0bXAuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXRlZ3JhLmMgYi9kcml2ZXJzL3NwaS9zcGktdGVncmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWE2MzAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLXRlZ3JhLmMKQEAgLTAsMCArMSw2MzAgQEAKKy8qCisgKiBEcml2ZXIgZm9yIE52aWRpYSBURUdSQSBzcGkgY29udHJvbGxlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlLCBJbmMuCisgKgorICogQXV0aG9yOgorICogICAgIEVyaWsgR2lsbGluZyA8a29ua2Vyc0BhbmRyb2lkLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisKKyNkZWZpbmUgU0xJTktfQ09NTUFORAkJMHgwMDAKKyNkZWZpbmUgICBTTElOS19CSVRfTEVOR1RIKHgpCQkoKCh4KSAmIDB4MWYpIDw8IDApCisjZGVmaW5lICAgU0xJTktfV09SRF9TSVpFKHgpCQkoKCh4KSAmIDB4MWYpIDw8IDUpCisjZGVmaW5lICAgU0xJTktfQk9USF9FTgkJCSgxIDw8IDEwKQorI2RlZmluZSAgIFNMSU5LX0NTX1NXCQkJKDEgPDwgMTEpCisjZGVmaW5lICAgU0xJTktfQ1NfVkFMVUUJCSgxIDw8IDEyKQorI2RlZmluZSAgIFNMSU5LX0NTX1BPTEFSSVRZCQkoMSA8PCAxMykKKyNkZWZpbmUgICBTTElOS19JRExFX1NEQV9EUklWRV9MT1cJKDAgPDwgMTYpCisjZGVmaW5lICAgU0xJTktfSURMRV9TREFfRFJJVkVfSElHSAkoMSA8PCAxNikKKyNkZWZpbmUgICBTTElOS19JRExFX1NEQV9QVUxMX0xPVwkoMiA8PCAxNikKKyNkZWZpbmUgICBTTElOS19JRExFX1NEQV9QVUxMX0hJR0gJKDMgPDwgMTYpCisjZGVmaW5lICAgU0xJTktfSURMRV9TREFfTUFTSwkJKDMgPDwgMTYpCisjZGVmaW5lICAgU0xJTktfQ1NfUE9MQVJJVFkxCQkoMSA8PCAyMCkKKyNkZWZpbmUgICBTTElOS19DS19TREEJCQkoMSA8PCAyMSkKKyNkZWZpbmUgICBTTElOS19DU19QT0xBUklUWTIJCSgxIDw8IDIyKQorI2RlZmluZSAgIFNMSU5LX0NTX1BPTEFSSVRZMwkJKDEgPDwgMjMpCisjZGVmaW5lICAgU0xJTktfSURMRV9TQ0xLX0RSSVZFX0xPVwkoMCA8PCAyNCkKKyNkZWZpbmUgICBTTElOS19JRExFX1NDTEtfRFJJVkVfSElHSAkoMSA8PCAyNCkKKyNkZWZpbmUgICBTTElOS19JRExFX1NDTEtfUFVMTF9MT1cJKDIgPDwgMjQpCisjZGVmaW5lICAgU0xJTktfSURMRV9TQ0xLX1BVTExfSElHSAkoMyA8PCAyNCkKKyNkZWZpbmUgICBTTElOS19JRExFX1NDTEtfTUFTSwkJKDMgPDwgMjQpCisjZGVmaW5lICAgU0xJTktfTV9TCQkJKDEgPDwgMjgpCisjZGVmaW5lICAgU0xJTktfV0FJVAkJCSgxIDw8IDI5KQorI2RlZmluZSAgIFNMSU5LX0dPCQkJKDEgPDwgMzApCisjZGVmaW5lICAgU0xJTktfRU5CCQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgU0xJTktfQ09NTUFORDIJCTB4MDA0CisjZGVmaW5lICAgU0xJTktfTFNCRkUJCQkoMSA8PCAwKQorI2RlZmluZSAgIFNMSU5LX1NTT0UJCQkoMSA8PCAxKQorI2RlZmluZSAgIFNMSU5LX1NQSUUJCQkoMSA8PCA0KQorI2RlZmluZSAgIFNMSU5LX0JJRElST0UJCQkoMSA8PCA2KQorI2RlZmluZSAgIFNMSU5LX01PREZFTgkJCSgxIDw8IDcpCisjZGVmaW5lICAgU0xJTktfSU5UX1NJWkUoeCkJCSgoKHgpICYgMHgxZikgPDwgOCkKKyNkZWZpbmUgICBTTElOS19DU19BQ1RJVkVfQkVUV0VFTgkoMSA8PCAxNykKKyNkZWZpbmUgICBTTElOS19TU19FTl9DUyh4KQkJKCgoeCkgJiAweDMpIDw8IDE4KQorI2RlZmluZSAgIFNMSU5LX1NTX1NFVFVQKHgpCQkoKCh4KSAmIDB4MykgPDwgMjApCisjZGVmaW5lICAgU0xJTktfRklGT19SRUZJTExTXzAJCSgwIDw8IDIyKQorI2RlZmluZSAgIFNMSU5LX0ZJRk9fUkVGSUxMU18xCQkoMSA8PCAyMikKKyNkZWZpbmUgICBTTElOS19GSUZPX1JFRklMTFNfMgkJKDIgPDwgMjIpCisjZGVmaW5lICAgU0xJTktfRklGT19SRUZJTExTXzMJCSgzIDw8IDIyKQorI2RlZmluZSAgIFNMSU5LX0ZJRk9fUkVGSUxMU19NQVNLCSgzIDw8IDIyKQorI2RlZmluZSAgIFNMSU5LX1dBSVRfUEFDS19JTlQoeCkJKCgoeCkgJiAweDcpIDw8IDI2KQorI2RlZmluZSAgIFNMSU5LX1NQQzAJCQkoMSA8PCAyOSkKKyNkZWZpbmUgICBTTElOS19UWEVOCQkJKDEgPDwgMzApCisjZGVmaW5lICAgU0xJTktfUlhFTgkJCSgxIDw8IDMxKQorCisjZGVmaW5lIFNMSU5LX1NUQVRVUwkJMHgwMDgKKyNkZWZpbmUgICBTTElOS19DT1VOVCh2YWwpCQkoKCh2YWwpID4+IDApICYgMHgxZikKKyNkZWZpbmUgICBTTElOS19XT1JEKHZhbCkJCSgoKHZhbCkgPj4gNSkgJiAweDFmKQorI2RlZmluZSAgIFNMSU5LX0JMS19DTlQodmFsKQkJKCgodmFsKSA+PiAwKSAmIDB4ZmZmZikKKyNkZWZpbmUgICBTTElOS19NT0RGCQkJKDEgPDwgMTYpCisjZGVmaW5lICAgU0xJTktfUlhfVU5GCQkJKDEgPDwgMTgpCisjZGVmaW5lICAgU0xJTktfVFhfT1ZGCQkJKDEgPDwgMTkpCisjZGVmaW5lICAgU0xJTktfVFhfRlVMTAkJCSgxIDw8IDIwKQorI2RlZmluZSAgIFNMSU5LX1RYX0VNUFRZCQkoMSA8PCAyMSkKKyNkZWZpbmUgICBTTElOS19SWF9GVUxMCQkJKDEgPDwgMjIpCisjZGVmaW5lICAgU0xJTktfUlhfRU1QVFkJCSgxIDw8IDIzKQorI2RlZmluZSAgIFNMSU5LX1RYX1VORgkJCSgxIDw8IDI0KQorI2RlZmluZSAgIFNMSU5LX1JYX09WRgkJCSgxIDw8IDI1KQorI2RlZmluZSAgIFNMSU5LX1RYX0ZMVVNICQkoMSA8PCAyNikKKyNkZWZpbmUgICBTTElOS19SWF9GTFVTSAkJKDEgPDwgMjcpCisjZGVmaW5lICAgU0xJTktfU0NMSwkJCSgxIDw8IDI4KQorI2RlZmluZSAgIFNMSU5LX0VSUgkJCSgxIDw8IDI5KQorI2RlZmluZSAgIFNMSU5LX1JEWQkJCSgxIDw8IDMwKQorI2RlZmluZSAgIFNMSU5LX0JTWQkJCSgxIDw8IDMxKQorCisjZGVmaW5lIFNMSU5LX01BU19EQVRBCQkweDAxMAorI2RlZmluZSBTTElOS19TTEFWRV9EQVRBCTB4MDE0CisKKyNkZWZpbmUgU0xJTktfRE1BX0NUTAkJMHgwMTgKKyNkZWZpbmUgICBTTElOS19ETUFfQkxPQ0tfU0laRSh4KQkoKCh4KSAmIDB4ZmZmZikgPDwgMCkKKyNkZWZpbmUgICBTTElOS19UWF9UUklHXzEJCSgwIDw8IDE2KQorI2RlZmluZSAgIFNMSU5LX1RYX1RSSUdfNAkJKDEgPDwgMTYpCisjZGVmaW5lICAgU0xJTktfVFhfVFJJR184CQkoMiA8PCAxNikKKyNkZWZpbmUgICBTTElOS19UWF9UUklHXzE2CQkoMyA8PCAxNikKKyNkZWZpbmUgICBTTElOS19UWF9UUklHX01BU0sJCSgzIDw8IDE2KQorI2RlZmluZSAgIFNMSU5LX1JYX1RSSUdfMQkJKDAgPDwgMTgpCisjZGVmaW5lICAgU0xJTktfUlhfVFJJR180CQkoMSA8PCAxOCkKKyNkZWZpbmUgICBTTElOS19SWF9UUklHXzgJCSgyIDw8IDE4KQorI2RlZmluZSAgIFNMSU5LX1JYX1RSSUdfMTYJCSgzIDw8IDE4KQorI2RlZmluZSAgIFNMSU5LX1JYX1RSSUdfTUFTSwkJKDMgPDwgMTgpCisjZGVmaW5lICAgU0xJTktfUEFDS0VECQkJKDEgPDwgMjApCisjZGVmaW5lICAgU0xJTktfUEFDS19TSVpFXzQJCSgwIDw8IDIxKQorI2RlZmluZSAgIFNMSU5LX1BBQ0tfU0laRV84CQkoMSA8PCAyMSkKKyNkZWZpbmUgICBTTElOS19QQUNLX1NJWkVfMTYJCSgyIDw8IDIxKQorI2RlZmluZSAgIFNMSU5LX1BBQ0tfU0laRV8zMgkJKDMgPDwgMjEpCisjZGVmaW5lICAgU0xJTktfUEFDS19TSVpFX01BU0sJCSgzIDw8IDIxKQorI2RlZmluZSAgIFNMSU5LX0lFX1RYQwkJCSgxIDw8IDI2KQorI2RlZmluZSAgIFNMSU5LX0lFX1JYQwkJCSgxIDw8IDI3KQorI2RlZmluZSAgIFNMSU5LX0RNQV9FTgkJCSgxIDw8IDMxKQorCisjZGVmaW5lIFNMSU5LX1NUQVRVUzIJCTB4MDFjCisjZGVmaW5lICAgU0xJTktfVFhfRklGT19FTVBUWV9DT1VOVCh2YWwpCSgoKHZhbCkgJiAweDNmKSA+PiAwKQorI2RlZmluZSAgIFNMSU5LX1JYX0ZJRk9fRlVMTF9DT1VOVCh2YWwpCQkoKCh2YWwpICYgMHgzZikgPj4gMTYpCisKKyNkZWZpbmUgU0xJTktfVFhfRklGTwkJMHgxMDAKKyNkZWZpbmUgU0xJTktfUlhfRklGTwkJMHgxODAKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgc3BpX3RlZ3JhX3JlcV9zZWxzW10gPSB7CisJVEVHUkFfRE1BX1JFUV9TRUxfU0wyQjEsCisJVEVHUkFfRE1BX1JFUV9TRUxfU0wyQjIsCisJVEVHUkFfRE1BX1JFUV9TRUxfU0wyQjMsCisJVEVHUkFfRE1BX1JFUV9TRUxfU0wyQjQsCit9OworCisjZGVmaW5lIEJCX0xFTgkJCTMyCisKK3N0cnVjdCBzcGlfdGVncmFfZGF0YSB7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlzdHJ1Y3QgY2xrCQkqY2xrOworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJdW5zaWduZWQgbG9uZwkJcGh5czsKKworCXUzMgkJCWN1cl9zcGVlZDsKKworCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkqY3VyOworCXVuc2lnbmVkCQljdXJfcG9zOworCXVuc2lnbmVkCQljdXJfbGVuOworCXVuc2lnbmVkCQljdXJfYnl0ZXNfcGVyX3dvcmQ7CisKKwkvKiBUaGUgdGVncmEgc3BpIGNvbnRyb2xsZXIgaGFzIGEgYnVnIHdoaWNoIGNhdXNlcyB0aGUgZmlyc3Qgd29yZAorCSAqIGluIFBJTyB0cmFuc2FjdGlvbnMgdG8gYmUgZ2FyYmFnZS4gIFNpbmNlIHBhY2tlZCBETUEgdHJhbnNhY3Rpb25zCisJICogcmVxdWlyZSB0cmFuc2ZlcnMgdG8gYmUgNCBieXRlIGFsaWduZWQgd2UgbmVlZCBhIGJvdW5jZSBidWZmZXIKKwkgKiBmb3IgdGhlIGdlbmVyaWMgY2FzZS4KKwkgKi8KKwlzdHJ1Y3QgdGVncmFfZG1hX3JlcQlyeF9kbWFfcmVxOworCXN0cnVjdCB0ZWdyYV9kbWFfY2hhbm5lbCAqcnhfZG1hOworCXUzMgkJCSpyeF9iYjsKKwlkbWFfYWRkcl90CQlyeF9iYl9waHlzOworfTsKKworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3BpX3RlZ3JhX3JlYWRsKHN0cnVjdCBzcGlfdGVncmFfZGF0YSAqdHNwaSwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgcmVnKQoreworCXJldHVybiByZWFkbCh0c3BpLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNwaV90ZWdyYV93cml0ZWwoc3RydWN0IHNwaV90ZWdyYV9kYXRhICp0c3BpLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyByZWcpCit7CisJd3JpdGVsKHZhbCwgdHNwaS0+YmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHNwaV90ZWdyYV9nbyhzdHJ1Y3Qgc3BpX3RlZ3JhX2RhdGEgKnRzcGkpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwl3bWIoKTsKKworCXZhbCA9IHNwaV90ZWdyYV9yZWFkbCh0c3BpLCBTTElOS19ETUFfQ1RMKTsKKwl2YWwgJj0gflNMSU5LX0RNQV9CTE9DS19TSVpFKH4wKSAmIH5TTElOS19ETUFfRU47CisJdmFsIHw9IFNMSU5LX0RNQV9CTE9DS19TSVpFKHRzcGktPnJ4X2RtYV9yZXEuc2l6ZSAvIDQgLSAxKTsKKwlzcGlfdGVncmFfd3JpdGVsKHRzcGksIHZhbCwgU0xJTktfRE1BX0NUTCk7CisKKwl0ZWdyYV9kbWFfZW5xdWV1ZV9yZXEodHNwaS0+cnhfZG1hLCAmdHNwaS0+cnhfZG1hX3JlcSk7CisKKwl2YWwgfD0gU0xJTktfRE1BX0VOOworCXNwaV90ZWdyYV93cml0ZWwodHNwaSwgdmFsLCBTTElOS19ETUFfQ1RMKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNwaV90ZWdyYV9maWxsX3R4X2ZpZm8oc3RydWN0IHNwaV90ZWdyYV9kYXRhICp0c3BpLAorCQkJCSAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwl1bnNpZ25lZCBsZW4gPSBtaW4odC0+bGVuIC0gdHNwaS0+Y3VyX3BvcywgQkJfTEVOICoKKwkJCSAgIHRzcGktPmN1cl9ieXRlc19wZXJfd29yZCk7CisJdTggKnR4X2J1ZiA9ICh1OCAqKXQtPnR4X2J1ZiArIHRzcGktPmN1cl9wb3M7CisJaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwl2YWwgPSBzcGlfdGVncmFfcmVhZGwodHNwaSwgU0xJTktfQ09NTUFORCk7CisJdmFsICY9IH5TTElOS19XT1JEX1NJWkUofjApOworCXZhbCB8PSBTTElOS19XT1JEX1NJWkUobGVuIC8gdHNwaS0+Y3VyX2J5dGVzX3Blcl93b3JkIC0gMSk7CisJc3BpX3RlZ3JhX3dyaXRlbCh0c3BpLCB2YWwsIFNMSU5LX0NPTU1BTkQpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSB0c3BpLT5jdXJfYnl0ZXNfcGVyX3dvcmQpIHsKKwkJdmFsID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IHRzcGktPmN1cl9ieXRlc19wZXJfd29yZDsgaisrKQorCQkJdmFsIHw9IHR4X2J1ZltpICsgal0gPDwgaiAqIDg7CisKKwkJc3BpX3RlZ3JhX3dyaXRlbCh0c3BpLCB2YWwsIFNMSU5LX1RYX0ZJRk8pOworCX0KKworCXRzcGktPnJ4X2RtYV9yZXEuc2l6ZSA9IGxlbiAvIHRzcGktPmN1cl9ieXRlc19wZXJfd29yZCAqIDQ7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdW5zaWduZWQgc3BpX3RlZ3JhX2RyYWluX3J4X2ZpZm8oc3RydWN0IHNwaV90ZWdyYV9kYXRhICp0c3BpLAorCQkJCSAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwl1bnNpZ25lZCBsZW4gPSB0c3BpLT5jdXJfbGVuOworCXU4ICpyeF9idWYgPSAodTggKil0LT5yeF9idWYgKyB0c3BpLT5jdXJfcG9zOworCWludCBpLCBqOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSB0c3BpLT5jdXJfYnl0ZXNfcGVyX3dvcmQpIHsKKwkJdmFsID0gdHNwaS0+cnhfYmJbaSAvIHRzcGktPmN1cl9ieXRlc19wZXJfd29yZF07CisJCWZvciAoaiA9IDA7IGogPCB0c3BpLT5jdXJfYnl0ZXNfcGVyX3dvcmQ7IGorKykKKwkJCXJ4X2J1ZltpICsgal0gPSAodmFsID4+IChqICogOCkpICYgMHhmZjsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZCBzcGlfdGVncmFfc3RhcnRfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlzdHJ1Y3Qgc3BpX3RlZ3JhX2RhdGEgKnRzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1MzIgc3BlZWQ7CisJdTggYml0c19wZXJfd29yZDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCXNwZWVkID0gdC0+c3BlZWRfaHogPyB0LT5zcGVlZF9oeiA6IHNwaS0+bWF4X3NwZWVkX2h6OworCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkID8gdC0+Yml0c19wZXJfd29yZCAgOgorCQlzcGktPmJpdHNfcGVyX3dvcmQ7CisKKwl0c3BpLT5jdXJfYnl0ZXNfcGVyX3dvcmQgPSAoYml0c19wZXJfd29yZCAtIDEpIC8gOCArIDE7CisKKwlpZiAoc3BlZWQgIT0gdHNwaS0+Y3VyX3NwZWVkKQorCQljbGtfc2V0X3JhdGUodHNwaS0+Y2xrLCBzcGVlZCk7CisKKwlpZiAodHNwaS0+Y3VyX3NwZWVkID09IDApCisJCWNsa19lbmFibGUodHNwaS0+Y2xrKTsKKworCXRzcGktPmN1cl9zcGVlZCA9IHNwZWVkOworCisJdmFsID0gc3BpX3RlZ3JhX3JlYWRsKHRzcGksIFNMSU5LX0NPTU1BTkQyKTsKKwl2YWwgJj0gflNMSU5LX1NTX0VOX0NTKH4wKSB8IFNMSU5LX1JYRU4gfCBTTElOS19UWEVOOworCWlmICh0LT5yeF9idWYpCisJCXZhbCB8PSBTTElOS19SWEVOOworCWlmICh0LT50eF9idWYpCisJCXZhbCB8PSBTTElOS19UWEVOOworCXZhbCB8PSBTTElOS19TU19FTl9DUyhzcGktPmNoaXBfc2VsZWN0KTsKKwl2YWwgfD0gU0xJTktfU1BJRTsKKwlzcGlfdGVncmFfd3JpdGVsKHRzcGksIHZhbCwgU0xJTktfQ09NTUFORDIpOworCisJdmFsID0gc3BpX3RlZ3JhX3JlYWRsKHRzcGksIFNMSU5LX0NPTU1BTkQpOworCXZhbCAmPSB+U0xJTktfQklUX0xFTkdUSCh+MCk7CisJdmFsIHw9IFNMSU5LX0JJVF9MRU5HVEgoYml0c19wZXJfd29yZCAtIDEpOworCisJLyogRklYTUU6IHNob3VsZCBwcm9iYWJseSBjb250cm9sIENTIG1hbnVhbGx5IHNvIHRoYXQgd2UgY2FuIGJlIHN1cmUKKwkgKiBpdCBkb2VzIG5vdCBnbyBsb3cgYmV0d2VlbiB0cmFuc2ZlciBhbmQgdG8gc3VwcG9ydCBkZWxheV91c2VjcworCSAqIGNvcnJlY3RseS4KKwkgKi8KKwl2YWwgJj0gflNMSU5LX0lETEVfU0NMS19NQVNLICYgflNMSU5LX0NLX1NEQSAmIH5TTElOS19DU19TVzsKKworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJdmFsIHw9IFNMSU5LX0NLX1NEQTsKKworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJdmFsIHw9IFNMSU5LX0lETEVfU0NMS19EUklWRV9ISUdIOworCWVsc2UKKwkJdmFsIHw9IFNMSU5LX0lETEVfU0NMS19EUklWRV9MT1c7CisKKwl2YWwgfD0gU0xJTktfTV9TOworCisJc3BpX3RlZ3JhX3dyaXRlbCh0c3BpLCB2YWwsIFNMSU5LX0NPTU1BTkQpOworCisJc3BpX3RlZ3JhX3dyaXRlbCh0c3BpLCBTTElOS19SWF9GTFVTSCB8IFNMSU5LX1RYX0ZMVVNILCBTTElOS19TVEFUVVMpOworCisJdHNwaS0+Y3VyID0gdDsKKwl0c3BpLT5jdXJfcG9zID0gMDsKKwl0c3BpLT5jdXJfbGVuID0gc3BpX3RlZ3JhX2ZpbGxfdHhfZmlmbyh0c3BpLCB0KTsKKworCXNwaV90ZWdyYV9nbyh0c3BpKTsKK30KKworc3RhdGljIHZvaWQgc3BpX3RlZ3JhX3N0YXJ0X21lc3NhZ2Uoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkgICAgc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CisKKwltLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwltLT5zdGF0dXMgPSAwOworCisJdCA9IGxpc3RfZmlyc3RfZW50cnkoJm0tPnRyYW5zZmVycywgc3RydWN0IHNwaV90cmFuc2ZlciwgdHJhbnNmZXJfbGlzdCk7CisJc3BpX3RlZ3JhX3N0YXJ0X3RyYW5zZmVyKHNwaSwgdCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3NwaV9yeF9kbWFfY29tcGxldGUoc3RydWN0IHRlZ3JhX2RtYV9yZXEgKnJlcSkKK3sKKwlzdHJ1Y3Qgc3BpX3RlZ3JhX2RhdGEgKnRzcGkgPSByZXEtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbTsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpOworCWludCB0aW1lb3V0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCS8qIHRoZSBTUEkgY29udHJvbGxlciBtYXkgY29tZSBiYWNrIHdpdGggYm90aCB0aGUgQlNZIGFuZCBSRFkgYml0cworCSAqIHNldC4gIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBCU1kgYml0IHRvIGNsZWFyIHNvCisJICogdGhhdCB3ZSBhcmUgc3VyZSB0aGUgRE1BIGlzIGZpbmlzaGVkLiAgMTAwMCByZWFkcyB3YXMgZW1waXJpY2FsbHkKKwkgKiBkZXRlcm1pbmVkIHRvIGJlIGxvbmcgZW5vdWdoLgorCSAqLworCXdoaWxlICh0aW1lb3V0KysgPCAxMDAwKSB7CisJCWlmICghKHNwaV90ZWdyYV9yZWFkbCh0c3BpLCBTTElOS19TVEFUVVMpICYgU0xJTktfQlNZKSkKKwkJCWJyZWFrOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0c3BpLT5sb2NrLCBmbGFncyk7CisKKwl2YWwgPSBzcGlfdGVncmFfcmVhZGwodHNwaSwgU0xJTktfU1RBVFVTKTsKKwl2YWwgfD0gU0xJTktfUkRZOworCXNwaV90ZWdyYV93cml0ZWwodHNwaSwgdmFsLCBTTElOS19TVEFUVVMpOworCisJbSA9IGxpc3RfZmlyc3RfZW50cnkoJnRzcGktPnF1ZXVlLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsIHF1ZXVlKTsKKworCWlmICh0aW1lb3V0ID49IDEwMDApCisJCW0tPnN0YXR1cyA9IC1FSU87CisKKwlzcGkgPSBtLT5zdGF0ZTsKKworCXRzcGktPmN1cl9wb3MgKz0gc3BpX3RlZ3JhX2RyYWluX3J4X2ZpZm8odHNwaSwgdHNwaS0+Y3VyKTsKKwltLT5hY3R1YWxfbGVuZ3RoICs9IHRzcGktPmN1cl9wb3M7CisKKwlpZiAodHNwaS0+Y3VyX3BvcyA8IHRzcGktPmN1ci0+bGVuKSB7CisJCXRzcGktPmN1cl9sZW4gPSBzcGlfdGVncmFfZmlsbF90eF9maWZvKHRzcGksIHRzcGktPmN1cik7CisJCXNwaV90ZWdyYV9nbyh0c3BpKTsKKwl9IGVsc2UgaWYgKCFsaXN0X2lzX2xhc3QoJnRzcGktPmN1ci0+dHJhbnNmZXJfbGlzdCwKKwkJCQkgJm0tPnRyYW5zZmVycykpIHsKKwkJdHNwaS0+Y3VyID0gIGxpc3RfZmlyc3RfZW50cnkoJnRzcGktPmN1ci0+dHJhbnNmZXJfbGlzdCwKKwkJCQkJICAgICAgc3RydWN0IHNwaV90cmFuc2ZlciwKKwkJCQkJICAgICAgdHJhbnNmZXJfbGlzdCk7CisJCXNwaV90ZWdyYV9zdGFydF90cmFuc2ZlcihzcGksIHRzcGktPmN1cik7CisJfSBlbHNlIHsKKwkJbGlzdF9kZWwoJm0tPnF1ZXVlKTsKKworCQltLT5jb21wbGV0ZShtLT5jb250ZXh0KTsKKworCQlpZiAoIWxpc3RfZW1wdHkoJnRzcGktPnF1ZXVlKSkgeworCQkJbSA9IGxpc3RfZmlyc3RfZW50cnkoJnRzcGktPnF1ZXVlLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsCisJCQkJCSAgICAgcXVldWUpOworCQkJc3BpID0gbS0+c3RhdGU7CisJCQlzcGlfdGVncmFfc3RhcnRfbWVzc2FnZShzcGksIG0pOworCQl9IGVsc2UgeworCQkJY2xrX2Rpc2FibGUodHNwaS0+Y2xrKTsKKwkJCXRzcGktPmN1cl9zcGVlZCA9IDA7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0c3BpLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3RlZ3JhX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHNwaV90ZWdyYV9kYXRhICp0c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdW5zaWduZWQgbG9uZyBjc19iaXQ7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXAgJWQgYnB3LCAlc2Nwb2wsICVzY3BoYSwgJWRIelxuIiwKKwkJc3BpLT5iaXRzX3Blcl93b3JkLAorCQlzcGktPm1vZGUgJiBTUElfQ1BPTCA/ICIiIDogIn4iLAorCQlzcGktPm1vZGUgJiBTUElfQ1BIQSA/ICIiIDogIn4iLAorCQlzcGktPm1heF9zcGVlZF9oeik7CisKKworCXN3aXRjaCAoc3BpLT5jaGlwX3NlbGVjdCkgeworCWNhc2UgMDoKKwkJY3NfYml0ID0gU0xJTktfQ1NfUE9MQVJJVFk7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQljc19iaXQgPSBTTElOS19DU19QT0xBUklUWTE7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQljc19iaXQgPSBTTElOS19DU19QT0xBUklUWTI7CisJCWJyZWFrOworCisJY2FzZSA0OgorCQljc19iaXQgPSBTTElOS19DU19QT0xBUklUWTM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRzcGktPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IHNwaV90ZWdyYV9yZWFkbCh0c3BpLCBTTElOS19DT01NQU5EKTsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpCisJCXZhbCB8PSBjc19iaXQ7CisJZWxzZQorCQl2YWwgJj0gfmNzX2JpdDsKKwlzcGlfdGVncmFfd3JpdGVsKHRzcGksIHZhbCwgU0xJTktfQ09NTUFORCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0c3BpLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGlfdGVncmFfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBzcGlfdGVncmFfZGF0YSAqdHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgd2FzX2VtcHR5OworCisJaWYgKGxpc3RfZW1wdHkoJm0tPnRyYW5zZmVycykgfHwgIW0tPmNvbXBsZXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQlpZiAodC0+Yml0c19wZXJfd29yZCA8IDAgfHwgdC0+Yml0c19wZXJfd29yZCA+IDMyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHQtPmxlbiA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCF0LT5yeF9idWYgJiYgIXQtPnR4X2J1ZikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCW0tPnN0YXRlID0gc3BpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRzcGktPmxvY2ssIGZsYWdzKTsKKwl3YXNfZW1wdHkgPSBsaXN0X2VtcHR5KCZ0c3BpLT5xdWV1ZSk7CisJbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZ0c3BpLT5xdWV1ZSk7CisKKwlpZiAod2FzX2VtcHR5KQorCQlzcGlfdGVncmFfc3RhcnRfbWVzc2FnZShzcGksIG0pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHNwaS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNwaV90ZWdyYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisJc3RydWN0IHNwaV90ZWdyYV9kYXRhCSp0c3BpOworCXN0cnVjdCByZXNvdXJjZQkJKnI7CisJaW50IHJldDsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mICp0c3BpKTsKKwlpZiAobWFzdGVyID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibWFzdGVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7CisKKwltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKKworCW1hc3Rlci0+c2V0dXAgPSBzcGlfdGVncmFfc2V0dXA7CisJbWFzdGVyLT50cmFuc2ZlciA9IHNwaV90ZWdyYV90cmFuc2ZlcjsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gNDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBtYXN0ZXIpOworCXRzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdHNwaS0+bWFzdGVyID0gbWFzdGVyOworCXRzcGktPnBkZXYgPSBwZGV2OworCXNwaW5fbG9ja19pbml0KCZ0c3BpLT5sb2NrKTsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnIwOworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpLAorCQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyMDsKKwl9CisKKwl0c3BpLT5waHlzID0gci0+c3RhcnQ7CisJdHNwaS0+YmFzZSA9IGlvcmVtYXAoci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworCWlmICghdHNwaS0+YmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBpb3JlbWFwIGlvbWVtXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnIxOworCX0KKworCXRzcGktPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUih0c3BpLT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbiBub3QgZ2V0IGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUih0c3BpLT5jbGspOworCQlnb3RvIGVycjI7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnRzcGktPnF1ZXVlKTsKKworCXRzcGktPnJ4X2RtYSA9IHRlZ3JhX2RtYV9hbGxvY2F0ZV9jaGFubmVsKFRFR1JBX0RNQV9NT0RFX09ORVNIT1QpOworCWlmICghdHNwaS0+cnhfZG1hKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbiBub3QgYWxsb2NhdGUgcnggZG1hIGNoYW5uZWxcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjM7CisJfQorCisJdHNwaS0+cnhfYmIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgc2l6ZW9mKHUzMikgKiBCQl9MRU4sCisJCQkJCSAmdHNwaS0+cnhfYmJfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCF0c3BpLT5yeF9iYikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4gbm90IGFsbG9jYXRlIHJ4IGJvdW5jZSBidWZmZXJcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjQ7CisJfQorCisJdHNwaS0+cnhfZG1hX3JlcS5jb21wbGV0ZSA9IHRlZ3JhX3NwaV9yeF9kbWFfY29tcGxldGU7CisJdHNwaS0+cnhfZG1hX3JlcS50b19tZW1vcnkgPSAxOworCXRzcGktPnJ4X2RtYV9yZXEuZGVzdF9hZGRyID0gdHNwaS0+cnhfYmJfcGh5czsKKwl0c3BpLT5yeF9kbWFfcmVxLmRlc3RfYnVzX3dpZHRoID0gMzI7CisJdHNwaS0+cnhfZG1hX3JlcS5zb3VyY2VfYWRkciA9IHRzcGktPnBoeXMgKyBTTElOS19SWF9GSUZPOworCXRzcGktPnJ4X2RtYV9yZXEuc291cmNlX2J1c193aWR0aCA9IDMyOworCXRzcGktPnJ4X2RtYV9yZXEuc291cmNlX3dyYXAgPSA0OworCXRzcGktPnJ4X2RtYV9yZXEucmVxX3NlbCA9IHNwaV90ZWdyYV9yZXFfc2Vsc1twZGV2LT5pZF07CisJdHNwaS0+cnhfZG1hX3JlcS5kZXYgPSB0c3BpOworCisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXJldCA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjU7CisKKwlyZXR1cm4gcmV0OworCitlcnI1OgorCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIHNpemVvZih1MzIpICogQkJfTEVOLAorCQkJICB0c3BpLT5yeF9iYiwgdHNwaS0+cnhfYmJfcGh5cyk7CitlcnI0OgorCXRlZ3JhX2RtYV9mcmVlX2NoYW5uZWwodHNwaS0+cnhfZG1hKTsKK2VycjM6CisJY2xrX3B1dCh0c3BpLT5jbGspOworZXJyMjoKKwlpb3VubWFwKHRzcGktPmJhc2UpOworZXJyMToKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworZXJyMDoKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNwaV90ZWdyYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXN0cnVjdCBzcGlfdGVncmFfZGF0YQkqdHNwaTsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSpyOworCisJbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXRzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwl0ZWdyYV9kbWFfZnJlZV9jaGFubmVsKHRzcGktPnJ4X2RtYSk7CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBzaXplb2YodTMyKSAqIEJCX0xFTiwKKwkJCSAgdHNwaS0+cnhfYmIsIHRzcGktPnJ4X2JiX3BoeXMpOworCisJY2xrX3B1dCh0c3BpLT5jbGspOworCWlvdW5tYXAodHNwaS0+YmFzZSk7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06c3BpX3RlZ3JhIik7CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNwaV90ZWdyYV9vZl9tYXRjaF90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1zcGkiLCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3BpX3RlZ3JhX29mX21hdGNoX3RhYmxlKTsKKyNlbHNlIC8qIENPTkZJR19PRiAqLworI2RlZmluZSBzcGlfdGVncmFfb2ZfbWF0Y2hfdGFibGUgTlVMTAorI2VuZGlmIC8qIENPTkZJR19PRiAqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGlfdGVncmFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0JCSJzcGlfdGVncmEiLAorCQkub3duZXIgPQlUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gc3BpX3RlZ3JhX29mX21hdGNoX3RhYmxlLAorCX0sCisJLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKHNwaV90ZWdyYV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3BpX3RlZ3JhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzcGlfdGVncmFfZHJpdmVyLCBzcGlfdGVncmFfcHJvYmUpOworfQorbW9kdWxlX2luaXQoc3BpX3RlZ3JhX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BpX3RlZ3JhX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BpX3RlZ3JhX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChzcGlfdGVncmFfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3RpLXNzcC1zcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS10aS1zc3AuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zcGkvdGktc3NwLXNwaS5jCnJlbmFtZSB0byBkcml2ZXJzL3NwaS9zcGktdGktc3NwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS10bGU2MngwLmMgYi9kcml2ZXJzL3NwaS9zcGktdGxlNjJ4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MGU3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktdGxlNjJ4MC5jCkBAIC0wLDAgKzEsMzM0IEBACisvKgorICogU3VwcG9ydCBJbmZpbmVvbiBUTEU2MngwIGRyaXZlciBjaGlwcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcywgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS90bGU2MngwLmg+CisKKworI2RlZmluZSBDTURfUkVBRAkweDAwCisjZGVmaW5lIENNRF9TRVQJCTB4ZmYKKworI2RlZmluZSBESUFHX05PUk1BTAkweDAzCisjZGVmaW5lIERJQUdfT1ZFUkxPQUQJMHgwMgorI2RlZmluZSBESUFHX09QRU4JMHgwMQorI2RlZmluZSBESUFHX1NIT1JUR05ECTB4MDAKKworc3RydWN0IHRsZTYyeDBfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCSp1czsKKwlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CisJdW5zaWduZWQgaW50CQlucl9ncGlvOworCXVuc2lnbmVkIGludAkJZ3Bpb19zdGF0ZTsKKworCXVuc2lnbmVkIGNoYXIJCXR4X2J1ZmZbNF07CisJdW5zaWduZWQgY2hhcgkJcnhfYnVmZls0XTsKK307CisKK3N0YXRpYyBpbnQgdG9fZ3Bpb19udW0oc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpOworCitzdGF0aWMgaW5saW5lIGludCB0bGU2MngwX3dyaXRlKHN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWZmID0gc3QtPnR4X2J1ZmY7CisJdW5zaWduZWQgaW50IGdwaW9fc3RhdGUgPSBzdC0+Z3Bpb19zdGF0ZTsKKworCWJ1ZmZbMF0gPSBDTURfU0VUOworCisJaWYgKHN0LT5ucl9ncGlvID09IDE2KSB7CisJCWJ1ZmZbMV0gPSBncGlvX3N0YXRlID4+IDg7CisJCWJ1ZmZbMl0gPSBncGlvX3N0YXRlOworCX0gZWxzZSB7CisJCWJ1ZmZbMV0gPSBncGlvX3N0YXRlOworCX0KKworCWRldl9kYmcoJnN0LT51cy0+ZGV2LCAiYnVmZiAlMDJ4LCUwMngsJTAyeFxuIiwKKwkJYnVmZlswXSwgYnVmZlsxXSwgYnVmZlsyXSk7CisKKwlyZXR1cm4gc3BpX3dyaXRlKHN0LT51cywgYnVmZiwgKHN0LT5ucl9ncGlvID09IDE2KSA/IDMgOiAyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGxlNjJ4MF9yZWFkKHN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCkKK3sKKwl1bnNpZ25lZCBjaGFyICp0eGJ1ZmYgPSBzdC0+dHhfYnVmZjsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXIgPSB7CisJCS50eF9idWYJCT0gdHhidWZmLAorCQkucnhfYnVmCQk9IHN0LT5yeF9idWZmLAorCQkubGVuCQk9IChzdC0+bnJfZ3BpbyAqIDIpIC8gOCwKKwl9OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisKKwl0eGJ1ZmZbMF0gPSBDTURfUkVBRDsKKwl0eGJ1ZmZbMV0gPSAweDAwOworCXR4YnVmZlsyXSA9IDB4MDA7CisJdHhidWZmWzNdID0gMHgwMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCisJcmV0dXJuIHNwaV9zeW5jKHN0LT51cywgJm1zZyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpkZWNvZGVfZmF1bHQodW5zaWduZWQgaW50IGZhdWx0X2NvZGUpCit7CisJZmF1bHRfY29kZSAmPSAzOworCisJc3dpdGNoIChmYXVsdF9jb2RlKSB7CisJY2FzZSBESUFHX05PUk1BTDoKKwkJcmV0dXJuICJOIjsKKwljYXNlIERJQUdfT1ZFUkxPQUQ6CisJCXJldHVybiAiViI7CisJY2FzZSBESUFHX09QRU46CisJCXJldHVybiAiTyI7CisJY2FzZSBESUFHX1NIT1JUR05EOgorCQlyZXR1cm4gIkciOworCX0KKworCXJldHVybiAiPyI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRsZTYyeDBfc3RhdHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWNoYXIgKmJwID0gYnVmOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmYgPSBzdC0+cnhfYnVmZjsKKwl1bnNpZ25lZCBsb25nIGZhdWx0ID0gMDsKKwlpbnQgcHRyOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJcmV0ID0gdGxlNjJ4MF9yZWFkKHN0KTsKKwlkZXZfZGJnKGRldiwgInRsZTYyeDBfcmVhZCgpIHJldHVybmVkICVkXG4iLCByZXQpOworCWlmIChyZXQgPCAwKSB7CisJCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAocHRyID0gMDsgcHRyIDwgKHN0LT5ucl9ncGlvICogMikvODsgcHRyICs9IDEpIHsKKwkJZmF1bHQgPDw9IDg7CisJCWZhdWx0ICB8PSAoKHVuc2lnbmVkIGxvbmcpYnVmZltwdHJdKTsKKworCQlkZXZfZGJnKGRldiwgImJ5dGUgJWQgaXMgJTAyeFxuIiwgcHRyLCBidWZmW3B0cl0pOworCX0KKworCWZvciAocHRyID0gMDsgcHRyIDwgc3QtPm5yX2dwaW87IHB0cisrKSB7CisJCWJwICs9IHNwcmludGYoYnAsICIlcyAiLCBkZWNvZGVfZmF1bHQoZmF1bHQgPj4gKHB0ciAqIDIpKSk7CisJfQorCisJKmJwKysgPSAnXG4nOworCisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJcmV0dXJuIGJwIC0gYnVmOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoc3RhdHVzX3Nob3csIFNfSVJVR08sIHRsZTYyeDBfc3RhdHVzX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCB0bGU2MngwX2dwaW9fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHRsZTYyeDBfc3RhdGUgKnN0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGdwaW9fbnVtID0gdG9fZ3Bpb19udW0oYXR0cik7CisJaW50IHZhbHVlOworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCXZhbHVlID0gKHN0LT5ncGlvX3N0YXRlID4+IGdwaW9fbnVtKSAmIDE7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZCIsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3QgdGxlNjJ4MF9ncGlvX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZ3Bpb19udW0gPSB0b19ncGlvX251bShhdHRyKTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwljaGFyICplbmRwOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7CisJaWYgKGJ1ZiA9PSBlbmRwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9kYmcoZGV2LCAic2V0dGluZyBncGlvICVkIHRvICVsZFxuIiwgZ3Bpb19udW0sIHZhbCk7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlpZiAodmFsKQorCQlzdC0+Z3Bpb19zdGF0ZSB8PSAxIDw8IGdwaW9fbnVtOworCWVsc2UKKwkJc3QtPmdwaW9fc3RhdGUgJj0gfigxIDw8IGdwaW9fbnVtKTsKKworCXRsZTYyeDBfd3JpdGUoc3QpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8yLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8zLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW80LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW81LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW82LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW83LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW84LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW85LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xMCwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMTEsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzEyLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xMywgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMTQsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzE1LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xNiwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpncGlvX2F0dHJzW10gPSB7CisJWzBdCQk9ICZkZXZfYXR0cl9ncGlvMSwKKwlbMV0JCT0gJmRldl9hdHRyX2dwaW8yLAorCVsyXQkJPSAmZGV2X2F0dHJfZ3BpbzMsCisJWzNdCQk9ICZkZXZfYXR0cl9ncGlvNCwKKwlbNF0JCT0gJmRldl9hdHRyX2dwaW81LAorCVs1XQkJPSAmZGV2X2F0dHJfZ3BpbzYsCisJWzZdCQk9ICZkZXZfYXR0cl9ncGlvNywKKwlbN10JCT0gJmRldl9hdHRyX2dwaW84LAorCVs4XQkJPSAmZGV2X2F0dHJfZ3BpbzksCisJWzldCQk9ICZkZXZfYXR0cl9ncGlvMTAsCisJWzEwXQkJPSAmZGV2X2F0dHJfZ3BpbzExLAorCVsxMV0JCT0gJmRldl9hdHRyX2dwaW8xMiwKKwlbMTJdCQk9ICZkZXZfYXR0cl9ncGlvMTMsCisJWzEzXQkJPSAmZGV2X2F0dHJfZ3BpbzE0LAorCVsxNF0JCT0gJmRldl9hdHRyX2dwaW8xNSwKKwlbMTVdCQk9ICZkZXZfYXR0cl9ncGlvMTYKK307CisKK3N0YXRpYyBpbnQgdG9fZ3Bpb19udW0oc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpCit7CisJaW50IHB0cjsKKworCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShncGlvX2F0dHJzKTsgcHRyKyspIHsKKwkJaWYgKGdwaW9fYXR0cnNbcHRyXSA9PSBhdHRyKQorCQkJcmV0dXJuIHB0cjsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRsZTYyeDBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3Q7CisJc3RydWN0IHRsZTYyeDBfcGRhdGEgKnBkYXRhOworCWludCBwdHI7CisJaW50IHJldDsKKworCXBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIGRldmljZSBkYXRhIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRsZTYyeDBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIG1lbW9yeSBmb3IgZGV2aWNlIHN0YXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3QtPnVzID0gc3BpOworCXN0LT5ucl9ncGlvID0gcGRhdGEtPmdwaW9fY291bnQ7CisJc3QtPmdwaW9fc3RhdGUgPSBwZGF0YS0+aW5pdF9zdGF0ZTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl9zdGF0dXNfc2hvdyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImNhbm5vdCBjcmVhdGUgc3RhdHVzIGF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyX3N0YXR1czsKKwl9CisKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IHBkYXRhLT5ncGlvX2NvdW50OyBwdHIrKykgeworCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCBncGlvX2F0dHJzW3B0cl0pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgImNhbm5vdCBjcmVhdGUgZ3BpbyBhdHRyaWJ1dGVcbiIpOworCQkJZ290byBlcnJfZ3Bpb3M7CisJCX0KKwl9CisKKwkvKiB0bGU2MngwX3dyaXRlKHN0KTsgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisJcmV0dXJuIDA7CisKKyBlcnJfZ3Bpb3M6CisJd2hpbGUgKC0tcHRyID49IDApCisJCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsIGdwaW9fYXR0cnNbcHRyXSk7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfc3RhdHVzX3Nob3cpOworCisgZXJyX3N0YXR1czoKKwlrZnJlZShzdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdGxlNjJ4MF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlpbnQgcHRyOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBzdC0+bnJfZ3BpbzsgcHRyKyspCisJCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsIGdwaW9fYXR0cnNbcHRyXSk7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfc3RhdHVzX3Nob3cpOworCWtmcmVlKHN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHRsZTYyeDBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInRsZTYyeDAiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSB0bGU2MngwX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodGxlNjJ4MF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgdGxlNjJ4MF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJnRsZTYyeDBfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIHRsZTYyeDBfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmdGxlNjJ4MF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0bGU2MngwX2luaXQpOworbW9kdWxlX2V4aXQodGxlNjJ4MF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUTEU2MngwIFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygic3BpOnRsZTYyeDAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS10b3BjbGlmZi1wY2guYyBiL2RyaXZlcnMvc3BpL3NwaS10b3BjbGlmZi1wY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDIzZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLXRvcGNsaWZmLXBjaC5jCkBAIC0wLDAgKzEsMTcxNyBAQAorLyoKKyAqIFNQSSBidXMgZHJpdmVyIGZvciB0aGUgVG9wY2xpZmYgUENIIHVzZWQgYnkgSW50ZWwgU29DcworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBPS0kgU0VNSUNPTkRVQ1RPUiBDby4sIExURC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvcGNoX2RtYS5oPgorCisvKiBSZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIFBDSF9TUENSCQkweDAwCS8qIFNQSSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9TUEJSUgkJMHgwNAkvKiBTUEkgYmF1ZCByYXRlIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9TUFNSCQkweDA4CS8qIFNQSSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENIX1NQRFdSCQkweDBDCS8qIFNQSSB3cml0ZSBkYXRhIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9TUERSUgkJMHgxMAkvKiBTUEkgcmVhZCBkYXRhIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9TU05YQ1IJCTB4MTgJLyogU1NOIEV4cGFuZCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9TUlNUCQkweDFDCS8qIFNQSSByZXNldCByZWdpc3RlciAqLworI2RlZmluZSBQQ0hfQUREUkVTU19TSVpFCTB4MjAKKworI2RlZmluZSBQQ0hfU1BTUl9URkQJCTB4MDAwMDA3QzAKKyNkZWZpbmUgUENIX1NQU1JfUkZECQkweDAwMDBGODAwCisKKyNkZWZpbmUgUENIX1JFQURBQkxFKHgpCQkoKCh4KSAmIFBDSF9TUFNSX1JGRCk+PjExKQorI2RlZmluZSBQQ0hfV1JJVEFCTEUoeCkJCSgoKHgpICYgUENIX1NQU1JfVEZEKT4+NikKKworI2RlZmluZSBQQ0hfUlhfVEhPTEQJCTcKKyNkZWZpbmUgUENIX1JYX1RIT0xEX01BWAkxNQorCisjZGVmaW5lIFBDSF9NQVhfQkFVRFJBVEUJNTAwMDAwMAorI2RlZmluZSBQQ0hfTUFYX0ZJRk9fREVQVEgJMTYKKworI2RlZmluZSBTVEFUVVNfUlVOTklORwkJMQorI2RlZmluZSBTVEFUVVNfRVhJVElORwkJMgorI2RlZmluZSBQQ0hfU0xFRVBfVElNRQkJMTAKKworI2RlZmluZSBTU05fTE9XCQkJMHgwMlUKKyNkZWZpbmUgU1NOX05PX0NPTlRST0wJCTB4MDBVCisjZGVmaW5lIFBDSF9NQVhfQ1MJCTB4RkYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9HRV9TUEkJMHg4ODE2CisKKyNkZWZpbmUgU1BDUl9TUEVfQklUCQkoMSA8PCAwKQorI2RlZmluZSBTUENSX01TVFJfQklUCQkoMSA8PCAxKQorI2RlZmluZSBTUENSX0xTQkZfQklUCQkoMSA8PCA0KQorI2RlZmluZSBTUENSX0NQSEFfQklUCQkoMSA8PCA1KQorI2RlZmluZSBTUENSX0NQT0xfQklUCQkoMSA8PCA2KQorI2RlZmluZSBTUENSX1RGSUVfQklUCQkoMSA8PCA4KQorI2RlZmluZSBTUENSX1JGSUVfQklUCQkoMSA8PCA5KQorI2RlZmluZSBTUENSX0ZJRV9CSVQJCSgxIDw8IDEwKQorI2RlZmluZSBTUENSX09SSUVfQklUCQkoMSA8PCAxMSkKKyNkZWZpbmUgU1BDUl9NREZJRV9CSVQJCSgxIDw8IDEyKQorI2RlZmluZSBTUENSX0ZJQ0xSX0JJVAkJKDEgPDwgMjQpCisjZGVmaW5lIFNQU1JfVEZJX0JJVAkJKDEgPDwgMCkKKyNkZWZpbmUgU1BTUl9SRklfQklUCQkoMSA8PCAxKQorI2RlZmluZSBTUFNSX0ZJX0JJVAkJKDEgPDwgMikKKyNkZWZpbmUgU1BTUl9PUkZfQklUCQkoMSA8PCAzKQorI2RlZmluZSBTUEJSUl9TSVpFX0JJVAkJKDEgPDwgMTApCisKKyNkZWZpbmUgUENIX0FMTAkJCShTUENSX1RGSUVfQklUfFNQQ1JfUkZJRV9CSVR8U1BDUl9GSUVfQklUfFwKKwkJCQlTUENSX09SSUVfQklUfFNQQ1JfTURGSUVfQklUKQorCisjZGVmaW5lIFNQQ1JfUkZJQ19GSUVMRAkJMjAKKyNkZWZpbmUgU1BDUl9URklDX0ZJRUxECQkxNgorCisjZGVmaW5lIE1BU0tfU1BCUlJfU1BCUl9CSVRTCSgoMSA8PCAxMCkgLSAxKQorI2RlZmluZSBNQVNLX1JGSUNfU1BDUl9CSVRTCSgweGYgPDwgU1BDUl9SRklDX0ZJRUxEKQorI2RlZmluZSBNQVNLX1RGSUNfU1BDUl9CSVRTCSgweGYgPDwgU1BDUl9URklDX0ZJRUxEKQorCisjZGVmaW5lIFBDSF9DTE9DS19IWgkJNTAwMDAwMDAKKyNkZWZpbmUgUENIX01BWF9TUEJSCQkxMDIzCisKKy8qIERlZmluaXRpb24gZm9yIE1MNzIxMyBieSBPS0kgU0VNSUNPTkRVQ1RPUiAqLworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JPSE0JCTB4MTBEQgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01MNzIxM19TUEkJMHg4MDJjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUw3MjIzX1NQSQkweDgwMEYKKworLyoKKyAqIFNldCB0aGUgbnVtYmVyIG9mIFNQSSBpbnN0YW5jZSBtYXgKKyAqIEludGVsIEVHMjBUIFBDSCA6CQkxY2gKKyAqIE9LSSBTRU1JQ09ORFVDVE9SIE1MNzIxMyBJT0ggOgkyY2gKKyAqIE9LSSBTRU1JQ09ORFVDVE9SIE1MNzIyMyBJT0ggOgkxY2gKKyovCisjZGVmaW5lIFBDSF9TUElfTUFYX0RFVgkJCTIKKworI2RlZmluZSBQQ0hfQlVGX1NJWkUJCTQwOTYKKyNkZWZpbmUgUENIX0RNQV9UUkFOU19TSVpFCTEyCisKK3N0YXRpYyBpbnQgdXNlX2RtYSA9IDE7CisKK3N0cnVjdCBwY2hfc3BpX2RtYV9jdHJsIHsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJKmRlc2NfdHg7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCSpkZXNjX3J4OworCXN0cnVjdCBwY2hfZG1hX3NsYXZlCQlwYXJhbV90eDsKKwlzdHJ1Y3QgcGNoX2RtYV9zbGF2ZQkJcGFyYW1fcng7CisJc3RydWN0IGRtYV9jaGFuCQkqY2hhbl90eDsKKwlzdHJ1Y3QgZG1hX2NoYW4JCSpjaGFuX3J4OworCXN0cnVjdCBzY2F0dGVybGlzdAkJKnNnX3R4X3A7CisJc3RydWN0IHNjYXR0ZXJsaXN0CQkqc2dfcnhfcDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJCXNnX3R4OworCXN0cnVjdCBzY2F0dGVybGlzdAkJc2dfcng7CisJaW50CQkJCW5lbnQ7CisJdm9pZAkJCQkqdHhfYnVmX3ZpcnQ7CisJdm9pZAkJCQkqcnhfYnVmX3ZpcnQ7CisJZG1hX2FkZHJfdAkJCXR4X2J1Zl9kbWE7CisJZG1hX2FkZHJfdAkJCXJ4X2J1Zl9kbWE7Cit9OworLyoqCisgKiBzdHJ1Y3QgcGNoX3NwaV9kYXRhIC0gSG9sZHMgdGhlIFNQSSBjaGFubmVsIHNwZWNpZmljIGRldGFpbHMKKyAqIEBpb19yZW1hcF9hZGRyOgkJVGhlIHJlbWFwcGVkIFBDSSBiYXNlIGFkZHJlc3MKKyAqIEBtYXN0ZXI6CQkJUG9pbnRlciB0byB0aGUgU1BJIG1hc3RlciBzdHJ1Y3R1cmUKKyAqIEB3b3JrOgkJCVJlZmVyZW5jZSB0byB3b3JrIHF1ZXVlIGhhbmRsZXIKKyAqIEB3azoJCQkJV29ya3F1ZXVlIGZvciBjYXJyeWluZyBvdXQgZXhlY3V0aW9uIG9mIHRoZQorICoJCQkJcmVxdWVzdHMKKyAqIEB3YWl0OgkJCVdhaXQgcXVldWUgZm9yIHdha2luZyB1cCB1cG9uIHJlY2VpdmluZyBhbgorICoJCQkJaW50ZXJydXB0LgorICogQHRyYW5zZmVyX2NvbXBsZXRlOgkJU3RhdHVzIG9mIFNQSSBUcmFuc2ZlcgorICogQGJjdXJyZW50X21zZ19wcm9jZXNzaW5nOglTdGF0dXMgZmxhZyBmb3IgbWVzc2FnZSBwcm9jZXNzaW5nCisgKiBAbG9jazoJCQlMb2NrIGZvciBwcm90ZWN0aW5nIHRoaXMgc3RydWN0dXJlCisgKiBAcXVldWU6CQkJU1BJIE1lc3NhZ2UgcXVldWUKKyAqIEBzdGF0dXM6CQkJU3RhdHVzIG9mIHRoZSBTUEkgZHJpdmVyCisgKiBAYnB3X2xlbjoJCQlMZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBpbiBiaXRzIHBlcgorICoJCQkJd29yZAorICogQHRyYW5zZmVyX2FjdGl2ZToJCUZsYWcgc2hvd2luZyBhY3RpdmUgdHJhbnNmZXIKKyAqIEB0eF9pbmRleDoJCQlUcmFuc21pdCBkYXRhIGNvdW50OyBmb3IgYm9va2tlZXBpbmcgZHVyaW5nCisgKgkJCQl0cmFuc2ZlcgorICogQHJ4X2luZGV4OgkJCVJlY2VpdmUgZGF0YSBjb3VudDsgZm9yIGJvb2trZWVwaW5nIGR1cmluZworICoJCQkJdHJhbnNmZXIKKyAqIEB0eF9idWZmOgkJCUJ1ZmZlciBmb3IgZGF0YSB0byBiZSB0cmFuc21pdHRlZAorICogQHJ4X2luZGV4OgkJCUJ1ZmZlciBmb3IgUmVjZWl2ZWQgZGF0YQorICogQG5fY3VybnRfY2hpcDoJCVRoZSBjaGlwIG51bWJlciB0aGF0IHRoaXMgU1BJIGRyaXZlciBjdXJyZW50bHkKKyAqCQkJCW9wZXJhdGVzIG9uCisgKiBAY3VycmVudF9jaGlwOgkJUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGNoaXAgdGhhdCB0aGlzIFNQSQorICoJCQkJZHJpdmVyIGN1cnJlbnRseSBvcGVyYXRlcyBvbgorICogQGN1cnJlbnRfbXNnOgkJVGhlIGN1cnJlbnQgbWVzc2FnZSB0aGF0IHRoaXMgU1BJIGRyaXZlciBpcworICoJCQkJaGFuZGxpbmcKKyAqIEBjdXJfdHJhbnM6CQkJVGhlIGN1cnJlbnQgdHJhbnNmZXIgdGhhdCB0aGlzIFNQSSBkcml2ZXIgaXMKKyAqCQkJCWhhbmRsaW5nCisgKiBAYm9hcmRfZGF0OgkJCVJlZmVyZW5jZSB0byB0aGUgU1BJIGRldmljZSBkYXRhIHN0cnVjdHVyZQorICogQHBsYXRfZGV2OgkJCXBsYXRmb3JtX2RldmljZSBzdHJ1Y3R1cmUKKyAqIEBjaDoJCQkJU1BJIGNoYW5uZWwgbnVtYmVyCisgKiBAaXJxX3JlZ19zdHM6CQlTdGF0dXMgb2YgSVJRIHJlZ2lzdHJhdGlvbgorICovCitzdHJ1Y3QgcGNoX3NwaV9kYXRhIHsKKwl2b2lkIF9faW9tZW0gKmlvX3JlbWFwX2FkZHI7CisJdW5zaWduZWQgbG9uZyBpb19iYXNlX2FkZHI7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd2s7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwl1OCB0cmFuc2Zlcl9jb21wbGV0ZTsKKwl1OCBiY3VycmVudF9tc2dfcHJvY2Vzc2luZzsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwl1OCBzdGF0dXM7CisJdTMyIGJwd19sZW47CisJdTggdHJhbnNmZXJfYWN0aXZlOworCXUzMiB0eF9pbmRleDsKKwl1MzIgcnhfaW5kZXg7CisJdTE2ICpwa3RfdHhfYnVmZjsKKwl1MTYgKnBrdF9yeF9idWZmOworCXU4IG5fY3VybnRfY2hpcDsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqY3VycmVudF9jaGlwOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqY3VycmVudF9tc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqY3VyX3RyYW5zOworCXN0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgKmJvYXJkX2RhdDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwbGF0X2RldjsKKwlpbnQgY2g7CisJc3RydWN0IHBjaF9zcGlfZG1hX2N0cmwgZG1hOworCWludCB1c2VfZG1hOworCXU4IGlycV9yZWdfc3RzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgcGNoX3NwaV9ib2FyZF9kYXRhIC0gSG9sZHMgdGhlIFNQSSBkZXZpY2Ugc3BlY2lmaWMgZGV0YWlscworICogQHBkZXY6CQlQb2ludGVyIHRvIHRoZSBQQ0kgZGV2aWNlCisgKiBAc3VzcGVuZF9zdHM6CVN0YXR1cyBvZiBzdXNwZW5kCisgKiBAbnVtOgkJVGhlIG51bWJlciBvZiBTUEkgZGV2aWNlIGluc3RhbmNlCisgKi8KK3N0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXU4IHN1c3BlbmRfc3RzOworCWludCBudW07Cit9OworCitzdHJ1Y3QgcGNoX3BkX2Rldl9zYXZlIHsKKwlpbnQgbnVtOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkX3NhdmVbUENIX1NQSV9NQVhfREVWXTsKKwlzdHJ1Y3QgcGNoX3NwaV9ib2FyZF9kYXRhICpib2FyZF9kYXQ7Cit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNoX3NwaV9wY2lkZXZfaWRbXSA9IHsKKwl7IFBDSV9WREVWSUNFKElOVEVMLCBQQ0lfREVWSUNFX0lEX0dFX1NQSSksICAgIDEsIH0sCisJeyBQQ0lfVkRFVklDRShST0hNLCBQQ0lfREVWSUNFX0lEX01MNzIxM19TUEkpLCAyLCB9LAorCXsgUENJX1ZERVZJQ0UoUk9ITSwgUENJX0RFVklDRV9JRF9NTDcyMjNfU1BJKSwgMSwgfSwKKwl7IH0KK307CisKKy8qKgorICogcGNoX3NwaV93cml0ZXJlZygpIC0gUGVyZm9ybXMgIHJlZ2lzdGVyIHdyaXRlcworICogQG1hc3RlcjoJUG9pbnRlciB0byBzdHJ1Y3Qgc3BpX21hc3Rlci4KKyAqIEBpZHg6CVJlZ2lzdGVyIG9mZnNldC4KKyAqIEB2YWw6CVZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2hfc3BpX3dyaXRlcmVnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIGludCBpZHgsIHUzMiB2YWwpCit7CisJc3RydWN0IHBjaF9zcGlfZGF0YSAqZGF0YSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpb3dyaXRlMzIodmFsLCAoZGF0YS0+aW9fcmVtYXBfYWRkciArIGlkeCkpOworfQorCisvKioKKyAqIHBjaF9zcGlfcmVhZHJlZygpIC0gUGVyZm9ybXMgcmVnaXN0ZXIgcmVhZHMKKyAqIEBtYXN0ZXI6CVBvaW50ZXIgdG8gc3RydWN0IHNwaV9tYXN0ZXIuCisgKiBAaWR4OglSZWdpc3RlciBvZmZzZXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHBjaF9zcGlfcmVhZHJlZyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBpbnQgaWR4KQoreworCXN0cnVjdCBwY2hfc3BpX2RhdGEgKmRhdGEgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJcmV0dXJuIGlvcmVhZDMyKGRhdGEtPmlvX3JlbWFwX2FkZHIgKyBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNoX3NwaV9zZXRjbHJfcmVnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIGludCBpZHgsCisJCQkJICAgICAgdTMyIHNldCwgdTMyIGNscikKK3sKKwl1MzIgdG1wID0gcGNoX3NwaV9yZWFkcmVnKG1hc3RlciwgaWR4KTsKKwl0bXAgPSAodG1wICYgfmNscikgfCBzZXQ7CisJcGNoX3NwaV93cml0ZXJlZyhtYXN0ZXIsIGlkeCwgdG1wKTsKK30KKworc3RhdGljIHZvaWQgcGNoX3NwaV9zZXRfbWFzdGVyX21vZGUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlwY2hfc3BpX3NldGNscl9yZWcobWFzdGVyLCBQQ0hfU1BDUiwgU1BDUl9NU1RSX0JJVCwgMCk7Cit9CisKKy8qKgorICogcGNoX3NwaV9jbGVhcl9maWZvKCkgLSBDbGVhcnMgdGhlIFRyYW5zbWl0IGFuZCBSZWNlaXZlIEZJRk9zCisgKiBAbWFzdGVyOglQb2ludGVyIHRvIHN0cnVjdCBzcGlfbWFzdGVyLgorICovCitzdGF0aWMgdm9pZCBwY2hfc3BpX2NsZWFyX2ZpZm8oc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlwY2hfc3BpX3NldGNscl9yZWcobWFzdGVyLCBQQ0hfU1BDUiwgU1BDUl9GSUNMUl9CSVQsIDApOworCXBjaF9zcGlfc2V0Y2xyX3JlZyhtYXN0ZXIsIFBDSF9TUENSLCAwLCBTUENSX0ZJQ0xSX0JJVCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaF9zcGlfaGFuZGxlcl9zdWIoc3RydWN0IHBjaF9zcGlfZGF0YSAqZGF0YSwgdTMyIHJlZ19zcHNyX3ZhbCwKKwkJCQl2b2lkIF9faW9tZW0gKmlvX3JlbWFwX2FkZHIpCit7CisJdTMyIG5fcmVhZCwgdHhfaW5kZXgsIHJ4X2luZGV4LCBicHdfbGVuOworCXUxNiAqcGt0X3J4X2J1ZmZlciwgKnBrdF90eF9idWZmOworCWludCByZWFkX2NudDsKKwl1MzIgcmVnX3NwY3JfdmFsOworCXZvaWQgX19pb21lbSAqc3BzcjsKKwl2b2lkIF9faW9tZW0gKnNwZHJyOworCXZvaWQgX19pb21lbSAqc3Bkd3I7CisKKwlzcHNyID0gaW9fcmVtYXBfYWRkciArIFBDSF9TUFNSOworCWlvd3JpdGUzMihyZWdfc3Bzcl92YWwsIHNwc3IpOworCisJaWYgKGRhdGEtPnRyYW5zZmVyX2FjdGl2ZSkgeworCQlyeF9pbmRleCA9IGRhdGEtPnJ4X2luZGV4OworCQl0eF9pbmRleCA9IGRhdGEtPnR4X2luZGV4OworCQlicHdfbGVuID0gZGF0YS0+YnB3X2xlbjsKKwkJcGt0X3J4X2J1ZmZlciA9IGRhdGEtPnBrdF9yeF9idWZmOworCQlwa3RfdHhfYnVmZiA9IGRhdGEtPnBrdF90eF9idWZmOworCisJCXNwZHJyID0gaW9fcmVtYXBfYWRkciArIFBDSF9TUERSUjsKKwkJc3Bkd3IgPSBpb19yZW1hcF9hZGRyICsgUENIX1NQRFdSOworCisJCW5fcmVhZCA9IFBDSF9SRUFEQUJMRShyZWdfc3Bzcl92YWwpOworCisJCWZvciAocmVhZF9jbnQgPSAwOyAocmVhZF9jbnQgPCBuX3JlYWQpOyByZWFkX2NudCsrKSB7CisJCQlwa3RfcnhfYnVmZmVyW3J4X2luZGV4KytdID0gaW9yZWFkMzIoc3BkcnIpOworCQkJaWYgKHR4X2luZGV4IDwgYnB3X2xlbikKKwkJCQlpb3dyaXRlMzIocGt0X3R4X2J1ZmZbdHhfaW5kZXgrK10sIHNwZHdyKTsKKwkJfQorCisJCS8qIGRpc2FibGUgUkZJIGlmIG5vdCBuZWVkZWQgKi8KKwkJaWYgKChicHdfbGVuIC0gcnhfaW5kZXgpIDw9IFBDSF9NQVhfRklGT19ERVBUSCkgeworCQkJcmVnX3NwY3JfdmFsID0gaW9yZWFkMzIoaW9fcmVtYXBfYWRkciArIFBDSF9TUENSKTsKKwkJCXJlZ19zcGNyX3ZhbCAmPSB+U1BDUl9SRklFX0JJVDsgLyogZGlzYWJsZSBSRkkgKi8KKworCQkJLyogcmVzZXQgcnggdGhyZXNob2xkICovCisJCQlyZWdfc3Bjcl92YWwgJj0gfk1BU0tfUkZJQ19TUENSX0JJVFM7CisJCQlyZWdfc3Bjcl92YWwgfD0gKFBDSF9SWF9USE9MRF9NQVggPDwgU1BDUl9SRklDX0ZJRUxEKTsKKworCQkJaW93cml0ZTMyKHJlZ19zcGNyX3ZhbCwgKGlvX3JlbWFwX2FkZHIgKyBQQ0hfU1BDUikpOworCQl9CisKKwkJLyogdXBkYXRlIGNvdW50cyAqLworCQlkYXRhLT50eF9pbmRleCA9IHR4X2luZGV4OworCQlkYXRhLT5yeF9pbmRleCA9IHJ4X2luZGV4OworCisJfQorCisJLyogaWYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0ICovCisJaWYgKHJlZ19zcHNyX3ZhbCAmIFNQU1JfRklfQklUKSB7CisJCWlmICh0eF9pbmRleCA8IGJwd19sZW4pCisJCQlkZXZfZXJyKCZkYXRhLT5tYXN0ZXItPmRldiwKKwkJCQkiJXMgOiBUcmFuc2ZlciBpcyBub3QgY29tcGxldGVkIiwgX19mdW5jX18pOworCQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJcGNoX3NwaV9zZXRjbHJfcmVnKGRhdGEtPm1hc3RlciwgUENIX1NQQ1IsIDAsIFBDSF9BTEwpOworCisJCS8qIHRyYW5zZmVyIGlzIGNvbXBsZXRlZDtpbmZvcm0gcGNoX3NwaV9wcm9jZXNzX21lc3NhZ2VzICovCisJCWRhdGEtPnRyYW5zZmVyX2NvbXBsZXRlID0gdHJ1ZTsKKwkJZGF0YS0+dHJhbnNmZXJfYWN0aXZlID0gZmFsc2U7CisJCXdha2VfdXAoJmRhdGEtPndhaXQpOworCX0KK30KKworLyoqCisgKiBwY2hfc3BpX2hhbmRsZXIoKSAtIEludGVycnVwdCBoYW5kbGVyCisgKiBAaXJxOglUaGUgaW50ZXJydXB0IG51bWJlci4KKyAqIEBkZXZfaWQ6CVBvaW50ZXIgdG8gc3RydWN0IHBjaF9zcGlfYm9hcmRfZGF0YS4KKyAqLworc3RhdGljIGlycXJldHVybl90IHBjaF9zcGlfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTMyIHJlZ19zcHNyX3ZhbDsKKwl2b2lkIF9faW9tZW0gKnNwc3I7CisJdm9pZCBfX2lvbWVtICppb19yZW1hcF9hZGRyOworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCXN0cnVjdCBwY2hfc3BpX2RhdGEgKmRhdGEgPSBkZXZfaWQ7CisJc3RydWN0IHBjaF9zcGlfYm9hcmRfZGF0YSAqYm9hcmRfZGF0ID0gZGF0YS0+Ym9hcmRfZGF0OworCisJaWYgKGJvYXJkX2RhdC0+c3VzcGVuZF9zdHMpIHsKKwkJZGV2X2RiZygmYm9hcmRfZGF0LT5wZGV2LT5kZXYsCisJCQkiJXMgcmV0dXJuaW5nIGR1ZSB0byBzdXNwZW5kXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJaWYgKGRhdGEtPnVzZV9kbWEpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlvX3JlbWFwX2FkZHIgPSBkYXRhLT5pb19yZW1hcF9hZGRyOworCXNwc3IgPSBpb19yZW1hcF9hZGRyICsgUENIX1NQU1I7CisKKwlyZWdfc3Bzcl92YWwgPSBpb3JlYWQzMihzcHNyKTsKKworCWlmIChyZWdfc3Bzcl92YWwgJiBTUFNSX09SRl9CSVQpCisJCWRldl9lcnIoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LCAiJXMgT3ZlciBydW4gZXJyb3IiLCBfX2Z1bmNfXyk7CisKKwkvKiBDaGVjayBpZiB0aGUgaW50ZXJydXB0IGlzIGZvciBTUEkgZGV2aWNlICovCisJaWYgKHJlZ19zcHNyX3ZhbCAmIChTUFNSX0ZJX0JJVCB8IFNQU1JfUkZJX0JJVCkpIHsKKwkJcGNoX3NwaV9oYW5kbGVyX3N1YihkYXRhLCByZWdfc3Bzcl92YWwsIGlvX3JlbWFwX2FkZHIpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlkZXZfZGJnKCZib2FyZF9kYXQtPnBkZXYtPmRldiwgIiVzIEVYSVQgcmV0dXJuIHZhbHVlPSVkXG4iLAorCQlfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcGNoX3NwaV9zZXRfYmF1ZF9yYXRlKCkgLSBTZXRzIFNQQlIgZmllbGQgaW4gU1BCUlIKKyAqIEBtYXN0ZXI6CVBvaW50ZXIgdG8gc3RydWN0IHNwaV9tYXN0ZXIuCisgKiBAc3BlZWRfaHo6CUJhdWQgcmF0ZS4KKyAqLworc3RhdGljIHZvaWQgcGNoX3NwaV9zZXRfYmF1ZF9yYXRlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHUzMiBzcGVlZF9oeikKK3sKKwl1MzIgbl9zcGJyID0gUENIX0NMT0NLX0haIC8gKHNwZWVkX2h6ICogMik7CisKKwkvKiBpZiBiYXVkIHJhdGUgaXMgbGVzcyB0aGFuIHdlIGNhbiBzdXBwb3J0IGxpbWl0IGl0ICovCisJaWYgKG5fc3BiciA+IFBDSF9NQVhfU1BCUikKKwkJbl9zcGJyID0gUENIX01BWF9TUEJSOworCisJcGNoX3NwaV9zZXRjbHJfcmVnKG1hc3RlciwgUENIX1NQQlJSLCBuX3NwYnIsIE1BU0tfU1BCUlJfU1BCUl9CSVRTKTsKK30KKworLyoqCisgKiBwY2hfc3BpX3NldF9iaXRzX3Blcl93b3JkKCkgLSBTZXRzIFNJWkUgZmllbGQgaW4gU1BCUlIKKyAqIEBtYXN0ZXI6CQlQb2ludGVyIHRvIHN0cnVjdCBzcGlfbWFzdGVyLgorICogQGJpdHNfcGVyX3dvcmQ6CUJpdHMgcGVyIHdvcmQgZm9yIFNQSSB0cmFuc2Zlci4KKyAqLworc3RhdGljIHZvaWQgcGNoX3NwaV9zZXRfYml0c19wZXJfd29yZChzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSAgICAgIHU4IGJpdHNfcGVyX3dvcmQpCit7CisJaWYgKGJpdHNfcGVyX3dvcmQgPT0gOCkKKwkJcGNoX3NwaV9zZXRjbHJfcmVnKG1hc3RlciwgUENIX1NQQlJSLCAwLCBTUEJSUl9TSVpFX0JJVCk7CisJZWxzZQorCQlwY2hfc3BpX3NldGNscl9yZWcobWFzdGVyLCBQQ0hfU1BCUlIsIFNQQlJSX1NJWkVfQklULCAwKTsKK30KKworLyoqCisgKiBwY2hfc3BpX3NldHVwX3RyYW5zZmVyKCkgLSBDb25maWd1cmVzIHRoZSBQQ0ggU1BJIGhhcmR3YXJlIGZvciB0cmFuc2ZlcgorICogQHNwaToJUG9pbnRlciB0byBzdHJ1Y3Qgc3BpX2RldmljZS4KKyAqLworc3RhdGljIHZvaWQgcGNoX3NwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXUzMiBmbGFncyA9IDA7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgIiVzIFNQQlJSIGNvbnRlbnQgPSV4IHNldHRpbmcgYmF1ZCByYXRlPSVkXG4iLAorCQlfX2Z1bmNfXywgcGNoX3NwaV9yZWFkcmVnKHNwaS0+bWFzdGVyLCBQQ0hfU1BCUlIpLAorCQlzcGktPm1heF9zcGVlZF9oeik7CisJcGNoX3NwaV9zZXRfYmF1ZF9yYXRlKHNwaS0+bWFzdGVyLCBzcGktPm1heF9zcGVlZF9oeik7CisKKwkvKiBzZXQgYml0cyBwZXIgd29yZCAqLworCXBjaF9zcGlfc2V0X2JpdHNfcGVyX3dvcmQoc3BpLT5tYXN0ZXIsIHNwaS0+Yml0c19wZXJfd29yZCk7CisKKwlpZiAoIShzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSkKKwkJZmxhZ3MgfD0gU1BDUl9MU0JGX0JJVDsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCWZsYWdzIHw9IFNQQ1JfQ1BPTF9CSVQ7CisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQlmbGFncyB8PSBTUENSX0NQSEFfQklUOworCXBjaF9zcGlfc2V0Y2xyX3JlZyhzcGktPm1hc3RlciwgUENIX1NQQ1IsIGZsYWdzLAorCQkJICAgKFNQQ1JfTFNCRl9CSVQgfCBTUENSX0NQT0xfQklUIHwgU1BDUl9DUEhBX0JJVCkpOworCisJLyogQ2xlYXIgdGhlIEZJRk8gYnkgdG9nZ2xpbmcgIEZJQ0xSIHRvIDEgYW5kIGJhY2sgdG8gMCAqLworCXBjaF9zcGlfY2xlYXJfZmlmbyhzcGktPm1hc3Rlcik7Cit9CisKKy8qKgorICogcGNoX3NwaV9yZXNldCgpIC0gQ2xlYXJzIFNQSSByZWdpc3RlcnMKKyAqIEBtYXN0ZXI6CVBvaW50ZXIgdG8gc3RydWN0IHNwaV9tYXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHBjaF9zcGlfcmVzZXQoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwkvKiB3cml0ZSAxIHRvIHJlc2V0IFNQSSAqLworCXBjaF9zcGlfd3JpdGVyZWcobWFzdGVyLCBQQ0hfU1JTVCwgMHgxKTsKKworCS8qIGNsZWFyIHJlc2V0ICovCisJcGNoX3NwaV93cml0ZXJlZyhtYXN0ZXIsIFBDSF9TUlNULCAweDApOworfQorCitzdGF0aWMgaW50IHBjaF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnBzcGkpCit7CisJLyogY2hlY2sgYml0cyBwZXIgd29yZCAqLworCWlmIChwc3BpLT5iaXRzX3Blcl93b3JkID09IDApIHsKKwkJcHNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisJCWRldl9kYmcoJnBzcGktPmRldiwgIiVzIDggYml0cyBwZXIgd29yZFxuIiwgX19mdW5jX18pOworCX0KKworCWlmICgocHNwaS0+Yml0c19wZXJfd29yZCAhPSA4KSAmJiAocHNwaS0+Yml0c19wZXJfd29yZCAhPSAxNikpIHsKKwkJZGV2X2VycigmcHNwaS0+ZGV2LCAiJXMgSW52YWxpZCBiaXRzIHBlciB3b3JkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIGJhdWQgcmF0ZSBzZXR0aW5nICovCisJLyogaWYgYmF1ZCByYXRlIG9mIGNoaXAgaXMgZ3JlYXRlciB0aGFuCisJICAgbWF4IHdlIGNhbiBzdXBwb3J0LHJldHVybiBlcnJvciAqLworCWlmICgocHNwaS0+bWF4X3NwZWVkX2h6KSA+IFBDSF9NQVhfQkFVRFJBVEUpCisJCXBzcGktPm1heF9zcGVlZF9oeiA9IFBDSF9NQVhfQkFVRFJBVEU7CisKKwlkZXZfZGJnKCZwc3BpLT5kZXYsICIlcyBNT0RFID0gJXhcbiIsIF9fZnVuY19fLAorCQkocHNwaS0+bW9kZSkgJiAoU1BJX0NQT0wgfCBTUElfQ1BIQSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNoX3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqcHNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICpwbXNnKQoreworCisJc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnNmZXI7CisJc3RydWN0IHBjaF9zcGlfZGF0YSAqZGF0YSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEocHNwaS0+bWFzdGVyKTsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiB2YWxpZGF0ZSBzcGkgbWVzc2FnZSBhbmQgYmF1ZCByYXRlICovCisJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJnBtc2ctPnRyYW5zZmVycykgPT0gMSkpIHsKKwkJZGV2X2VycigmcHNwaS0+ZGV2LCAiJXMgbGlzdCBlbXB0eVxuIiwgX19mdW5jX18pOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKHVubGlrZWx5KHBzcGktPm1heF9zcGVlZF9oeiA9PSAwKSkgeworCQlkZXZfZXJyKCZwc3BpLT5kZXYsICIlcyBwY2hfc3BpX3RyYW5mZXIgbWF4c3BlZWQ9JWRcbiIsCisJCQlfX2Z1bmNfXywgcHNwaS0+bWF4X3NwZWVkX2h6KTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWRldl9kYmcoJnBzcGktPmRldiwgIiVzIFRyYW5zZmVyIExpc3Qgbm90IGVtcHR5LiAiCisJCSJUcmFuc2ZlciBTcGVlZCBpcyBzZXQuXG4iLCBfX2Z1bmNfXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+bG9jaywgZmxhZ3MpOworCS8qIHZhbGlkYXRlIFR4L1J4IGJ1ZmZlcnMgYW5kIFRyYW5zZmVyIGxlbmd0aCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnNmZXIsICZwbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJaWYgKCF0cmFuc2Zlci0+dHhfYnVmICYmICF0cmFuc2Zlci0+cnhfYnVmKSB7CisJCQlkZXZfZXJyKCZwc3BpLT5kZXYsCisJCQkJIiVzIFR4IGFuZCBSeCBidWZmZXIgTlVMTFxuIiwgX19mdW5jX18pOworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX3JldHVybl9zcGlubG9jazsKKwkJfQorCisJCWlmICghdHJhbnNmZXItPmxlbikgeworCQkJZGV2X2VycigmcHNwaS0+ZGV2LCAiJXMgVHJhbnNmZXIgbGVuZ3RoIGludmFsaWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX3JldHVybl9zcGlubG9jazsKKwkJfQorCisJCWRldl9kYmcoJnBzcGktPmRldiwgIiVzIFR4L1J4IGJ1ZmZlciB2YWxpZC4gVHJhbnNmZXIgbGVuZ3RoIgorCQkJIiB2YWxpZFxuIiwgX19mdW5jX18pOworCisJCS8qIGlmIGJhdWQgcmF0ZSBoYXMgYmVlbiBzcGVjaWZpZWQgdmFsaWRhdGUgdGhlIHNhbWUgKi8KKwkJaWYgKHRyYW5zZmVyLT5zcGVlZF9oeiA+IFBDSF9NQVhfQkFVRFJBVEUpCisJCQl0cmFuc2Zlci0+c3BlZWRfaHogPSBQQ0hfTUFYX0JBVURSQVRFOworCisJCS8qIGlmIGJpdHMgcGVyIHdvcmQgaGFzIGJlZW4gc3BlY2lmaWVkIHZhbGlkYXRlIHRoZSBzYW1lICovCisJCWlmICh0cmFuc2Zlci0+Yml0c19wZXJfd29yZCkgeworCQkJaWYgKCh0cmFuc2Zlci0+Yml0c19wZXJfd29yZCAhPSA4KQorCQkJICAgICYmICh0cmFuc2Zlci0+Yml0c19wZXJfd29yZCAhPSAxNikpIHsKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJCWRldl9lcnIoJnBzcGktPmRldiwKKwkJCQkJIiVzIEludmFsaWQgYml0cyBwZXIgd29yZFxuIiwgX19mdW5jX18pOworCQkJCWdvdG8gZXJyX3JldHVybl9zcGlubG9jazsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5sb2NrLCBmbGFncyk7CisKKwkvKiBXZSB3b24ndCBwcm9jZXNzIGFueSBtZXNzYWdlcyBpZiB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8gdGVybWluYXRlICovCisJaWYgKGRhdGEtPnN0YXR1cyA9PSBTVEFUVVNfRVhJVElORykgeworCQlkZXZfZXJyKCZwc3BpLT5kZXYsICIlcyBzdGF0dXMgPSBTVEFUVVNfRVhJVElORy5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dmFsID0gLUVTSFVURE9XTjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIElmIHN1c3BlbmRlZCAscmV0dXJuIC1FSU5WQUwgKi8KKwlpZiAoZGF0YS0+Ym9hcmRfZGF0LT5zdXNwZW5kX3N0cykgeworCQlkZXZfZXJyKCZwc3BpLT5kZXYsICIlcyBzdXNwZW5kOyByZXR1cm5pbmcgRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBzZXQgc3RhdHVzIG9mIG1lc3NhZ2UgKi8KKwlwbXNnLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwlkZXZfZGJnKCZwc3BpLT5kZXYsICIlcyAtIHBtc2ctPnN0YXR1cyA9JWRcbiIsIF9fZnVuY19fLCBwbXNnLT5zdGF0dXMpOworCisJcG1zZy0+c3RhdHVzID0gLUVJTlBST0dSRVNTOworCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhLT5sb2NrLCBmbGFncyk7CisJLyogYWRkIG1lc3NhZ2UgdG8gcXVldWUgKi8KKwlsaXN0X2FkZF90YWlsKCZwbXNnLT5xdWV1ZSwgJmRhdGEtPnF1ZXVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKCZwc3BpLT5kZXYsICIlcyAtIEludm9rZWQgbGlzdF9hZGRfdGFpbFxuIiwgX19mdW5jX18pOworCisJLyogc2NoZWR1bGUgd29yayBxdWV1ZSB0byBydW4gKi8KKwlxdWV1ZV93b3JrKGRhdGEtPndrLCAmZGF0YS0+d29yayk7CisJZGV2X2RiZygmcHNwaS0+ZGV2LCAiJXMgLSBJbnZva2VkIHF1ZXVlIHdvcmtcbiIsIF9fZnVuY19fKTsKKworCXJldHZhbCA9IDA7CisKK2Vycl9vdXQ6CisJZGV2X2RiZygmcHNwaS0+ZGV2LCAiJXMgUkVUVVJOPSVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworZXJyX3JldHVybl9zcGlubG9jazoKKwlkZXZfZGJnKCZwc3BpLT5kZXYsICIlcyBSRVRVUk49JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNoX3NwaV9zZWxlY3RfY2hpcChzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhLAorCQkJCSAgICAgICBzdHJ1Y3Qgc3BpX2RldmljZSAqcHNwaSkKK3sKKwlpZiAoZGF0YS0+Y3VycmVudF9jaGlwICE9IE5VTEwpIHsKKwkJaWYgKHBzcGktPmNoaXBfc2VsZWN0ICE9IGRhdGEtPm5fY3VybnRfY2hpcCkgeworCQkJZGV2X2RiZygmcHNwaS0+ZGV2LCAiJXMgOiBkaWZmZXJlbnQgc2xhdmVcbiIsIF9fZnVuY19fKTsKKwkJCWRhdGEtPmN1cnJlbnRfY2hpcCA9IE5VTEw7CisJCX0KKwl9CisKKwlkYXRhLT5jdXJyZW50X2NoaXAgPSBwc3BpOworCisJZGF0YS0+bl9jdXJudF9jaGlwID0gZGF0YS0+Y3VycmVudF9jaGlwLT5jaGlwX3NlbGVjdDsKKworCWRldl9kYmcoJnBzcGktPmRldiwgIiVzIDpJbnZva2luZyBwY2hfc3BpX3NldHVwX3RyYW5zZmVyXG4iLCBfX2Z1bmNfXyk7CisJcGNoX3NwaV9zZXR1cF90cmFuc2Zlcihwc3BpKTsKK30KKworc3RhdGljIHZvaWQgcGNoX3NwaV9zZXRfdHgoc3RydWN0IHBjaF9zcGlfZGF0YSAqZGF0YSwgaW50ICpicHcpCit7CisJaW50IHNpemU7CisJdTMyIG5fd3JpdGVzOworCWludCBqOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqcG1zZzsKKwljb25zdCB1OCAqdHhfYnVmOworCWNvbnN0IHUxNiAqdHhfc2J1ZjsKKworCS8qIHNldCBiYXVkIHJhdGUgaWYgbmVlZGVkICovCisJaWYgKGRhdGEtPmN1cl90cmFucy0+c3BlZWRfaHopIHsKKwkJZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsICIlczpzZXR0aW5nIGJhdWQgcmF0ZVxuIiwgX19mdW5jX18pOworCQlwY2hfc3BpX3NldF9iYXVkX3JhdGUoZGF0YS0+bWFzdGVyLCBkYXRhLT5jdXJfdHJhbnMtPnNwZWVkX2h6KTsKKwl9CisKKwkvKiBzZXQgYml0cyBwZXIgd29yZCBpZiBuZWVkZWQgKi8KKwlpZiAoZGF0YS0+Y3VyX3RyYW5zLT5iaXRzX3Blcl93b3JkICYmCisJICAgIChkYXRhLT5jdXJyZW50X21zZy0+c3BpLT5iaXRzX3Blcl93b3JkICE9IGRhdGEtPmN1cl90cmFucy0+Yml0c19wZXJfd29yZCkpIHsKKwkJZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsICIlczpzZXQgYml0cyBwZXIgd29yZFxuIiwgX19mdW5jX18pOworCQlwY2hfc3BpX3NldF9iaXRzX3Blcl93b3JkKGRhdGEtPm1hc3RlciwKKwkJCQkJICBkYXRhLT5jdXJfdHJhbnMtPmJpdHNfcGVyX3dvcmQpOworCQkqYnB3ID0gZGF0YS0+Y3VyX3RyYW5zLT5iaXRzX3Blcl93b3JkOworCX0gZWxzZSB7CisJCSpicHcgPSBkYXRhLT5jdXJyZW50X21zZy0+c3BpLT5iaXRzX3Blcl93b3JkOworCX0KKworCS8qIHJlc2V0IFR4L1J4IGluZGV4ICovCisJZGF0YS0+dHhfaW5kZXggPSAwOworCWRhdGEtPnJ4X2luZGV4ID0gMDsKKworCWRhdGEtPmJwd19sZW4gPSBkYXRhLT5jdXJfdHJhbnMtPmxlbiAvICgqYnB3IC8gOCk7CisKKwkvKiBmaW5kIGFsbG9jIHNpemUgKi8KKwlzaXplID0gZGF0YS0+Y3VyX3RyYW5zLT5sZW4gKiBzaXplb2YoKmRhdGEtPnBrdF90eF9idWZmKTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgcGt0X3R4X2J1ZmYgJiBwa3RfcnhfYnVmZmVyICovCisJZGF0YS0+cGt0X3R4X2J1ZmYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChkYXRhLT5wa3RfdHhfYnVmZiAhPSBOVUxMKSB7CisJCWRhdGEtPnBrdF9yeF9idWZmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkYXRhLT5wa3RfcnhfYnVmZikKKwkJCWtmcmVlKGRhdGEtPnBrdF90eF9idWZmKTsKKwl9CisKKwlpZiAoIWRhdGEtPnBrdF9yeF9idWZmKSB7CisJCS8qIGZsdXNoIHF1ZXVlIGFuZCBzZXQgc3RhdHVzIG9mIGFsbCB0cmFuc2ZlcnMgdG8gLUVOT01FTSAqLworCQlkZXZfZXJyKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzIDpremFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBtc2csIGRhdGEtPnF1ZXVlLm5leHQsIHF1ZXVlKSB7CisJCQlwbXNnLT5zdGF0dXMgPSAtRU5PTUVNOworCisJCQlpZiAocG1zZy0+Y29tcGxldGUgIT0gMCkKKwkJCQlwbXNnLT5jb21wbGV0ZShwbXNnLT5jb250ZXh0KTsKKworCQkJLyogZGVsZXRlIGZyb20gcXVldWUgKi8KKwkJCWxpc3RfZGVsX2luaXQoJnBtc2ctPnF1ZXVlKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogY29weSBUeCBEYXRhICovCisJaWYgKGRhdGEtPmN1cl90cmFucy0+dHhfYnVmICE9IE5VTEwpIHsKKwkJaWYgKCpicHcgPT0gOCkgeworCQkJdHhfYnVmID0gZGF0YS0+Y3VyX3RyYW5zLT50eF9idWY7CisJCQlmb3IgKGogPSAwOyBqIDwgZGF0YS0+YnB3X2xlbjsgaisrKQorCQkJCWRhdGEtPnBrdF90eF9idWZmW2pdID0gKnR4X2J1ZisrOworCQl9IGVsc2UgeworCQkJdHhfc2J1ZiA9IGRhdGEtPmN1cl90cmFucy0+dHhfYnVmOworCQkJZm9yIChqID0gMDsgaiA8IGRhdGEtPmJwd19sZW47IGorKykKKwkJCQlkYXRhLT5wa3RfdHhfYnVmZltqXSA9ICp0eF9zYnVmKys7CisJCX0KKwl9CisKKwkvKiBpZiBsZW4gZ3JlYXRlciB0aGFuIFBDSF9NQVhfRklGT19ERVBUSCwgd3JpdGUgMTYsZWxzZSBsZW4gYnl0ZXMgKi8KKwluX3dyaXRlcyA9IGRhdGEtPmJwd19sZW47CisJaWYgKG5fd3JpdGVzID4gUENIX01BWF9GSUZPX0RFUFRIKQorCQluX3dyaXRlcyA9IFBDSF9NQVhfRklGT19ERVBUSDsKKworCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LCAiXG4lczpQdWxsaW5nIGRvd24gU1NOIGxvdyAtIHdyaXRpbmcgIgorCQkiMHgyIHRvIFNTTlhDUlxuIiwgX19mdW5jX18pOworCXBjaF9zcGlfd3JpdGVyZWcoZGF0YS0+bWFzdGVyLCBQQ0hfU1NOWENSLCBTU05fTE9XKTsKKworCWZvciAoaiA9IDA7IGogPCBuX3dyaXRlczsgaisrKQorCQlwY2hfc3BpX3dyaXRlcmVnKGRhdGEtPm1hc3RlciwgUENIX1NQRFdSLCBkYXRhLT5wa3RfdHhfYnVmZltqXSk7CisKKwkvKiB1cGRhdGUgdHhfaW5kZXggKi8KKwlkYXRhLT50eF9pbmRleCA9IGo7CisKKwkvKiByZXNldCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisJZGF0YS0+dHJhbnNmZXJfY29tcGxldGUgPSBmYWxzZTsKKwlkYXRhLT50cmFuc2Zlcl9hY3RpdmUgPSB0cnVlOworfQorCitzdGF0aWMgdm9pZCBwY2hfc3BpX25vbW9yZV90cmFuc2ZlcihzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSAqcG1zZzsKKwlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOworCS8qIEludm9rZSBjb21wbGV0ZSBjYWxsYmFjaworCSAqIFtUbyB0aGUgc3BpIGNvcmUuLmluZGljYXRpbmcgZW5kIG9mIHRyYW5zZmVyXSAqLworCWRhdGEtPmN1cnJlbnRfbXNnLT5zdGF0dXMgPSAwOworCisJaWYgKGRhdGEtPmN1cnJlbnRfbXNnLT5jb21wbGV0ZSAhPSAwKSB7CisJCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LAorCQkJIiVzOkludm9raW5nIGNhbGxiYWNrIG9mIFNQSSBjb3JlXG4iLCBfX2Z1bmNfXyk7CisJCWRhdGEtPmN1cnJlbnRfbXNnLT5jb21wbGV0ZShkYXRhLT5jdXJyZW50X21zZy0+Y29udGV4dCk7CisJfQorCisJLyogdXBkYXRlIHN0YXR1cyBpbiBnbG9iYWwgdmFyaWFibGUgKi8KKwlkYXRhLT5iY3VycmVudF9tc2dfcHJvY2Vzc2luZyA9IGZhbHNlOworCisJZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsCisJCSIlczpkYXRhLT5iY3VycmVudF9tc2dfcHJvY2Vzc2luZyA9IGZhbHNlXG4iLCBfX2Z1bmNfXyk7CisKKwlkYXRhLT5jdXJyZW50X21zZyA9IE5VTEw7CisJZGF0YS0+Y3VyX3RyYW5zID0gTlVMTDsKKworCS8qIGNoZWNrIGlmIHdlIGhhdmUgaXRlbXMgaW4gbGlzdCBhbmQgbm90IHN1c3BlbmRpbmcKKwkgKiByZXR1cm4gMSBpZiBsaXN0IGVtcHR5ICovCisJaWYgKChsaXN0X2VtcHR5KCZkYXRhLT5xdWV1ZSkgPT0gMCkgJiYKKwkgICAgKCFkYXRhLT5ib2FyZF9kYXQtPnN1c3BlbmRfc3RzKSAmJgorCSAgICAoZGF0YS0+c3RhdHVzICE9IFNUQVRVU19FWElUSU5HKSkgeworCQkvKiBXZSBoYXZlIHNvbWUgbW9yZSB3b3JrIHRvIGRvIChlaXRoZXIgdGhlcmUgaXMgbW9yZSB0cmFuaW50CisJCSAqIGJwdztzZmVyIHJlcXVlc3RzIGluIHRoZSBjdXJyZW50IG1lc3NhZ2Ugb3IgdGhlcmUgYXJlCisJCSAqbW9yZSBtZXNzYWdlcykKKwkJICovCisJCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LCAiJXM6SW52b2tlIHF1ZXVlX3dvcmtcbiIsIF9fZnVuY19fKTsKKwkJcXVldWVfd29yayhkYXRhLT53aywgJmRhdGEtPndvcmspOworCX0gZWxzZSBpZiAoZGF0YS0+Ym9hcmRfZGF0LT5zdXNwZW5kX3N0cyB8fAorCQkgICBkYXRhLT5zdGF0dXMgPT0gU1RBVFVTX0VYSVRJTkcpIHsKKwkJZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsCisJCQkiJXMgc3VzcGVuZC9yZW1vdmUgaW5pdGlhdGVkLCBmbHVzaGluZyBxdWV1ZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwbXNnLCBkYXRhLT5xdWV1ZS5uZXh0LCBxdWV1ZSkgeworCQkJcG1zZy0+c3RhdHVzID0gLUVJTzsKKworCQkJaWYgKHBtc2ctPmNvbXBsZXRlKQorCQkJCXBtc2ctPmNvbXBsZXRlKHBtc2ctPmNvbnRleHQpOworCisJCQkvKiBkZWxldGUgZnJvbSBxdWV1ZSAqLworCQkJbGlzdF9kZWxfaW5pdCgmcG1zZy0+cXVldWUpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwY2hfc3BpX3NldF9pcihzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhKQoreworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzLCBzZXQgdGhyZXNob2xkLCBlbmFibGUgU1BJICovCisJaWYgKChkYXRhLT5icHdfbGVuKSA+IFBDSF9NQVhfRklGT19ERVBUSCkKKwkJLyogc2V0IHJlY2VpdmUgdGhyZXNob2xkIHRvIFBDSF9SWF9USE9MRCAqLworCQlwY2hfc3BpX3NldGNscl9yZWcoZGF0YS0+bWFzdGVyLCBQQ0hfU1BDUiwKKwkJCQkgICBQQ0hfUlhfVEhPTEQgPDwgU1BDUl9SRklDX0ZJRUxEIHwKKwkJCQkgICBTUENSX0ZJRV9CSVQgfCBTUENSX1JGSUVfQklUIHwKKwkJCQkgICBTUENSX09SSUVfQklUIHwgU1BDUl9TUEVfQklULAorCQkJCSAgIE1BU0tfUkZJQ19TUENSX0JJVFMgfCBQQ0hfQUxMKTsKKwllbHNlCisJCS8qIHNldCByZWNlaXZlIHRocmVzaG9sZCB0byBtYXhpbXVtICovCisJCXBjaF9zcGlfc2V0Y2xyX3JlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TUENSLAorCQkJCSAgIFBDSF9SWF9USE9MRF9NQVggPDwgU1BDUl9SRklDX0ZJRUxEIHwKKwkJCQkgICBTUENSX0ZJRV9CSVQgfCBTUENSX09SSUVfQklUIHwKKwkJCQkgICBTUENSX1NQRV9CSVQsCisJCQkJICAgTUFTS19SRklDX1NQQ1JfQklUUyB8IFBDSF9BTEwpOworCisJLyogV2FpdCB1bnRpbCB0aGUgdHJhbnNmZXIgY29tcGxldGVzOyBnbyB0byBzbGVlcCBhZnRlcgorCQkJCSBpbml0aWF0aW5nIHRoZSB0cmFuc2Zlci4gKi8KKwlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwKKwkJIiVzOndhaXRpbmcgZm9yIHRyYW5zZmVyIHRvIGdldCBvdmVyXG4iLCBfX2Z1bmNfXyk7CisKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGF0YS0+d2FpdCwgZGF0YS0+dHJhbnNmZXJfY29tcGxldGUpOworCisJcGNoX3NwaV93cml0ZXJlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TU05YQ1IsIFNTTl9OT19DT05UUk9MKTsKKwlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwKKwkJIiVzOm5vIG1vcmUgY29udHJvbCBvdmVyIFNTTi13cml0aW5nIDAgdG8gU1NOWENSLiIsIF9fZnVuY19fKTsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJcGNoX3NwaV93cml0ZXJlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TUFNSLAorCQkJIHBjaF9zcGlfcmVhZHJlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TUFNSKSk7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBTUEkgdHJhbnNmZXIgKi8KKwlwY2hfc3BpX3NldGNscl9yZWcoZGF0YS0+bWFzdGVyLCBQQ0hfU1BDUiwgMCwgUENIX0FMTCB8IFNQQ1JfU1BFX0JJVCk7CisJLyogY2xlYXIgRklGTyAqLworCXBjaF9zcGlfY2xlYXJfZmlmbyhkYXRhLT5tYXN0ZXIpOworfQorCitzdGF0aWMgdm9pZCBwY2hfc3BpX2NvcHlfcnhfZGF0YShzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhLCBpbnQgYnB3KQoreworCWludCBqOworCXU4ICpyeF9idWY7CisJdTE2ICpyeF9zYnVmOworCisJLyogY29weSBSeCBEYXRhICovCisJaWYgKCFkYXRhLT5jdXJfdHJhbnMtPnJ4X2J1ZikKKwkJcmV0dXJuOworCisJaWYgKGJwdyA9PSA4KSB7CisJCXJ4X2J1ZiA9IGRhdGEtPmN1cl90cmFucy0+cnhfYnVmOworCQlmb3IgKGogPSAwOyBqIDwgZGF0YS0+YnB3X2xlbjsgaisrKQorCQkJKnJ4X2J1ZisrID0gZGF0YS0+cGt0X3J4X2J1ZmZbal0gJiAweEZGOworCX0gZWxzZSB7CisJCXJ4X3NidWYgPSBkYXRhLT5jdXJfdHJhbnMtPnJ4X2J1ZjsKKwkJZm9yIChqID0gMDsgaiA8IGRhdGEtPmJwd19sZW47IGorKykKKwkJCSpyeF9zYnVmKysgPSBkYXRhLT5wa3RfcnhfYnVmZltqXTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBjaF9zcGlfY29weV9yeF9kYXRhX2Zvcl9kbWEoc3RydWN0IHBjaF9zcGlfZGF0YSAqZGF0YSwgaW50IGJwdykKK3sKKwlpbnQgajsKKwl1OCAqcnhfYnVmOworCXUxNiAqcnhfc2J1ZjsKKwljb25zdCB1OCAqcnhfZG1hX2J1ZjsKKwljb25zdCB1MTYgKnJ4X2RtYV9zYnVmOworCisJLyogY29weSBSeCBEYXRhICovCisJaWYgKCFkYXRhLT5jdXJfdHJhbnMtPnJ4X2J1ZikKKwkJcmV0dXJuOworCisJaWYgKGJwdyA9PSA4KSB7CisJCXJ4X2J1ZiA9IGRhdGEtPmN1cl90cmFucy0+cnhfYnVmOworCQlyeF9kbWFfYnVmID0gZGF0YS0+ZG1hLnJ4X2J1Zl92aXJ0OworCQlmb3IgKGogPSAwOyBqIDwgZGF0YS0+YnB3X2xlbjsgaisrKQorCQkJKnJ4X2J1ZisrID0gKnJ4X2RtYV9idWYrKyAmIDB4RkY7CisJfSBlbHNlIHsKKwkJcnhfc2J1ZiA9IGRhdGEtPmN1cl90cmFucy0+cnhfYnVmOworCQlyeF9kbWFfc2J1ZiA9IGRhdGEtPmRtYS5yeF9idWZfdmlydDsKKwkJZm9yIChqID0gMDsgaiA8IGRhdGEtPmJwd19sZW47IGorKykKKwkJCSpyeF9zYnVmKysgPSAqcnhfZG1hX3NidWYrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBjaF9zcGlfc3RhcnRfdHJhbnNmZXIoc3RydWN0IHBjaF9zcGlfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNoX3NwaV9kbWFfY3RybCAqZG1hOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkbWEgPSAmZGF0YS0+ZG1hOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cywgU1BJIHNldCBlbmFibGUgKi8KKwlwY2hfc3BpX3NldGNscl9yZWcoZGF0YS0+bWFzdGVyLCBQQ0hfU1BDUiwgU1BDUl9TUEVfQklULCBQQ0hfQUxMKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKKworCS8qIFdhaXQgdW50aWwgdGhlIHRyYW5zZmVyIGNvbXBsZXRlczsgZ28gdG8gc2xlZXAgYWZ0ZXIKKwkJCQkgaW5pdGlhdGluZyB0aGUgdHJhbnNmZXIuICovCisJZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsCisJCSIlczp3YWl0aW5nIGZvciB0cmFuc2ZlciB0byBnZXQgb3ZlclxuIiwgX19mdW5jX18pOworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkYXRhLT53YWl0LCBkYXRhLT50cmFuc2Zlcl9jb21wbGV0ZSk7CisKKwlkbWFfc3luY19zZ19mb3JfY3B1KCZkYXRhLT5tYXN0ZXItPmRldiwgZG1hLT5zZ19yeF9wLCBkbWEtPm5lbnQsCisJCQkgICAgRE1BX0ZST01fREVWSUNFKTsKKwlhc3luY190eF9hY2soZG1hLT5kZXNjX3J4KTsKKwlhc3luY190eF9hY2soZG1hLT5kZXNjX3R4KTsKKwlrZnJlZShkbWEtPnNnX3R4X3ApOworCWtmcmVlKGRtYS0+c2dfcnhfcCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+bG9jaywgZmxhZ3MpOworCXBjaF9zcGlfd3JpdGVyZWcoZGF0YS0+bWFzdGVyLCBQQ0hfU1NOWENSLCBTU05fTk9fQ09OVFJPTCk7CisJZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsCisJCSIlczpubyBtb3JlIGNvbnRyb2wgb3ZlciBTU04td3JpdGluZyAwIHRvIFNTTlhDUi4iLCBfX2Z1bmNfXyk7CisKKwkvKiBjbGVhciBmaWZvIHRocmVzaG9sZCwgZGlzYWJsZSBpbnRlcnJ1cHRzLCBkaXNhYmxlIFNQSSB0cmFuc2ZlciAqLworCXBjaF9zcGlfc2V0Y2xyX3JlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TUENSLCAwLAorCQkJICAgTUFTS19SRklDX1NQQ1JfQklUUyB8IE1BU0tfVEZJQ19TUENSX0JJVFMgfCBQQ0hfQUxMIHwKKwkJCSAgIFNQQ1JfU1BFX0JJVCk7CisJLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KKwlwY2hfc3BpX3dyaXRlcmVnKGRhdGEtPm1hc3RlciwgUENIX1NQU1IsCisJCQkgcGNoX3NwaV9yZWFkcmVnKGRhdGEtPm1hc3RlciwgUENIX1NQU1IpKTsKKwkvKiBjbGVhciBGSUZPICovCisJcGNoX3NwaV9jbGVhcl9maWZvKGRhdGEtPm1hc3Rlcik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaF9kbWFfcnhfY29tcGxldGUodm9pZCAqYXJnKQoreworCXN0cnVjdCBwY2hfc3BpX2RhdGEgKmRhdGEgPSBhcmc7CisKKwkvKiB0cmFuc2ZlciBpcyBjb21wbGV0ZWQ7aW5mb3JtIHBjaF9zcGlfcHJvY2Vzc19tZXNzYWdlc19kbWEgKi8KKwlkYXRhLT50cmFuc2Zlcl9jb21wbGV0ZSA9IHRydWU7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkYXRhLT53YWl0KTsKK30KKworc3RhdGljIGJvb2wgcGNoX3NwaV9maWx0ZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpzbGF2ZSkKK3sKKwlzdHJ1Y3QgcGNoX2RtYV9zbGF2ZSAqcGFyYW0gPSBzbGF2ZTsKKworCWlmICgoY2hhbi0+Y2hhbl9pZCA9PSBwYXJhbS0+Y2hhbl9pZCkgJiYKKwkgICAgKHBhcmFtLT5kbWFfZGV2ID09IGNoYW4tPmRldmljZS0+ZGV2KSkgeworCQljaGFuLT5wcml2YXRlID0gcGFyYW07CisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBjaF9zcGlfcmVxdWVzdF9kbWEoc3RydWN0IHBjaF9zcGlfZGF0YSAqZGF0YSwgaW50IGJwdykKK3sKKwlkbWFfY2FwX21hc2tfdCBtYXNrOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgcGNpX2RldiAqZG1hX2RldjsKKwlzdHJ1Y3QgcGNoX2RtYV9zbGF2ZSAqcGFyYW07CisJc3RydWN0IHBjaF9zcGlfZG1hX2N0cmwgKmRtYTsKKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisKKwlpZiAoYnB3ID09IDgpCisJCXdpZHRoID0gUENIX0RNQV9XSURUSF8xX0JZVEU7CisJZWxzZQorCQl3aWR0aCA9IFBDSF9ETUFfV0lEVEhfMl9CWVRFUzsKKworCWRtYSA9ICZkYXRhLT5kbWE7CisJZG1hX2NhcF96ZXJvKG1hc2spOworCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgbWFzayk7CisKKwkvKiBHZXQgRE1BJ3MgZGV2IGluZm9ybWF0aW9uICovCisJZG1hX2RldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KDIsIFBDSV9ERVZGTigxMiwgMCkpOworCisJLyogU2V0IFR4IERNQSAqLworCXBhcmFtID0gJmRtYS0+cGFyYW1fdHg7CisJcGFyYW0tPmRtYV9kZXYgPSAmZG1hX2Rldi0+ZGV2OworCXBhcmFtLT5jaGFuX2lkID0gZGF0YS0+bWFzdGVyLT5idXNfbnVtICogMjsgLyogVHggPSAwLCAyICovCisJcGFyYW0tPnR4X3JlZyA9IGRhdGEtPmlvX2Jhc2VfYWRkciArIFBDSF9TUERXUjsKKwlwYXJhbS0+d2lkdGggPSB3aWR0aDsKKwljaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBwY2hfc3BpX2ZpbHRlciwgcGFyYW0pOworCWlmICghY2hhbikgeworCQlkZXZfZXJyKCZkYXRhLT5tYXN0ZXItPmRldiwKKwkJCSJFUlJPUjogZG1hX3JlcXVlc3RfY2hhbm5lbCBGQUlMUyhUeClcbiIpOworCQlkYXRhLT51c2VfZG1hID0gMDsKKwkJcmV0dXJuOworCX0KKwlkbWEtPmNoYW5fdHggPSBjaGFuOworCisJLyogU2V0IFJ4IERNQSAqLworCXBhcmFtID0gJmRtYS0+cGFyYW1fcng7CisJcGFyYW0tPmRtYV9kZXYgPSAmZG1hX2Rldi0+ZGV2OworCXBhcmFtLT5jaGFuX2lkID0gZGF0YS0+bWFzdGVyLT5idXNfbnVtICogMiArIDE7IC8qIFJ4ID0gVHggKyAxICovCisJcGFyYW0tPnJ4X3JlZyA9IGRhdGEtPmlvX2Jhc2VfYWRkciArIFBDSF9TUERSUjsKKwlwYXJhbS0+d2lkdGggPSB3aWR0aDsKKwljaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBwY2hfc3BpX2ZpbHRlciwgcGFyYW0pOworCWlmICghY2hhbikgeworCQlkZXZfZXJyKCZkYXRhLT5tYXN0ZXItPmRldiwKKwkJCSJFUlJPUjogZG1hX3JlcXVlc3RfY2hhbm5lbCBGQUlMUyhSeClcbiIpOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKGRtYS0+Y2hhbl90eCk7CisJCWRtYS0+Y2hhbl90eCA9IE5VTEw7CisJCWRhdGEtPnVzZV9kbWEgPSAwOworCQlyZXR1cm47CisJfQorCWRtYS0+Y2hhbl9yeCA9IGNoYW47Cit9CisKK3N0YXRpYyB2b2lkIHBjaF9zcGlfcmVsZWFzZV9kbWEoc3RydWN0IHBjaF9zcGlfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNoX3NwaV9kbWFfY3RybCAqZG1hOworCisJZG1hID0gJmRhdGEtPmRtYTsKKwlpZiAoZG1hLT5jaGFuX3R4KSB7CisJCWRtYV9yZWxlYXNlX2NoYW5uZWwoZG1hLT5jaGFuX3R4KTsKKwkJZG1hLT5jaGFuX3R4ID0gTlVMTDsKKwl9CisJaWYgKGRtYS0+Y2hhbl9yeCkgeworCQlkbWFfcmVsZWFzZV9jaGFubmVsKGRtYS0+Y2hhbl9yeCk7CisJCWRtYS0+Y2hhbl9yeCA9IE5VTEw7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcGNoX3NwaV9oYW5kbGVfZG1hKHN0cnVjdCBwY2hfc3BpX2RhdGEgKmRhdGEsIGludCAqYnB3KQoreworCWNvbnN0IHU4ICp0eF9idWY7CisJY29uc3QgdTE2ICp0eF9zYnVmOworCXU4ICp0eF9kbWFfYnVmOworCXUxNiAqdHhfZG1hX3NidWY7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2NfdHg7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjX3J4OworCWludCBudW07CisJaW50IGk7CisJaW50IHNpemU7CisJaW50IHJlbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwY2hfc3BpX2RtYV9jdHJsICpkbWE7CisKKwlkbWEgPSAmZGF0YS0+ZG1hOworCisJLyogc2V0IGJhdWQgcmF0ZSBpZiBuZWVkZWQgKi8KKwlpZiAoZGF0YS0+Y3VyX3RyYW5zLT5zcGVlZF9oeikgeworCQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzOnNldHRpbmcgYmF1ZCByYXRlXG4iLCBfX2Z1bmNfXyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhLT5sb2NrLCBmbGFncyk7CisJCXBjaF9zcGlfc2V0X2JhdWRfcmF0ZShkYXRhLT5tYXN0ZXIsIGRhdGEtPmN1cl90cmFucy0+c3BlZWRfaHopOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5sb2NrLCBmbGFncyk7CisJfQorCisJLyogc2V0IGJpdHMgcGVyIHdvcmQgaWYgbmVlZGVkICovCisJaWYgKGRhdGEtPmN1cl90cmFucy0+Yml0c19wZXJfd29yZCAmJgorCSAgICAoZGF0YS0+Y3VycmVudF9tc2ctPnNwaS0+Yml0c19wZXJfd29yZCAhPQorCSAgICAgZGF0YS0+Y3VyX3RyYW5zLT5iaXRzX3Blcl93b3JkKSkgeworCQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzOnNldCBiaXRzIHBlciB3b3JkXG4iLCBfX2Z1bmNfXyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhLT5sb2NrLCBmbGFncyk7CisJCXBjaF9zcGlfc2V0X2JpdHNfcGVyX3dvcmQoZGF0YS0+bWFzdGVyLAorCQkJCQkgIGRhdGEtPmN1cl90cmFucy0+Yml0c19wZXJfd29yZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJKmJwdyA9IGRhdGEtPmN1cl90cmFucy0+Yml0c19wZXJfd29yZDsKKwl9IGVsc2UgeworCQkqYnB3ID0gZGF0YS0+Y3VycmVudF9tc2ctPnNwaS0+Yml0c19wZXJfd29yZDsKKwl9CisJZGF0YS0+YnB3X2xlbiA9IGRhdGEtPmN1cl90cmFucy0+bGVuIC8gKCpicHcgLyA4KTsKKworCS8qIGNvcHkgVHggRGF0YSAqLworCWlmIChkYXRhLT5jdXJfdHJhbnMtPnR4X2J1ZiAhPSBOVUxMKSB7CisJCWlmICgqYnB3ID09IDgpIHsKKwkJCXR4X2J1ZiA9IGRhdGEtPmN1cl90cmFucy0+dHhfYnVmOworCQkJdHhfZG1hX2J1ZiA9IGRtYS0+dHhfYnVmX3ZpcnQ7CisJCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+YnB3X2xlbjsgaSsrKQorCQkJCSp0eF9kbWFfYnVmKysgPSAqdHhfYnVmKys7CisJCX0gZWxzZSB7CisJCQl0eF9zYnVmID0gZGF0YS0+Y3VyX3RyYW5zLT50eF9idWY7CisJCQl0eF9kbWFfc2J1ZiA9IGRtYS0+dHhfYnVmX3ZpcnQ7CisJCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+YnB3X2xlbjsgaSsrKQorCQkJCSp0eF9kbWFfc2J1ZisrID0gKnR4X3NidWYrKzsKKwkJfQorCX0KKwlpZiAoZGF0YS0+YnB3X2xlbiA+IFBDSF9ETUFfVFJBTlNfU0laRSkgeworCQludW0gPSBkYXRhLT5icHdfbGVuIC8gUENIX0RNQV9UUkFOU19TSVpFICsgMTsKKwkJc2l6ZSA9IFBDSF9ETUFfVFJBTlNfU0laRTsKKwkJcmVtID0gZGF0YS0+YnB3X2xlbiAlIFBDSF9ETUFfVFJBTlNfU0laRTsKKwl9IGVsc2UgeworCQludW0gPSAxOworCQlzaXplID0gZGF0YS0+YnB3X2xlbjsKKwkJcmVtID0gZGF0YS0+YnB3X2xlbjsKKwl9CisJZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsICIlcyBudW09JWQgc2l6ZT0lZCByZW09JWRcbiIsCisJCV9fZnVuY19fLCBudW0sIHNpemUsIHJlbSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKKworCS8qIHNldCByZWNlaXZlIGZpZm8gdGhyZXNob2xkIGFuZCB0cmFuc21pdCBmaWZvIHRocmVzaG9sZCAqLworCXBjaF9zcGlfc2V0Y2xyX3JlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TUENSLAorCQkJICAgKChzaXplIC0gMSkgPDwgU1BDUl9SRklDX0ZJRUxEKSB8CisJCQkgICAoKFBDSF9NQVhfRklGT19ERVBUSCAtIFBDSF9ETUFfVFJBTlNfU0laRSkgPDwKKwkJCSAgICBTUENSX1RGSUNfRklFTEQpLAorCQkJICAgTUFTS19SRklDX1NQQ1JfQklUUyB8IE1BU0tfVEZJQ19TUENSX0JJVFMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+bG9jaywgZmxhZ3MpOworCisJLyogUlggKi8KKwlkbWEtPnNnX3J4X3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpKm51bSwgR0ZQX0FUT01JQyk7CisJc2dfaW5pdF90YWJsZShkbWEtPnNnX3J4X3AsIG51bSk7IC8qIEluaXRpYWxpemUgU0cgdGFibGUgKi8KKwkvKiBvZmZzZXQsIGxlbmd0aCBzZXR0aW5nICovCisJc2cgPSBkbWEtPnNnX3J4X3A7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrLCBzZysrKSB7CisJCWlmIChpID09IDApIHsKKwkJCXNnLT5vZmZzZXQgPSAwOworCQkJc2dfc2V0X3BhZ2Uoc2csIHZpcnRfdG9fcGFnZShkbWEtPnJ4X2J1Zl92aXJ0KSwgcmVtLAorCQkJCSAgICBzZy0+b2Zmc2V0KTsKKwkJCXNnX2RtYV9sZW4oc2cpID0gcmVtOworCQl9IGVsc2UgeworCQkJc2ctPm9mZnNldCA9IHJlbSArIHNpemUgKiAoaSAtIDEpOworCQkJc2ctPm9mZnNldCA9IHNnLT5vZmZzZXQgKiAoKmJwdyAvIDgpOworCQkJc2dfc2V0X3BhZ2Uoc2csIHZpcnRfdG9fcGFnZShkbWEtPnJ4X2J1Zl92aXJ0KSwgc2l6ZSwKKwkJCQkgICAgc2ctPm9mZnNldCk7CisJCQlzZ19kbWFfbGVuKHNnKSA9IHNpemU7CisJCX0KKwkJc2dfZG1hX2FkZHJlc3Moc2cpID0gZG1hLT5yeF9idWZfZG1hICsgc2ctPm9mZnNldDsKKwl9CisJc2cgPSBkbWEtPnNnX3J4X3A7CisJZGVzY19yeCA9IGRtYS0+Y2hhbl9yeC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhkbWEtPmNoYW5fcngsIHNnLAorCQkJCQludW0sIERNQV9GUk9NX0RFVklDRSwKKwkJCQkJRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLKTsKKwlpZiAoIWRlc2NfcngpIHsKKwkJZGV2X2VycigmZGF0YS0+bWFzdGVyLT5kZXYsICIlczpkZXZpY2VfcHJlcF9zbGF2ZV9zZyBGYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJZG1hX3N5bmNfc2dfZm9yX2RldmljZSgmZGF0YS0+bWFzdGVyLT5kZXYsIHNnLCBudW0sIERNQV9GUk9NX0RFVklDRSk7CisJZGVzY19yeC0+Y2FsbGJhY2sgPSBwY2hfZG1hX3J4X2NvbXBsZXRlOworCWRlc2NfcngtPmNhbGxiYWNrX3BhcmFtID0gZGF0YTsKKwlkbWEtPm5lbnQgPSBudW07CisJZG1hLT5kZXNjX3J4ID0gZGVzY19yeDsKKworCS8qIFRYICovCisJZG1hLT5zZ190eF9wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSpudW0sIEdGUF9BVE9NSUMpOworCXNnX2luaXRfdGFibGUoZG1hLT5zZ190eF9wLCBudW0pOyAvKiBJbml0aWFsaXplIFNHIHRhYmxlICovCisJLyogb2Zmc2V0LCBsZW5ndGggc2V0dGluZyAqLworCXNnID0gZG1hLT5zZ190eF9wOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKywgc2crKykgeworCQlpZiAoaSA9PSAwKSB7CisJCQlzZy0+b2Zmc2V0ID0gMDsKKwkJCXNnX3NldF9wYWdlKHNnLCB2aXJ0X3RvX3BhZ2UoZG1hLT50eF9idWZfdmlydCksIHJlbSwKKwkJCQkgICAgc2ctPm9mZnNldCk7CisJCQlzZ19kbWFfbGVuKHNnKSA9IHJlbTsKKwkJfSBlbHNlIHsKKwkJCXNnLT5vZmZzZXQgPSByZW0gKyBzaXplICogKGkgLSAxKTsKKwkJCXNnLT5vZmZzZXQgPSBzZy0+b2Zmc2V0ICogKCpicHcgLyA4KTsKKwkJCXNnX3NldF9wYWdlKHNnLCB2aXJ0X3RvX3BhZ2UoZG1hLT50eF9idWZfdmlydCksIHNpemUsCisJCQkJICAgIHNnLT5vZmZzZXQpOworCQkJc2dfZG1hX2xlbihzZykgPSBzaXplOworCQl9CisJCXNnX2RtYV9hZGRyZXNzKHNnKSA9IGRtYS0+dHhfYnVmX2RtYSArIHNnLT5vZmZzZXQ7CisJfQorCXNnID0gZG1hLT5zZ190eF9wOworCWRlc2NfdHggPSBkbWEtPmNoYW5fdHgtPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coZG1hLT5jaGFuX3R4LAorCQkJCQlzZywgbnVtLCBETUFfVE9fREVWSUNFLAorCQkJCQlETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ1RSTF9BQ0spOworCWlmICghZGVzY190eCkgeworCQlkZXZfZXJyKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzOmRldmljZV9wcmVwX3NsYXZlX3NnIEZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlkbWFfc3luY19zZ19mb3JfZGV2aWNlKCZkYXRhLT5tYXN0ZXItPmRldiwgc2csIG51bSwgRE1BX1RPX0RFVklDRSk7CisJZGVzY190eC0+Y2FsbGJhY2sgPSBOVUxMOworCWRlc2NfdHgtPmNhbGxiYWNrX3BhcmFtID0gZGF0YTsKKwlkbWEtPm5lbnQgPSBudW07CisJZG1hLT5kZXNjX3R4ID0gZGVzY190eDsKKworCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LCAiXG4lczpQdWxsaW5nIGRvd24gU1NOIGxvdyAtIHdyaXRpbmcgIgorCQkiMHgyIHRvIFNTTlhDUlxuIiwgX19mdW5jX18pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKKwlwY2hfc3BpX3dyaXRlcmVnKGRhdGEtPm1hc3RlciwgUENIX1NTTlhDUiwgU1NOX0xPVyk7CisJZGVzY19yeC0+dHhfc3VibWl0KGRlc2NfcngpOworCWRlc2NfdHgtPnR4X3N1Ym1pdChkZXNjX3R4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5sb2NrLCBmbGFncyk7CisKKwkvKiByZXNldCB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnICovCisJZGF0YS0+dHJhbnNmZXJfY29tcGxldGUgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgcGNoX3NwaV9wcm9jZXNzX21lc3NhZ2VzKHN0cnVjdCB3b3JrX3N0cnVjdCAqcHdvcmspCit7CisJc3RydWN0IHNwaV9tZXNzYWdlICpwbXNnOworCXN0cnVjdCBwY2hfc3BpX2RhdGEgKmRhdGE7CisJaW50IGJwdzsKKworCWRhdGEgPSBjb250YWluZXJfb2YocHdvcmssIHN0cnVjdCBwY2hfc3BpX2RhdGEsIHdvcmspOworCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LCAiJXMgZGF0YSBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOworCisJc3Bpbl9sb2NrKCZkYXRhLT5sb2NrKTsKKwkvKiBjaGVjayBpZiBzdXNwZW5kIGhhcyBiZWVuIGluaXRpYXRlZDtpZiB5ZXMgZmx1c2ggcXVldWUgKi8KKwlpZiAoZGF0YS0+Ym9hcmRfZGF0LT5zdXNwZW5kX3N0cyB8fCAoZGF0YS0+c3RhdHVzID09IFNUQVRVU19FWElUSU5HKSkgeworCQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzIHN1c3BlbmQvcmVtb3ZlIGluaXRpYXRlZCwiCisJCQkiZmx1c2hpbmcgcXVldWVcbiIsIF9fZnVuY19fKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwbXNnLCBkYXRhLT5xdWV1ZS5uZXh0LCBxdWV1ZSkgeworCQkJcG1zZy0+c3RhdHVzID0gLUVJTzsKKworCQkJaWYgKHBtc2ctPmNvbXBsZXRlICE9IDApIHsKKwkJCQlzcGluX3VubG9jaygmZGF0YS0+bG9jayk7CisJCQkJcG1zZy0+Y29tcGxldGUocG1zZy0+Y29udGV4dCk7CisJCQkJc3Bpbl9sb2NrKCZkYXRhLT5sb2NrKTsKKwkJCX0KKworCQkJLyogZGVsZXRlIGZyb20gcXVldWUgKi8KKwkJCWxpc3RfZGVsX2luaXQoJnBtc2ctPnF1ZXVlKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWRhdGEtPmJjdXJyZW50X21zZ19wcm9jZXNzaW5nID0gdHJ1ZTsKKwlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwKKwkJIiVzIFNldCBkYXRhLT5iY3VycmVudF9tc2dfcHJvY2Vzc2luZz0gdHJ1ZVxuIiwgX19mdW5jX18pOworCisJLyogR2V0IHRoZSBtZXNzYWdlIGZyb20gdGhlIHF1ZXVlIGFuZCBkZWxldGUgaXQgZnJvbSB0aGVyZS4gKi8KKwlkYXRhLT5jdXJyZW50X21zZyA9IGxpc3RfZW50cnkoZGF0YS0+cXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLAorCQkJCQlxdWV1ZSk7CisKKwlsaXN0X2RlbF9pbml0KCZkYXRhLT5jdXJyZW50X21zZy0+cXVldWUpOworCisJZGF0YS0+Y3VycmVudF9tc2ctPnN0YXR1cyA9IDA7CisKKwlwY2hfc3BpX3NlbGVjdF9jaGlwKGRhdGEsIGRhdGEtPmN1cnJlbnRfbXNnLT5zcGkpOworCisJc3Bpbl91bmxvY2soJmRhdGEtPmxvY2spOworCisJaWYgKGRhdGEtPnVzZV9kbWEpCisJCXBjaF9zcGlfcmVxdWVzdF9kbWEoZGF0YSwKKwkJCQkgICAgZGF0YS0+Y3VycmVudF9tc2ctPnNwaS0+Yml0c19wZXJfd29yZCk7CisJZG8geworCQkvKiBJZiB3ZSBhcmUgYWxyZWFkeSBwcm9jZXNzaW5nIGEgbWVzc2FnZSBnZXQgdGhlIG5leHQKKwkJdHJhbnNmZXIgc3RydWN0dXJlIGZyb20gdGhlIG1lc3NhZ2Ugb3RoZXJ3aXNlIHJldHJpZXZlCisJCXRoZSAxc3QgdHJhbnNmZXIgcmVxdWVzdCBmcm9tIHRoZSBtZXNzYWdlLiAqLworCQlzcGluX2xvY2soJmRhdGEtPmxvY2spOworCQlpZiAoZGF0YS0+Y3VyX3RyYW5zID09IE5VTEwpIHsKKwkJCWRhdGEtPmN1cl90cmFucyA9CisJCQkJbGlzdF9lbnRyeShkYXRhLT5jdXJyZW50X21zZy0+dHJhbnNmZXJzLm5leHQsCisJCQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOworCQkJZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsICIlcyAiCisJCQkJIjpHZXR0aW5nIDFzdCB0cmFuc2ZlciBtZXNzYWdlXG4iLCBfX2Z1bmNfXyk7CisJCX0gZWxzZSB7CisJCQlkYXRhLT5jdXJfdHJhbnMgPQorCQkJCWxpc3RfZW50cnkoZGF0YS0+Y3VyX3RyYW5zLT50cmFuc2Zlcl9saXN0Lm5leHQsCisJCQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOworCQkJZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsICIlcyAiCisJCQkJIjpHZXR0aW5nIG5leHQgdHJhbnNmZXIgbWVzc2FnZVxuIiwgX19mdW5jX18pOworCQl9CisJCXNwaW5fdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCQlpZiAoZGF0YS0+dXNlX2RtYSkgeworCQkJcGNoX3NwaV9oYW5kbGVfZG1hKGRhdGEsICZicHcpOworCQkJcGNoX3NwaV9zdGFydF90cmFuc2ZlcihkYXRhKTsKKwkJCXBjaF9zcGlfY29weV9yeF9kYXRhX2Zvcl9kbWEoZGF0YSwgYnB3KTsKKwkJfSBlbHNlIHsKKwkJCXBjaF9zcGlfc2V0X3R4KGRhdGEsICZicHcpOworCQkJcGNoX3NwaV9zZXRfaXIoZGF0YSk7CisJCQlwY2hfc3BpX2NvcHlfcnhfZGF0YShkYXRhLCBicHcpOworCQkJa2ZyZWUoZGF0YS0+cGt0X3J4X2J1ZmYpOworCQkJZGF0YS0+cGt0X3J4X2J1ZmYgPSBOVUxMOworCQkJa2ZyZWUoZGF0YS0+cGt0X3R4X2J1ZmYpOworCQkJZGF0YS0+cGt0X3R4X2J1ZmYgPSBOVUxMOworCQl9CisJCS8qIGluY3JlbWVudCBtZXNzYWdlIGNvdW50ICovCisJCWRhdGEtPmN1cnJlbnRfbXNnLT5hY3R1YWxfbGVuZ3RoICs9IGRhdGEtPmN1cl90cmFucy0+bGVuOworCisJCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LAorCQkJIiVzOmRhdGEtPmN1cnJlbnRfbXNnLT5hY3R1YWxfbGVuZ3RoPSVkXG4iLAorCQkJX19mdW5jX18sIGRhdGEtPmN1cnJlbnRfbXNnLT5hY3R1YWxfbGVuZ3RoKTsKKworCQkvKiBjaGVjayBmb3IgZGVsYXkgKi8KKwkJaWYgKGRhdGEtPmN1cl90cmFucy0+ZGVsYXlfdXNlY3MpIHsKKwkJCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LCAiJXM6IgorCQkJCSJkZWxheSBpbiB1c2VjPSVkXG4iLCBfX2Z1bmNfXywKKwkJCQlkYXRhLT5jdXJfdHJhbnMtPmRlbGF5X3VzZWNzKTsKKwkJCXVkZWxheShkYXRhLT5jdXJfdHJhbnMtPmRlbGF5X3VzZWNzKTsKKwkJfQorCisJCXNwaW5fbG9jaygmZGF0YS0+bG9jayk7CisKKwkJLyogTm8gbW9yZSB0cmFuc2ZlciBpbiB0aGlzIG1lc3NhZ2UuICovCisJCWlmICgoZGF0YS0+Y3VyX3RyYW5zLT50cmFuc2Zlcl9saXN0Lm5leHQpID09CisJCSAgICAmKGRhdGEtPmN1cnJlbnRfbXNnLT50cmFuc2ZlcnMpKSB7CisJCQlwY2hfc3BpX25vbW9yZV90cmFuc2ZlcihkYXRhKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCX0gd2hpbGUgKGRhdGEtPmN1cl90cmFucyAhPSBOVUxMKTsKKworCWlmIChkYXRhLT51c2VfZG1hKQorCQlwY2hfc3BpX3JlbGVhc2VfZG1hKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBwY2hfc3BpX2ZyZWVfcmVzb3VyY2VzKHN0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgKmJvYXJkX2RhdCwKKwkJCQkgICBzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhKQoreworCWRldl9kYmcoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LCAiJXMgRU5UUllcbiIsIF9fZnVuY19fKTsKKworCS8qIGZyZWUgd29ya3F1ZXVlICovCisJaWYgKGRhdGEtPndrICE9IE5VTEwpIHsKKwkJZGVzdHJveV93b3JrcXVldWUoZGF0YS0+d2spOworCQlkYXRhLT53ayA9IE5VTEw7CisJCWRldl9kYmcoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LAorCQkJIiVzIGRlc3Ryb3lfd29ya3F1ZXVlIGludm9rZWQgc3VjY2Vzc2Z1bGx5XG4iLAorCQkJX19mdW5jX18pOworCX0KK30KKworc3RhdGljIGludCBwY2hfc3BpX2dldF9yZXNvdXJjZXMoc3RydWN0IHBjaF9zcGlfYm9hcmRfZGF0YSAqYm9hcmRfZGF0LAorCQkJCSBzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhKQoreworCWludCByZXR2YWwgPSAwOworCisJZGV2X2RiZygmYm9hcmRfZGF0LT5wZGV2LT5kZXYsICIlcyBFTlRSWVxuIiwgX19mdW5jX18pOworCisJLyogY3JlYXRlIHdvcmtxdWV1ZSAqLworCWRhdGEtPndrID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoS0JVSUxEX01PRE5BTUUpOworCWlmICghZGF0YS0+d2spIHsKKwkJZGV2X2VycigmYm9hcmRfZGF0LT5wZGV2LT5kZXYsCisJCQkiJXMgY3JlYXRlX3NpbmdsZXQgaHJlYWRfd29ya3F1ZXVlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3JldHVybjsKKwl9CisKKwkvKiByZXNldCBQQ0ggU1BJIGgvdyAqLworCXBjaF9zcGlfcmVzZXQoZGF0YS0+bWFzdGVyKTsKKwlkZXZfZGJnKCZib2FyZF9kYXQtPnBkZXYtPmRldiwKKwkJIiVzIHBjaF9zcGlfcmVzZXQgaW52b2tlZCBzdWNjZXNzZnVsbHlcbiIsIF9fZnVuY19fKTsKKworCWRldl9kYmcoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LCAiJXMgZGF0YS0+aXJxX3JlZ19zdHM9dHJ1ZVxuIiwgX19mdW5jX18pOworCitlcnJfcmV0dXJuOgorCWlmIChyZXR2YWwgIT0gMCkgeworCQlkZXZfZXJyKCZib2FyZF9kYXQtPnBkZXYtPmRldiwKKwkJCSIlcyBGQUlMOmludm9raW5nIHBjaF9zcGlfZnJlZV9yZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKKwkJcGNoX3NwaV9mcmVlX3Jlc291cmNlcyhib2FyZF9kYXQsIGRhdGEpOworCX0KKworCWRldl9kYmcoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LCAiJXMgUmV0dXJuPSVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHBjaF9mcmVlX2RtYV9idWYoc3RydWN0IHBjaF9zcGlfYm9hcmRfZGF0YSAqYm9hcmRfZGF0LAorCQkJICAgICBzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBwY2hfc3BpX2RtYV9jdHJsICpkbWE7CisKKwlkbWEgPSAmZGF0YS0+ZG1hOworCWlmIChkbWEtPnR4X2J1Zl9kbWEpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZib2FyZF9kYXQtPnBkZXYtPmRldiwgUENIX0JVRl9TSVpFLAorCQkJCSAgZG1hLT50eF9idWZfdmlydCwgZG1hLT50eF9idWZfZG1hKTsKKwlpZiAoZG1hLT5yeF9idWZfZG1hKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmYm9hcmRfZGF0LT5wZGV2LT5kZXYsIFBDSF9CVUZfU0laRSwKKwkJCQkgIGRtYS0+cnhfYnVmX3ZpcnQsIGRtYS0+cnhfYnVmX2RtYSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBwY2hfYWxsb2NfZG1hX2J1ZihzdHJ1Y3QgcGNoX3NwaV9ib2FyZF9kYXRhICpib2FyZF9kYXQsCisJCQkgICAgICBzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBwY2hfc3BpX2RtYV9jdHJsICpkbWE7CisKKwlkbWEgPSAmZGF0YS0+ZG1hOworCS8qIEdldCBDb25zaXN0ZW50IG1lbW9yeSBmb3IgVHggRE1BICovCisJZG1hLT50eF9idWZfdmlydCA9IGRtYV9hbGxvY19jb2hlcmVudCgmYm9hcmRfZGF0LT5wZGV2LT5kZXYsCisJCQkJUENIX0JVRl9TSVpFLCAmZG1hLT50eF9idWZfZG1hLCBHRlBfS0VSTkVMKTsKKwkvKiBHZXQgQ29uc2lzdGVudCBtZW1vcnkgZm9yIFJ4IERNQSAqLworCWRtYS0+cnhfYnVmX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LAorCQkJCVBDSF9CVUZfU0laRSwgJmRtYS0+cnhfYnVmX2RtYSwgR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjaF9zcGlfcGRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdF9kZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgKmJvYXJkX2RhdCA9IGRldl9nZXRfcGxhdGRhdGEoJnBsYXRfZGV2LT5kZXYpOworCXN0cnVjdCBwY2hfc3BpX2RhdGEgKmRhdGE7CisKKwlkZXZfZGJnKCZwbGF0X2Rldi0+ZGV2LCAiJXM6ZGVidWdcbiIsIF9fZnVuY19fKTsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBwY2hfc3BpX2RhdGEpKTsKKwlpZiAoIW1hc3RlcikgeworCQlkZXZfZXJyKCZwbGF0X2Rldi0+ZGV2LCAic3BpX2FsbG9jX21hc3RlclslZF0gZmFpbGVkLlxuIiwKKwkJCXBsYXRfZGV2LT5pZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRhdGEgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJZGF0YS0+bWFzdGVyID0gbWFzdGVyOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGxhdF9kZXYsIGRhdGEpOworCisJLyogYmFzZWFkZHJlc3MgKyBhZGRyZXNzIG9mZnNldCkgKi8KKwlkYXRhLT5pb19iYXNlX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoYm9hcmRfZGF0LT5wZGV2LCAxKSArCisJCQkJCSBQQ0hfQUREUkVTU19TSVpFICogcGxhdF9kZXYtPmlkOworCWRhdGEtPmlvX3JlbWFwX2FkZHIgPSBwY2lfaW9tYXAoYm9hcmRfZGF0LT5wZGV2LCAxLCAwKSArCisJCQkJCSBQQ0hfQUREUkVTU19TSVpFICogcGxhdF9kZXYtPmlkOworCWlmICghZGF0YS0+aW9fcmVtYXBfYWRkcikgeworCQlkZXZfZXJyKCZwbGF0X2Rldi0+ZGV2LCAiJXMgcGNpX2lvbWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9wY2lfaW9tYXA7CisJfQorCisJZGV2X2RiZygmcGxhdF9kZXYtPmRldiwgIltjaCVkXSByZW1hcF9hZGRyPSVwXG4iLAorCQlwbGF0X2Rldi0+aWQsIGRhdGEtPmlvX3JlbWFwX2FkZHIpOworCisJLyogaW5pdGlhbGl6ZSBtZW1iZXJzIG9mIFNQSSBtYXN0ZXIgKi8KKwltYXN0ZXItPmJ1c19udW0gPSAtMTsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gUENIX01BWF9DUzsKKwltYXN0ZXItPnNldHVwID0gcGNoX3NwaV9zZXR1cDsKKwltYXN0ZXItPnRyYW5zZmVyID0gcGNoX3NwaV90cmFuc2ZlcjsKKworCWRhdGEtPmJvYXJkX2RhdCA9IGJvYXJkX2RhdDsKKwlkYXRhLT5wbGF0X2RldiA9IHBsYXRfZGV2OworCWRhdGEtPm5fY3VybnRfY2hpcCA9IDI1NTsKKwlkYXRhLT5zdGF0dXMgPSBTVEFUVVNfUlVOTklORzsKKwlkYXRhLT5jaCA9IHBsYXRfZGV2LT5pZDsKKwlkYXRhLT51c2VfZG1hID0gdXNlX2RtYTsKKworCUlOSVRfTElTVF9IRUFEKCZkYXRhLT5xdWV1ZSk7CisJc3Bpbl9sb2NrX2luaXQoJmRhdGEtPmxvY2spOworCUlOSVRfV09SSygmZGF0YS0+d29yaywgcGNoX3NwaV9wcm9jZXNzX21lc3NhZ2VzKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkYXRhLT53YWl0KTsKKworCXJldCA9IHBjaF9zcGlfZ2V0X3Jlc291cmNlcyhib2FyZF9kYXQsIGRhdGEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGxhdF9kZXYtPmRldiwgIiVzIGZhaWwocmV0dmFsPSVkKVxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX3NwaV9nZXRfcmVzb3VyY2VzOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKGJvYXJkX2RhdC0+cGRldi0+aXJxLCBwY2hfc3BpX2hhbmRsZXIsCisJCQkgIElSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgZGF0YSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwbGF0X2Rldi0+ZGV2LAorCQkJIiVzIHJlcXVlc3RfaXJxIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKKwl9CisJZGF0YS0+aXJxX3JlZ19zdHMgPSB0cnVlOworCisJcGNoX3NwaV9zZXRfbWFzdGVyX21vZGUobWFzdGVyKTsKKworCXJldCA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmcGxhdF9kZXYtPmRldiwKKwkJCSIlcyBzcGlfcmVnaXN0ZXJfbWFzdGVyIEZBSUxFRFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9zcGlfcmVnaXN0ZXJfbWFzdGVyOworCX0KKworCWlmICh1c2VfZG1hKSB7CisJCWRldl9pbmZvKCZwbGF0X2Rldi0+ZGV2LCAiVXNlIERNQSBmb3IgZGF0YSB0cmFuc2ZlcnNcbiIpOworCQlwY2hfYWxsb2NfZG1hX2J1Zihib2FyZF9kYXQsIGRhdGEpOworCX0KKworCXJldHVybiAwOworCitlcnJfc3BpX3JlZ2lzdGVyX21hc3RlcjoKKwlmcmVlX2lycShib2FyZF9kYXQtPnBkZXYtPmlycSwgYm9hcmRfZGF0KTsKK2Vycl9yZXF1ZXN0X2lycToKKwlwY2hfc3BpX2ZyZWVfcmVzb3VyY2VzKGJvYXJkX2RhdCwgZGF0YSk7CitlcnJfc3BpX2dldF9yZXNvdXJjZXM6CisJcGNpX2lvdW5tYXAoYm9hcmRfZGF0LT5wZGV2LCBkYXRhLT5pb19yZW1hcF9hZGRyKTsKK2Vycl9wY2lfaW9tYXA6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHBjaF9zcGlfcGRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRfZGV2KQoreworCXN0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgKmJvYXJkX2RhdCA9IGRldl9nZXRfcGxhdGRhdGEoJnBsYXRfZGV2LT5kZXYpOworCXN0cnVjdCBwY2hfc3BpX2RhdGEgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0X2Rldik7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKCZwbGF0X2Rldi0+ZGV2LCAiJXM6W2NoJWRdIGlycT0lZFxuIiwKKwkJX19mdW5jX18sIHBsYXRfZGV2LT5pZCwgYm9hcmRfZGF0LT5wZGV2LT5pcnEpOworCisJaWYgKHVzZV9kbWEpCisJCXBjaF9mcmVlX2RtYV9idWYoYm9hcmRfZGF0LCBkYXRhKTsKKworCS8qIGNoZWNrIGZvciBhbnkgcGVuZGluZyBtZXNzYWdlczsgbm8gYWN0aW9uIGlzIHRha2VuIGlmIHRoZSBxdWV1ZQorCSAqIGlzIHN0aWxsIGZ1bGw7IGJ1dCBhdCBsZWFzdCB3ZSB0cmllZC4gIFVubG9hZCBhbnl3YXkgKi8KKwljb3VudCA9IDUwMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+bG9jaywgZmxhZ3MpOworCWRhdGEtPnN0YXR1cyA9IFNUQVRVU19FWElUSU5HOworCXdoaWxlICgobGlzdF9lbXB0eSgmZGF0YS0+cXVldWUpID09IDApICYmIC0tY291bnQpIHsKKwkJZGV2X2RiZygmYm9hcmRfZGF0LT5wZGV2LT5kZXYsICIlcyA6cXVldWUgbm90IGVtcHR5XG4iLAorCQkJX19mdW5jX18pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5sb2NrLCBmbGFncyk7CisJCW1zbGVlcChQQ0hfU0xFRVBfVElNRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhLT5sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKKworCXBjaF9zcGlfZnJlZV9yZXNvdXJjZXMoYm9hcmRfZGF0LCBkYXRhKTsKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgJiBmcmVlIElSUSAqLworCWlmIChkYXRhLT5pcnFfcmVnX3N0cykgeworCQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJcGNoX3NwaV9zZXRjbHJfcmVnKGRhdGEtPm1hc3RlciwgUENIX1NQQ1IsIDAsIFBDSF9BTEwpOworCQlkYXRhLT5pcnFfcmVnX3N0cyA9IGZhbHNlOworCQlmcmVlX2lycShib2FyZF9kYXQtPnBkZXYtPmlycSwgZGF0YSk7CisJfQorCisJcGNpX2lvdW5tYXAoYm9hcmRfZGF0LT5wZGV2LCBkYXRhLT5pb19yZW1hcF9hZGRyKTsKKwlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIoZGF0YS0+bWFzdGVyKTsKKwlzcGlfbWFzdGVyX3B1dChkYXRhLT5tYXN0ZXIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBsYXRfZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBwY2hfc3BpX3BkX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRfZGV2LAorCQkJICAgICAgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXU4IGNvdW50OworCXN0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgKmJvYXJkX2RhdCA9IGRldl9nZXRfcGxhdGRhdGEoJnBkX2Rldi0+ZGV2KTsKKwlzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRfZGV2KTsKKworCWRldl9kYmcoJnBkX2Rldi0+ZGV2LCAiJXMgRU5UUllcbiIsIF9fZnVuY19fKTsKKworCWlmICghYm9hcmRfZGF0KSB7CisJCWRldl9lcnIoJnBkX2Rldi0+ZGV2LAorCQkJIiVzIHBjaV9nZXRfZHJ2ZGF0YSByZXR1cm5lZCBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSBjdXJyZW50IG1lc3NhZ2UgaXMgcHJvY2Vzc2VkOgorCSAgIE9ubHkgYWZ0ZXIgdGhhdHMgZG9uZSB0aGUgdHJhbnNmZXIgd2lsbCBiZSBzdXNwZW5kZWQgKi8KKwljb3VudCA9IDI1NTsKKwl3aGlsZSAoKC0tY291bnQpID4gMCkgeworCQlpZiAoIShkYXRhLT5iY3VycmVudF9tc2dfcHJvY2Vzc2luZykpCisJCQlicmVhazsKKwkJbXNsZWVwKFBDSF9TTEVFUF9USU1FKTsKKwl9CisKKwkvKiBGcmVlIElSUSAqLworCWlmIChkYXRhLT5pcnFfcmVnX3N0cykgeworCQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCXBjaF9zcGlfc2V0Y2xyX3JlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TUENSLCAwLCBQQ0hfQUxMKTsKKwkJcGNoX3NwaV9yZXNldChkYXRhLT5tYXN0ZXIpOworCQlmcmVlX2lycShib2FyZF9kYXQtPnBkZXYtPmlycSwgZGF0YSk7CisKKwkJZGF0YS0+aXJxX3JlZ19zdHMgPSBmYWxzZTsKKwkJZGV2X2RiZygmcGRfZGV2LT5kZXYsCisJCQkiJXMgZnJlZV9pcnEgaW52b2tlZCBzdWNjZXNzZnVsbHkuXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNoX3NwaV9wZF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRfZGV2KQoreworCXN0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgKmJvYXJkX2RhdCA9IGRldl9nZXRfcGxhdGRhdGEoJnBkX2Rldi0+ZGV2KTsKKwlzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRfZGV2KTsKKwlpbnQgcmV0dmFsOworCisJaWYgKCFib2FyZF9kYXQpIHsKKwkJZGV2X2VycigmcGRfZGV2LT5kZXYsCisJCQkiJXMgcGNpX2dldF9kcnZkYXRhIHJldHVybmVkIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCFkYXRhLT5pcnFfcmVnX3N0cykgeworCQkvKiByZWdpc3RlciBJUlEgKi8KKwkJcmV0dmFsID0gcmVxdWVzdF9pcnEoYm9hcmRfZGF0LT5wZGV2LT5pcnEsIHBjaF9zcGlfaGFuZGxlciwKKwkJCQkgICAgIElSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgZGF0YSk7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlkZXZfZXJyKCZwZF9kZXYtPmRldiwKKwkJCQkiJXMgcmVxdWVzdF9pcnEgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisKKwkJLyogcmVzZXQgUENIIFNQSSBoL3cgKi8KKwkJcGNoX3NwaV9yZXNldChkYXRhLT5tYXN0ZXIpOworCQlwY2hfc3BpX3NldF9tYXN0ZXJfbW9kZShkYXRhLT5tYXN0ZXIpOworCQlkYXRhLT5pcnFfcmVnX3N0cyA9IHRydWU7CisJfQorCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcGNoX3NwaV9wZF9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgcGNoX3NwaV9wZF9yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBjaF9zcGlfcGRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInBjaC1zcGkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHBjaF9zcGlfcGRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHBjaF9zcGlfcGRfcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IHBjaF9zcGlfcGRfc3VzcGVuZCwKKwkucmVzdW1lID0gcGNoX3NwaV9wZF9yZXN1bWUKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjaF9zcGlfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgKmJvYXJkX2RhdDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZF9kZXYgPSBOVUxMOworCWludCByZXR2YWw7CisJaW50IGk7CisJc3RydWN0IHBjaF9wZF9kZXZfc2F2ZSAqcGRfZGV2X3NhdmU7CisKKwlwZF9kZXZfc2F2ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2hfcGRfZGV2X3NhdmUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkX2Rldl9zYXZlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIENhbid0IGFsbG9jYXRlIHBkX2Rldl9zYXZcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYm9hcmRfZGF0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaF9zcGlfYm9hcmRfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghYm9hcmRfZGF0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIENhbid0IGFsbG9jYXRlIGJvYXJkX2RhdFxuIiwgX19mdW5jX18pOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycl9ub19tZW07CisJfQorCisJcmV0dmFsID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBLQlVJTERfTU9ETkFNRSk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyByZXF1ZXN0X3JlZ2lvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBwY2lfcmVxdWVzdF9yZWdpb25zOworCX0KKworCWJvYXJkX2RhdC0+cGRldiA9IHBkZXY7CisJYm9hcmRfZGF0LT5udW0gPSBpZC0+ZHJpdmVyX2RhdGE7CisJcGRfZGV2X3NhdmUtPm51bSA9IGlkLT5kcml2ZXJfZGF0YTsKKwlwZF9kZXZfc2F2ZS0+Ym9hcmRfZGF0ID0gYm9hcmRfZGF0OworCisJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBwY2lfZW5hYmxlX2RldmljZTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYm9hcmRfZGF0LT5udW07IGkrKykgeworCQlwZF9kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInBjaC1zcGkiLCBpKTsKKwkJaWYgKCFwZF9kZXYpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgInBsYXRmb3JtX2RldmljZV9hbGxvYyBmYWlsZWRcbiIpOworCQkJZ290byBlcnJfcGxhdGZvcm1fZGV2aWNlOworCQl9CisJCXBkX2Rldl9zYXZlLT5wZF9zYXZlW2ldID0gcGRfZGV2OworCQlwZF9kZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCisJCXJldHZhbCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZF9kZXYsIGJvYXJkX2RhdCwKKwkJCQkJCSAgc2l6ZW9mKCpib2FyZF9kYXQpKTsKKwkJaWYgKHJldHZhbCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEgZmFpbGVkXG4iKTsKKwkJCXBsYXRmb3JtX2RldmljZV9wdXQocGRfZGV2KTsKKwkJCWdvdG8gZXJyX3BsYXRmb3JtX2RldmljZTsKKwkJfQorCisJCXJldHZhbCA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRfZGV2KTsKKwkJaWYgKHJldHZhbCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm1fZGV2aWNlX2FkZCBmYWlsZWRcbiIpOworCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZF9kZXYpOworCQkJZ290byBlcnJfcGxhdGZvcm1fZGV2aWNlOworCQl9CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHBkX2Rldl9zYXZlKTsKKworCXJldHVybiAwOworCitlcnJfcGxhdGZvcm1fZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK3BjaV9lbmFibGVfZGV2aWNlOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitwY2lfcmVxdWVzdF9yZWdpb25zOgorCWtmcmVlKGJvYXJkX2RhdCk7CitlcnJfbm9fbWVtOgorCWtmcmVlKHBkX2Rldl9zYXZlKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwY2hfc3BpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGNoX3BkX2Rldl9zYXZlICpwZF9kZXZfc2F2ZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIEVOVFJZOnBkZXY9JXBcbiIsIF9fZnVuY19fLCBwZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBwZF9kZXZfc2F2ZS0+bnVtOyBpKyspCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkX2Rldl9zYXZlLT5wZF9zYXZlW2ldKTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCWtmcmVlKHBkX2Rldl9zYXZlLT5ib2FyZF9kYXQpOworCWtmcmVlKHBkX2Rldl9zYXZlKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBwY2hfc3BpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBwY2hfcGRfZGV2X3NhdmUgKnBkX2Rldl9zYXZlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgRU5UUllcbiIsIF9fZnVuY19fKTsKKworCXBkX2Rldl9zYXZlLT5ib2FyZF9kYXQtPnN1c3BlbmRfc3RzID0gdHJ1ZTsKKworCS8qIHNhdmUgY29uZmlnIHNwYWNlICovCisJcmV0dmFsID0gcGNpX3NhdmVfc3RhdGUocGRldik7CisJaWYgKHJldHZhbCA9PSAwKSB7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QzaG90KTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBwY2lfc2F2ZV9zdGF0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHBjaF9zcGlfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCByZXR2YWw7CisJc3RydWN0IHBjaF9wZF9kZXZfc2F2ZSAqcGRfZGV2X3NhdmUgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgRU5UUllcbiIsIF9fZnVuY19fKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSIlcyBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKKworCQkvKiBzZXQgc3VzcGVuZCBzdGF0dXMgdG8gZmFsc2UgKi8KKwkJcGRfZGV2X3NhdmUtPmJvYXJkX2RhdC0+c3VzcGVuZF9zdHMgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorI2Vsc2UKKyNkZWZpbmUgcGNoX3NwaV9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgcGNoX3NwaV9yZXN1bWUgTlVMTAorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBjaF9zcGlfcGNpZGV2ID0geworCS5uYW1lID0gInBjaF9zcGkiLAorCS5pZF90YWJsZSA9IHBjaF9zcGlfcGNpZGV2X2lkLAorCS5wcm9iZSA9IHBjaF9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IHBjaF9zcGlfcmVtb3ZlLAorCS5zdXNwZW5kID0gcGNoX3NwaV9zdXNwZW5kLAorCS5yZXN1bWUgPSBwY2hfc3BpX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaF9zcGlfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwY2hfc3BpX3BkX2RyaXZlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBjaF9zcGlfcGNpZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChwY2hfc3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcGNoX3NwaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwY2hfc3BpX3BjaWRldik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBjaF9zcGlfcGRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHBjaF9zcGlfZXhpdCk7CisKK21vZHVsZV9wYXJhbSh1c2VfZG1hLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfZG1hLAorCQkgInRvIHVzZSBETUEgZm9yIGRhdGEgdHJhbnNmZXJzIHBhc3MgMSBlbHNlIDA7IGRlZmF1bHQgMSIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIEVHMjBUIFBDSC9PS0kgU0VNSUNPTkRVQ1RPUiBNTDd4eHggSU9IIFNQSSBEcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS10eHg5LmMgYi9kcml2ZXJzL3NwaS9zcGktdHh4OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYTJhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktdHh4OS5jCkBAIC0wLDAgKzEsNDcyIEBACisvKgorICogVFh4OSBTUEkgY29udHJvbGxlciBkcml2ZXIuCisgKgorICogQmFzZWQgb24gbGludXgvYXJjaC9taXBzL3R4NDkzOC90b3NoaWJhX3JidHg0OTM4L3NwaV90eHg5LmMKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFRvc2hpYmEgQ29ycG9yYXRpb24KKyAqCisgKiAyMDAzLTIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzCisgKiBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKgorICogU3VwcG9ydCBmb3IgVFg0OTM4IGluIDIuNiAtIE1hbmlzaCBMYWNod2FuaSAobWxhY2h3YW5pQG12aXN0YS5jb20pCisgKgorICogQ29udmVydCB0byBnZW5lcmljIFNQSSBmcmFtZXdvcmsgLSBBdHN1c2hpIE5lbW90byAoYW5lbW9AbWJhLm9jbi5uZS5qcCkKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisKKworI2RlZmluZSBTUElfRklGT19TSVpFIDQKKyNkZWZpbmUgU1BJX01BWF9ESVZJREVSIDB4ZmYJLyogTWF4LiB2YWx1ZSBmb3IgU1BDUjEuU0VSICovCisjZGVmaW5lIFNQSV9NSU5fRElWSURFUiAxCS8qIE1pbi4gdmFsdWUgZm9yIFNQQ1IxLlNFUiAqLworCisjZGVmaW5lIFRYeDlfU1BNQ1IJCTB4MDAKKyNkZWZpbmUgVFh4OV9TUENSMAkJMHgwNAorI2RlZmluZSBUWHg5X1NQQ1IxCQkweDA4CisjZGVmaW5lIFRYeDlfU1BGUwkJMHgwYworI2RlZmluZSBUWHg5X1NQU1IJCTB4MTQKKyNkZWZpbmUgVFh4OV9TUERSCQkweDE4CisKKy8qIFNQTUNSIDogU1BJIE1hc3RlciBDb250cm9sICovCisjZGVmaW5lIFRYeDlfU1BNQ1JfT1BNT0RFCTB4YzAKKyNkZWZpbmUgVFh4OV9TUE1DUl9DT05GSUcJMHg0MAorI2RlZmluZSBUWHg5X1NQTUNSX0FDVElWRQkweDgwCisjZGVmaW5lIFRYeDlfU1BNQ1JfU1BTVFAJMHgwMgorI2RlZmluZSBUWHg5X1NQTUNSX0JDTFIJCTB4MDEKKworLyogU1BDUjAgOiBTUEkgQ29udHJvbCAwICovCisjZGVmaW5lIFRYeDlfU1BDUjBfVFhJRkxfTUFTSwkweGMwMDAKKyNkZWZpbmUgVFh4OV9TUENSMF9SWElGTF9NQVNLCTB4MzAwMAorI2RlZmluZSBUWHg5X1NQQ1IwX1NJRElFCTB4MDgwMAorI2RlZmluZSBUWHg5X1NQQ1IwX1NPRUlFCTB4MDQwMAorI2RlZmluZSBUWHg5X1NQQ1IwX1JCU0lFCTB4MDIwMAorI2RlZmluZSBUWHg5X1NQQ1IwX1RCU0lFCTB4MDEwMAorI2RlZmluZSBUWHg5X1NQQ1IwX0lGU1BTRQkweDAwMTAKKyNkZWZpbmUgVFh4OV9TUENSMF9TQk9TCQkweDAwMDQKKyNkZWZpbmUgVFh4OV9TUENSMF9TUEhBCQkweDAwMDIKKyNkZWZpbmUgVFh4OV9TUENSMF9TUE9MCQkweDAwMDEKKworLyogU1BTUiA6IFNQSSBTdGF0dXMgKi8KKyNkZWZpbmUgVFh4OV9TUFNSX1RCU0kJCTB4ODAwMAorI2RlZmluZSBUWHg5X1NQU1JfUkJTSQkJMHg0MDAwCisjZGVmaW5lIFRYeDlfU1BTUl9UQlNfTUFTSwkweDM4MDAKKyNkZWZpbmUgVFh4OV9TUFNSX1JCU19NQVNLCTB4MDcwMAorI2RlZmluZSBUWHg5X1NQU1JfU1BPRQkJMHgwMDgwCisjZGVmaW5lIFRYeDlfU1BTUl9JRlNECQkweDAwMDgKKyNkZWZpbmUgVFh4OV9TUFNSX1NJRExFCQkweDAwMDQKKyNkZWZpbmUgVFh4OV9TUFNSX1NUUkRZCQkweDAwMDIKKyNkZWZpbmUgVFh4OV9TUFNSX1NSUkRZCQkweDAwMDEKKworCitzdHJ1Y3QgdHh4OXNwaSB7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKndvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzcGlubG9ja190IGxvY2s7CS8qIHByb3RlY3QgJ3F1ZXVlJyAqLworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CisJdm9pZCBfX2lvbWVtICptZW1iYXNlOworCWludCBiYXNlY2xrOworCXN0cnVjdCBjbGsgKmNsazsKKwl1MzIgbWF4X3NwZWVkX2h6LCBtaW5fc3BlZWRfaHo7CisJaW50IGxhc3RfY2hpcHNlbGVjdDsKKwlpbnQgbGFzdF9jaGlwc2VsZWN0X3ZhbDsKK307CisKK3N0YXRpYyB1MzIgdHh4OXNwaV9yZChzdHJ1Y3QgdHh4OXNwaSAqYywgaW50IHJlZykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoYy0+bWVtYmFzZSArIHJlZyk7Cit9CitzdGF0aWMgdm9pZCB0eHg5c3BpX3dyKHN0cnVjdCB0eHg5c3BpICpjLCB1MzIgdmFsLCBpbnQgcmVnKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIGMtPm1lbWJhc2UgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCB0eHg5c3BpX2NzX2Z1bmMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHR4eDlzcGkgKmMsCisJCWludCBvbiwgdW5zaWduZWQgaW50IGNzX2RlbGF5KQoreworCWludCB2YWwgPSAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpID8gb24gOiAhb247CisJaWYgKG9uKSB7CisJCS8qIGRlc2VsZWN0IHRoZSBjaGlwIHdpdGggY3NfY2hhbmdlIGhpbnQgaW4gbGFzdCB0cmFuc2ZlciAqLworCQlpZiAoYy0+bGFzdF9jaGlwc2VsZWN0ID49IDApCisJCQlncGlvX3NldF92YWx1ZShjLT5sYXN0X2NoaXBzZWxlY3QsCisJCQkJCSFjLT5sYXN0X2NoaXBzZWxlY3RfdmFsKTsKKwkJYy0+bGFzdF9jaGlwc2VsZWN0ID0gc3BpLT5jaGlwX3NlbGVjdDsKKwkJYy0+bGFzdF9jaGlwc2VsZWN0X3ZhbCA9IHZhbDsKKwl9IGVsc2UgeworCQljLT5sYXN0X2NoaXBzZWxlY3QgPSAtMTsKKwkJbmRlbGF5KGNzX2RlbGF5KTsJLyogQ1MgSG9sZCBUaW1lICovCisJfQorCWdwaW9fc2V0X3ZhbHVlKHNwaS0+Y2hpcF9zZWxlY3QsIHZhbCk7CisJbmRlbGF5KGNzX2RlbGF5KTsJLyogQ1MgU2V0dXAgVGltZSAvIENTIFJlY292ZXJ5IFRpbWUgKi8KK30KKworc3RhdGljIGludCB0eHg5c3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHR4eDlzcGkgKmMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1OCBiaXRzX3Blcl93b3JkOworCisJaWYgKCFzcGktPm1heF9zcGVlZF9oegorCQkJfHwgc3BpLT5tYXhfc3BlZWRfaHogPiBjLT5tYXhfc3BlZWRfaHoKKwkJCXx8IHNwaS0+bWF4X3NwZWVkX2h6IDwgYy0+bWluX3NwZWVkX2h6KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisJaWYgKGJpdHNfcGVyX3dvcmQgIT0gOCAmJiBiaXRzX3Blcl93b3JkICE9IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3BpLT5jaGlwX3NlbGVjdCwKKwkJCSEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIkNhbm5vdCBzZXR1cCBHUElPIGZvciBjaGlwc2VsZWN0LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGRlc2VsZWN0IGNoaXAgKi8KKwlzcGluX2xvY2soJmMtPmxvY2spOworCXR4eDlzcGlfY3NfZnVuYyhzcGksIGMsIDAsIChOU0VDX1BFUl9TRUMgLyAyKSAvIHNwaS0+bWF4X3NwZWVkX2h6KTsKKwlzcGluX3VubG9jaygmYy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHR4eDlzcGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgdHh4OXNwaSAqYyA9IGRldl9pZDsKKworCS8qIGRpc2FibGUgcnggaW50ciAqLworCXR4eDlzcGlfd3IoYywgdHh4OXNwaV9yZChjLCBUWHg5X1NQQ1IwKSAmIH5UWHg5X1NQQ1IwX1JCU0lFLAorCQkJVFh4OV9TUENSMCk7CisJd2FrZV91cCgmYy0+d2FpdHEpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgdHh4OXNwaV93b3JrX29uZShzdHJ1Y3QgdHh4OXNwaSAqYywgc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBtLT5zcGk7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKKwl1bnNpZ25lZCBpbnQgY3NfZGVsYXk7CisJdW5zaWduZWQgaW50IGNzX2NoYW5nZSA9IDE7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIG1jcjsKKwl1MzIgcHJldl9zcGVlZF9oeiA9IDA7CisJdTggcHJldl9iaXRzX3Blcl93b3JkID0gMDsKKworCS8qIENTIHNldHVwL2hvbGQvcmVjb3ZlcnkgdGltZSBpbiBuc2VjICovCisJY3NfZGVsYXkgPSAxMDAgKyAoTlNFQ19QRVJfU0VDIC8gMikgLyBzcGktPm1heF9zcGVlZF9oejsKKworCW1jciA9IHR4eDlzcGlfcmQoYywgVFh4OV9TUE1DUik7CisJaWYgKHVubGlrZWx5KChtY3IgJiBUWHg5X1NQTUNSX09QTU9ERSkgPT0gVFh4OV9TUE1DUl9BQ1RJVkUpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiQmFkIG1vZGUuXG4iKTsKKwkJc3RhdHVzID0gLUVJTzsKKwkJZ290byBleGl0OworCX0KKwltY3IgJj0gfihUWHg5X1NQTUNSX09QTU9ERSB8IFRYeDlfU1BNQ1JfU1BTVFAgfCBUWHg5X1NQTUNSX0JDTFIpOworCisJLyogZW50ZXIgY29uZmlnIG1vZGUgKi8KKwl0eHg5c3BpX3dyKGMsIG1jciB8IFRYeDlfU1BNQ1JfQ09ORklHIHwgVFh4OV9TUE1DUl9CQ0xSLCBUWHg5X1NQTUNSKTsKKwl0eHg5c3BpX3dyKGMsIFRYeDlfU1BDUjBfU0JPUworCQkJfCAoKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSA/IFRYeDlfU1BDUjBfU1BPTCA6IDApCisJCQl8ICgoc3BpLT5tb2RlICYgU1BJX0NQSEEpID8gVFh4OV9TUENSMF9TUEhBIDogMCkKKwkJCXwgMHgwOCwKKwkJCVRYeDlfU1BDUjApOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQljb25zdCB2b2lkICp0eGJ1ZiA9IHQtPnR4X2J1ZjsKKwkJdm9pZCAqcnhidWYgPSB0LT5yeF9idWY7CisJCXUzMiBkYXRhOworCQl1bnNpZ25lZCBpbnQgbGVuID0gdC0+bGVuOworCQl1bnNpZ25lZCBpbnQgd3NpemU7CisJCXUzMiBzcGVlZF9oeiA9IHQtPnNwZWVkX2h6ID8gOiBzcGktPm1heF9zcGVlZF9oejsKKwkJdTggYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKKworCQliaXRzX3Blcl93b3JkID0gYml0c19wZXJfd29yZCA/IDogODsKKwkJd3NpemUgPSBiaXRzX3Blcl93b3JkID4+IDM7IC8qIGluIGJ5dGVzICovCisKKwkJaWYgKHByZXZfc3BlZWRfaHogIT0gc3BlZWRfaHoKKwkJCQl8fCBwcmV2X2JpdHNfcGVyX3dvcmQgIT0gYml0c19wZXJfd29yZCkgeworCQkJaW50IG4gPSBESVZfUk9VTkRfVVAoYy0+YmFzZWNsaywgc3BlZWRfaHopIC0gMTsKKwkJCW4gPSBjbGFtcChuLCBTUElfTUlOX0RJVklERVIsIFNQSV9NQVhfRElWSURFUik7CisJCQkvKiBlbnRlciBjb25maWcgbW9kZSAqLworCQkJdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0NPTkZJRyB8IFRYeDlfU1BNQ1JfQkNMUiwKKwkJCQkJVFh4OV9TUE1DUik7CisJCQl0eHg5c3BpX3dyKGMsIChuIDw8IDgpIHwgYml0c19wZXJfd29yZCwgVFh4OV9TUENSMSk7CisJCQkvKiBlbnRlciBhY3RpdmUgbW9kZSAqLworCQkJdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0FDVElWRSwgVFh4OV9TUE1DUik7CisKKwkJCXByZXZfc3BlZWRfaHogPSBzcGVlZF9oejsKKwkJCXByZXZfYml0c19wZXJfd29yZCA9IGJpdHNfcGVyX3dvcmQ7CisJCX0KKworCQlpZiAoY3NfY2hhbmdlKQorCQkJdHh4OXNwaV9jc19mdW5jKHNwaSwgYywgMSwgY3NfZGVsYXkpOworCQljc19jaGFuZ2UgPSB0LT5jc19jaGFuZ2U7CisJCXdoaWxlIChsZW4pIHsKKwkJCXVuc2lnbmVkIGludCBjb3VudCA9IFNQSV9GSUZPX1NJWkU7CisJCQlpbnQgaTsKKwkJCXUzMiBjcjA7CisKKwkJCWlmIChsZW4gPCBjb3VudCAqIHdzaXplKQorCQkJCWNvdW50ID0gbGVuIC8gd3NpemU7CisJCQkvKiBub3cgdHggbXVzdCBiZSBpZGxlLi4uICovCisJCQl3aGlsZSAoISh0eHg5c3BpX3JkKGMsIFRYeDlfU1BTUikgJiBUWHg5X1NQU1JfU0lETEUpKQorCQkJCWNwdV9yZWxheCgpOworCQkJY3IwID0gdHh4OXNwaV9yZChjLCBUWHg5X1NQQ1IwKTsKKwkJCWNyMCAmPSB+VFh4OV9TUENSMF9SWElGTF9NQVNLOworCQkJY3IwIHw9IChjb3VudCAtIDEpIDw8IDEyOworCQkJLyogZW5hYmxlIHJ4IGludHIgKi8KKwkJCWNyMCB8PSBUWHg5X1NQQ1IwX1JCU0lFOworCQkJdHh4OXNwaV93cihjLCBjcjAsIFRYeDlfU1BDUjApOworCQkJLyogc2VuZCAqLworCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQlpZiAodHhidWYpIHsKKwkJCQkJZGF0YSA9ICh3c2l6ZSA9PSAxKQorCQkJCQkJPyAqKGNvbnN0IHU4ICopdHhidWYKKwkJCQkJCTogKihjb25zdCB1MTYgKil0eGJ1ZjsKKwkJCQkJdHh4OXNwaV93cihjLCBkYXRhLCBUWHg5X1NQRFIpOworCQkJCQl0eGJ1ZiArPSB3c2l6ZTsKKwkJCQl9IGVsc2UKKwkJCQkJdHh4OXNwaV93cihjLCAwLCBUWHg5X1NQRFIpOworCQkJfQorCQkJLyogd2FpdCBhbGwgcnggZGF0YSAqLworCQkJd2FpdF9ldmVudChjLT53YWl0cSwKKwkJCQl0eHg5c3BpX3JkKGMsIFRYeDlfU1BTUikgJiBUWHg5X1NQU1JfUkJTSSk7CisJCQkvKiByZWNlaXZlICovCisJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJCWRhdGEgPSB0eHg5c3BpX3JkKGMsIFRYeDlfU1BEUik7CisJCQkJaWYgKHJ4YnVmKSB7CisJCQkJCWlmICh3c2l6ZSA9PSAxKQorCQkJCQkJKih1OCAqKXJ4YnVmID0gZGF0YTsKKwkJCQkJZWxzZQorCQkJCQkJKih1MTYgKilyeGJ1ZiA9IGRhdGE7CisJCQkJCXJ4YnVmICs9IHdzaXplOworCQkJCX0KKwkJCX0KKwkJCWxlbiAtPSBjb3VudCAqIHdzaXplOworCQl9CisJCW0tPmFjdHVhbF9sZW5ndGggKz0gdC0+bGVuOworCQlpZiAodC0+ZGVsYXlfdXNlY3MpCisJCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOworCisJCWlmICghY3NfY2hhbmdlKQorCQkJY29udGludWU7CisJCWlmICh0LT50cmFuc2Zlcl9saXN0Lm5leHQgPT0gJm0tPnRyYW5zZmVycykKKwkJCWJyZWFrOworCQkvKiBzb21ldGltZXMgYSBzaG9ydCBtaWQtbWVzc2FnZSBkZXNlbGVjdCBvZiB0aGUgY2hpcAorCQkgKiBtYXkgYmUgbmVlZGVkIHRvIHRlcm1pbmF0ZSBhIG1vZGUgb3IgY29tbWFuZAorCQkgKi8KKwkJdHh4OXNwaV9jc19mdW5jKHNwaSwgYywgMCwgY3NfZGVsYXkpOworCX0KKworZXhpdDoKKwltLT5zdGF0dXMgPSBzdGF0dXM7CisJbS0+Y29tcGxldGUobS0+Y29udGV4dCk7CisKKwkvKiBub3JtYWxseSBkZWFjdGl2YXRlIGNoaXBzZWxlY3QgLi4uIHVubGVzcyBubyBlcnJvciBhbmQKKwkgKiBjc19jaGFuZ2UgaGFzIGhpbnRlZCB0aGF0IHRoZSBuZXh0IG1lc3NhZ2Ugd2lsbCBwcm9iYWJseQorCSAqIGJlIGZvciB0aGlzIGNoaXAgdG9vLgorCSAqLworCWlmICghKHN0YXR1cyA9PSAwICYmIGNzX2NoYW5nZSkpCisJCXR4eDlzcGlfY3NfZnVuYyhzcGksIGMsIDAsIGNzX2RlbGF5KTsKKworCS8qIGVudGVyIGNvbmZpZyBtb2RlICovCisJdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0NPTkZJRyB8IFRYeDlfU1BNQ1JfQkNMUiwgVFh4OV9TUE1DUik7Cit9CisKK3N0YXRpYyB2b2lkIHR4eDlzcGlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHR4eDlzcGkgKmMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHR4eDlzcGksIHdvcmspOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+bG9jaywgZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmYy0+cXVldWUpKSB7CisJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbTsKKworCQltID0gY29udGFpbmVyX29mKGMtPnF1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOworCQlsaXN0X2RlbF9pbml0KCZtLT5xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmxvY2ssIGZsYWdzKTsKKworCQl0eHg5c3BpX3dvcmtfb25lKGMsIG0pOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjLT5sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0eHg5c3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpLT5tYXN0ZXI7CisJc3RydWN0IHR4eDlzcGkgKmMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbS0+YWN0dWFsX2xlbmd0aCA9IDA7CisKKwkvKiBjaGVjayBlYWNoIHRyYW5zZmVyJ3MgcGFyYW1ldGVycyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJdTMyIHNwZWVkX2h6ID0gdC0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OworCQl1OCBiaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZCA/IDogc3BpLT5iaXRzX3Blcl93b3JkOworCisJCWJpdHNfcGVyX3dvcmQgPSBiaXRzX3Blcl93b3JkID8gOiA4OworCQlpZiAoIXQtPnR4X2J1ZiAmJiAhdC0+cnhfYnVmICYmIHQtPmxlbikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoYml0c19wZXJfd29yZCAhPSA4ICYmIGJpdHNfcGVyX3dvcmQgIT0gMTYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHQtPmxlbiAmICgoYml0c19wZXJfd29yZCA+PiAzKSAtIDEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChzcGVlZF9oeiA8IGMtPm1pbl9zcGVlZF9oeiB8fCBzcGVlZF9oeiA+IGMtPm1heF9zcGVlZF9oeikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZjLT5xdWV1ZSk7CisJcXVldWVfd29yayhjLT53b3JrcXVldWUsICZjLT53b3JrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgdHh4OXNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3QgdHh4OXNwaSAqYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKwl1MzIgbWNyOworCWludCBpcnE7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZkZXYtPmRldiwgc2l6ZW9mKCpjKSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiByZXQ7CisJYyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7CisKKwlJTklUX1dPUksoJmMtPndvcmssIHR4eDlzcGlfd29yayk7CisJc3Bpbl9sb2NrX2luaXQoJmMtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZjLT5xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+d2FpdHEpOworCisJYy0+Y2xrID0gY2xrX2dldCgmZGV2LT5kZXYsICJzcGktYmFzZWNsayIpOworCWlmIChJU19FUlIoYy0+Y2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKGMtPmNsayk7CisJCWMtPmNsayA9IE5VTEw7CisJCWdvdG8gZXhpdDsKKwl9CisJcmV0ID0gY2xrX2VuYWJsZShjLT5jbGspOworCWlmIChyZXQpIHsKKwkJY2xrX3B1dChjLT5jbGspOworCQljLT5jbGsgPSBOVUxMOworCQlnb3RvIGV4aXQ7CisJfQorCWMtPmJhc2VjbGsgPSBjbGtfZ2V0X3JhdGUoYy0+Y2xrKTsKKwljLT5taW5fc3BlZWRfaHogPSBESVZfUk9VTkRfVVAoYy0+YmFzZWNsaywgU1BJX01BWF9ESVZJREVSICsgMSk7CisJYy0+bWF4X3NwZWVkX2h6ID0gYy0+YmFzZWNsayAvIChTUElfTUlOX0RJVklERVIgKyAxKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJZ290byBleGl0X2J1c3k7CisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKKwkJCQkgICAgICJzcGlfdHh4OSIpKQorCQlnb3RvIGV4aXRfYnVzeTsKKwljLT5tZW1iYXNlID0gZGV2bV9pb3JlbWFwKCZkZXYtPmRldiwgcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIWMtPm1lbWJhc2UpCisJCWdvdG8gZXhpdF9idXN5OworCisJLyogZW50ZXIgY29uZmlnIG1vZGUgKi8KKwltY3IgPSB0eHg5c3BpX3JkKGMsIFRYeDlfU1BNQ1IpOworCW1jciAmPSB+KFRYeDlfU1BNQ1JfT1BNT0RFIHwgVFh4OV9TUE1DUl9TUFNUUCB8IFRYeDlfU1BNQ1JfQkNMUik7CisJdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0NPTkZJRyB8IFRYeDlfU1BNQ1JfQkNMUiwgVFh4OV9TUE1DUik7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKGRldiwgMCk7CisJaWYgKGlycSA8IDApCisJCWdvdG8gZXhpdF9idXN5OworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJmRldi0+ZGV2LCBpcnEsIHR4eDlzcGlfaW50ZXJydXB0LCAwLAorCQkJICAgICAgICJzcGlfdHh4OSIsIGMpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdDsKKworCWMtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAorCQkJCWRldl9uYW1lKG1hc3Rlci0+ZGV2LnBhcmVudCkpOworCWlmICghYy0+d29ya3F1ZXVlKQorCQlnb3RvIGV4aXRfYnVzeTsKKwljLT5sYXN0X2NoaXBzZWxlY3QgPSAtMTsKKworCWRldl9pbmZvKCZkZXYtPmRldiwgImF0ICUjbGx4LCBpcnEgJWQsICVkTUh6XG4iLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LCBpcnEsCisJCSAoYy0+YmFzZWNsayArIDUwMDAwMCkgLyAxMDAwMDAwKTsKKworCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NTX0hJR0ggfCBTUElfQ1BPTCB8IFNQSV9DUEhBOworCisJbWFzdGVyLT5idXNfbnVtID0gZGV2LT5pZDsKKwltYXN0ZXItPnNldHVwID0gdHh4OXNwaV9zZXR1cDsKKwltYXN0ZXItPnRyYW5zZmVyID0gdHh4OXNwaV90cmFuc2ZlcjsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gKHUxNilVSU5UX01BWDsgLyogYW55IEdQSU8gbnVtYmVycyAqLworCisJcmV0ID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdDsKKwlyZXR1cm4gMDsKK2V4aXRfYnVzeToKKwlyZXQgPSAtRUJVU1k7CitleGl0OgorCWlmIChjLT53b3JrcXVldWUpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGMtPndvcmtxdWV1ZSk7CisJaWYgKGMtPmNsaykgeworCQljbGtfZGlzYWJsZShjLT5jbGspOworCQljbGtfcHV0KGMtPmNsayk7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCB0eHg5c3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCB0eHg5c3BpICpjID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShjLT53b3JrcXVldWUpOworCWNsa19kaXNhYmxlKGMtPmNsayk7CisJY2xrX3B1dChjLT5jbGspOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKKy8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzcGlfdHh4OSIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0eHg5c3BpX2RyaXZlciA9IHsKKwkucmVtb3ZlID0gX19leGl0X3AodHh4OXNwaV9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInNwaV90eHg5IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR4eDlzcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnR4eDlzcGlfZHJpdmVyLCB0eHg5c3BpX3Byb2JlKTsKK30KK3N1YnN5c19pbml0Y2FsbCh0eHg5c3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdHh4OXNwaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnR4eDlzcGlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHR4eDlzcGlfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVFh4OSBTUEkgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS94aWxpbnhfc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGkteGlsaW54LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3BpL3hpbGlueF9zcGkuYwpyZW5hbWUgdG8gZHJpdmVycy9zcGkvc3BpLXhpbGlueC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS5jCmluZGV4IDJlMTNhMTQuLjRkMWI5ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIHNwaS5jIC0gU1BJIGluaXQvY29yZSBjb2RlCisgKiBTUEkgaW5pdC9jb3JlIGNvZGUKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgQnJvd25lbGwKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfYmZpbjV4eC5jIGIvZHJpdmVycy9zcGkvc3BpX2JmaW41eHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwNmRiYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfYmZpbjV4eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUzMCArMCwwIEBACi0vKgotICogQmxhY2tmaW4gT24tQ2hpcCBTUEkgRHJpdmVyCi0gKgotICogQ29weXJpZ2h0IDIwMDQtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLQotI2RlZmluZSBEUlZfTkFNRQkiYmZpbi1zcGkiCi0jZGVmaW5lIERSVl9BVVRIT1IJIkJyeWFuIFd1LCBMdWtlIFlhbmciCi0jZGVmaW5lIERSVl9ERVNDCSJCbGFja2ZpbiBvbi1jaGlwIFNQSSBDb250cm9sbGVyIERyaXZlciIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMCIKLQotTU9EVUxFX0FVVEhPUihEUlZfQVVUSE9SKTsKLU1PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQyk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSNkZWZpbmUgU1RBUlRfU1RBVEUJKCh2b2lkICopMCkKLSNkZWZpbmUgUlVOTklOR19TVEFURQkoKHZvaWQgKikxKQotI2RlZmluZSBET05FX1NUQVRFCSgodm9pZCAqKTIpCi0jZGVmaW5lIEVSUk9SX1NUQVRFCSgodm9pZCAqKS0xKQotCi1zdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGE7Ci0KLXN0cnVjdCBiZmluX3NwaV90cmFuc2Zlcl9vcHMgewotCXZvaWQgKCp3cml0ZSkgKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqKTsKLQl2b2lkICgqcmVhZCkgKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqKTsKLQl2b2lkICgqZHVwbGV4KSAoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICopOwotfTsKLQotc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhIHsKLQkvKiBEcml2ZXIgbW9kZWwgaG9va3VwICovCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQotCS8qIFNQSSBmcmFtZXdvcmsgaG9va3VwICovCi0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKLQotCS8qIFJlZ3MgYmFzZSBvZiBTUEkgY29udHJvbGxlciAqLwotCXZvaWQgX19pb21lbSAqcmVnc19iYXNlOwotCi0JLyogUGluIHJlcXVlc3QgbGlzdCAqLwotCXUxNiAqcGluX3JlcTsKLQotCS8qIEJGSU4gaG9va3VwICovCi0Jc3RydWN0IGJmaW41eHhfc3BpX21hc3RlciAqbWFzdGVyX2luZm87Ci0KLQkvKiBEcml2ZXIgbWVzc2FnZSBxdWV1ZSAqLwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHB1bXBfbWVzc2FnZXM7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7Ci0JaW50IGJ1c3k7Ci0JYm9vbCBydW5uaW5nOwotCi0JLyogTWVzc2FnZSBUcmFuc2ZlciBwdW1wICovCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHB1bXBfdHJhbnNmZXJzOwotCi0JLyogQ3VycmVudCBtZXNzYWdlIHRyYW5zZmVyIHN0YXRlIGluZm8gKi8KLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKmN1cl9tc2c7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqY3VyX3RyYW5zZmVyOwotCXN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjdXJfY2hpcDsKLQlzaXplX3QgbGVuX2luX2J5dGVzOwotCXNpemVfdCBsZW47Ci0Jdm9pZCAqdHg7Ci0Jdm9pZCAqdHhfZW5kOwotCXZvaWQgKnJ4OwotCXZvaWQgKnJ4X2VuZDsKLQotCS8qIERNQSBzdHVmZnMgKi8KLQlpbnQgZG1hX2NoYW5uZWw7Ci0JaW50IGRtYV9tYXBwZWQ7Ci0JaW50IGRtYV9yZXF1ZXN0ZWQ7Ci0JZG1hX2FkZHJfdCByeF9kbWE7Ci0JZG1hX2FkZHJfdCB0eF9kbWE7Ci0KLQlpbnQgaXJxX3JlcXVlc3RlZDsKLQlpbnQgc3BpX2lycTsKLQotCXNpemVfdCByeF9tYXBfbGVuOwotCXNpemVfdCB0eF9tYXBfbGVuOwotCXU4IG5fYnl0ZXM7Ci0JdTE2IGN0cmxfcmVnOwotCXUxNiBmbGFnX3JlZzsKLQotCWludCBjc19jaGFuZ2U7Ci0JY29uc3Qgc3RydWN0IGJmaW5fc3BpX3RyYW5zZmVyX29wcyAqb3BzOwotfTsKLQotc3RydWN0IGJmaW5fc3BpX3NsYXZlX2RhdGEgewotCXUxNiBjdGxfcmVnOwotCXUxNiBiYXVkOwotCXUxNiBmbGFnOwotCi0JdTggY2hpcF9zZWxlY3RfbnVtOwotCXU4IGVuYWJsZV9kbWE7Ci0JdTE2IGNzX2NoZ191ZGVsYXk7CS8qIFNvbWUgZGV2aWNlcyByZXF1aXJlID4gMjU1dXNlYyBkZWxheSAqLwotCXUzMiBjc19ncGlvOwotCXUxNiBpZGxlX3R4X3ZhbDsKLQl1OCBwaW9faW50ZXJydXB0OwkvKiB1c2Ugc3BpIGRhdGEgaXJxICovCi0JY29uc3Qgc3RydWN0IGJmaW5fc3BpX3RyYW5zZmVyX29wcyAqb3BzOwotfTsKLQotI2RlZmluZSBERUZJTkVfU1BJX1JFRyhyZWcsIG9mZikgXAotc3RhdGljIGlubGluZSB1MTYgcmVhZF8jI3JlZyhzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKSBcCi0JeyByZXR1cm4gYmZpbl9yZWFkMTYoZHJ2X2RhdGEtPnJlZ3NfYmFzZSArIG9mZik7IH0gXAotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlXyMjcmVnKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEsIHUxNiB2KSBcCi0JeyBiZmluX3dyaXRlMTYoZHJ2X2RhdGEtPnJlZ3NfYmFzZSArIG9mZiwgdik7IH0KLQotREVGSU5FX1NQSV9SRUcoQ1RSTCwgMHgwMCkKLURFRklORV9TUElfUkVHKEZMQUcsIDB4MDQpCi1ERUZJTkVfU1BJX1JFRyhTVEFULCAweDA4KQotREVGSU5FX1NQSV9SRUcoVERCUiwgMHgwQykKLURFRklORV9TUElfUkVHKFJEQlIsIDB4MTApCi1ERUZJTkVfU1BJX1JFRyhCQVVELCAweDE0KQotREVGSU5FX1NQSV9SRUcoU0hBVywgMHgxOCkKLQotc3RhdGljIHZvaWQgYmZpbl9zcGlfZW5hYmxlKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCi17Ci0JdTE2IGNyOwotCi0JY3IgPSByZWFkX0NUUkwoZHJ2X2RhdGEpOwotCXdyaXRlX0NUUkwoZHJ2X2RhdGEsIChjciB8IEJJVF9DVExfRU5BQkxFKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJmaW5fc3BpX2Rpc2FibGUoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSkKLXsKLQl1MTYgY3I7Ci0KLQljciA9IHJlYWRfQ1RSTChkcnZfZGF0YSk7Ci0Jd3JpdGVfQ1RSTChkcnZfZGF0YSwgKGNyICYgKH5CSVRfQ1RMX0VOQUJMRSkpKTsKLX0KLQotLyogQ2FjdWxhdGUgdGhlIFNQSV9CQVVEIHJlZ2lzdGVyIHZhbHVlIGJhc2VkIG9uIGlucHV0IEhaICovCi1zdGF0aWMgdTE2IGh6X3RvX3NwaV9iYXVkKHUzMiBzcGVlZF9oeikKLXsKLQl1X2xvbmcgc2NsayA9IGdldF9zY2xrKCk7Ci0JdTE2IHNwaV9iYXVkID0gKHNjbGsgLyAoMiAqIHNwZWVkX2h6KSk7Ci0KLQlpZiAoKHNjbGsgJSAoMiAqIHNwZWVkX2h6KSkgPiAwKQotCQlzcGlfYmF1ZCsrOwotCi0JaWYgKHNwaV9iYXVkIDwgTUlOX1NQSV9CQVVEX1ZBTCkKLQkJc3BpX2JhdWQgPSBNSU5fU1BJX0JBVURfVkFMOwotCi0JcmV0dXJuIHNwaV9iYXVkOwotfQotCi1zdGF0aWMgaW50IGJmaW5fc3BpX2ZsdXNoKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBsaW1pdCA9IGxvb3BzX3Blcl9qaWZmeSA8PCAxOwotCi0JLyogd2FpdCBmb3Igc3RvcCBhbmQgY2xlYXIgc3RhdCAqLwotCXdoaWxlICghKHJlYWRfU1RBVChkcnZfZGF0YSkgJiBCSVRfU1RBVF9TUElGKSAmJiAtLWxpbWl0KQotCQljcHVfcmVsYXgoKTsKLQotCXdyaXRlX1NUQVQoZHJ2X2RhdGEsIEJJVF9TVEFUX0NMUik7Ci0KLQlyZXR1cm4gbGltaXQ7Ci19Ci0KLS8qIENoaXAgc2VsZWN0IG9wZXJhdGlvbiBmdW5jdGlvbnMgZm9yIGNzX2NoYW5nZSBmbGFnICovCi1zdGF0aWMgdm9pZCBiZmluX3NwaV9jc19hY3RpdmUoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSwgc3RydWN0IGJmaW5fc3BpX3NsYXZlX2RhdGEgKmNoaXApCi17Ci0JaWYgKGxpa2VseShjaGlwLT5jaGlwX3NlbGVjdF9udW0gPCBNQVhfQ1RSTF9DUykpIHsKLQkJdTE2IGZsYWcgPSByZWFkX0ZMQUcoZHJ2X2RhdGEpOwotCi0JCWZsYWcgJj0gfmNoaXAtPmZsYWc7Ci0KLQkJd3JpdGVfRkxBRyhkcnZfZGF0YSwgZmxhZyk7Ci0JfSBlbHNlIHsKLQkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+Y3NfZ3BpbywgMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBiZmluX3NwaV9jc19kZWFjdGl2ZShzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmaW5fc3BpX3NsYXZlX2RhdGEgKmNoaXApCi17Ci0JaWYgKGxpa2VseShjaGlwLT5jaGlwX3NlbGVjdF9udW0gPCBNQVhfQ1RSTF9DUykpIHsKLQkJdTE2IGZsYWcgPSByZWFkX0ZMQUcoZHJ2X2RhdGEpOwotCi0JCWZsYWcgfD0gY2hpcC0+ZmxhZzsKLQotCQl3cml0ZV9GTEFHKGRydl9kYXRhLCBmbGFnKTsKLQl9IGVsc2UgewotCQlncGlvX3NldF92YWx1ZShjaGlwLT5jc19ncGlvLCAxKTsKLQl9Ci0KLQkvKiBNb3ZlIGRlbGF5IGhlcmUgZm9yIGNvbnNpc3RlbmN5ICovCi0JaWYgKGNoaXAtPmNzX2NoZ191ZGVsYXkpCi0JCXVkZWxheShjaGlwLT5jc19jaGdfdWRlbGF5KTsKLX0KLQotLyogZW5hYmxlIG9yIGRpc2FibGUgdGhlIHBpbiBtdXhlZCBieSBHUElPIGFuZCBTUEkgQ1MgdG8gd29yayBhcyBTUEkgQ1MgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBiZmluX3NwaV9jc19lbmFibGUoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmaW5fc3BpX3NsYXZlX2RhdGEgKmNoaXApCi17Ci0JaWYgKGNoaXAtPmNoaXBfc2VsZWN0X251bSA8IE1BWF9DVFJMX0NTKSB7Ci0JCXUxNiBmbGFnID0gcmVhZF9GTEFHKGRydl9kYXRhKTsKLQotCQlmbGFnIHw9IChjaGlwLT5mbGFnID4+IDgpOwotCi0JCXdyaXRlX0ZMQUcoZHJ2X2RhdGEsIGZsYWcpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJmaW5fc3BpX2NzX2Rpc2FibGUoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjaGlwKQotewotCWlmIChjaGlwLT5jaGlwX3NlbGVjdF9udW0gPCBNQVhfQ1RSTF9DUykgewotCQl1MTYgZmxhZyA9IHJlYWRfRkxBRyhkcnZfZGF0YSk7Ci0KLQkJZmxhZyAmPSB+KGNoaXAtPmZsYWcgPj4gOCk7Ci0KLQkJd3JpdGVfRkxBRyhkcnZfZGF0YSwgZmxhZyk7Ci0JfQotfQotCi0vKiBzdG9wIGNvbnRyb2xsZXIgYW5kIHJlLWNvbmZpZyBjdXJyZW50IGNoaXAqLwotc3RhdGljIHZvaWQgYmZpbl9zcGlfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQotewotCXN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjaGlwID0gZHJ2X2RhdGEtPmN1cl9jaGlwOwotCi0JLyogQ2xlYXIgc3RhdHVzIGFuZCBkaXNhYmxlIGNsb2NrICovCi0Jd3JpdGVfU1RBVChkcnZfZGF0YSwgQklUX1NUQVRfQ0xSKTsKLQliZmluX3NwaV9kaXNhYmxlKGRydl9kYXRhKTsKLQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAicmVzdG9yaW5nIHNwaSBjdGwgc3RhdGVcbiIpOwotCi0JU1NZTkMoKTsKLQotCS8qIExvYWQgdGhlIHJlZ2lzdGVycyAqLwotCXdyaXRlX0NUUkwoZHJ2X2RhdGEsIGNoaXAtPmN0bF9yZWcpOwotCXdyaXRlX0JBVUQoZHJ2X2RhdGEsIGNoaXAtPmJhdWQpOwotCi0JYmZpbl9zcGlfZW5hYmxlKGRydl9kYXRhKTsKLQliZmluX3NwaV9jc19hY3RpdmUoZHJ2X2RhdGEsIGNoaXApOwotfQotCi0vKiB1c2VkIHRvIGtpY2sgb2ZmIHRyYW5zZmVyIGluIHJ4IG1vZGUgYW5kIHJlYWQgdW53YW50ZWQgUlggZGF0YSAqLwotc3RhdGljIGlubGluZSB2b2lkIGJmaW5fc3BpX2R1bW15X3JlYWQoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSkKLXsKLQkodm9pZCkgcmVhZF9SREJSKGRydl9kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgYmZpbl9zcGlfdThfd3JpdGVyKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCi17Ci0JLyogY2xlYXIgUlhTICh3ZSBjaGVjayBmb3IgUlhTIGluc2lkZSB0aGUgbG9vcCkgKi8KLQliZmluX3NwaV9kdW1teV9yZWFkKGRydl9kYXRhKTsKLQotCXdoaWxlIChkcnZfZGF0YS0+dHggPCBkcnZfZGF0YS0+dHhfZW5kKSB7Ci0JCXdyaXRlX1REQlIoZHJ2X2RhdGEsICgqKHU4ICopIChkcnZfZGF0YS0+dHgrKykpKTsKLQkJLyogd2FpdCB1bnRpbCB0cmFuc2ZlciBmaW5pc2hlZC4KLQkJICAgY2hlY2tpbmcgU1BJRiBvciBUWFMgbWF5IG5vdCBndWFyYW50ZWUgdHJhbnNmZXIgY29tcGxldGlvbiAqLwotCQl3aGlsZSAoIShyZWFkX1NUQVQoZHJ2X2RhdGEpICYgQklUX1NUQVRfUlhTKSkKLQkJCWNwdV9yZWxheCgpOwotCQkvKiBkaXNjYXJkIFJYIGRhdGEgYW5kIGNsZWFyIFJYUyAqLwotCQliZmluX3NwaV9kdW1teV9yZWFkKGRydl9kYXRhKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJmaW5fc3BpX3U4X3JlYWRlcihzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQotewotCXUxNiB0eF92YWwgPSBkcnZfZGF0YS0+Y3VyX2NoaXAtPmlkbGVfdHhfdmFsOwotCi0JLyogZGlzY2FyZCBvbGQgUlggZGF0YSBhbmQgY2xlYXIgUlhTICovCi0JYmZpbl9zcGlfZHVtbXlfcmVhZChkcnZfZGF0YSk7Ci0KLQl3aGlsZSAoZHJ2X2RhdGEtPnJ4IDwgZHJ2X2RhdGEtPnJ4X2VuZCkgewotCQl3cml0ZV9UREJSKGRydl9kYXRhLCB0eF92YWwpOwotCQl3aGlsZSAoIShyZWFkX1NUQVQoZHJ2X2RhdGEpICYgQklUX1NUQVRfUlhTKSkKLQkJCWNwdV9yZWxheCgpOwotCQkqKHU4ICopIChkcnZfZGF0YS0+cngrKykgPSByZWFkX1JEQlIoZHJ2X2RhdGEpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYmZpbl9zcGlfdThfZHVwbGV4KHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCi17Ci0JLyogZGlzY2FyZCBvbGQgUlggZGF0YSBhbmQgY2xlYXIgUlhTICovCi0JYmZpbl9zcGlfZHVtbXlfcmVhZChkcnZfZGF0YSk7Ci0KLQl3aGlsZSAoZHJ2X2RhdGEtPnJ4IDwgZHJ2X2RhdGEtPnJ4X2VuZCkgewotCQl3cml0ZV9UREJSKGRydl9kYXRhLCAoKih1OCAqKSAoZHJ2X2RhdGEtPnR4KyspKSk7Ci0JCXdoaWxlICghKHJlYWRfU1RBVChkcnZfZGF0YSkgJiBCSVRfU1RBVF9SWFMpKQotCQkJY3B1X3JlbGF4KCk7Ci0JCSoodTggKikgKGRydl9kYXRhLT5yeCsrKSA9IHJlYWRfUkRCUihkcnZfZGF0YSk7Ci0JfQotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJmaW5fc3BpX3RyYW5zZmVyX29wcyBiZmluX2JmaW5fc3BpX3RyYW5zZmVyX29wc191OCA9IHsKLQkud3JpdGUgID0gYmZpbl9zcGlfdThfd3JpdGVyLAotCS5yZWFkICAgPSBiZmluX3NwaV91OF9yZWFkZXIsCi0JLmR1cGxleCA9IGJmaW5fc3BpX3U4X2R1cGxleCwKLX07Ci0KLXN0YXRpYyB2b2lkIGJmaW5fc3BpX3UxNl93cml0ZXIoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSkKLXsKLQkvKiBjbGVhciBSWFMgKHdlIGNoZWNrIGZvciBSWFMgaW5zaWRlIHRoZSBsb29wKSAqLwotCWJmaW5fc3BpX2R1bW15X3JlYWQoZHJ2X2RhdGEpOwotCi0Jd2hpbGUgKGRydl9kYXRhLT50eCA8IGRydl9kYXRhLT50eF9lbmQpIHsKLQkJd3JpdGVfVERCUihkcnZfZGF0YSwgKCoodTE2ICopIChkcnZfZGF0YS0+dHgpKSk7Ci0JCWRydl9kYXRhLT50eCArPSAyOwotCQkvKiB3YWl0IHVudGlsIHRyYW5zZmVyIGZpbmlzaGVkLgotCQkgICBjaGVja2luZyBTUElGIG9yIFRYUyBtYXkgbm90IGd1YXJhbnRlZSB0cmFuc2ZlciBjb21wbGV0aW9uICovCi0JCXdoaWxlICghKHJlYWRfU1RBVChkcnZfZGF0YSkgJiBCSVRfU1RBVF9SWFMpKQotCQkJY3B1X3JlbGF4KCk7Ci0JCS8qIGRpc2NhcmQgUlggZGF0YSBhbmQgY2xlYXIgUlhTICovCi0JCWJmaW5fc3BpX2R1bW15X3JlYWQoZHJ2X2RhdGEpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYmZpbl9zcGlfdTE2X3JlYWRlcihzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQotewotCXUxNiB0eF92YWwgPSBkcnZfZGF0YS0+Y3VyX2NoaXAtPmlkbGVfdHhfdmFsOwotCi0JLyogZGlzY2FyZCBvbGQgUlggZGF0YSBhbmQgY2xlYXIgUlhTICovCi0JYmZpbl9zcGlfZHVtbXlfcmVhZChkcnZfZGF0YSk7Ci0KLQl3aGlsZSAoZHJ2X2RhdGEtPnJ4IDwgZHJ2X2RhdGEtPnJ4X2VuZCkgewotCQl3cml0ZV9UREJSKGRydl9kYXRhLCB0eF92YWwpOwotCQl3aGlsZSAoIShyZWFkX1NUQVQoZHJ2X2RhdGEpICYgQklUX1NUQVRfUlhTKSkKLQkJCWNwdV9yZWxheCgpOwotCQkqKHUxNiAqKSAoZHJ2X2RhdGEtPnJ4KSA9IHJlYWRfUkRCUihkcnZfZGF0YSk7Ci0JCWRydl9kYXRhLT5yeCArPSAyOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYmZpbl9zcGlfdTE2X2R1cGxleChzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhKQotewotCS8qIGRpc2NhcmQgb2xkIFJYIGRhdGEgYW5kIGNsZWFyIFJYUyAqLwotCWJmaW5fc3BpX2R1bW15X3JlYWQoZHJ2X2RhdGEpOwotCi0Jd2hpbGUgKGRydl9kYXRhLT5yeCA8IGRydl9kYXRhLT5yeF9lbmQpIHsKLQkJd3JpdGVfVERCUihkcnZfZGF0YSwgKCoodTE2ICopIChkcnZfZGF0YS0+dHgpKSk7Ci0JCWRydl9kYXRhLT50eCArPSAyOwotCQl3aGlsZSAoIShyZWFkX1NUQVQoZHJ2X2RhdGEpICYgQklUX1NUQVRfUlhTKSkKLQkJCWNwdV9yZWxheCgpOwotCQkqKHUxNiAqKSAoZHJ2X2RhdGEtPnJ4KSA9IHJlYWRfUkRCUihkcnZfZGF0YSk7Ci0JCWRydl9kYXRhLT5yeCArPSAyOwotCX0KLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBiZmluX3NwaV90cmFuc2Zlcl9vcHMgYmZpbl9iZmluX3NwaV90cmFuc2Zlcl9vcHNfdTE2ID0gewotCS53cml0ZSAgPSBiZmluX3NwaV91MTZfd3JpdGVyLAotCS5yZWFkICAgPSBiZmluX3NwaV91MTZfcmVhZGVyLAotCS5kdXBsZXggPSBiZmluX3NwaV91MTZfZHVwbGV4LAotfTsKLQotLyogdGVzdCBpZiB0aGVyZSBpcyBtb3JlIHRyYW5zZmVyIHRvIGJlIGRvbmUgKi8KLXN0YXRpYyB2b2lkICpiZmluX3NwaV9uZXh0X3RyYW5zZmVyKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCi17Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICptc2cgPSBkcnZfZGF0YS0+Y3VyX21zZzsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFucyA9IGRydl9kYXRhLT5jdXJfdHJhbnNmZXI7Ci0KLQkvKiBNb3ZlIHRvIG5leHQgdHJhbnNmZXIgKi8KLQlpZiAodHJhbnMtPnRyYW5zZmVyX2xpc3QubmV4dCAhPSAmbXNnLT50cmFuc2ZlcnMpIHsKLQkJZHJ2X2RhdGEtPmN1cl90cmFuc2ZlciA9Ci0JCSAgICBsaXN0X2VudHJ5KHRyYW5zLT50cmFuc2Zlcl9saXN0Lm5leHQsCi0JCQkgICAgICAgc3RydWN0IHNwaV90cmFuc2ZlciwgdHJhbnNmZXJfbGlzdCk7Ci0JCXJldHVybiBSVU5OSU5HX1NUQVRFOwotCX0gZWxzZQotCQlyZXR1cm4gRE9ORV9TVEFURTsKLX0KLQotLyoKLSAqIGNhbGxlciBhbHJlYWR5IHNldCBtZXNzYWdlLT5zdGF0dXM7Ci0gKiBkbWEgYW5kIHBpbyBpcnFzIGFyZSBibG9ja2VkIGdpdmUgZmluaXNoZWQgbWVzc2FnZSBiYWNrCi0gKi8KLXN0YXRpYyB2b2lkIGJmaW5fc3BpX2dpdmViYWNrKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCi17Ci0Jc3RydWN0IGJmaW5fc3BpX3NsYXZlX2RhdGEgKmNoaXAgPSBkcnZfZGF0YS0+Y3VyX2NoaXA7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqbGFzdF90cmFuc2ZlcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7Ci0JbXNnID0gZHJ2X2RhdGEtPmN1cl9tc2c7Ci0JZHJ2X2RhdGEtPmN1cl9tc2cgPSBOVUxMOwotCWRydl9kYXRhLT5jdXJfdHJhbnNmZXIgPSBOVUxMOwotCWRydl9kYXRhLT5jdXJfY2hpcCA9IE5VTEw7Ci0JcXVldWVfd29yayhkcnZfZGF0YS0+d29ya3F1ZXVlLCAmZHJ2X2RhdGEtPnB1bXBfbWVzc2FnZXMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7Ci0KLQlsYXN0X3RyYW5zZmVyID0gbGlzdF9lbnRyeShtc2ctPnRyYW5zZmVycy5wcmV2LAotCQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOwotCi0JbXNnLT5zdGF0ZSA9IE5VTEw7Ci0KLQlpZiAoIWRydl9kYXRhLT5jc19jaGFuZ2UpCi0JCWJmaW5fc3BpX2NzX2RlYWN0aXZlKGRydl9kYXRhLCBjaGlwKTsKLQotCS8qIE5vdCBzdG9wIHNwaSBpbiBhdXRvYnVmZmVyIG1vZGUgKi8KLQlpZiAoZHJ2X2RhdGEtPnR4X2RtYSAhPSAweEZGRkYpCi0JCWJmaW5fc3BpX2Rpc2FibGUoZHJ2X2RhdGEpOwotCi0JaWYgKG1zZy0+Y29tcGxldGUpCi0JCW1zZy0+Y29tcGxldGUobXNnLT5jb250ZXh0KTsKLX0KLQotLyogc3BpIGRhdGEgaXJxIGhhbmRsZXIgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBiZmluX3NwaV9waW9faXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEgPSBkZXZfaWQ7Ci0Jc3RydWN0IGJmaW5fc3BpX3NsYXZlX2RhdGEgKmNoaXAgPSBkcnZfZGF0YS0+Y3VyX2NoaXA7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICptc2cgPSBkcnZfZGF0YS0+Y3VyX21zZzsKLQlpbnQgbl9ieXRlcyA9IGRydl9kYXRhLT5uX2J5dGVzOwotCWludCBsb29wID0gMDsKLQotCS8qIHdhaXQgdW50aWwgdHJhbnNmZXIgZmluaXNoZWQuICovCi0Jd2hpbGUgKCEocmVhZF9TVEFUKGRydl9kYXRhKSAmIEJJVF9TVEFUX1JYUykpCi0JCWNwdV9yZWxheCgpOwotCi0JaWYgKChkcnZfZGF0YS0+dHggJiYgZHJ2X2RhdGEtPnR4ID49IGRydl9kYXRhLT50eF9lbmQpIHx8Ci0JCShkcnZfZGF0YS0+cnggJiYgZHJ2X2RhdGEtPnJ4ID49IChkcnZfZGF0YS0+cnhfZW5kIC0gbl9ieXRlcykpKSB7Ci0JCS8qIGxhc3QgcmVhZCAqLwotCQlpZiAoZHJ2X2RhdGEtPnJ4KSB7Ci0JCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAibGFzdCByZWFkXG4iKTsKLQkJCWlmIChuX2J5dGVzICUgMikgewotCQkJCXUxNiAqYnVmID0gKHUxNiAqKWRydl9kYXRhLT5yeDsKLQkJCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgbl9ieXRlcyAvIDI7IGxvb3ArKykKLQkJCQkJKmJ1ZisrID0gcmVhZF9SREJSKGRydl9kYXRhKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdTggKmJ1ZiA9ICh1OCAqKWRydl9kYXRhLT5yeDsKLQkJCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgbl9ieXRlczsgbG9vcCsrKQotCQkJCQkqYnVmKysgPSByZWFkX1JEQlIoZHJ2X2RhdGEpOwotCQkJfQotCQkJZHJ2X2RhdGEtPnJ4ICs9IG5fYnl0ZXM7Ci0JCX0KLQotCQltc2ctPmFjdHVhbF9sZW5ndGggKz0gZHJ2X2RhdGEtPmxlbl9pbl9ieXRlczsKLQkJaWYgKGRydl9kYXRhLT5jc19jaGFuZ2UpCi0JCQliZmluX3NwaV9jc19kZWFjdGl2ZShkcnZfZGF0YSwgY2hpcCk7Ci0JCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciAqLwotCQltc2ctPnN0YXRlID0gYmZpbl9zcGlfbmV4dF90cmFuc2ZlcihkcnZfZGF0YSk7Ci0KLQkJZGlzYWJsZV9pcnFfbm9zeW5jKGRydl9kYXRhLT5zcGlfaXJxKTsKLQotCQkvKiBTY2hlZHVsZSB0cmFuc2ZlciB0YXNrbGV0ICovCi0JCXRhc2tsZXRfc2NoZWR1bGUoJmRydl9kYXRhLT5wdW1wX3RyYW5zZmVycyk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAoZHJ2X2RhdGEtPnJ4ICYmIGRydl9kYXRhLT50eCkgewotCQkvKiBkdXBsZXggKi8KLQkJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwgImR1cGxleDogd3JpdGVfVERCUlxuIik7Ci0JCWlmIChuX2J5dGVzICUgMikgewotCQkJdTE2ICpidWYgPSAodTE2ICopZHJ2X2RhdGEtPnJ4OwotCQkJdTE2ICpidWYyID0gKHUxNiAqKWRydl9kYXRhLT50eDsKLQkJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBuX2J5dGVzIC8gMjsgbG9vcCsrKSB7Ci0JCQkJKmJ1ZisrID0gcmVhZF9SREJSKGRydl9kYXRhKTsKLQkJCQl3cml0ZV9UREJSKGRydl9kYXRhLCAqYnVmMisrKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXU4ICpidWYgPSAodTggKilkcnZfZGF0YS0+cng7Ci0JCQl1OCAqYnVmMiA9ICh1OCAqKWRydl9kYXRhLT50eDsKLQkJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBuX2J5dGVzOyBsb29wKyspIHsKLQkJCQkqYnVmKysgPSByZWFkX1JEQlIoZHJ2X2RhdGEpOwotCQkJCXdyaXRlX1REQlIoZHJ2X2RhdGEsICpidWYyKyspOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChkcnZfZGF0YS0+cngpIHsKLQkJLyogcmVhZCAqLwotCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAicmVhZDogd3JpdGVfVERCUlxuIik7Ci0JCWlmIChuX2J5dGVzICUgMikgewotCQkJdTE2ICpidWYgPSAodTE2ICopZHJ2X2RhdGEtPnJ4OwotCQkJZm9yIChsb29wID0gMDsgbG9vcCA8IG5fYnl0ZXMgLyAyOyBsb29wKyspIHsKLQkJCQkqYnVmKysgPSByZWFkX1JEQlIoZHJ2X2RhdGEpOwotCQkJCXdyaXRlX1REQlIoZHJ2X2RhdGEsIGNoaXAtPmlkbGVfdHhfdmFsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXU4ICpidWYgPSAodTggKilkcnZfZGF0YS0+cng7Ci0JCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgbl9ieXRlczsgbG9vcCsrKSB7Ci0JCQkJKmJ1ZisrID0gcmVhZF9SREJSKGRydl9kYXRhKTsKLQkJCQl3cml0ZV9UREJSKGRydl9kYXRhLCBjaGlwLT5pZGxlX3R4X3ZhbCk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKGRydl9kYXRhLT50eCkgewotCQkvKiB3cml0ZSAqLwotCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAid3JpdGU6IHdyaXRlX1REQlJcbiIpOwotCQlpZiAobl9ieXRlcyAlIDIpIHsKLQkJCXUxNiAqYnVmID0gKHUxNiAqKWRydl9kYXRhLT50eDsKLQkJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBuX2J5dGVzIC8gMjsgbG9vcCsrKSB7Ci0JCQkJcmVhZF9SREJSKGRydl9kYXRhKTsKLQkJCQl3cml0ZV9UREJSKGRydl9kYXRhLCAqYnVmKyspOwotCQkJfQotCQl9IGVsc2UgewotCQkJdTggKmJ1ZiA9ICh1OCAqKWRydl9kYXRhLT50eDsKLQkJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBuX2J5dGVzOyBsb29wKyspIHsKLQkJCQlyZWFkX1JEQlIoZHJ2X2RhdGEpOwotCQkJCXdyaXRlX1REQlIoZHJ2X2RhdGEsICpidWYrKyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoZHJ2X2RhdGEtPnR4KQotCQlkcnZfZGF0YS0+dHggKz0gbl9ieXRlczsKLQlpZiAoZHJ2X2RhdGEtPnJ4KQotCQlkcnZfZGF0YS0+cnggKz0gbl9ieXRlczsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGJmaW5fc3BpX2RtYV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSA9IGRldl9pZDsKLQlzdHJ1Y3QgYmZpbl9zcGlfc2xhdmVfZGF0YSAqY2hpcCA9IGRydl9kYXRhLT5jdXJfY2hpcDsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGRydl9kYXRhLT5jdXJfbXNnOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQl1bnNpZ25lZCBzaG9ydCBkbWFzdGF0ID0gZ2V0X2RtYV9jdXJyX2lycXN0YXQoZHJ2X2RhdGEtPmRtYV9jaGFubmVsKTsKLQl1MTYgc3Bpc3RhdCA9IHJlYWRfU1RBVChkcnZfZGF0YSk7Ci0KLQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LAotCQkiaW4gZG1hX2lycV9oYW5kbGVyIGRtYXN0YXQ6MHgleCBzcGlzdGF0OjB4JXhcbiIsCi0JCWRtYXN0YXQsIHNwaXN0YXQpOwotCi0JaWYgKGRydl9kYXRhLT5yeCAhPSBOVUxMKSB7Ci0JCXUxNiBjciA9IHJlYWRfQ1RSTChkcnZfZGF0YSk7Ci0JCS8qIGRpc2NhcmQgb2xkIFJYIGRhdGEgYW5kIGNsZWFyIFJYUyAqLwotCQliZmluX3NwaV9kdW1teV9yZWFkKGRydl9kYXRhKTsKLQkJd3JpdGVfQ1RSTChkcnZfZGF0YSwgY3IgJiB+QklUX0NUTF9FTkFCTEUpOyAvKiBEaXNhYmxlIFNQSSAqLwotCQl3cml0ZV9DVFJMKGRydl9kYXRhLCBjciAmIH5CSVRfQ1RMX1RJTU9EKTsgLyogUmVzdG9yZSBTdGF0ZSAqLwotCQl3cml0ZV9TVEFUKGRydl9kYXRhLCBCSVRfU1RBVF9DTFIpOyAvKiBDbGVhciBTdGF0dXMgKi8KLQl9Ci0KLQljbGVhcl9kbWFfaXJxc3RhdChkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOwotCi0JLyoKLQkgKiB3YWl0IGZvciB0aGUgbGFzdCB0cmFuc2FjdGlvbiBzaGlmdGVkIG91dC4gIEhSTSBzdGF0ZXM6Ci0JICogYXQgdGhpcyBwb2ludCB0aGVyZSBtYXkgc3RpbGwgYmUgZGF0YSBpbiB0aGUgU1BJIERNQSBGSUZPIHdhaXRpbmcKLQkgKiB0byBiZSB0cmFuc21pdHRlZCAuLi4gc29mdHdhcmUgbmVlZHMgdG8gcG9sbCBUWFMgaW4gdGhlIFNQSV9TVEFUCi0JICogcmVnaXN0ZXIgdW50aWwgaXQgZ29lcyBsb3cgZm9yIDIgc3VjY2Vzc2l2ZSByZWFkcwotCSAqLwotCWlmIChkcnZfZGF0YS0+dHggIT0gTlVMTCkgewotCQl3aGlsZSAoKHJlYWRfU1RBVChkcnZfZGF0YSkgJiBCSVRfU1RBVF9UWFMpIHx8Ci0JCSAgICAgICAocmVhZF9TVEFUKGRydl9kYXRhKSAmIEJJVF9TVEFUX1RYUykpCi0JCQljcHVfcmVsYXgoKTsKLQl9Ci0KLQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LAotCQkiaW4gZG1hX2lycV9oYW5kbGVyIGRtYXN0YXQ6MHgleCBzcGlzdGF0OjB4JXhcbiIsCi0JCWRtYXN0YXQsIHJlYWRfU1RBVChkcnZfZGF0YSkpOwotCi0JdGltZW91dCA9IGppZmZpZXMgKyBIWjsKLQl3aGlsZSAoIShyZWFkX1NUQVQoZHJ2X2RhdGEpICYgQklUX1NUQVRfU1BJRikpCi0JCWlmICghdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKLQkJCWRldl93YXJuKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBTUElGIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlCi0JCQljcHVfcmVsYXgoKTsKLQotCWlmICgoZG1hc3RhdCAmIERNQV9FUlIpICYmIChzcGlzdGF0ICYgQklUX1NUQVRfUkJTWSkpIHsKLQkJbXNnLT5zdGF0ZSA9IEVSUk9SX1NUQVRFOwotCQlkZXZfZXJyKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAiZG1hIHJlY2VpdmU6IGZpZm8vYnVmZmVyIG92ZXJmbG93XG4iKTsKLQl9IGVsc2UgewotCQltc2ctPmFjdHVhbF9sZW5ndGggKz0gZHJ2X2RhdGEtPmxlbl9pbl9ieXRlczsKLQotCQlpZiAoZHJ2X2RhdGEtPmNzX2NoYW5nZSkKLQkJCWJmaW5fc3BpX2NzX2RlYWN0aXZlKGRydl9kYXRhLCBjaGlwKTsKLQotCQkvKiBNb3ZlIHRvIG5leHQgdHJhbnNmZXIgKi8KLQkJbXNnLT5zdGF0ZSA9IGJmaW5fc3BpX25leHRfdHJhbnNmZXIoZHJ2X2RhdGEpOwotCX0KLQotCS8qIFNjaGVkdWxlIHRyYW5zZmVyIHRhc2tsZXQgKi8KLQl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOwotCi0JLyogZnJlZSB0aGUgaXJxIGhhbmRsZXIgYmVmb3JlIG5leHQgdHJhbnNmZXIgKi8KLQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LAotCQkiZGlzYWJsZSBkbWEgY2hhbm5lbCBpcnElZFxuIiwKLQkJZHJ2X2RhdGEtPmRtYV9jaGFubmVsKTsKLQlkbWFfZGlzYWJsZV9pcnFfbm9zeW5jKGRydl9kYXRhLT5kbWFfY2hhbm5lbCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJmaW5fc3BpX3B1bXBfdHJhbnNmZXJzKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhID0gKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqKWRhdGE7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICptZXNzYWdlID0gTlVMTDsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFuc2ZlciA9IE5VTEw7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqcHJldmlvdXMgPSBOVUxMOwotCXN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjaGlwID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgYml0c19wZXJfd29yZDsKLQl1MTYgY3IsIGNyX3dpZHRoLCBkbWFfd2lkdGgsIGRtYV9jb25maWc7Ci0JdTMyIHRyYW5mX3N1Y2Nlc3MgPSAxOwotCXU4IGZ1bGxfZHVwbGV4ID0gMDsKLQotCS8qIEdldCBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uICovCi0JbWVzc2FnZSA9IGRydl9kYXRhLT5jdXJfbXNnOwotCXRyYW5zZmVyID0gZHJ2X2RhdGEtPmN1cl90cmFuc2ZlcjsKLQljaGlwID0gZHJ2X2RhdGEtPmN1cl9jaGlwOwotCi0JLyoKLQkgKiBpZiBtc2cgaXMgZXJyb3Igb3IgZG9uZSwgcmVwb3J0IGl0IGJhY2sgdXNpbmcgY29tcGxldGUoKSBjYWxsYmFjawotCSAqLwotCi0JIC8qIEhhbmRsZSBmb3IgYWJvcnQgKi8KLQlpZiAobWVzc2FnZS0+c3RhdGUgPT0gRVJST1JfU1RBVEUpIHsKLQkJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwgInRyYW5zZmVyOiB3ZSd2ZSBoaXQgYW4gZXJyb3JcbiIpOwotCQltZXNzYWdlLT5zdGF0dXMgPSAtRUlPOwotCQliZmluX3NwaV9naXZlYmFjayhkcnZfZGF0YSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBIYW5kbGUgZW5kIG9mIG1lc3NhZ2UgKi8KLQlpZiAobWVzc2FnZS0+c3RhdGUgPT0gRE9ORV9TVEFURSkgewotCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAidHJhbnNmZXI6IGFsbCBkb25lIVxuIik7Ci0JCW1lc3NhZ2UtPnN0YXR1cyA9IDA7Ci0JCWJmaW5fc3BpX2dpdmViYWNrKGRydl9kYXRhKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIERlbGF5IGlmIHJlcXVlc3RlZCBhdCBlbmQgb2YgdHJhbnNmZXIgKi8KLQlpZiAobWVzc2FnZS0+c3RhdGUgPT0gUlVOTklOR19TVEFURSkgewotCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAidHJhbnNmZXI6IHN0aWxsIHJ1bm5pbmcgLi4uXG4iKTsKLQkJcHJldmlvdXMgPSBsaXN0X2VudHJ5KHRyYW5zZmVyLT50cmFuc2Zlcl9saXN0LnByZXYsCi0JCQkJICAgICAgc3RydWN0IHNwaV90cmFuc2ZlciwgdHJhbnNmZXJfbGlzdCk7Ci0JCWlmIChwcmV2aW91cy0+ZGVsYXlfdXNlY3MpCi0JCQl1ZGVsYXkocHJldmlvdXMtPmRlbGF5X3VzZWNzKTsKLQl9Ci0KLQkvKiBGbHVzaCBhbnkgZXhpc3RpbmcgdHJhbnNmZXJzIHRoYXQgbWF5IGJlIHNpdHRpbmcgaW4gdGhlIGhhcmR3YXJlICovCi0JaWYgKGJmaW5fc3BpX2ZsdXNoKGRydl9kYXRhKSA9PSAwKSB7Ci0JCWRldl9lcnIoJmRydl9kYXRhLT5wZGV2LT5kZXYsICJwdW1wX3RyYW5zZmVyczogZmx1c2ggZmFpbGVkXG4iKTsKLQkJbWVzc2FnZS0+c3RhdHVzID0gLUVJTzsKLQkJYmZpbl9zcGlfZ2l2ZWJhY2soZHJ2X2RhdGEpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHRyYW5zZmVyLT5sZW4gPT0gMCkgewotCQkvKiBNb3ZlIHRvIG5leHQgdHJhbnNmZXIgb2YgdGhpcyBtc2cgKi8KLQkJbWVzc2FnZS0+c3RhdGUgPSBiZmluX3NwaV9uZXh0X3RyYW5zZmVyKGRydl9kYXRhKTsKLQkJLyogU2NoZWR1bGUgbmV4dCB0cmFuc2ZlciB0YXNrbGV0ICovCi0JCXRhc2tsZXRfc2NoZWR1bGUoJmRydl9kYXRhLT5wdW1wX3RyYW5zZmVycyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodHJhbnNmZXItPnR4X2J1ZiAhPSBOVUxMKSB7Ci0JCWRydl9kYXRhLT50eCA9ICh2b2lkICopdHJhbnNmZXItPnR4X2J1ZjsKLQkJZHJ2X2RhdGEtPnR4X2VuZCA9IGRydl9kYXRhLT50eCArIHRyYW5zZmVyLT5sZW47Ci0JCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsICJ0eF9idWYgaXMgJXAsIHR4X2VuZCBpcyAlcFxuIiwKLQkJCXRyYW5zZmVyLT50eF9idWYsIGRydl9kYXRhLT50eF9lbmQpOwotCX0gZWxzZSB7Ci0JCWRydl9kYXRhLT50eCA9IE5VTEw7Ci0JfQotCi0JaWYgKHRyYW5zZmVyLT5yeF9idWYgIT0gTlVMTCkgewotCQlmdWxsX2R1cGxleCA9IHRyYW5zZmVyLT50eF9idWYgIT0gTlVMTDsKLQkJZHJ2X2RhdGEtPnJ4ID0gdHJhbnNmZXItPnJ4X2J1ZjsKLQkJZHJ2X2RhdGEtPnJ4X2VuZCA9IGRydl9kYXRhLT5yeCArIHRyYW5zZmVyLT5sZW47Ci0JCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsICJyeF9idWYgaXMgJXAsIHJ4X2VuZCBpcyAlcFxuIiwKLQkJCXRyYW5zZmVyLT5yeF9idWYsIGRydl9kYXRhLT5yeF9lbmQpOwotCX0gZWxzZSB7Ci0JCWRydl9kYXRhLT5yeCA9IE5VTEw7Ci0JfQotCi0JZHJ2X2RhdGEtPnJ4X2RtYSA9IHRyYW5zZmVyLT5yeF9kbWE7Ci0JZHJ2X2RhdGEtPnR4X2RtYSA9IHRyYW5zZmVyLT50eF9kbWE7Ci0JZHJ2X2RhdGEtPmxlbl9pbl9ieXRlcyA9IHRyYW5zZmVyLT5sZW47Ci0JZHJ2X2RhdGEtPmNzX2NoYW5nZSA9IHRyYW5zZmVyLT5jc19jaGFuZ2U7Ci0KLQkvKiBCaXRzIHBlciB3b3JkIHNldHVwICovCi0JYml0c19wZXJfd29yZCA9IHRyYW5zZmVyLT5iaXRzX3Blcl93b3JkID8gOiBtZXNzYWdlLT5zcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaWYgKChiaXRzX3Blcl93b3JkID4gMCkgJiYgKGJpdHNfcGVyX3dvcmQgJSAxNiA9PSAwKSkgewotCQlkcnZfZGF0YS0+bl9ieXRlcyA9IGJpdHNfcGVyX3dvcmQvODsKLQkJZHJ2X2RhdGEtPmxlbiA9ICh0cmFuc2Zlci0+bGVuKSA+PiAxOwotCQljcl93aWR0aCA9IEJJVF9DVExfV09SRFNJWkU7Ci0JCWRydl9kYXRhLT5vcHMgPSAmYmZpbl9iZmluX3NwaV90cmFuc2Zlcl9vcHNfdTE2OwotCX0gZWxzZSBpZiAoKGJpdHNfcGVyX3dvcmQgPiAwKSAmJiAoYml0c19wZXJfd29yZCAlIDggPT0gMCkpIHsKLQkJZHJ2X2RhdGEtPm5fYnl0ZXMgPSBiaXRzX3Blcl93b3JkLzg7Ci0JCWRydl9kYXRhLT5sZW4gPSB0cmFuc2Zlci0+bGVuOwotCQljcl93aWR0aCA9IDA7Ci0JCWRydl9kYXRhLT5vcHMgPSAmYmZpbl9iZmluX3NwaV90cmFuc2Zlcl9vcHNfdTg7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycigmZHJ2X2RhdGEtPnBkZXYtPmRldiwgInRyYW5zZmVyOiB1bnN1cHBvcnRlZCBiaXRzX3Blcl93b3JkXG4iKTsKLQkJbWVzc2FnZS0+c3RhdHVzID0gLUVJTlZBTDsKLQkJYmZpbl9zcGlfZ2l2ZWJhY2soZHJ2X2RhdGEpOwotCQlyZXR1cm47Ci0JfQotCWNyID0gcmVhZF9DVFJMKGRydl9kYXRhKSAmIH4oQklUX0NUTF9USU1PRCB8IEJJVF9DVExfV09SRFNJWkUpOwotCWNyIHw9IGNyX3dpZHRoOwotCXdyaXRlX0NUUkwoZHJ2X2RhdGEsIGNyKTsKLQotCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsCi0JCSJ0cmFuc2ZlcjogZHJ2X2RhdGEtPm9wcyBpcyAlcCwgY2hpcC0+b3BzIGlzICVwLCB1OF9vcHMgaXMgJXBcbiIsCi0JCWRydl9kYXRhLT5vcHMsIGNoaXAtPm9wcywgJmJmaW5fYmZpbl9zcGlfdHJhbnNmZXJfb3BzX3U4KTsKLQotCW1lc3NhZ2UtPnN0YXRlID0gUlVOTklOR19TVEFURTsKLQlkbWFfY29uZmlnID0gMDsKLQotCS8qIFNwZWVkIHNldHVwIChzdXJlbHkgdmFsaWQgYmVjYXVzZSBhbHJlYWR5IGNoZWNrZWQpICovCi0JaWYgKHRyYW5zZmVyLT5zcGVlZF9oeikKLQkJd3JpdGVfQkFVRChkcnZfZGF0YSwgaHpfdG9fc3BpX2JhdWQodHJhbnNmZXItPnNwZWVkX2h6KSk7Ci0JZWxzZQotCQl3cml0ZV9CQVVEKGRydl9kYXRhLCBjaGlwLT5iYXVkKTsKLQotCXdyaXRlX1NUQVQoZHJ2X2RhdGEsIEJJVF9TVEFUX0NMUik7Ci0JYmZpbl9zcGlfY3NfYWN0aXZlKGRydl9kYXRhLCBjaGlwKTsKLQotCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsCi0JCSJub3cgcHVtcGluZyBhIHRyYW5zZmVyOiB3aWR0aCBpcyAlZCwgbGVuIGlzICVkXG4iLAotCQljcl93aWR0aCwgdHJhbnNmZXItPmxlbik7Ci0KLQkvKgotCSAqIFRyeSB0byBtYXAgZG1hIGJ1ZmZlciBhbmQgZG8gYSBkbWEgdHJhbnNmZXIuICBJZiBzdWNjZXNzZnVsIHVzZSwKLQkgKiBkaWZmZXJlbnQgd2F5IHRvIHIvdyBhY2NvcmRpbmcgdG8gdGhlIGVuYWJsZV9kbWEgc2V0dGluZ3MgYW5kIGlmCi0JICogd2UgYXJlIG5vdCBkb2luZyBhIGZ1bGwgZHVwbGV4IHRyYW5zZmVyIChzaW5jZSB0aGUgaGFyZHdhcmUgZG9lcwotCSAqIG5vdCBzdXBwb3J0IGZ1bGwgZHVwbGV4IERNQSB0cmFuc2ZlcnMpLgotCSAqLwotCWlmICghZnVsbF9kdXBsZXggJiYgZHJ2X2RhdGEtPmN1cl9jaGlwLT5lbmFibGVfZG1hCi0JCQkJJiYgZHJ2X2RhdGEtPmxlbiA+IDYpIHsKLQotCQl1bnNpZ25lZCBsb25nIGRtYV9zdGFydF9hZGRyLCBmbGFnczsKLQotCQlkaXNhYmxlX2RtYShkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOwotCQljbGVhcl9kbWFfaXJxc3RhdChkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOwotCi0JCS8qIGNvbmZpZyBkbWEgY2hhbm5lbCAqLwotCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAiZG9pbmcgZG1hIHRyYW5zZmVyXG4iKTsKLQkJc2V0X2RtYV94X2NvdW50KGRydl9kYXRhLT5kbWFfY2hhbm5lbCwgZHJ2X2RhdGEtPmxlbik7Ci0JCWlmIChjcl93aWR0aCA9PSBCSVRfQ1RMX1dPUkRTSVpFKSB7Ci0JCQlzZXRfZG1hX3hfbW9kaWZ5KGRydl9kYXRhLT5kbWFfY2hhbm5lbCwgMik7Ci0JCQlkbWFfd2lkdGggPSBXRFNJWkVfMTY7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRfZG1hX3hfbW9kaWZ5KGRydl9kYXRhLT5kbWFfY2hhbm5lbCwgMSk7Ci0JCQlkbWFfd2lkdGggPSBXRFNJWkVfODsKLQkJfQotCi0JCS8qIHBvbGwgZm9yIFNQSSBjb21wbGV0aW9uIGJlZm9yZSBzdGFydCAqLwotCQl3aGlsZSAoIShyZWFkX1NUQVQoZHJ2X2RhdGEpICYgQklUX1NUQVRfU1BJRikpCi0JCQljcHVfcmVsYXgoKTsKLQotCQkvKiBkaXJ0eSBoYWNrIGZvciBhdXRvYnVmZmVyIERNQSBtb2RlICovCi0JCWlmIChkcnZfZGF0YS0+dHhfZG1hID09IDB4RkZGRikgewotCQkJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwKLQkJCQkiZG9pbmcgYXV0b2J1ZmZlciBETUEgb3V0LlxuIik7Ci0KLQkJCS8qIG5vIGlycSBpbiBhdXRvYnVmZmVyIG1vZGUgKi8KLQkJCWRtYV9jb25maWcgPQotCQkJICAgIChETUFGTE9XX0FVVE8gfCBSRVNUQVJUIHwgZG1hX3dpZHRoIHwgRElfRU4pOwotCQkJc2V0X2RtYV9jb25maWcoZHJ2X2RhdGEtPmRtYV9jaGFubmVsLCBkbWFfY29uZmlnKTsKLQkJCXNldF9kbWFfc3RhcnRfYWRkcihkcnZfZGF0YS0+ZG1hX2NoYW5uZWwsCi0JCQkJCSh1bnNpZ25lZCBsb25nKWRydl9kYXRhLT50eCk7Ci0JCQllbmFibGVfZG1hKGRydl9kYXRhLT5kbWFfY2hhbm5lbCk7Ci0KLQkJCS8qIHN0YXJ0IFNQSSB0cmFuc2ZlciAqLwotCQkJd3JpdGVfQ1RSTChkcnZfZGF0YSwgY3IgfCBCSVRfQ1RMX1RJTU9EX0RNQV9UWCk7Ci0KLQkJCS8qIGp1c3QgcmV0dXJuIGhlcmUsIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSB0cmFuc2ZlcgotCQkJICogaW4gdGhpcyBtb2RlCi0JCQkgKi8KLQkJCW1lc3NhZ2UtPnN0YXR1cyA9IDA7Ci0JCQliZmluX3NwaV9naXZlYmFjayhkcnZfZGF0YSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBJbiBkbWEgbW9kZSwgcnggb3IgdHggbXVzdCBiZSBOVUxMIGluIG9uZSB0cmFuc2ZlciAqLwotCQlkbWFfY29uZmlnID0gKFJFU1RBUlQgfCBkbWFfd2lkdGggfCBESV9FTik7Ci0JCWlmIChkcnZfZGF0YS0+cnggIT0gTlVMTCkgewotCQkJLyogc2V0IHRyYW5zZmVyIG1vZGUsIGFuZCBlbmFibGUgU1BJICovCi0JCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAiZG9pbmcgRE1BIGluIHRvICVwIChzaXplICV6eClcbiIsCi0JCQkJZHJ2X2RhdGEtPnJ4LCBkcnZfZGF0YS0+bGVuX2luX2J5dGVzKTsKLQotCQkJLyogaW52YWxpZGF0ZSBjYWNoZXMsIGlmIG5lZWRlZCAqLwotCQkJaWYgKGJmaW5fYWRkcl9kY2FjaGVhYmxlKCh1bnNpZ25lZCBsb25nKSBkcnZfZGF0YS0+cngpKQotCQkJCWludmFsaWRhdGVfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBkcnZfZGF0YS0+cngsCi0JCQkJCQkJKHVuc2lnbmVkIGxvbmcpIChkcnZfZGF0YS0+cnggKwotCQkJCQkJCWRydl9kYXRhLT5sZW5faW5fYnl0ZXMpKTsKLQotCQkJZG1hX2NvbmZpZyB8PSBXTlI7Ci0JCQlkbWFfc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKWRydl9kYXRhLT5yeDsKLQkJCWNyIHw9IEJJVF9DVExfVElNT0RfRE1BX1JYIHwgQklUX0NUTF9TRU5ET1BUOwotCi0JCX0gZWxzZSBpZiAoZHJ2X2RhdGEtPnR4ICE9IE5VTEwpIHsKLQkJCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsICJkb2luZyBETUEgb3V0LlxuIik7Ci0KLQkJCS8qIGZsdXNoIGNhY2hlcywgaWYgbmVlZGVkICovCi0JCQlpZiAoYmZpbl9hZGRyX2RjYWNoZWFibGUoKHVuc2lnbmVkIGxvbmcpIGRydl9kYXRhLT50eCkpCi0JCQkJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBkcnZfZGF0YS0+dHgsCi0JCQkJCQkodW5zaWduZWQgbG9uZykgKGRydl9kYXRhLT50eCArCi0JCQkJCQlkcnZfZGF0YS0+bGVuX2luX2J5dGVzKSk7Ci0KLQkJCWRtYV9zdGFydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpZHJ2X2RhdGEtPnR4OwotCQkJY3IgfD0gQklUX0NUTF9USU1PRF9ETUFfVFg7Ci0KLQkJfSBlbHNlCi0JCQlCVUcoKTsKLQotCQkvKiBvaCBtYW4sIGhlcmUgdGhlcmUgYmUgbW9uc3RlcnMgLi4uIGFuZCBpIGRvbnQgbWVhbiB0aGUKLQkJICogZmx1ZmZ5IGN1dGUgb25lcyBmcm9tIHBpeGFyLCBpIG1lYW4gdGhlIGtpbmQgdGhhdCdsbCBlYXQKLQkJICogeW91ciBkYXRhLCBraWNrIHlvdXIgZG9nLCBhbmQgbG92ZSBpdCBhbGwuICBkbyAqbm90KiB0cnkKLQkJICogYW5kIGNoYW5nZSB0aGVzZSBsaW5lcyB1bmxlc3MgeW91ICgxKSBoZWF2aWx5IHRlc3QgRE1BCi0JCSAqIHdpdGggU1BJIGZsYXNoZXMgb24gYSBsb2FkZWQgc3lzdGVtIChlLmcuIHBpbmcgZmxvb2RzKSwKLQkJICogKDIpIGtub3cganVzdCBob3cgYnJva2VuIHRoZSBETUEgZW5naW5lIGludGVyYWN0aW9uIHdpdGgKLQkJICogdGhlIFNQSSBwZXJpcGhlcmFsIGlzLCBhbmQgKDMpIGhhdmUgc29tZW9uZSBlbHNlIHRvIGJsYW1lCi0JCSAqIHdoZW4geW91IHNjcmV3IGl0IGFsbCB1cCBhbnl3YXlzLgotCQkgKi8KLQkJc2V0X2RtYV9zdGFydF9hZGRyKGRydl9kYXRhLT5kbWFfY2hhbm5lbCwgZG1hX3N0YXJ0X2FkZHIpOwotCQlzZXRfZG1hX2NvbmZpZyhkcnZfZGF0YS0+ZG1hX2NoYW5uZWwsIGRtYV9jb25maWcpOwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCVNTWU5DKCk7Ci0JCXdyaXRlX0NUUkwoZHJ2X2RhdGEsIGNyKTsKLQkJZW5hYmxlX2RtYShkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOwotCQlkbWFfZW5hYmxlX2lycShkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogV2UgYWx3YXlzIHVzZSBTUElfV1JJVEUgbW9kZSAodHJhbnNmZXIgc3RhcnRzIHdpdGggVERCUiB3cml0ZSkuCi0JICogU1BJX1JFQUQgbW9kZSAodHJhbnNmZXIgc3RhcnRzIHdpdGggUkRCUiByZWFkKSBzZWVtcyB0byBoYXZlCi0JICogcHJvYmxlbXMgd2l0aCBzZXR0aW5nIHVwIHRoZSBvdXRwdXQgdmFsdWUgaW4gVERCUiBwcmlvciB0byB0aGUKLQkgKiBzdGFydCBvZiB0aGUgdHJhbnNmZXIuCi0JICovCi0Jd3JpdGVfQ1RSTChkcnZfZGF0YSwgY3IgfCBCSVRfQ1RMX1RYTU9EKTsKLQotCWlmIChjaGlwLT5waW9faW50ZXJydXB0KSB7Ci0JCS8qIFNQSSBpcnEgc2hvdWxkIGhhdmUgYmVlbiBkaXNhYmxlZCBieSBub3cgKi8KLQotCQkvKiBkaXNjYXJkIG9sZCBSWCBkYXRhIGFuZCBjbGVhciBSWFMgKi8KLQkJYmZpbl9zcGlfZHVtbXlfcmVhZChkcnZfZGF0YSk7Ci0KLQkJLyogc3RhcnQgdHJhbnNmZXIgKi8KLQkJaWYgKGRydl9kYXRhLT50eCA9PSBOVUxMKQotCQkJd3JpdGVfVERCUihkcnZfZGF0YSwgY2hpcC0+aWRsZV90eF92YWwpOwotCQllbHNlIHsKLQkJCWludCBsb29wOwotCQkJaWYgKGJpdHNfcGVyX3dvcmQgJSAxNiA9PSAwKSB7Ci0JCQkJdTE2ICpidWYgPSAodTE2ICopZHJ2X2RhdGEtPnR4OwotCQkJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBiaXRzX3Blcl93b3JkIC8gMTY7Ci0JCQkJCQlsb29wKyspIHsKLQkJCQkJd3JpdGVfVERCUihkcnZfZGF0YSwgKmJ1ZisrKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGJpdHNfcGVyX3dvcmQgJSA4ID09IDApIHsKLQkJCQl1OCAqYnVmID0gKHU4ICopZHJ2X2RhdGEtPnR4OwotCQkJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBiaXRzX3Blcl93b3JkIC8gODsgbG9vcCsrKQotCQkJCQl3cml0ZV9UREJSKGRydl9kYXRhLCAqYnVmKyspOwotCQkJfQotCi0JCQlkcnZfZGF0YS0+dHggKz0gZHJ2X2RhdGEtPm5fYnl0ZXM7Ci0JCX0KLQotCQkvKiBvbmNlIFREQlIgaXMgZW1wdHksIGludGVycnVwdCBpcyB0cmlnZ2VyZWQgKi8KLQkJZW5hYmxlX2lycShkcnZfZGF0YS0+c3BpX2lycSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBJTyBtb2RlICovCi0JZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwgImRvaW5nIElPIHRyYW5zZmVyXG4iKTsKLQotCWlmIChmdWxsX2R1cGxleCkgewotCQkvKiBmdWxsIGR1cGxleCBtb2RlICovCi0JCUJVR19PTigoZHJ2X2RhdGEtPnR4X2VuZCAtIGRydl9kYXRhLT50eCkgIT0KLQkJICAgICAgIChkcnZfZGF0YS0+cnhfZW5kIC0gZHJ2X2RhdGEtPnJ4KSk7Ci0JCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsCi0JCQkiSU8gZHVwbGV4OiBjciBpcyAweCV4XG4iLCBjcik7Ci0KLQkJZHJ2X2RhdGEtPm9wcy0+ZHVwbGV4KGRydl9kYXRhKTsKLQotCQlpZiAoZHJ2X2RhdGEtPnR4ICE9IGRydl9kYXRhLT50eF9lbmQpCi0JCQl0cmFuZl9zdWNjZXNzID0gMDsKLQl9IGVsc2UgaWYgKGRydl9kYXRhLT50eCAhPSBOVUxMKSB7Ci0JCS8qIHdyaXRlIG9ubHkgaGFsZiBkdXBsZXggKi8KLQkJZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwKLQkJCSJJTyB3cml0ZTogY3IgaXMgMHgleFxuIiwgY3IpOwotCi0JCWRydl9kYXRhLT5vcHMtPndyaXRlKGRydl9kYXRhKTsKLQotCQlpZiAoZHJ2X2RhdGEtPnR4ICE9IGRydl9kYXRhLT50eF9lbmQpCi0JCQl0cmFuZl9zdWNjZXNzID0gMDsKLQl9IGVsc2UgaWYgKGRydl9kYXRhLT5yeCAhPSBOVUxMKSB7Ci0JCS8qIHJlYWQgb25seSBoYWxmIGR1cGxleCAqLwotCQlkZXZfZGJnKCZkcnZfZGF0YS0+cGRldi0+ZGV2LAotCQkJIklPIHJlYWQ6IGNyIGlzIDB4JXhcbiIsIGNyKTsKLQotCQlkcnZfZGF0YS0+b3BzLT5yZWFkKGRydl9kYXRhKTsKLQkJaWYgKGRydl9kYXRhLT5yeCAhPSBkcnZfZGF0YS0+cnhfZW5kKQotCQkJdHJhbmZfc3VjY2VzcyA9IDA7Ci0JfQotCi0JaWYgKCF0cmFuZl9zdWNjZXNzKSB7Ci0JCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsCi0JCQkiSU8gd3JpdGUgZXJyb3IhXG4iKTsKLQkJbWVzc2FnZS0+c3RhdGUgPSBFUlJPUl9TVEFURTsKLQl9IGVsc2UgewotCQkvKiBVcGRhdGUgdG90YWwgYnl0ZSB0cmFuc2ZlcnJlZCAqLwotCQltZXNzYWdlLT5hY3R1YWxfbGVuZ3RoICs9IGRydl9kYXRhLT5sZW5faW5fYnl0ZXM7Ci0JCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciBvZiB0aGlzIG1zZyAqLwotCQltZXNzYWdlLT5zdGF0ZSA9IGJmaW5fc3BpX25leHRfdHJhbnNmZXIoZHJ2X2RhdGEpOwotCQlpZiAoZHJ2X2RhdGEtPmNzX2NoYW5nZSkKLQkJCWJmaW5fc3BpX2NzX2RlYWN0aXZlKGRydl9kYXRhLCBjaGlwKTsKLQl9Ci0KLQkvKiBTY2hlZHVsZSBuZXh0IHRyYW5zZmVyIHRhc2tsZXQgKi8KLQl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOwotfQotCi0vKiBwb3AgYSBtc2cgZnJvbSBxdWV1ZSBhbmQga2ljayBvZmYgcmVhbCB0cmFuc2ZlciAqLwotc3RhdGljIHZvaWQgYmZpbl9zcGlfcHVtcF9tZXNzYWdlcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZHJ2X2RhdGEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhLCBwdW1wX21lc3NhZ2VzKTsKLQotCS8qIExvY2sgcXVldWUgYW5kIGNoZWNrIGZvciBxdWV1ZSB3b3JrICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGxpc3RfZW1wdHkoJmRydl9kYXRhLT5xdWV1ZSkgfHwgIWRydl9kYXRhLT5ydW5uaW5nKSB7Ci0JCS8qIHB1bXBlciBraWNrZWQgb2ZmIGJ1dCBubyB3b3JrIHRvIGRvICovCi0JCWRydl9kYXRhLT5idXN5ID0gMDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGFscmVhZHkgcnVubmluZyBhIG1lc3NhZ2UgKi8KLQlpZiAoZHJ2X2RhdGEtPmN1cl9tc2cpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEV4dHJhY3QgaGVhZCBvZiBxdWV1ZSAqLwotCWRydl9kYXRhLT5jdXJfbXNnID0gbGlzdF9lbnRyeShkcnZfZGF0YS0+cXVldWUubmV4dCwKLQkJCQkgICAgICAgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7Ci0KLQkvKiBTZXR1cCB0aGUgU1NQIHVzaW5nIHRoZSBwZXIgY2hpcCBjb25maWd1cmF0aW9uICovCi0JZHJ2X2RhdGEtPmN1cl9jaGlwID0gc3BpX2dldF9jdGxkYXRhKGRydl9kYXRhLT5jdXJfbXNnLT5zcGkpOwotCWJmaW5fc3BpX3Jlc3RvcmVfc3RhdGUoZHJ2X2RhdGEpOwotCi0JbGlzdF9kZWxfaW5pdCgmZHJ2X2RhdGEtPmN1cl9tc2ctPnF1ZXVlKTsKLQotCS8qIEluaXRpYWwgbWVzc2FnZSBzdGF0ZSAqLwotCWRydl9kYXRhLT5jdXJfbXNnLT5zdGF0ZSA9IFNUQVJUX1NUQVRFOwotCWRydl9kYXRhLT5jdXJfdHJhbnNmZXIgPSBsaXN0X2VudHJ5KGRydl9kYXRhLT5jdXJfbXNnLT50cmFuc2ZlcnMubmV4dCwKLQkJCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOwotCi0JZGV2X2RiZygmZHJ2X2RhdGEtPnBkZXYtPmRldiwgImdvdCBhIG1lc3NhZ2UgdG8gcHVtcCwgIgotCQkic3RhdGUgaXMgc2V0IHRvOiBiYXVkICVkLCBmbGFnIDB4JXgsIGN0bCAweCV4XG4iLAotCQlkcnZfZGF0YS0+Y3VyX2NoaXAtPmJhdWQsIGRydl9kYXRhLT5jdXJfY2hpcC0+ZmxhZywKLQkJZHJ2X2RhdGEtPmN1cl9jaGlwLT5jdGxfcmVnKTsKLQotCWRldl9kYmcoJmRydl9kYXRhLT5wZGV2LT5kZXYsCi0JCSJ0aGUgZmlyc3QgdHJhbnNmZXIgbGVuIGlzICVkXG4iLAotCQlkcnZfZGF0YS0+Y3VyX3RyYW5zZmVyLT5sZW4pOwotCi0JLyogTWFyayBhcyBidXN5IGFuZCBsYXVuY2ggdHJhbnNmZXJzICovCi0JdGFza2xldF9zY2hlZHVsZSgmZHJ2X2RhdGEtPnB1bXBfdHJhbnNmZXJzKTsKLQotCWRydl9kYXRhLT5idXN5ID0gMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOwotfQotCi0vKgotICogZ290IGEgbXNnIHRvIHRyYW5zZmVyLCBxdWV1ZSBpdCBpbiBkcnZfZGF0YS0+cXVldWUuCi0gKiBBbmQga2ljayBvZmYgbWVzc2FnZSBwdW1wZXIKLSAqLwotc3RhdGljIGludCBiZmluX3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKLXsKLQlzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCFkcnZfZGF0YS0+cnVubmluZykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVTSFVURE9XTjsKLQl9Ci0KLQltc2ctPmFjdHVhbF9sZW5ndGggPSAwOwotCW1zZy0+c3RhdHVzID0gLUVJTlBST0dSRVNTOwotCW1zZy0+c3RhdGUgPSBTVEFSVF9TVEFURTsKLQotCWRldl9kYmcoJnNwaS0+ZGV2LCAiYWRkaW5nIGFuIG1zZyBpbiB0cmFuc2ZlcigpIFxuIik7Ci0JbGlzdF9hZGRfdGFpbCgmbXNnLT5xdWV1ZSwgJmRydl9kYXRhLT5xdWV1ZSk7Ci0KLQlpZiAoZHJ2X2RhdGEtPnJ1bm5pbmcgJiYgIWRydl9kYXRhLT5idXN5KQotCQlxdWV1ZV93b3JrKGRydl9kYXRhLT53b3JrcXVldWUsICZkcnZfZGF0YS0+cHVtcF9tZXNzYWdlcyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgTUFYX1NQSV9TU0VMCTcKLQotc3RhdGljIHUxNiBzc2VsW11bTUFYX1NQSV9TU0VMXSA9IHsKLQl7UF9TUEkwX1NTRUwxLCBQX1NQSTBfU1NFTDIsIFBfU1BJMF9TU0VMMywKLQlQX1NQSTBfU1NFTDQsIFBfU1BJMF9TU0VMNSwKLQlQX1NQSTBfU1NFTDYsIFBfU1BJMF9TU0VMN30sCi0KLQl7UF9TUEkxX1NTRUwxLCBQX1NQSTFfU1NFTDIsIFBfU1BJMV9TU0VMMywKLQlQX1NQSTFfU1NFTDQsIFBfU1BJMV9TU0VMNSwKLQlQX1NQSTFfU1NFTDYsIFBfU1BJMV9TU0VMN30sCi0KLQl7UF9TUEkyX1NTRUwxLCBQX1NQSTJfU1NFTDIsIFBfU1BJMl9TU0VMMywKLQlQX1NQSTJfU1NFTDQsIFBfU1BJMl9TU0VMNSwKLQlQX1NQSTJfU1NFTDYsIFBfU1BJMl9TU0VMN30sCi19OwotCi0vKiBzZXR1cCBmb3IgZGV2aWNlcyAobWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyAtLSBub3QganVzdCBmaXJzdCBzZXR1cCkgKi8KLXN0YXRpYyBpbnQgYmZpbl9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCAqY2hpcF9pbmZvOwotCXN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjaGlwID0gTlVMTDsKLQlzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JdTE2IGJmaW5fY3RsX3JlZzsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCS8qIE9ubHkgYWxsb2MgKG9yIHVzZSBjaGlwX2luZm8pIG9uIGZpcnN0IHNldHVwICovCi0JY2hpcF9pbmZvID0gTlVMTDsKLQljaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7Ci0JaWYgKGNoaXAgPT0gTlVMTCkgewotCQljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjaGlwKSB7Ci0JCQlkZXZfZXJyKCZzcGktPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBjaGlwIGRhdGFcbiIpOwotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQljaGlwLT5lbmFibGVfZG1hID0gMDsKLQkJY2hpcF9pbmZvID0gc3BpLT5jb250cm9sbGVyX2RhdGE7Ci0JfQotCi0JLyogTGV0IHBlb3BsZSBzZXQgbm9uLXN0YW5kYXJkIGJpdHMgZGlyZWN0bHkgKi8KLQliZmluX2N0bF9yZWcgPSBCSVRfQ1RMX09QRU5EUkFJTiB8IEJJVF9DVExfRU1JU08gfAotCQlCSVRfQ1RMX1BTU0UgfCBCSVRfQ1RMX0dNIHwgQklUX0NUTF9TWjsKLQotCS8qIGNoaXBfaW5mbyBpc24ndCBhbHdheXMgbmVlZGVkICovCi0JaWYgKGNoaXBfaW5mbykgewotCQkvKiBNYWtlIHN1cmUgcGVvcGxlIHN0b3AgdHJ5aW5nIHRvIHNldCBmaWVsZHMgdmlhIGN0bF9yZWcKLQkJICogd2hlbiB0aGV5IHNob3VsZCBhY3R1YWxseSBiZSB1c2luZyBjb21tb24gU1BJIGZyYW1ld29yay4KLQkJICogQ3VycmVudGx5IHdlIGxldCB0aHJvdWdoOiBXT00gRU1JU08gUFNTRSBHTSBTWi4KLQkJICogTm90IHN1cmUgaWYgYSB1c2VyIGFjdHVhbGx5IG5lZWRzL3VzZXMgYW55IG9mIHRoZXNlLAotCQkgKiBidXQgbGV0J3MgYXNzdW1lIChmb3Igbm93KSB0aGV5IGRvLgotCQkgKi8KLQkJaWYgKGNoaXBfaW5mby0+Y3RsX3JlZyAmIH5iZmluX2N0bF9yZWcpIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZG8gbm90IHNldCBiaXRzIGluIGN0bF9yZWcgIgotCQkJCSJ0aGF0IHRoZSBTUEkgZnJhbWV3b3JrIG1hbmFnZXNcbiIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQljaGlwLT5lbmFibGVfZG1hID0gY2hpcF9pbmZvLT5lbmFibGVfZG1hICE9IDAKLQkJICAgICYmIGRydl9kYXRhLT5tYXN0ZXJfaW5mby0+ZW5hYmxlX2RtYTsKLQkJY2hpcC0+Y3RsX3JlZyA9IGNoaXBfaW5mby0+Y3RsX3JlZzsKLQkJY2hpcC0+Y3NfY2hnX3VkZWxheSA9IGNoaXBfaW5mby0+Y3NfY2hnX3VkZWxheTsKLQkJY2hpcC0+aWRsZV90eF92YWwgPSBjaGlwX2luZm8tPmlkbGVfdHhfdmFsOwotCQljaGlwLT5waW9faW50ZXJydXB0ID0gY2hpcF9pbmZvLT5waW9faW50ZXJydXB0OwotCQlzcGktPmJpdHNfcGVyX3dvcmQgPSBjaGlwX2luZm8tPmJpdHNfcGVyX3dvcmQ7Ci0JfSBlbHNlIHsKLQkJLyogZm9yY2UgYSBkZWZhdWx0IGJhc2Ugc3RhdGUgKi8KLQkJY2hpcC0+Y3RsX3JlZyAmPSBiZmluX2N0bF9yZWc7Ci0JfQotCi0JaWYgKHNwaS0+Yml0c19wZXJfd29yZCAlIDgpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlZCBiaXRzX3Blcl93b3JkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQkJc3BpLT5iaXRzX3Blcl93b3JkKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvKiB0cmFuc2xhdGUgY29tbW9uIHNwaSBmcmFtZXdvcmsgaW50byBvdXIgcmVnaXN0ZXIgKi8KLQlpZiAoc3BpLT5tb2RlICYgfihTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0xTQl9GSVJTVCkpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bnN1cHBvcnRlZCBzcGkgbW9kZXMgZGV0ZWN0ZWRcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCi0JCWNoaXAtPmN0bF9yZWcgfD0gQklUX0NUTF9DUE9MOwotCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKLQkJY2hpcC0+Y3RsX3JlZyB8PSBCSVRfQ1RMX0NQSEE7Ci0JaWYgKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpCi0JCWNoaXAtPmN0bF9yZWcgfD0gQklUX0NUTF9MU0JGOwotCS8qIHdlIGRvbnQgc3VwcG9ydCBydW5uaW5nIGluIHNsYXZlIG1vZGUgKHlldD8pICovCi0JY2hpcC0+Y3RsX3JlZyB8PSBCSVRfQ1RMX01BU1RFUjsKLQotCS8qCi0JICogTm90aWNlOiBmb3IgYmxhY2tmaW4sIHRoZSBzcGVlZF9oeiBpcyB0aGUgdmFsdWUgb2YgcmVnaXN0ZXIKLQkgKiBTUElfQkFVRCwgbm90IHRoZSByZWFsIGJhdWRyYXRlCi0JICovCi0JY2hpcC0+YmF1ZCA9IGh6X3RvX3NwaV9iYXVkKHNwaS0+bWF4X3NwZWVkX2h6KTsKLQljaGlwLT5jaGlwX3NlbGVjdF9udW0gPSBzcGktPmNoaXBfc2VsZWN0OwotCWlmIChjaGlwLT5jaGlwX3NlbGVjdF9udW0gPCBNQVhfQ1RSTF9DUykgewotCQlpZiAoIShzcGktPm1vZGUgJiBTUElfQ1BIQSkpCi0JCQlkZXZfd2Fybigmc3BpLT5kZXYsICJXYXJuaW5nOiBTUEkgQ1BIQSBub3Qgc2V0OiIKLQkJCQkiIFNsYXZlIFNlbGVjdCBub3QgdW5kZXIgc29mdHdhcmUgY29udHJvbCFcbiIKLQkJCQkiIFNlZSBEb2N1bWVudGF0aW9uL2JsYWNrZmluL2JmaW4tc3BpLW5vdGVzLnR4dCIpOwotCi0JCWNoaXAtPmZsYWcgPSAoMSA8PCBzcGktPmNoaXBfc2VsZWN0KSA8PCA4OwotCX0gZWxzZQotCQljaGlwLT5jc19ncGlvID0gY2hpcC0+Y2hpcF9zZWxlY3RfbnVtIC0gTUFYX0NUUkxfQ1M7Ci0KLQlpZiAoY2hpcC0+ZW5hYmxlX2RtYSAmJiBjaGlwLT5waW9faW50ZXJydXB0KSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiZW5hYmxlX2RtYSBpcyBzZXQsICIKLQkJCQkiZG8gbm90IHNldCBwaW9faW50ZXJydXB0XG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JLyoKLQkgKiBpZiBhbnkgb25lIFNQSSBjaGlwIGlzIHJlZ2lzdGVyZWQgYW5kIHdhbnRzIERNQSwgcmVxdWVzdCB0aGUKLQkgKiBETUEgY2hhbm5lbCBmb3IgaXQKLQkgKi8KLQlpZiAoY2hpcC0+ZW5hYmxlX2RtYSAmJiAhZHJ2X2RhdGEtPmRtYV9yZXF1ZXN0ZWQpIHsKLQkJLyogcmVnaXN0ZXIgZG1hIGlycSBoYW5kbGVyICovCi0JCXJldCA9IHJlcXVlc3RfZG1hKGRydl9kYXRhLT5kbWFfY2hhbm5lbCwgIkJGSU5fU1BJX0RNQSIpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCQkiVW5hYmxlIHRvIHJlcXVlc3QgQmxhY2tGaW4gU1BJIERNQSBjaGFubmVsXG4iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJZHJ2X2RhdGEtPmRtYV9yZXF1ZXN0ZWQgPSAxOwotCi0JCXJldCA9IHNldF9kbWFfY2FsbGJhY2soZHJ2X2RhdGEtPmRtYV9jaGFubmVsLAotCQkJYmZpbl9zcGlfZG1hX2lycV9oYW5kbGVyLCBkcnZfZGF0YSk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVW5hYmxlIHRvIHNldCBkbWEgY2FsbGJhY2tcbiIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlkbWFfZGlzYWJsZV9pcnEoZHJ2X2RhdGEtPmRtYV9jaGFubmVsKTsKLQl9Ci0KLQlpZiAoY2hpcC0+cGlvX2ludGVycnVwdCAmJiAhZHJ2X2RhdGEtPmlycV9yZXF1ZXN0ZWQpIHsKLQkJcmV0ID0gcmVxdWVzdF9pcnEoZHJ2X2RhdGEtPnNwaV9pcnEsIGJmaW5fc3BpX3Bpb19pcnFfaGFuZGxlciwKLQkJCUlSUUZfRElTQUJMRUQsICJCRklOX1NQSSIsIGRydl9kYXRhKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsICJVbmFibGUgdG8gcmVnaXN0ZXIgc3BpIElSUVxuIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWRydl9kYXRhLT5pcnFfcmVxdWVzdGVkID0gMTsKLQkJLyogd2UgdXNlIHdyaXRlIG1vZGUsIHNwaSBpcnEgaGFzIHRvIGJlIGRpc2FibGVkIGhlcmUgKi8KLQkJZGlzYWJsZV9pcnEoZHJ2X2RhdGEtPnNwaV9pcnEpOwotCX0KLQotCWlmIChjaGlwLT5jaGlwX3NlbGVjdF9udW0gPj0gTUFYX0NUUkxfQ1MpIHsKLQkJLyogT25seSByZXF1ZXN0IG9uIGZpcnN0IHNldHVwICovCi0JCWlmIChzcGlfZ2V0X2N0bGRhdGEoc3BpKSA9PSBOVUxMKSB7Ci0JCQlyZXQgPSBncGlvX3JlcXVlc3QoY2hpcC0+Y3NfZ3Bpbywgc3BpLT5tb2RhbGlhcyk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJZGV2X2Vycigmc3BpLT5kZXYsICJncGlvX3JlcXVlc3QoKSBlcnJvclxuIik7Ci0JCQkJZ290byBwaW5fZXJyb3I7Ci0JCQl9Ci0JCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoY2hpcC0+Y3NfZ3BpbywgMSk7Ci0JCX0KLQl9Ci0KLQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwIHNwaSBjaGlwICVzLCB3aWR0aCBpcyAlZCwgZG1hIGlzICVkXG4iLAotCQkJc3BpLT5tb2RhbGlhcywgc3BpLT5iaXRzX3Blcl93b3JkLCBjaGlwLT5lbmFibGVfZG1hKTsKLQlkZXZfZGJnKCZzcGktPmRldiwgImN0bF9yZWcgaXMgMHgleCwgZmxhZ19yZWcgaXMgMHgleFxuIiwKLQkJCWNoaXAtPmN0bF9yZWcsIGNoaXAtPmZsYWcpOwotCi0Jc3BpX3NldF9jdGxkYXRhKHNwaSwgY2hpcCk7Ci0KLQlkZXZfZGJnKCZzcGktPmRldiwgImNoaXAgc2VsZWN0IG51bWJlciBpcyAlZFxuIiwgY2hpcC0+Y2hpcF9zZWxlY3RfbnVtKTsKLQlpZiAoY2hpcC0+Y2hpcF9zZWxlY3RfbnVtIDwgTUFYX0NUUkxfQ1MpIHsKLQkJcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KHNzZWxbc3BpLT5tYXN0ZXItPmJ1c19udW1dCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICBbY2hpcC0+Y2hpcF9zZWxlY3RfbnVtLTFdLCBzcGktPm1vZGFsaWFzKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsICJwZXJpcGhlcmFsX3JlcXVlc3QoKSBlcnJvclxuIik7Ci0JCQlnb3RvIHBpbl9lcnJvcjsKLQkJfQotCX0KLQotCWJmaW5fc3BpX2NzX2VuYWJsZShkcnZfZGF0YSwgY2hpcCk7Ci0JYmZpbl9zcGlfY3NfZGVhY3RpdmUoZHJ2X2RhdGEsIGNoaXApOwotCi0JcmV0dXJuIDA7Ci0KLSBwaW5fZXJyb3I6Ci0JaWYgKGNoaXAtPmNoaXBfc2VsZWN0X251bSA+PSBNQVhfQ1RSTF9DUykKLQkJZ3Bpb19mcmVlKGNoaXAtPmNzX2dwaW8pOwotCWVsc2UKLQkJcGVyaXBoZXJhbF9mcmVlKHNzZWxbc3BpLT5tYXN0ZXItPmJ1c19udW1dCi0JCQlbY2hpcC0+Y2hpcF9zZWxlY3RfbnVtIC0gMV0pOwotIGVycm9yOgotCWlmIChjaGlwKSB7Ci0JCWlmIChkcnZfZGF0YS0+ZG1hX3JlcXVlc3RlZCkKLQkJCWZyZWVfZG1hKGRydl9kYXRhLT5kbWFfY2hhbm5lbCk7Ci0JCWRydl9kYXRhLT5kbWFfcmVxdWVzdGVkID0gMDsKLQotCQlrZnJlZShjaGlwKTsKLQkJLyogcHJldmVudCBmcmVlICdjaGlwJyB0d2ljZSAqLwotCQlzcGlfc2V0X2N0bGRhdGEoc3BpLCBOVUxMKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogY2FsbGJhY2sgZm9yIHNwaSBmcmFtZXdvcmsuCi0gKiBjbGVhbiBkcml2ZXIgc3BlY2lmaWMgZGF0YQotICovCi1zdGF0aWMgdm9pZCBiZmluX3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IGJmaW5fc3BpX3NsYXZlX2RhdGEgKmNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKLQlzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0KLQlpZiAoIWNoaXApCi0JCXJldHVybjsKLQotCWlmIChjaGlwLT5jaGlwX3NlbGVjdF9udW0gPCBNQVhfQ1RSTF9DUykgewotCQlwZXJpcGhlcmFsX2ZyZWUoc3NlbFtzcGktPm1hc3Rlci0+YnVzX251bV0KLQkJCQkJW2NoaXAtPmNoaXBfc2VsZWN0X251bS0xXSk7Ci0JCWJmaW5fc3BpX2NzX2Rpc2FibGUoZHJ2X2RhdGEsIGNoaXApOwotCX0gZWxzZQotCQlncGlvX2ZyZWUoY2hpcC0+Y3NfZ3Bpbyk7Ci0KLQlrZnJlZShjaGlwKTsKLQkvKiBwcmV2ZW50IGZyZWUgJ2NoaXAnIHR3aWNlICovCi0Jc3BpX3NldF9jdGxkYXRhKHNwaSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJmaW5fc3BpX2luaXRfcXVldWUoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSkKLXsKLQlJTklUX0xJU1RfSEVBRCgmZHJ2X2RhdGEtPnF1ZXVlKTsKLQlzcGluX2xvY2tfaW5pdCgmZHJ2X2RhdGEtPmxvY2spOwotCi0JZHJ2X2RhdGEtPnJ1bm5pbmcgPSBmYWxzZTsKLQlkcnZfZGF0YS0+YnVzeSA9IDA7Ci0KLQkvKiBpbml0IHRyYW5zZmVyIHRhc2tsZXQgKi8KLQl0YXNrbGV0X2luaXQoJmRydl9kYXRhLT5wdW1wX3RyYW5zZmVycywKLQkJICAgICBiZmluX3NwaV9wdW1wX3RyYW5zZmVycywgKHVuc2lnbmVkIGxvbmcpZHJ2X2RhdGEpOwotCi0JLyogaW5pdCBtZXNzYWdlcyB3b3JrcXVldWUgKi8KLQlJTklUX1dPUksoJmRydl9kYXRhLT5wdW1wX21lc3NhZ2VzLCBiZmluX3NwaV9wdW1wX21lc3NhZ2VzKTsKLQlkcnZfZGF0YS0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCi0JCQkJZGV2X25hbWUoZHJ2X2RhdGEtPm1hc3Rlci0+ZGV2LnBhcmVudCkpOwotCWlmIChkcnZfZGF0YS0+d29ya3F1ZXVlID09IE5VTEwpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmZpbl9zcGlfc3RhcnRfcXVldWUoc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZHJ2X2RhdGEtPnJ1bm5pbmcgfHwgZHJ2X2RhdGEtPmJ1c3kpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlkcnZfZGF0YS0+cnVubmluZyA9IHRydWU7Ci0JZHJ2X2RhdGEtPmN1cl9tc2cgPSBOVUxMOwotCWRydl9kYXRhLT5jdXJfdHJhbnNmZXIgPSBOVUxMOwotCWRydl9kYXRhLT5jdXJfY2hpcCA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKLQotCXF1ZXVlX3dvcmsoZHJ2X2RhdGEtPndvcmtxdWV1ZSwgJmRydl9kYXRhLT5wdW1wX21lc3NhZ2VzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiZmluX3NwaV9zdG9wX3F1ZXVlKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsaW1pdCA9IDUwMDsKLQlpbnQgc3RhdHVzID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBUaGlzIGlzIGEgYml0IGxhbWUsIGJ1dCBpcyBvcHRpbWl6ZWQgZm9yIHRoZSBjb21tb24gZXhlY3V0aW9uIHBhdGguCi0JICogQSB3YWl0X3F1ZXVlIG9uIHRoZSBkcnZfZGF0YS0+YnVzeSBjb3VsZCBiZSB1c2VkLCBidXQgdGhlbiB0aGUgY29tbW9uCi0JICogZXhlY3V0aW9uIHBhdGggKHB1bXBfbWVzc2FnZXMpIHdvdWxkIGJlIHJlcXVpcmVkIHRvIGNhbGwgd2FrZV91cCBvcgotCSAqIGZyaWVuZHMgb24gZXZlcnkgU1BJIG1lc3NhZ2UuIERvIHRoaXMgaW5zdGVhZAotCSAqLwotCWRydl9kYXRhLT5ydW5uaW5nID0gZmFsc2U7Ci0Jd2hpbGUgKCghbGlzdF9lbXB0eSgmZHJ2X2RhdGEtPnF1ZXVlKSB8fCBkcnZfZGF0YS0+YnVzeSkgJiYgbGltaXQtLSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOwotCQltc2xlZXAoMTApOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJmRydl9kYXRhLT5xdWV1ZSkgfHwgZHJ2X2RhdGEtPmJ1c3kpCi0JCXN0YXR1cyA9IC1FQlVTWTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRydl9kYXRhLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBiZmluX3NwaV9kZXN0cm95X3F1ZXVlKHN0cnVjdCBiZmluX3NwaV9tYXN0ZXJfZGF0YSAqZHJ2X2RhdGEpCi17Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IGJmaW5fc3BpX3N0b3BfcXVldWUoZHJ2X2RhdGEpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCWRlc3Ryb3lfd29ya3F1ZXVlKGRydl9kYXRhLT53b3JrcXVldWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJmaW5fc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgYmZpbjV4eF9zcGlfbWFzdGVyICpwbGF0Zm9ybV9pbmZvOwotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7Ci0Jc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgc3RhdHVzID0gMDsKLQotCXBsYXRmb3JtX2luZm8gPSBkZXYtPnBsYXRmb3JtX2RhdGE7Ci0KLQkvKiBBbGxvY2F0ZSBtYXN0ZXIgd2l0aCBzcGFjZSBmb3IgZHJ2X2RhdGEgKi8KLQltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKGRldiwgc2l6ZW9mKCpkcnZfZGF0YSkpOwotCWlmICghbWFzdGVyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbiBub3QgYWxsb2Mgc3BpX21hc3RlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWRydl9kYXRhID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCWRydl9kYXRhLT5tYXN0ZXIgPSBtYXN0ZXI7Ci0JZHJ2X2RhdGEtPm1hc3Rlcl9pbmZvID0gcGxhdGZvcm1faW5mbzsKLQlkcnZfZGF0YS0+cGRldiA9IHBkZXY7Ci0JZHJ2X2RhdGEtPnBpbl9yZXEgPSBwbGF0Zm9ybV9pbmZvLT5waW5fcmVxOwotCi0JLyogdGhlIHNwaS0+bW9kZSBiaXRzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcjogKi8KLQltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfTFNCX0ZJUlNUOwotCi0JbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7Ci0JbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHBsYXRmb3JtX2luZm8tPm51bV9jaGlwc2VsZWN0OwotCW1hc3Rlci0+Y2xlYW51cCA9IGJmaW5fc3BpX2NsZWFudXA7Ci0JbWFzdGVyLT5zZXR1cCA9IGJmaW5fc3BpX3NldHVwOwotCW1hc3Rlci0+dHJhbnNmZXIgPSBiZmluX3NwaV90cmFuc2ZlcjsKLQotCS8qIEZpbmQgYW5kIG1hcCBvdXIgcmVzb3VyY2VzICovCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAocmVzID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IElPUkVTT1VSQ0VfTUVNXG4iKTsKLQkJc3RhdHVzID0gLUVOT0VOVDsKLQkJZ290byBvdXRfZXJyb3JfZ2V0X3JlczsKLQl9Ci0KLQlkcnZfZGF0YS0+cmVnc19iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmIChkcnZfZGF0YS0+cmVnc19iYXNlID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJDYW5ub3QgbWFwIElPXG4iKTsKLQkJc3RhdHVzID0gLUVOWElPOwotCQlnb3RvIG91dF9lcnJvcl9pb3JlbWFwOwotCX0KLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7Ci0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiTm8gRE1BIGNoYW5uZWwgc3BlY2lmaWVkXG4iKTsKLQkJc3RhdHVzID0gLUVOT0VOVDsKLQkJZ290byBvdXRfZXJyb3JfZnJlZV9pbzsKLQl9Ci0JZHJ2X2RhdGEtPmRtYV9jaGFubmVsID0gcmVzLT5zdGFydDsKLQotCWRydl9kYXRhLT5zcGlfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoZHJ2X2RhdGEtPnNwaV9pcnEgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiTm8gc3BpIHBpbyBpcnEgc3BlY2lmaWVkXG4iKTsKLQkJc3RhdHVzID0gLUVOT0VOVDsKLQkJZ290byBvdXRfZXJyb3JfZnJlZV9pbzsKLQl9Ci0KLQkvKiBJbml0aWFsIGFuZCBzdGFydCBxdWV1ZSAqLwotCXN0YXR1cyA9IGJmaW5fc3BpX2luaXRfcXVldWUoZHJ2X2RhdGEpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlkZXZfZXJyKGRldiwgInByb2JsZW0gaW5pdGlhbGl6aW5nIHF1ZXVlXG4iKTsKLQkJZ290byBvdXRfZXJyb3JfcXVldWVfYWxsb2M7Ci0JfQotCi0Jc3RhdHVzID0gYmZpbl9zcGlfc3RhcnRfcXVldWUoZHJ2X2RhdGEpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlkZXZfZXJyKGRldiwgInByb2JsZW0gc3RhcnRpbmcgcXVldWVcbiIpOwotCQlnb3RvIG91dF9lcnJvcl9xdWV1ZV9hbGxvYzsKLQl9Ci0KLQlzdGF0dXMgPSBwZXJpcGhlcmFsX3JlcXVlc3RfbGlzdChkcnZfZGF0YS0+cGluX3JlcSwgRFJWX05BTUUpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICI6IFJlcXVlc3RpbmcgUGVyaXBoZXJhbHMgZmFpbGVkXG4iKTsKLQkJZ290byBvdXRfZXJyb3JfcXVldWVfYWxsb2M7Ci0JfQotCi0JLyogUmVzZXQgU1BJIHJlZ2lzdGVycy4gSWYgdGhlc2UgcmVnaXN0ZXJzIHdlcmUgdXNlZCBieSB0aGUgYm9vdCBsb2FkZXIsCi0JICogdGhlIHNreSBtYXkgZmFsbCBvbiB5b3VyIGhlYWQgaWYgeW91IGVuYWJsZSB0aGUgZG1hIGNvbnRyb2xsZXIuCi0JICovCi0Jd3JpdGVfQ1RSTChkcnZfZGF0YSwgQklUX0NUTF9DUEhBIHwgQklUX0NUTF9NQVNURVIpOwotCXdyaXRlX0ZMQUcoZHJ2X2RhdGEsIDB4RkYwMCk7Ci0KLQkvKiBSZWdpc3RlciB3aXRoIHRoZSBTUEkgZnJhbWV3b3JrICovCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZHJ2X2RhdGEpOwotCXN0YXR1cyA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKLQlpZiAoc3RhdHVzICE9IDApIHsKLQkJZGV2X2VycihkZXYsICJwcm9ibGVtIHJlZ2lzdGVyaW5nIHNwaSBtYXN0ZXJcbiIpOwotCQlnb3RvIG91dF9lcnJvcl9xdWV1ZV9hbGxvYzsKLQl9Ci0KLQlkZXZfaW5mbyhkZXYsICIlcywgVmVyc2lvbiAlcywgcmVnc19iYXNlQCVwLCBkbWEgY2hhbm5lbEAlZFxuIiwKLQkJRFJWX0RFU0MsIERSVl9WRVJTSU9OLCBkcnZfZGF0YS0+cmVnc19iYXNlLAotCQlkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOwotCXJldHVybiBzdGF0dXM7Ci0KLW91dF9lcnJvcl9xdWV1ZV9hbGxvYzoKLQliZmluX3NwaV9kZXN0cm95X3F1ZXVlKGRydl9kYXRhKTsKLW91dF9lcnJvcl9mcmVlX2lvOgotCWlvdW5tYXAoKHZvaWQgKikgZHJ2X2RhdGEtPnJlZ3NfYmFzZSk7Ci1vdXRfZXJyb3JfaW9yZW1hcDoKLW91dF9lcnJvcl9nZXRfcmVzOgotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiBzdG9wIGhhcmR3YXJlIGFuZCByZW1vdmUgdGhlIGRyaXZlciAqLwotc3RhdGljIGludCBfX2RldmV4aXQgYmZpbl9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGJmaW5fc3BpX21hc3Rlcl9kYXRhICpkcnZfZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBzdGF0dXMgPSAwOwotCi0JaWYgKCFkcnZfZGF0YSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBSZW1vdmUgdGhlIHF1ZXVlICovCi0Jc3RhdHVzID0gYmZpbl9zcGlfZGVzdHJveV9xdWV1ZShkcnZfZGF0YSk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JLyogRGlzYWJsZSB0aGUgU1NQIGF0IHRoZSBwZXJpcGhlcmFsIGFuZCBTT0MgbGV2ZWwgKi8KLQliZmluX3NwaV9kaXNhYmxlKGRydl9kYXRhKTsKLQotCS8qIFJlbGVhc2UgRE1BICovCi0JaWYgKGRydl9kYXRhLT5tYXN0ZXJfaW5mby0+ZW5hYmxlX2RtYSkgewotCQlpZiAoZG1hX2NoYW5uZWxfYWN0aXZlKGRydl9kYXRhLT5kbWFfY2hhbm5lbCkpCi0JCQlmcmVlX2RtYShkcnZfZGF0YS0+ZG1hX2NoYW5uZWwpOwotCX0KLQotCWlmIChkcnZfZGF0YS0+aXJxX3JlcXVlc3RlZCkgewotCQlmcmVlX2lycShkcnZfZGF0YS0+c3BpX2lycSwgZHJ2X2RhdGEpOwotCQlkcnZfZGF0YS0+aXJxX3JlcXVlc3RlZCA9IDA7Ci0JfQotCi0JLyogRGlzY29ubmVjdCBmcm9tIHRoZSBTUEkgZnJhbWV3b3JrICovCi0Jc3BpX3VucmVnaXN0ZXJfbWFzdGVyKGRydl9kYXRhLT5tYXN0ZXIpOwotCi0JcGVyaXBoZXJhbF9mcmVlX2xpc3QoZHJ2X2RhdGEtPnBpbl9yZXEpOwotCi0JLyogUHJldmVudCBkb3VibGUgcmVtb3ZlICovCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBiZmluX3NwaV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlzdGF0dXMgPSBiZmluX3NwaV9zdG9wX3F1ZXVlKGRydl9kYXRhKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiBzdGF0dXM7Ci0KLQlkcnZfZGF0YS0+Y3RybF9yZWcgPSByZWFkX0NUUkwoZHJ2X2RhdGEpOwotCWRydl9kYXRhLT5mbGFnX3JlZyA9IHJlYWRfRkxBRyhkcnZfZGF0YSk7Ci0KLQkvKgotCSAqIHJlc2V0IFNQSV9DVEwgYW5kIFNQSV9GTEcgcmVnaXN0ZXJzCi0JICovCi0Jd3JpdGVfQ1RSTChkcnZfZGF0YSwgQklUX0NUTF9DUEhBIHwgQklUX0NUTF9NQVNURVIpOwotCXdyaXRlX0ZMQUcoZHJ2X2RhdGEsIDB4RkYwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiZmluX3NwaV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgYmZpbl9zcGlfbWFzdGVyX2RhdGEgKmRydl9kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQl3cml0ZV9DVFJMKGRydl9kYXRhLCBkcnZfZGF0YS0+Y3RybF9yZWcpOwotCXdyaXRlX0ZMQUcoZHJ2X2RhdGEsIGRydl9kYXRhLT5mbGFnX3JlZyk7Ci0KLQkvKiBTdGFydCB0aGUgcXVldWUgcnVubmluZyAqLwotCXN0YXR1cyA9IGJmaW5fc3BpX3N0YXJ0X3F1ZXVlKGRydl9kYXRhKTsKLQlpZiAoc3RhdHVzICE9IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicHJvYmxlbSBzdGFydGluZyBxdWV1ZSAoJWQpXG4iLCBzdGF0dXMpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgYmZpbl9zcGlfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGJmaW5fc3BpX3Jlc3VtZSBOVUxMCi0jZW5kaWYJCQkJLyogQ09ORklHX1BNICovCi0KLU1PRFVMRV9BTElBUygicGxhdGZvcm06YmZpbi1zcGkiKTsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJmaW5fc3BpX2RyaXZlciA9IHsKLQkuZHJpdmVyCT0gewotCQkubmFtZQk9IERSVl9OQU1FLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotCS5zdXNwZW5kCT0gYmZpbl9zcGlfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGJmaW5fc3BpX3Jlc3VtZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGJmaW5fc3BpX3JlbW92ZSksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBiZmluX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmYmZpbl9zcGlfZHJpdmVyLCBiZmluX3NwaV9wcm9iZSk7Ci19Ci1zdWJzeXNfaW5pdGNhbGwoYmZpbl9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBiZmluX3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmJmaW5fc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChiZmluX3NwaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMgYi9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGE2M2Y2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyoKLSAqIHNwaV9iaXRiYW5nLmMgLSBwb2xsaW5nL2JpdGJhbmdpbmcgU1BJIG1hc3RlciBjb250cm9sbGVyIGRyaXZlciB1dGlsaXRpZXMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIEZJUlNUIFBBUlQgKE9QVElPTkFMKTogIHdvcmQtYXQtYS10aW1lIHNwaV90cmFuc2ZlciBzdXBwb3J0LgotICogVXNlIHRoaXMgZm9yIEdQSU8gb3Igc2hpZnQtcmVnaXN0ZXIgbGV2ZWwgaGFyZHdhcmUgQVBJcy4KLSAqCi0gKiBzcGlfYml0YmFuZ19jcyBpcyBpbiBzcGlfZGV2aWNlLT5jb250cm9sbGVyX3N0YXRlLCB3aGljaCBpcyB1bmF2YWlsYWJsZQotICogdG8gZ2x1ZSBjb2RlLiAgVGhlc2UgYml0YmFuZyBzZXR1cCgpIGFuZCBjbGVhbnVwKCkgcm91dGluZXMgYXJlIGFsd2F5cwotICogdXNlZCwgdGhvdWdoIG1heWJlIHRoZXkncmUgY2FsbGVkIGZyb20gY29udHJvbGxlci1hd2FyZSBjb2RlLgotICoKLSAqIGNoaXBzZWxlY3QoKSBhbmQgZnJpZW5kcyBtYXkgdXNlIHVzZSBzcGlfZGV2aWNlLT5jb250cm9sbGVyX2RhdGEgYW5kCi0gKiBjb250cm9sbGVyIHJlZ2lzdGVycyBhcyBhcHByb3ByaWF0ZS4KLSAqCi0gKgotICogTk9URTogIFNQSSBjb250cm9sbGVyIHBpbnMgY2FuIG9mdGVuIGJlIHVzZWQgYXMgR1BJTyBwaW5zIGluc3RlYWQsCi0gKiB3aGljaCBtZWFucyB5b3UgY291bGQgdXNlIGEgYml0YmFuZyBkcml2ZXIgZWl0aGVyIHRvIGdldCBoYXJkd2FyZQotICogd29ya2luZyBxdWlja2x5LCBvciB0ZXN0aW5nIGZvciBkaWZmZXJlbmNlcyB0aGF0IGFyZW4ndCBzcGVlZCByZWxhdGVkLgotICovCi0KLXN0cnVjdCBzcGlfYml0YmFuZ19jcyB7Ci0JdW5zaWduZWQJbnNlY3M7CS8qIChjbG9jayBjeWNsZSB0aW1lKS8yICovCi0JdTMyCQkoKnR4cnhfd29yZCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgbnNlY3MsCi0JCQkJCXUzMiB3b3JkLCB1OCBiaXRzKTsKLQl1bnNpZ25lZAkoKnR4cnhfYnVmcykoc3RydWN0IHNwaV9kZXZpY2UgKiwKLQkJCQkJdTMyICgqdHhyeF93b3JkKSgKLQkJCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCQkJCQl1bnNpZ25lZCBuc2VjcywKLQkJCQkJCXUzMiB3b3JkLCB1OCBiaXRzKSwKLQkJCQkJdW5zaWduZWQsIHN0cnVjdCBzcGlfdHJhbnNmZXIgKik7Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgYml0YmFuZ190eHJ4XzgoCi0Jc3RydWN0IHNwaV9kZXZpY2UJKnNwaSwKLQl1MzIJCQkoKnR4cnhfd29yZCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkJdW5zaWduZWQgbnNlY3MsCi0JCQkJCXUzMiB3b3JkLCB1OCBiaXRzKSwKLQl1bnNpZ25lZAkJbnMsCi0Jc3RydWN0IHNwaV90cmFuc2ZlcgkqdAotKSB7Ci0JdW5zaWduZWQJCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JdW5zaWduZWQJCWNvdW50ID0gdC0+bGVuOwotCWNvbnN0IHU4CQkqdHggPSB0LT50eF9idWY7Ci0JdTgJCQkqcnggPSB0LT5yeF9idWY7Ci0KLQl3aGlsZSAobGlrZWx5KGNvdW50ID4gMCkpIHsKLQkJdTgJCXdvcmQgPSAwOwotCi0JCWlmICh0eCkKLQkJCXdvcmQgPSAqdHgrKzsKLQkJd29yZCA9IHR4cnhfd29yZChzcGksIG5zLCB3b3JkLCBiaXRzKTsKLQkJaWYgKHJ4KQotCQkJKnJ4KysgPSB3b3JkOwotCQljb3VudCAtPSAxOwotCX0KLQlyZXR1cm4gdC0+bGVuIC0gY291bnQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBiaXRiYW5nX3R4cnhfMTYoCi0Jc3RydWN0IHNwaV9kZXZpY2UJKnNwaSwKLQl1MzIJCQkoKnR4cnhfd29yZCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkJdW5zaWduZWQgbnNlY3MsCi0JCQkJCXUzMiB3b3JkLCB1OCBiaXRzKSwKLQl1bnNpZ25lZAkJbnMsCi0Jc3RydWN0IHNwaV90cmFuc2ZlcgkqdAotKSB7Ci0JdW5zaWduZWQJCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JdW5zaWduZWQJCWNvdW50ID0gdC0+bGVuOwotCWNvbnN0IHUxNgkJKnR4ID0gdC0+dHhfYnVmOwotCXUxNgkJCSpyeCA9IHQtPnJ4X2J1ZjsKLQotCXdoaWxlIChsaWtlbHkoY291bnQgPiAxKSkgewotCQl1MTYJCXdvcmQgPSAwOwotCi0JCWlmICh0eCkKLQkJCXdvcmQgPSAqdHgrKzsKLQkJd29yZCA9IHR4cnhfd29yZChzcGksIG5zLCB3b3JkLCBiaXRzKTsKLQkJaWYgKHJ4KQotCQkJKnJ4KysgPSB3b3JkOwotCQljb3VudCAtPSAyOwotCX0KLQlyZXR1cm4gdC0+bGVuIC0gY291bnQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBiaXRiYW5nX3R4cnhfMzIoCi0Jc3RydWN0IHNwaV9kZXZpY2UJKnNwaSwKLQl1MzIJCQkoKnR4cnhfd29yZCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkJdW5zaWduZWQgbnNlY3MsCi0JCQkJCXUzMiB3b3JkLCB1OCBiaXRzKSwKLQl1bnNpZ25lZAkJbnMsCi0Jc3RydWN0IHNwaV90cmFuc2ZlcgkqdAotKSB7Ci0JdW5zaWduZWQJCWJpdHMgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JdW5zaWduZWQJCWNvdW50ID0gdC0+bGVuOwotCWNvbnN0IHUzMgkJKnR4ID0gdC0+dHhfYnVmOwotCXUzMgkJCSpyeCA9IHQtPnJ4X2J1ZjsKLQotCXdoaWxlIChsaWtlbHkoY291bnQgPiAzKSkgewotCQl1MzIJCXdvcmQgPSAwOwotCi0JCWlmICh0eCkKLQkJCXdvcmQgPSAqdHgrKzsKLQkJd29yZCA9IHR4cnhfd29yZChzcGksIG5zLCB3b3JkLCBiaXRzKTsKLQkJaWYgKHJ4KQotCQkJKnJ4KysgPSB3b3JkOwotCQljb3VudCAtPSA0OwotCX0KLQlyZXR1cm4gdC0+bGVuIC0gY291bnQ7Ci19Ci0KLWludCBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXN0cnVjdCBzcGlfYml0YmFuZ19jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0JdTgJCQliaXRzX3Blcl93b3JkOwotCXUzMgkJCWh6OwotCi0JaWYgKHQpIHsKLQkJYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7Ci0JCWh6ID0gdC0+c3BlZWRfaHo7Ci0JfSBlbHNlIHsKLQkJYml0c19wZXJfd29yZCA9IDA7Ci0JCWh6ID0gMDsKLQl9Ci0KLQkvKiBzcGlfdHJhbnNmZXIgbGV2ZWwgY2FsbHMgdGhhdCB3b3JrIHBlci13b3JkICovCi0JaWYgKCFiaXRzX3Blcl93b3JkKQotCQliaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCWlmIChiaXRzX3Blcl93b3JkIDw9IDgpCi0JCWNzLT50eHJ4X2J1ZnMgPSBiaXRiYW5nX3R4cnhfODsKLQllbHNlIGlmIChiaXRzX3Blcl93b3JkIDw9IDE2KQotCQljcy0+dHhyeF9idWZzID0gYml0YmFuZ190eHJ4XzE2OwotCWVsc2UgaWYgKGJpdHNfcGVyX3dvcmQgPD0gMzIpCi0JCWNzLT50eHJ4X2J1ZnMgPSBiaXRiYW5nX3R4cnhfMzI7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIG5zZWNzID0gKGNsb2NrIHBlcmlvZCkvMiAqLwotCWlmICghaHopCi0JCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0JaWYgKGh6KSB7Ci0JCWNzLT5uc2VjcyA9ICgxMDAwMDAwMDAwLzIpIC8gaHo7Ci0JCWlmIChjcy0+bnNlY3MgPiAoTUFYX1VERUxBWV9NUyAqIDEwMDAgKiAxMDAwKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2JpdGJhbmdfc2V0dXBfdHJhbnNmZXIpOwotCi0vKioKLSAqIHNwaV9iaXRiYW5nX3NldHVwIC0gZGVmYXVsdCBzZXR1cCBmb3IgcGVyLXdvcmQgSS9PIGxvb3BzCi0gKi8KLWludCBzcGlfYml0YmFuZ19zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBzcGlfYml0YmFuZ19jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0Jc3RydWN0IHNwaV9iaXRiYW5nCSpiaXRiYW5nOwotCWludAkJCXJldHZhbDsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCWJpdGJhbmcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQotCWlmICghY3MpIHsKLQkJY3MgPSBremFsbG9jKHNpemVvZiAqY3MsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNzKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IGNzOwotCX0KLQotCS8qIHBlci13b3JkIHNoaWZ0IHJlZ2lzdGVyIGFjY2VzcywgaW4gaGFyZHdhcmUgb3IgYml0YmFuZ2luZyAqLwotCWNzLT50eHJ4X3dvcmQgPSBiaXRiYW5nLT50eHJ4X3dvcmRbc3BpLT5tb2RlICYgKFNQSV9DUE9MfFNQSV9DUEhBKV07Ci0JaWYgKCFjcy0+dHhyeF93b3JkKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHZhbCA9IGJpdGJhbmctPnNldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiByZXR2YWw7Ci0KLQlkZXZfZGJnKCZzcGktPmRldiwgIiVzLCAldSBuc2VjL2JpdFxuIiwgX19mdW5jX18sIDIgKiBjcy0+bnNlY3MpOwotCi0JLyogTk9URSB3ZSBfbmVlZF8gdG8gY2FsbCBjaGlwc2VsZWN0KCkgZWFybHksIGlkZWFsbHkgd2l0aCBhZGFwdGVyCi0JICogc2V0dXAsIHVubGVzcyB0aGUgaGFyZHdhcmUgZGVmYXVsdHMgY29vcGVyYXRlIHRvIGF2b2lkIGNvbmZ1c2lvbgotCSAqIGJldHdlZW4gbm9ybWFsIChhY3RpdmUgbG93KSBhbmQgaW52ZXJ0ZWQgY2hpcHNlbGVjdHMuCi0JICovCi0KLQkvKiBkZXNlbGVjdCBjaGlwIChsb3cgb3IgaGlnaCkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0YmFuZy0+bG9jaywgZmxhZ3MpOwotCWlmICghYml0YmFuZy0+YnVzeSkgewotCQliaXRiYW5nLT5jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19JTkFDVElWRSk7Ci0JCW5kZWxheShjcy0+bnNlY3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNwaV9iaXRiYW5nX3NldHVwKTsKLQotLyoqCi0gKiBzcGlfYml0YmFuZ19jbGVhbnVwIC0gZGVmYXVsdCBjbGVhbnVwIGZvciBwZXItd29yZCBJL08gbG9vcHMKLSAqLwotdm9pZCBzcGlfYml0YmFuZ19jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Ja2ZyZWUoc3BpLT5jb250cm9sbGVyX3N0YXRlKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNwaV9iaXRiYW5nX2NsZWFudXApOwotCi1zdGF0aWMgaW50IHNwaV9iaXRiYW5nX2J1ZnMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlzdHJ1Y3Qgc3BpX2JpdGJhbmdfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCXVuc2lnbmVkCQluc2VjcyA9IGNzLT5uc2VjczsKLQotCXJldHVybiBjcy0+dHhyeF9idWZzKHNwaSwgY3MtPnR4cnhfd29yZCwgbnNlY3MsIHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogU0VDT05EIFBBUlQgLi4uIHNpbXBsZSB0cmFuc2ZlciBxdWV1ZSBydW5uZXIuCi0gKgotICogVGhpcyBjb3N0cyBhIHRhc2sgY29udGV4dCBwZXIgY29udHJvbGxlciwgcnVubmluZyB0aGUgcXVldWUgYnkKLSAqIHBlcmZvcm1pbmcgZWFjaCB0cmFuc2ZlciBpbiBzZXF1ZW5jZS4gIFNtYXJ0ZXIgaGFyZHdhcmUgY2FuIHF1ZXVlCi0gKiBzZXZlcmFsIERNQSB0cmFuc2ZlcnMgYXQgb25jZSwgYW5kIHByb2Nlc3Mgc2V2ZXJhbCBjb250cm9sbGVyIHF1ZXVlcwotICogaW4gcGFyYWxsZWw7IHRoaXMgZHJpdmVyIGRvZXNuJ3QgbWF0Y2ggc3VjaCBoYXJkd2FyZSB2ZXJ5IHdlbGwuCi0gKgotICogRHJpdmVycyBjYW4gcHJvdmlkZSB3b3JkLWF0LWEtdGltZSBpL28gcHJpbWl0aXZlcywgb3IgcHJvdmlkZQotICogdHJhbnNmZXItYXQtYS10aW1lIG9uZXMgdG8gbGV2ZXJhZ2UgZG1hIG9yIGZpZm8gaGFyZHdhcmUuCi0gKi8KLXN0YXRpYyB2b2lkIGJpdGJhbmdfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHNwaV9iaXRiYW5nCSpiaXRiYW5nID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzcGlfYml0YmFuZywgd29yayk7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0YmFuZy0+bG9jaywgZmxhZ3MpOwotCWJpdGJhbmctPmJ1c3kgPSAxOwotCXdoaWxlICghbGlzdF9lbXB0eSgmYml0YmFuZy0+cXVldWUpKSB7Ci0JCXN0cnVjdCBzcGlfbWVzc2FnZQkqbTsKLQkJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKLQkJdW5zaWduZWQJCW5zZWNzOwotCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0ID0gTlVMTDsKLQkJdW5zaWduZWQJCXRtcDsKLQkJdW5zaWduZWQJCWNzX2NoYW5nZTsKLQkJaW50CQkJc3RhdHVzOwotCQlpbnQJCQlkb19zZXR1cCA9IC0xOwotCi0JCW0gPSBjb250YWluZXJfb2YoYml0YmFuZy0+cXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLAotCQkJCXF1ZXVlKTsKLQkJbGlzdF9kZWxfaW5pdCgmbS0+cXVldWUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogRklYTUUgdGhpcyBpcyBtYWRlLXVwIC4uLiB0aGUgY29ycmVjdCB2YWx1ZSBpcyBrbm93biB0bwotCQkgKiB3b3JkLWF0LWEtdGltZSBiaXRiYW5nIGNvZGUsIGFuZCBwcmVzdW1hYmx5IGNoaXBzZWxlY3QoKQotCQkgKiBzaG91bGQgZW5mb3JjZSB0aGVzZSByZXF1aXJlbWVudHMgdG9vPwotCQkgKi8KLQkJbnNlY3MgPSAxMDA7Ci0KLQkJc3BpID0gbS0+c3BpOwotCQl0bXAgPSAwOwotCQljc19jaGFuZ2UgPSAxOwotCQlzdGF0dXMgPSAwOwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkgKHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQotCQkJLyogb3ZlcnJpZGUgc3BlZWQgb3Igd29yZHNpemU/ICovCi0JCQlpZiAodC0+c3BlZWRfaHogfHwgdC0+Yml0c19wZXJfd29yZCkKLQkJCQlkb19zZXR1cCA9IDE7Ci0KLQkJCS8qIGluaXQgKC0xKSBvciBvdmVycmlkZSAoMSkgdHJhbnNmZXIgcGFyYW1zICovCi0JCQlpZiAoZG9fc2V0dXAgIT0gMCkgewotCQkJCXN0YXR1cyA9IGJpdGJhbmctPnNldHVwX3RyYW5zZmVyKHNwaSwgdCk7Ci0JCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJCWJyZWFrOwotCQkJCWlmIChkb19zZXR1cCA9PSAtMSkKLQkJCQkJZG9fc2V0dXAgPSAwOwotCQkJfQotCi0JCQkvKiBzZXQgdXAgZGVmYXVsdCBjbG9jayBwb2xhcml0eSwgYW5kIGFjdGl2YXRlIGNoaXA7Ci0JCQkgKiB0aGlzIGltcGxpY2l0bHkgdXBkYXRlcyBjbG9jayBhbmQgc3BpIG1vZGVzIGFzCi0JCQkgKiBwcmV2aW91c2x5IHJlY29yZGVkIGZvciB0aGlzIGRldmljZSB2aWEgc2V0dXAoKS4KLQkJCSAqIChhbmQgYWxzbyBkZXNlbGVjdHMgYW55IG90aGVyIGNoaXAgdGhhdCBtaWdodCBiZQotCQkJICogc2VsZWN0ZWQgLi4uKQotCQkJICovCi0JCQlpZiAoY3NfY2hhbmdlKSB7Ci0JCQkJYml0YmFuZy0+Y2hpcHNlbGVjdChzcGksIEJJVEJBTkdfQ1NfQUNUSVZFKTsKLQkJCQluZGVsYXkobnNlY3MpOwotCQkJfQotCQkJY3NfY2hhbmdlID0gdC0+Y3NfY2hhbmdlOwotCQkJaWYgKCF0LT50eF9idWYgJiYgIXQtPnJ4X2J1ZiAmJiB0LT5sZW4pIHsKLQkJCQlzdGF0dXMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiB0cmFuc2ZlciBkYXRhLiAgdGhlIGxvd2VyIGxldmVsIGNvZGUgaGFuZGxlcyBhbnkKLQkJCSAqIG5ldyBkbWEgbWFwcGluZ3MgaXQgbmVlZHMuIG91ciBjYWxsZXIgYWx3YXlzIGdhdmUKLQkJCSAqIHVzIGRtYS1zYWZlIGJ1ZmZlcnMuCi0JCQkgKi8KLQkJCWlmICh0LT5sZW4pIHsKLQkJCQkvKiBSRVZJU0lUIGRtYSBBUEkgc3RpbGwgbmVlZHMgYSBkZXNpZ25hdGVkCi0JCQkJICogRE1BX0FERFJfSU5WQUxJRDsgfjAgbWlnaHQgYmUgYmV0dGVyLgotCQkJCSAqLwotCQkJCWlmICghbS0+aXNfZG1hX21hcHBlZCkKLQkJCQkJdC0+cnhfZG1hID0gdC0+dHhfZG1hID0gMDsKLQkJCQlzdGF0dXMgPSBiaXRiYW5nLT50eHJ4X2J1ZnMoc3BpLCB0KTsKLQkJCX0KLQkJCWlmIChzdGF0dXMgPiAwKQotCQkJCW0tPmFjdHVhbF9sZW5ndGggKz0gc3RhdHVzOwotCQkJaWYgKHN0YXR1cyAhPSB0LT5sZW4pIHsKLQkJCQkvKiBhbHdheXMgcmVwb3J0IHNvbWUga2luZCBvZiBlcnJvciAqLwotCQkJCWlmIChzdGF0dXMgPj0gMCkKLQkJCQkJc3RhdHVzID0gLUVSRU1PVEVJTzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXN0YXR1cyA9IDA7Ci0KLQkJCS8qIHByb3RvY29sIHR3ZWFrcyBiZWZvcmUgbmV4dCB0cmFuc2ZlciAqLwotCQkJaWYgKHQtPmRlbGF5X3VzZWNzKQotCQkJCXVkZWxheSh0LT5kZWxheV91c2Vjcyk7Ci0KLQkJCWlmICghY3NfY2hhbmdlKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHQtPnRyYW5zZmVyX2xpc3QubmV4dCA9PSAmbS0+dHJhbnNmZXJzKQotCQkJCWJyZWFrOwotCi0JCQkvKiBzb21ldGltZXMgYSBzaG9ydCBtaWQtbWVzc2FnZSBkZXNlbGVjdCBvZiB0aGUgY2hpcAotCQkJICogbWF5IGJlIG5lZWRlZCB0byB0ZXJtaW5hdGUgYSBtb2RlIG9yIGNvbW1hbmQKLQkJCSAqLwotCQkJbmRlbGF5KG5zZWNzKTsKLQkJCWJpdGJhbmctPmNoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0lOQUNUSVZFKTsKLQkJCW5kZWxheShuc2Vjcyk7Ci0JCX0KLQotCQltLT5zdGF0dXMgPSBzdGF0dXM7Ci0JCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOwotCi0JCS8qIG5vcm1hbGx5IGRlYWN0aXZhdGUgY2hpcHNlbGVjdCAuLi4gdW5sZXNzIG5vIGVycm9yIGFuZAotCQkgKiBjc19jaGFuZ2UgaGFzIGhpbnRlZCB0aGF0IHRoZSBuZXh0IG1lc3NhZ2Ugd2lsbCBwcm9iYWJseQotCQkgKiBiZSBmb3IgdGhpcyBjaGlwIHRvby4KLQkJICovCi0JCWlmICghKHN0YXR1cyA9PSAwICYmIGNzX2NoYW5nZSkpIHsKLQkJCW5kZWxheShuc2Vjcyk7Ci0JCQliaXRiYW5nLT5jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19JTkFDVElWRSk7Ci0JCQluZGVsYXkobnNlY3MpOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJpdGJhbmctPmxvY2ssIGZsYWdzKTsKLQl9Ci0JYml0YmFuZy0+YnVzeSA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0YmFuZy0+bG9jaywgZmxhZ3MpOwotfQotCi0vKioKLSAqIHNwaV9iaXRiYW5nX3RyYW5zZmVyIC0gZGVmYXVsdCBzdWJtaXQgdG8gdHJhbnNmZXIgcXVldWUKLSAqLwotaW50IHNwaV9iaXRiYW5nX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKLXsKLQlzdHJ1Y3Qgc3BpX2JpdGJhbmcJKmJpdGJhbmc7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0JaW50CQkJc3RhdHVzID0gMDsKLQotCW0tPmFjdHVhbF9sZW5ndGggPSAwOwotCW0tPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKLQotCWJpdGJhbmcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCFzcGktPm1heF9zcGVlZF9oeikKLQkJc3RhdHVzID0gLUVORVRET1dOOwotCWVsc2UgewotCQlsaXN0X2FkZF90YWlsKCZtLT5xdWV1ZSwgJmJpdGJhbmctPnF1ZXVlKTsKLQkJcXVldWVfd29yayhiaXRiYW5nLT53b3JrcXVldWUsICZiaXRiYW5nLT53b3JrKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0YmFuZy0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNwaV9iaXRiYW5nX3RyYW5zZmVyKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqCi0gKiBzcGlfYml0YmFuZ19zdGFydCAtIHN0YXJ0IHVwIGEgcG9sbGVkL2JpdGJhbmdpbmcgU1BJIG1hc3RlciBkcml2ZXIKLSAqIEBiaXRiYW5nOiBkcml2ZXIgaGFuZGxlCi0gKgotICogQ2FsbGVyIHNob3VsZCBoYXZlIHplcm8taW5pdGlhbGl6ZWQgYWxsIHBhcnRzIG9mIHRoZSBzdHJ1Y3R1cmUsIGFuZCB0aGVuCi0gKiBwcm92aWRlZCBjYWxsYmFja3MgZm9yIGNoaXAgc2VsZWN0aW9uIGFuZCBJL08gbG9vcHMuICBJZiB0aGUgbWFzdGVyIGhhcwotICogYSB0cmFuc2ZlciBtZXRob2QsIGl0cyBmaW5hbCBzdGVwIHNob3VsZCBjYWxsIHNwaV9iaXRiYW5nX3RyYW5zZmVyOyBvciwKLSAqIHRoYXQncyB0aGUgZGVmYXVsdCBpZiB0aGUgdHJhbnNmZXIgcm91dGluZSBpcyBub3QgaW5pdGlhbGl6ZWQuICBJdCBzaG91bGQKLSAqIGFsc28gc2V0IHVwIHRoZSBidXMgbnVtYmVyIGFuZCBudW1iZXIgb2YgY2hpcHNlbGVjdHMuCi0gKgotICogRm9yIGkvbyBsb29wcywgcHJvdmlkZSBjYWxsYmFja3MgZWl0aGVyIHBlci13b3JkIChmb3IgYml0YmFuZ2luZywgb3IgZm9yCi0gKiBoYXJkd2FyZSB0aGF0IGJhc2ljYWxseSBleHBvc2VzIGEgc2hpZnQgcmVnaXN0ZXIpIG9yIHBlci1zcGlfdHJhbnNmZXIKLSAqICh3aGljaCB0YWtlcyBiZXR0ZXIgYWR2YW50YWdlIG9mIGhhcmR3YXJlIGxpa2UgZmlmb3Mgb3IgRE1BIGVuZ2luZXMpLgotICoKLSAqIERyaXZlcnMgdXNpbmcgcGVyLXdvcmQgSS9PIGxvb3BzIHNob3VsZCB1c2UgKG9yIGNhbGwpIHNwaV9iaXRiYW5nX3NldHVwLAotICogc3BpX2JpdGJhbmdfY2xlYW51cCBhbmQgc3BpX2JpdGJhbmdfc2V0dXBfdHJhbnNmZXIgdG8gaGFuZGxlIHRob3NlIHNwaQotICogbWFzdGVyIG1ldGhvZHMuICBUaG9zZSBtZXRob2RzIGFyZSB0aGUgZGVmYXVsdHMgaWYgdGhlIGJpdGJhbmctPnR4cnhfYnVmcwotICogcm91dGluZSBpc24ndCBpbml0aWFsaXplZC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgcmVnaXN0ZXJzIHRoZSBzcGlfbWFzdGVyLCB3aGljaCB3aWxsIHByb2Nlc3MgcmVxdWVzdHMgaW4gYQotICogZGVkaWNhdGVkIHRhc2ssIGtlZXBpbmcgSVJRcyB1bmJsb2NrZWQgbW9zdCBvZiB0aGUgdGltZS4gIFRvIHN0b3AKLSAqIHByb2Nlc3NpbmcgdGhvc2UgcmVxdWVzdHMsIGNhbGwgc3BpX2JpdGJhbmdfc3RvcCgpLgotICovCi1pbnQgc3BpX2JpdGJhbmdfc3RhcnQoc3RydWN0IHNwaV9iaXRiYW5nICpiaXRiYW5nKQotewotCWludAlzdGF0dXM7Ci0KLQlpZiAoIWJpdGJhbmctPm1hc3RlciB8fCAhYml0YmFuZy0+Y2hpcHNlbGVjdCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlJTklUX1dPUksoJmJpdGJhbmctPndvcmssIGJpdGJhbmdfd29yayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJpdGJhbmctPmxvY2spOwotCUlOSVRfTElTVF9IRUFEKCZiaXRiYW5nLT5xdWV1ZSk7Ci0KLQlpZiAoIWJpdGJhbmctPm1hc3Rlci0+bW9kZV9iaXRzKQotCQliaXRiYW5nLT5tYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBiaXRiYW5nLT5mbGFnczsKLQotCWlmICghYml0YmFuZy0+bWFzdGVyLT50cmFuc2ZlcikKLQkJYml0YmFuZy0+bWFzdGVyLT50cmFuc2ZlciA9IHNwaV9iaXRiYW5nX3RyYW5zZmVyOwotCWlmICghYml0YmFuZy0+dHhyeF9idWZzKSB7Ci0JCWJpdGJhbmctPnVzZV9kbWEgPSAwOwotCQliaXRiYW5nLT50eHJ4X2J1ZnMgPSBzcGlfYml0YmFuZ19idWZzOwotCQlpZiAoIWJpdGJhbmctPm1hc3Rlci0+c2V0dXApIHsKLQkJCWlmICghYml0YmFuZy0+c2V0dXBfdHJhbnNmZXIpCi0JCQkJYml0YmFuZy0+c2V0dXBfdHJhbnNmZXIgPQotCQkJCQkgc3BpX2JpdGJhbmdfc2V0dXBfdHJhbnNmZXI7Ci0JCQliaXRiYW5nLT5tYXN0ZXItPnNldHVwID0gc3BpX2JpdGJhbmdfc2V0dXA7Ci0JCQliaXRiYW5nLT5tYXN0ZXItPmNsZWFudXAgPSBzcGlfYml0YmFuZ19jbGVhbnVwOwotCQl9Ci0JfSBlbHNlIGlmICghYml0YmFuZy0+bWFzdGVyLT5zZXR1cCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGJpdGJhbmctPm1hc3Rlci0+dHJhbnNmZXIgPT0gc3BpX2JpdGJhbmdfdHJhbnNmZXIgJiYKLQkJCSFiaXRiYW5nLT5zZXR1cF90cmFuc2ZlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiB0aGlzIHRhc2sgaXMgdGhlIG9ubHkgdGhpbmcgdG8gdG91Y2ggdGhlIFNQSSBiaXRzICovCi0JYml0YmFuZy0+YnVzeSA9IDA7Ci0JYml0YmFuZy0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCi0JCQlkZXZfbmFtZShiaXRiYW5nLT5tYXN0ZXItPmRldi5wYXJlbnQpKTsKLQlpZiAoYml0YmFuZy0+d29ya3F1ZXVlID09IE5VTEwpIHsKLQkJc3RhdHVzID0gLUVCVVNZOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JLyogZHJpdmVyIG1heSBnZXQgYnVzeSBiZWZvcmUgcmVnaXN0ZXIoKSByZXR1cm5zLCBlc3BlY2lhbGx5Ci0JICogaWYgc29tZW9uZSByZWdpc3RlcmVkIGJvYXJkaW5mbyBmb3IgZGV2aWNlcwotCSAqLwotCXN0YXR1cyA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIoYml0YmFuZy0+bWFzdGVyKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJZ290byBlcnIyOwotCi0JcmV0dXJuIHN0YXR1czsKLQotZXJyMjoKLQlkZXN0cm95X3dvcmtxdWV1ZShiaXRiYW5nLT53b3JrcXVldWUpOwotZXJyMToKLQlyZXR1cm4gc3RhdHVzOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2JpdGJhbmdfc3RhcnQpOwotCi0vKioKLSAqIHNwaV9iaXRiYW5nX3N0b3AgLSBzdG9wcyB0aGUgdGFzayBwcm92aWRpbmcgc3BpIGNvbW11bmljYXRpb24KLSAqLwotaW50IHNwaV9iaXRiYW5nX3N0b3Aoc3RydWN0IHNwaV9iaXRiYW5nICpiaXRiYW5nKQotewotCXNwaV91bnJlZ2lzdGVyX21hc3RlcihiaXRiYW5nLT5tYXN0ZXIpOwotCi0JV0FSTl9PTighbGlzdF9lbXB0eSgmYml0YmFuZy0+cXVldWUpKTsKLQotCWRlc3Ryb3lfd29ya3F1ZXVlKGJpdGJhbmctPndvcmtxdWV1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNwaV9iaXRiYW5nX3N0b3ApOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYyBiL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0Y2ViYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoKLSAqIHNwaV9idXR0ZXJmbHkuYyAtIHBhcnBvcnQtdG8tYnV0dGVyZmx5IGFkYXB0ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgQnJvd25lbGwKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgotCi0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLQotCi0vKgotICogVGhpcyB1c2VzIFNQSSB0byB0YWxrIHdpdGggYW4gIkFWUiBCdXR0ZXJmbHkiLCB3aGljaCBpcyBhICRVUzIwIGNhcmQKLSAqIHdpdGggYSBiYXR0ZXJ5IHBvd2VyZWQgQVZSIG1pY3JvY29udHJvbGxlciBhbmQgbG90cyBvZiBnb29kaWVzLiAgWW91Ci0gKiBjYW4gdXNlIEdDQyB0byBkZXZlbG9wIGZpcm13YXJlIGZvciB0aGlzLgotICoKLSAqIFNlZSBEb2N1bWVudGF0aW9uL3NwaS9idXR0ZXJmbHkgZm9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBidWlsZAotICogYW5kIHVzZSB0aGlzIGN1c3RvbSBwYXJhbGxlbCBwb3J0IGNhYmxlLgotICovCi0KLQotLyogREFUQSBvdXRwdXQgYml0cyAocGlucyAyLi45ID09IEQwLi5ENykgKi8KLSNkZWZpbmUJYnV0dGVyZmx5X25yZXNldCAoMSA8PCAxKQkJLyogcGluIDMgKi8KLQotI2RlZmluZQlzcGlfc2NrX2JpdAkoMSA8PCAwKQkJLyogcGluIDIgKi8KLSNkZWZpbmUJc3BpX21vc2lfYml0CSgxIDw8IDcpCQkvKiBwaW4gOSAqLwotCi0jZGVmaW5lCXZjY19iaXRzCSgoMSA8PCA2KSB8ICgxIDw8IDUpKQkvKiBwaW5zIDcsIDggKi8KLQotLyogU1RBVFVTIGlucHV0IGJpdHMgKi8KLSNkZWZpbmUJc3BpX21pc29fYml0CVBBUlBPUlRfU1RBVFVTX0JVU1kJLyogcGluIDExICovCi0KLS8qIENPTlRST0wgb3V0cHV0IGJpdHMgKi8KLSNkZWZpbmUJc3BpX2NzX2JpdAlQQVJQT1JUX0NPTlRST0xfU0VMRUNUCS8qIHBpbiAxNyAqLwotCi0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgYnV0dGVyZmx5ICpzcGlkZXZfdG9fcHAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlyZXR1cm4gc3BpLT5jb250cm9sbGVyX2RhdGE7Ci19Ci0KLQotc3RydWN0IGJ1dHRlcmZseSB7Ci0JLyogUkVWSVNJVCAuLi4gZm9yIG5vdywgdGhpcyBtdXN0IGJlIGZpcnN0ICovCi0Jc3RydWN0IHNwaV9iaXRiYW5nCWJpdGJhbmc7Ci0KLQlzdHJ1Y3QgcGFycG9ydAkJKnBvcnQ7Ci0Jc3RydWN0IHBhcmRldmljZQkqcGQ7Ci0KLQl1OAkJCWxhc3RieXRlOwotCi0Jc3RydWN0IHNwaV9kZXZpY2UJKmRhdGFmbGFzaDsKLQlzdHJ1Y3Qgc3BpX2RldmljZQkqYnV0dGVyZmx5OwotCXN0cnVjdCBzcGlfYm9hcmRfaW5mbwlpbmZvWzJdOwotCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNldHNjayhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCi17Ci0Jc3RydWN0IGJ1dHRlcmZseQkqcHAgPSBzcGlkZXZfdG9fcHAoc3BpKTsKLQl1OAkJCWJpdCwgYnl0ZSA9IHBwLT5sYXN0Ynl0ZTsKLQotCWJpdCA9IHNwaV9zY2tfYml0OwotCi0JaWYgKGlzX29uKQotCQlieXRlIHw9IGJpdDsKLQllbHNlCi0JCWJ5dGUgJj0gfmJpdDsKLQlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGJ5dGUpOwotCXBwLT5sYXN0Ynl0ZSA9IGJ5dGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotc2V0bW9zaShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCi17Ci0Jc3RydWN0IGJ1dHRlcmZseQkqcHAgPSBzcGlkZXZfdG9fcHAoc3BpKTsKLQl1OAkJCWJpdCwgYnl0ZSA9IHBwLT5sYXN0Ynl0ZTsKLQotCWJpdCA9IHNwaV9tb3NpX2JpdDsKLQotCWlmIChpc19vbikKLQkJYnl0ZSB8PSBiaXQ7Ci0JZWxzZQotCQlieXRlICY9IH5iaXQ7Ci0JcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBieXRlKTsKLQlwcC0+bGFzdGJ5dGUgPSBieXRlOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBnZXRtaXNvKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IGJ1dHRlcmZseQkqcHAgPSBzcGlkZXZfdG9fcHAoc3BpKTsKLQlpbnQJCQl2YWx1ZTsKLQl1OAkJCWJpdDsKLQotCWJpdCA9IHNwaV9taXNvX2JpdDsKLQotCS8qIG9ubHkgU1RBVFVTX0JVU1kgaXMgTk9UIG5lZ2F0ZWQgKi8KLQl2YWx1ZSA9ICEocGFycG9ydF9yZWFkX3N0YXR1cyhwcC0+cG9ydCkgJiBiaXQpOwotCXJldHVybiAoYml0ID09IFBBUlBPUlRfU1RBVFVTX0JVU1kpID8gdmFsdWUgOiAhdmFsdWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ1dHRlcmZseV9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgYnV0dGVyZmx5CSpwcCA9IHNwaWRldl90b19wcChzcGkpOwotCi0JLyogc2V0IGRlZmF1bHQgY2xvY2sgcG9sYXJpdHkgKi8KLQlpZiAodmFsdWUgIT0gQklUQkFOR19DU19JTkFDVElWRSkKLQkJc2V0c2NrKHNwaSwgc3BpLT5tb2RlICYgU1BJX0NQT0wpOwotCi0JLyogaGVyZSwgdmFsdWUgPT0gImFjdGl2YXRlIG9yIG5vdCI7Ci0JICogbW9zdCBQQVJQT1JUX0NPTlRST0xfKiBiaXRzIGFyZSBuZWdhdGVkLCBzbyB3ZSBtdXN0Ci0JICogbW9ycGggaXQgdG8gdmFsdWUgPT0gImJpdCB2YWx1ZSB0byB3cml0ZSBpbiBjb250cm9sIHJlZ2lzdGVyIgotCSAqLwotCWlmIChzcGlfY3NfYml0ID09IFBBUlBPUlRfQ09OVFJPTF9JTklUKQotCQl2YWx1ZSA9ICF2YWx1ZTsKLQotCXBhcnBvcnRfZnJvYl9jb250cm9sKHBwLT5wb3J0LCBzcGlfY3NfYml0LCB2YWx1ZSA/IHNwaV9jc19iaXQgOiAwKTsKLX0KLQotCi0vKiB3ZSBvbmx5IG5lZWRlZCB0byBpbXBsZW1lbnQgb25lIG1vZGUgaGVyZSwgYW5kIGNob29zZSBTUElfTU9ERV8wICovCi0KLSNkZWZpbmUJc3BpZGVsYXkoWCkJZG97fXdoaWxlKDApCi0vLyNkZWZpbmUJc3BpZGVsYXkJbmRlbGF5Ci0KLSNpbmNsdWRlICJzcGlfYml0YmFuZ190eHJ4LmgiCi0KLXN0YXRpYyB1MzIKLWJ1dHRlcmZseV90eHJ4X3dvcmRfbW9kZTAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJdW5zaWduZWQgbnNlY3MsCi0JCXUzMiB3b3JkLCB1OCBiaXRzKQotewotCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMCwgMCwgd29yZCwgYml0cyk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIG92ZXJyaWRlIGRlZmF1bHQgcGFydGl0aW9uaW5nIHdpdGggY21kbGluZXBhcnQgKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25zW10gPSB7IHsKLQkvKiBKRkZTMiB3YW50cyBwYXJ0aXRpb25zIG9mIDQqTiBibG9ja3MgZm9yIHRoaXMgZGV2aWNlLAotCSAqIHNvIHNlY3RvcnMgMCBhbmQgMSBjYW4ndCBiZSBwYXJ0aXRpb25zIGJ5IHRoZW1zZWx2ZXMuCi0JICovCi0KLQkvKiBzZWN0b3IgMCA9IDggcGFnZXMgKiAyNjQgYnl0ZXMvcGFnZSAoMSBibG9jaykKLQkgKiBzZWN0b3IgMSA9IDI0OCBwYWdlcyAqIDI2NCBieXRlcy9wYWdlCi0JICovCi0JLm5hbWUJCT0gImJvb2trZWVwaW5nIiwJLy8gNjYgS0IKLQkub2Zmc2V0CQk9IDAsCi0JLnNpemUJCT0gKDggKyAyNDgpICogMjY0LAotLy8JLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLAotfSwgewotCS8qIHNlY3RvciAyID0gMjU2IHBhZ2VzICogMjY0IGJ5dGVzL3BhZ2UKLQkgKiBzZWN0b3JzIDMtNSA9IDUxMiBwYWdlcyAqIDI2NCBieXRlcy9wYWdlCi0JICovCi0JLm5hbWUJCT0gImZpbGVzeXN0ZW0iLAkJLy8gNDYyIEtCCi0JLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCi0JLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTCwKLX0gfTsKLQotc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGZsYXNoID0gewotCS5uYW1lCQk9ICJidXR0ZXJmbGFzaCIsCi0JLnBhcnRzCQk9IHBhcnRpdGlvbnMsCi0JLm5yX3BhcnRzCT0gQVJSQVlfU0laRShwYXJ0aXRpb25zKSwKLX07Ci0KLQotLyogUkVWSVNJVCByZW1vdmUgdGhpcyB1Z2x5IGdsb2JhbCBhbmQgaXRzICJvbmx5IG9uZSIgbGltaXRhdGlvbiAqLwotc3RhdGljIHN0cnVjdCBidXR0ZXJmbHkgKmJ1dHRlcmZseTsKLQotc3RhdGljIHZvaWQgYnV0dGVyZmx5X2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcCkKLXsKLQlzdHJ1Y3QgcGFyZGV2aWNlCSpwZDsKLQlpbnQJCQlzdGF0dXM7Ci0Jc3RydWN0IGJ1dHRlcmZseQkqcHA7Ci0Jc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gcC0+cGh5c3BvcnQtPmRldjsKLQotCWlmIChidXR0ZXJmbHkgfHwgIWRldikKLQkJcmV0dXJuOwotCi0JLyogUkVWSVNJVDogIHRoaXMganVzdCBfYXNzdW1lc18gYSBidXR0ZXJmbHkgaXMgdGhlcmUgLi4uIG5vIHByb2JlLAotCSAqIGFuZCBubyB3YXkgdG8gYmUgc2VsZWN0aXZlIGFib3V0IHdoYXQgaXQgYmluZHMgdG8uCi0JICovCi0KLQltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKGRldiwgc2l6ZW9mICpwcCk7Ci0JaWYgKCFtYXN0ZXIpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQlwcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQotCS8qCi0JICogU1BJIGFuZCBiaXRiYW5nIGhvb2t1cAotCSAqCi0JICogdXNlIGRlZmF1bHQgc2V0dXAoKSwgY2xlYW51cCgpLCBhbmQgdHJhbnNmZXIoKSBtZXRob2RzOyBhbmQKLQkgKiBvbmx5IGJvdGhlciBpbXBsZW1lbnRpbmcgbW9kZSAwLiAgU3RhcnQgaXQgbGF0ZXIuCi0JICovCi0JbWFzdGVyLT5idXNfbnVtID0gNDI7Ci0JbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDI7Ci0KLQlwcC0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOwotCXBwLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBidXR0ZXJmbHlfY2hpcHNlbGVjdDsKLQlwcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBidXR0ZXJmbHlfdHhyeF93b3JkX21vZGUwOwotCi0JLyoKLQkgKiBwYXJwb3J0IGhvb2t1cAotCSAqLwotCXBwLT5wb3J0ID0gcDsKLQlwZCA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHAsICJzcGlfYnV0dGVyZmx5IiwKLQkJCU5VTEwsIE5VTEwsIE5VTEwsCi0JCQkwIC8qIEZMQUdTICovLCBwcCk7Ci0JaWYgKCFwZCkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQlnb3RvIGNsZWFuMDsKLQl9Ci0JcHAtPnBkID0gcGQ7Ci0KLQlzdGF0dXMgPSBwYXJwb3J0X2NsYWltKHBkKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJZ290byBjbGVhbjE7Ci0KLQkvKgotCSAqIEJ1dHRlcmZseSByZXNldCwgcG93ZXJ1cCwgcnVuIGZpcm13YXJlCi0JICovCi0JcHJfZGVidWcoIiVzOiBwb3dlcnVwL3Jlc2V0IEJ1dHRlcmZseVxuIiwgcC0+bmFtZSk7Ci0KLQkvKiBuQ1MgZm9yIGRhdGFmbGFzaCAodGhpcyBiaXQgaXMgaW52ZXJ0ZWQgb24gb3V0cHV0KSAqLwotCXBhcnBvcnRfZnJvYl9jb250cm9sKHBwLT5wb3J0LCBzcGlfY3NfYml0LCAwKTsKLQotCS8qIHN0YWJpbGl6ZSBwb3dlciB3aXRoIGNoaXAgaW4gcmVzZXQgKG5SRVNFVCksIGFuZAotCSAqIHNwaV9zY2tfYml0IGNsZWFyIChDUE9MPTApCi0JICovCi0JcHAtPmxhc3RieXRlIHw9IHZjY19iaXRzOwotCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgcHAtPmxhc3RieXRlKTsKLQltc2xlZXAoNSk7Ci0KLQkvKiB0YWtlIGl0IG91dCBvZiByZXNldDsgYXNzdW1lIGxvbmcgcmVzZXQgZGVsYXkgKi8KLQlwcC0+bGFzdGJ5dGUgfD0gYnV0dGVyZmx5X25yZXNldDsKLQlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIHBwLT5sYXN0Ynl0ZSk7Ci0JbXNsZWVwKDEwMCk7Ci0KLQotCS8qCi0JICogU3RhcnQgU1BJIC4uLiBmb3Igbm93LCBoaWRlIHRoYXQgd2UncmUgdHdvIHBoeXNpY2FsIGJ1c3Nlcy4KLQkgKi8KLQlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdGFydCgmcHAtPmJpdGJhbmcpOwotCWlmIChzdGF0dXMgPCAwKQotCQlnb3RvIGNsZWFuMjsKLQotCS8qIEJ1cyAxIGxldHMgdXMgdGFsayB0byBhdDQ1ZGIwNDFiIChmaXJtd2FyZSBkaXNhYmxlcyBBVlIgU1BJKSwgQVZSCi0JICogKGZpcm13YXJlIHJlc2V0cyBhdDQ1LCBhY3RzIGFzIHNwaSBzbGF2ZSkgb3IgbmVpdGhlciAod2UgaWdub3JlCi0JICogYm90aCwgQVZSIHVzZXMgQVQ0NSkuICBIZXJlIHdlIGV4cGVjdCBmaXJtd2FyZSBmb3IgdGhlIGZpcnN0IG9wdGlvbi4KLQkgKi8KLQotCXBwLT5pbmZvWzBdLm1heF9zcGVlZF9oeiA9IDE1ICogMTAwMCAqIDEwMDA7Ci0Jc3RyY3B5KHBwLT5pbmZvWzBdLm1vZGFsaWFzLCAibXRkX2RhdGFmbGFzaCIpOwotCXBwLT5pbmZvWzBdLnBsYXRmb3JtX2RhdGEgPSAmZmxhc2g7Ci0JcHAtPmluZm9bMF0uY2hpcF9zZWxlY3QgPSAxOwotCXBwLT5pbmZvWzBdLmNvbnRyb2xsZXJfZGF0YSA9IHBwOwotCXBwLT5kYXRhZmxhc2ggPSBzcGlfbmV3X2RldmljZShwcC0+Yml0YmFuZy5tYXN0ZXIsICZwcC0+aW5mb1swXSk7Ci0JaWYgKHBwLT5kYXRhZmxhc2gpCi0JCXByX2RlYnVnKCIlczogZGF0YWZsYXNoIGF0ICVzXG4iLCBwLT5uYW1lLAotCQkJCWRldl9uYW1lKCZwcC0+ZGF0YWZsYXNoLT5kZXYpKTsKLQotCS8vIGRldl9pbmZvKF93aGF0P18sIC4uLikKLQlwcl9pbmZvKCIlczogQVZSIEJ1dHRlcmZseVxuIiwgcC0+bmFtZSk7Ci0JYnV0dGVyZmx5ID0gcHA7Ci0JcmV0dXJuOwotCi1jbGVhbjI6Ci0JLyogdHVybiBvZmYgVkNDICovCi0JcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCAwKTsKLQotCXBhcnBvcnRfcmVsZWFzZShwcC0+cGQpOwotY2xlYW4xOgotCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocGQpOwotY2xlYW4wOgotCSh2b2lkKSBzcGlfbWFzdGVyX3B1dChwcC0+Yml0YmFuZy5tYXN0ZXIpOwotZG9uZToKLQlwcl9kZWJ1ZygiJXM6IGJ1dHRlcmZseSBwcm9iZSwgZmFpbCAlZFxuIiwgcC0+bmFtZSwgc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQgYnV0dGVyZmx5X2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcCkKLXsKLQlzdHJ1Y3QgYnV0dGVyZmx5CSpwcDsKLQlpbnQJCQlzdGF0dXM7Ci0KLQkvKiBGSVhNRSB0aGlzIGdsb2JhbCBpcyB1Z2x5IC4uLiBidXQsIGhvdyB0byBxdWlja2x5IGdldCBmcm9tCi0JICogdGhlIHBhcnBvcnQgdG8gdGhlICJzdHJ1Y3QgYnV0dGVyZmx5IiBhc3NvY2lhdGVkIHdpdGggaXQ/Ci0JICogIm9sZCBzY2hvb2wiIGRyaXZlci1pbnRlcm5hbCBkZXZpY2UgbGlzdHM/Ci0JICovCi0JaWYgKCFidXR0ZXJmbHkgfHwgYnV0dGVyZmx5LT5wb3J0ICE9IHApCi0JCXJldHVybjsKLQlwcCA9IGJ1dHRlcmZseTsKLQlidXR0ZXJmbHkgPSBOVUxMOwotCi0JLyogc3RvcCgpIHVucmVnaXN0ZXJzIGNoaWxkIGRldmljZXMgdG9vICovCi0Jc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RvcCgmcHAtPmJpdGJhbmcpOwotCi0JLyogdHVybiBvZmYgVkNDICovCi0JcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCAwKTsKLQltc2xlZXAoMTApOwotCi0JcGFycG9ydF9yZWxlYXNlKHBwLT5wZCk7Ci0JcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcC0+cGQpOwotCi0JKHZvaWQpIHNwaV9tYXN0ZXJfcHV0KHBwLT5iaXRiYW5nLm1hc3Rlcik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFycG9ydF9kcml2ZXIgYnV0dGVyZmx5X2RyaXZlciA9IHsKLQkubmFtZSA9CQkic3BpX2J1dHRlcmZseSIsCi0JLmF0dGFjaCA9CWJ1dHRlcmZseV9hdHRhY2gsCi0JLmRldGFjaCA9CWJ1dHRlcmZseV9kZXRhY2gsCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IGJ1dHRlcmZseV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZidXR0ZXJmbHlfZHJpdmVyKTsKLX0KLWRldmljZV9pbml0Y2FsbChidXR0ZXJmbHlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBidXR0ZXJmbHlfZXhpdCh2b2lkKQotewotCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJmJ1dHRlcmZseV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoYnV0dGVyZmx5X2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlBhcnBvcnQgQWRhcHRlciBkcml2ZXIgZm9yIEFWUiBCdXR0ZXJmbHkiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9mc2xfZXNwaS5jIGIvZHJpdmVycy9zcGkvc3BpX2ZzbF9lc3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NmY4OTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvc3BpX2ZzbF9lc3BpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjIgKzAsMCBAQAotLyoKLSAqIEZyZWVzY2FsZSBlU1BJIGNvbnRyb2xsZXIgZHJpdmVyLgotICoKLSAqIENvcHlyaWdodCAyMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8bGludXgvb2Zfc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KLQotI2luY2x1ZGUgInNwaV9mc2xfbGliLmgiCi0KLS8qIGVTUEkgQ29udHJvbGxlciByZWdpc3RlcnMgKi8KLXN0cnVjdCBmc2xfZXNwaV9yZWcgewotCV9fYmUzMiBtb2RlOwkJLyogMHgwMDAgLSBlU1BJIG1vZGUgcmVnaXN0ZXIgKi8KLQlfX2JlMzIgZXZlbnQ7CQkvKiAweDAwNCAtIGVTUEkgZXZlbnQgcmVnaXN0ZXIgKi8KLQlfX2JlMzIgbWFzazsJCS8qIDB4MDA4IC0gZVNQSSBtYXNrIHJlZ2lzdGVyICovCi0JX19iZTMyIGNvbW1hbmQ7CQkvKiAweDAwYyAtIGVTUEkgY29tbWFuZCByZWdpc3RlciAqLwotCV9fYmUzMiB0cmFuc21pdDsJLyogMHgwMTAgLSBlU1BJIHRyYW5zbWl0IEZJRk8gYWNjZXNzIHJlZ2lzdGVyKi8KLQlfX2JlMzIgcmVjZWl2ZTsJCS8qIDB4MDE0IC0gZVNQSSByZWNlaXZlIEZJRk8gYWNjZXNzIHJlZ2lzdGVyKi8KLQl1OCByZXNbOF07CQkvKiAweDAxOCAtIDB4MDFjIHJlc2VydmVkICovCi0JX19iZTMyIGNzbW9kZVs0XTsJLyogMHgwMjAgLSAweDAyYyBlU1BJIGNzIG1vZGUgcmVnaXN0ZXIgKi8KLX07Ci0KLXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciB7Ci0JY29uc3Qgdm9pZCAqdHhfYnVmOwotCXZvaWQgKnJ4X2J1ZjsKLQl1bnNpZ25lZCBsZW47Ci0JdW5zaWduZWQgbl90eDsKLQl1bnNpZ25lZCBuX3J4OwotCXVuc2lnbmVkIGFjdHVhbF9sZW5ndGg7Ci0JaW50IHN0YXR1czsKLX07Ci0KLS8qIGVTUEkgQ29udHJvbGxlciBtb2RlIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCi0jZGVmaW5lIFNQTU9ERV9FTkFCTEUJCSgxIDw8IDMxKQotI2RlZmluZSBTUE1PREVfTE9PUAkJKDEgPDwgMzApCi0jZGVmaW5lIFNQTU9ERV9UWFRIUih4KQkJKCh4KSA8PCA4KQotI2RlZmluZSBTUE1PREVfUlhUSFIoeCkJCSgoeCkgPDwgMCkKLQotLyogZVNQSSBDb250cm9sbGVyIENTIG1vZGUgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgQ1NNT0RFX0NJX0lOQUNUSVZFSElHSAkoMSA8PCAzMSkKLSNkZWZpbmUgQ1NNT0RFX0NQX0JFR0lOX0VER0VDTEsJKDEgPDwgMzApCi0jZGVmaW5lIENTTU9ERV9SRVYJCSgxIDw8IDI5KQotI2RlZmluZSBDU01PREVfRElWMTYJCSgxIDw8IDI4KQotI2RlZmluZSBDU01PREVfUE0oeCkJCSgoeCkgPDwgMjQpCi0jZGVmaW5lIENTTU9ERV9QT0xfMQkJKDEgPDwgMjApCi0jZGVmaW5lIENTTU9ERV9MRU4oeCkJCSgoeCkgPDwgMTYpCi0jZGVmaW5lIENTTU9ERV9CRUYoeCkJCSgoeCkgPDwgMTIpCi0jZGVmaW5lIENTTU9ERV9BRlQoeCkJCSgoeCkgPDwgOCkKLSNkZWZpbmUgQ1NNT0RFX0NHKHgpCQkoKHgpIDw8IDMpCi0KLS8qIERlZmF1bHQgbW9kZS9jc21vZGUgZm9yIGVTUEkgY29udHJvbGxlciAqLwotI2RlZmluZSBTUE1PREVfSU5JVF9WQUwgKFNQTU9ERV9UWFRIUig0KSB8IFNQTU9ERV9SWFRIUigzKSkKLSNkZWZpbmUgQ1NNT0RFX0lOSVRfVkFMIChDU01PREVfUE9MXzEgfCBDU01PREVfQkVGKDApIFwKLQkJfCBDU01PREVfQUZUKDApIHwgQ1NNT0RFX0NHKDEpKQotCi0vKiBTUElFIHJlZ2lzdGVyIHZhbHVlcyAqLwotI2RlZmluZQlTUElFX05FCQkweDAwMDAwMjAwCS8qIE5vdCBlbXB0eSAqLwotI2RlZmluZQlTUElFX05GCQkweDAwMDAwMTAwCS8qIE5vdCBmdWxsICovCi0KLS8qIFNQSU0gcmVnaXN0ZXIgdmFsdWVzICovCi0jZGVmaW5lCVNQSU1fTkUJCTB4MDAwMDAyMDAJLyogTm90IGVtcHR5ICovCi0jZGVmaW5lCVNQSU1fTkYJCTB4MDAwMDAxMDAJLyogTm90IGZ1bGwgKi8KLSNkZWZpbmUgU1BJRV9SWENOVChyZWcpICAgICAoKHJlZyA+PiAyNCkgJiAweDNGKQotI2RlZmluZSBTUElFX1RYQ05UKHJlZykgICAgICgocmVnID4+IDE2KSAmIDB4M0YpCi0KLS8qIFNQQ09NIHJlZ2lzdGVyIHZhbHVlcyAqLwotI2RlZmluZSBTUENPTV9DUyh4KQkJKCh4KSA8PCAzMCkKLSNkZWZpbmUgU1BDT01fVFJBTkxFTih4KQkoKHgpIDw8IDApCi0jZGVmaW5lCVNQQ09NX1RSQU5MRU5fTUFYCTB4RkZGRgkvKiBNYXggdHJhbnNhY3Rpb24gbGVuZ3RoICovCi0KLXN0YXRpYyB2b2lkIGZzbF9lc3BpX2NoYW5nZV9tb2RlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IG1wYzh4eHhfc3BpICptc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3RydWN0IHNwaV9tcGM4eHh4X2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOwotCV9fYmUzMiBfX2lvbWVtICptb2RlID0gJnJlZ19iYXNlLT5jc21vZGVbc3BpLT5jaGlwX3NlbGVjdF07Ci0JX19iZTMyIF9faW9tZW0gKmVzcGlfbW9kZSA9ICZyZWdfYmFzZS0+bW9kZTsKLQl1MzIgdG1wOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBUdXJuIG9mZiBJUlFzIGxvY2FsbHkgdG8gbWluaW1pemUgdGltZSB0aGF0IFNQSSBpcyBkaXNhYmxlZC4gKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQkvKiBUdXJuIG9mZiBTUEkgdW5pdCBwcmlvciBjaGFuZ2luZyBtb2RlICovCi0JdG1wID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoZXNwaV9tb2RlKTsKLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoZXNwaV9tb2RlLCB0bXAgJiB+U1BNT0RFX0VOQUJMRSk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKG1vZGUsIGNzLT5od19tb2RlKTsKLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoZXNwaV9tb2RlLCB0bXApOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdTMyIGZzbF9lc3BpX3R4X2J1Zl9sc2Ioc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSkKLXsKLQl1MzIgZGF0YTsKLQl1MTYgZGF0YV9oOwotCXUxNiBkYXRhX2w7Ci0JY29uc3QgdTMyICp0eCA9IG1wYzh4eHhfc3BpLT50eDsKLQotCWlmICghdHgpCi0JCXJldHVybiAwOwotCi0JZGF0YSA9ICp0eCsrIDw8IG1wYzh4eHhfc3BpLT50eF9zaGlmdDsKLQlkYXRhX2wgPSBkYXRhICYgMHhmZmZmOwotCWRhdGFfaCA9IChkYXRhID4+IDE2KSAmIDB4ZmZmZjsKLQlzd2FiMTZzKCZkYXRhX2wpOwotCXN3YWIxNnMoJmRhdGFfaCk7Ci0JZGF0YSA9IGRhdGFfaCB8IGRhdGFfbDsKLQotCW1wYzh4eHhfc3BpLT50eCA9IHR4OwotCXJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgaW50IGZzbF9lc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0Jc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCWludCBiaXRzX3Blcl93b3JkID0gMDsKLQl1OCBwbTsKLQl1MzIgaHogPSAwOwotCXN0cnVjdCBzcGlfbXBjOHh4eF9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0KLQlpZiAodCkgewotCQliaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZDsKLQkJaHogPSB0LT5zcGVlZF9oejsKLQl9Ci0KLQkvKiBzcGlfdHJhbnNmZXIgbGV2ZWwgY2FsbHMgdGhhdCB3b3JrIHBlci13b3JkICovCi0JaWYgKCFiaXRzX3Blcl93b3JkKQotCQliaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCi0JLyogTWFrZSBzdXJlIGl0cyBhIGJpdCB3aWR0aCB3ZSBzdXBwb3J0IFs0Li4xNl0gKi8KLQlpZiAoKGJpdHNfcGVyX3dvcmQgPCA0KSB8fCAoYml0c19wZXJfd29yZCA+IDE2KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWh6KQotCQloeiA9IHNwaS0+bWF4X3NwZWVkX2h6OwotCi0JY3MtPnJ4X3NoaWZ0ID0gMDsKLQljcy0+dHhfc2hpZnQgPSAwOwotCWNzLT5nZXRfcnggPSBtcGM4eHh4X3NwaV9yeF9idWZfdTMyOwotCWNzLT5nZXRfdHggPSBtcGM4eHh4X3NwaV90eF9idWZfdTMyOwotCWlmIChiaXRzX3Blcl93b3JkIDw9IDgpIHsKLQkJY3MtPnJ4X3NoaWZ0ID0gOCAtIGJpdHNfcGVyX3dvcmQ7Ci0JfSBlbHNlIGlmIChiaXRzX3Blcl93b3JkIDw9IDE2KSB7Ci0JCWNzLT5yeF9zaGlmdCA9IDE2IC0gYml0c19wZXJfd29yZDsKLQkJaWYgKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpCi0JCQljcy0+Z2V0X3R4ID0gZnNsX2VzcGlfdHhfYnVmX2xzYjsKLQl9IGVsc2UgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltcGM4eHh4X3NwaS0+cnhfc2hpZnQgPSBjcy0+cnhfc2hpZnQ7Ci0JbXBjOHh4eF9zcGktPnR4X3NoaWZ0ID0gY3MtPnR4X3NoaWZ0OwotCW1wYzh4eHhfc3BpLT5nZXRfcnggPSBjcy0+Z2V0X3J4OwotCW1wYzh4eHhfc3BpLT5nZXRfdHggPSBjcy0+Z2V0X3R4OwotCi0JYml0c19wZXJfd29yZCA9IGJpdHNfcGVyX3dvcmQgLSAxOwotCi0JLyogbWFzayBvdXQgYml0cyB3ZSBhcmUgZ29pbmcgdG8gc2V0ICovCi0JY3MtPmh3X21vZGUgJj0gfihDU01PREVfTEVOKDB4RikgfCBDU01PREVfRElWMTYgfCBDU01PREVfUE0oMHhGKSk7Ci0KLQljcy0+aHdfbW9kZSB8PSBDU01PREVfTEVOKGJpdHNfcGVyX3dvcmQpOwotCi0JaWYgKChtcGM4eHh4X3NwaS0+c3BpYnJnIC8gaHopID4gNjQpIHsKLQkJY3MtPmh3X21vZGUgfD0gQ1NNT0RFX0RJVjE2OwotCQlwbSA9IChtcGM4eHh4X3NwaS0+c3BpYnJnIC0gMSkgLyAoaHogKiA2NCkgKyAxOwotCi0JCVdBUk5fT05DRShwbSA+IDE2LCAiJXM6IFJlcXVlc3RlZCBzcGVlZCBpcyB0b28gbG93OiAlZCBIei4gIgotCQkJICAiV2lsbCB1c2UgJWQgSHogaW5zdGVhZC5cbiIsIGRldl9uYW1lKCZzcGktPmRldiksCi0JCQkgIGh6LCBtcGM4eHh4X3NwaS0+c3BpYnJnIC8gMTAyNCk7Ci0JCWlmIChwbSA+IDE2KQotCQkJcG0gPSAxNjsKLQl9IGVsc2UgewotCQlwbSA9IChtcGM4eHh4X3NwaS0+c3BpYnJnIC0gMSkgLyAoaHogKiA0KSArIDE7Ci0JfQotCWlmIChwbSkKLQkJcG0tLTsKLQotCWNzLT5od19tb2RlIHw9IENTTU9ERV9QTShwbSk7Ci0KLQlmc2xfZXNwaV9jaGFuZ2VfbW9kZShzcGkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZzbF9lc3BpX2NwdV9idWZzKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCwKLQkJdW5zaWduZWQgaW50IGxlbikKLXsKLQl1MzIgd29yZDsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOwotCi0JbXNwaS0+Y291bnQgPSBsZW47Ci0KLQkvKiBlbmFibGUgcnggaW50cyAqLwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1hc2ssIFNQSU1fTkUpOwotCi0JLyogdHJhbnNtaXQgd29yZCAqLwotCXdvcmQgPSBtc3BpLT5nZXRfdHgobXNwaSk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+dHJhbnNtaXQsIHdvcmQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZnNsX2VzcGlfYnVmcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1wYzh4eHhfc3BpLT5yZWdfYmFzZTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gdC0+bGVuOwotCXU4IGJpdHNfcGVyX3dvcmQ7Ci0JaW50IHJldDsKLQotCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaWYgKHQtPmJpdHNfcGVyX3dvcmQpCi0JCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOwotCi0JbXBjOHh4eF9zcGktPmxlbiA9IHQtPmxlbjsKLQlsZW4gPSByb3VuZHVwKGxlbiwgNCkgLyA0OwotCi0JbXBjOHh4eF9zcGktPnR4ID0gdC0+dHhfYnVmOwotCW1wYzh4eHhfc3BpLT5yeCA9IHQtPnJ4X2J1ZjsKLQotCUlOSVRfQ09NUExFVElPTihtcGM4eHh4X3NwaS0+ZG9uZSk7Ci0KLQkvKiBTZXQgU1BDT01bQ1NdIGFuZCBTUENPTVtUUkFOTEVOXSBmaWVsZCAqLwotCWlmICgodC0+bGVuIC0gMSkgPiBTUENPTV9UUkFOTEVOX01BWCkgewotCQlkZXZfZXJyKG1wYzh4eHhfc3BpLT5kZXYsICJUcmFuc2FjdGlvbiBsZW5ndGggKCVkKSIKLQkJCQkiIGJleW9uZCB0aGUgU1BDT01bVFJBTkxFTl0gZmllbGRcbiIsIHQtPmxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5jb21tYW5kLAotCQkoU1BDT01fQ1Moc3BpLT5jaGlwX3NlbGVjdCkgfCBTUENPTV9UUkFOTEVOKHQtPmxlbiAtIDEpKSk7Ci0KLQlyZXQgPSBmc2xfZXNwaV9jcHVfYnVmcyhtcGM4eHh4X3NwaSwgdCwgbGVuKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmbXBjOHh4eF9zcGktPmRvbmUpOwotCi0JLyogZGlzYWJsZSByeCBpbnRzICovCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bWFzaywgMCk7Ci0KLQlyZXR1cm4gbXBjOHh4eF9zcGktPmNvdW50OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZnNsX2VzcGlfYWRkcjJjbWQodW5zaWduZWQgaW50IGFkZHIsIHU4ICpjbWQpCi17Ci0JaWYgKGNtZCkgewotCQljbWRbMV0gPSAodTgpKGFkZHIgPj4gMTYpOwotCQljbWRbMl0gPSAodTgpKGFkZHIgPj4gOCk7Ci0JCWNtZFszXSA9ICh1OCkoYWRkciA+PiAwKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZzbF9lc3BpX2NtZDJhZGRyKHU4ICpjbWQpCi17Ci0JaWYgKGNtZCkKLQkJcmV0dXJuIGNtZFsxXSA8PCAxNiB8IGNtZFsyXSA8PCA4IHwgY21kWzNdIDw8IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZnNsX2VzcGlfZG9fdHJhbnMoc3RydWN0IHNwaV9tZXNzYWdlICptLAotCQkJCXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciAqdHIpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG0tPnNwaTsKLQlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlzdHJ1Y3QgZnNsX2VzcGlfdHJhbnNmZXIgKmVzcGlfdHJhbnMgPSB0cjsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbWVzc2FnZTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCAqZmlyc3QsIHRyYW5zOwotCWludCBzdGF0dXMgPSAwOwotCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbWVzc2FnZSk7Ci0JbWVtc2V0KCZ0cmFucywgMCwgc2l6ZW9mKHRyYW5zKSk7Ci0KLQlmaXJzdCA9IGxpc3RfZmlyc3RfZW50cnkoJm0tPnRyYW5zZmVycywgc3RydWN0IHNwaV90cmFuc2ZlciwKLQkJCXRyYW5zZmVyX2xpc3QpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQlpZiAoKGZpcnN0LT5iaXRzX3Blcl93b3JkICE9IHQtPmJpdHNfcGVyX3dvcmQpIHx8Ci0JCQkoZmlyc3QtPnNwZWVkX2h6ICE9IHQtPnNwZWVkX2h6KSkgewotCQkJZXNwaV90cmFucy0+c3RhdHVzID0gLUVJTlZBTDsKLQkJCWRldl9lcnIobXNwaS0+ZGV2LCAiYml0c19wZXJfd29yZC9zcGVlZF9oeiBzaG91bGQgYmUiCi0JCQkJCSIgc2FtZSBmb3IgdGhlIHNhbWUgU1BJIHRyYW5zZmVyXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyYW5zLnNwZWVkX2h6ID0gdC0+c3BlZWRfaHo7Ci0JCXRyYW5zLmJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOwotCQl0cmFucy5kZWxheV91c2VjcyA9IG1heChmaXJzdC0+ZGVsYXlfdXNlY3MsIHQtPmRlbGF5X3VzZWNzKTsKLQl9Ci0KLQl0cmFucy5sZW4gPSBlc3BpX3RyYW5zLT5sZW47Ci0JdHJhbnMudHhfYnVmID0gZXNwaV90cmFucy0+dHhfYnVmOwotCXRyYW5zLnJ4X2J1ZiA9IGVzcGlfdHJhbnMtPnJ4X2J1ZjsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdHJhbnMsICZtZXNzYWdlKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm1lc3NhZ2UudHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmICh0LT5iaXRzX3Blcl93b3JkIHx8IHQtPnNwZWVkX2h6KSB7Ci0JCQlzdGF0dXMgPSAtRUlOVkFMOwotCi0JCQlzdGF0dXMgPSBmc2xfZXNwaV9zZXR1cF90cmFuc2ZlcihzcGksIHQpOwotCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodC0+bGVuKQotCQkJc3RhdHVzID0gZnNsX2VzcGlfYnVmcyhzcGksIHQpOwotCi0JCWlmIChzdGF0dXMpIHsKLQkJCXN0YXR1cyA9IC1FTVNHU0laRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHQtPmRlbGF5X3VzZWNzKQotCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKLQl9Ci0KLQllc3BpX3RyYW5zLT5zdGF0dXMgPSBzdGF0dXM7Ci0JZnNsX2VzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgZnNsX2VzcGlfY21kX3RyYW5zKHN0cnVjdCBzcGlfbWVzc2FnZSAqbSwKLQkJCQlzdHJ1Y3QgZnNsX2VzcGlfdHJhbnNmZXIgKnRyYW5zLCB1OCAqcnhfYnVmZikKLXsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OwotCXU4ICpsb2NhbF9idWY7Ci0JaW50IGkgPSAwOwotCXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciAqZXNwaV90cmFucyA9IHRyYW5zOwotCi0JbG9jYWxfYnVmID0ga3phbGxvYyhTUENPTV9UUkFOTEVOX01BWCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFsb2NhbF9idWYpIHsKLQkJZXNwaV90cmFucy0+c3RhdHVzID0gLUVOT01FTTsKLQkJcmV0dXJuOwotCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQlpZiAodC0+dHhfYnVmKSB7Ci0JCQltZW1jcHkobG9jYWxfYnVmICsgaSwgdC0+dHhfYnVmLCB0LT5sZW4pOwotCQkJaSArPSB0LT5sZW47Ci0JCX0KLQl9Ci0KLQllc3BpX3RyYW5zLT50eF9idWYgPSBsb2NhbF9idWY7Ci0JZXNwaV90cmFucy0+cnhfYnVmID0gbG9jYWxfYnVmICsgZXNwaV90cmFucy0+bl90eDsKLQlmc2xfZXNwaV9kb190cmFucyhtLCBlc3BpX3RyYW5zKTsKLQotCWVzcGlfdHJhbnMtPmFjdHVhbF9sZW5ndGggPSBlc3BpX3RyYW5zLT5sZW47Ci0Ja2ZyZWUobG9jYWxfYnVmKTsKLX0KLQotc3RhdGljIHZvaWQgZnNsX2VzcGlfcndfdHJhbnMoc3RydWN0IHNwaV9tZXNzYWdlICptLAotCQkJCXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciAqdHJhbnMsIHU4ICpyeF9idWZmKQotewotCXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciAqZXNwaV90cmFucyA9IHRyYW5zOwotCXVuc2lnbmVkIGludCBuX3R4ID0gZXNwaV90cmFucy0+bl90eDsKLQl1bnNpZ25lZCBpbnQgbl9yeCA9IGVzcGlfdHJhbnMtPm5fcng7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQl1OCAqbG9jYWxfYnVmOwotCXU4ICpyeF9idWYgPSByeF9idWZmOwotCXVuc2lnbmVkIGludCB0cmFuc19sZW47Ci0JdW5zaWduZWQgaW50IGFkZHI7Ci0JaW50IGksIHBvcywgbG9vcDsKLQotCWxvY2FsX2J1ZiA9IGt6YWxsb2MoU1BDT01fVFJBTkxFTl9NQVgsIEdGUF9LRVJORUwpOwotCWlmICghbG9jYWxfYnVmKSB7Ci0JCWVzcGlfdHJhbnMtPnN0YXR1cyA9IC1FTk9NRU07Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKHBvcyA9IDAsIGxvb3AgPSAwOyBwb3MgPCBuX3J4OyBwb3MgKz0gdHJhbnNfbGVuLCBsb29wKyspIHsKLQkJdHJhbnNfbGVuID0gbl9yeCAtIHBvczsKLQkJaWYgKHRyYW5zX2xlbiA+IFNQQ09NX1RSQU5MRU5fTUFYIC0gbl90eCkKLQkJCXRyYW5zX2xlbiA9IFNQQ09NX1RSQU5MRU5fTUFYIC0gbl90eDsKLQotCQlpID0gMDsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCQlpZiAodC0+dHhfYnVmKSB7Ci0JCQkJbWVtY3B5KGxvY2FsX2J1ZiArIGksIHQtPnR4X2J1ZiwgdC0+bGVuKTsKLQkJCQlpICs9IHQtPmxlbjsKLQkJCX0KLQkJfQotCi0JCWlmIChwb3MgPiAwKSB7Ci0JCQlhZGRyID0gZnNsX2VzcGlfY21kMmFkZHIobG9jYWxfYnVmKTsKLQkJCWFkZHIgKz0gcG9zOwotCQkJZnNsX2VzcGlfYWRkcjJjbWQoYWRkciwgbG9jYWxfYnVmKTsKLQkJfQotCi0JCWVzcGlfdHJhbnMtPm5fdHggPSBuX3R4OwotCQllc3BpX3RyYW5zLT5uX3J4ID0gdHJhbnNfbGVuOwotCQllc3BpX3RyYW5zLT5sZW4gPSB0cmFuc19sZW4gKyBuX3R4OwotCQllc3BpX3RyYW5zLT50eF9idWYgPSBsb2NhbF9idWY7Ci0JCWVzcGlfdHJhbnMtPnJ4X2J1ZiA9IGxvY2FsX2J1ZiArIG5fdHg7Ci0JCWZzbF9lc3BpX2RvX3RyYW5zKG0sIGVzcGlfdHJhbnMpOwotCi0JCW1lbWNweShyeF9idWYgKyBwb3MsIGVzcGlfdHJhbnMtPnJ4X2J1ZiArIG5fdHgsIHRyYW5zX2xlbik7Ci0KLQkJaWYgKGxvb3AgPiAwKQotCQkJZXNwaV90cmFucy0+YWN0dWFsX2xlbmd0aCArPSBlc3BpX3RyYW5zLT5sZW4gLSBuX3R4OwotCQllbHNlCi0JCQllc3BpX3RyYW5zLT5hY3R1YWxfbGVuZ3RoICs9IGVzcGlfdHJhbnMtPmxlbjsKLQl9Ci0KLQlrZnJlZShsb2NhbF9idWYpOwotfQotCi1zdGF0aWMgdm9pZCBmc2xfZXNwaV9kb19vbmVfbXNnKHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKLXsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OwotCXU4ICpyeF9idWYgPSBOVUxMOwotCXVuc2lnbmVkIGludCBuX3R4ID0gMDsKLQl1bnNpZ25lZCBpbnQgbl9yeCA9IDA7Ci0Jc3RydWN0IGZzbF9lc3BpX3RyYW5zZmVyIGVzcGlfdHJhbnM7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJaWYgKHQtPnR4X2J1ZikKLQkJCW5fdHggKz0gdC0+bGVuOwotCQlpZiAodC0+cnhfYnVmKSB7Ci0JCQluX3J4ICs9IHQtPmxlbjsKLQkJCXJ4X2J1ZiA9IHQtPnJ4X2J1ZjsKLQkJfQotCX0KLQotCWVzcGlfdHJhbnMubl90eCA9IG5fdHg7Ci0JZXNwaV90cmFucy5uX3J4ID0gbl9yeDsKLQllc3BpX3RyYW5zLmxlbiA9IG5fdHggKyBuX3J4OwotCWVzcGlfdHJhbnMuYWN0dWFsX2xlbmd0aCA9IDA7Ci0JZXNwaV90cmFucy5zdGF0dXMgPSAwOwotCi0JaWYgKCFyeF9idWYpCi0JCWZzbF9lc3BpX2NtZF90cmFucyhtLCAmZXNwaV90cmFucywgTlVMTCk7Ci0JZWxzZQotCQlmc2xfZXNwaV9yd190cmFucyhtLCAmZXNwaV90cmFucywgcnhfYnVmKTsKLQotCW0tPmFjdHVhbF9sZW5ndGggPSBlc3BpX3RyYW5zLmFjdHVhbF9sZW5ndGg7Ci0JbS0+c3RhdHVzID0gZXNwaV90cmFucy5zdGF0dXM7Ci0JbS0+Y29tcGxldGUobS0+Y29udGV4dCk7Ci19Ci0KLXN0YXRpYyBpbnQgZnNsX2VzcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpOwotCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlOwotCWludCByZXR2YWw7Ci0JdTMyIGh3X21vZGU7Ci0JdTMyIGxvb3BfbW9kZTsKLQlzdHJ1Y3Qgc3BpX21wYzh4eHhfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCi0JaWYgKCFzcGktPm1heF9zcGVlZF9oeikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWNzKSB7Ci0JCWNzID0ga3phbGxvYyhzaXplb2YgKmNzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjcykKLQkJCXJldHVybiAtRU5PTUVNOwotCQlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBjczsKLQl9Ci0KLQltcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXJlZ19iYXNlID0gbXBjOHh4eF9zcGktPnJlZ19iYXNlOwotCi0JaHdfbW9kZSA9IGNzLT5od19tb2RlOyAvKiBTYXZlIG9yaWdpbmFsIHNldHRpbmdzICovCi0JY3MtPmh3X21vZGUgPSBtcGM4eHh4X3NwaV9yZWFkX3JlZygKLQkJCSZyZWdfYmFzZS0+Y3Ntb2RlW3NwaS0+Y2hpcF9zZWxlY3RdKTsKLQkvKiBtYXNrIG91dCBiaXRzIHdlIGFyZSBnb2luZyB0byBzZXQgKi8KLQljcy0+aHdfbW9kZSAmPSB+KENTTU9ERV9DUF9CRUdJTl9FREdFQ0xLIHwgQ1NNT0RFX0NJX0lOQUNUSVZFSElHSAotCQkJIHwgQ1NNT0RFX1JFVik7Ci0KLQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCi0JCWNzLT5od19tb2RlIHw9IENTTU9ERV9DUF9CRUdJTl9FREdFQ0xLOwotCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKLQkJY3MtPmh3X21vZGUgfD0gQ1NNT0RFX0NJX0lOQUNUSVZFSElHSDsKLQlpZiAoIShzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSkKLQkJY3MtPmh3X21vZGUgfD0gQ1NNT0RFX1JFVjsKLQotCS8qIEhhbmRsZSB0aGUgbG9vcCBtb2RlICovCi0JbG9vcF9tb2RlID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoJnJlZ19iYXNlLT5tb2RlKTsKLQlsb29wX21vZGUgJj0gflNQTU9ERV9MT09QOwotCWlmIChzcGktPm1vZGUgJiBTUElfTE9PUCkKLQkJbG9vcF9tb2RlIHw9IFNQTU9ERV9MT09QOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1vZGUsIGxvb3BfbW9kZSk7Ci0KLQlyZXR2YWwgPSBmc2xfZXNwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOwotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWNzLT5od19tb2RlID0gaHdfbW9kZTsgLyogUmVzdG9yZSBzZXR0aW5ncyAqLwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBmc2xfZXNwaV9jcHVfaXJxKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSwgdTMyIGV2ZW50cykKLXsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOwotCi0JLyogV2UgbmVlZCBoYW5kbGUgUlggZmlyc3QgKi8KLQlpZiAoZXZlbnRzICYgU1BJRV9ORSkgewotCQl1MzIgcnhfZGF0YSwgdG1wOwotCQl1OCByeF9kYXRhXzg7Ci0KLQkJLyogU3BpbiB1bnRpbCBSWCBpcyBkb25lICovCi0JCXdoaWxlIChTUElFX1JYQ05UKGV2ZW50cykgPCBtaW4oNCwgbXNwaS0+bGVuKSkgewotCQkJY3B1X3JlbGF4KCk7Ci0JCQlldmVudHMgPSBtcGM4eHh4X3NwaV9yZWFkX3JlZygmcmVnX2Jhc2UtPmV2ZW50KTsKLQkJfQotCi0JCWlmIChtc3BpLT5sZW4gPj0gNCkgewotCQkJcnhfZGF0YSA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZyZWdfYmFzZS0+cmVjZWl2ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0bXAgPSBtc3BpLT5sZW47Ci0JCQlyeF9kYXRhID0gMDsKLQkJCXdoaWxlICh0bXAtLSkgewotCQkJCXJ4X2RhdGFfOCA9IGluXzgoKHU4ICopJnJlZ19iYXNlLT5yZWNlaXZlKTsKLQkJCQlyeF9kYXRhIHw9IChyeF9kYXRhXzggPDwgKHRtcCAqIDgpKTsKLQkJCX0KLQotCQkJcnhfZGF0YSA8PD0gKDQgLSBtc3BpLT5sZW4pICogODsKLQkJfQotCi0JCW1zcGktPmxlbiAtPSA0OwotCi0JCWlmIChtc3BpLT5yeCkKLQkJCW1zcGktPmdldF9yeChyeF9kYXRhLCBtc3BpKTsKLQl9Ci0KLQlpZiAoIShldmVudHMgJiBTUElFX05GKSkgewotCQlpbnQgcmV0OwotCi0JCS8qIHNwaW4gdW50aWwgVFggaXMgZG9uZSAqLwotCQlyZXQgPSBzcGluX2V2ZW50X3RpbWVvdXQoKChldmVudHMgPSBtcGM4eHh4X3NwaV9yZWFkX3JlZygKLQkJCQkmcmVnX2Jhc2UtPmV2ZW50KSkgJiBTUElFX05GKSA9PSAwLCAxMDAwLCAwKTsKLQkJaWYgKCFyZXQpIHsKLQkJCWRldl9lcnIobXNwaS0+ZGV2LCAidGlyZWQgd2FpdGluZyBmb3IgU1BJRV9ORlxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKiBDbGVhciB0aGUgZXZlbnRzICovCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+ZXZlbnQsIGV2ZW50cyk7Ci0KLQltc3BpLT5jb3VudCAtPSAxOwotCWlmIChtc3BpLT5jb3VudCkgewotCQl1MzIgd29yZCA9IG1zcGktPmdldF90eChtc3BpKTsKLQotCQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT50cmFuc21pdCwgd29yZCk7Ci0JfSBlbHNlIHsKLQkJY29tcGxldGUoJm1zcGktPmRvbmUpOwotCX0KLX0KLQotc3RhdGljIGlycXJldHVybl90IGZzbF9lc3BpX2lycShzMzIgaXJxLCB2b2lkICpjb250ZXh0X2RhdGEpCi17Ci0Jc3RydWN0IG1wYzh4eHhfc3BpICptc3BpID0gY29udGV4dF9kYXRhOwotCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7Ci0JaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7Ci0JdTMyIGV2ZW50czsKLQotCS8qIEdldCBpbnRlcnJ1cHQgZXZlbnRzKHR4L3J4KSAqLwotCWV2ZW50cyA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZyZWdfYmFzZS0+ZXZlbnQpOwotCWlmIChldmVudHMpCi0JCXJldCA9IElSUV9IQU5ETEVEOwotCi0JZGV2X3ZkYmcobXNwaS0+ZGV2LCAiJXM6IGV2ZW50cyAleFxuIiwgX19mdW5jX18sIGV2ZW50cyk7Ci0KLQlmc2xfZXNwaV9jcHVfaXJxKG1zcGksIGV2ZW50cyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBmc2xfZXNwaV9yZW1vdmUoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpKQotewotCWlvdW5tYXAobXNwaS0+cmVnX2Jhc2UpOwotfQotCi1zdGF0aWMgc3RydWN0IHNwaV9tYXN0ZXIgKiBfX2RldmluaXQgZnNsX2VzcGlfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgdW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgZnNsX3NwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGk7Ci0Jc3RydWN0IGZzbF9lc3BpX3JlZyAqcmVnX2Jhc2U7Ci0JdTMyIHJlZ3ZhbDsKLQlpbnQgaSwgcmV0ID0gMDsKLQotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2Yoc3RydWN0IG1wYzh4eHhfc3BpKSk7Ci0JaWYgKCFtYXN0ZXIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgbWFzdGVyKTsKLQotCXJldCA9IG1wYzh4eHhfc3BpX3Byb2JlKGRldiwgbWVtLCBpcnEpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3Byb2JlOwotCi0JbWFzdGVyLT5zZXR1cCA9IGZzbF9lc3BpX3NldHVwOwotCi0JbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0JbXBjOHh4eF9zcGktPnNwaV9kb19vbmVfbXNnID0gZnNsX2VzcGlfZG9fb25lX21zZzsKLQltcGM4eHh4X3NwaS0+c3BpX3JlbW92ZSA9IGZzbF9lc3BpX3JlbW92ZTsKLQotCW1wYzh4eHhfc3BpLT5yZWdfYmFzZSA9IGlvcmVtYXAobWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKLQlpZiAoIW1wYzh4eHhfc3BpLT5yZWdfYmFzZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9wcm9iZTsKLQl9Ci0KLQlyZWdfYmFzZSA9IG1wYzh4eHhfc3BpLT5yZWdfYmFzZTsKLQotCS8qIFJlZ2lzdGVyIGZvciBTUEkgSW50ZXJydXB0ICovCi0JcmV0ID0gcmVxdWVzdF9pcnEobXBjOHh4eF9zcGktPmlycSwgZnNsX2VzcGlfaXJxLAotCQkJICAwLCAiZnNsX2VzcGkiLCBtcGM4eHh4X3NwaSk7Ci0JaWYgKHJldCkKLQkJZ290byBmcmVlX2lycTsKLQotCWlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfUUVfQ1BVX01PREUpIHsKLQkJbXBjOHh4eF9zcGktPnJ4X3NoaWZ0ID0gMTY7Ci0JCW1wYzh4eHhfc3BpLT50eF9zaGlmdCA9IDI0OwotCX0KLQotCS8qIFNQSSBjb250cm9sbGVyIGluaXRpYWxpemF0aW9ucyAqLwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1vZGUsIDApOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1hc2ssIDApOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmNvbW1hbmQsIDApOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmV2ZW50LCAweGZmZmZmZmZmKTsKLQotCS8qIEluaXQgZVNQSSBDUyBtb2RlIHJlZ2lzdGVyICovCi0JZm9yIChpID0gMDsgaSA8IHBkYXRhLT5tYXhfY2hpcHNlbGVjdDsgaSsrKQotCQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5jc21vZGVbaV0sIENTTU9ERV9JTklUX1ZBTCk7Ci0KLQkvKiBFbmFibGUgU1BJIGludGVyZmFjZSAqLwotCXJlZ3ZhbCA9IHBkYXRhLT5pbml0aWFsX3NwbW9kZSB8IFNQTU9ERV9JTklUX1ZBTCB8IFNQTU9ERV9FTkFCTEU7Ci0KLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tb2RlLCByZWd2YWwpOwotCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHVucmVnX21hc3RlcjsKLQotCWRldl9pbmZvKGRldiwgImF0IDB4JXAgKGlycSA9ICVkKVxuIiwgcmVnX2Jhc2UsIG1wYzh4eHhfc3BpLT5pcnEpOwotCi0JcmV0dXJuIG1hc3RlcjsKLQotdW5yZWdfbWFzdGVyOgotCWZyZWVfaXJxKG1wYzh4eHhfc3BpLT5pcnEsIG1wYzh4eHhfc3BpKTsKLWZyZWVfaXJxOgotCWlvdW5tYXAobXBjOHh4eF9zcGktPnJlZ19iYXNlKTsKLWVycl9wcm9iZToKLQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwotZXJyOgotCXJldHVybiBFUlJfUFRSKHJldCk7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfZnNsX2VzcGlfZ2V0X2NoaXBzZWxlY3RzKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwotCXN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwotCWNvbnN0IHUzMiAqcHJvcDsKLQlpbnQgbGVuOwotCi0JcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyIsICZsZW4pOwotCWlmICghcHJvcCB8fCBsZW4gPCBzaXplb2YoKnByb3ApKSB7Ci0JCWRldl9lcnIoZGV2LCAiTm8gJ2ZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cycgcHJvcGVydHlcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwZGF0YS0+bWF4X2NoaXBzZWxlY3QgPSAqcHJvcDsKLQlwZGF0YS0+Y3NfY29udHJvbCA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgb2ZfZnNsX2VzcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJm9mZGV2LT5kZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5kZXYub2Zfbm9kZTsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCByZXNvdXJjZSBtZW07Ci0Jc3RydWN0IHJlc291cmNlIGlycTsKLQlpbnQgcmV0ID0gLUVOT01FTTsKLQotCXJldCA9IG9mX21wYzh4eHhfc3BpX3Byb2JlKG9mZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gb2ZfZnNsX2VzcGlfZ2V0X2NoaXBzZWxlY3RzKGRldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmbWVtKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCXJldCA9IG9mX2lycV90b19yZXNvdXJjZShucCwgMCwgJmlycSk7Ci0JaWYgKCFyZXQpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JbWFzdGVyID0gZnNsX2VzcGlfcHJvYmUoZGV2LCAmbWVtLCBpcnEuc3RhcnQpOwotCWlmIChJU19FUlIobWFzdGVyKSkgewotCQlyZXQgPSBQVFJfRVJSKG1hc3Rlcik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldHVybiAwOwotCi1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgb2ZfZnNsX2VzcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gbXBjOHh4eF9zcGlfcmVtb3ZlKCZkZXYtPmRldik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2ZzbF9lc3BpX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1lc3BpIiB9LAotCXt9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2ZfZnNsX2VzcGlfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmc2xfZXNwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiZnNsX2VzcGkiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gb2ZfZnNsX2VzcGlfbWF0Y2gsCi0JfSwKLQkucHJvYmUJCT0gb2ZfZnNsX2VzcGlfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvZl9mc2xfZXNwaV9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZnNsX2VzcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZzbF9lc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChmc2xfZXNwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGZzbF9lc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZnNsX2VzcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGZzbF9lc3BpX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJNaW5na2FpIEh1Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkVuaGFuY2VkIEZyZWVzY2FsZSBTUEkgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfZnNsX2xpYi5jIGIvZHJpdmVycy9zcGkvc3BpX2ZzbF9saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1OWY0Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfZnNsX2xpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qCi0gKiBGcmVlc2NhbGUgU1BJL2VTUEkgY29udHJvbGxlciBkcml2ZXIgbGlicmFyeS4KLSAqCi0gKiBNYWludGFpbmVyOiBLdW1hciBHYWxhCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFBvbHljb20sIEluYy4KLSAqCi0gKiBDUE0gU1BJIGFuZCBRRSBidWZmZXIgZGVzY3JpcHRvcnMgbW9kZSBzdXBwb3J0OgotICogQ29weXJpZ2h0IChjKSAyMDA5ICBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKiBBdXRob3I6IEFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPgotICoKLSAqIENvcHlyaWdodCAyMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8bGludXgvb2Zfc3BpLmg+Ci0jaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KLQotI2luY2x1ZGUgInNwaV9mc2xfbGliLmgiCi0KLSNkZWZpbmUgTVBDOFhYWF9TUElfUlhfQlVGKHR5cGUpIAkJCQkJICBcCi12b2lkIG1wYzh4eHhfc3BpX3J4X2J1Zl8jI3R5cGUodTMyIGRhdGEsIHN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkpIFwKLXsJCQkJCQkJCQkgIFwKLQl0eXBlICpyeCA9IG1wYzh4eHhfc3BpLT5yeDsJCQkJCSAgXAotCSpyeCsrID0gKHR5cGUpKGRhdGEgPj4gbXBjOHh4eF9zcGktPnJ4X3NoaWZ0KTsJCQkgIFwKLQltcGM4eHh4X3NwaS0+cnggPSByeDsJCQkJCQkgIFwKLX0KLQotI2RlZmluZSBNUEM4WFhYX1NQSV9UWF9CVUYodHlwZSkJCQkJXAotdTMyIG1wYzh4eHhfc3BpX3R4X2J1Zl8jI3R5cGUoc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSkJXAotewkJCQkJCQkJXAotCXUzMiBkYXRhOwkJCQkJCVwKLQljb25zdCB0eXBlICp0eCA9IG1wYzh4eHhfc3BpLT50eDsJCQlcCi0JaWYgKCF0eCkJCQkJCQlcCi0JCXJldHVybiAwOwkJCQkJXAotCWRhdGEgPSAqdHgrKyA8PCBtcGM4eHh4X3NwaS0+dHhfc2hpZnQ7CQkJXAotCW1wYzh4eHhfc3BpLT50eCA9IHR4OwkJCQkJXAotCXJldHVybiBkYXRhOwkJCQkJCVwKLX0KLQotTVBDOFhYWF9TUElfUlhfQlVGKHU4KQotTVBDOFhYWF9TUElfUlhfQlVGKHUxNikKLU1QQzhYWFhfU1BJX1JYX0JVRih1MzIpCi1NUEM4WFhYX1NQSV9UWF9CVUYodTgpCi1NUEM4WFhYX1NQSV9UWF9CVUYodTE2KQotTVBDOFhYWF9TUElfVFhfQlVGKHUzMikKLQotc3RydWN0IG1wYzh4eHhfc3BpX3Byb2JlX2luZm8gKnRvX29mX3BpbmZvKHN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQotewotCXJldHVybiBjb250YWluZXJfb2YocGRhdGEsIHN0cnVjdCBtcGM4eHh4X3NwaV9wcm9iZV9pbmZvLCBwZGF0YSk7Ci19Ci0KLXZvaWQgbXBjOHh4eF9zcGlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXBjOHh4eF9zcGksCi0JCQkJCQkgICAgICAgd29yayk7Ci0KLQlzcGluX2xvY2tfaXJxKCZtcGM4eHh4X3NwaS0+bG9jayk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZtcGM4eHh4X3NwaS0+cXVldWUpKSB7Ci0JCXN0cnVjdCBzcGlfbWVzc2FnZSAqbSA9IGNvbnRhaW5lcl9vZihtcGM4eHh4X3NwaS0+cXVldWUubmV4dCwKLQkJCQkJCSAgIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOwotCi0JCWxpc3RfZGVsX2luaXQoJm0tPnF1ZXVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZtcGM4eHh4X3NwaS0+bG9jayk7Ci0KLQkJaWYgKG1wYzh4eHhfc3BpLT5zcGlfZG9fb25lX21zZykKLQkJCW1wYzh4eHhfc3BpLT5zcGlfZG9fb25lX21zZyhtKTsKLQotCQlzcGluX2xvY2tfaXJxKCZtcGM4eHh4X3NwaS0+bG9jayk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmbXBjOHh4eF9zcGktPmxvY2spOwotfQotCi1pbnQgbXBjOHh4eF9zcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCi17Ci0Jc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltLT5hY3R1YWxfbGVuZ3RoID0gMDsKLQltLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9zcGktPmxvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZtLT5xdWV1ZSwgJm1wYzh4eHhfc3BpLT5xdWV1ZSk7Ci0JcXVldWVfd29yayhtcGM4eHh4X3NwaS0+d29ya3F1ZXVlLCAmbXBjOHh4eF9zcGktPndvcmspOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfc3BpLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtcGM4eHh4X3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Ja2ZyZWUoc3BpLT5jb250cm9sbGVyX3N0YXRlKTsKLX0KLQotY29uc3QgY2hhciAqbXBjOHh4eF9zcGlfc3RybW9kZSh1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0JaWYgKGZsYWdzICYgU1BJX1FFX0NQVV9NT0RFKSB7Ci0JCXJldHVybiAiUUUgQ1BVIjsKLQl9IGVsc2UgaWYgKGZsYWdzICYgU1BJX0NQTV9NT0RFKSB7Ci0JCWlmIChmbGFncyAmIFNQSV9RRSkKLQkJCXJldHVybiAiUUUiOwotCQllbHNlIGlmIChmbGFncyAmIFNQSV9DUE0yKQotCQkJcmV0dXJuICJDUE0yIjsKLQkJZWxzZQotCQkJcmV0dXJuICJDUE0xIjsKLQl9Ci0JcmV0dXJuICJDUFUiOwotfQotCi1pbnQgbXBjOHh4eF9zcGlfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwKLQkJCXVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGZzbF9zcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKLQlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpOwotCWludCByZXQgPSAwOwotCi0JbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQkvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KLQltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSAotCQkJfCBTUElfTFNCX0ZJUlNUIHwgU1BJX0xPT1A7Ci0KLQltYXN0ZXItPnRyYW5zZmVyID0gbXBjOHh4eF9zcGlfdHJhbnNmZXI7Ci0JbWFzdGVyLT5jbGVhbnVwID0gbXBjOHh4eF9zcGlfY2xlYW51cDsKLQltYXN0ZXItPmRldi5vZl9ub2RlID0gZGV2LT5vZl9ub2RlOwotCi0JbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0JbXBjOHh4eF9zcGktPmRldiA9IGRldjsKLQltcGM4eHh4X3NwaS0+Z2V0X3J4ID0gbXBjOHh4eF9zcGlfcnhfYnVmX3U4OwotCW1wYzh4eHhfc3BpLT5nZXRfdHggPSBtcGM4eHh4X3NwaV90eF9idWZfdTg7Ci0JbXBjOHh4eF9zcGktPmZsYWdzID0gcGRhdGEtPmZsYWdzOwotCW1wYzh4eHhfc3BpLT5zcGlicmcgPSBwZGF0YS0+c3lzY2xrOwotCW1wYzh4eHhfc3BpLT5pcnEgPSBpcnE7Ci0KLQltcGM4eHh4X3NwaS0+cnhfc2hpZnQgPSAwOwotCW1wYzh4eHhfc3BpLT50eF9zaGlmdCA9IDA7Ci0KLQlpbml0X2NvbXBsZXRpb24oJm1wYzh4eHhfc3BpLT5kb25lKTsKLQotCW1hc3Rlci0+YnVzX251bSA9IHBkYXRhLT5idXNfbnVtOwotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBwZGF0YS0+bWF4X2NoaXBzZWxlY3Q7Ci0KLQlzcGluX2xvY2tfaW5pdCgmbXBjOHh4eF9zcGktPmxvY2spOwotCWluaXRfY29tcGxldGlvbigmbXBjOHh4eF9zcGktPmRvbmUpOwotCUlOSVRfV09SSygmbXBjOHh4eF9zcGktPndvcmssIG1wYzh4eHhfc3BpX3dvcmspOwotCUlOSVRfTElTVF9IRUFEKCZtcGM4eHh4X3NwaS0+cXVldWUpOwotCi0JbXBjOHh4eF9zcGktPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAotCQlkZXZfbmFtZShtYXN0ZXItPmRldi5wYXJlbnQpKTsKLQlpZiAobXBjOHh4eF9zcGktPndvcmtxdWV1ZSA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgX19kZXZleGl0IG1wYzh4eHhfc3BpX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaTsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCi0JbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0KLQlmbHVzaF93b3JrcXVldWUobXBjOHh4eF9zcGktPndvcmtxdWV1ZSk7Ci0JZGVzdHJveV93b3JrcXVldWUobXBjOHh4eF9zcGktPndvcmtxdWV1ZSk7Ci0Jc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7Ci0KLQlmcmVlX2lycShtcGM4eHh4X3NwaS0+aXJxLCBtcGM4eHh4X3NwaSk7Ci0KLQlpZiAobXBjOHh4eF9zcGktPnNwaV9yZW1vdmUpCi0JCW1wYzh4eHhfc3BpLT5zcGlfcmVtb3ZlKG1wYzh4eHhfc3BpKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgX19kZXZpbml0IG9mX21wYzh4eHhfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZvZmRldi0+ZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvZmRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IG1wYzh4eHhfc3BpX3Byb2JlX2luZm8gKnBpbmZvOwotCXN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwotCWNvbnN0IHZvaWQgKnByb3A7Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0KLQlwaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpwaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghcGluZm8pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcGRhdGEgPSAmcGluZm8tPnBkYXRhOwotCWRldi0+cGxhdGZvcm1fZGF0YSA9IHBkYXRhOwotCi0JLyogQWxsb2NhdGUgYnVzIG51bSBkeW5hbWljYWxseS4gKi8KLQlwZGF0YS0+YnVzX251bSA9IC0xOwotCi0JLyogU1BJIGNvbnRyb2xsZXIgaXMgZWl0aGVyIGNsb2NrZWQgZnJvbSBRRSBvciBTb0MgY2xvY2suICovCi0JcGRhdGEtPnN5c2NsayA9IGdldF9icmdmcmVxKCk7Ci0JaWYgKHBkYXRhLT5zeXNjbGsgPT0gLTEpIHsKLQkJcGRhdGEtPnN5c2NsayA9IGZzbF9nZXRfc3lzX2ZyZXEoKTsKLQkJaWYgKHBkYXRhLT5zeXNjbGsgPT0gLTEpIHsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJtb2RlIiwgTlVMTCk7Ci0JaWYgKHByb3AgJiYgIXN0cmNtcChwcm9wLCAiY3B1LXFlIikpCi0JCXBkYXRhLT5mbGFncyA9IFNQSV9RRV9DUFVfTU9ERTsKLQllbHNlIGlmIChwcm9wICYmICFzdHJjbXAocHJvcCwgInFlIikpCi0JCXBkYXRhLT5mbGFncyA9IFNQSV9DUE1fTU9ERSB8IFNQSV9RRTsKLQllbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxjcG0yLXNwaSIpKQotCQlwZGF0YS0+ZmxhZ3MgPSBTUElfQ1BNX01PREUgfCBTUElfQ1BNMjsKLQllbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxjcG0xLXNwaSIpKQotCQlwZGF0YS0+ZmxhZ3MgPSBTUElfQ1BNX01PREUgfCBTUElfQ1BNMTsKLQotCXJldHVybiAwOwotCi1lcnI6Ci0Ja2ZyZWUocGluZm8pOwotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfZnNsX3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpX2ZzbF9zcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2M2M5Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfZnNsX3NwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE5MiArMCwwIEBACi0vKgotICogRnJlZXNjYWxlIFNQSSBjb250cm9sbGVyIGRyaXZlci4KLSAqCi0gKiBNYWludGFpbmVyOiBLdW1hciBHYWxhCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFBvbHljb20sIEluYy4KLSAqIENvcHlyaWdodCAyMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCi0gKgotICogQ1BNIFNQSSBhbmQgUUUgYnVmZmVyIGRlc2NyaXB0b3JzIG1vZGUgc3VwcG9ydDoKLSAqIENvcHlyaWdodCAoYykgMjAwOSAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICogQXV0aG9yOiBBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAcnUubXZpc3RhLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgotCi0jaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KLSNpbmNsdWRlIDxhc20vY3BtLmg+Ci0jaW5jbHVkZSA8YXNtL3FlLmg+Ci0KLSNpbmNsdWRlICJzcGlfZnNsX2xpYi5oIgotCi0vKiBDUE0xIGFuZCBDUE0yIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICovCi0jaWZkZWYgQ09ORklHX0NQTTEKLSNpbmNsdWRlIDxhc20vY3BtMS5oPgotI2RlZmluZSBDUE1fU1BJX0NNRCBta19jcl9jbWQoQ1BNX0NSX0NIX1NQSSwgMCkKLSNlbHNlCi0jaW5jbHVkZSA8YXNtL2NwbTIuaD4KLSNkZWZpbmUgQ1BNX1NQSV9DTUQgbWtfY3JfY21kKENQTV9DUl9TUElfUEFHRSwgQ1BNX0NSX1NQSV9TQkxPQ0ssIDAsIDApCi0jZW5kaWYKLQotLyogU1BJIENvbnRyb2xsZXIgcmVnaXN0ZXJzICovCi1zdHJ1Y3QgZnNsX3NwaV9yZWcgewotCXU4IHJlczFbMHgyMF07Ci0JX19iZTMyIG1vZGU7Ci0JX19iZTMyIGV2ZW50OwotCV9fYmUzMiBtYXNrOwotCV9fYmUzMiBjb21tYW5kOwotCV9fYmUzMiB0cmFuc21pdDsKLQlfX2JlMzIgcmVjZWl2ZTsKLX07Ci0KLS8qIFNQSSBDb250cm9sbGVyIG1vZGUgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUJU1BNT0RFX0xPT1AJCSgxIDw8IDMwKQotI2RlZmluZQlTUE1PREVfQ0lfSU5BQ1RJVkVISUdICSgxIDw8IDI5KQotI2RlZmluZQlTUE1PREVfQ1BfQkVHSU5fRURHRUNMSwkoMSA8PCAyOCkKLSNkZWZpbmUJU1BNT0RFX0RJVjE2CQkoMSA8PCAyNykKLSNkZWZpbmUJU1BNT0RFX1JFVgkJKDEgPDwgMjYpCi0jZGVmaW5lCVNQTU9ERV9NUwkJKDEgPDwgMjUpCi0jZGVmaW5lCVNQTU9ERV9FTkFCTEUJCSgxIDw8IDI0KQotI2RlZmluZQlTUE1PREVfTEVOKHgpCQkoKHgpIDw8IDIwKQotI2RlZmluZQlTUE1PREVfUE0oeCkJCSgoeCkgPDwgMTYpCi0jZGVmaW5lCVNQTU9ERV9PUAkJKDEgPDwgMTQpCi0jZGVmaW5lCVNQTU9ERV9DRyh4KQkJKCh4KSA8PCA3KQotCi0vKgotICogRGVmYXVsdCBmb3IgU1BJIE1vZGU6Ci0gKglTUEkgTU9ERSAwIChpbmFjdGl2ZSBsb3csIHBoYXNlIG1pZGRsZSwgTVNCLCA4LWJpdCBsZW5ndGgsIHNsb3cgY2xrCi0gKi8KLSNkZWZpbmUJU1BNT0RFX0lOSVRfVkFMIChTUE1PREVfQ0lfSU5BQ1RJVkVISUdIIHwgU1BNT0RFX0RJVjE2IHwgU1BNT0RFX1JFViB8IFwKLQkJCSBTUE1PREVfTVMgfCBTUE1PREVfTEVOKDcpIHwgU1BNT0RFX1BNKDB4ZikpCi0KLS8qIFNQSUUgcmVnaXN0ZXIgdmFsdWVzICovCi0jZGVmaW5lCVNQSUVfTkUJCTB4MDAwMDAyMDAJLyogTm90IGVtcHR5ICovCi0jZGVmaW5lCVNQSUVfTkYJCTB4MDAwMDAxMDAJLyogTm90IGZ1bGwgKi8KLQotLyogU1BJTSByZWdpc3RlciB2YWx1ZXMgKi8KLSNkZWZpbmUJU1BJTV9ORQkJMHgwMDAwMDIwMAkvKiBOb3QgZW1wdHkgKi8KLSNkZWZpbmUJU1BJTV9ORgkJMHgwMDAwMDEwMAkvKiBOb3QgZnVsbCAqLwotCi0jZGVmaW5lCVNQSUVfVFhCCTB4MDAwMDAyMDAJLyogTGFzdCBjaGFyIGlzIHdyaXR0ZW4gdG8gdHggZmlmbyAqLwotI2RlZmluZQlTUElFX1JYQgkweDAwMDAwMTAwCS8qIExhc3QgY2hhciBpcyB3cml0dGVuIHRvIHJ4IGJ1ZiAqLwotCi0vKiBTUENPTSByZWdpc3RlciB2YWx1ZXMgKi8KLSNkZWZpbmUJU1BDT01fU1RSCSgxIDw8IDIzKQkvKiBTdGFydCB0cmFuc21pdCAqLwotCi0jZGVmaW5lCVNQSV9QUkFNX1NJWkUJMHgxMDAKLSNkZWZpbmUJU1BJX01SQkxSCSgodW5zaWduZWQgaW50KVBBR0VfU0laRSkKLQotc3RhdGljIHZvaWQgKmZzbF9kdW1teV9yeDsKLXN0YXRpYyBERUZJTkVfTVVURVgoZnNsX2R1bW15X3J4X2xvY2spOwotc3RhdGljIGludCBmc2xfZHVtbXlfcnhfcmVmY250OwotCi1zdGF0aWMgdm9pZCBmc2xfc3BpX2NoYW5nZV9tb2RlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IG1wYzh4eHhfc3BpICptc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3RydWN0IHNwaV9tcGM4eHh4X2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQlzdHJ1Y3QgZnNsX3NwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7Ci0JX19iZTMyIF9faW9tZW0gKm1vZGUgPSAmcmVnX2Jhc2UtPm1vZGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChjcy0+aHdfbW9kZSA9PSBtcGM4eHh4X3NwaV9yZWFkX3JlZyhtb2RlKSkKLQkJcmV0dXJuOwotCi0JLyogVHVybiBvZmYgSVJRcyBsb2NhbGx5IHRvIG1pbmltaXplIHRpbWUgdGhhdCBTUEkgaXMgZGlzYWJsZWQuICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyogVHVybiBvZmYgU1BJIHVuaXQgcHJpb3IgY2hhbmdpbmcgbW9kZSAqLwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZyhtb2RlLCBjcy0+aHdfbW9kZSAmIH5TUE1PREVfRU5BQkxFKTsKLQotCS8qIFdoZW4gaW4gQ1BNIG1vZGUsIHdlIG5lZWQgdG8gcmVpbml0IHR4IGFuZCByeC4gKi8KLQlpZiAobXNwaS0+ZmxhZ3MgJiBTUElfQ1BNX01PREUpIHsKLQkJaWYgKG1zcGktPmZsYWdzICYgU1BJX1FFKSB7Ci0JCQlxZV9pc3N1ZV9jbWQoUUVfSU5JVF9UWF9SWCwgbXNwaS0+c3ViYmxvY2ssCi0JCQkJICAgICBRRV9DUl9QUk9UT0NPTF9VTlNQRUNJRklFRCwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQljcG1fY29tbWFuZChDUE1fU1BJX0NNRCwgQ1BNX0NSX0lOSVRfVFJYKTsKLQkJCWlmIChtc3BpLT5mbGFncyAmIFNQSV9DUE0xKSB7Ci0JCQkJb3V0X2JlMTYoJm1zcGktPnByYW0tPnJicHRyLAotCQkJCQkgaW5fYmUxNigmbXNwaS0+cHJhbS0+cmJhc2UpKTsKLQkJCQlvdXRfYmUxNigmbXNwaS0+cHJhbS0+dGJwdHIsCi0JCQkJCSBpbl9iZTE2KCZtc3BpLT5wcmFtLT50YmFzZSkpOwotCQkJfQotCQl9Ci0JfQotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZyhtb2RlLCBjcy0+aHdfbW9kZSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBmc2xfc3BpX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQotewotCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlzdHJ1Y3QgZnNsX3NwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHNwaS0+ZGV2LnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKLQlib29sIHBvbCA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIOwotCXN0cnVjdCBzcGlfbXBjOHh4eF9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0KLQlpZiAodmFsdWUgPT0gQklUQkFOR19DU19JTkFDVElWRSkgewotCQlpZiAocGRhdGEtPmNzX2NvbnRyb2wpCi0JCQlwZGF0YS0+Y3NfY29udHJvbChzcGksICFwb2wpOwotCX0KLQotCWlmICh2YWx1ZSA9PSBCSVRCQU5HX0NTX0FDVElWRSkgewotCQltcGM4eHh4X3NwaS0+cnhfc2hpZnQgPSBjcy0+cnhfc2hpZnQ7Ci0JCW1wYzh4eHhfc3BpLT50eF9zaGlmdCA9IGNzLT50eF9zaGlmdDsKLQkJbXBjOHh4eF9zcGktPmdldF9yeCA9IGNzLT5nZXRfcng7Ci0JCW1wYzh4eHhfc3BpLT5nZXRfdHggPSBjcy0+Z2V0X3R4OwotCi0JCWZzbF9zcGlfY2hhbmdlX21vZGUoc3BpKTsKLQotCQlpZiAocGRhdGEtPmNzX2NvbnRyb2wpCi0JCQlwZGF0YS0+Y3NfY29udHJvbChzcGksIHBvbCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zcGlfYXBwbHlfY3B1X21vZGVfcXVpcmtzKHN0cnVjdCBzcGlfbXBjOHh4eF9jcyAqY3MsCi0JCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpLAotCQkJCWludCBiaXRzX3Blcl93b3JkKQotewotCWNzLT5yeF9zaGlmdCA9IDA7Ci0JY3MtPnR4X3NoaWZ0ID0gMDsKLQlpZiAoYml0c19wZXJfd29yZCA8PSA4KSB7Ci0JCWNzLT5nZXRfcnggPSBtcGM4eHh4X3NwaV9yeF9idWZfdTg7Ci0JCWNzLT5nZXRfdHggPSBtcGM4eHh4X3NwaV90eF9idWZfdTg7Ci0JCWlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfUUVfQ1BVX01PREUpIHsKLQkJCWNzLT5yeF9zaGlmdCA9IDE2OwotCQkJY3MtPnR4X3NoaWZ0ID0gMjQ7Ci0JCX0KLQl9IGVsc2UgaWYgKGJpdHNfcGVyX3dvcmQgPD0gMTYpIHsKLQkJY3MtPmdldF9yeCA9IG1wYzh4eHhfc3BpX3J4X2J1Zl91MTY7Ci0JCWNzLT5nZXRfdHggPSBtcGM4eHh4X3NwaV90eF9idWZfdTE2OwotCQlpZiAobXBjOHh4eF9zcGktPmZsYWdzICYgU1BJX1FFX0NQVV9NT0RFKSB7Ci0JCQljcy0+cnhfc2hpZnQgPSAxNjsKLQkJCWNzLT50eF9zaGlmdCA9IDE2OwotCQl9Ci0JfSBlbHNlIGlmIChiaXRzX3Blcl93b3JkIDw9IDMyKSB7Ci0JCWNzLT5nZXRfcnggPSBtcGM4eHh4X3NwaV9yeF9idWZfdTMyOwotCQljcy0+Z2V0X3R4ID0gbXBjOHh4eF9zcGlfdHhfYnVmX3UzMjsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAobXBjOHh4eF9zcGktPmZsYWdzICYgU1BJX1FFX0NQVV9NT0RFICYmCi0JICAgIHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpIHsKLQkJY3MtPnR4X3NoaWZ0ID0gMDsKLQkJaWYgKGJpdHNfcGVyX3dvcmQgPD0gOCkKLQkJCWNzLT5yeF9zaGlmdCA9IDg7Ci0JCWVsc2UKLQkJCWNzLT5yeF9zaGlmdCA9IDA7Ci0JfQotCW1wYzh4eHhfc3BpLT5yeF9zaGlmdCA9IGNzLT5yeF9zaGlmdDsKLQltcGM4eHh4X3NwaS0+dHhfc2hpZnQgPSBjcy0+dHhfc2hpZnQ7Ci0JbXBjOHh4eF9zcGktPmdldF9yeCA9IGNzLT5nZXRfcng7Ci0JbXBjOHh4eF9zcGktPmdldF90eCA9IGNzLT5nZXRfdHg7Ci0KLQlyZXR1cm4gYml0c19wZXJfd29yZDsKLX0KLQotc3RhdGljIGludCBtc3BpX2FwcGx5X3FlX21vZGVfcXVpcmtzKHN0cnVjdCBzcGlfbXBjOHh4eF9jcyAqY3MsCi0JCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQlpbnQgYml0c19wZXJfd29yZCkKLXsKLQkvKiBRRSB1c2VzIExpdHRsZSBFbmRpYW4gZm9yIHdvcmRzID4gOAotCSAqIHNvIHRyYW5zZm9ybSBhbGwgd29yZHMgPiA4IGludG8gOCBiaXRzCi0JICogVW5mb3J0bmF0bHkgdGhhdCBkb2Vzbid0IHdvcmsgZm9yIExTQiBzbwotCSAqIHJlamVjdCB0aGVzZSBmb3Igbm93ICovCi0JLyogTm90ZTogMzIgYml0cyB3b3JkLCBMU0Igd29ya3MgaWZmCi0JICogdGZjci9yZmNyIGlzIHNldCB0byBDUE1GQ1JfR0JMICovCi0JaWYgKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QgJiYKLQkgICAgYml0c19wZXJfd29yZCA+IDgpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChiaXRzX3Blcl93b3JkID4gOCkKLQkJcmV0dXJuIDg7IC8qIHByZXRlbmQgaXRzIDggYml0cyAqLwotCXJldHVybiBiaXRzX3Blcl93b3JkOwotfQotCi1zdGF0aWMgaW50IGZzbF9zcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpOwotCWludCBiaXRzX3Blcl93b3JkID0gMDsKLQl1OCBwbTsKLQl1MzIgaHogPSAwOwotCXN0cnVjdCBzcGlfbXBjOHh4eF9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0KLQltcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCi0JaWYgKHQpIHsKLQkJYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7Ci0JCWh6ID0gdC0+c3BlZWRfaHo7Ci0JfQotCi0JLyogc3BpX3RyYW5zZmVyIGxldmVsIGNhbGxzIHRoYXQgd29yayBwZXItd29yZCAqLwotCWlmICghYml0c19wZXJfd29yZCkKLQkJYml0c19wZXJfd29yZCA9IHNwaS0+Yml0c19wZXJfd29yZDsKLQotCS8qIE1ha2Ugc3VyZSBpdHMgYSBiaXQgd2lkdGggd2Ugc3VwcG9ydCBbNC4uMTYsIDMyXSAqLwotCWlmICgoYml0c19wZXJfd29yZCA8IDQpCi0JICAgIHx8ICgoYml0c19wZXJfd29yZCA+IDE2KSAmJiAoYml0c19wZXJfd29yZCAhPSAzMikpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghaHopCi0JCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0KLQlpZiAoIShtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfQ1BNX01PREUpKQotCQliaXRzX3Blcl93b3JkID0gbXNwaV9hcHBseV9jcHVfbW9kZV9xdWlya3MoY3MsIHNwaSwKLQkJCQkJCQkgICBtcGM4eHh4X3NwaSwKLQkJCQkJCQkgICBiaXRzX3Blcl93b3JkKTsKLQllbHNlIGlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfUUUpCi0JCWJpdHNfcGVyX3dvcmQgPSBtc3BpX2FwcGx5X3FlX21vZGVfcXVpcmtzKGNzLCBzcGksCi0JCQkJCQkJICBiaXRzX3Blcl93b3JkKTsKLQotCWlmIChiaXRzX3Blcl93b3JkIDwgMCkKLQkJcmV0dXJuIGJpdHNfcGVyX3dvcmQ7Ci0KLQlpZiAoYml0c19wZXJfd29yZCA9PSAzMikKLQkJYml0c19wZXJfd29yZCA9IDA7Ci0JZWxzZQotCQliaXRzX3Blcl93b3JkID0gYml0c19wZXJfd29yZCAtIDE7Ci0KLQkvKiBtYXNrIG91dCBiaXRzIHdlIGFyZSBnb2luZyB0byBzZXQgKi8KLQljcy0+aHdfbW9kZSAmPSB+KFNQTU9ERV9MRU4oMHhGKSB8IFNQTU9ERV9ESVYxNgotCQkJCSAgfCBTUE1PREVfUE0oMHhGKSk7Ci0KLQljcy0+aHdfbW9kZSB8PSBTUE1PREVfTEVOKGJpdHNfcGVyX3dvcmQpOwotCi0JaWYgKChtcGM4eHh4X3NwaS0+c3BpYnJnIC8gaHopID4gNjQpIHsKLQkJY3MtPmh3X21vZGUgfD0gU1BNT0RFX0RJVjE2OwotCQlwbSA9IChtcGM4eHh4X3NwaS0+c3BpYnJnIC0gMSkgLyAoaHogKiA2NCkgKyAxOwotCi0JCVdBUk5fT05DRShwbSA+IDE2LCAiJXM6IFJlcXVlc3RlZCBzcGVlZCBpcyB0b28gbG93OiAlZCBIei4gIgotCQkJICAiV2lsbCB1c2UgJWQgSHogaW5zdGVhZC5cbiIsIGRldl9uYW1lKCZzcGktPmRldiksCi0JCQkgIGh6LCBtcGM4eHh4X3NwaS0+c3BpYnJnIC8gMTAyNCk7Ci0JCWlmIChwbSA+IDE2KQotCQkJcG0gPSAxNjsKLQl9IGVsc2UgewotCQlwbSA9IChtcGM4eHh4X3NwaS0+c3BpYnJnIC0gMSkgLyAoaHogKiA0KSArIDE7Ci0JfQotCWlmIChwbSkKLQkJcG0tLTsKLQotCWNzLT5od19tb2RlIHw9IFNQTU9ERV9QTShwbSk7Ci0KLQlmc2xfc3BpX2NoYW5nZV9tb2RlKHNwaSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9zcGlfY3BtX2J1ZnNfc3RhcnQoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpKQotewotCXN0cnVjdCBjcG1fYnVmX2Rlc2MgX19pb21lbSAqdHhfYmQgPSBtc3BpLT50eF9iZDsKLQlzdHJ1Y3QgY3BtX2J1Zl9kZXNjIF9faW9tZW0gKnJ4X2JkID0gbXNwaS0+cnhfYmQ7Ci0JdW5zaWduZWQgaW50IHhmZXJfbGVuID0gbWluKG1zcGktPmNvdW50LCBTUElfTVJCTFIpOwotCXVuc2lnbmVkIGludCB4ZmVyX29mczsKLQlzdHJ1Y3QgZnNsX3NwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7Ci0KLQl4ZmVyX29mcyA9IG1zcGktPnhmZXJfaW5fcHJvZ3Jlc3MtPmxlbiAtIG1zcGktPmNvdW50OwotCi0JaWYgKG1zcGktPnJ4X2RtYSA9PSBtc3BpLT5kbWFfZHVtbXlfcngpCi0JCW91dF9iZTMyKCZyeF9iZC0+Y2JkX2J1ZmFkZHIsIG1zcGktPnJ4X2RtYSk7Ci0JZWxzZQotCQlvdXRfYmUzMigmcnhfYmQtPmNiZF9idWZhZGRyLCBtc3BpLT5yeF9kbWEgKyB4ZmVyX29mcyk7Ci0Jb3V0X2JlMTYoJnJ4X2JkLT5jYmRfZGF0bGVuLCAwKTsKLQlvdXRfYmUxNigmcnhfYmQtPmNiZF9zYywgQkRfU0NfRU1QVFkgfCBCRF9TQ19JTlRSUFQgfCBCRF9TQ19XUkFQKTsKLQotCWlmIChtc3BpLT50eF9kbWEgPT0gbXNwaS0+ZG1hX2R1bW15X3R4KQotCQlvdXRfYmUzMigmdHhfYmQtPmNiZF9idWZhZGRyLCBtc3BpLT50eF9kbWEpOwotCWVsc2UKLQkJb3V0X2JlMzIoJnR4X2JkLT5jYmRfYnVmYWRkciwgbXNwaS0+dHhfZG1hICsgeGZlcl9vZnMpOwotCW91dF9iZTE2KCZ0eF9iZC0+Y2JkX2RhdGxlbiwgeGZlcl9sZW4pOwotCW91dF9iZTE2KCZ0eF9iZC0+Y2JkX3NjLCBCRF9TQ19SRUFEWSB8IEJEX1NDX0lOVFJQVCB8IEJEX1NDX1dSQVAgfAotCQkJCSBCRF9TQ19MQVNUKTsKLQotCS8qIHN0YXJ0IHRyYW5zZmVyICovCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+Y29tbWFuZCwgU1BDT01fU1RSKTsKLX0KLQotc3RhdGljIGludCBmc2xfc3BpX2NwbV9idWZzKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSwKLQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCBib29sIGlzX2RtYV9tYXBwZWQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gbXNwaS0+ZGV2OwotCXN0cnVjdCBmc2xfc3BpX3JlZyAqcmVnX2Jhc2UgPSBtc3BpLT5yZWdfYmFzZTsKLQotCWlmIChpc19kbWFfbWFwcGVkKSB7Ci0JCW1zcGktPm1hcF90eF9kbWEgPSAwOwotCQltc3BpLT5tYXBfcnhfZG1hID0gMDsKLQl9IGVsc2UgewotCQltc3BpLT5tYXBfdHhfZG1hID0gMTsKLQkJbXNwaS0+bWFwX3J4X2RtYSA9IDE7Ci0JfQotCi0JaWYgKCF0LT50eF9idWYpIHsKLQkJbXNwaS0+dHhfZG1hID0gbXNwaS0+ZG1hX2R1bW15X3R4OwotCQltc3BpLT5tYXBfdHhfZG1hID0gMDsKLQl9Ci0KLQlpZiAoIXQtPnJ4X2J1ZikgewotCQltc3BpLT5yeF9kbWEgPSBtc3BpLT5kbWFfZHVtbXlfcng7Ci0JCW1zcGktPm1hcF9yeF9kbWEgPSAwOwotCX0KLQotCWlmIChtc3BpLT5tYXBfdHhfZG1hKSB7Ci0JCXZvaWQgKm5vbmNvbnN0X3R4ID0gKHZvaWQgKiltc3BpLT50eDsgLyogc2h1dCB1cCBnY2MgKi8KLQotCQltc3BpLT50eF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsIG5vbmNvbnN0X3R4LCB0LT5sZW4sCi0JCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOwotCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBtc3BpLT50eF9kbWEpKSB7Ci0JCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBtYXAgdHggZG1hXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfSBlbHNlIGlmICh0LT50eF9idWYpIHsKLQkJbXNwaS0+dHhfZG1hID0gdC0+dHhfZG1hOwotCX0KLQotCWlmIChtc3BpLT5tYXBfcnhfZG1hKSB7Ci0JCW1zcGktPnJ4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwgbXNwaS0+cngsIHQtPmxlbiwKLQkJCQkJICAgICAgRE1BX0ZST01fREVWSUNFKTsKLQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgbXNwaS0+cnhfZG1hKSkgewotCQkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gbWFwIHJ4IGRtYVxuIik7Ci0JCQlnb3RvIGVycl9yeF9kbWE7Ci0JCX0KLQl9IGVsc2UgaWYgKHQtPnJ4X2J1ZikgewotCQltc3BpLT5yeF9kbWEgPSB0LT5yeF9kbWE7Ci0JfQotCi0JLyogZW5hYmxlIHJ4IGludHMgKi8KLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tYXNrLCBTUElFX1JYQik7Ci0KLQltc3BpLT54ZmVyX2luX3Byb2dyZXNzID0gdDsKLQltc3BpLT5jb3VudCA9IHQtPmxlbjsKLQotCS8qIHN0YXJ0IENQTSB0cmFuc2ZlcnMgKi8KLQlmc2xfc3BpX2NwbV9idWZzX3N0YXJ0KG1zcGkpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9yeF9kbWE6Ci0JaWYgKG1zcGktPm1hcF90eF9kbWEpCi0JCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBtc3BpLT50eF9kbWEsIHQtPmxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9zcGlfY3BtX2J1ZnNfY29tcGxldGUoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IG1zcGktPmRldjsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ID0gbXNwaS0+eGZlcl9pbl9wcm9ncmVzczsKLQotCWlmIChtc3BpLT5tYXBfdHhfZG1hKQotCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgbXNwaS0+dHhfZG1hLCB0LT5sZW4sIERNQV9UT19ERVZJQ0UpOwotCWlmIChtc3BpLT5tYXBfcnhfZG1hKQotCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgbXNwaS0+cnhfZG1hLCB0LT5sZW4sIERNQV9GUk9NX0RFVklDRSk7Ci0JbXNwaS0+eGZlcl9pbl9wcm9ncmVzcyA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgZnNsX3NwaV9jcHVfYnVmcyhzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGksCi0JCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCwgdW5zaWduZWQgaW50IGxlbikKLXsKLQl1MzIgd29yZDsKLQlzdHJ1Y3QgZnNsX3NwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7Ci0KLQltc3BpLT5jb3VudCA9IGxlbjsKLQotCS8qIGVuYWJsZSByeCBpbnRzICovCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bWFzaywgU1BJTV9ORSk7Ci0KLQkvKiB0cmFuc21pdCB3b3JkICovCi0Jd29yZCA9IG1zcGktPmdldF90eChtc3BpKTsKLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT50cmFuc21pdCwgd29yZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmc2xfc3BpX2J1ZnMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCwKLQkJCSAgICBib29sIGlzX2RtYV9tYXBwZWQpCi17Ci0Jc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXN0cnVjdCBmc2xfc3BpX3JlZyAqcmVnX2Jhc2U7Ci0JdW5zaWduZWQgaW50IGxlbiA9IHQtPmxlbjsKLQl1OCBiaXRzX3Blcl93b3JkOwotCWludCByZXQ7Ci0KLQlyZWdfYmFzZSA9IG1wYzh4eHhfc3BpLT5yZWdfYmFzZTsKLQliaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCWlmICh0LT5iaXRzX3Blcl93b3JkKQotCQliaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZDsKLQotCWlmIChiaXRzX3Blcl93b3JkID4gOCkgewotCQkvKiBpbnZhbGlkIGxlbmd0aD8gKi8KLQkJaWYgKGxlbiAmIDEpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbGVuIC89IDI7Ci0JfQotCWlmIChiaXRzX3Blcl93b3JkID4gMTYpIHsKLQkJLyogaW52YWxpZCBsZW5ndGg/ICovCi0JCWlmIChsZW4gJiAxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWxlbiAvPSAyOwotCX0KLQotCW1wYzh4eHhfc3BpLT50eCA9IHQtPnR4X2J1ZjsKLQltcGM4eHh4X3NwaS0+cnggPSB0LT5yeF9idWY7Ci0KLQlJTklUX0NPTVBMRVRJT04obXBjOHh4eF9zcGktPmRvbmUpOwotCi0JaWYgKG1wYzh4eHhfc3BpLT5mbGFncyAmIFNQSV9DUE1fTU9ERSkKLQkJcmV0ID0gZnNsX3NwaV9jcG1fYnVmcyhtcGM4eHh4X3NwaSwgdCwgaXNfZG1hX21hcHBlZCk7Ci0JZWxzZQotCQlyZXQgPSBmc2xfc3BpX2NwdV9idWZzKG1wYzh4eHhfc3BpLCB0LCBsZW4pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtcGM4eHh4X3NwaS0+ZG9uZSk7Ci0KLQkvKiBkaXNhYmxlIHJ4IGludHMgKi8KLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tYXNrLCAwKTsKLQotCWlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfQ1BNX01PREUpCi0JCWZzbF9zcGlfY3BtX2J1ZnNfY29tcGxldGUobXBjOHh4eF9zcGkpOwotCi0JcmV0dXJuIG1wYzh4eHhfc3BpLT5jb3VudDsKLX0KLQotc3RhdGljIHZvaWQgZnNsX3NwaV9kb19vbmVfbXNnKHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKLXsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gbS0+c3BpOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7Ci0JdW5zaWduZWQgaW50IGNzX2NoYW5nZTsKLQljb25zdCBpbnQgbnNlY3MgPSA1MDsKLQlpbnQgc3RhdHVzOwotCi0JY3NfY2hhbmdlID0gMTsKLQlzdGF0dXMgPSAwOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQlpZiAodC0+Yml0c19wZXJfd29yZCB8fCB0LT5zcGVlZF9oeikgewotCQkJLyogRG9uJ3QgYWxsb3cgY2hhbmdlcyBpZiBDUyBpcyBhY3RpdmUgKi8KLQkJCXN0YXR1cyA9IC1FSU5WQUw7Ci0KLQkJCWlmIChjc19jaGFuZ2UpCi0JCQkJc3RhdHVzID0gZnNsX3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIHQpOwotCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY3NfY2hhbmdlKSB7Ci0JCQlmc2xfc3BpX2NoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0FDVElWRSk7Ci0JCQluZGVsYXkobnNlY3MpOwotCQl9Ci0JCWNzX2NoYW5nZSA9IHQtPmNzX2NoYW5nZTsKLQkJaWYgKHQtPmxlbikKLQkJCXN0YXR1cyA9IGZzbF9zcGlfYnVmcyhzcGksIHQsIG0tPmlzX2RtYV9tYXBwZWQpOwotCQlpZiAoc3RhdHVzKSB7Ci0JCQlzdGF0dXMgPSAtRU1TR1NJWkU7Ci0JCQlicmVhazsKLQkJfQotCQltLT5hY3R1YWxfbGVuZ3RoICs9IHQtPmxlbjsKLQotCQlpZiAodC0+ZGVsYXlfdXNlY3MpCi0JCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOwotCi0JCWlmIChjc19jaGFuZ2UpIHsKLQkJCW5kZWxheShuc2Vjcyk7Ci0JCQlmc2xfc3BpX2NoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0lOQUNUSVZFKTsKLQkJCW5kZWxheShuc2Vjcyk7Ci0JCX0KLQl9Ci0KLQltLT5zdGF0dXMgPSBzdGF0dXM7Ci0JbS0+Y29tcGxldGUobS0+Y29udGV4dCk7Ci0KLQlpZiAoc3RhdHVzIHx8ICFjc19jaGFuZ2UpIHsKLQkJbmRlbGF5KG5zZWNzKTsKLQkJZnNsX3NwaV9jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19JTkFDVElWRSk7Ci0JfQotCi0JZnNsX3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IGZzbF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpOwotCXN0cnVjdCBmc2xfc3BpX3JlZyAqcmVnX2Jhc2U7Ci0JaW50IHJldHZhbDsKLQl1MzIgaHdfbW9kZTsKLQlzdHJ1Y3Qgc3BpX21wYzh4eHhfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwotCi0JaWYgKCFzcGktPm1heF9zcGVlZF9oeikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWNzKSB7Ci0JCWNzID0ga3phbGxvYyhzaXplb2YgKmNzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjcykKLQkJCXJldHVybiAtRU5PTUVNOwotCQlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBjczsKLQl9Ci0JbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQotCXJlZ19iYXNlID0gbXBjOHh4eF9zcGktPnJlZ19iYXNlOwotCi0JaHdfbW9kZSA9IGNzLT5od19tb2RlOyAvKiBTYXZlIG9yaWdpbmFsIHNldHRpbmdzICovCi0JY3MtPmh3X21vZGUgPSBtcGM4eHh4X3NwaV9yZWFkX3JlZygmcmVnX2Jhc2UtPm1vZGUpOwotCS8qIG1hc2sgb3V0IGJpdHMgd2UgYXJlIGdvaW5nIHRvIHNldCAqLwotCWNzLT5od19tb2RlICY9IH4oU1BNT0RFX0NQX0JFR0lOX0VER0VDTEsgfCBTUE1PREVfQ0lfSU5BQ1RJVkVISUdICi0JCQkgfCBTUE1PREVfUkVWIHwgU1BNT0RFX0xPT1ApOwotCi0JaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQotCQljcy0+aHdfbW9kZSB8PSBTUE1PREVfQ1BfQkVHSU5fRURHRUNMSzsKLQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCi0JCWNzLT5od19tb2RlIHw9IFNQTU9ERV9DSV9JTkFDVElWRUhJR0g7Ci0JaWYgKCEoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkpCi0JCWNzLT5od19tb2RlIHw9IFNQTU9ERV9SRVY7Ci0JaWYgKHNwaS0+bW9kZSAmIFNQSV9MT09QKQotCQljcy0+aHdfbW9kZSB8PSBTUE1PREVfTE9PUDsKLQotCXJldHZhbCA9IGZzbF9zcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKLQlpZiAocmV0dmFsIDwgMCkgewotCQljcy0+aHdfbW9kZSA9IGh3X21vZGU7IC8qIFJlc3RvcmUgc2V0dGluZ3MgKi8KLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9zcGlfY3BtX2lycShzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGksIHUzMiBldmVudHMpCi17Ci0JdTE2IGxlbjsKLQlzdHJ1Y3QgZnNsX3NwaV9yZWcgKnJlZ19iYXNlID0gbXNwaS0+cmVnX2Jhc2U7Ci0KLQlkZXZfZGJnKG1zcGktPmRldiwgIiVzOiBiZCBkYXRsZW4gJWQsIGNvdW50ICVkXG4iLCBfX2Z1bmNfXywKLQkJaW5fYmUxNigmbXNwaS0+cnhfYmQtPmNiZF9kYXRsZW4pLCBtc3BpLT5jb3VudCk7Ci0KLQlsZW4gPSBpbl9iZTE2KCZtc3BpLT5yeF9iZC0+Y2JkX2RhdGxlbik7Ci0JaWYgKGxlbiA+IG1zcGktPmNvdW50KSB7Ci0JCVdBUk5fT04oMSk7Ci0JCWxlbiA9IG1zcGktPmNvdW50OwotCX0KLQotCS8qIENsZWFyIHRoZSBldmVudHMgKi8KLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5ldmVudCwgZXZlbnRzKTsKLQotCW1zcGktPmNvdW50IC09IGxlbjsKLQlpZiAobXNwaS0+Y291bnQpCi0JCWZzbF9zcGlfY3BtX2J1ZnNfc3RhcnQobXNwaSk7Ci0JZWxzZQotCQljb21wbGV0ZSgmbXNwaS0+ZG9uZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9zcGlfY3B1X2lycShzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGksIHUzMiBldmVudHMpCi17Ci0Jc3RydWN0IGZzbF9zcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOwotCi0JLyogV2UgbmVlZCBoYW5kbGUgUlggZmlyc3QgKi8KLQlpZiAoZXZlbnRzICYgU1BJRV9ORSkgewotCQl1MzIgcnhfZGF0YSA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZyZWdfYmFzZS0+cmVjZWl2ZSk7Ci0KLQkJaWYgKG1zcGktPnJ4KQotCQkJbXNwaS0+Z2V0X3J4KHJ4X2RhdGEsIG1zcGkpOwotCX0KLQotCWlmICgoZXZlbnRzICYgU1BJRV9ORikgPT0gMCkKLQkJLyogc3BpbiB1bnRpbCBUWCBpcyBkb25lICovCi0JCXdoaWxlICgoKGV2ZW50cyA9Ci0JCQltcGM4eHh4X3NwaV9yZWFkX3JlZygmcmVnX2Jhc2UtPmV2ZW50KSkgJgotCQkJCQkJU1BJRV9ORikgPT0gMCkKLQkJCWNwdV9yZWxheCgpOwotCi0JLyogQ2xlYXIgdGhlIGV2ZW50cyAqLwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmV2ZW50LCBldmVudHMpOwotCi0JbXNwaS0+Y291bnQgLT0gMTsKLQlpZiAobXNwaS0+Y291bnQpIHsKLQkJdTMyIHdvcmQgPSBtc3BpLT5nZXRfdHgobXNwaSk7Ci0KLQkJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+dHJhbnNtaXQsIHdvcmQpOwotCX0gZWxzZSB7Ci0JCWNvbXBsZXRlKCZtc3BpLT5kb25lKTsKLQl9Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBmc2xfc3BpX2lycShzMzIgaXJxLCB2b2lkICpjb250ZXh0X2RhdGEpCi17Ci0Jc3RydWN0IG1wYzh4eHhfc3BpICptc3BpID0gY29udGV4dF9kYXRhOwotCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOwotCXUzMiBldmVudHM7Ci0Jc3RydWN0IGZzbF9zcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOwotCi0JLyogR2V0IGludGVycnVwdCBldmVudHModHgvcngpICovCi0JZXZlbnRzID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoJnJlZ19iYXNlLT5ldmVudCk7Ci0JaWYgKGV2ZW50cykKLQkJcmV0ID0gSVJRX0hBTkRMRUQ7Ci0KLQlkZXZfZGJnKG1zcGktPmRldiwgIiVzOiBldmVudHMgJXhcbiIsIF9fZnVuY19fLCBldmVudHMpOwotCi0JaWYgKG1zcGktPmZsYWdzICYgU1BJX0NQTV9NT0RFKQotCQlmc2xfc3BpX2NwbV9pcnEobXNwaSwgZXZlbnRzKTsKLQllbHNlCi0JCWZzbF9zcGlfY3B1X2lycShtc3BpLCBldmVudHMpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgKmZzbF9zcGlfYWxsb2NfZHVtbXlfcngodm9pZCkKLXsKLQltdXRleF9sb2NrKCZmc2xfZHVtbXlfcnhfbG9jayk7Ci0KLQlpZiAoIWZzbF9kdW1teV9yeCkKLQkJZnNsX2R1bW15X3J4ID0ga21hbGxvYyhTUElfTVJCTFIsIEdGUF9LRVJORUwpOwotCWlmIChmc2xfZHVtbXlfcngpCi0JCWZzbF9kdW1teV9yeF9yZWZjbnQrKzsKLQotCW11dGV4X3VubG9jaygmZnNsX2R1bW15X3J4X2xvY2spOwotCi0JcmV0dXJuIGZzbF9kdW1teV9yeDsKLX0KLQotc3RhdGljIHZvaWQgZnNsX3NwaV9mcmVlX2R1bW15X3J4KHZvaWQpCi17Ci0JbXV0ZXhfbG9jaygmZnNsX2R1bW15X3J4X2xvY2spOwotCi0Jc3dpdGNoIChmc2xfZHVtbXlfcnhfcmVmY250KSB7Ci0JY2FzZSAwOgotCQlXQVJOX09OKDEpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWtmcmVlKGZzbF9kdW1teV9yeCk7Ci0JCWZzbF9kdW1teV9yeCA9IE5VTEw7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWRlZmF1bHQ6Ci0JCWZzbF9kdW1teV9yeF9yZWZjbnQtLTsKLQkJYnJlYWs7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZmc2xfZHVtbXlfcnhfbG9jayk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZzbF9zcGlfY3BtX2dldF9wcmFtKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtc3BpLT5kZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKLQljb25zdCB1MzIgKmlwcm9wOwotCWludCBzaXplOwotCXVuc2lnbmVkIGxvbmcgc3BpX2Jhc2Vfb2ZzOwotCXVuc2lnbmVkIGxvbmcgcHJhbV9vZnMgPSAtRU5PTUVNOwotCi0JLyogQ2FuJ3QgdXNlIG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoKSwgUUUgbXVyYW0gaXNuJ3QgYXQgMC4gKi8KLQlpcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsICZzaXplKTsKLQotCS8qIFFFIHdpdGggYSBmaXhlZCBwcmFtIGxvY2F0aW9uPyAqLwotCWlmIChtc3BpLT5mbGFncyAmIFNQSV9RRSAmJiBpcHJvcCAmJiBzaXplID09IHNpemVvZigqaXByb3ApICogNCkKLQkJcmV0dXJuIGNwbV9tdXJhbV9hbGxvY19maXhlZChpcHJvcFsyXSwgU1BJX1BSQU1fU0laRSk7Ci0KLQkvKiBRRSBidXQgd2l0aCBhIGR5bmFtaWMgcHJhbSBsb2NhdGlvbj8gKi8KLQlpZiAobXNwaS0+ZmxhZ3MgJiBTUElfUUUpIHsKLQkJcHJhbV9vZnMgPSBjcG1fbXVyYW1fYWxsb2MoU1BJX1BSQU1fU0laRSwgNjQpOwotCQlxZV9pc3N1ZV9jbWQoUUVfQVNTSUdOX1BBR0VfVE9fREVWSUNFLCBtc3BpLT5zdWJibG9jaywKLQkJCQlRRV9DUl9QUk9UT0NPTF9VTlNQRUNJRklFRCwgcHJhbV9vZnMpOwotCQlyZXR1cm4gcHJhbV9vZnM7Ci0JfQotCi0JLyogQ1BNMSBhbmQgQ1BNMiBwcmFtIG11c3QgYmUgYXQgYSBmaXhlZCBhZGRyLiAqLwotCWlmICghaXByb3AgfHwgc2l6ZSAhPSBzaXplb2YoKmlwcm9wKSAqIDQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3BpX2Jhc2Vfb2ZzID0gY3BtX211cmFtX2FsbG9jX2ZpeGVkKGlwcm9wWzJdLCAyKTsKLQlpZiAoSVNfRVJSX1ZBTFVFKHNwaV9iYXNlX29mcykpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKG1zcGktPmZsYWdzICYgU1BJX0NQTTIpIHsKLQkJcHJhbV9vZnMgPSBjcG1fbXVyYW1fYWxsb2MoU1BJX1BSQU1fU0laRSwgNjQpOwotCQlpZiAoIUlTX0VSUl9WQUxVRShwcmFtX29mcykpIHsKLQkJCXUxNiBfX2lvbWVtICpzcGlfYmFzZSA9IGNwbV9tdXJhbV9hZGRyKHNwaV9iYXNlX29mcyk7Ci0KLQkJCW91dF9iZTE2KHNwaV9iYXNlLCBwcmFtX29mcyk7Ci0JCX0KLQl9IGVsc2UgewotCQlzdHJ1Y3Qgc3BpX3ByYW0gX19pb21lbSAqcHJhbSA9IGNwbV9tdXJhbV9hZGRyKHNwaV9iYXNlX29mcyk7Ci0JCXUxNiBycGJhc2UgPSBpbl9iZTE2KCZwcmFtLT5ycGJhc2UpOwotCi0JCS8qIE1pY3JvY29kZSByZWxvY2F0aW9uIHBhdGNoIGFwcGxpZWQ/ICovCi0JCWlmIChycGJhc2UpCi0JCQlwcmFtX29mcyA9IHJwYmFzZTsKLQkJZWxzZQotCQkJcmV0dXJuIHNwaV9iYXNlX29mczsKLQl9Ci0KLQljcG1fbXVyYW1fZnJlZShzcGlfYmFzZV9vZnMpOwotCXJldHVybiBwcmFtX29mczsKLX0KLQotc3RhdGljIGludCBmc2xfc3BpX2NwbV9pbml0KHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtc3BpLT5kZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKLQljb25zdCB1MzIgKmlwcm9wOwotCWludCBzaXplOwotCXVuc2lnbmVkIGxvbmcgcHJhbV9vZnM7Ci0JdW5zaWduZWQgbG9uZyBiZHNfb2ZzOwotCi0JaWYgKCEobXNwaS0+ZmxhZ3MgJiBTUElfQ1BNX01PREUpKQotCQlyZXR1cm4gMDsKLQotCWlmICghZnNsX3NwaV9hbGxvY19kdW1teV9yeCgpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChtc3BpLT5mbGFncyAmIFNQSV9RRSkgewotCQlpcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNlbGwtaW5kZXgiLCAmc2l6ZSk7Ci0JCWlmIChpcHJvcCAmJiBzaXplID09IHNpemVvZigqaXByb3ApKQotCQkJbXNwaS0+c3ViYmxvY2sgPSAqaXByb3A7Ci0KLQkJc3dpdGNoIChtc3BpLT5zdWJibG9jaykgewotCQlkZWZhdWx0OgotCQkJZGV2X3dhcm4oZGV2LCAiY2VsbC1pbmRleCB1bnNwZWNpZmllZCwgYXNzdW1pbmcgU1BJMSIpOwotCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgMDoKLQkJCW1zcGktPnN1YmJsb2NrID0gUUVfQ1JfU1VCQkxPQ0tfU1BJMTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQltc3BpLT5zdWJibG9jayA9IFFFX0NSX1NVQkJMT0NLX1NQSTI7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXByYW1fb2ZzID0gZnNsX3NwaV9jcG1fZ2V0X3ByYW0obXNwaSk7Ci0JaWYgKElTX0VSUl9WQUxVRShwcmFtX29mcykpIHsKLQkJZGV2X2VycihkZXYsICJjYW4ndCBhbGxvY2F0ZSBzcGkgcGFyYW1ldGVyIHJhbVxuIik7Ci0JCWdvdG8gZXJyX3ByYW07Ci0JfQotCi0JYmRzX29mcyA9IGNwbV9tdXJhbV9hbGxvYyhzaXplb2YoKm1zcGktPnR4X2JkKSArCi0JCQkJICBzaXplb2YoKm1zcGktPnJ4X2JkKSwgOCk7Ci0JaWYgKElTX0VSUl9WQUxVRShiZHNfb2ZzKSkgewotCQlkZXZfZXJyKGRldiwgImNhbid0IGFsbG9jYXRlIGJkc1xuIik7Ci0JCWdvdG8gZXJyX2JkczsKLQl9Ci0KLQltc3BpLT5kbWFfZHVtbXlfdHggPSBkbWFfbWFwX3NpbmdsZShkZXYsIGVtcHR5X3plcm9fcGFnZSwgUEFHRV9TSVpFLAotCQkJCQkgICAgRE1BX1RPX0RFVklDRSk7Ci0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgbXNwaS0+ZG1hX2R1bW15X3R4KSkgewotCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBtYXAgZHVtbXkgdHggYnVmZmVyXG4iKTsKLQkJZ290byBlcnJfZHVtbXlfdHg7Ci0JfQotCi0JbXNwaS0+ZG1hX2R1bW15X3J4ID0gZG1hX21hcF9zaW5nbGUoZGV2LCBmc2xfZHVtbXlfcngsIFNQSV9NUkJMUiwKLQkJCQkJICAgIERNQV9GUk9NX0RFVklDRSk7Ci0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgbXNwaS0+ZG1hX2R1bW15X3J4KSkgewotCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBtYXAgZHVtbXkgcnggYnVmZmVyXG4iKTsKLQkJZ290byBlcnJfZHVtbXlfcng7Ci0JfQotCi0JbXNwaS0+cHJhbSA9IGNwbV9tdXJhbV9hZGRyKHByYW1fb2ZzKTsKLQotCW1zcGktPnR4X2JkID0gY3BtX211cmFtX2FkZHIoYmRzX29mcyk7Ci0JbXNwaS0+cnhfYmQgPSBjcG1fbXVyYW1fYWRkcihiZHNfb2ZzICsgc2l6ZW9mKCptc3BpLT50eF9iZCkpOwotCi0JLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXIgcmFtLiAqLwotCW91dF9iZTE2KCZtc3BpLT5wcmFtLT50YmFzZSwgY3BtX211cmFtX29mZnNldChtc3BpLT50eF9iZCkpOwotCW91dF9iZTE2KCZtc3BpLT5wcmFtLT5yYmFzZSwgY3BtX211cmFtX29mZnNldChtc3BpLT5yeF9iZCkpOwotCW91dF84KCZtc3BpLT5wcmFtLT50ZmNyLCBDUE1GQ1JfRUIgfCBDUE1GQ1JfR0JMKTsKLQlvdXRfOCgmbXNwaS0+cHJhbS0+cmZjciwgQ1BNRkNSX0VCIHwgQ1BNRkNSX0dCTCk7Ci0Jb3V0X2JlMTYoJm1zcGktPnByYW0tPm1yYmxyLCBTUElfTVJCTFIpOwotCW91dF9iZTMyKCZtc3BpLT5wcmFtLT5yc3RhdGUsIDApOwotCW91dF9iZTMyKCZtc3BpLT5wcmFtLT5yZHAsIDApOwotCW91dF9iZTE2KCZtc3BpLT5wcmFtLT5yYnB0ciwgMCk7Ci0Jb3V0X2JlMTYoJm1zcGktPnByYW0tPnJiYywgMCk7Ci0Jb3V0X2JlMzIoJm1zcGktPnByYW0tPnJ4dG1wLCAwKTsKLQlvdXRfYmUzMigmbXNwaS0+cHJhbS0+dHN0YXRlLCAwKTsKLQlvdXRfYmUzMigmbXNwaS0+cHJhbS0+dGRwLCAwKTsKLQlvdXRfYmUxNigmbXNwaS0+cHJhbS0+dGJwdHIsIDApOwotCW91dF9iZTE2KCZtc3BpLT5wcmFtLT50YmMsIDApOwotCW91dF9iZTMyKCZtc3BpLT5wcmFtLT50eHRtcCwgMCk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2R1bW15X3J4OgotCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBtc3BpLT5kbWFfZHVtbXlfdHgsIFBBR0VfU0laRSwgRE1BX1RPX0RFVklDRSk7Ci1lcnJfZHVtbXlfdHg6Ci0JY3BtX211cmFtX2ZyZWUoYmRzX29mcyk7Ci1lcnJfYmRzOgotCWNwbV9tdXJhbV9mcmVlKHByYW1fb2ZzKTsKLWVycl9wcmFtOgotCWZzbF9zcGlfZnJlZV9kdW1teV9yeCgpOwotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgdm9pZCBmc2xfc3BpX2NwbV9mcmVlKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtc3BpLT5kZXY7Ci0KLQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgbXNwaS0+ZG1hX2R1bW15X3J4LCBTUElfTVJCTFIsIERNQV9GUk9NX0RFVklDRSk7Ci0JZG1hX3VubWFwX3NpbmdsZShkZXYsIG1zcGktPmRtYV9kdW1teV90eCwgUEFHRV9TSVpFLCBETUFfVE9fREVWSUNFKTsKLQljcG1fbXVyYW1fZnJlZShjcG1fbXVyYW1fb2Zmc2V0KG1zcGktPnR4X2JkKSk7Ci0JY3BtX211cmFtX2ZyZWUoY3BtX211cmFtX29mZnNldChtc3BpLT5wcmFtKSk7Ci0JZnNsX3NwaV9mcmVlX2R1bW15X3J4KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9zcGlfcmVtb3ZlKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSkKLXsKLQlpb3VubWFwKG1zcGktPnJlZ19iYXNlKTsKLQlmc2xfc3BpX2NwbV9mcmVlKG1zcGkpOwotfQotCi1zdGF0aWMgc3RydWN0IHNwaV9tYXN0ZXIgKiBfX2RldmluaXQgZnNsX3NwaV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCByZXNvdXJjZSAqbWVtLCB1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7Ci0Jc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaTsKLQlzdHJ1Y3QgZnNsX3NwaV9yZWcgKnJlZ19iYXNlOwotCXUzMiByZWd2YWw7Ci0JaW50IHJldCA9IDA7Ci0KLQltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKGRldiwgc2l6ZW9mKHN0cnVjdCBtcGM4eHh4X3NwaSkpOwotCWlmIChtYXN0ZXIgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBtYXN0ZXIpOwotCi0JcmV0ID0gbXBjOHh4eF9zcGlfcHJvYmUoZGV2LCBtZW0sIGlycSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfcHJvYmU7Ci0KLQltYXN0ZXItPnNldHVwID0gZnNsX3NwaV9zZXR1cDsKLQotCW1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCW1wYzh4eHhfc3BpLT5zcGlfZG9fb25lX21zZyA9IGZzbF9zcGlfZG9fb25lX21zZzsKLQltcGM4eHh4X3NwaS0+c3BpX3JlbW92ZSA9IGZzbF9zcGlfcmVtb3ZlOwotCi0KLQlyZXQgPSBmc2xfc3BpX2NwbV9pbml0KG1wYzh4eHhfc3BpKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9jcG1faW5pdDsKLQotCWlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfUUVfQ1BVX01PREUpIHsKLQkJbXBjOHh4eF9zcGktPnJ4X3NoaWZ0ID0gMTY7Ci0JCW1wYzh4eHhfc3BpLT50eF9zaGlmdCA9IDI0OwotCX0KLQotCW1wYzh4eHhfc3BpLT5yZWdfYmFzZSA9IGlvcmVtYXAobWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKLQlpZiAobXBjOHh4eF9zcGktPnJlZ19iYXNlID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfaW9yZW1hcDsKLQl9Ci0KLQkvKiBSZWdpc3RlciBmb3IgU1BJIEludGVycnVwdCAqLwotCXJldCA9IHJlcXVlc3RfaXJxKG1wYzh4eHhfc3BpLT5pcnEsIGZzbF9zcGlfaXJxLAotCQkJICAwLCAiZnNsX3NwaSIsIG1wYzh4eHhfc3BpKTsKLQotCWlmIChyZXQgIT0gMCkKLQkJZ290byBmcmVlX2lycTsKLQotCXJlZ19iYXNlID0gbXBjOHh4eF9zcGktPnJlZ19iYXNlOwotCi0JLyogU1BJIGNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb25zICovCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bW9kZSwgMCk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bWFzaywgMCk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+Y29tbWFuZCwgMCk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+ZXZlbnQsIDB4ZmZmZmZmZmYpOwotCi0JLyogRW5hYmxlIFNQSSBpbnRlcmZhY2UgKi8KLQlyZWd2YWwgPSBwZGF0YS0+aW5pdGlhbF9zcG1vZGUgfCBTUE1PREVfSU5JVF9WQUwgfCBTUE1PREVfRU5BQkxFOwotCWlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfUUVfQ1BVX01PREUpCi0JCXJlZ3ZhbCB8PSBTUE1PREVfT1A7Ci0KLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5tb2RlLCByZWd2YWwpOwotCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHVucmVnX21hc3RlcjsKLQotCWRldl9pbmZvKGRldiwgImF0IDB4JXAgKGlycSA9ICVkKSwgJXMgbW9kZVxuIiwgcmVnX2Jhc2UsCi0JCSBtcGM4eHh4X3NwaS0+aXJxLCBtcGM4eHh4X3NwaV9zdHJtb2RlKG1wYzh4eHhfc3BpLT5mbGFncykpOwotCi0JcmV0dXJuIG1hc3RlcjsKLQotdW5yZWdfbWFzdGVyOgotCWZyZWVfaXJxKG1wYzh4eHhfc3BpLT5pcnEsIG1wYzh4eHhfc3BpKTsKLWZyZWVfaXJxOgotCWlvdW5tYXAobXBjOHh4eF9zcGktPnJlZ19iYXNlKTsKLWVycl9pb3JlbWFwOgotCWZzbF9zcGlfY3BtX2ZyZWUobXBjOHh4eF9zcGkpOwotZXJyX2NwbV9pbml0OgotZXJyX3Byb2JlOgotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci1lcnI6Ci0JcmV0dXJuIEVSUl9QVFIocmV0KTsKLX0KLQotc3RhdGljIHZvaWQgZnNsX3NwaV9jc19jb250cm9sKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGJvb2wgb24pCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gc3BpLT5kZXYucGFyZW50OwotCXN0cnVjdCBtcGM4eHh4X3NwaV9wcm9iZV9pbmZvICpwaW5mbyA9IHRvX29mX3BpbmZvKGRldi0+cGxhdGZvcm1fZGF0YSk7Ci0JdTE2IGNzID0gc3BpLT5jaGlwX3NlbGVjdDsKLQlpbnQgZ3BpbyA9IHBpbmZvLT5ncGlvc1tjc107Ci0JYm9vbCBhbG93ID0gcGluZm8tPmFsb3dfZmxhZ3NbY3NdOwotCi0JZ3Bpb19zZXRfdmFsdWUoZ3Bpbywgb24gXiBhbG93KTsKLX0KLQotc3RhdGljIGludCBvZl9mc2xfc3BpX2dldF9jaGlwc2VsZWN0cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKLQlzdHJ1Y3QgZnNsX3NwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgbXBjOHh4eF9zcGlfcHJvYmVfaW5mbyAqcGluZm8gPSB0b19vZl9waW5mbyhwZGF0YSk7Ci0JdW5zaWduZWQgaW50IG5ncGlvczsKLQlpbnQgaSA9IDA7Ci0JaW50IHJldDsKLQotCW5ncGlvcyA9IG9mX2dwaW9fY291bnQobnApOwotCWlmICghbmdwaW9zKSB7Ci0JCS8qCi0JCSAqIFNQSSB3L28gY2hpcC1zZWxlY3QgbGluZS4gT25lIFNQSSBkZXZpY2UgaXMgc3RpbGwgcGVybWl0dGVkCi0JCSAqIHRob3VnaC4KLQkJICovCi0JCXBkYXRhLT5tYXhfY2hpcHNlbGVjdCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCXBpbmZvLT5ncGlvcyA9IGttYWxsb2MobmdwaW9zICogc2l6ZW9mKCpwaW5mby0+Z3Bpb3MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBpbmZvLT5ncGlvcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KHBpbmZvLT5ncGlvcywgLTEsIG5ncGlvcyAqIHNpemVvZigqcGluZm8tPmdwaW9zKSk7Ci0KLQlwaW5mby0+YWxvd19mbGFncyA9IGt6YWxsb2MobmdwaW9zICogc2l6ZW9mKCpwaW5mby0+YWxvd19mbGFncyksCi0JCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghcGluZm8tPmFsb3dfZmxhZ3MpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYWxsb2NfZmxhZ3M7Ci0JfQotCi0JZm9yICg7IGkgPCBuZ3Bpb3M7IGkrKykgewotCQlpbnQgZ3BpbzsKLQkJZW51bSBvZl9ncGlvX2ZsYWdzIGZsYWdzOwotCi0JCWdwaW8gPSBvZl9nZXRfZ3Bpb19mbGFncyhucCwgaSwgJmZsYWdzKTsKLQkJaWYgKCFncGlvX2lzX3ZhbGlkKGdwaW8pKSB7Ci0JCQlkZXZfZXJyKGRldiwgImludmFsaWQgZ3BpbyAjJWQ6ICVkXG4iLCBpLCBncGlvKTsKLQkJCXJldCA9IGdwaW87Ci0JCQlnb3RvIGVycl9sb29wOwotCQl9Ci0KLQkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGdwaW8sIGRldl9uYW1lKGRldikpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRldiwgImNhbid0IHJlcXVlc3QgZ3BpbyAjJWQ6ICVkXG4iLCBpLCByZXQpOwotCQkJZ290byBlcnJfbG9vcDsKLQkJfQotCi0JCXBpbmZvLT5ncGlvc1tpXSA9IGdwaW87Ci0JCXBpbmZvLT5hbG93X2ZsYWdzW2ldID0gZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1c7Ci0KLQkJcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBpbmZvLT5ncGlvc1tpXSwKLQkJCQkJICAgIHBpbmZvLT5hbG93X2ZsYWdzW2ldKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkZXYsICJjYW4ndCBzZXQgb3V0cHV0IGRpcmVjdGlvbiBmb3IgZ3BpbyAiCi0JCQkJIiMlZDogJWRcbiIsIGksIHJldCk7Ci0JCQlnb3RvIGVycl9sb29wOwotCQl9Ci0JfQotCi0JcGRhdGEtPm1heF9jaGlwc2VsZWN0ID0gbmdwaW9zOwotCXBkYXRhLT5jc19jb250cm9sID0gZnNsX3NwaV9jc19jb250cm9sOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9sb29wOgotCXdoaWxlIChpID49IDApIHsKLQkJaWYgKGdwaW9faXNfdmFsaWQocGluZm8tPmdwaW9zW2ldKSkKLQkJCWdwaW9fZnJlZShwaW5mby0+Z3Bpb3NbaV0pOwotCQlpLS07Ci0JfQotCi0Ja2ZyZWUocGluZm8tPmFsb3dfZmxhZ3MpOwotCXBpbmZvLT5hbG93X2ZsYWdzID0gTlVMTDsKLWVycl9hbGxvY19mbGFnczoKLQlrZnJlZShwaW5mby0+Z3Bpb3MpOwotCXBpbmZvLT5ncGlvcyA9IE5VTEw7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBvZl9mc2xfc3BpX2ZyZWVfY2hpcHNlbGVjdHMoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtcGM4eHh4X3NwaV9wcm9iZV9pbmZvICpwaW5mbyA9IHRvX29mX3BpbmZvKHBkYXRhKTsKLQlpbnQgaTsKLQotCWlmICghcGluZm8tPmdwaW9zKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bWF4X2NoaXBzZWxlY3Q7IGkrKykgewotCQlpZiAoZ3Bpb19pc192YWxpZChwaW5mby0+Z3Bpb3NbaV0pKQotCQkJZ3Bpb19mcmVlKHBpbmZvLT5ncGlvc1tpXSk7Ci0JfQotCi0Ja2ZyZWUocGluZm8tPmdwaW9zKTsKLQlrZnJlZShwaW5mby0+YWxvd19mbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IG9mX2ZzbF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJm9mZGV2LT5kZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5kZXYub2Zfbm9kZTsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCByZXNvdXJjZSBtZW07Ci0Jc3RydWN0IHJlc291cmNlIGlycTsKLQlpbnQgcmV0ID0gLUVOT01FTTsKLQotCXJldCA9IG9mX21wYzh4eHhfc3BpX3Byb2JlKG9mZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gb2ZfZnNsX3NwaV9nZXRfY2hpcHNlbGVjdHMoZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZtZW0pOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JcmV0ID0gb2ZfaXJxX3RvX3Jlc291cmNlKG5wLCAwLCAmaXJxKTsKLQlpZiAoIXJldCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0KLQltYXN0ZXIgPSBmc2xfc3BpX3Byb2JlKGRldiwgJm1lbSwgaXJxLnN0YXJ0KTsKLQlpZiAoSVNfRVJSKG1hc3RlcikpIHsKLQkJcmV0ID0gUFRSX0VSUihtYXN0ZXIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyOgotCW9mX2ZzbF9zcGlfZnJlZV9jaGlwc2VsZWN0cyhkZXYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IG9mX2ZzbF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBtcGM4eHh4X3NwaV9yZW1vdmUoJm9mZGV2LT5kZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0Jb2ZfZnNsX3NwaV9mcmVlX2NoaXBzZWxlY3RzKCZvZmRldi0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfZnNsX3NwaV9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiZnNsLHNwaSIgfSwKLQl7fQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX2ZzbF9zcGlfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvZl9mc2xfc3BpX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJmc2xfc3BpIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX2ZzbF9zcGlfbWF0Y2gsCi0JfSwKLQkucHJvYmUJCT0gb2ZfZnNsX3NwaV9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG9mX2ZzbF9zcGlfcmVtb3ZlKSwKLX07Ci0KLSNpZmRlZiBDT05GSUdfTVBDODMyeF9SREIKLS8qCi0gKiBYWFggWFhYIFhYWAotICogVGhpcyBpcyAibGVnYWN5IiBwbGF0Zm9ybSBkcml2ZXIsIHdhcyB1c2VkIGJ5IHRoZSBNUEM4MzIzRS1SREIgYm9hcmRzCi0gKiBvbmx5LiBUaGUgZHJpdmVyIHNob3VsZCBnbyBhd2F5IHNvb24sIHNpbmNlIG5ld2VyIE1QQzgzMjNFLVJEQidzIGRldmljZQotICogdHJlZSBjYW4gd29yayB3aXRoIE9wZW5GaXJtd2FyZSBkcml2ZXIuIEJ1dCBmb3Igbm93IHdlIHN1cHBvcnQgb2xkIHRyZWVzCi0gKiBhcyB3ZWxsLgotICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwbGF0X21wYzh4eHhfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHJlc291cmNlICptZW07Ci0JaW50IGlycTsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCi0JaWYgKCFwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghbWVtKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGlycSA8PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1hc3RlciA9IGZzbF9zcGlfcHJvYmUoJnBkZXYtPmRldiwgbWVtLCBpcnEpOwotCWlmIChJU19FUlIobWFzdGVyKSkKLQkJcmV0dXJuIFBUUl9FUlIobWFzdGVyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgcGxhdF9tcGM4eHh4X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gbXBjOHh4eF9zcGlfcmVtb3ZlKCZwZGV2LT5kZXYpOwotfQotCi1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOm1wYzh4eHhfc3BpIik7Ci1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtcGM4eHh4X3NwaV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gcGxhdF9tcGM4eHh4X3NwaV9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AocGxhdF9tcGM4eHh4X3NwaV9yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1wYzh4eHhfc3BpIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBib29sIGxlZ2FjeV9kcml2ZXJfZmFpbGVkOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbGVnYWN5X2RyaXZlcl9yZWdpc3Rlcih2b2lkKQotewotCWxlZ2FjeV9kcml2ZXJfZmFpbGVkID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtcGM4eHh4X3NwaV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbGVnYWN5X2RyaXZlcl91bnJlZ2lzdGVyKHZvaWQpCi17Ci0JaWYgKGxlZ2FjeV9kcml2ZXJfZmFpbGVkKQotCQlyZXR1cm47Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1wYzh4eHhfc3BpX2RyaXZlcik7Ci19Ci0jZWxzZQotc3RhdGljIHZvaWQgX19pbml0IGxlZ2FjeV9kcml2ZXJfcmVnaXN0ZXIodm9pZCkge30KLXN0YXRpYyB2b2lkIF9fZXhpdCBsZWdhY3lfZHJpdmVyX3VucmVnaXN0ZXIodm9pZCkge30KLSNlbmRpZiAvKiBDT05GSUdfTVBDODMyeF9SREIgKi8KLQotc3RhdGljIGludCBfX2luaXQgZnNsX3NwaV9pbml0KHZvaWQpCi17Ci0JbGVnYWN5X2RyaXZlcl9yZWdpc3RlcigpOwotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9mX2ZzbF9zcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KGZzbF9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmc2xfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb2ZfZnNsX3NwaV9kcml2ZXIpOwotCWxlZ2FjeV9kcml2ZXJfdW5yZWdpc3RlcigpOwotfQotbW9kdWxlX2V4aXQoZnNsX3NwaV9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiS3VtYXIgR2FsYSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTaW1wbGUgRnJlZXNjYWxlIFNQSSBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9ncGlvLmMgYi9kcml2ZXJzL3NwaS9zcGlfZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2U1MWIwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3BpL3NwaV9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLyoKLSAqIHNwaV9ncGlvLmMgLSBTUEkgbWFzdGVyIGRyaXZlciB1c2luZyBnZW5lcmljIGJpdGJhbmdlZCBHUElPCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2LDIwMDggRGF2aWQgQnJvd25lbGwKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaV9ncGlvLmg+Ci0KLQotLyoKLSAqIFRoaXMgYml0YmFuZ2luZyBTUEkgbWFzdGVyIGRyaXZlciBzaG91bGQgaGVscCBtYWtlIHN5c3RlbXMgdXNhYmxlCi0gKiB3aGVuIGEgbmF0aXZlIGhhcmR3YXJlIFNQSSBlbmdpbmUgaXMgbm90IGF2YWlsYWJsZSwgcGVyaGFwcyBiZWNhdXNlCi0gKiBpdHMgZHJpdmVyIGlzbid0IHlldCB3b3JraW5nIG9yIGJlY2F1c2UgdGhlIEkvTyBwaW5zIGl0IHJlcXVpcmVzCi0gKiBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMuCi0gKgotICogcGxhdGZvcm1fZGV2aWNlLT5kcml2ZXJfZGF0YSAuLi4gcG9pbnRzIHRvIHNwaV9ncGlvCi0gKgotICogc3BpLT5jb250cm9sbGVyX3N0YXRlIC4uLiByZXNlcnZlZCBmb3IgYml0YmFuZyBmcmFtZXdvcmsgY29kZQotICogc3BpLT5jb250cm9sbGVyX2RhdGEgLi4uIGhvbGRzIGNoaXBzZWxlY3QgR1BJTwotICoKLSAqIHNwaS0+bWFzdGVyLT5kZXYuZHJpdmVyX2RhdGEgLi4uIHBvaW50cyB0byBzcGlfZ3Bpby0+Yml0YmFuZwotICovCi0KLXN0cnVjdCBzcGlfZ3BpbyB7Ci0Jc3RydWN0IHNwaV9iaXRiYW5nCQliaXRiYW5nOwotCXN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhCXBkYXRhOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OwotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIEJlY2F1c2UgdGhlIG92ZXJoZWFkIG9mIGdvaW5nIHRocm91Z2ggZm91ciBHUElPIHByb2NlZHVyZSBjYWxscwotICogcGVyIHRyYW5zZmVycmVkIGJpdCBjYW4gbWFrZSBwZXJmb3JtYW5jZSBhIHByb2JsZW0sIHRoaXMgY29kZQotICogaXMgc2V0IHVwIHNvIHRoYXQgeW91IGNhbiB1c2UgaXQgaW4gZWl0aGVyIG9mIHR3byB3YXlzOgotICoKLSAqICAgLSBUaGUgc2xvdyBnZW5lcmljIHdheTogIHNldCB1cCBwbGF0Zm9ybV9kYXRhIHRvIGhvbGQgdGhlIEdQSU8KLSAqICAgICBudW1iZXJzIHVzZWQgZm9yIE1JU08vTU9TSS9TQ0ssIGFuZCBpc3N1ZSBwcm9jZWR1cmUgY2FsbHMgZm9yCi0gKiAgICAgZWFjaCBvZiB0aGVtLiAgVGhpcyBkcml2ZXIgY2FuIGhhbmRsZSBzZXZlcmFsIHN1Y2ggYnVzc2VzLgotICoKLSAqICAgLSBUaGUgcXVpY2tlciBpbmxpbmVkIHdheTogIG9ubHkgaGVscHMgd2l0aCBwbGF0Zm9ybSBHUElPIGNvZGUKLSAqICAgICB0aGF0IGlubGluZXMgb3BlcmF0aW9ucyBmb3IgY29uc3RhbnQgR1BJT3MuICBUaGlzIGNhbiBnaXZlCi0gKiAgICAgeW91IHRpZ2h0IChmYXN0ISkgaW5uZXIgbG9vcHMsIGJ1dCBlYWNoIHN1Y2ggYnVzIG5lZWRzIGEKLSAqICAgICBuZXcgZHJpdmVyLiAgWW91J2xsIGRlZmluZSBhIG5ldyBDIGZpbGUsIHdpdGggTWFrZWZpbGUgYW5kCi0gKiAgICAgS2NvbmZpZyBzdXBwb3J0OyB0aGUgQyBjb2RlIGNhbiBiZSBhIHRvdGFsIG9mIHNpeCBsaW5lczoKLSAqCi0gKgkJI2RlZmluZSBEUklWRVJfTkFNRQkibXlib2FyZF9zcGkyIgotICoJCSNkZWZpbmUJU1BJX01JU09fR1BJTwkxMTkKLSAqCQkjZGVmaW5lCVNQSV9NT1NJX0dQSU8JMTIwCi0gKgkJI2RlZmluZQlTUElfU0NLX0dQSU8JMTIxCi0gKgkJI2RlZmluZQlTUElfTl9DSElQU0VMCTQKLSAqCQkjaW5jbHVkZSAic3BpX2dwaW8uYyIKLSAqLwotCi0jaWZuZGVmIERSSVZFUl9OQU1FCi0jZGVmaW5lIERSSVZFUl9OQU1FCSJzcGlfZ3BpbyIKLQotI2RlZmluZSBHRU5FUklDX0JJVEJBTkcJLyogdnMgdGlnaHQgaW5saW5lcyAqLwotCi0vKiBhbGwgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIHRoZXNlIHN5bWJvbHMgbXVzdCBkZWZpbmUgcGRhdGEgKi8KLSNkZWZpbmUgU1BJX01JU09fR1BJTwkoKHBkYXRhKS0+bWlzbykKLSNkZWZpbmUgU1BJX01PU0lfR1BJTwkoKHBkYXRhKS0+bW9zaSkKLSNkZWZpbmUgU1BJX1NDS19HUElPCSgocGRhdGEpLT5zY2spCi0KLSNkZWZpbmUgU1BJX05fQ0hJUFNFTAkoKHBkYXRhKS0+bnVtX2NoaXBzZWxlY3QpCi0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhICogX19wdXJlCi1zcGlfdG9fcGRhdGEoY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQljb25zdCBzdHJ1Y3Qgc3BpX2JpdGJhbmcJKmJhbmc7Ci0JY29uc3Qgc3RydWN0IHNwaV9ncGlvCQkqc3BpX2dwaW87Ci0KLQliYW5nID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3BpX2dwaW8gPSBjb250YWluZXJfb2YoYmFuZywgc3RydWN0IHNwaV9ncGlvLCBiaXRiYW5nKTsKLQlyZXR1cm4gJnNwaV9ncGlvLT5wZGF0YTsKLX0KLQotLyogdGhpcyBpcyAjZGVmaW5lZCB0byBhdm9pZCB1bnVzZWQtdmFyaWFibGUgd2FybmluZ3Mgd2hlbiBpbmxpbmluZyAqLwotI2RlZmluZSBwZGF0YQkJc3BpX3RvX3BkYXRhKHNwaSkKLQotc3RhdGljIGlubGluZSB2b2lkIHNldHNjayhjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCi17Ci0JZ3Bpb19zZXRfdmFsdWUoU1BJX1NDS19HUElPLCBpc19vbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRtb3NpKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19vbikKLXsKLQlncGlvX3NldF92YWx1ZShTUElfTU9TSV9HUElPLCBpc19vbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdldG1pc28oY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlyZXR1cm4gISFncGlvX2dldF92YWx1ZShTUElfTUlTT19HUElPKTsKLX0KLQotI3VuZGVmIHBkYXRhCi0KLS8qCi0gKiBOT1RFOiAgdGhpcyBjbG9ja3MgImFzIGZhc3QgYXMgd2UgY2FuIi4gIEl0ICJzaG91bGQiIGJlIGEgZnVuY3Rpb24gb2YgdGhlCi0gKiByZXF1ZXN0ZWQgZGV2aWNlIGNsb2NrLiAgU29mdHdhcmUgb3ZlcmhlYWQgbWVhbnMgd2UgdXN1YWxseSBoYXZlIHRyb3VibGUKLSAqIHJlYWNoaW5nIGV2ZW4gb25lIE1iaXQvc2VjIChleGNlcHQgd2hlbiB3ZSBjYW4gaW5saW5lIGJpdG9wcyksIHNvIGZvciBub3cKLSAqIHdlJ2xsIGp1c3QgYXNzdW1lIHdlIG5ldmVyIG5lZWQgYWRkaXRpb25hbCBwZXItYml0IHNsb3dkb3ducy4KLSAqLwotI2RlZmluZSBzcGlkZWxheShuc2VjcykJZG8ge30gd2hpbGUgKDApCi0KLSNpbmNsdWRlICJzcGlfYml0YmFuZ190eHJ4LmgiCi0KLS8qCi0gKiBUaGVzZSBmdW5jdGlvbnMgY2FuIGxldmVyYWdlIGlubGluZSBleHBhbnNpb24gb2YgR1BJTyBjYWxscyB0byBzaHJpbmsKLSAqIGNvc3RzIGZvciBhIHR4cnggYml0LCBvZnRlbiBieSBmYWN0b3JzIG9mIGFyb3VuZCB0ZW4gKGJ5IGluc3RydWN0aW9uCi0gKiBjb3VudCkuICBUaGF0IGlzIHBhcnRpY3VsYXJseSB2aXNpYmxlIGZvciBsYXJnZXIgd29yZCBzaXplcywgYnV0IGhlbHBzCi0gKiBldmVuIHdpdGggZGVmYXVsdCA4LWJpdCB3b3Jkcy4KLSAqCi0gKiBSRVZJU0lUIG92ZXJoZWFkcyBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyBmb3IgZWFjaCB3b3JkIGFsc28gaGF2ZQotICogc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgY29zdHMuICBIYXZpbmcgdHhyeF9idWZzKCkgY2FsbHMgdGhhdCBpbmxpbmUKLSAqIHRoZSB0eHJ4X3dvcmQoKSBsb2dpYyB3b3VsZCBoZWxwIHBlcmZvcm1hbmNlLCBlLmcuIG9uIGxhcmdlciBibG9ja3MKLSAqIHVzZWQgd2l0aCBmbGFzaCBzdG9yYWdlIG9yIE1NQy9TRC4gIFRoZXJlIHNob3VsZCBhbHNvIGJlIHdheXMgdG8gbWFrZQotICogR0NDIGJlIGxlc3Mgc3R1cGlkIGFib3V0IHJlbG9hZGluZyByZWdpc3RlcnMgaW5zaWRlIHRoZSBJL08gbG9vcHMsCi0gKiBldmVuIHdpdGhvdXQgaW5saW5lZCBHUElPIGNhbGxzOyBfX2F0dHJpYnV0ZV9fKChob3QpKSBvbiBHQ0MgNC4zPwotICovCi0KLXN0YXRpYyB1MzIgc3BpX2dwaW9fdHhyeF93b3JkX21vZGUwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKLXsKLQlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIDAsIHdvcmQsIGJpdHMpOwotfQotCi1zdGF0aWMgdTMyIHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQl1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCi17Ci0JcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMShzcGksIG5zZWNzLCAwLCAwLCB3b3JkLCBiaXRzKTsKLX0KLQotc3RhdGljIHUzMiBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQotewotCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMSwgMCwgd29yZCwgYml0cyk7Ci19Ci0KLXN0YXRpYyB1MzIgc3BpX2dwaW9fdHhyeF93b3JkX21vZGUzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKLXsKLQlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGExKHNwaSwgbnNlY3MsIDEsIDAsIHdvcmQsIGJpdHMpOwotfQotCi0vKgotICogVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBjYWxsIHNldG1vc2kgb3IgZ2V0bWlzbyBpZiByZXNwZWN0aXZlIGZsYWcKLSAqIChTUElfTUFTVEVSX05PX1JYIG9yIFNQSV9NQVNURVJfTk9fVFgpIGlzIHNldCwgc28gdGhleSBhcmUgc2FmZSB0bwotICogY2FsbCB3aGVuIHN1Y2ggcGluIGlzIG5vdCBwcmVzZW50IG9yIGRlZmluZWQgaW4gdGhlIGNvbnRyb2xsZXIuCi0gKiBBIHNlcGFyYXRlIHNldCBvZiBjYWxsYmFja3MgaXMgZGVmaW5lZCB0byBnZXQgaGlnaGVzdCBwb3NzaWJsZQotICogc3BlZWQgaW4gdGhlIGdlbmVyaWMgY2FzZSAod2hlbiBib3RoIE1JU08gYW5kIE1PU0kgbGluZXMgYXJlCi0gKiBhdmFpbGFibGUpLCBhcyBvcHRpbWlzZXIgd2lsbCByZW1vdmUgdGhlIGNoZWNrcyB3aGVuIGFyZ3VtZW50IGlzCi0gKiBjb25zdGFudC4KLSAqLwotCi1zdGF0aWMgdTMyIHNwaV9ncGlvX3NwZWNfdHhyeF93b3JkX21vZGUwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKLXsKLQl1bnNpZ25lZCBmbGFncyA9IHNwaS0+bWFzdGVyLT5mbGFnczsKLQlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIGZsYWdzLCB3b3JkLCBiaXRzKTsKLX0KLQotc3RhdGljIHUzMiBzcGlfZ3Bpb19zcGVjX3R4cnhfd29yZF9tb2RlMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQl1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCi17Ci0JdW5zaWduZWQgZmxhZ3MgPSBzcGktPm1hc3Rlci0+ZmxhZ3M7Ci0JcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMShzcGksIG5zZWNzLCAwLCBmbGFncywgd29yZCwgYml0cyk7Ci19Ci0KLXN0YXRpYyB1MzIgc3BpX2dwaW9fc3BlY190eHJ4X3dvcmRfbW9kZTIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQotewotCXVuc2lnbmVkIGZsYWdzID0gc3BpLT5tYXN0ZXItPmZsYWdzOwotCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMSwgZmxhZ3MsIHdvcmQsIGJpdHMpOwotfQotCi1zdGF0aWMgdTMyIHNwaV9ncGlvX3NwZWNfdHhyeF93b3JkX21vZGUzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKLXsKLQl1bnNpZ25lZCBmbGFncyA9IHNwaS0+bWFzdGVyLT5mbGFnczsKLQlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGExKHNwaSwgbnNlY3MsIDEsIGZsYWdzLCB3b3JkLCBiaXRzKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgc3BpX2dwaW9fY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfYWN0aXZlKQotewotCXVuc2lnbmVkIGxvbmcgY3MgPSAodW5zaWduZWQgbG9uZykgc3BpLT5jb250cm9sbGVyX2RhdGE7Ci0KLQkvKiBzZXQgaW5pdGlhbCBjbG9jayBwb2xhcml0eSAqLwotCWlmIChpc19hY3RpdmUpCi0JCXNldHNjayhzcGksIHNwaS0+bW9kZSAmIFNQSV9DUE9MKTsKLQotCWlmIChjcyAhPSBTUElfR1BJT19OT19DSElQU0VMRUNUKSB7Ci0JCS8qIFNQSSBpcyBub3JtYWxseSBhY3RpdmUtbG93ICovCi0JCWdwaW9fc2V0X3ZhbHVlKGNzLCAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpID8gaXNfYWN0aXZlIDogIWlzX2FjdGl2ZSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHNwaV9ncGlvX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0JdW5zaWduZWQgbG9uZwljcyA9ICh1bnNpZ25lZCBsb25nKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKLQlpbnQJCXN0YXR1cyA9IDA7Ci0KLQlpZiAoc3BpLT5iaXRzX3Blcl93b3JkID4gMzIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFzcGktPmNvbnRyb2xsZXJfc3RhdGUpIHsKLQkJaWYgKGNzICE9IFNQSV9HUElPX05PX0NISVBTRUxFQ1QpIHsKLQkJCXN0YXR1cyA9IGdwaW9fcmVxdWVzdChjcywgZGV2X25hbWUoJnNwaS0+ZGV2KSk7Ci0JCQlpZiAoc3RhdHVzKQotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQlzdGF0dXMgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoY3MsIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKTsKLQkJfQotCX0KLQlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gc3BpX2JpdGJhbmdfc2V0dXAoc3BpKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCWlmICghc3BpLT5jb250cm9sbGVyX3N0YXRlICYmIGNzICE9IFNQSV9HUElPX05PX0NISVBTRUxFQ1QpCi0JCQlncGlvX2ZyZWUoY3MpOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBzcGlfZ3Bpb19jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0JdW5zaWduZWQgbG9uZwljcyA9ICh1bnNpZ25lZCBsb25nKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKLQotCWlmIChjcyAhPSBTUElfR1BJT19OT19DSElQU0VMRUNUKQotCQlncGlvX2ZyZWUoY3MpOwotCXNwaV9iaXRiYW5nX2NsZWFudXAoc3BpKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9fYWxsb2ModW5zaWduZWQgcGluLCBjb25zdCBjaGFyICpsYWJlbCwgYm9vbCBpc19pbikKLXsKLQlpbnQgdmFsdWU7Ci0KLQl2YWx1ZSA9IGdwaW9fcmVxdWVzdChwaW4sIGxhYmVsKTsKLQlpZiAodmFsdWUgPT0gMCkgewotCQlpZiAoaXNfaW4pCi0JCQl2YWx1ZSA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KHBpbik7Ci0JCWVsc2UKLQkJCXZhbHVlID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBpbiwgMCk7Ci0JfQotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludCBfX2luaXQKLXNwaV9ncGlvX3JlcXVlc3Qoc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhLCBjb25zdCBjaGFyICpsYWJlbCwKLQl1MTYgKnJlc19mbGFncykKLXsKLQlpbnQgdmFsdWU7Ci0KLQkvKiBOT1RFOiAgU1BJXypfR1BJTyBzeW1ib2xzIG1heSByZWZlcmVuY2UgInBkYXRhIiAqLwotCi0JaWYgKFNQSV9NT1NJX0dQSU8gIT0gU1BJX0dQSU9fTk9fTU9TSSkgewotCQl2YWx1ZSA9IHNwaV9ncGlvX2FsbG9jKFNQSV9NT1NJX0dQSU8sIGxhYmVsLCBmYWxzZSk7Ci0JCWlmICh2YWx1ZSkKLQkJCWdvdG8gZG9uZTsKLQl9IGVsc2UgewotCQkvKiBIVyBjb25maWd1cmF0aW9uIHdpdGhvdXQgTU9TSSBwaW4gKi8KLQkJKnJlc19mbGFncyB8PSBTUElfTUFTVEVSX05PX1RYOwotCX0KLQotCWlmIChTUElfTUlTT19HUElPICE9IFNQSV9HUElPX05PX01JU08pIHsKLQkJdmFsdWUgPSBzcGlfZ3Bpb19hbGxvYyhTUElfTUlTT19HUElPLCBsYWJlbCwgdHJ1ZSk7Ci0JCWlmICh2YWx1ZSkKLQkJCWdvdG8gZnJlZV9tb3NpOwotCX0gZWxzZSB7Ci0JCS8qIEhXIGNvbmZpZ3VyYXRpb24gd2l0aG91dCBNSVNPIHBpbiAqLwotCQkqcmVzX2ZsYWdzIHw9IFNQSV9NQVNURVJfTk9fUlg7Ci0JfQotCi0JdmFsdWUgPSBzcGlfZ3Bpb19hbGxvYyhTUElfU0NLX0dQSU8sIGxhYmVsLCBmYWxzZSk7Ci0JaWYgKHZhbHVlKQotCQlnb3RvIGZyZWVfbWlzbzsKLQotCWdvdG8gZG9uZTsKLQotZnJlZV9taXNvOgotCWlmIChTUElfTUlTT19HUElPICE9IFNQSV9HUElPX05PX01JU08pCi0JCWdwaW9fZnJlZShTUElfTUlTT19HUElPKTsKLWZyZWVfbW9zaToKLQlpZiAoU1BJX01PU0lfR1BJTyAhPSBTUElfR1BJT19OT19NT1NJKQotCQlncGlvX2ZyZWUoU1BJX01PU0lfR1BJTyk7Ci1kb25lOgotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQJCQkJc3RhdHVzOwotCXN0cnVjdCBzcGlfbWFzdGVyCQkqbWFzdGVyOwotCXN0cnVjdCBzcGlfZ3BpbwkJCSpzcGlfZ3BpbzsKLQlzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YQkqcGRhdGE7Ci0JdTE2IG1hc3Rlcl9mbGFncyA9IDA7Ci0KLQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotI2lmZGVmIEdFTkVSSUNfQklUQkFORwotCWlmICghcGRhdGEgfHwgIXBkYXRhLT5udW1fY2hpcHNlbGVjdCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0jZW5kaWYKLQotCXN0YXR1cyA9IHNwaV9ncGlvX3JlcXVlc3QocGRhdGEsIGRldl9uYW1lKCZwZGV2LT5kZXYpLCAmbWFzdGVyX2ZsYWdzKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mICpzcGlfZ3Bpbyk7Ci0JaWYgKCFtYXN0ZXIpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBncGlvX2ZyZWU7Ci0JfQotCXNwaV9ncGlvID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNwaV9ncGlvKTsKLQotCXNwaV9ncGlvLT5wZGV2ID0gcGRldjsKLQlpZiAocGRhdGEpCi0JCXNwaV9ncGlvLT5wZGF0YSA9ICpwZGF0YTsKLQotCW1hc3Rlci0+ZmxhZ3MgPSBtYXN0ZXJfZmxhZ3M7Ci0JbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7Ci0JbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IFNQSV9OX0NISVBTRUw7Ci0JbWFzdGVyLT5zZXR1cCA9IHNwaV9ncGlvX3NldHVwOwotCW1hc3Rlci0+Y2xlYW51cCA9IHNwaV9ncGlvX2NsZWFudXA7Ci0KLQlzcGlfZ3Bpby0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOwotCXNwaV9ncGlvLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBzcGlfZ3Bpb19jaGlwc2VsZWN0OwotCi0JaWYgKChtYXN0ZXJfZmxhZ3MgJiAoU1BJX01BU1RFUl9OT19UWCB8IFNQSV9NQVNURVJfTk9fUlgpKSA9PSAwKSB7Ci0JCXNwaV9ncGlvLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8wXSA9IHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMDsKLQkJc3BpX2dwaW8tPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzFdID0gc3BpX2dwaW9fdHhyeF93b3JkX21vZGUxOwotCQlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMl0gPSBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTI7Ci0JCXNwaV9ncGlvLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8zXSA9IHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMzsKLQl9IGVsc2UgewotCQlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBzcGlfZ3Bpb19zcGVjX3R4cnhfd29yZF9tb2RlMDsKLQkJc3BpX2dwaW8tPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzFdID0gc3BpX2dwaW9fc3BlY190eHJ4X3dvcmRfbW9kZTE7Ci0JCXNwaV9ncGlvLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8yXSA9IHNwaV9ncGlvX3NwZWNfdHhyeF93b3JkX21vZGUyOwotCQlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfM10gPSBzcGlfZ3Bpb19zcGVjX3R4cnhfd29yZF9tb2RlMzsKLQl9Ci0Jc3BpX2dwaW8tPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlcjsKLQlzcGlfZ3Bpby0+Yml0YmFuZy5mbGFncyA9IFNQSV9DU19ISUdIOwotCi0Jc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RhcnQoJnNwaV9ncGlvLT5iaXRiYW5nKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlzcGlfbWFzdGVyX3B1dChzcGlfZ3Bpby0+Yml0YmFuZy5tYXN0ZXIpOwotZ3Bpb19mcmVlOgotCQlpZiAoU1BJX01JU09fR1BJTyAhPSBTUElfR1BJT19OT19NSVNPKQotCQkJZ3Bpb19mcmVlKFNQSV9NSVNPX0dQSU8pOwotCQlpZiAoU1BJX01PU0lfR1BJTyAhPSBTUElfR1BJT19OT19NT1NJKQotCQkJZ3Bpb19mcmVlKFNQSV9NT1NJX0dQSU8pOwotCQlncGlvX2ZyZWUoU1BJX1NDS19HUElPKTsKLQkJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCBzcGlfZ3Bpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc3BpX2dwaW8JCQkqc3BpX2dwaW87Ci0Jc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEJKnBkYXRhOwotCWludAkJCQlzdGF0dXM7Ci0KLQlzcGlfZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQkvKiBzdG9wKCkgdW5yZWdpc3RlcnMgY2hpbGQgZGV2aWNlcyB0b28gKi8KLQlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdG9wKCZzcGlfZ3Bpby0+Yml0YmFuZyk7Ci0Jc3BpX21hc3Rlcl9wdXQoc3BpX2dwaW8tPmJpdGJhbmcubWFzdGVyKTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCi0JaWYgKFNQSV9NSVNPX0dQSU8gIT0gU1BJX0dQSU9fTk9fTUlTTykKLQkJZ3Bpb19mcmVlKFNQSV9NSVNPX0dQSU8pOwotCWlmIChTUElfTU9TSV9HUElPICE9IFNQSV9HUElPX05PX01PU0kpCi0JCWdwaW9fZnJlZShTUElfTU9TSV9HUElPKTsKLQlncGlvX2ZyZWUoU1BJX1NDS19HUElPKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLU1PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUklWRVJfTkFNRSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwaV9ncGlvX2RyaXZlciA9IHsKLQkuZHJpdmVyLm5hbWUJPSBEUklWRVJfTkFNRSwKLQkuZHJpdmVyLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JLnJlbW92ZQkJPSBfX2V4aXRfcChzcGlfZ3Bpb19yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnNwaV9ncGlvX2RyaXZlciwgc3BpX2dwaW9fcHJvYmUpOwotfQotbW9kdWxlX2luaXQoc3BpX2dwaW9faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzcGlfZ3Bpb19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwaV9ncGlvX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChzcGlfZ3Bpb19leGl0KTsKLQotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNQSSBtYXN0ZXIgZHJpdmVyIHVzaW5nIGdlbmVyaWMgYml0YmFuZ2VkIEdQSU8gIik7Ci1NT0RVTEVfQVVUSE9SKCJEYXZpZCBCcm93bmVsbCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2lteC5jIGIvZHJpdmVycy9zcGkvc3BpX2lteC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWQ2ZGJhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3BpL3NwaV9pbXguYworKysgL2Rldi9udWxsCkBAIC0xLDk0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEp1ZXJnZW4gQmVpc2VydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgotICogQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jaW5jbHVkZSA8bWFjaC9zcGkuaD4KLQotI2RlZmluZSBEUklWRVJfTkFNRSAic3BpX2lteCIKLQotI2RlZmluZSBNWENfQ1NQSVJYREFUQQkJMHgwMAotI2RlZmluZSBNWENfQ1NQSVRYREFUQQkJMHgwNAotI2RlZmluZSBNWENfQ1NQSUNUUkwJCTB4MDgKLSNkZWZpbmUgTVhDX0NTUElJTlQJCTB4MGMKLSNkZWZpbmUgTVhDX1JFU0VUCQkweDFjCi0KLSNkZWZpbmUgTVgzX0NTUElTVEFUCQkweDE0Ci0jZGVmaW5lIE1YM19DU1BJU1RBVF9SUgkJKDEgPDwgMykKLQotLyogZ2VuZXJpYyBkZWZpbmVzIHRvIGFic3RyYWN0IGZyb20gdGhlIGRpZmZlcmVudCByZWdpc3RlciBsYXlvdXRzICovCi0jZGVmaW5lIE1YQ19JTlRfUlIJKDEgPDwgMCkgLyogUmVjZWl2ZSBkYXRhIHJlYWR5IGludGVycnVwdCAqLwotI2RlZmluZSBNWENfSU5UX1RFCSgxIDw8IDEpIC8qIFRyYW5zbWl0IEZJRk8gZW1wdHkgaW50ZXJydXB0ICovCi0KLXN0cnVjdCBzcGlfaW14X2NvbmZpZyB7Ci0JdW5zaWduZWQgaW50IHNwZWVkX2h6OwotCXVuc2lnbmVkIGludCBicHc7Ci0JdW5zaWduZWQgaW50IG1vZGU7Ci0JdTggY3M7Ci19OwotCi1lbnVtIHNwaV9pbXhfZGV2dHlwZSB7Ci0JU1BJX0lNWF9WRVJfSU1YMSwKLQlTUElfSU1YX1ZFUl8wXzAsCi0JU1BJX0lNWF9WRVJfMF80LAotCVNQSV9JTVhfVkVSXzBfNSwKLQlTUElfSU1YX1ZFUl8wXzcsCi0JU1BJX0lNWF9WRVJfMl8zLAotfTsKLQotc3RydWN0IHNwaV9pbXhfZGF0YTsKLQotc3RydWN0IHNwaV9pbXhfZGV2dHlwZV9kYXRhIHsKLQl2b2lkICgqaW50Y3RybCkoc3RydWN0IHNwaV9pbXhfZGF0YSAqLCBpbnQpOwotCWludCAoKmNvbmZpZykoc3RydWN0IHNwaV9pbXhfZGF0YSAqLCBzdHJ1Y3Qgc3BpX2lteF9jb25maWcgKik7Ci0Jdm9pZCAoKnRyaWdnZXIpKHN0cnVjdCBzcGlfaW14X2RhdGEgKik7Ci0JaW50ICgqcnhfYXZhaWxhYmxlKShzdHJ1Y3Qgc3BpX2lteF9kYXRhICopOwotCXZvaWQgKCpyZXNldCkoc3RydWN0IHNwaV9pbXhfZGF0YSAqKTsKLQl1bnNpZ25lZCBpbnQgZmlmb3NpemU7Ci19OwotCi1zdHJ1Y3Qgc3BpX2lteF9kYXRhIHsKLQlzdHJ1Y3Qgc3BpX2JpdGJhbmcgYml0YmFuZzsKLQotCXN0cnVjdCBjb21wbGV0aW9uIHhmZXJfZG9uZTsKLQl2b2lkICpiYXNlOwotCWludCBpcnE7Ci0Jc3RydWN0IGNsayAqY2xrOwotCXVuc2lnbmVkIGxvbmcgc3BpX2NsazsKLQlpbnQgKmNoaXBzZWxlY3Q7Ci0KLQl1bnNpZ25lZCBpbnQgY291bnQ7Ci0Jdm9pZCAoKnR4KShzdHJ1Y3Qgc3BpX2lteF9kYXRhICopOwotCXZvaWQgKCpyeCkoc3RydWN0IHNwaV9pbXhfZGF0YSAqKTsKLQl2b2lkICpyeF9idWY7Ci0JY29uc3Qgdm9pZCAqdHhfYnVmOwotCXVuc2lnbmVkIGludCB0eGZpZm87IC8qIG51bWJlciBvZiB3b3JkcyBwdXNoZWQgaW4gdHggRklGTyAqLwotCi0Jc3RydWN0IHNwaV9pbXhfZGV2dHlwZV9kYXRhIGRldnR5cGVfZGF0YTsKLX07Ci0KLSNkZWZpbmUgTVhDX1NQSV9CVUZfUlgodHlwZSkJCQkJCQlcCi1zdGF0aWMgdm9pZCBzcGlfaW14X2J1Zl9yeF8jI3R5cGUoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkJCVwKLXsJCQkJCQkJCQlcCi0JdW5zaWduZWQgaW50IHZhbCA9IHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSVJYREFUQSk7CVwKLQkJCQkJCQkJCVwKLQlpZiAoc3BpX2lteC0+cnhfYnVmKSB7CQkJCQkJXAotCQkqKHR5cGUgKilzcGlfaW14LT5yeF9idWYgPSB2YWw7CQkJCVwKLQkJc3BpX2lteC0+cnhfYnVmICs9IHNpemVvZih0eXBlKTsJCQlcCi0JfQkJCQkJCQkJXAotfQotCi0jZGVmaW5lIE1YQ19TUElfQlVGX1RYKHR5cGUpCQkJCQkJXAotc3RhdGljIHZvaWQgc3BpX2lteF9idWZfdHhfIyN0eXBlKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCQlcCi17CQkJCQkJCQkJXAotCXR5cGUgdmFsID0gMDsJCQkJCQkJXAotCQkJCQkJCQkJXAotCWlmIChzcGlfaW14LT50eF9idWYpIHsJCQkJCQlcCi0JCXZhbCA9ICoodHlwZSAqKXNwaV9pbXgtPnR4X2J1ZjsJCQkJXAotCQlzcGlfaW14LT50eF9idWYgKz0gc2l6ZW9mKHR5cGUpOwkJCVwKLQl9CQkJCQkJCQlcCi0JCQkJCQkJCQlcCi0Jc3BpX2lteC0+Y291bnQgLT0gc2l6ZW9mKHR5cGUpOwkJCQkJXAotCQkJCQkJCQkJXAotCXdyaXRlbCh2YWwsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSVRYREFUQSk7CQkJXAotfQotCi1NWENfU1BJX0JVRl9SWCh1OCkKLU1YQ19TUElfQlVGX1RYKHU4KQotTVhDX1NQSV9CVUZfUlgodTE2KQotTVhDX1NQSV9CVUZfVFgodTE2KQotTVhDX1NQSV9CVUZfUlgodTMyKQotTVhDX1NQSV9CVUZfVFgodTMyKQotCi0vKiBGaXJzdCBlbnRyeSBpcyByZXNlcnZlZCwgc2Vjb25kIGVudHJ5IGlzIHZhbGlkIG9ubHkgaWYgU0RIQ19TUElFTiBpcyBzZXQKLSAqICh3aGljaCBpcyBjdXJyZW50bHkgbm90IHRoZSBjYXNlIGluIHRoaXMgZHJpdmVyKQotICovCi1zdGF0aWMgaW50IG14Y19jbGtkaXZzW10gPSB7MCwgMywgNCwgNiwgOCwgMTIsIDE2LCAyNCwgMzIsIDQ4LCA2NCwgOTYsIDEyOCwgMTkyLAotCTI1NiwgMzg0LCA1MTIsIDc2OCwgMTAyNH07Ci0KLS8qIE1YMjEsIE1YMjcgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3BpX2lteF9jbGtkaXZfMSh1bnNpZ25lZCBpbnQgZmluLAotCQl1bnNpZ25lZCBpbnQgZnNwaSkKLXsKLQlpbnQgaSwgbWF4OwotCi0JaWYgKGNwdV9pc19teDIxKCkpCi0JCW1heCA9IDE4OwotCWVsc2UKLQkJbWF4ID0gMTY7Ci0KLQlmb3IgKGkgPSAyOyBpIDwgbWF4OyBpKyspCi0JCWlmIChmc3BpICogbXhjX2Nsa2RpdnNbaV0gPj0gZmluKQotCQkJcmV0dXJuIGk7Ci0KLQlyZXR1cm4gbWF4OwotfQotCi0vKiBNWDEsIE1YMzEsIE1YMzUsIE1YNTEgQ1NQSSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBzcGlfaW14X2Nsa2Rpdl8yKHVuc2lnbmVkIGludCBmaW4sCi0JCXVuc2lnbmVkIGludCBmc3BpKQotewotCWludCBpLCBkaXYgPSA0OwotCi0JZm9yIChpID0gMDsgaSA8IDc7IGkrKykgewotCQlpZiAoZnNwaSAqIGRpdiA+PSBmaW4pCi0JCQlyZXR1cm4gaTsKLQkJZGl2IDw8PSAxOwotCX0KLQotCXJldHVybiA3OwotfQotCi0jZGVmaW5lIFNQSV9JTVgyXzNfQ1RSTAkJMHgwOAotI2RlZmluZSBTUElfSU1YMl8zX0NUUkxfRU5BQkxFCQkoMSA8PCAgMCkKLSNkZWZpbmUgU1BJX0lNWDJfM19DVFJMX1hDSAkJKDEgPDwgIDIpCi0jZGVmaW5lIFNQSV9JTVgyXzNfQ1RSTF9NT0RFX01BU0sJKDB4ZiA8PCA0KQotI2RlZmluZSBTUElfSU1YMl8zX0NUUkxfUE9TVERJVl9PRkZTRVQJOAotI2RlZmluZSBTUElfSU1YMl8zX0NUUkxfUFJFRElWX09GRlNFVAkxMgotI2RlZmluZSBTUElfSU1YMl8zX0NUUkxfQ1MoY3MpCQkoKGNzKSA8PCAxOCkKLSNkZWZpbmUgU1BJX0lNWDJfM19DVFJMX0JMX09GRlNFVAkyMAotCi0jZGVmaW5lIFNQSV9JTVgyXzNfQ09ORklHCTB4MGMKLSNkZWZpbmUgU1BJX0lNWDJfM19DT05GSUdfU0NMS1BIQShjcykJKDEgPDwgKChjcykgKyAgMCkpCi0jZGVmaW5lIFNQSV9JTVgyXzNfQ09ORklHX1NDTEtQT0woY3MpCSgxIDw8ICgoY3MpICsgIDQpKQotI2RlZmluZSBTUElfSU1YMl8zX0NPTkZJR19TQkJDVFJMKGNzKQkoMSA8PCAoKGNzKSArICA4KSkKLSNkZWZpbmUgU1BJX0lNWDJfM19DT05GSUdfU1NCUE9MKGNzKQkoMSA8PCAoKGNzKSArIDEyKSkKLQotI2RlZmluZSBTUElfSU1YMl8zX0lOVAkJMHgxMAotI2RlZmluZSBTUElfSU1YMl8zX0lOVF9URUVOCQkoMSA8PCAgMCkKLSNkZWZpbmUgU1BJX0lNWDJfM19JTlRfUlJFTgkJKDEgPDwgIDMpCi0KLSNkZWZpbmUgU1BJX0lNWDJfM19TVEFUCQkweDE4Ci0jZGVmaW5lIFNQSV9JTVgyXzNfU1RBVF9SUgkJKDEgPDwgIDMpCi0KLS8qIE1YNTEgZUNTUEkgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3BpX2lteDJfM19jbGtkaXYodW5zaWduZWQgaW50IGZpbiwgdW5zaWduZWQgaW50IGZzcGkpCi17Ci0JLyoKLQkgKiB0aGVyZSBhcmUgdHdvIDQtYml0IGRpdmlkZXJzLCB0aGUgcHJlLWRpdmlkZXIgZGl2aWRlcyBieQotCSAqICRwcmUsIHRoZSBwb3N0LWRpdmlkZXIgYnkgMl4kcG9zdAotCSAqLwotCXVuc2lnbmVkIGludCBwcmUsIHBvc3Q7Ci0KLQlpZiAodW5saWtlbHkoZnNwaSA+IGZpbikpCi0JCXJldHVybiAwOwotCi0JcG9zdCA9IGZscyhmaW4pIC0gZmxzKGZzcGkpOwotCWlmIChmaW4gPiBmc3BpIDw8IHBvc3QpCi0JCXBvc3QrKzsKLQotCS8qIG5vdyB3ZSBoYXZlOiAoZmluIDw9IGZzcGkgPDwgcG9zdCkgd2l0aCBwb3N0IGJlaW5nIG1pbmltYWwgKi8KLQotCXBvc3QgPSBtYXgoNFUsIHBvc3QpIC0gNDsKLQlpZiAodW5saWtlbHkocG9zdCA+IDB4ZikpIHsKLQkJcHJfZXJyKCIlczogY2Fubm90IHNldCBjbG9jayBmcmVxOiAldSAoYmFzZSBmcmVxOiAldSlcbiIsCi0JCQkJX19mdW5jX18sIGZzcGksIGZpbik7Ci0JCXJldHVybiAweGZmOwotCX0KLQotCXByZSA9IERJVl9ST1VORF9VUChmaW4sIGZzcGkgPDwgcG9zdCkgLSAxOwotCi0JcHJfZGVidWcoIiVzOiBmaW46ICV1LCBmc3BpOiAldSwgcG9zdDogJXUsIHByZTogJXVcbiIsCi0JCQlfX2Z1bmNfXywgZmluLCBmc3BpLCBwb3N0LCBwcmUpOwotCXJldHVybiAocHJlIDw8IFNQSV9JTVgyXzNfQ1RSTF9QUkVESVZfT0ZGU0VUKSB8Ci0JCShwb3N0IDw8IFNQSV9JTVgyXzNfQ1RSTF9QT1NURElWX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIHNwaV9pbXgyXzNfaW50Y3RybChzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14LCBpbnQgZW5hYmxlKQotewotCXVuc2lnbmVkIHZhbCA9IDA7Ci0KLQlpZiAoZW5hYmxlICYgTVhDX0lOVF9URSkKLQkJdmFsIHw9IFNQSV9JTVgyXzNfSU5UX1RFRU47Ci0KLQlpZiAoZW5hYmxlICYgTVhDX0lOVF9SUikKLQkJdmFsIHw9IFNQSV9JTVgyXzNfSU5UX1JSRU47Ci0KLQl3cml0ZWwodmFsLCBzcGlfaW14LT5iYXNlICsgU1BJX0lNWDJfM19JTlQpOwotfQotCi1zdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBzcGlfaW14Ml8zX3RyaWdnZXIoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkKLXsKLQl1MzIgcmVnOwotCi0JcmVnID0gcmVhZGwoc3BpX2lteC0+YmFzZSArIFNQSV9JTVgyXzNfQ1RSTCk7Ci0JcmVnIHw9IFNQSV9JTVgyXzNfQ1RSTF9YQ0g7Ci0Jd3JpdGVsKHJlZywgc3BpX2lteC0+YmFzZSArIFNQSV9JTVgyXzNfQ1RSTCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgc3BpX2lteDJfM19jb25maWcoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCwKLQkJc3RydWN0IHNwaV9pbXhfY29uZmlnICpjb25maWcpCi17Ci0JdTMyIGN0cmwgPSBTUElfSU1YMl8zX0NUUkxfRU5BQkxFLCBjZmcgPSAwOwotCi0JLyoKLQkgKiBUaGUgaGFyZHdhcmUgc2VlbXMgdG8gaGF2ZSBhIHJhY2UgY29uZGl0aW9uIHdoZW4gY2hhbmdpbmcgbW9kZXMuIFRoZQotCSAqIGN1cnJlbnQgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBzZWxlY3Rpb24gb2YgdGhlIGNoYW5uZWwgYXJyaXZlcwotCSAqIGVhcmxpZXIgaW4gdGhlIGhhcmR3YXJlIHRoYW4gdGhlIG1vZGUgYml0cyB3aGVuIHRoZXkgYXJlIHdyaXR0ZW4gYXQKLQkgKiB0aGUgc2FtZSB0aW1lLgotCSAqIFNvIHNldCBtYXN0ZXIgbW9kZSBmb3IgYWxsIGNoYW5uZWxzIGFzIHdlIGRvIG5vdCBzdXBwb3J0IHNsYXZlIG1vZGUuCi0JICovCi0JY3RybCB8PSBTUElfSU1YMl8zX0NUUkxfTU9ERV9NQVNLOwotCi0JLyogc2V0IGNsb2NrIHNwZWVkICovCi0JY3RybCB8PSBzcGlfaW14Ml8zX2Nsa2RpdihzcGlfaW14LT5zcGlfY2xrLCBjb25maWctPnNwZWVkX2h6KTsKLQotCS8qIHNldCBjaGlwIHNlbGVjdCB0byB1c2UgKi8KLQljdHJsIHw9IFNQSV9JTVgyXzNfQ1RSTF9DUyhjb25maWctPmNzKTsKLQotCWN0cmwgfD0gKGNvbmZpZy0+YnB3IC0gMSkgPDwgU1BJX0lNWDJfM19DVFJMX0JMX09GRlNFVDsKLQotCWNmZyB8PSBTUElfSU1YMl8zX0NPTkZJR19TQkJDVFJMKGNvbmZpZy0+Y3MpOwotCi0JaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUEhBKQotCQljZmcgfD0gU1BJX0lNWDJfM19DT05GSUdfU0NMS1BIQShjb25maWctPmNzKTsKLQotCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1BPTCkKLQkJY2ZnIHw9IFNQSV9JTVgyXzNfQ09ORklHX1NDTEtQT0woY29uZmlnLT5jcyk7Ci0KLQlpZiAoY29uZmlnLT5tb2RlICYgU1BJX0NTX0hJR0gpCi0JCWNmZyB8PSBTUElfSU1YMl8zX0NPTkZJR19TU0JQT0woY29uZmlnLT5jcyk7Ci0KLQl3cml0ZWwoY3RybCwgc3BpX2lteC0+YmFzZSArIFNQSV9JTVgyXzNfQ1RSTCk7Ci0Jd3JpdGVsKGNmZywgc3BpX2lteC0+YmFzZSArIFNQSV9JTVgyXzNfQ09ORklHKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHNwaV9pbXgyXzNfcnhfYXZhaWxhYmxlKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCi17Ci0JcmV0dXJuIHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBTUElfSU1YMl8zX1NUQVQpICYgU1BJX0lNWDJfM19TVEFUX1JSOwotfQotCi1zdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBzcGlfaW14Ml8zX3Jlc2V0KHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCi17Ci0JLyogZHJhaW4gcmVjZWl2ZSBidWZmZXIgKi8KLQl3aGlsZSAoc3BpX2lteDJfM19yeF9hdmFpbGFibGUoc3BpX2lteCkpCi0JCXJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSVJYREFUQSk7Ci19Ci0KLSNkZWZpbmUgTVgzMV9JTlRSRUdfVEVFTgkoMSA8PCAwKQotI2RlZmluZSBNWDMxX0lOVFJFR19SUkVOCSgxIDw8IDMpCi0KLSNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9FTkFCTEUJKDEgPDwgMCkKLSNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9NQVNURVIJKDEgPDwgMSkKLSNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9YQ0gJKDEgPDwgMikKLSNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9QT0wJKDEgPDwgNCkKLSNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9QSEEJKDEgPDwgNSkKLSNkZWZpbmUgTVgzMV9DU1BJQ1RSTF9TU0NUTAkoMSA8PCA2KQotI2RlZmluZSBNWDMxX0NTUElDVFJMX1NTUE9MCSgxIDw8IDcpCi0jZGVmaW5lIE1YMzFfQ1NQSUNUUkxfQkNfU0hJRlQJOAotI2RlZmluZSBNWDM1X0NTUElDVFJMX0JMX1NISUZUCTIwCi0jZGVmaW5lIE1YMzFfQ1NQSUNUUkxfQ1NfU0hJRlQJMjQKLSNkZWZpbmUgTVgzNV9DU1BJQ1RSTF9DU19TSElGVAkxMgotI2RlZmluZSBNWDMxX0NTUElDVFJMX0RSX1NISUZUCTE2Ci0KLSNkZWZpbmUgTVgzMV9DU1BJU1RBVFVTCQkweDE0Ci0jZGVmaW5lIE1YMzFfU1RBVFVTX1JSCQkoMSA8PCAzKQotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYWxzbyB3b3JrIGZvciB0aGUgaS5NWDM1LCBidXQgYmUgYXdhcmUgdGhhdAotICogdGhlIGkuTVgzNSBoYXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgcmVnaXN0ZXIgbGF5b3V0IGZvciBiaXRzCi0gKiB3ZSBkbyBub3QgdXNlIGhlcmUuCi0gKi8KLXN0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIG14MzFfaW50Y3RybChzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14LCBpbnQgZW5hYmxlKQotewotCXVuc2lnbmVkIGludCB2YWwgPSAwOwotCi0JaWYgKGVuYWJsZSAmIE1YQ19JTlRfVEUpCi0JCXZhbCB8PSBNWDMxX0lOVFJFR19URUVOOwotCWlmIChlbmFibGUgJiBNWENfSU5UX1JSKQotCQl2YWwgfD0gTVgzMV9JTlRSRUdfUlJFTjsKLQotCXdyaXRlbCh2YWwsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUlOVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIG14MzFfdHJpZ2dlcihzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14KQotewotCXVuc2lnbmVkIGludCByZWc7Ci0KLQlyZWcgPSByZWFkbChzcGlfaW14LT5iYXNlICsgTVhDX0NTUElDVFJMKTsKLQlyZWcgfD0gTVgzMV9DU1BJQ1RSTF9YQ0g7Ci0Jd3JpdGVsKHJlZywgc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgc3BpX2lteDBfNF9jb25maWcoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCwKLQkJc3RydWN0IHNwaV9pbXhfY29uZmlnICpjb25maWcpCi17Ci0JdW5zaWduZWQgaW50IHJlZyA9IE1YMzFfQ1NQSUNUUkxfRU5BQkxFIHwgTVgzMV9DU1BJQ1RSTF9NQVNURVI7Ci0JaW50IGNzID0gc3BpX2lteC0+Y2hpcHNlbGVjdFtjb25maWctPmNzXTsKLQotCXJlZyB8PSBzcGlfaW14X2Nsa2Rpdl8yKHNwaV9pbXgtPnNwaV9jbGssIGNvbmZpZy0+c3BlZWRfaHopIDw8Ci0JCU1YMzFfQ1NQSUNUUkxfRFJfU0hJRlQ7Ci0KLQlyZWcgfD0gKGNvbmZpZy0+YnB3IC0gMSkgPDwgTVgzMV9DU1BJQ1RSTF9CQ19TSElGVDsKLQotCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1BIQSkKLQkJcmVnIHw9IE1YMzFfQ1NQSUNUUkxfUEhBOwotCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1BPTCkKLQkJcmVnIHw9IE1YMzFfQ1NQSUNUUkxfUE9MOwotCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1NfSElHSCkKLQkJcmVnIHw9IE1YMzFfQ1NQSUNUUkxfU1NQT0w7Ci0JaWYgKGNzIDwgMCkKLQkJcmVnIHw9IChjcyArIDMyKSA8PCBNWDMxX0NTUElDVFJMX0NTX1NISUZUOwotCi0Jd3JpdGVsKHJlZywgc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX21heWJlX3VudXNlZCBzcGlfaW14MF83X2NvbmZpZyhzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14LAotCQlzdHJ1Y3Qgc3BpX2lteF9jb25maWcgKmNvbmZpZykKLXsKLQl1bnNpZ25lZCBpbnQgcmVnID0gTVgzMV9DU1BJQ1RSTF9FTkFCTEUgfCBNWDMxX0NTUElDVFJMX01BU1RFUjsKLQlpbnQgY3MgPSBzcGlfaW14LT5jaGlwc2VsZWN0W2NvbmZpZy0+Y3NdOwotCi0JcmVnIHw9IHNwaV9pbXhfY2xrZGl2XzIoc3BpX2lteC0+c3BpX2NsaywgY29uZmlnLT5zcGVlZF9oeikgPDwKLQkJTVgzMV9DU1BJQ1RSTF9EUl9TSElGVDsKLQotCXJlZyB8PSAoY29uZmlnLT5icHcgLSAxKSA8PCBNWDM1X0NTUElDVFJMX0JMX1NISUZUOwotCXJlZyB8PSBNWDMxX0NTUElDVFJMX1NTQ1RMOwotCi0JaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUEhBKQotCQlyZWcgfD0gTVgzMV9DU1BJQ1RSTF9QSEE7Ci0JaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUE9MKQotCQlyZWcgfD0gTVgzMV9DU1BJQ1RSTF9QT0w7Ci0JaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DU19ISUdIKQotCQlyZWcgfD0gTVgzMV9DU1BJQ1RSTF9TU1BPTDsKLQlpZiAoY3MgPCAwKQotCQlyZWcgfD0gKGNzICsgMzIpIDw8IE1YMzVfQ1NQSUNUUkxfQ1NfU0hJRlQ7Ci0KLQl3cml0ZWwocmVnLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElDVFJMKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIG14MzFfcnhfYXZhaWxhYmxlKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCi17Ci0JcmV0dXJuIHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWDMxX0NTUElTVEFUVVMpICYgTVgzMV9TVEFUVVNfUlI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIHNwaV9pbXgwXzRfcmVzZXQoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkKLXsKLQkvKiBkcmFpbiByZWNlaXZlIGJ1ZmZlciAqLwotCXdoaWxlIChyZWFkbChzcGlfaW14LT5iYXNlICsgTVgzX0NTUElTVEFUKSAmIE1YM19DU1BJU1RBVF9SUikKLQkJcmVhZGwoc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJUlhEQVRBKTsKLX0KLQotI2RlZmluZSBNWDI3X0lOVFJFR19SUgkJKDEgPDwgNCkKLSNkZWZpbmUgTVgyN19JTlRSRUdfVEVFTgkoMSA8PCA5KQotI2RlZmluZSBNWDI3X0lOVFJFR19SUkVOCSgxIDw8IDEzKQotCi0jZGVmaW5lIE1YMjdfQ1NQSUNUUkxfUE9MCSgxIDw8IDUpCi0jZGVmaW5lIE1YMjdfQ1NQSUNUUkxfUEhBCSgxIDw8IDYpCi0jZGVmaW5lIE1YMjdfQ1NQSUNUUkxfU1NQT0wJKDEgPDwgOCkKLSNkZWZpbmUgTVgyN19DU1BJQ1RSTF9YQ0gJKDEgPDwgOSkKLSNkZWZpbmUgTVgyN19DU1BJQ1RSTF9FTkFCTEUJKDEgPDwgMTApCi0jZGVmaW5lIE1YMjdfQ1NQSUNUUkxfTUFTVEVSCSgxIDw8IDExKQotI2RlZmluZSBNWDI3X0NTUElDVFJMX0RSX1NISUZUCTE0Ci0jZGVmaW5lIE1YMjdfQ1NQSUNUUkxfQ1NfU0hJRlQJMTkKLQotc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgbXgyN19pbnRjdHJsKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgsIGludCBlbmFibGUpCi17Ci0JdW5zaWduZWQgaW50IHZhbCA9IDA7Ci0KLQlpZiAoZW5hYmxlICYgTVhDX0lOVF9URSkKLQkJdmFsIHw9IE1YMjdfSU5UUkVHX1RFRU47Ci0JaWYgKGVuYWJsZSAmIE1YQ19JTlRfUlIpCi0JCXZhbCB8PSBNWDI3X0lOVFJFR19SUkVOOwotCi0Jd3JpdGVsKHZhbCwgc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJSU5UKTsKLX0KLQotc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgbXgyN190cmlnZ2VyKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCi17Ci0JdW5zaWduZWQgaW50IHJlZzsKLQotCXJlZyA9IHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOwotCXJlZyB8PSBNWDI3X0NTUElDVFJMX1hDSDsKLQl3cml0ZWwocmVnLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElDVFJMKTsKLX0KLQotc3RhdGljIGludCBfX21heWJlX3VudXNlZCBteDI3X2NvbmZpZyhzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14LAotCQlzdHJ1Y3Qgc3BpX2lteF9jb25maWcgKmNvbmZpZykKLXsKLQl1bnNpZ25lZCBpbnQgcmVnID0gTVgyN19DU1BJQ1RSTF9FTkFCTEUgfCBNWDI3X0NTUElDVFJMX01BU1RFUjsKLQlpbnQgY3MgPSBzcGlfaW14LT5jaGlwc2VsZWN0W2NvbmZpZy0+Y3NdOwotCi0JcmVnIHw9IHNwaV9pbXhfY2xrZGl2XzEoc3BpX2lteC0+c3BpX2NsaywgY29uZmlnLT5zcGVlZF9oeikgPDwKLQkJTVgyN19DU1BJQ1RSTF9EUl9TSElGVDsKLQlyZWcgfD0gY29uZmlnLT5icHcgLSAxOwotCi0JaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUEhBKQotCQlyZWcgfD0gTVgyN19DU1BJQ1RSTF9QSEE7Ci0JaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUE9MKQotCQlyZWcgfD0gTVgyN19DU1BJQ1RSTF9QT0w7Ci0JaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DU19ISUdIKQotCQlyZWcgfD0gTVgyN19DU1BJQ1RSTF9TU1BPTDsKLQlpZiAoY3MgPCAwKQotCQlyZWcgfD0gKGNzICsgMzIpIDw8IE1YMjdfQ1NQSUNUUkxfQ1NfU0hJRlQ7Ci0KLQl3cml0ZWwocmVnLCBzcGlfaW14LT5iYXNlICsgTVhDX0NTUElDVFJMKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIG14MjdfcnhfYXZhaWxhYmxlKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCi17Ci0JcmV0dXJuIHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUlOVCkgJiBNWDI3X0lOVFJFR19SUjsKLX0KLQotc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgc3BpX2lteDBfMF9yZXNldChzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14KQotewotCXdyaXRlbCgxLCBzcGlfaW14LT5iYXNlICsgTVhDX1JFU0VUKTsKLX0KLQotI2RlZmluZSBNWDFfSU5UUkVHX1JSCQkoMSA8PCAzKQotI2RlZmluZSBNWDFfSU5UUkVHX1RFRU4JCSgxIDw8IDgpCi0jZGVmaW5lIE1YMV9JTlRSRUdfUlJFTgkJKDEgPDwgMTEpCi0KLSNkZWZpbmUgTVgxX0NTUElDVFJMX1BPTAkoMSA8PCA0KQotI2RlZmluZSBNWDFfQ1NQSUNUUkxfUEhBCSgxIDw8IDUpCi0jZGVmaW5lIE1YMV9DU1BJQ1RSTF9YQ0gJKDEgPDwgOCkKLSNkZWZpbmUgTVgxX0NTUElDVFJMX0VOQUJMRQkoMSA8PCA5KQotI2RlZmluZSBNWDFfQ1NQSUNUUkxfTUFTVEVSCSgxIDw8IDEwKQotI2RlZmluZSBNWDFfQ1NQSUNUUkxfRFJfU0hJRlQJMTMKLQotc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgbXgxX2ludGN0cmwoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCwgaW50IGVuYWJsZSkKLXsKLQl1bnNpZ25lZCBpbnQgdmFsID0gMDsKLQotCWlmIChlbmFibGUgJiBNWENfSU5UX1RFKQotCQl2YWwgfD0gTVgxX0lOVFJFR19URUVOOwotCWlmIChlbmFibGUgJiBNWENfSU5UX1JSKQotCQl2YWwgfD0gTVgxX0lOVFJFR19SUkVOOwotCi0Jd3JpdGVsKHZhbCwgc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJSU5UKTsKLX0KLQotc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgbXgxX3RyaWdnZXIoc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCkKLXsKLQl1bnNpZ25lZCBpbnQgcmVnOwotCi0JcmVnID0gcmVhZGwoc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7Ci0JcmVnIHw9IE1YMV9DU1BJQ1RSTF9YQ0g7Ci0Jd3JpdGVsKHJlZywgc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJQ1RSTCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbXgxX2NvbmZpZyhzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14LAotCQlzdHJ1Y3Qgc3BpX2lteF9jb25maWcgKmNvbmZpZykKLXsKLQl1bnNpZ25lZCBpbnQgcmVnID0gTVgxX0NTUElDVFJMX0VOQUJMRSB8IE1YMV9DU1BJQ1RSTF9NQVNURVI7Ci0KLQlyZWcgfD0gc3BpX2lteF9jbGtkaXZfMihzcGlfaW14LT5zcGlfY2xrLCBjb25maWctPnNwZWVkX2h6KSA8PAotCQlNWDFfQ1NQSUNUUkxfRFJfU0hJRlQ7Ci0JcmVnIHw9IGNvbmZpZy0+YnB3IC0gMTsKLQotCWlmIChjb25maWctPm1vZGUgJiBTUElfQ1BIQSkKLQkJcmVnIHw9IE1YMV9DU1BJQ1RSTF9QSEE7Ci0JaWYgKGNvbmZpZy0+bW9kZSAmIFNQSV9DUE9MKQotCQlyZWcgfD0gTVgxX0NTUElDVFJMX1BPTDsKLQotCXdyaXRlbChyZWcsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbXgxX3J4X2F2YWlsYWJsZShzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14KQotewotCXJldHVybiByZWFkbChzcGlfaW14LT5iYXNlICsgTVhDX0NTUElJTlQpICYgTVgxX0lOVFJFR19SUjsKLX0KLQotc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgbXgxX3Jlc2V0KHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCi17Ci0Jd3JpdGVsKDEsIHNwaV9pbXgtPmJhc2UgKyBNWENfUkVTRVQpOwotfQotCi0vKgotICogVGhlc2UgdmVyc2lvbiBudW1iZXJzIGFyZSB0YWtlbiBmcm9tIHRoZSBGcmVlc2NhbGUgZHJpdmVyLiAgVW5mb3J0dW5hdGVseSBpdAotICogZG9lc24ndCBzdXBwb3J0IGkuTVgxLCBzbyB0aGlzIGVudHJ5IGRvZXNuJ3QgbWF0Y2ggdGhlIHNjaGVtZS4gOi0oCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2lteF9kZXZ0eXBlX2RhdGEgc3BpX2lteF9kZXZ0eXBlX2RhdGFbXSBfX2RldmluaXRkYXRhID0gewotI2lmZGVmIENPTkZJR19TUElfSU1YX1ZFUl9JTVgxCi0JW1NQSV9JTVhfVkVSX0lNWDFdID0gewotCQkuaW50Y3RybCA9IG14MV9pbnRjdHJsLAotCQkuY29uZmlnID0gbXgxX2NvbmZpZywKLQkJLnRyaWdnZXIgPSBteDFfdHJpZ2dlciwKLQkJLnJ4X2F2YWlsYWJsZSA9IG14MV9yeF9hdmFpbGFibGUsCi0JCS5yZXNldCA9IG14MV9yZXNldCwKLQkJLmZpZm9zaXplID0gOCwKLQl9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NQSV9JTVhfVkVSXzBfMAotCVtTUElfSU1YX1ZFUl8wXzBdID0gewotCQkuaW50Y3RybCA9IG14MjdfaW50Y3RybCwKLQkJLmNvbmZpZyA9IG14MjdfY29uZmlnLAotCQkudHJpZ2dlciA9IG14MjdfdHJpZ2dlciwKLQkJLnJ4X2F2YWlsYWJsZSA9IG14MjdfcnhfYXZhaWxhYmxlLAotCQkucmVzZXQgPSBzcGlfaW14MF8wX3Jlc2V0LAotCQkuZmlmb3NpemUgPSA4LAotCX0sCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU1BJX0lNWF9WRVJfMF80Ci0JW1NQSV9JTVhfVkVSXzBfNF0gPSB7Ci0JCS5pbnRjdHJsID0gbXgzMV9pbnRjdHJsLAotCQkuY29uZmlnID0gc3BpX2lteDBfNF9jb25maWcsCi0JCS50cmlnZ2VyID0gbXgzMV90cmlnZ2VyLAotCQkucnhfYXZhaWxhYmxlID0gbXgzMV9yeF9hdmFpbGFibGUsCi0JCS5yZXNldCA9IHNwaV9pbXgwXzRfcmVzZXQsCi0JCS5maWZvc2l6ZSA9IDgsCi0JfSwKLSNlbmRpZgotI2lmZGVmIENPTkZJR19TUElfSU1YX1ZFUl8wXzcKLQlbU1BJX0lNWF9WRVJfMF83XSA9IHsKLQkJLmludGN0cmwgPSBteDMxX2ludGN0cmwsCi0JCS5jb25maWcgPSBzcGlfaW14MF83X2NvbmZpZywKLQkJLnRyaWdnZXIgPSBteDMxX3RyaWdnZXIsCi0JCS5yeF9hdmFpbGFibGUgPSBteDMxX3J4X2F2YWlsYWJsZSwKLQkJLnJlc2V0ID0gc3BpX2lteDBfNF9yZXNldCwKLQkJLmZpZm9zaXplID0gOCwKLQl9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NQSV9JTVhfVkVSXzJfMwotCVtTUElfSU1YX1ZFUl8yXzNdID0gewotCQkuaW50Y3RybCA9IHNwaV9pbXgyXzNfaW50Y3RybCwKLQkJLmNvbmZpZyA9IHNwaV9pbXgyXzNfY29uZmlnLAotCQkudHJpZ2dlciA9IHNwaV9pbXgyXzNfdHJpZ2dlciwKLQkJLnJ4X2F2YWlsYWJsZSA9IHNwaV9pbXgyXzNfcnhfYXZhaWxhYmxlLAotCQkucmVzZXQgPSBzcGlfaW14Ml8zX3Jlc2V0LAotCQkuZmlmb3NpemUgPSA2NCwKLQl9LAotI2VuZGlmCi19OwotCi1zdGF0aWMgdm9pZCBzcGlfaW14X2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX2FjdGl2ZSkKLXsKLQlzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JaW50IGdwaW8gPSBzcGlfaW14LT5jaGlwc2VsZWN0W3NwaS0+Y2hpcF9zZWxlY3RdOwotCWludCBhY3RpdmUgPSBpc19hY3RpdmUgIT0gQklUQkFOR19DU19JTkFDVElWRTsKLQlpbnQgZGV2X2lzX2xvd2FjdGl2ZSA9ICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpOwotCi0JaWYgKGdwaW8gPCAwKQotCQlyZXR1cm47Ci0KLQlncGlvX3NldF92YWx1ZShncGlvLCBkZXZfaXNfbG93YWN0aXZlIF4gYWN0aXZlKTsKLX0KLQotc3RhdGljIHZvaWQgc3BpX2lteF9wdXNoKHN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXgpCi17Ci0Jd2hpbGUgKHNwaV9pbXgtPnR4ZmlmbyA8IHNwaV9pbXgtPmRldnR5cGVfZGF0YS5maWZvc2l6ZSkgewotCQlpZiAoIXNwaV9pbXgtPmNvdW50KQotCQkJYnJlYWs7Ci0JCXNwaV9pbXgtPnR4KHNwaV9pbXgpOwotCQlzcGlfaW14LT50eGZpZm8rKzsKLQl9Ci0KLQlzcGlfaW14LT5kZXZ0eXBlX2RhdGEudHJpZ2dlcihzcGlfaW14KTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHNwaV9pbXhfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14ID0gZGV2X2lkOwotCi0Jd2hpbGUgKHNwaV9pbXgtPmRldnR5cGVfZGF0YS5yeF9hdmFpbGFibGUoc3BpX2lteCkpIHsKLQkJc3BpX2lteC0+cngoc3BpX2lteCk7Ci0JCXNwaV9pbXgtPnR4Zmlmby0tOwotCX0KLQotCWlmIChzcGlfaW14LT5jb3VudCkgewotCQlzcGlfaW14X3B1c2goc3BpX2lteCk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAoc3BpX2lteC0+dHhmaWZvKSB7Ci0JCS8qIE5vIGRhdGEgbGVmdCB0byBwdXNoLCBidXQgc3RpbGwgd2FpdGluZyBmb3IgcnggZGF0YSwKLQkJICogZW5hYmxlIHJlY2VpdmUgZGF0YSBhdmFpbGFibGUgaW50ZXJydXB0LgotCQkgKi8KLQkJc3BpX2lteC0+ZGV2dHlwZV9kYXRhLmludGN0cmwoCi0JCQkJc3BpX2lteCwgTVhDX0lOVF9SUik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlzcGlfaW14LT5kZXZ0eXBlX2RhdGEuaW50Y3RybChzcGlfaW14LCAwKTsKLQljb21wbGV0ZSgmc3BpX2lteC0+eGZlcl9kb25lKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBzcGlfaW14X3NldHVweGZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXggPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlzdHJ1Y3Qgc3BpX2lteF9jb25maWcgY29uZmlnOwotCi0JY29uZmlnLmJwdyA9IHQgPyB0LT5iaXRzX3Blcl93b3JkIDogc3BpLT5iaXRzX3Blcl93b3JkOwotCWNvbmZpZy5zcGVlZF9oeiAgPSB0ID8gdC0+c3BlZWRfaHogOiBzcGktPm1heF9zcGVlZF9oejsKLQljb25maWcubW9kZSA9IHNwaS0+bW9kZTsKLQljb25maWcuY3MgPSBzcGktPmNoaXBfc2VsZWN0OwotCi0JaWYgKCFjb25maWcuc3BlZWRfaHopCi0JCWNvbmZpZy5zcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6OwotCWlmICghY29uZmlnLmJwdykKLQkJY29uZmlnLmJwdyA9IHNwaS0+Yml0c19wZXJfd29yZDsKLQlpZiAoIWNvbmZpZy5zcGVlZF9oeikKLQkJY29uZmlnLnNwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBmdW5jdGlvbnMgZm9yIHRyYW5zZmVyICovCi0JaWYgKGNvbmZpZy5icHcgPD0gOCkgewotCQlzcGlfaW14LT5yeCA9IHNwaV9pbXhfYnVmX3J4X3U4OwotCQlzcGlfaW14LT50eCA9IHNwaV9pbXhfYnVmX3R4X3U4OwotCX0gZWxzZSBpZiAoY29uZmlnLmJwdyA8PSAxNikgewotCQlzcGlfaW14LT5yeCA9IHNwaV9pbXhfYnVmX3J4X3UxNjsKLQkJc3BpX2lteC0+dHggPSBzcGlfaW14X2J1Zl90eF91MTY7Ci0JfSBlbHNlIGlmIChjb25maWcuYnB3IDw9IDMyKSB7Ci0JCXNwaV9pbXgtPnJ4ID0gc3BpX2lteF9idWZfcnhfdTMyOwotCQlzcGlfaW14LT50eCA9IHNwaV9pbXhfYnVmX3R4X3UzMjsKLQl9IGVsc2UKLQkJQlVHKCk7Ci0KLQlzcGlfaW14LT5kZXZ0eXBlX2RhdGEuY29uZmlnKHNwaV9pbXgsICZjb25maWcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3BpX2lteF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zZmVyKQotewotCXN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXggPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQotCXNwaV9pbXgtPnR4X2J1ZiA9IHRyYW5zZmVyLT50eF9idWY7Ci0Jc3BpX2lteC0+cnhfYnVmID0gdHJhbnNmZXItPnJ4X2J1ZjsKLQlzcGlfaW14LT5jb3VudCA9IHRyYW5zZmVyLT5sZW47Ci0Jc3BpX2lteC0+dHhmaWZvID0gMDsKLQotCWluaXRfY29tcGxldGlvbigmc3BpX2lteC0+eGZlcl9kb25lKTsKLQotCXNwaV9pbXhfcHVzaChzcGlfaW14KTsKLQotCXNwaV9pbXgtPmRldnR5cGVfZGF0YS5pbnRjdHJsKHNwaV9pbXgsIE1YQ19JTlRfVEUpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmc3BpX2lteC0+eGZlcl9kb25lKTsKLQotCXJldHVybiB0cmFuc2Zlci0+bGVuOwotfQotCi1zdGF0aWMgaW50IHNwaV9pbXhfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgc3BpX2lteF9kYXRhICpzcGlfaW14ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JaW50IGdwaW8gPSBzcGlfaW14LT5jaGlwc2VsZWN0W3NwaS0+Y2hpcF9zZWxlY3RdOwotCi0JZGV2X2RiZygmc3BpLT5kZXYsICIlczogbW9kZSAlZCwgJXUgYnB3LCAlZCBoelxuIiwgX19mdW5jX18sCi0JCSBzcGktPm1vZGUsIHNwaS0+Yml0c19wZXJfd29yZCwgc3BpLT5tYXhfc3BlZWRfaHopOwotCi0JaWYgKGdwaW8gPj0gMCkKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIID8gMCA6IDEpOwotCi0Jc3BpX2lteF9jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19JTkFDVElWRSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3BpX2lteF9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHNwaV9pbXhfZGV2dHlwZVtdID0gewotCXsKLQkJLm5hbWUgPSAiaW14MS1jc3BpIiwKLQkJLmRyaXZlcl9kYXRhID0gU1BJX0lNWF9WRVJfSU1YMSwKLQl9LCB7Ci0JCS5uYW1lID0gImlteDIxLWNzcGkiLAotCQkuZHJpdmVyX2RhdGEgPSBTUElfSU1YX1ZFUl8wXzAsCi0JfSwgewotCQkubmFtZSA9ICJpbXgyNS1jc3BpIiwKLQkJLmRyaXZlcl9kYXRhID0gU1BJX0lNWF9WRVJfMF83LAotCX0sIHsKLQkJLm5hbWUgPSAiaW14MjctY3NwaSIsCi0JCS5kcml2ZXJfZGF0YSA9IFNQSV9JTVhfVkVSXzBfMCwKLQl9LCB7Ci0JCS5uYW1lID0gImlteDMxLWNzcGkiLAotCQkuZHJpdmVyX2RhdGEgPSBTUElfSU1YX1ZFUl8wXzQsCi0JfSwgewotCQkubmFtZSA9ICJpbXgzNS1jc3BpIiwKLQkJLmRyaXZlcl9kYXRhID0gU1BJX0lNWF9WRVJfMF83LAotCX0sIHsKLQkJLm5hbWUgPSAiaW14NTEtY3NwaSIsCi0JCS5kcml2ZXJfZGF0YSA9IFNQSV9JTVhfVkVSXzBfNywKLQl9LCB7Ci0JCS5uYW1lID0gImlteDUxLWVjc3BpIiwKLQkJLmRyaXZlcl9kYXRhID0gU1BJX0lNWF9WRVJfMl8zLAotCX0sIHsKLQkJLm5hbWUgPSAiaW14NTMtY3NwaSIsCi0JCS5kcml2ZXJfZGF0YSA9IFNQSV9JTVhfVkVSXzBfNywKLQl9LCB7Ci0JCS5uYW1lID0gImlteDUzLWVjc3BpIiwKLQkJLmRyaXZlcl9kYXRhID0gU1BJX0lNWF9WRVJfMl8zLAotCX0sIHsKLQkJLyogc2VudGluZWwgKi8KLQl9Ci19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzcGlfaW14X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNwaV9pbXhfbWFzdGVyICpteGNfcGxhdGZvcm1faW5mbzsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXg7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IGksIHJldDsKLQotCW14Y19wbGF0Zm9ybV9pbmZvID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlpZiAoIW14Y19wbGF0Zm9ybV9pbmZvKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCB0aGUgcGxhdGZvcm0gZGF0YVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBzcGlfaW14X2RhdGEpKTsKLQlpZiAoIW1hc3RlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOwotCi0JbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7Ci0JbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IG14Y19wbGF0Zm9ybV9pbmZvLT5udW1fY2hpcHNlbGVjdDsKLQotCXNwaV9pbXggPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3BpX2lteC0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOwotCXNwaV9pbXgtPmNoaXBzZWxlY3QgPSBteGNfcGxhdGZvcm1faW5mby0+Y2hpcHNlbGVjdDsKLQotCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm51bV9jaGlwc2VsZWN0OyBpKyspIHsKLQkJaWYgKHNwaV9pbXgtPmNoaXBzZWxlY3RbaV0gPCAwKQotCQkJY29udGludWU7Ci0JCXJldCA9IGdwaW9fcmVxdWVzdChzcGlfaW14LT5jaGlwc2VsZWN0W2ldLCBEUklWRVJfTkFNRSk7Ci0JCWlmIChyZXQpIHsKLQkJCXdoaWxlIChpID4gMCkgewotCQkJCWktLTsKLQkJCQlpZiAoc3BpX2lteC0+Y2hpcHNlbGVjdFtpXSA+PSAwKQotCQkJCQlncGlvX2ZyZWUoc3BpX2lteC0+Y2hpcHNlbGVjdFtpXSk7Ci0JCQl9Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgY3MgZ3Bpb3NcbiIpOwotCQkJZ290byBvdXRfbWFzdGVyX3B1dDsKLQkJfQotCX0KLQotCXNwaV9pbXgtPmJpdGJhbmcuY2hpcHNlbGVjdCA9IHNwaV9pbXhfY2hpcHNlbGVjdDsKLQlzcGlfaW14LT5iaXRiYW5nLnNldHVwX3RyYW5zZmVyID0gc3BpX2lteF9zZXR1cHhmZXI7Ci0Jc3BpX2lteC0+Yml0YmFuZy50eHJ4X2J1ZnMgPSBzcGlfaW14X3RyYW5zZmVyOwotCXNwaV9pbXgtPmJpdGJhbmcubWFzdGVyLT5zZXR1cCA9IHNwaV9pbXhfc2V0dXA7Ci0Jc3BpX2lteC0+Yml0YmFuZy5tYXN0ZXItPmNsZWFudXAgPSBzcGlfaW14X2NsZWFudXA7Ci0Jc3BpX2lteC0+Yml0YmFuZy5tYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKLQotCWluaXRfY29tcGxldGlvbigmc3BpX2lteC0+eGZlcl9kb25lKTsKLQotCXNwaV9pbXgtPmRldnR5cGVfZGF0YSA9Ci0JCXNwaV9pbXhfZGV2dHlwZV9kYXRhW3BkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YV07Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBwbGF0Zm9ybSByZXNvdXJjZVxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2dwaW9fZnJlZTsKLQl9Ci0KLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWRcbiIpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0X2dwaW9fZnJlZTsKLQl9Ci0KLQlzcGlfaW14LT5iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghc3BpX2lteC0+YmFzZSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9yZWxlYXNlX21lbTsKLQl9Ci0KLQlzcGlfaW14LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChzcGlfaW14LT5pcnEgPCAwKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X2lvdW5tYXA7Ci0JfQotCi0JcmV0ID0gcmVxdWVzdF9pcnEoc3BpX2lteC0+aXJxLCBzcGlfaW14X2lzciwgMCwgRFJJVkVSX05BTUUsIHNwaV9pbXgpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSVkOiAlZFxuIiwgc3BpX2lteC0+aXJxLCByZXQpOwotCQlnb3RvIG91dF9pb3VubWFwOwotCX0KLQotCXNwaV9pbXgtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7Ci0JaWYgKElTX0VSUihzcGlfaW14LT5jbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgY2xvY2tcbiIpOwotCQlyZXQgPSBQVFJfRVJSKHNwaV9pbXgtPmNsayk7Ci0JCWdvdG8gb3V0X2ZyZWVfaXJxOwotCX0KLQotCWNsa19lbmFibGUoc3BpX2lteC0+Y2xrKTsKLQlzcGlfaW14LT5zcGlfY2xrID0gY2xrX2dldF9yYXRlKHNwaV9pbXgtPmNsayk7Ci0KLQlzcGlfaW14LT5kZXZ0eXBlX2RhdGEucmVzZXQoc3BpX2lteCk7Ci0KLQlzcGlfaW14LT5kZXZ0eXBlX2RhdGEuaW50Y3RybChzcGlfaW14LCAwKTsKLQotCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZzcGlfaW14LT5iaXRiYW5nKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImJpdGJhbmcgc3RhcnQgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0X2Nsa19wdXQ7Ci0JfQotCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgInByb2JlZFxuIik7Ci0KLQlyZXR1cm4gcmV0OwotCi1vdXRfY2xrX3B1dDoKLQljbGtfZGlzYWJsZShzcGlfaW14LT5jbGspOwotCWNsa19wdXQoc3BpX2lteC0+Y2xrKTsKLW91dF9mcmVlX2lycToKLQlmcmVlX2lycShzcGlfaW14LT5pcnEsIHNwaV9pbXgpOwotb3V0X2lvdW5tYXA6Ci0JaW91bm1hcChzcGlfaW14LT5iYXNlKTsKLW91dF9yZWxlYXNlX21lbToKLQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLW91dF9ncGlvX2ZyZWU6Ci0JZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykKLQkJaWYgKHNwaV9pbXgtPmNoaXBzZWxlY3RbaV0gPj0gMCkKLQkJCWdwaW9fZnJlZShzcGlfaW14LT5jaGlwc2VsZWN0W2ldKTsKLW91dF9tYXN0ZXJfcHV0OgotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0Ja2ZyZWUobWFzdGVyKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBzcGlfaW14X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0Jc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlpbnQgaTsKLQotCXNwaV9iaXRiYW5nX3N0b3AoJnNwaV9pbXgtPmJpdGJhbmcpOwotCi0Jd3JpdGVsKDAsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOwotCWNsa19kaXNhYmxlKHNwaV9pbXgtPmNsayk7Ci0JY2xrX3B1dChzcGlfaW14LT5jbGspOwotCWZyZWVfaXJxKHNwaV9pbXgtPmlycSwgc3BpX2lteCk7Ci0JaW91bm1hcChzcGlfaW14LT5iYXNlKTsKLQotCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm51bV9jaGlwc2VsZWN0OyBpKyspCi0JCWlmIChzcGlfaW14LT5jaGlwc2VsZWN0W2ldID49IDApCi0JCQlncGlvX2ZyZWUoc3BpX2lteC0+Y2hpcHNlbGVjdFtpXSk7Ci0KLQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwotCi0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGlfaW14X2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkgICAubmFtZSA9IERSSVZFUl9OQU1FLAotCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKLQkJICAgfSwKLQkuaWRfdGFibGUgPSBzcGlfaW14X2RldnR5cGUsCi0JLnByb2JlID0gc3BpX2lteF9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3Aoc3BpX2lteF9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgc3BpX2lteF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3BpX2lteF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3BpX2lteF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwaV9pbXhfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc3BpX2lteF9pbml0KTsKLW1vZHVsZV9leGl0KHNwaV9pbXhfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiU1BJIE1hc3RlciBDb250cm9sbGVyIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYyBiL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDZhNDEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKgotICogc3BpX2xtNzBsbHAuYyAtIGRyaXZlciBmb3IgTE03MEVWQUwtTExQIGJvYXJkIGZvciB0aGUgTE03MCBzZW5zb3IKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgS2Fpd2FuIE4gQmlsbGltb3JpYSA8a2Fpd2FuQGRlc2lnbmVyZ3JhcGhpeC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+Ci0KLQotLyoKLSAqIFRoZSBMTTcwIGNvbW11bmljYXRlcyB3aXRoIGEgaG9zdCBwcm9jZXNzb3IgdXNpbmcgYSAzLXdpcmUgdmFyaWFudCBvZgotICogdGhlIFNQSS9NaWNyb3dpcmUgYnVzIGludGVyZmFjZS4gVGhpcyBkcml2ZXIgc3BlY2lmaWNhbGx5IHN1cHBvcnRzIGFuCi0gKiBOUyBMTTcwIExMUCBFdmFsdWF0aW9uIEJvYXJkLCBpbnRlcmZhY2luZyB0byBhIFBDIHVzaW5nIGl0cyBwYXJhbGxlbAotICogcG9ydCB0byBiaXRiYW5nIGFuIFNQSS1wYXJwb3J0IGJyaWRnZS4gIEFjY29yZGluZ2x5LCB0aGlzIGlzIGFuIFNQSQotICogbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyLiAgVGhlIGh3bW9uL2xtNzAgZHJpdmVyIGlzIGEgIlNQSSBwcm90b2NvbAotICogZHJpdmVyIiwgbGF5ZXJlZCBvbiB0b3Agb2YgdGhpcyBvbmUgYW5kIHVzYWJsZSB3aXRob3V0IHRoZSBsbTcwbGxwLgotICoKLSAqIERhdGFzaGVldCBhbmQgU2NoZW1hdGljOgotICogVGhlIExNNzAgaXMgYSB0ZW1wZXJhdHVyZSBzZW5zb3IgY2hpcCBmcm9tIE5hdGlvbmFsIFNlbWljb25kdWN0b3I7IGl0cwotICogZGF0YXNoZWV0IGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTcwLmh0bWwKLSAqIFRoZSBzY2hlbWF0aWMgZm9yIHRoaXMgcGFydGljdWxhciBib2FyZCAodGhlIExNNzBFVkFMLUxMUCkgaXMKLSAqIGF2YWlsYWJsZSAob24gcGFnZSA0KSBoZXJlOgotICogIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL2FwcGluZm8vdGVtcHNlbnNvcnMvZmlsZXMvTE03MExMUEVWQUxtYW51YWwucGRmCi0gKgotICogQWxzbyBzZWUgRG9jdW1lbnRhdGlvbi9zcGkvc3BpLWxtNzBsbHAuICBUaGUgU1BJPC0+cGFycG9ydCBjb2RlIGhlcmUgaXMKLSAqIChoZWF2aWx5KSBiYXNlZCBvbiBzcGktYnV0dGVyZmx5IGJ5IERhdmlkIEJyb3duZWxsLgotICoKLSAqIFRoZSBMTTcwIExMUCBjb25uZWN0cyB0byB0aGUgUEMgcGFyYWxsZWwgcG9ydCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lcjoKLSAqCi0gKiAgIFBhcmFsbGVsICAgICAgICAgICAgICAgICBMTTcwIExMUAotICogICAgIFBvcnQgICAgICBEaXJlY3Rpb24gICBKUDIgSGVhZGVyCi0gKiAgLS0tLS0tLS0tLS0gIC0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tCi0gKiAgICAgIEQwICAgIDIgICAgICAtICAgICAgICAgLQotICogICAgICBEMSAgICAzICAgICAtLT4gICAgICBWKyAgIDUKLSAqICAgICAgRDIgICAgNCAgICAgLS0+ICAgICAgVisgICA1Ci0gKiAgICAgIEQzICAgIDUgICAgIC0tPiAgICAgIFYrICAgNQotICogICAgICBENCAgICA2ICAgICAtLT4gICAgICBWKyAgIDUKLSAqICAgICAgRDUgICAgNyAgICAgLS0+ICAgICAgbkNTICA4Ci0gKiAgICAgIEQ2ICAgIDggICAgIC0tPiAgICAgIFNDTEsgMwotICogICAgICBENyAgICA5ICAgICAtLT4gICAgICBTSS9PIDUKLSAqICAgICBHTkQgICAyNSAgICAgIC0gICAgICAgR05EICA3Ci0gKiAgICBTZWxlY3QgMTMgICAgIDwtLSAgICAgIFNJL08gMQotICoKLSAqIE5vdGUgdGhhdCBwYXJwb3J0IHBpbiAxMyBhY3R1YWxseSBnZXRzIGludmVydGVkIGJ5IHRoZSB0cmFuc2lzdG9yCi0gKiBhcnJhbmdlbWVudCB3aGljaCBsZXRzIGVpdGhlciB0aGUgcGFycG9ydCBvciB0aGUgTE03MCBkcml2ZSB0aGUKLSAqIFNJL1NPIHNpZ25hbCAoc2VlIHRoZSBzY2hlbWF0aWMgZm9yIGRldGFpbHMpLgotICovCi0KLSNkZWZpbmUgRFJWTkFNRQkJInNwaS1sbTcwbGxwIgotCi0jZGVmaW5lIGxtNzBfSU5JVAkweEJFCi0jZGVmaW5lIFNJTwkJMHgxMAotI2RlZmluZSBuQ1MJCTB4MjAKLSNkZWZpbmUgU0NMSwkJMHg0MAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdHJ1Y3Qgc3BpX2xtNzBsbHAgewotCXN0cnVjdCBzcGlfYml0YmFuZwliaXRiYW5nOwotCXN0cnVjdCBwYXJwb3J0CQkqcG9ydDsKLQlzdHJ1Y3QgcGFyZGV2aWNlCSpwZDsKLQlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpZGV2X2xtNzA7Ci0Jc3RydWN0IHNwaV9ib2FyZF9pbmZvCWluZm87Ci0JLy9zdHJ1Y3QgZGV2aWNlCQkqZGV2OwotfTsKLQotLyogUkVWSVNJVCA6IHVnbHkgZ2xvYmFsIDsgcHJvdmlkZXMgImV4Y2x1c2l2ZSBvcGVuIiBmYWNpbGl0eSAqLwotc3RhdGljIHN0cnVjdCBzcGlfbG03MGxscCAqbG03MGxscDsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzcGlfbG03MGxscCAqc3BpZGV2X3RvX3BwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0JcmV0dXJuIHNwaS0+Y29udHJvbGxlcl9kYXRhOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTE03MCBMTFAgZXZhbCBib2FyZC1zcGVjaWZpYyBpbmxpbmVzIGZvbGxvdyAqLwotCi0vKiBOT1RFOiAgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byByZXJlYWQgdGhlIG91dHB1dCB2YWx1ZXMsIHNpbmNlIHRoZXknbGwKLSAqIHN0aWxsIGJlIHdoYXQgd2Ugd3JvdGUgYmVmb3JlLiAgUGx1cywgZ29pbmcgdGhyb3VnaCBwYXJwb3J0IGJ1aWxkcyBpbgotICogYSB+MW1zL29wZXJhdGlvbiBkZWxheTsgdGhlc2UgU1BJIHRyYW5zZmVycyBjb3VsZCBlYXNpbHkgYmUgZmFzdGVyLgotICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkZWFzc2VydENTKHN0cnVjdCBzcGlfbG03MGxscCAqcHApCi17Ci0JdTggZGF0YSA9IHBhcnBvcnRfcmVhZF9kYXRhKHBwLT5wb3J0KTsKLQotCWRhdGEgJj0gfjB4ODA7CQkvKiBwdWxsIEQ3L1NJLW91dCBsb3cgd2hpbGUgZGUtYXNzZXJ0ZWQgKi8KLQlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGRhdGEgfCBuQ1MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0Q1Moc3RydWN0IHNwaV9sbTcwbGxwICpwcCkKLXsKLQl1OCBkYXRhID0gcGFycG9ydF9yZWFkX2RhdGEocHAtPnBvcnQpOwotCi0JZGF0YSB8PSAweDgwOwkJLyogcHVsbCBENy9TSS1vdXQgaGlnaCBzbyBsbTcwIGRyaXZlcyBTTy1pbiAqLwotCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgZGF0YSAmIH5uQ1MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xrSGlnaChzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwKQotewotCXU4IGRhdGEgPSBwYXJwb3J0X3JlYWRfZGF0YShwcC0+cG9ydCk7Ci0JcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBkYXRhIHwgU0NMSyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGtMb3coc3RydWN0IHNwaV9sbTcwbGxwICpwcCkKLXsKLQl1OCBkYXRhID0gcGFycG9ydF9yZWFkX2RhdGEocHAtPnBvcnQpOwotCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgZGF0YSAmIH5TQ0xLKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSS1MTTcwLXNwZWNpZmljIGlubGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzcGlkZWxheSh1bnNpZ25lZCBkKQotewotCXVkZWxheShkKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldHNjayhzdHJ1Y3Qgc3BpX2RldmljZSAqcywgaW50IGlzX29uKQotewotCXN0cnVjdCBzcGlfbG03MGxscCAqcHAgPSBzcGlkZXZfdG9fcHAocyk7Ci0KLQlpZiAoaXNfb24pCi0JCWNsa0hpZ2gocHApOwotCWVsc2UKLQkJY2xrTG93KHBwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldG1vc2koc3RydWN0IHNwaV9kZXZpY2UgKnMsIGludCBpc19vbikKLXsKLQkvKiBGSVhNRSB1cGRhdGUgRDcgLi4uIHRoaXMgd2F5IHdlIGNhbiBwdXQgdGhlIGNoaXAKLQkgKiBpbnRvIHNodXRkb3duIG1vZGUgYW5kIHJlYWQgdGhlIG1hbnVmYWN0dXJlciBJRCwKLQkgKiBidXQgd2UgY2FuJ3QgcHV0IGl0IGJhY2sgaW50byBvcGVyYXRpb25hbCBtb2RlLgotCSAqLwotfQotCi0vKgotICogZ2V0bWlzbzoKLSAqIFdoeSBkbyB3ZSByZXR1cm4gMCB3aGVuIHRoZSBTSU8gbGluZSBpcyBoaWdoIGFuZCB2aWNlLXZlcnNhPwotICogVGhlIGZhY3QgaXMsIHRoZSBsbTcwIGV2YWwgYm9hcmQgZnJvbSBOUyAod2hpY2ggdGhpcyBkcml2ZXIgZHJpdmVzKSwKLSAqIGlzIHdpcmVkIGluIGp1c3Qgc3VjaCBhIHdheSA6IHdoZW4gdGhlIGxtNzAncyBTSU8gZ29lcyBoaWdoLCBhIHRyYW5zaXN0b3IKLSAqIHN3aXRjaGVzIGl0IHRvIGxvdyByZWZsZWN0aW5nIHRoaXMgb24gdGhlIHBhcnBvcnQgKHBpbiAxMyksIGFuZCB2aWNlLXZlcnNhLgotICovCi1zdGF0aWMgaW5saW5lIGludCBnZXRtaXNvKHN0cnVjdCBzcGlfZGV2aWNlICpzKQotewotCXN0cnVjdCBzcGlfbG03MGxscCAqcHAgPSBzcGlkZXZfdG9fcHAocyk7Ci0JcmV0dXJuICgoU0lPID09IChwYXJwb3J0X3JlYWRfc3RhdHVzKHBwLT5wb3J0KSAmIFNJTykpID8gMCA6IDEgKTsKLX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAic3BpX2JpdGJhbmdfdHhyeC5oIgotCi1zdGF0aWMgdm9pZCBsbTcwX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQotewotCXN0cnVjdCBzcGlfbG03MGxscCAqcHAgPSBzcGlkZXZfdG9fcHAoc3BpKTsKLQotCWlmICh2YWx1ZSkKLQkJYXNzZXJ0Q1MocHApOwotCWVsc2UKLQkJZGVhc3NlcnRDUyhwcCk7Ci19Ci0KLS8qCi0gKiBPdXIgYWN0dWFsIGJpdGJhbmdlciByb3V0aW5lLgotICovCi1zdGF0aWMgdTMyIGxtNzBfdHhyeChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCi17Ci0JcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMChzcGksIG5zZWNzLCAwLCAwLCB3b3JkLCBiaXRzKTsKLX0KLQotc3RhdGljIHZvaWQgc3BpX2xtNzBsbHBfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQotewotCXN0cnVjdCBwYXJkZXZpY2UJKnBkOwotCXN0cnVjdCBzcGlfbG03MGxscAkqcHA7Ci0Jc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKLQlpbnQJCQlzdGF0dXM7Ci0KLQlpZiAobG03MGxscCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkiJXM6IHNwaV9sbTcwbGxwIGluc3RhbmNlIGFscmVhZHkgbG9hZGVkLiBBYm9ydGluZy5cbiIsCi0JCQlEUlZOQU1FKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRPRE86ICB0aGlzIGp1c3QgX2Fzc3VtZXNfIGEgbG03MCBpcyB0aGVyZSAuLi4gbm8gcHJvYmU7Ci0JICogdGhlIGxtNzAgZHJpdmVyIGNvdWxkIHZlcmlmeSBpdCwgcmVhZGluZyB0aGUgbWFuZiBJRC4KLQkgKi8KLQotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIocC0+cGh5c3BvcnQtPmRldiwgc2l6ZW9mICpwcCk7Ci0JaWYgKCFtYXN0ZXIpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBvdXRfZmFpbDsKLQl9Ci0JcHAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0KLQltYXN0ZXItPmJ1c19udW0gPSAtMTsJLyogZHluYW1pYyBhbGxvYyBvZiBhIGJ1cyBudW1iZXIgKi8KLQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMTsKLQotCS8qCi0JICogU1BJIGFuZCBiaXRiYW5nIGhvb2t1cC4KLQkgKi8KLQlwcC0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOwotCXBwLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBsbTcwX2NoaXBzZWxlY3Q7Ci0JcHAtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzBdID0gbG03MF90eHJ4OwotCXBwLT5iaXRiYW5nLmZsYWdzID0gU1BJXzNXSVJFOwotCi0JLyoKLQkgKiBQYXJwb3J0IGhvb2t1cAotCSAqLwotCXBwLT5wb3J0ID0gcDsKLQlwZCA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHAsIERSVk5BTUUsCi0JCQlOVUxMLCBOVUxMLCBOVUxMLAotCQkJUEFSUE9SVF9GTEFHX0VYQ0wsIHBwKTsKLQlpZiAoIXBkKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2ZyZWVfbWFzdGVyOwotCX0KLQlwcC0+cGQgPSBwZDsKLQotCXN0YXR1cyA9IHBhcnBvcnRfY2xhaW0ocGQpOwotCWlmIChzdGF0dXMgPCAwKQotCQlnb3RvIG91dF9wYXJwb3J0X3VucmVnOwotCi0JLyoKLQkgKiBTdGFydCBTUEkgLi4uCi0JICovCi0Jc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RhcnQoJnBwLT5iaXRiYW5nKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkiJXM6IHNwaV9iaXRiYW5nX3N0YXJ0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwKLQkJCURSVk5BTUUsIHN0YXR1cyk7Ci0JCWdvdG8gb3V0X29mZl9hbmRfcmVsZWFzZTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBtb2RhbGlhcyBuYW1lIE1VU1QgbWF0Y2ggdGhlIGRldmljZV9kcml2ZXIgbmFtZQotCSAqIGZvciB0aGUgYnVzIGdsdWUgY29kZSB0byBtYXRjaCBhbmQgc3Vic2VxdWVudGx5IGJpbmQgdGhlbS4KLQkgKiBXZSBhcmUgYmluZGluZyB0byB0aGUgZ2VuZXJpYyBkcml2ZXJzL2h3bW9uL2xtNzAuYyBkZXZpY2UKLQkgKiBkcml2ZXIuCi0JICovCi0Jc3RyY3B5KHBwLT5pbmZvLm1vZGFsaWFzLCAibG03MCIpOwotCXBwLT5pbmZvLm1heF9zcGVlZF9oeiA9IDYgKiAxMDAwICogMTAwMDsKLQlwcC0+aW5mby5jaGlwX3NlbGVjdCA9IDA7Ci0JcHAtPmluZm8ubW9kZSA9IFNQSV8zV0lSRSB8IFNQSV9NT0RFXzA7Ci0KLQkvKiBwb3dlciB1cCB0aGUgY2hpcCwgYW5kIGxldCB0aGUgTE03MCBjb250cm9sIFNJL1NPICovCi0JcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBsbTcwX0lOSVQpOwotCi0JLyogRW5hYmxlIGFjY2VzcyB0byBvdXIgcHJpbWFyeSBkYXRhIHN0cnVjdHVyZSB2aWEKLQkgKiB0aGUgYm9hcmQgaW5mbydzICh2b2lkICopY29udHJvbGxlcl9kYXRhLgotCSAqLwotCXBwLT5pbmZvLmNvbnRyb2xsZXJfZGF0YSA9IHBwOwotCXBwLT5zcGlkZXZfbG03MCA9IHNwaV9uZXdfZGV2aWNlKHBwLT5iaXRiYW5nLm1hc3RlciwgJnBwLT5pbmZvKTsKLQlpZiAocHAtPnNwaWRldl9sbTcwKQotCQlkZXZfZGJnKCZwcC0+c3BpZGV2X2xtNzAtPmRldiwgInNwaWRldl9sbTcwIGF0ICVzXG4iLAotCQkJCWRldl9uYW1lKCZwcC0+c3BpZGV2X2xtNzAtPmRldikpOwotCWVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc3BpX25ld19kZXZpY2UgZmFpbGVkXG4iLCBEUlZOQU1FKTsKLQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJZ290byBvdXRfYml0YmFuZ19zdG9wOwotCX0KLQlwcC0+c3BpZGV2X2xtNzAtPmJpdHNfcGVyX3dvcmQgPSA4OwotCi0JbG03MGxscCA9IHBwOwotCXJldHVybjsKLQotb3V0X2JpdGJhbmdfc3RvcDoKLQlzcGlfYml0YmFuZ19zdG9wKCZwcC0+Yml0YmFuZyk7Ci1vdXRfb2ZmX2FuZF9yZWxlYXNlOgotCS8qIHBvd2VyIGRvd24gKi8KLQlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIDApOwotCW1kZWxheSgxMCk7Ci0JcGFycG9ydF9yZWxlYXNlKHBwLT5wZCk7Ci1vdXRfcGFycG9ydF91bnJlZzoKLQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBkKTsKLW91dF9mcmVlX21hc3RlcjoKLQkodm9pZCkgc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKLW91dF9mYWlsOgotCXByX2luZm8oIiVzOiBzcGlfbG03MGxscCBwcm9iZSBmYWlsLCBzdGF0dXMgJWRcbiIsIERSVk5BTUUsIHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNwaV9sbTcwbGxwX2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcCkKLXsKLQlzdHJ1Y3Qgc3BpX2xtNzBsbHAJCSpwcDsKLQotCWlmICghbG03MGxscCB8fCBsbTcwbGxwLT5wb3J0ICE9IHApCi0JCXJldHVybjsKLQotCXBwID0gbG03MGxscDsKLQlzcGlfYml0YmFuZ19zdG9wKCZwcC0+Yml0YmFuZyk7Ci0KLQkvKiBwb3dlciBkb3duICovCi0JcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCAwKTsKLQotCXBhcnBvcnRfcmVsZWFzZShwcC0+cGQpOwotCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHAtPnBkKTsKLQotCSh2b2lkKSBzcGlfbWFzdGVyX3B1dChwcC0+Yml0YmFuZy5tYXN0ZXIpOwotCi0JbG03MGxscCA9IE5VTEw7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBzcGlfbG03MGxscF9kcnYgPSB7Ci0JLm5hbWUgPQkJRFJWTkFNRSwKLQkuYXR0YWNoID0Jc3BpX2xtNzBsbHBfYXR0YWNoLAotCS5kZXRhY2ggPQlzcGlfbG03MGxscF9kZXRhY2gsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X3NwaV9sbTcwbGxwKHZvaWQpCi17Ci0JcmV0dXJuIHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZzcGlfbG03MGxscF9kcnYpOwotfQotbW9kdWxlX2luaXQoaW5pdF9zcGlfbG03MGxscCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3NwaV9sbTcwbGxwKHZvaWQpCi17Ci0JcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmc3BpX2xtNzBsbHBfZHJ2KTsKLX0KLW1vZHVsZV9leGl0KGNsZWFudXBfc3BpX2xtNzBsbHApOwotCi1NT0RVTEVfQVVUSE9SKCJLYWl3YW4gTiBCaWxsaW1vcmlhIDxrYWl3YW5AZGVzaWduZXJncmFwaGl4LmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigKLQkiUGFycG9ydCBhZGFwdGVyIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTcwIExMUCBldmFsIGJvYXJkIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfbnVjOTAwLmMgYi9kcml2ZXJzL3NwaS9zcGlfbnVjOTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDE1ZjYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvc3BpX251YzkwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qIGxpbnV4L2RyaXZlcnMvc3BpL3NwaV9udWM5MDAuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBOdXZvdG9uIHRlY2hub2xvZ3kuCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0qLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KLQotI2luY2x1ZGUgPG1hY2gvbnVjOTAwX3NwaS5oPgotCi0vKiB1c2kgcmVnaXN0ZXJzIG9mZnNldCAqLwotI2RlZmluZSBVU0lfQ05UCQkweDAwCi0jZGVmaW5lIFVTSV9ESVYJCTB4MDQKLSNkZWZpbmUgVVNJX1NTUgkJMHgwOAotI2RlZmluZSBVU0lfUlgwCQkweDEwCi0jZGVmaW5lIFVTSV9UWDAJCTB4MTAKLQotLyogdXNpIHJlZ2lzdGVyIGJpdCAqLwotI2RlZmluZSBFTklOVAkJKDB4MDEgPDwgMTcpCi0jZGVmaW5lIEVORkxHCQkoMHgwMSA8PCAxNikKLSNkZWZpbmUgVFhOVU0JCSgweDAzIDw8IDgpCi0jZGVmaW5lIFRYTkVHCQkoMHgwMSA8PCAyKQotI2RlZmluZSBSWE5FRwkJKDB4MDEgPDwgMSkKLSNkZWZpbmUgTFNCCQkoMHgwMSA8PCAxMCkKLSNkZWZpbmUgU0VMRUNUTEVWCSgweDAxIDw8IDIpCi0jZGVmaW5lIFNFTEVDVFBPTAkoMHgwMSA8PCAzMSkKLSNkZWZpbmUgU0VMRUNUU0xBVkUJMHgwMQotI2RlZmluZSBHT0JVU1kJCTB4MDEKLQotc3RydWN0IG51YzkwMF9zcGkgewotCXN0cnVjdCBzcGlfYml0YmFuZwkgYml0YmFuZzsKLQlzdHJ1Y3QgY29tcGxldGlvbgkgZG9uZTsKLQl2b2lkIF9faW9tZW0JCSpyZWdzOwotCWludAkJCSBpcnE7Ci0JaW50CQkJIGxlbjsKLQlpbnQJCQkgY291bnQ7Ci0JY29uc3QgdW5zaWduZWQgY2hhcgkqdHg7Ci0JdW5zaWduZWQgY2hhcgkJKnJ4OwotCXN0cnVjdCBjbGsJCSpjbGs7Ci0Jc3RydWN0IHJlc291cmNlCQkqaW9hcmVhOwotCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7Ci0Jc3RydWN0IHNwaV9kZXZpY2UJKmN1cmRldjsKLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwotCXN0cnVjdCBudWM5MDBfc3BpX2luZm8gKnBkYXRhOwotCXNwaW5sb2NrX3QJCWxvY2s7Ci0Jc3RydWN0IHJlc291cmNlCQkqcmVzOwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbnVjOTAwX3NwaSAqdG9faHcoc3RydWN0IHNwaV9kZXZpY2UgKnNkZXYpCi17Ci0JcmV0dXJuIHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc2Rldi0+bWFzdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgbnVjOTAwX3NsYXZlX3NlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBpbnQgc3NyKQotewotCXN0cnVjdCBudWM5MDBfc3BpICpodyA9IHRvX2h3KHNwaSk7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQl1bnNpZ25lZCBpbnQgY3MgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCA/IDEgOiAwOwotCXVuc2lnbmVkIGludCBjcG9sID0gc3BpLT5tb2RlICYgU1BJX0NQT0wgPyAxIDogMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7Ci0KLQl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9TU1IpOwotCi0JaWYgKCFjcykKLQkJdmFsICY9IH5TRUxFQ1RMRVY7Ci0JZWxzZQotCQl2YWwgfD0gU0VMRUNUTEVWOwotCi0JaWYgKCFzc3IpCi0JCXZhbCAmPSB+U0VMRUNUU0xBVkU7Ci0JZWxzZQotCQl2YWwgfD0gU0VMRUNUU0xBVkU7Ci0KLQlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9TU1IpOwotCi0JdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKTsKLQotCWlmICghY3BvbCkKLQkJdmFsICY9IH5TRUxFQ1RQT0w7Ci0JZWxzZQotCQl2YWwgfD0gU0VMRUNUUE9MOwotCi0JX19yYXdfd3JpdGVsKHZhbCwgaHctPnJlZ3MgKyBVU0lfQ05UKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG51YzkwMF9zcGlfY2hpcHNlbChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgdmFsdWUpCi17Ci0Jc3dpdGNoICh2YWx1ZSkgewotCWNhc2UgQklUQkFOR19DU19JTkFDVElWRToKLQkJbnVjOTAwX3NsYXZlX3NlbGVjdChzcGksIDApOwotCQlicmVhazsKLQotCWNhc2UgQklUQkFOR19DU19BQ1RJVkU6Ci0JCW51YzkwMF9zbGF2ZV9zZWxlY3Qoc3BpLCAxKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBudWM5MDBfc3BpX3NldHVwX3R4bnVtKHN0cnVjdCBudWM5MDBfc3BpICpodywKLQkJCQkJCQl1bnNpZ25lZCBpbnQgdHhudW0pCi17Ci0JdW5zaWduZWQgaW50IHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7Ci0KLQl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOwotCi0JaWYgKCF0eG51bSkKLQkJdmFsICY9IH5UWE5VTTsKLQllbHNlCi0JCXZhbCB8PSB0eG51bSA8PCAweDA4OwotCi0JX19yYXdfd3JpdGVsKHZhbCwgaHctPnJlZ3MgKyBVU0lfQ05UKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7Ci0KLX0KLQotc3RhdGljIHZvaWQgbnVjOTAwX3NwaV9zZXR1cF90eGJpdGxlbihzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcsCi0JCQkJCQkJdW5zaWduZWQgaW50IHR4Yml0bGVuKQotewotCXVuc2lnbmVkIGludCB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOwotCi0JdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKTsKLQotCXZhbCB8PSAodHhiaXRsZW4gPDwgMHgwMyk7Ci0KLQlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbnVjOTAwX3NwaV9nb2J1c3koc3RydWN0IG51YzkwMF9zcGkgKmh3KQotewotCXVuc2lnbmVkIGludCB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOwotCi0JdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKTsKLQotCXZhbCB8PSBHT0JVU1k7Ci0KLQlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBudWM5MDBfc3BpX3NldHVweGZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG51YzkwMF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaHdfdHhieXRlKHN0cnVjdCBudWM5MDBfc3BpICpodywgaW50IGNvdW50KQotewotCXJldHVybiBody0+dHggPyBody0+dHhbY291bnRdIDogMDsKLX0KLQotc3RhdGljIGludCBudWM5MDBfc3BpX3R4cngoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcgPSB0b19odyhzcGkpOwotCi0JaHctPnR4ID0gdC0+dHhfYnVmOwotCWh3LT5yeCA9IHQtPnJ4X2J1ZjsKLQlody0+bGVuID0gdC0+bGVuOwotCWh3LT5jb3VudCA9IDA7Ci0KLQlfX3Jhd193cml0ZWwoaHdfdHhieXRlKGh3LCAweDApLCBody0+cmVncyArIFVTSV9UWDApOwotCi0JbnVjOTAwX3NwaV9nb2J1c3koaHcpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmaHctPmRvbmUpOwotCi0JcmV0dXJuIGh3LT5jb3VudDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IG51YzkwMF9zcGlfaXJxKGludCBpcnEsIHZvaWQgKmRldikKLXsKLQlzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcgPSBkZXY7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSBody0+Y291bnQ7Ci0KLQlzdGF0dXMgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOwotCV9fcmF3X3dyaXRlbChzdGF0dXMsIGh3LT5yZWdzICsgVVNJX0NOVCk7Ci0KLQlpZiAoc3RhdHVzICYgRU5GTEcpIHsKLQkJaHctPmNvdW50Kys7Ci0KLQkJaWYgKGh3LT5yeCkKLQkJCWh3LT5yeFtjb3VudF0gPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9SWDApOwotCQljb3VudCsrOwotCi0JCWlmIChjb3VudCA8IGh3LT5sZW4pIHsKLQkJCV9fcmF3X3dyaXRlbChod190eGJ5dGUoaHcsIGNvdW50KSwgaHctPnJlZ3MgKyBVU0lfVFgwKTsKLQkJCW51YzkwMF9zcGlfZ29idXN5KGh3KTsKLQkJfSBlbHNlIHsKLQkJCWNvbXBsZXRlKCZody0+ZG9uZSk7Ci0JCX0KLQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JY29tcGxldGUoJmh3LT5kb25lKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG51YzkwMF90eF9lZGdlKHN0cnVjdCBudWM5MDBfc3BpICpodywgdW5zaWduZWQgaW50IGVkZ2UpCi17Ci0JdW5zaWduZWQgaW50IHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7Ci0KLQl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOwotCi0JaWYgKGVkZ2UpCi0JCXZhbCB8PSBUWE5FRzsKLQllbHNlCi0JCXZhbCAmPSB+VFhORUc7Ci0JX19yYXdfd3JpdGVsKHZhbCwgaHctPnJlZ3MgKyBVU0lfQ05UKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG51YzkwMF9yeF9lZGdlKHN0cnVjdCBudWM5MDBfc3BpICpodywgdW5zaWduZWQgaW50IGVkZ2UpCi17Ci0JdW5zaWduZWQgaW50IHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7Ci0KLQl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOwotCi0JaWYgKGVkZ2UpCi0JCXZhbCB8PSBSWE5FRzsKLQllbHNlCi0JCXZhbCAmPSB+UlhORUc7Ci0JX19yYXdfd3JpdGVsKHZhbCwgaHctPnJlZ3MgKyBVU0lfQ05UKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG51YzkwMF9zZW5kX2ZpcnN0KHN0cnVjdCBudWM5MDBfc3BpICpodywgdW5zaWduZWQgaW50IGxzYikKLXsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKLQotCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7Ci0KLQlpZiAobHNiKQotCQl2YWwgfD0gTFNCOwotCWVsc2UKLQkJdmFsICY9IH5MU0I7Ci0JX19yYXdfd3JpdGVsKHZhbCwgaHctPnJlZ3MgKyBVU0lfQ05UKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG51YzkwMF9zZXRfc2xlZXAoc3RydWN0IG51YzkwMF9zcGkgKmh3LCB1bnNpZ25lZCBpbnQgc2xlZXApCi17Ci0JdW5zaWduZWQgaW50IHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7Ci0KLQl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOwotCi0JaWYgKHNsZWVwKQotCQl2YWwgfD0gKHNsZWVwIDw8IDEyKTsKLQllbHNlCi0JCXZhbCAmPSB+KDB4MGYgPDwgMTIpOwotCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX0NOVCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBudWM5MDBfZW5hYmxlX2ludChzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcpCi17Ci0JdW5zaWduZWQgaW50IHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7Ci0KLQl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOwotCi0JdmFsIHw9IEVOSU5UOwotCi0JX19yYXdfd3JpdGVsKHZhbCwgaHctPnJlZ3MgKyBVU0lfQ05UKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG51YzkwMF9zZXRfZGl2aWRlcihzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcpCi17Ci0JX19yYXdfd3JpdGVsKGh3LT5wZGF0YS0+ZGl2aWRlciwgaHctPnJlZ3MgKyBVU0lfRElWKTsKLX0KLQotc3RhdGljIHZvaWQgbnVjOTAwX2luaXRfc3BpKHN0cnVjdCBudWM5MDBfc3BpICpodykKLXsKLQljbGtfZW5hYmxlKGh3LT5jbGspOwotCXNwaW5fbG9ja19pbml0KCZody0+bG9jayk7Ci0KLQludWM5MDBfdHhfZWRnZShodywgaHctPnBkYXRhLT50eG5lZyk7Ci0JbnVjOTAwX3J4X2VkZ2UoaHcsIGh3LT5wZGF0YS0+cnhuZWcpOwotCW51YzkwMF9zZW5kX2ZpcnN0KGh3LCBody0+cGRhdGEtPmxzYik7Ci0JbnVjOTAwX3NldF9zbGVlcChodywgaHctPnBkYXRhLT5zbGVlcCk7Ci0JbnVjOTAwX3NwaV9zZXR1cF90eGJpdGxlbihodywgaHctPnBkYXRhLT50eGJpdGxlbik7Ci0JbnVjOTAwX3NwaV9zZXR1cF90eG51bShodywgaHctPnBkYXRhLT50eG51bSk7Ci0JbnVjOTAwX3NldF9kaXZpZGVyKGh3KTsKLQludWM5MDBfZW5hYmxlX2ludChodyk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IG51YzkwMF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbnVjOTAwX3NwaSAqaHc7Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKLQlpbnQgZXJyID0gMDsKLQotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBudWM5MDBfc3BpKSk7Ci0JaWYgKG1hc3RlciA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIG1lbW9yeSBmb3Igc3BpX21hc3RlclxuIik7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX25vbWVtOwotCX0KLQotCWh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCW1lbXNldChodywgMCwgc2l6ZW9mKHN0cnVjdCBudWM5MDBfc3BpKSk7Ci0KLQlody0+bWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKLQlody0+cGRhdGEgID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaHctPmRldiA9ICZwZGV2LT5kZXY7Ci0KLQlpZiAoaHctPnBkYXRhID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBzdXBwbGllZFxuIik7Ci0JCWVyciA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyX3BkYXRhOwotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGh3KTsKLQlpbml0X2NvbXBsZXRpb24oJmh3LT5kb25lKTsKLQotCW1hc3Rlci0+bW9kZV9iaXRzICAgICAgICAgID0gU1BJX01PREVfMDsKLQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ICAgICA9IGh3LT5wZGF0YS0+bnVtX2NzOwotCW1hc3Rlci0+YnVzX251bSAgICAgICAgICAgID0gaHctPnBkYXRhLT5idXNfbnVtOwotCWh3LT5iaXRiYW5nLm1hc3RlciAgICAgICAgID0gaHctPm1hc3RlcjsKLQlody0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IG51YzkwMF9zcGlfc2V0dXB4ZmVyOwotCWh3LT5iaXRiYW5nLmNoaXBzZWxlY3QgICAgID0gbnVjOTAwX3NwaV9jaGlwc2VsOwotCWh3LT5iaXRiYW5nLnR4cnhfYnVmcyAgICAgID0gbnVjOTAwX3NwaV90eHJ4OwotCWh3LT5iaXRiYW5nLm1hc3Rlci0+c2V0dXAgID0gbnVjOTAwX3NwaV9zZXR1cDsKLQotCWh3LT5yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmIChody0+cmVzID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGdldCBJT1JFU09VUkNFX01FTVxuIik7Ci0JCWVyciA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyX3BkYXRhOwotCX0KLQotCWh3LT5pb2FyZWEgPSByZXF1ZXN0X21lbV9yZWdpb24oaHctPnJlcy0+c3RhcnQsCi0JCQkJCXJlc291cmNlX3NpemUoaHctPnJlcyksIHBkZXYtPm5hbWUpOwotCi0JaWYgKGh3LT5pb2FyZWEgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVzZXJ2ZSByZWdpb25cbiIpOwotCQllcnIgPSAtRU5YSU87Ci0JCWdvdG8gZXJyX3BkYXRhOwotCX0KLQotCWh3LT5yZWdzID0gaW9yZW1hcChody0+cmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShody0+cmVzKSk7Ci0JaWYgKGh3LT5yZWdzID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IG1hcCBJT1xuIik7Ci0JCWVyciA9IC1FTlhJTzsKLQkJZ290byBlcnJfaW9tYXA7Ci0JfQotCi0JaHctPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGh3LT5pcnEgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIElSUSBzcGVjaWZpZWRcbiIpOwotCQllcnIgPSAtRU5PRU5UOwotCQlnb3RvIGVycl9pcnE7Ci0JfQotCi0JZXJyID0gcmVxdWVzdF9pcnEoaHctPmlycSwgbnVjOTAwX3NwaV9pcnEsIDAsIHBkZXYtPm5hbWUsIGh3KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBjbGFpbSBJUlFcbiIpOwotCQlnb3RvIGVycl9pcnE7Ci0JfQotCi0JaHctPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInNwaSIpOwotCWlmIChJU19FUlIoaHctPmNsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gY2xvY2sgZm9yIGRldmljZVxuIik7Ci0JCWVyciA9IFBUUl9FUlIoaHctPmNsayk7Ci0JCWdvdG8gZXJyX2NsazsKLQl9Ci0KLQltZnBfc2V0X2dyb3VwZygmcGRldi0+ZGV2KTsKLQludWM5MDBfaW5pdF9zcGkoaHcpOwotCi0JZXJyID0gc3BpX2JpdGJhbmdfc3RhcnQoJmh3LT5iaXRiYW5nKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBTUEkgbWFzdGVyXG4iKTsKLQkJZ290byBlcnJfcmVnaXN0ZXI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9yZWdpc3RlcjoKLQljbGtfZGlzYWJsZShody0+Y2xrKTsKLQljbGtfcHV0KGh3LT5jbGspOwotZXJyX2NsazoKLQlmcmVlX2lycShody0+aXJxLCBodyk7Ci1lcnJfaXJxOgotCWlvdW5tYXAoaHctPnJlZ3MpOwotZXJyX2lvbWFwOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihody0+cmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShody0+cmVzKSk7Ci0Ja2ZyZWUoaHctPmlvYXJlYSk7Ci1lcnJfcGRhdGE6Ci0Jc3BpX21hc3Rlcl9wdXQoaHctPm1hc3Rlcik7Ci0KLWVycl9ub21lbToKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBudWM5MDBfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG51YzkwMF9zcGkgKmh3ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKLQotCWZyZWVfaXJxKGh3LT5pcnEsIGh3KTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Ci0KLQlzcGlfYml0YmFuZ19zdG9wKCZody0+Yml0YmFuZyk7Ci0KLQljbGtfZGlzYWJsZShody0+Y2xrKTsKLQljbGtfcHV0KGh3LT5jbGspOwotCi0JaW91bm1hcChody0+cmVncyk7Ci0KLQlyZWxlYXNlX21lbV9yZWdpb24oaHctPnJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoaHctPnJlcykpOwotCWtmcmVlKGh3LT5pb2FyZWEpOwotCi0Jc3BpX21hc3Rlcl9wdXQoaHctPm1hc3Rlcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG51YzkwMF9zcGlfZHJpdmVyID0gewotCS5wcm9iZQkJPSBudWM5MDBfc3BpX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobnVjOTAwX3NwaV9yZW1vdmUpLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJudWM5MDAtc3BpIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG51YzkwMF9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm51YzkwMF9zcGlfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG51YzkwMF9zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZudWM5MDBfc3BpX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KG51YzkwMF9zcGlfaW5pdCk7Ci1tb2R1bGVfZXhpdChudWM5MDBfc3BpX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIm51YzkwMCBzcGkgZHJpdmVyISIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpudWM5MDAtc3BpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfcHBjNHh4LmMgYi9kcml2ZXJzL3NwaS9zcGlfcHBjNHh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjk4YzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvc3BpX3BwYzR4eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qCi0gKiBTUElfUFBDNFhYIFNQSSBjb250cm9sbGVyIGRyaXZlci4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgR2FyeSBKZW5uZWpvaG4gPGdhcnlqQGRlbnguZGU+Ci0gKiBDb3B5cmlnaHQgMjAwOCBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+LCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCi0gKiBDb3B5cmlnaHQgMjAwOSBIYXJyaXMgQ29ycG9yYXRpb24sIFN0ZXZlbiBBLiBGYWxjbyA8c2ZhbGNvQGhhcnJpcy5jb20+Ci0gKgotICogQmFzZWQgaW4gcGFydCBvbiBkcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEJlbiBEb29rcwotICogQ29weXJpZ2h0IChjKSAyMDA2IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLS8qCi0gKiBUaGUgUFBDNHh4IFNQSSBjb250cm9sbGVyIGhhcyBubyBGSUZPIHNvIGVhY2ggc2VudC9yZWNlaXZlZCBieXRlIHdpbGwKLSAqIGdlbmVyYXRlIGFuIGludGVycnVwdCB0byB0aGUgQ1BVLiBUaGlzIGNhbiBjYXVzZSBoaWdoIENQVSB1dGlsaXphdGlvbi4KLSAqIFRoaXMgZHJpdmVyIGFsbG93cyBwbGF0Zm9ybXMgdG8gcmVkdWNlIHRoZSBpbnRlcnJ1cHQgbG9hZCBvbiB0aGUgQ1BVCi0gKiBkdXJpbmcgU1BJIHRyYW5zZmVycyBieSBzZXR0aW5nIG1heF9zcGVlZF9oeiB2aWEgdGhlIGRldmljZSB0cmVlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZGNyLmg+Ci0jaW5jbHVkZSA8YXNtL2Rjci1yZWdzLmg+Ci0KLS8qIGJpdHMgaW4gbW9kZSByZWdpc3RlciAtIGJpdCAwIGlzIE1TYiAqLwotCi0vKgotICogU1BJX1BQQzRYWF9NT0RFX1NDUCA9IDAgbWVhbnMgImRhdGEgbGF0Y2hlZCBvbiB0cmFpbGluZyBlZGdlIG9mIGNsb2NrIgotICogU1BJX1BQQzRYWF9NT0RFX1NDUCA9IDEgbWVhbnMgImRhdGEgbGF0Y2hlZCBvbiBsZWFkaW5nIGVkZ2Ugb2YgY2xvY2siCi0gKiBOb3RlOiBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIENQSEEuCi0gKi8KLSNkZWZpbmUgU1BJX1BQQzRYWF9NT0RFX1NDUAkoMHg4MCA+PiAzKQotCi0vKiBTUElfUFBDNFhYX01PREVfU1BFID0gMSBtZWFucyAicG9ydCBlbmFibGVkIiAqLwotI2RlZmluZSBTUElfUFBDNFhYX01PREVfU1BFCSgweDgwID4+IDQpCi0KLS8qCi0gKiBTUElfUFBDNFhYX01PREVfUkQgPSAwIG1lYW5zICJNU0IgZmlyc3QiIC0gdGhpcyBpcyB0aGUgbm9ybWFsIG1vZGUKLSAqIFNQSV9QUEM0WFhfTU9ERV9SRCA9IDEgbWVhbnMgIkxTQiBmaXJzdCIgLSB0aGlzIGlzIGJpdC1yZXZlcnNlZCBtb2RlCi0gKiBOb3RlOiBUaGlzIGlzIGlkZW50aWNhbCB0byBTUElfTFNCX0ZJUlNULgotICovCi0jZGVmaW5lIFNQSV9QUEM0WFhfTU9ERV9SRAkoMHg4MCA+PiA1KQotCi0vKgotICogU1BJX1BQQzRYWF9NT0RFX0NJID0gMCBtZWFucyAiY2xvY2sgaWRsZXMgbG93IgotICogU1BJX1BQQzRYWF9NT0RFX0NJID0gMSBtZWFucyAiY2xvY2sgaWRsZXMgaGlnaCIKLSAqIE5vdGU6IFRoaXMgaXMgaWRlbnRpY2FsIHRvIENQT0wuCi0gKi8KLSNkZWZpbmUgU1BJX1BQQzRYWF9NT0RFX0NJCSgweDgwID4+IDYpCi0KLS8qCi0gKiBTUElfUFBDNFhYX01PREVfSUwgPSAwIG1lYW5zICJsb29wYmFjayBkaXNhYmxlIgotICogU1BJX1BQQzRYWF9NT0RFX0lMID0gMSBtZWFucyAibG9vcGJhY2sgZW5hYmxlIgotICovCi0jZGVmaW5lIFNQSV9QUEM0WFhfTU9ERV9JTAkoMHg4MCA+PiA3KQotCi0vKiBiaXRzIGluIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLS8qIHN0YXJ0cyBhIHRyYW5zZmVyIHdoZW4gc2V0ICovCi0jZGVmaW5lIFNQSV9QUEM0WFhfQ1JfU1RSCSgweDgwID4+IDcpCi0KLS8qIGJpdHMgaW4gc3RhdHVzIHJlZ2lzdGVyICovCi0vKiBwb3J0IGlzIGJ1c3kgd2l0aCBhIHRyYW5zZmVyICovCi0jZGVmaW5lIFNQSV9QUEM0WFhfU1JfQlNZCSgweDgwID4+IDYpCi0vKiBSeEQgcmVhZHkgKi8KLSNkZWZpbmUgU1BJX1BQQzRYWF9TUl9SQlIJKDB4ODAgPj4gNykKLQotLyogY2xvY2sgc2V0dGluZ3MgKFNDUCBhbmQgQ0kpIGZvciB2YXJpb3VzIFNQSSBtb2RlcyAqLwotI2RlZmluZSBTUElfQ0xLX01PREUwCShTUElfUFBDNFhYX01PREVfU0NQIHwgMCkKLSNkZWZpbmUgU1BJX0NMS19NT0RFMQkoMCB8IDApCi0jZGVmaW5lIFNQSV9DTEtfTU9ERTIJKFNQSV9QUEM0WFhfTU9ERV9TQ1AgfCBTUElfUFBDNFhYX01PREVfQ0kpCi0jZGVmaW5lIFNQSV9DTEtfTU9ERTMJKDAgfCBTUElfUFBDNFhYX01PREVfQ0kpCi0KLSNkZWZpbmUgRFJJVkVSX05BTUUJInNwaV9wcGM0eHhfb2YiCi0KLXN0cnVjdCBzcGlfcHBjNHh4X3JlZ3MgewotCXU4IG1vZGU7Ci0JdTggcnhkOwotCXU4IHR4ZDsKLQl1OCBjcjsKLQl1OCBzcjsKLQl1OCBkdW1teTsKLQkvKgotCSAqIENsb2NrIGRpdmlzb3IgbW9kdWx1cyByZWdpc3RlcgotCSAqIFRoaXMgdXNlcyB0aGUgZm9sbHdpbmcgZm9ybXVsYToKLQkgKiAgICBTQ1BDbGtPdXQgPSBPUEJDTEsvKDQoQ0RNICsgMSkpCi0JICogb3IKLQkgKiAgICBDRE0gPSAoT1BCQ0xLLzQqU0NQQ2xrT3V0KSAtIDEKLQkgKiBiaXQgMCBpcyB0aGUgTVNiIQotCSAqLwotCXU4IGNkbTsKLX07Ci0KLS8qIFNQSSBDb250cm9sbGVyIGRyaXZlcidzIHByaXZhdGUgZGF0YS4gKi8KLXN0cnVjdCBwcGM0eHhfc3BpIHsKLQkvKiBiaXRiYW5nIGhhcyB0byBiZSBmaXJzdCAqLwotCXN0cnVjdCBzcGlfYml0YmFuZyBiaXRiYW5nOwotCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Ci0KLQl1NjQgbWFwYmFzZTsKLQl1NjQgbWFwc2l6ZTsKLQlpbnQgaXJxbnVtOwotCS8qIG5lZWQgdGhpcyB0byBzZXQgdGhlIFNQSSBjbG9jayAqLwotCXVuc2lnbmVkIGludCBvcGJfZnJlcTsKLQotCS8qIGZvciB0cmFuc2ZlcnMgKi8KLQlpbnQgbGVuOwotCWludCBjb3VudDsKLQkvKiBkYXRhIGJ1ZmZlcnMgKi8KLQljb25zdCB1bnNpZ25lZCBjaGFyICp0eDsKLQl1bnNpZ25lZCBjaGFyICpyeDsKLQotCWludCAqZ3Bpb3M7Ci0KLQlzdHJ1Y3Qgc3BpX3BwYzR4eF9yZWdzIF9faW9tZW0gKnJlZ3M7IC8qIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVycyAqLwotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotfTsKLQotLyogbmVlZCB0aGlzIHNvIHdlIGNhbiBzZXQgdGhlIGNsb2NrIGluIHRoZSBjaGlwc2VsZWN0IHJvdXRpbmUgKi8KLXN0cnVjdCBzcGlfcHBjNHh4X2NzIHsKLQl1OCBtb2RlOwotfTsKLQotc3RhdGljIGludCBzcGlfcHBjNHh4X3R4cngoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlzdHJ1Y3QgcHBjNHh4X3NwaSAqaHc7Ci0JdTggZGF0YTsKLQotCWRldl9kYmcoJnNwaS0+ZGV2LCAidHhyeDogdHggJXAsIHJ4ICVwLCBsZW4gJWRcbiIsCi0JCXQtPnR4X2J1ZiwgdC0+cnhfYnVmLCB0LT5sZW4pOwotCi0JaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQotCWh3LT50eCA9IHQtPnR4X2J1ZjsKLQlody0+cnggPSB0LT5yeF9idWY7Ci0JaHctPmxlbiA9IHQtPmxlbjsKLQlody0+Y291bnQgPSAwOwotCi0JLyogc2VuZCB0aGUgZmlyc3QgYnl0ZSAqLwotCWRhdGEgPSBody0+dHggPyBody0+dHhbMF0gOiAwOwotCW91dF84KCZody0+cmVncy0+dHhkLCBkYXRhKTsKLQlvdXRfOCgmaHctPnJlZ3MtPmNyLCBTUElfUFBDNFhYX0NSX1NUUik7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmaHctPmRvbmUpOwotCi0JcmV0dXJuIGh3LT5jb3VudDsKLX0KLQotc3RhdGljIGludCBzcGlfcHBjNHh4X3NldHVweGZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXN0cnVjdCBwcGM0eHhfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXN0cnVjdCBzcGlfcHBjNHh4X2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQlpbnQgc2NyOwotCXU4IGNkbSA9IDA7Ci0JdTMyIHNwZWVkOwotCXU4IGJpdHNfcGVyX3dvcmQ7Ci0KLQkvKiBTdGFydCB3aXRoIHRoZSBnZW5lcmljIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgZGV2aWNlLiAqLwotCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0Jc3BlZWQgPSBzcGktPm1heF9zcGVlZF9oejsKLQotCS8qCi0JICogTW9kaWZ5IHRoZSBjb25maWd1cmF0aW9uIGlmIHRoZSB0cmFuc2ZlciBvdmVycmlkZXMgaXQuICBEbyBub3QgYWxsb3cKLQkgKiB0aGUgdHJhbnNmZXIgdG8gb3ZlcndyaXRlIHRoZSBnZW5lcmljIGNvbmZpZ3VyYXRpb24gd2l0aCB6ZXJvcy4KLQkgKi8KLQlpZiAodCkgewotCQlpZiAodC0+Yml0c19wZXJfd29yZCkKLQkJCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOwotCi0JCWlmICh0LT5zcGVlZF9oeikKLQkJCXNwZWVkID0gbWluKHQtPnNwZWVkX2h6LCBzcGktPm1heF9zcGVlZF9oeik7Ci0JfQotCi0JaWYgKGJpdHNfcGVyX3dvcmQgIT0gOCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgYml0cy1wZXItd29yZCAoJWQpXG4iLAotCQkJCWJpdHNfcGVyX3dvcmQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIXNwZWVkIHx8IChzcGVlZCA+IHNwaS0+bWF4X3NwZWVkX2h6KSkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgc3BlZWRfaHogKCVkKVxuIiwgc3BlZWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBXcml0ZSBuZXcgY29uZmlncmF0aW9uICovCi0Jb3V0XzgoJmh3LT5yZWdzLT5tb2RlLCBjcy0+bW9kZSk7Ci0KLQkvKiBTZXQgdGhlIGNsb2NrICovCi0JLyogb3BiX2ZyZXEgd2FzIGFscmVhZHkgZGl2aWRlZCBieSA0ICovCi0Jc2NyID0gKGh3LT5vcGJfZnJlcSAvIHNwZWVkKSAtIDE7Ci0JaWYgKHNjciA+IDApCi0JCWNkbSA9IG1pbihzY3IsIDB4ZmYpOwotCi0JZGV2X2RiZygmc3BpLT5kZXYsICJzZXR0aW5nIHByZS1zY2FsZXIgdG8gJWQgKGh6ICVkKVxuIiwgY2RtLCBzcGVlZCk7Ci0KLQlpZiAoaW5fOCgmaHctPnJlZ3MtPmNkbSkgIT0gY2RtKQotCQlvdXRfOCgmaHctPnJlZ3MtPmNkbSwgY2RtKTsKLQotCXNwaW5fbG9jaygmaHctPmJpdGJhbmcubG9jayk7Ci0JaWYgKCFody0+Yml0YmFuZy5idXN5KSB7Ci0JCWh3LT5iaXRiYW5nLmNoaXBzZWxlY3Qoc3BpLCBCSVRCQU5HX0NTX0lOQUNUSVZFKTsKLQkJLyogTmVlZCB0byBuZGVsYXkgaGVyZT8gKi8KLQl9Ci0Jc3Bpbl91bmxvY2soJmh3LT5iaXRiYW5nLmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3BpX3BwYzR4eF9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBzcGlfcHBjNHh4X2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQotCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgIT0gOCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgYml0cy1wZXItd29yZCAoJWQpXG4iLAotCQkJc3BpLT5iaXRzX3Blcl93b3JkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFzcGktPm1heF9zcGVlZF9oeikgewotCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgbWF4X3NwZWVkX2h6IChtdXN0IGJlIG5vbi16ZXJvKVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChjcyA9PSBOVUxMKSB7Ci0JCWNzID0ga3phbGxvYyhzaXplb2YgKmNzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjcykKLQkJCXJldHVybiAtRU5PTUVNOwotCQlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBjczsKLQl9Ci0KLQkvKgotCSAqIFdlIHNldCBhbGwgYml0cyBvZiB0aGUgU1BJMF9NT0RFIHJlZ2lzdGVyLCBzbywKLQkgKiBubyBuZWVkIHRvIHJlYWQtbW9kaWZ5LXdyaXRlCi0JICovCi0JY3MtPm1vZGUgPSBTUElfUFBDNFhYX01PREVfU1BFOwotCi0Jc3dpdGNoIChzcGktPm1vZGUgJiAoU1BJX0NQSEEgfCBTUElfQ1BPTCkpIHsKLQljYXNlIFNQSV9NT0RFXzA6Ci0JCWNzLT5tb2RlIHw9IFNQSV9DTEtfTU9ERTA7Ci0JCWJyZWFrOwotCWNhc2UgU1BJX01PREVfMToKLQkJY3MtPm1vZGUgfD0gU1BJX0NMS19NT0RFMTsKLQkJYnJlYWs7Ci0JY2FzZSBTUElfTU9ERV8yOgotCQljcy0+bW9kZSB8PSBTUElfQ0xLX01PREUyOwotCQlicmVhazsKLQljYXNlIFNQSV9NT0RFXzM6Ci0JCWNzLT5tb2RlIHw9IFNQSV9DTEtfTU9ERTM7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKQotCQljcy0+bW9kZSB8PSBTUElfUFBDNFhYX01PREVfUkQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3BpX3BwYzR4eF9jaGlwc2VsKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgcHBjNHh4X3NwaSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQl1bnNpZ25lZCBpbnQgY3MgPSBzcGktPmNoaXBfc2VsZWN0OwotCXVuc2lnbmVkIGludCBjc3BvbDsKLQotCS8qCi0JICogSWYgdGhlcmUgYXJlIG5vIGNoaXAgc2VsZWN0cyBhdCBhbGwsIG9yIGlmIHRoaXMgaXMgdGhlIHNwZWNpYWwKLQkgKiBjYXNlIG9mIGEgbm9uLWV4aXN0ZW50IChkdW1teSkgY2hpcCBzZWxlY3QsIGRvIG5vdGhpbmcuCi0JICovCi0KLQlpZiAoIWh3LT5tYXN0ZXItPm51bV9jaGlwc2VsZWN0IHx8IGh3LT5ncGlvc1tjc10gPT0gLUVFWElTVCkKLQkJcmV0dXJuOwotCi0JY3Nwb2wgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCA/IDEgOiAwOwotCWlmICh2YWx1ZSA9PSBCSVRCQU5HX0NTX0lOQUNUSVZFKQotCQljc3BvbCA9ICFjc3BvbDsKLQotCWdwaW9fc2V0X3ZhbHVlKGh3LT5ncGlvc1tjc10sIGNzcG9sKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHNwaV9wcGM0eHhfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgcHBjNHh4X3NwaSAqaHc7Ci0JdTggc3RhdHVzOwotCXU4IGRhdGE7Ci0JdW5zaWduZWQgaW50IGNvdW50OwotCi0JaHcgPSAoc3RydWN0IHBwYzR4eF9zcGkgKilkZXZfaWQ7Ci0KLQlzdGF0dXMgPSBpbl84KCZody0+cmVncy0+c3IpOwotCWlmICghc3RhdHVzKQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQkvKgotCSAqIEJTWSBkZS1hc3NlcnRzIG9uZSBjeWNsZSBhZnRlciB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuICBUaGUKLQkgKiBpbnRlcnJ1cHQgaXMgYXNzZXJ0ZWQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLiAgVGhlIGV4YWN0Ci0JICogcmVsYXRpb25zaGlwIGlzIG5vdCBkb2N1bWVudGVkLCBoZW5jZSB0aGlzIGNvZGUuCi0JICovCi0KLQlpZiAodW5saWtlbHkoc3RhdHVzICYgU1BJX1BQQzRYWF9TUl9CU1kpKSB7Ci0JCXU4IGxzdGF0dXM7Ci0JCWludCBjbnQgPSAwOwotCi0JCWRldl9kYmcoaHctPmRldiwgImdvdCBpbnRlcnJ1cHQgYnV0IHNwaSBzdGlsbCBidXN5P1xuIik7Ci0JCWRvIHsKLQkJCW5kZWxheSgxMCk7Ci0JCQlsc3RhdHVzID0gaW5fOCgmaHctPnJlZ3MtPnNyKTsKLQkJfSB3aGlsZSAoKytjbnQgPCAxMDAgJiYgbHN0YXR1cyAmIFNQSV9QUEM0WFhfU1JfQlNZKTsKLQotCQlpZiAoY250ID49IDEwMCkgewotCQkJZGV2X2Vycihody0+ZGV2LCAiYnVzeXdhaXQ6IHRvbyBtYW55IGxvb3BzIVxuIik7Ci0JCQljb21wbGV0ZSgmaHctPmRvbmUpOwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9IGVsc2UgewotCQkJLyogc3RhdHVzIGlzIGFsd2F5cyAxIChSQlIpIGhlcmUgKi8KLQkJCXN0YXR1cyA9IGluXzgoJmh3LT5yZWdzLT5zcik7Ci0JCQlkZXZfZGJnKGh3LT5kZXYsICJsb29wcyAlZCBzdGF0dXMgJXhcbiIsIGNudCwgc3RhdHVzKTsKLQkJfQotCX0KLQotCWNvdW50ID0gaHctPmNvdW50OwotCWh3LT5jb3VudCsrOwotCi0JLyogUkJSIHRyaWdnZXJlZCB0aGlzIGludGVycnVwdC4gIFRoZXJlZm9yZSwgZGF0YSBtdXN0IGJlIHJlYWR5LiAqLwotCWRhdGEgPSBpbl84KCZody0+cmVncy0+cnhkKTsKLQlpZiAoaHctPnJ4KQotCQlody0+cnhbY291bnRdID0gZGF0YTsKLQotCWNvdW50Kys7Ci0KLQlpZiAoY291bnQgPCBody0+bGVuKSB7Ci0JCWRhdGEgPSBody0+dHggPyBody0+dHhbY291bnRdIDogMDsKLQkJb3V0XzgoJmh3LT5yZWdzLT50eGQsIGRhdGEpOwotCQlvdXRfOCgmaHctPnJlZ3MtPmNyLCBTUElfUFBDNFhYX0NSX1NUUik7Ci0JfSBlbHNlIHsKLQkJY29tcGxldGUoJmh3LT5kb25lKTsKLQl9Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNwaV9wcGM0eHhfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCWtmcmVlKHNwaS0+Y29udHJvbGxlcl9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNwaV9wcGM0eHhfZW5hYmxlKHN0cnVjdCBwcGM0eHhfc3BpICpodykKLXsKLQkvKgotCSAqIE9uIGFsbCA0eHggUFBDJ3MgdGhlIFNQSSBidXMgaXMgc2hhcmVkL211bHRpcGxleGVkIHdpdGgKLQkgKiB0aGUgMm5kIEkyQyBidXMuIFdlIG5lZWQgdG8gZW5hYmxlIHRoZSB0aGUgU1BJIGJ1cyBiZWZvcmUKLQkgKiB1c2luZyBpdC4KLQkgKi8KLQotCS8qIG5lZWQgdG8gY2xlYXIgYml0IDE0IHRvIGVuYWJsZSBTUEMgKi8KLQlkY3JpX2NscnNldChTRFIwLCBTRFIwX1BGQzEsIDB4ODAwMDAwMDAgPj4gMTQsIDApOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2dwaW9zKHN0cnVjdCBwcGM0eHhfc3BpICpodykKLXsKLQlpZiAoaHctPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBody0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdDsgaSsrKQotCQkJaWYgKGdwaW9faXNfdmFsaWQoaHctPmdwaW9zW2ldKSkKLQkJCQlncGlvX2ZyZWUoaHctPmdwaW9zW2ldKTsKLQotCQlrZnJlZShody0+Z3Bpb3MpOwotCQlody0+Z3Bpb3MgPSBOVUxMOwotCX0KLX0KLQotLyoKLSAqIHBsYXRmb3JtX2RldmljZSBsYXllciBzdHVmZi4uLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBzcGlfcHBjNHh4X29mX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wKQotewotCXN0cnVjdCBwcGM0eHhfc3BpICpodzsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCBzcGlfYml0YmFuZyAqYmJwOwotCXN0cnVjdCByZXNvdXJjZSByZXNvdXJjZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb3AtPmRldi5vZl9ub2RlOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZvcC0+ZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb3BibnA7Ci0JaW50IHJldDsKLQlpbnQgbnVtX2dwaW9zOwotCWNvbnN0IHVuc2lnbmVkIGludCAqY2xrOwotCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZiAqaHcpOwotCWlmIChtYXN0ZXIgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWFzdGVyLT5kZXYub2Zfbm9kZSA9IG5wOwotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7Ci0JaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0JaHctPm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7Ci0JaHctPmRldiA9IGRldjsKLQotCWluaXRfY29tcGxldGlvbigmaHctPmRvbmUpOwotCi0JLyoKLQkgKiBBIGNvdW50IG9mIHplcm8gaW1wbGllcyBhIHNpbmdsZSBTUEkgZGV2aWNlIHdpdGhvdXQgYW55IGNoaXAtc2VsZWN0LgotCSAqIE5vdGUgdGhhdCBvZl9ncGlvX2NvdW50IGNvdW50cyBhbGwgZ3Bpb3MgYXNzaWduZWQgdG8gdGhpcyBzcGkgbWFzdGVyLgotCSAqIFRoaXMgaW5jbHVkZXMgYm90aCAibnVsbCIgZ3BpbydzIGFuZCByZWFsIG9uZXMuCi0JICovCi0JbnVtX2dwaW9zID0gb2ZfZ3Bpb19jb3VudChucCk7Ci0JaWYgKG51bV9ncGlvcykgewotCQlpbnQgaTsKLQotCQlody0+Z3Bpb3MgPSBremFsbG9jKHNpemVvZihpbnQpICogbnVtX2dwaW9zLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFody0+Z3Bpb3MpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGZyZWVfbWFzdGVyOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IG51bV9ncGlvczsgaSsrKSB7Ci0JCQlpbnQgZ3BpbzsKLQkJCWVudW0gb2ZfZ3Bpb19mbGFncyBmbGFnczsKLQotCQkJZ3BpbyA9IG9mX2dldF9ncGlvX2ZsYWdzKG5wLCBpLCAmZmxhZ3MpOwotCQkJaHctPmdwaW9zW2ldID0gZ3BpbzsKLQotCQkJaWYgKGdwaW9faXNfdmFsaWQoZ3BpbykpIHsKLQkJCQkvKiBSZWFsIENTIC0gc2V0IHRoZSBpbml0aWFsIHN0YXRlLiAqLwotCQkJCXJldCA9IGdwaW9fcmVxdWVzdChncGlvLCBucC0+bmFtZSk7Ci0JCQkJaWYgKHJldCA8IDApIHsKLQkJCQkJZGV2X2VycihkZXYsICJjYW4ndCByZXF1ZXN0IGdwaW8gIgotCQkJCQkJCSIjJWQ6ICVkXG4iLCBpLCByZXQpOwotCQkJCQlnb3RvIGZyZWVfZ3Bpb3M7Ci0JCQkJfQotCi0JCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sCi0JCQkJCQkhIShmbGFncyAmIE9GX0dQSU9fQUNUSVZFX0xPVykpOwotCQkJfSBlbHNlIGlmIChncGlvID09IC1FRVhJU1QpIHsKLQkJCQk7IC8qIE5vIENTLCBidXQgdGhhdCdzIE9LLiAqLwotCQkJfSBlbHNlIHsKLQkJCQlkZXZfZXJyKGRldiwgImludmFsaWQgZ3BpbyAjJWQ6ICVkXG4iLCBpLCBncGlvKTsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWdvdG8gZnJlZV9ncGlvczsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFNldHVwIHRoZSBzdGF0ZSBmb3IgdGhlIGJpdGJhbmcgZHJpdmVyICovCi0JYmJwID0gJmh3LT5iaXRiYW5nOwotCWJicC0+bWFzdGVyID0gaHctPm1hc3RlcjsKLQliYnAtPnNldHVwX3RyYW5zZmVyID0gc3BpX3BwYzR4eF9zZXR1cHhmZXI7Ci0JYmJwLT5jaGlwc2VsZWN0ID0gc3BpX3BwYzR4eF9jaGlwc2VsOwotCWJicC0+dHhyeF9idWZzID0gc3BpX3BwYzR4eF90eHJ4OwotCWJicC0+dXNlX2RtYSA9IDA7Ci0JYmJwLT5tYXN0ZXItPnNldHVwID0gc3BpX3BwYzR4eF9zZXR1cDsKLQliYnAtPm1hc3Rlci0+Y2xlYW51cCA9IHNwaV9wcGM0eHhfY2xlYW51cDsKLQotCS8qIEFsbG9jYXRlIGJ1cyBudW0gZHluYW1pY2FsbHkuICovCi0JYmJwLT5tYXN0ZXItPmJ1c19udW0gPSAtMTsKLQotCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLwotCWJicC0+bWFzdGVyLT5tb2RlX2JpdHMgPQotCQlTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX0NTX0hJR0ggfCBTUElfTFNCX0ZJUlNUOwotCi0JLyogdGhpcyBtYW55IHBpbnMgaW4gYWxsIEdQSU8gY29udHJvbGxlcnMgKi8KLQliYnAtPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBudW1fZ3Bpb3M7Ci0KLQkvKiBHZXQgdGhlIGNsb2NrIGZvciB0aGUgT1BCICovCi0Jb3BibnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiaWJtLG9wYiIpOwotCWlmIChvcGJucCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiT1BCOiBjYW5ub3QgZmluZCBub2RlXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBmcmVlX2dwaW9zOwotCX0KLQkvKiBHZXQgdGhlIGNsb2NrIChIeikgZm9yIHRoZSBPUEIgKi8KLQljbGsgPSBvZl9nZXRfcHJvcGVydHkob3BibnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKLQlpZiAoY2xrID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJPUEI6IG5vIGNsb2NrLWZyZXF1ZW5jeSBwcm9wZXJ0eSBzZXRcbiIpOwotCQlvZl9ub2RlX3B1dChvcGJucCk7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZnJlZV9ncGlvczsKLQl9Ci0JaHctPm9wYl9mcmVxID0gKmNsazsKLQlody0+b3BiX2ZyZXEgPj49IDI7Ci0Jb2Zfbm9kZV9wdXQob3BibnApOwotCi0JcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlc291cmNlKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAiZXJyb3Igd2hpbGUgcGFyc2luZyBkZXZpY2Ugbm9kZSByZXNvdXJjZVxuIik7Ci0JCWdvdG8gZnJlZV9ncGlvczsKLQl9Ci0JaHctPm1hcGJhc2UgPSByZXNvdXJjZS5zdGFydDsKLQlody0+bWFwc2l6ZSA9IHJlc291cmNlLmVuZCAtIHJlc291cmNlLnN0YXJ0ICsgMTsKLQotCS8qIFNhbml0eSBjaGVjayAqLwotCWlmIChody0+bWFwc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgc3BpX3BwYzR4eF9yZWdzKSkgewotCQlkZXZfZXJyKGRldiwgInRvbyBzbWFsbCB0byBtYXAgcmVnaXN0ZXJzXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmcmVlX2dwaW9zOwotCX0KLQotCS8qIFJlcXVlc3QgSVJRICovCi0JaHctPmlycW51bSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQlyZXQgPSByZXF1ZXN0X2lycShody0+aXJxbnVtLCBzcGlfcHBjNHh4X2ludCwKLQkJCSAgSVJRRl9ESVNBQkxFRCwgInNwaV9wcGM0eHhfb2YiLCAodm9pZCAqKWh3KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdFxuIik7Ci0JCWdvdG8gZnJlZV9ncGlvczsKLQl9Ci0KLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihody0+bWFwYmFzZSwgaHctPm1hcHNpemUsIERSSVZFUl9OQU1FKSkgewotCQlkZXZfZXJyKGRldiwgInJlc291cmNlIHVuYXZhaWxhYmxlXG4iKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIHJlcXVlc3RfbWVtX2Vycm9yOwotCX0KLQotCWh3LT5yZWdzID0gaW9yZW1hcChody0+bWFwYmFzZSwgc2l6ZW9mKHN0cnVjdCBzcGlfcHBjNHh4X3JlZ3MpKTsKLQotCWlmICghaHctPnJlZ3MpIHsKLQkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gbWVtb3J5IG1hcCByZWdpc3RlcnNcbiIpOwotCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gbWFwX2lvX2Vycm9yOwotCX0KLQotCXNwaV9wcGM0eHhfZW5hYmxlKGh3KTsKLQotCS8qIEZpbmFsbHkgcmVnaXN0ZXIgb3VyIHNwaSBjb250cm9sbGVyICovCi0JZGV2LT5kbWFfbWFzayA9IDA7Ci0JcmV0ID0gc3BpX2JpdGJhbmdfc3RhcnQoYmJwKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIFNQSSBtYXN0ZXJcbiIpOwotCQlnb3RvIHVubWFwX3JlZ3M7Ci0JfQotCi0JZGV2X2luZm8oZGV2LCAiZHJpdmVyIGluaXRpYWxpemVkXG4iKTsKLQotCXJldHVybiAwOwotCi11bm1hcF9yZWdzOgotCWlvdW5tYXAoaHctPnJlZ3MpOwotbWFwX2lvX2Vycm9yOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihody0+bWFwYmFzZSwgaHctPm1hcHNpemUpOwotcmVxdWVzdF9tZW1fZXJyb3I6Ci0JZnJlZV9pcnEoaHctPmlycW51bSwgaHcpOwotZnJlZV9ncGlvczoKLQlmcmVlX2dwaW9zKGh3KTsKLWZyZWVfbWFzdGVyOgotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0KLQlkZXZfZXJyKGRldiwgImluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgc3BpX3BwYzR4eF9vZl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApCi17Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7Ci0Jc3RydWN0IHBwYzR4eF9zcGkgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCi0Jc3BpX2JpdGJhbmdfc3RvcCgmaHctPmJpdGJhbmcpOwotCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGh3LT5tYXBiYXNlLCBody0+bWFwc2l6ZSk7Ci0JZnJlZV9pcnEoaHctPmlycW51bSwgaHcpOwotCWlvdW5tYXAoaHctPnJlZ3MpOwotCWZyZWVfZ3Bpb3MoaHcpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzcGlfcHBjNHh4X29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJpYm0scHBjNHh4LXNwaSIsIH0sCi0Je30sCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzcGlfcHBjNHh4X29mX21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3BpX3BwYzR4eF9vZl9kcml2ZXIgPSB7Ci0JLnByb2JlID0gc3BpX3BwYzR4eF9vZl9wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3Aoc3BpX3BwYzR4eF9vZl9yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gRFJJVkVSX05BTUUsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBzcGlfcHBjNHh4X29mX21hdGNoLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzcGlfcHBjNHh4X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzcGlfcHBjNHh4X29mX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChzcGlfcHBjNHh4X2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3BpX3BwYzR4eF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwaV9wcGM0eHhfb2ZfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHNwaV9wcGM0eHhfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkdhcnkgSmVubmVqb2huICYgU3RlZmFuIFJvZXNlIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSBQUEM0eHggU1BJIERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYyBiL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNWZjYWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYworKysgL2Rldi9udWxsCkBAIC0xLDc0NiArMCwwIEBACi0vKiBsaW51eC9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEJlbiBEb29rcwotICogQ29weXJpZ2h0IDIwMDYtMjAwOSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNwaS5oPgotI2luY2x1ZGUgPG1hY2gvc3BpLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2ZpcS5oPgotI2luY2x1ZGUgPGFzbS9maXEuaD4KLQotI2luY2x1ZGUgInNwaV9zM2MyNHh4X2ZpcS5oIgotCi0vKioKLSAqIHMzYzI0eHhfc3BpX2RldnN0YXRlIC0gcGVyIGRldmljZSBkYXRhCi0gKiBAaHo6IExhc3QgZnJlcXVlbmN5IGNhbGN1bGF0ZWQgZm9yIEBzcHByZSBmaWVsZC4KLSAqIEBtb2RlOiBMYXN0IG1vZGUgc2V0dGluZyBmb3IgdGhlIEBzcGNvbiBmaWVsZC4KLSAqIEBzcGNvbjogVmFsdWUgdG8gd3JpdGUgdG8gdGhlIFNQQ09OIHJlZ2lzdGVyLgotICogQHNwcHJlOiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgU1BQUkUgcmVnaXN0ZXIuCi0gKi8KLXN0cnVjdCBzM2MyNHh4X3NwaV9kZXZzdGF0ZSB7Ci0JdW5zaWduZWQgaW50CWh6OwotCXVuc2lnbmVkIGludAltb2RlOwotCXU4CQlzcGNvbjsKLQl1OAkJc3BwcmU7Ci19OwotCi1lbnVtIHNwaV9maXFfbW9kZSB7Ci0JRklRX01PREVfTk9ORQk9IDAsCi0JRklRX01PREVfVFgJPSAxLAotCUZJUV9NT0RFX1JYCT0gMiwKLQlGSVFfTU9ERV9UWFJYCT0gMywKLX07Ci0KLXN0cnVjdCBzM2MyNHh4X3NwaSB7Ci0JLyogYml0YmFuZyBoYXMgdG8gYmUgZmlyc3QgKi8KLQlzdHJ1Y3Qgc3BpX2JpdGJhbmcJIGJpdGJhbmc7Ci0Jc3RydWN0IGNvbXBsZXRpb24JIGRvbmU7Ci0KLQl2b2lkIF9faW9tZW0JCSpyZWdzOwotCWludAkJCSBpcnE7Ci0JaW50CQkJIGxlbjsKLQlpbnQJCQkgY291bnQ7Ci0KLQlzdHJ1Y3QgZmlxX2hhbmRsZXIJIGZpcV9oYW5kbGVyOwotCWVudW0gc3BpX2ZpcV9tb2RlCSBmaXFfbW9kZTsKLQl1bnNpZ25lZCBjaGFyCQkgZmlxX2ludXNlOwotCXVuc2lnbmVkIGNoYXIJCSBmaXFfY2xhaW1lZDsKLQotCXZvaWQJCQkoKnNldF9jcykoc3RydWN0IHMzYzI0MTBfc3BpX2luZm8gKnNwaSwKLQkJCQkJICBpbnQgY3MsIGludCBwb2wpOwotCi0JLyogZGF0YSBidWZmZXJzICovCi0JY29uc3QgdW5zaWduZWQgY2hhcgkqdHg7Ci0JdW5zaWduZWQgY2hhcgkJKnJ4OwotCi0Jc3RydWN0IGNsawkJKmNsazsKLQlzdHJ1Y3QgcmVzb3VyY2UJCSppb2FyZWE7Ci0Jc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKLQlzdHJ1Y3Qgc3BpX2RldmljZQkqY3VyZGV2OwotCXN0cnVjdCBkZXZpY2UJCSpkZXY7Ci0Jc3RydWN0IHMzYzI0MTBfc3BpX2luZm8gKnBkYXRhOwotfTsKLQotCi0jZGVmaW5lIFNQQ09OX0RFRkFVTFQgKFMzQzI0MTBfU1BDT05fTVNUUiB8IFMzQzI0MTBfU1BDT05fU01PRF9JTlQpCi0jZGVmaW5lIFNQUElOX0RFRkFVTFQgKFMzQzI0MTBfU1BQSU5fS0VFUCkKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4eF9zcGkgKnRvX2h3KHN0cnVjdCBzcGlfZGV2aWNlICpzZGV2KQotewotCXJldHVybiBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNkZXYtPm1hc3Rlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzYzI0eHhfc3BpX2dwaW9jcyhzdHJ1Y3QgczNjMjQxMF9zcGlfaW5mbyAqc3BpLCBpbnQgY3MsIGludCBwb2wpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoc3BpLT5waW5fY3MsIHBvbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzYzI0eHhfc3BpX2NoaXBzZWwoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQotewotCXN0cnVjdCBzM2MyNHh4X3NwaV9kZXZzdGF0ZSAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7Ci0Jc3RydWN0IHMzYzI0eHhfc3BpICpodyA9IHRvX2h3KHNwaSk7Ci0JdW5zaWduZWQgaW50IGNzcG9sID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0ggPyAxIDogMDsKLQotCS8qIGNoYW5nZSB0aGUgY2hpcHNlbGVjdCBzdGF0ZSBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzcGkgZW5naW5lIGNsb2NrICovCi0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSBCSVRCQU5HX0NTX0lOQUNUSVZFOgotCQlody0+c2V0X2NzKGh3LT5wZGF0YSwgc3BpLT5jaGlwX3NlbGVjdCwgY3Nwb2xeMSk7Ci0JCXdyaXRlYihjcy0+c3Bjb24sIGh3LT5yZWdzICsgUzNDMjQxMF9TUENPTik7Ci0JCWJyZWFrOwotCi0JY2FzZSBCSVRCQU5HX0NTX0FDVElWRToKLQkJd3JpdGViKGNzLT5zcGNvbiB8IFMzQzI0MTBfU1BDT05fRU5TQ0ssCi0JCSAgICAgICBody0+cmVncyArIFMzQzI0MTBfU1BDT04pOwotCQlody0+c2V0X2NzKGh3LT5wZGF0YSwgc3BpLT5jaGlwX3NlbGVjdCwgY3Nwb2wpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjR4eF9zcGlfdXBkYXRlX3N0YXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0Jc3RydWN0IHMzYzI0eHhfc3BpICpodyA9IHRvX2h3KHNwaSk7Ci0Jc3RydWN0IHMzYzI0eHhfc3BpX2RldnN0YXRlICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQl1bnNpZ25lZCBpbnQgYnB3OwotCXVuc2lnbmVkIGludCBoejsKLQl1bnNpZ25lZCBpbnQgZGl2OwotCXVuc2lnbmVkIGxvbmcgY2xrOwotCi0JYnB3ID0gdCA/IHQtPmJpdHNfcGVyX3dvcmQgOiBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaHogID0gdCA/IHQtPnNwZWVkX2h6IDogc3BpLT5tYXhfc3BlZWRfaHo7Ci0KLQlpZiAoIWJwdykKLQkJYnB3ID0gODsKLQotCWlmICghaHopCi0JCWh6ID0gc3BpLT5tYXhfc3BlZWRfaHo7Ci0KLQlpZiAoYnB3ICE9IDgpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJpbnZhbGlkIGJpdHMtcGVyLXdvcmQgKCVkKVxuIiwgYnB3KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHNwaS0+bW9kZSAhPSBjcy0+bW9kZSkgewotCQl1OCBzcGNvbiA9IFNQQ09OX0RFRkFVTFQgfCBTM0MyNDEwX1NQQ09OX0VOU0NLOwotCi0JCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKLQkJCXNwY29uIHw9IFMzQzI0MTBfU1BDT05fQ1BIQV9GTVRCOwotCi0JCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKLQkJCXNwY29uIHw9IFMzQzI0MTBfU1BDT05fQ1BPTF9ISUdIOwotCi0JCWNzLT5tb2RlID0gc3BpLT5tb2RlOwotCQljcy0+c3Bjb24gPSBzcGNvbjsKLQl9Ci0KLQlpZiAoY3MtPmh6ICE9IGh6KSB7Ci0JCWNsayA9IGNsa19nZXRfcmF0ZShody0+Y2xrKTsKLQkJZGl2ID0gRElWX1JPVU5EX1VQKGNsaywgaHogKiAyKSAtIDE7Ci0KLQkJaWYgKGRpdiA+IDI1NSkKLQkJCWRpdiA9IDI1NTsKLQotCQlkZXZfZGJnKCZzcGktPmRldiwgInByZS1zY2FsZXI9JWQgKHdhbnRlZCAlZCwgZ290ICVsZClcbiIsCi0JCQlkaXYsIGh6LCBjbGsgLyAoMiAqIChkaXYgKyAxKSkpOwotCi0JCWNzLT5oeiA9IGh6OwotCQljcy0+c3BwcmUgPSBkaXY7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjR4eF9zcGlfc2V0dXB4ZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCQkJIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCi17Ci0Jc3RydWN0IHMzYzI0eHhfc3BpX2RldnN0YXRlICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gdG9faHcoc3BpKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gczNjMjR4eF9zcGlfdXBkYXRlX3N0YXRlKHNwaSwgdCk7Ci0JaWYgKCFyZXQpCi0JCXdyaXRlYihjcy0+c3BwcmUsIGh3LT5yZWdzICsgUzNDMjQxMF9TUFBSRSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHMzYzI0eHhfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IHMzYzI0eHhfc3BpX2RldnN0YXRlICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gdG9faHcoc3BpKTsKLQlpbnQgcmV0OwotCi0JLyogYWxsb2NhdGUgc2V0dGluZ3Mgb24gdGhlIGZpcnN0IGNhbGwgKi8KLQlpZiAoIWNzKSB7Ci0JCWNzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHMzYzI0eHhfc3BpX2RldnN0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY3MpIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gbWVtb3J5IGZvciBjb250cm9sbGVyIHN0YXRlXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJY3MtPnNwY29uID0gU1BDT05fREVGQVVMVDsKLQkJY3MtPmh6ID0gLTE7Ci0JCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IGNzOwotCX0KLQotCS8qIGluaXRpYWxpc2UgdGhlIHN0YXRlIGZyb20gdGhlIGRldmljZSAqLwotCXJldCA9IHMzYzI0eHhfc3BpX3VwZGF0ZV9zdGF0ZShzcGksIE5VTEwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlzcGluX2xvY2soJmh3LT5iaXRiYW5nLmxvY2spOwotCWlmICghaHctPmJpdGJhbmcuYnVzeSkgewotCQlody0+Yml0YmFuZy5jaGlwc2VsZWN0KHNwaSwgQklUQkFOR19DU19JTkFDVElWRSk7Ci0JCS8qIG5lZWQgdG8gbmRlbGF5IGZvciAwLjUgY2xvY2t0aWNrID8gKi8KLQl9Ci0Jc3Bpbl91bmxvY2soJmh3LT5iaXRiYW5nLmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzYzI0eHhfc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlrZnJlZShzcGktPmNvbnRyb2xsZXJfc3RhdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBod190eGJ5dGUoc3RydWN0IHMzYzI0eHhfc3BpICpodywgaW50IGNvdW50KQotewotCXJldHVybiBody0+dHggPyBody0+dHhbY291bnRdIDogMDsKLX0KLQotI2lmZGVmIENPTkZJR19TUElfUzNDMjRYWF9GSVEKLS8qIFN1cHBvcnQgZm9yIEZJUSBiYXNlZCBwc2V1ZG8tRE1BIHRvIGltcHJvdmUgdGhlIHRyYW5zZmVyIHNwZWVkLgotICoKLSAqIFRoaXMgY29kZSB1c2VzIHRoZSBhc3NlbWJseSBoZWxwZXIgaW4gc3BpX3MzYzI0eHhfc3BpLlMgd2hpY2ggaXMKLSAqIHVzZWQgYnkgdGhlIEZJUSBjb3JlIHRvIG1vdmUgZGF0YSBiZXR3ZWVuIG1haW4gbWVtb3J5IGFuZCB0aGUgcGVyaXBoZXJhbAotICogYmxvY2suIFNpbmNlIHRoaXMgaXMgY29kZSBydW5uaW5nIG9uIHRoZSBwcm9jZXNzb3IsIHRoZXJlIGlzIG5vIHByb2JsZW0KLSAqIHdpdGggY2FjaGUgY29oZXJlbmN5IG9mIHRoZSBidWZmZXJzLCBzbyB3ZSBjYW4gdXNlIGFueSBidWZmZXIgd2UgbGlrZS4KLSAqLwotCi0vKioKLSAqIHN0cnVjdCBzcGlfZmlxX2NvZGUgLSBGSVEgY29kZSBhbmQgaGVhZGVyCi0gKiBAbGVuZ3RoOiBUaGUgbGVuZ3RoIG9mIHRoZSBjb2RlIGZyYWdtZW50LCBleGNsdWRpbmcgdGhpcyBoZWFkZXIuCi0gKiBAYWNrX29mZnNldDogVGhlIG9mZnNldCBmcm9tIEBkYXRhIHRvIHRoZSB3b3JkIHRvIHBsYWNlIHRoZSBJUlEgQUNLIGJpdCBhdC4KLSAqIEBkYXRhOiBUaGUgY29kZSBpdHNlbGYgdG8gaW5zdGFsbCBhcyBhIEZJUSBoYW5kbGVyLgotICovCi1zdHJ1Y3Qgc3BpX2ZpcV9jb2RlIHsKLQl1MzIJbGVuZ3RoOwotCXUzMglhY2tfb2Zmc2V0OwotCXU4CWRhdGFbMF07Ci19OwotCi1leHRlcm4gc3RydWN0IHNwaV9maXFfY29kZSBzM2MyNHh4X3NwaV9maXFfdHhyeDsKLWV4dGVybiBzdHJ1Y3Qgc3BpX2ZpcV9jb2RlIHMzYzI0eHhfc3BpX2ZpcV90eDsKLWV4dGVybiBzdHJ1Y3Qgc3BpX2ZpcV9jb2RlIHMzYzI0eHhfc3BpX2ZpcV9yeDsKLQotLyoqCi0gKiBhY2tfYml0IC0gdHVybiBJUlEgaW50byBJUlEgYWNrbm93bGVkZ2VtZW50IGJpdAotICogQGlycTogVGhlIGludGVycnVwdCBudW1iZXIKLSAqCi0gKiBSZXR1cm5zIHRoZSBiaXQgdG8gd3JpdGUgdG8gdGhlIGludGVycnVwdCBhY2tub3dsZWRnZSByZWdpc3Rlci4KLSAqLwotc3RhdGljIGlubGluZSB1MzIgYWNrX2JpdCh1bnNpZ25lZCBpbnQgaXJxKQotewotCXJldHVybiAxIDw8IChpcnEgLSBJUlFfRUlOVDApOwotfQotCi0vKioKLSAqIHMzYzI0eHhfc3BpX3RyeWZpcSAtIGF0dGVtcHQgdG8gY2xhaW0gYW5kIHNldHVwIEZJUSBmb3IgdHJhbnNmZXIKLSAqIEBodzogVGhlIGhhcmR3YXJlIHN0YXRlLgotICoKLSAqIENsYWltIHRoZSBGSVEgaGFuZGxlciAob25seSBvbmUgY2FuIGJlIGFjdGl2ZSBhdCBhbnkgb25lIHRpbWUpIGFuZAotICogdGhlbiBzZXR1cCB0aGUgY29ycmVjdCB0cmFuc2ZlciBjb2RlIGZvciB0aGlzIHRyYW5zZmVyLgotICoKLSAqIFRoaXMgY2FsbCB1cGRhdGVzIGFsbCB0aGUgbmVjZXNzYXJ5IHN0YXRlIGluZm9ybWF0aW9uIGlmIHN1Y2Nlc3NmdWwsCi0gKiBzbyB0aGUgY2FsbGVyIGRvZXMgbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgbW9yZSB0aGFuIHN0YXJ0IHRoZSB0cmFuc2ZlcgotICogYXMgbm9ybWFsLCBzaW5jZSB0aGUgSVJRIHdpbGwgaGF2ZSBiZWVuIHJlLXJvdXRlZCB0byB0aGUgRklRIGhhbmRsZXIuCi0qLwotdm9pZCBzM2MyNHh4X3NwaV90cnlmaXEoc3RydWN0IHMzYzI0eHhfc3BpICpodykKLXsKLQlzdHJ1Y3QgcHRfcmVncyByZWdzOwotCWVudW0gc3BpX2ZpcV9tb2RlIG1vZGU7Ci0Jc3RydWN0IHNwaV9maXFfY29kZSAqY29kZTsKLQlpbnQgcmV0OwotCi0JaWYgKCFody0+ZmlxX2NsYWltZWQpIHsKLQkJLyogdHJ5IGFuZCBjbGFpbSBmaXEgaWYgd2UgaGF2ZW4ndCBnb3QgaXQsIGFuZCBpZiBub3QKLQkJICogdGhlbiByZXR1cm4gYW5kIHNpbXBseSB1c2UgYW5vdGhlciB0cmFuc2ZlciBtZXRob2QgKi8KLQotCQlyZXQgPSBjbGFpbV9maXEoJmh3LT5maXFfaGFuZGxlcik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm47Ci0JfQotCi0JaWYgKGh3LT50eCAmJiAhaHctPnJ4KQotCQltb2RlID0gRklRX01PREVfVFg7Ci0JZWxzZSBpZiAoaHctPnJ4ICYmICFody0+dHgpCi0JCW1vZGUgPSBGSVFfTU9ERV9SWDsKLQllbHNlCi0JCW1vZGUgPSBGSVFfTU9ERV9UWFJYOwotCi0JcmVncy51cmVnc1tmaXFfcnNwaV0gPSAobG9uZylody0+cmVnczsKLQlyZWdzLnVyZWdzW2ZpcV9ycnhdICA9IChsb25nKWh3LT5yeDsKLQlyZWdzLnVyZWdzW2ZpcV9ydHhdICA9IChsb25nKWh3LT50eCArIDE7Ci0JcmVncy51cmVnc1tmaXFfcmNvdW50XSA9IGh3LT5sZW4gLSAxOwotCXJlZ3MudXJlZ3NbZmlxX3JpcnFdID0gKGxvbmcpUzNDMjRYWF9WQV9JUlE7Ci0KLQlzZXRfZmlxX3JlZ3MoJnJlZ3MpOwotCi0JaWYgKGh3LT5maXFfbW9kZSAhPSBtb2RlKSB7Ci0JCXUzMiAqYWNrX3B0cjsKLQotCQlody0+ZmlxX21vZGUgPSBtb2RlOwotCi0JCXN3aXRjaCAobW9kZSkgewotCQljYXNlIEZJUV9NT0RFX1RYOgotCQkJY29kZSA9ICZzM2MyNHh4X3NwaV9maXFfdHg7Ci0JCQlicmVhazsKLQkJY2FzZSBGSVFfTU9ERV9SWDoKLQkJCWNvZGUgPSAmczNjMjR4eF9zcGlfZmlxX3J4OwotCQkJYnJlYWs7Ci0JCWNhc2UgRklRX01PREVfVFhSWDoKLQkJCWNvZGUgPSAmczNjMjR4eF9zcGlfZmlxX3R4cng7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWNvZGUgPSBOVUxMOwotCQl9Ci0KLQkJQlVHX09OKCFjb2RlKTsKLQotCQlhY2tfcHRyID0gKHUzMiAqKSZjb2RlLT5kYXRhW2NvZGUtPmFja19vZmZzZXRdOwotCQkqYWNrX3B0ciA9IGFja19iaXQoaHctPmlycSk7Ci0KLQkJc2V0X2ZpcV9oYW5kbGVyKCZjb2RlLT5kYXRhLCBjb2RlLT5sZW5ndGgpOwotCX0KLQotCXMzYzI0eHhfc2V0X2ZpcShody0+aXJxLCB0cnVlKTsKLQotCWh3LT5maXFfbW9kZSA9IG1vZGU7Ci0JaHctPmZpcV9pbnVzZSA9IDE7Ci19Ci0KLS8qKgotICogczNjMjR4eF9zcGlfZmlxb3AgLSBGSVEgY29yZSBjb2RlIGNhbGxiYWNrCi0gKiBAcHc6IERhdGEgcmVnaXN0ZXJlZCB3aXRoIHRoZSBoYW5kbGVyCi0gKiBAcmVsZWFzZTogV2hldGhlciB0aGlzIGlzIGEgcmVsZWFzZSBvciBhIHJldHVybi4KLSAqCi0gKiBDYWxsZWQgYnkgdGhlIEZJUSBjb2RlIHdoZW4gYW5vdGhlciBtb2R1bGUgd2FudHMgdG8gdXNlIHRoZSBGSVEsIHNvCi0gKiByZXR1cm4gd2hldGhlciB3ZSBhcmUgY3VycmVudGx5IHVzaW5nIHRoaXMgb3Igbm90IGFuZCB0aGVuIHVwZGF0ZSBvdXIKLSAqIGludGVybmFsIHN0YXRlLgotICovCi1zdGF0aWMgaW50IHMzYzI0eHhfc3BpX2ZpcW9wKHZvaWQgKnB3LCBpbnQgcmVsZWFzZSkKLXsKLQlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gcHc7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAocmVsZWFzZSkgewotCQlpZiAoaHctPmZpcV9pbnVzZSkKLQkJCXJldCA9IC1FQlVTWTsKLQotCQkvKiBub3RlLCB3ZSBkbyBub3QgbmVlZCB0byB1bnJvdXRlIHRoZSBGSVEsIGFzIHRoZSBGSVEKLQkJICogdmVjdG9yIGNvZGUgZGUtcm91dGVzIGl0IHRvIHNpZ25hbCB0aGUgZW5kIG9mIHRyYW5zZmVyICovCi0KLQkJaHctPmZpcV9tb2RlID0gRklRX01PREVfTk9ORTsKLQkJaHctPmZpcV9jbGFpbWVkID0gMDsKLQl9IGVsc2UgewotCQlody0+ZmlxX2NsYWltZWQgPSAxOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogczNjMjR4eF9zcGlfaW5pdGZpcSAtIHNldHVwIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIEZJUSBjb3JlCi0gKiBAaHc6IFRoZSBoYXJkd2FyZSBzdGF0ZS4KLSAqCi0gKiBTZXR1cCB0aGUgZmlxX2hhbmRsZXIgYmxvY2sgdG8gcGFzcyB0byB0aGUgRklRIGNvcmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNHh4X3NwaV9pbml0ZmlxKHN0cnVjdCBzM2MyNHh4X3NwaSAqaHcpCi17Ci0JaHctPmZpcV9oYW5kbGVyLmRldl9pZCA9IGh3OwotCWh3LT5maXFfaGFuZGxlci5uYW1lID0gZGV2X25hbWUoaHctPmRldik7Ci0JaHctPmZpcV9oYW5kbGVyLmZpcV9vcCA9IHMzYzI0eHhfc3BpX2ZpcW9wOwotfQotCi0vKioKLSAqIHMzYzI0eHhfc3BpX3VzZWZpcSAtIHJldHVybiBpZiB3ZSBzaG91bGQgYmUgdXNpbmcgRklRLgotICogQGh3OiBUaGUgaGFyZHdhcmUgc3RhdGUuCi0gKgotICogUmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGRhdGEgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBjaGFubmVsIGlzCi0gKiBhbGxvd2VkIHRvIHVzZSB0aGUgRklRLgotICovCi1zdGF0aWMgaW5saW5lIGJvb2wgczNjMjR4eF9zcGlfdXNlZmlxKHN0cnVjdCBzM2MyNHh4X3NwaSAqaHcpCi17Ci0JcmV0dXJuIGh3LT5wZGF0YS0+dXNlX2ZpcTsKLX0KLQotLyoqCi0gKiBzM2MyNHh4X3NwaV91c2luZ2ZpcSAtIHJldHVybiBpZiBjaGFubmVsIGlzIHVzaW5nIEZJUQotICogQHNwaTogVGhlIGhhcmR3YXJlIHN0YXRlLgotICoKLSAqIFJldHVybiB3aGV0aGVyIHRoZSBjaGFubmVsIGlzIGN1cnJlbnRseSB1c2luZyB0aGUgRklRIChzZXBhcmF0ZSBmcm9tCi0gKiB3aGV0aGVyIHRoZSBGSVEgaXMgY2xhaW1lZCkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBzM2MyNHh4X3NwaV91c2luZ2ZpcShzdHJ1Y3QgczNjMjR4eF9zcGkgKnNwaSkKLXsKLQlyZXR1cm4gc3BpLT5maXFfaW51c2U7Ci19Ci0jZWxzZQotCi1zdGF0aWMgaW5saW5lIHZvaWQgczNjMjR4eF9zcGlfaW5pdGZpcShzdHJ1Y3QgczNjMjR4eF9zcGkgKnMpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIHMzYzI0eHhfc3BpX3RyeWZpcShzdHJ1Y3QgczNjMjR4eF9zcGkgKnMpIHsgfQotc3RhdGljIGlubGluZSBib29sIHMzYzI0eHhfc3BpX3VzZWZpcShzdHJ1Y3QgczNjMjR4eF9zcGkgKnMpIHsgcmV0dXJuIGZhbHNlOyB9Ci1zdGF0aWMgaW5saW5lIGJvb2wgczNjMjR4eF9zcGlfdXNpbmdmaXEoc3RydWN0IHMzYzI0eHhfc3BpICpzKSB7IHJldHVybiBmYWxzZTsgfQotCi0jZW5kaWYgLyogQ09ORklHX1NQSV9TM0MyNFhYX0ZJUSAqLwotCi1zdGF0aWMgaW50IHMzYzI0eHhfc3BpX3R4cngoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKLXsKLQlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gdG9faHcoc3BpKTsKLQotCWh3LT50eCA9IHQtPnR4X2J1ZjsKLQlody0+cnggPSB0LT5yeF9idWY7Ci0JaHctPmxlbiA9IHQtPmxlbjsKLQlody0+Y291bnQgPSAwOwotCi0JaW5pdF9jb21wbGV0aW9uKCZody0+ZG9uZSk7Ci0KLQlody0+ZmlxX2ludXNlID0gMDsKLQlpZiAoczNjMjR4eF9zcGlfdXNlZmlxKGh3KSAmJiB0LT5sZW4gPj0gMykKLQkJczNjMjR4eF9zcGlfdHJ5ZmlxKGh3KTsKLQotCS8qIHNlbmQgdGhlIGZpcnN0IGJ5dGUgKi8KLQl3cml0ZWIoaHdfdHhieXRlKGh3LCAwKSwgaHctPnJlZ3MgKyBTM0MyNDEwX1NQVERBVCk7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZody0+ZG9uZSk7Ci0JcmV0dXJuIGh3LT5jb3VudDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHMzYzI0eHhfc3BpX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCi17Ci0Jc3RydWN0IHMzYzI0eHhfc3BpICpodyA9IGRldjsKLQl1bnNpZ25lZCBpbnQgc3BzdGEgPSByZWFkYihody0+cmVncyArIFMzQzI0MTBfU1BTVEEpOwotCXVuc2lnbmVkIGludCBjb3VudCA9IGh3LT5jb3VudDsKLQotCWlmIChzcHN0YSAmIFMzQzI0MTBfU1BTVEFfRENPTCkgewotCQlkZXZfZGJnKGh3LT5kZXYsICJkYXRhLWNvbGxpc2lvblxuIik7Ci0JCWNvbXBsZXRlKCZody0+ZG9uZSk7Ci0JCWdvdG8gaXJxX2RvbmU7Ci0JfQotCi0JaWYgKCEoc3BzdGEgJiBTM0MyNDEwX1NQU1RBX1JFQURZKSkgewotCQlkZXZfZGJnKGh3LT5kZXYsICJzcGkgbm90IHJlYWR5IGZvciB0eD9cbiIpOwotCQljb21wbGV0ZSgmaHctPmRvbmUpOwotCQlnb3RvIGlycV9kb25lOwotCX0KLQotCWlmICghczNjMjR4eF9zcGlfdXNpbmdmaXEoaHcpKSB7Ci0JCWh3LT5jb3VudCsrOwotCi0JCWlmIChody0+cngpCi0JCQlody0+cnhbY291bnRdID0gcmVhZGIoaHctPnJlZ3MgKyBTM0MyNDEwX1NQUkRBVCk7Ci0KLQkJY291bnQrKzsKLQotCQlpZiAoY291bnQgPCBody0+bGVuKQotCQkJd3JpdGViKGh3X3R4Ynl0ZShodywgY291bnQpLCBody0+cmVncyArIFMzQzI0MTBfU1BUREFUKTsKLQkJZWxzZQotCQkJY29tcGxldGUoJmh3LT5kb25lKTsKLQl9IGVsc2UgewotCQlody0+Y291bnQgPSBody0+bGVuOwotCQlody0+ZmlxX2ludXNlID0gMDsKLQotCQlpZiAoaHctPnJ4KQotCQkJaHctPnJ4W2h3LT5sZW4tMV0gPSByZWFkYihody0+cmVncyArIFMzQzI0MTBfU1BSREFUKTsKLQotCQljb21wbGV0ZSgmaHctPmRvbmUpOwotCX0KLQotIGlycV9kb25lOgotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgczNjMjR4eF9zcGlfaW5pdGlhbHNldHVwKHN0cnVjdCBzM2MyNHh4X3NwaSAqaHcpCi17Ci0JLyogZm9yIHRoZSBtb21lbnQsIHBlcm1hbmVudGx5IGVuYWJsZSB0aGUgY2xvY2sgKi8KLQotCWNsa19lbmFibGUoaHctPmNsayk7Ci0KLQkvKiBwcm9ncmFtIGRlZmF1bHRzIGludG8gdGhlIHJlZ2lzdGVycyAqLwotCi0Jd3JpdGViKDB4ZmYsIGh3LT5yZWdzICsgUzNDMjQxMF9TUFBSRSk7Ci0Jd3JpdGViKFNQUElOX0RFRkFVTFQsIGh3LT5yZWdzICsgUzNDMjQxMF9TUFBJTik7Ci0Jd3JpdGViKFNQQ09OX0RFRkFVTFQsIGh3LT5yZWdzICsgUzNDMjQxMF9TUENPTik7Ci0KLQlpZiAoaHctPnBkYXRhKSB7Ci0JCWlmIChody0+c2V0X2NzID09IHMzYzI0eHhfc3BpX2dwaW9jcykKLQkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChody0+cGRhdGEtPnBpbl9jcywgMSk7Ci0KLQkJaWYgKGh3LT5wZGF0YS0+Z3Bpb19zZXR1cCkKLQkJCWh3LT5wZGF0YS0+Z3Bpb19zZXR1cChody0+cGRhdGEsIDEpOwotCX0KLX0KLQotc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgczNjMjQxMF9zcGlfaW5mbyAqcGRhdGE7Ci0Jc3RydWN0IHMzYzI0eHhfc3BpICpodzsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCBlcnIgPSAwOwotCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHMzYzI0eHhfc3BpKSk7Ci0JaWYgKG1hc3RlciA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIG1lbW9yeSBmb3Igc3BpX21hc3RlclxuIik7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX25vbWVtOwotCX0KLQotCWh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCW1lbXNldChodywgMCwgc2l6ZW9mKHN0cnVjdCBzM2MyNHh4X3NwaSkpOwotCi0JaHctPm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7Ci0JaHctPnBkYXRhID0gcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlody0+ZGV2ID0gJnBkZXYtPmRldjsKLQotCWlmIChwZGF0YSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOwotCQllcnIgPSAtRU5PRU5UOwotCQlnb3RvIGVycl9ub19wZGF0YTsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7Ci0JaW5pdF9jb21wbGV0aW9uKCZody0+ZG9uZSk7Ci0KLQkvKiBpbml0aWFsaXNlIGZpcSBoYW5kbGVyICovCi0KLQlzM2MyNHh4X3NwaV9pbml0ZmlxKGh3KTsKLQotCS8qIHNldHVwIHRoZSBtYXN0ZXIgc3RhdGUuICovCi0KLQkvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KLQltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKLQotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBody0+cGRhdGEtPm51bV9jczsKLQltYXN0ZXItPmJ1c19udW0gPSBwZGF0YS0+YnVzX251bTsKLQotCS8qIHNldHVwIHRoZSBzdGF0ZSBmb3IgdGhlIGJpdGJhbmcgZHJpdmVyICovCi0KLQlody0+Yml0YmFuZy5tYXN0ZXIgICAgICAgICA9IGh3LT5tYXN0ZXI7Ci0JaHctPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSBzM2MyNHh4X3NwaV9zZXR1cHhmZXI7Ci0JaHctPmJpdGJhbmcuY2hpcHNlbGVjdCAgICAgPSBzM2MyNHh4X3NwaV9jaGlwc2VsOwotCWh3LT5iaXRiYW5nLnR4cnhfYnVmcyAgICAgID0gczNjMjR4eF9zcGlfdHhyeDsKLQotCWh3LT5tYXN0ZXItPnNldHVwICA9IHMzYzI0eHhfc3BpX3NldHVwOwotCWh3LT5tYXN0ZXItPmNsZWFudXAgPSBzM2MyNHh4X3NwaV9jbGVhbnVwOwotCi0JZGV2X2RiZyhody0+ZGV2LCAiYml0YmFuZyBhdCAlcFxuIiwgJmh3LT5iaXRiYW5nKTsKLQotCS8qIGZpbmQgYW5kIG1hcCBvdXIgcmVzb3VyY2VzICovCi0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmIChyZXMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZ2V0IElPUkVTT1VSQ0VfTUVNXG4iKTsKLQkJZXJyID0gLUVOT0VOVDsKLQkJZ290byBlcnJfbm9faW9yZXM7Ci0JfQotCi0JaHctPmlvYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCi0JCQkJCXBkZXYtPm5hbWUpOwotCi0JaWYgKGh3LT5pb2FyZWEgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVzZXJ2ZSByZWdpb25cbiIpOwotCQllcnIgPSAtRU5YSU87Ci0JCWdvdG8gZXJyX25vX2lvcmVzOwotCX0KLQotCWh3LT5yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmIChody0+cmVncyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBtYXAgSU9cbiIpOwotCQllcnIgPSAtRU5YSU87Ci0JCWdvdG8gZXJyX25vX2lvbWFwOwotCX0KLQotCWh3LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChody0+aXJxIDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgc3BlY2lmaWVkXG4iKTsKLQkJZXJyID0gLUVOT0VOVDsKLQkJZ290byBlcnJfbm9faXJxOwotCX0KLQotCWVyciA9IHJlcXVlc3RfaXJxKGh3LT5pcnEsIHMzYzI0eHhfc3BpX2lycSwgMCwgcGRldi0+bmFtZSwgaHcpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGNsYWltIElSUVxuIik7Ci0JCWdvdG8gZXJyX25vX2lycTsKLQl9Ci0KLQlody0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAic3BpIik7Ci0JaWYgKElTX0VSUihody0+Y2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBjbG9jayBmb3IgZGV2aWNlXG4iKTsKLQkJZXJyID0gUFRSX0VSUihody0+Y2xrKTsKLQkJZ290byBlcnJfbm9fY2xrOwotCX0KLQotCS8qIHNldHVwIGFueSBncGlvIHdlIGNhbiAqLwotCi0JaWYgKCFwZGF0YS0+c2V0X2NzKSB7Ci0JCWlmIChwZGF0YS0+cGluX2NzIDwgMCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gY2hpcHNlbGVjdCBwaW5cbiIpOwotCQkJZ290byBlcnJfcmVnaXN0ZXI7Ci0JCX0KLQotCQllcnIgPSBncGlvX3JlcXVlc3QocGRhdGEtPnBpbl9jcywgZGV2X25hbWUoJnBkZXYtPmRldikpOwotCQlpZiAoZXJyKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGdwaW8gZm9yIGNzXG4iKTsKLQkJCWdvdG8gZXJyX3JlZ2lzdGVyOwotCQl9Ci0KLQkJaHctPnNldF9jcyA9IHMzYzI0eHhfc3BpX2dwaW9jczsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5waW5fY3MsIDEpOwotCX0gZWxzZQotCQlody0+c2V0X2NzID0gcGRhdGEtPnNldF9jczsKLQotCXMzYzI0eHhfc3BpX2luaXRpYWxzZXR1cChodyk7Ci0KLQkvKiByZWdpc3RlciBvdXIgc3BpIGNvbnRyb2xsZXIgKi8KLQotCWVyciA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZody0+Yml0YmFuZyk7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgU1BJIG1hc3RlclxuIik7Ci0JCWdvdG8gZXJyX3JlZ2lzdGVyOwotCX0KLQotCXJldHVybiAwOwotCi0gZXJyX3JlZ2lzdGVyOgotCWlmIChody0+c2V0X2NzID09IHMzYzI0eHhfc3BpX2dwaW9jcykKLQkJZ3Bpb19mcmVlKHBkYXRhLT5waW5fY3MpOwotCi0JY2xrX2Rpc2FibGUoaHctPmNsayk7Ci0JY2xrX3B1dChody0+Y2xrKTsKLQotIGVycl9ub19jbGs6Ci0JZnJlZV9pcnEoaHctPmlycSwgaHcpOwotCi0gZXJyX25vX2lycToKLQlpb3VubWFwKGh3LT5yZWdzKTsKLQotIGVycl9ub19pb21hcDoKLQlyZWxlYXNlX3Jlc291cmNlKGh3LT5pb2FyZWEpOwotCWtmcmVlKGh3LT5pb2FyZWEpOwotCi0gZXJyX25vX2lvcmVzOgotIGVycl9ub19wZGF0YToKLQlzcGlfbWFzdGVyX3B1dChody0+bWFzdGVyKTsKLQotIGVycl9ub21lbToKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCBzM2MyNHh4X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBzM2MyNHh4X3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKLQotCXNwaV9iaXRiYW5nX3N0b3AoJmh3LT5iaXRiYW5nKTsKLQotCWNsa19kaXNhYmxlKGh3LT5jbGspOwotCWNsa19wdXQoaHctPmNsayk7Ci0KLQlmcmVlX2lycShody0+aXJxLCBodyk7Ci0JaW91bm1hcChody0+cmVncyk7Ci0KLQlpZiAoaHctPnNldF9jcyA9PSBzM2MyNHh4X3NwaV9ncGlvY3MpCi0JCWdwaW9fZnJlZShody0+cGRhdGEtPnBpbl9jcyk7Ci0KLQlyZWxlYXNlX3Jlc291cmNlKGh3LT5pb2FyZWEpOwotCWtmcmVlKGh3LT5pb2FyZWEpOwotCi0Jc3BpX21hc3Rlcl9wdXQoaHctPm1hc3Rlcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotI2lmZGVmIENPTkZJR19QTQotCi1zdGF0aWMgaW50IHMzYzI0eHhfc3BpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzM2MyNHh4X3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7Ci0KLQlpZiAoaHctPnBkYXRhICYmIGh3LT5wZGF0YS0+Z3Bpb19zZXR1cCkKLQkJaHctPnBkYXRhLT5ncGlvX3NldHVwKGh3LT5wZGF0YSwgMCk7Ci0KLQljbGtfZGlzYWJsZShody0+Y2xrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzM2MyNHh4X3NwaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzM2MyNHh4X3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7Ci0KLQlzM2MyNHh4X3NwaV9pbml0aWFsc2V0dXAoaHcpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgczNjMjR4eF9zcGlfcG1vcHMgPSB7Ci0JLnN1c3BlbmQJPSBzM2MyNHh4X3NwaV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gczNjMjR4eF9zcGlfcmVzdW1lLAotfTsKLQotI2RlZmluZSBTM0MyNFhYX1NQSV9QTU9QUyAmczNjMjR4eF9zcGlfcG1vcHMKLSNlbHNlCi0jZGVmaW5lIFMzQzI0WFhfU1BJX1BNT1BTIE5VTEwKLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KLQotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzM2MyNDEwLXNwaSIpOwotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjMjR4eF9zcGlfZHJpdmVyID0gewotCS5yZW1vdmUJCT0gX19leGl0X3AoczNjMjR4eF9zcGlfcmVtb3ZlKSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAiczNjMjQxMC1zcGkiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkJLnBtCT0gUzNDMjRYWF9TUElfUE1PUFMsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHMzYzI0eHhfc3BpX2luaXQodm9pZCkKLXsKLSAgICAgICAgcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmczNjMjR4eF9zcGlfZHJpdmVyLCBzM2MyNHh4X3NwaV9wcm9iZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzM2MyNHh4X3NwaV9leGl0KHZvaWQpCi17Ci0gICAgICAgIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzM2MyNHh4X3NwaV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChzM2MyNHh4X3NwaV9pbml0KTsKLW1vZHVsZV9leGl0KHMzYzI0eHhfc3BpX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlMzQzI0WFggU1BJIERyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzLCA8YmVuQHNpbXRlYy5jby51az4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4X2ZpcS5TIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHhfZmlxLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTNjYWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHhfZmlxLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogbGludXgvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHhfZmlxLlMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBTM0MyNFhYIFNQSSAtIEZJUSBwc2V1ZG8tRE1BIHRyYW5zZmVyIGNvZGUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1pcnEuaD4KLSNpbmNsdWRlIDxwbGF0L3JlZ3Mtc3BpLmg+Ci0KLSNpbmNsdWRlICJzcGlfczNjMjR4eF9maXEuaCIKLQotCS50ZXh0Ci0KLQlAIGVudHJ5IHRvIHRoZXNlIHJvdXRpbmVzIGlzIGFzIGZvbGxvd3MsIHdpdGggdGhlIHJlZ2lzdGVyIG5hbWVzCi0JQCBkZWZpbmVkIGluIGZpcS5oIHNvIHRoYXQgdGhleSBjYW4gYmUgc2hhcmVkIHdpdGggdGhlIEMgZmlsZXMgd2hpY2gKLQlAIHNldHVwIHRoZSBjYWxsaW5nIHJlZ2lzdGVycy4KLQlACi0JQCBmaXFfcmlycQlUaGUgYmFzZSBvZiB0aGUgSVJRIHJlZ2lzdGVycyB0byBmaW5kIFMzQzI0MTBfU1JDUE5ECi0JQCBmaXFfcnRtcAlUZW1wb3JhcnkgcmVnaXN0ZXIgdG8gaG9sZCB0eC9yeCBkYXRhCi0JQCBmaXFfcnNwaQlUaGUgYmFzZSBvZiB0aGUgU1BJIHJlZ2lzdGVyIGJsb2NrCi0JQCBmaXFfcnR4CVRoZSB0eCBidWZmZXIgcG9pbnRlcgotCUAgZmlxX3JyeAlUaGUgcnggYnVmZmVyIHBvaW50ZXIKLQlAIGZpcV9yY291bnQJVGhlIG51bWJlciBvZiBieXRlcyB0byBtb3ZlCi0KLQlAIGVhY2ggZW50cnkgc3RhcnRzIHdpdGggYSB3b3JkIGVudHJ5IG9mIGhvdyBsb25nIGl0IGlzCi0JQCBhbmQgYW4gb2Zmc2V0IHRvIHRoZSBpcnEgYWNrbm93bGVkZ21lbnQgd29yZAotCi1FTlRSWShzM2MyNHh4X3NwaV9maXFfcngpCi1zM2MyNHh4X3NwaV9maXhfcng6Ci0JLndvcmQJZmlxX3J4X2VuZCAtIGZpcV9yeF9zdGFydAotCS53b3JkCWZpcV9yeF9pcnFfYWNrIC0gZmlxX3J4X3N0YXJ0Ci1maXFfcnhfc3RhcnQ6Ci0JbGRyCWZpcV9ydG1wLCBmaXFfcnhfaXJxX2FjawotCXN0cglmaXFfcnRtcCwgWyBmaXFfcmlycSwgIyBTM0MyNDEwX1NSQ1BORCAtIFMzQzI0WFhfVkFfSVJRIF0KLQotCWxkcmIJZmlxX3J0bXAsIFsgZmlxX3JzcGksICMgIFMzQzI0MTBfU1BSREFUIF0KLQlzdHJiCWZpcV9ydG1wLCBbIGZpcV9ycnggXSwgIzEKLQotCW1vdglmaXFfcnRtcCwgIzB4ZmYKLQlzdHJiCWZpcV9ydG1wLCBbIGZpcV9yc3BpLCAjIFMzQzI0MTBfU1BUREFUIF0KLQotCXN1YnMJZmlxX3Jjb3VudCwgZmlxX3Jjb3VudCwgIzEKLQlzdWJuZXMJcGMsIGxyLCAjNAkJQEAgcmV0dXJuLCBzdGlsbCBoYXZlIHdvcmsgdG8gZG8KLQotCUBAIHNldCBJUlEgY29udHJvbGxlciBzbyB0aGF0IG5leHQgb3Agd2lsbCB0cmlnZ2VyIElSUQotCW1vdglmaXFfcnRtcCwgIzAKLQlzdHIJZmlxX3J0bXAsIFsgZmlxX3JpcnEsICMgUzNDMjQxMF9JTlRNT0QgIC0gUzNDMjRYWF9WQV9JUlEgXQotCXN1YnMJcGMsIGxyLCAjNAotCi1maXFfcnhfaXJxX2FjazoKLQkud29yZAkwCi1maXFfcnhfZW5kOgotCi1FTlRSWShzM2MyNHh4X3NwaV9maXFfdHhyeCkKLXMzYzI0eHhfc3BpX2ZpcV90eHJ4OgotCS53b3JkCWZpcV90eHJ4X2VuZCAtIGZpcV90eHJ4X3N0YXJ0Ci0JLndvcmQJZmlxX3R4cnhfaXJxX2FjayAtIGZpcV90eHJ4X3N0YXJ0Ci1maXFfdHhyeF9zdGFydDoKLQotCWxkcmIJZmlxX3J0bXAsIFsgZmlxX3JzcGksICMgIFMzQzI0MTBfU1BSREFUIF0KLQlzdHJiCWZpcV9ydG1wLCBbIGZpcV9ycnggXSwgIzEKLQotCWxkcglmaXFfcnRtcCwgZmlxX3R4cnhfaXJxX2FjawotCXN0cglmaXFfcnRtcCwgWyBmaXFfcmlycSwgIyBTM0MyNDEwX1NSQ1BORCAtIFMzQzI0WFhfVkFfSVJRIF0KLQotCWxkcmIJZmlxX3J0bXAsIFsgZmlxX3J0eCBdLCAjMQotCXN0cmIJZmlxX3J0bXAsIFsgZmlxX3JzcGksICMgUzNDMjQxMF9TUFREQVQgXQotCi0Jc3VicwlmaXFfcmNvdW50LCBmaXFfcmNvdW50LCAjMQotCXN1Ym5lcwlwYywgbHIsICM0CQlAQCByZXR1cm4sIHN0aWxsIGhhdmUgd29yayB0byBkbwotCi0JbW92CWZpcV9ydG1wLCAjMAotCXN0cglmaXFfcnRtcCwgWyBmaXFfcmlycSwgIyBTM0MyNDEwX0lOVE1PRCAgLSBTM0MyNFhYX1ZBX0lSUSBdCi0Jc3VicwlwYywgbHIsICM0Ci0KLWZpcV90eHJ4X2lycV9hY2s6Ci0JLndvcmQJMAotCi1maXFfdHhyeF9lbmQ6Ci0KLUVOVFJZKHMzYzI0eHhfc3BpX2ZpcV90eCkKLXMzYzI0eHhfc3BpX2ZpeF90eDoKLQkud29yZAlmaXFfdHhfZW5kIC0gZmlxX3R4X3N0YXJ0Ci0JLndvcmQJZmlxX3R4X2lycV9hY2sgLSBmaXFfdHhfc3RhcnQKLWZpcV90eF9zdGFydDoKLQlsZHJiCWZpcV9ydG1wLCBbIGZpcV9yc3BpLCAjICBTM0MyNDEwX1NQUkRBVCBdCi0KLQlsZHIJZmlxX3J0bXAsIGZpcV90eF9pcnFfYWNrCi0Jc3RyCWZpcV9ydG1wLCBbIGZpcV9yaXJxLCAjIFMzQzI0MTBfU1JDUE5EIC0gUzNDMjRYWF9WQV9JUlEgXQotCi0JbGRyYglmaXFfcnRtcCwgWyBmaXFfcnR4IF0sICMxCi0Jc3RyYglmaXFfcnRtcCwgWyBmaXFfcnNwaSwgIyBTM0MyNDEwX1NQVERBVCBdCi0KLQlzdWJzCWZpcV9yY291bnQsIGZpcV9yY291bnQsICMxCi0Jc3VibmVzCXBjLCBsciwgIzQJCUBAIHJldHVybiwgc3RpbGwgaGF2ZSB3b3JrIHRvIGRvCi0KLQltb3YJZmlxX3J0bXAsICMwCi0Jc3RyCWZpcV9ydG1wLCBbIGZpcV9yaXJxLCAjIFMzQzI0MTBfSU5UTU9EICAtIFMzQzI0WFhfVkFfSVJRIF0KLQlzdWJzCXBjLCBsciwgIzQKLQotZmlxX3R4X2lycV9hY2s6Ci0JLndvcmQJMAotCi1maXFfdHhfZW5kOgotCi0JLmVuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHhfZ3Bpby5jIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHhfZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk5MTM1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4X2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKiBsaW51eC9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eF9ncGlvLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgQmVuIERvb2tzCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKgotICogUzNDMjRYWCBHUElPIGJhc2VkIFNQSSBkcml2ZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KLQotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9zcGktZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQotc3RydWN0IHMzYzI0MTBfc3BpZ3BpbyB7Ci0Jc3RydWN0IHNwaV9iaXRiYW5nCQkgYml0YmFuZzsKLQotCXN0cnVjdCBzM2MyNDEwX3NwaWdwaW9faW5mbwkqaW5mbzsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQkqZGV2OwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjQxMF9zcGlncGlvICpzcGlkZXZfdG9fc2coc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlyZXR1cm4gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRzY2soc3RydWN0IHNwaV9kZXZpY2UgKmRldiwgaW50IG9uKQotewotCXN0cnVjdCBzM2MyNDEwX3NwaWdwaW8gKnNnID0gc3BpZGV2X3RvX3NnKGRldik7Ci0JczNjMjQxMF9ncGlvX3NldHBpbihzZy0+aW5mby0+cGluX2Nsaywgb24gPyAxIDogMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRtb3NpKHN0cnVjdCBzcGlfZGV2aWNlICpkZXYsIGludCBvbikKLXsKLQlzdHJ1Y3QgczNjMjQxMF9zcGlncGlvICpzZyA9IHNwaWRldl90b19zZyhkZXYpOwotCXMzYzI0MTBfZ3Bpb19zZXRwaW4oc2ctPmluZm8tPnBpbl9tb3NpLCBvbiA/IDEgOiAwKTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgZ2V0bWlzbyhzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBzM2MyNDEwX3NwaWdwaW8gKnNnID0gc3BpZGV2X3RvX3NnKGRldik7Ci0JcmV0dXJuIHMzYzI0MTBfZ3Bpb19nZXRwaW4oc2ctPmluZm8tPnBpbl9taXNvKSA/IDEgOiAwOwotfQotCi0jZGVmaW5lIHNwaWRlbGF5KHgpIG5kZWxheSh4KQotCi0jaW5jbHVkZSAic3BpX2JpdGJhbmdfdHhyeC5oIgotCi0KLXN0YXRpYyB1MzIgczNjMjQxMF9zcGlncGlvX3R4cnhfbW9kZTAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkgICAgICB1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCi17Ci0JcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMChzcGksIG5zZWNzLCAwLCAwLCB3b3JkLCBiaXRzKTsKLX0KLQotc3RhdGljIHUzMiBzM2MyNDEwX3NwaWdwaW9fdHhyeF9tb2RlMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgICAgIHVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKLXsKLQlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGExKHNwaSwgbnNlY3MsIDAsIDAsIHdvcmQsIGJpdHMpOwotfQotCi1zdGF0aWMgdTMyIHMzYzI0MTBfc3BpZ3Bpb190eHJ4X21vZGUyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCQkJICAgICAgdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQotewotCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMSwgMCwgd29yZCwgYml0cyk7Ci19Ci0KLXN0YXRpYyB1MzIgczNjMjQxMF9zcGlncGlvX3R4cnhfbW9kZTMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkgICAgICB1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCi17Ci0JcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMShzcGksIG5zZWNzLCAxLCAwLCB3b3JkLCBiaXRzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBzM2MyNDEwX3NwaWdwaW9fY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2LCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IHMzYzI0MTBfc3BpZ3BpbyAqc2cgPSBzcGlkZXZfdG9fc2coZGV2KTsKLQotCWlmIChzZy0+aW5mbyAmJiBzZy0+aW5mby0+Y2hpcF9zZWxlY3QpCi0JCShzZy0+aW5mby0+Y2hpcF9zZWxlY3QpKHNnLT5pbmZvLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjQxMF9zcGlncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgczNjMjQxMF9zcGlncGlvX2luZm8gKmluZm87Ci0Jc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKLQlzdHJ1Y3QgczNjMjQxMF9zcGlncGlvICAqc3A7Ci0JaW50IHJldDsKLQotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJmRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfc3BpZ3BpbykpOwotCWlmIChtYXN0ZXIgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBzcGkgbWFzdGVyXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCi0Jc3AgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIHNwKTsKLQotCS8qIGNvcHkgaW4gdGhlIHBsa2F0Zm9ybSBkYXRhICovCi0JaW5mbyA9IHNwLT5pbmZvID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCS8qIHNldHVwIHNwaSBiaXRiYW5nIGFkYXB0b3IgKi8KLQlzcC0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOwotCXNwLT5iaXRiYW5nLm1hc3Rlci0+YnVzX251bSA9IGluZm8tPmJ1c19udW07Ci0Jc3AtPmJpdGJhbmcubWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IGluZm8tPm51bV9jaGlwc2VsZWN0OwotCXNwLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBzM2MyNDEwX3NwaWdwaW9fY2hpcHNlbGVjdDsKLQotCXNwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8wXSA9IHMzYzI0MTBfc3BpZ3Bpb190eHJ4X21vZGUwOwotCXNwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8xXSA9IHMzYzI0MTBfc3BpZ3Bpb190eHJ4X21vZGUxOwotCXNwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8yXSA9IHMzYzI0MTBfc3BpZ3Bpb190eHJ4X21vZGUyOwotCXNwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8zXSA9IHMzYzI0MTBfc3BpZ3Bpb190eHJ4X21vZGUzOwotCi0JLyogc2V0IHN0YXRlIG9mIHNwaSBwaW5zLCBhbHdheXMgYXNzdW1lIHRoYXQgdGhlIGNsb2NrIGlzCi0JICogYXZhaWxhYmxlLCBidXQgZG8gY2hlY2sgdGhlIE1PU0kgYW5kIE1JU08uICovCi0JczNjMjQxMF9ncGlvX3NldHBpbihpbmZvLT5waW5fY2xrLCAwKTsKLQlzM2MyNDEwX2dwaW9fY2ZncGluKGluZm8tPnBpbl9jbGssIFMzQzI0MTBfR1BJT19PVVRQVVQpOwotCi0JaWYgKGluZm8tPnBpbl9tb3NpIDwgUzNDMjQxMF9HUEgxMCkgewotCQlzM2MyNDEwX2dwaW9fc2V0cGluKGluZm8tPnBpbl9tb3NpLCAwKTsKLQkJczNjMjQxMF9ncGlvX2NmZ3BpbihpbmZvLT5waW5fbW9zaSwgUzNDMjQxMF9HUElPX09VVFBVVCk7Ci0JfQotCi0JaWYgKGluZm8tPnBpbl9taXNvICE9IFMzQzI0MTBfR1BBMCAmJiBpbmZvLT5waW5fbWlzbyA8IFMzQzI0MTBfR1BIMTApCi0JCXMzYzI0MTBfZ3Bpb19jZmdwaW4oaW5mby0+cGluX21pc28sIFMzQzI0MTBfR1BJT19JTlBVVCk7Ci0KLQlyZXQgPSBzcGlfYml0YmFuZ19zdGFydCgmc3AtPmJpdGJhbmcpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX25vX2JpdGJhbmc7Ci0KLQlyZXR1cm4gMDsKLQotIGVycl9ub19iaXRiYW5nOgotCXNwaV9tYXN0ZXJfcHV0KHNwLT5iaXRiYW5nLm1hc3Rlcik7Ci0gZXJyOgotCXJldHVybiByZXQ7Ci0KLX0KLQotc3RhdGljIGludCBzM2MyNDEwX3NwaWdwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgczNjMjQxMF9zcGlncGlvICpzcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7Ci0KLQlzcGlfYml0YmFuZ19zdG9wKCZzcC0+Yml0YmFuZyk7Ci0Jc3BpX21hc3Rlcl9wdXQoc3AtPmJpdGJhbmcubWFzdGVyKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBhbGwgZ3BpbyBzaG91bGQgYmUgaGVsZCBvdmVyIHN1c3BlbmQvcmVzdW1lLCBzbyB3ZSBzaG91bGQKLSAqIG5vdCBuZWVkIHRvIGRlYWwgd2l0aCB0aGlzCi0qLwotCi0jZGVmaW5lIHMzYzI0MTBfc3BpZ3Bpb19zdXNwZW5kIE5VTEwKLSNkZWZpbmUgczNjMjQxMF9zcGlncGlvX3Jlc3VtZSBOVUxMCi0KLS8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzcGlfczNjMjR4eF9ncGlvIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzYzI0MTBfc3BpZ3Bpb19kcnYgPSB7Ci0JLnByb2JlCQk9IHMzYzI0MTBfc3BpZ3Bpb19wcm9iZSwKLSAgICAgICAgLnJlbW92ZQkJPSBzM2MyNDEwX3NwaWdwaW9fcmVtb3ZlLAotICAgICAgICAuc3VzcGVuZAk9IHMzYzI0MTBfc3BpZ3Bpb19zdXNwZW5kLAotICAgICAgICAucmVzdW1lCQk9IHMzYzI0MTBfc3BpZ3Bpb19yZXN1bWUsCi0gICAgICAgIC5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJzcGlfczNjMjR4eF9ncGlvIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0gICAgICAgIH0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzM2MyNDEwX3NwaWdwaW9faW5pdCh2b2lkKQotewotICAgICAgICByZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzM2MyNDEwX3NwaWdwaW9fZHJ2KTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHMzYzI0MTBfc3BpZ3Bpb19leGl0KHZvaWQpCi17Ci0gICAgICAgIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzM2MyNDEwX3NwaWdwaW9fZHJ2KTsKLX0KLQotbW9kdWxlX2luaXQoczNjMjQxMF9zcGlncGlvX2luaXQpOwotbW9kdWxlX2V4aXQoczNjMjQxMF9zcGlncGlvX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlMzQzI0WFggU1BJIERyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzLCA8YmVuQHNpbXRlYy5jby51az4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9zM2M2NHh4LmMgYi9kcml2ZXJzL3NwaS9zcGlfczNjNjR4eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTU4MjhiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3BpL3NwaV9zM2M2NHh4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQ4ICswLDAgQEAKLS8qIGxpbnV4L2RyaXZlcnMvc3BpL3NwaV9zM2M2NHh4LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBMdGQuCi0gKglKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotCi0jaW5jbHVkZSA8bWFjaC9kbWEuaD4KLSNpbmNsdWRlIDxwbGF0L3MzYzY0eHgtc3BpLmg+Ci0KLS8qIFJlZ2lzdGVycyBhbmQgYml0LWZpZWxkcyAqLwotCi0jZGVmaW5lIFMzQzY0WFhfU1BJX0NIX0NGRwkJMHgwMAotI2RlZmluZSBTM0M2NFhYX1NQSV9DTEtfQ0ZHCQkweDA0Ci0jZGVmaW5lIFMzQzY0WFhfU1BJX01PREVfQ0ZHCTB4MDgKLSNkZWZpbmUgUzNDNjRYWF9TUElfU0xBVkVfU0VMCTB4MEMKLSNkZWZpbmUgUzNDNjRYWF9TUElfSU5UX0VOCQkweDEwCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1NUQVRVUwkJMHgxNAotI2RlZmluZSBTM0M2NFhYX1NQSV9UWF9EQVRBCQkweDE4Ci0jZGVmaW5lIFMzQzY0WFhfU1BJX1JYX0RBVEEJCTB4MUMKLSNkZWZpbmUgUzNDNjRYWF9TUElfUEFDS0VUX0NOVAkweDIwCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1BFTkRJTkdfQ0xSCTB4MjQKLSNkZWZpbmUgUzNDNjRYWF9TUElfU1dBUF9DRkcJMHgyOAotI2RlZmluZSBTM0M2NFhYX1NQSV9GQl9DTEsJCTB4MkMKLQotI2RlZmluZSBTM0M2NFhYX1NQSV9DSF9IU19FTgkJKDE8PDYpCS8qIEhpZ2ggU3BlZWQgRW5hYmxlICovCi0jZGVmaW5lIFMzQzY0WFhfU1BJX0NIX1NXX1JTVAkJKDE8PDUpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX0NIX1NMQVZFCQkoMTw8NCkKLSNkZWZpbmUgUzNDNjRYWF9TUElfQ1BPTF9MCQkoMTw8MykKLSNkZWZpbmUgUzNDNjRYWF9TUElfQ1BIQV9CCQkoMTw8MikKLSNkZWZpbmUgUzNDNjRYWF9TUElfQ0hfUlhDSF9PTgkJKDE8PDEpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX0NIX1RYQ0hfT04JCSgxPDwwKQotCi0jZGVmaW5lIFMzQzY0WFhfU1BJX0NMS1NFTF9TUkNNU0sJKDM8PDkpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX0NMS1NFTF9TUkNTSEZUCTkKLSNkZWZpbmUgUzNDNjRYWF9TUElfRU5DTEtfRU5BQkxFCSgxPDw4KQotI2RlZmluZSBTM0M2NFhYX1NQSV9QU1JfTUFTSyAJCTB4ZmYKLQotI2RlZmluZSBTM0M2NFhYX1NQSV9NT0RFX0NIX1RTWl9CWVRFCQkoMDw8MjkpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX01PREVfQ0hfVFNaX0hBTEZXT1JECSgxPDwyOSkKLSNkZWZpbmUgUzNDNjRYWF9TUElfTU9ERV9DSF9UU1pfV09SRAkJKDI8PDI5KQotI2RlZmluZSBTM0M2NFhYX1NQSV9NT0RFX0NIX1RTWl9NQVNLCQkoMzw8MjkpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX01PREVfQlVTX1RTWl9CWVRFCQkoMDw8MTcpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX01PREVfQlVTX1RTWl9IQUxGV09SRAkoMTw8MTcpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX01PREVfQlVTX1RTWl9XT1JECQkoMjw8MTcpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX01PREVfQlVTX1RTWl9NQVNLCQkoMzw8MTcpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX01PREVfUlhETUFfT04JCSgxPDwyKQotI2RlZmluZSBTM0M2NFhYX1NQSV9NT0RFX1RYRE1BX09OCQkoMTw8MSkKLSNkZWZpbmUgUzNDNjRYWF9TUElfTU9ERV80QlVSU1QJCQkoMTw8MCkKLQotI2RlZmluZSBTM0M2NFhYX1NQSV9TTEFWRV9BVVRPCQkJKDE8PDEpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1NMQVZFX1NJR19JTkFDVAkJKDE8PDApCi0KLSNkZWZpbmUgUzNDNjRYWF9TUElfQUNUKGMpIHdyaXRlbCgwLCAoYyktPnJlZ3MgKyBTM0M2NFhYX1NQSV9TTEFWRV9TRUwpCi0KLSNkZWZpbmUgUzNDNjRYWF9TUElfREVBQ1QoYykgd3JpdGVsKFMzQzY0WFhfU1BJX1NMQVZFX1NJR19JTkFDVCwgXAotCQkJCQkoYyktPnJlZ3MgKyBTM0M2NFhYX1NQSV9TTEFWRV9TRUwpCi0KLSNkZWZpbmUgUzNDNjRYWF9TUElfSU5UX1RSQUlMSU5HX0VOCQkoMTw8NikKLSNkZWZpbmUgUzNDNjRYWF9TUElfSU5UX1JYX09WRVJSVU5fRU4JCSgxPDw1KQotI2RlZmluZSBTM0M2NFhYX1NQSV9JTlRfUlhfVU5ERVJSVU5fRU4JCSgxPDw0KQotI2RlZmluZSBTM0M2NFhYX1NQSV9JTlRfVFhfT1ZFUlJVTl9FTgkJKDE8PDMpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX0lOVF9UWF9VTkRFUlJVTl9FTgkJKDE8PDIpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX0lOVF9SWF9GSUZPUkRZX0VOCQkoMTw8MSkKLSNkZWZpbmUgUzNDNjRYWF9TUElfSU5UX1RYX0ZJRk9SRFlfRU4JCSgxPDwwKQotCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1NUX1JYX09WRVJSVU5fRVJSCQkoMTw8NSkKLSNkZWZpbmUgUzNDNjRYWF9TUElfU1RfUlhfVU5ERVJSVU5fRVJSCSgxPDw0KQotI2RlZmluZSBTM0M2NFhYX1NQSV9TVF9UWF9PVkVSUlVOX0VSUgkJKDE8PDMpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1NUX1RYX1VOREVSUlVOX0VSUgkoMTw8MikKLSNkZWZpbmUgUzNDNjRYWF9TUElfU1RfUlhfRklGT1JEWQkJKDE8PDEpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1NUX1RYX0ZJRk9SRFkJCSgxPDwwKQotCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1BBQ0tFVF9DTlRfRU4JCSgxPDwxNikKLQotI2RlZmluZSBTM0M2NFhYX1NQSV9QTkRfVFhfVU5ERVJSVU5fQ0xSCQkoMTw8NCkKLSNkZWZpbmUgUzNDNjRYWF9TUElfUE5EX1RYX09WRVJSVU5fQ0xSCQkoMTw8MykKLSNkZWZpbmUgUzNDNjRYWF9TUElfUE5EX1JYX1VOREVSUlVOX0NMUgkJKDE8PDIpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1BORF9SWF9PVkVSUlVOX0NMUgkJKDE8PDEpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1BORF9UUkFJTElOR19DTFIJCSgxPDwwKQotCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1NXQVBfUlhfSEFMRl9XT1JECQkoMTw8NykKLSNkZWZpbmUgUzNDNjRYWF9TUElfU1dBUF9SWF9CWVRFCQkoMTw8NikKLSNkZWZpbmUgUzNDNjRYWF9TUElfU1dBUF9SWF9CSVQJCQkoMTw8NSkKLSNkZWZpbmUgUzNDNjRYWF9TUElfU1dBUF9SWF9FTgkJCSgxPDw0KQotI2RlZmluZSBTM0M2NFhYX1NQSV9TV0FQX1RYX0hBTEZfV09SRAkJKDE8PDMpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1NXQVBfVFhfQllURQkJKDE8PDIpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1NXQVBfVFhfQklUCQkJKDE8PDEpCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1NXQVBfVFhfRU4JCQkoMTw8MCkKLQotI2RlZmluZSBTM0M2NFhYX1NQSV9GQkNMS19NU0sJCSgzPDwwKQotCi0jZGVmaW5lIFMzQzY0WFhfU1BJX1NUX1RSTENOVFoodiwgaSkgKCgoKHYpID4+IChpKS0+cnhfbHZsX29mZnNldCkgJiBcCi0JCQkJCSgoKGkpLT5maWZvX2x2bF9tYXNrICsgMSkpKSBcCi0JCQkJCT8gMSA6IDApCi0KLSNkZWZpbmUgUzNDNjRYWF9TUElfU1RfVFhfRE9ORSh2LCBpKSAoKCgodikgPj4gKGkpLT5yeF9sdmxfb2Zmc2V0KSAmIFwKLQkJCQkJKCgoaSktPmZpZm9fbHZsX21hc2sgKyAxKSA8PCAxKSkgXAotCQkJCQk/IDEgOiAwKQotI2RlZmluZSBUWF9GSUZPX0xWTCh2LCBpKSAoKCh2KSA+PiA2KSAmIChpKS0+Zmlmb19sdmxfbWFzaykKLSNkZWZpbmUgUlhfRklGT19MVkwodiwgaSkgKCgodikgPj4gKGkpLT5yeF9sdmxfb2Zmc2V0KSAmIChpKS0+Zmlmb19sdmxfbWFzaykKLQotI2RlZmluZSBTM0M2NFhYX1NQSV9NQVhfVFJBSUxDTlQJMHgzZmYKLSNkZWZpbmUgUzNDNjRYWF9TUElfVFJBSUxDTlRfT0ZGCTE5Ci0KLSNkZWZpbmUgUzNDNjRYWF9TUElfVFJBSUxDTlQJCVMzQzY0WFhfU1BJX01BWF9UUkFJTENOVAotCi0jZGVmaW5lIG1zZWNzX3RvX2xvb3BzKHQpIChsb29wc19wZXJfamlmZnkgLyAxMDAwICogSFogKiB0KQotCi0jZGVmaW5lIFNVU1BORCAgICAoMTw8MCkKLSNkZWZpbmUgU1BJQlVTWSAgICgxPDwxKQotI2RlZmluZSBSWEJVU1kgICAgKDE8PDIpCi0jZGVmaW5lIFRYQlVTWSAgICAoMTw8MykKLQotLyoqCi0gKiBzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgLSBSdW50aW1lIGluZm8gaG9sZGVyIGZvciBTUEkgZHJpdmVyLgotICogQGNsazogUG9pbnRlciB0byB0aGUgc3BpIGNsb2NrLgotICogQHNyY19jbGs6IFBvaW50ZXIgdG8gdGhlIGNsb2NrIHVzZWQgdG8gZ2VuZXJhdGUgU1BJIHNpZ25hbHMuCi0gKiBAbWFzdGVyOiBQb2ludGVyIHRvIHRoZSBTUEkgUHJvdG9jb2wgbWFzdGVyLgotICogQHdvcmtxdWV1ZTogV29yayBxdWV1ZSBmb3IgdGhlIFNQSSB4ZmVyIHJlcXVlc3RzLgotICogQGNudHJscl9pbmZvOiBQbGF0Zm9ybSBzcGVjaWZpYyBkYXRhIGZvciB0aGUgY29udHJvbGxlciB0aGlzIGRyaXZlciBtYW5hZ2VzLgotICogQHRnbF9zcGk6IFBvaW50ZXIgdG8gdGhlIGxhc3QgQ1MgbGVmdCB1bnRvZ2dsZWQgYnkgdGhlIGNzX2NoYW5nZSBoaW50LgotICogQHdvcms6IFdvcmsKLSAqIEBxdWV1ZTogVG8gbG9nIFNQSSB4ZmVyIHJlcXVlc3RzLgotICogQGxvY2s6IENvbnRyb2xsZXIgc3BlY2lmaWMgbG9jay4KLSAqIEBzdGF0ZTogU2V0IG9mIEZMQUdTIHRvIGluZGljYXRlIHN0YXR1cy4KLSAqIEByeF9kbWFjaDogQ29udHJvbGxlcidzIERNQSBjaGFubmVsIGZvciBSeC4KLSAqIEB0eF9kbWFjaDogQ29udHJvbGxlcidzIERNQSBjaGFubmVsIGZvciBUeC4KLSAqIEBzZnJfc3RhcnQ6IEJVUyBhZGRyZXNzIG9mIFNQSSBjb250cm9sbGVyIHJlZ3MuCi0gKiBAcmVnczogUG9pbnRlciB0byBpb3JlbWFwJ2VkIGNvbnRyb2xsZXIgcmVnaXN0ZXJzLgotICogQHhmZXJfY29tcGxldGlvbjogVG8gaW5kaWNhdGUgY29tcGxldGlvbiBvZiB4ZmVyIHRhc2suCi0gKiBAY3VyX21vZGU6IFN0b3JlcyB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbnRyb2xsZXIuCi0gKiBAY3VyX2JwdzogU3RvcmVzIHRoZSBhY3RpdmUgYml0cyBwZXIgd29yZCBzZXR0aW5ncy4KLSAqIEBjdXJfc3BlZWQ6IFN0b3JlcyB0aGUgYWN0aXZlIHhmZXIgY2xvY2sgc3BlZWQuCi0gKi8KLXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSB7Ci0Jdm9pZCBfX2lvbWVtICAgICAgICAgICAgICAgICAgICAqcmVnczsKLQlzdHJ1Y3QgY2xrICAgICAgICAgICAgICAgICAgICAgICpjbGs7Ci0Jc3RydWN0IGNsayAgICAgICAgICAgICAgICAgICAgICAqc3JjX2NsazsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICAgICAgICAgICpwZGV2OwotCXN0cnVjdCBzcGlfbWFzdGVyICAgICAgICAgICAgICAgKm1hc3RlcjsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkgICAgICAgICp3b3JrcXVldWU7Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gICpjbnRybHJfaW5mbzsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAgICAgICAgICAgICAgICp0Z2xfc3BpOwotCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgICAgICAgICAgd29yazsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICAgIHF1ZXVlOwotCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgICAgICAgbG9jazsKLQllbnVtIGRtYV9jaCAgICAgICAgICAgICAgICAgICAgIHJ4X2RtYWNoOwotCWVudW0gZG1hX2NoICAgICAgICAgICAgICAgICAgICAgdHhfZG1hY2g7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICBzZnJfc3RhcnQ7Ci0Jc3RydWN0IGNvbXBsZXRpb24gICAgICAgICAgICAgICB4ZmVyX2NvbXBsZXRpb247Ci0JdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTsKLQl1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9tb2RlLCBjdXJfYnB3OwotCXVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3NwZWVkOwotfTsKLQotc3RhdGljIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgczNjNjR4eF9zcGlfZG1hX2NsaWVudCA9IHsKLQkubmFtZSA9ICJzYW1zdW5nLXNwaS1kbWEiLAotfTsKLQotc3RhdGljIHZvaWQgZmx1c2hfZmlmbyhzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCkKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyAqc2NpID0gc2RkLT5jbnRybHJfaW5mbzsKLQl2b2lkIF9faW9tZW0gKnJlZ3MgPSBzZGQtPnJlZ3M7Ci0JdW5zaWduZWQgbG9uZyBsb29wczsKLQl1MzIgdmFsOwotCi0Jd3JpdGVsKDAsIHJlZ3MgKyBTM0M2NFhYX1NQSV9QQUNLRVRfQ05UKTsKLQotCXZhbCA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9DSF9DRkcpOwotCXZhbCB8PSBTM0M2NFhYX1NQSV9DSF9TV19SU1Q7Ci0JdmFsICY9IH5TM0M2NFhYX1NQSV9DSF9IU19FTjsKLQl3cml0ZWwodmFsLCByZWdzICsgUzNDNjRYWF9TUElfQ0hfQ0ZHKTsKLQotCS8qIEZsdXNoIFR4RklGTyovCi0JbG9vcHMgPSBtc2Vjc190b19sb29wcygxKTsKLQlkbyB7Ci0JCXZhbCA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9TVEFUVVMpOwotCX0gd2hpbGUgKFRYX0ZJRk9fTFZMKHZhbCwgc2NpKSAmJiBsb29wcy0tKTsKLQotCWlmIChsb29wcyA9PSAwKQotCQlkZXZfd2Fybigmc2RkLT5wZGV2LT5kZXYsICJUaW1lZCBvdXQgZmx1c2hpbmcgVFggRklGT1xuIik7Ci0KLQkvKiBGbHVzaCBSeEZJRk8qLwotCWxvb3BzID0gbXNlY3NfdG9fbG9vcHMoMSk7Ci0JZG8gewotCQl2YWwgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfU1RBVFVTKTsKLQkJaWYgKFJYX0ZJRk9fTFZMKHZhbCwgc2NpKSkKLQkJCXJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9SWF9EQVRBKTsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAobG9vcHMtLSk7Ci0KLQlpZiAobG9vcHMgPT0gMCkKLQkJZGV2X3dhcm4oJnNkZC0+cGRldi0+ZGV2LCAiVGltZWQgb3V0IGZsdXNoaW5nIFJYIEZJRk9cbiIpOwotCi0JdmFsID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX0NIX0NGRyk7Ci0JdmFsICY9IH5TM0M2NFhYX1NQSV9DSF9TV19SU1Q7Ci0Jd3JpdGVsKHZhbCwgcmVncyArIFMzQzY0WFhfU1BJX0NIX0NGRyk7Ci0KLQl2YWwgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfTU9ERV9DRkcpOwotCXZhbCAmPSB+KFMzQzY0WFhfU1BJX01PREVfVFhETUFfT04gfCBTM0M2NFhYX1NQSV9NT0RFX1JYRE1BX09OKTsKLQl3cml0ZWwodmFsLCByZWdzICsgUzNDNjRYWF9TUElfTU9ERV9DRkcpOwotCi0JdmFsID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX0NIX0NGRyk7Ci0JdmFsICY9IH4oUzNDNjRYWF9TUElfQ0hfUlhDSF9PTiB8IFMzQzY0WFhfU1BJX0NIX1RYQ0hfT04pOwotCXdyaXRlbCh2YWwsIHJlZ3MgKyBTM0M2NFhYX1NQSV9DSF9DRkcpOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfZGF0YXBhdGgoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyLCBpbnQgZG1hX21vZGUpCi17Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gKnNjaSA9IHNkZC0+Y250cmxyX2luZm87Ci0Jdm9pZCBfX2lvbWVtICpyZWdzID0gc2RkLT5yZWdzOwotCXUzMiBtb2RlY2ZnLCBjaGNmZzsKLQotCW1vZGVjZmcgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfTU9ERV9DRkcpOwotCW1vZGVjZmcgJj0gfihTM0M2NFhYX1NQSV9NT0RFX1RYRE1BX09OIHwgUzNDNjRYWF9TUElfTU9ERV9SWERNQV9PTik7Ci0KLQljaGNmZyA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9DSF9DRkcpOwotCWNoY2ZnICY9IH5TM0M2NFhYX1NQSV9DSF9UWENIX09OOwotCi0JaWYgKGRtYV9tb2RlKSB7Ci0JCWNoY2ZnICY9IH5TM0M2NFhYX1NQSV9DSF9SWENIX09OOwotCX0gZWxzZSB7Ci0JCS8qIEFsd2F5cyBzaGlmdCBpbiBkYXRhIGluIEZJRk8sIGV2ZW4gaWYgeGZlciBpcyBUeCBvbmx5LAotCQkgKiB0aGlzIGhlbHBzIHNldHRpbmcgUENLVF9DTlQgdmFsdWUgZm9yIGdlbmVyYXRpbmcgY2xvY2tzCi0JCSAqIGFzIGV4YWN0bHkgbmVlZGVkLgotCQkgKi8KLQkJY2hjZmcgfD0gUzNDNjRYWF9TUElfQ0hfUlhDSF9PTjsKLQkJd3JpdGVsKCgoeGZlci0+bGVuICogOCAvIHNkZC0+Y3VyX2JwdykgJiAweGZmZmYpCi0JCQkJCXwgUzNDNjRYWF9TUElfUEFDS0VUX0NOVF9FTiwKLQkJCQkJcmVncyArIFMzQzY0WFhfU1BJX1BBQ0tFVF9DTlQpOwotCX0KLQotCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTCkgewotCQlzZGQtPnN0YXRlIHw9IFRYQlVTWTsKLQkJY2hjZmcgfD0gUzNDNjRYWF9TUElfQ0hfVFhDSF9PTjsKLQkJaWYgKGRtYV9tb2RlKSB7Ci0JCQltb2RlY2ZnIHw9IFMzQzY0WFhfU1BJX01PREVfVFhETUFfT047Ci0JCQlzM2MyNDEwX2RtYV9jb25maWcoc2RkLT50eF9kbWFjaCwgc2RkLT5jdXJfYnB3IC8gOCk7Ci0JCQlzM2MyNDEwX2RtYV9lbnF1ZXVlKHNkZC0+dHhfZG1hY2gsICh2b2lkICopc2RkLAotCQkJCQkJeGZlci0+dHhfZG1hLCB4ZmVyLT5sZW4pOwotCQkJczNjMjQxMF9kbWFfY3RybChzZGQtPnR4X2RtYWNoLCBTM0MyNDEwX0RNQU9QX1NUQVJUKTsKLQkJfSBlbHNlIHsKLQkJCXN3aXRjaCAoc2RkLT5jdXJfYnB3KSB7Ci0JCQljYXNlIDMyOgotCQkJCWlvd3JpdGUzMl9yZXAocmVncyArIFMzQzY0WFhfU1BJX1RYX0RBVEEsCi0JCQkJCXhmZXItPnR4X2J1ZiwgeGZlci0+bGVuIC8gNCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCWlvd3JpdGUxNl9yZXAocmVncyArIFMzQzY0WFhfU1BJX1RYX0RBVEEsCi0JCQkJCXhmZXItPnR4X2J1ZiwgeGZlci0+bGVuIC8gMik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWlvd3JpdGU4X3JlcChyZWdzICsgUzNDNjRYWF9TUElfVFhfREFUQSwKLQkJCQkJeGZlci0+dHhfYnVmLCB4ZmVyLT5sZW4pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHhmZXItPnJ4X2J1ZiAhPSBOVUxMKSB7Ci0JCXNkZC0+c3RhdGUgfD0gUlhCVVNZOwotCi0JCWlmIChzY2ktPmhpZ2hfc3BlZWQgJiYgc2RkLT5jdXJfc3BlZWQgPj0gMzAwMDAwMDBVTAotCQkJCQkmJiAhKHNkZC0+Y3VyX21vZGUgJiBTUElfQ1BIQSkpCi0JCQljaGNmZyB8PSBTM0M2NFhYX1NQSV9DSF9IU19FTjsKLQotCQlpZiAoZG1hX21vZGUpIHsKLQkJCW1vZGVjZmcgfD0gUzNDNjRYWF9TUElfTU9ERV9SWERNQV9PTjsKLQkJCWNoY2ZnIHw9IFMzQzY0WFhfU1BJX0NIX1JYQ0hfT047Ci0JCQl3cml0ZWwoKCh4ZmVyLT5sZW4gKiA4IC8gc2RkLT5jdXJfYnB3KSAmIDB4ZmZmZikKLQkJCQkJfCBTM0M2NFhYX1NQSV9QQUNLRVRfQ05UX0VOLAotCQkJCQlyZWdzICsgUzNDNjRYWF9TUElfUEFDS0VUX0NOVCk7Ci0JCQlzM2MyNDEwX2RtYV9jb25maWcoc2RkLT5yeF9kbWFjaCwgc2RkLT5jdXJfYnB3IC8gOCk7Ci0JCQlzM2MyNDEwX2RtYV9lbnF1ZXVlKHNkZC0+cnhfZG1hY2gsICh2b2lkICopc2RkLAotCQkJCQkJeGZlci0+cnhfZG1hLCB4ZmVyLT5sZW4pOwotCQkJczNjMjQxMF9kbWFfY3RybChzZGQtPnJ4X2RtYWNoLCBTM0MyNDEwX0RNQU9QX1NUQVJUKTsKLQkJfQotCX0KLQotCXdyaXRlbChtb2RlY2ZnLCByZWdzICsgUzNDNjRYWF9TUElfTU9ERV9DRkcpOwotCXdyaXRlbChjaGNmZywgcmVncyArIFMzQzY0WFhfU1BJX0NIX0NGRyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfY3Moc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBzM2M2NHh4X3NwaV9jc2luZm8gKmNzOwotCi0JaWYgKHNkZC0+dGdsX3NwaSAhPSBOVUxMKSB7IC8qIElmIGxhc3QgZGV2aWNlIHRvZ2dsZWQgYWZ0ZXIgbXNzZyAqLwotCQlpZiAoc2RkLT50Z2xfc3BpICE9IHNwaSkgeyAvKiBpZiBsYXN0IG1zc2cgb24gZGlmZiBkZXZpY2UgKi8KLQkJCS8qIERlc2VsZWN0IHRoZSBsYXN0IHRvZ2dsZWQgZGV2aWNlICovCi0JCQljcyA9IHNkZC0+dGdsX3NwaS0+Y29udHJvbGxlcl9kYXRhOwotCQkJY3MtPnNldF9sZXZlbChjcy0+bGluZSwKLQkJCQkJc3BpLT5tb2RlICYgU1BJX0NTX0hJR0ggPyAwIDogMSk7Ci0JCX0KLQkJc2RkLT50Z2xfc3BpID0gTlVMTDsKLQl9Ci0KLQljcyA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOwotCWNzLT5zZXRfbGV2ZWwoY3MtPmxpbmUsIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIID8gMSA6IDApOwotfQotCi1zdGF0aWMgaW50IHdhaXRfZm9yX3hmZXIoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciwgaW50IGRtYV9tb2RlKQotewotCXN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvICpzY2kgPSBzZGQtPmNudHJscl9pbmZvOwotCXZvaWQgX19pb21lbSAqcmVncyA9IHNkZC0+cmVnczsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgbXM7Ci0KLQkvKiBtaWxsaXNlY3MgdG8geGZlciAnbGVuJyBieXRlcyBAICdjdXJfc3BlZWQnICovCi0JbXMgPSB4ZmVyLT5sZW4gKiA4ICogMTAwMCAvIHNkZC0+Y3VyX3NwZWVkOwotCW1zICs9IDEwOyAvKiBzb21lIHRvbGVyYW5jZSAqLwotCi0JaWYgKGRtYV9tb2RlKSB7Ci0JCXZhbCA9IG1zZWNzX3RvX2ppZmZpZXMobXMpICsgMTA7Ci0JCXZhbCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc2RkLT54ZmVyX2NvbXBsZXRpb24sIHZhbCk7Ci0JfSBlbHNlIHsKLQkJdTMyIHN0YXR1czsKLQkJdmFsID0gbXNlY3NfdG9fbG9vcHMobXMpOwotCQlkbyB7Ci0JCQlzdGF0dXMgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfU1RBVFVTKTsKLQkJfSB3aGlsZSAoUlhfRklGT19MVkwoc3RhdHVzLCBzY2kpIDwgeGZlci0+bGVuICYmIC0tdmFsKTsKLQl9Ci0KLQlpZiAoIXZhbCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAoZG1hX21vZGUpIHsKLQkJdTMyIHN0YXR1czsKLQotCQkvKgotCQkgKiBEbWFUeCByZXR1cm5zIGFmdGVyIHNpbXBseSB3cml0aW5nIGRhdGEgaW4gdGhlIEZJRk8sCi0JCSAqIHcvbyB3YWl0aW5nIGZvciByZWFsIHRyYW5zbWlzc2lvbiBvbiB0aGUgYnVzIHRvIGZpbmlzaC4KLQkJICogRG1hUnggcmV0dXJucyBvbmx5IGFmdGVyIERtYSByZWFkIGRhdGEgZnJvbSBGSUZPIHdoaWNoCi0JCSAqIG5lZWRzIGJ1cyB0cmFuc21pc3Npb24gdG8gZmluaXNoLCBzbyB3ZSBkb24ndCB3b3JyeSBpZgotCQkgKiBYZmVyIGludm9sdmVkIFJ4KHdpdGggb3Igd2l0aG91dCBUeCkuCi0JCSAqLwotCQlpZiAoeGZlci0+cnhfYnVmID09IE5VTEwpIHsKLQkJCXZhbCA9IG1zZWNzX3RvX2xvb3BzKDEwKTsKLQkJCXN0YXR1cyA9IHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9TVEFUVVMpOwotCQkJd2hpbGUgKChUWF9GSUZPX0xWTChzdGF0dXMsIHNjaSkKLQkJCQl8fCAhUzNDNjRYWF9TUElfU1RfVFhfRE9ORShzdGF0dXMsIHNjaSkpCi0JCQkJCSYmIC0tdmFsKSB7Ci0JCQkJY3B1X3JlbGF4KCk7Ci0JCQkJc3RhdHVzID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX1NUQVRVUyk7Ci0JCQl9Ci0KLQkJCWlmICghdmFsKQotCQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogSWYgaXQgd2FzIG9ubHkgVHggKi8KLQkJaWYgKHhmZXItPnJ4X2J1ZiA9PSBOVUxMKSB7Ci0JCQlzZGQtPnN0YXRlICY9IH5UWEJVU1k7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXN3aXRjaCAoc2RkLT5jdXJfYnB3KSB7Ci0JCWNhc2UgMzI6Ci0JCQlpb3JlYWQzMl9yZXAocmVncyArIFMzQzY0WFhfU1BJX1JYX0RBVEEsCi0JCQkJeGZlci0+cnhfYnVmLCB4ZmVyLT5sZW4gLyA0KTsKLQkJCWJyZWFrOwotCQljYXNlIDE2OgotCQkJaW9yZWFkMTZfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9SWF9EQVRBLAotCQkJCXhmZXItPnJ4X2J1ZiwgeGZlci0+bGVuIC8gMik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlvcmVhZDhfcmVwKHJlZ3MgKyBTM0M2NFhYX1NQSV9SWF9EQVRBLAotCQkJCXhmZXItPnJ4X2J1ZiwgeGZlci0+bGVuKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXNkZC0+c3RhdGUgJj0gflJYQlVTWTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfY3Moc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBzM2M2NHh4X3NwaV9jc2luZm8gKmNzID0gc3BpLT5jb250cm9sbGVyX2RhdGE7Ci0KLQlpZiAoc2RkLT50Z2xfc3BpID09IHNwaSkKLQkJc2RkLT50Z2xfc3BpID0gTlVMTDsKLQotCWNzLT5zZXRfbGV2ZWwoY3MtPmxpbmUsIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIID8gMCA6IDEpOwotfQotCi1zdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV9jb25maWcoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQpCi17Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gKnNjaSA9IHNkZC0+Y250cmxyX2luZm87Ci0Jdm9pZCBfX2lvbWVtICpyZWdzID0gc2RkLT5yZWdzOwotCXUzMiB2YWw7Ci0KLQkvKiBEaXNhYmxlIENsb2NrICovCi0JaWYgKHNjaS0+Y2xrX2Zyb21fY211KSB7Ci0JCWNsa19kaXNhYmxlKHNkZC0+c3JjX2Nsayk7Ci0JfSBlbHNlIHsKLQkJdmFsID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX0NMS19DRkcpOwotCQl2YWwgJj0gflMzQzY0WFhfU1BJX0VOQ0xLX0VOQUJMRTsKLQkJd3JpdGVsKHZhbCwgcmVncyArIFMzQzY0WFhfU1BJX0NMS19DRkcpOwotCX0KLQotCS8qIFNldCBQb2xhcml0eSBhbmQgUGhhc2UgKi8KLQl2YWwgPSByZWFkbChyZWdzICsgUzNDNjRYWF9TUElfQ0hfQ0ZHKTsKLQl2YWwgJj0gfihTM0M2NFhYX1NQSV9DSF9TTEFWRSB8Ci0JCQlTM0M2NFhYX1NQSV9DUE9MX0wgfAotCQkJUzNDNjRYWF9TUElfQ1BIQV9CKTsKLQotCWlmIChzZGQtPmN1cl9tb2RlICYgU1BJX0NQT0wpCi0JCXZhbCB8PSBTM0M2NFhYX1NQSV9DUE9MX0w7Ci0KLQlpZiAoc2RkLT5jdXJfbW9kZSAmIFNQSV9DUEhBKQotCQl2YWwgfD0gUzNDNjRYWF9TUElfQ1BIQV9COwotCi0Jd3JpdGVsKHZhbCwgcmVncyArIFMzQzY0WFhfU1BJX0NIX0NGRyk7Ci0KLQkvKiBTZXQgQ2hhbm5lbCAmIERNQSBNb2RlICovCi0JdmFsID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX01PREVfQ0ZHKTsKLQl2YWwgJj0gfihTM0M2NFhYX1NQSV9NT0RFX0JVU19UU1pfTUFTSwotCQkJfCBTM0M2NFhYX1NQSV9NT0RFX0NIX1RTWl9NQVNLKTsKLQotCXN3aXRjaCAoc2RkLT5jdXJfYnB3KSB7Ci0JY2FzZSAzMjoKLQkJdmFsIHw9IFMzQzY0WFhfU1BJX01PREVfQlVTX1RTWl9XT1JEOwotCQl2YWwgfD0gUzNDNjRYWF9TUElfTU9ERV9DSF9UU1pfV09SRDsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJdmFsIHw9IFMzQzY0WFhfU1BJX01PREVfQlVTX1RTWl9IQUxGV09SRDsKLQkJdmFsIHw9IFMzQzY0WFhfU1BJX01PREVfQ0hfVFNaX0hBTEZXT1JEOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl2YWwgfD0gUzNDNjRYWF9TUElfTU9ERV9CVVNfVFNaX0JZVEU7Ci0JCXZhbCB8PSBTM0M2NFhYX1NQSV9NT0RFX0NIX1RTWl9CWVRFOwotCQlicmVhazsKLQl9Ci0KLQl3cml0ZWwodmFsLCByZWdzICsgUzNDNjRYWF9TUElfTU9ERV9DRkcpOwotCi0JaWYgKHNjaS0+Y2xrX2Zyb21fY211KSB7Ci0JCS8qIENvbmZpZ3VyZSBDbG9jayAqLwotCQkvKiBUaGVyZSBpcyBoYWxmLW11bHRpcGxpZXIgYmVmb3JlIHRoZSBTUEkgKi8KLQkJY2xrX3NldF9yYXRlKHNkZC0+c3JjX2Nsaywgc2RkLT5jdXJfc3BlZWQgKiAyKTsKLQkJLyogRW5hYmxlIENsb2NrICovCi0JCWNsa19lbmFibGUoc2RkLT5zcmNfY2xrKTsKLQl9IGVsc2UgewotCQkvKiBDb25maWd1cmUgQ2xvY2sgKi8KLQkJdmFsID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX0NMS19DRkcpOwotCQl2YWwgJj0gflMzQzY0WFhfU1BJX1BTUl9NQVNLOwotCQl2YWwgfD0gKChjbGtfZ2V0X3JhdGUoc2RkLT5zcmNfY2xrKSAvIHNkZC0+Y3VyX3NwZWVkIC8gMiAtIDEpCi0JCQkJJiBTM0M2NFhYX1NQSV9QU1JfTUFTSyk7Ci0JCXdyaXRlbCh2YWwsIHJlZ3MgKyBTM0M2NFhYX1NQSV9DTEtfQ0ZHKTsKLQotCQkvKiBFbmFibGUgQ2xvY2sgKi8KLQkJdmFsID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX0NMS19DRkcpOwotCQl2YWwgfD0gUzNDNjRYWF9TUElfRU5DTEtfRU5BQkxFOwotCQl3cml0ZWwodmFsLCByZWdzICsgUzNDNjRYWF9TUElfQ0xLX0NGRyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV9kbWFfcnhjYihzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiwgdm9pZCAqYnVmX2lkLAotCQkJCSBpbnQgc2l6ZSwgZW51bSBzM2MyNDEwX2RtYV9idWZmcmVzdWx0IHJlcykKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IGJ1Zl9pZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNkZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHJlcyA9PSBTM0MyNDEwX1JFU19PSykKLQkJc2RkLT5zdGF0ZSAmPSB+UlhCVVNZOwotCWVsc2UKLQkJZGV2X2Vycigmc2RkLT5wZGV2LT5kZXYsICJEbWFBYnJ0UngtJWRcbiIsIHNpemUpOwotCi0JLyogSWYgdGhlIG90aGVyIGRvbmUgKi8KLQlpZiAoIShzZGQtPnN0YXRlICYgVFhCVVNZKSkKLQkJY29tcGxldGUoJnNkZC0+eGZlcl9jb21wbGV0aW9uKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkZC0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV9kbWFfdHhjYihzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiwgdm9pZCAqYnVmX2lkLAotCQkJCSBpbnQgc2l6ZSwgZW51bSBzM2MyNDEwX2RtYV9idWZmcmVzdWx0IHJlcykKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IGJ1Zl9pZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNkZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHJlcyA9PSBTM0MyNDEwX1JFU19PSykKLQkJc2RkLT5zdGF0ZSAmPSB+VFhCVVNZOwotCWVsc2UKLQkJZGV2X2Vycigmc2RkLT5wZGV2LT5kZXYsICJEbWFBYnJ0VHgtJWQgXG4iLCBzaXplKTsKLQotCS8qIElmIHRoZSBvdGhlciBkb25lICovCi0JaWYgKCEoc2RkLT5zdGF0ZSAmIFJYQlVTWSkpCi0JCWNvbXBsZXRlKCZzZGQtPnhmZXJfY29tcGxldGlvbik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLX0KLQotI2RlZmluZSBYRkVSX0RNQUFERFJfSU5WQUxJRCBETUFfQklUX01BU0soMzIpCi0KLXN0YXRpYyBpbnQgczNjNjR4eF9zcGlfbWFwX21zc2coc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCi0JCQkJCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyAqc2NpID0gc2RkLT5jbnRybHJfaW5mbzsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2RkLT5wZGV2LT5kZXY7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKLQotCWlmIChtc2ctPmlzX2RtYV9tYXBwZWQpCi0JCXJldHVybiAwOwotCi0JLyogRmlyc3QgbWFyayBhbGwgeGZlciB1bm1hcHBlZCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCXhmZXItPnJ4X2RtYSA9IFhGRVJfRE1BQUREUl9JTlZBTElEOwotCQl4ZmVyLT50eF9kbWEgPSBYRkVSX0RNQUFERFJfSU5WQUxJRDsKLQl9Ci0KLQkvKiBNYXAgdW50aWwgZW5kIG9yIGZpcnN0IGZhaWwgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCi0JCWlmICh4ZmVyLT5sZW4gPD0gKChzY2ktPmZpZm9fbHZsX21hc2sgPj4gMSkgKyAxKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTCkgewotCQkJeGZlci0+dHhfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LAotCQkJCQkodm9pZCAqKXhmZXItPnR4X2J1ZiwgeGZlci0+bGVuLAotCQkJCQlETUFfVE9fREVWSUNFKTsKLQkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIHhmZXItPnR4X2RtYSkpIHsKLQkJCQlkZXZfZXJyKGRldiwgImRtYV9tYXBfc2luZ2xlIFR4IGZhaWxlZFxuIik7Ci0JCQkJeGZlci0+dHhfZG1hID0gWEZFUl9ETUFBRERSX0lOVkFMSUQ7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCX0KLQotCQlpZiAoeGZlci0+cnhfYnVmICE9IE5VTEwpIHsKLQkJCXhmZXItPnJ4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwgeGZlci0+cnhfYnVmLAotCQkJCQkJeGZlci0+bGVuLCBETUFfRlJPTV9ERVZJQ0UpOwotCQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgeGZlci0+cnhfZG1hKSkgewotCQkJCWRldl9lcnIoZGV2LCAiZG1hX21hcF9zaW5nbGUgUnggZmFpbGVkXG4iKTsKLQkJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgeGZlci0+dHhfZG1hLAotCQkJCQkJeGZlci0+bGVuLCBETUFfVE9fREVWSUNFKTsKLQkJCQl4ZmVyLT50eF9kbWEgPSBYRkVSX0RNQUFERFJfSU5WQUxJRDsKLQkJCQl4ZmVyLT5yeF9kbWEgPSBYRkVSX0RNQUFERFJfSU5WQUxJRDsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV91bm1hcF9tc3NnKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAotCQkJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCi17Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gKnNjaSA9IHNkZC0+Y250cmxyX2luZm87Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnNkZC0+cGRldi0+ZGV2OwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7Ci0KLQlpZiAobXNnLT5pc19kbWFfbWFwcGVkKQotCQlyZXR1cm47Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCi0JCWlmICh4ZmVyLT5sZW4gPD0gKChzY2ktPmZpZm9fbHZsX21hc2sgPj4gMSkgKyAxKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh4ZmVyLT5yeF9idWYgIT0gTlVMTAotCQkJCSYmIHhmZXItPnJ4X2RtYSAhPSBYRkVSX0RNQUFERFJfSU5WQUxJRCkKLQkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCB4ZmVyLT5yeF9kbWEsCi0JCQkJCQl4ZmVyLT5sZW4sIERNQV9GUk9NX0RFVklDRSk7Ci0KLQkJaWYgKHhmZXItPnR4X2J1ZiAhPSBOVUxMCi0JCQkJJiYgeGZlci0+dHhfZG1hICE9IFhGRVJfRE1BQUREUl9JTlZBTElEKQotCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIHhmZXItPnR4X2RtYSwKLQkJCQkJCXhmZXItPmxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVfbXNnKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAotCQkJCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyAqc2NpID0gc2RkLT5jbnRybHJfaW5mbzsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gbXNnLT5zcGk7Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2NzaW5mbyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyOwotCWludCBzdGF0dXMgPSAwLCBjc190b2dnbGUgPSAwOwotCXUzMiBzcGVlZDsKLQl1OCBicHc7Ci0KLQkvKiBJZiBNYXN0ZXIncyhjb250cm9sbGVyKSBzdGF0ZSBkaWZmZXJzIGZyb20gdGhhdCBuZWVkZWQgYnkgU2xhdmUgKi8KLQlpZiAoc2RkLT5jdXJfc3BlZWQgIT0gc3BpLT5tYXhfc3BlZWRfaHoKLQkJCXx8IHNkZC0+Y3VyX21vZGUgIT0gc3BpLT5tb2RlCi0JCQl8fCBzZGQtPmN1cl9icHcgIT0gc3BpLT5iaXRzX3Blcl93b3JkKSB7Ci0JCXNkZC0+Y3VyX2JwdyA9IHNwaS0+Yml0c19wZXJfd29yZDsKLQkJc2RkLT5jdXJfc3BlZWQgPSBzcGktPm1heF9zcGVlZF9oejsKLQkJc2RkLT5jdXJfbW9kZSA9IHNwaS0+bW9kZTsKLQkJczNjNjR4eF9zcGlfY29uZmlnKHNkZCk7Ci0JfQotCi0JLyogTWFwIGFsbCB0aGUgdHJhbnNmZXJzIGlmIG5lZWRlZCAqLwotCWlmIChzM2M2NHh4X3NwaV9tYXBfbXNzZyhzZGQsIG1zZykpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkiWGZlcjogVW5hYmxlIHRvIG1hcCBtZXNzYWdlIGJ1ZmZlcnMhXG4iKTsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogQ29uZmlndXJlIGZlZWRiYWNrIGRlbGF5ICovCi0Jd3JpdGVsKGNzLT5mYl9kZWxheSAmIDB4Mywgc2RkLT5yZWdzICsgUzNDNjRYWF9TUElfRkJfQ0xLKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoeGZlciwgJm1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0KLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJaW50IHVzZV9kbWE7Ci0KLQkJSU5JVF9DT01QTEVUSU9OKHNkZC0+eGZlcl9jb21wbGV0aW9uKTsKLQotCQkvKiBPbmx5IEJQVyBhbmQgU3BlZWQgbWF5IGNoYW5nZSBhY3Jvc3MgdHJhbnNmZXJzICovCi0JCWJwdyA9IHhmZXItPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKLQkJc3BlZWQgPSB4ZmVyLT5zcGVlZF9oeiA/IDogc3BpLT5tYXhfc3BlZWRfaHo7Ci0KLQkJaWYgKHhmZXItPmxlbiAlIChicHcgLyA4KSkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJIlhmZXIgbGVuZ3RoKCV1KSBub3QgYSBtdWx0aXBsZSBvZiB3b3JkIHNpemUoJXUpXG4iLAotCQkJCXhmZXItPmxlbiwgYnB3IC8gOCk7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoYnB3ICE9IHNkZC0+Y3VyX2JwdyB8fCBzcGVlZCAhPSBzZGQtPmN1cl9zcGVlZCkgewotCQkJc2RkLT5jdXJfYnB3ID0gYnB3OwotCQkJc2RkLT5jdXJfc3BlZWQgPSBzcGVlZDsKLQkJCXMzYzY0eHhfc3BpX2NvbmZpZyhzZGQpOwotCQl9Ci0KLQkJLyogUG9sbGluZyBtZXRob2QgZm9yIHhmZXJzIG5vdCBiaWdnZXIgdGhhbiBGSUZPIGNhcGFjaXR5ICovCi0JCWlmICh4ZmVyLT5sZW4gPD0gKChzY2ktPmZpZm9fbHZsX21hc2sgPj4gMSkgKyAxKSkKLQkJCXVzZV9kbWEgPSAwOwotCQllbHNlCi0JCQl1c2VfZG1hID0gMTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2RkLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogUGVuZGluZyBvbmx5IHdoaWNoIGlzIHRvIGJlIGRvbmUgKi8KLQkJc2RkLT5zdGF0ZSAmPSB+UlhCVVNZOwotCQlzZGQtPnN0YXRlICY9IH5UWEJVU1k7Ci0KLQkJZW5hYmxlX2RhdGFwYXRoKHNkZCwgc3BpLCB4ZmVyLCB1c2VfZG1hKTsKLQotCQkvKiBTbGF2ZSBTZWxlY3QgKi8KLQkJZW5hYmxlX2NzKHNkZCwgc3BpKTsKLQotCQkvKiBTdGFydCB0aGUgc2lnbmFscyAqLwotCQlTM0M2NFhYX1NQSV9BQ1Qoc2RkKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQotCQlzdGF0dXMgPSB3YWl0X2Zvcl94ZmVyKHNkZCwgeGZlciwgdXNlX2RtYSk7Ci0KLQkJLyogUXVpZXNlIHRoZSBzaWduYWxzICovCi0JCVMzQzY0WFhfU1BJX0RFQUNUKHNkZCk7Ci0KLQkJaWYgKHN0YXR1cykgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsICJJL08gRXJyb3I6ICIKLQkJCQkicngtJWQgdHgtJWQgcmVzOnJ4LSVjIHR4LSVjIGxlbi0lZFxuIiwKLQkJCQl4ZmVyLT5yeF9idWYgPyAxIDogMCwgeGZlci0+dHhfYnVmID8gMSA6IDAsCi0JCQkJKHNkZC0+c3RhdGUgJiBSWEJVU1kpID8gJ2YnIDogJ3AnLAotCQkJCShzZGQtPnN0YXRlICYgVFhCVVNZKSA/ICdmJyA6ICdwJywKLQkJCQl4ZmVyLT5sZW4pOwotCi0JCQlpZiAodXNlX2RtYSkgewotCQkJCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTAotCQkJCQkJJiYgKHNkZC0+c3RhdGUgJiBUWEJVU1kpKQotCQkJCQlzM2MyNDEwX2RtYV9jdHJsKHNkZC0+dHhfZG1hY2gsCi0JCQkJCQkJUzNDMjQxMF9ETUFPUF9GTFVTSCk7Ci0JCQkJaWYgKHhmZXItPnJ4X2J1ZiAhPSBOVUxMCi0JCQkJCQkmJiAoc2RkLT5zdGF0ZSAmIFJYQlVTWSkpCi0JCQkJCXMzYzI0MTBfZG1hX2N0cmwoc2RkLT5yeF9kbWFjaCwKLQkJCQkJCQlTM0MyNDEwX0RNQU9QX0ZMVVNIKTsKLQkJCX0KLQotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoeGZlci0+ZGVsYXlfdXNlY3MpCi0JCQl1ZGVsYXkoeGZlci0+ZGVsYXlfdXNlY3MpOwotCi0JCWlmICh4ZmVyLT5jc19jaGFuZ2UpIHsKLQkJCS8qIEhpbnQgdGhhdCB0aGUgbmV4dCBtc3NnIGlzIGdvbm5hIGJlCi0JCQkgICBmb3IgdGhlIHNhbWUgZGV2aWNlICovCi0JCQlpZiAobGlzdF9pc19sYXN0KCZ4ZmVyLT50cmFuc2Zlcl9saXN0LAotCQkJCQkJJm1zZy0+dHJhbnNmZXJzKSkKLQkJCQljc190b2dnbGUgPSAxOwotCQkJZWxzZQotCQkJCWRpc2FibGVfY3Moc2RkLCBzcGkpOwotCQl9Ci0KLQkJbXNnLT5hY3R1YWxfbGVuZ3RoICs9IHhmZXItPmxlbjsKLQotCQlmbHVzaF9maWZvKHNkZCk7Ci0JfQotCi1vdXQ6Ci0JaWYgKCFjc190b2dnbGUgfHwgc3RhdHVzKQotCQlkaXNhYmxlX2NzKHNkZCwgc3BpKTsKLQllbHNlCi0JCXNkZC0+dGdsX3NwaSA9IHNwaTsKLQotCXMzYzY0eHhfc3BpX3VubWFwX21zc2coc2RkLCBtc2cpOwotCi0JbXNnLT5zdGF0dXMgPSBzdGF0dXM7Ci0KLQlpZiAobXNnLT5jb21wbGV0ZSkKLQkJbXNnLT5jb21wbGV0ZShtc2ctPmNvbnRleHQpOwotfQotCi1zdGF0aWMgaW50IGFjcXVpcmVfZG1hKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkKQotewotCWlmIChzM2MyNDEwX2RtYV9yZXF1ZXN0KHNkZC0+cnhfZG1hY2gsCi0JCQkJCSZzM2M2NHh4X3NwaV9kbWFfY2xpZW50LCBOVUxMKSA8IDApIHsKLQkJZGV2X2Vycigmc2RkLT5wZGV2LT5kZXYsICJjYW5ub3QgZ2V0IFJ4RE1BXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihzZGQtPnJ4X2RtYWNoLCBzM2M2NHh4X3NwaV9kbWFfcnhjYik7Ci0JczNjMjQxMF9kbWFfZGV2Y29uZmlnKHNkZC0+cnhfZG1hY2gsIFMzQzI0MTBfRE1BU1JDX0hXLAotCQkJCQlzZGQtPnNmcl9zdGFydCArIFMzQzY0WFhfU1BJX1JYX0RBVEEpOwotCi0JaWYgKHMzYzI0MTBfZG1hX3JlcXVlc3Qoc2RkLT50eF9kbWFjaCwKLQkJCQkJJnMzYzY0eHhfc3BpX2RtYV9jbGllbnQsIE5VTEwpIDwgMCkgewotCQlkZXZfZXJyKCZzZGQtPnBkZXYtPmRldiwgImNhbm5vdCBnZXQgVHhETUFcbiIpOwotCQlzM2MyNDEwX2RtYV9mcmVlKHNkZC0+cnhfZG1hY2gsICZzM2M2NHh4X3NwaV9kbWFfY2xpZW50KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihzZGQtPnR4X2RtYWNoLCBzM2M2NHh4X3NwaV9kbWFfdHhjYik7Ci0JczNjMjQxMF9kbWFfZGV2Y29uZmlnKHNkZC0+dHhfZG1hY2gsIFMzQzI0MTBfRE1BU1JDX01FTSwKLQkJCQkJc2RkLT5zZnJfc3RhcnQgKyBTM0M2NFhYX1NQSV9UWF9EQVRBKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQkJCQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEsIHdvcmspOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBBY3F1aXJlIERNQSBjaGFubmVscyAqLwotCXdoaWxlICghYWNxdWlyZV9kbWEoc2RkKSkKLQkJbXNsZWVwKDEwKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlICghbGlzdF9lbXB0eSgmc2RkLT5xdWV1ZSkKLQkJCQkmJiAhKHNkZC0+c3RhdGUgJiBTVVNQTkQpKSB7Ci0KLQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2c7Ci0KLQkJbXNnID0gY29udGFpbmVyX29mKHNkZC0+cXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7Ci0KLQkJbGlzdF9kZWxfaW5pdCgmbXNnLT5xdWV1ZSk7Ci0KLQkJLyogU2V0IFhmZXIgYnVzeSBmbGFnICovCi0JCXNkZC0+c3RhdGUgfD0gU1BJQlVTWTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQotCQloYW5kbGVfbXNnKHNkZCwgbXNnKTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2RkLT5sb2NrLCBmbGFncyk7Ci0KLQkJc2RkLT5zdGF0ZSAmPSB+U1BJQlVTWTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQotCS8qIEZyZWUgRE1BIGNoYW5uZWxzICovCi0JczNjMjQxMF9kbWFfZnJlZShzZGQtPnR4X2RtYWNoLCAmczNjNjR4eF9zcGlfZG1hX2NsaWVudCk7Ci0JczNjMjQxMF9kbWFfZnJlZShzZGQtPnJ4X2RtYWNoLCAmczNjNjR4eF9zcGlfZG1hX2NsaWVudCk7Ci19Ci0KLXN0YXRpYyBpbnQgczNjNjR4eF9zcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzZGQgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChzZGQtPnN0YXRlICYgU1VTUE5EKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkZC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVTSFVURE9XTjsKLQl9Ci0KLQltc2ctPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKLQltc2ctPmFjdHVhbF9sZW5ndGggPSAwOwotCi0JbGlzdF9hZGRfdGFpbCgmbXNnLT5xdWV1ZSwgJnNkZC0+cXVldWUpOwotCi0JcXVldWVfd29yayhzZGQtPndvcmtxdWV1ZSwgJnNkZC0+d29yayk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogSGVyZSB3ZSBvbmx5IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbgotICogYW5kIHNhdmUgdGhlIGNvbmZpZ3VyYXRpb24gaW4gYSBsb2NhbCBkYXRhLXN0cnVjdHVyZS4KLSAqIFRoZSBjb250cm9sbGVyIGlzIGFjdHVhbGx5IGNvbmZpZ3VyZWQgb25seSBqdXN0IGJlZm9yZSB3ZQotICogZ2V0IGEgbWVzc2FnZSB0byB0cmFuc2Zlci4KLSAqLwotc3RhdGljIGludCBzM2M2NHh4X3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBzM2M2NHh4X3NwaV9jc2luZm8gKmNzID0gc3BpLT5jb250cm9sbGVyX2RhdGE7Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQ7Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gKnNjaTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlcnIgPSAwOwotCi0JaWYgKGNzID09IE5VTEwgfHwgY3MtPnNldF9sZXZlbCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiTm8gQ1MgZm9yIFNQSSglZClcbiIsIHNwaS0+Y2hpcF9zZWxlY3QpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlzZGQgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlzY2kgPSBzZGQtPmNudHJscl9pbmZvOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNkZC0+bG9jaywgZmxhZ3MpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtc2csICZzZGQtPnF1ZXVlLCBxdWV1ZSkgewotCQkvKiBJcyBzb21lIG1zc2cgaXMgYWxyZWFkeSBxdWV1ZWQgZm9yIHRoaXMgZGV2aWNlICovCi0JCWlmIChtc2ctPnNwaSA9PSBzcGkpIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJCSJzZXR1cDogYXR0ZW1wdCB3aGlsZSBtc3NnIGluIHF1ZXVlIVxuIik7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQl9Ci0KLQlpZiAoc2RkLT5zdGF0ZSAmIFNVU1BORCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkic2V0dXA6IFNQSS0lZCBub3QgYWN0aXZlIVxuIiwgc3BpLT5tYXN0ZXItPmJ1c19udW0pOwotCQlyZXR1cm4gLUVTSFVURE9XTjsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgIT0gOAotCQkJJiYgc3BpLT5iaXRzX3Blcl93b3JkICE9IDE2Ci0JCQkmJiBzcGktPmJpdHNfcGVyX3dvcmQgIT0gMzIpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJzZXR1cDogJWRiaXRzL3dyZCBub3Qgc3VwcG9ydGVkIVxuIiwKLQkJCQkJCQlzcGktPmJpdHNfcGVyX3dvcmQpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIHNldHVwX2V4aXQ7Ci0JfQotCi0JLyogQ2hlY2sgaWYgd2UgY2FuIHByb3ZpZGUgdGhlIHJlcXVlc3RlZCByYXRlICovCi0JaWYgKCFzY2ktPmNsa19mcm9tX2NtdSkgewotCQl1MzIgcHNyLCBzcGVlZDsKLQotCQkvKiBNYXggcG9zc2libGUgKi8KLQkJc3BlZWQgPSBjbGtfZ2V0X3JhdGUoc2RkLT5zcmNfY2xrKSAvIDIgLyAoMCArIDEpOwotCi0JCWlmIChzcGktPm1heF9zcGVlZF9oeiA+IHNwZWVkKQotCQkJc3BpLT5tYXhfc3BlZWRfaHogPSBzcGVlZDsKLQotCQlwc3IgPSBjbGtfZ2V0X3JhdGUoc2RkLT5zcmNfY2xrKSAvIDIgLyBzcGktPm1heF9zcGVlZF9oeiAtIDE7Ci0JCXBzciAmPSBTM0M2NFhYX1NQSV9QU1JfTUFTSzsKLQkJaWYgKHBzciA9PSBTM0M2NFhYX1NQSV9QU1JfTUFTSykKLQkJCXBzci0tOwotCi0JCXNwZWVkID0gY2xrX2dldF9yYXRlKHNkZC0+c3JjX2NsaykgLyAyIC8gKHBzciArIDEpOwotCQlpZiAoc3BpLT5tYXhfc3BlZWRfaHogPCBzcGVlZCkgewotCQkJaWYgKHBzcisxIDwgUzNDNjRYWF9TUElfUFNSX01BU0spIHsKLQkJCQlwc3IrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCQlnb3RvIHNldHVwX2V4aXQ7Ci0JCQl9Ci0JCX0KLQotCQlzcGVlZCA9IGNsa19nZXRfcmF0ZShzZGQtPnNyY19jbGspIC8gMiAvIChwc3IgKyAxKTsKLQkJaWYgKHNwaS0+bWF4X3NwZWVkX2h6ID49IHNwZWVkKQotCQkJc3BpLT5tYXhfc3BlZWRfaHogPSBzcGVlZDsKLQkJZWxzZQotCQkJZXJyID0gLUVJTlZBTDsKLQl9Ci0KLXNldHVwX2V4aXQ6Ci0KLQkvKiBzZXR1cCgpIHJldHVybnMgd2l0aCBkZXZpY2UgZGUtc2VsZWN0ZWQgKi8KLQlkaXNhYmxlX2NzKHNkZCwgc3BpKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzYzY0eHhfc3BpX2h3aW5pdChzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwgaW50IGNoYW5uZWwpCi17Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gKnNjaSA9IHNkZC0+Y250cmxyX2luZm87Ci0Jdm9pZCBfX2lvbWVtICpyZWdzID0gc2RkLT5yZWdzOwotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQlzZGQtPmN1cl9zcGVlZCA9IDA7Ci0KLQlTM0M2NFhYX1NQSV9ERUFDVChzZGQpOwotCi0JLyogRGlzYWJsZSBJbnRlcnJ1cHRzIC0gd2UgdXNlIFBvbGxpbmcgaWYgbm90IERNQSBtb2RlICovCi0Jd3JpdGVsKDAsIHJlZ3MgKyBTM0M2NFhYX1NQSV9JTlRfRU4pOwotCi0JaWYgKCFzY2ktPmNsa19mcm9tX2NtdSkKLQkJd3JpdGVsKHNjaS0+c3JjX2Nsa19uciA8PCBTM0M2NFhYX1NQSV9DTEtTRUxfU1JDU0hGVCwKLQkJCQlyZWdzICsgUzNDNjRYWF9TUElfQ0xLX0NGRyk7Ci0Jd3JpdGVsKDAsIHJlZ3MgKyBTM0M2NFhYX1NQSV9NT0RFX0NGRyk7Ci0Jd3JpdGVsKDAsIHJlZ3MgKyBTM0M2NFhYX1NQSV9QQUNLRVRfQ05UKTsKLQotCS8qIENsZWFyIGFueSBpcnEgcGVuZGluZyBiaXRzICovCi0Jd3JpdGVsKHJlYWRsKHJlZ3MgKyBTM0M2NFhYX1NQSV9QRU5ESU5HX0NMUiksCi0JCQkJcmVncyArIFMzQzY0WFhfU1BJX1BFTkRJTkdfQ0xSKTsKLQotCXdyaXRlbCgwLCByZWdzICsgUzNDNjRYWF9TUElfU1dBUF9DRkcpOwotCi0JdmFsID0gcmVhZGwocmVncyArIFMzQzY0WFhfU1BJX01PREVfQ0ZHKTsKLQl2YWwgJj0gflMzQzY0WFhfU1BJX01PREVfNEJVUlNUOwotCXZhbCAmPSB+KFMzQzY0WFhfU1BJX01BWF9UUkFJTENOVCA8PCBTM0M2NFhYX1NQSV9UUkFJTENOVF9PRkYpOwotCXZhbCB8PSAoUzNDNjRYWF9TUElfVFJBSUxDTlQgPDwgUzNDNjRYWF9TUElfVFJBSUxDTlRfT0ZGKTsKLQl3cml0ZWwodmFsLCByZWdzICsgUzNDNjRYWF9TUElfTU9ERV9DRkcpOwotCi0JZmx1c2hfZmlmbyhzZGQpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBzM2M2NHh4X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCByZXNvdXJjZQkqbWVtX3JlcywgKmRtYXR4X3JlcywgKmRtYXJ4X3JlczsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZDsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyAqc2NpOwotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7Ci0JaW50IHJldDsKLQotCWlmIChwZGV2LT5pZCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCSJJbnZhbGlkIHBsYXRmb3JtIGRldmljZSBpZC0lZFxuIiwgcGRldi0+aWQpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwbGF0Zm9ybV9kYXRhIG1pc3NpbmchXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0Jc2NpID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKCFzY2ktPnNyY19jbGtfbmFtZSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiQm9hcmQgaW5pdCBtdXN0IGNhbGwgczNjNjR4eF9zcGlfc2V0X2luZm8oKVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgbmVjZXNzYXJ5IHJlc291cmNlICovCi0KLQlkbWF0eF9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDApOwotCWlmIChkbWF0eF9yZXMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IFNQSS1UeCBkbWEgcmVzb3VyY2VcbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCWRtYXJ4X3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMSk7Ci0JaWYgKGRtYXJ4X3JlcyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgU1BJLVJ4IGRtYSByZXNvdXJjZVxuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JbWVtX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKG1lbV9yZXMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IFNQSSBNRU0gcmVzb3VyY2VcbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwKLQkJCQlzaXplb2Yoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhKSk7Ci0JaWYgKG1hc3RlciA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBTUEkgTWFzdGVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKLQotCXNkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzZGQtPm1hc3RlciA9IG1hc3RlcjsKLQlzZGQtPmNudHJscl9pbmZvID0gc2NpOwotCXNkZC0+cGRldiA9IHBkZXY7Ci0Jc2RkLT5zZnJfc3RhcnQgPSBtZW1fcmVzLT5zdGFydDsKLQlzZGQtPnR4X2RtYWNoID0gZG1hdHhfcmVzLT5zdGFydDsKLQlzZGQtPnJ4X2RtYWNoID0gZG1hcnhfcmVzLT5zdGFydDsKLQotCXNkZC0+Y3VyX2JwdyA9IDg7Ci0KLQltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKLQltYXN0ZXItPnNldHVwID0gczNjNjR4eF9zcGlfc2V0dXA7Ci0JbWFzdGVyLT50cmFuc2ZlciA9IHMzYzY0eHhfc3BpX3RyYW5zZmVyOwotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBzY2ktPm51bV9jczsKLQltYXN0ZXItPmRtYV9hbGlnbm1lbnQgPSA4OwotCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLwotCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOwotCi0JaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihtZW1fcmVzLT5zdGFydCwKLQkJCXJlc291cmNlX3NpemUobWVtX3JlcyksIHBkZXYtPm5hbWUpID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiUmVxIG1lbSByZWdpb24gZmFpbGVkXG4iKTsKLQkJcmV0ID0gLUVOWElPOwotCQlnb3RvIGVycjA7Ci0JfQotCi0Jc2RkLT5yZWdzID0gaW9yZW1hcChtZW1fcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW1fcmVzKSk7Ci0JaWYgKHNkZC0+cmVncyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byByZW1hcCBJT1xuIik7Ci0JCXJldCA9IC1FTlhJTzsKLQkJZ290byBlcnIxOwotCX0KLQotCWlmIChzY2ktPmNmZ19ncGlvID09IE5VTEwgfHwgc2NpLT5jZmdfZ3BpbyhwZGV2KSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gY29uZmlnIGdwaW9cbiIpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyMjsKLQl9Ci0KLQkvKiBTZXR1cCBjbG9ja3MgKi8KLQlzZGQtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInNwaSIpOwotCWlmIChJU19FUlIoc2RkLT5jbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhY3F1aXJlIGNsb2NrICdzcGknXG4iKTsKLQkJcmV0ID0gUFRSX0VSUihzZGQtPmNsayk7Ci0JCWdvdG8gZXJyMzsKLQl9Ci0KLQlpZiAoY2xrX2VuYWJsZShzZGQtPmNsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgZW5hYmxlIGNsb2NrICdzcGknXG4iKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVycjQ7Ci0JfQotCi0Jc2RkLT5zcmNfY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBzY2ktPnNyY19jbGtfbmFtZSk7Ci0JaWYgKElTX0VSUihzZGQtPnNyY19jbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJVbmFibGUgdG8gYWNxdWlyZSBjbG9jayAnJXMnXG4iLCBzY2ktPnNyY19jbGtfbmFtZSk7Ci0JCXJldCA9IFBUUl9FUlIoc2RkLT5zcmNfY2xrKTsKLQkJZ290byBlcnI1OwotCX0KLQotCWlmIChjbGtfZW5hYmxlKHNkZC0+c3JjX2NsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgZW5hYmxlIGNsb2NrICclcydcbiIsCi0JCQkJCQkJc2NpLT5zcmNfY2xrX25hbWUpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyNjsKLQl9Ci0KLQlzZGQtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAotCQkJCQkJZGV2X25hbWUobWFzdGVyLT5kZXYucGFyZW50KSk7Ci0JaWYgKHNkZC0+d29ya3F1ZXVlID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGNyZWF0ZSB3b3JrcXVldWVcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjc7Ci0JfQotCi0JLyogU2V0dXAgRGV1ZnVsdCBNb2RlICovCi0JczNjNjR4eF9zcGlfaHdpbml0KHNkZCwgcGRldi0+aWQpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnNkZC0+bG9jayk7Ci0JaW5pdF9jb21wbGV0aW9uKCZzZGQtPnhmZXJfY29tcGxldGlvbik7Ci0JSU5JVF9XT1JLKCZzZGQtPndvcmssIHMzYzY0eHhfc3BpX3dvcmspOwotCUlOSVRfTElTVF9IRUFEKCZzZGQtPnF1ZXVlKTsKLQotCWlmIChzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3RlcikpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlZ2lzdGVyIFNQSSBtYXN0ZXJcbiIpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyODsKLQl9Ci0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICJTYW1zdW5nIFNvQyBTUEkgRHJpdmVyIGxvYWRlZCBmb3IgQnVzIFNQSS0lZCAiCi0JCQkJCSJ3aXRoICVkIFNsYXZlcyBhdHRhY2hlZFxuIiwKLQkJCQkJcGRldi0+aWQsIG1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpOwotCWRldl9kYmcoJnBkZXYtPmRldiwgIlx0SU9tZW09WzB4JXgtMHgleF1cdERNQT1bUngtJWQsIFR4LSVkXVxuIiwKLQkJCQkJbWVtX3Jlcy0+ZW5kLCBtZW1fcmVzLT5zdGFydCwKLQkJCQkJc2RkLT5yeF9kbWFjaCwgc2RkLT50eF9kbWFjaCk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyODoKLQlkZXN0cm95X3dvcmtxdWV1ZShzZGQtPndvcmtxdWV1ZSk7Ci1lcnI3OgotCWNsa19kaXNhYmxlKHNkZC0+c3JjX2Nsayk7Ci1lcnI2OgotCWNsa19wdXQoc2RkLT5zcmNfY2xrKTsKLWVycjU6Ci0JY2xrX2Rpc2FibGUoc2RkLT5jbGspOwotZXJyNDoKLQljbGtfcHV0KHNkZC0+Y2xrKTsKLWVycjM6Ci1lcnIyOgotCWlvdW5tYXAoKHZvaWQgKikgc2RkLT5yZWdzKTsKLWVycjE6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1lbV9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbV9yZXMpKTsKLWVycjA6Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0Jc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgczNjNjR4eF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKTsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzdHJ1Y3QgcmVzb3VyY2UJKm1lbV9yZXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQlzZGQtPnN0YXRlIHw9IFNVU1BORDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChzZGQtPnN0YXRlICYgU1BJQlVTWSkKLQkJbXNsZWVwKDEwKTsKLQotCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotCi0JZGVzdHJveV93b3JrcXVldWUoc2RkLT53b3JrcXVldWUpOwotCi0JY2xrX2Rpc2FibGUoc2RkLT5zcmNfY2xrKTsKLQljbGtfcHV0KHNkZC0+c3JjX2Nsayk7Ci0KLQljbGtfZGlzYWJsZShzZGQtPmNsayk7Ci0JY2xrX3B1dChzZGQtPmNsayk7Ci0KLQlpb3VubWFwKCh2b2lkICopIHNkZC0+cmVncyk7Ci0KLQltZW1fcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAobWVtX3JlcyAhPSBOVUxMKQotCQlyZWxlYXNlX21lbV9yZWdpb24obWVtX3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtX3JlcykpOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0Jc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHMzYzY0eHhfc3BpX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7Ci0Jc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQlzZGQtPnN0YXRlIHw9IFNVU1BORDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChzZGQtPnN0YXRlICYgU1BJQlVTWSkKLQkJbXNsZWVwKDEwKTsKLQotCS8qIERpc2FibGUgdGhlIGNsb2NrICovCi0JY2xrX2Rpc2FibGUoc2RkLT5zcmNfY2xrKTsKLQljbGtfZGlzYWJsZShzZGQtPmNsayk7Ci0KLQlzZGQtPmN1cl9zcGVlZCA9IDA7IC8qIE91dHB1dCBDbG9jayBpcyBzdG9wcGVkICovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzM2M2NHh4X3NwaV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpX21hc3Rlcl9nZXQocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpOwotCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXN0cnVjdCBzM2M2NHh4X3NwaV9pbmZvICpzY2kgPSBzZGQtPmNudHJscl9pbmZvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzY2ktPmNmZ19ncGlvKHBkZXYpOwotCi0JLyogRW5hYmxlIHRoZSBjbG9jayAqLwotCWNsa19lbmFibGUoc2RkLT5zcmNfY2xrKTsKLQljbGtfZW5hYmxlKHNkZC0+Y2xrKTsKLQotCXMzYzY0eHhfc3BpX2h3aW5pdChzZGQsIHBkZXYtPmlkKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLQlzZGQtPnN0YXRlICY9IH5TVVNQTkQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIHMzYzY0eHhfc3BpX3N1c3BlbmQJTlVMTAotI2RlZmluZSBzM2M2NHh4X3NwaV9yZXN1bWUJTlVMTAotI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2M2NHh4X3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiczNjNjR4eC1zcGkiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5yZW1vdmUgPSBzM2M2NHh4X3NwaV9yZW1vdmUsCi0JLnN1c3BlbmQgPSBzM2M2NHh4X3NwaV9zdXNwZW5kLAotCS5yZXN1bWUgPSBzM2M2NHh4X3NwaV9yZXN1bWUsCi19OwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzM2M2NHh4LXNwaSIpOwotCi1zdGF0aWMgaW50IF9faW5pdCBzM2M2NHh4X3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmczNjNjR4eF9zcGlfZHJpdmVyLCBzM2M2NHh4X3NwaV9wcm9iZSk7Ci19Ci1zdWJzeXNfaW5pdGNhbGwoczNjNjR4eF9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzM2M2NHh4X3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzY0eHhfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChzM2M2NHh4X3NwaV9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0M2NFhYIFNQSSBDb250cm9sbGVyIERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX3NoX3NjaS5jIGIvZHJpdmVycy9zcGkvc3BpX3NoX3NjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzY0MzkxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3BpL3NwaV9zaF9zY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKgotICogU0ggU0NJIFNQSSBpbnRlcmZhY2UKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFnbnVzIERhbW0KLSAqCi0gKiBCYXNlZCBvbiBTM0MyNFhYIEdQSU8gYmFzZWQgU1BJIGRyaXZlciwgd2hpY2ggaXM6Ci0gKiAgIENvcHlyaWdodCAoYykgMjAwNiBCZW4gRG9va3MKLSAqICAgQ29weXJpZ2h0IChjKSAyMDA2IFNpbXRlYyBFbGVjdHJvbmljcwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgotCi0jaW5jbHVkZSA8YXNtL3NwaS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi1zdHJ1Y3Qgc2hfc2NpX3NwaSB7Ci0Jc3RydWN0IHNwaV9iaXRiYW5nIGJpdGJhbmc7Ci0KLQl2b2lkIF9faW9tZW0gKm1lbWJhc2U7Ci0JdW5zaWduZWQgY2hhciB2YWw7Ci0Jc3RydWN0IHNoX3NwaV9pbmZvICppbmZvOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKLX07Ci0KLSNkZWZpbmUgU0NTUFRSKHNwKQkoc3AtPm1lbWJhc2UgKyAweDFjKQotI2RlZmluZSBQSU5fU0NLCQkoMSA8PCAyKQotI2RlZmluZSBQSU5fVFhECQkoMSA8PCAwKQotI2RlZmluZSBQSU5fUlhECQlQSU5fVFhECi0jZGVmaW5lIFBJTl9JTklUCSgoMSA8PCAxKSB8ICgxIDw8IDMpIHwgUElOX1NDSyB8IFBJTl9UWEQpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRiaXRzKHN0cnVjdCBzaF9zY2lfc3BpICpzcCwgaW50IGJpdHMsIGludCBvbikKLXsKLQkvKgotCSAqIFdlIGFyZSB0aGUgb25seSB1c2VyIG9mIFNDU1BUUiBzbyBubyBsb2NraW5nIGlzIHJlcXVpcmVkLgotCSAqIFJlYWRpbmcgYml0IDIgYW5kIDAgaW4gU0NTUFRSIGdpdmVzIHBpbiBzdGF0ZSBhcyBpbnB1dC4KLQkgKiBXcml0aW5nIHRoZSBzYW1lIGJpdHMgc2V0cyB0aGUgb3V0cHV0IHZhbHVlLgotCSAqIFRoaXMgbWFrZXMgcmVndWxhciByZWFkLW1vZGlmeS13cml0ZSBkaWZmaWN1bHQgc28gd2UKLQkgKiB1c2Ugc3AtPnZhbCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXRlc3QgcmVnaXN0ZXIgdmFsdWUuCi0JICovCi0KLQlpZiAob24pCi0JCXNwLT52YWwgfD0gYml0czsKLQllbHNlCi0JCXNwLT52YWwgJj0gfmJpdHM7Ci0KLQlpb3dyaXRlOChzcC0+dmFsLCBTQ1NQVFIoc3ApKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldHNjayhzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2LCBpbnQgb24pCi17Ci0Jc2V0Yml0cyhzcGlfbWFzdGVyX2dldF9kZXZkYXRhKGRldi0+bWFzdGVyKSwgUElOX1NDSywgb24pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0bW9zaShzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2LCBpbnQgb24pCi17Ci0Jc2V0Yml0cyhzcGlfbWFzdGVyX2dldF9kZXZkYXRhKGRldi0+bWFzdGVyKSwgUElOX1RYRCwgb24pOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBnZXRtaXNvKHN0cnVjdCBzcGlfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNoX3NjaV9zcGkgKnNwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShkZXYtPm1hc3Rlcik7Ci0KLQlyZXR1cm4gKGlvcmVhZDgoU0NTUFRSKHNwKSkgJiBQSU5fUlhEKSA/IDEgOiAwOwotfQotCi0jZGVmaW5lIHNwaWRlbGF5KHgpIG5kZWxheSh4KQotCi0jaW5jbHVkZSAic3BpX2JpdGJhbmdfdHhyeC5oIgotCi1zdGF0aWMgdTMyIHNoX3NjaV9zcGlfdHhyeF9tb2RlMChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgICAgIHVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKLXsKLQlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIDAsIHdvcmQsIGJpdHMpOwotfQotCi1zdGF0aWMgdTMyIHNoX3NjaV9zcGlfdHhyeF9tb2RlMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgICAgIHVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKLXsKLQlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGExKHNwaSwgbnNlY3MsIDAsIDAsIHdvcmQsIGJpdHMpOwotfQotCi1zdGF0aWMgdTMyIHNoX3NjaV9zcGlfdHhyeF9tb2RlMihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgICAgIHVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKLXsKLQlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDEsIDAsIHdvcmQsIGJpdHMpOwotfQotCi1zdGF0aWMgdTMyIHNoX3NjaV9zcGlfdHhyeF9tb2RlMyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgICAgIHVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKLXsKLQlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGExKHNwaSwgbnNlY3MsIDEsIDAsIHdvcmQsIGJpdHMpOwotfQotCi1zdGF0aWMgdm9pZCBzaF9zY2lfc3BpX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKmRldiwgaW50IHZhbHVlKQotewotCXN0cnVjdCBzaF9zY2lfc3BpICpzcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoZGV2LT5tYXN0ZXIpOwotCi0JaWYgKHNwLT5pbmZvICYmIHNwLT5pbmZvLT5jaGlwX3NlbGVjdCkKLQkJKHNwLT5pbmZvLT5jaGlwX3NlbGVjdCkoc3AtPmluZm8sIGRldi0+Y2hpcF9zZWxlY3QsIHZhbHVlKTsKLX0KLQotc3RhdGljIGludCBzaF9zY2lfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UJKnI7Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKLQlzdHJ1Y3Qgc2hfc2NpX3NwaSAqc3A7Ci0JaW50IHJldDsKLQotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJmRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHNoX3NjaV9zcGkpKTsKLQlpZiAobWFzdGVyID09IE5VTEwpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgc3BpIG1hc3RlclxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyMDsKLQl9Ci0KLQlzcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgc3ApOwotCXNwLT5pbmZvID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCS8qIHNldHVwIHNwaSBiaXRiYW5nIGFkYXB0b3IgKi8KLQlzcC0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOwotCXNwLT5iaXRiYW5nLm1hc3Rlci0+YnVzX251bSA9IHNwLT5pbmZvLT5idXNfbnVtOwotCXNwLT5iaXRiYW5nLm1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBzcC0+aW5mby0+bnVtX2NoaXBzZWxlY3Q7Ci0Jc3AtPmJpdGJhbmcuY2hpcHNlbGVjdCA9IHNoX3NjaV9zcGlfY2hpcHNlbGVjdDsKLQotCXNwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8wXSA9IHNoX3NjaV9zcGlfdHhyeF9tb2RlMDsKLQlzcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMV0gPSBzaF9zY2lfc3BpX3R4cnhfbW9kZTE7Ci0Jc3AtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzJdID0gc2hfc2NpX3NwaV90eHJ4X21vZGUyOwotCXNwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8zXSA9IHNoX3NjaV9zcGlfdHhyeF9tb2RlMzsKLQotCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKHIgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIGVycjE7Ci0JfQotCXNwLT5tZW1iYXNlID0gaW9yZW1hcChyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7Ci0JaWYgKCFzcC0+bWVtYmFzZSkgewotCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gZXJyMTsKLQl9Ci0Jc3AtPnZhbCA9IGlvcmVhZDgoU0NTUFRSKHNwKSk7Ci0Jc2V0Yml0cyhzcCwgUElOX0lOSVQsIDEpOwotCi0JcmV0ID0gc3BpX2JpdGJhbmdfc3RhcnQoJnNwLT5iaXRiYW5nKTsKLQlpZiAoIXJldCkKLQkJcmV0dXJuIDA7Ci0KLQlzZXRiaXRzKHNwLCBQSU5fSU5JVCwgMCk7Ci0JaW91bm1hcChzcC0+bWVtYmFzZSk7Ci0gZXJyMToKLQlzcGlfbWFzdGVyX3B1dChzcC0+Yml0YmFuZy5tYXN0ZXIpOwotIGVycjA6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzaF9zY2lfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNoX3NjaV9zcGkgKnNwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlvdW5tYXAoc3AtPm1lbWJhc2UpOwotCXNldGJpdHMoc3AsIFBJTl9JTklULCAwKTsKLQlzcGlfYml0YmFuZ19zdG9wKCZzcC0+Yml0YmFuZyk7Ci0Jc3BpX21hc3Rlcl9wdXQoc3AtPmJpdGJhbmcubWFzdGVyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2hfc2NpX3NwaV9kcnYgPSB7Ci0JLnByb2JlCQk9IHNoX3NjaV9zcGlfcHJvYmUsCi0JLnJlbW92ZQkJPSBzaF9zY2lfc3BpX3JlbW92ZSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAic3BpX3NoX3NjaSIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzaF9zY2lfc3BpX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaF9zY2lfc3BpX2Rydik7Ci19Ci1tb2R1bGVfaW5pdChzaF9zY2lfc3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc2hfc2NpX3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNoX3NjaV9zcGlfZHJ2KTsKLX0KLW1vZHVsZV9leGl0KHNoX3NjaV9zcGlfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiU0ggU0NJIFNQSSBEcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIk1hZ251cyBEYW1tIDxkYW1tQG9wZW5zb3VyY2Uuc2U+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNwaV9zaF9zY2kiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV90ZWdyYS5jIGIvZHJpdmVycy9zcGkvc3BpX3RlZ3JhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjM2FhNmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvc3BpX3RlZ3JhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotLyoKLSAqIERyaXZlciBmb3IgTnZpZGlhIFRFR1JBIHNwaSBjb250cm9sbGVyLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUsIEluYy4KLSAqCi0gKiBBdXRob3I6Ci0gKiAgICAgRXJpayBHaWxsaW5nIDxrb25rZXJzQGFuZHJvaWQuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotCi0jaW5jbHVkZSA8bWFjaC9kbWEuaD4KLQotI2RlZmluZSBTTElOS19DT01NQU5ECQkweDAwMAotI2RlZmluZSAgIFNMSU5LX0JJVF9MRU5HVEgoeCkJCSgoKHgpICYgMHgxZikgPDwgMCkKLSNkZWZpbmUgICBTTElOS19XT1JEX1NJWkUoeCkJCSgoKHgpICYgMHgxZikgPDwgNSkKLSNkZWZpbmUgICBTTElOS19CT1RIX0VOCQkJKDEgPDwgMTApCi0jZGVmaW5lICAgU0xJTktfQ1NfU1cJCQkoMSA8PCAxMSkKLSNkZWZpbmUgICBTTElOS19DU19WQUxVRQkJKDEgPDwgMTIpCi0jZGVmaW5lICAgU0xJTktfQ1NfUE9MQVJJVFkJCSgxIDw8IDEzKQotI2RlZmluZSAgIFNMSU5LX0lETEVfU0RBX0RSSVZFX0xPVwkoMCA8PCAxNikKLSNkZWZpbmUgICBTTElOS19JRExFX1NEQV9EUklWRV9ISUdICSgxIDw8IDE2KQotI2RlZmluZSAgIFNMSU5LX0lETEVfU0RBX1BVTExfTE9XCSgyIDw8IDE2KQotI2RlZmluZSAgIFNMSU5LX0lETEVfU0RBX1BVTExfSElHSAkoMyA8PCAxNikKLSNkZWZpbmUgICBTTElOS19JRExFX1NEQV9NQVNLCQkoMyA8PCAxNikKLSNkZWZpbmUgICBTTElOS19DU19QT0xBUklUWTEJCSgxIDw8IDIwKQotI2RlZmluZSAgIFNMSU5LX0NLX1NEQQkJCSgxIDw8IDIxKQotI2RlZmluZSAgIFNMSU5LX0NTX1BPTEFSSVRZMgkJKDEgPDwgMjIpCi0jZGVmaW5lICAgU0xJTktfQ1NfUE9MQVJJVFkzCQkoMSA8PCAyMykKLSNkZWZpbmUgICBTTElOS19JRExFX1NDTEtfRFJJVkVfTE9XCSgwIDw8IDI0KQotI2RlZmluZSAgIFNMSU5LX0lETEVfU0NMS19EUklWRV9ISUdICSgxIDw8IDI0KQotI2RlZmluZSAgIFNMSU5LX0lETEVfU0NMS19QVUxMX0xPVwkoMiA8PCAyNCkKLSNkZWZpbmUgICBTTElOS19JRExFX1NDTEtfUFVMTF9ISUdICSgzIDw8IDI0KQotI2RlZmluZSAgIFNMSU5LX0lETEVfU0NMS19NQVNLCQkoMyA8PCAyNCkKLSNkZWZpbmUgICBTTElOS19NX1MJCQkoMSA8PCAyOCkKLSNkZWZpbmUgICBTTElOS19XQUlUCQkJKDEgPDwgMjkpCi0jZGVmaW5lICAgU0xJTktfR08JCQkoMSA8PCAzMCkKLSNkZWZpbmUgICBTTElOS19FTkIJCQkoMSA8PCAzMSkKLQotI2RlZmluZSBTTElOS19DT01NQU5EMgkJMHgwMDQKLSNkZWZpbmUgICBTTElOS19MU0JGRQkJCSgxIDw8IDApCi0jZGVmaW5lICAgU0xJTktfU1NPRQkJCSgxIDw8IDEpCi0jZGVmaW5lICAgU0xJTktfU1BJRQkJCSgxIDw8IDQpCi0jZGVmaW5lICAgU0xJTktfQklESVJPRQkJCSgxIDw8IDYpCi0jZGVmaW5lICAgU0xJTktfTU9ERkVOCQkJKDEgPDwgNykKLSNkZWZpbmUgICBTTElOS19JTlRfU0laRSh4KQkJKCgoeCkgJiAweDFmKSA8PCA4KQotI2RlZmluZSAgIFNMSU5LX0NTX0FDVElWRV9CRVRXRUVOCSgxIDw8IDE3KQotI2RlZmluZSAgIFNMSU5LX1NTX0VOX0NTKHgpCQkoKCh4KSAmIDB4MykgPDwgMTgpCi0jZGVmaW5lICAgU0xJTktfU1NfU0VUVVAoeCkJCSgoKHgpICYgMHgzKSA8PCAyMCkKLSNkZWZpbmUgICBTTElOS19GSUZPX1JFRklMTFNfMAkJKDAgPDwgMjIpCi0jZGVmaW5lICAgU0xJTktfRklGT19SRUZJTExTXzEJCSgxIDw8IDIyKQotI2RlZmluZSAgIFNMSU5LX0ZJRk9fUkVGSUxMU18yCQkoMiA8PCAyMikKLSNkZWZpbmUgICBTTElOS19GSUZPX1JFRklMTFNfMwkJKDMgPDwgMjIpCi0jZGVmaW5lICAgU0xJTktfRklGT19SRUZJTExTX01BU0sJKDMgPDwgMjIpCi0jZGVmaW5lICAgU0xJTktfV0FJVF9QQUNLX0lOVCh4KQkoKCh4KSAmIDB4NykgPDwgMjYpCi0jZGVmaW5lICAgU0xJTktfU1BDMAkJCSgxIDw8IDI5KQotI2RlZmluZSAgIFNMSU5LX1RYRU4JCQkoMSA8PCAzMCkKLSNkZWZpbmUgICBTTElOS19SWEVOCQkJKDEgPDwgMzEpCi0KLSNkZWZpbmUgU0xJTktfU1RBVFVTCQkweDAwOAotI2RlZmluZSAgIFNMSU5LX0NPVU5UKHZhbCkJCSgoKHZhbCkgPj4gMCkgJiAweDFmKQotI2RlZmluZSAgIFNMSU5LX1dPUkQodmFsKQkJKCgodmFsKSA+PiA1KSAmIDB4MWYpCi0jZGVmaW5lICAgU0xJTktfQkxLX0NOVCh2YWwpCQkoKCh2YWwpID4+IDApICYgMHhmZmZmKQotI2RlZmluZSAgIFNMSU5LX01PREYJCQkoMSA8PCAxNikKLSNkZWZpbmUgICBTTElOS19SWF9VTkYJCQkoMSA8PCAxOCkKLSNkZWZpbmUgICBTTElOS19UWF9PVkYJCQkoMSA8PCAxOSkKLSNkZWZpbmUgICBTTElOS19UWF9GVUxMCQkJKDEgPDwgMjApCi0jZGVmaW5lICAgU0xJTktfVFhfRU1QVFkJCSgxIDw8IDIxKQotI2RlZmluZSAgIFNMSU5LX1JYX0ZVTEwJCQkoMSA8PCAyMikKLSNkZWZpbmUgICBTTElOS19SWF9FTVBUWQkJKDEgPDwgMjMpCi0jZGVmaW5lICAgU0xJTktfVFhfVU5GCQkJKDEgPDwgMjQpCi0jZGVmaW5lICAgU0xJTktfUlhfT1ZGCQkJKDEgPDwgMjUpCi0jZGVmaW5lICAgU0xJTktfVFhfRkxVU0gJCSgxIDw8IDI2KQotI2RlZmluZSAgIFNMSU5LX1JYX0ZMVVNICQkoMSA8PCAyNykKLSNkZWZpbmUgICBTTElOS19TQ0xLCQkJKDEgPDwgMjgpCi0jZGVmaW5lICAgU0xJTktfRVJSCQkJKDEgPDwgMjkpCi0jZGVmaW5lICAgU0xJTktfUkRZCQkJKDEgPDwgMzApCi0jZGVmaW5lICAgU0xJTktfQlNZCQkJKDEgPDwgMzEpCi0KLSNkZWZpbmUgU0xJTktfTUFTX0RBVEEJCTB4MDEwCi0jZGVmaW5lIFNMSU5LX1NMQVZFX0RBVEEJMHgwMTQKLQotI2RlZmluZSBTTElOS19ETUFfQ1RMCQkweDAxOAotI2RlZmluZSAgIFNMSU5LX0RNQV9CTE9DS19TSVpFKHgpCSgoKHgpICYgMHhmZmZmKSA8PCAwKQotI2RlZmluZSAgIFNMSU5LX1RYX1RSSUdfMQkJKDAgPDwgMTYpCi0jZGVmaW5lICAgU0xJTktfVFhfVFJJR180CQkoMSA8PCAxNikKLSNkZWZpbmUgICBTTElOS19UWF9UUklHXzgJCSgyIDw8IDE2KQotI2RlZmluZSAgIFNMSU5LX1RYX1RSSUdfMTYJCSgzIDw8IDE2KQotI2RlZmluZSAgIFNMSU5LX1RYX1RSSUdfTUFTSwkJKDMgPDwgMTYpCi0jZGVmaW5lICAgU0xJTktfUlhfVFJJR18xCQkoMCA8PCAxOCkKLSNkZWZpbmUgICBTTElOS19SWF9UUklHXzQJCSgxIDw8IDE4KQotI2RlZmluZSAgIFNMSU5LX1JYX1RSSUdfOAkJKDIgPDwgMTgpCi0jZGVmaW5lICAgU0xJTktfUlhfVFJJR18xNgkJKDMgPDwgMTgpCi0jZGVmaW5lICAgU0xJTktfUlhfVFJJR19NQVNLCQkoMyA8PCAxOCkKLSNkZWZpbmUgICBTTElOS19QQUNLRUQJCQkoMSA8PCAyMCkKLSNkZWZpbmUgICBTTElOS19QQUNLX1NJWkVfNAkJKDAgPDwgMjEpCi0jZGVmaW5lICAgU0xJTktfUEFDS19TSVpFXzgJCSgxIDw8IDIxKQotI2RlZmluZSAgIFNMSU5LX1BBQ0tfU0laRV8xNgkJKDIgPDwgMjEpCi0jZGVmaW5lICAgU0xJTktfUEFDS19TSVpFXzMyCQkoMyA8PCAyMSkKLSNkZWZpbmUgICBTTElOS19QQUNLX1NJWkVfTUFTSwkJKDMgPDwgMjEpCi0jZGVmaW5lICAgU0xJTktfSUVfVFhDCQkJKDEgPDwgMjYpCi0jZGVmaW5lICAgU0xJTktfSUVfUlhDCQkJKDEgPDwgMjcpCi0jZGVmaW5lICAgU0xJTktfRE1BX0VOCQkJKDEgPDwgMzEpCi0KLSNkZWZpbmUgU0xJTktfU1RBVFVTMgkJMHgwMWMKLSNkZWZpbmUgICBTTElOS19UWF9GSUZPX0VNUFRZX0NPVU5UKHZhbCkJKCgodmFsKSAmIDB4M2YpID4+IDApCi0jZGVmaW5lICAgU0xJTktfUlhfRklGT19GVUxMX0NPVU5UKHZhbCkJCSgoKHZhbCkgJiAweDNmKSA+PiAxNikKLQotI2RlZmluZSBTTElOS19UWF9GSUZPCQkweDEwMAotI2RlZmluZSBTTElOS19SWF9GSUZPCQkweDE4MAotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBzcGlfdGVncmFfcmVxX3NlbHNbXSA9IHsKLQlURUdSQV9ETUFfUkVRX1NFTF9TTDJCMSwKLQlURUdSQV9ETUFfUkVRX1NFTF9TTDJCMiwKLQlURUdSQV9ETUFfUkVRX1NFTF9TTDJCMywKLQlURUdSQV9ETUFfUkVRX1NFTF9TTDJCNCwKLX07Ci0KLSNkZWZpbmUgQkJfTEVOCQkJMzIKLQotc3RydWN0IHNwaV90ZWdyYV9kYXRhIHsKLQlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQotCXN0cnVjdCBjbGsJCSpjbGs7Ci0Jdm9pZCBfX2lvbWVtCQkqYmFzZTsKLQl1bnNpZ25lZCBsb25nCQlwaHlzOwotCi0JdTMyCQkJY3VyX3NwZWVkOwotCi0Jc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSpjdXI7Ci0JdW5zaWduZWQJCWN1cl9wb3M7Ci0JdW5zaWduZWQJCWN1cl9sZW47Ci0JdW5zaWduZWQJCWN1cl9ieXRlc19wZXJfd29yZDsKLQotCS8qIFRoZSB0ZWdyYSBzcGkgY29udHJvbGxlciBoYXMgYSBidWcgd2hpY2ggY2F1c2VzIHRoZSBmaXJzdCB3b3JkCi0JICogaW4gUElPIHRyYW5zYWN0aW9ucyB0byBiZSBnYXJiYWdlLiAgU2luY2UgcGFja2VkIERNQSB0cmFuc2FjdGlvbnMKLQkgKiByZXF1aXJlIHRyYW5zZmVycyB0byBiZSA0IGJ5dGUgYWxpZ25lZCB3ZSBuZWVkIGEgYm91bmNlIGJ1ZmZlcgotCSAqIGZvciB0aGUgZ2VuZXJpYyBjYXNlLgotCSAqLwotCXN0cnVjdCB0ZWdyYV9kbWFfcmVxCXJ4X2RtYV9yZXE7Ci0Jc3RydWN0IHRlZ3JhX2RtYV9jaGFubmVsICpyeF9kbWE7Ci0JdTMyCQkJKnJ4X2JiOwotCWRtYV9hZGRyX3QJCXJ4X2JiX3BoeXM7Ci19OwotCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzcGlfdGVncmFfcmVhZGwoc3RydWN0IHNwaV90ZWdyYV9kYXRhICp0c3BpLAotCQkJCQkgICAgdW5zaWduZWQgbG9uZyByZWcpCi17Ci0JcmV0dXJuIHJlYWRsKHRzcGktPmJhc2UgKyByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3BpX3RlZ3JhX3dyaXRlbChzdHJ1Y3Qgc3BpX3RlZ3JhX2RhdGEgKnRzcGksCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgdmFsLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIHJlZykKLXsKLQl3cml0ZWwodmFsLCB0c3BpLT5iYXNlICsgcmVnKTsKLX0KLQotc3RhdGljIHZvaWQgc3BpX3RlZ3JhX2dvKHN0cnVjdCBzcGlfdGVncmFfZGF0YSAqdHNwaSkKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQotCXdtYigpOwotCi0JdmFsID0gc3BpX3RlZ3JhX3JlYWRsKHRzcGksIFNMSU5LX0RNQV9DVEwpOwotCXZhbCAmPSB+U0xJTktfRE1BX0JMT0NLX1NJWkUofjApICYgflNMSU5LX0RNQV9FTjsKLQl2YWwgfD0gU0xJTktfRE1BX0JMT0NLX1NJWkUodHNwaS0+cnhfZG1hX3JlcS5zaXplIC8gNCAtIDEpOwotCXNwaV90ZWdyYV93cml0ZWwodHNwaSwgdmFsLCBTTElOS19ETUFfQ1RMKTsKLQotCXRlZ3JhX2RtYV9lbnF1ZXVlX3JlcSh0c3BpLT5yeF9kbWEsICZ0c3BpLT5yeF9kbWFfcmVxKTsKLQotCXZhbCB8PSBTTElOS19ETUFfRU47Ci0Jc3BpX3RlZ3JhX3dyaXRlbCh0c3BpLCB2YWwsIFNMSU5LX0RNQV9DVEwpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgc3BpX3RlZ3JhX2ZpbGxfdHhfZmlmbyhzdHJ1Y3Qgc3BpX3RlZ3JhX2RhdGEgKnRzcGksCi0JCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXVuc2lnbmVkIGxlbiA9IG1pbih0LT5sZW4gLSB0c3BpLT5jdXJfcG9zLCBCQl9MRU4gKgotCQkJICAgdHNwaS0+Y3VyX2J5dGVzX3Blcl93b3JkKTsKLQl1OCAqdHhfYnVmID0gKHU4ICopdC0+dHhfYnVmICsgdHNwaS0+Y3VyX3BvczsKLQlpbnQgaSwgajsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQotCXZhbCA9IHNwaV90ZWdyYV9yZWFkbCh0c3BpLCBTTElOS19DT01NQU5EKTsKLQl2YWwgJj0gflNMSU5LX1dPUkRfU0laRSh+MCk7Ci0JdmFsIHw9IFNMSU5LX1dPUkRfU0laRShsZW4gLyB0c3BpLT5jdXJfYnl0ZXNfcGVyX3dvcmQgLSAxKTsKLQlzcGlfdGVncmFfd3JpdGVsKHRzcGksIHZhbCwgU0xJTktfQ09NTUFORCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IHRzcGktPmN1cl9ieXRlc19wZXJfd29yZCkgewotCQl2YWwgPSAwOwotCQlmb3IgKGogPSAwOyBqIDwgdHNwaS0+Y3VyX2J5dGVzX3Blcl93b3JkOyBqKyspCi0JCQl2YWwgfD0gdHhfYnVmW2kgKyBqXSA8PCBqICogODsKLQotCQlzcGlfdGVncmFfd3JpdGVsKHRzcGksIHZhbCwgU0xJTktfVFhfRklGTyk7Ci0JfQotCi0JdHNwaS0+cnhfZG1hX3JlcS5zaXplID0gbGVuIC8gdHNwaS0+Y3VyX2J5dGVzX3Blcl93b3JkICogNDsKLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBzcGlfdGVncmFfZHJhaW5fcnhfZmlmbyhzdHJ1Y3Qgc3BpX3RlZ3JhX2RhdGEgKnRzcGksCi0JCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXVuc2lnbmVkIGxlbiA9IHRzcGktPmN1cl9sZW47Ci0JdTggKnJ4X2J1ZiA9ICh1OCAqKXQtPnJ4X2J1ZiArIHRzcGktPmN1cl9wb3M7Ci0JaW50IGksIGo7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IHRzcGktPmN1cl9ieXRlc19wZXJfd29yZCkgewotCQl2YWwgPSB0c3BpLT5yeF9iYltpIC8gdHNwaS0+Y3VyX2J5dGVzX3Blcl93b3JkXTsKLQkJZm9yIChqID0gMDsgaiA8IHRzcGktPmN1cl9ieXRlc19wZXJfd29yZDsgaisrKQotCQkJcnhfYnVmW2kgKyBqXSA9ICh2YWwgPj4gKGogKiA4KSkgJiAweGZmOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyB2b2lkIHNwaV90ZWdyYV9zdGFydF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQotewotCXN0cnVjdCBzcGlfdGVncmFfZGF0YSAqdHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXUzMiBzcGVlZDsKLQl1OCBiaXRzX3Blcl93b3JkOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCi0Jc3BlZWQgPSB0LT5zcGVlZF9oeiA/IHQtPnNwZWVkX2h6IDogc3BpLT5tYXhfc3BlZWRfaHo7Ci0JYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQgPyB0LT5iaXRzX3Blcl93b3JkICA6Ci0JCXNwaS0+Yml0c19wZXJfd29yZDsKLQotCXRzcGktPmN1cl9ieXRlc19wZXJfd29yZCA9IChiaXRzX3Blcl93b3JkIC0gMSkgLyA4ICsgMTsKLQotCWlmIChzcGVlZCAhPSB0c3BpLT5jdXJfc3BlZWQpCi0JCWNsa19zZXRfcmF0ZSh0c3BpLT5jbGssIHNwZWVkKTsKLQotCWlmICh0c3BpLT5jdXJfc3BlZWQgPT0gMCkKLQkJY2xrX2VuYWJsZSh0c3BpLT5jbGspOwotCi0JdHNwaS0+Y3VyX3NwZWVkID0gc3BlZWQ7Ci0KLQl2YWwgPSBzcGlfdGVncmFfcmVhZGwodHNwaSwgU0xJTktfQ09NTUFORDIpOwotCXZhbCAmPSB+U0xJTktfU1NfRU5fQ1MofjApIHwgU0xJTktfUlhFTiB8IFNMSU5LX1RYRU47Ci0JaWYgKHQtPnJ4X2J1ZikKLQkJdmFsIHw9IFNMSU5LX1JYRU47Ci0JaWYgKHQtPnR4X2J1ZikKLQkJdmFsIHw9IFNMSU5LX1RYRU47Ci0JdmFsIHw9IFNMSU5LX1NTX0VOX0NTKHNwaS0+Y2hpcF9zZWxlY3QpOwotCXZhbCB8PSBTTElOS19TUElFOwotCXNwaV90ZWdyYV93cml0ZWwodHNwaSwgdmFsLCBTTElOS19DT01NQU5EMik7Ci0KLQl2YWwgPSBzcGlfdGVncmFfcmVhZGwodHNwaSwgU0xJTktfQ09NTUFORCk7Ci0JdmFsICY9IH5TTElOS19CSVRfTEVOR1RIKH4wKTsKLQl2YWwgfD0gU0xJTktfQklUX0xFTkdUSChiaXRzX3Blcl93b3JkIC0gMSk7Ci0KLQkvKiBGSVhNRTogc2hvdWxkIHByb2JhYmx5IGNvbnRyb2wgQ1MgbWFudWFsbHkgc28gdGhhdCB3ZSBjYW4gYmUgc3VyZQotCSAqIGl0IGRvZXMgbm90IGdvIGxvdyBiZXR3ZWVuIHRyYW5zZmVyIGFuZCB0byBzdXBwb3J0IGRlbGF5X3VzZWNzCi0JICogY29ycmVjdGx5LgotCSAqLwotCXZhbCAmPSB+U0xJTktfSURMRV9TQ0xLX01BU0sgJiB+U0xJTktfQ0tfU0RBICYgflNMSU5LX0NTX1NXOwotCi0JaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQotCQl2YWwgfD0gU0xJTktfQ0tfU0RBOwotCi0JaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQotCQl2YWwgfD0gU0xJTktfSURMRV9TQ0xLX0RSSVZFX0hJR0g7Ci0JZWxzZQotCQl2YWwgfD0gU0xJTktfSURMRV9TQ0xLX0RSSVZFX0xPVzsKLQotCXZhbCB8PSBTTElOS19NX1M7Ci0KLQlzcGlfdGVncmFfd3JpdGVsKHRzcGksIHZhbCwgU0xJTktfQ09NTUFORCk7Ci0KLQlzcGlfdGVncmFfd3JpdGVsKHRzcGksIFNMSU5LX1JYX0ZMVVNIIHwgU0xJTktfVFhfRkxVU0gsIFNMSU5LX1NUQVRVUyk7Ci0KLQl0c3BpLT5jdXIgPSB0OwotCXRzcGktPmN1cl9wb3MgPSAwOwotCXRzcGktPmN1cl9sZW4gPSBzcGlfdGVncmFfZmlsbF90eF9maWZvKHRzcGksIHQpOwotCi0Jc3BpX3RlZ3JhX2dvKHRzcGkpOwotfQotCi1zdGF0aWMgdm9pZCBzcGlfdGVncmFfc3RhcnRfbWVzc2FnZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJCSAgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCi17Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQotCW0tPmFjdHVhbF9sZW5ndGggPSAwOwotCW0tPnN0YXR1cyA9IDA7Ci0KLQl0ID0gbGlzdF9maXJzdF9lbnRyeSgmbS0+dHJhbnNmZXJzLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLCB0cmFuc2Zlcl9saXN0KTsKLQlzcGlfdGVncmFfc3RhcnRfdHJhbnNmZXIoc3BpLCB0KTsKLX0KLQotc3RhdGljIHZvaWQgdGVncmFfc3BpX3J4X2RtYV9jb21wbGV0ZShzdHJ1Y3QgdGVncmFfZG1hX3JlcSAqcmVxKQotewotCXN0cnVjdCBzcGlfdGVncmFfZGF0YSAqdHNwaSA9IHJlcS0+ZGV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICptOwotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7Ci0JaW50IHRpbWVvdXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCi0JLyogdGhlIFNQSSBjb250cm9sbGVyIG1heSBjb21lIGJhY2sgd2l0aCBib3RoIHRoZSBCU1kgYW5kIFJEWSBiaXRzCi0JICogc2V0LiAgSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIEJTWSBiaXQgdG8gY2xlYXIgc28KLQkgKiB0aGF0IHdlIGFyZSBzdXJlIHRoZSBETUEgaXMgZmluaXNoZWQuICAxMDAwIHJlYWRzIHdhcyBlbXBpcmljYWxseQotCSAqIGRldGVybWluZWQgdG8gYmUgbG9uZyBlbm91Z2guCi0JICovCi0Jd2hpbGUgKHRpbWVvdXQrKyA8IDEwMDApIHsKLQkJaWYgKCEoc3BpX3RlZ3JhX3JlYWRsKHRzcGksIFNMSU5LX1NUQVRVUykgJiBTTElOS19CU1kpKQotCQkJYnJlYWs7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRzcGktPmxvY2ssIGZsYWdzKTsKLQotCXZhbCA9IHNwaV90ZWdyYV9yZWFkbCh0c3BpLCBTTElOS19TVEFUVVMpOwotCXZhbCB8PSBTTElOS19SRFk7Ci0Jc3BpX3RlZ3JhX3dyaXRlbCh0c3BpLCB2YWwsIFNMSU5LX1NUQVRVUyk7Ci0KLQltID0gbGlzdF9maXJzdF9lbnRyeSgmdHNwaS0+cXVldWUsIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOwotCi0JaWYgKHRpbWVvdXQgPj0gMTAwMCkKLQkJbS0+c3RhdHVzID0gLUVJTzsKLQotCXNwaSA9IG0tPnN0YXRlOwotCi0JdHNwaS0+Y3VyX3BvcyArPSBzcGlfdGVncmFfZHJhaW5fcnhfZmlmbyh0c3BpLCB0c3BpLT5jdXIpOwotCW0tPmFjdHVhbF9sZW5ndGggKz0gdHNwaS0+Y3VyX3BvczsKLQotCWlmICh0c3BpLT5jdXJfcG9zIDwgdHNwaS0+Y3VyLT5sZW4pIHsKLQkJdHNwaS0+Y3VyX2xlbiA9IHNwaV90ZWdyYV9maWxsX3R4X2ZpZm8odHNwaSwgdHNwaS0+Y3VyKTsKLQkJc3BpX3RlZ3JhX2dvKHRzcGkpOwotCX0gZWxzZSBpZiAoIWxpc3RfaXNfbGFzdCgmdHNwaS0+Y3VyLT50cmFuc2Zlcl9saXN0LAotCQkJCSAmbS0+dHJhbnNmZXJzKSkgewotCQl0c3BpLT5jdXIgPSAgbGlzdF9maXJzdF9lbnRyeSgmdHNwaS0+Y3VyLT50cmFuc2Zlcl9saXN0LAotCQkJCQkgICAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAotCQkJCQkgICAgICB0cmFuc2Zlcl9saXN0KTsKLQkJc3BpX3RlZ3JhX3N0YXJ0X3RyYW5zZmVyKHNwaSwgdHNwaS0+Y3VyKTsKLQl9IGVsc2UgewotCQlsaXN0X2RlbCgmbS0+cXVldWUpOwotCi0JCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOwotCi0JCWlmICghbGlzdF9lbXB0eSgmdHNwaS0+cXVldWUpKSB7Ci0JCQltID0gbGlzdF9maXJzdF9lbnRyeSgmdHNwaS0+cXVldWUsIHN0cnVjdCBzcGlfbWVzc2FnZSwKLQkJCQkJICAgICBxdWV1ZSk7Ci0JCQlzcGkgPSBtLT5zdGF0ZTsKLQkJCXNwaV90ZWdyYV9zdGFydF9tZXNzYWdlKHNwaSwgbSk7Ci0JCX0gZWxzZSB7Ci0JCQljbGtfZGlzYWJsZSh0c3BpLT5jbGspOwotCQkJdHNwaS0+Y3VyX3NwZWVkID0gMDsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzcGktPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBzcGlfdGVncmFfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgc3BpX3RlZ3JhX2RhdGEgKnRzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQl1bnNpZ25lZCBsb25nIGNzX2JpdDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cCAlZCBicHcsICVzY3BvbCwgJXNjcGhhLCAlZEh6XG4iLAotCQlzcGktPmJpdHNfcGVyX3dvcmQsCi0JCXNwaS0+bW9kZSAmIFNQSV9DUE9MID8gIiIgOiAifiIsCi0JCXNwaS0+bW9kZSAmIFNQSV9DUEhBID8gIiIgOiAifiIsCi0JCXNwaS0+bWF4X3NwZWVkX2h6KTsKLQotCi0Jc3dpdGNoIChzcGktPmNoaXBfc2VsZWN0KSB7Ci0JY2FzZSAwOgotCQljc19iaXQgPSBTTElOS19DU19QT0xBUklUWTsKLQkJYnJlYWs7Ci0KLQljYXNlIDE6Ci0JCWNzX2JpdCA9IFNMSU5LX0NTX1BPTEFSSVRZMTsKLQkJYnJlYWs7Ci0KLQljYXNlIDI6Ci0JCWNzX2JpdCA9IFNMSU5LX0NTX1BPTEFSSVRZMjsKLQkJYnJlYWs7Ci0KLQljYXNlIDQ6Ci0JCWNzX2JpdCA9IFNMSU5LX0NTX1BPTEFSSVRZMzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHNwaS0+bG9jaywgZmxhZ3MpOwotCi0JdmFsID0gc3BpX3RlZ3JhX3JlYWRsKHRzcGksIFNMSU5LX0NPTU1BTkQpOwotCWlmIChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkKLQkJdmFsIHw9IGNzX2JpdDsKLQllbHNlCi0JCXZhbCAmPSB+Y3NfYml0OwotCXNwaV90ZWdyYV93cml0ZWwodHNwaSwgdmFsLCBTTElOS19DT01NQU5EKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzcGktPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNwaV90ZWdyYV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCi17Ci0Jc3RydWN0IHNwaV90ZWdyYV9kYXRhICp0c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB3YXNfZW1wdHk7Ci0KLQlpZiAobGlzdF9lbXB0eSgmbS0+dHJhbnNmZXJzKSB8fCAhbS0+Y29tcGxldGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmICh0LT5iaXRzX3Blcl93b3JkIDwgMCB8fCB0LT5iaXRzX3Blcl93b3JkID4gMzIpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAodC0+bGVuID09IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoIXQtPnJ4X2J1ZiAmJiAhdC0+dHhfYnVmKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbS0+c3RhdGUgPSBzcGk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHNwaS0+bG9jaywgZmxhZ3MpOwotCXdhc19lbXB0eSA9IGxpc3RfZW1wdHkoJnRzcGktPnF1ZXVlKTsKLQlsaXN0X2FkZF90YWlsKCZtLT5xdWV1ZSwgJnRzcGktPnF1ZXVlKTsKLQotCWlmICh3YXNfZW1wdHkpCi0JCXNwaV90ZWdyYV9zdGFydF9tZXNzYWdlKHNwaSwgbSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0c3BpLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc3BpX3RlZ3JhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKLQlzdHJ1Y3Qgc3BpX3RlZ3JhX2RhdGEJKnRzcGk7Ci0Jc3RydWN0IHJlc291cmNlCQkqcjsKLQlpbnQgcmV0OwotCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YgKnRzcGkpOwotCWlmIChtYXN0ZXIgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtYXN0ZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KLQltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKLQotCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOwotCi0JbWFzdGVyLT5zZXR1cCA9IHNwaV90ZWdyYV9zZXR1cDsKLQltYXN0ZXItPnRyYW5zZmVyID0gc3BpX3RlZ3JhX3RyYW5zZmVyOwotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSA0OwotCi0JZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIG1hc3Rlcik7Ci0JdHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQl0c3BpLT5tYXN0ZXIgPSBtYXN0ZXI7Ci0JdHNwaS0+cGRldiA9IHBkZXY7Ci0Jc3Bpbl9sb2NrX2luaXQoJnRzcGktPmxvY2spOwotCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKHIgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycjA7Ci0JfQotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oci0+c3RhcnQsIChyLT5lbmQgLSByLT5zdGFydCkgKyAxLAotCQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpKSkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyMDsKLQl9Ci0KLQl0c3BpLT5waHlzID0gci0+c3RhcnQ7Ci0JdHNwaS0+YmFzZSA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7Ci0JaWYgKCF0c3BpLT5iYXNlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGlvcmVtYXAgaW9tZW1cbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JdHNwaS0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKLQlpZiAoSVNfRVJSKHRzcGktPmNsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuIG5vdCBnZXQgY2xvY2tcbiIpOwotCQlyZXQgPSBQVFJfRVJSKHRzcGktPmNsayk7Ci0JCWdvdG8gZXJyMjsKLQl9Ci0KLQlJTklUX0xJU1RfSEVBRCgmdHNwaS0+cXVldWUpOwotCi0JdHNwaS0+cnhfZG1hID0gdGVncmFfZG1hX2FsbG9jYXRlX2NoYW5uZWwoVEVHUkFfRE1BX01PREVfT05FU0hPVCk7Ci0JaWYgKCF0c3BpLT5yeF9kbWEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuIG5vdCBhbGxvY2F0ZSByeCBkbWEgY2hhbm5lbFxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyMzsKLQl9Ci0KLQl0c3BpLT5yeF9iYiA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBzaXplb2YodTMyKSAqIEJCX0xFTiwKLQkJCQkJICZ0c3BpLT5yeF9iYl9waHlzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRzcGktPnJ4X2JiKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbiBub3QgYWxsb2NhdGUgcnggYm91bmNlIGJ1ZmZlclxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyNDsKLQl9Ci0KLQl0c3BpLT5yeF9kbWFfcmVxLmNvbXBsZXRlID0gdGVncmFfc3BpX3J4X2RtYV9jb21wbGV0ZTsKLQl0c3BpLT5yeF9kbWFfcmVxLnRvX21lbW9yeSA9IDE7Ci0JdHNwaS0+cnhfZG1hX3JlcS5kZXN0X2FkZHIgPSB0c3BpLT5yeF9iYl9waHlzOwotCXRzcGktPnJ4X2RtYV9yZXEuZGVzdF9idXNfd2lkdGggPSAzMjsKLQl0c3BpLT5yeF9kbWFfcmVxLnNvdXJjZV9hZGRyID0gdHNwaS0+cGh5cyArIFNMSU5LX1JYX0ZJRk87Ci0JdHNwaS0+cnhfZG1hX3JlcS5zb3VyY2VfYnVzX3dpZHRoID0gMzI7Ci0JdHNwaS0+cnhfZG1hX3JlcS5zb3VyY2Vfd3JhcCA9IDQ7Ci0JdHNwaS0+cnhfZG1hX3JlcS5yZXFfc2VsID0gc3BpX3RlZ3JhX3JlcV9zZWxzW3BkZXYtPmlkXTsKLQl0c3BpLT5yeF9kbWFfcmVxLmRldiA9IHRzcGk7Ci0KLQlyZXQgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnI1OwotCi0JcmV0dXJuIHJldDsKLQotZXJyNToKLQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBzaXplb2YodTMyKSAqIEJCX0xFTiwKLQkJCSAgdHNwaS0+cnhfYmIsIHRzcGktPnJ4X2JiX3BoeXMpOwotZXJyNDoKLQl0ZWdyYV9kbWFfZnJlZV9jaGFubmVsKHRzcGktPnJ4X2RtYSk7Ci1lcnIzOgotCWNsa19wdXQodHNwaS0+Y2xrKTsKLWVycjI6Ci0JaW91bm1hcCh0c3BpLT5iYXNlKTsKLWVycjE6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCAoci0+ZW5kIC0gci0+c3RhcnQpICsgMSk7Ci1lcnIwOgotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgc3BpX3RlZ3JhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7Ci0Jc3RydWN0IHNwaV90ZWdyYV9kYXRhCSp0c3BpOwotCXN0cnVjdCByZXNvdXJjZQkJKnI7Ci0KLQltYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Ci0JdHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQotCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotCXRlZ3JhX2RtYV9mcmVlX2NoYW5uZWwodHNwaS0+cnhfZG1hKTsKLQotCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIHNpemVvZih1MzIpICogQkJfTEVOLAotCQkJICB0c3BpLT5yeF9iYiwgdHNwaS0+cnhfYmJfcGh5cyk7Ci0KLQljbGtfcHV0KHRzcGktPmNsayk7Ci0JaW91bm1hcCh0c3BpLT5iYXNlKTsKLQotCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihyLT5zdGFydCwgKHItPmVuZCAtIHItPnN0YXJ0KSArIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLU1PRFVMRV9BTElBUygicGxhdGZvcm06c3BpX3RlZ3JhIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwaV90ZWdyYV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPQkJInNwaV90ZWdyYSIsCi0JCS5vd25lciA9CVRISVNfTU9EVUxFLAotCX0sCi0JLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKHNwaV90ZWdyYV9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgc3BpX3RlZ3JhX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzcGlfdGVncmFfZHJpdmVyLCBzcGlfdGVncmFfcHJvYmUpOwotfQotbW9kdWxlX2luaXQoc3BpX3RlZ3JhX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3BpX3RlZ3JhX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BpX3RlZ3JhX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChzcGlfdGVncmFfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV90b3BjbGlmZl9wY2guYyBiL2RyaXZlcnMvc3BpL3NwaV90b3BjbGlmZl9wY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzllNDhkNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfdG9wY2xpZmZfcGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAzICswLDAgQEAKLS8qCi0gKiBTUEkgYnVzIGRyaXZlciBmb3IgdGhlIFRvcGNsaWZmIFBDSCB1c2VkIGJ5IEludGVsIFNvQ3MKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgT0tJIFNFTUlDT05EVUNUT1IgQ28uLCBMVEQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLQotLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLwotI2RlZmluZSBQQ0hfU1BDUgkJMHgwMAkvKiBTUEkgY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBQQ0hfU1BCUlIJCTB4MDQJLyogU1BJIGJhdWQgcmF0ZSByZWdpc3RlciAqLwotI2RlZmluZSBQQ0hfU1BTUgkJMHgwOAkvKiBTUEkgc3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lIFBDSF9TUERXUgkJMHgwQwkvKiBTUEkgd3JpdGUgZGF0YSByZWdpc3RlciAqLwotI2RlZmluZSBQQ0hfU1BEUlIJCTB4MTAJLyogU1BJIHJlYWQgZGF0YSByZWdpc3RlciAqLwotI2RlZmluZSBQQ0hfU1NOWENSCQkweDE4CS8qIFNTTiBFeHBhbmQgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBQQ0hfU1JTVAkJMHgxQwkvKiBTUEkgcmVzZXQgcmVnaXN0ZXIgKi8KLQotI2RlZmluZSBQQ0hfU1BTUl9URkQJCTB4MDAwMDA3QzAKLSNkZWZpbmUgUENIX1NQU1JfUkZECQkweDAwMDBGODAwCi0KLSNkZWZpbmUgUENIX1JFQURBQkxFKHgpCQkoKCh4KSAmIFBDSF9TUFNSX1JGRCk+PjExKQotI2RlZmluZSBQQ0hfV1JJVEFCTEUoeCkJCSgoKHgpICYgUENIX1NQU1JfVEZEKT4+NikKLQotI2RlZmluZSBQQ0hfUlhfVEhPTEQJCTcKLSNkZWZpbmUgUENIX1JYX1RIT0xEX01BWAkxNQotCi0jZGVmaW5lIFBDSF9NQVhfQkFVRFJBVEUJNTAwMDAwMAotI2RlZmluZSBQQ0hfTUFYX0ZJRk9fREVQVEgJMTYKLQotI2RlZmluZSBTVEFUVVNfUlVOTklORwkJMQotI2RlZmluZSBTVEFUVVNfRVhJVElORwkJMgotI2RlZmluZSBQQ0hfU0xFRVBfVElNRQkJMTAKLQotI2RlZmluZSBQQ0hfQUREUkVTU19TSVpFCTB4MjAKLQotI2RlZmluZSBTU05fTE9XCQkJMHgwMlUKLSNkZWZpbmUgU1NOX05PX0NPTlRST0wJCTB4MDBVCi0jZGVmaW5lIFBDSF9NQVhfQ1MJCTB4RkYKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9HRV9TUEkJMHg4ODE2Ci0KLSNkZWZpbmUgU1BDUl9TUEVfQklUCQkoMSA8PCAwKQotI2RlZmluZSBTUENSX01TVFJfQklUCQkoMSA8PCAxKQotI2RlZmluZSBTUENSX0xTQkZfQklUCQkoMSA8PCA0KQotI2RlZmluZSBTUENSX0NQSEFfQklUCQkoMSA8PCA1KQotI2RlZmluZSBTUENSX0NQT0xfQklUCQkoMSA8PCA2KQotI2RlZmluZSBTUENSX1RGSUVfQklUCQkoMSA8PCA4KQotI2RlZmluZSBTUENSX1JGSUVfQklUCQkoMSA8PCA5KQotI2RlZmluZSBTUENSX0ZJRV9CSVQJCSgxIDw8IDEwKQotI2RlZmluZSBTUENSX09SSUVfQklUCQkoMSA8PCAxMSkKLSNkZWZpbmUgU1BDUl9NREZJRV9CSVQJCSgxIDw8IDEyKQotI2RlZmluZSBTUENSX0ZJQ0xSX0JJVAkJKDEgPDwgMjQpCi0jZGVmaW5lIFNQU1JfVEZJX0JJVAkJKDEgPDwgMCkKLSNkZWZpbmUgU1BTUl9SRklfQklUCQkoMSA8PCAxKQotI2RlZmluZSBTUFNSX0ZJX0JJVAkJKDEgPDwgMikKLSNkZWZpbmUgU1BCUlJfU0laRV9CSVQJCSgxIDw8IDEwKQotCi0jZGVmaW5lIFBDSF9BTEwJCQkoU1BDUl9URklFX0JJVHxTUENSX1JGSUVfQklUfFNQQ1JfRklFX0JJVHxTUENSX09SSUVfQklUfFNQQ1JfTURGSUVfQklUKQotCi0jZGVmaW5lIFNQQ1JfUkZJQ19GSUVMRAkJMjAKLSNkZWZpbmUgU1BDUl9URklDX0ZJRUxECQkxNgotCi0jZGVmaW5lIFNQU1JfSU5UX0JJVFMJCTB4MUYKLSNkZWZpbmUgTUFTS19TUEJSUl9TUEJSX0JJVFMJKH4oKDEgPDwgMTApIC0gMSkpCi0jZGVmaW5lIE1BU0tfUkZJQ19TUENSX0JJVFMJKH4oMHhmIDw8IDIwKSkKLSNkZWZpbmUgTUFTS19URklDX1NQQ1JfQklUUwkofigweGYwMDBmIDw8IDEyKSkKLQotI2RlZmluZSBQQ0hfQ0xPQ0tfSFoJCTUwMDAwMDAwCi0jZGVmaW5lIFBDSF9NQVhfU1BCUgkJMTAyMwotCi0KLS8qKgotICogc3RydWN0IHBjaF9zcGlfZGF0YSAtIEhvbGRzIHRoZSBTUEkgY2hhbm5lbCBzcGVjaWZpYyBkZXRhaWxzCi0gKiBAaW9fcmVtYXBfYWRkcjoJCVRoZSByZW1hcHBlZCBQQ0kgYmFzZSBhZGRyZXNzCi0gKiBAbWFzdGVyOgkJCVBvaW50ZXIgdG8gdGhlIFNQSSBtYXN0ZXIgc3RydWN0dXJlCi0gKiBAd29yazoJCQlSZWZlcmVuY2UgdG8gd29yayBxdWV1ZSBoYW5kbGVyCi0gKiBAd2s6CQkJCVdvcmtxdWV1ZSBmb3IgY2Fycnlpbmcgb3V0IGV4ZWN1dGlvbiBvZiB0aGUKLSAqCQkJCXJlcXVlc3RzCi0gKiBAd2FpdDoJCQlXYWl0IHF1ZXVlIGZvciB3YWtpbmcgdXAgdXBvbiByZWNlaXZpbmcgYW4KLSAqCQkJCWludGVycnVwdC4KLSAqIEB0cmFuc2Zlcl9jb21wbGV0ZToJCVN0YXR1cyBvZiBTUEkgVHJhbnNmZXIKLSAqIEBiY3VycmVudF9tc2dfcHJvY2Vzc2luZzoJU3RhdHVzIGZsYWcgZm9yIG1lc3NhZ2UgcHJvY2Vzc2luZwotICogQGxvY2s6CQkJTG9jayBmb3IgcHJvdGVjdGluZyB0aGlzIHN0cnVjdHVyZQotICogQHF1ZXVlOgkJCVNQSSBNZXNzYWdlIHF1ZXVlCi0gKiBAc3RhdHVzOgkJCVN0YXR1cyBvZiB0aGUgU1BJIGRyaXZlcgotICogQGJwd19sZW46CQkJTGVuZ3RoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgaW4gYml0cyBwZXIKLSAqCQkJCXdvcmQKLSAqIEB0cmFuc2Zlcl9hY3RpdmU6CQlGbGFnIHNob3dpbmcgYWN0aXZlIHRyYW5zZmVyCi0gKiBAdHhfaW5kZXg6CQkJVHJhbnNtaXQgZGF0YSBjb3VudDsgZm9yIGJvb2trZWVwaW5nIGR1cmluZwotICoJCQkJdHJhbnNmZXIKLSAqIEByeF9pbmRleDoJCQlSZWNlaXZlIGRhdGEgY291bnQ7IGZvciBib29ra2VlcGluZyBkdXJpbmcKLSAqCQkJCXRyYW5zZmVyCi0gKiBAdHhfYnVmZjoJCQlCdWZmZXIgZm9yIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQKLSAqIEByeF9pbmRleDoJCQlCdWZmZXIgZm9yIFJlY2VpdmVkIGRhdGEKLSAqIEBuX2N1cm50X2NoaXA6CQlUaGUgY2hpcCBudW1iZXIgdGhhdCB0aGlzIFNQSSBkcml2ZXIgY3VycmVudGx5Ci0gKgkJCQlvcGVyYXRlcyBvbgotICogQGN1cnJlbnRfY2hpcDoJCVJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBjaGlwIHRoYXQgdGhpcyBTUEkKLSAqCQkJCWRyaXZlciBjdXJyZW50bHkgb3BlcmF0ZXMgb24KLSAqIEBjdXJyZW50X21zZzoJCVRoZSBjdXJyZW50IG1lc3NhZ2UgdGhhdCB0aGlzIFNQSSBkcml2ZXIgaXMKLSAqCQkJCWhhbmRsaW5nCi0gKiBAY3VyX3RyYW5zOgkJCVRoZSBjdXJyZW50IHRyYW5zZmVyIHRoYXQgdGhpcyBTUEkgZHJpdmVyIGlzCi0gKgkJCQloYW5kbGluZwotICogQGJvYXJkX2RhdDoJCQlSZWZlcmVuY2UgdG8gdGhlIFNQSSBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUKLSAqLwotc3RydWN0IHBjaF9zcGlfZGF0YSB7Ci0Jdm9pZCBfX2lvbWVtICppb19yZW1hcF9hZGRyOwotCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndrOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0JdTggdHJhbnNmZXJfY29tcGxldGU7Ci0JdTggYmN1cnJlbnRfbXNnX3Byb2Nlc3Npbmc7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7Ci0JdTggc3RhdHVzOwotCXUzMiBicHdfbGVuOwotCXU4IHRyYW5zZmVyX2FjdGl2ZTsKLQl1MzIgdHhfaW5kZXg7Ci0JdTMyIHJ4X2luZGV4OwotCXUxNiAqcGt0X3R4X2J1ZmY7Ci0JdTE2ICpwa3RfcnhfYnVmZjsKLQl1OCBuX2N1cm50X2NoaXA7Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKmN1cnJlbnRfY2hpcDsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKmN1cnJlbnRfbXNnOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKmN1cl90cmFuczsKLQlzdHJ1Y3QgcGNoX3NwaV9ib2FyZF9kYXRhICpib2FyZF9kYXQ7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgLSBIb2xkcyB0aGUgU1BJIGRldmljZSBzcGVjaWZpYyBkZXRhaWxzCi0gKiBAcGRldjoJCVBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2UKLSAqIEBpcnFfcmVnX3N0czoJU3RhdHVzIG9mIElSUSByZWdpc3RyYXRpb24KLSAqIEBwY2lfcmVxX3N0czoJU3RhdHVzIG9mIHBjaV9yZXF1ZXN0X3JlZ2lvbnMKLSAqIEBzdXNwZW5kX3N0czoJU3RhdHVzIG9mIHN1c3BlbmQKLSAqIEBkYXRhOgkJUG9pbnRlciB0byBTUEkgY2hhbm5lbCBkYXRhIHN0cnVjdHVyZQotICovCi1zdHJ1Y3QgcGNoX3NwaV9ib2FyZF9kYXRhIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQl1OCBpcnFfcmVnX3N0czsKLQl1OCBwY2lfcmVxX3N0czsKLQl1OCBzdXNwZW5kX3N0czsKLQlzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhOwotfTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaF9zcGlfcGNpZGV2X2lkW10gPSB7Ci0Je1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9HRV9TUEkpfSwKLQl7MCx9Ci19OwotCi0vKioKLSAqIHBjaF9zcGlfd3JpdGVyZWcoKSAtIFBlcmZvcm1zICByZWdpc3RlciB3cml0ZXMKLSAqIEBtYXN0ZXI6CVBvaW50ZXIgdG8gc3RydWN0IHNwaV9tYXN0ZXIuCi0gKiBAaWR4OglSZWdpc3RlciBvZmZzZXQuCi0gKiBAdmFsOglWYWx1ZSB0byBiZSB3cml0dGVuIHRvIHJlZ2lzdGVyLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNoX3NwaV93cml0ZXJlZyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBpbnQgaWR4LCB1MzIgdmFsKQotewotCXN0cnVjdCBwY2hfc3BpX2RhdGEgKmRhdGEgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0JaW93cml0ZTMyKHZhbCwgKGRhdGEtPmlvX3JlbWFwX2FkZHIgKyBpZHgpKTsKLX0KLQotLyoqCi0gKiBwY2hfc3BpX3JlYWRyZWcoKSAtIFBlcmZvcm1zIHJlZ2lzdGVyIHJlYWRzCi0gKiBAbWFzdGVyOglQb2ludGVyIHRvIHN0cnVjdCBzcGlfbWFzdGVyLgotICogQGlkeDoJUmVnaXN0ZXIgb2Zmc2V0LgotICovCi1zdGF0aWMgaW5saW5lIHUzMiBwY2hfc3BpX3JlYWRyZWcoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwgaW50IGlkeCkKLXsKLQlzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXJldHVybiBpb3JlYWQzMihkYXRhLT5pb19yZW1hcF9hZGRyICsgaWR4KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBjaF9zcGlfc2V0Y2xyX3JlZyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBpbnQgaWR4LAotCQkJCSAgICAgIHUzMiBzZXQsIHUzMiBjbHIpCi17Ci0JdTMyIHRtcCA9IHBjaF9zcGlfcmVhZHJlZyhtYXN0ZXIsIGlkeCk7Ci0JdG1wID0gKHRtcCAmIH5jbHIpIHwgc2V0OwotCXBjaF9zcGlfd3JpdGVyZWcobWFzdGVyLCBpZHgsIHRtcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjaF9zcGlfc2V0X21hc3Rlcl9tb2RlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCi17Ci0JcGNoX3NwaV9zZXRjbHJfcmVnKG1hc3RlciwgUENIX1NQQ1IsIFNQQ1JfTVNUUl9CSVQsIDApOwotfQotCi0vKioKLSAqIHBjaF9zcGlfY2xlYXJfZmlmbygpIC0gQ2xlYXJzIHRoZSBUcmFuc21pdCBhbmQgUmVjZWl2ZSBGSUZPcwotICogQG1hc3RlcjoJUG9pbnRlciB0byBzdHJ1Y3Qgc3BpX21hc3Rlci4KLSAqLwotc3RhdGljIHZvaWQgcGNoX3NwaV9jbGVhcl9maWZvKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCi17Ci0JcGNoX3NwaV9zZXRjbHJfcmVnKG1hc3RlciwgUENIX1NQQ1IsIFNQQ1JfRklDTFJfQklULCAwKTsKLQlwY2hfc3BpX3NldGNscl9yZWcobWFzdGVyLCBQQ0hfU1BDUiwgMCwgU1BDUl9GSUNMUl9CSVQpOwotfQotCi1zdGF0aWMgdm9pZCBwY2hfc3BpX2hhbmRsZXJfc3ViKHN0cnVjdCBwY2hfc3BpX2RhdGEgKmRhdGEsIHUzMiByZWdfc3Bzcl92YWwsCi0JCQkJdm9pZCBfX2lvbWVtICppb19yZW1hcF9hZGRyKQotewotCXUzMiBuX3JlYWQsIHR4X2luZGV4LCByeF9pbmRleCwgYnB3X2xlbjsKLQl1MTYgKnBrdF9yeF9idWZmZXIsICpwa3RfdHhfYnVmZjsKLQlpbnQgcmVhZF9jbnQ7Ci0JdTMyIHJlZ19zcGNyX3ZhbDsKLQl2b2lkIF9faW9tZW0gKnNwc3I7Ci0Jdm9pZCBfX2lvbWVtICpzcGRycjsKLQl2b2lkIF9faW9tZW0gKnNwZHdyOwotCi0Jc3BzciA9IGlvX3JlbWFwX2FkZHIgKyBQQ0hfU1BTUjsKLQlpb3dyaXRlMzIocmVnX3Nwc3JfdmFsLCBzcHNyKTsKLQotCWlmIChkYXRhLT50cmFuc2Zlcl9hY3RpdmUpIHsKLQkJcnhfaW5kZXggPSBkYXRhLT5yeF9pbmRleDsKLQkJdHhfaW5kZXggPSBkYXRhLT50eF9pbmRleDsKLQkJYnB3X2xlbiA9IGRhdGEtPmJwd19sZW47Ci0JCXBrdF9yeF9idWZmZXIgPSBkYXRhLT5wa3RfcnhfYnVmZjsKLQkJcGt0X3R4X2J1ZmYgPSBkYXRhLT5wa3RfdHhfYnVmZjsKLQotCQlzcGRyciA9IGlvX3JlbWFwX2FkZHIgKyBQQ0hfU1BEUlI7Ci0JCXNwZHdyID0gaW9fcmVtYXBfYWRkciArIFBDSF9TUERXUjsKLQotCQluX3JlYWQgPSBQQ0hfUkVBREFCTEUocmVnX3Nwc3JfdmFsKTsKLQotCQlmb3IgKHJlYWRfY250ID0gMDsgKHJlYWRfY250IDwgbl9yZWFkKTsgcmVhZF9jbnQrKykgewotCQkJcGt0X3J4X2J1ZmZlcltyeF9pbmRleCsrXSA9IGlvcmVhZDMyKHNwZHJyKTsKLQkJCWlmICh0eF9pbmRleCA8IGJwd19sZW4pCi0JCQkJaW93cml0ZTMyKHBrdF90eF9idWZmW3R4X2luZGV4KytdLCBzcGR3cik7Ci0JCX0KLQotCQkvKiBkaXNhYmxlIFJGSSBpZiBub3QgbmVlZGVkICovCi0JCWlmICgoYnB3X2xlbiAtIHJ4X2luZGV4KSA8PSBQQ0hfTUFYX0ZJRk9fREVQVEgpIHsKLQkJCXJlZ19zcGNyX3ZhbCA9IGlvcmVhZDMyKGlvX3JlbWFwX2FkZHIgKyBQQ0hfU1BDUik7Ci0JCQlyZWdfc3Bjcl92YWwgJj0gflNQQ1JfUkZJRV9CSVQ7IC8qIGRpc2FibGUgUkZJICovCi0KLQkJCS8qIHJlc2V0IHJ4IHRocmVzaG9sZCAqLwotCQkJcmVnX3NwY3JfdmFsICY9IE1BU0tfUkZJQ19TUENSX0JJVFM7Ci0JCQlyZWdfc3Bjcl92YWwgfD0gKFBDSF9SWF9USE9MRF9NQVggPDwgU1BDUl9SRklDX0ZJRUxEKTsKLQkJCWlvd3JpdGUzMigoKHJlZ19zcGNyX3ZhbCkgJj0gKH4oU1BDUl9SRklFX0JJVCkpKSwKLQkJCQkgKGlvX3JlbWFwX2FkZHIgKyBQQ0hfU1BDUikpOwotCQl9Ci0KLQkJLyogdXBkYXRlIGNvdW50cyAqLwotCQlkYXRhLT50eF9pbmRleCA9IHR4X2luZGV4OwotCQlkYXRhLT5yeF9pbmRleCA9IHJ4X2luZGV4OwotCi0JfQotCi0JLyogaWYgdHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0ICovCi0JaWYgKHJlZ19zcHNyX3ZhbCAmIFNQU1JfRklfQklUKSB7Ci0JCS8qIGRpc2FibGUgRkkgJiBSRkkgaW50ZXJydXB0cyAqLwotCQlwY2hfc3BpX3NldGNscl9yZWcoZGF0YS0+bWFzdGVyLCBQQ0hfU1BDUiwgMCwKLQkJCQkgICBTUENSX0ZJRV9CSVQgfCBTUENSX1JGSUVfQklUKTsKLQotCQkvKiB0cmFuc2ZlciBpcyBjb21wbGV0ZWQ7aW5mb3JtIHBjaF9zcGlfcHJvY2Vzc19tZXNzYWdlcyAqLwotCQlkYXRhLT50cmFuc2Zlcl9jb21wbGV0ZSA9IHRydWU7Ci0JCXdha2VfdXAoJmRhdGEtPndhaXQpOwotCX0KLX0KLQotLyoqCi0gKiBwY2hfc3BpX2hhbmRsZXIoKSAtIEludGVycnVwdCBoYW5kbGVyCi0gKiBAaXJxOglUaGUgaW50ZXJydXB0IG51bWJlci4KLSAqIEBkZXZfaWQ6CVBvaW50ZXIgdG8gc3RydWN0IHBjaF9zcGlfYm9hcmRfZGF0YS4KLSAqLwotc3RhdGljIGlycXJldHVybl90IHBjaF9zcGlfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JdTMyIHJlZ19zcHNyX3ZhbDsKLQlzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhOwotCXZvaWQgX19pb21lbSAqc3BzcjsKLQl2b2lkIF9faW9tZW0gKmlvX3JlbWFwX2FkZHI7Ci0JaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7Ci0Jc3RydWN0IHBjaF9zcGlfYm9hcmRfZGF0YSAqYm9hcmRfZGF0ID0gZGV2X2lkOwotCi0JaWYgKGJvYXJkX2RhdC0+c3VzcGVuZF9zdHMpIHsKLQkJZGV2X2RiZygmYm9hcmRfZGF0LT5wZGV2LT5kZXYsCi0JCQkiJXMgcmV0dXJuaW5nIGR1ZSB0byBzdXNwZW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQlkYXRhID0gYm9hcmRfZGF0LT5kYXRhOwotCWlvX3JlbWFwX2FkZHIgPSBkYXRhLT5pb19yZW1hcF9hZGRyOwotCXNwc3IgPSBpb19yZW1hcF9hZGRyICsgUENIX1NQU1I7Ci0KLQlyZWdfc3Bzcl92YWwgPSBpb3JlYWQzMihzcHNyKTsKLQotCS8qIENoZWNrIGlmIHRoZSBpbnRlcnJ1cHQgaXMgZm9yIFNQSSBkZXZpY2UgKi8KLQlpZiAocmVnX3Nwc3JfdmFsICYgKFNQU1JfRklfQklUIHwgU1BTUl9SRklfQklUKSkgewotCQlwY2hfc3BpX2hhbmRsZXJfc3ViKGRhdGEsIHJlZ19zcHNyX3ZhbCwgaW9fcmVtYXBfYWRkcik7Ci0JCXJldCA9IElSUV9IQU5ETEVEOwotCX0KLQotCWRldl9kYmcoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LCAiJXMgRVhJVCByZXR1cm4gdmFsdWU9JWRcbiIsCi0JCV9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBwY2hfc3BpX3NldF9iYXVkX3JhdGUoKSAtIFNldHMgU1BCUiBmaWVsZCBpbiBTUEJSUgotICogQG1hc3RlcjoJUG9pbnRlciB0byBzdHJ1Y3Qgc3BpX21hc3Rlci4KLSAqIEBzcGVlZF9oejoJQmF1ZCByYXRlLgotICovCi1zdGF0aWMgdm9pZCBwY2hfc3BpX3NldF9iYXVkX3JhdGUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwgdTMyIHNwZWVkX2h6KQotewotCXUzMiBuX3NwYnIgPSBQQ0hfQ0xPQ0tfSFogLyAoc3BlZWRfaHogKiAyKTsKLQotCS8qIGlmIGJhdWQgcmF0ZSBpcyBsZXNzIHRoYW4gd2UgY2FuIHN1cHBvcnQgbGltaXQgaXQgKi8KLQlpZiAobl9zcGJyID4gUENIX01BWF9TUEJSKQotCQluX3NwYnIgPSBQQ0hfTUFYX1NQQlI7Ci0KLQlwY2hfc3BpX3NldGNscl9yZWcobWFzdGVyLCBQQ0hfU1BCUlIsIG5fc3Biciwgfk1BU0tfU1BCUlJfU1BCUl9CSVRTKTsKLX0KLQotLyoqCi0gKiBwY2hfc3BpX3NldF9iaXRzX3Blcl93b3JkKCkgLSBTZXRzIFNJWkUgZmllbGQgaW4gU1BCUlIKLSAqIEBtYXN0ZXI6CQlQb2ludGVyIHRvIHN0cnVjdCBzcGlfbWFzdGVyLgotICogQGJpdHNfcGVyX3dvcmQ6CUJpdHMgcGVyIHdvcmQgZm9yIFNQSSB0cmFuc2Zlci4KLSAqLwotc3RhdGljIHZvaWQgcGNoX3NwaV9zZXRfYml0c19wZXJfd29yZChzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAotCQkJCSAgICAgIHU4IGJpdHNfcGVyX3dvcmQpCi17Ci0JaWYgKGJpdHNfcGVyX3dvcmQgPT0gOCkKLQkJcGNoX3NwaV9zZXRjbHJfcmVnKG1hc3RlciwgUENIX1NQQlJSLCAwLCBTUEJSUl9TSVpFX0JJVCk7Ci0JZWxzZQotCQlwY2hfc3BpX3NldGNscl9yZWcobWFzdGVyLCBQQ0hfU1BCUlIsIFNQQlJSX1NJWkVfQklULCAwKTsKLX0KLQotLyoqCi0gKiBwY2hfc3BpX3NldHVwX3RyYW5zZmVyKCkgLSBDb25maWd1cmVzIHRoZSBQQ0ggU1BJIGhhcmR3YXJlIGZvciB0cmFuc2ZlcgotICogQHNwaToJUG9pbnRlciB0byBzdHJ1Y3Qgc3BpX2RldmljZS4KLSAqLwotc3RhdGljIHZvaWQgcGNoX3NwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXUzMiBmbGFncyA9IDA7Ci0KLQlkZXZfZGJnKCZzcGktPmRldiwgIiVzIFNQQlJSIGNvbnRlbnQgPSV4IHNldHRpbmcgYmF1ZCByYXRlPSVkXG4iLAotCQlfX2Z1bmNfXywgcGNoX3NwaV9yZWFkcmVnKHNwaS0+bWFzdGVyLCBQQ0hfU1BCUlIpLAotCQlzcGktPm1heF9zcGVlZF9oeik7Ci0JcGNoX3NwaV9zZXRfYmF1ZF9yYXRlKHNwaS0+bWFzdGVyLCBzcGktPm1heF9zcGVlZF9oeik7Ci0KLQkvKiBzZXQgYml0cyBwZXIgd29yZCAqLwotCXBjaF9zcGlfc2V0X2JpdHNfcGVyX3dvcmQoc3BpLT5tYXN0ZXIsIHNwaS0+Yml0c19wZXJfd29yZCk7Ci0KLQlpZiAoIShzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSkKLQkJZmxhZ3MgfD0gU1BDUl9MU0JGX0JJVDsKLQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCi0JCWZsYWdzIHw9IFNQQ1JfQ1BPTF9CSVQ7Ci0JaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQotCQlmbGFncyB8PSBTUENSX0NQSEFfQklUOwotCXBjaF9zcGlfc2V0Y2xyX3JlZyhzcGktPm1hc3RlciwgUENIX1NQQ1IsIGZsYWdzLAotCQkJICAgKFNQQ1JfTFNCRl9CSVQgfCBTUENSX0NQT0xfQklUIHwgU1BDUl9DUEhBX0JJVCkpOwotCi0JLyogQ2xlYXIgdGhlIEZJRk8gYnkgdG9nZ2xpbmcgIEZJQ0xSIHRvIDEgYW5kIGJhY2sgdG8gMCAqLwotCXBjaF9zcGlfY2xlYXJfZmlmbyhzcGktPm1hc3Rlcik7Ci19Ci0KLS8qKgotICogcGNoX3NwaV9yZXNldCgpIC0gQ2xlYXJzIFNQSSByZWdpc3RlcnMKLSAqIEBtYXN0ZXI6CVBvaW50ZXIgdG8gc3RydWN0IHNwaV9tYXN0ZXIuCi0gKi8KLXN0YXRpYyB2b2lkIHBjaF9zcGlfcmVzZXQoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKLXsKLQkvKiB3cml0ZSAxIHRvIHJlc2V0IFNQSSAqLwotCXBjaF9zcGlfd3JpdGVyZWcobWFzdGVyLCBQQ0hfU1JTVCwgMHgxKTsKLQotCS8qIGNsZWFyIHJlc2V0ICovCi0JcGNoX3NwaV93cml0ZXJlZyhtYXN0ZXIsIFBDSF9TUlNULCAweDApOwotfQotCi1zdGF0aWMgaW50IHBjaF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnBzcGkpCi17Ci0JLyogY2hlY2sgYml0cyBwZXIgd29yZCAqLwotCWlmIChwc3BpLT5iaXRzX3Blcl93b3JkID09IDApIHsKLQkJcHNwaS0+Yml0c19wZXJfd29yZCA9IDg7Ci0JCWRldl9kYmcoJnBzcGktPmRldiwgIiVzIDggYml0cyBwZXIgd29yZFxuIiwgX19mdW5jX18pOwotCX0KLQotCWlmICgocHNwaS0+Yml0c19wZXJfd29yZCAhPSA4KSAmJiAocHNwaS0+Yml0c19wZXJfd29yZCAhPSAxNikpIHsKLQkJZGV2X2VycigmcHNwaS0+ZGV2LCAiJXMgSW52YWxpZCBiaXRzIHBlciB3b3JkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIENoZWNrIGJhdWQgcmF0ZSBzZXR0aW5nICovCi0JLyogaWYgYmF1ZCByYXRlIG9mIGNoaXAgaXMgZ3JlYXRlciB0aGFuCi0JICAgbWF4IHdlIGNhbiBzdXBwb3J0LHJldHVybiBlcnJvciAqLwotCWlmICgocHNwaS0+bWF4X3NwZWVkX2h6KSA+IFBDSF9NQVhfQkFVRFJBVEUpCi0JCXBzcGktPm1heF9zcGVlZF9oeiA9IFBDSF9NQVhfQkFVRFJBVEU7Ci0KLQlkZXZfZGJnKCZwc3BpLT5kZXYsICIlcyBNT0RFID0gJXhcbiIsIF9fZnVuY19fLAotCQkocHNwaS0+bW9kZSkgJiAoU1BJX0NQT0wgfCBTUElfQ1BIQSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGNoX3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqcHNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICpwbXNnKQotewotCi0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnNmZXI7Ci0Jc3RydWN0IHBjaF9zcGlfZGF0YSAqZGF0YSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEocHNwaS0+bWFzdGVyKTsKLQlpbnQgcmV0dmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiB2YWxpZGF0ZSBzcGkgbWVzc2FnZSBhbmQgYmF1ZCByYXRlICovCi0JaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJnBtc2ctPnRyYW5zZmVycykgPT0gMSkpIHsKLQkJZGV2X2VycigmcHNwaS0+ZGV2LCAiJXMgbGlzdCBlbXB0eVxuIiwgX19mdW5jX18pOwotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCi0JaWYgKHVubGlrZWx5KHBzcGktPm1heF9zcGVlZF9oeiA9PSAwKSkgewotCQlkZXZfZXJyKCZwc3BpLT5kZXYsICIlcyBwY2hfc3BpX3RyYW5mZXIgbWF4c3BlZWQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcHNwaS0+bWF4X3NwZWVkX2h6KTsKLQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCWRldl9kYmcoJnBzcGktPmRldiwgIiVzIFRyYW5zZmVyIExpc3Qgbm90IGVtcHR5LiAiCi0JCSJUcmFuc2ZlciBTcGVlZCBpcyBzZXQuXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiB2YWxpZGF0ZSBUeC9SeCBidWZmZXJzIGFuZCBUcmFuc2ZlciBsZW5ndGggKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zZmVyLCAmcG1zZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmICghdHJhbnNmZXItPnR4X2J1ZiAmJiAhdHJhbnNmZXItPnJ4X2J1ZikgewotCQkJZGV2X2VycigmcHNwaS0+ZGV2LAotCQkJCSIlcyBUeCBhbmQgUnggYnVmZmVyIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJCXJldHZhbCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycl9vdXQ7Ci0JCX0KLQotCQlpZiAoIXRyYW5zZmVyLT5sZW4pIHsKLQkJCWRldl9lcnIoJnBzcGktPmRldiwgIiVzIFRyYW5zZmVyIGxlbmd0aCBpbnZhbGlkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHZhbCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycl9vdXQ7Ci0JCX0KLQotCQlkZXZfZGJnKCZwc3BpLT5kZXYsICIlcyBUeC9SeCBidWZmZXIgdmFsaWQuIFRyYW5zZmVyIGxlbmd0aCIKLQkJCSIgdmFsaWRcbiIsIF9fZnVuY19fKTsKLQotCQkvKiBpZiBiYXVkIHJhdGUgaHMgYmVlbiBzcGVjaWZpZWQgdmFsaWRhdGUgdGhlIHNhbWUgKi8KLQkJaWYgKHRyYW5zZmVyLT5zcGVlZF9oeiA+IFBDSF9NQVhfQkFVRFJBVEUpCi0JCQl0cmFuc2Zlci0+c3BlZWRfaHogPSBQQ0hfTUFYX0JBVURSQVRFOwotCi0JCS8qIGlmIGJpdHMgcGVyIHdvcmQgaGFzIGJlZW4gc3BlY2lmaWVkIHZhbGlkYXRlIHRoZSBzYW1lICovCi0JCWlmICh0cmFuc2Zlci0+Yml0c19wZXJfd29yZCkgewotCQkJaWYgKCh0cmFuc2Zlci0+Yml0c19wZXJfd29yZCAhPSA4KQotCQkJICAgICYmICh0cmFuc2Zlci0+Yml0c19wZXJfd29yZCAhPSAxNikpIHsKLQkJCQlyZXR2YWwgPSAtRUlOVkFMOwotCQkJCWRldl9lcnIoJnBzcGktPmRldiwKLQkJCQkJIiVzIEludmFsaWQgYml0cyBwZXIgd29yZFxuIiwgX19mdW5jX18pOwotCQkJCWdvdG8gZXJyX291dDsKLQkJCX0KLQkJfQotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBXZSB3b24ndCBwcm9jZXNzIGFueSBtZXNzYWdlcyBpZiB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8gdGVybWluYXRlICovCi0JaWYgKGRhdGEtPnN0YXR1cyA9PSBTVEFUVVNfRVhJVElORykgewotCQlkZXZfZXJyKCZwc3BpLT5kZXYsICIlcyBzdGF0dXMgPSBTVEFUVVNfRVhJVElORy5cbiIsIF9fZnVuY19fKTsKLQkJcmV0dmFsID0gLUVTSFVURE9XTjsKLQkJZ290byBlcnJfcmV0dXJuX3NwaW5sb2NrOwotCX0KLQotCS8qIElmIHN1c3BlbmRlZCAscmV0dXJuIC1FSU5WQUwgKi8KLQlpZiAoZGF0YS0+Ym9hcmRfZGF0LT5zdXNwZW5kX3N0cykgewotCQlkZXZfZXJyKCZwc3BpLT5kZXYsICIlcyBzdXNwZW5kOyByZXR1cm5pbmcgRUlOVkFMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JldHVybl9zcGlubG9jazsKLQl9Ci0KLQkvKiBzZXQgc3RhdHVzIG9mIG1lc3NhZ2UgKi8KLQlwbXNnLT5hY3R1YWxfbGVuZ3RoID0gMDsKLQlkZXZfZGJnKCZwc3BpLT5kZXYsICIlcyAtIHBtc2ctPnN0YXR1cyA9JWRcbiIsIF9fZnVuY19fLCBwbXNnLT5zdGF0dXMpOwotCi0JcG1zZy0+c3RhdHVzID0gLUVJTlBST0dSRVNTOwotCi0JLyogYWRkIG1lc3NhZ2UgdG8gcXVldWUgKi8KLQlsaXN0X2FkZF90YWlsKCZwbXNnLT5xdWV1ZSwgJmRhdGEtPnF1ZXVlKTsKLQlkZXZfZGJnKCZwc3BpLT5kZXYsICIlcyAtIEludm9rZWQgbGlzdF9hZGRfdGFpbFxuIiwgX19mdW5jX18pOwotCi0JLyogc2NoZWR1bGUgd29yayBxdWV1ZSB0byBydW4gKi8KLQlxdWV1ZV93b3JrKGRhdGEtPndrLCAmZGF0YS0+d29yayk7Ci0JZGV2X2RiZygmcHNwaS0+ZGV2LCAiJXMgLSBJbnZva2VkIHF1ZXVlIHdvcmtcbiIsIF9fZnVuY19fKTsKLQotCXJldHZhbCA9IDA7Ci0KLWVycl9yZXR1cm5fc3BpbmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+bG9jaywgZmxhZ3MpOwotZXJyX291dDoKLQlkZXZfZGJnKCZwc3BpLT5kZXYsICIlcyBSRVRVUk49JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2hfc3BpX3NlbGVjdF9jaGlwKHN0cnVjdCBwY2hfc3BpX2RhdGEgKmRhdGEsCi0JCQkJICAgICAgIHN0cnVjdCBzcGlfZGV2aWNlICpwc3BpKQotewotCWlmIChkYXRhLT5jdXJyZW50X2NoaXAgIT0gTlVMTCkgewotCQlpZiAocHNwaS0+Y2hpcF9zZWxlY3QgIT0gZGF0YS0+bl9jdXJudF9jaGlwKSB7Ci0JCQlkZXZfZGJnKCZwc3BpLT5kZXYsICIlcyA6IGRpZmZlcmVudCBzbGF2ZVxuIiwgX19mdW5jX18pOwotCQkJZGF0YS0+Y3VycmVudF9jaGlwID0gTlVMTDsKLQkJfQotCX0KLQotCWRhdGEtPmN1cnJlbnRfY2hpcCA9IHBzcGk7Ci0KLQlkYXRhLT5uX2N1cm50X2NoaXAgPSBkYXRhLT5jdXJyZW50X2NoaXAtPmNoaXBfc2VsZWN0OwotCi0JZGV2X2RiZygmcHNwaS0+ZGV2LCAiJXMgOkludm9raW5nIHBjaF9zcGlfc2V0dXBfdHJhbnNmZXJcbiIsIF9fZnVuY19fKTsKLQlwY2hfc3BpX3NldHVwX3RyYW5zZmVyKHBzcGkpOwotfQotCi1zdGF0aWMgdm9pZCBwY2hfc3BpX3NldF90eChzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhLCBpbnQgKmJwdywKLQkJCSAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqKnBwbXNnKQotewotCWludCBzaXplOwotCXUzMiBuX3dyaXRlczsKLQlpbnQgajsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKnBtc2c7Ci0JY29uc3QgdTggKnR4X2J1ZjsKLQljb25zdCB1MTYgKnR4X3NidWY7Ci0KLQlwbXNnID0gKnBwbXNnOwotCi0JLyogc2V0IGJhdWQgcmF0ZSBpZiBuZWVkZWQgKi8KLQlpZiAoZGF0YS0+Y3VyX3RyYW5zLT5zcGVlZF9oeikgewotCQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzOnNldHRpbmcgYmF1ZCByYXRlXG4iLCBfX2Z1bmNfXyk7Ci0JCXBjaF9zcGlfc2V0X2JhdWRfcmF0ZShkYXRhLT5tYXN0ZXIsIGRhdGEtPmN1cl90cmFucy0+c3BlZWRfaHopOwotCX0KLQotCS8qIHNldCBiaXRzIHBlciB3b3JkIGlmIG5lZWRlZCAqLwotCWlmIChkYXRhLT5jdXJfdHJhbnMtPmJpdHNfcGVyX3dvcmQgJiYKLQkgICAgKGRhdGEtPmN1cnJlbnRfbXNnLT5zcGktPmJpdHNfcGVyX3dvcmQgIT0gZGF0YS0+Y3VyX3RyYW5zLT5iaXRzX3Blcl93b3JkKSkgewotCQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzOnNldCBiaXRzIHBlciB3b3JkXG4iLCBfX2Z1bmNfXyk7Ci0JCXBjaF9zcGlfc2V0X2JpdHNfcGVyX3dvcmQoZGF0YS0+bWFzdGVyLAotCQkJCQkgIGRhdGEtPmN1cl90cmFucy0+Yml0c19wZXJfd29yZCk7Ci0JCSpicHcgPSBkYXRhLT5jdXJfdHJhbnMtPmJpdHNfcGVyX3dvcmQ7Ci0JfSBlbHNlIHsKLQkJKmJwdyA9IGRhdGEtPmN1cnJlbnRfbXNnLT5zcGktPmJpdHNfcGVyX3dvcmQ7Ci0JfQotCi0JLyogcmVzZXQgVHgvUnggaW5kZXggKi8KLQlkYXRhLT50eF9pbmRleCA9IDA7Ci0JZGF0YS0+cnhfaW5kZXggPSAwOwotCi0JZGF0YS0+YnB3X2xlbiA9IGRhdGEtPmN1cl90cmFucy0+bGVuIC8gKCpicHcgLyA4KTsKLQotCS8qIGZpbmQgYWxsb2Mgc2l6ZSAqLwotCXNpemUgPSBkYXRhLT5jdXJfdHJhbnMtPmxlbiAqIHNpemVvZigqZGF0YS0+cGt0X3R4X2J1ZmYpOwotCi0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciBwa3RfdHhfYnVmZiAmIHBrdF9yeF9idWZmZXIgKi8KLQlkYXRhLT5wa3RfdHhfYnVmZiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRhdGEtPnBrdF90eF9idWZmICE9IE5VTEwpIHsKLQkJZGF0YS0+cGt0X3J4X2J1ZmYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIWRhdGEtPnBrdF9yeF9idWZmKQotCQkJa2ZyZWUoZGF0YS0+cGt0X3R4X2J1ZmYpOwotCX0KLQotCWlmICghZGF0YS0+cGt0X3J4X2J1ZmYpIHsKLQkJLyogZmx1c2ggcXVldWUgYW5kIHNldCBzdGF0dXMgb2YgYWxsIHRyYW5zZmVycyB0byAtRU5PTUVNICovCi0JCWRldl9lcnIoJmRhdGEtPm1hc3Rlci0+ZGV2LCAiJXMgOmt6YWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocG1zZywgZGF0YS0+cXVldWUubmV4dCwgcXVldWUpIHsKLQkJCXBtc2ctPnN0YXR1cyA9IC1FTk9NRU07Ci0KLQkJCWlmIChwbXNnLT5jb21wbGV0ZSAhPSAwKQotCQkJCXBtc2ctPmNvbXBsZXRlKHBtc2ctPmNvbnRleHQpOwotCi0JCQkvKiBkZWxldGUgZnJvbSBxdWV1ZSAqLwotCQkJbGlzdF9kZWxfaW5pdCgmcG1zZy0+cXVldWUpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBjb3B5IFR4IERhdGEgKi8KLQlpZiAoZGF0YS0+Y3VyX3RyYW5zLT50eF9idWYgIT0gTlVMTCkgewotCQlpZiAoKmJwdyA9PSA4KSB7Ci0JCQl0eF9idWYgPSBkYXRhLT5jdXJfdHJhbnMtPnR4X2J1ZjsKLQkJCWZvciAoaiA9IDA7IGogPCBkYXRhLT5icHdfbGVuOyBqKyspCi0JCQkJZGF0YS0+cGt0X3R4X2J1ZmZbal0gPSAqdHhfYnVmKys7Ci0JCX0gZWxzZSB7Ci0JCQl0eF9zYnVmID0gZGF0YS0+Y3VyX3RyYW5zLT50eF9idWY7Ci0JCQlmb3IgKGogPSAwOyBqIDwgZGF0YS0+YnB3X2xlbjsgaisrKQotCQkJCWRhdGEtPnBrdF90eF9idWZmW2pdID0gKnR4X3NidWYrKzsKLQkJfQotCX0KLQotCS8qIGlmIGxlbiBncmVhdGVyIHRoYW4gUENIX01BWF9GSUZPX0RFUFRILCB3cml0ZSAxNixlbHNlIGxlbiBieXRlcyAqLwotCW5fd3JpdGVzID0gZGF0YS0+YnB3X2xlbjsKLQlpZiAobl93cml0ZXMgPiBQQ0hfTUFYX0ZJRk9fREVQVEgpCi0JCW5fd3JpdGVzID0gUENIX01BWF9GSUZPX0RFUFRIOwotCi0JZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsICJcbiVzOlB1bGxpbmcgZG93biBTU04gbG93IC0gd3JpdGluZyAiCi0JCSIweDIgdG8gU1NOWENSXG4iLCBfX2Z1bmNfXyk7Ci0JcGNoX3NwaV93cml0ZXJlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TU05YQ1IsIFNTTl9MT1cpOwotCi0JZm9yIChqID0gMDsgaiA8IG5fd3JpdGVzOyBqKyspCi0JCXBjaF9zcGlfd3JpdGVyZWcoZGF0YS0+bWFzdGVyLCBQQ0hfU1BEV1IsIGRhdGEtPnBrdF90eF9idWZmW2pdKTsKLQotCS8qIHVwZGF0ZSB0eF9pbmRleCAqLwotCWRhdGEtPnR4X2luZGV4ID0gajsKLQotCS8qIHJlc2V0IHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8KLQlkYXRhLT50cmFuc2Zlcl9jb21wbGV0ZSA9IGZhbHNlOwotCWRhdGEtPnRyYW5zZmVyX2FjdGl2ZSA9IHRydWU7Ci19Ci0KLQotc3RhdGljIHZvaWQgcGNoX3NwaV9ub21vcmVfdHJhbnNmZXIoc3RydWN0IHBjaF9zcGlfZGF0YSAqZGF0YSwKLQkJCQkJCXN0cnVjdCBzcGlfbWVzc2FnZSAqcG1zZykKLXsKLQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwotCS8qIEludm9rZSBjb21wbGV0ZSBjYWxsYmFjawotCSAqIFtUbyB0aGUgc3BpIGNvcmUuLmluZGljYXRpbmcgZW5kIG9mIHRyYW5zZmVyXSAqLwotCWRhdGEtPmN1cnJlbnRfbXNnLT5zdGF0dXMgPSAwOwotCi0JaWYgKGRhdGEtPmN1cnJlbnRfbXNnLT5jb21wbGV0ZSAhPSAwKSB7Ci0JCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LAotCQkJIiVzOkludm9raW5nIGNhbGxiYWNrIG9mIFNQSSBjb3JlXG4iLCBfX2Z1bmNfXyk7Ci0JCWRhdGEtPmN1cnJlbnRfbXNnLT5jb21wbGV0ZShkYXRhLT5jdXJyZW50X21zZy0+Y29udGV4dCk7Ci0JfQotCi0JLyogdXBkYXRlIHN0YXR1cyBpbiBnbG9iYWwgdmFyaWFibGUgKi8KLQlkYXRhLT5iY3VycmVudF9tc2dfcHJvY2Vzc2luZyA9IGZhbHNlOwotCi0JZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsCi0JCSIlczpkYXRhLT5iY3VycmVudF9tc2dfcHJvY2Vzc2luZyA9IGZhbHNlXG4iLCBfX2Z1bmNfXyk7Ci0KLQlkYXRhLT5jdXJyZW50X21zZyA9IE5VTEw7Ci0JZGF0YS0+Y3VyX3RyYW5zID0gTlVMTDsKLQotCS8qIGNoZWNrIGlmIHdlIGhhdmUgaXRlbXMgaW4gbGlzdCBhbmQgbm90IHN1c3BlbmRpbmcKLQkgKiByZXR1cm4gMSBpZiBsaXN0IGVtcHR5ICovCi0JaWYgKChsaXN0X2VtcHR5KCZkYXRhLT5xdWV1ZSkgPT0gMCkgJiYKLQkgICAgKCFkYXRhLT5ib2FyZF9kYXQtPnN1c3BlbmRfc3RzKSAmJgotCSAgICAoZGF0YS0+c3RhdHVzICE9IFNUQVRVU19FWElUSU5HKSkgewotCQkvKiBXZSBoYXZlIHNvbWUgbW9yZSB3b3JrIHRvIGRvIChlaXRoZXIgdGhlcmUgaXMgbW9yZSB0cmFuaW50Ci0JCSAqIGJwdztzZmVyIHJlcXVlc3RzIGluIHRoZSBjdXJyZW50IG1lc3NhZ2Ugb3IgdGhlcmUgYXJlCi0JCSAqbW9yZSBtZXNzYWdlcykKLQkJICovCi0JCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LCAiJXM6SW52b2tlIHF1ZXVlX3dvcmtcbiIsIF9fZnVuY19fKTsKLQkJcXVldWVfd29yayhkYXRhLT53aywgJmRhdGEtPndvcmspOwotCX0gZWxzZSBpZiAoZGF0YS0+Ym9hcmRfZGF0LT5zdXNwZW5kX3N0cyB8fAotCQkgICBkYXRhLT5zdGF0dXMgPT0gU1RBVFVTX0VYSVRJTkcpIHsKLQkJZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsCi0JCQkiJXMgc3VzcGVuZC9yZW1vdmUgaW5pdGlhdGVkLCBmbHVzaGluZyBxdWV1ZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwbXNnLCBkYXRhLT5xdWV1ZS5uZXh0LCBxdWV1ZSkgewotCQkJcG1zZy0+c3RhdHVzID0gLUVJTzsKLQotCQkJaWYgKHBtc2ctPmNvbXBsZXRlKQotCQkJCXBtc2ctPmNvbXBsZXRlKHBtc2ctPmNvbnRleHQpOwotCi0JCQkvKiBkZWxldGUgZnJvbSBxdWV1ZSAqLwotCQkJbGlzdF9kZWxfaW5pdCgmcG1zZy0+cXVldWUpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBwY2hfc3BpX3NldF9pcihzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhKQotewotCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0JaWYgKChkYXRhLT5icHdfbGVuKSA+IFBDSF9NQVhfRklGT19ERVBUSCkgewotCQkvKiBzZXQgcmVjZWl2ZSB0aHJlc2hvbGQgdG8gUENIX1JYX1RIT0xEICovCi0JCXBjaF9zcGlfc2V0Y2xyX3JlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TUENSLAotCQkJCSAgIFBDSF9SWF9USE9MRCA8PCBTUENSX1JGSUNfRklFTEQsCi0JCQkJICAgfk1BU0tfUkZJQ19TUENSX0JJVFMpOwotCQkvKiBlbmFibGUgRkkgYW5kIFJGSSBpbnRlcnJ1cHRzICovCi0JCXBjaF9zcGlfc2V0Y2xyX3JlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TUENSLAotCQkJCSAgIFNQQ1JfUkZJRV9CSVQgfCBTUENSX0ZJRV9CSVQsIDApOwotCX0gZWxzZSB7Ci0JCS8qIHNldCByZWNlaXZlIHRocmVzaG9sZCB0byBtYXhpbXVtICovCi0JCXBjaF9zcGlfc2V0Y2xyX3JlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TUENSLAotCQkJCSAgIFBDSF9SWF9USE9MRF9NQVggPDwgU1BDUl9URklDX0ZJRUxELAotCQkJCSAgIH5NQVNLX1RGSUNfU1BDUl9CSVRTKTsKLQkJLyogZW5hYmxlIEZJIGludGVycnVwdCAqLwotCQlwY2hfc3BpX3NldGNscl9yZWcoZGF0YS0+bWFzdGVyLCBQQ0hfU1BDUiwgU1BDUl9GSUVfQklULCAwKTsKLQl9Ci0KLQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwKLQkJIiVzOmludm9raW5nIHBjaF9zcGlfc2V0X2VuYWJsZSB0byBlbmFibGUgU1BJXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBTUEkgc2V0IGVuYWJsZSAqLwotCXBjaF9zcGlfc2V0Y2xyX3JlZyhkYXRhLT5jdXJyZW50X2NoaXAtPm1hc3RlciwgUENIX1NQQ1IsIFNQQ1JfU1BFX0JJVCwgMCk7Ci0KLQkvKiBXYWl0IHVudGlsIHRoZSB0cmFuc2ZlciBjb21wbGV0ZXM7IGdvIHRvIHNsZWVwIGFmdGVyCi0JCQkJIGluaXRpYXRpbmcgdGhlIHRyYW5zZmVyLiAqLwotCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LAotCQkiJXM6d2FpdGluZyBmb3IgdHJhbnNmZXIgdG8gZ2V0IG92ZXJcbiIsIF9fZnVuY19fKTsKLQotCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkYXRhLT53YWl0LCBkYXRhLT50cmFuc2Zlcl9jb21wbGV0ZSk7Ci0KLQlwY2hfc3BpX3dyaXRlcmVnKGRhdGEtPm1hc3RlciwgUENIX1NTTlhDUiwgU1NOX05PX0NPTlRST0wpOwotCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LAotCQkiJXM6bm8gbW9yZSBjb250cm9sIG92ZXIgU1NOLXdyaXRpbmcgMCB0byBTU05YQ1IuIiwgX19mdW5jX18pOwotCi0JZGF0YS0+dHJhbnNmZXJfYWN0aXZlID0gZmFsc2U7Ci0JZGV2X2RiZygmZGF0YS0+bWFzdGVyLT5kZXYsCi0JCSIlcyBzZXQgZGF0YS0+dHJhbnNmZXJfYWN0aXZlID0gZmFsc2VcbiIsIF9fZnVuY19fKTsKLQotCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCi0JcGNoX3NwaV93cml0ZXJlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TUFNSLAotCQkJIHBjaF9zcGlfcmVhZHJlZyhkYXRhLT5tYXN0ZXIsIFBDSF9TUFNSKSk7Ci0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JcGNoX3NwaV9zZXRjbHJfcmVnKGRhdGEtPm1hc3RlciwgUENIX1NQQ1IsIDAsIFBDSF9BTEwpOwotfQotCi1zdGF0aWMgdm9pZCBwY2hfc3BpX2NvcHlfcnhfZGF0YShzdHJ1Y3QgcGNoX3NwaV9kYXRhICpkYXRhLCBpbnQgYnB3KQotewotCWludCBqOwotCXU4ICpyeF9idWY7Ci0JdTE2ICpyeF9zYnVmOwotCi0JLyogY29weSBSeCBEYXRhICovCi0JaWYgKCFkYXRhLT5jdXJfdHJhbnMtPnJ4X2J1ZikKLQkJcmV0dXJuOwotCi0JaWYgKGJwdyA9PSA4KSB7Ci0JCXJ4X2J1ZiA9IGRhdGEtPmN1cl90cmFucy0+cnhfYnVmOwotCQlmb3IgKGogPSAwOyBqIDwgZGF0YS0+YnB3X2xlbjsgaisrKQotCQkJKnJ4X2J1ZisrID0gZGF0YS0+cGt0X3J4X2J1ZmZbal0gJiAweEZGOwotCX0gZWxzZSB7Ci0JCXJ4X3NidWYgPSBkYXRhLT5jdXJfdHJhbnMtPnJ4X2J1ZjsKLQkJZm9yIChqID0gMDsgaiA8IGRhdGEtPmJwd19sZW47IGorKykKLQkJCSpyeF9zYnVmKysgPSBkYXRhLT5wa3RfcnhfYnVmZltqXTsKLQl9Ci19Ci0KLQotc3RhdGljIHZvaWQgcGNoX3NwaV9wcm9jZXNzX21lc3NhZ2VzKHN0cnVjdCB3b3JrX3N0cnVjdCAqcHdvcmspCi17Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICpwbXNnOwotCXN0cnVjdCBwY2hfc3BpX2RhdGEgKmRhdGE7Ci0JaW50IGJwdzsKLQotCWRhdGEgPSBjb250YWluZXJfb2YocHdvcmssIHN0cnVjdCBwY2hfc3BpX2RhdGEsIHdvcmspOwotCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LCAiJXMgZGF0YSBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOwotCi0Jc3Bpbl9sb2NrKCZkYXRhLT5sb2NrKTsKLQotCS8qIGNoZWNrIGlmIHN1c3BlbmQgaGFzIGJlZW4gaW5pdGlhdGVkO2lmIHllcyBmbHVzaCBxdWV1ZSAqLwotCWlmIChkYXRhLT5ib2FyZF9kYXQtPnN1c3BlbmRfc3RzIHx8IChkYXRhLT5zdGF0dXMgPT0gU1RBVFVTX0VYSVRJTkcpKSB7Ci0JCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LAotCQkJIiVzIHN1c3BlbmQvcmVtb3ZlIGluaXRpYXRlZCxmbHVzaGluZyBxdWV1ZVxuIiwKLQkJCV9fZnVuY19fKTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBtc2csIGRhdGEtPnF1ZXVlLm5leHQsIHF1ZXVlKSB7Ci0JCQlwbXNnLT5zdGF0dXMgPSAtRUlPOwotCi0JCQlpZiAocG1zZy0+Y29tcGxldGUgIT0gMCkgewotCQkJCXNwaW5fdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQkJCQlwbXNnLT5jb21wbGV0ZShwbXNnLT5jb250ZXh0KTsKLQkJCQlzcGluX2xvY2soJmRhdGEtPmxvY2spOwotCQkJfQotCi0JCQkvKiBkZWxldGUgZnJvbSBxdWV1ZSAqLwotCQkJbGlzdF9kZWxfaW5pdCgmcG1zZy0+cXVldWUpOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2soJmRhdGEtPmxvY2spOwotCQlyZXR1cm47Ci0JfQotCi0JZGF0YS0+YmN1cnJlbnRfbXNnX3Byb2Nlc3NpbmcgPSB0cnVlOwotCWRldl9kYmcoJmRhdGEtPm1hc3Rlci0+ZGV2LAotCQkiJXMgU2V0IGRhdGEtPmJjdXJyZW50X21zZ19wcm9jZXNzaW5nPSB0cnVlXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBHZXQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgcXVldWUgYW5kIGRlbGV0ZSBpdCBmcm9tIHRoZXJlLiAqLwotCWRhdGEtPmN1cnJlbnRfbXNnID0gbGlzdF9lbnRyeShkYXRhLT5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsCi0JCQkJCXF1ZXVlKTsKLQotCWxpc3RfZGVsX2luaXQoJmRhdGEtPmN1cnJlbnRfbXNnLT5xdWV1ZSk7Ci0KLQlkYXRhLT5jdXJyZW50X21zZy0+c3RhdHVzID0gMDsKLQotCXBjaF9zcGlfc2VsZWN0X2NoaXAoZGF0YSwgZGF0YS0+Y3VycmVudF9tc2ctPnNwaSk7Ci0KLQlzcGluX3VubG9jaygmZGF0YS0+bG9jayk7Ci0KLQlkbyB7Ci0JCS8qIElmIHdlIGFyZSBhbHJlYWR5IHByb2Nlc3NpbmcgYSBtZXNzYWdlIGdldCB0aGUgbmV4dAotCQl0cmFuc2ZlciBzdHJ1Y3R1cmUgZnJvbSB0aGUgbWVzc2FnZSBvdGhlcndpc2UgcmV0cmlldmUKLQkJdGhlIDFzdCB0cmFuc2ZlciByZXF1ZXN0IGZyb20gdGhlIG1lc3NhZ2UuICovCi0JCXNwaW5fbG9jaygmZGF0YS0+bG9jayk7Ci0KLQkJaWYgKGRhdGEtPmN1cl90cmFucyA9PSBOVUxMKSB7Ci0JCQlkYXRhLT5jdXJfdHJhbnMgPQotCQkJICAgIGxpc3RfZW50cnkoZGF0YS0+Y3VycmVudF9tc2ctPnRyYW5zZmVycy4KLQkJCQkgICAgICAgbmV4dCwgc3RydWN0IHNwaV90cmFuc2ZlciwKLQkJCQkgICAgICAgdHJhbnNmZXJfbGlzdCk7Ci0JCQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwKLQkJCQkiJXMgOkdldHRpbmcgMXN0IHRyYW5zZmVyIG1lc3NhZ2VcbiIsIF9fZnVuY19fKTsKLQkJfSBlbHNlIHsKLQkJCWRhdGEtPmN1cl90cmFucyA9Ci0JCQkgICAgbGlzdF9lbnRyeShkYXRhLT5jdXJfdHJhbnMtPnRyYW5zZmVyX2xpc3QubmV4dCwKLQkJCQkgICAgICAgc3RydWN0IHNwaV90cmFuc2ZlciwKLQkJCQkgICAgICAgdHJhbnNmZXJfbGlzdCk7Ci0JCQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwKLQkJCQkiJXMgOkdldHRpbmcgbmV4dCB0cmFuc2ZlciBtZXNzYWdlXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJfQotCi0JCXNwaW5fdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQotCQlwY2hfc3BpX3NldF90eChkYXRhLCAmYnB3LCAmcG1zZyk7Ci0KLQkJLyogQ29udHJvbCBpbnRlcnJ1cHQqLwotCQlwY2hfc3BpX3NldF9pcihkYXRhKTsKLQotCQkvKiBEaXNhYmxlIFNQSSB0cmFuc2ZlciAqLwotCQlwY2hfc3BpX3NldGNscl9yZWcoZGF0YS0+Y3VycmVudF9jaGlwLT5tYXN0ZXIsIFBDSF9TUENSLCAwLAotCQkJCSAgIFNQQ1JfU1BFX0JJVCk7Ci0KLQkJLyogY2xlYXIgRklGTyAqLwotCQlwY2hfc3BpX2NsZWFyX2ZpZm8oZGF0YS0+bWFzdGVyKTsKLQotCQkvKiBjb3B5IFJ4IERhdGEgKi8KLQkJcGNoX3NwaV9jb3B5X3J4X2RhdGEoZGF0YSwgYnB3KTsKLQotCQkvKiBmcmVlIG1lbW9yeSAqLwotCQlrZnJlZShkYXRhLT5wa3RfcnhfYnVmZik7Ci0JCWRhdGEtPnBrdF9yeF9idWZmID0gTlVMTDsKLQotCQlrZnJlZShkYXRhLT5wa3RfdHhfYnVmZik7Ci0JCWRhdGEtPnBrdF90eF9idWZmID0gTlVMTDsKLQotCQkvKiBpbmNyZW1lbnQgbWVzc2FnZSBjb3VudCAqLwotCQlkYXRhLT5jdXJyZW50X21zZy0+YWN0dWFsX2xlbmd0aCArPSBkYXRhLT5jdXJfdHJhbnMtPmxlbjsKLQotCQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwKLQkJCSIlczpkYXRhLT5jdXJyZW50X21zZy0+YWN0dWFsX2xlbmd0aD0lZFxuIiwKLQkJCV9fZnVuY19fLCBkYXRhLT5jdXJyZW50X21zZy0+YWN0dWFsX2xlbmd0aCk7Ci0KLQkJLyogY2hlY2sgZm9yIGRlbGF5ICovCi0JCWlmIChkYXRhLT5jdXJfdHJhbnMtPmRlbGF5X3VzZWNzKSB7Ci0JCQlkZXZfZGJnKCZkYXRhLT5tYXN0ZXItPmRldiwgIiVzOiIKLQkJCQkiZGVsYXkgaW4gdXNlYz0lZFxuIiwgX19mdW5jX18sCi0JCQkJZGF0YS0+Y3VyX3RyYW5zLT5kZWxheV91c2Vjcyk7Ci0JCQl1ZGVsYXkoZGF0YS0+Y3VyX3RyYW5zLT5kZWxheV91c2Vjcyk7Ci0JCX0KLQotCQlzcGluX2xvY2soJmRhdGEtPmxvY2spOwotCi0JCS8qIE5vIG1vcmUgdHJhbnNmZXIgaW4gdGhpcyBtZXNzYWdlLiAqLwotCQlpZiAoKGRhdGEtPmN1cl90cmFucy0+dHJhbnNmZXJfbGlzdC5uZXh0KSA9PQotCQkgICAgJihkYXRhLT5jdXJyZW50X21zZy0+dHJhbnNmZXJzKSkgewotCQkJcGNoX3NwaV9ub21vcmVfdHJhbnNmZXIoZGF0YSwgcG1zZyk7Ci0JCX0KLQotCQlzcGluX3VubG9jaygmZGF0YS0+bG9jayk7Ci0KLQl9IHdoaWxlIChkYXRhLT5jdXJfdHJhbnMgIT0gTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjaF9zcGlfZnJlZV9yZXNvdXJjZXMoc3RydWN0IHBjaF9zcGlfYm9hcmRfZGF0YSAqYm9hcmRfZGF0KQotewotCWRldl9kYmcoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LCAiJXMgRU5UUllcbiIsIF9fZnVuY19fKTsKLQotCS8qIGZyZWUgd29ya3F1ZXVlICovCi0JaWYgKGJvYXJkX2RhdC0+ZGF0YS0+d2sgIT0gTlVMTCkgewotCQlkZXN0cm95X3dvcmtxdWV1ZShib2FyZF9kYXQtPmRhdGEtPndrKTsKLQkJYm9hcmRfZGF0LT5kYXRhLT53ayA9IE5VTEw7Ci0JCWRldl9kYmcoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LAotCQkJIiVzIGRlc3Ryb3lfd29ya3F1ZXVlIGludm9rZWQgc3VjY2Vzc2Z1bGx5XG4iLAotCQkJX19mdW5jX18pOwotCX0KLQotCS8qIGRpc2FibGUgaW50ZXJydXB0cyAmIGZyZWUgSVJRICovCi0JaWYgKGJvYXJkX2RhdC0+aXJxX3JlZ19zdHMpIHsKLQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JCXBjaF9zcGlfc2V0Y2xyX3JlZyhib2FyZF9kYXQtPmRhdGEtPm1hc3RlciwgUENIX1NQQ1IsIDAsCi0JCQkJICAgUENIX0FMTCk7Ci0KLQkJLyogZnJlZSBJUlEgKi8KLQkJZnJlZV9pcnEoYm9hcmRfZGF0LT5wZGV2LT5pcnEsIGJvYXJkX2RhdCk7Ci0KLQkJZGV2X2RiZygmYm9hcmRfZGF0LT5wZGV2LT5kZXYsCi0JCQkiJXMgZnJlZV9pcnEgaW52b2tlZCBzdWNjZXNzZnVsbHlcbiIsIF9fZnVuY19fKTsKLQotCQlib2FyZF9kYXQtPmlycV9yZWdfc3RzID0gZmFsc2U7Ci0JfQotCi0JLyogdW5tYXAgUENJIGJhc2UgYWRkcmVzcyAqLwotCWlmIChib2FyZF9kYXQtPmRhdGEtPmlvX3JlbWFwX2FkZHIgIT0gMCkgewotCQlwY2lfaW91bm1hcChib2FyZF9kYXQtPnBkZXYsIGJvYXJkX2RhdC0+ZGF0YS0+aW9fcmVtYXBfYWRkcik7Ci0KLQkJYm9hcmRfZGF0LT5kYXRhLT5pb19yZW1hcF9hZGRyID0gMDsKLQotCQlkZXZfZGJnKCZib2FyZF9kYXQtPnBkZXYtPmRldiwKLQkJCSIlcyBwY2lfaW91bm1hcCBpbnZva2VkIHN1Y2Nlc3NmdWxseVxuIiwgX19mdW5jX18pOwotCX0KLQotCS8qIHJlbGVhc2UgUENJIHJlZ2lvbiAqLwotCWlmIChib2FyZF9kYXQtPnBjaV9yZXFfc3RzKSB7Ci0JCXBjaV9yZWxlYXNlX3JlZ2lvbnMoYm9hcmRfZGF0LT5wZGV2KTsKLQkJZGV2X2RiZygmYm9hcmRfZGF0LT5wZGV2LT5kZXYsCi0JCQkiJXMgcGNpX3JlbGVhc2VfcmVnaW9ucyBpbnZva2VkIHN1Y2Nlc3NmdWxseVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJYm9hcmRfZGF0LT5wY2lfcmVxX3N0cyA9IGZhbHNlOwotCX0KLX0KLQotc3RhdGljIGludCBwY2hfc3BpX2dldF9yZXNvdXJjZXMoc3RydWN0IHBjaF9zcGlfYm9hcmRfZGF0YSAqYm9hcmRfZGF0KQotewotCXZvaWQgX19pb21lbSAqaW9fcmVtYXBfYWRkcjsKLQlpbnQgcmV0dmFsOwotCWRldl9kYmcoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LCAiJXMgRU5UUllcbiIsIF9fZnVuY19fKTsKLQotCS8qIGNyZWF0ZSB3b3JrcXVldWUgKi8KLQlib2FyZF9kYXQtPmRhdGEtPndrID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoS0JVSUxEX01PRE5BTUUpOwotCWlmICghYm9hcmRfZGF0LT5kYXRhLT53aykgewotCQlkZXZfZXJyKCZib2FyZF9kYXQtPnBkZXYtPmRldiwKLQkJCSIlcyBjcmVhdGVfc2luZ2xldCBocmVhZF93b3JrcXVldWUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHZhbCA9IC1FQlVTWTsKLQkJZ290byBlcnJfcmV0dXJuOwotCX0KLQotCWRldl9kYmcoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LAotCQkiJXMgY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUgc3VjY2Vzc1xuIiwgX19mdW5jX18pOwotCi0JcmV0dmFsID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhib2FyZF9kYXQtPnBkZXYsIEtCVUlMRF9NT0ROQU1FKTsKLQlpZiAocmV0dmFsICE9IDApIHsKLQkJZGV2X2VycigmYm9hcmRfZGF0LT5wZGV2LT5kZXYsCi0JCQkiJXMgcmVxdWVzdF9yZWdpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX3JldHVybjsKLQl9Ci0KLQlib2FyZF9kYXQtPnBjaV9yZXFfc3RzID0gdHJ1ZTsKLQotCWlvX3JlbWFwX2FkZHIgPSBwY2lfaW9tYXAoYm9hcmRfZGF0LT5wZGV2LCAxLCAwKTsKLQlpZiAoaW9fcmVtYXBfYWRkciA9PSAwKSB7Ci0JCWRldl9lcnIoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LAotCQkJIiVzIHBjaV9pb21hcCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBlcnJfcmV0dXJuOwotCX0KLQotCS8qIGNhbGN1bGF0ZSBiYXNlIGFkZHJlc3MgZm9yIGFsbCBjaGFubmVscyAqLwotCWJvYXJkX2RhdC0+ZGF0YS0+aW9fcmVtYXBfYWRkciA9IGlvX3JlbWFwX2FkZHI7Ci0KLQkvKiByZXNldCBQQ0ggU1BJIGgvdyAqLwotCXBjaF9zcGlfcmVzZXQoYm9hcmRfZGF0LT5kYXRhLT5tYXN0ZXIpOwotCWRldl9kYmcoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LAotCQkiJXMgcGNoX3NwaV9yZXNldCBpbnZva2VkIHN1Y2Nlc3NmdWxseVxuIiwgX19mdW5jX18pOwotCi0JLyogcmVnaXN0ZXIgSVJRICovCi0JcmV0dmFsID0gcmVxdWVzdF9pcnEoYm9hcmRfZGF0LT5wZGV2LT5pcnEsIHBjaF9zcGlfaGFuZGxlciwKLQkJCSAgICAgSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBib2FyZF9kYXQpOwotCWlmIChyZXR2YWwgIT0gMCkgewotCQlkZXZfZXJyKCZib2FyZF9kYXQtPnBkZXYtPmRldiwKLQkJCSIlcyByZXF1ZXN0X2lycSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnJfcmV0dXJuOwotCX0KLQotCWRldl9kYmcoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LCAiJXMgcmVxdWVzdF9pcnEgcmV0dXJuZWQ9JWRcbiIsCi0JCV9fZnVuY19fLCByZXR2YWwpOwotCi0JYm9hcmRfZGF0LT5pcnFfcmVnX3N0cyA9IHRydWU7Ci0JZGV2X2RiZygmYm9hcmRfZGF0LT5wZGV2LT5kZXYsICIlcyBkYXRhLT5pcnFfcmVnX3N0cz10cnVlXG4iLCBfX2Z1bmNfXyk7Ci0KLWVycl9yZXR1cm46Ci0JaWYgKHJldHZhbCAhPSAwKSB7Ci0JCWRldl9lcnIoJmJvYXJkX2RhdC0+cGRldi0+ZGV2LAotCQkJIiVzIEZBSUw6aW52b2tpbmcgcGNoX3NwaV9mcmVlX3Jlc291cmNlc1xuIiwgX19mdW5jX18pOwotCQlwY2hfc3BpX2ZyZWVfcmVzb3VyY2VzKGJvYXJkX2RhdCk7Ci0JfQotCi0JZGV2X2RiZygmYm9hcmRfZGF0LT5wZGV2LT5kZXYsICIlcyBSZXR1cm49JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGludCBwY2hfc3BpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCi17Ci0KLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCi0Jc3RydWN0IHBjaF9zcGlfYm9hcmRfZGF0YSAqYm9hcmRfZGF0OwotCWludCByZXR2YWw7Ci0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcyBFTlRSWVxuIiwgX19mdW5jX18pOwotCi0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciBwcml2YXRlIGRhdGEgKi8KLQlib2FyZF9kYXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNoX3NwaV9ib2FyZF9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJvYXJkX2RhdCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSIgJXMgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHByaXZhdGUgZGF0YSBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2ttYWxsb2M7Ci0JfQotCi0JZGV2X2RiZygmcGRldi0+ZGV2LAotCQkiJXMgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHByaXZhdGUgZGF0YSBzdWNjZXNzXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBlbmFibGUgUENJIGRldmljZSAqLwotCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyZXR2YWwgIT0gMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBwY2lfZW5hYmxlX2RldmljZSBGQUlMRURcbiIsIF9fZnVuY19fKTsKLQotCQlnb3RvIGVycl9wY2lfZW5fZGV2aWNlOwotCX0KLQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIHBjaV9lbmFibGVfZGV2aWNlIHJldHVybmVkPSVkXG4iLAotCQlfX2Z1bmNfXywgcmV0dmFsKTsKLQotCWJvYXJkX2RhdC0+cGRldiA9IHBkZXY7Ci0KLQkvKiBhbGxsb2NhdGUgbWVtb3J5IGZvciBTUEkgbWFzdGVyICovCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHBjaF9zcGlfZGF0YSkpOwotCWlmIChtYXN0ZXIgPT0gTlVMTCkgewotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBGYWlsLlxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycl9zcGlfYWxsb2NfbWFzdGVyOwotCX0KLQotCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJIiVzIHNwaV9hbGxvY19tYXN0ZXIgcmV0dXJuZWQgbm9uIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCS8qIGluaXRpYWxpemUgbWVtYmVycyBvZiBTUEkgbWFzdGVyICovCi0JbWFzdGVyLT5idXNfbnVtID0gLTE7Ci0JbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IFBDSF9NQVhfQ1M7Ci0JbWFzdGVyLT5zZXR1cCA9IHBjaF9zcGlfc2V0dXA7Ci0JbWFzdGVyLT50cmFuc2ZlciA9IHBjaF9zcGlfdHJhbnNmZXI7Ci0JZGV2X2RiZygmcGRldi0+ZGV2LAotCQkiJXMgdHJhbnNmZXIgbWVtYmVyIG9mIFNQSSBtYXN0ZXIgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKLQotCWJvYXJkX2RhdC0+ZGF0YSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQotCWJvYXJkX2RhdC0+ZGF0YS0+bWFzdGVyID0gbWFzdGVyOwotCWJvYXJkX2RhdC0+ZGF0YS0+bl9jdXJudF9jaGlwID0gMjU1OwotCWJvYXJkX2RhdC0+ZGF0YS0+Ym9hcmRfZGF0ID0gYm9hcmRfZGF0OwotCWJvYXJkX2RhdC0+ZGF0YS0+c3RhdHVzID0gU1RBVFVTX1JVTk5JTkc7Ci0KLQlJTklUX0xJU1RfSEVBRCgmYm9hcmRfZGF0LT5kYXRhLT5xdWV1ZSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJvYXJkX2RhdC0+ZGF0YS0+bG9jayk7Ci0JSU5JVF9XT1JLKCZib2FyZF9kYXQtPmRhdGEtPndvcmssIHBjaF9zcGlfcHJvY2Vzc19tZXNzYWdlcyk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYm9hcmRfZGF0LT5kYXRhLT53YWl0KTsKLQotCS8qIGFsbG9jYXRlIHJlc291cmNlcyBmb3IgUENIIFNQSSAqLwotCXJldHZhbCA9IHBjaF9zcGlfZ2V0X3Jlc291cmNlcyhib2FyZF9kYXQpOwotCWlmIChyZXR2YWwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgZmFpbChyZXR2YWw9JWQpXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKLQkJZ290byBlcnJfc3BpX2dldF9yZXNvdXJjZXM7Ci0JfQotCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgcGNoX3NwaV9nZXRfcmVzb3VyY2VzIHJldHVybmVkPSVkXG4iLAotCQlfX2Z1bmNfXywgcmV0dmFsKTsKLQotCS8qIHNhdmUgcHJpdmF0ZSBkYXRhIGluIGRldiAqLwotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBib2FyZF9kYXQpOwotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIGludm9rZWQgcGNpX3NldF9kcnZkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBzZXQgbWFzdGVyIG1vZGUgKi8KLQlwY2hfc3BpX3NldF9tYXN0ZXJfbW9kZShtYXN0ZXIpOwotCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJIiVzIGludm9rZWQgcGNoX3NwaV9zZXRfbWFzdGVyX21vZGVcbiIsIF9fZnVuY19fKTsKLQotCS8qIFJlZ2lzdGVyIHRoZSBjb250cm9sbGVyIHdpdGggdGhlIFNQSSBjb3JlLiAqLwotCXJldHZhbCA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKLQlpZiAocmV0dmFsICE9IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIiVzIHNwaV9yZWdpc3Rlcl9tYXN0ZXIgRkFJTEVEXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX3NwaV9yZWdfbWFzdGVyOwotCX0KLQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIHNwaV9yZWdpc3Rlcl9tYXN0ZXIgcmV0dXJuZWQ9JWRcbiIsCi0JCV9fZnVuY19fLCByZXR2YWwpOwotCi0KLQlyZXR1cm4gMDsKLQotZXJyX3NwaV9yZWdfbWFzdGVyOgotCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotZXJyX3NwaV9nZXRfcmVzb3VyY2VzOgotZXJyX3NwaV9hbGxvY19tYXN0ZXI6Ci0Jc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci1lcnJfcGNpX2VuX2RldmljZToKLQlrZnJlZShib2FyZF9kYXQpOwotZXJyX2ttYWxsb2M6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHZvaWQgcGNoX3NwaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IHBjaF9zcGlfYm9hcmRfZGF0YSAqYm9hcmRfZGF0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBjb3VudDsKLQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIEVOVFJZXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWJvYXJkX2RhdCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXMgcGNpX2dldF9kcnZkYXRhIHJldHVybmVkIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGNoZWNrIGZvciBhbnkgcGVuZGluZyBtZXNzYWdlczsgbm8gYWN0aW9uIGlzIHRha2VuIGlmIHRoZSBxdWV1ZQotCSAqIGlzIHN0aWxsIGZ1bGw7IGJ1dCBhdCBsZWFzdCB3ZSB0cmllZC4gIFVubG9hZCBhbnl3YXkgKi8KLQljb3VudCA9IDUwMDsKLQlzcGluX2xvY2soJmJvYXJkX2RhdC0+ZGF0YS0+bG9jayk7Ci0JYm9hcmRfZGF0LT5kYXRhLT5zdGF0dXMgPSBTVEFUVVNfRVhJVElORzsKLQl3aGlsZSAoKGxpc3RfZW1wdHkoJmJvYXJkX2RhdC0+ZGF0YS0+cXVldWUpID09IDApICYmIC0tY291bnQpIHsKLQkJZGV2X2RiZygmYm9hcmRfZGF0LT5wZGV2LT5kZXYsICIlcyA6cXVldWUgbm90IGVtcHR5XG4iLAotCQkJX19mdW5jX18pOwotCQlzcGluX3VubG9jaygmYm9hcmRfZGF0LT5kYXRhLT5sb2NrKTsKLQkJbXNsZWVwKFBDSF9TTEVFUF9USU1FKTsKLQkJc3Bpbl9sb2NrKCZib2FyZF9kYXQtPmRhdGEtPmxvY2spOwotCX0KLQlzcGluX3VubG9jaygmYm9hcmRfZGF0LT5kYXRhLT5sb2NrKTsKLQotCS8qIEZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgUENIIFNQSSAqLwotCXBjaF9zcGlfZnJlZV9yZXNvdXJjZXMoYm9hcmRfZGF0KTsKLQotCXNwaV91bnJlZ2lzdGVyX21hc3Rlcihib2FyZF9kYXQtPmRhdGEtPm1hc3Rlcik7Ci0KLQkvKiBmcmVlIG1lbW9yeSBmb3IgcHJpdmF0ZSBkYXRhICovCi0Ja2ZyZWUoYm9hcmRfZGF0KTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQotCS8qIGRpc2FibGUgUENJIGRldmljZSAqLwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIGludm9rZWQgcGNpX2Rpc2FibGVfZGV2aWNlXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgcGNoX3NwaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0JdTggY291bnQ7Ci0JaW50IHJldHZhbDsKLQotCXN0cnVjdCBwY2hfc3BpX2JvYXJkX2RhdGEgKmJvYXJkX2RhdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIEVOVFJZXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWJvYXJkX2RhdCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXMgcGNpX2dldF9kcnZkYXRhIHJldHVybmVkIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dmFsID0gMDsKLQlib2FyZF9kYXQtPnN1c3BlbmRfc3RzID0gdHJ1ZTsKLQotCS8qIGNoZWNrIGlmIHRoZSBjdXJyZW50IG1lc3NhZ2UgaXMgcHJvY2Vzc2VkOgotCSAgIE9ubHkgYWZ0ZXIgdGhhdHMgZG9uZSB0aGUgdHJhbnNmZXIgd2lsbCBiZSBzdXNwZW5kZWQgKi8KLQljb3VudCA9IDI1NTsKLQl3aGlsZSAoKC0tY291bnQpID4gMCkgewotCQlpZiAoIShib2FyZF9kYXQtPmRhdGEtPmJjdXJyZW50X21zZ19wcm9jZXNzaW5nKSkgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgYm9hcmRfZGF0LT5kYXRhLT5iQ3VycmVudF8iCi0JCQkJIm1zZ19wcm9jZXNzaW5nID0gZmFsc2VcbiIsIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgYm9hcmRfZGF0LT5kYXRhLT5iQ3VycmVudF9tc2dfIgotCQkJCSJwcm9jZXNzaW5nID0gdHJ1ZVxuIiwgX19mdW5jX18pOwotCQl9Ci0JCW1zbGVlcChQQ0hfU0xFRVBfVElNRSk7Ci0JfQotCi0JLyogRnJlZSBJUlEgKi8KLQlpZiAoYm9hcmRfZGF0LT5pcnFfcmVnX3N0cykgewotCQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCi0JCXBjaF9zcGlfc2V0Y2xyX3JlZyhib2FyZF9kYXQtPmRhdGEtPm1hc3RlciwgUENIX1NQQ1IsIDAsCi0JCQkJICAgUENIX0FMTCk7Ci0JCXBjaF9zcGlfcmVzZXQoYm9hcmRfZGF0LT5kYXRhLT5tYXN0ZXIpOwotCi0JCWZyZWVfaXJxKGJvYXJkX2RhdC0+cGRldi0+aXJxLCBib2FyZF9kYXQpOwotCi0JCWJvYXJkX2RhdC0+aXJxX3JlZ19zdHMgPSBmYWxzZTsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LAotCQkJIiVzIGZyZWVfaXJxIGludm9rZWQgc3VjY2Vzc2Z1bGx5LlxuIiwgX19mdW5jX18pOwotCX0KLQotCS8qIHNhdmUgY29uZmlnIHNwYWNlICovCi0JcmV0dmFsID0gcGNpX3NhdmVfc3RhdGUocGRldik7Ci0KLQlpZiAocmV0dmFsID09IDApIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgcGNpX3NhdmVfc3RhdGUgcmV0dXJuZWQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0dmFsKTsKLQkJLyogZGlzYWJsZSBQTSBub3RpZmljYXRpb25zICovCi0JCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOwotCQlkZXZfZGJnKCZwZGV2LT5kZXYsCi0JCQkiJXMgcGNpX2VuYWJsZV93YWtlIGludm9rZWQgc3VjY2Vzc2Z1bGx5XG4iLCBfX2Z1bmNfXyk7Ci0JCS8qIGRpc2FibGUgUENJIGRldmljZSAqLwotCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJCSIlcyBwY2lfZGlzYWJsZV9kZXZpY2UgaW52b2tlZCBzdWNjZXNzZnVsbHlcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCS8qIG1vdmUgZGV2aWNlIHRvIEQzaG90ICBzdGF0ZSAqLwotCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJCSIlcyBwY2lfc2V0X3Bvd2VyX3N0YXRlIGludm9rZWQgc3VjY2Vzc2Z1bGx5XG4iLAotCQkJX19mdW5jX18pOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIHBjaV9zYXZlX3N0YXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCX0KLQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIHJldHVybj0lZFxuIiwgX19mdW5jX18sIHJldHZhbCk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IHBjaF9zcGlfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCWludCByZXR2YWw7Ci0KLQlzdHJ1Y3QgcGNoX3NwaV9ib2FyZF9kYXRhICpib2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcyBFTlRSWVxuIiwgX19mdW5jX18pOwotCi0JaWYgKCFib2FyZCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXMgcGNpX2dldF9kcnZkYXRhIHJldHVybmVkIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JLyogbW92ZSBkZXZpY2UgdG8gRE8gcG93ZXIgc3RhdGUgKi8KLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7Ci0KLQkvKiByZXN0b3JlIHN0YXRlICovCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7Ci0KLQlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAocmV0dmFsIDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXMgcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJLyogZGlzYWJsZSBQTSBub3RpZmljYXRpb25zICovCi0JCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOwotCi0JCS8qIHJlZ2lzdGVyIElSUSBoYW5kbGVyICovCi0JCWlmICghYm9hcmQtPmlycV9yZWdfc3RzKSB7Ci0JCQkvKiByZWdpc3RlciBJUlEgKi8KLQkJCXJldHZhbCA9IHJlcXVlc3RfaXJxKGJvYXJkLT5wZGV2LT5pcnEsIHBjaF9zcGlfaGFuZGxlciwKLQkJCQkJICAgICBJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsCi0JCQkJCSAgICAgYm9hcmQpOwotCQkJaWYgKHJldHZhbCA8IDApIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJCSIlcyByZXF1ZXN0X2lycSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCQlyZXR1cm4gcmV0dmFsOwotCQkJfQotCQkJYm9hcmQtPmlycV9yZWdfc3RzID0gdHJ1ZTsKLQotCQkJLyogcmVzZXQgUENIIFNQSSBoL3cgKi8KLQkJCXBjaF9zcGlfcmVzZXQoYm9hcmQtPmRhdGEtPm1hc3Rlcik7Ci0JCQlwY2hfc3BpX3NldF9tYXN0ZXJfbW9kZShib2FyZC0+ZGF0YS0+bWFzdGVyKTsKLQotCQkJLyogc2V0IHN1c3BlbmQgc3RhdHVzIHRvIGZhbHNlICovCi0JCQlib2FyZC0+c3VzcGVuZF9zdHMgPSBmYWxzZTsKLQotCQl9Ci0JfQotCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgcmV0dXJuaW5nPSVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0jZWxzZQotI2RlZmluZSBwY2hfc3BpX3N1c3BlbmQgTlVMTAotI2RlZmluZSBwY2hfc3BpX3Jlc3VtZSBOVUxMCi0KLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGNoX3NwaV9wY2lkZXYgPSB7Ci0JLm5hbWUgPSAicGNoX3NwaSIsCi0JLmlkX3RhYmxlID0gcGNoX3NwaV9wY2lkZXZfaWQsCi0JLnByb2JlID0gcGNoX3NwaV9wcm9iZSwKLQkucmVtb3ZlID0gcGNoX3NwaV9yZW1vdmUsCi0JLnN1c3BlbmQgPSBwY2hfc3BpX3N1c3BlbmQsCi0JLnJlc3VtZSA9IHBjaF9zcGlfcmVzdW1lLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcGNoX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBjaF9zcGlfcGNpZGV2KTsKLX0KLW1vZHVsZV9pbml0KHBjaF9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwY2hfc3BpX2V4aXQodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBjaF9zcGlfcGNpZGV2KTsKLX0KLW1vZHVsZV9leGl0KHBjaF9zcGlfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiVG9wY2xpZmYgUENIIFNQSSBQQ0kgRHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfdHh4OS5jIGIvZHJpdmVycy9zcGkvc3BpX3R4eDkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZhMDI0Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfdHh4OS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLS8qCi0gKiBzcGlfdHh4OS5jIC0gVFh4OSBTUEkgY29udHJvbGxlciBkcml2ZXIuCi0gKgotICogQmFzZWQgb24gbGludXgvYXJjaC9taXBzL3R4NDkzOC90b3NoaWJhX3JidHg0OTM4L3NwaV90eHg5LmMKLSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFRvc2hpYmEgQ29ycG9yYXRpb24KLSAqCi0gKiAyMDAzLTIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzCi0gKiBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKgotICogU3VwcG9ydCBmb3IgVFg0OTM4IGluIDIuNiAtIE1hbmlzaCBMYWNod2FuaSAobWxhY2h3YW5pQG12aXN0YS5jb20pCi0gKgotICogQ29udmVydCB0byBnZW5lcmljIFNQSSBmcmFtZXdvcmsgLSBBdHN1c2hpIE5lbW90byAoYW5lbW9AbWJhLm9jbi5uZS5qcCkKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+Ci0KLQotI2RlZmluZSBTUElfRklGT19TSVpFIDQKLSNkZWZpbmUgU1BJX01BWF9ESVZJREVSIDB4ZmYJLyogTWF4LiB2YWx1ZSBmb3IgU1BDUjEuU0VSICovCi0jZGVmaW5lIFNQSV9NSU5fRElWSURFUiAxCS8qIE1pbi4gdmFsdWUgZm9yIFNQQ1IxLlNFUiAqLwotCi0jZGVmaW5lIFRYeDlfU1BNQ1IJCTB4MDAKLSNkZWZpbmUgVFh4OV9TUENSMAkJMHgwNAotI2RlZmluZSBUWHg5X1NQQ1IxCQkweDA4Ci0jZGVmaW5lIFRYeDlfU1BGUwkJMHgwYwotI2RlZmluZSBUWHg5X1NQU1IJCTB4MTQKLSNkZWZpbmUgVFh4OV9TUERSCQkweDE4Ci0KLS8qIFNQTUNSIDogU1BJIE1hc3RlciBDb250cm9sICovCi0jZGVmaW5lIFRYeDlfU1BNQ1JfT1BNT0RFCTB4YzAKLSNkZWZpbmUgVFh4OV9TUE1DUl9DT05GSUcJMHg0MAotI2RlZmluZSBUWHg5X1NQTUNSX0FDVElWRQkweDgwCi0jZGVmaW5lIFRYeDlfU1BNQ1JfU1BTVFAJMHgwMgotI2RlZmluZSBUWHg5X1NQTUNSX0JDTFIJCTB4MDEKLQotLyogU1BDUjAgOiBTUEkgQ29udHJvbCAwICovCi0jZGVmaW5lIFRYeDlfU1BDUjBfVFhJRkxfTUFTSwkweGMwMDAKLSNkZWZpbmUgVFh4OV9TUENSMF9SWElGTF9NQVNLCTB4MzAwMAotI2RlZmluZSBUWHg5X1NQQ1IwX1NJRElFCTB4MDgwMAotI2RlZmluZSBUWHg5X1NQQ1IwX1NPRUlFCTB4MDQwMAotI2RlZmluZSBUWHg5X1NQQ1IwX1JCU0lFCTB4MDIwMAotI2RlZmluZSBUWHg5X1NQQ1IwX1RCU0lFCTB4MDEwMAotI2RlZmluZSBUWHg5X1NQQ1IwX0lGU1BTRQkweDAwMTAKLSNkZWZpbmUgVFh4OV9TUENSMF9TQk9TCQkweDAwMDQKLSNkZWZpbmUgVFh4OV9TUENSMF9TUEhBCQkweDAwMDIKLSNkZWZpbmUgVFh4OV9TUENSMF9TUE9MCQkweDAwMDEKLQotLyogU1BTUiA6IFNQSSBTdGF0dXMgKi8KLSNkZWZpbmUgVFh4OV9TUFNSX1RCU0kJCTB4ODAwMAotI2RlZmluZSBUWHg5X1NQU1JfUkJTSQkJMHg0MDAwCi0jZGVmaW5lIFRYeDlfU1BTUl9UQlNfTUFTSwkweDM4MDAKLSNkZWZpbmUgVFh4OV9TUFNSX1JCU19NQVNLCTB4MDcwMAotI2RlZmluZSBUWHg5X1NQU1JfU1BPRQkJMHgwMDgwCi0jZGVmaW5lIFRYeDlfU1BTUl9JRlNECQkweDAwMDgKLSNkZWZpbmUgVFh4OV9TUFNSX1NJRExFCQkweDAwMDQKLSNkZWZpbmUgVFh4OV9TUFNSX1NUUkRZCQkweDAwMDIKLSNkZWZpbmUgVFh4OV9TUFNSX1NSUkRZCQkweDAwMDEKLQotCi1zdHJ1Y3QgdHh4OXNwaSB7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKndvcmtxdWV1ZTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLQlzcGlubG9ja190IGxvY2s7CS8qIHByb3RlY3QgJ3F1ZXVlJyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7Ci0Jdm9pZCBfX2lvbWVtICptZW1iYXNlOwotCWludCBiYXNlY2xrOwotCXN0cnVjdCBjbGsgKmNsazsKLQl1MzIgbWF4X3NwZWVkX2h6LCBtaW5fc3BlZWRfaHo7Ci0JaW50IGxhc3RfY2hpcHNlbGVjdDsKLQlpbnQgbGFzdF9jaGlwc2VsZWN0X3ZhbDsKLX07Ci0KLXN0YXRpYyB1MzIgdHh4OXNwaV9yZChzdHJ1Y3QgdHh4OXNwaSAqYywgaW50IHJlZykKLXsKLQlyZXR1cm4gX19yYXdfcmVhZGwoYy0+bWVtYmFzZSArIHJlZyk7Ci19Ci1zdGF0aWMgdm9pZCB0eHg5c3BpX3dyKHN0cnVjdCB0eHg5c3BpICpjLCB1MzIgdmFsLCBpbnQgcmVnKQotewotCV9fcmF3X3dyaXRlbCh2YWwsIGMtPm1lbWJhc2UgKyByZWcpOwotfQotCi1zdGF0aWMgdm9pZCB0eHg5c3BpX2NzX2Z1bmMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHR4eDlzcGkgKmMsCi0JCWludCBvbiwgdW5zaWduZWQgaW50IGNzX2RlbGF5KQotewotCWludCB2YWwgPSAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpID8gb24gOiAhb247Ci0JaWYgKG9uKSB7Ci0JCS8qIGRlc2VsZWN0IHRoZSBjaGlwIHdpdGggY3NfY2hhbmdlIGhpbnQgaW4gbGFzdCB0cmFuc2ZlciAqLwotCQlpZiAoYy0+bGFzdF9jaGlwc2VsZWN0ID49IDApCi0JCQlncGlvX3NldF92YWx1ZShjLT5sYXN0X2NoaXBzZWxlY3QsCi0JCQkJCSFjLT5sYXN0X2NoaXBzZWxlY3RfdmFsKTsKLQkJYy0+bGFzdF9jaGlwc2VsZWN0ID0gc3BpLT5jaGlwX3NlbGVjdDsKLQkJYy0+bGFzdF9jaGlwc2VsZWN0X3ZhbCA9IHZhbDsKLQl9IGVsc2UgewotCQljLT5sYXN0X2NoaXBzZWxlY3QgPSAtMTsKLQkJbmRlbGF5KGNzX2RlbGF5KTsJLyogQ1MgSG9sZCBUaW1lICovCi0JfQotCWdwaW9fc2V0X3ZhbHVlKHNwaS0+Y2hpcF9zZWxlY3QsIHZhbCk7Ci0JbmRlbGF5KGNzX2RlbGF5KTsJLyogQ1MgU2V0dXAgVGltZSAvIENTIFJlY292ZXJ5IFRpbWUgKi8KLX0KLQotc3RhdGljIGludCB0eHg5c3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IHR4eDlzcGkgKmMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQl1OCBiaXRzX3Blcl93b3JkOwotCi0JaWYgKCFzcGktPm1heF9zcGVlZF9oegotCQkJfHwgc3BpLT5tYXhfc3BlZWRfaHogPiBjLT5tYXhfc3BlZWRfaHoKLQkJCXx8IHNwaS0+bWF4X3NwZWVkX2h6IDwgYy0+bWluX3NwZWVkX2h6KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaWYgKGJpdHNfcGVyX3dvcmQgIT0gOCAmJiBiaXRzX3Blcl93b3JkICE9IDE2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3BpLT5jaGlwX3NlbGVjdCwKLQkJCSEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKSkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIkNhbm5vdCBzZXR1cCBHUElPIGZvciBjaGlwc2VsZWN0LlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIGRlc2VsZWN0IGNoaXAgKi8KLQlzcGluX2xvY2soJmMtPmxvY2spOwotCXR4eDlzcGlfY3NfZnVuYyhzcGksIGMsIDAsIChOU0VDX1BFUl9TRUMgLyAyKSAvIHNwaS0+bWF4X3NwZWVkX2h6KTsKLQlzcGluX3VubG9jaygmYy0+bG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHR4eDlzcGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgdHh4OXNwaSAqYyA9IGRldl9pZDsKLQotCS8qIGRpc2FibGUgcnggaW50ciAqLwotCXR4eDlzcGlfd3IoYywgdHh4OXNwaV9yZChjLCBUWHg5X1NQQ1IwKSAmIH5UWHg5X1NQQ1IwX1JCU0lFLAotCQkJVFh4OV9TUENSMCk7Ci0Jd2FrZV91cCgmYy0+d2FpdHEpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgdHh4OXNwaV93b3JrX29uZShzdHJ1Y3QgdHh4OXNwaSAqYywgc3RydWN0IHNwaV9tZXNzYWdlICptKQotewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBtLT5zcGk7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQl1bnNpZ25lZCBpbnQgY3NfZGVsYXk7Ci0JdW5zaWduZWQgaW50IGNzX2NoYW5nZSA9IDE7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTMyIG1jcjsKLQl1MzIgcHJldl9zcGVlZF9oeiA9IDA7Ci0JdTggcHJldl9iaXRzX3Blcl93b3JkID0gMDsKLQotCS8qIENTIHNldHVwL2hvbGQvcmVjb3ZlcnkgdGltZSBpbiBuc2VjICovCi0JY3NfZGVsYXkgPSAxMDAgKyAoTlNFQ19QRVJfU0VDIC8gMikgLyBzcGktPm1heF9zcGVlZF9oejsKLQotCW1jciA9IHR4eDlzcGlfcmQoYywgVFh4OV9TUE1DUik7Ci0JaWYgKHVubGlrZWx5KChtY3IgJiBUWHg5X1NQTUNSX09QTU9ERSkgPT0gVFh4OV9TUE1DUl9BQ1RJVkUpKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiQmFkIG1vZGUuXG4iKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBleGl0OwotCX0KLQltY3IgJj0gfihUWHg5X1NQTUNSX09QTU9ERSB8IFRYeDlfU1BNQ1JfU1BTVFAgfCBUWHg5X1NQTUNSX0JDTFIpOwotCi0JLyogZW50ZXIgY29uZmlnIG1vZGUgKi8KLQl0eHg5c3BpX3dyKGMsIG1jciB8IFRYeDlfU1BNQ1JfQ09ORklHIHwgVFh4OV9TUE1DUl9CQ0xSLCBUWHg5X1NQTUNSKTsKLQl0eHg5c3BpX3dyKGMsIFRYeDlfU1BDUjBfU0JPUwotCQkJfCAoKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSA/IFRYeDlfU1BDUjBfU1BPTCA6IDApCi0JCQl8ICgoc3BpLT5tb2RlICYgU1BJX0NQSEEpID8gVFh4OV9TUENSMF9TUEhBIDogMCkKLQkJCXwgMHgwOCwKLQkJCVRYeDlfU1BDUjApOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQljb25zdCB2b2lkICp0eGJ1ZiA9IHQtPnR4X2J1ZjsKLQkJdm9pZCAqcnhidWYgPSB0LT5yeF9idWY7Ci0JCXUzMiBkYXRhOwotCQl1bnNpZ25lZCBpbnQgbGVuID0gdC0+bGVuOwotCQl1bnNpZ25lZCBpbnQgd3NpemU7Ci0JCXUzMiBzcGVlZF9oeiA9IHQtPnNwZWVkX2h6ID8gOiBzcGktPm1heF9zcGVlZF9oejsKLQkJdTggYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKLQotCQliaXRzX3Blcl93b3JkID0gYml0c19wZXJfd29yZCA/IDogODsKLQkJd3NpemUgPSBiaXRzX3Blcl93b3JkID4+IDM7IC8qIGluIGJ5dGVzICovCi0KLQkJaWYgKHByZXZfc3BlZWRfaHogIT0gc3BlZWRfaHoKLQkJCQl8fCBwcmV2X2JpdHNfcGVyX3dvcmQgIT0gYml0c19wZXJfd29yZCkgewotCQkJaW50IG4gPSBESVZfUk9VTkRfVVAoYy0+YmFzZWNsaywgc3BlZWRfaHopIC0gMTsKLQkJCW4gPSBjbGFtcChuLCBTUElfTUlOX0RJVklERVIsIFNQSV9NQVhfRElWSURFUik7Ci0JCQkvKiBlbnRlciBjb25maWcgbW9kZSAqLwotCQkJdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0NPTkZJRyB8IFRYeDlfU1BNQ1JfQkNMUiwKLQkJCQkJVFh4OV9TUE1DUik7Ci0JCQl0eHg5c3BpX3dyKGMsIChuIDw8IDgpIHwgYml0c19wZXJfd29yZCwgVFh4OV9TUENSMSk7Ci0JCQkvKiBlbnRlciBhY3RpdmUgbW9kZSAqLwotCQkJdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0FDVElWRSwgVFh4OV9TUE1DUik7Ci0KLQkJCXByZXZfc3BlZWRfaHogPSBzcGVlZF9oejsKLQkJCXByZXZfYml0c19wZXJfd29yZCA9IGJpdHNfcGVyX3dvcmQ7Ci0JCX0KLQotCQlpZiAoY3NfY2hhbmdlKQotCQkJdHh4OXNwaV9jc19mdW5jKHNwaSwgYywgMSwgY3NfZGVsYXkpOwotCQljc19jaGFuZ2UgPSB0LT5jc19jaGFuZ2U7Ci0JCXdoaWxlIChsZW4pIHsKLQkJCXVuc2lnbmVkIGludCBjb3VudCA9IFNQSV9GSUZPX1NJWkU7Ci0JCQlpbnQgaTsKLQkJCXUzMiBjcjA7Ci0KLQkJCWlmIChsZW4gPCBjb3VudCAqIHdzaXplKQotCQkJCWNvdW50ID0gbGVuIC8gd3NpemU7Ci0JCQkvKiBub3cgdHggbXVzdCBiZSBpZGxlLi4uICovCi0JCQl3aGlsZSAoISh0eHg5c3BpX3JkKGMsIFRYeDlfU1BTUikgJiBUWHg5X1NQU1JfU0lETEUpKQotCQkJCWNwdV9yZWxheCgpOwotCQkJY3IwID0gdHh4OXNwaV9yZChjLCBUWHg5X1NQQ1IwKTsKLQkJCWNyMCAmPSB+VFh4OV9TUENSMF9SWElGTF9NQVNLOwotCQkJY3IwIHw9IChjb3VudCAtIDEpIDw8IDEyOwotCQkJLyogZW5hYmxlIHJ4IGludHIgKi8KLQkJCWNyMCB8PSBUWHg5X1NQQ1IwX1JCU0lFOwotCQkJdHh4OXNwaV93cihjLCBjcjAsIFRYeDlfU1BDUjApOwotCQkJLyogc2VuZCAqLwotCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlpZiAodHhidWYpIHsKLQkJCQkJZGF0YSA9ICh3c2l6ZSA9PSAxKQotCQkJCQkJPyAqKGNvbnN0IHU4ICopdHhidWYKLQkJCQkJCTogKihjb25zdCB1MTYgKil0eGJ1ZjsKLQkJCQkJdHh4OXNwaV93cihjLCBkYXRhLCBUWHg5X1NQRFIpOwotCQkJCQl0eGJ1ZiArPSB3c2l6ZTsKLQkJCQl9IGVsc2UKLQkJCQkJdHh4OXNwaV93cihjLCAwLCBUWHg5X1NQRFIpOwotCQkJfQotCQkJLyogd2FpdCBhbGwgcnggZGF0YSAqLwotCQkJd2FpdF9ldmVudChjLT53YWl0cSwKLQkJCQl0eHg5c3BpX3JkKGMsIFRYeDlfU1BTUikgJiBUWHg5X1NQU1JfUkJTSSk7Ci0JCQkvKiByZWNlaXZlICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCWRhdGEgPSB0eHg5c3BpX3JkKGMsIFRYeDlfU1BEUik7Ci0JCQkJaWYgKHJ4YnVmKSB7Ci0JCQkJCWlmICh3c2l6ZSA9PSAxKQotCQkJCQkJKih1OCAqKXJ4YnVmID0gZGF0YTsKLQkJCQkJZWxzZQotCQkJCQkJKih1MTYgKilyeGJ1ZiA9IGRhdGE7Ci0JCQkJCXJ4YnVmICs9IHdzaXplOwotCQkJCX0KLQkJCX0KLQkJCWxlbiAtPSBjb3VudCAqIHdzaXplOwotCQl9Ci0JCW0tPmFjdHVhbF9sZW5ndGggKz0gdC0+bGVuOwotCQlpZiAodC0+ZGVsYXlfdXNlY3MpCi0JCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOwotCi0JCWlmICghY3NfY2hhbmdlKQotCQkJY29udGludWU7Ci0JCWlmICh0LT50cmFuc2Zlcl9saXN0Lm5leHQgPT0gJm0tPnRyYW5zZmVycykKLQkJCWJyZWFrOwotCQkvKiBzb21ldGltZXMgYSBzaG9ydCBtaWQtbWVzc2FnZSBkZXNlbGVjdCBvZiB0aGUgY2hpcAotCQkgKiBtYXkgYmUgbmVlZGVkIHRvIHRlcm1pbmF0ZSBhIG1vZGUgb3IgY29tbWFuZAotCQkgKi8KLQkJdHh4OXNwaV9jc19mdW5jKHNwaSwgYywgMCwgY3NfZGVsYXkpOwotCX0KLQotZXhpdDoKLQltLT5zdGF0dXMgPSBzdGF0dXM7Ci0JbS0+Y29tcGxldGUobS0+Y29udGV4dCk7Ci0KLQkvKiBub3JtYWxseSBkZWFjdGl2YXRlIGNoaXBzZWxlY3QgLi4uIHVubGVzcyBubyBlcnJvciBhbmQKLQkgKiBjc19jaGFuZ2UgaGFzIGhpbnRlZCB0aGF0IHRoZSBuZXh0IG1lc3NhZ2Ugd2lsbCBwcm9iYWJseQotCSAqIGJlIGZvciB0aGlzIGNoaXAgdG9vLgotCSAqLwotCWlmICghKHN0YXR1cyA9PSAwICYmIGNzX2NoYW5nZSkpCi0JCXR4eDlzcGlfY3NfZnVuYyhzcGksIGMsIDAsIGNzX2RlbGF5KTsKLQotCS8qIGVudGVyIGNvbmZpZyBtb2RlICovCi0JdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0NPTkZJRyB8IFRYeDlfU1BNQ1JfQkNMUiwgVFh4OV9TUE1DUik7Ci19Ci0KLXN0YXRpYyB2b2lkIHR4eDlzcGlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHR4eDlzcGkgKmMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHR4eDlzcGksIHdvcmspOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+bG9jaywgZmxhZ3MpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmYy0+cXVldWUpKSB7Ci0JCXN0cnVjdCBzcGlfbWVzc2FnZSAqbTsKLQotCQltID0gY29udGFpbmVyX29mKGMtPnF1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOwotCQlsaXN0X2RlbF9pbml0KCZtLT5xdWV1ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmxvY2ssIGZsYWdzKTsKLQotCQl0eHg5c3BpX3dvcmtfb25lKGMsIG0pOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZjLT5sb2NrLCBmbGFncyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCB0eHg5c3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKLXsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpLT5tYXN0ZXI7Ci0Jc3RydWN0IHR4eDlzcGkgKmMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbS0+YWN0dWFsX2xlbmd0aCA9IDA7Ci0KLQkvKiBjaGVjayBlYWNoIHRyYW5zZmVyJ3MgcGFyYW1ldGVycyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkgKHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJdTMyIHNwZWVkX2h6ID0gdC0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OwotCQl1OCBiaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZCA/IDogc3BpLT5iaXRzX3Blcl93b3JkOwotCi0JCWJpdHNfcGVyX3dvcmQgPSBiaXRzX3Blcl93b3JkID8gOiA4OwotCQlpZiAoIXQtPnR4X2J1ZiAmJiAhdC0+cnhfYnVmICYmIHQtPmxlbikKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoYml0c19wZXJfd29yZCAhPSA4ICYmIGJpdHNfcGVyX3dvcmQgIT0gMTYpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHQtPmxlbiAmICgoYml0c19wZXJfd29yZCA+PiAzKSAtIDEpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChzcGVlZF9oeiA8IGMtPm1pbl9zcGVlZF9oeiB8fCBzcGVlZF9oeiA+IGMtPm1heF9zcGVlZF9oeikKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjLT5sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZjLT5xdWV1ZSk7Ci0JcXVldWVfd29yayhjLT53b3JrcXVldWUsICZjLT53b3JrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgdHh4OXNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKLQlzdHJ1Y3QgdHh4OXNwaSAqYzsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLQl1MzIgbWNyOwotCWludCBpcnE7Ci0KLQltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZkZXYtPmRldiwgc2l6ZW9mKCpjKSk7Ci0JaWYgKCFtYXN0ZXIpCi0JCXJldHVybiByZXQ7Ci0JYyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7Ci0KLQlJTklUX1dPUksoJmMtPndvcmssIHR4eDlzcGlfd29yayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmMtPmxvY2spOwotCUlOSVRfTElTVF9IRUFEKCZjLT5xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+d2FpdHEpOwotCi0JYy0+Y2xrID0gY2xrX2dldCgmZGV2LT5kZXYsICJzcGktYmFzZWNsayIpOwotCWlmIChJU19FUlIoYy0+Y2xrKSkgewotCQlyZXQgPSBQVFJfRVJSKGMtPmNsayk7Ci0JCWMtPmNsayA9IE5VTEw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JcmV0ID0gY2xrX2VuYWJsZShjLT5jbGspOwotCWlmIChyZXQpIHsKLQkJY2xrX3B1dChjLT5jbGspOwotCQljLT5jbGsgPSBOVUxMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCWMtPmJhc2VjbGsgPSBjbGtfZ2V0X3JhdGUoYy0+Y2xrKTsKLQljLT5taW5fc3BlZWRfaHogPSBESVZfUk9VTkRfVVAoYy0+YmFzZWNsaywgU1BJX01BWF9ESVZJREVSICsgMSk7Ci0JYy0+bWF4X3NwZWVkX2h6ID0gYy0+YmFzZWNsayAvIChTUElfTUlOX0RJVklERVIgKyAxKTsKLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykKLQkJZ290byBleGl0X2J1c3k7Ci0JaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKLQkJCQkgICAgICJzcGlfdHh4OSIpKQotCQlnb3RvIGV4aXRfYnVzeTsKLQljLT5tZW1iYXNlID0gZGV2bV9pb3JlbWFwKCZkZXYtPmRldiwgcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQlpZiAoIWMtPm1lbWJhc2UpCi0JCWdvdG8gZXhpdF9idXN5OwotCi0JLyogZW50ZXIgY29uZmlnIG1vZGUgKi8KLQltY3IgPSB0eHg5c3BpX3JkKGMsIFRYeDlfU1BNQ1IpOwotCW1jciAmPSB+KFRYeDlfU1BNQ1JfT1BNT0RFIHwgVFh4OV9TUE1DUl9TUFNUUCB8IFRYeDlfU1BNQ1JfQkNMUik7Ci0JdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0NPTkZJRyB8IFRYeDlfU1BNQ1JfQkNMUiwgVFh4OV9TUE1DUik7Ci0KLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKGRldiwgMCk7Ci0JaWYgKGlycSA8IDApCi0JCWdvdG8gZXhpdF9idXN5OwotCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJmRldi0+ZGV2LCBpcnEsIHR4eDlzcGlfaW50ZXJydXB0LCAwLAotCQkJICAgICAgICJzcGlfdHh4OSIsIGMpOwotCWlmIChyZXQpCi0JCWdvdG8gZXhpdDsKLQotCWMtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAotCQkJCWRldl9uYW1lKG1hc3Rlci0+ZGV2LnBhcmVudCkpOwotCWlmICghYy0+d29ya3F1ZXVlKQotCQlnb3RvIGV4aXRfYnVzeTsKLQljLT5sYXN0X2NoaXBzZWxlY3QgPSAtMTsKLQotCWRldl9pbmZvKCZkZXYtPmRldiwgImF0ICUjbGx4LCBpcnEgJWQsICVkTUh6XG4iLAotCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LCBpcnEsCi0JCSAoYy0+YmFzZWNsayArIDUwMDAwMCkgLyAxMDAwMDAwKTsKLQotCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLwotCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NTX0hJR0ggfCBTUElfQ1BPTCB8IFNQSV9DUEhBOwotCi0JbWFzdGVyLT5idXNfbnVtID0gZGV2LT5pZDsKLQltYXN0ZXItPnNldHVwID0gdHh4OXNwaV9zZXR1cDsKLQltYXN0ZXItPnRyYW5zZmVyID0gdHh4OXNwaV90cmFuc2ZlcjsKLQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gKHUxNilVSU5UX01BWDsgLyogYW55IEdQSU8gbnVtYmVycyAqLwotCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXhpdDsKLQlyZXR1cm4gMDsKLWV4aXRfYnVzeToKLQlyZXQgPSAtRUJVU1k7Ci1leGl0OgotCWlmIChjLT53b3JrcXVldWUpCi0JCWRlc3Ryb3lfd29ya3F1ZXVlKGMtPndvcmtxdWV1ZSk7Ci0JaWYgKGMtPmNsaykgewotCQljbGtfZGlzYWJsZShjLT5jbGspOwotCQljbGtfcHV0KGMtPmNsayk7Ci0JfQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Ci0Jc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCB0eHg5c3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldikpOwotCXN0cnVjdCB0eHg5c3BpICpjID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCi0Jc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShjLT53b3JrcXVldWUpOwotCWNsa19kaXNhYmxlKGMtPmNsayk7Ci0JY2xrX3B1dChjLT5jbGspOwotCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzcGlfdHh4OSIpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0eHg5c3BpX2RyaXZlciA9IHsKLQkucmVtb3ZlID0gX19leGl0X3AodHh4OXNwaV9yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInNwaV90eHg5IiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHR4eDlzcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnR4eDlzcGlfZHJpdmVyLCB0eHg5c3BpX3Byb2JlKTsKLX0KLXN1YnN5c19pbml0Y2FsbCh0eHg5c3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdHh4OXNwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnR4eDlzcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHR4eDlzcGlfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiVFh4OSBTUEkgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlkZXYuYyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCmluZGV4IGQ5ZmQ4NjIuLjgzMGFkYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaWRldi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIHNwaWRldi5jIC0tIHNpbXBsZSBzeW5jaHJvbm91cyB1c2Vyc3BhY2UgaW50ZXJmYWNlIHRvIFNQSSBkZXZpY2VzCisgKiBTaW1wbGUgc3luY2hyb25vdXMgdXNlcnNwYWNlIGludGVyZmFjZSB0byBTUEkgZGV2aWNlcwogICoKICAqIENvcHlyaWdodCAoQykgMjAwNiBTV0FQUAogICoJQW5kcmVhIFBhdGVybmlhbmkgPGEucGF0ZXJuaWFuaUBzd2FwcC1lbmcuaXQ+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS90bGU2MngwLmMgYi9kcml2ZXJzL3NwaS90bGU2MngwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYTQwODcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zcGkvdGxlNjJ4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qCi0gKiB0bGU2MngwLmMgLS0gc3VwcG9ydCBJbmZpbmVvbiBUTEU2MngwIGRyaXZlciBjaGlwcwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcywgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS90bGU2MngwLmg+Ci0KLQotI2RlZmluZSBDTURfUkVBRAkweDAwCi0jZGVmaW5lIENNRF9TRVQJCTB4ZmYKLQotI2RlZmluZSBESUFHX05PUk1BTAkweDAzCi0jZGVmaW5lIERJQUdfT1ZFUkxPQUQJMHgwMgotI2RlZmluZSBESUFHX09QRU4JMHgwMQotI2RlZmluZSBESUFHX1NIT1JUR05ECTB4MDAKLQotc3RydWN0IHRsZTYyeDBfc3RhdGUgewotCXN0cnVjdCBzcGlfZGV2aWNlCSp1czsKLQlzdHJ1Y3QgbXV0ZXgJCWxvY2s7Ci0JdW5zaWduZWQgaW50CQlucl9ncGlvOwotCXVuc2lnbmVkIGludAkJZ3Bpb19zdGF0ZTsKLQotCXVuc2lnbmVkIGNoYXIJCXR4X2J1ZmZbNF07Ci0JdW5zaWduZWQgY2hhcgkJcnhfYnVmZls0XTsKLX07Ci0KLXN0YXRpYyBpbnQgdG9fZ3Bpb19udW0oc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpOwotCi1zdGF0aWMgaW5saW5lIGludCB0bGU2MngwX3dyaXRlKHN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCkKLXsKLQl1bnNpZ25lZCBjaGFyICpidWZmID0gc3QtPnR4X2J1ZmY7Ci0JdW5zaWduZWQgaW50IGdwaW9fc3RhdGUgPSBzdC0+Z3Bpb19zdGF0ZTsKLQotCWJ1ZmZbMF0gPSBDTURfU0VUOwotCi0JaWYgKHN0LT5ucl9ncGlvID09IDE2KSB7Ci0JCWJ1ZmZbMV0gPSBncGlvX3N0YXRlID4+IDg7Ci0JCWJ1ZmZbMl0gPSBncGlvX3N0YXRlOwotCX0gZWxzZSB7Ci0JCWJ1ZmZbMV0gPSBncGlvX3N0YXRlOwotCX0KLQotCWRldl9kYmcoJnN0LT51cy0+ZGV2LCAiYnVmZiAlMDJ4LCUwMngsJTAyeFxuIiwKLQkJYnVmZlswXSwgYnVmZlsxXSwgYnVmZlsyXSk7Ci0KLQlyZXR1cm4gc3BpX3dyaXRlKHN0LT51cywgYnVmZiwgKHN0LT5ucl9ncGlvID09IDE2KSA/IDMgOiAyKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdGxlNjJ4MF9yZWFkKHN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCkKLXsKLQl1bnNpZ25lZCBjaGFyICp0eGJ1ZmYgPSBzdC0+dHhfYnVmZjsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXIgPSB7Ci0JCS50eF9idWYJCT0gdHhidWZmLAotCQkucnhfYnVmCQk9IHN0LT5yeF9idWZmLAotCQkubGVuCQk9IChzdC0+bnJfZ3BpbyAqIDIpIC8gOCwKLQl9OwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7Ci0KLQl0eGJ1ZmZbMF0gPSBDTURfUkVBRDsKLQl0eGJ1ZmZbMV0gPSAweDAwOwotCXR4YnVmZlsyXSA9IDB4MDA7Ci0JdHhidWZmWzNdID0gMHgwMDsKLQotCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOwotCi0JcmV0dXJuIHNwaV9zeW5jKHN0LT51cywgJm1zZyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpkZWNvZGVfZmF1bHQodW5zaWduZWQgaW50IGZhdWx0X2NvZGUpCi17Ci0JZmF1bHRfY29kZSAmPSAzOwotCi0Jc3dpdGNoIChmYXVsdF9jb2RlKSB7Ci0JY2FzZSBESUFHX05PUk1BTDoKLQkJcmV0dXJuICJOIjsKLQljYXNlIERJQUdfT1ZFUkxPQUQ6Ci0JCXJldHVybiAiViI7Ci0JY2FzZSBESUFHX09QRU46Ci0JCXJldHVybiAiTyI7Ci0JY2FzZSBESUFHX1NIT1JUR05EOgotCQlyZXR1cm4gIkciOwotCX0KLQotCXJldHVybiAiPyI7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHRsZTYyeDBfc3RhdHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWNoYXIgKmJwID0gYnVmOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZmYgPSBzdC0+cnhfYnVmZjsKLQl1bnNpZ25lZCBsb25nIGZhdWx0ID0gMDsKLQlpbnQgcHRyOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZzdC0+bG9jayk7Ci0JcmV0ID0gdGxlNjJ4MF9yZWFkKHN0KTsKLQlkZXZfZGJnKGRldiwgInRsZTYyeDBfcmVhZCgpIHJldHVybmVkICVkXG4iLCByZXQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCW11dGV4X3VubG9jaygmc3QtPmxvY2spOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWZvciAocHRyID0gMDsgcHRyIDwgKHN0LT5ucl9ncGlvICogMikvODsgcHRyICs9IDEpIHsKLQkJZmF1bHQgPDw9IDg7Ci0JCWZhdWx0ICB8PSAoKHVuc2lnbmVkIGxvbmcpYnVmZltwdHJdKTsKLQotCQlkZXZfZGJnKGRldiwgImJ5dGUgJWQgaXMgJTAyeFxuIiwgcHRyLCBidWZmW3B0cl0pOwotCX0KLQotCWZvciAocHRyID0gMDsgcHRyIDwgc3QtPm5yX2dwaW87IHB0cisrKSB7Ci0JCWJwICs9IHNwcmludGYoYnAsICIlcyAiLCBkZWNvZGVfZmF1bHQoZmF1bHQgPj4gKHB0ciAqIDIpKSk7Ci0JfQotCi0JKmJwKysgPSAnXG4nOwotCi0JbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7Ci0JcmV0dXJuIGJwIC0gYnVmOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoc3RhdHVzX3Nob3csIFNfSVJVR08sIHRsZTYyeDBfc3RhdHVzX3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdCB0bGU2MngwX2dwaW9fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHRsZTYyeDBfc3RhdGUgKnN0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IGdwaW9fbnVtID0gdG9fZ3Bpb19udW0oYXR0cik7Ci0JaW50IHZhbHVlOwotCi0JbXV0ZXhfbG9jaygmc3QtPmxvY2spOwotCXZhbHVlID0gKHN0LT5ncGlvX3N0YXRlID4+IGdwaW9fbnVtKSAmIDE7Ci0JbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZCIsIHZhbHVlKTsKLX0KLQotc3RhdGljIHNzaXplX3QgdGxlNjJ4MF9ncGlvX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgZ3Bpb19udW0gPSB0b19ncGlvX251bShhdHRyKTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQljaGFyICplbmRwOwotCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7Ci0JaWYgKGJ1ZiA9PSBlbmRwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldl9kYmcoZGV2LCAic2V0dGluZyBncGlvICVkIHRvICVsZFxuIiwgZ3Bpb19udW0sIHZhbCk7Ci0KLQltdXRleF9sb2NrKCZzdC0+bG9jayk7Ci0KLQlpZiAodmFsKQotCQlzdC0+Z3Bpb19zdGF0ZSB8PSAxIDw8IGdwaW9fbnVtOwotCWVsc2UKLQkJc3QtPmdwaW9fc3RhdGUgJj0gfigxIDw8IGdwaW9fbnVtKTsKLQotCXRsZTYyeDBfd3JpdGUoc3QpOwotCW11dGV4X3VubG9jaygmc3QtPmxvY2spOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGdwaW8xLCBTX0lXVVNSfFNfSVJVR08sCi0JCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGdwaW8yLCBTX0lXVVNSfFNfSVJVR08sCi0JCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGdwaW8zLCBTX0lXVVNSfFNfSVJVR08sCi0JCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGdwaW80LCBTX0lXVVNSfFNfSVJVR08sCi0JCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGdwaW81LCBTX0lXVVNSfFNfSVJVR08sCi0JCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGdwaW82LCBTX0lXVVNSfFNfSVJVR08sCi0JCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGdwaW83LCBTX0lXVVNSfFNfSVJVR08sCi0JCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGdwaW84LCBTX0lXVVNSfFNfSVJVR08sCi0JCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGdwaW85LCBTX0lXVVNSfFNfSVJVR08sCi0JCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGdwaW8xMCwgU19JV1VTUnxTX0lSVUdPLAotCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihncGlvMTEsIFNfSVdVU1J8U19JUlVHTywKLQkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzEyLCBTX0lXVVNSfFNfSVJVR08sCi0JCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGdwaW8xMywgU19JV1VTUnxTX0lSVUdPLAotCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihncGlvMTQsIFNfSVdVU1J8U19JUlVHTywKLQkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzE1LCBTX0lXVVNSfFNfSVJVR08sCi0JCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGdwaW8xNiwgU19JV1VTUnxTX0lSVUdPLAotCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpncGlvX2F0dHJzW10gPSB7Ci0JWzBdCQk9ICZkZXZfYXR0cl9ncGlvMSwKLQlbMV0JCT0gJmRldl9hdHRyX2dwaW8yLAotCVsyXQkJPSAmZGV2X2F0dHJfZ3BpbzMsCi0JWzNdCQk9ICZkZXZfYXR0cl9ncGlvNCwKLQlbNF0JCT0gJmRldl9hdHRyX2dwaW81LAotCVs1XQkJPSAmZGV2X2F0dHJfZ3BpbzYsCi0JWzZdCQk9ICZkZXZfYXR0cl9ncGlvNywKLQlbN10JCT0gJmRldl9hdHRyX2dwaW84LAotCVs4XQkJPSAmZGV2X2F0dHJfZ3BpbzksCi0JWzldCQk9ICZkZXZfYXR0cl9ncGlvMTAsCi0JWzEwXQkJPSAmZGV2X2F0dHJfZ3BpbzExLAotCVsxMV0JCT0gJmRldl9hdHRyX2dwaW8xMiwKLQlbMTJdCQk9ICZkZXZfYXR0cl9ncGlvMTMsCi0JWzEzXQkJPSAmZGV2X2F0dHJfZ3BpbzE0LAotCVsxNF0JCT0gJmRldl9hdHRyX2dwaW8xNSwKLQlbMTVdCQk9ICZkZXZfYXR0cl9ncGlvMTYKLX07Ci0KLXN0YXRpYyBpbnQgdG9fZ3Bpb19udW0oc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpCi17Ci0JaW50IHB0cjsKLQotCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShncGlvX2F0dHJzKTsgcHRyKyspIHsKLQkJaWYgKGdwaW9fYXR0cnNbcHRyXSA9PSBhdHRyKQotCQkJcmV0dXJuIHB0cjsKLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHRsZTYyeDBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3Q7Ci0Jc3RydWN0IHRsZTYyeDBfcGRhdGEgKnBkYXRhOwotCWludCBwdHI7Ci0JaW50IHJldDsKLQotCXBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAocGRhdGEgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIGRldmljZSBkYXRhIHNwZWNpZmllZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRsZTYyeDBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoc3QgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIG1lbW9yeSBmb3IgZGV2aWNlIHN0YXRlXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jc3QtPnVzID0gc3BpOwotCXN0LT5ucl9ncGlvID0gcGRhdGEtPmdwaW9fY291bnQ7Ci0Jc3QtPmdwaW9fc3RhdGUgPSBwZGF0YS0+aW5pdF9zdGF0ZTsKLQotCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKLQotCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl9zdGF0dXNfc2hvdyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgImNhbm5vdCBjcmVhdGUgc3RhdHVzIGF0dHJpYnV0ZVxuIik7Ci0JCWdvdG8gZXJyX3N0YXR1czsKLQl9Ci0KLQlmb3IgKHB0ciA9IDA7IHB0ciA8IHBkYXRhLT5ncGlvX2NvdW50OyBwdHIrKykgewotCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCBncGlvX2F0dHJzW3B0cl0pOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZzcGktPmRldiwgImNhbm5vdCBjcmVhdGUgZ3BpbyBhdHRyaWJ1dGVcbiIpOwotCQkJZ290byBlcnJfZ3Bpb3M7Ci0JCX0KLQl9Ci0KLQkvKiB0bGU2MngwX3dyaXRlKHN0KTsgKi8KLQlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7Ci0JcmV0dXJuIDA7Ci0KLSBlcnJfZ3Bpb3M6Ci0Jd2hpbGUgKC0tcHRyID49IDApCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsIGdwaW9fYXR0cnNbcHRyXSk7Ci0KLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfc3RhdHVzX3Nob3cpOwotCi0gZXJyX3N0YXR1czoKLQlrZnJlZShzdCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgdGxlNjJ4MF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQlpbnQgcHRyOwotCi0JZm9yIChwdHIgPSAwOyBwdHIgPCBzdC0+bnJfZ3BpbzsgcHRyKyspCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsIGdwaW9fYXR0cnNbcHRyXSk7Ci0KLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfc3RhdHVzX3Nob3cpOwotCWtmcmVlKHN0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHRsZTYyeDBfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gInRsZTYyeDAiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZQkJPSB0bGU2MngwX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodGxlNjJ4MF9yZW1vdmUpLAotfTsKLQotc3RhdGljIF9faW5pdCBpbnQgdGxlNjJ4MF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJnRsZTYyeDBfZHJpdmVyKTsKLX0KLQotc3RhdGljIF9fZXhpdCB2b2lkIHRsZTYyeDBfZXhpdCh2b2lkKQotewotCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmdGxlNjJ4MF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdCh0bGU2MngwX2luaXQpOwotbW9kdWxlX2V4aXQodGxlNjJ4MF9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJUTEU2MngwIFNQSSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9BTElBUygic3BpOnRsZTYyeDAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2I0M19wY2lfYnJpZGdlLmMgYi9kcml2ZXJzL3NzYi9iNDNfcGNpX2JyaWRnZS5jCmluZGV4IDc0NGQzZjYuLmJmNTNlNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL2I0M19wY2lfYnJpZGdlLmMKKysrIGIvZHJpdmVycy9zc2IvYjQzX3BjaV9icmlkZ2UuYwpAQCAtNSw3ICs1LDcgQEAKICAqIGJlY2F1c2Ugb2YgaXRzIHNtYWxsIHNpemUgd2UgaW5jbHVkZSBpdCBpbiB0aGUgU1NCIGNvcmUKICAqIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBzdGFuZGFsb25lIG1vZHVsZS4KICAqCi0gKiBDb3B5cmlnaHQgMjAwNyAgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAqIENvcHlyaWdodCAyMDA3ICBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUvR1BMLiBTZWUgQ09QWUlORyBmb3IgZGV0YWlscy4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb24uYyBiL2RyaXZlcnMvc3NiL2RyaXZlcl9jaGlwY29tbW9uLmMKaW5kZXggMDZkMTViNi4uNWQ5Yzk3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb24uYworKysgYi9kcml2ZXJzL3NzYi9kcml2ZXJfY2hpcGNvbW1vbi5jCkBAIC0zLDcgKzMsNyBAQAogICogQnJvYWRjb20gQ2hpcENvbW1vbiBjb3JlIGRyaXZlcgogICoKICAqIENvcHlyaWdodCAyMDA1LCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IDIwMDYsIDIwMDcsIE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgKiBDb3B5cmlnaHQgMjAwNiwgMjAwNywgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VL0dQTC4gU2VlIENPUFlJTkcgZm9yIGRldGFpbHMuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2RyaXZlcl9jaGlwY29tbW9uX3BtdS5jIGIvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKaW5kZXggMzA1YWRlNy4uNTI5MDFjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKKysrIGIvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKQEAgLTIsNyArMiw3IEBACiAgKiBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKICAqIEJyb2FkY29tIENoaXBDb21tb24gUG93ZXIgTWFuYWdlbWVudCBVbml0IGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAyMDA5LCBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICogQ29weXJpZ2h0IDIwMDksIE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgKiBDb3B5cmlnaHQgMjAwNywgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VL0dQTC4gU2VlIENPUFlJTkcgZm9yIGRldGFpbHMuCkBAIC00MTcsOSArNDE3LDkgQEAKIAl1MzIgbWluX21zayA9IDAsIG1heF9tc2sgPSAwOwogCXVuc2lnbmVkIGludCBpOwogCWNvbnN0IHN0cnVjdCBwbXVfcmVzX3VwZG93bl90YWJfZW50cnkgKnVwZG93bl90YWIgPSBOVUxMOwotCXVuc2lnbmVkIGludCB1cGRvd25fdGFiX3NpemU7CisJdW5zaWduZWQgaW50IHVwZG93bl90YWJfc2l6ZSA9IDA7CiAJY29uc3Qgc3RydWN0IHBtdV9yZXNfZGVwZW5kX3RhYl9lbnRyeSAqZGVwZW5kX3RhYiA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IGRlcGVuZF90YWJfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZGVwZW5kX3RhYl9zaXplID0gMDsKIAogCXN3aXRjaCAoYnVzLT5jaGlwX2lkKSB7CiAJY2FzZSAweDQzMTI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NzYi9kcml2ZXJfZXh0aWYuYyBiL2RyaXZlcnMvc3NiL2RyaXZlcl9leHRpZi5jCmluZGV4IGMzZTFkM2U2Li5kYzQ3ZjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9kcml2ZXJfZXh0aWYuYworKysgYi9kcml2ZXJzL3NzYi9kcml2ZXJfZXh0aWYuYwpAQCAtMyw3ICszLDcgQEAKICAqIEJyb2FkY29tIEVYVElGIGNvcmUgZHJpdmVyCiAgKgogICogQ29weXJpZ2h0IDIwMDUsIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgMjAwNiwgMjAwNywgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAqIENvcHlyaWdodCAyMDA2LCAyMDA3LCBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICogQ29weXJpZ2h0IDIwMDYsIDIwMDcsIEZlbGl4IEZpZXRrYXUgPG5iZEBvcGVud3J0Lm9yZz4KICAqIENvcHlyaWdodCAyMDA3LCBBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+CiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvZHJpdmVyX2dpZ2UuYyBiL2RyaXZlcnMvc3NiL2RyaXZlcl9naWdlLmMKaW5kZXggNWJhOTJhMi4uM2FkYjk4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX2dpZ2UuYworKysgYi9kcml2ZXJzL3NzYi9kcml2ZXJfZ2lnZS5jCkBAIC0zLDcgKzMsNyBAQAogICogQnJvYWRjb20gR2lnYWJpdCBFdGhlcm5ldCBjb3JlIGRyaXZlcgogICoKICAqIENvcHlyaWdodCAyMDA4LCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IDIwMDgsIE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgKiBDb3B5cmlnaHQgMjAwOCwgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VL0dQTC4gU2VlIENPUFlJTkcgZm9yIGRldGFpbHMuCiAgKi8KQEAgLTEwNiw4ICsxMDYsOSBAQAogCWdpZ2Vfd3JpdGUzMihkZXYsIFNTQl9HSUdFX1BDSUNGRyArIG9mZnNldCwgdmFsdWUpOwogfQogCi1zdGF0aWMgaW50IHNzYl9naWdlX3BjaV9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCi0JCQkJICAgIGludCByZWcsIGludCBzaXplLCB1MzIgKnZhbCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNzYl9naWdlX3BjaV9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsCisJCQkJCSAgICAgIGludCBzaXplLCB1MzIgKnZhbCkKIHsKIAlzdHJ1Y3Qgc3NiX2dpZ2UgKmRldiA9IGNvbnRhaW5lcl9vZihidXMtPm9wcywgc3RydWN0IHNzYl9naWdlLCBwY2lfb3BzKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTM2LDggKzEzNyw5IEBACiAJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KIAotc3RhdGljIGludCBzc2JfZ2lnZV9wY2lfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJCQkgICAgIGludCByZWcsIGludCBzaXplLCB1MzIgdmFsKQorc3RhdGljIGludCBfX2RldmluaXQgc3NiX2dpZ2VfcGNpX3dyaXRlX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLAorCQkJCQkgICAgICAgaW50IHNpemUsIHUzMiB2YWwpCiB7CiAJc3RydWN0IHNzYl9naWdlICpkZXYgPSBjb250YWluZXJfb2YoYnVzLT5vcHMsIHN0cnVjdCBzc2JfZ2lnZSwgcGNpX29wcyk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE2Niw3ICsxNjgsOCBAQAogCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiB9CiAKLXN0YXRpYyBpbnQgc3NiX2dpZ2VfcHJvYmUoc3RydWN0IHNzYl9kZXZpY2UgKnNkZXYsIGNvbnN0IHN0cnVjdCBzc2JfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNzYl9naWdlX3Byb2JlKHN0cnVjdCBzc2JfZGV2aWNlICpzZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc3NiX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHNzYl9naWdlICpkZXY7CiAJdTMyIGJhc2UsIHRtc2xvdywgdG1zaGlnaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2RyaXZlcl9taXBzY29yZS5jIGIvZHJpdmVycy9zc2IvZHJpdmVyX21pcHNjb3JlLmMKaW5kZXggOTdlZmNlMS4uY2VkNTAxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX21pcHNjb3JlLmMKKysrIGIvZHJpdmVycy9zc2IvZHJpdmVyX21pcHNjb3JlLmMKQEAgLTMsNyArMyw3IEBACiAgKiBCcm9hZGNvbSBNSVBTIGNvcmUgZHJpdmVyCiAgKgogICogQ29weXJpZ2h0IDIwMDUsIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgMjAwNiwgMjAwNywgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAqIENvcHlyaWdodCAyMDA2LCAyMDA3LCBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUvR1BMLiBTZWUgQ09QWUlORyBmb3IgZGV0YWlscy4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvZHJpdmVyX3BjaWNvcmUuYyBiL2RyaXZlcnMvc3NiL2RyaXZlcl9wY2ljb3JlLmMKaW5kZXggODJmZWIzNC4uZTZhYzMxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX3BjaWNvcmUuYworKysgYi9kcml2ZXJzL3NzYi9kcml2ZXJfcGNpY29yZS5jCkBAIC0zLDcgKzMsNyBAQAogICogQnJvYWRjb20gUENJLWNvcmUgZHJpdmVyCiAgKgogICogQ29weXJpZ2h0IDIwMDUsIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgMjAwNiwgMjAwNywgTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAqIENvcHlyaWdodCAyMDA2LCAyMDA3LCBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUvR1BMLiBTZWUgQ09QWUlORyBmb3IgZGV0YWlscy4KICAqLwpAQCAtMzE0LDcgKzMxNCw3IEBACiAJcmV0dXJuIHNzYl9taXBzX2lycShleHRwY2lfY29yZS0+ZGV2KSArIDI7CiB9CiAKLXN0YXRpYyB2b2lkIHNzYl9wY2ljb3JlX2luaXRfaG9zdG1vZGUoc3RydWN0IHNzYl9wY2ljb3JlICpwYykKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzc2JfcGNpY29yZV9pbml0X2hvc3Rtb2RlKHN0cnVjdCBzc2JfcGNpY29yZSAqcGMpCiB7CiAJdTMyIHZhbDsKIApAQCAtMzc5LDcgKzM3OSw3IEBACiAJcmVnaXN0ZXJfcGNpX2NvbnRyb2xsZXIoJnNzYl9wY2ljb3JlX2NvbnRyb2xsZXIpOwogfQogCi1zdGF0aWMgaW50IHBjaWNvcmVfaXNfaW5faG9zdG1vZGUoc3RydWN0IHNzYl9wY2ljb3JlICpwYykKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjaWNvcmVfaXNfaW5faG9zdG1vZGUoc3RydWN0IHNzYl9wY2ljb3JlICpwYykKIHsKIAlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gcGMtPmRldi0+YnVzOwogCXUxNiBjaGlwaWRfdG9wOwpAQCAtNDEyLDcgKzQxMiw3IEBACiAgKiBXb3JrYXJvdW5kcy4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3NiX3BjaWNvcmVfZml4X3Nwcm9tX2NvcmVfaW5kZXgoc3RydWN0IHNzYl9wY2ljb3JlICpwYykKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzc2JfcGNpY29yZV9maXhfc3Byb21fY29yZV9pbmRleChzdHJ1Y3Qgc3NiX3BjaWNvcmUgKnBjKQogewogCXUxNiB0bXAgPSBwY2ljb3JlX3JlYWQxNihwYywgU1NCX1BDSUNPUkVfU1BST00oMCkpOwogCWlmICgoKHRtcCAmIDB4RjAwMCkgPj4gMTIpICE9IHBjLT5kZXYtPmNvcmVfaW5kZXgpIHsKQEAgLTUxNCwxMyArNTE0LDIyIEBACiAgKiBHZW5lcmljIGFuZCBDbGllbnRtb2RlIG9wZXJhdGlvbiBjb2RlLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzc2JfcGNpY29yZV9pbml0X2NsaWVudG1vZGUoc3RydWN0IHNzYl9wY2ljb3JlICpwYykKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzc2JfcGNpY29yZV9pbml0X2NsaWVudG1vZGUoc3RydWN0IHNzYl9wY2ljb3JlICpwYykKIHsKKwlzc2JfcGNpY29yZV9maXhfc3Byb21fY29yZV9pbmRleChwYyk7CisKIAkvKiBEaXNhYmxlIFBDSSBpbnRlcnJ1cHRzLiAqLwogCXNzYl93cml0ZTMyKHBjLT5kZXYsIFNTQl9JTlRWRUMsIDApOworCisJLyogQWRkaXRpb25hbCBQQ0llIGFsd2F5cyBvbmNlLWV4ZWN1dGVkIHdvcmthcm91bmRzICovCisJaWYgKHBjLT5kZXYtPmlkLmNvcmVpZCA9PSBTU0JfREVWX1BDSUUpIHsKKwkJc3NiX3BjaWNvcmVfc2VyZGVzX3dvcmthcm91bmQocGMpOworCQkvKiBUT0RPOiBBU1BNICovCisJCS8qIFRPRE86IENsb2NrIFJlcXVlc3QgVXBkYXRlICovCisJfQogfQogCi12b2lkIHNzYl9wY2ljb3JlX2luaXQoc3RydWN0IHNzYl9wY2ljb3JlICpwYykKK3ZvaWQgX19kZXZpbml0IHNzYl9wY2ljb3JlX2luaXQoc3RydWN0IHNzYl9wY2ljb3JlICpwYykKIHsKIAlzdHJ1Y3Qgc3NiX2RldmljZSAqZGV2ID0gcGMtPmRldjsKIApAQCAtNTI5LDggKzUzOCw2IEBACiAJaWYgKCFzc2JfZGV2aWNlX2lzX2VuYWJsZWQoZGV2KSkKIAkJc3NiX2RldmljZV9lbmFibGUoZGV2LCAwKTsKIAotCXNzYl9wY2ljb3JlX2ZpeF9zcHJvbV9jb3JlX2luZGV4KHBjKTsKLQogI2lmZGVmIENPTkZJR19TU0JfUENJQ09SRV9IT1NUTU9ERQogCXBjLT5ob3N0bW9kZSA9IHBjaWNvcmVfaXNfaW5faG9zdG1vZGUocGMpOwogCWlmIChwYy0+aG9zdG1vZGUpCkBAIC01MzgsMTEgKzU0NSw2IEBACiAjZW5kaWYgLyogQ09ORklHX1NTQl9QQ0lDT1JFX0hPU1RNT0RFICovCiAJaWYgKCFwYy0+aG9zdG1vZGUpCiAJCXNzYl9wY2ljb3JlX2luaXRfY2xpZW50bW9kZShwYyk7Ci0KLQkvKiBBZGRpdGlvbmFsIGFsd2F5cyBvbmNlLWV4ZWN1dGVkIHdvcmthcm91bmRzICovCi0Jc3NiX3BjaWNvcmVfc2VyZGVzX3dvcmthcm91bmQocGMpOwotCS8qIFRPRE86IEFTUE0gKi8KLQkvKiBUT0RPOiBDbG9jayBSZXF1ZXN0IFVwZGF0ZSAqLwogfQogCiBzdGF0aWMgdTMyIHNzYl9wY2llX3JlYWQoc3RydWN0IHNzYl9wY2ljb3JlICpwYywgdTMyIGFkZHJlc3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NzYi9lbWJlZGRlZC5jIGIvZHJpdmVycy9zc2IvZW1iZWRkZWQuYwppbmRleCBhMGUwZDI0Li5lZWMzZTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9lbWJlZGRlZC5jCisrKyBiL2RyaXZlcnMvc3NiL2VtYmVkZGVkLmMKQEAgLTMsNyArMyw3IEBACiAgKiBFbWJlZGRlZCBzeXN0ZW1zIHN1cHBvcnQgY29kZQogICoKICAqIENvcHlyaWdodCAyMDA1LTIwMDgsIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA4LCBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICogQ29weXJpZ2h0IDIwMDYtMjAwOCwgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VL0dQTC4gU2VlIENPUFlJTkcgZm9yIGRldGFpbHMuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL21haW4uYyBiL2RyaXZlcnMvc3NiL21haW4uYwppbmRleCBmOGExM2Y4Li4yOWM3ZDRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9tYWluLmMKKysrIGIvZHJpdmVycy9zc2IvbWFpbi5jCkBAIC0zLDcgKzMsNyBAQAogICogU3Vic3lzdGVtIGNvcmUKICAqCiAgKiBDb3B5cmlnaHQgMjAwNSwgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAyMDA2LCAyMDA3LCBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICogQ29weXJpZ2h0IDIwMDYsIDIwMDcsIE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdOVS9HUEwuIFNlZSBDT1BZSU5HIGZvciBkZXRhaWxzLgogICovCkBAIC01NTcsNyArNTU3LDcgQEAKIH0KIAogLyogTmVlZHMgc3NiX2J1c2VzX2xvY2soKSAqLwotc3RhdGljIGludCBzc2JfYXR0YWNoX3F1ZXVlZF9idXNlcyh2b2lkKQorc3RhdGljIGludCBfX2RldmluaXQgc3NiX2F0dGFjaF9xdWV1ZWRfYnVzZXModm9pZCkKIHsKIAlzdHJ1Y3Qgc3NiX2J1cyAqYnVzLCAqbjsKIAlpbnQgZXJyID0gMDsKQEAgLTc2OCw5ICs3NjgsOSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgc3NiX2J1c19yZWdpc3RlcihzdHJ1Y3Qgc3NiX2J1cyAqYnVzLAotCQkJICAgIHNzYl9pbnZhcmlhbnRzX2Z1bmNfdCBnZXRfaW52YXJpYW50cywKLQkJCSAgICB1bnNpZ25lZCBsb25nIGJhc2VhZGRyKQorc3RhdGljIGludCBfX2RldmluaXQgc3NiX2J1c19yZWdpc3RlcihzdHJ1Y3Qgc3NiX2J1cyAqYnVzLAorCQkJCSAgICAgIHNzYl9pbnZhcmlhbnRzX2Z1bmNfdCBnZXRfaW52YXJpYW50cywKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJhc2VhZGRyKQogewogCWludCBlcnI7CiAKQEAgLTg1MSw4ICs4NTEsOCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NTQl9QQ0lIT1NUCi1pbnQgc3NiX2J1c19wY2lidXNfcmVnaXN0ZXIoc3RydWN0IHNzYl9idXMgKmJ1cywKLQkJCSAgICBzdHJ1Y3QgcGNpX2RldiAqaG9zdF9wY2kpCitpbnQgX19kZXZpbml0IHNzYl9idXNfcGNpYnVzX3JlZ2lzdGVyKHN0cnVjdCBzc2JfYnVzICpidXMsCisJCQkJICAgICAgc3RydWN0IHBjaV9kZXYgKmhvc3RfcGNpKQogewogCWludCBlcnI7CiAKQEAgLTg3NSw5ICs4NzUsOSBAQAogI2VuZGlmIC8qIENPTkZJR19TU0JfUENJSE9TVCAqLwogCiAjaWZkZWYgQ09ORklHX1NTQl9QQ01DSUFIT1NUCi1pbnQgc3NiX2J1c19wY21jaWFidXNfcmVnaXN0ZXIoc3RydWN0IHNzYl9idXMgKmJ1cywKLQkJCSAgICAgICBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGNtY2lhX2RldiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGJhc2VhZGRyKQoraW50IF9fZGV2aW5pdCBzc2JfYnVzX3BjbWNpYWJ1c19yZWdpc3RlcihzdHJ1Y3Qgc3NiX2J1cyAqYnVzLAorCQkJCQkgc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBjbWNpYV9kZXYsCisJCQkJCSB1bnNpZ25lZCBsb25nIGJhc2VhZGRyKQogewogCWludCBlcnI7CiAKQEAgLTg5Nyw4ICs4OTcsOSBAQAogI2VuZGlmIC8qIENPTkZJR19TU0JfUENNQ0lBSE9TVCAqLwogCiAjaWZkZWYgQ09ORklHX1NTQl9TRElPSE9TVAotaW50IHNzYl9idXNfc2Rpb2J1c19yZWdpc3RlcihzdHJ1Y3Qgc3NiX2J1cyAqYnVzLCBzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jLAotCQkJICAgICB1bnNpZ25lZCBpbnQgcXVpcmtzKQoraW50IF9fZGV2aW5pdCBzc2JfYnVzX3NkaW9idXNfcmVnaXN0ZXIoc3RydWN0IHNzYl9idXMgKmJ1cywKKwkJCQkgICAgICAgc3RydWN0IHNkaW9fZnVuYyAqZnVuYywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHF1aXJrcykKIHsKIAlpbnQgZXJyOwogCkBAIC05MTgsOSArOTE5LDkgQEAKIEVYUE9SVF9TWU1CT0woc3NiX2J1c19zZGlvYnVzX3JlZ2lzdGVyKTsKICNlbmRpZiAvKiBDT05GSUdfU1NCX1BDTUNJQUhPU1QgKi8KIAotaW50IHNzYl9idXNfc3NiYnVzX3JlZ2lzdGVyKHN0cnVjdCBzc2JfYnVzICpidXMsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBiYXNlYWRkciwKLQkJCSAgICBzc2JfaW52YXJpYW50c19mdW5jX3QgZ2V0X2ludmFyaWFudHMpCitpbnQgX19kZXZpbml0IHNzYl9idXNfc3NiYnVzX3JlZ2lzdGVyKHN0cnVjdCBzc2JfYnVzICpidXMsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBiYXNlYWRkciwKKwkJCQkgICAgICBzc2JfaW52YXJpYW50c19mdW5jX3QgZ2V0X2ludmFyaWFudHMpCiB7CiAJaW50IGVycjsKIApAQCAtMTAwMSw4ICsxMDAyLDggQEAKIAlzd2l0Y2ggKHBsbHR5cGUpIHsKIAljYXNlIFNTQl9QTExUWVBFXzY6IC8qIDEwMC8yMDAgb3IgMTIwLzI0MCBvbmx5ICovCiAJCWlmIChtICYgU1NCX0NISVBDT19DTEtfVDZfTU1BU0spCi0JCQlyZXR1cm4gU1NCX0NISVBDT19DTEtfVDZfTTA7Ci0JCXJldHVybiBTU0JfQ0hJUENPX0NMS19UNl9NMTsKKwkJCXJldHVybiBTU0JfQ0hJUENPX0NMS19UNl9NMTsKKwkJcmV0dXJuIFNTQl9DSElQQ09fQ0xLX1Q2X00wOwogCWNhc2UgU1NCX1BMTFRZUEVfMTogLyogNDhNaHogYmFzZSwgMyBkaXZpZGVycyAqLwogCWNhc2UgU1NCX1BMTFRZUEVfMzogLyogMjVNaHosIDIgZGl2aWRlcnMgKi8KIAljYXNlIFNTQl9QTExUWVBFXzQ6IC8qIDQ4TWh6LCA0IGRpdmlkZXJzICovCkBAIC0xMjY1LDcgKzEyNjYsMTAgQEAKIAljYXNlIFNTQl9CVVNUWVBFX1NTQjoKIAkJcmV0dXJuIDA7CiAJY2FzZSBTU0JfQlVTVFlQRV9QQ0k6Ci0JCXJldHVybiBTU0JfUENJX0RNQTsKKwkJaWYgKHNzYl9yZWFkMzIoZGV2LCBTU0JfVE1TSElHSCkgJiBTU0JfVE1TSElHSF9ETUE2NCkKKwkJCXJldHVybiBTU0JfUENJRV9ETUFfSDMyOworCQllbHNlCisJCQlyZXR1cm4gU1NCX1BDSV9ETUE7CiAJZGVmYXVsdDoKIAkJX19zc2JfZG1hX25vdF9pbXBsZW1lbnRlZChkZXYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL3BjaS5jIGIvZHJpdmVycy9zc2IvcGNpLmMKaW5kZXggN2FkNDg1OC4uMzRjM2JhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvcGNpLmMKKysrIGIvZHJpdmVycy9zc2IvcGNpLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogU29uaWNzIFNpbGljb24gQmFja3BsYW5lIFBDSS1Ib3N0YnVzIHJlbGF0ZWQgZnVuY3Rpb25zLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICogQ29weXJpZ2h0IChDKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPgogICogQ29weXJpZ2h0IChDKSAyMDA1IFN0ZWZhbm8gQnJpdmlvIDxzdDNAcmlzZXVwLm5ldD4KICAqIENvcHlyaWdodCAoQykgMjAwNSBEYW5ueSB2YW4gRHlrIDxrdWdlbGZhbmdAZ2VudG9vLm9yZz4KQEAgLTczNCwxMiArNzM0LDkgQEAKIHN0YXRpYyB2b2lkIHNzYl9wY2lfZ2V0X2JvYXJkaW5mbyhzdHJ1Y3Qgc3NiX2J1cyAqYnVzLAogCQkJCSAgc3RydWN0IHNzYl9ib2FyZGluZm8gKmJpKQogewotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJ1cy0+aG9zdF9wY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELAotCQkJICAgICAmYmktPnZlbmRvcik7Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQoYnVzLT5ob3N0X3BjaSwgUENJX1NVQlNZU1RFTV9JRCwKLQkJCSAgICAgJmJpLT50eXBlKTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChidXMtPmhvc3RfcGNpLCBQQ0lfUkVWSVNJT05fSUQsCi0JCQkgICAgICZiaS0+cmV2KTsKKwliaS0+dmVuZG9yID0gYnVzLT5ob3N0X3BjaS0+c3Vic3lzdGVtX3ZlbmRvcjsKKwliaS0+dHlwZSA9IGJ1cy0+aG9zdF9wY2ktPnN1YnN5c3RlbV9kZXZpY2U7CisJYmktPnJldiA9IGJ1cy0+aG9zdF9wY2ktPnJldmlzaW9uOwogfQogCiBpbnQgc3NiX3BjaV9nZXRfaW52YXJpYW50cyhzdHJ1Y3Qgc3NiX2J1cyAqYnVzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvcGNpaG9zdF93cmFwcGVyLmMgYi9kcml2ZXJzL3NzYi9wY2lob3N0X3dyYXBwZXIuYwppbmRleCBmNmM4YzgxLi4xMTZhODExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9wY2lob3N0X3dyYXBwZXIuYworKysgYi9kcml2ZXJzL3NzYi9wY2lob3N0X3dyYXBwZXIuYwpAQCAtNiw3ICs2LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNSBTdGVmYW5vIEJyaXZpbyA8c3QzQHJpc2V1cC5uZXQ+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGFubnkgdmFuIER5ayA8a3VnZWxmYW5nQGdlbnRvby5vcmc+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhcyBKYWdnaSA8YW5kcmVhcy5qYWdnaUB3YXRlcndhdmUuY2g+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBNaWNoYWVsIEJ1ZXNjaCA8bWJ1ZXNjaEBmcmVlbmV0LmRlPgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VL0dQTC4gU2VlIENPUFlJTkcgZm9yIGRldGFpbHMuCiAgKi8KQEAgLTUzLDggKzUzLDggQEAKICMgZGVmaW5lIHNzYl9wY2lob3N0X3Jlc3VtZQlOVUxMCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKLXN0YXRpYyBpbnQgc3NiX3BjaWhvc3RfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBfX2RldmluaXQgc3NiX3BjaWhvc3RfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBzc2JfYnVzICpzc2I7CiAJaW50IGVyciA9IC1FTk9NRU07CkBAIC0xMTAsNyArMTEwLDcgQEAKIAlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKIH0KIAotaW50IHNzYl9wY2lob3N0X3JlZ2lzdGVyKHN0cnVjdCBwY2lfZHJpdmVyICpkcml2ZXIpCitpbnQgX19kZXZpbml0IHNzYl9wY2lob3N0X3JlZ2lzdGVyKHN0cnVjdCBwY2lfZHJpdmVyICpkcml2ZXIpCiB7CiAJZHJpdmVyLT5wcm9iZSA9IHNzYl9wY2lob3N0X3Byb2JlOwogCWRyaXZlci0+cmVtb3ZlID0gc3NiX3BjaWhvc3RfcmVtb3ZlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvcGNtY2lhLmMgYi9kcml2ZXJzL3NzYi9wY21jaWEuYwppbmRleCBmODUzMzc5Li5jODIxYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9wY21jaWEuYworKysgYi9kcml2ZXJzL3NzYi9wY21jaWEuYwpAQCAtMyw3ICszLDcgQEAKICAqIFBDTUNJQS1Ib3N0YnVzIHJlbGF0ZWQgZnVuY3Rpb25zCiAgKgogICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KLSAqIENvcHlyaWdodCAyMDA3LTIwMDggTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAqIENvcHlyaWdodCAyMDA3LTIwMDggTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VL0dQTC4gU2VlIENPUFlJTkcgZm9yIGRldGFpbHMuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL3NjYW4uYyBiL2RyaXZlcnMvc3NiL3NjYW4uYwppbmRleCA0NWU1YmFiLi4zZTg0NDg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9zY2FuLmMKKysrIGIvZHJpdmVycy9zc2Ivc2Nhbi5jCkBAIC0yLDcgKzIsNyBAQAogICogU29uaWNzIFNpbGljb24gQmFja3BsYW5lCiAgKiBCdXMgc2Nhbm5pbmcKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAqIENvcHlyaWdodCAoQykgMjAwNSBNYXJ0aW4gTGFuZ2VyIDxtYXJ0aW4tbGFuZ2VyQGdteC5kZT4KICAqIENvcHlyaWdodCAoQykgMjAwNSBTdGVmYW5vIEJyaXZpbyA8c3QzQHJpc2V1cC5uZXQ+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGFubnkgdmFuIER5ayA8a3VnZWxmYW5nQGdlbnRvby5vcmc+CkBAIC0zMTAsOCArMzEwLDcgQEAKIAl9IGVsc2UgewogCQlpZiAoYnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1BDSSkgewogCQkJYnVzLT5jaGlwX2lkID0gcGNpZGV2X3RvX2NoaXBpZChidXMtPmhvc3RfcGNpKTsKLQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJ1cy0+aG9zdF9wY2ksIFBDSV9SRVZJU0lPTl9JRCwKLQkJCQkJICAgICAmYnVzLT5jaGlwX3Jldik7CisJCQlidXMtPmNoaXBfcmV2ID0gYnVzLT5ob3N0X3BjaS0+cmV2aXNpb247CiAJCQlidXMtPmNoaXBfcGFja2FnZSA9IDA7CiAJCX0gZWxzZSB7CiAJCQlidXMtPmNoaXBfaWQgPSAweDQ3MTA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NzYi9zZGlvLmMgYi9kcml2ZXJzL3NzYi9zZGlvLmMKaW5kZXggNjVhNjA4MC4uNjNmZDcwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2Ivc2Rpby5jCisrKyBiL2RyaXZlcnMvc3NiL3NkaW8uYwpAQCAtNiw3ICs2LDcgQEAKICAqCiAgKiBCYXNlZCBvbiBkcml2ZXJzL3NzYi9wY21jaWEuYwogICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KLSAqIENvcHlyaWdodCAyMDA3LTIwMDggTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAqIENvcHlyaWdodCAyMDA3LTIwMDggTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VL0dQTC4gU2VlIENPUFlJTkcgZm9yIGRldGFpbHMuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2Ivc3Byb20uYyBiL2RyaXZlcnMvc3NiL3Nwcm9tLmMKaW5kZXggNDVmZjBlMy4uODBkMzY2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2Ivc3Byb20uYworKysgYi9kcml2ZXJzL3NzYi9zcHJvbS5jCkBAIC0yLDcgKzIsNyBAQAogICogU29uaWNzIFNpbGljb24gQmFja3BsYW5lCiAgKiBDb21tb24gU1BST00gc3VwcG9ydCByb3V0aW5lcwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICogQ29weXJpZ2h0IChDKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPgogICogQ29weXJpZ2h0IChDKSAyMDA1IFN0ZWZhbm8gQnJpdmlvIDxzdDNAcmlzZXVwLm5ldD4KICAqIENvcHlyaWdodCAoQykgMjAwNSBEYW5ueSB2YW4gRHlrIDxrdWdlbGZhbmdAZ2VudG9vLm9yZz4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKaW5kZXggZGZjMTZmOS4uMTk2Mjg0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKQEAgLTI0LDIzICsyNCw2IEBACiAKIGlmIFNUQUdJTkcKIAotY29uZmlnIFNUQUdJTkdfRVhDTFVERV9CVUlMRAotCWJvb2wgIkV4Y2x1ZGUgU3RhZ2luZyBkcml2ZXJzIGZyb20gYmVpbmcgYnVpbHQiIGlmIFNUQUdJTkcKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JICBBcmUgeW91IHN1cmUgeW91IHJlYWxseSB3YW50IHRvIGJ1aWxkIHRoZSBzdGFnaW5nIGRyaXZlcnM/Ci0JICBUaGV5IHRhaW50IHlvdXIga2VybmVsLCBkb24ndCBsaXZlIHVwIHRvIHRoZSBub3JtYWwgTGludXgKLQkgIGtlcm5lbCBxdWFsaXR5IHN0YW5kYXJkcywgYXJlIGEgYml0IGNydWZ0eSBhcm91bmQgdGhlIGVkZ2VzLAotCSAgYW5kIG1pZ2h0IGdvIG9mZiBhbmQga2ljayB5b3VyIGRvZyB3aGVuIHlvdSBhcmVuJ3QgcGF5aW5nCi0JICBhdHRlbnRpb24uCi0KLQkgIFNheSBOIGhlcmUgdG8gYmUgYWJsZSB0byBzZWxlY3QgYW5kIGJ1aWxkIHRoZSBTdGFnaW5nIGRyaXZlcnMuCi0JICBUaGlzIG9wdGlvbiBpcyBwcmltYXJpbHkgaGVyZSB0byBwcmV2ZW50IHRoZW0gZnJvbSBiZWluZyBidWlsdAotCSAgd2hlbiBzZWxlY3RpbmcgJ21ha2UgYWxseWVzY29uZmcnIGFuZCAnbWFrZSBhbGxtb2Rjb25maWcnIHNvCi0JICBkb24ndCBiZSBhbGwgdGhhdCBwdXQgb2ZmLCB5b3VyIGRvZyB3aWxsIGJlIGp1c3QgZmluZS4KLQotaWYgIVNUQUdJTkdfRVhDTFVERV9CVUlMRAotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy90dHkvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZ2VuZXJpY19zZXJpYWwvS2NvbmZpZyIKQEAgLTE3Nyw1ICsxNjAsNCBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9udmVjL0tjb25maWciCiAKLWVuZGlmICMgIVNUQUdJTkdfRVhDTFVERV9CVUlMRAogZW5kaWYgIyBTVEFHSU5HCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS1qdGFnLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS1qdGFnLmMKaW5kZXggODc2MzA4OC4uOGIxNjIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWp0YWcuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8c3RhZ2luZy9hbHRlcmEuaD4KKyNpbmNsdWRlICJhbHRlcmEuaCIKICNpbmNsdWRlICJhbHRlcmEtZXhwcnQuaCIKICNpbmNsdWRlICJhbHRlcmEtanRhZy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS5jIGIvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuYwppbmRleCAwNWFhZDM1Li45Y2Q1ZTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzdGFnaW5nL2FsdGVyYS5oPgorI2luY2x1ZGUgImFsdGVyYS5oIgogI2luY2x1ZGUgImFsdGVyYS1leHBydC5oIgogI2luY2x1ZGUgImFsdGVyYS1qdGFnLmgiCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3RhZ2luZy9hbHRlcmEuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvc3RhZ2luZy9hbHRlcmEuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9LY29uZmlnCmluZGV4IDFmMTVlMWYuLmFmZDZjYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL0tjb25maWcKQEAgLTEsNiArMSw3IEBACiBjb25maWcgQVRINktfTEVHQUNZCiAJdHJpc3RhdGUgIkF0aGVyb3MgQVI2MDAzIHN1cHBvcnQgKG5vbiBtYWM4MDIxMSkiCiAgICAgICAgIGRlcGVuZHMgb24gTU1DICYmIFdMQU4KKwlkZXBlbmRzIG9uIENGRzgwMjExCiAgICAgICAgIHNlbGVjdCBXSVJFTEVTU19FWFQKICAgICAgICAgc2VsZWN0IFdFWFRfUFJJVgogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvb3MvbGludXgvY2ZnODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvb3MvbGludXgvY2ZnODAyMTEuYwppbmRleCA3N2RmYjQwLi5kM2E3NzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL29zL2xpbnV4L2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9vcy9saW51eC9jZmc4MDIxMS5jCkBAIC04NzAsNyArODcwLDggQEAKICAgICBpZihhci0+c2Nhbl9yZXF1ZXN0KQogICAgIHsKICAgICAgICAgLyogVHJhbnNsYXRlIGRhdGEgdG8gY2ZnODAyMTEgbWdtdCBmb3JtYXQgKi8KLSAgICAgICAgd21pX2l0ZXJhdGVfbm9kZXMoYXItPmFyV21pLCBhcjZrX2NmZzgwMjExX3NjYW5fbm9kZSwgYXItPndkZXYtPndpcGh5KTsKKwlpZiAoYXItPmFyV21pKQorCQl3bWlfaXRlcmF0ZV9ub2Rlcyhhci0+YXJXbWksIGFyNmtfY2ZnODAyMTFfc2Nhbl9ub2RlLCBhci0+d2Rldi0+d2lwaHkpOwogCiAgICAgICAgIGNmZzgwMjExX3NjYW5fZG9uZShhci0+c2Nhbl9yZXF1ZXN0LAogICAgICAgICAgICAgKChzdGF0dXMgJiBBX0VDQU5DRUxFRCkgfHwgKHN0YXR1cyAmIEFfRUJVU1kpKSA/IHRydWUgOiBmYWxzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL29zL2xpbnV4L2luY2x1ZGUvYXI2MDAwX2Rydi5oIGIvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9vcy9saW51eC9pbmNsdWRlL2FyNjAwMF9kcnYuaAppbmRleCAyMjQ1M2IwLi4xMWRjMzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL29zL2xpbnV4L2luY2x1ZGUvYXI2MDAwX2Rydi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvb3MvbGludXgvaW5jbHVkZS9hcjYwMDBfZHJ2LmgKQEAgLTUyLDcgKzUyLDYgQEAKICNpbmNsdWRlICJhZ2dyX3JlY3ZfYXBpLmgiCiAjaW5jbHVkZSA8aG9zdF92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSAiYXI2MDAwX2FwaS5oIgogI2lmZGVmIENPTkZJR19IT1NUX1RDTURfU1VQUE9SVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9oZWFkZXJzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaAppbmRleCAxMTQ4ZTVlLi44ZmU4ZDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaApAQCAtMjAsMjUgKzIwLDIzIEBACiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CiAKICNpbmNsdWRlICJUeXBlZGVmcy5oIgogI2luY2x1ZGUgIlZlcnNpb24uaCIKQEAgLTYxLDcgKzU5LDYgQEAKICNpbmNsdWRlICJRdWV1ZS5oIgogI2luY2x1ZGUgInZlbmRvcnNwZWNpZmljZXh0bi5oIgogCi0KICNpbmNsdWRlICJJbnRlcmZhY2VNYWNyb3MuaCIKICNpbmNsdWRlICJJbnRlcmZhY2VBZGFwdGVyLmgiCiAjaW5jbHVkZSAiSW50ZXJmYWNlSXNyLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL0tjb25maWcKaW5kZXggZjRjZjliMi4uMzc5Y2YxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvS2NvbmZpZwpAQCAtNyw2ICs3LDcgQEAKIAlkZWZhdWx0IG4KIAlkZXBlbmRzIG9uIFBDSQogCWRlcGVuZHMgb24gV0xBTiAmJiBNQUM4MDIxMQorCWRlcGVuZHMgb24gWDg2IHx8IE1JUFMKIAlzZWxlY3QgQlJDTVVUSUwKIAlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IENSQ19DQ0lUVApAQCAtMjAsNiArMjEsNyBAQAogCWRlZmF1bHQgbgogCWRlcGVuZHMgb24gTU1DCiAJZGVwZW5kcyBvbiBXTEFOICYmIENGRzgwMjExCisJZGVwZW5kcyBvbiBYODYgfHwgTUlQUwogCXNlbGVjdCBCUkNNVVRJTAogCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgV0lSRUxFU1NfRVhUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXguYwppbmRleCBmMzU2YzU2Li4wOTk1N2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMKQEAgLTMxLDYgKzMxLDggQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCmluZGV4IGE3MWM2ZjguLjhjYmZlYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9zZGlvLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIEJDTUVNQkVESU1BR0UKICNlbmRpZgkJCQkvKiBCQ01FTUJFRElNQUdFICovCiAKLSNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxiY21kZXZzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaAppbmRleCA5OTYwMzNjLi5kNGJjYzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5oCkBAIC0xOCw3ICsxOCw2IEBACiAjZGVmaW5lIF93bF9jZmc4MDIxMV9oXwogCiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5jCmluZGV4IDkyOWNlYWYuLjUzZTZhMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfaXcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmMKQEAgLTE4LDIyICsxOCwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgotCiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CiAKICNpbmNsdWRlIDxkbmdsX3N0YXRzLmg+CiAjaW5jbHVkZSA8ZGhkLmg+CiAjaW5jbHVkZSA8ZGhkaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KLXR5cGVkZWYgY29uc3Qgc3RydWN0IHNpX3B1YiBzaV90OwotI2luY2x1ZGUgPHdsaW9jdGwuaD4KIAotI2luY2x1ZGUgPGRuZ2xfc3RhdHMuaD4KLSNpbmNsdWRlIDxkaGQuaD4KK3R5cGVkZWYgY29uc3Qgc3RydWN0IHNpX3B1YiBzaV90OwogCiAjZGVmaW5lIFdMX0VSUk9SKGZtdCwgYXJncy4uLikJcHJpbnRrKGZtdCwgIyNhcmdzKQogI2RlZmluZSBXTF9UUkFDRShmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKQEAgLTY0LDggKzYwLDYgQEAKIGV4dGVybiBib29sIHdsX2l3X2Nvbm5fc3RhdHVzX3N0cih1MzIgZXZlbnRfdHlwZSwgdTMyIHN0YXR1cywKIAkJCQkgIHUzMiByZWFzb24sIGNoYXIgKnN0cmluZ0J1ZiwgdWludCBidWZsZW4pOwogCi11aW50IHdsX21zZ19sZXZlbCA9IFdMX0VSUk9SX1ZBTDsKLQogI2RlZmluZSBNQVhfV0xJV19JT0NUTF9MRU4gMTAyNAogCiAjaWZkZWYgQ09ORklHX1dJUkVMRVNTX0VYVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy93bF9tYWM4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy93bF9tYWM4MDIxMS5jCmluZGV4IDZjNjIzNmMuLjgyNjEyMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvd2xfbWFjODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3dsX21hYzgwMjExLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKICNpbmNsdWRlIDxwcm90by84MDIuMTEuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvd2xfbWFjODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvd2xfbWFjODAyMTEuaAppbmRleCBlNzAzZDhiLi5mN2E1OGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3dsX21hYzgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy93bF9tYWM4MDIxMS5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIF93bF9tYWM4MDIxMV9oXwogI2RlZmluZSBfd2xfbWFjODAyMTFfaF8KIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCiAvKiBCTUFDIE5vdGU6IEhpZ2gtb25seSBkcml2ZXIgaXMgbm8gbG9uZ2VyIHdvcmtpbmcgaW4gc29mdGlycSBjb250ZXh0IGFzIGl0IG5lZWRzIHRvIGJsb2NrIGFuZAogICogc2xlZXAgc28gcGVyaW1ldGVyIGxvY2sgaGFzIHRvIGJlIGEgc2VtYXBob3JlIGluc3RlYWQgb2Ygc3BpbmxvY2suIFRoaXMgcmVxdWlyZXMgdGltZXJzIHRvIGJlCiAgKiBzdWJtaXR0ZWQgdG8gd29ya3F1ZXVlIGluc3RlYWQgb2YgYmVpbmcgb24ga2VybmVsIHRpbWVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKaW5kZXggMTUwMmQ4MC4uMjAwMDhhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZwpAQCAtMiw2ICsyLDcgQEAKIAl0cmlzdGF0ZSAiRGF0YSBhY3F1aXNpdGlvbiBzdXBwb3J0IChjb21lZGkpIgogCWRlZmF1bHQgTgogCWRlcGVuZHMgb24gbQorCWRlcGVuZHMgb24gQlJPS0VOIHx8IEZSViB8fCBNMzJSIHx8IE1OMTAzMDAgfHwgU1VQRVJIIHx8IFRJTEUgfHwgWDg2CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgYSB3aWRlIHJhbmdlIG9mIGRhdGEgYWNxdWlzaXRpb24gZGV2aWNlcwogCSAgZm9yIExpbnV4LgpAQCAtMTYwLDYgKzE2MSw3IEBACiAKIGNvbmZpZyBDT01FRElfUENMODEyCiAJdHJpc3RhdGUgIkFkdmFudGVjaCBQQ0wtODEyLzgxMyBhbmQgQURsaW5rIEFDTC04MTEyLzgxMTMvODExMy84MjE2IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQWR2YW50ZWNoIFBDTC04MTIvUEcsIFBDTC04MTMvQiwgQURMaW5rCkBAIC0xNzEsNiArMTczLDcgQEAKIAogY29uZmlnIENPTUVESV9QQ0w4MTYKIAl0cmlzdGF0ZSAiQWR2YW50ZWNoIFBDTC04MTQgYW5kIFBDTC04MTYgSVNBIGNhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0wtODE0IGFuZCBQQ0wtODE2IElTQSBjYXJkcwpAQCAtMTgwLDYgKzE4Myw3IEBACiAKIGNvbmZpZyBDT01FRElfUENMODE4CiAJdHJpc3RhdGUgIkFkdmFudGVjaCBQQ0wtNzE4IGFuZCBQQ0wtODE4IElTQSBjYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENMLTgxOCBJU0EgY2FyZHMKQEAgLTI2OSw2ICsyNzMsNyBAQAogCiBjb25maWcgQ09NRURJX0RBUzE4MDAKIAl0cmlzdGF0ZSAiREFTMTgwMCBhbmQgY29tcGF0aWJsZSBJU0EgY2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlzZWxlY3QgQ09NRURJX0ZDCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQpAQCAtMzQwLDYgKzM0NSw3IEBACiBjb25maWcgQ09NRURJX0RUMjgyWAogCXRyaXN0YXRlICJEYXRhIFRyYW5zbGF0aW9uIERUMjgyMSBzZXJpZXMgYW5kIERULUVaIElTQSBjYXJkIHN1cHBvcnQiCiAJc2VsZWN0IENPTUVESV9GQworCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgRGF0YSBUcmFuc2xhdGlvbiBEVDI4MjEgc2VyaWVzIGluY2x1ZGluZyBEVC1FWgpAQCAtNDE5LDYgKzQyNSw3IEBACiBjb25maWcgQ09NRURJX05JX0FUX0EyMTUwCiAJdHJpc3RhdGUgIk5JIEFULUEyMTUwIElTQSBjYXJkIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBDT01FRElfTklfQ09NTU9OCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBOYXRpb25hbCBJbnN0cnVtZW50cyBBVC1BMjE1MCBjYXJkcwpAQCAtNTM2LDYgKzU0Myw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzAzNQogCXRyaXN0YXRlICJBRERJLURBVEEgQVBDSV8wMzUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEREktREFUQSBBUENJXzAzNSBjYXJkcwpAQCAtNTQ1LDYgKzU1Myw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzEwMzIKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMTAzMiBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURESS1EQVRBIEFQQ0lfMTAzMiBjYXJkcwpAQCAtNTU0LDYgKzU2Myw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzE1MDAKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMTUwMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURESS1EQVRBIEFQQ0lfMTUwMCBjYXJkcwpAQCAtNTYzLDYgKzU3Myw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzE1MTYKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMTUxNiBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURESS1EQVRBIEFQQ0lfMTUxNiBjYXJkcwpAQCAtNTcyLDYgKzU4Myw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzE1NjQKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMTU2NCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURESS1EQVRBIEFQQ0lfMTU2NCBjYXJkcwpAQCAtNTgxLDYgKzU5Myw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzE2WFgKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMTZ4eCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURESS1EQVRBIEFQQ0lfMTZ4eCBjYXJkcwpAQCAtNTkwLDYgKzYwMyw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzIwMTYKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMjAxNiBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURESS1EQVRBIEFQQ0lfMjAxNiBjYXJkcwpAQCAtNTk5LDYgKzYxMyw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzIwMzIKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMjAzMiBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURESS1EQVRBIEFQQ0lfMjAzMiBjYXJkcwpAQCAtNjA4LDYgKzYyMyw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzIyMDAKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMjIwMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURESS1EQVRBIEFQQ0lfMjIwMCBjYXJkcwpAQCAtNjE3LDYgKzYzMyw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzMwMDEKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMzAwMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlzZWxlY3QgQ09NRURJX0ZDCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQpAQCAtNjI3LDYgKzY0NCw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzMxMjAKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMzUyMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlzZWxlY3QgQ09NRURJX0ZDCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQpAQCAtNjM3LDYgKzY1NSw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzM1MDEKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfMzUwMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURESS1EQVRBIEFQQ0lfMzUwMSBjYXJkcwpAQCAtNjQ2LDYgKzY2NSw3IEBACiAKIGNvbmZpZyBDT01FRElfQURESV9BUENJXzNYWFgKIAl0cmlzdGF0ZSAiQURESS1EQVRBIEFQQ0lfM3h4eCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURESS1EQVRBIEFQQ0lfM3h4eCBjYXJkcwpAQCAtNzEyLDYgKzczMiw3IEBACiBjb25maWcgQ09NRURJX0FETF9QQ0k5MTE4CiAJdHJpc3RhdGUgIkFETGluayBQQ0ktOTExOERHLCBQQ0ktOTExOEhHLCBQQ0ktOTExOEhSIHN1cHBvcnQiCiAJc2VsZWN0IENPTUVESV9GQworCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURsaW5rIFBDSS05MTE4REcsIFBDSS05MTE4SEcsIFBDSS05MTE4SFIgY2FyZHMKQEAgLTEyODcsNiArMTMwOCw3IEBACiAJZGVwZW5kcyBvbiBDT01FRElfTUlURQogCXNlbGVjdCBDT01FRElfODI1NQogCXNlbGVjdCBDT01FRElfRkMKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIE5hdGlvbmFsIEluc3RydW1lbnRzIExhYi1QQyBhbmQgY29tcGF0aWJsZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X25ldGRldi5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfbmV0ZGV2LmMKaW5kZXggYjI1YmFlMi4uOTU1NTVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfbmV0ZGV2LmMKQEAgLTk3LDcgKzk3LDYgQEAKIHZvaWQgZXQxMzF4X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBpbnQgZXQxMzF4X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpOwogaW50IGV0MTMxeF9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqbmV3X21hYyk7Ci12b2lkIGV0MTMxeF92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApOwogdm9pZCBldDEzMXhfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCk7CiB2b2lkIGV0MTMxeF92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYwppbmRleCBiMGE0MjExLi4zZjMwM2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jCkBAIC02NzEsNyArNjcxLDYgQEAKIAlyZXR1cm4gVFJVRTsKIH0KIAotI2lmZGVmIEhBVkVfTkVUX0RFVklDRV9PUFMKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZnRuZXRfb3BzID0KIHsKIAkubmRvX29wZW4gPSAmZnQxMDAwX29wZW4sCkBAIC02NzksNyArNjc4LDYgQEAKIAkubmRvX3N0YXJ0X3htaXQgPSAmZnQxMDAwX3N0YXJ0X3htaXQsCiAJLm5kb19nZXRfc3RhdHMgPSAmZnQxMDAwX25ldGRldl9zdGF0cywKIH07Ci0jZW5kaWYKIAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzY0LDE0ICs3NjIsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnBJbmZvLT5ub2Rlcy5saXN0KTsKIAotI2lmZGVmIEhBVkVfTkVUX0RFVklDRV9PUFMKIAluZXRkZXYtPm5ldGRldl9vcHMgPSAmZnRuZXRfb3BzOwotI2Vsc2UKLQluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZmdDEwMDBfc3RhcnRfeG1pdDsKLQluZXRkZXYtPmdldF9zdGF0cyA9ICZmdDEwMDBfbmV0ZGV2X3N0YXRzOwotCW5ldGRldi0+b3BlbiA9ICZmdDEwMDBfb3BlbjsKLQluZXRkZXYtPnN0b3AgPSAmZnQxMDAwX2Nsb3NlOwotI2VuZGlmCiAKIAlmdDEwMDBkZXYtPm5ldCA9IG5ldGRldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYwppbmRleCAxYzQ1YzExLi5hYTg3YjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYwpAQCAtNTQyLDYgKzU0Miw4IEBACiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIAlpbnQgcmV0ID0gLUVOT01FTTsKIAl1aW50MzJfdCB0dF9wYWdlczsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBwc2JfaW50ZWxfb3V0cHV0ICpwc2JfaW50ZWxfb3V0cHV0OwogCiAJZGV2X3ByaXYgPSBremFsbG9jKHNpemVvZigqZGV2X3ByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGV2X3ByaXYgPT0gTlVMTCkKQEAgLTY2Myw3ICs2NjUsMTggQEAKIAkJZHJtX2ttc19oZWxwZXJfcG9sbF9pbml0KGRldik7CiAJfQogCi0JcmV0ID0gcHNiX2JhY2tsaWdodF9pbml0KGRldik7CisJLyogT25seSBhZGQgYmFja2xpZ2h0IHN1cHBvcnQgaWYgd2UgaGF2ZSBMVkRTIG91dHB1dCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwKKwkJCSAgICBoZWFkKSB7CisJCXBzYl9pbnRlbF9vdXRwdXQgPSB0b19wc2JfaW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisKKwkJc3dpdGNoIChwc2JfaW50ZWxfb3V0cHV0LT50eXBlKSB7CisJCWNhc2UgSU5URUxfT1VUUFVUX0xWRFM6CisJCQlyZXQgPSBwc2JfYmFja2xpZ2h0X2luaXQoZGV2KTsKKwkJCWJyZWFrOworCQl9CisJfQorCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKICNpZiAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9mYi5jIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfZmIuYwppbmRleCA5OWMwM2EyLi4wODRjMzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9mYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ZiLmMKQEAgLTQ0MSw2ICs0NDEsMTYgQEAKIAlpbmZvLT5zY3JlZW5fc2l6ZSA9IHNpemU7CiAJbWVtc2V0KGluZm8tPnNjcmVlbl9iYXNlLCAwLCBzaXplKTsKIAorCWlmIChkZXZfcHJpdi0+cGctPnN0b2xlbl9zaXplKSB7CisJCWluZm8tPmFwZXJ0dXJlcyA9IGFsbG9jX2FwZXJ0dXJlcygxKTsKKwkJaWYgKCFpbmZvLT5hcGVydHVyZXMpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9lcnIwOworCQl9CisJCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLmJhc2UgPSBkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2U7CisJCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLnNpemUgPSBkZXZfcHJpdi0+cGctPnN0b2xlbl9zaXplOworCX0KKwogCWRybV9mYl9oZWxwZXJfZmlsbF9maXgoaW5mbywgZmItPnBpdGNoLCBmYi0+ZGVwdGgpOwogCWRybV9mYl9oZWxwZXJfZmlsbF92YXIoaW5mbywgJmZiZGV2LT5wc2JfZmJfaGVscGVyLAogCQkJCXNpemVzLT5mYl93aWR0aCwgc2l6ZXMtPmZiX2hlaWdodCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9pbnRlbF9iaW9zLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9pbnRlbF9iaW9zLmMKaW5kZXggNDhhYzhiYS4uNDE3OTY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfaW50ZWxfYmlvcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ludGVsX2Jpb3MuYwpAQCAtMTU0LDEwICsxNTQsMTUgQEAKIAogCWZpbGxfZGV0YWlsX3RpbWluZ19kYXRhKHBhbmVsX2ZpeGVkX21vZGUsIGR2b190aW1pbmcpOwogCi0JZGV2X3ByaXYtPmxmcF9sdmRzX3ZidF9tb2RlID0gcGFuZWxfZml4ZWRfbW9kZTsKLQotCURSTV9ERUJVRygiRm91bmQgcGFuZWwgbW9kZSBpbiBCSU9TIFZCVCB0YWJsZXM6XG4iKTsKLQlkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKHBhbmVsX2ZpeGVkX21vZGUpOworCWlmIChwYW5lbF9maXhlZF9tb2RlLT5odG90YWwgPiAwICYmIHBhbmVsX2ZpeGVkX21vZGUtPnZ0b3RhbCA+IDApIHsKKwkJZGV2X3ByaXYtPmxmcF9sdmRzX3ZidF9tb2RlID0gcGFuZWxfZml4ZWRfbW9kZTsKKwkJRFJNX0RFQlVHKCJGb3VuZCBwYW5lbCBtb2RlIGluIEJJT1MgVkJUIHRhYmxlczpcbiIpOworCQlkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKHBhbmVsX2ZpeGVkX21vZGUpOworCX0gZWxzZSB7CisJCURSTV9ERUJVRygiSWdub3JpbmcgYm9ndXMgTFZEUyBWQlQgbW9kZS5cbiIpOworCQlkZXZfcHJpdi0+bHZkc192YnQgPSAwOworCQlrZnJlZShwYW5lbF9maXhlZF9tb2RlKTsKKwl9CiAKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9pbnRlbF9kaXNwbGF5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9pbnRlbF9kaXNwbGF5LmMKaW5kZXggNGY0N2QwOS4uMDllMzc4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfaW50ZWxfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ludGVsX2Rpc3BsYXkuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiB2b2lkIHBzYl9pbnRlbF93YWl0X2Zvcl92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAkvKiBXYWl0IGZvciAyMG1zLCBpLmUuIG9uZSBjeWNsZSBhdCA1MGh6LiAqLwotCXVkZWxheSgyMDAwMCk7CisJbWRlbGF5KDIwKTsKIH0KIAogaW50IHBzYl9pbnRlbF9waXBlX3NldF9iYXNlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl9tb3VzZS5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2X21vdXNlLmMKaW5kZXggMzU5ZTczNy4uYjMzMjRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X21vdXNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2X21vdXNlLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9oaWRkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSAiaHlwZXJ2LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi90b29scy9odl9rdnBfZGFlbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvdG9vbHMvaHZfa3ZwX2RhZW1vbi5jCmluZGV4IDMzZjBmMWMuLmE0YTQwN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi90b29scy9odl9rdnBfZGFlbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3Rvb2xzL2h2X2t2cF9kYWVtb24uYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nvbm5lY3Rvci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8aWZhZGRycy5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8c3lzbG9nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKaW5kZXggZjk2ZDViNS4uZDMyOTYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZwpAQCAtNCw3ICs0LDcgQEAKIAogbWVudWNvbmZpZyBJSU8KIAl0cmlzdGF0ZSAiSW5kdXN0cmlhbCBJL08gc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFTMzkwCisJZGVwZW5kcyBvbiBHRU5FUklDX0hBUkRJUlFTCiAJaGVscAogCSAgVGhlIGluZHVzdHJpYWwgSS9PIHN1YnN5c3RlbSBwcm92aWRlcyBhIHVuaWZpZWQgZnJhbWV3b3JrIGZvcgogCSAgZHJpdmVycyBmb3IgbWFueSBkaWZmZXJlbnQgdHlwZXMgb2YgZW1iZWRkZWQgc2Vuc29ycyB1c2luZyBhCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaAppbmRleCAwYjliODU0Li40Y2MxYTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxLmgKQEAgLTgxLDcgKzgxLDYgQEAKIAogaW50IGFkaXMxNjIwMV9zZXRfaXJxKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGJvb2wgZW5hYmxlKTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIGVudW0gYWRpczE2MjAxX3NjYW4gewogCUFESVMxNjIwMV9TQ0FOX1NVUFBMWSwKIAlBRElTMTYyMDFfU0NBTl9BQ0NfWCwKQEAgLTkyLDYgKzkxLDcgQEAKIAlBRElTMTYyMDFfU0NBTl9JTkNMSV9ZLAogfTsKIAorI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIHZvaWQgYWRpczE2MjAxX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkaXMxNjIwMV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaAppbmRleCA4YmI4Y2U1Li4xNzVlMjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzLmgKQEAgLTc2LDcgKzc2LDYgQEAKIAogaW50IGFkaXMxNjIwM19zZXRfaXJxKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGJvb2wgZW5hYmxlKTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIGVudW0gYWRpczE2MjAzX3NjYW4gewogCUFESVMxNjIwM19TQ0FOX1NVUFBMWSwKIAlBRElTMTYyMDNfU0NBTl9BVVhfQURDLApAQCAtODUsNiArODQsNyBAQAogCUFESVMxNjIwM19TQ0FOX0lOQ0xJX1ksCiB9OwogCisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogdm9pZCBhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MjAzX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNC5oCmluZGV4IDUzMTBhNDIuLjE2OTBjMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaApAQCAtODQsNyArODQsNiBAQAogCiBpbnQgYWRpczE2MjA0X3NldF9pcnEoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgYm9vbCBlbmFibGUpOwogCi0jaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogZW51bSBhZGlzMTYyMDRfc2NhbiB7CiAJQURJUzE2MjA0X1NDQU5fU1VQUExZLAogCUFESVMxNjIwNF9TQ0FOX0FDQ19YLApAQCAtOTMsNiArOTIsNyBAQAogCUFESVMxNjIwNF9TQ0FOX1RFTVAsCiB9OwogCisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogdm9pZCBhZGlzMTYyMDRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MjA0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOS5oCmluZGV4IDU4ZDA4ZGIuLjMxNTNjYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDkuaApAQCAtMTIxLDggKzEyMSw2IEBACiAKIGludCBhZGlzMTYyMDlfc2V0X2lycShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBib29sIGVuYWJsZSk7CiAKLSNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCi0KICNkZWZpbmUgQURJUzE2MjA5X1NDQU5fU1VQUExZCTAKICNkZWZpbmUgQURJUzE2MjA5X1NDQU5fQUNDX1gJMQogI2RlZmluZSBBRElTMTYyMDlfU0NBTl9BQ0NfWQkyCkBAIC0xMzIsNiArMTMwLDggQEAKICNkZWZpbmUgQURJUzE2MjA5X1NDQU5fSU5DTElfWQk2CiAjZGVmaW5lIEFESVMxNjIwOV9TQ0FOX1JPVAk3CiAKKyNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCisKIHZvaWQgYWRpczE2MjA5X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkaXMxNjIwOV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9tYXg1MTcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL21heDUxNy5jCmluZGV4IDg4MTc2OGQuLjJmZTM0ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL21heDUxNy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL21heDUxNy5jCkBAIC0xOTUsNyArMTk1LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbWF4NTE4X2luZm8gPSB7Ci0JLmF0dHJzID0gJm1heDUxN19hdHRyaWJ1dGVfZ3JvdXAsCisJLmF0dHJzID0gJm1heDUxOF9hdHRyaWJ1dGVfZ3JvdXAsCiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjAuaAppbmRleCA3MDJkYzk4Li4yNGJmNzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oCkBAIC0xMDQsNyArMTA0LDYgQEAKIAogaW50IGFkaXMxNjI2MF9zZXRfaXJxKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGJvb2wgZW5hYmxlKTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIC8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKICAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKICAqLwpAQCAtMTE1LDYgKzExNCw3IEBACiAjZGVmaW5lIEFESVMxNjI2MF9TQ0FOX1RFTVAJMwogI2RlZmluZSBBRElTMTYyNjBfU0NBTl9BTkdMCTQKIAorI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIHZvaWQgYWRpczE2MjYwX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkaXMxNjI2MF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMC5oCmluZGV4IGRiMTg0ZDEuLmU4NzcxNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMC5oCkBAIC0xNTgsNyArMTU4LDYgQEAKIAogaW50IGFkaXMxNjQwMF9zZXRfaXJxKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGJvb2wgZW5hYmxlKTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKIC8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKICAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKICAqLwpAQCAtMTgyLDYgKzE4MSw3IEBACiAjZGVmaW5lIEFESVMxNjMwMF9TQ0FOX0lOQ0xJX1gJMTIKICNkZWZpbmUgQURJUzE2MzAwX1NDQU5fSU5DTElfWQkxMwogCisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgogdm9pZCBhZGlzMTY0MDBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2NDAwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfcmluZy5jCmluZGV4IDI1ODlhN2UuLjM2MTIzNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3JpbmcuYwpAQCAtMTM3LDEzICsxMzcsMTMgQEAKIAkJaWYgKHN0LT52YXJpYW50LT5mbGFncyAmIEFESVMxNjQwMF9OT19CVVJTVCkgewogCQkJcmV0ID0gYWRpczE2MzUwX3NwaV9yZWFkX2FsbCgmaW5kaW9fZGV2LT5kZXYsIHN0LT5yeCk7CiAJCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OworCQkJCWdvdG8gZXJyOwogCQkJZm9yICg7IGkgPCByaW5nLT5zY2FuX2NvdW50OyBpKyspCiAJCQkJZGF0YVtpXQk9ICooczE2ICopKHN0LT5yeCArIGkqMik7CiAJCX0gZWxzZSB7CiAJCQlyZXQgPSBhZGlzMTY0MDBfc3BpX3JlYWRfYnVyc3QoJmluZGlvX2Rldi0+ZGV2LCBzdC0+cngpOwogCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKKwkJCQlnb3RvIGVycjsKIAkJCWZvciAoOyBpIDwgaW5kaW9fZGV2LT5yaW5nLT5zY2FuX2NvdW50OyBpKyspIHsKIAkJCQlqID0gX19mZnMobWFzayk7CiAJCQkJbWFzayAmPSB+KDEgPDwgaik7CkBAIC0xNTgsOSArMTU4LDEzIEBACiAJcmluZy0+YWNjZXNzLT5zdG9yZV90byhpbmRpb19kZXYtPnJpbmcsICh1OCAqKSBkYXRhLCBwZi0+dGltZXN0YW1wKTsKIAogCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7Ci0Ja2ZyZWUoZGF0YSk7CiAKKwlrZnJlZShkYXRhKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK2VycjoKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGFkaXMxNjQwMF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMKaW5kZXggNjE1OTAyMy4uZDUwNGFhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYwpAQCAtMjk0LDYgKzI5NCw3IEBACiAJcGYtPmggPSBoOwogCXBmLT50aHJlYWQgPSB0aHJlYWQ7CiAJcGYtPnR5cGUgPSB0eXBlOworCXBmLT5wcml2YXRlX2RhdGEgPSBwcml2YXRlOwogCiAJcmV0dXJuIHBmOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19pbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2ltb24uYwppbmRleCA0MDM5ZWRhLi40YTllNTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2ltb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2ltb24uYwpAQCAtNjcyLDggKzY3Miw2IEBACiBzdGF0aWMgdm9pZCB1c2JfcnhfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBpbW9uX2NvbnRleHQgKmNvbnRleHQ7Ci0JdW5zaWduZWQgY2hhciAqYnVmOwotCWludCBsZW47CiAJaW50IGludGZudW0gPSAwOwogCiAJaWYgKCF1cmIpCkBAIC02ODMsOSArNjgxLDYgQEAKIAlpZiAoIWNvbnRleHQpCiAJCXJldHVybjsKIAotCWJ1ZiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotCWxlbiA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKLQogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKIAljYXNlIC1FTk9FTlQ6CQkvKiB1c2Jjb3JlIHVubGluayBzdWNjZXNzZnVsISAqLwogCQlyZXR1cm47CkBAIC03MjgsNyArNzIzLDYgQEAKIAlpbnQgaXJfZXBfZm91bmQgPSAwOwogCWludCBhbGxvY19zdGF0dXMgPSAwOwogCWludCB2ZmRfcHJvdG9fNnAgPSAwOwotCWludCBjb2RlX2xlbmd0aDsKIAlzdHJ1Y3QgaW1vbl9jb250ZXh0ICpjb250ZXh0ID0gTlVMTDsKIAlpbnQgaTsKIAl1MTYgdmVuZG9yLCBwcm9kdWN0OwpAQCAtNzQ5LDggKzc0Myw2IEBACiAJZWxzZQogCQljb250ZXh0LT5kaXNwbGF5ID0gMTsKIAotCWNvZGVfbGVuZ3RoID0gQlVGX0NIVU5LX1NJWkUgKiA4OwotCiAJdXNiZGV2ICAgICA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CiAJaWZhY2VfZGVzYyA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CiAJbnVtX2VuZHB0cyA9IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsKQEAgLTg1Niw3ICs4NDgsNyBAQAogCiAJc3RyY3B5KGRyaXZlci0+bmFtZSwgTU9EX05BTUUpOwogCWRyaXZlci0+bWlub3IgPSAtMTsKLQlkcml2ZXItPmNvZGVfbGVuZ3RoID0gc2l6ZW9mKGludCkgKiA4OworCWRyaXZlci0+Y29kZV9sZW5ndGggPSBCVUZfQ0hVTktfU0laRSAqIDg7CiAJZHJpdmVyLT5zYW1wbGVfcmF0ZSA9IDA7CiAJZHJpdmVyLT5mZWF0dXJlcyA9IExJUkNfQ0FOX1JFQ19NT0RFMjsKIAlkcml2ZXItPmRhdGEgPSBjb250ZXh0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zZXJpYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2VyaWFsLmMKaW5kZXggNGEzY2NhMC4uODA1ZGY5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zZXJpYWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3NlcmlhbC5jCkBAIC04MzgsNyArODM4LDIzIEBACiAKIHN0YXRpYyBpbnQgaW5pdF9wb3J0KHZvaWQpCiB7Ci0JaW50IGksIG5sb3csIG5oaWdoOworCWludCBpLCBubG93LCBuaGlnaCwgcmVzdWx0OworCisJcmVzdWx0ID0gcmVxdWVzdF9pcnEoaXJxLCBpcnFfaGFuZGxlciwKKwkJCSAgICAgSVJRRl9ESVNBQkxFRCB8IChzaGFyZV9pcnEgPyBJUlFGX1NIQVJFRCA6IDApLAorCQkJICAgICBMSVJDX0RSSVZFUl9OQU1FLCAodm9pZCAqKSZoYXJkd2FyZSk7CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgLUVCVVNZOgorCQlwcmludGsoS0VSTl9FUlIgTElSQ19EUklWRVJfTkFNRSAiOiBJUlEgJWQgYnVzeVxuIiwgaXJxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwljYXNlIC1FSU5WQUw6CisJCXByaW50ayhLRVJOX0VSUiBMSVJDX0RSSVZFUl9OQU1FCisJCSAgICAgICAiOiBCYWQgaXJxIG51bWJlciBvciBoYW5kbGVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKIAogCS8qIFJlc2VydmUgaW8gcmVnaW9uLiAqLwogCS8qCkBAIC04OTMsMzQgKzkwOSwxNyBAQAogCQlwcmludGsoS0VSTl9JTkZPIExJUkNfRFJJVkVSX05BTUUgICI6IE1hbnVhbGx5IHVzaW5nIGFjdGl2ZSAiCiAJCSAgICAgICAiJXMgcmVjZWl2ZXJcbiIsIHNlbnNlID8gImxvdyIgOiAiaGlnaCIpOwogCisJZHByaW50aygiSW50ZXJydXB0ICVkLCBwb3J0ICUwNHggb2J0YWluZWRcbiIsIGlycSwgaW8pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNldF91c2VfaW5jKHZvaWQgKmRhdGEpCiB7Ci0JaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogaW5pdGlhbGl6ZSB0aW1lc3RhbXAgKi8KIAlkb19nZXR0aW1lb2ZkYXkoJmxhc3R0dik7CiAKLQlyZXN1bHQgPSByZXF1ZXN0X2lycShpcnEsIGlycV9oYW5kbGVyLAotCQkJICAgICBJUlFGX0RJU0FCTEVEIHwgKHNoYXJlX2lycSA/IElSUUZfU0hBUkVEIDogMCksCi0JCQkgICAgIExJUkNfRFJJVkVSX05BTUUsICh2b2lkICopJmhhcmR3YXJlKTsKLQotCXN3aXRjaCAocmVzdWx0KSB7Ci0JY2FzZSAtRUJVU1k6Ci0JCXByaW50ayhLRVJOX0VSUiBMSVJDX0RSSVZFUl9OQU1FICI6IElSUSAlZCBidXN5XG4iLCBpcnEpOwotCQlyZXR1cm4gLUVCVVNZOwotCWNhc2UgLUVJTlZBTDoKLQkJcHJpbnRrKEtFUk5fRVJSIExJUkNfRFJJVkVSX05BTUUKLQkJICAgICAgICI6IEJhZCBpcnEgbnVtYmVyIG9yIGhhbmRsZXJcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQlkZWZhdWx0OgotCQlkcHJpbnRrKCJJbnRlcnJ1cHQgJWQsIHBvcnQgJTA0eCBvYnRhaW5lZFxuIiwgaXJxLCBpbyk7Ci0JCWJyZWFrOwotCX0KLQogCXNwaW5fbG9ja19pcnFzYXZlKCZoYXJkd2FyZVt0eXBlXS5sb2NrLCBmbGFncyk7CiAKIAkvKiBTZXQgRExBQiAwLiAqLwpAQCAtOTQ1LDEwICs5NDQsNiBAQAogCXNvdXRwKFVBUlRfSUVSLCBzaW5wKFVBUlRfSUVSKSAmCiAJICAgICAgKH4oVUFSVF9JRVJfTVNJfFVBUlRfSUVSX1JMU0l8VUFSVF9JRVJfVEhSSXxVQVJUX0lFUl9SREkpKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFyZHdhcmVbdHlwZV0ubG9jaywgZmxhZ3MpOwotCi0JZnJlZV9pcnEoaXJxLCAodm9pZCAqKSZoYXJkd2FyZSk7Ci0KLQlkcHJpbnRrKCJmcmVlZCBJUlEgJWRcbiIsIGlycSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxpcmNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKQEAgLTEyNTYsNiArMTI1MSw5IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgbGlyY19zZXJpYWxfZXhpdF9tb2R1bGUodm9pZCkKIHsKIAlsaXJjX3NlcmlhbF9leGl0KCk7CisKKwlmcmVlX2lycShpcnEsICh2b2lkICopJmhhcmR3YXJlKTsKKwogCWlmIChpb21tYXAgIT0gMCkKIAkJcmVsZWFzZV9tZW1fcmVnaW9uKGlvbW1hcCwgOCA8PCBpb3NoaWZ0KTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3Npci5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zaXIuYwppbmRleCBhN2I0NmYyLi4wZDM4NjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3Npci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2lyLmMKQEAgLTczOSwyMyArNzM5LDE2IEBACiBzdGF0aWMgdm9pZCBzZW5kX3B1bHNlKHVuc2lnbmVkIGxvbmcgbGVuKQogewogCWxvbmcgYnl0ZXNfb3V0ID0gbGVuIC8gVElNRV9DT05TVDsKLQlsb25nIHRpbWVfbGVmdDsKIAotCXRpbWVfbGVmdCA9IChsb25nKWxlbiAtIChsb25nKWJ5dGVzX291dCAqIChsb25nKVRJTUVfQ09OU1Q7Ci0JaWYgKGJ5dGVzX291dCA9PSAwKSB7CisJaWYgKGJ5dGVzX291dCA9PSAwKQogCQlieXRlc19vdXQrKzsKLQkJdGltZV9sZWZ0ID0gMDsKLQl9CisKIAl3aGlsZSAoYnl0ZXNfb3V0LS0pIHsKIAkJb3V0YihQVUxTRSwgaW8gKyBVQVJUX1RYKTsKIAkJLyogRklYTUUgdHJlYmEgc2VyaW96bmUgY2FrYW5pZSB6IGNoYXIvc2VyaWFsLmMgKi8KIAkJd2hpbGUgKCEoaW5iKGlvICsgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEhSRSkpCiAJCQk7CiAJfQotI2lmIDAKLQlpZiAodGltZV9sZWZ0ID4gMCkKLQkJc2FmZV91ZGVsYXkodGltZV9sZWZ0KTsKLSNlbmRpZgogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfemlsb2cuYyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfemlsb2cuYwppbmRleCBkZDZhNTdjLi40ZTA1MWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3ppbG9nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY196aWxvZy5jCkBAIC00NzUsMTQgKzQ3NSwxNCBAQAogCWRwcmludGsoInBvbGwgdGhyZWFkIHN0YXJ0ZWRcbiIpOwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwogCQkvKiBpZiBkZXZpY2Ugbm90IG9wZW5lZCwgd2UgY2FuIHNsZWVwIGhhbGYgYSBzZWNvbmQgKi8KIAkJaWYgKGF0b21pY19yZWFkKCZpci0+b3Blbl9jb3VudCkgPT0gMCkgewogCQkJc2NoZWR1bGVfdGltZW91dChIWi8yKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQogCQkvKgogCQkgKiBUaGlzIGlzIH4xMTMqMiArIDI0ICsgaml0dGVyICgyKnJlcGVhdCBnYXAgKyBjb2RlIGxlbmd0aCkuCiAJCSAqIFdlIHVzZSB0aGlzIGludGVydmFsIGFzIHRoZSBjaGlwIHJlc2V0cyBldmVyeSB0aW1lIHlvdSBwb2xsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpL2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWkvaW5pdC5jCmluZGV4IDI4MTg4NTEuLjY4NWZjZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWkvaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWkvaW5pdC5jCkBAIC0xODksNyArMTg5LDcgQEAKIAkJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiAJfQogCi0JaWYgKCFlcnIgJiYgIWRldi0+cmVjdmRfbXNnKSB7CisJaWYgKGVyciA8PSAwICYmICFkZXYtPnJlY3ZkX21zZykgewogCQlkZXYtPm1laV9zdGF0ZSA9IE1FSV9ESVNBQkxFRDsKIAkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsCiAJCQkid2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQgZmFpbGVkIgpAQCAtMjA1LDEwICsyMDUsMTAgQEAKIAkJCSJob3N0X2h3X3N0YXRlID0gMHglMDh4LCBtZV9od19zdGF0ZSA9IDB4JTA4eC5cbiIsCiAJCQlkZXYtPmhvc3RfaHdfc3RhdGUsIGRldi0+bWVfaHdfc3RhdGUpOwogCi0JCWlmICghKGRldi0+aG9zdF9od19zdGF0ZSAmIEhfUkRZKSAhPSBIX1JEWSkKKwkJaWYgKCEoZGV2LT5ob3N0X2h3X3N0YXRlICYgSF9SRFkpKQogCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJob3N0IHR1cm4gb2ZmIEhfUkRZLlxuIik7CiAKLQkJaWYgKCEoZGV2LT5tZV9od19zdGF0ZSAmIE1FX1JEWV9IUkEpICE9IE1FX1JEWV9IUkEpCisJCWlmICghKGRldi0+bWVfaHdfc3RhdGUgJiBNRV9SRFlfSFJBKSkKIAkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiTUUgdHVybiBvZmYgTUVfUkRZLlxuIik7CiAKIAkJcHJpbnRrKEtFUk5fRVJSICJtZWk6IGxpbmsgbGF5ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpL3dkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpL3dkLmMKaW5kZXggMjU2NGIwMy4uZmZmNTNkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21laS93ZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWkvd2QuYwpAQCAtMTY5LDEwICsxNjksMTUgQEAKIAlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndhaXRfc3RvcF93ZCwKIAkJCQkJZGV2LT53ZF9zdG9wcGVkLCAxMCAqIEhaKTsKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKLQlpZiAoIWRldi0+d2Rfc3RvcHBlZCkKLQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJzdG9wIHdkIGZhaWxlZCB0byBjb21wbGV0ZS5cbiIpOwotCWVsc2UKLQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJzdG9wIHdkIGNvbXBsZXRlLlxuIik7CisJaWYgKGRldi0+d2Rfc3RvcHBlZCkgeworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInN0b3Agd2QgY29tcGxldGUgcmV0PSVkLlxuIiwgcmV0KTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlpZiAoIXJldCkKKwkJCXJldCA9IC1FVElNRURPVVQ7CisJCWRldl93YXJuKCZkZXYtPnBkZXYtPmRldiwKKwkJCSJzdG9wIHdkIGZhaWxlZCB0byBjb21wbGV0ZSByZXQ9JWQuXG4iLCByZXQpOworCX0KIAogCWlmIChwcmVzZXJ2ZSkKIAkJZGV2LT53ZF90aW1lb3V0ID0gd2RfdGltZW91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMuYwppbmRleCAxYTk0MzY0Li43MjI1OGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSAibnZlYy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL0tjb25maWcKaW5kZXggYjA1MzA2Ny4uZmU0MGUwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vS2NvbmZpZwpAQCAtMiw2ICsyLDcgQEAKIAl0cmlzdGF0ZSAiT25lIExhcHRvcCBQZXIgQ2hpbGQgRGlzcGxheSBDT050cm9sbGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBPTFBDICYmIEZCCiAJc2VsZWN0IEkyQworCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJLS0taGVscC0tLQogCSAgQWRkIHN1cHBvcnQgZm9yIHRoZSBPTFBDIFhPIERDT04gY29udHJvbGxlci4gIFRoaXMgY29udHJvbGxlciBpcwogCSAgb25seSBhdmFpbGFibGUgb24gT0xQQyBwbGF0Zm9ybXMuICAgVW5sZXNzIHlvdSBoYXZlIG9uZSBvZiB0aGVzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL2NyeXB0by5jIGIvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL2NyeXB0by5jCmluZGV4IDVjY2EyNGYuLmFkOTI3NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9jcnlwdG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvY3J5cHRvLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgIm5ldGZzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvZGlyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvZGlyLmMKaW5kZXggOTczMmE5Ni4uNzU5OGU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL2Rpci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9kaXIuYwpAQCAtNTEyLDcgKzUxMiw3IEBACiAJaW50IGVyciwgbG9ja190eXBlID0gUE9ITUVMRlNfUkVBRF9MT0NLLCBuZWVkX2xvY2sgPSAxOwogCXN0cnVjdCBxc3RyIHN0ciA9IGRlbnRyeS0+ZF9uYW1lOwogCi0JaWYgKChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0FDQ01PREUpID4gMSkKKwlpZiAoKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFkpCiAJCWxvY2tfdHlwZSA9IFBPSE1FTEZTX1dSSVRFX0xPQ0s7CiAKIAlpZiAodGVzdF9iaXQoTkVURlNfSU5PREVfT1dORUQsICZwYXJlbnQtPnN0YXRlKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL2lub2RlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvaW5vZGUuYwppbmRleCBjMGYwYWM3Li5mM2M2MDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvaW5vZGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvaW5vZGUuYwpAQCAtODg3LDExICs4ODcsMTYgQEAKIC8qCiAgKiBXZSB3YW50IGZzeW5jKCkgdG8gd29yayBvbiBQT0hNRUxGUy4KICAqLwotc3RhdGljIGludCBwb2htZWxmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQorc3RhdGljIGludCBwb2htZWxmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKLQotCXJldHVybiBzeW5jX2lub2RlX21ldGFkYXRhKGlub2RlLCAxKTsKKwlpbnQgZXJyID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAoIWVycikgeworCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJCWVyciA9IHN5bmNfaW5vZGVfbWV0YWRhdGEoaW5vZGUsIDEpOworCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwl9CisJcmV0dXJuIGVycjsKIH0KIAogc3NpemVfdCBwb2htZWxmc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKaW5kZXggMTZhYTZhOC4uNDM4NGQ5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjZGVmaW5lIEtFWV9UWVBFX05BCQkweDAKICNkZWZpbmUgS0VZX1RZUEVfV0VQNDAgCQkweDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IDczNmExNDAuLjAwZWUwMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSAiZG90MTFkLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmgKaW5kZXggZDE1YmRmNi4uYTJjNDZhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaApAQCAtMTgsNiArMTgsNyBAQAogI2lmbmRlZiBSODE4MEgKICNkZWZpbmUgUjgxODBICiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2RlZmluZSBSVEw4MTgwX01PRFVMRV9OQU1FICJyODE4MCIKICNkZWZpbmUgRE1FU0coeCxhLi4uKSBwcmludGsoS0VSTl9JTkZPIFJUTDgxODBfTU9EVUxFX05BTUUgIjogIiB4ICJcbiIsICMjIGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCmluZGV4IDIxNTVhNzcuLjRjNjY1MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvZWVwcm9tXzkzY3g2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNpbmNsdWRlICJyODE4MF9ody5oIgogI2luY2x1ZGUgInI4MTgwLmgiCkBAIC0zMDYsNyArMzA3LDcgQEAKIHZvaWQgcnRsODE4MF9wcm9jX21vZHVsZV9pbml0KHZvaWQpCiB7CiAJRE1FU0coIkluaXRpYWxpemluZyBwcm9jIGZpbGVzeXN0ZW0iKTsKLQlydGw4MTgwX3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeShSVEw4MTgwX01PRFVMRV9OQU1FLCBTX0lGRElSLCBpbml0X25ldC5wcm9jX25ldCk7CisJcnRsODE4MF9wcm9jID0gcHJvY19ta2RpcihSVEw4MTgwX01PRFVMRV9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7CiB9CiAKIHZvaWQgcnRsODE4MF9wcm9jX21vZHVsZV9yZW1vdmUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMS5oCmluZGV4IGRiZTIxYWIuLjgyYmM1OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKaW5kZXggNjYzYjBiOC4uYzI5MDFiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKQEAgLTMxMSw3ICszMTEsNyBAQAogCX0KIAogCWllZWU4MDIxMV9kZWJ1Z19sZXZlbCA9IGRlYnVnOwotCWllZWU4MDIxMV9wcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoRFJWX05BTUUsIFNfSUZESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKKwlpZWVlODAyMTFfcHJvYyA9IHByb2NfbWtkaXIoRFJWX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKIAlpZiAoaWVlZTgwMjExX3Byb2MgPT0gTlVMTCkgewogCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgIiBEUlZfTkFNRQogCQkJCSIgcHJvYyBkaXJlY3RvcnlcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRS5oCmluZGV4IDAyMjkwMzEuLjg5ZmU4ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFLmgKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSAiaWVlZTgwMjExL3J0bDgxOXhfSFQuaCIKICNpbmNsdWRlICJpZWVlODAyMTEvaWVlZTgwMjExLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY29yZS5jCmluZGV4IDU4ZDgwMGYuLjg1NTA3OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY29yZS5jCkBAIC0yNyw2ICsyNyw4IEBACiAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgInI4MTkyRV9ody5oIgogI2luY2x1ZGUgInI4MTkyRS5oIgpAQCAtNTA2LDcgKzUwOCw3IEBACiBzdGF0aWMgdm9pZCBydGw4MTkyX3Byb2NfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlSVF9UUkFDRShDT01QX0lOSVQsICJJbml0aWFsaXppbmcgcHJvYyBmaWxlc3lzdGVtXG4iKTsKLQlydGw4MTkyX3Byb2M9Y3JlYXRlX3Byb2NfZW50cnkoUlRMODE5eEVfTU9EVUxFX05BTUUsIFNfSUZESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKKwlydGw4MTkyX3Byb2MgPSBwcm9jX21rZGlyKFJUTDgxOXhFX01PRFVMRV9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7CiB9CiAKIApAQCAtNTM4LDkgKzU0MCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmllZWU4MDIxMS0+ZGV2OwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKIAotCXByaXYtPmRpcl9kZXYgPSBjcmVhdGVfcHJvY19lbnRyeShkZXYtPm5hbWUsCi0JCQkJCSAgU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPLAotCQkJCQkgIHJ0bDgxOTJfcHJvYyk7CisJcHJpdi0+ZGlyX2RldiA9IHByb2NfbWtkaXIoZGV2LT5uYW1lLCBydGw4MTkyX3Byb2MpOwogCWlmICghcHJpdi0+ZGlyX2RldikgewogCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC9ydGw4MTkyLyVzXG4iLAogCQkgICAgICBkZXYtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKaW5kZXggZTcxNmY3Yi4uMjMzMzI1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwppbmRleCBmZTk3OGYzLi5kMzE1YjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpAQCAtMjgzLDcgKzI4Myw3IEBACiAKIAlpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSBkZWJ1ZzsKIAotCWllZWU4MDIxMV9wcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoRFJWX05BTUUsIFNfSUZESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKKwlpZWVlODAyMTFfcHJvYyA9IHByb2NfbWtkaXIoRFJWX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKIAlpZiAoaWVlZTgwMjExX3Byb2MgPT0gTlVMTCkgewogCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgIiBEUlZfTkFNRQogCQkJCSIgcHJvYyBkaXJlY3RvcnlcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwppbmRleCBlODFiOGFiLi42YTFiNWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwpAQCAtNjcxLDcgKzY3MSw3IEBACiB2b2lkIHJ0bDgxOTJfcHJvY19tb2R1bGVfaW5pdCh2b2lkKQogewogCVJUX1RSQUNFKENPTVBfSU5JVCwgIkluaXRpYWxpemluZyBwcm9jIGZpbGVzeXN0ZW0iKTsKLQlydGw4MTkyX3Byb2M9Y3JlYXRlX3Byb2NfZW50cnkoUlRMODE5eFVfTU9EVUxFX05BTUUsIFNfSUZESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKKwlydGw4MTkyX3Byb2MgPSBwcm9jX21rZGlyKFJUTDgxOXhVX01PRFVMRV9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7CiB9CiAKIApAQCAtNzA2LDkgKzcwNiw3IEBACiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplOwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlwcml2LT5kaXJfZGV2ID0gY3JlYXRlX3Byb2NfZW50cnkoZGV2LT5uYW1lLAotCQkJCQkgIFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTywKLQkJCQkJICBydGw4MTkyX3Byb2MpOworCXByaXYtPmRpcl9kZXYgPSBwcm9jX21rZGlyKGRldi0+bmFtZSwgcnRsODE5Ml9wcm9jKTsKIAlpZiAoIXByaXYtPmRpcl9kZXYpIHsKIAkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvcnRsODE5Mi8lc1xuIiwKIAkJICAgICAgZGV2LT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2Rydl90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvZHJ2X3R5cGVzLmgKaW5kZXggM2JiNjZkYy4uNGYzODBhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvZHJ2X3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvZHJ2X3R5cGVzLmgKQEAgLTI5LDcgKzI5LDYgQEAKIAogI2luY2x1ZGUgInJ0bDg3MXhfaHQuaCIKICNpbmNsdWRlICJydGw4NzF4X2NtZC5oIgotI2luY2x1ZGUgIndsYW5fYnNzZGVmLmgiCiAjaW5jbHVkZSAicnRsODcxeF94bWl0LmgiCiAjaW5jbHVkZSAicnRsODcxeF9yZWN2LmgiCiAjaW5jbHVkZSAicnRsODcxeF9zZWN1cml0eS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCmluZGV4IDNkM2Y3M2MuLjUwNTM5NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3NkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3NkLmMKaW5kZXggYmRkYjAzMS4uY2RhZTQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9zZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3Ivc2QuYwpAQCAtMjMyOCw3ICsyMzI4LDcgQEAKIAogCQkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBJT19TRU5EX09QX0NPTkQsIDAsIFNEX1JTUF9UWVBFX1I0LCByc3AsIDUpOwogCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCWludCBmdW5jX251bSA9IChyc3BbMV0gPj4gNCkgJiYgMHgwNzsKKwkJCQlpbnQgZnVuY19udW0gPSAocnNwWzFdID4+IDQpICYgMHgwNzsKIAkJCQlpZiAoZnVuY19udW0pIHsKIAkJCQkJUlRTWF9ERUJVR1AoIlNEX0lPIGNhcmQgKEZ1bmN0aW9uIG51bWJlcjogJWQpIVxuIiwgZnVuY19udW0pOwogCQkJCQljaGlwLT5zZF9pbyA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jCmluZGV4IDUyMzQyYzEuLjg0OGI0YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jCkBAIC01MCw3ICs1MCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9yYXJfcmVnaXN0ZXIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKaW5kZXggNmU5OWVjOC4uOGNiZWE0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKQEAgLTI2LDYgKzI2LDggQEAKIHN0YXRpYyBpbnQgc3R1Yl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAogCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwogc3RhdGljIHZvaWQgc3R1Yl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworc3RhdGljIGludCBzdHViX3ByZV9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKK3N0YXRpYyBpbnQgc3R1Yl9wb3N0X3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOwogCiAvKgogICogRGVmaW5lIGRldmljZSBJRHMgaGVyZSBpZiB5b3Ugd2FudCB0byBleHBsaWNpdGx5IGxpbWl0IGV4cG9ydGFibGUgZGV2aWNlcy4KQEAgLTU5LDYgKzYxLDggQEAKIAkucHJvYmUJCT0gc3R1Yl9wcm9iZSwKIAkuZGlzY29ubmVjdAk9IHN0dWJfZGlzY29ubmVjdCwKIAkuaWRfdGFibGUJPSBzdHViX3RhYmxlLAorCS5wcmVfcmVzZXQJPSBzdHViX3ByZV9yZXNldCwKKwkucG9zdF9yZXNldAk9IHN0dWJfcG9zdF9yZXNldCwKIH07CiAKIC8qCkBAIC01NDEsMyArNTQ1LDIwIEBACiAJCWRlbF9tYXRjaF9idXNpZCgoY2hhciAqKXVkZXZfYnVzaWQpOwogCX0KIH0KKworLyogCisgKiBQcmVzZW5jZSBvZiBwcmVfcmVzZXQgYW5kIHBvc3RfcmVzZXQgcHJldmVudHMgdGhlIGRyaXZlciBmcm9tIGJlaW5nIHVuYm91bmQKKyAqIHdoZW4gdGhlIGRldmljZSBpcyBiZWluZyByZXNldAorICovCisgCitpbnQgc3R1Yl9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgInByZV9yZXNldFxuIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzdHViX3Bvc3RfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgInBvc3RfcmVzZXRcbiIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKaW5kZXggYTVjMWZhMS4uYmM1Nzg0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCkBAIC0xNzUsMTYgKzE3NSwxOCBAQAogCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LCAidXNiX3F1ZXVlX3Jlc2V0X2RldmljZVxuIik7CiAKIAkvKgotCSAqIHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQgY2F1c2VkIGEgZGVhZGxvY2s6IGl0IGNhdXNlcyB0aGUgZHJpdmVyCi0JICogdG8gdW5iaW5kLiBJbiB0aGUgc2h1dGRvd24gdGhlIHJ4IHRocmVhZCBpcyBzaWduYWxsZWQgdG8gc2h1dCBkb3duCi0JICogYnV0IHRoaXMgdGhyZWFkIGlzIHBlbmRpbmcgaW4gdGhlIHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQuCi0JICoKLQkgKiBJbnN0ZWFkIHF1ZXVlIHRoZSByZXNldC4KLQkgKgotCSAqIFVuZm9ydHVuYXRseSBhbiBleGlzdGluZyB1c2JpcCBjb25uZWN0aW9uIHdpbGwgYmUgZHJvcHBlZCBkdWUgdG8KLQkgKiBkcml2ZXIgdW5iaW5kaW5nLgorCSAqIFdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHByZV9yZXNldCBhbmQgcG9zdF9yZXNldCB0aGUgZHJpdmVyIG5vIAorCSAqIGxvbmdlciB1bmJpbmRzLiBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIHN5bmNocm9ub3VzIHJlc2V0LgogCSAqLwotCXVzYl9xdWV1ZV9yZXNldF9kZXZpY2Uoc2Rldi0+aW50ZXJmYWNlKTsKKworCWlmICh1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHNkZXYtPnVkZXYsIHNkZXYtPmludGVyZmFjZSk8MCkKKwl7CisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICJjb3VsZCBub3Qgb2J0YWluIGxvY2sgdG8gcmVzZXQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXVzYl9yZXNldF9kZXZpY2Uoc2Rldi0+dWRldik7CisJdXNiX3VubG9ja19kZXZpY2Uoc2Rldi0+dWRldik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXRpbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3V0aWxzLmgKaW5kZXggNmMyOWFlOS4uOTkxZjY2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXRpbHMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91dGlscy5oCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8Z2xpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2ludGVybmFsLmgKaW5kZXggY2QxMjliMy4uZTg2YWFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9pbnRlcm5hbC5oCkBAIC05OTAsMTQgKzk5MCw3IEBACiAjZW5kaWYgLy8gVVNFX1dEUwogfTsgLy8gd2xfcHJpdmF0ZQogCi0jaWZkZWYgSEFWRV9ORVRERVZfUFJJVgogI2RlZmluZSB3bF9wcml2KGRldikgKChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKSBuZXRkZXZfcHJpdihkZXYpKQotI2Vsc2UKLWV4dGVybiBpbmxpbmUgc3RydWN0IHdsX3ByaXZhdGUgKndsX3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICByZXR1cm4gZGV2LT5wcml2OwotfQotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIExvY2tpbmcgYW5kIHN5bmNocm9uaXphdGlvbiBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL0tjb25maWcgYi9kcml2ZXJzL3RhcmdldC9sb29wYmFjay9LY29uZmlnCmluZGV4IDU3ZGNiYzIuLmFiZThlY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL0tjb25maWcKKysrIGIvZHJpdmVycy90YXJnZXQvbG9vcGJhY2svS2NvbmZpZwpAQCAtMyw5ICszLDMgQEAKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgVENNIFZpcnR1YWwgU0FTIHRhcmdldCBhbmQgTGludXgvU0NTSSBMTEQKIAkgIGZhYnJpYyBsb29wYmFjayBtb2R1bGUuCi0KLWNvbmZpZyBMT09QQkFDS19UQVJHRVRfQ0RCX0RFQlVHCi0JYm9vbCAiVENNIGxvb3BiYWNrIGZhYnJpYyBtb2R1bGUgQ0RCIGRlYnVnIGNvZGUiCi0JZGVwZW5kcyBvbiBMT09QQkFDS19UQVJHRVQKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgVENNIGxvb3BiYWNrIGZhYnJpYyBtb2R1bGUgQ0RCIGRlYnVnIGNvZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMgYi9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jCmluZGV4IGRlZTJhMmMuLmFhMmQ2Nzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgotI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KIAogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9iYXNlLmg+CiAjaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5oPgpAQCAtODAsNyArNzksNyBAQAogCiAJdGxfY21kID0ga21lbV9jYWNoZV96YWxsb2ModGNtX2xvb3BfY21kX2NhY2hlLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXRsX2NtZCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgdGNtX2xvb3BfY21kXG4iKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHRjbV9sb29wX2NtZFxuIik7CiAJCXNldF9ob3N0X2J5dGUoc2MsIERJRF9FUlJPUik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTExOCwxNyArMTE3LDE2IEBACiAJICogU2lnbmFsIEJJREkgdXNhZ2Ugd2l0aCBUX1RBU0soY21kKS0+dF90YXNrc19iaWRpCiAJICovCiAJaWYgKHNjc2lfYmlkaV9jbW5kKHNjKSkKLQkJVF9UQVNLKHNlX2NtZCktPnRfdGFza3NfYmlkaSA9IDE7CisJCXNlX2NtZC0+dF90YXNrc19iaWRpID0gMTsKIAkvKgogCSAqIExvY2F0ZSB0aGUgc3RydWN0IHNlX2x1biBwb2ludGVyIGFuZCBhdHRhY2ggaXQgdG8gc3RydWN0IHNlX2NtZAogCSAqLwotCWlmICh0cmFuc3BvcnRfZ2V0X2x1bl9mb3JfY21kKHNlX2NtZCwgTlVMTCwgdGxfY21kLT5zYy0+ZGV2aWNlLT5sdW4pIDwgMCkgeworCWlmICh0cmFuc3BvcnRfbG9va3VwX2NtZF9sdW4oc2VfY21kLCB0bF9jbWQtPnNjLT5kZXZpY2UtPmx1bikgPCAwKSB7CiAJCWttZW1fY2FjaGVfZnJlZSh0Y21fbG9vcF9jbWRfY2FjaGUsIHRsX2NtZCk7CiAJCXNldF9ob3N0X2J5dGUoc2MsIERJRF9OT19DT05ORUNUKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JdHJhbnNwb3J0X2RldmljZV9zZXR1cF9jbWQoc2VfY21kKTsKIAlyZXR1cm4gc2VfY21kOwogfQogCkBAIC0xNDMsMTcgKzE0MSwxNyBAQAogCXN0cnVjdCB0Y21fbG9vcF9jbWQgKnRsX2NtZCA9IGNvbnRhaW5lcl9vZihzZV9jbWQsCiAJCQkJc3RydWN0IHRjbV9sb29wX2NtZCwgdGxfc2VfY21kKTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpzYyA9IHRsX2NtZC0+c2M7Ci0Jdm9pZCAqbWVtX3B0ciwgKm1lbV9iaWRpX3B0ciA9IE5VTEw7Ci0JdTMyIHNnX25vX2JpZGkgPSAwOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsX2JpZGkgPSBOVUxMOworCXUzMiBzZ2xfYmlkaV9jb3VudCA9IDA7CiAJaW50IHJldDsKIAkvKgogCSAqIEFsbG9jYXRlIHRoZSBuZWNlc3NhcnkgdGFza3MgdG8gY29tcGxldGUgdGhlIHJlY2VpdmVkIENEQitkYXRhCiAJICovCi0JcmV0ID0gdHJhbnNwb3J0X2dlbmVyaWNfYWxsb2NhdGVfdGFza3Moc2VfY21kLCB0bF9jbWQtPnNjLT5jbW5kKTsKLQlpZiAocmV0ID09IC0xKSB7CisJcmV0ID0gdHJhbnNwb3J0X2dlbmVyaWNfYWxsb2NhdGVfdGFza3Moc2VfY21kLCBzYy0+Y21uZCk7CisJaWYgKHJldCA9PSAtRU5PTUVNKSB7CiAJCS8qIE91dCBvZiBSZXNvdXJjZXMgKi8KIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOwotCX0gZWxzZSBpZiAocmV0ID09IC0yKSB7CisJfSBlbHNlIGlmIChyZXQgPT0gLUVJTlZBTCkgewogCQkvKgogCQkgKiBIYW5kbGUgY2FzZSBmb3IgU0FNX1NUQVRfUkVTRVJWQVRJT05fQ09ORkxJQ1QKIAkJICovCkBAIC0xNjUsMzUgKzE2MywyMSBAQAogCQkgKi8KIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVVNFX1NFTlNFX1JFQVNPTjsKIAl9Ci0JLyoKLQkgKiBTZXR1cCB0aGUgc3RydWN0IHNjYXR0ZXJsaXN0IG1lbW9yeSBmcm9tIHRoZSByZWNlaXZlZAotCSAqIHN0cnVjdCBzY3NpX2NtbmQuCi0JICovCi0JaWYgKHNjc2lfc2dfY291bnQoc2MpKSB7Ci0JCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9QQVNTVEhST1VHSF9TR19UT19NRU07Ci0JCW1lbV9wdHIgPSAodm9pZCAqKXNjc2lfc2dsaXN0KHNjKTsKLQkJLyoKLQkJICogRm9yIEJJREkgY29tbWFuZHMsIHBhc3MgaW4gdGhlIGV4dHJhIFJFQUQgYnVmZmVyCi0JCSAqIHRvIHRyYW5zcG9ydF9nZW5lcmljX21hcF9tZW1fdG9fY21kKCkgYmVsb3cuLgotCQkgKi8KLQkJaWYgKFRfVEFTSyhzZV9jbWQpLT50X3Rhc2tzX2JpZGkpIHsKLQkJCXN0cnVjdCBzY3NpX2RhdGFfYnVmZmVyICpzZGIgPSBzY3NpX2luKHNjKTsKIAotCQkJbWVtX2JpZGlfcHRyID0gKHZvaWQgKilzZGItPnRhYmxlLnNnbDsKLQkJCXNnX25vX2JpZGkgPSBzZGItPnRhYmxlLm5lbnRzOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogVXNlZCBmb3IgRE1BX05PTkUKLQkJICovCi0JCW1lbV9wdHIgPSBOVUxMOwotCX0KIAkvKgotCSAqIE1hcCB0aGUgU0cgbWVtb3J5IGludG8gc3RydWN0IHNlX21lbS0+cGFnZSBsaW5rZWQgbGlzdCB1c2luZyB0aGUgc2FtZQotCSAqIHBoeXNpY2FsIG1lbW9yeSBhdCBzZy0+cGFnZV9saW5rLgorCSAqIEZvciBCSURJIGNvbW1hbmRzLCBwYXNzIGluIHRoZSBleHRyYSBSRUFEIGJ1ZmZlcgorCSAqIHRvIHRyYW5zcG9ydF9nZW5lcmljX21hcF9tZW1fdG9fY21kKCkgYmVsb3cuLgogCSAqLwotCXJldCA9IHRyYW5zcG9ydF9nZW5lcmljX21hcF9tZW1fdG9fY21kKHNlX2NtZCwgbWVtX3B0ciwKLQkJCXNjc2lfc2dfY291bnQoc2MpLCBtZW1fYmlkaV9wdHIsIHNnX25vX2JpZGkpOworCWlmIChzZV9jbWQtPnRfdGFza3NfYmlkaSkgeworCQlzdHJ1Y3Qgc2NzaV9kYXRhX2J1ZmZlciAqc2RiID0gc2NzaV9pbihzYyk7CisKKwkJc2dsX2JpZGkgPSBzZGItPnRhYmxlLnNnbDsKKwkJc2dsX2JpZGlfY291bnQgPSBzZGItPnRhYmxlLm5lbnRzOworCX0KKworCS8qIFRlbGwgdGhlIGNvcmUgYWJvdXQgb3VyIHByZWFsbG9jYXRlZCBtZW1vcnkgKi8KKwlyZXQgPSB0cmFuc3BvcnRfZ2VuZXJpY19tYXBfbWVtX3RvX2NtZChzZV9jbWQsIHNjc2lfc2dsaXN0KHNjKSwKKwkJCXNjc2lfc2dfY291bnQoc2MpLCBzZ2xfYmlkaSwgc2dsX2JpZGlfY291bnQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CiAKQEAgLTIxNiwxMyArMjAwLDEwIEBACiAJICogUmVsZWFzZSB0aGUgc3RydWN0IHNlX2NtZCwgd2hpY2ggd2lsbCBtYWtlIGEgY2FsbGJhY2sgdG8gcmVsZWFzZQogCSAqIHN0cnVjdCB0Y21fbG9vcF9jbWQgKiBpbiB0Y21fbG9vcF9kZWFsbG9jYXRlX2NvcmVfY21kKCkKIAkgKi8KLQl0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZChzZV9jbWQsIDAsIDEsIDApOworCXRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKHNlX2NtZCwgMCwgMCk7CiB9CiAKLS8qCi0gKiBDYWxsZWQgZnJvbSBzdHJ1Y3QgdGFyZ2V0X2NvcmVfZmFicmljX29wcy0+cmVsZWFzZV9jbWRfdG9fcG9vbCgpCi0gKi8KLXN0YXRpYyB2b2lkIHRjbV9sb29wX2RlYWxsb2NhdGVfY29yZV9jbWQoc3RydWN0IHNlX2NtZCAqc2VfY21kKQorc3RhdGljIHZvaWQgdGNtX2xvb3BfcmVsZWFzZV9jbWQoc3RydWN0IHNlX2NtZCAqc2VfY21kKQogewogCXN0cnVjdCB0Y21fbG9vcF9jbWQgKnRsX2NtZCA9IGNvbnRhaW5lcl9vZihzZV9jbWQsCiAJCQkJc3RydWN0IHRjbV9sb29wX2NtZCwgdGxfc2VfY21kKTsKQEAgLTMwMCw3ICsyODEsNyBAQAogCXN0cnVjdCB0Y21fbG9vcF9oYmEgKnRsX2hiYTsKIAlzdHJ1Y3QgdGNtX2xvb3BfdHBnICp0bF90cGc7CiAKLQlUTF9DREJfREVCVUcoInRjbV9sb29wX3F1ZXVlY29tbWFuZCgpICVkOiVkOiVkOiVkIGdvdCBDREI6IDB4JTAyeCIKKwlwcl9kZWJ1ZygidGNtX2xvb3BfcXVldWVjb21tYW5kKCkgJWQ6JWQ6JWQ6JWQgZ290IENEQjogMHglMDJ4IgogCQkiIHNjc2lfYnVmX2xlbjogJXVcbiIsIHNjLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sCiAJCXNjLT5kZXZpY2UtPmlkLCBzYy0+ZGV2aWNlLT5jaGFubmVsLCBzYy0+ZGV2aWNlLT5sdW4sCiAJCXNjLT5jbW5kWzBdLCBzY3NpX2J1ZmZsZW4oc2MpKTsKQEAgLTM1MCw3ICszMzEsNyBAQAogCSAqLwogCXRsX25leHVzID0gdGxfaGJhLT50bF9uZXh1czsKIAlpZiAoIXRsX25leHVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHBlcmZvcm0gZGV2aWNlIHJlc2V0IHdpdGhvdXQiCisJCXByX2VycigiVW5hYmxlIHRvIHBlcmZvcm0gZGV2aWNlIHJlc2V0IHdpdGhvdXQiCiAJCQkJIiBhY3RpdmUgSV9UIE5leHVzXG4iKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CkBAIC0zNjMsMTMgKzM0NCwxMyBAQAogCiAJdGxfY21kID0ga21lbV9jYWNoZV96YWxsb2ModGNtX2xvb3BfY21kX2NhY2hlLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRsX2NtZCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRsX2NtZFxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGxfY21kXG4iKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKIAl0bF90bXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGNtX2xvb3BfdG1yKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0bF90bXIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0bF90bXJcbiIpOworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRsX3RtclxuIik7CiAJCWdvdG8gcmVsZWFzZTsKIAl9CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdGxfdG1yLT50bF90bXJfd2FpdCk7CkBAIC0zODQsMTQgKzM2NSwxNCBAQAogCS8qCiAJICogQWxsb2NhdGUgdGhlIExVTl9SRVNFVCBUTVIKIAkgKi8KLQlzZV9jbWQtPnNlX3Rtcl9yZXEgPSBjb3JlX3Rtcl9hbGxvY19yZXEoc2VfY21kLCAodm9pZCAqKXRsX3RtciwKKwlzZV9jbWQtPnNlX3Rtcl9yZXEgPSBjb3JlX3Rtcl9hbGxvY19yZXEoc2VfY21kLCB0bF90bXIsCiAJCQkJVE1SX0xVTl9SRVNFVCk7Ci0JaWYgKCFzZV9jbWQtPnNlX3Rtcl9yZXEpCisJaWYgKElTX0VSUihzZV9jbWQtPnNlX3Rtcl9yZXEpKQogCQlnb3RvIHJlbGVhc2U7CiAJLyoKIAkgKiBMb2NhdGUgdGhlIHVuZGVybHlpbmcgVENNIHN0cnVjdCBzZV9sdW4gZnJvbSBzYy0+ZGV2aWNlLT5sdW4KIAkgKi8KLQlpZiAodHJhbnNwb3J0X2dldF9sdW5fZm9yX3RtcihzZV9jbWQsIHNjLT5kZXZpY2UtPmx1bikgPCAwKQorCWlmICh0cmFuc3BvcnRfbG9va3VwX3Rtcl9sdW4oc2VfY21kLCBzYy0+ZGV2aWNlLT5sdW4pIDwgMCkKIAkJZ290byByZWxlYXNlOwogCS8qCiAJICogUXVldWUgdGhlIFRNUiB0byBUQ00gQ29yZSBhbmQgc2xlZXAgd2FpdGluZyBmb3IgdGNtX2xvb3BfcXVldWVfdG1fcnNwKCkKQEAgLTQwNyw3ICszODgsNyBAQAogCQlTVUNDRVNTIDogRkFJTEVEOwogcmVsZWFzZToKIAlpZiAoc2VfY21kKQotCQl0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZChzZV9jbWQsIDEsIDEsIDApOworCQl0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZChzZV9jbWQsIDEsIDApOwogCWVsc2UKIAkJa21lbV9jYWNoZV9mcmVlKHRjbV9sb29wX2NtZF9jYWNoZSwgdGxfY21kKTsKIAlrZnJlZSh0bF90bXIpOwpAQCAtNDU0LDcgKzQzNSw3IEBACiAJc2ggPSBzY3NpX2hvc3RfYWxsb2MoJnRjbV9sb29wX2RyaXZlcl90ZW1wbGF0ZSwKIAkJCXNpemVvZihzdHJ1Y3QgdGNtX2xvb3BfaGJhKSk7CiAJaWYgKCFzaCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3Qgc2NzaV9ob3N0XG4iKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHNjc2lfaG9zdFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAl0bF9oYmEtPnNoID0gc2g7CkBAIC00NzMsNyArNDU0LDcgQEAKIAogCWVycm9yID0gc2NzaV9hZGRfaG9zdChzaCwgJnRsX2hiYS0+ZGV2KTsKIAlpZiAoZXJyb3IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogc2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJc2NzaV9ob3N0X3B1dChzaCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTUxNCw3ICs0OTUsNyBAQAogCiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ0bF9oYmEtPmRldik7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgImRldmljZV9yZWdpc3RlcigpIGZhaWxlZCBmb3IiCisJCXByX2VycigiZGV2aWNlX3JlZ2lzdGVyKCkgZmFpbGVkIGZvciIKIAkJCQkiIHRsX2hiYS0+ZGV2OiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtNTMyLDI0ICs1MTMsMjQgQEAKIAogCXRjbV9sb29wX3ByaW1hcnkgPSByb290X2RldmljZV9yZWdpc3RlcigidGNtX2xvb3BfMCIpOwogCWlmIChJU19FUlIodGNtX2xvb3BfcHJpbWFyeSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgdGNtX2xvb3BfcHJpbWFyeVxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHRjbV9sb29wX3ByaW1hcnlcbiIpOwogCQlyZXR1cm4gUFRSX0VSUih0Y21fbG9vcF9wcmltYXJ5KTsKIAl9CiAKIAlyZXQgPSBidXNfcmVnaXN0ZXIoJnRjbV9sb29wX2xsZF9idXMpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidXNfcmVnaXN0ZXIoKSBmYWlsZWQgZm9yIHRjbV9sb29wX2xsZF9idXNcbiIpOworCQlwcl9lcnIoImJ1c19yZWdpc3RlcigpIGZhaWxlZCBmb3IgdGNtX2xvb3BfbGxkX2J1c1xuIik7CiAJCWdvdG8gZGV2X3VucmVnOwogCX0KIAogCXJldCA9IGRyaXZlcl9yZWdpc3RlcigmdGNtX2xvb3BfZHJpdmVyZnMpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkcml2ZXJfcmVnaXN0ZXIoKSBmYWlsZWQgZm9yIgorCQlwcl9lcnIoImRyaXZlcl9yZWdpc3RlcigpIGZhaWxlZCBmb3IiCiAJCQkJInRjbV9sb29wX2RyaXZlcmZzXG4iKTsKIAkJZ290byBidXNfdW5yZWc7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6ZWQgVENNIExvb3AgQ29yZSBCdXNcbiIpOworCXByX2RlYnVnKCJJbml0aWFsaXplZCBUQ00gTG9vcCBDb3JlIEJ1c1xuIik7CiAJcmV0dXJuIHJldDsKIAogYnVzX3VucmVnOgpAQCAtNTY1LDcgKzU0Niw3IEBACiAJYnVzX3VucmVnaXN0ZXIoJnRjbV9sb29wX2xsZF9idXMpOwogCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIodGNtX2xvb3BfcHJpbWFyeSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJSZWxlYXNpbmcgVENNIExvb3AgQ29yZSBCVVNcbiIpOworCXByX2RlYnVnKCJSZWxlYXNpbmcgVENNIExvb3AgQ29yZSBCVVNcbiIpOwogfQogCiBzdGF0aWMgY2hhciAqdGNtX2xvb3BfZ2V0X2ZhYnJpY19uYW1lKHZvaWQpCkBAIC01OTMsNyArNTc0LDcgQEAKIAljYXNlIFNDU0lfUFJPVE9DT0xfSVNDU0k6CiAJCXJldHVybiBpc2NzaV9nZXRfZmFicmljX3Byb3RvX2lkZW50KHNlX3RwZyk7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIHRsX3Byb3RvX2lkOiAweCUwMngsIHVzaW5nIgorCQlwcl9lcnIoIlVua25vd24gdGxfcHJvdG9faWQ6IDB4JTAyeCwgdXNpbmciCiAJCQkiIFNBUyBlbXVsYXRpb25cbiIsIHRsX2hiYS0+dGxfcHJvdG9faWQpOwogCQlicmVhazsKIAl9CkBAIC02NDksNyArNjMwLDcgQEAKIAkJcmV0dXJuIGlzY3NpX2dldF9wcl90cmFuc3BvcnRfaWQoc2VfdHBnLCBzZV9uYWNsLCBwcl9yZWcsCiAJCQkJCWZvcm1hdF9jb2RlLCBidWYpOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5rbm93biB0bF9wcm90b19pZDogMHglMDJ4LCB1c2luZyIKKwkJcHJfZXJyKCJVbmtub3duIHRsX3Byb3RvX2lkOiAweCUwMngsIHVzaW5nIgogCQkJIiBTQVMgZW11bGF0aW9uXG4iLCB0bF9oYmEtPnRsX3Byb3RvX2lkKTsKIAkJYnJlYWs7CiAJfQpAQCAtNjc5LDcgKzY2MCw3IEBACiAJCXJldHVybiBpc2NzaV9nZXRfcHJfdHJhbnNwb3J0X2lkX2xlbihzZV90cGcsIHNlX25hY2wsIHByX3JlZywKIAkJCQkJZm9ybWF0X2NvZGUpOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5rbm93biB0bF9wcm90b19pZDogMHglMDJ4LCB1c2luZyIKKwkJcHJfZXJyKCJVbmtub3duIHRsX3Byb3RvX2lkOiAweCUwMngsIHVzaW5nIgogCQkJIiBTQVMgZW11bGF0aW9uXG4iLCB0bF9oYmEtPnRsX3Byb3RvX2lkKTsKIAkJYnJlYWs7CiAJfQpAQCAtNzEzLDcgKzY5NCw3IEBACiAJCXJldHVybiBpc2NzaV9wYXJzZV9wcl9vdXRfdHJhbnNwb3J0X2lkKHNlX3RwZywgYnVmLCBvdXRfdGlkX2xlbiwKIAkJCQkJcG9ydF9uZXh1c19wdHIpOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5rbm93biB0bF9wcm90b19pZDogMHglMDJ4LCB1c2luZyIKKwkJcHJfZXJyKCJVbmtub3duIHRsX3Byb3RvX2lkOiAweCUwMngsIHVzaW5nIgogCQkJIiBTQVMgZW11bGF0aW9uXG4iLCB0bF9oYmEtPnRsX3Byb3RvX2lkKTsKIAkJYnJlYWs7CiAJfQpAQCAtNzYyLDcgKzc0Myw3IEBACiAKIAl0bF9uYWNsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRjbV9sb29wX25hY2wpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRsX25hY2wpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHRjbV9sb29wX25hY2xcbiIpOworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgdGNtX2xvb3BfbmFjbFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtNzg0LDE2ICs3NjUsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCB0Y21fbG9vcF9uZXdfY21kX2ZhaWx1cmUoc3RydWN0IHNlX2NtZCAqc2VfY21kKQotewotCS8qCi0JICogU2luY2UgVENNX2xvb3AgaXMgYWxyZWFkeSBwYXNzaW5nIHN0cnVjdCBzY2F0dGVybGlzdCBkYXRhIGZyb20KLQkgKiBzdHJ1Y3Qgc2NzaV9jbW5kLCBubyBtb3JlIExpbnV4L1NDU0kgZmFpbHVyZSBkZXBlbmRlbnQgc3RhdGUgbmVlZAotCSAqIHRvIGJlIGhhbmRsZWQgaGVyZS4KLQkgKi8KLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgdGNtX2xvb3BfaXNfc3RhdGVfcmVtb3ZlKHN0cnVjdCBzZV9jbWQgKnNlX2NtZCkKIHsKIAkvKgpAQCAtODgyLDcgKzg1Myw3IEBACiAJCQkJc3RydWN0IHRjbV9sb29wX2NtZCwgdGxfc2VfY21kKTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpzYyA9IHRsX2NtZC0+c2M7CiAKLQlUTF9DREJfREVCVUcoInRjbV9sb29wX3F1ZXVlX2RhdGFfaW4oKSBjYWxsZWQgZm9yIHNjc2lfY21uZDogJXAiCisJcHJfZGVidWcoInRjbV9sb29wX3F1ZXVlX2RhdGFfaW4oKSBjYWxsZWQgZm9yIHNjc2lfY21uZDogJXAiCiAJCSAgICAgIiBjZGI6IDB4JTAyeFxuIiwgc2MsIHNjLT5jbW5kWzBdKTsKIAogCXNjLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOwpAQCAtODk3LDE0ICs4NjgsMTQgQEAKIAkJCQlzdHJ1Y3QgdGNtX2xvb3BfY21kLCB0bF9zZV9jbWQpOwogCXN0cnVjdCBzY3NpX2NtbmQgKnNjID0gdGxfY21kLT5zYzsKIAotCVRMX0NEQl9ERUJVRygidGNtX2xvb3BfcXVldWVfc3RhdHVzKCkgY2FsbGVkIGZvciBzY3NpX2NtbmQ6ICVwIgorCXByX2RlYnVnKCJ0Y21fbG9vcF9xdWV1ZV9zdGF0dXMoKSBjYWxsZWQgZm9yIHNjc2lfY21uZDogJXAiCiAJCQkiIGNkYjogMHglMDJ4XG4iLCBzYywgc2MtPmNtbmRbMF0pOwogCiAJaWYgKHNlX2NtZC0+c2Vuc2VfYnVmZmVyICYmCiAJICAgKChzZV9jbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9UUkFOU1BPUlRfVEFTS19TRU5TRSkgfHwKIAkgICAgKHNlX2NtZC0+c2VfY21kX2ZsYWdzICYgU0NGX0VNVUxBVEVEX1RBU0tfU0VOU0UpKSkgewogCi0JCW1lbWNweSgodm9pZCAqKXNjLT5zZW5zZV9idWZmZXIsICh2b2lkICopc2VfY21kLT5zZW5zZV9idWZmZXIsCisJCW1lbWNweShzYy0+c2Vuc2VfYnVmZmVyLCBzZV9jbWQtPnNlbnNlX2J1ZmZlciwKIAkJCQlTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOwogCQlzYy0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwogCQlzZXRfZHJpdmVyX2J5dGUoc2MsIERSSVZFUl9TRU5TRSk7CkBAIC05NzIsNyArOTQzLDcgQEAKIAkgKi8KIAlzY3NpX2FkZF9kZXZpY2UodGxfaGJhLT5zaCwgMCwgdGxfdHBnLT50bF90cGd0LCBsdW4tPnVucGFja2VkX2x1bik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUQ01fTG9vcF9Db25maWdGUzogUG9ydCBMaW5rIFN1Y2Nlc3NmdWxcbiIpOworCXByX2RlYnVnKCJUQ01fTG9vcF9Db25maWdGUzogUG9ydCBMaW5rIFN1Y2Nlc3NmdWxcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC05OTAsNyArOTYxLDcgQEAKIAlzZCA9IHNjc2lfZGV2aWNlX2xvb2t1cCh0bF9oYmEtPnNoLCAwLCB0bF90cGctPnRsX3RwZ3QsCiAJCQkJc2VfbHVuLT51bnBhY2tlZF9sdW4pOwogCWlmICghc2QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCBzY3NpX2RldmljZSBmb3IgJWQ6JWQ6IgorCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgc3RydWN0IHNjc2lfZGV2aWNlIGZvciAlZDolZDoiCiAJCQkiJWRcbiIsIDAsIHRsX3RwZy0+dGxfdHBndCwgc2VfbHVuLT51bnBhY2tlZF9sdW4pOwogCQlyZXR1cm47CiAJfQpAQCAtMTAwMyw3ICs5NzQsNyBAQAogCWF0b21pY19kZWMoJnRsX3RwZy0+dGxfdHBnX3BvcnRfY291bnQpOwogCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVENNX0xvb3BfQ29uZmlnRlM6IFBvcnQgVW5saW5rIFN1Y2Nlc3NmdWxcbiIpOworCXByX2RlYnVnKCJUQ01fTG9vcF9Db25maWdGUzogUG9ydCBVbmxpbmsgU3VjY2Vzc2Z1bFxuIik7CiB9CiAKIC8qIEVuZCBpdGVtcyBmb3IgdGNtX2xvb3BfcG9ydF9jaXQgKi8KQEAgLTEwMTcsMjQgKzk4OCwyNyBAQAogCXN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKnNlX3RwZzsKIAlzdHJ1Y3QgdGNtX2xvb3BfaGJhICp0bF9oYmEgPSB0bF90cGctPnRsX2hiYTsKIAlzdHJ1Y3QgdGNtX2xvb3BfbmV4dXMgKnRsX25leHVzOworCWludCByZXQgPSAtRU5PTUVNOwogCiAJaWYgKHRsX3RwZy0+dGxfaGJhLT50bF9uZXh1cykgewotCQlwcmludGsoS0VSTl9JTkZPICJ0bF90cGctPnRsX2hiYS0+dGxfbmV4dXMgYWxyZWFkeSBleGlzdHNcbiIpOworCQlwcl9kZWJ1ZygidGxfdHBnLT50bF9oYmEtPnRsX25leHVzIGFscmVhZHkgZXhpc3RzXG4iKTsKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJfQogCXNlX3RwZyA9ICZ0bF90cGctPnRsX3NlX3RwZzsKIAogCXRsX25leHVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRjbV9sb29wX25leHVzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0bF9uZXh1cykgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgdGNtX2xvb3BfbmV4dXNcbiIpOworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgdGNtX2xvb3BfbmV4dXNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3Qgc2Vfc2Vzc2lvbiBwb2ludGVyCiAJICovCiAJdGxfbmV4dXMtPnNlX3Nlc3MgPSB0cmFuc3BvcnRfaW5pdF9zZXNzaW9uKCk7Ci0JaWYgKCF0bF9uZXh1cy0+c2Vfc2VzcykKKwlpZiAoSVNfRVJSKHRsX25leHVzLT5zZV9zZXNzKSkgeworCQlyZXQgPSBQVFJfRVJSKHRsX25leHVzLT5zZV9zZXNzKTsKIAkJZ290byBvdXQ7CisJfQogCS8qCiAJICogU2luY2Ugd2UgYXJlIHJ1bm5pbmcgaW4gJ2RlbW8gbW9kZScgdGhpcyBjYWxsIHdpdGggZ2VuZXJhdGUgYQogCSAqIHN0cnVjdCBzZV9ub2RlX2FjbCBmb3IgdGhlIHRjbV9sb29wIHN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgd2l0aCB0aGUgU0NTSQpAQCAtMTA1MSwxNiArMTAyNSwxNiBAQAogCSAqIHRyYW5zcG9ydF9yZWdpc3Rlcl9zZXNzaW9uKCkKIAkgKi8KIAlfX3RyYW5zcG9ydF9yZWdpc3Rlcl9zZXNzaW9uKHNlX3RwZywgdGxfbmV4dXMtPnNlX3Nlc3MtPnNlX25vZGVfYWNsLAotCQkJdGxfbmV4dXMtPnNlX3Nlc3MsICh2b2lkICopdGxfbmV4dXMpOworCQkJdGxfbmV4dXMtPnNlX3Nlc3MsIHRsX25leHVzKTsKIAl0bF90cGctPnRsX2hiYS0+dGxfbmV4dXMgPSB0bF9uZXh1czsKLQlwcmludGsoS0VSTl9JTkZPICJUQ01fTG9vcF9Db25maWdGUzogRXN0YWJsaXNoZWQgSV9UIE5leHVzIHRvIGVtdWxhdGVkIgorCXByX2RlYnVnKCJUQ01fTG9vcF9Db25maWdGUzogRXN0YWJsaXNoZWQgSV9UIE5leHVzIHRvIGVtdWxhdGVkIgogCQkiICVzIEluaXRpYXRvciBQb3J0OiAlc1xuIiwgdGNtX2xvb3BfZHVtcF9wcm90b19pZCh0bF9oYmEpLAogCQluYW1lKTsKIAlyZXR1cm4gMDsKIAogb3V0OgogCWtmcmVlKHRsX25leHVzKTsKLQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHRjbV9sb29wX2Ryb3BfbmV4dXMoCkBAIC0xMDc5LDEzICsxMDUzLDEzIEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKGF0b21pY19yZWFkKCZ0cGctPnRsX3RwZ19wb3J0X2NvdW50KSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZW1vdmUgVENNX0xvb3AgSV9UIE5leHVzIHdpdGgiCisJCXByX2VycigiVW5hYmxlIHRvIHJlbW92ZSBUQ01fTG9vcCBJX1QgTmV4dXMgd2l0aCIKIAkJCSIgYWN0aXZlIFRQRyBwb3J0IGNvdW50OiAlZFxuIiwKIAkJCWF0b21pY19yZWFkKCZ0cGctPnRsX3RwZ19wb3J0X2NvdW50KSk7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVENNX0xvb3BfQ29uZmlnRlM6IFJlbW92aW5nIElfVCBOZXh1cyB0byBlbXVsYXRlZCIKKwlwcl9kZWJ1ZygiVENNX0xvb3BfQ29uZmlnRlM6IFJlbW92aW5nIElfVCBOZXh1cyB0byBlbXVsYXRlZCIKIAkJIiAlcyBJbml0aWF0b3IgUG9ydDogJXNcbiIsIHRjbV9sb29wX2R1bXBfcHJvdG9faWQodGxfaGJhKSwKIAkJdGxfbmV4dXMtPnNlX3Nlc3MtPnNlX25vZGVfYWNsLT5pbml0aWF0b3JuYW1lKTsKIAkvKgpAQCAtMTE0MCw4ICsxMTE0LDggQEAKIAkgKiB0aGUgZmFicmljIHByb3RvY29sX2lkIHNldCBpbiB0Y21fbG9vcF9tYWtlX3Njc2lfaGJhKCksIGFuZCBjYWxsCiAJICogdGNtX2xvb3BfbWFrZV9uZXh1cygpCiAJICovCi0JaWYgKHN0cmxlbihwYWdlKSA+IFRMX1dXTl9BRERSX0xFTikgewotCQlwcmludGsoS0VSTl9FUlIgIkVtdWxhdGVkIE5BQSBTYXMgQWRkcmVzczogJXMsIGV4Y2VlZHMiCisJaWYgKHN0cmxlbihwYWdlKSA+PSBUTF9XV05fQUREUl9MRU4pIHsKKwkJcHJfZXJyKCJFbXVsYXRlZCBOQUEgU2FzIEFkZHJlc3M6ICVzLCBleGNlZWRzIgogCQkJCSIgbWF4OiAlZFxuIiwgcGFnZSwgVExfV1dOX0FERFJfTEVOKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTE1MCw3ICsxMTI0LDcgQEAKIAlwdHIgPSBzdHJzdHIoaV9wb3J0LCAibmFhLiIpOwogCWlmIChwdHIpIHsKIAkJaWYgKHRsX2hiYS0+dGxfcHJvdG9faWQgIT0gU0NTSV9QUk9UT0NPTF9TQVMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiUGFzc2VkIFNBUyBJbml0aWF0b3IgUG9ydCAlcyBkb2VzIG5vdCIKKwkJCXByX2VycigiUGFzc2VkIFNBUyBJbml0aWF0b3IgUG9ydCAlcyBkb2VzIG5vdCIKIAkJCQkiIG1hdGNoIHRhcmdldCBwb3J0IHByb3RvaWQ6ICVzXG4iLCBpX3BvcnQsCiAJCQkJdGNtX2xvb3BfZHVtcF9wcm90b19pZCh0bF9oYmEpKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTE2MSw3ICsxMTM1LDcgQEAKIAlwdHIgPSBzdHJzdHIoaV9wb3J0LCAiZmMuIik7CiAJaWYgKHB0cikgewogCQlpZiAodGxfaGJhLT50bF9wcm90b19pZCAhPSBTQ1NJX1BST1RPQ09MX0ZDUCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJQYXNzZWQgRkNQIEluaXRpYXRvciBQb3J0ICVzIGRvZXMgbm90IgorCQkJcHJfZXJyKCJQYXNzZWQgRkNQIEluaXRpYXRvciBQb3J0ICVzIGRvZXMgbm90IgogCQkJCSIgbWF0Y2ggdGFyZ2V0IHBvcnQgcHJvdG9pZDogJXNcbiIsIGlfcG9ydCwKIAkJCQl0Y21fbG9vcF9kdW1wX3Byb3RvX2lkKHRsX2hiYSkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTcyLDcgKzExNDYsNyBAQAogCXB0ciA9IHN0cnN0cihpX3BvcnQsICJpcW4uIik7CiAJaWYgKHB0cikgewogCQlpZiAodGxfaGJhLT50bF9wcm90b19pZCAhPSBTQ1NJX1BST1RPQ09MX0lTQ1NJKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlBhc3NlZCBpU0NTSSBJbml0aWF0b3IgUG9ydCAlcyBkb2VzIG5vdCIKKwkJCXByX2VycigiUGFzc2VkIGlTQ1NJIEluaXRpYXRvciBQb3J0ICVzIGRvZXMgbm90IgogCQkJCSIgbWF0Y2ggdGFyZ2V0IHBvcnQgcHJvdG9pZDogJXNcbiIsIGlfcG9ydCwKIAkJCQl0Y21fbG9vcF9kdW1wX3Byb3RvX2lkKHRsX2hiYSkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTgwLDcgKzExNTQsNyBAQAogCQlwb3J0X3B0ciA9ICZpX3BvcnRbMF07CiAJCWdvdG8gY2hlY2tfbmV3bGluZTsKIAl9Ci0JcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIHByZWZpeCBmb3IgZW11bGF0ZWQgSW5pdGlhdG9yIFBvcnQ6IgorCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBwcmVmaXggZm9yIGVtdWxhdGVkIEluaXRpYXRvciBQb3J0OiIKIAkJCSIgJXNcbiIsIGlfcG9ydCk7CiAJcmV0dXJuIC1FSU5WQUw7CiAJLyoKQEAgLTEyMjAsMTUgKzExOTQsMTUgQEAKIAogCXRwZ3Rfc3RyID0gc3Ryc3RyKG5hbWUsICJ0cGd0XyIpOwogCWlmICghdHBndF9zdHIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIFwidHBndF8jXCIgZGlyZWN0b3J5IgorCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgXCJ0cGd0XyNcIiBkaXJlY3RvcnkiCiAJCQkJIiBncm91cFxuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAl0cGd0X3N0ciArPSA1OyAvKiBTa2lwIGFoZWFkIG9mICJ0cGd0XyIgKi8KIAl0cGd0ID0gKHVuc2lnbmVkIHNob3J0IGludCkgc2ltcGxlX3N0cnRvdWwodHBndF9zdHIsICZlbmRfcHRyLCAwKTsKIAotCWlmICh0cGd0ID4gVExfVFBHU19QRVJfSEJBKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUGFzc2VkIHRwZ3Q6ICVodSBleGNlZWRzIFRMX1RQR1NfUEVSX0hCQToiCisJaWYgKHRwZ3QgPj0gVExfVFBHU19QRVJfSEJBKSB7CisJCXByX2VycigiUGFzc2VkIHRwZ3Q6ICVodSBleGNlZWRzIFRMX1RQR1NfUEVSX0hCQToiCiAJCQkJIiAldVxuIiwgdHBndCwgVExfVFBHU19QRVJfSEJBKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQpAQCAtMTIzOSwxMiArMTIxMywxMiBAQAogCSAqIFJlZ2lzdGVyIHRoZSB0bF90cGcgYXMgYSBlbXVsYXRlZCBTQVMgVENNIFRhcmdldCBFbmRwb2ludAogCSAqLwogCXJldCA9IGNvcmVfdHBnX3JlZ2lzdGVyKCZ0Y21fbG9vcF9mYWJyaWNfY29uZmlnZnMtPnRmX29wcywKLQkJCXd3biwgJnRsX3RwZy0+dGxfc2VfdHBnLCAodm9pZCAqKXRsX3RwZywKKwkJCXd3biwgJnRsX3RwZy0+dGxfc2VfdHBnLCB0bF90cGcsCiAJCQlUUkFOU1BPUlRfVFBHX1RZUEVfTk9STUFMKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUQ01fTG9vcF9Db25maWdGUzogQWxsb2NhdGVkIEVtdWxhdGVkICVzIgorCXByX2RlYnVnKCJUQ01fTG9vcF9Db25maWdGUzogQWxsb2NhdGVkIEVtdWxhdGVkICVzIgogCQkiIFRhcmdldCBQb3J0ICVzLHQsMHglMDR4XG4iLCB0Y21fbG9vcF9kdW1wX3Byb3RvX2lkKHRsX2hiYSksCiAJCWNvbmZpZ19pdGVtX25hbWUoJnd3bi0+d3duX2dyb3VwLmNnX2l0ZW0pLCB0cGd0KTsKIApAQCAtMTI3MSw3ICsxMjQ1LDcgQEAKIAkgKi8KIAljb3JlX3RwZ19kZXJlZ2lzdGVyKHNlX3RwZyk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUQ01fTG9vcF9Db25maWdGUzogRGVhbGxvY2F0ZWQgRW11bGF0ZWQgJXMiCisJcHJfZGVidWcoIlRDTV9Mb29wX0NvbmZpZ0ZTOiBEZWFsbG9jYXRlZCBFbXVsYXRlZCAlcyIKIAkJIiBUYXJnZXQgUG9ydCAlcyx0LDB4JTA0eFxuIiwgdGNtX2xvb3BfZHVtcF9wcm90b19pZCh0bF9oYmEpLAogCQljb25maWdfaXRlbV9uYW1lKCZ3d24tPnd3bl9ncm91cC5jZ19pdGVtKSwgdHBndCk7CiB9CkBAIC0xMjkyLDcgKzEyNjYsNyBAQAogCiAJdGxfaGJhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRjbV9sb29wX2hiYSksIEdGUF9LRVJORUwpOwogCWlmICghdGxfaGJhKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCB0Y21fbG9vcF9oYmFcbiIpOworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgdGNtX2xvb3BfaGJhXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCS8qCkBAIC0xMzExLDIyICsxMjg1LDIxIEBACiAJCWdvdG8gY2hlY2tfbGVuOwogCX0KIAlwdHIgPSBzdHJzdHIobmFtZSwgImlxbi4iKTsKLQlpZiAocHRyKSB7Ci0JCXRsX2hiYS0+dGxfcHJvdG9faWQgPSBTQ1NJX1BST1RPQ09MX0lTQ1NJOwotCQlnb3RvIGNoZWNrX2xlbjsKKwlpZiAoIXB0cikgeworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgcHJlZml4IGZvciBlbXVsYXRlZCBUYXJnZXQgIgorCQkJCSJQb3J0OiAlc1xuIiwgbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OwogCX0KLQotCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvY2F0ZSBwcmVmaXggZm9yIGVtdWxhdGVkIFRhcmdldCBQb3J0OiIKLQkJCSIgJXNcbiIsIG5hbWUpOwotCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCXRsX2hiYS0+dGxfcHJvdG9faWQgPSBTQ1NJX1BST1RPQ09MX0lTQ1NJOwogCiBjaGVja19sZW46Ci0JaWYgKHN0cmxlbihuYW1lKSA+IFRMX1dXTl9BRERSX0xFTikgewotCQlwcmludGsoS0VSTl9FUlIgIkVtdWxhdGVkIE5BQSAlcyBBZGRyZXNzOiAlcywgZXhjZWVkcyIKKwlpZiAoc3RybGVuKG5hbWUpID49IFRMX1dXTl9BRERSX0xFTikgeworCQlwcl9lcnIoIkVtdWxhdGVkIE5BQSAlcyBBZGRyZXNzOiAlcywgZXhjZWVkcyIKIAkJCSIgbWF4OiAlZFxuIiwgbmFtZSwgdGNtX2xvb3BfZHVtcF9wcm90b19pZCh0bF9oYmEpLAogCQkJVExfV1dOX0FERFJfTEVOKTsKLQkJa2ZyZWUodGxfaGJhKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OwogCX0KIAlzbnByaW50ZigmdGxfaGJhLT50bF93d25fYWRkcmVzc1swXSwgVExfV1dOX0FERFJfTEVOLCAiJXMiLCAmbmFtZVtvZmZdKTsKIApAQCAtMTM0MSw3ICsxMzE0LDcgQEAKIAogCXNoID0gdGxfaGJhLT5zaDsKIAl0Y21fbG9vcF9oYmFfbm9fY250Kys7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVENNX0xvb3BfQ29uZmlnRlM6IEFsbG9jYXRlZCBlbXVsYXRlZCBUYXJnZXQiCisJcHJfZGVidWcoIlRDTV9Mb29wX0NvbmZpZ0ZTOiBBbGxvY2F0ZWQgZW11bGF0ZWQgVGFyZ2V0IgogCQkiICVzIEFkZHJlc3M6ICVzIGF0IExpbnV4L1NDU0kgSG9zdCBJRDogJWRcbiIsCiAJCXRjbV9sb29wX2R1bXBfcHJvdG9faWQodGxfaGJhKSwgbmFtZSwgc2gtPmhvc3Rfbm8pOwogCkBAIC0xMzY0LDcgKzEzMzcsNyBAQAogCSAqLwogCWRldmljZV91bnJlZ2lzdGVyKCZ0bF9oYmEtPmRldik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUQ01fTG9vcF9Db25maWdGUzogRGVhbGxvY2F0ZWQgZW11bGF0ZWQgVGFyZ2V0IgorCXByX2RlYnVnKCJUQ01fTG9vcF9Db25maWdGUzogRGVhbGxvY2F0ZWQgZW11bGF0ZWQgVGFyZ2V0IgogCQkiIFNBUyBBZGRyZXNzOiAlcyBhdCBMaW51eC9TQ1NJIEhvc3QgSUQ6ICVkXG4iLAogCQljb25maWdfaXRlbV9uYW1lKCZ3d24tPnd3bl9ncm91cC5jZ19pdGVtKSwgaG9zdF9ubyk7CiB9CkBAIC0xMzk5LDkgKzEzNzIsOSBAQAogCSAqIFJlZ2lzdGVyIHRoZSB0b3AgbGV2ZWwgc3RydWN0IGNvbmZpZ19pdGVtX3R5cGUgd2l0aCBUQ00gY29yZQogCSAqLwogCWZhYnJpYyA9IHRhcmdldF9mYWJyaWNfY29uZmlnZnNfaW5pdChUSElTX01PRFVMRSwgImxvb3BiYWNrIik7Ci0JaWYgKCFmYWJyaWMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0Y21fbG9vcF9yZWdpc3Rlcl9jb25maWdmcygpIGZhaWxlZCFcbiIpOwotCQlyZXR1cm4gLTE7CisJaWYgKElTX0VSUihmYWJyaWMpKSB7CisJCXByX2VycigidGNtX2xvb3BfcmVnaXN0ZXJfY29uZmlnZnMoKSBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZmFicmljKTsKIAl9CiAJLyoKIAkgKiBTZXR1cCB0aGUgZmFicmljIEFQSSBvZiBmdW5jdGlvbiBwb2ludGVycyB1c2VkIGJ5IHRhcmdldF9jb3JlX21vZApAQCAtMTQzMywxOSArMTQwNiwxMSBAQAogCQkJCQkmdGNtX2xvb3BfdHBnX3JlbGVhc2VfZmFicmljX2FjbDsKIAlmYWJyaWMtPnRmX29wcy50cGdfZ2V0X2luc3RfaW5kZXggPSAmdGNtX2xvb3BfZ2V0X2luc3RfaW5kZXg7CiAJLyoKLQkgKiBTaW5jZSB0Y21fbG9vcCBpcyBtYXBwaW5nIHBoeXNpY2FsIG1lbW9yeSBmcm9tIExpbnV4L1NDU0kKLQkgKiBzdHJ1Y3Qgc2NhdHRlcmxpc3QgYXJyYXlzIGZvciBlYWNoIHN0cnVjdCBzY3NpX2NtbmQgSS9PLAotCSAqIHdlIGRvIG5vdCBuZWVkIFRDTSB0byBhbGxvY2F0ZSBhIGlvdmVjIGFycmF5IGZvcgotCSAqIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MgbWFwcGluZ3MKLQkgKi8KLQlmYWJyaWMtPnRmX29wcy5hbGxvY19jbWRfaW92ZWNzID0gTlVMTDsKLQkvKgogCSAqIFVzZWQgZm9yIHNldHRpbmcgdXAgcmVtYWluaW5nIFRDTSByZXNvdXJjZXMgaW4gcHJvY2VzcyBjb250ZXh0CiAJICovCiAJZmFicmljLT50Zl9vcHMubmV3X2NtZF9tYXAgPSAmdGNtX2xvb3BfbmV3X2NtZF9tYXA7CiAJZmFicmljLT50Zl9vcHMuY2hlY2tfc3RvcF9mcmVlID0gJnRjbV9sb29wX2NoZWNrX3N0b3BfZnJlZTsKLQlmYWJyaWMtPnRmX29wcy5yZWxlYXNlX2NtZF90b19wb29sID0gJnRjbV9sb29wX2RlYWxsb2NhdGVfY29yZV9jbWQ7Ci0JZmFicmljLT50Zl9vcHMucmVsZWFzZV9jbWRfZGlyZWN0ID0gJnRjbV9sb29wX2RlYWxsb2NhdGVfY29yZV9jbWQ7CisJZmFicmljLT50Zl9vcHMucmVsZWFzZV9jbWQgPSAmdGNtX2xvb3BfcmVsZWFzZV9jbWQ7CiAJZmFicmljLT50Zl9vcHMuc2h1dGRvd25fc2Vzc2lvbiA9ICZ0Y21fbG9vcF9zaHV0ZG93bl9zZXNzaW9uOwogCWZhYnJpYy0+dGZfb3BzLmNsb3NlX3Nlc3Npb24gPSAmdGNtX2xvb3BfY2xvc2Vfc2Vzc2lvbjsKIAlmYWJyaWMtPnRmX29wcy5zdG9wX3Nlc3Npb24gPSAmdGNtX2xvb3Bfc3RvcF9zZXNzaW9uOwpAQCAtMTQ2Miw3ICsxNDI3LDYgQEAKIAkJCQkJJnRjbV9sb29wX3NldF9kZWZhdWx0X25vZGVfYXR0cmlidXRlczsKIAlmYWJyaWMtPnRmX29wcy5nZXRfdGFza190YWcgPSAmdGNtX2xvb3BfZ2V0X3Rhc2tfdGFnOwogCWZhYnJpYy0+dGZfb3BzLmdldF9jbWRfc3RhdGUgPSAmdGNtX2xvb3BfZ2V0X2NtZF9zdGF0ZTsKLQlmYWJyaWMtPnRmX29wcy5uZXdfY21kX2ZhaWx1cmUgPSAmdGNtX2xvb3BfbmV3X2NtZF9mYWlsdXJlOwogCWZhYnJpYy0+dGZfb3BzLnF1ZXVlX2RhdGFfaW4gPSAmdGNtX2xvb3BfcXVldWVfZGF0YV9pbjsKIAlmYWJyaWMtPnRmX29wcy5xdWV1ZV9zdGF0dXMgPSAmdGNtX2xvb3BfcXVldWVfc3RhdHVzOwogCWZhYnJpYy0+dGZfb3BzLnF1ZXVlX3RtX3JzcCA9ICZ0Y21fbG9vcF9xdWV1ZV90bV9yc3A7CkBAIC0xNTAwLDcgKzE0NjQsNyBAQAogCSAqLwogCXJldCA9IHRhcmdldF9mYWJyaWNfY29uZmlnZnNfcmVnaXN0ZXIoZmFicmljKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInRhcmdldF9mYWJyaWNfY29uZmlnZnNfcmVnaXN0ZXIoKSBmb3IiCisJCXByX2VycigidGFyZ2V0X2ZhYnJpY19jb25maWdmc19yZWdpc3RlcigpIGZvciIKIAkJCQkiIFRDTV9Mb29wIGZhaWxlZCFcbiIpOwogCQl0YXJnZXRfZmFicmljX2NvbmZpZ2ZzX2ZyZWUoZmFicmljKTsKIAkJcmV0dXJuIC0xOwpAQCAtMTUwOSw3ICsxNDczLDcgQEAKIAkgKiBTZXR1cCBvdXIgbG9jYWwgcG9pbnRlciB0byAqZmFicmljLgogCSAqLwogCXRjbV9sb29wX2ZhYnJpY19jb25maWdmcyA9IGZhYnJpYzsKLQlwcmludGsoS0VSTl9JTkZPICJUQ01fTE9PUFswXSAtIFNldCBmYWJyaWMgLT4iCisJcHJfZGVidWcoIlRDTV9MT09QWzBdIC0gU2V0IGZhYnJpYyAtPiIKIAkJCSIgdGNtX2xvb3BfZmFicmljX2NvbmZpZ2ZzXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MjEsNyArMTQ4NSw3IEBACiAKIAl0YXJnZXRfZmFicmljX2NvbmZpZ2ZzX2RlcmVnaXN0ZXIodGNtX2xvb3BfZmFicmljX2NvbmZpZ2ZzKTsKIAl0Y21fbG9vcF9mYWJyaWNfY29uZmlnZnMgPSBOVUxMOwotCXByaW50ayhLRVJOX0lORk8gIlRDTV9MT09QWzBdIC0gQ2xlYXJlZCIKKwlwcl9kZWJ1ZygiVENNX0xPT1BbMF0gLSBDbGVhcmVkIgogCQkJCSIgdGNtX2xvb3BfZmFicmljX2NvbmZpZ2ZzXG4iKTsKIH0KIApAQCAtMTUzNCw3ICsxNDk4LDcgQEAKIAkJCQlfX2FsaWdub2ZfXyhzdHJ1Y3QgdGNtX2xvb3BfY21kKSwKIAkJCQkwLCBOVUxMKTsKIAlpZiAoIXRjbV9sb29wX2NtZF9jYWNoZSkgewotCQlwcmludGsoS0VSTl9FUlIgImttZW1fY2FjaGVfY3JlYXRlKCkgZm9yIgorCQlwcl9kZWJ1Zygia21lbV9jYWNoZV9jcmVhdGUoKSBmb3IiCiAJCQkiIHRjbV9sb29wX2NtZF9jYWNoZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5oIGIvZHJpdmVycy90YXJnZXQvbG9vcGJhY2svdGNtX2xvb3AuaAppbmRleCA3ZTlmN2FiLi42Yjc2YzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmgKQEAgLTE2LDEyICsxNiw2IEBACiAgKi8KICNkZWZpbmUgVExfU0NTSV9NQVhfQ01EX0xFTgkJMzIKIAotI2lmZGVmIENPTkZJR19MT09QQkFDS19UQVJHRVRfQ0RCX0RFQlVHCi0jIGRlZmluZSBUTF9DREJfREVCVUcoeC4uLikJCXByaW50ayhLRVJOX0lORk8geCkKLSNlbHNlCi0jIGRlZmluZSBUTF9DREJfREVCVUcoeC4uLikKLSNlbmRpZgotCiBzdHJ1Y3QgdGNtX2xvb3BfY21kIHsKIAkvKiBTdGF0ZSBvZiBMaW51eC9TQ1NJIENEQitEYXRhIGRlc2NyaXB0b3IgKi8KIAl1MzIgc2NfY21kX3N0YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5jCmluZGV4IDQ3YWJiNDIuLjk4Yzk4YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2FsdWEuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9hbHVhLmMKQEAgLTQ2LDYgKzQ2LDE0IEBACiAJCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncF9tZW1iZXIgKnRnX3B0X2dwX21lbSwKIAkJc3RydWN0IHNlX3BvcnQgKnBvcnQsIGludCBleHBsaWN0LCBpbnQgb2ZmbGluZSk7CiAKK3N0YXRpYyB1MTYgYWx1YV9sdV9ncHNfY291bnRlcjsKK3N0YXRpYyB1MzIgYWx1YV9sdV9ncHNfY291bnQ7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobHVfZ3BzX2xvY2spOworc3RhdGljIExJU1RfSEVBRChsdV9ncHNfbGlzdCk7CisKK3N0cnVjdCB0MTBfYWx1YV9sdV9ncCAqZGVmYXVsdF9sdV9ncDsKKwogLyoKICAqIFJFUE9SVF9UQVJHRVRfUE9SVF9HUk9VUFMKICAqCkBAIC01MywxNiArNjEsMTggQEAKICAqLwogaW50IGNvcmVfZW11bGF0ZV9yZXBvcnRfdGFyZ2V0X3BvcnRfZ3JvdXBzKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gU0VfREVWKGNtZCktPnNlX3N1Yl9kZXY7CisJc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKnN1X2RldiA9IGNtZC0+c2VfZGV2LT5zZV9zdWJfZGV2OwogCXN0cnVjdCBzZV9wb3J0ICpwb3J0OwogCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncCAqdGdfcHRfZ3A7CiAJc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwX21lbWJlciAqdGdfcHRfZ3BfbWVtOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopVF9UQVNLKGNtZCktPnRfdGFza19idWY7CisJdW5zaWduZWQgY2hhciAqYnVmOwogCXUzMiByZF9sZW4gPSAwLCBvZmYgPSA0OyAvKiBTa2lwIG92ZXIgUkVTRVJWRUQgYXJlYSB0byBmaXJzdAogCQkJCSAgICBUYXJnZXQgcG9ydCBncm91cCBkZXNjcmlwdG9yICovCiAKLQlzcGluX2xvY2soJlQxMF9BTFVBKHN1X2RldiktPnRnX3B0X2dwc19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRnX3B0X2dwLCAmVDEwX0FMVUEoc3VfZGV2KS0+dGdfcHRfZ3BzX2xpc3QsCisJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisKKwlzcGluX2xvY2soJnN1X2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGdfcHRfZ3AsICZzdV9kZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19saXN0LAogCQkJdGdfcHRfZ3BfbGlzdCkgewogCQkvKgogCQkgKiBQUkVGOiBQcmVmZXJyZWQgdGFyZ2V0IHBvcnQgYml0LCBkZXRlcm1pbmUgaWYgdGhpcwpAQCAtMTI0LDcgKzEzNCw3IEBACiAJCX0KIAkJc3Bpbl91bmxvY2soJnRnX3B0X2dwLT50Z19wdF9ncF9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJlQxMF9BTFVBKHN1X2RldiktPnRnX3B0X2dwc19sb2NrKTsKKwlzcGluX3VubG9jaygmc3VfZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbG9jayk7CiAJLyoKIAkgKiBTZXQgdGhlIFJFVFVSTiBEQVRBIExFTkdUSCBzZXQgaW4gdGhlIGhlYWRlciBvZiB0aGUgRGF0YUlOIFBheWxvYWQKIAkgKi8KQEAgLTEzMyw2ICsxNDMsOCBAQAogCWJ1ZlsyXSA9ICgocmRfbGVuID4+IDgpICYgMHhmZik7CiAJYnVmWzNdID0gKHJkX2xlbiAmIDB4ZmYpOwogCisJdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDMsNDUgKzE1NSw1MyBAQAogICovCiBpbnQgY29yZV9lbXVsYXRlX3NldF90YXJnZXRfcG9ydF9ncm91cHMoc3RydWN0IHNlX2NtZCAqY21kKQogewotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0RFVihjbWQpOwotCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBTRV9ERVYoY21kKS0+c2Vfc3ViX2RldjsKLQlzdHJ1Y3Qgc2VfcG9ydCAqcG9ydCwgKmxfcG9ydCA9IFNFX0xVTihjbWQpLT5sdW5fc2VwOwotCXN0cnVjdCBzZV9ub2RlX2FjbCAqbmFjbCA9IFNFX1NFU1MoY21kKS0+c2Vfbm9kZV9hY2w7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CisJc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKnN1X2RldiA9IGRldi0+c2Vfc3ViX2RldjsKKwlzdHJ1Y3Qgc2VfcG9ydCAqcG9ydCwgKmxfcG9ydCA9IGNtZC0+c2VfbHVuLT5sdW5fc2VwOworCXN0cnVjdCBzZV9ub2RlX2FjbCAqbmFjbCA9IGNtZC0+c2Vfc2Vzcy0+c2Vfbm9kZV9hY2w7CiAJc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwICp0Z19wdF9ncCA9IE5VTEwsICpsX3RnX3B0X2dwOwogCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncF9tZW1iZXIgKnRnX3B0X2dwX21lbSwgKmxfdGdfcHRfZ3BfbWVtOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopVF9UQVNLKGNtZCktPnRfdGFza19idWY7Ci0JdW5zaWduZWQgY2hhciAqcHRyID0gJmJ1Zls0XTsgLyogU2tpcCBvdmVyIFJFU0VSVkVEIGFyZWEgaW4gaGVhZGVyICovCisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKIAl1MzIgbGVuID0gNDsgLyogU2tpcCBvdmVyIFJFU0VSVkVEIGFyZWEgaW4gaGVhZGVyICovCiAJaW50IGFsdWFfYWNjZXNzX3N0YXRlLCBwcmltYXJ5ID0gMCwgcmM7CiAJdTE2IHRnX3B0X2lkLCBydHBpOwogCi0JaWYgKCEobF9wb3J0KSkKKwlpZiAoIWxfcG9ydCkKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOworCisJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisKIAkvKgogCSAqIERldGVybWluZSBpZiBleHBsaWN0IEFMVUEgdmlhIFNFVF9UQVJHRVRfUE9SVF9HUk9VUFMgaXMgYWxsb3dlZAogCSAqIGZvciB0aGUgbG9jYWwgdGdfcHRfZ3AuCiAJICovCiAJbF90Z19wdF9ncF9tZW0gPSBsX3BvcnQtPnNlcF9hbHVhX3RnX3B0X2dwX21lbTsKLQlpZiAoIShsX3RnX3B0X2dwX21lbSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWNjZXNzIGxfcG9ydC0+c2VwX2FsdWFfdGdfcHRfZ3BfbWVtXG4iKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOworCWlmICghbF90Z19wdF9ncF9tZW0pIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWNjZXNzIGxfcG9ydC0+c2VwX2FsdWFfdGdfcHRfZ3BfbWVtXG4iKTsKKwkJcmMgPSBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKKwkJZ290byBvdXQ7CiAJfQogCXNwaW5fbG9jaygmbF90Z19wdF9ncF9tZW0tPnRnX3B0X2dwX21lbV9sb2NrKTsKIAlsX3RnX3B0X2dwID0gbF90Z19wdF9ncF9tZW0tPnRnX3B0X2dwOwotCWlmICghKGxfdGdfcHRfZ3ApKSB7CisJaWYgKCFsX3RnX3B0X2dwKSB7CiAJCXNwaW5fdW5sb2NrKCZsX3RnX3B0X2dwX21lbS0+dGdfcHRfZ3BfbWVtX2xvY2spOwotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhY2Nlc3MgKmxfdGdfcHRfZ3BfbWVtLT50Z19wdF9ncFxuIik7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWNjZXNzICpsX3RnX3B0X2dwX21lbS0+dGdfcHRfZ3BcbiIpOworCQlyYyA9IFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOworCQlnb3RvIG91dDsKIAl9CiAJcmMgPSAobF90Z19wdF9ncC0+dGdfcHRfZ3BfYWx1YV9hY2Nlc3NfdHlwZSAmIFRQR1NfRVhQTElDVF9BTFVBKTsKIAlzcGluX3VubG9jaygmbF90Z19wdF9ncF9tZW0tPnRnX3B0X2dwX21lbV9sb2NrKTsKIAotCWlmICghKHJjKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJVbmFibGUgdG8gcHJvY2VzcyBTRVRfVEFSR0VUX1BPUlRfR1JPVVBTIgorCWlmICghcmMpIHsKKwkJcHJfZGVidWcoIlVuYWJsZSB0byBwcm9jZXNzIFNFVF9UQVJHRVRfUE9SVF9HUk9VUFMiCiAJCQkJIiB3aGlsZSBUUEdTX0VYUExJQ1RfQUxVQSBpcyBkaXNhYmxlZFxuIik7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKKwkJcmMgPSBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKKwkJZ290byBvdXQ7CiAJfQogCisJcHRyID0gJmJ1Zls0XTsgLyogU2tpcCBvdmVyIFJFU0VSVkVEIGFyZWEgaW4gaGVhZGVyICovCisKIAl3aGlsZSAobGVuIDwgY21kLT5kYXRhX2xlbmd0aCkgewogCQlhbHVhX2FjY2Vzc19zdGF0ZSA9IChwdHJbMF0gJiAweDBmKTsKIAkJLyoKQEAgLTIwMSw3ICsyMjEsOCBAQAogCQkJICogUkVRVUVTVCwgYW5kIHRoZSBhZGRpdGlvbmFsIHNlbnNlIGNvZGUgc2V0IHRvIElOVkFMSUQKIAkJCSAqIEZJRUxEIElOIFBBUkFNRVRFUiBMSVNULgogCQkJICovCi0JCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJcmMgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCQlnb3RvIG91dDsKIAkJfQogCQlyYyA9IC0xOwogCQkvKgpAQCAtMjI0LDExICsyNDUsMTEgQEAKIAkJCSAqIExvY2F0ZSB0aGUgbWF0Y2hpbmcgdGFyZ2V0IHBvcnQgZ3JvdXAgSUQgZnJvbQogCQkJICogdGhlIGdsb2JhbCB0Z19wdF9ncCBsaXN0CiAJCQkgKi8KLQkJCXNwaW5fbG9jaygmVDEwX0FMVUEoc3VfZGV2KS0+dGdfcHRfZ3BzX2xvY2spOworCQkJc3Bpbl9sb2NrKCZzdV9kZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19sb2NrKTsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkodGdfcHRfZ3AsCi0JCQkJCSZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbGlzdCwKKwkJCQkJJnN1X2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xpc3QsCiAJCQkJCXRnX3B0X2dwX2xpc3QpIHsKLQkJCQlpZiAoISh0Z19wdF9ncC0+dGdfcHRfZ3BfdmFsaWRfaWQpKQorCQkJCWlmICghdGdfcHRfZ3AtPnRnX3B0X2dwX3ZhbGlkX2lkKQogCQkJCQljb250aW51ZTsKIAogCQkJCWlmICh0Z19wdF9pZCAhPSB0Z19wdF9ncC0+dGdfcHRfZ3BfaWQpCkBAIC0yMzYsMjQgKzI1NywyNiBAQAogCiAJCQkJYXRvbWljX2luYygmdGdfcHRfZ3AtPnRnX3B0X2dwX3JlZl9jbnQpOwogCQkJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOwotCQkJCXNwaW5fdW5sb2NrKCZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbG9jayk7CisJCQkJc3Bpbl91bmxvY2soJnN1X2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOwogCiAJCQkJcmMgPSBjb3JlX2FsdWFfZG9fcG9ydF90cmFuc2l0aW9uKHRnX3B0X2dwLAogCQkJCQkJZGV2LCBsX3BvcnQsIG5hY2wsCiAJCQkJCQlhbHVhX2FjY2Vzc19zdGF0ZSwgMSk7CiAKLQkJCQlzcGluX2xvY2soJlQxMF9BTFVBKHN1X2RldiktPnRnX3B0X2dwc19sb2NrKTsKKwkJCQlzcGluX2xvY2soJnN1X2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOwogCQkJCWF0b21pY19kZWMoJnRnX3B0X2dwLT50Z19wdF9ncF9yZWZfY250KTsKIAkJCQlzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXNwaW5fdW5sb2NrKCZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbG9jayk7CisJCQlzcGluX3VubG9jaygmc3VfZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbG9jayk7CiAJCQkvKgogCQkJICogSWYgbm90IG1hdGNoaW5nIHRhcmdldCBwb3J0IGdyb3VwIElEIGNhbiBiZSBsb2NhdGVkCiAJCQkgKiB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBBU0NROiBJTlZBTElEX1BBUkFNRVRFUl9MSVNUCiAJCQkgKi8KLQkJCWlmIChyYyAhPSAwKQotCQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCQlpZiAocmMgIT0gMCkgeworCQkJCXJjID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJCWdvdG8gb3V0OworCQkJfQogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIEV4dGFjdCB0aGUgUkVMQVRJVkUgVEFSR0VUIFBPUlQgSURFTlRJRklFUiB0byBpZGVudGlmeQpAQCAtMjg3LDE0ICszMTAsMTkgQEAKIAkJCSAqIGJlIGxvY2F0ZWQsIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIEFTQ1E6CiAJCQkgKiBJTlZBTElEX1BBUkFNRVRFUl9MSVNUCiAJCQkgKi8KLQkJCWlmIChyYyAhPSAwKQotCQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCQlpZiAocmMgIT0gMCkgeworCQkJCXJjID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJCWdvdG8gb3V0OworCQkJfQogCQl9CiAKIAkJcHRyICs9IDQ7CiAJCWxlbiArPSA0OwogCX0KIAorb3V0OgorCXRyYW5zcG9ydF9rdW5tYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDY0LDEzICs0OTIsMTMgQEAKIAl1bnNpZ25lZCBjaGFyICpjZGIsCiAJdTggKmFsdWFfYXNjcSkKIHsKLQlzdHJ1Y3Qgc2VfbHVuICpsdW4gPSBTRV9MVU4oY21kKTsKKwlzdHJ1Y3Qgc2VfbHVuICpsdW4gPSBjbWQtPnNlX2x1bjsKIAlzdHJ1Y3Qgc2VfcG9ydCAqcG9ydCA9IGx1bi0+bHVuX3NlcDsKIAlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AgKnRnX3B0X2dwOwogCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncF9tZW1iZXIgKnRnX3B0X2dwX21lbTsKIAlpbnQgb3V0X2FsdWFfc3RhdGUsIG5vbm9wX2RlbGF5X21zZWNzOwogCi0JaWYgKCEocG9ydCkpCisJaWYgKCFwb3J0KQogCQlyZXR1cm4gMDsKIAkvKgogCSAqIEZpcnN0LCBjaGVjayBmb3IgYSBzdHJ1Y3Qgc2VfcG9ydCBzcGVjaWZpYyBzZWNvbmRhcnkgQUxVQSB0YXJnZXQgcG9ydApAQCAtNDc4LDcgKzUwNiw3IEBACiAJICovCiAJaWYgKGF0b21pY19yZWFkKCZwb3J0LT5zZXBfdGdfcHRfc2Vjb25kYXJ5X29mZmxpbmUpKSB7CiAJCSphbHVhX2FzY3EgPSBBU0NRXzA0SF9BTFVBX09GRkxJTkU7Ci0JCXByaW50ayhLRVJOX0lORk8gIkFMVUE6IEdvdCBzZWNvbmRhcnkgb2ZmbGluZSBzdGF0dXMgZm9yIGxvY2FsIgorCQlwcl9kZWJ1ZygiQUxVQTogR290IHNlY29uZGFyeSBvZmZsaW5lIHN0YXR1cyBmb3IgbG9jYWwiCiAJCQkJIiB0YXJnZXQgcG9ydFxuIik7CiAJCSphbHVhX2FzY3EgPSBBU0NRXzA0SF9BTFVBX09GRkxJTkU7CiAJCXJldHVybiAxOwpAQCAtNTIwLDkgKzU0OCw5IEBACiAJICovCiAJY2FzZSBBTFVBX0FDQ0VTU19TVEFURV9PRkZMSU5FOgogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5rbm93biBBTFVBIGFjY2VzcyBzdGF0ZTogMHglMDJ4XG4iLAorCQlwcl9lcnIoIlVua25vd24gQUxVQSBhY2Nlc3Mgc3RhdGU6IDB4JTAyeFxuIiwKIAkJCQlvdXRfYWx1YV9zdGF0ZSk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC01NTIsOCArNTgwLDggQEAKIAkJKnByaW1hcnkgPSAwOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIlVua25vd24gQUxVQSBhY2Nlc3Mgc3RhdGU6IDB4JTAyeFxuIiwgc3RhdGUpOwotCQlyZXR1cm4gLTE7CisJCXByX2VycigiVW5rbm93biBBTFVBIGFjY2VzcyBzdGF0ZTogMHglMDJ4XG4iLCBzdGF0ZSk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiAwOwpAQCAtNjEwLDcgKzYzOCw3IEBACiAJICogVGhlIEFMVUEgQWN0aXZlL05vbk9wdGltaXplZCBhY2Nlc3Mgc3RhdGUgZGVsYXkgY2FuIGJlIGRpc2FibGVkCiAJICogaW4gdmlhIGNvbmZpZ2ZzIHdpdGggYSB2YWx1ZSBvZiB6ZXJvCiAJICovCi0JaWYgKCEoY21kLT5hbHVhX25vbm9wX2RlbGF5KSkKKwlpZiAoIWNtZC0+YWx1YV9ub25vcF9kZWxheSkKIAkJcmV0dXJuIDA7CiAJLyoKIAkgKiBzdHJ1Y3Qgc2VfY21kLT5hbHVhX25vbm9wX2RlbGF5IGdldHMgc2V0IGJ5IGEgdGFyZ2V0IHBvcnQgZ3JvdXAKQEAgLTYzOSw3ICs2NjcsNyBAQAogCiAJZmlsZSA9IGZpbHBfb3BlbihwYXRoLCBmbGFncywgMDYwMCk7CiAJaWYgKElTX0VSUihmaWxlKSB8fCAhZmlsZSB8fCAhZmlsZS0+Zl9kZW50cnkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmaWxwX29wZW4oJXMpIGZvciBBTFVBIG1ldGFkYXRhIGZhaWxlZFxuIiwKKwkJcHJfZXJyKCJmaWxwX29wZW4oJXMpIGZvciBBTFVBIG1ldGFkYXRhIGZhaWxlZFxuIiwKIAkJCXBhdGgpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC02NTMsNyArNjgxLDcgQEAKIAlzZXRfZnMob2xkX2ZzKTsKIAogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3Igd3JpdGluZyBBTFVBIG1ldGFkYXRhIGZpbGU6ICVzXG4iLCBwYXRoKTsKKwkJcHJfZXJyKCJFcnJvciB3cml0aW5nIEFMVUEgbWV0YWRhdGEgZmlsZTogJXNcbiIsIHBhdGgpOwogCQlmaWxwX2Nsb3NlKGZpbGUsIE5VTEwpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC03NTAsNyArNzc4LDcgQEAKIAkJCSAqIHNlX2RldmUtPnNlX2x1bl9hY2wgcG9pbnRlciBtYXkgYmUgTlVMTCBmb3IgYQogCQkJICogZW50cnkgY3JlYXRlZCB3aXRob3V0IGV4cGxpY3QgTm9kZStNYXBwZWRMVU4gQUNMcwogCQkJICovCi0JCQlpZiAoIShsYWNsKSkKKwkJCWlmICghbGFjbCkKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKGV4cGxpY3QgJiYKQEAgLTc5Miw3ICs4MjAsNyBAQAogCSAqLwogCWF0b21pY19zZXQoJnRnX3B0X2dwLT50Z19wdF9ncF9hbHVhX2FjY2Vzc19zdGF0ZSwgbmV3X3N0YXRlKTsKIAotCXByaW50ayhLRVJOX0lORk8gIlN1Y2Nlc3NmdWwgJXMgQUxVQSB0cmFuc2l0aW9uIFRHIFBUIEdyb3VwOiAlcyBJRDogJWh1IgorCXByX2RlYnVnKCJTdWNjZXNzZnVsICVzIEFMVUEgdHJhbnNpdGlvbiBURyBQVCBHcm91cDogJXMgSUQ6ICVodSIKIAkJIiBmcm9tIHByaW1hcnkgYWNjZXNzIHN0YXRlICVzIHRvICVzXG4iLCAoZXhwbGljdCkgPyAiZXhwbGljdCIgOgogCQkiaW1wbGljdCIsIGNvbmZpZ19pdGVtX25hbWUoJnRnX3B0X2dwLT50Z19wdF9ncF9ncm91cC5jZ19pdGVtKSwKIAkJdGdfcHRfZ3AtPnRnX3B0X2dwX2lkLCBjb3JlX2FsdWFfZHVtcF9zdGF0ZShvbGRfc3RhdGUpLApAQCAtODIzLDggKzg1MSw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWRfYnVmID0ga3phbGxvYyhsX3RnX3B0X2dwLT50Z19wdF9ncF9tZF9idWZfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIShtZF9idWYpKSB7Ci0JCXByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZiBmb3IgQUxVQSBtZXRhZGF0YVxuIik7CisJaWYgKCFtZF9idWYpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgYnVmIGZvciBBTFVBIG1ldGFkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC04MzksNyArODY3LDcgQEAKIAkgKiB3ZSBvbmx5IGRvIHRyYW5zaXRpb24gb24gdGhlIHBhc3NlZCAqbF90cF9wdF9ncCwgYW5kIG5vdAogCSAqIG9uIGFsbCBvZiB0aGUgbWF0Y2hpbmcgdGFyZ2V0IHBvcnQgZ3JvdXBzIElEcyBpbiBkZWZhdWx0X2x1X2dwLgogCSAqLwotCWlmICghKGx1X2dwLT5sdV9ncF9pZCkpIHsKKwlpZiAoIWx1X2dwLT5sdV9ncF9pZCkgewogCQkvKgogCQkgKiBjb3JlX2FsdWFfZG9fdHJhbnNpdGlvbl90Z19wdCgpIHdpbGwgYWx3YXlzIHJldHVybgogCQkgKiBzdWNjZXNzLgpAQCAtODY2LDEyICs4OTQsMTIgQEAKIAkJc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCk7CiAJCXNwaW5fdW5sb2NrKCZsdV9ncC0+bHVfZ3BfbG9jayk7CiAKLQkJc3Bpbl9sb2NrKCZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbG9jayk7CisJCXNwaW5fbG9jaygmc3VfZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodGdfcHRfZ3AsCi0JCQkJJlQxMF9BTFVBKHN1X2RldiktPnRnX3B0X2dwc19saXN0LAorCQkJCSZzdV9kZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19saXN0LAogCQkJCXRnX3B0X2dwX2xpc3QpIHsKIAotCQkJaWYgKCEodGdfcHRfZ3AtPnRnX3B0X2dwX3ZhbGlkX2lkKSkKKwkJCWlmICghdGdfcHRfZ3AtPnRnX3B0X2dwX3ZhbGlkX2lkKQogCQkJCWNvbnRpbnVlOwogCQkJLyoKIAkJCSAqIElmIHRoZSB0YXJnZXQgYmVoYXZpb3IgcG9ydCBhc3ltbWV0cmljIGFjY2VzcyBzdGF0ZQpAQCAtODkzLDcgKzkyMSw3IEBACiAJCQl9CiAJCQlhdG9taWNfaW5jKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfcmVmX2NudCk7CiAJCQlzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKTsKLQkJCXNwaW5fdW5sb2NrKCZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbG9jayk7CisJCQlzcGluX3VubG9jaygmc3VfZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbG9jayk7CiAJCQkvKgogCQkJICogY29yZV9hbHVhX2RvX3RyYW5zaXRpb25fdGdfcHQoKSB3aWxsIGFsd2F5cyByZXR1cm4KIAkJCSAqIHN1Y2Nlc3MuCkBAIC05MDEsMTEgKzkyOSwxMSBAQAogCQkJY29yZV9hbHVhX2RvX3RyYW5zaXRpb25fdGdfcHQodGdfcHRfZ3AsIHBvcnQsCiAJCQkJCW5hY2wsIG1kX2J1ZiwgbmV3X3N0YXRlLCBleHBsaWN0KTsKIAotCQkJc3Bpbl9sb2NrKCZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbG9jayk7CisJCQlzcGluX2xvY2soJnN1X2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOwogCQkJYXRvbWljX2RlYygmdGdfcHRfZ3AtPnRnX3B0X2dwX3JlZl9jbnQpOwogCQkJc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCk7CiAJCX0KLQkJc3Bpbl91bmxvY2soJlQxMF9BTFVBKHN1X2RldiktPnRnX3B0X2dwc19sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnN1X2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOwogCiAJCXNwaW5fbG9jaygmbHVfZ3AtPmx1X2dwX2xvY2spOwogCQlhdG9taWNfZGVjKCZsdV9ncF9tZW0tPmx1X2dwX21lbV9yZWZfY250KTsKQEAgLTkxMyw3ICs5NDEsNyBAQAogCX0KIAlzcGluX3VubG9jaygmbHVfZ3AtPmx1X2dwX2xvY2spOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiU3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBMVSBHcm91cDogJXMgYWxsIEFMVUEgVEcgUFQiCisJcHJfZGVidWcoIlN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgTFUgR3JvdXA6ICVzIGFsbCBBTFVBIFRHIFBUIgogCQkiIEdyb3VwIElEczogJWh1ICVzIHRyYW5zaXRpb24gdG8gcHJpbWFyeSBzdGF0ZTogJXNcbiIsCiAJCWNvbmZpZ19pdGVtX25hbWUoJmx1X2dwLT5sdV9ncF9ncm91cC5jZ19pdGVtKSwKIAkJbF90Z19wdF9ncC0+dGdfcHRfZ3BfaWQsIChleHBsaWN0KSA/ICJleHBsaWN0IiA6ICJpbXBsaWN0IiwKQEAgLTk0MiwxMSArOTcwLDExIEBACiAJbWVtc2V0KHd3biwgMCwgQUxVQV9TRUNPTkRBUllfTUVUQURBVEFfV1dOX0xFTik7CiAKIAlsZW4gPSBzbnByaW50Zih3d24sIEFMVUFfU0VDT05EQVJZX01FVEFEQVRBX1dXTl9MRU4sICIlcyIsCi0JCQlUUEdfVEZPKHNlX3RwZyktPnRwZ19nZXRfd3duKHNlX3RwZykpOworCQkJc2VfdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3d3bihzZV90cGcpKTsKIAotCWlmIChUUEdfVEZPKHNlX3RwZyktPnRwZ19nZXRfdGFnICE9IE5VTEwpCisJaWYgKHNlX3RwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcgIT0gTlVMTCkKIAkJc25wcmludGYod3duK2xlbiwgQUxVQV9TRUNPTkRBUllfTUVUQURBVEFfV1dOX0xFTi1sZW4sICIrJWh1IiwKLQkJCQlUUEdfVEZPKHNlX3RwZyktPnRwZ19nZXRfdGFnKHNlX3RwZykpOworCQkJCXNlX3RwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcoc2VfdHBnKSk7CiAKIAlsZW4gPSBzbnByaW50ZihtZF9idWYsIG1kX2J1Zl9sZW4sICJhbHVhX3RnX3B0X29mZmxpbmU9JWRcbiIKIAkJCSJhbHVhX3RnX3B0X3N0YXR1cz0weCUwMnhcbiIsCkBAIC05NTQsNyArOTgyLDcgQEAKIAkJCXBvcnQtPnNlcF90Z19wdF9zZWNvbmRhcnlfc3RhdCk7CiAKIAlzbnByaW50ZihwYXRoLCBBTFVBX01FVEFEQVRBX1BBVEhfTEVOLCAiL3Zhci90YXJnZXQvYWx1YS8lcy8lcy9sdW5fJXUiLAotCQkJVFBHX1RGTyhzZV90cGcpLT5nZXRfZmFicmljX25hbWUoKSwgd3duLAorCQkJc2VfdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgd3duLAogCQkJcG9ydC0+c2VwX2x1bi0+dW5wYWNrZWRfbHVuKTsKIAogCXJldHVybiBjb3JlX2FsdWFfd3JpdGVfdHBnX21ldGFkYXRhKHBhdGgsIG1kX2J1ZiwgbGVuKTsKQEAgLTk3MywxMSArMTAwMSwxMSBAQAogCiAJc3Bpbl9sb2NrKCZ0Z19wdF9ncF9tZW0tPnRnX3B0X2dwX21lbV9sb2NrKTsKIAl0Z19wdF9ncCA9IHRnX3B0X2dwX21lbS0+dGdfcHRfZ3A7Ci0JaWYgKCEodGdfcHRfZ3ApKSB7CisJaWYgKCF0Z19wdF9ncCkgewogCQlzcGluX3VubG9jaygmdGdfcHRfZ3BfbWVtLT50Z19wdF9ncF9tZW1fbG9jayk7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGNvbXBsZXRlIHNlY29uZGFyeSBzdGF0ZSIKKwkJcHJfZXJyKCJVbmFibGUgdG8gY29tcGxldGUgc2Vjb25kYXJ5IHN0YXRlIgogCQkJCSIgdHJhbnNpdGlvblxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXRyYW5zX2RlbGF5X21zZWNzID0gdGdfcHRfZ3AtPnRnX3B0X2dwX3RyYW5zX2RlbGF5X21zZWNzOwogCS8qCkBAIC05OTQsNyArMTAyMiw3IEBACiAJCQlBTFVBX1NUQVRVU19BTFRFUkVEX0JZX0VYUExJQ1RfU1RQRyA6CiAJCQlBTFVBX1NUQVRVU19BTFRFUkVEX0JZX0lNUExJQ1RfQUxVQTsKIAotCXByaW50ayhLRVJOX0lORk8gIlN1Y2Nlc3NmdWwgJXMgQUxVQSB0cmFuc2l0aW9uIFRHIFBUIEdyb3VwOiAlcyBJRDogJWh1IgorCXByX2RlYnVnKCJTdWNjZXNzZnVsICVzIEFMVUEgdHJhbnNpdGlvbiBURyBQVCBHcm91cDogJXMgSUQ6ICVodSIKIAkJIiB0byBzZWNvbmRhcnkgYWNjZXNzIHN0YXRlOiAlc1xuIiwgKGV4cGxpY3QpID8gImV4cGxpY3QiIDoKIAkJImltcGxpY3QiLCBjb25maWdfaXRlbV9uYW1lKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfZ3JvdXAuY2dfaXRlbSksCiAJCXRnX3B0X2dwLT50Z19wdF9ncF9pZCwgKG9mZmxpbmUpID8gIk9GRkxJTkUiIDogIk9OTElORSIpOwpAQCAtMTAxMiwxMCArMTA0MCwxMCBAQAogCSAqLwogCWlmIChwb3J0LT5zZXBfdGdfcHRfc2Vjb25kYXJ5X3dyaXRlX21kKSB7CiAJCW1kX2J1ZiA9IGt6YWxsb2MobWRfYnVmX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghKG1kX2J1ZikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIG1kX2J1ZiBmb3IiCisJCWlmICghbWRfYnVmKSB7CisJCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZF9idWYgZm9yIgogCQkJCSIgc2Vjb25kYXJ5IEFMVUEgYWNjZXNzIG1ldGFkYXRhXG4iKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCW11dGV4X2xvY2soJnBvcnQtPnNlcF90Z19wdF9tZF9tdXRleCk7CiAJCWNvcmVfYWx1YV91cGRhdGVfdHBnX3NlY29uZGFyeV9tZXRhZGF0YSh0Z19wdF9ncF9tZW0sIHBvcnQsCkBAIC0xMDM0LDE5ICsxMDYyLDE5IEBACiAJc3RydWN0IHQxMF9hbHVhX2x1X2dwICpsdV9ncDsKIAogCWx1X2dwID0ga21lbV9jYWNoZV96YWxsb2ModDEwX2FsdWFfbHVfZ3BfY2FjaGUsIEdGUF9LRVJORUwpOwotCWlmICghKGx1X2dwKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3BcbiIpOworCWlmICghbHVfZ3ApIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHQxMF9hbHVhX2x1X2dwXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQotCUlOSVRfTElTVF9IRUFEKCZsdV9ncC0+bHVfZ3BfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmx1X2dwLT5sdV9ncF9ub2RlKTsKIAlJTklUX0xJU1RfSEVBRCgmbHVfZ3AtPmx1X2dwX21lbV9saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmbHVfZ3AtPmx1X2dwX2xvY2spOwogCWF0b21pY19zZXQoJmx1X2dwLT5sdV9ncF9yZWZfY250LCAwKTsKIAogCWlmIChkZWZfZ3JvdXApIHsKLQkJbHVfZ3AtPmx1X2dwX2lkID0gc2VfZ2xvYmFsLT5hbHVhX2x1X2dwc19jb3VudGVyKys7CisJCWx1X2dwLT5sdV9ncF9pZCA9IGFsdWFfbHVfZ3BzX2NvdW50ZXIrKzsKIAkJbHVfZ3AtPmx1X2dwX3ZhbGlkX2lkID0gMTsKLQkJc2VfZ2xvYmFsLT5hbHVhX2x1X2dwc19jb3VudCsrOworCQlhbHVhX2x1X2dwc19jb3VudCsrOwogCX0KIAogCXJldHVybiBsdV9ncDsKQEAgLTEwNjAsNDEgKzEwODgsNDEgQEAKIAkgKiBUaGUgbHVfZ3AtPmx1X2dwX2lkIG1heSBvbmx5IGJlIHNldCBvbmNlLi4KIAkgKi8KIAlpZiAobHVfZ3AtPmx1X2dwX3ZhbGlkX2lkKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkFMVUEgTFUgR3JvdXAgYWxyZWFkeSBoYXMgYSB2YWxpZCBJRCwiCisJCXByX3dhcm4oIkFMVUEgTFUgR3JvdXAgYWxyZWFkeSBoYXMgYSB2YWxpZCBJRCwiCiAJCQkiIGlnbm9yaW5nIHJlcXVlc3RcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNwaW5fbG9jaygmc2VfZ2xvYmFsLT5sdV9ncHNfbG9jayk7Ci0JaWYgKHNlX2dsb2JhbC0+YWx1YV9sdV9ncHNfY291bnQgPT0gMHgwMDAwZmZmZikgewotCQlwcmludGsoS0VSTl9FUlIgIk1heGltdW0gQUxVQSBzZV9nbG9iYWwtPmFsdWFfbHVfZ3BzX2NvdW50OiIKKwlzcGluX2xvY2soJmx1X2dwc19sb2NrKTsKKwlpZiAoYWx1YV9sdV9ncHNfY291bnQgPT0gMHgwMDAwZmZmZikgeworCQlwcl9lcnIoIk1heGltdW0gQUxVQSBhbHVhX2x1X2dwc19jb3VudDoiCiAJCQkJIiAweDAwMDBmZmZmIHJlYWNoZWRcbiIpOwotCQlzcGluX3VubG9jaygmc2VfZ2xvYmFsLT5sdV9ncHNfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZsdV9ncHNfbG9jayk7CiAJCWttZW1fY2FjaGVfZnJlZSh0MTBfYWx1YV9sdV9ncF9jYWNoZSwgbHVfZ3ApOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PU1BDOwogCX0KIGFnYWluOgogCWx1X2dwX2lkX3RtcCA9IChsdV9ncF9pZCAhPSAwKSA/IGx1X2dwX2lkIDoKLQkJCQlzZV9nbG9iYWwtPmFsdWFfbHVfZ3BzX2NvdW50ZXIrKzsKKwkJCQlhbHVhX2x1X2dwc19jb3VudGVyKys7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGx1X2dwX3RtcCwgJnNlX2dsb2JhbC0+Z19sdV9ncHNfbGlzdCwgbHVfZ3BfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkobHVfZ3BfdG1wLCAmbHVfZ3BzX2xpc3QsIGx1X2dwX25vZGUpIHsKIAkJaWYgKGx1X2dwX3RtcC0+bHVfZ3BfaWQgPT0gbHVfZ3BfaWRfdG1wKSB7Ci0JCQlpZiAoIShsdV9ncF9pZCkpCisJCQlpZiAoIWx1X2dwX2lkKQogCQkJCWdvdG8gYWdhaW47CiAKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFMVUEgTG9naWNhbCBVbml0IEdyb3VwIElEOiAlaHUiCisJCQlwcl93YXJuKCJBTFVBIExvZ2ljYWwgVW5pdCBHcm91cCBJRDogJWh1IgogCQkJCSIgYWxyZWFkeSBleGlzdHMsIGlnbm9yaW5nIHJlcXVlc3RcbiIsCiAJCQkJbHVfZ3BfaWQpOwotCQkJc3Bpbl91bmxvY2soJnNlX2dsb2JhbC0+bHVfZ3BzX2xvY2spOwotCQkJcmV0dXJuIC0xOworCQkJc3Bpbl91bmxvY2soJmx1X2dwc19sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCiAJbHVfZ3AtPmx1X2dwX2lkID0gbHVfZ3BfaWRfdG1wOwogCWx1X2dwLT5sdV9ncF92YWxpZF9pZCA9IDE7Ci0JbGlzdF9hZGRfdGFpbCgmbHVfZ3AtPmx1X2dwX2xpc3QsICZzZV9nbG9iYWwtPmdfbHVfZ3BzX2xpc3QpOwotCXNlX2dsb2JhbC0+YWx1YV9sdV9ncHNfY291bnQrKzsKLQlzcGluX3VubG9jaygmc2VfZ2xvYmFsLT5sdV9ncHNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmbHVfZ3AtPmx1X2dwX25vZGUsICZsdV9ncHNfbGlzdCk7CisJYWx1YV9sdV9ncHNfY291bnQrKzsKKwlzcGluX3VubG9jaygmbHVfZ3BzX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTA1LDggKzExMzMsOCBAQAogCXN0cnVjdCB0MTBfYWx1YV9sdV9ncF9tZW1iZXIgKmx1X2dwX21lbTsKIAogCWx1X2dwX21lbSA9IGttZW1fY2FjaGVfemFsbG9jKHQxMF9hbHVhX2x1X2dwX21lbV9jYWNoZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEobHVfZ3BfbWVtKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3BfbWVtYmVyXG4iKTsKKwlpZiAoIWx1X2dwX21lbSkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3BfbWVtYmVyXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCUlOSVRfTElTVF9IRUFEKCZsdV9ncF9tZW0tPmx1X2dwX21lbV9saXN0KTsKQEAgLTExMzAsMTEgKzExNTgsMTEgQEAKIAkgKiBubyBhc3NvY2lhdGlvbnMgY2FuIGJlIG1hZGUgd2hpbGUgd2UgYXJlIHJlbGVhc2luZwogCSAqIHN0cnVjdCB0MTBfYWx1YV9sdV9ncC4KIAkgKi8KLQlzcGluX2xvY2soJnNlX2dsb2JhbC0+bHVfZ3BzX2xvY2spOworCXNwaW5fbG9jaygmbHVfZ3BzX2xvY2spOwogCWF0b21pY19zZXQoJmx1X2dwLT5sdV9ncF9zaHV0ZG93biwgMSk7Ci0JbGlzdF9kZWwoJmx1X2dwLT5sdV9ncF9saXN0KTsKLQlzZV9nbG9iYWwtPmFsdWFfbHVfZ3BzX2NvdW50LS07Ci0Jc3Bpbl91bmxvY2soJnNlX2dsb2JhbC0+bHVfZ3BzX2xvY2spOworCWxpc3RfZGVsKCZsdV9ncC0+bHVfZ3Bfbm9kZSk7CisJYWx1YV9sdV9ncHNfY291bnQtLTsKKwlzcGluX3VubG9jaygmbHVfZ3BzX2xvY2spOwogCS8qCiAJICogQWxsb3cgc3RydWN0IHQxMF9hbHVhX2x1X2dwICogcmVmZXJlbmNlZCBieSBjb3JlX2FsdWFfZ2V0X2x1X2dwX2J5X25hbWUoKQogCSAqIGluIHRhcmdldF9jb3JlX2NvbmZpZ2ZzLmM6dGFyZ2V0X2NvcmVfc3RvcmVfYWx1YV9sdV9ncCgpIHRvIGJlCkBAIC0xMTY1LDkgKzExOTMsOSBAQAogCQkgKiB3ZSB3YW50IHRvIHJlLWFzc29jYXRlIGEgZ2l2ZW4gbHVfZ3BfbWVtIHdpdGggZGVmYXVsdF9sdV9ncC4KIAkJICovCiAJCXNwaW5fbG9jaygmbHVfZ3BfbWVtLT5sdV9ncF9tZW1fbG9jayk7Ci0JCWlmIChsdV9ncCAhPSBzZV9nbG9iYWwtPmRlZmF1bHRfbHVfZ3ApCisJCWlmIChsdV9ncCAhPSBkZWZhdWx0X2x1X2dwKQogCQkJX19jb3JlX2FsdWFfYXR0YWNoX2x1X2dwX21lbShsdV9ncF9tZW0sCi0JCQkJCXNlX2dsb2JhbC0+ZGVmYXVsdF9sdV9ncCk7CisJCQkJCWRlZmF1bHRfbHVfZ3ApOwogCQllbHNlCiAJCQlsdV9ncF9tZW0tPmx1X2dwID0gTlVMTDsKIAkJc3Bpbl91bmxvY2soJmx1X2dwX21lbS0+bHVfZ3BfbWVtX2xvY2spOwpAQCAtMTE4Miw3ICsxMjEwLDcgQEAKIHZvaWQgY29yZV9hbHVhX2ZyZWVfbHVfZ3BfbWVtKHN0cnVjdCBzZV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gZGV2LT5zZV9zdWJfZGV2OwotCXN0cnVjdCB0MTBfYWx1YSAqYWx1YSA9IFQxMF9BTFVBKHN1X2Rldik7CisJc3RydWN0IHQxMF9hbHVhICphbHVhID0gJnN1X2Rldi0+dDEwX2FsdWE7CiAJc3RydWN0IHQxMF9hbHVhX2x1X2dwICpsdV9ncDsKIAlzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3BfbWVtYmVyICpsdV9ncF9tZW07CiAKQEAgLTExOTAsNyArMTIxOCw3IEBACiAJCXJldHVybjsKIAogCWx1X2dwX21lbSA9IGRldi0+ZGV2X2FsdWFfbHVfZ3BfbWVtOwotCWlmICghKGx1X2dwX21lbSkpCisJaWYgKCFsdV9ncF9tZW0pCiAJCXJldHVybjsKIAogCXdoaWxlIChhdG9taWNfcmVhZCgmbHVfZ3BfbWVtLT5sdV9ncF9tZW1fcmVmX2NudCkpCkBAIC0xMTk4LDcgKzEyMjYsNyBAQAogCiAJc3Bpbl9sb2NrKCZsdV9ncF9tZW0tPmx1X2dwX21lbV9sb2NrKTsKIAlsdV9ncCA9IGx1X2dwX21lbS0+bHVfZ3A7Ci0JaWYgKChsdV9ncCkpIHsKKwlpZiAobHVfZ3ApIHsKIAkJc3Bpbl9sb2NrKCZsdV9ncC0+bHVfZ3BfbG9jayk7CiAJCWlmIChsdV9ncF9tZW0tPmx1X2dwX2Fzc29jKSB7CiAJCQlsaXN0X2RlbCgmbHVfZ3BfbWVtLT5sdV9ncF9tZW1fbGlzdCk7CkBAIC0xMjE4LDI3ICsxMjQ2LDI3IEBACiAJc3RydWN0IHQxMF9hbHVhX2x1X2dwICpsdV9ncDsKIAlzdHJ1Y3QgY29uZmlnX2l0ZW0gKmNpOwogCi0Jc3Bpbl9sb2NrKCZzZV9nbG9iYWwtPmx1X2dwc19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGx1X2dwLCAmc2VfZ2xvYmFsLT5nX2x1X2dwc19saXN0LCBsdV9ncF9saXN0KSB7Ci0JCWlmICghKGx1X2dwLT5sdV9ncF92YWxpZF9pZCkpCisJc3Bpbl9sb2NrKCZsdV9ncHNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsdV9ncCwgJmx1X2dwc19saXN0LCBsdV9ncF9ub2RlKSB7CisJCWlmICghbHVfZ3AtPmx1X2dwX3ZhbGlkX2lkKQogCQkJY29udGludWU7CiAJCWNpID0gJmx1X2dwLT5sdV9ncF9ncm91cC5jZ19pdGVtOwotCQlpZiAoIShzdHJjbXAoY29uZmlnX2l0ZW1fbmFtZShjaSksIG5hbWUpKSkgeworCQlpZiAoIXN0cmNtcChjb25maWdfaXRlbV9uYW1lKGNpKSwgbmFtZSkpIHsKIAkJCWF0b21pY19pbmMoJmx1X2dwLT5sdV9ncF9yZWZfY250KTsKLQkJCXNwaW5fdW5sb2NrKCZzZV9nbG9iYWwtPmx1X2dwc19sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZsdV9ncHNfbG9jayk7CiAJCQlyZXR1cm4gbHVfZ3A7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJnNlX2dsb2JhbC0+bHVfZ3BzX2xvY2spOworCXNwaW5fdW5sb2NrKCZsdV9ncHNfbG9jayk7CiAKIAlyZXR1cm4gTlVMTDsKIH0KIAogdm9pZCBjb3JlX2FsdWFfcHV0X2x1X2dwX2Zyb21fbmFtZShzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3AgKmx1X2dwKQogewotCXNwaW5fbG9jaygmc2VfZ2xvYmFsLT5sdV9ncHNfbG9jayk7CisJc3Bpbl9sb2NrKCZsdV9ncHNfbG9jayk7CiAJYXRvbWljX2RlYygmbHVfZ3AtPmx1X2dwX3JlZl9jbnQpOwotCXNwaW5fdW5sb2NrKCZzZV9nbG9iYWwtPmx1X2dwc19sb2NrKTsKKwlzcGluX3VubG9jaygmbHVfZ3BzX2xvY2spOwogfQogCiAvKgpAQCAtMTI3OSw4ICsxMzA3LDggQEAKIAlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AgKnRnX3B0X2dwOwogCiAJdGdfcHRfZ3AgPSBrbWVtX2NhY2hlX3phbGxvYyh0MTBfYWx1YV90Z19wdF9ncF9jYWNoZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEodGdfcHRfZ3ApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncFxuIik7CisJaWYgKCF0Z19wdF9ncCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3BcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJSU5JVF9MSVNUX0hFQUQoJnRnX3B0X2dwLT50Z19wdF9ncF9saXN0KTsKQEAgLTEzMDQsMTQgKzEzMzIsMTQgQEAKIAl0Z19wdF9ncC0+dGdfcHRfZ3BfdHJhbnNfZGVsYXlfbXNlY3MgPSBBTFVBX0RFRkFVTFRfVFJBTlNfREVMQVlfTVNFQ1M7CiAKIAlpZiAoZGVmX2dyb3VwKSB7Ci0JCXNwaW5fbG9jaygmVDEwX0FMVUEoc3VfZGV2KS0+dGdfcHRfZ3BzX2xvY2spOworCQlzcGluX2xvY2soJnN1X2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOwogCQl0Z19wdF9ncC0+dGdfcHRfZ3BfaWQgPQotCQkJCVQxMF9BTFVBKHN1X2RldiktPmFsdWFfdGdfcHRfZ3BzX2NvdW50ZXIrKzsKKwkJCQlzdV9kZXYtPnQxMF9hbHVhLmFsdWFfdGdfcHRfZ3BzX2NvdW50ZXIrKzsKIAkJdGdfcHRfZ3AtPnRnX3B0X2dwX3ZhbGlkX2lkID0gMTsKLQkJVDEwX0FMVUEoc3VfZGV2KS0+YWx1YV90Z19wdF9ncHNfY291bnQrKzsKKwkJc3VfZGV2LT50MTBfYWx1YS5hbHVhX3RnX3B0X2dwc19jb3VudCsrOwogCQlsaXN0X2FkZF90YWlsKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfbGlzdCwKLQkJCSAgICAgICZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbG9jayk7CisJCQkgICAgICAmc3VfZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZzdV9kZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19sb2NrKTsKIAl9CiAKIAlyZXR1cm4gdGdfcHRfZ3A7CkBAIC0xMzI4LDQyICsxMzU2LDQyIEBACiAJICogVGhlIHRnX3B0X2dwLT50Z19wdF9ncF9pZCBtYXkgb25seSBiZSBzZXQgb25jZS4uCiAJICovCiAJaWYgKHRnX3B0X2dwLT50Z19wdF9ncF92YWxpZF9pZCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJBTFVBIFRHIFBUIEdyb3VwIGFscmVhZHkgaGFzIGEgdmFsaWQgSUQsIgorCQlwcl93YXJuKCJBTFVBIFRHIFBUIEdyb3VwIGFscmVhZHkgaGFzIGEgdmFsaWQgSUQsIgogCQkJIiBpZ25vcmluZyByZXF1ZXN0XG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzcGluX2xvY2soJlQxMF9BTFVBKHN1X2RldiktPnRnX3B0X2dwc19sb2NrKTsKLQlpZiAoVDEwX0FMVUEoc3VfZGV2KS0+YWx1YV90Z19wdF9ncHNfY291bnQgPT0gMHgwMDAwZmZmZikgewotCQlwcmludGsoS0VSTl9FUlIgIk1heGltdW0gQUxVQSBhbHVhX3RnX3B0X2dwc19jb3VudDoiCisJc3Bpbl9sb2NrKCZzdV9kZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19sb2NrKTsKKwlpZiAoc3VfZGV2LT50MTBfYWx1YS5hbHVhX3RnX3B0X2dwc19jb3VudCA9PSAweDAwMDBmZmZmKSB7CisJCXByX2VycigiTWF4aW11bSBBTFVBIGFsdWFfdGdfcHRfZ3BzX2NvdW50OiIKIAkJCSIgMHgwMDAwZmZmZiByZWFjaGVkXG4iKTsKLQkJc3Bpbl91bmxvY2soJlQxMF9BTFVBKHN1X2RldiktPnRnX3B0X2dwc19sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnN1X2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOwogCQlrbWVtX2NhY2hlX2ZyZWUodDEwX2FsdWFfdGdfcHRfZ3BfY2FjaGUsIHRnX3B0X2dwKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiBhZ2FpbjoKIAl0Z19wdF9ncF9pZF90bXAgPSAodGdfcHRfZ3BfaWQgIT0gMCkgPyB0Z19wdF9ncF9pZCA6Ci0JCQlUMTBfQUxVQShzdV9kZXYpLT5hbHVhX3RnX3B0X2dwc19jb3VudGVyKys7CisJCQlzdV9kZXYtPnQxMF9hbHVhLmFsdWFfdGdfcHRfZ3BzX2NvdW50ZXIrKzsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkodGdfcHRfZ3BfdG1wLCAmVDEwX0FMVUEoc3VfZGV2KS0+dGdfcHRfZ3BzX2xpc3QsCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0Z19wdF9ncF90bXAsICZzdV9kZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19saXN0LAogCQkJdGdfcHRfZ3BfbGlzdCkgewogCQlpZiAodGdfcHRfZ3BfdG1wLT50Z19wdF9ncF9pZCA9PSB0Z19wdF9ncF9pZF90bXApIHsKLQkJCWlmICghKHRnX3B0X2dwX2lkKSkKKwkJCWlmICghdGdfcHRfZ3BfaWQpCiAJCQkJZ290byBhZ2FpbjsKIAotCQkJcHJpbnRrKEtFUk5fRVJSICJBTFVBIFRhcmdldCBQb3J0IEdyb3VwIElEOiAlaHUgYWxyZWFkeSIKKwkJCXByX2VycigiQUxVQSBUYXJnZXQgUG9ydCBHcm91cCBJRDogJWh1IGFscmVhZHkiCiAJCQkJIiBleGlzdHMsIGlnbm9yaW5nIHJlcXVlc3RcbiIsIHRnX3B0X2dwX2lkKTsKLQkJCXNwaW5fdW5sb2NrKCZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbG9jayk7Ci0JCQlyZXR1cm4gLTE7CisJCQlzcGluX3VubG9jaygmc3VfZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAogCXRnX3B0X2dwLT50Z19wdF9ncF9pZCA9IHRnX3B0X2dwX2lkX3RtcDsKIAl0Z19wdF9ncC0+dGdfcHRfZ3BfdmFsaWRfaWQgPSAxOwogCWxpc3RfYWRkX3RhaWwoJnRnX3B0X2dwLT50Z19wdF9ncF9saXN0LAotCQkJJlQxMF9BTFVBKHN1X2RldiktPnRnX3B0X2dwc19saXN0KTsKLQlUMTBfQUxVQShzdV9kZXYpLT5hbHVhX3RnX3B0X2dwc19jb3VudCsrOwotCXNwaW5fdW5sb2NrKCZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbG9jayk7CisJCQkmc3VfZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbGlzdCk7CisJc3VfZGV2LT50MTBfYWx1YS5hbHVhX3RnX3B0X2dwc19jb3VudCsrOworCXNwaW5fdW5sb2NrKCZzdV9kZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTM3NSw4ICsxNDAzLDggQEAKIAogCXRnX3B0X2dwX21lbSA9IGttZW1fY2FjaGVfemFsbG9jKHQxMF9hbHVhX3RnX3B0X2dwX21lbV9jYWNoZSwKIAkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoISh0Z19wdF9ncF9tZW0pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncF9tZW1iZXJcbiIpOworCWlmICghdGdfcHRfZ3BfbWVtKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncF9tZW1iZXJcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAJSU5JVF9MSVNUX0hFQUQoJnRnX3B0X2dwX21lbS0+dGdfcHRfZ3BfbWVtX2xpc3QpOwpAQCAtMTQwMywxMCArMTQzMSwxMCBAQAogCSAqIG5vIGFzc2ljYXRpb25zICpPUiogZXhwbGljdCBBTFVBIHZpYSBTRVRfVEFSR0VUX1BPUlRfR1JPVVBTCiAJICogY2FuIGJlIG1hZGUgd2hpbGUgd2UgYXJlIHJlbGVhc2luZyBzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AuCiAJICovCi0Jc3Bpbl9sb2NrKCZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbG9jayk7CisJc3Bpbl9sb2NrKCZzdV9kZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19sb2NrKTsKIAlsaXN0X2RlbCgmdGdfcHRfZ3AtPnRnX3B0X2dwX2xpc3QpOwotCVQxMF9BTFVBKHN1X2RldiktPmFsdWFfdGdfcHRfZ3BzX2NvdW50ZXItLTsKLQlzcGluX3VubG9jaygmVDEwX0FMVUEoc3VfZGV2KS0+dGdfcHRfZ3BzX2xvY2spOworCXN1X2Rldi0+dDEwX2FsdWEuYWx1YV90Z19wdF9ncHNfY291bnRlci0tOworCXNwaW5fdW5sb2NrKCZzdV9kZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19sb2NrKTsKIAkvKgogCSAqIEFsbG93IGEgc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwX21lbWJlciAqIHJlZmVyZW5jZWQgYnkKIAkgKiBjb3JlX2FsdWFfZ2V0X3RnX3B0X2dwX2J5X25hbWUoKSBpbgpAQCAtMTQzOCw5ICsxNDY2LDkgQEAKIAkJICogZGVmYXVsdF90Z19wdF9ncC4KIAkJICovCiAJCXNwaW5fbG9jaygmdGdfcHRfZ3BfbWVtLT50Z19wdF9ncF9tZW1fbG9jayk7Ci0JCWlmICh0Z19wdF9ncCAhPSBUMTBfQUxVQShzdV9kZXYpLT5kZWZhdWx0X3RnX3B0X2dwKSB7CisJCWlmICh0Z19wdF9ncCAhPSBzdV9kZXYtPnQxMF9hbHVhLmRlZmF1bHRfdGdfcHRfZ3ApIHsKIAkJCV9fY29yZV9hbHVhX2F0dGFjaF90Z19wdF9ncF9tZW0odGdfcHRfZ3BfbWVtLAotCQkJCQlUMTBfQUxVQShzdV9kZXYpLT5kZWZhdWx0X3RnX3B0X2dwKTsKKwkJCQkJc3VfZGV2LT50MTBfYWx1YS5kZWZhdWx0X3RnX3B0X2dwKTsKIAkJfSBlbHNlCiAJCQl0Z19wdF9ncF9tZW0tPnRnX3B0X2dwID0gTlVMTDsKIAkJc3Bpbl91bmxvY2soJnRnX3B0X2dwX21lbS0+dGdfcHRfZ3BfbWVtX2xvY2spOwpAQCAtMTQ1NSw3ICsxNDgzLDcgQEAKIHZvaWQgY29yZV9hbHVhX2ZyZWVfdGdfcHRfZ3BfbWVtKHN0cnVjdCBzZV9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBwb3J0LT5zZXBfbHVuLT5sdW5fc2VfZGV2LT5zZV9zdWJfZGV2OwotCXN0cnVjdCB0MTBfYWx1YSAqYWx1YSA9IFQxMF9BTFVBKHN1X2Rldik7CisJc3RydWN0IHQxMF9hbHVhICphbHVhID0gJnN1X2Rldi0+dDEwX2FsdWE7CiAJc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwICp0Z19wdF9ncDsKIAlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3BfbWVtYmVyICp0Z19wdF9ncF9tZW07CiAKQEAgLTE0NjMsNyArMTQ5MSw3IEBACiAJCXJldHVybjsKIAogCXRnX3B0X2dwX21lbSA9IHBvcnQtPnNlcF9hbHVhX3RnX3B0X2dwX21lbTsKLQlpZiAoISh0Z19wdF9ncF9tZW0pKQorCWlmICghdGdfcHRfZ3BfbWVtKQogCQlyZXR1cm47CiAKIAl3aGlsZSAoYXRvbWljX3JlYWQoJnRnX3B0X2dwX21lbS0+dGdfcHRfZ3BfbWVtX3JlZl9jbnQpKQpAQCAtMTQ3MSw3ICsxNDk5LDcgQEAKIAogCXNwaW5fbG9jaygmdGdfcHRfZ3BfbWVtLT50Z19wdF9ncF9tZW1fbG9jayk7CiAJdGdfcHRfZ3AgPSB0Z19wdF9ncF9tZW0tPnRnX3B0X2dwOwotCWlmICgodGdfcHRfZ3ApKSB7CisJaWYgKHRnX3B0X2dwKSB7CiAJCXNwaW5fbG9jaygmdGdfcHRfZ3AtPnRnX3B0X2dwX2xvY2spOwogCQlpZiAodGdfcHRfZ3BfbWVtLT50Z19wdF9ncF9hc3NvYykgewogCQkJbGlzdF9kZWwoJnRnX3B0X2dwX21lbS0+dGdfcHRfZ3BfbWVtX2xpc3QpOwpAQCAtMTQ5MywxOSArMTUyMSwxOSBAQAogCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncCAqdGdfcHRfZ3A7CiAJc3RydWN0IGNvbmZpZ19pdGVtICpjaTsKIAotCXNwaW5fbG9jaygmVDEwX0FMVUEoc3VfZGV2KS0+dGdfcHRfZ3BzX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodGdfcHRfZ3AsICZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbGlzdCwKKwlzcGluX2xvY2soJnN1X2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGdfcHRfZ3AsICZzdV9kZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19saXN0LAogCQkJdGdfcHRfZ3BfbGlzdCkgewotCQlpZiAoISh0Z19wdF9ncC0+dGdfcHRfZ3BfdmFsaWRfaWQpKQorCQlpZiAoIXRnX3B0X2dwLT50Z19wdF9ncF92YWxpZF9pZCkKIAkJCWNvbnRpbnVlOwogCQljaSA9ICZ0Z19wdF9ncC0+dGdfcHRfZ3BfZ3JvdXAuY2dfaXRlbTsKLQkJaWYgKCEoc3RyY21wKGNvbmZpZ19pdGVtX25hbWUoY2kpLCBuYW1lKSkpIHsKKwkJaWYgKCFzdHJjbXAoY29uZmlnX2l0ZW1fbmFtZShjaSksIG5hbWUpKSB7CiAJCQlhdG9taWNfaW5jKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfcmVmX2NudCk7Ci0JCQlzcGluX3VubG9jaygmVDEwX0FMVUEoc3VfZGV2KS0+dGdfcHRfZ3BzX2xvY2spOworCQkJc3Bpbl91bmxvY2soJnN1X2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOwogCQkJcmV0dXJuIHRnX3B0X2dwOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrKCZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbG9jayk7CisJc3Bpbl91bmxvY2soJnN1X2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOwogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xNTE1LDkgKzE1NDMsOSBAQAogewogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSB0Z19wdF9ncC0+dGdfcHRfZ3Bfc3VfZGV2OwogCi0Jc3Bpbl9sb2NrKCZUMTBfQUxVQShzdV9kZXYpLT50Z19wdF9ncHNfbG9jayk7CisJc3Bpbl9sb2NrKCZzdV9kZXYtPnQxMF9hbHVhLnRnX3B0X2dwc19sb2NrKTsKIAlhdG9taWNfZGVjKCZ0Z19wdF9ncC0+dGdfcHRfZ3BfcmVmX2NudCk7Ci0Jc3Bpbl91bmxvY2soJlQxMF9BTFVBKHN1X2RldiktPnRnX3B0X2dwc19sb2NrKTsKKwlzcGluX3VubG9jaygmc3VfZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbG9jayk7CiB9CiAKIC8qCkBAIC0xNTU1LDcgKzE1ODMsNyBAQAogewogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBwb3J0LT5zZXBfbHVuLT5sdW5fc2VfZGV2LT5zZV9zdWJfZGV2OwogCXN0cnVjdCBjb25maWdfaXRlbSAqdGdfcHRfY2k7Ci0Jc3RydWN0IHQxMF9hbHVhICphbHVhID0gVDEwX0FMVUEoc3VfZGV2KTsKKwlzdHJ1Y3QgdDEwX2FsdWEgKmFsdWEgPSAmc3VfZGV2LT50MTBfYWx1YTsKIAlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AgKnRnX3B0X2dwOwogCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncF9tZW1iZXIgKnRnX3B0X2dwX21lbTsKIAlzc2l6ZV90IGxlbiA9IDA7CkBAIC0xNTY0LDEyICsxNTkyLDEyIEBACiAJCXJldHVybiBsZW47CiAKIAl0Z19wdF9ncF9tZW0gPSBwb3J0LT5zZXBfYWx1YV90Z19wdF9ncF9tZW07Ci0JaWYgKCEodGdfcHRfZ3BfbWVtKSkKKwlpZiAoIXRnX3B0X2dwX21lbSkKIAkJcmV0dXJuIGxlbjsKIAogCXNwaW5fbG9jaygmdGdfcHRfZ3BfbWVtLT50Z19wdF9ncF9tZW1fbG9jayk7CiAJdGdfcHRfZ3AgPSB0Z19wdF9ncF9tZW0tPnRnX3B0X2dwOwotCWlmICgodGdfcHRfZ3ApKSB7CisJaWYgKHRnX3B0X2dwKSB7CiAJCXRnX3B0X2NpID0gJnRnX3B0X2dwLT50Z19wdF9ncF9ncm91cC5jZ19pdGVtOwogCQlsZW4gKz0gc3ByaW50ZihwYWdlLCAiVEcgUG9ydCBBbGlhczogJXNcblRHIFBvcnQgR3JvdXAgSUQ6IgogCQkJIiAlaHVcblRHIFBvcnQgUHJpbWFyeSBBY2Nlc3MgU3RhdGU6ICVzXG5URyBQb3J0ICIKQEAgLTE2MDUsMTYgKzE2MzMsMTYgQEAKIAl0cGcgPSBwb3J0LT5zZXBfdHBnOwogCWx1biA9IHBvcnQtPnNlcF9sdW47CiAKLQlpZiAoVDEwX0FMVUEoc3VfZGV2KS0+YWx1YV90eXBlICE9IFNQQzNfQUxVQV9FTVVMQVRFRCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJTUEMzX0FMVUFfRU1VTEFURUQgbm90IGVuYWJsZWQgZm9yIgotCQkJIiAlcy90cGd0XyVodS8lc1xuIiwgVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3d3bih0cGcpLAotCQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpLAorCWlmIChzdV9kZXYtPnQxMF9hbHVhLmFsdWFfdHlwZSAhPSBTUEMzX0FMVUFfRU1VTEFURUQpIHsKKwkJcHJfd2FybigiU1BDM19BTFVBX0VNVUxBVEVEIG5vdCBlbmFibGVkIGZvciIKKwkJCSIgJXMvdHBndF8laHUvJXNcbiIsIHRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF93d24odHBnKSwKKwkJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSwKIAkJCWNvbmZpZ19pdGVtX25hbWUoJmx1bi0+bHVuX2dyb3VwLmNnX2l0ZW0pKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGNvdW50ID4gVEdfUFRfR1JPVVBfTkFNRV9CVUYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJBTFVBIFRhcmdldCBQb3J0IEdyb3VwIGFsaWFzIHRvbyBsYXJnZSFcbiIpOworCQlwcl9lcnIoIkFMVUEgVGFyZ2V0IFBvcnQgR3JvdXAgYWxpYXMgdG9vIGxhcmdlIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAltZW1zZXQoYnVmLCAwLCBUR19QVF9HUk9VUF9OQU1FX0JVRik7CkBAIC0xNjMxLDMxICsxNjU5LDMxIEBACiAJCSAqLwogCQl0Z19wdF9ncF9uZXcgPSBjb3JlX2FsdWFfZ2V0X3RnX3B0X2dwX2J5X25hbWUoc3VfZGV2LAogCQkJCQlzdHJzdHJpcChidWYpKTsKLQkJaWYgKCEodGdfcHRfZ3BfbmV3KSkKKwkJaWYgKCF0Z19wdF9ncF9uZXcpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJdGdfcHRfZ3BfbWVtID0gcG9ydC0+c2VwX2FsdWFfdGdfcHRfZ3BfbWVtOwotCWlmICghKHRnX3B0X2dwX21lbSkpIHsKKwlpZiAoIXRnX3B0X2dwX21lbSkgewogCQlpZiAodGdfcHRfZ3BfbmV3KQogCQkJY29yZV9hbHVhX3B1dF90Z19wdF9ncF9mcm9tX25hbWUodGdfcHRfZ3BfbmV3KTsKLQkJcHJpbnRrKEtFUk5fRVJSICJOVUxMIHN0cnVjdCBzZV9wb3J0LT5zZXBfYWx1YV90Z19wdF9ncF9tZW0gcG9pbnRlclxuIik7CisJCXByX2VycigiTlVMTCBzdHJ1Y3Qgc2VfcG9ydC0+c2VwX2FsdWFfdGdfcHRfZ3BfbWVtIHBvaW50ZXJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzcGluX2xvY2soJnRnX3B0X2dwX21lbS0+dGdfcHRfZ3BfbWVtX2xvY2spOwogCXRnX3B0X2dwID0gdGdfcHRfZ3BfbWVtLT50Z19wdF9ncDsKLQlpZiAoKHRnX3B0X2dwKSkgeworCWlmICh0Z19wdF9ncCkgewogCQkvKgogCQkgKiBDbGVhcmluZyBhbiBleGlzdGluZyB0Z19wdF9ncCBhc3NvY2lhdGlvbiwgYW5kIHJlcGxhY2luZwogCQkgKiB3aXRoIHRoZSBkZWZhdWx0X3RnX3B0X2dwLgogCQkgKi8KLQkJaWYgKCEodGdfcHRfZ3BfbmV3KSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IE1vdmluZyIKKwkJaWYgKCF0Z19wdF9ncF9uZXcpIHsKKwkJCXByX2RlYnVnKCJUYXJnZXRfQ29yZV9Db25maWdGUzogTW92aW5nIgogCQkJCSIgJXMvdHBndF8laHUvJXMgZnJvbSBBTFVBIFRhcmdldCBQb3J0IEdyb3VwOiIKIAkJCQkiIGFsdWEvJXMsIElEOiAlaHUgYmFjayB0byIKIAkJCQkiIGRlZmF1bHRfdGdfcHRfZ3BcbiIsCi0JCQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3d3bih0cGcpLAotCQkJCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSwKKwkJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfd3duKHRwZyksCisJCQkJdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3RhZyh0cGcpLAogCQkJCWNvbmZpZ19pdGVtX25hbWUoJmx1bi0+bHVuX2dyb3VwLmNnX2l0ZW0pLAogCQkJCWNvbmZpZ19pdGVtX25hbWUoCiAJCQkJCSZ0Z19wdF9ncC0+dGdfcHRfZ3BfZ3JvdXAuY2dfaXRlbSksCkBAIC0xNjYzLDcgKzE2OTEsNyBAQAogCiAJCQlfX2NvcmVfYWx1YV9kcm9wX3RnX3B0X2dwX21lbSh0Z19wdF9ncF9tZW0sIHRnX3B0X2dwKTsKIAkJCV9fY29yZV9hbHVhX2F0dGFjaF90Z19wdF9ncF9tZW0odGdfcHRfZ3BfbWVtLAotCQkJCQlUMTBfQUxVQShzdV9kZXYpLT5kZWZhdWx0X3RnX3B0X2dwKTsKKwkJCQkJc3VfZGV2LT50MTBfYWx1YS5kZWZhdWx0X3RnX3B0X2dwKTsKIAkJCXNwaW5fdW5sb2NrKCZ0Z19wdF9ncF9tZW0tPnRnX3B0X2dwX21lbV9sb2NrKTsKIAogCQkJcmV0dXJuIGNvdW50OwpAQCAtMTY3OSwxMCArMTcwNywxMCBAQAogCSAqLwogCV9fY29yZV9hbHVhX2F0dGFjaF90Z19wdF9ncF9tZW0odGdfcHRfZ3BfbWVtLCB0Z19wdF9ncF9uZXcpOwogCXNwaW5fdW5sb2NrKCZ0Z19wdF9ncF9tZW0tPnRnX3B0X2dwX21lbV9sb2NrKTsKLQlwcmludGsoS0VSTl9JTkZPICJUYXJnZXRfQ29yZV9Db25maWdGUzogJXMgJXMvdHBndF8laHUvJXMgdG8gQUxVQSIKKwlwcl9kZWJ1ZygiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6ICVzICVzL3RwZ3RfJWh1LyVzIHRvIEFMVUEiCiAJCSIgVGFyZ2V0IFBvcnQgR3JvdXA6IGFsdWEvJXMsIElEOiAlaHVcbiIsIChtb3ZlKSA/Ci0JCSJNb3ZpbmciIDogIkFkZGluZyIsIFRQR19URk8odHBnKS0+dHBnX2dldF93d24odHBnKSwKLQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpLAorCQkiTW92aW5nIiA6ICJBZGRpbmciLCB0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfd3duKHRwZyksCisJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSwKIAkJY29uZmlnX2l0ZW1fbmFtZSgmbHVuLT5sdW5fZ3JvdXAuY2dfaXRlbSksCiAJCWNvbmZpZ19pdGVtX25hbWUoJnRnX3B0X2dwX25ldy0+dGdfcHRfZ3BfZ3JvdXAuY2dfaXRlbSksCiAJCXRnX3B0X2dwX25ldy0+dGdfcHRfZ3BfaWQpOwpAQCAtMTcxNiwxMSArMTc0NCwxMSBAQAogCiAJcmV0ID0gc3RyaWN0X3N0cnRvdWwocGFnZSwgMCwgJnRtcCk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZXh0cmFjdCBhbHVhX2FjY2Vzc190eXBlXG4iKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gZXh0cmFjdCBhbHVhX2FjY2Vzc190eXBlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICgodG1wICE9IDApICYmICh0bXAgIT0gMSkgJiYgKHRtcCAhPSAyKSAmJiAodG1wICE9IDMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSWxsZWdhbCB2YWx1ZSBmb3IgYWx1YV9hY2Nlc3NfdHlwZToiCisJCXByX2VycigiSWxsZWdhbCB2YWx1ZSBmb3IgYWx1YV9hY2Nlc3NfdHlwZToiCiAJCQkJIiAlbHVcbiIsIHRtcCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE3NTQsMTEgKzE3ODIsMTEgQEAKIAogCXJldCA9IHN0cmljdF9zdHJ0b3VsKHBhZ2UsIDAsICZ0bXApOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGV4dHJhY3Qgbm9ub3BfZGVsYXlfbXNlY3NcbiIpOworCQlwcl9lcnIoIlVuYWJsZSB0byBleHRyYWN0IG5vbm9wX2RlbGF5X21zZWNzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICh0bXAgPiBBTFVBX01BWF9OT05PUF9ERUxBWV9NU0VDUykgewotCQlwcmludGsoS0VSTl9FUlIgIlBhc3NlZCBub25vcF9kZWxheV9tc2VjczogJWx1LCBleGNlZWRzIgorCQlwcl9lcnIoIlBhc3NlZCBub25vcF9kZWxheV9tc2VjczogJWx1LCBleGNlZWRzIgogCQkJIiBBTFVBX01BWF9OT05PUF9ERUxBWV9NU0VDUzogJWRcbiIsIHRtcCwKIAkJCUFMVUFfTUFYX05PTk9QX0RFTEFZX01TRUNTKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNzg1LDExICsxODEzLDExIEBACiAKIAlyZXQgPSBzdHJpY3Rfc3RydG91bChwYWdlLCAwLCAmdG1wKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBleHRyYWN0IHRyYW5zX2RlbGF5X21zZWNzXG4iKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gZXh0cmFjdCB0cmFuc19kZWxheV9tc2Vjc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAodG1wID4gQUxVQV9NQVhfVFJBTlNfREVMQVlfTVNFQ1MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQYXNzZWQgdHJhbnNfZGVsYXlfbXNlY3M6ICVsdSwgZXhjZWVkcyIKKwkJcHJfZXJyKCJQYXNzZWQgdHJhbnNfZGVsYXlfbXNlY3M6ICVsdSwgZXhjZWVkcyIKIAkJCSIgQUxVQV9NQVhfVFJBTlNfREVMQVlfTVNFQ1M6ICVkXG4iLCB0bXAsCiAJCQlBTFVBX01BWF9UUkFOU19ERUxBWV9NU0VDUyk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTgxNiwxMSArMTg0NCwxMSBAQAogCiAJcmV0ID0gc3RyaWN0X3N0cnRvdWwocGFnZSwgMCwgJnRtcCk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZXh0cmFjdCBwcmVmZXJyZWQgQUxVQSB2YWx1ZVxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGV4dHJhY3QgcHJlZmVycmVkIEFMVUEgdmFsdWVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKCh0bXAgIT0gMCkgJiYgKHRtcCAhPSAxKSkgewotCQlwcmludGsoS0VSTl9FUlIgIklsbGVnYWwgdmFsdWUgZm9yIHByZWZlcnJlZCBBTFVBOiAlbHVcbiIsIHRtcCk7CisJCXByX2VycigiSWxsZWdhbCB2YWx1ZSBmb3IgcHJlZmVycmVkIEFMVUE6ICVsdVxuIiwgdG1wKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXRnX3B0X2dwLT50Z19wdF9ncF9wcmVmID0gKGludCl0bXA7CkBAIC0xODMwLDcgKzE4NTgsNyBAQAogCiBzc2l6ZV90IGNvcmVfYWx1YV9zaG93X29mZmxpbmVfYml0KHN0cnVjdCBzZV9sdW4gKmx1biwgY2hhciAqcGFnZSkKIHsKLQlpZiAoIShsdW4tPmx1bl9zZXApKQorCWlmICghbHVuLT5sdW5fc2VwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwKQEAgLTE4NDYsMjIgKzE4NzQsMjIgQEAKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgcmV0OwogCi0JaWYgKCEobHVuLT5sdW5fc2VwKSkKKwlpZiAoIWx1bi0+bHVuX3NlcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXQgPSBzdHJpY3Rfc3RydG91bChwYWdlLCAwLCAmdG1wKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBleHRyYWN0IGFsdWFfdGdfcHRfb2ZmbGluZSB2YWx1ZVxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGV4dHJhY3QgYWx1YV90Z19wdF9vZmZsaW5lIHZhbHVlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICgodG1wICE9IDApICYmICh0bXAgIT0gMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbGxlZ2FsIHZhbHVlIGZvciBhbHVhX3RnX3B0X29mZmxpbmU6ICVsdVxuIiwKKwkJcHJfZXJyKCJJbGxlZ2FsIHZhbHVlIGZvciBhbHVhX3RnX3B0X29mZmxpbmU6ICVsdVxuIiwKIAkJCQl0bXApOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJdGdfcHRfZ3BfbWVtID0gbHVuLT5sdW5fc2VwLT5zZXBfYWx1YV90Z19wdF9ncF9tZW07Ci0JaWYgKCEodGdfcHRfZ3BfbWVtKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBsb2NhdGUgKnRnX3B0X2dwX21lbVxuIik7CisJaWYgKCF0Z19wdF9ncF9tZW0pIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlICp0Z19wdF9ncF9tZW1cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE4OTAsMTMgKzE5MTgsMTMgQEAKIAogCXJldCA9IHN0cmljdF9zdHJ0b3VsKHBhZ2UsIDAsICZ0bXApOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGV4dHJhY3QgYWx1YV90Z19wdF9zdGF0dXNcbiIpOworCQlwcl9lcnIoIlVuYWJsZSB0byBleHRyYWN0IGFsdWFfdGdfcHRfc3RhdHVzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICgodG1wICE9IEFMVUFfU1RBVFVTX05PTkUpICYmCiAJICAgICh0bXAgIT0gQUxVQV9TVEFUVVNfQUxURVJFRF9CWV9FWFBMSUNUX1NUUEcpICYmCiAJICAgICh0bXAgIT0gQUxVQV9TVEFUVVNfQUxURVJFRF9CWV9JTVBMSUNUX0FMVUEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSWxsZWdhbCB2YWx1ZSBmb3IgYWx1YV90Z19wdF9zdGF0dXM6ICVsdVxuIiwKKwkJcHJfZXJyKCJJbGxlZ2FsIHZhbHVlIGZvciBhbHVhX3RnX3B0X3N0YXR1czogJWx1XG4iLAogCQkJCXRtcCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE5MjMsMTEgKzE5NTEsMTEgQEAKIAogCXJldCA9IHN0cmljdF9zdHJ0b3VsKHBhZ2UsIDAsICZ0bXApOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGV4dHJhY3QgYWx1YV90Z19wdF93cml0ZV9tZFxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGV4dHJhY3QgYWx1YV90Z19wdF93cml0ZV9tZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoKHRtcCAhPSAwKSAmJiAodG1wICE9IDEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSWxsZWdhbCB2YWx1ZSBmb3IgYWx1YV90Z19wdF93cml0ZV9tZDoiCisJCXByX2VycigiSWxsZWdhbCB2YWx1ZSBmb3IgYWx1YV90Z19wdF93cml0ZV9tZDoiCiAJCQkJIiAlbHVcbiIsIHRtcCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE5MzksNyArMTk2Nyw3IEBACiBpbnQgY29yZV9zZXR1cF9hbHVhKHN0cnVjdCBzZV9kZXZpY2UgKmRldiwgaW50IGZvcmNlX3B0KQogewogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBkZXYtPnNlX3N1Yl9kZXY7Ci0Jc3RydWN0IHQxMF9hbHVhICphbHVhID0gVDEwX0FMVUEoc3VfZGV2KTsKKwlzdHJ1Y3QgdDEwX2FsdWEgKmFsdWEgPSAmc3VfZGV2LT50MTBfYWx1YTsKIAlzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3BfbWVtYmVyICpsdV9ncF9tZW07CiAJLyoKIAkgKiBJZiB0aGlzIGRldmljZSBpcyBmcm9tIFRhcmdldF9Db3JlX01vZC9wU0NTSSwgdXNlIHRoZSBBTFVBIGxvZ2ljCkBAIC0xOTQ3LDQ0ICsxOTc1LDQ0IEBACiAJICogY2F1c2UgYSBwcm9ibGVtIGJlY2F1c2UgbGliYXRhIGFuZCBzb21lIFNBVEEgUkFJRCBIQkFzIGFwcGVhcgogCSAqIHVuZGVyIExpbnV4L1NDU0ksIGJ1dCBlbXVsYXRlIFNDU0kgbG9naWMgdGhlbXNlbHZlcy4KIAkgKi8KLQlpZiAoKChUUkFOU1BPUlQoZGV2KS0+dHJhbnNwb3J0X3R5cGUgPT0gVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpICYmCi0JICAgICEoREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX2FsdWEpKSB8fCBmb3JjZV9wdCkgeworCWlmICgoKGRldi0+dHJhbnNwb3J0LT50cmFuc3BvcnRfdHlwZSA9PSBUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVikgJiYKKwkgICAgIShkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV9hbHVhKSkgfHwgZm9yY2VfcHQpIHsKIAkJYWx1YS0+YWx1YV90eXBlID0gU1BDX0FMVUFfUEFTU1RIUk9VR0g7CiAJCWFsdWEtPmFsdWFfc3RhdGVfY2hlY2sgPSAmY29yZV9hbHVhX3N0YXRlX2NoZWNrX25vcDsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nIFNQQ19BTFVBX1BBU1NUSFJPVUdILCBubyBBTFVBIgotCQkJIiBlbXVsYXRpb25cbiIsIFRSQU5TUE9SVChkZXYpLT5uYW1lKTsKKwkJcHJfZGVidWcoIiVzOiBVc2luZyBTUENfQUxVQV9QQVNTVEhST1VHSCwgbm8gQUxVQSIKKwkJCSIgZW11bGF0aW9uXG4iLCBkZXYtPnRyYW5zcG9ydC0+bmFtZSk7CiAJCXJldHVybiAwOwogCX0KIAkvKgogCSAqIElmIFNQQy0zIG9yIGFib3ZlIGlzIHJlcG9ydGVkIGJ5IHJlYWwgb3IgZW11bGF0ZWQgc3RydWN0IHNlX2RldmljZSwKIAkgKiB1c2UgZW11bGF0ZWQgQUxVQS4KIAkgKi8KLQlpZiAoVFJBTlNQT1JUKGRldiktPmdldF9kZXZpY2VfcmV2KGRldikgPj0gU0NTSV8zKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbmFibGluZyBBTFVBIEVtdWxhdGlvbiBmb3IgU1BDLTMiCi0JCQkiIGRldmljZVxuIiwgVFJBTlNQT1JUKGRldiktPm5hbWUpOworCWlmIChkZXYtPnRyYW5zcG9ydC0+Z2V0X2RldmljZV9yZXYoZGV2KSA+PSBTQ1NJXzMpIHsKKwkJcHJfZGVidWcoIiVzOiBFbmFibGluZyBBTFVBIEVtdWxhdGlvbiBmb3IgU1BDLTMiCisJCQkiIGRldmljZVxuIiwgZGV2LT50cmFuc3BvcnQtPm5hbWUpOwogCQkvKgogCQkgKiBBc3NvY2lhdGUgdGhpcyBzdHJ1Y3Qgc2VfZGV2aWNlIHdpdGggdGhlIGRlZmF1bHQgQUxVQQogCQkgKiBMVU4gR3JvdXAuCiAJCSAqLwogCQlsdV9ncF9tZW0gPSBjb3JlX2FsdWFfYWxsb2NhdGVfbHVfZ3BfbWVtKGRldik7Ci0JCWlmIChJU19FUlIobHVfZ3BfbWVtKSB8fCAhbHVfZ3BfbWVtKQotCQkJcmV0dXJuIC0xOworCQlpZiAoSVNfRVJSKGx1X2dwX21lbSkpCisJCQlyZXR1cm4gUFRSX0VSUihsdV9ncF9tZW0pOwogCiAJCWFsdWEtPmFsdWFfdHlwZSA9IFNQQzNfQUxVQV9FTVVMQVRFRDsKIAkJYWx1YS0+YWx1YV9zdGF0ZV9jaGVjayA9ICZjb3JlX2FsdWFfc3RhdGVfY2hlY2s7CiAJCXNwaW5fbG9jaygmbHVfZ3BfbWVtLT5sdV9ncF9tZW1fbG9jayk7CiAJCV9fY29yZV9hbHVhX2F0dGFjaF9sdV9ncF9tZW0obHVfZ3BfbWVtLAotCQkJCXNlX2dsb2JhbC0+ZGVmYXVsdF9sdV9ncCk7CisJCQkJZGVmYXVsdF9sdV9ncCk7CiAJCXNwaW5fdW5sb2NrKCZsdV9ncF9tZW0tPmx1X2dwX21lbV9sb2NrKTsKIAotCQlwcmludGsoS0VSTl9JTkZPICIlczogQWRkaW5nIHRvIGRlZmF1bHQgQUxVQSBMVSBHcm91cDoiCisJCXByX2RlYnVnKCIlczogQWRkaW5nIHRvIGRlZmF1bHQgQUxVQSBMVSBHcm91cDoiCiAJCQkiIGNvcmUvYWx1YS9sdV9ncHMvZGVmYXVsdF9sdV9ncFxuIiwKLQkJCVRSQU5TUE9SVChkZXYpLT5uYW1lKTsKKwkJCWRldi0+dHJhbnNwb3J0LT5uYW1lKTsKIAl9IGVsc2UgewogCQlhbHVhLT5hbHVhX3R5cGUgPSBTUEMyX0FMVUFfRElTQUJMRUQ7CiAJCWFsdWEtPmFsdWFfc3RhdGVfY2hlY2sgPSAmY29yZV9hbHVhX3N0YXRlX2NoZWNrX25vcDsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERpc2FibGluZyBBTFVBIEVtdWxhdGlvbiBmb3IgU1BDLTIiCi0JCQkiIGRldmljZVxuIiwgVFJBTlNQT1JUKGRldiktPm5hbWUpOworCQlwcl9kZWJ1ZygiJXM6IERpc2FibGluZyBBTFVBIEVtdWxhdGlvbiBmb3IgU1BDLTIiCisJCQkiIGRldmljZVxuIiwgZGV2LT50cmFuc3BvcnQtPm5hbWUpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY2RiLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jZGIuYwppbmRleCA3ZjE5YzhiLi44YWUwOWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jZGIuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jZGIuYwpAQCAtMjMsNiArMjMsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqLwogCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogCkBAIC02NCwyMCArNjUsMjIgQEAKIHN0YXRpYyBpbnQKIHRhcmdldF9lbXVsYXRlX2lucXVpcnlfc3RkKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2VfbHVuICpsdW4gPSBTRV9MVU4oY21kKTsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBTRV9ERVYoY21kKTsKLQl1bnNpZ25lZCBjaGFyICpidWYgPSBjbWQtPnRfdGFzay0+dF90YXNrX2J1ZjsKKwlzdHJ1Y3Qgc2VfbHVuICpsdW4gPSBjbWQtPnNlX2x1bjsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CiAKIAkvKgogCSAqIE1ha2Ugc3VyZSB3ZSBhdCBsZWFzdCBoYXZlIDYgYnl0ZXMgb2YgSU5RVUlSWSByZXNwb25zZQogCSAqIHBheWxvYWQgZ29pbmcgYmFjayBmb3IgRVZQRD0wCiAJICovCiAJaWYgKGNtZC0+ZGF0YV9sZW5ndGggPCA2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU0NTSSBJbnF1aXJ5IHBheWxvYWQgbGVuZ3RoOiAldSIKKwkJcHJfZXJyKCJTQ1NJIElucXVpcnkgcGF5bG9hZCBsZW5ndGg6ICV1IgogCQkJIiB0b28gc21hbGwgZm9yIEVWUEQ9MFxuIiwgY21kLT5kYXRhX2xlbmd0aCk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisKIAlidWZbMF0gPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2RldmljZV90eXBlKGRldik7CiAJaWYgKGJ1ZlswXSA9PSBUWVBFX1RBUEUpCiAJCWJ1ZlsxXSA9IDB4ODA7CkBAIC04NiwxMiArODksMTIgQEAKIAkvKgogCSAqIEVuYWJsZSBTQ0NTIGFuZCBUUEdTIGZpZWxkcyBmb3IgRW11bGF0ZWQgQUxVQQogCSAqLwotCWlmIChUMTBfQUxVQShkZXYtPnNlX3N1Yl9kZXYpLT5hbHVhX3R5cGUgPT0gU1BDM19BTFVBX0VNVUxBVEVEKQorCWlmIChkZXYtPnNlX3N1Yl9kZXYtPnQxMF9hbHVhLmFsdWFfdHlwZSA9PSBTUEMzX0FMVUFfRU1VTEFURUQpCiAJCXRhcmdldF9maWxsX2FsdWFfZGF0YShsdW4tPmx1bl9zZXAsIGJ1Zik7CiAKIAlpZiAoY21kLT5kYXRhX2xlbmd0aCA8IDgpIHsKIAkJYnVmWzRdID0gMTsgLyogU2V0IGFkZGl0aW9uYWwgbGVuZ3RoIHRvIDEgKi8KLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCX0KIAogCWJ1Zls3XSA9IDB4MzI7IC8qIFN5bmM9MSBhbmQgQ21kUXVlPTEgKi8KQEAgLTEwMiw0MCArMTA1LDE4IEBACiAJICovCiAJaWYgKGNtZC0+ZGF0YV9sZW5ndGggPCAzNikgewogCQlidWZbNF0gPSAzOyAvKiBTZXQgYWRkaXRpb25hbCBsZW5ndGggdG8gMyAqLwotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAJfQogCiAJc25wcmludGYoKHVuc2lnbmVkIGNoYXIgKikmYnVmWzhdLCA4LCAiTElPLU9SRyIpOwogCXNucHJpbnRmKCh1bnNpZ25lZCBjaGFyICopJmJ1ZlsxNl0sIDE2LCAiJXMiLAotCQkgJkRFVl9UMTBfV1dOKGRldiktPm1vZGVsWzBdKTsKKwkJICZkZXYtPnNlX3N1Yl9kZXYtPnQxMF93d24ubW9kZWxbMF0pOwogCXNucHJpbnRmKCh1bnNpZ25lZCBjaGFyICopJmJ1ZlszMl0sIDQsICIlcyIsCi0JCSAmREVWX1QxMF9XV04oZGV2KS0+cmV2aXNpb25bMF0pOworCQkgJmRldi0+c2Vfc3ViX2Rldi0+dDEwX3d3bi5yZXZpc2lvblswXSk7CiAJYnVmWzRdID0gMzE7IC8qIFNldCBhZGRpdGlvbmFsIGxlbmd0aCB0byAzMSAqLwotCXJldHVybiAwOwotfQogCi0vKiBzdXBwb3J0ZWQgdml0YWwgcHJvZHVjdCBkYXRhIHBhZ2VzICovCi1zdGF0aWMgaW50Ci10YXJnZXRfZW11bGF0ZV9ldnBkXzAwKHN0cnVjdCBzZV9jbWQgKmNtZCwgdW5zaWduZWQgY2hhciAqYnVmKQotewotCWJ1ZlsxXSA9IDB4MDA7Ci0JaWYgKGNtZC0+ZGF0YV9sZW5ndGggPCA4KQotCQlyZXR1cm4gMDsKLQotCWJ1Zls0XSA9IDB4MDsKLQkvKgotCSAqIE9ubHkgcmVwb3J0IHRoZSBJTlFVSVJZIEVWUEQ9MSBwYWdlcyBhZnRlciBhIHZhbGlkIE5BQQotCSAqIFJlZ2lzdGVyZWQgRXh0ZW5kZWQgTFVOIFdXTiBoYXMgYmVlbiBzZXQgdmlhIENvbmZpZ0ZTCi0JICogZHVyaW5nIGRldmljZSBjcmVhdGlvbi9yZXN0YXJ0LgotCSAqLwotCWlmIChTRV9ERVYoY21kKS0+c2Vfc3ViX2Rldi0+c3VfZGV2X2ZsYWdzICYKLQkJCVNERl9FTVVMQVRFRF9WUERfVU5JVF9TRVJJQUwpIHsKLQkJYnVmWzNdID0gMzsKLQkJYnVmWzVdID0gMHg4MDsKLQkJYnVmWzZdID0gMHg4MzsKLQkJYnVmWzddID0gMHg4NjsKLQl9Ci0KK291dDoKKwl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDMsMTYgKzEyNCwxNSBAQAogc3RhdGljIGludAogdGFyZ2V0X2VtdWxhdGVfZXZwZF84MChzdHJ1Y3Qgc2VfY21kICpjbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBTRV9ERVYoY21kKTsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAl1MTYgbGVuID0gMDsKIAotCWJ1ZlsxXSA9IDB4ODA7CiAJaWYgKGRldi0+c2Vfc3ViX2Rldi0+c3VfZGV2X2ZsYWdzICYKIAkJCVNERl9FTVVMQVRFRF9WUERfVU5JVF9TRVJJQUwpIHsKIAkJdTMyIHVuaXRfc2VyaWFsX2xlbjsKIAogCQl1bml0X3NlcmlhbF9sZW4gPQotCQkJc3RybGVuKCZERVZfVDEwX1dXTihkZXYpLT51bml0X3NlcmlhbFswXSk7CisJCQlzdHJsZW4oJmRldi0+c2Vfc3ViX2Rldi0+dDEwX3d3bi51bml0X3NlcmlhbFswXSk7CiAJCXVuaXRfc2VyaWFsX2xlbisrOyAvKiBGb3IgTlVMTCBUZXJtaW5hdG9yICovCiAKIAkJaWYgKCgobGVuICsgNCkgKyB1bml0X3NlcmlhbF9sZW4pID4gY21kLT5kYXRhX2xlbmd0aCkgewpAQCAtMTYyLDcgKzE0Miw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCQlsZW4gKz0gc3ByaW50ZigodW5zaWduZWQgY2hhciAqKSZidWZbNF0sICIlcyIsCi0JCQkmREVWX1QxMF9XV04oZGV2KS0+dW5pdF9zZXJpYWxbMF0pOworCQkJJmRldi0+c2Vfc3ViX2Rldi0+dDEwX3d3bi51bml0X3NlcmlhbFswXSk7CiAJCWxlbisrOyAvKiBFeHRyYSBCeXRlIGZvciBOVUxMIFRlcm1pbmF0b3IgKi8KIAkJYnVmWzNdID0gbGVuOwogCX0KQEAgLTE3NiwyMSArMTU2LDE4IEBACiBzdGF0aWMgaW50CiB0YXJnZXRfZW11bGF0ZV9ldnBkXzgzKHN0cnVjdCBzZV9jbWQgKmNtZCwgdW5zaWduZWQgY2hhciAqYnVmKQogewotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0RFVihjbWQpOwotCXN0cnVjdCBzZV9sdW4gKmx1biA9IFNFX0xVTihjbWQpOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCXN0cnVjdCBzZV9sdW4gKmx1biA9IGNtZC0+c2VfbHVuOwogCXN0cnVjdCBzZV9wb3J0ICpwb3J0ID0gTlVMTDsKIAlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICp0cGcgPSBOVUxMOwogCXN0cnVjdCB0MTBfYWx1YV9sdV9ncF9tZW1iZXIgKmx1X2dwX21lbTsKIAlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AgKnRnX3B0X2dwOwogCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncF9tZW1iZXIgKnRnX3B0X2dwX21lbTsKLQl1bnNpZ25lZCBjaGFyIGJpbmFyeSwgYmluYXJ5X25ldzsKLQl1bnNpZ25lZCBjaGFyICpwcm9kID0gJkRFVl9UMTBfV1dOKGRldiktPm1vZGVsWzBdOworCXVuc2lnbmVkIGNoYXIgKnByb2QgPSAmZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLm1vZGVsWzBdOwogCXUzMiBwcm9kX2xlbjsKIAl1MzIgdW5pdF9zZXJpYWxfbGVuLCBvZmYgPSAwOwotCWludCBpOwogCXUxNiBsZW4gPSAwLCBpZF9sZW47CiAKLQlidWZbMV0gPSAweDgzOwogCW9mZiA9IDQ7CiAKIAkvKgpAQCAtMjEwLDExICsxODcsMTEgQEAKIAkvKiBDT0RFIFNFVCA9PSBCaW5hcnkgKi8KIAlidWZbb2ZmKytdID0gMHgxOwogCi0JLyogU2V0IEFTU09JQ0FUSU9OID09IGFkZHJlc3NlZCBsb2dpY2FsIHVuaXQ6IDApYiAqLworCS8qIFNldCBBU1NPQ0lBVElPTiA9PSBhZGRyZXNzZWQgbG9naWNhbCB1bml0OiAwKWIgKi8KIAlidWZbb2ZmXSA9IDB4MDA7CiAKIAkvKiBJZGVudGlmaWVyL0Rlc2lnbmF0b3IgdHlwZSA9PSBOQUEgaWRlbnRpZmllciAqLwotCWJ1ZltvZmYrK10gPSAweDM7CisJYnVmW29mZisrXSB8PSAweDM7CiAJb2ZmKys7CiAKIAkvKiBJZGVudGlmaWVyL0Rlc2lnbmF0b3IgbGVuZ3RoICovCkBAIC0yMzcsMTYgKzIxNCw5IEBACiAJICogVkVORE9SX1NQRUNJRklDX0lERU5USUZJRVIgYW5kCiAJICogVkVORE9SX1NQRUNJRklDX0lERU5USUZJRVJfRVhURU5USU9OCiAJICovCi0JYmluYXJ5ID0gdHJhbnNwb3J0X2FzY2lpaGV4X3RvX2JpbmFyeWhleCgKLQkJCQkmREVWX1QxMF9XV04oZGV2KS0+dW5pdF9zZXJpYWxbMF0pOwotCWJ1ZltvZmYrK10gfD0gKGJpbmFyeSAmIDB4ZjApID4+IDQ7Ci0JZm9yIChpID0gMDsgaSA8IDI0OyBpICs9IDIpIHsKLQkJYmluYXJ5X25ldyA9IHRyYW5zcG9ydF9hc2NpaWhleF90b19iaW5hcnloZXgoCi0JCQkmREVWX1QxMF9XV04oZGV2KS0+dW5pdF9zZXJpYWxbaSsyXSk7Ci0JCWJ1ZltvZmZdID0gKGJpbmFyeSAmIDB4MGYpIDw8IDQ7Ci0JCWJ1ZltvZmYrK10gfD0gKGJpbmFyeV9uZXcgJiAweGYwKSA+PiA0OwotCQliaW5hcnkgPSBiaW5hcnlfbmV3OwotCX0KKwlidWZbb2ZmKytdIHw9IGhleF90b19iaW4oZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLnVuaXRfc2VyaWFsWzBdKTsKKwloZXgyYmluKCZidWZbb2ZmXSwgJmRldi0+c2Vfc3ViX2Rldi0+dDEwX3d3bi51bml0X3NlcmlhbFsxXSwgMTIpOworCiAJbGVuID0gMjA7CiAJb2ZmID0gKGxlbiArIDQpOwogCkBAIC0yNjMsNyArMjMzLDcgQEAKIAlpZiAoZGV2LT5zZV9zdWJfZGV2LT5zdV9kZXZfZmxhZ3MgJgogCQkJU0RGX0VNVUxBVEVEX1ZQRF9VTklUX1NFUklBTCkgewogCQl1bml0X3NlcmlhbF9sZW4gPQotCQkJc3RybGVuKCZERVZfVDEwX1dXTihkZXYpLT51bml0X3NlcmlhbFswXSk7CisJCQlzdHJsZW4oJmRldi0+c2Vfc3ViX2Rldi0+dDEwX3d3bi51bml0X3NlcmlhbFswXSk7CiAJCXVuaXRfc2VyaWFsX2xlbisrOyAvKiBGb3IgTlVMTCBUZXJtaW5hdG9yICovCiAKIAkJaWYgKChsZW4gKyAoaWRfbGVuICsgNCkgKwpAQCAtMjc0LDcgKzI0NCw3IEBACiAJCX0KIAkJaWRfbGVuICs9IHNwcmludGYoKHVuc2lnbmVkIGNoYXIgKikmYnVmW29mZisxMl0sCiAJCQkJIiVzOiVzIiwgcHJvZCwKLQkJCQkmREVWX1QxMF9XV04oZGV2KS0+dW5pdF9zZXJpYWxbMF0pOworCQkJCSZkZXYtPnNlX3N1Yl9kZXYtPnQxMF93d24udW5pdF9zZXJpYWxbMF0pOwogCX0KIAlidWZbb2ZmXSA9IDB4MjsgLyogQVNDSUkgKi8KIAlidWZbb2ZmKzFdID0gMHgxOyAvKiBUMTAgVmVuZG9yIElEICovCkBAIC0zMTIsMTAgKzI4MiwxMCBAQAogCQkJZ290byBjaGVja190cGdpOwogCQl9CiAJCWJ1ZltvZmZdID0KLQkJCShUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfcHJvdG9faWRlbnQodHBnKSA8PCA0KTsKKwkJCSh0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfcHJvdG9faWRlbnQodHBnKSA8PCA0KTsKIAkJYnVmW29mZisrXSB8PSAweDE7IC8qIENPREUgU0VUID09IEJpbmFyeSAqLwogCQlidWZbb2ZmXSA9IDB4ODA7IC8qIFNldCBQSVY9MSAqLwotCQkvKiBTZXQgQVNTT0lDQVRJT04gPT0gdGFyZ2V0IHBvcnQ6IDAxYiAqLworCQkvKiBTZXQgQVNTT0NJQVRJT04gPT0gdGFyZ2V0IHBvcnQ6IDAxYiAqLwogCQlidWZbb2ZmXSB8PSAweDEwOwogCQkvKiBERVNJR05BVE9SIFRZUEUgPT0gUmVsYXRpdmUgdGFyZ2V0IHBvcnQgaWRlbnRpZmVyICovCiAJCWJ1ZltvZmYrK10gfD0gMHg0OwpAQCAtMzM1LDcgKzMwNSw3IEBACiAJCSAqIHNlY3Rpb24gNy41LjEgVGFibGUgMzYyCiAJCSAqLwogY2hlY2tfdHBnaToKLQkJaWYgKFQxMF9BTFVBKGRldi0+c2Vfc3ViX2RldiktPmFsdWFfdHlwZSAhPQorCQlpZiAoZGV2LT5zZV9zdWJfZGV2LT50MTBfYWx1YS5hbHVhX3R5cGUgIT0KIAkJCQlTUEMzX0FMVUFfRU1VTEFURUQpCiAJCQlnb3RvIGNoZWNrX3Njc2lfbmFtZTsKIApAQCAtMzQ5LDcgKzMxOSw3IEBACiAKIAkJc3Bpbl9sb2NrKCZ0Z19wdF9ncF9tZW0tPnRnX3B0X2dwX21lbV9sb2NrKTsKIAkJdGdfcHRfZ3AgPSB0Z19wdF9ncF9tZW0tPnRnX3B0X2dwOwotCQlpZiAoISh0Z19wdF9ncCkpIHsKKwkJaWYgKCF0Z19wdF9ncCkgewogCQkJc3Bpbl91bmxvY2soJnRnX3B0X2dwX21lbS0+dGdfcHRfZ3BfbWVtX2xvY2spOwogCQkJZ290byBjaGVja19sdV9ncDsKIAkJfQpAQCAtMzU3LDEwICszMjcsMTAgQEAKIAkJc3Bpbl91bmxvY2soJnRnX3B0X2dwX21lbS0+dGdfcHRfZ3BfbWVtX2xvY2spOwogCiAJCWJ1ZltvZmZdID0KLQkJCShUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfcHJvdG9faWRlbnQodHBnKSA8PCA0KTsKKwkJCSh0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfcHJvdG9faWRlbnQodHBnKSA8PCA0KTsKIAkJYnVmW29mZisrXSB8PSAweDE7IC8qIENPREUgU0VUID09IEJpbmFyeSAqLwogCQlidWZbb2ZmXSA9IDB4ODA7IC8qIFNldCBQSVY9MSAqLwotCQkvKiBTZXQgQVNTT0lDQVRJT04gPT0gdGFyZ2V0IHBvcnQ6IDAxYiAqLworCQkvKiBTZXQgQVNTT0NJQVRJT04gPT0gdGFyZ2V0IHBvcnQ6IDAxYiAqLwogCQlidWZbb2ZmXSB8PSAweDEwOwogCQkvKiBERVNJR05BVE9SIFRZUEUgPT0gVGFyZ2V0IHBvcnQgZ3JvdXAgaWRlbnRpZmllciAqLwogCQlidWZbb2ZmKytdIHw9IDB4NTsKQEAgLTM4MCwxMiArMzUwLDEyIEBACiAJCQlnb3RvIGNoZWNrX3Njc2lfbmFtZTsKIAkJfQogCQlsdV9ncF9tZW0gPSBkZXYtPmRldl9hbHVhX2x1X2dwX21lbTsKLQkJaWYgKCEobHVfZ3BfbWVtKSkKKwkJaWYgKCFsdV9ncF9tZW0pCiAJCQlnb3RvIGNoZWNrX3Njc2lfbmFtZTsKIAogCQlzcGluX2xvY2soJmx1X2dwX21lbS0+bHVfZ3BfbWVtX2xvY2spOwogCQlsdV9ncCA9IGx1X2dwX21lbS0+bHVfZ3A7Ci0JCWlmICghKGx1X2dwKSkgeworCQlpZiAoIWx1X2dwKSB7CiAJCQlzcGluX3VubG9jaygmbHVfZ3BfbWVtLT5sdV9ncF9tZW1fbG9jayk7CiAJCQlnb3RvIGNoZWNrX3Njc2lfbmFtZTsKIAkJfQpAQCAtNDA5LDcgKzM3OSw3IEBACiAJCSAqIHNlY3Rpb24gNy41LjEgVGFibGUgMzYyCiAJCSAqLwogY2hlY2tfc2NzaV9uYW1lOgotCQlzY3NpX25hbWVfbGVuID0gc3RybGVuKFRQR19URk8odHBnKS0+dHBnX2dldF93d24odHBnKSk7CisJCXNjc2lfbmFtZV9sZW4gPSBzdHJsZW4odHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3d3bih0cGcpKTsKIAkJLyogVVRGLTggIix0LDB4PDE2LWJpdCBUUEdUPiIgKyBOVUxMIFRlcm1pbmF0b3IgKi8KIAkJc2NzaV9uYW1lX2xlbiArPSAxMDsKIAkJLyogQ2hlY2sgZm9yIDQtYnl0ZSBwYWRkaW5nICovCkBAIC00MjQsMTAgKzM5NCwxMCBAQAogCQkJZ290byBzZXRfbGVuOwogCQl9CiAJCWJ1ZltvZmZdID0KLQkJCShUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfcHJvdG9faWRlbnQodHBnKSA8PCA0KTsKKwkJCSh0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfcHJvdG9faWRlbnQodHBnKSA8PCA0KTsKIAkJYnVmW29mZisrXSB8PSAweDM7IC8qIENPREUgU0VUID09IFVURi04ICovCiAJCWJ1ZltvZmZdID0gMHg4MDsgLyogU2V0IFBJVj0xICovCi0JCS8qIFNldCBBU1NPSUNBVElPTiA9PSB0YXJnZXQgcG9ydDogMDFiICovCisJCS8qIFNldCBBU1NPQ0lBVElPTiA9PSB0YXJnZXQgcG9ydDogMDFiICovCiAJCWJ1ZltvZmZdIHw9IDB4MTA7CiAJCS8qIERFU0lHTkFUT1IgVFlQRSA9PSBTQ1NJIG5hbWUgc3RyaW5nICovCiAJCWJ1ZltvZmYrK10gfD0gMHg4OwpAQCAtNDM4LDkgKzQwOCw5IEBACiAJCSAqIFRhcmdldCBQb3J0LCB0aGlzIG1lYW5zICI8aVNDU0kgbmFtZT4sdCwweDxUUEdUPiBpbgogCQkgKiBVVEYtOCBlbmNvZGluZy4KIAkJICovCi0JCXRwZ3QgPSBUUEdfVEZPKHRwZyktPnRwZ19nZXRfdGFnKHRwZyk7CisJCXRwZ3QgPSB0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfdGFnKHRwZyk7CiAJCXNjc2lfbmFtZV9sZW4gPSBzcHJpbnRmKCZidWZbb2ZmXSwgIiVzLHQsMHglMDR4IiwKLQkJCQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3d3bih0cGcpLCB0cGd0KTsKKwkJCQkJdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3d3bih0cGcpLCB0cGd0KTsKIAkJc2NzaV9uYW1lX2xlbiArPSAxIC8qIEluY2x1ZGUgIE5VTEwgdGVybWluYXRvciAqLzsKIAkJLyoKIAkJICogVGhlIG51bGwtdGVybWluYXRlZCwgbnVsbC1wYWRkZWQgKHNlZSA0LjQuMikgU0NTSQpAQCAtNDcxLDEzICs0NDEsMTIgQEAKIAlpZiAoY21kLT5kYXRhX2xlbmd0aCA8IDYwKQogCQlyZXR1cm4gMDsKIAotCWJ1ZlsxXSA9IDB4ODY7CiAJYnVmWzJdID0gMHgzYzsKIAkvKiBTZXQgSEVBRFNVUCwgT1JEU1VQLCBTSU1QU1VQICovCiAJYnVmWzVdID0gMHgwNzsKIAogCS8qIElmIFdyaXRlQ2FjaGUgZW11bGF0aW9uIGlzIGVuYWJsZWQsIHNldCBWX1NVUCAqLwotCWlmIChERVZfQVRUUklCKFNFX0RFVihjbWQpKS0+ZW11bGF0ZV93cml0ZV9jYWNoZSA+IDApCisJaWYgKGNtZC0+c2VfZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfd3JpdGVfY2FjaGUgPiAwKQogCQlidWZbNl0gPSAweDAxOwogCXJldHVybiAwOwogfQpAQCAtNDg2LDcgKzQ1NSw3IEBACiBzdGF0aWMgaW50CiB0YXJnZXRfZW11bGF0ZV9ldnBkX2IwKHN0cnVjdCBzZV9jbWQgKmNtZCwgdW5zaWduZWQgY2hhciAqYnVmKQogewotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0RFVihjbWQpOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCWludCBoYXZlX3RwID0gMDsKIAogCS8qCkBAIC00OTQsMjcgKzQ2MywyOSBAQAogCSAqIGVtdWxhdGVfdHB1PTEgb3IgZW11bGF0ZV90cHdzPTEgd2Ugd2lsbCBiZSBleHBlY3QgYQogCSAqIGRpZmZlcmVudCBwYWdlIGxlbmd0aCBmb3IgVGhpbiBQcm92aXNpb25pbmcuCiAJICovCi0JaWYgKERFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV90cHUgfHwgREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX3Rwd3MpCisJaWYgKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3RwdSB8fCBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV90cHdzKQogCQloYXZlX3RwID0gMTsKIAogCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgKDB4MTAgKyA0KSkgewotCQlwcmludGsoS0VSTl9JTkZPICJSZWNlaXZlZCBkYXRhX2xlbmd0aDogJXUiCisJCXByX2RlYnVnKCJSZWNlaXZlZCBkYXRhX2xlbmd0aDogJXUiCiAJCQkiIHRvbyBzbWFsbCBmb3IgRVZQRCAweGIwXG4iLAogCQkJY21kLT5kYXRhX2xlbmd0aCk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGhhdmVfdHAgJiYgY21kLT5kYXRhX2xlbmd0aCA8ICgweDNjICsgNCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUmVjZWl2ZWQgZGF0YV9sZW5ndGg6ICV1IgorCQlwcl9kZWJ1ZygiUmVjZWl2ZWQgZGF0YV9sZW5ndGg6ICV1IgogCQkJIiB0b28gc21hbGwgZm9yIFRQRT0xIEVWUEQgMHhiMFxuIiwKIAkJCWNtZC0+ZGF0YV9sZW5ndGgpOwogCQloYXZlX3RwID0gMDsKIAl9CiAKIAlidWZbMF0gPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2RldmljZV90eXBlKGRldik7Ci0JYnVmWzFdID0gMHhiMDsKIAlidWZbM10gPSBoYXZlX3RwID8gMHgzYyA6IDB4MTA7CiAKKwkvKiBTZXQgV1NOWiB0byAxICovCisJYnVmWzRdID0gMHgwMTsKKwogCS8qCiAJICogU2V0IE9QVElNQUwgVFJBTlNGRVIgTEVOR1RIIEdSQU5VTEFSSVRZCiAJICovCkBAIC01MjMsMTIgKzQ5NCwxMiBAQAogCS8qCiAJICogU2V0IE1BWElNVU0gVFJBTlNGRVIgTEVOR1RICiAJICovCi0JcHV0X3VuYWxpZ25lZF9iZTMyKERFVl9BVFRSSUIoZGV2KS0+bWF4X3NlY3RvcnMsICZidWZbOF0pOworCXB1dF91bmFsaWduZWRfYmUzMihkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIubWF4X3NlY3RvcnMsICZidWZbOF0pOwogCiAJLyoKIAkgKiBTZXQgT1BUSU1BTCBUUkFOU0ZFUiBMRU5HVEgKIAkgKi8KLQlwdXRfdW5hbGlnbmVkX2JlMzIoREVWX0FUVFJJQihkZXYpLT5vcHRpbWFsX3NlY3RvcnMsICZidWZbMTJdKTsKKwlwdXRfdW5hbGlnbmVkX2JlMzIoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLm9wdGltYWxfc2VjdG9ycywgJmJ1ZlsxMl0pOwogCiAJLyoKIAkgKiBFeGl0IG5vdyBpZiB3ZSBkb24ndCBzdXBwb3J0IFRQIG9yIHRoZSBpbml0aWF0b3Igc2VudCBhIHRvbwpAQCAtNTQwLDM1ICs1MTEsNTEgQEAKIAkvKgogCSAqIFNldCBNQVhJTVVNIFVOTUFQIExCQSBDT1VOVAogCSAqLwotCXB1dF91bmFsaWduZWRfYmUzMihERVZfQVRUUklCKGRldiktPm1heF91bm1hcF9sYmFfY291bnQsICZidWZbMjBdKTsKKwlwdXRfdW5hbGlnbmVkX2JlMzIoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLm1heF91bm1hcF9sYmFfY291bnQsICZidWZbMjBdKTsKIAogCS8qCiAJICogU2V0IE1BWElNVU0gVU5NQVAgQkxPQ0sgREVTQ1JJUFRPUiBDT1VOVAogCSAqLwotCXB1dF91bmFsaWduZWRfYmUzMihERVZfQVRUUklCKGRldiktPm1heF91bm1hcF9ibG9ja19kZXNjX2NvdW50LAorCXB1dF91bmFsaWduZWRfYmUzMihkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIubWF4X3VubWFwX2Jsb2NrX2Rlc2NfY291bnQsCiAJCQkgICAmYnVmWzI0XSk7CiAKIAkvKgogCSAqIFNldCBPUFRJTUFMIFVOTUFQIEdSQU5VTEFSSVRZCiAJICovCi0JcHV0X3VuYWxpZ25lZF9iZTMyKERFVl9BVFRSSUIoZGV2KS0+dW5tYXBfZ3JhbnVsYXJpdHksICZidWZbMjhdKTsKKwlwdXRfdW5hbGlnbmVkX2JlMzIoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLnVubWFwX2dyYW51bGFyaXR5LCAmYnVmWzI4XSk7CiAKIAkvKgogCSAqIFVOTUFQIEdSQU5VTEFSSVRZIEFMSUdOTUVOVAogCSAqLwotCXB1dF91bmFsaWduZWRfYmUzMihERVZfQVRUUklCKGRldiktPnVubWFwX2dyYW51bGFyaXR5X2FsaWdubWVudCwKKwlwdXRfdW5hbGlnbmVkX2JlMzIoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLnVubWFwX2dyYW51bGFyaXR5X2FsaWdubWVudCwKIAkJCSAgICZidWZbMzJdKTsKLQlpZiAoREVWX0FUVFJJQihkZXYpLT51bm1hcF9ncmFudWxhcml0eV9hbGlnbm1lbnQgIT0gMCkKKwlpZiAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLnVubWFwX2dyYW51bGFyaXR5X2FsaWdubWVudCAhPSAwKQogCQlidWZbMzJdIHw9IDB4ODA7IC8qIFNldCB0aGUgVUdBVkFMSUQgYml0ICovCiAKIAlyZXR1cm4gMDsKIH0KIAorLyogQmxvY2sgRGV2aWNlIENoYXJhY3RlcmlzdGljcyBWUEQgcGFnZSAqLworc3RhdGljIGludAordGFyZ2V0X2VtdWxhdGVfZXZwZF9iMShzdHJ1Y3Qgc2VfY21kICpjbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKKworCWJ1ZlswXSA9IGRldi0+dHJhbnNwb3J0LT5nZXRfZGV2aWNlX3R5cGUoZGV2KTsKKwlidWZbM10gPSAweDNjOworCisJaWYgKGNtZC0+ZGF0YV9sZW5ndGggPj0gNSAmJgorCSAgICBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuaXNfbm9ucm90KQorCQlidWZbNV0gPSAxOworCisJcmV0dXJuIDA7Cit9CisKIC8qIFRoaW4gUHJvdmlzaW9uaW5nIFZQRCAqLwogc3RhdGljIGludAogdGFyZ2V0X2VtdWxhdGVfZXZwZF9iMihzdHJ1Y3Qgc2VfY21kICpjbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBTRV9ERVYoY21kKTsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAogCS8qCiAJICogRnJvbSBzYmMzcjIyIHNlY3Rpb24gNi41LjQgVGhpbiBQcm92aXNpb25pbmcgVlBEIHBhZ2U6CkBAIC01NzksNyArNTY2LDYgQEAKIAkgKiBkZWZpbmVkIGluIHRhYmxlIDE2Mi4KIAkgKi8KIAlidWZbMF0gPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2RldmljZV90eXBlKGRldik7Ci0JYnVmWzFdID0gMHhiMjsKIAogCS8qCiAJICogU2V0IEhhcmRjb2RlZCBsZW5ndGggbWVudGlvbmVkIGFib3ZlIGZvciBEUD0wCkBAIC02MDIsNyArNTg4LDcgQEAKIAkgKiB0aGUgVU5NQVAgY29tbWFuZCAoc2VlIDUuMjUpLiBBIFRQVSBiaXQgc2V0IHRvIHplcm8gaW5kaWNhdGVzCiAJICogdGhhdCB0aGUgZGV2aWNlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBVTk1BUCBjb21tYW5kLgogCSAqLwotCWlmIChERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdHB1ICE9IDApCisJaWYgKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3RwdSAhPSAwKQogCQlidWZbNV0gPSAweDgwOwogCiAJLyoKQEAgLTYxMSwxOCArNTk3LDU5IEBACiAJICogQSBUUFdTIGJpdCBzZXQgdG8gemVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGV2aWNlIHNlcnZlciBkb2VzIG5vdAogCSAqIHN1cHBvcnQgdGhlIHVzZSBvZiB0aGUgV1JJVEUgU0FNRSAoMTYpIGNvbW1hbmQgdG8gdW5tYXAgTEJBcy4KIAkgKi8KLQlpZiAoREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX3Rwd3MgIT0gMCkKKwlpZiAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfdHB3cyAhPSAwKQogCQlidWZbNV0gfD0gMHg0MDsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Cit0YXJnZXRfZW11bGF0ZV9ldnBkXzAwKHN0cnVjdCBzZV9jbWQgKmNtZCwgdW5zaWduZWQgY2hhciAqYnVmKTsKKworc3RhdGljIHN0cnVjdCB7CisJdWludDhfdAkJcGFnZTsKKwlpbnQJCSgqZW11bGF0ZSkoc3RydWN0IHNlX2NtZCAqLCB1bnNpZ25lZCBjaGFyICopOworfSBldnBkX2hhbmRsZXJzW10gPSB7CisJeyAucGFnZSA9IDB4MDAsIC5lbXVsYXRlID0gdGFyZ2V0X2VtdWxhdGVfZXZwZF8wMCB9LAorCXsgLnBhZ2UgPSAweDgwLCAuZW11bGF0ZSA9IHRhcmdldF9lbXVsYXRlX2V2cGRfODAgfSwKKwl7IC5wYWdlID0gMHg4MywgLmVtdWxhdGUgPSB0YXJnZXRfZW11bGF0ZV9ldnBkXzgzIH0sCisJeyAucGFnZSA9IDB4ODYsIC5lbXVsYXRlID0gdGFyZ2V0X2VtdWxhdGVfZXZwZF84NiB9LAorCXsgLnBhZ2UgPSAweGIwLCAuZW11bGF0ZSA9IHRhcmdldF9lbXVsYXRlX2V2cGRfYjAgfSwKKwl7IC5wYWdlID0gMHhiMSwgLmVtdWxhdGUgPSB0YXJnZXRfZW11bGF0ZV9ldnBkX2IxIH0sCisJeyAucGFnZSA9IDB4YjIsIC5lbXVsYXRlID0gdGFyZ2V0X2VtdWxhdGVfZXZwZF9iMiB9LAorfTsKKworLyogc3VwcG9ydGVkIHZpdGFsIHByb2R1Y3QgZGF0YSBwYWdlcyAqLworc3RhdGljIGludAordGFyZ2V0X2VtdWxhdGVfZXZwZF8wMChzdHJ1Y3Qgc2VfY21kICpjbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcDsKKworCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgOCkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBPbmx5IHJlcG9ydCB0aGUgSU5RVUlSWSBFVlBEPTEgcGFnZXMgYWZ0ZXIgYSB2YWxpZCBOQUEKKwkgKiBSZWdpc3RlcmVkIEV4dGVuZGVkIExVTiBXV04gaGFzIGJlZW4gc2V0IHZpYSBDb25maWdGUworCSAqIGR1cmluZyBkZXZpY2UgY3JlYXRpb24vcmVzdGFydC4KKwkgKi8KKwlpZiAoY21kLT5zZV9kZXYtPnNlX3N1Yl9kZXYtPnN1X2Rldl9mbGFncyAmCisJCQlTREZfRU1VTEFURURfVlBEX1VOSVRfU0VSSUFMKSB7CisJCWJ1ZlszXSA9IEFSUkFZX1NJWkUoZXZwZF9oYW5kbGVycyk7CisJCWZvciAocCA9IDA7IHAgPCBtaW5fdChpbnQsIEFSUkFZX1NJWkUoZXZwZF9oYW5kbGVycyksCisJCQkJICAgICAgY21kLT5kYXRhX2xlbmd0aCAtIDQpOyArK3ApCisJCQlidWZbcCArIDRdID0gZXZwZF9oYW5kbGVyc1twXS5wYWdlOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CiB0YXJnZXRfZW11bGF0ZV9pbnF1aXJ5KHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBTRV9ERVYoY21kKTsKLQl1bnNpZ25lZCBjaGFyICpidWYgPSBjbWQtPnRfdGFzay0+dF90YXNrX2J1ZjsKLQl1bnNpZ25lZCBjaGFyICpjZGIgPSBjbWQtPnRfdGFzay0+dF90YXNrX2NkYjsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgY2hhciAqY2RiID0gY21kLT50X3Rhc2tfY2RiOworCWludCBwLCByZXQ7CiAKIAlpZiAoIShjZGJbMV0gJiAweDEpKQogCQlyZXR1cm4gdGFyZ2V0X2VtdWxhdGVfaW5xdWlyeV9zdGQoY21kKTsKQEAgLTYzNSwzOCArNjYyLDMzIEBACiAJICogcGF5bG9hZCBsZW5ndGggbGVmdCBmb3IgdGhlIG5leHQgb3V0Z29pbmcgRVZQRCBtZXRhZGF0YQogCSAqLwogCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgNCkgewotCQlwcmludGsoS0VSTl9FUlIgIlNDU0kgSW5xdWlyeSBwYXlsb2FkIGxlbmd0aDogJXUiCisJCXByX2VycigiU0NTSSBJbnF1aXJ5IHBheWxvYWQgbGVuZ3RoOiAldSIKIAkJCSIgdG9vIHNtYWxsIGZvciBFVlBEPTFcbiIsIGNtZC0+ZGF0YV9sZW5ndGgpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCX0KKworCWJ1ZiA9IHRyYW5zcG9ydF9rbWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOworCiAJYnVmWzBdID0gZGV2LT50cmFuc3BvcnQtPmdldF9kZXZpY2VfdHlwZShkZXYpOwogCi0Jc3dpdGNoIChjZGJbMl0pIHsKLQljYXNlIDB4MDA6Ci0JCXJldHVybiB0YXJnZXRfZW11bGF0ZV9ldnBkXzAwKGNtZCwgYnVmKTsKLQljYXNlIDB4ODA6Ci0JCXJldHVybiB0YXJnZXRfZW11bGF0ZV9ldnBkXzgwKGNtZCwgYnVmKTsKLQljYXNlIDB4ODM6Ci0JCXJldHVybiB0YXJnZXRfZW11bGF0ZV9ldnBkXzgzKGNtZCwgYnVmKTsKLQljYXNlIDB4ODY6Ci0JCXJldHVybiB0YXJnZXRfZW11bGF0ZV9ldnBkXzg2KGNtZCwgYnVmKTsKLQljYXNlIDB4YjA6Ci0JCXJldHVybiB0YXJnZXRfZW11bGF0ZV9ldnBkX2IwKGNtZCwgYnVmKTsKLQljYXNlIDB4YjI6Ci0JCXJldHVybiB0YXJnZXRfZW11bGF0ZV9ldnBkX2IyKGNtZCwgYnVmKTsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIlVua25vd24gVlBEIENvZGU6IDB4JTAyeFxuIiwgY2RiWzJdKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlmb3IgKHAgPSAwOyBwIDwgQVJSQVlfU0laRShldnBkX2hhbmRsZXJzKTsgKytwKQorCQlpZiAoY2RiWzJdID09IGV2cGRfaGFuZGxlcnNbcF0ucGFnZSkgeworCQkJYnVmWzFdID0gY2RiWzJdOworCQkJcmV0ID0gZXZwZF9oYW5kbGVyc1twXS5lbXVsYXRlKGNtZCwgYnVmKTsKKwkJCXRyYW5zcG9ydF9rdW5tYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisJCQlyZXR1cm4gcmV0OworCQl9CiAKLQlyZXR1cm4gMDsKKwl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOworCXByX2VycigiVW5rbm93biBWUEQgQ29kZTogMHglMDJ4XG4iLCBjZGJbMl0pOworCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgaW50CiB0YXJnZXRfZW11bGF0ZV9yZWFkY2FwYWNpdHkoc3RydWN0IHNlX2NtZCAqY21kKQogewotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0RFVihjbWQpOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGNtZC0+dF90YXNrLT50X3Rhc2tfYnVmOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tzX2xvbmcgPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2Jsb2NrcyhkZXYpOwogCXUzMiBibG9ja3M7CiAKQEAgLTY3NSwzMCArNjk3LDM2IEBACiAJZWxzZQogCQlibG9ja3MgPSAodTMyKWJsb2Nrc19sb25nOwogCisJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisKIAlidWZbMF0gPSAoYmxvY2tzID4+IDI0KSAmIDB4ZmY7CiAJYnVmWzFdID0gKGJsb2NrcyA+PiAxNikgJiAweGZmOwogCWJ1ZlsyXSA9IChibG9ja3MgPj4gOCkgJiAweGZmOwogCWJ1ZlszXSA9IGJsb2NrcyAmIDB4ZmY7Ci0JYnVmWzRdID0gKERFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSA+PiAyNCkgJiAweGZmOwotCWJ1Zls1XSA9IChERVZfQVRUUklCKGRldiktPmJsb2NrX3NpemUgPj4gMTYpICYgMHhmZjsKLQlidWZbNl0gPSAoREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplID4+IDgpICYgMHhmZjsKLQlidWZbN10gPSBERVZfQVRUUklCKGRldiktPmJsb2NrX3NpemUgJiAweGZmOworCWJ1Zls0XSA9IChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZSA+PiAyNCkgJiAweGZmOworCWJ1Zls1XSA9IChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZSA+PiAxNikgJiAweGZmOworCWJ1Zls2XSA9IChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZSA+PiA4KSAmIDB4ZmY7CisJYnVmWzddID0gZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUgJiAweGZmOwogCS8qCiAJICogU2V0IG1heCAzMi1iaXQgYmxvY2tzIHRvIHNpZ25hbCBTRVJWSUNFIEFDVElPTiBSRUFEX0NBUEFDSVRZXzE2CiAJKi8KLQlpZiAoREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX3RwdSB8fCBERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdHB3cykKKwlpZiAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfdHB1IHx8IGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3Rwd3MpCiAJCXB1dF91bmFsaWduZWRfYmUzMigweEZGRkZGRkZGLCAmYnVmWzBdKTsKIAorCXRyYW5zcG9ydF9rdW5tYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogdGFyZ2V0X2VtdWxhdGVfcmVhZGNhcGFjaXR5XzE2KHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBTRV9ERVYoY21kKTsKLQl1bnNpZ25lZCBjaGFyICpidWYgPSBjbWQtPnRfdGFzay0+dF90YXNrX2J1ZjsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CiAJdW5zaWduZWQgbG9uZyBsb25nIGJsb2NrcyA9IGRldi0+dHJhbnNwb3J0LT5nZXRfYmxvY2tzKGRldik7CiAKKwlidWYgPSB0cmFuc3BvcnRfa21hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKKwogCWJ1ZlswXSA9IChibG9ja3MgPj4gNTYpICYgMHhmZjsKIAlidWZbMV0gPSAoYmxvY2tzID4+IDQ4KSAmIDB4ZmY7CiAJYnVmWzJdID0gKGJsb2NrcyA+PiA0MCkgJiAweGZmOwpAQCAtNzA3LDE3ICs3MzUsMTkgQEAKIAlidWZbNV0gPSAoYmxvY2tzID4+IDE2KSAmIDB4ZmY7CiAJYnVmWzZdID0gKGJsb2NrcyA+PiA4KSAmIDB4ZmY7CiAJYnVmWzddID0gYmxvY2tzICYgMHhmZjsKLQlidWZbOF0gPSAoREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplID4+IDI0KSAmIDB4ZmY7Ci0JYnVmWzldID0gKERFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSA+PiAxNikgJiAweGZmOwotCWJ1ZlsxMF0gPSAoREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplID4+IDgpICYgMHhmZjsKLQlidWZbMTFdID0gREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplICYgMHhmZjsKKwlidWZbOF0gPSAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUgPj4gMjQpICYgMHhmZjsKKwlidWZbOV0gPSAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUgPj4gMTYpICYgMHhmZjsKKwlidWZbMTBdID0gKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5ibG9ja19zaXplID4+IDgpICYgMHhmZjsKKwlidWZbMTFdID0gZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUgJiAweGZmOwogCS8qCiAJICogU2V0IFRoaW4gUHJvdmlzaW9uaW5nIEVuYWJsZSBiaXQgZm9sbG93aW5nIHNiYzNyMjIgaW4gc2VjdGlvbgogCSAqIFJFQUQgQ0FQQUNJVFkgKDE2KSBieXRlIDE0IGlmIGVtdWxhdGVfdHB1IG9yIGVtdWxhdGVfdHB3cyBpcyBlbmFibGVkLgogCSAqLwotCWlmIChERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdHB1IHx8IERFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV90cHdzKQorCWlmIChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV90cHUgfHwgZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfdHB3cykKIAkJYnVmWzE0XSA9IDB4ODA7CiAKKwl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTczNyw2ICs3NjcsMzUgQEAKIAlwWzFdID0gMHgwYTsKIAlwWzJdID0gMjsKIAkvKgorCSAqIEZyb20gc3BjNHIyMywgNy40LjcgQ29udHJvbCBtb2RlIHBhZ2UKKwkgKgorCSAqIFRoZSBRVUVVRSBBTEdPUklUSE0gTU9ESUZJRVIgZmllbGQgKHNlZSB0YWJsZSAzNjgpIHNwZWNpZmllcworCSAqIHJlc3RyaWN0aW9ucyBvbiB0aGUgYWxnb3JpdGhtIHVzZWQgZm9yIHJlb3JkZXJpbmcgY29tbWFuZHMKKwkgKiBoYXZpbmcgdGhlIFNJTVBMRSB0YXNrIGF0dHJpYnV0ZSAoc2VlIFNBTS00KS4KKwkgKgorCSAqICAgICAgICAgICAgICAgICAgICBUYWJsZSAzNjggLS0gUVVFVUUgQUxHT1JJVEhNIE1PRElGSUVSIGZpZWxkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgQ29kZSAgICAgIERlc2NyaXB0aW9uCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIDBoICAgICAgIFJlc3RyaWN0ZWQgcmVvcmRlcmluZworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAxaCAgICAgICBVbnJlc3RyaWN0ZWQgcmVvcmRlcmluZyBhbGxvd2VkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIDJoIHRvIDdoICAgIFJlc2VydmVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIDhoIHRvIEZoICAgIFZlbmRvciBzcGVjaWZpYworCSAqCisJICogQSB2YWx1ZSBvZiB6ZXJvIGluIHRoZSBRVUVVRSBBTEdPUklUSE0gTU9ESUZJRVIgZmllbGQgc3BlY2lmaWVzIHRoYXQKKwkgKiB0aGUgZGV2aWNlIHNlcnZlciBzaGFsbCBvcmRlciB0aGUgcHJvY2Vzc2luZyBzZXF1ZW5jZSBvZiBjb21tYW5kcworCSAqIGhhdmluZyB0aGUgU0lNUExFIHRhc2sgYXR0cmlidXRlIHN1Y2ggdGhhdCBkYXRhIGludGVncml0eSBpcyBtYWludGFpbmVkCisJICogZm9yIHRoYXQgSV9UIG5leHVzIChpLmUuLCBpZiB0aGUgdHJhbnNtaXNzaW9uIG9mIG5ldyBTQ1NJIHRyYW5zcG9ydCBwcm90b2NvbAorCSAqIHJlcXVlc3RzIGlzIGhhbHRlZCBhdCBhbnkgdGltZSwgdGhlIGZpbmFsIHZhbHVlIG9mIGFsbCBkYXRhIG9ic2VydmFibGUKKwkgKiBvbiB0aGUgbWVkaXVtIHNoYWxsIGJlIHRoZSBzYW1lIGFzIGlmIGFsbCB0aGUgY29tbWFuZHMgaGFkIGJlZW4gcHJvY2Vzc2VkCisJICogd2l0aCB0aGUgT1JERVJFRCB0YXNrIGF0dHJpYnV0ZSkuCisJICoKKwkgKiBBIHZhbHVlIG9mIG9uZSBpbiB0aGUgUVVFVUUgQUxHT1JJVEhNIE1PRElGSUVSIGZpZWxkIHNwZWNpZmllcyB0aGF0IHRoZQorCSAqIGRldmljZSBzZXJ2ZXIgbWF5IHJlb3JkZXIgdGhlIHByb2Nlc3Npbmcgc2VxdWVuY2Ugb2YgY29tbWFuZHMgaGF2aW5nIHRoZQorCSAqIFNJTVBMRSB0YXNrIGF0dHJpYnV0ZSBpbiBhbnkgbWFubmVyLiBBbnkgZGF0YSBpbnRlZ3JpdHkgZXhwb3N1cmVzIHJlbGF0ZWQgdG8KKwkgKiBjb21tYW5kIHNlcXVlbmNlIG9yZGVyIHNoYWxsIGJlIGV4cGxpY2l0bHkgaGFuZGxlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50CisJICogdGhyb3VnaCB0aGUgc2VsZWN0aW9uIG9mIGFwcHJvcHJpYXRlIG9tbWFuZHMgYW5kIHRhc2sgYXR0cmlidXRlcy4KKwkgKi8KKwlwWzNdID0gKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3Jlc3RfcmVvcmQgPT0gMSkgPyAweDAwIDogMHgxMDsKKwkvKgogCSAqIEZyb20gc3BjNHIxNywgc2VjdGlvbiA3LjQuNiBDb250cm9sIG1vZGUgUGFnZQogCSAqCiAJICogVW5pdCBBdHRlbnRpb24gaW50ZXJsb2NrcyBjb250cm9sIChVTl9JTlRMQ0tfQ1RSTCkgdG8gY29kZSAwMGIKQEAgLTc2NSw4ICs4MjQsOCBAQAogCSAqIGZvciBhIEJVU1ksIFRBU0sgU0VUIEZVTEwsIG9yIFJFU0VSVkFUSU9OIENPTkZMSUNUIHN0YXR1cyByZWdhcmRsZXNzCiAJICogdG8gdGhlIG51bWJlciBvZiBjb21tYW5kcyBjb21wbGV0ZWQgd2l0aCBvbmUgb2YgdGhvc2Ugc3RhdHVzIGNvZGVzLgogCSAqLwotCXBbNF0gPSAoREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX3VhX2ludGxja19jdHJsID09IDIpID8gMHgzMCA6Ci0JICAgICAgIChERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdWFfaW50bGNrX2N0cmwgPT0gMSkgPyAweDIwIDogMHgwMDsKKwlwWzRdID0gKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3VhX2ludGxja19jdHJsID09IDIpID8gMHgzMCA6CisJICAgICAgIChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV91YV9pbnRsY2tfY3RybCA9PSAxKSA/IDB4MjAgOiAweDAwOwogCS8qCiAJICogRnJvbSBzcGM0cjE3LCBzZWN0aW9uIDcuNC42IENvbnRyb2wgbW9kZSBQYWdlCiAJICoKQEAgLTc3OSw3ICs4MzgsNyBAQAogCSAqIHdoaWNoIHRoZSBjb21tYW5kIHdhcyByZWNlaXZlZCBzaGFsbCBiZSBjb21wbGV0ZWQgd2l0aCBUQVNLIEFCT1JURUQKIAkgKiBzdGF0dXMgKHNlZSBTQU0tNCkuCiAJICovCi0JcFs1XSA9IChERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdGFzKSA/IDB4NDAgOiAweDAwOworCXBbNV0gPSAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfdGFzKSA/IDB4NDAgOiAweDAwOwogCXBbOF0gPSAweGZmOwogCXBbOV0gPSAweGZmOwogCXBbMTFdID0gMzA7CkBAIC03OTIsNyArODUxLDcgQEAKIHsKIAlwWzBdID0gMHgwODsKIAlwWzFdID0gMHgxMjsKLQlpZiAoREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX3dyaXRlX2NhY2hlID4gMCkKKwlpZiAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfd3JpdGVfY2FjaGUgPiAwKQogCQlwWzJdID0gMHgwNDsgLyogV3JpdGUgQ2FjaGUgRW5hYmxlICovCiAJcFsxMl0gPSAweDIwOyAvKiBEaXNhYmxlZCBSZWFkIEFoZWFkICovCiAKQEAgLTgzMCw5ICs4ODksOSBAQAogc3RhdGljIGludAogdGFyZ2V0X2VtdWxhdGVfbW9kZXNlbnNlKHN0cnVjdCBzZV9jbWQgKmNtZCwgaW50IHRlbikKIHsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBTRV9ERVYoY21kKTsKLQljaGFyICpjZGIgPSBjbWQtPnRfdGFzay0+dF90YXNrX2NkYjsKLQl1bnNpZ25lZCBjaGFyICpyYnVmID0gY21kLT50X3Rhc2stPnRfdGFza19idWY7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CisJY2hhciAqY2RiID0gY21kLT50X3Rhc2tfY2RiOworCXVuc2lnbmVkIGNoYXIgKnJidWY7CiAJaW50IHR5cGUgPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2RldmljZV90eXBlKGRldik7CiAJaW50IG9mZnNldCA9ICh0ZW4pID8gOCA6IDQ7CiAJaW50IGxlbmd0aCA9IDA7CkBAIC04NTYsNyArOTE1LDcgQEAKIAkJbGVuZ3RoICs9IHRhcmdldF9tb2Rlc2Vuc2VfY29udHJvbChkZXYsICZidWZbb2Zmc2V0K2xlbmd0aF0pOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIkdvdCBVbmtub3duIE1vZGUgUGFnZTogMHglMDJ4XG4iLAorCQlwcl9lcnIoIkdvdCBVbmtub3duIE1vZGUgUGFnZTogMHglMDJ4XG4iLAogCQkJCWNkYlsyXSAmIDB4M2YpOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9VTktOT1dOX01PREVfUEFHRTsKIAl9CkBAIC04NjcsMTMgKzkyNiwxMyBAQAogCQlidWZbMF0gPSAob2Zmc2V0ID4+IDgpICYgMHhmZjsKIAkJYnVmWzFdID0gb2Zmc2V0ICYgMHhmZjsKIAotCQlpZiAoKFNFX0xVTihjbWQpLT5sdW5fYWNjZXNzICYgVFJBTlNQT1JUX0xVTkZMQUdTX1JFQURfT05MWSkgfHwKKwkJaWYgKChjbWQtPnNlX2x1bi0+bHVuX2FjY2VzcyAmIFRSQU5TUE9SVF9MVU5GTEFHU19SRUFEX09OTFkpIHx8CiAJCSAgICAoY21kLT5zZV9kZXZlICYmCiAJCSAgICAoY21kLT5zZV9kZXZlLT5sdW5fZmxhZ3MgJiBUUkFOU1BPUlRfTFVORkxBR1NfUkVBRF9PTkxZKSkpCiAJCQl0YXJnZXRfbW9kZXNlbnNlX3dyaXRlX3Byb3RlY3QoJmJ1ZlszXSwgdHlwZSk7CiAKLQkJaWYgKChERVZfQVRUUklCKGRldiktPmVtdWxhdGVfd3JpdGVfY2FjaGUgPiAwKSAmJgotCQkgICAgKERFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV9mdWFfd3JpdGUgPiAwKSkKKwkJaWYgKChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV93cml0ZV9jYWNoZSA+IDApICYmCisJCSAgICAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfZnVhX3dyaXRlID4gMCkpCiAJCQl0YXJnZXRfbW9kZXNlbnNlX2Rwb2Z1YSgmYnVmWzNdLCB0eXBlKTsKIAogCQlpZiAoKG9mZnNldCArIDIpID4gY21kLT5kYXRhX2xlbmd0aCkKQEAgLTg4MywxOSArOTQyLDIyIEBACiAJCW9mZnNldCAtPSAxOwogCQlidWZbMF0gPSBvZmZzZXQgJiAweGZmOwogCi0JCWlmICgoU0VfTFVOKGNtZCktPmx1bl9hY2Nlc3MgJiBUUkFOU1BPUlRfTFVORkxBR1NfUkVBRF9PTkxZKSB8fAorCQlpZiAoKGNtZC0+c2VfbHVuLT5sdW5fYWNjZXNzICYgVFJBTlNQT1JUX0xVTkZMQUdTX1JFQURfT05MWSkgfHwKIAkJICAgIChjbWQtPnNlX2RldmUgJiYKIAkJICAgIChjbWQtPnNlX2RldmUtPmx1bl9mbGFncyAmIFRSQU5TUE9SVF9MVU5GTEFHU19SRUFEX09OTFkpKSkKIAkJCXRhcmdldF9tb2Rlc2Vuc2Vfd3JpdGVfcHJvdGVjdCgmYnVmWzJdLCB0eXBlKTsKIAotCQlpZiAoKERFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV93cml0ZV9jYWNoZSA+IDApICYmCi0JCSAgICAoREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX2Z1YV93cml0ZSA+IDApKQorCQlpZiAoKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3dyaXRlX2NhY2hlID4gMCkgJiYKKwkJICAgIChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV9mdWFfd3JpdGUgPiAwKSkKIAkJCXRhcmdldF9tb2Rlc2Vuc2VfZHBvZnVhKCZidWZbMl0sIHR5cGUpOwogCiAJCWlmICgob2Zmc2V0ICsgMSkgPiBjbWQtPmRhdGFfbGVuZ3RoKQogCQkJb2Zmc2V0ID0gY21kLT5kYXRhX2xlbmd0aDsKIAl9CisKKwlyYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CiAJbWVtY3B5KHJidWYsIGJ1Ziwgb2Zmc2V0KTsKKwl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MDMsMTYgKzk2NSwyMCBAQAogc3RhdGljIGludAogdGFyZ2V0X2VtdWxhdGVfcmVxdWVzdF9zZW5zZShzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7Ci0JdW5zaWduZWQgY2hhciAqY2RiID0gY21kLT50X3Rhc2stPnRfdGFza19jZGI7Ci0JdW5zaWduZWQgY2hhciAqYnVmID0gY21kLT50X3Rhc2stPnRfdGFza19idWY7CisJdW5zaWduZWQgY2hhciAqY2RiID0gY21kLT50X3Rhc2tfY2RiOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1OCB1YV9hc2MgPSAwLCB1YV9hc2NxID0gMDsKKwlpbnQgZXJyID0gMDsKIAogCWlmIChjZGJbMV0gJiAweDAxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUkVRVUVTVF9TRU5TRSBkZXNjcmlwdGlvbiBlbXVsYXRpb24gbm90IgorCQlwcl9lcnIoIlJFUVVFU1RfU0VOU0UgZGVzY3JpcHRpb24gZW11bGF0aW9uIG5vdCIKIAkJCSIgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7CiAJfQotCWlmICghKGNvcmVfc2NzaTNfdWFfY2xlYXJfZm9yX3JlcXVlc3Rfc2Vuc2UoY21kLCAmdWFfYXNjLCAmdWFfYXNjcSkpKSB7CisKKwlidWYgPSB0cmFuc3BvcnRfa21hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKKworCWlmICghY29yZV9zY3NpM191YV9jbGVhcl9mb3JfcmVxdWVzdF9zZW5zZShjbWQsICZ1YV9hc2MsICZ1YV9hc2NxKSkgewogCQkvKgogCQkgKiBDVVJSRU5UIEVSUk9SLCBVTklUIEFUVEVOVElPTgogCQkgKi8KQEAgLTkyNCw3ICs5OTAsOCBAQAogCQkgKi8KIAkJaWYgKGNtZC0+ZGF0YV9sZW5ndGggPD0gMTgpIHsKIAkJCWJ1Zls3XSA9IDB4MDA7Ci0JCQlyZXR1cm4gMDsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGVuZDsKIAkJfQogCQkvKgogCQkgKiBUaGUgQWRkaXRpb25hbCBTZW5zZSBDb2RlIChBU0MpIGZyb20gdGhlIFVOSVQgQVRURU5USU9OCkBAIC05NDQsNyArMTAxMSw4IEBACiAJCSAqLwogCQlpZiAoY21kLT5kYXRhX2xlbmd0aCA8PSAxOCkgewogCQkJYnVmWzddID0gMHgwMDsKLQkJCXJldHVybiAwOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZW5kOwogCQl9CiAJCS8qCiAJCSAqIE5PIEFERElUSU9OQUwgU0VOU0UgSU5GT1JNQVRJT04KQEAgLTk1Myw2ICsxMDIxLDkgQEAKIAkJYnVmWzddID0gMHgwQTsKIAl9CiAKK2VuZDoKKwl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk2MywxMyArMTAzNCwxMyBAQAogc3RhdGljIGludAogdGFyZ2V0X2VtdWxhdGVfdW5tYXAoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7Ci0Jc3RydWN0IHNlX2NtZCAqY21kID0gVEFTS19DTUQodGFzayk7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfREVWKGNtZCk7Ci0JdW5zaWduZWQgY2hhciAqYnVmID0gY21kLT50X3Rhc2stPnRfdGFza19idWYsICpwdHIgPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgKmNkYiA9ICZjbWQtPnRfdGFzay0+dF90YXNrX2NkYlswXTsKKwlzdHJ1Y3Qgc2VfY21kICpjbWQgPSB0YXNrLT50YXNrX3NlX2NtZDsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKKwl1bnNpZ25lZCBjaGFyICpidWYsICpwdHIgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKmNkYiA9ICZjbWQtPnRfdGFza19jZGJbMF07CiAJc2VjdG9yX3QgbGJhOwogCXVuc2lnbmVkIGludCBzaXplID0gY21kLT5kYXRhX2xlbmd0aCwgcmFuZ2U7Ci0JaW50IHJldCwgb2Zmc2V0OworCWludCByZXQgPSAwLCBvZmZzZXQ7CiAJdW5zaWduZWQgc2hvcnQgZGwsIGJkX2RsOwogCiAJLyogRmlyc3QgVU5NQVAgYmxvY2sgZGVzY3JpcHRvciBzdGFydHMgYXQgOCBieXRlIG9mZnNldCAqLwpAQCAtOTc3LDIxICsxMDQ4LDI0IEBACiAJc2l6ZSAtPSA4OwogCWRsID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZjZGJbMF0pOwogCWJkX2RsID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZjZGJbMl0pOworCisJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisKIAlwdHIgPSAmYnVmW29mZnNldF07Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVU5NQVA6IFN1YjogJXMgVXNpbmcgZGw6ICVodSBiZF9kbDogJWh1IHNpemU6ICVodSIKKwlwcl9kZWJ1ZygiVU5NQVA6IFN1YjogJXMgVXNpbmcgZGw6ICVodSBiZF9kbDogJWh1IHNpemU6ICVodSIKIAkJIiBwdHI6ICVwXG4iLCBkZXYtPnRyYW5zcG9ydC0+bmFtZSwgZGwsIGJkX2RsLCBzaXplLCBwdHIpOwogCiAJd2hpbGUgKHNpemUpIHsKIAkJbGJhID0gZ2V0X3VuYWxpZ25lZF9iZTY0KCZwdHJbMF0pOwogCQlyYW5nZSA9IGdldF91bmFsaWduZWRfYmUzMigmcHRyWzhdKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVU5NQVA6IFVzaW5nIGxiYTogJWxsdSBhbmQgcmFuZ2U6ICV1XG4iLAorCQlwcl9kZWJ1ZygiVU5NQVA6IFVzaW5nIGxiYTogJWxsdSBhbmQgcmFuZ2U6ICV1XG4iLAogCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWxiYSwgcmFuZ2UpOwogCiAJCXJldCA9IGRldi0+dHJhbnNwb3J0LT5kb19kaXNjYXJkKGRldiwgbGJhLCByYW5nZSk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImJsa2Rldl9pc3N1ZV9kaXNjYXJkKCkgZmFpbGVkOiAlZFxuIiwKKwkJCXByX2VycigiYmxrZGV2X2lzc3VlX2Rpc2NhcmQoKSBmYWlsZWQ6ICVkXG4iLAogCQkJCQlyZXQpOwotCQkJcmV0dXJuIC0xOworCQkJZ290byBlcnI7CiAJCX0KIAogCQlwdHIgKz0gMTY7CkBAIC0xMDAwLDcgKzEwNzQsMTAgQEAKIAogCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBHT09EOwogCXRyYW5zcG9ydF9jb21wbGV0ZV90YXNrKHRhc2ssIDEpOwotCXJldHVybiAwOworZXJyOgorCXRyYW5zcG9ydF9rdW5tYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMTAwOCwyMyArMTA4NSwzNiBAQAogICogTm90ZSB0aGlzIGlzIG5vdCB1c2VkIGZvciBUQ00vcFNDU0kgcGFzc3Rocm91Z2gKICAqLwogc3RhdGljIGludAotdGFyZ2V0X2VtdWxhdGVfd3JpdGVfc2FtZShzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKK3RhcmdldF9lbXVsYXRlX3dyaXRlX3NhbWUoc3RydWN0IHNlX3Rhc2sgKnRhc2ssIGludCB3cml0ZV9zYW1lMzIpCiB7Ci0Jc3RydWN0IHNlX2NtZCAqY21kID0gVEFTS19DTUQodGFzayk7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfREVWKGNtZCk7Ci0Jc2VjdG9yX3QgbGJhID0gY21kLT50X3Rhc2stPnRfdGFza19sYmE7Ci0JdW5zaWduZWQgaW50IHJhbmdlOworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCXNlY3Rvcl90IHJhbmdlOworCXNlY3Rvcl90IGxiYSA9IGNtZC0+dF90YXNrX2xiYTsKKwl1bnNpZ25lZCBpbnQgbnVtX2Jsb2NrczsKIAlpbnQgcmV0OworCS8qCisJICogRXh0cmFjdCBudW1fYmxvY2tzIGZyb20gdGhlIFdSSVRFX1NBTUVfKiBDREIuICBUaGVuIHVzZSB0aGUgZXhwbGljdAorCSAqIHJhbmdlIHdoZW4gbm9uIHplcm8gaXMgc3VwcGxpZWQsIG90aGVyd2lzZSBjYWxjdWxhdGUgdGhlIHJlbWFpbmluZworCSAqIHJhbmdlIGJhc2VkIG9uIC0+Z2V0X2Jsb2NrcygpIC0gc3RhcnRpbmcgTEJBLgorCSAqLworCWlmICh3cml0ZV9zYW1lMzIpCisJCW51bV9ibG9ja3MgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJmNtZC0+dF90YXNrX2NkYlsyOF0pOworCWVsc2UKKwkJbnVtX2Jsb2NrcyA9IGdldF91bmFsaWduZWRfYmUzMigmY21kLT50X3Rhc2tfY2RiWzEwXSk7CiAKLQlyYW5nZSA9IChjbWQtPmRhdGFfbGVuZ3RoIC8gREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplKTsKKwlpZiAobnVtX2Jsb2NrcyAhPSAwKQorCQlyYW5nZSA9IG51bV9ibG9ja3M7CisJZWxzZQorCQlyYW5nZSA9IChkZXYtPnRyYW5zcG9ydC0+Z2V0X2Jsb2NrcyhkZXYpIC0gbGJhKTsKIAotCXByaW50ayhLRVJOX0lORk8gIldSSVRFX1NBTUUgVU5NQVA6IExCQTogJWxsdSBSYW5nZTogJXVcbiIsCi0JCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylsYmEsIHJhbmdlKTsKKwlwcl9kZWJ1ZygiV1JJVEVfU0FNRSBVTk1BUDogTEJBOiAlbGx1IFJhbmdlOiAlbGx1XG4iLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylsYmEsICh1bnNpZ25lZCBsb25nIGxvbmcpcmFuZ2UpOwogCiAJcmV0ID0gZGV2LT50cmFuc3BvcnQtPmRvX2Rpc2NhcmQoZGV2LCBsYmEsIHJhbmdlKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJibGtkZXZfaXNzdWVfZGlzY2FyZCgpIGZhaWxlZCBmb3IgV1JJVEVfU0FNRVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcHJfZGVidWcoImJsa2Rldl9pc3N1ZV9kaXNjYXJkKCkgZmFpbGVkIGZvciBXUklURV9TQU1FXG4iKTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKQEAgLTEwMzUsMTIgKzExMjUsMTIgQEAKIGludAogdHJhbnNwb3J0X2VtdWxhdGVfY29udHJvbF9jZGIoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7Ci0Jc3RydWN0IHNlX2NtZCAqY21kID0gVEFTS19DTUQodGFzayk7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfREVWKGNtZCk7CisJc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAJdW5zaWduZWQgc2hvcnQgc2VydmljZV9hY3Rpb247CiAJaW50IHJldCA9IDA7CiAKLQlzd2l0Y2ggKGNtZC0+dF90YXNrLT50X3Rhc2tfY2RiWzBdKSB7CisJc3dpdGNoIChjbWQtPnRfdGFza19jZGJbMF0pIHsKIAljYXNlIElOUVVJUlk6CiAJCXJldCA9IHRhcmdldF9lbXVsYXRlX2lucXVpcnkoY21kKTsKIAkJYnJlYWs7CkBAIC0xMDU0LDEzICsxMTQ0LDEzIEBACiAJCXJldCA9IHRhcmdldF9lbXVsYXRlX21vZGVzZW5zZShjbWQsIDEpOwogCQlicmVhazsKIAljYXNlIFNFUlZJQ0VfQUNUSU9OX0lOOgotCQlzd2l0Y2ggKGNtZC0+dF90YXNrLT50X3Rhc2tfY2RiWzFdICYgMHgxZikgeworCQlzd2l0Y2ggKGNtZC0+dF90YXNrX2NkYlsxXSAmIDB4MWYpIHsKIAkJY2FzZSBTQUlfUkVBRF9DQVBBQ0lUWV8xNjoKIAkJCXJldCA9IHRhcmdldF9lbXVsYXRlX3JlYWRjYXBhY2l0eV8xNihjbWQpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVuc3VwcG9ydGVkIFNBOiAweCUwMnhcbiIsCi0JCQkJY21kLT50X3Rhc2stPnRfdGFza19jZGJbMV0gJiAweDFmKTsKKwkJCXByX2VycigiVW5zdXBwb3J0ZWQgU0E6IDB4JTAyeFxuIiwKKwkJCQljbWQtPnRfdGFza19jZGJbMV0gJiAweDFmKTsKIAkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKIAkJfQogCQlicmVhazsKQEAgLTEwNjksNyArMTE1OSw3IEBACiAJCWJyZWFrOwogCWNhc2UgVU5NQVA6CiAJCWlmICghZGV2LT50cmFuc3BvcnQtPmRvX2Rpc2NhcmQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVU5NQVAgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yOiAlc1xuIiwKKwkJCXByX2VycigiVU5NQVAgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yOiAlc1xuIiwKIAkJCQkJZGV2LT50cmFuc3BvcnQtPm5hbWUpOwogCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOwogCQl9CkBAIC0xMDc3LDI3ICsxMTY3LDI3IEBACiAJCWJyZWFrOwogCWNhc2UgV1JJVEVfU0FNRV8xNjoKIAkJaWYgKCFkZXYtPnRyYW5zcG9ydC0+ZG9fZGlzY2FyZCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJXUklURV9TQU1FXzE2IGVtdWxhdGlvbiBub3Qgc3VwcG9ydGVkIgorCQkJcHJfZXJyKCJXUklURV9TQU1FXzE2IGVtdWxhdGlvbiBub3Qgc3VwcG9ydGVkIgogCQkJCQkiIGZvcjogJXNcbiIsIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKIAkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKIAkJfQotCQlyZXQgPSB0YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lKHRhc2spOworCQlyZXQgPSB0YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lKHRhc2ssIDApOwogCQlicmVhazsKIAljYXNlIFZBUklBQkxFX0xFTkdUSF9DTUQ6CiAJCXNlcnZpY2VfYWN0aW9uID0KLQkJCWdldF91bmFsaWduZWRfYmUxNigmY21kLT50X3Rhc2stPnRfdGFza19jZGJbOF0pOworCQkJZ2V0X3VuYWxpZ25lZF9iZTE2KCZjbWQtPnRfdGFza19jZGJbOF0pOwogCQlzd2l0Y2ggKHNlcnZpY2VfYWN0aW9uKSB7CiAJCWNhc2UgV1JJVEVfU0FNRV8zMjoKIAkJCWlmICghZGV2LT50cmFuc3BvcnQtPmRvX2Rpc2NhcmQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIldSSVRFX1NBTUVfMzIgU0EgZW11bGF0aW9uIG5vdCIKKwkJCQlwcl9lcnIoIldSSVRFX1NBTUVfMzIgU0EgZW11bGF0aW9uIG5vdCIKIAkJCQkJIiBzdXBwb3J0ZWQgZm9yOiAlc1xuIiwKIAkJCQkJZGV2LT50cmFuc3BvcnQtPm5hbWUpOwogCQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKIAkJCX0KLQkJCXJldCA9IHRhcmdldF9lbXVsYXRlX3dyaXRlX3NhbWUodGFzayk7CisJCQlyZXQgPSB0YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lKHRhc2ssIDEpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVuc3VwcG9ydGVkIFZBUklBQkxFX0xFTkdUSF9DTUQgU0E6IgorCQkJcHJfZXJyKCJVbnN1cHBvcnRlZCBWQVJJQUJMRV9MRU5HVEhfQ01EIFNBOiIKIAkJCQkJIiAweCUwMnhcbiIsIHNlcnZpY2VfYWN0aW9uKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMTA1LDggKzExOTUsNyBAQAogCWNhc2UgU1lOQ0hST05JWkVfQ0FDSEU6CiAJY2FzZSAweDkxOiAvKiBTWU5DSFJPTklaRV9DQUNIRV8xNjogKi8KIAkJaWYgKCFkZXYtPnRyYW5zcG9ydC0+ZG9fc3luY19jYWNoZSkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJIlNZTkNIUk9OSVpFX0NBQ0hFIGVtdWxhdGlvbiBub3Qgc3VwcG9ydGVkIgorCQkJcHJfZXJyKCJTWU5DSFJPTklaRV9DQUNIRSBlbXVsYXRpb24gbm90IHN1cHBvcnRlZCIKIAkJCQkiIGZvcjogJXNcbiIsIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKIAkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKIAkJfQpAQCAtMTEyMyw4ICsxMjEyLDggQEAKIAljYXNlIFdSSVRFX0ZJTEVNQVJLUzoKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJVbnN1cHBvcnRlZCBTQ1NJIE9wY29kZTogMHglMDJ4IGZvciAlc1xuIiwKLQkJCWNtZC0+dF90YXNrLT50X3Rhc2tfY2RiWzBdLCBkZXYtPnRyYW5zcG9ydC0+bmFtZSk7CisJCXByX2VycigiVW5zdXBwb3J0ZWQgU0NTSSBPcGNvZGU6IDB4JTAyeCBmb3IgJXNcbiIsCisJCQljbWQtPnRfdGFza19jZGJbMF0sIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY29uZmlnZnMuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NvbmZpZ2ZzLmMKaW5kZXggZWU2ZmFkOS4uYjI1NzVkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY29uZmlnZnMuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jb25maWdmcy5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDx0YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oPgogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaD4KQEAgLTUyLDYgKzUzLDggQEAKICNpbmNsdWRlICJ0YXJnZXRfY29yZV9yZC5oIgogI2luY2x1ZGUgInRhcmdldF9jb3JlX3N0YXQuaCIKIAorZXh0ZXJuIHN0cnVjdCB0MTBfYWx1YV9sdV9ncCAqZGVmYXVsdF9sdV9ncDsKKwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgZ190Zl9saXN0Owogc3RhdGljIHN0cnVjdCBtdXRleCBnX3RmX2xvY2s7CiAKQEAgLTYxLDYgKzY0LDEzIEBACiAJc3NpemVfdCAoKnN0b3JlKSh2b2lkICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY29uZmlnX2dyb3VwIHRhcmdldF9jb3JlX2hiYWdyb3VwOworc3RhdGljIHN0cnVjdCBjb25maWdfZ3JvdXAgYWx1YV9ncm91cDsKK3N0YXRpYyBzdHJ1Y3QgY29uZmlnX2dyb3VwIGFsdWFfbHVfZ3BzX2dyb3VwOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNlX2RldmljZV9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoc2VfZGV2X2xpc3QpOworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzZV9oYmEgKgogaXRlbV90b19oYmEoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKQogewpAQCAtOTQsMTIgKzEwNCwxMiBAQAogewogCXN0cnVjdCB0YXJnZXRfZmFicmljX2NvbmZpZ2ZzICp0ZjsKIAotCWlmICghKG5hbWUpKQorCWlmICghbmFtZSkKIAkJcmV0dXJuIE5VTEw7CiAKIAltdXRleF9sb2NrKCZnX3RmX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodGYsICZnX3RmX2xpc3QsIHRmX2xpc3QpIHsKLQkJaWYgKCEoc3RyY21wKHRmLT50Zl9uYW1lLCBuYW1lKSkpIHsKKwkJaWYgKCFzdHJjbXAodGYtPnRmX25hbWUsIG5hbWUpKSB7CiAJCQlhdG9taWNfaW5jKCZ0Zi0+dGZfYWNjZXNzX2NudCk7CiAJCQltdXRleF91bmxvY2soJmdfdGZfbG9jayk7CiAJCQlyZXR1cm4gdGY7CkBAIC0xMjAsNyArMTMwLDcgQEAKIAlzdHJ1Y3QgdGFyZ2V0X2ZhYnJpY19jb25maWdmcyAqdGY7CiAJaW50IHJldDsKIAotCXByaW50ayhLRVJOX0lORk8gIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBSRUdJU1RFUiAtPiBncm91cDogJXAgbmFtZToiCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBSRUdJU1RFUiAtPiBncm91cDogJXAgbmFtZToiCiAJCQkiICVzXG4iLCBncm91cCwgbmFtZSk7CiAJLyoKIAkgKiBFbnN1cmUgdGhhdCBUQ00gc3Vic3lzdGVtIHBsdWdpbnMgYXJlIGxvYWRlZCBhdCB0aGlzIHBvaW50IGZvcgpAQCAtMTQwLDcgKzE1MCw3IEBACiAJICogcmVnaXN0ZXJlZCwgYnV0IHNpbXBseSBwcm92aWRzIGF1dG8gbG9hZGluZyBsb2dpYyBmb3IgbW9kdWxlcyB3aXRoCiAJICogbWtkaXIoMikgc3lzdGVtIGNhbGxzIHdpdGgga25vd24gVENNIGZhYnJpYyBtb2R1bGVzLgogCSAqLwotCWlmICghKHN0cm5jbXAobmFtZSwgImlzY3NpIiwgNSkpKSB7CisJaWYgKCFzdHJuY21wKG5hbWUsICJpc2NzaSIsIDUpKSB7CiAJCS8qCiAJCSAqIEF1dG9tYXRpY2FsbHkgbG9hZCB0aGUgTElPIFRhcmdldCBmYWJyaWMgbW9kdWxlIHdoZW4gdGhlCiAJCSAqIGZvbGxvd2luZyBpcyBjYWxsZWQ6CkBAIC0xNDksMTEgKzE1OSwxMSBAQAogCQkgKi8KIAkJcmV0ID0gcmVxdWVzdF9tb2R1bGUoImlzY3NpX3RhcmdldF9tb2QiKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAicmVxdWVzdF9tb2R1bGUoKSBmYWlsZWQgZm9yIgorCQkJcHJfZXJyKCJyZXF1ZXN0X21vZHVsZSgpIGZhaWxlZCBmb3IiCiAJCQkJIiBpc2NzaV90YXJnZXRfbW9kLmtvOiAlZFxuIiwgcmV0KTsKIAkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCQl9Ci0JfSBlbHNlIGlmICghKHN0cm5jbXAobmFtZSwgImxvb3BiYWNrIiwgOCkpKSB7CisJfSBlbHNlIGlmICghc3RybmNtcChuYW1lLCAibG9vcGJhY2siLCA4KSkgewogCQkvKgogCQkgKiBBdXRvbWF0aWNhbGx5IGxvYWQgdGhlIHRjbV9sb29wIGZhYnJpYyBtb2R1bGUgd2hlbiB0aGUKIAkJICogZm9sbG93aW5nIGlzIGNhbGxlZDoKQEAgLTE2MiwyNSArMTcyLDI1IEBACiAJCSAqLwogCQlyZXQgPSByZXF1ZXN0X21vZHVsZSgidGNtX2xvb3AiKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAicmVxdWVzdF9tb2R1bGUoKSBmYWlsZWQgZm9yIgorCQkJcHJfZXJyKCJyZXF1ZXN0X21vZHVsZSgpIGZhaWxlZCBmb3IiCiAJCQkJIiB0Y21fbG9vcC5rbzogJWRcbiIsIHJldCk7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkJfQogCX0KIAogCXRmID0gdGFyZ2V0X2NvcmVfZ2V0X2ZhYnJpYyhuYW1lKTsKLQlpZiAoISh0ZikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0YXJnZXRfY29yZV9nZXRfZmFicmljKCkgZmFpbGVkIGZvciAlc1xuIiwKKwlpZiAoIXRmKSB7CisJCXByX2VycigidGFyZ2V0X2NvcmVfZ2V0X2ZhYnJpYygpIGZhaWxlZCBmb3IgJXNcbiIsCiAJCQluYW1lKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQotCXByaW50ayhLRVJOX0lORk8gIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBSRUdJU1RFUiAtPiBMb2NhdGVkIGZhYnJpYzoiCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBSRUdJU1RFUiAtPiBMb2NhdGVkIGZhYnJpYzoiCiAJCQkiICVzXG4iLCB0Zi0+dGZfbmFtZSk7CiAJLyoKIAkgKiBPbiBhIHN1Y2Nlc3NmdWwgdGFyZ2V0X2NvcmVfZ2V0X2ZhYnJpYygpIGxvb2ssIHRoZSByZXR1cm5lZAogCSAqIHN0cnVjdCB0YXJnZXRfZmFicmljX2NvbmZpZ2ZzICp0ZiB3aWxsIGNvbnRhaW4gYSB1c2FnZSByZWZlcmVuY2UuCiAJICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IFJFR0lTVEVSIHRmY193d25fY2l0IC0+ICVwXG4iLAorCXByX2RlYnVnKCJUYXJnZXRfQ29yZV9Db25maWdGUzogUkVHSVNURVIgdGZjX3d3bl9jaXQgLT4gJXBcbiIsCiAJCQkmVEZfQ0lUX1RNUEwodGYpLT50ZmNfd3duX2NpdCk7CiAKIAl0Zi0+dGZfZ3JvdXAuZGVmYXVsdF9ncm91cHMgPSB0Zi0+dGZfZGVmYXVsdF9ncm91cHM7CkBAIC0xOTIsMTQgKzIwMiwxNCBAQAogCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmdGYtPnRmX2Rpc2NfZ3JvdXAsICJkaXNjb3ZlcnlfYXV0aCIsCiAJCQkmVEZfQ0lUX1RNUEwodGYpLT50ZmNfZGlzY292ZXJ5X2NpdCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUYXJnZXRfQ29yZV9Db25maWdGUzogUkVHSVNURVIgLT4gQWxsb2NhdGVkIEZhYnJpYzoiCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBSRUdJU1RFUiAtPiBBbGxvY2F0ZWQgRmFicmljOiIKIAkJCSIgJXNcbiIsIHRmLT50Zl9ncm91cC5jZ19pdGVtLmNpX25hbWUpOwogCS8qCiAJICogU2V0dXAgdGZfb3BzLnRmX3N1YnN5cyBwb2ludGVyIGZvciB1c2FnZSB3aXRoIGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKCkKIAkgKi8KIAl0Zi0+dGZfb3BzLnRmX3N1YnN5cyA9IHRmLT50Zl9zdWJzeXM7CiAJdGYtPnRmX2ZhYnJpYyA9ICZ0Zi0+dGZfZ3JvdXAuY2dfaXRlbTsKLQlwcmludGsoS0VSTl9JTkZPICJUYXJnZXRfQ29yZV9Db25maWdGUzogUkVHSVNURVIgLT4gU2V0IHRmLT50Zl9mYWJyaWMiCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBSRUdJU1RFUiAtPiBTZXQgdGYtPnRmX2ZhYnJpYyIKIAkJCSIgZm9yICVzXG4iLCBuYW1lKTsKIAogCXJldHVybiAmdGYtPnRmX2dyb3VwOwpAQCAtMjE4LDE4ICsyMjgsMTggQEAKIAlzdHJ1Y3QgY29uZmlnX2l0ZW0gKmRmX2l0ZW07CiAJaW50IGk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUYXJnZXRfQ29yZV9Db25maWdGUzogREVSRUdJU1RFUiAtPiBMb29raW5nIHVwICVzIGluIgorCXByX2RlYnVnKCJUYXJnZXRfQ29yZV9Db25maWdGUzogREVSRUdJU1RFUiAtPiBMb29raW5nIHVwICVzIGluIgogCQkiIHRmIGxpc3RcbiIsIGNvbmZpZ19pdGVtX25hbWUoaXRlbSkpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IERFUkVHSVNURVIgLT4gbG9jYXRlZCBmYWJyaWM6IgorCXByX2RlYnVnKCJUYXJnZXRfQ29yZV9Db25maWdGUzogREVSRUdJU1RFUiAtPiBsb2NhdGVkIGZhYnJpYzoiCiAJCQkiICVzXG4iLCB0Zi0+dGZfbmFtZSk7CiAJYXRvbWljX2RlYygmdGYtPnRmX2FjY2Vzc19jbnQpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IERFUkVHSVNURVIgLT4gUmVsZWFzaW5nIgorCXByX2RlYnVnKCJUYXJnZXRfQ29yZV9Db25maWdGUzogREVSRUdJU1RFUiAtPiBSZWxlYXNpbmciCiAJCQkiIHRmLT50Zl9mYWJyaWMgZm9yICVzXG4iLCB0Zi0+dGZfbmFtZSk7CiAJdGYtPnRmX2ZhYnJpYyA9IE5VTEw7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUYXJnZXRfQ29yZV9Db25maWdGUzogREVSRUdJU1RFUiAtPiBSZWxlYXNpbmcgY2kiCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBERVJFR0lTVEVSIC0+IFJlbGVhc2luZyBjaSIKIAkJCSIgJXNcbiIsIGNvbmZpZ19pdGVtX25hbWUoaXRlbSkpOwogCiAJdGZfZ3JvdXAgPSAmdGYtPnRmX2dyb3VwOwpAQCAtMjk2LDIyICszMDYsMTggQEAKIHsKIAlzdHJ1Y3QgdGFyZ2V0X2ZhYnJpY19jb25maWdmcyAqdGY7CiAKLQlpZiAoIShmYWJyaWNfbW9kKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3Npbmcgc3RydWN0IG1vZHVsZSAqZmFicmljX21vZCBwb2ludGVyXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQogCWlmICghKG5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvY2F0ZSBwYXNzZWQgZmFicmljIG5hbWVcbiIpOwotCQlyZXR1cm4gTlVMTDsKKwkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlIHBhc3NlZCBmYWJyaWMgbmFtZVxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KLQlpZiAoc3RybGVuKG5hbWUpID4gVEFSR0VUX0ZBQlJJQ19OQU1FX1NJWkUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQYXNzZWQgbmFtZTogJXMgZXhjZWVkcyBUQVJHRVRfRkFCUklDIgorCWlmIChzdHJsZW4obmFtZSkgPj0gVEFSR0VUX0ZBQlJJQ19OQU1FX1NJWkUpIHsKKwkJcHJfZXJyKCJQYXNzZWQgbmFtZTogJXMgZXhjZWVkcyBUQVJHRVRfRkFCUklDIgogCQkJIl9OQU1FX1NJWkVcbiIsIG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCiAJdGYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGFyZ2V0X2ZhYnJpY19jb25maWdmcyksIEdGUF9LRVJORUwpOwotCWlmICghKHRmKSkKKwlpZiAoIXRmKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCUlOSVRfTElTVF9IRUFEKCZ0Zi0+dGZfbGlzdCk7CkBAIC0zMzAsOSArMzM2LDkgQEAKIAlsaXN0X2FkZF90YWlsKCZ0Zi0+dGZfbGlzdCwgJmdfdGZfbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZnX3RmX2xvY2spOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiPDw8PDw8PDw8PDw8PDw8PDw8PDw8PCBCRUdJTiBGQUJSSUMgQVBJID4+Pj4+Pj4+IgorCXByX2RlYnVnKCI8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IEJFR0lOIEZBQlJJQyBBUEkgPj4+Pj4+Pj4iCiAJCQkiPj4+Pj4+Pj4+Pj4+Pj5cbiIpOwotCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemVkIHN0cnVjdCB0YXJnZXRfZmFicmljX2NvbmZpZ2ZzOiAlcCBmb3IiCisJcHJfZGVidWcoIkluaXRpYWxpemVkIHN0cnVjdCB0YXJnZXRfZmFicmljX2NvbmZpZ2ZzOiAlcCBmb3IiCiAJCQkiICVzXG4iLCB0ZiwgdGYtPnRmX25hbWUpOwogCXJldHVybiB0ZjsKIH0KQEAgLTM2MSwxNDAgKzM2NywxMzIgQEAKIHsKIAlzdHJ1Y3QgdGFyZ2V0X2NvcmVfZmFicmljX29wcyAqdGZvID0gJnRmLT50Zl9vcHM7CiAKLQlpZiAoISh0Zm8tPmdldF9mYWJyaWNfbmFtZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+Z2V0X2ZhYnJpY19uYW1lKClcbiIpOworCWlmICghdGZvLT5nZXRfZmFicmljX25hbWUpIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHRmby0+Z2V0X2ZhYnJpY19uYW1lKClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEodGZvLT5nZXRfZmFicmljX3Byb3RvX2lkZW50KSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT5nZXRfZmFicmljX3Byb3RvX2lkZW50KClcbiIpOworCWlmICghdGZvLT5nZXRfZmFicmljX3Byb3RvX2lkZW50KSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPmdldF9mYWJyaWNfcHJvdG9faWRlbnQoKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPnRwZ19nZXRfd3duKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT50cGdfZ2V0X3d3bigpXG4iKTsKKwlpZiAoIXRmby0+dHBnX2dldF93d24pIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHRmby0+dHBnX2dldF93d24oKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPnRwZ19nZXRfdGFnKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT50cGdfZ2V0X3RhZygpXG4iKTsKKwlpZiAoIXRmby0+dHBnX2dldF90YWcpIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHRmby0+dHBnX2dldF90YWcoKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPnRwZ19nZXRfZGVmYXVsdF9kZXB0aCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+dHBnX2dldF9kZWZhdWx0X2RlcHRoKClcbiIpOworCWlmICghdGZvLT50cGdfZ2V0X2RlZmF1bHRfZGVwdGgpIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHRmby0+dHBnX2dldF9kZWZhdWx0X2RlcHRoKClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEodGZvLT50cGdfZ2V0X3ByX3RyYW5zcG9ydF9pZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+dHBnX2dldF9wcl90cmFuc3BvcnRfaWQoKVxuIik7CisJaWYgKCF0Zm8tPnRwZ19nZXRfcHJfdHJhbnNwb3J0X2lkKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPnRwZ19nZXRfcHJfdHJhbnNwb3J0X2lkKClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEodGZvLT50cGdfZ2V0X3ByX3RyYW5zcG9ydF9pZF9sZW4pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWlzc2luZyB0Zm8tPnRwZ19nZXRfcHJfdHJhbnNwb3J0X2lkX2xlbigpXG4iKTsKKwlpZiAoIXRmby0+dHBnX2dldF9wcl90cmFuc3BvcnRfaWRfbGVuKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPnRwZ19nZXRfcHJfdHJhbnNwb3J0X2lkX2xlbigpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHRmby0+dHBnX2NoZWNrX2RlbW9fbW9kZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+dHBnX2NoZWNrX2RlbW9fbW9kZSgpXG4iKTsKKwlpZiAoIXRmby0+dHBnX2NoZWNrX2RlbW9fbW9kZSkgeworCQlwcl9lcnIoIk1pc3NpbmcgdGZvLT50cGdfY2hlY2tfZGVtb19tb2RlKClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEodGZvLT50cGdfY2hlY2tfZGVtb19tb2RlX2NhY2hlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT50cGdfY2hlY2tfZGVtb19tb2RlX2NhY2hlKClcbiIpOworCWlmICghdGZvLT50cGdfY2hlY2tfZGVtb19tb2RlX2NhY2hlKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPnRwZ19jaGVja19kZW1vX21vZGVfY2FjaGUoKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPnRwZ19jaGVja19kZW1vX21vZGVfd3JpdGVfcHJvdGVjdCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+dHBnX2NoZWNrX2RlbW9fbW9kZV93cml0ZV9wcm90ZWN0KClcbiIpOworCWlmICghdGZvLT50cGdfY2hlY2tfZGVtb19tb2RlX3dyaXRlX3Byb3RlY3QpIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHRmby0+dHBnX2NoZWNrX2RlbW9fbW9kZV93cml0ZV9wcm90ZWN0KClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEodGZvLT50cGdfY2hlY2tfcHJvZF9tb2RlX3dyaXRlX3Byb3RlY3QpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWlzc2luZyB0Zm8tPnRwZ19jaGVja19wcm9kX21vZGVfd3JpdGVfcHJvdGVjdCgpXG4iKTsKKwlpZiAoIXRmby0+dHBnX2NoZWNrX3Byb2RfbW9kZV93cml0ZV9wcm90ZWN0KSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPnRwZ19jaGVja19wcm9kX21vZGVfd3JpdGVfcHJvdGVjdCgpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHRmby0+dHBnX2FsbG9jX2ZhYnJpY19hY2wpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWlzc2luZyB0Zm8tPnRwZ19hbGxvY19mYWJyaWNfYWNsKClcbiIpOworCWlmICghdGZvLT50cGdfYWxsb2NfZmFicmljX2FjbCkgeworCQlwcl9lcnIoIk1pc3NpbmcgdGZvLT50cGdfYWxsb2NfZmFicmljX2FjbCgpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHRmby0+dHBnX3JlbGVhc2VfZmFicmljX2FjbCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+dHBnX3JlbGVhc2VfZmFicmljX2FjbCgpXG4iKTsKKwlpZiAoIXRmby0+dHBnX3JlbGVhc2VfZmFicmljX2FjbCkgeworCQlwcl9lcnIoIk1pc3NpbmcgdGZvLT50cGdfcmVsZWFzZV9mYWJyaWNfYWNsKClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEodGZvLT50cGdfZ2V0X2luc3RfaW5kZXgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWlzc2luZyB0Zm8tPnRwZ19nZXRfaW5zdF9pbmRleCgpXG4iKTsKKwlpZiAoIXRmby0+dHBnX2dldF9pbnN0X2luZGV4KSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPnRwZ19nZXRfaW5zdF9pbmRleCgpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHRmby0+cmVsZWFzZV9jbWRfdG9fcG9vbCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+cmVsZWFzZV9jbWRfdG9fcG9vbCgpXG4iKTsKKwlpZiAoIXRmby0+cmVsZWFzZV9jbWQpIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHRmby0+cmVsZWFzZV9jbWQoKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPnJlbGVhc2VfY21kX2RpcmVjdCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+cmVsZWFzZV9jbWRfZGlyZWN0KClcbiIpOworCWlmICghdGZvLT5zaHV0ZG93bl9zZXNzaW9uKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPnNodXRkb3duX3Nlc3Npb24oKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPnNodXRkb3duX3Nlc3Npb24pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWlzc2luZyB0Zm8tPnNodXRkb3duX3Nlc3Npb24oKVxuIik7CisJaWYgKCF0Zm8tPmNsb3NlX3Nlc3Npb24pIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHRmby0+Y2xvc2Vfc2Vzc2lvbigpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHRmby0+Y2xvc2Vfc2Vzc2lvbikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+Y2xvc2Vfc2Vzc2lvbigpXG4iKTsKKwlpZiAoIXRmby0+c3RvcF9zZXNzaW9uKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPnN0b3Bfc2Vzc2lvbigpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHRmby0+c3RvcF9zZXNzaW9uKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT5zdG9wX3Nlc3Npb24oKVxuIik7CisJaWYgKCF0Zm8tPmZhbGxfYmFja190b19lcmwwKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPmZhbGxfYmFja190b19lcmwwKClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEodGZvLT5mYWxsX2JhY2tfdG9fZXJsMCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+ZmFsbF9iYWNrX3RvX2VybDAoKVxuIik7CisJaWYgKCF0Zm8tPnNlc3NfbG9nZ2VkX2luKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPnNlc3NfbG9nZ2VkX2luKClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEodGZvLT5zZXNzX2xvZ2dlZF9pbikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+c2Vzc19sb2dnZWRfaW4oKVxuIik7CisJaWYgKCF0Zm8tPnNlc3NfZ2V0X2luZGV4KSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPnNlc3NfZ2V0X2luZGV4KClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEodGZvLT5zZXNzX2dldF9pbmRleCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+c2Vzc19nZXRfaW5kZXgoKVxuIik7CisJaWYgKCF0Zm8tPndyaXRlX3BlbmRpbmcpIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHRmby0+d3JpdGVfcGVuZGluZygpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHRmby0+d3JpdGVfcGVuZGluZykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+d3JpdGVfcGVuZGluZygpXG4iKTsKKwlpZiAoIXRmby0+d3JpdGVfcGVuZGluZ19zdGF0dXMpIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHRmby0+d3JpdGVfcGVuZGluZ19zdGF0dXMoKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPndyaXRlX3BlbmRpbmdfc3RhdHVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT53cml0ZV9wZW5kaW5nX3N0YXR1cygpXG4iKTsKKwlpZiAoIXRmby0+c2V0X2RlZmF1bHRfbm9kZV9hdHRyaWJ1dGVzKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPnNldF9kZWZhdWx0X25vZGVfYXR0cmlidXRlcygpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHRmby0+c2V0X2RlZmF1bHRfbm9kZV9hdHRyaWJ1dGVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT5zZXRfZGVmYXVsdF9ub2RlX2F0dHJpYnV0ZXMoKVxuIik7CisJaWYgKCF0Zm8tPmdldF90YXNrX3RhZykgeworCQlwcl9lcnIoIk1pc3NpbmcgdGZvLT5nZXRfdGFza190YWcoKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPmdldF90YXNrX3RhZykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+Z2V0X3Rhc2tfdGFnKClcbiIpOworCWlmICghdGZvLT5nZXRfY21kX3N0YXRlKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPmdldF9jbWRfc3RhdGUoKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPmdldF9jbWRfc3RhdGUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWlzc2luZyB0Zm8tPmdldF9jbWRfc3RhdGUoKVxuIik7CisJaWYgKCF0Zm8tPnF1ZXVlX2RhdGFfaW4pIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHRmby0+cXVldWVfZGF0YV9pbigpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHRmby0+bmV3X2NtZF9mYWlsdXJlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT5uZXdfY21kX2ZhaWx1cmUoKVxuIik7CisJaWYgKCF0Zm8tPnF1ZXVlX3N0YXR1cykgeworCQlwcl9lcnIoIk1pc3NpbmcgdGZvLT5xdWV1ZV9zdGF0dXMoKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPnF1ZXVlX2RhdGFfaW4pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWlzc2luZyB0Zm8tPnF1ZXVlX2RhdGFfaW4oKVxuIik7CisJaWYgKCF0Zm8tPnF1ZXVlX3RtX3JzcCkgeworCQlwcl9lcnIoIk1pc3NpbmcgdGZvLT5xdWV1ZV90bV9yc3AoKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPnF1ZXVlX3N0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+cXVldWVfc3RhdHVzKClcbiIpOworCWlmICghdGZvLT5zZXRfZmFicmljX3NlbnNlX2xlbikgeworCQlwcl9lcnIoIk1pc3NpbmcgdGZvLT5zZXRfZmFicmljX3NlbnNlX2xlbigpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHRmby0+cXVldWVfdG1fcnNwKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT5xdWV1ZV90bV9yc3AoKVxuIik7CisJaWYgKCF0Zm8tPmdldF9mYWJyaWNfc2Vuc2VfbGVuKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPmdldF9mYWJyaWNfc2Vuc2VfbGVuKClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEodGZvLT5zZXRfZmFicmljX3NlbnNlX2xlbikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+c2V0X2ZhYnJpY19zZW5zZV9sZW4oKVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoISh0Zm8tPmdldF9mYWJyaWNfc2Vuc2VfbGVuKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT5nZXRfZmFicmljX3NlbnNlX2xlbigpXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICghKHRmby0+aXNfc3RhdGVfcmVtb3ZlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT5pc19zdGF0ZV9yZW1vdmUoKVxuIik7CisJaWYgKCF0Zm8tPmlzX3N0YXRlX3JlbW92ZSkgeworCQlwcl9lcnIoIk1pc3NpbmcgdGZvLT5pc19zdGF0ZV9yZW1vdmUoKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKgpAQCAtNTAyLDIwICs1MDAsMjAgQEAKIAkgKiB0Zm8tPmZhYnJpY19tYWtlX3RwZygpIGFuZCB0Zm8tPmZhYnJpY19kcm9wX3RwZygpIGluCiAJICogdGFyZ2V0X2NvcmVfZmFicmljX2NvbmZpZ2ZzLmMgV1dOK1RQRyBncm91cCBjb250ZXh0IGNvZGUuCiAJICovCi0JaWYgKCEodGZvLT5mYWJyaWNfbWFrZV93d24pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWlzc2luZyB0Zm8tPmZhYnJpY19tYWtlX3d3bigpXG4iKTsKKwlpZiAoIXRmby0+ZmFicmljX21ha2Vfd3duKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPmZhYnJpY19tYWtlX3d3bigpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHRmby0+ZmFicmljX2Ryb3Bfd3duKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1pc3NpbmcgdGZvLT5mYWJyaWNfZHJvcF93d24oKVxuIik7CisJaWYgKCF0Zm8tPmZhYnJpY19kcm9wX3d3bikgeworCQlwcl9lcnIoIk1pc3NpbmcgdGZvLT5mYWJyaWNfZHJvcF93d24oKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zm8tPmZhYnJpY19tYWtlX3RwZykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIHRmby0+ZmFicmljX21ha2VfdHBnKClcbiIpOworCWlmICghdGZvLT5mYWJyaWNfbWFrZV90cGcpIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHRmby0+ZmFicmljX21ha2VfdHBnKClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEodGZvLT5mYWJyaWNfZHJvcF90cGcpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWlzc2luZyB0Zm8tPmZhYnJpY19kcm9wX3RwZygpXG4iKTsKKwlpZiAoIXRmby0+ZmFicmljX2Ryb3BfdHBnKSB7CisJCXByX2VycigiTWlzc2luZyB0Zm8tPmZhYnJpY19kcm9wX3RwZygpXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01MzMsMjIgKzUzMSwxNSBAQAogaW50IHRhcmdldF9mYWJyaWNfY29uZmlnZnNfcmVnaXN0ZXIoCiAJc3RydWN0IHRhcmdldF9mYWJyaWNfY29uZmlnZnMgKnRmKQogewotCXN0cnVjdCBjb25maWdfZ3JvdXAgKnN1X2dyb3VwOwogCWludCByZXQ7CiAKLQlpZiAoISh0ZikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIHRhcmdldF9mYWJyaWNfY29uZmlnZnMiCisJaWYgKCF0ZikgeworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgdGFyZ2V0X2ZhYnJpY19jb25maWdmcyIKIAkJCSIgcG9pbnRlclxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoISh0Zi0+dGZfc3Vic3lzKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byB0YXJnZXQgc3RydWN0IGNvbmZpZ19zdWJzeXN0ZW0iCi0JCQkiIHBvaW50ZXJcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0Jc3VfZ3JvdXAgPSAmdGYtPnRmX3N1YnN5cy0+c3VfZ3JvdXA7Ci0JaWYgKCEoc3VfZ3JvdXApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvY2F0ZSB0YXJnZXQgc3RydWN0IGNvbmZpZ19ncm91cCIKKwlpZiAoIXRmLT50Zl9zdWJzeXMpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gdGFyZ2V0IHN0cnVjdCBjb25maWdfc3Vic3lzdGVtIgogCQkJIiBwb2ludGVyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNTU2LDcgKzU0Nyw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICI8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IEVORCBGQUJSSUMgQVBJID4+Pj4+Pj4+Pj4+PiIKKwlwcl9kZWJ1ZygiPDw8PDw8PDw8PDw8PDw8PDw8PDw8PCBFTkQgRkFCUklDIEFQSSA+Pj4+Pj4+Pj4+Pj4iCiAJCSI+Pj4+Pj4+Pj4+XG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTU2NSw0OCArNTU2LDM5IEBACiB2b2lkIHRhcmdldF9mYWJyaWNfY29uZmlnZnNfZGVyZWdpc3RlcigKIAlzdHJ1Y3QgdGFyZ2V0X2ZhYnJpY19jb25maWdmcyAqdGYpCiB7Ci0Jc3RydWN0IGNvbmZpZ19ncm91cCAqc3VfZ3JvdXA7CiAJc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSAqc3U7CiAKLQlpZiAoISh0ZikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIHBhc3NlZCB0YXJnZXRfZmFicmljXyIKKwlpZiAoIXRmKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBwYXNzZWQgdGFyZ2V0X2ZhYnJpY18iCiAJCQkiY29uZmlnZnNcbiIpOwogCQlyZXR1cm47CiAJfQogCXN1ID0gdGYtPnRmX3N1YnN5czsKLQlpZiAoIShzdSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIHBhc3NlZCB0Zi0+dGZfc3Vic3lzIgorCWlmICghc3UpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlIHBhc3NlZCB0Zi0+dGZfc3Vic3lzIgogCQkJIiBwb2ludGVyXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlzdV9ncm91cCA9ICZ0Zi0+dGZfc3Vic3lzLT5zdV9ncm91cDsKLQlpZiAoIShzdV9ncm91cCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIHRhcmdldCBzdHJ1Y3QgY29uZmlnX2dyb3VwIgotCQkJIiBwb2ludGVyXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gIjw8PDw8PDw8PDw8PDw8PDw8PDw8PDwgQkVHSU4gRkFCUklDIEFQSSA+Pj4+Pj4+Pj4+IgorCXByX2RlYnVnKCI8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IEJFR0lOIEZBQlJJQyBBUEkgPj4+Pj4+Pj4+PiIKIAkJCSI+Pj4+Pj4+Pj4+Pj5cbiIpOwogCW11dGV4X2xvY2soJmdfdGZfbG9jayk7CiAJaWYgKGF0b21pY19yZWFkKCZ0Zi0+dGZfYWNjZXNzX2NudCkpIHsKIAkJbXV0ZXhfdW5sb2NrKCZnX3RmX2xvY2spOwotCQlwcmludGsoS0VSTl9FUlIgIk5vbiB6ZXJvIHRmLT50Zl9hY2Nlc3NfY250IGZvciBmYWJyaWMgJXNcbiIsCisJCXByX2VycigiTm9uIHplcm8gdGYtPnRmX2FjY2Vzc19jbnQgZm9yIGZhYnJpYyAlc1xuIiwKIAkJCXRmLT50Zl9uYW1lKTsKIAkJQlVHKCk7CiAJfQogCWxpc3RfZGVsKCZ0Zi0+dGZfbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZnX3RmX2xvY2spOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IERFUkVHSVNURVIgLT4gUmVsZWFzaW5nIHRmOiIKKwlwcl9kZWJ1ZygiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IERFUkVHSVNURVIgLT4gUmVsZWFzaW5nIHRmOiIKIAkJCSIgJXNcbiIsIHRmLT50Zl9uYW1lKTsKIAl0Zi0+dGZfbW9kdWxlID0gTlVMTDsKIAl0Zi0+dGZfc3Vic3lzID0gTlVMTDsKIAlrZnJlZSh0Zik7CiAKLQlwcmludGsoIjw8PDw8PDw8PDw8PDw8PDw8PDw8PDwgRU5EIEZBQlJJQyBBUEkgPj4+Pj4+Pj4+Pj4+Pj4+Pj4iCisJcHJfZGVidWcoIjw8PDw8PDw8PDw8PDw8PDw8PDw8PDwgRU5EIEZBQlJJQyBBUEkgPj4+Pj4+Pj4+Pj4+Pj4+Pj4iCiAJCQkiPj4+Pj5cbiIpOwotCXJldHVybjsKIH0KIEVYUE9SVF9TWU1CT0wodGFyZ2V0X2ZhYnJpY19jb25maWdmc19kZXJlZ2lzdGVyKTsKIApAQCAtNjI3LDExICs2MDksMTIgQEAKIAkJCQkJCQkJCVwKIAlzcGluX2xvY2soJnNlX2Rldi0+c2VfZGV2X2xvY2spOwkJCQlcCiAJZGV2ID0gc2VfZGV2LT5zZV9kZXZfcHRyOwkJCQkJXAotCWlmICghKGRldikpIHsJCQkJCQkJXAorCWlmICghZGV2KSB7CQkJCQkJCVwKIAkJc3Bpbl91bmxvY2soJnNlX2Rldi0+c2VfZGV2X2xvY2spOyAJCQlcCiAJCXJldHVybiAtRU5PREVWOwkJCQkJCVwKIAl9CQkJCQkJCQlcCi0JcmIgPSBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIldVxuIiwgKHUzMilERVZfQVRUUklCKGRldiktPl9uYW1lKTsgXAorCXJiID0gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXVcbiIsCQkJCVwKKwkJKHUzMilkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuX25hbWUpOwkJXAogCXNwaW5fdW5sb2NrKCZzZV9kZXYtPnNlX2Rldl9sb2NrKTsJCQkJXAogCQkJCQkJCQkJXAogCXJldHVybiByYjsJCQkJCQkJXApAQCAtNjUwLDE0ICs2MzMsMTQgQEAKIAkJCQkJCQkJCVwKIAlzcGluX2xvY2soJnNlX2Rldi0+c2VfZGV2X2xvY2spOwkJCQlcCiAJZGV2ID0gc2VfZGV2LT5zZV9kZXZfcHRyOwkJCQkJXAotCWlmICghKGRldikpIHsJCQkJCQkJXAorCWlmICghZGV2KSB7CQkJCQkJCVwKIAkJc3Bpbl91bmxvY2soJnNlX2Rldi0+c2VfZGV2X2xvY2spOwkJCVwKIAkJcmV0dXJuIC1FTk9ERVY7CQkJCQkJXAogCX0JCQkJCQkJCVwKIAlyZXQgPSBzdHJpY3Rfc3RydG91bChwYWdlLCAwLCAmdmFsKTsJCQkJXAogCWlmIChyZXQgPCAwKSB7CQkJCQkJCVwKIAkJc3Bpbl91bmxvY2soJnNlX2Rldi0+c2VfZGV2X2xvY2spOyAgICAgICAgICAgICAgICAgICAgICBcCi0JCXByaW50ayhLRVJOX0VSUiAic3RyaWN0X3N0cnRvdWwoKSBmYWlsZWQgd2l0aCIJCVwKKwkJcHJfZXJyKCJzdHJpY3Rfc3RydG91bCgpIGZhaWxlZCB3aXRoIgkJXAogCQkJIiByZXQ6ICVkXG4iLCByZXQpOwkJCQlcCiAJCXJldHVybiAtRUlOVkFMOwkJCQkJCVwKIAl9CQkJCQkJCQlcCkBAIC03MTUsNiArNjk4LDEyIEBACiBERUZfREVWX0FUVFJJQihlbmZvcmNlX3ByX2lzaWRzKTsKIFNFX0RFVl9BVFRSKGVuZm9yY2VfcHJfaXNpZHMsIFNfSVJVR08gfCBTX0lXVVNSKTsKIAorREVGX0RFVl9BVFRSSUIoaXNfbm9ucm90KTsKK1NFX0RFVl9BVFRSKGlzX25vbnJvdCwgU19JUlVHTyB8IFNfSVdVU1IpOworCitERUZfREVWX0FUVFJJQihlbXVsYXRlX3Jlc3RfcmVvcmQpOworU0VfREVWX0FUVFIoZW11bGF0ZV9yZXN0X3Jlb3JkLCBTX0lSVUdPIHwgU19JV1VTUik7CisKIERFRl9ERVZfQVRUUklCX1JPKGh3X2Jsb2NrX3NpemUpOwogU0VfREVWX0FUVFJfUk8oaHdfYmxvY2tfc2l6ZSk7CiAKQEAgLTc2Myw2ICs3NTIsOCBAQAogCSZ0YXJnZXRfY29yZV9kZXZfYXR0cmliX2VtdWxhdGVfdHB1LmF0dHIsCiAJJnRhcmdldF9jb3JlX2Rldl9hdHRyaWJfZW11bGF0ZV90cHdzLmF0dHIsCiAJJnRhcmdldF9jb3JlX2Rldl9hdHRyaWJfZW5mb3JjZV9wcl9pc2lkcy5hdHRyLAorCSZ0YXJnZXRfY29yZV9kZXZfYXR0cmliX2lzX25vbnJvdC5hdHRyLAorCSZ0YXJnZXRfY29yZV9kZXZfYXR0cmliX2VtdWxhdGVfcmVzdF9yZW9yZC5hdHRyLAogCSZ0YXJnZXRfY29yZV9kZXZfYXR0cmliX2h3X2Jsb2NrX3NpemUuYXR0ciwKIAkmdGFyZ2V0X2NvcmVfZGV2X2F0dHJpYl9ibG9ja19zaXplLmF0dHIsCiAJJnRhcmdldF9jb3JlX2Rldl9hdHRyaWJfaHdfbWF4X3NlY3RvcnMuYXR0ciwKQEAgLTgxOSw3ICs4MTAsNyBAQAogCXN0cnVjdCBzZV9kZXZpY2UgKmRldjsKIAogCWRldiA9IHNlX2Rldi0+c2VfZGV2X3B0cjsKLQlpZiAoIShkZXYpKQorCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldHVybiBzcHJpbnRmKHBhZ2UsICJUMTAgVlBEIFVuaXQgU2VyaWFsIE51bWJlcjogJXNcbiIsCkBAIC04NDYsMTMgKzgzNywxMyBAQAogCSAqIFZQRCBVbml0IFNlcmlhbCBOdW1iZXIgdGhhdCBPUyBkZXBlbmRlbnQgbXVsdGlwYXRoIGNhbiBkZXBlbmQgb24uCiAJICovCiAJaWYgKHN1X2Rldi0+c3VfZGV2X2ZsYWdzICYgU0RGX0ZJUk1XQVJFX1ZQRF9VTklUX1NFUklBTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuZGVybHlpbmcgU0NTSSBkZXZpY2UgZmlybXdhcmUgcHJvdmlkZWQgVlBEIgorCQlwcl9lcnIoIlVuZGVybHlpbmcgU0NTSSBkZXZpY2UgZmlybXdhcmUgcHJvdmlkZWQgVlBEIgogCQkJIiBVbml0IFNlcmlhbCwgaWdub3JpbmcgcmVxdWVzdFxuIik7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQlpZiAoKHN0cmxlbihwYWdlKSArIDEpID4gSU5RVUlSWV9WUERfU0VSSUFMX0xFTikgewotCQlwcmludGsoS0VSTl9FUlIgIkVtdWxhdGVkIFZQRCBVbml0IFNlcmlhbCBleGNlZWRzIgorCWlmIChzdHJsZW4ocGFnZSkgPj0gSU5RVUlSWV9WUERfU0VSSUFMX0xFTikgeworCQlwcl9lcnIoIkVtdWxhdGVkIFZQRCBVbml0IFNlcmlhbCBleGNlZWRzIgogCQkiIElOUVVJUllfVlBEX1NFUklBTF9MRU46ICVkXG4iLCBJTlFVSVJZX1ZQRF9TRVJJQUxfTEVOKTsKIAkJcmV0dXJuIC1FT1ZFUkZMT1c7CiAJfQpAQCAtODYzLDkgKzg1NCw5IEBACiAJICogY291bGQgY2F1c2UgbmVnYXRpdmUgZWZmZWN0cy4KIAkgKi8KIAlkZXYgPSBzdV9kZXYtPnNlX2Rldl9wdHI7Ci0JaWYgKChkZXYpKSB7CisJaWYgKGRldikgewogCQlpZiAoYXRvbWljX3JlYWQoJmRldi0+ZGV2X2V4cG9ydF9vYmoub2JqX2FjY2Vzc19jb3VudCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHNldCBWUEQgVW5pdCBTZXJpYWwgd2hpbGUiCisJCQlwcl9lcnIoIlVuYWJsZSB0byBzZXQgVlBEIFVuaXQgU2VyaWFsIHdoaWxlIgogCQkJCSIgYWN0aXZlICVkICRGQUJSSUNfTU9EIGV4cG9ydHMgZXhpc3RcbiIsCiAJCQkJYXRvbWljX3JlYWQoJmRldi0+ZGV2X2V4cG9ydF9vYmoub2JqX2FjY2Vzc19jb3VudCkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC04ODMsNyArODc0LDcgQEAKIAkJCSIlcyIsIHN0cnN0cmlwKGJ1ZikpOwogCXN1X2Rldi0+c3VfZGV2X2ZsYWdzIHw9IFNERl9FTVVMQVRFRF9WUERfVU5JVF9TRVJJQUw7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUYXJnZXRfQ29yZV9Db25maWdGUzogU2V0IGVtdWxhdGVkIFZQRCBVbml0IFNlcmlhbDoiCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBTZXQgZW11bGF0ZWQgVlBEIFVuaXQgU2VyaWFsOiIKIAkJCSIgJXNcbiIsIHN1X2Rldi0+dDEwX3d3bi51bml0X3NlcmlhbCk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC05MDUsMTkgKzg5NiwxOSBAQAogCXNzaXplX3QgbGVuID0gMDsKIAogCWRldiA9IHNlX2Rldi0+c2VfZGV2X3B0cjsKLQlpZiAoIShkZXYpKQorCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCW1lbXNldChidWYsIDAsIFZQRF9UTVBfQlVGX1NJWkUpOwogCiAJc3Bpbl9sb2NrKCZ0MTBfd3duLT50MTBfdnBkX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodnBkLCAmdDEwX3d3bi0+dDEwX3ZwZF9saXN0LCB2cGRfbGlzdCkgewotCQlpZiAoISh2cGQtPnByb3RvY29sX2lkZW50aWZpZXJfc2V0KSkKKwkJaWYgKCF2cGQtPnByb3RvY29sX2lkZW50aWZpZXJfc2V0KQogCQkJY29udGludWU7CiAKIAkJdHJhbnNwb3J0X2R1bXBfdnBkX3Byb3RvX2lkKHZwZCwgYnVmLCBWUERfVE1QX0JVRl9TSVpFKTsKIAotCQlpZiAoKGxlbiArIHN0cmxlbihidWYpID4gUEFHRV9TSVpFKSkKKwkJaWYgKGxlbiArIHN0cmxlbihidWYpID49IFBBR0VfU0laRSkKIAkJCWJyZWFrOwogCiAJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJXMiLCBidWYpOwpAQCAtOTUyLDcgKzk0Myw3IEBACiAJc3NpemVfdCBsZW4gPSAwOwkJCQkJCVwKIAkJCQkJCQkJCVwKIAlkZXYgPSBzZV9kZXYtPnNlX2Rldl9wdHI7CQkJCQlcCi0JaWYgKCEoZGV2KSkJCQkJCQkJXAorCWlmICghZGV2KQkJCQkJCQlcCiAJCXJldHVybiAtRU5PREVWOwkJCQkJCVwKIAkJCQkJCQkJCVwKIAlzcGluX2xvY2soJnQxMF93d24tPnQxMF92cGRfbG9jayk7CQkJCVwKQEAgLTk2MiwxOSArOTUzLDE5IEBACiAJCQkJCQkJCQlcCiAJCW1lbXNldChidWYsIDAsIFZQRF9UTVBfQlVGX1NJWkUpOwkJCVwKIAkJdHJhbnNwb3J0X2R1bXBfdnBkX2Fzc29jKHZwZCwgYnVmLCBWUERfVE1QX0JVRl9TSVpFKTsJXAotCQlpZiAoKGxlbiArIHN0cmxlbihidWYpID4gUEFHRV9TSVpFKSkJCQlcCisJCWlmIChsZW4gKyBzdHJsZW4oYnVmKSA+PSBQQUdFX1NJWkUpCQkJXAogCQkJYnJlYWs7CQkJCQkJXAogCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiVzIiwgYnVmKTsJCQlcCiAJCQkJCQkJCQlcCiAJCW1lbXNldChidWYsIDAsIFZQRF9UTVBfQlVGX1NJWkUpOwkJCVwKIAkJdHJhbnNwb3J0X2R1bXBfdnBkX2lkZW50X3R5cGUodnBkLCBidWYsIFZQRF9UTVBfQlVGX1NJWkUpOyBcCi0JCWlmICgobGVuICsgc3RybGVuKGJ1ZikgPiBQQUdFX1NJWkUpKQkJCVwKKwkJaWYgKGxlbiArIHN0cmxlbihidWYpID49IFBBR0VfU0laRSkJCQlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJXMiLCBidWYpOwkJCVwKIAkJCQkJCQkJCVwKIAkJbWVtc2V0KGJ1ZiwgMCwgVlBEX1RNUF9CVUZfU0laRSk7CQkJXAogCQl0cmFuc3BvcnRfZHVtcF92cGRfaWRlbnQodnBkLCBidWYsIFZQRF9UTVBfQlVGX1NJWkUpOyBcCi0JCWlmICgobGVuICsgc3RybGVuKGJ1ZikgPiBQQUdFX1NJWkUpKQkJCVwKKwkJaWYgKGxlbiArIHN0cmxlbihidWYpID49IFBBR0VfU0laRSkJCQlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJXMiLCBidWYpOwkJCVwKIAl9CQkJCQkJCQlcCkBAIC05ODQsNyArOTc1LDcgQEAKIH0KIAogLyoKLSAqIFZQRCBwYWdlIDB4ODMgQXNzb2ljYXRpb246IExvZ2ljYWwgVW5pdAorICogVlBEIHBhZ2UgMHg4MyBBc3NvY2lhdGlvbjogTG9naWNhbCBVbml0CiAgKi8KIERFRl9ERVZfV1dOX0FTU09DX1NIT1codnBkX2Fzc29jX2xvZ2ljYWxfdW5pdCwgMHgwMCk7CiAKQEAgLTEwODMsNyArMTA3NCw3IEBACiAKIAlzcGluX2xvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCXByX3JlZyA9IGRldi0+ZGV2X3ByX3Jlc19ob2xkZXI7Ci0JaWYgKCEocHJfcmVnKSkgeworCWlmICghcHJfcmVnKSB7CiAJCSpsZW4gKz0gc3ByaW50ZihwYWdlICsgKmxlbiwgIk5vIFNQQy0zIFJlc2VydmF0aW9uIGhvbGRlclxuIik7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAkJcmV0dXJuICpsZW47CkBAIC0xMDkzLDcgKzEwODQsNyBAQAogCQkJCVBSX1JFR19JU0lEX0lEX0xFTik7CiAKIAkqbGVuICs9IHNwcmludGYocGFnZSArICpsZW4sICJTUEMtMyBSZXNlcnZhdGlvbjogJXMgSW5pdGlhdG9yOiAlcyVzXG4iLAotCQlUUEdfVEZPKHNlX25hY2wtPnNlX3RwZyktPmdldF9mYWJyaWNfbmFtZSgpLAorCQlzZV9uYWNsLT5zZV90cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQlzZV9uYWNsLT5pbml0aWF0b3JuYW1lLCAocHJmX2lzaWQpID8gJmlfYnVmWzBdIDogIiIpOwogCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIApAQCAtMTEwOSwxMyArMTEwMCwxMyBAQAogCiAJc3Bpbl9sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAlzZV9uYWNsID0gZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2w7Ci0JaWYgKCEoc2VfbmFjbCkpIHsKKwlpZiAoIXNlX25hY2wpIHsKIAkJKmxlbiArPSBzcHJpbnRmKHBhZ2UgKyAqbGVuLCAiTm8gU1BDLTIgUmVzZXJ2YXRpb24gaG9sZGVyXG4iKTsKIAkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCQlyZXR1cm4gKmxlbjsKIAl9CiAJKmxlbiArPSBzcHJpbnRmKHBhZ2UgKyAqbGVuLCAiU1BDLTIgUmVzZXJ2YXRpb246ICVzIEluaXRpYXRvcjogJXNcbiIsCi0JCVRQR19URk8oc2VfbmFjbC0+c2VfdHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCXNlX25hY2wtPnNlX3RwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCiAJCXNlX25hY2wtPmluaXRpYXRvcm5hbWUpOwogCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIApAQCAtMTEyOCwxMCArMTExOSwxMCBAQAogewogCXNzaXplX3QgbGVuID0gMDsKIAotCWlmICghKHN1X2Rldi0+c2VfZGV2X3B0cikpCisJaWYgKCFzdV9kZXYtPnNlX2Rldl9wdHIpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3dpdGNoIChUMTBfUkVTKHN1X2RldiktPnJlc190eXBlKSB7CisJc3dpdGNoIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSkgewogCWNhc2UgU1BDM19QRVJTSVNURU5UX1JFU0VSVkFUSU9OUzoKIAkJdGFyZ2V0X2NvcmVfZGV2X3ByX3Nob3dfc3BjM19yZXMoc3VfZGV2LT5zZV9kZXZfcHRyLAogCQkJCXBhZ2UsICZsZW4pOwpAQCAtMTE2NSwxNSArMTE1NiwxNSBAQAogCXNzaXplX3QgbGVuID0gMDsKIAogCWRldiA9IHN1X2Rldi0+c2VfZGV2X3B0cjsKLQlpZiAoIShkZXYpKQorCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChUMTBfUkVTKHN1X2RldiktPnJlc190eXBlICE9IFNQQzNfUEVSU0lTVEVOVF9SRVNFUlZBVElPTlMpCisJaWYgKHN1X2Rldi0+dDEwX3ByLnJlc190eXBlICE9IFNQQzNfUEVSU0lTVEVOVF9SRVNFUlZBVElPTlMpCiAJCXJldHVybiBsZW47CiAKIAlzcGluX2xvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCXByX3JlZyA9IGRldi0+ZGV2X3ByX3Jlc19ob2xkZXI7Ci0JaWYgKCEocHJfcmVnKSkgeworCWlmICghcHJfcmVnKSB7CiAJCWxlbiA9IHNwcmludGYocGFnZSwgIk5vIFNQQy0zIFJlc2VydmF0aW9uIGhvbGRlclxuIik7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAkJcmV0dXJuIGxlbjsKQEAgLTEyMDIsMTMgKzExOTMsMTMgQEAKIAlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2LAogCWNoYXIgKnBhZ2UpCiB7Ci0JaWYgKCEoc3VfZGV2LT5zZV9kZXZfcHRyKSkKKwlpZiAoIXN1X2Rldi0+c2VfZGV2X3B0cikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoVDEwX1JFUyhzdV9kZXYpLT5yZXNfdHlwZSAhPSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQorCWlmIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSAhPSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBzcHJpbnRmKHBhZ2UsICIweCUwOHhcbiIsIFQxMF9SRVMoc3VfZGV2KS0+cHJfZ2VuZXJhdGlvbik7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIjB4JTA4eFxuIiwgc3VfZGV2LT50MTBfcHIucHJfZ2VuZXJhdGlvbik7CiB9CiAKIFNFX0RFVl9QUl9BVFRSX1JPKHJlc19wcl9nZW5lcmF0aW9uKTsKQEAgLTEyMjksMTUgKzEyMjAsMTUgQEAKIAlzc2l6ZV90IGxlbiA9IDA7CiAKIAlkZXYgPSBzdV9kZXYtPnNlX2Rldl9wdHI7Ci0JaWYgKCEoZGV2KSkKKwlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoVDEwX1JFUyhzdV9kZXYpLT5yZXNfdHlwZSAhPSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQorCWlmIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSAhPSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQogCQlyZXR1cm4gbGVuOwogCiAJc3Bpbl9sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAlwcl9yZWcgPSBkZXYtPmRldl9wcl9yZXNfaG9sZGVyOwotCWlmICghKHByX3JlZykpIHsKKwlpZiAoIXByX3JlZykgewogCQlsZW4gPSBzcHJpbnRmKHBhZ2UsICJObyBTUEMtMyBSZXNlcnZhdGlvbiBob2xkZXJcbiIpOwogCQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CiAJCXJldHVybiBsZW47CkBAIC0xMjQ1LDcgKzEyMzYsNyBAQAogCXNlX25hY2wgPSBwcl9yZWctPnByX3JlZ19uYWNsOwogCXNlX3RwZyA9IHNlX25hY2wtPnNlX3RwZzsKIAlsdW4gPSBwcl9yZWctPnByX3JlZ190Z19wdF9sdW47Ci0JdGZvID0gVFBHX1RGTyhzZV90cGcpOworCXRmbyA9IHNlX3RwZy0+c2VfdHBnX3RmbzsKIAogCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiU1BDLTMgUmVzZXJ2YXRpb246ICVzIgogCQkiIFRhcmdldCBOb2RlIEVuZHBvaW50OiAlc1xuIiwgdGZvLT5nZXRfZmFicmljX25hbWUoKSwKQEAgLTEyNzYsMTYgKzEyNjcsMTYgQEAKIAlzc2l6ZV90IGxlbiA9IDA7CiAJaW50IHJlZ19jb3VudCA9IDAsIHByZl9pc2lkOwogCi0JaWYgKCEoc3VfZGV2LT5zZV9kZXZfcHRyKSkKKwlpZiAoIXN1X2Rldi0+c2VfZGV2X3B0cikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoVDEwX1JFUyhzdV9kZXYpLT5yZXNfdHlwZSAhPSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQorCWlmIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSAhPSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQogCQlyZXR1cm4gbGVuOwogCiAJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJTUEMtMyBQUiBSZWdpc3RyYXRpb25zOlxuIik7CiAKLQlzcGluX2xvY2soJlQxMF9SRVMoc3VfZGV2KS0+cmVnaXN0cmF0aW9uX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocHJfcmVnLCAmVDEwX1JFUyhzdV9kZXYpLT5yZWdpc3RyYXRpb25fbGlzdCwKKwlzcGluX2xvY2soJnN1X2Rldi0+dDEwX3ByLnJlZ2lzdHJhdGlvbl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByX3JlZywgJnN1X2Rldi0+dDEwX3ByLnJlZ2lzdHJhdGlvbl9saXN0LAogCQkJcHJfcmVnX2xpc3QpIHsKIAogCQltZW1zZXQoYnVmLCAwLCAzODQpOwpAQCAtMTI5OSwxNSArMTI5MCwxNSBAQAogCQkJJmlfYnVmWzBdIDogIiIsIHByX3JlZy0+cHJfcmVzX2tleSwKIAkJCXByX3JlZy0+cHJfcmVzX2dlbmVyYXRpb24pOwogCi0JCWlmICgobGVuICsgc3RybGVuKGJ1ZikgPiBQQUdFX1NJWkUpKQorCQlpZiAobGVuICsgc3RybGVuKGJ1ZikgPj0gUEFHRV9TSVpFKQogCQkJYnJlYWs7CiAKIAkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlcyIsIGJ1Zik7CiAJCXJlZ19jb3VudCsrOwogCX0KLQlzcGluX3VubG9jaygmVDEwX1JFUyhzdV9kZXYpLT5yZWdpc3RyYXRpb25fbG9jayk7CisJc3Bpbl91bmxvY2soJnN1X2Rldi0+dDEwX3ByLnJlZ2lzdHJhdGlvbl9sb2NrKTsKIAotCWlmICghKHJlZ19jb3VudCkpCisJaWYgKCFyZWdfY291bnQpCiAJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiTm9uZVxuIik7CiAKIAlyZXR1cm4gbGVuOwpAQCAtMTMyNywxNSArMTMxOCwxNSBAQAogCXNzaXplX3QgbGVuID0gMDsKIAogCWRldiA9IHN1X2Rldi0+c2VfZGV2X3B0cjsKLQlpZiAoIShkZXYpKQorCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChUMTBfUkVTKHN1X2RldiktPnJlc190eXBlICE9IFNQQzNfUEVSU0lTVEVOVF9SRVNFUlZBVElPTlMpCisJaWYgKHN1X2Rldi0+dDEwX3ByLnJlc190eXBlICE9IFNQQzNfUEVSU0lTVEVOVF9SRVNFUlZBVElPTlMpCiAJCXJldHVybiBsZW47CiAKIAlzcGluX2xvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCXByX3JlZyA9IGRldi0+ZGV2X3ByX3Jlc19ob2xkZXI7Ci0JaWYgKCEocHJfcmVnKSkgeworCWlmICghcHJfcmVnKSB7CiAJCWxlbiA9IHNwcmludGYocGFnZSwgIk5vIFNQQy0zIFJlc2VydmF0aW9uIGhvbGRlclxuIik7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAkJcmV0dXJuIGxlbjsKQEAgLTEzNTgsMTAgKzEzNDksMTAgQEAKIHsKIAlzc2l6ZV90IGxlbiA9IDA7CiAKLQlpZiAoIShzdV9kZXYtPnNlX2Rldl9wdHIpKQorCWlmICghc3VfZGV2LT5zZV9kZXZfcHRyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXN3aXRjaCAoVDEwX1JFUyhzdV9kZXYpLT5yZXNfdHlwZSkgeworCXN3aXRjaCAoc3VfZGV2LT50MTBfcHIucmVzX3R5cGUpIHsKIAljYXNlIFNQQzNfUEVSU0lTVEVOVF9SRVNFUlZBVElPTlM6CiAJCWxlbiA9IHNwcmludGYocGFnZSwgIlNQQzNfUEVSU0lTVEVOVF9SRVNFUlZBVElPTlNcbiIpOwogCQlicmVhazsKQEAgLTEzODksMTQgKzEzODAsMTQgQEAKIAlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2LAogCWNoYXIgKnBhZ2UpCiB7Ci0JaWYgKCEoc3VfZGV2LT5zZV9kZXZfcHRyKSkKKwlpZiAoIXN1X2Rldi0+c2VfZGV2X3B0cikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoVDEwX1JFUyhzdV9kZXYpLT5yZXNfdHlwZSAhPSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQorCWlmIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSAhPSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzcHJpbnRmKHBhZ2UsICJBUFRQTCBCaXQgU3RhdHVzOiAlc1xuIiwKLQkJKFQxMF9SRVMoc3VfZGV2KS0+cHJfYXB0cGxfYWN0aXZlKSA/ICJBY3RpdmF0ZWQiIDogIkRpc2FibGVkIik7CisJCShzdV9kZXYtPnQxMF9wci5wcl9hcHRwbF9hY3RpdmUpID8gIkFjdGl2YXRlZCIgOiAiRGlzYWJsZWQiKTsKIH0KIAogU0VfREVWX1BSX0FUVFJfUk8ocmVzX2FwdHBsX2FjdGl2ZSk7CkBAIC0xNDA4LDEwICsxMzk5LDEwIEBACiAJc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKnN1X2RldiwKIAljaGFyICpwYWdlKQogewotCWlmICghKHN1X2Rldi0+c2VfZGV2X3B0cikpCisJaWYgKCFzdV9kZXYtPnNlX2Rldl9wdHIpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKFQxMF9SRVMoc3VfZGV2KS0+cmVzX3R5cGUgIT0gU1BDM19QRVJTSVNURU5UX1JFU0VSVkFUSU9OUykKKwlpZiAoc3VfZGV2LT50MTBfcHIucmVzX3R5cGUgIT0gU1BDM19QRVJTSVNURU5UX1JFU0VSVkFUSU9OUykKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gc3ByaW50ZihwYWdlLCAiUmVhZHkgdG8gcHJvY2VzcyBQUiBBUFRQTCBtZXRhZGF0YS4uXG4iKTsKQEAgLTE0NjAsMTQgKzE0NTEsMTQgQEAKIAl1OCB0eXBlID0gMCwgc2NvcGU7CiAKIAlkZXYgPSBzdV9kZXYtPnNlX2Rldl9wdHI7Ci0JaWYgKCEoZGV2KSkKKwlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoVDEwX1JFUyhzdV9kZXYpLT5yZXNfdHlwZSAhPSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQorCWlmIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSAhPSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQogCQlyZXR1cm4gMDsKIAogCWlmIChhdG9taWNfcmVhZCgmZGV2LT5kZXZfZXhwb3J0X29iai5vYmpfYWNjZXNzX2NvdW50KSkgewotCQlwcmludGsoS0VSTl9JTkZPICJVbmFibGUgdG8gcHJvY2VzcyBBUFRQTCBtZXRhZGF0YSB3aGlsZSIKKwkJcHJfZGVidWcoIlVuYWJsZSB0byBwcm9jZXNzIEFQVFBMIG1ldGFkYXRhIHdoaWxlIgogCQkJIiBhY3RpdmUgZmFicmljIGV4cG9ydHMgZXhpc3RcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNDk2LDggKzE0ODcsOCBAQAogCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlpZiAoc3RybGVuKGlfcG9ydCkgPiBQUl9BUFRQTF9NQVhfSVBPUlRfTEVOKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJBUFRQTCBtZXRhZGF0YSBpbml0aWF0b3Jfbm9kZT0iCisJCQlpZiAoc3RybGVuKGlfcG9ydCkgPj0gUFJfQVBUUExfTUFYX0lQT1JUX0xFTikgeworCQkJCXByX2VycigiQVBUUEwgbWV0YWRhdGEgaW5pdGlhdG9yX25vZGU9IgogCQkJCQkiIGV4Y2VlZHMgUFJfQVBUUExfTUFYX0lQT1JUX0xFTjogJWRcbiIsCiAJCQkJCVBSX0FQVFBMX01BWF9JUE9SVF9MRU4pOwogCQkJCXJldCA9IC1FSU5WQUw7CkBAIC0xNTEwLDggKzE1MDEsOCBAQAogCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlpZiAoc3RybGVuKGlzaWQpID4gUFJfUkVHX0lTSURfTEVOKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJBUFRQTCBtZXRhZGF0YSBpbml0aWF0b3JfaXNpZCIKKwkJCWlmIChzdHJsZW4oaXNpZCkgPj0gUFJfUkVHX0lTSURfTEVOKSB7CisJCQkJcHJfZXJyKCJBUFRQTCBtZXRhZGF0YSBpbml0aWF0b3JfaXNpZCIKIAkJCQkJIj0gZXhjZWVkcyBQUl9SRUdfSVNJRF9MRU46ICVkXG4iLAogCQkJCQlQUl9SRUdfSVNJRF9MRU4pOwogCQkJCXJldCA9IC1FSU5WQUw7CkBAIC0xNTI2LDcgKzE1MTcsNyBAQAogCQkJfQogCQkJcmV0ID0gc3RyaWN0X3N0cnRvdWxsKGFyZ19wLCAwLCAmdG1wX2xsKTsKIAkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJzdHJpY3Rfc3RydG91bGwoKSBmYWlsZWQgZm9yIgorCQkJCXByX2Vycigic3RyaWN0X3N0cnRvdWxsKCkgZmFpbGVkIGZvciIKIAkJCQkJIiBzYV9yZXNfa2V5PVxuIik7CiAJCQkJZ290byBvdXQ7CiAJCQl9CkBAIC0xNTcxLDggKzE1NjIsOCBAQAogCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlpZiAoc3RybGVuKHRfcG9ydCkgPiBQUl9BUFRQTF9NQVhfVFBPUlRfTEVOKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJBUFRQTCBtZXRhZGF0YSB0YXJnZXRfbm9kZT0iCisJCQlpZiAoc3RybGVuKHRfcG9ydCkgPj0gUFJfQVBUUExfTUFYX1RQT1JUX0xFTikgeworCQkJCXByX2VycigiQVBUUEwgbWV0YWRhdGEgdGFyZ2V0X25vZGU9IgogCQkJCQkiIGV4Y2VlZHMgUFJfQVBUUExfTUFYX1RQT1JUX0xFTjogJWRcbiIsCiAJCQkJCVBSX0FQVFBMX01BWF9UUE9SVF9MRU4pOwogCQkJCXJldCA9IC1FSU5WQUw7CkBAIC0xNTk2LDIwICsxNTg3LDIwIEBACiAJCX0KIAl9CiAKLQlpZiAoIShpX3BvcnQpIHx8ICEodF9wb3J0KSB8fCAhKHNhX3Jlc19rZXkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSWxsZWdhbCBwYXJhbWV0ZXJzIGZvciBBUFRQTCByZWdpc3RyYXRpb25cbiIpOworCWlmICghaV9wb3J0IHx8ICF0X3BvcnQgfHwgIXNhX3Jlc19rZXkpIHsKKwkJcHJfZXJyKCJJbGxlZ2FsIHBhcmFtZXRlcnMgZm9yIEFQVFBMIHJlZ2lzdHJhdGlvblxuIik7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAogCWlmIChyZXNfaG9sZGVyICYmICEodHlwZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbGxlZ2FsIFBSIHR5cGU6IDB4JTAyeCBmb3IgcmVzZXJ2YXRpb24iCisJCXByX2VycigiSWxsZWdhbCBQUiB0eXBlOiAweCUwMnggZm9yIHJlc2VydmF0aW9uIgogCQkJCSIgaG9sZGVyXG4iLCB0eXBlKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gY29yZV9zY3NpM19hbGxvY19hcHRwbF9yZWdpc3RyYXRpb24oVDEwX1JFUyhzdV9kZXYpLCBzYV9yZXNfa2V5LAorCXJldCA9IGNvcmVfc2NzaTNfYWxsb2NfYXB0cGxfcmVnaXN0cmF0aW9uKCZzdV9kZXYtPnQxMF9wciwgc2FfcmVzX2tleSwKIAkJCWlfcG9ydCwgaXNpZCwgbWFwcGVkX2x1biwgdF9wb3J0LCB0cGd0LCB0YXJnZXRfbHVuLAogCQkJcmVzX2hvbGRlciwgYWxsX3RnX3B0LCB0eXBlKTsKIG91dDoKQEAgLTE2NjIsNyArMTY1Myw3IEBACiAJaW50IGJsID0gMDsKIAlzc2l6ZV90IHJlYWRfYnl0ZXMgPSAwOwogCi0JaWYgKCEoc2VfZGV2LT5zZV9kZXZfcHRyKSkKKwlpZiAoIXNlX2Rldi0+c2VfZGV2X3B0cikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAl0cmFuc3BvcnRfZHVtcF9kZXZfc3RhdGUoc2VfZGV2LT5zZV9kZXZfcHRyLCBwYWdlLCAmYmwpOwpAQCAtMTY4OCw4ICsxNjc5LDggQEAKIAlzdHJ1Y3Qgc2VfaGJhICpoYmEgPSBzZV9kZXYtPnNlX2Rldl9oYmE7CiAJc3RydWN0IHNlX3N1YnN5c3RlbV9hcGkgKnQgPSBoYmEtPnRyYW5zcG9ydDsKIAotCWlmICghKHNlX2Rldi0+c2VfZGV2X3N1X3B0cikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2PnNlIgorCWlmICghc2VfZGV2LT5zZV9kZXZfc3VfcHRyKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2Rldj5zZSIKIAkJCQkiX2Rldl9zdV9wdHJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNzI1LDcgKzE3MTYsNyBAQAogCXNzaXplX3QgcmVhZF9ieXRlczsKIAogCWlmIChjb3VudCA+IChTRV9ERVZfQUxJQVNfTEVOLTEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWxpYXMgY291bnQ6ICVkIGV4Y2VlZHMiCisJCXByX2VycigiYWxpYXMgY291bnQ6ICVkIGV4Y2VlZHMiCiAJCQkiIFNFX0RFVl9BTElBU19MRU4tMTogJXVcbiIsIChpbnQpY291bnQsCiAJCQlTRV9ERVZfQUxJQVNfTEVOLTEpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE3MzUsNyArMTcyNiw3IEBACiAJcmVhZF9ieXRlcyA9IHNucHJpbnRmKCZzZV9kZXYtPnNlX2Rldl9hbGlhc1swXSwgU0VfREVWX0FMSUFTX0xFTiwKIAkJCSIlcyIsIHBhZ2UpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6ICVzLyVzIHNldCBhbGlhczogJXNcbiIsCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiAlcy8lcyBzZXQgYWxpYXM6ICVzXG4iLAogCQljb25maWdfaXRlbV9uYW1lKCZoYmEtPmhiYV9ncm91cC5jZ19pdGVtKSwKIAkJY29uZmlnX2l0ZW1fbmFtZSgmc2VfZGV2LT5zZV9kZXZfZ3JvdXAuY2dfaXRlbSksCiAJCXNlX2Rldi0+c2VfZGV2X2FsaWFzKTsKQEAgLTE3NzEsNyArMTc2Miw3IEBACiAJc3NpemVfdCByZWFkX2J5dGVzOwogCiAJaWYgKGNvdW50ID4gKFNFX1VERVZfUEFUSF9MRU4tMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGV2X3BhdGggY291bnQ6ICVkIGV4Y2VlZHMiCisJCXByX2VycigidWRldl9wYXRoIGNvdW50OiAlZCBleGNlZWRzIgogCQkJIiBTRV9VREVWX1BBVEhfTEVOLTE6ICV1XG4iLCAoaW50KWNvdW50LAogCQkJU0VfVURFVl9QQVRIX0xFTi0xKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNzgxLDcgKzE3NzIsNyBAQAogCXJlYWRfYnl0ZXMgPSBzbnByaW50Zigmc2VfZGV2LT5zZV9kZXZfdWRldl9wYXRoWzBdLCBTRV9VREVWX1BBVEhfTEVOLAogCQkJIiVzIiwgcGFnZSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUYXJnZXRfQ29yZV9Db25maWdGUzogJXMvJXMgc2V0IHVkZXZfcGF0aDogJXNcbiIsCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiAlcy8lcyBzZXQgdWRldl9wYXRoOiAlc1xuIiwKIAkJY29uZmlnX2l0ZW1fbmFtZSgmaGJhLT5oYmFfZ3JvdXAuY2dfaXRlbSksCiAJCWNvbmZpZ19pdGVtX25hbWUoJnNlX2Rldi0+c2VfZGV2X2dyb3VwLmNnX2l0ZW0pLAogCQlzZV9kZXYtPnNlX2Rldl91ZGV2X3BhdGgpOwpAQCAtMTgwOSwxMyArMTgwMCwxMyBAQAogCWNoYXIgKnB0cjsKIAogCXB0ciA9IHN0cnN0cihwYWdlLCAiMSIpOwotCWlmICghKHB0cikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGb3IgZGV2X2VuYWJsZSBvcHMsIG9ubHkgdmFsaWQgdmFsdWUiCisJaWYgKCFwdHIpIHsKKwkJcHJfZXJyKCJGb3IgZGV2X2VuYWJsZSBvcHMsIG9ubHkgdmFsaWQgdmFsdWUiCiAJCQkJIiBpcyBcIjFcIlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoKHNlX2Rldi0+c2VfZGV2X3B0cikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzZV9kZXYtPnNlX2Rldl9wdHIgYWxyZWFkeSBzZXQgZm9yIHN0b3JhZ2UiCisJaWYgKHNlX2Rldi0+c2VfZGV2X3B0cikgeworCQlwcl9lcnIoInNlX2Rldi0+c2VfZGV2X3B0ciBhbHJlYWR5IHNldCBmb3Igc3RvcmFnZSIKIAkJCQkiIG9iamVjdFxuIik7CiAJCXJldHVybiAtRUVYSVNUOwogCX0KQEAgLTE4MzAsNyArMTgyMSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJc2VfZGV2LT5zZV9kZXZfcHRyID0gZGV2OwotCXByaW50ayhLRVJOX0lORk8gIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBSZWdpc3RlcmVkIHNlX2Rldi0+c2VfZGV2X3B0cjoiCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBSZWdpc3RlcmVkIHNlX2Rldi0+c2VfZGV2X3B0cjoiCiAJCSIgJXBcbiIsIHNlX2Rldi0+c2VfZGV2X3B0cik7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0xODU0LDIyICsxODQ1LDIyIEBACiAJc3NpemVfdCBsZW4gPSAwOwogCiAJZGV2ID0gc3VfZGV2LT5zZV9kZXZfcHRyOwotCWlmICghKGRldikpCisJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKFQxMF9BTFVBKHN1X2RldiktPmFsdWFfdHlwZSAhPSBTUEMzX0FMVUFfRU1VTEFURUQpCisJaWYgKHN1X2Rldi0+dDEwX2FsdWEuYWx1YV90eXBlICE9IFNQQzNfQUxVQV9FTVVMQVRFRCkKIAkJcmV0dXJuIGxlbjsKIAogCWx1X2dwX21lbSA9IGRldi0+ZGV2X2FsdWFfbHVfZ3BfbWVtOwotCWlmICghKGx1X2dwX21lbSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJOVUxMIHN0cnVjdCBzZV9kZXZpY2UtPmRldl9hbHVhX2x1X2dwX21lbSIKKwlpZiAoIWx1X2dwX21lbSkgeworCQlwcl9lcnIoIk5VTEwgc3RydWN0IHNlX2RldmljZS0+ZGV2X2FsdWFfbHVfZ3BfbWVtIgogCQkJCSIgcG9pbnRlclxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXNwaW5fbG9jaygmbHVfZ3BfbWVtLT5sdV9ncF9tZW1fbG9jayk7CiAJbHVfZ3AgPSBsdV9ncF9tZW0tPmx1X2dwOwotCWlmICgobHVfZ3ApKSB7CisJaWYgKGx1X2dwKSB7CiAJCWx1X2NpID0gJmx1X2dwLT5sdV9ncF9ncm91cC5jZ19pdGVtOwogCQlsZW4gKz0gc3ByaW50ZihwYWdlLCAiTFUgR3JvdXAgQWxpYXM6ICVzXG5MVSBHcm91cCBJRDogJWh1XG4iLAogCQkJY29uZmlnX2l0ZW1fbmFtZShsdV9jaSksIGx1X2dwLT5sdV9ncF9pZCk7CkBAIC0xODkzLDE3ICsxODg0LDE3IEBACiAJaW50IG1vdmUgPSAwOwogCiAJZGV2ID0gc3VfZGV2LT5zZV9kZXZfcHRyOwotCWlmICghKGRldikpCisJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKFQxMF9BTFVBKHN1X2RldiktPmFsdWFfdHlwZSAhPSBTUEMzX0FMVUFfRU1VTEFURUQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1BDM19BTFVBX0VNVUxBVEVEIG5vdCBlbmFibGVkIGZvciAlcy8lc1xuIiwKKwlpZiAoc3VfZGV2LT50MTBfYWx1YS5hbHVhX3R5cGUgIT0gU1BDM19BTFVBX0VNVUxBVEVEKSB7CisJCXByX3dhcm4oIlNQQzNfQUxVQV9FTVVMQVRFRCBub3QgZW5hYmxlZCBmb3IgJXMvJXNcbiIsCiAJCQljb25maWdfaXRlbV9uYW1lKCZoYmEtPmhiYV9ncm91cC5jZ19pdGVtKSwKIAkJCWNvbmZpZ19pdGVtX25hbWUoJnN1X2Rldi0+c2VfZGV2X2dyb3VwLmNnX2l0ZW0pKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChjb3VudCA+IExVX0dST1VQX05BTUVfQlVGKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQUxVQSBMVSBHcm91cCBBbGlhcyB0b28gbGFyZ2UhXG4iKTsKKwkJcHJfZXJyKCJBTFVBIExVIEdyb3VwIEFsaWFzIHRvbyBsYXJnZSFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJbWVtc2V0KGJ1ZiwgMCwgTFVfR1JPVVBfTkFNRV9CVUYpOwpAQCAtMTkxOSwyNyArMTkxMCwyNyBAQAogCQkgKiBjb3JlX2FsdWFfZ2V0X2x1X2dwX2J5X25hbWUgYmVsb3coKS4KIAkJICovCiAJCWx1X2dwX25ldyA9IGNvcmVfYWx1YV9nZXRfbHVfZ3BfYnlfbmFtZShzdHJzdHJpcChidWYpKTsKLQkJaWYgKCEobHVfZ3BfbmV3KSkKKwkJaWYgKCFsdV9ncF9uZXcpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJbHVfZ3BfbWVtID0gZGV2LT5kZXZfYWx1YV9sdV9ncF9tZW07Ci0JaWYgKCEobHVfZ3BfbWVtKSkgeworCWlmICghbHVfZ3BfbWVtKSB7CiAJCWlmIChsdV9ncF9uZXcpCiAJCQljb3JlX2FsdWFfcHV0X2x1X2dwX2Zyb21fbmFtZShsdV9ncF9uZXcpOwotCQlwcmludGsoS0VSTl9FUlIgIk5VTEwgc3RydWN0IHNlX2RldmljZS0+ZGV2X2FsdWFfbHVfZ3BfbWVtIgorCQlwcl9lcnIoIk5VTEwgc3RydWN0IHNlX2RldmljZS0+ZGV2X2FsdWFfbHVfZ3BfbWVtIgogCQkJCSIgcG9pbnRlclxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXNwaW5fbG9jaygmbHVfZ3BfbWVtLT5sdV9ncF9tZW1fbG9jayk7CiAJbHVfZ3AgPSBsdV9ncF9tZW0tPmx1X2dwOwotCWlmICgobHVfZ3ApKSB7CisJaWYgKGx1X2dwKSB7CiAJCS8qCiAJCSAqIENsZWFyaW5nIGFuIGV4aXN0aW5nIGx1X2dwIGFzc29jaWF0aW9uLCBhbmQgcmVwbGFjaW5nCiAJCSAqIHdpdGggTlVMTAogCQkgKi8KLQkJaWYgKCEobHVfZ3BfbmV3KSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IFJlbGVhc2luZyAlcy8lcyIKKwkJaWYgKCFsdV9ncF9uZXcpIHsKKwkJCXByX2RlYnVnKCJUYXJnZXRfQ29yZV9Db25maWdGUzogUmVsZWFzaW5nICVzLyVzIgogCQkJCSIgZnJvbSBBTFVBIExVIEdyb3VwOiBjb3JlL2FsdWEvbHVfZ3BzLyVzLCBJRDoiCiAJCQkJIiAlaHVcbiIsCiAJCQkJY29uZmlnX2l0ZW1fbmFtZSgmaGJhLT5oYmFfZ3JvdXAuY2dfaXRlbSksCkBAIC0xOTY0LDcgKzE5NTUsNyBAQAogCV9fY29yZV9hbHVhX2F0dGFjaF9sdV9ncF9tZW0obHVfZ3BfbWVtLCBsdV9ncF9uZXcpOwogCXNwaW5fdW5sb2NrKCZsdV9ncF9tZW0tPmx1X2dwX21lbV9sb2NrKTsKIAotCXByaW50ayhLRVJOX0lORk8gIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiAlcyAlcy8lcyB0byBBTFVBIExVIEdyb3VwOiIKKwlwcl9kZWJ1ZygiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6ICVzICVzLyVzIHRvIEFMVUEgTFUgR3JvdXA6IgogCQkiIGNvcmUvYWx1YS9sdV9ncHMvJXMsIElEOiAlaHVcbiIsCiAJCShtb3ZlKSA/ICJNb3ZpbmciIDogIkFkZGluZyIsCiAJCWNvbmZpZ19pdGVtX25hbWUoJmhiYS0+aGJhX2dyb3VwLmNnX2l0ZW0pLApAQCAtMjAwOCw3ICsxOTk5LDcgQEAKIAkgKmBlY2hvIDEgPiAkQ09ORklHRlMvY29yZS8kSEJBLyRERVYvZGV2X2VuYWJsZWAKIAkgKi8KIAlpZiAoc2VfZGV2LT5zZV9kZXZfcHRyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBDYWxsaW5nIHNlX2ZyZWVfIgorCQlwcl9kZWJ1ZygiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IENhbGxpbmcgc2VfZnJlZV8iCiAJCQkidmlydHVhbF9kZXZpY2UoKSBmb3Igc2VfZGV2X3B0cjogJXBcbiIsCiAJCQlzZV9kZXYtPnNlX2Rldl9wdHIpOwogCkBAIC0yMDE3LDE0ICsyMDA4LDE0IEBACiAJCS8qCiAJCSAqIFJlbGVhc2Ugc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYtPnNlX2Rldl9zdV9wdHIuLgogCQkgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IENhbGxpbmcgdC0+ZnJlZV8iCisJCXByX2RlYnVnKCJUYXJnZXRfQ29yZV9Db25maWdGUzogQ2FsbGluZyB0LT5mcmVlXyIKIAkJCSJkZXZpY2UoKSBmb3Igc2VfZGV2X3N1X3B0cjogJXBcbiIsCiAJCQlzZV9kZXYtPnNlX2Rldl9zdV9wdHIpOwogCiAJCXQtPmZyZWVfZGV2aWNlKHNlX2Rldi0+c2VfZGV2X3N1X3B0cik7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IERlYWxsb2NhdGluZyBzZV9zdWJzeXN0ZW0iCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBEZWFsbG9jYXRpbmcgc2Vfc3Vic3lzdGVtIgogCQkJIl9kZXZfdDogJXBcbiIsIHNlX2Rldik7CiAJa2ZyZWUoc2VfZGV2KTsKIH0KQEAgLTIwMzksMTAgKzIwMzAsMTAgQEAKIAlzdHJ1Y3QgdGFyZ2V0X2NvcmVfY29uZmlnZnNfYXR0cmlidXRlICp0Y19hdHRyID0gY29udGFpbmVyX29mKAogCQkJYXR0ciwgc3RydWN0IHRhcmdldF9jb3JlX2NvbmZpZ2ZzX2F0dHJpYnV0ZSwgYXR0cik7CiAKLQlpZiAoISh0Y19hdHRyLT5zaG93KSkKKwlpZiAoIXRjX2F0dHItPnNob3cpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHRjX2F0dHItPnNob3coKHZvaWQgKilzZV9kZXYsIHBhZ2UpOworCXJldHVybiB0Y19hdHRyLT5zaG93KHNlX2RldiwgcGFnZSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHRhcmdldF9jb3JlX2Rldl9zdG9yZShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0sCkBAIC0yMDU1LDEwICsyMDQ2LDEwIEBACiAJc3RydWN0IHRhcmdldF9jb3JlX2NvbmZpZ2ZzX2F0dHJpYnV0ZSAqdGNfYXR0ciA9IGNvbnRhaW5lcl9vZigKIAkJCWF0dHIsIHN0cnVjdCB0YXJnZXRfY29yZV9jb25maWdmc19hdHRyaWJ1dGUsIGF0dHIpOwogCi0JaWYgKCEodGNfYXR0ci0+c3RvcmUpKQorCWlmICghdGNfYXR0ci0+c3RvcmUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHRjX2F0dHItPnN0b3JlKCh2b2lkICopc2VfZGV2LCBwYWdlLCBjb3VudCk7CisJcmV0dXJuIHRjX2F0dHItPnN0b3JlKHNlX2RldiwgcGFnZSwgY291bnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGNvbmZpZ2ZzX2l0ZW1fb3BlcmF0aW9ucyB0YXJnZXRfY29yZV9kZXZfaXRlbV9vcHMgPSB7CkBAIC0yMDk4LDcgKzIwODksNyBAQAogCXN0cnVjdCB0MTBfYWx1YV9sdV9ncCAqbHVfZ3AsCiAJY2hhciAqcGFnZSkKIHsKLQlpZiAoIShsdV9ncC0+bHVfZ3BfdmFsaWRfaWQpKQorCWlmICghbHVfZ3AtPmx1X2dwX3ZhbGlkX2lkKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlaHVcbiIsIGx1X2dwLT5sdV9ncF9pZCk7CkBAIC0yMTE1LDEyICsyMTA2LDEyIEBACiAKIAlyZXQgPSBzdHJpY3Rfc3RydG91bChwYWdlLCAwLCAmbHVfZ3BfaWQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic3RyaWN0X3N0cnRvdWwoKSByZXR1cm5lZCAlZCBmb3IiCisJCXByX2Vycigic3RyaWN0X3N0cnRvdWwoKSByZXR1cm5lZCAlZCBmb3IiCiAJCQkiIGx1X2dwX2lkXG4iLCByZXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKGx1X2dwX2lkID4gMHgwMDAwZmZmZikgewotCQlwcmludGsoS0VSTl9FUlIgIkFMVUEgbHVfZ3BfaWQ6ICVsdSBleGNlZWRzIG1heGltdW06IgorCQlwcl9lcnIoIkFMVUEgbHVfZ3BfaWQ6ICVsdSBleGNlZWRzIG1heGltdW06IgogCQkJIiAweDAwMDBmZmZmXG4iLCBsdV9ncF9pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTIxMjksNyArMjEyMCw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IFNldCBBTFVBIExvZ2ljYWwgVW5pdCIKKwlwcl9kZWJ1ZygiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IFNldCBBTFVBIExvZ2ljYWwgVW5pdCIKIAkJIiBHcm91cDogY29yZS9hbHVhL2x1X2dwcy8lcyB0byBJRDogJWh1XG4iLAogCQljb25maWdfaXRlbV9uYW1lKCZhbHVhX2x1X2dwX2NnLT5jZ19pdGVtKSwKIAkJbHVfZ3AtPmx1X2dwX2lkKTsKQEAgLTIxNjcsNyArMjE1OCw3IEBACiAJCWN1cl9sZW4rKzsgLyogRXh0cmEgYnl0ZSBmb3IgTlVMTCB0ZXJtaW5hdG9yICovCiAKIAkJaWYgKChjdXJfbGVuICsgbGVuKSA+IFBBR0VfU0laRSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmFuIG91dCBvZiBsdV9ncF9zaG93X2F0dHIiCisJCQlwcl93YXJuKCJSYW4gb3V0IG9mIGx1X2dwX3Nob3dfYXR0ciIKIAkJCQkiX21lbWJlcnMgYnVmZmVyXG4iKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0yMjMxLDcgKzIyMjIsNyBAQAogCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZShhbHVhX2x1X2dwX2NnLCBuYW1lLAogCQkJJnRhcmdldF9jb3JlX2FsdWFfbHVfZ3BfY2l0KTsKIAotCXByaW50ayhLRVJOX0lORk8gIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBBbGxvY2F0ZWQgQUxVQSBMb2dpY2FsIFVuaXQiCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBBbGxvY2F0ZWQgQUxVQSBMb2dpY2FsIFVuaXQiCiAJCSIgR3JvdXA6IGNvcmUvYWx1YS9sdV9ncHMvJXNcbiIsCiAJCWNvbmZpZ19pdGVtX25hbWUoYWx1YV9sdV9ncF9jaSkpOwogCkBAIC0yMjQ2LDcgKzIyMzcsNyBAQAogCXN0cnVjdCB0MTBfYWx1YV9sdV9ncCAqbHVfZ3AgPSBjb250YWluZXJfb2YodG9fY29uZmlnX2dyb3VwKGl0ZW0pLAogCQkJc3RydWN0IHQxMF9hbHVhX2x1X2dwLCBsdV9ncF9ncm91cCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUYXJnZXRfQ29yZV9Db25maWdGUzogUmVsZWFzaW5nIEFMVUEgTG9naWNhbCBVbml0IgorCXByX2RlYnVnKCJUYXJnZXRfQ29yZV9Db25maWdGUzogUmVsZWFzaW5nIEFMVUEgTG9naWNhbCBVbml0IgogCQkiIEdyb3VwOiBjb3JlL2FsdWEvbHVfZ3BzLyVzLCBJRDogJWh1XG4iLAogCQljb25maWdfaXRlbV9uYW1lKGl0ZW0pLCBsdV9ncC0+bHVfZ3BfaWQpOwogCS8qCkBAIC0yMzA1LDIyICsyMjk2LDIyIEBACiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJaW50IG5ld19zdGF0ZSwgcmV0OwogCi0JaWYgKCEodGdfcHRfZ3AtPnRnX3B0X2dwX3ZhbGlkX2lkKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBkbyBpbXBsaWN0IEFMVUEgb24gbm9uIHZhbGlkIgorCWlmICghdGdfcHRfZ3AtPnRnX3B0X2dwX3ZhbGlkX2lkKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGRvIGltcGxpY3QgQUxVQSBvbiBub24gdmFsaWQiCiAJCQkiIHRnX3B0X2dwIElEOiAlaHVcbiIsIHRnX3B0X2dwLT50Z19wdF9ncF92YWxpZF9pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldCA9IHN0cmljdF9zdHJ0b3VsKHBhZ2UsIDAsICZ0bXApOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiVW5hYmxlIHRvIGV4dHJhY3QgbmV3IEFMVUEgYWNjZXNzIHN0YXRlIGZyb20iCisJCXByX2VycigiVW5hYmxlIHRvIGV4dHJhY3QgbmV3IEFMVUEgYWNjZXNzIHN0YXRlIGZyb20iCiAJCQkJIiAlc1xuIiwgcGFnZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAluZXdfc3RhdGUgPSAoaW50KXRtcDsKIAogCWlmICghKHRnX3B0X2dwLT50Z19wdF9ncF9hbHVhX2FjY2Vzc190eXBlICYgVFBHU19JTVBMSUNUX0FMVUEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHByb2Nlc3MgaW1wbGljdCBjb25maWdmcyBBTFVBIgorCQlwcl9lcnIoIlVuYWJsZSB0byBwcm9jZXNzIGltcGxpY3QgY29uZmlnZnMgQUxVQSIKIAkJCSIgdHJhbnNpdGlvbiB3aGlsZSBUUEdTX0lNUExJQ1RfQUxVQSBpcyBkaWFibGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjM1MSw4ICsyMzQyLDggQEAKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgbmV3X3N0YXR1cywgcmV0OwogCi0JaWYgKCEodGdfcHRfZ3AtPnRnX3B0X2dwX3ZhbGlkX2lkKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBkbyBzZXQgQUxVQSBhY2Nlc3Mgc3RhdHVzIG9uIG5vbiIKKwlpZiAoIXRnX3B0X2dwLT50Z19wdF9ncF92YWxpZF9pZCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBkbyBzZXQgQUxVQSBhY2Nlc3Mgc3RhdHVzIG9uIG5vbiIKIAkJCSIgdmFsaWQgdGdfcHRfZ3AgSUQ6ICVodVxuIiwKIAkJCXRnX3B0X2dwLT50Z19wdF9ncF92YWxpZF9pZCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjM2MCw3ICsyMzUxLDcgQEAKIAogCXJldCA9IHN0cmljdF9zdHJ0b3VsKHBhZ2UsIDAsICZ0bXApOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGV4dHJhY3QgbmV3IEFMVUEgYWNjZXNzIHN0YXR1cyIKKwkJcHJfZXJyKCJVbmFibGUgdG8gZXh0cmFjdCBuZXcgQUxVQSBhY2Nlc3Mgc3RhdHVzIgogCQkJCSIgZnJvbSAlc1xuIiwgcGFnZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTIzNjksNyArMjM2MCw3IEBACiAJaWYgKChuZXdfc3RhdHVzICE9IEFMVUFfU1RBVFVTX05PTkUpICYmCiAJICAgIChuZXdfc3RhdHVzICE9IEFMVUFfU1RBVFVTX0FMVEVSRURfQllfRVhQTElDVF9TVFBHKSAmJgogCSAgICAobmV3X3N0YXR1cyAhPSBBTFVBX1NUQVRVU19BTFRFUkVEX0JZX0lNUExJQ1RfQUxVQSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbGxlZ2FsIEFMVUEgYWNjZXNzIHN0YXR1czogMHglMDJ4XG4iLAorCQlwcl9lcnIoIklsbGVnYWwgQUxVQSBhY2Nlc3Mgc3RhdHVzOiAweCUwMnhcbiIsCiAJCQkJbmV3X3N0YXR1cyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTI0MjAsMTIgKzI0MTEsMTIgQEAKIAogCXJldCA9IHN0cmljdF9zdHJ0b3VsKHBhZ2UsIDAsICZ0bXApOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGV4dHJhY3QgYWx1YV93cml0ZV9tZXRhZGF0YVxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGV4dHJhY3QgYWx1YV93cml0ZV9tZXRhZGF0YVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmICgodG1wICE9IDApICYmICh0bXAgIT0gMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbGxlZ2FsIHZhbHVlIGZvciBhbHVhX3dyaXRlX21ldGFkYXRhOiIKKwkJcHJfZXJyKCJJbGxlZ2FsIHZhbHVlIGZvciBhbHVhX3dyaXRlX21ldGFkYXRhOiIKIAkJCSIgJWx1XG4iLCB0bXApOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNTA3LDcgKzI0OTgsNyBAQAogCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncCAqdGdfcHRfZ3AsCiAJY2hhciAqcGFnZSkKIHsKLQlpZiAoISh0Z19wdF9ncC0+dGdfcHRfZ3BfdmFsaWRfaWQpKQorCWlmICghdGdfcHRfZ3AtPnRnX3B0X2dwX3ZhbGlkX2lkKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlaHVcbiIsIHRnX3B0X2dwLT50Z19wdF9ncF9pZCk7CkBAIC0yNTI0LDEyICsyNTE1LDEyIEBACiAKIAlyZXQgPSBzdHJpY3Rfc3RydG91bChwYWdlLCAwLCAmdGdfcHRfZ3BfaWQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic3RyaWN0X3N0cnRvdWwoKSByZXR1cm5lZCAlZCBmb3IiCisJCXByX2Vycigic3RyaWN0X3N0cnRvdWwoKSByZXR1cm5lZCAlZCBmb3IiCiAJCQkiIHRnX3B0X2dwX2lkXG4iLCByZXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHRnX3B0X2dwX2lkID4gMHgwMDAwZmZmZikgewotCQlwcmludGsoS0VSTl9FUlIgIkFMVUEgdGdfcHRfZ3BfaWQ6ICVsdSBleGNlZWRzIG1heGltdW06IgorCQlwcl9lcnIoIkFMVUEgdGdfcHRfZ3BfaWQ6ICVsdSBleGNlZWRzIG1heGltdW06IgogCQkJIiAweDAwMDBmZmZmXG4iLCB0Z19wdF9ncF9pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTI1MzgsNyArMjUyOSw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IFNldCBBTFVBIFRhcmdldCBQb3J0IEdyb3VwOiAiCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBTZXQgQUxVQSBUYXJnZXQgUG9ydCBHcm91cDogIgogCQkiY29yZS9hbHVhL3RnX3B0X2dwcy8lcyB0byBJRDogJWh1XG4iLAogCQljb25maWdfaXRlbV9uYW1lKCZhbHVhX3RnX3B0X2dwX2NnLT5jZ19pdGVtKSwKIAkJdGdfcHRfZ3AtPnRnX3B0X2dwX2lkKTsKQEAgLTI1NzIsMTQgKzI1NjMsMTQgQEAKIAkJbHVuID0gcG9ydC0+c2VwX2x1bjsKIAogCQljdXJfbGVuID0gc25wcmludGYoYnVmLCBUR19QVF9HUk9VUF9OQU1FX0JVRiwgIiVzLyVzL3RwZ3RfJWh1IgotCQkJIi8lc1xuIiwgVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJCVRQR19URk8odHBnKS0+dHBnX2dldF93d24odHBnKSwKLQkJCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSwKKwkJCSIvJXNcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfd3duKHRwZyksCisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfdGFnKHRwZyksCiAJCQljb25maWdfaXRlbV9uYW1lKCZsdW4tPmx1bl9ncm91cC5jZ19pdGVtKSk7CiAJCWN1cl9sZW4rKzsgLyogRXh0cmEgYnl0ZSBmb3IgTlVMTCB0ZXJtaW5hdG9yICovCiAKIAkJaWYgKChjdXJfbGVuICsgbGVuKSA+IFBBR0VfU0laRSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmFuIG91dCBvZiBsdV9ncF9zaG93X2F0dHIiCisJCQlwcl93YXJuKCJSYW4gb3V0IG9mIGx1X2dwX3Nob3dfYXR0ciIKIAkJCQkiX21lbWJlcnMgYnVmZmVyXG4iKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0yNjQ1LDcgKzI2MzYsNyBAQAogCXN0cnVjdCBjb25maWdfaXRlbSAqYWx1YV90Z19wdF9ncF9jaSA9IE5VTEw7CiAKIAl0Z19wdF9ncCA9IGNvcmVfYWx1YV9hbGxvY2F0ZV90Z19wdF9ncChzdV9kZXYsIG5hbWUsIDApOwotCWlmICghKHRnX3B0X2dwKSkKKwlpZiAoIXRnX3B0X2dwKQogCQlyZXR1cm4gTlVMTDsKIAogCWFsdWFfdGdfcHRfZ3BfY2cgPSAmdGdfcHRfZ3AtPnRnX3B0X2dwX2dyb3VwOwpAQCAtMjY1NCw3ICsyNjQ1LDcgQEAKIAljb25maWdfZ3JvdXBfaW5pdF90eXBlX25hbWUoYWx1YV90Z19wdF9ncF9jZywgbmFtZSwKIAkJCSZ0YXJnZXRfY29yZV9hbHVhX3RnX3B0X2dwX2NpdCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUYXJnZXRfQ29yZV9Db25maWdGUzogQWxsb2NhdGVkIEFMVUEgVGFyZ2V0IFBvcnQiCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBBbGxvY2F0ZWQgQUxVQSBUYXJnZXQgUG9ydCIKIAkJIiBHcm91cDogYWx1YS90Z19wdF9ncHMvJXNcbiIsCiAJCWNvbmZpZ19pdGVtX25hbWUoYWx1YV90Z19wdF9ncF9jaSkpOwogCkBAIC0yNjY4LDcgKzI2NTksNyBAQAogCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncCAqdGdfcHRfZ3AgPSBjb250YWluZXJfb2YodG9fY29uZmlnX2dyb3VwKGl0ZW0pLAogCQkJc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwLCB0Z19wdF9ncF9ncm91cCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUYXJnZXRfQ29yZV9Db25maWdGUzogUmVsZWFzaW5nIEFMVUEgVGFyZ2V0IFBvcnQiCisJcHJfZGVidWcoIlRhcmdldF9Db3JlX0NvbmZpZ0ZTOiBSZWxlYXNpbmcgQUxVQSBUYXJnZXQgUG9ydCIKIAkJIiBHcm91cDogYWx1YS90Z19wdF9ncHMvJXMsIElEOiAlaHVcbiIsCiAJCWNvbmZpZ19pdGVtX25hbWUoaXRlbSksIHRnX3B0X2dwLT50Z19wdF9ncF9pZCk7CiAJLyoKQEAgLTI3NTksMjEgKzI3NTAsMjEgQEAKIAogCXNlX2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZV9kZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciIKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciIKIAkJCQkiIHN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2XG4iKTsKIAkJZ290byB1bmxvY2s7CiAJfQotCUlOSVRfTElTVF9IRUFEKCZzZV9kZXYtPmdfc2VfZGV2X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzZV9kZXYtPnNlX2Rldl9ub2RlKTsKIAlJTklUX0xJU1RfSEVBRCgmc2VfZGV2LT50MTBfd3duLnQxMF92cGRfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnNlX2Rldi0+dDEwX3d3bi50MTBfdnBkX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZzZV9kZXYtPnQxMF9yZXNlcnZhdGlvbi5yZWdpc3RyYXRpb25fbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNlX2Rldi0+dDEwX3Jlc2VydmF0aW9uLmFwdHBsX3JlZ19saXN0KTsKLQlzcGluX2xvY2tfaW5pdCgmc2VfZGV2LT50MTBfcmVzZXJ2YXRpb24ucmVnaXN0cmF0aW9uX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZzZV9kZXYtPnQxMF9yZXNlcnZhdGlvbi5hcHRwbF9yZWdfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnNlX2Rldi0+dDEwX3ByLnJlZ2lzdHJhdGlvbl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmc2VfZGV2LT50MTBfcHIuYXB0cGxfcmVnX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZzZV9kZXYtPnQxMF9wci5yZWdpc3RyYXRpb25fbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnNlX2Rldi0+dDEwX3ByLmFwdHBsX3JlZ19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmc2VfZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnNlX2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZzZV9kZXYtPnNlX2Rldl9sb2NrKTsKLQlzZV9kZXYtPnQxMF9yZXNlcnZhdGlvbi5wcl9hcHRwbF9idWZfbGVuID0gUFJfQVBUUExfQlVGX0xFTjsKKwlzZV9kZXYtPnQxMF9wci5wcl9hcHRwbF9idWZfbGVuID0gUFJfQVBUUExfQlVGX0xFTjsKIAlzZV9kZXYtPnQxMF93d24udDEwX3N1Yl9kZXYgPSBzZV9kZXY7CiAJc2VfZGV2LT50MTBfYWx1YS50MTBfc3ViX2RldiA9IHNlX2RldjsKIAlzZV9kZXYtPnNlX2Rldl9hdHRyaWIuZGFfc3ViX2RldiA9IHNlX2RldjsKQEAgLTI3ODMsNyArMjc3NCw3IEBACiAKIAlkZXZfY2ctPmRlZmF1bHRfZ3JvdXBzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbmZpZ19ncm91cCkgKiA3LAogCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoZGV2X2NnLT5kZWZhdWx0X2dyb3VwcykpCisJaWYgKCFkZXZfY2ctPmRlZmF1bHRfZ3JvdXBzKQogCQlnb3RvIG91dDsKIAkvKgogCSAqIFNldCBzZV9kZXZfc3VfcHRyIGZyb20gc3RydWN0IHNlX3N1YnN5c3RlbV9hcGkgcmV0dXJuZWQgdm9pZCBwdHIKQEAgLTI3OTQsMTQgKzI3ODUsMTQgQEAKIAkgKiBjb25maWdmcyB0cmVlIGZvciBkZXZpY2Ugb2JqZWN0J3Mgc3RydWN0IGNvbmZpZ19ncm91cC4KIAkgKi8KIAlzZV9kZXYtPnNlX2Rldl9zdV9wdHIgPSB0LT5hbGxvY2F0ZV92aXJ0ZGV2aWNlKGhiYSwgbmFtZSk7Ci0JaWYgKCEoc2VfZGV2LT5zZV9kZXZfc3VfcHRyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBsb2NhdGUgc3Vic3lzdGVtIGRlcGVuZGVudCBwb2ludGVyIgorCWlmICghc2VfZGV2LT5zZV9kZXZfc3VfcHRyKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBzdWJzeXN0ZW0gZGVwZW5kZW50IHBvaW50ZXIiCiAJCQkiIGZyb20gYWxsb2NhdGVfdmlydGRldmljZSgpXG4iKTsKIAkJZ290byBvdXQ7CiAJfQotCXNwaW5fbG9jaygmc2VfZ2xvYmFsLT5nX2RldmljZV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZzZV9kZXYtPmdfc2VfZGV2X2xpc3QsICZzZV9nbG9iYWwtPmdfc2VfZGV2X2xpc3QpOwotCXNwaW5fdW5sb2NrKCZzZV9nbG9iYWwtPmdfZGV2aWNlX2xvY2spOworCXNwaW5fbG9jaygmc2VfZGV2aWNlX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnNlX2Rldi0+c2VfZGV2X25vZGUsICZzZV9kZXZfbGlzdCk7CisJc3Bpbl91bmxvY2soJnNlX2RldmljZV9sb2NrKTsKIAogCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmc2VfZGV2LT5zZV9kZXZfZ3JvdXAsIG5hbWUsCiAJCQkmdGFyZ2V0X2NvcmVfZGV2X2NpdCk7CkBAIC0yODI2LDE0ICsyODE3LDE0IEBACiAJICogQWRkIGNvcmUvJEhCQS8kREVWL2FsdWEvZGVmYXVsdF90Z19wdF9ncAogCSAqLwogCXRnX3B0X2dwID0gY29yZV9hbHVhX2FsbG9jYXRlX3RnX3B0X2dwKHNlX2RldiwgImRlZmF1bHRfdGdfcHRfZ3AiLCAxKTsKLQlpZiAoISh0Z19wdF9ncCkpCisJaWYgKCF0Z19wdF9ncCkKIAkJZ290byBvdXQ7CiAKLQl0Z19wdF9ncF9jZyA9ICZUMTBfQUxVQShzZV9kZXYpLT5hbHVhX3RnX3B0X2dwc19ncm91cDsKKwl0Z19wdF9ncF9jZyA9ICZzZV9kZXYtPnQxMF9hbHVhLmFsdWFfdGdfcHRfZ3BzX2dyb3VwOwogCXRnX3B0X2dwX2NnLT5kZWZhdWx0X2dyb3VwcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25maWdfZ3JvdXApICogMiwKIAkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoISh0Z19wdF9ncF9jZy0+ZGVmYXVsdF9ncm91cHMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHRnX3B0X2dwX2NnLT4iCisJaWYgKCF0Z19wdF9ncF9jZy0+ZGVmYXVsdF9ncm91cHMpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgdGdfcHRfZ3BfY2ctPiIKIAkJCQkiZGVmYXVsdF9ncm91cHNcbiIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yODQyLDI4ICsyODMzLDI4IEBACiAJCQkiZGVmYXVsdF90Z19wdF9ncCIsICZ0YXJnZXRfY29yZV9hbHVhX3RnX3B0X2dwX2NpdCk7CiAJdGdfcHRfZ3BfY2ctPmRlZmF1bHRfZ3JvdXBzWzBdID0gJnRnX3B0X2dwLT50Z19wdF9ncF9ncm91cDsKIAl0Z19wdF9ncF9jZy0+ZGVmYXVsdF9ncm91cHNbMV0gPSBOVUxMOwotCVQxMF9BTFVBKHNlX2RldiktPmRlZmF1bHRfdGdfcHRfZ3AgPSB0Z19wdF9ncDsKKwlzZV9kZXYtPnQxMF9hbHVhLmRlZmF1bHRfdGdfcHRfZ3AgPSB0Z19wdF9ncDsKIAkvKgogCSAqIEFkZCBjb3JlLyRIQkEvJERFVi9zdGF0aXN0aWNzLyBkZWZhdWx0IGdyb3VwcwogCSAqLwotCWRldl9zdGF0X2dycCA9ICZERVZfU1RBVF9HUlAoc2VfZGV2KS0+c3RhdF9ncm91cDsKKwlkZXZfc3RhdF9ncnAgPSAmc2VfZGV2LT5kZXZfc3RhdF9ncnBzLnN0YXRfZ3JvdXA7CiAJZGV2X3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3VwcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25maWdfZ3JvdXApICogNCwKIAkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWRldl9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgZGV2X3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3Vwc1xuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGRldl9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHNcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAJdGFyZ2V0X3N0YXRfc2V0dXBfZGV2X2RlZmF1bHRfZ3JvdXBzKHNlX2Rldik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUYXJnZXRfQ29yZV9Db25maWdGUzogQWxsb2NhdGVkIHN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2OiIKKwlwcl9kZWJ1ZygiVGFyZ2V0X0NvcmVfQ29uZmlnRlM6IEFsbG9jYXRlZCBzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldjoiCiAJCSIgJXAgc2VfZGV2X3N1X3B0cjogJXBcbiIsIHNlX2Rldiwgc2VfZGV2LT5zZV9kZXZfc3VfcHRyKTsKIAogCW11dGV4X3VubG9jaygmaGJhLT5oYmFfYWNjZXNzX211dGV4KTsKIAlyZXR1cm4gJnNlX2Rldi0+c2VfZGV2X2dyb3VwOwogb3V0OgotCWlmIChUMTBfQUxVQShzZV9kZXYpLT5kZWZhdWx0X3RnX3B0X2dwKSB7Ci0JCWNvcmVfYWx1YV9mcmVlX3RnX3B0X2dwKFQxMF9BTFVBKHNlX2RldiktPmRlZmF1bHRfdGdfcHRfZ3ApOwotCQlUMTBfQUxVQShzZV9kZXYpLT5kZWZhdWx0X3RnX3B0X2dwID0gTlVMTDsKKwlpZiAoc2VfZGV2LT50MTBfYWx1YS5kZWZhdWx0X3RnX3B0X2dwKSB7CisJCWNvcmVfYWx1YV9mcmVlX3RnX3B0X2dwKHNlX2Rldi0+dDEwX2FsdWEuZGVmYXVsdF90Z19wdF9ncCk7CisJCXNlX2Rldi0+dDEwX2FsdWEuZGVmYXVsdF90Z19wdF9ncCA9IE5VTEw7CiAJfQogCWlmIChkZXZfc3RhdF9ncnApCiAJCWtmcmVlKGRldl9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHMpOwpAQCAtMjg5NiwxMSArMjg4NywxMSBAQAogCW11dGV4X2xvY2soJmhiYS0+aGJhX2FjY2Vzc19tdXRleCk7CiAJdCA9IGhiYS0+dHJhbnNwb3J0OwogCi0Jc3Bpbl9sb2NrKCZzZV9nbG9iYWwtPmdfZGV2aWNlX2xvY2spOwotCWxpc3RfZGVsKCZzZV9kZXYtPmdfc2VfZGV2X2xpc3QpOwotCXNwaW5fdW5sb2NrKCZzZV9nbG9iYWwtPmdfZGV2aWNlX2xvY2spOworCXNwaW5fbG9jaygmc2VfZGV2aWNlX2xvY2spOworCWxpc3RfZGVsKCZzZV9kZXYtPnNlX2Rldl9ub2RlKTsKKwlzcGluX3VubG9jaygmc2VfZGV2aWNlX2xvY2spOwogCi0JZGV2X3N0YXRfZ3JwID0gJkRFVl9TVEFUX0dSUChzZV9kZXYpLT5zdGF0X2dyb3VwOworCWRldl9zdGF0X2dycCA9ICZzZV9kZXYtPmRldl9zdGF0X2dycHMuc3RhdF9ncm91cDsKIAlmb3IgKGkgPSAwOyBkZXZfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzW2ldOyBpKyspIHsKIAkJZGZfaXRlbSA9ICZkZXZfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzW2ldLT5jZ19pdGVtOwogCQlkZXZfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzW2ldID0gTlVMTDsKQEAgLTI5MDgsNyArMjg5OSw3IEBACiAJfQogCWtmcmVlKGRldl9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHMpOwogCi0JdGdfcHRfZ3BfY2cgPSAmVDEwX0FMVUEoc2VfZGV2KS0+YWx1YV90Z19wdF9ncHNfZ3JvdXA7CisJdGdfcHRfZ3BfY2cgPSAmc2VfZGV2LT50MTBfYWx1YS5hbHVhX3RnX3B0X2dwc19ncm91cDsKIAlmb3IgKGkgPSAwOyB0Z19wdF9ncF9jZy0+ZGVmYXVsdF9ncm91cHNbaV07IGkrKykgewogCQlkZl9pdGVtID0gJnRnX3B0X2dwX2NnLT5kZWZhdWx0X2dyb3Vwc1tpXS0+Y2dfaXRlbTsKIAkJdGdfcHRfZ3BfY2ctPmRlZmF1bHRfZ3JvdXBzW2ldID0gTlVMTDsKQEAgLTI5MTksNyArMjkxMCw3IEBACiAJICogY29yZV9hbHVhX2ZyZWVfdGdfcHRfZ3AoKSBpcyBjYWxsZWQgZnJvbSAtPmRlZmF1bHRfdGdfcHRfZ3AKIAkgKiBkaXJlY3RseSBmcm9tIHRhcmdldF9jb3JlX2FsdWFfdGdfcHRfZ3BfcmVsZWFzZSgpLgogCSAqLwotCVQxMF9BTFVBKHNlX2RldiktPmRlZmF1bHRfdGdfcHRfZ3AgPSBOVUxMOworCXNlX2Rldi0+dDEwX2FsdWEuZGVmYXVsdF90Z19wdF9ncCA9IE5VTEw7CiAKIAlkZXZfY2cgPSAmc2VfZGV2LT5zZV9kZXZfZ3JvdXA7CiAJZm9yIChpID0gMDsgZGV2X2NnLT5kZWZhdWx0X2dyb3Vwc1tpXTsgaSsrKSB7CkBAIC0yOTg4LDEzICsyOTc5LDEzIEBACiAKIAlyZXQgPSBzdHJpY3Rfc3RydG91bChwYWdlLCAwLCAmbW9kZV9mbGFnKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBleHRyYWN0IGhiYSBtb2RlIGZsYWc6ICVkXG4iLCByZXQpOworCQlwcl9lcnIoIlVuYWJsZSB0byBleHRyYWN0IGhiYSBtb2RlIGZsYWc6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzcGluX2xvY2soJmhiYS0+ZGV2aWNlX2xvY2spOwotCWlmICghKGxpc3RfZW1wdHkoJmhiYS0+aGJhX2Rldl9saXN0KSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gc2V0IGhiYV9tb2RlIHdpdGggYWN0aXZlIGRldmljZXNcbiIpOworCWlmICghbGlzdF9lbXB0eSgmaGJhLT5oYmFfZGV2X2xpc3QpKSB7CisJCXByX2VycigiVW5hYmxlIHRvIHNldCBoYmFfbW9kZSB3aXRoIGFjdGl2ZSBkZXZpY2VzXG4iKTsKIAkJc3Bpbl91bmxvY2soJmhiYS0+ZGV2aWNlX2xvY2spOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0zMDUyLDggKzMwNDMsOCBAQAogCWludCByZXQ7CiAKIAltZW1zZXQoYnVmLCAwLCBUQVJHRVRfQ09SRV9OQU1FX01BWF9MRU4pOwotCWlmIChzdHJsZW4obmFtZSkgPiBUQVJHRVRfQ09SRV9OQU1FX01BWF9MRU4pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQYXNzZWQgKm5hbWUgc3RybGVuKCk6ICVkIGV4Y2VlZHMiCisJaWYgKHN0cmxlbihuYW1lKSA+PSBUQVJHRVRfQ09SRV9OQU1FX01BWF9MRU4pIHsKKwkJcHJfZXJyKCJQYXNzZWQgKm5hbWUgc3RybGVuKCk6ICVkIGV4Y2VlZHMiCiAJCQkiIFRBUkdFVF9DT1JFX05BTUVfTUFYX0xFTjogJWRcbiIsIChpbnQpc3RybGVuKG5hbWUpLAogCQkJVEFSR0VUX0NPUkVfTkFNRV9NQVhfTEVOKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CkBAIC0zMDYxLDggKzMwNTIsOCBAQAogCXNucHJpbnRmKGJ1ZiwgVEFSR0VUX0NPUkVfTkFNRV9NQVhfTEVOLCAiJXMiLCBuYW1lKTsKIAogCXN0ciA9IHN0cnN0cihidWYsICJfIik7Ci0JaWYgKCEoc3RyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBsb2NhdGUgXCJfXCIgZm9yICRTVUJTWVNURU1fUExVR0lOXyRIT1NUX0lEXG4iKTsKKwlpZiAoIXN0cikgeworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgXCJfXCIgZm9yICRTVUJTWVNURU1fUExVR0lOXyRIT1NUX0lEXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCXNlX3BsdWdpbl9zdHIgPSBidWY7CkBAIC0zMDcxLDcgKzMwNjIsNyBAQAogCSAqIE5hbWVseSByZF9kaXJlY3QgYW5kIHJkX21jcC4uCiAJICovCiAJc3RyMiA9IHN0cnN0cihzdHIrMSwgIl8iKTsKLQlpZiAoKHN0cjIpKSB7CisJaWYgKHN0cjIpIHsKIAkJKnN0cjIgPSAnXDAnOyAvKiBUZXJtaW5hdGUgZm9yICpzZV9wbHVnaW5fc3RyICovCiAJCXN0cjIrKzsgLyogU2tpcCB0byBzdGFydCBvZiBwbHVnaW4gZGVwZW5kZW50IElEICovCiAJCXN0ciA9IHN0cjI7CkBAIC0zMDgyLDcgKzMwNzMsNyBAQAogCiAJcmV0ID0gc3RyaWN0X3N0cnRvdWwoc3RyLCAwLCAmcGx1Z2luX2RlcF9pZCk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzdHJpY3Rfc3RydG91bCgpIHJldHVybmVkICVkIGZvciIKKwkJcHJfZXJyKCJzdHJpY3Rfc3RydG91bCgpIHJldHVybmVkICVkIGZvciIKIAkJCQkiIHBsdWdpbl9kZXBfaWRcbiIsIHJldCk7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KQEAgLTMxMzUsNyArMzEyNiw3IEBACiAJc3RydWN0IHQxMF9hbHVhX2x1X2dwICpsdV9ncDsKIAlpbnQgcmV0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVEFSR0VUX0NPUkVbMF06IExvYWRpbmcgR2VuZXJpYyBLZXJuZWwgU3RvcmFnZSIKKwlwcl9kZWJ1ZygiVEFSR0VUX0NPUkVbMF06IExvYWRpbmcgR2VuZXJpYyBLZXJuZWwgU3RvcmFnZSIKIAkJIiBFbmdpbmU6ICVzIG9uICVzLyVzIG9uICJVVFNfUkVMRUFTRSJcbiIsCiAJCVRBUkdFVF9DT1JFX1ZFUlNJT04sIHV0c25hbWUoKS0+c3lzbmFtZSwgdXRzbmFtZSgpLT5tYWNoaW5lKTsKIApAQCAtMzE0NSwxMCArMzEzNiw5IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmZ190Zl9saXN0KTsKIAltdXRleF9pbml0KCZnX3RmX2xvY2spOwotCWluaXRfc2NzaV9pbmRleF90YWJsZSgpOwotCXJldCA9IGluaXRfc2VfZ2xvYmFsKCk7CisJcmV0ID0gaW5pdF9zZV9rbWVtX2NhY2hlcygpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiByZXQ7CiAJLyoKIAkgKiBDcmVhdGUgJENPTkZJR0ZTL3RhcmdldC9jb3JlIGRlZmF1bHQgZ3JvdXAgZm9yIEhCQSA8LT4gU3RvcmFnZSBPYmplY3QKIAkgKiBhbmQgQUxVQSBMb2dpY2FsIFVuaXQgR3JvdXAgYW5kIFRhcmdldCBQb3J0IEdyb3VwIGluZnJhc3RydWN0dXJlLgpAQCAtMzE1Niw0NCArMzE0Niw0NCBAQAogCXRhcmdldF9jZyA9ICZzdWJzeXMtPnN1X2dyb3VwOwogCXRhcmdldF9jZy0+ZGVmYXVsdF9ncm91cHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnX2dyb3VwKSAqIDIsCiAJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCEodGFyZ2V0X2NnLT5kZWZhdWx0X2dyb3VwcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgdGFyZ2V0X2NnLT5kZWZhdWx0X2dyb3Vwc1xuIik7CisJaWYgKCF0YXJnZXRfY2ctPmRlZmF1bHRfZ3JvdXBzKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHRhcmdldF9jZy0+ZGVmYXVsdF9ncm91cHNcbiIpOwogCQlnb3RvIG91dF9nbG9iYWw7CiAJfQogCi0JY29uZmlnX2dyb3VwX2luaXRfdHlwZV9uYW1lKCZzZV9nbG9iYWwtPnRhcmdldF9jb3JlX2hiYWdyb3VwLAorCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmdGFyZ2V0X2NvcmVfaGJhZ3JvdXAsCiAJCQkiY29yZSIsICZ0YXJnZXRfY29yZV9jaXQpOwotCXRhcmdldF9jZy0+ZGVmYXVsdF9ncm91cHNbMF0gPSAmc2VfZ2xvYmFsLT50YXJnZXRfY29yZV9oYmFncm91cDsKKwl0YXJnZXRfY2ctPmRlZmF1bHRfZ3JvdXBzWzBdID0gJnRhcmdldF9jb3JlX2hiYWdyb3VwOwogCXRhcmdldF9jZy0+ZGVmYXVsdF9ncm91cHNbMV0gPSBOVUxMOwogCS8qCiAJICogQ3JlYXRlIEFMVUEgaW5mcmFzdHJ1Y3R1cmUgdW5kZXIgL3N5cy9rZXJuZWwvY29uZmlnL3RhcmdldC9jb3JlL2FsdWEvCiAJICovCi0JaGJhX2NnID0gJnNlX2dsb2JhbC0+dGFyZ2V0X2NvcmVfaGJhZ3JvdXA7CisJaGJhX2NnID0gJnRhcmdldF9jb3JlX2hiYWdyb3VwOwogCWhiYV9jZy0+ZGVmYXVsdF9ncm91cHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnX2dyb3VwKSAqIDIsCiAJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoaGJhX2NnLT5kZWZhdWx0X2dyb3VwcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgaGJhX2NnLT5kZWZhdWx0X2dyb3Vwc1xuIik7CisJaWYgKCFoYmFfY2ctPmRlZmF1bHRfZ3JvdXBzKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGhiYV9jZy0+ZGVmYXVsdF9ncm91cHNcbiIpOwogCQlnb3RvIG91dF9nbG9iYWw7CiAJfQotCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmc2VfZ2xvYmFsLT5hbHVhX2dyb3VwLAorCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmYWx1YV9ncm91cCwKIAkJCSJhbHVhIiwgJnRhcmdldF9jb3JlX2FsdWFfY2l0KTsKLQloYmFfY2ctPmRlZmF1bHRfZ3JvdXBzWzBdID0gJnNlX2dsb2JhbC0+YWx1YV9ncm91cDsKKwloYmFfY2ctPmRlZmF1bHRfZ3JvdXBzWzBdID0gJmFsdWFfZ3JvdXA7CiAJaGJhX2NnLT5kZWZhdWx0X2dyb3Vwc1sxXSA9IE5VTEw7CiAJLyoKIAkgKiBBZGQgQUxVQSBMb2dpY2FsIFVuaXQgR3JvdXAgYW5kIFRhcmdldCBQb3J0IEdyb3VwIENvbmZpZ0ZTCiAJICogZ3JvdXBzIHVuZGVyIC9zeXMva2VybmVsL2NvbmZpZy90YXJnZXQvY29yZS9hbHVhLwogCSAqLwotCWFsdWFfY2cgPSAmc2VfZ2xvYmFsLT5hbHVhX2dyb3VwOworCWFsdWFfY2cgPSAmYWx1YV9ncm91cDsKIAlhbHVhX2NnLT5kZWZhdWx0X2dyb3VwcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25maWdfZ3JvdXApICogMiwKIAkJCUdGUF9LRVJORUwpOwotCWlmICghKGFsdWFfY2ctPmRlZmF1bHRfZ3JvdXBzKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBhbHVhX2NnLT5kZWZhdWx0X2dyb3Vwc1xuIik7CisJaWYgKCFhbHVhX2NnLT5kZWZhdWx0X2dyb3VwcykgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBhbHVhX2NnLT5kZWZhdWx0X2dyb3Vwc1xuIik7CiAJCWdvdG8gb3V0X2dsb2JhbDsKIAl9CiAKLQljb25maWdfZ3JvdXBfaW5pdF90eXBlX25hbWUoJnNlX2dsb2JhbC0+YWx1YV9sdV9ncHNfZ3JvdXAsCisJY29uZmlnX2dyb3VwX2luaXRfdHlwZV9uYW1lKCZhbHVhX2x1X2dwc19ncm91cCwKIAkJCSJsdV9ncHMiLCAmdGFyZ2V0X2NvcmVfYWx1YV9sdV9ncHNfY2l0KTsKLQlhbHVhX2NnLT5kZWZhdWx0X2dyb3Vwc1swXSA9ICZzZV9nbG9iYWwtPmFsdWFfbHVfZ3BzX2dyb3VwOworCWFsdWFfY2ctPmRlZmF1bHRfZ3JvdXBzWzBdID0gJmFsdWFfbHVfZ3BzX2dyb3VwOwogCWFsdWFfY2ctPmRlZmF1bHRfZ3JvdXBzWzFdID0gTlVMTDsKIAkvKgogCSAqIEFkZCBjb3JlL2FsdWEvbHVfZ3BzL2RlZmF1bHRfbHVfZ3AKQEAgLTMyMDIsMTEgKzMxOTIsMTEgQEAKIAlpZiAoSVNfRVJSKGx1X2dwKSkKIAkJZ290byBvdXRfZ2xvYmFsOwogCi0JbHVfZ3BfY2cgPSAmc2VfZ2xvYmFsLT5hbHVhX2x1X2dwc19ncm91cDsKKwlsdV9ncF9jZyA9ICZhbHVhX2x1X2dwc19ncm91cDsKIAlsdV9ncF9jZy0+ZGVmYXVsdF9ncm91cHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnX2dyb3VwKSAqIDIsCiAJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIShsdV9ncF9jZy0+ZGVmYXVsdF9ncm91cHMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIGx1X2dwX2NnLT5kZWZhdWx0X2dyb3Vwc1xuIik7CisJaWYgKCFsdV9ncF9jZy0+ZGVmYXVsdF9ncm91cHMpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbHVfZ3BfY2ctPmRlZmF1bHRfZ3JvdXBzXG4iKTsKIAkJZ290byBvdXRfZ2xvYmFsOwogCX0KIApAQCAtMzIxNCwxNyArMzIwNCwxNyBAQAogCQkJCSZ0YXJnZXRfY29yZV9hbHVhX2x1X2dwX2NpdCk7CiAJbHVfZ3BfY2ctPmRlZmF1bHRfZ3JvdXBzWzBdID0gJmx1X2dwLT5sdV9ncF9ncm91cDsKIAlsdV9ncF9jZy0+ZGVmYXVsdF9ncm91cHNbMV0gPSBOVUxMOwotCXNlX2dsb2JhbC0+ZGVmYXVsdF9sdV9ncCA9IGx1X2dwOworCWRlZmF1bHRfbHVfZ3AgPSBsdV9ncDsKIAkvKgogCSAqIFJlZ2lzdGVyIHRoZSB0YXJnZXRfY29yZV9tb2Qgc3Vic3lzdGVtIHdpdGggY29uZmlnZnMuCiAJICovCiAJcmV0ID0gY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKHN1YnN5cyk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlZCB3aGlsZSByZWdpc3RlcmluZyBzdWJzeXN0ZW0gJXNcbiIsCisJCXByX2VycigiRXJyb3IgJWQgd2hpbGUgcmVnaXN0ZXJpbmcgc3Vic3lzdGVtICVzXG4iLAogCQkJcmV0LCBzdWJzeXMtPnN1X2dyb3VwLmNnX2l0ZW0uY2lfbmFtZWJ1Zik7CiAJCWdvdG8gb3V0X2dsb2JhbDsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVEFSR0VUX0NPUkVbMF06IEluaXRpYWxpemVkIENvbmZpZ0ZTIEZhYnJpYyIKKwlwcl9kZWJ1ZygiVEFSR0VUX0NPUkVbMF06IEluaXRpYWxpemVkIENvbmZpZ0ZTIEZhYnJpYyIKIAkJIiBJbmZyYXN0cnVjdHVyZTogIlRBUkdFVF9DT1JFX0NPTkZJR0ZTX1ZFUlNJT04iIG9uICVzLyVzIgogCQkiIG9uICJVVFNfUkVMRUFTRSJcbiIsIHV0c25hbWUoKS0+c3lzbmFtZSwgdXRzbmFtZSgpLT5tYWNoaW5lKTsKIAkvKgpAQCAtMzI0NCw5ICszMjM0LDkgQEAKIAljb3JlX2Rldl9yZWxlYXNlX3ZpcnR1YWxfbHVuMCgpOwogCXJkX21vZHVsZV9leGl0KCk7CiBvdXRfZ2xvYmFsOgotCWlmIChzZV9nbG9iYWwtPmRlZmF1bHRfbHVfZ3ApIHsKLQkJY29yZV9hbHVhX2ZyZWVfbHVfZ3Aoc2VfZ2xvYmFsLT5kZWZhdWx0X2x1X2dwKTsKLQkJc2VfZ2xvYmFsLT5kZWZhdWx0X2x1X2dwID0gTlVMTDsKKwlpZiAoZGVmYXVsdF9sdV9ncCkgeworCQljb3JlX2FsdWFfZnJlZV9sdV9ncChkZWZhdWx0X2x1X2dwKTsKKwkJZGVmYXVsdF9sdV9ncCA9IE5VTEw7CiAJfQogCWlmIChsdV9ncF9jZykKIAkJa2ZyZWUobHVfZ3BfY2ctPmRlZmF1bHRfZ3JvdXBzKTsKQEAgLTMyNTUsOCArMzI0NSw4IEBACiAJaWYgKGhiYV9jZykKIAkJa2ZyZWUoaGJhX2NnLT5kZWZhdWx0X2dyb3Vwcyk7CiAJa2ZyZWUodGFyZ2V0X2NnLT5kZWZhdWx0X2dyb3Vwcyk7Ci0JcmVsZWFzZV9zZV9nbG9iYWwoKTsKLQlyZXR1cm4gLTE7CisJcmVsZWFzZV9zZV9rbWVtX2NhY2hlcygpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB0YXJnZXRfY29yZV9leGl0X2NvbmZpZ2ZzKHZvaWQpCkBAIC0zMjY2LDEwICszMjU2LDkgQEAKIAlzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW07CiAJaW50IGk7CiAKLQlzZV9nbG9iYWwtPmluX3NodXRkb3duID0gMTsKIAlzdWJzeXMgPSB0YXJnZXRfY29yZV9zdWJzeXN0ZW1bMF07CiAKLQlsdV9ncF9jZyA9ICZzZV9nbG9iYWwtPmFsdWFfbHVfZ3BzX2dyb3VwOworCWx1X2dwX2NnID0gJmFsdWFfbHVfZ3BzX2dyb3VwOwogCWZvciAoaSA9IDA7IGx1X2dwX2NnLT5kZWZhdWx0X2dyb3Vwc1tpXTsgaSsrKSB7CiAJCWl0ZW0gPSAmbHVfZ3BfY2ctPmRlZmF1bHRfZ3JvdXBzW2ldLT5jZ19pdGVtOwogCQlsdV9ncF9jZy0+ZGVmYXVsdF9ncm91cHNbaV0gPSBOVUxMOwpAQCAtMzI3OCw3ICszMjY3LDcgQEAKIAlrZnJlZShsdV9ncF9jZy0+ZGVmYXVsdF9ncm91cHMpOwogCWx1X2dwX2NnLT5kZWZhdWx0X2dyb3VwcyA9IE5VTEw7CiAKLQlhbHVhX2NnID0gJnNlX2dsb2JhbC0+YWx1YV9ncm91cDsKKwlhbHVhX2NnID0gJmFsdWFfZ3JvdXA7CiAJZm9yIChpID0gMDsgYWx1YV9jZy0+ZGVmYXVsdF9ncm91cHNbaV07IGkrKykgewogCQlpdGVtID0gJmFsdWFfY2ctPmRlZmF1bHRfZ3JvdXBzW2ldLT5jZ19pdGVtOwogCQlhbHVhX2NnLT5kZWZhdWx0X2dyb3Vwc1tpXSA9IE5VTEw7CkBAIC0zMjg3LDcgKzMyNzYsNyBAQAogCWtmcmVlKGFsdWFfY2ctPmRlZmF1bHRfZ3JvdXBzKTsKIAlhbHVhX2NnLT5kZWZhdWx0X2dyb3VwcyA9IE5VTEw7CiAKLQloYmFfY2cgPSAmc2VfZ2xvYmFsLT50YXJnZXRfY29yZV9oYmFncm91cDsKKwloYmFfY2cgPSAmdGFyZ2V0X2NvcmVfaGJhZ3JvdXA7CiAJZm9yIChpID0gMDsgaGJhX2NnLT5kZWZhdWx0X2dyb3Vwc1tpXTsgaSsrKSB7CiAJCWl0ZW0gPSAmaGJhX2NnLT5kZWZhdWx0X2dyb3Vwc1tpXS0+Y2dfaXRlbTsKIAkJaGJhX2NnLT5kZWZhdWx0X2dyb3Vwc1tpXSA9IE5VTEw7CkBAIC0zMzAyLDE3ICszMjkxLDE1IEBACiAJY29uZmlnZnNfdW5yZWdpc3Rlcl9zdWJzeXN0ZW0oc3Vic3lzKTsKIAlrZnJlZShzdWJzeXMtPnN1X2dyb3VwLmRlZmF1bHRfZ3JvdXBzKTsKIAotCWNvcmVfYWx1YV9mcmVlX2x1X2dwKHNlX2dsb2JhbC0+ZGVmYXVsdF9sdV9ncCk7Ci0Jc2VfZ2xvYmFsLT5kZWZhdWx0X2x1X2dwID0gTlVMTDsKKwljb3JlX2FsdWFfZnJlZV9sdV9ncChkZWZhdWx0X2x1X2dwKTsKKwlkZWZhdWx0X2x1X2dwID0gTlVMTDsKIAotCXByaW50ayhLRVJOX0lORk8gIlRBUkdFVF9DT1JFWzBdOiBSZWxlYXNlZCBDb25maWdGUyBGYWJyaWMiCisJcHJfZGVidWcoIlRBUkdFVF9DT1JFWzBdOiBSZWxlYXNlZCBDb25maWdGUyBGYWJyaWMiCiAJCQkiIEluZnJhc3RydWN0dXJlXG4iKTsKIAogCWNvcmVfZGV2X3JlbGVhc2VfdmlydHVhbF9sdW4wKCk7CiAJcmRfbW9kdWxlX2V4aXQoKTsKLQlyZWxlYXNlX3NlX2dsb2JhbCgpOwotCi0JcmV0dXJuOworCXJlbGVhc2Vfc2Vfa21lbV9jYWNoZXMoKTsKIH0KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJUYXJnZXRfQ29yZV9Nb2QvQ29uZmlnRlMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2RldmljZS5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmMKaW5kZXggODQwN2Y5Yy4uYjM4YjZjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRmlsZW5hbWU6ICB0YXJnZXRfY29yZV9kZXZpY2UuYyAoYmFzZWQgb24gaXNjc2lfdGFyZ2V0X2RldmljZS5jKQogICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaVNDU0kgVmlydHVhbCBEZXZpY2UgYW5kIERpc2sgVHJhbnNwb3J0CisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFRDTSBWaXJ0dWFsIERldmljZSBhbmQgRGlzayBUcmFuc3BvcnQKICAqIGFnbm9zdGljIHJlbGF0ZWQgZnVuY3Rpb25zLgogICoKICAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCwgMjAwNSBQeVggVGVjaG5vbG9naWVzLCBJbmMuCkBAIC01NCwxNzYgKzU0LDE4MyBAQAogc3RhdGljIHZvaWQgc2VfZGV2X3N0YXJ0KHN0cnVjdCBzZV9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBzZV9kZXZfc3RvcChzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYpOwogCi1pbnQgdHJhbnNwb3J0X2dldF9sdW5fZm9yX2NtZCgKLQlzdHJ1Y3Qgc2VfY21kICpzZV9jbWQsCi0JdW5zaWduZWQgY2hhciAqY2RiLAotCXUzMiB1bnBhY2tlZF9sdW4pCitzdGF0aWMgc3RydWN0IHNlX2hiYSAqbHVuMF9oYmE7CitzdGF0aWMgc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKmx1bjBfc3VfZGV2OworLyogbm90IHN0YXRpYywgbmVlZGVkIGJ5IHRwZy5jICovCitzdHJ1Y3Qgc2VfZGV2aWNlICpnX2x1bjBfZGV2OworCitpbnQgdHJhbnNwb3J0X2xvb2t1cF9jbWRfbHVuKHN0cnVjdCBzZV9jbWQgKnNlX2NtZCwgdTMyIHVucGFja2VkX2x1bikKIHsKLQlzdHJ1Y3Qgc2VfZGV2X2VudHJ5ICpkZXZlOwogCXN0cnVjdCBzZV9sdW4gKnNlX2x1biA9IE5VTEw7Ci0Jc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MgPSBTRV9TRVNTKHNlX2NtZCk7CisJc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MgPSBzZV9jbWQtPnNlX3Nlc3M7CisJc3RydWN0IHNlX2RldmljZSAqZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJlYWRfb25seSA9IDA7CiAKLQlzcGluX2xvY2tfaXJxKCZTRV9OT0RFX0FDTChzZV9zZXNzKS0+ZGV2aWNlX2xpc3RfbG9jayk7Ci0JZGV2ZSA9IHNlX2NtZC0+c2VfZGV2ZSA9Ci0JCQkmU0VfTk9ERV9BQ0woc2Vfc2VzcyktPmRldmljZV9saXN0W3VucGFja2VkX2x1bl07Ci0JaWYgKGRldmUtPmx1bl9mbGFncyAmIFRSQU5TUE9SVF9MVU5GTEFHU19JTklUSUFUT1JfQUNDRVNTKSB7Ci0JCWlmIChzZV9jbWQpIHsKLQkJCWRldmUtPnRvdGFsX2NtZHMrKzsKLQkJCWRldmUtPnRvdGFsX2J5dGVzICs9IHNlX2NtZC0+ZGF0YV9sZW5ndGg7Ci0KLQkJCWlmIChzZV9jbWQtPmRhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKLQkJCQlpZiAoZGV2ZS0+bHVuX2ZsYWdzICYKLQkJCQkJCVRSQU5TUE9SVF9MVU5GTEFHU19SRUFEX09OTFkpIHsKLQkJCQkJcmVhZF9vbmx5ID0gMTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJCWRldmUtPndyaXRlX2J5dGVzICs9IHNlX2NtZC0+ZGF0YV9sZW5ndGg7Ci0JCQl9IGVsc2UgaWYgKHNlX2NtZC0+ZGF0YV9kaXJlY3Rpb24gPT0KLQkJCQkgICBETUFfRlJPTV9ERVZJQ0UpIHsKLQkJCQlkZXZlLT5yZWFkX2J5dGVzICs9IHNlX2NtZC0+ZGF0YV9sZW5ndGg7Ci0JCQl9Ci0JCX0KLQkJZGV2ZS0+ZGV2ZV9jbWRzKys7Ci0KLQkJc2VfbHVuID0gc2VfY21kLT5zZV9sdW4gPSBkZXZlLT5zZV9sdW47Ci0JCXNlX2NtZC0+cHJfcmVzX2tleSA9IGRldmUtPnByX3Jlc19rZXk7Ci0JCXNlX2NtZC0+b3JpZ19mZV9sdW4gPSB1bnBhY2tlZF9sdW47Ci0JCXNlX2NtZC0+c2Vfb3JpZ19vYmpfcHRyID0gU0VfTFVOKHNlX2NtZCktPmx1bl9zZV9kZXY7Ci0JCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TRV9MVU5fQ01EOworCWlmICh1bnBhY2tlZF9sdW4gPj0gVFJBTlNQT1JUX01BWF9MVU5TX1BFUl9UUEcpIHsKKwkJc2VfY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9OT05fRVhJU1RFTlRfTFVOOworCQlzZV9jbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DREJfRVhDRVBUSU9OOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZTRV9OT0RFX0FDTChzZV9zZXNzKS0+ZGV2aWNlX2xpc3RfbG9jayk7CiAKLQlpZiAoIXNlX2x1bikgewotCQlpZiAocmVhZF9vbmx5KSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlX3Nlc3MtPnNlX25vZGVfYWNsLT5kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisJc2VfY21kLT5zZV9kZXZlID0gJnNlX3Nlc3MtPnNlX25vZGVfYWNsLT5kZXZpY2VfbGlzdFt1bnBhY2tlZF9sdW5dOworCWlmIChzZV9jbWQtPnNlX2RldmUtPmx1bl9mbGFncyAmIFRSQU5TUE9SVF9MVU5GTEFHU19JTklUSUFUT1JfQUNDRVNTKSB7CisJCXN0cnVjdCBzZV9kZXZfZW50cnkgKmRldmUgPSBzZV9jbWQtPnNlX2RldmU7CisKKwkJZGV2ZS0+dG90YWxfY21kcysrOworCQlkZXZlLT50b3RhbF9ieXRlcyArPSBzZV9jbWQtPmRhdGFfbGVuZ3RoOworCisJCWlmICgoc2VfY21kLT5kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSAmJgorCQkgICAgKGRldmUtPmx1bl9mbGFncyAmIFRSQU5TUE9SVF9MVU5GTEFHU19SRUFEX09OTFkpKSB7CiAJCQlzZV9jbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1dSSVRFX1BST1RFQ1RFRDsKIAkJCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047Ci0JCQlwcmludGsoIlRBUkdFVF9DT1JFWyVzXTogRGV0ZWN0ZWQgV1JJVEVfUFJPVEVDVEVEIExVTiIKKwkJCXByX2VycigiVEFSR0VUX0NPUkVbJXNdOiBEZXRlY3RlZCBXUklURV9QUk9URUNURUQgTFVOIgogCQkJCSIgQWNjZXNzIGZvciAweCUwOHhcbiIsCi0JCQkJQ01EX1RGTyhzZV9jbWQpLT5nZXRfZmFicmljX25hbWUoKSwKKwkJCQlzZV9jbWQtPnNlX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCiAJCQkJdW5wYWNrZWRfbHVuKTsKLQkJCXJldHVybiAtMTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBVc2UgdGhlIHNlX3BvcnRhbF9ncm91cC0+dHBnX3ZpcnRfbHVuMCB0byBhbGxvdyBmb3IKLQkJCSAqIFJFUE9SVF9MVU5TLCBldCBhbCB0byBiZSByZXR1cm5lZCB3aGVuIG5vIGFjdGl2ZQotCQkJICogTWFwcGVkTFVOPTAgZXhpc3RzIGZvciB0aGlzIEluaXRpYXRvciBQb3J0LgotCQkJICovCi0JCQlpZiAodW5wYWNrZWRfbHVuICE9IDApIHsKLQkJCQlzZV9jbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX05PTl9FWElTVEVOVF9MVU47Ci0JCQkJc2VfY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTjsKLQkJCQlwcmludGsoIlRBUkdFVF9DT1JFWyVzXTogRGV0ZWN0ZWQgTk9OX0VYSVNURU5UX0xVTiIKLQkJCQkJIiBBY2Nlc3MgZm9yIDB4JTA4eFxuIiwKLQkJCQkJQ01EX1RGTyhzZV9jbWQpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJCQkJdW5wYWNrZWRfbHVuKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQkvKgotCQkJICogRm9yY2UgV1JJVEUgUFJPVEVDVCBmb3IgdmlydHVhbCBMVU4gMAotCQkJICovCi0JCQlpZiAoKHNlX2NtZC0+ZGF0YV9kaXJlY3Rpb24gIT0gRE1BX0ZST01fREVWSUNFKSAmJgotCQkJICAgIChzZV9jbWQtPmRhdGFfZGlyZWN0aW9uICE9IERNQV9OT05FKSkgewotCQkJCXNlX2NtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fV1JJVEVfUFJPVEVDVEVEOwotCQkJCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotI2lmIDAKLQkJCXByaW50aygiVEFSR0VUX0NPUkVbJXNdOiBVc2luZyB2aXJ0dWFsIExVTjAhIDotKVxuIiwKLQkJCQlDTURfVEZPKHNlX2NtZCktPmdldF9mYWJyaWNfbmFtZSgpKTsKLSNlbmRpZgotCQkJc2VfbHVuID0gc2VfY21kLT5zZV9sdW4gPSAmc2Vfc2Vzcy0+c2VfdHBnLT50cGdfdmlydF9sdW4wOwotCQkJc2VfY21kLT5vcmlnX2ZlX2x1biA9IDA7Ci0JCQlzZV9jbWQtPnNlX29yaWdfb2JqX3B0ciA9IFNFX0xVTihzZV9jbWQpLT5sdW5fc2VfZGV2OwotCQkJc2VfY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NFX0xVTl9DTUQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZV9zZXNzLT5zZV9ub2RlX2FjbC0+ZGV2aWNlX2xpc3RfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FQUNDRVM7CiAJCX0KKworCQlpZiAoc2VfY21kLT5kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorCQkJZGV2ZS0+d3JpdGVfYnl0ZXMgKz0gc2VfY21kLT5kYXRhX2xlbmd0aDsKKwkJZWxzZSBpZiAoc2VfY21kLT5kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpCisJCQlkZXZlLT5yZWFkX2J5dGVzICs9IHNlX2NtZC0+ZGF0YV9sZW5ndGg7CisKKwkJZGV2ZS0+ZGV2ZV9jbWRzKys7CisKKwkJc2VfbHVuID0gZGV2ZS0+c2VfbHVuOworCQlzZV9jbWQtPnNlX2x1biA9IGRldmUtPnNlX2x1bjsKKwkJc2VfY21kLT5wcl9yZXNfa2V5ID0gZGV2ZS0+cHJfcmVzX2tleTsKKwkJc2VfY21kLT5vcmlnX2ZlX2x1biA9IHVucGFja2VkX2x1bjsKKwkJc2VfY21kLT5zZV9vcmlnX29ial9wdHIgPSBzZV9jbWQtPnNlX2x1bi0+bHVuX3NlX2RldjsKKwkJc2VfY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NFX0xVTl9DTUQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlX3Nlc3MtPnNlX25vZGVfYWNsLT5kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoIXNlX2x1bikgeworCQkvKgorCQkgKiBVc2UgdGhlIHNlX3BvcnRhbF9ncm91cC0+dHBnX3ZpcnRfbHVuMCB0byBhbGxvdyBmb3IKKwkJICogUkVQT1JUX0xVTlMsIGV0IGFsIHRvIGJlIHJldHVybmVkIHdoZW4gbm8gYWN0aXZlCisJCSAqIE1hcHBlZExVTj0wIGV4aXN0cyBmb3IgdGhpcyBJbml0aWF0b3IgUG9ydC4KKwkJICovCisJCWlmICh1bnBhY2tlZF9sdW4gIT0gMCkgeworCQkJc2VfY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9OT05fRVhJU1RFTlRfTFVOOworCQkJc2VfY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTjsKKwkJCXByX2VycigiVEFSR0VUX0NPUkVbJXNdOiBEZXRlY3RlZCBOT05fRVhJU1RFTlRfTFVOIgorCQkJCSIgQWNjZXNzIGZvciAweCUwOHhcbiIsCisJCQkJc2VfY21kLT5zZV90Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAorCQkJCXVucGFja2VkX2x1bik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQkvKgorCQkgKiBGb3JjZSBXUklURSBQUk9URUNUIGZvciB2aXJ0dWFsIExVTiAwCisJCSAqLworCQlpZiAoKHNlX2NtZC0+ZGF0YV9kaXJlY3Rpb24gIT0gRE1BX0ZST01fREVWSUNFKSAmJgorCQkgICAgKHNlX2NtZC0+ZGF0YV9kaXJlY3Rpb24gIT0gRE1BX05PTkUpKSB7CisJCQlzZV9jbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1dSSVRFX1BST1RFQ1RFRDsKKwkJCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQorCisJCXNlX2x1biA9ICZzZV9zZXNzLT5zZV90cGctPnRwZ192aXJ0X2x1bjA7CisJCXNlX2NtZC0+c2VfbHVuID0gJnNlX3Nlc3MtPnNlX3RwZy0+dHBnX3ZpcnRfbHVuMDsKKwkJc2VfY21kLT5vcmlnX2ZlX2x1biA9IDA7CisJCXNlX2NtZC0+c2Vfb3JpZ19vYmpfcHRyID0gc2VfY21kLT5zZV9sdW4tPmx1bl9zZV9kZXY7CisJCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TRV9MVU5fQ01EOwogCX0KIAkvKgogCSAqIERldGVybWluZSBpZiB0aGUgc3RydWN0IHNlX2x1biBpcyBvbmxpbmUuCisJICogRklYTUU6IENoZWNrIGZvciBMVU5fUkVTRVQgKyBVTklUIEF0dGVudGlvbgogCSAqLwotLyogI3dhcm5pbmcgRklYTUU6IENoZWNrIGZvciBMVU5fUkVTRVQgKyBVTklUIEF0dGVudGlvbiAqLwogCWlmIChzZV9kZXZfY2hlY2tfb25saW5lKHNlX2x1bi0+bHVuX3NlX2RldikgIT0gMCkgewogCQlzZV9jbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX05PTl9FWElTVEVOVF9MVU47CiAJCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JewotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IHNlX2x1bi0+bHVuX3NlX2RldjsKLQlzcGluX2xvY2tfaXJxKCZkZXYtPnN0YXRzX2xvY2spOworCS8qIERpcmVjdGx5IGFzc29jaWF0ZSBjbWQgd2l0aCBzZV9kZXYgKi8KKwlzZV9jbWQtPnNlX2RldiA9IHNlX2x1bi0+bHVuX3NlX2RldjsKKworCS8qIFRPRE86IGdldCByaWQgb2YgdGhpcyBhbmQgdXNlIGF0b21pY3MgZm9yIHN0YXRzICovCisJZGV2ID0gc2VfbHVuLT5sdW5fc2VfZGV2OworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnN0YXRzX2xvY2ssIGZsYWdzKTsKIAlkZXYtPm51bV9jbWRzKys7CiAJaWYgKHNlX2NtZC0+ZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKIAkJZGV2LT53cml0ZV9ieXRlcyArPSBzZV9jbWQtPmRhdGFfbGVuZ3RoOwogCWVsc2UgaWYgKHNlX2NtZC0+ZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQogCQlkZXYtPnJlYWRfYnl0ZXMgKz0gc2VfY21kLT5kYXRhX2xlbmd0aDsKLQlzcGluX3VubG9ja19pcnEoJmRldi0+c3RhdHNfbG9jayk7Ci0JfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3RhdHNfbG9jaywgZmxhZ3MpOwogCiAJLyoKIAkgKiBBZGQgdGhlIGlzY3NpX2NtZF90IHRvIHRoZSBzdHJ1Y3Qgc2VfbHVuJ3MgY21kIGxpc3QuICBUaGlzIGxpc3QgaXMgdXNlZAogCSAqIGZvciB0cmFja2luZyBzdGF0ZSBvZiBzdHJ1Y3Qgc2VfY21kcyBkdXJpbmcgTFVOIHNodXRkb3duIGV2ZW50cy4KIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2VfbHVuLT5sdW5fY21kX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZzZV9jbWQtPnNlX2x1bl9saXN0LCAmc2VfbHVuLT5sdW5fY21kX2xpc3QpOwotCWF0b21pY19zZXQoJlRfVEFTSyhzZV9jbWQpLT50cmFuc3BvcnRfbHVuX2FjdGl2ZSwgMSk7Ci0jaWYgMAotCXByaW50ayhLRVJOX0lORk8gIkFkZGluZyBJVFQ6IDB4JTA4eCB0byBMVU4gTElTVFslZF1cbiIsCi0JCUNNRF9URk8oc2VfY21kKS0+Z2V0X3Rhc2tfdGFnKHNlX2NtZCksIHNlX2x1bi0+dW5wYWNrZWRfbHVuKTsKLSNlbmRpZgorCWxpc3RfYWRkX3RhaWwoJnNlX2NtZC0+c2VfbHVuX25vZGUsICZzZV9sdW4tPmx1bl9jbWRfbGlzdCk7CisJYXRvbWljX3NldCgmc2VfY21kLT50cmFuc3BvcnRfbHVuX2FjdGl2ZSwgMSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VfbHVuLT5sdW5fY21kX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZ2V0X2x1bl9mb3JfY21kKTsKK0VYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2xvb2t1cF9jbWRfbHVuKTsKIAotaW50IHRyYW5zcG9ydF9nZXRfbHVuX2Zvcl90bXIoCi0Jc3RydWN0IHNlX2NtZCAqc2VfY21kLAotCXUzMiB1bnBhY2tlZF9sdW4pCitpbnQgdHJhbnNwb3J0X2xvb2t1cF90bXJfbHVuKHN0cnVjdCBzZV9jbWQgKnNlX2NtZCwgdTMyIHVucGFja2VkX2x1bikKIHsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBOVUxMOwogCXN0cnVjdCBzZV9kZXZfZW50cnkgKmRldmU7CiAJc3RydWN0IHNlX2x1biAqc2VfbHVuID0gTlVMTDsKLQlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzcyA9IFNFX1NFU1Moc2VfY21kKTsKKwlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzcyA9IHNlX2NtZC0+c2Vfc2VzczsKIAlzdHJ1Y3Qgc2VfdG1yX3JlcSAqc2VfdG1yID0gc2VfY21kLT5zZV90bXJfcmVxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxKCZTRV9OT0RFX0FDTChzZV9zZXNzKS0+ZGV2aWNlX2xpc3RfbG9jayk7Ci0JZGV2ZSA9IHNlX2NtZC0+c2VfZGV2ZSA9Ci0JCQkmU0VfTk9ERV9BQ0woc2Vfc2VzcyktPmRldmljZV9saXN0W3VucGFja2VkX2x1bl07CisJaWYgKHVucGFja2VkX2x1biA+PSBUUkFOU1BPUlRfTUFYX0xVTlNfUEVSX1RQRykgeworCQlzZV9jbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX05PTl9FWElTVEVOVF9MVU47CisJCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZV9zZXNzLT5zZV9ub2RlX2FjbC0+ZGV2aWNlX2xpc3RfbG9jaywgZmxhZ3MpOworCXNlX2NtZC0+c2VfZGV2ZSA9ICZzZV9zZXNzLT5zZV9ub2RlX2FjbC0+ZGV2aWNlX2xpc3RbdW5wYWNrZWRfbHVuXTsKKwlkZXZlID0gc2VfY21kLT5zZV9kZXZlOworCiAJaWYgKGRldmUtPmx1bl9mbGFncyAmIFRSQU5TUE9SVF9MVU5GTEFHU19JTklUSUFUT1JfQUNDRVNTKSB7Ci0JCXNlX2x1biA9IHNlX2NtZC0+c2VfbHVuID0gc2VfdG1yLT50bXJfbHVuID0gZGV2ZS0+c2VfbHVuOwotCQlkZXYgPSBzZV90bXItPnRtcl9kZXYgPSBzZV9sdW4tPmx1bl9zZV9kZXY7CisJCXNlX3Rtci0+dG1yX2x1biA9IGRldmUtPnNlX2x1bjsKKwkJc2VfY21kLT5zZV9sdW4gPSBkZXZlLT5zZV9sdW47CisJCXNlX2x1biA9IGRldmUtPnNlX2x1bjsKIAkJc2VfY21kLT5wcl9yZXNfa2V5ID0gZGV2ZS0+cHJfcmVzX2tleTsKIAkJc2VfY21kLT5vcmlnX2ZlX2x1biA9IHVucGFja2VkX2x1bjsKLQkJc2VfY21kLT5zZV9vcmlnX29ial9wdHIgPSBTRV9MVU4oc2VfY21kKS0+bHVuX3NlX2RldjsKLS8qCQlzZV9jbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0VfTFVOX0NNRDsgKi8KKwkJc2VfY21kLT5zZV9vcmlnX29ial9wdHIgPSBzZV9jbWQtPnNlX2RldjsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZTRV9OT0RFX0FDTChzZV9zZXNzKS0+ZGV2aWNlX2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wtPmRldmljZV9saXN0X2xvY2ssIGZsYWdzKTsKIAogCWlmICghc2VfbHVuKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlRBUkdFVF9DT1JFWyVzXTogRGV0ZWN0ZWQgTk9OX0VYSVNURU5UX0xVTiIKKwkJcHJfZGVidWcoIlRBUkdFVF9DT1JFWyVzXTogRGV0ZWN0ZWQgTk9OX0VYSVNURU5UX0xVTiIKIAkJCSIgQWNjZXNzIGZvciAweCUwOHhcbiIsCi0JCQlDTURfVEZPKHNlX2NtZCktPmdldF9mYWJyaWNfbmFtZSgpLAorCQkJc2VfY21kLT5zZV90Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJdW5wYWNrZWRfbHVuKTsKIAkJc2VfY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTjsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJLyoKIAkgKiBEZXRlcm1pbmUgaWYgdGhlIHN0cnVjdCBzZV9sdW4gaXMgb25saW5lLgorCSAqIEZJWE1FOiBDaGVjayBmb3IgTFVOX1JFU0VUICsgVU5JVCBBdHRlbnRpb24KIAkgKi8KLS8qICN3YXJuaW5nIEZJWE1FOiBDaGVjayBmb3IgTFVOX1JFU0VUICsgVU5JVCBBdHRlbnRpb24gKi8KIAlpZiAoc2VfZGV2X2NoZWNrX29ubGluZShzZV9sdW4tPmx1bl9zZV9kZXYpICE9IDApIHsKIAkJc2VfY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTjsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlzcGluX2xvY2soJmRldi0+c2VfdG1yX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJnNlX3Rtci0+dG1yX2xpc3QsICZkZXYtPmRldl90bXJfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmRldi0+c2VfdG1yX2xvY2spOworCS8qIERpcmVjdGx5IGFzc29jaWF0ZSBjbWQgd2l0aCBzZV9kZXYgKi8KKwlzZV9jbWQtPnNlX2RldiA9IHNlX2x1bi0+bHVuX3NlX2RldjsKKwlzZV90bXItPnRtcl9kZXYgPSBzZV9sdW4tPmx1bl9zZV9kZXY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VfdG1yLT50bXJfZGV2LT5zZV90bXJfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnNlX3Rtci0+dG1yX2xpc3QsICZzZV90bXItPnRtcl9kZXYtPmRldl90bXJfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VfdG1yLT50bXJfZGV2LT5zZV90bXJfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHRyYW5zcG9ydF9nZXRfbHVuX2Zvcl90bXIpOworRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfbG9va3VwX3Rtcl9sdW4pOwogCiAvKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3JlZ2lzdGVyX2FuZF9tb3ZlKCkKQEAgLTI0OCwxNyArMjU1LDE3IEBACiAJCQljb250aW51ZTsKIAogCQlsdW4gPSBkZXZlLT5zZV9sdW47Ci0JCWlmICghKGx1bikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXMgZGV2aWNlIGVudHJpZXMgZGV2aWNlIHBvaW50ZXIgaXMiCisJCWlmICghbHVuKSB7CisJCQlwcl9lcnIoIiVzIGRldmljZSBlbnRyaWVzIGRldmljZSBwb2ludGVyIGlzIgogCQkJCSIgTlVMTCwgYnV0IEluaXRpYXRvciBoYXMgYWNjZXNzLlxuIiwKLQkJCQlUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpKTsKKwkJCQl0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXBvcnQgPSBsdW4tPmx1bl9zZXA7Ci0JCWlmICghKHBvcnQpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzIGRldmljZSBlbnRyaWVzIGRldmljZSBwb2ludGVyIGlzIgorCQlpZiAoIXBvcnQpIHsKKwkJCXByX2VycigiJXMgZGV2aWNlIGVudHJpZXMgZGV2aWNlIHBvaW50ZXIgaXMiCiAJCQkJIiBOVUxMLCBidXQgSW5pdGlhdG9yIGhhcyBhY2Nlc3MuXG4iLAotCQkJCVRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCkpOworCQkJCXRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCkpOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKHBvcnQtPnNlcF9ydHBpICE9IHJ0cGkpCkBAIC0yOTQsOSArMzAxLDkgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmICghZGV2ZS0+c2VfbHVuKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzIGRldmljZSBlbnRyaWVzIGRldmljZSBwb2ludGVyIGlzIgorCQkJcHJfZXJyKCIlcyBkZXZpY2UgZW50cmllcyBkZXZpY2UgcG9pbnRlciBpcyIKIAkJCQkiIE5VTEwsIGJ1dCBJbml0aWF0b3IgaGFzIGFjY2Vzcy5cbiIsCi0JCQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSk7CisJCQkJdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSk7CiAJCQljb250aW51ZTsKIAkJfQogCQlsdW4gPSBkZXZlLT5zZV9sdW47CkBAIC0zMjIsOCArMzI5LDYgQEAKIAlkZXZlID0gJnNlX25hY2wtPmRldmljZV9saXN0W3NlX2NtZC0+b3JpZ19mZV9sdW5dOwogCWRldmUtPmRldmVfY21kcy0tOwogCXNwaW5fdW5sb2NrX2lycSgmc2VfbmFjbC0+ZGV2aWNlX2xpc3RfbG9jayk7Ci0KLQlyZXR1cm47CiB9CiAKIHZvaWQgY29yZV91cGRhdGVfZGV2aWNlX2xpc3RfYWNjZXNzKApAQCAtMzQzLDggKzM0OCw2IEBACiAJCWRldmUtPmx1bl9mbGFncyB8PSBUUkFOU1BPUlRfTFVORkxBR1NfUkVBRF9PTkxZOwogCX0KIAlzcGluX3VubG9ja19pcnEoJm5hY2wtPmRldmljZV9saXN0X2xvY2spOwotCi0JcmV0dXJuOwogfQogCiAvKiAgICAgIGNvcmVfdXBkYXRlX2RldmljZV9saXN0X2Zvcl9ub2RlKCk6CkBAIC0zNjksNyArMzcyLDcgQEAKIAkgKiBzdHJ1Y3Qgc2VfZGV2X2VudHJ5IHBvaW50ZXJzIGJlbG93IGFzIGxvZ2ljIGluCiAJICogY29yZV9hbHVhX2RvX3RyYW5zaXRpb25fdGdfcHQoKSBkZXBlbmRzIG9uIHRoZXNlIGJlaW5nIHByZXNlbnQuCiAJICovCi0JaWYgKCEoZW5hYmxlKSkgeworCWlmICghZW5hYmxlKSB7CiAJCS8qCiAJCSAqIGRldmUtPnNlX2x1bl9hY2wgd2lsbCBiZSBOVUxMIGZvciBkZW1vLW1vZGUgY3JlYXRlZCBMVU5zCiAJCSAqIHRoYXQgaGF2ZSBub3QgYmVlbiBleHBsaWNpdGx5IGNvbmNlcnRlZCB0byBNYXBwZWRMVU5zIC0+CkBAIC0zOTIsMTggKzM5NSwxOCBAQAogCQkgKi8KIAkJaWYgKGRldmUtPmx1bl9mbGFncyAmIFRSQU5TUE9SVF9MVU5GTEFHU19JTklUSUFUT1JfQUNDRVNTKSB7CiAJCQlpZiAoZGV2ZS0+c2VfbHVuX2FjbCAhPSBOVUxMKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJzdHJ1Y3Qgc2VfZGV2X2VudHJ5LT5zZV9sdW5fYWNsIgorCQkJCXByX2Vycigic3RydWN0IHNlX2Rldl9lbnRyeS0+c2VfbHVuX2FjbCIKIAkJCQkJIiBhbHJlYWR5IHNldCBmb3IgZGVtbyBtb2RlIC0+IGV4cGxpY3QiCiAJCQkJCSIgTFVOIEFDTCB0cmFuc2l0aW9uXG4iKTsKIAkJCQlzcGluX3VubG9ja19pcnEoJm5hY2wtPmRldmljZV9saXN0X2xvY2spOwotCQkJCXJldHVybiAtMTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWlmIChkZXZlLT5zZV9sdW4gIT0gbHVuKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJzdHJ1Y3Qgc2VfZGV2X2VudHJ5LT5zZV9sdW4gZG9lcyIKKwkJCQlwcl9lcnIoInN0cnVjdCBzZV9kZXZfZW50cnktPnNlX2x1biBkb2VzIgogCQkJCQkiIG1hdGNoIHBhc3NlZCBzdHJ1Y3Qgc2VfbHVuIGZvciBkZW1vIG1vZGUiCiAJCQkJCSIgLT4gZXhwbGljdCBMVU4gQUNMIHRyYW5zaXRpb25cbiIpOwogCQkJCXNwaW5fdW5sb2NrX2lycSgmbmFjbC0+ZGV2aWNlX2xpc3RfbG9jayk7Ci0JCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJZGV2ZS0+c2VfbHVuX2FjbCA9IGx1bl9hY2w7CiAJCQl0cmFucyA9IDE7CkBAIC00OTEsOCArNDk0LDYgQEAKIAkJc3Bpbl9sb2NrX2JoKCZ0cGctPmFjbF9ub2RlX2xvY2spOwogCX0KIAlzcGluX3VubG9ja19iaCgmdHBnLT5hY2xfbm9kZV9sb2NrKTsKLQotCXJldHVybjsKIH0KIAogc3RhdGljIHN0cnVjdCBzZV9wb3J0ICpjb3JlX2FsbG9jX3BvcnQoc3RydWN0IHNlX2RldmljZSAqZGV2KQpAQCAtNTAwLDkgKzUwMSw5IEBACiAJc3RydWN0IHNlX3BvcnQgKnBvcnQsICpwb3J0X3RtcDsKIAogCXBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VfcG9ydCksIEdGUF9LRVJORUwpOwotCWlmICghKHBvcnQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBzZV9wb3J0XG4iKTsKLQkJcmV0dXJuIE5VTEw7CisJaWYgKCFwb3J0KSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBzZV9wb3J0XG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCUlOSVRfTElTVF9IRUFEKCZwb3J0LT5zZXBfYWx1YV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmcG9ydC0+c2VwX2xpc3QpOwpAQCAtNTEyLDEwICs1MTMsMTAgQEAKIAogCXNwaW5fbG9jaygmZGV2LT5zZV9wb3J0X2xvY2spOwogCWlmIChkZXYtPmRldl9wb3J0X2NvdW50ID09IDB4MDAwMGZmZmYpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVhY2hlZCBkZXYtPmRldl9wb3J0X2NvdW50ID09IgorCQlwcl93YXJuKCJSZWFjaGVkIGRldi0+ZGV2X3BvcnRfY291bnQgPT0iCiAJCQkJIiAweDAwMDBmZmZmXG4iKTsKIAkJc3Bpbl91bmxvY2soJmRldi0+c2VfcG9ydF9sb2NrKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOwogCX0KIGFnYWluOgogCS8qCkBAIC01MzEsNyArNTMyLDcgQEAKIAkgKiAzaCB0byBGRkZGaCAgICBSZWxhdGl2ZSBwb3J0IDMgdGhyb3VnaCA2NSA1MzUKIAkgKi8KIAlwb3J0LT5zZXBfcnRwaSA9IGRldi0+ZGV2X3JwdGlfY291bnRlcisrOwotCWlmICghKHBvcnQtPnNlcF9ydHBpKSkKKwlpZiAoIXBvcnQtPnNlcF9ydHBpKQogCQlnb3RvIGFnYWluOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0X3RtcCwgJmRldi0+ZGV2X3NlcF9saXN0LCBzZXBfbGlzdCkgewpAQCAtNTUzLDcgKzU1NCw3IEBACiAJc3RydWN0IHNlX3BvcnQgKnBvcnQsCiAJc3RydWN0IHNlX2x1biAqbHVuKQogewotCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBTVV9ERVYoZGV2KTsKKwlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gZGV2LT5zZV9zdWJfZGV2OwogCXN0cnVjdCB0MTBfYWx1YV90Z19wdF9ncF9tZW1iZXIgKnRnX3B0X2dwX21lbSA9IE5VTEw7CiAKIAlzcGluX2xvY2soJmRldi0+c2VfcG9ydF9sb2NrKTsKQEAgLTU2NiwyMCArNTY3LDIwIEBACiAJbGlzdF9hZGRfdGFpbCgmcG9ydC0+c2VwX2xpc3QsICZkZXYtPmRldl9zZXBfbGlzdCk7CiAJc3Bpbl91bmxvY2soJmRldi0+c2VfcG9ydF9sb2NrKTsKIAotCWlmIChUMTBfQUxVQShzdV9kZXYpLT5hbHVhX3R5cGUgPT0gU1BDM19BTFVBX0VNVUxBVEVEKSB7CisJaWYgKHN1X2Rldi0+dDEwX2FsdWEuYWx1YV90eXBlID09IFNQQzNfQUxVQV9FTVVMQVRFRCkgewogCQl0Z19wdF9ncF9tZW0gPSBjb3JlX2FsdWFfYWxsb2NhdGVfdGdfcHRfZ3BfbWVtKHBvcnQpOwogCQlpZiAoSVNfRVJSKHRnX3B0X2dwX21lbSkgfHwgIXRnX3B0X2dwX21lbSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgdDEwX2FsdWFfdGdfcHQiCisJCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSB0MTBfYWx1YV90Z19wdCIKIAkJCQkJIl9ncF9tZW1iZXJfdFxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAkJc3Bpbl9sb2NrKCZ0Z19wdF9ncF9tZW0tPnRnX3B0X2dwX21lbV9sb2NrKTsKIAkJX19jb3JlX2FsdWFfYXR0YWNoX3RnX3B0X2dwX21lbSh0Z19wdF9ncF9tZW0sCi0JCQlUMTBfQUxVQShzdV9kZXYpLT5kZWZhdWx0X3RnX3B0X2dwKTsKKwkJCXN1X2Rldi0+dDEwX2FsdWEuZGVmYXVsdF90Z19wdF9ncCk7CiAJCXNwaW5fdW5sb2NrKCZ0Z19wdF9ncF9tZW0tPnRnX3B0X2dwX21lbV9sb2NrKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMvJXM6IEFkZGluZyB0byBkZWZhdWx0IEFMVUEgVGFyZ2V0IFBvcnQiCisJCXByX2RlYnVnKCIlcy8lczogQWRkaW5nIHRvIGRlZmF1bHQgQUxVQSBUYXJnZXQgUG9ydCIKIAkJCSIgR3JvdXA6IGFsdWEvZGVmYXVsdF90Z19wdF9ncFxuIiwKLQkJCVRSQU5TUE9SVChkZXYpLT5uYW1lLCBUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpKTsKKwkJCWRldi0+dHJhbnNwb3J0LT5uYW1lLCB0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpKTsKIAl9CiAKIAlkZXYtPmRldl9wb3J0X2NvdW50Kys7CkBAIC02MDYsOCArNjA3LDYgQEAKIAlsaXN0X2RlbCgmcG9ydC0+c2VwX2xpc3QpOwogCWRldi0+ZGV2X3BvcnRfY291bnQtLTsKIAlrZnJlZShwb3J0KTsKLQotCXJldHVybjsKIH0KIAogaW50IGNvcmVfZGV2X2V4cG9ydCgKQEAgLTYxOCw4ICs2MTcsOCBAQAogCXN0cnVjdCBzZV9wb3J0ICpwb3J0OwogCiAJcG9ydCA9IGNvcmVfYWxsb2NfcG9ydChkZXYpOwotCWlmICghKHBvcnQpKQotCQlyZXR1cm4gLTE7CisJaWYgKElTX0VSUihwb3J0KSkKKwkJcmV0dXJuIFBUUl9FUlIocG9ydCk7CiAKIAlsdW4tPmx1bl9zZV9kZXYgPSBkZXY7CiAJc2VfZGV2X3N0YXJ0KGRldik7CkBAIC02NTYsMzMgKzY1NSwzNSBAQAogewogCXN0cnVjdCBzZV9kZXZfZW50cnkgKmRldmU7CiAJc3RydWN0IHNlX2x1biAqc2VfbHVuOwotCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gU0VfU0VTUyhzZV9jbWQpOworCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gc2VfY21kLT5zZV9zZXNzOwogCXN0cnVjdCBzZV90YXNrICpzZV90YXNrOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopVF9UQVNLKHNlX2NtZCktPnRfdGFza19idWY7CisJdW5zaWduZWQgY2hhciAqYnVmOwogCXUzMiBjZGJfb2Zmc2V0ID0gMCwgbHVuX2NvdW50ID0gMCwgb2Zmc2V0ID0gOCwgaTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VfdGFzaywgJlRfVEFTSyhzZV9jbWQpLT50X3Rhc2tfbGlzdCwgdF9saXN0KQorCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VfdGFzaywgJnNlX2NtZC0+dF90YXNrX2xpc3QsIHRfbGlzdCkKIAkJYnJlYWs7CiAKLQlpZiAoIShzZV90YXNrKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBsb2NhdGUgc3RydWN0IHNlX3Rhc2sgZm9yIHN0cnVjdCBzZV9jbWRcbiIpOworCWlmICghc2VfdGFzaykgeworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgc3RydWN0IHNlX3Rhc2sgZm9yIHN0cnVjdCBzZV9jbWRcbiIpOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CiAJfQogCisJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKHNlX2NtZCk7CisKIAkvKgogCSAqIElmIG5vIHN0cnVjdCBzZV9zZXNzaW9uIHBvaW50ZXIgaXMgcHJlc2VudCwgdGhpcyBzdHJ1Y3Qgc2VfY21kIGlzCiAJICogY29taW5nIHZpYSBhIHRhcmdldF9jb3JlX21vZCBQQVNTVEhST1VHSCBvcCwgYW5kIG5vdCB0aHJvdWdoCiAJICogYSAkRkFCUklDX01PRC4gIEluIHRoYXQgY2FzZSwgcmVwb3J0IExVTj0wIG9ubHkuCiAJICovCi0JaWYgKCEoc2Vfc2VzcykpIHsKKwlpZiAoIXNlX3Nlc3MpIHsKIAkJaW50X3RvX3Njc2lsdW4oMCwgKHN0cnVjdCBzY3NpX2x1biAqKSZidWZbb2Zmc2V0XSk7CiAJCWx1bl9jb3VudCA9IDE7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlzcGluX2xvY2tfaXJxKCZTRV9OT0RFX0FDTChzZV9zZXNzKS0+ZGV2aWNlX2xpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wtPmRldmljZV9saXN0X2xvY2spOwogCWZvciAoaSA9IDA7IGkgPCBUUkFOU1BPUlRfTUFYX0xVTlNfUEVSX1RQRzsgaSsrKSB7Ci0JCWRldmUgPSAmU0VfTk9ERV9BQ0woc2Vfc2VzcyktPmRldmljZV9saXN0W2ldOworCQlkZXZlID0gJnNlX3Nlc3MtPnNlX25vZGVfYWNsLT5kZXZpY2VfbGlzdFtpXTsKIAkJaWYgKCEoZGV2ZS0+bHVuX2ZsYWdzICYgVFJBTlNQT1JUX0xVTkZMQUdTX0lOSVRJQVRPUl9BQ0NFU1MpKQogCQkJY29udGludWU7CiAJCXNlX2x1biA9IGRldmUtPnNlX2x1bjsKQEAgLTY5OSwxMiArNzAwLDEzIEBACiAJCW9mZnNldCArPSA4OwogCQljZGJfb2Zmc2V0ICs9IDg7CiAJfQotCXNwaW5fdW5sb2NrX2lycSgmU0VfTk9ERV9BQ0woc2Vfc2VzcyktPmRldmljZV9saXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wtPmRldmljZV9saXN0X2xvY2spOwogCiAJLyoKIAkgKiBTZWUgU1BDMyByMDcsIHBhZ2UgMTU5LgogCSAqLwogZG9uZToKKwl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShzZV9jbWQpOwogCWx1bl9jb3VudCAqPSA4OwogCWJ1ZlswXSA9ICgobHVuX2NvdW50ID4+IDI0KSAmIDB4ZmYpOwogCWJ1ZlsxXSA9ICgobHVuX2NvdW50ID4+IDE2KSAmIDB4ZmYpOwpAQCAtNzQzLDI2ICs3NDUsMjAgQEAKIAljb3JlX3Njc2kzX2ZyZWVfYWxsX3JlZ2lzdHJhdGlvbnMoZGV2KTsKIAlzZV9yZWxlYXNlX3ZwZF9mb3JfZGV2KGRldik7CiAKLQlrZnJlZShkZXYtPmRldl9zdGF0dXNfcXVldWVfb2JqKTsKLQlrZnJlZShkZXYtPmRldl9xdWV1ZV9vYmopOwogCWtmcmVlKGRldik7Ci0KLQlyZXR1cm47CiB9CiAKIHZvaWQgc2VfcmVsZWFzZV92cGRfZm9yX2RldihzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHQxMF92cGQgKnZwZCwgKnZwZF90bXA7CiAKLQlzcGluX2xvY2soJkRFVl9UMTBfV1dOKGRldiktPnQxMF92cGRfbG9jayk7CisJc3Bpbl9sb2NrKCZkZXYtPnNlX3N1Yl9kZXYtPnQxMF93d24udDEwX3ZwZF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodnBkLCB2cGRfdG1wLAotCQkJJkRFVl9UMTBfV1dOKGRldiktPnQxMF92cGRfbGlzdCwgdnBkX2xpc3QpIHsKKwkJCSZkZXYtPnNlX3N1Yl9kZXYtPnQxMF93d24udDEwX3ZwZF9saXN0LCB2cGRfbGlzdCkgewogCQlsaXN0X2RlbCgmdnBkLT52cGRfbGlzdCk7CiAJCWtmcmVlKHZwZCk7CiAJfQotCXNwaW5fdW5sb2NrKCZERVZfVDEwX1dXTihkZXYpLT50MTBfdnBkX2xvY2spOwotCi0JcmV0dXJuOworCXNwaW5fdW5sb2NrKCZkZXYtPnNlX3N1Yl9kZXYtPnQxMF93d24udDEwX3ZwZF9sb2NrKTsKIH0KIAogLyoJc2VfZnJlZV92aXJ0dWFsX2RldmljZSgpOgpAQCAtODIxLDEyICs4MTcsMTMgQEAKIAogaW50IHNlX2Rldl9jaGVja19vbmxpbmUoc3RydWN0IHNlX2RldmljZSAqZGV2KQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCXNwaW5fbG9ja19pcnEoJmRldi0+ZGV2X3N0YXR1c19sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5kZXZfc3RhdHVzX2xvY2ssIGZsYWdzKTsKIAlyZXQgPSAoKGRldi0+ZGV2X3N0YXR1cyAmIFRSQU5TUE9SVF9ERVZJQ0VfQUNUSVZBVEVEKSB8fAogCSAgICAgICAoZGV2LT5kZXZfc3RhdHVzICYgVFJBTlNQT1JUX0RFVklDRV9ERUFDVElWQVRFRCkpID8gMCA6IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZkZXYtPmRldl9zdGF0dXNfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kZXZfc3RhdHVzX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC04NDgsNTkgKzg0NSw2MSBAQAogewogCXN0cnVjdCBxdWV1ZV9saW1pdHMgKmxpbWl0cyA9ICZkZXZfbGltaXRzLT5saW1pdHM7CiAKLQlERVZfQVRUUklCKGRldiktPmVtdWxhdGVfZHBvID0gREFfRU1VTEFURV9EUE87Ci0JREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX2Z1YV93cml0ZSA9IERBX0VNVUxBVEVfRlVBX1dSSVRFOwotCURFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV9mdWFfcmVhZCA9IERBX0VNVUxBVEVfRlVBX1JFQUQ7Ci0JREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX3dyaXRlX2NhY2hlID0gREFfRU1VTEFURV9XUklURV9DQUNIRTsKLQlERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdWFfaW50bGNrX2N0cmwgPSBEQV9FTVVMQVRFX1VBX0lOVExMQ0tfQ1RSTDsKLQlERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdGFzID0gREFfRU1VTEFURV9UQVM7Ci0JREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX3RwdSA9IERBX0VNVUxBVEVfVFBVOwotCURFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV90cHdzID0gREFfRU1VTEFURV9UUFdTOwotCURFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV9yZXNlcnZhdGlvbnMgPSBEQV9FTVVMQVRFX1JFU0VSVkFUSU9OUzsKLQlERVZfQVRUUklCKGRldiktPmVtdWxhdGVfYWx1YSA9IERBX0VNVUxBVEVfQUxVQTsKLQlERVZfQVRUUklCKGRldiktPmVuZm9yY2VfcHJfaXNpZHMgPSBEQV9FTkZPUkNFX1BSX0lTSURTOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX2RwbyA9IERBX0VNVUxBVEVfRFBPOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX2Z1YV93cml0ZSA9IERBX0VNVUxBVEVfRlVBX1dSSVRFOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX2Z1YV9yZWFkID0gREFfRU1VTEFURV9GVUFfUkVBRDsKKwlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV93cml0ZV9jYWNoZSA9IERBX0VNVUxBVEVfV1JJVEVfQ0FDSEU7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfdWFfaW50bGNrX2N0cmwgPSBEQV9FTVVMQVRFX1VBX0lOVExMQ0tfQ1RSTDsKKwlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV90YXMgPSBEQV9FTVVMQVRFX1RBUzsKKwlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV90cHUgPSBEQV9FTVVMQVRFX1RQVTsKKwlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV90cHdzID0gREFfRU1VTEFURV9UUFdTOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3Jlc2VydmF0aW9ucyA9IERBX0VNVUxBVEVfUkVTRVJWQVRJT05TOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX2FsdWEgPSBEQV9FTVVMQVRFX0FMVUE7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVuZm9yY2VfcHJfaXNpZHMgPSBEQV9FTkZPUkNFX1BSX0lTSURTOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5pc19ub25yb3QgPSBEQV9JU19OT05ST1Q7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfcmVzdF9yZW9yZCA9IERBX0VNVUxBVEVfUkVTVF9SRU9SRDsKIAkvKgogCSAqIFRoZSBUUFU9MSBhbmQgVFBXUz0xIHNldHRpbmdzIHdpbGwgYmUgc2V0IGluIFRDTS9JQkxPQ0sKIAkgKiBpYmxvY2tfY3JlYXRlX3ZpcnRkZXZpY2UoKSBmcm9tIHN0cnVjdCBxdWV1ZV9saW1pdHMgdmFsdWVzCiAJICogaWYgYmxrX3F1ZXVlX2Rpc2NhcmQoKT09MQogCSAqLwotCURFVl9BVFRSSUIoZGV2KS0+bWF4X3VubWFwX2xiYV9jb3VudCA9IERBX01BWF9VTk1BUF9MQkFfQ09VTlQ7Ci0JREVWX0FUVFJJQihkZXYpLT5tYXhfdW5tYXBfYmxvY2tfZGVzY19jb3VudCA9Ci0JCQkJREFfTUFYX1VOTUFQX0JMT0NLX0RFU0NfQ09VTlQ7Ci0JREVWX0FUVFJJQihkZXYpLT51bm1hcF9ncmFudWxhcml0eSA9IERBX1VOTUFQX0dSQU5VTEFSSVRZX0RFRkFVTFQ7Ci0JREVWX0FUVFJJQihkZXYpLT51bm1hcF9ncmFudWxhcml0eV9hbGlnbm1lbnQgPQorCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5tYXhfdW5tYXBfbGJhX2NvdW50ID0gREFfTUFYX1VOTUFQX0xCQV9DT1VOVDsKKwlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIubWF4X3VubWFwX2Jsb2NrX2Rlc2NfY291bnQgPQorCQlEQV9NQVhfVU5NQVBfQkxPQ0tfREVTQ19DT1VOVDsKKwlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIudW5tYXBfZ3JhbnVsYXJpdHkgPSBEQV9VTk1BUF9HUkFOVUxBUklUWV9ERUZBVUxUOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi51bm1hcF9ncmFudWxhcml0eV9hbGlnbm1lbnQgPQogCQkJCURBX1VOTUFQX0dSQU5VTEFSSVRZX0FMSUdOTUVOVF9ERUZBVUxUOwogCS8qCiAJICogYmxvY2tfc2l6ZSBpcyBiYXNlZCBvbiBzdWJzeXN0ZW0gcGx1Z2luIGRlcGVuZGVudCByZXF1aXJlbWVudHMuCiAJICovCi0JREVWX0FUVFJJQihkZXYpLT5od19ibG9ja19zaXplID0gbGltaXRzLT5sb2dpY2FsX2Jsb2NrX3NpemU7Ci0JREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplID0gbGltaXRzLT5sb2dpY2FsX2Jsb2NrX3NpemU7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmh3X2Jsb2NrX3NpemUgPSBsaW1pdHMtPmxvZ2ljYWxfYmxvY2tfc2l6ZTsKKwlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZSA9IGxpbWl0cy0+bG9naWNhbF9ibG9ja19zaXplOwogCS8qCiAJICogbWF4X3NlY3RvcnMgaXMgYmFzZWQgb24gc3Vic3lzdGVtIHBsdWdpbiBkZXBlbmRlbnQgcmVxdWlyZW1lbnRzLgogCSAqLwotCURFVl9BVFRSSUIoZGV2KS0+aHdfbWF4X3NlY3RvcnMgPSBsaW1pdHMtPm1heF9od19zZWN0b3JzOwotCURFVl9BVFRSSUIoZGV2KS0+bWF4X3NlY3RvcnMgPSBsaW1pdHMtPm1heF9zZWN0b3JzOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5od19tYXhfc2VjdG9ycyA9IGxpbWl0cy0+bWF4X2h3X3NlY3RvcnM7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLm1heF9zZWN0b3JzID0gbGltaXRzLT5tYXhfc2VjdG9yczsKIAkvKgogCSAqIFNldCBvcHRpbWFsX3NlY3RvcnMgZnJvbSBtYXhfc2VjdG9ycywgd2hpY2ggY2FuIGJlIGxvd2VyZWQgdmlhCiAJICogY29uZmlnZnMuCiAJICovCi0JREVWX0FUVFJJQihkZXYpLT5vcHRpbWFsX3NlY3RvcnMgPSBsaW1pdHMtPm1heF9zZWN0b3JzOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5vcHRpbWFsX3NlY3RvcnMgPSBsaW1pdHMtPm1heF9zZWN0b3JzOwogCS8qCiAJICogcXVldWVfZGVwdGggaXMgYmFzZWQgb24gc3Vic3lzdGVtIHBsdWdpbiBkZXBlbmRlbnQgcmVxdWlyZW1lbnRzLgogCSAqLwotCURFVl9BVFRSSUIoZGV2KS0+aHdfcXVldWVfZGVwdGggPSBkZXZfbGltaXRzLT5od19xdWV1ZV9kZXB0aDsKLQlERVZfQVRUUklCKGRldiktPnF1ZXVlX2RlcHRoID0gZGV2X2xpbWl0cy0+cXVldWVfZGVwdGg7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmh3X3F1ZXVlX2RlcHRoID0gZGV2X2xpbWl0cy0+aHdfcXVldWVfZGVwdGg7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLnF1ZXVlX2RlcHRoID0gZGV2X2xpbWl0cy0+cXVldWVfZGVwdGg7CiB9CiAKIGludCBzZV9kZXZfc2V0X3Rhc2tfdGltZW91dChzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsIHUzMiB0YXNrX3RpbWVvdXQpCiB7CiAJaWYgKHRhc2tfdGltZW91dCA+IERBX1RBU0tfVElNRU9VVF9NQVgpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkZXZbJXBdOiBQYXNzZWQgdGFza190aW1lb3V0OiAldSBsYXJnZXIgdGhlbiIKKwkJcHJfZXJyKCJkZXZbJXBdOiBQYXNzZWQgdGFza190aW1lb3V0OiAldSBsYXJnZXIgdGhlbiIKIAkJCSIgREFfVEFTS19USU1FT1VUX01BWFxuIiwgZGV2LCB0YXNrX3RpbWVvdXQpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSB7Ci0JCURFVl9BVFRSSUIoZGV2KS0+dGFza190aW1lb3V0ID0gdGFza190aW1lb3V0OwotCQlwcmludGsoS0VSTl9JTkZPICJkZXZbJXBdOiBTZXQgU0UgRGV2aWNlIHRhc2tfdGltZW91dDogJXVcbiIsCisJCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi50YXNrX3RpbWVvdXQgPSB0YXNrX3RpbWVvdXQ7CisJCXByX2RlYnVnKCJkZXZbJXBdOiBTZXQgU0UgRGV2aWNlIHRhc2tfdGltZW91dDogJXVcbiIsCiAJCQlkZXYsIHRhc2tfdGltZW91dCk7CiAJfQogCkBAIC05MTEsOSArOTEwLDkgQEAKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsCiAJdTMyIG1heF91bm1hcF9sYmFfY291bnQpCiB7Ci0JREVWX0FUVFJJQihkZXYpLT5tYXhfdW5tYXBfbGJhX2NvdW50ID0gbWF4X3VubWFwX2xiYV9jb3VudDsKLQlwcmludGsoS0VSTl9JTkZPICJkZXZbJXBdOiBTZXQgbWF4X3VubWFwX2xiYV9jb3VudDogJXVcbiIsCi0JCQlkZXYsIERFVl9BVFRSSUIoZGV2KS0+bWF4X3VubWFwX2xiYV9jb3VudCk7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLm1heF91bm1hcF9sYmFfY291bnQgPSBtYXhfdW5tYXBfbGJhX2NvdW50OworCXByX2RlYnVnKCJkZXZbJXBdOiBTZXQgbWF4X3VubWFwX2xiYV9jb3VudDogJXVcbiIsCisJCQlkZXYsIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5tYXhfdW5tYXBfbGJhX2NvdW50KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTIxLDkgKzkyMCwxMCBAQAogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiwKIAl1MzIgbWF4X3VubWFwX2Jsb2NrX2Rlc2NfY291bnQpCiB7Ci0JREVWX0FUVFJJQihkZXYpLT5tYXhfdW5tYXBfYmxvY2tfZGVzY19jb3VudCA9IG1heF91bm1hcF9ibG9ja19kZXNjX2NvdW50OwotCXByaW50ayhLRVJOX0lORk8gImRldlslcF06IFNldCBtYXhfdW5tYXBfYmxvY2tfZGVzY19jb3VudDogJXVcbiIsCi0JCQlkZXYsIERFVl9BVFRSSUIoZGV2KS0+bWF4X3VubWFwX2Jsb2NrX2Rlc2NfY291bnQpOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5tYXhfdW5tYXBfYmxvY2tfZGVzY19jb3VudCA9CisJCW1heF91bm1hcF9ibG9ja19kZXNjX2NvdW50OworCXByX2RlYnVnKCJkZXZbJXBdOiBTZXQgbWF4X3VubWFwX2Jsb2NrX2Rlc2NfY291bnQ6ICV1XG4iLAorCQkJZGV2LCBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIubWF4X3VubWFwX2Jsb2NrX2Rlc2NfY291bnQpOwogCXJldHVybiAwOwogfQogCkBAIC05MzEsOSArOTMxLDkgQEAKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsCiAJdTMyIHVubWFwX2dyYW51bGFyaXR5KQogewotCURFVl9BVFRSSUIoZGV2KS0+dW5tYXBfZ3JhbnVsYXJpdHkgPSB1bm1hcF9ncmFudWxhcml0eTsKLQlwcmludGsoS0VSTl9JTkZPICJkZXZbJXBdOiBTZXQgdW5tYXBfZ3JhbnVsYXJpdHk6ICV1XG4iLAotCQkJZGV2LCBERVZfQVRUUklCKGRldiktPnVubWFwX2dyYW51bGFyaXR5KTsKKwlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIudW5tYXBfZ3JhbnVsYXJpdHkgPSB1bm1hcF9ncmFudWxhcml0eTsKKwlwcl9kZWJ1ZygiZGV2WyVwXTogU2V0IHVubWFwX2dyYW51bGFyaXR5OiAldVxuIiwKKwkJCWRldiwgZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLnVubWFwX2dyYW51bGFyaXR5KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTQxLDEwOSArOTQxLDEwOSBAQAogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiwKIAl1MzIgdW5tYXBfZ3JhbnVsYXJpdHlfYWxpZ25tZW50KQogewotCURFVl9BVFRSSUIoZGV2KS0+dW5tYXBfZ3JhbnVsYXJpdHlfYWxpZ25tZW50ID0gdW5tYXBfZ3JhbnVsYXJpdHlfYWxpZ25tZW50OwotCXByaW50ayhLRVJOX0lORk8gImRldlslcF06IFNldCB1bm1hcF9ncmFudWxhcml0eV9hbGlnbm1lbnQ6ICV1XG4iLAotCQkJZGV2LCBERVZfQVRUUklCKGRldiktPnVubWFwX2dyYW51bGFyaXR5X2FsaWdubWVudCk7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLnVubWFwX2dyYW51bGFyaXR5X2FsaWdubWVudCA9IHVubWFwX2dyYW51bGFyaXR5X2FsaWdubWVudDsKKwlwcl9kZWJ1ZygiZGV2WyVwXTogU2V0IHVubWFwX2dyYW51bGFyaXR5X2FsaWdubWVudDogJXVcbiIsCisJCQlkZXYsIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi51bm1hcF9ncmFudWxhcml0eV9hbGlnbm1lbnQpOwogCXJldHVybiAwOwogfQogCiBpbnQgc2VfZGV2X3NldF9lbXVsYXRlX2RwbyhzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsIGludCBmbGFnKQogewogCWlmICgoZmxhZyAhPSAwKSAmJiAoZmxhZyAhPSAxKSkgewotCQlwcmludGsoS0VSTl9FUlIgIklsbGVnYWwgdmFsdWUgJWRcbiIsIGZsYWcpOwotCQlyZXR1cm4gLTE7CisJCXByX2VycigiSWxsZWdhbCB2YWx1ZSAlZFxuIiwgZmxhZyk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoVFJBTlNQT1JUKGRldiktPmRwb19lbXVsYXRlZCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVFJBTlNQT1JUKGRldiktPmRwb19lbXVsYXRlZCBpcyBOVUxMXG4iKTsKLQkJcmV0dXJuIC0xOworCWlmIChkZXYtPnRyYW5zcG9ydC0+ZHBvX2VtdWxhdGVkID09IE5VTEwpIHsKKwkJcHJfZXJyKCJkZXYtPnRyYW5zcG9ydC0+ZHBvX2VtdWxhdGVkIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKFRSQU5TUE9SVChkZXYpLT5kcG9fZW11bGF0ZWQoZGV2KSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVFJBTlNQT1JUKGRldiktPmRwb19lbXVsYXRlZCBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJcmV0dXJuIC0xOworCWlmIChkZXYtPnRyYW5zcG9ydC0+ZHBvX2VtdWxhdGVkKGRldikgPT0gMCkgeworCQlwcl9lcnIoImRldi0+dHJhbnNwb3J0LT5kcG9fZW11bGF0ZWQgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQlERVZfQVRUUklCKGRldiktPmVtdWxhdGVfZHBvID0gZmxhZzsKLQlwcmludGsoS0VSTl9JTkZPICJkZXZbJXBdOiBTRSBEZXZpY2UgUGFnZSBPdXQgKERQTykgRW11bGF0aW9uIgotCQkJIiBiaXQ6ICVkXG4iLCBkZXYsIERFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV9kcG8pOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX2RwbyA9IGZsYWc7CisJcHJfZGVidWcoImRldlslcF06IFNFIERldmljZSBQYWdlIE91dCAoRFBPKSBFbXVsYXRpb24iCisJCQkiIGJpdDogJWRcbiIsIGRldiwgZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfZHBvKTsKIAlyZXR1cm4gMDsKIH0KIAogaW50IHNlX2Rldl9zZXRfZW11bGF0ZV9mdWFfd3JpdGUoc3RydWN0IHNlX2RldmljZSAqZGV2LCBpbnQgZmxhZykKIHsKIAlpZiAoKGZsYWcgIT0gMCkgJiYgKGZsYWcgIT0gMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbGxlZ2FsIHZhbHVlICVkXG4iLCBmbGFnKTsKLQkJcmV0dXJuIC0xOworCQlwcl9lcnIoIklsbGVnYWwgdmFsdWUgJWRcbiIsIGZsYWcpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKFRSQU5TUE9SVChkZXYpLT5mdWFfd3JpdGVfZW11bGF0ZWQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlRSQU5TUE9SVChkZXYpLT5mdWFfd3JpdGVfZW11bGF0ZWQgaXMgTlVMTFxuIik7Ci0JCXJldHVybiAtMTsKKwlpZiAoZGV2LT50cmFuc3BvcnQtPmZ1YV93cml0ZV9lbXVsYXRlZCA9PSBOVUxMKSB7CisJCXByX2VycigiZGV2LT50cmFuc3BvcnQtPmZ1YV93cml0ZV9lbXVsYXRlZCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmIChUUkFOU1BPUlQoZGV2KS0+ZnVhX3dyaXRlX2VtdWxhdGVkKGRldikgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlRSQU5TUE9SVChkZXYpLT5mdWFfd3JpdGVfZW11bGF0ZWQgbm90IHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiAtMTsKKwlpZiAoZGV2LT50cmFuc3BvcnQtPmZ1YV93cml0ZV9lbXVsYXRlZChkZXYpID09IDApIHsKKwkJcHJfZXJyKCJkZXYtPnRyYW5zcG9ydC0+ZnVhX3dyaXRlX2VtdWxhdGVkIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX2Z1YV93cml0ZSA9IGZsYWc7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiZGV2WyVwXTogU0UgRGV2aWNlIEZvcmNlZCBVbml0IEFjY2VzcyBXUklURXM6ICVkXG4iLAotCQkJZGV2LCBERVZfQVRUUklCKGRldiktPmVtdWxhdGVfZnVhX3dyaXRlKTsKKwlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV9mdWFfd3JpdGUgPSBmbGFnOworCXByX2RlYnVnKCJkZXZbJXBdOiBTRSBEZXZpY2UgRm9yY2VkIFVuaXQgQWNjZXNzIFdSSVRFczogJWRcbiIsCisJCQlkZXYsIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX2Z1YV93cml0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKIGludCBzZV9kZXZfc2V0X2VtdWxhdGVfZnVhX3JlYWQoc3RydWN0IHNlX2RldmljZSAqZGV2LCBpbnQgZmxhZykKIHsKIAlpZiAoKGZsYWcgIT0gMCkgJiYgKGZsYWcgIT0gMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbGxlZ2FsIHZhbHVlICVkXG4iLCBmbGFnKTsKLQkJcmV0dXJuIC0xOworCQlwcl9lcnIoIklsbGVnYWwgdmFsdWUgJWRcbiIsIGZsYWcpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKFRSQU5TUE9SVChkZXYpLT5mdWFfcmVhZF9lbXVsYXRlZCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVFJBTlNQT1JUKGRldiktPmZ1YV9yZWFkX2VtdWxhdGVkIGlzIE5VTExcbiIpOwotCQlyZXR1cm4gLTE7CisJaWYgKGRldi0+dHJhbnNwb3J0LT5mdWFfcmVhZF9lbXVsYXRlZCA9PSBOVUxMKSB7CisJCXByX2VycigiZGV2LT50cmFuc3BvcnQtPmZ1YV9yZWFkX2VtdWxhdGVkIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKFRSQU5TUE9SVChkZXYpLT5mdWFfcmVhZF9lbXVsYXRlZChkZXYpID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJUUkFOU1BPUlQoZGV2KS0+ZnVhX3JlYWRfZW11bGF0ZWQgbm90IHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiAtMTsKKwlpZiAoZGV2LT50cmFuc3BvcnQtPmZ1YV9yZWFkX2VtdWxhdGVkKGRldikgPT0gMCkgeworCQlwcl9lcnIoImRldi0+dHJhbnNwb3J0LT5mdWFfcmVhZF9lbXVsYXRlZCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCURFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV9mdWFfcmVhZCA9IGZsYWc7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiZGV2WyVwXTogU0UgRGV2aWNlIEZvcmNlZCBVbml0IEFjY2VzcyBSRUFEczogJWRcbiIsCi0JCQlkZXYsIERFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV9mdWFfcmVhZCk7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfZnVhX3JlYWQgPSBmbGFnOworCXByX2RlYnVnKCJkZXZbJXBdOiBTRSBEZXZpY2UgRm9yY2VkIFVuaXQgQWNjZXNzIFJFQURzOiAlZFxuIiwKKwkJCWRldiwgZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfZnVhX3JlYWQpOwogCXJldHVybiAwOwogfQogCiBpbnQgc2VfZGV2X3NldF9lbXVsYXRlX3dyaXRlX2NhY2hlKHN0cnVjdCBzZV9kZXZpY2UgKmRldiwgaW50IGZsYWcpCiB7CiAJaWYgKChmbGFnICE9IDApICYmIChmbGFnICE9IDEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSWxsZWdhbCB2YWx1ZSAlZFxuIiwgZmxhZyk7Ci0JCXJldHVybiAtMTsKKwkJcHJfZXJyKCJJbGxlZ2FsIHZhbHVlICVkXG4iLCBmbGFnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmIChUUkFOU1BPUlQoZGV2KS0+d3JpdGVfY2FjaGVfZW11bGF0ZWQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlRSQU5TUE9SVChkZXYpLT53cml0ZV9jYWNoZV9lbXVsYXRlZCBpcyBOVUxMXG4iKTsKLQkJcmV0dXJuIC0xOworCWlmIChkZXYtPnRyYW5zcG9ydC0+d3JpdGVfY2FjaGVfZW11bGF0ZWQgPT0gTlVMTCkgeworCQlwcl9lcnIoImRldi0+dHJhbnNwb3J0LT53cml0ZV9jYWNoZV9lbXVsYXRlZCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmIChUUkFOU1BPUlQoZGV2KS0+d3JpdGVfY2FjaGVfZW11bGF0ZWQoZGV2KSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVFJBTlNQT1JUKGRldiktPndyaXRlX2NhY2hlX2VtdWxhdGVkIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyZXR1cm4gLTE7CisJaWYgKGRldi0+dHJhbnNwb3J0LT53cml0ZV9jYWNoZV9lbXVsYXRlZChkZXYpID09IDApIHsKKwkJcHJfZXJyKCJkZXYtPnRyYW5zcG9ydC0+d3JpdGVfY2FjaGVfZW11bGF0ZWQgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQlERVZfQVRUUklCKGRldiktPmVtdWxhdGVfd3JpdGVfY2FjaGUgPSBmbGFnOwotCXByaW50ayhLRVJOX0lORk8gImRldlslcF06IFNFIERldmljZSBXUklURV9DQUNIRV9FTVVMQVRJT04gZmxhZzogJWRcbiIsCi0JCQlkZXYsIERFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV93cml0ZV9jYWNoZSk7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfd3JpdGVfY2FjaGUgPSBmbGFnOworCXByX2RlYnVnKCJkZXZbJXBdOiBTRSBEZXZpY2UgV1JJVEVfQ0FDSEVfRU1VTEFUSU9OIGZsYWc6ICVkXG4iLAorCQkJZGV2LCBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV93cml0ZV9jYWNoZSk7CiAJcmV0dXJuIDA7CiB9CiAKIGludCBzZV9kZXZfc2V0X2VtdWxhdGVfdWFfaW50bGNrX2N0cmwoc3RydWN0IHNlX2RldmljZSAqZGV2LCBpbnQgZmxhZykKIHsKIAlpZiAoKGZsYWcgIT0gMCkgJiYgKGZsYWcgIT0gMSkgJiYgKGZsYWcgIT0gMikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbGxlZ2FsIHZhbHVlICVkXG4iLCBmbGFnKTsKLQkJcmV0dXJuIC0xOworCQlwcl9lcnIoIklsbGVnYWwgdmFsdWUgJWRcbiIsIGZsYWcpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoYXRvbWljX3JlYWQoJmRldi0+ZGV2X2V4cG9ydF9vYmoub2JqX2FjY2Vzc19jb3VudCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkZXZbJXBdOiBVbmFibGUgdG8gY2hhbmdlIFNFIERldmljZSIKKwkJcHJfZXJyKCJkZXZbJXBdOiBVbmFibGUgdG8gY2hhbmdlIFNFIERldmljZSIKIAkJCSIgVUFfSU5UUkxDS19DVFJMIHdoaWxlIGRldl9leHBvcnRfb2JqOiAlZCBjb3VudCIKIAkJCSIgZXhpc3RzXG4iLCBkZXYsCiAJCQlhdG9taWNfcmVhZCgmZGV2LT5kZXZfZXhwb3J0X29iai5vYmpfYWNjZXNzX2NvdW50KSk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCURFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV91YV9pbnRsY2tfY3RybCA9IGZsYWc7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiZGV2WyVwXTogU0UgRGV2aWNlIFVBX0lOVFJMQ0tfQ1RSTCBmbGFnOiAlZFxuIiwKLQkJZGV2LCBERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdWFfaW50bGNrX2N0cmwpOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3VhX2ludGxja19jdHJsID0gZmxhZzsKKwlwcl9kZWJ1ZygiZGV2WyVwXTogU0UgRGV2aWNlIFVBX0lOVFJMQ0tfQ1RSTCBmbGFnOiAlZFxuIiwKKwkJZGV2LCBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV91YV9pbnRsY2tfY3RybCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNTEsMTkgKzEwNTEsMTkgQEAKIGludCBzZV9kZXZfc2V0X2VtdWxhdGVfdGFzKHN0cnVjdCBzZV9kZXZpY2UgKmRldiwgaW50IGZsYWcpCiB7CiAJaWYgKChmbGFnICE9IDApICYmIChmbGFnICE9IDEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSWxsZWdhbCB2YWx1ZSAlZFxuIiwgZmxhZyk7Ci0JCXJldHVybiAtMTsKKwkJcHJfZXJyKCJJbGxlZ2FsIHZhbHVlICVkXG4iLCBmbGFnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGF0b21pY19yZWFkKCZkZXYtPmRldl9leHBvcnRfb2JqLm9ial9hY2Nlc3NfY291bnQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZGV2WyVwXTogVW5hYmxlIHRvIGNoYW5nZSBTRSBEZXZpY2UgVEFTIHdoaWxlIgorCQlwcl9lcnIoImRldlslcF06IFVuYWJsZSB0byBjaGFuZ2UgU0UgRGV2aWNlIFRBUyB3aGlsZSIKIAkJCSIgZGV2X2V4cG9ydF9vYmo6ICVkIGNvdW50IGV4aXN0c1xuIiwgZGV2LAogCQkJYXRvbWljX3JlYWQoJmRldi0+ZGV2X2V4cG9ydF9vYmoub2JqX2FjY2Vzc19jb3VudCkpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQlERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdGFzID0gZmxhZzsKLQlwcmludGsoS0VSTl9JTkZPICJkZXZbJXBdOiBTRSBEZXZpY2UgVEFTS19BQk9SVEVEIHN0YXR1cyBiaXQ6ICVzXG4iLAotCQlkZXYsIChERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdGFzKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3RhcyA9IGZsYWc7CisJcHJfZGVidWcoImRldlslcF06IFNFIERldmljZSBUQVNLX0FCT1JURUQgc3RhdHVzIGJpdDogJXNcbiIsCisJCWRldiwgKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3RhcykgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTA3MSwyMCArMTA3MSwyMCBAQAogaW50IHNlX2Rldl9zZXRfZW11bGF0ZV90cHUoc3RydWN0IHNlX2RldmljZSAqZGV2LCBpbnQgZmxhZykKIHsKIAlpZiAoKGZsYWcgIT0gMCkgJiYgKGZsYWcgIT0gMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbGxlZ2FsIHZhbHVlICVkXG4iLCBmbGFnKTsKLQkJcmV0dXJuIC0xOworCQlwcl9lcnIoIklsbGVnYWwgdmFsdWUgJWRcbiIsIGZsYWcpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyoKIAkgKiBXZSBleHBlY3QgdGhpcyB2YWx1ZSB0byBiZSBub24temVybyB3aGVuIGdlbmVyaWMgQmxvY2sgTGF5ZXIKIAkgKiBEaXNjYXJkIHN1cHBvcnRlZCBpcyBkZXRlY3RlZCBpYmxvY2tfY3JlYXRlX3ZpcnRkZXZpY2UoKS4KIAkgKi8KLQlpZiAoIShERVZfQVRUUklCKGRldiktPm1heF91bm1hcF9ibG9ja19kZXNjX2NvdW50KSkgewotCQlwcmludGsoS0VSTl9FUlIgIkdlbmVyaWMgQmxvY2sgRGlzY2FyZCBub3Qgc3VwcG9ydGVkXG4iKTsKKwlpZiAoIWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5tYXhfdW5tYXBfYmxvY2tfZGVzY19jb3VudCkgeworCQlwcl9lcnIoIkdlbmVyaWMgQmxvY2sgRGlzY2FyZCBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9TWVM7CiAJfQogCi0JREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX3RwdSA9IGZsYWc7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiZGV2WyVwXTogU0UgRGV2aWNlIFRoaW4gUHJvdmlzaW9uaW5nIFVOTUFQIGJpdDogJWRcbiIsCisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfdHB1ID0gZmxhZzsKKwlwcl9kZWJ1ZygiZGV2WyVwXTogU0UgRGV2aWNlIFRoaW4gUHJvdmlzaW9uaW5nIFVOTUFQIGJpdDogJWRcbiIsCiAJCQkJZGV2LCBmbGFnKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwOTIsMjAgKzEwOTIsMjAgQEAKIGludCBzZV9kZXZfc2V0X2VtdWxhdGVfdHB3cyhzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsIGludCBmbGFnKQogewogCWlmICgoZmxhZyAhPSAwKSAmJiAoZmxhZyAhPSAxKSkgewotCQlwcmludGsoS0VSTl9FUlIgIklsbGVnYWwgdmFsdWUgJWRcbiIsIGZsYWcpOwotCQlyZXR1cm4gLTE7CisJCXByX2VycigiSWxsZWdhbCB2YWx1ZSAlZFxuIiwgZmxhZyk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKgogCSAqIFdlIGV4cGVjdCB0aGlzIHZhbHVlIHRvIGJlIG5vbi16ZXJvIHdoZW4gZ2VuZXJpYyBCbG9jayBMYXllcgogCSAqIERpc2NhcmQgc3VwcG9ydGVkIGlzIGRldGVjdGVkIGlibG9ja19jcmVhdGVfdmlydGRldmljZSgpLgogCSAqLwotCWlmICghKERFVl9BVFRSSUIoZGV2KS0+bWF4X3VubWFwX2Jsb2NrX2Rlc2NfY291bnQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiR2VuZXJpYyBCbG9jayBEaXNjYXJkIG5vdCBzdXBwb3J0ZWRcbiIpOworCWlmICghZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLm1heF91bm1hcF9ibG9ja19kZXNjX2NvdW50KSB7CisJCXByX2VycigiR2VuZXJpYyBCbG9jayBEaXNjYXJkIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gLUVOT1NZUzsKIAl9CiAKLQlERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdHB3cyA9IGZsYWc7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiZGV2WyVwXTogU0UgRGV2aWNlIFRoaW4gUHJvdmlzaW9uaW5nIFdSSVRFX1NBTUU6ICVkXG4iLAorCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3Rwd3MgPSBmbGFnOworCXByX2RlYnVnKCJkZXZbJXBdOiBTRSBEZXZpY2UgVGhpbiBQcm92aXNpb25pbmcgV1JJVEVfU0FNRTogJWRcbiIsCiAJCQkJZGV2LCBmbGFnKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExMTMsMTIgKzExMTMsMzYgQEAKIGludCBzZV9kZXZfc2V0X2VuZm9yY2VfcHJfaXNpZHMoc3RydWN0IHNlX2RldmljZSAqZGV2LCBpbnQgZmxhZykKIHsKIAlpZiAoKGZsYWcgIT0gMCkgJiYgKGZsYWcgIT0gMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbGxlZ2FsIHZhbHVlICVkXG4iLCBmbGFnKTsKLQkJcmV0dXJuIC0xOworCQlwcl9lcnIoIklsbGVnYWwgdmFsdWUgJWRcbiIsIGZsYWcpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JREVWX0FUVFJJQihkZXYpLT5lbmZvcmNlX3ByX2lzaWRzID0gZmxhZzsKLQlwcmludGsoS0VSTl9JTkZPICJkZXZbJXBdOiBTRSBEZXZpY2UgZW5mb3JjZV9wcl9pc2lkcyBiaXQ6ICVzXG4iLCBkZXYsCi0JCShERVZfQVRUUklCKGRldiktPmVuZm9yY2VfcHJfaXNpZHMpID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVuZm9yY2VfcHJfaXNpZHMgPSBmbGFnOworCXByX2RlYnVnKCJkZXZbJXBdOiBTRSBEZXZpY2UgZW5mb3JjZV9wcl9pc2lkcyBiaXQ6ICVzXG4iLCBkZXYsCisJCShkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW5mb3JjZV9wcl9pc2lkcykgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNlX2Rldl9zZXRfaXNfbm9ucm90KHN0cnVjdCBzZV9kZXZpY2UgKmRldiwgaW50IGZsYWcpCit7CisJaWYgKChmbGFnICE9IDApICYmIChmbGFnICE9IDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSWxsZWdhbCB2YWx1ZSAlZFxuIiwgZmxhZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuaXNfbm9ucm90ID0gZmxhZzsKKwlwcl9kZWJ1ZygiZGV2WyVwXTogU0UgRGV2aWNlIGlzX25vbnJvdCBiaXQ6ICVkXG4iLAorCSAgICAgICBkZXYsIGZsYWcpOworCXJldHVybiAwOworfQorCitpbnQgc2VfZGV2X3NldF9lbXVsYXRlX3Jlc3RfcmVvcmQoc3RydWN0IHNlX2RldmljZSAqZGV2LCBpbnQgZmxhZykKK3sKKwlpZiAoZmxhZyAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZGV2WyVwXTogU0UgRGV2aWNlIGVtdWxhdGF0aW9uIG9mIHJlc3RyaWN0ZWQiCisJCQkiIHJlb3JkZXJpbmcgbm90IGltcGxlbWVudGVkXG4iLCBkZXYpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfcmVzdF9yZW9yZCA9IGZsYWc7CisJcHJfZGVidWcoImRldlslcF06IFNFIERldmljZSBlbXVsYXRlX3Jlc3RfcmVvcmQ6ICVkXG4iLCBkZXYsIGZsYWcpOwogCXJldHVybiAwOwogfQogCkBAIC0xMTMwLDQ0ICsxMTU0LDQ0IEBACiAJdTMyIG9yaWdfcXVldWVfZGVwdGggPSBkZXYtPnF1ZXVlX2RlcHRoOwogCiAJaWYgKGF0b21pY19yZWFkKCZkZXYtPmRldl9leHBvcnRfb2JqLm9ial9hY2Nlc3NfY291bnQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZGV2WyVwXTogVW5hYmxlIHRvIGNoYW5nZSBTRSBEZXZpY2UgVENRIHdoaWxlIgorCQlwcl9lcnIoImRldlslcF06IFVuYWJsZSB0byBjaGFuZ2UgU0UgRGV2aWNlIFRDUSB3aGlsZSIKIAkJCSIgZGV2X2V4cG9ydF9vYmo6ICVkIGNvdW50IGV4aXN0c1xuIiwgZGV2LAogCQkJYXRvbWljX3JlYWQoJmRldi0+ZGV2X2V4cG9ydF9vYmoub2JqX2FjY2Vzc19jb3VudCkpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoIShxdWV1ZV9kZXB0aCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkZXZbJXBdOiBJbGxlZ2FsIFpFUk8gdmFsdWUgZm9yIHF1ZXVlIgorCWlmICghcXVldWVfZGVwdGgpIHsKKwkJcHJfZXJyKCJkZXZbJXBdOiBJbGxlZ2FsIFpFUk8gdmFsdWUgZm9yIHF1ZXVlIgogCQkJIl9kZXB0aFxuIiwgZGV2KTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoVFJBTlNQT1JUKGRldiktPnRyYW5zcG9ydF90eXBlID09IFRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKSB7Ci0JCWlmIChxdWV1ZV9kZXB0aCA+IERFVl9BVFRSSUIoZGV2KS0+aHdfcXVldWVfZGVwdGgpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZGV2WyVwXTogUGFzc2VkIHF1ZXVlX2RlcHRoOiAldSIKKwlpZiAoZGV2LT50cmFuc3BvcnQtPnRyYW5zcG9ydF90eXBlID09IFRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKSB7CisJCWlmIChxdWV1ZV9kZXB0aCA+IGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5od19xdWV1ZV9kZXB0aCkgeworCQkJcHJfZXJyKCJkZXZbJXBdOiBQYXNzZWQgcXVldWVfZGVwdGg6ICV1IgogCQkJCSIgZXhjZWVkcyBUQ00vU0VfRGV2aWNlIFRDUTogJXVcbiIsCiAJCQkJZGV2LCBxdWV1ZV9kZXB0aCwKLQkJCQlERVZfQVRUUklCKGRldiktPmh3X3F1ZXVlX2RlcHRoKTsKLQkJCXJldHVybiAtMTsKKwkJCQlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuaHdfcXVldWVfZGVwdGgpOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UgewotCQlpZiAocXVldWVfZGVwdGggPiBERVZfQVRUUklCKGRldiktPnF1ZXVlX2RlcHRoKSB7Ci0JCQlpZiAocXVldWVfZGVwdGggPiBERVZfQVRUUklCKGRldiktPmh3X3F1ZXVlX2RlcHRoKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJkZXZbJXBdOiBQYXNzZWQgcXVldWVfZGVwdGg6IgorCQlpZiAocXVldWVfZGVwdGggPiBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIucXVldWVfZGVwdGgpIHsKKwkJCWlmIChxdWV1ZV9kZXB0aCA+IGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5od19xdWV1ZV9kZXB0aCkgeworCQkJCXByX2VycigiZGV2WyVwXTogUGFzc2VkIHF1ZXVlX2RlcHRoOiIKIAkJCQkJIiAldSBleGNlZWRzIFRDTS9TRV9EZXZpY2UgTUFYIgogCQkJCQkiIFRDUTogJXVcbiIsIGRldiwgcXVldWVfZGVwdGgsCi0JCQkJCURFVl9BVFRSSUIoZGV2KS0+aHdfcXVldWVfZGVwdGgpOwotCQkJCXJldHVybiAtMTsKKwkJCQkJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmh3X3F1ZXVlX2RlcHRoKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfQogCX0KIAotCURFVl9BVFRSSUIoZGV2KS0+cXVldWVfZGVwdGggPSBkZXYtPnF1ZXVlX2RlcHRoID0gcXVldWVfZGVwdGg7CisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLnF1ZXVlX2RlcHRoID0gZGV2LT5xdWV1ZV9kZXB0aCA9IHF1ZXVlX2RlcHRoOwogCWlmIChxdWV1ZV9kZXB0aCA+IG9yaWdfcXVldWVfZGVwdGgpCiAJCWF0b21pY19hZGQocXVldWVfZGVwdGggLSBvcmlnX3F1ZXVlX2RlcHRoLCAmZGV2LT5kZXB0aF9sZWZ0KTsKIAllbHNlIGlmIChxdWV1ZV9kZXB0aCA8IG9yaWdfcXVldWVfZGVwdGgpCiAJCWF0b21pY19zdWIob3JpZ19xdWV1ZV9kZXB0aCAtIHF1ZXVlX2RlcHRoLCAmZGV2LT5kZXB0aF9sZWZ0KTsKIAotCXByaW50ayhLRVJOX0lORk8gImRldlslcF06IFNFIERldmljZSBUQ1EgRGVwdGggY2hhbmdlZCB0bzogJXVcbiIsCisJcHJfZGVidWcoImRldlslcF06IFNFIERldmljZSBUQ1EgRGVwdGggY2hhbmdlZCB0bzogJXVcbiIsCiAJCQlkZXYsIHF1ZXVlX2RlcHRoKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExNzcsNTAgKzEyMDEsNTAgQEAKIAlpbnQgZm9yY2UgPSAwOyAvKiBGb3JjZSBzZXR0aW5nIGZvciBWREVWUyAqLwogCiAJaWYgKGF0b21pY19yZWFkKCZkZXYtPmRldl9leHBvcnRfb2JqLm9ial9hY2Nlc3NfY291bnQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZGV2WyVwXTogVW5hYmxlIHRvIGNoYW5nZSBTRSBEZXZpY2UiCisJCXByX2VycigiZGV2WyVwXTogVW5hYmxlIHRvIGNoYW5nZSBTRSBEZXZpY2UiCiAJCQkiIG1heF9zZWN0b3JzIHdoaWxlIGRldl9leHBvcnRfb2JqOiAlZCBjb3VudCBleGlzdHNcbiIsCiAJCQlkZXYsIGF0b21pY19yZWFkKCZkZXYtPmRldl9leHBvcnRfb2JqLm9ial9hY2Nlc3NfY291bnQpKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCEobWF4X3NlY3RvcnMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZGV2WyVwXTogSWxsZWdhbCBaRVJPIHZhbHVlIGZvciIKKwlpZiAoIW1heF9zZWN0b3JzKSB7CisJCXByX2VycigiZGV2WyVwXTogSWxsZWdhbCBaRVJPIHZhbHVlIGZvciIKIAkJCSIgbWF4X3NlY3RvcnNcbiIsIGRldik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChtYXhfc2VjdG9ycyA8IERBX1NUQVRVU19NQVhfU0VDVE9SU19NSU4pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkZXZbJXBdOiBQYXNzZWQgbWF4X3NlY3RvcnM6ICV1IGxlc3MgdGhhbiIKKwkJcHJfZXJyKCJkZXZbJXBdOiBQYXNzZWQgbWF4X3NlY3RvcnM6ICV1IGxlc3MgdGhhbiIKIAkJCSIgREFfU1RBVFVTX01BWF9TRUNUT1JTX01JTjogJXVcbiIsIGRldiwgbWF4X3NlY3RvcnMsCiAJCQkJREFfU1RBVFVTX01BWF9TRUNUT1JTX01JTik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmIChUUkFOU1BPUlQoZGV2KS0+dHJhbnNwb3J0X3R5cGUgPT0gVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpIHsKLQkJaWYgKG1heF9zZWN0b3JzID4gREVWX0FUVFJJQihkZXYpLT5od19tYXhfc2VjdG9ycykgewotCQkJcHJpbnRrKEtFUk5fRVJSICJkZXZbJXBdOiBQYXNzZWQgbWF4X3NlY3RvcnM6ICV1IgorCWlmIChkZXYtPnRyYW5zcG9ydC0+dHJhbnNwb3J0X3R5cGUgPT0gVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpIHsKKwkJaWYgKG1heF9zZWN0b3JzID4gZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmh3X21heF9zZWN0b3JzKSB7CisJCQlwcl9lcnIoImRldlslcF06IFBhc3NlZCBtYXhfc2VjdG9yczogJXUiCiAJCQkJIiBncmVhdGVyIHRoYW4gVENNL1NFX0RldmljZSBtYXhfc2VjdG9yczoiCiAJCQkJIiAldVxuIiwgZGV2LCBtYXhfc2VjdG9ycywKLQkJCQlERVZfQVRUUklCKGRldiktPmh3X21heF9zZWN0b3JzKTsKLQkJCSByZXR1cm4gLTE7CisJCQkJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmh3X21heF9zZWN0b3JzKTsKKwkJCSByZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0gZWxzZSB7Ci0JCWlmICghKGZvcmNlKSAmJiAobWF4X3NlY3RvcnMgPgotCQkJCSBERVZfQVRUUklCKGRldiktPmh3X21heF9zZWN0b3JzKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJkZXZbJXBdOiBQYXNzZWQgbWF4X3NlY3RvcnM6ICV1IgorCQlpZiAoIWZvcmNlICYmIChtYXhfc2VjdG9ycyA+CisJCQkJIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5od19tYXhfc2VjdG9ycykpIHsKKwkJCXByX2VycigiZGV2WyVwXTogUGFzc2VkIG1heF9zZWN0b3JzOiAldSIKIAkJCQkiIGdyZWF0ZXIgdGhhbiBUQ00vU0VfRGV2aWNlIG1heF9zZWN0b3JzIgogCQkJCSI6ICV1LCB1c2UgZm9yY2U9MSB0byBvdmVycmlkZS5cbiIsIGRldiwKLQkJCQltYXhfc2VjdG9ycywgREVWX0FUVFJJQihkZXYpLT5od19tYXhfc2VjdG9ycyk7Ci0JCQlyZXR1cm4gLTE7CisJCQkJbWF4X3NlY3RvcnMsIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5od19tYXhfc2VjdG9ycyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAobWF4X3NlY3RvcnMgPiBEQV9TVEFUVVNfTUFYX1NFQ1RPUlNfTUFYKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImRldlslcF06IFBhc3NlZCBtYXhfc2VjdG9yczogJXUiCisJCQlwcl9lcnIoImRldlslcF06IFBhc3NlZCBtYXhfc2VjdG9yczogJXUiCiAJCQkJIiBncmVhdGVyIHRoYW4gREFfU1RBVFVTX01BWF9TRUNUT1JTX01BWDoiCiAJCQkJIiAldVxuIiwgZGV2LCBtYXhfc2VjdG9ycywKIAkJCQlEQV9TVEFUVVNfTUFYX1NFQ1RPUlNfTUFYKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCi0JREVWX0FUVFJJQihkZXYpLT5tYXhfc2VjdG9ycyA9IG1heF9zZWN0b3JzOwotCXByaW50aygiZGV2WyVwXTogU0UgRGV2aWNlIG1heF9zZWN0b3JzIGNoYW5nZWQgdG8gJXVcbiIsCisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLm1heF9zZWN0b3JzID0gbWF4X3NlY3RvcnM7CisJcHJfZGVidWcoImRldlslcF06IFNFIERldmljZSBtYXhfc2VjdG9ycyBjaGFuZ2VkIHRvICV1XG4iLAogCQkJZGV2LCBtYXhfc2VjdG9ycyk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjI4LDI1ICsxMjUyLDI1IEBACiBpbnQgc2VfZGV2X3NldF9vcHRpbWFsX3NlY3RvcnMoc3RydWN0IHNlX2RldmljZSAqZGV2LCB1MzIgb3B0aW1hbF9zZWN0b3JzKQogewogCWlmIChhdG9taWNfcmVhZCgmZGV2LT5kZXZfZXhwb3J0X29iai5vYmpfYWNjZXNzX2NvdW50KSkgewotCQlwcmludGsoS0VSTl9FUlIgImRldlslcF06IFVuYWJsZSB0byBjaGFuZ2UgU0UgRGV2aWNlIgorCQlwcl9lcnIoImRldlslcF06IFVuYWJsZSB0byBjaGFuZ2UgU0UgRGV2aWNlIgogCQkJIiBvcHRpbWFsX3NlY3RvcnMgd2hpbGUgZGV2X2V4cG9ydF9vYmo6ICVkIGNvdW50IGV4aXN0c1xuIiwKIAkJCWRldiwgYXRvbWljX3JlYWQoJmRldi0+ZGV2X2V4cG9ydF9vYmoub2JqX2FjY2Vzc19jb3VudCkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKFRSQU5TUE9SVChkZXYpLT50cmFuc3BvcnRfdHlwZSA9PSBUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVikgewotCQlwcmludGsoS0VSTl9FUlIgImRldlslcF06IFBhc3NlZCBvcHRpbWFsX3NlY3RvcnMgY2Fubm90IGJlIgorCWlmIChkZXYtPnRyYW5zcG9ydC0+dHJhbnNwb3J0X3R5cGUgPT0gVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpIHsKKwkJcHJfZXJyKCJkZXZbJXBdOiBQYXNzZWQgb3B0aW1hbF9zZWN0b3JzIGNhbm5vdCBiZSIKIAkJCQkiIGNoYW5nZWQgZm9yIFRDTS9wU0NTSVxuIiwgZGV2KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmIChvcHRpbWFsX3NlY3RvcnMgPiBERVZfQVRUUklCKGRldiktPm1heF9zZWN0b3JzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZGV2WyVwXTogUGFzc2VkIG9wdGltYWxfc2VjdG9ycyAldSBjYW5ub3QgYmUiCisJaWYgKG9wdGltYWxfc2VjdG9ycyA+IGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5tYXhfc2VjdG9ycykgeworCQlwcl9lcnIoImRldlslcF06IFBhc3NlZCBvcHRpbWFsX3NlY3RvcnMgJXUgY2Fubm90IGJlIgogCQkJIiBncmVhdGVyIHRoYW4gbWF4X3NlY3RvcnM6ICV1XG4iLCBkZXYsCi0JCQlvcHRpbWFsX3NlY3RvcnMsIERFVl9BVFRSSUIoZGV2KS0+bWF4X3NlY3RvcnMpOworCQkJb3B0aW1hbF9zZWN0b3JzLCBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIubWF4X3NlY3RvcnMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlERVZfQVRUUklCKGRldiktPm9wdGltYWxfc2VjdG9ycyA9IG9wdGltYWxfc2VjdG9yczsKLQlwcmludGsoS0VSTl9JTkZPICJkZXZbJXBdOiBTRSBEZXZpY2Ugb3B0aW1hbF9zZWN0b3JzIGNoYW5nZWQgdG8gJXVcbiIsCisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLm9wdGltYWxfc2VjdG9ycyA9IG9wdGltYWxfc2VjdG9yczsKKwlwcl9kZWJ1ZygiZGV2WyVwXTogU0UgRGV2aWNlIG9wdGltYWxfc2VjdG9ycyBjaGFuZ2VkIHRvICV1XG4iLAogCQkJZGV2LCBvcHRpbWFsX3NlY3RvcnMpOwogCXJldHVybiAwOwogfQpAQCAtMTI1NCwzMSArMTI3OCwzMSBAQAogaW50IHNlX2Rldl9zZXRfYmxvY2tfc2l6ZShzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsIHUzMiBibG9ja19zaXplKQogewogCWlmIChhdG9taWNfcmVhZCgmZGV2LT5kZXZfZXhwb3J0X29iai5vYmpfYWNjZXNzX2NvdW50KSkgewotCQlwcmludGsoS0VSTl9FUlIgImRldlslcF06IFVuYWJsZSB0byBjaGFuZ2UgU0UgRGV2aWNlIGJsb2NrX3NpemUiCisJCXByX2VycigiZGV2WyVwXTogVW5hYmxlIHRvIGNoYW5nZSBTRSBEZXZpY2UgYmxvY2tfc2l6ZSIKIAkJCSIgd2hpbGUgZGV2X2V4cG9ydF9vYmo6ICVkIGNvdW50IGV4aXN0c1xuIiwgZGV2LAogCQkJYXRvbWljX3JlYWQoJmRldi0+ZGV2X2V4cG9ydF9vYmoub2JqX2FjY2Vzc19jb3VudCkpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmICgoYmxvY2tfc2l6ZSAhPSA1MTIpICYmCiAJICAgIChibG9ja19zaXplICE9IDEwMjQpICYmCiAJICAgIChibG9ja19zaXplICE9IDIwNDgpICYmCiAJICAgIChibG9ja19zaXplICE9IDQwOTYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZGV2WyVwXTogSWxsZWdhbCB2YWx1ZSBmb3IgYmxvY2tfZGV2aWNlOiAldSIKKwkJcHJfZXJyKCJkZXZbJXBdOiBJbGxlZ2FsIHZhbHVlIGZvciBibG9ja19kZXZpY2U6ICV1IgogCQkJIiBmb3IgU0UgZGV2aWNlLCBtdXN0IGJlIDUxMiwgMTAyNCwgMjA0OCBvciA0MDk2XG4iLAogCQkJZGV2LCBibG9ja19zaXplKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoVFJBTlNQT1JUKGRldiktPnRyYW5zcG9ydF90eXBlID09IFRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZGV2WyVwXTogTm90IGFsbG93ZWQgdG8gY2hhbmdlIGJsb2NrX3NpemUgZm9yIgorCWlmIChkZXYtPnRyYW5zcG9ydC0+dHJhbnNwb3J0X3R5cGUgPT0gVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpIHsKKwkJcHJfZXJyKCJkZXZbJXBdOiBOb3QgYWxsb3dlZCB0byBjaGFuZ2UgYmxvY2tfc2l6ZSBmb3IiCiAJCQkiIFBoeXNpY2FsIERldmljZSwgdXNlIGZvciBMaW51eC9TQ1NJIHRvIGNoYW5nZSIKIAkJCSIgYmxvY2tfc2l6ZSBmb3IgdW5kZXJseWluZyBoYXJkd2FyZVxuIiwgZGV2KTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlERVZfQVRUUklCKGRldiktPmJsb2NrX3NpemUgPSBibG9ja19zaXplOwotCXByaW50ayhLRVJOX0lORk8gImRldlslcF06IFNFIERldmljZSBibG9ja19zaXplIGNoYW5nZWQgdG8gJXVcbiIsCisJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUgPSBibG9ja19zaXplOworCXByX2RlYnVnKCJkZXZbJXBdOiBTRSBEZXZpY2UgYmxvY2tfc2l6ZSBjaGFuZ2VkIHRvICV1XG4iLAogCQkJZGV2LCBibG9ja19zaXplKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEyOTMsMTMgKzEzMTcsMTMgQEAKIAl1MzIgbHVuX2FjY2VzcyA9IDA7CiAKIAlpZiAoYXRvbWljX3JlYWQoJmRldi0+ZGV2X2FjY2Vzc19vYmoub2JqX2FjY2Vzc19jb3VudCkgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBleHBvcnQgc3RydWN0IHNlX2RldmljZSB3aGlsZSBkZXZfYWNjZXNzX29iajogJWRcbiIsCisJCXByX2VycigiVW5hYmxlIHRvIGV4cG9ydCBzdHJ1Y3Qgc2VfZGV2aWNlIHdoaWxlIGRldl9hY2Nlc3Nfb2JqOiAlZFxuIiwKIAkJCWF0b21pY19yZWFkKCZkZXYtPmRldl9hY2Nlc3Nfb2JqLm9ial9hY2Nlc3NfY291bnQpKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJbHVuX3AgPSBjb3JlX3RwZ19wcmVfYWRkbHVuKHRwZywgbHVuKTsKLQlpZiAoKElTX0VSUihsdW5fcCkpIHx8ICEobHVuX3ApKQorCWlmICgoSVNfRVJSKGx1bl9wKSkgfHwgIWx1bl9wKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChkZXYtPmRldl9mbGFncyAmIERGX1JFQURfT05MWSkKQEAgLTEzMTAsMTUgKzEzMzQsMTUgQEAKIAlpZiAoY29yZV90cGdfcG9zdF9hZGRsdW4odHBnLCBsdW5fcCwgbHVuX2FjY2VzcywgZGV2KSA8IDApCiAJCXJldHVybiBOVUxMOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXNfVFBHWyV1XV9MVU5bJXVdIC0gQWN0aXZhdGVkICVzIExvZ2ljYWwgVW5pdCBmcm9tIgotCQkiIENPUkUgSEJBOiAldVxuIiwgVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpLCBsdW5fcC0+dW5wYWNrZWRfbHVuLAotCQlUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpLCBoYmEtPmhiYV9pZCk7CisJcHJfZGVidWcoIiVzX1RQR1sldV1fTFVOWyV1XSAtIEFjdGl2YXRlZCAlcyBMb2dpY2FsIFVuaXQgZnJvbSIKKwkJIiBDT1JFIEhCQTogJXVcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSwgbHVuX3AtPnVucGFja2VkX2x1biwKKwkJdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgaGJhLT5oYmFfaWQpOwogCS8qCiAJICogVXBkYXRlIExVTiBtYXBzIGZvciBkeW5hbWljYWxseSBhZGRlZCBpbml0aWF0b3JzIHdoZW4KIAkgKiBnZW5lcmF0ZV9ub2RlX2FjbCBpcyBlbmFibGVkLgogCSAqLwotCWlmIChUUEdfVEZPKHRwZyktPnRwZ19jaGVja19kZW1vX21vZGUodHBnKSkgeworCWlmICh0cGctPnNlX3RwZ190Zm8tPnRwZ19jaGVja19kZW1vX21vZGUodHBnKSkgewogCQlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKmFjbDsKIAkJc3Bpbl9sb2NrX2JoKCZ0cGctPmFjbF9ub2RlX2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFjbCwgJnRwZy0+YWNsX25vZGVfbGlzdCwgYWNsX2xpc3QpIHsKQEAgLTEzNDYsMTUgKzEzNzAsMTUgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWx1biA9IGNvcmVfdHBnX3ByZV9kZWxsdW4odHBnLCB1bnBhY2tlZF9sdW4sICZyZXQpOwotCWlmICghKGx1bikpCisJaWYgKCFsdW4pCiAJCXJldHVybiByZXQ7CiAKIAljb3JlX3RwZ19wb3N0X2RlbGx1bih0cGcsIGx1bik7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlc19UUEdbJXVdX0xVTlsldV0gLSBEZWFjdGl2YXRlZCAlcyBMb2dpY2FsIFVuaXQgZnJvbSIKLQkJIiBkZXZpY2Ugb2JqZWN0XG4iLCBUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpLAotCQlUUEdfVEZPKHRwZyktPnRwZ19nZXRfdGFnKHRwZyksIHVucGFja2VkX2x1biwKLQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSk7CisJcHJfZGVidWcoIiVzX1RQR1sldV1fTFVOWyV1XSAtIERlYWN0aXZhdGVkICVzIExvZ2ljYWwgVW5pdCBmcm9tIgorCQkiIGRldmljZSBvYmplY3RcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSwgdW5wYWNrZWRfbHVuLAorCQl0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTM2NSwyMSArMTM4OSwyMSBAQAogCiAJc3Bpbl9sb2NrKCZ0cGctPnRwZ19sdW5fbG9jayk7CiAJaWYgKHVucGFja2VkX2x1biA+IChUUkFOU1BPUlRfTUFYX0xVTlNfUEVSX1RQRy0xKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzIExVTjogJXUgZXhjZWVkcyBUUkFOU1BPUlRfTUFYX0xVTlMiCisJCXByX2VycigiJXMgTFVOOiAldSBleGNlZWRzIFRSQU5TUE9SVF9NQVhfTFVOUyIKIAkJCSJfUEVSX1RQRy0xOiAldSBmb3IgVGFyZ2V0IFBvcnRhbCBHcm91cDogJWh1XG4iLAotCQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwgdW5wYWNrZWRfbHVuLAorCQkJdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgdW5wYWNrZWRfbHVuLAogCQkJVFJBTlNQT1JUX01BWF9MVU5TX1BFUl9UUEctMSwKLQkJCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSk7CisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfdGFnKHRwZykpOwogCQlzcGluX3VubG9jaygmdHBnLT50cGdfbHVuX2xvY2spOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJbHVuID0gJnRwZy0+dHBnX2x1bl9saXN0W3VucGFja2VkX2x1bl07CiAKIAlpZiAobHVuLT5sdW5fc3RhdHVzICE9IFRSQU5TUE9SVF9MVU5fU1RBVFVTX0ZSRUUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyBMb2dpY2FsIFVuaXQgTnVtYmVyOiAldSBpcyBub3QgZnJlZSBvbiIKKwkJcHJfZXJyKCIlcyBMb2dpY2FsIFVuaXQgTnVtYmVyOiAldSBpcyBub3QgZnJlZSBvbiIKIAkJCSIgVGFyZ2V0IFBvcnRhbCBHcm91cDogJWh1LCBpZ25vcmluZyByZXF1ZXN0LlxuIiwKLQkJCVRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksIHVucGFja2VkX2x1biwKLQkJCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSk7CisJCQl0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLCB1bnBhY2tlZF9sdW4sCisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfdGFnKHRwZykpOwogCQlzcGluX3VubG9jaygmdHBnLT50cGdfbHVuX2xvY2spOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xMzk4LDIxICsxNDIyLDIxIEBACiAKIAlzcGluX2xvY2soJnRwZy0+dHBnX2x1bl9sb2NrKTsKIAlpZiAodW5wYWNrZWRfbHVuID4gKFRSQU5TUE9SVF9NQVhfTFVOU19QRVJfVFBHLTEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgTFVOOiAldSBleGNlZWRzIFRSQU5TUE9SVF9NQVhfTFVOU19QRVIiCisJCXByX2VycigiJXMgTFVOOiAldSBleGNlZWRzIFRSQU5TUE9SVF9NQVhfTFVOU19QRVIiCiAJCQkiX1RQRy0xOiAldSBmb3IgVGFyZ2V0IFBvcnRhbCBHcm91cDogJWh1XG4iLAotCQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwgdW5wYWNrZWRfbHVuLAorCQkJdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgdW5wYWNrZWRfbHVuLAogCQkJVFJBTlNQT1JUX01BWF9MVU5TX1BFUl9UUEctMSwKLQkJCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSk7CisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfdGFnKHRwZykpOwogCQlzcGluX3VubG9jaygmdHBnLT50cGdfbHVuX2xvY2spOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJbHVuID0gJnRwZy0+dHBnX2x1bl9saXN0W3VucGFja2VkX2x1bl07CiAKIAlpZiAobHVuLT5sdW5fc3RhdHVzICE9IFRSQU5TUE9SVF9MVU5fU1RBVFVTX0FDVElWRSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzIExvZ2ljYWwgVW5pdCBOdW1iZXI6ICV1IGlzIG5vdCBhY3RpdmUgb24iCisJCXByX2VycigiJXMgTG9naWNhbCBVbml0IE51bWJlcjogJXUgaXMgbm90IGFjdGl2ZSBvbiIKIAkJCSIgVGFyZ2V0IFBvcnRhbCBHcm91cDogJWh1LCBpZ25vcmluZyByZXF1ZXN0LlxuIiwKLQkJCVRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksIHVucGFja2VkX2x1biwKLQkJCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSk7CisJCQl0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLCB1bnBhY2tlZF9sdW4sCisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfdGFnKHRwZykpOwogCQlzcGluX3VubG9jaygmdHBnLT50cGdfbHVuX2xvY2spOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xNDMwLDIwICsxNDU0LDIwIEBACiAJc3RydWN0IHNlX2x1bl9hY2wgKmxhY2w7CiAJc3RydWN0IHNlX25vZGVfYWNsICpuYWNsOwogCi0JaWYgKHN0cmxlbihpbml0aWF0b3JuYW1lKSA+IFRSQU5TUE9SVF9JUU5fTEVOKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgSW5pdGlhdG9yTmFtZSBleGNlZWRzIG1heGltdW0gc2l6ZS5cbiIsCi0JCQlUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpKTsKKwlpZiAoc3RybGVuKGluaXRpYXRvcm5hbWUpID49IFRSQU5TUE9SVF9JUU5fTEVOKSB7CisJCXByX2VycigiJXMgSW5pdGlhdG9yTmFtZSBleGNlZWRzIG1heGltdW0gc2l6ZS5cbiIsCisJCQl0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpKTsKIAkJKnJldCA9IC1FT1ZFUkZMT1c7CiAJCXJldHVybiBOVUxMOwogCX0KIAluYWNsID0gY29yZV90cGdfZ2V0X2luaXRpYXRvcl9ub2RlX2FjbCh0cGcsIGluaXRpYXRvcm5hbWUpOwotCWlmICghKG5hY2wpKSB7CisJaWYgKCFuYWNsKSB7CiAJCSpyZXQgPSAtRUlOVkFMOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJbGFjbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZV9sdW5fYWNsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEobGFjbCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJ1Y3Qgc2VfbHVuX2FjbC5cbiIpOworCWlmICghbGFjbCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cnVjdCBzZV9sdW5fYWNsLlxuIik7CiAJCSpyZXQgPSAtRU5PTUVNOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xNDY2LDE2ICsxNDkwLDE2IEBACiAJc3RydWN0IHNlX25vZGVfYWNsICpuYWNsOwogCiAJbHVuID0gY29yZV9kZXZfZ2V0X2x1bih0cGcsIHVucGFja2VkX2x1bik7Ci0JaWYgKCEobHVuKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzIExvZ2ljYWwgVW5pdCBOdW1iZXI6ICV1IGlzIG5vdCBhY3RpdmUgb24iCisJaWYgKCFsdW4pIHsKKwkJcHJfZXJyKCIlcyBMb2dpY2FsIFVuaXQgTnVtYmVyOiAldSBpcyBub3QgYWN0aXZlIG9uIgogCQkJIiBUYXJnZXQgUG9ydGFsIEdyb3VwOiAlaHUsIGlnbm9yaW5nIHJlcXVlc3QuXG4iLAotCQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwgdW5wYWNrZWRfbHVuLAotCQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpKTsKKwkJCXRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksIHVucGFja2VkX2x1biwKKwkJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCW5hY2wgPSBsYWNsLT5zZV9sdW5fbmFjbDsKLQlpZiAoIShuYWNsKSkKKwlpZiAoIW5hY2wpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKChsdW4tPmx1bl9hY2Nlc3MgJiBUUkFOU1BPUlRfTFVORkxBR1NfUkVBRF9PTkxZKSAmJgpAQCAtMTQ5NCw5ICsxNTE4LDkgQEAKIAlzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKTsKIAlzcGluX3VubG9jaygmbHVuLT5sdW5fYWNsX2xvY2spOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXNfVFBHWyVodV1fTFVOWyV1LT4ldV0gLSBBZGRlZCAlcyBBQ0wgZm9yICIKLQkJIiBJbml0aWF0b3JOb2RlOiAlc1xuIiwgVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpLCB1bnBhY2tlZF9sdW4sIGxhY2wtPm1hcHBlZF9sdW4sCisJcHJfZGVidWcoIiVzX1RQR1slaHVdX0xVTlsldS0+JXVdIC0gQWRkZWQgJXMgQUNMIGZvciAiCisJCSIgSW5pdGlhdG9yTm9kZTogJXNcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSwgdW5wYWNrZWRfbHVuLCBsYWNsLT5tYXBwZWRfbHVuLAogCQkobHVuX2FjY2VzcyAmIFRSQU5TUE9SVF9MVU5GTEFHU19SRUFEX1dSSVRFKSA/ICJSVyIgOiAiUk8iLAogCQlsYWNsLT5pbml0aWF0b3JuYW1lKTsKIAkvKgpAQCAtMTUxOSw3ICsxNTQzLDcgQEAKIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKm5hY2w7CiAKIAluYWNsID0gbGFjbC0+c2VfbHVuX25hY2w7Ci0JaWYgKCEobmFjbCkpCisJaWYgKCFuYWNsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9jaygmbHVuLT5sdW5fYWNsX2xvY2spOwpAQCAtMTUzMywxMCArMTU1NywxMCBAQAogCiAJbGFjbC0+c2VfbHVuID0gTlVMTDsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzX1RQR1slaHVdX0xVTlsldV0gLSBSZW1vdmVkIEFDTCBmb3IiCisJcHJfZGVidWcoIiVzX1RQR1slaHVdX0xVTlsldV0gLSBSZW1vdmVkIEFDTCBmb3IiCiAJCSIgSW5pdGlhdG9yTm9kZTogJXMgTWFwcGVkIExVTjogJXVcbiIsCi0JCVRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksCi0JCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSwgbHVuLT51bnBhY2tlZF9sdW4sCisJCXRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSwgbHVuLT51bnBhY2tlZF9sdW4sCiAJCWxhY2wtPmluaXRpYXRvcm5hbWUsIGxhY2wtPm1hcHBlZF9sdW4pOwogCiAJcmV0dXJuIDA7CkBAIC0xNTQ2LDEwICsxNTcwLDEwIEBACiAJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqdHBnLAogCXN0cnVjdCBzZV9sdW5fYWNsICpsYWNsKQogewotCXByaW50aygiJXNfVFBHWyVodV0gLSBGcmVlaW5nIEFDTCBmb3IgJXMgSW5pdGlhdG9yTm9kZTogJXMiCi0JCSIgTWFwcGVkIExVTjogJXVcbiIsIFRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksCi0JCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSwKLQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKKwlwcl9kZWJ1ZygiJXNfVFBHWyVodV0gLSBGcmVlaW5nIEFDTCBmb3IgJXMgSW5pdGlhdG9yTm9kZTogJXMiCisJCSIgTWFwcGVkIExVTjogJXVcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSwKKwkJdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwKIAkJbGFjbC0+aW5pdGlhdG9ybmFtZSwgbGFjbC0+bWFwcGVkX2x1bik7CiAKIAlrZnJlZShsYWNsKTsKQEAgLTE1NjQsNjQgKzE1ODgsNjQgQEAKIAljaGFyIGJ1ZlsxNl07CiAJaW50IHJldDsKIAotCWhiYSA9IGNvcmVfYWxsb2NfaGJhKCJyZF9kciIsIDAsIEhCQV9GTEFHU19JTlRFUk5BTF9VU0UpOworCWhiYSA9IGNvcmVfYWxsb2NfaGJhKCJyZF9tY3AiLCAwLCBIQkFfRkxBR1NfSU5URVJOQUxfVVNFKTsKIAlpZiAoSVNfRVJSKGhiYSkpCiAJCXJldHVybiBQVFJfRVJSKGhiYSk7CiAKLQlzZV9nbG9iYWwtPmdfbHVuMF9oYmEgPSBoYmE7CisJbHVuMF9oYmEgPSBoYmE7CiAJdCA9IGhiYS0+dHJhbnNwb3J0OwogCiAJc2VfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIShzZV9kZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IiCisJaWYgKCFzZV9kZXYpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciIKIAkJCQkiIHN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2XG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQotCUlOSVRfTElTVF9IRUFEKCZzZV9kZXYtPmdfc2VfZGV2X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzZV9kZXYtPnNlX2Rldl9ub2RlKTsKIAlJTklUX0xJU1RfSEVBRCgmc2VfZGV2LT50MTBfd3duLnQxMF92cGRfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnNlX2Rldi0+dDEwX3d3bi50MTBfdnBkX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZzZV9kZXYtPnQxMF9yZXNlcnZhdGlvbi5yZWdpc3RyYXRpb25fbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNlX2Rldi0+dDEwX3Jlc2VydmF0aW9uLmFwdHBsX3JlZ19saXN0KTsKLQlzcGluX2xvY2tfaW5pdCgmc2VfZGV2LT50MTBfcmVzZXJ2YXRpb24ucmVnaXN0cmF0aW9uX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZzZV9kZXYtPnQxMF9yZXNlcnZhdGlvbi5hcHRwbF9yZWdfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnNlX2Rldi0+dDEwX3ByLnJlZ2lzdHJhdGlvbl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmc2VfZGV2LT50MTBfcHIuYXB0cGxfcmVnX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZzZV9kZXYtPnQxMF9wci5yZWdpc3RyYXRpb25fbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnNlX2Rldi0+dDEwX3ByLmFwdHBsX3JlZ19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmc2VfZGV2LT50MTBfYWx1YS50Z19wdF9ncHNfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnNlX2Rldi0+dDEwX2FsdWEudGdfcHRfZ3BzX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZzZV9kZXYtPnNlX2Rldl9sb2NrKTsKLQlzZV9kZXYtPnQxMF9yZXNlcnZhdGlvbi5wcl9hcHRwbF9idWZfbGVuID0gUFJfQVBUUExfQlVGX0xFTjsKKwlzZV9kZXYtPnQxMF9wci5wcl9hcHRwbF9idWZfbGVuID0gUFJfQVBUUExfQlVGX0xFTjsKIAlzZV9kZXYtPnQxMF93d24udDEwX3N1Yl9kZXYgPSBzZV9kZXY7CiAJc2VfZGV2LT50MTBfYWx1YS50MTBfc3ViX2RldiA9IHNlX2RldjsKIAlzZV9kZXYtPnNlX2Rldl9hdHRyaWIuZGFfc3ViX2RldiA9IHNlX2RldjsKIAlzZV9kZXYtPnNlX2Rldl9oYmEgPSBoYmE7CiAKIAlzZV9kZXYtPnNlX2Rldl9zdV9wdHIgPSB0LT5hbGxvY2F0ZV92aXJ0ZGV2aWNlKGhiYSwgInZpcnRfbHVuMCIpOwotCWlmICghKHNlX2Rldi0+c2VfZGV2X3N1X3B0cikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIHN1YnN5c3RlbSBkZXBlbmRlbnQgcG9pbnRlciIKKwlpZiAoIXNlX2Rldi0+c2VfZGV2X3N1X3B0cikgeworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgc3Vic3lzdGVtIGRlcGVuZGVudCBwb2ludGVyIgogCQkJIiBmcm9tIGFsbG9jYXRlX3ZpcnRkZXZpY2UoKVxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KLQlzZV9nbG9iYWwtPmdfbHVuMF9zdV9kZXYgPSBzZV9kZXY7CisJbHVuMF9zdV9kZXYgPSBzZV9kZXY7CiAKIAltZW1zZXQoYnVmLCAwLCAxNik7CiAJc3ByaW50ZihidWYsICJyZF9wYWdlcz04Iik7CiAJdC0+c2V0X2NvbmZpZ2ZzX2Rldl9wYXJhbXMoaGJhLCBzZV9kZXYsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCiAJZGV2ID0gdC0+Y3JlYXRlX3ZpcnRkZXZpY2UoaGJhLCBzZV9kZXYsIHNlX2Rldi0+c2VfZGV2X3N1X3B0cik7Ci0JaWYgKCEoZGV2KSB8fCBJU19FUlIoZGV2KSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmIChJU19FUlIoZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKGRldik7CiAJCWdvdG8gb3V0OwogCX0KIAlzZV9kZXYtPnNlX2Rldl9wdHIgPSBkZXY7Ci0Jc2VfZ2xvYmFsLT5nX2x1bjBfZGV2ID0gZGV2OworCWdfbHVuMF9kZXYgPSBkZXY7CiAKIAlyZXR1cm4gMDsKIG91dDoKLQlzZV9nbG9iYWwtPmdfbHVuMF9zdV9kZXYgPSBOVUxMOworCWx1bjBfc3VfZGV2ID0gTlVMTDsKIAlrZnJlZShzZV9kZXYpOwotCWlmIChzZV9nbG9iYWwtPmdfbHVuMF9oYmEpIHsKLQkJY29yZV9kZWxldGVfaGJhKHNlX2dsb2JhbC0+Z19sdW4wX2hiYSk7Ci0JCXNlX2dsb2JhbC0+Z19sdW4wX2hiYSA9IE5VTEw7CisJaWYgKGx1bjBfaGJhKSB7CisJCWNvcmVfZGVsZXRlX2hiYShsdW4wX2hiYSk7CisJCWx1bjBfaGJhID0gTlVMTDsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2MjksMTQgKzE2NTMsMTQgQEAKIAogdm9pZCBjb3JlX2Rldl9yZWxlYXNlX3ZpcnR1YWxfbHVuMCh2b2lkKQogewotCXN0cnVjdCBzZV9oYmEgKmhiYSA9IHNlX2dsb2JhbC0+Z19sdW4wX2hiYTsKLQlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gc2VfZ2xvYmFsLT5nX2x1bjBfc3VfZGV2OworCXN0cnVjdCBzZV9oYmEgKmhiYSA9IGx1bjBfaGJhOworCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBsdW4wX3N1X2RldjsKIAotCWlmICghKGhiYSkpCisJaWYgKCFoYmEpCiAJCXJldHVybjsKIAotCWlmIChzZV9nbG9iYWwtPmdfbHVuMF9kZXYpCi0JCXNlX2ZyZWVfdmlydHVhbF9kZXZpY2Uoc2VfZ2xvYmFsLT5nX2x1bjBfZGV2LCBoYmEpOworCWlmIChnX2x1bjBfZGV2KQorCQlzZV9mcmVlX3ZpcnR1YWxfZGV2aWNlKGdfbHVuMF9kZXYsIGhiYSk7CiAKIAlrZnJlZShzdV9kZXYpOwogCWNvcmVfZGVsZXRlX2hiYShoYmEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmFicmljX2NvbmZpZ2ZzLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfY29uZmlnZnMuYwppbmRleCAwN2FiNWEzLi5mMTY1NDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfY29uZmlnZnMuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfY29uZmlnZnMuYwpAQCAtNjAsNyArNjAsNyBAQAogCWNpdC0+Y3RfZ3JvdXBfb3BzID0gX2dyb3VwX29wczsJCQkJCVwKIAljaXQtPmN0X2F0dHJzID0gX2F0dHJzOwkJCQkJCVwKIAljaXQtPmN0X293bmVyID0gdGYtPnRmX21vZHVsZTsJCQkJCVwKLQlwcmludGsoIlNldHVwIGdlbmVyaWMgJXNcbiIsIF9fc3RyaW5naWZ5KF9uYW1lKSk7CQlcCisJcHJfZGVidWcoIlNldHVwIGdlbmVyaWMgJXNcbiIsIF9fc3RyaW5naWZ5KF9uYW1lKSk7CQlcCiB9CiAKIC8qIFN0YXJ0IG9mIHRmY190cGdfbWFwcGVkbHVuX2NpdCAqLwpAQCAtODAsOCArODAsOCBAQAogCS8qCiAJICogRW5zdXJlIHRoYXQgdGhlIHNvdXJjZSBwb3J0IGV4aXN0cwogCSAqLwotCWlmICghKGx1bi0+bHVuX3NlcCkgfHwgIShsdW4tPmx1bl9zZXAtPnNlcF90cGcpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU291cmNlIHNlX2x1bi0+bHVuX3NlcCBvciBsdW4tPmx1bl9zZXAtPnNlcCIKKwlpZiAoIWx1bi0+bHVuX3NlcCB8fCAhbHVuLT5sdW5fc2VwLT5zZXBfdHBnKSB7CisJCXByX2VycigiU291cmNlIHNlX2x1bi0+bHVuX3NlcCBvciBsdW4tPmx1bl9zZXAtPnNlcCIKIAkJCQkiX3RwZyBkb2VzIG5vdCBleGlzdFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTk2LDEyICs5NiwxMiBAQAogCSAqIE1ha2Ugc3VyZSB0aGUgU3ltTGluayBpcyBnb2luZyB0byB0aGUgc2FtZSAkRkFCUklDLyRXV04vdHBndF8kVFBHVAogCSAqLwogCWlmIChzdHJjbXAoY29uZmlnX2l0ZW1fbmFtZSh3d25fY2kpLCBjb25maWdfaXRlbV9uYW1lKHd3bl9jaV9zKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbGxlZ2FsIEluaXRpYXRvciBBQ0wgU3ltTGluayBvdXRzaWRlIG9mICVzXG4iLAorCQlwcl9lcnIoIklsbGVnYWwgSW5pdGlhdG9yIEFDTCBTeW1MaW5rIG91dHNpZGUgb2YgJXNcbiIsCiAJCQljb25maWdfaXRlbV9uYW1lKHd3bl9jaSkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHN0cmNtcChjb25maWdfaXRlbV9uYW1lKHRwZ19jaSksIGNvbmZpZ19pdGVtX25hbWUodHBnX2NpX3MpKSkgewotCQlwcmludGsoS0VSTl9FUlIgIklsbGVnYWwgSW5pdGlhdG9yIEFDTCBTeW1saW5rIG91dHNpZGUgb2YgJXMiCisJCXByX2VycigiSWxsZWdhbCBJbml0aWF0b3IgQUNMIFN5bWxpbmsgb3V0c2lkZSBvZiAlcyIKIAkJCSIgVFBHVDogJXNcbiIsIGNvbmZpZ19pdGVtX25hbWUod3duX2NpKSwKIAkJCWNvbmZpZ19pdGVtX25hbWUodHBnX2NpKSk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTE4LDcgKzExOCw3IEBACiAJCWx1bl9hY2Nlc3MgPSBkZXZlLT5sdW5fZmxhZ3M7CiAJZWxzZQogCQlsdW5fYWNjZXNzID0KLQkJCShUUEdfVEZPKHNlX3RwZyktPnRwZ19jaGVja19wcm9kX21vZGVfd3JpdGVfcHJvdGVjdCgKKwkJCShzZV90cGctPnNlX3RwZ190Zm8tPnRwZ19jaGVja19wcm9kX21vZGVfd3JpdGVfcHJvdGVjdCgKIAkJCQlzZV90cGcpKSA/IFRSQU5TUE9SVF9MVU5GTEFHU19SRUFEX09OTFkgOgogCQkJCQkgICBUUkFOU1BPUlRfTFVORkxBR1NfUkVBRF9XUklURTsKIAlzcGluX3VubG9ja19pcnEoJmxhY2wtPnNlX2x1bl9uYWNsLT5kZXZpY2VfbGlzdF9sb2NrKTsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCS8qCiAJICogRGV0ZXJtaW5lIGlmIHRoZSB1bmRlcmx5aW5nIE1hcHBlZExVTiBoYXMgYWxyZWFkeSBiZWVuIHJlbGVhc2VkLi4KIAkgKi8KLQlpZiAoIShkZXZlLT5zZV9sdW4pKQorCWlmICghZGV2ZS0+c2VfbHVuKQogCQlyZXR1cm4gMDsKIAogCWx1biA9IGNvbnRhaW5lcl9vZih0b19jb25maWdfZ3JvdXAobHVuX2NpKSwgc3RydWN0IHNlX2x1biwgbHVuX2dyb3VwKTsKQEAgLTIwMiw5ICsyMDIsOSBAQAogCQkJVFJBTlNQT1JUX0xVTkZMQUdTX1JFQURfV1JJVEUsCiAJCQlsYWNsLT5zZV9sdW5fbmFjbCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlc19Db25maWdGUzogQ2hhbmdlZCBJbml0aWF0b3IgQUNMOiAlcyIKKwlwcl9kZWJ1ZygiJXNfQ29uZmlnRlM6IENoYW5nZWQgSW5pdGlhdG9yIEFDTDogJXMiCiAJCSIgTWFwcGVkIExVTjogJXUgV3JpdGUgUHJvdGVjdCBiaXQgdG8gJXNcbiIsCi0JCVRQR19URk8oc2VfdHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCXNlX3RwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCiAJCWxhY2wtPmluaXRpYXRvcm5hbWUsIGxhY2wtPm1hcHBlZF9sdW4sIChvcCkgPyAiT04iIDogIk9GRiIpOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtMzI3LDE0ICszMjcsMTQgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWFjbF9jaSA9ICZncm91cC0+Y2dfaXRlbTsKLQlpZiAoIShhY2xfY2kpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvY2F0ZWwgYWNsX2NpXG4iKTsKKwlpZiAoIWFjbF9jaSkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGVsIGFjbF9jaVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWJ1ZiA9IGt6YWxsb2Moc3RybGVuKG5hbWUpICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoYnVmKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5hbWUgYnVmXG4iKTsKKwlpZiAoIWJ1ZikgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5hbWUgYnVmXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCXNucHJpbnRmKGJ1Ziwgc3RybGVuKG5hbWUpICsgMSwgIiVzIiwgbmFtZSk7CkBAIC0zNDIsNyArMzQyLDcgQEAKIAkgKiBNYWtlIHN1cmUgdXNlciBpcyBjcmVhdGluZyBpc2NzaS8kSVFOLyRUUEdUL2FjbHMvJElOSVRJQVRPUi9sdW5fJElELgogCSAqLwogCWlmIChzdHJzdHIoYnVmLCAibHVuXyIpICE9IGJ1ZikgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBsb2NhdGUgXCJsdW5fXCIgZnJvbSBidWY6ICVzIgorCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgXCJsdW5fXCIgZnJvbSBidWY6ICVzIgogCQkJIiBuYW1lOiAlc1xuIiwgYnVmLCBuYW1lKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CkBAIC0zNTgsNyArMzU4LDcgQEAKIAogCWxhY2wgPSBjb3JlX2Rldl9pbml0X2luaXRpYXRvcl9ub2RlX2x1bl9hY2woc2VfdHBnLCBtYXBwZWRfbHVuLAogCQkJY29uZmlnX2l0ZW1fbmFtZShhY2xfY2kpLCAmcmV0KTsKLQlpZiAoIShsYWNsKSkgeworCWlmICghbGFjbCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zNjcsNyArMzY3LDcgQEAKIAlsYWNsX2NnLT5kZWZhdWx0X2dyb3VwcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25maWdfZ3JvdXApICogMiwKIAkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWxhY2xfY2ctPmRlZmF1bHRfZ3JvdXBzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIGxhY2xfY2ctPmRlZmF1bHRfZ3JvdXBzXG4iKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbGFjbF9jZy0+ZGVmYXVsdF9ncm91cHNcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zNzksMTEgKzM3OSwxMSBAQAogCWxhY2xfY2ctPmRlZmF1bHRfZ3JvdXBzWzBdID0gJmxhY2wtPm1sX3N0YXRfZ3Jwcy5zdGF0X2dyb3VwOwogCWxhY2xfY2ctPmRlZmF1bHRfZ3JvdXBzWzFdID0gTlVMTDsKIAotCW1sX3N0YXRfZ3JwID0gJk1MX1NUQVRfR1JQUyhsYWNsKS0+c3RhdF9ncm91cDsKKwltbF9zdGF0X2dycCA9ICZsYWNsLT5tbF9zdGF0X2dycHMuc3RhdF9ncm91cDsKIAltbF9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnX2dyb3VwKSAqIDMsCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFtbF9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWxfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzXG4iKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWxfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDA4LDcgKzQwOCw3IEBACiAJc3RydWN0IGNvbmZpZ19ncm91cCAqbGFjbF9jZyA9IE5VTEwsICptbF9zdGF0X2dycCA9IE5VTEw7CiAJaW50IGk7CiAKLQltbF9zdGF0X2dycCA9ICZNTF9TVEFUX0dSUFMobGFjbCktPnN0YXRfZ3JvdXA7CisJbWxfc3RhdF9ncnAgPSAmbGFjbC0+bWxfc3RhdF9ncnBzLnN0YXRfZ3JvdXA7CiAJZm9yIChpID0gMDsgbWxfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzW2ldOyBpKyspIHsKIAkJZGZfaXRlbSA9ICZtbF9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHNbaV0tPmNnX2l0ZW07CiAJCW1sX3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3Vwc1tpXSA9IE5VTEw7CkBAIC00NzQsOCArNDc0LDggQEAKIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKnNlX25hY2w7CiAJc3RydWN0IGNvbmZpZ19ncm91cCAqbmFjbF9jZzsKIAotCWlmICghKHRmLT50Zl9vcHMuZmFicmljX21ha2Vfbm9kZWFjbCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0Zi0+dGZfb3BzLmZhYnJpY19tYWtlX25vZGVhY2wgaXMgTlVMTFxuIik7CisJaWYgKCF0Zi0+dGZfb3BzLmZhYnJpY19tYWtlX25vZGVhY2wpIHsKKwkJcHJfZXJyKCJ0Zi0+dGZfb3BzLmZhYnJpY19tYWtlX25vZGVhY2wgaXMgTlVMTFxuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOwogCX0KIApAQCAtNTcyLDEzICs1NzIsMTMgQEAKIAlzdHJ1Y3QgdGFyZ2V0X2ZhYnJpY19jb25maWdmcyAqdGYgPSBzZV90cGctPnNlX3RwZ193d24tPnd3bl90ZjsKIAlzdHJ1Y3Qgc2VfdHBnX25wICpzZV90cGdfbnA7CiAKLQlpZiAoISh0Zi0+dGZfb3BzLmZhYnJpY19tYWtlX25wKSkgewotCQlwcmludGsoS0VSTl9FUlIgInRmLT50Zl9vcHMuZmFicmljX21ha2VfbnAgaXMgTlVMTFxuIik7CisJaWYgKCF0Zi0+dGZfb3BzLmZhYnJpY19tYWtlX25wKSB7CisJCXByX2VycigidGYtPnRmX29wcy5mYWJyaWNfbWFrZV9ucCBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7CiAJfQogCiAJc2VfdHBnX25wID0gdGYtPnRmX29wcy5mYWJyaWNfbWFrZV9ucChzZV90cGcsIGdyb3VwLCBuYW1lKTsKLQlpZiAoIShzZV90cGdfbnApIHx8IElTX0VSUihzZV90cGdfbnApKQorCWlmICghc2VfdHBnX25wIHx8IElTX0VSUihzZV90cGdfbnApKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCXNlX3RwZ19ucC0+dHBnX25wX3BhcmVudCA9IHNlX3RwZzsKQEAgLTYyNywxMCArNjI3LDcgQEAKIAlzdHJ1Y3Qgc2VfbHVuICpsdW4sCiAJY2hhciAqcGFnZSkKIHsKLQlpZiAoIShsdW4pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghKGx1bi0+bHVuX3NlcCkpCisJaWYgKCFsdW4gfHwgIWx1bi0+bHVuX3NlcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXR1cm4gY29yZV9hbHVhX3Nob3dfdGdfcHRfZ3BfaW5mbyhsdW4tPmx1bl9zZXAsIHBhZ2UpOwpAQCAtNjQxLDEwICs2MzgsNyBAQAogCWNvbnN0IGNoYXIgKnBhZ2UsCiAJc2l6ZV90IGNvdW50KQogewotCWlmICghKGx1bikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKCEobHVuLT5sdW5fc2VwKSkKKwlpZiAoIWx1biB8fCAhbHVuLT5sdW5fc2VwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldHVybiBjb3JlX2FsdWFfc3RvcmVfdGdfcHRfZ3BfaW5mbyhsdW4tPmx1bl9zZXAsIHBhZ2UsIGNvdW50KTsKQEAgLTY1OSwxMCArNjUzLDcgQEAKIAlzdHJ1Y3Qgc2VfbHVuICpsdW4sCiAJY2hhciAqcGFnZSkKIHsKLQlpZiAoIShsdW4pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghKGx1bi0+bHVuX3NlcCkpCisJaWYgKCFsdW4gfHwgIWx1bi0+bHVuX3NlcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXR1cm4gY29yZV9hbHVhX3Nob3dfb2ZmbGluZV9iaXQobHVuLCBwYWdlKTsKQEAgLTY3MywxMCArNjY0LDcgQEAKIAljb25zdCBjaGFyICpwYWdlLAogCXNpemVfdCBjb3VudCkKIHsKLQlpZiAoIShsdW4pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghKGx1bi0+bHVuX3NlcCkpCisJaWYgKCFsdW4gfHwgIWx1bi0+bHVuX3NlcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXR1cm4gY29yZV9hbHVhX3N0b3JlX29mZmxpbmVfYml0KGx1biwgcGFnZSwgY291bnQpOwpAQCAtNjkxLDEwICs2NzksNyBAQAogCXN0cnVjdCBzZV9sdW4gKmx1biwKIAljaGFyICpwYWdlKQogewotCWlmICghKGx1bikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKCEobHVuLT5sdW5fc2VwKSkKKwlpZiAoIWx1biB8fCAhbHVuLT5sdW5fc2VwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldHVybiBjb3JlX2FsdWFfc2hvd19zZWNvbmRhcnlfc3RhdHVzKGx1biwgcGFnZSk7CkBAIC03MDUsMTAgKzY5MCw3IEBACiAJY29uc3QgY2hhciAqcGFnZSwKIAlzaXplX3QgY291bnQpCiB7Ci0JaWYgKCEobHVuKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoIShsdW4tPmx1bl9zZXApKQorCWlmICghbHVuIHx8ICFsdW4tPmx1bl9zZXApCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0dXJuIGNvcmVfYWx1YV9zdG9yZV9zZWNvbmRhcnlfc3RhdHVzKGx1biwgcGFnZSwgY291bnQpOwpAQCAtNzIzLDEwICs3MDUsNyBAQAogCXN0cnVjdCBzZV9sdW4gKmx1biwKIAljaGFyICpwYWdlKQogewotCWlmICghKGx1bikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKCEobHVuLT5sdW5fc2VwKSkKKwlpZiAoIWx1biB8fCAhbHVuLT5sdW5fc2VwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldHVybiBjb3JlX2FsdWFfc2hvd19zZWNvbmRhcnlfd3JpdGVfbWV0YWRhdGEobHVuLCBwYWdlKTsKQEAgLTczNywxMCArNzE2LDcgQEAKIAljb25zdCBjaGFyICpwYWdlLAogCXNpemVfdCBjb3VudCkKIHsKLQlpZiAoIShsdW4pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghKGx1bi0+bHVuX3NlcCkpCisJaWYgKCFsdW4gfHwgIWx1bi0+bHVuX3NlcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXR1cm4gY29yZV9hbHVhX3N0b3JlX3NlY29uZGFyeV93cml0ZV9tZXRhZGF0YShsdW4sIHBhZ2UsIGNvdW50KTsKQEAgLTc4MSwxMyArNzU3LDEzIEBACiAJdGYgPSBzZV90cGctPnNlX3RwZ193d24tPnd3bl90ZjsKIAogCWlmIChsdW4tPmx1bl9zZV9kZXYgIT0gIE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQb3J0IFN5bWxpbmsgYWxyZWFkeSBleGlzdHNcbiIpOworCQlwcl9lcnIoIlBvcnQgU3ltbGluayBhbHJlYWR5IGV4aXN0c1xuIik7CiAJCXJldHVybiAtRUVYSVNUOwogCX0KIAogCWRldiA9IHNlX2Rldi0+c2VfZGV2X3B0cjsKLQlpZiAoIShkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvY2F0ZSBzdHJ1Y3Qgc2VfZGV2aWNlIHBvaW50ZXIgZnJvbSIKKwlpZiAoIWRldikgeworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgc3RydWN0IHNlX2RldmljZSBwb2ludGVyIGZyb20iCiAJCQkiICVzXG4iLCBjb25maWdfaXRlbV9uYW1lKHNlX2Rldl9jaSkpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKQEAgLTc5NSw4ICs3NzEsOCBAQAogCiAJbHVuX3AgPSBjb3JlX2Rldl9hZGRfbHVuKHNlX3RwZywgZGV2LT5zZV9oYmEsIGRldiwKIAkJCQlsdW4tPnVucGFja2VkX2x1bik7Ci0JaWYgKChJU19FUlIobHVuX3ApKSB8fCAhKGx1bl9wKSkgewotCQlwcmludGsoS0VSTl9FUlIgImNvcmVfZGV2X2FkZF9sdW4oKSBmYWlsZWRcbiIpOworCWlmIChJU19FUlIobHVuX3ApIHx8ICFsdW5fcCkgeworCQlwcl9lcnIoImNvcmVfZGV2X2FkZF9sdW4oKSBmYWlsZWRcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC04ODgsNyArODY0LDcgQEAKIAlpbnQgZXJybm87CiAKIAlpZiAoc3Ryc3RyKG5hbWUsICJsdW5fIikgIT0gbmFtZSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBsb2NhdGUgXCdfXCIgaW4iCisJCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBcJ19cIiBpbiIKIAkJCQkiIFwibHVuXyRMVU5fTlVNQkVSXCJcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CkBAIC04OTYsMTQgKzg3MiwxNCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCWx1biA9IGNvcmVfZ2V0X2x1bl9mcm9tX3RwZyhzZV90cGcsIHVucGFja2VkX2x1bik7Ci0JaWYgKCEobHVuKSkKKwlpZiAoIWx1bikKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlsdW5fY2cgPSAmbHVuLT5sdW5fZ3JvdXA7CiAJbHVuX2NnLT5kZWZhdWx0X2dyb3VwcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25maWdfZ3JvdXApICogMiwKIAkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWx1bl9jZy0+ZGVmYXVsdF9ncm91cHMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbHVuX2NnLT5kZWZhdWx0X2dyb3Vwc1xuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGx1bl9jZy0+ZGVmYXVsdF9ncm91cHNcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKQEAgLTkxNCwxMSArODkwLDExIEBACiAJbHVuX2NnLT5kZWZhdWx0X2dyb3Vwc1swXSA9ICZsdW4tPnBvcnRfc3RhdF9ncnBzLnN0YXRfZ3JvdXA7CiAJbHVuX2NnLT5kZWZhdWx0X2dyb3Vwc1sxXSA9IE5VTEw7CiAKLQlwb3J0X3N0YXRfZ3JwID0gJlBPUlRfU1RBVF9HUlAobHVuKS0+c3RhdF9ncm91cDsKKwlwb3J0X3N0YXRfZ3JwID0gJmx1bi0+cG9ydF9zdGF0X2dycHMuc3RhdF9ncm91cDsKIAlwb3J0X3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3VwcyA9ICBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnX2dyb3VwKSAqIDMsCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3J0X3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3VwcykgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBwb3J0X3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3Vwc1xuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHBvcnRfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzXG4iKTsKIAkJZXJybm8gPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CkBAIC05NDEsNyArOTE3LDcgQEAKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwICpsdW5fY2csICpwb3J0X3N0YXRfZ3JwOwogCWludCBpOwogCi0JcG9ydF9zdGF0X2dycCA9ICZQT1JUX1NUQVRfR1JQKGx1biktPnN0YXRfZ3JvdXA7CisJcG9ydF9zdGF0X2dycCA9ICZsdW4tPnBvcnRfc3RhdF9ncnBzLnN0YXRfZ3JvdXA7CiAJZm9yIChpID0gMDsgcG9ydF9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHNbaV07IGkrKykgewogCQlkZl9pdGVtID0gJnBvcnRfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzW2ldLT5jZ19pdGVtOwogCQlwb3J0X3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3Vwc1tpXSA9IE5VTEw7CkBAIC0xMDMxLDEzICsxMDA3LDEzIEBACiAJc3RydWN0IHRhcmdldF9mYWJyaWNfY29uZmlnZnMgKnRmID0gd3duLT53d25fdGY7CiAJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqc2VfdHBnOwogCi0JaWYgKCEodGYtPnRmX29wcy5mYWJyaWNfbWFrZV90cGcpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidGYtPnRmX29wcy5mYWJyaWNfbWFrZV90cGcgaXMgTlVMTFxuIik7CisJaWYgKCF0Zi0+dGZfb3BzLmZhYnJpY19tYWtlX3RwZykgeworCQlwcl9lcnIoInRmLT50Zl9vcHMuZmFicmljX21ha2VfdHBnIGlzIE5VTExcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKIAl9CiAKIAlzZV90cGcgPSB0Zi0+dGZfb3BzLmZhYnJpY19tYWtlX3RwZyh3d24sIGdyb3VwLCBuYW1lKTsKLQlpZiAoIShzZV90cGcpIHx8IElTX0VSUihzZV90cGcpKQorCWlmICghc2VfdHBnIHx8IElTX0VSUihzZV90cGcpKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkvKgogCSAqIFNldHVwIGRlZmF1bHQgZ3JvdXBzIGZyb20gcHJlLWFsbG9jYXRlZCBzZV90cGctPnRwZ19kZWZhdWx0X2dyb3VwcwpAQCAtMTEzMCwxMyArMTEwNiwxMyBAQAogCQkJCXN0cnVjdCB0YXJnZXRfZmFicmljX2NvbmZpZ2ZzLCB0Zl9ncm91cCk7CiAJc3RydWN0IHNlX3d3biAqd3duOwogCi0JaWYgKCEodGYtPnRmX29wcy5mYWJyaWNfbWFrZV93d24pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidGYtPnRmX29wcy5mYWJyaWNfbWFrZV93d24gaXMgTlVMTFxuIik7CisJaWYgKCF0Zi0+dGZfb3BzLmZhYnJpY19tYWtlX3d3bikgeworCQlwcl9lcnIoInRmLT50Zl9vcHMuZmFicmljX21ha2Vfd3duIGlzIE5VTExcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKIAl9CiAKIAl3d24gPSB0Zi0+dGZfb3BzLmZhYnJpY19tYWtlX3d3bih0ZiwgZ3JvdXAsIG5hbWUpOwotCWlmICghKHd3bikgfHwgSVNfRVJSKHd3bikpCisJaWYgKCF3d24gfHwgSVNfRVJSKHd3bikpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJd3duLT53d25fdGYgPSB0ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpY19saWIuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpY19saWIuYwppbmRleCAxZTE5M2YzLi5jNGVhM2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfbGliLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmFicmljX2xpYi5jCkBAIC0yNSw2ICsyNSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTYxLDkgKzYyLDggQEAKIAlpbnQgKmZvcm1hdF9jb2RlLAogCXVuc2lnbmVkIGNoYXIgKmJ1ZikKIHsKLQl1bnNpZ25lZCBjaGFyIGJpbmFyeSwgKnB0cjsKLQlpbnQgaTsKLQl1MzIgb2ZmID0gNDsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKIAkvKgogCSAqIFNldCBQUk9UT0NPTCBJREVOVElGSUVSIHRvIDZoIGZvciBTQVMKIAkgKi8KQEAgLTc0LDEwICs3NCw4IEBACiAJICovCiAJcHRyID0gJnNlX25hY2wtPmluaXRpYXRvcm5hbWVbNF07IC8qIFNraXAgb3ZlciAnbmFhLiBwcmVmaXggKi8KIAotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAyKSB7Ci0JCWJpbmFyeSA9IHRyYW5zcG9ydF9hc2NpaWhleF90b19iaW5hcnloZXgoJnB0cltpXSk7Ci0JCWJ1ZltvZmYrK10gPSBiaW5hcnk7Ci0JfQorCWhleDJiaW4oJmJ1Zls0XSwgcHRyLCA4KTsKKwogCS8qCiAJICogVGhlIFNBUyBUcmFuc3BvcnQgSUQgaXMgYSBoYXJkY29kZWQgMjQtYnl0ZSBsZW5ndGgKIAkgKi8KQEAgLTE1Nyw3ICsxNTUsNyBAQAogCWludCAqZm9ybWF0X2NvZGUsCiAJdW5zaWduZWQgY2hhciAqYnVmKQogewotCXVuc2lnbmVkIGNoYXIgYmluYXJ5LCAqcHRyOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKIAlpbnQgaTsKIAl1MzIgb2ZmID0gODsKIAkvKgpAQCAtMTcyLDEyICsxNzAsMTEgQEAKIAlwdHIgPSAmc2VfbmFjbC0+aW5pdGlhdG9ybmFtZVswXTsKIAogCWZvciAoaSA9IDA7IGkgPCAyNDsgKSB7Ci0JCWlmICghKHN0cm5jbXAoJnB0cltpXSwgIjoiLCAxKSkpIHsKKwkJaWYgKCFzdHJuY21wKCZwdHJbaV0sICI6IiwgMSkpIHsKIAkJCWkrKzsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWJpbmFyeSA9IHRyYW5zcG9ydF9hc2NpaWhleF90b19iaW5hcnloZXgoJnB0cltpXSk7Ci0JCWJ1ZltvZmYrK10gPSBiaW5hcnk7CisJCWhleDJiaW4oJmJ1ZltvZmYrK10sICZwdHJbaV0sIDEpOwogCQlpICs9IDI7CiAJfQogCS8qCkBAIC0zODYsNyArMzgzLDcgQEAKIAkgKiAgICAgICAgICAgIFJlc2VydmVkCiAJICovCiAJaWYgKChmb3JtYXRfY29kZSAhPSAweDAwKSAmJiAoZm9ybWF0X2NvZGUgIT0gMHg0MCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbGxlZ2FsIGZvcm1hdCBjb2RlOiAweCUwMnggZm9yIGlTQ1NJIgorCQlwcl9lcnIoIklsbGVnYWwgZm9ybWF0IGNvZGU6IDB4JTAyeCBmb3IgaVNDU0kiCiAJCQkiIEluaXRpYXRvciBUcmFuc3BvcnQgSURcbiIsIGZvcm1hdF9jb2RlKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNDA2LDcgKzQwMyw3IEBACiAJCQl0aWRfbGVuICs9IHBhZGRpbmc7CiAKIAkJaWYgKChhZGRfbGVuICsgNCkgIT0gdGlkX2xlbikgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiTElPLVRhcmdldCBFeHRyYWN0ZWQgYWRkX2xlbjogJWh1ICIKKwkJCXByX2RlYnVnKCJMSU8tVGFyZ2V0IEV4dHJhY3RlZCBhZGRfbGVuOiAlaHUgIgogCQkJCSJkb2VzIG5vdCBtYXRjaCBjYWxjdWxhdGVkIHRpZF9sZW46ICV1LCIKIAkJCQkiIHVzaW5nIHRpZF9sZW4gaW5zdGVhZFxuIiwgYWRkX2xlbis0LCB0aWRfbGVuKTsKIAkJCSpvdXRfdGlkX2xlbiA9IHRpZF9sZW47CkBAIC00MjAsOCArNDE3LDggQEAKIAkgKi8KIAlpZiAoZm9ybWF0X2NvZGUgPT0gMHg0MCkgewogCQlwID0gc3Ryc3RyKChjaGFyICopJmJ1Zls0XSwgIixpLDB4Iik7Ci0JCWlmICghKHApKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBsb2NhdGUgXCIsaSwweFwiIHNlcGVyYXRvciIKKwkJaWYgKCFwKSB7CisJCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgXCIsaSwweFwiIHNlcGVyYXRvciIKIAkJCQkiIGZvciBJbml0aWF0b3IgcG9ydCBpZGVudGlmaWVyOiAlc1xuIiwKIAkJCQkoY2hhciAqKSZidWZbNF0pOwogCQkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMKaW5kZXggMTUwYzQzMC4uYmMxYjMzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYwpAQCAtNDIsMTggKzQyLDYgQEAKIAogI2luY2x1ZGUgInRhcmdldF9jb3JlX2ZpbGUuaCIKIAotI2lmIDEKLSNkZWZpbmUgREVCVUdfRkRfQ0FDSEUoeC4uLikgcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZSBERUJVR19GRF9DQUNIRSh4Li4uKQotI2VuZGlmCi0KLSNpZiAxCi0jZGVmaW5lIERFQlVHX0ZEX0ZVQSh4Li4uKSBwcmludGsoeCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHX0ZEX0ZVQSh4Li4uKQotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2FwaSBmaWxlaW9fdGVtcGxhdGU7CiAKIC8qCWZkX2F0dGFjaF9oYmEoKTogKFBhcnQgb2Ygc2Vfc3Vic3lzdGVtX2FwaV90IHRlbXBsYXRlKQpAQCAtNjUsMjQgKzUzLDIxIEBACiAJc3RydWN0IGZkX2hvc3QgKmZkX2hvc3Q7CiAKIAlmZF9ob3N0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZkX2hvc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIShmZF9ob3N0KSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cnVjdCBmZF9ob3N0XG4iKTsKLQkJcmV0dXJuIC0xOworCWlmICghZmRfaG9zdCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cnVjdCBmZF9ob3N0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJZmRfaG9zdC0+ZmRfaG9zdF9pZCA9IGhvc3RfaWQ7CiAKLQlhdG9taWNfc2V0KCZoYmEtPmxlZnRfcXVldWVfZGVwdGgsIEZEX0hCQV9RVUVVRV9ERVBUSCk7Ci0JYXRvbWljX3NldCgmaGJhLT5tYXhfcXVldWVfZGVwdGgsIEZEX0hCQV9RVUVVRV9ERVBUSCk7Ci0JaGJhLT5oYmFfcHRyID0gKHZvaWQgKikgZmRfaG9zdDsKKwloYmEtPmhiYV9wdHIgPSBmZF9ob3N0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ09SRV9IQkFbJWRdIC0gVENNIEZJTEVJTyBIQkEgRHJpdmVyICVzIG9uIEdlbmVyaWMiCisJcHJfZGVidWcoIkNPUkVfSEJBWyVkXSAtIFRDTSBGSUxFSU8gSEJBIERyaXZlciAlcyBvbiBHZW5lcmljIgogCQkiIFRhcmdldCBDb3JlIFN0YWNrICVzXG4iLCBoYmEtPmhiYV9pZCwgRkRfVkVSU0lPTiwKIAkJVEFSR0VUX0NPUkVfTU9EX1ZFUlNJT04pOwotCXByaW50ayhLRVJOX0lORk8gIkNPUkVfSEJBWyVkXSAtIEF0dGFjaGVkIEZJTEVJTyBIQkE6ICV1IHRvIEdlbmVyaWMiCi0JCSIgVGFyZ2V0IENvcmUgd2l0aCBUQ1EgRGVwdGg6ICVkIE1heFNlY3RvcnM6ICV1XG4iLAotCQloYmEtPmhiYV9pZCwgZmRfaG9zdC0+ZmRfaG9zdF9pZCwKLQkJYXRvbWljX3JlYWQoJmhiYS0+bWF4X3F1ZXVlX2RlcHRoKSwgRkRfTUFYX1NFQ1RPUlMpOworCXByX2RlYnVnKCJDT1JFX0hCQVslZF0gLSBBdHRhY2hlZCBGSUxFSU8gSEJBOiAldSB0byBHZW5lcmljIgorCQkiIE1heFNlY3RvcnM6ICV1XG4iLAorCQloYmEtPmhiYV9pZCwgZmRfaG9zdC0+ZmRfaG9zdF9pZCwgRkRfTUFYX1NFQ1RPUlMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MSw3ICs3Niw3IEBACiB7CiAJc3RydWN0IGZkX2hvc3QgKmZkX2hvc3QgPSBoYmEtPmhiYV9wdHI7CiAKLQlwcmludGsoS0VSTl9JTkZPICJDT1JFX0hCQVslZF0gLSBEZXRhY2hlZCBGSUxFSU8gSEJBOiAldSBmcm9tIEdlbmVyaWMiCisJcHJfZGVidWcoIkNPUkVfSEJBWyVkXSAtIERldGFjaGVkIEZJTEVJTyBIQkE6ICV1IGZyb20gR2VuZXJpYyIKIAkJIiBUYXJnZXQgQ29yZVxuIiwgaGJhLT5oYmFfaWQsIGZkX2hvc3QtPmZkX2hvc3RfaWQpOwogCiAJa2ZyZWUoZmRfaG9zdCk7CkBAIC0xMDQsMTQgKzg5LDE0IEBACiAJc3RydWN0IGZkX2hvc3QgKmZkX2hvc3QgPSAoc3RydWN0IGZkX2hvc3QgKikgaGJhLT5oYmFfcHRyOwogCiAJZmRfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZkX2RldiksIEdGUF9LRVJORUwpOwotCWlmICghKGZkX2RldikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJ1Y3QgZmRfZGV2XG4iKTsKKwlpZiAoIWZkX2RldikgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cnVjdCBmZF9kZXZcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlmZF9kZXYtPmZkX2hvc3QgPSBmZF9ob3N0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiRklMRUlPOiBBbGxvY2F0ZWQgZmRfZGV2IGZvciAlcFxuIiwgbmFtZSk7CisJcHJfZGVidWcoIkZJTEVJTzogQWxsb2NhdGVkIGZkX2RldiBmb3IgJXBcbiIsIG5hbWUpOwogCiAJcmV0dXJuIGZkX2RldjsKIH0KQEAgLTE0NCw3ICsxMjksNyBAQAogCXNldF9mcyhvbGRfZnMpOwogCiAJaWYgKElTX0VSUihkZXZfcCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJnZXRuYW1lKCVzKSBmYWlsZWQ6ICVsdVxuIiwKKwkJcHJfZXJyKCJnZXRuYW1lKCVzKSBmYWlsZWQ6ICVsdVxuIiwKIAkJCWZkX2Rldi0+ZmRfZGV2X25hbWUsIElTX0VSUihkZXZfcCkpOwogCQlyZXQgPSBQVFJfRVJSKGRldl9wKTsKIAkJZ290byBmYWlsOwpAQCAtMTY3LDEyICsxNTIsMTIgQEAKIAogCWZpbGUgPSBmaWxwX29wZW4oZGV2X3AsIGZsYWdzLCAwNjAwKTsKIAlpZiAoSVNfRVJSKGZpbGUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZmlscF9vcGVuKCVzKSBmYWlsZWRcbiIsIGRldl9wKTsKKwkJcHJfZXJyKCJmaWxwX29wZW4oJXMpIGZhaWxlZFxuIiwgZGV2X3ApOwogCQlyZXQgPSBQVFJfRVJSKGZpbGUpOwogCQlnb3RvIGZhaWw7CiAJfQogCWlmICghZmlsZSB8fCAhZmlsZS0+Zl9kZW50cnkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmaWxwX29wZW4oJXMpIGZhaWxlZFxuIiwgZGV2X3ApOworCQlwcl9lcnIoImZpbHBfb3BlbiglcykgZmFpbGVkXG4iLCBkZXZfcCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAJZmRfZGV2LT5mZF9maWxlID0gZmlsZTsKQEAgLTIwMiwxNCArMTg3LDE0IEBACiAJCWZkX2Rldi0+ZmRfZGV2X3NpemUgPSAoaV9zaXplX3JlYWQoZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KSAtCiAJCQkJICAgICAgIGZkX2Rldi0+ZmRfYmxvY2tfc2l6ZSk7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRklMRUlPOiBVc2luZyBzaXplOiAlbGx1IGJ5dGVzIGZyb20gc3RydWN0IgorCQlwcl9kZWJ1ZygiRklMRUlPOiBVc2luZyBzaXplOiAlbGx1IGJ5dGVzIGZyb20gc3RydWN0IgogCQkJIiBibG9ja19kZXZpY2UgYmxvY2tzOiAlbGx1IGxvZ2ljYWxfYmxvY2tfc2l6ZTogJWRcbiIsCiAJCQlmZF9kZXYtPmZkX2Rldl9zaXplLAogCQkJZGl2X3U2NChmZF9kZXYtPmZkX2Rldl9zaXplLCBmZF9kZXYtPmZkX2Jsb2NrX3NpemUpLAogCQkJZmRfZGV2LT5mZF9ibG9ja19zaXplKTsKIAl9IGVsc2UgewogCQlpZiAoIShmZF9kZXYtPmZiZF9mbGFncyAmIEZCREZfSEFTX1NJWkUpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkZJTEVJTzogTWlzc2luZyBmZF9kZXZfc2l6ZT0iCisJCQlwcl9lcnIoIkZJTEVJTzogTWlzc2luZyBmZF9kZXZfc2l6ZT0iCiAJCQkJIiBwYXJhbWV0ZXIsIGFuZCBubyBiYWNraW5nIHN0cnVjdCIKIAkJCQkiIGJsb2NrX2RldmljZVxuIik7CiAJCQlnb3RvIGZhaWw7CkBAIC0yMjYsMTUgKzIxMSwxNSBAQAogCWRldl9saW1pdHMucXVldWVfZGVwdGggPSBGRF9ERVZJQ0VfUVVFVUVfREVQVEg7CiAKIAlkZXYgPSB0cmFuc3BvcnRfYWRkX2RldmljZV90b19jb3JlX2hiYShoYmEsICZmaWxlaW9fdGVtcGxhdGUsCi0JCQkJc2VfZGV2LCBkZXZfZmxhZ3MsICh2b2lkICopZmRfZGV2LAorCQkJCXNlX2RldiwgZGV2X2ZsYWdzLCBmZF9kZXYsCiAJCQkJJmRldl9saW1pdHMsICJGSUxFSU8iLCBGRF9WRVJTSU9OKTsKLQlpZiAoIShkZXYpKQorCWlmICghZGV2KQogCQlnb3RvIGZhaWw7CiAKIAlmZF9kZXYtPmZkX2Rldl9pZCA9IGZkX2hvc3QtPmZkX2hvc3RfZGV2X2lkX2NvdW50Kys7CiAJZmRfZGV2LT5mZF9xdWV1ZV9kZXB0aCA9IGRldi0+cXVldWVfZGVwdGg7CiAKLQlwcmludGsoS0VSTl9JTkZPICJDT1JFX0ZJTEVbJXVdIC0gQWRkZWQgVENNIEZJTEVJTyBEZXZpY2UgSUQ6ICV1IGF0ICVzLCIKKwlwcl9kZWJ1ZygiQ09SRV9GSUxFWyV1XSAtIEFkZGVkIFRDTSBGSUxFSU8gRGV2aWNlIElEOiAldSBhdCAlcywiCiAJCSIgJWxsdSB0b3RhbCBieXRlc1xuIiwgZmRfaG9zdC0+ZmRfaG9zdF9pZCwgZmRfZGV2LT5mZF9kZXZfaWQsCiAJCQlmZF9kZXYtPmZkX2Rldl9uYW1lLCBmZF9kZXYtPmZkX2Rldl9zaXplKTsKIApAQCAtMjcyLDQ1ICsyNTcsNDUgQEAKIAogCiBzdGF0aWMgc3RydWN0IHNlX3Rhc2sgKgotZmRfYWxsb2NfdGFzayhzdHJ1Y3Qgc2VfY21kICpjbWQpCitmZF9hbGxvY190YXNrKHVuc2lnbmVkIGNoYXIgKmNkYikKIHsKIAlzdHJ1Y3QgZmRfcmVxdWVzdCAqZmRfcmVxOwogCiAJZmRfcmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZkX3JlcXVlc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIShmZF9yZXEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBmZF9yZXF1ZXN0XG4iKTsKKwlpZiAoIWZkX3JlcSkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgZmRfcmVxdWVzdFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCWZkX3JlcS0+ZmRfZGV2ID0gU0VfREVWKGNtZCktPmRldl9wdHI7Ci0KIAlyZXR1cm4gJmZkX3JlcS0+ZmRfdGFzazsKIH0KIAogc3RhdGljIGludCBmZF9kb19yZWFkdihzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKIHsKIAlzdHJ1Y3QgZmRfcmVxdWVzdCAqcmVxID0gRklMRV9SRVEodGFzayk7Ci0Jc3RydWN0IGZpbGUgKmZkID0gcmVxLT5mZF9kZXYtPmZkX2ZpbGU7CisJc3RydWN0IGZkX2RldiAqZGV2ID0gcmVxLT5mZF90YXNrLnNlX2Rldi0+ZGV2X3B0cjsKKwlzdHJ1Y3QgZmlsZSAqZmQgPSBkZXYtPmZkX2ZpbGU7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHRhc2stPnRhc2tfc2c7CiAJc3RydWN0IGlvdmVjICppb3Y7CiAJbW1fc2VnbWVudF90IG9sZF9mczsKLQlsb2ZmX3QgcG9zID0gKHRhc2stPnRhc2tfbGJhICogREVWX0FUVFJJQih0YXNrLT5zZV9kZXYpLT5ibG9ja19zaXplKTsKKwlsb2ZmX3QgcG9zID0gKHRhc2stPnRhc2tfbGJhICoKKwkJICAgICAgdGFzay0+c2VfZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUpOwogCWludCByZXQgPSAwLCBpOwogCi0JaW92ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvdmVjKSAqIHRhc2stPnRhc2tfc2dfbnVtLCBHRlBfS0VSTkVMKTsKLQlpZiAoIShpb3YpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIGZkX2RvX3JlYWR2IGlvdltdXG4iKTsKLQkJcmV0dXJuIC0xOworCWlvdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb3ZlYykgKiB0YXNrLT50YXNrX3NnX25lbnRzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvdikgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBmZF9kb19yZWFkdiBpb3ZbXVxuIik7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCB0YXNrLT50YXNrX3NnX251bTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHRhc2stPnRhc2tfc2dfbmVudHM7IGkrKykgewogCQlpb3ZbaV0uaW92X2xlbiA9IHNnW2ldLmxlbmd0aDsKIAkJaW92W2ldLmlvdl9iYXNlID0gc2dfdmlydCgmc2dbaV0pOwogCX0KIAogCW9sZF9mcyA9IGdldF9mcygpOwogCXNldF9mcyhnZXRfZHMoKSk7Ci0JcmV0ID0gdmZzX3JlYWR2KGZkLCAmaW92WzBdLCB0YXNrLT50YXNrX3NnX251bSwgJnBvcyk7CisJcmV0ID0gdmZzX3JlYWR2KGZkLCAmaW92WzBdLCB0YXNrLT50YXNrX3NnX25lbnRzLCAmcG9zKTsKIAlzZXRfZnMob2xkX2ZzKTsKIAogCWtmcmVlKGlvdik7CkBAIC0zMjEsMTYgKzMwNiwxNiBAQAogCSAqLwogCWlmIChTX0lTQkxLKGZkLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgewogCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gdGFzay0+dGFza19zaXplKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInZmc19yZWFkdigpIHJldHVybmVkICVkLCIKKwkJCXByX2VycigidmZzX3JlYWR2KCkgcmV0dXJuZWQgJWQsIgogCQkJCSIgZXhwZWN0aW5nICVkIGZvciBTX0lTQkxLXG4iLCByZXQsCiAJCQkJKGludCl0YXNrLT50YXNrX3NpemUpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIChyZXQgPCAwID8gcmV0IDogLUVJTlZBTCk7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ2ZnNfcmVhZHYoKSByZXR1cm5lZCAlZCBmb3Igbm9uIgorCQkJcHJfZXJyKCJ2ZnNfcmVhZHYoKSByZXR1cm5lZCAlZCBmb3Igbm9uIgogCQkJCSIgU19JU0JMS1xuIiwgcmV0KTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAKQEAgLTM0MCwzNCArMzI1LDM2IEBACiBzdGF0aWMgaW50IGZkX2RvX3dyaXRldihzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKIHsKIAlzdHJ1Y3QgZmRfcmVxdWVzdCAqcmVxID0gRklMRV9SRVEodGFzayk7Ci0Jc3RydWN0IGZpbGUgKmZkID0gcmVxLT5mZF9kZXYtPmZkX2ZpbGU7CisJc3RydWN0IGZkX2RldiAqZGV2ID0gcmVxLT5mZF90YXNrLnNlX2Rldi0+ZGV2X3B0cjsKKwlzdHJ1Y3QgZmlsZSAqZmQgPSBkZXYtPmZkX2ZpbGU7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHRhc2stPnRhc2tfc2c7CiAJc3RydWN0IGlvdmVjICppb3Y7CiAJbW1fc2VnbWVudF90IG9sZF9mczsKLQlsb2ZmX3QgcG9zID0gKHRhc2stPnRhc2tfbGJhICogREVWX0FUVFJJQih0YXNrLT5zZV9kZXYpLT5ibG9ja19zaXplKTsKKwlsb2ZmX3QgcG9zID0gKHRhc2stPnRhc2tfbGJhICoKKwkJICAgICAgdGFzay0+c2VfZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUpOwogCWludCByZXQsIGkgPSAwOwogCi0JaW92ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvdmVjKSAqIHRhc2stPnRhc2tfc2dfbnVtLCBHRlBfS0VSTkVMKTsKLQlpZiAoIShpb3YpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIGZkX2RvX3dyaXRldiBpb3ZbXVxuIik7Ci0JCXJldHVybiAtMTsKKwlpb3YgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW92ZWMpICogdGFzay0+dGFza19zZ19uZW50cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb3YpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgZmRfZG9fd3JpdGV2IGlvdltdXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IHRhc2stPnRhc2tfc2dfbnVtOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgdGFzay0+dGFza19zZ19uZW50czsgaSsrKSB7CiAJCWlvdltpXS5pb3ZfbGVuID0gc2dbaV0ubGVuZ3RoOwogCQlpb3ZbaV0uaW92X2Jhc2UgPSBzZ192aXJ0KCZzZ1tpXSk7CiAJfQogCiAJb2xkX2ZzID0gZ2V0X2ZzKCk7CiAJc2V0X2ZzKGdldF9kcygpKTsKLQlyZXQgPSB2ZnNfd3JpdGV2KGZkLCAmaW92WzBdLCB0YXNrLT50YXNrX3NnX251bSwgJnBvcyk7CisJcmV0ID0gdmZzX3dyaXRldihmZCwgJmlvdlswXSwgdGFzay0+dGFza19zZ19uZW50cywgJnBvcyk7CiAJc2V0X2ZzKG9sZF9mcyk7CiAKIAlrZnJlZShpb3YpOwogCiAJaWYgKHJldCA8IDAgfHwgcmV0ICE9IHRhc2stPnRhc2tfc2l6ZSkgewotCQlwcmludGsoS0VSTl9FUlIgInZmc193cml0ZXYoKSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIC0xOworCQlwcl9lcnIoInZmc193cml0ZXYoKSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIChyZXQgPCAwID8gcmV0IDogLUVJTlZBTCk7CiAJfQogCiAJcmV0dXJuIDE7CkBAIC0zNzUsMTAgKzM2MiwxMCBAQAogCiBzdGF0aWMgdm9pZCBmZF9lbXVsYXRlX3N5bmNfY2FjaGUoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7Ci0Jc3RydWN0IHNlX2NtZCAqY21kID0gVEFTS19DTUQodGFzayk7CisJc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAJc3RydWN0IGZkX2RldiAqZmRfZGV2ID0gZGV2LT5kZXZfcHRyOwotCWludCBpbW1lZCA9IChjbWQtPnRfdGFzay0+dF90YXNrX2NkYlsxXSAmIDB4Mik7CisJaW50IGltbWVkID0gKGNtZC0+dF90YXNrX2NkYlsxXSAmIDB4Mik7CiAJbG9mZl90IHN0YXJ0LCBlbmQ7CiAJaW50IHJldDsKIApAQCAtMzkyLDExICszNzksMTEgQEAKIAkvKgogCSAqIERldGVybWluZSBpZiB3ZSB3aWxsIGJlIGZsdXNoaW5nIHRoZSBlbnRpcmUgZGV2aWNlLgogCSAqLwotCWlmIChjbWQtPnRfdGFzay0+dF90YXNrX2xiYSA9PSAwICYmIGNtZC0+ZGF0YV9sZW5ndGggPT0gMCkgeworCWlmIChjbWQtPnRfdGFza19sYmEgPT0gMCAmJiBjbWQtPmRhdGFfbGVuZ3RoID09IDApIHsKIAkJc3RhcnQgPSAwOwogCQllbmQgPSBMTE9OR19NQVg7CiAJfSBlbHNlIHsKLQkJc3RhcnQgPSBjbWQtPnRfdGFzay0+dF90YXNrX2xiYSAqIERFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZTsKKwkJc3RhcnQgPSBjbWQtPnRfdGFza19sYmEgKiBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZTsKIAkJaWYgKGNtZC0+ZGF0YV9sZW5ndGgpCiAJCQllbmQgPSBzdGFydCArIGNtZC0+ZGF0YV9sZW5ndGg7CiAJCWVsc2UKQEAgLTQwNSw3ICszOTIsNyBAQAogCiAJcmV0ID0gdmZzX2ZzeW5jX3JhbmdlKGZkX2Rldi0+ZmRfZmlsZSwgc3RhcnQsIGVuZCwgMSk7CiAJaWYgKHJldCAhPSAwKQotCQlwcmludGsoS0VSTl9FUlIgIkZJTEVJTzogdmZzX2ZzeW5jX3JhbmdlKCkgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJcHJfZXJyKCJGSUxFSU86IHZmc19mc3luY19yYW5nZSgpIGZhaWxlZDogJWRcbiIsIHJldCk7CiAKIAlpZiAoIWltbWVkKQogCQl0cmFuc3BvcnRfY29tcGxldGVfc3luY19jYWNoZShjbWQsIHJldCA9PSAwKTsKQEAgLTQ0NiwxNiArNDMzLDE2IEBACiB7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAJc3RydWN0IGZkX2RldiAqZmRfZGV2ID0gZGV2LT5kZXZfcHRyOwotCWxvZmZfdCBzdGFydCA9IHRhc2stPnRhc2tfbGJhICogREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplOworCWxvZmZfdCBzdGFydCA9IHRhc2stPnRhc2tfbGJhICogZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemU7CiAJbG9mZl90IGVuZCA9IHN0YXJ0ICsgdGFzay0+dGFza19zaXplOwogCWludCByZXQ7CiAKLQlERUJVR19GRF9DQUNIRSgiRklMRUlPOiBGVUEgV1JJVEUgTEJBOiAlbGx1LCBieXRlczogJXVcbiIsCisJcHJfZGVidWcoIkZJTEVJTzogRlVBIFdSSVRFIExCQTogJWxsdSwgYnl0ZXM6ICV1XG4iLAogCQkJdGFzay0+dGFza19sYmEsIHRhc2stPnRhc2tfc2l6ZSk7CiAKIAlyZXQgPSB2ZnNfZnN5bmNfcmFuZ2UoZmRfZGV2LT5mZF9maWxlLCBzdGFydCwgZW5kLCAxKTsKIAlpZiAocmV0ICE9IDApCi0JCXByaW50ayhLRVJOX0VSUiAiRklMRUlPOiB2ZnNfZnN5bmNfcmFuZ2UoKSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlwcl9lcnIoIkZJTEVJTzogdmZzX2ZzeW5jX3JhbmdlKCkgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIH0KIAogc3RhdGljIGludCBmZF9kb190YXNrKHN0cnVjdCBzZV90YXNrICp0YXNrKQpAQCAtNDc0LDkgKzQ2MSw5IEBACiAJCXJldCA9IGZkX2RvX3dyaXRldih0YXNrKTsKIAogCQlpZiAocmV0ID4gMCAmJgotCQkgICAgREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX3dyaXRlX2NhY2hlID4gMCAmJgotCQkgICAgREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX2Z1YV93cml0ZSA+IDAgJiYKLQkJICAgIFRfVEFTSyhjbWQpLT50X3Rhc2tzX2Z1YSkgeworCQkgICAgZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfd3JpdGVfY2FjaGUgPiAwICYmCisJCSAgICBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV9mdWFfd3JpdGUgPiAwICYmCisJCSAgICBjbWQtPnRfdGFza3NfZnVhKSB7CiAJCQkvKgogCQkJICogV2UgbWlnaHQgbmVlZCB0byBiZSBhIGJpdCBzbWFydGVyIGhlcmUKIAkJCSAqIGFuZCByZXR1cm4gc29tZSBzZW5zZSBkYXRhIHRvIGxldCB0aGUgaW5pdGlhdG9yCkBAIC01NDksNyArNTM2LDcgQEAKIAkJCXNucHJpbnRmKGZkX2Rldi0+ZmRfZGV2X25hbWUsIEZEX01BWF9ERVZfTkFNRSwKIAkJCQkJIiVzIiwgYXJnX3ApOwogCQkJa2ZyZWUoYXJnX3ApOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRklMRUlPOiBSZWZlcmVuY2luZyBQYXRoOiAlc1xuIiwKKwkJCXByX2RlYnVnKCJGSUxFSU86IFJlZmVyZW5jaW5nIFBhdGg6ICVzXG4iLAogCQkJCQlmZF9kZXYtPmZkX2Rldl9uYW1lKTsKIAkJCWZkX2Rldi0+ZmJkX2ZsYWdzIHw9IEZCREZfSEFTX1BBVEg7CiAJCQlicmVhazsKQEAgLTU2MiwyMyArNTQ5LDIzIEBACiAJCQlyZXQgPSBzdHJpY3Rfc3RydG91bGwoYXJnX3AsIDAsICZmZF9kZXYtPmZkX2Rldl9zaXplKTsKIAkJCWtmcmVlKGFyZ19wKTsKIAkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJzdHJpY3Rfc3RydG91bGwoKSBmYWlsZWQgZm9yIgorCQkJCXByX2Vycigic3RyaWN0X3N0cnRvdWxsKCkgZmFpbGVkIGZvciIKIAkJCQkJCSIgZmRfZGV2X3NpemU9XG4iKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCXByaW50ayhLRVJOX0lORk8gIkZJTEVJTzogUmVmZXJlbmNpbmcgU2l6ZTogJWxsdSIKKwkJCXByX2RlYnVnKCJGSUxFSU86IFJlZmVyZW5jaW5nIFNpemU6ICVsbHUiCiAJCQkJCSIgYnl0ZXNcbiIsIGZkX2Rldi0+ZmRfZGV2X3NpemUpOwogCQkJZmRfZGV2LT5mYmRfZmxhZ3MgfD0gRkJERl9IQVNfU0laRTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9mZF9idWZmZXJlZF9pbzoKIAkJCW1hdGNoX2ludChhcmdzLCAmYXJnKTsKIAkJCWlmIChhcmcgIT0gMSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYm9ndXMgZmRfYnVmZmVyZWRfaW89JWQgdmFsdWVcbiIsIGFyZyk7CisJCQkJcHJfZXJyKCJib2d1cyBmZF9idWZmZXJlZF9pbz0lZCB2YWx1ZVxuIiwgYXJnKTsKIAkJCQlyZXQgPSAtRUlOVkFMOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCi0JCQlwcmludGsoS0VSTl9JTkZPICJGSUxFSU86IFVzaW5nIGJ1ZmZlcmVkIEkvTyIKKwkJCXByX2RlYnVnKCJGSUxFSU86IFVzaW5nIGJ1ZmZlcmVkIEkvTyIKIAkJCQkiIG9wZXJhdGlvbnMgZm9yIHN0cnVjdCBmZF9kZXZcbiIpOwogCiAJCQlmZF9kZXYtPmZiZF9mbGFncyB8PSBGREJEX1VTRV9CVUZGRVJFRF9JTzsKQEAgLTU5OCw4ICs1ODUsOCBAQAogCXN0cnVjdCBmZF9kZXYgKmZkX2RldiA9IChzdHJ1Y3QgZmRfZGV2ICopIHNlX2Rldi0+c2VfZGV2X3N1X3B0cjsKIAogCWlmICghKGZkX2Rldi0+ZmJkX2ZsYWdzICYgRkJERl9IQVNfUEFUSCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNaXNzaW5nIGZkX2Rldl9uYW1lPVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcHJfZXJyKCJNaXNzaW5nIGZkX2Rldl9uYW1lPVxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiAwOwpAQCAtNjU0LDcgKzY0MSw3IEBACiB7CiAJc3RydWN0IGZkX2RldiAqZmRfZGV2ID0gZGV2LT5kZXZfcHRyOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja3NfbG9uZyA9IGRpdl91NjQoZmRfZGV2LT5mZF9kZXZfc2l6ZSwKLQkJCURFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSk7CisJCQlkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZSk7CiAKIAlyZXR1cm4gYmxvY2tzX2xvbmc7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmggYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmgKaW5kZXggZWY0ZGUyYi4uZGFlYmQ3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuaApAQCAtNCw4ICs0LDYgQEAKICNkZWZpbmUgRkRfVkVSU0lPTgkJIjQuMCIKIAogI2RlZmluZSBGRF9NQVhfREVWX05BTUUJCTI1NgotLyogTWF4aW11bSBxdWV1ZWRlcHRoIGZvciB0aGUgRklMRUlPIEhCQSAqLwotI2RlZmluZSBGRF9IQkFfUVVFVUVfREVQVEgJMjU2CiAjZGVmaW5lIEZEX0RFVklDRV9RVUVVRV9ERVBUSAkzMgogI2RlZmluZSBGRF9NQVhfREVWSUNFX1FVRVVFX0RFUFRIIDEyOAogI2RlZmluZSBGRF9CTE9DS1NJWkUJCTUxMgpAQCAtMTgsOCArMTYsNiBAQAogCXN0cnVjdCBzZV90YXNrCWZkX3Rhc2s7CiAJLyogU0NTSSBDREIgZnJvbSBpU0NTSSBDb21tYW5kIFBEVSAqLwogCXVuc2lnbmVkIGNoYXIJZmRfc2NzaV9jZGJbVENNX01BWF9DT01NQU5EX1NJWkVdOwotCS8qIEZJTEVJTyBkZXZpY2UgKi8KLQlzdHJ1Y3QgZmRfZGV2CSpmZF9kZXY7CiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAogI2RlZmluZSBGQkRGX0hBU19QQVRICQkweDAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9oYmEuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2hiYS5jCmluZGV4IDBiOGY4ZGEuLjA2MzliOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2hiYS5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2hiYS5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEZpbGVuYW1lOiAgdGFyZ2V0X2NvcmVfaGJhLmMKICAqCi0gKiBUaGlzIGZpbGUgY29wbnRhaW5zIHRoZSBpU0NTSSBIQkEgVHJhbnNwb3J0IHJlbGF0ZWQgZnVuY3Rpb25zLgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBUQ00gSEJBIFRyYW5zcG9ydCByZWxhdGVkIGZ1bmN0aW9ucy4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUgUHlYIFRlY2hub2xvZ2llcywgSW5jLgogICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IFNCRSwgSW5jLgpAQCAtNDUsNiArNDUsMTEgQEAKIHN0YXRpYyBMSVNUX0hFQUQoc3Vic3lzdGVtX2xpc3QpOwogc3RhdGljIERFRklORV9NVVRFWChzdWJzeXN0ZW1fbXV0ZXgpOwogCitzdGF0aWMgdTMyIGhiYV9pZF9jb3VudGVyOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGhiYV9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoaGJhX2xpc3QpOworCiBpbnQgdHJhbnNwb3J0X3N1YnN5c3RlbV9yZWdpc3RlcihzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2FwaSAqc3ViX2FwaSkKIHsKIAlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2FwaSAqczsKQEAgLTUzLDggKzU4LDggQEAKIAogCW11dGV4X2xvY2soJnN1YnN5c3RlbV9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc3Vic3lzdGVtX2xpc3QsIHN1Yl9hcGlfbGlzdCkgewotCQlpZiAoIShzdHJjbXAocy0+bmFtZSwgc3ViX2FwaS0+bmFtZSkpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVwIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIgorCQlpZiAoIXN0cmNtcChzLT5uYW1lLCBzdWJfYXBpLT5uYW1lKSkgeworCQkJcHJfZXJyKCIlcCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCIKIAkJCQkiIGR1cGxpY2F0ZSBuYW1lICVzLCB1bmFibGUgdG8gcHJvY2VzcyIKIAkJCQkiIHJlcXVlc3RcbiIsIHMsIHMtPm5hbWUpOwogCQkJbXV0ZXhfdW5sb2NrKCZzdWJzeXN0ZW1fbXV0ZXgpOwpAQCAtNjQsNyArNjksNyBAQAogCWxpc3RfYWRkX3RhaWwoJnN1Yl9hcGktPnN1Yl9hcGlfbGlzdCwgJnN1YnN5c3RlbV9saXN0KTsKIAltdXRleF91bmxvY2soJnN1YnN5c3RlbV9tdXRleCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUQ006IFJlZ2lzdGVyZWQgc3Vic3lzdGVtIHBsdWdpbjogJXMgc3RydWN0IG1vZHVsZToiCisJcHJfZGVidWcoIlRDTTogUmVnaXN0ZXJlZCBzdWJzeXN0ZW0gcGx1Z2luOiAlcyBzdHJ1Y3QgbW9kdWxlOiIKIAkJCSIgJXBcbiIsIHN1Yl9hcGktPm5hbWUsIHN1Yl9hcGktPm93bmVyKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNCwyMSArMTA5LDE3IEBACiAKIAloYmEgPSBremFsbG9jKHNpemVvZigqaGJhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoYmEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHNlX2hiYVxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBzZV9oYmFcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKIAlJTklUX0xJU1RfSEVBRCgmaGJhLT5oYmFfZGV2X2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZoYmEtPmRldmljZV9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmaGJhLT5oYmFfcXVldWVfbG9jayk7CiAJbXV0ZXhfaW5pdCgmaGJhLT5oYmFfYWNjZXNzX211dGV4KTsKIAogCWhiYS0+aGJhX2luZGV4ID0gc2NzaV9nZXRfbmV3X2luZGV4KFNDU0lfSU5TVF9JTkRFWCk7CiAJaGJhLT5oYmFfZmxhZ3MgfD0gaGJhX2ZsYWdzOwogCi0JYXRvbWljX3NldCgmaGJhLT5tYXhfcXVldWVfZGVwdGgsIDApOwotCWF0b21pY19zZXQoJmhiYS0+bGVmdF9xdWV1ZV9kZXB0aCwgMCk7Ci0KIAloYmEtPnRyYW5zcG9ydCA9IGNvcmVfZ2V0X2JhY2tlbmQocGx1Z2luX25hbWUpOwogCWlmICghaGJhLT50cmFuc3BvcnQpIHsKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTEyOSwxMiArMTMwLDEyIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X21vZHVsZV9wdXQ7CiAKLQlzcGluX2xvY2soJnNlX2dsb2JhbC0+aGJhX2xvY2spOwotCWhiYS0+aGJhX2lkID0gc2VfZ2xvYmFsLT5nX2hiYV9pZF9jb3VudGVyKys7Ci0JbGlzdF9hZGRfdGFpbCgmaGJhLT5oYmFfbGlzdCwgJnNlX2dsb2JhbC0+Z19oYmFfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnNlX2dsb2JhbC0+aGJhX2xvY2spOworCXNwaW5fbG9jaygmaGJhX2xvY2spOworCWhiYS0+aGJhX2lkID0gaGJhX2lkX2NvdW50ZXIrKzsKKwlsaXN0X2FkZF90YWlsKCZoYmEtPmhiYV9ub2RlLCAmaGJhX2xpc3QpOworCXNwaW5fdW5sb2NrKCZoYmFfbG9jayk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJDT1JFX0hCQVslZF0gLSBBdHRhY2hlZCBIQkEgdG8gR2VuZXJpYyBUYXJnZXQiCisJcHJfZGVidWcoIkNPUkVfSEJBWyVkXSAtIEF0dGFjaGVkIEhCQSB0byBHZW5lcmljIFRhcmdldCIKIAkJCSIgQ29yZVxuIiwgaGJhLT5oYmFfaWQpOwogCiAJcmV0dXJuIGhiYTsKQEAgLTE1NiwxMSArMTU3LDExIEBACiAKIAloYmEtPnRyYW5zcG9ydC0+ZGV0YWNoX2hiYShoYmEpOwogCi0Jc3Bpbl9sb2NrKCZzZV9nbG9iYWwtPmhiYV9sb2NrKTsKLQlsaXN0X2RlbCgmaGJhLT5oYmFfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnNlX2dsb2JhbC0+aGJhX2xvY2spOworCXNwaW5fbG9jaygmaGJhX2xvY2spOworCWxpc3RfZGVsKCZoYmEtPmhiYV9ub2RlKTsKKwlzcGluX3VubG9jaygmaGJhX2xvY2spOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ09SRV9IQkFbJWRdIC0gRGV0YWNoZWQgSEJBIGZyb20gR2VuZXJpYyBUYXJnZXQiCisJcHJfZGVidWcoIkNPUkVfSEJBWyVkXSAtIERldGFjaGVkIEhCQSBmcm9tIEdlbmVyaWMgVGFyZ2V0IgogCQkJIiBDb3JlXG4iLCBoYmEtPmhiYV9pZCk7CiAKIAlpZiAoaGJhLT50cmFuc3BvcnQtPm93bmVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9pYmxvY2suYwppbmRleCA4NjYzOTAwLi43ZTEyMzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9pYmxvY2suYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9pYmxvY2suYwpAQCAtNDcsMTIgKzQ3LDYgQEAKIAogI2luY2x1ZGUgInRhcmdldF9jb3JlX2libG9jay5oIgogCi0jaWYgMAotI2RlZmluZSBERUJVR19JQkxPQ0soeC4uLikgcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZSBERUJVR19JQkxPQ0soeC4uLikKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHNlX3N1YnN5c3RlbV9hcGkgaWJsb2NrX3RlbXBsYXRlOwogCiBzdGF0aWMgdm9pZCBpYmxvY2tfYmlvX2RvbmUoc3RydWN0IGJpbyAqLCBpbnQpOwpAQCAtNjYsMjUgKzYwLDIyIEBACiAJc3RydWN0IGlibG9ja19oYmEgKmliX2hvc3Q7CiAKIAlpYl9ob3N0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlibG9ja19oYmEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIShpYl9ob3N0KSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIgorCWlmICghaWJfaG9zdCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIgogCQkJCSIgc3RydWN0IGlibG9ja19oYmFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpYl9ob3N0LT5pYmxvY2tfaG9zdF9pZCA9IGhvc3RfaWQ7CiAKLQlhdG9taWNfc2V0KCZoYmEtPmxlZnRfcXVldWVfZGVwdGgsIElCTE9DS19IQkFfUVVFVUVfREVQVEgpOwotCWF0b21pY19zZXQoJmhiYS0+bWF4X3F1ZXVlX2RlcHRoLCBJQkxPQ0tfSEJBX1FVRVVFX0RFUFRIKTsKLQloYmEtPmhiYV9wdHIgPSAodm9pZCAqKSBpYl9ob3N0OworCWhiYS0+aGJhX3B0ciA9IGliX2hvc3Q7CiAKLQlwcmludGsoS0VSTl9JTkZPICJDT1JFX0hCQVslZF0gLSBUQ00gaUJsb2NrIEhCQSBEcml2ZXIgJXMgb24iCisJcHJfZGVidWcoIkNPUkVfSEJBWyVkXSAtIFRDTSBpQmxvY2sgSEJBIERyaXZlciAlcyBvbiIKIAkJIiBHZW5lcmljIFRhcmdldCBDb3JlIFN0YWNrICVzXG4iLCBoYmEtPmhiYV9pZCwKIAkJSUJMT0NLX1ZFUlNJT04sIFRBUkdFVF9DT1JFX01PRF9WRVJTSU9OKTsKIAotCXByaW50ayhLRVJOX0lORk8gIkNPUkVfSEJBWyVkXSAtIEF0dGFjaGVkIGlCbG9jayBIQkE6ICV1IHRvIEdlbmVyaWMiCi0JCSIgVGFyZ2V0IENvcmUgVENRIERlcHRoOiAlZFxuIiwgaGJhLT5oYmFfaWQsCi0JCWliX2hvc3QtPmlibG9ja19ob3N0X2lkLCBhdG9taWNfcmVhZCgmaGJhLT5tYXhfcXVldWVfZGVwdGgpKTsKKwlwcl9kZWJ1ZygiQ09SRV9IQkFbJWRdIC0gQXR0YWNoZWQgaUJsb2NrIEhCQTogJXUgdG8gR2VuZXJpY1xuIiwKKwkJaGJhLT5oYmFfaWQsIGliX2hvc3QtPmlibG9ja19ob3N0X2lkKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTMsNyArODQsNyBAQAogewogCXN0cnVjdCBpYmxvY2tfaGJhICppYl9ob3N0ID0gaGJhLT5oYmFfcHRyOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ09SRV9IQkFbJWRdIC0gRGV0YWNoZWQgaUJsb2NrIEhCQTogJXUgZnJvbSBHZW5lcmljIgorCXByX2RlYnVnKCJDT1JFX0hCQVslZF0gLSBEZXRhY2hlZCBpQmxvY2sgSEJBOiAldSBmcm9tIEdlbmVyaWMiCiAJCSIgVGFyZ2V0IENvcmVcbiIsIGhiYS0+aGJhX2lkLCBpYl9ob3N0LT5pYmxvY2tfaG9zdF9pZCk7CiAKIAlrZnJlZShpYl9ob3N0KTsKQEAgLTEwNiwxMyArOTcsMTMgQEAKIAlzdHJ1Y3QgaWJsb2NrX2hiYSAqaWJfaG9zdCA9IGhiYS0+aGJhX3B0cjsKIAogCWliX2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpYmxvY2tfZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoaWJfZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgaWJsb2NrX2RldlxuIik7CisJaWYgKCFpYl9kZXYpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IGlibG9ja19kZXZcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJaWJfZGV2LT5pYmRfaG9zdCA9IGliX2hvc3Q7CiAKLQlwcmludGsoS0VSTl9JTkZPICAiSUJMT0NLOiBBbGxvY2F0ZWQgaWJfZGV2IGZvciAlc1xuIiwgbmFtZSk7CisJcHJfZGVidWcoICJJQkxPQ0s6IEFsbG9jYXRlZCBpYl9kZXYgZm9yICVzXG4iLCBuYW1lKTsKIAogCXJldHVybiBpYl9kZXY7CiB9CkBAIC0xMzEsOCArMTIyLDggQEAKIAl1MzIgZGV2X2ZsYWdzID0gMDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAotCWlmICghKGliX2RldikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCBpYmxvY2tfZGV2IHBhcmFtZXRlclxuIik7CisJaWYgKCFpYl9kZXYpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCBpYmxvY2tfZGV2IHBhcmFtZXRlclxuIik7CiAJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQogCW1lbXNldCgmZGV2X2xpbWl0cywgMCwgc2l6ZW9mKHN0cnVjdCBzZV9kZXZfbGltaXRzKSk7CkBAIC0xNDAsMTYgKzEzMSwxNiBAQAogCSAqIFRoZXNlIHNldHRpbmdzIG5lZWQgdG8gYmUgbWFkZSB0dW5hYmxlLi4KIAkgKi8KIAlpYl9kZXYtPmliZF9iaW9fc2V0ID0gYmlvc2V0X2NyZWF0ZSgzMiwgNjQpOwotCWlmICghKGliX2Rldi0+aWJkX2Jpb19zZXQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSUJMT0NLOiBVbmFibGUgdG8gY3JlYXRlIGJpb3NldCgpXG4iKTsKKwlpZiAoIWliX2Rldi0+aWJkX2Jpb19zZXQpIHsKKwkJcHJfZXJyKCJJQkxPQ0s6IFVuYWJsZSB0byBjcmVhdGUgYmlvc2V0KClcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiSUJMT0NLOiBDcmVhdGVkIGJpb19zZXQoKVxuIik7CisJcHJfZGVidWcoIklCTE9DSzogQ3JlYXRlZCBiaW9fc2V0KClcbiIpOwogCS8qCiAJICogaWJsb2NrX2NoZWNrX2NvbmZpZ2ZzX2Rldl9wYXJhbXMoKSBlbnN1cmVzIHRoYXQgaWJfZGV2LT5pYmRfdWRldl9wYXRoCiAJICogbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBzZXQgaW4gb3JkZXIgZm9yIGVjaG8gMSA+ICRIQkEvJERFVi9lbmFibGUgdG8gcnVuLgogCSAqLwotCXByaW50ayhLRVJOX0lORk8gICJJQkxPQ0s6IENsYWltaW5nIHN0cnVjdCBibG9ja19kZXZpY2U6ICVzXG4iLAorCXByX2RlYnVnKCAiSUJMT0NLOiBDbGFpbWluZyBzdHJ1Y3QgYmxvY2tfZGV2aWNlOiAlc1xuIiwKIAkJCWliX2Rldi0+aWJkX3VkZXZfcGF0aCk7CiAKIAliZCA9IGJsa2Rldl9nZXRfYnlfcGF0aChpYl9kZXYtPmliZF91ZGV2X3BhdGgsCkBAIC0xNjcsNDIgKzE1OCw0MSBAQAogCWxpbWl0cy0+bG9naWNhbF9ibG9ja19zaXplID0gYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoYmQpOwogCWxpbWl0cy0+bWF4X2h3X3NlY3RvcnMgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKTsKIAlsaW1pdHMtPm1heF9zZWN0b3JzID0gcXVldWVfbWF4X3NlY3RvcnMocSk7Ci0JZGV2X2xpbWl0cy5od19xdWV1ZV9kZXB0aCA9IElCTE9DS19NQVhfREVWSUNFX1FVRVVFX0RFUFRIOwotCWRldl9saW1pdHMucXVldWVfZGVwdGggPSBJQkxPQ0tfREVWSUNFX1FVRVVFX0RFUFRIOworCWRldl9saW1pdHMuaHdfcXVldWVfZGVwdGggPSBxLT5ucl9yZXF1ZXN0czsKKwlkZXZfbGltaXRzLnF1ZXVlX2RlcHRoID0gcS0+bnJfcmVxdWVzdHM7CiAKLQlpYl9kZXYtPmliZF9tYWpvciA9IE1BSk9SKGJkLT5iZF9kZXYpOwotCWliX2Rldi0+aWJkX21pbm9yID0gTUlOT1IoYmQtPmJkX2Rldik7CiAJaWJfZGV2LT5pYmRfYmQgPSBiZDsKIAogCWRldiA9IHRyYW5zcG9ydF9hZGRfZGV2aWNlX3RvX2NvcmVfaGJhKGhiYSwKLQkJCSZpYmxvY2tfdGVtcGxhdGUsIHNlX2RldiwgZGV2X2ZsYWdzLCAodm9pZCAqKWliX2RldiwKKwkJCSZpYmxvY2tfdGVtcGxhdGUsIHNlX2RldiwgZGV2X2ZsYWdzLCBpYl9kZXYsCiAJCQkmZGV2X2xpbWl0cywgIklCTE9DSyIsIElCTE9DS19WRVJTSU9OKTsKLQlpZiAoIShkZXYpKQorCWlmICghZGV2KQogCQlnb3RvIGZhaWxlZDsKIAotCWliX2Rldi0+aWJkX2RlcHRoID0gZGV2LT5xdWV1ZV9kZXB0aDsKLQogCS8qCiAJICogQ2hlY2sgaWYgdGhlIHVuZGVybHlpbmcgc3RydWN0IGJsb2NrX2RldmljZSByZXF1ZXN0X3F1ZXVlIHN1cHBvcnRzCiAJICogdGhlIFFVRVVFX0ZMQUdfRElTQ0FSRCBiaXQgZm9yIFVOTUFQL1dSSVRFX1NBTUUgaW4gU0NTSSArIFRSSU0KIAkgKiBpbiBBVEEgYW5kIHdlIG5lZWQgdG8gc2V0IFRQRT0xCiAJICovCiAJaWYgKGJsa19xdWV1ZV9kaXNjYXJkKHEpKSB7Ci0JCURFVl9BVFRSSUIoZGV2KS0+bWF4X3VubWFwX2xiYV9jb3VudCA9CisJCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5tYXhfdW5tYXBfbGJhX2NvdW50ID0KIAkJCQlxLT5saW1pdHMubWF4X2Rpc2NhcmRfc2VjdG9yczsKIAkJLyoKIAkJICogQ3VycmVudGx5IGhhcmRjb2RlZCB0byAxIGluIExpbnV4L1NDU0kgY29kZS4uCiAJCSAqLwotCQlERVZfQVRUUklCKGRldiktPm1heF91bm1hcF9ibG9ja19kZXNjX2NvdW50ID0gMTsKLQkJREVWX0FUVFJJQihkZXYpLT51bm1hcF9ncmFudWxhcml0eSA9CisJCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5tYXhfdW5tYXBfYmxvY2tfZGVzY19jb3VudCA9IDE7CisJCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi51bm1hcF9ncmFudWxhcml0eSA9CiAJCQkJcS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHk7Ci0JCURFVl9BVFRSSUIoZGV2KS0+dW5tYXBfZ3JhbnVsYXJpdHlfYWxpZ25tZW50ID0KKwkJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLnVubWFwX2dyYW51bGFyaXR5X2FsaWdubWVudCA9CiAJCQkJcS0+bGltaXRzLmRpc2NhcmRfYWxpZ25tZW50OwogCi0JCXByaW50ayhLRVJOX0lORk8gIklCTE9DSzogQkxPQ0sgRGlzY2FyZCBzdXBwb3J0IGF2YWlsYWJsZSwiCisJCXByX2RlYnVnKCJJQkxPQ0s6IEJMT0NLIERpc2NhcmQgc3VwcG9ydCBhdmFpbGFibGUsIgogCQkJCSIgZGlzYWJsZWQgYnkgZGVmYXVsdFxuIik7CiAJfQogCisJaWYgKGJsa19xdWV1ZV9ub25yb3QocSkpCisJCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5pc19ub25yb3QgPSAxOworCiAJcmV0dXJuIGRldjsKIAogZmFpbGVkOgpAQCAtMjExLDggKzIwMSw2IEBACiAJCWliX2Rldi0+aWJkX2Jpb19zZXQgPSBOVUxMOwogCX0KIAlpYl9kZXYtPmliZF9iZCA9IE5VTEw7Ci0JaWJfZGV2LT5pYmRfbWFqb3IgPSAwOwotCWliX2Rldi0+aWJkX21pbm9yID0gMDsKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCkBAIC0yMzMsMTcgKzIyMSwxNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNlX3Rhc2sgKgotaWJsb2NrX2FsbG9jX3Rhc2soc3RydWN0IHNlX2NtZCAqY21kKQoraWJsb2NrX2FsbG9jX3Rhc2sodW5zaWduZWQgY2hhciAqY2RiKQogewogCXN0cnVjdCBpYmxvY2tfcmVxICppYl9yZXE7CiAKIAlpYl9yZXEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWJsb2NrX3JlcSksIEdGUF9LRVJORUwpOwotCWlmICghKGliX3JlcSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJ1Y3QgaWJsb2NrX3JlcVxuIik7CisJaWYgKCFpYl9yZXEpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJ1Y3QgaWJsb2NrX3JlcVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCWliX3JlcS0+aWJfZGV2ID0gU0VfREVWKGNtZCktPmRldl9wdHI7CiAJYXRvbWljX3NldCgmaWJfcmVxLT5pYl9iaW9fY250LCAwKTsKIAlyZXR1cm4gJmliX3JlcS0+aWJfdGFzazsKIH0KQEAgLTI1NywxMiArMjQ0LDEyIEBACiAJCQkJCWJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkKSkgLSAxKTsKIAl1MzIgYmxvY2tfc2l6ZSA9IGJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkKTsKIAotCWlmIChibG9ja19zaXplID09IERFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSkKKwlpZiAoYmxvY2tfc2l6ZSA9PSBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZSkKIAkJcmV0dXJuIGJsb2Nrc19sb25nOwogCiAJc3dpdGNoIChibG9ja19zaXplKSB7CiAJY2FzZSA0MDk2OgotCQlzd2l0Y2ggKERFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSkgeworCQlzd2l0Y2ggKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5ibG9ja19zaXplKSB7CiAJCWNhc2UgMjA0ODoKIAkJCWJsb2Nrc19sb25nIDw8PSAxOwogCQkJYnJlYWs7CkBAIC0yNzYsNyArMjYzLDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIDIwNDg6Ci0JCXN3aXRjaCAoREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplKSB7CisJCXN3aXRjaCAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUpIHsKIAkJY2FzZSA0MDk2OgogCQkJYmxvY2tzX2xvbmcgPj49IDE7CiAJCQlicmVhazsKQEAgLTI5MSw3ICsyNzgsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgMTAyNDoKLQkJc3dpdGNoIChERVZfQVRUUklCKGRldiktPmJsb2NrX3NpemUpIHsKKwkJc3dpdGNoIChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZSkgewogCQljYXNlIDQwOTY6CiAJCQlibG9ja3NfbG9uZyA+Pj0gMjsKIAkJCWJyZWFrOwpAQCAtMzA2LDcgKzI5Myw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSA1MTI6Ci0JCXN3aXRjaCAoREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplKSB7CisJCXN3aXRjaCAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUpIHsKIAkJY2FzZSA0MDk2OgogCQkJYmxvY2tzX2xvbmcgPj49IDM7CiAJCQlicmVhazsKQEAgLTMzMiw5ICszMTksOSBAQAogICovCiBzdGF0aWMgdm9pZCBpYmxvY2tfZW11bGF0ZV9zeW5jX2NhY2hlKHN0cnVjdCBzZV90YXNrICp0YXNrKQogewotCXN0cnVjdCBzZV9jbWQgKmNtZCA9IFRBU0tfQ01EKHRhc2spOworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBpYmxvY2tfZGV2ICppYl9kZXYgPSBjbWQtPnNlX2Rldi0+ZGV2X3B0cjsKLQlpbnQgaW1tZWQgPSAoVF9UQVNLKGNtZCktPnRfdGFza19jZGJbMV0gJiAweDIpOworCWludCBpbW1lZCA9IChjbWQtPnRfdGFza19jZGJbMV0gJiAweDIpOwogCXNlY3Rvcl90IGVycm9yX3NlY3RvcjsKIAlpbnQgcmV0OwogCkBAIC0zNTEsNyArMzM4LDcgQEAKIAkgKi8KIAlyZXQgPSBibGtkZXZfaXNzdWVfZmx1c2goaWJfZGV2LT5pYmRfYmQsIEdGUF9LRVJORUwsICZlcnJvcl9zZWN0b3IpOwogCWlmIChyZXQgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIklCTE9DSzogYmxvY2tfaXNzdWVfZmx1c2goKSBmYWlsZWQ6ICVkICIKKwkJcHJfZXJyKCJJQkxPQ0s6IGJsb2NrX2lzc3VlX2ZsdXNoKCkgZmFpbGVkOiAlZCAiCiAJCQkiIGVycm9yX3NlY3RvcjogJWxsdVxuIiwgcmV0LAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyllcnJvcl9zZWN0b3IpOwogCX0KQEAgLTQwMSw5ICszODgsOSBAQAogCQkgKiBGb3JjZSBkYXRhIHRvIGRpc2sgaWYgd2UgcHJldGVuZCB0byBub3QgaGF2ZSBhIHZvbGF0aWxlCiAJCSAqIHdyaXRlIGNhY2hlLCBvciB0aGUgaW5pdGlhdG9yIHNldCB0aGUgRm9yY2UgVW5pdCBBY2Nlc3MgYml0LgogCQkgKi8KLQkJaWYgKERFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV93cml0ZV9jYWNoZSA9PSAwIHx8Ci0JCSAgICAoREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX2Z1YV93cml0ZSA+IDAgJiYKLQkJICAgICBUX1RBU0sodGFzay0+dGFza19zZV9jbWQpLT50X3Rhc2tzX2Z1YSkpCisJCWlmIChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV93cml0ZV9jYWNoZSA9PSAwIHx8CisJCSAgICAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfZnVhX3dyaXRlID4gMCAmJgorCQkgICAgIHRhc2stPnRhc2tfc2VfY21kLT50X3Rhc2tzX2Z1YSkpCiAJCQlydyA9IFdSSVRFX0ZVQTsKIAkJZWxzZQogCQkJcncgPSBXUklURTsKQEAgLTQxNSw4ICs0MDIsOSBAQAogCXdoaWxlIChiaW8pIHsKIAkJbmJpbyA9IGJpby0+YmlfbmV4dDsKIAkJYmlvLT5iaV9uZXh0ID0gTlVMTDsKLQkJREVCVUdfSUJMT0NLKCJDYWxsaW5nIHN1Ym1pdF9iaW8oKSB0YXNrOiAlcCBiaW86ICVwIgotCQkJIiBiaW8tPmJpX3NlY3RvcjogJWxsdVxuIiwgdGFzaywgYmlvLCBiaW8tPmJpX3NlY3Rvcik7CisJCXByX2RlYnVnKCJDYWxsaW5nIHN1Ym1pdF9iaW8oKSB0YXNrOiAlcCBiaW86ICVwIgorCQkJIiBiaW8tPmJpX3NlY3RvcjogJWxsdVxuIiwgdGFzaywgYmlvLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IpOwogCiAJCXN1Ym1pdF9iaW8ocncsIGJpbyk7CiAJCWJpbyA9IG5iaW87CkBAIC00NzAsNyArNDU4LDcgQEAKIAlzdHJ1Y3QgaWJsb2NrX2RldiAqaWJfZGV2ID0gc2VfZGV2LT5zZV9kZXZfc3VfcHRyOwogCWNoYXIgKm9yaWcsICpwdHIsICphcmdfcCwgKm9wdHM7CiAJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwotCWludCByZXQgPSAwLCBhcmcsIHRva2VuOworCWludCByZXQgPSAwLCB0b2tlbjsKIAogCW9wdHMgPSBrc3RyZHVwKHBhZ2UsIEdGUF9LRVJORUwpOwogCWlmICghb3B0cykKQEAgLTQ4Niw3ICs0NzQsNyBAQAogCQlzd2l0Y2ggKHRva2VuKSB7CiAJCWNhc2UgT3B0X3VkZXZfcGF0aDoKIAkJCWlmIChpYl9kZXYtPmliZF9iZCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHNldCB1ZGV2X3BhdGg9IHdoaWxlIgorCQkJCXByX2VycigiVW5hYmxlIHRvIHNldCB1ZGV2X3BhdGg9IHdoaWxlIgogCQkJCQkiIGliX2Rldi0+aWJkX2JkIGV4aXN0c1xuIik7CiAJCQkJcmV0ID0gLUVFWElTVDsKIAkJCQlnb3RvIG91dDsKQEAgLTQ5OSwxNSArNDg3LDExIEBACiAJCQlzbnByaW50ZihpYl9kZXYtPmliZF91ZGV2X3BhdGgsIFNFX1VERVZfUEFUSF9MRU4sCiAJCQkJCSIlcyIsIGFyZ19wKTsKIAkJCWtmcmVlKGFyZ19wKTsKLQkJCXByaW50ayhLRVJOX0lORk8gIklCTE9DSzogUmVmZXJlbmNpbmcgVURFViBwYXRoOiAlc1xuIiwKKwkJCXByX2RlYnVnKCJJQkxPQ0s6IFJlZmVyZW5jaW5nIFVERVYgcGF0aDogJXNcbiIsCiAJCQkJCWliX2Rldi0+aWJkX3VkZXZfcGF0aCk7CiAJCQlpYl9kZXYtPmliZF9mbGFncyB8PSBJQkRGX0hBU19VREVWX1BBVEg7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZm9yY2U6Ci0JCQltYXRjaF9pbnQoYXJncywgJmFyZyk7Ci0JCQlpYl9kZXYtPmliZF9mb3JjZSA9IGFyZzsKLQkJCXByaW50ayhLRVJOX0lORk8gIklCTE9DSzogU2V0IGZvcmNlPSVkXG4iLAotCQkJCWliX2Rldi0+aWJkX2ZvcmNlKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CkBAIC01MjYsOCArNTEwLDggQEAKIAlzdHJ1Y3QgaWJsb2NrX2RldiAqaWJkID0gc2VfZGV2LT5zZV9kZXZfc3VfcHRyOwogCiAJaWYgKCEoaWJkLT5pYmRfZmxhZ3MgJiBJQkRGX0hBU19VREVWX1BBVEgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWlzc2luZyB1ZGV2X3BhdGg9IHBhcmFtZXRlcnMgZm9yIElCTE9DS1xuIik7Ci0JCXJldHVybiAtMTsKKwkJcHJfZXJyKCJNaXNzaW5nIHVkZXZfcGF0aD0gcGFyYW1ldGVycyBmb3IgSUJMT0NLXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC01NTUsMTIgKzUzOSwxMSBAQAogCWJsICs9IHNwcmludGYoYiArIGJsLCAiICAgICAgICAiKTsKIAlpZiAoYmQpIHsKIAkJYmwgKz0gc3ByaW50ZihiICsgYmwsICJNYWpvcjogJWQgTWlub3I6ICVkICAlc1xuIiwKLQkJCWliZC0+aWJkX21ham9yLCBpYmQtPmliZF9taW5vciwgKCFiZC0+YmRfY29udGFpbnMpID8KKwkJCU1BSk9SKGJkLT5iZF9kZXYpLCBNSU5PUihiZC0+YmRfZGV2KSwgKCFiZC0+YmRfY29udGFpbnMpID8KIAkJCSIiIDogKGJkLT5iZF9ob2xkZXIgPT0gKHN0cnVjdCBpYmxvY2tfZGV2ICopaWJkKSA/CiAJCQkiQ0xBSU1FRDogSUJMT0NLIiA6ICJDTEFJTUVEOiBPUyIpOwogCX0gZWxzZSB7Ci0JCWJsICs9IHNwcmludGYoYiArIGJsLCAiTWFqb3I6ICVkIE1pbm9yOiAlZFxuIiwKLQkJCWliZC0+aWJkX21ham9yLCBpYmQtPmliZF9taW5vcik7CisJCWJsICs9IHNwcmludGYoYiArIGJsLCAiTWFqb3I6IDAgTWlub3I6IDBcbiIpOwogCX0KIAogCXJldHVybiBibDsKQEAgLTU4NSwxMDMgKzU2OCwxMDMgQEAKIAlzdHJ1Y3QgYmlvICpiaW87CiAKIAliaW8gPSBiaW9fYWxsb2NfYmlvc2V0KEdGUF9OT0lPLCBzZ19udW0sIGliX2Rldi0+aWJkX2Jpb19zZXQpOwotCWlmICghKGJpbykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBiaW9cbiIpOworCWlmICghYmlvKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYmlvXG4iKTsKIAkJKnJldCA9IFBZWF9UUkFOU1BPUlRfT1VUX09GX01FTU9SWV9SRVNPVVJDRVM7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCURFQlVHX0lCTE9DSygiQWxsb2NhdGVkIGJpbzogJXAgdGFza19zZ19udW06ICV1IHVzaW5nIGliZF9iaW9fc2V0OiIKLQkJIiAlcFxuIiwgYmlvLCB0YXNrLT50YXNrX3NnX251bSwgaWJfZGV2LT5pYmRfYmlvX3NldCk7Ci0JREVCVUdfSUJMT0NLKCJBbGxvY2F0ZWQgYmlvOiAlcCB0YXNrX3NpemU6ICV1XG4iLCBiaW8sIHRhc2stPnRhc2tfc2l6ZSk7CisJcHJfZGVidWcoIkFsbG9jYXRlZCBiaW86ICVwIHRhc2tfc2dfbmVudHM6ICV1IHVzaW5nIGliZF9iaW9fc2V0OiIKKwkJIiAlcFxuIiwgYmlvLCB0YXNrLT50YXNrX3NnX25lbnRzLCBpYl9kZXYtPmliZF9iaW9fc2V0KTsKKwlwcl9kZWJ1ZygiQWxsb2NhdGVkIGJpbzogJXAgdGFza19zaXplOiAldVxuIiwgYmlvLCB0YXNrLT50YXNrX3NpemUpOwogCiAJYmlvLT5iaV9iZGV2ID0gaWJfZGV2LT5pYmRfYmQ7Ci0JYmlvLT5iaV9wcml2YXRlID0gKHZvaWQgKikgdGFzazsKKwliaW8tPmJpX3ByaXZhdGUgPSB0YXNrOwogCWJpby0+YmlfZGVzdHJ1Y3RvciA9IGlibG9ja19iaW9fZGVzdHJ1Y3RvcjsKIAliaW8tPmJpX2VuZF9pbyA9ICZpYmxvY2tfYmlvX2RvbmU7CiAJYmlvLT5iaV9zZWN0b3IgPSBsYmE7CiAJYXRvbWljX2luYygmaWJfcmVxLT5pYl9iaW9fY250KTsKIAotCURFQlVHX0lCTE9DSygiU2V0IGJpby0+Ymlfc2VjdG9yOiAlbGx1XG4iLCBiaW8tPmJpX3NlY3Rvcik7Ci0JREVCVUdfSUJMT0NLKCJTZXQgaWJfcmVxLT5pYl9iaW9fY250OiAlZFxuIiwKKwlwcl9kZWJ1ZygiU2V0IGJpby0+Ymlfc2VjdG9yOiAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWJpby0+Ymlfc2VjdG9yKTsKKwlwcl9kZWJ1ZygiU2V0IGliX3JlcS0+aWJfYmlvX2NudDogJWRcbiIsCiAJCQlhdG9taWNfcmVhZCgmaWJfcmVxLT5pYl9iaW9fY250KSk7CiAJcmV0dXJuIGJpbzsKIH0KIAotc3RhdGljIGludCBpYmxvY2tfbWFwX3Rhc2tfU0coc3RydWN0IHNlX3Rhc2sgKnRhc2spCitzdGF0aWMgaW50IGlibG9ja19tYXBfZGF0YV9TRyhzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKIHsKIAlzdHJ1Y3Qgc2VfY21kICpjbWQgPSB0YXNrLT50YXNrX3NlX2NtZDsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBTRV9ERVYoY21kKTsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAlzdHJ1Y3QgaWJsb2NrX2RldiAqaWJfZGV2ID0gdGFzay0+c2VfZGV2LT5kZXZfcHRyOwogCXN0cnVjdCBpYmxvY2tfcmVxICppYl9yZXEgPSBJQkxPQ0tfUkVRKHRhc2spOwogCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEwsICpoYmlvID0gTlVMTCwgKnRiaW8gPSBOVUxMOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJaW50IHJldCA9IDA7Ci0JdTMyIGksIHNnX251bSA9IHRhc2stPnRhc2tfc2dfbnVtOworCXUzMiBpLCBzZ19udW0gPSB0YXNrLT50YXNrX3NnX25lbnRzOwogCXNlY3Rvcl90IGJsb2NrX2xiYTsKIAkvKgogCSAqIERvIHN0YXJ0aW5nIGNvbnZlcnNpb24gdXAgZnJvbSBub24gNTEyLWJ5dGUgYmxvY2tzaXplIHdpdGgKIAkgKiBzdHJ1Y3Qgc2VfdGFzayBTQ1NJIGJsb2Nrc2l6ZSBpbnRvIExpbnV4L0Jsb2NrIDUxMiB1bml0cyBmb3IgQklPLgogCSAqLwotCWlmIChERVZfQVRUUklCKGRldiktPmJsb2NrX3NpemUgPT0gNDA5NikKKwlpZiAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUgPT0gNDA5NikKIAkJYmxvY2tfbGJhID0gKHRhc2stPnRhc2tfbGJhIDw8IDMpOwotCWVsc2UgaWYgKERFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSA9PSAyMDQ4KQorCWVsc2UgaWYgKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5ibG9ja19zaXplID09IDIwNDgpCiAJCWJsb2NrX2xiYSA9ICh0YXNrLT50YXNrX2xiYSA8PCAyKTsKLQllbHNlIGlmIChERVZfQVRUUklCKGRldiktPmJsb2NrX3NpemUgPT0gMTAyNCkKKwllbHNlIGlmIChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZSA9PSAxMDI0KQogCQlibG9ja19sYmEgPSAodGFzay0+dGFza19sYmEgPDwgMSk7Ci0JZWxzZSBpZiAoREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplID09IDUxMikKKwllbHNlIGlmIChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZSA9PSA1MTIpCiAJCWJsb2NrX2xiYSA9IHRhc2stPnRhc2tfbGJhOwogCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIlVuc3VwcG9ydGVkIFNDU0kgLT4gQkxPQ0sgTEJBIGNvbnZlcnNpb246IgotCQkJCSIgJXVcbiIsIERFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSk7CisJCXByX2VycigiVW5zdXBwb3J0ZWQgU0NTSSAtPiBCTE9DSyBMQkEgY29udmVyc2lvbjoiCisJCQkJIiAldVxuIiwgZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUpOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CiAJfQogCiAJYmlvID0gaWJsb2NrX2dldF9iaW8odGFzaywgaWJfcmVxLCBpYl9kZXYsICZyZXQsIGJsb2NrX2xiYSwgc2dfbnVtKTsKLQlpZiAoIShiaW8pKQorCWlmICghYmlvKQogCQlyZXR1cm4gcmV0OwogCiAJaWJfcmVxLT5pYl9iaW8gPSBiaW87CiAJaGJpbyA9IHRiaW8gPSBiaW87CiAJLyoKIAkgKiBVc2UgZnMvYmlvLmM6YmlvX2FkZF9wYWdlcygpIHRvIHNldHVwIHRoZSBiaW9fdmVjIG1hcGxpc3QKLQkgKiBmcm9tIFRDTSBzdHJ1Y3Qgc2VfbWVtIC0+IHRhc2stPnRhc2tfc2cgLT4gc3RydWN0IHNjYXR0ZXJsaXN0IG1lbW9yeS4KKwkgKiBmcm9tIHRhc2stPnRhc2tfc2cgLT4gc3RydWN0IHNjYXR0ZXJsaXN0IG1lbW9yeS4KIAkgKi8KLQlmb3JfZWFjaF9zZyh0YXNrLT50YXNrX3NnLCBzZywgdGFzay0+dGFza19zZ19udW0sIGkpIHsKLQkJREVCVUdfSUJMT0NLKCJ0YXNrOiAlcCBiaW86ICVwIENhbGxpbmcgYmlvX2FkZF9wYWdlKCk6IHBhZ2U6IgorCWZvcl9lYWNoX3NnKHRhc2stPnRhc2tfc2csIHNnLCB0YXNrLT50YXNrX3NnX25lbnRzLCBpKSB7CisJCXByX2RlYnVnKCJ0YXNrOiAlcCBiaW86ICVwIENhbGxpbmcgYmlvX2FkZF9wYWdlKCk6IHBhZ2U6IgogCQkJIiAlcCBsZW46ICV1IG9mZnNldDogJXVcbiIsIHRhc2ssIGJpbywgc2dfcGFnZShzZyksCiAJCQkJc2ctPmxlbmd0aCwgc2ctPm9mZnNldCk7CiBhZ2FpbjoKIAkJcmV0ID0gYmlvX2FkZF9wYWdlKGJpbywgc2dfcGFnZShzZyksIHNnLT5sZW5ndGgsIHNnLT5vZmZzZXQpOwogCQlpZiAocmV0ICE9IHNnLT5sZW5ndGgpIHsKIAotCQkJREVCVUdfSUJMT0NLKCIqKiogU2V0IGJpby0+Ymlfc2VjdG9yOiAlbGx1XG4iLAotCQkJCQliaW8tPmJpX3NlY3Rvcik7Ci0JCQlERUJVR19JQkxPQ0soIioqIHRhc2stPnRhc2tfc2l6ZTogJXVcbiIsCisJCQlwcl9kZWJ1ZygiKioqIFNldCBiaW8tPmJpX3NlY3RvcjogJWxsdVxuIiwKKwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX3NlY3Rvcik7CisJCQlwcl9kZWJ1ZygiKiogdGFzay0+dGFza19zaXplOiAldVxuIiwKIAkJCQkJdGFzay0+dGFza19zaXplKTsKLQkJCURFQlVHX0lCTE9DSygiKioqIGJpby0+YmlfbWF4X3ZlY3M6ICV1XG4iLAorCQkJcHJfZGVidWcoIioqKiBiaW8tPmJpX21heF92ZWNzOiAldVxuIiwKIAkJCQkJYmlvLT5iaV9tYXhfdmVjcyk7Ci0JCQlERUJVR19JQkxPQ0soIioqKiBiaW8tPmJpX3ZjbnQ6ICV1XG4iLAorCQkJcHJfZGVidWcoIioqKiBiaW8tPmJpX3ZjbnQ6ICV1XG4iLAogCQkJCQliaW8tPmJpX3ZjbnQpOwogCiAJCQliaW8gPSBpYmxvY2tfZ2V0X2Jpbyh0YXNrLCBpYl9yZXEsIGliX2RldiwgJnJldCwKIAkJCQkJCWJsb2NrX2xiYSwgc2dfbnVtKTsKLQkJCWlmICghKGJpbykpCisJCQlpZiAoIWJpbykKIAkJCQlnb3RvIGZhaWw7CiAKIAkJCXRiaW8gPSB0YmlvLT5iaV9uZXh0ID0gYmlvOwotCQkJREVCVUdfSUJMT0NLKCItLS0tLS0tLS0tLS0tLS0tLT4gQWRkZWQgKzEgYmlvOiAlcCB0byIKKwkJCXByX2RlYnVnKCItLS0tLS0tLS0tLS0tLS0tLT4gQWRkZWQgKzEgYmlvOiAlcCB0byIKIAkJCQkiIGxpc3QsIEdvaW5nIHRvIGFnYWluXG4iLCBiaW8pOwogCQkJZ290byBhZ2FpbjsKIAkJfQogCQkvKiBBbHdheXMgaW4gNTEyIGJ5dGUgdW5pdHMgZm9yIExpbnV4L0Jsb2NrICovCiAJCWJsb2NrX2xiYSArPSBzZy0+bGVuZ3RoID4+IElCTE9DS19MQkFfU0hJRlQ7CiAJCXNnX251bS0tOwotCQlERUJVR19JQkxPQ0soInRhc2s6ICVwIGJpby1hZGRfcGFnZSgpIHBhc3NlZCEsIGRlY3JlbWVudGVkIgorCQlwcl9kZWJ1ZygidGFzazogJXAgYmlvLWFkZF9wYWdlKCkgcGFzc2VkISwgZGVjcmVtZW50ZWQiCiAJCQkiIHNnX251bSB0byAldVxuIiwgdGFzaywgc2dfbnVtKTsKLQkJREVCVUdfSUJMT0NLKCJ0YXNrOiAlcCBiaW9fYWRkX3BhZ2UoKSBwYXNzZWQhLCBpbmNyZWFzZWQgbGJhIgotCQkJCSIgdG8gJWxsdVxuIiwgdGFzaywgYmxvY2tfbGJhKTsKLQkJREVCVUdfSUJMT0NLKCJ0YXNrOiAlcCBiaW9fYWRkX3BhZ2UoKSBwYXNzZWQhLCBiaW8tPmJpX3ZjbnQ6IgorCQlwcl9kZWJ1ZygidGFzazogJXAgYmlvX2FkZF9wYWdlKCkgcGFzc2VkISwgaW5jcmVhc2VkIGxiYSIKKwkJCSAiIHRvICVsbHVcbiIsIHRhc2ssICh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2tfbGJhKTsKKwkJcHJfZGVidWcoInRhc2s6ICVwIGJpb19hZGRfcGFnZSgpIHBhc3NlZCEsIGJpby0+YmlfdmNudDoiCiAJCQkJIiAldVxuIiwgdGFzaywgYmlvLT5iaV92Y250KTsKIAl9CiAKQEAgLTcyNywxMSArNzEwLDExIEBACiAJLyoKIAkgKiBTZXQgLUVJTyBpZiAhQklPX1VQVE9EQVRFIGFuZCB0aGUgcGFzc2VkIGlzIHN0aWxsIGVycj0wCiAJICovCi0JaWYgKCEodGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncykpICYmICEoZXJyKSkKKwlpZiAoIXRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpICYmICFlcnIpCiAJCWVyciA9IC1FSU87CiAKIAlpZiAoZXJyICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0ZXN0X2JpdChCSU9fVVBUT0RBVEUpIGZhaWxlZCBmb3IgYmlvOiAlcCwiCisJCXByX2VycigidGVzdF9iaXQoQklPX1VQVE9EQVRFKSBmYWlsZWQgZm9yIGJpbzogJXAsIgogCQkJIiBlcnI6ICVkXG4iLCBiaW8sIGVycik7CiAJCS8qCiAJCSAqIEJ1bXAgdGhlIGliX2Jpb19lcnJfY250IGFuZCByZWxlYXNlIGJpby4KQEAgLTc0MiwxNSArNzI1LDE1IEBACiAJCS8qCiAJCSAqIFdhaXQgdG8gY29tcGxldGUgdGhlIHRhc2sgdW50aWwgdGhlIGxhc3QgYmlvIGFzIGNvbXBsZXRlZC4KIAkJICovCi0JCWlmICghKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlici0+aWJfYmlvX2NudCkpKQorCQlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmlici0+aWJfYmlvX2NudCkpCiAJCQlyZXR1cm47CiAKIAkJaWJyLT5pYl9iaW8gPSBOVUxMOwogCQl0cmFuc3BvcnRfY29tcGxldGVfdGFzayh0YXNrLCAwKTsKIAkJcmV0dXJuOwogCX0KLQlERUJVR19JQkxPQ0soImRvbmVbJXBdIGJpbzogJXAgdGFza19sYmE6ICVsbHUgYmlvX2xiYTogJWxsdSBlcnI9JWRcbiIsCi0JCXRhc2ssIGJpbywgdGFzay0+dGFza19sYmEsIGJpby0+Ymlfc2VjdG9yLCBlcnIpOworCXByX2RlYnVnKCJkb25lWyVwXSBiaW86ICVwIHRhc2tfbGJhOiAlbGx1IGJpb19sYmE6ICVsbHUgZXJyPSVkXG4iLAorCQkgdGFzaywgYmlvLCB0YXNrLT50YXNrX2xiYSwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX3NlY3RvciwgZXJyKTsKIAkvKgogCSAqIGJpb19wdXQoKSB3aWxsIGNhbGwgaWJsb2NrX2Jpb19kZXN0cnVjdG9yKCkgdG8gcmVsZWFzZSB0aGUgYmlvIGJhY2sKIAkgKiB0byBpYnItPmliX2Jpb19zZXQuCkBAIC03NTksNyArNzQyLDcgQEAKIAkvKgogCSAqIFdhaXQgdG8gY29tcGxldGUgdGhlIHRhc2sgdW50aWwgdGhlIGxhc3QgYmlvIGFzIGNvbXBsZXRlZC4KIAkgKi8KLQlpZiAoIShhdG9taWNfZGVjX2FuZF90ZXN0KCZpYnItPmliX2Jpb19jbnQpKSkKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmlici0+aWJfYmlvX2NudCkpCiAJCXJldHVybjsKIAkvKgogCSAqIFJldHVybiBHT09EIHN0YXR1cyBmb3IgdGFzayBpZiB6ZXJvIGliX2Jpb19lcnJfY250IGV4aXN0cy4KQEAgLTc3Miw3ICs3NTUsNyBAQAogCS5uYW1lCQkJPSAiaWJsb2NrIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS50cmFuc3BvcnRfdHlwZQkJPSBUUkFOU1BPUlRfUExVR0lOX1ZIQkFfUERFViwKLQkubWFwX3Rhc2tfU0cJCT0gaWJsb2NrX21hcF90YXNrX1NHLAorCS5tYXBfZGF0YV9TRwkJPSBpYmxvY2tfbWFwX2RhdGFfU0csCiAJLmF0dGFjaF9oYmEJCT0gaWJsb2NrX2F0dGFjaF9oYmEsCiAJLmRldGFjaF9oYmEJCT0gaWJsb2NrX2RldGFjaF9oYmEsCiAJLmFsbG9jYXRlX3ZpcnRkZXZpY2UJPSBpYmxvY2tfYWxsb2NhdGVfdmlydGRldmljZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5oIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmgKaW5kZXggNjRjMWY0ZC4uYTEyMWNkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmgKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmgKQEAgLTMsOSArMyw2IEBACiAKICNkZWZpbmUgSUJMT0NLX1ZFUlNJT04JCSI0LjAiCiAKLSNkZWZpbmUgSUJMT0NLX0hCQV9RVUVVRV9ERVBUSAk1MTIKLSNkZWZpbmUgSUJMT0NLX0RFVklDRV9RVUVVRV9ERVBUSAkzMgotI2RlZmluZSBJQkxPQ0tfTUFYX0RFVklDRV9RVUVVRV9ERVBUSAkxMjgKICNkZWZpbmUgSUJMT0NLX01BWF9DREJTCQkxNgogI2RlZmluZSBJQkxPQ0tfTEJBX1NISUZUCTkKIApAQCAtMTUsMTggKzEyLDEyIEBACiAJYXRvbWljX3QgaWJfYmlvX2NudDsKIAlhdG9taWNfdCBpYl9iaW9fZXJyX2NudDsKIAlzdHJ1Y3QgYmlvICppYl9iaW87Ci0Jc3RydWN0IGlibG9ja19kZXYgKmliX2RldjsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCiAjZGVmaW5lIElCREZfSEFTX1VERVZfUEFUSAkJMHgwMQotI2RlZmluZSBJQkRGX0hBU19GT1JDRQkJCTB4MDIKIAogc3RydWN0IGlibG9ja19kZXYgewogCXVuc2lnbmVkIGNoYXIgaWJkX3VkZXZfcGF0aFtTRV9VREVWX1BBVEhfTEVOXTsKLQlpbnQJaWJkX2ZvcmNlOwotCWludAlpYmRfbWFqb3I7Ci0JaW50CWliZF9taW5vcjsKLQl1MzIJaWJkX2RlcHRoOwogCXUzMglpYmRfZmxhZ3M7CiAJc3RydWN0IGJpb19zZXQJKmliZF9iaW9fc2V0OwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmliZF9iZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5jCmluZGV4IGE3OWY1MTguLjFjMWI4NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHIuYwpAQCAtNjIsNyArNjIsNyBAQAogCWNoYXIgKmJ1ZiwKIAl1MzIgc2l6ZSkKIHsKLQlpZiAoIShwcl9yZWctPmlzaWRfcHJlc2VudF9hdF9yZWcpKQorCWlmICghcHJfcmVnLT5pc2lkX3ByZXNlbnRfYXRfcmVnKQogCQlyZXR1cm4gMDsKIAogCXNucHJpbnRmKGJ1Ziwgc2l6ZSwgIixpLDB4JXMiLCAmcHJfcmVnLT5wcl9yZWdfaXNpZFswXSk7CkBAIC05NSw3ICs5NSw3IEBACiAJc3RydWN0IHNlX3Nlc3Npb24gKnNlc3MgPSBjbWQtPnNlX3Nlc3M7CiAJaW50IHJldDsKIAotCWlmICghKHNlc3MpKQorCWlmICghc2VzcykKIAkJcmV0dXJuIDA7CiAKIAlzcGluX2xvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwpAQCAtMTA1LDEzICsxMDUsMTMgQEAKIAl9CiAJaWYgKGRldi0+ZGV2X3Jlc2VydmVkX25vZGVfYWNsICE9IHNlc3MtPnNlX25vZGVfYWNsKSB7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKCEoZGV2LT5kZXZfZmxhZ3MgJiBERl9TUEMyX1JFU0VSVkFUSU9OU19XSVRIX0lTSUQpKSB7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQotCXJldCA9IChkZXYtPmRldl9yZXNfYmluX2lzaWQgPT0gc2Vzcy0+c2Vzc19iaW5faXNpZCkgPyAwIDogLTE7CisJcmV0ID0gKGRldi0+ZGV2X3Jlc19iaW5faXNpZCA9PSBzZXNzLT5zZXNzX2Jpbl9pc2lkKSA/IDAgOiAtRUlOVkFMOwogCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAogCXJldHVybiByZXQ7CkBAIC0xMjMsNyArMTIzLDcgQEAKIAlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2VzcyA9IGNtZC0+c2Vfc2VzczsKIAlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICp0cGcgPSBzZXNzLT5zZV90cGc7CiAKLQlpZiAoIShzZXNzKSB8fCAhKHRwZykpCisJaWYgKCFzZXNzIHx8ICF0cGcpCiAJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKQEAgLTE0Miw5ICsxNDIsOSBAQAogCQlkZXYtPmRldl9yZXNfYmluX2lzaWQgPSAwOwogCQlkZXYtPmRldl9mbGFncyAmPSB+REZfU1BDMl9SRVNFUlZBVElPTlNfV0lUSF9JU0lEOwogCX0KLQlwcmludGsoS0VSTl9JTkZPICJTQ1NJLTIgUmVsZWFzZWQgcmVzZXJ2YXRpb24gZm9yICVzIExVTjogJXUgLT4iCi0JCSIgTUFQUEVEIExVTjogJXUgZm9yICVzXG4iLCBUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpLAotCQlTRV9MVU4oY21kKS0+dW5wYWNrZWRfbHVuLCBjbWQtPnNlX2RldmUtPm1hcHBlZF9sdW4sCisJcHJfZGVidWcoIlNDU0ktMiBSZWxlYXNlZCByZXNlcnZhdGlvbiBmb3IgJXMgTFVOOiAldSAtPiIKKwkJIiBNQVBQRUQgTFVOOiAldSBmb3IgJXNcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCWNtZC0+c2VfbHVuLT51bnBhY2tlZF9sdW4sIGNtZC0+c2VfZGV2ZS0+bWFwcGVkX2x1biwKIAkJc2Vzcy0+c2Vfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUpOwogCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIApAQCAtMTU3LDkgKzE1Nyw5IEBACiAJc3RydWN0IHNlX3Nlc3Npb24gKnNlc3MgPSBjbWQtPnNlX3Nlc3M7CiAJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqdHBnID0gc2Vzcy0+c2VfdHBnOwogCi0JaWYgKChUX1RBU0soY21kKS0+dF90YXNrX2NkYlsxXSAmIDB4MDEpICYmCi0JICAgIChUX1RBU0soY21kKS0+dF90YXNrX2NkYlsxXSAmIDB4MDIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTG9uZ0lPIGFuZCBPYnNlbGV0ZSBCaXRzIHNldCwgcmV0dXJuaW5nIgorCWlmICgoY21kLT50X3Rhc2tfY2RiWzFdICYgMHgwMSkgJiYKKwkgICAgKGNtZC0+dF90YXNrX2NkYlsxXSAmIDB4MDIpKSB7CisJCXByX2VycigiTG9uZ0lPIGFuZCBPYnNlbGV0ZSBCaXRzIHNldCwgcmV0dXJuaW5nIgogCQkJCSIgSUxMRUdBTF9SRVFVRVNUXG4iKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSUxMRUdBTF9SRVFVRVNUOwogCX0KQEAgLTE2NywxOSArMTY3LDE5IEBACiAJICogVGhpcyBpcyBjdXJyZW50bHkgdGhlIGNhc2UgZm9yIHRhcmdldF9jb3JlX21vZCBwYXNzdGhyb3VnaCBzdHJ1Y3Qgc2VfY21kCiAJICogb3BzCiAJICovCi0JaWYgKCEoc2VzcykgfHwgISh0cGcpKQorCWlmICghc2VzcyB8fCAhdHBnKQogCQlyZXR1cm4gMDsKIAogCXNwaW5fbG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CiAJaWYgKGRldi0+ZGV2X3Jlc2VydmVkX25vZGVfYWNsICYmCiAJICAgKGRldi0+ZGV2X3Jlc2VydmVkX25vZGVfYWNsICE9IHNlc3MtPnNlX25vZGVfYWNsKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNDU0ktMiBSRVNFUlZBVElPTiBDT05GTElGVCBmb3IgJXMgZmFicmljXG4iLAotCQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSk7Ci0JCXByaW50ayhLRVJOX0VSUiAiT3JpZ2luYWwgcmVzZXJ2ZXIgTFVOOiAldSAlc1xuIiwKLQkJCVNFX0xVTihjbWQpLT51bnBhY2tlZF9sdW4sCisJCXByX2VycigiU0NTSS0yIFJFU0VSVkFUSU9OIENPTkZMSUZUIGZvciAlcyBmYWJyaWNcbiIsCisJCQl0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpKTsKKwkJcHJfZXJyKCJPcmlnaW5hbCByZXNlcnZlciBMVU46ICV1ICVzXG4iLAorCQkJY21kLT5zZV9sdW4tPnVucGFja2VkX2x1biwKIAkJCWRldi0+ZGV2X3Jlc2VydmVkX25vZGVfYWNsLT5pbml0aWF0b3JuYW1lKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJDdXJyZW50IGF0dGVtcHQgLSBMVU46ICV1IC0+IE1BUFBFRCBMVU46ICV1IgotCQkJIiBmcm9tICVzIFxuIiwgU0VfTFVOKGNtZCktPnVucGFja2VkX2x1biwKKwkJcHJfZXJyKCJDdXJyZW50IGF0dGVtcHQgLSBMVU46ICV1IC0+IE1BUFBFRCBMVU46ICV1IgorCQkJIiBmcm9tICVzIFxuIiwgY21kLT5zZV9sdW4tPnVucGFja2VkX2x1biwKIAkJCWNtZC0+c2VfZGV2ZS0+bWFwcGVkX2x1biwKIAkJCXNlc3MtPnNlX25vZGVfYWNsLT5pbml0aWF0b3JuYW1lKTsKIAkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwpAQCAtMTkyLDkgKzE5Miw5IEBACiAJCWRldi0+ZGV2X3Jlc19iaW5faXNpZCA9IHNlc3MtPnNlc3NfYmluX2lzaWQ7CiAJCWRldi0+ZGV2X2ZsYWdzIHw9IERGX1NQQzJfUkVTRVJWQVRJT05TX1dJVEhfSVNJRDsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiU0NTSS0yIFJlc2VydmVkICVzIExVTjogJXUgLT4gTUFQUEVEIExVTjogJXUiCi0JCSIgZm9yICVzXG4iLCBUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpLAotCQlTRV9MVU4oY21kKS0+dW5wYWNrZWRfbHVuLCBjbWQtPnNlX2RldmUtPm1hcHBlZF9sdW4sCisJcHJfZGVidWcoIlNDU0ktMiBSZXNlcnZlZCAlcyBMVU46ICV1IC0+IE1BUFBFRCBMVU46ICV1IgorCQkiIGZvciAlc1xuIiwgdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwKKwkJY21kLT5zZV9sdW4tPnVucGFja2VkX2x1biwgY21kLT5zZV9kZXZlLT5tYXBwZWRfbHVuLAogCQlzZXNzLT5zZV9ub2RlX2FjbC0+aW5pdGlhdG9ybmFtZSk7CiAJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCkBAIC0yMTUsMTUgKzIxNSwxNSBAQAogCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gY21kLT5zZV9zZXNzOwogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBjbWQtPnNlX2Rldi0+c2Vfc3ViX2RldjsKIAlzdHJ1Y3QgdDEwX3ByX3JlZ2lzdHJhdGlvbiAqcHJfcmVnOwotCXN0cnVjdCB0MTBfcmVzZXJ2YXRpb25fdGVtcGxhdGUgKnByX3RtcGwgPSAmc3VfZGV2LT50MTBfcmVzZXJ2YXRpb247Ci0JdW5zaWduZWQgY2hhciAqY2RiID0gJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2RiWzBdOwotCWludCBjcmggPSAoVDEwX1JFUyhzdV9kZXYpLT5yZXNfdHlwZSA9PSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKTsKKwlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uICpwcl90bXBsID0gJnN1X2Rldi0+dDEwX3ByOworCXVuc2lnbmVkIGNoYXIgKmNkYiA9ICZjbWQtPnRfdGFza19jZGJbMF07CisJaW50IGNyaCA9IChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSA9PSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKTsKIAlpbnQgY29uZmxpY3QgPSAwOwogCi0JaWYgKCEoc2Vfc2VzcykpCisJaWYgKCFzZV9zZXNzKQogCQlyZXR1cm4gMDsKIAotCWlmICghKGNyaCkpCisJaWYgKCFjcmgpCiAJCWdvdG8gYWZ0ZXJfY3JoOwogCiAJcHJfcmVnID0gY29yZV9zY3NpM19sb2NhdGVfcHJfcmVnKGNtZC0+c2VfZGV2LCBzZV9zZXNzLT5zZV9ub2RlX2FjbCwKQEAgLTI4MCw3ICsyODAsNyBAQAogCX0KIAogCWlmIChjb25mbGljdCkgewotCQlwcmludGsoS0VSTl9FUlIgIlJlY2VpdmVkIGxlZ2FjeSBTUEMtMiBSRVNFUlZFL1JFTEVBU0UiCisJCXByX2VycigiUmVjZWl2ZWQgbGVnYWN5IFNQQy0yIFJFU0VSVkUvUkVMRUFTRSIKIAkJCSIgd2hpbGUgYWN0aXZlIFNQQy0zIHJlZ2lzdHJhdGlvbnMgZXhpc3QsIgogCQkJIiByZXR1cm5pbmcgUkVTRVJWQVRJT05fQ09ORkxJQ1RcbiIpOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9SRVNFUlZBVElPTl9DT05GTElDVDsKQEAgLTMwNyw3ICszMDcsNyBAQAogCXUzMiBwcl9yZWdfdHlwZSkKIHsKIAlzdHJ1Y3Qgc2VfZGV2X2VudHJ5ICpzZV9kZXZlOwotCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gU0VfU0VTUyhjbWQpOworCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gY21kLT5zZV9zZXNzOwogCWludCBvdGhlcl9jZGIgPSAwLCBpZ25vcmVfcmVnOwogCWludCByZWdpc3RlcmVkX25leHVzID0gMCwgcmV0ID0gMTsgLyogQ29uZmxpY3QgYnkgZGVmYXVsdCAqLwogCWludCBhbGxfcmVnID0gMCwgcmVnX29ubHkgPSAwOyAvKiBBTExfUkVHLCBSRUdfT05MWSAqLwpAQCAtMzYyLDcgKzM2Miw3IEBACiAJCQlyZWdpc3RlcmVkX25leHVzID0gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyoKIAkgKiBSZWZlcmVuY2VkIGZyb20gc3BjNHIxNyB0YWJsZSA0NSBmb3IgKk5PTiogUFIgaG9sZGVyIGFjY2VzcwpAQCAtNDEyLDkgKzQxMiw5IEBACiAJCQlyZXQgPSAocmVnaXN0ZXJlZF9uZXh1cykgPyAwIDogMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIFBFUlNJU1RFTlRfUkVTRVJWRV9PVVQgc2VydmljZSIKKwkJCXByX2VycigiVW5rbm93biBQRVJTSVNURU5UX1JFU0VSVkVfT1VUIHNlcnZpY2UiCiAJCQkJIiBhY3Rpb246IDB4JTAyeFxuIiwgY2RiWzFdICYgMHgxZik7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlicmVhazsKIAljYXNlIFJFTEVBU0U6CkBAIC00NTksOSArNDU5LDkgQEAKIAkJCXJldCA9IDA7IC8qIEFsbG93ZWQgKi8KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIE1JIFNlcnZpY2UgQWN0aW9uOiAweCUwMnhcbiIsCisJCQlwcl9lcnIoIlVua25vd24gTUkgU2VydmljZSBBY3Rpb246IDB4JTAyeFxuIiwKIAkJCQkoY2RiWzFdICYgMHgxZikpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBBQ0NFU1NfQ09OVFJPTF9JTjoKQEAgLTQ4MSw5ICs0ODEsOSBAQAogCSAqIENhc2Ugd2hlcmUgdGhlIENEQiBpcyBleHBsaWNpdGx5IGFsbG93ZWQgaW4gdGhlIGFib3ZlIHN3aXRjaAogCSAqIHN0YXRlbWVudC4KIAkgKi8KLQlpZiAoIShyZXQpICYmICEob3RoZXJfY2RiKSkgeworCWlmICghcmV0ICYmICFvdGhlcl9jZGIpIHsKICNpZiAwCi0JCXByaW50ayhLRVJOX0lORk8gIkFsbG93aW5nIGV4cGxpY3QgQ0RCOiAweCUwMnggZm9yICVzIgorCQlwcl9kZWJ1ZygiQWxsb3dpbmcgZXhwbGljdCBDREI6IDB4JTAyeCBmb3IgJXMiCiAJCQkiIHJlc2VydmF0aW9uIGhvbGRlclxuIiwgY2RiWzBdLAogCQkJY29yZV9zY3NpM19wcl9kdW1wX3R5cGUocHJfcmVnX3R5cGUpKTsKICNlbmRpZgpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJCQkvKgogCQkJICogQ29uZmxpY3QgZm9yIHdyaXRlIGV4Y2x1c2l2ZQogCQkJICovCi0JCQlwcmludGsoS0VSTl9JTkZPICIlcyBDb25mbGljdCBmb3IgdW5yZWdpc3RlcmVkIG5leHVzIgorCQkJcHJfZGVidWcoIiVzIENvbmZsaWN0IGZvciB1bnJlZ2lzdGVyZWQgbmV4dXMiCiAJCQkJIiAlcyBDREI6IDB4JTAyeCB0byAlcyByZXNlcnZhdGlvblxuIiwKIAkJCQl0cmFuc3BvcnRfZHVtcF9jbWRfZGlyZWN0aW9uKGNtZCksCiAJCQkJc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUsIGNkYlswXSwKQEAgLTUxNSw4ICs1MTUsOCBAQAogCQkJICogbmV4dXNlcyB0byBpc3N1ZSBDREJzLgogCQkJICovCiAjaWYgMAotCQkJaWYgKCEocmVnaXN0ZXJlZF9uZXh1cykpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJBbGxvd2luZyBpbXBsaWN0IENEQjogMHglMDJ4IgorCQkJaWYgKCFyZWdpc3RlcmVkX25leHVzKSB7CisJCQkJcHJfZGVidWcoIkFsbG93aW5nIGltcGxpY3QgQ0RCOiAweCUwMngiCiAJCQkJCSIgZm9yICVzIHJlc2VydmF0aW9uIG9uIHVucmVnaXN0ZXJlZCIKIAkJCQkJIiBuZXh1c1xuIiwgY2RiWzBdLAogCQkJCQljb3JlX3Njc2kzX3ByX2R1bXBfdHlwZShwcl9yZWdfdHlwZSkpOwpAQCAtNTMxLDE0ICs1MzEsMTQgQEAKIAkJCSAqIGFsbG93IGNvbW1hbmRzIGZyb20gcmVnaXN0ZXJlZCBuZXh1c2VzLgogCQkJICovCiAjaWYgMAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiQWxsb3dpbmcgaW1wbGljdCBDREI6IDB4JTAyeCBmb3IgJXMiCisJCQlwcl9kZWJ1ZygiQWxsb3dpbmcgaW1wbGljdCBDREI6IDB4JTAyeCBmb3IgJXMiCiAJCQkJIiByZXNlcnZhdGlvblxuIiwgY2RiWzBdLAogCQkJCWNvcmVfc2NzaTNfcHJfZHVtcF90eXBlKHByX3JlZ190eXBlKSk7CiAjZW5kaWYKIAkJCXJldHVybiAwOwogCQl9CiAJfQotCXByaW50ayhLRVJOX0lORk8gIiVzIENvbmZsaWN0IGZvciAlc3JlZ2lzdGVyZWQgbmV4dXMgJXMgQ0RCOiAweCUyeCIKKwlwcl9kZWJ1ZygiJXMgQ29uZmxpY3QgZm9yICVzcmVnaXN0ZXJlZCBuZXh1cyAlcyBDREI6IDB4JTJ4IgogCQkiIGZvciAlcyByZXNlcnZhdGlvblxuIiwgdHJhbnNwb3J0X2R1bXBfY21kX2RpcmVjdGlvbihjbWQpLAogCQkocmVnaXN0ZXJlZF9uZXh1cykgPyAiIiA6ICJ1biIsCiAJCXNlX3Nlc3MtPnNlX25vZGVfYWNsLT5pbml0aWF0b3JuYW1lLCBjZGJbMF0sCkBAIC01NDksNyArNTQ5LDcgQEAKIAogc3RhdGljIHUzMiBjb3JlX3Njc2kzX3ByX2dlbmVyYXRpb24oc3RydWN0IHNlX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBTVV9ERVYoZGV2KTsKKwlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gZGV2LT5zZV9zdWJfZGV2OwogCXUzMiBwcmc7CiAJLyoKIAkgKiBQUkdlbmVyYXRpb24gZmllbGQgc2hhbGwgY29udGFpbiB0aGUgdmFsdWUgb2YgYSAzMi1iaXQgd3JhcHBpbmcKQEAgLTU2MSw3ICs1NjEsNyBAQAogCSAqIFNlZSBzcGM0cjE3IHNlY3Rpb24gNi4zLjEyIFJFQURfS0VZUyBzZXJ2aWNlIGFjdGlvbgogCSAqLwogCXNwaW5fbG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7Ci0JcHJnID0gVDEwX1JFUyhzdV9kZXYpLT5wcl9nZW5lcmF0aW9uKys7CisJcHJnID0gc3VfZGV2LT50MTBfcHIucHJfZ2VuZXJhdGlvbisrOwogCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAogCXJldHVybiBwcmc7CkBAIC01NzUsNyArNTc1LDcgQEAKIAlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2VzcyA9IGNtZC0+c2Vfc2VzczsKIAlpbnQgcmV0OwogCi0JaWYgKCEoc2VzcykpCisJaWYgKCFzZXNzKQogCQlyZXR1cm4gMDsKIAkvKgogCSAqIEEgbGVnYWN5IFNQQy0yIHJlc2VydmF0aW9uIGlzIGJlaW5nIGhlbGQuCkBAIC01ODQsNyArNTg0LDcgQEAKIAkJcmV0dXJuIGNvcmVfc2NzaTJfcmVzZXJ2YXRpb25fY2hlY2soY21kLCBwcl9yZWdfdHlwZSk7CiAKIAlzcGluX2xvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwotCWlmICghKGRldi0+ZGV2X3ByX3Jlc19ob2xkZXIpKSB7CisJaWYgKCFkZXYtPmRldl9wcl9yZXNfaG9sZGVyKSB7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTkyLDE0ICs1OTIsMTQgQEAKIAljbWQtPnByX3Jlc19rZXkgPSBkZXYtPmRldl9wcl9yZXNfaG9sZGVyLT5wcl9yZXNfa2V5OwogCWlmIChkZXYtPmRldl9wcl9yZXNfaG9sZGVyLT5wcl9yZWdfbmFjbCAhPSBzZXNzLT5zZV9ub2RlX2FjbCkgewogCQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKGRldi0+ZGV2X3ByX3Jlc19ob2xkZXItPmlzaWRfcHJlc2VudF9hdF9yZWcpKSB7CisJaWYgKCFkZXYtPmRldl9wcl9yZXNfaG9sZGVyLT5pc2lkX3ByZXNlbnRfYXRfcmVnKSB7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldCA9IChkZXYtPmRldl9wcl9yZXNfaG9sZGVyLT5wcl9yZWdfYmluX2lzaWQgPT0KLQkgICAgICAgc2Vzcy0+c2Vzc19iaW5faXNpZCkgPyAwIDogLTE7CisJICAgICAgIHNlc3MtPnNlc3NfYmluX2lzaWQpID8gMCA6IC1FSU5WQUw7CiAJLyoKIAkgKiBVc2UgYml0IGluICpwcl9yZWdfdHlwZSB0byBub3RpZnkgSVNJRCBtaXNtYXRjaCBpbgogCSAqIGNvcmVfc2NzaTNfcHJfc2VxX25vbl9ob2xkZXIoKS4KQEAgLTYyMCwxOSArNjIwLDE5IEBACiAJaW50IGFsbF90Z19wdCwKIAlpbnQgYXB0cGwpCiB7Ci0Jc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKnN1X2RldiA9IFNVX0RFVihkZXYpOworCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBkZXYtPnNlX3N1Yl9kZXY7CiAJc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24gKnByX3JlZzsKIAogCXByX3JlZyA9IGttZW1fY2FjaGVfemFsbG9jKHQxMF9wcl9yZWdfY2FjaGUsIEdGUF9BVE9NSUMpOwotCWlmICghKHByX3JlZykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb25cbiIpOworCWlmICghcHJfcmVnKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JcHJfcmVnLT5wcl9hcHRwbF9idWYgPSBremFsbG9jKFQxMF9SRVMoc3VfZGV2KS0+cHJfYXB0cGxfYnVmX2xlbiwKKwlwcl9yZWctPnByX2FwdHBsX2J1ZiA9IGt6YWxsb2Moc3VfZGV2LT50MTBfcHIucHJfYXB0cGxfYnVmX2xlbiwKIAkJCQkJR0ZQX0FUT01JQyk7Ci0JaWYgKCEocHJfcmVnLT5wcl9hcHRwbF9idWYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHByX3JlZy0+cHJfYXB0cGxfYnVmXG4iKTsKKwlpZiAoIXByX3JlZy0+cHJfYXB0cGxfYnVmKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHByX3JlZy0+cHJfYXB0cGxfYnVmXG4iKTsKIAkJa21lbV9jYWNoZV9mcmVlKHQxMF9wcl9yZWdfY2FjaGUsIHByX3JlZyk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTY5MiwxMiArNjkyLDEyIEBACiAJICovCiAJcHJfcmVnID0gX19jb3JlX3Njc2kzX2RvX2FsbG9jX3JlZ2lzdHJhdGlvbihkZXYsIG5hY2wsIGRldmUsIGlzaWQsCiAJCQlzYV9yZXNfa2V5LCBhbGxfdGdfcHQsIGFwdHBsKTsKLQlpZiAoIShwcl9yZWcpKQorCWlmICghcHJfcmVnKQogCQlyZXR1cm4gTlVMTDsKIAkvKgogCSAqIFJldHVybiBwb2ludGVyIHRvIHByX3JlZyBmb3IgQUxMX1RHX1BUPTAKIAkgKi8KLQlpZiAoIShhbGxfdGdfcHQpKQorCWlmICghYWxsX3RnX3B0KQogCQlyZXR1cm4gcHJfcmVnOwogCS8qCiAJICogQ3JlYXRlIGxpc3Qgb2YgbWF0Y2hpbmcgU0NTSSBJbml0aWF0b3IgUG9ydCByZWdpc3RyYXRpb25zCkBAIC03MTcsNyArNzE3LDcgQEAKIAkJCSAqIHRoYXQgaGF2ZSBub3QgYmVlbiBtYWtlIGV4cGxpY3QgdmlhIGEgQ29uZmlnRlMKIAkJCSAqIE1hcHBlZExVTiBncm91cCBmb3IgdGhlIFNDU0kgSW5pdGlhdG9yIE5vZGUgQUNMLgogCQkJICovCi0JCQlpZiAoIShkZXZlX3RtcC0+c2VfbHVuX2FjbCkpCisJCQlpZiAoIWRldmVfdG1wLT5zZV9sdW5fYWNsKQogCQkJCWNvbnRpbnVlOwogCiAJCQluYWNsX3RtcCA9IGRldmVfdG1wLT5zZV9sdW5fYWNsLT5zZV9sdW5fbmFjbDsKQEAgLTc1MSw3ICs3NTEsNyBAQAogCQkJICovCiAJCQlyZXQgPSBjb3JlX3Njc2kzX2x1bmFjbF9kZXBlbmRfaXRlbShkZXZlX3RtcCk7CiAJCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiY29yZV9zY3NpM19sdW5hY2xfZGVwZW5kIgorCQkJCXByX2VycigiY29yZV9zY3NpM19sdW5hY2xfZGVwZW5kIgogCQkJCQkJIl9pdGVtKCkgZmFpbGVkXG4iKTsKIAkJCQlhdG9taWNfZGVjKCZwb3J0LT5zZXBfdGdfcHRfcmVmX2NudCk7CiAJCQkJc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCk7CkBAIC03NjksNyArNzY5LDcgQEAKIAkJCXByX3JlZ19hdHAgPSBfX2NvcmVfc2NzaTNfZG9fYWxsb2NfcmVnaXN0cmF0aW9uKGRldiwKIAkJCQkJCW5hY2xfdG1wLCBkZXZlX3RtcCwgTlVMTCwKIAkJCQkJCXNhX3Jlc19rZXksIGFsbF90Z19wdCwgYXB0cGwpOwotCQkJaWYgKCEocHJfcmVnX2F0cCkpIHsKKwkJCWlmICghcHJfcmVnX2F0cCkgewogCQkJCWF0b21pY19kZWMoJnBvcnQtPnNlcF90Z19wdF9yZWZfY250KTsKIAkJCQlzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKTsKIAkJCQlhdG9taWNfZGVjKCZkZXZlX3RtcC0+cHJfcmVmX2NvdW50KTsKQEAgLTgwMyw3ICs4MDMsNyBAQAogfQogCiBpbnQgY29yZV9zY3NpM19hbGxvY19hcHRwbF9yZWdpc3RyYXRpb24oCi0Jc3RydWN0IHQxMF9yZXNlcnZhdGlvbl90ZW1wbGF0ZSAqcHJfdG1wbCwKKwlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uICpwcl90bXBsLAogCXU2NCBzYV9yZXNfa2V5LAogCXVuc2lnbmVkIGNoYXIgKmlfcG9ydCwKIAl1bnNpZ25lZCBjaGFyICppc2lkLApAQCAtODE3LDE1ICs4MTcsMTUgQEAKIHsKIAlzdHJ1Y3QgdDEwX3ByX3JlZ2lzdHJhdGlvbiAqcHJfcmVnOwogCi0JaWYgKCEoaV9wb3J0KSB8fCAhKHRfcG9ydCkgfHwgIShzYV9yZXNfa2V5KSkgewotCQlwcmludGsoS0VSTl9FUlIgIklsbGVnYWwgcGFyYW1ldGVycyBmb3IgQVBUUEwgcmVnaXN0cmF0aW9uXG4iKTsKLQkJcmV0dXJuIC0xOworCWlmICghaV9wb3J0IHx8ICF0X3BvcnQgfHwgIXNhX3Jlc19rZXkpIHsKKwkJcHJfZXJyKCJJbGxlZ2FsIHBhcmFtZXRlcnMgZm9yIEFQVFBMIHJlZ2lzdHJhdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXByX3JlZyA9IGttZW1fY2FjaGVfemFsbG9jKHQxMF9wcl9yZWdfY2FjaGUsIEdGUF9LRVJORUwpOwotCWlmICghKHByX3JlZykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb25cbiIpOwotCQlyZXR1cm4gLTE7CisJaWYgKCFwcl9yZWcpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb25cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcHJfcmVnLT5wcl9hcHRwbF9idWYgPSBremFsbG9jKHByX3RtcGwtPnByX2FwdHBsX2J1Zl9sZW4sIEdGUF9LRVJORUwpOwogCkBAIC04NjksNyArODY5LDcgQEAKIAlwcl9yZWctPnByX3Jlc19ob2xkZXIgPSByZXNfaG9sZGVyOwogCiAJbGlzdF9hZGRfdGFpbCgmcHJfcmVnLT5wcl9yZWdfYXB0cGxfbGlzdCwgJnByX3RtcGwtPmFwdHBsX3JlZ19saXN0KTsKLQlwcmludGsoS0VSTl9JTkZPICJTUEMtMyBQUiBBUFRQTCBTdWNjZXNzZnVsbHkgYWRkZWQgcmVnaXN0cmF0aW9uJXMgZnJvbSIKKwlwcl9kZWJ1ZygiU1BDLTMgUFIgQVBUUEwgU3VjY2Vzc2Z1bGx5IGFkZGVkIHJlZ2lzdHJhdGlvbiVzIGZyb20iCiAJCQkiIG1ldGFkYXRhXG4iLCAocmVzX2hvbGRlcikgPyAiK3Jlc2VydmF0aW9uIiA6ICIiKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg5MSwxMyArODkxLDEzIEBACiAJZGV2LT5kZXZfcHJfcmVzX2hvbGRlciA9IHByX3JlZzsKIAlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJTUEMtMyBQUiBbJXNdIFNlcnZpY2UgQWN0aW9uOiBBUFRQTCBSRVNFUlZFIGNyZWF0ZWQiCisJcHJfZGVidWcoIlNQQy0zIFBSIFslc10gU2VydmljZSBBY3Rpb246IEFQVFBMIFJFU0VSVkUgY3JlYXRlZCIKIAkJIiBuZXcgcmVzZXJ2YXRpb24gaG9sZGVyIFRZUEU6ICVzIEFMTF9UR19QVDogJWRcbiIsCi0JCVRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCXRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCiAJCWNvcmVfc2NzaTNfcHJfZHVtcF90eXBlKHByX3JlZy0+cHJfcmVzX3R5cGUpLAogCQkocHJfcmVnLT5wcl9yZWdfYWxsX3RnX3B0KSA/IDEgOiAwKTsKLQlwcmludGsoS0VSTl9JTkZPICJTUEMtMyBQUiBbJXNdIFJFU0VSVkUgTm9kZTogJXMlc1xuIiwKLQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwgbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUsCisJcHJfZGVidWcoIlNQQy0zIFBSIFslc10gUkVTRVJWRSBOb2RlOiAlcyVzXG4iLAorCQl0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLCBub2RlX2FjbC0+aW5pdGlhdG9ybmFtZSwKIAkJKHByZl9pc2lkKSA/ICZpX2J1ZlswXSA6ICIiKTsKIH0KIApAQCAtOTEzLDcgKzkxMyw3IEBACiAJc3RydWN0IHNlX2Rldl9lbnRyeSAqZGV2ZSkKIHsKIAlzdHJ1Y3QgdDEwX3ByX3JlZ2lzdHJhdGlvbiAqcHJfcmVnLCAqcHJfcmVnX3RtcDsKLQlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uX3RlbXBsYXRlICpwcl90bXBsID0gJlNVX0RFVihkZXYpLT50MTBfcmVzZXJ2YXRpb247CisJc3RydWN0IHQxMF9yZXNlcnZhdGlvbiAqcHJfdG1wbCA9ICZkZXYtPnNlX3N1Yl9kZXYtPnQxMF9wcjsKIAl1bnNpZ25lZCBjaGFyIGlfcG9ydFtQUl9BUFRQTF9NQVhfSVBPUlRfTEVOXTsKIAl1bnNpZ25lZCBjaGFyIHRfcG9ydFtQUl9BUFRQTF9NQVhfVFBPUlRfTEVOXTsKIAl1MTYgdHBndDsKQEAgLTkyNSw4ICs5MjUsOCBAQAogCSAqLwogCXNucHJpbnRmKGlfcG9ydCwgUFJfQVBUUExfTUFYX0lQT1JUX0xFTiwgIiVzIiwgbmFjbC0+aW5pdGlhdG9ybmFtZSk7CiAJc25wcmludGYodF9wb3J0LCBQUl9BUFRQTF9NQVhfVFBPUlRfTEVOLCAiJXMiLAotCQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3d3bih0cGcpKTsKLQl0cGd0ID0gVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpOworCQkJdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3d3bih0cGcpKTsKKwl0cGd0ID0gdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3RhZyh0cGcpOwogCS8qCiAJICogTG9vayBmb3IgdGhlIG1hdGNoaW5nIHJlZ2lzdHJhdGlvbnMrcmVzZXJ2YXRpb24gZnJvbSB0aG9zZQogCSAqIGNyZWF0ZWQgZnJvbSBBUFRQTCBtZXRhZGF0YS4gIE5vdGUgdGhhdCBtdWx0aXBsZSByZWdpc3RyYXRpb25zCkBAIC05MzYsNyArOTM2LDcgQEAKIAlzcGluX2xvY2soJnByX3RtcGwtPmFwdHBsX3JlZ19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHJfcmVnLCBwcl9yZWdfdG1wLCAmcHJfdG1wbC0+YXB0cGxfcmVnX2xpc3QsCiAJCQkJcHJfcmVnX2FwdHBsX2xpc3QpIHsKLQkJaWYgKCEoc3RyY21wKHByX3JlZy0+cHJfaXBvcnQsIGlfcG9ydCkpICYmCisJCWlmICghc3RyY21wKHByX3JlZy0+cHJfaXBvcnQsIGlfcG9ydCkgJiYKIAkJICAgICAocHJfcmVnLT5wcl9yZXNfbWFwcGVkX2x1biA9PSBkZXZlLT5tYXBwZWRfbHVuKSAmJgogCQkgICAgIShzdHJjbXAocHJfcmVnLT5wcl90cG9ydCwgdF9wb3J0KSkgJiYKIAkJICAgICAocHJfcmVnLT5wcl9yZWdfdHBndCA9PSB0cGd0KSAmJgpAQCAtOTgwLDExICs5ODAsMTEgQEAKIAlzdHJ1Y3Qgc2VfbHVuICpsdW4sCiAJc3RydWN0IHNlX2x1bl9hY2wgKmx1bl9hY2wpCiB7Ci0Jc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKnN1X2RldiA9IFNVX0RFVihkZXYpOworCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBkZXYtPnNlX3N1Yl9kZXY7CiAJc3RydWN0IHNlX25vZGVfYWNsICpuYWNsID0gbHVuX2FjbC0+c2VfbHVuX25hY2w7CiAJc3RydWN0IHNlX2Rldl9lbnRyeSAqZGV2ZSA9ICZuYWNsLT5kZXZpY2VfbGlzdFtsdW5fYWNsLT5tYXBwZWRfbHVuXTsKIAotCWlmIChUMTBfUkVTKHN1X2RldiktPnJlc190eXBlICE9IFNQQzNfUEVSU0lTVEVOVF9SRVNFUlZBVElPTlMpCisJaWYgKHN1X2Rldi0+dDEwX3ByLnJlc190eXBlICE9IFNQQzNfUEVSU0lTVEVOVF9SRVNFUlZBVElPTlMpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIF9fY29yZV9zY3NpM19jaGVja19hcHRwbF9yZWdpc3RyYXRpb24oZGV2LCB0cGcsIGx1biwKQEAgLTEwMDYsMTkgKzEwMDYsMTkgQEAKIAlwcmZfaXNpZCA9IGNvcmVfcHJfZHVtcF9pbml0aWF0b3JfcG9ydChwcl9yZWcsICZpX2J1ZlswXSwKIAkJCQlQUl9SRUdfSVNJRF9JRF9MRU4pOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiU1BDLTMgUFIgWyVzXSBTZXJ2aWNlIEFjdGlvbjogUkVHSVNURVIlcyBJbml0aWF0b3IiCisJcHJfZGVidWcoIlNQQy0zIFBSIFslc10gU2VydmljZSBBY3Rpb246IFJFR0lTVEVSJXMgSW5pdGlhdG9yIgogCQkiIE5vZGU6ICVzJXNcbiIsIHRmby0+Z2V0X2ZhYnJpY19uYW1lKCksIChyZWdpc3Rlcl90eXBlID09IDIpID8KIAkJIl9BTkRfTU9WRSIgOiAocmVnaXN0ZXJfdHlwZSA9PSAxKSA/CiAJCSJfQU5EX0lHTk9SRV9FWElTVElOR19LRVkiIDogIiIsIG5hY2wtPmluaXRpYXRvcm5hbWUsCiAJCShwcmZfaXNpZCkgPyBpX2J1ZiA6ICIiKTsKLQlwcmludGsoS0VSTl9JTkZPICJTUEMtMyBQUiBbJXNdIHJlZ2lzdHJhdGlvbiBvbiBUYXJnZXQgUG9ydDogJXMsMHglMDR4XG4iLAorCXByX2RlYnVnKCJTUEMtMyBQUiBbJXNdIHJlZ2lzdHJhdGlvbiBvbiBUYXJnZXQgUG9ydDogJXMsMHglMDR4XG4iLAogCQkgdGZvLT5nZXRfZmFicmljX25hbWUoKSwgdGZvLT50cGdfZ2V0X3d3bihzZV90cGcpLAogCQl0Zm8tPnRwZ19nZXRfdGFnKHNlX3RwZykpOwotCXByaW50ayhLRVJOX0lORk8gIlNQQy0zIFBSIFslc10gZm9yICVzIFRDTSBTdWJzeXN0ZW0gJXMgT2JqZWN0IFRhcmdldCIKKwlwcl9kZWJ1ZygiU1BDLTMgUFIgWyVzXSBmb3IgJXMgVENNIFN1YnN5c3RlbSAlcyBPYmplY3QgVGFyZ2V0IgogCQkiIFBvcnQocylcbiIsICB0Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkocHJfcmVnLT5wcl9yZWdfYWxsX3RnX3B0KSA/ICJBTEwiIDogIlNJTkdMRSIsCi0JCVRSQU5TUE9SVChkZXYpLT5uYW1lKTsKLQlwcmludGsoS0VSTl9JTkZPICJTUEMtMyBQUiBbJXNdIFNBIFJlcyBLZXk6IDB4JTAxNkx4IFBSZ2VuZXJhdGlvbjoiCisJCWRldi0+dHJhbnNwb3J0LT5uYW1lKTsKKwlwcl9kZWJ1ZygiU1BDLTMgUFIgWyVzXSBTQSBSZXMgS2V5OiAweCUwMTZMeCBQUmdlbmVyYXRpb246IgogCQkiIDB4JTA4eCAgQVBUUEw6ICVkXG4iLCB0Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQlwcl9yZWctPnByX3Jlc19rZXksIHByX3JlZy0+cHJfcmVzX2dlbmVyYXRpb24sCiAJCXByX3JlZy0+cHJfcmVnX2FwdHBsKTsKQEAgLTEwMzUsMTAgKzEwMzUsMTAgQEAKIAlpbnQgcmVnaXN0ZXJfdHlwZSwKIAlpbnQgcmVnaXN0ZXJfbW92ZSkKIHsKLQlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gU1VfREVWKGRldik7CisJc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKnN1X2RldiA9IGRldi0+c2Vfc3ViX2RldjsKIAlzdHJ1Y3QgdGFyZ2V0X2NvcmVfZmFicmljX29wcyAqdGZvID0gbmFjbC0+c2VfdHBnLT5zZV90cGdfdGZvOwogCXN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uICpwcl9yZWdfdG1wLCAqcHJfcmVnX3RtcF9zYWZlOwotCXN0cnVjdCB0MTBfcmVzZXJ2YXRpb25fdGVtcGxhdGUgKnByX3RtcGwgPSAmU1VfREVWKGRldiktPnQxMF9yZXNlcnZhdGlvbjsKKwlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uICpwcl90bXBsID0gJmRldi0+c2Vfc3ViX2Rldi0+dDEwX3ByOwogCiAJLyoKIAkgKiBJbmNyZW1lbnQgUFJnZW5lcmF0aW9uIGNvdW50ZXIgZm9yIHN0cnVjdCBzZV9kZXZpY2UgdXBvbiBhIHN1Y2Nlc3NmdWwKQEAgLTEwNTAsNyArMTA1MCw3IEBACiAJICogZm9yIHRoZSBSRUdJU1RFUi4KIAkgKi8KIAlwcl9yZWctPnByX3Jlc19nZW5lcmF0aW9uID0gKHJlZ2lzdGVyX21vdmUpID8KLQkJCVQxMF9SRVMoc3VfZGV2KS0+cHJfZ2VuZXJhdGlvbisrIDoKKwkJCXN1X2Rldi0+dDEwX3ByLnByX2dlbmVyYXRpb24rKyA6CiAJCQljb3JlX3Njc2kzX3ByX2dlbmVyYXRpb24oZGV2KTsKIAogCXNwaW5fbG9jaygmcHJfdG1wbC0+cmVnaXN0cmF0aW9uX2xvY2spOwpAQCAtMTA2Miw3ICsxMDYyLDcgQEAKIAkvKgogCSAqIFNraXAgZXh0cmEgcHJvY2Vzc2luZyBmb3IgQUxMX1RHX1BUPTAgb3IgUkVHSVNURVJfQU5EX01PVkUuCiAJICovCi0JaWYgKCEocHJfcmVnLT5wcl9yZWdfYWxsX3RnX3B0KSB8fCAocmVnaXN0ZXJfbW92ZSkpCisJaWYgKCFwcl9yZWctPnByX3JlZ19hbGxfdGdfcHQgfHwgcmVnaXN0ZXJfbW92ZSkKIAkJcmV0dXJuOwogCS8qCiAJICogV2FsayBwcl9yZWctPnByX3JlZ19hdHBfbGlzdCBhbmQgYWRkIHJlZ2lzdHJhdGlvbnMgZm9yIEFMTF9UR19QVD0xCkBAIC0xMTA2LDggKzExMDYsOCBAQAogCiAJcHJfcmVnID0gX19jb3JlX3Njc2kzX2FsbG9jX3JlZ2lzdHJhdGlvbihkZXYsIG5hY2wsIGRldmUsIGlzaWQsCiAJCQlzYV9yZXNfa2V5LCBhbGxfdGdfcHQsIGFwdHBsKTsKLQlpZiAoIShwcl9yZWcpKQotCQlyZXR1cm4gLTE7CisJaWYgKCFwcl9yZWcpCisJCXJldHVybiAtRVBFUk07CiAKIAlfX2NvcmVfc2NzaTNfYWRkX3JlZ2lzdHJhdGlvbihkZXYsIG5hY2wsIHByX3JlZywKIAkJCXJlZ2lzdGVyX3R5cGUsIHJlZ2lzdGVyX21vdmUpOwpAQCAtMTExOSw3ICsxMTE5LDcgQEAKIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKm5hY2wsCiAJdW5zaWduZWQgY2hhciAqaXNpZCkKIHsKLQlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uX3RlbXBsYXRlICpwcl90bXBsID0gJlNVX0RFVihkZXYpLT50MTBfcmVzZXJ2YXRpb247CisJc3RydWN0IHQxMF9yZXNlcnZhdGlvbiAqcHJfdG1wbCA9ICZkZXYtPnNlX3N1Yl9kZXYtPnQxMF9wcjsKIAlzdHJ1Y3QgdDEwX3ByX3JlZ2lzdHJhdGlvbiAqcHJfcmVnLCAqcHJfcmVnX3RtcDsKIAlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICp0cGc7CiAKQEAgLTExMzcsMTQgKzExMzcsMTQgQEAKIAkJICogSWYgdGhpcyByZWdpc3RyYXRpb24gZG9lcyBOT1QgY29udGFpbiBhIGZhYnJpYyBwcm92aWRlZAogCQkgKiBJU0lELCB0aGVuIHdlIGhhdmUgZm91bmQgYSBtYXRjaC4KIAkJICovCi0JCWlmICghKHByX3JlZy0+aXNpZF9wcmVzZW50X2F0X3JlZykpIHsKKwkJaWYgKCFwcl9yZWctPmlzaWRfcHJlc2VudF9hdF9yZWcpIHsKIAkJCS8qCiAJCQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBTQ1NJIGRldmljZSBzZXJ2ZXIgcmVxdWlyZXMgdGhhdAogCQkJICogU0NTSSBJbnRpYXRpb3IgVHJhbnNwb3J0SUQgdy8gSVNJRHMgaXMgZW5mb3JjZWQKIAkJCSAqIGZvciBmYWJyaWMgbW9kdWxlcyAoaVNDU0kpIHJlcXVpcmluZyB0aGVtLgogCQkJICovCi0JCQlpZiAoVFBHX1RGTyh0cGcpLT5zZXNzX2dldF9pbml0aWF0b3Jfc2lkICE9IE5VTEwpIHsKLQkJCQlpZiAoREVWX0FUVFJJQihkZXYpLT5lbmZvcmNlX3ByX2lzaWRzKQorCQkJaWYgKHRwZy0+c2VfdHBnX3Rmby0+c2Vzc19nZXRfaW5pdGlhdG9yX3NpZCAhPSBOVUxMKSB7CisJCQkJaWYgKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbmZvcmNlX3ByX2lzaWRzKQogCQkJCQljb250aW51ZTsKIAkJCX0KIAkJCWF0b21pY19pbmMoJnByX3JlZy0+cHJfcmVzX2hvbGRlcnMpOwpAQCAtMTE1Nyw3ICsxMTU3LDcgQEAKIAkJICogU0NTSSBJbml0aWF0b3IgUG9ydCBUcmFuc3BvcnRJRHMsIHRoZW4gd2UgZXhwZWN0IGEgdmFsaWQKIAkJICogbWF0Y2hpbmcgSVNJRCB0byBiZSBwcm92aWRlZCBieSB0aGUgbG9jYWwgU0NTSSBJbml0aWF0b3IgUG9ydC4KIAkJICovCi0JCWlmICghKGlzaWQpKQorCQlpZiAoIWlzaWQpCiAJCQljb250aW51ZTsKIAkJaWYgKHN0cmNtcChpc2lkLCBwcl9yZWctPnByX3JlZ19pc2lkKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTE4MCw5ICsxMTgwLDkgQEAKIAlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICp0cGcgPSBuYWNsLT5zZV90cGc7CiAJdW5zaWduZWQgY2hhciBidWZbUFJfUkVHX0lTSURfTEVOXSwgKmlzaWRfcHRyID0gTlVMTDsKIAotCWlmIChUUEdfVEZPKHRwZyktPnNlc3NfZ2V0X2luaXRpYXRvcl9zaWQgIT0gTlVMTCkgeworCWlmICh0cGctPnNlX3RwZ190Zm8tPnNlc3NfZ2V0X2luaXRpYXRvcl9zaWQgIT0gTlVMTCkgewogCQltZW1zZXQoJmJ1ZlswXSwgMCwgUFJfUkVHX0lTSURfTEVOKTsKLQkJVFBHX1RGTyh0cGcpLT5zZXNzX2dldF9pbml0aWF0b3Jfc2lkKHNlc3MsICZidWZbMF0sCisJCXRwZy0+c2VfdHBnX3Rmby0+c2Vzc19nZXRfaW5pdGlhdG9yX3NpZChzZXNzLCAmYnVmWzBdLAogCQkJCQlQUl9SRUdfSVNJRF9MRU4pOwogCQlpc2lkX3B0ciA9ICZidWZbMF07CiAJfQpAQCAtMTIwNiw3ICsxMjA2LDcgQEAKIAogCXNwaW5fbG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CiAJcHJfcmVzX2hvbGRlciA9IGRldi0+ZGV2X3ByX3Jlc19ob2xkZXI7Ci0JaWYgKCEocHJfcmVzX2hvbGRlcikpIHsKKwlpZiAoIXByX3Jlc19ob2xkZXIpIHsKIAkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTEyMzYsMTEgKzEyMzYsMTEgQEAKIAkJICAoIXN0cmNtcChwcl9yZXNfaG9sZGVyLT5wcl9yZWdfbmFjbC0+aW5pdGlhdG9ybmFtZSwKIAkJCSAgcHJfcmVnLT5wcl9yZWdfbmFjbC0+aW5pdGlhdG9ybmFtZSkpICYmCiAJCSAgKHByX3Jlc19ob2xkZXItPnByX3Jlc19rZXkgPT0gcHJfcmVnLT5wcl9yZXNfa2V5KSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNQQy0zIFBSOiBVbmFibGUgdG8gcGVyZm9ybSBBTExfVEdfUFQ9MSIKKwkJcHJfZXJyKCJTUEMtMyBQUjogVW5hYmxlIHRvIHBlcmZvcm0gQUxMX1RHX1BUPTEiCiAJCQkiIFVOUkVHSVNURVIgd2hpbGUgZXhpc3RpbmcgcmVzZXJ2YXRpb24gd2l0aCBtYXRjaGluZyIKIAkJCSIga2V5IDB4JTAxNkx4IGlzIHByZXNlbnQgZnJvbSBhbm90aGVyIFNDU0kgSW5pdGlhdG9yIgogCQkJIiBQb3J0XG4iLCBwcl9yZWctPnByX3Jlc19rZXkpOwotCQlyZXQgPSAtMTsKKwkJcmV0ID0gLUVQRVJNOwogCX0KIAlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CiAKQEAgLTEyNDgsNyArMTI0OCw3IEBACiB9CiAKIC8qCi0gKiBDYWxsZWQgd2l0aCBzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uX3RlbXBsYXRlLT5yZWdpc3RyYXRpb25fbG9jayBoZWxkLgorICogQ2FsbGVkIHdpdGggc3RydWN0IHQxMF9yZXNlcnZhdGlvbi0+cmVnaXN0cmF0aW9uX2xvY2sgaGVsZC4KICAqLwogc3RhdGljIHZvaWQgX19jb3JlX3Njc2kzX2ZyZWVfcmVnaXN0cmF0aW9uKAogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiwKQEAgLTEyNTgsNyArMTI1OCw3IEBACiB7CiAJc3RydWN0IHRhcmdldF9jb3JlX2ZhYnJpY19vcHMgKnRmbyA9CiAJCQlwcl9yZWctPnByX3JlZ19uYWNsLT5zZV90cGctPnNlX3RwZ190Zm87Ci0Jc3RydWN0IHQxMF9yZXNlcnZhdGlvbl90ZW1wbGF0ZSAqcHJfdG1wbCA9ICZTVV9ERVYoZGV2KS0+dDEwX3Jlc2VydmF0aW9uOworCXN0cnVjdCB0MTBfcmVzZXJ2YXRpb24gKnByX3RtcGwgPSAmZGV2LT5zZV9zdWJfZGV2LT50MTBfcHI7CiAJY2hhciBpX2J1ZltQUl9SRUdfSVNJRF9JRF9MRU5dOwogCWludCBwcmZfaXNpZDsKIApAQCAtMTI4MywyNSArMTI4MywyNSBAQAogCSAqLwogCXdoaWxlIChhdG9taWNfcmVhZCgmcHJfcmVnLT5wcl9yZXNfaG9sZGVycykgIT0gMCkgewogCQlzcGluX3VubG9jaygmcHJfdG1wbC0+cmVnaXN0cmF0aW9uX2xvY2spOwotCQlwcmludGsoIlNQQy0zIFBSIFslc10gd2FpdGluZyBmb3IgcHJfcmVzX2hvbGRlcnNcbiIsCisJCXByX2RlYnVnKCJTUEMtMyBQUiBbJXNdIHdhaXRpbmcgZm9yIHByX3Jlc19ob2xkZXJzXG4iLAogCQkJCXRmby0+Z2V0X2ZhYnJpY19uYW1lKCkpOwogCQljcHVfcmVsYXgoKTsKIAkJc3Bpbl9sb2NrKCZwcl90bXBsLT5yZWdpc3RyYXRpb25fbG9jayk7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiU1BDLTMgUFIgWyVzXSBTZXJ2aWNlIEFjdGlvbjogVU5SRUdJU1RFUiBJbml0aWF0b3IiCisJcHJfZGVidWcoIlNQQy0zIFBSIFslc10gU2VydmljZSBBY3Rpb246IFVOUkVHSVNURVIgSW5pdGlhdG9yIgogCQkiIE5vZGU6ICVzJXNcbiIsIHRmby0+Z2V0X2ZhYnJpY19uYW1lKCksCiAJCXByX3JlZy0+cHJfcmVnX25hY2wtPmluaXRpYXRvcm5hbWUsCiAJCShwcmZfaXNpZCkgPyAmaV9idWZbMF0gOiAiIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiU1BDLTMgUFIgWyVzXSBmb3IgJXMgVENNIFN1YnN5c3RlbSAlcyBPYmplY3QgVGFyZ2V0IgorCXByX2RlYnVnKCJTUEMtMyBQUiBbJXNdIGZvciAlcyBUQ00gU3Vic3lzdGVtICVzIE9iamVjdCBUYXJnZXQiCiAJCSIgUG9ydChzKVxuIiwgdGZvLT5nZXRfZmFicmljX25hbWUoKSwKIAkJKHByX3JlZy0+cHJfcmVnX2FsbF90Z19wdCkgPyAiQUxMIiA6ICJTSU5HTEUiLAotCQlUUkFOU1BPUlQoZGV2KS0+bmFtZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiU1BDLTMgUFIgWyVzXSBTQSBSZXMgS2V5OiAweCUwMTZMeCBQUmdlbmVyYXRpb246IgorCQlkZXYtPnRyYW5zcG9ydC0+bmFtZSk7CisJcHJfZGVidWcoIlNQQy0zIFBSIFslc10gU0EgUmVzIEtleTogMHglMDE2THggUFJnZW5lcmF0aW9uOiIKIAkJIiAweCUwOHhcbiIsIHRmby0+Z2V0X2ZhYnJpY19uYW1lKCksIHByX3JlZy0+cHJfcmVzX2tleSwKIAkJcHJfcmVnLT5wcl9yZXNfZ2VuZXJhdGlvbik7CiAKLQlpZiAoIShwcmVlbXB0X2FuZF9hYm9ydF9saXN0KSkgeworCWlmICghcHJlZW1wdF9hbmRfYWJvcnRfbGlzdCkgewogCQlwcl9yZWctPnByX3JlZ19kZXZlID0gTlVMTDsKIAkJcHJfcmVnLT5wcl9yZWdfbmFjbCA9IE5VTEw7CiAJCWtmcmVlKHByX3JlZy0+cHJfYXB0cGxfYnVmKTsKQEAgLTEzMTksNyArMTMxOSw3IEBACiAJc3RydWN0IHNlX2RldmljZSAqZGV2LAogCXN0cnVjdCBzZV9ub2RlX2FjbCAqbmFjbCkKIHsKLQlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uX3RlbXBsYXRlICpwcl90bXBsID0gJlNVX0RFVihkZXYpLT50MTBfcmVzZXJ2YXRpb247CisJc3RydWN0IHQxMF9yZXNlcnZhdGlvbiAqcHJfdG1wbCA9ICZkZXYtPnNlX3N1Yl9kZXYtPnQxMF9wcjsKIAlzdHJ1Y3QgdDEwX3ByX3JlZ2lzdHJhdGlvbiAqcHJfcmVnLCAqcHJfcmVnX3RtcCwgKnByX3Jlc19ob2xkZXI7CiAJLyoKIAkgKiBJZiB0aGUgcGFzc2VkIHNlX25vZGVfYWNsIG1hdGNoZXMgdGhlIHJlc2VydmF0aW9uIGhvbGRlciwKQEAgLTEzNDksNyArMTM0OSw3IEBACiB2b2lkIGNvcmVfc2NzaTNfZnJlZV9hbGxfcmVnaXN0cmF0aW9ucygKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHQxMF9yZXNlcnZhdGlvbl90ZW1wbGF0ZSAqcHJfdG1wbCA9ICZTVV9ERVYoZGV2KS0+dDEwX3Jlc2VydmF0aW9uOworCXN0cnVjdCB0MTBfcmVzZXJ2YXRpb24gKnByX3RtcGwgPSAmZGV2LT5zZV9zdWJfZGV2LT50MTBfcHI7CiAJc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24gKnByX3JlZywgKnByX3JlZ190bXAsICpwcl9yZXNfaG9sZGVyOwogCiAJc3Bpbl9sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKQEAgLTEzODEsMTMgKzEzODEsMTMgQEAKIAogc3RhdGljIGludCBjb3JlX3Njc2kzX3RwZ19kZXBlbmRfaXRlbShzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICp0cGcpCiB7Ci0JcmV0dXJuIGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKFRQR19URk8odHBnKS0+dGZfc3Vic3lzLAorCXJldHVybiBjb25maWdmc19kZXBlbmRfaXRlbSh0cGctPnNlX3RwZ190Zm8tPnRmX3N1YnN5cywKIAkJCSZ0cGctPnRwZ19ncm91cC5jZ19pdGVtKTsKIH0KIAogc3RhdGljIHZvaWQgY29yZV9zY3NpM190cGdfdW5kZXBlbmRfaXRlbShzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICp0cGcpCiB7Ci0JY29uZmlnZnNfdW5kZXBlbmRfaXRlbShUUEdfVEZPKHRwZyktPnRmX3N1YnN5cywKKwljb25maWdmc191bmRlcGVuZF9pdGVtKHRwZy0+c2VfdHBnX3Rmby0+dGZfc3Vic3lzLAogCQkJJnRwZy0+dHBnX2dyb3VwLmNnX2l0ZW0pOwogCiAJYXRvbWljX2RlYygmdHBnLT50cGdfcHJfcmVmX2NvdW50KTsKQEAgLTE0MDEsNyArMTQwMSw3IEBACiAJaWYgKG5hY2wtPmR5bmFtaWNfbm9kZV9hY2wpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKFRQR19URk8odHBnKS0+dGZfc3Vic3lzLAorCXJldHVybiBjb25maWdmc19kZXBlbmRfaXRlbSh0cGctPnNlX3RwZ190Zm8tPnRmX3N1YnN5cywKIAkJCSZuYWNsLT5hY2xfZ3JvdXAuY2dfaXRlbSk7CiB9CiAKQEAgLTE0MTUsNyArMTQxNSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQljb25maWdmc191bmRlcGVuZF9pdGVtKFRQR19URk8odHBnKS0+dGZfc3Vic3lzLAorCWNvbmZpZ2ZzX3VuZGVwZW5kX2l0ZW0odHBnLT5zZV90cGdfdGZvLT50Zl9zdWJzeXMsCiAJCQkmbmFjbC0+YWNsX2dyb3VwLmNnX2l0ZW0pOwogCiAJYXRvbWljX2RlYygmbmFjbC0+YWNsX3ByX3JlZl9jb3VudCk7CkBAIC0xNDMwLDEzICsxNDMwLDEzIEBACiAJLyoKIAkgKiBGb3IgbmFjbC0+ZHluYW1pY19ub2RlX2FjbD0xCiAJICovCi0JaWYgKCEobHVuX2FjbCkpCisJaWYgKCFsdW5fYWNsKQogCQlyZXR1cm4gMDsKIAogCW5hY2wgPSBsdW5fYWNsLT5zZV9sdW5fbmFjbDsKIAl0cGcgPSBuYWNsLT5zZV90cGc7CiAKLQlyZXR1cm4gY29uZmlnZnNfZGVwZW5kX2l0ZW0oVFBHX1RGTyh0cGcpLT50Zl9zdWJzeXMsCisJcmV0dXJuIGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKHRwZy0+c2VfdHBnX3Rmby0+dGZfc3Vic3lzLAogCQkJJmx1bl9hY2wtPnNlX2x1bl9ncm91cC5jZ19pdGVtKTsKIH0KIApAQCAtMTQ0OCw3ICsxNDQ4LDcgQEAKIAkvKgogCSAqIEZvciBuYWNsLT5keW5hbWljX25vZGVfYWNsPTEKIAkgKi8KLQlpZiAoIShsdW5fYWNsKSkgeworCWlmICghbHVuX2FjbCkgewogCQlhdG9taWNfZGVjKCZzZV9kZXZlLT5wcl9yZWZfY291bnQpOwogCQlzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKTsKIAkJcmV0dXJuOwpAQCAtMTQ1Niw3ICsxNDU2LDcgQEAKIAluYWNsID0gbHVuX2FjbC0+c2VfbHVuX25hY2w7CiAJdHBnID0gbmFjbC0+c2VfdHBnOwogCi0JY29uZmlnZnNfdW5kZXBlbmRfaXRlbShUUEdfVEZPKHRwZyktPnRmX3N1YnN5cywKKwljb25maWdmc191bmRlcGVuZF9pdGVtKHRwZy0+c2VfdHBnX3Rmby0+dGZfc3Vic3lzLAogCQkJJmx1bl9hY2wtPnNlX2x1bl9ncm91cC5jZ19pdGVtKTsKIAogCWF0b21pY19kZWMoJnNlX2RldmUtPnByX3JlZl9jb3VudCk7CkBAIC0xNDcxLDEwICsxNDcxLDEwIEBACiAJaW50IGFsbF90Z19wdCwKIAlpbnQgYXB0cGwpCiB7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfREVWKGNtZCk7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAJc3RydWN0IHNlX3BvcnQgKnRtcF9wb3J0OwogCXN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKmRlc3RfdHBnID0gTlVMTCwgKnRtcF90cGc7Ci0Jc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MgPSBTRV9TRVNTKGNtZCk7CisJc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MgPSBjbWQtPnNlX3Nlc3M7CiAJc3RydWN0IHNlX25vZGVfYWNsICpkZXN0X25vZGVfYWNsID0gTlVMTDsKIAlzdHJ1Y3Qgc2VfZGV2X2VudHJ5ICpkZXN0X3NlX2RldmUgPSBOVUxMLCAqbG9jYWxfc2VfZGV2ZTsKIAlzdHJ1Y3QgdDEwX3ByX3JlZ2lzdHJhdGlvbiAqZGVzdF9wcl9yZWcsICpsb2NhbF9wcl9yZWcsICpwcl9yZWdfZTsKQEAgLTE0ODIsNyArMTQ4Miw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCB0aWRfZGVzdF9saXN0OwogCXN0cnVjdCBwcl90cmFuc3BvcnRfaWRfaG9sZGVyICp0aWRoX25ldywgKnRpZGgsICp0aWRoX3RtcDsKIAlzdHJ1Y3QgdGFyZ2V0X2NvcmVfZmFicmljX29wcyAqdG1wX3RmX29wczsKLQl1bnNpZ25lZCBjaGFyICpidWYgPSAodW5zaWduZWQgY2hhciAqKVRfVEFTSyhjbWQpLT50X3Rhc2tfYnVmOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBjaGFyICpwdHIsICppX3N0ciA9IE5VTEwsIHByb3RvX2lkZW50LCB0bXBfcHJvdG9faWRlbnQ7CiAJY2hhciAqaXBvcnRfcHRyID0gTlVMTCwgZGVzdF9pcG9ydFs2NF0sIGlfYnVmW1BSX1JFR19JU0lEX0lEX0xFTl07CiAJdTMyIHRwZGwsIHRpZF9sZW4gPSAwOwpAQCAtMTUwMCw4ICsxNTAwLDggQEAKIAkgKiBwcm9jZXNzaW5nIGluIHRoZSBsb29wIG9mIHRpZF9kZXN0X2xpc3QgYmVsb3cuCiAJICovCiAJdGlkaF9uZXcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHJfdHJhbnNwb3J0X2lkX2hvbGRlciksIEdGUF9LRVJORUwpOwotCWlmICghKHRpZGhfbmV3KSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSB0aWRoX25ld1xuIik7CisJaWYgKCF0aWRoX25ldykgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSB0aWRoX25ld1xuIik7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKIAl9CiAJSU5JVF9MSVNUX0hFQUQoJnRpZGhfbmV3LT5kZXN0X2xpc3QpOwpAQCAtMTUwOSwxMCArMTUwOSwxMCBAQAogCXRpZGhfbmV3LT5kZXN0X25vZGVfYWNsID0gc2Vfc2Vzcy0+c2Vfbm9kZV9hY2w7CiAJdGlkaF9uZXctPmRlc3Rfc2VfZGV2ZSA9IGxvY2FsX3NlX2RldmU7CiAKLQlsb2NhbF9wcl9yZWcgPSBfX2NvcmVfc2NzaTNfYWxsb2NfcmVnaXN0cmF0aW9uKFNFX0RFVihjbWQpLAorCWxvY2FsX3ByX3JlZyA9IF9fY29yZV9zY3NpM19hbGxvY19yZWdpc3RyYXRpb24oY21kLT5zZV9kZXYsCiAJCQkJc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wsIGxvY2FsX3NlX2RldmUsIGxfaXNpZCwKIAkJCQlzYV9yZXNfa2V5LCBhbGxfdGdfcHQsIGFwdHBsKTsKLQlpZiAoIShsb2NhbF9wcl9yZWcpKSB7CisJaWYgKCFsb2NhbF9wcl9yZWcpIHsKIAkJa2ZyZWUodGlkaF9uZXcpOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CiAJfQpAQCAtMTUyNCw2ICsxNTI0LDggQEAKIAkgKi8KIAl0aWRoX25ldy0+ZGVzdF9sb2NhbF9uZXh1cyA9IDE7CiAJbGlzdF9hZGRfdGFpbCgmdGlkaF9uZXctPmRlc3RfbGlzdCwgJnRpZF9kZXN0X2xpc3QpOworCisJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CiAJLyoKIAkgKiBGb3IgYSBQRVJTSVNURU5UIFJFU0VSVkUgT1VUIHNwZWNpZnkgaW5pdGlhdG9yIHBvcnRzIHBheWxvYWQsCiAJICogZmlyc3QgZXh0cmFjdCBUcmFuc3BvcnRJRCBQYXJhbWV0ZXIgRGF0YSBMZW5ndGgsIGFuZCBtYWtlIHN1cmUKQEAgLTE1MzUsNyArMTUzNyw3IEBACiAJdHBkbCB8PSBidWZbMjddICYgMHhmZjsKIAogCWlmICgodHBkbCArIDI4KSAhPSBjbWQtPmRhdGFfbGVuZ3RoKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1BDLTMgUFI6IElsbGVnYWwgdHBkbDogJXUgKyAyOCBieXRlIGhlYWRlciIKKwkJcHJfZXJyKCJTUEMtMyBQUjogSWxsZWdhbCB0cGRsOiAldSArIDI4IGJ5dGUgaGVhZGVyIgogCQkJIiBkb2VzIG5vdCBlcXVhbCBDREIgZGF0YV9sZW5ndGg6ICV1XG4iLCB0cGRsLAogCQkJY21kLT5kYXRhX2xlbmd0aCk7CiAJCXJldCA9IFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKQEAgLTE1NTUsMTMgKzE1NTcsMTMgQEAKIAkJc3Bpbl9sb2NrKCZkZXYtPnNlX3BvcnRfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX3BvcnQsICZkZXYtPmRldl9zZXBfbGlzdCwgc2VwX2xpc3QpIHsKIAkJCXRtcF90cGcgPSB0bXBfcG9ydC0+c2VwX3RwZzsKLQkJCWlmICghKHRtcF90cGcpKQorCQkJaWYgKCF0bXBfdHBnKQogCQkJCWNvbnRpbnVlOwotCQkJdG1wX3RmX29wcyA9IFRQR19URk8odG1wX3RwZyk7Ci0JCQlpZiAoISh0bXBfdGZfb3BzKSkKKwkJCXRtcF90Zl9vcHMgPSB0bXBfdHBnLT5zZV90cGdfdGZvOworCQkJaWYgKCF0bXBfdGZfb3BzKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKCEodG1wX3RmX29wcy0+Z2V0X2ZhYnJpY19wcm90b19pZGVudCkgfHwKLQkJCSAgICAhKHRtcF90Zl9vcHMtPnRwZ19wYXJzZV9wcl9vdXRfdHJhbnNwb3J0X2lkKSkKKwkJCWlmICghdG1wX3RmX29wcy0+Z2V0X2ZhYnJpY19wcm90b19pZGVudCB8fAorCQkJICAgICF0bXBfdGZfb3BzLT50cGdfcGFyc2VfcHJfb3V0X3RyYW5zcG9ydF9pZCkKIAkJCQljb250aW51ZTsKIAkJCS8qCiAJCQkgKiBMb29rIGZvciB0aGUgbWF0Y2hpbmcgcHJvdG9faWRlbnQgcHJvdmlkZWQgYnkKQEAgLTE1NzUsNyArMTU3Nyw3IEBACiAJCQlpX3N0ciA9IHRtcF90Zl9vcHMtPnRwZ19wYXJzZV9wcl9vdXRfdHJhbnNwb3J0X2lkKAogCQkJCQl0bXBfdHBnLCAoY29uc3QgY2hhciAqKXB0ciwgJnRpZF9sZW4sCiAJCQkJCSZpcG9ydF9wdHIpOwotCQkJaWYgKCEoaV9zdHIpKQorCQkJaWYgKCFpX3N0cikKIAkJCQljb250aW51ZTsKIAogCQkJYXRvbWljX2luYygmdG1wX3RwZy0+dHBnX3ByX3JlZl9jb3VudCk7CkBAIC0xNTg0LDcgKzE1ODYsNyBAQAogCiAJCQlyZXQgPSBjb3JlX3Njc2kzX3RwZ19kZXBlbmRfaXRlbSh0bXBfdHBnKTsKIAkJCWlmIChyZXQgIT0gMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiIGNvcmVfc2NzaTNfdHBnX2RlcGVuZF9pdGVtKCkiCisJCQkJcHJfZXJyKCIgY29yZV9zY3NpM190cGdfZGVwZW5kX2l0ZW0oKSIKIAkJCQkJIiBmb3IgdG1wX3RwZ1xuIik7CiAJCQkJYXRvbWljX2RlYygmdG1wX3RwZy0+dHBnX3ByX3JlZl9jb3VudCk7CiAJCQkJc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCk7CkBAIC0xNjA1LDcgKzE2MDcsNyBAQAogCQkJfQogCQkJc3Bpbl91bmxvY2tfYmgoJnRtcF90cGctPmFjbF9ub2RlX2xvY2spOwogCi0JCQlpZiAoIShkZXN0X25vZGVfYWNsKSkgeworCQkJaWYgKCFkZXN0X25vZGVfYWNsKSB7CiAJCQkJY29yZV9zY3NpM190cGdfdW5kZXBlbmRfaXRlbSh0bXBfdHBnKTsKIAkJCQlzcGluX2xvY2soJmRldi0+c2VfcG9ydF9sb2NrKTsKIAkJCQljb250aW51ZTsKQEAgLTE2MTMsNyArMTYxNSw3IEBACiAKIAkJCXJldCA9IGNvcmVfc2NzaTNfbm9kZWFjbF9kZXBlbmRfaXRlbShkZXN0X25vZGVfYWNsKTsKIAkJCWlmIChyZXQgIT0gMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiY29uZmlnZnNfZGVwZW5kX2l0ZW0oKSBmYWlsZWQiCisJCQkJcHJfZXJyKCJjb25maWdmc19kZXBlbmRfaXRlbSgpIGZhaWxlZCIKIAkJCQkJIiBmb3IgZGVzdF9ub2RlX2FjbC0+YWNsX2dyb3VwXG4iKTsKIAkJCQlhdG9taWNfZGVjKCZkZXN0X25vZGVfYWNsLT5hY2xfcHJfcmVmX2NvdW50KTsKIAkJCQlzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKTsKQEAgLTE2MjMsOSArMTYyNSw5IEBACiAJCQl9CiAKIAkJCWRlc3RfdHBnID0gdG1wX3RwZzsKLQkJCXByaW50ayhLRVJOX0lORk8gIlNQQy0zIFBSIFNQRUNfSV9QVDogTG9jYXRlZCAlcyBOb2RlOiIKKwkJCXByX2RlYnVnKCJTUEMtMyBQUiBTUEVDX0lfUFQ6IExvY2F0ZWQgJXMgTm9kZToiCiAJCQkJIiAlcyBQb3J0IFJUUEk6ICVodVxuIiwKLQkJCQlUUEdfVEZPKGRlc3RfdHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCQkJZGVzdF90cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJCWRlc3Rfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUsIGRlc3RfcnRwaSk7CiAKIAkJCXNwaW5fbG9jaygmZGV2LT5zZV9wb3J0X2xvY2spOwpAQCAtMTYzMywyMCArMTYzNSwyMCBAQAogCQl9CiAJCXNwaW5fdW5sb2NrKCZkZXYtPnNlX3BvcnRfbG9jayk7CiAKLQkJaWYgKCEoZGVzdF90cGcpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlNQQy0zIFBSIFNQRUNfSV9QVDogVW5hYmxlIHRvIGxvY2F0ZSIKKwkJaWYgKCFkZXN0X3RwZykgeworCQkJcHJfZXJyKCJTUEMtMyBQUiBTUEVDX0lfUFQ6IFVuYWJsZSB0byBsb2NhdGUiCiAJCQkJCSIgZGVzdF90cGdcbiIpOwogCQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOwogCQkJZ290byBvdXQ7CiAJCX0KICNpZiAwCi0JCXByaW50aygiU1BDLTMgUFIgU1BFQ19JX1BUOiBHb3QgJXMgZGF0YV9sZW5ndGg6ICV1IHRwZGw6ICV1IgorCQlwcl9kZWJ1ZygiU1BDLTMgUFIgU1BFQ19JX1BUOiBHb3QgJXMgZGF0YV9sZW5ndGg6ICV1IHRwZGw6ICV1IgogCQkJIiB0aWRfbGVuOiAlZCBmb3IgJXMgKyAlc1xuIiwKLQkJCVRQR19URk8oZGVzdF90cGcpLT5nZXRfZmFicmljX25hbWUoKSwgY21kLT5kYXRhX2xlbmd0aCwKKwkJCWRlc3RfdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgY21kLT5kYXRhX2xlbmd0aCwKIAkJCXRwZGwsIHRpZF9sZW4sIGlfc3RyLCBpcG9ydF9wdHIpOwogI2VuZGlmCiAJCWlmICh0aWRfbGVuID4gdHBkbCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUiBTUEVDX0lfUFQ6IElsbGVnYWwgdGlkX2xlbjoiCisJCQlwcl9lcnIoIlNQQy0zIFBSIFNQRUNfSV9QVDogSWxsZWdhbCB0aWRfbGVuOiIKIAkJCQkiICV1IGZvciBUcmFuc3BvcnQgSUQ6ICVzXG4iLCB0aWRfbGVuLCBwdHIpOwogCQkJY29yZV9zY3NpM19ub2RlYWNsX3VuZGVwZW5kX2l0ZW0oZGVzdF9ub2RlX2FjbCk7CiAJCQljb3JlX3Njc2kzX3RwZ191bmRlcGVuZF9pdGVtKGRlc3RfdHBnKTsKQEAgLTE2NjAsMTAgKzE2NjIsMTAgQEAKIAkJICovCiAJCWRlc3Rfc2VfZGV2ZSA9IGNvcmVfZ2V0X3NlX2RldmVfZnJvbV9ydHBpKGRlc3Rfbm9kZV9hY2wsCiAJCQkJCWRlc3RfcnRwaSk7Ci0JCWlmICghKGRlc3Rfc2VfZGV2ZSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvY2F0ZSAlcyBkZXN0X3NlX2RldmUiCisJCWlmICghZGVzdF9zZV9kZXZlKSB7CisJCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgJXMgZGVzdF9zZV9kZXZlIgogCQkJCSIgZnJvbSBkZXN0aW5hdGlvbiBSVFBJOiAlaHVcbiIsCi0JCQkJVFBHX1RGTyhkZXN0X3RwZyktPmdldF9mYWJyaWNfbmFtZSgpLAorCQkJCWRlc3RfdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwKIAkJCQlkZXN0X3J0cGkpOwogCiAJCQljb3JlX3Njc2kzX25vZGVhY2xfdW5kZXBlbmRfaXRlbShkZXN0X25vZGVfYWNsKTsKQEAgLTE2NzQsNyArMTY3Niw3IEBACiAKIAkJcmV0ID0gY29yZV9zY3NpM19sdW5hY2xfZGVwZW5kX2l0ZW0oZGVzdF9zZV9kZXZlKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiY29yZV9zY3NpM19sdW5hY2xfZGVwZW5kX2l0ZW0oKSIKKwkJCXByX2VycigiY29yZV9zY3NpM19sdW5hY2xfZGVwZW5kX2l0ZW0oKSIKIAkJCQkJIiBmYWlsZWRcbiIpOwogCQkJYXRvbWljX2RlYygmZGVzdF9zZV9kZXZlLT5wcl9yZWZfY291bnQpOwogCQkJc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCk7CkBAIC0xNjg0LDkgKzE2ODYsOSBAQAogCQkJZ290byBvdXQ7CiAJCX0KICNpZiAwCi0JCXByaW50ayhLRVJOX0lORk8gIlNQQy0zIFBSIFNQRUNfSV9QVDogTG9jYXRlZCAlcyBOb2RlOiAlcyIKKwkJcHJfZGVidWcoIlNQQy0zIFBSIFNQRUNfSV9QVDogTG9jYXRlZCAlcyBOb2RlOiAlcyIKIAkJCSIgZGVzdF9zZV9kZXZlIG1hcHBlZF9sdW46ICV1XG4iLAotCQkJVFBHX1RGTyhkZXN0X3RwZyktPmdldF9mYWJyaWNfbmFtZSgpLAorCQkJZGVzdF90cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJZGVzdF9ub2RlX2FjbC0+aW5pdGlhdG9ybmFtZSwgZGVzdF9zZV9kZXZlLT5tYXBwZWRfbHVuKTsKICNlbmRpZgogCQkvKgpAQCAtMTcxMiw4ICsxNzE0LDggQEAKIAkJICovCiAJCXRpZGhfbmV3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHByX3RyYW5zcG9ydF9pZF9ob2xkZXIpLAogCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoISh0aWRoX25ldykpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHRpZGhfbmV3XG4iKTsKKwkJaWYgKCF0aWRoX25ldykgeworCQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgdGlkaF9uZXdcbiIpOwogCQkJY29yZV9zY3NpM19sdW5hY2xfdW5kZXBlbmRfaXRlbShkZXN0X3NlX2RldmUpOwogCQkJY29yZV9zY3NpM19ub2RlYWNsX3VuZGVwZW5kX2l0ZW0oZGVzdF9ub2RlX2FjbCk7CiAJCQljb3JlX3Njc2kzX3RwZ191bmRlcGVuZF9pdGVtKGRlc3RfdHBnKTsKQEAgLTE3NDEsMTAgKzE3NDMsMTAgQEAKIAkJICogYW5kIHRoZW4gY2FsbCBfX2NvcmVfc2NzaTNfYWRkX3JlZ2lzdHJhdGlvbigpIGluIHRoZQogCQkgKiAybmQgbG9vcCB3aGljaCB3aWxsIG5ldmVyIGZhaWwuCiAJCSAqLwotCQlkZXN0X3ByX3JlZyA9IF9fY29yZV9zY3NpM19hbGxvY19yZWdpc3RyYXRpb24oU0VfREVWKGNtZCksCisJCWRlc3RfcHJfcmVnID0gX19jb3JlX3Njc2kzX2FsbG9jX3JlZ2lzdHJhdGlvbihjbWQtPnNlX2RldiwKIAkJCQlkZXN0X25vZGVfYWNsLCBkZXN0X3NlX2RldmUsIGlwb3J0X3B0ciwKIAkJCQlzYV9yZXNfa2V5LCBhbGxfdGdfcHQsIGFwdHBsKTsKLQkJaWYgKCEoZGVzdF9wcl9yZWcpKSB7CisJCWlmICghZGVzdF9wcl9yZWcpIHsKIAkJCWNvcmVfc2NzaTNfbHVuYWNsX3VuZGVwZW5kX2l0ZW0oZGVzdF9zZV9kZXZlKTsKIAkJCWNvcmVfc2NzaTNfbm9kZWFjbF91bmRlcGVuZF9pdGVtKGRlc3Rfbm9kZV9hY2wpOwogCQkJY29yZV9zY3NpM190cGdfdW5kZXBlbmRfaXRlbShkZXN0X3RwZyk7CkBAIC0xNzYwLDYgKzE3NjIsOSBAQAogCQl0aWRfbGVuID0gMDsKIAogCX0KKworCXRyYW5zcG9ydF9rdW5tYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisKIAkvKgogCSAqIEdvIGFoZWFkIGFuZCBjcmVhdGUgYSByZWdpc3RyYXRpb25zIGZyb20gdGlkX2Rlc3RfbGlzdCBmb3IgdGhlCiAJICogU1BFQ19JX1BUIHByb3ZpZGVkIFRyYW5zcG9ydElEIGZvciB0aGUgKnRpZGggcmVmZXJlbmNlZCBkZXN0X25vZGVfYWNsCkBAIC0xNzg3LDEyICsxNzkyLDEyIEBACiAJCXByZl9pc2lkID0gY29yZV9wcl9kdW1wX2luaXRpYXRvcl9wb3J0KGRlc3RfcHJfcmVnLCAmaV9idWZbMF0sCiAJCQkJCQlQUl9SRUdfSVNJRF9JRF9MRU4pOwogCi0JCV9fY29yZV9zY3NpM19hZGRfcmVnaXN0cmF0aW9uKFNFX0RFVihjbWQpLCBkZXN0X25vZGVfYWNsLAorCQlfX2NvcmVfc2NzaTNfYWRkX3JlZ2lzdHJhdGlvbihjbWQtPnNlX2RldiwgZGVzdF9ub2RlX2FjbCwKIAkJCQkJZGVzdF9wcl9yZWcsIDAsIDApOwogCi0JCXByaW50ayhLRVJOX0lORk8gIlNQQy0zIFBSIFslc10gU1BFQ19JX1BUOiBTdWNjZXNzZnVsbHkiCisJCXByX2RlYnVnKCJTUEMtMyBQUiBbJXNdIFNQRUNfSV9QVDogU3VjY2Vzc2Z1bGx5IgogCQkJIiByZWdpc3RlcmVkIFRyYW5zcG9ydCBJRCBmb3IgTm9kZTogJXMlcyBNYXBwZWQgTFVOOiIKLQkJCSIgJXVcbiIsIFRQR19URk8oZGVzdF90cGcpLT5nZXRfZmFicmljX25hbWUoKSwKKwkJCSIgJXVcbiIsIGRlc3RfdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwKIAkJCWRlc3Rfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUsIChwcmZfaXNpZCkgPwogCQkJJmlfYnVmWzBdIDogIiIsIGRlc3Rfc2VfZGV2ZS0+bWFwcGVkX2x1bik7CiAKQEAgLTE4MDYsNiArMTgxMSw3IEBACiAKIAlyZXR1cm4gMDsKIG91dDoKKwl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwogCS8qCiAJICogRm9yIHRoZSBmYWlsdXJlIGNhc2UsIHJlbGVhc2UgZXZlcnl0aGluZyBmcm9tIHRpZF9kZXN0X2xpc3QKIAkgKiBpbmNsdWRpbmcgKmRlc3RfcHJfcmVnIGFuZCB0aGUgY29uZmlnZnMgZGVwZW5kYW5jZXMuLgpAQCAtMTg1NSw3ICsxODYxLDcgQEAKIHsKIAlzdHJ1Y3Qgc2VfbHVuICpsdW47CiAJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqdHBnOwotCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBTVV9ERVYoZGV2KTsKKwlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gZGV2LT5zZV9zdWJfZGV2OwogCXN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uICpwcl9yZWc7CiAJdW5zaWduZWQgY2hhciB0bXBbNTEyXSwgaXNpZF9idWZbMzJdOwogCXNzaXplX3QgbGVuID0gMDsKQEAgLTE4NzMsOCArMTg3OSw4IEBACiAJLyoKIAkgKiBXYWxrIHRoZSByZWdpc3RyYXRpb24gbGlzdC4uCiAJICovCi0Jc3Bpbl9sb2NrKCZUMTBfUkVTKHN1X2RldiktPnJlZ2lzdHJhdGlvbl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByX3JlZywgJlQxMF9SRVMoc3VfZGV2KS0+cmVnaXN0cmF0aW9uX2xpc3QsCisJc3Bpbl9sb2NrKCZzdV9kZXYtPnQxMF9wci5yZWdpc3RyYXRpb25fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwcl9yZWcsICZzdV9kZXYtPnQxMF9wci5yZWdpc3RyYXRpb25fbGlzdCwKIAkJCXByX3JlZ19saXN0KSB7CiAKIAkJdG1wWzBdID0gJ1wwJzsKQEAgLTE5MDAsNyArMTkwNiw3IEBACiAJCQkJInJlc19ob2xkZXI9MVxucmVzX3R5cGU9JTAyeFxuIgogCQkJCSJyZXNfc2NvcGU9JTAyeFxucmVzX2FsbF90Z19wdD0lZFxuIgogCQkJCSJtYXBwZWRfbHVuPSV1XG4iLCByZWdfY291bnQsCi0JCQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKKwkJCQl0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJCXByX3JlZy0+cHJfcmVnX25hY2wtPmluaXRpYXRvcm5hbWUsIGlzaWRfYnVmLAogCQkJCXByX3JlZy0+cHJfcmVzX2tleSwgcHJfcmVnLT5wcl9yZXNfdHlwZSwKIAkJCQlwcl9yZWctPnByX3Jlc19zY29wZSwgcHJfcmVnLT5wcl9yZWdfYWxsX3RnX3B0LApAQCAtMTkxMCwxNyArMTkxNiwxNyBAQAogCQkJCSJpbml0aWF0b3JfZmFicmljPSVzXG5pbml0aWF0b3Jfbm9kZT0lc1xuJXMiCiAJCQkJInNhX3Jlc19rZXk9JWxsdVxucmVzX2hvbGRlcj0wXG4iCiAJCQkJInJlc19hbGxfdGdfcHQ9JWRcbm1hcHBlZF9sdW49JXVcbiIsCi0JCQkJcmVnX2NvdW50LCBUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpLAorCQkJCXJlZ19jb3VudCwgdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwKIAkJCQlwcl9yZWctPnByX3JlZ19uYWNsLT5pbml0aWF0b3JuYW1lLCBpc2lkX2J1ZiwKIAkJCQlwcl9yZWctPnByX3Jlc19rZXksIHByX3JlZy0+cHJfcmVnX2FsbF90Z19wdCwKIAkJCQlwcl9yZWctPnByX3Jlc19tYXBwZWRfbHVuKTsKIAkJfQogCi0JCWlmICgobGVuICsgc3RybGVuKHRtcCkgPiBwcl9hcHRwbF9idWZfbGVuKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gdXBkYXRlIHJlbmFtaW5nIgorCQlpZiAoKGxlbiArIHN0cmxlbih0bXApID49IHByX2FwdHBsX2J1Zl9sZW4pKSB7CisJCQlwcl9lcnIoIlVuYWJsZSB0byB1cGRhdGUgcmVuYW1pbmciCiAJCQkJIiBBUFRQTCBtZXRhZGF0YVxuIik7Ci0JCQlzcGluX3VubG9jaygmVDEwX1JFUyhzdV9kZXYpLT5yZWdpc3RyYXRpb25fbG9jayk7Ci0JCQlyZXR1cm4gLTE7CisJCQlzcGluX3VubG9jaygmc3VfZGV2LT50MTBfcHIucmVnaXN0cmF0aW9uX2xvY2spOworCQkJcmV0dXJuIC1FTVNHU0laRTsKIAkJfQogCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiJXMiLCB0bXApOwogCkBAIC0xOTI5LDIzICsxOTM1LDIzIEBACiAJCSAqLwogCQlzbnByaW50Zih0bXAsIDUxMiwgInRhcmdldF9mYWJyaWM9JXNcbnRhcmdldF9ub2RlPSVzXG4iCiAJCQkidHBndD0laHVcbnBvcnRfcnRwaT0laHVcbnRhcmdldF9sdW49JXVcblBSX1JFR19FTkQ6IgotCQkJIiAlZFxuIiwgVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJCVRQR19URk8odHBnKS0+dHBnX2dldF93d24odHBnKSwKLQkJCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSwKKwkJCSIgJWRcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfd3duKHRwZyksCisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfdGFnKHRwZyksCiAJCQlsdW4tPmx1bl9zZXAtPnNlcF9ydHBpLCBsdW4tPnVucGFja2VkX2x1biwgcmVnX2NvdW50KTsKIAotCQlpZiAoKGxlbiArIHN0cmxlbih0bXApID4gcHJfYXB0cGxfYnVmX2xlbikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHVwZGF0ZSByZW5hbWluZyIKKwkJaWYgKChsZW4gKyBzdHJsZW4odG1wKSA+PSBwcl9hcHRwbF9idWZfbGVuKSkgeworCQkJcHJfZXJyKCJVbmFibGUgdG8gdXBkYXRlIHJlbmFtaW5nIgogCQkJCSIgQVBUUEwgbWV0YWRhdGFcbiIpOwotCQkJc3Bpbl91bmxvY2soJlQxMF9SRVMoc3VfZGV2KS0+cmVnaXN0cmF0aW9uX2xvY2spOwotCQkJcmV0dXJuIC0xOworCQkJc3Bpbl91bmxvY2soJnN1X2Rldi0+dDEwX3ByLnJlZ2lzdHJhdGlvbl9sb2NrKTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CiAJCX0KIAkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiVzIiwgdG1wKTsKIAkJcmVnX2NvdW50Kys7CiAJfQotCXNwaW5fdW5sb2NrKCZUMTBfUkVTKHN1X2RldiktPnJlZ2lzdHJhdGlvbl9sb2NrKTsKKwlzcGluX3VubG9jaygmc3VfZGV2LT50MTBfcHIucmVnaXN0cmF0aW9uX2xvY2spOwogCi0JaWYgKCEocmVnX2NvdW50KSkKKwlpZiAoIXJlZ19jb3VudCkKIAkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIk5vIFJlZ2lzdHJhdGlvbnMgb3IgUmVzZXJ2YXRpb25zIik7CiAKIAlyZXR1cm4gMDsKQEAgLTE5NzUsNyArMTk4MSw3IEBACiAJdW5zaWduZWQgY2hhciAqYnVmLAogCXUzMiBwcl9hcHRwbF9idWZfbGVuKQogewotCXN0cnVjdCB0MTBfd3duICp3d24gPSAmU1VfREVWKGRldiktPnQxMF93d247CisJc3RydWN0IHQxMF93d24gKnd3biA9ICZkZXYtPnNlX3N1Yl9kZXYtPnQxMF93d247CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJc3RydWN0IGlvdmVjIGlvdlsxXTsKIAltbV9zZWdtZW50X3Qgb2xkX2ZzOwpAQCAtMTk4NiwyMiArMTk5MiwyMiBAQAogCW1lbXNldChpb3YsIDAsIHNpemVvZihzdHJ1Y3QgaW92ZWMpKTsKIAltZW1zZXQocGF0aCwgMCwgNTEyKTsKIAotCWlmIChzdHJsZW4oJnd3bi0+dW5pdF9zZXJpYWxbMF0pID4gNTEyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiV1dOIHZhbHVlIGZvciBzdHJ1Y3Qgc2VfZGV2aWNlIGRvZXMgbm90IGZpdCIKKwlpZiAoc3RybGVuKCZ3d24tPnVuaXRfc2VyaWFsWzBdKSA+PSA1MTIpIHsKKwkJcHJfZXJyKCJXV04gdmFsdWUgZm9yIHN0cnVjdCBzZV9kZXZpY2UgZG9lcyBub3QgZml0IgogCQkJIiBpbnRvIHBhdGggYnVmZmVyXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCX0KIAogCXNucHJpbnRmKHBhdGgsIDUxMiwgIi92YXIvdGFyZ2V0L3ByL2FwdHBsXyVzIiwgJnd3bi0+dW5pdF9zZXJpYWxbMF0pOwogCWZpbGUgPSBmaWxwX29wZW4ocGF0aCwgZmxhZ3MsIDA2MDApOwogCWlmIChJU19FUlIoZmlsZSkgfHwgIWZpbGUgfHwgIWZpbGUtPmZfZGVudHJ5KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZmlscF9vcGVuKCVzKSBmb3IgQVBUUEwgbWV0YWRhdGEiCisJCXByX2VycigiZmlscF9vcGVuKCVzKSBmb3IgQVBUUEwgbWV0YWRhdGEiCiAJCQkiIGZhaWxlZFxuIiwgcGF0aCk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIChQVFJfRVJSKGZpbGUpIDwgMCA/IFBUUl9FUlIoZmlsZSkgOiAtRU5PRU5UKTsKIAl9CiAKIAlpb3ZbMF0uaW92X2Jhc2UgPSAmYnVmWzBdOwotCWlmICghKHByX2FwdHBsX2J1Zl9sZW4pKQorCWlmICghcHJfYXB0cGxfYnVmX2xlbikKIAkJaW92WzBdLmlvdl9sZW4gPSAoc3RybGVuKCZidWZbMF0pICsgMSk7IC8qIEFkZCBleHRyYSBmb3IgTlVMTCAqLwogCWVsc2UKIAkJaW92WzBdLmlvdl9sZW4gPSBwcl9hcHRwbF9idWZfbGVuOwpAQCAtMjAxMiw5ICsyMDE4LDkgQEAKIAlzZXRfZnMob2xkX2ZzKTsKIAogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiRXJyb3Igd3JpdGluZyBBUFRQTCBtZXRhZGF0YSBmaWxlOiAlc1xuIiwgcGF0aCk7CisJCXByX2RlYnVnKCJFcnJvciB3cml0aW5nIEFQVFBMIG1ldGFkYXRhIGZpbGU6ICVzXG4iLCBwYXRoKTsKIAkJZmlscF9jbG9zZShmaWxlLCBOVUxMKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTzsKIAl9CiAJZmlscF9jbG9zZShmaWxlLCBOVUxMKTsKIApAQCAtMjAzMiw3ICsyMDM4LDcgQEAKIAkvKgogCSAqIENhbiBiZSBjYWxsZWQgd2l0aCBhIE5VTEwgcG9pbnRlciBmcm9tIFBST1VUIHNlcnZpY2UgYWN0aW9uIENMRUFSCiAJICovCi0JaWYgKCEoaW5fYnVmKSkgeworCWlmICghaW5fYnVmKSB7CiAJCW1lbXNldChudWxsX2J1ZiwgMCwgNjQpOwogCQlidWYgPSAmbnVsbF9idWZbMF07CiAJCS8qCkBAIC0yMDQ5LDE0ICsyMDU1LDE0IEBACiAJcmV0ID0gY29yZV9zY3NpM191cGRhdGVfYXB0cGxfYnVmKGRldiwgYnVmLCBwcl9hcHRwbF9idWZfbGVuLAogCQkJCWNsZWFyX2FwdHBsX21ldGFkYXRhKTsKIAlpZiAocmV0ICE9IDApCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIHJldDsKIAkvKgogCSAqIF9fY29yZV9zY3NpM193cml0ZV9hcHRwbF90b19maWxlKCkgd2lsbCBjYWxsIHN0cmxlbigpCiAJICogb24gdGhlIHBhc3NlZCBidWYgdG8gZGV0ZXJtaW5lIHByX2FwdHBsX2J1Zl9sZW4uCiAJICovCiAJcmV0ID0gX19jb3JlX3Njc2kzX3dyaXRlX2FwdHBsX3RvX2ZpbGUoZGV2LCBidWYsIDApOwogCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIwNzAsMjggKzIwNzYsMjggQEAKIAlpbnQgc3BlY19pX3B0LAogCWludCBpZ25vcmVfa2V5KQogewotCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gU0VfU0VTUyhjbWQpOwotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0RFVihjbWQpOworCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gY21kLT5zZV9zZXNzOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXN0cnVjdCBzZV9kZXZfZW50cnkgKnNlX2RldmU7Ci0Jc3RydWN0IHNlX2x1biAqc2VfbHVuID0gU0VfTFVOKGNtZCk7CisJc3RydWN0IHNlX2x1biAqc2VfbHVuID0gY21kLT5zZV9sdW47CiAJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqc2VfdHBnOwogCXN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uICpwcl9yZWcsICpwcl9yZWdfcCwgKnByX3JlZ190bXAsICpwcl9yZWdfZTsKLQlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uX3RlbXBsYXRlICpwcl90bXBsID0gJlNVX0RFVihkZXYpLT50MTBfcmVzZXJ2YXRpb247CisJc3RydWN0IHQxMF9yZXNlcnZhdGlvbiAqcHJfdG1wbCA9ICZkZXYtPnNlX3N1Yl9kZXYtPnQxMF9wcjsKIAkvKiBVc2VkIGZvciBBUFRQTCBtZXRhZGF0YSB3LyBVTlJFR0lTVEVSICovCiAJdW5zaWduZWQgY2hhciAqcHJfYXB0cGxfYnVmID0gTlVMTDsKIAl1bnNpZ25lZCBjaGFyIGlzaWRfYnVmW1BSX1JFR19JU0lEX0xFTl0sICppc2lkX3B0ciA9IE5VTEw7CiAJaW50IHByX2hvbGRlciA9IDAsIHJldCA9IDAsIHR5cGU7CiAKLQlpZiAoIShzZV9zZXNzKSB8fCAhKHNlX2x1bikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUjogc2Vfc2VzcyB8fCBzdHJ1Y3Qgc2VfbHVuIGlzIE5VTEwhXG4iKTsKKwlpZiAoIXNlX3Nlc3MgfHwgIXNlX2x1bikgeworCQlwcl9lcnIoIlNQQy0zIFBSOiBzZV9zZXNzIHx8IHN0cnVjdCBzZV9sdW4gaXMgTlVMTCFcbiIpOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CiAJfQogCXNlX3RwZyA9IHNlX3Nlc3MtPnNlX3RwZzsKIAlzZV9kZXZlID0gJnNlX3Nlc3MtPnNlX25vZGVfYWNsLT5kZXZpY2VfbGlzdFtjbWQtPm9yaWdfZmVfbHVuXTsKIAotCWlmIChUUEdfVEZPKHNlX3RwZyktPnNlc3NfZ2V0X2luaXRpYXRvcl9zaWQgIT0gTlVMTCkgeworCWlmIChzZV90cGctPnNlX3RwZ190Zm8tPnNlc3NfZ2V0X2luaXRpYXRvcl9zaWQpIHsKIAkJbWVtc2V0KCZpc2lkX2J1ZlswXSwgMCwgUFJfUkVHX0lTSURfTEVOKTsKLQkJVFBHX1RGTyhzZV90cGcpLT5zZXNzX2dldF9pbml0aWF0b3Jfc2lkKHNlX3Nlc3MsICZpc2lkX2J1ZlswXSwKKwkJc2VfdHBnLT5zZV90cGdfdGZvLT5zZXNzX2dldF9pbml0aWF0b3Jfc2lkKHNlX3Nlc3MsICZpc2lkX2J1ZlswXSwKIAkJCQlQUl9SRUdfSVNJRF9MRU4pOwogCQlpc2lkX3B0ciA9ICZpc2lkX2J1ZlswXTsKIAl9CkBAIC0yMDk5LDMwICsyMTA1LDMwIEBACiAJICogRm9sbG93IGxvZ2ljIGZyb20gc3BjNHIxNyBTZWN0aW9uIDUuNy43LCBSZWdpc3RlciBCZWhhdmlvcnMgVGFibGUgNDcKIAkgKi8KIAlwcl9yZWdfZSA9IGNvcmVfc2NzaTNfbG9jYXRlX3ByX3JlZyhkZXYsIHNlX3Nlc3MtPnNlX25vZGVfYWNsLCBzZV9zZXNzKTsKLQlpZiAoIShwcl9yZWdfZSkpIHsKKwlpZiAoIXByX3JlZ19lKSB7CiAJCWlmIChyZXNfa2V5KSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJTUEMtMyBQUjogUmVzZXJ2YXRpb24gS2V5IG5vbi16ZXJvIgorCQkJcHJfd2FybigiU1BDLTMgUFI6IFJlc2VydmF0aW9uIEtleSBub24temVybyIKIAkJCQkiIGZvciBTQSBSRUdJU1RFUiwgcmV0dXJuaW5nIENPTkZMSUNUXG4iKTsKIAkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOwogCQl9CiAJCS8qCiAJCSAqIERvIG5vdGhpbmcgYnV0IHJldHVybiBHT09EIHN0YXR1cy4KIAkJICovCi0JCWlmICghKHNhX3Jlc19rZXkpKQorCQlpZiAoIXNhX3Jlc19rZXkpCiAJCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9TRU5UX1RPX1RSQU5TUE9SVDsKIAotCQlpZiAoIShzcGVjX2lfcHQpKSB7CisJCWlmICghc3BlY19pX3B0KSB7CiAJCQkvKgogCQkJICogUGVyZm9ybSB0aGUgU2VydmljZSBBY3Rpb24gUkVHSVNURVIgb24gdGhlIEluaXRpYXRvcgogCQkJICogUG9ydCBFbmRwb2ludCB0aGF0IHRoZSBQUk8gd2FzIHJlY2VpdmVkIGZyb20gb24gdGhlCiAJCQkgKiBMb2dpY2FsIFVuaXQgb2YgdGhlIFNDU0kgZGV2aWNlIHNlcnZlci4KIAkJCSAqLwotCQkJcmV0ID0gY29yZV9zY3NpM19hbGxvY19yZWdpc3RyYXRpb24oU0VfREVWKGNtZCksCisJCQlyZXQgPSBjb3JlX3Njc2kzX2FsbG9jX3JlZ2lzdHJhdGlvbihjbWQtPnNlX2RldiwKIAkJCQkJc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wsIHNlX2RldmUsIGlzaWRfcHRyLAogCQkJCQlzYV9yZXNfa2V5LCBhbGxfdGdfcHQsIGFwdHBsLAogCQkJCQlpZ25vcmVfa2V5LCAwKTsKIAkJCWlmIChyZXQgIT0gMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIgorCQkJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIgogCQkJCQkiIHN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uXG4iKTsKIAkJCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOwogCQkJfQpAQCAtMjE0MywxMCArMjE0OSwxMCBAQAogCQkvKgogCQkgKiBOb3RoaW5nIGxlZnQgdG8gZG8gZm9yIHRoZSBBUFRQTD0wIGNhc2UuCiAJCSAqLwotCQlpZiAoIShhcHRwbCkpIHsKKwkJaWYgKCFhcHRwbCkgewogCQkJcHJfdG1wbC0+cHJfYXB0cGxfYWN0aXZlID0gMDsKLQkJCWNvcmVfc2NzaTNfdXBkYXRlX2FuZF93cml0ZV9hcHRwbChTRV9ERVYoY21kKSwgTlVMTCwgMCk7Ci0JCQlwcmludGsoIlNQQy0zIFBSOiBTZXQgQVBUUEwgQml0IERlYWN0aXZhdGVkIGZvciIKKwkJCWNvcmVfc2NzaTNfdXBkYXRlX2FuZF93cml0ZV9hcHRwbChjbWQtPnNlX2RldiwgTlVMTCwgMCk7CisJCQlwcl9kZWJ1ZygiU1BDLTMgUFI6IFNldCBBUFRQTCBCaXQgRGVhY3RpdmF0ZWQgZm9yIgogCQkJCQkiIFJFR0lTVEVSXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yMTU1LDE1ICsyMTYxLDE1IEBACiAJCSAqIHVwZGF0ZSB0aGUgQVBUUEwgbWV0YWRhdGEgaW5mb3JtYXRpb24gdXNpbmcgaXRzCiAJCSAqIHByZWFsbG9jYXRlZCAqcHJfcmVnLT5wcl9hcHRwbF9idWYuCiAJCSAqLwotCQlwcl9yZWcgPSBjb3JlX3Njc2kzX2xvY2F0ZV9wcl9yZWcoU0VfREVWKGNtZCksCisJCXByX3JlZyA9IGNvcmVfc2NzaTNfbG9jYXRlX3ByX3JlZyhjbWQtPnNlX2RldiwKIAkJCQlzZV9zZXNzLT5zZV9ub2RlX2FjbCwgc2Vfc2Vzcyk7CiAKLQkJcmV0ID0gY29yZV9zY3NpM191cGRhdGVfYW5kX3dyaXRlX2FwdHBsKFNFX0RFVihjbWQpLAorCQlyZXQgPSBjb3JlX3Njc2kzX3VwZGF0ZV9hbmRfd3JpdGVfYXB0cGwoY21kLT5zZV9kZXYsCiAJCQkJJnByX3JlZy0+cHJfYXB0cGxfYnVmWzBdLAogCQkJCXByX3RtcGwtPnByX2FwdHBsX2J1Zl9sZW4pOwotCQlpZiAoIShyZXQpKSB7CisJCWlmICghcmV0KSB7CiAJCQlwcl90bXBsLT5wcl9hcHRwbF9hY3RpdmUgPSAxOwotCQkJcHJpbnRrKCJTUEMtMyBQUjogU2V0IEFQVFBMIEJpdCBBY3RpdmF0ZWQgZm9yIFJFR0lTVEVSXG4iKTsKKwkJCXByX2RlYnVnKCJTUEMtMyBQUjogU2V0IEFQVFBMIEJpdCBBY3RpdmF0ZWQgZm9yIFJFR0lTVEVSXG4iKTsKIAkJfQogCiAJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwpAQCAtMjE3NSw5ICsyMTgxLDkgQEAKIAkJcHJfcmVnID0gcHJfcmVnX2U7CiAJCXR5cGUgPSBwcl9yZWctPnByX3Jlc190eXBlOwogCi0JCWlmICghKGlnbm9yZV9rZXkpKSB7CisJCWlmICghaWdub3JlX2tleSkgewogCQkJaWYgKHJlc19rZXkgIT0gcHJfcmVnLT5wcl9yZXNfa2V5KSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUiBSRUdJU1RFUjogUmVjZWl2ZWQiCisJCQkJcHJfZXJyKCJTUEMtMyBQUiBSRUdJU1RFUjogUmVjZWl2ZWQiCiAJCQkJCSIgcmVzX2tleTogMHglMDE2THggZG9lcyBub3QgbWF0Y2giCiAJCQkJCSIgZXhpc3RpbmcgU0EgUkVHSVNURVIgcmVzX2tleToiCiAJCQkJCSIgMHglMDE2THhcbiIsIHJlc19rZXksCkBAIC0yMTg3LDcgKzIxOTMsNyBAQAogCQkJfQogCQl9CiAJCWlmIChzcGVjX2lfcHQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiU1BDLTMgUFIgVU5SRUdJU1RFUjogU1BFQ19JX1BUIgorCQkJcHJfZXJyKCJTUEMtMyBQUiBVTlJFR0lTVEVSOiBTUEVDX0lfUFQiCiAJCQkJIiBzZXQgd2hpbGUgc2FfcmVzX2tleT0wXG4iKTsKIAkJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwogCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKQEAgLTIxOTcsNyArMjIwMyw3IEBACiAJCSAqIG11c3QgYWxzbyBzZXQgQUxMX1RHX1BUPTEgaW4gdGhlIGluY29taW5nIFBST1VULgogCQkgKi8KIAkJaWYgKHByX3JlZy0+cHJfcmVnX2FsbF90Z19wdCAmJiAhKGFsbF90Z19wdCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiU1BDLTMgUFIgVU5SRUdJU1RFUjogQUxMX1RHX1BUPTEiCisJCQlwcl9lcnIoIlNQQy0zIFBSIFVOUkVHSVNURVI6IEFMTF9UR19QVD0xIgogCQkJCSIgcmVnaXN0cmF0aW9uIGV4aXN0cywgYnV0IEFMTF9UR19QVD0xIGJpdCBub3QiCiAJCQkJIiBwcmVzZW50IGluIHJlY2VpdmVkIFBST1VUXG4iKTsKIAkJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwpAQCAtMjIwOSw4ICsyMjE1LDggQEAKIAkJaWYgKGFwdHBsKSB7CiAJCQlwcl9hcHRwbF9idWYgPSBremFsbG9jKHByX3RtcGwtPnByX2FwdHBsX2J1Zl9sZW4sCiAJCQkJCQlHRlBfS0VSTkVMKTsKLQkJCWlmICghKHByX2FwdHBsX2J1ZikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSIKKwkJCWlmICghcHJfYXB0cGxfYnVmKSB7CisJCQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUiCiAJCQkJCSIgcHJfYXB0cGxfYnVmXG4iKTsKIAkJCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKIAkJCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CkBAIC0yMjIxLDkgKzIyMjcsOSBAQAogCQkgKiBOZXh1cyBzYV9yZXNfa2V5PTEgQ2hhbmdlIFJlc2VydmF0aW9uIEtleSBmb3IgcmVnaXN0ZXJlZCBJX1QKIAkJICogTmV4dXMuCiAJCSAqLwotCQlpZiAoIShzYV9yZXNfa2V5KSkgeworCQlpZiAoIXNhX3Jlc19rZXkpIHsKIAkJCXByX2hvbGRlciA9IGNvcmVfc2NzaTNfY2hlY2tfaW1wbGljdF9yZWxlYXNlKAotCQkJCQlTRV9ERVYoY21kKSwgcHJfcmVnKTsKKwkJCQkJY21kLT5zZV9kZXYsIHByX3JlZyk7CiAJCQlpZiAocHJfaG9sZGVyIDwgMCkgewogCQkJCWtmcmVlKHByX2FwdHBsX2J1Zik7CiAJCQkJY29yZV9zY3NpM19wdXRfcHJfcmVnKHByX3JlZyk7CkBAIC0yMjQwLDcgKzIyNDYsNyBAQAogCQkJCQkJJnByX3RtcGwtPnJlZ2lzdHJhdGlvbl9saXN0LAogCQkJCQkJcHJfcmVnX2xpc3QpIHsKIAotCQkJCQlpZiAoIShwcl9yZWdfcC0+cHJfcmVnX2FsbF90Z19wdCkpCisJCQkJCWlmICghcHJfcmVnX3AtPnByX3JlZ19hbGxfdGdfcHQpCiAJCQkJCQljb250aW51ZTsKIAogCQkJCQlpZiAocHJfcmVnX3AtPnByX3Jlc19rZXkgIT0gcmVzX2tleSkKQEAgLTIyNjAsNyArMjI2Niw3IEBACiAJCQkvKgogCQkJICogUmVsZWFzZSB0aGUgY2FsbGluZyBJX1QgTmV4dXMgcmVnaXN0cmF0aW9uIG5vdy4uCiAJCQkgKi8KLQkJCV9fY29yZV9zY3NpM19mcmVlX3JlZ2lzdHJhdGlvbihTRV9ERVYoY21kKSwgcHJfcmVnLAorCQkJX19jb3JlX3Njc2kzX2ZyZWVfcmVnaXN0cmF0aW9uKGNtZC0+c2VfZGV2LCBwcl9yZWcsCiAJCQkJCQkJTlVMTCwgMSk7CiAJCQkvKgogCQkJICogRnJvbSBzcGM0cjE3LCBzZWN0aW9uIDUuNy4xMS4zIFVucmVnaXN0ZXJpbmcKQEAgLTIyODksMTAgKzIyOTUsMTAgQEAKIAkJCX0KIAkJCXNwaW5fdW5sb2NrKCZwcl90bXBsLT5yZWdpc3RyYXRpb25fbG9jayk7CiAKLQkJCWlmICghKGFwdHBsKSkgeworCQkJaWYgKCFhcHRwbCkgewogCQkJCXByX3RtcGwtPnByX2FwdHBsX2FjdGl2ZSA9IDA7CiAJCQkJY29yZV9zY3NpM191cGRhdGVfYW5kX3dyaXRlX2FwdHBsKGRldiwgTlVMTCwgMCk7Ci0JCQkJcHJpbnRrKCJTUEMtMyBQUjogU2V0IEFQVFBMIEJpdCBEZWFjdGl2YXRlZCIKKwkJCQlwcl9kZWJ1ZygiU1BDLTMgUFI6IFNldCBBUFRQTCBCaXQgRGVhY3RpdmF0ZWQiCiAJCQkJCQkiIGZvciBVTlJFR0lTVEVSXG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KQEAgLTIzMDAsOSArMjMwNiw5IEBACiAJCQlyZXQgPSBjb3JlX3Njc2kzX3VwZGF0ZV9hbmRfd3JpdGVfYXB0cGwoZGV2LAogCQkJCQkmcHJfYXB0cGxfYnVmWzBdLAogCQkJCQlwcl90bXBsLT5wcl9hcHRwbF9idWZfbGVuKTsKLQkJCWlmICghKHJldCkpIHsKKwkJCWlmICghcmV0KSB7CiAJCQkJcHJfdG1wbC0+cHJfYXB0cGxfYWN0aXZlID0gMTsKLQkJCQlwcmludGsoIlNQQy0zIFBSOiBTZXQgQVBUUEwgQml0IEFjdGl2YXRlZCIKKwkJCQlwcl9kZWJ1ZygiU1BDLTMgUFI6IFNldCBBUFRQTCBCaXQgQWN0aXZhdGVkIgogCQkJCQkJIiBmb3IgVU5SRUdJU1RFUlxuIik7CiAJCQl9CiAKQEAgLTIzMTUsMjAgKzIzMjEsMjAgQEAKIAkJCSAqIFJFQURfS0VZUyBzZXJ2aWNlIGFjdGlvbi4KIAkJCSAqLwogCQkJcHJfcmVnLT5wcl9yZXNfZ2VuZXJhdGlvbiA9IGNvcmVfc2NzaTNfcHJfZ2VuZXJhdGlvbigKLQkJCQkJCQlTRV9ERVYoY21kKSk7CisJCQkJCQkJY21kLT5zZV9kZXYpOwogCQkJcHJfcmVnLT5wcl9yZXNfa2V5ID0gc2FfcmVzX2tleTsKLQkJCXByaW50aygiU1BDLTMgUFIgWyVzXSBSRUdJU1RFUiVzOiBDaGFuZ2VkIFJlc2VydmF0aW9uIgorCQkJcHJfZGVidWcoIlNQQy0zIFBSIFslc10gUkVHSVNURVIlczogQ2hhbmdlZCBSZXNlcnZhdGlvbiIKIAkJCQkiIEtleSBmb3IgJXMgdG86IDB4JTAxNkx4IFBSZ2VuZXJhdGlvbjoiCi0JCQkJIiAweCUwOHhcbiIsIENNRF9URk8oY21kKS0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCQkJIiAweCUwOHhcbiIsIGNtZC0+c2VfdGZvLT5nZXRfZmFicmljX25hbWUoKSwKIAkJCQkoaWdub3JlX2tleSkgPyAiX0FORF9JR05PUkVfRVhJU1RJTkdfS0VZIiA6ICIiLAogCQkJCXByX3JlZy0+cHJfcmVnX25hY2wtPmluaXRpYXRvcm5hbWUsCiAJCQkJcHJfcmVnLT5wcl9yZXNfa2V5LCBwcl9yZWctPnByX3Jlc19nZW5lcmF0aW9uKTsKIAotCQkJaWYgKCEoYXB0cGwpKSB7CisJCQlpZiAoIWFwdHBsKSB7CiAJCQkJcHJfdG1wbC0+cHJfYXB0cGxfYWN0aXZlID0gMDsKIAkJCQljb3JlX3Njc2kzX3VwZGF0ZV9hbmRfd3JpdGVfYXB0cGwoZGV2LCBOVUxMLCAwKTsKIAkJCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKLQkJCQlwcmludGsoIlNQQy0zIFBSOiBTZXQgQVBUUEwgQml0IERlYWN0aXZhdGVkIgorCQkJCXByX2RlYnVnKCJTUEMtMyBQUjogU2V0IEFQVFBMIEJpdCBEZWFjdGl2YXRlZCIKIAkJCQkJCSIgZm9yIFJFR0lTVEVSXG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KQEAgLTIzMzYsOSArMjM0Miw5IEBACiAJCQlyZXQgPSBjb3JlX3Njc2kzX3VwZGF0ZV9hbmRfd3JpdGVfYXB0cGwoZGV2LAogCQkJCQkmcHJfYXB0cGxfYnVmWzBdLAogCQkJCQlwcl90bXBsLT5wcl9hcHRwbF9idWZfbGVuKTsKLQkJCWlmICghKHJldCkpIHsKKwkJCWlmICghcmV0KSB7CiAJCQkJcHJfdG1wbC0+cHJfYXB0cGxfYWN0aXZlID0gMTsKLQkJCQlwcmludGsoIlNQQy0zIFBSOiBTZXQgQVBUUEwgQml0IEFjdGl2YXRlZCIKKwkJCQlwcl9kZWJ1ZygiU1BDLTMgUFI6IFNldCBBUFRQTCBCaXQgQWN0aXZhdGVkIgogCQkJCQkJIiBmb3IgUkVHSVNURVJcbiIpOwogCQkJfQogCkBAIC0yMzc4LDE5ICsyMzg0LDE5IEBACiAJaW50IHNjb3BlLAogCXU2NCByZXNfa2V5KQogewotCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gU0VfU0VTUyhjbWQpOworCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gY21kLT5zZV9zZXNzOwogCXN0cnVjdCBzZV9kZXZfZW50cnkgKnNlX2RldmU7Ci0Jc3RydWN0IHNlX2x1biAqc2VfbHVuID0gU0VfTFVOKGNtZCk7CisJc3RydWN0IHNlX2x1biAqc2VfbHVuID0gY21kLT5zZV9sdW47CiAJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqc2VfdHBnOwogCXN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uICpwcl9yZWcsICpwcl9yZXNfaG9sZGVyOwotCXN0cnVjdCB0MTBfcmVzZXJ2YXRpb25fdGVtcGxhdGUgKnByX3RtcGwgPSAmU1VfREVWKGRldiktPnQxMF9yZXNlcnZhdGlvbjsKKwlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uICpwcl90bXBsID0gJmRldi0+c2Vfc3ViX2Rldi0+dDEwX3ByOwogCWNoYXIgaV9idWZbUFJfUkVHX0lTSURfSURfTEVOXTsKIAlpbnQgcmV0LCBwcmZfaXNpZDsKIAogCW1lbXNldChpX2J1ZiwgMCwgUFJfUkVHX0lTSURfSURfTEVOKTsKIAotCWlmICghKHNlX3Nlc3MpIHx8ICEoc2VfbHVuKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNQQy0zIFBSOiBzZV9zZXNzIHx8IHN0cnVjdCBzZV9sdW4gaXMgTlVMTCFcbiIpOworCWlmICghc2Vfc2VzcyB8fCAhc2VfbHVuKSB7CisJCXByX2VycigiU1BDLTMgUFI6IHNlX3Nlc3MgfHwgc3RydWN0IHNlX2x1biBpcyBOVUxMIVxuIik7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKIAl9CiAJc2VfdHBnID0gc2Vfc2Vzcy0+c2VfdHBnOwpAQCAtMjM5OCwxMCArMjQwNCwxMCBAQAogCS8qCiAJICogTG9jYXRlIHRoZSBleGlzdGluZyAqcHJfcmVnIHZpYSBzdHJ1Y3Qgc2Vfbm9kZV9hY2wgcG9pbnRlcnMKIAkgKi8KLQlwcl9yZWcgPSBjb3JlX3Njc2kzX2xvY2F0ZV9wcl9yZWcoU0VfREVWKGNtZCksIHNlX3Nlc3MtPnNlX25vZGVfYWNsLAorCXByX3JlZyA9IGNvcmVfc2NzaTNfbG9jYXRlX3ByX3JlZyhjbWQtPnNlX2Rldiwgc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wsCiAJCQkJc2Vfc2Vzcyk7Ci0JaWYgKCEocHJfcmVnKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNQQy0zIFBSOiBVbmFibGUgdG8gbG9jYXRlIgorCWlmICghcHJfcmVnKSB7CisJCXByX2VycigiU1BDLTMgUFI6IFVuYWJsZSB0byBsb2NhdGUiCiAJCQkiIFBSX1JFR0lTVEVSRUQgKnByX3JlZyBmb3IgUkVTRVJWRVxuIik7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKIAl9CkBAIC0yNDE1LDcgKzI0MjEsNyBAQAogCSAqIAkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBsb2dpY2FsIHVuaXQgZm9yIHRoZSBJX1QgbmV4dXM7IGFuZAogCSAqLwogCWlmIChyZXNfa2V5ICE9IHByX3JlZy0+cHJfcmVzX2tleSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNQQy0zIFBSIFJFU0VSVkU6IFJlY2VpdmVkIHJlc19rZXk6IDB4JTAxNkx4IgorCQlwcl9lcnIoIlNQQy0zIFBSIFJFU0VSVkU6IFJlY2VpdmVkIHJlc19rZXk6IDB4JTAxNkx4IgogCQkJIiBkb2VzIG5vdCBtYXRjaCBleGlzdGluZyBTQSBSRUdJU1RFUiByZXNfa2V5OiIKIAkJCSIgMHglMDE2THhcbiIsIHJlc19rZXksIHByX3JlZy0+cHJfcmVzX2tleSk7CiAJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwpAQCAtMjQzMiw3ICsyNDM4LDcgQEAKIAkgKiBhbmQgdGhhdCBwZXJzaXN0ZW50IHJlc2VydmF0aW9uIGhhcyBhIHNjb3BlIG9mIExVX1NDT1BFLgogCSAqLwogCWlmIChzY29wZSAhPSBQUl9TQ09QRV9MVV9TQ09QRSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNQQy0zIFBSOiBJbGxlZ2FsIFNDT1BFOiAweCUwMnhcbiIsIHNjb3BlKTsKKwkJcHJfZXJyKCJTUEMtMyBQUjogSWxsZWdhbCBTQ09QRTogMHglMDJ4XG4iLCBzY29wZSk7CiAJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOwogCX0KQEAgLTI0NTYsMTIgKzI0NjIsMTIgQEAKIAkJICovCiAJCWlmIChwcl9yZXNfaG9sZGVyICE9IHByX3JlZykgewogCQkJc3RydWN0IHNlX25vZGVfYWNsICpwcl9yZXNfbmFjbCA9IHByX3Jlc19ob2xkZXItPnByX3JlZ19uYWNsOwotCQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUjogQXR0ZW1wdGVkIFJFU0VSVkUgZnJvbSIKKwkJCXByX2VycigiU1BDLTMgUFI6IEF0dGVtcHRlZCBSRVNFUlZFIGZyb20iCiAJCQkJIiBbJXNdOiAlcyB3aGlsZSByZXNlcnZhdGlvbiBhbHJlYWR5IGhlbGQgYnkiCiAJCQkJIiBbJXNdOiAlcywgcmV0dXJuaW5nIFJFU0VSVkFUSU9OX0NPTkZMSUNUXG4iLAotCQkJCUNNRF9URk8oY21kKS0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCQkJY21kLT5zZV90Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJCXNlX3Nlc3MtPnNlX25vZGVfYWNsLT5pbml0aWF0b3JuYW1lLAotCQkJCVRQR19URk8ocHJfcmVzX25hY2wtPnNlX3RwZyktPmdldF9mYWJyaWNfbmFtZSgpLAorCQkJCXByX3Jlc19uYWNsLT5zZV90cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJCXByX3Jlc19ob2xkZXItPnByX3JlZ19uYWNsLT5pbml0aWF0b3JuYW1lKTsKIAogCQkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwpAQCAtMjQ3OCwxMyArMjQ4NCwxMyBAQAogCQlpZiAoKHByX3Jlc19ob2xkZXItPnByX3Jlc190eXBlICE9IHR5cGUpIHx8CiAJCSAgICAocHJfcmVzX2hvbGRlci0+cHJfcmVzX3Njb3BlICE9IHNjb3BlKSkgewogCQkJc3RydWN0IHNlX25vZGVfYWNsICpwcl9yZXNfbmFjbCA9IHByX3Jlc19ob2xkZXItPnByX3JlZ19uYWNsOwotCQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUjogQXR0ZW1wdGVkIFJFU0VSVkUgZnJvbSIKKwkJCXByX2VycigiU1BDLTMgUFI6IEF0dGVtcHRlZCBSRVNFUlZFIGZyb20iCiAJCQkJIiBbJXNdOiAlcyB0cnlpbmcgdG8gY2hhbmdlIFRZUEUgYW5kL29yIFNDT1BFLCIKIAkJCQkiIHdoaWxlIHJlc2VydmF0aW9uIGFscmVhZHkgaGVsZCBieSBbJXNdOiAlcywiCiAJCQkJIiByZXR1cm5pbmcgUkVTRVJWQVRJT05fQ09ORkxJQ1RcbiIsCi0JCQkJQ01EX1RGTyhjbWQpLT5nZXRfZmFicmljX25hbWUoKSwKKwkJCQljbWQtPnNlX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCiAJCQkJc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUsCi0JCQkJVFBHX1RGTyhwcl9yZXNfbmFjbC0+c2VfdHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCQkJcHJfcmVzX25hY2wtPnNlX3RwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCiAJCQkJcHJfcmVzX2hvbGRlci0+cHJfcmVnX25hY2wtPmluaXRpYXRvcm5hbWUpOwogCiAJCQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CkBAIC0yNTE2LDIyICsyNTIyLDIyIEBACiAJcHJmX2lzaWQgPSBjb3JlX3ByX2R1bXBfaW5pdGlhdG9yX3BvcnQocHJfcmVnLCAmaV9idWZbMF0sCiAJCQkJUFJfUkVHX0lTSURfSURfTEVOKTsKIAotCXByaW50ayhLRVJOX0lORk8gIlNQQy0zIFBSIFslc10gU2VydmljZSBBY3Rpb246IFJFU0VSVkUgY3JlYXRlZCBuZXciCisJcHJfZGVidWcoIlNQQy0zIFBSIFslc10gU2VydmljZSBBY3Rpb246IFJFU0VSVkUgY3JlYXRlZCBuZXciCiAJCSIgcmVzZXJ2YXRpb24gaG9sZGVyIFRZUEU6ICVzIEFMTF9UR19QVDogJWRcbiIsCi0JCUNNRF9URk8oY21kKS0+Z2V0X2ZhYnJpY19uYW1lKCksIGNvcmVfc2NzaTNfcHJfZHVtcF90eXBlKHR5cGUpLAorCQljbWQtPnNlX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksIGNvcmVfc2NzaTNfcHJfZHVtcF90eXBlKHR5cGUpLAogCQkocHJfcmVnLT5wcl9yZWdfYWxsX3RnX3B0KSA/IDEgOiAwKTsKLQlwcmludGsoS0VSTl9JTkZPICJTUEMtMyBQUiBbJXNdIFJFU0VSVkUgTm9kZTogJXMlc1xuIiwKLQkJCUNNRF9URk8oY21kKS0+Z2V0X2ZhYnJpY19uYW1lKCksCisJcHJfZGVidWcoIlNQQy0zIFBSIFslc10gUkVTRVJWRSBOb2RlOiAlcyVzXG4iLAorCQkJY21kLT5zZV90Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUsCiAJCQkocHJmX2lzaWQpID8gJmlfYnVmWzBdIDogIiIpOwogCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAogCWlmIChwcl90bXBsLT5wcl9hcHRwbF9hY3RpdmUpIHsKLQkJcmV0ID0gY29yZV9zY3NpM191cGRhdGVfYW5kX3dyaXRlX2FwdHBsKFNFX0RFVihjbWQpLAorCQlyZXQgPSBjb3JlX3Njc2kzX3VwZGF0ZV9hbmRfd3JpdGVfYXB0cGwoY21kLT5zZV9kZXYsCiAJCQkJJnByX3JlZy0+cHJfYXB0cGxfYnVmWzBdLAogCQkJCXByX3RtcGwtPnByX2FwdHBsX2J1Zl9sZW4pOwotCQlpZiAoIShyZXQpKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiU1BDLTMgUFI6IFVwZGF0ZWQgQVBUUEwgbWV0YWRhdGEiCisJCWlmICghcmV0KQorCQkJcHJfZGVidWcoIlNQQy0zIFBSOiBVcGRhdGVkIEFQVFBMIG1ldGFkYXRhIgogCQkJCQkiIGZvciBSRVNFUlZFXG4iKTsKIAl9CiAKQEAgLTI1NTgsNyArMjU2NCw3IEBACiAJCXJldCA9IGNvcmVfc2NzaTNfcHJvX3Jlc2VydmUoY21kLCBkZXYsIHR5cGUsIHNjb3BlLCByZXNfa2V5KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUjogVW5rbm93biBTZXJ2aWNlIEFjdGlvbiBSRVNFUlZFIFR5cGU6IgorCQlwcl9lcnIoIlNQQy0zIFBSOiBVbmtub3duIFNlcnZpY2UgQWN0aW9uIFJFU0VSVkUgVHlwZToiCiAJCQkiIDB4JTAyeFxuIiwgdHlwZSk7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfQ0RCX0ZJRUxEOwogCX0KQEAgLTI1ODcsMTIgKzI1OTMsMTIgQEAKIAkgKi8KIAlkZXYtPmRldl9wcl9yZXNfaG9sZGVyID0gTlVMTDsKIAotCXByaW50ayhLRVJOX0lORk8gIlNQQy0zIFBSIFslc10gU2VydmljZSBBY3Rpb246ICVzIFJFTEVBU0UgY2xlYXJlZCIKKwlwcl9kZWJ1ZygiU1BDLTMgUFIgWyVzXSBTZXJ2aWNlIEFjdGlvbjogJXMgUkVMRUFTRSBjbGVhcmVkIgogCQkiIHJlc2VydmF0aW9uIGhvbGRlciBUWVBFOiAlcyBBTExfVEdfUFQ6ICVkXG4iLAogCQl0Zm8tPmdldF9mYWJyaWNfbmFtZSgpLCAoZXhwbGljdCkgPyAiZXhwbGljdCIgOiAiaW1wbGljdCIsCiAJCWNvcmVfc2NzaTNfcHJfZHVtcF90eXBlKHByX3JlZy0+cHJfcmVzX3R5cGUpLAogCQkocHJfcmVnLT5wcl9yZWdfYWxsX3RnX3B0KSA/IDEgOiAwKTsKLQlwcmludGsoS0VSTl9JTkZPICJTUEMtMyBQUiBbJXNdIFJFTEVBU0UgTm9kZTogJXMlc1xuIiwKKwlwcl9kZWJ1ZygiU1BDLTMgUFIgWyVzXSBSRUxFQVNFIE5vZGU6ICVzJXNcbiIsCiAJCXRmby0+Z2V0X2ZhYnJpY19uYW1lKCksIHNlX25hY2wtPmluaXRpYXRvcm5hbWUsCiAJCShwcmZfaXNpZCkgPyAmaV9idWZbMF0gOiAiIik7CiAJLyoKQEAgLTI2MDgsMjIgKzI2MTQsMjIgQEAKIAl1NjQgcmVzX2tleSkKIHsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKLQlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzcyA9IFNFX1NFU1MoY21kKTsKLQlzdHJ1Y3Qgc2VfbHVuICpzZV9sdW4gPSBTRV9MVU4oY21kKTsKKwlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzcyA9IGNtZC0+c2Vfc2VzczsKKwlzdHJ1Y3Qgc2VfbHVuICpzZV9sdW4gPSBjbWQtPnNlX2x1bjsKIAlzdHJ1Y3QgdDEwX3ByX3JlZ2lzdHJhdGlvbiAqcHJfcmVnLCAqcHJfcmVnX3AsICpwcl9yZXNfaG9sZGVyOwotCXN0cnVjdCB0MTBfcmVzZXJ2YXRpb25fdGVtcGxhdGUgKnByX3RtcGwgPSAmU1VfREVWKGRldiktPnQxMF9yZXNlcnZhdGlvbjsKKwlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uICpwcl90bXBsID0gJmRldi0+c2Vfc3ViX2Rldi0+dDEwX3ByOwogCWludCByZXQsIGFsbF9yZWcgPSAwOwogCi0JaWYgKCEoc2Vfc2VzcykgfHwgIShzZV9sdW4pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1BDLTMgUFI6IHNlX3Nlc3MgfHwgc3RydWN0IHNlX2x1biBpcyBOVUxMIVxuIik7CisJaWYgKCFzZV9zZXNzIHx8ICFzZV9sdW4pIHsKKwkJcHJfZXJyKCJTUEMtMyBQUjogc2Vfc2VzcyB8fCBzdHJ1Y3Qgc2VfbHVuIGlzIE5VTEwhXG4iKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOwogCX0KIAkvKgogCSAqIExvY2F0ZSB0aGUgZXhpc3RpbmcgKnByX3JlZyB2aWEgc3RydWN0IHNlX25vZGVfYWNsIHBvaW50ZXJzCiAJICovCiAJcHJfcmVnID0gY29yZV9zY3NpM19sb2NhdGVfcHJfcmVnKGRldiwgc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wsIHNlX3Nlc3MpOwotCWlmICghKHByX3JlZykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUjogVW5hYmxlIHRvIGxvY2F0ZSIKKwlpZiAoIXByX3JlZykgeworCQlwcl9lcnIoIlNQQy0zIFBSOiBVbmFibGUgdG8gbG9jYXRlIgogCQkJIiBQUl9SRUdJU1RFUkVEICpwcl9yZWcgZm9yIFJFTEVBU0VcbiIpOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CiAJfQpAQCAtMjY0MSw3ICsyNjQ3LDcgQEAKIAkgKi8KIAlzcGluX2xvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCXByX3Jlc19ob2xkZXIgPSBkZXYtPmRldl9wcl9yZXNfaG9sZGVyOwotCWlmICghKHByX3Jlc19ob2xkZXIpKSB7CisJaWYgKCFwcl9yZXNfaG9sZGVyKSB7CiAJCS8qCiAJCSAqIE5vIHBlcnNpc3RlbnQgcmVzZXJ2YXRpb24sIHJldHVybiBHT09EIHN0YXR1cy4KIAkJICovCkBAIC0yNjc4LDcgKzI2ODQsNyBAQAogCSAqCSAgdGhhdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGxvZ2ljYWwgdW5pdCBmb3IgdGhlIElfVCBuZXh1czsKIAkgKi8KIAlpZiAocmVzX2tleSAhPSBwcl9yZWctPnByX3Jlc19rZXkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUiBSRUxFQVNFOiBSZWNlaXZlZCByZXNfa2V5OiAweCUwMTZMeCIKKwkJcHJfZXJyKCJTUEMtMyBQUiBSRUxFQVNFOiBSZWNlaXZlZCByZXNfa2V5OiAweCUwMTZMeCIKIAkJCSIgZG9lcyBub3QgbWF0Y2ggZXhpc3RpbmcgU0EgUkVHSVNURVIgcmVzX2tleToiCiAJCQkiIDB4JTAxNkx4XG4iLCByZXNfa2V5LCBwcl9yZWctPnByX3Jlc19rZXkpOwogCQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CkBAIC0yNjk0LDEzICsyNzAwLDEzIEBACiAJaWYgKChwcl9yZXNfaG9sZGVyLT5wcl9yZXNfdHlwZSAhPSB0eXBlKSB8fAogCSAgICAocHJfcmVzX2hvbGRlci0+cHJfcmVzX3Njb3BlICE9IHNjb3BlKSkgewogCQlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKnByX3Jlc19uYWNsID0gcHJfcmVzX2hvbGRlci0+cHJfcmVnX25hY2w7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1BDLTMgUFIgUkVMRUFTRTogQXR0ZW1wdGVkIHRvIHJlbGVhc2UiCisJCXByX2VycigiU1BDLTMgUFIgUkVMRUFTRTogQXR0ZW1wdGVkIHRvIHJlbGVhc2UiCiAJCQkiIHJlc2VydmF0aW9uIGZyb20gWyVzXTogJXMgd2l0aCBkaWZmZXJlbnQgVFlQRSAiCiAJCQkiYW5kL29yIFNDT1BFICB3aGlsZSByZXNlcnZhdGlvbiBhbHJlYWR5IGhlbGQgYnkiCiAJCQkiIFslc106ICVzLCByZXR1cm5pbmcgUkVTRVJWQVRJT05fQ09ORkxJQ1RcbiIsCi0JCQlDTURfVEZPKGNtZCktPmdldF9mYWJyaWNfbmFtZSgpLAorCQkJY21kLT5zZV90Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUsCi0JCQlUUEdfVEZPKHByX3Jlc19uYWNsLT5zZV90cGcpLT5nZXRfZmFicmljX25hbWUoKSwKKwkJCXByX3Jlc19uYWNsLT5zZV90cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJcHJfcmVzX2hvbGRlci0+cHJfcmVnX25hY2wtPmluaXRpYXRvcm5hbWUpOwogCiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKQEAgLTI3NTgsMTEgKzI3NjQsMTEgQEAKIAogd3JpdGVfYXB0cGw6CiAJaWYgKHByX3RtcGwtPnByX2FwdHBsX2FjdGl2ZSkgewotCQlyZXQgPSBjb3JlX3Njc2kzX3VwZGF0ZV9hbmRfd3JpdGVfYXB0cGwoU0VfREVWKGNtZCksCisJCXJldCA9IGNvcmVfc2NzaTNfdXBkYXRlX2FuZF93cml0ZV9hcHRwbChjbWQtPnNlX2RldiwKIAkJCQkmcHJfcmVnLT5wcl9hcHRwbF9idWZbMF0sCiAJCQkJcHJfdG1wbC0+cHJfYXB0cGxfYnVmX2xlbik7Ci0JCWlmICghKHJldCkpCi0JCQlwcmludGsoIlNQQy0zIFBSOiBVcGRhdGVkIEFQVFBMIG1ldGFkYXRhIGZvciBSRUxFQVNFXG4iKTsKKwkJaWYgKCFyZXQpCisJCQlwcl9kZWJ1ZygiU1BDLTMgUFI6IFVwZGF0ZWQgQVBUUEwgbWV0YWRhdGEgZm9yIFJFTEVBU0VcbiIpOwogCX0KIAogCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwpAQCAtMjc3NSwxOCArMjc4MSwxOCBAQAogewogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXN0cnVjdCBzZV9ub2RlX2FjbCAqcHJfcmVnX25hY2w7Ci0Jc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MgPSBTRV9TRVNTKGNtZCk7Ci0Jc3RydWN0IHQxMF9yZXNlcnZhdGlvbl90ZW1wbGF0ZSAqcHJfdG1wbCA9ICZTVV9ERVYoZGV2KS0+dDEwX3Jlc2VydmF0aW9uOworCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gY21kLT5zZV9zZXNzOworCXN0cnVjdCB0MTBfcmVzZXJ2YXRpb24gKnByX3RtcGwgPSAmZGV2LT5zZV9zdWJfZGV2LT50MTBfcHI7CiAJc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24gKnByX3JlZywgKnByX3JlZ190bXAsICpwcl9yZWdfbiwgKnByX3Jlc19ob2xkZXI7CiAJdTMyIHByX3Jlc19tYXBwZWRfbHVuID0gMDsKIAlpbnQgY2FsbGluZ19pdF9uZXh1cyA9IDA7CiAJLyoKIAkgKiBMb2NhdGUgdGhlIGV4aXN0aW5nICpwcl9yZWcgdmlhIHN0cnVjdCBzZV9ub2RlX2FjbCBwb2ludGVycwogCSAqLwotCXByX3JlZ19uID0gY29yZV9zY3NpM19sb2NhdGVfcHJfcmVnKFNFX0RFVihjbWQpLAorCXByX3JlZ19uID0gY29yZV9zY3NpM19sb2NhdGVfcHJfcmVnKGNtZC0+c2VfZGV2LAogCQkJc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wsIHNlX3Nlc3MpOwotCWlmICghKHByX3JlZ19uKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNQQy0zIFBSOiBVbmFibGUgdG8gbG9jYXRlIgorCWlmICghcHJfcmVnX24pIHsKKwkJcHJfZXJyKCJTUEMtMyBQUjogVW5hYmxlIHRvIGxvY2F0ZSIKIAkJCSIgUFJfUkVHSVNURVJFRCAqcHJfcmVnIGZvciBDTEVBUlxuIik7CiAJCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CiAJfQpAQCAtMjgwMiw3ICsyODA4LDcgQEAKIAkgKiAJICAgdGhhdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGxvZ2ljYWwgdW5pdCBmb3IgdGhlIElfVCBuZXh1cy4KIAkgKi8KIAlpZiAocmVzX2tleSAhPSBwcl9yZWdfbi0+cHJfcmVzX2tleSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNQQy0zIFBSIFJFR0lTVEVSOiBSZWNlaXZlZCIKKwkJcHJfZXJyKCJTUEMtMyBQUiBSRUdJU1RFUjogUmVjZWl2ZWQiCiAJCQkiIHJlc19rZXk6IDB4JTAxNkx4IGRvZXMgbm90IG1hdGNoIgogCQkJIiBleGlzdGluZyBTQSBSRUdJU1RFUiByZXNfa2V5OiIKIAkJCSIgMHglMDE2THhcbiIsIHJlc19rZXksIHByX3JlZ19uLT5wcl9yZXNfa2V5KTsKQEAgLTI4MzksMTggKzI4NDUsMTggQEAKIAkJICogICAgY29tbWFuZCB3aXRoIENMRUFSIHNlcnZpY2UgYWN0aW9uIHdhcyByZWNlaXZlZCwgd2l0aCB0aGUKIAkJICogICAgYWRkaXRpb25hbCBzZW5zZSBjb2RlIHNldCB0byBSRVNFUlZBVElPTlMgUFJFRU1QVEVELgogCQkgKi8KLQkJaWYgKCEoY2FsbGluZ19pdF9uZXh1cykpCisJCWlmICghY2FsbGluZ19pdF9uZXh1cykKIAkJCWNvcmVfc2NzaTNfdWFfYWxsb2NhdGUocHJfcmVnX25hY2wsIHByX3Jlc19tYXBwZWRfbHVuLAogCQkJCTB4MkEsIEFTQ1FfMkFIX1JFU0VSVkFUSU9OU19QUkVFTVBURUQpOwogCX0KIAlzcGluX3VubG9jaygmcHJfdG1wbC0+cmVnaXN0cmF0aW9uX2xvY2spOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiU1BDLTMgUFIgWyVzXSBTZXJ2aWNlIEFjdGlvbjogQ0xFQVIgY29tcGxldGVcbiIsCi0JCUNNRF9URk8oY21kKS0+Z2V0X2ZhYnJpY19uYW1lKCkpOworCXByX2RlYnVnKCJTUEMtMyBQUiBbJXNdIFNlcnZpY2UgQWN0aW9uOiBDTEVBUiBjb21wbGV0ZVxuIiwKKwkJY21kLT5zZV90Zm8tPmdldF9mYWJyaWNfbmFtZSgpKTsKIAogCWlmIChwcl90bXBsLT5wcl9hcHRwbF9hY3RpdmUpIHsKLQkJY29yZV9zY3NpM191cGRhdGVfYW5kX3dyaXRlX2FwdHBsKFNFX0RFVihjbWQpLCBOVUxMLCAwKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiU1BDLTMgUFI6IFVwZGF0ZWQgQVBUUEwgbWV0YWRhdGEiCisJCWNvcmVfc2NzaTNfdXBkYXRlX2FuZF93cml0ZV9hcHRwbChjbWQtPnNlX2RldiwgTlVMTCwgMCk7CisJCXByX2RlYnVnKCJTUEMtMyBQUjogVXBkYXRlZCBBUFRQTCBtZXRhZGF0YSIKIAkJCQkiIGZvciBDTEVBUlxuIik7CiAJfQogCkBAIC0yODg5LDEyICsyODk1LDEyIEBACiAJcHJfcmVnLT5wcl9yZXNfdHlwZSA9IHR5cGU7CiAJcHJfcmVnLT5wcl9yZXNfc2NvcGUgPSBzY29wZTsKIAotCXByaW50ayhLRVJOX0lORk8gIlNQQy0zIFBSIFslc10gU2VydmljZSBBY3Rpb246IFBSRUVNUFQlcyBjcmVhdGVkIG5ldyIKKwlwcl9kZWJ1ZygiU1BDLTMgUFIgWyVzXSBTZXJ2aWNlIEFjdGlvbjogUFJFRU1QVCVzIGNyZWF0ZWQgbmV3IgogCQkiIHJlc2VydmF0aW9uIGhvbGRlciBUWVBFOiAlcyBBTExfVEdfUFQ6ICVkXG4iLAogCQl0Zm8tPmdldF9mYWJyaWNfbmFtZSgpLCAoYWJvcnQpID8gIl9BTkRfQUJPUlQiIDogIiIsCiAJCWNvcmVfc2NzaTNfcHJfZHVtcF90eXBlKHR5cGUpLAogCQkocHJfcmVnLT5wcl9yZWdfYWxsX3RnX3B0KSA/IDEgOiAwKTsKLQlwcmludGsoS0VSTl9JTkZPICJTUEMtMyBQUiBbJXNdIFBSRUVNUFQlcyBmcm9tIE5vZGU6ICVzJXNcbiIsCisJcHJfZGVidWcoIlNQQy0zIFBSIFslc10gUFJFRU1QVCVzIGZyb20gTm9kZTogJXMlc1xuIiwKIAkJdGZvLT5nZXRfZmFicmljX25hbWUoKSwgKGFib3J0KSA/ICJfQU5EX0FCT1JUIiA6ICIiLAogCQluYWNsLT5pbml0aWF0b3JuYW1lLCAocHJmX2lzaWQpID8gJmlfYnVmWzBdIDogIiIpOwogCS8qCkBAIC0yOTIwLDcgKzI5MjYsNyBAQAogCQlpZiAocHJfcmVnX2hvbGRlciA9PSBwcl9yZWcpCiAJCQljb250aW51ZTsKIAkJaWYgKHByX3JlZy0+cHJfcmVzX2hvbGRlcikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHJfcmVnLT5wcl9yZXNfaG9sZGVyIHN0aWxsIHNldFxuIik7CisJCQlwcl93YXJuKCJwcl9yZWctPnByX3Jlc19ob2xkZXIgc3RpbGwgc2V0XG4iKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTI5NTQsMjUgKzI5NjAsMjUgQEAKIAl1NjQgc2FfcmVzX2tleSwKIAlpbnQgYWJvcnQpCiB7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfREVWKGNtZCk7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAJc3RydWN0IHNlX2Rldl9lbnRyeSAqc2VfZGV2ZTsKIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKnByX3JlZ19uYWNsOwotCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gU0VfU0VTUyhjbWQpOworCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gY21kLT5zZV9zZXNzOwogCXN0cnVjdCBsaXN0X2hlYWQgcHJlZW1wdF9hbmRfYWJvcnRfbGlzdDsKIAlzdHJ1Y3QgdDEwX3ByX3JlZ2lzdHJhdGlvbiAqcHJfcmVnLCAqcHJfcmVnX3RtcCwgKnByX3JlZ19uLCAqcHJfcmVzX2hvbGRlcjsKLQlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uX3RlbXBsYXRlICpwcl90bXBsID0gJlNVX0RFVihkZXYpLT50MTBfcmVzZXJ2YXRpb247CisJc3RydWN0IHQxMF9yZXNlcnZhdGlvbiAqcHJfdG1wbCA9ICZkZXYtPnNlX3N1Yl9kZXYtPnQxMF9wcjsKIAl1MzIgcHJfcmVzX21hcHBlZF9sdW4gPSAwOwogCWludCBhbGxfcmVnID0gMCwgY2FsbGluZ19pdF9uZXh1cyA9IDAsIHJlbGVhc2VkX3JlZ3MgPSAwOwogCWludCBwcmhfdHlwZSA9IDAsIHByaF9zY29wZSA9IDAsIHJldDsKIAotCWlmICghKHNlX3Nlc3MpKQorCWlmICghc2Vfc2VzcykKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOwogCiAJc2VfZGV2ZSA9ICZzZV9zZXNzLT5zZV9ub2RlX2FjbC0+ZGV2aWNlX2xpc3RbY21kLT5vcmlnX2ZlX2x1bl07Ci0JcHJfcmVnX24gPSBjb3JlX3Njc2kzX2xvY2F0ZV9wcl9yZWcoU0VfREVWKGNtZCksIHNlX3Nlc3MtPnNlX25vZGVfYWNsLAorCXByX3JlZ19uID0gY29yZV9zY3NpM19sb2NhdGVfcHJfcmVnKGNtZC0+c2VfZGV2LCBzZV9zZXNzLT5zZV9ub2RlX2FjbCwKIAkJCQlzZV9zZXNzKTsKLQlpZiAoIShwcl9yZWdfbikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUjogVW5hYmxlIHRvIGxvY2F0ZSIKKwlpZiAoIXByX3JlZ19uKSB7CisJCXByX2VycigiU1BDLTMgUFI6IFVuYWJsZSB0byBsb2NhdGUiCiAJCQkiIFBSX1JFR0lTVEVSRUQgKnByX3JlZyBmb3IgUFJFRU1QVCVzXG4iLAogCQkJKGFib3J0KSA/ICJfQU5EX0FCT1JUIiA6ICIiKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CkBAIC0yOTgyLDcgKzI5ODgsNyBAQAogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9SRVNFUlZBVElPTl9DT05GTElDVDsKIAl9CiAJaWYgKHNjb3BlICE9IFBSX1NDT1BFX0xVX1NDT1BFKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1BDLTMgUFI6IElsbGVnYWwgU0NPUEU6IDB4JTAyeFxuIiwgc2NvcGUpOworCQlwcl9lcnIoIlNQQy0zIFBSOiBJbGxlZ2FsIFNDT1BFOiAweCUwMnhcbiIsIHNjb3BlKTsKIAkJY29yZV9zY3NpM19wdXRfcHJfcmVnKHByX3JlZ19uKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKIAl9CkBAIC0yOTk1LDcgKzMwMDEsNyBAQAogCSAgICAocHJfcmVzX2hvbGRlci0+cHJfcmVzX3R5cGUgPT0gUFJfVFlQRV9FWENMVVNJVkVfQUNDRVNTX0FMTFJFRykpKQogCQlhbGxfcmVnID0gMTsKIAotCWlmICghKGFsbF9yZWcpICYmICEoc2FfcmVzX2tleSkpIHsKKwlpZiAoIWFsbF9yZWcgJiYgIXNhX3Jlc19rZXkpIHsKIAkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnX24pOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOwpAQCAtMzAwOSw3ICszMDE1LDcgQEAKIAkgKiBzZXJ2ZXIgc2hhbGwgcGVyZm9ybSBhIHByZWVtcHQgYnkgZG9pbmcgdGhlIGZvbGxvd2luZyBpbiBhbgogCSAqIHVuaW50ZXJydXB0ZWQgc2VyaWVzIG9mIGFjdGlvbnMuIChTZWUgYmVsb3cuLikKIAkgKi8KLQlpZiAoIShwcl9yZXNfaG9sZGVyKSB8fCAocHJfcmVzX2hvbGRlci0+cHJfcmVzX2tleSAhPSBzYV9yZXNfa2V5KSkgeworCWlmICghcHJfcmVzX2hvbGRlciB8fCAocHJfcmVzX2hvbGRlci0+cHJfcmVzX2tleSAhPSBzYV9yZXNfa2V5KSkgewogCQkvKgogCQkgKiBObyBleGlzdGluZyBvciBTQSBSZXNlcnZhdGlvbiBLZXkgbWF0Y2hpbmcgcmVzZXJ2YXRpb25zLi4KIAkJICoKQEAgLTMwMzYsNyArMzA0Miw3IEBACiAJCQkgKiAgICB3YXMgcmVjZWl2ZWQsIHdpdGggdGhlIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSBzZXQKIAkJCSAqICAgIHRvIFJFR0lTVFJBVElPTlMgUFJFRU1QVEVELgogCQkJICovCi0JCQlpZiAoIShhbGxfcmVnKSkgeworCQkJaWYgKCFhbGxfcmVnKSB7CiAJCQkJaWYgKHByX3JlZy0+cHJfcmVzX2tleSAhPSBzYV9yZXNfa2V5KQogCQkJCQljb250aW51ZTsKIApAQCAtMzA3Niw3ICszMDgyLDcgQEAKIAkJCQkJCU5VTEwsIDApOwogCQkJCXJlbGVhc2VkX3JlZ3MrKzsKIAkJCX0KLQkJCWlmICghKGNhbGxpbmdfaXRfbmV4dXMpKQorCQkJaWYgKCFjYWxsaW5nX2l0X25leHVzKQogCQkJCWNvcmVfc2NzaTNfdWFfYWxsb2NhdGUocHJfcmVnX25hY2wsCiAJCQkJCXByX3Jlc19tYXBwZWRfbHVuLCAweDJBLAogCQkJCQlBU0NRXzJBSF9SRVNFUlZBVElPTlNfUFJFRU1QVEVEKTsKQEAgLTMwODksNyArMzA5NSw3IEBACiAJCSAqIHJlZ2lzdGVyZWQgcmVzZXJ2YXRpb24ga2V5LCB0aGVuIHRoZSBkZXZpY2Ugc2VydmVyIHNoYWxsCiAJCSAqIGNvbXBsZXRlIHRoZSBjb21tYW5kIHdpdGggUkVTRVJWQVRJT04gQ09ORkxJQ1Qgc3RhdHVzLgogCQkgKi8KLQkJaWYgKCEocmVsZWFzZWRfcmVncykpIHsKKwkJaWYgKCFyZWxlYXNlZF9yZWdzKSB7CiAJCQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CiAJCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnX24pOwogCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CkBAIC0zMTExLDE3ICszMTE3LDE3IEBACiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAogCQlpZiAocHJfdG1wbC0+cHJfYXB0cGxfYWN0aXZlKSB7Ci0JCQlyZXQgPSBjb3JlX3Njc2kzX3VwZGF0ZV9hbmRfd3JpdGVfYXB0cGwoU0VfREVWKGNtZCksCisJCQlyZXQgPSBjb3JlX3Njc2kzX3VwZGF0ZV9hbmRfd3JpdGVfYXB0cGwoY21kLT5zZV9kZXYsCiAJCQkJCSZwcl9yZWdfbi0+cHJfYXB0cGxfYnVmWzBdLAogCQkJCQlwcl90bXBsLT5wcl9hcHRwbF9idWZfbGVuKTsKLQkJCWlmICghKHJldCkpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiU1BDLTMgUFI6IFVwZGF0ZWQgQVBUUEwiCisJCQlpZiAoIXJldCkKKwkJCQlwcl9kZWJ1ZygiU1BDLTMgUFI6IFVwZGF0ZWQgQVBUUEwiCiAJCQkJCSIgbWV0YWRhdGEgZm9yICBQUkVFTVBUJXNcbiIsIChhYm9ydCkgPwogCQkJCQkiX0FORF9BQk9SVCIgOiAiIik7CiAJCX0KIAogCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnX24pOwotCQljb3JlX3Njc2kzX3ByX2dlbmVyYXRpb24oU0VfREVWKGNtZCkpOworCQljb3JlX3Njc2kzX3ByX2dlbmVyYXRpb24oY21kLT5zZV9kZXYpOwogCQlyZXR1cm4gMDsKIAl9CiAJLyoKQEAgLTMyNDcsMTYgKzMyNTMsMTYgQEAKIAl9CiAKIAlpZiAocHJfdG1wbC0+cHJfYXB0cGxfYWN0aXZlKSB7Ci0JCXJldCA9IGNvcmVfc2NzaTNfdXBkYXRlX2FuZF93cml0ZV9hcHRwbChTRV9ERVYoY21kKSwKKwkJcmV0ID0gY29yZV9zY3NpM191cGRhdGVfYW5kX3dyaXRlX2FwdHBsKGNtZC0+c2VfZGV2LAogCQkJCSZwcl9yZWdfbi0+cHJfYXB0cGxfYnVmWzBdLAogCQkJCXByX3RtcGwtPnByX2FwdHBsX2J1Zl9sZW4pOwotCQlpZiAoIShyZXQpKQotCQkJcHJpbnRrKCJTUEMtMyBQUjogVXBkYXRlZCBBUFRQTCBtZXRhZGF0YSBmb3IgUFJFRU1QVCIKKwkJaWYgKCFyZXQpCisJCQlwcl9kZWJ1ZygiU1BDLTMgUFI6IFVwZGF0ZWQgQVBUUEwgbWV0YWRhdGEgZm9yIFBSRUVNUFQiCiAJCQkJIiVzXG4iLCAoYWJvcnQpID8gIl9BTkRfQUJPUlQiIDogIiIpOwogCX0KIAogCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWdfbik7Ci0JY29yZV9zY3NpM19wcl9nZW5lcmF0aW9uKFNFX0RFVihjbWQpKTsKKwljb3JlX3Njc2kzX3ByX2dlbmVyYXRpb24oY21kLT5zZV9kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0zMjgxLDcgKzMyODcsNyBAQAogCQkJCXJlc19rZXksIHNhX3Jlc19rZXksIGFib3J0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUjogVW5rbm93biBTZXJ2aWNlIEFjdGlvbiBQUkVFTVBUJXMiCisJCXByX2VycigiU1BDLTMgUFI6IFVua25vd24gU2VydmljZSBBY3Rpb24gUFJFRU1QVCVzIgogCQkJIiBUeXBlOiAweCUwMnhcbiIsIChhYm9ydCkgPyAiX0FORF9BQk9SVCIgOiAiIiwgdHlwZSk7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfQ0RCX0ZJRUxEOwogCX0KQEAgLTMyOTcsMTcgKzMzMDMsMTcgQEAKIAlpbnQgYXB0cGwsCiAJaW50IHVucmVnKQogewotCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gU0VfU0VTUyhjbWQpOwotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0RFVihjbWQpOworCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzID0gY21kLT5zZV9zZXNzOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXN0cnVjdCBzZV9kZXZfZW50cnkgKnNlX2RldmUsICpkZXN0X3NlX2RldmUgPSBOVUxMOwotCXN0cnVjdCBzZV9sdW4gKnNlX2x1biA9IFNFX0xVTihjbWQpOworCXN0cnVjdCBzZV9sdW4gKnNlX2x1biA9IGNtZC0+c2VfbHVuOwogCXN0cnVjdCBzZV9ub2RlX2FjbCAqcHJfcmVzX25hY2wsICpwcl9yZWdfbmFjbCwgKmRlc3Rfbm9kZV9hY2wgPSBOVUxMOwogCXN0cnVjdCBzZV9wb3J0ICpzZV9wb3J0OwogCXN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKnNlX3RwZywgKmRlc3Rfc2VfdHBnID0gTlVMTDsKIAlzdHJ1Y3QgdGFyZ2V0X2NvcmVfZmFicmljX29wcyAqZGVzdF90Zl9vcHMgPSBOVUxMLCAqdGZfb3BzOwogCXN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uICpwcl9yZWcsICpwcl9yZXNfaG9sZGVyLCAqZGVzdF9wcl9yZWc7Ci0Jc3RydWN0IHQxMF9yZXNlcnZhdGlvbl90ZW1wbGF0ZSAqcHJfdG1wbCA9ICZTVV9ERVYoZGV2KS0+dDEwX3Jlc2VydmF0aW9uOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopVF9UQVNLKGNtZCktPnRfdGFza19idWY7CisJc3RydWN0IHQxMF9yZXNlcnZhdGlvbiAqcHJfdG1wbCA9ICZkZXYtPnNlX3N1Yl9kZXYtPnQxMF9wcjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CiAJdW5zaWduZWQgY2hhciAqaW5pdGlhdG9yX3N0cjsKIAljaGFyICppcG9ydF9wdHIgPSBOVUxMLCBkZXN0X2lwb3J0WzY0XSwgaV9idWZbUFJfUkVHX0lTSURfSURfTEVOXTsKIAl1MzIgdGlkX2xlbiwgdG1wX3RpZF9sZW47CkBAIC0zMzE1LDE0ICszMzIxLDE0IEBACiAJdW5zaWduZWQgc2hvcnQgcnRwaTsKIAl1bnNpZ25lZCBjaGFyIHByb3RvX2lkZW50OwogCi0JaWYgKCEoc2Vfc2VzcykgfHwgIShzZV9sdW4pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1BDLTMgUFI6IHNlX3Nlc3MgfHwgc3RydWN0IHNlX2x1biBpcyBOVUxMIVxuIik7CisJaWYgKCFzZV9zZXNzIHx8ICFzZV9sdW4pIHsKKwkJcHJfZXJyKCJTUEMtMyBQUjogc2Vfc2VzcyB8fCBzdHJ1Y3Qgc2VfbHVuIGlzIE5VTEwhXG4iKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOwogCX0KIAltZW1zZXQoZGVzdF9pcG9ydCwgMCwgNjQpOwogCW1lbXNldChpX2J1ZiwgMCwgUFJfUkVHX0lTSURfSURfTEVOKTsKIAlzZV90cGcgPSBzZV9zZXNzLT5zZV90cGc7Ci0JdGZfb3BzID0gVFBHX1RGTyhzZV90cGcpOworCXRmX29wcyA9IHNlX3RwZy0+c2VfdHBnX3RmbzsKIAlzZV9kZXZlID0gJnNlX3Nlc3MtPnNlX25vZGVfYWNsLT5kZXZpY2VfbGlzdFtjbWQtPm9yaWdfZmVfbHVuXTsKIAkvKgogCSAqIEZvbGxvdyBsb2dpYyBmcm9tIHNwYzRyMTcgU2VjdGlvbiA1LjcuOCwgVGFibGUgNTAgLS0KQEAgLTMzMzAsMTAgKzMzMzYsMTAgQEAKIAkgKgogCSAqIExvY2F0ZSB0aGUgZXhpc3RpbmcgKnByX3JlZyB2aWEgc3RydWN0IHNlX25vZGVfYWNsIHBvaW50ZXJzCiAJICovCi0JcHJfcmVnID0gY29yZV9zY3NpM19sb2NhdGVfcHJfcmVnKFNFX0RFVihjbWQpLCBzZV9zZXNzLT5zZV9ub2RlX2FjbCwKKwlwcl9yZWcgPSBjb3JlX3Njc2kzX2xvY2F0ZV9wcl9yZWcoY21kLT5zZV9kZXYsIHNlX3Nlc3MtPnNlX25vZGVfYWNsLAogCQkJCXNlX3Nlc3MpOwotCWlmICghKHByX3JlZykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUjogVW5hYmxlIHRvIGxvY2F0ZSBQUl9SRUdJU1RFUkVEIgorCWlmICghcHJfcmVnKSB7CisJCXByX2VycigiU1BDLTMgUFI6IFVuYWJsZSB0byBsb2NhdGUgUFJfUkVHSVNURVJFRCIKIAkJCSIgKnByX3JlZyBmb3IgUkVHSVNURVJfQU5EX01PVkVcbiIpOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CiAJfQpAQCAtMzM0Miw3ICszMzQ4LDcgQEAKIAkgKiBwcm92aWRlZCBkdXJpbmcgdGhpcyBpbml0aWF0b3IncyBJX1QgbmV4dXMgcmVnaXN0cmF0aW9uLgogCSAqLwogCWlmIChyZXNfa2V5ICE9IHByX3JlZy0+cHJfcmVzX2tleSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJTUEMtMyBQUiBSRUdJU1RFUl9BTkRfTU9WRTogUmVjZWl2ZWQiCisJCXByX3dhcm4oIlNQQy0zIFBSIFJFR0lTVEVSX0FORF9NT1ZFOiBSZWNlaXZlZCIKIAkJCSIgcmVzX2tleTogMHglMDE2THggZG9lcyBub3QgbWF0Y2ggZXhpc3RpbmcgU0EgUkVHSVNURVIiCiAJCQkiIHJlc19rZXk6IDB4JTAxNkx4XG4iLCByZXNfa2V5LCBwcl9yZWctPnByX3Jlc19rZXkpOwogCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKQEAgLTMzNTEsMjYgKzMzNTcsMzAgQEAKIAkvKgogCSAqIFRoZSBzZXJ2aWNlIGFjdGl2ZSByZXNlcnZhdGlvbiBrZXkgbmVlZHMgdG8gYmUgbm9uIHplcm8KIAkgKi8KLQlpZiAoIShzYV9yZXNfa2V5KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJTUEMtMyBQUiBSRUdJU1RFUl9BTkRfTU9WRTogUmVjZWl2ZWQgemVybyIKKwlpZiAoIXNhX3Jlc19rZXkpIHsKKwkJcHJfd2FybigiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IFJlY2VpdmVkIHplcm8iCiAJCQkiIHNhX3Jlc19rZXlcbiIpOwogCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKIAl9CisKIAkvKgogCSAqIERldGVybWluZSB0aGUgUmVsYXRpdmUgVGFyZ2V0IFBvcnQgSWRlbnRpZmllciB3aGVyZSB0aGUgcmVzZXJ2YXRpb24KIAkgKiB3aWxsIGJlIG1vdmVkIHRvIGZvciB0aGUgVHJhbnNwb3J0SUQgY29udGFpbmluZyBTQ1NJIGluaXRpYXRvciBXV04KIAkgKiBpbmZvcm1hdGlvbi4KIAkgKi8KKwlidWYgPSB0cmFuc3BvcnRfa21hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKIAlydHBpID0gKGJ1ZlsxOF0gJiAweGZmKSA8PCA4OwogCXJ0cGkgfD0gYnVmWzE5XSAmIDB4ZmY7CiAJdGlkX2xlbiA9IChidWZbMjBdICYgMHhmZikgPDwgMjQ7CiAJdGlkX2xlbiB8PSAoYnVmWzIxXSAmIDB4ZmYpIDw8IDE2OwogCXRpZF9sZW4gfD0gKGJ1ZlsyMl0gJiAweGZmKSA8PCA4OwogCXRpZF9sZW4gfD0gYnVmWzIzXSAmIDB4ZmY7CisJdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKKwlidWYgPSBOVUxMOwogCiAJaWYgKCh0aWRfbGVuICsgMjQpICE9IGNtZC0+ZGF0YV9sZW5ndGgpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUjogSWxsZWdhbCB0aWRfbGVuOiAldSArIDI0IGJ5dGUgaGVhZGVyIgorCQlwcl9lcnIoIlNQQy0zIFBSOiBJbGxlZ2FsIHRpZF9sZW46ICV1ICsgMjQgYnl0ZSBoZWFkZXIiCiAJCQkiIGRvZXMgbm90IGVxdWFsIENEQiBkYXRhX2xlbmd0aDogJXVcbiIsIHRpZF9sZW4sCiAJCQljbWQtPmRhdGFfbGVuZ3RoKTsKIAkJY29yZV9zY3NpM19wdXRfcHJfcmVnKHByX3JlZyk7CkBAIC0zMzgyLDEwICszMzkyLDEwIEBACiAJCWlmIChzZV9wb3J0LT5zZXBfcnRwaSAhPSBydHBpKQogCQkJY29udGludWU7CiAJCWRlc3Rfc2VfdHBnID0gc2VfcG9ydC0+c2VwX3RwZzsKLQkJaWYgKCEoZGVzdF9zZV90cGcpKQorCQlpZiAoIWRlc3Rfc2VfdHBnKQogCQkJY29udGludWU7Ci0JCWRlc3RfdGZfb3BzID0gVFBHX1RGTyhkZXN0X3NlX3RwZyk7Ci0JCWlmICghKGRlc3RfdGZfb3BzKSkKKwkJZGVzdF90Zl9vcHMgPSBkZXN0X3NlX3RwZy0+c2VfdHBnX3RmbzsKKwkJaWYgKCFkZXN0X3RmX29wcykKIAkJCWNvbnRpbnVlOwogCiAJCWF0b21pY19pbmMoJmRlc3Rfc2VfdHBnLT50cGdfcHJfcmVmX2NvdW50KTsKQEAgLTMzOTQsNyArMzQwNCw3IEBACiAKIAkJcmV0ID0gY29yZV9zY3NpM190cGdfZGVwZW5kX2l0ZW0oZGVzdF9zZV90cGcpOwogCQlpZiAocmV0ICE9IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiY29yZV9zY3NpM190cGdfZGVwZW5kX2l0ZW0oKSBmYWlsZWQiCisJCQlwcl9lcnIoImNvcmVfc2NzaTNfdHBnX2RlcGVuZF9pdGVtKCkgZmFpbGVkIgogCQkJCSIgZm9yIGRlc3Rfc2VfdHBnXG4iKTsKIAkJCWF0b21pY19kZWMoJmRlc3Rfc2VfdHBnLT50cGdfcHJfcmVmX2NvdW50KTsKIAkJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpOwpAQCAtMzQwNywyMCArMzQxNywyMiBAQAogCX0KIAlzcGluX3VubG9jaygmZGV2LT5zZV9wb3J0X2xvY2spOwogCi0JaWYgKCEoZGVzdF9zZV90cGcpIHx8ICghZGVzdF90Zl9vcHMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IFVuYWJsZSB0byBsb2NhdGUiCisJaWYgKCFkZXN0X3NlX3RwZyB8fCAhZGVzdF90Zl9vcHMpIHsKKwkJcHJfZXJyKCJTUEMtMyBQUiBSRUdJU1RFUl9BTkRfTU9WRTogVW5hYmxlIHRvIGxvY2F0ZSIKIAkJCSIgZmFicmljIG9wcyBmcm9tIFJlbGF0aXZlIFRhcmdldCBQb3J0IElkZW50aWZpZXI6IgogCQkJIiAlaHVcbiIsIHJ0cGkpOwogCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKIAl9CisKKwlidWYgPSB0cmFuc3BvcnRfa21hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKIAlwcm90b19pZGVudCA9IChidWZbMjRdICYgMHgwZik7CiAjaWYgMAotCXByaW50aygiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IEV4dHJhY3RlZCBQcm90b2NvbCBJZGVudGlmaWVyOiIKKwlwcl9kZWJ1ZygiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IEV4dHJhY3RlZCBQcm90b2NvbCBJZGVudGlmaWVyOiIKIAkJCSIgMHglMDJ4XG4iLCBwcm90b19pZGVudCk7CiAjZW5kaWYKIAlpZiAocHJvdG9faWRlbnQgIT0gZGVzdF90Zl9vcHMtPmdldF9mYWJyaWNfcHJvdG9faWRlbnQoZGVzdF9zZV90cGcpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IFJlY2VpdmVkIgorCQlwcl9lcnIoIlNQQy0zIFBSIFJFR0lTVEVSX0FORF9NT1ZFOiBSZWNlaXZlZCIKIAkJCSIgcHJvdG9faWRlbnQ6IDB4JTAyeCBkb2VzIG5vdCBtYXRjaCBpZGVudDogMHglMDJ4IgogCQkJIiBmcm9tIGZhYnJpYzogJXNcbiIsIHByb3RvX2lkZW50LAogCQkJZGVzdF90Zl9vcHMtPmdldF9mYWJyaWNfcHJvdG9faWRlbnQoZGVzdF9zZV90cGcpLApAQCAtMzQyOSw3ICszNDQxLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCWlmIChkZXN0X3RmX29wcy0+dHBnX3BhcnNlX3ByX291dF90cmFuc3BvcnRfaWQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlNQQy0zIFBSIFJFR0lTVEVSX0FORF9NT1ZFOiBGYWJyaWMgZG9lcyBub3QiCisJCXByX2VycigiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IEZhYnJpYyBkb2VzIG5vdCIKIAkJCSIgY29udGFpbmcgYSB2YWxpZCB0cGdfcGFyc2VfcHJfb3V0X3RyYW5zcG9ydF9pZCIKIAkJCSIgZnVuY3Rpb24gcG9pbnRlclxuIik7CiAJCXJldCA9IFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOwpAQCAtMzQzNywxNCArMzQ0OSwxNyBAQAogCX0KIAlpbml0aWF0b3Jfc3RyID0gZGVzdF90Zl9vcHMtPnRwZ19wYXJzZV9wcl9vdXRfdHJhbnNwb3J0X2lkKGRlc3Rfc2VfdHBnLAogCQkJKGNvbnN0IGNoYXIgKikmYnVmWzI0XSwgJnRtcF90aWRfbGVuLCAmaXBvcnRfcHRyKTsKLQlpZiAoIShpbml0aWF0b3Jfc3RyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNQQy0zIFBSIFJFR0lTVEVSX0FORF9NT1ZFOiBVbmFibGUgdG8gbG9jYXRlIgorCWlmICghaW5pdGlhdG9yX3N0cikgeworCQlwcl9lcnIoIlNQQy0zIFBSIFJFR0lTVEVSX0FORF9NT1ZFOiBVbmFibGUgdG8gbG9jYXRlIgogCQkJIiBpbml0aWF0b3Jfc3RyIGZyb20gVHJhbnNwb3J0IElEXG4iKTsKIAkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOwogCQlnb3RvIG91dDsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJTUEMtMyBQUiBbJXNdIEV4dHJhY3RlZCBpbml0aWF0b3IgJXMgaWRlbnRpZmllcjogJXMiCisJdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKKwlidWYgPSBOVUxMOworCisJcHJfZGVidWcoIlNQQy0zIFBSIFslc10gRXh0cmFjdGVkIGluaXRpYXRvciAlcyBpZGVudGlmaWVyOiAlcyIKIAkJIiAlc1xuIiwgZGVzdF90Zl9vcHMtPmdldF9mYWJyaWNfbmFtZSgpLCAoaXBvcnRfcHRyICE9IE5VTEwpID8KIAkJInBvcnQiIDogImRldmljZSIsIGluaXRpYXRvcl9zdHIsIChpcG9ydF9wdHIgIT0gTlVMTCkgPwogCQlpcG9ydF9wdHIgOiAiIik7CkBAIC0zNDU5LDE4ICszNDc0LDE4IEBACiAJcHJfcmVnX25hY2wgPSBwcl9yZWctPnByX3JlZ19uYWNsOwogCW1hdGNoaW5nX2luYW1lID0gKCFzdHJjbXAoaW5pdGlhdG9yX3N0ciwKIAkJCQkgIHByX3JlZ19uYWNsLT5pbml0aWF0b3JuYW1lKSkgPyAxIDogMDsKLQlpZiAoIShtYXRjaGluZ19pbmFtZSkpCisJaWYgKCFtYXRjaGluZ19pbmFtZSkKIAkJZ290byBhZnRlcl9pcG9ydF9jaGVjazsKIAotCWlmICghKGlwb3J0X3B0cikgfHwgIShwcl9yZWctPmlzaWRfcHJlc2VudF9hdF9yZWcpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IFRyYW5zcG9ydElEOiAlcyIKKwlpZiAoIWlwb3J0X3B0ciB8fCAhcHJfcmVnLT5pc2lkX3ByZXNlbnRfYXRfcmVnKSB7CisJCXByX2VycigiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IFRyYW5zcG9ydElEOiAlcyIKIAkJCSIgbWF0Y2hlczogJXMgb24gcmVjZWl2ZWQgSV9UIE5leHVzXG4iLCBpbml0aWF0b3Jfc3RyLAogCQkJcHJfcmVnX25hY2wtPmluaXRpYXRvcm5hbWUpOwogCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CiAJCWdvdG8gb3V0OwogCX0KLQlpZiAoIShzdHJjbXAoaXBvcnRfcHRyLCBwcl9yZWctPnByX3JlZ19pc2lkKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTUEMtMyBQUiBSRUdJU1RFUl9BTkRfTU9WRTogVHJhbnNwb3J0SUQ6ICVzICVzIgorCWlmICghc3RyY21wKGlwb3J0X3B0ciwgcHJfcmVnLT5wcl9yZWdfaXNpZCkpIHsKKwkJcHJfZXJyKCJTUEMtMyBQUiBSRUdJU1RFUl9BTkRfTU9WRTogVHJhbnNwb3J0SUQ6ICVzICVzIgogCQkJIiBtYXRjaGVzOiAlcyAlcyBvbiByZWNlaXZlZCBJX1QgTmV4dXNcbiIsCiAJCQlpbml0aWF0b3Jfc3RyLCBpcG9ydF9wdHIsIHByX3JlZ19uYWNsLT5pbml0aWF0b3JuYW1lLAogCQkJcHJfcmVnLT5wcl9yZWdfaXNpZCk7CkBAIC0zNDkwLDggKzM1MDUsOCBAQAogCX0KIAlzcGluX3VubG9ja19iaCgmZGVzdF9zZV90cGctPmFjbF9ub2RlX2xvY2spOwogCi0JaWYgKCEoZGVzdF9ub2RlX2FjbCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlICVzIGRlc3Rfbm9kZV9hY2wgZm9yIgorCWlmICghZGVzdF9ub2RlX2FjbCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgJXMgZGVzdF9ub2RlX2FjbCBmb3IiCiAJCQkiIFRyYW5zcG9ydElEJXNcbiIsIGRlc3RfdGZfb3BzLT5nZXRfZmFicmljX25hbWUoKSwKIAkJCWluaXRpYXRvcl9zdHIpOwogCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CkBAIC0zNDk5LDcgKzM1MTQsNyBAQAogCX0KIAlyZXQgPSBjb3JlX3Njc2kzX25vZGVhY2xfZGVwZW5kX2l0ZW0oZGVzdF9ub2RlX2FjbCk7CiAJaWYgKHJldCAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY29yZV9zY3NpM19ub2RlYWNsX2RlcGVuZF9pdGVtKCkgZm9yIgorCQlwcl9lcnIoImNvcmVfc2NzaTNfbm9kZWFjbF9kZXBlbmRfaXRlbSgpIGZvciIKIAkJCSIgZGVzdF9ub2RlX2FjbFxuIik7CiAJCWF0b21pY19kZWMoJmRlc3Rfbm9kZV9hY2wtPmFjbF9wcl9yZWZfY291bnQpOwogCQlzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKTsKQEAgLTM1MDgsNyArMzUyMyw3IEBACiAJCWdvdG8gb3V0OwogCX0KICNpZiAwCi0JcHJpbnRrKEtFUk5fSU5GTyAiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IEZvdW5kICVzIGRlc3Rfbm9kZV9hY2w6IgorCXByX2RlYnVnKCJTUEMtMyBQUiBSRUdJU1RFUl9BTkRfTU9WRTogRm91bmQgJXMgZGVzdF9ub2RlX2FjbDoiCiAJCSIgJXMgZnJvbSBUcmFuc3BvcnRJRFxuIiwgZGVzdF90Zl9vcHMtPmdldF9mYWJyaWNfbmFtZSgpLAogCQlkZXN0X25vZGVfYWNsLT5pbml0aWF0b3JuYW1lKTsKICNlbmRpZgpAQCAtMzUxNyw4ICszNTMyLDggQEAKIAkgKiBQT1JUIElERU5USUZJRVIuCiAJICovCiAJZGVzdF9zZV9kZXZlID0gY29yZV9nZXRfc2VfZGV2ZV9mcm9tX3J0cGkoZGVzdF9ub2RlX2FjbCwgcnRwaSk7Ci0JaWYgKCEoZGVzdF9zZV9kZXZlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBsb2NhdGUgJXMgZGVzdF9zZV9kZXZlIGZyb20gUlRQSToiCisJaWYgKCFkZXN0X3NlX2RldmUpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlICVzIGRlc3Rfc2VfZGV2ZSBmcm9tIFJUUEk6IgogCQkJIiAlaHVcbiIsICBkZXN0X3RmX29wcy0+Z2V0X2ZhYnJpY19uYW1lKCksIHJ0cGkpOwogCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CiAJCWdvdG8gb3V0OwpAQCAtMzUyNiw3ICszNTQxLDcgQEAKIAogCXJldCA9IGNvcmVfc2NzaTNfbHVuYWNsX2RlcGVuZF9pdGVtKGRlc3Rfc2VfZGV2ZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjb3JlX3Njc2kzX2x1bmFjbF9kZXBlbmRfaXRlbSgpIGZhaWxlZFxuIik7CisJCXByX2VycigiY29yZV9zY3NpM19sdW5hY2xfZGVwZW5kX2l0ZW0oKSBmYWlsZWRcbiIpOwogCQlhdG9taWNfZGVjKCZkZXN0X3NlX2RldmUtPnByX3JlZl9jb3VudCk7CiAJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpOwogCQlkZXN0X3NlX2RldmUgPSBOVUxMOwpAQCAtMzUzNCw3ICszNTQ5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogI2lmIDAKLQlwcmludGsoS0VSTl9JTkZPICJTUEMtMyBQUiBSRUdJU1RFUl9BTkRfTU9WRTogTG9jYXRlZCAlcyBub2RlICVzIExVTiIKKwlwcl9kZWJ1ZygiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IExvY2F0ZWQgJXMgbm9kZSAlcyBMVU4iCiAJCSIgQUNMIGZvciBkZXN0X3NlX2RldmUtPm1hcHBlZF9sdW46ICV1XG4iLAogCQlkZXN0X3RmX29wcy0+Z2V0X2ZhYnJpY19uYW1lKCksIGRlc3Rfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUsCiAJCWRlc3Rfc2VfZGV2ZS0+bWFwcGVkX2x1bik7CkBAIC0zNTQ1LDggKzM1NjAsOCBAQAogCSAqLwogCXNwaW5fbG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CiAJcHJfcmVzX2hvbGRlciA9IGRldi0+ZGV2X3ByX3Jlc19ob2xkZXI7Ci0JaWYgKCEocHJfcmVzX2hvbGRlcikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IE5vIHJlc2VydmF0aW9uIgorCWlmICghcHJfcmVzX2hvbGRlcikgeworCQlwcl93YXJuKCJTUEMtMyBQUiBSRUdJU1RFUl9BTkRfTU9WRTogTm8gcmVzZXJ2YXRpb24iCiAJCQkiIGN1cnJlbnRseSBoZWxkXG4iKTsKIAkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfQ0RCX0ZJRUxEOwpAQCAtMzU1OSw3ICszNTc0LDcgQEAKIAkgKiAJUmVnaXN0ZXIgYmVoYXZpb3JzIGZvciBhIFJFR0lTVEVSIEFORCBNT1ZFIHNlcnZpY2UgYWN0aW9uCiAJICovCiAJaWYgKHByX3Jlc19ob2xkZXIgIT0gcHJfcmVnKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlNQQy0zIFBSIFJFR0lTVEVSX0FORF9NT1ZFOiBDYWxsaW5nIElfVCIKKwkJcHJfd2FybigiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IENhbGxpbmcgSV9UIgogCQkJIiBOZXh1cyBpcyBub3QgcmVzZXJ2YXRpb24gaG9sZGVyXG4iKTsKIAkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCQlyZXQgPSBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOwpAQCAtMzU3Niw3ICszNTkxLDcgQEAKIAkgKi8KIAlpZiAoKHByX3Jlc19ob2xkZXItPnByX3Jlc190eXBlID09IFBSX1RZUEVfV1JJVEVfRVhDTFVTSVZFX0FMTFJFRykgfHwKIAkgICAgKHByX3Jlc19ob2xkZXItPnByX3Jlc190eXBlID09IFBSX1RZUEVfRVhDTFVTSVZFX0FDQ0VTU19BTExSRUcpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlNQQy0zIFBSIFJFR0lTVEVSX0FORF9NT1ZFOiBVbmFibGUgdG8gbW92ZSIKKwkJcHJfd2FybigiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IFVuYWJsZSB0byBtb3ZlIgogCQkJIiByZXNlcnZhdGlvbiBmb3IgdHlwZTogJXNcbiIsCiAJCQljb3JlX3Njc2kzX3ByX2R1bXBfdHlwZShwcl9yZXNfaG9sZGVyLT5wcl9yZXNfdHlwZSkpOwogCQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CkBAIC0zNjExLDggKzM2MjYsOCBAQAogCSAqLwogCWRlc3RfcHJfcmVnID0gX19jb3JlX3Njc2kzX2xvY2F0ZV9wcl9yZWcoZGV2LCBkZXN0X25vZGVfYWNsLAogCQkJCQlpcG9ydF9wdHIpOwotCWlmICghKGRlc3RfcHJfcmVnKSkgewotCQlyZXQgPSBjb3JlX3Njc2kzX2FsbG9jX3JlZ2lzdHJhdGlvbihTRV9ERVYoY21kKSwKKwlpZiAoIWRlc3RfcHJfcmVnKSB7CisJCXJldCA9IGNvcmVfc2NzaTNfYWxsb2NfcmVnaXN0cmF0aW9uKGNtZC0+c2VfZGV2LAogCQkJCWRlc3Rfbm9kZV9hY2wsIGRlc3Rfc2VfZGV2ZSwgaXBvcnRfcHRyLAogCQkJCXNhX3Jlc19rZXksIDAsIGFwdHBsLCAyLCAxKTsKIAkJaWYgKHJldCAhPSAwKSB7CkBAIC0zNjQ0LDE2ICszNjU5LDE2IEBACiAJLyoKIAkgKiBJbmNyZW1lbnQgUFJHZW5lcmF0aW9uIGZvciBleGlzdGluZyByZWdpc3RyYXRpb25zLi4KIAkgKi8KLQlpZiAoIShuZXdfcmVnKSkKKwlpZiAoIW5ld19yZWcpCiAJCWRlc3RfcHJfcmVnLT5wcl9yZXNfZ2VuZXJhdGlvbiA9IHByX3RtcGwtPnByX2dlbmVyYXRpb24rKzsKIAlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJTUEMtMyBQUiBbJXNdIFNlcnZpY2UgQWN0aW9uOiBSRUdJU1RFUl9BTkRfTU9WRSIKKwlwcl9kZWJ1ZygiU1BDLTMgUFIgWyVzXSBTZXJ2aWNlIEFjdGlvbjogUkVHSVNURVJfQU5EX01PVkUiCiAJCSIgY3JlYXRlZCBuZXcgcmVzZXJ2YXRpb24gaG9sZGVyIFRZUEU6ICVzIG9uIG9iamVjdCBSVFBJOiIKIAkJIiAlaHUgIFBSR2VuZXJhdGlvbjogMHglMDh4XG4iLCBkZXN0X3RmX29wcy0+Z2V0X2ZhYnJpY19uYW1lKCksCiAJCWNvcmVfc2NzaTNfcHJfZHVtcF90eXBlKHR5cGUpLCBydHBpLAogCQlkZXN0X3ByX3JlZy0+cHJfcmVzX2dlbmVyYXRpb24pOwotCXByaW50ayhLRVJOX0lORk8gIlNQQy0zIFBSIFN1Y2Nlc3NmdWxseSBtb3ZlZCByZXNlcnZhdGlvbiBmcm9tIgorCXByX2RlYnVnKCJTUEMtMyBQUiBTdWNjZXNzZnVsbHkgbW92ZWQgcmVzZXJ2YXRpb24gZnJvbSIKIAkJIiAlcyBGYWJyaWMgTm9kZTogJXMlcyAtPiAlcyBGYWJyaWMgTm9kZTogJXMgJXNcbiIsCiAJCXRmX29wcy0+Z2V0X2ZhYnJpY19uYW1lKCksIHByX3JlZ19uYWNsLT5pbml0aWF0b3JuYW1lLAogCQkocHJmX2lzaWQpID8gJmlfYnVmWzBdIDogIiIsIGRlc3RfdGZfb3BzLT5nZXRfZmFicmljX25hbWUoKSwKQEAgLTM2ODEsMjQgKzM2OTYsMjggQEAKIAkgKiBDbGVhciB0aGUgQVBUUEwgbWV0YWRhdGEgaWYgQVBUUEwgaGFzIGJlZW4gZGlzYWJsZWQsIG90aGVyd2lzZQogCSAqIHdyaXRlIG91dCB0aGUgdXBkYXRlZCBtZXRhZGF0YSB0byBzdHJ1Y3QgZmlsZSBmb3IgdGhpcyBTQ1NJIGRldmljZS4KIAkgKi8KLQlpZiAoIShhcHRwbCkpIHsKKwlpZiAoIWFwdHBsKSB7CiAJCXByX3RtcGwtPnByX2FwdHBsX2FjdGl2ZSA9IDA7Ci0JCWNvcmVfc2NzaTNfdXBkYXRlX2FuZF93cml0ZV9hcHRwbChTRV9ERVYoY21kKSwgTlVMTCwgMCk7Ci0JCXByaW50aygiU1BDLTMgUFI6IFNldCBBUFRQTCBCaXQgRGVhY3RpdmF0ZWQgZm9yIgorCQljb3JlX3Njc2kzX3VwZGF0ZV9hbmRfd3JpdGVfYXB0cGwoY21kLT5zZV9kZXYsIE5VTEwsIDApOworCQlwcl9kZWJ1ZygiU1BDLTMgUFI6IFNldCBBUFRQTCBCaXQgRGVhY3RpdmF0ZWQgZm9yIgogCQkJCSIgUkVHSVNURVJfQU5EX01PVkVcbiIpOwogCX0gZWxzZSB7CiAJCXByX3RtcGwtPnByX2FwdHBsX2FjdGl2ZSA9IDE7Ci0JCXJldCA9IGNvcmVfc2NzaTNfdXBkYXRlX2FuZF93cml0ZV9hcHRwbChTRV9ERVYoY21kKSwKKwkJcmV0ID0gY29yZV9zY3NpM191cGRhdGVfYW5kX3dyaXRlX2FwdHBsKGNtZC0+c2VfZGV2LAogCQkJCSZkZXN0X3ByX3JlZy0+cHJfYXB0cGxfYnVmWzBdLAogCQkJCXByX3RtcGwtPnByX2FwdHBsX2J1Zl9sZW4pOwotCQlpZiAoIShyZXQpKQotCQkJcHJpbnRrKCJTUEMtMyBQUjogU2V0IEFQVFBMIEJpdCBBY3RpdmF0ZWQgZm9yIgorCQlpZiAoIXJldCkKKwkJCXByX2RlYnVnKCJTUEMtMyBQUjogU2V0IEFQVFBMIEJpdCBBY3RpdmF0ZWQgZm9yIgogCQkJCQkiIFJFR0lTVEVSX0FORF9NT1ZFXG4iKTsKIAl9CiAKKwl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOworCiAJY29yZV9zY3NpM19wdXRfcHJfcmVnKGRlc3RfcHJfcmVnKTsKIAlyZXR1cm4gMDsKIG91dDoKKwlpZiAoYnVmKQorCQl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwogCWlmIChkZXN0X3NlX2RldmUpCiAJCWNvcmVfc2NzaTNfbHVuYWNsX3VuZGVwZW5kX2l0ZW0oZGVzdF9zZV9kZXZlKTsKIAlpZiAoZGVzdF9ub2RlX2FjbCkKQEAgLTM3MjMsNyArMzc0Miw3IEBACiAgKi8KIHN0YXRpYyBpbnQgY29yZV9zY3NpM19lbXVsYXRlX3ByX291dChzdHJ1Y3Qgc2VfY21kICpjbWQsIHVuc2lnbmVkIGNoYXIgKmNkYikKIHsKLQl1bnNpZ25lZCBjaGFyICpidWYgPSAodW5zaWduZWQgY2hhciAqKVRfVEFTSyhjbWQpLT50X3Rhc2tfYnVmOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1NjQgcmVzX2tleSwgc2FfcmVzX2tleTsKIAlpbnQgc2EsIHNjb3BlLCB0eXBlLCBhcHRwbDsKIAlpbnQgc3BlY19pX3B0ID0gMCwgYWxsX3RnX3B0ID0gMCwgdW5yZWcgPSAwOwpAQCAtMzczMSwxMSArMzc1MCwxMSBAQAogCSAqIEZJWE1FOiBBIE5VTEwgc3RydWN0IHNlX3Nlc3Npb24gcG9pbnRlciBtZWFucyBhbiB0aGlzIGlzIG5vdCBjb21pbmcgZnJvbQogCSAqIGEgJEZBQlJJQ19NT0QncyBuZXh1cywgYnV0IGZyb20gaW50ZXJuYWwgcGFzc3Rocm91Z2ggb3BzLgogCSAqLwotCWlmICghKFNFX1NFU1MoY21kKSkpCisJaWYgKCFjbWQtPnNlX3Nlc3MpCiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKIAogCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgMjQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1BDLVBSOiBSZWNlaXZlZCBQUiBPVVQgcGFyYW1ldGVyIGxpc3QiCisJCXByX3dhcm4oIlNQQy1QUjogUmVjZWl2ZWQgUFIgT1VUIHBhcmFtZXRlciBsaXN0IgogCQkJIiBsZW5ndGggdG9vIHNtYWxsOiAldVxuIiwgY21kLT5kYXRhX2xlbmd0aCk7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CiAJfQpAQCAtMzc0NSw2ICszNzY0LDggQEAKIAlzYSA9IChjZGJbMV0gJiAweDFmKTsKIAlzY29wZSA9IChjZGJbMl0gJiAweGYwKTsKIAl0eXBlID0gKGNkYlsyXSAmIDB4MGYpOworCisJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CiAJLyoKIAkgKiBGcm9tIFBFUlNJU1RFTlRfUkVTRVJWRV9PVVQgcGFyYW1ldGVyIGxpc3QgKHBheWxvYWQpCiAJICovCkBAIC0zNzYyLDYgKzM3ODMsOSBAQAogCQlhcHRwbCA9IChidWZbMTddICYgMHgwMSk7CiAJCXVucmVnID0gKGJ1ZlsxN10gJiAweDAyKTsKIAl9CisJdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKKwlidWYgPSBOVUxMOworCiAJLyoKIAkgKiBTUEVDX0lfUFQ9MSBpcyBvbmx5IHZhbGlkIGZvciBTZXJ2aWNlIGFjdGlvbjogUkVHSVNURVIKIAkgKi8KQEAgLTM3NzYsOSArMzgwMCw5IEBACiAJICogdGhlIHNlbnNlIGtleSBzZXQgdG8gSUxMRUdBTCBSRVFVRVNULCBhbmQgdGhlIGFkZGl0aW9uYWwgc2Vuc2UKIAkgKiBjb2RlIHNldCB0byBQQVJBTUVURVIgTElTVCBMRU5HVEggRVJST1IuCiAJICovCi0JaWYgKCEoc3BlY19pX3B0KSAmJiAoKGNkYlsxXSAmIDB4MWYpICE9IFBST19SRUdJU1RFUl9BTkRfTU9WRSkgJiYKKwlpZiAoIXNwZWNfaV9wdCAmJiAoKGNkYlsxXSAmIDB4MWYpICE9IFBST19SRUdJU1RFUl9BTkRfTU9WRSkgJiYKIAkgICAgKGNtZC0+ZGF0YV9sZW5ndGggIT0gMjQpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlNQQy1QUjogUmVjZWl2ZWQgUFIgT1VUIGlsbGVnYWwgcGFyYW1ldGVyIgorCQlwcl93YXJuKCJTUEMtUFI6IFJlY2VpdmVkIFBSIE9VVCBpbGxlZ2FsIHBhcmFtZXRlciIKIAkJCSIgbGlzdCBsZW5ndGg6ICV1XG4iLCBjbWQtPmRhdGFfbGVuZ3RoKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKIAl9CkBAIC0zODEyLDcgKzM4MzYsNyBAQAogCQlyZXR1cm4gY29yZV9zY3NpM19lbXVsYXRlX3Byb19yZWdpc3Rlcl9hbmRfbW92ZShjbWQsIHJlc19rZXksCiAJCQkJc2FfcmVzX2tleSwgYXB0cGwsIHVucmVnKTsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIlVua25vd24gUEVSU0lTVEVOVF9SRVNFUlZFX09VVCBzZXJ2aWNlIgorCQlwcl9lcnIoIlVua25vd24gUEVSU0lTVEVOVF9SRVNFUlZFX09VVCBzZXJ2aWNlIgogCQkJIiBhY3Rpb246IDB4JTAyeFxuIiwgY2RiWzFdICYgMHgxZik7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfQ0RCX0ZJRUxEOwogCX0KQEAgLTM4MjcsMjUgKzM4NTEsMjYgQEAKICAqLwogc3RhdGljIGludCBjb3JlX3Njc2kzX3ByaV9yZWFkX2tleXMoc3RydWN0IHNlX2NtZCAqY21kKQogewotCXN0cnVjdCBzZV9kZXZpY2UgKnNlX2RldiA9IFNFX0RFVihjbWQpOwotCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBTVV9ERVYoc2VfZGV2KTsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpzZV9kZXYgPSBjbWQtPnNlX2RldjsKKwlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gc2VfZGV2LT5zZV9zdWJfZGV2OwogCXN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uICpwcl9yZWc7Ci0JdW5zaWduZWQgY2hhciAqYnVmID0gKHVuc2lnbmVkIGNoYXIgKilUX1RBU0soY21kKS0+dF90YXNrX2J1ZjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CiAJdTMyIGFkZF9sZW4gPSAwLCBvZmYgPSA4OwogCiAJaWYgKGNtZC0+ZGF0YV9sZW5ndGggPCA4KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUFJJTiBTQSBSRUFEX0tFWVMgU0NTSSBEYXRhIExlbmd0aDogJXUiCisJCXByX2VycigiUFJJTiBTQSBSRUFEX0tFWVMgU0NTSSBEYXRhIExlbmd0aDogJXUiCiAJCQkiIHRvbyBzbWFsbFxuIiwgY21kLT5kYXRhX2xlbmd0aCk7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfQ0RCX0ZJRUxEOwogCX0KIAotCWJ1ZlswXSA9ICgoVDEwX1JFUyhzdV9kZXYpLT5wcl9nZW5lcmF0aW9uID4+IDI0KSAmIDB4ZmYpOwotCWJ1ZlsxXSA9ICgoVDEwX1JFUyhzdV9kZXYpLT5wcl9nZW5lcmF0aW9uID4+IDE2KSAmIDB4ZmYpOwotCWJ1ZlsyXSA9ICgoVDEwX1JFUyhzdV9kZXYpLT5wcl9nZW5lcmF0aW9uID4+IDgpICYgMHhmZik7Ci0JYnVmWzNdID0gKFQxMF9SRVMoc3VfZGV2KS0+cHJfZ2VuZXJhdGlvbiAmIDB4ZmYpOworCWJ1ZiA9IHRyYW5zcG9ydF9rbWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOworCWJ1ZlswXSA9ICgoc3VfZGV2LT50MTBfcHIucHJfZ2VuZXJhdGlvbiA+PiAyNCkgJiAweGZmKTsKKwlidWZbMV0gPSAoKHN1X2Rldi0+dDEwX3ByLnByX2dlbmVyYXRpb24gPj4gMTYpICYgMHhmZik7CisJYnVmWzJdID0gKChzdV9kZXYtPnQxMF9wci5wcl9nZW5lcmF0aW9uID4+IDgpICYgMHhmZik7CisJYnVmWzNdID0gKHN1X2Rldi0+dDEwX3ByLnByX2dlbmVyYXRpb24gJiAweGZmKTsKIAotCXNwaW5fbG9jaygmVDEwX1JFUyhzdV9kZXYpLT5yZWdpc3RyYXRpb25fbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwcl9yZWcsICZUMTBfUkVTKHN1X2RldiktPnJlZ2lzdHJhdGlvbl9saXN0LAorCXNwaW5fbG9jaygmc3VfZGV2LT50MTBfcHIucmVnaXN0cmF0aW9uX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocHJfcmVnLCAmc3VfZGV2LT50MTBfcHIucmVnaXN0cmF0aW9uX2xpc3QsCiAJCQlwcl9yZWdfbGlzdCkgewogCQkvKgogCQkgKiBDaGVjayBmb3Igb3ZlcmZsb3cgb2YgOGJ5dGUgUFJJIFJFQURfS0VZUyBwYXlsb2FkIGFuZApAQCAtMzg2NSwxMyArMzg5MCwxNSBAQAogCiAJCWFkZF9sZW4gKz0gODsKIAl9Ci0Jc3Bpbl91bmxvY2soJlQxMF9SRVMoc3VfZGV2KS0+cmVnaXN0cmF0aW9uX2xvY2spOworCXNwaW5fdW5sb2NrKCZzdV9kZXYtPnQxMF9wci5yZWdpc3RyYXRpb25fbG9jayk7CiAKIAlidWZbNF0gPSAoKGFkZF9sZW4gPj4gMjQpICYgMHhmZik7CiAJYnVmWzVdID0gKChhZGRfbGVuID4+IDE2KSAmIDB4ZmYpOwogCWJ1Zls2XSA9ICgoYWRkX2xlbiA+PiA4KSAmIDB4ZmYpOwogCWJ1Zls3XSA9IChhZGRfbGVuICYgMHhmZik7CiAKKwl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM4ODIsMjMgKzM5MDksMjQgQEAKICAqLwogc3RhdGljIGludCBjb3JlX3Njc2kzX3ByaV9yZWFkX3Jlc2VydmF0aW9uKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpzZV9kZXYgPSBTRV9ERVYoY21kKTsKLQlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gU1VfREVWKHNlX2Rldik7CisJc3RydWN0IHNlX2RldmljZSAqc2VfZGV2ID0gY21kLT5zZV9kZXY7CisJc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKnN1X2RldiA9IHNlX2Rldi0+c2Vfc3ViX2RldjsKIAlzdHJ1Y3QgdDEwX3ByX3JlZ2lzdHJhdGlvbiAqcHJfcmVnOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopVF9UQVNLKGNtZCktPnRfdGFza19idWY7CisJdW5zaWduZWQgY2hhciAqYnVmOwogCXU2NCBwcl9yZXNfa2V5OwogCXUzMiBhZGRfbGVuID0gMTY7IC8qIEhhcmRjb2RlZCB0byAxNiB3aGVuIGEgcmVzZXJ2YXRpb24gaXMgaGVsZC4gKi8KIAogCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgOCkgewotCQlwcmludGsoS0VSTl9FUlIgIlBSSU4gU0EgUkVBRF9SRVNFUlZBVElPTlMgU0NTSSBEYXRhIExlbmd0aDogJXUiCisJCXByX2VycigiUFJJTiBTQSBSRUFEX1JFU0VSVkFUSU9OUyBTQ1NJIERhdGEgTGVuZ3RoOiAldSIKIAkJCSIgdG9vIHNtYWxsXG4iLCBjbWQtPmRhdGFfbGVuZ3RoKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7CiAJfQogCi0JYnVmWzBdID0gKChUMTBfUkVTKHN1X2RldiktPnByX2dlbmVyYXRpb24gPj4gMjQpICYgMHhmZik7Ci0JYnVmWzFdID0gKChUMTBfUkVTKHN1X2RldiktPnByX2dlbmVyYXRpb24gPj4gMTYpICYgMHhmZik7Ci0JYnVmWzJdID0gKChUMTBfUkVTKHN1X2RldiktPnByX2dlbmVyYXRpb24gPj4gOCkgJiAweGZmKTsKLQlidWZbM10gPSAoVDEwX1JFUyhzdV9kZXYpLT5wcl9nZW5lcmF0aW9uICYgMHhmZik7CisJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisJYnVmWzBdID0gKChzdV9kZXYtPnQxMF9wci5wcl9nZW5lcmF0aW9uID4+IDI0KSAmIDB4ZmYpOworCWJ1ZlsxXSA9ICgoc3VfZGV2LT50MTBfcHIucHJfZ2VuZXJhdGlvbiA+PiAxNikgJiAweGZmKTsKKwlidWZbMl0gPSAoKHN1X2Rldi0+dDEwX3ByLnByX2dlbmVyYXRpb24gPj4gOCkgJiAweGZmKTsKKwlidWZbM10gPSAoc3VfZGV2LT50MTBfcHIucHJfZ2VuZXJhdGlvbiAmIDB4ZmYpOwogCiAJc3Bpbl9sb2NrKCZzZV9kZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAlwcl9yZWcgPSBzZV9kZXYtPmRldl9wcl9yZXNfaG9sZGVyOwpAQCAtMzkxMSwxMCArMzkzOSw5IEBACiAJCWJ1Zls2XSA9ICgoYWRkX2xlbiA+PiA4KSAmIDB4ZmYpOwogCQlidWZbN10gPSAoYWRkX2xlbiAmIDB4ZmYpOwogCi0JCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgMjIpIHsKLQkJCXNwaW5fdW5sb2NrKCZzZV9kZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKLQkJCXJldHVybiAwOwotCQl9CisJCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgMjIpCisJCQlnb3RvIGVycjsKKwogCQkvKgogCQkgKiBTZXQgdGhlIFJlc2VydmF0aW9uIGtleS4KIAkJICoKQEAgLTM5NTEsNyArMzk3OCwxMCBAQAogCQlidWZbMjFdID0gKHByX3JlZy0+cHJfcmVzX3Njb3BlICYgMHhmMCkgfAogCQkJICAocHJfcmVnLT5wcl9yZXNfdHlwZSAmIDB4MGYpOwogCX0KKworZXJyOgogCXNwaW5fdW5sb2NrKCZzZV9kZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKKwl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zOTYzLDE3ICszOTkzLDE5IEBACiAgKi8KIHN0YXRpYyBpbnQgY29yZV9zY3NpM19wcmlfcmVwb3J0X2NhcGFiaWxpdGllcyhzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfREVWKGNtZCk7Ci0Jc3RydWN0IHQxMF9yZXNlcnZhdGlvbl90ZW1wbGF0ZSAqcHJfdG1wbCA9ICZTVV9ERVYoZGV2KS0+dDEwX3Jlc2VydmF0aW9uOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopVF9UQVNLKGNtZCktPnRfdGFza19idWY7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CisJc3RydWN0IHQxMF9yZXNlcnZhdGlvbiAqcHJfdG1wbCA9ICZkZXYtPnNlX3N1Yl9kZXYtPnQxMF9wcjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CiAJdTE2IGFkZF9sZW4gPSA4OyAvKiBIYXJkY29kZWQgdG8gOC4gKi8KIAogCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgNikgewotCQlwcmludGsoS0VSTl9FUlIgIlBSSU4gU0EgUkVQT1JUX0NBUEFCSUxJVElFUyBTQ1NJIERhdGEgTGVuZ3RoOiIKKwkJcHJfZXJyKCJQUklOIFNBIFJFUE9SVF9DQVBBQklMSVRJRVMgU0NTSSBEYXRhIExlbmd0aDoiCiAJCQkiICV1IHRvbyBzbWFsbFxuIiwgY21kLT5kYXRhX2xlbmd0aCk7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfQ0RCX0ZJRUxEOwogCX0KIAorCWJ1ZiA9IHRyYW5zcG9ydF9rbWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOworCiAJYnVmWzBdID0gKChhZGRfbGVuIDw8IDgpICYgMHhmZik7CiAJYnVmWzFdID0gKGFkZF9sZW4gJiAweGZmKTsKIAlidWZbMl0gfD0gMHgxMDsgLyogQ1JIOiBDb21wYXRpYmxlIFJlc2VydmF0aW9uIEhhbmxkaW5nIGJpdC4gKi8KQEAgLTQwMDQsNiArNDAzNiw4IEBACiAJYnVmWzRdIHw9IDB4MDI7IC8qIFBSX1RZUEVfV1JJVEVfRVhDTFVTSVZFICovCiAJYnVmWzVdIHw9IDB4MDE7IC8qIFBSX1RZUEVfRVhDTFVTSVZFX0FDQ0VTU19BTExSRUcgKi8KIAorCXRyYW5zcG9ydF9rdW5tYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDAxNCwyNyArNDA0OCwyOSBAQAogICovCiBzdGF0aWMgaW50IGNvcmVfc2NzaTNfcHJpX3JlYWRfZnVsbF9zdGF0dXMoc3RydWN0IHNlX2NtZCAqY21kKQogewotCXN0cnVjdCBzZV9kZXZpY2UgKnNlX2RldiA9IFNFX0RFVihjbWQpOworCXN0cnVjdCBzZV9kZXZpY2UgKnNlX2RldiA9IGNtZC0+c2VfZGV2OwogCXN0cnVjdCBzZV9ub2RlX2FjbCAqc2VfbmFjbDsKLQlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gU1VfREVWKHNlX2Rldik7CisJc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKnN1X2RldiA9IHNlX2Rldi0+c2Vfc3ViX2RldjsKIAlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICpzZV90cGc7CiAJc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24gKnByX3JlZywgKnByX3JlZ190bXA7Ci0Jc3RydWN0IHQxMF9yZXNlcnZhdGlvbl90ZW1wbGF0ZSAqcHJfdG1wbCA9ICZTVV9ERVYoc2VfZGV2KS0+dDEwX3Jlc2VydmF0aW9uOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopVF9UQVNLKGNtZCktPnRfdGFza19idWY7CisJc3RydWN0IHQxMF9yZXNlcnZhdGlvbiAqcHJfdG1wbCA9ICZzZV9kZXYtPnNlX3N1Yl9kZXYtPnQxMF9wcjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CiAJdTMyIGFkZF9kZXNjX2xlbiA9IDAsIGFkZF9sZW4gPSAwLCBkZXNjX2xlbiwgZXhwX2Rlc2NfbGVuOwogCXUzMiBvZmYgPSA4OyAvKiBvZmYgaW50byBmaXJzdCBGdWxsIFN0YXR1cyBkZXNjcmlwdG9yICovCiAJaW50IGZvcm1hdF9jb2RlID0gMDsKIAogCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgOCkgewotCQlwcmludGsoS0VSTl9FUlIgIlBSSU4gU0EgUkVBRF9GVUxMX1NUQVRVUyBTQ1NJIERhdGEgTGVuZ3RoOiAldSIKKwkJcHJfZXJyKCJQUklOIFNBIFJFQURfRlVMTF9TVEFUVVMgU0NTSSBEYXRhIExlbmd0aDogJXUiCiAJCQkiIHRvbyBzbWFsbFxuIiwgY21kLT5kYXRhX2xlbmd0aCk7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfQ0RCX0ZJRUxEOwogCX0KIAotCWJ1ZlswXSA9ICgoVDEwX1JFUyhzdV9kZXYpLT5wcl9nZW5lcmF0aW9uID4+IDI0KSAmIDB4ZmYpOwotCWJ1ZlsxXSA9ICgoVDEwX1JFUyhzdV9kZXYpLT5wcl9nZW5lcmF0aW9uID4+IDE2KSAmIDB4ZmYpOwotCWJ1ZlsyXSA9ICgoVDEwX1JFUyhzdV9kZXYpLT5wcl9nZW5lcmF0aW9uID4+IDgpICYgMHhmZik7Ci0JYnVmWzNdID0gKFQxMF9SRVMoc3VfZGV2KS0+cHJfZ2VuZXJhdGlvbiAmIDB4ZmYpOworCWJ1ZiA9IHRyYW5zcG9ydF9rbWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOworCisJYnVmWzBdID0gKChzdV9kZXYtPnQxMF9wci5wcl9nZW5lcmF0aW9uID4+IDI0KSAmIDB4ZmYpOworCWJ1ZlsxXSA9ICgoc3VfZGV2LT50MTBfcHIucHJfZ2VuZXJhdGlvbiA+PiAxNikgJiAweGZmKTsKKwlidWZbMl0gPSAoKHN1X2Rldi0+dDEwX3ByLnByX2dlbmVyYXRpb24gPj4gOCkgJiAweGZmKTsKKwlidWZbM10gPSAoc3VfZGV2LT50MTBfcHIucHJfZ2VuZXJhdGlvbiAmIDB4ZmYpOwogCiAJc3Bpbl9sb2NrKCZwcl90bXBsLT5yZWdpc3RyYXRpb25fbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHByX3JlZywgcHJfcmVnX3RtcCwKQEAgLTQwNTEsMTEgKzQwODcsMTEgQEAKIAkJICogRGV0ZXJtaW5lIGV4cGVjdGVkIGxlbmd0aCBvZiAkRkFCUklDX01PRCBzcGVjaWZpYwogCQkgKiBUcmFuc3BvcnRJRCBmdWxsIHN0YXR1cyBkZXNjcmlwdG9yLi4KIAkJICovCi0JCWV4cF9kZXNjX2xlbiA9IFRQR19URk8oc2VfdHBnKS0+dHBnX2dldF9wcl90cmFuc3BvcnRfaWRfbGVuKAorCQlleHBfZGVzY19sZW4gPSBzZV90cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfcHJfdHJhbnNwb3J0X2lkX2xlbigKIAkJCQlzZV90cGcsIHNlX25hY2wsIHByX3JlZywgJmZvcm1hdF9jb2RlKTsKIAogCQlpZiAoKGV4cF9kZXNjX2xlbiArIGFkZF9sZW4pID4gY21kLT5kYXRhX2xlbmd0aCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1BDLTMgUFJJTiBSRUFEX0ZVTExfU1RBVFVTIHJhbiIKKwkJCXByX3dhcm4oIlNQQy0zIFBSSU4gUkVBRF9GVUxMX1NUQVRVUyByYW4iCiAJCQkJIiBvdXQgb2YgYnVmZmVyOiAlZFxuIiwgY21kLT5kYXRhX2xlbmd0aCk7CiAJCQlzcGluX2xvY2soJnByX3RtcGwtPnJlZ2lzdHJhdGlvbl9sb2NrKTsKIAkJCWF0b21pY19kZWMoJnByX3JlZy0+cHJfcmVzX2hvbGRlcnMpOwpAQCAtNDEwNSw3ICs0MTQxLDcgQEAKIAkJICogYml0IGlzIHNldCB0byBvbmUsIHRoZSBjb250ZW50cyBvZiB0aGUgUkVMQVRJVkUgVEFSR0VUIFBPUlQKIAkJICogSURFTlRJRklFUiBmaWVsZCBhcmUgbm90IGRlZmluZWQgYnkgdGhpcyBzdGFuZGFyZC4KIAkJICovCi0JCWlmICghKHByX3JlZy0+cHJfcmVnX2FsbF90Z19wdCkpIHsKKwkJaWYgKCFwcl9yZWctPnByX3JlZ19hbGxfdGdfcHQpIHsKIAkJCXN0cnVjdCBzZV9wb3J0ICpwb3J0ID0gcHJfcmVnLT5wcl9yZWdfdGdfcHRfbHVuLT5sdW5fc2VwOwogCiAJCQlidWZbb2ZmKytdID0gKChwb3J0LT5zZXBfcnRwaSA+PiA4KSAmIDB4ZmYpOwpAQCAtNDExNiw3ICs0MTUyLDcgQEAKIAkJLyoKIAkJICogTm93LCBoYXZlIHRoZSAkRkFCUklDX01PRCBmaWxsIGluIHRoZSBwcm90b2NvbCBpZGVudGlmaWVyCiAJCSAqLwotCQlkZXNjX2xlbiA9IFRQR19URk8oc2VfdHBnKS0+dHBnX2dldF9wcl90cmFuc3BvcnRfaWQoc2VfdHBnLAorCQlkZXNjX2xlbiA9IHNlX3RwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF9wcl90cmFuc3BvcnRfaWQoc2VfdHBnLAogCQkJCXNlX25hY2wsIHByX3JlZywgJmZvcm1hdF9jb2RlLCAmYnVmW29mZis0XSk7CiAKIAkJc3Bpbl9sb2NrKCZwcl90bXBsLT5yZWdpc3RyYXRpb25fbG9jayk7CkBAIC00MTUwLDYgKzQxODYsOCBAQAogCWJ1Zls2XSA9ICgoYWRkX2xlbiA+PiA4KSAmIDB4ZmYpOwogCWJ1Zls3XSA9IChhZGRfbGVuICYgMHhmZik7CiAKKwl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxNjUsNyArNDIwMyw3IEBACiAJY2FzZSBQUklfUkVBRF9GVUxMX1NUQVRVUzoKIAkJcmV0dXJuIGNvcmVfc2NzaTNfcHJpX3JlYWRfZnVsbF9zdGF0dXMoY21kKTsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIlVua25vd24gUEVSU0lTVEVOVF9SRVNFUlZFX0lOIHNlcnZpY2UiCisJCXByX2VycigiVW5rbm93biBQRVJTSVNURU5UX1JFU0VSVkVfSU4gc2VydmljZSIKIAkJCSIgYWN0aW9uOiAweCUwMnhcbiIsIGNkYlsxXSAmIDB4MWYpOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX0NEQl9GSUVMRDsKIAl9CkBAIC00MTc0LDcgKzQyMTIsNyBAQAogCiBpbnQgY29yZV9zY3NpM19lbXVsYXRlX3ByKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQl1bnNpZ25lZCBjaGFyICpjZGIgPSAmVF9UQVNLKGNtZCktPnRfdGFza19jZGJbMF07CisJdW5zaWduZWQgY2hhciAqY2RiID0gJmNtZC0+dF90YXNrX2NkYlswXTsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAkvKgogCSAqIEZvbGxvd2luZyBzcGMycjIwIDUuNS4xIFJlc2VydmF0aW9ucyBvdmVydmlldzoKQEAgLTQxODYsNyArNDIyNCw3IEBACiAJICogQ09ORkxJQ1Qgc3RhdHVzLgogCSAqLwogCWlmIChkZXYtPmRldl9mbGFncyAmIERGX1NQQzJfUkVTRVJWQVRJT05TKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUmVjZWl2ZWQgUEVSU0lTVEVOVF9SRVNFUlZFIENEQiB3aGlsZSBsZWdhY3kiCisJCXByX2VycigiUmVjZWl2ZWQgUEVSU0lTVEVOVF9SRVNFUlZFIENEQiB3aGlsZSBsZWdhY3kiCiAJCQkiIFNQQy0yIHJlc2VydmF0aW9uIGlzIGhlbGQsIHJldHVybmluZyIKIAkJCSIgUkVTRVJWQVRJT05fQ09ORkxJQ1RcbiIpOwogCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9SRVNFUlZBVElPTl9DT05GTElDVDsKQEAgLTQyMTMsMzkgKzQyNTEsMzkgQEAKIGludCBjb3JlX3NldHVwX3Jlc2VydmF0aW9ucyhzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsIGludCBmb3JjZV9wdCkKIHsKIAlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gZGV2LT5zZV9zdWJfZGV2OwotCXN0cnVjdCB0MTBfcmVzZXJ2YXRpb25fdGVtcGxhdGUgKnJlc3QgPSAmc3VfZGV2LT50MTBfcmVzZXJ2YXRpb247CisJc3RydWN0IHQxMF9yZXNlcnZhdGlvbiAqcmVzdCA9ICZzdV9kZXYtPnQxMF9wcjsKIAkvKgogCSAqIElmIHRoaXMgZGV2aWNlIGlzIGZyb20gVGFyZ2V0X0NvcmVfTW9kL3BTQ1NJLCB1c2UgdGhlIHJlc2VydmF0aW9ucwogCSAqIG9mIHRoZSBVbmRlcmx5aW5nIFNDU0kgaGFyZHdhcmUuICBJbiBMaW51eC9TQ1NJIHRlcm1zLCB0aGlzIGNhbgogCSAqIGNhdXNlIGEgcHJvYmxlbSBiZWNhdXNlIGxpYmF0YSBhbmQgc29tZSBTQVRBIFJBSUQgSEJBcyBhcHBlYXIKIAkgKiB1bmRlciBMaW51eC9TQ1NJLCBidXQgdG8gZW11bGF0ZSByZXNlcnZhdGlvbnMgdGhlbXNlbHZlcy4KIAkgKi8KLQlpZiAoKChUUkFOU1BPUlQoZGV2KS0+dHJhbnNwb3J0X3R5cGUgPT0gVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpICYmCi0JICAgICEoREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX3Jlc2VydmF0aW9ucykpIHx8IGZvcmNlX3B0KSB7CisJaWYgKCgoZGV2LT50cmFuc3BvcnQtPnRyYW5zcG9ydF90eXBlID09IFRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKSAmJgorCSAgICAhKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3Jlc2VydmF0aW9ucykpIHx8IGZvcmNlX3B0KSB7CiAJCXJlc3QtPnJlc190eXBlID0gU1BDX1BBU1NUSFJPVUdIOwogCQlyZXN0LT5wcl9vcHMudDEwX3Jlc2VydmF0aW9uX2NoZWNrID0gJmNvcmVfcHRfcmVzZXJ2YXRpb25fY2hlY2s7CiAJCXJlc3QtPnByX29wcy50MTBfc2VxX25vbl9ob2xkZXIgPSAmY29yZV9wdF9zZXFfbm9uX2hvbGRlcjsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nIFNQQ19QQVNTVEhST1VHSCwgbm8gcmVzZXJ2YXRpb24iCi0JCQkiIGVtdWxhdGlvblxuIiwgVFJBTlNQT1JUKGRldiktPm5hbWUpOworCQlwcl9kZWJ1ZygiJXM6IFVzaW5nIFNQQ19QQVNTVEhST1VHSCwgbm8gcmVzZXJ2YXRpb24iCisJCQkiIGVtdWxhdGlvblxuIiwgZGV2LT50cmFuc3BvcnQtPm5hbWUpOwogCQlyZXR1cm4gMDsKIAl9CiAJLyoKIAkgKiBJZiBTUEMtMyBvciBhYm92ZSBpcyByZXBvcnRlZCBieSByZWFsIG9yIGVtdWxhdGVkIHN0cnVjdCBzZV9kZXZpY2UsCiAJICogdXNlIGVtdWxhdGVkIFBlcnNpc3RlbnQgUmVzZXJ2YXRpb25zLgogCSAqLwotCWlmIChUUkFOU1BPUlQoZGV2KS0+Z2V0X2RldmljZV9yZXYoZGV2KSA+PSBTQ1NJXzMpIHsKKwlpZiAoZGV2LT50cmFuc3BvcnQtPmdldF9kZXZpY2VfcmV2KGRldikgPj0gU0NTSV8zKSB7CiAJCXJlc3QtPnJlc190eXBlID0gU1BDM19QRVJTSVNURU5UX1JFU0VSVkFUSU9OUzsKIAkJcmVzdC0+cHJfb3BzLnQxMF9yZXNlcnZhdGlvbl9jaGVjayA9ICZjb3JlX3Njc2kzX3ByX3Jlc2VydmF0aW9uX2NoZWNrOwogCQlyZXN0LT5wcl9vcHMudDEwX3NlcV9ub25faG9sZGVyID0gJmNvcmVfc2NzaTNfcHJfc2VxX25vbl9ob2xkZXI7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBVc2luZyBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TIgotCQkJIiBlbXVsYXRpb25cbiIsIFRSQU5TUE9SVChkZXYpLT5uYW1lKTsKKwkJcHJfZGVidWcoIiVzOiBVc2luZyBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TIgorCQkJIiBlbXVsYXRpb25cbiIsIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKIAl9IGVsc2UgewogCQlyZXN0LT5yZXNfdHlwZSA9IFNQQzJfUkVTRVJWQVRJT05TOwogCQlyZXN0LT5wcl9vcHMudDEwX3Jlc2VydmF0aW9uX2NoZWNrID0gJmNvcmVfc2NzaTJfcmVzZXJ2YXRpb25fY2hlY2s7CiAJCXJlc3QtPnByX29wcy50MTBfc2VxX25vbl9ob2xkZXIgPQogCQkJCSZjb3JlX3Njc2kyX3Jlc2VydmF0aW9uX3NlcV9ub25faG9sZGVyOwotCQlwcmludGsoS0VSTl9JTkZPICIlczogVXNpbmcgU1BDMl9SRVNFUlZBVElPTlMgZW11bGF0aW9uXG4iLAotCQkJVFJBTlNQT1JUKGRldiktPm5hbWUpOworCQlwcl9kZWJ1ZygiJXM6IFVzaW5nIFNQQzJfUkVTRVJWQVRJT05TIGVtdWxhdGlvblxuIiwKKwkJCWRldi0+dHJhbnNwb3J0LT5uYW1lKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmggYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5oCmluZGV4IDU2MDNiY2YuLmM4ZjQ3ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmgKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHIuaApAQCAtNDksNyArNDksNyBAQAogCQkJY2hhciAqLCB1MzIpOwogZXh0ZXJuIGludCBjb3JlX3Njc2kyX2VtdWxhdGVfY3JoKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gaW50IGNvcmVfc2NzaTNfYWxsb2NfYXB0cGxfcmVnaXN0cmF0aW9uKAotCQkJc3RydWN0IHQxMF9yZXNlcnZhdGlvbl90ZW1wbGF0ZSAqLCB1NjQsCisJCQlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uICosIHU2NCwKIAkJCXVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1MzIsCiAJCQl1bnNpZ25lZCBjaGFyICosIHUxNiwgdTMyLCBpbnQsIGludCwgdTgpOwogZXh0ZXJuIGludCBjb3JlX3Njc2kzX2NoZWNrX2FwdHBsX3JlZ2lzdHJhdGlvbihzdHJ1Y3Qgc2VfZGV2aWNlICosCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wc2NzaS5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHNjc2kuYwppbmRleCAzMzFkNDIzLi4yYjdiMGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wc2NzaS5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3BzY3NpLmMKQEAgLTU1LDI0ICs1NSw2IEBACiAKIHN0YXRpYyB2b2lkIHBzY3NpX3JlcV9kb25lKHN0cnVjdCByZXF1ZXN0ICosIGludCk7CiAKLS8qCXBzY3NpX2dldF9zaCgpOgotICoKLSAqCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpwc2NzaV9nZXRfc2godTMyIGhvc3Rfbm8pCi17Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2ggPSBOVUxMOwotCi0Jc2ggPSBzY3NpX2hvc3RfbG9va3VwKGhvc3Rfbm8pOwotCWlmIChJU19FUlIoc2gpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvY2F0ZSBTQ1NJIEhCQSB3aXRoIEhvc3QgSUQ6IgotCQkJCSIgJXVcbiIsIGhvc3Rfbm8pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gc2g7Ci19Ci0KIC8qCXBzY3NpX2F0dGFjaF9oYmEoKToKICAqCiAgKiAJcHNjc2lfZ2V0X3NoKCkgdXNlZCBzY3NpX2hvc3RfbG9va3VwKCkgdG8gbG9jYXRlIHN0cnVjdCBTY3NpX0hvc3QuCkBAIC04MCwyOCArNjIsMjMgQEAKICAqLwogc3RhdGljIGludCBwc2NzaV9hdHRhY2hfaGJhKHN0cnVjdCBzZV9oYmEgKmhiYSwgdTMyIGhvc3RfaWQpCiB7Ci0JaW50IGhiYV9kZXB0aDsKIAlzdHJ1Y3QgcHNjc2lfaGJhX3ZpcnQgKnBodjsKIAogCXBodiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwc2NzaV9oYmFfdmlydCksIEdGUF9LRVJORUwpOwotCWlmICghKHBodikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHBzY3NpX2hiYV92aXJ0XG4iKTsKLQkJcmV0dXJuIC0xOworCWlmICghcGh2KSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBwc2NzaV9oYmFfdmlydFxuIik7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAlwaHYtPnBodl9ob3N0X2lkID0gaG9zdF9pZDsKIAlwaHYtPnBodl9tb2RlID0gUEhWX1ZJUlVUQUxfSE9TVF9JRDsKLQloYmFfZGVwdGggPSBQU0NTSV9WSVJUVUFMX0hCQV9ERVBUSDsKLQlhdG9taWNfc2V0KCZoYmEtPmxlZnRfcXVldWVfZGVwdGgsIGhiYV9kZXB0aCk7Ci0JYXRvbWljX3NldCgmaGJhLT5tYXhfcXVldWVfZGVwdGgsIGhiYV9kZXB0aCk7CiAKLQloYmEtPmhiYV9wdHIgPSAodm9pZCAqKXBodjsKKwloYmEtPmhiYV9wdHIgPSBwaHY7CiAKLQlwcmludGsoS0VSTl9JTkZPICJDT1JFX0hCQVslZF0gLSBUQ00gU0NTSSBIQkEgRHJpdmVyICVzIG9uIgorCXByX2RlYnVnKCJDT1JFX0hCQVslZF0gLSBUQ00gU0NTSSBIQkEgRHJpdmVyICVzIG9uIgogCQkiIEdlbmVyaWMgVGFyZ2V0IENvcmUgU3RhY2sgJXNcbiIsIGhiYS0+aGJhX2lkLAogCQlQU0NTSV9WRVJTSU9OLCBUQVJHRVRfQ09SRV9NT0RfVkVSU0lPTik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQ09SRV9IQkFbJWRdIC0gQXR0YWNoZWQgU0NTSSBIQkEgdG8gR2VuZXJpYyIKLQkJIiBUYXJnZXQgQ29yZSB3aXRoIFRDUSBEZXB0aDogJWRcbiIsIGhiYS0+aGJhX2lkLAotCQlhdG9taWNfcmVhZCgmaGJhLT5tYXhfcXVldWVfZGVwdGgpKTsKKwlwcl9kZWJ1ZygiQ09SRV9IQkFbJWRdIC0gQXR0YWNoZWQgU0NTSSBIQkEgdG8gR2VuZXJpY1xuIiwKKwkgICAgICAgaGJhLT5oYmFfaWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTQsMTIgKzkxLDEyIEBACiAJaWYgKHNjc2lfaG9zdCkgewogCQlzY3NpX2hvc3RfcHV0KHNjc2lfaG9zdCk7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ09SRV9IQkFbJWRdIC0gRGV0YWNoZWQgU0NTSSBIQkE6ICVzIGZyb20iCisJCXByX2RlYnVnKCJDT1JFX0hCQVslZF0gLSBEZXRhY2hlZCBTQ1NJIEhCQTogJXMgZnJvbSIKIAkJCSIgR2VuZXJpYyBUYXJnZXQgQ29yZVxuIiwgaGJhLT5oYmFfaWQsCiAJCQkoc2NzaV9ob3N0LT5ob3N0dC0+bmFtZSkgPyAoc2NzaV9ob3N0LT5ob3N0dC0+bmFtZSkgOgogCQkJIlVua25vd24iKTsKIAl9IGVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ09SRV9IQkFbJWRdIC0gRGV0YWNoZWQgVmlydHVhbCBTQ1NJIEhCQSIKKwkJcHJfZGVidWcoIkNPUkVfSEJBWyVkXSAtIERldGFjaGVkIFZpcnR1YWwgU0NTSSBIQkEiCiAJCQkiIGZyb20gR2VuZXJpYyBUYXJnZXQgQ29yZVxuIiwgaGJhLT5oYmFfaWQpOwogCiAJa2ZyZWUocGh2KTsKQEAgLTEzMCwyMCArMTA3LDE3IEBACiB7CiAJc3RydWN0IHBzY3NpX2hiYV92aXJ0ICpwaHYgPSAoc3RydWN0IHBzY3NpX2hiYV92aXJ0ICopaGJhLT5oYmFfcHRyOwogCXN0cnVjdCBTY3NpX0hvc3QgKnNoID0gcGh2LT5waHZfbGxkX2hvc3Q7Ci0JaW50IGhiYV9kZXB0aCA9IFBTQ1NJX1ZJUlRVQUxfSEJBX0RFUFRIOwogCS8qCiAJICogUmVsZWFzZSB0aGUgc3RydWN0IFNjc2lfSG9zdAogCSAqLwotCWlmICghKG1vZGVfZmxhZykpIHsKLQkJaWYgKCEoc2gpKQorCWlmICghbW9kZV9mbGFnKSB7CisJCWlmICghc2gpCiAJCQlyZXR1cm4gMDsKIAogCQlwaHYtPnBodl9sbGRfaG9zdCA9IE5VTEw7CiAJCXBodi0+cGh2X21vZGUgPSBQSFZfVklSVVRBTF9IT1NUX0lEOwotCQlhdG9taWNfc2V0KCZoYmEtPmxlZnRfcXVldWVfZGVwdGgsIGhiYV9kZXB0aCk7Ci0JCWF0b21pY19zZXQoJmhiYS0+bWF4X3F1ZXVlX2RlcHRoLCBoYmFfZGVwdGgpOwogCi0JCXByaW50ayhLRVJOX0lORk8gIkNPUkVfSEJBWyVkXSAtIERpc2FibGVkIHBTQ1NJIEhCQSBQYXNzdGhyb3VnaCIKKwkJcHJfZGVidWcoIkNPUkVfSEJBWyVkXSAtIERpc2FibGVkIHBTQ1NJIEhCQSBQYXNzdGhyb3VnaCIKIAkJCSIgJXNcbiIsIGhiYS0+aGJhX2lkLCAoc2gtPmhvc3R0LT5uYW1lKSA/CiAJCQkoc2gtPmhvc3R0LT5uYW1lKSA6ICJVbmtub3duIik7CiAKQEAgLTE1NCwyNyArMTI4LDE3IEBACiAJICogT3RoZXJ3aXNlLCBsb2NhdGUgc3RydWN0IFNjc2lfSG9zdCBmcm9tIHRoZSBvcmlnaW5hbCBwYXNzZWQKIAkgKiBwU0NTSSBIb3N0IElEIGFuZCBlbmFibGUgZm9yIHBoYmEgbW9kZQogCSAqLwotCXNoID0gcHNjc2lfZ2V0X3NoKHBodi0+cGh2X2hvc3RfaWQpOwotCWlmICghKHNoKSkgewotCQlwcmludGsoS0VSTl9FUlIgInBTQ1NJOiBVbmFibGUgdG8gbG9jYXRlIFNDU0kgSG9zdCBmb3IiCisJc2ggPSBzY3NpX2hvc3RfbG9va3VwKHBodi0+cGh2X2hvc3RfaWQpOworCWlmIChJU19FUlIoc2gpKSB7CisJCXByX2VycigicFNDU0k6IFVuYWJsZSB0byBsb2NhdGUgU0NTSSBIb3N0IGZvciIKIAkJCSIgcGh2X2hvc3RfaWQ6ICVkXG4iLCBwaHYtPnBodl9ob3N0X2lkKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gUFRSX0VSUihzaCk7CiAJfQotCS8qCi0JICogVXN1YWxseSB0aGUgU0NTSSBMTEQgd2lsbCB1c2UgdGhlIGhvc3R0LT5jYW5fcXVldWUgdmFsdWUgdG8gZGVmaW5lCi0JICogaXRzIEhCQSBUQ1EgZGVwdGguICBTb21lIG90aGVyIGRyaXZlcnMgKGxpa2UgMi42IG1lZ2FyYWlkKSBkb24ndCBzZXQKLQkgKiB0aGlzIGF0IGFsbCBhbmQgc2V0IHNoLT5jYW5fcXVldWUgYXQgcnVudGltZS4KLQkgKi8KLQloYmFfZGVwdGggPSAoc2gtPmhvc3R0LT5jYW5fcXVldWUgPiBzaC0+Y2FuX3F1ZXVlKSA/Ci0JCXNoLT5ob3N0dC0+Y2FuX3F1ZXVlIDogc2gtPmNhbl9xdWV1ZTsKLQotCWF0b21pY19zZXQoJmhiYS0+bGVmdF9xdWV1ZV9kZXB0aCwgaGJhX2RlcHRoKTsKLQlhdG9taWNfc2V0KCZoYmEtPm1heF9xdWV1ZV9kZXB0aCwgaGJhX2RlcHRoKTsKIAogCXBodi0+cGh2X2xsZF9ob3N0ID0gc2g7CiAJcGh2LT5waHZfbW9kZSA9IFBIVl9MTERfU0NTSV9IT1NUX05POwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ09SRV9IQkFbJWRdIC0gRW5hYmxlZCBwU0NTSSBIQkEgUGFzc3Rocm91Z2ggJXNcbiIsCisJcHJfZGVidWcoIkNPUkVfSEJBWyVkXSAtIEVuYWJsZWQgcFNDU0kgSEJBIFBhc3N0aHJvdWdoICVzXG4iLAogCQloYmEtPmhiYV9pZCwgKHNoLT5ob3N0dC0+bmFtZSkgPyAoc2gtPmhvc3R0LT5uYW1lKSA6ICJVbmtub3duIik7CiAKIAlyZXR1cm4gMTsKQEAgLTIzNiw3ICsyMDAsNyBAQAogCiAJYnVmID0ga3phbGxvYyhJTlFVSVJZX1ZQRF9TRVJJQUxfTEVOLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT01FTTsKIAogCW1lbXNldChjZGIsIDAsIE1BWF9DT01NQU5EX1NJWkUpOwogCWNkYlswXSA9IElOUVVJUlk7CkBAIC0yNTksNyArMjIzLDcgQEAKIAogb3V0X2ZyZWU6CiAJa2ZyZWUoYnVmKTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIC1FUEVSTTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTI5MywxNSArMjU3LDE1IEBACiAJCXBhZ2VfODMgPSAmYnVmW29mZl07CiAJCWlkZW50X2xlbiA9IHBhZ2VfODNbM107CiAJCWlmICghaWRlbnRfbGVuKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInBhZ2VfODNbM106IGlkZW50aWZpZXIiCisJCQlwcl9lcnIoInBhZ2VfODNbM106IGlkZW50aWZpZXIiCiAJCQkJCSIgbGVuZ3RoIHplcm8hXG4iKTsKIAkJCWJyZWFrOwogCQl9Ci0JCXByaW50ayhLRVJOX0lORk8gIlQxMCBWUEQgSWRlbnRpZmVyIExlbmd0aDogJWRcbiIsIGlkZW50X2xlbik7CisJCXByX2RlYnVnKCJUMTAgVlBEIElkZW50aWZlciBMZW5ndGg6ICVkXG4iLCBpZGVudF9sZW4pOwogCiAJCXZwZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0MTBfdnBkKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdnBkKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIgorCQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciIKIAkJCQkJIiBzdHJ1Y3QgdDEwX3ZwZFxuIik7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMzUzLDcgKzMxNyw3IEBACiAJaWYgKCFzZC0+cXVldWVfZGVwdGgpIHsKIAkJc2QtPnF1ZXVlX2RlcHRoID0gUFNDU0lfREVGQVVMVF9RVUVVRURFUFRIOwogCi0JCXByaW50ayhLRVJOX0VSUiAiU2V0IGJyb2tlbiBTQ1NJIERldmljZSAlZDolZDolZCIKKwkJcHJfZXJyKCJTZXQgYnJva2VuIFNDU0kgRGV2aWNlICVkOiVkOiVkIgogCQkJIiBxdWV1ZV9kZXB0aCB0byAlZFxuIiwgc2QtPmNoYW5uZWwsIHNkLT5pZCwKIAkJCQlzZC0+bHVuLCBzZC0+cXVldWVfZGVwdGgpOwogCX0KQEAgLTM2NCwxMCArMzI4LDggQEAKIAlxID0gc2QtPnJlcXVlc3RfcXVldWU7CiAJbGltaXRzID0gJmRldl9saW1pdHMubGltaXRzOwogCWxpbWl0cy0+bG9naWNhbF9ibG9ja19zaXplID0gc2QtPnNlY3Rvcl9zaXplOwotCWxpbWl0cy0+bWF4X2h3X3NlY3RvcnMgPSAoc2QtPmhvc3QtPm1heF9zZWN0b3JzID4gcXVldWVfbWF4X2h3X3NlY3RvcnMocSkpID8KLQkJCQkgIHF1ZXVlX21heF9od19zZWN0b3JzKHEpIDogc2QtPmhvc3QtPm1heF9zZWN0b3JzOwotCWxpbWl0cy0+bWF4X3NlY3RvcnMgPSAoc2QtPmhvc3QtPm1heF9zZWN0b3JzID4gcXVldWVfbWF4X3NlY3RvcnMocSkpID8KLQkJCQkgIHF1ZXVlX21heF9zZWN0b3JzKHEpIDogc2QtPmhvc3QtPm1heF9zZWN0b3JzOworCWxpbWl0cy0+bWF4X2h3X3NlY3RvcnMgPSBtaW5fdChpbnQsIHNkLT5ob3N0LT5tYXhfc2VjdG9ycywgcXVldWVfbWF4X2h3X3NlY3RvcnMocSkpOworCWxpbWl0cy0+bWF4X3NlY3RvcnMgPSBtaW5fdChpbnQsIHNkLT5ob3N0LT5tYXhfc2VjdG9ycywgcXVldWVfbWF4X3NlY3RvcnMocSkpOwogCWRldl9saW1pdHMuaHdfcXVldWVfZGVwdGggPSBzZC0+cXVldWVfZGVwdGg7CiAJZGV2X2xpbWl0cy5xdWV1ZV9kZXB0aCA9IHNkLT5xdWV1ZV9kZXB0aDsKIAkvKgpAQCAtMzkxLDkgKzM1Myw5IEBACiAJcGR2LT5wZHZfc2QgPSBzZDsKIAogCWRldiA9IHRyYW5zcG9ydF9hZGRfZGV2aWNlX3RvX2NvcmVfaGJhKGhiYSwgJnBzY3NpX3RlbXBsYXRlLAotCQkJCXNlX2RldiwgZGV2X2ZsYWdzLCAodm9pZCAqKXBkdiwKKwkJCQlzZV9kZXYsIGRldl9mbGFncywgcGR2LAogCQkJCSZkZXZfbGltaXRzLCBOVUxMLCBOVUxMKTsKLQlpZiAoIShkZXYpKSB7CisJaWYgKCFkZXYpIHsKIAkJcGR2LT5wZHZfc2QgPSBOVUxMOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC00MjMsMTQgKzM4NSwxNCBAQAogCXN0cnVjdCBwc2NzaV9kZXZfdmlydCAqcGR2OwogCiAJcGR2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBzY3NpX2Rldl92aXJ0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEocGR2KSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cnVjdCBwc2NzaV9kZXZfdmlydFxuIik7CisJaWYgKCFwZHYpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJ1Y3QgcHNjc2lfZGV2X3ZpcnRcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJcGR2LT5wZHZfc2VfaGJhID0gaGJhOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiUFNDU0k6IEFsbG9jYXRlZCBwZHY6ICVwIGZvciAlc1xuIiwgcGR2LCBuYW1lKTsKLQlyZXR1cm4gKHZvaWQgKilwZHY7CisJcHJfZGVidWcoIlBTQ1NJOiBBbGxvY2F0ZWQgcGR2OiAlcCBmb3IgJXNcbiIsIHBkdiwgbmFtZSk7CisJcmV0dXJuIHBkdjsKIH0KIAogLyoKQEAgLTQ1MCw3ICs0MTIsNyBAQAogCXUzMiBkZXZfZmxhZ3MgPSAwOwogCiAJaWYgKHNjc2lfZGV2aWNlX2dldChzZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpX2RldmljZV9nZXQoKSBmYWlsZWQgZm9yICVkOiVkOiVkOiVkXG4iLAorCQlwcl9lcnIoInNjc2lfZGV2aWNlX2dldCgpIGZhaWxlZCBmb3IgJWQ6JWQ6JWQ6JWRcbiIsCiAJCQlzaC0+aG9zdF9ubywgc2QtPmNoYW5uZWwsIHNkLT5pZCwgc2QtPmx1bik7CiAJCXNwaW5fdW5sb2NrX2lycShzaC0+aG9zdF9sb2NrKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC00NjMsMTkgKzQyNSwxOSBAQAogCWJkID0gYmxrZGV2X2dldF9ieV9wYXRoKHNlX2Rldi0+c2VfZGV2X3VkZXZfcGF0aCwKIAkJCQlGTU9ERV9XUklURXxGTU9ERV9SRUFEfEZNT0RFX0VYQ0wsIHBkdik7CiAJaWYgKElTX0VSUihiZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwU0NTSTogYmxrZGV2X2dldF9ieV9wYXRoKCkgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJwU0NTSTogYmxrZGV2X2dldF9ieV9wYXRoKCkgZmFpbGVkXG4iKTsKIAkJc2NzaV9kZXZpY2VfcHV0KHNkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXBkdi0+cGR2X2JkID0gYmQ7CiAKIAlkZXYgPSBwc2NzaV9hZGRfZGV2aWNlX3RvX2xpc3QoaGJhLCBzZV9kZXYsIHBkdiwgc2QsIGRldl9mbGFncyk7Ci0JaWYgKCEoZGV2KSkgeworCWlmICghZGV2KSB7CiAJCWJsa2Rldl9wdXQocGR2LT5wZHZfYmQsIEZNT0RFX1dSSVRFfEZNT0RFX1JFQUR8Rk1PREVfRVhDTCk7CiAJCXNjc2lfZGV2aWNlX3B1dChzZCk7CiAJCXJldHVybiBOVUxMOwogCX0KLQlwcmludGsoS0VSTl9JTkZPICJDT1JFX1BTQ1NJWyVkXSAtIEFkZGVkIFRZUEVfRElTSyBmb3IgJWQ6JWQ6JWQ6JWRcbiIsCisJcHJfZGVidWcoIkNPUkVfUFNDU0lbJWRdIC0gQWRkZWQgVFlQRV9ESVNLIGZvciAlZDolZDolZDolZFxuIiwKIAkJcGh2LT5waHZfaG9zdF9pZCwgc2gtPmhvc3Rfbm8sIHNkLT5jaGFubmVsLCBzZC0+aWQsIHNkLT5sdW4pOwogCiAJcmV0dXJuIGRldjsKQEAgLTQ5Nyw3ICs0NTksNyBAQAogCXUzMiBkZXZfZmxhZ3MgPSAwOwogCiAJaWYgKHNjc2lfZGV2aWNlX2dldChzZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpX2RldmljZV9nZXQoKSBmYWlsZWQgZm9yICVkOiVkOiVkOiVkXG4iLAorCQlwcl9lcnIoInNjc2lfZGV2aWNlX2dldCgpIGZhaWxlZCBmb3IgJWQ6JWQ6JWQ6JWRcbiIsCiAJCQlzaC0+aG9zdF9ubywgc2QtPmNoYW5uZWwsIHNkLT5pZCwgc2QtPmx1bik7CiAJCXNwaW5fdW5sb2NrX2lycShzaC0+aG9zdF9sb2NrKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC01MDUsMTEgKzQ2NywxMSBAQAogCXNwaW5fdW5sb2NrX2lycShzaC0+aG9zdF9sb2NrKTsKIAogCWRldiA9IHBzY3NpX2FkZF9kZXZpY2VfdG9fbGlzdChoYmEsIHNlX2RldiwgcGR2LCBzZCwgZGV2X2ZsYWdzKTsKLQlpZiAoIShkZXYpKSB7CisJaWYgKCFkZXYpIHsKIAkJc2NzaV9kZXZpY2VfcHV0KHNkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXByaW50ayhLRVJOX0lORk8gIkNPUkVfUFNDU0lbJWRdIC0gQWRkZWQgVHlwZTogJXMgZm9yICVkOiVkOiVkOiVkXG4iLAorCXByX2RlYnVnKCJDT1JFX1BTQ1NJWyVkXSAtIEFkZGVkIFR5cGU6ICVzIGZvciAlZDolZDolZDolZFxuIiwKIAkJcGh2LT5waHZfaG9zdF9pZCwgc2NzaV9kZXZpY2VfdHlwZShzZC0+dHlwZSksIHNoLT5ob3N0X25vLAogCQlzZC0+Y2hhbm5lbCwgc2QtPmlkLCBzZC0+bHVuKTsKIApAQCAtNTMzLDEwICs0OTUsMTAgQEAKIAogCXNwaW5fdW5sb2NrX2lycShzaC0+aG9zdF9sb2NrKTsKIAlkZXYgPSBwc2NzaV9hZGRfZGV2aWNlX3RvX2xpc3QoaGJhLCBzZV9kZXYsIHBkdiwgc2QsIGRldl9mbGFncyk7Ci0JaWYgKCEoZGV2KSkKKwlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7CiAKLQlwcmludGsoS0VSTl9JTkZPICJDT1JFX1BTQ1NJWyVkXSAtIEFkZGVkIFR5cGU6ICVzIGZvciAlZDolZDolZDolZFxuIiwKKwlwcl9kZWJ1ZygiQ09SRV9QU0NTSVslZF0gLSBBZGRlZCBUeXBlOiAlcyBmb3IgJWQ6JWQ6JWQ6JWRcbiIsCiAJCXBodi0+cGh2X2hvc3RfaWQsIHNjc2lfZGV2aWNlX3R5cGUoc2QtPnR5cGUpLCBzaC0+aG9zdF9ubywKIAkJc2QtPmNoYW5uZWwsIHNkLT5pZCwgc2QtPmx1bik7CiAKQEAgLTU1NSw4ICs1MTcsOCBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNoID0gcGh2LT5waHZfbGxkX2hvc3Q7CiAJaW50IGxlZ2FjeV9tb2RlX2VuYWJsZSA9IDA7CiAKLQlpZiAoIShwZHYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvY2F0ZSBzdHJ1Y3QgcHNjc2lfZGV2X3ZpcnQiCisJaWYgKCFwZHYpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCBwc2NzaV9kZXZfdmlydCIKIAkJCQkiIHBhcmFtZXRlclxuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KQEAgLTU2NCw5ICs1MjYsOSBAQAogCSAqIElmIG5vdCBydW5uaW5nIGluIFBIVl9MTERfU0NTSV9IT1NUX05PIG1vZGUsIGxvY2F0ZSB0aGUKIAkgKiBzdHJ1Y3QgU2NzaV9Ib3N0IHdlIHdpbGwgbmVlZCB0byBicmluZyB0aGUgVENNL3BTQ1NJIG9iamVjdCBvbmxpbmUKIAkgKi8KLQlpZiAoIShzaCkpIHsKKwlpZiAoIXNoKSB7CiAJCWlmIChwaHYtPnBodl9tb2RlID09IFBIVl9MTERfU0NTSV9IT1NUX05PKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInBTQ1NJOiBVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCIKKwkJCXByX2VycigicFNDU0k6IFVuYWJsZSB0byBsb2NhdGUgc3RydWN0IgogCQkJCSIgU2NzaV9Ib3N0IGZvciBQSFZfTExEX1NDU0lfSE9TVF9OT1xuIik7CiAJCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAkJfQpAQCAtNTc1LDcgKzUzNyw3IEBACiAJCSAqIHJlZmVyZW5jZSwgd2UgZW5mb3JjZSB0aGF0IHVkZXZfcGF0aCBoYXMgYmVlbiBzZXQKIAkJICovCiAJCWlmICghKHNlX2Rldi0+c3VfZGV2X2ZsYWdzICYgU0RGX1VTSU5HX1VERVZfUEFUSCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAicFNDU0k6IHVkZXZfcGF0aCBhdHRyaWJ1dGUgaGFzIG5vdCIKKwkJCXByX2VycigicFNDU0k6IHVkZXZfcGF0aCBhdHRyaWJ1dGUgaGFzIG5vdCIKIAkJCQkiIGJlZW4gc2V0IGJlZm9yZSBFTkFCTEU9MVxuIik7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkJfQpAQCAtNTg2LDggKzU0OCw4IEBACiAJCSAqLwogCQlpZiAoIShwZHYtPnBkdl9mbGFncyAmIFBERl9IQVNfVklSVF9IT1NUX0lEKSkgewogCQkJc3Bpbl9sb2NrKCZoYmEtPmRldmljZV9sb2NrKTsKLQkJCWlmICghKGxpc3RfZW1wdHkoJmhiYS0+aGJhX2Rldl9saXN0KSkpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgInBTQ1NJOiBVbmFibGUgdG8gc2V0IGhiYV9tb2RlIgorCQkJaWYgKCFsaXN0X2VtcHR5KCZoYmEtPmhiYV9kZXZfbGlzdCkpIHsKKwkJCQlwcl9lcnIoInBTQ1NJOiBVbmFibGUgdG8gc2V0IGhiYV9tb2RlIgogCQkJCQkiIHdpdGggYWN0aXZlIGRldmljZXNcbiIpOwogCQkJCXNwaW5fdW5sb2NrKCZoYmEtPmRldmljZV9sb2NrKTsKIAkJCQlyZXR1cm4gRVJSX1BUUigtRUVYSVNUKTsKQEAgLTYwMSwxNiArNTYzLDE2IEBACiAJCQloYmEtPmhiYV9mbGFncyB8PSBIQkFfRkxBR1NfUFNDU0lfTU9ERTsKIAkJCXNoID0gcGh2LT5waHZfbGxkX2hvc3Q7CiAJCX0gZWxzZSB7Ci0JCQlzaCA9IHBzY3NpX2dldF9zaChwZHYtPnBkdl9ob3N0X2lkKTsKLQkJCWlmICghKHNoKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAicFNDU0k6IFVuYWJsZSB0byBsb2NhdGUiCisJCQlzaCA9IHNjc2lfaG9zdF9sb29rdXAocGR2LT5wZHZfaG9zdF9pZCk7CisJCQlpZiAoSVNfRVJSKHNoKSkgeworCQkJCXByX2VycigicFNDU0k6IFVuYWJsZSB0byBsb2NhdGUiCiAJCQkJCSIgcGR2X2hvc3RfaWQ6ICVkXG4iLCBwZHYtPnBkdl9ob3N0X2lkKTsKLQkJCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwkJCQlyZXR1cm4gKHN0cnVjdCBzZV9kZXZpY2UgKikgc2g7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewogCQlpZiAocGh2LT5waHZfbW9kZSA9PSBQSFZfVklSVVRBTF9IT1NUX0lEKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInBTQ1NJOiBQSFZfVklSVVRBTF9IT1NUX0lEIHNldCB3aGlsZSIKKwkJCXByX2VycigicFNDU0k6IFBIVl9WSVJVVEFMX0hPU1RfSUQgc2V0IHdoaWxlIgogCQkJCSIgc3RydWN0IFNjc2lfSG9zdCBleGlzdHNcbiIpOwogCQkJcmV0dXJuIEVSUl9QVFIoLUVFWElTVCk7CiAJCX0KQEAgLTYzOSw3ICs2MDEsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoIShkZXYpKSB7CisJCWlmICghZGV2KSB7CiAJCQlpZiAocGh2LT5waHZfbW9kZSA9PSBQSFZfVklSVVRBTF9IT1NUX0lEKQogCQkJCXNjc2lfaG9zdF9wdXQoc2gpOwogCQkJZWxzZSBpZiAobGVnYWN5X21vZGVfZW5hYmxlKSB7CkBAIC02NTMsNyArNjE1LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKHNoLT5ob3N0X2xvY2spOwogCi0JcHJpbnRrKEtFUk5fRVJSICJwU0NTSTogVW5hYmxlIHRvIGxvY2F0ZSAlZDolZDolZDolZFxuIiwgc2gtPmhvc3Rfbm8sCisJcHJfZXJyKCJwU0NTSTogVW5hYmxlIHRvIGxvY2F0ZSAlZDolZDolZDolZFxuIiwgc2gtPmhvc3Rfbm8sCiAJCXBkdi0+cGR2X2NoYW5uZWxfaWQsICBwZHYtPnBkdl90YXJnZXRfaWQsIHBkdi0+cGR2X2x1bl9pZCk7CiAKIAlpZiAocGh2LT5waHZfbW9kZSA9PSBQSFZfVklSVVRBTF9IT1NUX0lEKQpAQCAtNzI4LDEzICs2OTAsMTIgQEAKIAkgKi8KIAlpZiAoKChjZGJbMF0gPT0gTU9ERV9TRU5TRSkgfHwgKGNkYlswXSA9PSBNT0RFX1NFTlNFXzEwKSkgJiYKIAkgICAgIChzdGF0dXNfYnl0ZShyZXN1bHQpIDw8IDEpID09IFNBTV9TVEFUX0dPT0QpIHsKLQkJaWYgKCFUQVNLX0NNRCh0YXNrKS0+c2VfZGV2ZSkKKwkJaWYgKCF0YXNrLT50YXNrX3NlX2NtZC0+c2VfZGV2ZSkKIAkJCWdvdG8gYWZ0ZXJfbW9kZV9zZW5zZTsKIAotCQlpZiAoVEFTS19DTUQodGFzayktPnNlX2RldmUtPmx1bl9mbGFncyAmCisJCWlmICh0YXNrLT50YXNrX3NlX2NtZC0+c2VfZGV2ZS0+bHVuX2ZsYWdzICYKIAkJCQlUUkFOU1BPUlRfTFVORkxBR1NfUkVBRF9PTkxZKSB7Ci0JCQl1bnNpZ25lZCBjaGFyICpidWYgPSAodW5zaWduZWQgY2hhciAqKQotCQkJCVRfVEFTSyh0YXNrLT50YXNrX3NlX2NtZCktPnRfdGFza19idWY7CisJCQl1bnNpZ25lZCBjaGFyICpidWYgPSB0cmFuc3BvcnRfa21hcF9maXJzdF9kYXRhX3BhZ2UodGFzay0+dGFza19zZV9jbWQpOwogCiAJCQlpZiAoY2RiWzBdID09IE1PREVfU0VOU0VfMTApIHsKIAkJCQlpZiAoIShidWZbM10gJiAweDgwKSkKQEAgLTc0Myw2ICs3MDQsOCBAQAogCQkJCWlmICghKGJ1ZlsyXSAmIDB4ODApKQogCQkJCQlidWZbMl0gfD0gMHg4MDsKIAkJCX0KKworCQkJdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UodGFzay0+dGFza19zZV9jbWQpOwogCQl9CiAJfQogYWZ0ZXJfbW9kZV9zZW5zZToKQEAgLTc2Niw4ICs3MjksOCBAQAogCQl1MzIgYmxvY2tzaXplOwogCiAJCWJ1ZiA9IHNnX3ZpcnQoJnNnWzBdKTsKLQkJaWYgKCEoYnVmKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZ2V0IGJ1ZiBmb3Igc2NhdHRlcmxpc3RcbiIpOworCQlpZiAoIWJ1ZikgeworCQkJcHJfZXJyKCJVbmFibGUgdG8gZ2V0IGJ1ZiBmb3Igc2NhdHRlcmxpc3RcbiIpOwogCQkJZ290byBhZnRlcl9tb2RlX3NlbGVjdDsKIAkJfQogCkBAIC03OTcsMzMgKzc2MCwxOSBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNlX3Rhc2sgKgotcHNjc2lfYWxsb2NfdGFzayhzdHJ1Y3Qgc2VfY21kICpjbWQpCitwc2NzaV9hbGxvY190YXNrKHVuc2lnbmVkIGNoYXIgKmNkYikKIHsKIAlzdHJ1Y3QgcHNjc2lfcGx1Z2luX3Rhc2sgKnB0OwotCXVuc2lnbmVkIGNoYXIgKmNkYiA9IFRfVEFTSyhjbWQpLT50X3Rhc2tfY2RiOwotCi0JcHQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHNjc2lfcGx1Z2luX3Rhc2spLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXB0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBwc2NzaV9wbHVnaW5fdGFza1xuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KIAogCS8qCi0JICogSWYgVENNIENvcmUgaXMgc2lnbmFsaW5nIGEgPiBUQ01fTUFYX0NPTU1BTkRfU0laRSBhbGxvY2F0aW9uLAotCSAqIGFsbG9jYXRlIHRoZSBleHRlbmRlZCBDREIgYnVmZmVyIGZvciBwZXIgc3RydWN0IHNlX3Rhc2sgY29udGV4dAotCSAqIHB0LT5wc2NzaV9jZGIgbm93LgorCSAqIER5bmFtaWNhbGx5IGFsbG9jIGNkYiBzcGFjZSwgc2luY2UgaXQgbWF5IGJlIGxhcmdlciB0aGFuCisJICogVENNX01BWF9DT01NQU5EX1NJWkUKIAkgKi8KLQlpZiAoVF9UQVNLKGNtZCktPnRfdGFza19jZGIgIT0gVF9UQVNLKGNtZCktPl9fdF90YXNrX2NkYikgewotCi0JCXB0LT5wc2NzaV9jZGIgPSBremFsbG9jKHNjc2lfY29tbWFuZF9zaXplKGNkYiksIEdGUF9LRVJORUwpOwotCQlpZiAoIShwdC0+cHNjc2lfY2RiKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJwU0NTSTogVW5hYmxlIHRvIGFsbG9jYXRlIGV4dGVuZGVkIgotCQkJCQkiIHB0LT5wc2NzaV9jZGJcbiIpOwotCQkJa2ZyZWUocHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9IGVsc2UKLQkJcHQtPnBzY3NpX2NkYiA9ICZwdC0+X19wc2NzaV9jZGJbMF07CisJcHQgPSBremFsbG9jKHNpemVvZigqcHQpICsgc2NzaV9jb21tYW5kX3NpemUoY2RiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgcHNjc2lfcGx1Z2luX3Rhc2tcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlyZXR1cm4gJnB0LT5wc2NzaV90YXNrOwogfQpAQCAtODQ5LDcgKzc5OCw3IEBACiAJICogYWxzbyBzZXQgdGhlIGVuZF9pb19kYXRhIHBvaW50ZXIudG8gc3RydWN0IHNlX3Rhc2suCiAJICovCiAJcmVxLT5lbmRfaW8gPSBwc2NzaV9yZXFfZG9uZTsKLQlyZXEtPmVuZF9pb19kYXRhID0gKHZvaWQgKil0YXNrOworCXJlcS0+ZW5kX2lvX2RhdGEgPSB0YXNrOwogCS8qCiAJICogTG9hZCB0aGUgcmVmZXJlbmNlZCBzdHJ1Y3Qgc2VfdGFzaydzIFNDU0kgQ0RCIGludG8KIAkgKiBpbmNsdWRlL2xpbnV4L2Jsa2Rldi5oOnN0cnVjdCByZXF1ZXN0LT5jbWQKQEAgLTg1OSw3ICs4MDgsNyBAQAogCS8qCiAJICogU2V0dXAgcG9pbnRlciBmb3Igb3V0Z29pbmcgc2Vuc2UgZGF0YS4KIAkgKi8KLQlyZXEtPnNlbnNlID0gKHZvaWQgKikmcHQtPnBzY3NpX3NlbnNlWzBdOworCXJlcS0+c2Vuc2UgPSAmcHQtPnBzY3NpX3NlbnNlWzBdOwogCXJlcS0+c2Vuc2VfbGVuID0gMDsKIH0KIApAQCAtODc0LDggKzgyMyw4IEBACiAJcHQtPnBzY3NpX3JlcSA9IGJsa19nZXRfcmVxdWVzdChwZHYtPnBkdl9zZC0+cmVxdWVzdF9xdWV1ZSwKIAkJCSh0YXNrLT50YXNrX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpLAogCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCEocHQtPnBzY3NpX3JlcSkgfHwgSVNfRVJSKHB0LT5wc2NzaV9yZXEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUFNDU0k6IGJsa19nZXRfcmVxdWVzdCgpIGZhaWxlZDogJWxkXG4iLAorCWlmICghcHQtPnBzY3NpX3JlcSB8fCBJU19FUlIocHQtPnBzY3NpX3JlcSkpIHsKKwkJcHJfZXJyKCJQU0NTSTogYmxrX2dldF9yZXF1ZXN0KCkgZmFpbGVkOiAlbGRcbiIsCiAJCQkJSVNfRVJSKHB0LT5wc2NzaV9yZXEpKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOwogCX0KQEAgLTkyMCwxNSArODY5LDggQEAKIHN0YXRpYyB2b2lkIHBzY3NpX2ZyZWVfdGFzayhzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKIHsKIAlzdHJ1Y3QgcHNjc2lfcGx1Z2luX3Rhc2sgKnB0ID0gUFNDU0lfVEFTSyh0YXNrKTsKLQlzdHJ1Y3Qgc2VfY21kICpjbWQgPSB0YXNrLT50YXNrX3NlX2NtZDsKIAogCS8qCi0JICogUmVsZWFzZSB0aGUgZXh0ZW5kZWQgQ0RCIGFsbG9jYXRpb24gZnJvbSBwc2NzaV9hbGxvY190YXNrKCkKLQkgKiBpZiBvbmUgZXhpc3RzLgotCSAqLwotCWlmIChUX1RBU0soY21kKS0+dF90YXNrX2NkYiAhPSBUX1RBU0soY21kKS0+X190X3Rhc2tfY2RiKQotCQlrZnJlZShwdC0+cHNjc2lfY2RiKTsKLQkvKgogCSAqIFdlIGRvIG5vdCByZWxlYXNlIHRoZSBiaW8ocykgaGVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXNrLCBhcwogCSAqIHRoaXMgaXMgaGFuZGxlZCBieSBiaW9fcHV0KCkgYW5kIHBzY3NpX2JpX2VuZGlvKCkuCiAJICovCkBAIC05NzMsNyArOTE1LDcgQEAKIAkJc3dpdGNoICh0b2tlbikgewogCQljYXNlIE9wdF9zY3NpX2hvc3RfaWQ6CiAJCQlpZiAocGh2LT5waHZfbW9kZSA9PSBQSFZfTExEX1NDU0lfSE9TVF9OTykgewotCQkJCXByaW50ayhLRVJOX0VSUiAiUFNDU0lbJWRdOiBVbmFibGUgdG8gYWNjZXB0IgorCQkJCXByX2VycigiUFNDU0lbJWRdOiBVbmFibGUgdG8gYWNjZXB0IgogCQkJCQkiIHNjc2lfaG9zdF9pZCB3aGlsZSBwaHZfbW9kZSA9PSIKIAkJCQkJIiBQSFZfTExEX1NDU0lfSE9TVF9OT1xuIiwKIAkJCQkJcGh2LT5waHZfaG9zdF9pZCk7CkBAIC05ODIsMTQgKzkyNCwxNCBAQAogCQkJfQogCQkJbWF0Y2hfaW50KGFyZ3MsICZhcmcpOwogCQkJcGR2LT5wZHZfaG9zdF9pZCA9IGFyZzsKLQkJCXByaW50ayhLRVJOX0lORk8gIlBTQ1NJWyVkXTogUmVmZXJlbmNpbmcgU0NTSSBIb3N0IElEOiIKKwkJCXByX2RlYnVnKCJQU0NTSVslZF06IFJlZmVyZW5jaW5nIFNDU0kgSG9zdCBJRDoiCiAJCQkJIiAlZFxuIiwgcGh2LT5waHZfaG9zdF9pZCwgcGR2LT5wZHZfaG9zdF9pZCk7CiAJCQlwZHYtPnBkdl9mbGFncyB8PSBQREZfSEFTX1ZJUlRfSE9TVF9JRDsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9zY3NpX2NoYW5uZWxfaWQ6CiAJCQltYXRjaF9pbnQoYXJncywgJmFyZyk7CiAJCQlwZHYtPnBkdl9jaGFubmVsX2lkID0gYXJnOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUFNDU0lbJWRdOiBSZWZlcmVuY2luZyBTQ1NJIENoYW5uZWwiCisJCQlwcl9kZWJ1ZygiUFNDU0lbJWRdOiBSZWZlcmVuY2luZyBTQ1NJIENoYW5uZWwiCiAJCQkJIiBJRDogJWRcbiIsICBwaHYtPnBodl9ob3N0X2lkLAogCQkJCXBkdi0+cGR2X2NoYW5uZWxfaWQpOwogCQkJcGR2LT5wZHZfZmxhZ3MgfD0gUERGX0hBU19DSEFOTkVMX0lEOwpAQCAtOTk3LDcgKzkzOSw3IEBACiAJCWNhc2UgT3B0X3Njc2lfdGFyZ2V0X2lkOgogCQkJbWF0Y2hfaW50KGFyZ3MsICZhcmcpOwogCQkJcGR2LT5wZHZfdGFyZ2V0X2lkID0gYXJnOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUFNDU0lbJWRdOiBSZWZlcmVuY2luZyBTQ1NJIFRhcmdldCIKKwkJCXByX2RlYnVnKCJQU0NTSVslZF06IFJlZmVyZW5jaW5nIFNDU0kgVGFyZ2V0IgogCQkJCSIgSUQ6ICVkXG4iLCBwaHYtPnBodl9ob3N0X2lkLAogCQkJCXBkdi0+cGR2X3RhcmdldF9pZCk7CiAJCQlwZHYtPnBkdl9mbGFncyB8PSBQREZfSEFTX1RBUkdFVF9JRDsKQEAgLTEwMDUsNyArOTQ3LDcgQEAKIAkJY2FzZSBPcHRfc2NzaV9sdW5faWQ6CiAJCQltYXRjaF9pbnQoYXJncywgJmFyZyk7CiAJCQlwZHYtPnBkdl9sdW5faWQgPSBhcmc7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJQU0NTSVslZF06IFJlZmVyZW5jaW5nIFNDU0kgTFVOIElEOiIKKwkJCXByX2RlYnVnKCJQU0NTSVslZF06IFJlZmVyZW5jaW5nIFNDU0kgTFVOIElEOiIKIAkJCQkiICVkXG4iLCBwaHYtPnBodl9ob3N0X2lkLCBwZHYtPnBkdl9sdW5faWQpOwogCQkJcGR2LT5wZHZfZmxhZ3MgfD0gUERGX0hBU19MVU5fSUQ7CiAJCQlicmVhazsKQEAgLTEwMjgsOSArOTcwLDkgQEAKIAlpZiAoIShwZHYtPnBkdl9mbGFncyAmIFBERl9IQVNfQ0hBTk5FTF9JRCkgfHwKIAkgICAgIShwZHYtPnBkdl9mbGFncyAmIFBERl9IQVNfVEFSR0VUX0lEKSB8fAogCSAgICAhKHBkdi0+cGR2X2ZsYWdzICYgUERGX0hBU19MVU5fSUQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWlzc2luZyBzY3NpX2NoYW5uZWxfaWQ9LCBzY3NpX3RhcmdldF9pZD0gYW5kIgorCQlwcl9lcnIoIk1pc3Npbmcgc2NzaV9jaGFubmVsX2lkPSwgc2NzaV90YXJnZXRfaWQ9IGFuZCIKIAkJCSIgc2NzaV9sdW5faWQ9IHBhcmFtZXRlcnNcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTA5MCw3ICsxMDMyLDcgQEAKIAliaW9fcHV0KGJpbyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGJpbyAqcHNjc2lfZ2V0X2JpbyhzdHJ1Y3QgcHNjc2lfZGV2X3ZpcnQgKnBkdiwgaW50IHNnX251bSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJpbyAqcHNjc2lfZ2V0X2JpbyhpbnQgc2dfbnVtKQogewogCXN0cnVjdCBiaW8gKmJpbzsKIAkvKgpAQCAtMTA5OCw4ICsxMDQwLDggQEAKIAkgKiBpbiBibG9jay9ibGstY29yZS5jOmJsa19tYWtlX3JlcXVlc3QoKQogCSAqLwogCWJpbyA9IGJpb19rbWFsbG9jKEdGUF9LRVJORUwsIHNnX251bSk7Ci0JaWYgKCEoYmlvKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlBTQ1NJOiBiaW9fa21hbGxvYygpIGZhaWxlZFxuIik7CisJaWYgKCFiaW8pIHsKKwkJcHJfZXJyKCJQU0NTSTogYmlvX2ttYWxsb2MoKSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJYmlvLT5iaV9lbmRfaW8gPSBwc2NzaV9iaV9lbmRpbzsKQEAgLTExMDcsMTMgKzEwNDksNyBAQAogCXJldHVybiBiaW87CiB9CiAKLSNpZiAwCi0jZGVmaW5lIERFQlVHX1BTQ1NJKHguLi4pIHByaW50ayh4KQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfUFNDU0koeC4uLikKLSNlbmRpZgotCi1zdGF0aWMgaW50IF9fcHNjc2lfbWFwX3Rhc2tfU0coCitzdGF0aWMgaW50IF9fcHNjc2lfbWFwX1NHKAogCXN0cnVjdCBzZV90YXNrICp0YXNrLAogCXN0cnVjdCBzY2F0dGVybGlzdCAqdGFza19zZywKIAl1MzIgdGFza19zZ19udW0sCkBAIC0xMTM0LDcgKzEwNzAsNyBAQAogCQlyZXR1cm4gMDsKIAkvKgogCSAqIEZvciBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQiwgVXNlIGZzL2Jpby5jOmJpb19hZGRfcGFnZSgpIHRvIHNldHVwCi0JICogdGhlIGJpb192ZWMgbWFwbGlzdCBmcm9tIFRDPCBzdHJ1Y3Qgc2VfbWVtIC0+IHRhc2stPnRhc2tfc2cgLT4KKwkgKiB0aGUgYmlvX3ZlYyBtYXBsaXN0IGZyb20gdGFzay0+dGFza19zZyAtPgogCSAqIHN0cnVjdCBzY2F0dGVybGlzdCBtZW1vcnkuICBUaGUgc3RydWN0IHNlX3Rhc2stPnRhc2tfc2dbXSBjdXJyZW50bHkgbmVlZHMKIAkgKiB0byBiZSBhdHRhY2hlZCB0byBzdHJ1Y3QgYmlvcyBmb3Igc3VibWlzc2lvbiB0byBMaW51eC9TQ1NJIHVzaW5nCiAJICogc3RydWN0IHJlcXVlc3QgdG8gc3RydWN0IHNjc2lfZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLgpAQCAtMTE0MywzNCArMTA3OSwzNCBAQAogCSAqIGlzIHBvcnRlZCB0byB1cHN0cmVhbSBTQ1NJIHBhc3N0aHJvdWdoIGZ1bmN0aW9uYWxpdHkgdGhhdCBhY2NlcHRzCiAJICogc3RydWN0IHNjYXR0ZXJsaXN0LT5wYWdlX2xpbmsgb3Igc3RydWN0IHBhZ2UgYXMgYSBwYXJhZW1ldGVyLgogCSAqLwotCURFQlVHX1BTQ1NJKCJQU0NTSTogbnJfcGFnZXM6ICVkXG4iLCBucl9wYWdlcyk7CisJcHJfZGVidWcoIlBTQ1NJOiBucl9wYWdlczogJWRcbiIsIG5yX3BhZ2VzKTsKIAogCWZvcl9lYWNoX3NnKHRhc2tfc2csIHNnLCB0YXNrX3NnX251bSwgaSkgewogCQlwYWdlID0gc2dfcGFnZShzZyk7CiAJCW9mZiA9IHNnLT5vZmZzZXQ7CiAJCWxlbiA9IHNnLT5sZW5ndGg7CiAKLQkJREVCVUdfUFNDU0koIlBTQ1NJOiBpOiAlZCBwYWdlOiAlcCBsZW46ICVkIG9mZjogJWRcbiIsIGksCisJCXByX2RlYnVnKCJQU0NTSTogaTogJWQgcGFnZTogJXAgbGVuOiAlZCBvZmY6ICVkXG4iLCBpLAogCQkJcGFnZSwgbGVuLCBvZmYpOwogCiAJCXdoaWxlIChsZW4gPiAwICYmIGRhdGFfbGVuID4gMCkgewogCQkJYnl0ZXMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgUEFHRV9TSVpFIC0gb2ZmKTsKIAkJCWJ5dGVzID0gbWluKGJ5dGVzLCBkYXRhX2xlbik7CiAKLQkJCWlmICghKGJpbykpIHsKKwkJCWlmICghYmlvKSB7CiAJCQkJbnJfdmVjcyA9IG1pbl90KGludCwgQklPX01BWF9QQUdFUywgbnJfcGFnZXMpOwogCQkJCW5yX3BhZ2VzIC09IG5yX3ZlY3M7CiAJCQkJLyoKIAkJCQkgKiBDYWxscyBiaW9fa21hbGxvYygpIGFuZCBzZXRzIGJpby0+YmlfZW5kX2lvKCkKIAkJCQkgKi8KLQkJCQliaW8gPSBwc2NzaV9nZXRfYmlvKHBkdiwgbnJfdmVjcyk7Ci0JCQkJaWYgKCEoYmlvKSkKKwkJCQliaW8gPSBwc2NzaV9nZXRfYmlvKG5yX3ZlY3MpOworCQkJCWlmICghYmlvKQogCQkJCQlnb3RvIGZhaWw7CiAKIAkJCQlpZiAocncpCiAJCQkJCWJpby0+YmlfcncgfD0gUkVRX1dSSVRFOwogCi0JCQkJREVCVUdfUFNDU0koIlBTQ1NJOiBBbGxvY2F0ZWQgYmlvOiAlcCwiCisJCQkJcHJfZGVidWcoIlBTQ1NJOiBBbGxvY2F0ZWQgYmlvOiAlcCwiCiAJCQkJCSIgZGlyOiAlcyBucl92ZWNzOiAlZFxuIiwgYmlvLAogCQkJCQkocncpID8gInJ3IiA6ICJyIiwgbnJfdmVjcyk7CiAJCQkJLyoKQEAgLTExODUsNyArMTEyMSw3IEBACiAJCQkJCXRiaW8gPSB0YmlvLT5iaV9uZXh0ID0gYmlvOwogCQkJfQogCi0JCQlERUJVR19QU0NTSSgiUFNDU0k6IENhbGxpbmcgYmlvX2FkZF9wY19wYWdlKCkgaTogJWQiCisJCQlwcl9kZWJ1ZygiUFNDU0k6IENhbGxpbmcgYmlvX2FkZF9wY19wYWdlKCkgaTogJWQiCiAJCQkJIiBiaW86ICVwIHBhZ2U6ICVwIGxlbjogJWQgb2ZmOiAlZFxuIiwgaSwgYmlvLAogCQkJCXBhZ2UsIGxlbiwgb2ZmKTsKIApAQCAtMTE5NCwxMSArMTEzMCwxMSBAQAogCQkJaWYgKHJjICE9IGJ5dGVzKQogCQkJCWdvdG8gZmFpbDsKIAotCQkJREVCVUdfUFNDU0koIlBTQ1NJOiBiaW8tPmJpX3ZjbnQ6ICVkIG5yX3ZlY3M6ICVkXG4iLAorCQkJcHJfZGVidWcoIlBTQ1NJOiBiaW8tPmJpX3ZjbnQ6ICVkIG5yX3ZlY3M6ICVkXG4iLAogCQkJCWJpby0+YmlfdmNudCwgbnJfdmVjcyk7CiAKIAkJCWlmIChiaW8tPmJpX3ZjbnQgPiBucl92ZWNzKSB7Ci0JCQkJREVCVUdfUFNDU0koIlBTQ1NJOiBSZWFjaGVkIGJpby0+YmlfdmNudCBtYXg6IgorCQkJCXByX2RlYnVnKCJQU0NTSTogUmVhY2hlZCBiaW8tPmJpX3ZjbnQgbWF4OiIKIAkJCQkJIiAlZCBpOiAlZCBiaW86ICVwLCBhbGxvY2F0aW5nIGFub3RoZXIiCiAJCQkJCSIgYmlvXG4iLCBiaW8tPmJpX3ZjbnQsIGksIGJpbyk7CiAJCQkJLyoKQEAgLTEyMjAsMTUgKzExNTYsMTUgQEAKIAkgKiBTZXR1cCB0aGUgcHJpbWFyeSBwdC0+cHNjc2lfcmVxIHVzZWQgZm9yIG5vbiBCSURJIGFuZCBCSURJLUNPTU1BTkQKIAkgKiBwcmltYXJ5IFNDU0kgV1JJVEUgcG9heWxvYWQgbWFwcGVkIGZvciBzdHJ1Y3Qgc2VfdGFzay0+dGFza19zZ1tdCiAJICovCi0JaWYgKCEoYmlkaV9yZWFkKSkgeworCWlmICghYmlkaV9yZWFkKSB7CiAJCS8qCiAJCSAqIFN0YXJ0aW5nIHdpdGggdjIuNi4zMSwgY2FsbCBibGtfbWFrZV9yZXF1ZXN0KCkgcGFzc2luZyBpbiAqaGJpbyB0bwogCQkgKiBhbGxvY2F0ZSB0aGUgcFNDU0kgdGFzayBhIHN0cnVjdCByZXF1ZXN0LgogCQkgKi8KIAkJcHQtPnBzY3NpX3JlcSA9IGJsa19tYWtlX3JlcXVlc3QocGR2LT5wZHZfc2QtPnJlcXVlc3RfcXVldWUsCiAJCQkJCWhiaW8sIEdGUF9LRVJORUwpOwotCQlpZiAoIShwdC0+cHNjc2lfcmVxKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJwU0NTSTogYmxrX21ha2VfcmVxdWVzdCgpIGZhaWxlZFxuIik7CisJCWlmICghcHQtPnBzY3NpX3JlcSkgeworCQkJcHJfZXJyKCJwU0NTSTogYmxrX21ha2VfcmVxdWVzdCgpIGZhaWxlZFxuIik7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAkJLyoKQEAgLTEyMzcsNyArMTE3Myw3IEBACiAJCSAqLwogCQlwc2NzaV9ibGtfaW5pdF9yZXF1ZXN0KHRhc2ssIHB0LCBwdC0+cHNjc2lfcmVxLCAwKTsKIAotCQlyZXR1cm4gdGFzay0+dGFza19zZ19udW07CisJCXJldHVybiB0YXNrLT50YXNrX3NnX25lbnRzOwogCX0KIAkvKgogCSAqIFNldHVwIHRoZSBzZWNvbmRhcnkgcHQtPnBzY3NpX3JlcS0+bmV4dF9ycSB1c2VkIGZvciB0aGUgZXh0cmEgQklESS1DT01NQU5ECkBAIC0xMjQ1LDEzICsxMTgxLDEzIEBACiAJICovCiAJcHQtPnBzY3NpX3JlcS0+bmV4dF9ycSA9IGJsa19tYWtlX3JlcXVlc3QocGR2LT5wZHZfc2QtPnJlcXVlc3RfcXVldWUsCiAJCQkJCWhiaW8sIEdGUF9LRVJORUwpOwotCWlmICghKHB0LT5wc2NzaV9yZXEtPm5leHRfcnEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicFNDU0k6IGJsa19tYWtlX3JlcXVlc3QoKSBmYWlsZWQgZm9yIEJJRElcbiIpOworCWlmICghcHQtPnBzY3NpX3JlcS0+bmV4dF9ycSkgeworCQlwcl9lcnIoInBTQ1NJOiBibGtfbWFrZV9yZXF1ZXN0KCkgZmFpbGVkIGZvciBCSURJXG4iKTsKIAkJZ290byBmYWlsOwogCX0KIAlwc2NzaV9ibGtfaW5pdF9yZXF1ZXN0KHRhc2ssIHB0LCBwdC0+cHNjc2lfcmVxLT5uZXh0X3JxLCAxKTsKIAotCXJldHVybiB0YXNrLT50YXNrX3NnX251bTsKKwlyZXR1cm4gdGFzay0+dGFza19zZ19uZW50czsKIGZhaWw6CiAJd2hpbGUgKGhiaW8pIHsKIAkJYmlvID0gaGJpbzsKQEAgLTEyNjIsNyArMTE5OCwxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcHNjc2lfbWFwX3Rhc2tfU0coc3RydWN0IHNlX3Rhc2sgKnRhc2spCisvKgorICogcFNDU0kgbWFwcyBib3RoIC0+bWFwX2NvbnRyb2xfU0coKSBhbmQgLT5tYXBfZGF0YV9TRygpIHRvIGEgc2luZ2xlIGNhbGwuCisgKi8KK3N0YXRpYyBpbnQgcHNjc2lfbWFwX1NHKHN0cnVjdCBzZV90YXNrICp0YXNrKQogewogCWludCByZXQ7CiAKQEAgLTEyNzAsMTQgKzEyMDksMTQgQEAKIAkgKiBTZXR1cCB0aGUgbWFpbiBzdHJ1Y3QgcmVxdWVzdCBmb3IgdGhlIHRhc2stPnRhc2tfc2dbXSBwYXlsb2FkCiAJICovCiAKLQlyZXQgPSBfX3BzY3NpX21hcF90YXNrX1NHKHRhc2ssIHRhc2stPnRhc2tfc2csIHRhc2stPnRhc2tfc2dfbnVtLCAwKTsKKwlyZXQgPSBfX3BzY3NpX21hcF9TRyh0YXNrLCB0YXNrLT50YXNrX3NnLCB0YXNrLT50YXNrX3NnX25lbnRzLCAwKTsKIAlpZiAocmV0ID49IDAgJiYgdGFzay0+dGFza19zZ19iaWRpKSB7CiAJCS8qCiAJCSAqIElmIHByZXNlbnQsIHNldCB1cCB0aGUgZXh0cmEgQklESS1DT01NQU5EIFNDU0kgUkVBRAogCQkgKiBzdHJ1Y3QgcmVxdWVzdCBhbmQgcGF5bG9hZC4KIAkJICovCi0JCXJldCA9IF9fcHNjc2lfbWFwX3Rhc2tfU0codGFzaywgdGFzay0+dGFza19zZ19iaWRpLAotCQkJCQl0YXNrLT50YXNrX3NnX251bSwgMSk7CisJCXJldCA9IF9fcHNjc2lfbWFwX1NHKHRhc2ssIHRhc2stPnRhc2tfc2dfYmlkaSwKKwkJCQkJdGFzay0+dGFza19zZ19uZW50cywgMSk7CiAJfQogCiAJaWYgKHJldCA8IDApCkBAIC0xMjg1LDMzICsxMjI0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoJcHNjc2lfbWFwX3Rhc2tfbm9uX1NHKCk6Ci0gKgotICoKLSAqLwotc3RhdGljIGludCBwc2NzaV9tYXBfdGFza19ub25fU0coc3RydWN0IHNlX3Rhc2sgKnRhc2spCi17Ci0Jc3RydWN0IHNlX2NtZCAqY21kID0gVEFTS19DTUQodGFzayk7Ci0Jc3RydWN0IHBzY3NpX3BsdWdpbl90YXNrICpwdCA9IFBTQ1NJX1RBU0sodGFzayk7Ci0Jc3RydWN0IHBzY3NpX2Rldl92aXJ0ICpwZHYgPSB0YXNrLT5zZV9kZXYtPmRldl9wdHI7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAocHNjc2lfYmxrX2dldF9yZXF1ZXN0KHRhc2spIDwgMCkKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOwotCi0JaWYgKCF0YXNrLT50YXNrX3NpemUpCi0JCXJldHVybiAwOwotCi0JcmV0ID0gYmxrX3JxX21hcF9rZXJuKHBkdi0+cGR2X3NkLT5yZXF1ZXN0X3F1ZXVlLAotCQkJcHQtPnBzY3NpX3JlcSwgVF9UQVNLKGNtZCktPnRfdGFza19idWYsCi0JCQl0YXNrLT50YXNrX3NpemUsIEdGUF9LRVJORUwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUFNDU0k6IGJsa19ycV9tYXBfa2VybigpIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgcHNjc2lfQ0RCX25vbmUoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7CiAJcmV0dXJuIHBzY3NpX2Jsa19nZXRfcmVxdWVzdCh0YXNrKTsKQEAgLTEzODMsOSArMTI5NSw5IEBACiAJc3RydWN0IHBzY3NpX3BsdWdpbl90YXNrICpwdCkKIHsKIAl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gc3RhdHVzX2J5dGUocHQtPnBzY3NpX3Jlc3VsdCk7Ci0JaWYgKCh0YXNrLT50YXNrX3Njc2lfc3RhdHVzKSkgeworCWlmICh0YXNrLT50YXNrX3Njc2lfc3RhdHVzKSB7CiAJCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPDw9IDE7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBTQ1NJIFN0YXR1cyBCeXRlIGV4Y2VwdGlvbiBhdCB0YXNrOiAlcCBDREI6IgorCQlwcl9kZWJ1ZygiUFNDU0kgU3RhdHVzIEJ5dGUgZXhjZXB0aW9uIGF0IHRhc2s6ICVwIENEQjoiCiAJCQkiIDB4JTAyeCBSZXN1bHQ6IDB4JTA4eFxuIiwgdGFzaywgcHQtPnBzY3NpX2NkYlswXSwKIAkJCXB0LT5wc2NzaV9yZXN1bHQpOwogCX0KQEAgLTEzOTUsMTggKzEzMDcsMTYgQEAKIAkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgKCF0YXNrLT50YXNrX3Njc2lfc3RhdHVzKSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0lORk8gIlBTQ1NJIEhvc3QgQnl0ZSBleGNlcHRpb24gYXQgdGFzazogJXAgQ0RCOiIKKwkJcHJfZGVidWcoIlBTQ1NJIEhvc3QgQnl0ZSBleGNlcHRpb24gYXQgdGFzazogJXAgQ0RCOiIKIAkJCSIgMHglMDJ4IFJlc3VsdDogMHglMDh4XG4iLCB0YXNrLCBwdC0+cHNjc2lfY2RiWzBdLAogCQkJcHQtPnBzY3NpX3Jlc3VsdCk7CiAJCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAJCXRhc2stPnRhc2tfZXJyb3Jfc3RhdHVzID0gUFlYX1RSQU5TUE9SVF9VTktOT1dOX1NBTV9PUENPREU7Ci0JCVRBU0tfQ01EKHRhc2spLT50cmFuc3BvcnRfZXJyb3Jfc3RhdHVzID0KKwkJdGFzay0+dGFza19zZV9jbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMgPQogCQkJCQlQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKIAkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMCk7CiAJCWJyZWFrOwogCX0KLQotCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgcHNjc2lfcmVxX2RvbmUoc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IHVwdG9kYXRlKQpAQCAtMTQzMyw4ICsxMzQzLDggQEAKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS50cmFuc3BvcnRfdHlwZQkJPSBUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFViwKIAkuY2RiX25vbmUJCT0gcHNjc2lfQ0RCX25vbmUsCi0JLm1hcF90YXNrX25vbl9TRwk9IHBzY3NpX21hcF90YXNrX25vbl9TRywKLQkubWFwX3Rhc2tfU0cJCT0gcHNjc2lfbWFwX3Rhc2tfU0csCisJLm1hcF9jb250cm9sX1NHCQk9IHBzY3NpX21hcF9TRywKKwkubWFwX2RhdGFfU0cJCT0gcHNjc2lfbWFwX1NHLAogCS5hdHRhY2hfaGJhCQk9IHBzY3NpX2F0dGFjaF9oYmEsCiAJLmRldGFjaF9oYmEJCT0gcHNjc2lfZGV0YWNoX2hiYSwKIAkucG1vZGVfZW5hYmxlX2hiYQk9IHBzY3NpX3Btb2RlX2VuYWJsZV9oYmEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wc2NzaS5oIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHNjc2kuaAppbmRleCBhNGNkNWQzLi5lYmY0ZjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wc2NzaS5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3BzY3NpLmgKQEAgLTIsNyArMiw2IEBACiAjZGVmaW5lIFRBUkdFVF9DT1JFX1BTQ1NJX0gKIAogI2RlZmluZSBQU0NTSV9WRVJTSU9OCQkidjQuMCIKLSNkZWZpbmUgUFNDU0lfVklSVFVBTF9IQkFfREVQVEgJMjA0OAogCiAvKiB1c2VkIGluIHBzY3NpX2ZpbmRfYWxsb2NfbGVuKCkgKi8KICNpZm5kZWYgSU5RVUlSWV9EQVRBX1NJWkUKQEAgLTI0LDEzICsyMywxMiBAQAogCiBzdHJ1Y3QgcHNjc2lfcGx1Z2luX3Rhc2sgewogCXN0cnVjdCBzZV90YXNrIHBzY3NpX3Rhc2s7Ci0JdW5zaWduZWQgY2hhciAqcHNjc2lfY2RiOwotCXVuc2lnbmVkIGNoYXIgX19wc2NzaV9jZGJbVENNX01BWF9DT01NQU5EX1NJWkVdOwogCXVuc2lnbmVkIGNoYXIgcHNjc2lfc2Vuc2VbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKIAlpbnQJcHNjc2lfZGlyZWN0aW9uOwogCWludAlwc2NzaV9yZXN1bHQ7CiAJdTMyCXBzY3NpX3Jlc2lkOwogCXN0cnVjdCByZXF1ZXN0ICpwc2NzaV9yZXE7CisJdW5zaWduZWQgY2hhciBwc2NzaV9jZGJbMF07CiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAogI2RlZmluZSBQREZfSEFTX0NIQU5ORUxfSUQJMHgwMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcmQuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3JkLmMKaW5kZXggNzgzN2RkMy4uM2RkODFkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcmQuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9yZC5jCkBAIC00NCwxMiArNDQsOCBAQAogCiAjaW5jbHVkZSAidGFyZ2V0X2NvcmVfcmQuaCIKIAotc3RhdGljIHN0cnVjdCBzZV9zdWJzeXN0ZW1fYXBpIHJkX2RyX3RlbXBsYXRlOwogc3RhdGljIHN0cnVjdCBzZV9zdWJzeXN0ZW1fYXBpIHJkX21jcF90ZW1wbGF0ZTsKIAotLyogI2RlZmluZSBERUJVR19SQU1ESVNLX01DUCAqLwotLyogI2RlZmluZSBERUJVR19SQU1ESVNLX0RSICovCi0KIC8qCXJkX2F0dGFjaF9oYmEoKTogKFBhcnQgb2Ygc2Vfc3Vic3lzdGVtX2FwaV90IHRlbXBsYXRlKQogICoKICAqCkBAIC01OSwyNCArNTUsMjEgQEAKIAlzdHJ1Y3QgcmRfaG9zdCAqcmRfaG9zdDsKIAogCXJkX2hvc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmRfaG9zdCksIEdGUF9LRVJORUwpOwotCWlmICghKHJkX2hvc3QpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RydWN0IHJkX2hvc3RcbiIpOworCWlmICghcmRfaG9zdCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cnVjdCByZF9ob3N0XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJcmRfaG9zdC0+cmRfaG9zdF9pZCA9IGhvc3RfaWQ7CiAKLQlhdG9taWNfc2V0KCZoYmEtPmxlZnRfcXVldWVfZGVwdGgsIFJEX0hCQV9RVUVVRV9ERVBUSCk7Ci0JYXRvbWljX3NldCgmaGJhLT5tYXhfcXVldWVfZGVwdGgsIFJEX0hCQV9RVUVVRV9ERVBUSCk7Ci0JaGJhLT5oYmFfcHRyID0gKHZvaWQgKikgcmRfaG9zdDsKKwloYmEtPmhiYV9wdHIgPSByZF9ob3N0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ09SRV9IQkFbJWRdIC0gVENNIFJhbWRpc2sgSEJBIERyaXZlciAlcyBvbiIKKwlwcl9kZWJ1ZygiQ09SRV9IQkFbJWRdIC0gVENNIFJhbWRpc2sgSEJBIERyaXZlciAlcyBvbiIKIAkJIiBHZW5lcmljIFRhcmdldCBDb3JlIFN0YWNrICVzXG4iLCBoYmEtPmhiYV9pZCwKIAkJUkRfSEJBX1ZFUlNJT04sIFRBUkdFVF9DT1JFX01PRF9WRVJTSU9OKTsKLQlwcmludGsoS0VSTl9JTkZPICJDT1JFX0hCQVslZF0gLSBBdHRhY2hlZCBSYW1kaXNrIEhCQTogJXUgdG8gR2VuZXJpYyIKLQkJIiBUYXJnZXQgQ29yZSBUQ1EgRGVwdGg6ICVkIE1heFNlY3RvcnM6ICV1XG4iLCBoYmEtPmhiYV9pZCwKLQkJcmRfaG9zdC0+cmRfaG9zdF9pZCwgYXRvbWljX3JlYWQoJmhiYS0+bWF4X3F1ZXVlX2RlcHRoKSwKLQkJUkRfTUFYX1NFQ1RPUlMpOworCXByX2RlYnVnKCJDT1JFX0hCQVslZF0gLSBBdHRhY2hlZCBSYW1kaXNrIEhCQTogJXUgdG8gR2VuZXJpYyIKKwkJIiBNYXhTZWN0b3JzOiAldVxuIiwgaGJhLT5oYmFfaWQsCisJCXJkX2hvc3QtPnJkX2hvc3RfaWQsIFJEX01BWF9TRUNUT1JTKTsKIAogCXJldHVybiAwOwogfQpAQCAtODUsNyArNzgsNyBAQAogewogCXN0cnVjdCByZF9ob3N0ICpyZF9ob3N0ID0gaGJhLT5oYmFfcHRyOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ09SRV9IQkFbJWRdIC0gRGV0YWNoZWQgUmFtZGlzayBIQkE6ICV1IGZyb20iCisJcHJfZGVidWcoIkNPUkVfSEJBWyVkXSAtIERldGFjaGVkIFJhbWRpc2sgSEJBOiAldSBmcm9tIgogCQkiIEdlbmVyaWMgVGFyZ2V0IENvcmVcbiIsIGhiYS0+aGJhX2lkLCByZF9ob3N0LT5yZF9ob3N0X2lkKTsKIAogCWtmcmVlKHJkX2hvc3QpOwpAQCAtMTE0LDcgKzEwNyw3IEBACiAKIAkJZm9yIChqID0gMDsgaiA8IHNnX3Blcl90YWJsZTsgaisrKSB7CiAJCQlwZyA9IHNnX3BhZ2UoJnNnW2pdKTsKLQkJCWlmICgocGcpKSB7CisJCQlpZiAocGcpIHsKIAkJCQlfX2ZyZWVfcGFnZShwZyk7CiAJCQkJcGFnZV9jb3VudCsrOwogCQkJfQpAQCAtMTIzLDcgKzExNiw3IEBACiAJCWtmcmVlKHNnKTsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJDT1JFX1JEWyV1XSAtIFJlbGVhc2VkIGRldmljZSBzcGFjZSBmb3IgUmFtZGlzayIKKwlwcl9kZWJ1ZygiQ09SRV9SRFsldV0gLSBSZWxlYXNlZCBkZXZpY2Ugc3BhY2UgZm9yIFJhbWRpc2siCiAJCSIgRGV2aWNlIElEOiAldSwgcGFnZXMgJXUgaW4gJXUgdGFibGVzIHRvdGFsIGJ5dGVzICVsdVxuIiwKIAkJcmRfZGV2LT5yZF9ob3N0LT5yZF9ob3N0X2lkLCByZF9kZXYtPnJkX2Rldl9pZCwgcGFnZV9jb3VudCwKIAkJcmRfZGV2LT5zZ190YWJsZV9jb3VudCwgKHVuc2lnbmVkIGxvbmcpcGFnZV9jb3VudCAqIFBBR0VfU0laRSk7CkBAIC0xNDgsNyArMTQxLDcgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCiAJaWYgKHJkX2Rldi0+cmRfcGFnZV9jb3VudCA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSWxsZWdhbCBwYWdlIGNvdW50OiAldSBmb3IgUmFtZGlzayBkZXZpY2VcbiIsCisJCXByX2VycigiSWxsZWdhbCBwYWdlIGNvdW50OiAldSBmb3IgUmFtZGlzayBkZXZpY2VcbiIsCiAJCQlyZF9kZXYtPnJkX3BhZ2VfY291bnQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNTcsOCArMTUwLDggQEAKIAlzZ190YWJsZXMgPSAodG90YWxfc2dfbmVlZGVkIC8gbWF4X3NnX3Blcl90YWJsZSkgKyAxOwogCiAJc2dfdGFibGUgPSBremFsbG9jKHNnX3RhYmxlcyAqIHNpemVvZihzdHJ1Y3QgcmRfZGV2X3NnX3RhYmxlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoc2dfdGFibGUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgUmFtZGlzayIKKwlpZiAoIXNnX3RhYmxlKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgUmFtZGlzayIKIAkJCSIgc2NhdHRlcmxpc3QgdGFibGVzXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTcyLDEzICsxNjUsMTMgQEAKIAogCQlzZyA9IGt6YWxsb2Moc2dfcGVyX3RhYmxlICogc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCksCiAJCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghKHNnKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgc2NhdHRlcmxpc3QgYXJyYXkiCisJCWlmICghc2cpIHsKKwkJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHNjYXR0ZXJsaXN0IGFycmF5IgogCQkJCSIgZm9yIHN0cnVjdCByZF9kZXZcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAotCQlzZ19pbml0X3RhYmxlKChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikmc2dbMF0sIHNnX3Blcl90YWJsZSk7CisJCXNnX2luaXRfdGFibGUoc2csIHNnX3Blcl90YWJsZSk7CiAKIAkJc2dfdGFibGVbaV0uc2dfdGFibGUgPSBzZzsKIAkJc2dfdGFibGVbaV0ucmRfc2dfY291bnQgPSBzZ19wZXJfdGFibGU7CkBAIC0xODgsOCArMTgxLDggQEAKIAogCQlmb3IgKGogPSAwOyBqIDwgc2dfcGVyX3RhYmxlOyBqKyspIHsKIAkJCXBnID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7Ci0JCQlpZiAoIShwZykpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBzY2F0dGVybGlzdCIKKwkJCWlmICghcGcpIHsKKwkJCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBzY2F0dGVybGlzdCIKIAkJCQkJIiBwYWdlcyBmb3Igc3RydWN0IHJkX2Rldl9zZ190YWJsZVxuIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CkBAIC0yMDEsNyArMTk0LDcgQEAKIAkJdG90YWxfc2dfbmVlZGVkIC09IHNnX3Blcl90YWJsZTsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJDT1JFX1JEWyV1XSAtIEJ1aWx0IFJhbWRpc2sgRGV2aWNlIElEOiAldSBzcGFjZSBvZiIKKwlwcl9kZWJ1ZygiQ09SRV9SRFsldV0gLSBCdWlsdCBSYW1kaXNrIERldmljZSBJRDogJXUgc3BhY2Ugb2YiCiAJCSIgJXUgcGFnZXMgaW4gJXUgdGFibGVzXG4iLCByZF9kZXYtPnJkX2hvc3QtPnJkX2hvc3RfaWQsCiAJCXJkX2Rldi0+cmRfZGV2X2lkLCByZF9kZXYtPnJkX3BhZ2VfY291bnQsCiAJCXJkX2Rldi0+c2dfdGFibGVfY291bnQpOwpAQCAtMjE4LDggKzIxMSw4IEBACiAJc3RydWN0IHJkX2hvc3QgKnJkX2hvc3QgPSBoYmEtPmhiYV9wdHI7CiAKIAlyZF9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmRfZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEocmRfZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cnVjdCByZF9kZXZcbiIpOworCWlmICghcmRfZGV2KSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RydWN0IHJkX2RldlxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMjI5LDExICsyMjIsNiBAQAogCXJldHVybiByZF9kZXY7CiB9CiAKLXN0YXRpYyB2b2lkICpyZF9ESVJFQ1RfYWxsb2NhdGVfdmlydGRldmljZShzdHJ1Y3Qgc2VfaGJhICpoYmEsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIHJkX2FsbG9jYXRlX3ZpcnRkZXZpY2UoaGJhLCBuYW1lLCAxKTsKLX0KLQogc3RhdGljIHZvaWQgKnJkX01FTUNQWV9hbGxvY2F0ZV92aXJ0ZGV2aWNlKHN0cnVjdCBzZV9oYmEgKmhiYSwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlyZXR1cm4gcmRfYWxsb2NhdGVfdmlydGRldmljZShoYmEsIG5hbWUsIDApOwpAQCAtMjczLDE2ICsyNjEsMTUgQEAKIAlkZXZfbGltaXRzLnF1ZXVlX2RlcHRoID0gUkRfREVWSUNFX1FVRVVFX0RFUFRIOwogCiAJZGV2ID0gdHJhbnNwb3J0X2FkZF9kZXZpY2VfdG9fY29yZV9oYmEoaGJhLAotCQkJKHJkX2Rldi0+cmRfZGlyZWN0KSA/ICZyZF9kcl90ZW1wbGF0ZSA6Ci0JCQkmcmRfbWNwX3RlbXBsYXRlLCBzZV9kZXYsIGRldl9mbGFncywgKHZvaWQgKilyZF9kZXYsCisJCQkmcmRfbWNwX3RlbXBsYXRlLCBzZV9kZXYsIGRldl9mbGFncywgcmRfZGV2LAogCQkJJmRldl9saW1pdHMsIHByb2QsIHJldik7Ci0JaWYgKCEoZGV2KSkKKwlpZiAoIWRldikKIAkJZ290byBmYWlsOwogCiAJcmRfZGV2LT5yZF9kZXZfaWQgPSByZF9ob3N0LT5yZF9ob3N0X2Rldl9pZF9jb3VudCsrOwogCXJkX2Rldi0+cmRfcXVldWVfZGVwdGggPSBkZXYtPnF1ZXVlX2RlcHRoOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ09SRV9SRFsldV0gLSBBZGRlZCBUQ00gJXMgUmFtZGlzayBEZXZpY2UgSUQ6ICV1IG9mIgorCXByX2RlYnVnKCJDT1JFX1JEWyV1XSAtIEFkZGVkIFRDTSAlcyBSYW1kaXNrIERldmljZSBJRDogJXUgb2YiCiAJCSIgJXUgcGFnZXMgaW4gJXUgdGFibGVzLCAlbHUgdG90YWwgYnl0ZXNcbiIsCiAJCXJkX2hvc3QtPnJkX2hvc3RfaWQsICghcmRfZGV2LT5yZF9kaXJlY3QpID8gIk1FTUNQWSIgOgogCQkiRElSRUNUIiwgcmRfZGV2LT5yZF9kZXZfaWQsIHJkX2Rldi0+cmRfcGFnZV9jb3VudCwKQEAgLTI5NiwxNCArMjgzLDYgQEAKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCi1zdGF0aWMgc3RydWN0IHNlX2RldmljZSAqcmRfRElSRUNUX2NyZWF0ZV92aXJ0ZGV2aWNlKAotCXN0cnVjdCBzZV9oYmEgKmhiYSwKLQlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc2VfZGV2LAotCXZvaWQgKnApCi17Ci0JcmV0dXJuIHJkX2NyZWF0ZV92aXJ0ZGV2aWNlKGhiYSwgc2VfZGV2LCBwLCAxKTsKLX0KLQogc3RhdGljIHN0cnVjdCBzZV9kZXZpY2UgKnJkX01FTUNQWV9jcmVhdGVfdmlydGRldmljZSgKIAlzdHJ1Y3Qgc2VfaGJhICpoYmEsCiAJc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKnNlX2RldiwKQEAgLTMzMCwxNiArMzA5LDE1IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2VfdGFzayAqCi1yZF9hbGxvY190YXNrKHN0cnVjdCBzZV9jbWQgKmNtZCkKK3JkX2FsbG9jX3Rhc2sodW5zaWduZWQgY2hhciAqY2RiKQogewogCXN0cnVjdCByZF9yZXF1ZXN0ICpyZF9yZXE7CiAKIAlyZF9yZXEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmRfcmVxdWVzdCksIEdGUF9LRVJORUwpOwogCWlmICghcmRfcmVxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCByZF9yZXF1ZXN0XG4iKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHJkX3JlcXVlc3RcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JcmRfcmVxLT5yZF9kZXYgPSBTRV9ERVYoY21kKS0+ZGV2X3B0cjsKIAogCXJldHVybiAmcmRfcmVxLT5yZF90YXNrOwogfQpAQCAtMzYwLDcgKzMzOCw3IEBACiAJCQlyZXR1cm4gc2dfdGFibGU7CiAJfQogCi0JcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCByZF9kZXZfc2dfdGFibGUgZm9yIHBhZ2U6ICV1XG4iLAorCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSBzdHJ1Y3QgcmRfZGV2X3NnX3RhYmxlIGZvciBwYWdlOiAldVxuIiwKIAkJCXBhZ2UpOwogCiAJcmV0dXJuIE5VTEw7CkBAIC0zNzMsNyArMzUxLDcgQEAKIHN0YXRpYyBpbnQgcmRfTUVNQ1BZX3JlYWQoc3RydWN0IHJkX3JlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3Qgc2VfdGFzayAqdGFzayA9ICZyZXEtPnJkX3Rhc2s7Ci0Jc3RydWN0IHJkX2RldiAqZGV2ID0gcmVxLT5yZF9kZXY7CisJc3RydWN0IHJkX2RldiAqZGV2ID0gcmVxLT5yZF90YXNrLnNlX2Rldi0+ZGV2X3B0cjsKIAlzdHJ1Y3QgcmRfZGV2X3NnX3RhYmxlICp0YWJsZTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2QsICpzZ19zOwogCXZvaWQgKmRzdCwgKnNyYzsKQEAgLTM4MiwzMiArMzYwLDMyIEBACiAJdTMyIHJkX29mZnNldCA9IHJlcS0+cmRfb2Zmc2V0OwogCiAJdGFibGUgPSByZF9nZXRfc2dfdGFibGUoZGV2LCByZXEtPnJkX3BhZ2UpOwotCWlmICghKHRhYmxlKSkKLQkJcmV0dXJuIC0xOworCWlmICghdGFibGUpCisJCXJldHVybiAtRUlOVkFMOwogCiAJdGFibGVfc2dfZW5kID0gKHRhYmxlLT5wYWdlX2VuZF9vZmZzZXQgLSByZXEtPnJkX3BhZ2UpOwogCXNnX2QgPSB0YXNrLT50YXNrX3NnOwogCXNnX3MgPSAmdGFibGUtPnNnX3RhYmxlW3JlcS0+cmRfcGFnZSAtIHRhYmxlLT5wYWdlX3N0YXJ0X29mZnNldF07Ci0jaWZkZWYgREVCVUdfUkFNRElTS19NQ1AKLQlwcmludGsoS0VSTl9JTkZPICJSRFsldV06IFJlYWQgTEJBOiAlbGx1LCBTaXplOiAldSBQYWdlOiAldSwgT2Zmc2V0OiIKKworCXByX2RlYnVnKCJSRFsldV06IFJlYWQgTEJBOiAlbGx1LCBTaXplOiAldSBQYWdlOiAldSwgT2Zmc2V0OiIKIAkJIiAldVxuIiwgZGV2LT5yZF9kZXZfaWQsIHRhc2stPnRhc2tfbGJhLCByZXEtPnJkX3NpemUsCiAJCXJlcS0+cmRfcGFnZSwgcmVxLT5yZF9vZmZzZXQpOwotI2VuZGlmCisKIAlzcmNfb2Zmc2V0ID0gcmRfb2Zmc2V0OwogCiAJd2hpbGUgKHJlcS0+cmRfc2l6ZSkgewogCQlpZiAoKHNnX2RbaV0ubGVuZ3RoIC0gZHN0X29mZnNldCkgPAogCQkgICAgKHNnX3Nbal0ubGVuZ3RoIC0gc3JjX29mZnNldCkpIHsKIAkJCWxlbmd0aCA9IChzZ19kW2ldLmxlbmd0aCAtIGRzdF9vZmZzZXQpOwotI2lmZGVmIERFQlVHX1JBTURJU0tfTUNQCi0JCQlwcmludGsoS0VSTl9JTkZPICJTdGVwIDEgLSBzZ19kWyVkXTogJXAgbGVuZ3RoOiAlZCIKKworCQkJcHJfZGVidWcoIlN0ZXAgMSAtIHNnX2RbJWRdOiAlcCBsZW5ndGg6ICVkIgogCQkJCSIgb2Zmc2V0OiAldSBzZ19zWyVkXS5sZW5ndGg6ICV1XG4iLCBpLAogCQkJCSZzZ19kW2ldLCBzZ19kW2ldLmxlbmd0aCwgc2dfZFtpXS5vZmZzZXQsIGosCiAJCQkJc2dfc1tqXS5sZW5ndGgpOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiU3RlcCAxIC0gbGVuZ3RoOiAldSBkc3Rfb2Zmc2V0OiAldSIKKwkJCXByX2RlYnVnKCJTdGVwIDEgLSBsZW5ndGg6ICV1IGRzdF9vZmZzZXQ6ICV1IgogCQkJCSIgc3JjX29mZnNldDogJXVcbiIsIGxlbmd0aCwgZHN0X29mZnNldCwKIAkJCQlzcmNfb2Zmc2V0KTsKLSNlbmRpZgorCiAJCQlpZiAobGVuZ3RoID4gcmVxLT5yZF9zaXplKQogCQkJCWxlbmd0aCA9IHJlcS0+cmRfc2l6ZTsKIApAQCAtNDI0LDE1ICs0MDIsMTUgQEAKIAkJCXBhZ2VfZW5kID0gMDsKIAkJfSBlbHNlIHsKIAkJCWxlbmd0aCA9IChzZ19zW2pdLmxlbmd0aCAtIHNyY19vZmZzZXQpOwotI2lmZGVmIERFQlVHX1JBTURJU0tfTUNQCi0JCQlwcmludGsoS0VSTl9JTkZPICJTdGVwIDIgLSBzZ19kWyVkXTogJXAgbGVuZ3RoOiAlZCIKKworCQkJcHJfZGVidWcoIlN0ZXAgMiAtIHNnX2RbJWRdOiAlcCBsZW5ndGg6ICVkIgogCQkJCSIgb2Zmc2V0OiAldSBzZ19zWyVkXS5sZW5ndGg6ICV1XG4iLCBpLAogCQkJCSZzZ19kW2ldLCBzZ19kW2ldLmxlbmd0aCwgc2dfZFtpXS5vZmZzZXQsCiAJCQkJaiwgc2dfc1tqXS5sZW5ndGgpOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiU3RlcCAyIC0gbGVuZ3RoOiAldSBkc3Rfb2Zmc2V0OiAldSIKKwkJCXByX2RlYnVnKCJTdGVwIDIgLSBsZW5ndGg6ICV1IGRzdF9vZmZzZXQ6ICV1IgogCQkJCSIgc3JjX29mZnNldDogJXVcbiIsIGxlbmd0aCwgZHN0X29mZnNldCwKIAkJCQlzcmNfb2Zmc2V0KTsKLSNlbmRpZgorCiAJCQlpZiAobGVuZ3RoID4gcmVxLT5yZF9zaXplKQogCQkJCWxlbmd0aCA9IHJlcS0+cmRfc2l6ZTsKIApAQCAtNDU2LDMyICs0MzQsMjkgQEAKIAogCQltZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7CiAKLSNpZmRlZiBERUJVR19SQU1ESVNLX01DUAotCQlwcmludGsoS0VSTl9JTkZPICJwYWdlOiAldSwgcmVtYWluaW5nIHNpemU6ICV1LCBsZW5ndGg6ICV1LCIKKwkJcHJfZGVidWcoInBhZ2U6ICV1LCByZW1haW5pbmcgc2l6ZTogJXUsIGxlbmd0aDogJXUsIgogCQkJIiBpOiAldSwgajogJXVcbiIsIHJlcS0+cmRfcGFnZSwKIAkJCShyZXEtPnJkX3NpemUgLSBsZW5ndGgpLCBsZW5ndGgsIGksIGopOwotI2VuZGlmCisKIAkJcmVxLT5yZF9zaXplIC09IGxlbmd0aDsKLQkJaWYgKCEocmVxLT5yZF9zaXplKSkKKwkJaWYgKCFyZXEtPnJkX3NpemUpCiAJCQlyZXR1cm4gMDsKIAogCQlpZiAoIXBhZ2VfZW5kKQogCQkJY29udGludWU7CiAKIAkJaWYgKCsrcmVxLT5yZF9wYWdlIDw9IHRhYmxlLT5wYWdlX2VuZF9vZmZzZXQpIHsKLSNpZmRlZiBERUJVR19SQU1ESVNLX01DUAotCQkJcHJpbnRrKEtFUk5fSU5GTyAicGFnZTogJXUgaW4gc2FtZSBwYWdlIHRhYmxlXG4iLAorCQkJcHJfZGVidWcoInBhZ2U6ICV1IGluIHNhbWUgcGFnZSB0YWJsZVxuIiwKIAkJCQlyZXEtPnJkX3BhZ2UpOwotI2VuZGlmCiAJCQljb250aW51ZTsKIAkJfQotI2lmZGVmIERFQlVHX1JBTURJU0tfTUNQCi0JCXByaW50ayhLRVJOX0lORk8gImdldHRpbmcgbmV3IHBhZ2UgdGFibGUgZm9yIHBhZ2U6ICV1XG4iLAorCisJCXByX2RlYnVnKCJnZXR0aW5nIG5ldyBwYWdlIHRhYmxlIGZvciBwYWdlOiAldVxuIiwKIAkJCQlyZXEtPnJkX3BhZ2UpOwotI2VuZGlmCisKIAkJdGFibGUgPSByZF9nZXRfc2dfdGFibGUoZGV2LCByZXEtPnJkX3BhZ2UpOwotCQlpZiAoISh0YWJsZSkpCi0JCQlyZXR1cm4gLTE7CisJCWlmICghdGFibGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlzZ19zID0gJnRhYmxlLT5zZ190YWJsZVtqID0gMF07CiAJfQpAQCAtNDk2LDcgKzQ3MSw3IEBACiBzdGF0aWMgaW50IHJkX01FTUNQWV93cml0ZShzdHJ1Y3QgcmRfcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBzZV90YXNrICp0YXNrID0gJnJlcS0+cmRfdGFzazsKLQlzdHJ1Y3QgcmRfZGV2ICpkZXYgPSByZXEtPnJkX2RldjsKKwlzdHJ1Y3QgcmRfZGV2ICpkZXYgPSByZXEtPnJkX3Rhc2suc2VfZGV2LT5kZXZfcHRyOwogCXN0cnVjdCByZF9kZXZfc2dfdGFibGUgKnRhYmxlOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfZCwgKnNnX3M7CiAJdm9pZCAqZHN0LCAqc3JjOwpAQCAtNTA1LDMyICs0ODAsMzIgQEAKIAl1MzIgcmRfb2Zmc2V0ID0gcmVxLT5yZF9vZmZzZXQ7CiAKIAl0YWJsZSA9IHJkX2dldF9zZ190YWJsZShkZXYsIHJlcS0+cmRfcGFnZSk7Ci0JaWYgKCEodGFibGUpKQotCQlyZXR1cm4gLTE7CisJaWYgKCF0YWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAl0YWJsZV9zZ19lbmQgPSAodGFibGUtPnBhZ2VfZW5kX29mZnNldCAtIHJlcS0+cmRfcGFnZSk7CiAJc2dfZCA9ICZ0YWJsZS0+c2dfdGFibGVbcmVxLT5yZF9wYWdlIC0gdGFibGUtPnBhZ2Vfc3RhcnRfb2Zmc2V0XTsKIAlzZ19zID0gdGFzay0+dGFza19zZzsKLSNpZmRlZiBERUJVR19SQU1ESVNLX01DUAotCXByaW50ayhLRVJOX0lORk8gIlJEWyVkXSBXcml0ZSBMQkE6ICVsbHUsIFNpemU6ICV1LCBQYWdlOiAldSwiCisKKwlwcl9kZWJ1ZygiUkRbJWRdIFdyaXRlIExCQTogJWxsdSwgU2l6ZTogJXUsIFBhZ2U6ICV1LCIKIAkJIiBPZmZzZXQ6ICV1XG4iLCBkZXYtPnJkX2Rldl9pZCwgdGFzay0+dGFza19sYmEsIHJlcS0+cmRfc2l6ZSwKIAkJcmVxLT5yZF9wYWdlLCByZXEtPnJkX29mZnNldCk7Ci0jZW5kaWYKKwogCWRzdF9vZmZzZXQgPSByZF9vZmZzZXQ7CiAKIAl3aGlsZSAocmVxLT5yZF9zaXplKSB7CiAJCWlmICgoc2dfc1tpXS5sZW5ndGggLSBzcmNfb2Zmc2V0KSA8CiAJCSAgICAoc2dfZFtqXS5sZW5ndGggLSBkc3Rfb2Zmc2V0KSkgewogCQkJbGVuZ3RoID0gKHNnX3NbaV0ubGVuZ3RoIC0gc3JjX29mZnNldCk7Ci0jaWZkZWYgREVCVUdfUkFNRElTS19NQ1AKLQkJCXByaW50ayhLRVJOX0lORk8gIlN0ZXAgMSAtIHNnX3NbJWRdOiAlcCBsZW5ndGg6ICVkIgorCisJCQlwcl9kZWJ1ZygiU3RlcCAxIC0gc2dfc1slZF06ICVwIGxlbmd0aDogJWQiCiAJCQkJIiBvZmZzZXQ6ICVkIHNnX2RbJWRdLmxlbmd0aDogJXVcbiIsIGksCiAJCQkJJnNnX3NbaV0sIHNnX3NbaV0ubGVuZ3RoLCBzZ19zW2ldLm9mZnNldCwKIAkJCQlqLCBzZ19kW2pdLmxlbmd0aCk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJTdGVwIDEgLSBsZW5ndGg6ICV1IHNyY19vZmZzZXQ6ICV1IgorCQkJcHJfZGVidWcoIlN0ZXAgMSAtIGxlbmd0aDogJXUgc3JjX29mZnNldDogJXUiCiAJCQkJIiBkc3Rfb2Zmc2V0OiAldVxuIiwgbGVuZ3RoLCBzcmNfb2Zmc2V0LAogCQkJCWRzdF9vZmZzZXQpOwotI2VuZGlmCisKIAkJCWlmIChsZW5ndGggPiByZXEtPnJkX3NpemUpCiAJCQkJbGVuZ3RoID0gcmVxLT5yZF9zaXplOwogCkBAIC01NDcsMTUgKzUyMiwxNSBAQAogCQkJcGFnZV9lbmQgPSAwOwogCQl9IGVsc2UgewogCQkJbGVuZ3RoID0gKHNnX2Rbal0ubGVuZ3RoIC0gZHN0X29mZnNldCk7Ci0jaWZkZWYgREVCVUdfUkFNRElTS19NQ1AKLQkJCXByaW50ayhLRVJOX0lORk8gIlN0ZXAgMiAtIHNnX3NbJWRdOiAlcCBsZW5ndGg6ICVkIgorCisJCQlwcl9kZWJ1ZygiU3RlcCAyIC0gc2dfc1slZF06ICVwIGxlbmd0aDogJWQiCiAJCQkJIiBvZmZzZXQ6ICVkIHNnX2RbJWRdLmxlbmd0aDogJXVcbiIsIGksCiAJCQkJJnNnX3NbaV0sIHNnX3NbaV0ubGVuZ3RoLCBzZ19zW2ldLm9mZnNldCwKIAkJCQlqLCBzZ19kW2pdLmxlbmd0aCk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJTdGVwIDIgLSBsZW5ndGg6ICV1IHNyY19vZmZzZXQ6ICV1IgorCQkJcHJfZGVidWcoIlN0ZXAgMiAtIGxlbmd0aDogJXUgc3JjX29mZnNldDogJXUiCiAJCQkJIiBkc3Rfb2Zmc2V0OiAldVxuIiwgbGVuZ3RoLCBzcmNfb2Zmc2V0LAogCQkJCWRzdF9vZmZzZXQpOwotI2VuZGlmCisKIAkJCWlmIChsZW5ndGggPiByZXEtPnJkX3NpemUpCiAJCQkJbGVuZ3RoID0gcmVxLT5yZF9zaXplOwogCkBAIC01NzksMzIgKzU1NCwyOSBAQAogCiAJCW1lbWNweShkc3QsIHNyYywgbGVuZ3RoKTsKIAotI2lmZGVmIERFQlVHX1JBTURJU0tfTUNQCi0JCXByaW50ayhLRVJOX0lORk8gInBhZ2U6ICV1LCByZW1haW5pbmcgc2l6ZTogJXUsIGxlbmd0aDogJXUsIgorCQlwcl9kZWJ1ZygicGFnZTogJXUsIHJlbWFpbmluZyBzaXplOiAldSwgbGVuZ3RoOiAldSwiCiAJCQkiIGk6ICV1LCBqOiAldVxuIiwgcmVxLT5yZF9wYWdlLAogCQkJKHJlcS0+cmRfc2l6ZSAtIGxlbmd0aCksIGxlbmd0aCwgaSwgaik7Ci0jZW5kaWYKKwogCQlyZXEtPnJkX3NpemUgLT0gbGVuZ3RoOwotCQlpZiAoIShyZXEtPnJkX3NpemUpKQorCQlpZiAoIXJlcS0+cmRfc2l6ZSkKIAkJCXJldHVybiAwOwogCiAJCWlmICghcGFnZV9lbmQpCiAJCQljb250aW51ZTsKIAogCQlpZiAoKytyZXEtPnJkX3BhZ2UgPD0gdGFibGUtPnBhZ2VfZW5kX29mZnNldCkgewotI2lmZGVmIERFQlVHX1JBTURJU0tfTUNQCi0JCQlwcmludGsoS0VSTl9JTkZPICJwYWdlOiAldSBpbiBzYW1lIHBhZ2UgdGFibGVcbiIsCisJCQlwcl9kZWJ1ZygicGFnZTogJXUgaW4gc2FtZSBwYWdlIHRhYmxlXG4iLAogCQkJCXJlcS0+cmRfcGFnZSk7Ci0jZW5kaWYKIAkJCWNvbnRpbnVlOwogCQl9Ci0jaWZkZWYgREVCVUdfUkFNRElTS19NQ1AKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZ2V0dGluZyBuZXcgcGFnZSB0YWJsZSBmb3IgcGFnZTogJXVcbiIsCisKKwkJcHJfZGVidWcoImdldHRpbmcgbmV3IHBhZ2UgdGFibGUgZm9yIHBhZ2U6ICV1XG4iLAogCQkJCXJlcS0+cmRfcGFnZSk7Ci0jZW5kaWYKKwogCQl0YWJsZSA9IHJkX2dldF9zZ190YWJsZShkZXYsIHJlcS0+cmRfcGFnZSk7Ci0JCWlmICghKHRhYmxlKSkKLQkJCXJldHVybiAtMTsKKwkJaWYgKCF0YWJsZSkKKwkJCXJldHVybiAtRUlOVkFMOwogCiAJCXNnX2QgPSAmdGFibGUtPnNnX3RhYmxlW2ogPSAwXTsKIAl9CkBAIC02MjMsMTEgKzU5NSwxMSBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZyBsYmE7CiAJaW50IHJldDsKIAotCXJlcS0+cmRfcGFnZSA9ICh0YXNrLT50YXNrX2xiYSAqIERFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSkgLyBQQUdFX1NJWkU7CisJcmVxLT5yZF9wYWdlID0gKHRhc2stPnRhc2tfbGJhICogZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUpIC8gUEFHRV9TSVpFOwogCWxiYSA9IHRhc2stPnRhc2tfbGJhOwogCXJlcS0+cmRfb2Zmc2V0ID0gKGRvX2RpdihsYmEsCi0JCQkgIChQQUdFX1NJWkUgLyBERVZfQVRUUklCKGRldiktPmJsb2NrX3NpemUpKSkgKgotCQkJICAgREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplOworCQkJICAoUEFHRV9TSVpFIC8gZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUpKSkgKgorCQkJICAgZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemU7CiAJcmVxLT5yZF9zaXplID0gdGFzay0+dGFza19zaXplOwogCiAJaWYgKHRhc2stPnRhc2tfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQpAQCAtNjQ0LDI3NCArNjE2LDYgQEAKIAlyZXR1cm4gUFlYX1RSQU5TUE9SVF9TRU5UX1RPX1RSQU5TUE9SVDsKIH0KIAotLyoJcmRfRElSRUNUX3dpdGhfb2Zmc2V0KCk6Ci0gKgotICoKLSAqLwotc3RhdGljIGludCByZF9ESVJFQ1Rfd2l0aF9vZmZzZXQoCi0Jc3RydWN0IHNlX3Rhc2sgKnRhc2ssCi0Jc3RydWN0IGxpc3RfaGVhZCAqc2VfbWVtX2xpc3QsCi0JdTMyICpzZV9tZW1fY250LAotCXUzMiAqdGFza19vZmZzZXQpCi17Ci0Jc3RydWN0IHJkX3JlcXVlc3QgKnJlcSA9IFJEX1JFUSh0YXNrKTsKLQlzdHJ1Y3QgcmRfZGV2ICpkZXYgPSByZXEtPnJkX2RldjsKLQlzdHJ1Y3QgcmRfZGV2X3NnX3RhYmxlICp0YWJsZTsKLQlzdHJ1Y3Qgc2VfbWVtICpzZV9tZW07Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19zOwotCXUzMiBqID0gMCwgc2V0X29mZnNldCA9IDE7Ci0JdTMyIGdldF9uZXh0X3RhYmxlID0gMCwgb2Zmc2V0X2xlbmd0aCwgdGFibGVfc2dfZW5kOwotCi0JdGFibGUgPSByZF9nZXRfc2dfdGFibGUoZGV2LCByZXEtPnJkX3BhZ2UpOwotCWlmICghKHRhYmxlKSkKLQkJcmV0dXJuIC0xOwotCi0JdGFibGVfc2dfZW5kID0gKHRhYmxlLT5wYWdlX2VuZF9vZmZzZXQgLSByZXEtPnJkX3BhZ2UpOwotCXNnX3MgPSAmdGFibGUtPnNnX3RhYmxlW3JlcS0+cmRfcGFnZSAtIHRhYmxlLT5wYWdlX3N0YXJ0X29mZnNldF07Ci0jaWZkZWYgREVCVUdfUkFNRElTS19EUgotCXByaW50ayhLRVJOX0lORk8gIiVzIERJUkVDVCBMQkE6ICVsbHUsIFNpemU6ICV1IFBhZ2U6ICV1LCBPZmZzZXQ6ICV1XG4iLAotCQkodGFzay0+dGFza19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSA/Ci0JCQkiV3JpdGUiIDogIlJlYWQiLAotCQl0YXNrLT50YXNrX2xiYSwgcmVxLT5yZF9zaXplLCByZXEtPnJkX3BhZ2UsIHJlcS0+cmRfb2Zmc2V0KTsKLSNlbmRpZgotCXdoaWxlIChyZXEtPnJkX3NpemUpIHsKLQkJc2VfbWVtID0ga21lbV9jYWNoZV96YWxsb2Moc2VfbWVtX2NhY2hlLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCEoc2VfbWVtKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHNlX21lbVxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJSU5JVF9MSVNUX0hFQUQoJnNlX21lbS0+c2VfbGlzdCk7Ci0KLQkJaWYgKHNldF9vZmZzZXQpIHsKLQkJCW9mZnNldF9sZW5ndGggPSBzZ19zW2pdLmxlbmd0aCAtIHJlcS0+cmRfb2Zmc2V0OwotCQkJaWYgKG9mZnNldF9sZW5ndGggPiByZXEtPnJkX3NpemUpCi0JCQkJb2Zmc2V0X2xlbmd0aCA9IHJlcS0+cmRfc2l6ZTsKLQotCQkJc2VfbWVtLT5zZV9wYWdlID0gc2dfcGFnZSgmc2dfc1tqKytdKTsKLQkJCXNlX21lbS0+c2Vfb2ZmID0gcmVxLT5yZF9vZmZzZXQ7Ci0JCQlzZV9tZW0tPnNlX2xlbiA9IG9mZnNldF9sZW5ndGg7Ci0KLQkJCXNldF9vZmZzZXQgPSAwOwotCQkJZ2V0X25leHRfdGFibGUgPSAoaiA+IHRhYmxlX3NnX2VuZCk7Ci0JCQlnb3RvIGNoZWNrX2VvdDsKLQkJfQotCi0JCW9mZnNldF9sZW5ndGggPSAocmVxLT5yZF9zaXplIDwgcmVxLT5yZF9vZmZzZXQpID8KLQkJCXJlcS0+cmRfc2l6ZSA6IHJlcS0+cmRfb2Zmc2V0OwotCi0JCXNlX21lbS0+c2VfcGFnZSA9IHNnX3BhZ2UoJnNnX3Nbal0pOwotCQlzZV9tZW0tPnNlX2xlbiA9IG9mZnNldF9sZW5ndGg7Ci0KLQkJc2V0X29mZnNldCA9IDE7Ci0KLWNoZWNrX2VvdDoKLSNpZmRlZiBERUJVR19SQU1ESVNLX0RSCi0JCXByaW50ayhLRVJOX0lORk8gInBhZ2U6ICV1LCBzaXplOiAldSwgb2Zmc2V0X2xlbmd0aDogJXUsIGo6ICV1IgotCQkJIiBzZV9tZW06ICVwLCBzZV9wYWdlOiAlcCBzZV9vZmY6ICV1IHNlX2xlbjogJXVcbiIsCi0JCQlyZXEtPnJkX3BhZ2UsIHJlcS0+cmRfc2l6ZSwgb2Zmc2V0X2xlbmd0aCwgaiwgc2VfbWVtLAotCQkJc2VfbWVtLT5zZV9wYWdlLCBzZV9tZW0tPnNlX29mZiwgc2VfbWVtLT5zZV9sZW4pOwotI2VuZGlmCi0JCWxpc3RfYWRkX3RhaWwoJnNlX21lbS0+c2VfbGlzdCwgc2VfbWVtX2xpc3QpOwotCQkoKnNlX21lbV9jbnQpKys7Ci0KLQkJcmVxLT5yZF9zaXplIC09IG9mZnNldF9sZW5ndGg7Ci0JCWlmICghKHJlcS0+cmRfc2l6ZSkpCi0JCQlnb3RvIG91dDsKLQotCQlpZiAoIXNldF9vZmZzZXQgJiYgIWdldF9uZXh0X3RhYmxlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCsrcmVxLT5yZF9wYWdlIDw9IHRhYmxlLT5wYWdlX2VuZF9vZmZzZXQpIHsKLSNpZmRlZiBERUJVR19SQU1ESVNLX0RSCi0JCQlwcmludGsoS0VSTl9JTkZPICJwYWdlOiAldSBpbiBzYW1lIHBhZ2UgdGFibGVcbiIsCi0JCQkJCXJlcS0+cmRfcGFnZSk7Ci0jZW5kaWYKLQkJCWNvbnRpbnVlOwotCQl9Ci0jaWZkZWYgREVCVUdfUkFNRElTS19EUgotCQlwcmludGsoS0VSTl9JTkZPICJnZXR0aW5nIG5ldyBwYWdlIHRhYmxlIGZvciBwYWdlOiAldVxuIiwKLQkJCQlyZXEtPnJkX3BhZ2UpOwotI2VuZGlmCi0JCXRhYmxlID0gcmRfZ2V0X3NnX3RhYmxlKGRldiwgcmVxLT5yZF9wYWdlKTsKLQkJaWYgKCEodGFibGUpKQotCQkJcmV0dXJuIC0xOwotCi0JCXNnX3MgPSAmdGFibGUtPnNnX3RhYmxlW2ogPSAwXTsKLQl9Ci0KLW91dDoKLQlUX1RBU0sodGFzay0+dGFza19zZV9jbWQpLT50X3Rhc2tzX3NlX251bSArPSAqc2VfbWVtX2NudDsKLSNpZmRlZiBERUJVR19SQU1ESVNLX0RSCi0JcHJpbnRrKEtFUk5fSU5GTyAiUkRfRFIgLSBBbGxvY2F0ZWQgJXUgc3RydWN0IHNlX21lbSBzZWdtZW50cyBmb3IgdGFza1xuIiwKLQkJCSpzZV9tZW1fY250KTsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCi0vKglyZF9ESVJFQ1Rfd2l0aG91dF9vZmZzZXQoKToKLSAqCi0gKgotICovCi1zdGF0aWMgaW50IHJkX0RJUkVDVF93aXRob3V0X29mZnNldCgKLQlzdHJ1Y3Qgc2VfdGFzayAqdGFzaywKLQlzdHJ1Y3QgbGlzdF9oZWFkICpzZV9tZW1fbGlzdCwKLQl1MzIgKnNlX21lbV9jbnQsCi0JdTMyICp0YXNrX29mZnNldCkKLXsKLQlzdHJ1Y3QgcmRfcmVxdWVzdCAqcmVxID0gUkRfUkVRKHRhc2spOwotCXN0cnVjdCByZF9kZXYgKmRldiA9IHJlcS0+cmRfZGV2OwotCXN0cnVjdCByZF9kZXZfc2dfdGFibGUgKnRhYmxlOwotCXN0cnVjdCBzZV9tZW0gKnNlX21lbTsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3M7Ci0JdTMyIGxlbmd0aCwgaiA9IDA7Ci0KLQl0YWJsZSA9IHJkX2dldF9zZ190YWJsZShkZXYsIHJlcS0+cmRfcGFnZSk7Ci0JaWYgKCEodGFibGUpKQotCQlyZXR1cm4gLTE7Ci0KLQlzZ19zID0gJnRhYmxlLT5zZ190YWJsZVtyZXEtPnJkX3BhZ2UgLSB0YWJsZS0+cGFnZV9zdGFydF9vZmZzZXRdOwotI2lmZGVmIERFQlVHX1JBTURJU0tfRFIKLQlwcmludGsoS0VSTl9JTkZPICIlcyBESVJFQ1QgTEJBOiAlbGx1LCBTaXplOiAldSwgUGFnZTogJXVcbiIsCi0JCSh0YXNrLT50YXNrX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpID8KLQkJCSJXcml0ZSIgOiAiUmVhZCIsCi0JCXRhc2stPnRhc2tfbGJhLCByZXEtPnJkX3NpemUsIHJlcS0+cmRfcGFnZSk7Ci0jZW5kaWYKLQl3aGlsZSAocmVxLT5yZF9zaXplKSB7Ci0JCXNlX21lbSA9IGttZW1fY2FjaGVfemFsbG9jKHNlX21lbV9jYWNoZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghKHNlX21lbSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBzZV9tZW1cbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUlOSVRfTElTVF9IRUFEKCZzZV9tZW0tPnNlX2xpc3QpOwotCi0JCWxlbmd0aCA9IChyZXEtPnJkX3NpemUgPCBzZ19zW2pdLmxlbmd0aCkgPwotCQkJcmVxLT5yZF9zaXplIDogc2dfc1tqXS5sZW5ndGg7Ci0KLQkJc2VfbWVtLT5zZV9wYWdlID0gc2dfcGFnZSgmc2dfc1tqKytdKTsKLQkJc2VfbWVtLT5zZV9sZW4gPSBsZW5ndGg7Ci0KLSNpZmRlZiBERUJVR19SQU1ESVNLX0RSCi0JCXByaW50ayhLRVJOX0lORk8gInBhZ2U6ICV1LCBzaXplOiAldSwgajogJXUgc2VfbWVtOiAlcCwiCi0JCQkiIHNlX3BhZ2U6ICVwIHNlX29mZjogJXUgc2VfbGVuOiAldVxuIiwgcmVxLT5yZF9wYWdlLAotCQkJcmVxLT5yZF9zaXplLCBqLCBzZV9tZW0sIHNlX21lbS0+c2VfcGFnZSwKLQkJCXNlX21lbS0+c2Vfb2ZmLCBzZV9tZW0tPnNlX2xlbik7Ci0jZW5kaWYKLQkJbGlzdF9hZGRfdGFpbCgmc2VfbWVtLT5zZV9saXN0LCBzZV9tZW1fbGlzdCk7Ci0JCSgqc2VfbWVtX2NudCkrKzsKLQotCQlyZXEtPnJkX3NpemUgLT0gbGVuZ3RoOwotCQlpZiAoIShyZXEtPnJkX3NpemUpKQotCQkJZ290byBvdXQ7Ci0KLQkJaWYgKCsrcmVxLT5yZF9wYWdlIDw9IHRhYmxlLT5wYWdlX2VuZF9vZmZzZXQpIHsKLSNpZmRlZiBERUJVR19SQU1ESVNLX0RSCi0JCQlwcmludGsoInBhZ2U6ICV1IGluIHNhbWUgcGFnZSB0YWJsZVxuIiwKLQkJCQlyZXEtPnJkX3BhZ2UpOwotI2VuZGlmCi0JCQljb250aW51ZTsKLQkJfQotI2lmZGVmIERFQlVHX1JBTURJU0tfRFIKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZ2V0dGluZyBuZXcgcGFnZSB0YWJsZSBmb3IgcGFnZTogJXVcbiIsCi0JCQkJcmVxLT5yZF9wYWdlKTsKLSNlbmRpZgotCQl0YWJsZSA9IHJkX2dldF9zZ190YWJsZShkZXYsIHJlcS0+cmRfcGFnZSk7Ci0JCWlmICghKHRhYmxlKSkKLQkJCXJldHVybiAtMTsKLQotCQlzZ19zID0gJnRhYmxlLT5zZ190YWJsZVtqID0gMF07Ci0JfQotCi1vdXQ6Ci0JVF9UQVNLKHRhc2stPnRhc2tfc2VfY21kKS0+dF90YXNrc19zZV9udW0gKz0gKnNlX21lbV9jbnQ7Ci0jaWZkZWYgREVCVUdfUkFNRElTS19EUgotCXByaW50ayhLRVJOX0lORk8gIlJEX0RSIC0gQWxsb2NhdGVkICV1IHN0cnVjdCBzZV9tZW0gc2VnbWVudHMgZm9yIHRhc2tcbiIsCi0JCQkqc2VfbWVtX2NudCk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotLyoJcmRfRElSRUNUX2RvX3NlX21lbV9tYXAoKToKLSAqCi0gKgotICovCi1zdGF0aWMgaW50IHJkX0RJUkVDVF9kb19zZV9tZW1fbWFwKAotCXN0cnVjdCBzZV90YXNrICp0YXNrLAotCXN0cnVjdCBsaXN0X2hlYWQgKnNlX21lbV9saXN0LAotCXZvaWQgKmluX21lbSwKLQlzdHJ1Y3Qgc2VfbWVtICppbl9zZV9tZW0sCi0Jc3RydWN0IHNlX21lbSAqKm91dF9zZV9tZW0sCi0JdTMyICpzZV9tZW1fY250LAotCXUzMiAqdGFza19vZmZzZXRfaW4pCi17Ci0Jc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7Ci0Jc3RydWN0IHJkX3JlcXVlc3QgKnJlcSA9IFJEX1JFUSh0YXNrKTsKLQl1MzIgdGFza19vZmZzZXQgPSAqdGFza19vZmZzZXRfaW47Ci0JdW5zaWduZWQgbG9uZyBsb25nIGxiYTsKLQlpbnQgcmV0OwotCi0JcmVxLT5yZF9wYWdlID0gKCh0YXNrLT50YXNrX2xiYSAqIERFVl9BVFRSSUIodGFzay0+c2VfZGV2KS0+YmxvY2tfc2l6ZSkgLwotCQkJUEFHRV9TSVpFKTsKLQlsYmEgPSB0YXNrLT50YXNrX2xiYTsKLQlyZXEtPnJkX29mZnNldCA9IChkb19kaXYobGJhLAotCQkJICAoUEFHRV9TSVpFIC8gREVWX0FUVFJJQih0YXNrLT5zZV9kZXYpLT5ibG9ja19zaXplKSkpICoKLQkJCSAgIERFVl9BVFRSSUIodGFzay0+c2VfZGV2KS0+YmxvY2tfc2l6ZTsKLQlyZXEtPnJkX3NpemUgPSB0YXNrLT50YXNrX3NpemU7Ci0KLQlpZiAocmVxLT5yZF9vZmZzZXQpCi0JCXJldCA9IHJkX0RJUkVDVF93aXRoX29mZnNldCh0YXNrLCBzZV9tZW1fbGlzdCwgc2VfbWVtX2NudCwKLQkJCQl0YXNrX29mZnNldF9pbik7Ci0JZWxzZQotCQlyZXQgPSByZF9ESVJFQ1Rfd2l0aG91dF9vZmZzZXQodGFzaywgc2VfbWVtX2xpc3QsIHNlX21lbV9jbnQsCi0JCQkJdGFza19vZmZzZXRfaW4pOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoQ01EX1RGTyhjbWQpLT50YXNrX3NnX2NoYWluaW5nID09IDApCi0JCXJldHVybiAwOwotCS8qCi0JICogQ3VycmVudGx5IHByZXZlbnQgd3JpdGVycyBmcm9tIG11bHRpcGxlIEhXIGZhYnJpY3MgZG9pbmcKLQkgKiBwY2lfbWFwX3NnKCkgdG8gUkRfRFIncyBpbnRlcm5hbCBzY2F0dGVybGlzdCBtZW1vcnkuCi0JICovCi0JaWYgKGNtZC0+ZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgewotCQlwcmludGsoS0VSTl9FUlIgIkRNQV9UT19ERVZJQ0Ugbm90IHN1cHBvcnRlZCBmb3IiCi0JCQkJIiBSQU1ESVNLX0RSIHdpdGggdGFza19zZ19jaGFpbmluZz0xXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKgotCSAqIFNwZWNpYWwgY2FzZSBmb3IgaWYgdGFza19zZ19jaGFpbmluZyBpcyBlbmFibGVkLCB0aGVuCi0JICogd2Ugc2V0dXAgc3RydWN0IHNlX3Rhc2stPnRhc2tfc2dbXSwgYXMgaXQgd2lsbCBiZSB1c2VkIGJ5Ci0JICogdHJhbnNwb3J0X2RvX3Rhc2tfc2dfY2hhaW4oKSBmb3IgY3JlYXRpbmcgY2hhaW5nZWQgU0dMcwotCSAqIGFjcm9zcyBtdWx0aXBsZSBzdHJ1Y3Qgc2VfdGFzay0+dGFza19zZ1tdLgotCSAqLwotCWlmICghKHRyYW5zcG9ydF9jYWxjX3NnX251bSh0YXNrLAotCQkJbGlzdF9lbnRyeShUX1RBU0soY21kKS0+dF9tZW1fbGlzdC0+bmV4dCwKLQkJCQkgICBzdHJ1Y3Qgc2VfbWVtLCBzZV9saXN0KSwKLQkJCXRhc2tfb2Zmc2V0KSkpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiB0cmFuc3BvcnRfbWFwX21lbV90b19zZyh0YXNrLCBzZV9tZW1fbGlzdCwgdGFzay0+dGFza19zZywKLQkJCWxpc3RfZW50cnkoVF9UQVNLKGNtZCktPnRfbWVtX2xpc3QtPm5leHQsCi0JCQkJICAgc3RydWN0IHNlX21lbSwgc2VfbGlzdCksCi0JCQlvdXRfc2VfbWVtLCBzZV9tZW1fY250LCB0YXNrX29mZnNldF9pbik7Ci19Ci0KLS8qCXJkX0RJUkVDVF9kb190YXNrKCk6IChQYXJ0IG9mIHNlX3N1YnN5c3RlbV9hcGlfdCB0ZW1wbGF0ZSkKLSAqCi0gKgotICovCi1zdGF0aWMgaW50IHJkX0RJUkVDVF9kb190YXNrKHN0cnVjdCBzZV90YXNrICp0YXNrKQotewotCS8qCi0JICogQXQgdGhpcyBwb2ludCB0aGUgbG9jYWxseSBhbGxvY2F0ZWQgUkQgdGFibGVzIGhhdmUgYmVlbiBtYXBwZWQKLQkgKiB0byBzdHJ1Y3Qgc2VfbWVtIGVsZW1lbnRzIGluIHJkX0RJUkVDVF9kb19zZV9tZW1fbWFwKCkuCi0JICovCi0JdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7Ci0JdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7Ci0KLQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9TRU5UX1RPX1RSQU5TUE9SVDsKLX0KLQogLyoJcmRfZnJlZV90YXNrKCk6IChQYXJ0IG9mIHNlX3N1YnN5c3RlbV9hcGlfdCB0ZW1wbGF0ZSkKICAqCiAgKgpAQCAtOTU2LDcgKzY2MCw3IEBACiAJCWNhc2UgT3B0X3JkX3BhZ2VzOgogCQkJbWF0Y2hfaW50KGFyZ3MsICZhcmcpOwogCQkJcmRfZGV2LT5yZF9wYWdlX2NvdW50ID0gYXJnOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUkFNRElTSzogUmVmZXJlbmNpbmcgUGFnZSIKKwkJCXByX2RlYnVnKCJSQU1ESVNLOiBSZWZlcmVuY2luZyBQYWdlIgogCQkJCSIgQ291bnQ6ICV1XG4iLCByZF9kZXYtPnJkX3BhZ2VfY291bnQpOwogCQkJcmRfZGV2LT5yZF9mbGFncyB8PSBSREZfSEFTX1BBR0VfQ09VTlQ7CiAJCQlicmVhazsKQEAgLTk3NCw4ICs2NzgsOCBAQAogCXN0cnVjdCByZF9kZXYgKnJkX2RldiA9IHNlX2Rldi0+c2VfZGV2X3N1X3B0cjsKIAogCWlmICghKHJkX2Rldi0+cmRfZmxhZ3MgJiBSREZfSEFTX1BBR0VfQ09VTlQpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIk1pc3NpbmcgcmRfcGFnZXM9IHBhcmFtZXRlclxuIik7Ci0JCXJldHVybiAtMTsKKwkJcHJfZGVidWcoIk1pc3NpbmcgcmRfcGFnZXM9IHBhcmFtZXRlclxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTAyMSwzMiArNzI1LDExIEBACiB7CiAJc3RydWN0IHJkX2RldiAqcmRfZGV2ID0gZGV2LT5kZXZfcHRyOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja3NfbG9uZyA9ICgocmRfZGV2LT5yZF9wYWdlX2NvdW50ICogUEFHRV9TSVpFKSAvCi0JCQlERVZfQVRUUklCKGRldiktPmJsb2NrX3NpemUpIC0gMTsKKwkJCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5ibG9ja19zaXplKSAtIDE7CiAKIAlyZXR1cm4gYmxvY2tzX2xvbmc7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2FwaSByZF9kcl90ZW1wbGF0ZSA9IHsKLQkubmFtZQkJCT0gInJkX2RyIiwKLQkudHJhbnNwb3J0X3R5cGUJCT0gVFJBTlNQT1JUX1BMVUdJTl9WSEJBX1ZERVYsCi0JLmF0dGFjaF9oYmEJCT0gcmRfYXR0YWNoX2hiYSwKLQkuZGV0YWNoX2hiYQkJPSByZF9kZXRhY2hfaGJhLAotCS5hbGxvY2F0ZV92aXJ0ZGV2aWNlCT0gcmRfRElSRUNUX2FsbG9jYXRlX3ZpcnRkZXZpY2UsCi0JLmNyZWF0ZV92aXJ0ZGV2aWNlCT0gcmRfRElSRUNUX2NyZWF0ZV92aXJ0ZGV2aWNlLAotCS5mcmVlX2RldmljZQkJPSByZF9mcmVlX2RldmljZSwKLQkuYWxsb2NfdGFzawkJPSByZF9hbGxvY190YXNrLAotCS5kb190YXNrCQk9IHJkX0RJUkVDVF9kb190YXNrLAotCS5mcmVlX3Rhc2sJCT0gcmRfZnJlZV90YXNrLAotCS5jaGVja19jb25maWdmc19kZXZfcGFyYW1zID0gcmRfY2hlY2tfY29uZmlnZnNfZGV2X3BhcmFtcywKLQkuc2V0X2NvbmZpZ2ZzX2Rldl9wYXJhbXMgPSByZF9zZXRfY29uZmlnZnNfZGV2X3BhcmFtcywKLQkuc2hvd19jb25maWdmc19kZXZfcGFyYW1zID0gcmRfc2hvd19jb25maWdmc19kZXZfcGFyYW1zLAotCS5nZXRfY2RiCQk9IHJkX2dldF9jZGIsCi0JLmdldF9kZXZpY2VfcmV2CQk9IHJkX2dldF9kZXZpY2VfcmV2LAotCS5nZXRfZGV2aWNlX3R5cGUJPSByZF9nZXRfZGV2aWNlX3R5cGUsCi0JLmdldF9ibG9ja3MJCT0gcmRfZ2V0X2Jsb2NrcywKLQkuZG9fc2VfbWVtX21hcAkJPSByZF9ESVJFQ1RfZG9fc2VfbWVtX21hcCwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2FwaSByZF9tY3BfdGVtcGxhdGUgPSB7CiAJLm5hbWUJCQk9ICJyZF9tY3AiLAogCS50cmFuc3BvcnRfdHlwZQkJPSBUUkFOU1BPUlRfUExVR0lOX1ZIQkFfVkRFViwKQEAgLTEwNzEsMTMgKzc1NCw4IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHRyYW5zcG9ydF9zdWJzeXN0ZW1fcmVnaXN0ZXIoJnJkX2RyX3RlbXBsYXRlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQogCXJldCA9IHRyYW5zcG9ydF9zdWJzeXN0ZW1fcmVnaXN0ZXIoJnJkX21jcF90ZW1wbGF0ZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJdHJhbnNwb3J0X3N1YnN5c3RlbV9yZWxlYXNlKCZyZF9kcl90ZW1wbGF0ZSk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xMDg2LDYgKzc2NCw1IEBACiAKIHZvaWQgcmRfbW9kdWxlX2V4aXQodm9pZCkKIHsKLQl0cmFuc3BvcnRfc3Vic3lzdGVtX3JlbGVhc2UoJnJkX2RyX3RlbXBsYXRlKTsKIAl0cmFuc3BvcnRfc3Vic3lzdGVtX3JlbGVhc2UoJnJkX21jcF90ZW1wbGF0ZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9yZC5oIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcmQuaAppbmRleCAzZWExOWUyLi4wZDAyNzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9yZC5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3JkLmgKQEAgLTcsOCArNyw2IEBACiAKIC8qIExhcmdlc3QgcGllY2Ugb2YgbWVtb3J5IGttYWxsb2MgY2FuIGFsbG9jYXRlICovCiAjZGVmaW5lIFJEX01BWF9BTExPQ0FUSU9OX1NJWkUJNjU1MzYKLS8qIE1heGltdW0gcXVldWVkZXB0aCBmb3IgdGhlIFJhbWRpc2sgSEJBICovCi0jZGVmaW5lIFJEX0hCQV9RVUVVRV9ERVBUSAkyNTYKICNkZWZpbmUgUkRfREVWSUNFX1FVRVVFX0RFUFRICTMyCiAjZGVmaW5lIFJEX01BWF9ERVZJQ0VfUVVFVUVfREVQVEggMTI4CiAjZGVmaW5lIFJEX0JMT0NLU0laRQkJNTEyCkBAIC0zNCw4ICszMiw2IEBACiAJdTMyCQlyZF9wYWdlX2NvdW50OwogCS8qIFNjYXR0ZXJsaXN0IGNvdW50ICovCiAJdTMyCQlyZF9zaXplOwotCS8qIFJhbWRpc2sgZGV2aWNlICovCi0Jc3RydWN0IHJkX2RldgkqcmRfZGV2OwogfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKIHN0cnVjdCByZF9kZXZfc2dfdGFibGUgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc2NkYi5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc2NkYi5jCmluZGV4IGRjNmZlZDAuLjcyODQzNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NjZGIuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9zY2RiLmMKQEAgLTQyLDEzICs0MiwxMyBAQAogICovCiB2b2lkIHNwbGl0X2NkYl9YWF82KAogCXVuc2lnbmVkIGxvbmcgbG9uZyBsYmEsCi0JdTMyICpzZWN0b3JzLAorCXUzMiBzZWN0b3JzLAogCXVuc2lnbmVkIGNoYXIgKmNkYikKIHsKIAljZGJbMV0gPSAobGJhID4+IDE2KSAmIDB4MWY7CiAJY2RiWzJdID0gKGxiYSA+PiA4KSAmIDB4ZmY7CiAJY2RiWzNdID0gbGJhICYgMHhmZjsKLQljZGJbNF0gPSAqc2VjdG9ycyAmIDB4ZmY7CisJY2RiWzRdID0gc2VjdG9ycyAmIDB4ZmY7CiB9CiAKIC8qCXNwbGl0X2NkYl9YWF8xMCgpOgpAQCAtNTcsMTEgKzU3LDExIEBACiAgKi8KIHZvaWQgc3BsaXRfY2RiX1hYXzEwKAogCXVuc2lnbmVkIGxvbmcgbG9uZyBsYmEsCi0JdTMyICpzZWN0b3JzLAorCXUzMiBzZWN0b3JzLAogCXVuc2lnbmVkIGNoYXIgKmNkYikKIHsKIAlwdXRfdW5hbGlnbmVkX2JlMzIobGJhLCAmY2RiWzJdKTsKLQlwdXRfdW5hbGlnbmVkX2JlMTYoKnNlY3RvcnMsICZjZGJbN10pOworCXB1dF91bmFsaWduZWRfYmUxNihzZWN0b3JzLCAmY2RiWzddKTsKIH0KIAogLyoJc3BsaXRfY2RiX1hYXzEyKCk6CkBAIC03MCwxMSArNzAsMTEgQEAKICAqLwogdm9pZCBzcGxpdF9jZGJfWFhfMTIoCiAJdW5zaWduZWQgbG9uZyBsb25nIGxiYSwKLQl1MzIgKnNlY3RvcnMsCisJdTMyIHNlY3RvcnMsCiAJdW5zaWduZWQgY2hhciAqY2RiKQogewogCXB1dF91bmFsaWduZWRfYmUzMihsYmEsICZjZGJbMl0pOwotCXB1dF91bmFsaWduZWRfYmUzMigqc2VjdG9ycywgJmNkYls2XSk7CisJcHV0X3VuYWxpZ25lZF9iZTMyKHNlY3RvcnMsICZjZGJbNl0pOwogfQogCiAvKglzcGxpdF9jZGJfWFhfMTYoKToKQEAgLTgzLDExICs4MywxMSBAQAogICovCiB2b2lkIHNwbGl0X2NkYl9YWF8xNigKIAl1bnNpZ25lZCBsb25nIGxvbmcgbGJhLAotCXUzMiAqc2VjdG9ycywKKwl1MzIgc2VjdG9ycywKIAl1bnNpZ25lZCBjaGFyICpjZGIpCiB7CiAJcHV0X3VuYWxpZ25lZF9iZTY0KGxiYSwgJmNkYlsyXSk7Ci0JcHV0X3VuYWxpZ25lZF9iZTMyKCpzZWN0b3JzLCAmY2RiWzEwXSk7CisJcHV0X3VuYWxpZ25lZF9iZTMyKHNlY3RvcnMsICZjZGJbMTBdKTsKIH0KIAogLyoKQEAgLTk3LDkgKzk3LDkgQEAKICAqLwogdm9pZCBzcGxpdF9jZGJfWFhfMzIoCiAJdW5zaWduZWQgbG9uZyBsb25nIGxiYSwKLQl1MzIgKnNlY3RvcnMsCisJdTMyIHNlY3RvcnMsCiAJdW5zaWduZWQgY2hhciAqY2RiKQogewogCXB1dF91bmFsaWduZWRfYmU2NChsYmEsICZjZGJbMTJdKTsKLQlwdXRfdW5hbGlnbmVkX2JlMzIoKnNlY3RvcnMsICZjZGJbMjhdKTsKKwlwdXRfdW5hbGlnbmVkX2JlMzIoc2VjdG9ycywgJmNkYlsyOF0pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc2NkYi5oIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc2NkYi5oCmluZGV4IDk4Y2QxYzAuLjQ4ZTljY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NjZGIuaAorKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9zY2RiLmgKQEAgLTEsMTAgKzEsMTAgQEAKICNpZm5kZWYgVEFSR0VUX0NPUkVfU0NEQl9ICiAjZGVmaW5lIFRBUkdFVF9DT1JFX1NDREJfSAogCi1leHRlcm4gdm9pZCBzcGxpdF9jZGJfWFhfNih1bnNpZ25lZCBsb25nIGxvbmcsIHUzMiAqLCB1bnNpZ25lZCBjaGFyICopOwotZXh0ZXJuIHZvaWQgc3BsaXRfY2RiX1hYXzEwKHVuc2lnbmVkIGxvbmcgbG9uZywgdTMyICosIHVuc2lnbmVkIGNoYXIgKik7Ci1leHRlcm4gdm9pZCBzcGxpdF9jZGJfWFhfMTIodW5zaWduZWQgbG9uZyBsb25nLCB1MzIgKiwgdW5zaWduZWQgY2hhciAqKTsKLWV4dGVybiB2b2lkIHNwbGl0X2NkYl9YWF8xNih1bnNpZ25lZCBsb25nIGxvbmcsIHUzMiAqLCB1bnNpZ25lZCBjaGFyICopOwotZXh0ZXJuIHZvaWQgc3BsaXRfY2RiX1hYXzMyKHVuc2lnbmVkIGxvbmcgbG9uZywgdTMyICosIHVuc2lnbmVkIGNoYXIgKik7CitleHRlcm4gdm9pZCBzcGxpdF9jZGJfWFhfNih1bnNpZ25lZCBsb25nIGxvbmcsIHUzMiwgdW5zaWduZWQgY2hhciAqKTsKK2V4dGVybiB2b2lkIHNwbGl0X2NkYl9YWF8xMCh1bnNpZ25lZCBsb25nIGxvbmcsIHUzMiwgdW5zaWduZWQgY2hhciAqKTsKK2V4dGVybiB2b2lkIHNwbGl0X2NkYl9YWF8xMih1bnNpZ25lZCBsb25nIGxvbmcsIHUzMiwgdW5zaWduZWQgY2hhciAqKTsKK2V4dGVybiB2b2lkIHNwbGl0X2NkYl9YWF8xNih1bnNpZ25lZCBsb25nIGxvbmcsIHUzMiwgdW5zaWduZWQgY2hhciAqKTsKK2V4dGVybiB2b2lkIHNwbGl0X2NkYl9YWF8zMih1bnNpZ25lZCBsb25nIGxvbmcsIHUzMiwgdW5zaWduZWQgY2hhciAqKTsKIAogI2VuZGlmIC8qIFRBUkdFVF9DT1JFX1NDREJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc3RhdC5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc3RhdC5jCmluZGV4IDVlM2EwNjcuLmE4ZDZlMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3N0YXQuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9zdGF0LmMKQEAgLTQwMiw4ICs0MDIsOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAkvKiBzY3NpTHVXd25OYW1lICovCiAJcmV0dXJuIHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiVzXG4iLAotCQkJKHN0cmxlbihERVZfVDEwX1dXTihkZXYpLT51bml0X3NlcmlhbCkpID8KLQkJCShjaGFyICopJkRFVl9UMTBfV1dOKGRldiktPnVuaXRfc2VyaWFsWzBdIDogIk5vbmUiKTsKKwkJCShzdHJsZW4oZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLnVuaXRfc2VyaWFsKSkgPworCQkJZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLnVuaXRfc2VyaWFsIDogIk5vbmUiKTsKIH0KIERFVl9TVEFUX1NDU0lfTFVfQVRUUl9STyhsdV9uYW1lKTsKIApAQCAtNDEzLDE3ICs0MTMsMTcgQEAKIAlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc2Vfc3ViZGV2ID0gY29udGFpbmVyX29mKHNncnBzLAogCQkJc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYsIGRldl9zdGF0X2dycHMpOwogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IHNlX3N1YmRldi0+c2VfZGV2X3B0cjsKLQlpbnQgajsKLQljaGFyIHN0clsyOF07CisJaW50IGk7CisJY2hhciBzdHJbc2l6ZW9mKGRldi0+c2Vfc3ViX2Rldi0+dDEwX3d3bi52ZW5kb3IpKzFdOwogCiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOworCiAJLyogc2NzaUx1VmVuZG9ySWQgKi8KLQltZW1jcHkoJnN0clswXSwgKHZvaWQgKilERVZfVDEwX1dXTihkZXYpLCAyOCk7Ci0JZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJc3RyW2pdID0gSVNQUklOVChERVZfVDEwX1dXTihkZXYpLT52ZW5kb3Jbal0pID8KLQkJCQlERVZfVDEwX1dXTihkZXYpLT52ZW5kb3Jbal0gOiAweDIwOwotCXN0cls4XSA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihkZXYtPnNlX3N1Yl9kZXYtPnQxMF93d24udmVuZG9yKTsgaSsrKQorCQlzdHJbaV0gPSBJU1BSSU5UKGRldi0+c2Vfc3ViX2Rldi0+dDEwX3d3bi52ZW5kb3JbaV0pID8KKwkJCWRldi0+c2Vfc3ViX2Rldi0+dDEwX3d3bi52ZW5kb3JbaV0gOiAnICc7CisJc3RyW2ldID0gJ1wwJzsKIAlyZXR1cm4gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXNcbiIsIHN0cik7CiB9CiBERVZfU1RBVF9TQ1NJX0xVX0FUVFJfUk8odmVuZCk7CkBAIC00MzQsMTggKzQzNCwxNyBAQAogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzZV9zdWJkZXYgPSBjb250YWluZXJfb2Yoc2dycHMsCiAJCQlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiwgZGV2X3N0YXRfZ3Jwcyk7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gc2Vfc3ViZGV2LT5zZV9kZXZfcHRyOwotCWludCBqOwotCWNoYXIgc3RyWzI4XTsKKwlpbnQgaTsKKwljaGFyIHN0cltzaXplb2YoZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLm1vZGVsKSsxXTsKIAogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIHNjc2lMdVByb2R1Y3RJZCAqLwotCW1lbWNweSgmc3RyWzBdLCAodm9pZCAqKURFVl9UMTBfV1dOKGRldiksIDI4KTsKLQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJc3RyW2pdID0gSVNQUklOVChERVZfVDEwX1dXTihkZXYpLT5tb2RlbFtqXSkgPwotCQkJCURFVl9UMTBfV1dOKGRldiktPm1vZGVsW2pdIDogMHgyMDsKLQlzdHJbMTZdID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRldi0+c2Vfc3ViX2Rldi0+dDEwX3d3bi52ZW5kb3IpOyBpKyspCisJCXN0cltpXSA9IElTUFJJTlQoZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLm1vZGVsW2ldKSA/CisJCQlkZXYtPnNlX3N1Yl9kZXYtPnQxMF93d24ubW9kZWxbaV0gOiAnICc7CisJc3RyW2ldID0gJ1wwJzsKIAlyZXR1cm4gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXNcbiIsIHN0cik7CiB9CiBERVZfU1RBVF9TQ1NJX0xVX0FUVFJfUk8ocHJvZCk7CkBAIC00NTYsMTggKzQ1NSwxNyBAQAogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzZV9zdWJkZXYgPSBjb250YWluZXJfb2Yoc2dycHMsCiAJCQlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiwgZGV2X3N0YXRfZ3Jwcyk7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gc2Vfc3ViZGV2LT5zZV9kZXZfcHRyOwotCWludCBqOwotCWNoYXIgc3RyWzI4XTsKKwlpbnQgaTsKKwljaGFyIHN0cltzaXplb2YoZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLnJldmlzaW9uKSsxXTsKIAogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIHNjc2lMdVJldmlzaW9uSWQgKi8KLQltZW1jcHkoJnN0clswXSwgKHZvaWQgKilERVZfVDEwX1dXTihkZXYpLCAyOCk7Ci0JZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLQkJc3RyW2pdID0gSVNQUklOVChERVZfVDEwX1dXTihkZXYpLT5yZXZpc2lvbltqXSkgPwotCQkJCURFVl9UMTBfV1dOKGRldiktPnJldmlzaW9uW2pdIDogMHgyMDsKLQlzdHJbNF0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLnJldmlzaW9uKTsgaSsrKQorCQlzdHJbaV0gPSBJU1BSSU5UKGRldi0+c2Vfc3ViX2Rldi0+dDEwX3d3bi5yZXZpc2lvbltpXSkgPworCQkJZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLnJldmlzaW9uW2ldIDogJyAnOworCXN0cltpXSA9ICdcMCc7CiAJcmV0dXJuIHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiVzXG4iLCBzdHIpOwogfQogREVWX1NUQVRfU0NTSV9MVV9BVFRSX1JPKHJldik7CkBAIC00ODQsNyArNDgyLDcgQEAKIAogCS8qIHNjc2lMdVBlcmlwaGVyYWxUeXBlICovCiAJcmV0dXJuIHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLAotCQkJVFJBTlNQT1JUKGRldiktPmdldF9kZXZpY2VfdHlwZShkZXYpKTsKKwkJCWRldi0+dHJhbnNwb3J0LT5nZXRfZGV2aWNlX3R5cGUoZGV2KSk7CiB9CiBERVZfU1RBVF9TQ1NJX0xVX0FUVFJfUk8oZGV2X3R5cGUpOwogCkBAIC02NjgsMTggKzY2NiwxOCBAQAogICovCiB2b2lkIHRhcmdldF9zdGF0X3NldHVwX2Rldl9kZWZhdWx0X2dyb3VwcyhzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc2Vfc3ViZGV2KQogewotCXN0cnVjdCBjb25maWdfZ3JvdXAgKmRldl9zdGF0X2dycCA9ICZERVZfU1RBVF9HUlAoc2Vfc3ViZGV2KS0+c3RhdF9ncm91cDsKKwlzdHJ1Y3QgY29uZmlnX2dyb3VwICpkZXZfc3RhdF9ncnAgPSAmc2Vfc3ViZGV2LT5kZXZfc3RhdF9ncnBzLnN0YXRfZ3JvdXA7CiAKLQljb25maWdfZ3JvdXBfaW5pdF90eXBlX25hbWUoJkRFVl9TVEFUX0dSUChzZV9zdWJkZXYpLT5zY3NpX2Rldl9ncm91cCwKKwljb25maWdfZ3JvdXBfaW5pdF90eXBlX25hbWUoJnNlX3N1YmRldi0+ZGV2X3N0YXRfZ3Jwcy5zY3NpX2Rldl9ncm91cCwKIAkJCSJzY3NpX2RldiIsICZ0YXJnZXRfc3RhdF9zY3NpX2Rldl9jaXQpOwotCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmREVWX1NUQVRfR1JQKHNlX3N1YmRldiktPnNjc2lfdGd0X2Rldl9ncm91cCwKKwljb25maWdfZ3JvdXBfaW5pdF90eXBlX25hbWUoJnNlX3N1YmRldi0+ZGV2X3N0YXRfZ3Jwcy5zY3NpX3RndF9kZXZfZ3JvdXAsCiAJCQkic2NzaV90Z3RfZGV2IiwgJnRhcmdldF9zdGF0X3Njc2lfdGd0X2Rldl9jaXQpOwotCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmREVWX1NUQVRfR1JQKHNlX3N1YmRldiktPnNjc2lfbHVfZ3JvdXAsCisJY29uZmlnX2dyb3VwX2luaXRfdHlwZV9uYW1lKCZzZV9zdWJkZXYtPmRldl9zdGF0X2dycHMuc2NzaV9sdV9ncm91cCwKIAkJCSJzY3NpX2x1IiwgJnRhcmdldF9zdGF0X3Njc2lfbHVfY2l0KTsKIAotCWRldl9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHNbMF0gPSAmREVWX1NUQVRfR1JQKHNlX3N1YmRldiktPnNjc2lfZGV2X2dyb3VwOwotCWRldl9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHNbMV0gPSAmREVWX1NUQVRfR1JQKHNlX3N1YmRldiktPnNjc2lfdGd0X2Rldl9ncm91cDsKLQlkZXZfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzWzJdID0gJkRFVl9TVEFUX0dSUChzZV9zdWJkZXYpLT5zY3NpX2x1X2dyb3VwOworCWRldl9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHNbMF0gPSAmc2Vfc3ViZGV2LT5kZXZfc3RhdF9ncnBzLnNjc2lfZGV2X2dyb3VwOworCWRldl9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHNbMV0gPSAmc2Vfc3ViZGV2LT5kZXZfc3RhdF9ncnBzLnNjc2lfdGd0X2Rldl9ncm91cDsKKwlkZXZfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzWzJdID0gJnNlX3N1YmRldi0+ZGV2X3N0YXRfZ3Jwcy5zY3NpX2x1X2dyb3VwOwogCWRldl9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHNbM10gPSBOVUxMOwogfQogCkBAIC05MjIsNyArOTIwLDcgQEAKIAl0cGcgPSBzZXAtPnNlcF90cGc7CiAKIAlyZXQgPSBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIlc1BvcnQjJXVcbiIsCi0JCVRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksIHNlcC0+c2VwX2luZGV4KTsKKwkJdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgc2VwLT5zZXBfaW5kZXgpOwogCXNwaW5fdW5sb2NrKCZsdW4tPmx1bl9zZXBfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTk0NSw4ICs5NDMsOCBAQAogCXRwZyA9IHNlcC0+c2VwX3RwZzsKIAogCXJldCA9IHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiVzJXMlZFxuIiwKLQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3d3bih0cGcpLCAiK3QrIiwKLQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpKTsKKwkJdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3d3bih0cGcpLCAiK3QrIiwKKwkJdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3RhZyh0cGcpKTsKIAlzcGluX3VubG9jaygmbHVuLT5sdW5fc2VwX2xvY2spOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMTI4LDcgKzExMjYsNyBAQAogCXRwZyA9IHNlcC0+c2VwX3RwZzsKIAkvKiBzY3NpVHJhbnNwb3J0VHlwZSAqLwogCXJldCA9IHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgInNjc2lUcmFuc3BvcnQlc1xuIiwKLQkJCVRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCkpOworCQkJdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSk7CiAJc3Bpbl91bmxvY2soJmx1bi0+bHVuX3NlcF9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTE1MCw3ICsxMTQ4LDcgQEAKIAl9CiAJdHBnID0gc2VwLT5zZXBfdHBnOwogCXJldCA9IHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLAotCQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X2luc3RfaW5kZXgodHBnKSk7CisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfaW5zdF9pbmRleCh0cGcpKTsKIAlzcGluX3VubG9jaygmbHVuLT5sdW5fc2VwX2xvY2spOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMTczLDEwICsxMTcxLDEwIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAl0cGcgPSBzZXAtPnNlcF90cGc7Ci0Jd3duID0gREVWX1QxMF9XV04oZGV2KTsKKwl3d24gPSAmZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duOwogCS8qIHNjc2lUcmFuc3BvcnREZXZOYW1lICovCiAJcmV0ID0gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXMrJXNcbiIsCi0JCQlUUEdfVEZPKHRwZyktPnRwZ19nZXRfd3duKHRwZyksCisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfd3duKHRwZyksCiAJCQkoc3RybGVuKHd3bi0+dW5pdF9zZXJpYWwpKSA/IHd3bi0+dW5pdF9zZXJpYWwgOgogCQkJd3duLT52ZW5kb3IpOwogCXNwaW5fdW5sb2NrKCZsdW4tPmx1bl9zZXBfbG9jayk7CkBAIC0xMjEyLDE4ICsxMjEwLDE4IEBACiAgKi8KIHZvaWQgdGFyZ2V0X3N0YXRfc2V0dXBfcG9ydF9kZWZhdWx0X2dyb3VwcyhzdHJ1Y3Qgc2VfbHVuICpsdW4pCiB7Ci0Jc3RydWN0IGNvbmZpZ19ncm91cCAqcG9ydF9zdGF0X2dycCA9ICZQT1JUX1NUQVRfR1JQKGx1biktPnN0YXRfZ3JvdXA7CisJc3RydWN0IGNvbmZpZ19ncm91cCAqcG9ydF9zdGF0X2dycCA9ICZsdW4tPnBvcnRfc3RhdF9ncnBzLnN0YXRfZ3JvdXA7CiAKLQljb25maWdfZ3JvdXBfaW5pdF90eXBlX25hbWUoJlBPUlRfU1RBVF9HUlAobHVuKS0+c2NzaV9wb3J0X2dyb3VwLAorCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmbHVuLT5wb3J0X3N0YXRfZ3Jwcy5zY3NpX3BvcnRfZ3JvdXAsCiAJCQkic2NzaV9wb3J0IiwgJnRhcmdldF9zdGF0X3Njc2lfcG9ydF9jaXQpOwotCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmUE9SVF9TVEFUX0dSUChsdW4pLT5zY3NpX3RndF9wb3J0X2dyb3VwLAorCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmbHVuLT5wb3J0X3N0YXRfZ3Jwcy5zY3NpX3RndF9wb3J0X2dyb3VwLAogCQkJInNjc2lfdGd0X3BvcnQiLCAmdGFyZ2V0X3N0YXRfc2NzaV90Z3RfcG9ydF9jaXQpOwotCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmUE9SVF9TVEFUX0dSUChsdW4pLT5zY3NpX3RyYW5zcG9ydF9ncm91cCwKKwljb25maWdfZ3JvdXBfaW5pdF90eXBlX25hbWUoJmx1bi0+cG9ydF9zdGF0X2dycHMuc2NzaV90cmFuc3BvcnRfZ3JvdXAsCiAJCQkic2NzaV90cmFuc3BvcnQiLCAmdGFyZ2V0X3N0YXRfc2NzaV90cmFuc3BvcnRfY2l0KTsKIAotCXBvcnRfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzWzBdID0gJlBPUlRfU1RBVF9HUlAobHVuKS0+c2NzaV9wb3J0X2dyb3VwOwotCXBvcnRfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzWzFdID0gJlBPUlRfU1RBVF9HUlAobHVuKS0+c2NzaV90Z3RfcG9ydF9ncm91cDsKLQlwb3J0X3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3Vwc1syXSA9ICZQT1JUX1NUQVRfR1JQKGx1biktPnNjc2lfdHJhbnNwb3J0X2dyb3VwOworCXBvcnRfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzWzBdID0gJmx1bi0+cG9ydF9zdGF0X2dycHMuc2NzaV9wb3J0X2dyb3VwOworCXBvcnRfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzWzFdID0gJmx1bi0+cG9ydF9zdGF0X2dycHMuc2NzaV90Z3RfcG9ydF9ncm91cDsKKwlwb3J0X3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3Vwc1syXSA9ICZsdW4tPnBvcnRfc3RhdF9ncnBzLnNjc2lfdHJhbnNwb3J0X2dyb3VwOwogCXBvcnRfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzWzNdID0gTlVMTDsKIH0KIApAQCAtMTI2NCw3ICsxMjYyLDcgQEAKIAl0cGcgPSBuYWNsLT5zZV90cGc7CiAJLyogc2NzaUluc3RJbmRleCAqLwogCXJldCA9IHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLAotCQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X2luc3RfaW5kZXgodHBnKSk7CisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfaW5zdF9pbmRleCh0cGcpKTsKIAlzcGluX3VubG9ja19pcnEoJm5hY2wtPmRldmljZV9saXN0X2xvY2spOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMzE0LDcgKzEzMTIsNyBAQAogCX0KIAl0cGcgPSBuYWNsLT5zZV90cGc7CiAJLyogc2NzaUF1dGhJbnRyVGd0UG9ydEluZGV4ICovCi0JcmV0ID0gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXVcbiIsIFRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSk7CisJcmV0ID0gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXVcbiIsIHRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZuYWNsLT5kZXZpY2VfbGlzdF9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTYzMiw3ICsxNjMwLDcgQEAKIAl0cGcgPSBuYWNsLT5zZV90cGc7CiAJLyogc2NzaUluc3RJbmRleCAqLwogCXJldCA9IHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLAotCQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X2luc3RfaW5kZXgodHBnKSk7CisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfaW5zdF9pbmRleCh0cGcpKTsKIAlzcGluX3VubG9ja19pcnEoJm5hY2wtPmRldmljZV9saXN0X2xvY2spOwogCXJldHVybiByZXQ7CiB9CkBAIC0xNjgyLDcgKzE2ODAsNyBAQAogCX0KIAl0cGcgPSBuYWNsLT5zZV90cGc7CiAJLyogc2NzaVBvcnRJbmRleCAqLwotCXJldCA9IHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLCBUUEdfVEZPKHRwZyktPnRwZ19nZXRfdGFnKHRwZykpOworCXJldCA9IHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLCB0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfdGFnKHRwZykpOwogCXNwaW5fdW5sb2NrX2lycSgmbmFjbC0+ZGV2aWNlX2xpc3RfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE3MDgsNyArMTcwNiw3IEBACiAJdHBnID0gbmFjbC0+c2VfdHBnOwogCS8qIHNjc2lBdHRJbnRyUG9ydEluZGV4ICovCiAJcmV0ID0gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXVcbiIsCi0JCQlUUEdfVEZPKHRwZyktPnNlc3NfZ2V0X2luZGV4KHNlX3Nlc3MpKTsKKwkJCXRwZy0+c2VfdHBnX3Rmby0+c2Vzc19nZXRfaW5kZXgoc2Vfc2VzcykpOwogCXNwaW5fdW5sb2NrX2lycSgmbmFjbC0+bmFjbF9zZXNzX2xvY2spOwogCXJldHVybiByZXQ7CiB9CkBAIC0xNzU3LDggKzE3NTUsOCBAQAogCXRwZyA9IG5hY2wtPnNlX3RwZzsKIAkvKiBzY3NpQXR0SW50clBvcnROYW1lK3Njc2lBdHRJbnRyUG9ydElkZW50aWZpZXIgKi8KIAltZW1zZXQoYnVmLCAwLCA2NCk7Ci0JaWYgKFRQR19URk8odHBnKS0+c2Vzc19nZXRfaW5pdGlhdG9yX3NpZCAhPSBOVUxMKQotCQlUUEdfVEZPKHRwZyktPnNlc3NfZ2V0X2luaXRpYXRvcl9zaWQoc2Vfc2VzcywKKwlpZiAodHBnLT5zZV90cGdfdGZvLT5zZXNzX2dldF9pbml0aWF0b3Jfc2lkICE9IE5VTEwpCisJCXRwZy0+c2VfdHBnX3Rmby0+c2Vzc19nZXRfaW5pdGlhdG9yX3NpZChzZV9zZXNzLAogCQkJCSh1bnNpZ25lZCBjaGFyICopJmJ1ZlswXSwgNjQpOwogCiAJcmV0ID0gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXMraSslc1xuIiwgbmFjbC0+aW5pdGlhdG9ybmFtZSwgYnVmKTsKQEAgLTE3OTcsMTQgKzE3OTUsMTQgQEAKICAqLwogdm9pZCB0YXJnZXRfc3RhdF9zZXR1cF9tYXBwZWRsdW5fZGVmYXVsdF9ncm91cHMoc3RydWN0IHNlX2x1bl9hY2wgKmxhY2wpCiB7Ci0Jc3RydWN0IGNvbmZpZ19ncm91cCAqbWxfc3RhdF9ncnAgPSAmTUxfU1RBVF9HUlBTKGxhY2wpLT5zdGF0X2dyb3VwOworCXN0cnVjdCBjb25maWdfZ3JvdXAgKm1sX3N0YXRfZ3JwID0gJmxhY2wtPm1sX3N0YXRfZ3Jwcy5zdGF0X2dyb3VwOwogCi0JY29uZmlnX2dyb3VwX2luaXRfdHlwZV9uYW1lKCZNTF9TVEFUX0dSUFMobGFjbCktPnNjc2lfYXV0aF9pbnRyX2dyb3VwLAorCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmbGFjbC0+bWxfc3RhdF9ncnBzLnNjc2lfYXV0aF9pbnRyX2dyb3VwLAogCQkJInNjc2lfYXV0aF9pbnRyIiwgJnRhcmdldF9zdGF0X3Njc2lfYXV0aF9pbnRyX2NpdCk7Ci0JY29uZmlnX2dyb3VwX2luaXRfdHlwZV9uYW1lKCZNTF9TVEFUX0dSUFMobGFjbCktPnNjc2lfYXR0X2ludHJfcG9ydF9ncm91cCwKKwljb25maWdfZ3JvdXBfaW5pdF90eXBlX25hbWUoJmxhY2wtPm1sX3N0YXRfZ3Jwcy5zY3NpX2F0dF9pbnRyX3BvcnRfZ3JvdXAsCiAJCQkic2NzaV9hdHRfaW50cl9wb3J0IiwgJnRhcmdldF9zdGF0X3Njc2lfYXR0X2ludHJfcG9ydF9jaXQpOwogCi0JbWxfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzWzBdID0gJk1MX1NUQVRfR1JQUyhsYWNsKS0+c2NzaV9hdXRoX2ludHJfZ3JvdXA7Ci0JbWxfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzWzFdID0gJk1MX1NUQVRfR1JQUyhsYWNsKS0+c2NzaV9hdHRfaW50cl9wb3J0X2dyb3VwOworCW1sX3N0YXRfZ3JwLT5kZWZhdWx0X2dyb3Vwc1swXSA9ICZsYWNsLT5tbF9zdGF0X2dycHMuc2NzaV9hdXRoX2ludHJfZ3JvdXA7CisJbWxfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzWzFdID0gJmxhY2wtPm1sX3N0YXRfZ3Jwcy5zY3NpX2F0dF9pbnRyX3BvcnRfZ3JvdXA7CiAJbWxfc3RhdF9ncnAtPmRlZmF1bHRfZ3JvdXBzWzJdID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3Rtci5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdG1yLmMKaW5kZXggNTliOGI5Yy4uMjdkNDkyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdG1yLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdG1yLmMKQEAgLTQxLDEzICs0MSw2IEBACiAjaW5jbHVkZSAidGFyZ2V0X2NvcmVfYWx1YS5oIgogI2luY2x1ZGUgInRhcmdldF9jb3JlX3ByLmgiCiAKLSNkZWZpbmUgREVCVUdfTFVOX1JFU0VUCi0jaWZkZWYgREVCVUdfTFVOX1JFU0VUCi0jZGVmaW5lIERFQlVHX0xSKHguLi4pIHByaW50ayhLRVJOX0lORk8geCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHX0xSKHguLi4pCi0jZW5kaWYKLQogc3RydWN0IHNlX3Rtcl9yZXEgKmNvcmVfdG1yX2FsbG9jX3JlcSgKIAlzdHJ1Y3Qgc2VfY21kICpzZV9jbWQsCiAJdm9pZCAqZmFicmljX3Rtcl9wdHIsCkBAIC01Nyw4ICs1MCw4IEBACiAKIAl0bXIgPSBrbWVtX2NhY2hlX3phbGxvYyhzZV90bXJfcmVxX2NhY2hlLCAoaW5faW50ZXJydXB0KCkpID8KIAkJCQkJR0ZQX0FUT01JQyA6IEdGUF9LRVJORUwpOwotCWlmICghKHRtcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHNlX3Rtcl9yZXFcbiIpOworCWlmICghdG1yKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBzZV90bXJfcmVxXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCXRtci0+dGFza19jbWQgPSBzZV9jbWQ7CkBAIC03NSwxMCArNjgsMTYgQEAKIHsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSB0bXItPnRtcl9kZXY7CiAKLQlzcGluX2xvY2soJmRldi0+c2VfdG1yX2xvY2spOworCWlmICghZGV2KSB7CisJCWttZW1fY2FjaGVfZnJlZShzZV90bXJfcmVxX2NhY2hlLCB0bXIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycSgmZGV2LT5zZV90bXJfbG9jayk7CiAJbGlzdF9kZWwoJnRtci0+dG1yX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5zZV90bXJfbG9jayk7CisKIAlrbWVtX2NhY2hlX2ZyZWUoc2VfdG1yX3JlcV9jYWNoZSwgdG1yKTsKLQlzcGluX3VubG9jaygmZGV2LT5zZV90bXJfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGNvcmVfdG1yX2hhbmRsZV90YXNfYWJvcnQoCkBAIC04NywxNCArODYsMTQgQEAKIAlpbnQgdGFzLAogCWludCBmZV9jb3VudCkKIHsKLQlpZiAoIShmZV9jb3VudCkpIHsKKwlpZiAoIWZlX2NvdW50KSB7CiAJCXRyYW5zcG9ydF9jbWRfZmluaXNoX2Fib3J0KGNtZCwgMSk7CiAJCXJldHVybjsKIAl9CiAJLyoKIAkgKiBUQVNLIEFCT1JURUQgc3RhdHVzIChUQVMpIGJpdCBzdXBwb3J0CiAJKi8KLQlpZiAoKCh0bXJfbmFjbCAhPSBOVUxMKSAmJgorCWlmICgodG1yX25hY2wgJiYKIAkgICAgICh0bXJfbmFjbCA9PSBjbWQtPnNlX3Nlc3MtPnNlX25vZGVfYWNsKSkgfHwgdGFzKQogCQl0cmFuc3BvcnRfc2VuZF90YXNrX2Fib3J0KGNtZCk7CiAKQEAgLTEwNywxNSArMTA2LDE0IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcHJlZW1wdF9hbmRfYWJvcnRfbGlzdCwKIAlzdHJ1Y3Qgc2VfY21kICpwcm91dF9jbWQpCiB7Ci0Jc3RydWN0IHNlX2NtZCAqY21kOwotCXN0cnVjdCBzZV9xdWV1ZV9yZXEgKnFyLCAqcXJfdG1wOworCXN0cnVjdCBzZV9jbWQgKmNtZCwgKnRjbWQ7CiAJc3RydWN0IHNlX25vZGVfYWNsICp0bXJfbmFjbCA9IE5VTEw7CiAJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqdG1yX3RwZyA9IE5VTEw7Ci0Jc3RydWN0IHNlX3F1ZXVlX29iaiAqcW9iaiA9IGRldi0+ZGV2X3F1ZXVlX29iajsKKwlzdHJ1Y3Qgc2VfcXVldWVfb2JqICpxb2JqID0gJmRldi0+ZGV2X3F1ZXVlX29iajsKIAlzdHJ1Y3Qgc2VfdG1yX3JlcSAqdG1yX3AsICp0bXJfcHA7CiAJc3RydWN0IHNlX3Rhc2sgKnRhc2ssICp0YXNrX3RtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBmZV9jb3VudCwgc3RhdGUsIHRhczsKKwlpbnQgZmVfY291bnQsIHRhczsKIAkvKgogCSAqIFRBU0tfQUJPUlRFRCBzdGF0dXMgYml0LCB0aGlzIGlzIGNvbmZpZ3VyYWJsZSB2aWEgQ29uZmlnRlMKIAkgKiBzdHJ1Y3Qgc2VfZGV2aWNlIGF0dHJpYnV0ZXMuICBzcGM0cjE3IHNlY3Rpb24gNy40LjYgQ29udHJvbCBtb2RlIHBhZ2UKQEAgLTEyNyw3ICsxMjUsNyBAQAogCSAqIHdoaWNoIHRoZSBjb21tYW5kIHdhcyByZWNlaXZlZCBzaGFsbCBiZSBjb21wbGV0ZWQgd2l0aCBUQVNLIEFCT1JURUQKIAkgKiBzdGF0dXMgKHNlZSBTQU0tNCkuCiAJICovCi0JdGFzID0gREVWX0FUVFJJQihkZXYpLT5lbXVsYXRlX3RhczsKKwl0YXMgPSBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV90YXM7CiAJLyoKIAkgKiBEZXRlcm1pbmUgaWYgdGhpcyBzZV90bXIgaXMgY29taW5nIGZyb20gYSAkRkFCUklDX01PRAogCSAqIG9yIHN0cnVjdCBzZV9kZXZpY2UgcGFzc3Rocm91Z2guLgpAQCAtMTM2LDIwICsxMzQsMjAgQEAKIAkJdG1yX25hY2wgPSB0bXItPnRhc2tfY21kLT5zZV9zZXNzLT5zZV9ub2RlX2FjbDsKIAkJdG1yX3RwZyA9IHRtci0+dGFza19jbWQtPnNlX3Nlc3MtPnNlX3RwZzsKIAkJaWYgKHRtcl9uYWNsICYmIHRtcl90cGcpIHsKLQkJCURFQlVHX0xSKCJMVU5fUkVTRVQ6IFRNUiBjYWxsZXIgZmFicmljOiAlcyIKKwkJCXByX2RlYnVnKCJMVU5fUkVTRVQ6IFRNUiBjYWxsZXIgZmFicmljOiAlcyIKIAkJCQkiIGluaXRpYXRvciBwb3J0ICVzXG4iLAotCQkJCVRQR19URk8odG1yX3RwZyktPmdldF9mYWJyaWNfbmFtZSgpLAorCQkJCXRtcl90cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJCXRtcl9uYWNsLT5pbml0aWF0b3JuYW1lKTsKIAkJfQogCX0KLQlERUJVR19MUigiTFVOX1JFU0VUOiAlcyBzdGFydGluZyBmb3IgWyVzXSwgdGFzOiAlZFxuIiwKKwlwcl9kZWJ1ZygiTFVOX1JFU0VUOiAlcyBzdGFydGluZyBmb3IgWyVzXSwgdGFzOiAlZFxuIiwKIAkJKHByZWVtcHRfYW5kX2Fib3J0X2xpc3QpID8gIlByZWVtcHQiIDogIlRNUiIsCi0JCVRSQU5TUE9SVChkZXYpLT5uYW1lLCB0YXMpOworCQlkZXYtPnRyYW5zcG9ydC0+bmFtZSwgdGFzKTsKIAkvKgogCSAqIFJlbGVhc2UgYWxsIHBlbmRpbmcgYW5kIG91dGdvaW5nIFRNUnMgYXNpZGUgZnJvbSB0aGUgcmVjZWl2ZWQKIAkgKiBMVU5fUkVTRVQgdG1yLi4KIAkgKi8KLQlzcGluX2xvY2soJmRldi0+c2VfdG1yX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldi0+c2VfdG1yX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0bXJfcCwgdG1yX3BwLCAmZGV2LT5kZXZfdG1yX2xpc3QsIHRtcl9saXN0KSB7CiAJCS8qCiAJCSAqIEFsbG93IHRoZSByZWNlaXZlZCBUTVIgdG8gcmV0dXJuIHdpdGggRlVOQ1RJT05fQ09NUExFVEUuCkBAIC0xNTgsOCArMTU2LDggQEAKIAkJCWNvbnRpbnVlOwogCiAJCWNtZCA9IHRtcl9wLT50YXNrX2NtZDsKLQkJaWYgKCEoY21kKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCBzZV9jbWQgZm9yIFRNUlxuIik7CisJCWlmICghY21kKSB7CisJCQlwcl9lcnIoIlVuYWJsZSB0byBsb2NhdGUgc3RydWN0IHNlX2NtZCBmb3IgVE1SXG4iKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCS8qCkBAIC0xNjcsMzMgKzE2NSwzMyBAQAogCQkgKiBwYXJhbWV0ZXIgKGVnOiBmb3IgUFJPVVQgUFJFRU1QVF9BTkRfQUJPUlQgc2VydmljZSBhY3Rpb24KIAkJICogc2tpcCBub24gcmVnaXNyYXRpb24ga2V5IG1hdGNoaW5nIFRNUnMuCiAJCSAqLwotCQlpZiAoKHByZWVtcHRfYW5kX2Fib3J0X2xpc3QgIT0gTlVMTCkgJiYKKwkJaWYgKHByZWVtcHRfYW5kX2Fib3J0X2xpc3QgJiYKIAkJICAgIChjb3JlX3Njc2kzX2NoZWNrX2NkYl9hYm9ydF9hbmRfcHJlZW1wdCgKIAkJCQkJcHJlZW1wdF9hbmRfYWJvcnRfbGlzdCwgY21kKSAhPSAwKSkKIAkJCWNvbnRpbnVlOwotCQlzcGluX3VubG9jaygmZGV2LT5zZV90bXJfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5zZV90bXJfbG9jayk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJaWYgKCEoYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF9hY3RpdmUpKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQkJc3Bpbl9sb2NrKCZkZXYtPnNlX3Rtcl9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCWlmICghYXRvbWljX3JlYWQoJmNtZC0+dF90cmFuc3BvcnRfYWN0aXZlKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCXNwaW5fbG9ja19pcnEoJmRldi0+c2VfdG1yX2xvY2spOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKGNtZC0+dF9zdGF0ZSA9PSBUUkFOU1BPUlRfSVNUQVRFX1BST0NFU1NJTkcpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJCXNwaW5fbG9jaygmZGV2LT5zZV90bXJfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCQkJc3Bpbl9sb2NrX2lycSgmZGV2LT5zZV90bXJfbG9jayk7CiAJCQljb250aW51ZTsKIAkJfQotCQlERUJVR19MUigiTFVOX1JFU0VUOiAlcyByZWxlYXNpbmcgVE1SICVwIEZ1bmN0aW9uOiAweCUwMngsIgorCQlwcl9kZWJ1ZygiTFVOX1JFU0VUOiAlcyByZWxlYXNpbmcgVE1SICVwIEZ1bmN0aW9uOiAweCUwMngsIgogCQkJIiBSZXNwb25zZTogMHglMDJ4LCB0X3N0YXRlOiAlZFxuIiwKIAkJCShwcmVlbXB0X2FuZF9hYm9ydF9saXN0KSA/ICJQcmVlbXB0IiA6ICIiLCB0bXJfcCwKIAkJCXRtcl9wLT5mdW5jdGlvbiwgdG1yX3AtPnJlc3BvbnNlLCBjbWQtPnRfc3RhdGUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKIAkJdHJhbnNwb3J0X2NtZF9maW5pc2hfYWJvcnRfdG1yKGNtZCk7Ci0JCXNwaW5fbG9jaygmZGV2LT5zZV90bXJfbG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmRldi0+c2VfdG1yX2xvY2spOwogCX0KLQlzcGluX3VubG9jaygmZGV2LT5zZV90bXJfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnNlX3Rtcl9sb2NrKTsKIAkvKgogCSAqIENvbXBsZXRlIG91dHN0YW5kaW5nIHN0cnVjdCBzZV90YXNrIENEQnMgd2l0aCBUQVNLX0FCT1JURUQgU0FNIHN0YXR1cy4KIAkgKiBUaGlzIGlzIGZvbGxvd2luZyBzYW00cjE3LCBzZWN0aW9uIDUuNiBBYm9ydGluZyBjb21tYW5kcywgVGFibGUgMzgKQEAgLTIxOCwyMyArMjE2LDE3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXhlY3V0ZV90YXNrX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGFzaywgdGFza190bXAsICZkZXYtPnN0YXRlX3Rhc2tfbGlzdCwKIAkJCQl0X3N0YXRlX2xpc3QpIHsKLQkJaWYgKCEoVEFTS19DTUQodGFzaykpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlRBU0tfQ01EKHRhc2spIGlzIE5VTEwhXG4iKTsKKwkJaWYgKCF0YXNrLT50YXNrX3NlX2NtZCkgeworCQkJcHJfZXJyKCJ0YXNrLT50YXNrX3NlX2NtZCBpcyBOVUxMIVxuIik7CiAJCQljb250aW51ZTsKIAkJfQotCQljbWQgPSBUQVNLX0NNRCh0YXNrKTsKKwkJY21kID0gdGFzay0+dGFza19zZV9jbWQ7CiAKLQkJaWYgKCFUX1RBU0soY21kKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJUX1RBU0soY21kKSBpcyBOVUxMIGZvciB0YXNrOiAlcCBjbWQ6IgotCQkJCSIgJXAgSVRUOiAweCUwOHhcbiIsIHRhc2ssIGNtZCwKLQkJCQlDTURfVEZPKGNtZCktPmdldF90YXNrX3RhZyhjbWQpKTsKLQkJCWNvbnRpbnVlOwotCQl9CiAJCS8qCiAJCSAqIEZvciBQUkVFTVBUX0FORF9BQk9SVCB1c2FnZSwgb25seSBwcm9jZXNzIGNvbW1hbmRzCiAJCSAqIHdpdGggYSBtYXRjaGluZyByZXNlcnZhdGlvbiBrZXkuCiAJCSAqLwotCQlpZiAoKHByZWVtcHRfYW5kX2Fib3J0X2xpc3QgIT0gTlVMTCkgJiYKKwkJaWYgKHByZWVtcHRfYW5kX2Fib3J0X2xpc3QgJiYKIAkJICAgIChjb3JlX3Njc2kzX2NoZWNrX2NkYl9hYm9ydF9hbmRfcHJlZW1wdCgKIAkJCQkJcHJlZW1wdF9hbmRfYWJvcnRfbGlzdCwgY21kKSAhPSAwKSkKIAkJCWNvbnRpbnVlOwpAQCAtMjQ4LDM4ICsyNDAsMzggQEAKIAkJYXRvbWljX3NldCgmdGFzay0+dGFza19zdGF0ZV9hY3RpdmUsIDApOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrLCBmbGFncyk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJREVCVUdfTFIoIkxVTl9SRVNFVDogJXMgY21kOiAlcCB0YXNrOiAlcCIKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXByX2RlYnVnKCJMVU5fUkVTRVQ6ICVzIGNtZDogJXAgdGFzazogJXAiCiAJCQkiIElUVC9DbWRTTjogMHglMDh4LzB4JTA4eCwgaV9zdGF0ZTogJWQsIHRfc3RhdGUvIgogCQkJImRlZl90X3N0YXRlOiAlZC8lZCBjZGI6IDB4JTAyeFxuIiwKIAkJCShwcmVlbXB0X2FuZF9hYm9ydF9saXN0KSA/ICJQcmVlbXB0IiA6ICIiLCBjbWQsIHRhc2ssCi0JCQlDTURfVEZPKGNtZCktPmdldF90YXNrX3RhZyhjbWQpLCAwLAotCQkJQ01EX1RGTyhjbWQpLT5nZXRfY21kX3N0YXRlKGNtZCksIGNtZC0+dF9zdGF0ZSwKLQkJCWNtZC0+ZGVmZXJyZWRfdF9zdGF0ZSwgVF9UQVNLKGNtZCktPnRfdGFza19jZGJbMF0pOwotCQlERUJVR19MUigiTFVOX1JFU0VUOiBJVFRbMHglMDh4XSAtIHByX3Jlc19rZXk6IDB4JTAxNkx4IgorCQkJY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpLCAwLAorCQkJY21kLT5zZV90Zm8tPmdldF9jbWRfc3RhdGUoY21kKSwgY21kLT50X3N0YXRlLAorCQkJY21kLT5kZWZlcnJlZF90X3N0YXRlLCBjbWQtPnRfdGFza19jZGJbMF0pOworCQlwcl9kZWJ1ZygiTFVOX1JFU0VUOiBJVFRbMHglMDh4XSAtIHByX3Jlc19rZXk6IDB4JTAxNkx4IgogCQkJIiB0X3Rhc2tfY2RiczogJWQgdF90YXNrX2NkYnNfbGVmdDogJWQiCiAJCQkiIHRfdGFza19jZGJzX3NlbnQ6ICVkIC0tIHRfdHJhbnNwb3J0X2FjdGl2ZTogJWQiCiAJCQkiIHRfdHJhbnNwb3J0X3N0b3A6ICVkIHRfdHJhbnNwb3J0X3NlbnQ6ICVkXG4iLAotCQkJQ01EX1RGTyhjbWQpLT5nZXRfdGFza190YWcoY21kKSwgY21kLT5wcl9yZXNfa2V5LAotCQkJVF9UQVNLKGNtZCktPnRfdGFza19jZGJzLAotCQkJYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19sZWZ0KSwKLQkJCWF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90YXNrX2NkYnNfc2VudCksCi0JCQlhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X2FjdGl2ZSksCi0JCQlhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X3N0b3ApLAotCQkJYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF9zZW50KSk7CisJCQljbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCksIGNtZC0+cHJfcmVzX2tleSwKKwkJCWNtZC0+dF90YXNrX2xpc3RfbnVtLAorCQkJYXRvbWljX3JlYWQoJmNtZC0+dF90YXNrX2NkYnNfbGVmdCksCisJCQlhdG9taWNfcmVhZCgmY21kLT50X3Rhc2tfY2Ric19zZW50KSwKKwkJCWF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X2FjdGl2ZSksCisJCQlhdG9taWNfcmVhZCgmY21kLT50X3RyYW5zcG9ydF9zdG9wKSwKKwkJCWF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X3NlbnQpKTsKIAogCQlpZiAoYXRvbWljX3JlYWQoJnRhc2stPnRhc2tfYWN0aXZlKSkgewogCQkJYXRvbWljX3NldCgmdGFzay0+dGFza19zdG9wLCAxKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkJJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCQkmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAotCQkJREVCVUdfTFIoIkxVTl9SRVNFVDogV2FpdGluZyBmb3IgdGFzazogJXAgdG8gc2h1dGRvd24iCisJCQlwcl9kZWJ1ZygiTFVOX1JFU0VUOiBXYWl0aW5nIGZvciB0YXNrOiAlcCB0byBzaHV0ZG93biIKIAkJCQkiIGZvciBkZXY6ICVwXG4iLCB0YXNrLCBkZXYpOwogCQkJd2FpdF9mb3JfY29tcGxldGlvbigmdGFzay0+dGFza19zdG9wX2NvbXApOwotCQkJREVCVUdfTFIoIkxVTl9SRVNFVCBDb21wbGV0ZWQgdGFzazogJXAgc2h1dGRvd24gZm9yIgorCQkJcHJfZGVidWcoIkxVTl9SRVNFVCBDb21wbGV0ZWQgdGFzazogJXAgc2h1dGRvd24gZm9yIgogCQkJCSIgZGV2OiAlcFxuIiwgdGFzaywgZGV2KTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCQlhdG9taWNfZGVjKCZUX1RBU0soY21kKS0+dF90YXNrX2NkYnNfbGVmdCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCWF0b21pY19kZWMoJmNtZC0+dF90YXNrX2NkYnNfbGVmdCk7CiAKIAkJCWF0b21pY19zZXQoJnRhc2stPnRhc2tfYWN0aXZlLCAwKTsKIAkJCWF0b21pY19zZXQoJnRhc2stPnRhc2tfc3RvcCwgMCk7CkBAIC0yODksMzQgKzI4MSwzNCBAQAogCQl9CiAJCV9fdHJhbnNwb3J0X3N0b3BfdGFza190aW1lcih0YXNrLCAmZmxhZ3MpOwogCi0JCWlmICghKGF0b21pY19kZWNfYW5kX3Rlc3QoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19leF9sZWZ0KSkpIHsKKwkJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjbWQtPnRfdGFza19jZGJzX2V4X2xlZnQpKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQkJREVCVUdfTFIoIkxVTl9SRVNFVDogU2tpcHBpbmcgdGFzazogJXAsIGRldjogJXAgZm9yIgorCQkJCQkmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCXByX2RlYnVnKCJMVU5fUkVTRVQ6IFNraXBwaW5nIHRhc2s6ICVwLCBkZXY6ICVwIGZvciIKIAkJCQkiIHRfdGFza19jZGJzX2V4X2xlZnQ6ICVkXG4iLCB0YXNrLCBkZXYsCi0JCQkJYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19leF9sZWZ0KSk7CisJCQkJYXRvbWljX3JlYWQoJmNtZC0+dF90YXNrX2NkYnNfZXhfbGVmdCkpOwogCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5leGVjdXRlX3Rhc2tfbG9jaywgZmxhZ3MpOwogCQkJY29udGludWU7CiAJCX0KLQkJZmVfY291bnQgPSBhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfZmVfY291bnQpOworCQlmZV9jb3VudCA9IGF0b21pY19yZWFkKCZjbWQtPnRfZmVfY291bnQpOwogCi0JCWlmIChhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X2FjdGl2ZSkpIHsKLQkJCURFQlVHX0xSKCJMVU5fUkVTRVQ6IGdvdCB0X3RyYW5zcG9ydF9hY3RpdmUgPSAxIGZvciIKKwkJaWYgKGF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X2FjdGl2ZSkpIHsKKwkJCXByX2RlYnVnKCJMVU5fUkVTRVQ6IGdvdCB0X3RyYW5zcG9ydF9hY3RpdmUgPSAxIGZvciIKIAkJCQkiIHRhc2s6ICVwLCB0X2ZlX2NvdW50OiAlZCBkZXY6ICVwXG4iLCB0YXNrLAogCQkJCWZlX2NvdW50LCBkZXYpOwotCQkJYXRvbWljX3NldCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X2Fib3J0ZWQsIDEpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywKKwkJCWF0b21pY19zZXQoJmNtZC0+dF90cmFuc3BvcnRfYWJvcnRlZCwgMSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywKIAkJCQkJCWZsYWdzKTsKIAkJCWNvcmVfdG1yX2hhbmRsZV90YXNfYWJvcnQodG1yX25hY2wsIGNtZCwgdGFzLCBmZV9jb3VudCk7CiAKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrLCBmbGFncyk7CiAJCQljb250aW51ZTsKIAkJfQotCQlERUJVR19MUigiTFVOX1JFU0VUOiBHb3QgdF90cmFuc3BvcnRfYWN0aXZlID0gMCBmb3IgdGFzazogJXAsIgorCQlwcl9kZWJ1ZygiTFVOX1JFU0VUOiBHb3QgdF90cmFuc3BvcnRfYWN0aXZlID0gMCBmb3IgdGFzazogJXAsIgogCQkJIiB0X2ZlX2NvdW50OiAlZCBkZXY6ICVwXG4iLCB0YXNrLCBmZV9jb3VudCwgZGV2KTsKLQkJYXRvbWljX3NldCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X2Fib3J0ZWQsIDEpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCWF0b21pY19zZXQoJmNtZC0+dF90cmFuc3BvcnRfYWJvcnRlZCwgMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJCWNvcmVfdG1yX2hhbmRsZV90YXNfYWJvcnQodG1yX25hY2wsIGNtZCwgdGFzLCBmZV9jb3VudCk7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXhlY3V0ZV90YXNrX2xvY2ssIGZsYWdzKTsKQEAgLTMzMSwyNSArMzIzLDEyIEBACiAJICogcmVmZXJlbmNlLCBvdGhlcndpc2UgdGhlIHN0cnVjdCBzZV9jbWQgaXMgcmVsZWFzZWQuCiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnFvYmotPmNtZF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHFyLCBxcl90bXAsICZxb2JqLT5xb2JqX2xpc3QsIHFyX2xpc3QpIHsKLQkJY21kID0gKHN0cnVjdCBzZV9jbWQgKilxci0+Y21kOwotCQlpZiAoIShjbWQpKSB7Ci0JCQkvKgotCQkJICogU2tpcCB0aGVzZSBmb3Igbm9uIFBSRUVNUFRfQU5EX0FCT1JUIHVzYWdlLi4KLQkJCSAqLwotCQkJaWYgKHByZWVtcHRfYW5kX2Fib3J0X2xpc3QgIT0gTlVMTCkKLQkJCQljb250aW51ZTsKLQotCQkJYXRvbWljX2RlYygmcW9iai0+cXVldWVfY250KTsKLQkJCWxpc3RfZGVsKCZxci0+cXJfbGlzdCk7Ci0JCQlrZnJlZShxcik7Ci0JCQljb250aW51ZTsKLQkJfQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWQsIHRjbWQsICZxb2JqLT5xb2JqX2xpc3QsIHNlX3F1ZXVlX25vZGUpIHsKIAkJLyoKIAkJICogRm9yIFBSRUVNUFRfQU5EX0FCT1JUIHVzYWdlLCBvbmx5IHByb2Nlc3MgY29tbWFuZHMKIAkJICogd2l0aCBhIG1hdGNoaW5nIHJlc2VydmF0aW9uIGtleS4KIAkJICovCi0JCWlmICgocHJlZW1wdF9hbmRfYWJvcnRfbGlzdCAhPSBOVUxMKSAmJgorCQlpZiAocHJlZW1wdF9hbmRfYWJvcnRfbGlzdCAmJgogCQkgICAgKGNvcmVfc2NzaTNfY2hlY2tfY2RiX2Fib3J0X2FuZF9wcmVlbXB0KAogCQkJCQlwcmVlbXB0X2FuZF9hYm9ydF9saXN0LCBjbWQpICE9IDApKQogCQkJY29udGludWU7CkBAIC0zNTksMzAgKzMzOCwyMiBAQAogCQlpZiAocHJvdXRfY21kID09IGNtZCkKIAkJCWNvbnRpbnVlOwogCi0JCWF0b21pY19kZWMoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF9xdWV1ZV9hY3RpdmUpOworCQlhdG9taWNfZGVjKCZjbWQtPnRfdHJhbnNwb3J0X3F1ZXVlX2FjdGl2ZSk7CiAJCWF0b21pY19kZWMoJnFvYmotPnF1ZXVlX2NudCk7Ci0JCWxpc3RfZGVsKCZxci0+cXJfbGlzdCk7CisJCWxpc3RfZGVsKCZjbWQtPnNlX3F1ZXVlX25vZGUpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxb2JqLT5jbWRfcXVldWVfbG9jaywgZmxhZ3MpOwogCi0JCXN0YXRlID0gcXItPnN0YXRlOwotCQlrZnJlZShxcik7Ci0KLQkJREVCVUdfTFIoIkxVTl9SRVNFVDogJXMgZnJvbSBEZXZpY2UgUXVldWU6IGNtZDogJXAgdF9zdGF0ZToiCisJCXByX2RlYnVnKCJMVU5fUkVTRVQ6ICVzIGZyb20gRGV2aWNlIFF1ZXVlOiBjbWQ6ICVwIHRfc3RhdGU6IgogCQkJIiAlZCB0X2ZlX2NvdW50OiAlZFxuIiwgKHByZWVtcHRfYW5kX2Fib3J0X2xpc3QpID8KLQkJCSJQcmVlbXB0IiA6ICIiLCBjbWQsIHN0YXRlLAotCQkJYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X2ZlX2NvdW50KSk7CisJCQkiUHJlZW1wdCIgOiAiIiwgY21kLCBjbWQtPnRfc3RhdGUsCisJCQlhdG9taWNfcmVhZCgmY21kLT50X2ZlX2NvdW50KSk7CiAJCS8qCiAJCSAqIFNpZ25hbCB0aGF0IHRoZSBjb21tYW5kIGhhcyBmYWlsZWQgdmlhIGNtZC0+c2VfY21kX2ZsYWdzLAotCQkgKiBhbmQgY2FsbCBURk8tPm5ld19jbWRfZmFpbHVyZSgpIHRvIHdha2V1cCBhbnkgZmFicmljCi0JCSAqIGRlcGVuZGVudCBjb2RlIHVzZWQgdG8gd2FpdCBmb3IgdW5zb2xpY2l0ZWQgZGF0YSBvdXQKLQkJICogYWxsb2NhdGlvbiB0byBjb21wbGV0ZS4gIFRoZSBmYWJyaWMgbW9kdWxlIGlzIGV4cGVjdGVkCi0JCSAqIHRvIGR1bXAgYW55IHJlbWFpbmluZyB1bnNvbGljaXRlZCBkYXRhIG91dCBmb3IgdGhlIGFib3J0ZWQKLQkJICogY29tbWFuZCBhdCB0aGlzIHBvaW50LgogCQkgKi8KIAkJdHJhbnNwb3J0X25ld19jbWRfZmFpbHVyZShjbWQpOwogCiAJCWNvcmVfdG1yX2hhbmRsZV90YXNfYWJvcnQodG1yX25hY2wsIGNtZCwgdGFzLAotCQkJCWF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF9mZV9jb3VudCkpOworCQkJCWF0b21pY19yZWFkKCZjbWQtPnRfZmVfY291bnQpKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnFvYmotPmNtZF9xdWV1ZV9sb2NrLCBmbGFncyk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFvYmotPmNtZF9xdWV1ZV9sb2NrLCBmbGFncyk7CkBAIC0zOTAsMjEgKzM2MSwyMSBAQAogCSAqIENsZWFyIGFueSBsZWdhY3kgU1BDLTIgcmVzZXJ2YXRpb24gd2hlbiBjYWxsZWQgZHVyaW5nCiAJICogTE9HSUNBTCBVTklUIFJFU0VUCiAJICovCi0JaWYgKCEocHJlZW1wdF9hbmRfYWJvcnRfbGlzdCkgJiYKKwlpZiAoIXByZWVtcHRfYW5kX2Fib3J0X2xpc3QgJiYKIAkgICAgIChkZXYtPmRldl9mbGFncyAmIERGX1NQQzJfUkVTRVJWQVRJT05TKSkgewogCQlzcGluX2xvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCQlkZXYtPmRldl9yZXNlcnZlZF9ub2RlX2FjbCA9IE5VTEw7CiAJCWRldi0+ZGV2X2ZsYWdzICY9IH5ERl9TUEMyX1JFU0VSVkFUSU9OUzsKIAkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwotCQlwcmludGsoS0VSTl9JTkZPICJMVU5fUkVTRVQ6IFNDU0ktMiBSZWxlYXNlZCByZXNlcnZhdGlvblxuIik7CisJCXByX2RlYnVnKCJMVU5fUkVTRVQ6IFNDU0ktMiBSZWxlYXNlZCByZXNlcnZhdGlvblxuIik7CiAJfQogCiAJc3Bpbl9sb2NrX2lycSgmZGV2LT5zdGF0c19sb2NrKTsKIAlkZXYtPm51bV9yZXNldHMrKzsKIAlzcGluX3VubG9ja19pcnEoJmRldi0+c3RhdHNfbG9jayk7CiAKLQlERUJVR19MUigiTFVOX1JFU0VUOiAlcyBmb3IgWyVzXSBDb21wbGV0ZVxuIiwKKwlwcl9kZWJ1ZygiTFVOX1JFU0VUOiAlcyBmb3IgWyVzXSBDb21wbGV0ZVxuIiwKIAkJCShwcmVlbXB0X2FuZF9hYm9ydF9saXN0KSA/ICJQcmVlbXB0IiA6ICJUTVIiLAotCQkJVFJBTlNQT1JUKGRldiktPm5hbWUpOworCQkJZGV2LT50cmFuc3BvcnQtPm5hbWUpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHBnLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cGcuYwppbmRleCA1ZWM3NDVmLi40ZjFiYTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cGcuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cGcuYwpAQCAtNDQsNiArNDQsMTIgQEAKICNpbmNsdWRlIDx0YXJnZXQvdGFyZ2V0X2NvcmVfZmFicmljX29wcy5oPgogCiAjaW5jbHVkZSAidGFyZ2V0X2NvcmVfaGJhLmgiCisjaW5jbHVkZSAidGFyZ2V0X2NvcmVfc3RhdC5oIgorCitleHRlcm4gc3RydWN0IHNlX2RldmljZSAqZ19sdW4wX2RldjsKKworc3RhdGljIERFRklORV9TUElOTE9DSyh0cGdfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKHRwZ19saXN0KTsKIAogLyoJY29yZV9jbGVhcl9pbml0aWF0b3Jfbm9kZV9mcm9tX3RwZygpOgogICoKQEAgLTY2LDkgKzcyLDkgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmICghZGV2ZS0+c2VfbHVuKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzIGRldmljZSBlbnRyaWVzIGRldmljZSBwb2ludGVyIGlzIgorCQkJcHJfZXJyKCIlcyBkZXZpY2UgZW50cmllcyBkZXZpY2UgcG9pbnRlciBpcyIKIAkJCQkiIE5VTEwsIGJ1dCBJbml0aWF0b3IgaGFzIGFjY2Vzcy5cbiIsCi0JCQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSk7CisJCQkJdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC04MCwxNCArODYsMTMgQEAKIAkJc3Bpbl9sb2NrKCZsdW4tPmx1bl9hY2xfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhY2wsIGFjbF90bXAsCiAJCQkJCSZsdW4tPmx1bl9hY2xfbGlzdCwgbGFjbF9saXN0KSB7Ci0JCQlpZiAoIShzdHJjbXAoYWNsLT5pbml0aWF0b3JuYW1lLAotCQkJCQluYWNsLT5pbml0aWF0b3JuYW1lKSkgJiYKLQkJCSAgICAgKGFjbC0+bWFwcGVkX2x1biA9PSBkZXZlLT5tYXBwZWRfbHVuKSkKKwkJCWlmICghc3RyY21wKGFjbC0+aW5pdGlhdG9ybmFtZSwgbmFjbC0+aW5pdGlhdG9ybmFtZSkgJiYKKwkJCSAgICAoYWNsLT5tYXBwZWRfbHVuID09IGRldmUtPm1hcHBlZF9sdW4pKQogCQkJCWJyZWFrOwogCQl9CiAKIAkJaWYgKCFhY2wpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvY2F0ZSBzdHJ1Y3Qgc2VfbHVuX2FjbCBmb3IgJXMsIgorCQkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCBzZV9sdW5fYWNsIGZvciAlcywiCiAJCQkJIiBtYXBwZWRfbHVuOiAldVxuIiwgbmFjbC0+aW5pdGlhdG9ybmFtZSwKIAkJCQlkZXZlLT5tYXBwZWRfbHVuKTsKIAkJCXNwaW5fdW5sb2NrKCZsdW4tPmx1bl9hY2xfbG9jayk7CkBAIC0xMTUsNyArMTIwLDcgQEAKIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKmFjbDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYWNsLCAmdHBnLT5hY2xfbm9kZV9saXN0LCBhY2xfbGlzdCkgewotCQlpZiAoIShzdHJjbXAoYWNsLT5pbml0aWF0b3JuYW1lLCBpbml0aWF0b3JuYW1lKSkpCisJCWlmICghc3RyY21wKGFjbC0+aW5pdGlhdG9ybmFtZSwgaW5pdGlhdG9ybmFtZSkpCiAJCQlyZXR1cm4gYWNsOwogCX0KIApAQCAtMTM0LDggKzEzOSw4IEBACiAKIAlzcGluX2xvY2tfYmgoJnRwZy0+YWNsX25vZGVfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShhY2wsICZ0cGctPmFjbF9ub2RlX2xpc3QsIGFjbF9saXN0KSB7Ci0JCWlmICghKHN0cmNtcChhY2wtPmluaXRpYXRvcm5hbWUsIGluaXRpYXRvcm5hbWUpKSAmJgotCQkgICAoIShhY2wtPmR5bmFtaWNfbm9kZV9hY2wpKSkgeworCQlpZiAoIXN0cmNtcChhY2wtPmluaXRpYXRvcm5hbWUsIGluaXRpYXRvcm5hbWUpICYmCisJCSAgICAhYWNsLT5keW5hbWljX25vZGVfYWNsKSB7CiAJCQlzcGluX3VubG9ja19iaCgmdHBnLT5hY2xfbm9kZV9sb2NrKTsKIAkJCXJldHVybiBhY2w7CiAJCX0KQEAgLTE3MSw3ICsxNzYsNyBAQAogCQkgKiBCeSBkZWZhdWx0IGluIExJTy1UYXJnZXQgJEZBQlJJQ19NT0QsCiAJCSAqIGRlbW9fbW9kZV93cml0ZV9wcm90ZWN0IGlzIE9OLCBvciBSRUFEX09OTFk7CiAJCSAqLwotCQlpZiAoIShUUEdfVEZPKHRwZyktPnRwZ19jaGVja19kZW1vX21vZGVfd3JpdGVfcHJvdGVjdCh0cGcpKSkgeworCQlpZiAoIXRwZy0+c2VfdHBnX3Rmby0+dHBnX2NoZWNrX2RlbW9fbW9kZV93cml0ZV9wcm90ZWN0KHRwZykpIHsKIAkJCWlmIChkZXYtPmRldl9mbGFncyAmIERGX1JFQURfT05MWSkKIAkJCQlsdW5fYWNjZXNzID0gVFJBTlNQT1JUX0xVTkZMQUdTX1JFQURfT05MWTsKIAkJCWVsc2UKQEAgLTE4MSwxNiArMTg2LDE2IEBACiAJCQkgKiBBbGxvdyBvbmx5IG9wdGljYWwgZHJpdmVzIHRvIGlzc3VlIFIvVyBpbiBkZWZhdWx0IFJPCiAJCQkgKiBkZW1vIG1vZGUuCiAJCQkgKi8KLQkJCWlmIChUUkFOU1BPUlQoZGV2KS0+Z2V0X2RldmljZV90eXBlKGRldikgPT0gVFlQRV9ESVNLKQorCQkJaWYgKGRldi0+dHJhbnNwb3J0LT5nZXRfZGV2aWNlX3R5cGUoZGV2KSA9PSBUWVBFX0RJU0spCiAJCQkJbHVuX2FjY2VzcyA9IFRSQU5TUE9SVF9MVU5GTEFHU19SRUFEX09OTFk7CiAJCQllbHNlCiAJCQkJbHVuX2FjY2VzcyA9IFRSQU5TUE9SVF9MVU5GTEFHU19SRUFEX1dSSVRFOwogCQl9CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVEFSR0VUX0NPUkVbJXNdLT5UUEdbJXVdX0xVTlsldV0gLSBBZGRpbmcgJXMiCisJCXByX2RlYnVnKCJUQVJHRVRfQ09SRVslc10tPlRQR1sldV1fTFVOWyV1XSAtIEFkZGluZyAlcyIKIAkJCSIgYWNjZXNzIGZvciBMVU4gaW4gRGVtbyBNb2RlXG4iLAotCQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSwgbHVuLT51bnBhY2tlZF9sdW4sCisJCQl0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAorCQkJdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3RhZyh0cGcpLCBsdW4tPnVucGFja2VkX2x1biwKIAkJCShsdW5fYWNjZXNzID09IFRSQU5TUE9SVF9MVU5GTEFHU19SRUFEX1dSSVRFKSA/CiAJCQkiUkVBRC1XUklURSIgOiAiUkVBRC1PTkxZIik7CiAKQEAgLTIxMCw4ICsyMTUsOCBAQAogCXN0cnVjdCBzZV9ub2RlX2FjbCAqYWNsKQogewogCWlmICghYWNsLT5xdWV1ZV9kZXB0aCkgewotCQlwcmludGsoS0VSTl9FUlIgIlF1ZXVlIGRlcHRoIGZvciAlcyBJbml0aWF0b3IgTm9kZTogJXMgaXMgMCwiCi0JCQkiZGVmYXVsdGluZyB0byAxLlxuIiwgVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKKwkJcHJfZXJyKCJRdWV1ZSBkZXB0aCBmb3IgJXMgSW5pdGlhdG9yIE5vZGU6ICVzIGlzIDAsIgorCQkJImRlZmF1bHRpbmcgdG8gMS5cbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCiAJCQlhY2wtPmluaXRpYXRvcm5hbWUpOwogCQlhY2wtPnF1ZXVlX2RlcHRoID0gMTsKIAl9CkBAIC0yMzAsMTAgKzIzNSwxMCBAQAogCiAJbmFjbC0+ZGV2aWNlX2xpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VfZGV2X2VudHJ5KSAqCiAJCQkJVFJBTlNQT1JUX01BWF9MVU5TX1BFUl9UUEcsIEdGUF9LRVJORUwpOwotCWlmICghKG5hY2wtPmRldmljZV9saXN0KSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIgorCWlmICghbmFjbC0+ZGV2aWNlX2xpc3QpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciIKIAkJCSIgc3RydWN0IHNlX25vZGVfYWNsLT5kZXZpY2VfbGlzdFxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWZvciAoaSA9IDA7IGkgPCBUUkFOU1BPUlRfTUFYX0xVTlNfUEVSX1RQRzsgaSsrKSB7CiAJCWRldmUgPSAmbmFjbC0+ZGV2aWNlX2xpc3RbaV07CkBAIC0yNTksMTQgKzI2NCwxNCBAQAogCXN0cnVjdCBzZV9ub2RlX2FjbCAqYWNsOwogCiAJYWNsID0gY29yZV90cGdfZ2V0X2luaXRpYXRvcl9ub2RlX2FjbCh0cGcsIGluaXRpYXRvcm5hbWUpOwotCWlmICgoYWNsKSkKKwlpZiAoYWNsKQogCQlyZXR1cm4gYWNsOwogCi0JaWYgKCEoVFBHX1RGTyh0cGcpLT50cGdfY2hlY2tfZGVtb19tb2RlKHRwZykpKQorCWlmICghdHBnLT5zZV90cGdfdGZvLT50cGdfY2hlY2tfZGVtb19tb2RlKHRwZykpCiAJCXJldHVybiBOVUxMOwogCi0JYWNsID0gIFRQR19URk8odHBnKS0+dHBnX2FsbG9jX2ZhYnJpY19hY2wodHBnKTsKLQlpZiAoIShhY2wpKQorCWFjbCA9ICB0cGctPnNlX3RwZ190Zm8tPnRwZ19hbGxvY19mYWJyaWNfYWNsKHRwZyk7CisJaWYgKCFhY2wpCiAJCXJldHVybiBOVUxMOwogCiAJSU5JVF9MSVNUX0hFQUQoJmFjbC0+YWNsX2xpc3QpOwpAQCAtMjc0LDIzICsyNzksMjMgQEAKIAlzcGluX2xvY2tfaW5pdCgmYWNsLT5kZXZpY2VfbGlzdF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYWNsLT5uYWNsX3Nlc3NfbG9jayk7CiAJYXRvbWljX3NldCgmYWNsLT5hY2xfcHJfcmVmX2NvdW50LCAwKTsKLQlhY2wtPnF1ZXVlX2RlcHRoID0gVFBHX1RGTyh0cGcpLT50cGdfZ2V0X2RlZmF1bHRfZGVwdGgodHBnKTsKKwlhY2wtPnF1ZXVlX2RlcHRoID0gdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X2RlZmF1bHRfZGVwdGgodHBnKTsKIAlzbnByaW50ZihhY2wtPmluaXRpYXRvcm5hbWUsIFRSQU5TUE9SVF9JUU5fTEVOLCAiJXMiLCBpbml0aWF0b3JuYW1lKTsKIAlhY2wtPnNlX3RwZyA9IHRwZzsKIAlhY2wtPmFjbF9pbmRleCA9IHNjc2lfZ2V0X25ld19pbmRleChTQ1NJX0FVVEhfSU5UUl9JTkRFWCk7CiAJc3Bpbl9sb2NrX2luaXQoJmFjbC0+c3RhdHNfbG9jayk7CiAJYWNsLT5keW5hbWljX25vZGVfYWNsID0gMTsKIAotCVRQR19URk8odHBnKS0+c2V0X2RlZmF1bHRfbm9kZV9hdHRyaWJ1dGVzKGFjbCk7CisJdHBnLT5zZV90cGdfdGZvLT5zZXRfZGVmYXVsdF9ub2RlX2F0dHJpYnV0ZXMoYWNsKTsKIAogCWlmIChjb3JlX2NyZWF0ZV9kZXZpY2VfbGlzdF9mb3Jfbm9kZShhY2wpIDwgMCkgewotCQlUUEdfVEZPKHRwZyktPnRwZ19yZWxlYXNlX2ZhYnJpY19hY2wodHBnLCBhY2wpOworCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19yZWxlYXNlX2ZhYnJpY19hY2wodHBnLCBhY2wpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlpZiAoY29yZV9zZXRfcXVldWVfZGVwdGhfZm9yX25vZGUodHBnLCBhY2wpIDwgMCkgewogCQljb3JlX2ZyZWVfZGV2aWNlX2xpc3RfZm9yX25vZGUoYWNsLCB0cGcpOwotCQlUUEdfVEZPKHRwZyktPnRwZ19yZWxlYXNlX2ZhYnJpY19hY2wodHBnLCBhY2wpOworCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19yZWxlYXNlX2ZhYnJpY19hY2wodHBnLCBhY2wpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTMwMSwxMCArMzA2LDEwIEBACiAJdHBnLT5udW1fbm9kZV9hY2xzKys7CiAJc3Bpbl91bmxvY2tfYmgoJnRwZy0+YWNsX25vZGVfbG9jayk7CiAKLQlwcmludGsoIiVzX1RQR1sldV0gLSBBZGRlZCBEWU5BTUlDIEFDTCB3aXRoIFRDUSBEZXB0aDogJWQgZm9yICVzIgotCQkiIEluaXRpYXRvciBOb2RlOiAlc1xuIiwgVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpLCBhY2wtPnF1ZXVlX2RlcHRoLAotCQlUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpLCBpbml0aWF0b3JuYW1lKTsKKwlwcl9kZWJ1ZygiJXNfVFBHWyV1XSAtIEFkZGVkIERZTkFNSUMgQUNMIHdpdGggVENRIERlcHRoOiAlZCBmb3IgJXMiCisJCSIgSW5pdGlhdG9yIE5vZGU6ICVzXG4iLCB0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAorCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfdGFnKHRwZyksIGFjbC0+cXVldWVfZGVwdGgsCisJCXRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksIGluaXRpYXRvcm5hbWUpOwogCiAJcmV0dXJuIGFjbDsKIH0KQEAgLTM1MSwxMiArMzU2LDEyIEBACiAKIAlzcGluX2xvY2tfYmgoJnRwZy0+YWNsX25vZGVfbG9jayk7CiAJYWNsID0gX19jb3JlX3RwZ19nZXRfaW5pdGlhdG9yX25vZGVfYWNsKHRwZywgaW5pdGlhdG9ybmFtZSk7Ci0JaWYgKChhY2wpKSB7CisJaWYgKGFjbCkgewogCQlpZiAoYWNsLT5keW5hbWljX25vZGVfYWNsKSB7CiAJCQlhY2wtPmR5bmFtaWNfbm9kZV9hY2wgPSAwOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNfVFBHWyV1XSAtIFJlcGxhY2luZyBkeW5hbWljIEFDTCIKLQkJCQkiIGZvciAlc1xuIiwgVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJCQlUUEdfVEZPKHRwZyktPnRwZ19nZXRfdGFnKHRwZyksIGluaXRpYXRvcm5hbWUpOworCQkJcHJfZGVidWcoIiVzX1RQR1sldV0gLSBSZXBsYWNpbmcgZHluYW1pYyBBQ0wiCisJCQkJIiBmb3IgJXNcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCQkJdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3RhZyh0cGcpLCBpbml0aWF0b3JuYW1lKTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZ0cGctPmFjbF9ub2RlX2xvY2spOwogCQkJLyoKIAkJCSAqIFJlbGVhc2UgdGhlIGxvY2FsbHkgYWxsb2NhdGVkIHN0cnVjdCBzZV9ub2RlX2FjbApAQCAtMzY0LDIyICszNjksMjIgQEAKIAkJCSAqIGEgcG9pbnRlciB0byBhbiBleGlzdGluZyBkZW1vIG1vZGUgbm9kZSBBQ0wuCiAJCQkgKi8KIAkJCWlmIChzZV9uYWNsKQotCQkJCVRQR19URk8odHBnKS0+dHBnX3JlbGVhc2VfZmFicmljX2FjbCh0cGcsCisJCQkJdHBnLT5zZV90cGdfdGZvLT50cGdfcmVsZWFzZV9mYWJyaWNfYWNsKHRwZywKIAkJCQkJCQlzZV9uYWNsKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCi0JCXByaW50ayhLRVJOX0VSUiAiQUNMIGVudHJ5IGZvciAlcyBJbml0aWF0b3IiCisJCXByX2VycigiQUNMIGVudHJ5IGZvciAlcyBJbml0aWF0b3IiCiAJCQkiIE5vZGUgJXMgYWxyZWFkeSBleGlzdHMgZm9yIFRQRyAldSwgaWdub3JpbmciCi0JCQkiIHJlcXVlc3QuXG4iLCAgVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJCWluaXRpYXRvcm5hbWUsIFRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSk7CisJCQkiIHJlcXVlc3QuXG4iLCAgdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwKKwkJCWluaXRpYXRvcm5hbWUsIHRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0cGctPmFjbF9ub2RlX2xvY2spOwogCQlyZXR1cm4gRVJSX1BUUigtRUVYSVNUKTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnRwZy0+YWNsX25vZGVfbG9jayk7CiAKLQlpZiAoIShzZV9uYWNsKSkgewotCQlwcmludGsoInN0cnVjdCBzZV9ub2RlX2FjbCBwb2ludGVyIGlzIE5VTExcbiIpOworCWlmICghc2VfbmFjbCkgeworCQlwcl9lcnIoInN0cnVjdCBzZV9ub2RlX2FjbCBwb2ludGVyIGlzIE5VTExcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAJLyoKQEAgLTQwMCwxNiArNDA1LDE2IEBACiAJYWNsLT5hY2xfaW5kZXggPSBzY3NpX2dldF9uZXdfaW5kZXgoU0NTSV9BVVRIX0lOVFJfSU5ERVgpOwogCXNwaW5fbG9ja19pbml0KCZhY2wtPnN0YXRzX2xvY2spOwogCi0JVFBHX1RGTyh0cGcpLT5zZXRfZGVmYXVsdF9ub2RlX2F0dHJpYnV0ZXMoYWNsKTsKKwl0cGctPnNlX3RwZ190Zm8tPnNldF9kZWZhdWx0X25vZGVfYXR0cmlidXRlcyhhY2wpOwogCiAJaWYgKGNvcmVfY3JlYXRlX2RldmljZV9saXN0X2Zvcl9ub2RlKGFjbCkgPCAwKSB7Ci0JCVRQR19URk8odHBnKS0+dHBnX3JlbGVhc2VfZmFicmljX2FjbCh0cGcsIGFjbCk7CisJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX3JlbGVhc2VfZmFicmljX2FjbCh0cGcsIGFjbCk7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAogCWlmIChjb3JlX3NldF9xdWV1ZV9kZXB0aF9mb3Jfbm9kZSh0cGcsIGFjbCkgPCAwKSB7CiAJCWNvcmVfZnJlZV9kZXZpY2VfbGlzdF9mb3Jfbm9kZShhY2wsIHRwZyk7Ci0JCVRQR19URk8odHBnKS0+dHBnX3JlbGVhc2VfZmFicmljX2FjbCh0cGcsIGFjbCk7CisJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX3JlbGVhc2VfZmFicmljX2FjbCh0cGcsIGFjbCk7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIApAQCAtNDE5LDEwICs0MjQsMTAgQEAKIAlzcGluX3VubG9ja19iaCgmdHBnLT5hY2xfbm9kZV9sb2NrKTsKIAogZG9uZToKLQlwcmludGsoS0VSTl9JTkZPICIlc19UUEdbJWh1XSAtIEFkZGVkIEFDTCB3aXRoIFRDUSBEZXB0aDogJWQgZm9yICVzIgotCQkiIEluaXRpYXRvciBOb2RlOiAlc1xuIiwgVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpLCBhY2wtPnF1ZXVlX2RlcHRoLAotCQlUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpLCBpbml0aWF0b3JuYW1lKTsKKwlwcl9kZWJ1ZygiJXNfVFBHWyVodV0gLSBBZGRlZCBBQ0wgd2l0aCBUQ1EgRGVwdGg6ICVkIGZvciAlcyIKKwkJIiBJbml0aWF0b3IgTm9kZTogJXNcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSwgYWNsLT5xdWV1ZV9kZXB0aCwKKwkJdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgaW5pdGlhdG9ybmFtZSk7CiAKIAlyZXR1cm4gYWNsOwogfQpAQCAtNDU3LDcgKzQ2Miw3IEBACiAJCS8qCiAJCSAqIERldGVybWluZSBpZiB0aGUgc2Vzc2lvbiBuZWVkcyB0byBiZSBjbG9zZWQgYnkgb3VyIGNvbnRleHQuCiAJCSAqLwotCQlpZiAoIShUUEdfVEZPKHRwZyktPnNodXRkb3duX3Nlc3Npb24oc2VzcykpKQorCQlpZiAoIXRwZy0+c2VfdHBnX3Rmby0+c2h1dGRvd25fc2Vzc2lvbihzZXNzKSkKIAkJCWNvbnRpbnVlOwogCiAJCXNwaW5fdW5sb2NrX2JoKCZ0cGctPnNlc3Npb25fbG9jayk7CkBAIC00NjUsNyArNDcwLDcgQEAKIAkJICogSWYgdGhlICRGQUJSSUNfTU9EIHNlc3Npb24gZm9yIHRoZSBJbml0aWF0b3IgTm9kZSBBQ0wgZXhpc3RzLAogCQkgKiBmb3JjZWZ1bGx5IHNodXRkb3duIHRoZSAkRkFCUklDX01PRCBzZXNzaW9uL25leHVzLgogCQkgKi8KLQkJVFBHX1RGTyh0cGcpLT5jbG9zZV9zZXNzaW9uKHNlc3MpOworCQl0cGctPnNlX3RwZ190Zm8tPmNsb3NlX3Nlc3Npb24oc2Vzcyk7CiAKIAkJc3Bpbl9sb2NrX2JoKCZ0cGctPnNlc3Npb25fbG9jayk7CiAJfQpAQCAtNDc1LDEwICs0ODAsMTAgQEAKIAljb3JlX2NsZWFyX2luaXRpYXRvcl9ub2RlX2Zyb21fdHBnKGFjbCwgdHBnKTsKIAljb3JlX2ZyZWVfZGV2aWNlX2xpc3RfZm9yX25vZGUoYWNsLCB0cGcpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXNfVFBHWyVodV0gLSBEZWxldGVkIEFDTCB3aXRoIFRDUSBEZXB0aDogJWQgZm9yICVzIgotCQkiIEluaXRpYXRvciBOb2RlOiAlc1xuIiwgVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpLCBhY2wtPnF1ZXVlX2RlcHRoLAotCQlUUEdfVEZPKHRwZyktPmdldF9mYWJyaWNfbmFtZSgpLCBhY2wtPmluaXRpYXRvcm5hbWUpOworCXByX2RlYnVnKCIlc19UUEdbJWh1XSAtIERlbGV0ZWQgQUNMIHdpdGggVENRIERlcHRoOiAlZCBmb3IgJXMiCisJCSIgSW5pdGlhdG9yIE5vZGU6ICVzXG4iLCB0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAorCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfdGFnKHRwZyksIGFjbC0+cXVldWVfZGVwdGgsCisJCXRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksIGFjbC0+aW5pdGlhdG9ybmFtZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUwMCwxMSArNTA1LDExIEBACiAKIAlzcGluX2xvY2tfYmgoJnRwZy0+YWNsX25vZGVfbG9jayk7CiAJYWNsID0gX19jb3JlX3RwZ19nZXRfaW5pdGlhdG9yX25vZGVfYWNsKHRwZywgaW5pdGlhdG9ybmFtZSk7Ci0JaWYgKCEoYWNsKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkFjY2VzcyBDb250cm9sIExpc3QgZW50cnkgZm9yICVzIEluaXRpYXRvciIKKwlpZiAoIWFjbCkgeworCQlwcl9lcnIoIkFjY2VzcyBDb250cm9sIExpc3QgZW50cnkgZm9yICVzIEluaXRpYXRvciIKIAkJCSIgTm9kZSAlcyBkb2VzIG5vdCBleGlzdHMgZm9yIFRQRyAlaHUsIGlnbm9yaW5nIgotCQkJIiByZXF1ZXN0LlxuIiwgVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJCWluaXRpYXRvcm5hbWUsIFRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSk7CisJCQkiIHJlcXVlc3QuXG4iLCB0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAorCQkJaW5pdGlhdG9ybmFtZSwgdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3RhZyh0cGcpKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnRwZy0+YWNsX25vZGVfbG9jayk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTUyMCwxMiArNTI1LDEyIEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoIWZvcmNlKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBjaGFuZ2UgcXVldWUgZGVwdGggZm9yICVzIgorCQkJcHJfZXJyKCJVbmFibGUgdG8gY2hhbmdlIHF1ZXVlIGRlcHRoIGZvciAlcyIKIAkJCQkiIEluaXRpYXRvciBOb2RlOiAlcyB3aGlsZSBzZXNzaW9uIGlzIgogCQkJCSIgb3BlcmF0aW9uYWwuICBUbyBmb3JjZWZ1bGx5IGNoYW5nZSB0aGUgcXVldWUiCiAJCQkJIiBkZXB0aCBhbmQgZm9yY2Ugc2Vzc2lvbiByZWluc3RhdGVtZW50IgogCQkJCSIgdXNlIHRoZSBcImZvcmNlPTFcIiBwYXJhbWV0ZXIuXG4iLAotCQkJCVRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksIGluaXRpYXRvcm5hbWUpOworCQkJCXRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksIGluaXRpYXRvcm5hbWUpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnRwZy0+c2Vzc2lvbl9sb2NrKTsKIAogCQkJc3Bpbl9sb2NrX2JoKCZ0cGctPmFjbF9ub2RlX2xvY2spOwpAQCAtNTM3LDcgKzU0Miw3IEBACiAJCS8qCiAJCSAqIERldGVybWluZSBpZiB0aGUgc2Vzc2lvbiBuZWVkcyB0byBiZSBjbG9zZWQgYnkgb3VyIGNvbnRleHQuCiAJCSAqLwotCQlpZiAoIShUUEdfVEZPKHRwZyktPnNodXRkb3duX3Nlc3Npb24oc2VzcykpKQorCQlpZiAoIXRwZy0+c2VfdHBnX3Rmby0+c2h1dGRvd25fc2Vzc2lvbihzZXNzKSkKIAkJCWNvbnRpbnVlOwogCiAJCWluaXRfc2VzcyA9IHNlc3M7CkBAIC01NDksNyArNTU0LDcgQEAKIAkgKiBDaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBOb2RlJ3Mgc3RydWN0IHNlX25vZGVfYWNsLCBhbmQgY2FsbAogCSAqIGNvcmVfc2V0X3F1ZXVlX2RlcHRoX2Zvcl9ub2RlKCkgdG8gYWRkIHRoZSByZXF1ZXN0ZWQgcXVldWUgZGVwdGguCiAJICoKLQkgKiBGaW5hbGx5IGNhbGwgIFRQR19URk8odHBnKS0+Y2xvc2Vfc2Vzc2lvbigpIHRvIGZvcmNlIHNlc3Npb24KKwkgKiBGaW5hbGx5IGNhbGwgIHRwZy0+c2VfdHBnX3Rmby0+Y2xvc2Vfc2Vzc2lvbigpIHRvIGZvcmNlIHNlc3Npb24KIAkgKiByZWluc3RhdGVtZW50IHRvIG9jY3VyIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBzZXNzaW9uIGZvciB0aGUKIAkgKiAkRkFCUklDX01PRCBJbml0aWF0b3IgTm9kZSBpbiBxdWVzdGlvbi4KIAkgKi8KQEAgLTU2MSwxMCArNTY2LDEwIEBACiAJCSAqIEZvcmNlIHNlc3Npb24gcmVpbnN0YXRlbWVudCBpZgogCQkgKiBjb3JlX3NldF9xdWV1ZV9kZXB0aF9mb3Jfbm9kZSgpIGZhaWxlZCwgYmVjYXVzZSB3ZSBhc3N1bWUKIAkJICogdGhlICRGQUJSSUNfTU9EIGhhcyBhbHJlYWR5IHRoZSBzZXQgc2Vzc2lvbiByZWluc3RhdGVtZW50Ci0JCSAqIGJpdCBmcm9tIFRQR19URk8odHBnKS0+c2h1dGRvd25fc2Vzc2lvbigpIGNhbGxlZCBhYm92ZS4KKwkJICogYml0IGZyb20gdHBnLT5zZV90cGdfdGZvLT5zaHV0ZG93bl9zZXNzaW9uKCkgY2FsbGVkIGFib3ZlLgogCQkgKi8KIAkJaWYgKGluaXRfc2VzcykKLQkJCVRQR19URk8odHBnKS0+Y2xvc2Vfc2Vzc2lvbihpbml0X3Nlc3MpOworCQkJdHBnLT5zZV90cGdfdGZvLT5jbG9zZV9zZXNzaW9uKGluaXRfc2Vzcyk7CiAKIAkJc3Bpbl9sb2NrX2JoKCZ0cGctPmFjbF9ub2RlX2xvY2spOwogCQlpZiAoZHluYW1pY19hY2wpCkBAIC01NzgsMTIgKzU4MywxMiBAQAogCSAqIGZvcmNlZnVsbHkgc2h1dGRvd24gdGhlICRGQUJSSUNfTU9EIHNlc3Npb24vbmV4dXMuCiAJICovCiAJaWYgKGluaXRfc2VzcykKLQkJVFBHX1RGTyh0cGcpLT5jbG9zZV9zZXNzaW9uKGluaXRfc2Vzcyk7CisJCXRwZy0+c2VfdHBnX3Rmby0+Y2xvc2Vfc2Vzc2lvbihpbml0X3Nlc3MpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiU3VjY2Vzc2Z1bHkgY2hhbmdlZCBxdWV1ZSBkZXB0aCB0bzogJWQgZm9yIEluaXRpYXRvciIKKwlwcl9kZWJ1ZygiU3VjY2Vzc2Z1bHkgY2hhbmdlZCBxdWV1ZSBkZXB0aCB0bzogJWQgZm9yIEluaXRpYXRvciIKIAkJIiBOb2RlOiAlcyBvbiAlcyBUYXJnZXQgUG9ydGFsIEdyb3VwOiAldVxuIiwgcXVldWVfZGVwdGgsCi0JCWluaXRpYXRvcm5hbWUsIFRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksCi0JCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSk7CisJCWluaXRpYXRvcm5hbWUsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSk7CiAKIAlzcGluX2xvY2tfYmgoJnRwZy0+YWNsX25vZGVfbG9jayk7CiAJaWYgKGR5bmFtaWNfYWNsKQpAQCAtNTk3LDcgKzYwMiw3IEBACiBzdGF0aWMgaW50IGNvcmVfdHBnX3NldHVwX3ZpcnR1YWxfbHVuMChzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICpzZV90cGcpCiB7CiAJLyogU2V0IGluIGNvcmVfZGV2X3NldHVwX3ZpcnR1YWxfbHVuMCgpICovCi0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gc2VfZ2xvYmFsLT5nX2x1bjBfZGV2OworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGdfbHVuMF9kZXY7CiAJc3RydWN0IHNlX2x1biAqbHVuID0gJnNlX3RwZy0+dHBnX3ZpcnRfbHVuMDsKIAl1MzIgbHVuX2FjY2VzcyA9IFRSQU5TUE9SVF9MVU5GTEFHU19SRUFEX09OTFk7CiAJaW50IHJldDsKQEAgLTYxNCw3ICs2MTksNyBAQAogCiAJcmV0ID0gY29yZV90cGdfcG9zdF9hZGRsdW4oc2VfdHBnLCBsdW4sIGx1bl9hY2Nlc3MsIGRldik7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIHJldDsKIAogCXJldHVybiAwOwogfQpAQCAtNjM4LDggKzY0Myw4IEBACiAKIAlzZV90cGctPnRwZ19sdW5fbGlzdCA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3Qgc2VfbHVuKSAqCiAJCQkJVFJBTlNQT1JUX01BWF9MVU5TX1BFUl9UUEcpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIShzZV90cGctPnRwZ19sdW5fbGlzdCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHNlX3BvcnRhbF9ncm91cC0+IgorCWlmICghc2VfdHBnLT50cGdfbHVuX2xpc3QpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IHNlX3BvcnRhbF9ncm91cC0+IgogCQkJCSJ0cGdfbHVuX2xpc3RcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC02NjMsNyArNjY4LDcgQEAKIAlzZV90cGctPnNlX3RwZ193d24gPSBzZV93d247CiAJYXRvbWljX3NldCgmc2VfdHBnLT50cGdfcHJfcmVmX2NvdW50LCAwKTsKIAlJTklUX0xJU1RfSEVBRCgmc2VfdHBnLT5hY2xfbm9kZV9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmc2VfdHBnLT5zZV90cGdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnNlX3RwZy0+c2VfdHBnX25vZGUpOwogCUlOSVRfTElTVF9IRUFEKCZzZV90cGctPnRwZ19zZXNzX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZzZV90cGctPmFjbF9ub2RlX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZzZV90cGctPnNlc3Npb25fbG9jayk7CkBAIC02NzYsMTEgKzY4MSwxMSBAQAogCQl9CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZzZV9nbG9iYWwtPnNlX3RwZ19sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZzZV90cGctPnNlX3RwZ19saXN0LCAmc2VfZ2xvYmFsLT5nX3NlX3RwZ19saXN0KTsKLQlzcGluX3VubG9ja19iaCgmc2VfZ2xvYmFsLT5zZV90cGdfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZ0cGdfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmc2VfdHBnLT5zZV90cGdfbm9kZSwgJnRwZ19saXN0KTsKKwlzcGluX3VubG9ja19iaCgmdHBnX2xvY2spOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVEFSR0VUX0NPUkVbJXNdOiBBbGxvY2F0ZWQgJXMgc3RydWN0IHNlX3BvcnRhbF9ncm91cCBmb3IiCisJcHJfZGVidWcoIlRBUkdFVF9DT1JFWyVzXTogQWxsb2NhdGVkICVzIHN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgZm9yIgogCQkiIGVuZHBvaW50OiAlcywgUG9ydGFsIFRhZzogJXVcbiIsIHRmby0+Z2V0X2ZhYnJpY19uYW1lKCksCiAJCShzZV90cGctPnNlX3RwZ190eXBlID09IFRSQU5TUE9SVF9UUEdfVFlQRV9OT1JNQUwpID8KIAkJIk5vcm1hbCIgOiAiRGlzY292ZXJ5IiwgKHRmby0+dHBnX2dldF93d24oc2VfdHBnKSA9PSBOVUxMKSA/CkBAIC02OTQsMTYgKzY5OSwxNiBAQAogewogCXN0cnVjdCBzZV9ub2RlX2FjbCAqbmFjbCwgKm5hY2xfdG1wOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVEFSR0VUX0NPUkVbJXNdOiBEZWFsbG9jYXRpbmcgJXMgc3RydWN0IHNlX3BvcnRhbF9ncm91cCIKKwlwcl9kZWJ1ZygiVEFSR0VUX0NPUkVbJXNdOiBEZWFsbG9jYXRpbmcgJXMgc3RydWN0IHNlX3BvcnRhbF9ncm91cCIKIAkJIiBmb3IgZW5kcG9pbnQ6ICVzIFBvcnRhbCBUYWcgJXVcbiIsCiAJCShzZV90cGctPnNlX3RwZ190eXBlID09IFRSQU5TUE9SVF9UUEdfVFlQRV9OT1JNQUwpID8KLQkJIk5vcm1hbCIgOiAiRGlzY292ZXJ5IiwgVFBHX1RGTyhzZV90cGcpLT5nZXRfZmFicmljX25hbWUoKSwKLQkJVFBHX1RGTyhzZV90cGcpLT50cGdfZ2V0X3d3bihzZV90cGcpLAotCQlUUEdfVEZPKHNlX3RwZyktPnRwZ19nZXRfdGFnKHNlX3RwZykpOworCQkiTm9ybWFsIiA6ICJEaXNjb3ZlcnkiLCBzZV90cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAorCQlzZV90cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfd3duKHNlX3RwZyksCisJCXNlX3RwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcoc2VfdHBnKSk7CiAKLQlzcGluX2xvY2tfYmgoJnNlX2dsb2JhbC0+c2VfdHBnX2xvY2spOwotCWxpc3RfZGVsKCZzZV90cGctPnNlX3RwZ19saXN0KTsKLQlzcGluX3VubG9ja19iaCgmc2VfZ2xvYmFsLT5zZV90cGdfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZ0cGdfbG9jayk7CisJbGlzdF9kZWwoJnNlX3RwZy0+c2VfdHBnX25vZGUpOworCXNwaW5fdW5sb2NrX2JoKCZ0cGdfbG9jayk7CiAKIAl3aGlsZSAoYXRvbWljX3JlYWQoJnNlX3RwZy0+dHBnX3ByX3JlZl9jb3VudCkgIT0gMCkKIAkJY3B1X3JlbGF4KCk7CkBAIC03MjEsNyArNzI2LDcgQEAKIAogCQljb3JlX3RwZ193YWl0X2Zvcl9uYWNsX3ByX3JlZihuYWNsKTsKIAkJY29yZV9mcmVlX2RldmljZV9saXN0X2Zvcl9ub2RlKG5hY2wsIHNlX3RwZyk7Ci0JCVRQR19URk8oc2VfdHBnKS0+dHBnX3JlbGVhc2VfZmFicmljX2FjbChzZV90cGcsIG5hY2wpOworCQlzZV90cGctPnNlX3RwZ190Zm8tPnRwZ19yZWxlYXNlX2ZhYnJpY19hY2woc2VfdHBnLCBuYWNsKTsKIAogCQlzcGluX2xvY2tfYmgoJnNlX3RwZy0+YWNsX25vZGVfbG9jayk7CiAJfQpAQCAtNzQzLDIxICs3NDgsMjEgQEAKIAlzdHJ1Y3Qgc2VfbHVuICpsdW47CiAKIAlpZiAodW5wYWNrZWRfbHVuID4gKFRSQU5TUE9SVF9NQVhfTFVOU19QRVJfVFBHLTEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgTFVOOiAldSBleGNlZWRzIFRSQU5TUE9SVF9NQVhfTFVOU19QRVJfVFBHIgorCQlwcl9lcnIoIiVzIExVTjogJXUgZXhjZWVkcyBUUkFOU1BPUlRfTUFYX0xVTlNfUEVSX1RQRyIKIAkJCSItMTogJXUgZm9yIFRhcmdldCBQb3J0YWwgR3JvdXA6ICV1XG4iLAotCQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwKKwkJCXRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCiAJCQl1bnBhY2tlZF9sdW4sIFRSQU5TUE9SVF9NQVhfTFVOU19QRVJfVFBHLTEsCi0JCQlUUEdfVEZPKHRwZyktPnRwZ19nZXRfdGFnKHRwZykpOworCQkJdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3RhZyh0cGcpKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVPVkVSRkxPVyk7CiAJfQogCiAJc3Bpbl9sb2NrKCZ0cGctPnRwZ19sdW5fbG9jayk7CiAJbHVuID0gJnRwZy0+dHBnX2x1bl9saXN0W3VucGFja2VkX2x1bl07CiAJaWYgKGx1bi0+bHVuX3N0YXR1cyA9PSBUUkFOU1BPUlRfTFVOX1NUQVRVU19BQ1RJVkUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJUUEcgTG9naWNhbCBVbml0IE51bWJlcjogJXUgaXMgYWxyZWFkeSBhY3RpdmUiCisJCXByX2VycigiVFBHIExvZ2ljYWwgVW5pdCBOdW1iZXI6ICV1IGlzIGFscmVhZHkgYWN0aXZlIgogCQkJIiBvbiAlcyBUYXJnZXQgUG9ydGFsIEdyb3VwOiAldSwgaWdub3JpbmcgcmVxdWVzdC5cbiIsCi0JCQl1bnBhY2tlZF9sdW4sIFRQR19URk8odHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksCi0JCQlUUEdfVEZPKHRwZyktPnRwZ19nZXRfdGFnKHRwZykpOworCQkJdW5wYWNrZWRfbHVuLCB0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAorCQkJdHBnLT5zZV90cGdfdGZvLT50cGdfZ2V0X3RhZyh0cGcpKTsKIAkJc3Bpbl91bmxvY2soJnRwZy0+dHBnX2x1bl9sb2NrKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQpAQCAtNzcyLDggKzc3NywxMSBAQAogCXUzMiBsdW5fYWNjZXNzLAogCXZvaWQgKmx1bl9wdHIpCiB7Ci0JaWYgKGNvcmVfZGV2X2V4cG9ydChsdW5fcHRyLCB0cGcsIGx1bikgPCAwKQotCQlyZXR1cm4gLTE7CisJaW50IHJldDsKKworCXJldCA9IGNvcmVfZGV2X2V4cG9ydChsdW5fcHRyLCB0cGcsIGx1bik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlzcGluX2xvY2soJnRwZy0+dHBnX2x1bl9sb2NrKTsKIAlsdW4tPmx1bl9hY2Nlc3MgPSBsdW5fYWNjZXNzOwpAQCAtNzk5LDIxICs4MDcsMjEgQEAKIAlzdHJ1Y3Qgc2VfbHVuICpsdW47CiAKIAlpZiAodW5wYWNrZWRfbHVuID4gKFRSQU5TUE9SVF9NQVhfTFVOU19QRVJfVFBHLTEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgTFVOOiAldSBleGNlZWRzIFRSQU5TUE9SVF9NQVhfTFVOU19QRVJfVFBHIgorCQlwcl9lcnIoIiVzIExVTjogJXUgZXhjZWVkcyBUUkFOU1BPUlRfTUFYX0xVTlNfUEVSX1RQRyIKIAkJCSItMTogJXUgZm9yIFRhcmdldCBQb3J0YWwgR3JvdXA6ICV1XG4iLAotCQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwgdW5wYWNrZWRfbHVuLAorCQkJdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgdW5wYWNrZWRfbHVuLAogCQkJVFJBTlNQT1JUX01BWF9MVU5TX1BFUl9UUEctMSwKLQkJCVRQR19URk8odHBnKS0+dHBnX2dldF90YWcodHBnKSk7CisJCQl0cGctPnNlX3RwZ190Zm8tPnRwZ19nZXRfdGFnKHRwZykpOwogCQlyZXR1cm4gRVJSX1BUUigtRU9WRVJGTE9XKTsKIAl9CiAKIAlzcGluX2xvY2soJnRwZy0+dHBnX2x1bl9sb2NrKTsKIAlsdW4gPSAmdHBnLT50cGdfbHVuX2xpc3RbdW5wYWNrZWRfbHVuXTsKIAlpZiAobHVuLT5sdW5fc3RhdHVzICE9IFRSQU5TUE9SVF9MVU5fU1RBVFVTX0FDVElWRSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzIExvZ2ljYWwgVW5pdCBOdW1iZXI6ICV1IGlzIG5vdCBhY3RpdmUgb24iCisJCXByX2VycigiJXMgTG9naWNhbCBVbml0IE51bWJlcjogJXUgaXMgbm90IGFjdGl2ZSBvbiIKIAkJCSIgVGFyZ2V0IFBvcnRhbCBHcm91cDogJXUsIGlnbm9yaW5nIHJlcXVlc3QuXG4iLAotCQkJVFBHX1RGTyh0cGcpLT5nZXRfZmFicmljX25hbWUoKSwgdW5wYWNrZWRfbHVuLAotCQkJVFBHX1RGTyh0cGcpLT50cGdfZ2V0X3RhZyh0cGcpKTsKKwkJCXRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksIHVucGFja2VkX2x1biwKKwkJCXRwZy0+c2VfdHBnX3Rmby0+dHBnX2dldF90YWcodHBnKSk7CiAJCXNwaW5fdW5sb2NrKCZ0cGctPnRwZ19sdW5fbG9jayk7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMKaW5kZXggNGRhZmViOC4uNDYzNTJkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMKQEAgLTU4LDEzOSArNTgsMTIgQEAKICNpbmNsdWRlICJ0YXJnZXRfY29yZV9zY2RiLmgiCiAjaW5jbHVkZSAidGFyZ2V0X2NvcmVfdWEuaCIKIAotLyogI2RlZmluZSBERUJVR19DREJfSEFORExFUiAqLwotI2lmZGVmIERFQlVHX0NEQl9IQU5ETEVSCi0jZGVmaW5lIERFQlVHX0NEQl9IKHguLi4pIHByaW50ayhLRVJOX0lORk8geCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHX0NEQl9IKHguLi4pCi0jZW5kaWYKLQotLyogI2RlZmluZSBERUJVR19DTURfTUFQICovCi0jaWZkZWYgREVCVUdfQ01EX01BUAotI2RlZmluZSBERUJVR19DTURfTSh4Li4uKSBwcmludGsoS0VSTl9JTkZPIHgpCi0jZWxzZQotI2RlZmluZSBERUJVR19DTURfTSh4Li4uKQotI2VuZGlmCi0KLS8qICNkZWZpbmUgREVCVUdfTUVNX0FMTE9DICovCi0jaWZkZWYgREVCVUdfTUVNX0FMTE9DCi0jZGVmaW5lIERFQlVHX01FTSh4Li4uKSBwcmludGsoS0VSTl9JTkZPIHgpCi0jZWxzZQotI2RlZmluZSBERUJVR19NRU0oeC4uLikKLSNlbmRpZgotCi0vKiAjZGVmaW5lIERFQlVHX01FTTJfQUxMT0MgKi8KLSNpZmRlZiBERUJVR19NRU0yX0FMTE9DCi0jZGVmaW5lIERFQlVHX01FTTIoeC4uLikgcHJpbnRrKEtFUk5fSU5GTyB4KQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfTUVNMih4Li4uKQotI2VuZGlmCi0KLS8qICNkZWZpbmUgREVCVUdfU0dfQ0FMQyAqLwotI2lmZGVmIERFQlVHX1NHX0NBTEMKLSNkZWZpbmUgREVCVUdfU0MoeC4uLikgcHJpbnRrKEtFUk5fSU5GTyB4KQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfU0MoeC4uLikKLSNlbmRpZgotCi0vKiAjZGVmaW5lIERFQlVHX1NFX09CSiAqLwotI2lmZGVmIERFQlVHX1NFX09CSgotI2RlZmluZSBERUJVR19TTyh4Li4uKSBwcmludGsoS0VSTl9JTkZPIHgpCi0jZWxzZQotI2RlZmluZSBERUJVR19TTyh4Li4uKQotI2VuZGlmCi0KLS8qICNkZWZpbmUgREVCVUdfQ01EX1ZPTCAqLwotI2lmZGVmIERFQlVHX0NNRF9WT0wKLSNkZWZpbmUgREVCVUdfVk9MKHguLi4pIHByaW50ayhLRVJOX0lORk8geCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHX1ZPTCh4Li4uKQotI2VuZGlmCi0KLS8qICNkZWZpbmUgREVCVUdfQ01EX1NUT1AgKi8KLSNpZmRlZiBERUJVR19DTURfU1RPUAotI2RlZmluZSBERUJVR19DUyh4Li4uKSBwcmludGsoS0VSTl9JTkZPIHgpCi0jZWxzZQotI2RlZmluZSBERUJVR19DUyh4Li4uKQotI2VuZGlmCi0KLS8qICNkZWZpbmUgREVCVUdfUEFTU1RIUk9VR0ggKi8KLSNpZmRlZiBERUJVR19QQVNTVEhST1VHSAotI2RlZmluZSBERUJVR19QVCh4Li4uKSBwcmludGsoS0VSTl9JTkZPIHgpCi0jZWxzZQotI2RlZmluZSBERUJVR19QVCh4Li4uKQotI2VuZGlmCi0KLS8qICNkZWZpbmUgREVCVUdfVEFTS19TVE9QICovCi0jaWZkZWYgREVCVUdfVEFTS19TVE9QCi0jZGVmaW5lIERFQlVHX1RTKHguLi4pIHByaW50ayhLRVJOX0lORk8geCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHX1RTKHguLi4pCi0jZW5kaWYKLQotLyogI2RlZmluZSBERUJVR19UUkFOU1BPUlRfU1RPUCAqLwotI2lmZGVmIERFQlVHX1RSQU5TUE9SVF9TVE9QCi0jZGVmaW5lIERFQlVHX1RSQU5TUE9SVF9TKHguLi4pIHByaW50ayhLRVJOX0lORk8geCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHX1RSQU5TUE9SVF9TKHguLi4pCi0jZW5kaWYKLQotLyogI2RlZmluZSBERUJVR19UQVNLX0ZBSUxVUkUgKi8KLSNpZmRlZiBERUJVR19UQVNLX0ZBSUxVUkUKLSNkZWZpbmUgREVCVUdfVEYoeC4uLikgcHJpbnRrKEtFUk5fSU5GTyB4KQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfVEYoeC4uLikKLSNlbmRpZgotCi0vKiAjZGVmaW5lIERFQlVHX0RFVl9PRkZMSU5FICovCi0jaWZkZWYgREVCVUdfREVWX09GRkxJTkUKLSNkZWZpbmUgREVCVUdfRE8oeC4uLikgcHJpbnRrKEtFUk5fSU5GTyB4KQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfRE8oeC4uLikKLSNlbmRpZgotCi0vKiAjZGVmaW5lIERFQlVHX1RBU0tfU1RBVEUgKi8KLSNpZmRlZiBERUJVR19UQVNLX1NUQVRFCi0jZGVmaW5lIERFQlVHX1RTVEFURSh4Li4uKSBwcmludGsoS0VSTl9JTkZPIHgpCi0jZWxzZQotI2RlZmluZSBERUJVR19UU1RBVEUoeC4uLikKLSNlbmRpZgotCi0vKiAjZGVmaW5lIERFQlVHX1NUQVRVU19USFIgKi8KLSNpZmRlZiBERUJVR19TVEFUVVNfVEhSCi0jZGVmaW5lIERFQlVHX1NUKHguLi4pIHByaW50ayhLRVJOX0lORk8geCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHX1NUKHguLi4pCi0jZW5kaWYKLQotLyogI2RlZmluZSBERUJVR19UQVNLX1RJTUVPVVQgKi8KLSNpZmRlZiBERUJVR19UQVNLX1RJTUVPVVQKLSNkZWZpbmUgREVCVUdfVFQoeC4uLikgcHJpbnRrKEtFUk5fSU5GTyB4KQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfVFQoeC4uLikKLSNlbmRpZgotCi0vKiAjZGVmaW5lIERFQlVHX0dFTkVSSUNfUkVRVUVTVF9GQUlMVVJFICovCi0jaWZkZWYgREVCVUdfR0VORVJJQ19SRVFVRVNUX0ZBSUxVUkUKLSNkZWZpbmUgREVCVUdfR1JGKHguLi4pIHByaW50ayhLRVJOX0lORk8geCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHX0dSRih4Li4uKQotI2VuZGlmCi0KLS8qICNkZWZpbmUgREVCVUdfU0FNX1RBU0tfQVRUUlMgKi8KLSNpZmRlZiBERUJVR19TQU1fVEFTS19BVFRSUwotI2RlZmluZSBERUJVR19TVEEoeC4uLikgcHJpbnRrKEtFUk5fSU5GTyB4KQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfU1RBKHguLi4pCi0jZW5kaWYKLQotc3RydWN0IHNlX2dsb2JhbCAqc2VfZ2xvYmFsOworc3RhdGljIGludCBzdWJfYXBpX2luaXRpYWxpemVkOwogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNlX2NtZF9jYWNoZTsKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc2Vfc2Vzc19jYWNoZTsKIHN0cnVjdCBrbWVtX2NhY2hlICpzZV90bXJfcmVxX2NhY2hlOwogc3RydWN0IGttZW1fY2FjaGUgKnNlX3VhX2NhY2hlOwotc3RydWN0IGttZW1fY2FjaGUgKnNlX21lbV9jYWNoZTsKIHN0cnVjdCBrbWVtX2NhY2hlICp0MTBfcHJfcmVnX2NhY2hlOwogc3RydWN0IGttZW1fY2FjaGUgKnQxMF9hbHVhX2x1X2dwX2NhY2hlOwogc3RydWN0IGttZW1fY2FjaGUgKnQxMF9hbHVhX2x1X2dwX21lbV9jYWNoZTsKQEAgLTIwMSwxMTYgKzc0LDg3IEBACiB0eXBlZGVmIGludCAoKm1hcF9mdW5jX3QpKHN0cnVjdCBzZV90YXNrICosIHUzMik7CiAKIHN0YXRpYyBpbnQgdHJhbnNwb3J0X2dlbmVyaWNfd3JpdGVfcGVuZGluZyhzdHJ1Y3Qgc2VfY21kICopOwotc3RhdGljIGludCB0cmFuc3BvcnRfcHJvY2Vzc2luZ190aHJlYWQodm9pZCAqKTsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3Byb2Nlc3NpbmdfdGhyZWFkKHZvaWQgKnBhcmFtKTsKIHN0YXRpYyBpbnQgX190cmFuc3BvcnRfZXhlY3V0ZV90YXNrcyhzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2tfYXR0cihzdHJ1Y3Qgc2VfY21kICpjbWQpOworc3RhdGljIGludCB0cmFuc3BvcnRfY29tcGxldGVfcWYoc3RydWN0IHNlX2NtZCAqY21kKTsKK3N0YXRpYyB2b2lkIHRyYW5zcG9ydF9oYW5kbGVfcXVldWVfZnVsbChzdHJ1Y3Qgc2VfY21kICpjbWQsCisJCXN0cnVjdCBzZV9kZXZpY2UgKmRldiwgaW50ICgqcWZfY2FsbGJhY2spKHN0cnVjdCBzZV9jbWQgKikpOwogc3RhdGljIHZvaWQgdHJhbnNwb3J0X2RpcmVjdF9yZXF1ZXN0X3RpbWVvdXQoc3RydWN0IHNlX2NtZCAqY21kKTsKIHN0YXRpYyB2b2lkIHRyYW5zcG9ydF9mcmVlX2Rldl90YXNrcyhzdHJ1Y3Qgc2VfY21kICpjbWQpOwotc3RhdGljIHUzMiB0cmFuc3BvcnRfZ2VuZXJpY19nZXRfY2RiX2NvdW50KHN0cnVjdCBzZV9jbWQgKmNtZCwKLQkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0aW5nX2xiYSwgdTMyIHNlY3RvcnMsCitzdGF0aWMgdTMyIHRyYW5zcG9ydF9hbGxvY2F0ZV90YXNrcyhzdHJ1Y3Qgc2VfY21kICpjbWQsCisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydGluZ19sYmEsCiAJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRhdGFfZGlyZWN0aW9uLAotCQlzdHJ1Y3QgbGlzdF9oZWFkICptZW1fbGlzdCwgaW50IHNldF9jb3VudHMpOwotc3RhdGljIGludCB0cmFuc3BvcnRfZ2VuZXJpY19nZXRfbWVtKHN0cnVjdCBzZV9jbWQgKmNtZCwgdTMyIGxlbmd0aCwKLQkJdTMyIGRtYV9zaXplKTsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBuZW50cyk7CitzdGF0aWMgaW50IHRyYW5zcG9ydF9nZW5lcmljX2dldF9tZW0oc3RydWN0IHNlX2NtZCAqY21kKTsKIHN0YXRpYyBpbnQgdHJhbnNwb3J0X2dlbmVyaWNfcmVtb3ZlKHN0cnVjdCBzZV9jbWQgKmNtZCwKLQkJaW50IHJlbGVhc2VfdG9fcG9vbCwgaW50IHNlc3Npb25fcmVpbnN0YXRlbWVudCk7Ci1zdGF0aWMgaW50IHRyYW5zcG9ydF9nZXRfc2VjdG9ycyhzdHJ1Y3Qgc2VfY21kICpjbWQpOwotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKnRyYW5zcG9ydF9pbml0X3NlX21lbV9saXN0KHZvaWQpOwotc3RhdGljIGludCB0cmFuc3BvcnRfbWFwX3NnX3RvX21lbShzdHJ1Y3Qgc2VfY21kICpjbWQsCi0JCXN0cnVjdCBsaXN0X2hlYWQgKnNlX21lbV9saXN0LCB2b2lkICppbl9tZW0sCi0JCXUzMiAqc2VfbWVtX2NudCk7Ci1zdGF0aWMgdm9pZCB0cmFuc3BvcnRfbWVtY3B5X3NlX21lbV9yZWFkX2NvbnRpZyhzdHJ1Y3Qgc2VfY21kICpjbWQsCi0JCXVuc2lnbmVkIGNoYXIgKmRzdCwgc3RydWN0IGxpc3RfaGVhZCAqc2VfbWVtX2xpc3QpOworCQlpbnQgc2Vzc2lvbl9yZWluc3RhdGVtZW50KTsKIHN0YXRpYyB2b2lkIHRyYW5zcG9ydF9yZWxlYXNlX2ZlX2NtZChzdHJ1Y3Qgc2VfY21kICpjbWQpOwogc3RhdGljIHZvaWQgdHJhbnNwb3J0X3JlbW92ZV9jbWRfZnJvbV9xdWV1ZShzdHJ1Y3Qgc2VfY21kICpjbWQsCiAJCXN0cnVjdCBzZV9xdWV1ZV9vYmogKnFvYmopOwogc3RhdGljIGludCB0cmFuc3BvcnRfc2V0X3NlbnNlX2NvZGVzKHN0cnVjdCBzZV9jbWQgKmNtZCwgdTggYXNjLCB1OCBhc2NxKTsKIHN0YXRpYyB2b2lkIHRyYW5zcG9ydF9zdG9wX2FsbF90YXNrX3RpbWVycyhzdHJ1Y3Qgc2VfY21kICpjbWQpOwogCi1pbnQgaW5pdF9zZV9nbG9iYWwodm9pZCkKK2ludCBpbml0X3NlX2ttZW1fY2FjaGVzKHZvaWQpCiB7Ci0Jc3RydWN0IHNlX2dsb2JhbCAqZ2xvYmFsOwotCi0JZ2xvYmFsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlX2dsb2JhbCksIEdGUF9LRVJORUwpOwotCWlmICghKGdsb2JhbCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJ1Y3Qgc2VfZ2xvYmFsXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCUlOSVRfTElTVF9IRUFEKCZnbG9iYWwtPmdfbHVfZ3BzX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZnbG9iYWwtPmdfc2VfdHBnX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZnbG9iYWwtPmdfaGJhX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZnbG9iYWwtPmdfc2VfZGV2X2xpc3QpOwotCXNwaW5fbG9ja19pbml0KCZnbG9iYWwtPmdfZGV2aWNlX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZnbG9iYWwtPmhiYV9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmZ2xvYmFsLT5zZV90cGdfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmdsb2JhbC0+bHVfZ3BzX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZnbG9iYWwtPnBsdWdpbl9jbGFzc19sb2NrKTsKLQogCXNlX2NtZF9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzZV9jbWRfY2FjaGUiLAogCQkJc2l6ZW9mKHN0cnVjdCBzZV9jbWQpLCBfX2FsaWdub2ZfXyhzdHJ1Y3Qgc2VfY21kKSwgMCwgTlVMTCk7Ci0JaWYgKCEoc2VfY21kX2NhY2hlKSkgewotCQlwcmludGsoS0VSTl9FUlIgImttZW1fY2FjaGVfY3JlYXRlIGZvciBzdHJ1Y3Qgc2VfY21kIGZhaWxlZFxuIik7CisJaWYgKCFzZV9jbWRfY2FjaGUpIHsKKwkJcHJfZXJyKCJrbWVtX2NhY2hlX2NyZWF0ZSBmb3Igc3RydWN0IHNlX2NtZCBmYWlsZWRcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAJc2VfdG1yX3JlcV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzZV90bXJfY2FjaGUiLAogCQkJc2l6ZW9mKHN0cnVjdCBzZV90bXJfcmVxKSwgX19hbGlnbm9mX18oc3RydWN0IHNlX3Rtcl9yZXEpLAogCQkJMCwgTlVMTCk7Ci0JaWYgKCEoc2VfdG1yX3JlcV9jYWNoZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJrbWVtX2NhY2hlX2NyZWF0ZSgpIGZvciBzdHJ1Y3Qgc2VfdG1yX3JlcSIKKwlpZiAoIXNlX3Rtcl9yZXFfY2FjaGUpIHsKKwkJcHJfZXJyKCJrbWVtX2NhY2hlX2NyZWF0ZSgpIGZvciBzdHJ1Y3Qgc2VfdG1yX3JlcSIKIAkJCQkiIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAlzZV9zZXNzX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInNlX3Nlc3NfY2FjaGUiLAogCQkJc2l6ZW9mKHN0cnVjdCBzZV9zZXNzaW9uKSwgX19hbGlnbm9mX18oc3RydWN0IHNlX3Nlc3Npb24pLAogCQkJMCwgTlVMTCk7Ci0JaWYgKCEoc2Vfc2Vzc19jYWNoZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJrbWVtX2NhY2hlX2NyZWF0ZSgpIGZvciBzdHJ1Y3Qgc2Vfc2Vzc2lvbiIKKwlpZiAoIXNlX3Nlc3NfY2FjaGUpIHsKKwkJcHJfZXJyKCJrbWVtX2NhY2hlX2NyZWF0ZSgpIGZvciBzdHJ1Y3Qgc2Vfc2Vzc2lvbiIKIAkJCQkiIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAlzZV91YV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzZV91YV9jYWNoZSIsCiAJCQlzaXplb2Yoc3RydWN0IHNlX3VhKSwgX19hbGlnbm9mX18oc3RydWN0IHNlX3VhKSwKIAkJCTAsIE5VTEwpOwotCWlmICghKHNlX3VhX2NhY2hlKSkgewotCQlwcmludGsoS0VSTl9FUlIgImttZW1fY2FjaGVfY3JlYXRlKCkgZm9yIHN0cnVjdCBzZV91YSBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0Jc2VfbWVtX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInNlX21lbV9jYWNoZSIsCi0JCQlzaXplb2Yoc3RydWN0IHNlX21lbSksIF9fYWxpZ25vZl9fKHN0cnVjdCBzZV9tZW0pLCAwLCBOVUxMKTsKLQlpZiAoIShzZV9tZW1fY2FjaGUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAia21lbV9jYWNoZV9jcmVhdGUoKSBmb3Igc3RydWN0IHNlX21lbSBmYWlsZWRcbiIpOworCWlmICghc2VfdWFfY2FjaGUpIHsKKwkJcHJfZXJyKCJrbWVtX2NhY2hlX2NyZWF0ZSgpIGZvciBzdHJ1Y3Qgc2VfdWEgZmFpbGVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCXQxMF9wcl9yZWdfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidDEwX3ByX3JlZ19jYWNoZSIsCiAJCQlzaXplb2Yoc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24pLAogCQkJX19hbGlnbm9mX18oc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24pLCAwLCBOVUxMKTsKLQlpZiAoISh0MTBfcHJfcmVnX2NhY2hlKSkgewotCQlwcmludGsoS0VSTl9FUlIgImttZW1fY2FjaGVfY3JlYXRlKCkgZm9yIHN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uIgorCWlmICghdDEwX3ByX3JlZ19jYWNoZSkgeworCQlwcl9lcnIoImttZW1fY2FjaGVfY3JlYXRlKCkgZm9yIHN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uIgogCQkJCSIgZmFpbGVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCXQxMF9hbHVhX2x1X2dwX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInQxMF9hbHVhX2x1X2dwX2NhY2hlIiwKIAkJCXNpemVvZihzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3ApLCBfX2FsaWdub2ZfXyhzdHJ1Y3QgdDEwX2FsdWFfbHVfZ3ApLAogCQkJMCwgTlVMTCk7Ci0JaWYgKCEodDEwX2FsdWFfbHVfZ3BfY2FjaGUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAia21lbV9jYWNoZV9jcmVhdGUoKSBmb3IgdDEwX2FsdWFfbHVfZ3BfY2FjaGUiCisJaWYgKCF0MTBfYWx1YV9sdV9ncF9jYWNoZSkgeworCQlwcl9lcnIoImttZW1fY2FjaGVfY3JlYXRlKCkgZm9yIHQxMF9hbHVhX2x1X2dwX2NhY2hlIgogCQkJCSIgZmFpbGVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCXQxMF9hbHVhX2x1X2dwX21lbV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJ0MTBfYWx1YV9sdV9ncF9tZW1fY2FjaGUiLAogCQkJc2l6ZW9mKHN0cnVjdCB0MTBfYWx1YV9sdV9ncF9tZW1iZXIpLAogCQkJX19hbGlnbm9mX18oc3RydWN0IHQxMF9hbHVhX2x1X2dwX21lbWJlciksIDAsIE5VTEwpOwotCWlmICghKHQxMF9hbHVhX2x1X2dwX21lbV9jYWNoZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJrbWVtX2NhY2hlX2NyZWF0ZSgpIGZvciB0MTBfYWx1YV9sdV9ncF9tZW1fIgorCWlmICghdDEwX2FsdWFfbHVfZ3BfbWVtX2NhY2hlKSB7CisJCXByX2Vycigia21lbV9jYWNoZV9jcmVhdGUoKSBmb3IgdDEwX2FsdWFfbHVfZ3BfbWVtXyIKIAkJCQkiY2FjaGUgZmFpbGVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCXQxMF9hbHVhX3RnX3B0X2dwX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInQxMF9hbHVhX3RnX3B0X2dwX2NhY2hlIiwKIAkJCXNpemVvZihzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3ApLAogCQkJX19hbGlnbm9mX18oc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwKSwgMCwgTlVMTCk7Ci0JaWYgKCEodDEwX2FsdWFfdGdfcHRfZ3BfY2FjaGUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAia21lbV9jYWNoZV9jcmVhdGUoKSBmb3IgdDEwX2FsdWFfdGdfcHRfZ3BfIgorCWlmICghdDEwX2FsdWFfdGdfcHRfZ3BfY2FjaGUpIHsKKwkJcHJfZXJyKCJrbWVtX2NhY2hlX2NyZWF0ZSgpIGZvciB0MTBfYWx1YV90Z19wdF9ncF8iCiAJCQkJImNhY2hlIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTMxOSwxNCArMTYzLDEyIEBACiAJCQlzaXplb2Yoc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwX21lbWJlciksCiAJCQlfX2FsaWdub2ZfXyhzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3BfbWVtYmVyKSwKIAkJCTAsIE5VTEwpOwotCWlmICghKHQxMF9hbHVhX3RnX3B0X2dwX21lbV9jYWNoZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJrbWVtX2NhY2hlX2NyZWF0ZSgpIGZvciB0MTBfYWx1YV90Z19wdF9ncF8iCisJaWYgKCF0MTBfYWx1YV90Z19wdF9ncF9tZW1fY2FjaGUpIHsKKwkJcHJfZXJyKCJrbWVtX2NhY2hlX2NyZWF0ZSgpIGZvciB0MTBfYWx1YV90Z19wdF9ncF8iCiAJCQkJIm1lbV90IGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAotCXNlX2dsb2JhbCA9IGdsb2JhbDsKLQogCXJldHVybiAwOwogb3V0OgogCWlmIChzZV9jbWRfY2FjaGUpCkBAIC0zMzcsOCArMTc5LDYgQEAKIAkJa21lbV9jYWNoZV9kZXN0cm95KHNlX3Nlc3NfY2FjaGUpOwogCWlmIChzZV91YV9jYWNoZSkKIAkJa21lbV9jYWNoZV9kZXN0cm95KHNlX3VhX2NhY2hlKTsKLQlpZiAoc2VfbWVtX2NhY2hlKQotCQlrbWVtX2NhY2hlX2Rlc3Ryb3koc2VfbWVtX2NhY2hlKTsKIAlpZiAodDEwX3ByX3JlZ19jYWNoZSkKIAkJa21lbV9jYWNoZV9kZXN0cm95KHQxMF9wcl9yZWdfY2FjaGUpOwogCWlmICh0MTBfYWx1YV9sdV9ncF9jYWNoZSkKQEAgLTM0OSw0NSArMTg5LDI1IEBACiAJCWttZW1fY2FjaGVfZGVzdHJveSh0MTBfYWx1YV90Z19wdF9ncF9jYWNoZSk7CiAJaWYgKHQxMF9hbHVhX3RnX3B0X2dwX21lbV9jYWNoZSkKIAkJa21lbV9jYWNoZV9kZXN0cm95KHQxMF9hbHVhX3RnX3B0X2dwX21lbV9jYWNoZSk7Ci0Ja2ZyZWUoZ2xvYmFsKTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXZvaWQgcmVsZWFzZV9zZV9nbG9iYWwodm9pZCkKK3ZvaWQgcmVsZWFzZV9zZV9rbWVtX2NhY2hlcyh2b2lkKQogewotCXN0cnVjdCBzZV9nbG9iYWwgKmdsb2JhbDsKLQotCWdsb2JhbCA9IHNlX2dsb2JhbDsKLQlpZiAoIShnbG9iYWwpKQotCQlyZXR1cm47Ci0KIAlrbWVtX2NhY2hlX2Rlc3Ryb3koc2VfY21kX2NhY2hlKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koc2VfdG1yX3JlcV9jYWNoZSk7CiAJa21lbV9jYWNoZV9kZXN0cm95KHNlX3Nlc3NfY2FjaGUpOwogCWttZW1fY2FjaGVfZGVzdHJveShzZV91YV9jYWNoZSk7Ci0Ja21lbV9jYWNoZV9kZXN0cm95KHNlX21lbV9jYWNoZSk7CiAJa21lbV9jYWNoZV9kZXN0cm95KHQxMF9wcl9yZWdfY2FjaGUpOwogCWttZW1fY2FjaGVfZGVzdHJveSh0MTBfYWx1YV9sdV9ncF9jYWNoZSk7CiAJa21lbV9jYWNoZV9kZXN0cm95KHQxMF9hbHVhX2x1X2dwX21lbV9jYWNoZSk7CiAJa21lbV9jYWNoZV9kZXN0cm95KHQxMF9hbHVhX3RnX3B0X2dwX2NhY2hlKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3kodDEwX2FsdWFfdGdfcHRfZ3BfbWVtX2NhY2hlKTsKLQlrZnJlZShnbG9iYWwpOwotCi0Jc2VfZ2xvYmFsID0gTlVMTDsKIH0KIAotLyogU0NTSSBzdGF0aXN0aWNzIHRhYmxlIGluZGV4ICovCi1zdGF0aWMgc3RydWN0IHNjc2lfaW5kZXhfdGFibGUgc2NzaV9pbmRleF90YWJsZTsKLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGluZGV4IHRhYmxlIGZvciBhbGxvY2F0aW5nIHVuaXF1ZSByb3cgaW5kZXhlcyB0byB2YXJpb3VzIG1pYgotICogdGFibGVzLgotICovCi12b2lkIGluaXRfc2NzaV9pbmRleF90YWJsZSh2b2lkKQotewotCW1lbXNldCgmc2NzaV9pbmRleF90YWJsZSwgMCwgc2l6ZW9mKHN0cnVjdCBzY3NpX2luZGV4X3RhYmxlKSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnNjc2lfaW5kZXhfdGFibGUubG9jayk7Ci19CisvKiBUaGlzIGNvZGUgZW5zdXJlcyB1bmlxdWUgbWliIGluZGV4ZXMgYXJlIGhhbmRlZCBvdXQuICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNjc2lfbWliX2luZGV4X2xvY2spOworc3RhdGljIHUzMiBzY3NpX21pYl9pbmRleFtTQ1NJX0lOREVYX1RZUEVfTUFYXTsKIAogLyoKICAqIEFsbG9jYXRlIGEgbmV3IHJvdyBpbmRleCBmb3IgdGhlIGVudHJ5IHR5cGUgc3BlY2lmaWVkCkBAIC0zOTYsMTYgKzIxNiwxMSBAQAogewogCXUzMiBuZXdfaW5kZXg7CiAKLQlpZiAoKHR5cGUgPCAwKSB8fCAodHlwZSA+PSBTQ1NJX0lOREVYX1RZUEVfTUFYKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW5kZXggdHlwZSAlZFxuIiwgdHlwZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlCVUdfT04oKHR5cGUgPCAwKSB8fCAodHlwZSA+PSBTQ1NJX0lOREVYX1RZUEVfTUFYKSk7CiAKLQlzcGluX2xvY2soJnNjc2lfaW5kZXhfdGFibGUubG9jayk7Ci0JbmV3X2luZGV4ID0gKytzY3NpX2luZGV4X3RhYmxlLnNjc2lfbWliX2luZGV4W3R5cGVdOwotCWlmIChuZXdfaW5kZXggPT0gMCkKLQkJbmV3X2luZGV4ID0gKytzY3NpX2luZGV4X3RhYmxlLnNjc2lfbWliX2luZGV4W3R5cGVdOwotCXNwaW5fdW5sb2NrKCZzY3NpX2luZGV4X3RhYmxlLmxvY2spOworCXNwaW5fbG9jaygmc2NzaV9taWJfaW5kZXhfbG9jayk7CisJbmV3X2luZGV4ID0gKytzY3NpX21pYl9pbmRleFt0eXBlXTsKKwlzcGluX3VubG9jaygmc2NzaV9taWJfaW5kZXhfbG9jayk7CiAKIAlyZXR1cm4gbmV3X2luZGV4OwogfQpAQCAtNDI1LDM0ICsyNDAsMzcgQEAKIAogCXJldCA9IHJlcXVlc3RfbW9kdWxlKCJ0YXJnZXRfY29yZV9pYmxvY2siKTsKIAlpZiAocmV0ICE9IDApCi0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvYWQgdGFyZ2V0X2NvcmVfaWJsb2NrXG4iKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gbG9hZCB0YXJnZXRfY29yZV9pYmxvY2tcbiIpOwogCiAJcmV0ID0gcmVxdWVzdF9tb2R1bGUoInRhcmdldF9jb3JlX2ZpbGUiKTsKIAlpZiAocmV0ICE9IDApCi0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvYWQgdGFyZ2V0X2NvcmVfZmlsZVxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGxvYWQgdGFyZ2V0X2NvcmVfZmlsZVxuIik7CiAKIAlyZXQgPSByZXF1ZXN0X21vZHVsZSgidGFyZ2V0X2NvcmVfcHNjc2kiKTsKIAlpZiAocmV0ICE9IDApCi0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvYWQgdGFyZ2V0X2NvcmVfcHNjc2lcbiIpOworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2FkIHRhcmdldF9jb3JlX3BzY3NpXG4iKTsKIAogCXJldCA9IHJlcXVlc3RfbW9kdWxlKCJ0YXJnZXRfY29yZV9zdGd0Iik7CiAJaWYgKHJldCAhPSAwKQotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBsb2FkIHRhcmdldF9jb3JlX3N0Z3RcbiIpOworCQlwcl9lcnIoIlVuYWJsZSB0byBsb2FkIHRhcmdldF9jb3JlX3N0Z3RcbiIpOwogCiAJcmV0dXJuIDA7CiB9CiAKIGludCB0cmFuc3BvcnRfc3Vic3lzdGVtX2NoZWNrX2luaXQodm9pZCkKIHsKLQlpZiAoc2VfZ2xvYmFsLT5nX3N1Yl9hcGlfaW5pdGlhbGl6ZWQpCisJaW50IHJldDsKKworCWlmIChzdWJfYXBpX2luaXRpYWxpemVkKQogCQlyZXR1cm4gMDsKIAkvKgogCSAqIFJlcXVlc3QgdGhlIGxvYWRpbmcgb2Yga25vd24gVENNIHN1YnN5c3RlbSBwbHVnaW5zLi4KIAkgKi8KLQlpZiAodHJhbnNwb3J0X3N1YnN5c3RlbV9yZXFtb2RzKCkgPCAwKQotCQlyZXR1cm4gLTE7CisJcmV0ID0gdHJhbnNwb3J0X3N1YnN5c3RlbV9yZXFtb2RzKCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLQlzZV9nbG9iYWwtPmdfc3ViX2FwaV9pbml0aWFsaXplZCA9IDE7CisJc3ViX2FwaV9pbml0aWFsaXplZCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ2MSw4ICsyNzksOCBAQAogCXN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzOwogCiAJc2Vfc2VzcyA9IGttZW1fY2FjaGVfemFsbG9jKHNlX3Nlc3NfY2FjaGUsIEdGUF9LRVJORUwpOwotCWlmICghKHNlX3Nlc3MpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBzZV9zZXNzaW9uIGZyb20iCisJaWYgKCFzZV9zZXNzKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBzZV9zZXNzaW9uIGZyb20iCiAJCQkJIiBzZV9zZXNzX2NhY2hlXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQpAQCAtNDk3LDkgKzMxNSw5IEBACiAJCSAqIElmIHRoZSBmYWJyaWMgbW9kdWxlIHN1cHBvcnRzIGFuIElTSUQgYmFzZWQgVHJhbnNwb3J0SUQsCiAJCSAqIHNhdmUgdGhpcyB2YWx1ZSBpbiBiaW5hcnkgZnJvbSB0aGUgZmFicmljIElfVCBOZXh1cyBub3cuCiAJCSAqLwotCQlpZiAoVFBHX1RGTyhzZV90cGcpLT5zZXNzX2dldF9pbml0aWF0b3Jfc2lkICE9IE5VTEwpIHsKKwkJaWYgKHNlX3RwZy0+c2VfdHBnX3Rmby0+c2Vzc19nZXRfaW5pdGlhdG9yX3NpZCAhPSBOVUxMKSB7CiAJCQltZW1zZXQoJmJ1ZlswXSwgMCwgUFJfUkVHX0lTSURfTEVOKTsKLQkJCVRQR19URk8oc2VfdHBnKS0+c2Vzc19nZXRfaW5pdGlhdG9yX3NpZChzZV9zZXNzLAorCQkJc2VfdHBnLT5zZV90cGdfdGZvLT5zZXNzX2dldF9pbml0aWF0b3Jfc2lkKHNlX3Nlc3MsCiAJCQkJCSZidWZbMF0sIFBSX1JFR19JU0lEX0xFTik7CiAJCQlzZV9zZXNzLT5zZXNzX2Jpbl9pc2lkID0gZ2V0X3VuYWxpZ25lZF9iZTY0KCZidWZbMF0pOwogCQl9CkBAIC01MTYsOCArMzM0LDggQEAKIAl9CiAJbGlzdF9hZGRfdGFpbCgmc2Vfc2Vzcy0+c2Vzc19saXN0LCAmc2VfdHBnLT50cGdfc2Vzc19saXN0KTsKIAotCXByaW50ayhLRVJOX0lORk8gIlRBUkdFVF9DT1JFWyVzXTogUmVnaXN0ZXJlZCBmYWJyaWNfc2Vzc19wdHI6ICVwXG4iLAotCQlUUEdfVEZPKHNlX3RwZyktPmdldF9mYWJyaWNfbmFtZSgpLCBzZV9zZXNzLT5mYWJyaWNfc2Vzc19wdHIpOworCXByX2RlYnVnKCJUQVJHRVRfQ09SRVslc106IFJlZ2lzdGVyZWQgZmFicmljX3Nlc3NfcHRyOiAlcFxuIiwKKwkJc2VfdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgc2Vfc2Vzcy0+ZmFicmljX3Nlc3NfcHRyKTsKIH0KIEVYUE9SVF9TWU1CT0woX190cmFuc3BvcnRfcmVnaXN0ZXJfc2Vzc2lvbik7CiAKQEAgLTUzNiwxMyArMzU0LDEzIEBACiB2b2lkIHRyYW5zcG9ydF9kZXJlZ2lzdGVyX3Nlc3Npb25fY29uZmlnZnMoc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MpCiB7CiAJc3RydWN0IHNlX25vZGVfYWNsICpzZV9uYWNsOwotCisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkvKgogCSAqIFVzZWQgYnkgc3RydWN0IHNlX25vZGVfYWNsJ3MgdW5kZXIgQ29uZmlnRlMgdG8gbG9jYXRlIGFjdGl2ZSBzdHJ1Y3Qgc2Vfc2Vzc2lvbgogCSAqLwogCXNlX25hY2wgPSBzZV9zZXNzLT5zZV9ub2RlX2FjbDsKLQlpZiAoKHNlX25hY2wpKSB7Ci0JCXNwaW5fbG9ja19pcnEoJnNlX25hY2wtPm5hY2xfc2Vzc19sb2NrKTsKKwlpZiAoc2VfbmFjbCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VfbmFjbC0+bmFjbF9zZXNzX2xvY2ssIGZsYWdzKTsKIAkJbGlzdF9kZWwoJnNlX3Nlc3MtPnNlc3NfYWNsX2xpc3QpOwogCQkvKgogCQkgKiBJZiB0aGUgc2Vzc2lvbiBsaXN0IGlzIGVtcHR5LCB0aGVuIGNsZWFyIHRoZSBwb2ludGVyLgpAQCAtNTU2LDcgKzM3NCw3IEBACiAJCQkJCXNlX25hY2wtPmFjbF9zZXNzX2xpc3QucHJldiwKIAkJCQkJc3RydWN0IHNlX3Nlc3Npb24sIHNlc3NfYWNsX2xpc3QpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycSgmc2VfbmFjbC0+bmFjbF9zZXNzX2xvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZV9uYWNsLT5uYWNsX3Nlc3NfbG9jaywgZmxhZ3MpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2RlcmVnaXN0ZXJfc2Vzc2lvbl9jb25maWdmcyk7CkBAIC01NzIsNyArMzkwLDcgQEAKIAlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICpzZV90cGcgPSBzZV9zZXNzLT5zZV90cGc7CiAJc3RydWN0IHNlX25vZGVfYWNsICpzZV9uYWNsOwogCi0JaWYgKCEoc2VfdHBnKSkgeworCWlmICghc2VfdHBnKSB7CiAJCXRyYW5zcG9ydF9mcmVlX3Nlc3Npb24oc2Vfc2Vzcyk7CiAJCXJldHVybjsKIAl9CkBAIC01ODgsMTggKzQwNiwxOCBAQAogCSAqIHN0cnVjdCBzZV9ub2RlX2FjbCBpZiBpdCBoYWQgYmVlbiBwcmV2aW91c2x5IGR5bmFtaWNhbGx5IGdlbmVyYXRlZC4KIAkgKi8KIAlzZV9uYWNsID0gc2Vfc2Vzcy0+c2Vfbm9kZV9hY2w7Ci0JaWYgKChzZV9uYWNsKSkgeworCWlmIChzZV9uYWNsKSB7CiAJCXNwaW5fbG9ja19iaCgmc2VfdHBnLT5hY2xfbm9kZV9sb2NrKTsKIAkJaWYgKHNlX25hY2wtPmR5bmFtaWNfbm9kZV9hY2wpIHsKLQkJCWlmICghKFRQR19URk8oc2VfdHBnKS0+dHBnX2NoZWNrX2RlbW9fbW9kZV9jYWNoZSgKLQkJCQkJc2VfdHBnKSkpIHsKKwkJCWlmICghc2VfdHBnLT5zZV90cGdfdGZvLT50cGdfY2hlY2tfZGVtb19tb2RlX2NhY2hlKAorCQkJCQlzZV90cGcpKSB7CiAJCQkJbGlzdF9kZWwoJnNlX25hY2wtPmFjbF9saXN0KTsKIAkJCQlzZV90cGctPm51bV9ub2RlX2FjbHMtLTsKIAkJCQlzcGluX3VubG9ja19iaCgmc2VfdHBnLT5hY2xfbm9kZV9sb2NrKTsKIAogCQkJCWNvcmVfdHBnX3dhaXRfZm9yX25hY2xfcHJfcmVmKHNlX25hY2wpOwogCQkJCWNvcmVfZnJlZV9kZXZpY2VfbGlzdF9mb3Jfbm9kZShzZV9uYWNsLCBzZV90cGcpOwotCQkJCVRQR19URk8oc2VfdHBnKS0+dHBnX3JlbGVhc2VfZmFicmljX2FjbChzZV90cGcsCisJCQkJc2VfdHBnLT5zZV90cGdfdGZvLT50cGdfcmVsZWFzZV9mYWJyaWNfYWNsKHNlX3RwZywKIAkJCQkJCXNlX25hY2wpOwogCQkJCXNwaW5fbG9ja19iaCgmc2VfdHBnLT5hY2xfbm9kZV9sb2NrKTsKIAkJCX0KQEAgLTYwOSwxMyArNDI3LDEzIEBACiAKIAl0cmFuc3BvcnRfZnJlZV9zZXNzaW9uKHNlX3Nlc3MpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVEFSR0VUX0NPUkVbJXNdOiBEZXJlZ2lzdGVyZWQgZmFicmljX3Nlc3NcbiIsCi0JCVRQR19URk8oc2VfdHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCkpOworCXByX2RlYnVnKCJUQVJHRVRfQ09SRVslc106IERlcmVnaXN0ZXJlZCBmYWJyaWNfc2Vzc1xuIiwKKwkJc2VfdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSk7CiB9CiBFWFBPUlRfU1lNQk9MKHRyYW5zcG9ydF9kZXJlZ2lzdGVyX3Nlc3Npb24pOwogCiAvKgotICogQ2FsbGVkIHdpdGggVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jayBoZWxkLgorICogQ2FsbGVkIHdpdGggY21kLT50X3N0YXRlX2xvY2sgaGVsZC4KICAqLwogc3RhdGljIHZvaWQgdHJhbnNwb3J0X2FsbF90YXNrX2Rldl9yZW1vdmVfc3RhdGUoc3RydWN0IHNlX2NtZCAqY21kKQogewpAQCAtNjIzLDI4ICs0NDEsMjUgQEAKIAlzdHJ1Y3Qgc2VfdGFzayAqdGFzazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFUX1RBU0soY21kKSkKLQkJcmV0dXJuOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXNrLCAmVF9UQVNLKGNtZCktPnRfdGFza19saXN0LCB0X2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhc2ssICZjbWQtPnRfdGFza19saXN0LCB0X2xpc3QpIHsKIAkJZGV2ID0gdGFzay0+c2VfZGV2OwotCQlpZiAoIShkZXYpKQorCQlpZiAoIWRldikKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChhdG9taWNfcmVhZCgmdGFzay0+dGFza19hY3RpdmUpKQogCQkJY29udGludWU7CiAKLQkJaWYgKCEoYXRvbWljX3JlYWQoJnRhc2stPnRhc2tfc3RhdGVfYWN0aXZlKSkpCisJCWlmICghYXRvbWljX3JlYWQoJnRhc2stPnRhc2tfc3RhdGVfYWN0aXZlKSkKIAkJCWNvbnRpbnVlOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrLCBmbGFncyk7CiAJCWxpc3RfZGVsKCZ0YXNrLT50X3N0YXRlX2xpc3QpOwotCQlERUJVR19UU1RBVEUoIlJlbW92ZWQgSVRUOiAweCUwOHggZGV2OiAlcCB0YXNrWyVwXVxuIiwKLQkJCUNNRF9URk8oY21kKS0+dGZvX2dldF90YXNrX3RhZyhjbWQpLCBkZXYsIHRhc2spOworCQlwcl9kZWJ1ZygiUmVtb3ZlZCBJVFQ6IDB4JTA4eCBkZXY6ICVwIHRhc2tbJXBdXG4iLAorCQkJY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpLCBkZXYsIHRhc2spOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrLCBmbGFncyk7CiAKIAkJYXRvbWljX3NldCgmdGFzay0+dGFza19zdGF0ZV9hY3RpdmUsIDApOwotCQlhdG9taWNfZGVjKCZUX1RBU0soY21kKS0+dF90YXNrX2NkYnNfZXhfbGVmdCk7CisJCWF0b21pY19kZWMoJmNtZC0+dF90YXNrX2NkYnNfZXhfbGVmdCk7CiAJfQogfQogCkBAIC02NjMsMzQgKzQ3OCwzNCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCS8qCiAJICogRGV0ZXJtaW5lIGlmIElPQ1RMIGNvbnRleHQgY2FsbGVyIGluIHJlcXVlc3RpbmcgdGhlIHN0b3BwaW5nIG9mIHRoaXMKIAkgKiBjb21tYW5kIGZvciBMVU4gc2h1dGRvd24gcHVycG9zZXMuCiAJICovCi0JaWYgKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dHJhbnNwb3J0X2x1bl9zdG9wKSkgewotCQlERUJVR19DUygiJXM6JWQgYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50cmFuc3BvcnRfbHVuX3N0b3ApIgorCWlmIChhdG9taWNfcmVhZCgmY21kLT50cmFuc3BvcnRfbHVuX3N0b3ApKSB7CisJCXByX2RlYnVnKCIlczolZCBhdG9taWNfcmVhZCgmY21kLT50cmFuc3BvcnRfbHVuX3N0b3ApIgogCQkJIiA9PSBUUlVFIGZvciBJVFQ6IDB4JTA4eFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJQ01EX1RGTyhjbWQpLT5nZXRfdGFza190YWcoY21kKSk7CisJCQljbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCkpOwogCiAJCWNtZC0+ZGVmZXJyZWRfdF9zdGF0ZSA9IGNtZC0+dF9zdGF0ZTsKIAkJY21kLT50X3N0YXRlID0gVFJBTlNQT1JUX0RFRkVSUkVEX0NNRDsKLQkJYXRvbWljX3NldCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X2FjdGl2ZSwgMCk7CisJCWF0b21pY19zZXQoJmNtZC0+dF90cmFuc3BvcnRfYWN0aXZlLCAwKTsKIAkJaWYgKHRyYW5zcG9ydF9vZmYgPT0gMikKIAkJCXRyYW5zcG9ydF9hbGxfdGFza19kZXZfcmVtb3ZlX3N0YXRlKGNtZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAotCQljb21wbGV0ZSgmVF9UQVNLKGNtZCktPnRyYW5zcG9ydF9sdW5fc3RvcF9jb21wKTsKKwkJY29tcGxldGUoJmNtZC0+dHJhbnNwb3J0X2x1bl9zdG9wX2NvbXApOwogCQlyZXR1cm4gMTsKIAl9CiAJLyoKIAkgKiBEZXRlcm1pbmUgaWYgZnJvbnRlbmQgY29udGV4dCBjYWxsZXIgaXMgcmVxdWVzdGluZyB0aGUgc3RvcHBpbmcgb2YKLQkgKiB0aGlzIGNvbW1hbmQgZm9yIGZyb250ZW5kIGV4Y3BlY3Rpb25zLgorCSAqIHRoaXMgY29tbWFuZCBmb3IgZnJvbnRlbmQgZXhjZXB0aW9ucy4KIAkgKi8KLQlpZiAoYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF9zdG9wKSkgewotCQlERUJVR19DUygiJXM6JWQgYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF9zdG9wKSA9PSIKKwlpZiAoYXRvbWljX3JlYWQoJmNtZC0+dF90cmFuc3BvcnRfc3RvcCkpIHsKKwkJcHJfZGVidWcoIiVzOiVkIGF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X3N0b3ApID09IgogCQkJIiBUUlVFIGZvciBJVFQ6IDB4JTA4eFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJQ01EX1RGTyhjbWQpLT5nZXRfdGFza190YWcoY21kKSk7CisJCQljbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCkpOwogCiAJCWNtZC0+ZGVmZXJyZWRfdF9zdGF0ZSA9IGNtZC0+dF9zdGF0ZTsKIAkJY21kLT50X3N0YXRlID0gVFJBTlNQT1JUX0RFRkVSUkVEX0NNRDsKQEAgLTcwMywxMyArNTE4LDEzIEBACiAJCSAqLwogCQlpZiAodHJhbnNwb3J0X29mZiA9PSAyKQogCQkJY21kLT5zZV9sdW4gPSBOVUxMOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKLQkJY29tcGxldGUoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF9zdG9wX2NvbXApOworCQljb21wbGV0ZSgmY21kLT50X3RyYW5zcG9ydF9zdG9wX2NvbXApOwogCQlyZXR1cm4gMTsKIAl9CiAJaWYgKHRyYW5zcG9ydF9vZmYpIHsKLQkJYXRvbWljX3NldCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X2FjdGl2ZSwgMCk7CisJCWF0b21pY19zZXQoJmNtZC0+dF90cmFuc3BvcnRfYWN0aXZlLCAwKTsKIAkJaWYgKHRyYW5zcG9ydF9vZmYgPT0gMikgewogCQkJdHJhbnNwb3J0X2FsbF90YXNrX2Rldl9yZW1vdmVfc3RhdGUoY21kKTsKIAkJCS8qCkBAIC03MjIsMjAgKzUzNywyMCBAQAogCQkJICogdGhlaXIgaW50ZXJuYWxseSBhbGxvY2F0ZWQgSS9PIHJlZmVyZW5jZSBub3cgYW5kCiAJCQkgKiBzdHJ1Y3Qgc2VfY21kIG5vdy4KIAkJCSAqLwotCQkJaWYgKENNRF9URk8oY21kKS0+Y2hlY2tfc3RvcF9mcmVlICE9IE5VTEwpIHsKKwkJCWlmIChjbWQtPnNlX3Rmby0+Y2hlY2tfc3RvcF9mcmVlICE9IE5VTEwpIHsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCQkJCQkmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAotCQkJCUNNRF9URk8oY21kKS0+Y2hlY2tfc3RvcF9mcmVlKGNtZCk7CisJCQkJY21kLT5zZV90Zm8tPmNoZWNrX3N0b3BfZnJlZShjbWQpOwogCQkJCXJldHVybiAxOwogCQkJfQogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAogCQlyZXR1cm4gMDsKIAl9IGVsc2UgaWYgKHRfc3RhdGUpCiAJCWNtZC0+dF9zdGF0ZSA9IHRfc3RhdGU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0NywzMCArNTYyLDMwIEBACiAKIHN0YXRpYyB2b2lkIHRyYW5zcG9ydF9sdW5fcmVtb3ZlX2NtZChzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7Ci0Jc3RydWN0IHNlX2x1biAqbHVuID0gU0VfTFVOKGNtZCk7CisJc3RydWN0IHNlX2x1biAqbHVuID0gY21kLT5zZV9sdW47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghbHVuKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCWlmICghKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dHJhbnNwb3J0X2Rldl9hY3RpdmUpKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKCFhdG9taWNfcmVhZCgmY21kLT50cmFuc3BvcnRfZGV2X2FjdGl2ZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAkJZ290byBjaGVja19sdW47CiAJfQotCWF0b21pY19zZXQoJlRfVEFTSyhjbWQpLT50cmFuc3BvcnRfZGV2X2FjdGl2ZSwgMCk7CisJYXRvbWljX3NldCgmY21kLT50cmFuc3BvcnRfZGV2X2FjdGl2ZSwgMCk7CiAJdHJhbnNwb3J0X2FsbF90YXNrX2Rldl9yZW1vdmVfc3RhdGUoY21kKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAogCiBjaGVja19sdW46CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmx1bi0+bHVuX2NtZF9sb2NrLCBmbGFncyk7Ci0JaWYgKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dHJhbnNwb3J0X2x1bl9hY3RpdmUpKSB7Ci0JCWxpc3RfZGVsKCZjbWQtPnNlX2x1bl9saXN0KTsKLQkJYXRvbWljX3NldCgmVF9UQVNLKGNtZCktPnRyYW5zcG9ydF9sdW5fYWN0aXZlLCAwKTsKKwlpZiAoYXRvbWljX3JlYWQoJmNtZC0+dHJhbnNwb3J0X2x1bl9hY3RpdmUpKSB7CisJCWxpc3RfZGVsKCZjbWQtPnNlX2x1bl9ub2RlKTsKKwkJYXRvbWljX3NldCgmY21kLT50cmFuc3BvcnRfbHVuX2FjdGl2ZSwgMCk7CiAjaWYgMAotCQlwcmludGsoS0VSTl9JTkZPICJSZW1vdmVkIElUVDogMHglMDh4IGZyb20gTFVOIExJU1RbJWRdXG4iCi0JCQlDTURfVEZPKGNtZCktPmdldF90YXNrX3RhZyhjbWQpLCBsdW4tPnVucGFja2VkX2x1bik7CisJCXByX2RlYnVnKCJSZW1vdmVkIElUVDogMHglMDh4IGZyb20gTFVOIExJU1RbJWRdXG4iCisJCQljbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCksIGx1bi0+dW5wYWNrZWRfbHVuKTsKICNlbmRpZgogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsdW4tPmx1bl9jbWRfbG9jaywgZmxhZ3MpOwpAQCAtNzc4LDkyICs1OTMsNTkgQEAKIAogdm9pZCB0cmFuc3BvcnRfY21kX2ZpbmlzaF9hYm9ydChzdHJ1Y3Qgc2VfY21kICpjbWQsIGludCByZW1vdmUpCiB7Ci0JdHJhbnNwb3J0X3JlbW92ZV9jbWRfZnJvbV9xdWV1ZShjbWQsIFNFX0RFVihjbWQpLT5kZXZfcXVldWVfb2JqKTsKKwl0cmFuc3BvcnRfcmVtb3ZlX2NtZF9mcm9tX3F1ZXVlKGNtZCwgJmNtZC0+c2VfZGV2LT5kZXZfcXVldWVfb2JqKTsKIAl0cmFuc3BvcnRfbHVuX3JlbW92ZV9jbWQoY21kKTsKIAogCWlmICh0cmFuc3BvcnRfY21kX2NoZWNrX3N0b3BfdG9fZmFicmljKGNtZCkpCiAJCXJldHVybjsKIAlpZiAocmVtb3ZlKQotCQl0cmFuc3BvcnRfZ2VuZXJpY19yZW1vdmUoY21kLCAwLCAwKTsKKwkJdHJhbnNwb3J0X2dlbmVyaWNfcmVtb3ZlKGNtZCwgMCk7CiB9CiAKIHZvaWQgdHJhbnNwb3J0X2NtZF9maW5pc2hfYWJvcnRfdG1yKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQl0cmFuc3BvcnRfcmVtb3ZlX2NtZF9mcm9tX3F1ZXVlKGNtZCwgU0VfREVWKGNtZCktPmRldl9xdWV1ZV9vYmopOworCXRyYW5zcG9ydF9yZW1vdmVfY21kX2Zyb21fcXVldWUoY21kLCAmY21kLT5zZV9kZXYtPmRldl9xdWV1ZV9vYmopOwogCiAJaWYgKHRyYW5zcG9ydF9jbWRfY2hlY2tfc3RvcF90b19mYWJyaWMoY21kKSkKIAkJcmV0dXJuOwogCi0JdHJhbnNwb3J0X2dlbmVyaWNfcmVtb3ZlKGNtZCwgMCwgMCk7CisJdHJhbnNwb3J0X2dlbmVyaWNfcmVtb3ZlKGNtZCwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgdHJhbnNwb3J0X2FkZF9jbWRfdG9fcXVldWUoCitzdGF0aWMgdm9pZCB0cmFuc3BvcnRfYWRkX2NtZF90b19xdWV1ZSgKIAlzdHJ1Y3Qgc2VfY21kICpjbWQsCiAJaW50IHRfc3RhdGUpCiB7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7Ci0Jc3RydWN0IHNlX3F1ZXVlX29iaiAqcW9iaiA9IGRldi0+ZGV2X3F1ZXVlX29iajsKLQlzdHJ1Y3Qgc2VfcXVldWVfcmVxICpxcjsKKwlzdHJ1Y3Qgc2VfcXVldWVfb2JqICpxb2JqID0gJmRldi0+ZGV2X3F1ZXVlX29iajsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VfcXVldWVfcmVxKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCEocXIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IiCi0JCQkJIiBzdHJ1Y3Qgc2VfcXVldWVfcmVxXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlJTklUX0xJU1RfSEVBRCgmcXItPnFyX2xpc3QpOwotCi0JcXItPmNtZCA9ICh2b2lkICopY21kOwotCXFyLT5zdGF0ZSA9IHRfc3RhdGU7CisJSU5JVF9MSVNUX0hFQUQoJmNtZC0+c2VfcXVldWVfbm9kZSk7CiAKIAlpZiAodF9zdGF0ZSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAkJY21kLT50X3N0YXRlID0gdF9zdGF0ZTsKLQkJYXRvbWljX3NldCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X2FjdGl2ZSwgMSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJYXRvbWljX3NldCgmY21kLT50X3RyYW5zcG9ydF9hY3RpdmUsIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxb2JqLT5jbWRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJnFyLT5xcl9saXN0LCAmcW9iai0+cW9ial9saXN0KTsKLQlhdG9taWNfaW5jKCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfcXVldWVfYWN0aXZlKTsKKwlpZiAoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfRU1VTEFURV9RVUVVRV9GVUxMKSB7CisJCWNtZC0+c2VfY21kX2ZsYWdzICY9IH5TQ0ZfRU1VTEFURV9RVUVVRV9GVUxMOworCQlsaXN0X2FkZCgmY21kLT5zZV9xdWV1ZV9ub2RlLCAmcW9iai0+cW9ial9saXN0KTsKKwl9IGVsc2UKKwkJbGlzdF9hZGRfdGFpbCgmY21kLT5zZV9xdWV1ZV9ub2RlLCAmcW9iai0+cW9ial9saXN0KTsKKwlhdG9taWNfaW5jKCZjbWQtPnRfdHJhbnNwb3J0X3F1ZXVlX2FjdGl2ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcW9iai0+Y21kX3F1ZXVlX2xvY2ssIGZsYWdzKTsKIAogCWF0b21pY19pbmMoJnFvYmotPnF1ZXVlX2NudCk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxb2JqLT50aHJlYWRfd3EpOwotCXJldHVybiAwOwogfQogCi0vKgotICogQ2FsbGVkIHdpdGggc3RydWN0IHNlX3F1ZXVlX29iai0+Y21kX3F1ZXVlX2xvY2sgaGVsZC4KLSAqLwotc3RhdGljIHN0cnVjdCBzZV9xdWV1ZV9yZXEgKgotX190cmFuc3BvcnRfZ2V0X3FyX2Zyb21fcXVldWUoc3RydWN0IHNlX3F1ZXVlX29iaiAqcW9iaikKK3N0YXRpYyBzdHJ1Y3Qgc2VfY21kICoKK3RyYW5zcG9ydF9nZXRfY21kX2Zyb21fcXVldWUoc3RydWN0IHNlX3F1ZXVlX29iaiAqcW9iaikKIHsKIAlzdHJ1Y3Qgc2VfY21kICpjbWQ7Ci0Jc3RydWN0IHNlX3F1ZXVlX3JlcSAqcXIgPSBOVUxMOwotCi0JaWYgKGxpc3RfZW1wdHkoJnFvYmotPnFvYmpfbGlzdCkpCi0JCXJldHVybiBOVUxMOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShxciwgJnFvYmotPnFvYmpfbGlzdCwgcXJfbGlzdCkKLQkJYnJlYWs7Ci0KLQlpZiAocXItPmNtZCkgewotCQljbWQgPSAoc3RydWN0IHNlX2NtZCAqKXFyLT5jbWQ7Ci0JCWF0b21pY19kZWMoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF9xdWV1ZV9hY3RpdmUpOwotCX0KLQlsaXN0X2RlbCgmcXItPnFyX2xpc3QpOwotCWF0b21pY19kZWMoJnFvYmotPnF1ZXVlX2NudCk7Ci0KLQlyZXR1cm4gcXI7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VfcXVldWVfcmVxICoKLXRyYW5zcG9ydF9nZXRfcXJfZnJvbV9xdWV1ZShzdHJ1Y3Qgc2VfcXVldWVfb2JqICpxb2JqKQotewotCXN0cnVjdCBzZV9jbWQgKmNtZDsKLQlzdHJ1Y3Qgc2VfcXVldWVfcmVxICpxcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnFvYmotPmNtZF9xdWV1ZV9sb2NrLCBmbGFncyk7CkBAIC04NzEsNTAgKzY1Myw0MiBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxb2JqLT5jbWRfcXVldWVfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gTlVMTDsKIAl9CisJY21kID0gbGlzdF9maXJzdF9lbnRyeSgmcW9iai0+cW9ial9saXN0LCBzdHJ1Y3Qgc2VfY21kLCBzZV9xdWV1ZV9ub2RlKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocXIsICZxb2JqLT5xb2JqX2xpc3QsIHFyX2xpc3QpCi0JCWJyZWFrOworCWF0b21pY19kZWMoJmNtZC0+dF90cmFuc3BvcnRfcXVldWVfYWN0aXZlKTsKIAotCWlmIChxci0+Y21kKSB7Ci0JCWNtZCA9IChzdHJ1Y3Qgc2VfY21kICopcXItPmNtZDsKLQkJYXRvbWljX2RlYygmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X3F1ZXVlX2FjdGl2ZSk7Ci0JfQotCWxpc3RfZGVsKCZxci0+cXJfbGlzdCk7CisJbGlzdF9kZWwoJmNtZC0+c2VfcXVldWVfbm9kZSk7CiAJYXRvbWljX2RlYygmcW9iai0+cXVldWVfY250KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxb2JqLT5jbWRfcXVldWVfbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIHFyOworCXJldHVybiBjbWQ7CiB9CiAKIHN0YXRpYyB2b2lkIHRyYW5zcG9ydF9yZW1vdmVfY21kX2Zyb21fcXVldWUoc3RydWN0IHNlX2NtZCAqY21kLAogCQlzdHJ1Y3Qgc2VfcXVldWVfb2JqICpxb2JqKQogewotCXN0cnVjdCBzZV9jbWQgKnFfY21kOwotCXN0cnVjdCBzZV9xdWV1ZV9yZXEgKnFyID0gTlVMTCwgKnFyX3AgPSBOVUxMOworCXN0cnVjdCBzZV9jbWQgKnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxb2JqLT5jbWRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWlmICghKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfcXVldWVfYWN0aXZlKSkpIHsKKwlpZiAoIWF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X3F1ZXVlX2FjdGl2ZSkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcW9iai0+Y21kX3F1ZXVlX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShxciwgcXJfcCwgJnFvYmotPnFvYmpfbGlzdCwgcXJfbGlzdCkgewotCQlxX2NtZCA9IChzdHJ1Y3Qgc2VfY21kICopcXItPmNtZDsKLQkJaWYgKHFfY21kICE9IGNtZCkKLQkJCWNvbnRpbnVlOwotCi0JCWF0b21pY19kZWMoJlRfVEFTSyhxX2NtZCktPnRfdHJhbnNwb3J0X3F1ZXVlX2FjdGl2ZSk7Ci0JCWF0b21pY19kZWMoJnFvYmotPnF1ZXVlX2NudCk7Ci0JCWxpc3RfZGVsKCZxci0+cXJfbGlzdCk7Ci0JCWtmcmVlKHFyKTsKLQl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmcW9iai0+cW9ial9saXN0LCBzZV9xdWV1ZV9ub2RlKQorCQlpZiAodCA9PSBjbWQpIHsKKwkJCWF0b21pY19kZWMoJmNtZC0+dF90cmFuc3BvcnRfcXVldWVfYWN0aXZlKTsKKwkJCWF0b21pY19kZWMoJnFvYmotPnF1ZXVlX2NudCk7CisJCQlsaXN0X2RlbCgmY21kLT5zZV9xdWV1ZV9ub2RlKTsKKwkJCWJyZWFrOworCQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcW9iai0+Y21kX3F1ZXVlX2xvY2ssIGZsYWdzKTsKIAotCWlmIChhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X3F1ZXVlX2FjdGl2ZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJVFQ6IDB4JTA4eCB0X3RyYW5zcG9ydF9xdWV1ZV9hY3RpdmU6ICVkXG4iLAotCQkJQ01EX1RGTyhjbWQpLT5nZXRfdGFza190YWcoY21kKSwKLQkJCWF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfcXVldWVfYWN0aXZlKSk7CisJaWYgKGF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X3F1ZXVlX2FjdGl2ZSkpIHsKKwkJcHJfZXJyKCJJVFQ6IDB4JTA4eCB0X3RyYW5zcG9ydF9xdWV1ZV9hY3RpdmU6ICVkXG4iLAorCQkJY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpLAorCQkJYXRvbWljX3JlYWQoJmNtZC0+dF90cmFuc3BvcnRfcXVldWVfYWN0aXZlKSk7CiAJfQogfQogCkBAIC05MjQsNyArNjk4LDcgQEAKICAqLwogdm9pZCB0cmFuc3BvcnRfY29tcGxldGVfc3luY19jYWNoZShzdHJ1Y3Qgc2VfY21kICpjbWQsIGludCBnb29kKQogewotCXN0cnVjdCBzZV90YXNrICp0YXNrID0gbGlzdF9lbnRyeShUX1RBU0soY21kKS0+dF90YXNrX2xpc3QubmV4dCwKKwlzdHJ1Y3Qgc2VfdGFzayAqdGFzayA9IGxpc3RfZW50cnkoY21kLT50X3Rhc2tfbGlzdC5uZXh0LAogCQkJCXN0cnVjdCBzZV90YXNrLCB0X2xpc3QpOwogCiAJaWYgKGdvb2QpIHsKQEAgLTkzMyw3ICs3MDcsNyBAQAogCX0gZWxzZSB7CiAJCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAJCXRhc2stPnRhc2tfZXJyb3Jfc3RhdHVzID0gUFlYX1RSQU5TUE9SVF9JTExFR0FMX1JFUVVFU1Q7Ci0JCVRBU0tfQ01EKHRhc2spLT50cmFuc3BvcnRfZXJyb3Jfc3RhdHVzID0KKwkJdGFzay0+dGFza19zZV9jbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMgPQogCQkJCQlQWVhfVFJBTlNQT1JUX0lMTEVHQUxfUkVRVUVTVDsKIAl9CiAKQEAgLTk0OCwyMiArNzIyLDE4IEBACiAgKi8KIHZvaWQgdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2soc3RydWN0IHNlX3Rhc2sgKnRhc2ssIGludCBzdWNjZXNzKQogewotCXN0cnVjdCBzZV9jbWQgKmNtZCA9IFRBU0tfQ01EKHRhc2spOworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IHRhc2stPnNlX2RldjsKIAlpbnQgdF9zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogI2lmIDAKLQlwcmludGsoS0VSTl9JTkZPICJ0YXNrOiAlcCBDREI6IDB4JTAyeCBvYmpfcHRyOiAlcFxuIiwgdGFzaywKLQkJCVRfVEFTSyhjbWQpLT50X3Rhc2tfY2RiWzBdLCBkZXYpOworCXByX2RlYnVnKCJ0YXNrOiAlcCBDREI6IDB4JTAyeCBvYmpfcHRyOiAlcFxuIiwgdGFzaywKKwkJCWNtZC0+dF90YXNrX2NkYlswXSwgZGV2KTsKICNlbmRpZgotCWlmIChkZXYpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJlNFX0hCQShkZXYpLT5oYmFfcXVldWVfbG9jaywgZmxhZ3MpOworCWlmIChkZXYpCiAJCWF0b21pY19pbmMoJmRldi0+ZGVwdGhfbGVmdCk7Ci0JCWF0b21pY19pbmMoJlNFX0hCQShkZXYpLT5sZWZ0X3F1ZXVlX2RlcHRoKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmU0VfSEJBKGRldiktPmhiYV9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAlhdG9taWNfc2V0KCZ0YXNrLT50YXNrX2FjdGl2ZSwgMCk7CiAKIAkvKgpAQCAtOTg1LDE0ICs3NTUsMTQgQEAKIAkgKi8KIAlpZiAoYXRvbWljX3JlYWQoJnRhc2stPnRhc2tfc3RvcCkpIHsKIAkJLyoKLQkJICogRGVjcmVtZW50IFRfVEFTSyhjbWQpLT50X3NlX2NvdW50IGlmIHRoaXMgdGFzayBoYWQKKwkJICogRGVjcmVtZW50IGNtZC0+dF9zZV9jb3VudCBpZiB0aGlzIHRhc2sgaGFkCiAJCSAqIHByZXZpb3VzbHkgdGhyb3duIGl0cyB0aW1lb3V0IGV4Y2VwdGlvbiBoYW5kbGVyLgogCQkgKi8KIAkJaWYgKGF0b21pY19yZWFkKCZ0YXNrLT50YXNrX3RpbWVvdXQpKSB7Ci0JCQlhdG9taWNfZGVjKCZUX1RBU0soY21kKS0+dF9zZV9jb3VudCk7CisJCQlhdG9taWNfZGVjKCZjbWQtPnRfc2VfY291bnQpOwogCQkJYXRvbWljX3NldCgmdGFzay0+dGFza190aW1lb3V0LCAwKTsKIAkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKIAkJY29tcGxldGUoJnRhc2stPnRhc2tfc3RvcF9jb21wKTsKIAkJcmV0dXJuOwpAQCAtMTAwMywzNCArNzczLDM0IEBACiAJICogdGhlIHByb2Nlc3NpbmcgdGhyZWFkLgogCSAqLwogCWlmIChhdG9taWNfcmVhZCgmdGFzay0+dGFza190aW1lb3V0KSkgewotCQlpZiAoIShhdG9taWNfZGVjX2FuZF90ZXN0KAotCQkJCSZUX1RBU0soY21kKS0+dF90YXNrX2NkYnNfdGltZW91dF9sZWZ0KSkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssCisJCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgKKwkJCQkmY21kLT50X3Rhc2tfY2Ric190aW1lb3V0X2xlZnQpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywKIAkJCQlmbGFncyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJdF9zdGF0ZSA9IFRSQU5TUE9SVF9DT01QTEVURV9USU1FT1VUOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKIAkJdHJhbnNwb3J0X2FkZF9jbWRfdG9fcXVldWUoY21kLCB0X3N0YXRlKTsKIAkJcmV0dXJuOwogCX0KLQlhdG9taWNfZGVjKCZUX1RBU0soY21kKS0+dF90YXNrX2NkYnNfdGltZW91dF9sZWZ0KTsKKwlhdG9taWNfZGVjKCZjbWQtPnRfdGFza19jZGJzX3RpbWVvdXRfbGVmdCk7CiAKIAkvKgogCSAqIERlY3JlbWVudCB0aGUgb3V0c3RhbmRpbmcgdF90YXNrX2NkYnNfbGVmdCBjb3VudC4gIFRoZSBsYXN0CiAJICogc3RydWN0IHNlX3Rhc2sgZnJvbSBzdHJ1Y3Qgc2VfY21kIHdpbGwgY29tcGxldGUgaXRzZWxmIGludG8gdGhlCiAJICogZGV2aWNlIHF1ZXVlIGRlcGVuZGluZyB1cG9uIGludCBzdWNjZXNzLgogCSAqLwotCWlmICghKGF0b21pY19kZWNfYW5kX3Rlc3QoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19sZWZ0KSkpIHsKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmNtZC0+dF90YXNrX2NkYnNfbGVmdCkpIHsKIAkJaWYgKCFzdWNjZXNzKQotCQkJVF9UQVNLKGNtZCktPnRfdGFza3NfZmFpbGVkID0gMTsKKwkJCWNtZC0+dF90YXNrc19mYWlsZWQgPSAxOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICghc3VjY2VzcyB8fCBUX1RBU0soY21kKS0+dF90YXNrc19mYWlsZWQpIHsKKwlpZiAoIXN1Y2Nlc3MgfHwgY21kLT50X3Rhc2tzX2ZhaWxlZCkgewogCQl0X3N0YXRlID0gVFJBTlNQT1JUX0NPTVBMRVRFX0ZBSUxVUkU7CiAJCWlmICghdGFzay0+dGFza19lcnJvcl9zdGF0dXMpIHsKIAkJCXRhc2stPnRhc2tfZXJyb3Jfc3RhdHVzID0KQEAgLTEwMzksMTAgKzgwOSwxMCBAQAogCQkJCVBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOwogCQl9CiAJfSBlbHNlIHsKLQkJYXRvbWljX3NldCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X2NvbXBsZXRlLCAxKTsKKwkJYXRvbWljX3NldCgmY21kLT50X3RyYW5zcG9ydF9jb21wbGV0ZSwgMSk7CiAJCXRfc3RhdGUgPSBUUkFOU1BPUlRfQ09NUExFVEVfT0s7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCiAJdHJhbnNwb3J0X2FkZF9jbWRfdG9fcXVldWUoY21kLCB0X3N0YXRlKTsKIH0KQEAgLTEwODAsOSArODUwLDkgQEAKIAkJCQkmdGFza19wcmV2LT50X2V4ZWN1dGVfbGlzdCA6CiAJCQkJJmRldi0+ZXhlY3V0ZV90YXNrX2xpc3QpOwogCi0JCURFQlVHX1NUQSgiU2V0IEhFQURfT0ZfUVVFVUUgZm9yIHRhc2sgQ0RCOiAweCUwMngiCisJCXByX2RlYnVnKCJTZXQgSEVBRF9PRl9RVUVVRSBmb3IgdGFzayBDREI6IDB4JTAyeCIKIAkJCQkiIGluIGV4ZWN1dGlvbiBxdWV1ZVxuIiwKLQkJCQlUX1RBU0sodGFzay0+dGFza19zZV9jbWQpLT50X3Rhc2tfY2RiWzBdKTsKKwkJCQl0YXNrLT50YXNrX3NlX2NtZC0+dF90YXNrX2NkYlswXSk7CiAJCXJldHVybiAxOwogCX0KIAkvKgpAQCAtMTEyNCw4ICs4OTQsOCBAQAogCiAJYXRvbWljX3NldCgmdGFzay0+dGFza19zdGF0ZV9hY3RpdmUsIDEpOwogCi0JREVCVUdfVFNUQVRFKCJBZGRlZCBJVFQ6IDB4JTA4eCB0YXNrWyVwXSB0byBkZXY6ICVwXG4iLAotCQlDTURfVEZPKHRhc2stPnRhc2tfc2VfY21kKS0+Z2V0X3Rhc2tfdGFnKHRhc2stPnRhc2tfc2VfY21kKSwKKwlwcl9kZWJ1ZygiQWRkZWQgSVRUOiAweCUwOHggdGFza1slcF0gdG8gZGV2OiAlcFxuIiwKKwkJdGFzay0+dGFza19zZV9jbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKHRhc2stPnRhc2tfc2VfY21kKSwKIAkJdGFzaywgZGV2KTsKIH0KIApAQCAtMTEzNSw4ICs5MDUsOCBAQAogCXN0cnVjdCBzZV90YXNrICp0YXNrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodGFzaywgJlRfVEFTSyhjbWQpLT50X3Rhc2tfbGlzdCwgdF9saXN0KSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXNrLCAmY21kLT50X3Rhc2tfbGlzdCwgdF9saXN0KSB7CiAJCWRldiA9IHRhc2stPnNlX2RldjsKIAogCQlpZiAoYXRvbWljX3JlYWQoJnRhc2stPnRhc2tfc3RhdGVfYWN0aXZlKSkKQEAgLTExNDYsMjMgKzkxNiwyMyBAQAogCQlsaXN0X2FkZF90YWlsKCZ0YXNrLT50X3N0YXRlX2xpc3QsICZkZXYtPnN0YXRlX3Rhc2tfbGlzdCk7CiAJCWF0b21pY19zZXQoJnRhc2stPnRhc2tfc3RhdGVfYWN0aXZlLCAxKTsKIAotCQlERUJVR19UU1RBVEUoIkFkZGVkIElUVDogMHglMDh4IHRhc2tbJXBdIHRvIGRldjogJXBcbiIsCi0JCQlDTURfVEZPKHRhc2stPnRhc2tfc2VfY21kKS0+Z2V0X3Rhc2tfdGFnKAorCQlwcl9kZWJ1ZygiQWRkZWQgSVRUOiAweCUwOHggdGFza1slcF0gdG8gZGV2OiAlcFxuIiwKKwkJCXRhc2stPnRhc2tfc2VfY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZygKIAkJCXRhc2stPnRhc2tfc2VfY21kKSwgdGFzaywgZGV2KTsKIAogCQlzcGluX3VubG9jaygmZGV2LT5leGVjdXRlX3Rhc2tfbG9jayk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCB0cmFuc3BvcnRfYWRkX3Rhc2tzX2Zyb21fY21kKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBTRV9ERVYoY21kKTsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAlzdHJ1Y3Qgc2VfdGFzayAqdGFzaywgKnRhc2tfcHJldiA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXNrLCAmVF9UQVNLKGNtZCktPnRfdGFza19saXN0LCB0X2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhc2ssICZjbWQtPnRfdGFza19saXN0LCB0X2xpc3QpIHsKIAkJaWYgKGF0b21pY19yZWFkKCZ0YXNrLT50YXNrX2V4ZWN1dGVfcXVldWUpKQogCQkJY29udGludWU7CiAJCS8qCkBAIC0xMTc0LDMwICs5NDQsNiBAQAogCQl0YXNrX3ByZXYgPSB0YXNrOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCXRyYW5zcG9ydF9nZXRfdGFza19mcm9tX2V4ZWN1dGVfcXVldWUoKToKLSAqCi0gKglDYWxsZWQgd2l0aCBkZXYtPmV4ZWN1dGVfdGFza19sb2NrIGhlbGQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2VfdGFzayAqCi10cmFuc3BvcnRfZ2V0X3Rhc2tfZnJvbV9leGVjdXRlX3F1ZXVlKHN0cnVjdCBzZV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc2VfdGFzayAqdGFzazsKLQotCWlmIChsaXN0X2VtcHR5KCZkZXYtPmV4ZWN1dGVfdGFza19saXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhc2ssICZkZXYtPmV4ZWN1dGVfdGFza19saXN0LCB0X2V4ZWN1dGVfbGlzdCkKLQkJYnJlYWs7Ci0KLQlsaXN0X2RlbCgmdGFzay0+dF9leGVjdXRlX2xpc3QpOwotCWF0b21pY19zZXQoJnRhc2stPnRhc2tfZXhlY3V0ZV9xdWV1ZSwgMCk7Ci0JYXRvbWljX2RlYygmZGV2LT5leGVjdXRlX3Rhc2tzKTsKLQotCXJldHVybiB0YXNrOwogfQogCiAvKgl0cmFuc3BvcnRfcmVtb3ZlX3Rhc2tfZnJvbV9leGVjdXRlX3F1ZXVlKCk6CkBAIC0xMjIyLDYgKzk2OCw0MCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXhlY3V0ZV90YXNrX2xvY2ssIGZsYWdzKTsKIH0KIAorLyoKKyAqIEhhbmRsZSBRVUVVRV9GVUxMIC8gLUVBR0FJTiBzdGF0dXMKKyAqLworCitzdGF0aWMgdm9pZCB0YXJnZXRfcWZfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzZV9kZXZpY2UsCisJCQkJCXFmX3dvcmtfcXVldWUpOworCXN0cnVjdCBzZV9jbWQgKmNtZCwgKmNtZF90bXA7CisKKwlzcGluX2xvY2tfaXJxKCZkZXYtPnFmX2NtZF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY21kLCBjbWRfdG1wLCAmZGV2LT5xZl9jbWRfbGlzdCwgc2VfcWZfbm9kZSkgeworCisJCWxpc3RfZGVsKCZjbWQtPnNlX3FmX25vZGUpOworCQlhdG9taWNfZGVjKCZkZXYtPmRldl9xZl9jb3VudCk7CisJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpOworCQlzcGluX3VubG9ja19pcnEoJmRldi0+cWZfY21kX2xvY2spOworCisJCXByX2RlYnVnKCJQcm9jZXNzaW5nICVzIGNtZDogJXAgUVVFVUVfRlVMTCBpbiB3b3JrIHF1ZXVlIgorCQkJIiBjb250ZXh0OiAlc1xuIiwgY21kLT5zZV90Zm8tPmdldF9mYWJyaWNfbmFtZSgpLCBjbWQsCisJCQkoY21kLT50X3N0YXRlID09IFRSQU5TUE9SVF9DT01QTEVURV9PSykgPyAiQ09NUExFVEVfT0siIDoKKwkJCShjbWQtPnRfc3RhdGUgPT0gVFJBTlNQT1JUX0NPTVBMRVRFX1FGX1dQKSA/ICJXUklURV9QRU5ESU5HIgorCQkJOiAiVU5LTk9XTiIpOworCQkvKgorCQkgKiBUaGUgU0NGX0VNVUxBVEVfUVVFVUVfRlVMTCBmbGFnIHdpbGwgYmUgY2xlYXJlZCBvbmNlIHNlX2NtZAorCQkgKiBoYXMgYmVlbiBhZGRlZCB0byBoZWFkIG9mIHF1ZXVlCisJCSAqLworCQl0cmFuc3BvcnRfYWRkX2NtZF90b19xdWV1ZShjbWQsIGNtZC0+dF9zdGF0ZSk7CisKKwkJc3Bpbl9sb2NrX2lycSgmZGV2LT5xZl9jbWRfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5xZl9jbWRfbG9jayk7Cit9CisKIHVuc2lnbmVkIGNoYXIgKnRyYW5zcG9ydF9kdW1wX2NtZF9kaXJlY3Rpb24oc3RydWN0IHNlX2NtZCAqY21kKQogewogCXN3aXRjaCAoY21kLT5kYXRhX2RpcmVjdGlvbikgewpAQCAtMTI2OSw3ICsxMDQ5LDcgQEAKIAkJYXRvbWljX3JlYWQoJmRldi0+ZXhlY3V0ZV90YXNrcyksIGF0b21pY19yZWFkKCZkZXYtPmRlcHRoX2xlZnQpLAogCQlkZXYtPnF1ZXVlX2RlcHRoKTsKIAkqYmwgKz0gc3ByaW50ZihiICsgKmJsLCAiICBTZWN0b3JTaXplOiAldSAgTWF4U2VjdG9yczogJXVcbiIsCi0JCURFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSwgREVWX0FUVFJJQihkZXYpLT5tYXhfc2VjdG9ycyk7CisJCWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5ibG9ja19zaXplLCBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIubWF4X3NlY3RvcnMpOwogCSpibCArPSBzcHJpbnRmKGIgKyAqYmwsICIgICAgICAgICIpOwogfQogCkBAIC0xMjc5LDMzICsxMDU5LDI5IEBACiAgKi8KIHN0YXRpYyB2b2lkIHRyYW5zcG9ydF9yZWxlYXNlX2FsbF9jbWRzKHN0cnVjdCBzZV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc2VfY21kICpjbWQgPSBOVUxMOwotCXN0cnVjdCBzZV9xdWV1ZV9yZXEgKnFyID0gTlVMTCwgKnFyX3AgPSBOVUxMOworCXN0cnVjdCBzZV9jbWQgKmNtZCwgKnRjbWQ7CiAJaW50IGJ1Z19vdXQgPSAwLCB0X3N0YXRlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5kZXZfcXVldWVfb2JqLT5jbWRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShxciwgcXJfcCwgJmRldi0+ZGV2X3F1ZXVlX29iai0+cW9ial9saXN0LAotCQkJCXFyX2xpc3QpIHsKLQotCQljbWQgPSAoc3RydWN0IHNlX2NtZCAqKXFyLT5jbWQ7Ci0JCXRfc3RhdGUgPSBxci0+c3RhdGU7Ci0JCWxpc3RfZGVsKCZxci0+cXJfbGlzdCk7Ci0JCWtmcmVlKHFyKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kZXZfcXVldWVfb2JqLT5jbWRfcXVldWVfbG9jaywKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5kZXZfcXVldWVfb2JqLmNtZF9xdWV1ZV9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNtZCwgdGNtZCwgJmRldi0+ZGV2X3F1ZXVlX29iai5xb2JqX2xpc3QsCisJCQkJc2VfcXVldWVfbm9kZSkgeworCQl0X3N0YXRlID0gY21kLT50X3N0YXRlOworCQlsaXN0X2RlbCgmY21kLT5zZV9xdWV1ZV9ub2RlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kZXZfcXVldWVfb2JqLmNtZF9xdWV1ZV9sb2NrLAogCQkJCWZsYWdzKTsKIAotCQlwcmludGsoS0VSTl9FUlIgIlJlbGVhc2luZyBJVFQ6IDB4JTA4eCwgaV9zdGF0ZTogJXUsIgorCQlwcl9lcnIoIlJlbGVhc2luZyBJVFQ6IDB4JTA4eCwgaV9zdGF0ZTogJXUsIgogCQkJIiB0X3N0YXRlOiAldSBkaXJlY3RseVxuIiwKLQkJCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCksCi0JCQlDTURfVEZPKGNtZCktPmdldF9jbWRfc3RhdGUoY21kKSwgdF9zdGF0ZSk7CisJCQljbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCksCisJCQljbWQtPnNlX3Rmby0+Z2V0X2NtZF9zdGF0ZShjbWQpLCB0X3N0YXRlKTsKIAogCQl0cmFuc3BvcnRfcmVsZWFzZV9mZV9jbWQoY21kKTsKIAkJYnVnX291dCA9IDE7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZGV2X3F1ZXVlX29iai0+Y21kX3F1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZGV2X3F1ZXVlX29iai5jbWRfcXVldWVfbG9jaywgZmxhZ3MpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmRldl9xdWV1ZV9vYmotPmNtZF9xdWV1ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kZXZfcXVldWVfb2JqLmNtZF9xdWV1ZV9sb2NrLCBmbGFncyk7CiAjaWYgMAogCWlmIChidWdfb3V0KQogCQlCVUcoKTsKQEAgLTEzNjIsNyArMTEzOCw3IEBACiAJaWYgKHBfYnVmKQogCQlzdHJuY3B5KHBfYnVmLCBidWYsIHBfYnVmX2xlbik7CiAJZWxzZQotCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIGJ1Zik7CisJCXByX2RlYnVnKCIlcyIsIGJ1Zik7CiB9CiAKIHZvaWQKQEAgLTEzODcsNyArMTE2Myw4IEBACiAJaW50IHBfYnVmX2xlbikKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZltWUERfVE1QX0JVRl9TSVpFXTsKLQlpbnQgcmV0ID0gMCwgbGVuOworCWludCByZXQgPSAwOworCWludCBsZW47CiAKIAltZW1zZXQoYnVmLCAwLCBWUERfVE1QX0JVRl9TSVpFKTsKIAlsZW4gPSBzcHJpbnRmKGJ1ZiwgIlQxMCBWUEQgSWRlbnRpZmllciBBc3NvY2lhdGlvbjogIik7CkBAIC0xNDA0LDE0ICsxMTgxLDE0IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXNwcmludGYoYnVmK2xlbiwgIlVua25vd24gMHglMDJ4XG4iLCB2cGQtPmFzc29jaWF0aW9uKTsKLQkJcmV0ID0gLTE7CisJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KIAogCWlmIChwX2J1ZikKIAkJc3RybmNweShwX2J1ZiwgYnVmLCBwX2J1Zl9sZW4pOwogCWVsc2UKLQkJcHJpbnRrKCIlcyIsIGJ1Zik7CisJCXByX2RlYnVnKCIlcyIsIGJ1Zik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTQzNCw3ICsxMjExLDggQEAKIAlpbnQgcF9idWZfbGVuKQogewogCXVuc2lnbmVkIGNoYXIgYnVmW1ZQRF9UTVBfQlVGX1NJWkVdOwotCWludCByZXQgPSAwLCBsZW47CisJaW50IHJldCA9IDA7CisJaW50IGxlbjsKIAogCW1lbXNldChidWYsIDAsIFZQRF9UTVBfQlVGX1NJWkUpOwogCWxlbiA9IHNwcmludGYoYnVmLCAiVDEwIFZQRCBJZGVudGlmaWVyIFR5cGU6ICIpOwpAQCAtMTQ2MSwxNCArMTIzOSwxNyBAQAogCWRlZmF1bHQ6CiAJCXNwcmludGYoYnVmK2xlbiwgIlVuc3VwcG9ydGVkOiAweCUwMnhcbiIsCiAJCQkJdnBkLT5kZXZpY2VfaWRlbnRpZmllcl90eXBlKTsKLQkJcmV0ID0gLTE7CisJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KIAotCWlmIChwX2J1ZikKKwlpZiAocF9idWYpIHsKKwkJaWYgKHBfYnVmX2xlbiA8IHN0cmxlbihidWYpKzEpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJc3RybmNweShwX2J1ZiwgYnVmLCBwX2J1Zl9sZW4pOwotCWVsc2UKLQkJcHJpbnRrKCIlcyIsIGJ1Zik7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzIiwgYnVmKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTUxMSwxNCArMTI5MiwxNCBAQAogCWRlZmF1bHQ6CiAJCXNwcmludGYoYnVmLCAiVDEwIFZQRCBEZXZpY2UgSWRlbnRpZmllciBlbmNvZGluZyB1bnN1cHBvcnRlZDoiCiAJCQkiIDB4JTAyeCIsIHZwZC0+ZGV2aWNlX2lkZW50aWZpZXJfY29kZV9zZXQpOwotCQlyZXQgPSAtMTsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQogCiAJaWYgKHBfYnVmKQogCQlzdHJuY3B5KHBfYnVmLCBidWYsIHBfYnVmX2xlbik7CiAJZWxzZQotCQlwcmludGsoIiVzIiwgYnVmKTsKKwkJcHJfZGVidWcoIiVzIiwgYnVmKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNTY5LDUxICsxMzUwLDUxIEBACiAJICogVGhpcyBpcyBjdXJyZW50bHkgbm90IGF2YWlsYWJsZSBpbiB1cHNyZWFtIExpbnV4L1NDU0kgVGFyZ2V0CiAJICogbW9kZSBjb2RlLCBhbmQgaXMgYXNzdW1lZCB0byBiZSBkaXNhYmxlZCB3aGlsZSB1c2luZyBUQ00vcFNDU0kuCiAJICovCi0JaWYgKFRSQU5TUE9SVChkZXYpLT50cmFuc3BvcnRfdHlwZSA9PSBUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVikgeworCWlmIChkZXYtPnRyYW5zcG9ydC0+dHJhbnNwb3J0X3R5cGUgPT0gVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpIHsKIAkJZGV2LT5kZXZfdGFza19hdHRyX3R5cGUgPSBTQU1fVEFTS19BVFRSX1BBU1NUSFJPVUdIOwogCQlyZXR1cm47CiAJfQogCiAJZGV2LT5kZXZfdGFza19hdHRyX3R5cGUgPSBTQU1fVEFTS19BVFRSX0VNVUxBVEVEOwotCURFQlVHX1NUQSgiJXM6IFVzaW5nIFNBTV9UQVNLX0FUVFJfRU1VTEFURUQgZm9yIFNQQzogMHglMDJ4IgotCQkiIGRldmljZVxuIiwgVFJBTlNQT1JUKGRldiktPm5hbWUsCi0JCVRSQU5TUE9SVChkZXYpLT5nZXRfZGV2aWNlX3JldihkZXYpKTsKKwlwcl9kZWJ1ZygiJXM6IFVzaW5nIFNBTV9UQVNLX0FUVFJfRU1VTEFURUQgZm9yIFNQQzogMHglMDJ4IgorCQkiIGRldmljZVxuIiwgZGV2LT50cmFuc3BvcnQtPm5hbWUsCisJCWRldi0+dHJhbnNwb3J0LT5nZXRfZGV2aWNlX3JldihkZXYpKTsKIH0KIAogc3RhdGljIHZvaWQgc2NzaV9kdW1wX2lucXVpcnkoc3RydWN0IHNlX2RldmljZSAqZGV2KQogewotCXN0cnVjdCB0MTBfd3duICp3d24gPSBERVZfVDEwX1dXTihkZXYpOworCXN0cnVjdCB0MTBfd3duICp3d24gPSAmZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duOwogCWludCBpLCBkZXZpY2VfdHlwZTsKIAkvKgogCSAqIFByaW50IExpbnV4L1NDU0kgc3R5bGUgSU5RVUlSWSBmb3JtYXR0aW5nIHRvIHRoZSBrZXJuZWwgcmluZyBidWZmZXIKIAkgKi8KLQlwcmludGsoIiAgVmVuZG9yOiAiKTsKKwlwcl9kZWJ1ZygiICBWZW5kb3I6ICIpOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAJCWlmICh3d24tPnZlbmRvcltpXSA+PSAweDIwKQotCQkJcHJpbnRrKCIlYyIsIHd3bi0+dmVuZG9yW2ldKTsKKwkJCXByX2RlYnVnKCIlYyIsIHd3bi0+dmVuZG9yW2ldKTsKIAkJZWxzZQotCQkJcHJpbnRrKCIgIik7CisJCQlwcl9kZWJ1ZygiICIpOwogCi0JcHJpbnRrKCIgIE1vZGVsOiAiKTsKKwlwcl9kZWJ1ZygiICBNb2RlbDogIik7CiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCWlmICh3d24tPm1vZGVsW2ldID49IDB4MjApCi0JCQlwcmludGsoIiVjIiwgd3duLT5tb2RlbFtpXSk7CisJCQlwcl9kZWJ1ZygiJWMiLCB3d24tPm1vZGVsW2ldKTsKIAkJZWxzZQotCQkJcHJpbnRrKCIgIik7CisJCQlwcl9kZWJ1ZygiICIpOwogCi0JcHJpbnRrKCIgIFJldmlzaW9uOiAiKTsKKwlwcl9kZWJ1ZygiICBSZXZpc2lvbjogIik7CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJaWYgKHd3bi0+cmV2aXNpb25baV0gPj0gMHgyMCkKLQkJCXByaW50aygiJWMiLCB3d24tPnJldmlzaW9uW2ldKTsKKwkJCXByX2RlYnVnKCIlYyIsIHd3bi0+cmV2aXNpb25baV0pOwogCQllbHNlCi0JCQlwcmludGsoIiAiKTsKKwkJCXByX2RlYnVnKCIgIik7CiAKLQlwcmludGsoIlxuIik7CisJcHJfZGVidWcoIlxuIik7CiAKLQlkZXZpY2VfdHlwZSA9IFRSQU5TUE9SVChkZXYpLT5nZXRfZGV2aWNlX3R5cGUoZGV2KTsKLQlwcmludGsoIiAgVHlwZTogICAlcyAiLCBzY3NpX2RldmljZV90eXBlKGRldmljZV90eXBlKSk7Ci0JcHJpbnRrKCIgICAgICAgICAgICAgICAgIEFOU0kgU0NTSSByZXZpc2lvbjogJTAyeFxuIiwKLQkJCQlUUkFOU1BPUlQoZGV2KS0+Z2V0X2RldmljZV9yZXYoZGV2KSk7CisJZGV2aWNlX3R5cGUgPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2RldmljZV90eXBlKGRldik7CisJcHJfZGVidWcoIiAgVHlwZTogICAlcyAiLCBzY3NpX2RldmljZV90eXBlKGRldmljZV90eXBlKSk7CisJcHJfZGVidWcoIiAgICAgICAgICAgICAgICAgQU5TSSBTQ1NJIHJldmlzaW9uOiAlMDJ4XG4iLAorCQkJCWRldi0+dHJhbnNwb3J0LT5nZXRfZGV2aWNlX3JldihkZXYpKTsKIH0KIAogc3RydWN0IHNlX2RldmljZSAqdHJhbnNwb3J0X2FkZF9kZXZpY2VfdG9fY29yZV9oYmEoCkBAIC0xNjMwLDMzICsxNDExLDE1IEBACiAJc3RydWN0IHNlX2RldmljZSAgKmRldjsKIAogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIShkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc2VfZGV2X3RcbiIpOworCWlmICghZGV2KSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc2VfZGV2X3RcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JZGV2LT5kZXZfcXVldWVfb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlX3F1ZXVlX29iaiksIEdGUF9LRVJORUwpOwotCWlmICghKGRldi0+ZGV2X3F1ZXVlX29iaikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciIKLQkJCQkiIGRldi0+ZGV2X3F1ZXVlX29ialxuIik7Ci0JCWtmcmVlKGRldik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl0cmFuc3BvcnRfaW5pdF9xdWV1ZV9vYmooZGV2LT5kZXZfcXVldWVfb2JqKTsKIAotCWRldi0+ZGV2X3N0YXR1c19xdWV1ZV9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VfcXVldWVfb2JqKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoZGV2LT5kZXZfc3RhdHVzX3F1ZXVlX29iaikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciIKLQkJCQkiIGRldi0+ZGV2X3N0YXR1c19xdWV1ZV9vYmpcbiIpOwotCQlrZnJlZShkZXYtPmRldl9xdWV1ZV9vYmopOwotCQlrZnJlZShkZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdHJhbnNwb3J0X2luaXRfcXVldWVfb2JqKGRldi0+ZGV2X3N0YXR1c19xdWV1ZV9vYmopOwotCisJdHJhbnNwb3J0X2luaXRfcXVldWVfb2JqKCZkZXYtPmRldl9xdWV1ZV9vYmopOwogCWRldi0+ZGV2X2ZsYWdzCQk9IGRldmljZV9mbGFnczsKIAlkZXYtPmRldl9zdGF0dXMJCXw9IFRSQU5TUE9SVF9ERVZJQ0VfREVBQ1RJVkFURUQ7Ci0JZGV2LT5kZXZfcHRyCQk9ICh2b2lkICopIHRyYW5zcG9ydF9kZXY7CisJZGV2LT5kZXZfcHRyCQk9IHRyYW5zcG9ydF9kZXY7CiAJZGV2LT5zZV9oYmEJCT0gaGJhOwogCWRldi0+c2Vfc3ViX2RldgkJPSBzZV9kZXY7CiAJZGV2LT50cmFuc3BvcnQJCT0gdHJhbnNwb3J0OwpAQCAtMTY2OCw2ICsxNDMxLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5kZWxheWVkX2NtZF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5vcmRlcmVkX2NtZF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5zdGF0ZV90YXNrX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnFmX2NtZF9saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5leGVjdXRlX3Rhc2tfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+ZGVsYXllZF9jbWRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+b3JkZXJlZF9jbWRfbG9jayk7CkBAIC0xNjc4LDYgKzE0NDIsNyBAQAogCXNwaW5fbG9ja19pbml0KCZkZXYtPmRldl9zdGF0dXNfdGhyX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnNlX3BvcnRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+c2VfdG1yX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZkZXYtPnFmX2NtZF9sb2NrKTsKIAogCWRldi0+cXVldWVfZGVwdGgJPSBkZXZfbGltaXRzLT5xdWV1ZV9kZXB0aDsKIAlhdG9taWNfc2V0KCZkZXYtPmRlcHRoX2xlZnQsIGRldi0+cXVldWVfZGVwdGgpOwpAQCAtMTcxNSwxMyArMTQ4MCwxNiBAQAogCSAqIFN0YXJ0dXAgdGhlIHN0cnVjdCBzZV9kZXZpY2UgcHJvY2Vzc2luZyB0aHJlYWQKIAkgKi8KIAlkZXYtPnByb2Nlc3NfdGhyZWFkID0ga3RocmVhZF9ydW4odHJhbnNwb3J0X3Byb2Nlc3NpbmdfdGhyZWFkLCBkZXYsCi0JCQkJCSAgIkxJT18lcyIsIFRSQU5TUE9SVChkZXYpLT5uYW1lKTsKKwkJCQkJICAiTElPXyVzIiwgZGV2LT50cmFuc3BvcnQtPm5hbWUpOwogCWlmIChJU19FUlIoZGV2LT5wcm9jZXNzX3RocmVhZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIGt0aHJlYWQ6IExJT18lc1xuIiwKLQkJCVRSQU5TUE9SVChkZXYpLT5uYW1lKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gY3JlYXRlIGt0aHJlYWQ6IExJT18lc1xuIiwKKwkJCWRldi0+dHJhbnNwb3J0LT5uYW1lKTsKIAkJZ290byBvdXQ7CiAJfQotCisJLyoKKwkgKiBTZXR1cCB3b3JrX3F1ZXVlIGZvciBRVUVVRV9GVUxMCisJICovCisJSU5JVF9XT1JLKCZkZXYtPnFmX3dvcmtfcXVldWUsIHRhcmdldF9xZl9kb193b3JrKTsKIAkvKgogCSAqIFByZWxvYWQgdGhlIGluaXRpYWwgSU5RVUlSWSBjb25zdCB2YWx1ZXMgaWYgd2UgYXJlIGRvaW5nCiAJICogYW55dGhpbmcgdmlydHVhbCAoSUJMT0NLLCBGSUxFSU8sIFJBTURJU0spLCBidXQgbm90IGZvciBUQ00vcFNDU0kKQEAgLTE3MzAsMTYgKzE0OTgsMTYgQEAKIAkgKiBvcmlnaW5hbHMgb25jZSBiYWNrIGludG8gREVWX1QxMF9XV04oZGV2KSBmb3IgdGhlIHZpcnR1YWwgZGV2aWNlCiAJICogc2V0dXAuCiAJICovCi0JaWYgKFRSQU5TUE9SVChkZXYpLT50cmFuc3BvcnRfdHlwZSAhPSBUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVikgewotCQlpZiAoIShpbnF1aXJ5X3Byb2QpIHx8ICEoaW5xdWlyeV9wcm9kKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJBbGwgbm9uIFRDTS9wU0NTSSBwbHVnaW5zIHJlcXVpcmUiCisJaWYgKGRldi0+dHJhbnNwb3J0LT50cmFuc3BvcnRfdHlwZSAhPSBUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVikgeworCQlpZiAoIWlucXVpcnlfcHJvZCB8fCAhaW5xdWlyeV9yZXYpIHsKKwkJCXByX2VycigiQWxsIG5vbiBUQ00vcFNDU0kgcGx1Z2lucyByZXF1aXJlIgogCQkJCSIgSU5RVUlSWSBjb25zdHNcbiIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlzdHJuY3B5KCZERVZfVDEwX1dXTihkZXYpLT52ZW5kb3JbMF0sICJMSU8tT1JHIiwgOCk7Ci0JCXN0cm5jcHkoJkRFVl9UMTBfV1dOKGRldiktPm1vZGVsWzBdLCBpbnF1aXJ5X3Byb2QsIDE2KTsKLQkJc3RybmNweSgmREVWX1QxMF9XV04oZGV2KS0+cmV2aXNpb25bMF0sIGlucXVpcnlfcmV2LCA0KTsKKwkJc3RybmNweSgmZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLnZlbmRvclswXSwgIkxJTy1PUkciLCA4KTsKKwkJc3RybmNweSgmZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLm1vZGVsWzBdLCBpbnF1aXJ5X3Byb2QsIDE2KTsKKwkJc3RybmNweSgmZGV2LT5zZV9zdWJfZGV2LT50MTBfd3duLnJldmlzaW9uWzBdLCBpbnF1aXJ5X3JldiwgNCk7CiAJfQogCXNjc2lfZHVtcF9pbnF1aXJ5KGRldik7CiAKQEAgLTE3NTQsOCArMTUyMiw2IEBACiAKIAlzZV9yZWxlYXNlX3ZwZF9mb3JfZGV2KGRldik7CiAKLQlrZnJlZShkZXYtPmRldl9zdGF0dXNfcXVldWVfb2JqKTsKLQlrZnJlZShkZXYtPmRldl9xdWV1ZV9vYmopOwogCWtmcmVlKGRldik7CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTE3OTQsMTIgKzE1NjAsMTEgQEAKIAkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGF0YV9kaXJlY3Rpb24pCiB7CiAJc3RydWN0IHNlX3Rhc2sgKnRhc2s7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfREVWKGNtZCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAotCXRhc2sgPSBkZXYtPnRyYW5zcG9ydC0+YWxsb2NfdGFzayhjbWQpOworCXRhc2sgPSBkZXYtPnRyYW5zcG9ydC0+YWxsb2NfdGFzayhjbWQtPnRfdGFza19jZGIpOwogCWlmICghdGFzaykgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3Qgc2VfdGFza1xuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBzZV90YXNrXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xODA3LDI2ICsxNTcyLDE1IEBACiAJSU5JVF9MSVNUX0hFQUQoJnRhc2stPnRfZXhlY3V0ZV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmdGFzay0+dF9zdGF0ZV9saXN0KTsKIAlpbml0X2NvbXBsZXRpb24oJnRhc2stPnRhc2tfc3RvcF9jb21wKTsKLQl0YXNrLT50YXNrX25vID0gVF9UQVNLKGNtZCktPnRfdGFza3Nfbm8rKzsKIAl0YXNrLT50YXNrX3NlX2NtZCA9IGNtZDsKIAl0YXNrLT5zZV9kZXYgPSBkZXY7CiAJdGFzay0+dGFza19kYXRhX2RpcmVjdGlvbiA9IGRhdGFfZGlyZWN0aW9uOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZ0YXNrLT50X2xpc3QsICZUX1RBU0soY21kKS0+dF90YXNrX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQogCXJldHVybiB0YXNrOwogfQogCiBzdGF0aWMgaW50IHRyYW5zcG9ydF9nZW5lcmljX2NtZF9zZXF1ZW5jZXIoc3RydWN0IHNlX2NtZCAqLCB1bnNpZ25lZCBjaGFyICopOwogCi12b2lkIHRyYW5zcG9ydF9kZXZpY2Vfc2V0dXBfY21kKHN0cnVjdCBzZV9jbWQgKmNtZCkKLXsKLQljbWQtPnNlX2RldiA9IFNFX0xVTihjbWQpLT5sdW5fc2VfZGV2OwotfQotRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZGV2aWNlX3NldHVwX2NtZCk7Ci0KIC8qCiAgKiBVc2VkIGJ5IGZhYnJpYyBtb2R1bGVzIGNvbnRhaW5pbmcgYSBsb2NhbCBzdHJ1Y3Qgc2VfY21kIHdpdGhpbiB0aGVpcgogICogZmFicmljIGRlcGVuZGVudCBwZXIgSS9PIGRlc2NyaXB0b3IuCkBAIC0xODQwLDIwICsxNTk0LDE3IEBACiAJaW50IHRhc2tfYXR0ciwKIAl1bnNpZ25lZCBjaGFyICpzZW5zZV9idWZmZXIpCiB7Ci0JSU5JVF9MSVNUX0hFQUQoJmNtZC0+c2VfbHVuX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjbWQtPnNlX2RlbGF5ZWRfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNtZC0+c2Vfb3JkZXJlZF9saXN0KTsKLQkvKgotCSAqIFNldHVwIHRfdGFzayBwb2ludGVyIHRvIHRfdGFza19iYWNrc3RvcmUKLQkgKi8KLQljbWQtPnRfdGFzayA9ICZjbWQtPnRfdGFza19iYWNrc3RvcmU7CisJSU5JVF9MSVNUX0hFQUQoJmNtZC0+c2VfbHVuX25vZGUpOworCUlOSVRfTElTVF9IRUFEKCZjbWQtPnNlX2RlbGF5ZWRfbm9kZSk7CisJSU5JVF9MSVNUX0hFQUQoJmNtZC0+c2Vfb3JkZXJlZF9ub2RlKTsKKwlJTklUX0xJU1RfSEVBRCgmY21kLT5zZV9xZl9ub2RlKTsKIAotCUlOSVRfTElTVF9IRUFEKCZUX1RBU0soY21kKS0+dF90YXNrX2xpc3QpOwotCWluaXRfY29tcGxldGlvbigmVF9UQVNLKGNtZCktPnRyYW5zcG9ydF9sdW5fZmVfc3RvcF9jb21wKTsKLQlpbml0X2NvbXBsZXRpb24oJlRfVEFTSyhjbWQpLT50cmFuc3BvcnRfbHVuX3N0b3BfY29tcCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfc3RvcF9jb21wKTsKLQlzcGluX2xvY2tfaW5pdCgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jayk7Ci0JYXRvbWljX3NldCgmVF9UQVNLKGNtZCktPnRyYW5zcG9ydF9kZXZfYWN0aXZlLCAxKTsKKwlJTklUX0xJU1RfSEVBRCgmY21kLT50X3Rhc2tfbGlzdCk7CisJaW5pdF9jb21wbGV0aW9uKCZjbWQtPnRyYW5zcG9ydF9sdW5fZmVfc3RvcF9jb21wKTsKKwlpbml0X2NvbXBsZXRpb24oJmNtZC0+dHJhbnNwb3J0X2x1bl9zdG9wX2NvbXApOworCWluaXRfY29tcGxldGlvbigmY21kLT50X3RyYW5zcG9ydF9zdG9wX2NvbXApOworCXNwaW5fbG9ja19pbml0KCZjbWQtPnRfc3RhdGVfbG9jayk7CisJYXRvbWljX3NldCgmY21kLT50cmFuc3BvcnRfZGV2X2FjdGl2ZSwgMSk7CiAKIAljbWQtPnNlX3RmbyA9IHRmbzsKIAljbWQtPnNlX3Nlc3MgPSBzZV9zZXNzOwpAQCAtMTg3MCwyMyArMTYyMSwyMyBAQAogCSAqIENoZWNrIGlmIFNBTSBUYXNrIEF0dHJpYnV0ZSBlbXVsYXRpb24gaXMgZW5hYmxlZCBmb3IgdGhpcwogCSAqIHN0cnVjdCBzZV9kZXZpY2Ugc3RvcmFnZSBvYmplY3QKIAkgKi8KLQlpZiAoU0VfREVWKGNtZCktPmRldl90YXNrX2F0dHJfdHlwZSAhPSBTQU1fVEFTS19BVFRSX0VNVUxBVEVEKQorCWlmIChjbWQtPnNlX2Rldi0+ZGV2X3Rhc2tfYXR0cl90eXBlICE9IFNBTV9UQVNLX0FUVFJfRU1VTEFURUQpCiAJCXJldHVybiAwOwogCiAJaWYgKGNtZC0+c2FtX3Rhc2tfYXR0ciA9PSBNU0dfQUNBX1RBRykgewotCQlERUJVR19TVEEoIlNBTSBUYXNrIEF0dHJpYnV0ZSBBQ0EiCisJCXByX2RlYnVnKCJTQU0gVGFzayBBdHRyaWJ1dGUgQUNBIgogCQkJIiBlbXVsYXRpb24gaXMgbm90IHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qCiAJICogVXNlZCB0byBkZXRlcm1pbmUgd2hlbiBPUkRFUkVEIGNvbW1hbmRzIHNob3VsZCBnbyBmcm9tCiAJICogRG9ybWFudCB0byBBY3RpdmUgc3RhdHVzLgogCSAqLwotCWNtZC0+c2Vfb3JkZXJlZF9pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZTRV9ERVYoY21kKS0+ZGV2X29yZGVyZWRfaWQpOworCWNtZC0+c2Vfb3JkZXJlZF9pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZjbWQtPnNlX2Rldi0+ZGV2X29yZGVyZWRfaWQpOwogCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOwotCURFQlVHX1NUQSgiQWxsb2NhdGVkIHNlX29yZGVyZWRfaWQ6ICV1IGZvciBUYXNrIEF0dHI6IDB4JTAyeCBvbiAlc1xuIiwKKwlwcl9kZWJ1ZygiQWxsb2NhdGVkIHNlX29yZGVyZWRfaWQ6ICV1IGZvciBUYXNrIEF0dHI6IDB4JTAyeCBvbiAlc1xuIiwKIAkJCWNtZC0+c2Vfb3JkZXJlZF9pZCwgY21kLT5zYW1fdGFza19hdHRyLAotCQkJVFJBTlNQT1JUKGNtZC0+c2VfZGV2KS0+bmFtZSk7CisJCQljbWQtPnNlX2Rldi0+dHJhbnNwb3J0LT5uYW1lKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg5OCw4ICsxNjQ5LDggQEAKIAkvKgogCSAqIENoZWNrIGFuZCBmcmVlIGFueSBleHRlbmRlZCBDREIgYnVmZmVyIHRoYXQgd2FzIGFsbG9jYXRlZAogCSAqLwotCWlmIChUX1RBU0soc2VfY21kKS0+dF90YXNrX2NkYiAhPSBUX1RBU0soc2VfY21kKS0+X190X3Rhc2tfY2RiKQotCQlrZnJlZShUX1RBU0soc2VfY21kKS0+dF90YXNrX2NkYik7CisJaWYgKHNlX2NtZC0+dF90YXNrX2NkYiAhPSBzZV9jbWQtPl9fdF90YXNrX2NkYikKKwkJa2ZyZWUoc2VfY21kLT50X3Rhc2tfY2RiKTsKIH0KIEVYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2ZyZWVfc2VfY21kKTsKIApAQCAtMTkyMiw0MiArMTY3Myw0MSBAQAogCSAqLwogCWNtZC0+dHJhbnNwb3J0X3dhaXRfZm9yX3Rhc2tzID0gJnRyYW5zcG9ydF9nZW5lcmljX3dhaXRfZm9yX3Rhc2tzOwogCi0JdHJhbnNwb3J0X2RldmljZV9zZXR1cF9jbWQoY21kKTsKIAkvKgogCSAqIEVuc3VyZSB0aGF0IHRoZSByZWNlaXZlZCBDREIgaXMgbGVzcyB0aGFuIHRoZSBtYXggKDI1MiArIDgpIGJ5dGVzCiAJICogZm9yIFZBUklBQkxFX0xFTkdUSF9DTUQKIAkgKi8KIAlpZiAoc2NzaV9jb21tYW5kX3NpemUoY2RiKSA+IFNDU0lfTUFYX1ZBUkxFTl9DREJfU0laRSkgewotCQlwcmludGsoS0VSTl9FUlIgIlJlY2VpdmVkIFNDU0kgQ0RCIHdpdGggY29tbWFuZF9zaXplOiAlZCB0aGF0IgorCQlwcl9lcnIoIlJlY2VpdmVkIFNDU0kgQ0RCIHdpdGggY29tbWFuZF9zaXplOiAlZCB0aGF0IgogCQkJIiBleGNlZWRzIFNDU0lfTUFYX1ZBUkxFTl9DREJfU0laRTogJWRcbiIsCiAJCQlzY3NpX2NvbW1hbmRfc2l6ZShjZGIpLCBTQ1NJX01BWF9WQVJMRU5fQ0RCX1NJWkUpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKgogCSAqIElmIHRoZSByZWNlaXZlZCBDREIgaXMgbGFyZ2VyIHRoYW4gVENNX01BWF9DT01NQU5EX1NJWkUsCiAJICogYWxsb2NhdGUgdGhlIGFkZGl0aW9uYWwgZXh0ZW5kZWQgQ0RCIGJ1ZmZlciBub3cuLiAgT3RoZXJ3aXNlCiAJICogc2V0dXAgdGhlIHBvaW50ZXIgZnJvbSBfX3RfdGFza19jZGIgdG8gdF90YXNrX2NkYi4KIAkgKi8KLQlpZiAoc2NzaV9jb21tYW5kX3NpemUoY2RiKSA+IHNpemVvZihUX1RBU0soY21kKS0+X190X3Rhc2tfY2RiKSkgewotCQlUX1RBU0soY21kKS0+dF90YXNrX2NkYiA9IGt6YWxsb2Moc2NzaV9jb21tYW5kX3NpemUoY2RiKSwKKwlpZiAoc2NzaV9jb21tYW5kX3NpemUoY2RiKSA+IHNpemVvZihjbWQtPl9fdF90YXNrX2NkYikpIHsKKwkJY21kLT50X3Rhc2tfY2RiID0ga3phbGxvYyhzY3NpX2NvbW1hbmRfc2l6ZShjZGIpLAogCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghKFRfVEFTSyhjbWQpLT50X3Rhc2tfY2RiKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgVF9UQVNLKGNtZCktPnRfdGFza19jZGIiCi0JCQkJIiAldSA+IHNpemVvZihUX1RBU0soY21kKS0+X190X3Rhc2tfY2RiKTogJWx1IG9wc1xuIiwKKwkJaWYgKCFjbWQtPnRfdGFza19jZGIpIHsKKwkJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGNtZC0+dF90YXNrX2NkYiIKKwkJCQkiICV1ID4gc2l6ZW9mKGNtZC0+X190X3Rhc2tfY2RiKTogJWx1IG9wc1xuIiwKIAkJCQlzY3NpX2NvbW1hbmRfc2l6ZShjZGIpLAotCQkJCSh1bnNpZ25lZCBsb25nKXNpemVvZihUX1RBU0soY21kKS0+X190X3Rhc2tfY2RiKSk7Ci0JCQlyZXR1cm4gLTE7CisJCQkJKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGNtZC0+X190X3Rhc2tfY2RiKSk7CisJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0gZWxzZQotCQlUX1RBU0soY21kKS0+dF90YXNrX2NkYiA9ICZUX1RBU0soY21kKS0+X190X3Rhc2tfY2RiWzBdOworCQljbWQtPnRfdGFza19jZGIgPSAmY21kLT5fX3RfdGFza19jZGJbMF07CiAJLyoKLQkgKiBDb3B5IHRoZSBvcmlnaW5hbCBDREIgaW50byBUX1RBU0soY21kKS4KKwkgKiBDb3B5IHRoZSBvcmlnaW5hbCBDREIgaW50byBjbWQtPgogCSAqLwotCW1lbWNweShUX1RBU0soY21kKS0+dF90YXNrX2NkYiwgY2RiLCBzY3NpX2NvbW1hbmRfc2l6ZShjZGIpKTsKKwltZW1jcHkoY21kLT50X3Rhc2tfY2RiLCBjZGIsIHNjc2lfY29tbWFuZF9zaXplKGNkYikpOwogCS8qCiAJICogU2V0dXAgdGhlIHJlY2VpdmVkIENEQiBiYXNlZCBvbiBTQ1NJIGRlZmluZWQgb3Bjb2RlcyBhbmQKIAkgKiBwZXJmb3JtIHVuaXQgYXR0ZW50aW9uLCBwZXJzaXN0ZW50IHJlc2VydmF0aW9ucyBhbmQgQUxVQQotCSAqIGNoZWNrcyBmb3IgdmlydHVhbCBkZXZpY2UgYmFja2VuZHMuICBUaGUgVF9UQVNLKGNtZCktPnRfdGFza19jZGIKKwkgKiBjaGVja3MgZm9yIHZpcnR1YWwgZGV2aWNlIGJhY2tlbmRzLiAgVGhlIGNtZC0+dF90YXNrX2NkYgogCSAqIHBvaW50ZXIgaXMgZXhwZWN0ZWQgdG8gYmUgc2V0dXAgYmVmb3JlIHdlIHJlYWNoIHRoaXMgcG9pbnQuCiAJICovCiAJcmV0ID0gdHJhbnNwb3J0X2dlbmVyaWNfY21kX3NlcXVlbmNlcihjbWQsIGNkYik7CkBAIC0xOTY5LDcgKzE3MTksNyBAQAogCWlmICh0cmFuc3BvcnRfY2hlY2tfYWxsb2NfdGFza19hdHRyKGNtZCkgPCAwKSB7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047CiAJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9DREJfRklFTEQ7Ci0JCXJldHVybiAtMjsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXNwaW5fbG9jaygmY21kLT5zZV9sdW4tPmx1bl9zZXBfbG9jayk7CiAJaWYgKGNtZC0+c2VfbHVuLT5sdW5fc2VwKQpAQCAtMTk4NiwxMCArMTczNiwxMCBAQAogaW50IHRyYW5zcG9ydF9nZW5lcmljX2hhbmRsZV9jZGIoCiAJc3RydWN0IHNlX2NtZCAqY21kKQogewotCWlmICghU0VfTFVOKGNtZCkpIHsKKwlpZiAoIWNtZC0+c2VfbHVuKSB7CiAJCWR1bXBfc3RhY2soKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJTRV9MVU4oY21kKSBpcyBOVUxMXG4iKTsKLQkJcmV0dXJuIC0xOworCQlwcl9lcnIoImNtZC0+c2VfbHVuIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAl0cmFuc3BvcnRfYWRkX2NtZF90b19xdWV1ZShjbWQsIFRSQU5TUE9SVF9ORVdfQ01EKTsKQEAgLTE5OTgsNiArMTc0OCwyOSBAQAogRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfY2RiKTsKIAogLyoKKyAqIFVzZWQgYnkgZmFicmljIG1vZHVsZSBmcm9udGVuZHMgdG8gcXVldWUgdGFza3MgZGlyZWN0bHkuCisgKiBNYW55IG9ubHkgYmUgdXNlZCBmcm9tIHByb2Nlc3MgY29udGV4dCBvbmx5CisgKi8KK2ludCB0cmFuc3BvcnRfaGFuZGxlX2NkYl9kaXJlY3QoCisJc3RydWN0IHNlX2NtZCAqY21kKQoreworCWlmICghY21kLT5zZV9sdW4pIHsKKwkJZHVtcF9zdGFjaygpOworCQlwcl9lcnIoImNtZC0+c2VfbHVuIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGluX2ludGVycnVwdCgpKSB7CisJCWR1bXBfc3RhY2soKTsKKwkJcHJfZXJyKCJ0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfY2RiIGNhbm5vdCBiZSBjYWxsZWQiCisJCQkJIiBmcm9tIGludGVycnVwdCBjb250ZXh0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHRyYW5zcG9ydF9nZW5lcmljX25ld19jbWQoY21kKTsKK30KK0VYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2hhbmRsZV9jZGJfZGlyZWN0KTsKKworLyoKICAqIFVzZWQgYnkgZmFicmljIG1vZHVsZSBmcm9udGVuZHMgZGVmaW5pbmcgYSBURk8tPm5ld19jbWRfbWFwKCkgY2FsbGVyCiAgKiB0byAgcXVldWUgdXAgYSBuZXdseSBzZXR1cCBzZV9jbWQgdy8gVFJBTlNQT1JUX05FV19DTURfTUFQIGluIG9yZGVyIHRvCiAgKiBjb21wbGV0ZSBzZXR1cCBpbiBUQ00gcHJvY2VzcyBjb250ZXh0IHcvIFRGTy0+bmV3X2NtZF9tYXAoKS4KQEAgLTIwMDUsMTAgKzE3NzgsMTAgQEAKIGludCB0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfY2RiX21hcCgKIAlzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7Ci0JaWYgKCFTRV9MVU4oY21kKSkgeworCWlmICghY21kLT5zZV9sdW4pIHsKIAkJZHVtcF9zdGFjaygpOwotCQlwcmludGsoS0VSTl9FUlIgIlNFX0xVTihjbWQpIGlzIE5VTExcbiIpOwotCQlyZXR1cm4gLTE7CisJCXByX2VycigiY21kLT5zZV9sdW4gaXMgTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXRyYW5zcG9ydF9hZGRfY21kX3RvX3F1ZXVlKGNtZCwgVFJBTlNQT1JUX05FV19DTURfTUFQKTsKQEAgLTIwMzAsNyArMTgwMyw3IEBACiAJICogaW4gaW50ZXJydXB0IGNvZGUsIHRoZSBzaWduYWxfcGVuZGluZygpIGNoZWNrIGlzIHNraXBwZWQuCiAJICovCiAJaWYgKCFpbl9pbnRlcnJ1cHQoKSAmJiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVQRVJNOwogCS8qCiAJICogSWYgdGhlIHJlY2VpdmVkIENEQiBoYXMgYWxlYWR5IGJlZW4gQUJPUlRFRCBieSB0aGUgZ2VuZXJpYwogCSAqIHRhcmdldCBlbmdpbmUsIHdlIG5vdyBjYWxsIHRyYW5zcG9ydF9jaGVja19hYm9ydGVkX3N0YXR1cygpCkBAIC0yMDU3LDcgKzE4MzAsNiBAQAogCSAqIFRoaXMgaXMgbmVlZGVkIGZvciBlYXJseSBleGNlcHRpb25zLgogCSAqLwogCWNtZC0+dHJhbnNwb3J0X3dhaXRfZm9yX3Rhc2tzID0gJnRyYW5zcG9ydF9nZW5lcmljX3dhaXRfZm9yX3Rhc2tzOwotCXRyYW5zcG9ydF9kZXZpY2Vfc2V0dXBfY21kKGNtZCk7CiAKIAl0cmFuc3BvcnRfYWRkX2NtZF90b19xdWV1ZShjbWQsIFRSQU5TUE9SVF9QUk9DRVNTX1RNUik7CiAJcmV0dXJuIDA7CkBAIC0yMDc3LDE2ICsxODQ5LDE2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0ID0gMDsKIAotCURFQlVHX1RTKCJJVFRbMHglMDh4XSAtIFN0b3BwaW5nIHRhc2tzXG4iLAotCQlDTURfVEZPKGNtZCktPmdldF90YXNrX3RhZyhjbWQpKTsKKwlwcl9kZWJ1ZygiSVRUWzB4JTA4eF0gLSBTdG9wcGluZyB0YXNrc1xuIiwKKwkJY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpKTsKIAogCS8qCiAJICogTm8gdGFza3MgcmVtYWluIGluIHRoZSBleGVjdXRpb24gcXVldWUKIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YXNrLCB0YXNrX3RtcCwKLQkJCQkmVF9UQVNLKGNtZCktPnRfdGFza19saXN0LCB0X2xpc3QpIHsKLQkJREVCVUdfVFMoInRhc2tfbm9bJWRdIC0gUHJvY2Vzc2luZyB0YXNrICVwXG4iLAorCQkJCSZjbWQtPnRfdGFza19saXN0LCB0X2xpc3QpIHsKKwkJcHJfZGVidWcoInRhc2tfbm9bJWRdIC0gUHJvY2Vzc2luZyB0YXNrICVwXG4iLAogCQkJCXRhc2stPnRhc2tfbm8sIHRhc2spOwogCQkvKgogCQkgKiBJZiB0aGUgc3RydWN0IHNlX3Rhc2sgaGFzIG5vdCBiZWVuIHNlbnQgYW5kIGlzIG5vdCBhY3RpdmUsCkBAIC0yMDk0LDE0ICsxODY2LDE0IEBACiAJCSAqLwogCQlpZiAoIWF0b21pY19yZWFkKCZ0YXNrLT50YXNrX3NlbnQpICYmCiAJCSAgICAhYXRvbWljX3JlYWQoJnRhc2stPnRhc2tfYWN0aXZlKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLAogCQkJCQlmbGFncyk7CiAJCQl0cmFuc3BvcnRfcmVtb3ZlX3Rhc2tfZnJvbV9leGVjdXRlX3F1ZXVlKHRhc2ssCiAJCQkJCXRhc2stPnNlX2Rldik7CiAKLQkJCURFQlVHX1RTKCJ0YXNrX25vWyVkXSAtIFJlbW92ZWQgZnJvbSBleGVjdXRlIHF1ZXVlXG4iLAorCQkJcHJfZGVidWcoInRhc2tfbm9bJWRdIC0gUmVtb3ZlZCBmcm9tIGV4ZWN1dGUgcXVldWVcbiIsCiAJCQkJdGFzay0+dGFza19ubyk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0yMTExLDQyICsxODgzLDMyIEBACiAJCSAqLwogCQlpZiAoYXRvbWljX3JlYWQoJnRhc2stPnRhc2tfYWN0aXZlKSkgewogCQkJYXRvbWljX3NldCgmdGFzay0+dGFza19zdG9wLCAxKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywKIAkJCQkJZmxhZ3MpOwogCi0JCQlERUJVR19UUygidGFza19ub1slZF0gLSBXYWl0aW5nIHRvIGNvbXBsZXRlXG4iLAorCQkJcHJfZGVidWcoInRhc2tfbm9bJWRdIC0gV2FpdGluZyB0byBjb21wbGV0ZVxuIiwKIAkJCQl0YXNrLT50YXNrX25vKTsKIAkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRhc2stPnRhc2tfc3RvcF9jb21wKTsKLQkJCURFQlVHX1RTKCJ0YXNrX25vWyVkXSAtIFN0b3BwZWQgc3VjY2Vzc2Z1bGx5XG4iLAorCQkJcHJfZGVidWcoInRhc2tfbm9bJWRdIC0gU3RvcHBlZCBzdWNjZXNzZnVsbHlcbiIsCiAJCQkJdGFzay0+dGFza19ubyk7CiAKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCQlhdG9taWNfZGVjKCZUX1RBU0soY21kKS0+dF90YXNrX2NkYnNfbGVmdCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCWF0b21pY19kZWMoJmNtZC0+dF90YXNrX2NkYnNfbGVmdCk7CiAKIAkJCWF0b21pY19zZXQoJnRhc2stPnRhc2tfYWN0aXZlLCAwKTsKIAkJCWF0b21pY19zZXQoJnRhc2stPnRhc2tfc3RvcCwgMCk7CiAJCX0gZWxzZSB7Ci0JCQlERUJVR19UUygidGFza19ub1slZF0gLSBEaWQgbm90aGluZ1xuIiwgdGFzay0+dGFza19ubyk7CisJCQlwcl9kZWJ1ZygidGFza19ub1slZF0gLSBEaWQgbm90aGluZ1xuIiwgdGFzay0+dGFza19ubyk7CiAJCQlyZXQrKzsKIAkJfQogCiAJCV9fdHJhbnNwb3J0X3N0b3BfdGFza190aW1lcih0YXNrLCAmZmxhZ3MpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHRyYW5zcG9ydF9mYWlsdXJlX3Jlc2V0X3F1ZXVlX2RlcHRoKHN0cnVjdCBzZV9kZXZpY2UgKmRldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJlNFX0hCQShkZXYpLT5oYmFfcXVldWVfbG9jaywgZmxhZ3MpOwotCWF0b21pY19pbmMoJmRldi0+ZGVwdGhfbGVmdCk7Ci0JYXRvbWljX2luYygmU0VfSEJBKGRldiktPmxlZnRfcXVldWVfZGVwdGgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlNFX0hCQShkZXYpLT5oYmFfcXVldWVfbG9jaywgZmxhZ3MpOwotfQotCiAvKgogICogSGFuZGxlIFNBTS1lc3F1ZSBlbXVsYXRpb24gZm9yIGdlbmVyaWMgdHJhbnNwb3J0IHJlcXVlc3QgZmFpbHVyZXMuCiAgKi8KQEAgLTIxNTYsMjkgKzE5MTgsMzEgQEAKIAlpbnQgY29tcGxldGUsCiAJaW50IHNjKQogewotCURFQlVHX0dSRigiLS0tLS1bIFN0b3JhZ2UgRW5naW5lIEV4Y2VwdGlvbiBmb3IgY21kOiAlcCBJVFQ6IDB4JTA4eCIKLQkJIiBDREI6IDB4JTAyeFxuIiwgY21kLCBDTURfVEZPKGNtZCktPmdldF90YXNrX3RhZyhjbWQpLAotCQlUX1RBU0soY21kKS0+dF90YXNrX2NkYlswXSk7Ci0JREVCVUdfR1JGKCItLS0tLVsgaV9zdGF0ZTogJWQgdF9zdGF0ZS9kZWZfdF9zdGF0ZToiCisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiLS0tLS1bIFN0b3JhZ2UgRW5naW5lIEV4Y2VwdGlvbiBmb3IgY21kOiAlcCBJVFQ6IDB4JTA4eCIKKwkJIiBDREI6IDB4JTAyeFxuIiwgY21kLCBjbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCksCisJCWNtZC0+dF90YXNrX2NkYlswXSk7CisJcHJfZGVidWcoIi0tLS0tWyBpX3N0YXRlOiAlZCB0X3N0YXRlL2RlZl90X3N0YXRlOiIKIAkJIiAlZC8lZCB0cmFuc3BvcnRfZXJyb3Jfc3RhdHVzOiAlZFxuIiwKLQkJQ01EX1RGTyhjbWQpLT5nZXRfY21kX3N0YXRlKGNtZCksCisJCWNtZC0+c2VfdGZvLT5nZXRfY21kX3N0YXRlKGNtZCksCiAJCWNtZC0+dF9zdGF0ZSwgY21kLT5kZWZlcnJlZF90X3N0YXRlLAogCQljbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMpOwotCURFQlVHX0dSRigiLS0tLS1bIHRfdGFza19jZGJzOiAlZCB0X3Rhc2tfY2Ric19sZWZ0OiAlZCIKKwlwcl9kZWJ1ZygiLS0tLS1bIHRfdGFza3M6ICVkIHRfdGFza19jZGJzX2xlZnQ6ICVkIgogCQkiIHRfdGFza19jZGJzX3NlbnQ6ICVkIHRfdGFza19jZGJzX2V4X2xlZnQ6ICVkIC0tIgogCQkiIHRfdHJhbnNwb3J0X2FjdGl2ZTogJWQgdF90cmFuc3BvcnRfc3RvcDogJWQiCi0JCSIgdF90cmFuc3BvcnRfc2VudDogJWRcbiIsIFRfVEFTSyhjbWQpLT50X3Rhc2tfY2RicywKLQkJYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19sZWZ0KSwKLQkJYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19zZW50KSwKLQkJYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19leF9sZWZ0KSwKLQkJYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF9hY3RpdmUpLAotCQlhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X3N0b3ApLAotCQlhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X3NlbnQpKTsKKwkJIiB0X3RyYW5zcG9ydF9zZW50OiAlZFxuIiwgY21kLT50X3Rhc2tfbGlzdF9udW0sCisJCWF0b21pY19yZWFkKCZjbWQtPnRfdGFza19jZGJzX2xlZnQpLAorCQlhdG9taWNfcmVhZCgmY21kLT50X3Rhc2tfY2Ric19zZW50KSwKKwkJYXRvbWljX3JlYWQoJmNtZC0+dF90YXNrX2NkYnNfZXhfbGVmdCksCisJCWF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X2FjdGl2ZSksCisJCWF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X3N0b3ApLAorCQlhdG9taWNfcmVhZCgmY21kLT50X3RyYW5zcG9ydF9zZW50KSk7CiAKIAl0cmFuc3BvcnRfc3RvcF9hbGxfdGFza190aW1lcnMoY21kKTsKIAogCWlmIChkZXYpCi0JCXRyYW5zcG9ydF9mYWlsdXJlX3Jlc2V0X3F1ZXVlX2RlcHRoKGRldik7CisJCWF0b21pY19pbmMoJmRldi0+ZGVwdGhfbGVmdCk7CiAJLyoKIAkgKiBGb3IgU0FNIFRhc2sgQXR0cmlidXRlIGVtdWxhdGlvbiBmb3IgZmFpbGVkIHN0cnVjdCBzZV9jbWQKIAkgKi8KQEAgLTIyMTEsOCArMTk3NSw4IEBACiAJCSAqIHdlIGZvcmNlIHRoaXMgc2Vzc2lvbiB0byBmYWxsIGJhY2sgdG8gc2Vzc2lvbgogCQkgKiByZWNvdmVyeS4KIAkJICovCi0JCUNNRF9URk8oY21kKS0+ZmFsbF9iYWNrX3RvX2VybDAoY21kLT5zZV9zZXNzKTsKLQkJQ01EX1RGTyhjbWQpLT5zdG9wX3Nlc3Npb24oY21kLT5zZV9zZXNzLCAwLCAwKTsKKwkJY21kLT5zZV90Zm8tPmZhbGxfYmFja190b19lcmwwKGNtZC0+c2Vfc2Vzcyk7CisJCWNtZC0+c2VfdGZvLT5zdG9wX3Nlc3Npb24oY21kLT5zZV9zZXNzLCAwLCAwKTsKIAogCQlnb3RvIGNoZWNrX3N0b3A7CiAJY2FzZSBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRToKQEAgLTIyNDAsMTMgKzIwMDQsMTUgQEAKIAkJICoKIAkJICogU2VlIHNwYzRyMTcsIHNlY3Rpb24gNy40LjYgQ29udHJvbCBNb2RlIFBhZ2UsIFRhYmxlIDM0OQogCQkgKi8KLQkJaWYgKFNFX1NFU1MoY21kKSAmJgotCQkgICAgREVWX0FUVFJJQihjbWQtPnNlX2RldiktPmVtdWxhdGVfdWFfaW50bGNrX2N0cmwgPT0gMikKLQkJCWNvcmVfc2NzaTNfdWFfYWxsb2NhdGUoU0VfU0VTUyhjbWQpLT5zZV9ub2RlX2FjbCwKKwkJaWYgKGNtZC0+c2Vfc2VzcyAmJgorCQkgICAgY21kLT5zZV9kZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV91YV9pbnRsY2tfY3RybCA9PSAyKQorCQkJY29yZV9zY3NpM191YV9hbGxvY2F0ZShjbWQtPnNlX3Nlc3MtPnNlX25vZGVfYWNsLAogCQkJCWNtZC0+b3JpZ19mZV9sdW4sIDB4MkMsCiAJCQkJQVNDUV8yQ0hfUFJFVklPVVNfUkVTRVJWQVRJT05fQ09ORkxJQ1RfU1RBVFVTKTsKIAotCQlDTURfVEZPKGNtZCktPnF1ZXVlX3N0YXR1cyhjbWQpOworCQlyZXQgPSBjbWQtPnNlX3Rmby0+cXVldWVfc3RhdHVzKGNtZCk7CisJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCWdvdG8gcXVldWVfZnVsbDsKIAkJZ290byBjaGVja19zdG9wOwogCWNhc2UgUFlYX1RSQU5TUE9SVF9VU0VfU0VOU0VfUkVBU09OOgogCQkvKgpAQCAtMjI1NCw4ICsyMDIwLDggQEAKIAkJICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5rbm93biB0cmFuc3BvcnQgZXJyb3IgZm9yIENEQiAweCUwMng6ICVkXG4iLAotCQkJVF9UQVNLKGNtZCktPnRfdGFza19jZGJbMF0sCisJCXByX2VycigiVW5rbm93biB0cmFuc3BvcnQgZXJyb3IgZm9yIENEQiAweCUwMng6ICVkXG4iLAorCQkJY21kLT50X3Rhc2tfY2RiWzBdLAogCQkJY21kLT50cmFuc3BvcnRfZXJyb3Jfc3RhdHVzKTsKIAkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9VTlNVUFBPUlRFRF9TQ1NJX09QQ09ERTsKIAkJYnJlYWs7CkBAIC0yMjYzLDMyICsyMDI5LDQxIEBACiAKIAlpZiAoIXNjKQogCQl0cmFuc3BvcnRfbmV3X2NtZF9mYWlsdXJlKGNtZCk7Ci0JZWxzZQotCQl0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKGNtZCwKLQkJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24sIDApOworCWVsc2UgeworCQlyZXQgPSB0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKGNtZCwKKwkJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uLCAwKTsKKwkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJZ290byBxdWV1ZV9mdWxsOworCX0KKwogY2hlY2tfc3RvcDoKIAl0cmFuc3BvcnRfbHVuX3JlbW92ZV9jbWQoY21kKTsKLQlpZiAoISh0cmFuc3BvcnRfY21kX2NoZWNrX3N0b3BfdG9fZmFicmljKGNtZCkpKQorCWlmICghdHJhbnNwb3J0X2NtZF9jaGVja19zdG9wX3RvX2ZhYnJpYyhjbWQpKQogCQk7CisJcmV0dXJuOworCitxdWV1ZV9mdWxsOgorCWNtZC0+dF9zdGF0ZSA9IFRSQU5TUE9SVF9DT01QTEVURV9PSzsKKwl0cmFuc3BvcnRfaGFuZGxlX3F1ZXVlX2Z1bGwoY21kLCBjbWQtPnNlX2RldiwgdHJhbnNwb3J0X2NvbXBsZXRlX3FmKTsKIH0KIAogc3RhdGljIHZvaWQgdHJhbnNwb3J0X2RpcmVjdF9yZXF1ZXN0X3RpbWVvdXQoc3RydWN0IHNlX2NtZCAqY21kKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCWlmICghKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfdGltZW91dCkpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X3RpbWVvdXQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9Ci0JaWYgKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90YXNrX2NkYnNfdGltZW91dF9sZWZ0KSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKGF0b21pY19yZWFkKCZjbWQtPnRfdGFza19jZGJzX3RpbWVvdXRfbGVmdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAotCWF0b21pY19zdWIoYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF90aW1lb3V0KSwKLQkJICAgJlRfVEFTSyhjbWQpLT50X3NlX2NvdW50KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJYXRvbWljX3N1YihhdG9taWNfcmVhZCgmY21kLT50X3RyYW5zcG9ydF90aW1lb3V0KSwKKwkJICAgJmNtZC0+dF9zZV9jb3VudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF90aW1lb3V0KHN0cnVjdCBzZV9jbWQgKmNtZCkKQEAgLTIyOTYsMzUgKzIwNzEsMTggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyoKLQkgKiBSZXNldCBUX1RBU0soY21kKS0+dF9zZV9jb3VudCB0byBhbGxvdyB0cmFuc3BvcnRfZ2VuZXJpY19yZW1vdmUoKQorCSAqIFJlc2V0IGNtZC0+dF9zZV9jb3VudCB0byBhbGxvdyB0cmFuc3BvcnRfZ2VuZXJpY19yZW1vdmUoKQogCSAqIHRvIGFsbG93IGxhc3QgY2FsbCB0byBmcmVlIG1lbW9yeSByZXNvdXJjZXMuCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQlpZiAoYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF90aW1lb3V0KSA+IDEpIHsKLQkJaW50IHRtcCA9IChhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X3RpbWVvdXQpIC0gMSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKGF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X3RpbWVvdXQpID4gMSkgeworCQlpbnQgdG1wID0gKGF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X3RpbWVvdXQpIC0gMSk7CiAKLQkJYXRvbWljX3N1Yih0bXAsICZUX1RBU0soY21kKS0+dF9zZV9jb3VudCk7CisJCWF0b21pY19zdWIodG1wLCAmY21kLT50X3NlX2NvdW50KTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKLQl0cmFuc3BvcnRfZ2VuZXJpY19yZW1vdmUoY21kLCAwLCAwKTsKLX0KLQotc3RhdGljIGludAotdHJhbnNwb3J0X2dlbmVyaWNfYWxsb2NhdGVfYnVmKHN0cnVjdCBzZV9jbWQgKmNtZCwgdTMyIGRhdGFfbGVuZ3RoKQotewotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLQotCWJ1ZiA9IGt6YWxsb2MoZGF0YV9sZW5ndGgsIEdGUF9LRVJORUwpOwotCWlmICghKGJ1ZikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBidWZmZXJcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JVF9UQVNLKGNtZCktPnRfdGFza3Nfc2VfbnVtID0gMDsKLQlUX1RBU0soY21kKS0+dF90YXNrX2J1ZiA9IGJ1ZjsKLQotCXJldHVybiAwOworCXRyYW5zcG9ydF9nZW5lcmljX3JlbW92ZShjbWQsIDApOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiB0cmFuc3BvcnRfbGJhXzIxKHVuc2lnbmVkIGNoYXIgKmNkYikKQEAgLTIzNjQsOSArMjEyMiw5IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZUX1RBU0soc2VfY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlX2NtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJc2VfY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NVUFBPUlRFRF9TQU1fT1BDT0RFOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhzZV9jbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZV9jbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtMjM3NSwxNCArMjEzMywxNCBAQAogc3RhdGljIHZvaWQgdHJhbnNwb3J0X3Rhc2tfdGltZW91dF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3Qgc2VfdGFzayAqdGFzayA9IChzdHJ1Y3Qgc2VfdGFzayAqKWRhdGE7Ci0Jc3RydWN0IHNlX2NtZCAqY21kID0gVEFTS19DTUQodGFzayk7CisJc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURFQlVHX1RUKCJ0cmFuc3BvcnQgdGFzayB0aW1lb3V0IGZpcmVkISB0YXNrOiAlcCBjbWQ6ICVwXG4iLCB0YXNrLCBjbWQpOworCXByX2RlYnVnKCJ0cmFuc3BvcnQgdGFzayB0aW1lb3V0IGZpcmVkISB0YXNrOiAlcCBjbWQ6ICVwXG4iLCB0YXNrLCBjbWQpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAlpZiAodGFzay0+dGFza19mbGFncyAmIFRGX1NUT1ApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCXRhc2stPnRhc2tfZmxhZ3MgJj0gflRGX1JVTk5JTkc7CkBAIC0yMzkwLDQ2ICsyMTQ4LDQ2IEBACiAJLyoKIAkgKiBEZXRlcm1pbmUgaWYgdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2soKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4KIAkgKi8KLQlpZiAoIShhdG9taWNfcmVhZCgmdGFzay0+dGFza19hY3RpdmUpKSkgewotCQlERUJVR19UVCgidHJhbnNwb3J0IHRhc2s6ICVwIGNtZDogJXAgdGltZW91dCB0YXNrX2FjdGl2ZSIKKwlpZiAoIWF0b21pY19yZWFkKCZ0YXNrLT50YXNrX2FjdGl2ZSkpIHsKKwkJcHJfZGVidWcoInRyYW5zcG9ydCB0YXNrOiAlcCBjbWQ6ICVwIHRpbWVvdXQgdGFza19hY3RpdmUiCiAJCQkJIiA9PSAwXG4iLCB0YXNrLCBjbWQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CiAKLQlhdG9taWNfaW5jKCZUX1RBU0soY21kKS0+dF9zZV9jb3VudCk7Ci0JYXRvbWljX2luYygmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X3RpbWVvdXQpOwotCVRfVEFTSyhjbWQpLT50X3Rhc2tzX2ZhaWxlZCA9IDE7CisJYXRvbWljX2luYygmY21kLT50X3NlX2NvdW50KTsKKwlhdG9taWNfaW5jKCZjbWQtPnRfdHJhbnNwb3J0X3RpbWVvdXQpOworCWNtZC0+dF90YXNrc19mYWlsZWQgPSAxOwogCiAJYXRvbWljX3NldCgmdGFzay0+dGFza190aW1lb3V0LCAxKTsKIAl0YXNrLT50YXNrX2Vycm9yX3N0YXR1cyA9IFBZWF9UUkFOU1BPUlRfVEFTS19USU1FT1VUOwogCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSAxOwogCiAJaWYgKGF0b21pY19yZWFkKCZ0YXNrLT50YXNrX3N0b3ApKSB7Ci0JCURFQlVHX1RUKCJ0cmFuc3BvcnQgdGFzazogJXAgY21kOiAlcCB0aW1lb3V0IHRhc2tfc3RvcCIKKwkJcHJfZGVidWcoInRyYW5zcG9ydCB0YXNrOiAlcCBjbWQ6ICVwIHRpbWVvdXQgdGFza19zdG9wIgogCQkJCSIgPT0gMVxuIiwgdGFzaywgY21kKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCQljb21wbGV0ZSgmdGFzay0+dGFza19zdG9wX2NvbXApOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKCEoYXRvbWljX2RlY19hbmRfdGVzdCgmVF9UQVNLKGNtZCktPnRfdGFza19jZGJzX2xlZnQpKSkgewotCQlERUJVR19UVCgidHJhbnNwb3J0IHRhc2s6ICVwIGNtZDogJXAgdGltZW91dCBub24gemVybyIKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmNtZC0+dF90YXNrX2NkYnNfbGVmdCkpIHsKKwkJcHJfZGVidWcoInRyYW5zcG9ydCB0YXNrOiAlcCBjbWQ6ICVwIHRpbWVvdXQgbm9uIHplcm8iCiAJCQkJIiB0X3Rhc2tfY2Ric19sZWZ0XG4iLCB0YXNrLCBjbWQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9Ci0JREVCVUdfVFQoInRyYW5zcG9ydCB0YXNrOiAlcCBjbWQ6ICVwIHRpbWVvdXQgWkVSTyB0X3Rhc2tfY2Ric19sZWZ0XG4iLAorCXByX2RlYnVnKCJ0cmFuc3BvcnQgdGFzazogJXAgY21kOiAlcCB0aW1lb3V0IFpFUk8gdF90YXNrX2NkYnNfbGVmdFxuIiwKIAkJCXRhc2ssIGNtZCk7CiAKIAljbWQtPnRfc3RhdGUgPSBUUkFOU1BPUlRfQ09NUExFVEVfRkFJTFVSRTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAogCXRyYW5zcG9ydF9hZGRfY21kX3RvX3F1ZXVlKGNtZCwgVFJBTlNQT1JUX0NPTVBMRVRFX0ZBSUxVUkUpOwogfQogCiAvKgotICogQ2FsbGVkIHdpdGggVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jayBoZWxkLgorICogQ2FsbGVkIHdpdGggY21kLT50X3N0YXRlX2xvY2sgaGVsZC4KICAqLwogc3RhdGljIHZvaWQgdHJhbnNwb3J0X3N0YXJ0X3Rhc2tfdGltZXIoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7CkBAIC0yNDQxLDggKzIxOTksOCBAQAogCS8qCiAJICogSWYgdGhlIHRhc2tfdGltZW91dCBpcyBkaXNhYmxlZCwgZXhpdCBub3cuCiAJICovCi0JdGltZW91dCA9IERFVl9BVFRSSUIoZGV2KS0+dGFza190aW1lb3V0OwotCWlmICghKHRpbWVvdXQpKQorCXRpbWVvdXQgPSBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIudGFza190aW1lb3V0OworCWlmICghdGltZW91dCkKIAkJcmV0dXJuOwogCiAJaW5pdF90aW1lcigmdGFzay0+dGFza190aW1lcik7CkBAIC0yNDUzLDI3ICsyMjExLDI3IEBACiAJdGFzay0+dGFza19mbGFncyB8PSBURl9SVU5OSU5HOwogCWFkZF90aW1lcigmdGFzay0+dGFza190aW1lcik7CiAjaWYgMAotCXByaW50ayhLRVJOX0lORk8gIlN0YXJ0aW5nIHRhc2sgdGltZXIgZm9yIGNtZDogJXAgdGFzazogJXAgc2Vjb25kczoiCisJcHJfZGVidWcoIlN0YXJ0aW5nIHRhc2sgdGltZXIgZm9yIGNtZDogJXAgdGFzazogJXAgc2Vjb25kczoiCiAJCSIgJWRcbiIsIHRhc2stPnRhc2tfc2VfY21kLCB0YXNrLCB0aW1lb3V0KTsKICNlbmRpZgogfQogCiAvKgotICogQ2FsbGVkIHdpdGggc3Bpbl9sb2NrX2lycSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaykgaGVsZC4KKyAqIENhbGxlZCB3aXRoIHNwaW5fbG9ja19pcnEoJmNtZC0+dF9zdGF0ZV9sb2NrKSBoZWxkLgogICovCiB2b2lkIF9fdHJhbnNwb3J0X3N0b3BfdGFza190aW1lcihzdHJ1Y3Qgc2VfdGFzayAqdGFzaywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7Ci0Jc3RydWN0IHNlX2NtZCAqY21kID0gVEFTS19DTUQodGFzayk7CisJc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7CiAKLQlpZiAoISh0YXNrLT50YXNrX2ZsYWdzICYgVEZfUlVOTklORykpCisJaWYgKCF0YXNrLT50YXNrX2ZsYWdzICYgVEZfUlVOTklORykKIAkJcmV0dXJuOwogCiAJdGFzay0+dGFza19mbGFncyB8PSBURl9TVE9QOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssICpmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssICpmbGFncyk7CiAKIAlkZWxfdGltZXJfc3luYygmdGFzay0+dGFza190aW1lcik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgKmZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssICpmbGFncyk7CiAJdGFzay0+dGFza19mbGFncyAmPSB+VEZfUlVOTklORzsKIAl0YXNrLT50YXNrX2ZsYWdzICY9IH5URl9TVE9QOwogfQpAQCAtMjQ4MywxMSArMjI0MSwxMSBAQAogCXN0cnVjdCBzZV90YXNrICp0YXNrID0gTlVMTCwgKnRhc2tfdG1wOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YXNrLCB0YXNrX3RtcCwKLQkJCQkmVF9UQVNLKGNtZCktPnRfdGFza19saXN0LCB0X2xpc3QpCisJCQkJJmNtZC0+dF90YXNrX2xpc3QsIHRfbGlzdCkKIAkJX190cmFuc3BvcnRfc3RvcF90YXNrX3RpbWVyKHRhc2ssICZmbGFncyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHRyYW5zcG9ydF90Y3Ffd2luZG93X2Nsb3NlZChzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYpCkBAIC0yNDk4LDcgKzIyNTYsNyBAQAogCX0gZWxzZQogCQltc2xlZXAoUFlYX1RSQU5TUE9SVF9XSU5ET1dfQ0xPU0VEX1dBSVRfTE9ORyk7CiAKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+ZGV2X3F1ZXVlX29iai0+dGhyZWFkX3dxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+ZGV2X3F1ZXVlX29iai50aHJlYWRfd3EpOwogCXJldHVybiAwOwogfQogCkBAIC0yNTExLDQ1ICsyMjY5LDQ1IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHRyYW5zcG9ydF9leGVjdXRlX3Rhc2tfYXR0cihzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7Ci0JaWYgKFNFX0RFVihjbWQpLT5kZXZfdGFza19hdHRyX3R5cGUgIT0gU0FNX1RBU0tfQVRUUl9FTVVMQVRFRCkKKwlpZiAoY21kLT5zZV9kZXYtPmRldl90YXNrX2F0dHJfdHlwZSAhPSBTQU1fVEFTS19BVFRSX0VNVUxBVEVEKQogCQlyZXR1cm4gMTsKIAkvKgogCSAqIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIEhFQURfT0ZfUVVFVUUsIGFuZCBpZiB0cnVlIHJldHVybiAxCiAJICogdG8gYWxsb3cgdGhlIHBhc3NlZCBzdHJ1Y3Qgc2VfY21kIGxpc3Qgb2YgdGFza3MgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0LgogCSAqLwogCSBpZiAoY21kLT5zYW1fdGFza19hdHRyID09IE1TR19IRUFEX1RBRykgewotCQlhdG9taWNfaW5jKCZTRV9ERVYoY21kKS0+ZGV2X2hvcV9jb3VudCk7CisJCWF0b21pY19pbmMoJmNtZC0+c2VfZGV2LT5kZXZfaG9xX2NvdW50KTsKIAkJc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCk7Ci0JCURFQlVHX1NUQSgiQWRkZWQgSEVBRF9PRl9RVUVVRSBmb3IgQ0RCOiIKKwkJcHJfZGVidWcoIkFkZGVkIEhFQURfT0ZfUVVFVUUgZm9yIENEQjoiCiAJCQkiIDB4JTAyeCwgc2Vfb3JkZXJlZF9pZDogJXVcbiIsCi0JCQlUX1RBU0soY21kKS0+dF90YXNrX2NkYlswXSwKKwkJCWNtZC0+dF90YXNrX2NkYlswXSwKIAkJCWNtZC0+c2Vfb3JkZXJlZF9pZCk7CiAJCXJldHVybiAxOwogCX0gZWxzZSBpZiAoY21kLT5zYW1fdGFza19hdHRyID09IE1TR19PUkRFUkVEX1RBRykgewotCQlzcGluX2xvY2soJlNFX0RFVihjbWQpLT5vcmRlcmVkX2NtZF9sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmY21kLT5zZV9vcmRlcmVkX2xpc3QsCi0JCQkJJlNFX0RFVihjbWQpLT5vcmRlcmVkX2NtZF9saXN0KTsKLQkJc3Bpbl91bmxvY2soJlNFX0RFVihjbWQpLT5vcmRlcmVkX2NtZF9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZjbWQtPnNlX2Rldi0+b3JkZXJlZF9jbWRfbG9jayk7CisJCWxpc3RfYWRkX3RhaWwoJmNtZC0+c2Vfb3JkZXJlZF9ub2RlLAorCQkJCSZjbWQtPnNlX2Rldi0+b3JkZXJlZF9jbWRfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZjbWQtPnNlX2Rldi0+b3JkZXJlZF9jbWRfbG9jayk7CiAKLQkJYXRvbWljX2luYygmU0VfREVWKGNtZCktPmRldl9vcmRlcmVkX3N5bmMpOworCQlhdG9taWNfaW5jKCZjbWQtPnNlX2Rldi0+ZGV2X29yZGVyZWRfc3luYyk7CiAJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOwogCi0JCURFQlVHX1NUQSgiQWRkZWQgT1JERVJFRCBmb3IgQ0RCOiAweCUwMnggdG8gb3JkZXJlZCIKKwkJcHJfZGVidWcoIkFkZGVkIE9SREVSRUQgZm9yIENEQjogMHglMDJ4IHRvIG9yZGVyZWQiCiAJCQkJIiBsaXN0LCBzZV9vcmRlcmVkX2lkOiAldVxuIiwKLQkJCQlUX1RBU0soY21kKS0+dF90YXNrX2NkYlswXSwKKwkJCQljbWQtPnRfdGFza19jZGJbMF0sCiAJCQkJY21kLT5zZV9vcmRlcmVkX2lkKTsKIAkJLyoKIAkJICogQWRkIE9SREVSRUQgY29tbWFuZCB0byB0YWlsIG9mIGV4ZWN1dGlvbiBxdWV1ZSBpZgogCQkgKiBubyBvdGhlciBvbGRlciBjb21tYW5kcyBleGlzdCB0aGF0IG5lZWQgdG8gYmUKIAkJICogY29tcGxldGVkIGZpcnN0LgogCQkgKi8KLQkJaWYgKCEoYXRvbWljX3JlYWQoJlNFX0RFVihjbWQpLT5zaW1wbGVfY21kcykpKQorCQlpZiAoIWF0b21pY19yZWFkKCZjbWQtPnNlX2Rldi0+c2ltcGxlX2NtZHMpKQogCQkJcmV0dXJuIDE7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogRm9yIFNJTVBMRSBhbmQgVU5UQUdHRUQgVGFzayBBdHRyaWJ1dGUgY29tbWFuZHMKIAkJICovCi0JCWF0b21pY19pbmMoJlNFX0RFVihjbWQpLT5zaW1wbGVfY21kcyk7CisJCWF0b21pY19pbmMoJmNtZC0+c2VfZGV2LT5zaW1wbGVfY21kcyk7CiAJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOwogCX0KIAkvKgpAQCAtMjU1NywyMCArMjMxNSwyMCBAQAogCSAqIGFkZCB0aGUgZG9ybWFudCB0YXNrKHMpIGJ1aWx0IGZvciB0aGUgcGFzc2VkIHN0cnVjdCBzZV9jbWQgdG8gdGhlCiAJICogZXhlY3V0aW9uIHF1ZXVlIGFuZCBiZWNvbWUgaW4gQWN0aXZlIHN0YXRlIGZvciB0aGlzIHN0cnVjdCBzZV9kZXZpY2UuCiAJICovCi0JaWYgKGF0b21pY19yZWFkKCZTRV9ERVYoY21kKS0+ZGV2X29yZGVyZWRfc3luYykgIT0gMCkgeworCWlmIChhdG9taWNfcmVhZCgmY21kLT5zZV9kZXYtPmRldl9vcmRlcmVkX3N5bmMpICE9IDApIHsKIAkJLyoKIAkJICogT3RoZXJ3aXNlLCBhZGQgY21kIHcvIHRhc2tzIHRvIGRlbGF5ZWQgY21kIHF1ZXVlIHRoYXQKIAkJICogd2lsbCBiZSBkcmFpbmVkIHVwb24gY29tcGxldGlvbiBvZiBIRUFEX09GX1FVRVVFIHRhc2suCiAJCSAqLwotCQlzcGluX2xvY2soJlNFX0RFVihjbWQpLT5kZWxheWVkX2NtZF9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZjbWQtPnNlX2Rldi0+ZGVsYXllZF9jbWRfbG9jayk7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9ERUxBWUVEX0NNRF9GUk9NX1NBTV9BVFRSOwotCQlsaXN0X2FkZF90YWlsKCZjbWQtPnNlX2RlbGF5ZWRfbGlzdCwKLQkJCQkmU0VfREVWKGNtZCktPmRlbGF5ZWRfY21kX2xpc3QpOwotCQlzcGluX3VubG9jaygmU0VfREVWKGNtZCktPmRlbGF5ZWRfY21kX2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZjbWQtPnNlX2RlbGF5ZWRfbm9kZSwKKwkJCQkmY21kLT5zZV9kZXYtPmRlbGF5ZWRfY21kX2xpc3QpOworCQlzcGluX3VubG9jaygmY21kLT5zZV9kZXYtPmRlbGF5ZWRfY21kX2xvY2spOwogCi0JCURFQlVHX1NUQSgiQWRkZWQgQ0RCOiAweCUwMnggVGFzayBBdHRyOiAweCUwMnggdG8iCisJCXByX2RlYnVnKCJBZGRlZCBDREI6IDB4JTAyeCBUYXNrIEF0dHI6IDB4JTAyeCB0byIKIAkJCSIgZGVsYXllZCBDTUQgbGlzdCwgc2Vfb3JkZXJlZF9pZDogJXVcbiIsCi0JCQlUX1RBU0soY21kKS0+dF90YXNrX2NkYlswXSwgY21kLT5zYW1fdGFza19hdHRyLAorCQkJY21kLT50X3Rhc2tfY2RiWzBdLCBjbWQtPnNhbV90YXNrX2F0dHIsCiAJCQljbWQtPnNlX29yZGVyZWRfaWQpOwogCQkvKgogCQkgKiBSZXR1cm4gemVybyB0byBsZXQgdHJhbnNwb3J0X2V4ZWN1dGVfdGFza3MoKSBrbm93CkBAIC0yNTkyLDI1ICsyMzUwLDIzIEBACiB7CiAJaW50IGFkZF90YXNrczsKIAotCWlmICghKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NFX0RJU0FCTEVfT05MSU5FX0NIRUNLKSkgewotCQlpZiAoc2VfZGV2X2NoZWNrX29ubGluZShjbWQtPnNlX29yaWdfb2JqX3B0cikgIT0gMCkgewotCQkJY21kLT50cmFuc3BvcnRfZXJyb3Jfc3RhdHVzID0KLQkJCQlQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKLQkJCXRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShjbWQsIE5VTEwsIDAsIDEpOwotCQkJcmV0dXJuIDA7Ci0JCX0KKwlpZiAoc2VfZGV2X2NoZWNrX29ubGluZShjbWQtPnNlX29yaWdfb2JqX3B0cikgIT0gMCkgeworCQljbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMgPSBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKKwkJdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKGNtZCwgTlVMTCwgMCwgMSk7CisJCXJldHVybiAwOwogCX0KKwogCS8qCiAJICogQ2FsbCB0cmFuc3BvcnRfY21kX2NoZWNrX3N0b3AoKSB0byBzZWUgaWYgYSBmYWJyaWMgZXhjZXB0aW9uCiAJICogaGFzIG9jY3VycmVkIHRoYXQgcHJldmVudHMgZXhlY3V0aW9uLgogCSAqLwotCWlmICghKHRyYW5zcG9ydF9jbWRfY2hlY2tfc3RvcChjbWQsIDAsIFRSQU5TUE9SVF9QUk9DRVNTSU5HKSkpIHsKKwlpZiAoIXRyYW5zcG9ydF9jbWRfY2hlY2tfc3RvcChjbWQsIDAsIFRSQU5TUE9SVF9QUk9DRVNTSU5HKSkgewogCQkvKgogCQkgKiBDaGVjayBmb3IgU0FNIFRhc2sgQXR0cmlidXRlIGVtdWxhdGlvbiBhbmQgSEVBRF9PRl9RVUVVRQogCQkgKiBhdHRyaWJ1dGUgZm9yIHRoZSB0YXNrcyBvZiB0aGUgcmVjZWl2ZWQgc3RydWN0IHNlX2NtZCBDREIKIAkJICovCiAJCWFkZF90YXNrcyA9IHRyYW5zcG9ydF9leGVjdXRlX3Rhc2tfYXR0cihjbWQpOwotCQlpZiAoYWRkX3Rhc2tzID09IDApCisJCWlmICghYWRkX3Rhc2tzKQogCQkJZ290byBleGVjdXRlX3Rhc2tzOwogCQkvKgogCQkgKiBUaGlzIGNhbGxzIHRyYW5zcG9ydF9hZGRfdGFza3NfZnJvbV9jbWQoKSB0byBoYW5kbGUKQEAgLTI2MjUsNyArMjM4MSw3IEBACiAJICogc3RvcmFnZSBvYmplY3QuCiAJICovCiBleGVjdXRlX3Rhc2tzOgotCV9fdHJhbnNwb3J0X2V4ZWN1dGVfdGFza3MoU0VfREVWKGNtZCkpOworCV9fdHJhbnNwb3J0X2V4ZWN1dGVfdGFza3MoY21kLT5zZV9kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0yNjM5LDUxICsyMzk1LDQ5IEBACiB7CiAJaW50IGVycm9yOwogCXN0cnVjdCBzZV9jbWQgKmNtZCA9IE5VTEw7Ci0Jc3RydWN0IHNlX3Rhc2sgKnRhc2s7CisJc3RydWN0IHNlX3Rhc2sgKnRhc2sgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKgogCSAqIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCByb29tIGluIHRoZSBkZXZpY2UgYW5kIEhCQSBxdWV1ZSB0byBzZW5kCi0JICogc3RydWN0IHNlX3RyYW5zcG9ydF90YXNrJ3MgdG8gdGhlIHNlbGVjdGVkIHRyYW5zcG9ydC4KKwkgKiBzdHJ1Y3Qgc2VfdGFza3MgdG8gdGhlIHNlbGVjdGVkIHRyYW5zcG9ydC4KIAkgKi8KIGNoZWNrX2RlcHRoOgotCXNwaW5fbG9ja19pcnFzYXZlKCZTRV9IQkEoZGV2KS0+aGJhX3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlpZiAoIShhdG9taWNfcmVhZCgmZGV2LT5kZXB0aF9sZWZ0KSkgfHwKLQkgICAgIShhdG9taWNfcmVhZCgmU0VfSEJBKGRldiktPmxlZnRfcXVldWVfZGVwdGgpKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZTRV9IQkEoZGV2KS0+aGJhX3F1ZXVlX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWF0b21pY19yZWFkKCZkZXYtPmRlcHRoX2xlZnQpKQogCQlyZXR1cm4gdHJhbnNwb3J0X3RjcV93aW5kb3dfY2xvc2VkKGRldik7Ci0JfQorCiAJZGV2LT5kZXZfdGNxX3dpbmRvd19jbG9zZWQgPSAwOwogCi0Jc3Bpbl9sb2NrKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrKTsKLQl0YXNrID0gdHJhbnNwb3J0X2dldF90YXNrX2Zyb21fZXhlY3V0ZV9xdWV1ZShkZXYpOwotCXNwaW5fdW5sb2NrKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrKTsKLQotCWlmICghdGFzaykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZTRV9IQkEoZGV2KS0+aGJhX3F1ZXVlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmZGV2LT5leGVjdXRlX3Rhc2tfbGlzdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQorCXRhc2sgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXYtPmV4ZWN1dGVfdGFza19saXN0LAorCQkJCXN0cnVjdCBzZV90YXNrLCB0X2V4ZWN1dGVfbGlzdCk7CisJbGlzdF9kZWwoJnRhc2stPnRfZXhlY3V0ZV9saXN0KTsKKwlhdG9taWNfc2V0KCZ0YXNrLT50YXNrX2V4ZWN1dGVfcXVldWUsIDApOworCWF0b21pY19kZWMoJmRldi0+ZXhlY3V0ZV90YXNrcyk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrKTsKIAogCWF0b21pY19kZWMoJmRldi0+ZGVwdGhfbGVmdCk7Ci0JYXRvbWljX2RlYygmU0VfSEJBKGRldiktPmxlZnRfcXVldWVfZGVwdGgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlNFX0hCQShkZXYpLT5oYmFfcXVldWVfbG9jaywgZmxhZ3MpOwogCi0JY21kID0gVEFTS19DTUQodGFzayk7CisJY21kID0gdGFzay0+dGFza19zZV9jbWQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCWF0b21pY19zZXQoJnRhc2stPnRhc2tfYWN0aXZlLCAxKTsKIAlhdG9taWNfc2V0KCZ0YXNrLT50YXNrX3NlbnQsIDEpOwotCWF0b21pY19pbmMoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19zZW50KTsKKwlhdG9taWNfaW5jKCZjbWQtPnRfdGFza19jZGJzX3NlbnQpOwogCi0JaWYgKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90YXNrX2NkYnNfc2VudCkgPT0KLQkgICAgVF9UQVNLKGNtZCktPnRfdGFza19jZGJzKQorCWlmIChhdG9taWNfcmVhZCgmY21kLT50X3Rhc2tfY2Ric19zZW50KSA9PQorCSAgICBjbWQtPnRfdGFza19saXN0X251bSkKIAkJYXRvbWljX3NldCgmY21kLT50cmFuc3BvcnRfc2VudCwgMSk7CiAKIAl0cmFuc3BvcnRfc3RhcnRfdGFza190aW1lcih0YXNrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAkvKgogCSAqIFRoZSBzdHJ1Y3Qgc2VfY21kLT50cmFuc3BvcnRfZW11bGF0ZV9jZGIoKSBmdW5jdGlvbiBwb2ludGVyIGlzIHVzZWQKLQkgKiB0byBncmFiIFJFUE9SVF9MVU5TIENEQnMgYmVmb3JlIHRoZXkgaGl0IHRoZQorCSAqIHRvIGdyYWIgUkVQT1JUX0xVTlMgYW5kIG90aGVyIENEQnMgd2Ugd2FudCB0byBoYW5kbGUgYmVmb3JlIHRoZXkgaGl0IHRoZQogCSAqIHN0cnVjdCBzZV9zdWJzeXN0ZW1fYXBpLT5kb190YXNrKCkgY2FsbGVyIGJlbG93LgogCSAqLwogCWlmIChjbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYikgewpAQCAtMjcxOCwxMSArMjQ3MiwxMSBAQAogCQkgKiBjYWxsIC0+ZG9fdGFzaygpIGRpcmVjdGx5IGFuZCBsZXQgdGhlIHVuZGVybHlpbmcgVENNIHN1YnN5c3RlbSBwbHVnaW4KIAkJICogY29kZSBoYW5kbGUgdGhlIENEQiBlbXVsYXRpb24uCiAJCSAqLwotCQlpZiAoKFRSQU5TUE9SVChkZXYpLT50cmFuc3BvcnRfdHlwZSAhPSBUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVikgJiYKLQkJICAgICghKFRBU0tfQ01EKHRhc2spLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQikpKQorCQlpZiAoKGRldi0+dHJhbnNwb3J0LT50cmFuc3BvcnRfdHlwZSAhPSBUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVikgJiYKKwkJICAgICghKHRhc2stPnRhc2tfc2VfY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQikpKQogCQkJZXJyb3IgPSB0cmFuc3BvcnRfZW11bGF0ZV9jb250cm9sX2NkYih0YXNrKTsKIAkJZWxzZQotCQkJZXJyb3IgPSBUUkFOU1BPUlQoZGV2KS0+ZG9fdGFzayh0YXNrKTsKKwkJCWVycm9yID0gZGV2LT50cmFuc3BvcnQtPmRvX3Rhc2sodGFzayk7CiAKIAkJaWYgKGVycm9yICE9IDApIHsKIAkJCWNtZC0+dHJhbnNwb3J0X2Vycm9yX3N0YXR1cyA9IGVycm9yOwpAQCAtMjc0NSwxMiArMjQ5OSwxMCBAQAogCSAqIEFueSB1bnNvbGljaXRlZCBkYXRhIHdpbGwgZ2V0IGR1bXBlZCBmb3IgZmFpbGVkIGNvbW1hbmQgaW5zaWRlIG9mCiAJICogdGhlIGZhYnJpYyBwbHVnaW4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKHNlX2NtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzZV9jbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TRV9DTURfRkFJTEVEOwogCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKHNlX2NtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCi0JQ01EX1RGTyhzZV9jbWQpLT5uZXdfY21kX2ZhaWx1cmUoc2VfY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZV9jbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCB0cmFuc3BvcnRfbm9wX3dhaXRfZm9yX3Rhc2tzKHN0cnVjdCBzZV9jbWQgKiwgaW50LCBpbnQpOwpAQCAtMjc2MCw3ICsyNTEyLDcgQEAKIAlzdHJ1Y3Qgc2VfY21kICpjbWQsCiAJaW50ICpyZXQpCiB7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfTFVOKGNtZCktPmx1bl9zZV9kZXY7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAKIAkvKgogCSAqIEFzc3VtZSBUWVBFX0RJU0sgZm9yIG5vbiBzdHJ1Y3Qgc2VfZGV2aWNlIG9iamVjdHMuCkBAIC0yNzcyLDcgKzI1MjQsNyBAQAogCS8qCiAJICogVXNlIDI0LWJpdCBhbGxvY2F0aW9uIGxlbmd0aCBmb3IgVFlQRV9UQVBFLgogCSAqLwotCWlmIChUUkFOU1BPUlQoZGV2KS0+Z2V0X2RldmljZV90eXBlKGRldikgPT0gVFlQRV9UQVBFKQorCWlmIChkZXYtPnRyYW5zcG9ydC0+Z2V0X2RldmljZV90eXBlKGRldikgPT0gVFlQRV9UQVBFKQogCQlyZXR1cm4gKHUzMikoY2RiWzJdIDw8IDE2KSArIChjZGJbM10gPDwgOCkgKyBjZGJbNF07CiAKIAkvKgpAQCAtMjc4OCw3ICsyNTQwLDcgQEAKIAlzdHJ1Y3Qgc2VfY21kICpjbWQsCiAJaW50ICpyZXQpCiB7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfTFVOKGNtZCktPmx1bl9zZV9kZXY7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAKIAkvKgogCSAqIEFzc3VtZSBUWVBFX0RJU0sgZm9yIG5vbiBzdHJ1Y3Qgc2VfZGV2aWNlIG9iamVjdHMuCkBAIC0yODAwLDggKzI1NTIsOCBAQAogCS8qCiAJICogWFhYXzEwIGlzIG5vdCBkZWZpbmVkIGluIFNTQywgdGhyb3cgYW4gZXhjZXB0aW9uCiAJICovCi0JaWYgKFRSQU5TUE9SVChkZXYpLT5nZXRfZGV2aWNlX3R5cGUoZGV2KSA9PSBUWVBFX1RBUEUpIHsKLQkJKnJldCA9IC0xOworCWlmIChkZXYtPnRyYW5zcG9ydC0+Z2V0X2RldmljZV90eXBlKGRldikgPT0gVFlQRV9UQVBFKSB7CisJCSpyZXQgPSAtRUlOVkFMOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTI4MTgsNyArMjU3MCw3IEBACiAJc3RydWN0IHNlX2NtZCAqY21kLAogCWludCAqcmV0KQogewotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0xVTihjbWQpLT5sdW5fc2VfZGV2OworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCiAJLyoKIAkgKiBBc3N1bWUgVFlQRV9ESVNLIGZvciBub24gc3RydWN0IHNlX2RldmljZSBvYmplY3RzLgpAQCAtMjgzMCw4ICsyNTgyLDggQEAKIAkvKgogCSAqIFhYWF8xMiBpcyBub3QgZGVmaW5lZCBpbiBTU0MsIHRocm93IGFuIGV4Y2VwdGlvbgogCSAqLwotCWlmIChUUkFOU1BPUlQoZGV2KS0+Z2V0X2RldmljZV90eXBlKGRldikgPT0gVFlQRV9UQVBFKSB7Ci0JCSpyZXQgPSAtMTsKKwlpZiAoZGV2LT50cmFuc3BvcnQtPmdldF9kZXZpY2VfdHlwZShkZXYpID09IFRZUEVfVEFQRSkgeworCQkqcmV0ID0gLUVJTlZBTDsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yODQ4LDcgKzI2MDAsNyBAQAogCXN0cnVjdCBzZV9jbWQgKmNtZCwKIAlpbnQgKnJldCkKIHsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBTRV9MVU4oY21kKS0+bHVuX3NlX2RldjsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAogCS8qCiAJICogQXNzdW1lIFRZUEVfRElTSyBmb3Igbm9uIHN0cnVjdCBzZV9kZXZpY2Ugb2JqZWN0cy4KQEAgLTI4NjAsNyArMjYxMiw3IEBACiAJLyoKIAkgKiBVc2UgMjQtYml0IGFsbG9jYXRpb24gbGVuZ3RoIGZvciBUWVBFX1RBUEUuCiAJICovCi0JaWYgKFRSQU5TUE9SVChkZXYpLT5nZXRfZGV2aWNlX3R5cGUoZGV2KSA9PSBUWVBFX1RBUEUpCisJaWYgKGRldi0+dHJhbnNwb3J0LT5nZXRfZGV2aWNlX3R5cGUoZGV2KSA9PSBUWVBFX1RBUEUpCiAJCXJldHVybiAodTMyKShjZGJbMTJdIDw8IDE2KSArIChjZGJbMTNdIDw8IDgpICsgY2RiWzE0XTsKIAogdHlwZV9kaXNrOgpAQCAtMjg5MCw1NyArMjY0MiwzMCBAQAogCXVuc2lnbmVkIGNoYXIgKmNkYiwKIAlzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfREVWKGNtZCk7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAKLQlpZiAoVFJBTlNQT1JUKGRldiktPmdldF9kZXZpY2VfdHlwZShkZXYpID09IFRZUEVfVEFQRSkgeworCWlmIChkZXYtPnRyYW5zcG9ydC0+Z2V0X2RldmljZV90eXBlKGRldikgPT0gVFlQRV9UQVBFKSB7CiAJCWlmIChjZGJbMV0gJiAxKSB7IC8qIHNlY3RvcnMgKi8KLQkJCXJldHVybiBERVZfQVRUUklCKGRldiktPmJsb2NrX3NpemUgKiBzZWN0b3JzOworCQkJcmV0dXJuIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5ibG9ja19zaXplICogc2VjdG9yczsKIAkJfSBlbHNlIC8qIGJ5dGVzICovCiAJCQlyZXR1cm4gc2VjdG9yczsKIAl9CiAjaWYgMAotCXByaW50ayhLRVJOX0lORk8gIlJldHVybmluZyBibG9ja19zaXplOiAldSwgc2VjdG9yczogJXUgPT0gJXUgZm9yIgotCQkJIiAlcyBvYmplY3RcbiIsIERFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSwgc2VjdG9ycywKLQkJCURFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSAqIHNlY3RvcnMsCi0JCQlUUkFOU1BPUlQoZGV2KS0+bmFtZSk7CisJcHJfZGVidWcoIlJldHVybmluZyBibG9ja19zaXplOiAldSwgc2VjdG9yczogJXUgPT0gJXUgZm9yIgorCQkJIiAlcyBvYmplY3RcbiIsIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5ibG9ja19zaXplLCBzZWN0b3JzLAorCQkJZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUgKiBzZWN0b3JzLAorCQkJZGV2LT50cmFuc3BvcnQtPm5hbWUpOwogI2VuZGlmCi0JcmV0dXJuIERFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSAqIHNlY3RvcnM7CisJcmV0dXJuIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5ibG9ja19zaXplICogc2VjdG9yczsKIH0KIAotdW5zaWduZWQgY2hhciB0cmFuc3BvcnRfYXNjaWloZXhfdG9fYmluYXJ5aGV4KHVuc2lnbmVkIGNoYXIgdmFsWzJdKQotewotCXVuc2lnbmVkIGNoYXIgcmVzdWx0ID0gMDsKLQkvKgotCSAqIE1TQgotCSAqLwotCWlmICgodmFsWzBdID49ICdhJykgJiYgKHZhbFswXSA8PSAnZicpKQotCQlyZXN1bHQgPSAoKHZhbFswXSAtICdhJyArIDEwKSAmIDB4ZikgPDwgNDsKLQllbHNlCi0JCWlmICgodmFsWzBdID49ICdBJykgJiYgKHZhbFswXSA8PSAnRicpKQotCQkJcmVzdWx0ID0gKCh2YWxbMF0gLSAnQScgKyAxMCkgJiAweGYpIDw8IDQ7Ci0JCWVsc2UgLyogZGlnaXQgKi8KLQkJCXJlc3VsdCA9ICgodmFsWzBdIC0gJzAnKSAmIDB4ZikgPDwgNDsKLQkvKgotCSAqIExTQgotCSAqLwotCWlmICgodmFsWzFdID49ICdhJykgJiYgKHZhbFsxXSA8PSAnZicpKQotCQlyZXN1bHQgfD0gKCh2YWxbMV0gLSAnYScgKyAxMCkgJiAweGYpOwotCWVsc2UKLQkJaWYgKCh2YWxbMV0gPj0gJ0EnKSAmJiAodmFsWzFdIDw9ICdGJykpCi0JCQlyZXN1bHQgfD0gKCh2YWxbMV0gLSAnQScgKyAxMCkgJiAweGYpOwotCQllbHNlIC8qIGRpZ2l0ICovCi0JCQlyZXN1bHQgfD0gKCh2YWxbMV0gLSAnMCcpICYgMHhmKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHRyYW5zcG9ydF9hc2NpaWhleF90b19iaW5hcnloZXgpOwotCiBzdGF0aWMgdm9pZCB0cmFuc3BvcnRfeG9yX2NhbGxiYWNrKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKIAl1bnNpZ25lZCBjaGFyICpidWYsICphZGRyOwotCXN0cnVjdCBzZV9tZW0gKnNlX21lbTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCXVuc2lnbmVkIGludCBvZmZzZXQ7CiAJaW50IGk7CisJaW50IGNvdW50OwogCS8qCiAJICogRnJvbSBzYmMzcjIyLnBkZiBzZWN0aW9uIDUuNDggWERXUklURVJFQUQgKDEwKSBjb21tYW5kCiAJICoKQEAgLTI5NTMsMzIgKzI2NzgsMzcgQEAKIAkgKiA1KSB0cmFuc2ZlciB0aGUgcmVzdWx0aW5nIFhPUiBkYXRhIHRvIHRoZSBkYXRhLWluIGJ1ZmZlci4KIAkgKi8KIAlidWYgPSBrbWFsbG9jKGNtZC0+ZGF0YV9sZW5ndGgsIEdGUF9LRVJORUwpOwotCWlmICghKGJ1ZikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgeG9yX2NhbGxiYWNrIGJ1ZlxuIik7CisJaWYgKCFidWYpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgeG9yX2NhbGxiYWNrIGJ1ZlxuIik7CiAJCXJldHVybjsKIAl9CiAJLyoKLQkgKiBDb3B5IHRoZSBzY2F0dGVybGlzdCBXUklURSBidWZmZXIgbG9jYXRlZCBhdCBUX1RBU0soY21kKS0+dF9tZW1fbGlzdAorCSAqIENvcHkgdGhlIHNjYXR0ZXJsaXN0IFdSSVRFIGJ1ZmZlciBsb2NhdGVkIGF0IGNtZC0+dF9kYXRhX3NnCiAJICogaW50byB0aGUgbG9jYWxseSBhbGxvY2F0ZWQgKmJ1ZgogCSAqLwotCXRyYW5zcG9ydF9tZW1jcHlfc2VfbWVtX3JlYWRfY29udGlnKGNtZCwgYnVmLCBUX1RBU0soY21kKS0+dF9tZW1fbGlzdCk7CisJc2dfY29weV90b19idWZmZXIoY21kLT50X2RhdGFfc2csCisJCQkgIGNtZC0+dF9kYXRhX25lbnRzLAorCQkJICBidWYsCisJCQkgIGNtZC0+ZGF0YV9sZW5ndGgpOworCiAJLyoKIAkgKiBOb3cgcGVyZm9ybSB0aGUgWE9SIGFnYWluc3QgdGhlIEJJREkgcmVhZCBtZW1vcnkgbG9jYXRlZCBhdAotCSAqIFRfVEFTSyhjbWQpLT50X21lbV9iaWRpX2xpc3QKKwkgKiBjbWQtPnRfbWVtX2JpZGlfbGlzdAogCSAqLwogCiAJb2Zmc2V0ID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlX21lbSwgVF9UQVNLKGNtZCktPnRfbWVtX2JpZGlfbGlzdCwgc2VfbGlzdCkgewotCQlhZGRyID0gKHVuc2lnbmVkIGNoYXIgKilrbWFwX2F0b21pYyhzZV9tZW0tPnNlX3BhZ2UsIEtNX1VTRVIwKTsKLQkJaWYgKCEoYWRkcikpCisJZm9yX2VhY2hfc2coY21kLT50X2JpZGlfZGF0YV9zZywgc2csIGNtZC0+dF9iaWRpX2RhdGFfbmVudHMsIGNvdW50KSB7CisJCWFkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnKSwgS01fVVNFUjApOworCQlpZiAoIWFkZHIpCiAJCQlnb3RvIG91dDsKIAotCQlmb3IgKGkgPSAwOyBpIDwgc2VfbWVtLT5zZV9sZW47IGkrKykKLQkJCSooYWRkciArIHNlX21lbS0+c2Vfb2ZmICsgaSkgXj0gKihidWYgKyBvZmZzZXQgKyBpKTsKKwkJZm9yIChpID0gMDsgaSA8IHNnLT5sZW5ndGg7IGkrKykKKwkJCSooYWRkciArIHNnLT5vZmZzZXQgKyBpKSBePSAqKGJ1ZiArIG9mZnNldCArIGkpOwogCi0JCW9mZnNldCArPSBzZV9tZW0tPnNlX2xlbjsKKwkJb2Zmc2V0ICs9IHNnLT5sZW5ndGg7CiAJCWt1bm1hcF9hdG9taWMoYWRkciwgS01fVVNFUjApOwogCX0KKwogb3V0OgogCWtmcmVlKGJ1Zik7CiB9CkBAIC0yOTk0LDc1ICsyNzI0LDYwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgb2Zmc2V0ID0gMDsKIAotCWlmICghU0VfTFVOKGNtZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTRV9MVU4oY21kKSBpcyBOVUxMXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCVdBUk5fT04oIWNtZC0+c2VfbHVuKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCWlmIChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TRU5UX0NIRUNLX0NPTkRJVElPTikgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YXNrLCB0YXNrX3RtcCwKLQkJCQkmVF9UQVNLKGNtZCktPnRfdGFza19saXN0LCB0X2xpc3QpIHsKKwkJCQkmY21kLT50X3Rhc2tfbGlzdCwgdF9saXN0KSB7CiAKIAkJaWYgKCF0YXNrLT50YXNrX3NlbnNlKQogCQkJY29udGludWU7CiAKIAkJZGV2ID0gdGFzay0+c2VfZGV2OwotCQlpZiAoIShkZXYpKQorCQlpZiAoIWRldikKIAkJCWNvbnRpbnVlOwogCi0JCWlmICghVFJBTlNQT1JUKGRldiktPmdldF9zZW5zZV9idWZmZXIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVFJBTlNQT1JUKGRldiktPmdldF9zZW5zZV9idWZmZXIiCisJCWlmICghZGV2LT50cmFuc3BvcnQtPmdldF9zZW5zZV9idWZmZXIpIHsKKwkJCXByX2VycigiZGV2LT50cmFuc3BvcnQtPmdldF9zZW5zZV9idWZmZXIiCiAJCQkJCSIgaXMgTlVMTFxuIik7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXNlbnNlX2J1ZmZlciA9IFRSQU5TUE9SVChkZXYpLT5nZXRfc2Vuc2VfYnVmZmVyKHRhc2spOwotCQlpZiAoIShzZW5zZV9idWZmZXIpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIklUVFsweCUwOHhdX1RBU0tbJWRdOiBVbmFibGUgdG8gbG9jYXRlIgorCQlzZW5zZV9idWZmZXIgPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X3NlbnNlX2J1ZmZlcih0YXNrKTsKKwkJaWYgKCFzZW5zZV9idWZmZXIpIHsKKwkJCXByX2VycigiSVRUWzB4JTA4eF1fVEFTS1slZF06IFVuYWJsZSB0byBsb2NhdGUiCiAJCQkJIiBzZW5zZSBidWZmZXIgZm9yIHRhc2sgd2l0aCBzZW5zZVxuIiwKLQkJCQlDTURfVEZPKGNtZCktPmdldF90YXNrX3RhZyhjbWQpLCB0YXNrLT50YXNrX25vKTsKKwkJCQljbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCksIHRhc2stPnRhc2tfbm8pOwogCQkJY29udGludWU7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCi0JCW9mZnNldCA9IENNRF9URk8oY21kKS0+c2V0X2ZhYnJpY19zZW5zZV9sZW4oY21kLAorCQlvZmZzZXQgPSBjbWQtPnNlX3Rmby0+c2V0X2ZhYnJpY19zZW5zZV9sZW4oY21kLAogCQkJCVRSQU5TUE9SVF9TRU5TRV9CVUZGRVIpOwogCi0JCW1lbWNweSgodm9pZCAqKSZidWZmZXJbb2Zmc2V0XSwgKHZvaWQgKilzZW5zZV9idWZmZXIsCisJCW1lbWNweSgmYnVmZmVyW29mZnNldF0sIHNlbnNlX2J1ZmZlciwKIAkJCQlUUkFOU1BPUlRfU0VOU0VfQlVGRkVSKTsKIAkJY21kLT5zY3NpX3N0YXR1cyA9IHRhc2stPnRhc2tfc2NzaV9zdGF0dXM7CiAJCS8qIEF1dG9tYXRpY2FsbHkgcGFkZGVkICovCiAJCWNtZC0+c2NzaV9zZW5zZV9sZW5ndGggPQogCQkJCShUUkFOU1BPUlRfU0VOU0VfQlVGRkVSICsgb2Zmc2V0KTsKIAotCQlwcmludGsoS0VSTl9JTkZPICJIQkFfWyV1XV9QTFVHWyVzXTogU2V0IFNBTSBTVEFUVVM6IDB4JTAyeCIKKwkJcHJfZGVidWcoIkhCQV9bJXVdX1BMVUdbJXNdOiBTZXQgU0FNIFNUQVRVUzogMHglMDJ4IgogCQkJCSIgYW5kIHNlbnNlXG4iLAotCQkJZGV2LT5zZV9oYmEtPmhiYV9pZCwgVFJBTlNQT1JUKGRldiktPm5hbWUsCisJCQlkZXYtPnNlX2hiYS0+aGJhX2lkLCBkZXYtPnRyYW5zcG9ydC0+bmFtZSwKIAkJCQljbWQtPnNjc2lfc3RhdHVzKTsKIAkJcmV0dXJuIDA7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IHRyYW5zcG9ydF9hbGxvY2F0ZV9yZXNvdXJjZXMoc3RydWN0IHNlX2NtZCAqY21kKQotewotCXUzMiBsZW5ndGggPSBjbWQtPmRhdGFfbGVuZ3RoOwotCi0JaWYgKChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCKSB8fAotCSAgICAoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQikpCi0JCXJldHVybiB0cmFuc3BvcnRfZ2VuZXJpY19nZXRfbWVtKGNtZCwgbGVuZ3RoLCBQQUdFX1NJWkUpOwotCWVsc2UgaWYgKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfQ09OVFJPTF9OT05TR19JT19DREIpCi0JCXJldHVybiB0cmFuc3BvcnRfZ2VuZXJpY19hbGxvY2F0ZV9idWYoY21kLCBsZW5ndGgpOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQKIHRyYW5zcG9ydF9oYW5kbGVfcmVzZXJ2YXRpb25fY29uZmxpY3Qoc3RydWN0IHNlX2NtZCAqY21kKQogewpAQCAtMzA3NywxMiArMjc5Miw0MCBAQAogCSAqCiAJICogU2VlIHNwYzRyMTcsIHNlY3Rpb24gNy40LjYgQ29udHJvbCBNb2RlIFBhZ2UsIFRhYmxlIDM0OQogCSAqLwotCWlmIChTRV9TRVNTKGNtZCkgJiYKLQkgICAgREVWX0FUVFJJQihjbWQtPnNlX2RldiktPmVtdWxhdGVfdWFfaW50bGNrX2N0cmwgPT0gMikKLQkJY29yZV9zY3NpM191YV9hbGxvY2F0ZShTRV9TRVNTKGNtZCktPnNlX25vZGVfYWNsLAorCWlmIChjbWQtPnNlX3Nlc3MgJiYKKwkgICAgY21kLT5zZV9kZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV91YV9pbnRsY2tfY3RybCA9PSAyKQorCQljb3JlX3Njc2kzX3VhX2FsbG9jYXRlKGNtZC0+c2Vfc2Vzcy0+c2Vfbm9kZV9hY2wsCiAJCQljbWQtPm9yaWdfZmVfbHVuLCAweDJDLAogCQkJQVNDUV8yQ0hfUFJFVklPVVNfUkVTRVJWQVRJT05fQ09ORkxJQ1RfU1RBVFVTKTsKLQlyZXR1cm4gLTI7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBsb25nIHRyYW5zcG9ydF9kZXZfZW5kX2xiYShzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+dHJhbnNwb3J0LT5nZXRfYmxvY2tzKGRldikgKyAxOworfQorCitzdGF0aWMgaW50IHRyYW5zcG9ydF9jbWRfZ2V0X3ZhbGlkX3NlY3RvcnMoc3RydWN0IHNlX2NtZCAqY21kKQoreworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCXUzMiBzZWN0b3JzOworCisJaWYgKGRldi0+dHJhbnNwb3J0LT5nZXRfZGV2aWNlX3R5cGUoZGV2KSAhPSBUWVBFX0RJU0spCisJCXJldHVybiAwOworCisJc2VjdG9ycyA9IChjbWQtPmRhdGFfbGVuZ3RoIC8gZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUpOworCisJaWYgKChjbWQtPnRfdGFza19sYmEgKyBzZWN0b3JzKSA+IHRyYW5zcG9ydF9kZXZfZW5kX2xiYShkZXYpKSB7CisJCXByX2VycigiTEJBOiAlbGx1IFNlY3RvcnM6ICV1IGV4Y2VlZHMiCisJCQkiIHRyYW5zcG9ydF9kZXZfZW5kX2xiYSgpOiAlbGx1XG4iLAorCQkJY21kLT50X3Rhc2tfbGJhLCBzZWN0b3JzLAorCQkJdHJhbnNwb3J0X2Rldl9lbmRfbGJhKGRldikpOworCQlwcl9lcnIoIiAgV2Ugc2hvdWxkIHJldHVybiBDSEVDS19DT05ESVRJT04iCisJCSAgICAgICAiIGJ1dCB3ZSBkb24ndCB5ZXRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gc2VjdG9yczsKIH0KIAogLyoJdHJhbnNwb3J0X2dlbmVyaWNfY21kX3NlcXVlbmNlcigpOgpAQCAtMzA5OSw3ICsyODQyLDcgQEAKIAlzdHJ1Y3Qgc2VfY21kICpjbWQsCiAJdW5zaWduZWQgY2hhciAqY2RiKQogewotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0RFVihjbWQpOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBkZXYtPnNlX3N1Yl9kZXY7CiAJaW50IHJldCA9IDAsIHNlY3Rvcl9yZXQgPSAwLCBwYXNzdGhyb3VnaDsKIAl1MzIgc2VjdG9ycyA9IDAsIHNpemUgPSAwLCBwcl9yZWdfdHlwZSA9IDA7CkBAIC0zMTEzLDEyICsyODU2LDEyIEBACiAJCQkJJnRyYW5zcG9ydF9ub3Bfd2FpdF9mb3JfdGFza3M7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047CiAJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fQ0hFQ0tfQ09ORElUSU9OX1VOSVRfQVRURU5USU9OOwotCQlyZXR1cm4gLTI7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKgogCSAqIENoZWNrIHN0YXR1cyBvZiBBc3ltbWV0cmljIExvZ2ljYWwgVW5pdCBBc3NpZ25tZW50IHBvcnQKIAkgKi8KLQlyZXQgPSBUMTBfQUxVQShzdV9kZXYpLT5hbHVhX3N0YXRlX2NoZWNrKGNtZCwgY2RiLCAmYWx1YV9hc2NxKTsKKwlyZXQgPSBzdV9kZXYtPnQxMF9hbHVhLmFsdWFfc3RhdGVfY2hlY2soY21kLCBjZGIsICZhbHVhX2FzY3EpOwogCWlmIChyZXQgIT0gMCkgewogCQljbWQtPnRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcyA9ICZ0cmFuc3BvcnRfbm9wX3dhaXRfZm9yX3Rhc2tzOwogCQkvKgpAQCAtMzEyOCwyMiArMjg3MSwyMiBAQAogCQkgKi8KIAkJaWYgKHJldCA+IDApIHsKICNpZiAwCi0JCQlwcmludGsoS0VSTl9JTkZPICJbJXNdOiBBTFVBIFRHIFBvcnQgbm90IGF2YWlsYWJsZSwiCisJCQlwcl9kZWJ1ZygiWyVzXTogQUxVQSBURyBQb3J0IG5vdCBhdmFpbGFibGUsIgogCQkJCSIgU2Vuc2VLZXk6IE5PVF9SRUFEWSwgQVNDL0FTQ1E6IDB4MDQvMHglMDJ4XG4iLAotCQkJCUNNRF9URk8oY21kKS0+Z2V0X2ZhYnJpY19uYW1lKCksIGFsdWFfYXNjcSk7CisJCQkJY21kLT5zZV90Zm8tPmdldF9mYWJyaWNfbmFtZSgpLCBhbHVhX2FzY3EpOwogI2VuZGlmCiAJCQl0cmFuc3BvcnRfc2V0X3NlbnNlX2NvZGVzKGNtZCwgMHgwNCwgYWx1YV9hc2NxKTsKIAkJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047CiAJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0NIRUNLX0NPTkRJVElPTl9OT1RfUkVBRFk7Ci0JCQlyZXR1cm4gLTI7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlnb3RvIG91dF9pbnZhbGlkX2NkYl9maWVsZDsKIAl9CiAJLyoKIAkgKiBDaGVjayBzdGF0dXMgZm9yIFNQQy0zIFBlcnNpc3RlbnQgUmVzZXJ2YXRpb25zCiAJICovCi0JaWYgKFQxMF9QUl9PUFMoc3VfZGV2KS0+dDEwX3Jlc2VydmF0aW9uX2NoZWNrKGNtZCwgJnByX3JlZ190eXBlKSAhPSAwKSB7Ci0JCWlmIChUMTBfUFJfT1BTKHN1X2RldiktPnQxMF9zZXFfbm9uX2hvbGRlcigKKwlpZiAoc3VfZGV2LT50MTBfcHIucHJfb3BzLnQxMF9yZXNlcnZhdGlvbl9jaGVjayhjbWQsICZwcl9yZWdfdHlwZSkgIT0gMCkgeworCQlpZiAoc3VfZGV2LT50MTBfcHIucHJfb3BzLnQxMF9zZXFfbm9uX2hvbGRlcigKIAkJCQkJY21kLCBjZGIsIHByX3JlZ190eXBlKSAhPSAwKQogCQkJcmV0dXJuIHRyYW5zcG9ydF9oYW5kbGVfcmVzZXJ2YXRpb25fY29uZmxpY3QoY21kKTsKIAkJLyoKQEAgLTMxNjAsNyArMjkwMyw3IEBACiAJCQlnb3RvIG91dF91bnN1cHBvcnRlZF9jZGI7CiAJCXNpemUgPSB0cmFuc3BvcnRfZ2V0X3NpemUoc2VjdG9ycywgY2RiLCBjbWQpOwogCQljbWQtPnRyYW5zcG9ydF9zcGxpdF9jZGIgPSAmc3BsaXRfY2RiX1hYXzY7Ci0JCVRfVEFTSyhjbWQpLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV8yMShjZGIpOworCQljbWQtPnRfdGFza19sYmEgPSB0cmFuc3BvcnRfbGJhXzIxKGNkYik7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCOwogCQlicmVhazsKIAljYXNlIFJFQURfMTA6CkBAIC0zMTY5LDcgKzI5MTIsNyBAQAogCQkJZ290byBvdXRfdW5zdXBwb3J0ZWRfY2RiOwogCQlzaXplID0gdHJhbnNwb3J0X2dldF9zaXplKHNlY3RvcnMsIGNkYiwgY21kKTsKIAkJY21kLT50cmFuc3BvcnRfc3BsaXRfY2RiID0gJnNwbGl0X2NkYl9YWF8xMDsKLQkJVF9UQVNLKGNtZCktPnRfdGFza19sYmEgPSB0cmFuc3BvcnRfbGJhXzMyKGNkYik7CisJCWNtZC0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfMzIoY2RiKTsKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfREFUQV9TR19JT19DREI7CiAJCWJyZWFrOwogCWNhc2UgUkVBRF8xMjoKQEAgLTMxNzgsNyArMjkyMSw3IEBACiAJCQlnb3RvIG91dF91bnN1cHBvcnRlZF9jZGI7CiAJCXNpemUgPSB0cmFuc3BvcnRfZ2V0X3NpemUoc2VjdG9ycywgY2RiLCBjbWQpOwogCQljbWQtPnRyYW5zcG9ydF9zcGxpdF9jZGIgPSAmc3BsaXRfY2RiX1hYXzEyOwotCQlUX1RBU0soY21kKS0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfMzIoY2RiKTsKKwkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV8zMihjZGIpOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBSRUFEXzE2OgpAQCAtMzE4Nyw3ICsyOTMwLDcgQEAKIAkJCWdvdG8gb3V0X3Vuc3VwcG9ydGVkX2NkYjsKIAkJc2l6ZSA9IHRyYW5zcG9ydF9nZXRfc2l6ZShzZWN0b3JzLCBjZGIsIGNtZCk7CiAJCWNtZC0+dHJhbnNwb3J0X3NwbGl0X2NkYiA9ICZzcGxpdF9jZGJfWFhfMTY7Ci0JCVRfVEFTSyhjbWQpLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV82NChjZGIpOworCQljbWQtPnRfdGFza19sYmEgPSB0cmFuc3BvcnRfbGJhXzY0KGNkYik7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCOwogCQlicmVhazsKIAljYXNlIFdSSVRFXzY6CkBAIC0zMTk2LDcgKzI5MzksNyBAQAogCQkJZ290byBvdXRfdW5zdXBwb3J0ZWRfY2RiOwogCQlzaXplID0gdHJhbnNwb3J0X2dldF9zaXplKHNlY3RvcnMsIGNkYiwgY21kKTsKIAkJY21kLT50cmFuc3BvcnRfc3BsaXRfY2RiID0gJnNwbGl0X2NkYl9YWF82OwotCQlUX1RBU0soY21kKS0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfMjEoY2RiKTsKKwkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV8yMShjZGIpOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBXUklURV8xMDoKQEAgLTMyMDUsOCArMjk0OCw4IEBACiAJCQlnb3RvIG91dF91bnN1cHBvcnRlZF9jZGI7CiAJCXNpemUgPSB0cmFuc3BvcnRfZ2V0X3NpemUoc2VjdG9ycywgY2RiLCBjbWQpOwogCQljbWQtPnRyYW5zcG9ydF9zcGxpdF9jZGIgPSAmc3BsaXRfY2RiX1hYXzEwOwotCQlUX1RBU0soY21kKS0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfMzIoY2RiKTsKLQkJVF9UQVNLKGNtZCktPnRfdGFza3NfZnVhID0gKGNkYlsxXSAmIDB4OCk7CisJCWNtZC0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfMzIoY2RiKTsKKwkJY21kLT50X3Rhc2tzX2Z1YSA9IChjZGJbMV0gJiAweDgpOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBXUklURV8xMjoKQEAgLTMyMTUsOCArMjk1OCw4IEBACiAJCQlnb3RvIG91dF91bnN1cHBvcnRlZF9jZGI7CiAJCXNpemUgPSB0cmFuc3BvcnRfZ2V0X3NpemUoc2VjdG9ycywgY2RiLCBjbWQpOwogCQljbWQtPnRyYW5zcG9ydF9zcGxpdF9jZGIgPSAmc3BsaXRfY2RiX1hYXzEyOwotCQlUX1RBU0soY21kKS0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfMzIoY2RiKTsKLQkJVF9UQVNLKGNtZCktPnRfdGFza3NfZnVhID0gKGNkYlsxXSAmIDB4OCk7CisJCWNtZC0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfMzIoY2RiKTsKKwkJY21kLT50X3Rhc2tzX2Z1YSA9IChjZGJbMV0gJiAweDgpOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBXUklURV8xNjoKQEAgLTMyMjUsMjIgKzI5NjgsMjIgQEAKIAkJCWdvdG8gb3V0X3Vuc3VwcG9ydGVkX2NkYjsKIAkJc2l6ZSA9IHRyYW5zcG9ydF9nZXRfc2l6ZShzZWN0b3JzLCBjZGIsIGNtZCk7CiAJCWNtZC0+dHJhbnNwb3J0X3NwbGl0X2NkYiA9ICZzcGxpdF9jZGJfWFhfMTY7Ci0JCVRfVEFTSyhjbWQpLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV82NChjZGIpOwotCQlUX1RBU0soY21kKS0+dF90YXNrc19mdWEgPSAoY2RiWzFdICYgMHg4KTsKKwkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV82NChjZGIpOworCQljbWQtPnRfdGFza3NfZnVhID0gKGNkYlsxXSAmIDB4OCk7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCOwogCQlicmVhazsKIAljYXNlIFhEV1JJVEVSRUFEXzEwOgogCQlpZiAoKGNtZC0+ZGF0YV9kaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkgfHwKLQkJICAgICEoVF9UQVNLKGNtZCktPnRfdGFza3NfYmlkaSkpCisJCSAgICAhKGNtZC0+dF90YXNrc19iaWRpKSkKIAkJCWdvdG8gb3V0X2ludmFsaWRfY2RiX2ZpZWxkOwogCQlzZWN0b3JzID0gdHJhbnNwb3J0X2dldF9zZWN0b3JzXzEwKGNkYiwgY21kLCAmc2VjdG9yX3JldCk7CiAJCWlmIChzZWN0b3JfcmV0KQogCQkJZ290byBvdXRfdW5zdXBwb3J0ZWRfY2RiOwogCQlzaXplID0gdHJhbnNwb3J0X2dldF9zaXplKHNlY3RvcnMsIGNkYiwgY21kKTsKIAkJY21kLT50cmFuc3BvcnRfc3BsaXRfY2RiID0gJnNwbGl0X2NkYl9YWF8xMDsKLQkJVF9UQVNLKGNtZCktPnRfdGFza19sYmEgPSB0cmFuc3BvcnRfbGJhXzMyKGNkYik7CisJCWNtZC0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfMzIoY2RiKTsKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfREFUQV9TR19JT19DREI7Ci0JCXBhc3N0aHJvdWdoID0gKFRSQU5TUE9SVChkZXYpLT50cmFuc3BvcnRfdHlwZSA9PQorCQlwYXNzdGhyb3VnaCA9IChkZXYtPnRyYW5zcG9ydC0+dHJhbnNwb3J0X3R5cGUgPT0KIAkJCQlUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVik7CiAJCS8qCiAJCSAqIFNraXAgdGhlIHJlbWFpbmluZyBhc3NpZ25tZW50cyBmb3IgVENNL1BTQ1NJIHBhc3N0aHJvdWdoCkBAIC0zMjUxLDcgKzI5OTQsNyBAQAogCQkgKiBTZXR1cCBCSURJIFhPUiBjYWxsYmFjayB0byBiZSBydW4gZHVyaW5nIHRyYW5zcG9ydF9nZW5lcmljX2NvbXBsZXRlX29rKCkKIAkJICovCiAJCWNtZC0+dHJhbnNwb3J0X2NvbXBsZXRlX2NhbGxiYWNrID0gJnRyYW5zcG9ydF94b3JfY2FsbGJhY2s7Ci0JCVRfVEFTSyhjbWQpLT50X3Rhc2tzX2Z1YSA9IChjZGJbMV0gJiAweDgpOworCQljbWQtPnRfdGFza3NfZnVhID0gKGNkYlsxXSAmIDB4OCk7CiAJCWJyZWFrOwogCWNhc2UgVkFSSUFCTEVfTEVOR1RIX0NNRDoKIAkJc2VydmljZV9hY3Rpb24gPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmNkYls4XSk7CkBAIC0zMjU5LDcgKzMwMDIsNyBAQAogCQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBUQ00vUFNDU0kgZGV2aWNlIGFuZCB3ZSBzaG91bGQgZGlzYWJsZQogCQkgKiBpbnRlcm5hbCBlbXVsYXRpb24gZm9yIHRoaXMgQ0RCLgogCQkgKi8KLQkJcGFzc3Rocm91Z2ggPSAoVFJBTlNQT1JUKGRldiktPnRyYW5zcG9ydF90eXBlID09CisJCXBhc3N0aHJvdWdoID0gKGRldi0+dHJhbnNwb3J0LT50cmFuc3BvcnRfdHlwZSA9PQogCQkJCQlUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVik7CiAKIAkJc3dpdGNoIChzZXJ2aWNlX2FjdGlvbikgewpAQCAtMzI3Myw3ICszMDE2LDcgQEAKIAkJCSAqIFhEV1JJVEVfUkVBRF8zMiBsb2dpYy4KIAkJCSAqLwogCQkJY21kLT50cmFuc3BvcnRfc3BsaXRfY2RiID0gJnNwbGl0X2NkYl9YWF8zMjsKLQkJCVRfVEFTSyhjbWQpLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV82NF9leHQoY2RiKTsKKwkJCWNtZC0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfNjRfZXh0KGNkYik7CiAJCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQjsKIAogCQkJLyoKQEAgLTMyODcsMTQgKzMwMzAsMjIgQEAKIAkJCSAqIHRyYW5zcG9ydF9nZW5lcmljX2NvbXBsZXRlX29rKCkKIAkJCSAqLwogCQkJY21kLT50cmFuc3BvcnRfY29tcGxldGVfY2FsbGJhY2sgPSAmdHJhbnNwb3J0X3hvcl9jYWxsYmFjazsKLQkJCVRfVEFTSyhjbWQpLT50X3Rhc2tzX2Z1YSA9IChjZGJbMTBdICYgMHg4KTsKKwkJCWNtZC0+dF90YXNrc19mdWEgPSAoY2RiWzEwXSAmIDB4OCk7CiAJCQlicmVhazsKIAkJY2FzZSBXUklURV9TQU1FXzMyOgogCQkJc2VjdG9ycyA9IHRyYW5zcG9ydF9nZXRfc2VjdG9yc18zMihjZGIsIGNtZCwgJnNlY3Rvcl9yZXQpOwogCQkJaWYgKHNlY3Rvcl9yZXQpCiAJCQkJZ290byBvdXRfdW5zdXBwb3J0ZWRfY2RiOwotCQkJc2l6ZSA9IHRyYW5zcG9ydF9nZXRfc2l6ZShzZWN0b3JzLCBjZGIsIGNtZCk7Ci0JCQlUX1RBU0soY21kKS0+dF90YXNrX2xiYSA9IGdldF91bmFsaWduZWRfYmU2NCgmY2RiWzEyXSk7CisKKwkJCWlmIChzZWN0b3JzKQorCQkJCXNpemUgPSB0cmFuc3BvcnRfZ2V0X3NpemUoc2VjdG9ycywgY2RiLCBjbWQpOworCQkJZWxzZSB7CisJCQkJcHJfZXJyKCJXU05aPTEsIFdSSVRFX1NBTUUgdy9zZWN0b3JzPTAgbm90IgorCQkJCSAgICAgICAiIHN1cHBvcnRlZFxuIik7CisJCQkJZ290byBvdXRfaW52YWxpZF9jZGJfZmllbGQ7CisJCQl9CisKKwkJCWNtZC0+dF90YXNrX2xiYSA9IGdldF91bmFsaWduZWRfYmU2NCgmY2RiWzEyXSk7CiAJCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAogCQkJLyoKQEAgLTMzMDQsNyArMzA1NSw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCWlmICgoY2RiWzEwXSAmIDB4MDQpIHx8IChjZGJbMTBdICYgMHgwMikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIldSSVRFX1NBTUUgUEJEQVRBIGFuZCBMQkRBVEEiCisJCQkJcHJfZXJyKCJXUklURV9TQU1FIFBCREFUQSBhbmQgTEJEQVRBIgogCQkJCQkiIGJpdHMgbm90IHN1cHBvcnRlZCBmb3IgQmxvY2sgRGlzY2FyZCIKIAkJCQkJIiBFbXVsYXRpb25cbiIpOwogCQkJCWdvdG8gb3V0X2ludmFsaWRfY2RiX2ZpZWxkOwpAQCAtMzMxNCwyOCArMzA2NSwyOCBAQAogCQkJICogdHB3cyB3aXRoIHRoZSBVTk1BUD0xIGJpdCBzZXQuCiAJCQkgKi8KIAkJCWlmICghKGNkYlsxMF0gJiAweDA4KSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiV1JJVEVfU0FNRSB3L28gVU5NQVAgYml0IG5vdCIKKwkJCQlwcl9lcnIoIldSSVRFX1NBTUUgdy9vIFVOTUFQIGJpdCBub3QiCiAJCQkJCSIgc3VwcG9ydGVkIGZvciBCbG9jayBEaXNjYXJkIEVtdWxhdGlvblxuIik7CiAJCQkJZ290byBvdXRfaW52YWxpZF9jZGJfZmllbGQ7CiAJCQl9CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAiVkFSSUFCTEVfTEVOR1RIX0NNRCBzZXJ2aWNlIGFjdGlvbiIKKwkJCXByX2VycigiVkFSSUFCTEVfTEVOR1RIX0NNRCBzZXJ2aWNlIGFjdGlvbiIKIAkJCQkiIDB4JTA0eCBub3Qgc3VwcG9ydGVkXG4iLCBzZXJ2aWNlX2FjdGlvbik7CiAJCQlnb3RvIG91dF91bnN1cHBvcnRlZF9jZGI7CiAJCX0KIAkJYnJlYWs7Ci0JY2FzZSAweGEzOgotCQlpZiAoVFJBTlNQT1JUKGRldiktPmdldF9kZXZpY2VfdHlwZShkZXYpICE9IFRZUEVfUk9NKSB7CisJY2FzZSBNQUlOVEVOQU5DRV9JTjoKKwkJaWYgKGRldi0+dHJhbnNwb3J0LT5nZXRfZGV2aWNlX3R5cGUoZGV2KSAhPSBUWVBFX1JPTSkgewogCQkJLyogTUFJTlRFTkFOQ0VfSU4gZnJvbSBTQ0MtMiAqLwogCQkJLyoKIAkJCSAqIENoZWNrIGZvciBlbXVsYXRlZCBNSV9SRVBPUlRfVEFSR0VUX1BHUy4KIAkJCSAqLwogCQkJaWYgKGNkYlsxXSA9PSBNSV9SRVBPUlRfVEFSR0VUX1BHUykgewogCQkJCWNtZC0+dHJhbnNwb3J0X2VtdWxhdGVfY2RiID0KLQkJCQkoVDEwX0FMVUEoc3VfZGV2KS0+YWx1YV90eXBlID09CisJCQkJKHN1X2Rldi0+dDEwX2FsdWEuYWx1YV90eXBlID09CiAJCQkJIFNQQzNfQUxVQV9FTVVMQVRFRCkgPwotCQkJCSZjb3JlX2VtdWxhdGVfcmVwb3J0X3RhcmdldF9wb3J0X2dyb3VwcyA6CisJCQkJY29yZV9lbXVsYXRlX3JlcG9ydF90YXJnZXRfcG9ydF9ncm91cHMgOgogCQkJCU5VTEw7CiAJCQl9CiAJCQlzaXplID0gKGNkYls2XSA8PCAyNCkgfCAoY2RiWzddIDw8IDE2KSB8CkBAIC0zMzQ0LDcgKzMwOTUsNyBAQAogCQkJLyogR1BDTURfU0VORF9LRVkgZnJvbSBtdWx0aSBtZWRpYSBjb21tYW5kcyAqLwogCQkJc2l6ZSA9IChjZGJbOF0gPDwgOCkgKyBjZGJbOV07CiAJCX0KLQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9OT05TR19JT19DREI7CisJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOwogCQlicmVhazsKIAljYXNlIE1PREVfU0VMRUNUOgogCQlzaXplID0gY2RiWzRdOwpAQCAtMzM1Niw3ICszMTA3LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBNT0RFX1NFTlNFOgogCQlzaXplID0gY2RiWzRdOwotCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX05PTlNHX0lPX0NEQjsKKwkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREI7CiAJCWJyZWFrOwogCWNhc2UgTU9ERV9TRU5TRV8xMDoKIAljYXNlIEdQQ01EX1JFQURfQlVGRkVSX0NBUEFDSVRZOgpAQCAtMzM2NCwxMSArMzExNSwxMSBAQAogCWNhc2UgTE9HX1NFTEVDVDoKIAljYXNlIExPR19TRU5TRToKIAkJc2l6ZSA9IChjZGJbN10gPDwgOCkgKyBjZGJbOF07Ci0JCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfTk9OU0dfSU9fQ0RCOworCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBSRUFEX0JMT0NLX0xJTUlUUzoKIAkJc2l6ZSA9IFJFQURfQkxPQ0tfTEVOOwotCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX05PTlNHX0lPX0NEQjsKKwkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREI7CiAJCWJyZWFrOwogCWNhc2UgR1BDTURfR0VUX0NPTkZJR1VSQVRJT046CiAJY2FzZSBHUENNRF9SRUFEX0ZPUk1BVF9DQVBBQ0lUSUVTOgpAQCAtMzM4MCwxMSArMzEzMSwxMSBAQAogCWNhc2UgUEVSU0lTVEVOVF9SRVNFUlZFX0lOOgogCWNhc2UgUEVSU0lTVEVOVF9SRVNFUlZFX09VVDoKIAkJY21kLT50cmFuc3BvcnRfZW11bGF0ZV9jZGIgPQotCQkJKFQxMF9SRVMoc3VfZGV2KS0+cmVzX3R5cGUgPT0KKwkJCShzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSA9PQogCQkJIFNQQzNfUEVSU0lTVEVOVF9SRVNFUlZBVElPTlMpID8KLQkJCSZjb3JlX3Njc2kzX2VtdWxhdGVfcHIgOiBOVUxMOworCQkJY29yZV9zY3NpM19lbXVsYXRlX3ByIDogTlVMTDsKIAkJc2l6ZSA9IChjZGJbN10gPDwgOCkgKyBjZGJbOF07Ci0JCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfTk9OU0dfSU9fQ0RCOworCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBHUENNRF9NRUNIQU5JU01fU1RBVFVTOgogCWNhc2UgR1BDTURfUkVBRF9EVkRfU1RSVUNUVVJFOgpAQCAtMzM5MywxOSArMzE0NCwxOSBAQAogCQlicmVhazsKIAljYXNlIFJFQURfUE9TSVRJT046CiAJCXNpemUgPSBSRUFEX1BPU0lUSU9OX0xFTjsKLQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9OT05TR19JT19DREI7CisJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOwogCQlicmVhazsKLQljYXNlIDB4YTQ6Ci0JCWlmIChUUkFOU1BPUlQoZGV2KS0+Z2V0X2RldmljZV90eXBlKGRldikgIT0gVFlQRV9ST00pIHsKKwljYXNlIE1BSU5URU5BTkNFX09VVDoKKwkJaWYgKGRldi0+dHJhbnNwb3J0LT5nZXRfZGV2aWNlX3R5cGUoZGV2KSAhPSBUWVBFX1JPTSkgewogCQkJLyogTUFJTlRFTkFOQ0VfT1VUIGZyb20gU0NDLTIKIAkJCSAqCiAJCQkgKiBDaGVjayBmb3IgZW11bGF0ZWQgTU9fU0VUX1RBUkdFVF9QR1MuCiAJCQkgKi8KIAkJCWlmIChjZGJbMV0gPT0gTU9fU0VUX1RBUkdFVF9QR1MpIHsKIAkJCQljbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYiA9Ci0JCQkJKFQxMF9BTFVBKHN1X2RldiktPmFsdWFfdHlwZSA9PQorCQkJCShzdV9kZXYtPnQxMF9hbHVhLmFsdWFfdHlwZSA9PQogCQkJCQlTUEMzX0FMVUFfRU1VTEFURUQpID8KLQkJCQkmY29yZV9lbXVsYXRlX3NldF90YXJnZXRfcG9ydF9ncm91cHMgOgorCQkJCWNvcmVfZW11bGF0ZV9zZXRfdGFyZ2V0X3BvcnRfZ3JvdXBzIDoKIAkJCQlOVUxMOwogCQkJfQogCkBAIC0zNDE1LDcgKzMxNjYsNyBAQAogCQkJLyogR1BDTURfUkVQT1JUX0tFWSBmcm9tIG11bHRpIG1lZGlhIGNvbW1hbmRzICovCiAJCQlzaXplID0gKGNkYls4XSA8PCA4KSArIGNkYls5XTsKIAkJfQotCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX05PTlNHX0lPX0NEQjsKKwkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREI7CiAJCWJyZWFrOwogCWNhc2UgSU5RVUlSWToKIAkJc2l6ZSA9IChjZGJbM10gPDwgOCkgKyBjZGJbNF07CkBAIC0zNDIzLDIzICszMTc0LDIzIEBACiAJCSAqIERvIGltcGxpY3QgSEVBRF9PRl9RVUVVRSBwcm9jZXNzaW5nIGZvciBJTlFVSVJZLgogCQkgKiBTZWUgc3BjNHIxNyBzZWN0aW9uIDUuMwogCQkgKi8KLQkJaWYgKFNFX0RFVihjbWQpLT5kZXZfdGFza19hdHRyX3R5cGUgPT0gU0FNX1RBU0tfQVRUUl9FTVVMQVRFRCkKKwkJaWYgKGNtZC0+c2VfZGV2LT5kZXZfdGFza19hdHRyX3R5cGUgPT0gU0FNX1RBU0tfQVRUUl9FTVVMQVRFRCkKIAkJCWNtZC0+c2FtX3Rhc2tfYXR0ciA9IE1TR19IRUFEX1RBRzsKLQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9OT05TR19JT19DREI7CisJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOwogCQlicmVhazsKIAljYXNlIFJFQURfQlVGRkVSOgogCQlzaXplID0gKGNkYls2XSA8PCAxNikgKyAoY2RiWzddIDw8IDgpICsgY2RiWzhdOwotCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX05PTlNHX0lPX0NEQjsKKwkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREI7CiAJCWJyZWFrOwogCWNhc2UgUkVBRF9DQVBBQ0lUWToKIAkJc2l6ZSA9IFJFQURfQ0FQX0xFTjsKLQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9OT05TR19JT19DREI7CisJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOwogCQlicmVhazsKIAljYXNlIFJFQURfTUVESUFfU0VSSUFMX05VTUJFUjoKIAljYXNlIFNFQ1VSSVRZX1BST1RPQ09MX0lOOgogCWNhc2UgU0VDVVJJVFlfUFJPVE9DT0xfT1VUOgogCQlzaXplID0gKGNkYls2XSA8PCAyNCkgfCAoY2RiWzddIDw8IDE2KSB8IChjZGJbOF0gPDwgOCkgfCBjZGJbOV07Ci0JCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfTk9OU0dfSU9fQ0RCOworCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBTRVJWSUNFX0FDVElPTl9JTjoKIAljYXNlIEFDQ0VTU19DT05UUk9MX0lOOgpAQCAtMzQ1MCwzNiArMzIwMSwzNiBAQAogCWNhc2UgV1JJVEVfQVRUUklCVVRFOgogCQlzaXplID0gKGNkYlsxMF0gPDwgMjQpIHwgKGNkYlsxMV0gPDwgMTYpIHwKIAkJICAgICAgIChjZGJbMTJdIDw8IDgpIHwgY2RiWzEzXTsKLQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9OT05TR19JT19DREI7CisJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOwogCQlicmVhazsKIAljYXNlIFJFQ0VJVkVfRElBR05PU1RJQzoKIAljYXNlIFNFTkRfRElBR05PU1RJQzoKIAkJc2l6ZSA9IChjZGJbM10gPDwgOCkgfCBjZGJbNF07Ci0JCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfTk9OU0dfSU9fQ0RCOworCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAvKiAjd2FybmluZyBGSVhNRTogRmlndXJlIG91dCBjb3JyZWN0IEdQQ01EX1JFQURfQ0QgYmxvY2tzaXplLiAqLwogI2lmIDAKIAljYXNlIEdQQ01EX1JFQURfQ0Q6CiAJCXNlY3RvcnMgPSAoY2RiWzZdIDw8IDE2KSArIChjZGJbN10gPDwgOCkgKyBjZGJbOF07CiAJCXNpemUgPSAoMjMzNiAqIHNlY3RvcnMpOwotCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX05PTlNHX0lPX0NEQjsKKwkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREI7CiAJCWJyZWFrOwogI2VuZGlmCiAJY2FzZSBSRUFEX1RPQzoKIAkJc2l6ZSA9IGNkYls4XTsKLQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9OT05TR19JT19DREI7CisJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOwogCQlicmVhazsKIAljYXNlIFJFUVVFU1RfU0VOU0U6CiAJCXNpemUgPSBjZGJbNF07Ci0JCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfTk9OU0dfSU9fQ0RCOworCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBSRUFEX0VMRU1FTlRfU1RBVFVTOgogCQlzaXplID0gNjU1MzYgKiBjZGJbN10gKyAyNTYgKiBjZGJbOF0gKyBjZGJbOV07Ci0JCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfTk9OU0dfSU9fQ0RCOworCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBXUklURV9CVUZGRVI6CiAJCXNpemUgPSAoY2RiWzZdIDw8IDE2KSArIChjZGJbN10gPDwgOCkgKyBjZGJbOF07Ci0JCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfTk9OU0dfSU9fQ0RCOworCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBSRVNFUlZFOgogCWNhc2UgUkVTRVJWRV8xMDoKQEAgLTM1MDAsOSArMzI1MSw5IEBACiAJCSAqIGVtdWxhdGlvbiBkaXNhYmxlZC4KIAkJICovCiAJCWNtZC0+dHJhbnNwb3J0X2VtdWxhdGVfY2RiID0KLQkJCQkoVDEwX1JFUyhzdV9kZXYpLT5yZXNfdHlwZSAhPQorCQkJCShzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSAhPQogCQkJCSBTUENfUEFTU1RIUk9VR0gpID8KLQkJCQkmY29yZV9zY3NpMl9lbXVsYXRlX2NyaCA6IE5VTEw7CisJCQkJY29yZV9zY3NpMl9lbXVsYXRlX2NyaCA6IE5VTEw7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX05PTl9EQVRBX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBSRUxFQVNFOgpAQCAtMzUxNyw5ICszMjY4LDkgQEAKIAkJCXNpemUgPSBjbWQtPmRhdGFfbGVuZ3RoOwogCiAJCWNtZC0+dHJhbnNwb3J0X2VtdWxhdGVfY2RiID0KLQkJCQkoVDEwX1JFUyhzdV9kZXYpLT5yZXNfdHlwZSAhPQorCQkJCShzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSAhPQogCQkJCSBTUENfUEFTU1RIUk9VR0gpID8KLQkJCQkmY29yZV9zY3NpMl9lbXVsYXRlX2NyaCA6IE5VTEw7CisJCQkJY29yZV9zY3NpMl9lbXVsYXRlX2NyaCA6IE5VTEw7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX05PTl9EQVRBX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBTWU5DSFJPTklaRV9DQUNIRToKQEAgLTM1MjksMTAgKzMyODAsMTAgQEAKIAkJICovCiAJCWlmIChjZGJbMF0gPT0gU1lOQ0hST05JWkVfQ0FDSEUpIHsKIAkJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfMTAoY2RiLCBjbWQsICZzZWN0b3JfcmV0KTsKLQkJCVRfVEFTSyhjbWQpLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV8zMihjZGIpOworCQkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV8zMihjZGIpOwogCQl9IGVsc2UgewogCQkJc2VjdG9ycyA9IHRyYW5zcG9ydF9nZXRfc2VjdG9yc18xNihjZGIsIGNtZCwgJnNlY3Rvcl9yZXQpOwotCQkJVF9UQVNLKGNtZCktPnRfdGFza19sYmEgPSB0cmFuc3BvcnRfbGJhXzY0KGNkYik7CisJCQljbWQtPnRfdGFza19sYmEgPSB0cmFuc3BvcnRfbGJhXzY0KGNkYik7CiAJCX0KIAkJaWYgKHNlY3Rvcl9yZXQpCiAJCQlnb3RvIG91dF91bnN1cHBvcnRlZF9jZGI7CkBAIC0zNTQzLDcgKzMyOTQsNyBAQAogCQkvKgogCQkgKiBGb3IgVENNL3BTQ1NJIHBhc3N0aHJvdWdoLCBza2lwIGNtZC0+dHJhbnNwb3J0X2VtdWxhdGVfY2RiKCkKIAkJICovCi0JCWlmIChUUkFOU1BPUlQoZGV2KS0+dHJhbnNwb3J0X3R5cGUgPT0gVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpCisJCWlmIChkZXYtPnRyYW5zcG9ydC0+dHJhbnNwb3J0X3R5cGUgPT0gVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpCiAJCQlicmVhazsKIAkJLyoKIAkJICogU2V0IFNDRl9FTVVMQVRFX0NEQl9BU1lOQyB0byBlbnN1cmUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbgpAQCAtMzU1NCwzMiArMzMwNSwyNyBAQAogCQkgKiBDaGVjayB0byBlbnN1cmUgdGhhdCBMQkEgKyBSYW5nZSBkb2VzIG5vdCBleGNlZWQgcGFzdCBlbmQgb2YKIAkJICogZGV2aWNlLgogCQkgKi8KLQkJaWYgKHRyYW5zcG9ydF9nZXRfc2VjdG9ycyhjbWQpIDwgMCkKKwkJaWYgKCF0cmFuc3BvcnRfY21kX2dldF92YWxpZF9zZWN0b3JzKGNtZCkpCiAJCQlnb3RvIG91dF9pbnZhbGlkX2NkYl9maWVsZDsKIAkJYnJlYWs7CiAJY2FzZSBVTk1BUDoKIAkJc2l6ZSA9IGdldF91bmFsaWduZWRfYmUxNigmY2RiWzddKTsKLQkJcGFzc3Rocm91Z2ggPSAoVFJBTlNQT1JUKGRldiktPnRyYW5zcG9ydF90eXBlID09Ci0JCQkJVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpOwotCQkvKgotCQkgKiBEZXRlcm1pbmUgaWYgdGhlIHJlY2VpdmVkIFVOTUFQIHVzZWQgdG8gZm9yIGRpcmVjdCBwYXNzdGhyb3VnaAotCQkgKiBpbnRvIExpbnV4L1NDU0kgd2l0aCBzdHJ1Y3QgcmVxdWVzdCB2aWEgVENNL3BTQ1NJIG9yIHdlIGFyZQotCQkgKiBzaWduYWxpbmcgdGhlIHVzZSBvZiBpbnRlcm5hbCB0cmFuc3BvcnRfZ2VuZXJpY191bm1hcCgpIGVtdWxhdGlvbgotCQkgKiBmb3IgVU5NQVAgLT4gTGludXgvQkxPQ0sgZGlzYmFyZCB3aXRoIFRDTS9JQkxPQ0sgYW5kIFRDTS9GSUxFSU8KLQkJICogc3Vic3lzdGVtIHBsdWdpbiBiYWNrc3RvcmVzLgotCQkgKi8KLQkJaWYgKCEocGFzc3Rocm91Z2gpKQotCQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX0VNVUxBVEVfU1lOQ19VTk1BUDsKLQotCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX05PTlNHX0lPX0NEQjsKKwkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREI7CiAJCWJyZWFrOwogCWNhc2UgV1JJVEVfU0FNRV8xNjoKIAkJc2VjdG9ycyA9IHRyYW5zcG9ydF9nZXRfc2VjdG9yc18xNihjZGIsIGNtZCwgJnNlY3Rvcl9yZXQpOwogCQlpZiAoc2VjdG9yX3JldCkKIAkJCWdvdG8gb3V0X3Vuc3VwcG9ydGVkX2NkYjsKLQkJc2l6ZSA9IHRyYW5zcG9ydF9nZXRfc2l6ZShzZWN0b3JzLCBjZGIsIGNtZCk7Ci0JCVRfVEFTSyhjbWQpLT50X3Rhc2tfbGJhID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZjZGJbMl0pOwotCQlwYXNzdGhyb3VnaCA9IChUUkFOU1BPUlQoZGV2KS0+dHJhbnNwb3J0X3R5cGUgPT0KKworCQlpZiAoc2VjdG9ycykKKwkJCXNpemUgPSB0cmFuc3BvcnRfZ2V0X3NpemUoc2VjdG9ycywgY2RiLCBjbWQpOworCQllbHNlIHsKKwkJCXByX2VycigiV1NOWj0xLCBXUklURV9TQU1FIHcvc2VjdG9ycz0wIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJZ290byBvdXRfaW52YWxpZF9jZGJfZmllbGQ7CisJCX0KKworCQljbWQtPnRfdGFza19sYmEgPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmNkYlsyXSk7CisJCXBhc3N0aHJvdWdoID0gKGRldi0+dHJhbnNwb3J0LT50cmFuc3BvcnRfdHlwZSA9PQogCQkJCVRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKTsKIAkJLyoKIAkJICogRGV0ZXJtaW5lIGlmIHRoZSByZWNlaXZlZCBXUklURV9TQU1FXzE2IGlzIHVzZWQgdG8gZm9yIGRpcmVjdApAQCAtMzU4OCw5ICszMzM0LDkgQEAKIAkJICogZW11bGF0aW9uIGZvciAtPiBMaW51eC9CTE9DSyBkaXNiYXJkIHdpdGggVENNL0lCTE9DSyBhbmQKIAkJICogVENNL0ZJTEVJTyBzdWJzeXN0ZW0gcGx1Z2luIGJhY2tzdG9yZXMuCiAJCSAqLwotCQlpZiAoIShwYXNzdGhyb3VnaCkpIHsKKwkJaWYgKCFwYXNzdGhyb3VnaCkgewogCQkJaWYgKChjZGJbMV0gJiAweDA0KSB8fCAoY2RiWzFdICYgMHgwMikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIldSSVRFX1NBTUUgUEJEQVRBIGFuZCBMQkRBVEEiCisJCQkJcHJfZXJyKCJXUklURV9TQU1FIFBCREFUQSBhbmQgTEJEQVRBIgogCQkJCQkiIGJpdHMgbm90IHN1cHBvcnRlZCBmb3IgQmxvY2sgRGlzY2FyZCIKIAkJCQkJIiBFbXVsYXRpb25cbiIpOwogCQkJCWdvdG8gb3V0X2ludmFsaWRfY2RiX2ZpZWxkOwpAQCAtMzYwMCw3ICszMzQ2LDcgQEAKIAkJCSAqIHRwd3Mgd2l0aCB0aGUgVU5NQVA9MSBiaXQgc2V0LgogCQkJICovCiAJCQlpZiAoIShjZGJbMV0gJiAweDA4KSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiV1JJVEVfU0FNRSB3L28gVU5NQVAgYml0IG5vdCAiCisJCQkJcHJfZXJyKCJXUklURV9TQU1FIHcvbyBVTk1BUCBiaXQgbm90ICIKIAkJCQkJIiBzdXBwb3J0ZWQgZm9yIEJsb2NrIERpc2NhcmQgRW11bGF0aW9uXG4iKTsKIAkJCQlnb3RvIG91dF9pbnZhbGlkX2NkYl9maWVsZDsKIAkJCX0KQEAgLTM2MjUsMzQgKzMzNzEsMzQgQEAKIAkJYnJlYWs7CiAJY2FzZSBSRVBPUlRfTFVOUzoKIAkJY21kLT50cmFuc3BvcnRfZW11bGF0ZV9jZGIgPQotCQkJCSZ0cmFuc3BvcnRfY29yZV9yZXBvcnRfbHVuX3Jlc3BvbnNlOworCQkJCXRyYW5zcG9ydF9jb3JlX3JlcG9ydF9sdW5fcmVzcG9uc2U7CiAJCXNpemUgPSAoY2RiWzZdIDw8IDI0KSB8IChjZGJbN10gPDwgMTYpIHwgKGNkYls4XSA8PCA4KSB8IGNkYls5XTsKIAkJLyoKIAkJICogRG8gaW1wbGljdCBIRUFEX09GX1FVRVVFIHByb2Nlc3NpbmcgZm9yIFJFUE9SVF9MVU5TCiAJCSAqIFNlZSBzcGM0cjE3IHNlY3Rpb24gNS4zCiAJCSAqLwotCQlpZiAoU0VfREVWKGNtZCktPmRldl90YXNrX2F0dHJfdHlwZSA9PSBTQU1fVEFTS19BVFRSX0VNVUxBVEVEKQorCQlpZiAoY21kLT5zZV9kZXYtPmRldl90YXNrX2F0dHJfdHlwZSA9PSBTQU1fVEFTS19BVFRSX0VNVUxBVEVEKQogCQkJY21kLT5zYW1fdGFza19hdHRyID0gTVNHX0hFQURfVEFHOwotCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX05PTlNHX0lPX0NEQjsKKwkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlRBUkdFVF9DT1JFWyVzXTogVW5zdXBwb3J0ZWQgU0NTSSBPcGNvZGUiCisJCXByX3dhcm4oIlRBUkdFVF9DT1JFWyVzXTogVW5zdXBwb3J0ZWQgU0NTSSBPcGNvZGUiCiAJCQkiIDB4JTAyeCwgc2VuZGluZyBDSEVDS19DT05ESVRJT04uXG4iLAotCQkJQ01EX1RGTyhjbWQpLT5nZXRfZmFicmljX25hbWUoKSwgY2RiWzBdKTsKKwkJCWNtZC0+c2VfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgY2RiWzBdKTsKIAkJY21kLT50cmFuc3BvcnRfd2FpdF9mb3JfdGFza3MgPSAmdHJhbnNwb3J0X25vcF93YWl0X2Zvcl90YXNrczsKIAkJZ290byBvdXRfdW5zdXBwb3J0ZWRfY2RiOwogCX0KIAogCWlmIChzaXplICE9IGNtZC0+ZGF0YV9sZW5ndGgpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVEFSR0VUX0NPUkVbJXNdOiBFeHBlY3RlZCBUcmFuc2ZlciBMZW5ndGg6IgorCQlwcl93YXJuKCJUQVJHRVRfQ09SRVslc106IEV4cGVjdGVkIFRyYW5zZmVyIExlbmd0aDoiCiAJCQkiICV1IGRvZXMgbm90IG1hdGNoIFNDU0kgQ0RCIExlbmd0aDogJXUgZm9yIFNBTSBPcGNvZGU6IgotCQkJIiAweCUwMnhcbiIsIENNRF9URk8oY21kKS0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCQkiIDB4JTAyeFxuIiwgY21kLT5zZV90Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJCWNtZC0+ZGF0YV9sZW5ndGgsIHNpemUsIGNkYlswXSk7CiAKIAkJY21kLT5jbWRfc3BkdGwgPSBzaXplOwogCiAJCWlmIChjbWQtPmRhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiUmVqZWN0aW5nIHVuZGVyZmxvdy9vdmVyZmxvdyIKKwkJCXByX2VycigiUmVqZWN0aW5nIHVuZGVyZmxvdy9vdmVyZmxvdyIKIAkJCQkJIiBXUklURSBkYXRhXG4iKTsKIAkJCWdvdG8gb3V0X2ludmFsaWRfY2RiX2ZpZWxkOwogCQl9CkBAIC0zNjYwLDEwICszNDA2LDEwIEBACiAJCSAqIFJlamVjdCBSRUFEXyogb3IgV1JJVEVfKiB3aXRoIG92ZXJmbG93L3VuZGVyZmxvdyBmb3IKIAkJICogdHlwZSBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQi4KIAkJICovCi0JCWlmICghKHJldCkgJiYgKERFVl9BVFRSSUIoZGV2KS0+YmxvY2tfc2l6ZSAhPSA1MTIpKSAgewotCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsaW5nIE9WRVJGTE9XL1VOREVSRkxPVyBmb3IgTEJBIG9wIgorCQlpZiAoIXJldCAmJiAoZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUgIT0gNTEyKSkgIHsKKwkJCXByX2VycigiRmFpbGluZyBPVkVSRkxPVy9VTkRFUkZMT1cgZm9yIExCQSBvcCIKIAkJCQkiIENEQiBvbiBub24gNTEyLWJ5dGUgc2VjdG9yIHNldHVwIHN1YnN5c3RlbSIKLQkJCQkiIHBsdWdpbjogJXNcbiIsIFRSQU5TUE9SVChkZXYpLT5uYW1lKTsKKwkJCQkiIHBsdWdpbjogJXNcbiIsIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKIAkJCS8qIFJldHVybnMgQ0hFQ0tfQ09ORElUSU9OICsgSU5WQUxJRF9DREJfRklFTEQgKi8KIAkJCWdvdG8gb3V0X2ludmFsaWRfY2RiX2ZpZWxkOwogCQl9CkBAIC0zNjc4LDEwNSArMzQyNCwyMiBAQAogCQljbWQtPmRhdGFfbGVuZ3RoID0gc2l6ZTsKIAl9CiAKKwkvKiBMZXQncyBsaW1pdCBjb250cm9sIGNkYnMgdG8gYSBwYWdlLCBmb3Igc2ltcGxpY2l0eSdzIHNha2UuICovCisJaWYgKChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCKSAmJgorCSAgICBzaXplID4gUEFHRV9TSVpFKQorCQlnb3RvIG91dF9pbnZhbGlkX2NkYl9maWVsZDsKKwogCXRyYW5zcG9ydF9zZXRfc3VwcG9ydGVkX1NBTV9vcGNvZGUoY21kKTsKIAlyZXR1cm4gcmV0OwogCiBvdXRfdW5zdXBwb3J0ZWRfY2RiOgogCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047CiAJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9VTlNVUFBPUlRFRF9TQ1NJX09QQ09ERTsKLQlyZXR1cm4gLTI7CisJcmV0dXJuIC1FSU5WQUw7CiBvdXRfaW52YWxpZF9jZGJfZmllbGQ6CiAJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTjsKIAljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfQ0RCX0ZJRUxEOwotCXJldHVybiAtMjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9ydF9yZWxlYXNlX3Rhc2tzKHN0cnVjdCBzZV9jbWQgKik7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY29weSBhIGNvbnRpZ3VvdXMgKnNyYyBidWZmZXIgaW50byBhIGRlc3RpbmF0aW9uCi0gKiBzdHJ1Y3Qgc2NhdHRlcmxpc3QgYXJyYXkuCi0gKi8KLXN0YXRpYyB2b2lkIHRyYW5zcG9ydF9tZW1jcHlfd3JpdGVfY29udGlnKAotCXN0cnVjdCBzZV9jbWQgKmNtZCwKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2QsCi0JdW5zaWduZWQgY2hhciAqc3JjKQotewotCXUzMiBpID0gMCwgbGVuZ3RoID0gMCwgdG90YWxfbGVuZ3RoID0gY21kLT5kYXRhX2xlbmd0aDsKLQl2b2lkICpkc3Q7Ci0KLQl3aGlsZSAodG90YWxfbGVuZ3RoKSB7Ci0JCWxlbmd0aCA9IHNnX2RbaV0ubGVuZ3RoOwotCi0JCWlmIChsZW5ndGggPiB0b3RhbF9sZW5ndGgpCi0JCQlsZW5ndGggPSB0b3RhbF9sZW5ndGg7Ci0KLQkJZHN0ID0gc2dfdmlydCgmc2dfZFtpXSk7Ci0KLQkJbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOwotCi0JCWlmICghKHRvdGFsX2xlbmd0aCAtPSBsZW5ndGgpKQotCQkJcmV0dXJuOwotCi0JCXNyYyArPSBsZW5ndGg7Ci0JCWkrKzsKLQl9Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY29weSBhIHN0cnVjdCBzY2F0dGVybGlzdCBhcnJheSAqc2dfcyBpbnRvIGEgZGVzdGluYXRpb24KLSAqIGNvbnRpZ3VvdXMgKmRzdCBidWZmZXIuCi0gKi8KLXN0YXRpYyB2b2lkIHRyYW5zcG9ydF9tZW1jcHlfcmVhZF9jb250aWcoCi0Jc3RydWN0IHNlX2NtZCAqY21kLAotCXVuc2lnbmVkIGNoYXIgKmRzdCwKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3MpCi17Ci0JdTMyIGkgPSAwLCBsZW5ndGggPSAwLCB0b3RhbF9sZW5ndGggPSBjbWQtPmRhdGFfbGVuZ3RoOwotCXZvaWQgKnNyYzsKLQotCXdoaWxlICh0b3RhbF9sZW5ndGgpIHsKLQkJbGVuZ3RoID0gc2dfc1tpXS5sZW5ndGg7Ci0KLQkJaWYgKGxlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQkJCWxlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLQotCQlzcmMgPSBzZ192aXJ0KCZzZ19zW2ldKTsKLQotCQltZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7Ci0KLQkJaWYgKCEodG90YWxfbGVuZ3RoIC09IGxlbmd0aCkpCi0JCQlyZXR1cm47Ci0KLQkJZHN0ICs9IGxlbmd0aDsKLQkJaSsrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdHJhbnNwb3J0X21lbWNweV9zZV9tZW1fcmVhZF9jb250aWcoCi0Jc3RydWN0IHNlX2NtZCAqY21kLAotCXVuc2lnbmVkIGNoYXIgKmRzdCwKLQlzdHJ1Y3QgbGlzdF9oZWFkICpzZV9tZW1fbGlzdCkKLXsKLQlzdHJ1Y3Qgc2VfbWVtICpzZV9tZW07Ci0Jdm9pZCAqc3JjOwotCXUzMiBsZW5ndGggPSAwLCB0b3RhbF9sZW5ndGggPSBjbWQtPmRhdGFfbGVuZ3RoOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzZV9tZW0sIHNlX21lbV9saXN0LCBzZV9saXN0KSB7Ci0JCWxlbmd0aCA9IHNlX21lbS0+c2VfbGVuOwotCi0JCWlmIChsZW5ndGggPiB0b3RhbF9sZW5ndGgpCi0JCQlsZW5ndGggPSB0b3RhbF9sZW5ndGg7Ci0KLQkJc3JjID0gcGFnZV9hZGRyZXNzKHNlX21lbS0+c2VfcGFnZSkgKyBzZV9tZW0tPnNlX29mZjsKLQotCQltZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7Ci0KLQkJaWYgKCEodG90YWxfbGVuZ3RoIC09IGxlbmd0aCkpCi0JCQlyZXR1cm47Ci0KLQkJZHN0ICs9IGxlbmd0aDsKLQl9CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIC8qCkBAIC0zNzg2LDcgKzM0NDksNyBAQAogICovCiBzdGF0aWMgdm9pZCB0cmFuc3BvcnRfY29tcGxldGVfdGFza19hdHRyKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBTRV9ERVYoY21kKTsKKwlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAlzdHJ1Y3Qgc2VfY21kICpjbWRfcCwgKmNtZF90bXA7CiAJaW50IG5ld19hY3RpdmVfdGFza3MgPSAwOwogCkBAIC0zNzk0LDI1ICszNDU3LDI1IEBACiAJCWF0b21pY19kZWMoJmRldi0+c2ltcGxlX2NtZHMpOwogCQlzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKTsKIAkJZGV2LT5kZXZfY3VyX29yZGVyZWRfaWQrKzsKLQkJREVCVUdfU1RBKCJJbmNyZW1lbnRlZCBkZXYtPmRldl9jdXJfb3JkZXJlZF9pZDogJXUgZm9yIgorCQlwcl9kZWJ1ZygiSW5jcmVtZW50ZWQgZGV2LT5kZXZfY3VyX29yZGVyZWRfaWQ6ICV1IGZvciIKIAkJCSIgU0lNUExFOiAldVxuIiwgZGV2LT5kZXZfY3VyX29yZGVyZWRfaWQsCiAJCQljbWQtPnNlX29yZGVyZWRfaWQpOwogCX0gZWxzZSBpZiAoY21kLT5zYW1fdGFza19hdHRyID09IE1TR19IRUFEX1RBRykgewogCQlhdG9taWNfZGVjKCZkZXYtPmRldl9ob3FfY291bnQpOwogCQlzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKTsKIAkJZGV2LT5kZXZfY3VyX29yZGVyZWRfaWQrKzsKLQkJREVCVUdfU1RBKCJJbmNyZW1lbnRlZCBkZXZfY3VyX29yZGVyZWRfaWQ6ICV1IGZvciIKKwkJcHJfZGVidWcoIkluY3JlbWVudGVkIGRldl9jdXJfb3JkZXJlZF9pZDogJXUgZm9yIgogCQkJIiBIRUFEX09GX1FVRVVFOiAldVxuIiwgZGV2LT5kZXZfY3VyX29yZGVyZWRfaWQsCiAJCQljbWQtPnNlX29yZGVyZWRfaWQpOwogCX0gZWxzZSBpZiAoY21kLT5zYW1fdGFza19hdHRyID09IE1TR19PUkRFUkVEX1RBRykgewogCQlzcGluX2xvY2soJmRldi0+b3JkZXJlZF9jbWRfbG9jayk7Ci0JCWxpc3RfZGVsKCZjbWQtPnNlX29yZGVyZWRfbGlzdCk7CisJCWxpc3RfZGVsKCZjbWQtPnNlX29yZGVyZWRfbm9kZSk7CiAJCWF0b21pY19kZWMoJmRldi0+ZGV2X29yZGVyZWRfc3luYyk7CiAJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpOwogCQlzcGluX3VubG9jaygmZGV2LT5vcmRlcmVkX2NtZF9sb2NrKTsKIAogCQlkZXYtPmRldl9jdXJfb3JkZXJlZF9pZCsrOwotCQlERUJVR19TVEEoIkluY3JlbWVudGVkIGRldl9jdXJfb3JkZXJlZF9pZDogJXUgZm9yIE9SREVSRUQ6IgorCQlwcl9kZWJ1ZygiSW5jcmVtZW50ZWQgZGV2X2N1cl9vcmRlcmVkX2lkOiAldSBmb3IgT1JERVJFRDoiCiAJCQkiICV1XG4iLCBkZXYtPmRldl9jdXJfb3JkZXJlZF9pZCwgY21kLT5zZV9vcmRlcmVkX2lkKTsKIAl9CiAJLyoKQEAgLTM4MjIsMTUgKzM0ODUsMTUgQEAKIAkgKi8KIAlzcGluX2xvY2soJmRldi0+ZGVsYXllZF9jbWRfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNtZF9wLCBjbWRfdG1wLAotCQkJJmRldi0+ZGVsYXllZF9jbWRfbGlzdCwgc2VfZGVsYXllZF9saXN0KSB7CisJCQkmZGV2LT5kZWxheWVkX2NtZF9saXN0LCBzZV9kZWxheWVkX25vZGUpIHsKIAotCQlsaXN0X2RlbCgmY21kX3AtPnNlX2RlbGF5ZWRfbGlzdCk7CisJCWxpc3RfZGVsKCZjbWRfcC0+c2VfZGVsYXllZF9ub2RlKTsKIAkJc3Bpbl91bmxvY2soJmRldi0+ZGVsYXllZF9jbWRfbG9jayk7CiAKLQkJREVCVUdfU1RBKCJDYWxsaW5nIGFkZF90YXNrcygpIGZvciIKKwkJcHJfZGVidWcoIkNhbGxpbmcgYWRkX3Rhc2tzKCkgZm9yIgogCQkJIiBjbWRfcDogMHglMDJ4IFRhc2sgQXR0cjogMHglMDJ4IgogCQkJIiBEb3JtYW50IC0+IEFjdGl2ZSwgc2Vfb3JkZXJlZF9pZDogJXVcbiIsCi0JCQlUX1RBU0soY21kX3ApLT50X3Rhc2tfY2RiWzBdLAorCQkJY21kX3AtPnRfdGFza19jZGJbMF0sCiAJCQljbWRfcC0+c2FtX3Rhc2tfYXR0ciwgY21kX3AtPnNlX29yZGVyZWRfaWQpOwogCiAJCXRyYW5zcG9ydF9hZGRfdGFza3NfZnJvbV9jbWQoY21kX3ApOwpAQCAtMzg0NiwyMCArMzUwOSw3OSBAQAogCSAqIHRvIGRvIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBBY3RpdmUgdGFza3MuCiAJICovCiAJaWYgKG5ld19hY3RpdmVfdGFza3MgIT0gMCkKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPmRldl9xdWV1ZV9vYmotPnRocmVhZF93cSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5kZXZfcXVldWVfb2JqLnRocmVhZF93cSk7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X2NvbXBsZXRlX3FmKHN0cnVjdCBzZV9jbWQgKmNtZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9UUkFOU1BPUlRfVEFTS19TRU5TRSkKKwkJcmV0dXJuIGNtZC0+c2VfdGZvLT5xdWV1ZV9zdGF0dXMoY21kKTsKKworCXN3aXRjaCAoY21kLT5kYXRhX2RpcmVjdGlvbikgeworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlyZXQgPSBjbWQtPnNlX3Rmby0+cXVldWVfZGF0YV9pbihjbWQpOworCQlicmVhazsKKwljYXNlIERNQV9UT19ERVZJQ0U6CisJCWlmIChjbWQtPnRfYmlkaV9kYXRhX3NnKSB7CisJCQlyZXQgPSBjbWQtPnNlX3Rmby0+cXVldWVfZGF0YV9pbihjbWQpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQkvKiBGYWxsIHRocm91Z2ggZm9yIERNQV9UT19ERVZJQ0UgKi8KKwljYXNlIERNQV9OT05FOgorCQlyZXQgPSBjbWQtPnNlX3Rmby0+cXVldWVfc3RhdHVzKGNtZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zcG9ydF9oYW5kbGVfcXVldWVfZnVsbCgKKwlzdHJ1Y3Qgc2VfY21kICpjbWQsCisJc3RydWN0IHNlX2RldmljZSAqZGV2LAorCWludCAoKnFmX2NhbGxiYWNrKShzdHJ1Y3Qgc2VfY21kICopKQoreworCXNwaW5fbG9ja19pcnEoJmRldi0+cWZfY21kX2xvY2spOworCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9FTVVMQVRFX1FVRVVFX0ZVTEw7CisJY21kLT50cmFuc3BvcnRfcWZfY2FsbGJhY2sgPSBxZl9jYWxsYmFjazsKKwlsaXN0X2FkZF90YWlsKCZjbWQtPnNlX3FmX25vZGUsICZjbWQtPnNlX2Rldi0+cWZfY21kX2xpc3QpOworCWF0b21pY19pbmMoJmRldi0+ZGV2X3FmX2NvdW50KTsKKwlzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKTsKKwlzcGluX3VubG9ja19pcnEoJmNtZC0+c2VfZGV2LT5xZl9jbWRfbG9jayk7CisKKwlzY2hlZHVsZV93b3JrKCZjbWQtPnNlX2Rldi0+cWZfd29ya19xdWV1ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHRyYW5zcG9ydF9nZW5lcmljX2NvbXBsZXRlX29rKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlpbnQgcmVhc29uID0gMDsKKwlpbnQgcmVhc29uID0gMCwgcmV0OwogCS8qCiAJICogQ2hlY2sgaWYgd2UgbmVlZCB0byBtb3ZlIGRlbGF5ZWQvZG9ybWFudCB0YXNrcyBmcm9tIGNtZHMgb24gdGhlCiAJICogZGVsYXllZCBleGVjdXRpb24gbGlzdCBhZnRlciBhIEhFQURfT0ZfUVVFVUUgb3IgT1JERVJFRCBUYXNrCiAJICogQXR0cmlidXRlLgogCSAqLwotCWlmIChTRV9ERVYoY21kKS0+ZGV2X3Rhc2tfYXR0cl90eXBlID09IFNBTV9UQVNLX0FUVFJfRU1VTEFURUQpCisJaWYgKGNtZC0+c2VfZGV2LT5kZXZfdGFza19hdHRyX3R5cGUgPT0gU0FNX1RBU0tfQVRUUl9FTVVMQVRFRCkKIAkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2tfYXR0cihjbWQpOwogCS8qCisJICogQ2hlY2sgdG8gc2NoZWR1bGUgUVVFVUVfRlVMTCB3b3JrLCBvciBleGVjdXRlIGFuIGV4aXN0aW5nCisJICogY21kLT50cmFuc3BvcnRfcWZfY2FsbGJhY2soKQorCSAqLworCWlmIChhdG9taWNfcmVhZCgmY21kLT5zZV9kZXYtPmRldl9xZl9jb3VudCkgIT0gMCkKKwkJc2NoZWR1bGVfd29yaygmY21kLT5zZV9kZXYtPnFmX3dvcmtfcXVldWUpOworCisJaWYgKGNtZC0+dHJhbnNwb3J0X3FmX2NhbGxiYWNrKSB7CisJCXJldCA9IGNtZC0+dHJhbnNwb3J0X3FmX2NhbGxiYWNrKGNtZCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBxdWV1ZV9mdWxsOworCisJCWNtZC0+dHJhbnNwb3J0X3FmX2NhbGxiYWNrID0gTlVMTDsKKwkJZ290byBkb25lOworCX0KKwkvKgogCSAqIENoZWNrIGlmIHdlIG5lZWQgdG8gcmV0cmlldmUgYSBzZW5zZSBidWZmZXIgZnJvbQogCSAqIHRoZSBzdHJ1Y3Qgc2VfY21kIGluIHF1ZXN0aW9uLgogCSAqLwpAQCAtMzg3Miw4ICszNTk0LDExIEBACiAJCSAqIGEgbm9uIEdPT0Qgc3RhdHVzLgogCQkgKi8KIAkJaWYgKGNtZC0+c2NzaV9zdGF0dXMpIHsKLQkJCXRyYW5zcG9ydF9zZW5kX2NoZWNrX2NvbmRpdGlvbl9hbmRfc2Vuc2UoCisJCQlyZXQgPSB0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKAogCQkJCQljbWQsIHJlYXNvbiwgMSk7CisJCQlpZiAocmV0ID09IC1FQUdBSU4pCisJCQkJZ290byBxdWV1ZV9mdWxsOworCiAJCQl0cmFuc3BvcnRfbHVuX3JlbW92ZV9jbWQoY21kKTsKIAkJCXRyYW5zcG9ydF9jbWRfY2hlY2tfc3RvcF90b19mYWJyaWMoY21kKTsKIAkJCXJldHVybjsKQEAgLTM4ODksNTMgKzM2MTQsNTcgQEAKIAlzd2l0Y2ggKGNtZC0+ZGF0YV9kaXJlY3Rpb24pIHsKIAljYXNlIERNQV9GUk9NX0RFVklDRToKIAkJc3Bpbl9sb2NrKCZjbWQtPnNlX2x1bi0+bHVuX3NlcF9sb2NrKTsKLQkJaWYgKFNFX0xVTihjbWQpLT5sdW5fc2VwKSB7Ci0JCQlTRV9MVU4oY21kKS0+bHVuX3NlcC0+c2VwX3N0YXRzLnR4X2RhdGFfb2N0ZXRzICs9CisJCWlmIChjbWQtPnNlX2x1bi0+bHVuX3NlcCkgeworCQkJY21kLT5zZV9sdW4tPmx1bl9zZXAtPnNlcF9zdGF0cy50eF9kYXRhX29jdGV0cyArPQogCQkJCQljbWQtPmRhdGFfbGVuZ3RoOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZjbWQtPnNlX2x1bi0+bHVuX3NlcF9sb2NrKTsKLQkJLyoKLQkJICogSWYgZW5hYmxlZCBieSBUQ00gZmFiaXJjIG1vZHVsZSBwcmUtcmVnaXN0ZXJlZCBTR0wKLQkJICogbWVtb3J5LCBwZXJmb3JtIHRoZSBtZW1jcHkoKSBmcm9tIHRoZSBUQ00gaW50ZXJuYWwKLQkJICogY29udGlnaW91cyBidWZmZXIgYmFjayB0byB0aGUgb3JpZ2luYWwgU0dMLgotCQkgKi8KLQkJaWYgKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1BBU1NUSFJPVUdIX0NPTlRJR19UT19TRykKLQkJCXRyYW5zcG9ydF9tZW1jcHlfd3JpdGVfY29udGlnKGNtZCwKLQkJCQkgVF9UQVNLKGNtZCktPnRfdGFza19wdF9zZ2wsCi0JCQkJIFRfVEFTSyhjbWQpLT50X3Rhc2tfYnVmKTsKIAotCQlDTURfVEZPKGNtZCktPnF1ZXVlX2RhdGFfaW4oY21kKTsKKwkJcmV0ID0gY21kLT5zZV90Zm8tPnF1ZXVlX2RhdGFfaW4oY21kKTsKKwkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJZ290byBxdWV1ZV9mdWxsOwogCQlicmVhazsKIAljYXNlIERNQV9UT19ERVZJQ0U6CiAJCXNwaW5fbG9jaygmY21kLT5zZV9sdW4tPmx1bl9zZXBfbG9jayk7Ci0JCWlmIChTRV9MVU4oY21kKS0+bHVuX3NlcCkgewotCQkJU0VfTFVOKGNtZCktPmx1bl9zZXAtPnNlcF9zdGF0cy5yeF9kYXRhX29jdGV0cyArPQorCQlpZiAoY21kLT5zZV9sdW4tPmx1bl9zZXApIHsKKwkJCWNtZC0+c2VfbHVuLT5sdW5fc2VwLT5zZXBfc3RhdHMucnhfZGF0YV9vY3RldHMgKz0KIAkJCQljbWQtPmRhdGFfbGVuZ3RoOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZjbWQtPnNlX2x1bi0+bHVuX3NlcF9sb2NrKTsKIAkJLyoKIAkJICogQ2hlY2sgaWYgd2UgbmVlZCB0byBzZW5kIFJFQUQgcGF5bG9hZCBmb3IgQklESS1DT01NQU5ECiAJCSAqLwotCQlpZiAoVF9UQVNLKGNtZCktPnRfbWVtX2JpZGlfbGlzdCAhPSBOVUxMKSB7CisJCWlmIChjbWQtPnRfYmlkaV9kYXRhX3NnKSB7CiAJCQlzcGluX2xvY2soJmNtZC0+c2VfbHVuLT5sdW5fc2VwX2xvY2spOwotCQkJaWYgKFNFX0xVTihjbWQpLT5sdW5fc2VwKSB7Ci0JCQkJU0VfTFVOKGNtZCktPmx1bl9zZXAtPnNlcF9zdGF0cy50eF9kYXRhX29jdGV0cyArPQorCQkJaWYgKGNtZC0+c2VfbHVuLT5sdW5fc2VwKSB7CisJCQkJY21kLT5zZV9sdW4tPmx1bl9zZXAtPnNlcF9zdGF0cy50eF9kYXRhX29jdGV0cyArPQogCQkJCQljbWQtPmRhdGFfbGVuZ3RoOwogCQkJfQogCQkJc3Bpbl91bmxvY2soJmNtZC0+c2VfbHVuLT5sdW5fc2VwX2xvY2spOwotCQkJQ01EX1RGTyhjbWQpLT5xdWV1ZV9kYXRhX2luKGNtZCk7CisJCQlyZXQgPSBjbWQtPnNlX3Rmby0+cXVldWVfZGF0YV9pbihjbWQpOworCQkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJCWdvdG8gcXVldWVfZnVsbDsKIAkJCWJyZWFrOwogCQl9CiAJCS8qIEZhbGwgdGhyb3VnaCBmb3IgRE1BX1RPX0RFVklDRSAqLwogCWNhc2UgRE1BX05PTkU6Ci0JCUNNRF9URk8oY21kKS0+cXVldWVfc3RhdHVzKGNtZCk7CisJCXJldCA9IGNtZC0+c2VfdGZvLT5xdWV1ZV9zdGF0dXMoY21kKTsKKwkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJZ290byBxdWV1ZV9mdWxsOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKK2RvbmU6CiAJdHJhbnNwb3J0X2x1bl9yZW1vdmVfY21kKGNtZCk7CiAJdHJhbnNwb3J0X2NtZF9jaGVja19zdG9wX3RvX2ZhYnJpYyhjbWQpOworCXJldHVybjsKKworcXVldWVfZnVsbDoKKwlwcl9kZWJ1ZygiSGFuZGxpbmcgY29tcGxldGVfb2sgUVVFVUVfRlVMTDogc2VfY21kOiAlcCwiCisJCSIgZGF0YV9kaXJlY3Rpb246ICVkXG4iLCBjbWQsIGNtZC0+ZGF0YV9kaXJlY3Rpb24pOworCXRyYW5zcG9ydF9oYW5kbGVfcXVldWVfZnVsbChjbWQsIGNtZC0+c2VfZGV2LCB0cmFuc3BvcnRfY29tcGxldGVfcWYpOwogfQogCiBzdGF0aWMgdm9pZCB0cmFuc3BvcnRfZnJlZV9kZXZfdGFza3Moc3RydWN0IHNlX2NtZCAqY21kKQpAQCAtMzk0Myw5ICszNjcyLDkgQEAKIAlzdHJ1Y3Qgc2VfdGFzayAqdGFzaywgKnRhc2tfdG1wOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YXNrLCB0YXNrX3RtcCwKLQkJCQkmVF9UQVNLKGNtZCktPnRfdGFza19saXN0LCB0X2xpc3QpIHsKKwkJCQkmY21kLT50X3Rhc2tfbGlzdCwgdF9saXN0KSB7CiAJCWlmIChhdG9taWNfcmVhZCgmdGFzay0+dGFza19hY3RpdmUpKQogCQkJY29udGludWU7CiAKQEAgLTM5NTQsNzUgKzM2ODMsNDAgQEAKIAogCQlsaXN0X2RlbCgmdGFzay0+dF9saXN0KTsKIAotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJCWlmICh0YXNrLT5zZV9kZXYpCi0JCQlUUkFOU1BPUlQodGFzay0+c2VfZGV2KS0+ZnJlZV90YXNrKHRhc2spOworCQkJdGFzay0+c2VfZGV2LT50cmFuc3BvcnQtPmZyZWVfdGFzayh0YXNrKTsKIAkJZWxzZQotCQkJcHJpbnRrKEtFUk5fRVJSICJ0YXNrWyV1XSAtIHRhc2stPnNlX2RldiBpcyBOVUxMXG4iLAorCQkJcHJfZXJyKCJ0YXNrWyV1XSAtIHRhc2stPnNlX2RldiBpcyBOVUxMXG4iLAogCQkJCXRhc2stPnRhc2tfbm8pOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc3BvcnRfZnJlZV9zZ2woc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGludCBuZW50cykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBjb3VudDsKKworCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbnRzLCBjb3VudCkKKwkJX19mcmVlX3BhZ2Uoc2dfcGFnZShzZykpOworCisJa2ZyZWUoc2dsKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9ydF9mcmVlX3BhZ2VzKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2VfbWVtICpzZV9tZW0sICpzZV9tZW1fdG1wOwotCWludCBmcmVlX3BhZ2UgPSAxOwotCiAJaWYgKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1BBU1NUSFJPVUdIX1NHX1RPX01FTV9OT0FMTE9DKQotCQlmcmVlX3BhZ2UgPSAwOwotCWlmIChjbWQtPnNlX2Rldi0+dHJhbnNwb3J0LT5kb19zZV9tZW1fbWFwKQotCQlmcmVlX3BhZ2UgPSAwOwotCi0JaWYgKFRfVEFTSyhjbWQpLT50X3Rhc2tfYnVmKSB7Ci0JCWtmcmVlKFRfVEFTSyhjbWQpLT50X3Rhc2tfYnVmKTsKLQkJVF9UQVNLKGNtZCktPnRfdGFza19idWYgPSBOVUxMOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBDYWxsZXIgd2lsbCBoYW5kbGUgcmVsZWFzaW5nIG9mIHN0cnVjdCBzZV9tZW0uCi0JICovCi0JaWYgKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX0NNRF9QQVNTVEhST1VHSF9OT0FMTE9DKQogCQlyZXR1cm47CiAKLQlpZiAoIShUX1RBU0soY21kKS0+dF90YXNrc19zZV9udW0pKQotCQlyZXR1cm47CisJdHJhbnNwb3J0X2ZyZWVfc2dsKGNtZC0+dF9kYXRhX3NnLCBjbWQtPnRfZGF0YV9uZW50cyk7CisJY21kLT50X2RhdGFfc2cgPSBOVUxMOworCWNtZC0+dF9kYXRhX25lbnRzID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZV9tZW0sIHNlX21lbV90bXAsCi0JCQlUX1RBU0soY21kKS0+dF9tZW1fbGlzdCwgc2VfbGlzdCkgewotCQkvKgotCQkgKiBXZSBvbmx5IHJlbGVhc2UgY2FsbCBfX2ZyZWVfcGFnZShzdHJ1Y3Qgc2VfbWVtLT5zZV9wYWdlKSB3aGVuCi0JCSAqIFNDRl9QQVNTVEhST1VHSF9TR19UT19NRU1fTk9BTExPQyBpcyBOT1QgaW4gdXNlLAotCQkgKi8KLQkJaWYgKGZyZWVfcGFnZSkKLQkJCV9fZnJlZV9wYWdlKHNlX21lbS0+c2VfcGFnZSk7Ci0KLQkJbGlzdF9kZWwoJnNlX21lbS0+c2VfbGlzdCk7Ci0JCWttZW1fY2FjaGVfZnJlZShzZV9tZW1fY2FjaGUsIHNlX21lbSk7Ci0JfQotCi0JaWYgKFRfVEFTSyhjbWQpLT50X21lbV9iaWRpX2xpc3QgJiYgVF9UQVNLKGNtZCktPnRfdGFza3Nfc2VfYmlkaV9udW0pIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlX21lbSwgc2VfbWVtX3RtcCwKLQkJCQlUX1RBU0soY21kKS0+dF9tZW1fYmlkaV9saXN0LCBzZV9saXN0KSB7Ci0JCQkvKgotCQkJICogV2Ugb25seSByZWxlYXNlIGNhbGwgX19mcmVlX3BhZ2Uoc3RydWN0IHNlX21lbS0+c2VfcGFnZSkgd2hlbgotCQkJICogU0NGX1BBU1NUSFJPVUdIX1NHX1RPX01FTV9OT0FMTE9DIGlzIE5PVCBpbiB1c2UsCi0JCQkgKi8KLQkJCWlmIChmcmVlX3BhZ2UpCi0JCQkJX19mcmVlX3BhZ2Uoc2VfbWVtLT5zZV9wYWdlKTsKLQotCQkJbGlzdF9kZWwoJnNlX21lbS0+c2VfbGlzdCk7Ci0JCQlrbWVtX2NhY2hlX2ZyZWUoc2VfbWVtX2NhY2hlLCBzZV9tZW0pOwotCQl9Ci0JfQotCi0Ja2ZyZWUoVF9UQVNLKGNtZCktPnRfbWVtX2JpZGlfbGlzdCk7Ci0JVF9UQVNLKGNtZCktPnRfbWVtX2JpZGlfbGlzdCA9IE5VTEw7Ci0Ja2ZyZWUoVF9UQVNLKGNtZCktPnRfbWVtX2xpc3QpOwotCVRfVEFTSyhjbWQpLT50X21lbV9saXN0ID0gTlVMTDsKLQlUX1RBU0soY21kKS0+dF90YXNrc19zZV9udW0gPSAwOworCXRyYW5zcG9ydF9mcmVlX3NnbChjbWQtPnRfYmlkaV9kYXRhX3NnLCBjbWQtPnRfYmlkaV9kYXRhX25lbnRzKTsKKwljbWQtPnRfYmlkaV9kYXRhX3NnID0gTlVMTDsKKwljbWQtPnRfYmlkaV9kYXRhX25lbnRzID0gMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9ydF9yZWxlYXNlX3Rhc2tzKHN0cnVjdCBzZV9jbWQgKmNtZCkKQEAgLTQwMzQsMjMgKzM3MjgsMjMgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQlpZiAoYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X2ZlX2NvdW50KSkgewotCQlpZiAoIShhdG9taWNfZGVjX2FuZF90ZXN0KCZUX1RBU0soY21kKS0+dF9mZV9jb3VudCkpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLAorCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCWlmIChhdG9taWNfcmVhZCgmY21kLT50X2ZlX2NvdW50KSkgeworCQlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmNtZC0+dF9mZV9jb3VudCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLAogCQkJCQlmbGFncyk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KIAotCWlmIChhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfc2VfY291bnQpKSB7Ci0JCWlmICghKGF0b21pY19kZWNfYW5kX3Rlc3QoJlRfVEFTSyhjbWQpLT50X3NlX2NvdW50KSkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssCisJaWYgKGF0b21pY19yZWFkKCZjbWQtPnRfc2VfY291bnQpKSB7CisJCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmY21kLT50X3NlX2NvdW50KSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssCiAJCQkJCWZsYWdzKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDYyLDY4ICszNzU2LDU3IEBACiAJaWYgKHRyYW5zcG9ydF9kZWNfYW5kX2NoZWNrKGNtZCkpCiAJCXJldHVybjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCEoYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50cmFuc3BvcnRfZGV2X2FjdGl2ZSkpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWF0b21pY19yZWFkKCZjbWQtPnRyYW5zcG9ydF9kZXZfYWN0aXZlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCQlnb3RvIGZyZWVfcGFnZXM7CiAJfQotCWF0b21pY19zZXQoJlRfVEFTSyhjbWQpLT50cmFuc3BvcnRfZGV2X2FjdGl2ZSwgMCk7CisJYXRvbWljX3NldCgmY21kLT50cmFuc3BvcnRfZGV2X2FjdGl2ZSwgMCk7CiAJdHJhbnNwb3J0X2FsbF90YXNrX2Rldl9yZW1vdmVfc3RhdGUoY21kKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAogCXRyYW5zcG9ydF9yZWxlYXNlX3Rhc2tzKGNtZCk7CiBmcmVlX3BhZ2VzOgogCXRyYW5zcG9ydF9mcmVlX3BhZ2VzKGNtZCk7CiAJdHJhbnNwb3J0X2ZyZWVfc2VfY21kKGNtZCk7Ci0JQ01EX1RGTyhjbWQpLT5yZWxlYXNlX2NtZF9kaXJlY3QoY21kKTsKKwljbWQtPnNlX3Rmby0+cmVsZWFzZV9jbWQoY21kKTsKIH0KIAotc3RhdGljIGludCB0cmFuc3BvcnRfZ2VuZXJpY19yZW1vdmUoCi0Jc3RydWN0IHNlX2NtZCAqY21kLAotCWludCByZWxlYXNlX3RvX3Bvb2wsCi0JaW50IHNlc3Npb25fcmVpbnN0YXRlbWVudCkKK3N0YXRpYyBpbnQKK3RyYW5zcG9ydF9nZW5lcmljX3JlbW92ZShzdHJ1Y3Qgc2VfY21kICpjbWQsIGludCBzZXNzaW9uX3JlaW5zdGF0ZW1lbnQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghKFRfVEFTSyhjbWQpKSkKLQkJZ290byByZWxlYXNlX2NtZDsKLQogCWlmICh0cmFuc3BvcnRfZGVjX2FuZF9jaGVjayhjbWQpKSB7CiAJCWlmIChzZXNzaW9uX3JlaW5zdGF0ZW1lbnQpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAkJCXRyYW5zcG9ydF9hbGxfdGFza19kZXZfcmVtb3ZlX3N0YXRlKGNtZCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLAorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssCiAJCQkJCWZsYWdzKTsKIAkJfQogCQlyZXR1cm4gMTsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCWlmICghKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dHJhbnNwb3J0X2Rldl9hY3RpdmUpKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKCFhdG9taWNfcmVhZCgmY21kLT50cmFuc3BvcnRfZGV2X2FjdGl2ZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAkJZ290byBmcmVlX3BhZ2VzOwogCX0KLQlhdG9taWNfc2V0KCZUX1RBU0soY21kKS0+dHJhbnNwb3J0X2Rldl9hY3RpdmUsIDApOworCWF0b21pY19zZXQoJmNtZC0+dHJhbnNwb3J0X2Rldl9hY3RpdmUsIDApOwogCXRyYW5zcG9ydF9hbGxfdGFza19kZXZfcmVtb3ZlX3N0YXRlKGNtZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKIAl0cmFuc3BvcnRfcmVsZWFzZV90YXNrcyhjbWQpOworCiBmcmVlX3BhZ2VzOgogCXRyYW5zcG9ydF9mcmVlX3BhZ2VzKGNtZCk7Ci0KLXJlbGVhc2VfY21kOgotCWlmIChyZWxlYXNlX3RvX3Bvb2wpIHsKLQkJdHJhbnNwb3J0X3JlbGVhc2VfY21kX3RvX3Bvb2woY21kKTsKLQl9IGVsc2UgewotCQl0cmFuc3BvcnRfZnJlZV9zZV9jbWQoY21kKTsKLQkJQ01EX1RGTyhjbWQpLT5yZWxlYXNlX2NtZF9kaXJlY3QoY21kKTsKLQl9Ci0KKwl0cmFuc3BvcnRfcmVsZWFzZV9jbWQoY21kKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIHRyYW5zcG9ydF9nZW5lcmljX21hcF9tZW1fdG9fY21kIC0gUGVyZm9ybSBTR0wgLT4gc3RydWN0IHNlX21lbSBtYXAKKyAqIHRyYW5zcG9ydF9nZW5lcmljX21hcF9tZW1fdG9fY21kIC0gVXNlIGZhYnJpYy1hbGxvY2VkIHBhZ2VzIGluc3RlYWQgb2YKKyAqIGFsbG9jYXRpbmcgaW4gdGhlIGNvcmUuCiAgKiBAY21kOiAgQXNzb2NpYXRlZCBzZV9jbWQgZGVzY3JpcHRvcgogICogQG1lbTogIFNHTCBzdHlsZSBtZW1vcnkgZm9yIFRDTSBXUklURSAvIFJFQUQKICAqIEBzZ19tZW1fbnVtOiBOdW1iZXIgb2YgU0dMIGVsZW1lbnRzCkBAIC00MTM1LDYxMyArMzgxOCwxNjIgQEAKICAqLwogaW50IHRyYW5zcG9ydF9nZW5lcmljX21hcF9tZW1fdG9fY21kKAogCXN0cnVjdCBzZV9jbWQgKmNtZCwKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKm1lbSwKLQl1MzIgc2dfbWVtX251bSwKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKm1lbV9iaWRpX2luLAotCXUzMiBzZ19tZW1fYmlkaV9udW0pCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJdTMyIHNnbF9jb3VudCwKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbF9iaWRpLAorCXUzMiBzZ2xfYmlkaV9jb3VudCkKIHsKLQl1MzIgc2VfbWVtX2NudF9vdXQgPSAwOwotCWludCByZXQ7Ci0KLQlpZiAoIShtZW0pIHx8ICEoc2dfbWVtX251bSkpCisJaWYgKCFzZ2wgfHwgIXNnbF9jb3VudCkKIAkJcmV0dXJuIDA7Ci0JLyoKLQkgKiBQYXNzZWQgKm1lbSB3aWxsIGNvbnRhaW4gYSBsaXN0X2hlYWQgY29udGFpbmluZyBwcmVmb3JtYXR0ZWQKLQkgKiBzdHJ1Y3Qgc2VfbWVtIGVsZW1lbnRzLi4uCi0JICovCi0JaWYgKCEoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfUEFTU1RIUk9VR0hfU0dfVE9fTUVNKSkgewotCQlpZiAoKG1lbV9iaWRpX2luKSB8fCAoc2dfbWVtX2JpZGlfbnVtKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTQ0ZfQ01EX1BBU1NUSFJPVUdIX05PQUxMT0Mgbm90IHN1cHBvcnRlZCIKLQkJCQkiIHdpdGggQklESS1DT01NQU5EXG4iKTsKLQkJCXJldHVybiAtRU5PU1lTOwotCQl9CiAKLQkJVF9UQVNLKGNtZCktPnRfbWVtX2xpc3QgPSAoc3RydWN0IGxpc3RfaGVhZCAqKW1lbTsKLQkJVF9UQVNLKGNtZCktPnRfdGFza3Nfc2VfbnVtID0gc2dfbWVtX251bTsKLQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX0NNRF9QQVNTVEhST1VHSF9OT0FMTE9DOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBPdGhlcndpc2UsIGFzc3VtZSB0aGUgY2FsbGVyIGlzIHBhc3NpbmcgYSBzdHJ1Y3Qgc2NhdHRlcmxpc3QKLQkgKiBhcnJheSBmcm9tIGluY2x1ZGUvbGludXgvc2NhdHRlcmxpc3QuaAotCSAqLwogCWlmICgoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQikgfHwKIAkgICAgKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREIpKSB7Ci0JCS8qCi0JCSAqIEZvciBDREIgdXNpbmcgVENNIHN0cnVjdCBzZV9tZW0gbGlua2VkIGxpc3Qgc2NhdHRlcmxpc3QgbWVtb3J5Ci0JCSAqIHByb2Nlc3NlZCBpbnRvIGEgVENNIHN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2LCB3ZSBkbyB0aGUgbWFwcGluZwotCQkgKiBmcm9tIHRoZSBwYXNzZWQgcGh5c2ljYWwgbWVtb3J5IHRvIHN0cnVjdCBzZV9tZW0tPnNlX3BhZ2UgaGVyZS4KLQkJICovCi0JCVRfVEFTSyhjbWQpLT50X21lbV9saXN0ID0gdHJhbnNwb3J0X2luaXRfc2VfbWVtX2xpc3QoKTsKLQkJaWYgKCEoVF9UQVNLKGNtZCktPnRfbWVtX2xpc3QpKQotCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJcmV0ID0gdHJhbnNwb3J0X21hcF9zZ190b19tZW0oY21kLAotCQkJVF9UQVNLKGNtZCktPnRfbWVtX2xpc3QsIG1lbSwgJnNlX21lbV9jbnRfb3V0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJY21kLT50X2RhdGFfc2cgPSBzZ2w7CisJCWNtZC0+dF9kYXRhX25lbnRzID0gc2dsX2NvdW50OwogCi0JCVRfVEFTSyhjbWQpLT50X3Rhc2tzX3NlX251bSA9IHNlX21lbV9jbnRfb3V0OwotCQkvKgotCQkgKiBTZXR1cCBCSURJIFJFQUQgbGlzdCBvZiBzdHJ1Y3Qgc2VfbWVtIGVsZW1lbnRzCi0JCSAqLwotCQlpZiAoKG1lbV9iaWRpX2luKSAmJiAoc2dfbWVtX2JpZGlfbnVtKSkgewotCQkJVF9UQVNLKGNtZCktPnRfbWVtX2JpZGlfbGlzdCA9IHRyYW5zcG9ydF9pbml0X3NlX21lbV9saXN0KCk7Ci0JCQlpZiAoIShUX1RBU0soY21kKS0+dF9tZW1fYmlkaV9saXN0KSkgewotCQkJCWtmcmVlKFRfVEFTSyhjbWQpLT50X21lbV9saXN0KTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJCXNlX21lbV9jbnRfb3V0ID0gMDsKLQotCQkJcmV0ID0gdHJhbnNwb3J0X21hcF9zZ190b19tZW0oY21kLAotCQkJCVRfVEFTSyhjbWQpLT50X21lbV9iaWRpX2xpc3QsIG1lbV9iaWRpX2luLAotCQkJCSZzZV9tZW1fY250X291dCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWtmcmVlKFRfVEFTSyhjbWQpLT50X21lbV9saXN0KTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQotCQkJVF9UQVNLKGNtZCktPnRfdGFza3Nfc2VfYmlkaV9udW0gPSBzZV9tZW1fY250X291dDsKKwkJaWYgKHNnbF9iaWRpICYmIHNnbF9iaWRpX2NvdW50KSB7CisJCQljbWQtPnRfYmlkaV9kYXRhX3NnID0gc2dsX2JpZGk7CisJCQljbWQtPnRfYmlkaV9kYXRhX25lbnRzID0gc2dsX2JpZGlfY291bnQ7CiAJCX0KIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1BBU1NUSFJPVUdIX1NHX1RPX01FTV9OT0FMTE9DOwotCi0JfSBlbHNlIGlmIChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TQ1NJX0NPTlRST0xfTk9OU0dfSU9fQ0RCKSB7Ci0JCWlmIChtZW1fYmlkaV9pbiB8fCBzZ19tZW1fYmlkaV9udW0pIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiQklESS1Db21tYW5kcyBub3Qgc3VwcG9ydGVkIHVzaW5nICIKLQkJCQkiU0NGX1NDU0lfQ09OVFJPTF9OT05TR19JT19DREJcbiIpOwotCQkJcmV0dXJuIC1FTk9TWVM7Ci0JCX0KLQkJLyoKLQkJICogRm9yIGluY29taW5nIENEQnMgdXNpbmcgYSBjb250aWd1b3VzIGJ1ZmZlciBpbnRlcm5hbGwgd2l0aCBUQ00sCi0JCSAqIHNhdmUgdGhlIHBhc3NlZCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgbWVtb3J5LiAgQWZ0ZXIgVENNIHN0b3JhZ2Ugb2JqZWN0Ci0JCSAqIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZCBmb3IgdGhpcyBzdHJ1Y3Qgc2VfY21kLCBUQ00gY29yZSB3aWxsIGNhbGwKLQkJICogdHJhbnNwb3J0X21lbWNweV9bd3JpdGUscmVhZF1fY29udGlnKCkgYXMgbmVjZXNzYXJ5IGZyb20KLQkJICogdHJhbnNwb3J0X2dlbmVyaWNfY29tcGxldGVfb2soKSBhbmQgdHJhbnNwb3J0X3dyaXRlX3BlbmRpbmcoKSBpbiBvcmRlcgotCQkgKiB0byBjb3B5IHRoZSBUQ00gYnVmZmVyIHRvL2Zyb20gdGhlIG9yaWdpbmFsIHBhc3NlZCAqbWVtIGluIFNHTCAtPgotCQkgKiBzdHJ1Y3Qgc2NhdHRlcmxpc3QgZm9ybWF0LgotCQkgKi8KLQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1BBU1NUSFJPVUdIX0NPTlRJR19UT19TRzsKLQkJVF9UQVNLKGNtZCktPnRfdGFza19wdF9zZ2wgPSBtZW07CiAJfQogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHRyYW5zcG9ydF9nZW5lcmljX21hcF9tZW1fdG9fY21kKTsKIAotCi1zdGF0aWMgaW5saW5lIGxvbmcgbG9uZyB0cmFuc3BvcnRfZGV2X2VuZF9sYmEoc3RydWN0IHNlX2RldmljZSAqZGV2KQotewotCXJldHVybiBkZXYtPnRyYW5zcG9ydC0+Z2V0X2Jsb2NrcyhkZXYpICsgMTsKLX0KLQotc3RhdGljIGludCB0cmFuc3BvcnRfZ2V0X3NlY3RvcnMoc3RydWN0IHNlX2NtZCAqY21kKQotewotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0RFVihjbWQpOwotCi0JVF9UQVNLKGNtZCktPnRfdGFza3Nfc2VjdG9ycyA9Ci0JCShjbWQtPmRhdGFfbGVuZ3RoIC8gREVWX0FUVFJJQihkZXYpLT5ibG9ja19zaXplKTsKLQlpZiAoIShUX1RBU0soY21kKS0+dF90YXNrc19zZWN0b3JzKSkKLQkJVF9UQVNLKGNtZCktPnRfdGFza3Nfc2VjdG9ycyA9IDE7Ci0KLQlpZiAoVFJBTlNQT1JUKGRldiktPmdldF9kZXZpY2VfdHlwZShkZXYpICE9IFRZUEVfRElTSykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoKFRfVEFTSyhjbWQpLT50X3Rhc2tfbGJhICsgVF9UQVNLKGNtZCktPnRfdGFza3Nfc2VjdG9ycykgPgotCSAgICAgdHJhbnNwb3J0X2Rldl9lbmRfbGJhKGRldikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJMQkE6ICVsbHUgU2VjdG9yczogJXUgZXhjZWVkcyIKLQkJCSIgdHJhbnNwb3J0X2Rldl9lbmRfbGJhKCk6ICVsbHVcbiIsCi0JCQlUX1RBU0soY21kKS0+dF90YXNrX2xiYSwgVF9UQVNLKGNtZCktPnRfdGFza3Nfc2VjdG9ycywKLQkJCXRyYW5zcG9ydF9kZXZfZW5kX2xiYShkZXYpKTsKLQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTjsKLQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9TRUNUT1JfQ09VTlRfVE9PX01BTlk7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFUV9UT09fTUFOWV9TRUNUT1JTOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHRyYW5zcG9ydF9uZXdfY21kX29iaihzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfREVWKGNtZCk7Ci0JdTMyIHRhc2tfY2RicyA9IDAsIHJjOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCXUzMiB0YXNrX2NkYnM7CisJdTMyIHJjOworCWludCBzZXRfY291bnRzID0gMTsKIAotCWlmICghKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfREFUQV9TR19JT19DREIpKSB7Ci0JCXRhc2tfY2RicysrOwotCQlUX1RBU0soY21kKS0+dF90YXNrX2NkYnMrKzsKLQl9IGVsc2UgewotCQlpbnQgc2V0X2NvdW50cyA9IDE7Ci0KLQkJLyoKLQkJICogU2V0dXAgYW55IEJJREkgUkVBRCB0YXNrcyBhbmQgbWVtb3J5IGZyb20KLQkJICogVF9UQVNLKGNtZCktPnRfbWVtX2JpZGlfbGlzdCBzbyB0aGUgUkVBRCBzdHJ1Y3Qgc2VfdGFza3MKLQkJICogYXJlIHF1ZXVlZCBmaXJzdCBmb3IgdGhlIG5vbiBwU0NTSSBwYXNzdGhyb3VnaCBjYXNlLgotCQkgKi8KLQkJaWYgKChUX1RBU0soY21kKS0+dF9tZW1fYmlkaV9saXN0ICE9IE5VTEwpICYmCi0JCSAgICAoVFJBTlNQT1JUKGRldiktPnRyYW5zcG9ydF90eXBlICE9IFRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKSkgewotCQkJcmMgPSB0cmFuc3BvcnRfZ2VuZXJpY19nZXRfY2RiX2NvdW50KGNtZCwKLQkJCQlUX1RBU0soY21kKS0+dF90YXNrX2xiYSwKLQkJCQlUX1RBU0soY21kKS0+dF90YXNrc19zZWN0b3JzLAotCQkJCURNQV9GUk9NX0RFVklDRSwgVF9UQVNLKGNtZCktPnRfbWVtX2JpZGlfbGlzdCwKLQkJCQlzZXRfY291bnRzKTsKLQkJCWlmICghKHJjKSkgewotCQkJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047Ci0JCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9Ci0JCQkJCVRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOwotCQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKLQkJCX0KLQkJCXNldF9jb3VudHMgPSAwOwotCQl9Ci0JCS8qCi0JCSAqIFNldHVwIHRoZSB0YXNrcyBhbmQgbWVtb3J5IGZyb20gVF9UQVNLKGNtZCktPnRfbWVtX2xpc3QKLQkJICogTm90ZSBmb3IgQklESSB0cmFuc2ZlcnMgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIFdSSVRFIHBheWxvYWQKLQkJICovCi0JCXRhc2tfY2RicyA9IHRyYW5zcG9ydF9nZW5lcmljX2dldF9jZGJfY291bnQoY21kLAotCQkJCVRfVEFTSyhjbWQpLT50X3Rhc2tfbGJhLAotCQkJCVRfVEFTSyhjbWQpLT50X3Rhc2tzX3NlY3RvcnMsCi0JCQkJY21kLT5kYXRhX2RpcmVjdGlvbiwgVF9UQVNLKGNtZCktPnRfbWVtX2xpc3QsCi0JCQkJc2V0X2NvdW50cyk7Ci0JCWlmICghKHRhc2tfY2RicykpIHsKKwkvKgorCSAqIFNldHVwIGFueSBCSURJIFJFQUQgdGFza3MgYW5kIG1lbW9yeSBmcm9tCisJICogY21kLT50X21lbV9iaWRpX2xpc3Qgc28gdGhlIFJFQUQgc3RydWN0IHNlX3Rhc2tzCisJICogYXJlIHF1ZXVlZCBmaXJzdCBmb3IgdGhlIG5vbiBwU0NTSSBwYXNzdGhyb3VnaCBjYXNlLgorCSAqLworCWlmIChjbWQtPnRfYmlkaV9kYXRhX3NnICYmCisJICAgIChkZXYtPnRyYW5zcG9ydC0+dHJhbnNwb3J0X3R5cGUgIT0gVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpKSB7CisJCXJjID0gdHJhbnNwb3J0X2FsbG9jYXRlX3Rhc2tzKGNtZCwKKwkJCQkJICAgICAgY21kLT50X3Rhc2tfbGJhLAorCQkJCQkgICAgICBETUFfRlJPTV9ERVZJQ0UsCisJCQkJCSAgICAgIGNtZC0+dF9iaWRpX2RhdGFfc2csCisJCQkJCSAgICAgIGNtZC0+dF9iaWRpX2RhdGFfbmVudHMpOworCQlpZiAocmMgPD0gMCkgewogCQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTjsKIAkJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPQotCQkJCQlUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKwkJCQlUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKIAkJCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKIAkJfQotCQlUX1RBU0soY21kKS0+dF90YXNrX2NkYnMgKz0gdGFza19jZGJzOwotCi0jaWYgMAotCQlwcmludGsoS0VSTl9JTkZPICJkYXRhX2xlbmd0aDogJXUsIExCQTogJWxsdSB0X3Rhc2tzX3NlY3RvcnM6IgotCQkJIiAldSwgdF90YXNrX2NkYnM6ICV1XG4iLCBvYmpfcHRyLCBjbWQtPmRhdGFfbGVuZ3RoLAotCQkJVF9UQVNLKGNtZCktPnRfdGFza19sYmEsIFRfVEFTSyhjbWQpLT50X3Rhc2tzX3NlY3RvcnMsCi0JCQlUX1RBU0soY21kKS0+dF90YXNrX2NkYnMpOwotI2VuZGlmCisJCWF0b21pY19pbmMoJmNtZC0+dF9mZV9jb3VudCk7CisJCWF0b21pY19pbmMoJmNtZC0+dF9zZV9jb3VudCk7CisJCXNldF9jb3VudHMgPSAwOworCX0KKwkvKgorCSAqIFNldHVwIHRoZSB0YXNrcyBhbmQgbWVtb3J5IGZyb20gY21kLT50X21lbV9saXN0CisJICogTm90ZSBmb3IgQklESSB0cmFuc2ZlcnMgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIFdSSVRFIHBheWxvYWQKKwkgKi8KKwl0YXNrX2NkYnMgPSB0cmFuc3BvcnRfYWxsb2NhdGVfdGFza3MoY21kLAorCQkJCQkgICAgIGNtZC0+dF90YXNrX2xiYSwKKwkJCQkJICAgICBjbWQtPmRhdGFfZGlyZWN0aW9uLAorCQkJCQkgICAgIGNtZC0+dF9kYXRhX3NnLAorCQkJCQkgICAgIGNtZC0+dF9kYXRhX25lbnRzKTsKKwlpZiAodGFza19jZGJzIDw9IDApIHsKKwkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTjsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9CisJCQlUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKwkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOwogCX0KIAotCWF0b21pY19zZXQoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19sZWZ0LCB0YXNrX2NkYnMpOwotCWF0b21pY19zZXQoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19leF9sZWZ0LCB0YXNrX2NkYnMpOwotCWF0b21pY19zZXQoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric190aW1lb3V0X2xlZnQsIHRhc2tfY2Ricyk7CisJaWYgKHNldF9jb3VudHMpIHsKKwkJYXRvbWljX2luYygmY21kLT50X2ZlX2NvdW50KTsKKwkJYXRvbWljX2luYygmY21kLT50X3NlX2NvdW50KTsKKwl9CisKKwljbWQtPnRfdGFza19saXN0X251bSA9IHRhc2tfY2RiczsKKworCWF0b21pY19zZXQoJmNtZC0+dF90YXNrX2NkYnNfbGVmdCwgdGFza19jZGJzKTsKKwlhdG9taWNfc2V0KCZjbWQtPnRfdGFza19jZGJzX2V4X2xlZnQsIHRhc2tfY2Ricyk7CisJYXRvbWljX3NldCgmY21kLT50X3Rhc2tfY2Ric190aW1lb3V0X2xlZnQsIHRhc2tfY2Ricyk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICp0cmFuc3BvcnRfaW5pdF9zZV9tZW1fbGlzdCh2b2lkKQordm9pZCAqdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpzZV9tZW1fbGlzdDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gY21kLT50X2RhdGFfc2c7CiAKLQlzZV9tZW1fbGlzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIShzZV9tZW1fbGlzdCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzZV9tZW1fbGlzdFxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlJTklUX0xJU1RfSEVBRChzZV9tZW1fbGlzdCk7Ci0KLQlyZXR1cm4gc2VfbWVtX2xpc3Q7CisJQlVHX09OKCFzZyk7CisJLyoKKwkgKiBXZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IGEgcG9zc2libGUgb2Zmc2V0IGhlcmUgZm9yIGZhYnJpY3MgbGlrZQorCSAqIHRjbV9sb29wIHdobyBtYXkgYmUgdXNpbmcgYSBjb250aWcgYnVmZmVyIGZyb20gdGhlIFNDU0kgbWlkbGF5ZXIgZm9yCisJICogY29udHJvbCBDREJzIHBhc3NlZCBhcyBTR0xzIHZpYSB0cmFuc3BvcnRfZ2VuZXJpY19tYXBfbWVtX3RvX2NtZCgpCisJICovCisJcmV0dXJuIGttYXAoc2dfcGFnZShzZykpICsgc2ctPm9mZnNldDsKIH0KK0VYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKTsKKwordm9pZCB0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShzdHJ1Y3Qgc2VfY21kICpjbWQpCit7CisJa3VubWFwKHNnX3BhZ2UoY21kLT50X2RhdGFfc2cpKTsKK30KK0VYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UpOwogCiBzdGF0aWMgaW50Ci10cmFuc3BvcnRfZ2VuZXJpY19nZXRfbWVtKHN0cnVjdCBzZV9jbWQgKmNtZCwgdTMyIGxlbmd0aCwgdTMyIGRtYV9zaXplKQordHJhbnNwb3J0X2dlbmVyaWNfZ2V0X21lbShzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7Ci0JdW5zaWduZWQgY2hhciAqYnVmOwotCXN0cnVjdCBzZV9tZW0gKnNlX21lbTsKKwl1MzIgbGVuZ3RoID0gY21kLT5kYXRhX2xlbmd0aDsKKwl1bnNpZ25lZCBpbnQgbmVudHM7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGkgPSAwOwogCi0JVF9UQVNLKGNtZCktPnRfbWVtX2xpc3QgPSB0cmFuc3BvcnRfaW5pdF9zZV9tZW1fbGlzdCgpOwotCWlmICghKFRfVEFTSyhjbWQpLT50X21lbV9saXN0KSkKKwluZW50cyA9IERJVl9ST1VORF9VUChsZW5ndGgsIFBBR0VfU0laRSk7CisJY21kLT50X2RhdGFfc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpICogbmVudHMsIEdGUF9LRVJORUwpOworCWlmICghY21kLT50X2RhdGFfc2cpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JLyoKLQkgKiBJZiB0aGUgZGV2aWNlIHVzZXMgbWVtb3J5IG1hcHBpbmcgdGhpcyBpcyBlbm91Z2guCi0JICovCi0JaWYgKGNtZC0+c2VfZGV2LT50cmFuc3BvcnQtPmRvX3NlX21lbV9tYXApCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiBTZXR1cCBCSURJLUNPTU1BTkQgUkVBRCBsaXN0IG9mIHN0cnVjdCBzZV9tZW0gZWxlbWVudHMKLQkgKi8KLQlpZiAoVF9UQVNLKGNtZCktPnRfdGFza3NfYmlkaSkgewotCQlUX1RBU0soY21kKS0+dF9tZW1fYmlkaV9saXN0ID0gdHJhbnNwb3J0X2luaXRfc2VfbWVtX2xpc3QoKTsKLQkJaWYgKCEoVF9UQVNLKGNtZCktPnRfbWVtX2JpZGlfbGlzdCkpIHsKLQkJCWtmcmVlKFRfVEFTSyhjbWQpLT50X21lbV9saXN0KTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQorCWNtZC0+dF9kYXRhX25lbnRzID0gbmVudHM7CisJc2dfaW5pdF90YWJsZShjbWQtPnRfZGF0YV9zZywgbmVudHMpOwogCiAJd2hpbGUgKGxlbmd0aCkgewotCQlzZV9tZW0gPSBrbWVtX2NhY2hlX3phbGxvYyhzZV9tZW1fY2FjaGUsIEdGUF9LRVJORUwpOwotCQlpZiAoIShzZV9tZW0pKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3Qgc2VfbWVtXG4iKTsKKwkJdTMyIHBhZ2VfbGVuID0gbWluX3QodTMyLCBsZW5ndGgsIFBBR0VfU0laRSk7CisJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKCFwYWdlKQogCQkJZ290byBvdXQ7Ci0JCX0KIAotLyogI3dhcm5pbmcgRklYTUUgQWxsb2NhdGUgY29udGlnb3VzIHBhZ2VzIGZvciBzdHJ1Y3Qgc2VfbWVtIGVsZW1lbnRzICovCi0JCXNlX21lbS0+c2VfcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwsIDApOwotCQlpZiAoIShzZV9tZW0tPnNlX3BhZ2UpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImFsbG9jX3BhZ2VzKCkgZmFpbGVkXG4iKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJYnVmID0ga21hcF9hdG9taWMoc2VfbWVtLT5zZV9wYWdlLCBLTV9JUlEwKTsKLQkJaWYgKCEoYnVmKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJrbWFwX2F0b21pYygpIGZhaWxlZFxuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlJTklUX0xJU1RfSEVBRCgmc2VfbWVtLT5zZV9saXN0KTsKLQkJc2VfbWVtLT5zZV9sZW4gPSAobGVuZ3RoID4gZG1hX3NpemUpID8gZG1hX3NpemUgOiBsZW5ndGg7Ci0JCW1lbXNldChidWYsIDAsIHNlX21lbS0+c2VfbGVuKTsKLQkJa3VubWFwX2F0b21pYyhidWYsIEtNX0lSUTApOwotCi0JCWxpc3RfYWRkX3RhaWwoJnNlX21lbS0+c2VfbGlzdCwgVF9UQVNLKGNtZCktPnRfbWVtX2xpc3QpOwotCQlUX1RBU0soY21kKS0+dF90YXNrc19zZV9udW0rKzsKLQotCQlERUJVR19NRU0oIkFsbG9jYXRlZCBzdHJ1Y3Qgc2VfbWVtIHBhZ2UoJXApIExlbmd0aCgldSkiCi0JCQkiIE9mZnNldCgldSlcbiIsIHNlX21lbS0+c2VfcGFnZSwgc2VfbWVtLT5zZV9sZW4sCi0JCQlzZV9tZW0tPnNlX29mZik7Ci0KLQkJbGVuZ3RoIC09IHNlX21lbS0+c2VfbGVuOworCQlzZ19zZXRfcGFnZSgmY21kLT50X2RhdGFfc2dbaV0sIHBhZ2UsIHBhZ2VfbGVuLCAwKTsKKwkJbGVuZ3RoIC09IHBhZ2VfbGVuOworCQlpKys7CiAJfQotCi0JREVCVUdfTUVNKCJBbGxvY2F0ZWQgdG90YWwgc3RydWN0IHNlX21lbSBlbGVtZW50cygldSlcbiIsCi0JCQlUX1RBU0soY21kKS0+dF90YXNrc19zZV9udW0pOwotCiAJcmV0dXJuIDA7CisKIG91dDoKLQlpZiAoc2VfbWVtKQotCQlfX2ZyZWVfcGFnZXMoc2VfbWVtLT5zZV9wYWdlLCAwKTsKLQlrbWVtX2NhY2hlX2ZyZWUoc2VfbWVtX2NhY2hlLCBzZV9tZW0pOwotCXJldHVybiAtMTsKKwl3aGlsZSAoaSA+PSAwKSB7CisJCV9fZnJlZV9wYWdlKHNnX3BhZ2UoJmNtZC0+dF9kYXRhX3NnW2ldKSk7CisJCWktLTsKKwl9CisJa2ZyZWUoY21kLT50X2RhdGFfc2cpOworCWNtZC0+dF9kYXRhX3NnID0gTlVMTDsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAotdTMyIHRyYW5zcG9ydF9jYWxjX3NnX251bSgKLQlzdHJ1Y3Qgc2VfdGFzayAqdGFzaywKLQlzdHJ1Y3Qgc2VfbWVtICppbl9zZV9tZW0sCi0JdTMyIHRhc2tfb2Zmc2V0KQotewotCXN0cnVjdCBzZV9jbWQgKnNlX2NtZCA9IHRhc2stPnRhc2tfc2VfY21kOwotCXN0cnVjdCBzZV9kZXZpY2UgKnNlX2RldiA9IFNFX0RFVihzZV9jbWQpOwotCXN0cnVjdCBzZV9tZW0gKnNlX21lbSA9IGluX3NlX21lbTsKLQlzdHJ1Y3QgdGFyZ2V0X2NvcmVfZmFicmljX29wcyAqdGZvID0gQ01EX1RGTyhzZV9jbWQpOwotCXUzMiBzZ19sZW5ndGgsIHRhc2tfc2l6ZSA9IHRhc2stPnRhc2tfc2l6ZSwgdGFza19zZ19udW1fcGFkZGVkOwotCi0Jd2hpbGUgKHRhc2tfc2l6ZSAhPSAwKSB7Ci0JCURFQlVHX1NDKCJzZV9tZW0tPnNlX3BhZ2UoJXApIHNlX21lbS0+c2VfbGVuKCV1KSIKLQkJCSIgc2VfbWVtLT5zZV9vZmYoJXUpIHRhc2tfb2Zmc2V0KCV1KVxuIiwKLQkJCXNlX21lbS0+c2VfcGFnZSwgc2VfbWVtLT5zZV9sZW4sCi0JCQlzZV9tZW0tPnNlX29mZiwgdGFza19vZmZzZXQpOwotCi0JCWlmICh0YXNrX29mZnNldCA9PSAwKSB7Ci0JCQlpZiAodGFza19zaXplID49IHNlX21lbS0+c2VfbGVuKSB7Ci0JCQkJc2dfbGVuZ3RoID0gc2VfbWVtLT5zZV9sZW47Ci0KLQkJCQlpZiAoIShsaXN0X2lzX2xhc3QoJnNlX21lbS0+c2VfbGlzdCwKLQkJCQkJCVRfVEFTSyhzZV9jbWQpLT50X21lbV9saXN0KSkpCi0JCQkJCXNlX21lbSA9IGxpc3RfZW50cnkoc2VfbWVtLT5zZV9saXN0Lm5leHQsCi0JCQkJCQkJc3RydWN0IHNlX21lbSwgc2VfbGlzdCk7Ci0JCQl9IGVsc2UgewotCQkJCXNnX2xlbmd0aCA9IHRhc2tfc2l6ZTsKLQkJCQl0YXNrX3NpemUgLT0gc2dfbGVuZ3RoOwotCQkJCWdvdG8gbmV4dDsKLQkJCX0KLQotCQkJREVCVUdfU0MoInNnX2xlbmd0aCgldSkgdGFza19zaXplKCV1KVxuIiwKLQkJCQkJc2dfbGVuZ3RoLCB0YXNrX3NpemUpOwotCQl9IGVsc2UgewotCQkJaWYgKChzZV9tZW0tPnNlX2xlbiAtIHRhc2tfb2Zmc2V0KSA+IHRhc2tfc2l6ZSkgewotCQkJCXNnX2xlbmd0aCA9IHRhc2tfc2l6ZTsKLQkJCQl0YXNrX3NpemUgLT0gc2dfbGVuZ3RoOwotCQkJCWdvdG8gbmV4dDsKLQkJCSB9IGVsc2UgewotCQkJCXNnX2xlbmd0aCA9IChzZV9tZW0tPnNlX2xlbiAtIHRhc2tfb2Zmc2V0KTsKLQotCQkJCWlmICghKGxpc3RfaXNfbGFzdCgmc2VfbWVtLT5zZV9saXN0LAotCQkJCQkJVF9UQVNLKHNlX2NtZCktPnRfbWVtX2xpc3QpKSkKLQkJCQkJc2VfbWVtID0gbGlzdF9lbnRyeShzZV9tZW0tPnNlX2xpc3QubmV4dCwKLQkJCQkJCQlzdHJ1Y3Qgc2VfbWVtLCBzZV9saXN0KTsKLQkJCX0KLQotCQkJREVCVUdfU0MoInNnX2xlbmd0aCgldSkgdGFza19zaXplKCV1KVxuIiwKLQkJCQkJc2dfbGVuZ3RoLCB0YXNrX3NpemUpOwotCi0JCQl0YXNrX29mZnNldCA9IDA7Ci0JCX0KLQkJdGFza19zaXplIC09IHNnX2xlbmd0aDsKLW5leHQ6Ci0JCURFQlVHX1NDKCJ0YXNrWyV1XSAtIFJlZHVjaW5nIHRhc2tfc2l6ZSB0bygldSlcbiIsCi0JCQl0YXNrLT50YXNrX25vLCB0YXNrX3NpemUpOwotCi0JCXRhc2stPnRhc2tfc2dfbnVtKys7Ci0JfQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIGZhYnJpYyBtb2R1bGUgZHJpdmVyIGlzIHJlcXVlc3RpbmcgdGhhdCBhbGwKLQkgKiBzdHJ1Y3Qgc2VfdGFzay0+dGFza19zZ1tdIGJlIGNoYWluZWQgdG9nZXRoZXIuLiAgSWYgc28sCi0JICogdGhlbiBhbGxvY2F0ZSBhbiBleHRyYSBwYWRkaW5nIFNHIGVudHJ5IGZvciBsaW5raW5nIGFuZAotCSAqIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgY2hhaW5lZCBTR0wuCi0JICovCi0JaWYgKHRmby0+dGFza19zZ19jaGFpbmluZykgewotCQl0YXNrX3NnX251bV9wYWRkZWQgPSAodGFzay0+dGFza19zZ19udW0gKyAxKTsKLQkJdGFzay0+dGFza19wYWRkZWRfc2cgPSAxOwotCX0gZWxzZQotCQl0YXNrX3NnX251bV9wYWRkZWQgPSB0YXNrLT50YXNrX3NnX251bTsKLQotCXRhc2stPnRhc2tfc2cgPSBremFsbG9jKHRhc2tfc2dfbnVtX3BhZGRlZCAqCi0JCQlzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEodGFzay0+dGFza19zZykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciIKLQkJCQkiIHRhc2stPnRhc2tfc2dcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc2dfaW5pdF90YWJsZSgmdGFzay0+dGFza19zZ1swXSwgdGFza19zZ19udW1fcGFkZGVkKTsKLQkvKgotCSAqIFNldHVwIHRhc2stPnRhc2tfc2dfYmlkaSBmb3IgU0NTSSBSRUFEIHBheWxvYWQgZm9yCi0JICogVENNL3BTQ1NJIHBhc3N0aHJvdWdoIGlmIHByZXNlbnQgZm9yIEJJREktQ09NTUFORAotCSAqLwotCWlmICgoVF9UQVNLKHNlX2NtZCktPnRfbWVtX2JpZGlfbGlzdCAhPSBOVUxMKSAmJgotCSAgICAoVFJBTlNQT1JUKHNlX2RldiktPnRyYW5zcG9ydF90eXBlID09IFRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKSkgewotCQl0YXNrLT50YXNrX3NnX2JpZGkgPSBremFsbG9jKHRhc2tfc2dfbnVtX3BhZGRlZCAqCi0JCQkJc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCksIEdGUF9LRVJORUwpOwotCQlpZiAoISh0YXNrLT50YXNrX3NnX2JpZGkpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIgotCQkJCSIgdGFzay0+dGFza19zZ19iaWRpXG4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXNnX2luaXRfdGFibGUoJnRhc2stPnRhc2tfc2dfYmlkaVswXSwgdGFza19zZ19udW1fcGFkZGVkKTsKLQl9Ci0JLyoKLQkgKiBGb3IgdGhlIGNoYWluaW5nIGNhc2UsIHNldHVwIHRoZSBwcm9wZXIgZW5kIG9mIFNHTCBmb3IgdGhlCi0JICogaW5pdGlhbCBzdWJtaXNzaW9uIHN0cnVjdCB0YXNrIGludG8gc3RydWN0IHNlX3N1YnN5c3RlbV9hcGkuCi0JICogVGhpcyB3aWxsIGJlIGNsZWFyZWQgbGF0ZXIgYnkgdHJhbnNwb3J0X2RvX3Rhc2tfc2dfY2hhaW4oKQotCSAqLwotCWlmICh0YXNrLT50YXNrX3BhZGRlZF9zZykgewotCQlzZ19tYXJrX2VuZCgmdGFzay0+dGFza19zZ1t0YXNrLT50YXNrX3NnX251bSAtIDFdKTsKLQkJLyoKLQkJICogQWRkZWQgdGhlICdpZicgY2hlY2sgYmVmb3JlIG1hcmtpbmcgZW5kIG9mIGJpLWRpcmVjdGlvbmFsCi0JCSAqIHNjYXR0ZXJsaXN0ICh3aGljaCBnZXRzIGNyZWF0ZWQgb25seSBpbiBjYXNlIG9mIHJlcXVlc3QKLQkJICogKFJEICsgV1IpLgotCQkgKi8KLQkJaWYgKHRhc2stPnRhc2tfc2dfYmlkaSkKLQkJCXNnX21hcmtfZW5kKCZ0YXNrLT50YXNrX3NnX2JpZGlbdGFzay0+dGFza19zZ19udW0gLSAxXSk7Ci0JfQotCi0JREVCVUdfU0MoIlN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgdGFzay0+dGFza19zZ19udW0oJXUpLCIKLQkJIiB0YXNrX3NnX251bV9wYWRkZWQoJXUpXG4iLCB0YXNrLT50YXNrX3NnX251bSwKLQkJdGFza19zZ19udW1fcGFkZGVkKTsKLQotCXJldHVybiB0YXNrLT50YXNrX3NnX251bTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdHJhbnNwb3J0X3NldF90YXNrc19zZWN0b3JzX2Rpc2soCi0Jc3RydWN0IHNlX3Rhc2sgKnRhc2ssCisvKiBSZWR1Y2Ugc2VjdG9ycyBpZiB0aGV5IGFyZSB0b28gbG9uZyBmb3IgdGhlIGRldmljZSAqLworc3RhdGljIGlubGluZSBzZWN0b3JfdCB0cmFuc3BvcnRfbGltaXRfdGFza19zZWN0b3JzKAogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiwKIAl1bnNpZ25lZCBsb25nIGxvbmcgbGJhLAotCXUzMiBzZWN0b3JzLAotCWludCAqbWF4X3NlY3RvcnNfc2V0KQorCXNlY3Rvcl90IHNlY3RvcnMpCiB7Ci0JaWYgKChsYmEgKyBzZWN0b3JzKSA+IHRyYW5zcG9ydF9kZXZfZW5kX2xiYShkZXYpKSB7Ci0JCXRhc2stPnRhc2tfc2VjdG9ycyA9ICgodHJhbnNwb3J0X2Rldl9lbmRfbGJhKGRldikgLSBsYmEpICsgMSk7CisJc2VjdG9ycyA9IG1pbl90KHNlY3Rvcl90LCBzZWN0b3JzLCBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIubWF4X3NlY3RvcnMpOwogCi0JCWlmICh0YXNrLT50YXNrX3NlY3RvcnMgPiBERVZfQVRUUklCKGRldiktPm1heF9zZWN0b3JzKSB7Ci0JCQl0YXNrLT50YXNrX3NlY3RvcnMgPSBERVZfQVRUUklCKGRldiktPm1heF9zZWN0b3JzOwotCQkJKm1heF9zZWN0b3JzX3NldCA9IDE7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoc2VjdG9ycyA+IERFVl9BVFRSSUIoZGV2KS0+bWF4X3NlY3RvcnMpIHsKLQkJCXRhc2stPnRhc2tfc2VjdG9ycyA9IERFVl9BVFRSSUIoZGV2KS0+bWF4X3NlY3RvcnM7Ci0JCQkqbWF4X3NlY3RvcnNfc2V0ID0gMTsKLQkJfSBlbHNlCi0JCQl0YXNrLT50YXNrX3NlY3RvcnMgPSBzZWN0b3JzOwotCX0KKwlpZiAoZGV2LT50cmFuc3BvcnQtPmdldF9kZXZpY2VfdHlwZShkZXYpID09IFRZUEVfRElTSykKKwkJaWYgKChsYmEgKyBzZWN0b3JzKSA+IHRyYW5zcG9ydF9kZXZfZW5kX2xiYShkZXYpKQorCQkJc2VjdG9ycyA9ICgodHJhbnNwb3J0X2Rldl9lbmRfbGJhKGRldikgLSBsYmEpICsgMSk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc2VjdG9yczsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdHJhbnNwb3J0X3NldF90YXNrc19zZWN0b3JzX25vbl9kaXNrKAotCXN0cnVjdCBzZV90YXNrICp0YXNrLAotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiwKLQl1bnNpZ25lZCBsb25nIGxvbmcgbGJhLAotCXUzMiBzZWN0b3JzLAotCWludCAqbWF4X3NlY3RvcnNfc2V0KQotewotCWlmIChzZWN0b3JzID4gREVWX0FUVFJJQihkZXYpLT5tYXhfc2VjdG9ycykgewotCQl0YXNrLT50YXNrX3NlY3RvcnMgPSBERVZfQVRUUklCKGRldiktPm1heF9zZWN0b3JzOwotCQkqbWF4X3NlY3RvcnNfc2V0ID0gMTsKLQl9IGVsc2UKLQkJdGFzay0+dGFza19zZWN0b3JzID0gc2VjdG9yczsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB0cmFuc3BvcnRfc2V0X3Rhc2tzX3NlY3RvcnMoCi0Jc3RydWN0IHNlX3Rhc2sgKnRhc2ssCi0Jc3RydWN0IHNlX2RldmljZSAqZGV2LAotCXVuc2lnbmVkIGxvbmcgbG9uZyBsYmEsCi0JdTMyIHNlY3RvcnMsCi0JaW50ICptYXhfc2VjdG9yc19zZXQpCi17Ci0JcmV0dXJuIChUUkFOU1BPUlQoZGV2KS0+Z2V0X2RldmljZV90eXBlKGRldikgPT0gVFlQRV9ESVNLKSA/Ci0JCXRyYW5zcG9ydF9zZXRfdGFza3Nfc2VjdG9yc19kaXNrKHRhc2ssIGRldiwgbGJhLCBzZWN0b3JzLAotCQkJCW1heF9zZWN0b3JzX3NldCkgOgotCQl0cmFuc3BvcnRfc2V0X3Rhc2tzX3NlY3RvcnNfbm9uX2Rpc2sodGFzaywgZGV2LCBsYmEsIHNlY3RvcnMsCi0JCQkJbWF4X3NlY3RvcnNfc2V0KTsKLX0KLQotc3RhdGljIGludCB0cmFuc3BvcnRfbWFwX3NnX3RvX21lbSgKLQlzdHJ1Y3Qgc2VfY21kICpjbWQsCi0Jc3RydWN0IGxpc3RfaGVhZCAqc2VfbWVtX2xpc3QsCi0Jdm9pZCAqaW5fbWVtLAotCXUzMiAqc2VfbWVtX2NudCkKLXsKLQlzdHJ1Y3Qgc2VfbWVtICpzZV9tZW07Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQl1MzIgc2dfY291bnQgPSAxLCBjbWRfc2l6ZSA9IGNtZC0+ZGF0YV9sZW5ndGg7Ci0KLQlpZiAoIWluX21lbSkgewotCQlwcmludGsoS0VSTl9FUlIgIk5vIHNvdXJjZSBzY2F0dGVybGlzdFxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopaW5fbWVtOwotCi0Jd2hpbGUgKGNtZF9zaXplKSB7Ci0JCXNlX21lbSA9IGttZW1fY2FjaGVfemFsbG9jKHNlX21lbV9jYWNoZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghKHNlX21lbSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBzZV9tZW1cbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUlOSVRfTElTVF9IRUFEKCZzZV9tZW0tPnNlX2xpc3QpOwotCQlERUJVR19NRU0oInNnX3RvX21lbTogU3RhcnRpbmcgbG9vcCB3aXRoIGNtZF9zaXplOiAldSIKLQkJCSIgc2dfcGFnZTogJXAgb2Zmc2V0OiAlZCBsZW5ndGg6ICVkXG4iLCBjbWRfc2l6ZSwKLQkJCXNnX3BhZ2Uoc2cpLCBzZy0+b2Zmc2V0LCBzZy0+bGVuZ3RoKTsKLQotCQlzZV9tZW0tPnNlX3BhZ2UgPSBzZ19wYWdlKHNnKTsKLQkJc2VfbWVtLT5zZV9vZmYgPSBzZy0+b2Zmc2V0OwotCi0JCWlmIChjbWRfc2l6ZSA+IHNnLT5sZW5ndGgpIHsKLQkJCXNlX21lbS0+c2VfbGVuID0gc2ctPmxlbmd0aDsKLQkJCXNnID0gc2dfbmV4dChzZyk7Ci0JCQlzZ19jb3VudCsrOwotCQl9IGVsc2UKLQkJCXNlX21lbS0+c2VfbGVuID0gY21kX3NpemU7Ci0KLQkJY21kX3NpemUgLT0gc2VfbWVtLT5zZV9sZW47Ci0KLQkJREVCVUdfTUVNKCJzZ190b19tZW06ICpzZV9tZW1fY250OiAldSBjbWRfc2l6ZTogJXVcbiIsCi0JCQkJKnNlX21lbV9jbnQsIGNtZF9zaXplKTsKLQkJREVCVUdfTUVNKCJzZ190b19tZW06IEZpbmFsIHNlX3BhZ2U6ICVwIHNlX29mZjogJWQgc2VfbGVuOiAlZFxuIiwKLQkJCQlzZV9tZW0tPnNlX3BhZ2UsIHNlX21lbS0+c2Vfb2ZmLCBzZV9tZW0tPnNlX2xlbik7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmc2VfbWVtLT5zZV9saXN0LCBzZV9tZW1fbGlzdCk7Ci0JCSgqc2VfbWVtX2NudCkrKzsKLQl9Ci0KLQlERUJVR19NRU0oInRhc2tbMF0gLSBNYXBwZWQoJXUpIHN0cnVjdCBzY2F0dGVybGlzdCBzZWdtZW50cyB0bygldSkiCi0JCSIgc3RydWN0IHNlX21lbVxuIiwgc2dfY291bnQsICpzZV9tZW1fY250KTsKLQotCWlmIChzZ19jb3VudCAhPSAqc2VfbWVtX2NudCkKLQkJQlVHKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoJdHJhbnNwb3J0X21hcF9tZW1fdG9fc2coKToKLSAqCi0gKgotICovCi1pbnQgdHJhbnNwb3J0X21hcF9tZW1fdG9fc2coCi0Jc3RydWN0IHNlX3Rhc2sgKnRhc2ssCi0Jc3RydWN0IGxpc3RfaGVhZCAqc2VfbWVtX2xpc3QsCi0Jdm9pZCAqaW5fbWVtLAotCXN0cnVjdCBzZV9tZW0gKmluX3NlX21lbSwKLQlzdHJ1Y3Qgc2VfbWVtICoqb3V0X3NlX21lbSwKLQl1MzIgKnNlX21lbV9jbnQsCi0JdTMyICp0YXNrX29mZnNldCkKLXsKLQlzdHJ1Y3Qgc2VfY21kICpzZV9jbWQgPSB0YXNrLT50YXNrX3NlX2NtZDsKLQlzdHJ1Y3Qgc2VfbWVtICpzZV9tZW0gPSBpbl9zZV9tZW07Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilpbl9tZW07Ci0JdTMyIHRhc2tfc2l6ZSA9IHRhc2stPnRhc2tfc2l6ZSwgc2dfbm8gPSAwOwotCi0JaWYgKCFzZykgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBsb2NhdGUgdmFsaWQgc3RydWN0IgotCQkJCSIgc2NhdHRlcmxpc3QgcG9pbnRlclxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl3aGlsZSAodGFza19zaXplICE9IDApIHsKLQkJLyoKLQkJICogU2V0dXAgdGhlIGNvbnRpZ2lvdXMgYXJyYXkgb2Ygc2NhdHRlcmxpc3RzIGZvcgotCQkgKiB0aGlzIHN0cnVjdCBzZV90YXNrLgotCQkgKi8KLQkJc2dfYXNzaWduX3BhZ2Uoc2csIHNlX21lbS0+c2VfcGFnZSk7Ci0KLQkJaWYgKCp0YXNrX29mZnNldCA9PSAwKSB7Ci0JCQlzZy0+b2Zmc2V0ID0gc2VfbWVtLT5zZV9vZmY7Ci0KLQkJCWlmICh0YXNrX3NpemUgPj0gc2VfbWVtLT5zZV9sZW4pIHsKLQkJCQlzZy0+bGVuZ3RoID0gc2VfbWVtLT5zZV9sZW47Ci0KLQkJCQlpZiAoIShsaXN0X2lzX2xhc3QoJnNlX21lbS0+c2VfbGlzdCwKLQkJCQkJCVRfVEFTSyhzZV9jbWQpLT50X21lbV9saXN0KSkpIHsKLQkJCQkJc2VfbWVtID0gbGlzdF9lbnRyeShzZV9tZW0tPnNlX2xpc3QubmV4dCwKLQkJCQkJCQlzdHJ1Y3Qgc2VfbWVtLCBzZV9saXN0KTsKLQkJCQkJKCpzZV9tZW1fY250KSsrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2ctPmxlbmd0aCA9IHRhc2tfc2l6ZTsKLQkJCQkvKgotCQkJCSAqIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSBhbiBvZmZzZXQKLQkJCQkgKiBpbnRvIHRoZSBzdHJ1Y3Qgc2VfbWVtIG9uIHRoZSBuZXh0IGdvIGFyb3VuZC4uCi0JCQkJICovCi0JCQkJdGFza19zaXplIC09IHNnLT5sZW5ndGg7Ci0JCQkJaWYgKCEodGFza19zaXplKSkKLQkJCQkJKnRhc2tfb2Zmc2V0ID0gc2ctPmxlbmd0aDsKLQotCQkJCWdvdG8gbmV4dDsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJc2ctPm9mZnNldCA9ICgqdGFza19vZmZzZXQgKyBzZV9tZW0tPnNlX29mZik7Ci0KLQkJCWlmICgoc2VfbWVtLT5zZV9sZW4gLSAqdGFza19vZmZzZXQpID4gdGFza19zaXplKSB7Ci0JCQkJc2ctPmxlbmd0aCA9IHRhc2tfc2l6ZTsKLQkJCQkvKgotCQkJCSAqIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSBhbiBvZmZzZXQKLQkJCQkgKiBpbnRvIHRoZSBzdHJ1Y3Qgc2VfbWVtIG9uIHRoZSBuZXh0IGdvIGFyb3VuZC4uCi0JCQkJICovCi0JCQkJdGFza19zaXplIC09IHNnLT5sZW5ndGg7Ci0JCQkJaWYgKCEodGFza19zaXplKSkKLQkJCQkJKnRhc2tfb2Zmc2V0ICs9IHNnLT5sZW5ndGg7Ci0KLQkJCQlnb3RvIG5leHQ7Ci0JCQl9IGVsc2UgewotCQkJCXNnLT5sZW5ndGggPSAoc2VfbWVtLT5zZV9sZW4gLSAqdGFza19vZmZzZXQpOwotCi0JCQkJaWYgKCEobGlzdF9pc19sYXN0KCZzZV9tZW0tPnNlX2xpc3QsCi0JCQkJCQlUX1RBU0soc2VfY21kKS0+dF9tZW1fbGlzdCkpKSB7Ci0JCQkJCXNlX21lbSA9IGxpc3RfZW50cnkoc2VfbWVtLT5zZV9saXN0Lm5leHQsCi0JCQkJCQkJc3RydWN0IHNlX21lbSwgc2VfbGlzdCk7Ci0JCQkJCSgqc2VfbWVtX2NudCkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCSp0YXNrX29mZnNldCA9IDA7Ci0JCX0KLQkJdGFza19zaXplIC09IHNnLT5sZW5ndGg7Ci1uZXh0OgotCQlERUJVR19NRU0oInRhc2tbJXVdIG1lbV90b19zZyAtIHNnWyV1XSglcCkoJXUpKCV1KSAtIFJlZHVjaW5nIgotCQkJIiB0YXNrX3NpemUgdG8oJXUpLCB0YXNrX29mZnNldDogJXVcbiIsIHRhc2stPnRhc2tfbm8sIHNnX25vLAotCQkJc2dfcGFnZShzZyksIHNnLT5sZW5ndGgsIHNnLT5vZmZzZXQsIHRhc2tfc2l6ZSwgKnRhc2tfb2Zmc2V0KTsKLQotCQlzZ19ubysrOwotCQlpZiAoISh0YXNrX3NpemUpKQotCQkJYnJlYWs7Ci0KLQkJc2cgPSBzZ19uZXh0KHNnKTsKLQotCQlpZiAodGFza19zaXplID4gc2VfY21kLT5kYXRhX2xlbmd0aCkKLQkJCUJVRygpOwotCX0KLQkqb3V0X3NlX21lbSA9IHNlX21lbTsKLQotCURFQlVHX01FTSgidGFza1sldV0gLSBNYXBwZWQoJXUpIHN0cnVjdCBzZV9tZW0gc2VnbWVudHMgdG8gdG90YWwoJXUpIgotCQkiIFNHc1xuIiwgdGFzay0+dGFza19ubywgKnNlX21lbV9jbnQsIHNnX25vKTsKLQotCXJldHVybiAwOwotfQogCiAvKgogICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSBIVyB0YXJnZXQgbW9kZSBkcml2ZXJzIHRvIGNyZWF0ZSBhIGxpbmtlZApAQCAtNDc1MSwzMzQgKzM5ODMsMjM2IEBACiAgKi8KIHZvaWQgdHJhbnNwb3J0X2RvX3Rhc2tfc2dfY2hhaW4oc3RydWN0IHNlX2NtZCAqY21kKQogewotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfaGVhZCA9IE5VTEwsICpzZ19saW5rID0gTlVMTCwgKnNnX2ZpcnN0ID0gTlVMTDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2hlYWRfY3VyID0gTlVMTCwgKnNnX2xpbmtfY3VyID0gTlVMTDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCAqc2dfZW5kID0gTlVMTCwgKnNnX2VuZF9jdXIgPSBOVUxMOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfZmlyc3QgPSBOVUxMOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfcHJldiA9IE5VTEw7CisJaW50IHNnX3ByZXZfbmVudHMgPSAwOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJc3RydWN0IHNlX3Rhc2sgKnRhc2s7Ci0Jc3RydWN0IHRhcmdldF9jb3JlX2ZhYnJpY19vcHMgKnRmbyA9IENNRF9URk8oY21kKTsKLQl1MzIgdGFza19zZ19udW0gPSAwLCBzZ19jb3VudCA9IDA7CisJdTMyIGNoYWluZWRfbmVudHMgPSAwOwogCWludCBpOwogCi0JaWYgKHRmby0+dGFza19zZ19jaGFpbmluZyA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidGFza19zZ19jaGFpbmluZyBpcyBkaWFibGVkIGZvciBmYWJyaWMgbW9kdWxlOiIKLQkJCQkiICVzXG4iLCB0Zm8tPmdldF9mYWJyaWNfbmFtZSgpKTsKLQkJZHVtcF9zdGFjaygpOwotCQlyZXR1cm47Ci0JfQorCUJVR19PTighY21kLT5zZV90Zm8tPnRhc2tfc2dfY2hhaW5pbmcpOworCiAJLyoKIAkgKiBXYWxrIHRoZSBzdHJ1Y3Qgc2VfdGFzayBsaXN0IGFuZCBzZXR1cCBzY2F0dGVybGlzdCBjaGFpbnMKLQkgKiBmb3IgZWFjaCBjb250aWd1b3NseSBhbGxvY2F0ZWQgc3RydWN0IHNlX3Rhc2stPnRhc2tfc2dbXS4KKwkgKiBmb3IgZWFjaCBjb250aWd1b3VzbHkgYWxsb2NhdGVkIHN0cnVjdCBzZV90YXNrLT50YXNrX3NnW10uCiAJICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXNrLCAmVF9UQVNLKGNtZCktPnRfdGFza19saXN0LCB0X2xpc3QpIHsKLQkJaWYgKCEodGFzay0+dGFza19zZykgfHwgISh0YXNrLT50YXNrX3BhZGRlZF9zZykpCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXNrLCAmY21kLT50X3Rhc2tfbGlzdCwgdF9saXN0KSB7CisJCWlmICghdGFzay0+dGFza19zZykKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChzZ19oZWFkICYmIHNnX2xpbmspIHsKLQkJCXNnX2hlYWRfY3VyID0gJnRhc2stPnRhc2tfc2dbMF07Ci0JCQlzZ19saW5rX2N1ciA9ICZ0YXNrLT50YXNrX3NnW3Rhc2stPnRhc2tfc2dfbnVtXTsKLQkJCS8qCi0JCQkgKiBFaXRoZXIgYWRkIGNoYWluIG9yIG1hcmsgZW5kIG9mIHNjYXR0ZXJsaXN0Ci0JCQkgKi8KLQkJCWlmICghKGxpc3RfaXNfbGFzdCgmdGFzay0+dF9saXN0LAotCQkJCQkmVF9UQVNLKGNtZCktPnRfdGFza19saXN0KSkpIHsKLQkJCQkvKgotCQkJCSAqIENsZWFyIGV4aXN0aW5nIFNHTCB0ZXJtaW5hdGlvbiBiaXQgc2V0IGluCi0JCQkJICogdHJhbnNwb3J0X2NhbGNfc2dfbnVtKCksIHNlZSBzZ19tYXJrX2VuZCgpCi0JCQkJICovCi0JCQkJc2dfZW5kX2N1ciA9ICZ0YXNrLT50YXNrX3NnW3Rhc2stPnRhc2tfc2dfbnVtIC0gMV07Ci0JCQkJc2dfZW5kX2N1ci0+cGFnZV9saW5rICY9IH4weDAyOworCQlCVUdfT04oIXRhc2stPnRhc2tfcGFkZGVkX3NnKTsKIAotCQkJCXNnX2NoYWluKHNnX2hlYWQsIHRhc2tfc2dfbnVtLCBzZ19oZWFkX2N1cik7Ci0JCQkJc2dfY291bnQgKz0gdGFzay0+dGFza19zZ19udW07Ci0JCQkJdGFza19zZ19udW0gPSAodGFzay0+dGFza19zZ19udW0gKyAxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2dfY2hhaW4oc2dfaGVhZCwgdGFza19zZ19udW0sIHNnX2hlYWRfY3VyKTsKLQkJCQlzZ19jb3VudCArPSB0YXNrLT50YXNrX3NnX251bTsKLQkJCQl0YXNrX3NnX251bSA9IHRhc2stPnRhc2tfc2dfbnVtOwotCQkJfQotCi0JCQlzZ19oZWFkID0gc2dfaGVhZF9jdXI7Ci0JCQlzZ19saW5rID0gc2dfbGlua19jdXI7Ci0JCQljb250aW51ZTsKLQkJfQotCQlzZ19oZWFkID0gc2dfZmlyc3QgPSAmdGFzay0+dGFza19zZ1swXTsKLQkJc2dfbGluayA9ICZ0YXNrLT50YXNrX3NnW3Rhc2stPnRhc2tfc2dfbnVtXTsKLQkJLyoKLQkJICogQ2hlY2sgZm9yIHNpbmdsZSB0YXNrLi4KLQkJICovCi0JCWlmICghKGxpc3RfaXNfbGFzdCgmdGFzay0+dF9saXN0LCAmVF9UQVNLKGNtZCktPnRfdGFza19saXN0KSkpIHsKLQkJCS8qCi0JCQkgKiBDbGVhciBleGlzdGluZyBTR0wgdGVybWluYXRpb24gYml0IHNldCBpbgotCQkJICogdHJhbnNwb3J0X2NhbGNfc2dfbnVtKCksIHNlZSBzZ19tYXJrX2VuZCgpCi0JCQkgKi8KLQkJCXNnX2VuZCA9ICZ0YXNrLT50YXNrX3NnW3Rhc2stPnRhc2tfc2dfbnVtIC0gMV07Ci0JCQlzZ19lbmQtPnBhZ2VfbGluayAmPSB+MHgwMjsKLQkJCXNnX2NvdW50ICs9IHRhc2stPnRhc2tfc2dfbnVtOwotCQkJdGFza19zZ19udW0gPSAodGFzay0+dGFza19zZ19udW0gKyAxKTsKKwkJaWYgKCFzZ19maXJzdCkgeworCQkJc2dfZmlyc3QgPSB0YXNrLT50YXNrX3NnOworCQkJY2hhaW5lZF9uZW50cyA9IHRhc2stPnRhc2tfc2dfbmVudHM7CiAJCX0gZWxzZSB7Ci0JCQlzZ19jb3VudCArPSB0YXNrLT50YXNrX3NnX251bTsKLQkJCXRhc2tfc2dfbnVtID0gdGFzay0+dGFza19zZ19udW07CisJCQlzZ19jaGFpbihzZ19wcmV2LCBzZ19wcmV2X25lbnRzLCB0YXNrLT50YXNrX3NnKTsKKwkJCWNoYWluZWRfbmVudHMgKz0gdGFzay0+dGFza19zZ19uZW50czsKIAkJfQorCisJCXNnX3ByZXYgPSB0YXNrLT50YXNrX3NnOworCQlzZ19wcmV2X25lbnRzID0gdGFzay0+dGFza19zZ19uZW50czsKIAl9CiAJLyoKIAkgKiBTZXR1cCB0aGUgc3RhcnRpbmcgcG9pbnRlciBhbmQgdG90YWwgdF90YXNrc19zZ19saW5rZWRfbm8gaW5jbHVkaW5nCiAJICogcGFkZGluZyBTR3MgZm9yIGxpbmtpbmcgYW5kIHRvIG1hcmsgdGhlIGVuZC4KIAkgKi8KLQlUX1RBU0soY21kKS0+dF90YXNrc19zZ19jaGFpbmVkID0gc2dfZmlyc3Q7Ci0JVF9UQVNLKGNtZCktPnRfdGFza3Nfc2dfY2hhaW5lZF9ubyA9IHNnX2NvdW50OworCWNtZC0+dF90YXNrc19zZ19jaGFpbmVkID0gc2dfZmlyc3Q7CisJY21kLT50X3Rhc2tzX3NnX2NoYWluZWRfbm8gPSBjaGFpbmVkX25lbnRzOwogCi0JREVCVUdfQ01EX00oIlNldHVwIGNtZDogJXAgVF9UQVNLKGNtZCktPnRfdGFza3Nfc2dfY2hhaW5lZDogJXAgYW5kIgotCQkiIHRfdGFza3Nfc2dfY2hhaW5lZF9ubzogJXVcbiIsIGNtZCwgVF9UQVNLKGNtZCktPnRfdGFza3Nfc2dfY2hhaW5lZCwKLQkJVF9UQVNLKGNtZCktPnRfdGFza3Nfc2dfY2hhaW5lZF9ubyk7CisJcHJfZGVidWcoIlNldHVwIGNtZDogJXAgY21kLT50X3Rhc2tzX3NnX2NoYWluZWQ6ICVwIGFuZCIKKwkJIiB0X3Rhc2tzX3NnX2NoYWluZWRfbm86ICV1XG4iLCBjbWQsIGNtZC0+dF90YXNrc19zZ19jaGFpbmVkLAorCQljbWQtPnRfdGFza3Nfc2dfY2hhaW5lZF9ubyk7CiAKLQlmb3JfZWFjaF9zZyhUX1RBU0soY21kKS0+dF90YXNrc19zZ19jaGFpbmVkLCBzZywKLQkJCVRfVEFTSyhjbWQpLT50X3Rhc2tzX3NnX2NoYWluZWRfbm8sIGkpIHsKKwlmb3JfZWFjaF9zZyhjbWQtPnRfdGFza3Nfc2dfY2hhaW5lZCwgc2csCisJCQljbWQtPnRfdGFza3Nfc2dfY2hhaW5lZF9ubywgaSkgewogCi0JCURFQlVHX0NNRF9NKCJTR1slZF06ICVwIHBhZ2U6ICVwIGxlbmd0aDogJWQgb2Zmc2V0OiAlZCwgbWFnaWM6IDB4JTA4eFxuIiwKLQkJCWksIHNnLCBzZ19wYWdlKHNnKSwgc2ctPmxlbmd0aCwgc2ctPm9mZnNldCwgc2ctPnNnX21hZ2ljKTsKKwkJcHJfZGVidWcoIlNHWyVkXTogJXAgcGFnZTogJXAgbGVuZ3RoOiAlZCBvZmZzZXQ6ICVkXG4iLAorCQkJaSwgc2csIHNnX3BhZ2Uoc2cpLCBzZy0+bGVuZ3RoLCBzZy0+b2Zmc2V0KTsKIAkJaWYgKHNnX2lzX2NoYWluKHNnKSkKLQkJCURFQlVHX0NNRF9NKCJTRzogJXAgc2dfaXNfY2hhaW49MVxuIiwgc2cpOworCQkJcHJfZGVidWcoIlNHOiAlcCBzZ19pc19jaGFpbj0xXG4iLCBzZyk7CiAJCWlmIChzZ19pc19sYXN0KHNnKSkKLQkJCURFQlVHX0NNRF9NKCJTRzogJXAgc2dfaXNfbGFzdD0xXG4iLCBzZyk7CisJCQlwcl9kZWJ1ZygiU0c6ICVwIHNnX2lzX2xhc3Q9MVxuIiwgc2cpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2RvX3Rhc2tfc2dfY2hhaW4pOwogCi1zdGF0aWMgaW50IHRyYW5zcG9ydF9kb19zZV9tZW1fbWFwKAotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiwKLQlzdHJ1Y3Qgc2VfdGFzayAqdGFzaywKLQlzdHJ1Y3QgbGlzdF9oZWFkICpzZV9tZW1fbGlzdCwKLQl2b2lkICppbl9tZW0sCi0Jc3RydWN0IHNlX21lbSAqaW5fc2VfbWVtLAotCXN0cnVjdCBzZV9tZW0gKipvdXRfc2VfbWVtLAotCXUzMiAqc2VfbWVtX2NudCwKLQl1MzIgKnRhc2tfb2Zmc2V0X2luKQotewotCXUzMiB0YXNrX29mZnNldCA9ICp0YXNrX29mZnNldF9pbjsKLQlpbnQgcmV0ID0gMDsKLQkvKgotCSAqIHNlX3N1YnN5c3RlbV9hcGlfdC0+ZG9fc2VfbWVtX21hcCBpcyB1c2VkIHdoZW4gaW50ZXJuYWwgYWxsb2NhdGlvbgotCSAqIGhhcyBiZWVuIGRvbmUgYnkgdGhlIHRyYW5zcG9ydCBwbHVnaW4uCi0JICovCi0JaWYgKFRSQU5TUE9SVChkZXYpLT5kb19zZV9tZW1fbWFwKSB7Ci0JCXJldCA9IFRSQU5TUE9SVChkZXYpLT5kb19zZV9tZW1fbWFwKHRhc2ssIHNlX21lbV9saXN0LAotCQkJCWluX21lbSwgaW5fc2VfbWVtLCBvdXRfc2VfbWVtLCBzZV9tZW1fY250LAotCQkJCXRhc2tfb2Zmc2V0X2luKTsKLQkJaWYgKHJldCA9PSAwKQotCQkJVF9UQVNLKHRhc2stPnRhc2tfc2VfY21kKS0+dF90YXNrc19zZV9udW0gKz0gKnNlX21lbV9jbnQ7Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlCVUdfT04obGlzdF9lbXB0eShzZV9tZW1fbGlzdCkpOwotCS8qCi0JICogVGhpcyBpcyB0aGUgbm9ybWFsIHBhdGggZm9yIGFsbCBub3JtYWwgbm9uIEJJREkgYW5kIEJJREktQ09NTUFORAotCSAqIFdSSVRFIHBheWxvYWRzLi4gIElmIHdlIG5lZWQgdG8gZG8gQklESSBSRUFEIHBhc3N0aHJvdWdoIGZvcgotCSAqIFRDTS9wU0NTSSB0aGUgZmlyc3QgY2FsbCB0byB0cmFuc3BvcnRfZG9fc2VfbWVtX21hcCAtPgotCSAqIHRyYW5zcG9ydF9jYWxjX3NnX251bSgpIC0+IHRyYW5zcG9ydF9tYXBfbWVtX3RvX3NnKCkgd2lsbCBkbyB0aGUKLQkgKiBhbGxvY2F0aW9uIGZvciB0YXNrLT50YXNrX3NnX2JpZGksIGFuZCB0aGUgc3Vic2VxdWVudCBjYWxsIHRvCi0JICogdHJhbnNwb3J0X2RvX3NlX21lbV9tYXAoKSBmcm9tIHRyYW5zcG9ydF9nZW5lcmljX2dldF9jZGJfY291bnQoKQotCSAqLwotCWlmICghKHRhc2stPnRhc2tfc2dfYmlkaSkpIHsKLQkJLyoKLQkJICogQXNzdW1lIGRlZmF1bHQgdGhhdCB0cmFuc3BvcnQgcGx1Z2luIHNwZWFrcyBwcmVhbGxvY2F0ZWQKLQkJICogc2NhdHRlcmxpc3RzLgotCQkgKi8KLQkJaWYgKCEodHJhbnNwb3J0X2NhbGNfc2dfbnVtKHRhc2ssIGluX3NlX21lbSwgdGFza19vZmZzZXQpKSkKLQkJCXJldHVybiAtMTsKLQkJLyoKLQkJICogc3RydWN0IHNlX3Rhc2stPnRhc2tfc2cgbm93IGNvbnRhaW5zIHRoZSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgYXJyYXkuCi0JCSAqLwotCQlyZXR1cm4gdHJhbnNwb3J0X21hcF9tZW1fdG9fc2codGFzaywgc2VfbWVtX2xpc3QsIHRhc2stPnRhc2tfc2csCi0JCQkJCWluX3NlX21lbSwgb3V0X3NlX21lbSwgc2VfbWVtX2NudCwKLQkJCQkJdGFza19vZmZzZXRfaW4pOwotCX0KLQkvKgotCSAqIEhhbmRsZSB0aGUgc2VfbWVtX2xpc3QgLT4gc3RydWN0IHRhc2stPnRhc2tfc2dfYmlkaQotCSAqIG1lbW9yeSBtYXAgZm9yIHRoZSBleHRyYSBCSURJIFJFQUQgcGF5bG9hZAotCSAqLwotCXJldHVybiB0cmFuc3BvcnRfbWFwX21lbV90b19zZyh0YXNrLCBzZV9tZW1fbGlzdCwgdGFzay0+dGFza19zZ19iaWRpLAotCQkJCWluX3NlX21lbSwgb3V0X3NlX21lbSwgc2VfbWVtX2NudCwKLQkJCQl0YXNrX29mZnNldF9pbik7Ci19Ci0KLXN0YXRpYyB1MzIgdHJhbnNwb3J0X2dlbmVyaWNfZ2V0X2NkYl9jb3VudCgKKy8qCisgKiBCcmVhayB1cCBjbWQgaW50byBjaHVua3MgdHJhbnNwb3J0IGNhbiBoYW5kbGUKKyAqLworc3RhdGljIGludCB0cmFuc3BvcnRfYWxsb2NhdGVfZGF0YV90YXNrcygKIAlzdHJ1Y3Qgc2VfY21kICpjbWQsCiAJdW5zaWduZWQgbG9uZyBsb25nIGxiYSwKLQl1MzIgc2VjdG9ycywKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkYXRhX2RpcmVjdGlvbiwKLQlzdHJ1Y3QgbGlzdF9oZWFkICptZW1fbGlzdCwKLQlpbnQgc2V0X2NvdW50cykKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKKwl1bnNpZ25lZCBpbnQgc2dsX25lbnRzKQogewogCXVuc2lnbmVkIGNoYXIgKmNkYiA9IE5VTEw7CiAJc3RydWN0IHNlX3Rhc2sgKnRhc2s7Ci0Jc3RydWN0IHNlX21lbSAqc2VfbWVtID0gTlVMTCwgKnNlX21lbV9sb3V0ID0gTlVMTDsKLQlzdHJ1Y3Qgc2VfbWVtICpzZV9tZW1fYmlkaSA9IE5VTEwsICpzZV9tZW1fYmlkaV9sb3V0ID0gTlVMTDsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBTRV9ERVYoY21kKTsKLQlpbnQgbWF4X3NlY3RvcnNfc2V0ID0gMCwgcmV0OwotCXUzMiB0YXNrX29mZnNldF9pbiA9IDAsIHNlX21lbV9jbnQgPSAwLCBzZV9tZW1fYmlkaV9jbnQgPSAwLCB0YXNrX2NkYnMgPSAwOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2VjdG9yX3Qgc2VjdG9yczsKKwlpbnQgdGFza19jb3VudCwgaSwgcmV0OworCXNlY3Rvcl90IGRldl9tYXhfc2VjdG9ycyA9IGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5tYXhfc2VjdG9yczsKKwl1MzIgc2VjdG9yX3NpemUgPSBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXN0cnVjdCBzY2F0dGVybGlzdCAqY21kX3NnOwogCi0JaWYgKCFtZW1fbGlzdCkgewotCQlwcmludGsoS0VSTl9FUlIgIm1lbV9saXN0IGlzIE5VTEwgaW4gdHJhbnNwb3J0X2dlbmVyaWNfZ2V0IgotCQkJCSJfY2RiX2NvdW50KClcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBXaGlsZSB1c2luZyBSQU1ESVNLX0RSIGJhY2tzdG9yZXMgaXMgdGhlIG9ubHkgY2FzZSB3aGVyZQotCSAqIG1lbV9saXN0IHdpbGwgZXZlciBiZSBlbXB0eSBhdCB0aGlzIHBvaW50LgotCSAqLwotCWlmICghKGxpc3RfZW1wdHkobWVtX2xpc3QpKSkKLQkJc2VfbWVtID0gbGlzdF9lbnRyeShtZW1fbGlzdC0+bmV4dCwgc3RydWN0IHNlX21lbSwgc2VfbGlzdCk7Ci0JLyoKLQkgKiBDaGVjayBmb3IgZXh0cmEgc2VfbWVtX2JpZGkgbWFwcGluZyBmb3IgQklESS1DT01NQU5EcyB0bwotCSAqIHN0cnVjdCBzZV90YXNrLT50YXNrX3NnX2JpZGkgZm9yIFRDTS9wU0NTSSBwYXNzdGhyb3VnaCBvcGVyYXRpb24KLQkgKi8KLQlpZiAoKFRfVEFTSyhjbWQpLT50X21lbV9iaWRpX2xpc3QgIT0gTlVMTCkgJiYKLQkgICAgIShsaXN0X2VtcHR5KFRfVEFTSyhjbWQpLT50X21lbV9iaWRpX2xpc3QpKSAmJgotCSAgICAoVFJBTlNQT1JUKGRldiktPnRyYW5zcG9ydF90eXBlID09IFRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKSkKLQkJc2VfbWVtX2JpZGkgPSBsaXN0X2VudHJ5KFRfVEFTSyhjbWQpLT50X21lbV9iaWRpX2xpc3QtPm5leHQsCi0JCQkJCXN0cnVjdCBzZV9tZW0sIHNlX2xpc3QpOworCVdBUk5fT04oY21kLT5kYXRhX2xlbmd0aCAlIHNlY3Rvcl9zaXplKTsKKwlzZWN0b3JzID0gRElWX1JPVU5EX1VQKGNtZC0+ZGF0YV9sZW5ndGgsIHNlY3Rvcl9zaXplKTsKKwl0YXNrX2NvdW50ID0gRElWX1JPVU5EX1VQKHNlY3RvcnMsIGRldl9tYXhfc2VjdG9ycyk7CiAKLQl3aGlsZSAoc2VjdG9ycykgewotCQlERUJVR19WT0woIklUVFsweCUwOHhdIExCQSglbGx1KSBTZWN0b3JzTGVmdCgldSkgRU9CSiglbGx1KVxuIiwKLQkJCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCksIGxiYSwgc2VjdG9ycywKLQkJCXRyYW5zcG9ydF9kZXZfZW5kX2xiYShkZXYpKTsKKwljbWRfc2cgPSBzZ2w7CisJZm9yIChpID0gMDsgaSA8IHRhc2tfY291bnQ7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgdGFza19zaXplOworCQlpbnQgY291bnQ7CiAKIAkJdGFzayA9IHRyYW5zcG9ydF9nZW5lcmljX2dldF90YXNrKGNtZCwgZGF0YV9kaXJlY3Rpb24pOwotCQlpZiAoISh0YXNrKSkKLQkJCWdvdG8gb3V0OwotCi0JCXRyYW5zcG9ydF9zZXRfdGFza3Nfc2VjdG9ycyh0YXNrLCBkZXYsIGxiYSwgc2VjdG9ycywKLQkJCQkmbWF4X3NlY3RvcnNfc2V0KTsKKwkJaWYgKCF0YXNrKQorCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJdGFzay0+dGFza19sYmEgPSBsYmE7CisJCXRhc2stPnRhc2tfc2VjdG9ycyA9IG1pbihzZWN0b3JzLCBkZXZfbWF4X3NlY3RvcnMpOworCQl0YXNrLT50YXNrX3NpemUgPSB0YXNrLT50YXNrX3NlY3RvcnMgKiBzZWN0b3Jfc2l6ZTsKKworCQljZGIgPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2NkYih0YXNrKTsKKwkJQlVHX09OKCFjZGIpOworCisJCW1lbWNweShjZGIsIGNtZC0+dF90YXNrX2NkYiwKKwkJICAgICAgIHNjc2lfY29tbWFuZF9zaXplKGNtZC0+dF90YXNrX2NkYikpOworCisJCS8qIFVwZGF0ZSBuZXcgY2RiIHdpdGggdXBkYXRlZCBsYmEvc2VjdG9ycyAqLworCQljbWQtPnRyYW5zcG9ydF9zcGxpdF9jZGIodGFzay0+dGFza19sYmEsIHRhc2stPnRhc2tfc2VjdG9ycywgY2RiKTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGUgZmFicmljIG1vZHVsZSBkcml2ZXIgaXMgcmVxdWVzdGluZyB0aGF0IGFsbAorCQkgKiBzdHJ1Y3Qgc2VfdGFzay0+dGFza19zZ1tdIGJlIGNoYWluZWQgdG9nZXRoZXIuLiAgSWYgc28sCisJCSAqIHRoZW4gYWxsb2NhdGUgYW4gZXh0cmEgcGFkZGluZyBTRyBlbnRyeSBmb3IgbGlua2luZyBhbmQKKwkJICogbWFya2luZyB0aGUgZW5kIG9mIHRoZSBjaGFpbmVkIFNHTC4KKwkJICogUG9zc2libHkgb3Zlci1hbGxvY2F0ZSB0YXNrIHNnbCBzaXplIGJ5IHVzaW5nIGNtZCBzZ2wgc2l6ZS4KKwkJICogSXQncyBzbyBtdWNoIGVhc2llciBhbmQgb25seSBhIHdhc3RlIHdoZW4gdGFza19jb3VudCA+IDEuCisJCSAqIFRoYXQgaXMgZXh0cmVtZWx5IHJhcmUuCisJCSAqLworCQl0YXNrLT50YXNrX3NnX25lbnRzID0gc2dsX25lbnRzOworCQlpZiAoY21kLT5zZV90Zm8tPnRhc2tfc2dfY2hhaW5pbmcpIHsKKwkJCXRhc2stPnRhc2tfc2dfbmVudHMrKzsKKwkJCXRhc2stPnRhc2tfcGFkZGVkX3NnID0gMTsKKwkJfQorCisJCXRhc2stPnRhc2tfc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpICoKKwkJCQkJdGFzay0+dGFza19zZ19uZW50cywgR0ZQX0tFUk5FTCk7CisJCWlmICghdGFzay0+dGFza19zZykgeworCQkJY21kLT5zZV9kZXYtPnRyYW5zcG9ydC0+ZnJlZV90YXNrKHRhc2spOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlzZ19pbml0X3RhYmxlKHRhc2stPnRhc2tfc2csIHRhc2stPnRhc2tfc2dfbmVudHMpOworCisJCXRhc2tfc2l6ZSA9IHRhc2stPnRhc2tfc2l6ZTsKKworCQkvKiBCdWlsZCBuZXcgc2dsLCBvbmx5IHVwIHRvIHRhc2tfc2l6ZSAqLworCQlmb3JfZWFjaF9zZyh0YXNrLT50YXNrX3NnLCBzZywgdGFzay0+dGFza19zZ19uZW50cywgY291bnQpIHsKKwkJCWlmIChjbWRfc2ctPmxlbmd0aCA+IHRhc2tfc2l6ZSkKKwkJCQlicmVhazsKKworCQkJKnNnID0gKmNtZF9zZzsKKwkJCXRhc2tfc2l6ZSAtPSBjbWRfc2ctPmxlbmd0aDsKKwkJCWNtZF9zZyA9IHNnX25leHQoY21kX3NnKTsKKwkJfQorCiAJCWxiYSArPSB0YXNrLT50YXNrX3NlY3RvcnM7CiAJCXNlY3RvcnMgLT0gdGFzay0+dGFza19zZWN0b3JzOwotCQl0YXNrLT50YXNrX3NpemUgPSAodGFzay0+dGFza19zZWN0b3JzICoKLQkJCQkgICBERVZfQVRUUklCKGRldiktPmJsb2NrX3NpemUpOwogCi0JCWNkYiA9IFRSQU5TUE9SVChkZXYpLT5nZXRfY2RiKHRhc2spOwotCQlpZiAoKGNkYikpIHsKLQkJCW1lbWNweShjZGIsIFRfVEFTSyhjbWQpLT50X3Rhc2tfY2RiLAotCQkJCXNjc2lfY29tbWFuZF9zaXplKFRfVEFTSyhjbWQpLT50X3Rhc2tfY2RiKSk7Ci0JCQljbWQtPnRyYW5zcG9ydF9zcGxpdF9jZGIodGFzay0+dGFza19sYmEsCi0JCQkJCSZ0YXNrLT50YXNrX3NlY3RvcnMsIGNkYik7Ci0JCX0KLQotCQkvKgotCQkgKiBQZXJmb3JtIHRoZSBTRSBPQkogcGx1Z2luIGFuZC9vciBUcmFuc3BvcnQgcGx1Z2luIHNwZWNpZmljCi0JCSAqIG1hcHBpbmcgZm9yIFRfVEFTSyhjbWQpLT50X21lbV9saXN0LiBBbmQgc2V0dXAgdGhlCi0JCSAqIHRhc2stPnRhc2tfc2cgYW5kIGlmIG5lY2Vzc2FyeSB0YXNrLT50YXNrX3NnX2JpZGkKLQkJICovCi0JCXJldCA9IHRyYW5zcG9ydF9kb19zZV9tZW1fbWFwKGRldiwgdGFzaywgbWVtX2xpc3QsCi0JCQkJTlVMTCwgc2VfbWVtLCAmc2VfbWVtX2xvdXQsICZzZV9tZW1fY250LAotCQkJCSZ0YXNrX29mZnNldF9pbik7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0KLQkJc2VfbWVtID0gc2VfbWVtX2xvdXQ7Ci0JCS8qCi0JCSAqIFNldHVwIHRoZSBUX1RBU0soY21kKS0+dF9tZW1fYmlkaV9saXN0IC0+IHRhc2stPnRhc2tfc2dfYmlkaQotCQkgKiBtYXBwaW5nIGZvciBTQ1NJIFJFQUQgZm9yIEJJREktQ09NTUFORCBwYXNzdGhyb3VnaCB3aXRoIFRDTS9wU0NTSQotCQkgKgotCQkgKiBOb3RlIHRoYXQgdGhlIGZpcnN0IGNhbGwgdG8gdHJhbnNwb3J0X2RvX3NlX21lbV9tYXAoKSBhYm92ZSB3aWxsCi0JCSAqIGFsbG9jYXRlIHN0cnVjdCBzZV90YXNrLT50YXNrX3NnX2JpZGkgaW4gdHJhbnNwb3J0X2RvX3NlX21lbV9tYXAoKQotCQkgKiAtPiB0cmFuc3BvcnRfY2FsY19zZ19udW0oKSwgYW5kIHRoZSBzZWNvbmQgaGVyZSB3aWxsIGRvIHRoZQotCQkgKiBtYXBwaW5nIGZvciBTQ1NJIFJFQUQgZm9yIEJJREktQ09NTUFORCBwYXNzdGhyb3VnaCB3aXRoIFRDTS9wU0NTSS4KLQkJICovCi0JCWlmICh0YXNrLT50YXNrX3NnX2JpZGkgIT0gTlVMTCkgewotCQkJcmV0ID0gdHJhbnNwb3J0X2RvX3NlX21lbV9tYXAoZGV2LCB0YXNrLAotCQkJCVRfVEFTSyhjbWQpLT50X21lbV9iaWRpX2xpc3QsIE5VTEwsCi0JCQkJc2VfbWVtX2JpZGksICZzZV9tZW1fYmlkaV9sb3V0LCAmc2VfbWVtX2JpZGlfY250LAotCQkJCSZ0YXNrX29mZnNldF9pbik7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIG91dDsKLQotCQkJc2VfbWVtX2JpZGkgPSBzZV9tZW1fYmlkaV9sb3V0OwotCQl9Ci0JCXRhc2tfY2RicysrOwotCi0JCURFQlVHX1ZPTCgiSW5jcmVtZW50ZWQgdGFza19jZGJzKCV1KSB0YXNrLT50YXNrX3NnX251bSgldSlcbiIsCi0JCQkJdGFza19jZGJzLCB0YXNrLT50YXNrX3NnX251bSk7Ci0KLQkJaWYgKG1heF9zZWN0b3JzX3NldCkgewotCQkJbWF4X3NlY3RvcnNfc2V0ID0gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJnRhc2stPnRfbGlzdCwgJmNtZC0+dF90YXNrX2xpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCX0KKwkvKgorCSAqIE5vdyBwZXJmb3JtIHRoZSBtZW1vcnkgbWFwIG9mIHRhc2stPnRhc2tfc2dbXSBpbnRvIGJhY2tlbmQKKwkgKiBzdWJzeXN0ZW0gbWVtb3J5Li4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhc2ssICZjbWQtPnRfdGFza19saXN0LCB0X2xpc3QpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZ0YXNrLT50YXNrX3NlbnQpKQogCQkJY29udGludWU7Ci0JCX0KKwkJaWYgKCFkZXYtPnRyYW5zcG9ydC0+bWFwX2RhdGFfU0cpCisJCQljb250aW51ZTsKIAotCQlpZiAoIXNlY3RvcnMpCi0JCQlicmVhazsKKwkJcmV0ID0gZGV2LT50cmFuc3BvcnQtPm1hcF9kYXRhX1NHKHRhc2spOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAwOwogCX0KIAotCWlmIChzZXRfY291bnRzKSB7Ci0JCWF0b21pY19pbmMoJlRfVEFTSyhjbWQpLT50X2ZlX2NvdW50KTsKLQkJYXRvbWljX2luYygmVF9UQVNLKGNtZCktPnRfc2VfY291bnQpOwotCX0KLQotCURFQlVHX1ZPTCgiSVRUWzB4JTA4eF0gdG90YWwgJXMgY2RicygldSlcbiIsCi0JCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCksIChkYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQotCQk/ICJETUFfVE9fREVWSUNFIiA6ICJETUFfRlJPTV9ERVZJQ0UiLCB0YXNrX2NkYnMpOwotCi0JcmV0dXJuIHRhc2tfY2RiczsKLW91dDoKLQlyZXR1cm4gMDsKKwlyZXR1cm4gdGFza19jb3VudDsKIH0KIAogc3RhdGljIGludAotdHJhbnNwb3J0X21hcF9jb250cm9sX2NtZF90b190YXNrKHN0cnVjdCBzZV9jbWQgKmNtZCkKK3RyYW5zcG9ydF9hbGxvY2F0ZV9jb250cm9sX3Rhc2soc3RydWN0IHNlX2NtZCAqY21kKQogewotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0RFVihjbWQpOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXVuc2lnbmVkIGNoYXIgKmNkYjsKIAlzdHJ1Y3Qgc2VfdGFzayAqdGFzazsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CiAKIAl0YXNrID0gdHJhbnNwb3J0X2dlbmVyaWNfZ2V0X3Rhc2soY21kLCBjbWQtPmRhdGFfZGlyZWN0aW9uKTsKIAlpZiAoIXRhc2spCi0JCXJldHVybiBQWVhfVFJBTlNQT1JUX09VVF9PRl9NRU1PUllfUkVTT1VSQ0VTOworCQlyZXR1cm4gLUVOT01FTTsKIAotCWNkYiA9IFRSQU5TUE9SVChkZXYpLT5nZXRfY2RiKHRhc2spOwotCWlmIChjZGIpCi0JCW1lbWNweShjZGIsIGNtZC0+dF90YXNrLT50X3Rhc2tfY2RiLAotCQkJc2NzaV9jb21tYW5kX3NpemUoY21kLT50X3Rhc2stPnRfdGFza19jZGIpKTsKKwljZGIgPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2NkYih0YXNrKTsKKwlCVUdfT04oIWNkYik7CisJbWVtY3B5KGNkYiwgY21kLT50X3Rhc2tfY2RiLAorCSAgICAgICBzY3NpX2NvbW1hbmRfc2l6ZShjbWQtPnRfdGFza19jZGIpKTsKIAorCXRhc2stPnRhc2tfc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpICogY21kLT50X2RhdGFfbmVudHMsCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCF0YXNrLT50YXNrX3NnKSB7CisJCWNtZC0+c2VfZGV2LT50cmFuc3BvcnQtPmZyZWVfdGFzayh0YXNrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtY3B5KHRhc2stPnRhc2tfc2csIGNtZC0+dF9kYXRhX3NnLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSAqIGNtZC0+dF9kYXRhX25lbnRzKTsKIAl0YXNrLT50YXNrX3NpemUgPSBjbWQtPmRhdGFfbGVuZ3RoOwotCXRhc2stPnRhc2tfc2dfbnVtID0KLQkJKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREIpID8gMSA6IDA7CisJdGFzay0+dGFza19zZ19uZW50cyA9IGNtZC0+dF9kYXRhX25lbnRzOwogCi0JYXRvbWljX2luYygmY21kLT50X3Rhc2stPnRfZmVfY291bnQpOwotCWF0b21pY19pbmMoJmNtZC0+dF90YXNrLT50X3NlX2NvdW50KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZ0YXNrLT50X2xpc3QsICZjbWQtPnRfdGFza19saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREIpIHsKLQkJc3RydWN0IHNlX21lbSAqc2VfbWVtID0gTlVMTCwgKnNlX21lbV9sb3V0ID0gTlVMTDsKLQkJdTMyIHNlX21lbV9jbnQgPSAwLCB0YXNrX29mZnNldCA9IDA7Ci0KLQkJaWYgKCFsaXN0X2VtcHR5KFRfVEFTSyhjbWQpLT50X21lbV9saXN0KSkKLQkJCXNlX21lbSA9IGxpc3RfZW50cnkoVF9UQVNLKGNtZCktPnRfbWVtX2xpc3QtPm5leHQsCi0JCQkJCXN0cnVjdCBzZV9tZW0sIHNlX2xpc3QpOwotCi0JCXJldCA9IHRyYW5zcG9ydF9kb19zZV9tZW1fbWFwKGRldiwgdGFzaywKLQkJCQljbWQtPnRfdGFzay0+dF9tZW1fbGlzdCwgTlVMTCwgc2VfbWVtLAotCQkJCSZzZV9tZW1fbG91dCwgJnNlX21lbV9jbnQsICZ0YXNrX29mZnNldCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfT1VUX09GX01FTU9SWV9SRVNPVVJDRVM7Ci0KLQkJaWYgKGRldi0+dHJhbnNwb3J0LT5tYXBfdGFza19TRykKLQkJCXJldHVybiBkZXYtPnRyYW5zcG9ydC0+bWFwX3Rhc2tfU0codGFzayk7Ci0JCXJldHVybiAwOwotCX0gZWxzZSBpZiAoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9DT05UUk9MX05PTlNHX0lPX0NEQikgewotCQlpZiAoZGV2LT50cmFuc3BvcnQtPm1hcF90YXNrX25vbl9TRykKLQkJCXJldHVybiBkZXYtPnRyYW5zcG9ydC0+bWFwX3Rhc2tfbm9uX1NHKHRhc2spOwotCQlyZXR1cm4gMDsKKwkJaWYgKGRldi0+dHJhbnNwb3J0LT5tYXBfY29udHJvbF9TRykKKwkJCXJldCA9IGRldi0+dHJhbnNwb3J0LT5tYXBfY29udHJvbF9TRyh0YXNrKTsKIAl9IGVsc2UgaWYgKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfTk9OX0RBVEFfQ0RCKSB7CiAJCWlmIChkZXYtPnRyYW5zcG9ydC0+Y2RiX25vbmUpCi0JCQlyZXR1cm4gZGV2LT50cmFuc3BvcnQtPmNkYl9ub25lKHRhc2spOwotCQlyZXR1cm4gMDsKKwkJCXJldCA9IGRldi0+dHJhbnNwb3J0LT5jZGJfbm9uZSh0YXNrKTsKIAl9IGVsc2UgeworCQlwcl9lcnIoInRhcmdldDogVW5rbm93biBjb250cm9sIGNtZCB0eXBlIVxuIik7CiAJCUJVRygpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9PVVRfT0ZfTUVNT1JZX1JFU09VUkNFUzsKIAl9CisKKwkvKiBTdWNjZXNzISBSZXR1cm4gbnVtYmVyIG9mIHRhc2tzIGFsbG9jYXRlZCAqLworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHUzMiB0cmFuc3BvcnRfYWxsb2NhdGVfdGFza3MoCisJc3RydWN0IHNlX2NtZCAqY21kLAorCXVuc2lnbmVkIGxvbmcgbG9uZyBsYmEsCisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGF0YV9kaXJlY3Rpb24sCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJdW5zaWduZWQgaW50IHNnbF9uZW50cykKK3sKKwlpZiAoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQikKKwkJcmV0dXJuIHRyYW5zcG9ydF9hbGxvY2F0ZV9kYXRhX3Rhc2tzKGNtZCwgbGJhLCBkYXRhX2RpcmVjdGlvbiwKKwkJCQkJCSAgICAgc2dsLCBzZ2xfbmVudHMpOworCWVsc2UKKwkJcmV0dXJuIHRyYW5zcG9ydF9hbGxvY2F0ZV9jb250cm9sX3Rhc2soY21kKTsKKworfQorCisKIC8qCSB0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKCk6IENhbGxlZCBmcm9tIHRyYW5zcG9ydF9wcm9jZXNzaW5nX3RocmVhZCgpCiAgKgogICoJIEFsbG9jYXRlIHN0b3JhZ2UgdHJhbnNwb3J0IHJlc291cmNlcyBmcm9tIGEgc2V0IG9mIHZhbHVlcyBwcmVkZWZpbmVkCkBAIC01MDg4LDY0ICs0MjIyLDMzIEBACiAJLyoKIAkgKiBHZW5lcmF0ZSBzdHJ1Y3Qgc2VfdGFzayhzKSBhbmQvb3IgdGhlaXIgcGF5bG9hZHMgZm9yIHRoaXMgQ0RCLgogCSAqLwotc3RhdGljIGludCB0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKHN0cnVjdCBzZV9jbWQgKmNtZCkKK2ludCB0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICpzZV90cGc7Ci0Jc3RydWN0IHNlX3Rhc2sgKnRhc2s7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gU0VfREVWKGNtZCk7CiAJaW50IHJldCA9IDA7CiAKIAkvKgogCSAqIERldGVybWluZSBpcyB0aGUgVENNIGZhYnJpYyBtb2R1bGUgaGFzIGFscmVhZHkgYWxsb2NhdGVkIHBoeXNpY2FsCiAJICogbWVtb3J5LCBhbmQgaXMgZGlyZWN0bHkgY2FsbGluZyB0cmFuc3BvcnRfZ2VuZXJpY19tYXBfbWVtX3RvX2NtZCgpCi0JICogdG8gc2V0dXAgYmVmb3JlaGFuZCB0aGUgbGlua2VkIGxpc3Qgb2YgcGh5c2ljYWwgbWVtb3J5IGF0Ci0JICogVF9UQVNLKGNtZCktPnRfbWVtX2xpc3Qgb2Ygc3RydWN0IHNlX21lbS0+c2VfcGFnZQorCSAqIGJlZm9yZWhhbmQuCiAJICovCi0JaWYgKCEoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfUEFTU1RIUk9VR0hfU0dfVE9fTUVNX05PQUxMT0MpKSB7Ci0JCXJldCA9IHRyYW5zcG9ydF9hbGxvY2F0ZV9yZXNvdXJjZXMoY21kKTsKKwlpZiAoIShjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9QQVNTVEhST1VHSF9TR19UT19NRU1fTk9BTExPQykgJiYKKwkgICAgY21kLT5kYXRhX2xlbmd0aCkgeworCQlyZXQgPSB0cmFuc3BvcnRfZ2VuZXJpY19nZXRfbWVtKGNtZCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAl9Ci0KLQlyZXQgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnMoY21kKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQorCS8qCisJICogQ2FsbCB0cmFuc3BvcnRfbmV3X2NtZF9vYmooKSB0byBpbnZva2UgdHJhbnNwb3J0X2FsbG9jYXRlX3Rhc2tzKCkgZm9yCisJICogY29udHJvbCBvciBkYXRhIENEQiB0eXBlcywgYW5kIHBlcmZvcm0gdGhlIG1hcCB0byBiYWNrZW5kIHN1YnN5c3RlbQorCSAqIGNvZGUgZnJvbSBTR0wgbWVtb3J5IGFsbG9jYXRlZCBoZXJlIGJ5IHRyYW5zcG9ydF9nZW5lcmljX2dldF9tZW0oKSwgb3IKKwkgKiB2aWEgcHJlLWV4aXN0aW5nIFNHTCBtZW1vcnkgc2V0dXAgZXhwbGljdGx5IGJ5IGZhYnJpYyBtb2R1bGUgY29kZSB3aXRoCisJICogdHJhbnNwb3J0X2dlbmVyaWNfbWFwX21lbV90b19jbWQoKS4KKwkgKi8KIAlyZXQgPSB0cmFuc3BvcnRfbmV3X2NtZF9vYmooY21kKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQogCS8qCi0JICogRGV0ZXJtaW5lIGlmIHRoZSBjYWxsaW5nIFRDTSBmYWJyaWMgbW9kdWxlIGlzIHRhbGtpbmcgdG8KLQkgKiBMaW51eC9ORVQgdmlhIGtlcm5lbCBzb2NrZXRzIGFuZCBuZWVkcyB0byBhbGxvY2F0ZSBhCi0JICogc3RydWN0IGlvdmVjIGFycmF5IHRvIGNvbXBsZXRlIHRoZSBzdHJ1Y3Qgc2VfY21kCi0JICovCi0Jc2VfdHBnID0gU0VfTFVOKGNtZCktPmx1bl9zZXAtPnNlcF90cGc7Ci0JaWYgKFRQR19URk8oc2VfdHBnKS0+YWxsb2NfY21kX2lvdmVjcyAhPSBOVUxMKSB7Ci0JCXJldCA9IFRQR19URk8oc2VfdHBnKS0+YWxsb2NfY21kX2lvdmVjcyhjbWQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX09VVF9PRl9NRU1PUllfUkVTT1VSQ0VTOwotCX0KLQotCWlmIChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodGFzaywgJlRfVEFTSyhjbWQpLT50X3Rhc2tfbGlzdCwgdF9saXN0KSB7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnRhc2stPnRhc2tfc2VudCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIWRldi0+dHJhbnNwb3J0LT5tYXBfdGFza19TRykKLQkJCQljb250aW51ZTsKLQotCQkJcmV0ID0gZGV2LT50cmFuc3BvcnQtPm1hcF90YXNrX1NHKHRhc2spOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldCA9IHRyYW5zcG9ydF9tYXBfY29udHJvbF9jbWRfdG9fdGFzayhjbWQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JLyoKLQkgKiBGb3IgV1JJVEVzLCBsZXQgdGhlIGlTQ1NJIFRhcmdldCBSWCBUaHJlYWQga25vdyBpdHMgYnVmZmVyIGlzIHJlYWR5Li4KKwkgKiBGb3IgV1JJVEVzLCBsZXQgdGhlIGZhYnJpYyBrbm93IGl0cyBidWZmZXIgaXMgcmVhZHkuLgogCSAqIFRoaXMgV1JJVEUgc3RydWN0IHNlX2NtZCAoYW5kIGFsbCBvZiBpdHMgYXNzb2NpYXRlZCBzdHJ1Y3Qgc2VfdGFzaydzKQogCSAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHN0cnVjdCBzZV9kZXZpY2UgZXhlY3V0aW9uIHF1ZXVlIGFmdGVyIGl0cyBXUklURQogCSAqIGRhdGEgaGFzIGFycml2ZWQuIChpZTogSXQgZ2V0cyBoYW5kbGVkIGJ5IHRoZSB0cmFuc3BvcnQgcHJvY2Vzc2luZwpAQCAtNTE2Miw2ICs0MjY1LDcgQEAKIAl0cmFuc3BvcnRfZXhlY3V0ZV90YXNrcyhjbWQpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKTsKIAogLyoJdHJhbnNwb3J0X2dlbmVyaWNfcHJvY2Vzc193cml0ZSgpOgogICoKQEAgLTUxNjksNjggKzQyNzMsMTUgQEAKICAqLwogdm9pZCB0cmFuc3BvcnRfZ2VuZXJpY19wcm9jZXNzX3dyaXRlKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLSNpZiAwCi0JLyoKLQkgKiBDb3B5IFNDU0kgUHJlc2VudGVkIERUTCBzZWN0b3IocykgZnJvbSByZWNlaXZlZCBidWZmZXJzIGFsbG9jYXRlZCB0bwotCSAqIG9yaWdpbmFsIEVEVEwKLQkgKi8KLQlpZiAoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfVU5ERVJGTE9XX0JJVCkgewotCQlpZiAoIVRfVEFTSyhjbWQpLT50X3Rhc2tzX3NlX251bSkgewotCQkJdW5zaWduZWQgY2hhciAqZHN0LCAqYnVmID0KLQkJCQkodW5zaWduZWQgY2hhciAqKVRfVEFTSyhjbWQpLT50X3Rhc2tfYnVmOwotCi0JCQlkc3QgPSBremFsbG9jKGNtZC0+Y21kX3NwZHRsKSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIShkc3QpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciIKLQkJCQkJCSIgV1JJVEUgdW5kZXJmbG93XG4iKTsKLQkJCQl0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoY21kLCBOVUxMLAotCQkJCQlQWVhfVFJBTlNQT1JUX1JFUV9UT09fTUFOWV9TRUNUT1JTLCAxKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltZW1jcHkoZHN0LCBidWYsIGNtZC0+Y21kX3NwZHRsKTsKLQotCQkJa2ZyZWUoVF9UQVNLKGNtZCktPnRfdGFza19idWYpOwotCQkJVF9UQVNLKGNtZCktPnRfdGFza19idWYgPSBkc3Q7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0KLQkJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZylUX1RBU0soY21kKS0+dF90YXNrX2J1ZjsKLQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqb3JpZ19zZzsKLQotCQkJb3JpZ19zZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkgKgotCQkJCQlUX1RBU0soY21kKS0+dF90YXNrc19zZV9udW0sCi0JCQkJCUdGUF9LRVJORUwpKSkgewotCQkJaWYgKCEob3JpZ19zZykpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiCi0JCQkJCQkiIGZvciBXUklURSB1bmRlcmZsb3dcbiIpOwotCQkJCXRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShjbWQsIE5VTEwsCi0JCQkJCVBZWF9UUkFOU1BPUlRfUkVRX1RPT19NQU5ZX1NFQ1RPUlMsIDEpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJbWVtY3B5KG9yaWdfc2csIFRfVEFTSyhjbWQpLT50X3Rhc2tfYnVmLAotCQkJCQlzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSAqCi0JCQkJCVRfVEFTSyhjbWQpLT50X3Rhc2tzX3NlX251bSk7Ci0KLQkJCWNtZC0+ZGF0YV9sZW5ndGggPSBjbWQtPmNtZF9zcGR0bDsKLQkJCS8qCi0JCQkgKiBGSVhNRSwgY2xlYXIgb3V0IG9yaWdpbmFsIHN0cnVjdCBzZV90YXNrIGFuZCBzdGF0ZQotCQkJICogaW5mb3JtYXRpb24uCi0JCQkgKi8KLQkJCWlmICh0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKGNtZCkgPCAwKSB7Ci0JCQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKGNtZCwgTlVMTCwKLQkJCQkJUFlYX1RSQU5TUE9SVF9SRVFfVE9PX01BTllfU0VDVE9SUywgMSk7Ci0JCQkJa2ZyZWUob3JpZ19zZyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQl0cmFuc3BvcnRfbWVtY3B5X3dyaXRlX3NnKGNtZCwgb3JpZ19zZyk7Ci0JCX0KLQl9Ci0jZW5kaWYKIAl0cmFuc3BvcnRfZXhlY3V0ZV90YXNrcyhjbWQpOwogfQogRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZ2VuZXJpY19wcm9jZXNzX3dyaXRlKTsKIAorc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfcGVuZGluZ19xZihzdHJ1Y3Qgc2VfY21kICpjbWQpCit7CisJcmV0dXJuIGNtZC0+c2VfdGZvLT53cml0ZV9wZW5kaW5nKGNtZCk7Cit9CisKIC8qCXRyYW5zcG9ydF9nZW5lcmljX3dyaXRlX3BlbmRpbmcoKToKICAqCiAgKgpAQCAtNTI0MCwyNCArNDI5MSwyNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJY21kLT50X3N0YXRlID0gVFJBTlNQT1JUX1dSSVRFX1BFTkRJTkc7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCS8qCi0JICogRm9yIHRoZSBUQ00gY29udHJvbCBDREJzIHVzaW5nIGEgY29udGlndW91cyBidWZmZXIsIGRvIHRoZSBtZW1jcHkKLQkgKiBmcm9tIHRoZSBwYXNzZWQgTGludXgvU0NTSSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgbG9jYXRlZCBhdAotCSAqIFRfVEFTSyhzZV9jbWQpLT50X3Rhc2tfcHRfYnVmIHRvIHRoZSBjb250aWd1b3VzIGJ1ZmZlciBhdAotCSAqIFRfVEFTSyhzZV9jbWQpLT50X3Rhc2tfYnVmLgotCSAqLwotCWlmIChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9QQVNTVEhST1VHSF9DT05USUdfVE9fU0cpCi0JCXRyYW5zcG9ydF9tZW1jcHlfcmVhZF9jb250aWcoY21kLAotCQkJCVRfVEFTSyhjbWQpLT50X3Rhc2tfYnVmLAotCQkJCVRfVEFTSyhjbWQpLT50X3Rhc2tfcHRfc2dsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJaWYgKGNtZC0+dHJhbnNwb3J0X3FmX2NhbGxiYWNrKSB7CisJCXJldCA9IGNtZC0+dHJhbnNwb3J0X3FmX2NhbGxiYWNrKGNtZCk7CisJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCWdvdG8gcXVldWVfZnVsbDsKKwkJZWxzZSBpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJY21kLT50cmFuc3BvcnRfcWZfY2FsbGJhY2sgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKIAkvKgogCSAqIENsZWFyIHRoZSBzZV9jbWQgZm9yIFdSSVRFX1BFTkRJTkcgc3RhdHVzIGluIG9yZGVyIHRvIHNldAotCSAqIFRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF9hY3RpdmU9MCBzbyB0aGF0IHRyYW5zcG9ydF9nZW5lcmljX2hhbmRsZV9kYXRhCisJICogY21kLT50X3RyYW5zcG9ydF9hY3RpdmU9MCBzbyB0aGF0IHRyYW5zcG9ydF9nZW5lcmljX2hhbmRsZV9kYXRhCiAJICogY2FuIGJlIGNhbGxlZCBmcm9tIEhXIHRhcmdldCBtb2RlIGludGVycnVwdCBjb2RlLiAgVGhpcyBpcyBzYWZlCi0JICogdG8gYmUgY2FsbGVkIHdpdGggdHJhbnNwb3J0X29mZj0xIGJlZm9yZSB0aGUgQ01EX1RGTyhjbWQpLT53cml0ZV9wZW5kaW5nCisJICogdG8gYmUgY2FsbGVkIHdpdGggdHJhbnNwb3J0X29mZj0xIGJlZm9yZSB0aGUgY21kLT5zZV90Zm8tPndyaXRlX3BlbmRpbmcKIAkgKiBiZWNhdXNlIHRoZSBzZV9jbWQtPnNlX2x1biBwb2ludGVyIGlzIG5vdCBiZWluZyBjbGVhcmVkLgogCSAqLwogCXRyYW5zcG9ydF9jbWRfY2hlY2tfc3RvcChjbWQsIDEsIDApOwpAQCAtNTI2NiwyNiArNDMxOSwzMCBAQAogCSAqIENhbGwgdGhlIGZhYnJpYyB3cml0ZV9wZW5kaW5nIGZ1bmN0aW9uIGhlcmUgdG8gbGV0IHRoZQogCSAqIGZyb250ZW5kIGtub3cgdGhhdCBXUklURSBidWZmZXJzIGFyZSByZWFkeS4KIAkgKi8KLQlyZXQgPSBDTURfVEZPKGNtZCktPndyaXRlX3BlbmRpbmcoY21kKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSBjbWQtPnNlX3Rmby0+d3JpdGVfcGVuZGluZyhjbWQpOworCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJZ290byBxdWV1ZV9mdWxsOworCWVsc2UgaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gUFlYX1RSQU5TUE9SVF9XUklURV9QRU5ESU5HOworCitxdWV1ZV9mdWxsOgorCXByX2RlYnVnKCJIYW5kbGluZyB3cml0ZV9wZW5kaW5nIFFVRVVFX19GVUxMOiBzZV9jbWQ6ICVwXG4iLCBjbWQpOworCWNtZC0+dF9zdGF0ZSA9IFRSQU5TUE9SVF9DT01QTEVURV9RRl9XUDsKKwl0cmFuc3BvcnRfaGFuZGxlX3F1ZXVlX2Z1bGwoY21kLCBjbWQtPnNlX2RldiwKKwkJCXRyYW5zcG9ydF93cml0ZV9wZW5kaW5nX3FmKTsKKwlyZXR1cm4gcmV0OwogfQogCi0vKgl0cmFuc3BvcnRfcmVsZWFzZV9jbWRfdG9fcG9vbCgpOgotICoKLSAqCi0gKi8KLXZvaWQgdHJhbnNwb3J0X3JlbGVhc2VfY21kX3RvX3Bvb2woc3RydWN0IHNlX2NtZCAqY21kKQordm9pZCB0cmFuc3BvcnRfcmVsZWFzZV9jbWQoc3RydWN0IHNlX2NtZCAqY21kKQogewotCUJVR19PTighVF9UQVNLKGNtZCkpOwotCUJVR19PTighQ01EX1RGTyhjbWQpKTsKKwlCVUdfT04oIWNtZC0+c2VfdGZvKTsKIAogCXRyYW5zcG9ydF9mcmVlX3NlX2NtZChjbWQpOwotCUNNRF9URk8oY21kKS0+cmVsZWFzZV9jbWRfdG9fcG9vbChjbWQpOworCWNtZC0+c2VfdGZvLT5yZWxlYXNlX2NtZChjbWQpOwogfQotRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfcmVsZWFzZV9jbWRfdG9fcG9vbCk7CitFWFBPUlRfU1lNQk9MKHRyYW5zcG9ydF9yZWxlYXNlX2NtZCk7CiAKIC8qCXRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKCk6CiAgKgpAQCAtNTI5NCwxOSArNDM1MSwxOCBAQAogdm9pZCB0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZCgKIAlzdHJ1Y3Qgc2VfY21kICpjbWQsCiAJaW50IHdhaXRfZm9yX3Rhc2tzLAotCWludCByZWxlYXNlX3RvX3Bvb2wsCiAJaW50IHNlc3Npb25fcmVpbnN0YXRlbWVudCkKIHsKLQlpZiAoIShjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TRV9MVU5fQ01EKSB8fCAhVF9UQVNLKGNtZCkpCi0JCXRyYW5zcG9ydF9yZWxlYXNlX2NtZF90b19wb29sKGNtZCk7CisJaWYgKCEoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0VfTFVOX0NNRCkpCisJCXRyYW5zcG9ydF9yZWxlYXNlX2NtZChjbWQpOwogCWVsc2UgewogCQljb3JlX2RlY19sYWNsX2NvdW50KGNtZC0+c2Vfc2Vzcy0+c2Vfbm9kZV9hY2wsIGNtZCk7CiAKLQkJaWYgKFNFX0xVTihjbWQpKSB7CisJCWlmIChjbWQtPnNlX2x1bikgewogI2lmIDAKLQkJCXByaW50ayhLRVJOX0lORk8gImNtZDogJXAgSVRUOiAweCUwOHggY29udGFpbnMiCi0JCQkJIiBTRV9MVU4oY21kKVxuIiwgY21kLAotCQkJCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCkpOworCQkJcHJfZGVidWcoImNtZDogJXAgSVRUOiAweCUwOHggY29udGFpbnMiCisJCQkJIiBjbWQtPnNlX2x1blxuIiwgY21kLAorCQkJCWNtZC0+c2VfdGZvLT5nZXRfdGFza190YWcoY21kKSk7CiAjZW5kaWYKIAkJCXRyYW5zcG9ydF9sdW5fcmVtb3ZlX2NtZChjbWQpOwogCQl9CkBAIC01MzE2LDggKzQzNzIsNyBAQAogCiAJCXRyYW5zcG9ydF9mcmVlX2Rldl90YXNrcyhjbWQpOwogCi0JCXRyYW5zcG9ydF9nZW5lcmljX3JlbW92ZShjbWQsIHJlbGVhc2VfdG9fcG9vbCwKLQkJCQlzZXNzaW9uX3JlaW5zdGF0ZW1lbnQpOworCQl0cmFuc3BvcnRfZ2VuZXJpY19yZW1vdmUoY21kLCBzZXNzaW9uX3JlaW5zdGF0ZW1lbnQpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQpOwpAQCAtNTM0Myw0MyArNDM5OCwzNiBAQAogCSAqIElmIHRoZSBmcm9udGVuZCBoYXMgYWxyZWFkeSByZXF1ZXN0ZWQgdGhpcyBzdHJ1Y3Qgc2VfY21kIHRvCiAJICogYmUgc3RvcHBlZCwgd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhpcyBzdHJ1Y3Qgc2VfY21kLgogCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfc3RvcCkpIHsKLQkJYXRvbWljX3NldCgmVF9UQVNLKGNtZCktPnRyYW5zcG9ydF9sdW5fc3RvcCwgMCk7Ci0JCURFQlVHX1RSQU5TUE9SVF9TKCJDb25maWdGUyBJVFRbMHglMDh4XSAtIHRfdHJhbnNwb3J0X3N0b3AgPT0iCi0JCQkiIFRSVUUsIHNraXBwaW5nXG4iLCBDTURfVEZPKGNtZCktPmdldF90YXNrX3RhZyhjbWQpKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCWlmIChhdG9taWNfcmVhZCgmY21kLT50X3RyYW5zcG9ydF9zdG9wKSkgeworCQlhdG9taWNfc2V0KCZjbWQtPnRyYW5zcG9ydF9sdW5fc3RvcCwgMCk7CisJCXByX2RlYnVnKCJDb25maWdGUyBJVFRbMHglMDh4XSAtIHRfdHJhbnNwb3J0X3N0b3AgPT0iCisJCQkiIFRSVUUsIHNraXBwaW5nXG4iLCBjbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCQl0cmFuc3BvcnRfY21kX2NoZWNrX3N0b3AoY21kLCAxLCAwKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVQRVJNOwogCX0KLQlhdG9taWNfc2V0KCZUX1RBU0soY21kKS0+dHJhbnNwb3J0X2x1bl9mZV9zdG9wLCAxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJYXRvbWljX3NldCgmY21kLT50cmFuc3BvcnRfbHVuX2ZlX3N0b3AsIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJlNFX0RFVihjbWQpLT5kZXZfcXVldWVfb2JqLT50aHJlYWRfd3EpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY21kLT5zZV9kZXYtPmRldl9xdWV1ZV9vYmoudGhyZWFkX3dxKTsKIAogCXJldCA9IHRyYW5zcG9ydF9zdG9wX3Rhc2tzX2Zvcl9jbWQoY21kKTsKIAotCURFQlVHX1RSQU5TUE9SVF9TKCJDb25maWdGUzogY21kOiAlcCB0X3Rhc2tfY2RiczogJWQgc3RvcCB0YXNrcyByZXQ6IgotCQkJIiAlZFxuIiwgY21kLCBUX1RBU0soY21kKS0+dF90YXNrX2NkYnMsIHJldCk7CisJcHJfZGVidWcoIkNvbmZpZ0ZTOiBjbWQ6ICVwIHRfdGFza3M6ICVkIHN0b3AgdGFza3MgcmV0OiIKKwkJCSIgJWRcbiIsIGNtZCwgY21kLT50X3Rhc2tfbGlzdF9udW0sIHJldCk7CiAJaWYgKCFyZXQpIHsKLQkJREVCVUdfVFJBTlNQT1JUX1MoIkNvbmZpZ0ZTOiBJVFRbMHglMDh4XSAtIHN0b3BwaW5nIGNtZC4uLi5cbiIsCi0JCQkJQ01EX1RGTyhjbWQpLT5nZXRfdGFza190YWcoY21kKSk7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJlRfVEFTSyhjbWQpLT50cmFuc3BvcnRfbHVuX3N0b3BfY29tcCk7Ci0JCURFQlVHX1RSQU5TUE9SVF9TKCJDb25maWdGUzogSVRUWzB4JTA4eF0gLSBzdG9wcGVkIGNtZC4uLi5cbiIsCi0JCQkJQ01EX1RGTyhjbWQpLT5nZXRfdGFza190YWcoY21kKSk7CisJCXByX2RlYnVnKCJDb25maWdGUzogSVRUWzB4JTA4eF0gLSBzdG9wcGluZyBjbWQuLi4uXG4iLAorCQkJCWNtZC0+c2VfdGZvLT5nZXRfdGFza190YWcoY21kKSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNtZC0+dHJhbnNwb3J0X2x1bl9zdG9wX2NvbXApOworCQlwcl9kZWJ1ZygiQ29uZmlnRlM6IElUVFsweCUwOHhdIC0gc3RvcHBlZCBjbWQuLi4uXG4iLAorCQkJCWNtZC0+c2VfdGZvLT5nZXRfdGFza190YWcoY21kKSk7CiAJfQotCXRyYW5zcG9ydF9yZW1vdmVfY21kX2Zyb21fcXVldWUoY21kLCBTRV9ERVYoY21kKS0+ZGV2X3F1ZXVlX29iaik7CisJdHJhbnNwb3J0X3JlbW92ZV9jbWRfZnJvbV9xdWV1ZShjbWQsICZjbWQtPnNlX2Rldi0+ZGV2X3F1ZXVlX29iaik7CiAKIAlyZXR1cm4gMDsKIH0KIAotLyogI2RlZmluZSBERUJVR19DTEVBUl9MVU4gKi8KLSNpZmRlZiBERUJVR19DTEVBUl9MVU4KLSNkZWZpbmUgREVCVUdfQ0xFQVJfTCh4Li4uKSBwcmludGsoS0VSTl9JTkZPIHgpCi0jZWxzZQotI2RlZmluZSBERUJVR19DTEVBUl9MKHguLi4pCi0jZW5kaWYKLQogc3RhdGljIHZvaWQgX190cmFuc3BvcnRfY2xlYXJfbHVuX2Zyb21fc2Vzc2lvbnMoc3RydWN0IHNlX2x1biAqbHVuKQogewogCXN0cnVjdCBzZV9jbWQgKmNtZCA9IE5VTEw7CkBAIC01Mzg5LDY2ICs0NDM3LDU5IEBACiAJICogSW5pdGlhdG9yIFBvcnQuCiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmx1bi0+bHVuX2NtZF9sb2NrLCBsdW5fZmxhZ3MpOwotCXdoaWxlICghbGlzdF9lbXB0eV9jYXJlZnVsKCZsdW4tPmx1bl9jbWRfbGlzdCkpIHsKLQkJY21kID0gbGlzdF9lbnRyeShsdW4tPmx1bl9jbWRfbGlzdC5uZXh0LAotCQkJc3RydWN0IHNlX2NtZCwgc2VfbHVuX2xpc3QpOwotCQlsaXN0X2RlbCgmY21kLT5zZV9sdW5fbGlzdCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZsdW4tPmx1bl9jbWRfbGlzdCkpIHsKKwkJY21kID0gbGlzdF9maXJzdF9lbnRyeSgmbHVuLT5sdW5fY21kX2xpc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2VfY21kLCBzZV9sdW5fbm9kZSk7CisJCWxpc3RfZGVsKCZjbWQtPnNlX2x1bl9ub2RlKTsKIAotCQlpZiAoIShUX1RBU0soY21kKSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiSVRUOiAweCUwOHgsIFRfVEFTSyhjbWQpID0gTlVMTCIKLQkJCQkiW2ksdF1fc3RhdGU6ICV1LyV1XG4iLAotCQkJCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCksCi0JCQkJQ01EX1RGTyhjbWQpLT5nZXRfY21kX3N0YXRlKGNtZCksIGNtZC0+dF9zdGF0ZSk7Ci0JCQlCVUcoKTsKLQkJfQotCQlhdG9taWNfc2V0KCZUX1RBU0soY21kKS0+dHJhbnNwb3J0X2x1bl9hY3RpdmUsIDApOworCQlhdG9taWNfc2V0KCZjbWQtPnRyYW5zcG9ydF9sdW5fYWN0aXZlLCAwKTsKIAkJLyoKIAkJICogVGhpcyB3aWxsIG5vdGlmeSBpc2NzaV90YXJnZXRfdHJhbnNwb3J0LmM6CiAJCSAqIHRyYW5zcG9ydF9jbWRfY2hlY2tfc3RvcCgpIHRoYXQgYSBMVU4gc2h1dGRvd24gaXMgaW4KIAkJICogcHJvZ3Jlc3MgZm9yIHRoZSBpc2NzaV9jbWRfdC4KIAkJICovCi0JCXNwaW5fbG9jaygmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jayk7Ci0JCURFQlVHX0NMRUFSX0woIlNFX0xVTlslZF0gLSBTZXR0aW5nIFRfVEFTSyhjbWQpLT50cmFuc3BvcnQiCisJCXNwaW5fbG9jaygmY21kLT50X3N0YXRlX2xvY2spOworCQlwcl9kZWJ1ZygiU0VfTFVOWyVkXSAtIFNldHRpbmcgY21kLT50cmFuc3BvcnQiCiAJCQkiX2x1bl9zdG9wIGZvciAgSVRUOiAweCUwOHhcbiIsCi0JCQlTRV9MVU4oY21kKS0+dW5wYWNrZWRfbHVuLAotCQkJQ01EX1RGTyhjbWQpLT5nZXRfdGFza190YWcoY21kKSk7Ci0JCWF0b21pY19zZXQoJlRfVEFTSyhjbWQpLT50cmFuc3BvcnRfbHVuX3N0b3AsIDEpOwotCQlzcGluX3VubG9jaygmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jayk7CisJCQljbWQtPnNlX2x1bi0+dW5wYWNrZWRfbHVuLAorCQkJY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpKTsKKwkJYXRvbWljX3NldCgmY21kLT50cmFuc3BvcnRfbHVuX3N0b3AsIDEpOworCQlzcGluX3VubG9jaygmY21kLT50X3N0YXRlX2xvY2spOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmx1bi0+bHVuX2NtZF9sb2NrLCBsdW5fZmxhZ3MpOwogCi0JCWlmICghKFNFX0xVTihjbWQpKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJJVFQ6IDB4JTA4eCwgW2ksdF1fc3RhdGU6ICV1LyV1XG4iLAotCQkJCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCksCi0JCQkJQ01EX1RGTyhjbWQpLT5nZXRfY21kX3N0YXRlKGNtZCksIGNtZC0+dF9zdGF0ZSk7CisJCWlmICghY21kLT5zZV9sdW4pIHsKKwkJCXByX2VycigiSVRUOiAweCUwOHgsIFtpLHRdX3N0YXRlOiAldS8ldVxuIiwKKwkJCQljbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCksCisJCQkJY21kLT5zZV90Zm8tPmdldF9jbWRfc3RhdGUoY21kKSwgY21kLT50X3N0YXRlKTsKIAkJCUJVRygpOwogCQl9CiAJCS8qCiAJCSAqIElmIHRoZSBTdG9yYWdlIGVuZ2luZSBzdGlsbCBvd25zIHRoZSBpc2NzaV9jbWRfdCwgZGV0ZXJtaW5lCiAJCSAqIGFuZC9vciBzdG9wIGl0cyBjb250ZXh0LgogCQkgKi8KLQkJREVCVUdfQ0xFQVJfTCgiU0VfTFVOWyVkXSAtIElUVDogMHglMDh4IGJlZm9yZSB0cmFuc3BvcnQiCi0JCQkiX2x1bl93YWl0X2Zvcl90YXNrcygpXG4iLCBTRV9MVU4oY21kKS0+dW5wYWNrZWRfbHVuLAotCQkJQ01EX1RGTyhjbWQpLT5nZXRfdGFza190YWcoY21kKSk7CisJCXByX2RlYnVnKCJTRV9MVU5bJWRdIC0gSVRUOiAweCUwOHggYmVmb3JlIHRyYW5zcG9ydCIKKwkJCSJfbHVuX3dhaXRfZm9yX3Rhc2tzKClcbiIsIGNtZC0+c2VfbHVuLT51bnBhY2tlZF9sdW4sCisJCQljbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCkpOwogCi0JCWlmICh0cmFuc3BvcnRfbHVuX3dhaXRfZm9yX3Rhc2tzKGNtZCwgU0VfTFVOKGNtZCkpIDwgMCkgeworCQlpZiAodHJhbnNwb3J0X2x1bl93YWl0X2Zvcl90YXNrcyhjbWQsIGNtZC0+c2VfbHVuKSA8IDApIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZsdW4tPmx1bl9jbWRfbG9jaywgbHVuX2ZsYWdzKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJREVCVUdfQ0xFQVJfTCgiU0VfTFVOWyVkXSAtIElUVDogMHglMDh4IGFmdGVyIHRyYW5zcG9ydF9sdW4iCisJCXByX2RlYnVnKCJTRV9MVU5bJWRdIC0gSVRUOiAweCUwOHggYWZ0ZXIgdHJhbnNwb3J0X2x1biIKIAkJCSJfd2FpdF9mb3JfdGFza3MoKTogU1VDQ0VTU1xuIiwKLQkJCVNFX0xVTihjbWQpLT51bnBhY2tlZF9sdW4sCi0JCQlDTURfVEZPKGNtZCktPmdldF90YXNrX3RhZyhjbWQpKTsKKwkJCWNtZC0+c2VfbHVuLT51bnBhY2tlZF9sdW4sCisJCQljbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCkpOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBjbWRfZmxhZ3MpOwotCQlpZiAoIShhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRyYW5zcG9ydF9kZXZfYWN0aXZlKSkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGNtZF9mbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgY21kX2ZsYWdzKTsKKwkJaWYgKCFhdG9taWNfcmVhZCgmY21kLT50cmFuc3BvcnRfZGV2X2FjdGl2ZSkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBjbWRfZmxhZ3MpOwogCQkJZ290byBjaGVja19jb25kOwogCQl9Ci0JCWF0b21pY19zZXQoJlRfVEFTSyhjbWQpLT50cmFuc3BvcnRfZGV2X2FjdGl2ZSwgMCk7CisJCWF0b21pY19zZXQoJmNtZC0+dHJhbnNwb3J0X2Rldl9hY3RpdmUsIDApOwogCQl0cmFuc3BvcnRfYWxsX3Rhc2tfZGV2X3JlbW92ZV9zdGF0ZShjbWQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBjbWRfZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgY21kX2ZsYWdzKTsKIAogCQl0cmFuc3BvcnRfZnJlZV9kZXZfdGFza3MoY21kKTsKIAkJLyoKQEAgLTU0NjUsMjQgKzQ1MDYsMjQgQEAKIAkJICogYmUgcmVsZWFzZWQsIG5vdGlmeSB0aGUgd2FpdGluZyB0aHJlYWQgbm93IHRoYXQgTFUgaGFzCiAJCSAqIGZpbmlzaGVkIGFjY2Vzc2luZyBpdC4KIAkJICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBjbWRfZmxhZ3MpOwotCQlpZiAoYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50cmFuc3BvcnRfbHVuX2ZlX3N0b3ApKSB7Ci0JCQlERUJVR19DTEVBUl9MKCJTRV9MVU5bJWRdIC0gRGV0ZWN0ZWQgRkUgc3RvcCBmb3IiCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgY21kX2ZsYWdzKTsKKwkJaWYgKGF0b21pY19yZWFkKCZjbWQtPnRyYW5zcG9ydF9sdW5fZmVfc3RvcCkpIHsKKwkJCXByX2RlYnVnKCJTRV9MVU5bJWRdIC0gRGV0ZWN0ZWQgRkUgc3RvcCBmb3IiCiAJCQkJIiBzdHJ1Y3Qgc2VfY21kOiAlcCBJVFQ6IDB4JTA4eFxuIiwKIAkJCQlsdW4tPnVucGFja2VkX2x1biwKLQkJCQljbWQsIENNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCkpOworCQkJCWNtZCwgY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpKTsKIAotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLAogCQkJCQljbWRfZmxhZ3MpOwogCQkJdHJhbnNwb3J0X2NtZF9jaGVja19zdG9wKGNtZCwgMSwgMCk7Ci0JCQljb21wbGV0ZSgmVF9UQVNLKGNtZCktPnRyYW5zcG9ydF9sdW5fZmVfc3RvcF9jb21wKTsKKwkJCWNvbXBsZXRlKCZjbWQtPnRyYW5zcG9ydF9sdW5fZmVfc3RvcF9jb21wKTsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZsdW4tPmx1bl9jbWRfbG9jaywgbHVuX2ZsYWdzKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCURFQlVHX0NMRUFSX0woIlNFX0xVTlslZF0gLSBJVFQ6IDB4JTA4eCBmaW5pc2hlZCBwcm9jZXNzaW5nXG4iLAotCQkJbHVuLT51bnBhY2tlZF9sdW4sIENNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCkpOworCQlwcl9kZWJ1ZygiU0VfTFVOWyVkXSAtIElUVDogMHglMDh4IGZpbmlzaGVkIHByb2Nlc3NpbmdcbiIsCisJCQlsdW4tPnVucGFja2VkX2x1biwgY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpKTsKIAotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBjbWRfZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgY21kX2ZsYWdzKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmx1bi0+bHVuX2NtZF9sb2NrLCBsdW5fZmxhZ3MpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsdW4tPmx1bl9jbWRfbG9jaywgbHVuX2ZsYWdzKTsKQEAgLTU1MDIsMTEgKzQ1NDMsMTEgQEAKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmt0OwogCi0Ja3QgPSBrdGhyZWFkX3J1bih0cmFuc3BvcnRfY2xlYXJfbHVuX3RocmVhZCwgKHZvaWQgKilsdW4sCisJa3QgPSBrdGhyZWFkX3J1bih0cmFuc3BvcnRfY2xlYXJfbHVuX3RocmVhZCwgbHVuLAogCQkJInRjbV9jbF8ldSIsIGx1bi0+dW5wYWNrZWRfbHVuKTsKIAlpZiAoSVNfRVJSKGt0KSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBzdGFydCBjbGVhcl9sdW4gdGhyZWFkXG4iKTsKLQkJcmV0dXJuIC0xOworCQlwcl9lcnIoIlVuYWJsZSB0byBzdGFydCBjbGVhcl9sdW4gdGhyZWFkXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoa3QpOwogCX0KIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZsdW4tPmx1bl9zaHV0ZG93bl9jb21wKTsKIApAQCAtNTUyOCwyMCArNDU2OSwyMCBAQAogCWlmICghKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NFX0xVTl9DTUQpICYmICEoY21kLT5zZV90bXJfcmVxKSkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAkvKgogCSAqIElmIHdlIGFyZSBhbHJlYWR5IHN0b3BwZWQgZHVlIHRvIGFuIGV4dGVybmFsIGV2ZW50IChpZTogTFVOIHNodXRkb3duKQogCSAqIHNsZWVwIHVudGlsIHRoZSBjb25uZWN0aW9uIGNhbiBoYXZlIHRoZSBwYXNzZWQgc3RydWN0IHNlX2NtZCBiYWNrLgotCSAqIFRoZSBUX1RBU0soY21kKS0+dHJhbnNwb3J0X2x1bl9zdG9wcGVkX3NlbSB3aWxsIGJlIHVwcGVkIGJ5CisJICogVGhlIGNtZC0+dHJhbnNwb3J0X2x1bl9zdG9wcGVkX3NlbSB3aWxsIGJlIHVwcGVkIGJ5CiAJICogdHJhbnNwb3J0X2NsZWFyX2x1bl9mcm9tX3Nlc3Npb25zKCkgb25jZSB0aGUgQ29uZmlnRlMgY29udGV4dCBjYWxsZXIKIAkgKiBoYXMgY29tcGxldGVkIGl0cyBvcGVyYXRpb24gb24gdGhlIHN0cnVjdCBzZV9jbWQuCiAJICovCi0JaWYgKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dHJhbnNwb3J0X2x1bl9zdG9wKSkgeworCWlmIChhdG9taWNfcmVhZCgmY21kLT50cmFuc3BvcnRfbHVuX3N0b3ApKSB7CiAKLQkJREVCVUdfVFJBTlNQT1JUX1MoIndhaXRfZm9yX3Rhc2tzOiBTdG9wcGluZyIKLQkJCSIgd2FpdF9mb3JfY29tcGxldGlvbigmVF9UQVNLKGNtZCl0cmFuc3BvcnRfbHVuX2ZlIgorCQlwcl9kZWJ1Zygid2FpdF9mb3JfdGFza3M6IFN0b3BwaW5nIgorCQkJIiB3YWl0X2Zvcl9jb21wbGV0aW9uKCZjbWQtPnRfdGFza3RyYW5zcG9ydF9sdW5fZmUiCiAJCQkiX3N0b3BfY29tcCk7IGZvciBJVFQ6IDB4JTA4eFxuIiwKLQkJCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCkpOworCQkJY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpKTsKIAkJLyoKIAkJICogVGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgZm9yIFdSSVRFUyB3aGVyZSBhIEZFIGV4Y2VwdGlvbiArCiAJCSAqIExVTiBzaHV0ZG93biBtZWFucyBDb25maWdGUyBjb250ZXh0IGlzIHN0aWxsIHNsZWVwaW5nIG9uCkBAIC01NTQ5LDEwICs0NTkwLDEwIEBACiAJCSAqIFdlIGdvIGFoZWFkIGFuZCB1cCB0cmFuc3BvcnRfbHVuX3N0b3BfY29tcCBqdXN0IHRvIGJlIHN1cmUKIAkJICogaGVyZS4KIAkJICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJY29tcGxldGUoJlRfVEFTSyhjbWQpLT50cmFuc3BvcnRfbHVuX3N0b3BfY29tcCk7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJlRfVEFTSyhjbWQpLT50cmFuc3BvcnRfbHVuX2ZlX3N0b3BfY29tcCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCWNvbXBsZXRlKCZjbWQtPnRyYW5zcG9ydF9sdW5fc3RvcF9jb21wKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmY21kLT50cmFuc3BvcnRfbHVuX2ZlX3N0b3BfY29tcCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCiAJCXRyYW5zcG9ydF9hbGxfdGFza19kZXZfcmVtb3ZlX3N0YXRlKGNtZCk7CiAJCS8qCkBAIC01NTYwLDQ0ICs0NjAxLDQ0IEBACiAJCSAqIHN0cnVjdCBzZV9jbWQsIG5vdyBvd25zIHRoZSBzdHJ1Y3R1cmUgYW5kIGNhbiBiZSByZWxlYXNlZCB0aHJvdWdoCiAJCSAqIG5vcm1hbCBtZWFucyBiZWxvdy4KIAkJICovCi0JCURFQlVHX1RSQU5TUE9SVF9TKCJ3YWl0X2Zvcl90YXNrczogU3RvcHBlZCIKLQkJCSIgd2FpdF9mb3JfY29tcGxldGlvbigmVF9UQVNLKGNtZCl0cmFuc3BvcnRfbHVuX2ZlXyIKKwkJcHJfZGVidWcoIndhaXRfZm9yX3Rhc2tzOiBTdG9wcGVkIgorCQkJIiB3YWl0X2Zvcl9jb21wbGV0aW9uKCZjbWQtPnRfdGFza3RyYW5zcG9ydF9sdW5fZmVfIgogCQkJInN0b3BfY29tcCk7IGZvciBJVFQ6IDB4JTA4eFxuIiwKLQkJCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCkpOworCQkJY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpKTsKIAotCQlhdG9taWNfc2V0KCZUX1RBU0soY21kKS0+dHJhbnNwb3J0X2x1bl9zdG9wLCAwKTsKKwkJYXRvbWljX3NldCgmY21kLT50cmFuc3BvcnRfbHVuX3N0b3AsIDApOwogCX0KLQlpZiAoIWF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfYWN0aXZlKSB8fAotCSAgICAgYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF9hYm9ydGVkKSkKKwlpZiAoIWF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X2FjdGl2ZSkgfHwKKwkgICAgIGF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X2Fib3J0ZWQpKQogCQlnb3RvIHJlbW92ZTsKIAotCWF0b21pY19zZXQoJlRfVEFTSyhjbWQpLT50X3RyYW5zcG9ydF9zdG9wLCAxKTsKKwlhdG9taWNfc2V0KCZjbWQtPnRfdHJhbnNwb3J0X3N0b3AsIDEpOwogCi0JREVCVUdfVFJBTlNQT1JUX1MoIndhaXRfZm9yX3Rhc2tzOiBTdG9wcGluZyAlcCBJVFQ6IDB4JTA4eCIKKwlwcl9kZWJ1Zygid2FpdF9mb3JfdGFza3M6IFN0b3BwaW5nICVwIElUVDogMHglMDh4IgogCQkiIGlfc3RhdGU6ICVkLCB0X3N0YXRlL2RlZl90X3N0YXRlOiAlZC8lZCwgdF90cmFuc3BvcnRfc3RvcCIKLQkJIiA9IFRSVUVcbiIsIGNtZCwgQ01EX1RGTyhjbWQpLT5nZXRfdGFza190YWcoY21kKSwKLQkJQ01EX1RGTyhjbWQpLT5nZXRfY21kX3N0YXRlKGNtZCksIGNtZC0+dF9zdGF0ZSwKKwkJIiA9IFRSVUVcbiIsIGNtZCwgY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpLAorCQljbWQtPnNlX3Rmby0+Z2V0X2NtZF9zdGF0ZShjbWQpLCBjbWQtPnRfc3RhdGUsCiAJCWNtZC0+ZGVmZXJyZWRfdF9zdGF0ZSk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmU0VfREVWKGNtZCktPmRldl9xdWV1ZV9vYmotPnRocmVhZF93cSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjbWQtPnNlX2Rldi0+ZGV2X3F1ZXVlX29iai50aHJlYWRfd3EpOwogCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X3N0b3BfY29tcCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmY21kLT50X3RyYW5zcG9ydF9zdG9wX2NvbXApOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQlhdG9taWNfc2V0KCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfYWN0aXZlLCAwKTsKLQlhdG9taWNfc2V0KCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfc3RvcCwgMCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJYXRvbWljX3NldCgmY21kLT50X3RyYW5zcG9ydF9hY3RpdmUsIDApOworCWF0b21pY19zZXQoJmNtZC0+dF90cmFuc3BvcnRfc3RvcCwgMCk7CiAKLQlERUJVR19UUkFOU1BPUlRfUygid2FpdF9mb3JfdGFza3M6IFN0b3BwZWQgd2FpdF9mb3JfY29tcGx0aW9uKCIKLQkJIiZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfc3RvcF9jb21wKSBmb3IgSVRUOiAweCUwOHhcbiIsCi0JCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCkpOworCXByX2RlYnVnKCJ3YWl0X2Zvcl90YXNrczogU3RvcHBlZCB3YWl0X2Zvcl9jb21wbHRpb24oIgorCQkiJmNtZC0+dF90cmFuc3BvcnRfc3RvcF9jb21wKSBmb3IgSVRUOiAweCUwOHhcbiIsCisJCWNtZC0+c2VfdGZvLT5nZXRfdGFza190YWcoY21kKSk7CiByZW1vdmU6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJaWYgKCFyZW1vdmVfY21kKQogCQlyZXR1cm47CiAKLQl0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZChjbWQsIDAsIDAsIHNlc3Npb25fcmVpbnN0YXRlbWVudCk7CisJdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoY21kLCAwLCBzZXNzaW9uX3JlaW5zdGF0ZW1lbnQpOwogfQogCiBzdGF0aWMgaW50IHRyYW5zcG9ydF9nZXRfc2Vuc2VfY29kZXMoCkBAIC01NjMyLDEzICs0NjczLDEzIEBACiAJaW50IG9mZnNldDsKIAl1OCBhc2MgPSAwLCBhc2NxID0gMDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJaWYgKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NFTlRfQ0hFQ0tfQ09ORElUSU9OKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TRU5UX0NIRUNLX0NPTkRJVElPTjsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAogCWlmICghcmVhc29uICYmIGZyb21fdHJhbnNwb3J0KQogCQlnb3RvIGFmdGVyX3JlYXNvbjsKQEAgLTU2NTEsNyArNDY5Miw3IEBACiAJICogVFJBTlNQT1JUX1NFTlNFX0JVRkZFUiBpcyBub3cgc2V0IHRvIFNDU0lfU0VOU0VfQlVGRkVSU0laRQogCSAqIGZyb20gaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCiAJICovCi0Jb2Zmc2V0ID0gQ01EX1RGTyhjbWQpLT5zZXRfZmFicmljX3NlbnNlX2xlbihjbWQsCisJb2Zmc2V0ID0gY21kLT5zZV90Zm8tPnNldF9mYWJyaWNfc2Vuc2VfbGVuKGNtZCwKIAkJCQlUUkFOU1BPUlRfU0VOU0VfQlVGRkVSKTsKIAkvKgogCSAqIEFjdHVhbCBTRU5TRSBEQVRBLCBzZWUgU1BDLTMgNy4yMy4yICBTUENfU0VOU0VfS0VZX09GRlNFVCB1c2VzCkBAIC01Nzg4LDggKzQ4MjksNyBAQAogCWNtZC0+c2NzaV9zZW5zZV9sZW5ndGggID0gVFJBTlNQT1JUX1NFTlNFX0JVRkZFUiArIG9mZnNldDsKIAogYWZ0ZXJfcmVhc29uOgotCUNNRF9URk8oY21kKS0+cXVldWVfc3RhdHVzKGNtZCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGNtZC0+c2VfdGZvLT5xdWV1ZV9zdGF0dXMoY21kKTsKIH0KIEVYUE9SVF9TWU1CT0wodHJhbnNwb3J0X3NlbmRfY2hlY2tfY29uZGl0aW9uX2FuZF9zZW5zZSk7CiAKQEAgLTU3OTcsMTggKzQ4MzcsMTggQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X2Fib3J0ZWQpICE9IDApIHsKLQkJaWYgKCEoc2VuZF9zdGF0dXMpIHx8CisJaWYgKGF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X2Fib3J0ZWQpICE9IDApIHsKKwkJaWYgKCFzZW5kX3N0YXR1cyB8fAogCQkgICAgIChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TRU5UX0RFTEFZRURfVEFTKSkKIAkJCXJldHVybiAxOwogI2lmIDAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiU2VuZGluZyBkZWxheWVkIFNBTV9TVEFUX1RBU0tfQUJPUlRFRCIKKwkJcHJfZGVidWcoIlNlbmRpbmcgZGVsYXllZCBTQU1fU1RBVF9UQVNLX0FCT1JURUQiCiAJCQkiIHN0YXR1cyBmb3IgQ0RCOiAweCUwMnggSVRUOiAweCUwOHhcbiIsCi0JCQlUX1RBU0soY21kKS0+dF90YXNrX2NkYlswXSwKLQkJCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCkpOworCQkJY21kLT50X3Rhc2tfY2RiWzBdLAorCQkJY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpKTsKICNlbmRpZgogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0VOVF9ERUxBWUVEX1RBUzsKLQkJQ01EX1RGTyhjbWQpLT5xdWV1ZV9zdGF0dXMoY21kKTsKKwkJY21kLT5zZV90Zm8tPnF1ZXVlX3N0YXR1cyhjbWQpOwogCQlyZXQgPSAxOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtNTgyNCw4ICs0ODY0LDggQEAKIAkgKiBxdWV1ZWQgYmFjayB0byBmYWJyaWMgbW9kdWxlIGJ5IHRyYW5zcG9ydF9jaGVja19hYm9ydGVkX3N0YXR1cygpLgogCSAqLwogCWlmIChjbWQtPmRhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKLQkJaWYgKENNRF9URk8oY21kKS0+d3JpdGVfcGVuZGluZ19zdGF0dXMoY21kKSAhPSAwKSB7Ci0JCQlhdG9taWNfaW5jKCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfYWJvcnRlZCk7CisJCWlmIChjbWQtPnNlX3Rmby0+d3JpdGVfcGVuZGluZ19zdGF0dXMoY21kKSAhPSAwKSB7CisJCQlhdG9taWNfaW5jKCZjbWQtPnRfdHJhbnNwb3J0X2Fib3J0ZWQpOwogCQkJc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCk7CiAJCQljbWQtPnNjc2lfc3RhdHVzID0gU0FNX1NUQVRfVEFTS19BQk9SVEVEOwogCQkJdHJhbnNwb3J0X25ld19jbWRfZmFpbHVyZShjbWQpOwpAQCAtNTgzNCwxMSArNDg3NCwxMSBAQAogCX0KIAljbWQtPnNjc2lfc3RhdHVzID0gU0FNX1NUQVRfVEFTS19BQk9SVEVEOwogI2lmIDAKLQlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIFNBTV9TVEFUX1RBU0tfQUJPUlRFRCBzdGF0dXMgZm9yIENEQjogMHglMDJ4LCIKLQkJIiBJVFQ6IDB4JTA4eFxuIiwgVF9UQVNLKGNtZCktPnRfdGFza19jZGJbMF0sCi0JCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCkpOworCXByX2RlYnVnKCJTZXR0aW5nIFNBTV9TVEFUX1RBU0tfQUJPUlRFRCBzdGF0dXMgZm9yIENEQjogMHglMDJ4LCIKKwkJIiBJVFQ6IDB4JTA4eFxuIiwgY21kLT50X3Rhc2tfY2RiWzBdLAorCQljbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCkpOwogI2VuZGlmCi0JQ01EX1RGTyhjbWQpLT5xdWV1ZV9zdGF0dXMoY21kKTsKKwljbWQtPnNlX3Rmby0+cXVldWVfc3RhdHVzKGNtZCk7CiB9CiAKIC8qCXRyYW5zcG9ydF9nZW5lcmljX2RvX3RtcigpOgpAQCAtNTg0NywxNCArNDg4NywxMiBAQAogICovCiBpbnQgdHJhbnNwb3J0X2dlbmVyaWNfZG9fdG1yKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2VfY21kICpyZWZfY21kOwotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0RFVihjbWQpOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXN0cnVjdCBzZV90bXJfcmVxICp0bXIgPSBjbWQtPnNlX3Rtcl9yZXE7CiAJaW50IHJldDsKIAogCXN3aXRjaCAodG1yLT5mdW5jdGlvbikgewogCWNhc2UgVE1SX0FCT1JUX1RBU0s6Ci0JCXJlZl9jbWQgPSB0bXItPnJlZl9jbWQ7CiAJCXRtci0+cmVzcG9uc2UgPSBUTVJfRlVOQ1RJT05fUkVKRUNURUQ7CiAJCWJyZWFrOwogCWNhc2UgVE1SX0FCT1JUX1RBU0tfU0VUOgpAQCAtNTg3NCwxNCArNDkxMiwxNCBAQAogCQl0bXItPnJlc3BvbnNlID0gVE1SX0ZVTkNUSU9OX1JFSkVDVEVEOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIlVrbm93biBUTVIgZnVuY3Rpb246IDB4JTAyeC5cbiIsCisJCXByX2VycigiVWtub3duIFRNUiBmdW5jdGlvbjogMHglMDJ4LlxuIiwKIAkJCQl0bXItPmZ1bmN0aW9uKTsKIAkJdG1yLT5yZXNwb25zZSA9IFRNUl9GVU5DVElPTl9SRUpFQ1RFRDsKIAkJYnJlYWs7CiAJfQogCiAJY21kLT50X3N0YXRlID0gVFJBTlNQT1JUX0lTVEFURV9QUk9DRVNTSU5HOwotCUNNRF9URk8oY21kKS0+cXVldWVfdG1fcnNwKGNtZCk7CisJY21kLT5zZV90Zm8tPnF1ZXVlX3RtX3JzcChjbWQpOwogCiAJdHJhbnNwb3J0X2NtZF9jaGVja19zdG9wKGNtZCwgMiwgMCk7CiAJcmV0dXJuIDA7CkBAIC01OTExLDYyICs0OTQ5LDU0IEBACiBzdGF0aWMgdm9pZCB0cmFuc3BvcnRfcHJvY2Vzc2luZ19zaHV0ZG93bihzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNlX2NtZCAqY21kOwotCXN0cnVjdCBzZV9xdWV1ZV9yZXEgKnFyOwogCXN0cnVjdCBzZV90YXNrICp0YXNrOwotCXU4IHN0YXRlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJLyoKIAkgKiBFbXB0eSB0aGUgc3RydWN0IHNlX2RldmljZSdzIHN0cnVjdCBzZV90YXNrIHN0YXRlIGxpc3QuCiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXhlY3V0ZV90YXNrX2xvY2ssIGZsYWdzKTsKIAl3aGlsZSAoKHRhc2sgPSB0cmFuc3BvcnRfZ2V0X3Rhc2tfZnJvbV9zdGF0ZV9saXN0KGRldikpKSB7Ci0JCWlmICghKFRBU0tfQ01EKHRhc2spKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJUQVNLX0NNRCh0YXNrKSBpcyBOVUxMIVxuIik7CisJCWlmICghdGFzay0+dGFza19zZV9jbWQpIHsKKwkJCXByX2VycigidGFzay0+dGFza19zZV9jbWQgaXMgTlVMTCFcbiIpOwogCQkJY29udGludWU7CiAJCX0KLQkJY21kID0gVEFTS19DTUQodGFzayk7CisJCWNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCi0JCWlmICghVF9UQVNLKGNtZCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVF9UQVNLKGNtZCkgaXMgTlVMTCBmb3IgdGFzazogJXAgY21kOiIKLQkJCQkiICVwIElUVDogMHglMDh4XG4iLCB0YXNrLCBjbWQsCi0JCQkJQ01EX1RGTyhjbWQpLT5nZXRfdGFza190YWcoY21kKSk7Ci0JCQljb250aW51ZTsKLQkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrLCBmbGFncyk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKLQkJREVCVUdfRE8oIlBUOiBjbWQ6ICVwIHRhc2s6ICVwIElUVC9DbWRTTjogMHglMDh4LzB4JTA4eCwiCi0JCQkiIGlfc3RhdGUvZGVmX2lfc3RhdGU6ICVkLyVkLCB0X3N0YXRlL2RlZl90X3N0YXRlOiIKKwkJcHJfZGVidWcoIlBUOiBjbWQ6ICVwIHRhc2s6ICVwIElUVDogMHglMDh4LCIKKwkJCSIgaV9zdGF0ZTogJWQsIHRfc3RhdGUvZGVmX3Rfc3RhdGU6IgogCQkJIiAlZC8lZCBjZGI6IDB4JTAyeFxuIiwgY21kLCB0YXNrLAotCQkJQ01EX1RGTyhjbWQpLT5nZXRfdGFza190YWcoY21kKSwgY21kLT5jbWRfc24sCi0JCQlDTURfVEZPKGNtZCktPmdldF9jbWRfc3RhdGUoY21kKSwgY21kLT5kZWZlcnJlZF9pX3N0YXRlLAorCQkJY21kLT5zZV90Zm8tPmdldF90YXNrX3RhZyhjbWQpLAorCQkJY21kLT5zZV90Zm8tPmdldF9jbWRfc3RhdGUoY21kKSwKIAkJCWNtZC0+dF9zdGF0ZSwgY21kLT5kZWZlcnJlZF90X3N0YXRlLAotCQkJVF9UQVNLKGNtZCktPnRfdGFza19jZGJbMF0pOwotCQlERUJVR19ETygiUFQ6IElUVFsweCUwOHhdIC0gdF90YXNrX2NkYnM6ICVkIHRfdGFza19jZGJzX2xlZnQ6IgorCQkJY21kLT50X3Rhc2tfY2RiWzBdKTsKKwkJcHJfZGVidWcoIlBUOiBJVFRbMHglMDh4XSAtIHRfdGFza3M6ICVkIHRfdGFza19jZGJzX2xlZnQ6IgogCQkJIiAlZCB0X3Rhc2tfY2Ric19zZW50OiAlZCAtLSB0X3RyYW5zcG9ydF9hY3RpdmU6ICVkIgogCQkJIiB0X3RyYW5zcG9ydF9zdG9wOiAlZCB0X3RyYW5zcG9ydF9zZW50OiAlZFxuIiwKLQkJCUNNRF9URk8oY21kKS0+Z2V0X3Rhc2tfdGFnKGNtZCksCi0JCQlUX1RBU0soY21kKS0+dF90YXNrX2NkYnMsCi0JCQlhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfdGFza19jZGJzX2xlZnQpLAotCQkJYXRvbWljX3JlYWQoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19zZW50KSwKLQkJCWF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfYWN0aXZlKSwKLQkJCWF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfc3RvcCksCi0JCQlhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfdHJhbnNwb3J0X3NlbnQpKTsKKwkJCWNtZC0+c2VfdGZvLT5nZXRfdGFza190YWcoY21kKSwKKwkJCWNtZC0+dF90YXNrX2xpc3RfbnVtLAorCQkJYXRvbWljX3JlYWQoJmNtZC0+dF90YXNrX2NkYnNfbGVmdCksCisJCQlhdG9taWNfcmVhZCgmY21kLT50X3Rhc2tfY2Ric19zZW50KSwKKwkJCWF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X2FjdGl2ZSksCisJCQlhdG9taWNfcmVhZCgmY21kLT50X3RyYW5zcG9ydF9zdG9wKSwKKwkJCWF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X3NlbnQpKTsKIAogCQlpZiAoYXRvbWljX3JlYWQoJnRhc2stPnRhc2tfYWN0aXZlKSkgewogCQkJYXRvbWljX3NldCgmdGFzay0+dGFza19zdG9wLCAxKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkJJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCQkmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAotCQkJREVCVUdfRE8oIldhaXRpbmcgZm9yIHRhc2s6ICVwIHRvIHNodXRkb3duIGZvciBkZXY6IgorCQkJcHJfZGVidWcoIldhaXRpbmcgZm9yIHRhc2s6ICVwIHRvIHNodXRkb3duIGZvciBkZXY6IgogCQkJCSIgJXBcbiIsIHRhc2ssIGRldik7CiAJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ0YXNrLT50YXNrX3N0b3BfY29tcCk7Ci0JCQlERUJVR19ETygiQ29tcGxldGVkIHRhc2s6ICVwIHNodXRkb3duIGZvciBkZXY6ICVwXG4iLAorCQkJcHJfZGVidWcoIkNvbXBsZXRlZCB0YXNrOiAlcCBzaHV0ZG93biBmb3IgZGV2OiAlcFxuIiwKIAkJCQl0YXNrLCBkZXYpOwogCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQkJYXRvbWljX2RlYygmVF9UQVNLKGNtZCktPnRfdGFza19jZGJzX2xlZnQpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCQlhdG9taWNfZGVjKCZjbWQtPnRfdGFza19jZGJzX2xlZnQpOwogCiAJCQlhdG9taWNfc2V0KCZ0YXNrLT50YXNrX2FjdGl2ZSwgMCk7CiAJCQlhdG9taWNfc2V0KCZ0YXNrLT50YXNrX3N0b3AsIDApOwpAQCAtNTk3Niw3MiArNTAwNiw3MiBAQAogCQl9CiAJCV9fdHJhbnNwb3J0X3N0b3BfdGFza190aW1lcih0YXNrLCAmZmxhZ3MpOwogCi0JCWlmICghKGF0b21pY19kZWNfYW5kX3Rlc3QoJlRfVEFTSyhjbWQpLT50X3Rhc2tfY2Ric19leF9sZWZ0KSkpIHsKKwkJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjbWQtPnRfdGFza19jZGJzX2V4X2xlZnQpKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCQkJCQkmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAotCQkJREVCVUdfRE8oIlNraXBwaW5nIHRhc2s6ICVwLCBkZXY6ICVwIGZvciIKKwkJCXByX2RlYnVnKCJTa2lwcGluZyB0YXNrOiAlcCwgZGV2OiAlcCBmb3IiCiAJCQkJIiB0X3Rhc2tfY2Ric19leF9sZWZ0OiAlZFxuIiwgdGFzaywgZGV2LAotCQkJCWF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90YXNrX2NkYnNfZXhfbGVmdCkpOworCQkJCWF0b21pY19yZWFkKCZjbWQtPnRfdGFza19jZGJzX2V4X2xlZnQpKTsKIAogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXhlY3V0ZV90YXNrX2xvY2ssIGZsYWdzKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF90cmFuc3BvcnRfYWN0aXZlKSkgewotCQkJREVCVUdfRE8oImdvdCB0X3RyYW5zcG9ydF9hY3RpdmUgPSAxIGZvciB0YXNrOiAlcCwgZGV2OiIKKwkJaWYgKGF0b21pY19yZWFkKCZjbWQtPnRfdHJhbnNwb3J0X2FjdGl2ZSkpIHsKKwkJCXByX2RlYnVnKCJnb3QgdF90cmFuc3BvcnRfYWN0aXZlID0gMSBmb3IgdGFzazogJXAsIGRldjoiCiAJCQkJCSIgJXBcbiIsIHRhc2ssIGRldik7CiAKLQkJCWlmIChhdG9taWNfcmVhZCgmVF9UQVNLKGNtZCktPnRfZmVfY291bnQpKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmNtZC0+dF9mZV9jb3VudCkpIHsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkmVF9UQVNLKGNtZCktPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCQkJCQkmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAkJCQl0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKAogCQkJCQljbWQsIFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFLAogCQkJCQkwKTsKIAkJCQl0cmFuc3BvcnRfcmVtb3ZlX2NtZF9mcm9tX3F1ZXVlKGNtZCwKLQkJCQkJU0VfREVWKGNtZCktPmRldl9xdWV1ZV9vYmopOworCQkJCQkmY21kLT5zZV9kZXYtPmRldl9xdWV1ZV9vYmopOwogCiAJCQkJdHJhbnNwb3J0X2x1bl9yZW1vdmVfY21kKGNtZCk7CiAJCQkJdHJhbnNwb3J0X2NtZF9jaGVja19zdG9wKGNtZCwgMSwgMCk7CiAJCQl9IGVsc2UgewogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkJCSZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCQkJCSZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCiAJCQkJdHJhbnNwb3J0X3JlbW92ZV9jbWRfZnJvbV9xdWV1ZShjbWQsCi0JCQkJCVNFX0RFVihjbWQpLT5kZXZfcXVldWVfb2JqKTsKKwkJCQkJJmNtZC0+c2VfZGV2LT5kZXZfcXVldWVfb2JqKTsKIAogCQkJCXRyYW5zcG9ydF9sdW5fcmVtb3ZlX2NtZChjbWQpOwogCiAJCQkJaWYgKHRyYW5zcG9ydF9jbWRfY2hlY2tfc3RvcChjbWQsIDEsIDApKQotCQkJCQl0cmFuc3BvcnRfZ2VuZXJpY19yZW1vdmUoY21kLCAwLCAwKTsKKwkJCQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVtb3ZlKGNtZCwgMCk7CiAJCQl9CiAKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrLCBmbGFncyk7CiAJCQljb250aW51ZTsKIAkJfQotCQlERUJVR19ETygiR290IHRfdHJhbnNwb3J0X2FjdGl2ZSA9IDAgZm9yIHRhc2s6ICVwLCBkZXY6ICVwXG4iLAorCQlwcl9kZWJ1ZygiR290IHRfdHJhbnNwb3J0X2FjdGl2ZSA9IDAgZm9yIHRhc2s6ICVwLCBkZXY6ICVwXG4iLAogCQkJCXRhc2ssIGRldik7CiAKLQkJaWYgKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF9mZV9jb3VudCkpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZjbWQtPnRfZmVfY291bnQpKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCSZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCQkJJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJCQl0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKGNtZCwKIAkJCQlUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRSwgMCk7CiAJCQl0cmFuc3BvcnRfcmVtb3ZlX2NtZF9mcm9tX3F1ZXVlKGNtZCwKLQkJCQlTRV9ERVYoY21kKS0+ZGV2X3F1ZXVlX29iaik7CisJCQkJJmNtZC0+c2VfZGV2LT5kZXZfcXVldWVfb2JqKTsKIAogCQkJdHJhbnNwb3J0X2x1bl9yZW1vdmVfY21kKGNtZCk7CiAJCQl0cmFuc3BvcnRfY21kX2NoZWNrX3N0b3AoY21kLCAxLCAwKTsKIAkJfSBlbHNlIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkJJlRfVEFTSyhjbWQpLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCQkmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAogCQkJdHJhbnNwb3J0X3JlbW92ZV9jbWRfZnJvbV9xdWV1ZShjbWQsCi0JCQkJU0VfREVWKGNtZCktPmRldl9xdWV1ZV9vYmopOworCQkJCSZjbWQtPnNlX2Rldi0+ZGV2X3F1ZXVlX29iaik7CiAJCQl0cmFuc3BvcnRfbHVuX3JlbW92ZV9jbWQoY21kKTsKIAogCQkJaWYgKHRyYW5zcG9ydF9jbWRfY2hlY2tfc3RvcChjbWQsIDEsIDApKQotCQkJCXRyYW5zcG9ydF9nZW5lcmljX3JlbW92ZShjbWQsIDAsIDApOworCQkJCXRyYW5zcG9ydF9nZW5lcmljX3JlbW92ZShjbWQsIDApOwogCQl9CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXhlY3V0ZV90YXNrX2xvY2ssIGZsYWdzKTsKQEAgLTYwNTAsMTggKzUwODAsMTIgQEAKIAkvKgogCSAqIEVtcHR5IHRoZSBzdHJ1Y3Qgc2VfZGV2aWNlJ3Mgc3RydWN0IHNlX2NtZCBsaXN0LgogCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmRldl9xdWV1ZV9vYmotPmNtZF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKChxciA9IF9fdHJhbnNwb3J0X2dldF9xcl9mcm9tX3F1ZXVlKGRldi0+ZGV2X3F1ZXVlX29iaikpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkJJmRldi0+ZGV2X3F1ZXVlX29iai0+Y21kX3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQkJY21kID0gKHN0cnVjdCBzZV9jbWQgKilxci0+Y21kOwotCQlzdGF0ZSA9IHFyLT5zdGF0ZTsKLQkJa2ZyZWUocXIpOworCXdoaWxlICgoY21kID0gdHJhbnNwb3J0X2dldF9jbWRfZnJvbV9xdWV1ZSgmZGV2LT5kZXZfcXVldWVfb2JqKSkpIHsKIAotCQlERUJVR19ETygiRnJvbSBEZXZpY2UgUXVldWU6IGNtZDogJXAgdF9zdGF0ZTogJWRcbiIsCi0JCQkJY21kLCBzdGF0ZSk7CisJCXByX2RlYnVnKCJGcm9tIERldmljZSBRdWV1ZTogY21kOiAlcCB0X3N0YXRlOiAlZFxuIiwKKwkJCQljbWQsIGNtZC0+dF9zdGF0ZSk7CiAKLQkJaWYgKGF0b21pY19yZWFkKCZUX1RBU0soY21kKS0+dF9mZV9jb3VudCkpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZjbWQtPnRfZmVfY291bnQpKSB7CiAJCQl0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKGNtZCwKIAkJCQlUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRSwgMCk7CiAKQEAgLTYwNzAsMTEgKzUwOTQsOSBAQAogCQl9IGVsc2UgewogCQkJdHJhbnNwb3J0X2x1bl9yZW1vdmVfY21kKGNtZCk7CiAJCQlpZiAodHJhbnNwb3J0X2NtZF9jaGVja19zdG9wKGNtZCwgMSwgMCkpCi0JCQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVtb3ZlKGNtZCwgMCwgMCk7CisJCQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVtb3ZlKGNtZCwgMCk7CiAJCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZGV2X3F1ZXVlX29iai0+Y21kX3F1ZXVlX2xvY2ssIGZsYWdzKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kZXZfcXVldWVfb2JqLT5jbWRfcXVldWVfbG9jaywgZmxhZ3MpOwogfQogCiAvKgl0cmFuc3BvcnRfcHJvY2Vzc2luZ190aHJlYWQoKToKQEAgLTYwODMsMTYgKzUxMDUsMTUgQEAKICAqLwogc3RhdGljIGludCB0cmFuc3BvcnRfcHJvY2Vzc2luZ190aHJlYWQodm9pZCAqcGFyYW0pCiB7Ci0JaW50IHJldCwgdF9zdGF0ZTsKKwlpbnQgcmV0OwogCXN0cnVjdCBzZV9jbWQgKmNtZDsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSAoc3RydWN0IHNlX2RldmljZSAqKSBwYXJhbTsKLQlzdHJ1Y3Qgc2VfcXVldWVfcmVxICpxcjsKIAogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTIwKTsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPmRldl9xdWV1ZV9vYmotPnRocmVhZF93cSwKLQkJCQlhdG9taWNfcmVhZCgmZGV2LT5kZXZfcXVldWVfb2JqLT5xdWV1ZV9jbnQpIHx8CisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPmRldl9xdWV1ZV9vYmoudGhyZWFkX3dxLAorCQkJCWF0b21pY19yZWFkKCZkZXYtPmRldl9xdWV1ZV9vYmoucXVldWVfY250KSB8fAogCQkJCWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CkBAIC02MTA4LDIyICs1MTI5LDE4IEBACiBnZXRfY21kOgogCQlfX3RyYW5zcG9ydF9leGVjdXRlX3Rhc2tzKGRldik7CiAKLQkJcXIgPSB0cmFuc3BvcnRfZ2V0X3FyX2Zyb21fcXVldWUoZGV2LT5kZXZfcXVldWVfb2JqKTsKLQkJaWYgKCEocXIpKQorCQljbWQgPSB0cmFuc3BvcnRfZ2V0X2NtZF9mcm9tX3F1ZXVlKCZkZXYtPmRldl9xdWV1ZV9vYmopOworCQlpZiAoIWNtZCkKIAkJCWNvbnRpbnVlOwogCi0JCWNtZCA9IChzdHJ1Y3Qgc2VfY21kICopcXItPmNtZDsKLQkJdF9zdGF0ZSA9IHFyLT5zdGF0ZTsKLQkJa2ZyZWUocXIpOwotCi0JCXN3aXRjaCAodF9zdGF0ZSkgeworCQlzd2l0Y2ggKGNtZC0+dF9zdGF0ZSkgewogCQljYXNlIFRSQU5TUE9SVF9ORVdfQ01EX01BUDoKLQkJCWlmICghKENNRF9URk8oY21kKS0+bmV3X2NtZF9tYXApKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJDTURfVEZPKGNtZCktPm5ld19jbWRfbWFwIGlzIgorCQkJaWYgKCFjbWQtPnNlX3Rmby0+bmV3X2NtZF9tYXApIHsKKwkJCQlwcl9lcnIoImNtZC0+c2VfdGZvLT5uZXdfY21kX21hcCBpcyIKIAkJCQkJIiBOVUxMIGZvciBUUkFOU1BPUlRfTkVXX0NNRF9NQVBcbiIpOwogCQkJCUJVRygpOwogCQkJfQotCQkJcmV0ID0gQ01EX1RGTyhjbWQpLT5uZXdfY21kX21hcChjbWQpOworCQkJcmV0ID0gY21kLT5zZV90Zm8tPm5ld19jbWRfbWFwKGNtZCk7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCWNtZC0+dHJhbnNwb3J0X2Vycm9yX3N0YXR1cyA9IHJldDsKIAkJCQl0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoY21kLCBOVUxMLApAQCAtNjEzNCw3ICs1MTUxLDkgQEAKIAkJCS8qIEZhbGwgdGhyb3VnaCAqLwogCQljYXNlIFRSQU5TUE9SVF9ORVdfQ01EOgogCQkJcmV0ID0gdHJhbnNwb3J0X2dlbmVyaWNfbmV3X2NtZChjbWQpOwotCQkJaWYgKHJldCA8IDApIHsKKwkJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCQlicmVhazsKKwkJCWVsc2UgaWYgKHJldCA8IDApIHsKIAkJCQljbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMgPSByZXQ7CiAJCQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKGNtZCwgTlVMTCwKIAkJCQkJMCwgKGNtZC0+ZGF0YV9kaXJlY3Rpb24gIT0KQEAgLTYxNDksMTAgKzUxNjgsMTAgQEAKIAkJCXRyYW5zcG9ydF9nZW5lcmljX2NvbXBsZXRlX29rKGNtZCk7CiAJCQlicmVhazsKIAkJY2FzZSBUUkFOU1BPUlRfUkVNT1ZFOgotCQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVtb3ZlKGNtZCwgMSwgMCk7CisJCQl0cmFuc3BvcnRfZ2VuZXJpY19yZW1vdmUoY21kLCAwKTsKIAkJCWJyZWFrOwogCQljYXNlIFRSQU5TUE9SVF9GUkVFX0NNRF9JTlRSOgotCQkJdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoY21kLCAwLCAxLCAwKTsKKwkJCXRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKGNtZCwgMCwgMCk7CiAJCQlicmVhazsKIAkJY2FzZSBUUkFOU1BPUlRfUFJPQ0VTU19UTVI6CiAJCQl0cmFuc3BvcnRfZ2VuZXJpY19kb190bXIoY21kKTsKQEAgLTYxNjQsMTMgKzUxODMsMTYgQEAKIAkJCXRyYW5zcG9ydF9zdG9wX2FsbF90YXNrX3RpbWVycyhjbWQpOwogCQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF90aW1lb3V0KGNtZCk7CiAJCQlicmVhazsKKwkJY2FzZSBUUkFOU1BPUlRfQ09NUExFVEVfUUZfV1A6CisJCQl0cmFuc3BvcnRfZ2VuZXJpY193cml0ZV9wZW5kaW5nKGNtZCk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5rbm93biB0X3N0YXRlOiAlZCBkZWZlcnJlZF90X3N0YXRlOiIKKwkJCXByX2VycigiVW5rbm93biB0X3N0YXRlOiAlZCBkZWZlcnJlZF90X3N0YXRlOiIKIAkJCQkiICVkIGZvciBJVFQ6IDB4JTA4eCBpX3N0YXRlOiAlZCBvbiBTRSBMVU46IgotCQkJCSIgJXVcbiIsIHRfc3RhdGUsIGNtZC0+ZGVmZXJyZWRfdF9zdGF0ZSwKLQkJCQlDTURfVEZPKGNtZCktPmdldF90YXNrX3RhZyhjbWQpLAotCQkJCUNNRF9URk8oY21kKS0+Z2V0X2NtZF9zdGF0ZShjbWQpLAotCQkJCVNFX0xVTihjbWQpLT51bnBhY2tlZF9sdW4pOworCQkJCSIgJXVcbiIsIGNtZC0+dF9zdGF0ZSwgY21kLT5kZWZlcnJlZF90X3N0YXRlLAorCQkJCWNtZC0+c2VfdGZvLT5nZXRfdGFza190YWcoY21kKSwKKwkJCQljbWQtPnNlX3Rmby0+Z2V0X2NtZF9zdGF0ZShjbWQpLAorCQkJCWNtZC0+c2VfbHVuLT51bnBhY2tlZF9sdW4pOwogCQkJQlVHKCk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdWEuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3VhLmMKaW5kZXggZGYzNTUxNy4uMzFlM2M2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdWEuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV91YS5jCkBAIC00OSwxNSArNDksMTUgQEAKIAlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2VzcyA9IGNtZC0+c2Vfc2VzczsKIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKm5hY2w7CiAKLQlpZiAoIShzZXNzKSkKKwlpZiAoIXNlc3MpCiAJCXJldHVybiAwOwogCiAJbmFjbCA9IHNlc3MtPnNlX25vZGVfYWNsOwotCWlmICghKG5hY2wpKQorCWlmICghbmFjbCkKIAkJcmV0dXJuIDA7CiAKIAlkZXZlID0gJm5hY2wtPmRldmljZV9saXN0W2NtZC0+b3JpZ19mZV9sdW5dOwotCWlmICghKGF0b21pY19yZWFkKCZkZXZlLT51YV9jb3VudCkpKQorCWlmICghYXRvbWljX3JlYWQoJmRldmUtPnVhX2NvdW50KSkKIAkJcmV0dXJuIDA7CiAJLyoKIAkgKiBGcm9tIHNhbTRyMTQsIHNlY3Rpb24gNS4xNCBVbml0IGF0dGVudGlvbiBjb25kaXRpb246CkBAIC04MCwxMCArODAsMTAgQEAKIAljYXNlIFJFUVVFU1RfU0VOU0U6CiAJCXJldHVybiAwOwogCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIC0xOworCXJldHVybiAtRUlOVkFMOwogfQogCiBpbnQgY29yZV9zY3NpM191YV9hbGxvY2F0ZSgKQEAgLTk3LDEzICs5NywxMyBAQAogCS8qCiAJICogUEFTU1RIUk9VR0ggT1BTCiAJICovCi0JaWYgKCEobmFjbCkpCi0JCXJldHVybiAtMTsKKwlpZiAoIW5hY2wpCisJCXJldHVybiAtRUlOVkFMOwogCiAJdWEgPSBrbWVtX2NhY2hlX3phbGxvYyhzZV91YV9jYWNoZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCEodWEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBzZV91YVxuIik7Ci0JCXJldHVybiAtMTsKKwlpZiAoIXVhKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBzZV91YVxuIik7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAlJTklUX0xJU1RfSEVBRCgmdWEtPnVhX2Rldl9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmdWEtPnVhX25hY2xfbGlzdCk7CkBAIC0xNzcsOSArMTc3LDkgQEAKIAlzcGluX3VubG9jaygmZGV2ZS0+dWFfbG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxKCZuYWNsLT5kZXZpY2VfbGlzdF9sb2NrKTsKIAotCXByaW50ayhLRVJOX0lORk8gIlslc106IEFsbG9jYXRlZCBVTklUIEFUVEVOVElPTiwgbWFwcGVkIExVTjogJXUsIEFTQzoiCisJcHJfZGVidWcoIlslc106IEFsbG9jYXRlZCBVTklUIEFUVEVOVElPTiwgbWFwcGVkIExVTjogJXUsIEFTQzoiCiAJCSIgMHglMDJ4LCBBU0NROiAweCUwMnhcbiIsCi0JCVRQR19URk8obmFjbC0+c2VfdHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksIHVucGFja2VkX2x1biwKKwkJbmFjbC0+c2VfdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwgdW5wYWNrZWRfbHVuLAogCQlhc2MsIGFzY3EpOwogCiAJYXRvbWljX2luYygmZGV2ZS0+dWFfY291bnQpOwpAQCAtMjA4LDIzICsyMDgsMjMgQEAKIAl1OCAqYXNjLAogCXU4ICphc2NxKQogewotCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IFNFX0RFVihjbWQpOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXN0cnVjdCBzZV9kZXZfZW50cnkgKmRldmU7CiAJc3RydWN0IHNlX3Nlc3Npb24gKnNlc3MgPSBjbWQtPnNlX3Nlc3M7CiAJc3RydWN0IHNlX25vZGVfYWNsICpuYWNsOwogCXN0cnVjdCBzZV91YSAqdWEgPSBOVUxMLCAqdWFfcDsKIAlpbnQgaGVhZCA9IDE7CiAKLQlpZiAoIShzZXNzKSkKKwlpZiAoIXNlc3MpCiAJCXJldHVybjsKIAogCW5hY2wgPSBzZXNzLT5zZV9ub2RlX2FjbDsKLQlpZiAoIShuYWNsKSkKKwlpZiAoIW5hY2wpCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnEoJm5hY2wtPmRldmljZV9saXN0X2xvY2spOwogCWRldmUgPSAmbmFjbC0+ZGV2aWNlX2xpc3RbY21kLT5vcmlnX2ZlX2x1bl07Ci0JaWYgKCEoYXRvbWljX3JlYWQoJmRldmUtPnVhX2NvdW50KSkpIHsKKwlpZiAoIWF0b21pY19yZWFkKCZkZXZlLT51YV9jb3VudCkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxKCZuYWNsLT5kZXZpY2VfbGlzdF9sb2NrKTsKIAkJcmV0dXJuOwogCX0KQEAgLTI0MCw3ICsyNDAsNyBAQAogCQkgKiBoaWdoZXN0IHByaW9yaXR5IFVOSVRfQVRURU5USU9OIGFuZCBBU0MvQVNDUSB3aXRob3V0CiAJCSAqIGNsZWFyaW5nIGl0LgogCQkgKi8KLQkJaWYgKERFVl9BVFRSSUIoZGV2KS0+ZW11bGF0ZV91YV9pbnRsY2tfY3RybCAhPSAwKSB7CisJCWlmIChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV91YV9pbnRsY2tfY3RybCAhPSAwKSB7CiAJCQkqYXNjID0gdWEtPnVhX2FzYzsKIAkJCSphc2NxID0gdWEtPnVhX2FzY3E7CiAJCQlicmVhazsKQEAgLTI2NCwxMyArMjY0LDEzIEBACiAJc3Bpbl91bmxvY2soJmRldmUtPnVhX2xvY2spOwogCXNwaW5fdW5sb2NrX2lycSgmbmFjbC0+ZGV2aWNlX2xpc3RfbG9jayk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJbJXNdOiAlcyBVTklUIEFUVEVOVElPTiBjb25kaXRpb24gd2l0aCIKKwlwcl9kZWJ1ZygiWyVzXTogJXMgVU5JVCBBVFRFTlRJT04gY29uZGl0aW9uIHdpdGgiCiAJCSIgSU5UTENLX0NUUkw6ICVkLCBtYXBwZWQgTFVOOiAldSwgZ290IENEQjogMHglMDJ4IgogCQkiIHJlcG9ydGVkIEFTQzogMHglMDJ4LCBBU0NROiAweCUwMnhcbiIsCi0JCVRQR19URk8obmFjbC0+c2VfdHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksCi0JCShERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdWFfaW50bGNrX2N0cmwgIT0gMCkgPyAiUmVwb3J0aW5nIiA6Ci0JCSJSZWxlYXNpbmciLCBERVZfQVRUUklCKGRldiktPmVtdWxhdGVfdWFfaW50bGNrX2N0cmwsCi0JCWNtZC0+b3JpZ19mZV9sdW4sIFRfVEFTSyhjbWQpLT50X3Rhc2tfY2RiWzBdLCAqYXNjLCAqYXNjcSk7CisJCW5hY2wtPnNlX3RwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCShkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV91YV9pbnRsY2tfY3RybCAhPSAwKSA/ICJSZXBvcnRpbmciIDoKKwkJIlJlbGVhc2luZyIsIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3VhX2ludGxja19jdHJsLAorCQljbWQtPm9yaWdfZmVfbHVuLCBjbWQtPnRfdGFza19jZGJbMF0sICphc2MsICphc2NxKTsKIH0KIAogaW50IGNvcmVfc2NzaTNfdWFfY2xlYXJfZm9yX3JlcXVlc3Rfc2Vuc2UoCkBAIC0yODQsMTggKzI4NCwxOCBAQAogCXN0cnVjdCBzZV91YSAqdWEgPSBOVUxMLCAqdWFfcDsKIAlpbnQgaGVhZCA9IDE7CiAKLQlpZiAoIShzZXNzKSkKLQkJcmV0dXJuIC0xOworCWlmICghc2VzcykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAluYWNsID0gc2Vzcy0+c2Vfbm9kZV9hY2w7Ci0JaWYgKCEobmFjbCkpCi0JCXJldHVybiAtMTsKKwlpZiAoIW5hY2wpCisJCXJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrX2lycSgmbmFjbC0+ZGV2aWNlX2xpc3RfbG9jayk7CiAJZGV2ZSA9ICZuYWNsLT5kZXZpY2VfbGlzdFtjbWQtPm9yaWdfZmVfbHVuXTsKLQlpZiAoIShhdG9taWNfcmVhZCgmZGV2ZS0+dWFfY291bnQpKSkgeworCWlmICghYXRvbWljX3JlYWQoJmRldmUtPnVhX2NvdW50KSkgewogCQlzcGluX3VubG9ja19pcnEoJm5hY2wtPmRldmljZV9saXN0X2xvY2spOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRVBFUk07CiAJfQogCS8qCiAJICogVGhlIGhpZ2hlc3QgcHJpb3JpdHkgVW5pdCBBdHRlbnRpb25zIGFyZSBwbGFjZWQgYXQgdGhlIGhlYWQgb2YgdGhlCkBAIC0zMjMsMTAgKzMyMywxMCBAQAogCXNwaW5fdW5sb2NrKCZkZXZlLT51YV9sb2NrKTsKIAlzcGluX3VubG9ja19pcnEoJm5hY2wtPmRldmljZV9saXN0X2xvY2spOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiWyVzXTogUmVsZWFzZWQgVU5JVCBBVFRFTlRJT04gY29uZGl0aW9uLCBtYXBwZWQiCisJcHJfZGVidWcoIlslc106IFJlbGVhc2VkIFVOSVQgQVRURU5USU9OIGNvbmRpdGlvbiwgbWFwcGVkIgogCQkiIExVTjogJXUsIGdvdCBSRVFVRVNUX1NFTlNFIHJlcG9ydGVkIEFTQzogMHglMDJ4LCIKLQkJIiBBU0NROiAweCUwMnhcbiIsIFRQR19URk8obmFjbC0+c2VfdHBnKS0+Z2V0X2ZhYnJpY19uYW1lKCksCisJCSIgQVNDUTogMHglMDJ4XG4iLCBuYWNsLT5zZV90cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAogCQljbWQtPm9yaWdfZmVfbHVuLCAqYXNjLCAqYXNjcSk7CiAKLQlyZXR1cm4gKGhlYWQpID8gLTEgOiAwOworCXJldHVybiAoaGVhZCkgPyAtRVBFUk0gOiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL01ha2VmaWxlIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL01ha2VmaWxlCmluZGV4IDdhNWMyYjYuLjIwYjE0YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvTWFrZWZpbGUKQEAgLTEsMTUgKzEsNiBAQAotRVhUUkFfQ0ZMQUdTICs9IC1JJChzcmN0cmVlKS9kcml2ZXJzL3RhcmdldC8gXAotCQktSSQoc3JjdHJlZSkvZHJpdmVycy9zY3NpLyBcCi0JCS1JJChzcmN0cmVlKS9pbmNsdWRlL3Njc2kvIFwKLQkJLUkkKHNyY3RyZWUpL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy8KLQotdGNtX2ZjLXkgKz0JdGZjX2NtZC5vIFwKLQkJdGZjX2NvbmYubyBcCi0JCXRmY19pby5vIFwKLQkJdGZjX3Nlc3MubwordGNtX2ZjLXkgKz0JCXRmY19jbWQubyBcCisJCQl0ZmNfY29uZi5vIFwKKwkJCXRmY19pby5vIFwKKwkJCXRmY19zZXNzLm8KIAogb2JqLSQoQ09ORklHX1RDTV9GQykJKz0gdGNtX2ZjLm8KLQotaWZkZWYgQ09ORklHRlNfVENNX0ZDX0RFQlVHCi1FWFRSQV9DRkxBR1MJKz0gLURUQ01fRkNfREVCVUcKLWVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGNtX2ZjLmggYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGNtX2ZjLmgKaW5kZXggZGVmZmYzMi4uZjdmZmY3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RjbV9mYy5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90Y21fZmMuaApAQCAtMjMsMzAgKzIzLDYgQEAKICNkZWZpbmUgRlRfVFBHX05BTUVMRU4gMzIJLyogbWF4IGxlbmd0aCBvZiBUUEcgbmFtZSAqLwogI2RlZmluZSBGVF9MVU5fTkFNRUxFTiAzMgkvKiBtYXggbGVuZ3RoIG9mIExVTiBuYW1lICovCiAKLS8qCi0gKiBEZWJ1ZyBvcHRpb25zLgotICovCi0jZGVmaW5lIEZUX0RFQlVHX0NPTkYJMHgwMQkvKiBjb25maWd1cmF0aW9uIG1lc3NhZ2VzICovCi0jZGVmaW5lCUZUX0RFQlVHX1NFU1MJMHgwMgkvKiBzZXNzaW9uIG1lc3NhZ2VzICovCi0jZGVmaW5lCUZUX0RFQlVHX1RNCTB4MDQJLyogVE0gb3BlcmF0aW9ucyAqLwotI2RlZmluZQlGVF9ERUJVR19JTwkweDA4CS8qIEkvTyBjb21tYW5kcyAqLwotI2RlZmluZQlGVF9ERUJVR19EQVRBCTB4MTAJLyogRGF0YSB0cmFuc2ZlciAqLwotCi1leHRlcm4gdW5zaWduZWQgaW50IGZ0X2RlYnVnX2xvZ2dpbmc7CS8qIGRlYnVnIG9wdGlvbnMgKi8KLQotI2RlZmluZSBGVF9ERUJVRyhtYXNrLCBmbXQsIGFyZ3MuLi4pCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoZnRfZGVidWdfbG9nZ2luZyAmIChtYXNrKSkJCQkJXAotCQkJcHJpbnRrKEtFUk5fSU5GTyAidGNtX2ZjOiAlczogIiBmbXQsCQlcCi0JCQkJX19mdW5jX18sICMjYXJncyk7CQkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUJRlRfQ09ORl9EQkcoZm10LCBhcmdzLi4uKQlGVF9ERUJVRyhGVF9ERUJVR19DT05GLCBmbXQsICMjYXJncykKLSNkZWZpbmUJRlRfU0VTU19EQkcoZm10LCBhcmdzLi4uKQlGVF9ERUJVRyhGVF9ERUJVR19TRVNTLCBmbXQsICMjYXJncykKLSNkZWZpbmUJRlRfVE1fREJHKGZtdCwgYXJncy4uLikJCUZUX0RFQlVHKEZUX0RFQlVHX1RNLCBmbXQsICMjYXJncykKLSNkZWZpbmUJRlRfSU9fREJHKGZtdCwgYXJncy4uLikJCUZUX0RFQlVHKEZUX0RFQlVHX0lPLCBmbXQsICMjYXJncykKLSNkZWZpbmUJRlRfREFUQV9EQkcoZm10LCBhcmdzLi4uKQlGVF9ERUJVRyhGVF9ERUJVR19EQVRBLCBmbXQsICMjYXJncykKLQogc3RydWN0IGZ0X3RyYW5zcG9ydF9pZCB7CiAJX191OAlmb3JtYXQ7CiAJX191OAlfX3Jlc3ZkMVs3XTsKQEAgLTE0NCw3ICsxMjAsNyBAQAogICovCiBzdHJ1Y3QgZnRfY21kIHsKIAllbnVtIGZ0X2NtZF9zdGF0ZSBzdGF0ZTsKLQl1MTYgbHVuOwkJCS8qIExVTiBmcm9tIHJlcXVlc3QgKi8KKwl1MzIgbHVuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExVTiBmcm9tIHJlcXVlc3QgKi8KIAlzdHJ1Y3QgZnRfc2VzcyAqc2VzczsJCS8qIHNlc3Npb24gaGVsZCBmb3IgY21kICovCiAJc3RydWN0IGZjX3NlcSAqc2VxOwkJLyogc2VxdWVuY2UgaW4gZXhjaGFuZ2UgbWdyICovCiAJc3RydWN0IHNlX2NtZCBzZV9jbWQ7CQkvKiBMb2NhbCBUQ00gSS9PIGRlc2NyaXB0b3IgKi8KQEAgLTE5NSw3ICsxNzEsNiBAQAogaW50IGZ0X3dyaXRlX3BlbmRpbmdfc3RhdHVzKHN0cnVjdCBzZV9jbWQgKik7CiB1MzIgZnRfZ2V0X3Rhc2tfdGFnKHN0cnVjdCBzZV9jbWQgKik7CiBpbnQgZnRfZ2V0X2NtZF9zdGF0ZShzdHJ1Y3Qgc2VfY21kICopOwotdm9pZCBmdF9uZXdfY21kX2ZhaWx1cmUoc3RydWN0IHNlX2NtZCAqKTsKIGludCBmdF9xdWV1ZV90bV9yZXNwKHN0cnVjdCBzZV9jbWQgKik7CiBpbnQgZnRfaXNfc3RhdGVfcmVtb3ZlKHN0cnVjdCBzZV9jbWQgKik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCmluZGV4IGMwNTZhMTEuLjA5ZGYzOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYwpAQCAtNDUsNyArNDUsNiBAQAogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaD4KICNpbmNsdWRlIDx0YXJnZXQvdGFyZ2V0X2NvcmVfdHBnLmg+CiAjaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX2NvbmZpZ2ZzLmg+Ci0jaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX2Jhc2UuaD4KICNpbmNsdWRlIDx0YXJnZXQvdGFyZ2V0X2NvcmVfdG1yLmg+CiAjaW5jbHVkZSA8dGFyZ2V0L2NvbmZpZ2ZzX21hY3Jvcy5oPgogCkBAIC01OSwzMyArNTgsMzAgQEAKIAlzdHJ1Y3QgZmNfZXhjaCAqZXA7CiAJc3RydWN0IGZjX3NlcSAqc3A7CiAJc3RydWN0IHNlX2NtZCAqc2VfY21kOwotCXN0cnVjdCBzZV9tZW0gKm1lbTsKLQlzdHJ1Y3Qgc2VfdHJhbnNwb3J0X3Rhc2sgKnRhc2s7Ci0KLQlpZiAoIShmdF9kZWJ1Z19sb2dnaW5nICYgRlRfREVCVUdfSU8pKQotCQlyZXR1cm47CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgY291bnQ7CiAKIAlzZV9jbWQgPSAmY21kLT5zZV9jbWQ7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNtZCAlcCBzdGF0ZSAlZCBzZXNzICVwIHNlcSAlcCBzZV9jbWQgJXBcbiIsCisJcHJfZGVidWcoIiVzOiBjbWQgJXAgc3RhdGUgJWQgc2VzcyAlcCBzZXEgJXAgc2VfY21kICVwXG4iLAogCQljYWxsZXIsIGNtZCwgY21kLT5zdGF0ZSwgY21kLT5zZXNzLCBjbWQtPnNlcSwgc2VfY21kKTsKLQlwcmludGsoS0VSTl9JTkZPICIlczogY21kICVwIGNkYiAlcFxuIiwKKwlwcl9kZWJ1ZygiJXM6IGNtZCAlcCBjZGIgJXBcbiIsCiAJCWNhbGxlciwgY21kLCBjbWQtPmNkYik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNtZCAlcCBsdW4gJWRcbiIsIGNhbGxlciwgY21kLCBjbWQtPmx1bik7CisJcHJfZGVidWcoIiVzOiBjbWQgJXAgbHVuICVkXG4iLCBjYWxsZXIsIGNtZCwgY21kLT5sdW4pOwogCi0JdGFzayA9IFRfVEFTSyhzZV9jbWQpOwotCXByaW50ayhLRVJOX0lORk8gIiVzOiBjbWQgJXAgdGFzayAlcCBzZV9udW0gJXUgYnVmICVwIGxlbiAldSBzZV9jbWRfZmxhZ3MgPDB4JXg+XG4iLAotCSAgICAgICBjYWxsZXIsIGNtZCwgdGFzaywgdGFzay0+dF90YXNrc19zZV9udW0sCi0JICAgICAgIHRhc2stPnRfdGFza19idWYsIHNlX2NtZC0+ZGF0YV9sZW5ndGgsIHNlX2NtZC0+c2VfY21kX2ZsYWdzKTsKLQlpZiAodGFzay0+dF9tZW1fbGlzdCkKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShtZW0sIHRhc2stPnRfbWVtX2xpc3QsIHNlX2xpc3QpCi0JCQlwcmludGsoS0VSTl9JTkZPICIlczogY21kICVwIG1lbSAlcCBwYWdlICVwICIKLQkJCSAgICAgICAibGVuIDB4JXggb2ZmIDB4JXhcbiIsCi0JCQkgICAgICAgY2FsbGVyLCBjbWQsIG1lbSwKLQkJCSAgICAgICBtZW0tPnNlX3BhZ2UsIG1lbS0+c2VfbGVuLCBtZW0tPnNlX29mZik7CisJcHJfZGVidWcoIiVzOiBjbWQgJXAgZGF0YV9uZW50cyAldSBsZW4gJXUgc2VfY21kX2ZsYWdzIDwweCV4PlxuIiwKKwkJY2FsbGVyLCBjbWQsIHNlX2NtZC0+dF9kYXRhX25lbnRzLAorCSAgICAgICBzZV9jbWQtPmRhdGFfbGVuZ3RoLCBzZV9jbWQtPnNlX2NtZF9mbGFncyk7CisKKwlmb3JfZWFjaF9zZyhzZV9jbWQtPnRfZGF0YV9zZywgc2csIHNlX2NtZC0+dF9kYXRhX25lbnRzLCBjb3VudCkKKwkJcHJfZGVidWcoIiVzOiBjbWQgJXAgc2cgJXAgcGFnZSAlcCAiCisJCQkibGVuIDB4JXggb2ZmIDB4JXhcbiIsCisJCQljYWxsZXIsIGNtZCwgc2csCisJCQlzZ19wYWdlKHNnKSwgc2ctPmxlbmd0aCwgc2ctPm9mZnNldCk7CisKIAlzcCA9IGNtZC0+c2VxOwogCWlmIChzcCkgewogCQllcCA9IGZjX3NlcV9leGNoKHNwKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNtZCAlcCBzaWQgJXggZGlkICV4ICIKKwkJcHJfZGVidWcoIiVzOiBjbWQgJXAgc2lkICV4IGRpZCAleCAiCiAJCQkib3hfaWQgJXggcnhfaWQgJXggc2VxX2lkICV4IGVfc3RhdCAleFxuIiwKIAkJCWNhbGxlciwgY21kLCBlcC0+c2lkLCBlcC0+ZGlkLCBlcC0+b3hpZCwgZXAtPnJ4aWQsCiAJCQlzcC0+aWQsIGVwLT5lc2Jfc3RhdCk7CkBAIC05NCw0MCArOTAsMTkgQEAKIAkJMTYsIDQsIGNtZC0+Y2RiLCBNQVhfQ09NTUFORF9TSVpFLCAwKTsKIH0KIAotLyoKLSAqIEdldCBMVU4gZnJvbSBDREIuCi0gKi8KLXN0YXRpYyBpbnQgZnRfZ2V0X2x1bl9mb3JfY21kKHN0cnVjdCBmdF9jbWQgKmNtZCwgdTggKmx1bnApCi17Ci0JdTY0IGx1bjsKLQotCWx1biA9IGx1bnBbMV07Ci0Jc3dpdGNoIChsdW5wWzBdID4+IDYpIHsKLQljYXNlIDA6Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJbHVuIHw9IChsdW5wWzBdICYgMHgzZikgPDwgODsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAobHVuID49IFRSQU5TUE9SVF9NQVhfTFVOU19QRVJfVFBHKQotCQlyZXR1cm4gLTE7Ci0JY21kLT5sdW4gPSBsdW47Ci0JcmV0dXJuIHRyYW5zcG9ydF9nZXRfbHVuX2Zvcl9jbWQoJmNtZC0+c2VfY21kLCBOVUxMLCBsdW4pOwotfQotCiBzdGF0aWMgdm9pZCBmdF9xdWV1ZV9jbWQoc3RydWN0IGZ0X3Nlc3MgKnNlc3MsIHN0cnVjdCBmdF9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3Qgc2VfcXVldWVfb2JqICpxb2JqOworCXN0cnVjdCBmdF90cGcgKnRwZyA9IHNlc3MtPnRwb3J0LT50cGc7CisJc3RydWN0IHNlX3F1ZXVlX29iaiAqcW9iaiA9ICZ0cGctPnFvYmo7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXFvYmogPSAmc2Vzcy0+dHBvcnQtPnRwZy0+cW9iajsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcW9iai0+Y21kX3F1ZXVlX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZF90YWlsKCZjbWQtPnNlX3JlcS5xcl9saXN0LCAmcW9iai0+cW9ial9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxb2JqLT5jbWRfcXVldWVfbG9jaywgZmxhZ3MpOwogCWF0b21pY19pbmMoJnFvYmotPnF1ZXVlX2NudCk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxb2JqLT50aHJlYWRfd3EpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFvYmotPmNtZF9xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwX3Byb2Nlc3ModHBnLT50aHJlYWQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZ0X2NtZCAqZnRfZGVxdWV1ZV9jbWQoc3RydWN0IHNlX3F1ZXVlX29iaiAqcW9iaikKQEAgLTE3Miw3ICsxNDcsNyBAQAogCiB2b2lkIGZ0X2NoZWNrX3N0b3BfZnJlZShzdHJ1Y3Qgc2VfY21kICpzZV9jbWQpCiB7Ci0JdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoc2VfY21kLCAwLCAxLCAwKTsKKwl0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZChzZV9jbWQsIDAsIDApOwogfQogCiAvKgpAQCAtMjc5LDE4ICsyNTQsMTggQEAKIAkJICAgIChmaC0+Zmhfcl9jdGwgPT0gRkNfUkNUTF9ERF9EQVRBX0RFU0MpKSB7CiAJCQlpZiAoc2VfY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQikgewogCQkJCS8qCi0JCQkJICogTWFwIHNlX21lbSBsaXN0IHRvIHNjYXR0ZXJsaXN0LCBzbyB0aGF0Ci0JCQkJICogRERQIGNhbiBiZSBzZXR1cC4gRERQIHNldHVwIGZ1bmN0aW9uIHJlcXVpcmUKLQkJCQkgKiBzY2F0dGVybGlzdC4gc2VfbWVtX2xpc3QgaXMgaW50ZXJuYWwgdG8KLQkJCQkgKiBUQ00vTElPIHRhcmdldAorCQkJCSAqIGNtZCBtYXkgaGF2ZSBiZWVuIGJyb2tlbiB1cCBpbnRvIG11bHRpcGxlCisJCQkJICogdGFza3MuIExpbmsgdGhlaXIgc2dzIHRvZ2V0aGVyIHNvIHdlIGNhbgorCQkJCSAqIG9wZXJhdGUgb24gdGhlbSBhbGwgYXQgb25jZS4KIAkJCQkgKi8KIAkJCQl0cmFuc3BvcnRfZG9fdGFza19zZ19jaGFpbihzZV9jbWQpOwotCQkJCWNtZC0+c2cgPSBUX1RBU0soc2VfY21kKS0+dF90YXNrc19zZ19jaGFpbmVkOworCQkJCWNtZC0+c2cgPSBzZV9jbWQtPnRfdGFza3Nfc2dfY2hhaW5lZDsKIAkJCQljbWQtPnNnX2NudCA9Ci0JCQkJCVRfVEFTSyhzZV9jbWQpLT50X3Rhc2tzX3NnX2NoYWluZWRfbm87CisJCQkJCXNlX2NtZC0+dF90YXNrc19zZ19jaGFpbmVkX25vOwogCQkJfQotCQkJaWYgKGNtZC0+c2cgJiYgbHBvcnQtPnR0LmRkcF9zZXR1cChscG9ydCwgZXAtPnhpZCwKLQkJCQkJCSAgICBjbWQtPnNnLCBjbWQtPnNnX2NudCkpCisJCQlpZiAoY21kLT5zZyAmJiBscG9ydC0+dHQuZGRwX3RhcmdldChscG9ydCwgZXAtPnhpZCwKKwkJCQkJCQkgICAgY21kLT5zZywKKwkJCQkJCQkgICAgY21kLT5zZ19jbnQpKQogCQkJCWNtZC0+d2FzX2RkcF9zZXR1cCA9IDE7CiAJCX0KIAl9CkBAIC0zMTcsMTIgKzI5Miw2IEBACiAJcmV0dXJuIDA7CS8qIFhYWCBUQkQgKi8KIH0KIAotdm9pZCBmdF9uZXdfY21kX2ZhaWx1cmUoc3RydWN0IHNlX2NtZCAqc2VfY21kKQotewotCS8qIFhYWCBUQkQgKi8KLQlwcmludGsoS0VSTl9JTkZPICIlczogc2VfY21kICVwXG4iLCBfX2Z1bmNfXywgc2VfY21kKTsKLX0KLQogLyoKICAqIEZDIHNlcXVlbmNlIHJlc3BvbnNlIGhhbmRsZXIgZm9yIGZvbGxvdy1vbiBzZXF1ZW5jZXMgKGRhdGEpIGFuZCBhYm9ydHMuCiAgKi8KQEAgLTMzNSw3ICszMDQsNyBAQAogCQkvKiBYWFggbmVlZCB0byBmaW5kIGNtZCBpZiBxdWV1ZWQgKi8KIAkJY21kLT5zZV9jbWQudF9zdGF0ZSA9IFRSQU5TUE9SVF9SRU1PVkU7CiAJCWNtZC0+c2VxID0gTlVMTDsKLQkJdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoJmNtZC0+c2VfY21kLCAwLCAxLCAwKTsKKwkJdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoJmNtZC0+c2VfY21kLCAwLCAwKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzQ5LDEwICszMTgsMTAgQEAKIAljYXNlIEZDX1JDVExfRERfU09MX0NUTDoJLyogdHJhbnNmZXIgcmVhZHkgKi8KIAljYXNlIEZDX1JDVExfRERfREFUQV9ERVNDOgkvKiB0cmFuc2ZlciByZWFkeSAqLwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiB1bmhhbmRsZWQgZnJhbWUgcl9jdGwgJXhcbiIsCisJCXByX2RlYnVnKCIlczogdW5oYW5kbGVkIGZyYW1lIHJfY3RsICV4XG4iLAogCQkgICAgICAgX19mdW5jX18sIGZoLT5maF9yX2N0bCk7CiAJCWZjX2ZyYW1lX2ZyZWUoZnApOwotCQl0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZCgmY21kLT5zZV9jbWQsIDAsIDEsIDApOworCQl0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZCgmY21kLT5zZV9jbWQsIDAsIDApOwogCQlicmVhazsKIAl9CiB9CkBAIC0zNzQsNyArMzQzLDcgQEAKIAlzdHJ1Y3QgZmNwX3Jlc3BfcnNwX2luZm8gKmluZm87CiAKIAlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQocnhfZnApOwotCUZUX0lPX0RCRygiRkNQIGVycm9yIHJlc3BvbnNlOiBkaWQgJXggb3hpZCAleCBzdGF0dXMgJXggY29kZSAleFxuIiwKKwlwcl9kZWJ1ZygiRkNQIGVycm9yIHJlc3BvbnNlOiBkaWQgJXggb3hpZCAleCBzdGF0dXMgJXggY29kZSAleFxuIiwKIAkJICBudG9oMjQoZmgtPmZoX3NfaWQpLCBudG9ocyhmaC0+Zmhfb3hfaWQpLCBzdGF0dXMsIGNvZGUpOwogCWxlbiA9IHNpemVvZigqZmNwKTsKIAlpZiAoc3RhdHVzID09IFNBTV9TVEFUX0dPT0QpCkBAIC00MDIsMTIgKzM3MSwyMyBAQAogCiAvKgogICogU2VuZCBlcnJvciBvciB0YXNrIG1hbmFnZW1lbnQgcmVzcG9uc2UuCi0gKiBBbHdheXMgZnJlZXMgdGhlIGNtZCBhbmQgYXNzb2NpYXRlZCBzdGF0ZS4KICAqLwotc3RhdGljIHZvaWQgZnRfc2VuZF9yZXNwX2NvZGUoc3RydWN0IGZ0X2NtZCAqY21kLCBlbnVtIGZjcF9yZXNwX3JzcF9jb2RlcyBjb2RlKQorc3RhdGljIHZvaWQgZnRfc2VuZF9yZXNwX2NvZGUoc3RydWN0IGZ0X2NtZCAqY21kLAorCQkJICAgICAgZW51bSBmY3BfcmVzcF9yc3BfY29kZXMgY29kZSkKIHsKIAlmdF9zZW5kX3Jlc3Bfc3RhdHVzKGNtZC0+c2Vzcy0+dHBvcnQtPmxwb3J0LAogCQkJICAgIGNtZC0+cmVxX2ZyYW1lLCBTQU1fU1RBVF9HT09ELCBjb2RlKTsKK30KKworCisvKgorICogU2VuZCBlcnJvciBvciB0YXNrIG1hbmFnZW1lbnQgcmVzcG9uc2UuCisgKiBBbHdheXMgZnJlZXMgdGhlIGNtZCBhbmQgYXNzb2NpYXRlZCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgZnRfc2VuZF9yZXNwX2NvZGVfYW5kX2ZyZWUoc3RydWN0IGZ0X2NtZCAqY21kLAorCQkJCSAgICAgIGVudW0gZmNwX3Jlc3BfcnNwX2NvZGVzIGNvZGUpCit7CisJZnRfc2VuZF9yZXNwX2NvZGUoY21kLCBjb2RlKTsKIAlmdF9mcmVlX2NtZChjbWQpOwogfQogCkBAIC00MTgsNiArMzk4LDcgQEAKIHsKIAlzdHJ1Y3Qgc2VfdG1yX3JlcSAqdG1yOwogCXN0cnVjdCBmY3BfY21uZCAqZmNwOworCXN0cnVjdCBmdF9zZXNzICpzZXNzOwogCXU4IHRtX2Z1bmM7CiAKIAlmY3AgPSBmY19mcmFtZV9wYXlsb2FkX2dldChjbWQtPnJlcV9mcmFtZSwgc2l6ZW9mKCpmY3ApKTsKQEAgLTQyNSwxMyArNDA2LDYgQEAKIAlzd2l0Y2ggKGZjcC0+ZmNfdG1fZmxhZ3MpIHsKIAljYXNlIEZDUF9UTUZfTFVOX1JFU0VUOgogCQl0bV9mdW5jID0gVE1SX0xVTl9SRVNFVDsKLQkJaWYgKGZ0X2dldF9sdW5fZm9yX2NtZChjbWQsIGZjcC0+ZmNfbHVuKSA8IDApIHsKLQkJCWZ0X2R1bXBfY21kKGNtZCwgX19mdW5jX18pOwotCQkJdHJhbnNwb3J0X3NlbmRfY2hlY2tfY29uZGl0aW9uX2FuZF9zZW5zZSgmY21kLT5zZV9jbWQsCi0JCQkJY21kLT5zZV9jbWQuc2NzaV9zZW5zZV9yZWFzb24sIDApOwotCQkJZnRfc2Vzc19wdXQoY21kLT5zZXNzKTsKLQkJCXJldHVybjsKLQkJfQogCQlicmVhazsKIAljYXNlIEZDUF9UTUZfVEdUX1JFU0VUOgogCQl0bV9mdW5jID0gVE1SX1RBUkdFVF9XQVJNX1JFU0VUOwpAQCAtNDUwLDE5ICs0MjQsNDkgQEAKIAkJICogRkNQNHIwMSBpbmRpY2F0ZXMgaGF2aW5nIGEgY29tYmluYXRpb24gb2YKIAkJICogdG1fZmxhZ3Mgc2V0IGlzIGludmFsaWQuCiAJCSAqLwotCQlGVF9UTV9EQkcoImludmFsaWQgRkNQIHRtX2ZsYWdzICV4XG4iLCBmY3AtPmZjX3RtX2ZsYWdzKTsKLQkJZnRfc2VuZF9yZXNwX2NvZGUoY21kLCBGQ1BfQ01ORF9GSUVMRFNfSU5WQUxJRCk7CisJCXByX2RlYnVnKCJpbnZhbGlkIEZDUCB0bV9mbGFncyAleFxuIiwgZmNwLT5mY190bV9mbGFncyk7CisJCWZ0X3NlbmRfcmVzcF9jb2RlX2FuZF9mcmVlKGNtZCwgRkNQX0NNTkRfRklFTERTX0lOVkFMSUQpOwogCQlyZXR1cm47CiAJfQogCi0JRlRfVE1fREJHKCJhbGxvYyB0bSBjbWQgZm4gJWRcbiIsIHRtX2Z1bmMpOworCXByX2RlYnVnKCJhbGxvYyB0bSBjbWQgZm4gJWRcbiIsIHRtX2Z1bmMpOwogCXRtciA9IGNvcmVfdG1yX2FsbG9jX3JlcSgmY21kLT5zZV9jbWQsIGNtZCwgdG1fZnVuYyk7CiAJaWYgKCF0bXIpIHsKLQkJRlRfVE1fREJHKCJhbGxvYyBmYWlsZWRcbiIpOwotCQlmdF9zZW5kX3Jlc3BfY29kZShjbWQsIEZDUF9UTUZfRkFJTEVEKTsKKwkJcHJfZGVidWcoImFsbG9jIGZhaWxlZFxuIik7CisJCWZ0X3NlbmRfcmVzcF9jb2RlX2FuZF9mcmVlKGNtZCwgRkNQX1RNRl9GQUlMRUQpOwogCQlyZXR1cm47CiAJfQogCWNtZC0+c2VfY21kLnNlX3Rtcl9yZXEgPSB0bXI7CisKKwlzd2l0Y2ggKGZjcC0+ZmNfdG1fZmxhZ3MpIHsKKwljYXNlIEZDUF9UTUZfTFVOX1JFU0VUOgorCQljbWQtPmx1biA9IHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKilmY3AtPmZjX2x1bik7CisJCWlmICh0cmFuc3BvcnRfbG9va3VwX3Rtcl9sdW4oJmNtZC0+c2VfY21kLCBjbWQtPmx1bikgPCAwKSB7CisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRvIGNsZWFuIHVwIG5ld2x5IGFsbG9jYXRlZCBUTVIgcmVxdWVzdAorCQkJICogc2luY2UgInVuYWJsZSB0byAgaGFuZGxlIFRNUiByZXF1ZXN0IGJlY2F1c2UgZmFpbGVkCisJCQkgKiB0byBnZXQgdG8gTFVOIgorCQkJICovCisJCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIGdldCBMVU4gZm9yIFRNUiBmdW5jICVkLCAiCisJCQkJICAic2VfY21kICVwLCB1bnBhY2tlZF9sdW4gJWRcbiIsCisJCQkJICB0bV9mdW5jLCAmY21kLT5zZV9jbWQsIGNtZC0+bHVuKTsKKwkJCWZ0X2R1bXBfY21kKGNtZCwgX19mdW5jX18pOworCQkJc2VzcyA9IGNtZC0+c2VzczsKKwkJCXRyYW5zcG9ydF9zZW5kX2NoZWNrX2NvbmRpdGlvbl9hbmRfc2Vuc2UoJmNtZC0+c2VfY21kLAorCQkJCWNtZC0+c2VfY21kLnNjc2lfc2Vuc2VfcmVhc29uLCAwKTsKKwkJCXRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKCZjbWQtPnNlX2NtZCwgMCwgMCk7CisJCQlmdF9zZXNzX3B1dChzZXNzKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwljYXNlIEZDUF9UTUZfVEdUX1JFU0VUOgorCWNhc2UgRkNQX1RNRl9DTFJfVEFTS19TRVQ6CisJY2FzZSBGQ1BfVE1GX0FCVF9UQVNLX1NFVDoKKwljYXNlIEZDUF9UTUZfQ0xSX0FDQToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KIAl0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfdG1yKCZjbWQtPnNlX2NtZCk7CiB9CiAKQEAgLTQ5NCw3ICs0OTgsNyBAQAogCQljb2RlID0gRkNQX1RNRl9GQUlMRUQ7CiAJCWJyZWFrOwogCX0KLQlGVF9UTV9EQkcoInRtciBmbiAlZCByZXNwICVkIGZjcCBjb2RlICVkXG4iLAorCXByX2RlYnVnKCJ0bXIgZm4gJWQgcmVzcCAlZCBmY3AgY29kZSAlZFxuIiwKIAkJICB0bXItPmZ1bmN0aW9uLCB0bXItPnJlc3BvbnNlLCBjb2RlKTsKIAlmdF9zZW5kX3Jlc3BfY29kZShjbWQsIGNvZGUpOwogCXJldHVybiAwOwpAQCAtNTIyLDcgKzUyNiw3IEBACiAJcmV0dXJuOwogCiBidXN5OgotCUZUX0lPX0RCRygiY21kIG9yIHNlcSBhbGxvY2F0aW9uIGZhaWx1cmUgLSBzZW5kaW5nIEJVU1lcbiIpOworCXByX2RlYnVnKCJjbWQgb3Igc2VxIGFsbG9jYXRpb24gZmFpbHVyZSAtIHNlbmRpbmcgQlVTWVxuIik7CiAJZnRfc2VuZF9yZXNwX3N0YXR1cyhscG9ydCwgZnAsIFNBTV9TVEFUX0JVU1ksIDApOwogCWZjX2ZyYW1lX2ZyZWUoZnApOwogCWZ0X3Nlc3NfcHV0KHNlc3MpOwkJLyogdW5kbyBnZXQgZnJvbSBsb29rdXAgKi8KQEAgLTU0Nyw3ICs1NTEsNyBAQAogCWNhc2UgRkNfUkNUTF9ERF9EQVRBX0RFU0M6CS8qIHRyYW5zZmVyIHJlYWR5ICovCiAJY2FzZSBGQ19SQ1RMX0VMUzRfUkVROgkJLyogU1JSLCBwZXJoYXBzICovCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVuaGFuZGxlZCBmcmFtZSByX2N0bCAleFxuIiwKKwkJcHJfZGVidWcoIiVzOiB1bmhhbmRsZWQgZnJhbWUgcl9jdGwgJXhcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgZmgtPmZoX3JfY3RsKTsKIAkJZmNfZnJhbWVfZnJlZShmcCk7CiAJCWZ0X3Nlc3NfcHV0KHNlc3MpOwkvKiB1bmRvIGdldCBmcm9tIGxvb2t1cCAqLwpAQCAtNjM1LDcgKzYzOSw4IEBACiAKIAlmY19zZXFfZXhjaChjbWQtPnNlcSktPmxwLT50dC5zZXFfc2V0X3Jlc3AoY21kLT5zZXEsIGZ0X3JlY3Zfc2VxLCBjbWQpOwogCi0JcmV0ID0gZnRfZ2V0X2x1bl9mb3JfY21kKGNtZCwgZmNwLT5mY19sdW4pOworCWNtZC0+bHVuID0gc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKWZjcC0+ZmNfbHVuKTsKKwlyZXQgPSB0cmFuc3BvcnRfbG9va3VwX2NtZF9sdW4oJmNtZC0+c2VfY21kLCBjbWQtPmx1bik7CiAJaWYgKHJldCA8IDApIHsKIAkJZnRfZHVtcF9jbWQoY21kLCBfX2Z1bmNfXyk7CiAJCXRyYW5zcG9ydF9zZW5kX2NoZWNrX2NvbmRpdGlvbl9hbmRfc2Vuc2UoJmNtZC0+c2VfY21kLApAQCAtNjQ1LDMwICs2NTAsMjkgQEAKIAogCXJldCA9IHRyYW5zcG9ydF9nZW5lcmljX2FsbG9jYXRlX3Rhc2tzKHNlX2NtZCwgY21kLT5jZGIpOwogCi0JRlRfSU9fREJHKCJyX2N0bCAleCBhbGxvYyB0YXNrIHJldCAlZFxuIiwgZmgtPmZoX3JfY3RsLCByZXQpOworCXByX2RlYnVnKCJyX2N0bCAleCBhbGxvYyB0YXNrIHJldCAlZFxuIiwgZmgtPmZoX3JfY3RsLCByZXQpOwogCWZ0X2R1bXBfY21kKGNtZCwgX19mdW5jX18pOwogCi0JaWYgKHJldCA9PSAtMSkgeworCWlmIChyZXQgPT0gLUVOT01FTSkgewogCQl0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKHNlX2NtZCwKIAkJCQlUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRSwgMCk7Ci0JCXRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKHNlX2NtZCwgMCwgMSwgMCk7CisJCXRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKHNlX2NtZCwgMCwgMCk7CiAJCXJldHVybjsKIAl9Ci0JaWYgKHJldCA9PSAtMikgeworCWlmIChyZXQgPT0gLUVJTlZBTCkgewogCQlpZiAoc2VfY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9SRVNFUlZBVElPTl9DT05GTElDVCkKIAkJCWZ0X3F1ZXVlX3N0YXR1cyhzZV9jbWQpOwogCQllbHNlCiAJCQl0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKHNlX2NtZCwKIAkJCQkJc2VfY21kLT5zY3NpX3NlbnNlX3JlYXNvbiwgMCk7Ci0JCXRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKHNlX2NtZCwgMCwgMSwgMCk7CisJCXRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKHNlX2NtZCwgMCwgMCk7CiAJCXJldHVybjsKIAl9CiAJdHJhbnNwb3J0X2dlbmVyaWNfaGFuZGxlX2NkYihzZV9jbWQpOwogCXJldHVybjsKIAogZXJyOgotCWZ0X3NlbmRfcmVzcF9jb2RlKGNtZCwgRkNQX0NNTkRfRklFTERTX0lOVkFMSUQpOwotCXJldHVybjsKKwlmdF9zZW5kX3Jlc3BfY29kZV9hbmRfZnJlZShjbWQsIEZDUF9DTU5EX0ZJRUxEU19JTlZBTElEKTsKIH0KIAogLyoKQEAgLTY3Niw3ICs2ODAsNyBAQAogICovCiBzdGF0aWMgdm9pZCBmdF9leGVjX3JlcShzdHJ1Y3QgZnRfY21kICpjbWQpCiB7Ci0JRlRfSU9fREJHKCJjbWQgc3RhdGUgJXhcbiIsIGNtZC0+c3RhdGUpOworCXByX2RlYnVnKCJjbWQgc3RhdGUgJXhcbiIsIGNtZC0+c3RhdGUpOwogCXN3aXRjaCAoY21kLT5zdGF0ZSkgewogCWNhc2UgRkNfQ01EX1NUX05FVzoKIAkJZnRfc2VuZF9jbWQoY21kKTsKQEAgLTY5NSwxNSArNjk5LDEyIEBACiAJc3RydWN0IGZ0X3RwZyAqdHBnID0gYXJnOwogCXN0cnVjdCBzZV9xdWV1ZV9vYmogKnFvYmogPSAmdHBnLT5xb2JqOwogCXN0cnVjdCBmdF9jbWQgKmNtZDsKLQlpbnQgcmV0OwotCi0Jc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMjApOwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHFvYmotPnRocmVhZF93cSwKLQkJCWF0b21pY19yZWFkKCZxb2JqLT5xdWV1ZV9jbnQpIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7Ci0JCWlmIChyZXQgPCAwIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKIAkJCWdvdG8gb3V0OworCiAJCWNtZCA9IGZ0X2RlcXVldWVfY21kKHFvYmopOwogCQlpZiAoY21kKQogCQkJZnRfZXhlY19yZXEoY21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY29uZi5jIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jb25mLmMKaW5kZXggODRlODY4Yy4uODc4MWQxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jb25mLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jb25mLmMKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlIDx0YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmg+CiAjaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX3RwZy5oPgogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9jb25maWdmcy5oPgotI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9iYXNlLmg+CiAjaW5jbHVkZSA8dGFyZ2V0L2NvbmZpZ2ZzX21hY3Jvcy5oPgogCiAjaW5jbHVkZSAidGNtX2ZjLmgiCkBAIC0xMDYsNyArMTA1LDcgQEAKIAl9CiAJZXJyID0gNDsKIGZhaWw6Ci0JRlRfQ09ORl9EQkcoImVyciAldSBsZW4gJXp1IHBvcyAldSBieXRlICV1XG4iLAorCXByX2RlYnVnKCJlcnIgJXUgbGVuICV6dSBwb3MgJXUgYnl0ZSAldVxuIiwKIAkJICAgIGVyciwgY3AgLSBuYW1lLCBwb3MsIGJ5dGUpOwogCXJldHVybiAtMTsKIH0KQEAgLTIxNiwxNCArMjE1LDE0IEBACiAJdTY0IHd3cG47CiAJdTMyIHFfZGVwdGg7CiAKLQlGVF9DT05GX0RCRygiYWRkIGFjbCAlc1xuIiwgbmFtZSk7CisJcHJfZGVidWcoImFkZCBhY2wgJXNcbiIsIG5hbWUpOwogCXRwZyA9IGNvbnRhaW5lcl9vZihzZV90cGcsIHN0cnVjdCBmdF90cGcsIHNlX3RwZyk7CiAKIAlpZiAoZnRfcGFyc2Vfd3duKG5hbWUsICZ3d3BuLCAxKSA8IDApCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJYWNsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZ0X25vZGVfYWNsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoYWNsKSkKKwlpZiAoIWFjbCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJYWNsLT5ub2RlX2F1dGgucG9ydF9uYW1lID0gd3dwbjsKIApAQCAtMjM5LDExICsyMzgsMTEgQEAKIAlzdHJ1Y3QgZnRfbm9kZV9hY2wgKmFjbCA9IGNvbnRhaW5lcl9vZihzZV9hY2wsCiAJCQkJc3RydWN0IGZ0X25vZGVfYWNsLCBzZV9ub2RlX2FjbCk7CiAKLQlGVF9DT05GX0RCRygiZGVsIGFjbCAlc1xuIiwKKwlwcl9kZWJ1ZygiZGVsIGFjbCAlc1xuIiwKIAkJY29uZmlnX2l0ZW1fbmFtZSgmc2VfYWNsLT5hY2xfZ3JvdXAuY2dfaXRlbSkpOwogCiAJdHBnID0gY29udGFpbmVyX29mKHNlX3RwZywgc3RydWN0IGZ0X3RwZywgc2VfdHBnKTsKLQlGVF9DT05GX0RCRygiZGVsIGFjbCAlcCBzZV9hY2wgJXAgdHBnICVwIHNlX3RwZyAlcFxuIiwKKwlwcl9kZWJ1ZygiZGVsIGFjbCAlcCBzZV9hY2wgJXAgdHBnICVwIHNlX3RwZyAlcFxuIiwKIAkJICAgIGFjbCwgc2VfYWNsLCB0cGcsICZ0cGctPnNlX3RwZyk7CiAKIAljb3JlX3RwZ19kZWxfaW5pdGlhdG9yX25vZGVfYWNsKCZ0cGctPnNlX3RwZywgc2VfYWNsLCAxKTsKQEAgLTI2MCwxMSArMjU5LDExIEBACiAJc3Bpbl9sb2NrX2JoKCZzZV90cGctPmFjbF9ub2RlX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VfYWNsLCAmc2VfdHBnLT5hY2xfbm9kZV9saXN0LCBhY2xfbGlzdCkgewogCQlhY2wgPSBjb250YWluZXJfb2Yoc2VfYWNsLCBzdHJ1Y3QgZnRfbm9kZV9hY2wsIHNlX25vZGVfYWNsKTsKLQkJRlRfQ09ORl9EQkcoImFjbCAlcCBwb3J0X25hbWUgJWxseFxuIiwKKwkJcHJfZGVidWcoImFjbCAlcCBwb3J0X25hbWUgJWxseFxuIiwKIAkJCWFjbCwgKHVuc2lnbmVkIGxvbmcgbG9uZylhY2wtPm5vZGVfYXV0aC5wb3J0X25hbWUpOwogCQlpZiAoYWNsLT5ub2RlX2F1dGgucG9ydF9uYW1lID09IHJkYXRhLT5pZHMucG9ydF9uYW1lIHx8CiAJCSAgICBhY2wtPm5vZGVfYXV0aC5ub2RlX25hbWUgPT0gcmRhdGEtPmlkcy5ub2RlX25hbWUpIHsKLQkJCUZUX0NPTkZfREJHKCJhY2wgJXAgcG9ydF9uYW1lICVsbHggbWF0Y2hlZFxuIiwgYWNsLAorCQkJcHJfZGVidWcoImFjbCAlcCBwb3J0X25hbWUgJWxseCBtYXRjaGVkXG4iLCBhY2wsCiAJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmRhdGEtPmlkcy5wb3J0X25hbWUpOwogCQkJZm91bmQgPSBhY2w7CiAJCQkvKiBYWFggbmVlZCB0byBob2xkIG9udG8gQUNMICovCkBAIC0yODAsMTEgKzI3OSwxMSBAQAogCXN0cnVjdCBmdF9ub2RlX2FjbCAqYWNsOwogCiAJYWNsID0ga3phbGxvYyhzaXplb2YoKmFjbCksIEdGUF9LRVJORUwpOwotCWlmICghKGFjbCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgc3RydWN0IGZ0X25vZGVfYWNsXG4iKTsKKwlpZiAoIWFjbCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3QgZnRfbm9kZV9hY2xcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JRlRfQ09ORl9EQkcoImFjbCAlcFxuIiwgYWNsKTsKKwlwcl9kZWJ1ZygiYWNsICVwXG4iLCBhY2wpOwogCXJldHVybiAmYWNsLT5zZV9ub2RlX2FjbDsKIH0KIApAQCAtMjk0LDcgKzI5Myw3IEBACiAJc3RydWN0IGZ0X25vZGVfYWNsICphY2wgPSBjb250YWluZXJfb2Yoc2VfYWNsLAogCQkJCXN0cnVjdCBmdF9ub2RlX2FjbCwgc2Vfbm9kZV9hY2wpOwogCi0JRlRfQ09ORl9EQkcoS0VSTl9JTkZPICJhY2wgJXBcbiIsIGFjbCk7CisJcHJfZGVidWcoImFjbCAlcFxuIiwgYWNsKTsKIAlrZnJlZShhY2wpOwogfQogCkBAIC0zMTEsNyArMzEwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGluZGV4OwogCWludCByZXQ7CiAKLQlGVF9DT05GX0RCRygidGNtX2ZjOiBhZGQgdHBnICVzXG4iLCBuYW1lKTsKKwlwcl9kZWJ1ZygidGNtX2ZjOiBhZGQgdHBnICVzXG4iLCBuYW1lKTsKIAogCS8qCiAJICogTmFtZSBtdXN0IGJlICJ0cGd0XyIgZm9sbG93ZWQgYnkgdGhlIGluZGV4LgpAQCAtMzMxLDcgKzMzMCw3IEBACiAJdHJhbnNwb3J0X2luaXRfcXVldWVfb2JqKCZ0cGctPnFvYmopOwogCiAJcmV0ID0gY29yZV90cGdfcmVnaXN0ZXIoJmZ0X2NvbmZpZ2ZzLT50Zl9vcHMsIHd3biwgJnRwZy0+c2VfdHBnLAotCQkJCSh2b2lkICopdHBnLCBUUkFOU1BPUlRfVFBHX1RZUEVfTk9STUFMKTsKKwkJCQl0cGcsIFRSQU5TUE9SVF9UUEdfVFlQRV9OT1JNQUwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKHRwZyk7CiAJCXJldHVybiBOVUxMOwpAQCAtMzU0LDcgKzM1Myw3IEBACiB7CiAJc3RydWN0IGZ0X3RwZyAqdHBnID0gY29udGFpbmVyX29mKHNlX3RwZywgc3RydWN0IGZ0X3RwZywgc2VfdHBnKTsKIAotCUZUX0NPTkZfREJHKCJkZWwgdHBnICVzXG4iLAorCXByX2RlYnVnKCJkZWwgdHBnICVzXG4iLAogCQkgICAgY29uZmlnX2l0ZW1fbmFtZSgmdHBnLT5zZV90cGcudHBnX2dyb3VwLmNnX2l0ZW0pKTsKIAogCWt0aHJlYWRfc3RvcCh0cGctPnRocmVhZCk7CkBAIC00MTIsNyArNDExLDcgQEAKIAlzdHJ1Y3QgZnRfbHBvcnRfYWNsICpvbGRfbGFjbDsKIAl1NjQgd3dwbjsKIAotCUZUX0NPTkZfREJHKCJhZGQgbHBvcnQgJXNcbiIsIG5hbWUpOworCXByX2RlYnVnKCJhZGQgbHBvcnQgJXNcbiIsIG5hbWUpOwogCWlmIChmdF9wYXJzZV93d24obmFtZSwgJnd3cG4sIDEpIDwgMCkKIAkJcmV0dXJuIE5VTEw7CiAJbGFjbCA9IGt6YWxsb2Moc2l6ZW9mKCpsYWNsKSwgR0ZQX0tFUk5FTCk7CkBAIC00NDEsNyArNDQwLDcgQEAKIAlzdHJ1Y3QgZnRfbHBvcnRfYWNsICpsYWNsID0gY29udGFpbmVyX29mKHd3biwKIAkJCQlzdHJ1Y3QgZnRfbHBvcnRfYWNsLCBmY19scG9ydF93d24pOwogCi0JRlRfQ09ORl9EQkcoImRlbCBscG9ydCAlc1xuIiwKKwlwcl9kZWJ1ZygiZGVsIGxwb3J0ICVzXG4iLAogCQkJY29uZmlnX2l0ZW1fbmFtZSgmd3duLT53d25fZ3JvdXAuY2dfaXRlbSkpOwogCW11dGV4X2xvY2soJmZ0X2xwb3J0X2xvY2spOwogCWxpc3RfZGVsKCZsYWNsLT5saXN0KTsKQEAgLTUzNiw4ICs1MzUsNyBAQAogCS50cGdfcmVsZWFzZV9mYWJyaWNfYWNsID0JZnRfdHBnX3JlbGVhc2VfZmFicmljX2FjbCwKIAkudHBnX2dldF9pbnN0X2luZGV4ID0JCWZ0X3RwZ19nZXRfaW5zdF9pbmRleCwKIAkuY2hlY2tfc3RvcF9mcmVlID0JCWZ0X2NoZWNrX3N0b3BfZnJlZSwKLQkucmVsZWFzZV9jbWRfdG9fcG9vbCA9CQlmdF9yZWxlYXNlX2NtZCwKLQkucmVsZWFzZV9jbWRfZGlyZWN0ID0JCWZ0X3JlbGVhc2VfY21kLAorCS5yZWxlYXNlX2NtZCA9CQkJZnRfcmVsZWFzZV9jbWQsCiAJLnNodXRkb3duX3Nlc3Npb24gPQkJZnRfc2Vzc19zaHV0ZG93biwKIAkuY2xvc2Vfc2Vzc2lvbiA9CQlmdF9zZXNzX2Nsb3NlLAogCS5zdG9wX3Nlc3Npb24gPQkJCWZ0X3Nlc3Nfc3RvcCwKQEAgLTU1MCw3ICs1NDgsNiBAQAogCS5zZXRfZGVmYXVsdF9ub2RlX2F0dHJpYnV0ZXMgPQlmdF9zZXRfZGVmYXVsdF9ub2RlX2F0dHIsCiAJLmdldF90YXNrX3RhZyA9CQkJZnRfZ2V0X3Rhc2tfdGFnLAogCS5nZXRfY21kX3N0YXRlID0JCWZ0X2dldF9jbWRfc3RhdGUsCi0JLm5ld19jbWRfZmFpbHVyZSA9CQlmdF9uZXdfY21kX2ZhaWx1cmUsCiAJLnF1ZXVlX2RhdGFfaW4gPQkJZnRfcXVldWVfZGF0YV9pbiwKIAkucXVldWVfc3RhdHVzID0JCQlmdF9xdWV1ZV9zdGF0dXMsCiAJLnF1ZXVlX3RtX3JzcCA9CQkJZnRfcXVldWVfdG1fcmVzcCwKQEAgLTU4MiwxMCArNTc5LDEwIEBACiAJICogUmVnaXN0ZXIgdGhlIHRvcCBsZXZlbCBzdHJ1Y3QgY29uZmlnX2l0ZW1fdHlwZSB3aXRoIFRDTSBjb3JlCiAJICovCiAJZmFicmljID0gdGFyZ2V0X2ZhYnJpY19jb25maWdmc19pbml0KFRISVNfTU9EVUxFLCAiZmMiKTsKLQlpZiAoIWZhYnJpYykgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogdGFyZ2V0X2ZhYnJpY19jb25maWdmc19pbml0KCkgZmFpbGVkIVxuIiwKKwlpZiAoSVNfRVJSKGZhYnJpYykpIHsKKwkJcHJfZXJyKCIlczogdGFyZ2V0X2ZhYnJpY19jb25maWdmc19pbml0KCkgZmFpbGVkIVxuIiwKIAkJICAgICAgIF9fZnVuY19fKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gUFRSX0VSUihmYWJyaWMpOwogCX0KIAlmYWJyaWMtPnRmX29wcyA9IGZ0X2ZhYnJpY19vcHM7CiAKQEAgLTYxMCwxMSArNjA3LDggQEAKIAkgKi8KIAlyZXQgPSB0YXJnZXRfZmFicmljX2NvbmZpZ2ZzX3JlZ2lzdGVyKGZhYnJpYyk7CiAJaWYgKHJldCA8IDApIHsKLQkJRlRfQ09ORl9EQkcoInRhcmdldF9mYWJyaWNfY29uZmlnZnNfcmVnaXN0ZXIoKSBmb3IiCisJCXByX2RlYnVnKCJ0YXJnZXRfZmFicmljX2NvbmZpZ2ZzX3JlZ2lzdGVyKCkgZm9yIgogCQkJICAgICIgRkMgVGFyZ2V0IGZhaWxlZCFcbiIpOwotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiJXM6IHRhcmdldF9mYWJyaWNfY29uZmlnZnNfcmVnaXN0ZXIoKSBmYWlsZWQhXG4iLAotCQkgICAgICAgX19mdW5jX18pOwogCQl0YXJnZXRfZmFicmljX2NvbmZpZ2ZzX2ZyZWUoZmFicmljKTsKIAkJcmV0dXJuIC0xOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfaW8uYyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfaW8uYwppbmRleCA0YzNjMGVmLi44ZTJhNDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2lvLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19pby5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KQEAgLTUzLDcgKzU0LDYgQEAKICNpbmNsdWRlIDx0YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmg+CiAjaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX3RwZy5oPgogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9jb25maWdmcy5oPgotI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9iYXNlLmg+CiAjaW5jbHVkZSA8dGFyZ2V0L2NvbmZpZ2ZzX21hY3Jvcy5oPgogCiAjaW5jbHVkZSAidGNtX2ZjLmgiCkBAIC02NSwyMSArNjUsMjAgQEAKIGludCBmdF9xdWV1ZV9kYXRhX2luKHN0cnVjdCBzZV9jbWQgKnNlX2NtZCkKIHsKIAlzdHJ1Y3QgZnRfY21kICpjbWQgPSBjb250YWluZXJfb2Yoc2VfY21kLCBzdHJ1Y3QgZnRfY21kLCBzZV9jbWQpOwotCXN0cnVjdCBzZV90cmFuc3BvcnRfdGFzayAqdGFzazsKIAlzdHJ1Y3QgZmNfZnJhbWUgKmZwID0gTlVMTDsKIAlzdHJ1Y3QgZmNfZXhjaCAqZXA7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKLQlzdHJ1Y3Qgc2VfbWVtICptZW07CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7CiAJc2l6ZV90IHJlbWFpbmluZzsKIAl1MzIgZl9jdGwgPSBGQ19GQ19FWF9DVFggfCBGQ19GQ19SRUxfT0ZGOwotCXUzMiBtZW1fb2ZmOworCXUzMiBtZW1fb2ZmID0gMDsKIAl1MzIgZmhfb2ZmID0gMDsKIAl1MzIgZnJhbWVfb2ZmID0gMDsKIAlzaXplX3QgZnJhbWVfbGVuID0gMDsKLQlzaXplX3QgbWVtX2xlbjsKKwlzaXplX3QgbWVtX2xlbiA9IDA7CiAJc2l6ZV90IHRsZW47CiAJc2l6ZV90IG9mZl9pbl9wYWdlOwotCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlpbnQgdXNlX3NnOwogCWludCBlcnJvcjsKIAl2b2lkICpwYWdlX2FkZHI7CkBAIC05MCwyNCArODksMTcgQEAKIAlscG9ydCA9IGVwLT5scDsKIAljbWQtPnNlcSA9IGxwb3J0LT50dC5zZXFfc3RhcnRfbmV4dChjbWQtPnNlcSk7CiAKLQl0YXNrID0gVF9UQVNLKHNlX2NtZCk7Ci0JQlVHX09OKCF0YXNrKTsKIAlyZW1haW5pbmcgPSBzZV9jbWQtPmRhdGFfbGVuZ3RoOwogCiAJLyoKLQkgKiBTZXR1cCB0byB1c2UgZmlyc3QgbWVtIGxpc3QgZW50cnkgaWYgYW55LgorCSAqIFNldHVwIHRvIHVzZSBmaXJzdCBtZW0gbGlzdCBlbnRyeSwgdW5sZXNzIG5vIGRhdGEuCiAJICovCi0JaWYgKHRhc2stPnRfdGFza3Nfc2VfbnVtKSB7Ci0JCW1lbSA9IGxpc3RfZmlyc3RfZW50cnkodGFzay0+dF9tZW1fbGlzdCwKLQkJCSBzdHJ1Y3Qgc2VfbWVtLCBzZV9saXN0KTsKLQkJbWVtX2xlbiA9IG1lbS0+c2VfbGVuOwotCQltZW1fb2ZmID0gbWVtLT5zZV9vZmY7Ci0JCXBhZ2UgPSBtZW0tPnNlX3BhZ2U7Ci0JfSBlbHNlIHsKLQkJbWVtID0gTlVMTDsKLQkJbWVtX2xlbiA9IHJlbWFpbmluZzsKLQkJbWVtX29mZiA9IDA7Ci0JCXBhZ2UgPSBOVUxMOworCUJVR19PTihyZW1haW5pbmcgJiYgIXNlX2NtZC0+dF9kYXRhX3NnKTsKKwlpZiAocmVtYWluaW5nKSB7CisJCXNnID0gc2VfY21kLT50X2RhdGFfc2c7CisJCW1lbV9sZW4gPSBzZy0+bGVuZ3RoOworCQltZW1fb2ZmID0gc2ctPm9mZnNldDsKKwkJcGFnZSA9IHNnX3BhZ2Uoc2cpOwogCX0KIAogCS8qIG5vIHNjYXR0ZXIvZ2F0aGVyIGluIHNrYiBmb3Igb2RkIHdvcmQgbGVuZ3RoIGR1ZSB0byBmY19zZXFfc2VuZCgpICovCkBAIC0xMTUsMTIgKzEwNywxMCBAQAogCiAJd2hpbGUgKHJlbWFpbmluZykgewogCQlpZiAoIW1lbV9sZW4pIHsKLQkJCUJVR19PTighbWVtKTsKLQkJCW1lbSA9IGxpc3RfZW50cnkobWVtLT5zZV9saXN0Lm5leHQsCi0JCQkJc3RydWN0IHNlX21lbSwgc2VfbGlzdCk7Ci0JCQltZW1fbGVuID0gbWluKChzaXplX3QpbWVtLT5zZV9sZW4sIHJlbWFpbmluZyk7Ci0JCQltZW1fb2ZmID0gbWVtLT5zZV9vZmY7Ci0JCQlwYWdlID0gbWVtLT5zZV9wYWdlOworCQkJc2cgPSBzZ19uZXh0KHNnKTsKKwkJCW1lbV9sZW4gPSBtaW4oKHNpemVfdClzZy0+bGVuZ3RoLCByZW1haW5pbmcpOworCQkJbWVtX29mZiA9IHNnLT5vZmZzZXQ7CisJCQlwYWdlID0gc2dfcGFnZShzZyk7CiAJCX0KIAkJaWYgKCFmcmFtZV9sZW4pIHsKIAkJCS8qCkBAIC0xNDgsMTggKzEzOCw3IEBACiAJCXRsZW4gPSBtaW4obWVtX2xlbiwgZnJhbWVfbGVuKTsKIAogCQlpZiAodXNlX3NnKSB7Ci0JCQlpZiAoIW1lbSkgewotCQkJCUJVR19PTighdGFzay0+dF90YXNrX2J1Zik7Ci0JCQkJcGFnZV9hZGRyID0gdGFzay0+dF90YXNrX2J1ZiArIG1lbV9vZmY7Ci0JCQkJLyoKLQkJCQkgKiBJbiB0aGlzIGNhc2UsIG9mZnNldCBpcyAnb2Zmc2V0X2luX3BhZ2UnIG9mCi0JCQkJICogKHRfdGFza19idWYgKyBtZW1fb2ZmKSBpbnN0ZWFkIG9mICdtZW1fb2ZmJy4KLQkJCQkgKi8KLQkJCQlvZmZfaW5fcGFnZSA9IG9mZnNldF9pbl9wYWdlKHBhZ2VfYWRkcik7Ci0JCQkJcGFnZSA9IHZpcnRfdG9fcGFnZShwYWdlX2FkZHIpOwotCQkJCXRsZW4gPSBtaW4odGxlbiwgUEFHRV9TSVpFIC0gb2ZmX2luX3BhZ2UpOwotCQkJfSBlbHNlCi0JCQkJb2ZmX2luX3BhZ2UgPSBtZW1fb2ZmOworCQkJb2ZmX2luX3BhZ2UgPSBtZW1fb2ZmOwogCQkJQlVHX09OKCFwYWdlKTsKIAkJCWdldF9wYWdlKHBhZ2UpOwogCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKGZwX3NrYihmcCksCkBAIC0xNjksNyArMTQ4LDcgQEAKIAkJCWZwX3NrYihmcCktPmRhdGFfbGVuICs9IHRsZW47CiAJCQlmcF9za2IoZnApLT50cnVlc2l6ZSArPQogCQkJCQlQQUdFX1NJWkUgPDwgY29tcG91bmRfb3JkZXIocGFnZSk7Ci0JCX0gZWxzZSBpZiAobWVtKSB7CisJCX0gZWxzZSB7CiAJCQlCVUdfT04oIXBhZ2UpOwogCQkJZnJvbSA9IGttYXBfYXRvbWljKHBhZ2UgKyAobWVtX29mZiA+PiBQQUdFX1NISUZUKSwKIAkJCQkJICAgS01fU09GVElSUTApOwpAQCAtMTgwLDEwICsxNTksNiBAQAogCQkJbWVtY3B5KHRvLCBmcm9tLCB0bGVuKTsKIAkJCWt1bm1hcF9hdG9taWMocGFnZV9hZGRyLCBLTV9TT0ZUSVJRMCk7CiAJCQl0byArPSB0bGVuOwotCQl9IGVsc2UgewotCQkJZnJvbSA9IHRhc2stPnRfdGFza19idWYgKyBtZW1fb2ZmOwotCQkJbWVtY3B5KHRvLCBmcm9tLCB0bGVuKTsKLQkJCXRvICs9IHRsZW47CiAJCX0KIAogCQltZW1fb2ZmICs9IHRsZW47CkBAIC0yMDEsOSArMTc2LDggQEAKIAkJZXJyb3IgPSBscG9ydC0+dHQuc2VxX3NlbmQobHBvcnQsIGNtZC0+c2VxLCBmcCk7CiAJCWlmIChlcnJvcikgewogCQkJLyogWFhYIEZvciBub3csIGluaXRpYXRvciB3aWxsIHJldHJ5ICovCi0JCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBzZW5kIGZyYW1lICVwLCAiCi0JCQkJCQkieGlkIDwweCV4PiwgcmVtYWluaW5nIDwweCV4PiwgIgorCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCIlczogRmFpbGVkIHRvIHNlbmQgZnJhbWUgJXAsICIKKwkJCQkJCSJ4aWQgPDB4JXg+LCByZW1haW5pbmcgJXp1LCAiCiAJCQkJCQkibHNvX21heCA8MHgleD5cbiIsCiAJCQkJCQlfX2Z1bmNfXywgZnAsIGVwLT54aWQsCiAJCQkJCQlyZW1haW5pbmcsIGxwb3J0LT5sc29fbWF4KTsKQEAgLTIyMSwyNCArMTk1LDIwIEBACiAJc3RydWN0IGZjX3NlcSAqc2VxID0gY21kLT5zZXE7CiAJc3RydWN0IGZjX2V4Y2ggKmVwOwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7Ci0Jc3RydWN0IHNlX3RyYW5zcG9ydF90YXNrICp0YXNrOwogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOwotCXN0cnVjdCBzZV9tZW0gKm1lbTsKLQl1MzIgbWVtX29mZjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gTlVMTDsKKwl1MzIgbWVtX29mZiA9IDA7CiAJdTMyIHJlbF9vZmY7CiAJc2l6ZV90IGZyYW1lX2xlbjsKLQlzaXplX3QgbWVtX2xlbjsKKwlzaXplX3QgbWVtX2xlbiA9IDA7CiAJc2l6ZV90IHRsZW47Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCXZvaWQgKnBhZ2VfYWRkcjsKIAl2b2lkICpmcm9tOwogCXZvaWQgKnRvOwogCXUzMiBmX2N0bDsKIAl2b2lkICpidWY7CiAKLQl0YXNrID0gVF9UQVNLKHNlX2NtZCk7Ci0JQlVHX09OKCF0YXNrKTsKLQogCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CiAJaWYgKCEobnRvaDI0KGZoLT5maF9mX2N0bCkgJiBGQ19GQ19SRUxfT0ZGKSkKIAkJZ290byBkcm9wOwpAQCAtMjUxLDcgKzIyMSw3IEBACiAJICovCiAJYnVmID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIDEpOwogCWlmIChjbWQtPndhc19kZHBfc2V0dXAgJiYgYnVmKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBXaGVuIEREUCB3YXMgc2V0dXAsIG5vdCBleHBlY3RlZCB0byIKKwkJcHJfZGVidWcoIiVzOiBXaGVuIEREUCB3YXMgc2V0dXAsIG5vdCBleHBlY3RlZCB0byIKIAkJCQkgInJlY2VpdmUgZnJhbWUgd2l0aCBwYXlsb2FkLCBQYXlsb2FkIHNoYWxsIGJlIgogCQkJCSAiY29waWVkIGRpcmVjdGx5IHRvIGJ1ZmZlciBpbnN0ZWFkIG9mIGNvbWluZyAiCiAJCQkJICJ2aWEuIGxlZ2FjeSByZWNlaXZlIHF1ZXVlc1xuIiwgX19mdW5jX18pOwpAQCAtMjg5LDcgKzI1OSw3IEBACiAJCQkgKiB0aGlzIHBvaW50LCBidXQganVzdCBpbiBjYXNlIGlmIHJlcXVpcmVkIGluIGZ1dHVyZQogCQkJICogZm9yIGRlYnVnZ2luZyBvciBhbnkgb3RoZXIgcHVycG9zZQogCQkJICovCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZWNlaXZlZCBmcmFtZSB3aXRoIFRTSSBiaXQgbm90IgorCQkJcHJfZXJyKCIlczogUmVjZWl2ZWQgZnJhbWUgd2l0aCBUU0kgYml0IG5vdCIKIAkJCQkJIiBiZWluZyBTRVQsIGRyb3BwaW5nIHRoZSBmcmFtZSwgIgogCQkJCQkiY21kLT5zZyA8JXA+LCBjbWQtPnNnX2NudCA8MHgleD5cbiIsCiAJCQkJCV9fZnVuY19fLCBjbWQtPnNnLCBjbWQtPnNnX2NudCk7CkBAIC0zMTIsMjkgKzI4MiwyMiBAQAogCQlmcmFtZV9sZW4gPSBzZV9jbWQtPmRhdGFfbGVuZ3RoIC0gcmVsX29mZjsKIAogCS8qCi0JICogU2V0dXAgdG8gdXNlIGZpcnN0IG1lbSBsaXN0IGVudHJ5IGlmIGFueS4KKwkgKiBTZXR1cCB0byB1c2UgZmlyc3QgbWVtIGxpc3QgZW50cnksIHVubGVzcyBubyBkYXRhLgogCSAqLwotCWlmICh0YXNrLT50X3Rhc2tzX3NlX251bSkgewotCQltZW0gPSBsaXN0X2ZpcnN0X2VudHJ5KHRhc2stPnRfbWVtX2xpc3QsCi0JCQkJICAgICAgIHN0cnVjdCBzZV9tZW0sIHNlX2xpc3QpOwotCQltZW1fbGVuID0gbWVtLT5zZV9sZW47Ci0JCW1lbV9vZmYgPSBtZW0tPnNlX29mZjsKLQkJcGFnZSA9IG1lbS0+c2VfcGFnZTsKLQl9IGVsc2UgewotCQltZW0gPSBOVUxMOwotCQlwYWdlID0gTlVMTDsKLQkJbWVtX29mZiA9IDA7Ci0JCW1lbV9sZW4gPSBmcmFtZV9sZW47CisJQlVHX09OKGZyYW1lX2xlbiAmJiAhc2VfY21kLT50X2RhdGFfc2cpOworCWlmIChmcmFtZV9sZW4pIHsKKwkJc2cgPSBzZV9jbWQtPnRfZGF0YV9zZzsKKwkJbWVtX2xlbiA9IHNnLT5sZW5ndGg7CisJCW1lbV9vZmYgPSBzZy0+b2Zmc2V0OworCQlwYWdlID0gc2dfcGFnZShzZyk7CiAJfQogCiAJd2hpbGUgKGZyYW1lX2xlbikgewogCQlpZiAoIW1lbV9sZW4pIHsKLQkJCUJVR19PTighbWVtKTsKLQkJCW1lbSA9IGxpc3RfZW50cnkobWVtLT5zZV9saXN0Lm5leHQsCi0JCQkJCSBzdHJ1Y3Qgc2VfbWVtLCBzZV9saXN0KTsKLQkJCW1lbV9sZW4gPSBtZW0tPnNlX2xlbjsKLQkJCW1lbV9vZmYgPSBtZW0tPnNlX29mZjsKLQkJCXBhZ2UgPSBtZW0tPnNlX3BhZ2U7CisJCQlzZyA9IHNnX25leHQoc2cpOworCQkJbWVtX2xlbiA9IHNnLT5sZW5ndGg7CisJCQltZW1fb2ZmID0gc2ctPm9mZnNldDsKKwkJCXBhZ2UgPSBzZ19wYWdlKHNnKTsKIAkJfQogCQlpZiAocmVsX29mZiA+PSBtZW1fbGVuKSB7CiAJCQlyZWxfb2ZmIC09IG1lbV9sZW47CkBAIC0zNDcsMTkgKzMxMCwxNSBAQAogCiAJCXRsZW4gPSBtaW4obWVtX2xlbiwgZnJhbWVfbGVuKTsKIAotCQlpZiAobWVtKSB7Ci0JCQl0byA9IGttYXBfYXRvbWljKHBhZ2UgKyAobWVtX29mZiA+PiBQQUdFX1NISUZUKSwKLQkJCQkJIEtNX1NPRlRJUlEwKTsKLQkJCXBhZ2VfYWRkciA9IHRvOwotCQkJdG8gKz0gbWVtX29mZiAmIH5QQUdFX01BU0s7Ci0JCQl0bGVuID0gbWluKHRsZW4sIChzaXplX3QpKFBBR0VfU0laRSAtCi0JCQkJCQkobWVtX29mZiAmIH5QQUdFX01BU0spKSk7Ci0JCQltZW1jcHkodG8sIGZyb20sIHRsZW4pOwotCQkJa3VubWFwX2F0b21pYyhwYWdlX2FkZHIsIEtNX1NPRlRJUlEwKTsKLQkJfSBlbHNlIHsKLQkJCXRvID0gdGFzay0+dF90YXNrX2J1ZiArIG1lbV9vZmY7Ci0JCQltZW1jcHkodG8sIGZyb20sIHRsZW4pOwotCQl9CisJCXRvID0ga21hcF9hdG9taWMocGFnZSArIChtZW1fb2ZmID4+IFBBR0VfU0hJRlQpLAorCQkJCSBLTV9TT0ZUSVJRMCk7CisJCXBhZ2VfYWRkciA9IHRvOworCQl0byArPSBtZW1fb2ZmICYgflBBR0VfTUFTSzsKKwkJdGxlbiA9IG1pbih0bGVuLCAoc2l6ZV90KShQQUdFX1NJWkUgLQorCQkJCQkgIChtZW1fb2ZmICYgflBBR0VfTUFTSykpKTsKKwkJbWVtY3B5KHRvLCBmcm9tLCB0bGVuKTsKKwkJa3VubWFwX2F0b21pYyhwYWdlX2FkZHIsIEtNX1NPRlRJUlEwKTsKKwogCQlmcm9tICs9IHRsZW47CiAJCWZyYW1lX2xlbiAtPSB0bGVuOwogCQltZW1fb2ZmICs9IHRsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX3Nlc3MuYyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfc2Vzcy5jCmluZGV4IGEzYmQ1N2YuLmRiYjVlYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfc2Vzcy5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfc2Vzcy5jCkBAIC00NiwxMCArNDYsOCBAQAogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaD4KICNpbmNsdWRlIDx0YXJnZXQvdGFyZ2V0X2NvcmVfdHBnLmg+CiAjaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX2NvbmZpZ2ZzLmg+Ci0jaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX2Jhc2UuaD4KICNpbmNsdWRlIDx0YXJnZXQvY29uZmlnZnNfbWFjcm9zLmg+CiAKLSNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CiAjaW5jbHVkZSAidGNtX2ZjLmgiCiAKIHN0YXRpYyB2b2lkIGZ0X3Nlc3NfZGVsZXRlX2FsbChzdHJ1Y3QgZnRfdHBvcnQgKik7CkBAIC0xOTgsMTMgKzE5NiwxMyBAQAogCQlpZiAoc2Vzcy0+cG9ydF9pZCA9PSBwb3J0X2lkKSB7CiAJCQlrcmVmX2dldCgmc2Vzcy0+a3JlZik7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCUZUX1NFU1NfREJHKCJwb3J0X2lkICV4IGZvdW5kICVwXG4iLCBwb3J0X2lkLCBzZXNzKTsKKwkJCXByX2RlYnVnKCJwb3J0X2lkICV4IGZvdW5kICVwXG4iLCBwb3J0X2lkLCBzZXNzKTsKIAkJCXJldHVybiBzZXNzOwogCQl9CiAJfQogb3V0OgogCXJjdV9yZWFkX3VubG9jaygpOwotCUZUX1NFU1NfREJHKCJwb3J0X2lkICV4IG5vdCBmb3VuZFxuIiwgcG9ydF9pZCk7CisJcHJfZGVidWcoInBvcnRfaWQgJXggbm90IGZvdW5kXG4iLCBwb3J0X2lkKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMjI5LDcgKzIyNyw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJc2Vzcy0+c2Vfc2VzcyA9IHRyYW5zcG9ydF9pbml0X3Nlc3Npb24oKTsKLQlpZiAoIXNlc3MtPnNlX3Nlc3MpIHsKKwlpZiAoSVNfRVJSKHNlc3MtPnNlX3Nlc3MpKSB7CiAJCWtmcmVlKHNlc3MpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0yNDAsNyArMjM4LDcgQEAKIAlobGlzdF9hZGRfaGVhZF9yY3UoJnNlc3MtPmhhc2gsIGhlYWQpOwogCXRwb3J0LT5zZXNzX2NvdW50Kys7CiAKLQlGVF9TRVNTX0RCRygicG9ydF9pZCAleCBzZXNzICVwXG4iLCBwb3J0X2lkLCBzZXNzKTsKKwlwcl9kZWJ1ZygicG9ydF9pZCAleCBzZXNzICVwXG4iLCBwb3J0X2lkLCBzZXNzKTsKIAogCXRyYW5zcG9ydF9yZWdpc3Rlcl9zZXNzaW9uKCZ0cG9ydC0+dHBnLT5zZV90cGcsICZhY2wtPnNlX25vZGVfYWNsLAogCQkJCSAgIHNlc3MtPnNlX3Nlc3MsIHNlc3MpOwpAQCAtMzE0LDcgKzMxMiw3IEBACiB7CiAJc3RydWN0IGZ0X3Nlc3MgKnNlc3MgPSBzZV9zZXNzLT5mYWJyaWNfc2Vzc19wdHI7CiAKLQlGVF9TRVNTX0RCRygicG9ydF9pZCAleFxuIiwgc2Vzcy0+cG9ydF9pZCk7CisJcHJfZGVidWcoInBvcnRfaWQgJXhcbiIsIHNlc3MtPnBvcnRfaWQpOwogCXJldHVybiAxOwogfQogCkBAIC0zMzIsMTAgKzMzMCwxMCBAQAogCWxwb3J0ID0gc2Vzcy0+dHBvcnQtPmxwb3J0OwogCXBvcnRfaWQgPSBzZXNzLT5wb3J0X2lkOwogCWlmIChwb3J0X2lkID09IC0xKSB7Ci0JCW11dGV4X2xvY2soJmZ0X2xwb3J0X2xvY2spOworCQltdXRleF91bmxvY2soJmZ0X2xwb3J0X2xvY2spOwogCQlyZXR1cm47CiAJfQotCUZUX1NFU1NfREJHKCJwb3J0X2lkICV4XG4iLCBwb3J0X2lkKTsKKwlwcl9kZWJ1ZygicG9ydF9pZCAleFxuIiwgcG9ydF9pZCk7CiAJZnRfc2Vzc191bmhhc2goc2Vzcyk7CiAJbXV0ZXhfdW5sb2NrKCZmdF9scG9ydF9sb2NrKTsKIAl0cmFuc3BvcnRfZGVyZWdpc3Rlcl9zZXNzaW9uX2NvbmZpZ2ZzKHNlX3Nlc3MpOwpAQCAtMzQ4LDcgKzM0Niw3IEBACiB7CiAJc3RydWN0IGZ0X3Nlc3MgKnNlc3MgPSBzZV9zZXNzLT5mYWJyaWNfc2Vzc19wdHI7CiAKLQlGVF9TRVNTX0RCRygicG9ydF9pZCAleFxuIiwgc2Vzcy0+cG9ydF9pZCk7CisJcHJfZGVidWcoInBvcnRfaWQgJXhcbiIsIHNlc3MtPnBvcnRfaWQpOwogfQogCiBpbnQgZnRfc2Vzc19sb2dnZWRfaW4oc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MpCkBAIC00NTgsNyArNDU2LDcgQEAKIAltdXRleF9sb2NrKCZmdF9scG9ydF9sb2NrKTsKIAlyZXQgPSBmdF9wcmxpX2xvY2tlZChyZGF0YSwgc3BwX2xlbiwgcnNwcCwgc3BwKTsKIAltdXRleF91bmxvY2soJmZ0X2xwb3J0X2xvY2spOwotCUZUX1NFU1NfREJHKCJwb3J0X2lkICV4IGZsYWdzICV4IHJldCAleFxuIiwKKwlwcl9kZWJ1ZygicG9ydF9pZCAleCBmbGFncyAleCByZXQgJXhcbiIsCiAJICAgICAgIHJkYXRhLT5pZHMucG9ydF9pZCwgcnNwcCA/IHJzcHAtPnNwcF9mbGFncyA6IDAsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTUxOCwxMSArNTE2LDExIEBACiAJc3RydWN0IGZ0X3Nlc3MgKnNlc3M7CiAJdTMyIHNpZCA9IGZjX2ZyYW1lX3NpZChmcCk7CiAKLQlGVF9TRVNTX0RCRygic2lkICV4XG4iLCBzaWQpOworCXByX2RlYnVnKCJzaWQgJXhcbiIsIHNpZCk7CiAKIAlzZXNzID0gZnRfc2Vzc19nZXQobHBvcnQsIHNpZCk7CiAJaWYgKCFzZXNzKSB7Ci0JCUZUX1NFU1NfREJHKCJzaWQgJXggc2VzcyBsb29rdXAgZmFpbGVkXG4iLCBzaWQpOworCQlwcl9kZWJ1Zygic2lkICV4IHNlc3MgbG9va3VwIGZhaWxlZFxuIiwgc2lkKTsKIAkJLyogVEJEIFhYWCAtIGlmIEZDUF9DTU5ELCBzZW5kIFBSTE8gKi8KIAkJZmNfZnJhbWVfZnJlZShmcCk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9LY29uZmlnIGIvZHJpdmVycy90dHkvaHZjL0tjb25maWcKaW5kZXggNmYyYzk4MC4uZTM3MTc1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL0tjb25maWcKKysrIGIvZHJpdmVycy90dHkvaHZjL0tjb25maWcKQEAgLTE5LDYgKzE5LDExIEBACiAJICBjb25zb2xlLiBUaGlzIGRyaXZlciBhbGxvd3MgZWFjaCBwU2VyaWVzIHBhcnRpdGlvbiB0byBoYXZlIGEgY29uc29sZQogCSAgd2hpY2ggaXMgYWNjZXNzZWQgdmlhIHRoZSBITUMuCiAKK2NvbmZpZyBIVkNfT0xEX0hWU0kKKwlib29sICJPbGQgZHJpdmVyIGZvciBwU2VyaWVzIHNlcmlhbCBwb3J0ICgvZGV2L2h2c2kqKSIKKwlkZXBlbmRzIG9uIEhWQ19DT05TT0xFCisJZGVmYXVsdCBuCisKIGNvbmZpZyBIVkNfSVNFUklFUwogCWJvb2wgImlTZXJpZXMgSHlwZXJ2aXNvciBWaXJ0dWFsIENvbnNvbGUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBQQ19JU0VSSUVTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9odmMvTWFrZWZpbGUgYi9kcml2ZXJzL3R0eS9odmMvTWFrZWZpbGUKaW5kZXggNDBhMjVkOS4uZTI5MjA1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdHR5L2h2Yy9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKLW9iai0kKENPTkZJR19IVkNfQ09OU09MRSkJKz0gaHZjX3Zpby5vIGh2c2kubworb2JqLSQoQ09ORklHX0hWQ19DT05TT0xFKQkrPSBodmNfdmlvLm8gaHZzaV9saWIubworb2JqLSQoQ09ORklHX0hWQ19PTERfSFZTSSkJKz0gaHZzaS5vCiBvYmotJChDT05GSUdfSFZDX0lTRVJJRVMpCSs9IGh2Y19pc2VyaWVzLm8KIG9iai0kKENPTkZJR19IVkNfUlRBUykJCSs9IGh2Y19ydGFzLm8KIG9iai0kKENPTkZJR19IVkNfVElMRSkJCSs9IGh2Y190aWxlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfY29uc29sZS5jIGIvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKaW5kZXggZTljYmExMy4uZTFhYWY0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKKysrIGIvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTE2Myw4ICsxNjQsMTAgQEAKIAkJfSBlbHNlIHsKIAkJCXIgPSBjb25zX29wc1tpbmRleF0tPnB1dF9jaGFycyh2dGVybW5vc1tpbmRleF0sIGMsIGkpOwogCQkJaWYgKHIgPD0gMCkgewotCQkJCS8qIHRocm93IGF3YXkgY2hhcnMgb24gZXJyb3IgKi8KLQkJCQlpID0gMDsKKwkJCQkvKiB0aHJvdyBhd2F5IGNoYXJhY3RlcnMgb24gZXJyb3IKKwkJCQkgKiBidXQgc3BpbiBpbiBjYXNlIG9mIC1FQUdBSU4gKi8KKwkJCQlpZiAociAhPSAtRUFHQUlOKQorCQkJCQlpID0gMDsKIAkJCX0gZWxzZSBpZiAociA+IDApIHsKIAkJCQlpIC09IHI7CiAJCQkJaWYgKGkgPiAwKQpAQCAtMTg0LDcgKzE4Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGh2Y19jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKLXsKK3sJCiAJaWYgKGNvLT5pbmRleCA8IDAgfHwgY28tPmluZGV4ID49IE1BWF9OUl9IVkNfQ09OU09MRVMpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC00NDgsNyArNDUxLDcgQEAKIAogCW4gPSBocC0+b3BzLT5wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIGhwLT5vdXRidWYsIGhwLT5uX291dGJ1Zik7CiAJaWYgKG4gPD0gMCkgewotCQlpZiAobiA9PSAwKSB7CisJCWlmIChuID09IDAgfHwgbiA9PSAtRUFHQUlOKSB7CiAJCQlocC0+ZG9fd2FrZXVwID0gMTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC03NDUsNiArNzQ4LDU4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaHZjX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghaHAgfHwgIWhwLT5vcHMtPnRpb2NtZ2V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gaHAtPm9wcy0+dGlvY21nZXQoaHApOworfQorCitzdGF0aWMgaW50IGh2Y190aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIWhwIHx8ICFocC0+b3BzLT50aW9jbXNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGhwLT5vcHMtPnRpb2Ntc2V0KGhwLCBzZXQsIGNsZWFyKTsKK30KKworI2lmZGVmIENPTkZJR19DT05TT0xFX1BPTEwKK2ludCBodmNfcG9sbF9pbml0KHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBsaW5lLCBjaGFyICpvcHRpb25zKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh2Y19wb2xsX2dldF9jaGFyKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBsaW5lKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBkcml2ZXItPnR0eXNbMF07CisJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgbjsKKwljaGFyIGNoOworCisJbiA9IGhwLT5vcHMtPmdldF9jaGFycyhocC0+dnRlcm1ubywgJmNoLCAxKTsKKworCWlmIChuID09IDApCisJCXJldHVybiBOT19QT0xMX0NIQVI7CisKKwlyZXR1cm4gY2g7Cit9CisKK3N0YXRpYyB2b2lkIGh2Y19wb2xsX3B1dF9jaGFyKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBsaW5lLCBjaGFyIGNoKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBkcml2ZXItPnR0eXNbMF07CisJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgbjsKKworCWRvIHsKKwkJbiA9IGhwLT5vcHMtPnB1dF9jaGFycyhocC0+dnRlcm1ubywgJmNoLCAxKTsKKwl9IHdoaWxlIChuIDw9IDApOworfQorI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgaHZjX29wcyA9IHsKIAkub3BlbiA9IGh2Y19vcGVuLAogCS5jbG9zZSA9IGh2Y19jbG9zZSwKQEAgLTc1Myw2ICs4MDgsMTMgQEAKIAkudW50aHJvdHRsZSA9IGh2Y191bnRocm90dGxlLAogCS53cml0ZV9yb29tID0gaHZjX3dyaXRlX3Jvb20sCiAJLmNoYXJzX2luX2J1ZmZlciA9IGh2Y19jaGFyc19pbl9idWZmZXIsCisJLnRpb2NtZ2V0ID0gaHZjX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IGh2Y190aW9jbXNldCwKKyNpZmRlZiBDT05GSUdfQ09OU09MRV9QT0xMCisJLnBvbGxfaW5pdCA9IGh2Y19wb2xsX2luaXQsCisJLnBvbGxfZ2V0X2NoYXIgPSBodmNfcG9sbF9nZXRfY2hhciwKKwkucG9sbF9wdXRfY2hhciA9IGh2Y19wb2xsX3B1dF9jaGFyLAorI2VuZGlmCiB9OwogCiBzdHJ1Y3QgaHZjX3N0cnVjdCAqaHZjX2FsbG9jKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBkYXRhLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmggYi9kcml2ZXJzL3R0eS9odmMvaHZjX2NvbnNvbGUuaAppbmRleCA1NDM4MWViYS4uYzMzNWExNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmgKKysrIGIvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmgKQEAgLTczLDYgKzczLDEwIEBACiAJaW50ICgqbm90aWZpZXJfYWRkKShzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIGludCBpcnEpOwogCXZvaWQgKCpub3RpZmllcl9kZWwpKHN0cnVjdCBodmNfc3RydWN0ICpocCwgaW50IGlycSk7CiAJdm9pZCAoKm5vdGlmaWVyX2hhbmd1cCkoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwLCBpbnQgaXJxKTsKKworCS8qIHRpb2NtZ2V0L3NldCBpbXBsZW1lbnRhdGlvbiAqLworCWludCAoKnRpb2NtZ2V0KShzdHJ1Y3QgaHZjX3N0cnVjdCAqaHApOworCWludCAoKnRpb2Ntc2V0KShzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CiB9OwogCiAvKiBSZWdpc3RlciBhIHZ0ZXJtIGFuZCBhIHNsb3QgaW5kZXggZm9yIHVzZSBhcyBhIGNvbnNvbGUgKGNvbnNvbGVfaW5pdCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfdmlvLmMgYi9kcml2ZXJzL3R0eS9odmMvaHZjX3Zpby5jCmluZGV4IGU2ZWVhMTQuLjEzMGFhY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfdmlvLmMKKysrIGIvZHJpdmVycy90dHkvaHZjL2h2Y192aW8uYwpAQCAtMjcsMTUgKzI3LDI3IEBACiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqIFRPRE86CisgKgorICogICAtIGhhbmRsZSBlcnJvciBpbiBzZW5kaW5nIGh2c2kgcHJvdG9jb2wgcGFja2V0cworICogICAtIHJldHJ5IG5lZ28gb24gc3Vic2VxdWVudCBzZW5kcyA/CiAgKi8KIAorI3VuZGVmIERFQlVHCisKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAKICNpbmNsdWRlIDxhc20vaHZjb25zb2xlLmg+CiAjaW5jbHVkZSA8YXNtL3Zpby5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8YXNtL2h2c2kuaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgogCiAjaW5jbHVkZSAiaHZjX2NvbnNvbGUuaCIKIApAQCAtNDMsNTkgKzU1LDIzNiBAQAogCiBzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgaHZjX2RyaXZlcl90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyJzZXJpYWwiLCAiaHZ0ZXJtMSJ9LAorI2lmbmRlZiBIVkNfT0xEX0hWU0kKKwl7InNlcmlhbCIsICJodnRlcm0tcHJvdG9jb2wifSwKKyNlbmRpZgogCXsgIiIsICIiIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgaHZjX2RyaXZlcl90YWJsZSk7CiAKLXN0YXRpYyBpbnQgZmlsdGVyZWRfZ2V0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQordHlwZWRlZiBlbnVtIGh2X3Byb3RvY29sIHsKKwlIVl9QUk9UT0NPTF9SQVcsCisJSFZfUFJPVE9DT0xfSFZTSQorfSBodl9wcm90b2NvbF90OworCitzdHJ1Y3QgaHZ0ZXJtX3ByaXYgeworCXUzMgkJCXRlcm1ubzsJLyogSFYgdGVybSBudW1iZXIgKi8KKwlodl9wcm90b2NvbF90CQlwcm90bzsJLyogUmF3IGRhdGEgb3IgSFZTSSBwYWNrZXRzICovCisJc3RydWN0IGh2c2lfcHJpdglodnNpOwkvKiBIVlNJIHNwZWNpZmljIGRhdGEgKi8KKwlzcGlubG9ja190CQlidWZfbG9jazsKKwljaGFyCQkJYnVmW1NJWkVfVklPX0dFVF9DSEFSU107CisJaW50CQkJbGVmdDsKKwlpbnQJCQlvZmZzZXQ7Cit9Oworc3RhdGljIHN0cnVjdCBodnRlcm1fcHJpdiAqaHZ0ZXJtX3ByaXZzW01BWF9OUl9IVkNfQ09OU09MRVNdOworLyogRm9yIGVhcmx5IGJvb3QgY29uc29sZSAqLworc3RhdGljIHN0cnVjdCBodnRlcm1fcHJpdiBodnRlcm1fcHJpdjA7CisKK3N0YXRpYyBpbnQgaHZ0ZXJtX3Jhd19nZXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7Ci0JdW5zaWduZWQgbG9uZyBnb3Q7Ci0JaW50IGk7CisJc3RydWN0IGh2dGVybV9wcml2ICpwdiA9IGh2dGVybV9wcml2c1t2dGVybW5vXTsKKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZ290OwogCi0JLyoKLQkgKiBWaW8gZmlybXdhcmUgd2lsbCByZWFkIHVwIHRvIFNJWkVfVklPX0dFVF9DSEFSUyBhdCBpdHMgb3duIGRpc2NyZXRpb24KLQkgKiBzbyB3ZSBwbGF5IHNhZmUgYW5kIGF2b2lkIHRoZSBzaXR1YXRpb24gd2hlcmUgZ290ID4gY291bnQgd2hpY2ggY291bGQKLQkgKiBvdmVybG9hZCB0aGUgZmxpcCBidWZmZXIuCi0JICovCi0JaWYgKGNvdW50IDwgU0laRV9WSU9fR0VUX0NIQVJTKQotCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAoV0FSTl9PTighcHYpKQorCQlyZXR1cm4gMDsKIAotCWdvdCA9IGh2Y19nZXRfY2hhcnModnRlcm1ubywgYnVmLCBjb3VudCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnB2LT5idWZfbG9jaywgZmxhZ3MpOwogCi0JLyoKLQkgKiBXb3JrIGFyb3VuZCBhIEhWIGJ1ZyB3aGVyZSBpdCBnaXZlcyB1cyBhIG51bGwKLQkgKiBhZnRlciBldmVyeSBcci4gIC0tIHBhdWx1cwotCSAqLwotCWZvciAoaSA9IDE7IGkgPCBnb3Q7ICsraSkgewotCQlpZiAoYnVmW2ldID09IDAgJiYgYnVmW2ktMV0gPT0gJ1xyJykgewotCQkJLS1nb3Q7Ci0JCQlpZiAoaSA8IGdvdCkKLQkJCQltZW1tb3ZlKCZidWZbaV0sICZidWZbaSsxXSwKLQkJCQkJZ290IC0gaSk7CisJaWYgKHB2LT5sZWZ0ID09IDApIHsKKwkJcHYtPm9mZnNldCA9IDA7CisJCXB2LT5sZWZ0ID0gaHZjX2dldF9jaGFycyhwdi0+dGVybW5vLCBwdi0+YnVmLCBjb3VudCk7CisKKwkJLyoKKwkJICogV29yayBhcm91bmQgYSBIViBidWcgd2hlcmUgaXQgZ2l2ZXMgdXMgYSBudWxsCisJCSAqIGFmdGVyIGV2ZXJ5IFxyLiAgLS0gcGF1bHVzCisJCSAqLworCQlmb3IgKGkgPSAxOyBpIDwgcHYtPmxlZnQ7ICsraSkgeworCQkJaWYgKHB2LT5idWZbaV0gPT0gMCAmJiBwdi0+YnVmW2ktMV0gPT0gJ1xyJykgeworCQkJCS0tcHYtPmxlZnQ7CisJCQkJaWYgKGkgPCBwdi0+bGVmdCkgeworCQkJCQltZW1tb3ZlKCZwdi0+YnVmW2ldLCAmcHYtPmJ1ZltpKzFdLAorCQkJCQkJcHYtPmxlZnQgLSBpKTsKKwkJCQl9CisJCQl9CiAJCX0KIAl9CisKKwlnb3QgPSBtaW4oY291bnQsIHB2LT5sZWZ0KTsKKwltZW1jcHkoYnVmLCAmcHYtPmJ1Zltwdi0+b2Zmc2V0XSwgZ290KTsKKwlwdi0+b2Zmc2V0ICs9IGdvdDsKKwlwdi0+bGVmdCAtPSBnb3Q7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwdi0+YnVmX2xvY2ssIGZsYWdzKTsKKwogCXJldHVybiBnb3Q7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfb3BzIGh2Y19nZXRfcHV0X29wcyA9IHsKLQkuZ2V0X2NoYXJzID0gZmlsdGVyZWRfZ2V0X2NoYXJzLAotCS5wdXRfY2hhcnMgPSBodmNfcHV0X2NoYXJzLAorc3RhdGljIGludCBodnRlcm1fcmF3X3B1dF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaHZ0ZXJtX3ByaXYgKnB2ID0gaHZ0ZXJtX3ByaXZzW3Z0ZXJtbm9dOworCisJaWYgKFdBUk5fT04oIXB2KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaHZjX3B1dF9jaGFycyhwdi0+dGVybW5vLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBodl9vcHMgaHZ0ZXJtX3Jhd19vcHMgPSB7CisJLmdldF9jaGFycyA9IGh2dGVybV9yYXdfZ2V0X2NoYXJzLAorCS5wdXRfY2hhcnMgPSBodnRlcm1fcmF3X3B1dF9jaGFycywKIAkubm90aWZpZXJfYWRkID0gbm90aWZpZXJfYWRkX2lycSwKIAkubm90aWZpZXJfZGVsID0gbm90aWZpZXJfZGVsX2lycSwKIAkubm90aWZpZXJfaGFuZ3VwID0gbm90aWZpZXJfaGFuZ3VwX2lycSwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGh2Y192aW9fcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsCi0JCQkJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBodnRlcm1faHZzaV9nZXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7CisJc3RydWN0IGh2dGVybV9wcml2ICpwdiA9IGh2dGVybV9wcml2c1t2dGVybW5vXTsKKworCWlmIChXQVJOX09OKCFwdikpCisJCXJldHVybiAwOworCisJcmV0dXJuIGh2c2lsaWJfZ2V0X2NoYXJzKCZwdi0+aHZzaSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgaHZ0ZXJtX2h2c2lfcHV0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBodnRlcm1fcHJpdiAqcHYgPSBodnRlcm1fcHJpdnNbdnRlcm1ub107CisKKwlpZiAoV0FSTl9PTighcHYpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBodnNpbGliX3B1dF9jaGFycygmcHYtPmh2c2ksIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW50IGh2dGVybV9odnNpX29wZW4oc3RydWN0IGh2Y19zdHJ1Y3QgKmhwLCBpbnQgZGF0YSkKK3sKKwlzdHJ1Y3QgaHZ0ZXJtX3ByaXYgKnB2ID0gaHZ0ZXJtX3ByaXZzW2hwLT52dGVybW5vXTsKKwlpbnQgcmM7CisKKwlwcl9kZXZlbCgiSFZTSUAleDogb3BlbiAhXG4iLCBwdi0+dGVybW5vKTsKKworCXJjID0gbm90aWZpZXJfYWRkX2lycShocCwgZGF0YSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gaHZzaWxpYl9vcGVuKCZwdi0+aHZzaSwgaHApOworfQorCitzdGF0aWMgdm9pZCBodnRlcm1faHZzaV9jbG9zZShzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIGludCBkYXRhKQoreworCXN0cnVjdCBodnRlcm1fcHJpdiAqcHYgPSBodnRlcm1fcHJpdnNbaHAtPnZ0ZXJtbm9dOworCisJcHJfZGV2ZWwoIkhWU0lAJXg6IGRvIGNsb3NlICFcbiIsIHB2LT50ZXJtbm8pOworCisJaHZzaWxpYl9jbG9zZSgmcHYtPmh2c2ksIGhwKTsKKworCW5vdGlmaWVyX2RlbF9pcnEoaHAsIGRhdGEpOworfQorCit2b2lkIGh2dGVybV9odnNpX2hhbmd1cChzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIGludCBkYXRhKQoreworCXN0cnVjdCBodnRlcm1fcHJpdiAqcHYgPSBodnRlcm1fcHJpdnNbaHAtPnZ0ZXJtbm9dOworCisJcHJfZGV2ZWwoIkhWU0lAJXg6IGRvIGhhbmd1cCAhXG4iLCBwdi0+dGVybW5vKTsKKworCWh2c2lsaWJfY2xvc2UoJnB2LT5odnNpLCBocCk7CisKKwlub3RpZmllcl9oYW5ndXBfaXJxKGhwLCBkYXRhKTsKK30KKworc3RhdGljIGludCBodnRlcm1faHZzaV90aW9jbWdldChzdHJ1Y3QgaHZjX3N0cnVjdCAqaHApCit7CisJc3RydWN0IGh2dGVybV9wcml2ICpwdiA9IGh2dGVybV9wcml2c1tocC0+dnRlcm1ub107CisKKwlpZiAoIXB2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcHYtPmh2c2kubWN0cmw7Cit9CisKK3N0YXRpYyBpbnQgaHZ0ZXJtX2h2c2lfdGlvY21zZXQoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwLCB1bnNpZ25lZCBpbnQgc2V0LAorCQkJCXVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgaHZ0ZXJtX3ByaXYgKnB2ID0gaHZ0ZXJtX3ByaXZzW2hwLT52dGVybW5vXTsKKworCXByX2RldmVsKCJIVlNJQCV4OiBTZXQgbW9kZW0gY29udHJvbCwgc2V0PSV4LGNscj0leFxuIiwKKwkJIHB2LT50ZXJtbm8sIHNldCwgY2xlYXIpOworCisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJaHZzaWxpYl93cml0ZV9tY3RybCgmcHYtPmh2c2ksIDEpOworCWVsc2UgaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlodnNpbGliX3dyaXRlX21jdHJsKCZwdi0+aHZzaSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBodl9vcHMgaHZ0ZXJtX2h2c2lfb3BzID0geworCS5nZXRfY2hhcnMgPSBodnRlcm1faHZzaV9nZXRfY2hhcnMsCisJLnB1dF9jaGFycyA9IGh2dGVybV9odnNpX3B1dF9jaGFycywKKwkubm90aWZpZXJfYWRkID0gaHZ0ZXJtX2h2c2lfb3BlbiwKKwkubm90aWZpZXJfZGVsID0gaHZ0ZXJtX2h2c2lfY2xvc2UsCisJLm5vdGlmaWVyX2hhbmd1cCA9IGh2dGVybV9odnNpX2hhbmd1cCwKKwkudGlvY21nZXQgPSBodnRlcm1faHZzaV90aW9jbWdldCwKKwkudGlvY21zZXQgPSBodnRlcm1faHZzaV90aW9jbXNldCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGh2Y192aW9fcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCWNvbnN0IHN0cnVjdCBodl9vcHMgKm9wczsKIAlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHA7CisJc3RydWN0IGh2dGVybV9wcml2ICpwdjsKKwlodl9wcm90b2NvbF90IHByb3RvOworCWludCBpLCB0ZXJtbm8gPSAtMTsKIAogCS8qIHByb2JlZCB3aXRoIGludmFsaWQgcGFyYW1ldGVycy4gKi8KIAlpZiAoIXZkZXYgfHwgIWlkKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaHAgPSBodmNfYWxsb2ModmRldi0+dW5pdF9hZGRyZXNzLCB2ZGV2LT5pcnEsICZodmNfZ2V0X3B1dF9vcHMsCi0JCQlNQVhfVklPX1BVVF9DSEFSUyk7CisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHZkZXYtPmRldi5vZl9ub2RlLCAiaHZ0ZXJtMSIpKSB7CisJCXByb3RvID0gSFZfUFJPVE9DT0xfUkFXOworCQlvcHMgPSAmaHZ0ZXJtX3Jhd19vcHM7CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZSh2ZGV2LT5kZXYub2Zfbm9kZSwgImh2dGVybS1wcm90b2NvbCIpKSB7CisJCXByb3RvID0gSFZfUFJPVE9DT0xfSFZTSTsKKwkJb3BzID0gJmh2dGVybV9odnNpX29wczsKKwl9IGVsc2UgeworCQlwcl9lcnIoImh2Y192aW86IFVua293biBwcm90b2NvbCBmb3IgJXNcbiIsIHZkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXByX2RldmVsKCJodmNfdmlvX3Byb2JlKCkgZGV2aWNlICVzLCB1c2luZyAlcyBwcm90b2NvbFxuIiwKKwkJIHZkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUsCisJCSBwcm90byA9PSBIVl9QUk9UT0NPTF9SQVcgPyAicmF3IiA6ICJodnNpIik7CisKKwkvKiBJcyBpdCBvdXIgYm9vdCBvbmUgPyAqLworCWlmIChodnRlcm1fcHJpdnNbMF0gPT0gJmh2dGVybV9wcml2MCAmJgorCSAgICB2ZGV2LT51bml0X2FkZHJlc3MgPT0gaHZ0ZXJtX3ByaXYwLnRlcm1ubykgeworCQlwdiA9IGh2dGVybV9wcml2c1swXTsKKwkJdGVybW5vID0gMDsKKwkJcHJfZGV2ZWwoIi0+Ym9vdCBjb25zb2xlLCB1c2luZyB0ZXJtbm8gMFxuIik7CisJfQorCS8qIG5vcGUsIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0hWQ19DT05TT0xFUyAmJiB0ZXJtbm8gPCAwOyBpKyspCisJCQlpZiAoIWh2dGVybV9wcml2c1tpXSkKKwkJCQl0ZXJtbm8gPSBpOworCQlwcl9kZXZlbCgiLT5ub24tYm9vdCBjb25zb2xlLCB1c2luZyB0ZXJtbm8gJWRcbiIsIHRlcm1ubyk7CisJCWlmICh0ZXJtbm8gPCAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXB2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGh2dGVybV9wcml2KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcHYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcHYtPnRlcm1ubyA9IHZkZXYtPnVuaXRfYWRkcmVzczsKKwkJcHYtPnByb3RvID0gcHJvdG87CisJCXNwaW5fbG9ja19pbml0KCZwdi0+YnVmX2xvY2spOworCQlodnRlcm1fcHJpdnNbdGVybW5vXSA9IHB2OworCQlodnNpbGliX2luaXQoJnB2LT5odnNpLCBodmNfZ2V0X2NoYXJzLCBodmNfcHV0X2NoYXJzLAorCQkJICAgICBwdi0+dGVybW5vLCAwKTsKKwl9CisKKwlocCA9IGh2Y19hbGxvYyh0ZXJtbm8sIHZkZXYtPmlycSwgb3BzLCBNQVhfVklPX1BVVF9DSEFSUyk7CiAJaWYgKElTX0VSUihocCkpCiAJCXJldHVybiBQVFJfRVJSKGhwKTsKIAlkZXZfc2V0X2RydmRhdGEoJnZkZXYtPmRldiwgaHApOwpAQCAtMTA2LDggKzI5NSwxNiBAQAogc3RhdGljIGludCBfX2RldmV4aXQgaHZjX3Zpb19yZW1vdmUoc3RydWN0IHZpb19kZXYgKnZkZXYpCiB7CiAJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwID0gZGV2X2dldF9kcnZkYXRhKCZ2ZGV2LT5kZXYpOworCWludCByYywgdGVybW5vOwogCi0JcmV0dXJuIGh2Y19yZW1vdmUoaHApOworCXRlcm1ubyA9IGhwLT52dGVybW5vOworCXJjID0gaHZjX3JlbW92ZShocCk7CisJaWYgKHJjID09IDApIHsKKwkJaWYgKGh2dGVybV9wcml2c1t0ZXJtbm9dICE9ICZodnRlcm1fcHJpdjApCisJCQlrZnJlZShodnRlcm1fcHJpdnNbdGVybW5vXSk7CisJCWh2dGVybV9wcml2c1t0ZXJtbm9dID0gTlVMTDsKKwl9CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgaHZjX3Zpb19kcml2ZXIgPSB7CkBAIC0xNDAsMzQgKzMzNywxNDkgQEAKIH0KIG1vZHVsZV9leGl0KGh2Y192aW9fZXhpdCk7CiAKLS8qIHRoZSBkZXZpY2UgdHJlZSBvcmRlciBkZWZpbmVzIG91ciBudW1iZXJpbmcgKi8KLXN0YXRpYyBpbnQgaHZjX2ZpbmRfdnR5cyh2b2lkKQorc3RhdGljIHZvaWQgdWRiZ19odmNfcHV0YyhjaGFyIGMpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICp2dHk7Ci0JaW50IG51bV9mb3VuZCA9IDA7CisJaW50IGNvdW50ID0gLTE7CiAKLQlmb3IgKHZ0eSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2dHkiKTsgdnR5ICE9IE5VTEw7Ci0JCQl2dHkgPSBvZl9maW5kX25vZGVfYnlfbmFtZSh2dHksICJ2dHkiKSkgewotCQljb25zdCB1aW50MzJfdCAqdnRlcm1ubzsKKwlpZiAoYyA9PSAnXG4nKQorCQl1ZGJnX2h2Y19wdXRjKCdccicpOwogCi0JCS8qIFdlIGhhdmUgc3RhdGljYWxseSBkZWZpbmVkIHNwYWNlIGZvciBvbmx5IGEgY2VydGFpbiBudW1iZXIKLQkJICogb2YgY29uc29sZSBhZGFwdGVycy4KLQkJICovCi0JCWlmIChudW1fZm91bmQgPj0gTUFYX05SX0hWQ19DT05TT0xFUykgewotCQkJb2Zfbm9kZV9wdXQodnR5KTsKKwlkbyB7CisJCXN3aXRjaChodnRlcm1fcHJpdjAucHJvdG8pIHsKKwkJY2FzZSBIVl9QUk9UT0NPTF9SQVc6CisJCQljb3VudCA9IGh2dGVybV9yYXdfcHV0X2NoYXJzKDAsICZjLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIEhWX1BST1RPQ09MX0hWU0k6CisJCQljb3VudCA9IGh2dGVybV9odnNpX3B1dF9jaGFycygwLCAmYywgMSk7CiAJCQlicmVhazsKIAkJfQorCX0gd2hpbGUoY291bnQgPT0gMCk7Cit9CiAKLQkJdnRlcm1ubyA9IG9mX2dldF9wcm9wZXJ0eSh2dHksICJyZWciLCBOVUxMKTsKLQkJaWYgKCF2dGVybW5vKQotCQkJY29udGludWU7CitzdGF0aWMgaW50IHVkYmdfaHZjX2dldGNfcG9sbCh2b2lkKQoreworCWludCByYyA9IDA7CisJY2hhciBjOwogCi0JCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZSh2dHksICJodnRlcm0xIikpIHsKLQkJCWh2Y19pbnN0YW50aWF0ZSgqdnRlcm1ubywgbnVtX2ZvdW5kLCAmaHZjX2dldF9wdXRfb3BzKTsKLQkJCSsrbnVtX2ZvdW5kOworCXN3aXRjaChodnRlcm1fcHJpdjAucHJvdG8pIHsKKwljYXNlIEhWX1BST1RPQ09MX1JBVzoKKwkJcmMgPSBodnRlcm1fcmF3X2dldF9jaGFycygwLCAmYywgMSk7CisJCWJyZWFrOworCWNhc2UgSFZfUFJPVE9DT0xfSFZTSToKKwkJcmMgPSBodnRlcm1faHZzaV9nZXRfY2hhcnMoMCwgJmMsIDEpOworCQlicmVhazsKKwl9CisJaWYgKCFyYykKKwkJcmV0dXJuIC0xOworCXJldHVybiBjOworfQorCitzdGF0aWMgaW50IHVkYmdfaHZjX2dldGModm9pZCkKK3sKKwlpbnQgY2g7CisJZm9yICg7OykgeworCQljaCA9IHVkYmdfaHZjX2dldGNfcG9sbCgpOworCQlpZiAoY2ggPT0gLTEpIHsKKwkJCS8qIFRoaXMgc2hvdWxkbid0IGJlIG5lZWRlZC4uLmJ1dC4uLiAqLworCQkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBkZWxheTsKKwkJCWZvciAoZGVsYXk9MDsgZGVsYXkgPCAyMDAwMDAwOyBkZWxheSsrKQorCQkJCTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBjaDsKIAkJfQogCX0KLQotCXJldHVybiBudW1fZm91bmQ7CiB9Ci1jb25zb2xlX2luaXRjYWxsKGh2Y19maW5kX3Z0eXMpOworCit2b2lkIF9faW5pdCBodmNfdmlvX2luaXRfZWFybHkodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnN0ZG91dF9ub2RlOworCWNvbnN0IHUzMiAqdGVybW5vOworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3Qgc3RydWN0IGh2X29wcyAqb3BzOworCisJLyogZmluZCB0aGUgYm9vdCBjb25zb2xlIGZyb20gL2Nob3Nlbi9zdGRvdXQgKi8KKwlpZiAoIW9mX2Nob3NlbikKKwkJcmV0dXJuOworCW5hbWUgPSBvZl9nZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsc3Rkb3V0LXBhdGgiLCBOVUxMKTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm47CisJc3Rkb3V0X25vZGUgPSBvZl9maW5kX25vZGVfYnlfcGF0aChuYW1lKTsKKwlpZiAoIXN0ZG91dF9ub2RlKQorCQlyZXR1cm47CisJbmFtZSA9IG9mX2dldF9wcm9wZXJ0eShzdGRvdXRfbm9kZSwgIm5hbWUiLCBOVUxMKTsKKwlpZiAoIW5hbWUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic3Rkb3V0IG5vZGUgbWlzc2luZyAnbmFtZScgcHJvcGVydHkhXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2hlY2sgaWYgaXQncyBhIHZpcnR1YWwgdGVybWluYWwgKi8KKwlpZiAoc3RybmNtcChuYW1lLCAidnR5IiwgMykgIT0gMCkKKwkJZ290byBvdXQ7CisJdGVybW5vID0gb2ZfZ2V0X3Byb3BlcnR5KHN0ZG91dF9ub2RlLCAicmVnIiwgTlVMTCk7CisJaWYgKHRlcm1ubyA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlodnRlcm1fcHJpdjAudGVybW5vID0gKnRlcm1ubzsKKwlzcGluX2xvY2tfaW5pdCgmaHZ0ZXJtX3ByaXYwLmJ1Zl9sb2NrKTsKKwlodnRlcm1fcHJpdnNbMF0gPSAmaHZ0ZXJtX3ByaXYwOworCisJLyogQ2hlY2sgdGhlIHByb3RvY29sICovCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHN0ZG91dF9ub2RlLCAiaHZ0ZXJtMSIpKSB7CisJCWh2dGVybV9wcml2MC5wcm90byA9IEhWX1BST1RPQ09MX1JBVzsKKwkJb3BzID0gJmh2dGVybV9yYXdfb3BzOworCX0KKwllbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzdGRvdXRfbm9kZSwgImh2dGVybS1wcm90b2NvbCIpKSB7CisJCWh2dGVybV9wcml2MC5wcm90byA9IEhWX1BST1RPQ09MX0hWU0k7CisJCW9wcyA9ICZodnRlcm1faHZzaV9vcHM7CisJCWh2c2lsaWJfaW5pdCgmaHZ0ZXJtX3ByaXYwLmh2c2ksIGh2Y19nZXRfY2hhcnMsIGh2Y19wdXRfY2hhcnMsCisJCQkgICAgIGh2dGVybV9wcml2MC50ZXJtbm8sIDEpOworCQkvKiBIVlNJLCBwZXJmb3JtIHRoZSBoYW5kc2hha2Ugbm93ICovCisJCWh2c2lsaWJfZXN0YWJsaXNoKCZodnRlcm1fcHJpdjAuaHZzaSk7CisJfSBlbHNlCisJCWdvdG8gb3V0OworCXVkYmdfcHV0YyA9IHVkYmdfaHZjX3B1dGM7CisJdWRiZ19nZXRjID0gdWRiZ19odmNfZ2V0YzsKKwl1ZGJnX2dldGNfcG9sbCA9IHVkYmdfaHZjX2dldGNfcG9sbDsKKyNpZmRlZiBIVkNfT0xEX0hWU0kKKwkvKiBXaGVuIHVzaW5nIHRoZSBvbGQgSFZTSSBkcml2ZXIgZG9uJ3QgcmVnaXN0ZXIgdGhlIEhWQworCSAqIGJhY2tlbmQgZm9yIEhWU0ksIG9ubHkgZG8gdWRiZworCSAqLworCWlmIChodnRlcm1fcHJpdjAucHJvdG8gPT0gSFZfUFJPVE9DT0xfSFZTSSkKKwkJZ290byBvdXQ7CisjZW5kaWYKKwlhZGRfcHJlZmVycmVkX2NvbnNvbGUoImh2YyIsIDAsIE5VTEwpOworCWh2Y19pbnN0YW50aWF0ZSgwLCAwLCBvcHMpOworb3V0OgorCW9mX25vZGVfcHV0KHN0ZG91dF9ub2RlKTsKK30KKworLyogY2FsbCB0aGlzIGZyb20gZWFybHlfaW5pdCgpIGZvciBhIHdvcmtpbmcgZGVidWcgY29uc29sZSBvbgorICogdnRlcm0gY2FwYWJsZSBMUEFSIG1hY2hpbmVzCisgKi8KKyNpZmRlZiBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0xQQVIKK3ZvaWQgX19pbml0IHVkYmdfaW5pdF9kZWJ1Z19scGFyKHZvaWQpCit7CisJaHZ0ZXJtX3ByaXZzWzBdID0gJmh2dGVybV9wcml2MDsKKwlodnRlcm1fcHJpdjAudGVybW5vID0gMDsKKwlodnRlcm1fcHJpdjAucHJvdG8gPSBIVl9QUk9UT0NPTF9SQVc7CisJc3Bpbl9sb2NrX2luaXQoJmh2dGVybV9wcml2MC5idWZfbG9jayk7CisJdWRiZ19wdXRjID0gdWRiZ19odmNfcHV0YzsKKwl1ZGJnX2dldGMgPSB1ZGJnX2h2Y19nZXRjOworCXVkYmdfZ2V0Y19wb2xsID0gdWRiZ19odmNfZ2V0Y19wb2xsOworfQorI2VuZGlmIC8qIENPTkZJR19QUENfRUFSTFlfREVCVUdfTFBBUiAqLworCisjaWZkZWYgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSX0hWU0kKK3ZvaWQgX19pbml0IHVkYmdfaW5pdF9kZWJ1Z19scGFyX2h2c2kodm9pZCkKK3sKKwlodnRlcm1fcHJpdnNbMF0gPSAmaHZ0ZXJtX3ByaXYwOworCWh2dGVybV9wcml2MC50ZXJtbm8gPSBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0hWU0lfVlRFUk1OTzsKKwlodnRlcm1fcHJpdjAucHJvdG8gPSBIVl9QUk9UT0NPTF9IVlNJOworCXNwaW5fbG9ja19pbml0KCZodnRlcm1fcHJpdjAuYnVmX2xvY2spOworCXVkYmdfcHV0YyA9IHVkYmdfaHZjX3B1dGM7CisJdWRiZ19nZXRjID0gdWRiZ19odmNfZ2V0YzsKKwl1ZGJnX2dldGNfcG9sbCA9IHVkYmdfaHZjX2dldGNfcG9sbDsKKwlodnNpbGliX2luaXQoJmh2dGVybV9wcml2MC5odnNpLCBodmNfZ2V0X2NoYXJzLCBodmNfcHV0X2NoYXJzLAorCQkgICAgIGh2dGVybV9wcml2MC50ZXJtbm8sIDEpOworCWh2c2lsaWJfZXN0YWJsaXNoKCZodnRlcm1fcHJpdjAuaHZzaSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSX0hWU0kgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9odnNpLmMgYi9kcml2ZXJzL3R0eS9odmMvaHZzaS5jCmluZGV4IDhhOGQ2MzcuLmM5NGUyZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L2h2Yy9odnNpLmMKKysrIGIvZHJpdmVycy90dHkvaHZjL2h2c2kuYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3Zpby5oPgogI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorI2luY2x1ZGUgPGFzbS9odnNpLmg+CiAKICNkZWZpbmUgSFZTSV9NQUpPUgkyMjkKICNkZWZpbmUgSFZTSV9NSU5PUgkxMjgKQEAgLTEwOSw2OCArMTEwLDYgQEAKIH07CiAjZGVmaW5lIEhWU0lfQ09OU09MRSAweDEKIAotI2RlZmluZSBWU19EQVRBX1BBQ0tFVF9IRUFERVIgICAgICAgICAgIDB4ZmYKLSNkZWZpbmUgVlNfQ09OVFJPTF9QQUNLRVRfSEVBREVSICAgICAgICAweGZlCi0jZGVmaW5lIFZTX1FVRVJZX1BBQ0tFVF9IRUFERVIgICAgICAgICAgMHhmZAotI2RlZmluZSBWU19RVUVSWV9SRVNQT05TRV9QQUNLRVRfSEVBREVSIDB4ZmMKLQotLyogY29udHJvbCB2ZXJicyAqLwotI2RlZmluZSBWU1ZfU0VUX01PREVNX0NUTCAgICAxIC8qIHRvIHNlcnZpY2UgcHJvY2Vzc29yIG9ubHkgKi8KLSNkZWZpbmUgVlNWX01PREVNX0NUTF9VUERBVEUgMiAvKiBmcm9tIHNlcnZpY2UgcHJvY2Vzc29yIG9ubHkgKi8KLSNkZWZpbmUgVlNWX0NMT1NFX1BST1RPQ09MICAgMwotCi0vKiBxdWVyeSB2ZXJicyAqLwotI2RlZmluZSBWU1ZfU0VORF9WRVJTSU9OX05VTUJFUiAxCi0jZGVmaW5lIFZTVl9TRU5EX01PREVNX0NUTF9TVEFUVVMgMgotCi0vKiB5ZXMsIHRoZXNlIG1hc2tzIGFyZSBub3QgY29uc2VjdXRpdmUuICovCi0jZGVmaW5lIEhWU0lfVFNEVFIgMHgwMQotI2RlZmluZSBIVlNJX1RTQ0QgIDB4MjAKLQotc3RydWN0IGh2c2lfaGVhZGVyIHsKLQl1aW50OF90ICB0eXBlOwotCXVpbnQ4X3QgIGxlbjsKLQl1aW50MTZfdCBzZXFubzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBodnNpX2RhdGEgewotCXVpbnQ4X3QgIHR5cGU7Ci0JdWludDhfdCAgbGVuOwotCXVpbnQxNl90IHNlcW5vOwotCXVpbnQ4X3QgIGRhdGFbSFZTSV9NQVhfT1VUR09JTkdfREFUQV07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaHZzaV9jb250cm9sIHsKLQl1aW50OF90ICB0eXBlOwotCXVpbnQ4X3QgIGxlbjsKLQl1aW50MTZfdCBzZXFubzsKLQl1aW50MTZfdCB2ZXJiOwotCS8qIG9wdGlvbmFsIGRlcGVuZGluZyBvbiB2ZXJiOiAqLwotCXVpbnQzMl90IHdvcmQ7Ci0JdWludDMyX3QgbWFzazsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBodnNpX3F1ZXJ5IHsKLQl1aW50OF90ICB0eXBlOwotCXVpbnQ4X3QgIGxlbjsKLQl1aW50MTZfdCBzZXFubzsKLQl1aW50MTZfdCB2ZXJiOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGh2c2lfcXVlcnlfcmVzcG9uc2UgewotCXVpbnQ4X3QgIHR5cGU7Ci0JdWludDhfdCAgbGVuOwotCXVpbnQxNl90IHNlcW5vOwotCXVpbnQxNl90IHZlcmI7Ci0JdWludDE2X3QgcXVlcnlfc2Vxbm87Ci0JdW5pb24gewotCQl1aW50OF90ICB2ZXJzaW9uOwotCQl1aW50MzJfdCBtY3RybF93b3JkOwotCX0gdTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLQotCiBzdGF0aWMgaW5saW5lIGludCBpc19jb25zb2xlKHN0cnVjdCBodnNpX3N0cnVjdCAqaHApCiB7CiAJcmV0dXJuIGhwLT5mbGFncyAmIEhWU0lfQ09OU09MRTsKQEAgLTM1NiwxOCArMjk1LDE4IEBACiAJc3RydWN0IGh2c2lfcXVlcnlfcmVzcG9uc2UgcGFja2V0IF9fQUxJR05FRF9fOwogCWludCB3cm90ZTsKIAotCXBhY2tldC50eXBlID0gVlNfUVVFUllfUkVTUE9OU0VfUEFDS0VUX0hFQURFUjsKLQlwYWNrZXQubGVuID0gc2l6ZW9mKHN0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlKTsKLQlwYWNrZXQuc2Vxbm8gPSBhdG9taWNfaW5jX3JldHVybigmaHAtPnNlcW5vKTsKKwlwYWNrZXQuaGRyLnR5cGUgPSBWU19RVUVSWV9SRVNQT05TRV9QQUNLRVRfSEVBREVSOworCXBhY2tldC5oZHIubGVuID0gc2l6ZW9mKHN0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlKTsKKwlwYWNrZXQuaGRyLnNlcW5vID0gYXRvbWljX2luY19yZXR1cm4oJmhwLT5zZXFubyk7CiAJcGFja2V0LnZlcmIgPSBWU1ZfU0VORF9WRVJTSU9OX05VTUJFUjsKIAlwYWNrZXQudS52ZXJzaW9uID0gSFZTSV9WRVJTSU9OOwogCXBhY2tldC5xdWVyeV9zZXFubyA9IHF1ZXJ5X3NlcW5vKzE7CiAKLQlwcl9kZWJ1ZygiJXM6IHNlbmRpbmcgJWkgYnl0ZXNcbiIsIF9fZnVuY19fLCBwYWNrZXQubGVuKTsKLQlkYmdfZHVtcF9oZXgoKHVpbnQ4X3QqKSZwYWNrZXQsIHBhY2tldC5sZW4pOworCXByX2RlYnVnKCIlczogc2VuZGluZyAlaSBieXRlc1xuIiwgX19mdW5jX18sIHBhY2tldC5oZHIubGVuKTsKKwlkYmdfZHVtcF9oZXgoKHVpbnQ4X3QqKSZwYWNrZXQsIHBhY2tldC5oZHIubGVuKTsKIAotCXdyb3RlID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQubGVuKTsKLQlpZiAod3JvdGUgIT0gcGFja2V0LmxlbikgeworCXdyb3RlID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQuaGRyLmxlbik7CisJaWYgKHdyb3RlICE9IHBhY2tldC5oZHIubGVuKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiBjb3VsZG4ndCBzZW5kIHF1ZXJ5IHJlc3BvbnNlIVxuIiwKIAkJCWhwLT5pbmRleCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMzgyLDcgKzMyMSw3IEBACiAKIAlzd2l0Y2ggKGhwLT5zdGF0ZSkgewogCQljYXNlIEhWU0lfV0FJVF9GT1JfVkVSX1FVRVJZOgotCQkJaHZzaV92ZXJzaW9uX3Jlc3BvbmQoaHAsIHF1ZXJ5LT5zZXFubyk7CisJCQlodnNpX3ZlcnNpb25fcmVzcG9uZChocCwgcXVlcnktPmhkci5zZXFubyk7CiAJCQlfX3NldF9zdGF0ZShocCwgSFZTSV9PUEVOKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtNjQwLDE2ICs1NzksMTYgQEAKIAlzdHJ1Y3QgaHZzaV9xdWVyeSBwYWNrZXQgX19BTElHTkVEX187CiAJaW50IHdyb3RlOwogCi0JcGFja2V0LnR5cGUgPSBWU19RVUVSWV9QQUNLRVRfSEVBREVSOwotCXBhY2tldC5sZW4gPSBzaXplb2Yoc3RydWN0IGh2c2lfcXVlcnkpOwotCXBhY2tldC5zZXFubyA9IGF0b21pY19pbmNfcmV0dXJuKCZocC0+c2Vxbm8pOworCXBhY2tldC5oZHIudHlwZSA9IFZTX1FVRVJZX1BBQ0tFVF9IRUFERVI7CisJcGFja2V0Lmhkci5sZW4gPSBzaXplb2Yoc3RydWN0IGh2c2lfcXVlcnkpOworCXBhY2tldC5oZHIuc2Vxbm8gPSBhdG9taWNfaW5jX3JldHVybigmaHAtPnNlcW5vKTsKIAlwYWNrZXQudmVyYiA9IHZlcmI7CiAKLQlwcl9kZWJ1ZygiJXM6IHNlbmRpbmcgJWkgYnl0ZXNcbiIsIF9fZnVuY19fLCBwYWNrZXQubGVuKTsKLQlkYmdfZHVtcF9oZXgoKHVpbnQ4X3QqKSZwYWNrZXQsIHBhY2tldC5sZW4pOworCXByX2RlYnVnKCIlczogc2VuZGluZyAlaSBieXRlc1xuIiwgX19mdW5jX18sIHBhY2tldC5oZHIubGVuKTsKKwlkYmdfZHVtcF9oZXgoKHVpbnQ4X3QqKSZwYWNrZXQsIHBhY2tldC5oZHIubGVuKTsKIAotCXdyb3RlID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQubGVuKTsKLQlpZiAod3JvdGUgIT0gcGFja2V0LmxlbikgeworCXdyb3RlID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQuaGRyLmxlbik7CisJaWYgKHdyb3RlICE9IHBhY2tldC5oZHIubGVuKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaHZzaSVpOiBjb3VsZG4ndCBzZW5kIHF1ZXJ5ICglaSkhXG4iLCBocC0+aW5kZXgsCiAJCQl3cm90ZSk7CiAJCXJldHVybiAtRUlPOwpAQCAtNjgzLDIwICs2MjIsMjAgQEAKIAlzdHJ1Y3QgaHZzaV9jb250cm9sIHBhY2tldCBfX0FMSUdORURfXzsKIAlpbnQgd3JvdGU7CiAKLQlwYWNrZXQudHlwZSA9IFZTX0NPTlRST0xfUEFDS0VUX0hFQURFUiwKLQlwYWNrZXQuc2Vxbm8gPSBhdG9taWNfaW5jX3JldHVybigmaHAtPnNlcW5vKTsKLQlwYWNrZXQubGVuID0gc2l6ZW9mKHN0cnVjdCBodnNpX2NvbnRyb2wpOworCXBhY2tldC5oZHIudHlwZSA9IFZTX0NPTlRST0xfUEFDS0VUX0hFQURFUiwKKwlwYWNrZXQuaGRyLnNlcW5vID0gYXRvbWljX2luY19yZXR1cm4oJmhwLT5zZXFubyk7CisJcGFja2V0Lmhkci5sZW4gPSBzaXplb2Yoc3RydWN0IGh2c2lfY29udHJvbCk7CiAJcGFja2V0LnZlcmIgPSBWU1ZfU0VUX01PREVNX0NUTDsKIAlwYWNrZXQubWFzayA9IEhWU0lfVFNEVFI7CiAKIAlpZiAobWN0cmwgJiBUSU9DTV9EVFIpCiAJCXBhY2tldC53b3JkID0gSFZTSV9UU0RUUjsKIAotCXByX2RlYnVnKCIlczogc2VuZGluZyAlaSBieXRlc1xuIiwgX19mdW5jX18sIHBhY2tldC5sZW4pOwotCWRiZ19kdW1wX2hleCgodWludDhfdCopJnBhY2tldCwgcGFja2V0Lmxlbik7CisJcHJfZGVidWcoIiVzOiBzZW5kaW5nICVpIGJ5dGVzXG4iLCBfX2Z1bmNfXywgcGFja2V0Lmhkci5sZW4pOworCWRiZ19kdW1wX2hleCgodWludDhfdCopJnBhY2tldCwgcGFja2V0Lmhkci5sZW4pOwogCi0Jd3JvdGUgPSBodmNfcHV0X2NoYXJzKGhwLT52dGVybW5vLCAoY2hhciAqKSZwYWNrZXQsIHBhY2tldC5sZW4pOwotCWlmICh3cm90ZSAhPSBwYWNrZXQubGVuKSB7CisJd3JvdGUgPSBodmNfcHV0X2NoYXJzKGhwLT52dGVybW5vLCAoY2hhciAqKSZwYWNrZXQsIHBhY2tldC5oZHIubGVuKTsKKwlpZiAod3JvdGUgIT0gcGFja2V0Lmhkci5sZW4pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJodnNpJWk6IGNvdWxkbid0IHNldCBEVFIhXG4iLCBocC0+aW5kZXgpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC03NjYsMTMgKzcwNSwxMyBAQAogCiAJQlVHX09OKGNvdW50ID4gSFZTSV9NQVhfT1VUR09JTkdfREFUQSk7CiAKLQlwYWNrZXQudHlwZSA9IFZTX0RBVEFfUEFDS0VUX0hFQURFUjsKLQlwYWNrZXQuc2Vxbm8gPSBhdG9taWNfaW5jX3JldHVybigmaHAtPnNlcW5vKTsKLQlwYWNrZXQubGVuID0gY291bnQgKyBzaXplb2Yoc3RydWN0IGh2c2lfaGVhZGVyKTsKKwlwYWNrZXQuaGRyLnR5cGUgPSBWU19EQVRBX1BBQ0tFVF9IRUFERVI7CisJcGFja2V0Lmhkci5zZXFubyA9IGF0b21pY19pbmNfcmV0dXJuKCZocC0+c2Vxbm8pOworCXBhY2tldC5oZHIubGVuID0gY291bnQgKyBzaXplb2Yoc3RydWN0IGh2c2lfaGVhZGVyKTsKIAltZW1jcHkoJnBhY2tldC5kYXRhLCBidWYsIGNvdW50KTsKIAotCXJldCA9IGh2Y19wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIChjaGFyICopJnBhY2tldCwgcGFja2V0Lmxlbik7Ci0JaWYgKHJldCA9PSBwYWNrZXQubGVuKSB7CisJcmV0ID0gaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQuaGRyLmxlbik7CisJaWYgKHJldCA9PSBwYWNrZXQuaGRyLmxlbikgewogCQkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFycyB3cml0dGVuLCBub3QgdGhlIHBhY2tldCBsZW5ndGggKi8KIAkJcmV0dXJuIGNvdW50OwogCX0KQEAgLTc4MywxNSArNzIyLDE1IEBACiB7CiAJc3RydWN0IGh2c2lfY29udHJvbCBwYWNrZXQgX19BTElHTkVEX187CiAKLQlwYWNrZXQudHlwZSA9IFZTX0NPTlRST0xfUEFDS0VUX0hFQURFUjsKLQlwYWNrZXQuc2Vxbm8gPSBhdG9taWNfaW5jX3JldHVybigmaHAtPnNlcW5vKTsKLQlwYWNrZXQubGVuID0gNjsKKwlwYWNrZXQuaGRyLnR5cGUgPSBWU19DT05UUk9MX1BBQ0tFVF9IRUFERVI7CisJcGFja2V0Lmhkci5zZXFubyA9IGF0b21pY19pbmNfcmV0dXJuKCZocC0+c2Vxbm8pOworCXBhY2tldC5oZHIubGVuID0gNjsKIAlwYWNrZXQudmVyYiA9IFZTVl9DTE9TRV9QUk9UT0NPTDsKIAotCXByX2RlYnVnKCIlczogc2VuZGluZyAlaSBieXRlc1xuIiwgX19mdW5jX18sIHBhY2tldC5sZW4pOwotCWRiZ19kdW1wX2hleCgodWludDhfdCopJnBhY2tldCwgcGFja2V0Lmxlbik7CisJcHJfZGVidWcoIiVzOiBzZW5kaW5nICVpIGJ5dGVzXG4iLCBfX2Z1bmNfXywgcGFja2V0Lmhkci5sZW4pOworCWRiZ19kdW1wX2hleCgodWludDhfdCopJnBhY2tldCwgcGFja2V0Lmhkci5sZW4pOwogCi0JaHZjX3B1dF9jaGFycyhocC0+dnRlcm1ubywgKGNoYXIgKikmcGFja2V0LCBwYWNrZXQubGVuKTsKKwlodmNfcHV0X2NoYXJzKGhwLT52dGVybW5vLCAoY2hhciAqKSZwYWNrZXQsIHBhY2tldC5oZHIubGVuKTsKIH0KIAogc3RhdGljIGludCBodnNpX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9odmMvaHZzaV9saWIuYyBiL2RyaXZlcnMvdHR5L2h2Yy9odnNpX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWIwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3R0eS9odmMvaHZzaV9saWIuYwpAQCAtMCwwICsxLDQyNiBAQAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxhc20vaHZzaS5oPgorCisjaW5jbHVkZSAiaHZjX2NvbnNvbGUuaCIKKworc3RhdGljIGludCBodnNpX3NlbmRfcGFja2V0KHN0cnVjdCBodnNpX3ByaXYgKnB2LCBzdHJ1Y3QgaHZzaV9oZWFkZXIgKnBhY2tldCkKK3sKKwlwYWNrZXQtPnNlcW5vID0gYXRvbWljX2luY19yZXR1cm4oJnB2LT5zZXFubyk7CisKKwkvKiBBc3N1bWVzIHRoYXQgYWx3YXlzIHN1Y2NlZWRzLCB3b3JrcyBpbiBwcmFjdGljZSAqLworCXJldHVybiBwdi0+cHV0X2NoYXJzKHB2LT50ZXJtbm8sIChjaGFyICopcGFja2V0LCBwYWNrZXQtPmxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGh2c2lfc3RhcnRfaGFuZHNoYWtlKHN0cnVjdCBodnNpX3ByaXYgKnB2KQoreworCXN0cnVjdCBodnNpX3F1ZXJ5IHE7CisKKwkvKiBSZXNldCBzdGF0ZSAqLworCXB2LT5lc3RhYmxpc2hlZCA9IDA7CisJYXRvbWljX3NldCgmcHYtPnNlcW5vLCAwKTsKKworCXByX2RldmVsKCJIVlNJQCV4OiBIYW5kc2hha2luZyBzdGFydGVkXG4iLCBwdi0+dGVybW5vKTsKKworCS8qIFNlbmQgdmVyc2lvbiBxdWVyeSAqLworCXEuaGRyLnR5cGUgPSBWU19RVUVSWV9QQUNLRVRfSEVBREVSOworCXEuaGRyLmxlbiA9IHNpemVvZihzdHJ1Y3QgaHZzaV9xdWVyeSk7CisJcS52ZXJiID0gVlNWX1NFTkRfVkVSU0lPTl9OVU1CRVI7CisJaHZzaV9zZW5kX3BhY2tldChwdiwgJnEuaGRyKTsKK30KKworc3RhdGljIGludCBodnNpX3NlbmRfY2xvc2Uoc3RydWN0IGh2c2lfcHJpdiAqcHYpCit7CisJc3RydWN0IGh2c2lfY29udHJvbCBjdHJsOworCisJcHYtPmVzdGFibGlzaGVkID0gMDsKKworCWN0cmwuaGRyLnR5cGUgPSBWU19DT05UUk9MX1BBQ0tFVF9IRUFERVI7CisJY3RybC5oZHIubGVuID0gc2l6ZW9mKHN0cnVjdCBodnNpX2NvbnRyb2wpOworCWN0cmwudmVyYiA9IFZTVl9DTE9TRV9QUk9UT0NPTDsKKwlyZXR1cm4gaHZzaV9zZW5kX3BhY2tldChwdiwgJmN0cmwuaGRyKTsKK30KKworc3RhdGljIHZvaWQgaHZzaV9jZF9jaGFuZ2Uoc3RydWN0IGh2c2lfcHJpdiAqcHYsIGludCBjZCkKK3sKKwlpZiAoY2QpCisJCXB2LT5tY3RybCB8PSBUSU9DTV9DRDsKKwllbHNlIHsKKwkJcHYtPm1jdHJsICY9IH5USU9DTV9DRDsKKworCQkvKiBXZSBjb3B5IHRoZSBleGlzdGluZyBodnNpIGRyaXZlciBzZW1hbnRpY3MKKwkJICogaGVyZSB3aGljaCBhcmUgdG8gdHJpZ2dlciBhIGhhbmd1cCB3aGVuCisJCSAqIHdlIGdldCBhIGNhcnJpZXIgbG9zcy4KKwkJICogQ2xvc2luZyBvdXIgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHdpbGwKKwkJICogZG8ganVzdCB0aGF0LgorCQkgKi8KKwkJaWYgKCFwdi0+aXNfY29uc29sZSAmJiBwdi0+b3BlbmVkKSB7CisJCQlwcl9kZXZlbCgiSFZTSUAleCBDYXJyaWVyIGxvc3QsIGhhbmdpbmcgdXAgIVxuIiwKKwkJCQkgcHYtPnRlcm1ubyk7CisJCQlodnNpX3NlbmRfY2xvc2UocHYpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBodnNpX2dvdF9jb250cm9sKHN0cnVjdCBodnNpX3ByaXYgKnB2KQoreworCXN0cnVjdCBodnNpX2NvbnRyb2wgKnBrdCA9IChzdHJ1Y3QgaHZzaV9jb250cm9sICopcHYtPmluYnVmOworCisJc3dpdGNoIChwa3QtPnZlcmIpIHsKKwljYXNlIFZTVl9DTE9TRV9QUk9UT0NPTDoKKwkJLyogV2UgcmVzdGFydCB0aGUgaGFuZHNoYWtpbmcgKi8KKwkJaHZzaV9zdGFydF9oYW5kc2hha2UocHYpOworCQlicmVhazsKKwljYXNlIFZTVl9NT0RFTV9DVExfVVBEQVRFOgorCQkvKiBUcmFuc2l0aW9uIG9mIGNhcnJpZXIgZGV0ZWN0ICovCisJCWh2c2lfY2RfY2hhbmdlKHB2LCBwa3QtPndvcmQgJiBIVlNJX1RTQ0QpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGh2c2lfZ290X3F1ZXJ5KHN0cnVjdCBodnNpX3ByaXYgKnB2KQoreworCXN0cnVjdCBodnNpX3F1ZXJ5ICpwa3QgPSAoc3RydWN0IGh2c2lfcXVlcnkgKilwdi0+aW5idWY7CisJc3RydWN0IGh2c2lfcXVlcnlfcmVzcG9uc2UgcjsKKworCS8qIFdlIG9ubHkgaGFuZGxlIHZlcnNpb24gcXVlcmllcyAqLworCWlmIChwa3QtPnZlcmIgIT0gVlNWX1NFTkRfVkVSU0lPTl9OVU1CRVIpCisJCXJldHVybjsKKworCXByX2RldmVsKCJIVlNJQCV4OiBHb3QgdmVyc2lvbiBxdWVyeSwgc2VuZGluZyByZXNwb25zZS4uLlxuIiwKKwkJIHB2LT50ZXJtbm8pOworCisJLyogU2VuZCB2ZXJzaW9uIHJlc3BvbnNlICovCisJci5oZHIudHlwZSA9IFZTX1FVRVJZX1JFU1BPTlNFX1BBQ0tFVF9IRUFERVI7CisJci5oZHIubGVuID0gc2l6ZW9mKHN0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlKTsKKwlyLnZlcmIgPSBWU1ZfU0VORF9WRVJTSU9OX05VTUJFUjsKKwlyLnUudmVyc2lvbiA9IEhWU0lfVkVSU0lPTjsKKwlyLnF1ZXJ5X3NlcW5vID0gcGt0LT5oZHIuc2Vxbm87CisJaHZzaV9zZW5kX3BhY2tldChwdiwgJnIuaGRyKTsKKworCS8qIEFzc3VtZSBwcm90b2NvbCBpcyBvcGVuIG5vdyAqLworCXB2LT5lc3RhYmxpc2hlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGh2c2lfZ290X3Jlc3BvbnNlKHN0cnVjdCBodnNpX3ByaXYgKnB2KQoreworCXN0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlICpyID0KKwkJKHN0cnVjdCBodnNpX3F1ZXJ5X3Jlc3BvbnNlICopcHYtPmluYnVmOworCisJc3dpdGNoKHItPnZlcmIpIHsKKwljYXNlIFZTVl9TRU5EX01PREVNX0NUTF9TVEFUVVM6CisJCWh2c2lfY2RfY2hhbmdlKHB2LCByLT51Lm1jdHJsX3dvcmQgJiBIVlNJX1RTQ0QpOworCQlwdi0+bWN0cmxfdXBkYXRlID0gMTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGh2c2lfY2hlY2tfcGFja2V0KHN0cnVjdCBodnNpX3ByaXYgKnB2KQoreworCXU4IGxlbiwgdHlwZTsKKworCS8qIENoZWNrIGhlYWRlciB2YWxpZGl0eS4gSWYgaXQncyBpbnZhbGlkLCB3ZSBkaXRjaAorCSAqIHRoZSB3aG9sZSBidWZmZXIgYW5kIGhvcGUgd2UgZXZlbnR1YWxseSByZXN5bmMKKwkgKi8KKwlpZiAocHYtPmluYnVmWzBdIDwgMHhmYykgeworCQlwdi0+aW5idWZfbGVuID0gcHYtPmluYnVmX3BrdGxlbiA9IDA7CisJCXJldHVybiAwOworCX0KKwl0eXBlID0gcHYtPmluYnVmWzBdOworCWxlbiA9IHB2LT5pbmJ1ZlsxXTsKKworCS8qIFBhY2tldCBpbmNvbXBsZXRlID8gKi8KKwlpZiAocHYtPmluYnVmX2xlbiA8IGxlbikKKwkJcmV0dXJuIDA7CisKKwlwcl9kZXZlbCgiSFZTSUAleDogR290IHBhY2tldCB0eXBlICV4IGxlbiAlZCBieXRlczpcbiIsCisJCSBwdi0+dGVybW5vLCB0eXBlLCBsZW4pOworCisJLyogV2UgaGF2ZSBhIHBhY2tldCwgeWF5ICEgSGFuZGxlIGl0ICovCisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIFZTX0RBVEFfUEFDS0VUX0hFQURFUjoKKwkJcHYtPmluYnVmX3BrdGxlbiA9IGxlbiAtIDQ7CisJCXB2LT5pbmJ1Zl9jdXIgPSA0OworCQlyZXR1cm4gMTsKKwljYXNlIFZTX0NPTlRST0xfUEFDS0VUX0hFQURFUjoKKwkJaHZzaV9nb3RfY29udHJvbChwdik7CisJCWJyZWFrOworCWNhc2UgVlNfUVVFUllfUEFDS0VUX0hFQURFUjoKKwkJaHZzaV9nb3RfcXVlcnkocHYpOworCQlicmVhazsKKwljYXNlIFZTX1FVRVJZX1JFU1BPTlNFX1BBQ0tFVF9IRUFERVI6CisJCWh2c2lfZ290X3Jlc3BvbnNlKHB2KTsKKwkJYnJlYWs7CisJfQorCisJLyogU3dhbGxvdyBwYWNrZXQgYW5kIHJldHJ5ICovCisJcHYtPmluYnVmX2xlbiAtPSBsZW47CisJbWVtbW92ZShwdi0+aW5idWYsICZwdi0+aW5idWZbbGVuXSwgcHYtPmluYnVmX2xlbik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaHZzaV9nZXRfcGFja2V0KHN0cnVjdCBodnNpX3ByaXYgKnB2KQoreworCS8qIElmIHdlIGhhdmUgcm9vbSBpbiB0aGUgYnVmZmVyLCBhc2sgSFYgZm9yIG1vcmUgKi8KKwlpZiAocHYtPmluYnVmX2xlbiA8IEhWU0lfSU5CVUZfU0laRSkKKwkJcHYtPmluYnVmX2xlbiArPSBwdi0+Z2V0X2NoYXJzKHB2LT50ZXJtbm8sCisJCQkJCSAgICAgJnB2LT5pbmJ1Zltwdi0+aW5idWZfbGVuXSwKKwkJCQkJICAgICBIVlNJX0lOQlVGX1NJWkUgLSBwdi0+aW5idWZfbGVuKTsKKwkvKgorCSAqIElmIHdlIGhhdmUgYXQgbGVhc3QgNCBieXRlcyBpbiB0aGUgYnVmZmVyLCBjaGVjayBmb3IKKwkgKiBhIGZ1bGwgcGFja2V0IGFuZCByZXRyeQorCSAqLworCWlmIChwdi0+aW5idWZfbGVuID49IDQpCisJCXJldHVybiBodnNpX2NoZWNrX3BhY2tldChwdik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBodnNpbGliX2dldF9jaGFycyhzdHJ1Y3QgaHZzaV9wcml2ICpwdiwgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgaW50IHRyaWVzLCByZWFkID0gMDsKKworCWlmIChXQVJOX09OKCFwdikpCisJCXJldHVybiAwOworCisJLyogSWYgd2UgYXJlbid0IG9wZW4sIGRvbid0IGRvIGFueXRoaW5nIGluIG9yZGVyIHRvIGF2b2lkIHJhY2VzCisJICogd2l0aCBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQuIFRoZSBodmMgY29yZSB3aWxsIGNhbGwgdGhpcworCSAqIGJlZm9yZSB3ZSBoYXZlIHJldHVybmVkIGZyb20gbm90aWZpZXJfYWRkKCksIGFuZCB3ZSBuZWVkIHRvCisJICogYXZvaWQgbXVsdGlwbGUgdXNlcnMgcGxheWluZyB3aXRoIHRoZSByZWNlaXZlIGJ1ZmZlcgorCSAqLworCWlmICghcHYtPm9wZW5lZCkKKwkJcmV0dXJuIDA7CisKKwkvKiBXZSB0cnkgdHdpY2UsIG9uY2Ugd2l0aCB3aGF0IGRhdGEgd2UgaGF2ZSBhbmQgb25jZSBtb3JlCisJICogYWZ0ZXIgd2UgdHJ5IHRvIGZldGNoIHNvbWUgbW9yZSBmcm9tIHRoZSBoeXBlcnZpc29yCisJICovCisJZm9yICh0cmllcyA9IDE7IGNvdW50ICYmIHRyaWVzIDwgMjsgdHJpZXMrKykgeworCQkvKiBDb25zdW1lIGV4aXN0aW5nIGRhdGEgcGFja2V0ICovCisJCWlmIChwdi0+aW5idWZfcGt0bGVuKSB7CisJCQl1bnNpZ25lZCBpbnQgbCA9IG1pbihjb3VudCwgKGludClwdi0+aW5idWZfcGt0bGVuKTsKKwkJCW1lbWNweSgmYnVmW3JlYWRdLCAmcHYtPmluYnVmW3B2LT5pbmJ1Zl9jdXJdLCBsKTsKKwkJCXB2LT5pbmJ1Zl9jdXIgKz0gbDsKKwkJCXB2LT5pbmJ1Zl9wa3RsZW4gLT0gbDsKKwkJCWNvdW50IC09IGw7CisJCQlyZWFkICs9IGw7CisJCX0KKwkJaWYgKGNvdW50ID09IDApCisJCQlicmVhazsKKworCQkvKiBEYXRhIHBhY2tldCBmdWxseSBjb25zdW1lZCwgbW92ZSBkb3duIHJlbWFuaW5nIGRhdGEgKi8KKwkJaWYgKHB2LT5pbmJ1Zl9jdXIpIHsKKwkJCXB2LT5pbmJ1Zl9sZW4gLT0gcHYtPmluYnVmX2N1cjsKKwkJCW1lbW1vdmUocHYtPmluYnVmLCAmcHYtPmluYnVmW3B2LT5pbmJ1Zl9jdXJdLAorCQkJCXB2LT5pbmJ1Zl9sZW4pOworCQkJcHYtPmluYnVmX2N1ciA9IDA7CisJCX0KKworCQkvKiBUcnkgdG8gZ2V0IGFub3RoZXIgcGFja2V0ICovCisJCWlmIChodnNpX2dldF9wYWNrZXQocHYpKQorCQkJdHJpZXMtLTsKKwl9CisJaWYgKCFwdi0+ZXN0YWJsaXNoZWQpIHsKKwkJcHJfZGV2ZWwoIkhWU0lAJXg6IHJldHVybmluZyAtRVBJUEVcbiIsIHB2LT50ZXJtbm8pOworCQlyZXR1cm4gLUVQSVBFOworCX0KKwlyZXR1cm4gcmVhZDsKK30KKworaW50IGh2c2lsaWJfcHV0X2NoYXJzKHN0cnVjdCBodnNpX3ByaXYgKnB2LCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaHZzaV9kYXRhIGRwOworCWludCByYywgYWRqY291bnQgPSBtaW4oY291bnQsIEhWU0lfTUFYX09VVEdPSU5HX0RBVEEpOworCisJaWYgKFdBUk5fT04oIXB2KSkKKwkJcmV0dXJuIDA7CisKKwlkcC5oZHIudHlwZSA9IFZTX0RBVEFfUEFDS0VUX0hFQURFUjsKKwlkcC5oZHIubGVuID0gYWRqY291bnQgKyBzaXplb2Yoc3RydWN0IGh2c2lfaGVhZGVyKTsKKwltZW1jcHkoZHAuZGF0YSwgYnVmLCBhZGpjb3VudCk7CisJcmMgPSBodnNpX3NlbmRfcGFja2V0KHB2LCAmZHAuaGRyKTsKKwlpZiAocmMgPD0gMCkKKwkJcmV0dXJuIHJjOworCXJldHVybiBhZGpjb3VudDsKK30KKworc3RhdGljIHZvaWQgbWF5YmVfbXNsZWVwKHVuc2lnbmVkIGxvbmcgbXMpCit7CisJLyogRHVyaW5nIGVhcmx5IGJvb3QsIElSUXMgYXJlIGRpc2FibGVkLCB1c2UgbWRlbGF5ICovCisJaWYgKGlycXNfZGlzYWJsZWQoKSkKKwkJbWRlbGF5KG1zKTsKKwllbHNlCisJCW1zbGVlcChtcyk7Cit9CisKK2ludCBodnNpbGliX3JlYWRfbWN0cmwoc3RydWN0IGh2c2lfcHJpdiAqcHYpCit7CisJc3RydWN0IGh2c2lfcXVlcnkgcTsKKwlpbnQgcmMsIHRpbWVvdXQ7CisKKwlwcl9kZXZlbCgiSFZTSUAleDogUXVlcnlpbmcgbW9kZW0gY29udHJvbCBzdGF0dXMuLi5cbiIsCisJCSBwdi0+dGVybW5vKTsKKworCXB2LT5tY3RybF91cGRhdGUgPSAwOworCXEuaGRyLnR5cGUgPSBWU19RVUVSWV9QQUNLRVRfSEVBREVSOworCXEuaGRyLmxlbiA9IHNpemVvZihzdHJ1Y3QgaHZzaV9xdWVyeSk7CisJcS5oZHIuc2Vxbm8gPSBhdG9taWNfaW5jX3JldHVybigmcHYtPnNlcW5vKTsKKwlxLnZlcmIgPSBWU1ZfU0VORF9NT0RFTV9DVExfU1RBVFVTOworCXJjID0gaHZzaV9zZW5kX3BhY2tldChwdiwgJnEuaGRyKTsKKwlpZiAocmMgPD0gMCkgeworCQlwcl9kZXZlbCgiSFZTSUAleDogRXJyb3IgJWQuLi5cbiIsIHB2LT50ZXJtbm8sIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFRyeSBmb3IgdXAgdG8gMjAwbXMgKi8KKwlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgMjA7IHRpbWVvdXQrKykgeworCQlpZiAoIXB2LT5lc3RhYmxpc2hlZCkKKwkJCXJldHVybiAtRU5YSU87CisJCWlmIChwdi0+bWN0cmxfdXBkYXRlKQorCQkJcmV0dXJuIDA7CisJCWlmICghaHZzaV9nZXRfcGFja2V0KHB2KSkKKwkJCW1heWJlX21zbGVlcCgxMCk7CisJfQorCXJldHVybiAtRUlPOworfQorCitpbnQgaHZzaWxpYl93cml0ZV9tY3RybChzdHJ1Y3QgaHZzaV9wcml2ICpwdiwgaW50IGR0cikKK3sKKwlzdHJ1Y3QgaHZzaV9jb250cm9sIGN0cmw7CisJdW5zaWduZWQgc2hvcnQgbWN0cmw7CisKKwltY3RybCA9IHB2LT5tY3RybDsKKwlpZiAoZHRyKQorCQltY3RybCB8PSBUSU9DTV9EVFI7CisJZWxzZQorCQltY3RybCAmPSB+VElPQ01fRFRSOworCWlmIChtY3RybCA9PSBwdi0+bWN0cmwpCisJCXJldHVybiAwOworCXB2LT5tY3RybCA9IG1jdHJsOworCisJcHJfZGV2ZWwoIkhWU0lAJXg6ICVzIERUUi4uLlxuIiwgcHYtPnRlcm1ubywKKwkJIGR0ciA/ICJTZXR0aW5nIiA6ICJDbGVhcmluZyIpOworCisJY3RybC5oZHIudHlwZSA9IFZTX0NPTlRST0xfUEFDS0VUX0hFQURFUiwKKwljdHJsLmhkci5sZW4gPSBzaXplb2Yoc3RydWN0IGh2c2lfY29udHJvbCk7CisJY3RybC52ZXJiID0gVlNWX1NFVF9NT0RFTV9DVEw7CisJY3RybC5tYXNrID0gSFZTSV9UU0RUUjsKKwljdHJsLndvcmQgPSBkdHIgPyBIVlNJX1RTRFRSIDogMDsKKwlyZXR1cm4gaHZzaV9zZW5kX3BhY2tldChwdiwgJmN0cmwuaGRyKTsKK30KKwordm9pZCBodnNpbGliX2VzdGFibGlzaChzdHJ1Y3QgaHZzaV9wcml2ICpwdikKK3sKKwlpbnQgdGltZW91dDsKKworCXByX2RldmVsKCJIVlNJQCV4OiBFc3RhYmxpc2hpbmcuLi5cbiIsIHB2LT50ZXJtbm8pOworCisJLyogVHJ5IGZvciB1cCB0byAyMDBtcywgdGhlcmUgY2FuIGJlIGEgcGFja2V0IHRvCisJICogc3RhcnQgdGhlIHByb2Nlc3Mgd2FpdGluZyBmb3IgdXMuLi4KKwkgKi8KKwlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgMjA7IHRpbWVvdXQrKykgeworCQlpZiAocHYtPmVzdGFibGlzaGVkKQorCQkJZ290byBlc3RhYmxpc2hlZDsKKwkJaWYgKCFodnNpX2dldF9wYWNrZXQocHYpKQorCQkJbWF5YmVfbXNsZWVwKDEwKTsKKwl9CisKKwkvKiBGYWlsZWQsIHNlbmQgYSBjbG9zZSBjb25uZWN0aW9uIHBhY2tldCBqdXN0CisJICogaW4gY2FzZQorCSAqLworCXByX2RldmVsKCJIVlNJQCV4OiAgIC4uLiBzZW5kaW5nIGNsb3NlXG4iLCBwdi0+dGVybW5vKTsKKworCWh2c2lfc2VuZF9jbG9zZShwdik7CisKKwkvKiBUaGVuIHJlc3RhcnQgaGFuZHNoYWtlICovCisKKwlwcl9kZXZlbCgiSFZTSUAleDogICAuLi4gcmVzdGFydGluZyBoYW5kc2hha2VcbiIsIHB2LT50ZXJtbm8pOworCisJaHZzaV9zdGFydF9oYW5kc2hha2UocHYpOworCisJcHJfZGV2ZWwoIkhWU0lAJXg6ICAgLi4uIHdhaXRpbmcgaGFuZHNoYWtlXG4iLCBwdi0+dGVybW5vKTsKKworCS8qIFRyeSBmb3IgdXAgdG8gMjAwcyAqLworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCAyMDsgdGltZW91dCsrKSB7CisJCWlmIChwdi0+ZXN0YWJsaXNoZWQpCisJCQlnb3RvIGVzdGFibGlzaGVkOworCQlpZiAoIWh2c2lfZ2V0X3BhY2tldChwdikpCisJCQltYXliZV9tc2xlZXAoMTApOworCX0KKworCWlmICghcHYtPmVzdGFibGlzaGVkKSB7CisJCXByX2RldmVsKCJIVlNJQCV4OiBUaW1lb3V0IGhhbmRzaGFraW5nLCBnaXZpbmcgdXAgIVxuIiwKKwkJCSBwdi0+dGVybW5vKTsKKwkJcmV0dXJuOworCX0KKyBlc3RhYmxpc2hlZDoKKwkvKiBRdWVyeSBtb2RlbSBjb250cm9sIGxpbmVzICovCisKKwlwcl9kZXZlbCgiSFZTSUAleDogICAuLi4gZXN0YWJsaXNoZWQsIHJlYWRpbmcgbWN0cmxcbiIsIHB2LT50ZXJtbm8pOworCisJaHZzaWxpYl9yZWFkX21jdHJsKHB2KTsKKworCS8qIFNldCBvdXIgb3duIERUUiAqLworCisJcHJfZGV2ZWwoIkhWU0lAJXg6ICAgLi4uIHNldHRpbmcgbWN0cmxcbiIsIHB2LT50ZXJtbm8pOworCisJaHZzaWxpYl93cml0ZV9tY3RybChwdiwgMSk7CisKKwkvKiBTZXQgdGhlIG9wZW5lZCBmbGFnIHNvIHJlYWRzIGFyZSBhbGxvd2VkICovCisJd21iKCk7CisJcHYtPm9wZW5lZCA9IDE7Cit9CisKK2ludCBodnNpbGliX29wZW4oc3RydWN0IGh2c2lfcHJpdiAqcHYsIHN0cnVjdCBodmNfc3RydWN0ICpocCkKK3sKKwlwcl9kZXZlbCgiSFZTSUAleDogb3BlbiAhXG4iLCBwdi0+dGVybW5vKTsKKworCS8qIEtlZXAgdHJhY2sgb2YgdGhlIHR0eSBkYXRhIHN0cnVjdHVyZSAqLworCXB2LT50dHkgPSB0dHlfa3JlZl9nZXQoaHAtPnR0eSk7CisKKwlodnNpbGliX2VzdGFibGlzaChwdik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBodnNpbGliX2Nsb3NlKHN0cnVjdCBodnNpX3ByaXYgKnB2LCBzdHJ1Y3QgaHZjX3N0cnVjdCAqaHApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByX2RldmVsKCJIVlNJQCV4OiBjbG9zZSAhXG4iLCBwdi0+dGVybW5vKTsKKworCWlmICghcHYtPmlzX2NvbnNvbGUpIHsKKwkJcHJfZGV2ZWwoIkhWU0lAJXg6IE5vdCBhIGNvbnNvbGUsIHRlYXJpbmcgZG93blxuIiwKKwkJCSBwdi0+dGVybW5vKTsKKworCQkvKiBDbGVhciBvcGVuZWQsIHN5bmNocm9uaXplIHdpdGgga2h2Y2QgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CisJCXB2LT5vcGVuZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOworCisJCS8qIENsZWFyIG91ciBvd24gRFRSICovCisJCWlmICghcHYtPnR0eSB8fCAocHYtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSkKKwkJCWh2c2lsaWJfd3JpdGVfbWN0cmwocHYsIDApOworCisJCS8qIFRlYXIgZG93biB0aGUgY29ubmVjdGlvbiAqLworCQlodnNpX3NlbmRfY2xvc2UocHYpOworCX0KKworCWlmIChwdi0+dHR5KQorCQl0dHlfa3JlZl9wdXQocHYtPnR0eSk7CisJcHYtPnR0eSA9IE5VTEw7Cit9CisKK3ZvaWQgaHZzaWxpYl9pbml0KHN0cnVjdCBodnNpX3ByaXYgKnB2LAorCQkgIGludCAoKmdldF9jaGFycykodWludDMyX3QgdGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCksCisJCSAgaW50ICgqcHV0X2NoYXJzKSh1aW50MzJfdCB0ZXJtbm8sIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICBpbnQgY291bnQpLAorCQkgIGludCB0ZXJtbm8sIGludCBpc19jb25zb2xlKQoreworCW1lbXNldChwdiwgMCwgc2l6ZW9mKCpwdikpOworCXB2LT5nZXRfY2hhcnMgPSBnZXRfY2hhcnM7CisJcHYtPnB1dF9jaGFycyA9IHB1dF9jaGFyczsKKwlwdi0+dGVybW5vID0gdGVybW5vOworCXB2LT5pc19jb25zb2xlID0gaXNfY29uc29sZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L25fZ3NtLmMgYi9kcml2ZXJzL3R0eS9uX2dzbS5jCmluZGV4IDE0NTIyZWUuLjhhNTBlNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L25fZ3NtLmMKKysrIGIvZHJpdmVycy90dHkvbl9nc20uYwpAQCAtOTA0LDcgKzkwNCw4IEBACiAJCSpkcCsrID0gbGFzdCA8PCA3IHwgZmlyc3QgPDwgNiB8IDE7CS8qIEVBICovCiAJCWxlbi0tOwogCX0KLQltZW1jcHkoZHAsIHNrYl9wdWxsKGRsY2ktPnNrYiwgbGVuKSwgbGVuKTsKKwltZW1jcHkoZHAsIGRsY2ktPnNrYi0+ZGF0YSwgbGVuKTsKKwlza2JfcHVsbChkbGNpLT5za2IsIGxlbik7CiAJX19nc21fZGF0YV9xdWV1ZShkbGNpLCBtc2cpOwogCWlmIChsYXN0KSB7CiAJCWtmcmVlX3NrYihkbGNpLT5za2IpOwpAQCAtMTAxOCwxMCArMTAxOSwyMiBAQAogICovCiAKIHN0YXRpYyB2b2lkIGdzbV9wcm9jZXNzX21vZGVtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBnc21fZGxjaSAqZGxjaSwKLQkJCQkJCQl1MzIgbW9kZW0pCisJCQkJCQkJdTMyIG1vZGVtLCBpbnQgY2xlbikKIHsKIAlpbnQgIG1saW5lcyA9IDA7Ci0JdTggYnJrID0gbW9kZW0gPj4gNjsKKwl1OCBicmsgPSAwOworCisJLyogVGhlIG1vZGVtIHN0YXR1cyBjb21tYW5kIGNhbiBlaXRoZXIgY29udGFpbiBvbmUgb2N0ZXQgKHYuMjQgc2lnbmFscykKKwkgICBvciB0d28gb2N0ZXRzICh2LjI0IHNpZ25hbHMgKyBicmVhayBzaWduYWxzKS4gVGhlIGxlbmd0aCBmaWVsZCB3aWxsCisJICAgZWl0aGVyIGJlIDIgb3IgMyByZXNwZWN0aXZlbHkuIFRoaXMgaXMgc3BlY2lmaWVkIGluIHNlY3Rpb24KKwkgICA1LjQuNi4zLjcgb2YgdGhlICAyNy4wMTAgbXV4IHNwZWMuICovCisKKwlpZiAoY2xlbiA9PSAyKQorCQltb2RlbSA9IG1vZGVtICYgMHg3ZjsKKwllbHNlIHsKKwkJYnJrID0gbW9kZW0gJiAweDdmOworCQltb2RlbSA9IChtb2RlbSA+PiA3KSAmIDB4N2Y7CisJfTsKIAogCS8qIEZsb3cgY29udHJvbC9yZWFkeSB0byBjb21tdW5pY2F0ZSAqLwogCWlmIChtb2RlbSAmIE1ETV9GQykgewpAQCAtMTA5NSw3ICsxMTA4LDcgQEAKIAkJCXJldHVybjsKIAl9CiAJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmZGxjaS0+cG9ydCk7Ci0JZ3NtX3Byb2Nlc3NfbW9kZW0odHR5LCBkbGNpLCBtb2RlbSk7CisJZ3NtX3Byb2Nlc3NfbW9kZW0odHR5LCBkbGNpLCBtb2RlbSwgY2xlbik7CiAJaWYgKHR0eSkgewogCQl0dHlfd2FrZXVwKHR0eSk7CiAJCXR0eV9rcmVmX3B1dCh0dHkpOwpAQCAtMTUxNiwxMiArMTUyOSwxMyBAQAogICoJb3BlbiB3ZSBzaG92ZWwgdGhlIGJpdHMgZG93biBpdCwgaWYgbm90IHdlIGRyb3AgdGhlbS4KICAqLwogCi1zdGF0aWMgdm9pZCBnc21fZGxjaV9kYXRhKHN0cnVjdCBnc21fZGxjaSAqZGxjaSwgdTggKmRhdGEsIGludCBsZW4pCitzdGF0aWMgdm9pZCBnc21fZGxjaV9kYXRhKHN0cnVjdCBnc21fZGxjaSAqZGxjaSwgdTggKmRhdGEsIGludCBjbGVuKQogewogCS8qIGtyZWZzIC4uICovCiAJc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gJmRsY2ktPnBvcnQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHR0eV9wb3J0X3R0eV9nZXQocG9ydCk7CiAJdW5zaWduZWQgaW50IG1vZGVtID0gMDsKKwlpbnQgbGVuID0gY2xlbjsKIAogCWlmIChkZWJ1ZyAmIDE2KQogCQlwcl9kZWJ1ZygiJWQgYnl0ZXMgZm9yIHR0eSAlcFxuIiwgbGVuLCB0dHkpOwpAQCAtMTU0MSw3ICsxNTU1LDcgQEAKIAkJCQlpZiAobGVuID09IDApCiAJCQkJCXJldHVybjsKIAkJCX0KLQkJCWdzbV9wcm9jZXNzX21vZGVtKHR0eSwgZGxjaSwgbW9kZW0pOworCQkJZ3NtX3Byb2Nlc3NfbW9kZW0odHR5LCBkbGNpLCBtb2RlbSwgY2xlbik7CiAJCS8qIExpbmUgc3RhdGUgd2lsbCBnbyB2aWEgRExDSSAwIGNvbnRyb2xzIG9ubHkgKi8KIAkJY2FzZSAxOgogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvbl90dHkuYyBiL2RyaXZlcnMvdHR5L25fdHR5LmMKaW5kZXggMWRkYzVkNy4uMzlkNmFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvbl90dHkuYworKysgYi9kcml2ZXJzL3R0eS9uX3R0eS5jCkBAIC0xODE1LDYgKzE4MTUsNyBAQAogCQkJLyogRklYTUU6IGRvZXMgbl90dHlfc2V0X3Jvb20gbmVlZCBsb2NraW5nID8gKi8KIAkJCW5fdHR5X3NldF9yb29tKHR0eSk7CiAJCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJCUJVR19PTighdHR5LT5yZWFkX2J1Zik7CiAJCQljb250aW51ZTsKIAkJfQogCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAuYwppbmRleCBmMTQyMmE2Li5mMmRmZWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLmMKQEAgLTMzMTgsNiArMzMxOCw3IEBACiAJCXVhcnQtPnBvcnQuZmxhZ3MgJj0gflVQRl9CT09UX0FVVE9DT05GOwogCQl1YXJ0LT5wb3J0LnR5cGUgPSBQT1JUX1VOS05PV047CiAJCXVhcnQtPnBvcnQuZGV2ID0gJnNlcmlhbDgyNTBfaXNhX2RldnMtPmRldjsKKwkJdWFydC0+Y2FwYWJpbGl0aWVzID0gdWFydF9jb25maWdbdWFydC0+cG9ydC50eXBlXS5mbGFnczsKIAkJdWFydF9hZGRfb25lX3BvcnQoJnNlcmlhbDgyNTBfcmVnLCAmdWFydC0+cG9ydCk7CiAJfSBlbHNlIHsKIAkJdWFydC0+cG9ydC5kZXYgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTBfcGNpLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MF9wY2kuYwppbmRleCBhZTIxODhjLi42Yjg4N2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MF9wY2kuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MF9wY2kuYwpAQCAtNzY5LDcgKzc2OSw3IEBACiAJbGVuID0gIHBjaV9yZXNvdXJjZV9sZW4ocHJpdi0+ZGV2LCBiYXIpOwogCXAgPSBpb3JlbWFwX25vY2FjaGUoYmFzZSwgbGVuKTsKIAotCS8qIGVuYWJsZSB0aGUgdHJhbnNjaWV2ZXIgKi8KKwkvKiBlbmFibGUgdGhlIHRyYW5zY2VpdmVyICovCiAJd3JpdGViKHJlYWRiKHAgKyBvZmZzZXQgKyBOSTg0MzBfUE9SVENPTikgfCBOSTg0MzBfUE9SVENPTl9UWFZSX0VOQUJMRSwKIAkgICAgICAgcCArIG9mZnNldCArIE5JODQzMF9QT1JUQ09OKTsKIApAQCAtMTA3MSw3ICsxMDcxLDcgQEAKIAogc3RhdGljIGludAogcGNpX29tZWdhcGNpX3NldHVwKHN0cnVjdCBzZXJpYWxfcHJpdmF0ZSAqcHJpdiwKLQkJICAgICAgc3RydWN0IHBjaXNlcmlhbF9ib2FyZCAqYm9hcmQsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lzZXJpYWxfYm9hcmQgKmJvYXJkLAogCQkgICAgICBzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgaWR4KQogewogCXJldHVybiBzZXR1cF9wb3J0KHByaXYsIHBvcnQsIDIsIGlkeCAqIDgsIDApOwpAQCAtMTA5Miw2ICsxMDkyLDE1IEBACiAJcmV0dXJuIHBjaV9kZWZhdWx0X3NldHVwKHByaXYsIGJvYXJkLCBwb3J0LCBpZHgpOwogfQogCitzdGF0aWMgaW50IHBjaV9lZzIwdF9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX1BDSF9VQVJUKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfUENIX1VBUlRfTU9EVUxFKQorCXJldHVybiAtRU5PREVWOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCiAvKiBUaGlzIHNob3VsZCBiZSBpbiBsaW51eC9wY2lfaWRzLmggKi8KICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TQlNNT0RVTEFSSU8JMHgxMjRCCiAjZGVmaW5lIFBDSV9TVUJWRU5ET1JfSURfU0JTTU9EVUxBUklPCTB4MTI0QgpAQCAtMTU0NSw2ICsxNTU0LDU2IEBACiAJCS5pbml0CQkJPSBwY2lfb3hzZW1pX3Rvcm5hZG9faW5pdCwKIAkJLnNldHVwCQk9IHBjaV9kZWZhdWx0X3NldHVwLAogCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkuZGV2aWNlICAgICAgICAgPSAweDg4MTEsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkuZGV2aWNlICAgICAgICAgPSAweDg4MTIsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkuZGV2aWNlICAgICAgICAgPSAweDg4MTMsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkuZGV2aWNlICAgICAgICAgPSAweDg4MTQsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSAweDEwREIsCisJCS5kZXZpY2UgICAgICAgICA9IDB4ODAyNywKKwkJLmluaXQJCT0gcGNpX2VnMjB0X2luaXQsCisJfSwKKwl7CisJCS52ZW5kb3IgICAgICAgICA9IDB4MTBEQiwKKwkJLmRldmljZSAgICAgICAgID0gMHg4MDI4LAorCQkuaW5pdAkJPSBwY2lfZWcyMHRfaW5pdCwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgICAgID0gMHgxMERCLAorCQkuZGV2aWNlICAgICAgICAgPSAweDgwMjksCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCisJeworCQkudmVuZG9yICAgICAgICAgPSAweDEwREIsCisJCS5kZXZpY2UgICAgICAgICA9IDB4ODAwQywKKwkJLmluaXQJCT0gcGNpX2VnMjB0X2luaXQsCisJfSwKKwl7CisJCS52ZW5kb3IgICAgICAgICA9IDB4MTBEQiwKKwkJLmRldmljZSAgICAgICAgID0gMHg4MDBELAorCQkuaW5pdAkJPSBwY2lfZWcyMHRfaW5pdCwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgICAgID0gMHgxMERCLAorCQkuZGV2aWNlICAgICAgICAgPSAweDgwMEQsCisJCS5pbml0CQk9IHBjaV9lZzIwdF9pbml0LAorCX0sCiAJLyoKIAkgKiBDcm9ueXggT21lZ2EgUENJIChQTFgtY2hpcCBiYXNlZCkKIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKaW5kZXggYjM2OTJlNi4uY2I0MGI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKQEAgLTQ1Nyw3ICs0NTcsNiBAQAogY29uZmlnIFNFUklBTF9TQU1TVU5HX1VBUlRTCiAJaW50CiAJZGVwZW5kcyBvbiBBUk0gJiYgUExBVF9TQU1TVU5HCi0JZGVmYXVsdCAyIGlmIEFSQ0hfUzNDMjQwMAogCWRlZmF1bHQgNiBpZiBBUkNIX1M1UDY0NTAKIAlkZWZhdWx0IDQgaWYgU0VSSUFMX1NBTVNVTkdfVUFSVFNfNAogCWRlZmF1bHQgMwpAQCAtNDg5LDEzICs0ODgsNiBAQAogCSAgeW91ciBib290IGxvYWRlciBhYm91dCBob3cgdG8gcGFzcyBvcHRpb25zIHRvIHRoZSBrZXJuZWwgYXQKIAkgIGJvb3QgdGltZS4pCiAKLWNvbmZpZyBTRVJJQUxfUzNDMjQwMAotCXRyaXN0YXRlICJTYW1zdW5nIFMzQzI0MTAgU2VyaWFsIHBvcnQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSTSAmJiBTRVJJQUxfU0FNU1VORyAmJiBDUFVfUzNDMjQwMAotCWRlZmF1bHQgeSBpZiBDUFVfUzNDMjQwMAotCWhlbHAKLQkgIFNlcmlhbCBwb3J0IHN1cHBvcnQgZm9yIHRoZSBTYW1zdW5nIFMzQzI0MDAgU29DCi0KIGNvbmZpZyBTRVJJQUxfUzNDMjQxMAogCXRyaXN0YXRlICJTYW1zdW5nIFMzQzI0MTAgU2VyaWFsIHBvcnQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNFUklBTF9TQU1TVU5HICYmIENQVV9TM0MyNDEwCkBAIC01MTksMTMgKzUxMSw2IEBACiAJaGVscAogCSAgU2VyaWFsIHBvcnQgc3VwcG9ydCBmb3IgdGhlIFNhbXN1bmcgUzNDMjQ0MCwgUzNDMjQxNiBhbmQgUzNDMjQ0MiBTb0MKIAotY29uZmlnIFNFUklBTF9TM0MyNEEwCi0JdHJpc3RhdGUgIlNhbXN1bmcgUzNDMjRBMCBTZXJpYWwgcG9ydCBzdXBwb3J0IgotCWRlcGVuZHMgb24gU0VSSUFMX1NBTVNVTkcgJiYgQ1BVX1MzQzI0QTAKLQlkZWZhdWx0IHkgaWYgQ1BVX1MzQzI0QTAKLQloZWxwCi0JICBTZXJpYWwgcG9ydCBzdXBwb3J0IGZvciB0aGUgU2Ftc3VuZyBTM0MyNEEwIFNvQwotCiBjb25maWcgU0VSSUFMX1MzQzY0MDAKIAl0cmlzdGF0ZSAiU2Ftc3VuZyBTM0M2NDAwL1MzQzY0MTAvUzVQNjQ0MC9TNVA2NDUwL1M1UEMxMDAgU2VyaWFsIHBvcnQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNFUklBTF9TQU1TVU5HICYmIChDUFVfUzNDNjQwMCB8fCBDUFVfUzNDNjQxMCB8fCBDUFVfUzVQNjQ0MCB8fCBDUFVfUzVQNjQ1MCB8fCBDUFVfUzVQQzEwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9NYWtlZmlsZSBiL2RyaXZlcnMvdHR5L3NlcmlhbC9NYWtlZmlsZQppbmRleCBjYjI2MjhmLi44M2I0ZGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL01ha2VmaWxlCkBAIC0zOCwxMSArMzgsOSBAQAogb2JqLSQoQ09ORklHX1NFUklBTF9CRklOKSArPSBiZmluXzV4eC5vCiBvYmotJChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQpICs9IGJmaW5fc3BvcnRfdWFydC5vCiBvYmotJChDT05GSUdfU0VSSUFMX1NBTVNVTkcpICs9IHNhbXN1bmcubwotb2JqLSQoQ09ORklHX1NFUklBTF9TM0MyNDAwKSArPSBzM2MyNDAwLm8KIG9iai0kKENPTkZJR19TRVJJQUxfUzNDMjQxMCkgKz0gczNjMjQxMC5vCiBvYmotJChDT05GSUdfU0VSSUFMX1MzQzI0MTIpICs9IHMzYzI0MTIubwogb2JqLSQoQ09ORklHX1NFUklBTF9TM0MyNDQwKSArPSBzM2MyNDQwLm8KLW9iai0kKENPTkZJR19TRVJJQUxfUzNDMjRBMCkgKz0gczNjMjRhMC5vCiBvYmotJChDT05GSUdfU0VSSUFMX1MzQzY0MDApICs9IHMzYzY0MDAubwogb2JqLSQoQ09ORklHX1NFUklBTF9TNVBWMjEwKSArPSBzNXB2MjEwLm8KIG9iai0kKENPTkZJR19TRVJJQUxfTUFYMzEwMCkgKz0gbWF4MzEwMC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKaW5kZXggNmQ1ZDZlNi4uYWY5Yjc4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYwpAQCAtMTcwOSwxMiArMTcwOSwxMyBAQAogc3RhdGljIGludCBfX2RldmluaXQgYXRtZWxfc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXZvaWQgKmRhdGE7CiAJaW50IHJldDsKIAogCUJVSUxEX0JVR19PTihBVE1FTF9TRVJJQUxfUklOR1NJWkUgJiAoQVRNRUxfU0VSSUFMX1JJTkdTSVpFIC0gMSkpOwogCi0JcG9ydCA9ICZhdG1lbF9wb3J0c1twZGV2LT5pZF07CisJcG9ydCA9ICZhdG1lbF9wb3J0c1twZGF0YS0+bnVtXTsKIAlwb3J0LT5iYWNrdXBfaW1yID0gMDsKIAogCWF0bWVsX2luaXRfcG9ydChwb3J0LCBwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYwppbmRleCBhMWEwZTU1Li5jMGI2OGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYmNtNjN4eF91YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jCkBAIC0yNTAsNiArMjUwLDIwIEBACiAJCS8qIGdldCBvdmVycnVuL2ZpZm8gZW1wdHkgaW5mb3JtYXRpb24gZnJvbSBpZXIKIAkJICogcmVnaXN0ZXIgKi8KIAkJaWVzdGF0ID0gYmNtX3VhcnRfcmVhZGwocG9ydCwgVUFSVF9JUl9SRUcpOworCisJCWlmICh1bmxpa2VseShpZXN0YXQgJiBVQVJUX0lSX1NUQVQoVUFSVF9JUl9SWE9WRVIpKSkgeworCQkJdW5zaWduZWQgaW50IHZhbDsKKworCQkJLyogZmlmbyByZXNldCBpcyByZXF1aXJlZCB0byBjbGVhcgorCQkJICogaW50ZXJydXB0ICovCisJCQl2YWwgPSBiY21fdWFydF9yZWFkbChwb3J0LCBVQVJUX0NUTF9SRUcpOworCQkJdmFsIHw9IFVBUlRfQ1RMX1JTVFJYRklGT19NQVNLOworCQkJYmNtX3VhcnRfd3JpdGVsKHBvcnQsIHZhbCwgVUFSVF9DVExfUkVHKTsKKworCQkJcG9ydC0+aWNvdW50Lm92ZXJydW4rKzsKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOworCQl9CisKIAkJaWYgKCEoaWVzdGF0ICYgVUFSVF9JUl9TVEFUKFVBUlRfSVJfUlhOT1RFTVBUWSkpKQogCQkJYnJlYWs7CiAKQEAgLTI4NCwxMCArMjk4LDYgQEAKIAkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgYykpCiAJCQljb250aW51ZTsKIAotCQlpZiAodW5saWtlbHkoaWVzdGF0ICYgVUFSVF9JUl9TVEFUKFVBUlRfSVJfUlhPVkVSKSkpIHsKLQkJCXBvcnQtPmljb3VudC5vdmVycnVuKys7Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKLQkJfQogCiAJCWlmICgoY3N0YXQgJiBwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2spID09IDApCiAJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGMsIGZsYWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2JmaW5fNXh4LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYmZpbl81eHguYwppbmRleCA5NTcxMzVhLi5mZjY5NzkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYmZpbl81eHguYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYmZpbl81eHguYwpAQCAtMTQ4Miw3ICsxNDgyLDcgQEAKIAl9CiAKIAliZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydC5tZW1iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LAotCQkJcmVzLT5lbmQgLSByZXMtPnN0YXJ0KTsKKwkJCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAoIWJmaW5fZWFybHlwcmludGtfcG9ydC5wb3J0Lm1lbWJhc2UpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IG1hcCB1YXJ0IElPXG4iKTsKIAkJcmV0ID0gLUVOWElPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2lmeDZ4NjAuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9pZng2eDYwLmMKaW5kZXggNTMxNTUyNS4uNDI2NDM0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2lmeDZ4NjAuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvaWZ4Nng2MC5jCkBAIC0zNiw2ICszNiw3IEBACiAgKgl5b3UgbmVlZCB0byB1c2UgdGhpcyBkcml2ZXIgZm9yIGFub3RoZXIgcGxhdGZvcm0uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCmluZGV4IGE1NDQ3MzEuLjIyZmU4MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMKQEAgLTk1NCw3ICs5NTQsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqbW1yZXM7CiAKIAltbXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1tcmVzLT5zdGFydCwgbW1yZXMtPmVuZCAtIG1tcmVzLT5zdGFydCArIDEpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtbXJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUobW1yZXMpKTsKIH0KIAogLyoKQEAgLTk3MCw4ICs5NzAsNyBAQAogCWlmICghbW1yZXMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0ID0gcmVxdWVzdF9tZW1fcmVnaW9uKG1tcmVzLT5zdGFydCwgbW1yZXMtPmVuZCAtIG1tcmVzLT5zdGFydCArIDEsCi0JCQkiaW14LXVhcnQiKTsKKwlyZXQgPSByZXF1ZXN0X21lbV9yZWdpb24obW1yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1tcmVzKSwgImlteC11YXJ0Iik7CiAKIAlyZXR1cm4gIHJldCA/IDAgOiAtRUJVU1k7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9qc20vanNtX2RyaXZlci5jCmluZGV4IDE4ZjU0ODQuLjk2ZGExNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9qc20vanNtX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9qc20vanNtX2RyaXZlci5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAlicmQtPmJkX3VhcnRfb2Zmc2V0ID0gMHgyMDA7CiAJYnJkLT5iZF9kaXZpZGVuZCA9IDkyMTYwMDsKIAotCWJyZC0+cmVfbWFwX21lbWJhc2UgPSBpb3JlbWFwKGJyZC0+bWVtYmFzZSwgMHgxMDAwKTsKKwlicmQtPnJlX21hcF9tZW1iYXNlID0gaW9yZW1hcChicmQtPm1lbWJhc2UsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOwogCWlmICghYnJkLT5yZV9tYXBfbWVtYmFzZSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiY2FyZCBoYXMgbm8gUENJIE1lbW9yeSByZXNvdXJjZXMsICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tMzJyX3Npby5jIGIvZHJpdmVycy90dHkvc2VyaWFsL20zMnJfc2lvLmMKaW5kZXggODRkYjczMi4uOGUwNzUxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL20zMnJfc2lvLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL20zMnJfc2lvLmMKQEAgLTg5Miw3ICs4OTIsNyBAQAogCSAqIElmIHdlIGhhdmUgYSBtYXBiYXNlLCB0aGVuIHJlcXVlc3QgdGhhdCBhcyB3ZWxsLgogCSAqLwogCWlmIChyZXQgPT0gMCAmJiB1cC0+cG9ydC5mbGFncyAmIFVQRl9JT1JFTUFQKSB7Ci0JCWludCBzaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwkJaW50IHNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAKIAkJdXAtPnBvcnQubWVtYmFzZSA9IGlvcmVtYXAodXAtPnBvcnQubWFwYmFzZSwgc2l6ZSk7CiAJCWlmICghdXAtPnBvcnQubWVtYmFzZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9vZl9zZXJpYWwuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9vZl9zZXJpYWwuYwppbmRleCBjOTExYjI0Li5lNThjZWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvb2Zfc2VyaWFsLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL29mX3NlcmlhbC5jCkBAIC0zMiwxNyArMzIsMTcgQEAKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzb3VyY2U7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5kZXYub2Zfbm9kZTsKLQljb25zdCBfX2JlMzIgKmNsaywgKnNwZDsKLQljb25zdCBfX2JlMzIgKnByb3A7Ci0JaW50IHJldCwgcHJvcF9zaXplOworCXUzMiBjbGssIHNwZCwgcHJvcDsKKwlpbnQgcmV0OwogCiAJbWVtc2V0KHBvcnQsIDAsIHNpemVvZiAqcG9ydCk7Ci0Jc3BkID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY3VycmVudC1zcGVlZCIsIE5VTEwpOwotCWNsayA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOwotCWlmICghY2xrKSB7CisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgJmNsaykpIHsKIAkJZGV2X3dhcm4oJm9mZGV2LT5kZXYsICJubyBjbG9jay1mcmVxdWVuY3kgcHJvcGVydHkgc2V0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCS8qIElmIGN1cnJlbnQtc3BlZWQgd2FzIHNldCwgdGhlbiB0cnkgbm90IHRvIGNoYW5nZSBpdC4gKi8KKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjdXJyZW50LXNwZWVkIiwgJnNwZCkgPT0gMCkKKwkJcG9ydC0+Y3VzdG9tX2Rpdmlzb3IgPSBjbGsgLyAoMTYgKiBzcGQpOwogCiAJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlc291cmNlKTsKIAlpZiAocmV0KSB7CkBAIC01NCwyNSArNTQsMzUgQEAKIAlwb3J0LT5tYXBiYXNlID0gcmVzb3VyY2Uuc3RhcnQ7CiAKIAkvKiBDaGVjayBmb3Igc2hpZnRlZCBhZGRyZXNzIG1hcHBpbmcgKi8KLQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnLW9mZnNldCIsICZwcm9wX3NpemUpOwotCWlmIChwcm9wICYmIChwcm9wX3NpemUgPT0gc2l6ZW9mKHUzMikpKQotCQlwb3J0LT5tYXBiYXNlICs9IGJlMzJfdG9fY3B1cChwcm9wKTsKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyZWctb2Zmc2V0IiwgJnByb3ApID09IDApCisJCXBvcnQtPm1hcGJhc2UgKz0gcHJvcDsKIAogCS8qIENoZWNrIGZvciByZWdpc3RlcnMgb2Zmc2V0IHdpdGhpbiB0aGUgZGV2aWNlcyBhZGRyZXNzIHJhbmdlICovCi0JcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZy1zaGlmdCIsICZwcm9wX3NpemUpOwotCWlmIChwcm9wICYmIChwcm9wX3NpemUgPT0gc2l6ZW9mKHUzMikpKQotCQlwb3J0LT5yZWdzaGlmdCA9IGJlMzJfdG9fY3B1cChwcm9wKTsKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyZWctc2hpZnQiLCAmcHJvcCkgPT0gMCkKKwkJcG9ydC0+cmVnc2hpZnQgPSBwcm9wOwogCiAJcG9ydC0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwogCXBvcnQtPmlvdHlwZSA9IFVQSU9fTUVNOworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJlZy1pby13aWR0aCIsICZwcm9wKSA9PSAwKSB7CisJCXN3aXRjaCAocHJvcCkgeworCQljYXNlIDE6CisJCQlwb3J0LT5pb3R5cGUgPSBVUElPX01FTTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlwb3J0LT5pb3R5cGUgPSBVUElPX01FTTMyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2Fybigmb2ZkZXYtPmRldiwgInVuc3VwcG9ydGVkIHJlZy1pby13aWR0aCAoJWQpXG4iLAorCQkJCSBwcm9wKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCiAJcG9ydC0+dHlwZSA9IHR5cGU7Ci0JcG9ydC0+dWFydGNsayA9IGJlMzJfdG9fY3B1cChjbGspOworCXBvcnQtPnVhcnRjbGsgPSBjbGs7CiAJcG9ydC0+ZmxhZ3MgPSBVUEZfU0hBUkVfSVJRIHwgVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfSU9SRU1BUAogCQl8IFVQRl9GSVhFRF9QT1JUIHwgVVBGX0ZJWEVEX1RZUEU7CiAJcG9ydC0+ZGV2ID0gJm9mZGV2LT5kZXY7Ci0JLyogSWYgY3VycmVudC1zcGVlZCB3YXMgc2V0LCB0aGVuIHRyeSBub3QgdG8gY2hhbmdlIGl0LiAqLwotCWlmIChzcGQpCi0JCXBvcnQtPmN1c3RvbV9kaXZpc29yID0gYmUzMl90b19jcHVwKGNsaykgLyAoMTYgKiAoYmUzMl90b19jcHVwKHNwZCkpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTcxLDYgKzE4MSw3IEBACiAJeyAuY29tcGF0aWJsZSA9ICJuczE2NTUwIiwgIC5kYXRhID0gKHZvaWQgKilQT1JUXzE2NTUwLCB9LAogCXsgLmNvbXBhdGlibGUgPSAibnMxNjc1MCIsICAuZGF0YSA9ICh2b2lkICopUE9SVF8xNjc1MCwgfSwKIAl7IC5jb21wYXRpYmxlID0gIm5zMTY4NTAiLCAgLmRhdGEgPSAodm9pZCAqKVBPUlRfMTY4NTAsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC11YXJ0IiwgLmRhdGEgPSAodm9pZCAqKVBPUlRfVEVHUkEsIH0sCiAjaWZkZWYgQ09ORklHX1NFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUwKIAl7IC5jb21wYXRpYmxlID0gImlibSxxcGFjZS1ud3Atc2VyaWFsIiwKIAkJLmRhdGEgPSAodm9pZCAqKVBPUlRfTldQU0VSSUFMLCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL29tYXAtc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvb21hcC1zZXJpYWwuYwppbmRleCA0N2NhZGY0Li5jMzdkZjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvb21hcC1zZXJpYWwuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvb21hcC1zZXJpYWwuYwpAQCAtMTI0MSw4ICsxMjQxLDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtLT5zdGFydCwgKG1lbS0+ZW5kIC0gbWVtLT5zdGFydCkgKyAxLAotCQkJCSAgICAgcGRldi0+ZGV2LmRyaXZlci0+bmFtZSkpIHsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSksCisJCQkJcGRldi0+ZGV2LmRyaXZlci0+bmFtZSkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAibWVtb3J5IHJlZ2lvbiBhbHJlYWR5IGNsYWltZWRcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTEzMDgsNyArMTMwOCw3IEBACiAJZGV2X2VycigmcGRldi0+ZGV2LCAiW1VBUlQlZF06IGZhaWx1cmUgWyVzXTogJWRcbiIsCiAJCQkJcGRldi0+aWQsIF9fZnVuY19fLCByZXQpOwogZG9fcmVsZWFzZV9yZWdpb246Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIChtZW0tPmVuZCAtIG1lbS0+c3RhcnQpICsgMSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3BjaF91YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYwppbmRleCAwMzczNjgyLi44NDZkZmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYwpAQCAtMTM5Nyw2ICsxMzk3LDcgQEAKIAlpbnQgZmlmb3NpemUsIGJhc2VfYmF1ZDsKIAlpbnQgcG9ydF90eXBlOwogCXN0cnVjdCBwY2hfdWFydF9kcml2ZXJfZGF0YSAqYm9hcmQ7CisJY29uc3QgY2hhciAqYm9hcmRfbmFtZTsKIAogCWJvYXJkID0gJmRydl9kYXRbaWQtPmRyaXZlcl9kYXRhXTsKIAlwb3J0X3R5cGUgPSBib2FyZC0+cG9ydF90eXBlOwpAQCAtMTQxMiw3ICsxNDEzLDggQEAKIAliYXNlX2JhdWQgPSAxODQzMjAwOyAvKiAxLjg0MzJNSHogKi8KIAogCS8qIHF1aXJrIGZvciBDTS1pVEMgYm9hcmQgKi8KLQlpZiAoc3Ryc3RyKGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JPQVJEX05BTUUpLCAiQ00taVRDIikpCisJYm9hcmRfbmFtZSA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JPQVJEX05BTUUpOworCWlmIChib2FyZF9uYW1lICYmIHN0cnN0cihib2FyZF9uYW1lLCAiQ00taVRDIikpCiAJCWJhc2VfYmF1ZCA9IDE5MjAwMDAwMDsgLyogMTkyLjBNSHogKi8KIAogCXN3aXRjaCAocG9ydF90eXBlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvcHhhLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvcHhhLmMKaW5kZXggNDMwMmU2ZS4uNTMxOTMxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3B4YS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9weGEuYwpAQCAtODAzLDcgKzgwMyw3IEBACiAJCWJyZWFrOwogCX0KIAotCXNwb3J0LT5wb3J0Lm1lbWJhc2UgPSBpb3JlbWFwKG1tcmVzLT5zdGFydCwgbW1yZXMtPmVuZCAtIG1tcmVzLT5zdGFydCArIDEpOworCXNwb3J0LT5wb3J0Lm1lbWJhc2UgPSBpb3JlbWFwKG1tcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtbXJlcykpOwogCWlmICghc3BvcnQtPnBvcnQubWVtYmFzZSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9jbGs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvczNjMjQwMC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3MzYzI0MDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzMDUxYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvczNjMjQwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBEcml2ZXIgZm9yIFNhbXN1bmcgU29DIG9uYm9hcmQgVUFSVHMuCi0gKgotICogQmVuIERvb2tzLCBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0KLSNpbmNsdWRlICJzYW1zdW5nLmgiCi0KLXN0YXRpYyBpbnQgczNjMjQwMF9zZXJpYWxfZ2V0c291cmNlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCi0JCQkJICAgIHN0cnVjdCBzM2MyNHh4X3VhcnRfY2xrc3JjICpjbGspCi17Ci0JY2xrLT5kaXZpc29yID0gMTsKLQljbGstPm5hbWUgPSAicGNsayI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzM2MyNDAwX3NlcmlhbF9zZXRzb3VyY2Uoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKLQkJCQkgICAgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgKmNsaykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzM2MyNDAwX3NlcmlhbF9yZXNldHBvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKLQkJCQkgICAgc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnKQotewotCWRiZygiczNjMjQwMF9zZXJpYWxfcmVzZXRwb3J0OiBwb3J0PSVwICglMDhseCksIGNmZz0lcFxuIiwKLQkgICAgcG9ydCwgcG9ydC0+bWFwYmFzZSwgY2ZnKTsKLQotCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OLCAgY2ZnLT51Y29uKTsKLQl3cl9yZWdsKHBvcnQsIFMzQzI0MTBfVUxDT04sIGNmZy0+dWxjb24pOwotCi0JLyogcmVzZXQgYm90aCBmaWZvcyAqLwotCi0Jd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VGQ09OLCBjZmctPnVmY29uIHwgUzNDMjQxMF9VRkNPTl9SRVNFVEJPVEgpOwotCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VRkNPTiwgY2ZnLT51ZmNvbik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzM2MyNHh4X3VhcnRfaW5mbyBzM2MyNDAwX3VhcnRfaW5mID0gewotCS5uYW1lCQk9ICJTYW1zdW5nIFMzQzI0MDAgVUFSVCIsCi0JLnR5cGUJCT0gUE9SVF9TM0MyNDAwLAotCS5maWZvc2l6ZQk9IDE2LAotCS5yeF9maWZvbWFzawk9IFMzQzI0MTBfVUZTVEFUX1JYTUFTSywKLQkucnhfZmlmb3NoaWZ0CT0gUzNDMjQxMF9VRlNUQVRfUlhTSElGVCwKLQkucnhfZmlmb2Z1bGwJPSBTM0MyNDEwX1VGU1RBVF9SWEZVTEwsCi0JLnR4X2ZpZm9mdWxsCT0gUzNDMjQxMF9VRlNUQVRfVFhGVUxMLAotCS50eF9maWZvbWFzawk9IFMzQzI0MTBfVUZTVEFUX1RYTUFTSywKLQkudHhfZmlmb3NoaWZ0CT0gUzNDMjQxMF9VRlNUQVRfVFhTSElGVCwKLQkuZ2V0X2Nsa3NyYwk9IHMzYzI0MDBfc2VyaWFsX2dldHNvdXJjZSwKLQkuc2V0X2Nsa3NyYwk9IHMzYzI0MDBfc2VyaWFsX3NldHNvdXJjZSwKLQkucmVzZXRfcG9ydAk9IHMzYzI0MDBfc2VyaWFsX3Jlc2V0cG9ydCwKLX07Ci0KLXN0YXRpYyBpbnQgczNjMjQwMF9zZXJpYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXJldHVybiBzM2MyNHh4X3NlcmlhbF9wcm9iZShkZXYsICZzM2MyNDAwX3VhcnRfaW5mKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjMjQwMF9zZXJpYWxfZHJpdmVyID0gewotCS5wcm9iZQkJPSBzM2MyNDAwX3NlcmlhbF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHMzYzI0eHhfc2VyaWFsX3JlbW92ZSksCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gInMzYzI0MDAtdWFydCIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zM2MyNHh4X2NvbnNvbGVfaW5pdCgmczNjMjQwMF9zZXJpYWxfZHJpdmVyLCAmczNjMjQwMF91YXJ0X2luZik7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHMzYzI0MDBfc2VyaWFsX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gczNjMjR4eF9zZXJpYWxfaW5pdCgmczNjMjQwMF9zZXJpYWxfZHJpdmVyLCAmczNjMjQwMF91YXJ0X2luZik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDAwX3NlcmlhbF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0MDBfc2VyaWFsX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHMzYzI0MDBfc2VyaWFsX2luaXQpOwotbW9kdWxlX2V4aXQoczNjMjQwMF9zZXJpYWxfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9BVVRIT1IoIkJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTM0MyNDAwIFNvQyBTZXJpYWwgcG9ydCBkcml2ZXIiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06czNjMjQwMC11YXJ0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvczNjMjQxMC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3MzYzI0MTAuYwppbmRleCBiZmZlNmZmLi5iMWQ3ZTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zM2MyNDEwLmMKQEAgLTk2LDggKzk2LDYgQEAKIAl9LAogfTsKIAotczNjMjR4eF9jb25zb2xlX2luaXQoJnMzYzI0MTBfc2VyaWFsX2RyaXZlciwgJnMzYzI0MTBfdWFydF9pbmYpOwotCiBzdGF0aWMgaW50IF9faW5pdCBzM2MyNDEwX3NlcmlhbF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHMzYzI0eHhfc2VyaWFsX2luaXQoJnMzYzI0MTBfc2VyaWFsX2RyaXZlciwgJnMzYzI0MTBfdWFydF9pbmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3MzYzI0MTIuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zM2MyNDEyLmMKaW5kZXggN2UyYjk1MC4uMjIzNGJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3MzYzI0MTIuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvczNjMjQxMi5jCkBAIC0xMzAsOCArMTMwLDYgQEAKIAl9LAogfTsKIAotczNjMjR4eF9jb25zb2xlX2luaXQoJnMzYzI0MTJfc2VyaWFsX2RyaXZlciwgJnMzYzI0MTJfdWFydF9pbmYpOwotCiBzdGF0aWMgaW5saW5lIGludCBzM2MyNDEyX3NlcmlhbF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHMzYzI0eHhfc2VyaWFsX2luaXQoJnMzYzI0MTJfc2VyaWFsX2RyaXZlciwgJnMzYzI0MTJfdWFydF9pbmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3MzYzI0NDAuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zM2MyNDQwLmMKaW5kZXggOWUxMGQ0MS4uMWQwYzMyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3MzYzI0NDAuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvczNjMjQ0MC5jCkBAIC0xNTksOCArMTU5LDYgQEAKIAl9LAogfTsKIAotczNjMjR4eF9jb25zb2xlX2luaXQoJnMzYzI0NDBfc2VyaWFsX2RyaXZlciwgJnMzYzI0NDBfdWFydF9pbmYpOwotCiBzdGF0aWMgaW50IF9faW5pdCBzM2MyNDQwX3NlcmlhbF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHMzYzI0eHhfc2VyaWFsX2luaXQoJnMzYzI0NDBfc2VyaWFsX2RyaXZlciwgJnMzYzI0NDBfdWFydF9pbmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3MzYzI0YTAuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zM2MyNGEwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNGVmZjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3MzYzI0YTAuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogRHJpdmVyIGZvciBTYW1zdW5nIFMzQzI0QTAgU29DIG9uYm9hcmQgVUFSVHMuCi0gKgotICogQmFzZWQgb24gZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jCi0gKgotICogQXV0aG9yOiBTYW5kZWVwIFBhdGlsIDxzYW5kZWVwLnBhdGlsQGF6aW5nby5jb20+Ci0gKgotICogQmVuIERvb2tzLCBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0KLSNpbmNsdWRlICJzYW1zdW5nLmgiCi0KLXN0YXRpYyBpbnQgczNjMjRhMF9zZXJpYWxfc2V0c291cmNlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCi0JCQkJICAgIHN0cnVjdCBzM2MyNHh4X3VhcnRfY2xrc3JjICpjbGspCi17Ci0JdW5zaWduZWQgbG9uZyB1Y29uID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04pOwotCi0JaWYgKHN0cmNtcChjbGstPm5hbWUsICJ1Y2xrIikgPT0gMCkKLQkJdWNvbiB8PSBTM0MyNDEwX1VDT05fVUNMSzsKLQllbHNlCi0JCXVjb24gJj0gflMzQzI0MTBfVUNPTl9VQ0xLOwotCi0Jd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04sIHVjb24pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHMzYzI0YTBfc2VyaWFsX2dldHNvdXJjZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAotCQkJCSAgICBzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYyAqY2xrKQotewotCXVuc2lnbmVkIGxvbmcgdWNvbiA9IHJkX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OKTsKLQotCWNsay0+ZGl2aXNvciA9IDE7Ci0JY2xrLT5uYW1lID0gKHVjb24gJiBTM0MyNDEwX1VDT05fVUNMSykgPyAidWNsayIgOiAicGNsayI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzM2MyNGEwX3NlcmlhbF9yZXNldHBvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKLQkJCQkgICAgc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnKQotewotCWRiZygiczNjMjRhMF9zZXJpYWxfcmVzZXRwb3J0OiBwb3J0PSVwICglMDhseCksIGNmZz0lcFxuIiwKLQkgICAgcG9ydCwgcG9ydC0+bWFwYmFzZSwgY2ZnKTsKLQotCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OLCAgY2ZnLT51Y29uKTsKLQl3cl9yZWdsKHBvcnQsIFMzQzI0MTBfVUxDT04sIGNmZy0+dWxjb24pOwotCi0JLyogcmVzZXQgYm90aCBmaWZvcyAqLwotCi0Jd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VGQ09OLCBjZmctPnVmY29uIHwgUzNDMjQxMF9VRkNPTl9SRVNFVEJPVEgpOwotCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VRkNPTiwgY2ZnLT51ZmNvbik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzM2MyNHh4X3VhcnRfaW5mbyBzM2MyNGEwX3VhcnRfaW5mID0gewotCS5uYW1lCQk9ICJTYW1zdW5nIFMzQzI0QTAgVUFSVCIsCi0JLnR5cGUJCT0gUE9SVF9TM0MyNDEwLAotCS5maWZvc2l6ZQk9IDE2LAotCS5yeF9maWZvbWFzawk9IFMzQzI0QTBfVUZTVEFUX1JYTUFTSywKLQkucnhfZmlmb3NoaWZ0CT0gUzNDMjRBMF9VRlNUQVRfUlhTSElGVCwKLQkucnhfZmlmb2Z1bGwJPSBTM0MyNEEwX1VGU1RBVF9SWEZVTEwsCi0JLnR4X2ZpZm9mdWxsCT0gUzNDMjRBMF9VRlNUQVRfVFhGVUxMLAotCS50eF9maWZvbWFzawk9IFMzQzI0QTBfVUZTVEFUX1RYTUFTSywKLQkudHhfZmlmb3NoaWZ0CT0gUzNDMjRBMF9VRlNUQVRfVFhTSElGVCwKLQkuZ2V0X2Nsa3NyYwk9IHMzYzI0YTBfc2VyaWFsX2dldHNvdXJjZSwKLQkuc2V0X2Nsa3NyYwk9IHMzYzI0YTBfc2VyaWFsX3NldHNvdXJjZSwKLQkucmVzZXRfcG9ydAk9IHMzYzI0YTBfc2VyaWFsX3Jlc2V0cG9ydCwKLX07Ci0KLXN0YXRpYyBpbnQgczNjMjRhMF9zZXJpYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXJldHVybiBzM2MyNHh4X3NlcmlhbF9wcm9iZShkZXYsICZzM2MyNGEwX3VhcnRfaW5mKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjMjRhMF9zZXJpYWxfZHJpdmVyID0gewotCS5wcm9iZQkJPSBzM2MyNGEwX3NlcmlhbF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHMzYzI0eHhfc2VyaWFsX3JlbW92ZSksCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gInMzYzI0YTAtdWFydCIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zM2MyNHh4X2NvbnNvbGVfaW5pdCgmczNjMjRhMF9zZXJpYWxfZHJpdmVyLCAmczNjMjRhMF91YXJ0X2luZik7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHMzYzI0YTBfc2VyaWFsX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gczNjMjR4eF9zZXJpYWxfaW5pdCgmczNjMjRhMF9zZXJpYWxfZHJpdmVyLCAmczNjMjRhMF91YXJ0X2luZik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzM2MyNGEwX3NlcmlhbF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0YTBfc2VyaWFsX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHMzYzI0YTBfc2VyaWFsX2luaXQpOwotbW9kdWxlX2V4aXQoczNjMjRhMF9zZXJpYWxfZXhpdCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zM2M2NDAwLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvczNjNjQwMC5jCmluZGV4IGRlZDI2YzQuLmUyZjY5MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zM2M2NDAwLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3MzYzY0MDAuYwpAQCAtMTMwLDggKzEzMCw2IEBACiAJfSwKIH07CiAKLXMzYzI0eHhfY29uc29sZV9pbml0KCZzM2M2NDAwX3NlcmlhbF9kcml2ZXIsICZzM2M2NDAwX3VhcnRfaW5mKTsKLQogc3RhdGljIGludCBfX2luaXQgczNjNjQwMF9zZXJpYWxfaW5pdCh2b2lkKQogewogCXJldHVybiBzM2MyNHh4X3NlcmlhbF9pbml0KCZzM2M2NDAwX3NlcmlhbF9kcml2ZXIsICZzM2M2NDAwX3VhcnRfaW5mKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zNXB2MjEwLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvczVwdjIxMC5jCmluZGV4IGRjZTZjYjMuLjhiMGI4ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zNXB2MjEwLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3M1cHYyMTAuYwpAQCAtMzEsNyArMzEsNyBAQAogCXN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZyA9IHBvcnQtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAl1bnNpZ25lZCBsb25nIHVjb24gPSByZF9yZWdsKHBvcnQsIFMzQzI0MTBfVUNPTik7CiAKLQlpZiAoKGNmZy0+Y2xvY2tzX3NpemUpID09IDEpCisJaWYgKGNmZy0+ZmxhZ3MgJiBOT19ORUVEX0NIRUNLX0NMS1NSQykKIAkJcmV0dXJuIDA7CiAKIAlpZiAoc3RyY21wKGNsay0+bmFtZSwgInBjbGsiKSA9PSAwKQpAQCAtNTYsNyArNTYsNyBAQAogCiAJY2xrLT5kaXZpc29yID0gMTsKIAotCWlmICgoY2ZnLT5jbG9ja3Nfc2l6ZSkgPT0gMSkKKwlpZiAoY2ZnLT5mbGFncyAmIE5PX05FRURfQ0hFQ0tfQ0xLU1JDKQogCQlyZXR1cm4gMDsKIAogCXN3aXRjaCAodWNvbiAmIFM1UFYyMTBfVUNPTl9DTEtNQVNLKSB7CkBAIC0xMzksMTMgKzEzOSw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHM1cHYyMTBfc2VyaWFsX2NvbnNvbGVfaW5pdCh2b2lkKQotewotCXJldHVybiBzM2MyNHh4X3NlcmlhbF9pbml0Y29uc29sZSgmczVwX3NlcmlhbF9kcml2ZXIsIHM1cF91YXJ0X2luZik7Ci19Ci0KLWNvbnNvbGVfaW5pdGNhbGwoczVwdjIxMF9zZXJpYWxfY29uc29sZV9pbml0KTsKLQogc3RhdGljIGludCBfX2luaXQgczVwX3NlcmlhbF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHMzYzI0eHhfc2VyaWFsX2luaXQoJnM1cF9zZXJpYWxfZHJpdmVyLCAqczVwX3VhcnRfaW5mKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jCmluZGV4IDM0YjhhZmU1Li5hZmM2Mjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmMKQEAgLTE0MTcsMTAgKzE0MTcsOCBAQAogCiAJLyogaXMgdGhlIHBvcnQgY29uZmlndXJlZD8gKi8KIAotCWlmIChwb3J0LT5tYXBiYXNlID09IDB4MCkgewotCQljby0+aW5kZXggPSAwOwotCQlwb3J0ID0gJnMzYzI0eHhfc2VyaWFsX3BvcnRzW2NvLT5pbmRleF0ucG9ydDsKLQl9CisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHgwKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWNvbnNfdWFydCA9IHBvcnQ7CiAKQEAgLTE0NTIsNyArMTQ1MCw4IEBACiAJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKIAkuaW5kZXgJCT0gLTEsCiAJLndyaXRlCQk9IHMzYzI0eHhfc2VyaWFsX2NvbnNvbGVfd3JpdGUsCi0JLnNldHVwCQk9IHMzYzI0eHhfc2VyaWFsX2NvbnNvbGVfc2V0dXAKKwkuc2V0dXAJCT0gczNjMjR4eF9zZXJpYWxfY29uc29sZV9zZXR1cCwKKwkuZGF0YQkJPSAmczNjMjR4eF91YXJ0X2RydiwKIH07CiAKIGludCBzM2MyNHh4X3NlcmlhbF9pbml0Y29uc29sZShzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpkcnYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5oIGIvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuaAppbmRleCA1YjA5OGNkLi5hNjlkOWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5oCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmgKQEAgLTc5LDI1ICs3OSw2IEBACiBleHRlcm4gaW50IHMzYzI0eHhfc2VyaWFsX2luaXQoc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqZHJ2LAogCQkJICAgICAgIHN0cnVjdCBzM2MyNHh4X3VhcnRfaW5mbyAqaW5mbyk7CiAKLSNpZmRlZiBDT05GSUdfU0VSSUFMX1NBTVNVTkdfQ09OU09MRQotCi0jZGVmaW5lIHMzYzI0eHhfY29uc29sZV9pbml0KF9fZHJ2LCBfX2luZikJCQkJXAotc3RhdGljIGludCBfX2luaXQgczNjX3NlcmlhbF9jb25zb2xlX2luaXQodm9pZCkJCQkJXAotewkJCQkJCQkJCVwKLQlzdHJ1Y3QgczNjMjR4eF91YXJ0X2luZm8gKnVpbmZvW0NPTkZJR19TRVJJQUxfU0FNU1VOR19VQVJUU107CVwKLQlpbnQgaTsJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX1NFUklBTF9TQU1TVU5HX1VBUlRTOyBpKyspCQlcCi0JCXVpbmZvW2ldID0gX19pbmY7CQkJCQlcCi0JcmV0dXJuIHMzYzI0eHhfc2VyaWFsX2luaXRjb25zb2xlKF9fZHJ2LCB1aW5mbyk7CQlcCi19CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotY29uc29sZV9pbml0Y2FsbChzM2Nfc2VyaWFsX2NvbnNvbGVfaW5pdCkKLQotI2Vsc2UKLSNkZWZpbmUgczNjMjR4eF9jb25zb2xlX2luaXQoZHJ2LCBpbmYpIGV4dGVybiB2b2lkIG5vX2NvbnNvbGUodm9pZCkKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1NFUklBTF9TQU1TVU5HX0RFQlVHCiAKIGV4dGVybiB2b2lkIHByaW50YXNjaWkoY29uc3QgY2hhciAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zdW5zdS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3N1bnN1LmMKaW5kZXggOTJhYTU0NS4uYWQwZjhmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3N1bnN1LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3N1bnN1LmMKQEAgLTE0MzUsNyArMTQzNSw3IEBACiAKIAlycCA9ICZvcC0+cmVzb3VyY2VbMF07CiAJdXAtPnBvcnQubWFwYmFzZSA9IHJwLT5zdGFydDsKLQl1cC0+cmVnX3NpemUgPSAocnAtPmVuZCAtIHJwLT5zdGFydCkgKyAxOworCXVwLT5yZWdfc2l6ZSA9IHJlc291cmNlX3NpemUocnApOwogCXVwLT5wb3J0Lm1lbWJhc2UgPSBvZl9pb3JlbWFwKHJwLCAwLCB1cC0+cmVnX3NpemUsICJzdSIpOwogCWlmICghdXAtPnBvcnQubWVtYmFzZSkgewogCQlpZiAodHlwZSAhPSBTVV9QT1JUX1BPUlQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvdnQ4NTAwX3NlcmlhbC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3Z0ODUwMF9zZXJpYWwuYwppbmRleCAzN2ZjNGUzLi4wMjZjYjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvdnQ4NTAwX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC92dDg1MDBfc2VyaWFsLmMKQEAgLTU3Myw4ICs1NzMsNyBAQAogCXNucHJpbnRmKHZ0ODUwMF9wb3J0LT5uYW1lLCBzaXplb2YodnQ4NTAwX3BvcnQtPm5hbWUpLAogCQkgIlZUODUwMCBVQVJUJWQiLCBwZGV2LT5pZCk7CiAKLQl2dDg1MDBfcG9ydC0+dWFydC5tZW1iYXNlID0gaW9yZW1hcChtbXJlcy0+c3RhcnQsCi0JCQkJCSAgICBtbXJlcy0+ZW5kIC0gbW1yZXMtPnN0YXJ0ICsgMSk7CisJdnQ4NTAwX3BvcnQtPnVhcnQubWVtYmFzZSA9IGlvcmVtYXAobW1yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1tcmVzKSk7CiAJaWYgKCF2dDg1MDBfcG9ydC0+dWFydC5tZW1iYXNlKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvdHR5X2J1ZmZlci5jIGIvZHJpdmVycy90dHkvdHR5X2J1ZmZlci5jCmluZGV4IGYxYTc5MTguLjZjOWI3Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3R0eV9idWZmZXIuYworKysgYi9kcml2ZXJzL3R0eS90dHlfYnVmZmVyLmMKQEAgLTQxMyw4ICs0MTMsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPmJ1Zi5sb2NrLCBmbGFncyk7CiAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoVFRZX0ZMVVNISU5HLCAmdHR5LT5mbGFncykpIHsKLQkJc3RydWN0IHR0eV9idWZmZXIgKmhlYWQsICp0YWlsID0gdHR5LT5idWYudGFpbDsKLQkJaW50IHNlZW5fdGFpbCA9IDA7CisJCXN0cnVjdCB0dHlfYnVmZmVyICpoZWFkOwogCQl3aGlsZSAoKGhlYWQgPSB0dHktPmJ1Zi5oZWFkKSAhPSBOVUxMKSB7CiAJCQlpbnQgY291bnQ7CiAJCQljaGFyICpjaGFyX2J1ZjsKQEAgLTQyNCwxNSArNDIzLDYgQEAKIAkJCWlmICghY291bnQpIHsKIAkJCQlpZiAoaGVhZC0+bmV4dCA9PSBOVUxMKQogCQkJCQlicmVhazsKLQkJCQkvKgotCQkJCSAgVGhlcmUncyBhIHBvc3NpYmlsaXR5IHR0eSBtaWdodCBnZXQgbmV3IGJ1ZmZlcgotCQkJCSAgYWRkZWQgZHVyaW5nIHRoZSB1bmxvY2sgd2luZG93IGJlbG93LiBXZSBjb3VsZAotCQkJCSAgZW5kIHVwIHNwaW5uaW5nIGluIGhlcmUgZm9yZXZlciBob2dnaW5nIHRoZSBDUFUKLQkJCQkgIGNvbXBsZXRlbHkuIFRvIGF2b2lkIHRoaXMgbGV0J3MgaGF2ZSBhIHJlc3QgZWFjaAotCQkJCSAgdGltZSB3ZSBwcm9jZXNzZWQgdGhlIHRhaWwgYnVmZmVyLgotCQkJCSovCi0JCQkJaWYgKHRhaWwgPT0gaGVhZCkKLQkJCQkJc2Vlbl90YWlsID0gMTsKIAkJCQl0dHktPmJ1Zi5oZWFkID0gaGVhZC0+bmV4dDsKIAkJCQl0dHlfYnVmZmVyX2ZyZWUodHR5LCBoZWFkKTsKIAkJCQljb250aW51ZTsKQEAgLTQ0Miw3ICs0MzIsNyBAQAogCQkJICAgbGluZSBkaXNjaXBsaW5lIGFzIHdlIHdhbnQgdG8gZW1wdHkgdGhlIHF1ZXVlICovCiAJCQlpZiAodGVzdF9iaXQoVFRZX0ZMVVNIUEVORElORywgJnR0eS0+ZmxhZ3MpKQogCQkJCWJyZWFrOwotCQkJaWYgKCF0dHktPnJlY2VpdmVfcm9vbSB8fCBzZWVuX3RhaWwpCisJCQlpZiAoIXR0eS0+cmVjZWl2ZV9yb29tKQogCQkJCWJyZWFrOwogCQkJaWYgKGNvdW50ID4gdHR5LT5yZWNlaXZlX3Jvb20pCiAJCQkJY291bnQgPSB0dHktPnJlY2VpdmVfcm9vbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3R0eV9sZGlzYy5jIGIvZHJpdmVycy90dHkvdHR5X2xkaXNjLmMKaW5kZXggNWQwMWQzMi4uZWY5MjVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvdHR5X2xkaXNjLmMKKysrIGIvZHJpdmVycy90dHkvdHR5X2xkaXNjLmMKQEAgLTU1NSw3ICs1NTUsNyBAQAogc3RhdGljIGludCB0dHlfbGRpc2Nfd2FpdF9pZGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJaW50IHJldDsKLQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh0dHlfbGRpc2NfaWRsZSwKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodHR5X2xkaXNjX2lkbGUsCiAJCQlhdG9taWNfcmVhZCgmdHR5LT5sZGlzYy0+dXNlcnMpID09IDEsIDUgKiBIWik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC03NjMsNiArNzYzLDggQEAKIAlpZiAoSVNfRVJSKGxkKSkKIAkJcmV0dXJuIC0xOwogCisJV0FSTl9PTl9PTkNFKHR0eV9sZGlzY193YWl0X2lkbGUodHR5KSk7CisKIAl0dHlfbGRpc2NfY2xvc2UodHR5LCB0dHktPmxkaXNjKTsKIAl0dHlfbGRpc2NfcHV0KHR0eS0+bGRpc2MpOwogCXR0eS0+bGRpc2MgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvX3BkcnYuYyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2LmMKaW5kZXggN2QzZTQ2OS4uYmRjM2RiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91aW8vdWlvX3BkcnYuYworKysgYi9kcml2ZXJzL3Vpby91aW9fcGRydi5jCkBAIC01OCw3ICs1OCw3IEBACiAKIAkJdWlvbWVtLT5tZW10eXBlID0gVUlPX01FTV9QSFlTOwogCQl1aW9tZW0tPmFkZHIgPSByLT5zdGFydDsKLQkJdWlvbWVtLT5zaXplID0gci0+ZW5kIC0gci0+c3RhcnQgKyAxOworCQl1aW9tZW0tPnNpemUgPSByZXNvdXJjZV9zaXplKHIpOwogCQkrK3Vpb21lbTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jIGIvZHJpdmVycy91aW8vdWlvX3BkcnZfZ2VuaXJxLmMKaW5kZXggMGY0MjRhZi4uYmFlOTZkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91aW8vdWlvX3BkcnZfZ2VuaXJxLmMKKysrIGIvZHJpdmVycy91aW8vdWlvX3BkcnZfZ2VuaXJxLmMKQEAgLTIzLDYgKzIzLDEwIEBACiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisKICNkZWZpbmUgRFJJVkVSX05BTUUgInVpb19wZHJ2X2dlbmlycSIKIAogc3RydWN0IHVpb19wZHJ2X2dlbmlycV9wbGF0ZGF0YSB7CkBAIC05Nyw2ICsxMDEsMjcgQEAKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAlpbnQgaTsKIAorCWlmICghdWlvaW5mbykgeworCQlpbnQgaXJxOworCisJCS8qIGFsbG9jIHVpb2luZm8gZm9yIG9uZSBkZXZpY2UgKi8KKwkJdWlvaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCp1aW9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdWlvaW5mbykgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBrbWFsbG9jXG4iKTsKKwkJCWdvdG8gYmFkMjsKKwkJfQorCQl1aW9pbmZvLT5uYW1lID0gcGRldi0+ZGV2Lm9mX25vZGUtPm5hbWU7CisJCXVpb2luZm8tPnZlcnNpb24gPSAiZGV2aWNldHJlZSI7CisKKwkJLyogTXVsdGlwbGUgSVJRcyBhcmUgbm90IHN1cHBvcnRlZCAqLworCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCQlpZiAoaXJxID09IC1FTlhJTykKKwkJCXVpb2luZm8tPmlycSA9IFVJT19JUlFfTk9ORTsKKwkJZWxzZQorCQkJdWlvaW5mby0+aXJxID0gaXJxOworCX0KKwogCWlmICghdWlvaW5mbyB8fCAhdWlvaW5mby0+bmFtZSB8fCAhdWlvaW5mby0+dmVyc2lvbikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIHBsYXRmb3JtX2RhdGFcbiIpOwogCQlnb3RvIGJhZDA7CkBAIC0xMzcsNyArMTYyLDcgQEAKIAogCQl1aW9tZW0tPm1lbXR5cGUgPSBVSU9fTUVNX1BIWVM7CiAJCXVpb21lbS0+YWRkciA9IHItPnN0YXJ0OwotCQl1aW9tZW0tPnNpemUgPSByLT5lbmQgLSByLT5zdGFydCArIDE7CisJCXVpb21lbS0+c2l6ZSA9IHJlc291cmNlX3NpemUocik7CiAJCSsrdWlvbWVtOwogCX0KIApAQCAtMTgwLDYgKzIwNSwxMCBAQAogCWtmcmVlKHByaXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKICBiYWQwOgorCS8qIGtmcmVlIHVpb2luZm8gZm9yIE9GICovCisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKQorCQlrZnJlZSh1aW9pbmZvKTsKKyBiYWQyOgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE5Myw2ICsyMjIsMTAgQEAKIAlwcml2LT51aW9pbmZvLT5oYW5kbGVyID0gTlVMTDsKIAlwcml2LT51aW9pbmZvLT5pcnFjb250cm9sID0gTlVMTDsKIAorCS8qIGtmcmVlIHVpb2luZm8gZm9yIE9GICovCisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKQorCQlrZnJlZShwcml2LT51aW9pbmZvKTsKKwogCWtmcmVlKHByaXYpOwogCXJldHVybiAwOwogfQpAQCAtMjE5LDYgKzI1MiwxNSBAQAogCS5ydW50aW1lX3Jlc3VtZSA9IHVpb19wZHJ2X2dlbmlycV9ydW50aW1lX25vcCwKIH07CiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9fZGV2aW5pdGNvbnN0IHVpb19vZl9nZW5pcnFfbWF0Y2hbXSA9IHsKKwl7IC8qIGVtcHR5IGZvciBub3cgKi8gfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB1aW9fb2ZfZ2VuaXJxX21hdGNoKTsKKyNlbHNlCisjIGRlZmluZSB1aW9fb2ZfZ2VuaXJxX21hdGNoIE5VTEwKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1aW9fcGRydl9nZW5pcnEgPSB7CiAJLnByb2JlID0gdWlvX3BkcnZfZ2VuaXJxX3Byb2JlLAogCS5yZW1vdmUgPSB1aW9fcGRydl9nZW5pcnFfcmVtb3ZlLApAQCAtMjI2LDYgKzI2OCw3IEBACiAJCS5uYW1lID0gRFJJVkVSX05BTUUsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkucG0gPSAmdWlvX3BkcnZfZ2VuaXJxX2Rldl9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IHVpb19vZl9nZW5pcnFfbWF0Y2gsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCmluZGV4IGU3MTUyMWMuLjQyOGYzNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwpAQCAtMTE2LDE0ICsxMTYsMTQgQEAKIAl1MzIgYWRkcmVzczsKIAl1MTYgb2Zmc2V0OwogCXUzMiBkYXRhOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgdWVhX2NtdnNfdjIgewogCXUzMiBncm91cDsKIAl1MzIgYWRkcmVzczsKIAl1MzIgb2Zmc2V0OwogCXUzMiBkYXRhOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50bHkgcHJvY2Vzc2VkIGNtdiAqLwogc3RydWN0IGNtdl9kc2NfZTEgewpAQCAtMzUyLDcgKzM1Miw3IEBACiAJX19sZTMyIFBhZ2VBZGRyZXNzOwogCV9fbGUxNiBkdW1teTE7CiAJX19sZTE2IFBhZ2VOdW1iZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgRTRfSVNfQk9PVF9QQUdFKFBhZ2VTaXplKSAoKGxlMzJfdG9fY3B1KFBhZ2VTaXplKSkgJiAweDgwMDAwMDAwKQogI2RlZmluZSBFNF9QQUdFX0JZVEVTKFBhZ2VTaXplKSAoKGxlMzJfdG9fY3B1KFBhZ2VTaXplKSAmIDB4N2ZmZmZmZmYpICogNCkKQEAgLTM2Nyw3ICszNjcsNyBAQAogCXU4IHBhZ2VfbnVtYmVyX3RvX2Jsb2NrX2luZGV4W0U0X01BWF9QQUdFX05VTUJFUl07CiAJc3RydWN0IGJsb2NrX2luZGV4IHBhZ2VfaGVhZGVyW0U0X05PX1NXQVBQQUdFX0hFQURFUlNdOwogCXU4IGNvZGVbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIHN0cnVjdHVyZXMgZGVzY3JpYmluZyBhIGJsb2NrIHdpdGhpbiBhIERTUCBwYWdlICovCiBzdHJ1Y3QgYmxvY2tfaW5mb19lMSB7CkBAIC0zNzcsNyArMzc3LDcgQEAKIAlfX2xlMTYgd092bE9mZnNldDsKIAlfX2xlMTYgd092bDsJCS8qIG92ZXJsYXkgKi8KIAlfX2xlMTYgd0xhc3Q7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAjZGVmaW5lIEUxX0JMT0NLX0lORk9fU0laRSAxMgogCiBzdHJ1Y3QgYmxvY2tfaW5mb19lNCB7CkBAIC0zODcsNyArMzg3LDcgQEAKIAlfX2JlMzIgZHdTaXplOwogCV9fYmUzMiBkd0FkZHJlc3M7CiAJX19iZTE2IHdSZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKICNkZWZpbmUgRTRfQkxPQ0tfSU5GT19TSVpFIDE0CiAKICNkZWZpbmUgVUVBX0JJSERSIDB4YWJjZApAQCAtNDY3LDcgKzQ2Nyw3IEBACiAJX19sZTMyIGR3U3ltYm9saWNBZGRyZXNzOwogCV9fbGUxNiB3T2Zmc2V0QWRkcmVzczsKIAlfX2xlMzIgZHdEYXRhOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY212X2U0IHsKIAlfX2JlMTYgd0dyb3VwOwpAQCAtNDc1LDE3ICs0NzUsMTcgQEAKIAlfX2JlMTYgd09mZnNldDsKIAlfX2JlMTYgd0FkZHJlc3M7CiAJX19iZTMyIGR3RGF0YVs2XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogc3RydWN0dXJlcyByZXByZXNlbnRpbmcgc3dhcCBpbmZvcm1hdGlvbiAqLwogc3RydWN0IHN3YXBfaW5mb19lMSB7CiAJX191OCBiU3dhcFBhZ2VObzsKIAlfX3U4IGJPdmw7CQkvKiBvdmVybGF5ICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBzd2FwX2luZm9fZTQgewogCV9fdTggYlN3YXBQYWdlTm87Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIGludGVycnVwdCBkYXRhICovCiAjZGVmaW5lIGUxX2JTd2FwUGFnZU5vCXUuZTEuczEuc3dhcGluZm8uYlN3YXBQYWdlTm8KQEAgLTQ5OSwyMyArNDk5LDIzIEBACiAJc3RydWN0IHsKIAkJc3RydWN0IHN3YXBfaW5mb19lMSBzd2FwaW5mbzsKIAkJX19sZTE2IHdEYXRhU2l6ZTsKLQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBzMTsKKwl9IF9fcGFja2VkIHMxOwogCXN0cnVjdCB7CiAJCXN0cnVjdCBjbXZfZTEgY212OwogCQlfX2xlMTYgd0RhdGFTaXplOwotCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHMyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJfSBfX3BhY2tlZCBzMjsKK30gX19wYWNrZWQ7CiAKIHVuaW9uIGludHJfZGF0YV9lNCB7CiAJc3RydWN0IHsKIAkJc3RydWN0IHN3YXBfaW5mb19lNCBzd2FwaW5mbzsKIAkJX19sZTE2IHdEYXRhU2l6ZTsKLQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBzMTsKKwl9IF9fcGFja2VkIHMxOwogCXN0cnVjdCB7CiAJCXN0cnVjdCBjbXZfZTQgY212OwogCQlfX2xlMTYgd0RhdGFTaXplOwotCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHMyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJfSBfX3BhY2tlZCBzMjsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpbnRyX3BrdCB7CiAJX191OCBiVHlwZTsKQEAgLTUyOCwxNSArNTI4LDE1IEBACiAJCXVuaW9uIGludHJfZGF0YV9lMSBlMTsKIAkJdW5pb24gaW50cl9kYXRhX2U0IGU0OwogCX0gdTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBFMV9JTlRSX1BLVF9TSVpFIDI4CiAjZGVmaW5lIEU0X0lOVFJfUEtUX1NJWkUgNjQKIAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVlYV9kcml2ZXI7CiBzdGF0aWMgREVGSU5FX01VVEVYKHVlYV9tdXRleCk7Ci1zdGF0aWMgY29uc3QgY2hhciAqY2hpcF9uYW1lW10gPSB7IkFESTkzMCIsICJFYWdsZSBJIiwgIkVhZ2xlIElJIiwgIkVhZ2xlIElJSSIsCi0JCQkJCQkJCSJFYWdsZSBJViJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjaGlwX25hbWVbXSA9IHsKKwkiQURJOTMwIiwgIkVhZ2xlIEkiLCAiRWFnbGUgSUkiLCAiRWFnbGUgSUlJIiwgIkVhZ2xlIElWIn07CiAKIHN0YXRpYyBpbnQgbW9kZW1faW5kZXg7CiBzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCmluZGV4IDk4OWUxNmUuLmQzNDQ4Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYworKysgYi9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKQEAgLTgxLDYgKzgxLDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAKICNpZmRlZiBWRVJCT1NFX0RFQlVHCiBzdGF0aWMgaW50IHVzYmF0bV9wcmludF9wYWNrZXQoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbik7CkBAIC02NjgsOCArNjY5LDcgQEAKIAkvKiByYWN5IGRpc2Nvbm5lY3Rpb24gY2hlY2sgLSBmaW5lICovCiAJaWYgKCFpbnN0YW5jZSB8fCBpbnN0YW5jZS0+ZGlzY29ubmVjdGVkKSB7CiAjaWZkZWYgREVCVUcKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMhXG4iLCBfX2Z1bmNfXywgaW5zdGFuY2UgPyAiZGlzY29ubmVjdGVkIiA6ICJOVUxMIGluc3RhbmNlIik7CisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0RFQlVHICIlczogJXMhXG4iLCBfX2Z1bmNfXywgaW5zdGFuY2UgPyAiZGlzY29ubmVjdGVkIiA6ICJOVUxMIGluc3RhbmNlIik7CiAjZW5kaWYKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCmluZGV4IDM5NWEzNDcuLmRhYzc2NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKQEAgLTE1MzAsNiArMTUzMCw4IEBACiAJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDRjZSksIH0sIC8qIE5va2lhIEU5MCAqLwogCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAxZDQpLCB9LCAvKiBOb2tpYSBFNTUgKi8KIAl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMzAyKSwgfSwgLyogTm9raWEgTjggKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMzM1KSwgfSwgLyogTm9raWEgRTcgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwM2NkKSwgfSwgLyogTm9raWEgQzcgKi8KIAl7IFNBTVNVTkdfUENTVUlURV9BQ01fSU5GTygweDY2NTEpLCB9LCAvKiBTYW1zdW5nIEdUaTg1MTAgKElOTk9WOCkgKi8KIAogCS8qIE5PVEU6IG5vbi1Ob2tpYSBDT01NL0FDTS8weGZmIGlzIGxpa2VseSBNU0ZUIFJORElTLi4uIE5PVCBhIG1vZGVtISAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYyBiL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMKaW5kZXggOWVjYTQwNS4uY2IzYTkzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2JscC5jCkBAIC01OCw2ICs1OCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICN1bmRlZiBERUJVRwogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAvKgogICogVmVyc2lvbiBJbmZvcm1hdGlvbgpAQCAtMzQ4LDggKzM0OSw3IEBACiAJbXV0ZXhfbG9jaygmdXNibHAtPm11dCk7CiAJaWYgKChlcnJvciA9IHVzYmxwX3JlYWRfc3RhdHVzKHVzYmxwLCB1c2JscC0+c3RhdHVzYnVmKSkgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmdXNibHAtPm11dCk7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9FUlIKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSCiAJCQkJInVzYmxwJWQ6IGVycm9yICVkIHJlYWRpbmcgcHJpbnRlciBzdGF0dXNcbiIsCiAJCQkJdXNibHAtPm1pbm9yLCBlcnJvcik7CiAJCXJldHVybiAwOwpAQCAtNjUzLDggKzY1Myw3IEBACiAKIAkJY2FzZSBMUEdFVFNUQVRVUzoKIAkJCWlmICgocmV0dmFsID0gdXNibHBfcmVhZF9zdGF0dXModXNibHAsIHVzYmxwLT5zdGF0dXNidWYpKSkgewotCQkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQkJCXByaW50ayhLRVJOX0VSUiAidXNibHAlZDoiCisJCQkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJ1c2JscCVkOiIKIAkJCQkJICAgICJmYWlsZWQgcmVhZGluZyBwcmludGVyIHN0YXR1cyAoJWQpXG4iLAogCQkJCQkgICAgdXNibHAtPm1pbm9yLCByZXR2YWwpOwogCQkJCXJldHZhbCA9IC1FSU87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwppbmRleCBlMzVhMTc2Li4zNGUzZGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKQEAgLTM3NSw3ICszNzUsNyBAQAogCQkgKiBKdXN0IHJlLWVuYWJsZSBpdCB3aXRob3V0IGFmZmVjdGluZyB0aGUgZW5kcG9pbnQgdG9nZ2xlcy4KIAkJICovCiAJCXVzYl9lbmFibGVfaW50ZXJmYWNlKHVkZXYsIGludGYsIGZhbHNlKTsKLQl9IGVsc2UgaWYgKCFlcnJvciAmJiAhaW50Zi0+ZGV2LnBvd2VyLmluX3N1c3BlbmQpIHsKKwl9IGVsc2UgaWYgKCFlcnJvciAmJiAhaW50Zi0+ZGV2LnBvd2VyLmlzX3ByZXBhcmVkKSB7CiAJCXIgPSB1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCBpbnRmLT5hbHRzZXR0aW5nWzBdLgogCQkJCWRlc2MuYkludGVyZmFjZU51bWJlciwgMCk7CiAJCWlmIChyIDwgMCkKQEAgLTk2MCw3ICs5NjAsNyBAQAogCX0KIAogCS8qIFRyeSB0byByZWJpbmQgdGhlIGludGVyZmFjZSAqLwotCWlmICghaW50Zi0+ZGV2LnBvd2VyLmluX3N1c3BlbmQpIHsKKwlpZiAoIWludGYtPmRldi5wb3dlci5pc19wcmVwYXJlZCkgewogCQlpbnRmLT5uZWVkc19iaW5kaW5nID0gMDsKIAkJcmMgPSBkZXZpY2VfYXR0YWNoKCZpbnRmLT5kZXYpOwogCQlpZiAocmMgPCAwKQpAQCAtMTEwNyw3ICsxMTA3LDcgQEAKIAlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkgewogCiAJCS8qIENhcnJ5IG91dCBhIGRlZmVycmVkIHN3aXRjaCB0byBhbHRzZXR0aW5nIDAgKi8KLQkJaWYgKGludGYtPm5lZWRzX2FsdHNldHRpbmcwICYmICFpbnRmLT5kZXYucG93ZXIuaW5fc3VzcGVuZCkgeworCQlpZiAoaW50Zi0+bmVlZHNfYWx0c2V0dGluZzAgJiYgIWludGYtPmRldi5wb3dlci5pc19wcmVwYXJlZCkgewogCQkJdXNiX3NldF9pbnRlcmZhY2UodWRldiwgaW50Zi0+YWx0c2V0dGluZ1swXS4KIAkJCQkJZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAwKTsKIAkJCWludGYtPm5lZWRzX2FsdHNldHRpbmcwID0gMDsKQEAgLTExODcsMTMgKzExODcsMjIgQEAKIAkJZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAJCQlpbnRmID0gdWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV07CiAJCQlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9pbnRlcmZhY2UodWRldiwgaW50ZiwgbXNnKTsKKworCQkJLyogSWdub3JlIGVycm9ycyBkdXJpbmcgc3lzdGVtIHNsZWVwIHRyYW5zaXRpb25zICovCisJCQlpZiAoIShtc2cuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSkKKwkJCQlzdGF0dXMgPSAwOwogCQkJaWYgKHN0YXR1cyAhPSAwKQogCQkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChzdGF0dXMgPT0gMCkKKwlpZiAoc3RhdHVzID09IDApIHsKIAkJc3RhdHVzID0gdXNiX3N1c3BlbmRfZGV2aWNlKHVkZXYsIG1zZyk7CiAKKwkJLyogQWdhaW4sIGlnbm9yZSBlcnJvcnMgZHVyaW5nIHN5c3RlbSBzbGVlcCB0cmFuc2l0aW9ucyAqLworCQlpZiAoIShtc2cuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSkKKwkJCXN0YXR1cyA9IDA7CisJfQorCiAJLyogSWYgdGhlIHN1c3BlbmQgZmFpbGVkLCByZXN1bWUgaW50ZXJmYWNlcyB0aGF0IGRpZCBnZXQgc3VzcGVuZGVkICovCiAJaWYgKHN0YXR1cyAhPSAwKSB7CiAJCW1zZy5ldmVudCBePSAoUE1fRVZFTlRfU1VTUEVORCB8IFBNX0VWRU5UX1JFU1VNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwppbmRleCBhY2U5Zjg0Li44NjY5YmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKQEAgLTMzNyw2ICszMzcsMTcgQEAKIAkweDAyLCAweDAwICAgLyogX19sZTE2IHNzX3dCeXRlc1BlckludGVydmFsOyAxNSBiaXRzIGZvciBtYXggMTUgcG9ydHMgKi8KIH07CiAKKy8qIGF1dGhvcml6ZWRfZGVmYXVsdCBiZWhhdmlvdXI6CisgKiAtMSBpcyBhdXRob3JpemVkIGZvciBhbGwgZGV2aWNlcyBleGNlcHQgd2lyZWxlc3MgKG9sZCBiZWhhdmlvdXIpCisgKiAwIGlzIHVuYXV0aG9yaXplZCBmb3IgYWxsIGRldmljZXMKKyAqIDEgaXMgYXV0aG9yaXplZCBmb3IgYWxsIGRldmljZXMKKyAqLworc3RhdGljIGludCBhdXRob3JpemVkX2RlZmF1bHQgPSAtMTsKK21vZHVsZV9wYXJhbShhdXRob3JpemVkX2RlZmF1bHQsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoYXV0aG9yaXplZF9kZWZhdWx0LAorCQkiRGVmYXVsdCBVU0IgZGV2aWNlIGF1dGhvcml6YXRpb246IDAgaXMgbm90IGF1dGhvcml6ZWQsIDEgaXMgIgorCQkiYXV0aG9yaXplZCwgLTEgaXMgYXV0aG9yaXplZCBleGNlcHQgZm9yIHdpcmVsZXNzIFVTQiAoZGVmYXVsdCwgIgorCQkib2xkIGJlaGF2aW91ciIpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoqCkBAIC0yMzcxLDcgKzIzODIsMTEgQEAKIAogCWRldl9pbmZvKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiJXNcbiIsIGhjZC0+cHJvZHVjdF9kZXNjKTsKIAotCWhjZC0+YXV0aG9yaXplZF9kZWZhdWx0ID0gaGNkLT53aXJlbGVzcz8gMCA6IDE7CisJLyogS2VlcCBvbGQgYmVoYXZpb3VyIGlmIGF1dGhvcml6ZWRfZGVmYXVsdCBpcyBub3QgaW4gWzAsIDFdLiAqLworCWlmIChhdXRob3JpemVkX2RlZmF1bHQgPCAwIHx8IGF1dGhvcml6ZWRfZGVmYXVsdCA+IDEpCisJCWhjZC0+YXV0aG9yaXplZF9kZWZhdWx0ID0gaGNkLT53aXJlbGVzcz8gMCA6IDE7CisJZWxzZQorCQloY2QtPmF1dGhvcml6ZWRfZGVmYXVsdCA9IGF1dGhvcml6ZWRfZGVmYXVsdDsKIAlzZXRfYml0KEhDRF9GTEFHX0hXX0FDQ0VTU0lCTEUsICZoY2QtPmZsYWdzKTsKIAogCS8qIEhDIGlzIGluIHJlc2V0IHN0YXRlLCBidXQgYWNjZXNzaWJsZS4gIE5vdyBkbyB0aGUgb25lLXRpbWUgaW5pdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IDc5YTU4YzMuLmE0MjhhYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMzM5LDcgKzMzOSw4IEBACiB7CiAJaW50IGksIHN0YXR1cyA9IC1FVElNRURPVVQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVVNCX1NUU19SRVRSSUVTICYmIHN0YXR1cyA9PSAtRVRJTUVET1VUOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgVVNCX1NUU19SRVRSSUVTICYmCisJCQkoc3RhdHVzID09IC1FVElNRURPVVQgfHwgc3RhdHVzID09IC1FUElQRSk7IGkrKykgewogCQlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2coaGRldiwgdXNiX3JjdmN0cmxwaXBlKGhkZXYsIDApLAogCQkJVVNCX1JFUV9HRVRfU1RBVFVTLCBVU0JfRElSX0lOIHwgVVNCX1JUX0hVQiwgMCwgMCwKIAkJCWRhdGEsIHNpemVvZigqZGF0YSksIFVTQl9TVFNfVElNRU9VVCk7CkBAIC0zNTUsNyArMzU2LDggQEAKIHsKIAlpbnQgaSwgc3RhdHVzID0gLUVUSU1FRE9VVDsKIAotCWZvciAoaSA9IDA7IGkgPCBVU0JfU1RTX1JFVFJJRVMgJiYgc3RhdHVzID09IC1FVElNRURPVVQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBVU0JfU1RTX1JFVFJJRVMgJiYKKwkJCShzdGF0dXMgPT0gLUVUSU1FRE9VVCB8fCBzdGF0dXMgPT0gLUVQSVBFKTsgaSsrKSB7CiAJCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhoZGV2LCB1c2JfcmN2Y3RybHBpcGUoaGRldiwgMCksCiAJCQlVU0JfUkVRX0dFVF9TVEFUVVMsIFVTQl9ESVJfSU4gfCBVU0JfUlRfUE9SVCwgMCwgcG9ydDEsCiAJCQlkYXRhLCBzaXplb2YoKmRhdGEpLCBVU0JfU1RTX1RJTUVPVVQpOwpAQCAtMTYzMiw2ICsxNjM0LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldiA9ICpwZGV2OwogCWludAkJCWk7CisJc3RydWN0IHVzYl9oY2QJCSpoY2QgPSBidXNfdG9faGNkKHVkZXYtPmJ1cyk7CiAKIAlpZiAoIXVkZXYpIHsKIAkJcHJfZGVidWcgKCIlcyBub2RldlxuIiwgX19mdW5jX18pOwpAQCAtMTY1OSw3ICsxNjYyLDkgQEAKIAkgKiBzbyB0aGF0IHRoZSBoYXJkd2FyZSBpcyBub3cgZnVsbHkgcXVpZXNjZWQuCiAJICovCiAJZGV2X2RiZyAoJnVkZXYtPmRldiwgInVucmVnaXN0ZXJpbmcgZGV2aWNlXG4iKTsKKwltdXRleF9sb2NrKGhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAl1c2JfZGlzYWJsZV9kZXZpY2UodWRldiwgMCk7CisJbXV0ZXhfdW5sb2NrKGhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAl1c2JfaGNkX3N5bmNocm9uaXplX3VubGlua3ModWRldik7CiAKIAl1c2JfcmVtb3ZlX2VwX2RldnMoJnVkZXYtPmVwMCk7CkBAIC0yMzYwLDYgKzIzNjUsMTAgQEAKIAkJCQlVU0JfREVWSUNFX1JFTU9URV9XQUtFVVAsIDAsCiAJCQkJTlVMTCwgMCwKIAkJCQlVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisKKwkJLyogU3lzdGVtIHNsZWVwIHRyYW5zaXRpb25zIHNob3VsZCBuZXZlciBmYWlsICovCisJCWlmICghKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pKQorCQkJc3RhdHVzID0gMDsKIAl9IGVsc2UgewogCQkvKiBkZXZpY2UgaGFzIHVwIHRvIDEwIG1zZWMgdG8gZnVsbHkgc3VzcGVuZCAqLwogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ1c2IgJXNzdXNwZW5kXG4iLApAQCAtMjYwOSwxNiArMjYxOCwxNSBAQAogCXN0cnVjdCB1c2JfZGV2aWNlCSpoZGV2ID0gaHViLT5oZGV2OwogCXVuc2lnbmVkCQlwb3J0MTsKIAotCS8qIGZhaWwgaWYgY2hpbGRyZW4gYXJlbid0IGFscmVhZHkgc3VzcGVuZGVkICovCisJLyogV2FybiBpZiBjaGlsZHJlbiBhcmVuJ3QgYWxyZWFkeSBzdXNwZW5kZWQgKi8KIAlmb3IgKHBvcnQxID0gMTsgcG9ydDEgPD0gaGRldi0+bWF4Y2hpbGQ7IHBvcnQxKyspIHsKIAkJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CiAKIAkJdWRldiA9IGhkZXYtPmNoaWxkcmVuIFtwb3J0MS0xXTsKIAkJaWYgKHVkZXYgJiYgdWRldi0+Y2FuX3N1Ym1pdCkgewotCQkJaWYgKCEobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykpCi0JCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAicG9ydCAlZCBueWV0IHN1c3BlbmRlZFxuIiwKLQkJCQkJCXBvcnQxKTsKLQkJCXJldHVybiAtRUJVU1k7CisJCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAicG9ydCAlZCBueWV0IHN1c3BlbmRlZFxuIiwgcG9ydDEpOworCQkJaWYgKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pCisJCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jIGIvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCmluZGV4IDFiMTI1YzIuLjIyNzhkYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKQEAgLTM4OSw3ICszODksNiBAQAogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWlmICghZXJyb3IpCiAJCWRfZGVsZXRlKGRlbnRyeSk7Ci0JZHB1dChkZW50cnkpOwogCXJldHVybiBlcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwppbmRleCA1NzAxZTg1Li4wYjVlYzIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYwpAQCAtMTEzNSwxNSArMTEzNSwyNiBAQAogICogRGVhbGxvY2F0ZXMgaGNkL2hhcmR3YXJlIHN0YXRlIGZvciB0aGUgZW5kcG9pbnRzIChudWtpbmcgYWxsIG9yIG1vc3QKICAqIHBlbmRpbmcgdXJicykgYW5kIHVzYmNvcmUgc3RhdGUgZm9yIHRoZSBpbnRlcmZhY2VzLCBzbyB0aGF0IHVzYmNvcmUKICAqIG11c3QgdXNiX3NldF9jb25maWd1cmF0aW9uKCkgYmVmb3JlIGFueSBpbnRlcmZhY2VzIGNvdWxkIGJlIHVzZWQuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBoY2QtPmJhbmR3aWR0aF9tdXRleCBoZWxkLgogICovCiB2b2lkIHVzYl9kaXNhYmxlX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgc2tpcF9lcDApCiB7CiAJaW50IGk7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGJ1c190b19oY2QoZGV2LT5idXMpOwogCiAJLyogZ2V0dGluZyByaWQgb2YgaW50ZXJmYWNlcyB3aWxsIGRpc2Nvbm5lY3QKIAkgKiBhbnkgZHJpdmVycyBib3VuZCB0byB0aGVtIChhIGtleSBzaWRlIGVmZmVjdCkKIAkgKi8KIAlpZiAoZGV2LT5hY3Rjb25maWcpIHsKKwkJLyoKKwkJICogRklYTUU6IEluIG9yZGVyIHRvIGF2b2lkIHNlbGYtZGVhZGxvY2sgaW52b2x2aW5nIHRoZQorCQkgKiBiYW5kd2lkdGhfbXV0ZXgsIHdlIGhhdmUgdG8gbWFyayBhbGwgdGhlIGludGVyZmFjZXMKKwkJICogYmVmb3JlIHVucmVnaXN0ZXJpbmcgYW55IG9mIHRoZW0uCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykKKwkJCWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV0tPnVucmVnaXN0ZXJpbmcgPSAxOworCiAJCWZvciAoaSA9IDA7IGkgPCBkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7CiAJCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkqaW50ZXJmYWNlOwogCkBAIC0xMTUzLDcgKzExNjQsNiBAQAogCQkJCWNvbnRpbnVlOwogCQkJZGV2X2RiZygmZGV2LT5kZXYsICJ1bnJlZ2lzdGVyaW5nIGludGVyZmFjZSAlc1xuIiwKIAkJCQlkZXZfbmFtZSgmaW50ZXJmYWNlLT5kZXYpKTsKLQkJCWludGVyZmFjZS0+dW5yZWdpc3RlcmluZyA9IDE7CiAJCQlyZW1vdmVfaW50Zl9lcF9kZXZzKGludGVyZmFjZSk7CiAJCQlkZXZpY2VfZGVsKCZpbnRlcmZhY2UtPmRldik7CiAJCX0KQEAgLTExNzIsNiArMTE4MiwxNiBAQAogCiAJZGV2X2RiZygmZGV2LT5kZXYsICIlcyBudWtpbmcgJXMgVVJCc1xuIiwgX19mdW5jX18sCiAJCXNraXBfZXAwID8gIm5vbi1lcDAiIDogImFsbCIpOworCWlmIChoY2QtPmRyaXZlci0+Y2hlY2tfYmFuZHdpZHRoKSB7CisJCS8qIEZpcnN0IHBhc3M6IENhbmNlbCBVUkJzLCBsZWF2ZSBlbmRwb2ludCBwb2ludGVycyBpbnRhY3QuICovCisJCWZvciAoaSA9IHNraXBfZXAwOyBpIDwgMTY7ICsraSkgeworCQkJdXNiX2Rpc2FibGVfZW5kcG9pbnQoZGV2LCBpLCBmYWxzZSk7CisJCQl1c2JfZGlzYWJsZV9lbmRwb2ludChkZXYsIGkgKyBVU0JfRElSX0lOLCBmYWxzZSk7CisJCX0KKwkJLyogUmVtb3ZlIGVuZHBvaW50cyBmcm9tIHRoZSBob3N0IGNvbnRyb2xsZXIgaW50ZXJuYWwgc3RhdGUgKi8KKwkJdXNiX2hjZF9hbGxvY19iYW5kd2lkdGgoZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJLyogU2Vjb25kIHBhc3M6IHJlbW92ZSBlbmRwb2ludCBwb2ludGVycyAqLworCX0KIAlmb3IgKGkgPSBza2lwX2VwMDsgaSA8IDE2OyArK2kpIHsKIAkJdXNiX2Rpc2FibGVfZW5kcG9pbnQoZGV2LCBpLCB0cnVlKTsKIAkJdXNiX2Rpc2FibGVfZW5kcG9pbnQoZGV2LCBpICsgVVNCX0RJUl9JTiwgdHJ1ZSk7CkBAIC0xMjczLDYgKzEyOTMsOCBAQAogCQkJaW50ZXJmYWNlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCWlmIChpZmFjZS0+dW5yZWdpc3RlcmluZykKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlhbHQgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaWZhY2UsIGFsdGVybmF0ZSk7CiAJaWYgKCFhbHQpIHsKQEAgLTE3MjcsNiArMTc0OSw3IEBACiAJLyogaWYgaXQncyBhbHJlYWR5IGNvbmZpZ3VyZWQsIGNsZWFyIG91dCBvbGQgc3RhdGUgZmlyc3QuCiAJICogZ2V0dGluZyByaWQgb2Ygb2xkIGludGVyZmFjZXMgbWVhbnMgdW5iaW5kaW5nIHRoZWlyIGRyaXZlcnMuCiAJICovCisJbXV0ZXhfbG9jayhoY2QtPmJhbmR3aWR0aF9tdXRleCk7CiAJaWYgKGRldi0+c3RhdGUgIT0gVVNCX1NUQVRFX0FERFJFU1MpCiAJCXVzYl9kaXNhYmxlX2RldmljZShkZXYsIDEpOwkvKiBTa2lwIGVwMCAqLwogCkBAIC0xNzM5LDcgKzE3NjIsNiBAQAogCSAqIGhvc3QgY29udHJvbGxlciB3aWxsIG5vdCBhbGxvdyBzdWJtaXNzaW9ucyB0byBkcm9wcGVkIGVuZHBvaW50cy4gIElmCiAJICogdGhpcyBjYWxsIGZhaWxzLCB0aGUgZGV2aWNlIHN0YXRlIGlzIHVuY2hhbmdlZC4KIAkgKi8KLQltdXRleF9sb2NrKGhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAlyZXQgPSB1c2JfaGNkX2FsbG9jX2JhbmR3aWR0aChkZXYsIGNwLCBOVUxMLCBOVUxMKTsKIAlpZiAocmV0IDwgMCkgewogCQltdXRleF91bmxvY2soaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwppbmRleCA1ODQ1NmQxLi40NGI2YjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwpAQCAtOTYsOSArOTYsNiBAQAogCSAgIFRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIGV4Y2VwdCBmb3Igc3lzdGVtLXNwZWNpZmljIGdhZGdldAogCSAgIGRyaXZlcnMgdGhhdCBoYXZlIG1vcmUgc3BlY2lmaWMgaW5mb3JtYXRpb24uCiAKLWNvbmZpZwlVU0JfR0FER0VUX1NFTEVDVEVECi0JYm9vbGVhbgotCiAjCiAjIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIgU3VwcG9ydAogIwpAQCAtMTIyLDEwICsxMTksOSBAQAogIyBJbnRlZ3JhdGVkIGNvbnRyb2xsZXJzCiAjCiAKLWNvbmZpZyBVU0JfR0FER0VUX0FUOTEKLQlib29sZWFuICJBdG1lbCBBVDkxIFVTQiBEZXZpY2UgUG9ydCIKK2NvbmZpZyBVU0JfQVQ5MQorCXRyaXN0YXRlICJBdG1lbCBBVDkxIFVTQiBEZXZpY2UgUG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSAmJiAhQVJDSF9BVDkxU0FNOVJMICYmICFBUkNIX0FUOTFDQVA5ICYmICFBUkNIX0FUOTFTQU05RzQ1Ci0Jc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKIAloZWxwCiAJICAgTWFueSBBdG1lbCBBVDkxIHByb2Nlc3NvcnMgKHN1Y2ggYXMgdGhlIEFUOTFSTTIwMDApIGhhdmUgYQogCSAgIGZ1bGwgc3BlZWQgVVNCIERldmljZSBQb3J0IHdpdGggc3VwcG9ydCBmb3IgZml2ZSBjb25maWd1cmFibGUKQEAgLTEzNSwyNyArMTMxLDE2IEBACiAJICAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImF0OTFfdWRjIiBhbmQgZm9yY2UgYWxsCiAJICAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCiAKLWNvbmZpZyBVU0JfQVQ5MQotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBVU0JfR0FER0VUX0FUOTEKLQlkZWZhdWx0IFVTQl9HQURHRVQKLQotY29uZmlnIFVTQl9HQURHRVRfQVRNRUxfVVNCQQotCWJvb2xlYW4gIkF0bWVsIFVTQkEiCitjb25maWcgVVNCX0FUTUVMX1VTQkEKKwl0cmlzdGF0ZSAiQXRtZWwgVVNCQSIKIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAlkZXBlbmRzIG9uIEFWUjMyIHx8IEFSQ0hfQVQ5MUNBUDkgfHwgQVJDSF9BVDkxU0FNOVJMIHx8IEFSQ0hfQVQ5MVNBTTlHNDUKIAloZWxwCiAJICBVU0JBIGlzIHRoZSBpbnRlZ3JhdGVkIGhpZ2gtc3BlZWQgVVNCIERldmljZSBjb250cm9sbGVyIG9uCiAJICB0aGUgQVQzMkFQNzAweCwgc29tZSBBVDkxU0FNOSBhbmQgQVQ5MUNBUDkgcHJvY2Vzc29ycyBmcm9tIEF0bWVsLgogCi1jb25maWcgVVNCX0FUTUVMX1VTQkEKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gVVNCX0dBREdFVF9BVE1FTF9VU0JBCi0JZGVmYXVsdCBVU0JfR0FER0VUCi0Jc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKLQotY29uZmlnIFVTQl9HQURHRVRfRlNMX1VTQjIKLQlib29sZWFuICJGcmVlc2NhbGUgSGlnaHNwZWVkIFVTQiBEUiBQZXJpcGhlcmFsIENvbnRyb2xsZXIiCitjb25maWcgVVNCX0ZTTF9VU0IyCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBIaWdoc3BlZWQgVVNCIERSIFBlcmlwaGVyYWwgQ29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEZTTF9TT0MgfHwgQVJDSF9NWEMKIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAlzZWxlY3QgVVNCX0ZTTF9NUEhfRFJfT0YgaWYgT0YKQEAgLTE3MCwyNiArMTU1LDE1IEBACiAJICAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImZzbF91c2IyX3VkYyIgYW5kIGZvcmNlCiAJICAgYWxsIGdhZGdldCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgogCi1jb25maWcgVVNCX0ZTTF9VU0IyCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVRfRlNMX1VTQjIKLQlkZWZhdWx0IFVTQl9HQURHRVQKLQlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAotCi1jb25maWcgVVNCX0dBREdFVF9GVVNCMzAwCi0JYm9vbGVhbiAiRmFyYWRheSBGVVNCMzAwIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIiCitjb25maWcgVVNCX0ZVU0IzMDAKKwl0cmlzdGF0ZSAiRmFyYWRheSBGVVNCMzAwIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiAhUEhZU19BRERSX1RfNjRCSVQKIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAloZWxwCiAJICAgRmFyYWRheSB1c2IgZGV2aWNlIGNvbnRyb2xsZXIgRlVTQjMwMCBkcml2ZXIKIAotY29uZmlnIFVTQl9GVVNCMzAwCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVRfRlVTQjMwMAotCWRlZmF1bHQgVVNCX0dBREdFVAotCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECi0KLWNvbmZpZyBVU0JfR0FER0VUX09NQVAKLQlib29sZWFuICJPTUFQIFVTQiBEZXZpY2UgQ29udHJvbGxlciIKK2NvbmZpZyBVU0JfT01BUAorCXRyaXN0YXRlICJPTUFQIFVTQiBEZXZpY2UgQ29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUAogCXNlbGVjdCBJU1AxMzAxX09NQVAgaWYgTUFDSF9PTUFQX0gyIHx8IE1BQ0hfT01BUF9IMyB8fCBNQUNIX09NQVBfSDRfT1RHCiAJc2VsZWN0IFVTQl9PVEdfVVRJTFMgaWYgQVJDSF9PTUFQCkBAIC0yMDQsMTQgKzE3OCw4IEBACiAJICAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgIm9tYXBfdWRjIiBhbmQgZm9yY2UgYWxsCiAJICAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCiAKLWNvbmZpZyBVU0JfT01BUAotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBVU0JfR0FER0VUX09NQVAKLQlkZWZhdWx0IFVTQl9HQURHRVQKLQlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAotCi1jb25maWcgVVNCX0dBREdFVF9QWEEyNVgKLQlib29sZWFuICJQWEEgMjV4IG9yIElYUCA0eHgiCitjb25maWcgVVNCX1BYQTI1WAorCXRyaXN0YXRlICJQWEEgMjV4IG9yIElYUCA0eHgiCiAJZGVwZW5kcyBvbiAoQVJDSF9QWEEgJiYgUFhBMjV4KSB8fCBBUkNIX0lYUDRYWAogCXNlbGVjdCBVU0JfT1RHX1VUSUxTCiAJaGVscApAQCAtMjI2LDI0ICsxOTQsMTggQEAKIAkgICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAicHhhMjV4X3VkYyIgYW5kIGZvcmNlIGFsbAogCSAgIGdhZGdldCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgogCi1jb25maWcgVVNCX1BYQTI1WAotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBVU0JfR0FER0VUX1BYQTI1WAotCWRlZmF1bHQgVVNCX0dBREdFVAotCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECi0KICMgaWYgdGhlcmUncyBvbmx5IG9uZSBnYWRnZXQgZHJpdmVyLCB1c2luZyBvbmx5IHR3byBidWxrIGVuZHBvaW50cywKICMgZG9uJ3Qgd2FzdGUgbWVtb3J5IGZvciB0aGUgb3RoZXIgZW5kcG9pbnRzCiBjb25maWcgVVNCX1BYQTI1WF9TTUFMTAotCWRlcGVuZHMgb24gVVNCX0dBREdFVF9QWEEyNVgKKwlkZXBlbmRzIG9uIFVTQl9QWEEyNVgKIAlib29sCiAJZGVmYXVsdCBuIGlmIFVTQl9FVEhfUk5ESVMKIAlkZWZhdWx0IHkgaWYgVVNCX1pFUk8KIAlkZWZhdWx0IHkgaWYgVVNCX0VUSAogCWRlZmF1bHQgeSBpZiBVU0JfR19TRVJJQUwKIAotY29uZmlnIFVTQl9HQURHRVRfUjhBNjY1OTcKLQlib29sZWFuICJSZW5lc2FzIFI4QTY2NTk3IFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIiCitjb25maWcgVVNCX1I4QTY2NTk3CisJdHJpc3RhdGUgIlJlbmVzYXMgUjhBNjY1OTcgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlciIKIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAloZWxwCiAJICAgUjhBNjY1OTcgaXMgYSBkaXNjcmV0ZSBVU0IgaG9zdCBhbmQgcGVyaXBoZXJhbCBjb250cm9sbGVyIGNoaXAgdGhhdApAQCAtMjU0LDMyICsyMTYsMjIgQEAKIAkgICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAicjhhNjY1OTdfdWRjIiBhbmQgZm9yY2UgYWxsCiAJICAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCiAKLWNvbmZpZyBVU0JfUjhBNjY1OTcKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gVVNCX0dBREdFVF9SOEE2NjU5NwotCWRlZmF1bHQgVVNCX0dBREdFVAotCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECi0KLWNvbmZpZyBVU0JfR0FER0VUX1JFTkVTQVNfVVNCSFMKLQlib29sZWFuICJSZW5lc2FzIFVTQkhTIgorY29uZmlnIFVTQl9SRU5FU0FTX1VTQkhTX1VEQworCXRyaXN0YXRlICdSZW5lc2FzIFVTQkhTIGNvbnRyb2xsZXInCisJZGVwZW5kcyBvbiBTVVBFUkggfHwgQVJDSF9TSE1PQklMRQogCWRlcGVuZHMgb24gVVNCX1JFTkVTQVNfVVNCSFMKIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAloZWxwCi0JICAgUmVuZXNhcyBVU0JIUyBpcyBhIGRpc2NyZXRlIFVTQiBob3N0IGFuZCBwZXJpcGhlcmFsIGNvbnRyb2xsZXIKLQkgICBjaGlwIHRoYXQgc3VwcG9ydHMgYm90aCBmdWxsIGFuZCBoaWdoIHNwZWVkIFVTQiAyLjAgZGF0YSB0cmFuc2ZlcnMuCi0JICAgcGxhdGZvcm0gaXMgYWJsZSB0byBjb25maWd1cmUgZW5kcG9pbnQgKHBpcGUpIHN0eWxlCisJICAgUmVuZXNhcyBVU0JIUyBpcyBhIGRpc2NyZXRlIFVTQiBob3N0IGFuZCBwZXJpcGhlcmFsIGNvbnRyb2xsZXIgY2hpcAorCSAgIHRoYXQgc3VwcG9ydHMgYm90aCBmdWxsIGFuZCBoaWdoIHNwZWVkIFVTQiAyLjAgZGF0YSB0cmFuc2ZlcnMuCisJICAgSXQgaGFzIG5pbmUgb3IgbW9yZSBjb25maWd1cmFibGUgZW5kcG9pbnRzLCBhbmQgZW5kcG9pbnQgemVyby4KIAotCSAgIFNheSAieSIgdG8gZW5hYmxlIHRoZSBnYWRnZXQgc3BlY2lmaWMgcG9ydGlvbiBvZiB0aGUgVVNCSFMgZHJpdmVyLgorCSAgIFNheSAieSIgdG8gbGluayB0aGUgZHJpdmVyIHN0YXRpY2FsbHksIG9yICJtIiB0byBidWlsZCBhCisJICAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgInJlbmVzYXNfdXNiaHMiIGFuZCBmb3JjZSBhbGwKKwkgICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAotCi1jb25maWcgVVNCX1JFTkVTQVNfVVNCSFNfVURDCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVRfUkVORVNBU19VU0JIUwotCWRlZmF1bHQgVVNCX0dBREdFVAotCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECi0KLWNvbmZpZyBVU0JfR0FER0VUX1BYQTI3WAotCWJvb2xlYW4gIlBYQSAyN3giCitjb25maWcgVVNCX1BYQTI3WAorCXRyaXN0YXRlICJQWEEgMjd4IgogCWRlcGVuZHMgb24gQVJDSF9QWEEgJiYgKFBYQTI3eCB8fCBQWEEzeHgpCiAJc2VsZWN0IFVTQl9PVEdfVVRJTFMKIAloZWxwCkBAIC0yOTMsMTQgKzI0NSw4IEBACiAJICAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgInB4YTI3eF91ZGMiIGFuZCBmb3JjZSBhbGwKIAkgICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAotY29uZmlnIFVTQl9QWEEyN1gKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gVVNCX0dBREdFVF9QWEEyN1gKLQlkZWZhdWx0IFVTQl9HQURHRVQKLQlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAotCi1jb25maWcgVVNCX0dBREdFVF9TM0NfSFNPVEcKLQlib29sZWFuICJTM0MgSFMvT3RHIFVTQiBEZXZpY2UgY29udHJvbGxlciIKK2NvbmZpZyBVU0JfUzNDX0hTT1RHCisJdHJpc3RhdGUgIlMzQyBIUy9PdEcgVVNCIERldmljZSBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gUzNDX0RFVl9VU0JfSFNPVEcKIAlzZWxlY3QgVVNCX0dBREdFVF9TM0NfSFNPVEdfUElPCiAJc2VsZWN0IFVTQl9HQURHRVRfRFVBTFNQRUVECkBAIC0zMDgsMTQgKzI1NCw4IEBACiAJICBUaGUgU2Ftc3VuZyBTM0M2NFhYIFVTQjIuMCBoaWdoLXNwZWVkIGdhZGdldCBjb250cm9sbGVyCiAJICBpbnRlZ3JhdGVkIGludG8gdGhlIFMzQzY0WFggc2VyaWVzIFNvQy4KIAotY29uZmlnIFVTQl9TM0NfSFNPVEcKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gVVNCX0dBREdFVF9TM0NfSFNPVEcKLQlkZWZhdWx0IFVTQl9HQURHRVQKLQlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAotCi1jb25maWcgVVNCX0dBREdFVF9JTVgKLQlib29sZWFuICJGcmVlc2NhbGUgSU1YIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIiCitjb25maWcgVVNCX0lNWAorCXRyaXN0YXRlICJGcmVlc2NhbGUgSU1YIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBBUkNIX01YMQogCWhlbHAKIAkgICBGcmVlc2NhbGUncyBJTVggc2VyaWVzIGluY2x1ZGUgYW4gaW50ZWdyYXRlZCBmdWxsIHNwZWVkCkBAIC0zMjksMTQgKzI2OSw4IEBACiAJICAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImlteF91ZGMiIGFuZCBmb3JjZSBhbGwKIAkgICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAotY29uZmlnIFVTQl9JTVgKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gVVNCX0dBREdFVF9JTVgKLQlkZWZhdWx0IFVTQl9HQURHRVQKLQlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAotCi1jb25maWcgVVNCX0dBREdFVF9TM0MyNDEwCi0JYm9vbGVhbiAiUzNDMjQxMCBVU0IgRGV2aWNlIENvbnRyb2xsZXIiCitjb25maWcgVVNCX1MzQzI0MTAKKwl0cmlzdGF0ZSAiUzNDMjQxMCBVU0IgRGV2aWNlIENvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAKIAloZWxwCiAJICBTYW1zdW5nJ3MgUzNDMjQxMCBpcyBhbiBBUk0tNCBwcm9jZXNzb3Igd2l0aCBhbiBpbnRlZ3JhdGVkCkBAIC0zNDYsMTggKzI4MCwxMiBAQAogCSAgVGhpcyBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIHRoZSBTM0MyNDEwLCBTM0MyNDEyLCBhbmQKIAkgIFMzQzI0NDAgcHJvY2Vzc29ycy4KIAotY29uZmlnIFVTQl9TM0MyNDEwCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVRfUzNDMjQxMAotCWRlZmF1bHQgVVNCX0dBREdFVAotCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECi0KIGNvbmZpZyBVU0JfUzNDMjQxMF9ERUJVRwogCWJvb2xlYW4gIlMzQzI0MTAgdWRjIGRlYnVnIG1lc3NhZ2VzIgotCWRlcGVuZHMgb24gVVNCX0dBREdFVF9TM0MyNDEwCisJZGVwZW5kcyBvbiBVU0JfUzNDMjQxMAogCi1jb25maWcgVVNCX0dBREdFVF9TM0NfSFNVREMKLQlib29sZWFuICJTM0MyNDE2LCBTM0MyNDQzIGFuZCBTM0MyNDUwIFVTQiBEZXZpY2UgQ29udHJvbGxlciIKK2NvbmZpZyBVU0JfUzNDX0hTVURDCisJdHJpc3RhdGUgIlMzQzI0MTYsIFMzQzI0NDMgYW5kIFMzQzI0NTAgVVNCIERldmljZSBDb250cm9sbGVyIgogCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwCiAJc2VsZWN0IFVTQl9HQURHRVRfRFVBTFNQRUVECiAJaGVscApAQCAtMzY3LDQxICsyOTUsMjkgQEAKIAogCSAgVGhpcyBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIFMzQzI0MTYgYW5kIFMzQzI0NTAgcHJvY2Vzc29ycy4KIAotY29uZmlnIFVTQl9TM0NfSFNVREMKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gVVNCX0dBREdFVF9TM0NfSFNVREMKLQlkZWZhdWx0IFVTQl9HQURHRVQKLQlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAotCi1jb25maWcgVVNCX0dBREdFVF9QWEFfVTJPCi0JYm9vbGVhbiAiUFhBOXh4IFByb2Nlc3NvciBVU0IyLjAgY29udHJvbGxlciIKK2NvbmZpZyBVU0JfUFhBX1UyTworCXRyaXN0YXRlICJQWEE5eHggUHJvY2Vzc29yIFVTQjIuMCBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gQVJDSF9NTVAKIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAloZWxwCiAJICBQWEE5eHggUHJvY2Vzc29yIHNlcmllcyBpbmNsdWRlIGEgaGlnaCBzcGVlZCBVU0IyLjAgZGV2aWNlCiAJICBjb250cm9sbGVyLCB3aGljaCBzdXBwb3J0IGhpZ2ggc3BlZWQgYW5kIGZ1bGwgc3BlZWQgVVNCIHBlcmlwaGVyYWwuCiAKLWNvbmZpZyBVU0JfUFhBX1UyTwotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBVU0JfR0FER0VUX1BYQV9VMk8KLQlkZWZhdWx0IFVTQl9HQURHRVQKLQlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAotCiAjCiAjIENvbnRyb2xsZXJzIGF2YWlsYWJsZSBpbiBib3RoIGludGVncmF0ZWQgYW5kIGRpc2NyZXRlIHZlcnNpb25zCiAjCiAKICMgbXVzYiBidWlsZHMgaW4gLi4vbXVzYiBhbG9uZyB3aXRoIGhvc3Qgc3VwcG9ydAogY29uZmlnIFVTQl9HQURHRVRfTVVTQl9IRFJDCi0JYm9vbGVhbiAiSW52ZW50cmEgSERSQyBVU0IgUGVyaXBoZXJhbCAoVEksIEFESSwgLi4uKSIKKwl0cmlzdGF0ZSAiSW52ZW50cmEgSERSQyBVU0IgUGVyaXBoZXJhbCAoVEksIEFESSwgLi4uKSIKIAlkZXBlbmRzIG9uIFVTQl9NVVNCX0hEUkMgJiYgKFVTQl9NVVNCX1BFUklQSEVSQUwgfHwgVVNCX01VU0JfT1RHKQogCXNlbGVjdCBVU0JfR0FER0VUX0RVQUxTUEVFRAotCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECiAJaGVscAogCSAgVGhpcyBPVEctY2FwYWJsZSBzaWxpY29uIElQIGlzIHVzZWQgaW4gZHVhbCBkZXNpZ25zIGluY2x1ZGluZwogCSAgdGhlIFRJIERhVmluY2ksIE9NQVAgMjQzeCwgT01BUCAzNDN4LCBUVVNCIDYwMTAsIGFuZCBBREkgQmxhY2tmaW4KIAotY29uZmlnIFVTQl9HQURHRVRfTTY2NTkyCi0JYm9vbGVhbiAiUmVuZXNhcyBNNjY1OTIgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlciIKK2NvbmZpZyBVU0JfTTY2NTkyCisJdHJpc3RhdGUgIlJlbmVzYXMgTTY2NTkyIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIiCiAJc2VsZWN0IFVTQl9HQURHRVRfRFVBTFNQRUVECiAJaGVscAogCSAgIE02NjU5MiBpcyBhIGRpc2NyZXRlIFVTQiBwZXJpcGhlcmFsIGNvbnRyb2xsZXIgY2hpcCB0aGF0CkBAIC00MTIsMTggKzMyOCwxMiBAQAogCSAgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJtNjY1OTJfdWRjIiBhbmQgZm9yY2UgYWxsCiAJICAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCiAKLWNvbmZpZyBVU0JfTTY2NTkyCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVRfTTY2NTkyCi0JZGVmYXVsdCBVU0JfR0FER0VUCi0Jc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKLQogIwogIyBDb250cm9sbGVycyBhdmFpbGFibGUgb25seSBpbiBkaXNjcmV0ZSBmb3JtIChhbmQgYWxsIFBDSSBjb250cm9sbGVycykKICMKIAotY29uZmlnIFVTQl9HQURHRVRfQU1ENTUzNlVEQwotCWJvb2xlYW4gIkFNRDU1MzYgVURDIgorY29uZmlnIFVTQl9BTUQ1NTM2VURDCisJdHJpc3RhdGUgIkFNRDU1MzYgVURDIgogCWRlcGVuZHMgb24gUENJCiAJc2VsZWN0IFVTQl9HQURHRVRfRFVBTFNQRUVECiAJaGVscApAQCAtNDM3LDE0ICszNDcsOCBAQAogCSAgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJhbWQ1NTM2dWRjIiBhbmQgZm9yY2UgYWxsCiAJICAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCiAKLWNvbmZpZyBVU0JfQU1ENTUzNlVEQwotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBVU0JfR0FER0VUX0FNRDU1MzZVREMKLQlkZWZhdWx0IFVTQl9HQURHRVQKLQlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAotCi1jb25maWcgVVNCX0dBREdFVF9GU0xfUUUKLQlib29sZWFuICJGcmVlc2NhbGUgUUUvQ1BNIFVTQiBEZXZpY2UgQ29udHJvbGxlciIKK2NvbmZpZyBVU0JfRlNMX1FFCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBRRS9DUE0gVVNCIERldmljZSBDb250cm9sbGVyIgogCWRlcGVuZHMgb24gRlNMX1NPQyAmJiAoUVVJQ0NfRU5HSU5FIHx8IENQTSkKIAloZWxwCiAJICAgU29tZSBvZiBGcmVlc2NhbGUgUG93ZXJQQyBwcm9jZXNzb3JzIGhhdmUgYSBGdWxsIFNwZWVkCkBAIC00NTYsMTQgKzM2MCw4IEBACiAJICAgU2V0IENPTkZJR19VU0JfR0FER0VUIHRvICJtIiB0byBidWlsZCB0aGlzIGRyaXZlciBhcyBhCiAJICAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImZzbF9xZV91ZGMiLgogCi1jb25maWcgVVNCX0ZTTF9RRQotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBVU0JfR0FER0VUX0ZTTF9RRQotCWRlZmF1bHQgVVNCX0dBREdFVAotCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECi0KLWNvbmZpZyBVU0JfR0FER0VUX0NJMTNYWFhfUENJCi0JYm9vbGVhbiAiTUlQUyBVU0IgQ0kxM3h4eCBQQ0kgVURDIgorY29uZmlnIFVTQl9DSTEzWFhYX1BDSQorCXRyaXN0YXRlICJNSVBTIFVTQiBDSTEzeHh4IFBDSSBVREMiCiAJZGVwZW5kcyBvbiBQQ0kKIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAloZWxwCkBAIC00NzQsMTQgKzM3MiwzMSBAQAogCSAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImNpMTN4eHhfdWRjIiBhbmQgZm9yY2UgYWxsCiAJICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAotY29uZmlnIFVTQl9DSTEzWFhYX1BDSQotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBVU0JfR0FER0VUX0NJMTNYWFhfUENJCi0JZGVmYXVsdCBVU0JfR0FER0VUCi0Jc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKK2NvbmZpZyBVU0JfTkVUMjI3MgorCXRyaXN0YXRlICJQTFggTkVUMjI3MiIKKwlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKKwloZWxwCisJICBQTFggTkVUMjI3MiBpcyBhIFVTQiBwZXJpcGhlcmFsIGNvbnRyb2xsZXIgd2hpY2ggc3VwcG9ydHMKKwkgIGJvdGggZnVsbCBhbmQgaGlnaCBzcGVlZCBVU0IgMi4wIGRhdGEgdHJhbnNmZXJzLgogCi1jb25maWcgVVNCX0dBREdFVF9ORVQyMjgwCi0JYm9vbGVhbiAiTmV0Q2hpcCAyMjh4IgorCSAgSXQgaGFzIHRocmVlIGNvbmZpZ3VyYWJsZSBlbmRwb2ludHMsIGFzIHdlbGwgYXMgZW5kcG9pbnQgemVybworCSAgKGZvciBjb250cm9sIHRyYW5zZmVyKS4KKwkgIFNheSAieSIgdG8gbGluayB0aGUgZHJpdmVyIHN0YXRpY2FsbHksIG9yICJtIiB0byBidWlsZCBhCisJICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAibmV0MjI3MiIgYW5kIGZvcmNlIGFsbAorCSAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCisKK2NvbmZpZyBVU0JfTkVUMjI3Ml9ETUEKKwlib29sZWFuICJTdXBwb3J0IGV4dGVybmFsIERNQSBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gVVNCX05FVDIyNzIKKwloZWxwCisJICBUaGUgTkVUMjI3MiBwYXJ0IGNhbiBvcHRpb25hbGx5IHN1cHBvcnQgYW4gZXh0ZXJuYWwgRE1BCisJICBjb250cm9sbGVyLCBidXQgeW91ciBib2FyZCBoYXMgdG8gaGF2ZSBzdXBwb3J0IGluIHRoZQorCSAgZHJpdmVyIGl0c2VsZi4KKworCSAgSWYgdW5zdXJlLCBzYXkgIk4iIGhlcmUuICBUaGUgZHJpdmVyIHdvcmtzIGZpbmUgaW4gUElPIG1vZGUuCisKK2NvbmZpZyBVU0JfTkVUMjI4MAorCXRyaXN0YXRlICJOZXRDaGlwIDIyOHgiCiAJZGVwZW5kcyBvbiBQQ0kKIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAloZWxwCkBAIC00OTYsMTQgKzQxMSw4IEBACiAJICAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgIm5ldDIyODAiIGFuZCBmb3JjZSBhbGwKIAkgICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAotY29uZmlnIFVTQl9ORVQyMjgwCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVRfTkVUMjI4MAotCWRlZmF1bHQgVVNCX0dBREdFVAotCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECi0KLWNvbmZpZyBVU0JfR0FER0VUX0dPS1UKLQlib29sZWFuICJUb3NoaWJhIFRDODZDMDAxICdHb2t1LVMnIgorY29uZmlnIFVTQl9HT0tVCisJdHJpc3RhdGUgIlRvc2hpYmEgVEM4NkMwMDEgJ0dva3UtUyciCiAJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCiAJICAgVGhlIFRvc2hpYmEgVEM4NkMwMDEgaXMgYSBQQ0kgZGV2aWNlIHdoaWNoIGluY2x1ZGVzIGNvbnRyb2xsZXJzCkBAIC01MTYsMTUgKzQyNSwxMCBAQAogCSAgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJnb2t1X3VkYyIgYW5kIHRvIGZvcmNlIGFsbAogCSAgIGdhZGdldCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgogCi1jb25maWcgVVNCX0dPS1UKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gVVNCX0dBREdFVF9HT0tVCi0JZGVmYXVsdCBVU0JfR0FER0VUCi0Jc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKLQotY29uZmlnIFVTQl9HQURHRVRfTEFOR1dFTEwKLQlib29sZWFuICJJbnRlbCBMYW5nd2VsbCBVU0IgRGV2aWNlIENvbnRyb2xsZXIiCitjb25maWcgVVNCX0xBTkdXRUxMCisJdHJpc3RhdGUgIkludGVsIExhbmd3ZWxsIFVTQiBEZXZpY2UgQ29udHJvbGxlciIKIAlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gIVBIWVNfQUREUl9UXzY0QklUCiAJc2VsZWN0IFVTQl9HQURHRVRfRFVBTFNQRUVECiAJaGVscAogCSAgIEludGVsIExhbmd3ZWxsIFVTQiBEZXZpY2UgQ29udHJvbGxlciBpcyBhIEhpZ2gtU3BlZWQgVVNCCkBAIC01MzcsMTQgKzQ0MSw4IEBACiAJICAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImxhbmd3ZWxsX3VkYyIgYW5kIGZvcmNlIGFsbAogCSAgIGdhZGdldCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgogCi1jb25maWcgVVNCX0xBTkdXRUxMCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVRfTEFOR1dFTEwKLQlkZWZhdWx0IFVTQl9HQURHRVQKLQlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAotCi1jb25maWcgVVNCX0dBREdFVF9FRzIwVAotCWJvb2xlYW4gIkludGVsIEVHMjBUIFBDSC9PS0kgU0VNSUNPTkRVQ1RPUiBNTDcyMTMgSU9IIFVEQyIKK2NvbmZpZyBVU0JfRUcyMFQKKwl0cmlzdGF0ZSAiSW50ZWwgRUcyMFQgUENIL09LSSBTRU1JQ09ORFVDVE9SIE1MNzIxMyBJT0ggVURDIgogCWRlcGVuZHMgb24gUENJCiAJc2VsZWN0IFVTQl9HQURHRVRfRFVBTFNQRUVECiAJaGVscApAQCAtNTY1LDE0ICs0NjMsOCBAQAogCSAgTUw3MjEzIGlzIGNvbXBhbmlvbiBjaGlwIGZvciBJbnRlbCBBdG9tIEU2eHggc2VyaWVzLgogCSAgTUw3MjEzIGlzIGNvbXBsZXRlbHkgY29tcGF0aWJsZSBmb3IgSW50ZWwgRUcyMFQgUENILgogCi1jb25maWcgVVNCX0VHMjBUCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVRfRUcyMFQKLQlkZWZhdWx0IFVTQl9HQURHRVQKLQlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAotCi1jb25maWcgVVNCX0dBREdFVF9DSTEzWFhYX01TTQotCWJvb2xlYW4gIk1JUFMgVVNCIENJMTN4eHggZm9yIE1TTSIKK2NvbmZpZyBVU0JfQ0kxM1hYWF9NU00KKwl0cmlzdGF0ZSAiTUlQUyBVU0IgQ0kxM3h4eCBmb3IgTVNNIgogCWRlcGVuZHMgb24gQVJDSF9NU00KIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAlzZWxlY3QgVVNCX01TTV9PVEcKQEAgLTU4OCwzMSArNDgwLDI2IEBACiAJICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAiY2kxM3h4eF9tc20iIGFuZCBmb3JjZSBhbGwKIAkgIGdhZGdldCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgogCi1jb25maWcgVVNCX0NJMTNYWFhfTVNNCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVRfQ0kxM1hYWF9NU00KLQlkZWZhdWx0IFVTQl9HQURHRVQKLQlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAotCiAjCiAjIExBU1QgLS0gZHVtbXkvZW11bGF0ZWQgY29udHJvbGxlcgogIwogCi1jb25maWcgVVNCX0dBREdFVF9EVU1NWV9IQ0QKLQlib29sZWFuICJEdW1teSBIQ0QgKERFVkVMT1BNRU5UKSIKK2NvbmZpZyBVU0JfRFVNTVlfSENECisJdHJpc3RhdGUgIkR1bW15IEhDRCAoREVWRUxPUE1FTlQpIgogCWRlcGVuZHMgb24gVVNCPXkgfHwgKFVTQj1tICYmIFVTQl9HQURHRVQ9bSkKIAlzZWxlY3QgVVNCX0dBREdFVF9EVUFMU1BFRUQKKwlzZWxlY3QgVVNCX0dBREdFVF9TVVBFUlNQRUVECiAJaGVscAogCSAgVGhpcyBob3N0IGNvbnRyb2xsZXIgZHJpdmVyIGVtdWxhdGVzIFVTQiwgbG9vcGluZyBhbGwgZGF0YSB0cmFuc2ZlcgogCSAgcmVxdWVzdHMgYmFjayB0byBhIFVTQiAiZ2FkZ2V0IGRyaXZlciIgaW4gdGhlIHNhbWUgaG9zdC4gIFRoZSBob3N0CiAJICBzaWRlIGlzIHRoZSBtYXN0ZXI7IHRoZSBnYWRnZXQgc2lkZSBpcyB0aGUgc2xhdmUuICBHYWRnZXQgZHJpdmVycwogCSAgY2FuIGJlIGhpZ2gsIGZ1bGwsIG9yIGxvdyBzcGVlZDsgYW5kIHRoZXkgaGF2ZSBhY2Nlc3MgdG8gZW5kcG9pbnRzCiAJICBsaWtlIHRob3NlIGZyb20gTkVUMjI4MCwgUFhBMnh4LCBvciBTQTExMDAgaGFyZHdhcmUuCi0JICAKKwogCSAgVGhpcyBtYXkgaGVscCBpbiBzb21lIHN0YWdlcyBvZiBjcmVhdGluZyBhIGRyaXZlciB0byBlbWJlZCBpbiBhCiAJICBMaW51eCBkZXZpY2UsIHNpbmNlIGl0IGxldHMgeW91IGRlYnVnIHNldmVyYWwgcGFydHMgb2YgdGhlIGdhZGdldAogCSAgZHJpdmVyIHdpdGhvdXQgaXRzIGhhcmR3YXJlIG9yIGRyaXZlcnMgYmVpbmcgaW52b2x2ZWQuCi0JICAKKwogCSAgU2luY2Ugc3VjaCBhIGdhZGdldCBzaWRlIGRyaXZlciBuZWVkcyB0byBpbnRlcm9wZXJhdGUgd2l0aCBhIGhvc3QKIAkgIHNpZGUgTGludXgtVVNCIGRldmljZSBkcml2ZXIsIHRoaXMgbWF5IGhlbHAgdG8gZGVidWcgYm90aCBzaWRlcwogCSAgb2YgYSBVU0IgcHJvdG9jb2wgc3RhY2suCkBAIC02MjEsMzEgKzUwOCwyOCBAQAogCSAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImR1bW15X2hjZCIgYW5kIGZvcmNlIGFsbAogCSAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCiAKLWNvbmZpZyBVU0JfRFVNTVlfSENECi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVRfRFVNTVlfSENECi0JZGVmYXVsdCBVU0JfR0FER0VUCi0Jc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKLQogIyBOT1RFOiAgUGxlYXNlIGtlZXAgZHVtbXlfaGNkIExBU1Qgc28gdGhhdCAicmVhbCBoYXJkd2FyZSIgYXBwZWFycwogIyBmaXJzdCBhbmQgd2lsbCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LgogCiBlbmRjaG9pY2UKIAorIyBTZWxlY3RlZCBieSBVREMgZHJpdmVycyB0aGF0IHN1cHBvcnQgaGlnaC1zcGVlZCBvcGVyYXRpb24uCiBjb25maWcgVVNCX0dBREdFVF9EVUFMU1BFRUQKIAlib29sCiAJZGVwZW5kcyBvbiBVU0JfR0FER0VUCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgTWVhbnMgdGhhdCBnYWRnZXQgZHJpdmVycyBzaG91bGQgaW5jbHVkZSBleHRyYSBkZXNjcmlwdG9ycwotCSAgYW5kIGNvZGUgdG8gaGFuZGxlIGR1YWwtc3BlZWQgY29udHJvbGxlcnMuCisKKyMgU2VsZWN0ZWQgYnkgVURDIGRyaXZlcnMgdGhhdCBzdXBwb3J0IHN1cGVyLXNwZWVkIG9wcGVyYXRpb24KK2NvbmZpZyBVU0JfR0FER0VUX1NVUEVSU1BFRUQKKwlib29sCisJZGVwZW5kcyBvbiBVU0JfR0FER0VUCisJZGVwZW5kcyBvbiBVU0JfR0FER0VUX0RVQUxTUEVFRAogCiAjCiAjIFVTQiBHYWRnZXQgRHJpdmVycwogIwogY2hvaWNlCiAJdHJpc3RhdGUgIlVTQiBHYWRnZXQgRHJpdmVycyIKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVQgJiYgVVNCX0dBREdFVF9TRUxFQ1RFRAorCWRlcGVuZHMgb24gVVNCX0dBREdFVAogCWRlZmF1bHQgVVNCX0VUSAogCWhlbHAKIAkgIEEgTGludXggIkdhZGdldCBEcml2ZXIiIHRhbGtzIHRvIHRoZSBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyCkBAIC04NTEsNyArNzM1LDcgQEAKIAkgIG5vIEV0aGVybmV0IGludGVyZmFjZS4KIAogY29uZmlnIFVTQl9GSUxFX1NUT1JBR0UKLQl0cmlzdGF0ZSAiRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQiCisJdHJpc3RhdGUgIkZpbGUtYmFja2VkIFN0b3JhZ2UgR2FkZ2V0IChERVBSRUNBVEVEKSIKIAlkZXBlbmRzIG9uIEJMT0NLCiAJaGVscAogCSAgVGhlIEZpbGUtYmFja2VkIFN0b3JhZ2UgR2FkZ2V0IGFjdHMgYXMgYSBVU0IgTWFzcyBTdG9yYWdlCkBAIC04NjIsNiArNzQ2LDkgQEAKIAkgIFNheSAieSIgdG8gbGluayB0aGUgZHJpdmVyIHN0YXRpY2FsbHksIG9yICJtIiB0byBidWlsZCBhCiAJICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAiZ19maWxlX3N0b3JhZ2UiLgogCisJICBOT1RFOiBUaGlzIGRyaXZlciBpcyBkZXByZWNhdGVkLiAgSXRzIHJlcGxhY2VtZW50IGlzIHRoZQorCSAgTWFzcyBTdG9yYWdlIEdhZGdldC4KKwogY29uZmlnIFVTQl9GSUxFX1NUT1JBR0VfVEVTVAogCWJvb2wgIkZpbGUtYmFja2VkIFN0b3JhZ2UgR2FkZ2V0IHRlc3RpbmcgdmVyc2lvbiIKIAlkZXBlbmRzIG9uIFVTQl9GSUxFX1NUT1JBR0UKQEAgLTg4MSwxNCArNzY4LDExIEBACiAJICBkZXZpY2UgKGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzIHRoZSAibG9vcCIgZGV2aWNlIGRyaXZlciksCiAJICBzcGVjaWZpZWQgYXMgYSBtb2R1bGUgcGFyYW1ldGVyIG9yIHN5c2ZzIG9wdGlvbi4KIAotCSAgVGhpcyBpcyBoZWF2aWx5IGJhc2VkIG9uIEZpbGUtYmFja2VkIFN0b3JhZ2UgR2FkZ2V0IGFuZCBpbiBtb3N0Ci0JICBjYXNlcyB5b3Ugd2lsbCB3YW50IHRvIHVzZSBGU0cgaW5zdGVhZC4gIFRoaXMgZ2FkZ2V0IGlzIG1vc3RseQotCSAgaGVyZSB0byB0ZXN0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBNYXNzIFN0b3JhZ2UgRnVuY3Rpb24KLQkgIHdoaWNoIG1heSBiZSB1c2VkIHdpdGggY29tcG9zaXRlIGZyYW1ld29yay4KKwkgIFRoaXMgZHJpdmVyIGlzIGFuIHVwZGF0ZWQgcmVwbGFjZW1lbnQgZm9yIHRoZSBkZXByZWNhdGVkCisJICBGaWxlLWJhY2tlZCBTdG9yYWdlIEdhZGdldCAoZ19maWxlX3N0b3JhZ2UpLgogCiAJICBTYXkgInkiIHRvIGxpbmsgdGhlIGRyaXZlciBzdGF0aWNhbGx5LCBvciAibSIgdG8gYnVpbGQKLQkgIGEgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImdfbWFzc19zdG9yYWdlIi4gIElmIHVuc3VyZSwKLQkgIGNvbnNpZGVyIEZpbGUtYmFja2VkIFN0b3JhZ2UgR2FkZ2V0LgorCSAgYSBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAiZ19tYXNzX3N0b3JhZ2UiLgogCiBjb25maWcgVVNCX0dfU0VSSUFMCiAJdHJpc3RhdGUgIlNlcmlhbCBHYWRnZXQgKHdpdGggQ0RDIEFDTSBhbmQgQ0RDIE9CRVggc3VwcG9ydCkiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUKaW5kZXggNGZlOTJiMS4uOWJhNzI1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZQpAQCAtMyw3ICszLDkgQEAKICMKIGNjZmxhZ3MtJChDT05GSUdfVVNCX0dBREdFVF9ERUJVRykgOj0gLURERUJVRwogCitvYmotJChDT05GSUdfVVNCX0dBREdFVCkJKz0gdWRjLWNvcmUubwogb2JqLSQoQ09ORklHX1VTQl9EVU1NWV9IQ0QpCSs9IGR1bW15X2hjZC5vCitvYmotJChDT05GSUdfVVNCX05FVDIyNzIpCSs9IG5ldDIyNzIubwogb2JqLSQoQ09ORklHX1VTQl9ORVQyMjgwKQkrPSBuZXQyMjgwLm8KIG9iai0kKENPTkZJR19VU0JfQU1ENTUzNlVEQykJKz0gYW1kNTUzNnVkYy5vCiBvYmotJChDT05GSUdfVVNCX1BYQTI1WCkJKz0gcHhhMjV4X3VkYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYW1kNTUzNnVkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2FtZDU1MzZ1ZGMuYwppbmRleCA2ZTQyYWFiLi43MGYyYjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvYW1kNTUzNnVkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hbWQ1NTM2dWRjLmMKQEAgLTYwLDYgKzYwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTQzNywxMCArMTQzOCwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGFtZDU1MzZfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCisJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKTsKK3N0YXRpYyBpbnQgYW1kNTUzNl9zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKTsKIC8qIGdhZGdldCBvcGVyYXRpb25zICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9nYWRnZXRfb3BzIHVkY19vcHMgPSB7CiAJLndha2V1cAkJPSB1ZGNfd2FrZXVwLAogCS5nZXRfZnJhbWUJPSB1ZGNfZ2V0X2ZyYW1lLAorCS5zdGFydAkJPSBhbWQ1NTM2X3N0YXJ0LAorCS5zdG9wCQk9IGFtZDU1MzZfc3RvcCwKIH07CiAKIC8qIFNldHVwcyBlbmRwb2ludCBwYXJhbWV0ZXJzLCBhZGRzIGVuZHBvaW50cyB0byBsaW5rZWQgbGlzdCAqLwpAQCAtMTk1NCw3ICsxOTYwLDcgQEAKIH0KIAogLyogQ2FsbGVkIGJ5IGdhZGdldCBkcml2ZXIgdG8gcmVnaXN0ZXIgaXRzZWxmICovCi1pbnQgdXNiX2dhZGdldF9wcm9iZV9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCitzdGF0aWMgaW50IGFtZDU1MzZfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCiAJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKQogewogCXN0cnVjdCB1ZGMJCSpkZXYgPSB1ZGM7CkBAIC0yMDAxLDcgKzIwMDcsNiBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKTsKIAogLyogc2h1dGRvd24gcmVxdWVzdHMgYW5kIGRpc2Nvbm5lY3QgZnJvbSBnYWRnZXQgKi8KIHN0YXRpYyB2b2lkCkBAIC0yMDI2LDcgKzIwMzEsNyBAQAogfQogCiAvKiBDYWxsZWQgYnkgZ2FkZ2V0IGRyaXZlciB0byB1bnJlZ2lzdGVyIGl0c2VsZiAqLwotaW50IHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCitzdGF0aWMgaW50IGFtZDU1MzZfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKIHsKIAlzdHJ1Y3QgdWRjCSpkZXYgPSB1ZGM7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKQEAgLTIwNTYsOCArMjA2MSw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7Ci0KIAogLyogQ2xlYXIgcGVuZGluZyBOQUsgYml0cyAqLwogc3RhdGljIHZvaWQgdWRjX3Byb2Nlc3NfY25ha19xdWV1ZShzdHJ1Y3QgdWRjICpkZXYpCkBAIC0zMTMzLDYgKzMxMzYsNyBAQAogCiAJZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCisJdXNiX2RlbF9nYWRnZXRfdWRjKCZ1ZGMtPmdhZGdldCk7CiAJLyogZ2FkZ2V0IGRyaXZlciBtdXN0IG5vdCBiZSByZWdpc3RlcmVkICovCiAJQlVHX09OKGRldi0+ZHJpdmVyICE9IE5VTEwpOwogCkBAIC0zMzgxLDggKzMzODUsMTMgQEAKIAkJImRyaXZlciB2ZXJzaW9uOiAlcyhmb3IgR2VvZGU1NTM2IEIxKVxuIiwgdG1wKTsKIAl1ZGMgPSBkZXY7CiAKKwlyZXR2YWwgPSB1c2JfYWRkX2dhZGdldF91ZGMoJnVkYy0+cGRldi0+ZGV2LCAmZGV2LT5nYWRnZXQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmluaXNoZWQ7CisKIAlyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+Z2FkZ2V0LmRldik7CiAJaWYgKHJldHZhbCkgeworCQl1c2JfZGVsX2dhZGdldF91ZGMoJmRldi0+Z2FkZ2V0KTsKIAkJcHV0X2RldmljZSgmZGV2LT5nYWRnZXQuZGV2KTsKIAkJZ290byBmaW5pc2hlZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCmluZGV4IDQxZGMwOTMuLjk4Y2JjMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KQEAgLTk4NCwxMiArOTg1LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXQ5MV9zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKKwkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpOworc3RhdGljIGludCBhdDkxX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9nYWRnZXRfb3BzIGF0OTFfdWRjX29wcyA9IHsKIAkuZ2V0X2ZyYW1lCQk9IGF0OTFfZ2V0X2ZyYW1lLAogCS53YWtldXAJCQk9IGF0OTFfd2FrZXVwLAogCS5zZXRfc2VsZnBvd2VyZWQJPSBhdDkxX3NldF9zZWxmcG93ZXJlZCwKIAkudmJ1c19zZXNzaW9uCQk9IGF0OTFfdmJ1c19zZXNzaW9uLAogCS5wdWxsdXAJCQk9IGF0OTFfcHVsbHVwLAorCS5zdGFydAkJCT0gYXQ5MV9zdGFydCwKKwkuc3RvcAkJCT0gYXQ5MV9zdG9wLAogCiAJLyoKIAkgKiBWQlVTLXBvd2VyZWQgZGV2aWNlcyBtYXkgYWxzbyBhbHNvIHdhbnQgdG8gc3VwcG9ydCBiaWdnZXIKQEAgLTE2MjcsNyArMTYzNCw3IEBACiAJCXNjaGVkdWxlX3dvcmsoJnVkYy0+dmJ1c190aW1lcl93b3JrKTsKIH0KIAotaW50IHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorc3RhdGljIGludCBhdDkxX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAogCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKIHsKIAlzdHJ1Y3QgYXQ5MV91ZGMJKnVkYyA9ICZjb250cm9sbGVyOwpAQCAtMTY3MSw5ICsxNjc4LDggQEAKIAlEQkcoImJvdW5kIHRvICVzXG4iLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOwogCi1pbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlciAoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCitzdGF0aWMgaW50IGF0OTFfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKIHsKIAlzdHJ1Y3QgYXQ5MV91ZGMgKnVkYyA9ICZjb250cm9sbGVyOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CkBAIC0xNjk1LDcgKzE3MDEsNiBAQAogCURCRygidW5ib3VuZCBmcm9tICVzXG4iLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wgKHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0xODUzLDEzICsxODU4LDE4IEBACiAJCURCRygibm8gVkJVUyBkZXRlY3Rpb24sIGFzc3VtaW5nIGFsd2F5cy1vblxuIik7CiAJCXVkYy0+dmJ1cyA9IDE7CiAJfQorCXJldHZhbCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYyhkZXYsICZ1ZGMtPmdhZGdldCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsNDsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCB1ZGMpOwogCWRldmljZV9pbml0X3dha2V1cChkZXYsIDEpOwogCWNyZWF0ZV9kZWJ1Z19maWxlKHVkYyk7CiAKIAlJTkZPKCIlcyB2ZXJzaW9uICVzXG4iLCBkcml2ZXJfbmFtZSwgRFJJVkVSX1ZFUlNJT04pOwogCXJldHVybiAwOwotCitmYWlsNDoKKwlpZiAodWRjLT5ib2FyZC52YnVzX3BpbiA+IDAgJiYgIXVkYy0+Ym9hcmQudmJ1c19wb2xsZWQpCisJCWZyZWVfaXJxKHVkYy0+Ym9hcmQudmJ1c19waW4sIHVkYyk7CiBmYWlsMzoKIAlpZiAodWRjLT5ib2FyZC52YnVzX3BpbiA+IDApCiAJCWdwaW9fZnJlZSh1ZGMtPmJvYXJkLnZidXNfcGluKTsKQEAgLTE4ODYsNiArMTg5Niw3IEBACiAKIAlEQkcoInJlbW92ZVxuIik7CiAKKwl1c2JfZGVsX2dhZGdldF91ZGMoJnVkYy0+Z2FkZ2V0KTsKIAlpZiAodWRjLT5kcml2ZXIpCiAJCXJldHVybiAtRUJVU1k7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKaW5kZXggZGIxYTY1OS4uNWIxNjY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKQEAgLTI3Miw3ICsyNzIsNyBAQAogCiAJcmVnc19yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZSh1ZGMtPnBkZXYsIElPUkVTT1VSQ0VfTUVNLAogCQkJCUNUUkxfSU9NRU1fSUQpOwotCXJlZ3MtPmRfaW5vZGUtPmlfc2l6ZSA9IHJlZ3NfcmVzb3VyY2UtPmVuZCAtIHJlZ3NfcmVzb3VyY2UtPnN0YXJ0ICsgMTsKKwlyZWdzLT5kX2lub2RlLT5pX3NpemUgPSByZXNvdXJjZV9zaXplKHJlZ3NfcmVzb3VyY2UpOwogCXVkYy0+ZGVidWdmc19yZWdzID0gcmVnczsKIAogCXVzYmFfZXBfaW5pdF9kZWJ1Z2ZzKHVkYywgdG9fdXNiYV9lcCh1ZGMtPmdhZGdldC5lcDApKTsKQEAgLTEwMDcsMTAgKzEwMDcsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhdG1lbF91c2JhX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSk7CitzdGF0aWMgaW50IGF0bWVsX3VzYmFfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcik7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgdXNiYV91ZGNfb3BzID0gewogCS5nZXRfZnJhbWUJCT0gdXNiYV91ZGNfZ2V0X2ZyYW1lLAogCS53YWtldXAJCQk9IHVzYmFfdWRjX3dha2V1cCwKIAkuc2V0X3NlbGZwb3dlcmVkCT0gdXNiYV91ZGNfc2V0X3NlbGZwb3dlcmVkLAorCS5zdGFydAkJCT0gYXRtZWxfdXNiYV9zdGFydCwKKwkuc3RvcAkJCT0gYXRtZWxfdXNiYV9zdG9wLAogfTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciB1c2JhX2VwMF9kZXNjID0gewpAQCAtMTc4OSw3ICsxNzk1LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLWludCB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKK3N0YXRpYyBpbnQgYXRtZWxfdXNiYV9zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKIAkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpCiB7CiAJc3RydWN0IHVzYmFfdWRjICp1ZGMgPSAmdGhlX3VkYzsKQEAgLTE4NDIsOSArMTg0OCw4IEBACiAJdWRjLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOwogCi1pbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3N0YXRpYyBpbnQgYXRtZWxfdXNiYV9zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQogewogCXN0cnVjdCB1c2JhX3VkYyAqdWRjID0gJnRoZV91ZGM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE4ODAsNyArMTg4NSw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7CiAKIHN0YXRpYyBpbnQgX19pbml0IHVzYmFfdWRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC0yMDIxLDEyICsyMDI1LDI0IEBACiAJCX0KIAl9CiAKKwlyZXQgPSB1c2JfYWRkX2dhZGdldF91ZGMoJnBkZXYtPmRldiwgJnVkYy0+Z2FkZ2V0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9hZGRfdWRjOworCiAJdXNiYV9pbml0X2RlYnVnZnModWRjKTsKIAlmb3IgKGkgPSAxOyBpIDwgcGRhdGEtPm51bV9lcDsgaSsrKQogCQl1c2JhX2VwX2luaXRfZGVidWdmcyh1ZGMsICZ1c2JhX2VwW2ldKTsKIAogCXJldHVybiAwOwogCitlcnJfYWRkX3VkYzoKKwlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+dmJ1c19waW4pKSB7CisJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHVkYy0+dmJ1c19waW4pLCB1ZGMpOworCQlncGlvX2ZyZWUodWRjLT52YnVzX3Bpbik7CisJfQorCisJZGV2aWNlX3VucmVnaXN0ZXIoJnVkYy0+Z2FkZ2V0LmRldik7CisKIGVycl9kZXZpY2VfYWRkOgogCWZyZWVfaXJxKGlycSwgdWRjKTsKIGVycl9yZXF1ZXN0X2lycToKQEAgLTIwNTMsNiArMjA2OSw4IEBACiAKIAl1ZGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAorCXVzYl9kZWxfZ2FkZ2V0X3VkYygmdWRjLT5nYWRnZXQpOworCiAJZm9yIChpID0gMTsgaSA8IHBkYXRhLT5udW1fZXA7IGkrKykKIAkJdXNiYV9lcF9jbGVhbnVwX2RlYnVnZnMoJnVzYmFfZXBbaV0pOwogCXVzYmFfY2xlYW51cF9kZWJ1Z2ZzKHVkYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXVkaW8uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdWRpby5jCmluZGV4IDkzYjk5OWUuLjlkODlhZTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXVkaW8uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXVkaW8uYwpAQCAtMTY1LDYgKzE2NSw3IEBACiAJLm5hbWUJCT0gImdfYXVkaW8iLAogCS5kZXYJCT0gJmRldmljZV9kZXNjLAogCS5zdHJpbmdzCT0gYXVkaW9fc3RyaW5ncywKKwkubWF4X3NwZWVkCT0gVVNCX1NQRUVEX0hJR0gsCiAJLnVuYmluZAkJPSBfX2V4aXRfcChhdWRpb191bmJpbmQpLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NkYzIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jZGMyLmMKaW5kZXggMjcyMGFiMC4uYjFjMWFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NkYzIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY2RjMi5jCkBAIC0yNDQsNiArMjQ0LDcgQEAKIAkubmFtZQkJPSAiZ19jZGMiLAogCS5kZXYJCT0gJmRldmljZV9kZXNjLAogCS5zdHJpbmdzCT0gZGV2X3N0cmluZ3MsCisJLm1heF9zcGVlZAk9IFVTQl9TUEVFRF9ISUdILAogCS51bmJpbmQJCT0gX19leGl0X3AoY2RjX3VuYmluZCksCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY2kxM3h4eF9tc20uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jaTEzeHh4X21zbS5jCmluZGV4IDEzOWFjOTQuLjQ3MDk4MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9jaTEzeHh4X21zbS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jaTEzeHh4X21zbS5jCkBAIC0xMjYsNiArMTI2LDcgQEAKIAkucHJvYmUgPSBjaTEzeHh4X21zbV9wcm9iZSwKIAkuZHJpdmVyID0geyAubmFtZSA9ICJtc21faHN1c2IiLCB9LAogfTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bXNtX2hzdXNiIik7CiAKIHN0YXRpYyBpbnQgX19pbml0IGNpMTN4eHhfbXNtX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9jaTEzeHh4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NpMTN4eHhfdWRjLmMKaW5kZXggYmFhZjg3ZS4uMTI2NWE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NpMTN4eHhfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NpMTN4eHhfdWRjLmMKQEAgLTg1Nyw3ICs4NTcsNyBAQAogCXN0YW1wID0gc3RhbXAgKiAxMDAwMDAwICsgdHZhbC50dl91c2VjOwogCiAJc2NucHJpbnRmKGRiZ19kYXRhLmJ1ZltkYmdfZGF0YS5pZHhdLCBEQkdfREFUQV9NU0csCi0JCSAgIiUwNFhcdLsgJTAyWCAlLTcuN3MgJTRpIKtcdCVzXG4iLAorCQkgICIlMDRYXHQ/ICUwMlggJS03LjdzICU0aSA/XHQlc1xuIiwKIAkJICBzdGFtcCwgYWRkciwgbmFtZSwgc3RhdHVzLCBleHRyYSk7CiAKIAlkYmdfaW5jKCZkYmdfZGF0YS5pZHgpOwpAQCAtODY1LDcgKzg2NSw3IEBACiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOwogCiAJaWYgKGRiZ19kYXRhLnR0eSAhPSAwKQotCQlwcl9ub3RpY2UoIiUwNFhcdLsgJTAyWCAlLTcuN3MgJTRpIKtcdCVzXG4iLAorCQlwcl9ub3RpY2UoIiUwNFhcdD8gJTAyWCAlLTcuN3MgJTRpID9cdCVzXG4iLAogCQkJICBzdGFtcCwgYWRkciwgbmFtZSwgc3RhdHVzLCBleHRyYSk7CiB9CiAKQEAgLTEwMjUsMTUgKzEwMjUsMTUgQEAKIAogCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICIqdGVzdCA9ICVkXG4iLAogCQkgICAgICAgaXNyX3N0YXRpc3RpY3MudGVzdCk7Ci0JbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIrsgdWkgID0gJWRcbiIsCisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIj8gdWkgID0gJWRcbiIsCiAJCSAgICAgICBpc3Jfc3RhdGlzdGljcy51aSk7Ci0JbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIrsgdWVpID0gJWRcbiIsCisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIj8gdWVpID0gJWRcbiIsCiAJCSAgICAgICBpc3Jfc3RhdGlzdGljcy51ZWkpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICK7IHBjaSA9ICVkXG4iLAorCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICI/IHBjaSA9ICVkXG4iLAogCQkgICAgICAgaXNyX3N0YXRpc3RpY3MucGNpKTsKLQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyB1cmkgPSAlZFxuIiwKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiPyB1cmkgPSAlZFxuIiwKIAkJICAgICAgIGlzcl9zdGF0aXN0aWNzLnVyaSk7Ci0JbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIrsgc2xpID0gJWRcbiIsCisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIj8gc2xpID0gJWRcbiIsCiAJCSAgICAgICBpc3Jfc3RhdGlzdGljcy5zbGkpOwogCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICIqbm9uZSA9ICVkXG4iLAogCQkgICAgICAgaXNyX3N0YXRpc3RpY3Mubm9uZSk7CkBAIC0xMjE0LDEyICsxMjE0LDEzIEBACiAgKgogICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscwogICovCisjZGVmaW5lIERVTVBfRU5UUklFUwk1MTIKIHN0YXRpYyBzc2l6ZV90IHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBkdW1wWzUxMl07CisJdTMyICpkdW1wOwogCXVuc2lnbmVkIGksIGssIG4gPSAwOwogCiAJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKQEAgLTEyMjgsOCArMTIyOSwxNCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlkdW1wID0ga21hbGxvYyhzaXplb2YodTMyKSAqIERVTVBfRU5UUklFUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFkdW1wKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7Ci0JayA9IGh3X3JlZ2lzdGVyX3JlYWQoZHVtcCwgc2l6ZW9mKGR1bXApL3NpemVvZih1MzIpKTsKKwlrID0gaHdfcmVnaXN0ZXJfcmVhZChkdW1wLCBEVU1QX0VOVFJJRVMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgazsgaSsrKSB7CkBAIC0xMjM3LDYgKzEyNDQsNyBAQAogCQkJICAgICAgICJyZWdbMHglMDRYXSA9IDB4JTA4WFxuIiwKIAkJCSAgICAgICBpICogKHVuc2lnbmVkKXNpemVvZih1MzIpLCBkdW1wW2ldKTsKIAl9CisJa2ZyZWUoZHVtcCk7CiAKIAlyZXR1cm4gbjsKIH0KQEAgLTI1MTUsNiArMjUyMyw5IEBACiAJcmV0dXJuIC1FTk9UU1VQUDsKIH0KIAorc3RhdGljIGludCBjaTEzeHh4X3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSk7CitzdGF0aWMgaW50IGNpMTN4eHhfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcik7CiAvKioKICAqIERldmljZSBvcGVyYXRpb25zIHBhcnQgb2YgdGhlIEFQSSB0byB0aGUgVVNCIGNvbnRyb2xsZXIgaGFyZHdhcmUsCiAgKiB3aGljaCBkb24ndCBpbnZvbHZlIGVuZHBvaW50cyAob3IgaS9vKQpAQCAtMjUyNCwxNyArMjUzNSwxOSBAQAogCS52YnVzX3Nlc3Npb24JPSBjaTEzeHh4X3ZidXNfc2Vzc2lvbiwKIAkud2FrZXVwCQk9IGNpMTN4eHhfd2FrZXVwLAogCS52YnVzX2RyYXcJPSBjaTEzeHh4X3ZidXNfZHJhdywKKwkuc3RhcnQJCT0gY2kxM3h4eF9zdGFydCwKKwkuc3RvcAkJPSBjaTEzeHh4X3N0b3AsCiB9OwogCiAvKioKLSAqIHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyOiByZWdpc3RlciBhIGdhZGdldCBkcml2ZXIKKyAqIGNpMTN4eHhfc3RhcnQ6IHJlZ2lzdGVyIGEgZ2FkZ2V0IGRyaXZlcgogICogQGRyaXZlcjogdGhlIGRyaXZlciBiZWluZyByZWdpc3RlcmVkCiAgKiBAYmluZDogdGhlIGRyaXZlcidzIGJpbmQgY2FsbGJhY2sKICAqCi0gKiBDaGVjayB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcigpIGF0IDxsaW51eC91c2IvZ2FkZ2V0Lmg+IGZvciBkZXRhaWxzLgorICogQ2hlY2sgY2kxM3h4eF9zdGFydCgpIGF0IDxsaW51eC91c2IvZ2FkZ2V0Lmg+IGZvciBkZXRhaWxzLgogICogSW50ZXJydXB0cyBhcmUgZW5hYmxlZCBoZXJlLgogICovCi1pbnQgdXNiX2dhZGdldF9wcm9iZV9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCitzdGF0aWMgaW50IGNpMTN4eHhfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCiAJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKQogewogCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBfdWRjOwpAQCAtMjYxNSwxMCArMjYyOCwxMyBAQAogCWlmIChyZXR2YWwpCiAJCWdvdG8gZG9uZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOwotCXJldHZhbCA9IHVzYl9lcF9lbmFibGUoJnVkYy0+ZXAwb3V0LmVwLCAmY3RybF9lbmRwdF9vdXRfZGVzYyk7CisJdWRjLT5lcDBvdXQuZXAuZGVzYyA9ICZjdHJsX2VuZHB0X291dF9kZXNjOworCXJldHZhbCA9IHVzYl9lcF9lbmFibGUoJnVkYy0+ZXAwb3V0LmVwKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwotCXJldHZhbCA9IHVzYl9lcF9lbmFibGUoJnVkYy0+ZXAwaW4uZXAsICZjdHJsX2VuZHB0X2luX2Rlc2MpOworCisJdWRjLT5lcDBpbi5lcC5kZXNjID0gJmN0cmxfZW5kcHRfaW5fZGVzYzsKKwlyZXR2YWwgPSB1c2JfZXBfZW5hYmxlKCZ1ZGMtPmVwMGluLmVwKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwpAQCAtMjY1NywxNCArMjY3MywxMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOwogCiAvKioKLSAqIHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXI6IHVucmVnaXN0ZXIgYSBnYWRnZXQgZHJpdmVyCisgKiBjaTEzeHh4X3N0b3A6IHVucmVnaXN0ZXIgYSBnYWRnZXQgZHJpdmVyCiAgKgogICogQ2hlY2sgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcigpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCiAgKi8KLWludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQorc3RhdGljIGludCBjaTEzeHh4X3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IGNpMTN4eHggKnVkYyA9IF91ZGM7CiAJdW5zaWduZWQgbG9uZyBpLCBmbGFnczsKQEAgLTI3MjYsNyArMjc0MSw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEJVUyBibG9jawpAQCAtMjkwMSwxMiArMjkxNSwyMyBAQAogCQlpZiAocmV0dmFsKQogCQkJZ290byByZW1vdmVfZGJnOwogCX0KKworCXJldHZhbCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYyhkZXYsICZ1ZGMtPmdhZGdldCk7CisJaWYgKHJldHZhbCkKKwkJZ290byByZW1vdmVfdHJhbnM7CisKIAlwbV9ydW50aW1lX25vX2NhbGxiYWNrcygmdWRjLT5nYWRnZXQuZGV2KTsKIAlwbV9ydW50aW1lX2VuYWJsZSgmdWRjLT5nYWRnZXQuZGV2KTsKIAogCV91ZGMgPSB1ZGM7CiAJcmV0dXJuIHJldHZhbDsKIAorcmVtb3ZlX3RyYW5zOgorCWlmICh1ZGMtPnRyYW5zY2VpdmVyKSB7CisJCW90Z19zZXRfcGVyaXBoZXJhbCh1ZGMtPnRyYW5zY2VpdmVyLCAmdWRjLT5nYWRnZXQpOworCQlvdGdfcHV0X3RyYW5zY2VpdmVyKHVkYy0+dHJhbnNjZWl2ZXIpOworCX0KKwogCWVycigiZXJyb3IgPSAlaSIsIHJldHZhbCk7CiByZW1vdmVfZGJnOgogI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTCkBAIC0yOTM2LDYgKzI5NjEsNyBAQAogCQllcnIoIkVJTlZBTCIpOwogCQlyZXR1cm47CiAJfQorCXVzYl9kZWxfZ2FkZ2V0X3VkYygmdWRjLT5nYWRnZXQpOwogCiAJaWYgKHVkYy0+dHJhbnNjZWl2ZXIpIHsKIAkJb3RnX3NldF9wZXJpcGhlcmFsKHVkYy0+dHJhbnNjZWl2ZXIsICZ1ZGMtPmdhZGdldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKaW5kZXggNWNiYjFhNC4uNWVmODc3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi9jb21wb3NpdGUuaD4KLQorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogLyoKICAqIFRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyB1dGlsaXR5IGNvZGUsIHVzZWQgdG8gYnVpbGQgYSBnYWRnZXQgZHJpdmVyCkBAIC03NCw2ICs3NCwxMzAgQEAKIHN0YXRpYyBjaGFyIGNvbXBvc2l0ZV9tYW51ZmFjdHVyZXJbNTBdOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqCisgKiBuZXh0X2VwX2Rlc2MoKSAtIGFkdmFuY2UgdG8gdGhlIG5leHQgRVAgZGVzY3JpcHRvcgorICogQHQ6IGN1cnJlY3QgcG9pbnRlciB3aXRoaW4gZGVzY3JpcHRvciBhcnJheQorICoKKyAqIFJldHVybjogbmV4dCBFUCBkZXNjcmlwdG9yIG9yIE5VTEwKKyAqCisgKiBJdGVyYXRlIG92ZXIgQHQgdW50aWwgZWl0aGVyIEVQIGRlc2NyaXB0b3IgZm91bmQgb3IKKyAqIE5VTEwgKHRoYXQgaW5kaWNhdGVzIGVuZCBvZiBsaXN0KSBlbmNvdW50ZXJlZAorICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlcioqCituZXh0X2VwX2Rlc2Moc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKnQpCit7CisJZm9yICg7ICp0OyB0KyspIHsKKwkJaWYgKCgqdCktPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfRU5EUE9JTlQpCisJCQlyZXR1cm4gdDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBmb3JfZWFjaF9lcF9kZXNjKCktIGl0ZXJhdGUgb3ZlciBlbmRwb2ludCBkZXNjcmlwdG9ycyBpbiB0aGUKKyAqCQlkZXNjcmlwdG9ycyBsaXN0CisgKiBAc3RhcnQ6CXBvaW50ZXIgd2l0aGluIGRlc2NyaXB0b3IgYXJyYXkuCisgKiBAZXBfZGVzYzoJZW5kcG9pbnQgZGVzY3JpcHRvciB0byB1c2UgYXMgdGhlIGxvb3AgY3Vyc29yCisgKi8KKyNkZWZpbmUgZm9yX2VhY2hfZXBfZGVzYyhzdGFydCwgZXBfZGVzYykgXAorCWZvciAoZXBfZGVzYyA9IG5leHRfZXBfZGVzYyhzdGFydCk7IFwKKwkgICAgICBlcF9kZXNjOyBlcF9kZXNjID0gbmV4dF9lcF9kZXNjKGVwX2Rlc2MrMSkpCisKKy8qKgorICogY29uZmlnX2VwX2J5X3NwZWVkKCkgLSBjb25maWd1cmVzIHRoZSBnaXZlbiBlbmRwb2ludAorICogYWNjb3JkaW5nIHRvIGdhZGdldCBzcGVlZC4KKyAqIEBnOiBwb2ludGVyIHRvIHRoZSBnYWRnZXQKKyAqIEBmOiB1c2IgZnVuY3Rpb24KKyAqIEBfZXA6IHRoZSBlbmRwb2ludCB0byBjb25maWd1cmUKKyAqCisgKiBSZXR1cm46IGVycm9yIGNvZGUsIDAgb24gc3VjY2VzcworICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hvb3NlcyB0aGUgcmlnaHQgZGVzY3JpcHRvcnMgZm9yIGEgZ2l2ZW4KKyAqIGVuZHBvaW50IGFjY29yZGluZyB0byBnYWRnZXQgc3BlZWQgYW5kIHNhdmVzIGl0IGluIHRoZQorICogZW5kcG9pbnQgZGVzYyBmaWVsZC4gSWYgdGhlIGVuZHBvaW50IGFscmVhZHkgaGFzIGEgZGVzY3JpcHRvcgorICogYXNzaWduZWQgdG8gaXQgLSBvdmVyd3JpdGVzIGl0IHdpdGggY3VycmVudGx5IGNvcnJlc3BvbmRpbmcKKyAqIGRlc2NyaXB0b3IuIFRoZSBlbmRwb2ludCBtYXhwYWNrZXQgZmllbGQgaXMgdXBkYXRlZCBhY2NvcmRpbmcKKyAqIHRvIHRoZSBjaG9zZW4gZGVzY3JpcHRvci4KKyAqIE5vdGU6IHRoZSBzdXBwbGllZCBmdW5jdGlvbiBzaG91bGQgaG9sZCBhbGwgdGhlIGRlc2NyaXB0b3JzCisgKiBmb3Igc3VwcG9ydGVkIHNwZWVkcworICovCitpbnQgY29uZmlnX2VwX2J5X3NwZWVkKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnLAorCQkJc3RydWN0IHVzYl9mdW5jdGlvbiAqZiwKKwkJCXN0cnVjdCB1c2JfZXAgKl9lcCkKK3sKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmNob3Nlbl9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICoqc3BlZWRfZGVzYyA9IE5VTEw7CisKKwlzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciAqY29tcF9kZXNjID0gTlVMTDsKKwlpbnQgd2FudF9jb21wX2Rlc2MgPSAwOworCisJc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKmRfc3BkOyAvKiBjdXJzb3IgZm9yIHNwZWVkIGRlc2MgKi8KKworCWlmICghZyB8fCAhZiB8fCAhX2VwKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHNlbGVjdCBkZXNpcmVkIHNwZWVkICovCisJc3dpdGNoIChnLT5zcGVlZCkgeworCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgorCQlpZiAoZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoZykpIHsKKwkJCXNwZWVkX2Rlc2MgPSBmLT5zc19kZXNjcmlwdG9yczsKKwkJCXdhbnRfY29tcF9kZXNjID0gMTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGVsc2U6IEZhbGwgdHJvdWdoICovCisJY2FzZSBVU0JfU1BFRURfSElHSDoKKwkJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZykpIHsKKwkJCXNwZWVkX2Rlc2MgPSBmLT5oc19kZXNjcmlwdG9yczsKKwkJCWJyZWFrOworCQl9CisJCS8qIGVsc2U6IGZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCXNwZWVkX2Rlc2MgPSBmLT5kZXNjcmlwdG9yczsKKwl9CisJLyogZmluZCBkZXNjcmlwdG9ycyAqLworCWZvcl9lYWNoX2VwX2Rlc2Moc3BlZWRfZGVzYywgZF9zcGQpIHsKKwkJY2hvc2VuX2Rlc2MgPSAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopKmRfc3BkOworCQlpZiAoY2hvc2VuX2Rlc2MtPmJFbmRwb2ludEFkZHJlc3MgPT0gX2VwLT5hZGRyZXNzKQorCQkJZ290byBlcF9mb3VuZDsKKwl9CisJcmV0dXJuIC1FSU87CisKK2VwX2ZvdW5kOgorCS8qIGNvbW1pdCByZXN1bHRzICovCisJX2VwLT5tYXhwYWNrZXQgPSBsZTE2X3RvX2NwdShjaG9zZW5fZGVzYy0+d01heFBhY2tldFNpemUpOworCV9lcC0+ZGVzYyA9IGNob3Nlbl9kZXNjOworCV9lcC0+Y29tcF9kZXNjID0gTlVMTDsKKwlfZXAtPm1heGJ1cnN0ID0gMDsKKwlfZXAtPm11bHQgPSAwOworCWlmICghd2FudF9jb21wX2Rlc2MpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDb21wYW5pb24gZGVzY3JpcHRvciBzaG91bGQgZm9sbG93IEVQIGRlc2NyaXB0b3IKKwkgKiBVU0IgMy4wIHNwZWMsICM5LjYuNworCSAqLworCWNvbXBfZGVzYyA9IChzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciAqKSooKytkX3NwZCk7CisJaWYgKCFjb21wX2Rlc2MgfHwKKwkgICAgKGNvbXBfZGVzYy0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9TU19FTkRQT0lOVF9DT01QKSkKKwkJcmV0dXJuIC1FSU87CisJX2VwLT5jb21wX2Rlc2MgPSBjb21wX2Rlc2M7CisJaWYgKGctPnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikgeworCQlzd2l0Y2ggKHVzYl9lbmRwb2ludF90eXBlKF9lcC0+ZGVzYykpIHsKKwkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgorCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKKwkJCV9lcC0+bWF4YnVyc3QgPSBjb21wX2Rlc2MtPmJNYXhCdXJzdDsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6CisJCQkvKiBtdWx0OiBiaXRzIDE6MCBvZiBibUF0dHJpYnV0ZXMgKi8KKwkJCV9lcC0+bXVsdCA9IGNvbXBfZGVzYy0+Ym1BdHRyaWJ1dGVzICYgMHgzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBEbyBub3RoaW5nIGZvciBjb250cm9sIGVuZHBvaW50cyAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CiAKIC8qKgogICogdXNiX2FkZF9mdW5jdGlvbigpIC0gYWRkIGEgZnVuY3Rpb24gdG8gYSBjb25maWd1cmF0aW9uCkBAIC0xMjMsNiArMjQ3LDggQEAKIAkJY29uZmlnLT5mdWxsc3BlZWQgPSB0cnVlOwogCWlmICghY29uZmlnLT5oaWdoc3BlZWQgJiYgZnVuY3Rpb24tPmhzX2Rlc2NyaXB0b3JzKQogCQljb25maWctPmhpZ2hzcGVlZCA9IHRydWU7CisJaWYgKCFjb25maWctPnN1cGVyc3BlZWQgJiYgZnVuY3Rpb24tPnNzX2Rlc2NyaXB0b3JzKQorCQljb25maWctPnN1cGVyc3BlZWQgPSB0cnVlOwogCiBkb25lOgogCWlmICh2YWx1ZSkKQEAgLTI2NiwxMCArMzkyLDE3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmY29uZmlnLT5mdW5jdGlvbnMsIGxpc3QpIHsKIAkJc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKmRlc2NyaXB0b3JzOwogCi0JCWlmIChzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwkJc3dpdGNoIChzcGVlZCkgeworCQljYXNlIFVTQl9TUEVFRF9TVVBFUjoKKwkJCWRlc2NyaXB0b3JzID0gZi0+c3NfZGVzY3JpcHRvcnM7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfU1BFRURfSElHSDoKIAkJCWRlc2NyaXB0b3JzID0gZi0+aHNfZGVzY3JpcHRvcnM7Ci0JCWVsc2UKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJZGVzY3JpcHRvcnMgPSBmLT5kZXNjcmlwdG9yczsKKwkJfQorCiAJCWlmICghZGVzY3JpcHRvcnMpCiAJCQljb250aW51ZTsKIAkJc3RhdHVzID0gdXNiX2Rlc2NyaXB0b3JfZmlsbGJ1ZihuZXh0LCBsZW4sCkBAIC0yOTIsOSArNDI1LDEwIEBACiAJdTgJCQkJdHlwZSA9IHdfdmFsdWUgPj4gODsKIAllbnVtIHVzYl9kZXZpY2Vfc3BlZWQJCXNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CiAKLQlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRnZXQpKSB7Ci0JCWludAkJCWhzID0gMDsKLQorCWlmIChnYWRnZXQtPnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikKKwkJc3BlZWQgPSBnYWRnZXQtPnNwZWVkOworCWVsc2UgaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSkgeworCQlpbnQJaHMgPSAwOwogCQlpZiAoZ2FkZ2V0LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKIAkJCWhzID0gMTsKIAkJaWYgKHR5cGUgPT0gVVNCX0RUX09USEVSX1NQRUVEX0NPTkZJRykKQEAgLTMwOCwxMyArNDQyLDIwIEBACiAJd192YWx1ZSAmPSAweGZmOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNkZXYtPmNvbmZpZ3MsIGxpc3QpIHsKIAkJLyogaWdub3JlIGNvbmZpZ3MgdGhhdCB3b24ndCB3b3JrIGF0IHRoaXMgc3BlZWQgKi8KLQkJaWYgKHNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSB7CisJCXN3aXRjaCAoc3BlZWQpIHsKKwkJY2FzZSBVU0JfU1BFRURfU1VQRVI6CisJCQlpZiAoIWMtPnN1cGVyc3BlZWQpCisJCQkJY29udGludWU7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfU1BFRURfSElHSDoKIAkJCWlmICghYy0+aGlnaHNwZWVkKQogCQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlpZiAoIWMtPmZ1bGxzcGVlZCkKIAkJCQljb250aW51ZTsKIAkJfQorCiAJCWlmICh3X3ZhbHVlID09IDApCiAJCQlyZXR1cm4gY29uZmlnX2J1ZihjLCBzcGVlZCwgY2Rldi0+cmVxLT5idWYsIHR5cGUpOwogCQl3X3ZhbHVlLS07CkBAIC0zMjgsMTYgKzQ2OSwyMiBAQAogCXN0cnVjdCB1c2JfY29uZmlndXJhdGlvbgkqYzsKIAl1bnNpZ25lZAkJCWNvdW50ID0gMDsKIAlpbnQJCQkJaHMgPSAwOworCWludAkJCQlzcyA9IDA7CiAKIAlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRnZXQpKSB7CiAJCWlmIChnYWRnZXQtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQogCQkJaHMgPSAxOworCQlpZiAoZ2FkZ2V0LT5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpCisJCQlzcyA9IDE7CiAJCWlmICh0eXBlID09IFVTQl9EVF9ERVZJQ0VfUVVBTElGSUVSKQogCQkJaHMgPSAhaHM7CiAJfQogCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNkZXYtPmNvbmZpZ3MsIGxpc3QpIHsKIAkJLyogaWdub3JlIGNvbmZpZ3MgdGhhdCB3b24ndCB3b3JrIGF0IHRoaXMgc3BlZWQgKi8KLQkJaWYgKGhzKSB7CisJCWlmIChzcykgeworCQkJaWYgKCFjLT5zdXBlcnNwZWVkKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGhzKSB7CiAJCQlpZiAoIWMtPmhpZ2hzcGVlZCkKIAkJCQljb250aW51ZTsKIAkJfSBlbHNlIHsKQEAgLTM0OSw2ICs0OTYsNzEgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKKy8qKgorICogYm9zX2Rlc2MoKSAtIHByZXBhcmVzIHRoZSBCT1MgZGVzY3JpcHRvci4KKyAqIEBjZGV2OiBwb2ludGVyIHRvIHVzYl9jb21wb3NpdGUgZGV2aWNlIHRvIGdlbmVyYXRlIHRoZSBib3MKKyAqCWRlc2NyaXB0b3IgZm9yCisgKgorICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgdGhlIEJPUyAoQmluYXJ5IERldmljZSBPYmplY3QpCisgKiBkZXNjcmlwdG9yIGFuZCBpdHMgZGV2aWNlIGNhcGFiaWxpdGllcyBkZXNjcmlwdG9ycy4gVGhlIEJPUworICogZGVzY3JpcHRvciBzaG91bGQgYmUgc3VwcG9ydGVkIGJ5IGEgU3VwZXJTcGVlZCBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgYm9zX2Rlc2Moc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2KQoreworCXN0cnVjdCB1c2JfZXh0X2NhcF9kZXNjcmlwdG9yCSp1c2JfZXh0OworCXN0cnVjdCB1c2Jfc3NfY2FwX2Rlc2NyaXB0b3IJKnNzX2NhcDsKKwlzdHJ1Y3QgdXNiX2RjZF9jb25maWdfcGFyYW1zCWRjZF9jb25maWdfcGFyYW1zOworCXN0cnVjdCB1c2JfYm9zX2Rlc2NyaXB0b3IJKmJvcyA9IGNkZXYtPnJlcS0+YnVmOworCisJYm9zLT5iTGVuZ3RoID0gVVNCX0RUX0JPU19TSVpFOworCWJvcy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0JPUzsKKworCWJvcy0+d1RvdGFsTGVuZ3RoID0gY3B1X3RvX2xlMTYoVVNCX0RUX0JPU19TSVpFKTsKKwlib3MtPmJOdW1EZXZpY2VDYXBzID0gMDsKKworCS8qCisJICogQSBTdXBlclNwZWVkIGRldmljZSBzaGFsbCBpbmNsdWRlIHRoZSBVU0IyLjAgZXh0ZW5zaW9uIGRlc2NyaXB0b3IKKwkgKiBhbmQgc2hhbGwgc3VwcG9ydCBMUE0gd2hlbiBvcGVyYXRpbmcgaW4gVVNCMi4wIEhTIG1vZGUuCisJICovCisJdXNiX2V4dCA9IGNkZXYtPnJlcS0+YnVmICsgbGUxNl90b19jcHUoYm9zLT53VG90YWxMZW5ndGgpOworCWJvcy0+Yk51bURldmljZUNhcHMrKzsKKwlsZTE2X2FkZF9jcHUoJmJvcy0+d1RvdGFsTGVuZ3RoLCBVU0JfRFRfVVNCX0VYVF9DQVBfU0laRSk7CisJdXNiX2V4dC0+Ykxlbmd0aCA9IFVTQl9EVF9VU0JfRVhUX0NBUF9TSVpFOworCXVzYl9leHQtPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9ERVZJQ0VfQ0FQQUJJTElUWTsKKwl1c2JfZXh0LT5iRGV2Q2FwYWJpbGl0eVR5cGUgPSBVU0JfQ0FQX1RZUEVfRVhUOworCXVzYl9leHQtPmJtQXR0cmlidXRlcyA9IGNwdV90b19sZTMyKFVTQl9MUE1fU1VQUE9SVCk7CisKKwkvKgorCSAqIFRoZSBTdXBlcnNwZWVkIFVTQiBDYXBhYmlsaXR5IGRlc2NyaXB0b3Igc2hhbGwgYmUgaW1wbGVtZW50ZWQgYnkgYWxsCisJICogU3VwZXJTcGVlZCBkZXZpY2VzLgorCSAqLworCXNzX2NhcCA9IGNkZXYtPnJlcS0+YnVmICsgbGUxNl90b19jcHUoYm9zLT53VG90YWxMZW5ndGgpOworCWJvcy0+Yk51bURldmljZUNhcHMrKzsKKwlsZTE2X2FkZF9jcHUoJmJvcy0+d1RvdGFsTGVuZ3RoLCBVU0JfRFRfVVNCX1NTX0NBUF9TSVpFKTsKKwlzc19jYXAtPmJMZW5ndGggPSBVU0JfRFRfVVNCX1NTX0NBUF9TSVpFOworCXNzX2NhcC0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0RFVklDRV9DQVBBQklMSVRZOworCXNzX2NhcC0+YkRldkNhcGFiaWxpdHlUeXBlID0gVVNCX1NTX0NBUF9UWVBFOworCXNzX2NhcC0+Ym1BdHRyaWJ1dGVzID0gMDsgLyogTFRNIGlzIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisJc3NfY2FwLT53U3BlZWRTdXBwb3J0ZWQgPSBjcHVfdG9fbGUxNihVU0JfTE9XX1NQRUVEX09QRVJBVElPTiB8CisJCQkJVVNCX0ZVTExfU1BFRURfT1BFUkFUSU9OIHwKKwkJCQlVU0JfSElHSF9TUEVFRF9PUEVSQVRJT04gfAorCQkJCVVTQl81R0JQU19PUEVSQVRJT04pOworCXNzX2NhcC0+YkZ1bmN0aW9uYWxpdHlTdXBwb3J0ID0gVVNCX0xPV19TUEVFRF9PUEVSQVRJT047CisKKwkvKiBHZXQgQ29udHJvbGxlciBjb25maWd1cmF0aW9uICovCisJaWYgKGNkZXYtPmdhZGdldC0+b3BzLT5nZXRfY29uZmlnX3BhcmFtcykKKwkJY2Rldi0+Z2FkZ2V0LT5vcHMtPmdldF9jb25maWdfcGFyYW1zKCZkY2RfY29uZmlnX3BhcmFtcyk7CisJZWxzZSB7CisJCWRjZF9jb25maWdfcGFyYW1zLmJVMWRldkV4aXRMYXQgPSBVU0JfREVGVUxUX1UxX0RFVl9FWElUX0xBVDsKKwkJZGNkX2NvbmZpZ19wYXJhbXMuYlUyRGV2RXhpdExhdCA9CisJCQljcHVfdG9fbGUxNihVU0JfREVGVUxUX1UyX0RFVl9FWElUX0xBVCk7CisJfQorCXNzX2NhcC0+YlUxZGV2RXhpdExhdCA9IGRjZF9jb25maWdfcGFyYW1zLmJVMWRldkV4aXRMYXQ7CisJc3NfY2FwLT5iVTJEZXZFeGl0TGF0ID0gZGNkX2NvbmZpZ19wYXJhbXMuYlUyRGV2RXhpdExhdDsKKworCXJldHVybiBsZTE2X3RvX2NwdShib3MtPndUb3RhbExlbmd0aCk7Cit9CisKIHN0YXRpYyB2b2lkIGRldmljZV9xdWFsKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldikKIHsKIAlzdHJ1Y3QgdXNiX3F1YWxpZmllcl9kZXNjcmlwdG9yCSpxdWFsID0gY2Rldi0+cmVxLT5idWY7CkBAIC0zNjEsNyArNTczLDcgQEAKIAlxdWFsLT5iRGV2aWNlU3ViQ2xhc3MgPSBjZGV2LT5kZXNjLmJEZXZpY2VTdWJDbGFzczsKIAlxdWFsLT5iRGV2aWNlUHJvdG9jb2wgPSBjZGV2LT5kZXNjLmJEZXZpY2VQcm90b2NvbDsKIAkvKiBBU1NVTUUgc2FtZSBFUDAgZmlmbyBzaXplIGF0IGJvdGggc3BlZWRzICovCi0JcXVhbC0+Yk1heFBhY2tldFNpemUwID0gY2Rldi0+ZGVzYy5iTWF4UGFja2V0U2l6ZTA7CisJcXVhbC0+Yk1heFBhY2tldFNpemUwID0gY2Rldi0+Z2FkZ2V0LT5lcDAtPm1heHBhY2tldDsKIAlxdWFsLT5iTnVtQ29uZmlndXJhdGlvbnMgPSBjb3VudF9jb25maWdzKGNkZXYsIFVTQl9EVF9ERVZJQ0VfUVVBTElGSUVSKTsKIAlxdWFsLT5iUkVTRVJWRUQgPSAwOwogfQpAQCAtMzkyLDI4ICs2MDQsNDYgQEAKIAl1bnNpZ25lZAkJcG93ZXIgPSBnYWRnZXRfaXNfb3RnKGdhZGdldCkgPyA4IDogMTAwOwogCWludAkJCXRtcDsKIAotCWlmIChjZGV2LT5jb25maWcpCi0JCXJlc2V0X2NvbmZpZyhjZGV2KTsKLQogCWlmIChudW1iZXIpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmY2Rldi0+Y29uZmlncywgbGlzdCkgewogCQkJaWYgKGMtPmJDb25maWd1cmF0aW9uVmFsdWUgPT0gbnVtYmVyKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBkaXNhYmxlIHRoZSBGRHMgb2YgdGhlIHByZXZpb3VzCisJCQkJICogY29uZmlndXJhdGlvbiBvbmx5IGlmIHRoZSBuZXcgY29uZmlndXJhdGlvbgorCQkJCSAqIGlzIGEgdmFsaWQgb25lCisJCQkJICovCisJCQkJaWYgKGNkZXYtPmNvbmZpZykKKwkJCQkJcmVzZXRfY29uZmlnKGNkZXYpOwogCQkJCXJlc3VsdCA9IDA7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJaWYgKHJlc3VsdCA8IDApCiAJCQlnb3RvIGRvbmU7Ci0JfSBlbHNlCisJfSBlbHNlIHsgLyogWmVybyBjb25maWd1cmF0aW9uIHZhbHVlIC0gbmVlZCB0byByZXNldCB0aGUgY29uZmlnICovCisJCWlmIChjZGV2LT5jb25maWcpCisJCQlyZXNldF9jb25maWcoY2Rldik7CiAJCXJlc3VsdCA9IDA7CisJfQogCiAJSU5GTyhjZGV2LCAiJXMgc3BlZWQgY29uZmlnICMlZDogJXNcbiIsCiAJCSh7IGNoYXIgKnNwZWVkOwogCQlzd2l0Y2ggKGdhZGdldC0+c3BlZWQpIHsKLQkJY2FzZSBVU0JfU1BFRURfTE9XOglzcGVlZCA9ICJsb3ciOyBicmVhazsKLQkJY2FzZSBVU0JfU1BFRURfRlVMTDoJc3BlZWQgPSAiZnVsbCI7IGJyZWFrOwotCQljYXNlIFVTQl9TUEVFRF9ISUdIOglzcGVlZCA9ICJoaWdoIjsgYnJlYWs7Ci0JCWRlZmF1bHQ6CQlzcGVlZCA9ICI/IjsgYnJlYWs7CisJCWNhc2UgVVNCX1NQRUVEX0xPVzoKKwkJCXNwZWVkID0gImxvdyI7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfU1BFRURfRlVMTDoKKwkJCXNwZWVkID0gImZ1bGwiOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1NQRUVEX0hJR0g6CisJCQlzcGVlZCA9ICJoaWdoIjsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9TUEVFRF9TVVBFUjoKKwkJCXNwZWVkID0gInN1cGVyIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3BlZWQgPSAiPyI7CisJCQlicmVhazsKIAkJfSA7IHNwZWVkOyB9KSwgbnVtYmVyLCBjID8gYy0+bGFiZWwgOiAidW5jb25maWd1cmVkIik7CiAKIAlpZiAoIWMpCkBAIC00MzUsMTAgKzY2NSwxNiBAQAogCQkgKiBmdW5jdGlvbidzIHNldHVwIGNhbGxiYWNrIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQKIAkJICogY29uZmlndXJhdGlvbidzIHNldHVwIGNhbGxiYWNrLgogCQkgKi8KLQkJaWYgKGdhZGdldC0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisJCXN3aXRjaCAoZ2FkZ2V0LT5zcGVlZCkgeworCQljYXNlIFVTQl9TUEVFRF9TVVBFUjoKKwkJCWRlc2NyaXB0b3JzID0gZi0+c3NfZGVzY3JpcHRvcnM7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfU1BFRURfSElHSDoKIAkJCWRlc2NyaXB0b3JzID0gZi0+aHNfZGVzY3JpcHRvcnM7Ci0JCWVsc2UKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJZGVzY3JpcHRvcnMgPSBmLT5kZXNjcmlwdG9yczsKKwkJfQogCiAJCWZvciAoOyAqZGVzY3JpcHRvcnM7ICsrZGVzY3JpcHRvcnMpIHsKIAkJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXA7CkBAIC01MzEsOCArNzY3LDkgQEAKIAl9IGVsc2UgewogCQl1bnNpZ25lZAlpOwogCi0JCURCRyhjZGV2LCAiY2ZnICVkLyVwIHNwZWVkczolcyVzXG4iLAorCQlEQkcoY2RldiwgImNmZyAlZC8lcCBzcGVlZHM6JXMlcyVzXG4iLAogCQkJY29uZmlnLT5iQ29uZmlndXJhdGlvblZhbHVlLCBjb25maWcsCisJCQljb25maWctPnN1cGVyc3BlZWQgPyAiIHN1cGVyIiA6ICIiLAogCQkJY29uZmlnLT5oaWdoc3BlZWQgPyAiIGhpZ2giIDogIiIsCiAJCQljb25maWctPmZ1bGxzcGVlZAogCQkJCT8gKGdhZGdldF9pc19kdWFsc3BlZWQoY2Rldi0+Z2FkZ2V0KQpAQCAtODExLDYgKzEwNDgsNyBAQAogCXN0cnVjdCB1c2JfY29tcG9zaXRlX2RldgkqY2RldiA9IGdldF9nYWRnZXRfZGF0YShnYWRnZXQpOwogCXN0cnVjdCB1c2JfcmVxdWVzdAkJKnJlcSA9IGNkZXYtPnJlcTsKIAlpbnQJCQkJdmFsdWUgPSAtRU9QTk9UU1VQUDsKKwlpbnQJCQkJc3RhdHVzID0gMDsKIAl1MTYJCQkJd19pbmRleCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7CiAJdTgJCQkJaW50ZiA9IHdfaW5kZXggJiAweEZGOwogCXUxNgkJCQl3X3ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKQEAgLTgzOCwxOCArMTA3NiwyOSBAQAogCQljYXNlIFVTQl9EVF9ERVZJQ0U6CiAJCQljZGV2LT5kZXNjLmJOdW1Db25maWd1cmF0aW9ucyA9CiAJCQkJY291bnRfY29uZmlncyhjZGV2LCBVU0JfRFRfREVWSUNFKTsKKwkJCWNkZXYtPmRlc2MuYk1heFBhY2tldFNpemUwID0KKwkJCQljZGV2LT5nYWRnZXQtPmVwMC0+bWF4cGFja2V0OworCQkJaWYgKGdhZGdldF9pc19zdXBlcnNwZWVkKGdhZGdldCkpIHsKKwkJCQlpZiAoZ2FkZ2V0LT5zcGVlZCA+PSBVU0JfU1BFRURfU1VQRVIpCisJCQkJCWNkZXYtPmRlc2MuYmNkVVNCID0gY3B1X3RvX2xlMTYoMHgwMzAwKTsKKwkJCQllbHNlCisJCQkJCWNkZXYtPmRlc2MuYmNkVVNCID0gY3B1X3RvX2xlMTYoMHgwMjEwKTsKKwkJCX0KKwogCQkJdmFsdWUgPSBtaW4od19sZW5ndGgsICh1MTYpIHNpemVvZiBjZGV2LT5kZXNjKTsKIAkJCW1lbWNweShyZXEtPmJ1ZiwgJmNkZXYtPmRlc2MsIHZhbHVlKTsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9EVF9ERVZJQ0VfUVVBTElGSUVSOgotCQkJaWYgKCFnYWRnZXRfaXNfZHVhbHNwZWVkKGdhZGdldCkpCisJCQlpZiAoIWdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSB8fAorCQkJICAgIGdhZGdldC0+c3BlZWQgPj0gVVNCX1NQRUVEX1NVUEVSKQogCQkJCWJyZWFrOwogCQkJZGV2aWNlX3F1YWwoY2Rldik7CiAJCQl2YWx1ZSA9IG1pbl90KGludCwgd19sZW5ndGgsCiAJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfcXVhbGlmaWVyX2Rlc2NyaXB0b3IpKTsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9EVF9PVEhFUl9TUEVFRF9DT05GSUc6Ci0JCQlpZiAoIWdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSkKKwkJCWlmICghZ2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRnZXQpIHx8CisJCQkgICAgZ2FkZ2V0LT5zcGVlZCA+PSBVU0JfU1BFRURfU1VQRVIpCiAJCQkJYnJlYWs7CiAJCQkvKiBGQUxMVEhST1VHSCAqLwogCQljYXNlIFVTQl9EVF9DT05GSUc6CkBAIC04NjMsNiArMTExMiwxMiBAQAogCQkJaWYgKHZhbHVlID49IDApCiAJCQkJdmFsdWUgPSBtaW4od19sZW5ndGgsICh1MTYpIHZhbHVlKTsKIAkJCWJyZWFrOworCQljYXNlIFVTQl9EVF9CT1M6CisJCQlpZiAoZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoZ2FkZ2V0KSkgeworCQkJCXZhbHVlID0gYm9zX2Rlc2MoY2Rldik7CisJCQkJdmFsdWUgPSBtaW4od19sZW5ndGgsICh1MTYpIHZhbHVlKTsKKwkJCX0KKwkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCkBAIC05MzAsNiArMTE4NSw2MSBAQAogCQkqKCh1OCAqKXJlcS0+YnVmKSA9IHZhbHVlOwogCQl2YWx1ZSA9IG1pbih3X2xlbmd0aCwgKHUxNikgMSk7CiAJCWJyZWFrOworCisJLyoKKwkgKiBVU0IgMy4wIGFkZGl0aW9uczoKKwkgKiBGdW5jdGlvbiBkcml2ZXIgc2hvdWxkIGhhbmRsZSBnZXRfc3RhdHVzIHJlcXVlc3QuIElmIHN1Y2ggY2IKKwkgKiB3YXNuJ3Qgc3VwcGxpZWQgd2UgcmVzcG9uZCB3aXRoIGRlZmF1bHQgdmFsdWUgPSAwCisJICogTm90ZTogZnVuY3Rpb24gZHJpdmVyIHNob3VsZCBzdXBwbHkgc3VjaCBjYiBvbmx5IGZvciB0aGUgZmlyc3QKKwkgKiBpbnRlcmZhY2Ugb2YgdGhlIGZ1bmN0aW9uCisJICovCisJY2FzZSBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCWlmICghZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoZ2FkZ2V0KSkKKwkJCWdvdG8gdW5rbm93bjsKKwkJaWYgKGN0cmwtPmJSZXF1ZXN0VHlwZSAhPSAoVVNCX0RJUl9JTiB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UpKQorCQkJZ290byB1bmtub3duOworCQl2YWx1ZSA9IDI7CS8qIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgZ2V0X3N0YXR1cyByZXBseSAqLworCQlwdXRfdW5hbGlnbmVkX2xlMTYoMCwgcmVxLT5idWYpOworCQlpZiAoIWNkZXYtPmNvbmZpZyB8fCBpbnRmID49IE1BWF9DT05GSUdfSU5URVJGQUNFUykKKwkJCWJyZWFrOworCQlmID0gY2Rldi0+Y29uZmlnLT5pbnRlcmZhY2VbaW50Zl07CisJCWlmICghZikKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBmLT5nZXRfc3RhdHVzID8gZi0+Z2V0X3N0YXR1cyhmKSA6IDA7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXB1dF91bmFsaWduZWRfbGUxNihzdGF0dXMgJiAweDAwMDBmZmZmLCByZXEtPmJ1Zik7CisJCWJyZWFrOworCS8qCisJICogRnVuY3Rpb24gZHJpdmVycyBzaG91bGQgaGFuZGxlIFNldEZlYXR1cmUvQ2xlYXJGZWF0dXJlCisJICogKEZVTkNUSU9OX1NVU1BFTkQpIHJlcXVlc3QuIGZ1bmN0aW9uX3N1c3BlbmQgY2Igc2hvdWxkIGJlIHN1cHBsaWVkCisJICogb25seSBmb3IgdGhlIGZpcnN0IGludGVyZmFjZSBvZiB0aGUgZnVuY3Rpb24KKwkgKi8KKwljYXNlIFVTQl9SRVFfQ0xFQVJfRkVBVFVSRToKKwljYXNlIFVTQl9SRVFfU0VUX0ZFQVRVUkU6CisJCWlmICghZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoZ2FkZ2V0KSkKKwkJCWdvdG8gdW5rbm93bjsKKwkJaWYgKGN0cmwtPmJSZXF1ZXN0VHlwZSAhPSAoVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfSU5URVJGQUNFKSkKKwkJCWdvdG8gdW5rbm93bjsKKwkJc3dpdGNoICh3X3ZhbHVlKSB7CisJCWNhc2UgVVNCX0lOVFJGX0ZVTkNfU1VTUEVORDoKKwkJCWlmICghY2Rldi0+Y29uZmlnIHx8IGludGYgPj0gTUFYX0NPTkZJR19JTlRFUkZBQ0VTKQorCQkJCWJyZWFrOworCQkJZiA9IGNkZXYtPmNvbmZpZy0+aW50ZXJmYWNlW2ludGZdOworCQkJaWYgKCFmKQorCQkJCWJyZWFrOworCQkJdmFsdWUgPSAwOworCQkJaWYgKGYtPmZ1bmNfc3VzcGVuZCkKKwkJCQl2YWx1ZSA9IGYtPmZ1bmNfc3VzcGVuZChmLCB3X2luZGV4ID4+IDgpOworCQkJaWYgKHZhbHVlIDwgMCkgeworCQkJCUVSUk9SKGNkZXYsCisJCQkJICAgICAgImZ1bmNfc3VzcGVuZCgpIHJldHVybmVkIGVycm9yICVkXG4iLAorCQkJCSAgICAgIHZhbHVlKTsKKwkJCQl2YWx1ZSA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogdW5rbm93bjoKIAkJVkRCRyhjZGV2LApAQCAtMTE0MCw3ICsxNDUwLDYgQEAKIAkJZ290byBmYWlsOwogCiAJY2Rldi0+ZGVzYyA9ICpjb21wb3NpdGUtPmRldjsKLQljZGV2LT5kZXNjLmJNYXhQYWNrZXRTaXplMCA9IGdhZGdldC0+ZXAwLT5tYXhwYWNrZXQ7CiAKIAkvKiBzdGFuZGFyZGl6ZWQgcnVudGltZSBvdmVycmlkZXMgZm9yIGRldmljZSBJRCBkYXRhICovCiAJaWYgKGlkVmVuZG9yKQpAQCAtMTI0Nyw3ICsxNTU2LDExIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyIGNvbXBvc2l0ZV9kcml2ZXIgPSB7CisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfU1VQRVJTUEVFRAorCS5zcGVlZAkJPSBVU0JfU1BFRURfU1VQRVIsCisjZWxzZQogCS5zcGVlZAkJPSBVU0JfU1BFRURfSElHSCwKKyNlbmRpZgogCiAJLnVuYmluZAkJPSBjb21wb3NpdGVfdW5iaW5kLAogCkBAIC0xMjkzLDYgKzE2MDYsOCBAQAogCQlkcml2ZXItPmlQcm9kdWN0ID0gZHJpdmVyLT5uYW1lOwogCWNvbXBvc2l0ZV9kcml2ZXIuZnVuY3Rpb24gPSAgKGNoYXIgKikgZHJpdmVyLT5uYW1lOwogCWNvbXBvc2l0ZV9kcml2ZXIuZHJpdmVyLm5hbWUgPSBkcml2ZXItPm5hbWU7CisJY29tcG9zaXRlX2RyaXZlci5zcGVlZCA9IG1pbigodTgpY29tcG9zaXRlX2RyaXZlci5zcGVlZCwKKwkJCQkgICAgICh1OClkcml2ZXItPm1heF9zcGVlZCk7CiAJY29tcG9zaXRlID0gZHJpdmVyOwogCWNvbXBvc2l0ZV9nYWRnZXRfYmluZCA9IGJpbmQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb25maWcuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb25maWcuYwppbmRleCAwOTA4NGZkLi5iMmMwMDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29uZmlnLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbmZpZy5jCkBAIC0xNjUsMjggKzE2NSwzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoqCi0gKiB1c2JfZmluZF9lbmRwb2ludCAtIGZpbmQgYSBjb3B5IG9mIGFuIGVuZHBvaW50IGRlc2NyaXB0b3IKLSAqIEBzcmM6IG9yaWdpbmFsIHZlY3RvciBvZiBkZXNjcmlwdG9ycwotICogQGNvcHk6IGNvcHkgb2YgQHNyYwotICogQG1hdGNoOiBlbmRwb2ludCBkZXNjcmlwdG9yIGZvdW5kIGluIEBzcmMKLSAqCi0gKiBUaGlzIHJldHVybnMgdGhlIGNvcHkgb2YgdGhlIEBtYXRjaCBkZXNjcmlwdG9yIG1hZGUgZm9yIEBjb3B5LiAgSXRzCi0gKiBpbnRlbmRlZCB1c2UgaXMgdG8gaGVscCByZW1lbWJlcmluZyB0aGUgZW5kcG9pbnQgZGVzY3JpcHRvciB0byB1c2UKLSAqIHdoZW4gZW5hYmxpbmcgYSBnaXZlbiBlbmRwb2ludC4KLSAqLwotc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICoKLXVzYl9maW5kX2VuZHBvaW50KAotCXN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKipzcmMsCi0Jc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKmNvcHksCi0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICptYXRjaAotKQotewotCXdoaWxlICgqc3JjKSB7Ci0JCWlmICgqc3JjID09ICh2b2lkICopIG1hdGNoKQotCQkJcmV0dXJuICh2b2lkICopKmNvcHk7Ci0JCXNyYysrOwotCQljb3B5Kys7Ci0JfQotCXJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2RiZ3AuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9kYmdwLmMKaW5kZXggZGJlOTJlZS4uOGJlZWZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2RiZ3AuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZGJncC5jCkBAIC0xNzMsNyArMTczLDkgQEAKIAogc3RhdGljIGludCBfX2VuYWJsZV9lcChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjKQogewotCWludCBlcnIgPSB1c2JfZXBfZW5hYmxlKGVwLCBkZXNjKTsKKwlpbnQgZXJyOworCWVwLT5kZXNjID0gZGVzYzsKKwllcnIgPSB1c2JfZXBfZW5hYmxlKGVwKTsKIAllcC0+ZHJpdmVyX2RhdGEgPSBkYmdwLmdhZGdldDsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjY4LDggKzI3MCw4IEBACiAJZGJncC5zZXJpYWwtPmluID0gZGJncC5pX2VwOwogCWRiZ3Auc2VyaWFsLT5vdXQgPSBkYmdwLm9fZXA7CiAKLQlkYmdwLnNlcmlhbC0+aW5fZGVzYyA9ICZpX2Rlc2M7Ci0JZGJncC5zZXJpYWwtPm91dF9kZXNjID0gJm9fZGVzYzsKKwlkYmdwLnNlcmlhbC0+aW4tPmRlc2MgPSAmaV9kZXNjOworCWRiZ3Auc2VyaWFsLT5vdXQtPmRlc2MgPSAmb19kZXNjOwogCiAJaWYgKGdzZXJpYWxfc2V0dXAoZ2FkZ2V0LCAxKSA8IDApIHsKIAkJc3RwID0gMzsKQEAgLTMxMiw3ICszMTQsNiBAQAogCiAJZGJncC5yZXEtPmxlbmd0aCA9IERCR1BfUkVRX0VQMF9MRU47CiAJZ2FkZ2V0LT5lcDAtPmRyaXZlcl9kYXRhID0gZ2FkZ2V0OwotCWRldmljZV9kZXNjLmJNYXhQYWNrZXRTaXplMCA9IGdhZGdldC0+ZXAwLT5tYXhwYWNrZXQ7CiAKICNpZmRlZiBDT05GSUdfVVNCX0dfREJHUF9TRVJJQUwKIAlkYmdwLnNlcmlhbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnc2VyaWFsKSwgR0ZQX0tFUk5FTCk7CkBAIC0zNjMsNiArMzY0LDcgQEAKIAkJCWRldl9kYmcoJmRiZ3AuZ2FkZ2V0LT5kZXYsICJzZXR1cDogZGVzYyBkZXZpY2VcbiIpOwogCQkJbGVuID0gc2l6ZW9mIGRldmljZV9kZXNjOwogCQkJZGF0YSA9ICZkZXZpY2VfZGVzYzsKKwkJCWRldmljZV9kZXNjLmJNYXhQYWNrZXRTaXplMCA9IGdhZGdldC0+ZXAwLT5tYXhwYWNrZXQ7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfRFRfREVCVUc6CiAJCQlkZXZfZGJnKCZkYmdwLmdhZGdldC0+ZGV2LCAic2V0dXA6IGRlc2MgZGVidWdcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jCmluZGV4IDYxZmY5MjcuLmU3NTVhOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9kdW1teV9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZHVtbXlfaGNkLmMKQEAgLTcwLDYgKzcwLDE5IEBACiBNT0RVTEVfQVVUSE9SICgiRGF2aWQgQnJvd25lbGwiKTsKIE1PRFVMRV9MSUNFTlNFICgiR1BMIik7CiAKK3N0cnVjdCBkdW1teV9oY2RfbW9kdWxlX3BhcmFtZXRlcnMgeworCWJvb2wgaXNfc3VwZXJfc3BlZWQ7CisJYm9vbCBpc19oaWdoX3NwZWVkOworfTsKKworc3RhdGljIHN0cnVjdCBkdW1teV9oY2RfbW9kdWxlX3BhcmFtZXRlcnMgbW9kX2RhdGEgPSB7CisJLmlzX3N1cGVyX3NwZWVkID0gZmFsc2UsCisJLmlzX2hpZ2hfc3BlZWQgPSB0cnVlLAorfTsKK21vZHVsZV9wYXJhbV9uYW1lZChpc19zdXBlcl9zcGVlZCwgbW9kX2RhdGEuaXNfc3VwZXJfc3BlZWQsIGJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpc19zdXBlcl9zcGVlZCwgInRydWUgdG8gc2ltdWxhdGUgU3VwZXJTcGVlZCBjb25uZWN0aW9uIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoaXNfaGlnaF9zcGVlZCwgbW9kX2RhdGEuaXNfaGlnaF9zcGVlZCwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGlzX2hpZ2hfc3BlZWQsICJ0cnVlIHRvIHNpbXVsYXRlIEhpZ2hTcGVlZCBjb25uZWN0aW9uIik7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiBnYWRnZXQgc2lkZSBkcml2ZXIgZGF0YSBzdHJ1Y3RyZXMgKi8KQEAgLTE1Miw2ICsxNjUsMjIgQEAKIAlEVU1NWV9SSF9SVU5OSU5HCiB9OwogCitzdHJ1Y3QgZHVtbXlfaGNkIHsKKwlzdHJ1Y3QgZHVtbXkJCQkqZHVtOworCWVudW0gZHVtbXlfcmhfc3RhdGUJCXJoX3N0YXRlOworCXN0cnVjdCB0aW1lcl9saXN0CQl0aW1lcjsKKwl1MzIJCQkJcG9ydF9zdGF0dXM7CisJdTMyCQkJCW9sZF9zdGF0dXM7CisJdW5zaWduZWQgbG9uZwkJCXJlX3RpbWVvdXQ7CisKKwlzdHJ1Y3QgdXNiX2RldmljZQkJKnVkZXY7CisJc3RydWN0IGxpc3RfaGVhZAkJdXJicF9saXN0OworCisJdW5zaWduZWQJCQlhY3RpdmU6MTsKKwl1bnNpZ25lZAkJCW9sZF9hY3RpdmU6MTsKKwl1bnNpZ25lZAkJCXJlc3VtaW5nOjE7Cit9OworCiBzdHJ1Y3QgZHVtbXkgewogCXNwaW5sb2NrX3QJCQlsb2NrOwogCkBAIC0xNjcsMzYgKzE5NiwyNyBAQAogCXUxNgkJCQlkZXZzdGF0dXM7CiAJdW5zaWduZWQJCQl1ZGNfc3VzcGVuZGVkOjE7CiAJdW5zaWduZWQJCQlwdWxsdXA6MTsKLQl1bnNpZ25lZAkJCWFjdGl2ZToxOwotCXVuc2lnbmVkCQkJb2xkX2FjdGl2ZToxOwogCiAJLyoKIAkgKiBNQVNURVIvSE9TVCBzaWRlIHN1cHBvcnQKIAkgKi8KLQllbnVtIGR1bW15X3JoX3N0YXRlCQlyaF9zdGF0ZTsKLQlzdHJ1Y3QgdGltZXJfbGlzdAkJdGltZXI7Ci0JdTMyCQkJCXBvcnRfc3RhdHVzOwotCXUzMgkJCQlvbGRfc3RhdHVzOwotCXVuc2lnbmVkCQkJcmVzdW1pbmc6MTsKLQl1bnNpZ25lZCBsb25nCQkJcmVfdGltZW91dDsKLQotCXN0cnVjdCB1c2JfZGV2aWNlCQkqdWRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQl1cmJwX2xpc3Q7CisJc3RydWN0IGR1bW15X2hjZAkJKmhzX2hjZDsKKwlzdHJ1Y3QgZHVtbXlfaGNkCQkqc3NfaGNkOwogfTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHVtbXkgKmhjZF90b19kdW1teSAoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR1bW15X2hjZCAqaGNkX3RvX2R1bW15X2hjZChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewotCXJldHVybiAoc3RydWN0IGR1bW15ICopIChoY2QtPmhjZF9wcml2KTsKKwlyZXR1cm4gKHN0cnVjdCBkdW1teV9oY2QgKikgKGhjZC0+aGNkX3ByaXYpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfaGNkICpkdW1teV90b19oY2QgKHN0cnVjdCBkdW1teSAqZHVtKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX2hjZCAqZHVtbXlfaGNkX3RvX2hjZChzdHJ1Y3QgZHVtbXlfaGNkICpkdW0pCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKSBkdW0sIHN0cnVjdCB1c2JfaGNkLCBoY2RfcHJpdik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqZHVtbXlfZGV2IChzdHJ1Y3QgZHVtbXkgKmR1bSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqZHVtbXlfZGV2KHN0cnVjdCBkdW1teV9oY2QgKmR1bSkKIHsKLQlyZXR1cm4gZHVtbXlfdG9faGNkKGR1bSktPnNlbGYuY29udHJvbGxlcjsKKwlyZXR1cm4gZHVtbXlfaGNkX3RvX2hjZChkdW0pLT5zZWxmLmNvbnRyb2xsZXI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqdWRjX2RldiAoc3RydWN0IGR1bW15ICpkdW0pCkBAIC0yMDksOSArMjI5LDEzIEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZiAoZXAtPmdhZGdldCwgc3RydWN0IGR1bW15LCBnYWRnZXQpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkdW1teSAqZ2FkZ2V0X3RvX2R1bW15IChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHVtbXlfaGNkICpnYWRnZXRfdG9fZHVtbXlfaGNkKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCiB7Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZiAoZ2FkZ2V0LCBzdHJ1Y3QgZHVtbXksIGdhZGdldCk7CisJc3RydWN0IGR1bW15ICpkdW0gPSBjb250YWluZXJfb2YoZ2FkZ2V0LCBzdHJ1Y3QgZHVtbXksIGdhZGdldCk7CisJaWYgKGR1bS0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikKKwkJcmV0dXJuIGR1bS0+c3NfaGNkOworCWVsc2UKKwkJcmV0dXJuIGR1bS0+aHNfaGNkOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkdW1teSAqZ2FkZ2V0X2Rldl90b19kdW1teSAoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMjE5LDcgKzI0Myw3IEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZiAoZGV2LCBzdHJ1Y3QgZHVtbXksIGdhZGdldC5kZXYpOwogfQogCi1zdGF0aWMgc3RydWN0IGR1bW15CQkJKnRoZV9jb250cm9sbGVyOworc3RhdGljIHN0cnVjdCBkdW1teQkJCXRoZV9jb250cm9sbGVyOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0yNTksNjEgKzI4MywxMjIgQEAKIAkvKiBkcml2ZXIgbm93IGRvZXMgYW55IG5vbi11c2IgcXVpZXNjaW5nIG5lY2Vzc2FyeSAqLwogfQogCi0vKiBjYWxsZXIgbXVzdCBob2xkIGxvY2sgKi8KLXN0YXRpYyB2b2lkCi1zZXRfbGlua19zdGF0ZSAoc3RydWN0IGR1bW15ICpkdW0pCisvKioKKyAqIHNldF9saW5rX3N0YXRlX2J5X3NwZWVkKCkgLSBTZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBsaW5rIGFjY29yZGluZyB0bworICoJdGhlIGhjZCBzcGVlZAorICogQGR1bV9oY2Q6IHBvaW50ZXIgdG8gdGhlIGR1bW15X2hjZCBzdHJ1Y3R1cmUgdG8gdXBkYXRlIHRoZSBsaW5rIHN0YXRlIGZvcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgcG9ydF9zdGF0dXMgYWNjb3JkaW5nIHRvIHRoZSBsaW5rIHN0YXRlIGFuZCB0aGUKKyAqIHNwZWVkIG9mIHRoZSBoY2QuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9saW5rX3N0YXRlX2J5X3NwZWVkKHN0cnVjdCBkdW1teV9oY2QgKmR1bV9oY2QpCiB7Ci0JZHVtLT5hY3RpdmUgPSAwOwotCWlmICgoZHVtLT5wb3J0X3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfUE9XRVIpID09IDApCi0JCWR1bS0+cG9ydF9zdGF0dXMgPSAwOworCXN0cnVjdCBkdW1teSAqZHVtID0gZHVtX2hjZC0+ZHVtOwogCi0JLyogVURDIHN1c3BlbmQgbXVzdCBjYXVzZSBhIGRpc2Nvbm5lY3QgKi8KLQllbHNlIGlmICghZHVtLT5wdWxsdXAgfHwgZHVtLT51ZGNfc3VzcGVuZGVkKSB7Ci0JCWR1bS0+cG9ydF9zdGF0dXMgJj0gfihVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04gfAotCQkJCQlVU0JfUE9SVF9TVEFUX0VOQUJMRSB8Ci0JCQkJCVVTQl9QT1JUX1NUQVRfTE9XX1NQRUVEIHwKLQkJCQkJVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEIHwKLQkJCQkJVVNCX1BPUlRfU1RBVF9TVVNQRU5EKTsKLQkJaWYgKChkdW0tPm9sZF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pICE9IDApCi0JCQlkdW0tPnBvcnRfc3RhdHVzIHw9IChVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElPTiA8PCAxNik7CisJaWYgKGR1bW15X2hjZF90b19oY2QoZHVtX2hjZCktPnNwZWVkID09IEhDRF9VU0IzKSB7CisJCWlmICgoZHVtX2hjZC0+cG9ydF9zdGF0dXMgJiBVU0JfU1NfUE9SVF9TVEFUX1BPV0VSKSA9PSAwKSB7CisJCQlkdW1faGNkLT5wb3J0X3N0YXR1cyA9IDA7CisJCX0gZWxzZSBpZiAoIWR1bS0+cHVsbHVwIHx8IGR1bS0+dWRjX3N1c3BlbmRlZCkgeworCQkJLyogVURDIHN1c3BlbmQgbXVzdCBjYXVzZSBhIGRpc2Nvbm5lY3QgKi8KKwkJCWR1bV9oY2QtPnBvcnRfc3RhdHVzICY9IH4oVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OIHwKKwkJCQkJCVVTQl9QT1JUX1NUQVRfRU5BQkxFKTsKKwkJCWlmICgoZHVtX2hjZC0+b2xkX3N0YXR1cyAmCisJCQkgICAgIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTikgIT0gMCkKKwkJCQlkdW1faGNkLT5wb3J0X3N0YXR1cyB8PQorCQkJCQkoVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gPDwgMTYpOworCQl9IGVsc2UgeworCQkJLyogZGV2aWNlIGlzIGNvbm5lY3RlZCBhbmQgbm90IHN1c3BlbmRlZCAqLworCQkJZHVtX2hjZC0+cG9ydF9zdGF0dXMgfD0gKFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTiB8CisJCQkJCQkgVVNCX1BPUlRfU1RBVF9TUEVFRF81R0JQUykgOworCQkJaWYgKChkdW1faGNkLT5vbGRfc3RhdHVzICYKKwkJCSAgICAgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSA9PSAwKQorCQkJCWR1bV9oY2QtPnBvcnRfc3RhdHVzIHw9CisJCQkJCShVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElPTiA8PCAxNik7CisJCQlpZiAoKGR1bV9oY2QtPnBvcnRfc3RhdHVzICYKKwkJCSAgICAgVVNCX1BPUlRfU1RBVF9FTkFCTEUpID09IDEgJiYKKwkJCQkoZHVtX2hjZC0+cG9ydF9zdGF0dXMgJgorCQkJCSBVU0JfU1NfUE9SVF9MU19VMCkgPT0gMSAmJgorCQkJCWR1bV9oY2QtPnJoX3N0YXRlICE9IERVTU1ZX1JIX1NVU1BFTkRFRCkKKwkJCQlkdW1faGNkLT5hY3RpdmUgPSAxOworCQl9CiAJfSBlbHNlIHsKLQkJZHVtLT5wb3J0X3N0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT047Ci0JCWlmICgoZHVtLT5vbGRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSA9PSAwKQotCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSAoVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gPDwgMTYpOwotCQlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0VOQUJMRSkgPT0gMCkKLQkJCWR1bS0+cG9ydF9zdGF0dXMgJj0gflVTQl9QT1JUX1NUQVRfU1VTUEVORDsKLQkJZWxzZSBpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpID09IDAgJiYKLQkJCQlkdW0tPnJoX3N0YXRlICE9IERVTU1ZX1JIX1NVU1BFTkRFRCkKLQkJCWR1bS0+YWN0aXZlID0gMTsKLQl9Ci0KLQlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0VOQUJMRSkgPT0gMCB8fCBkdW0tPmFjdGl2ZSkKLQkJZHVtLT5yZXN1bWluZyA9IDA7Ci0KLQlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pID09IDAgfHwKLQkJCShkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9SRVNFVCkgIT0gMCkgewotCQlpZiAoKGR1bS0+b2xkX3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTikgIT0gMCAmJgotCQkJCShkdW0tPm9sZF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1JFU0VUKSA9PSAwICYmCi0JCQkJZHVtLT5kcml2ZXIpIHsKLQkJCXN0b3BfYWN0aXZpdHkgKGR1bSk7Ci0JCQlzcGluX3VubG9jayAoJmR1bS0+bG9jayk7Ci0JCQlkdW0tPmRyaXZlci0+ZGlzY29ubmVjdCAoJmR1bS0+Z2FkZ2V0KTsKLQkJCXNwaW5fbG9jayAoJmR1bS0+bG9jayk7CisJCWlmICgoZHVtX2hjZC0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1BPV0VSKSA9PSAwKSB7CisJCQlkdW1faGNkLT5wb3J0X3N0YXR1cyA9IDA7CisJCX0gZWxzZSBpZiAoIWR1bS0+cHVsbHVwIHx8IGR1bS0+dWRjX3N1c3BlbmRlZCkgeworCQkJLyogVURDIHN1c3BlbmQgbXVzdCBjYXVzZSBhIGRpc2Nvbm5lY3QgKi8KKwkJCWR1bV9oY2QtPnBvcnRfc3RhdHVzICY9IH4oVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OIHwKKwkJCQkJCVVTQl9QT1JUX1NUQVRfRU5BQkxFIHwKKwkJCQkJCVVTQl9QT1JUX1NUQVRfTE9XX1NQRUVEIHwKKwkJCQkJCVVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRCB8CisJCQkJCQlVU0JfUE9SVF9TVEFUX1NVU1BFTkQpOworCQkJaWYgKChkdW1faGNkLT5vbGRfc3RhdHVzICYKKwkJCSAgICAgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSAhPSAwKQorCQkJCWR1bV9oY2QtPnBvcnRfc3RhdHVzIHw9CisJCQkJCShVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElPTiA8PCAxNik7CisJCX0gZWxzZSB7CisJCQlkdW1faGNkLT5wb3J0X3N0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT047CisJCQlpZiAoKGR1bV9oY2QtPm9sZF9zdGF0dXMgJgorCQkJICAgICBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pID09IDApCisJCQkJZHVtX2hjZC0+cG9ydF9zdGF0dXMgfD0KKwkJCQkJKFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OIDw8IDE2KTsKKwkJCWlmICgoZHVtX2hjZC0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0VOQUJMRSkgPT0gMCkKKwkJCQlkdW1faGNkLT5wb3J0X3N0YXR1cyAmPSB+VVNCX1BPUlRfU1RBVF9TVVNQRU5EOworCQkJZWxzZSBpZiAoKGR1bV9oY2QtPnBvcnRfc3RhdHVzICYKKwkJCQkgIFVTQl9QT1JUX1NUQVRfU1VTUEVORCkgPT0gMCAmJgorCQkJCQlkdW1faGNkLT5yaF9zdGF0ZSAhPSBEVU1NWV9SSF9TVVNQRU5ERUQpCisJCQkJZHVtX2hjZC0+YWN0aXZlID0gMTsKIAkJfQotCX0gZWxzZSBpZiAoZHVtLT5hY3RpdmUgIT0gZHVtLT5vbGRfYWN0aXZlKSB7Ci0JCWlmIChkdW0tPm9sZF9hY3RpdmUgJiYgZHVtLT5kcml2ZXItPnN1c3BlbmQpIHsKLQkJCXNwaW5fdW5sb2NrICgmZHVtLT5sb2NrKTsKLQkJCWR1bS0+ZHJpdmVyLT5zdXNwZW5kICgmZHVtLT5nYWRnZXQpOwotCQkJc3Bpbl9sb2NrICgmZHVtLT5sb2NrKTsKLQkJfSBlbHNlIGlmICghZHVtLT5vbGRfYWN0aXZlICYmIGR1bS0+ZHJpdmVyLT5yZXN1bWUpIHsKLQkJCXNwaW5fdW5sb2NrICgmZHVtLT5sb2NrKTsKLQkJCWR1bS0+ZHJpdmVyLT5yZXN1bWUgKCZkdW0tPmdhZGdldCk7Ci0JCQlzcGluX2xvY2sgKCZkdW0tPmxvY2spOworCX0KK30KKworLyogY2FsbGVyIG11c3QgaG9sZCBsb2NrICovCitzdGF0aWMgdm9pZCBzZXRfbGlua19zdGF0ZShzdHJ1Y3QgZHVtbXlfaGNkICpkdW1faGNkKQoreworCXN0cnVjdCBkdW1teSAqZHVtID0gZHVtX2hjZC0+ZHVtOworCisJZHVtX2hjZC0+YWN0aXZlID0gMDsKKwlpZiAoZHVtLT5wdWxsdXApCisJCWlmICgoZHVtbXlfaGNkX3RvX2hjZChkdW1faGNkKS0+c3BlZWQgPT0gSENEX1VTQjMgJiYKKwkJICAgICBkdW0tPmdhZGdldC5zcGVlZCAhPSBVU0JfU1BFRURfU1VQRVIpIHx8CisJCSAgICAoZHVtbXlfaGNkX3RvX2hjZChkdW1faGNkKS0+c3BlZWQgIT0gSENEX1VTQjMgJiYKKwkJICAgICBkdW0tPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpKQorCQkJcmV0dXJuOworCisJc2V0X2xpbmtfc3RhdGVfYnlfc3BlZWQoZHVtX2hjZCk7CisKKwlpZiAoKGR1bV9oY2QtPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9FTkFCTEUpID09IDAgfHwKKwkgICAgIGR1bV9oY2QtPmFjdGl2ZSkKKwkJZHVtX2hjZC0+cmVzdW1pbmcgPSAwOworCisJLyogaWYgIWNvbm5lY3RlZCBvciByZXNldCAqLworCWlmICgoZHVtX2hjZC0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pID09IDAgfHwKKwkJCShkdW1faGNkLT5wb3J0X3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfUkVTRVQpICE9IDApIHsKKwkJLyoKKwkJICogV2UncmUgY29ubmVjdGVkIGFuZCBub3QgcmVzZXQgKHJlc2V0IG9jY3VycmVkIG5vdyksCisJCSAqIGFuZCBkcml2ZXIgYXR0YWNoZWQgLSBkaXNjb25uZWN0IQorCQkgKi8KKwkJaWYgKChkdW1faGNkLT5vbGRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSAhPSAwICYmCisJCSAgICAoZHVtX2hjZC0+b2xkX3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfUkVTRVQpID09IDAgJiYKKwkJICAgIGR1bS0+ZHJpdmVyKSB7CisJCQlzdG9wX2FjdGl2aXR5KGR1bSk7CisJCQlzcGluX3VubG9jaygmZHVtLT5sb2NrKTsKKwkJCWR1bS0+ZHJpdmVyLT5kaXNjb25uZWN0KCZkdW0tPmdhZGdldCk7CisJCQlzcGluX2xvY2soJmR1bS0+bG9jayk7CisJCX0KKwl9IGVsc2UgaWYgKGR1bV9oY2QtPmFjdGl2ZSAhPSBkdW1faGNkLT5vbGRfYWN0aXZlKSB7CisJCWlmIChkdW1faGNkLT5vbGRfYWN0aXZlICYmIGR1bS0+ZHJpdmVyLT5zdXNwZW5kKSB7CisJCQlzcGluX3VubG9jaygmZHVtLT5sb2NrKTsKKwkJCWR1bS0+ZHJpdmVyLT5zdXNwZW5kKCZkdW0tPmdhZGdldCk7CisJCQlzcGluX2xvY2soJmR1bS0+bG9jayk7CisJCX0gZWxzZSBpZiAoIWR1bV9oY2QtPm9sZF9hY3RpdmUgJiYgIGR1bS0+ZHJpdmVyLT5yZXN1bWUpIHsKKwkJCXNwaW5fdW5sb2NrKCZkdW0tPmxvY2spOworCQkJZHVtLT5kcml2ZXItPnJlc3VtZSgmZHVtLT5nYWRnZXQpOworCQkJc3Bpbl9sb2NrKCZkdW0tPmxvY2spOwogCQl9CiAJfQogCi0JZHVtLT5vbGRfc3RhdHVzID0gZHVtLT5wb3J0X3N0YXR1czsKLQlkdW0tPm9sZF9hY3RpdmUgPSBkdW0tPmFjdGl2ZTsKKwlkdW1faGNkLT5vbGRfc3RhdHVzID0gZHVtX2hjZC0+cG9ydF9zdGF0dXM7CisJZHVtX2hjZC0+b2xkX2FjdGl2ZSA9IGR1bV9oY2QtPmFjdGl2ZTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTMzMiw2ICs0MTcsNyBAQAogZHVtbXlfZW5hYmxlIChzdHJ1Y3QgdXNiX2VwICpfZXAsIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKIHsKIAlzdHJ1Y3QgZHVtbXkJCSpkdW07CisJc3RydWN0IGR1bW15X2hjZAkqZHVtX2hjZDsKIAlzdHJ1Y3QgZHVtbXlfZXAJCSplcDsKIAl1bnNpZ25lZAkJbWF4OwogCWludAkJCXJldHZhbDsKQEAgLTM0MSw5ICs0MjcsMTkgQEAKIAkJCXx8IGRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQpCiAJCXJldHVybiAtRUlOVkFMOwogCWR1bSA9IGVwX3RvX2R1bW15IChlcCk7Ci0JaWYgKCFkdW0tPmRyaXZlciB8fCAhaXNfZW5hYmxlZCAoZHVtKSkKKwlpZiAoIWR1bS0+ZHJpdmVyKQogCQlyZXR1cm4gLUVTSFVURE9XTjsKLQltYXggPSBsZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSkgJiAweDNmZjsKKworCWR1bV9oY2QgPSBnYWRnZXRfdG9fZHVtbXlfaGNkKCZkdW0tPmdhZGdldCk7CisJaWYgKCFpc19lbmFibGVkKGR1bV9oY2QpKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCS8qCisJICogRm9yIEhTL0ZTIGRldmljZXMgb25seSBiaXRzIDAuLjEwIG9mIHRoZSB3TWF4UGFja2V0U2l6ZSByZXByZXNlbnQgdGhlCisJICogbWF4aW11bSBwYWNrZXQgc2l6ZS4KKwkgKiBGb3IgU1MgZGV2aWNlcyB0aGUgd01heFBhY2tldFNpemUgaXMgbGltaXRlZCBieSAxMDI0LgorCSAqLworCW1heCA9IGxlMTZfdG9fY3B1KGRlc2MtPndNYXhQYWNrZXRTaXplKSAmIDB4N2ZmOwogCiAJLyogZHJpdmVycyBtdXN0IG5vdCByZXF1ZXN0IGJhZCBzZXR0aW5ncywgc2luY2UgbG93ZXIgbGV2ZWxzCiAJICogKGhhcmR3YXJlIG9yIGl0cyBkcml2ZXJzKSBtYXkgbm90IGNoZWNrLiAgc29tZSBlbmRwb2ludHMKQEAgLTM2MSw2ICs0NTcsMTAgQEAKIAkJCWdvdG8gZG9uZTsKIAkJfQogCQlzd2l0Y2ggKGR1bS0+Z2FkZ2V0LnNwZWVkKSB7CisJCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgorCQkJaWYgKG1heCA9PSAxMDI0KQorCQkJCWJyZWFrOworCQkJZ290byBkb25lOwogCQljYXNlIFVTQl9TUEVFRF9ISUdIOgogCQkJaWYgKG1heCA9PSA1MTIpCiAJCQkJYnJlYWs7CkBAIC0zNzksNiArNDc5LDcgQEAKIAkJCWdvdG8gZG9uZTsKIAkJLyogcmVhbCBoYXJkd2FyZSBtaWdodCBub3QgaGFuZGxlIGFsbCBwYWNrZXQgc2l6ZXMgKi8KIAkJc3dpdGNoIChkdW0tPmdhZGdldC5zcGVlZCkgeworCQljYXNlIFVTQl9TUEVFRF9TVVBFUjoKIAkJY2FzZSBVU0JfU1BFRURfSElHSDoKIAkJCWlmIChtYXggPD0gMTAyNCkKIAkJCQlicmVhazsKQEAgLTM5OSw2ICs1MDAsNyBAQAogCQkJZ290byBkb25lOwogCQkvKiByZWFsIGhhcmR3YXJlIG1pZ2h0IG5vdCBoYW5kbGUgYWxsIHBhY2tldCBzaXplcyAqLwogCQlzd2l0Y2ggKGR1bS0+Z2FkZ2V0LnNwZWVkKSB7CisJCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgogCQljYXNlIFVTQl9TUEVFRF9ISUdIOgogCQkJaWYgKG1heCA8PSAxMDI0KQogCQkJCWJyZWFrOwpAQCAtNDI1LDEwICs1MjcsMTggQEAKIAkJKGRlc2MtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSA/ICJpbiIgOiAib3V0IiwKIAkJKHsgY2hhciAqdmFsOwogCQkgc3dpdGNoIChkZXNjLT5ibUF0dHJpYnV0ZXMgJiAweDAzKSB7Ci0JCSBjYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6IHZhbCA9ICJidWxrIjsgYnJlYWs7Ci0JCSBjYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6IHZhbCA9ICJpc28iOyBicmVhazsKLQkJIGNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSU5UOiB2YWwgPSAiaW50ciI7IGJyZWFrOwotCQkgZGVmYXVsdDogdmFsID0gImN0cmwiOyBicmVhazsKKwkJIGNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzoKKwkJCSB2YWwgPSAiYnVsayI7CisJCQkgYnJlYWs7CisJCSBjYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6CisJCQkgdmFsID0gImlzbyI7CisJCQkgYnJlYWs7CisJCSBjYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKKwkJCSB2YWwgPSAiaW50ciI7CisJCQkgYnJlYWs7CisJCSBkZWZhdWx0OgorCQkJIHZhbCA9ICJjdHJsIjsKKwkJCSBicmVhazsKIAkJIH07IHZhbDsgfSksCiAJCW1heCk7CiAKQEAgLTUwNyw2ICs2MTcsNyBAQAogCXN0cnVjdCBkdW1teV9lcAkJKmVwOwogCXN0cnVjdCBkdW1teV9yZXF1ZXN0CSpyZXE7CiAJc3RydWN0IGR1bW15CQkqZHVtOworCXN0cnVjdCBkdW1teV9oY2QJKmR1bV9oY2Q7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKIAlyZXEgPSB1c2JfcmVxdWVzdF90b19kdW1teV9yZXF1ZXN0IChfcmVxKTsKQEAgLTUxOCw3ICs2MjksOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWR1bSA9IGVwX3RvX2R1bW15IChlcCk7Ci0JaWYgKCFkdW0tPmRyaXZlciB8fCAhaXNfZW5hYmxlZCAoZHVtKSkKKwlkdW1faGNkID0gZ2FkZ2V0X3RvX2R1bW15X2hjZCgmZHVtLT5nYWRnZXQpOworCWlmICghZHVtLT5kcml2ZXIgfHwgIWlzX2VuYWJsZWQoZHVtX2hjZCkpCiAJCXJldHVybiAtRVNIVVRET1dOOwogCiAjaWYgMApAQCAtNjYyLDI0ICs3NzQsMjQgQEAKIAogc3RhdGljIGludCBkdW1teV93YWtldXAgKHN0cnVjdCB1c2JfZ2FkZ2V0ICpfZ2FkZ2V0KQogewotCXN0cnVjdCBkdW1teQkqZHVtOworCXN0cnVjdCBkdW1teV9oY2QgKmR1bV9oY2Q7CiAKLQlkdW0gPSBnYWRnZXRfdG9fZHVtbXkgKF9nYWRnZXQpOwotCWlmICghKGR1bS0+ZGV2c3RhdHVzICYJKCAoMSA8PCBVU0JfREVWSUNFX0JfSE5QX0VOQUJMRSkKKwlkdW1faGNkID0gZ2FkZ2V0X3RvX2R1bW15X2hjZChfZ2FkZ2V0KTsKKwlpZiAoIShkdW1faGNkLT5kdW0tPmRldnN0YXR1cyAmICgoMSA8PCBVU0JfREVWSUNFX0JfSE5QX0VOQUJMRSkKIAkJCQl8ICgxIDw8IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCkpKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSA9PSAwKQorCWlmICgoZHVtX2hjZC0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pID09IDApCiAJCXJldHVybiAtRU5PTElOSzsKLQlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpID09IDAgJiYKLQkJCSBkdW0tPnJoX3N0YXRlICE9IERVTU1ZX1JIX1NVU1BFTkRFRCkKKwlpZiAoKGR1bV9oY2QtPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSA9PSAwICYmCisJCQkgZHVtX2hjZC0+cmhfc3RhdGUgIT0gRFVNTVlfUkhfU1VTUEVOREVEKQogCQlyZXR1cm4gLUVJTzsKIAogCS8qIEZJWE1FOiBXaGF0IGlmIHRoZSByb290IGh1YiBpcyBzdXNwZW5kZWQgYnV0IHRoZSBwb3J0IGlzbid0PyAqLwogCiAJLyogaHViIG5vdGljZXMgb3VyIHJlcXVlc3QsIGlzc3VlcyBkb3duc3RyZWFtIHJlc3VtZSwgZXRjICovCi0JZHVtLT5yZXN1bWluZyA9IDE7Ci0JZHVtLT5yZV90aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOwotCW1vZF90aW1lciAoJmR1bW15X3RvX2hjZCAoZHVtKS0+cmhfdGltZXIsIGR1bS0+cmVfdGltZW91dCk7CisJZHVtX2hjZC0+cmVzdW1pbmcgPSAxOworCWR1bV9oY2QtPnJlX3RpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7CisJbW9kX3RpbWVyKCZkdW1teV9oY2RfdG9faGNkKGR1bV9oY2QpLT5yaF90aW1lciwgZHVtX2hjZC0+cmVfdGltZW91dCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY4Nyw3ICs3OTksNyBAQAogewogCXN0cnVjdCBkdW1teQkqZHVtOwogCi0JZHVtID0gZ2FkZ2V0X3RvX2R1bW15IChfZ2FkZ2V0KTsKKwlkdW0gPSAoZ2FkZ2V0X3RvX2R1bW15X2hjZChfZ2FkZ2V0KSktPmR1bTsKIAlpZiAodmFsdWUpCiAJCWR1bS0+ZGV2c3RhdHVzIHw9ICgxIDw8IFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVEKTsKIAllbHNlCkBAIC02OTUsMjYgKzgwNyw2OCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBkdW1teV91ZGNfdWRwYXRlX2VwMChzdHJ1Y3QgZHVtbXkgKmR1bSkKK3sKKwl1MzIgaTsKKworCWlmIChkdW0tPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpIHsKKwkJZm9yIChpID0gMDsgaSA8IERVTU1ZX0VORFBPSU5UUzsgaSsrKQorCQkJZHVtLT5lcFtpXS5lcC5tYXhfc3RyZWFtcyA9IDB4MTA7CisJCWR1bS0+ZXBbMF0uZXAubWF4cGFja2V0ID0gOTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgRFVNTVlfRU5EUE9JTlRTOyBpKyspCisJCQlkdW0tPmVwW2ldLmVwLm1heF9zdHJlYW1zID0gMDsKKwkJZHVtLT5lcFswXS5lcC5tYXhwYWNrZXQgPSA2NDsKKwl9Cit9CisKIHN0YXRpYyBpbnQgZHVtbXlfcHVsbHVwIChzdHJ1Y3QgdXNiX2dhZGdldCAqX2dhZGdldCwgaW50IHZhbHVlKQogeworCXN0cnVjdCBkdW1teV9oY2QgKmR1bV9oY2Q7CiAJc3RydWN0IGR1bW15CSpkdW07CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAotCWR1bSA9IGdhZGdldF90b19kdW1teSAoX2dhZGdldCk7CisJZHVtID0gZ2FkZ2V0X2Rldl90b19kdW1teSgmX2dhZGdldC0+ZGV2KTsKKworCWlmICh2YWx1ZSAmJiBkdW0tPmRyaXZlcikgeworCQlpZiAobW9kX2RhdGEuaXNfc3VwZXJfc3BlZWQpCisJCQlkdW0tPmdhZGdldC5zcGVlZCA9IGR1bS0+ZHJpdmVyLT5zcGVlZDsKKwkJZWxzZSBpZiAobW9kX2RhdGEuaXNfaGlnaF9zcGVlZCkKKwkJCWR1bS0+Z2FkZ2V0LnNwZWVkID0gbWluX3QodTgsIFVTQl9TUEVFRF9ISUdILAorCQkJCQlkdW0tPmRyaXZlci0+c3BlZWQpOworCQllbHNlCisJCQlkdW0tPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCQlkdW1teV91ZGNfdWRwYXRlX2VwMChkdW0pOworCisJCWlmIChkdW0tPmdhZGdldC5zcGVlZCA8IGR1bS0+ZHJpdmVyLT5zcGVlZCkKKwkJCWRldl9kYmcodWRjX2RldihkdW0pLCAiVGhpcyBkZXZpY2UgY2FuIHBlcmZvcm0gZmFzdGVyIgorCQkJCQkiIGlmIHlvdSBjb25uZWN0IGl0IHRvIGEgJXMgcG9ydC4uLlxuIiwKKwkJCQkJKGR1bS0+ZHJpdmVyLT5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIgPworCQkJCQkgIlN1cGVyU3BlZWQiIDogIkhpZ2hTcGVlZCIpKTsKKwl9CisJZHVtX2hjZCA9IGdhZGdldF90b19kdW1teV9oY2QoX2dhZGdldCk7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmR1bS0+bG9jaywgZmxhZ3MpOwogCWR1bS0+cHVsbHVwID0gKHZhbHVlICE9IDApOwotCXNldF9saW5rX3N0YXRlIChkdW0pOworCXNldF9saW5rX3N0YXRlKGR1bV9oY2QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKIAotCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMgKGR1bW15X3RvX2hjZCAoZHVtKSk7CisJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyhkdW1teV9oY2RfdG9faGNkKGR1bV9oY2QpKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkdW1teV91ZGNfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXQgKmcsCisJCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKTsKK3N0YXRpYyBpbnQgZHVtbXlfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXQgKmcsCisJCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBkdW1teV9vcHMgPSB7CiAJLmdldF9mcmFtZQk9IGR1bW15X2dfZ2V0X2ZyYW1lLAogCS53YWtldXAJCT0gZHVtbXlfd2FrZXVwLAogCS5zZXRfc2VsZnBvd2VyZWQgPSBkdW1teV9zZXRfc2VsZnBvd2VyZWQsCiAJLnB1bGx1cAkJPSBkdW1teV9wdWxsdXAsCisJLnVkY19zdGFydAk9IGR1bW15X3VkY19zdGFydCwKKwkudWRjX3N0b3AJPSBkdW1teV91ZGNfc3RvcCwKIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC03NDcsMTggKzkwMSwxMyBAQAogICogZm9yIGVhY2ggZHJpdmVyIHRoYXQgcmVnaXN0ZXJzOiAganVzdCBhZGQgdG8gYSBiaWcgcm9vdCBodWIuCiAgKi8KIAotaW50Ci11c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKLQkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpCitzdGF0aWMgaW50IGR1bW15X3VkY19zdGFydChzdHJ1Y3QgdXNiX2dhZGdldCAqZywKKwkJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7Ci0Jc3RydWN0IGR1bW15CSpkdW0gPSB0aGVfY29udHJvbGxlcjsKLQlpbnQJCXJldHZhbCwgaTsKKwlzdHJ1Y3QgZHVtbXlfaGNkCSpkdW1faGNkID0gZ2FkZ2V0X3RvX2R1bW15X2hjZChnKTsKKwlzdHJ1Y3QgZHVtbXkJCSpkdW0gPSBkdW1faGNkLT5kdW07CiAKLQlpZiAoIWR1bSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGR1bS0+ZHJpdmVyKQotCQlyZXR1cm4gLUVCVVNZOwotCWlmICghYmluZCB8fCAhZHJpdmVyLT5zZXR1cCB8fCBkcml2ZXItPnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQorCWlmIChkcml2ZXItPnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qCkBAIC03NjgsMTIxICs5MTcsNzcgQEAKIAogCWR1bS0+ZGV2c3RhdHVzID0gMDsKIAotCUlOSVRfTElTVF9IRUFEICgmZHVtLT5nYWRnZXQuZXBfbGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IERVTU1ZX0VORFBPSU5UUzsgaSsrKSB7Ci0JCXN0cnVjdCBkdW1teV9lcAkqZXAgPSAmZHVtLT5lcCBbaV07Ci0KLQkJaWYgKCFlcF9uYW1lIFtpXSkKLQkJCWJyZWFrOwotCQllcC0+ZXAubmFtZSA9IGVwX25hbWUgW2ldOwotCQllcC0+ZXAub3BzID0gJmR1bW15X2VwX29wczsKLQkJbGlzdF9hZGRfdGFpbCAoJmVwLT5lcC5lcF9saXN0LCAmZHVtLT5nYWRnZXQuZXBfbGlzdCk7Ci0JCWVwLT5oYWx0ZWQgPSBlcC0+d2VkZ2VkID0gZXAtPmFscmVhZHlfc2VlbiA9Ci0JCQkJZXAtPnNldHVwX3N0YWdlID0gMDsKLQkJZXAtPmVwLm1heHBhY2tldCA9IH4wOwotCQllcC0+bGFzdF9pbyA9IGppZmZpZXM7Ci0JCWVwLT5nYWRnZXQgPSAmZHVtLT5nYWRnZXQ7Ci0JCWVwLT5kZXNjID0gTlVMTDsKLQkJSU5JVF9MSVNUX0hFQUQgKCZlcC0+cXVldWUpOwotCX0KLQotCWR1bS0+Z2FkZ2V0LmVwMCA9ICZkdW0tPmVwIFswXS5lcDsKLQlkdW0tPmVwIFswXS5lcC5tYXhwYWNrZXQgPSA2NDsKLQlsaXN0X2RlbF9pbml0ICgmZHVtLT5lcCBbMF0uZXAuZXBfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmR1bS0+Zmlmb19yZXEucXVldWUpOwotCi0JZHJpdmVyLT5kcml2ZXIuYnVzID0gTlVMTDsKIAlkdW0tPmRyaXZlciA9IGRyaXZlcjsKLQlkdW0tPmdhZGdldC5kZXYuZHJpdmVyID0gJmRyaXZlci0+ZHJpdmVyOwogCWRldl9kYmcgKHVkY19kZXYoZHVtKSwgImJpbmRpbmcgZ2FkZ2V0IGRyaXZlciAnJXMnXG4iLAogCQkJZHJpdmVyLT5kcml2ZXIubmFtZSk7Ci0JcmV0dmFsID0gYmluZCgmZHVtLT5nYWRnZXQpOwotCWlmIChyZXR2YWwpIHsKLQkJZHVtLT5kcml2ZXIgPSBOVUxMOwotCQlkdW0tPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQkvKiBraHViZCB3aWxsIGVudW1lcmF0ZSB0aGlzIGluIGEgd2hpbGUgKi8KLQlzcGluX2xvY2tfaXJxICgmZHVtLT5sb2NrKTsKLQlkdW0tPnB1bGx1cCA9IDE7Ci0Jc2V0X2xpbmtfc3RhdGUgKGR1bSk7Ci0Jc3Bpbl91bmxvY2tfaXJxICgmZHVtLT5sb2NrKTsKLQotCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMgKGR1bW15X3RvX2hjZCAoZHVtKSk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKTsKIAotaW50Ci11c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyIChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3N0YXRpYyBpbnQgZHVtbXlfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXQgKmcsCisJCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQogewotCXN0cnVjdCBkdW1teQkqZHVtID0gdGhlX2NvbnRyb2xsZXI7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQotCWlmICghZHVtKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoIWRyaXZlciB8fCBkcml2ZXIgIT0gZHVtLT5kcml2ZXIgfHwgIWRyaXZlci0+dW5iaW5kKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlzdHJ1Y3QgZHVtbXlfaGNkCSpkdW1faGNkID0gZ2FkZ2V0X3RvX2R1bW15X2hjZChnKTsKKwlzdHJ1Y3QgZHVtbXkJCSpkdW0gPSBkdW1faGNkLT5kdW07CiAKIAlkZXZfZGJnICh1ZGNfZGV2KGR1bSksICJ1bnJlZ2lzdGVyIGdhZGdldCBkcml2ZXIgJyVzJ1xuIiwKIAkJCWRyaXZlci0+ZHJpdmVyLm5hbWUpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKLQlkdW0tPnB1bGx1cCA9IDA7Ci0Jc2V0X2xpbmtfc3RhdGUgKGR1bSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmR1bS0+bG9jaywgZmxhZ3MpOwotCi0JZHJpdmVyLT51bmJpbmQgKCZkdW0tPmdhZGdldCk7Ci0JZHVtLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CiAJZHVtLT5kcml2ZXIgPSBOVUxMOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKLQlkdW0tPnB1bGx1cCA9IDA7Ci0Jc2V0X2xpbmtfc3RhdGUgKGR1bSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmR1bS0+bG9jaywgZmxhZ3MpOwotCi0JdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyAoZHVtbXlfdG9faGNkIChkdW0pKTsKKwlkdW1teV9wdWxsdXAoJmR1bS0+Z2FkZ2V0LCAwKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wgKHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIpOwogCiAjdW5kZWYgaXNfZW5hYmxlZAogCi0vKiBqdXN0IGRlY2xhcmUgdGhpcyBpbiBhbnkgZHJpdmVyIHRoYXQgcmVhbGx5IG5lZWQgaXQgKi8KLWV4dGVybiBpbnQgbmV0MjI4MF9zZXRfZmlmb19tb2RlIChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBpbnQgbW9kZSk7Ci0KLWludCBuZXQyMjgwX3NldF9maWZvX21vZGUgKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsIGludCBtb2RlKQotewotCXJldHVybiAtRU5PU1lTOwotfQotRVhQT1JUX1NZTUJPTCAobmV0MjI4MF9zZXRfZmlmb19tb2RlKTsKLQotCiAvKiBUaGUgZ2FkZ2V0IHN0cnVjdHVyZSBpcyBzdG9yZWQgaW5zaWRlIHRoZSBoY2Qgc3RydWN0dXJlIGFuZCB3aWxsIGJlCiAgKiByZWxlYXNlZCBhbG9uZyB3aXRoIGl0LiAqLwogc3RhdGljIHZvaWQKIGR1bW15X2dhZGdldF9yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGR1bW15CSpkdW0gPSBnYWRnZXRfZGV2X3RvX2R1bW15IChkZXYpOworCXJldHVybjsKK30KIAotCXVzYl9wdXRfaGNkIChkdW1teV90b19oY2QgKGR1bSkpOworc3RhdGljIHZvaWQgaW5pdF9kdW1teV91ZGNfaHcoc3RydWN0IGR1bW15ICpkdW0pCit7CisJaW50IGk7CisKKwlJTklUX0xJU1RfSEVBRCgmZHVtLT5nYWRnZXQuZXBfbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IERVTU1ZX0VORFBPSU5UUzsgaSsrKSB7CisJCXN0cnVjdCBkdW1teV9lcAkqZXAgPSAmZHVtLT5lcFtpXTsKKworCQlpZiAoIWVwX25hbWVbaV0pCisJCQlicmVhazsKKwkJZXAtPmVwLm5hbWUgPSBlcF9uYW1lW2ldOworCQllcC0+ZXAub3BzID0gJmR1bW15X2VwX29wczsKKwkJbGlzdF9hZGRfdGFpbCgmZXAtPmVwLmVwX2xpc3QsICZkdW0tPmdhZGdldC5lcF9saXN0KTsKKwkJZXAtPmhhbHRlZCA9IGVwLT53ZWRnZWQgPSBlcC0+YWxyZWFkeV9zZWVuID0KKwkJCQllcC0+c2V0dXBfc3RhZ2UgPSAwOworCQllcC0+ZXAubWF4cGFja2V0ID0gfjA7CisJCWVwLT5sYXN0X2lvID0gamlmZmllczsKKwkJZXAtPmdhZGdldCA9ICZkdW0tPmdhZGdldDsKKwkJZXAtPmRlc2MgPSBOVUxMOworCQlJTklUX0xJU1RfSEVBRCgmZXAtPnF1ZXVlKTsKKwl9CisKKwlkdW0tPmdhZGdldC5lcDAgPSAmZHVtLT5lcFswXS5lcDsKKwlsaXN0X2RlbF9pbml0KCZkdW0tPmVwWzBdLmVwLmVwX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkdW0tPmZpZm9fcmVxLnF1ZXVlKTsKKworI2lmZGVmIENPTkZJR19VU0JfT1RHCisJZHVtLT5nYWRnZXQuaXNfb3RnID0gMTsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW50IGR1bW15X3VkY19wcm9iZSAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgZHVtbXkJKmR1bSA9IHRoZV9jb250cm9sbGVyOworCXN0cnVjdCBkdW1teQkqZHVtID0gJnRoZV9jb250cm9sbGVyOwogCWludAkJcmM7CiAKLQl1c2JfZ2V0X2hjZChkdW1teV90b19oY2QoZHVtKSk7Ci0KIAlkdW0tPmdhZGdldC5uYW1lID0gZ2FkZ2V0X25hbWU7CiAJZHVtLT5nYWRnZXQub3BzID0gJmR1bW15X29wczsKIAlkdW0tPmdhZGdldC5pc19kdWFsc3BlZWQgPSAxOwogCi0JLyogbWF5YmUgY2xhaW0gT1RHIHN1cHBvcnQsIHRob3VnaCB3ZSB3b24ndCBjb21wbGV0ZSBITlAgKi8KLQlkdW0tPmdhZGdldC5pc19vdGcgPSAoZHVtbXlfdG9faGNkKGR1bSktPnNlbGYub3RnX3BvcnQgIT0gMCk7Ci0KIAlkZXZfc2V0X25hbWUoJmR1bS0+Z2FkZ2V0LmRldiwgImdhZGdldCIpOwogCWR1bS0+Z2FkZ2V0LmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCWR1bS0+Z2FkZ2V0LmRldi5yZWxlYXNlID0gZHVtbXlfZ2FkZ2V0X3JlbGVhc2U7CkBAIC04OTIsMTEgKzk5NywyMiBAQAogCQlyZXR1cm4gcmM7CiAJfQogCisJaW5pdF9kdW1teV91ZGNfaHcoZHVtKTsKKworCXJjID0gdXNiX2FkZF9nYWRnZXRfdWRjKCZwZGV2LT5kZXYsICZkdW0tPmdhZGdldCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJfdWRjOworCiAJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUgKCZkdW0tPmdhZGdldC5kZXYsICZkZXZfYXR0cl9mdW5jdGlvbik7CiAJaWYgKHJjIDwgMCkKLQkJZGV2aWNlX3VucmVnaXN0ZXIgKCZkdW0tPmdhZGdldC5kZXYpOwotCWVsc2UKLQkJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZHVtKTsKKwkJZ290byBlcnJfZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGR1bSk7CisJcmV0dXJuIHJjOworCitlcnJfZGV2OgorCXVzYl9kZWxfZ2FkZ2V0X3VkYygmZHVtLT5nYWRnZXQpOworZXJyX3VkYzoKKwlkZXZpY2VfdW5yZWdpc3RlcigmZHVtLT5nYWRnZXQuZGV2KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTkwNCwzNyArMTAyMCw0MSBAQAogewogCXN0cnVjdCBkdW1teQkqZHVtID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEgKHBkZXYpOwogCisJdXNiX2RlbF9nYWRnZXRfdWRjKCZkdW0tPmdhZGdldCk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEgKHBkZXYsIE5VTEwpOwogCWRldmljZV9yZW1vdmVfZmlsZSAoJmR1bS0+Z2FkZ2V0LmRldiwgJmRldl9hdHRyX2Z1bmN0aW9uKTsKIAlkZXZpY2VfdW5yZWdpc3RlciAoJmR1bS0+Z2FkZ2V0LmRldik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHVtbXlfdWRjX3N1c3BlbmQgKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyB2b2lkIGR1bW15X3VkY19wbShzdHJ1Y3QgZHVtbXkgKmR1bSwgc3RydWN0IGR1bW15X2hjZCAqZHVtX2hjZCwKKwkJaW50IHN1c3BlbmQpCiB7Ci0Jc3RydWN0IGR1bW15CSpkdW0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZkdW0tPmxvY2spOworCWR1bS0+dWRjX3N1c3BlbmRlZCA9IHN1c3BlbmQ7CisJc2V0X2xpbmtfc3RhdGUoZHVtX2hjZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZkdW0tPmxvY2spOworfQogCi0JZGV2X2RiZyAoJnBkZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0Jc3Bpbl9sb2NrX2lycSAoJmR1bS0+bG9jayk7Ci0JZHVtLT51ZGNfc3VzcGVuZGVkID0gMTsKLQlzZXRfbGlua19zdGF0ZSAoZHVtKTsKLQlzcGluX3VubG9ja19pcnEgKCZkdW0tPmxvY2spOworc3RhdGljIGludCBkdW1teV91ZGNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGR1bW15CQkqZHVtID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGR1bW15X2hjZAkqZHVtX2hjZCA9IGdhZGdldF90b19kdW1teV9oY2QoJmR1bS0+Z2FkZ2V0KTsKIAotCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMgKGR1bW15X3RvX2hjZCAoZHVtKSk7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwlkdW1teV91ZGNfcG0oZHVtLCBkdW1faGNkLCAxKTsKKwl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKGR1bW15X2hjZF90b19oY2QoZHVtX2hjZCkpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR1bW15X3VkY19yZXN1bWUgKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGR1bW15X3VkY19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgZHVtbXkJKmR1bSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkdW1teQkJKmR1bSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkdW1teV9oY2QJKmR1bV9oY2QgPSBnYWRnZXRfdG9fZHVtbXlfaGNkKCZkdW0tPmdhZGdldCk7CiAKLQlkZXZfZGJnICgmcGRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQlzcGluX2xvY2tfaXJxICgmZHVtLT5sb2NrKTsKLQlkdW0tPnVkY19zdXNwZW5kZWQgPSAwOwotCXNldF9saW5rX3N0YXRlIChkdW0pOwotCXNwaW5fdW5sb2NrX2lycSAoJmR1bS0+bG9jayk7Ci0KLQl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzIChkdW1teV90b19oY2QgKGR1bSkpOworCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJZHVtbXlfdWRjX3BtKGR1bSwgZHVtX2hjZCwgMCk7CisJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyhkdW1teV9oY2RfdG9faGNkKGR1bV9oY2QpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTY4LDcgKzEwODgsNyBAQAogCXN0cnVjdCB1cmIJCQkqdXJiLAogCWdmcF90CQkJCW1lbV9mbGFncwogKSB7Ci0Jc3RydWN0IGR1bW15CSpkdW07CisJc3RydWN0IGR1bW15X2hjZCAqZHVtX2hjZDsKIAlzdHJ1Y3QgdXJicAkqdXJicDsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCWludAkJcmM7CkBAIC05ODEsNTEgKzExMDEsNTEgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJdXJicC0+dXJiID0gdXJiOwogCi0JZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOwotCXNwaW5fbG9ja19pcnFzYXZlICgmZHVtLT5sb2NrLCBmbGFncyk7CisJZHVtX2hjZCA9IGhjZF90b19kdW1teV9oY2QoaGNkKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHVtX2hjZC0+ZHVtLT5sb2NrLCBmbGFncyk7CiAJcmMgPSB1c2JfaGNkX2xpbmtfdXJiX3RvX2VwKGhjZCwgdXJiKTsKIAlpZiAocmMpIHsKIAkJa2ZyZWUodXJicCk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAoIWR1bS0+dWRldikgewotCQlkdW0tPnVkZXYgPSB1cmItPmRldjsKLQkJdXNiX2dldF9kZXYgKGR1bS0+dWRldik7Ci0JfSBlbHNlIGlmICh1bmxpa2VseSAoZHVtLT51ZGV2ICE9IHVyYi0+ZGV2KSkKLQkJZGV2X2VyciAoZHVtbXlfZGV2KGR1bSksICJ1c2JfZGV2aWNlIGFkZHJlc3MgaGFzIGNoYW5nZWQhXG4iKTsKKwlpZiAoIWR1bV9oY2QtPnVkZXYpIHsKKwkJZHVtX2hjZC0+dWRldiA9IHVyYi0+ZGV2OworCQl1c2JfZ2V0X2RldihkdW1faGNkLT51ZGV2KTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KGR1bV9oY2QtPnVkZXYgIT0gdXJiLT5kZXYpKQorCQlkZXZfZXJyKGR1bW15X2RldihkdW1faGNkKSwgInVzYl9kZXZpY2UgYWRkcmVzcyBoYXMgY2hhbmdlZCFcbiIpOwogCi0JbGlzdF9hZGRfdGFpbCAoJnVyYnAtPnVyYnBfbGlzdCwgJmR1bS0+dXJicF9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZ1cmJwLT51cmJwX2xpc3QsICZkdW1faGNkLT51cmJwX2xpc3QpOwogCXVyYi0+aGNwcml2ID0gdXJicDsKIAlpZiAodXNiX3BpcGV0eXBlICh1cmItPnBpcGUpID09IFBJUEVfQ09OVFJPTCkKIAkJdXJiLT5lcnJvcl9jb3VudCA9IDE7CQkvKiBtYXJrIGFzIGEgbmV3IHVyYiAqLwogCiAJLyoga2ljayB0aGUgc2NoZWR1bGVyLCBpdCdsbCBkbyB0aGUgcmVzdCAqLwotCWlmICghdGltZXJfcGVuZGluZyAoJmR1bS0+dGltZXIpKQotCQltb2RfdGltZXIgKCZkdW0tPnRpbWVyLCBqaWZmaWVzICsgMSk7CisJaWYgKCF0aW1lcl9wZW5kaW5nKCZkdW1faGNkLT50aW1lcikpCisJCW1vZF90aW1lcigmZHVtX2hjZC0+dGltZXIsIGppZmZpZXMgKyAxKTsKIAogIGRvbmU6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHVtLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHVtX2hjZC0+ZHVtLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IGR1bW15X3VyYl9kZXF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKIHsKLQlzdHJ1Y3QgZHVtbXkJKmR1bTsKKwlzdHJ1Y3QgZHVtbXlfaGNkICpkdW1faGNkOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJaW50CQlyYzsKIAogCS8qIGdpdmViYWNrIGhhcHBlbnMgYXV0b21hdGljYWxseSBpbiB0aW1lciBjYWxsYmFjaywKIAkgKiBzbyBtYWtlIHN1cmUgdGhlIGNhbGxiYWNrIGhhcHBlbnMgKi8KLQlkdW0gPSBoY2RfdG9fZHVtbXkgKGhjZCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKKwlkdW1faGNkID0gaGNkX3RvX2R1bW15X2hjZChoY2QpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkdW1faGNkLT5kdW0tPmxvY2ssIGZsYWdzKTsKIAogCXJjID0gdXNiX2hjZF9jaGVja191bmxpbmtfdXJiKGhjZCwgdXJiLCBzdGF0dXMpOwotCWlmICghcmMgJiYgZHVtLT5yaF9zdGF0ZSAhPSBEVU1NWV9SSF9SVU5OSU5HICYmCi0JCQkhbGlzdF9lbXB0eSgmZHVtLT51cmJwX2xpc3QpKQotCQltb2RfdGltZXIgKCZkdW0tPnRpbWVyLCBqaWZmaWVzKTsKKwlpZiAoIXJjICYmIGR1bV9oY2QtPnJoX3N0YXRlICE9IERVTU1ZX1JIX1JVTk5JTkcgJiYKKwkJCSFsaXN0X2VtcHR5KCZkdW1faGNkLT51cmJwX2xpc3QpKQorCQltb2RfdGltZXIoJmR1bV9oY2QtPnRpbWVyLCBqaWZmaWVzKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdW1faGNkLT5kdW0tPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTExNjIsMTAgKzEyODIsMjUgQEAKIAkJdG1wICo9IDggLyogYXBwbGllcyB0byBlbnRpcmUgZnJhbWUgKi87CiAJCWxpbWl0ICs9IGxpbWl0ICogdG1wOwogCX0KKwlpZiAoZHVtLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKSB7CisJCXN3aXRjaCAoZXAtPmRlc2MtPmJtQXR0cmlidXRlcyAmIDB4MDMpIHsKKwkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DOgorCQkJLyogU2VjLiA0LjQuOC4yIFVTQjMuMCBTcGVjICovCisJCQlsaW1pdCA9IDMgKiAxNiAqIDEwMjQgKiA4OworCQkJYnJlYWs7CisJCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSU5UOgorCQkJLyogU2VjLiA0LjQuNy4yIFVTQjMuMCBTcGVjICovCisJCQlsaW1pdCA9IDMgKiAxMDI0ICogODsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KIAlyZXR1cm4gbGltaXQ7CiB9CiAKLSNkZWZpbmUgaXNfYWN0aXZlKGR1bSkJKChkdW0tPnBvcnRfc3RhdHVzICYgXAorI2RlZmluZSBpc19hY3RpdmUoZHVtX2hjZCkJKChkdW1faGNkLT5wb3J0X3N0YXR1cyAmIFwKIAkJKFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTiB8IFVTQl9QT1JUX1NUQVRfRU5BQkxFIHwgXAogCQkJVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSkgXAogCQk9PSAoVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OIHwgVVNCX1BPUlRfU1RBVF9FTkFCTEUpKQpAQCAtMTE3NCw3ICsxMzA5LDggQEAKIHsKIAlpbnQJCWk7CiAKLQlpZiAoIWlzX2FjdGl2ZSAoZHVtKSkKKwlpZiAoIWlzX2FjdGl2ZSgoZHVtLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSID8KKwkJCWR1bS0+c3NfaGNkIDogZHVtLT5oc19oY2QpKSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKChhZGRyZXNzICYgflVTQl9ESVJfSU4pID09IDApCiAJCXJldHVybiAmZHVtLT5lcCBbMF07CkBAIC0xMjExLDExICsxMzQ3LDEyIEBACiAgKgkgIDEgLSBpZiB0aGUgcmVxdWVzdCB3YXNuJ3QgaGFuZGxlcwogICoJICBlcnJvciBjb2RlIG9uIGVycm9yCiAgKi8KLXN0YXRpYyBpbnQgaGFuZGxlX2NvbnRyb2xfcmVxdWVzdChzdHJ1Y3QgZHVtbXkgKmR1bSwgc3RydWN0IHVyYiAqdXJiLAorc3RhdGljIGludCBoYW5kbGVfY29udHJvbF9yZXF1ZXN0KHN0cnVjdCBkdW1teV9oY2QgKmR1bV9oY2QsIHN0cnVjdCB1cmIgKnVyYiwKIAkJCQkgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnNldHVwLAogCQkJCSAgaW50ICpzdGF0dXMpCiB7CiAJc3RydWN0IGR1bW15X2VwCQkqZXAyOworCXN0cnVjdCBkdW1teQkJKmR1bSA9IGR1bV9oY2QtPmR1bTsKIAlpbnQJCQlyZXRfdmFsID0gMTsKIAl1bnNpZ25lZAl3X2luZGV4OwogCXVuc2lnbmVkCXdfdmFsdWU7CkBAIC0xMjQ3LDYgKzEzODQsMjcgQEAKIAkJCWNhc2UgVVNCX0RFVklDRV9BX0FMVF9ITlBfU1VQUE9SVDoKIAkJCQlkdW0tPmdhZGdldC5hX2FsdF9obnBfc3VwcG9ydCA9IDE7CiAJCQkJYnJlYWs7CisJCQljYXNlIFVTQl9ERVZJQ0VfVTFfRU5BQkxFOgorCQkJCWlmIChkdW1teV9oY2RfdG9faGNkKGR1bV9oY2QpLT5zcGVlZCA9PQorCQkJCSAgICBIQ0RfVVNCMykKKwkJCQkJd192YWx1ZSA9IFVTQl9ERVZfU1RBVF9VMV9FTkFCTEVEOworCQkJCWVsc2UKKwkJCQkJcmV0X3ZhbCA9IC1FT1BOT1RTVVBQOworCQkJCWJyZWFrOworCQkJY2FzZSBVU0JfREVWSUNFX1UyX0VOQUJMRToKKwkJCQlpZiAoZHVtbXlfaGNkX3RvX2hjZChkdW1faGNkKS0+c3BlZWQgPT0KKwkJCQkgICAgSENEX1VTQjMpCisJCQkJCXdfdmFsdWUgPSBVU0JfREVWX1NUQVRfVTJfRU5BQkxFRDsKKwkJCQllbHNlCisJCQkJCXJldF92YWwgPSAtRU9QTk9UU1VQUDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVVNCX0RFVklDRV9MVE1fRU5BQkxFOgorCQkJCWlmIChkdW1teV9oY2RfdG9faGNkKGR1bV9oY2QpLT5zcGVlZCA9PQorCQkJCSAgICBIQ0RfVVNCMykKKwkJCQkJd192YWx1ZSA9IFVTQl9ERVZfU1RBVF9MVE1fRU5BQkxFRDsKKwkJCQllbHNlCisJCQkJCXJldF92YWwgPSAtRU9QTk9UU1VQUDsKKwkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJcmV0X3ZhbCA9IC1FT1BOT1RTVVBQOwogCQkJfQpAQCAtMTI3Myw2ICsxNDMxLDI3IEBACiAJCQljYXNlIFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUDoKIAkJCQl3X3ZhbHVlID0gVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQOwogCQkJCWJyZWFrOworCQkJY2FzZSBVU0JfREVWSUNFX1UxX0VOQUJMRToKKwkJCQlpZiAoZHVtbXlfaGNkX3RvX2hjZChkdW1faGNkKS0+c3BlZWQgPT0KKwkJCQkgICAgSENEX1VTQjMpCisJCQkJCXdfdmFsdWUgPSBVU0JfREVWX1NUQVRfVTFfRU5BQkxFRDsKKwkJCQllbHNlCisJCQkJCXJldF92YWwgPSAtRU9QTk9UU1VQUDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVVNCX0RFVklDRV9VMl9FTkFCTEU6CisJCQkJaWYgKGR1bW15X2hjZF90b19oY2QoZHVtX2hjZCktPnNwZWVkID09CisJCQkJICAgIEhDRF9VU0IzKQorCQkJCQl3X3ZhbHVlID0gVVNCX0RFVl9TVEFUX1UyX0VOQUJMRUQ7CisJCQkJZWxzZQorCQkJCQlyZXRfdmFsID0gLUVPUE5PVFNVUFA7CisJCQkJYnJlYWs7CisJCQljYXNlIFVTQl9ERVZJQ0VfTFRNX0VOQUJMRToKKwkJCQlpZiAoZHVtbXlfaGNkX3RvX2hjZChkdW1faGNkKS0+c3BlZWQgPT0KKwkJCQkgICAgSENEX1VTQjMpCisJCQkJCXdfdmFsdWUgPSBVU0JfREVWX1NUQVRfTFRNX0VOQUJMRUQ7CisJCQkJZWxzZQorCQkJCQlyZXRfdmFsID0gLUVPUE5PVFNVUFA7CisJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCXJldF92YWwgPSAtRU9QTk9UU1VQUDsKIAkJCQlicmVhazsKQEAgLTEzMzQsOSArMTUxMywxMCBAQAogLyogZHJpdmUgYm90aCBzaWRlcyBvZiB0aGUgdHJhbnNmZXJzOyBsb29rcyBsaWtlIGlycSBoYW5kbGVycyB0bwogICogYm90aCBkcml2ZXJzIGV4Y2VwdCB0aGUgY2FsbGJhY2tzIGFyZW4ndCBpbl9pcnEoKS4KICAqLwotc3RhdGljIHZvaWQgZHVtbXlfdGltZXIgKHVuc2lnbmVkIGxvbmcgX2R1bSkKK3N0YXRpYyB2b2lkIGR1bW15X3RpbWVyKHVuc2lnbmVkIGxvbmcgX2R1bV9oY2QpCiB7Ci0Jc3RydWN0IGR1bW15CQkqZHVtID0gKHN0cnVjdCBkdW1teSAqKSBfZHVtOworCXN0cnVjdCBkdW1teV9oY2QJKmR1bV9oY2QgPSAoc3RydWN0IGR1bW15X2hjZCAqKSBfZHVtX2hjZDsKKwlzdHJ1Y3QgZHVtbXkJCSpkdW0gPSBkdW1faGNkLT5kdW07CiAJc3RydWN0IHVyYnAJCSp1cmJwLCAqdG1wOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCWludAkJCWxpbWl0LCB0b3RhbDsKQEAgLTEzNTMsOCArMTUzMywxMiBAQAogCWNhc2UgVVNCX1NQRUVEX0hJR0g6CiAJCXRvdGFsID0gNTEyLypieXRlcyovICogMTMvKnBhY2tldHMqLyAqIDgvKnVmcmFtZXMqLzsKIAkJYnJlYWs7CisJY2FzZSBVU0JfU1BFRURfU1VQRVI6CisJCS8qIEJ1cyBzcGVlZCBpcyA1MDAwMDAgYnl0ZXMvbXMsIHNvIHVzZSBhIGxpdHRsZSBsZXNzICovCisJCXRvdGFsID0gNDkwMDAwOworCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyIChkdW1teV9kZXYoZHVtKSwgImJvZ3VzIGRldmljZSBzcGVlZFxuIik7CisJCWRldl9lcnIoZHVtbXlfZGV2KGR1bV9oY2QpLCAiYm9ndXMgZGV2aWNlIHNwZWVkXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTM2Myw4ICsxNTQ3LDggQEAKIAkvKiBsb29rIGF0IGVhY2ggdXJiIHF1ZXVlZCBieSB0aGUgaG9zdCBzaWRlIGRyaXZlciAqLwogCXNwaW5fbG9ja19pcnFzYXZlICgmZHVtLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoIWR1bS0+dWRldikgewotCQlkZXZfZXJyIChkdW1teV9kZXYoZHVtKSwKKwlpZiAoIWR1bV9oY2QtPnVkZXYpIHsKKwkJZGV2X2VycihkdW1teV9kZXYoZHVtX2hjZCksCiAJCQkJInRpbWVyIGZpcmVkIHdpdGggbm8gVVJCcyBwZW5kaW5nP1xuIik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwpAQCAtMTM3Nyw3ICsxNTYxLDcgQEAKIAl9CiAKIHJlc3RhcnQ6Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlICh1cmJwLCB0bXAsICZkdW0tPnVyYnBfbGlzdCwgdXJicF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVyYnAsIHRtcCwgJmR1bV9oY2QtPnVyYnBfbGlzdCwgdXJicF9saXN0KSB7CiAJCXN0cnVjdCB1cmIJCSp1cmI7CiAJCXN0cnVjdCBkdW1teV9yZXF1ZXN0CSpyZXE7CiAJCXU4CQkJYWRkcmVzczsKQEAgLTEzODgsNyArMTU3Miw3IEBACiAJCXVyYiA9IHVyYnAtPnVyYjsKIAkJaWYgKHVyYi0+dW5saW5rZWQpCiAJCQlnb3RvIHJldHVybl91cmI7Ci0JCWVsc2UgaWYgKGR1bS0+cmhfc3RhdGUgIT0gRFVNTVlfUkhfUlVOTklORykKKwkJZWxzZSBpZiAoZHVtX2hjZC0+cmhfc3RhdGUgIT0gRFVNTVlfUkhfUlVOTklORykKIAkJCWNvbnRpbnVlOwogCQl0eXBlID0gdXNiX3BpcGV0eXBlICh1cmItPnBpcGUpOwogCkBAIC0xNDA2LDcgKzE1OTAsNyBAQAogCQllcCA9IGZpbmRfZW5kcG9pbnQoZHVtLCBhZGRyZXNzKTsKIAkJaWYgKCFlcCkgewogCQkJLyogc2V0X2NvbmZpZ3VyYXRpb24oKSBkaXNhZ3JlZW1lbnQgKi8KLQkJCWRldl9kYmcgKGR1bW15X2RldihkdW0pLAorCQkJZGV2X2RiZyhkdW1teV9kZXYoZHVtX2hjZCksCiAJCQkJIm5vIGVwIGNvbmZpZ3VyZWQgZm9yIHVyYiAlcFxuIiwKIAkJCQl1cmIpOwogCQkJc3RhdHVzID0gLUVQUk9UTzsKQEAgLTE0MjIsNyArMTYwNiw3IEBACiAJCX0KIAkJaWYgKGVwLT5oYWx0ZWQgJiYgIWVwLT5zZXR1cF9zdGFnZSkgewogCQkJLyogTk9URTogbXVzdCBub3QgYmUgaXNvISAqLwotCQkJZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksICJlcCAlcyBoYWx0ZWQsIHVyYiAlcFxuIiwKKwkJCWRldl9kYmcoZHVtbXlfZGV2KGR1bV9oY2QpLCAiZXAgJXMgaGFsdGVkLCB1cmIgJXBcbiIsCiAJCQkJCWVwLT5lcC5uYW1lLCB1cmIpOwogCQkJc3RhdHVzID0gLUVQSVBFOwogCQkJZ290byByZXR1cm5fdXJiOwpAQCAtMTQ1Nyw3ICsxNjQxLDcgQEAKIAkJCWVwLT5zZXR1cF9zdGFnZSA9IDA7CiAJCQllcC0+aGFsdGVkID0gMDsKIAotCQkJdmFsdWUgPSBoYW5kbGVfY29udHJvbF9yZXF1ZXN0KGR1bSwgdXJiLCAmc2V0dXAsCisJCQl2YWx1ZSA9IGhhbmRsZV9jb250cm9sX3JlcXVlc3QoZHVtX2hjZCwgdXJiLCAmc2V0dXAsCiAJCQkJCQkgICAgICAgJnN0YXR1cyk7CiAKIAkJCS8qIGdhZGdldCBkcml2ZXIgaGFuZGxlcyBhbGwgb3RoZXIgcmVxdWVzdHMuICBibG9jawpAQCAtMTUyNywyMCArMTcxMSwyMCBAQAogCQlpZiAoZXApCiAJCQllcC0+YWxyZWFkeV9zZWVuID0gZXAtPnNldHVwX3N0YWdlID0gMDsKIAotCQl1c2JfaGNkX3VubGlua191cmJfZnJvbV9lcChkdW1teV90b19oY2QoZHVtKSwgdXJiKTsKKwkJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoZHVtbXlfaGNkX3RvX2hjZChkdW1faGNkKSwgdXJiKTsKIAkJc3Bpbl91bmxvY2sgKCZkdW0tPmxvY2spOwotCQl1c2JfaGNkX2dpdmViYWNrX3VyYihkdW1teV90b19oY2QoZHVtKSwgdXJiLCBzdGF0dXMpOworCQl1c2JfaGNkX2dpdmViYWNrX3VyYihkdW1teV9oY2RfdG9faGNkKGR1bV9oY2QpLCB1cmIsIHN0YXR1cyk7CiAJCXNwaW5fbG9jayAoJmR1bS0+bG9jayk7CiAKIAkJZ290byByZXN0YXJ0OwogCX0KIAotCWlmIChsaXN0X2VtcHR5ICgmZHVtLT51cmJwX2xpc3QpKSB7Ci0JCXVzYl9wdXRfZGV2IChkdW0tPnVkZXYpOwotCQlkdW0tPnVkZXYgPSBOVUxMOwotCX0gZWxzZSBpZiAoZHVtLT5yaF9zdGF0ZSA9PSBEVU1NWV9SSF9SVU5OSU5HKSB7CisJaWYgKGxpc3RfZW1wdHkoJmR1bV9oY2QtPnVyYnBfbGlzdCkpIHsKKwkJdXNiX3B1dF9kZXYoZHVtX2hjZC0+dWRldik7CisJCWR1bV9oY2QtPnVkZXYgPSBOVUxMOworCX0gZWxzZSBpZiAoZHVtX2hjZC0+cmhfc3RhdGUgPT0gRFVNTVlfUkhfUlVOTklORykgewogCQkvKiB3YW50IGEgMSBtc2VjIGRlbGF5IGhlcmUgKi8KLQkJbW9kX3RpbWVyICgmZHVtLT50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOworCQltb2RfdGltZXIoJmR1bV9oY2QtPnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmR1bS0+bG9jaywgZmxhZ3MpOwpAQCAtMTU1NywzNiArMTc0MSw0OCBAQAogCiBzdGF0aWMgaW50IGR1bW15X2h1Yl9zdGF0dXMgKHN0cnVjdCB1c2JfaGNkICpoY2QsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZHVtbXkJCSpkdW07CisJc3RydWN0IGR1bW15X2hjZAkqZHVtX2hjZDsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAlpbnQJCQlyZXR2YWwgPSAwOwogCi0JZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOworCWR1bV9oY2QgPSBoY2RfdG9fZHVtbXlfaGNkKGhjZCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSAoJmR1bS0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkdW1faGNkLT5kdW0tPmxvY2ssIGZsYWdzKTsKIAlpZiAoIUhDRF9IV19BQ0NFU1NJQkxFKGhjZCkpCiAJCWdvdG8gZG9uZTsKIAotCWlmIChkdW0tPnJlc3VtaW5nICYmIHRpbWVfYWZ0ZXJfZXEgKGppZmZpZXMsIGR1bS0+cmVfdGltZW91dCkpIHsKLQkJZHVtLT5wb3J0X3N0YXR1cyB8PSAoVVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQgPDwgMTYpOwotCQlkdW0tPnBvcnRfc3RhdHVzICY9IH5VU0JfUE9SVF9TVEFUX1NVU1BFTkQ7Ci0JCXNldF9saW5rX3N0YXRlIChkdW0pOworCWlmIChkdW1faGNkLT5yZXN1bWluZyAmJiB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGR1bV9oY2QtPnJlX3RpbWVvdXQpKSB7CisJCWR1bV9oY2QtPnBvcnRfc3RhdHVzIHw9IChVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCA8PCAxNik7CisJCWR1bV9oY2QtPnBvcnRfc3RhdHVzICY9IH5VU0JfUE9SVF9TVEFUX1NVU1BFTkQ7CisJCXNldF9saW5rX3N0YXRlKGR1bV9oY2QpOwogCX0KIAotCWlmICgoZHVtLT5wb3J0X3N0YXR1cyAmIFBPUlRfQ19NQVNLKSAhPSAwKSB7CisJaWYgKChkdW1faGNkLT5wb3J0X3N0YXR1cyAmIFBPUlRfQ19NQVNLKSAhPSAwKSB7CiAJCSpidWYgPSAoMSA8PCAxKTsKLQkJZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksICJwb3J0IHN0YXR1cyAweCUwOHggaGFzIGNoYW5nZXNcbiIsCi0JCQkJZHVtLT5wb3J0X3N0YXR1cyk7CisJCWRldl9kYmcoZHVtbXlfZGV2KGR1bV9oY2QpLCAicG9ydCBzdGF0dXMgMHglMDh4IGhhcyBjaGFuZ2VzXG4iLAorCQkJCWR1bV9oY2QtPnBvcnRfc3RhdHVzKTsKIAkJcmV0dmFsID0gMTsKLQkJaWYgKGR1bS0+cmhfc3RhdGUgPT0gRFVNTVlfUkhfU1VTUEVOREVEKQorCQlpZiAoZHVtX2hjZC0+cmhfc3RhdGUgPT0gRFVNTVlfUkhfU1VTUEVOREVEKQogCQkJdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIgKGhjZCk7CiAJfQogZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZHVtLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHVtX2hjZC0+ZHVtLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCitzc19odWJfZGVzY3JpcHRvcihzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yICpkZXNjKQoreworCW1lbXNldChkZXNjLCAwLCBzaXplb2YgKmRlc2MpOworCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4MmE7CisJZGVzYy0+YkRlc2NMZW5ndGggPSAxMjsKKwlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzID0gY3B1X3RvX2xlMTYoMHgwMDAxKTsKKwlkZXNjLT5iTmJyUG9ydHMgPSAxOworCWRlc2MtPnUuc3MuYkh1YkhkckRlY0xhdCA9IDB4MDQ7IC8qIFdvcnN0IGNhc2U6IDAuNCBtaWNybyBzZWMqLworCWRlc2MtPnUuc3MuRGV2aWNlUmVtb3ZhYmxlID0gMHhmZmZmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKIGh1Yl9kZXNjcmlwdG9yIChzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yICpkZXNjKQogewogCW1lbXNldCAoZGVzYywgMCwgc2l6ZW9mICpkZXNjKTsKQEAgLTE2MDYsMzkgKzE4MDIsNjQgQEAKIAljaGFyCQkqYnVmLAogCXUxNgkJd0xlbmd0aAogKSB7Ci0Jc3RydWN0IGR1bW15CSpkdW07CisJc3RydWN0IGR1bW15X2hjZCAqZHVtX2hjZDsKIAlpbnQJCXJldHZhbCA9IDA7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAogCWlmICghSENEX0hXX0FDQ0VTU0lCTEUoaGNkKSkKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAKLQlkdW0gPSBoY2RfdG9fZHVtbXkgKGhjZCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKKwlkdW1faGNkID0gaGNkX3RvX2R1bW15X2hjZChoY2QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR1bV9oY2QtPmR1bS0+bG9jaywgZmxhZ3MpOwogCXN3aXRjaCAodHlwZVJlcSkgewogCWNhc2UgQ2xlYXJIdWJGZWF0dXJlOgogCQlicmVhazsKIAljYXNlIENsZWFyUG9ydEZlYXR1cmU6CiAJCXN3aXRjaCAod1ZhbHVlKSB7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgotCQkJaWYgKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpIHsKKwkJCWlmIChoY2QtPnNwZWVkID09IEhDRF9VU0IzKSB7CisJCQkJZGV2X2RiZyhkdW1teV9kZXYoZHVtX2hjZCksCisJCQkJCSAiVVNCX1BPUlRfRkVBVF9TVVNQRU5EIHJlcSBub3QgIgorCQkJCQkgInN1cHBvcnRlZCBmb3IgVVNCIDMuMCByb290aHViXG4iKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJaWYgKGR1bV9oY2QtPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSB7CiAJCQkJLyogMjBtc2VjIHJlc3VtZSBzaWduYWxpbmcgKi8KLQkJCQlkdW0tPnJlc3VtaW5nID0gMTsKLQkJCQlkdW0tPnJlX3RpbWVvdXQgPSBqaWZmaWVzICsKKwkJCQlkdW1faGNkLT5yZXN1bWluZyA9IDE7CisJCQkJZHVtX2hjZC0+cmVfdGltZW91dCA9IGppZmZpZXMgKwogCQkJCQkJbXNlY3NfdG9famlmZmllcygyMCk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgotCQkJaWYgKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1BPV0VSKQotCQkJCWRldl9kYmcgKGR1bW15X2RldihkdW0pLCAicG93ZXItb2ZmXG4iKTsKKwkJCWlmIChoY2QtPnNwZWVkID09IEhDRF9VU0IzKSB7CisJCQkJaWYgKGR1bV9oY2QtPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9QT1dFUikKKwkJCQkJZGV2X2RiZyhkdW1teV9kZXYoZHVtX2hjZCksCisJCQkJCQkicG93ZXItb2ZmXG4iKTsKKwkJCX0gZWxzZQorCQkJCWlmIChkdW1faGNkLT5wb3J0X3N0YXR1cyAmCisJCQkJCQkJVVNCX1NTX1BPUlRfU1RBVF9QT1dFUikKKwkJCQkJZGV2X2RiZyhkdW1teV9kZXYoZHVtX2hjZCksCisJCQkJCQkicG93ZXItb2ZmXG4iKTsKIAkJCS8qIEZBTExTIFRIUk9VR0ggKi8KIAkJZGVmYXVsdDoKLQkJCWR1bS0+cG9ydF9zdGF0dXMgJj0gfigxIDw8IHdWYWx1ZSk7Ci0JCQlzZXRfbGlua19zdGF0ZSAoZHVtKTsKKwkJCWR1bV9oY2QtPnBvcnRfc3RhdHVzICY9IH4oMSA8PCB3VmFsdWUpOworCQkJc2V0X2xpbmtfc3RhdGUoZHVtX2hjZCk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBHZXRIdWJEZXNjcmlwdG9yOgotCQlodWJfZGVzY3JpcHRvciAoKHN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKikgYnVmKTsKKwkJaWYgKGhjZC0+c3BlZWQgPT0gSENEX1VTQjMgJiYKKwkJCQkod0xlbmd0aCA8IFVTQl9EVF9TU19IVUJfU0laRSB8fAorCQkJCSB3VmFsdWUgIT0gKFVTQl9EVF9TU19IVUIgPDwgOCkpKSB7CisJCQlkZXZfZGJnKGR1bW15X2RldihkdW1faGNkKSwKKwkJCQkiV3JvbmcgaHViIGRlc2NyaXB0b3IgdHlwZSBmb3IgIgorCQkJCSJVU0IgMy4wIHJvb3RodWIuXG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJaWYgKGhjZC0+c3BlZWQgPT0gSENEX1VTQjMpCisJCQlzc19odWJfZGVzY3JpcHRvcigoc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqKSBidWYpOworCQllbHNlCisJCQlodWJfZGVzY3JpcHRvcigoc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqKSBidWYpOwogCQlicmVhazsKIAljYXNlIEdldEh1YlN0YXR1czoKIAkJKihfX2xlMzIgKikgYnVmID0gY3B1X3RvX2xlMzIgKDApOwpAQCAtMTY1MCwxMjcgKzE4NzEsMjEwIEBACiAJCS8qIHdob2V2ZXIgcmVzZXRzIG9yIHJlc3VtZXMgbXVzdCBHZXRQb3J0U3RhdHVzIHRvCiAJCSAqIGNvbXBsZXRlIGl0ISEKIAkJICovCi0JCWlmIChkdW0tPnJlc3VtaW5nICYmCi0JCQkJdGltZV9hZnRlcl9lcSAoamlmZmllcywgZHVtLT5yZV90aW1lb3V0KSkgewotCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSAoVVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQgPDwgMTYpOwotCQkJZHVtLT5wb3J0X3N0YXR1cyAmPSB+VVNCX1BPUlRfU1RBVF9TVVNQRU5EOworCQlpZiAoZHVtX2hjZC0+cmVzdW1pbmcgJiYKKwkJCQl0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGR1bV9oY2QtPnJlX3RpbWVvdXQpKSB7CisJCQlkdW1faGNkLT5wb3J0X3N0YXR1cyB8PSAoVVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQgPDwgMTYpOworCQkJZHVtX2hjZC0+cG9ydF9zdGF0dXMgJj0gflVTQl9QT1JUX1NUQVRfU1VTUEVORDsKIAkJfQotCQlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1JFU0VUKSAhPSAwICYmCi0JCQkJdGltZV9hZnRlcl9lcSAoamlmZmllcywgZHVtLT5yZV90aW1lb3V0KSkgewotCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSAoVVNCX1BPUlRfU1RBVF9DX1JFU0VUIDw8IDE2KTsKLQkJCWR1bS0+cG9ydF9zdGF0dXMgJj0gflVTQl9QT1JUX1NUQVRfUkVTRVQ7Ci0JCQlpZiAoZHVtLT5wdWxsdXApIHsKLQkJCQlkdW0tPnBvcnRfc3RhdHVzIHw9IFVTQl9QT1JUX1NUQVRfRU5BQkxFOwotCQkJCS8qIGdpdmUgaXQgdGhlIGJlc3Qgc3BlZWQgd2UgYWdyZWUgb24gKi8KLQkJCQlkdW0tPmdhZGdldC5zcGVlZCA9IGR1bS0+ZHJpdmVyLT5zcGVlZDsKLQkJCQlkdW0tPmdhZGdldC5lcDAtPm1heHBhY2tldCA9IDY0OwotCQkJCXN3aXRjaCAoZHVtLT5nYWRnZXQuc3BlZWQpIHsKLQkJCQljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQkJCQlkdW0tPnBvcnRfc3RhdHVzIHw9Ci0JCQkJCQlVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVVNCX1NQRUVEX0xPVzoKLQkJCQkJZHVtLT5nYWRnZXQuZXAwLT5tYXhwYWNrZXQgPSA4OwotCQkJCQlkdW0tPnBvcnRfc3RhdHVzIHw9Ci0JCQkJCQlVU0JfUE9SVF9TVEFUX0xPV19TUEVFRDsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJZHVtLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKLQkJCQkJYnJlYWs7CisJCWlmICgoZHVtX2hjZC0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1JFU0VUKSAhPSAwICYmCisJCQkJdGltZV9hZnRlcl9lcShqaWZmaWVzLCBkdW1faGNkLT5yZV90aW1lb3V0KSkgeworCQkJZHVtX2hjZC0+cG9ydF9zdGF0dXMgfD0gKFVTQl9QT1JUX1NUQVRfQ19SRVNFVCA8PCAxNik7CisJCQlkdW1faGNkLT5wb3J0X3N0YXR1cyAmPSB+VVNCX1BPUlRfU1RBVF9SRVNFVDsKKwkJCWlmIChkdW1faGNkLT5kdW0tPnB1bGx1cCkgeworCQkJCWR1bV9oY2QtPnBvcnRfc3RhdHVzIHw9IFVTQl9QT1JUX1NUQVRfRU5BQkxFOworCisJCQkJaWYgKGhjZC0+c3BlZWQgPCBIQ0RfVVNCMykgeworCQkJCQlzd2l0Y2ggKGR1bV9oY2QtPmR1bS0+Z2FkZ2V0LnNwZWVkKSB7CisJCQkJCWNhc2UgVVNCX1NQRUVEX0hJR0g6CisJCQkJCQlkdW1faGNkLT5wb3J0X3N0YXR1cyB8PQorCQkJCQkJICAgICAgVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVVNCX1NQRUVEX0xPVzoKKwkJCQkJCWR1bV9oY2QtPmR1bS0+Z2FkZ2V0LmVwMC0+CisJCQkJCQkJbWF4cGFja2V0ID0gODsKKwkJCQkJCWR1bV9oY2QtPnBvcnRfc3RhdHVzIHw9CisJCQkJCQkJVVNCX1BPUlRfU1RBVF9MT1dfU1BFRUQ7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWR1bV9oY2QtPmR1bS0+Z2FkZ2V0LnNwZWVkID0KKwkJCQkJCQlVU0JfU1BFRURfRlVMTDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9Ci0JCXNldF9saW5rX3N0YXRlIChkdW0pOwotCQkoKF9fbGUxNiAqKSBidWYpWzBdID0gY3B1X3RvX2xlMTYgKGR1bS0+cG9ydF9zdGF0dXMpOwotCQkoKF9fbGUxNiAqKSBidWYpWzFdID0gY3B1X3RvX2xlMTYgKGR1bS0+cG9ydF9zdGF0dXMgPj4gMTYpOworCQlzZXRfbGlua19zdGF0ZShkdW1faGNkKTsKKwkJKChfX2xlMTYgKikgYnVmKVswXSA9IGNwdV90b19sZTE2IChkdW1faGNkLT5wb3J0X3N0YXR1cyk7CisJCSgoX19sZTE2ICopIGJ1ZilbMV0gPSBjcHVfdG9fbGUxNiAoZHVtX2hjZC0+cG9ydF9zdGF0dXMgPj4gMTYpOwogCQlicmVhazsKIAljYXNlIFNldEh1YkZlYXR1cmU6CiAJCXJldHZhbCA9IC1FUElQRTsKIAkJYnJlYWs7CiAJY2FzZSBTZXRQb3J0RmVhdHVyZToKIAkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0xJTktfU1RBVEU6CisJCQlpZiAoaGNkLT5zcGVlZCAhPSBIQ0RfVVNCMykgeworCQkJCWRldl9kYmcoZHVtbXlfZGV2KGR1bV9oY2QpLAorCQkJCQkgIlVTQl9QT1JUX0ZFQVRfTElOS19TVEFURSByZXEgbm90ICIKKwkJCQkJICJzdXBwb3J0ZWQgZm9yIFVTQiAyLjAgcm9vdGh1YlxuIik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCS8qCisJCQkgKiBTaW5jZSB0aGlzIGlzIGR1bW15IHdlIGRvbid0IGhhdmUgYW4gYWN0dWFsIGxpbmsgc28KKwkJCSAqIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gZm9yIHRoZSBTRVRfTElOS19TVEFURSBjbWQKKwkJCSAqLworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9VMV9USU1FT1VUOgorCQljYXNlIFVTQl9QT1JUX0ZFQVRfVTJfVElNRU9VVDoKKwkJCS8qIFRPRE86IGFkZCBzdXNwZW5kL3Jlc3VtZSBzdXBwb3J0ISAqLworCQkJaWYgKGhjZC0+c3BlZWQgIT0gSENEX1VTQjMpIHsKKwkJCQlkZXZfZGJnKGR1bW15X2RldihkdW1faGNkKSwKKwkJCQkJICJVU0JfUE9SVF9GRUFUX1UxLzJfVElNRU9VVCByZXEgbm90ICIKKwkJCQkJICJzdXBwb3J0ZWQgZm9yIFVTQiAyLjAgcm9vdGh1YlxuIik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKLQkJCWlmIChkdW0tPmFjdGl2ZSkgewotCQkJCWR1bS0+cG9ydF9zdGF0dXMgfD0gVVNCX1BPUlRfU1RBVF9TVVNQRU5EOworCQkJLyogQXBwbGljYWJsZSBvbmx5IGZvciBVU0IyLjAgaHViICovCisJCQlpZiAoaGNkLT5zcGVlZCA9PSBIQ0RfVVNCMykgeworCQkJCWRldl9kYmcoZHVtbXlfZGV2KGR1bV9oY2QpLAorCQkJCQkgIlVTQl9QT1JUX0ZFQVRfU1VTUEVORCByZXEgbm90ICIKKwkJCQkJICJzdXBwb3J0ZWQgZm9yIFVTQiAzLjAgcm9vdGh1YlxuIik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWlmIChkdW1faGNkLT5hY3RpdmUpIHsKKwkJCQlkdW1faGNkLT5wb3J0X3N0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX1NVU1BFTkQ7CiAKIAkJCQkvKiBITlAgd291bGQgaGFwcGVuIGhlcmU7IGZvciBub3cgd2UKIAkJCQkgKiBhc3N1bWUgYl9idXNfcmVxIGlzIGFsd2F5cyB0cnVlLgogCQkJCSAqLwotCQkJCXNldF9saW5rX3N0YXRlIChkdW0pOworCQkJCXNldF9saW5rX3N0YXRlKGR1bV9oY2QpOwogCQkJCWlmICgoKDEgPDwgVVNCX0RFVklDRV9CX0hOUF9FTkFCTEUpCi0JCQkJCQkmIGR1bS0+ZGV2c3RhdHVzKSAhPSAwKQotCQkJCQlkZXZfZGJnIChkdW1teV9kZXYoZHVtKSwKKwkJCQkJCSYgZHVtX2hjZC0+ZHVtLT5kZXZzdGF0dXMpICE9IDApCisJCQkJCWRldl9kYmcoZHVtbXlfZGV2KGR1bV9oY2QpLAogCQkJCQkJCSJubyBITlAgeWV0IVxuIik7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgotCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX1BPV0VSOwotCQkJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CisJCQlpZiAoaGNkLT5zcGVlZCA9PSBIQ0RfVVNCMykKKwkJCQlkdW1faGNkLT5wb3J0X3N0YXR1cyB8PSBVU0JfU1NfUE9SVF9TVEFUX1BPV0VSOworCQkJZWxzZQorCQkJCWR1bV9oY2QtPnBvcnRfc3RhdHVzIHw9IFVTQl9QT1JUX1NUQVRfUE9XRVI7CisJCQlzZXRfbGlua19zdGF0ZShkdW1faGNkKTsKIAkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQkhfUE9SVF9SRVNFVDoKKwkJCS8qIEFwcGxpY2FibGUgb25seSBmb3IgVVNCMy4wIGh1YiAqLworCQkJaWYgKGhjZC0+c3BlZWQgIT0gSENEX1VTQjMpIHsKKwkJCQlkZXZfZGJnKGR1bW15X2RldihkdW1faGNkKSwKKwkJCQkJICJVU0JfUE9SVF9GRUFUX0JIX1BPUlRfUkVTRVQgcmVxIG5vdCAiCisJCQkJCSAic3VwcG9ydGVkIGZvciBVU0IgMi4wIHJvb3RodWJcbiIpOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQkvKiBGQUxMUyBUSFJPVUdIICovCiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9SRVNFVDoKIAkJCS8qIGlmIGl0J3MgYWxyZWFkeSBlbmFibGVkLCBkaXNhYmxlICovCi0JCQlkdW0tPnBvcnRfc3RhdHVzICY9IH4oVVNCX1BPUlRfU1RBVF9FTkFCTEUKKwkJCWlmIChoY2QtPnNwZWVkID09IEhDRF9VU0IzKSB7CisJCQkJZHVtX2hjZC0+cG9ydF9zdGF0dXMgPSAwOworCQkJCWR1bV9oY2QtPnBvcnRfc3RhdHVzID0KKwkJCQkJKFVTQl9TU19QT1JUX1NUQVRfUE9XRVIgfAorCQkJCQkgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OIHwKKwkJCQkJIFVTQl9QT1JUX1NUQVRfUkVTRVQpOworCQkJfSBlbHNlCisJCQkJZHVtX2hjZC0+cG9ydF9zdGF0dXMgJj0gfihVU0JfUE9SVF9TVEFUX0VOQUJMRQogCQkJCQl8IFVTQl9QT1JUX1NUQVRfTE9XX1NQRUVECiAJCQkJCXwgVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEKTsKLQkJCWR1bS0+ZGV2c3RhdHVzID0gMDsKLQkJCS8qIDUwbXNlYyByZXNldCBzaWduYWxpbmcgKi8KLQkJCWR1bS0+cmVfdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKTsKKwkJCS8qCisJCQkgKiBXZSB3YW50IHRvIHJlc2V0IGRldmljZSBzdGF0dXMuIEFsbCBidXQgdGhlCisJCQkgKiBTZWxmIHBvd2VyZWQgZmVhdHVyZQorCQkJICovCisJCQlkdW1faGNkLT5kdW0tPmRldnN0YXR1cyAmPQorCQkJCSgxIDw8IFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVEKTsKKwkJCS8qCisJCQkgKiBGSVhNRSBVU0IzLjA6IHdoYXQgaXMgdGhlIGNvcnJlY3QgcmVzZXQgc2lnbmFsaW5nCisJCQkgKiBpbnRlcnZhbD8gSXMgaXQgc3RpbGwgNTBtc2VjIGFzIGZvciBIUz8KKwkJCSAqLworCQkJZHVtX2hjZC0+cmVfdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKTsKIAkJCS8qIEZBTExTIFRIUk9VR0ggKi8KIAkJZGVmYXVsdDoKLQkJCWlmICgoZHVtLT5wb3J0X3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfUE9XRVIpICE9IDApIHsKLQkJCQlkdW0tPnBvcnRfc3RhdHVzIHw9ICgxIDw8IHdWYWx1ZSk7Ci0JCQkJc2V0X2xpbmtfc3RhdGUgKGR1bSk7Ci0JCQl9CisJCQlpZiAoaGNkLT5zcGVlZCA9PSBIQ0RfVVNCMykgeworCQkJCWlmICgoZHVtX2hjZC0+cG9ydF9zdGF0dXMgJgorCQkJCSAgICAgVVNCX1NTX1BPUlRfU1RBVF9QT1dFUikgIT0gMCkgeworCQkJCQlkdW1faGNkLT5wb3J0X3N0YXR1cyB8PSAoMSA8PCB3VmFsdWUpOworCQkJCQlzZXRfbGlua19zdGF0ZShkdW1faGNkKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlpZiAoKGR1bV9oY2QtPnBvcnRfc3RhdHVzICYKKwkJCQkgICAgIFVTQl9QT1JUX1NUQVRfUE9XRVIpICE9IDApIHsKKwkJCQkJZHVtX2hjZC0+cG9ydF9zdGF0dXMgfD0gKDEgPDwgd1ZhbHVlKTsKKwkJCQkJc2V0X2xpbmtfc3RhdGUoZHVtX2hjZCk7CisJCQkJfQogCQl9CiAJCWJyZWFrOwotCisJY2FzZSBHZXRQb3J0RXJyb3JDb3VudDoKKwkJaWYgKGhjZC0+c3BlZWQgIT0gSENEX1VTQjMpIHsKKwkJCWRldl9kYmcoZHVtbXlfZGV2KGR1bV9oY2QpLAorCQkJCSAiR2V0UG9ydEVycm9yQ291bnQgcmVxIG5vdCAiCisJCQkJICJzdXBwb3J0ZWQgZm9yIFVTQiAyLjAgcm9vdGh1YlxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJCS8qIFdlJ2xsIGFsd2F5cyByZXR1cm4gMCBzaW5jZSB0aGlzIGlzIGEgZHVtbXkgaHViICovCisJCSooX19sZTMyICopIGJ1ZiA9IGNwdV90b19sZTMyKDApOworCQlicmVhazsKKwljYXNlIFNldEh1YkRlcHRoOgorCQlpZiAoaGNkLT5zcGVlZCAhPSBIQ0RfVVNCMykgeworCQkJZGV2X2RiZyhkdW1teV9kZXYoZHVtX2hjZCksCisJCQkJICJTZXRIdWJEZXB0aCByZXEgbm90IHN1cHBvcnRlZCBmb3IgIgorCQkJCSAiVVNCIDIuMCByb290aHViXG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksCisJCWRldl9kYmcoZHVtbXlfZGV2KGR1bV9oY2QpLAogCQkJImh1YiBjb250cm9sIHJlcSUwNHggdiUwNHggaSUwNHggbCVkXG4iLAogCQkJdHlwZVJlcSwgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGgpOwotCitlcnJvcjoKIAkJLyogInByb3RvY29sIHN0YWxsIiBvbiBlcnJvciAqLwogCQlyZXR2YWwgPSAtRVBJUEU7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdW1faGNkLT5kdW0tPmxvY2ssIGZsYWdzKTsKIAotCWlmICgoZHVtLT5wb3J0X3N0YXR1cyAmIFBPUlRfQ19NQVNLKSAhPSAwKQorCWlmICgoZHVtX2hjZC0+cG9ydF9zdGF0dXMgJiBQT1JUX0NfTUFTSykgIT0gMCkKIAkJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyAoaGNkKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50IGR1bW15X2J1c19zdXNwZW5kIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewotCXN0cnVjdCBkdW1teSAqZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOworCXN0cnVjdCBkdW1teV9oY2QgKmR1bV9oY2QgPSBoY2RfdG9fZHVtbXlfaGNkKGhjZCk7CiAKIAlkZXZfZGJnICgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCi0Jc3Bpbl9sb2NrX2lycSAoJmR1bS0+bG9jayk7Ci0JZHVtLT5yaF9zdGF0ZSA9IERVTU1ZX1JIX1NVU1BFTkRFRDsKLQlzZXRfbGlua19zdGF0ZSAoZHVtKTsKKwlzcGluX2xvY2tfaXJxKCZkdW1faGNkLT5kdW0tPmxvY2spOworCWR1bV9oY2QtPnJoX3N0YXRlID0gRFVNTVlfUkhfU1VTUEVOREVEOworCXNldF9saW5rX3N0YXRlKGR1bV9oY2QpOwogCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7Ci0Jc3Bpbl91bmxvY2tfaXJxICgmZHVtLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmR1bV9oY2QtPmR1bS0+bG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZHVtbXlfYnVzX3Jlc3VtZSAoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKLQlzdHJ1Y3QgZHVtbXkgKmR1bSA9IGhjZF90b19kdW1teSAoaGNkKTsKKwlzdHJ1Y3QgZHVtbXlfaGNkICpkdW1faGNkID0gaGNkX3RvX2R1bW15X2hjZChoY2QpOwogCWludCByYyA9IDA7CiAKIAlkZXZfZGJnICgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCi0Jc3Bpbl9sb2NrX2lycSAoJmR1bS0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZHVtX2hjZC0+ZHVtLT5sb2NrKTsKIAlpZiAoIUhDRF9IV19BQ0NFU1NJQkxFKGhjZCkpIHsKIAkJcmMgPSAtRVNIVVRET1dOOwogCX0gZWxzZSB7Ci0JCWR1bS0+cmhfc3RhdGUgPSBEVU1NWV9SSF9SVU5OSU5HOwotCQlzZXRfbGlua19zdGF0ZSAoZHVtKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZkdW0tPnVyYnBfbGlzdCkpCi0JCQltb2RfdGltZXIgKCZkdW0tPnRpbWVyLCBqaWZmaWVzKTsKKwkJZHVtX2hjZC0+cmhfc3RhdGUgPSBEVU1NWV9SSF9SVU5OSU5HOworCQlzZXRfbGlua19zdGF0ZShkdW1faGNkKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZkdW1faGNkLT51cmJwX2xpc3QpKQorCQkJbW9kX3RpbWVyKCZkdW1faGNkLT50aW1lciwgamlmZmllcyk7CiAJCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOwogCX0KLQlzcGluX3VubG9ja19pcnEgKCZkdW0tPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZHVtX2hjZC0+ZHVtLT5sb2NrKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE3ODYsMTggKzIwOTAsMzcgQEAKIAkJdXJiLAogCQkoeyBjaGFyICpzOwogCQkgc3dpdGNoICh1cmItPmRldi0+c3BlZWQpIHsKLQkJIGNhc2UgVVNCX1NQRUVEX0xPVzoJcyA9ICJscyI7IGJyZWFrOwotCQkgY2FzZSBVU0JfU1BFRURfRlVMTDoJcyA9ICJmcyI7IGJyZWFrOwotCQkgY2FzZSBVU0JfU1BFRURfSElHSDoJcyA9ICJocyI7IGJyZWFrOwotCQkgZGVmYXVsdDoJCXMgPSAiPyI7IGJyZWFrOworCQkgY2FzZSBVU0JfU1BFRURfTE9XOgorCQkJcyA9ICJscyI7CisJCQlicmVhazsKKwkJIGNhc2UgVVNCX1NQRUVEX0ZVTEw6CisJCQlzID0gImZzIjsKKwkJCWJyZWFrOworCQkgY2FzZSBVU0JfU1BFRURfSElHSDoKKwkJCXMgPSAiaHMiOworCQkJYnJlYWs7CisJCSBjYXNlIFVTQl9TUEVFRF9TVVBFUjoKKwkJCXMgPSAic3MiOworCQkJYnJlYWs7CisJCSBkZWZhdWx0OgorCQkJcyA9ICI/IjsKKwkJCWJyZWFrOwogCQkgfTsgczsgfSksCiAJCWVwLCBlcCA/ICh1c2JfcGlwZWluICh1cmItPnBpcGUpID8gImluIiA6ICJvdXQiKSA6ICIiLAogCQkoeyBjaGFyICpzOyBcCiAJCSBzd2l0Y2ggKHVzYl9waXBldHlwZSAodXJiLT5waXBlKSkgeyBcCi0JCSBjYXNlIFBJUEVfQ09OVFJPTDoJcyA9ICIiOyBicmVhazsgXAotCQkgY2FzZSBQSVBFX0JVTEs6CXMgPSAiLWJ1bGsiOyBicmVhazsgXAotCQkgY2FzZSBQSVBFX0lOVEVSUlVQVDoJcyA9ICItaW50IjsgYnJlYWs7IFwKLQkJIGRlZmF1bHQ6IAkJcyA9ICItaXNvIjsgYnJlYWs7IFwKKwkJIGNhc2UgUElQRV9DT05UUk9MOiBcCisJCQlzID0gIiI7IFwKKwkJCWJyZWFrOyBcCisJCSBjYXNlIFBJUEVfQlVMSzogXAorCQkJcyA9ICItYnVsayI7IFwKKwkJCWJyZWFrOyBcCisJCSBjYXNlIFBJUEVfSU5URVJSVVBUOiBcCisJCQlzID0gIi1pbnQiOyBcCisJCQlicmVhazsgXAorCQkgZGVmYXVsdDogXAorCQkJcyA9ICItaXNvIjsgXAorCQkJYnJlYWs7IFwKIAkJfTsgczt9KSwKIAkJdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwogfQpAQCAtMTgwNiw0MyArMjEyOSw2MyBAQAogc2hvd191cmJzIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHVzYl9oY2QJCSpoY2QgPSBkZXZfZ2V0X2RydmRhdGEgKGRldik7Ci0Jc3RydWN0IGR1bW15CQkqZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOworCXN0cnVjdCBkdW1teV9oY2QJKmR1bV9oY2QgPSBoY2RfdG9fZHVtbXlfaGNkKGhjZCk7CiAJc3RydWN0IHVyYnAJCSp1cmJwOwogCXNpemVfdAkJCXNpemUgPSAwOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5ICh1cmJwLCAmZHVtLT51cmJwX2xpc3QsIHVyYnBfbGlzdCkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZkdW1faGNkLT5kdW0tPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVyYnAsICZkdW1faGNkLT51cmJwX2xpc3QsIHVyYnBfbGlzdCkgewogCQlzaXplX3QJCXRlbXA7CiAKIAkJdGVtcCA9IHNob3dfdXJiIChidWYsIFBBR0VfU0laRSAtIHNpemUsIHVyYnAtPnVyYik7CiAJCWJ1ZiArPSB0ZW1wOwogCQlzaXplICs9IHRlbXA7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdW1faGNkLT5kdW0tPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiBzaXplOwogfQogc3RhdGljIERFVklDRV9BVFRSICh1cmJzLCBTX0lSVUdPLCBzaG93X3VyYnMsIE5VTEwpOwogCi1zdGF0aWMgaW50IGR1bW15X3N0YXJ0IChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQorc3RhdGljIGludCBkdW1teV9zdGFydF9zcyhzdHJ1Y3QgZHVtbXlfaGNkICpkdW1faGNkKQogewotCXN0cnVjdCBkdW1teQkJKmR1bTsKKwlpbml0X3RpbWVyKCZkdW1faGNkLT50aW1lcik7CisJZHVtX2hjZC0+dGltZXIuZnVuY3Rpb24gPSBkdW1teV90aW1lcjsKKwlkdW1faGNkLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZHVtX2hjZDsKKwlkdW1faGNkLT5yaF9zdGF0ZSA9IERVTU1ZX1JIX1JVTk5JTkc7CisJSU5JVF9MSVNUX0hFQUQoJmR1bV9oY2QtPnVyYnBfbGlzdCk7CisJZHVtbXlfaGNkX3RvX2hjZChkdW1faGNkKS0+cG93ZXJfYnVkZ2V0ID0gUE9XRVJfQlVER0VUOworCWR1bW15X2hjZF90b19oY2QoZHVtX2hjZCktPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKKwlkdW1teV9oY2RfdG9faGNkKGR1bV9oY2QpLT51c2VzX25ld19wb2xsaW5nID0gMTsKKyNpZmRlZiBDT05GSUdfVVNCX09URworCWR1bW15X2hjZF90b19oY2QoZHVtX2hjZCktPnNlbGYub3RnX3BvcnQgPSAxOworI2VuZGlmCisJcmV0dXJuIDA7CiAKLQlkdW0gPSBoY2RfdG9fZHVtbXkgKGhjZCk7CisJLyogRklYTUUgJ3VyYnMnIHNob3VsZCBiZSBhIHBlci1kZXZpY2UgdGhpbmcsIG1heWJlIGluIHVzYmNvcmUgKi8KKwlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlKGR1bW15X2RldihkdW1faGNkKSwgJmRldl9hdHRyX3VyYnMpOworfQorCitzdGF0aWMgaW50IGR1bW15X3N0YXJ0KHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IGR1bW15X2hjZAkqZHVtX2hjZCA9IGhjZF90b19kdW1teV9oY2QoaGNkKTsKIAogCS8qCiAJICogTUFTVEVSIHNpZGUgaW5pdCAuLi4gd2UgZW11bGF0ZSBhIHJvb3QgaHViIHRoYXQnbGwgb25seSBldmVyCiAJICogdGFsayB0byBvbmUgZGV2aWNlICh0aGUgc2xhdmUgc2lkZSkuICBBbHNvIGFwcGVhcnMgaW4gc3lzZnMsCiAJICoganVzdCBsaWtlIG1vcmUgZmFtaWxpYXIgcGNpLWJhc2VkIEhDRHMuCiAJICovCi0Jc3Bpbl9sb2NrX2luaXQgKCZkdW0tPmxvY2spOwotCWluaXRfdGltZXIgKCZkdW0tPnRpbWVyKTsKLQlkdW0tPnRpbWVyLmZ1bmN0aW9uID0gZHVtbXlfdGltZXI7Ci0JZHVtLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGR1bTsKLQlkdW0tPnJoX3N0YXRlID0gRFVNTVlfUkhfUlVOTklORzsKKwlpZiAoIXVzYl9oY2RfaXNfcHJpbWFyeV9oY2QoaGNkKSkKKwkJcmV0dXJuIGR1bW15X3N0YXJ0X3NzKGR1bV9oY2QpOwogCi0JSU5JVF9MSVNUX0hFQUQgKCZkdW0tPnVyYnBfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJmR1bV9oY2QtPmR1bS0+bG9jayk7CisJaW5pdF90aW1lcigmZHVtX2hjZC0+dGltZXIpOworCWR1bV9oY2QtPnRpbWVyLmZ1bmN0aW9uID0gZHVtbXlfdGltZXI7CisJZHVtX2hjZC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWR1bV9oY2Q7CisJZHVtX2hjZC0+cmhfc3RhdGUgPSBEVU1NWV9SSF9SVU5OSU5HOworCisJSU5JVF9MSVNUX0hFQUQoJmR1bV9oY2QtPnVyYnBfbGlzdCk7CiAKIAloY2QtPnBvd2VyX2J1ZGdldCA9IFBPV0VSX0JVREdFVDsKIAloY2QtPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKQEAgLTE4NTMsMTggKzIxOTYsMTcgQEAKICNlbmRpZgogCiAJLyogRklYTUUgJ3VyYnMnIHNob3VsZCBiZSBhIHBlci1kZXZpY2UgdGhpbmcsIG1heWJlIGluIHVzYmNvcmUgKi8KLQlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlIChkdW1teV9kZXYoZHVtKSwgJmRldl9hdHRyX3VyYnMpOworCXJldHVybiBkZXZpY2VfY3JlYXRlX2ZpbGUoZHVtbXlfZGV2KGR1bV9oY2QpLCAmZGV2X2F0dHJfdXJicyk7CiB9CiAKIHN0YXRpYyB2b2lkIGR1bW15X3N0b3AgKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IGR1bW15CQkqZHVtOwogCi0JZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOwotCi0JZGV2aWNlX3JlbW92ZV9maWxlIChkdW1teV9kZXYoZHVtKSwgJmRldl9hdHRyX3VyYnMpOwotCXVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIgKGR1bS0+ZHJpdmVyKTsKLQlkZXZfaW5mbyAoZHVtbXlfZGV2KGR1bSksICJzdG9wcGVkXG4iKTsKKwlkdW0gPSAoaGNkX3RvX2R1bW15X2hjZChoY2QpKS0+ZHVtOworCWRldmljZV9yZW1vdmVfZmlsZShkdW1teV9kZXYoaGNkX3RvX2R1bW15X2hjZChoY2QpKSwgJmRldl9hdHRyX3VyYnMpOworCXVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoZHVtLT5kcml2ZXIpOworCWRldl9pbmZvKGR1bW15X2RldihoY2RfdG9fZHVtbXlfaGNkKGhjZCkpLCAic3RvcHBlZFxuIik7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xODc0LDEzICsyMjE2LDU5IEBACiAJcmV0dXJuIGR1bW15X2dfZ2V0X2ZyYW1lIChOVUxMKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBoY19kcml2ZXIgZHVtbXlfaGNkID0geworc3RhdGljIGludCBkdW1teV9zZXR1cChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCWlmICh1c2JfaGNkX2lzX3ByaW1hcnlfaGNkKGhjZCkpIHsKKwkJdGhlX2NvbnRyb2xsZXIuaHNfaGNkID0gaGNkX3RvX2R1bW15X2hjZChoY2QpOworCQl0aGVfY29udHJvbGxlci5oc19oY2QtPmR1bSA9ICZ0aGVfY29udHJvbGxlcjsKKwkJLyoKKwkJICogTWFyayB0aGUgZmlyc3Qgcm9vdGh1YiBhcyBiZWluZyBVU0IgMi4wLgorCQkgKiBUaGUgVVNCIDMuMCByb290aHViIHdpbGwgYmUgcmVnaXN0ZXJlZCBsYXRlciBieQorCQkgKiBkdW1teV9oY2RfcHJvYmUoKQorCQkgKi8KKwkJaGNkLT5zcGVlZCA9IEhDRF9VU0IyOworCQloY2QtPnNlbGYucm9vdF9odWItPnNwZWVkID0gVVNCX1NQRUVEX0hJR0g7CisJfSBlbHNlIHsKKwkJdGhlX2NvbnRyb2xsZXIuc3NfaGNkID0gaGNkX3RvX2R1bW15X2hjZChoY2QpOworCQl0aGVfY29udHJvbGxlci5zc19oY2QtPmR1bSA9ICZ0aGVfY29udHJvbGxlcjsKKwkJaGNkLT5zcGVlZCA9IEhDRF9VU0IzOworCQloY2QtPnNlbGYucm9vdF9odWItPnNwZWVkID0gVVNCX1NQRUVEX1NVUEVSOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2hhbmdlIGEgZ3JvdXAgb2YgYnVsayBlbmRwb2ludHMgdG8gc3VwcG9ydCBtdWx0aXBsZSBzdHJlYW0gSURzICovCitpbnQgZHVtbXlfYWxsb2Nfc3RyZWFtcyhzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKiplcHMsIHVuc2lnbmVkIGludCBudW1fZXBzLAorCXVuc2lnbmVkIGludCBudW1fc3RyZWFtcywgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCWlmIChoY2QtPnNwZWVkICE9IEhDRF9VU0IzKQorCQlkZXZfZGJnKGR1bW15X2RldihoY2RfdG9fZHVtbXlfaGNkKGhjZCkpLAorCQkJIiVzKCkgLSBFUlJPUiEgTm90IHN1cHBvcnRlZCBmb3IgVVNCMi4wIHJvb3RodWJcbiIsCisJCQlfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldmVydHMgYSBncm91cCBvZiBidWxrIGVuZHBvaW50cyBiYWNrIHRvIG5vdCB1c2luZyBzdHJlYW0gSURzLiAqLworaW50IGR1bW15X2ZyZWVfc3RyZWFtcyhzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKiplcHMsIHVuc2lnbmVkIGludCBudW1fZXBzLAorCWdmcF90IG1lbV9mbGFncykKK3sKKwlpZiAoaGNkLT5zcGVlZCAhPSBIQ0RfVVNCMykKKwkJZGV2X2RiZyhkdW1teV9kZXYoaGNkX3RvX2R1bW15X2hjZChoY2QpKSwKKwkJCSIlcygpIC0gRVJST1IhIE5vdCBzdXBwb3J0ZWQgZm9yIFVTQjIuMCByb290aHViXG4iLAorCQkJX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGhjX2RyaXZlciBkdW1teV9oY2QgPSB7CiAJLmRlc2NyaXB0aW9uID0JCShjaGFyICopIGRyaXZlcl9uYW1lLAogCS5wcm9kdWN0X2Rlc2MgPQkJIkR1bW15IGhvc3QgY29udHJvbGxlciIsCi0JLmhjZF9wcml2X3NpemUgPQlzaXplb2Yoc3RydWN0IGR1bW15KSwKKwkuaGNkX3ByaXZfc2l6ZSA9CXNpemVvZihzdHJ1Y3QgZHVtbXlfaGNkKSwKIAotCS5mbGFncyA9CQlIQ0RfVVNCMiwKKwkuZmxhZ3MgPQkJSENEX1VTQjMgfCBIQ0RfU0hBUkVELAogCisJLnJlc2V0ID0JCWR1bW15X3NldHVwLAogCS5zdGFydCA9CQlkdW1teV9zdGFydCwKIAkuc3RvcCA9CQkJZHVtbXlfc3RvcCwKIApAQCAtMTg5Myw1MCArMjI4MSw4NSBAQAogCS5odWJfY29udHJvbCA9IAkJZHVtbXlfaHViX2NvbnRyb2wsCiAJLmJ1c19zdXNwZW5kID0JCWR1bW15X2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCWR1bW15X2J1c19yZXN1bWUsCisKKwkuYWxsb2Nfc3RyZWFtcyA9CWR1bW15X2FsbG9jX3N0cmVhbXMsCisJLmZyZWVfc3RyZWFtcyA9CQlkdW1teV9mcmVlX3N0cmVhbXMsCiB9OwogCiBzdGF0aWMgaW50IGR1bW15X2hjZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCB1c2JfaGNkCQkqaGNkOworCXN0cnVjdCB1c2JfaGNkCQkqaHNfaGNkOworCXN0cnVjdCB1c2JfaGNkCQkqc3NfaGNkOwogCWludAkJCXJldHZhbDsKIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcywgZHJpdmVyICIgRFJJVkVSX1ZFUlNJT04gIlxuIiwgZHJpdmVyX2Rlc2MpOwogCi0JaGNkID0gdXNiX2NyZWF0ZV9oY2QoJmR1bW15X2hjZCwgJnBkZXYtPmRldiwgZGV2X25hbWUoJnBkZXYtPmRldikpOwotCWlmICghaGNkKQorCWlmICghbW9kX2RhdGEuaXNfc3VwZXJfc3BlZWQpCisJCWR1bW15X2hjZC5mbGFncyA9IEhDRF9VU0IyOworCWhzX2hjZCA9IHVzYl9jcmVhdGVfaGNkKCZkdW1teV9oY2QsICZwZGV2LT5kZXYsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlpZiAoIWhzX2hjZCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JdGhlX2NvbnRyb2xsZXIgPSBoY2RfdG9fZHVtbXkgKGhjZCk7CisJaHNfaGNkLT5oYXNfdHQgPSAxOwogCi0JcmV0dmFsID0gdXNiX2FkZF9oY2QoaGNkLCAwLCAwKTsKKwlyZXR2YWwgPSB1c2JfYWRkX2hjZChoc19oY2QsIDAsIDApOwogCWlmIChyZXR2YWwgIT0gMCkgewotCQl1c2JfcHV0X2hjZCAoaGNkKTsKLQkJdGhlX2NvbnRyb2xsZXIgPSBOVUxMOworCQl1c2JfcHV0X2hjZChoc19oY2QpOworCQlyZXR1cm4gcmV0dmFsOwogCX0KKworCWlmIChtb2RfZGF0YS5pc19zdXBlcl9zcGVlZCkgeworCQlzc19oY2QgPSB1c2JfY3JlYXRlX3NoYXJlZF9oY2QoJmR1bW15X2hjZCwgJnBkZXYtPmRldiwKKwkJCQkJZGV2X25hbWUoJnBkZXYtPmRldiksIGhzX2hjZCk7CisJCWlmICghc3NfaGNkKSB7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJZ290byBkZWFsbG9jX3VzYjJfaGNkOworCQl9CisKKwkJcmV0dmFsID0gdXNiX2FkZF9oY2Qoc3NfaGNkLCAwLCAwKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gcHV0X3VzYjNfaGNkOworCX0KKwlyZXR1cm4gMDsKKworcHV0X3VzYjNfaGNkOgorCXVzYl9wdXRfaGNkKHNzX2hjZCk7CitkZWFsbG9jX3VzYjJfaGNkOgorCXVzYl9wdXRfaGNkKGhzX2hjZCk7CisJdGhlX2NvbnRyb2xsZXIuaHNfaGNkID0gdGhlX2NvbnRyb2xsZXIuc3NfaGNkID0gTlVMTDsKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IGR1bW15X2hjZF9yZW1vdmUgKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGR1bW15X2hjZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgdXNiX2hjZAkJKmhjZDsKKwlzdHJ1Y3QgZHVtbXkJCSpkdW07CiAKLQloY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSAocGRldik7Ci0JdXNiX3JlbW92ZV9oY2QgKGhjZCk7Ci0JdXNiX3B1dF9oY2QgKGhjZCk7Ci0JdGhlX2NvbnRyb2xsZXIgPSBOVUxMOworCWR1bSA9IChoY2RfdG9fZHVtbXlfaGNkKHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKSktPmR1bTsKKworCWlmIChkdW0tPnNzX2hjZCkgeworCQl1c2JfcmVtb3ZlX2hjZChkdW1teV9oY2RfdG9faGNkKGR1bS0+c3NfaGNkKSk7CisJCXVzYl9wdXRfaGNkKGR1bW15X2hjZF90b19oY2QoZHVtLT5zc19oY2QpKTsKKwl9CisKKwl1c2JfcmVtb3ZlX2hjZChkdW1teV9oY2RfdG9faGNkKGR1bS0+aHNfaGNkKSk7CisJdXNiX3B1dF9oY2QoZHVtbXlfaGNkX3RvX2hjZChkdW0tPmhzX2hjZCkpOworCisJdGhlX2NvbnRyb2xsZXIuaHNfaGNkID0gTlVMTDsKKwl0aGVfY29udHJvbGxlci5zc19oY2QgPSBOVUxMOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZHVtbXlfaGNkX3N1c3BlbmQgKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgdXNiX2hjZAkJKmhjZDsKLQlzdHJ1Y3QgZHVtbXkJCSpkdW07CisJc3RydWN0IGR1bW15X2hjZAkqZHVtX2hjZDsKIAlpbnQJCQlyYyA9IDA7CiAKIAlkZXZfZGJnICgmcGRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAogCWhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhIChwZGV2KTsKLQlkdW0gPSBoY2RfdG9fZHVtbXkgKGhjZCk7Ci0JaWYgKGR1bS0+cmhfc3RhdGUgPT0gRFVNTVlfUkhfUlVOTklORykgeworCWR1bV9oY2QgPSBoY2RfdG9fZHVtbXlfaGNkKGhjZCk7CisJaWYgKGR1bV9oY2QtPnJoX3N0YXRlID09IERVTU1ZX1JIX1JVTk5JTkcpIHsKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIlJvb3QgaHViIGlzbid0IHN1c3BlbmRlZCFcbiIpOwogCQlyYyA9IC1FQlVTWTsKIAl9IGVsc2UKQEAgLTE5NzksNiArMjQwMiw5IEBACiAJaWYgKHVzYl9kaXNhYmxlZCAoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoIW1vZF9kYXRhLmlzX2hpZ2hfc3BlZWQgJiYgbW9kX2RhdGEuaXNfc3VwZXJfc3BlZWQpCisJCXJldHVybiAtRUlOVkFMOworCiAJdGhlX2hjZF9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKGRyaXZlcl9uYW1lLCAtMSk7CiAJaWYgKCF0aGVfaGNkX3BkZXYpCiAJCXJldHVybiByZXR2YWw7CkBAIC0xOTk2LDcgKzI0MjIsOCBAQAogCXJldHZhbCA9IHBsYXRmb3JtX2RldmljZV9hZGQodGhlX2hjZF9wZGV2KTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBlcnJfYWRkX2hjZDsKLQlpZiAoIXRoZV9jb250cm9sbGVyKSB7CisJaWYgKCF0aGVfY29udHJvbGxlci5oc19oY2QgfHwKKwkgICAgKCF0aGVfY29udHJvbGxlci5zc19oY2QgJiYgbW9kX2RhdGEuaXNfc3VwZXJfc3BlZWQpKSB7CiAJCS8qCiAJCSAqIFRoZSBoY2Qgd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseSBidXQgaXRzIHByb2JlIGZ1bmN0aW9uIGZhaWxlZAogCQkgKiBmb3Igc29tZSByZWFzb24uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXBhdXRvY29uZi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYwppbmRleCA5YjczNjBmLi43YTdlNmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXBhdXRvY29uZi5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9lcGF1dG9jb25mLmMKQEAgLTYzLDEzICs2MywxNiBAQAogZXBfbWF0Y2hlcyAoCiAJc3RydWN0IHVzYl9nYWRnZXQJCSpnYWRnZXQsCiAJc3RydWN0IHVzYl9lcAkJCSplcCwKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmRlc2MKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmRlc2MsCisJc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgKmVwX2NvbXAKICkKIHsKIAl1OAkJdHlwZTsKIAljb25zdCBjaGFyCSp0bXA7CiAJdTE2CQltYXg7CiAKKwlpbnQJCW51bV9yZXFfc3RyZWFtcyA9IDA7CisKIAkvKiBlbmRwb2ludCBhbHJlYWR5IGNsYWltZWQ/ICovCiAJaWYgKE5VTEwgIT0gZXAtPmRyaXZlcl9kYXRhKQogCQlyZXR1cm4gMDsKQEAgLTEyOSw2ICsxMzIsMjIgQEAKIAl9CiAKIAkvKgorCSAqIEdldCB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIHN0cmVhbXMgZnJvbSB0aGUgRVAgY29tcGFuaW9uCisJICogZGVzY3JpcHRvciBhbmQgc2VlIGlmIHRoZSBFUCBtYXRjaGVzIGl0CisJICovCisJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2J1bGsoZGVzYykpIHsKKwkJaWYgKGVwX2NvbXApIHsKKwkJCW51bV9yZXFfc3RyZWFtcyA9IGVwX2NvbXAtPmJtQXR0cmlidXRlcyAmIDB4MWY7CisJCQlpZiAobnVtX3JlcV9zdHJlYW1zID4gZXAtPm1heF9zdHJlYW1zKQorCQkJCXJldHVybiAwOworCQkJLyogVXBkYXRlIHRoZSBlcF9jb21wIGRlc2NyaXB0b3IgaWYgbmVlZGVkICovCisJCQlpZiAobnVtX3JlcV9zdHJlYW1zICE9IGVwLT5tYXhfc3RyZWFtcykKKwkJCQllcF9jb21wLT5ibUF0dHJpYnV0ZXMgPSBlcC0+bWF4X3N0cmVhbXM7CisJCX0KKworCX0KKworCS8qCiAJICogSWYgdGhlIHByb3RvY29sIGRyaXZlciBoYXNuJ3QgeWV0IGRlY2lkZWQgb24gd01heFBhY2tldFNpemUKIAkgKiBhbmQgd2FudHMgdG8ga25vdyB0aGUgbWF4aW11bSBwb3NzaWJsZSwgcHJvdmlkZSB0aGUgaW5mby4KIAkgKi8KQEAgLTE0MiwxMyArMTYxLDEzIEBACiAJbWF4ID0gMHg3ZmYgJiBsZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSk7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ6Ci0JCS8qIElOVDogIGxpbWl0IDY0IGJ5dGVzIGZ1bGwgc3BlZWQsIDEwMjQgaGlnaCBzcGVlZCAqLworCQkvKiBJTlQ6ICBsaW1pdCA2NCBieXRlcyBmdWxsIHNwZWVkLCAxMDI0IGhpZ2gvc3VwZXIgc3BlZWQgKi8KIAkJaWYgKCFnYWRnZXQtPmlzX2R1YWxzcGVlZCAmJiBtYXggPiA2NCkKIAkJCXJldHVybiAwOwogCQkvKiBGQUxMVEhST1VHSCAqLwogCiAJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DOgotCQkvKiBJU086ICBsaW1pdCAxMDIzIGJ5dGVzIGZ1bGwgc3BlZWQsIDEwMjQgaGlnaCBzcGVlZCAqLworCQkvKiBJU086ICBsaW1pdCAxMDIzIGJ5dGVzIGZ1bGwgc3BlZWQsIDEwMjQgaGlnaC9zdXBlciBzcGVlZCAqLwogCQlpZiAoZXAtPm1heHBhY2tldCA8IG1heCkKIAkJCXJldHVybiAwOwogCQlpZiAoIWdhZGdldC0+aXNfZHVhbHNwZWVkICYmIG1heCA+IDEwMjMpCkBAIC0xODMsNyArMjAyLDcgQEAKIAl9CiAKIAkvKiByZXBvcnQgKHZhcmlhYmxlKSBmdWxsIHNwZWVkIGJ1bGsgbWF4cGFja2V0ICovCi0JaWYgKFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsgPT0gdHlwZSkgeworCWlmICgoVVNCX0VORFBPSU5UX1hGRVJfQlVMSyA9PSB0eXBlKSAmJiAhZXBfY29tcCkgewogCQlpbnQgc2l6ZSA9IGVwLT5tYXhwYWNrZXQ7CiAKIAkJLyogbWluKCkgZG9lc24ndCB3b3JrIG9uIGJpdGZpZWxkcyB3aXRoIGdjYy0zLjUgKi8KQEAgLTE5MSw2ICsyMTAsNyBAQAogCQkJc2l6ZSA9IDY0OwogCQlkZXNjLT53TWF4UGFja2V0U2l6ZSA9IGNwdV90b19sZTE2KHNpemUpOwogCX0KKwllcC0+YWRkcmVzcyA9IGRlc2MtPmJFbmRwb2ludEFkZHJlc3M7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTIwNyw3ICsyMjcsMTIwIEBACiB9CiAKIC8qKgotICogdXNiX2VwX2F1dG9jb25maWcgLSBjaG9vc2UgYW4gZW5kcG9pbnQgbWF0Y2hpbmcgdGhlIGRlc2NyaXB0b3IKKyAqIHVzYl9lcF9hdXRvY29uZmlnX3NzKCkgLSBjaG9vc2UgYW4gZW5kcG9pbnQgbWF0Y2hpbmcgdGhlIGVwCisgKiBkZXNjcmlwdG9yIGFuZCBlcCBjb21wYW5pb24gZGVzY3JpcHRvcgorICogQGdhZGdldDogVGhlIGRldmljZSB0byB3aGljaCB0aGUgZW5kcG9pbnQgbXVzdCBiZWxvbmcuCisgKiBAZGVzYzogRW5kcG9pbnQgZGVzY3JpcHRvciwgd2l0aCBlbmRwb2ludCBkaXJlY3Rpb24gYW5kIHRyYW5zZmVyIG1vZGUKKyAqICAgIGluaXRpYWxpemVkLiAgRm9yIHBlcmlvZGljIHRyYW5zZmVycywgdGhlIG1heGltdW0gcGFja2V0CisgKiAgICBzaXplIG11c3QgYWxzbyBiZSBpbml0aWFsaXplZC4gIFRoaXMgaXMgbW9kaWZpZWQgb24KKyAqICAgIHN1Y2Nlc3MuCisgKiBAZXBfY29tcDogRW5kcG9pbnQgY29tcGFuaW9uIGRlc2NyaXB0b3IsIHdpdGggdGhlIHJlcXVpcmVkCisgKiAgICBudW1iZXIgb2Ygc3RyZWFtcy4gV2lsbCBiZSBtb2RpZmllZCB3aGVuIHRoZSBjaG9zZW4gRVAKKyAqICAgIHN1cHBvcnRzIGEgZGlmZmVyZW50IG51bWJlciBvZiBzdHJlYW1zLgorICoKKyAqIFRoaXMgcm91dGluZSByZXBsYWNlcyB0aGUgdXNiX2VwX2F1dG9jb25maWcgd2hlbiBuZWVkZWQKKyAqIHN1cGVyc3BlZWQgZW5oYW5jbWVudHMuIElmIHN1Y2ggZW5oYW5jZW1uZXRzIGFyZSByZXF1aXJlZCwKKyAqIHRoZSBGRCBzaG91bGQgY2FsbCB1c2JfZXBfYXV0b2NvbmZpZ19zcyBkaXJlY3RseSBhbmQgcHJvdmlkZQorICogdGhlIGFkZGl0aW9uYWwgZXBfY29tcCBwYXJhbWV0ZXIuCisgKgorICogQnkgY2hvb3NpbmcgYW4gZW5kcG9pbnQgdG8gdXNlIHdpdGggdGhlIHNwZWNpZmllZCBkZXNjcmlwdG9yLAorICogdGhpcyByb3V0aW5lIHNpbXBsaWZpZXMgd3JpdGluZyBnYWRnZXQgZHJpdmVycyB0aGF0IHdvcmsgd2l0aAorICogbXVsdGlwbGUgVVNCIGRldmljZSBjb250cm9sbGVycy4gIFRoZSBlbmRwb2ludCB3b3VsZCBiZQorICogcGFzc2VkIGxhdGVyIHRvIHVzYl9lcF9lbmFibGUoKSwgYWxvbmcgd2l0aCBzb21lIGRlc2NyaXB0b3IuCisgKgorICogVGhhdCBzZWNvbmQgZGVzY3JpcHRvciB3b24ndCBhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IG9uZS4KKyAqIEZvciBleGFtcGxlLCBpc29jaHJvbm91cyBlbmRwb2ludHMgY2FuIGJlIGF1dG9jb25maWd1cmVkIGZvciBoaWdoCisgKiBiYW5kd2lkdGgsIGFuZCB0aGVuIHVzZWQgaW4gc2V2ZXJhbCBsb3dlciBiYW5kd2lkdGggYWx0c2V0dGluZ3MuCisgKiBBbHNvLCBoaWdoIGFuZCBmdWxsIHNwZWVkIGRlc2NyaXB0b3JzIHdpbGwgYmUgZGlmZmVyZW50LgorICoKKyAqIEJlIHN1cmUgdG8gZXhhbWluZSBhbmQgdGVzdCB0aGUgcmVzdWx0cyBvZiBhdXRvY29uZmlndXJhdGlvbgorICogb24geW91ciBoYXJkd2FyZS4gIFRoaXMgY29kZSBtYXkgbm90IG1ha2UgdGhlIGJlc3QgY2hvaWNlcworICogYWJvdXQgaG93IHRvIHVzZSB0aGUgVVNCIGNvbnRyb2xsZXIsIGFuZCBpdCBjYW4ndCBrbm93IGFsbAorICogdGhlIHJlc3RyaWN0aW9ucyB0aGF0IG1heSBhcHBseS4gU29tZSBjb21iaW5hdGlvbnMgb2YgZHJpdmVyCisgKiBhbmQgaGFyZHdhcmUgd29uJ3QgYmUgYWJsZSB0byBhdXRvY29uZmlndXJlLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHRoaXMgcmV0dXJucyBhbiB1bi1jbGFpbWVkIHVzYl9lcCwgYW5kIG1vZGlmaWVzIHRoZSBlbmRwb2ludAorICogZGVzY3JpcHRvciBiRW5kcG9pbnRBZGRyZXNzLiAgRm9yIGJ1bGsgZW5kcG9pbnRzLCB0aGUgd01heFBhY2tldCB2YWx1ZQorICogaXMgaW5pdGlhbGl6ZWQgYXMgaWYgdGhlIGVuZHBvaW50IHdlcmUgdXNlZCBhdCBmdWxsIHNwZWVkIGFuZAorICogdGhlIGJtQXR0cmlidXRlIGZpZWxkIGluIHRoZSBlcCBjb21wYW5pb24gZGVzY3JpcHRvciBpcworICogdXBkYXRlZCB3aXRoIHRoZSBhc3NpZ25lZCBudW1iZXIgb2Ygc3RyZWFtcyBpZiBpdCBpcworICogZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHZhbHVlLiBUbyBwcmV2ZW50IHRoZSBlbmRwb2ludAorICogZnJvbSBiZWluZyByZXR1cm5lZCBieSBhIGxhdGVyIGF1dG9jb25maWcgY2FsbCwgY2xhaW0gaXQgYnkKKyAqIGFzc2lnbmluZyBlcC0+ZHJpdmVyX2RhdGEgdG8gc29tZSBub24tbnVsbCB2YWx1ZS4KKyAqCisgKiBPbiBmYWlsdXJlLCB0aGlzIHJldHVybnMgYSBudWxsIGVuZHBvaW50IGRlc2NyaXB0b3IuCisgKi8KK3N0cnVjdCB1c2JfZXAgKnVzYl9lcF9hdXRvY29uZmlnX3NzKAorCXN0cnVjdCB1c2JfZ2FkZ2V0CQkqZ2FkZ2V0LAorCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgkqZGVzYywKKwlzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciAqZXBfY29tcAorKQoreworCXN0cnVjdCB1c2JfZXAJKmVwOworCXU4CQl0eXBlOworCisJdHlwZSA9IGRlc2MtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLOworCisJLyogRmlyc3QsIGFwcGx5IGNoaXAtc3BlY2lmaWMgImJlc3QgdXNhZ2UiIGtub3dsZWRnZS4KKwkgKiBUaGlzIG1pZ2h0IG1ha2UgYSBnb29kIHVzYl9nYWRnZXRfb3BzIGhvb2sgLi4uCisJICovCisJaWYgKGdhZGdldF9pc19uZXQyMjgwIChnYWRnZXQpICYmIHR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSB7CisJCS8qIGVwLWUsIGVwLWYgYXJlIFBJTyB3aXRoIG9ubHkgNjQgYnl0ZSBmaWZvcyAqLworCQllcCA9IGZpbmRfZXAgKGdhZGdldCwgImVwLWUiKTsKKwkJaWYgKGVwICYmIGVwX21hdGNoZXMoZ2FkZ2V0LCBlcCwgZGVzYywgZXBfY29tcCkpCisJCQlyZXR1cm4gZXA7CisJCWVwID0gZmluZF9lcCAoZ2FkZ2V0LCAiZXAtZiIpOworCQlpZiAoZXAgJiYgZXBfbWF0Y2hlcyhnYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKworCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX2dva3UgKGdhZGdldCkpIHsKKwkJaWYgKFVTQl9FTkRQT0lOVF9YRkVSX0lOVCA9PSB0eXBlKSB7CisJCQkvKiBzaW5nbGUgYnVmZmVyaW5nIGlzIGVub3VnaCAqLworCQkJZXAgPSBmaW5kX2VwKGdhZGdldCwgImVwMy1idWxrIik7CisJCQlpZiAoZXAgJiYgZXBfbWF0Y2hlcyhnYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCQlyZXR1cm4gZXA7CisJCX0gZWxzZSBpZiAoVVNCX0VORFBPSU5UX1hGRVJfQlVMSyA9PSB0eXBlCisJCQkJJiYgKFVTQl9ESVJfSU4gJiBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzKSkgeworCQkJLyogRE1BIG1heSBiZSBhdmFpbGFibGUgKi8KKwkJCWVwID0gZmluZF9lcChnYWRnZXQsICJlcDItYnVsayIpOworCQkJaWYgKGVwICYmIGVwX21hdGNoZXMoZ2FkZ2V0LCBlcCwgZGVzYywKKwkJCQkJICAgICAgZXBfY29tcCkpCisJCQkJcmV0dXJuIGVwOworCQl9CisKKyNpZmRlZiBDT05GSUdfQkxBQ0tGSU4KKwl9IGVsc2UgaWYgKGdhZGdldF9pc19tdXNiaGRyYyhnYWRnZXQpKSB7CisJCWlmICgoVVNCX0VORFBPSU5UX1hGRVJfQlVMSyA9PSB0eXBlKSB8fAorCQkgICAgKFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MgPT0gdHlwZSkpIHsKKwkJCWlmIChVU0JfRElSX0lOICYgZGVzYy0+YkVuZHBvaW50QWRkcmVzcykKKwkJCQllcCA9IGZpbmRfZXAgKGdhZGdldCwgImVwNWluIik7CisJCQllbHNlCisJCQkJZXAgPSBmaW5kX2VwIChnYWRnZXQsICJlcDZvdXQiKTsKKwkJfSBlbHNlIGlmIChVU0JfRU5EUE9JTlRfWEZFUl9JTlQgPT0gdHlwZSkgeworCQkJaWYgKFVTQl9ESVJfSU4gJiBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzKQorCQkJCWVwID0gZmluZF9lcChnYWRnZXQsICJlcDFpbiIpOworCQkJZWxzZQorCQkJCWVwID0gZmluZF9lcChnYWRnZXQsICJlcDJvdXQiKTsKKwkJfSBlbHNlCisJCQllcCA9IE5VTEw7CisJCWlmIChlcCAmJiBlcF9tYXRjaGVzKGdhZGdldCwgZXAsIGRlc2MsIGVwX2NvbXApKQorCQkJcmV0dXJuIGVwOworI2VuZGlmCisJfQorCisJLyogU2Vjb25kLCBsb29rIGF0IGVuZHBvaW50cyB1bnRpbCBhbiB1bmNsYWltZWQgb25lIGxvb2tzIHVzYWJsZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKGVwLCAmZ2FkZ2V0LT5lcF9saXN0LCBlcF9saXN0KSB7CisJCWlmIChlcF9tYXRjaGVzKGdhZGdldCwgZXAsIGRlc2MsIGVwX2NvbXApKQorCQkJcmV0dXJuIGVwOworCX0KKworCS8qIEZhaWwgKi8KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiB1c2JfZXBfYXV0b2NvbmZpZygpIC0gY2hvb3NlIGFuIGVuZHBvaW50IG1hdGNoaW5nIHRoZQorICogZGVzY3JpcHRvcgogICogQGdhZGdldDogVGhlIGRldmljZSB0byB3aGljaCB0aGUgZW5kcG9pbnQgbXVzdCBiZWxvbmcuCiAgKiBAZGVzYzogRW5kcG9pbnQgZGVzY3JpcHRvciwgd2l0aCBlbmRwb2ludCBkaXJlY3Rpb24gYW5kIHRyYW5zZmVyIG1vZGUKICAqCWluaXRpYWxpemVkLiAgRm9yIHBlcmlvZGljIHRyYW5zZmVycywgdGhlIG1heGltdW0gcGFja2V0CkBAIC0yMzYsNzIgKzM2OSwxNSBAQAogICoKICAqIE9uIGZhaWx1cmUsIHRoaXMgcmV0dXJucyBhIG51bGwgZW5kcG9pbnQgZGVzY3JpcHRvci4KICAqLwotc3RydWN0IHVzYl9lcCAqdXNiX2VwX2F1dG9jb25maWcgKAorc3RydWN0IHVzYl9lcCAqdXNiX2VwX2F1dG9jb25maWcoCiAJc3RydWN0IHVzYl9nYWRnZXQJCSpnYWRnZXQsCiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpkZXNjCiApCiB7Ci0Jc3RydWN0IHVzYl9lcAkqZXA7Ci0JdTgJCXR5cGU7Ci0KLQl0eXBlID0gZGVzYy0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0s7Ci0KLQkvKiBGaXJzdCwgYXBwbHkgY2hpcC1zcGVjaWZpYyAiYmVzdCB1c2FnZSIga25vd2xlZGdlLgotCSAqIFRoaXMgbWlnaHQgbWFrZSBhIGdvb2QgdXNiX2dhZGdldF9vcHMgaG9vayAuLi4KLQkgKi8KLQlpZiAoZ2FkZ2V0X2lzX25ldDIyODAgKGdhZGdldCkgJiYgdHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpIHsKLQkJLyogZXAtZSwgZXAtZiBhcmUgUElPIHdpdGggb25seSA2NCBieXRlIGZpZm9zICovCi0JCWVwID0gZmluZF9lcCAoZ2FkZ2V0LCAiZXAtZSIpOwotCQlpZiAoZXAgJiYgZXBfbWF0Y2hlcyAoZ2FkZ2V0LCBlcCwgZGVzYykpCi0JCQlyZXR1cm4gZXA7Ci0JCWVwID0gZmluZF9lcCAoZ2FkZ2V0LCAiZXAtZiIpOwotCQlpZiAoZXAgJiYgZXBfbWF0Y2hlcyAoZ2FkZ2V0LCBlcCwgZGVzYykpCi0JCQlyZXR1cm4gZXA7Ci0KLQl9IGVsc2UgaWYgKGdhZGdldF9pc19nb2t1IChnYWRnZXQpKSB7Ci0JCWlmIChVU0JfRU5EUE9JTlRfWEZFUl9JTlQgPT0gdHlwZSkgewotCQkJLyogc2luZ2xlIGJ1ZmZlcmluZyBpcyBlbm91Z2ggKi8KLQkJCWVwID0gZmluZF9lcCAoZ2FkZ2V0LCAiZXAzLWJ1bGsiKTsKLQkJCWlmIChlcCAmJiBlcF9tYXRjaGVzIChnYWRnZXQsIGVwLCBkZXNjKSkKLQkJCQlyZXR1cm4gZXA7Ci0JCX0gZWxzZSBpZiAoVVNCX0VORFBPSU5UX1hGRVJfQlVMSyA9PSB0eXBlCi0JCQkJJiYgKFVTQl9ESVJfSU4gJiBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzKSkgewotCQkJLyogRE1BIG1heSBiZSBhdmFpbGFibGUgKi8KLQkJCWVwID0gZmluZF9lcCAoZ2FkZ2V0LCAiZXAyLWJ1bGsiKTsKLQkJCWlmIChlcCAmJiBlcF9tYXRjaGVzIChnYWRnZXQsIGVwLCBkZXNjKSkKLQkJCQlyZXR1cm4gZXA7Ci0JCX0KLQotI2lmZGVmIENPTkZJR19CTEFDS0ZJTgotCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX211c2JoZHJjKGdhZGdldCkpIHsKLQkJaWYgKChVU0JfRU5EUE9JTlRfWEZFUl9CVUxLID09IHR5cGUpIHx8Ci0JCSAgICAoVVNCX0VORFBPSU5UX1hGRVJfSVNPQyA9PSB0eXBlKSkgewotCQkJaWYgKFVTQl9ESVJfSU4gJiBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzKQotCQkJCWVwID0gZmluZF9lcCAoZ2FkZ2V0LCAiZXA1aW4iKTsKLQkJCWVsc2UKLQkJCQllcCA9IGZpbmRfZXAgKGdhZGdldCwgImVwNm91dCIpOwotCQl9IGVsc2UgaWYgKFVTQl9FTkRQT0lOVF9YRkVSX0lOVCA9PSB0eXBlKSB7Ci0JCQlpZiAoVVNCX0RJUl9JTiAmIGRlc2MtPmJFbmRwb2ludEFkZHJlc3MpCi0JCQkJZXAgPSBmaW5kX2VwKGdhZGdldCwgImVwMWluIik7Ci0JCQllbHNlCi0JCQkJZXAgPSBmaW5kX2VwKGdhZGdldCwgImVwMm91dCIpOwotCQl9IGVsc2UKLQkJCWVwID0gTlVMTDsKLQkJaWYgKGVwICYmIGVwX21hdGNoZXMgKGdhZGdldCwgZXAsIGRlc2MpKQotCQkJcmV0dXJuIGVwOwotI2VuZGlmCi0JfQotCi0JLyogU2Vjb25kLCBsb29rIGF0IGVuZHBvaW50cyB1bnRpbCBhbiB1bmNsYWltZWQgb25lIGxvb2tzIHVzYWJsZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkgKGVwLCAmZ2FkZ2V0LT5lcF9saXN0LCBlcF9saXN0KSB7Ci0JCWlmIChlcF9tYXRjaGVzIChnYWRnZXQsIGVwLCBkZXNjKSkKLQkJCXJldHVybiBlcDsKLQl9Ci0KLQkvKiBGYWlsICovCi0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHVzYl9lcF9hdXRvY29uZmlnX3NzKGdhZGdldCwgZGVzYywgTlVMTCk7CiB9CiAKKwogLyoqCiAgKiB1c2JfZXBfYXV0b2NvbmZpZ19yZXNldCAtIHJlc2V0IGVuZHBvaW50IGF1dG9jb25maWcgc3RhdGUKICAqIEBnYWRnZXQ6IGRldmljZSBmb3Igd2hpY2ggYXV0b2NvbmZpZyBzdGF0ZSB3aWxsIGJlIHJlc2V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCmluZGV4IDE2OTBjOWQuLmFhZmM4NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCkBAIC00MDEsNiArNDAxLDcgQEAKIAkubmFtZQkJPSAiZ19ldGhlciIsCiAJLmRldgkJPSAmZGV2aWNlX2Rlc2MsCiAJLnN0cmluZ3MJPSBkZXZfc3RyaW5ncywKKwkubWF4X3NwZWVkCT0gVVNCX1NQRUVEX1NVUEVSLAogCS51bmJpbmQJCT0gX19leGl0X3AoZXRoX3VuYmluZCksCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9hY20uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2FjbS5jCmluZGV4IGJkNjIyNmMuLjNmODg0OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2FjbS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2FjbS5jCkBAIC0zOSwxMiArMzksNiBAQAogICogZGVzY3JpcHRvcnMgKHJvdWdobHkgZXF1aXZhbGVudCB0byBDREMgVW5pb25zKSBtYXkgc29tZXRpbWVzIGhlbHAuCiAgKi8KIAotc3RydWN0IGFjbV9lcF9kZXNjcyB7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSppbjsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm91dDsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm5vdGlmeTsKLX07Ci0KIHN0cnVjdCBmX2FjbSB7CiAJc3RydWN0IGdzZXJpYWwJCQlwb3J0OwogCXU4CQkJCWN0cmxfaWQsIGRhdGFfaWQ7CkBAIC01OCwxMSArNTIsNyBAQAogCSAqLwogCXNwaW5sb2NrX3QJCQlsb2NrOwogCi0Jc3RydWN0IGFjbV9lcF9kZXNjcwkJZnM7Ci0Jc3RydWN0IGFjbV9lcF9kZXNjcwkJaHM7Ci0KIAlzdHJ1Y3QgdXNiX2VwCQkJKm5vdGlmeTsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm5vdGlmeV9kZXNjOwogCXN0cnVjdCB1c2JfcmVxdWVzdAkJKm5vdGlmeV9yZXE7CiAKIAlzdHJ1Y3QgdXNiX2NkY19saW5lX2NvZGluZwlwb3J0X2xpbmVfY29kaW5nOwkvKiA4LU4tMSBldGMgKi8KQEAgLTQwNSwyMyArMzk1LDI3IEBACiAJCQl1c2JfZXBfZGlzYWJsZShhY20tPm5vdGlmeSk7CiAJCX0gZWxzZSB7CiAJCQlWREJHKGNkZXYsICJpbml0IGFjbSBjdHJsIGludGVyZmFjZSAlZFxuIiwgaW50Zik7Ci0JCQlhY20tPm5vdGlmeV9kZXNjID0gZXBfY2hvb3NlKGNkZXYtPmdhZGdldCwKLQkJCQkJYWNtLT5ocy5ub3RpZnksCi0JCQkJCWFjbS0+ZnMubm90aWZ5KTsKKwkJCWlmIChjb25maWdfZXBfYnlfc3BlZWQoY2Rldi0+Z2FkZ2V0LCBmLCBhY20tPm5vdGlmeSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJdXNiX2VwX2VuYWJsZShhY20tPm5vdGlmeSwgYWNtLT5ub3RpZnlfZGVzYyk7CisJCXVzYl9lcF9lbmFibGUoYWNtLT5ub3RpZnkpOwogCQlhY20tPm5vdGlmeS0+ZHJpdmVyX2RhdGEgPSBhY207CiAKIAl9IGVsc2UgaWYgKGludGYgPT0gYWNtLT5kYXRhX2lkKSB7CiAJCWlmIChhY20tPnBvcnQuaW4tPmRyaXZlcl9kYXRhKSB7CiAJCQlEQkcoY2RldiwgInJlc2V0IGFjbSB0dHlHUyVkXG4iLCBhY20tPnBvcnRfbnVtKTsKIAkJCWdzZXJpYWxfZGlzY29ubmVjdCgmYWNtLT5wb3J0KTsKLQkJfSBlbHNlIHsKKwkJfQorCQlpZiAoIWFjbS0+cG9ydC5pbi0+ZGVzYyB8fCAhYWNtLT5wb3J0Lm91dC0+ZGVzYykgewogCQkJREJHKGNkZXYsICJhY3RpdmF0ZSBhY20gdHR5R1MlZFxuIiwgYWNtLT5wb3J0X251bSk7Ci0JCQlhY20tPnBvcnQuaW5fZGVzYyA9IGVwX2Nob29zZShjZGV2LT5nYWRnZXQsCi0JCQkJCWFjbS0+aHMuaW4sIGFjbS0+ZnMuaW4pOwotCQkJYWNtLT5wb3J0Lm91dF9kZXNjID0gZXBfY2hvb3NlKGNkZXYtPmdhZGdldCwKLQkJCQkJYWNtLT5ocy5vdXQsIGFjbS0+ZnMub3V0KTsKKwkJCWlmIChjb25maWdfZXBfYnlfc3BlZWQoY2Rldi0+Z2FkZ2V0LCBmLAorCQkJCQkgICAgICAgYWNtLT5wb3J0LmluKSB8fAorCQkJICAgIGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsIGYsCisJCQkJCSAgICAgICBhY20tPnBvcnQub3V0KSkgeworCQkJCWFjbS0+cG9ydC5pbi0+ZGVzYyA9IE5VTEw7CisJCQkJYWNtLT5wb3J0Lm91dC0+ZGVzYyA9IE5VTEw7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CiAJCX0KIAkJZ3NlcmlhbF9jb25uZWN0KCZhY20tPnBvcnQsIGFjbS0+cG9ydF9udW0pOwogCkBAIC02MjksMTggKzYyMywxMSBAQAogCWFjbS0+bm90aWZ5X3JlcS0+Y29tcGxldGUgPSBhY21fY2RjX25vdGlmeV9jb21wbGV0ZTsKIAlhY20tPm5vdGlmeV9yZXEtPmNvbnRleHQgPSBhY207CiAKLQkvKiBjb3B5IGRlc2NyaXB0b3JzLCBhbmQgdHJhY2sgZW5kcG9pbnQgY29waWVzICovCisJLyogY29weSBkZXNjcmlwdG9ycyAqLwogCWYtPmRlc2NyaXB0b3JzID0gdXNiX2NvcHlfZGVzY3JpcHRvcnMoYWNtX2ZzX2Z1bmN0aW9uKTsKIAlpZiAoIWYtPmRlc2NyaXB0b3JzKQogCQlnb3RvIGZhaWw7CiAKLQlhY20tPmZzLmluID0gdXNiX2ZpbmRfZW5kcG9pbnQoYWNtX2ZzX2Z1bmN0aW9uLAotCQkJZi0+ZGVzY3JpcHRvcnMsICZhY21fZnNfaW5fZGVzYyk7Ci0JYWNtLT5mcy5vdXQgPSB1c2JfZmluZF9lbmRwb2ludChhY21fZnNfZnVuY3Rpb24sCi0JCQlmLT5kZXNjcmlwdG9ycywgJmFjbV9mc19vdXRfZGVzYyk7Ci0JYWNtLT5mcy5ub3RpZnkgPSB1c2JfZmluZF9lbmRwb2ludChhY21fZnNfZnVuY3Rpb24sCi0JCQlmLT5kZXNjcmlwdG9ycywgJmFjbV9mc19ub3RpZnlfZGVzYyk7Ci0KIAkvKiBzdXBwb3J0IGFsbCByZWxldmFudCBoYXJkd2FyZSBzcGVlZHMuLi4gd2UgZXhwZWN0IHRoYXQgd2hlbgogCSAqIGhhcmR3YXJlIGlzIGR1YWwgc3BlZWQsIGFsbCBidWxrLWNhcGFibGUgZW5kcG9pbnRzIHdvcmsgYXQKIAkgKiBib3RoIHNwZWVkcwpAQCAtNjUzLDE1ICs2NDAsOCBAQAogCQlhY21faHNfbm90aWZ5X2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CiAJCQkJYWNtX2ZzX25vdGlmeV9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CiAKLQkJLyogY29weSBkZXNjcmlwdG9ycywgYW5kIHRyYWNrIGVuZHBvaW50IGNvcGllcyAqLworCQkvKiBjb3B5IGRlc2NyaXB0b3JzICovCiAJCWYtPmhzX2Rlc2NyaXB0b3JzID0gdXNiX2NvcHlfZGVzY3JpcHRvcnMoYWNtX2hzX2Z1bmN0aW9uKTsKLQotCQlhY20tPmhzLmluID0gdXNiX2ZpbmRfZW5kcG9pbnQoYWNtX2hzX2Z1bmN0aW9uLAotCQkJCWYtPmhzX2Rlc2NyaXB0b3JzLCAmYWNtX2hzX2luX2Rlc2MpOwotCQlhY20tPmhzLm91dCA9IHVzYl9maW5kX2VuZHBvaW50KGFjbV9oc19mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJmFjbV9oc19vdXRfZGVzYyk7Ci0JCWFjbS0+aHMubm90aWZ5ID0gdXNiX2ZpbmRfZW5kcG9pbnQoYWNtX2hzX2Z1bmN0aW9uLAotCQkJCWYtPmhzX2Rlc2NyaXB0b3JzLCAmYWNtX2hzX25vdGlmeV9kZXNjKTsKIAl9CiAKIAlEQkcoY2RldiwgImFjbSB0dHlHUyVkOiAlcyBzcGVlZCBJTi8lcyBPVVQvJXMgTk9USUZZLyVzXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYXVkaW8uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2F1ZGlvLmMKaW5kZXggOGVlMzMwYS4uMDJhMDI3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYXVkaW8uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9hdWRpby5jCkBAIC0yNzksNyArMjc5LDYgQEAKIAogCS8qIGVuZHBvaW50cyBoYW5kbGUgZnVsbCBhbmQvb3IgaGlnaCBzcGVlZHMgKi8KIAlzdHJ1Y3QgdXNiX2VwCQkJKm91dF9lcDsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm91dF9kZXNjOwogCiAJc3BpbmxvY2tfdAkJCWxvY2s7CiAJc3RydWN0IGZfYXVkaW9fYnVmICpjb3B5X2J1ZjsKQEAgLTU3NSw3ICs1NzQsNyBAQAogCiAJaWYgKGludGYgPT0gMSkgewogCQlpZiAoYWx0ID09IDEpIHsKLQkJCXVzYl9lcF9lbmFibGUob3V0X2VwLCBhdWRpby0+b3V0X2Rlc2MpOworCQkJdXNiX2VwX2VuYWJsZShvdXRfZXApOwogCQkJb3V0X2VwLT5kcml2ZXJfZGF0YSA9IGF1ZGlvOwogCQkJYXVkaW8tPmNvcHlfYnVmID0gZl9hdWRpb19idWZmZXJfYWxsb2MoYXVkaW9fYnVmX3NpemUpOwogCQkJaWYgKElTX0VSUihhdWRpby0+Y29weV9idWYpKQpAQCAtNjc3LDYgKzY3Niw3IEBACiAJaWYgKCFlcCkKIAkJZ290byBmYWlsOwogCWF1ZGlvLT5vdXRfZXAgPSBlcDsKKwlhdWRpby0+b3V0X2VwLT5kZXNjID0gJmFzX291dF9lcF9kZXNjOwogCWVwLT5kcml2ZXJfZGF0YSA9IGNkZXY7CS8qIGNsYWltICovCiAKIAlzdGF0dXMgPSAtRU5PTUVNOwpAQCAtNzc2LDcgKzc3Niw2IEBACiAJYXVkaW8tPmNhcmQuZnVuYy5zZXRfYWx0ID0gZl9hdWRpb19zZXRfYWx0OwogCWF1ZGlvLT5jYXJkLmZ1bmMuc2V0dXAgPSBmX2F1ZGlvX3NldHVwOwogCWF1ZGlvLT5jYXJkLmZ1bmMuZGlzYWJsZSA9IGZfYXVkaW9fZGlzYWJsZTsKLQlhdWRpby0+b3V0X2Rlc2MgPSAmYXNfb3V0X2VwX2Rlc2M7CiAKIAljb250cm9sX3NlbGVjdG9yX2luaXQoYXVkaW8pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9lY20uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2VjbS5jCmluZGV4IDU0NDI1N2EuLjM2OTFhMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2VjbS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2VjbS5jCkBAIC00NiwxMSArNDYsNiBAQAogICogYW5kIGFsc28gbWVhbnMgdGhhdCBhIGdldF9hbHQoKSBtZXRob2QgaXMgcmVxdWlyZWQuCiAgKi8KIAotc3RydWN0IGVjbV9lcF9kZXNjcyB7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSppbjsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm91dDsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm5vdGlmeTsKLX07CiAKIGVudW0gZWNtX25vdGlmeV9zdGF0ZSB7CiAJRUNNX05PVElGWV9OT05FLAkJLyogZG9uJ3Qgbm90aWZ5ICovCkBAIC02NCwxMSArNTksNyBAQAogCiAJY2hhcgkJCQlldGhhZGRyWzE0XTsKIAotCXN0cnVjdCBlY21fZXBfZGVzY3MJCWZzOwotCXN0cnVjdCBlY21fZXBfZGVzY3MJCWhzOwotCiAJc3RydWN0IHVzYl9lcAkJCSpub3RpZnk7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpub3RpZnlfZGVzYzsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJCSpub3RpZnlfcmVxOwogCXU4CQkJCW5vdGlmeV9zdGF0ZTsKIAlib29sCQkJCWlzX29wZW47CkBAIC04NiwxMCArNzcsMTIgQEAKIC8qIHBlYWsgKHRoZW9yZXRpY2FsKSBidWxrIHRyYW5zZmVyIHJhdGUgaW4gYml0cy1wZXItc2Vjb25kICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGVjbV9iaXRyYXRlKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnKQogewotCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGcpICYmIGctPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCWlmIChnYWRnZXRfaXNfc3VwZXJzcGVlZChnKSAmJiBnLT5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpCisJCXJldHVybiAxMyAqIDEwMjQgKiA4ICogMTAwMCAqIDg7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnKSAmJiBnLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKIAkJcmV0dXJuIDEzICogNTEyICogOCAqIDEwMDAgKiA4OwogCWVsc2UKLQkJcmV0dXJuIDE5ICogIDY0ICogMSAqIDEwMDAgKiA4OworCQlyZXR1cm4gMTkgKiA2NCAqIDEgKiAxMDAwICogODsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTIxOSw4ICsyMTIsMTAgQEAKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWNtX2hlYWRlcl9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fdW5pb25fZGVzYywKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWNtX2Rlc2MsCisKIAkvKiBOT1RFOiBzdGF0dXMgZW5kcG9pbnQgbWlnaHQgbmVlZCB0byBiZSByZW1vdmVkICovCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX2VjbV9ub3RpZnlfZGVzYywKKwogCS8qIGRhdGEgaW50ZXJmYWNlLCBhbHRzZXR0aW5ncyAwIGFuZCAxICovCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmVjbV9kYXRhX25vcF9pbnRmLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fZGF0YV9pbnRmLApAQCAtMjQwLDYgKzIzNSw3IEBACiAJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoRUNNX1NUQVRVU19CWVRFQ09VTlQpLAogCS5iSW50ZXJ2YWwgPQkJTE9HMl9TVEFUVVNfSU5URVJWQUxfTVNFQyArIDQsCiB9OworCiBzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGhzX2VjbV9pbl9kZXNjID0gewogCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAogCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCkBAIC0yNjQsOCArMjYwLDEwIEBACiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmVjbV9oZWFkZXJfZGVzYywKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWNtX3VuaW9uX2Rlc2MsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmVjbV9kZXNjLAorCiAJLyogTk9URTogc3RhdHVzIGVuZHBvaW50IG1pZ2h0IG5lZWQgdG8gYmUgcmVtb3ZlZCAqLwogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoc19lY21fbm90aWZ5X2Rlc2MsCisKIAkvKiBkYXRhIGludGVyZmFjZSwgYWx0c2V0dGluZ3MgMCBhbmQgMSAqLwogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fZGF0YV9ub3BfaW50ZiwKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWNtX2RhdGFfaW50ZiwKQEAgLTI3NCw2ICsyNzIsNzYgQEAKIAlOVUxMLAogfTsKIAorLyogc3VwZXIgc3BlZWQgc3VwcG9ydDogKi8KKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBzc19lY21fbm90aWZ5X2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS5iRW5kcG9pbnRBZGRyZXNzID0JVVNCX0RJUl9JTiwKKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKKwkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNihFQ01fU1RBVFVTX0JZVEVDT1VOVCksCisJLmJJbnRlcnZhbCA9CQlMT0cyX1NUQVRVU19JTlRFUlZBTF9NU0VDICsgNCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzc19lY21faW50cl9jb21wX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJc2l6ZW9mIHNzX2VjbV9pbnRyX2NvbXBfZGVzYywKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCisKKwkvKiB0aGUgZm9sbG93aW5nIDMgdmFsdWVzIGNhbiBiZSB0d2Vha2VkIGlmIG5lY2Vzc2FyeSAqLworCS8qIC5iTWF4QnVyc3QgPQkJMCwgKi8KKwkvKiAuYm1BdHRyaWJ1dGVzID0JMCwgKi8KKwkud0J5dGVzUGVySW50ZXJ2YWwgPQljcHVfdG9fbGUxNihFQ01fU1RBVFVTX0JZVEVDT1VOVCksCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIHNzX2VjbV9pbl9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDEwMjQpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBzc19lY21fb3V0X2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS5iRW5kcG9pbnRBZGRyZXNzID0JVVNCX0RJUl9PVVQsCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDEwMjQpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX2VjbV9idWxrX2NvbXBfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlzaXplb2Ygc3NfZWNtX2J1bGtfY29tcF9kZXNjLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCwKKworCS8qIHRoZSBmb2xsb3dpbmcgMiB2YWx1ZXMgY2FuIGJlIHR3ZWFrZWQgaWYgbmVjZXNzYXJ5ICovCisJLyogLmJNYXhCdXJzdCA9CQkwLCAqLworCS8qIC5ibUF0dHJpYnV0ZXMgPQkwLCAqLworfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmVjbV9zc19mdW5jdGlvbltdID0geworCS8qIENEQyBFQ00gY29udHJvbCBkZXNjcmlwdG9ycyAqLworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fY29udHJvbF9pbnRmLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21faGVhZGVyX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmVjbV91bmlvbl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fZGVzYywKKworCS8qIE5PVEU6IHN0YXR1cyBlbmRwb2ludCBtaWdodCBuZWVkIHRvIGJlIHJlbW92ZWQgKi8KKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfZWNtX25vdGlmeV9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19lY21faW50cl9jb21wX2Rlc2MsCisKKwkvKiBkYXRhIGludGVyZmFjZSwgYWx0c2V0dGluZ3MgMCBhbmQgMSAqLworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fZGF0YV9ub3BfaW50ZiwKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWNtX2RhdGFfaW50ZiwKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfZWNtX2luX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX2VjbV9idWxrX2NvbXBfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfZWNtX291dF9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19lY21fYnVsa19jb21wX2Rlc2MsCisJTlVMTCwKK307CisKIC8qIHN0cmluZyBkZXNjcmlwdG9yczogKi8KIAogc3RhdGljIHN0cnVjdCB1c2Jfc3RyaW5nIGVjbV9zdHJpbmdfZGVmc1tdID0gewpAQCAtNDY0LDEzICs1MzIsMTMgQEAKIAkJaWYgKGVjbS0+bm90aWZ5LT5kcml2ZXJfZGF0YSkgewogCQkJVkRCRyhjZGV2LCAicmVzZXQgZWNtIGNvbnRyb2wgJWRcbiIsIGludGYpOwogCQkJdXNiX2VwX2Rpc2FibGUoZWNtLT5ub3RpZnkpOwotCQl9IGVsc2UgewotCQkJVkRCRyhjZGV2LCAiaW5pdCBlY20gY3RybCAlZFxuIiwgaW50Zik7Ci0JCQllY20tPm5vdGlmeV9kZXNjID0gZXBfY2hvb3NlKGNkZXYtPmdhZGdldCwKLQkJCQkJZWNtLT5ocy5ub3RpZnksCi0JCQkJCWVjbS0+ZnMubm90aWZ5KTsKIAkJfQotCQl1c2JfZXBfZW5hYmxlKGVjbS0+bm90aWZ5LCBlY20tPm5vdGlmeV9kZXNjKTsKKwkJaWYgKCEoZWNtLT5ub3RpZnktPmRlc2MpKSB7CisJCQlWREJHKGNkZXYsICJpbml0IGVjbSBjdHJsICVkXG4iLCBpbnRmKTsKKwkJCWlmIChjb25maWdfZXBfYnlfc3BlZWQoY2Rldi0+Z2FkZ2V0LCBmLCBlY20tPm5vdGlmeSkpCisJCQkJZ290byBmYWlsOworCQl9CisJCXVzYl9lcF9lbmFibGUoZWNtLT5ub3RpZnkpOwogCQllY20tPm5vdGlmeS0+ZHJpdmVyX2RhdGEgPSBlY207CiAKIAkvKiBEYXRhIGludGVyZmFjZSBoYXMgdHdvIGFsdHNldHRpbmdzLCAwIGFuZCAxICovCkBAIC00ODMsMTIgKzU1MSwxNyBAQAogCQkJZ2V0aGVyX2Rpc2Nvbm5lY3QoJmVjbS0+cG9ydCk7CiAJCX0KIAotCQlpZiAoIWVjbS0+cG9ydC5pbikgeworCQlpZiAoIWVjbS0+cG9ydC5pbl9lcC0+ZGVzYyB8fAorCQkgICAgIWVjbS0+cG9ydC5vdXRfZXAtPmRlc2MpIHsKIAkJCURCRyhjZGV2LCAiaW5pdCBlY21cbiIpOwotCQkJZWNtLT5wb3J0LmluID0gZXBfY2hvb3NlKGNkZXYtPmdhZGdldCwKLQkJCQkJZWNtLT5ocy5pbiwgZWNtLT5mcy5pbik7Ci0JCQllY20tPnBvcnQub3V0ID0gZXBfY2hvb3NlKGNkZXYtPmdhZGdldCwKLQkJCQkJZWNtLT5ocy5vdXQsIGVjbS0+ZnMub3V0KTsKKwkJCWlmIChjb25maWdfZXBfYnlfc3BlZWQoY2Rldi0+Z2FkZ2V0LCBmLAorCQkJCQkgICAgICAgZWNtLT5wb3J0LmluX2VwKSB8fAorCQkJICAgIGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsIGYsCisJCQkJCSAgICAgICBlY20tPnBvcnQub3V0X2VwKSkgeworCQkJCWVjbS0+cG9ydC5pbl9lcC0+ZGVzYyA9IE5VTEw7CisJCQkJZWNtLT5wb3J0Lm91dF9lcC0+ZGVzYyA9IE5VTEw7CisJCQkJZ290byBmYWlsOworCQkJfQogCQl9CiAKIAkJLyogQ0RDIEV0aGVybmV0IG9ubHkgc2VuZHMgZGF0YSBpbiBub24tZGVmYXVsdCBhbHRzZXR0aW5ncy4KQEAgLTU0OSw3ICs2MjIsNyBAQAogCWlmIChlY20tPm5vdGlmeS0+ZHJpdmVyX2RhdGEpIHsKIAkJdXNiX2VwX2Rpc2FibGUoZWNtLT5ub3RpZnkpOwogCQllY20tPm5vdGlmeS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCQllY20tPm5vdGlmeV9kZXNjID0gTlVMTDsKKwkJZWNtLT5ub3RpZnktPmRlc2MgPSBOVUxMOwogCX0KIH0KIApAQCAtNjY1LDEzICs3MzgsNiBAQAogCWlmICghZi0+ZGVzY3JpcHRvcnMpCiAJCWdvdG8gZmFpbDsKIAotCWVjbS0+ZnMuaW4gPSB1c2JfZmluZF9lbmRwb2ludChlY21fZnNfZnVuY3Rpb24sCi0JCQlmLT5kZXNjcmlwdG9ycywgJmZzX2VjbV9pbl9kZXNjKTsKLQllY20tPmZzLm91dCA9IHVzYl9maW5kX2VuZHBvaW50KGVjbV9mc19mdW5jdGlvbiwKLQkJCWYtPmRlc2NyaXB0b3JzLCAmZnNfZWNtX291dF9kZXNjKTsKLQllY20tPmZzLm5vdGlmeSA9IHVzYl9maW5kX2VuZHBvaW50KGVjbV9mc19mdW5jdGlvbiwKLQkJCWYtPmRlc2NyaXB0b3JzLCAmZnNfZWNtX25vdGlmeV9kZXNjKTsKLQogCS8qIHN1cHBvcnQgYWxsIHJlbGV2YW50IGhhcmR3YXJlIHNwZWVkcy4uLiB3ZSBleHBlY3QgdGhhdCB3aGVuCiAJICogaGFyZHdhcmUgaXMgZHVhbCBzcGVlZCwgYWxsIGJ1bGstY2FwYWJsZSBlbmRwb2ludHMgd29yayBhdAogCSAqIGJvdGggc3BlZWRzCkBAIC02ODgsMTMgKzc1NCwyMCBAQAogCQlmLT5oc19kZXNjcmlwdG9ycyA9IHVzYl9jb3B5X2Rlc2NyaXB0b3JzKGVjbV9oc19mdW5jdGlvbik7CiAJCWlmICghZi0+aHNfZGVzY3JpcHRvcnMpCiAJCQlnb3RvIGZhaWw7CisJfQogCi0JCWVjbS0+aHMuaW4gPSB1c2JfZmluZF9lbmRwb2ludChlY21faHNfZnVuY3Rpb24sCi0JCQkJZi0+aHNfZGVzY3JpcHRvcnMsICZoc19lY21faW5fZGVzYyk7Ci0JCWVjbS0+aHMub3V0ID0gdXNiX2ZpbmRfZW5kcG9pbnQoZWNtX2hzX2Z1bmN0aW9uLAotCQkJCWYtPmhzX2Rlc2NyaXB0b3JzLCAmaHNfZWNtX291dF9kZXNjKTsKLQkJZWNtLT5ocy5ub3RpZnkgPSB1c2JfZmluZF9lbmRwb2ludChlY21faHNfZnVuY3Rpb24sCi0JCQkJZi0+aHNfZGVzY3JpcHRvcnMsICZoc19lY21fbm90aWZ5X2Rlc2MpOworCWlmIChnYWRnZXRfaXNfc3VwZXJzcGVlZChjLT5jZGV2LT5nYWRnZXQpKSB7CisJCXNzX2VjbV9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJCWZzX2VjbV9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCXNzX2VjbV9vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KKwkJCQlmc19lY21fb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJc3NfZWNtX25vdGlmeV9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJCWZzX2VjbV9ub3RpZnlfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCisJCS8qIGNvcHkgZGVzY3JpcHRvcnMsIGFuZCB0cmFjayBlbmRwb2ludCBjb3BpZXMgKi8KKwkJZi0+c3NfZGVzY3JpcHRvcnMgPSB1c2JfY29weV9kZXNjcmlwdG9ycyhlY21fc3NfZnVuY3Rpb24pOworCQlpZiAoIWYtPnNzX2Rlc2NyaXB0b3JzKQorCQkJZ290byBmYWlsOwogCX0KIAogCS8qIE5PVEU6ICBhbGwgdGhhdCBpcyBkb25lIHdpdGhvdXQga25vd2luZyBvciBjYXJpbmcgYWJvdXQKQEAgLTcwNiw2ICs3NzksNyBAQAogCWVjbS0+cG9ydC5jbG9zZSA9IGVjbV9jbG9zZTsKIAogCURCRyhjZGV2LCAiQ0RDIEV0aGVybmV0OiAlcyBzcGVlZCBJTi8lcyBPVVQvJXMgTk9USUZZLyVzXG4iLAorCQkJZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSA/ICJzdXBlciIgOgogCQkJZ2FkZ2V0X2lzX2R1YWxzcGVlZChjLT5jZGV2LT5nYWRnZXQpID8gImR1YWwiIDogImZ1bGwiLAogCQkJZWNtLT5wb3J0LmluX2VwLT5uYW1lLCBlY20tPnBvcnQub3V0X2VwLT5uYW1lLAogCQkJZWNtLT5ub3RpZnktPm5hbWUpOwpAQCAtNzE0LDYgKzc4OCw4IEBACiBmYWlsOgogCWlmIChmLT5kZXNjcmlwdG9ycykKIAkJdXNiX2ZyZWVfZGVzY3JpcHRvcnMoZi0+ZGVzY3JpcHRvcnMpOworCWlmIChmLT5oc19kZXNjcmlwdG9ycykKKwkJdXNiX2ZyZWVfZGVzY3JpcHRvcnMoZi0+aHNfZGVzY3JpcHRvcnMpOwogCiAJaWYgKGVjbS0+bm90aWZ5X3JlcSkgewogCQlrZnJlZShlY20tPm5vdGlmeV9yZXEtPmJ1Zik7CkBAIC03MjMsOSArNzk5LDkgQEAKIAkvKiB3ZSBtaWdodCBhcyB3ZWxsIHJlbGVhc2Ugb3VyIGNsYWltcyBvbiBlbmRwb2ludHMgKi8KIAlpZiAoZWNtLT5ub3RpZnkpCiAJCWVjbS0+bm90aWZ5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JaWYgKGVjbS0+cG9ydC5vdXQpCisJaWYgKGVjbS0+cG9ydC5vdXRfZXAtPmRlc2MpCiAJCWVjbS0+cG9ydC5vdXRfZXAtPmRyaXZlcl9kYXRhID0gTlVMTDsKLQlpZiAoZWNtLT5wb3J0LmluKQorCWlmIChlY20tPnBvcnQuaW5fZXAtPmRlc2MpCiAJCWVjbS0+cG9ydC5pbl9lcC0+ZHJpdmVyX2RhdGEgPSBOVUxMOwogCiAJRVJST1IoY2RldiwgIiVzOiBjYW4ndCBiaW5kLCBlcnIgJWRcbiIsIGYtPm5hbWUsIHN0YXR1cyk7CkBAIC03NDAsNiArODE2LDggQEAKIAogCURCRyhjLT5jZGV2LCAiZWNtIHVuYmluZFxuIik7CiAKKwlpZiAoZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSkKKwkJdXNiX2ZyZWVfZGVzY3JpcHRvcnMoZi0+c3NfZGVzY3JpcHRvcnMpOwogCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGMtPmNkZXYtPmdhZGdldCkpCiAJCXVzYl9mcmVlX2Rlc2NyaXB0b3JzKGYtPmhzX2Rlc2NyaXB0b3JzKTsKIAl1c2JfZnJlZV9kZXNjcmlwdG9ycyhmLT5kZXNjcmlwdG9ycyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9lZW0uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2VlbS5jCmluZGV4IGIzYzMwNDIuLjA0NmM2ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2VlbS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2VlbS5jCkBAIC0zNSwxNyArMzUsOSBAQAogICogRXRoZXJuZXQgbGluay4KICAqLwogCi1zdHJ1Y3QgZWVtX2VwX2Rlc2NzIHsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmluOwotCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgkqb3V0OwotfTsKLQogc3RydWN0IGZfZWVtIHsKIAlzdHJ1Y3QgZ2V0aGVyCQkJcG9ydDsKIAl1OAkJCQljdHJsX2lkOwotCi0Jc3RydWN0IGVlbV9lcF9kZXNjcwkJZnM7Ci0Jc3RydWN0IGVlbV9lcF9kZXNjcwkJaHM7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmX2VlbSAqZnVuY190b19lZW0oc3RydWN0IHVzYl9mdW5jdGlvbiAqZikKQEAgLTEyMyw2ICsxMTUsNDUgQEAKIAlOVUxMLAogfTsKIAorLyogc3VwZXIgc3BlZWQgc3VwcG9ydDogKi8KKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBlZW1fc3NfaW5fZGVzYyBfX2luaXRkYXRhID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDEwMjQpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBlZW1fc3Nfb3V0X2Rlc2MgX19pbml0ZGF0YSA9IHsKKwkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAorCisJLmJFbmRwb2ludEFkZHJlc3MgPQlVU0JfRElSX09VVCwKKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoMTAyNCksCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgZWVtX3NzX2J1bGtfY29tcF9kZXNjIF9faW5pdGRhdGEgPSB7CisJLmJMZW5ndGggPQkJc2l6ZW9mIGVlbV9zc19idWxrX2NvbXBfZGVzYywKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCisKKwkvKiB0aGUgZm9sbG93aW5nIDIgdmFsdWVzIGNhbiBiZSB0d2Vha2VkIGlmIG5lY2Vzc2FyeSAqLworCS8qIC5iTWF4QnVyc3QgPQkJMCwgKi8KKwkvKiAuYm1BdHRyaWJ1dGVzID0JMCwgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICplZW1fc3NfZnVuY3Rpb25bXSBfX2luaXRkYXRhID0geworCS8qIENEQyBFRU0gY29udHJvbCBkZXNjcmlwdG9ycyAqLworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlZW1faW50ZiwKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWVtX3NzX2luX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmVlbV9zc19idWxrX2NvbXBfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWVtX3NzX291dF9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlZW1fc3NfYnVsa19jb21wX2Rlc2MsCisJTlVMTCwKK307CisKIC8qIHN0cmluZyBkZXNjcmlwdG9yczogKi8KIAogc3RhdGljIHN0cnVjdCB1c2Jfc3RyaW5nIGVlbV9zdHJpbmdfZGVmc1tdID0gewpAQCAtMTc2LDEyICsyMDcsMTYgQEAKIAkJCWdldGhlcl9kaXNjb25uZWN0KCZlZW0tPnBvcnQpOwogCQl9CiAKLQkJaWYgKCFlZW0tPnBvcnQuaW4pIHsKKwkJaWYgKCFlZW0tPnBvcnQuaW5fZXAtPmRlc2MgfHwgIWVlbS0+cG9ydC5vdXRfZXAtPmRlc2MpIHsKIAkJCURCRyhjZGV2LCAiaW5pdCBlZW1cbiIpOwotCQkJZWVtLT5wb3J0LmluID0gZXBfY2hvb3NlKGNkZXYtPmdhZGdldCwKLQkJCQkJZWVtLT5ocy5pbiwgZWVtLT5mcy5pbik7Ci0JCQllZW0tPnBvcnQub3V0ID0gZXBfY2hvb3NlKGNkZXYtPmdhZGdldCwKLQkJCQkJZWVtLT5ocy5vdXQsIGVlbS0+ZnMub3V0KTsKKwkJCWlmIChjb25maWdfZXBfYnlfc3BlZWQoY2Rldi0+Z2FkZ2V0LCBmLAorCQkJCQkgICAgICAgZWVtLT5wb3J0LmluX2VwKSB8fAorCQkJICAgIGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsIGYsCisJCQkJCSAgICAgICBlZW0tPnBvcnQub3V0X2VwKSkgeworCQkJCWVlbS0+cG9ydC5pbl9lcC0+ZGVzYyA9IE5VTEw7CisJCQkJZWVtLT5wb3J0Lm91dF9lcC0+ZGVzYyA9IE5VTEw7CisJCQkJZ290byBmYWlsOworCQkJfQogCQl9CiAKIAkJLyogemxwcyBzaG91bGQgbm90IG9jY3VyIGJlY2F1c2UgemVyby1sZW5ndGggRUVNIHBhY2tldHMKQEAgLTI1MywxMSArMjg4LDYgQEAKIAlpZiAoIWYtPmRlc2NyaXB0b3JzKQogCQlnb3RvIGZhaWw7CiAKLQllZW0tPmZzLmluID0gdXNiX2ZpbmRfZW5kcG9pbnQoZWVtX2ZzX2Z1bmN0aW9uLAotCQkJZi0+ZGVzY3JpcHRvcnMsICZlZW1fZnNfaW5fZGVzYyk7Ci0JZWVtLT5mcy5vdXQgPSB1c2JfZmluZF9lbmRwb2ludChlZW1fZnNfZnVuY3Rpb24sCi0JCQlmLT5kZXNjcmlwdG9ycywgJmVlbV9mc19vdXRfZGVzYyk7Ci0KIAkvKiBzdXBwb3J0IGFsbCByZWxldmFudCBoYXJkd2FyZSBzcGVlZHMuLi4gd2UgZXhwZWN0IHRoYXQgd2hlbgogCSAqIGhhcmR3YXJlIGlzIGR1YWwgc3BlZWQsIGFsbCBidWxrLWNhcGFibGUgZW5kcG9pbnRzIHdvcmsgYXQKIAkgKiBib3RoIHNwZWVkcwpAQCAtMjcyLDE0ICszMDIsMjIgQEAKIAkJZi0+aHNfZGVzY3JpcHRvcnMgPSB1c2JfY29weV9kZXNjcmlwdG9ycyhlZW1faHNfZnVuY3Rpb24pOwogCQlpZiAoIWYtPmhzX2Rlc2NyaXB0b3JzKQogCQkJZ290byBmYWlsOworCX0KIAotCQllZW0tPmhzLmluID0gdXNiX2ZpbmRfZW5kcG9pbnQoZWVtX2hzX2Z1bmN0aW9uLAotCQkJCWYtPmhzX2Rlc2NyaXB0b3JzLCAmZWVtX2hzX2luX2Rlc2MpOwotCQllZW0tPmhzLm91dCA9IHVzYl9maW5kX2VuZHBvaW50KGVlbV9oc19mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJmVlbV9oc19vdXRfZGVzYyk7CisJaWYgKGdhZGdldF9pc19zdXBlcnNwZWVkKGMtPmNkZXYtPmdhZGdldCkpIHsKKwkJZWVtX3NzX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCQkJZWVtX2ZzX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJZWVtX3NzX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJCWVlbV9mc19vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCisJCS8qIGNvcHkgZGVzY3JpcHRvcnMsIGFuZCB0cmFjayBlbmRwb2ludCBjb3BpZXMgKi8KKwkJZi0+c3NfZGVzY3JpcHRvcnMgPSB1c2JfY29weV9kZXNjcmlwdG9ycyhlZW1fc3NfZnVuY3Rpb24pOworCQlpZiAoIWYtPnNzX2Rlc2NyaXB0b3JzKQorCQkJZ290byBmYWlsOwogCX0KIAogCURCRyhjZGV2LCAiQ0RDIEV0aGVybmV0IChFRU0pOiAlcyBzcGVlZCBJTi8lcyBPVVQvJXNcbiIsCisJCQlnYWRnZXRfaXNfc3VwZXJzcGVlZChjLT5jZGV2LT5nYWRnZXQpID8gInN1cGVyIiA6CiAJCQlnYWRnZXRfaXNfZHVhbHNwZWVkKGMtPmNkZXYtPmdhZGdldCkgPyAiZHVhbCIgOiAiZnVsbCIsCiAJCQllZW0tPnBvcnQuaW5fZXAtPm5hbWUsIGVlbS0+cG9ydC5vdXRfZXAtPm5hbWUpOwogCXJldHVybiAwOwpAQCAtMjg3LDExICszMjUsMTMgQEAKIGZhaWw6CiAJaWYgKGYtPmRlc2NyaXB0b3JzKQogCQl1c2JfZnJlZV9kZXNjcmlwdG9ycyhmLT5kZXNjcmlwdG9ycyk7CisJaWYgKGYtPmhzX2Rlc2NyaXB0b3JzKQorCQl1c2JfZnJlZV9kZXNjcmlwdG9ycyhmLT5oc19kZXNjcmlwdG9ycyk7CiAKIAkvKiB3ZSBtaWdodCBhcyB3ZWxsIHJlbGVhc2Ugb3VyIGNsYWltcyBvbiBlbmRwb2ludHMgKi8KLQlpZiAoZWVtLT5wb3J0Lm91dCkKKwlpZiAoZWVtLT5wb3J0Lm91dF9lcC0+ZGVzYykKIAkJZWVtLT5wb3J0Lm91dF9lcC0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCWlmIChlZW0tPnBvcnQuaW4pCisJaWYgKGVlbS0+cG9ydC5pbl9lcC0+ZGVzYykKIAkJZWVtLT5wb3J0LmluX2VwLT5kcml2ZXJfZGF0YSA9IE5VTEw7CiAKIAlFUlJPUihjZGV2LCAiJXM6IGNhbid0IGJpbmQsIGVyciAlZFxuIiwgZi0+bmFtZSwgc3RhdHVzKTsKQEAgLTMwNiw2ICszNDYsOCBAQAogCiAJREJHKGMtPmNkZXYsICJlZW0gdW5iaW5kXG4iKTsKIAorCWlmIChnYWRnZXRfaXNfc3VwZXJzcGVlZChjLT5jZGV2LT5nYWRnZXQpKQorCQl1c2JfZnJlZV9kZXNjcmlwdG9ycyhmLT5zc19kZXNjcmlwdG9ycyk7CiAJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSkKIAkJdXNiX2ZyZWVfZGVzY3JpcHRvcnMoZi0+aHNfZGVzY3JpcHRvcnMpOwogCXVzYl9mcmVlX2Rlc2NyaXB0b3JzKGYtPmRlc2NyaXB0b3JzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2ZzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9mcy5jCmluZGV4IDE5ZmZmY2MuLmMxNjFhOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2ZzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfZnMuYwpAQCAtMTU0NCw3ICsxNTQ0LDggQEAKIAkJZHMgPSBlcC0+ZGVzY3NbZXAtPmRlc2NzWzFdID8gMSA6IDBdOwogCiAJCWVwLT5lcC0+ZHJpdmVyX2RhdGEgPSBlcDsKLQkJcmV0ID0gdXNiX2VwX2VuYWJsZShlcC0+ZXAsIGRzKTsKKwkJZXAtPmVwLT5kZXNjID0gZHM7CisJCXJldCA9IHVzYl9lcF9lbmFibGUoZXAtPmVwKTsKIAkJaWYgKGxpa2VseSghcmV0KSkgewogCQkJZXBmaWxlLT5lcCA9IGVwOwogCQkJZXBmaWxlLT5pbiA9IHVzYl9lbmRwb2ludF9kaXJfaW4oZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfaGlkLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9oaWQuYwppbmRleCA1OThlN2UyLi40MDNhNDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9oaWQuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9oaWQuYwpAQCAtNTksOCArNTksNiBAQAogCXN0cnVjdCBjZGV2CQkJY2RldjsKIAlzdHJ1Y3QgdXNiX2Z1bmN0aW9uCQlmdW5jOwogCXN0cnVjdCB1c2JfZXAJCQkqaW5fZXA7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpmc19pbl9lcF9kZXNjOwotCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgkqaHNfaW5fZXBfZGVzYzsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGZfaGlkZyAqZnVuY190b19oaWRnKHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYpCkBAIC00MTYsNyArNDE0LDYgQEAKIHsKIAlzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYJCSpjZGV2ID0gZi0+Y29uZmlnLT5jZGV2OwogCXN0cnVjdCBmX2hpZGcJCQkJKmhpZGcgPSBmdW5jX3RvX2hpZGcoZik7Ci0JY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSplcF9kZXNjOwogCWludCBzdGF0dXMgPSAwOwogCiAJVkRCRyhjZGV2LCAiaGlkZ19zZXRfYWx0IGludGY6JWQgYWx0OiVkXG4iLCBpbnRmLCBhbHQpOwpAQCAtNDI2LDkgKzQyMywxMyBAQAogCQlpZiAoaGlkZy0+aW5fZXAtPmRyaXZlcl9kYXRhICE9IE5VTEwpCiAJCQl1c2JfZXBfZGlzYWJsZShoaWRnLT5pbl9lcCk7CiAKLQkJZXBfZGVzYyA9IGVwX2Nob29zZShmLT5jb25maWctPmNkZXYtPmdhZGdldCwKLQkJCQloaWRnLT5oc19pbl9lcF9kZXNjLCBoaWRnLT5mc19pbl9lcF9kZXNjKTsKLQkJc3RhdHVzID0gdXNiX2VwX2VuYWJsZShoaWRnLT5pbl9lcCwgZXBfZGVzYyk7CisJCXN0YXR1cyA9IGNvbmZpZ19lcF9ieV9zcGVlZChmLT5jb25maWctPmNkZXYtPmdhZGdldCwgZiwKKwkJCQkJICAgIGhpZGctPmluX2VwKTsKKwkJaWYgKHN0YXR1cykgeworCQkJRVJST1IoY2RldiwgImNvbmZpZ19lcF9ieV9zcGVlZCBGQUlMRUQhXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlzdGF0dXMgPSB1c2JfZXBfZW5hYmxlKGhpZGctPmluX2VwKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCUVSUk9SKGNkZXYsICJFbmFibGUgZW5kcG9pbnQgRkFJTEVEIVxuIik7CiAJCQlnb3RvIGZhaWw7CkBAIC00OTgsMjEgKzQ5OSwxMiBAQAogCWlmICghZi0+ZGVzY3JpcHRvcnMpCiAJCWdvdG8gZmFpbDsKIAotCWhpZGctPmZzX2luX2VwX2Rlc2MgPSB1c2JfZmluZF9lbmRwb2ludChoaWRnX2ZzX2Rlc2NyaXB0b3JzLAotCQkJCQkJZi0+ZGVzY3JpcHRvcnMsCi0JCQkJCQkmaGlkZ19mc19pbl9lcF9kZXNjKTsKLQogCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGMtPmNkZXYtPmdhZGdldCkpIHsKIAkJaGlkZ19oc19pbl9lcF9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQogCQkJaGlkZ19mc19pbl9lcF9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CiAJCWYtPmhzX2Rlc2NyaXB0b3JzID0gdXNiX2NvcHlfZGVzY3JpcHRvcnMoaGlkZ19oc19kZXNjcmlwdG9ycyk7CiAJCWlmICghZi0+aHNfZGVzY3JpcHRvcnMpCiAJCQlnb3RvIGZhaWw7Ci0JCWhpZGctPmhzX2luX2VwX2Rlc2MgPSB1c2JfZmluZF9lbmRwb2ludChoaWRnX2hzX2Rlc2NyaXB0b3JzLAotCQkJCQkJCWYtPmhzX2Rlc2NyaXB0b3JzLAotCQkJCQkJCSZoaWRnX2hzX2luX2VwX2Rlc2MpOwotCX0gZWxzZSB7Ci0JCWhpZGctPmhzX2luX2VwX2Rlc2MgPSBOVUxMOwogCX0KIAogCW11dGV4X2luaXQoJmhpZGctPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbG9vcGJhY2suYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2xvb3BiYWNrLmMKaW5kZXggYjM3OTYwZi4uY2E2NjBkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbG9vcGJhY2suYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9sb29wYmFjay5jCkBAIC0xMTgsNiArMTE4LDQ5IEBACiAJTlVMTCwKIH07CiAKKy8qIHN1cGVyIHNwZWVkIHN1cHBvcnQ6ICovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3NfbG9vcF9zb3VyY2VfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAorCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDEwMjQpLAorfTsKKworc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3NfbG9vcF9zb3VyY2VfY29tcF9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9TU19FUF9DT01QX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAorCS5iTWF4QnVyc3QgPQkJMCwKKwkuYm1BdHRyaWJ1dGVzID0JCTAsCisJLndCeXRlc1BlckludGVydmFsID0JMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3NfbG9vcF9zaW5rX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNigxMDI0KSwKK307CisKK3N0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX2xvb3Bfc2lua19jb21wX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX1NTX0VQX0NPTVBfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCisJLmJNYXhCdXJzdCA9CQkwLAorCS5ibUF0dHJpYnV0ZXMgPQkJMCwKKwkud0J5dGVzUGVySW50ZXJ2YWwgPQkwLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKnNzX2xvb3BiYWNrX2Rlc2NzW10gPSB7CisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmxvb3BiYWNrX2ludGYsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX2xvb3Bfc291cmNlX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX2xvb3Bfc291cmNlX2NvbXBfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfbG9vcF9zaW5rX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX2xvb3Bfc2lua19jb21wX2Rlc2MsCisJTlVMTCwKK307CisKIC8qIGZ1bmN0aW9uLXNwZWNpZmljIHN0cmluZ3M6ICovCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3N0cmluZyBzdHJpbmdzX2xvb3BiYWNrW10gPSB7CkBAIC0xNzUsOCArMjE4LDE4IEBACiAJCWYtPmhzX2Rlc2NyaXB0b3JzID0gaHNfbG9vcGJhY2tfZGVzY3M7CiAJfQogCisJLyogc3VwcG9ydCBzdXBlciBzcGVlZCBoYXJkd2FyZSAqLworCWlmIChnYWRnZXRfaXNfc3VwZXJzcGVlZChjLT5jZGV2LT5nYWRnZXQpKSB7CisJCXNzX2xvb3Bfc291cmNlX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCQkJZnNfbG9vcF9zb3VyY2VfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQlzc19sb29wX3NpbmtfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KKwkJCQlmc19sb29wX3NpbmtfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQlmLT5zc19kZXNjcmlwdG9ycyA9IHNzX2xvb3BiYWNrX2Rlc2NzOworCX0KKwogCURCRyhjZGV2LCAiJXMgc3BlZWQgJXM6IElOLyVzLCBPVVQvJXNcbiIsCi0JCQlnYWRnZXRfaXNfZHVhbHNwZWVkKGMtPmNkZXYtPmdhZGdldCkgPyAiZHVhbCIgOiAiZnVsbCIsCisJICAgIChnYWRnZXRfaXNfc3VwZXJzcGVlZChjLT5jZGV2LT5nYWRnZXQpID8gInN1cGVyIiA6CisJICAgICAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChjLT5jZGV2LT5nYWRnZXQpID8gImR1YWwiIDogImZ1bGwiKSksCiAJCQlmLT5uYW1lLCBsb29wLT5pbl9lcC0+bmFtZSwgbG9vcC0+b3V0X2VwLT5uYW1lKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI1MCwyNiArMzAzLDI3IEBACiBlbmFibGVfbG9vcGJhY2soc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2LCBzdHJ1Y3QgZl9sb29wYmFjayAqbG9vcCkKIHsKIAlpbnQJCQkJCXJlc3VsdCA9IDA7Ci0JY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpzcmMsICpzaW5rOwogCXN0cnVjdCB1c2JfZXAJCQkJKmVwOwogCXN0cnVjdCB1c2JfcmVxdWVzdAkJCSpyZXE7CiAJdW5zaWduZWQJCQkJaTsKIAotCXNyYyA9IGVwX2Nob29zZShjZGV2LT5nYWRnZXQsCi0JCQkmaHNfbG9vcF9zb3VyY2VfZGVzYywgJmZzX2xvb3Bfc291cmNlX2Rlc2MpOwotCXNpbmsgPSBlcF9jaG9vc2UoY2Rldi0+Z2FkZ2V0LAotCQkJJmhzX2xvb3Bfc2lua19kZXNjLCAmZnNfbG9vcF9zaW5rX2Rlc2MpOwotCiAJLyogb25lIGVuZHBvaW50IHdyaXRlcyBkYXRhIGJhY2sgSU4gdG8gdGhlIGhvc3QgKi8KIAllcCA9IGxvb3AtPmluX2VwOwotCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUoZXAsIHNyYyk7CisJcmVzdWx0ID0gY29uZmlnX2VwX2J5X3NwZWVkKGNkZXYtPmdhZGdldCwgJihsb29wLT5mdW5jdGlvbiksIGVwKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUoZXApOwogCWlmIChyZXN1bHQgPCAwKQogCQlyZXR1cm4gcmVzdWx0OwogCWVwLT5kcml2ZXJfZGF0YSA9IGxvb3A7CiAKIAkvKiBvbmUgZW5kcG9pbnQganVzdCByZWFkcyBPVVQgcGFja2V0cyAqLwogCWVwID0gbG9vcC0+b3V0X2VwOwotCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUoZXAsIHNpbmspOworCXJlc3VsdCA9IGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsICYobG9vcC0+ZnVuY3Rpb24pLCBlcCk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsMDsKKworCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUoZXApOwogCWlmIChyZXN1bHQgPCAwKSB7CiBmYWlsMDoKIAkJZXAgPSBsb29wLT5pbl9lcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX21hc3Nfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWFzc19zdG9yYWdlLmMKaW5kZXggZWZiNThmOS4uNWI5MzM5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWFzc19zdG9yYWdlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWFzc19zdG9yYWdlLmMKQEAgLTIzMjQsMTggKzIzMjQsNiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IGVuYWJsZV9lbmRwb2ludChzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLCBzdHJ1Y3QgdXNiX2VwICplcCwKLQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkKQotewotCWludAlyYzsKLQotCWVwLT5kcml2ZXJfZGF0YSA9IGNvbW1vbjsKLQlyYyA9IHVzYl9lcF9lbmFibGUoZXAsIGQpOwotCWlmIChyYykKLQkJRVJST1IoY29tbW9uLCAiY2FuJ3QgZW5hYmxlICVzLCByZXN1bHQgJWRcbiIsIGVwLT5uYW1lLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IGFsbG9jX3JlcXVlc3Qoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwgc3RydWN0IHVzYl9lcCAqZXAsCiAJCXN0cnVjdCB1c2JfcmVxdWVzdCAqKnByZXEpCiB7CkBAIC0yMzQ5LDcgKzIzMzcsNiBAQAogLyogUmVzZXQgaW50ZXJmYWNlIHNldHRpbmcgYW5kIHJlLWluaXQgZW5kcG9pbnQgc3RhdGUgKHRvZ2dsZSBldGMpLiAqLwogc3RhdGljIGludCBkb19zZXRfaW50ZXJmYWNlKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sIHN0cnVjdCBmc2dfZGV2ICpuZXdfZnNnKQogewotCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZDsKIAlzdHJ1Y3QgZnNnX2RldiAqZnNnOwogCWludCBpLCByYyA9IDA7CiAKQEAgLTIzOTYsMjAgKzIzODMsMjYgQEAKIAlmc2cgPSBjb21tb24tPmZzZzsKIAogCS8qIEVuYWJsZSB0aGUgZW5kcG9pbnRzICovCi0JZCA9IGZzZ19lcF9kZXNjKGNvbW1vbi0+Z2FkZ2V0LAotCQkJJmZzZ19mc19idWxrX2luX2Rlc2MsICZmc2dfaHNfYnVsa19pbl9kZXNjKTsKLQlyYyA9IGVuYWJsZV9lbmRwb2ludChjb21tb24sIGZzZy0+YnVsa19pbiwgZCk7CisJcmMgPSBjb25maWdfZXBfYnlfc3BlZWQoY29tbW9uLT5nYWRnZXQsICYoZnNnLT5mdW5jdGlvbiksIGZzZy0+YnVsa19pbik7CiAJaWYgKHJjKQogCQlnb3RvIHJlc2V0OworCXJjID0gdXNiX2VwX2VuYWJsZShmc2ctPmJ1bGtfaW4pOworCWlmIChyYykKKwkJZ290byByZXNldDsKKwlmc2ctPmJ1bGtfaW4tPmRyaXZlcl9kYXRhID0gY29tbW9uOwogCWZzZy0+YnVsa19pbl9lbmFibGVkID0gMTsKIAotCWQgPSBmc2dfZXBfZGVzYyhjb21tb24tPmdhZGdldCwKLQkJCSZmc2dfZnNfYnVsa19vdXRfZGVzYywgJmZzZ19oc19idWxrX291dF9kZXNjKTsKLQlyYyA9IGVuYWJsZV9lbmRwb2ludChjb21tb24sIGZzZy0+YnVsa19vdXQsIGQpOworCXJjID0gY29uZmlnX2VwX2J5X3NwZWVkKGNvbW1vbi0+Z2FkZ2V0LCAmKGZzZy0+ZnVuY3Rpb24pLAorCQkJCWZzZy0+YnVsa19vdXQpOwogCWlmIChyYykKIAkJZ290byByZXNldDsKKwlyYyA9IHVzYl9lcF9lbmFibGUoZnNnLT5idWxrX291dCk7CisJaWYgKHJjKQorCQlnb3RvIHJlc2V0OworCWZzZy0+YnVsa19vdXQtPmRyaXZlcl9kYXRhID0gY29tbW9uOwogCWZzZy0+YnVsa19vdXRfZW5hYmxlZCA9IDE7Ci0JY29tbW9uLT5idWxrX291dF9tYXhwYWNrZXQgPSBsZTE2X3RvX2NwdShkLT53TWF4UGFja2V0U2l6ZSk7CisJY29tbW9uLT5idWxrX291dF9tYXhwYWNrZXQgPQorCQlsZTE2X3RvX2NwdShmc2ctPmJ1bGtfb3V0LT5kZXNjLT53TWF4UGFja2V0U2l6ZSk7CiAJY2xlYXJfYml0KElHTk9SRV9CVUxLX09VVCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKTsKIAogCS8qIEFsbG9jYXRlIHRoZSByZXF1ZXN0cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbmNtLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9uY20uYwppbmRleCA4NjkwMmE2Li5hZTY5ZWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9uY20uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9uY20uYwpAQCAtNDgsMTIgKzQ4LDYgQEAKICNkZWZpbmUgTkNNX05EUF9IRFJfQ1JDCQkweDAxMDAwMDAwCiAjZGVmaW5lIE5DTV9ORFBfSERSX05PQ1JDCTB4MDAwMDAwMDAKIAotc3RydWN0IG5jbV9lcF9kZXNjcyB7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSppbjsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm91dDsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm5vdGlmeTsKLX07Ci0KIGVudW0gbmNtX25vdGlmeV9zdGF0ZSB7CiAJTkNNX05PVElGWV9OT05FLAkJLyogZG9uJ3Qgbm90aWZ5ICovCiAJTkNNX05PVElGWV9DT05ORUNULAkJLyogaXNzdWUgQ09OTkVDVCBuZXh0ICovCkBAIC02NiwxMSArNjAsNyBAQAogCiAJY2hhcgkJCQlldGhhZGRyWzE0XTsKIAotCXN0cnVjdCBuY21fZXBfZGVzY3MJCWZzOwotCXN0cnVjdCBuY21fZXBfZGVzY3MJCWhzOwotCiAJc3RydWN0IHVzYl9lcAkJCSpub3RpZnk7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpub3RpZnlfZGVzYzsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJCSpub3RpZnlfcmVxOwogCXU4CQkJCW5vdGlmeV9zdGF0ZTsKIAlib29sCQkJCWlzX29wZW47CkBAIC04MDIsMTMgKzc5MiwxNCBAQAogCQlpZiAobmNtLT5ub3RpZnktPmRyaXZlcl9kYXRhKSB7CiAJCQlEQkcoY2RldiwgInJlc2V0IG5jbSBjb250cm9sICVkXG4iLCBpbnRmKTsKIAkJCXVzYl9lcF9kaXNhYmxlKG5jbS0+bm90aWZ5KTsKLQkJfSBlbHNlIHsKLQkJCURCRyhjZGV2LCAiaW5pdCBuY20gY3RybCAlZFxuIiwgaW50Zik7Ci0JCQluY20tPm5vdGlmeV9kZXNjID0gZXBfY2hvb3NlKGNkZXYtPmdhZGdldCwKLQkJCQkJbmNtLT5ocy5ub3RpZnksCi0JCQkJCW5jbS0+ZnMubm90aWZ5KTsKIAkJfQotCQl1c2JfZXBfZW5hYmxlKG5jbS0+bm90aWZ5LCBuY20tPm5vdGlmeV9kZXNjKTsKKworCQlpZiAoIShuY20tPm5vdGlmeS0+ZGVzYykpIHsKKwkJCURCRyhjZGV2LCAiaW5pdCBuY20gY3RybCAlZFxuIiwgaW50Zik7CisJCQlpZiAoY29uZmlnX2VwX2J5X3NwZWVkKGNkZXYtPmdhZGdldCwgZiwgbmNtLT5ub3RpZnkpKQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCQl1c2JfZXBfZW5hYmxlKG5jbS0+bm90aWZ5KTsKIAkJbmNtLT5ub3RpZnktPmRyaXZlcl9kYXRhID0gbmNtOwogCiAJLyogRGF0YSBpbnRlcmZhY2UgaGFzIHR3byBhbHRzZXR0aW5ncywgMCBhbmQgMSAqLwpAQCAtODI5LDE0ICs4MjAsMTcgQEAKIAkJaWYgKGFsdCA9PSAxKSB7CiAJCQlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0OwogCi0JCQlpZiAoIW5jbS0+cG9ydC5pbikgeworCQkJaWYgKCFuY20tPnBvcnQuaW5fZXAtPmRlc2MgfHwKKwkJCSAgICAhbmNtLT5wb3J0Lm91dF9lcC0+ZGVzYykgewogCQkJCURCRyhjZGV2LCAiaW5pdCBuY21cbiIpOwotCQkJCW5jbS0+cG9ydC5pbiA9IGVwX2Nob29zZShjZGV2LT5nYWRnZXQsCi0JCQkJCQkJIG5jbS0+aHMuaW4sCi0JCQkJCQkJIG5jbS0+ZnMuaW4pOwotCQkJCW5jbS0+cG9ydC5vdXQgPSBlcF9jaG9vc2UoY2Rldi0+Z2FkZ2V0LAotCQkJCQkJCSAgbmNtLT5ocy5vdXQsCi0JCQkJCQkJICBuY20tPmZzLm91dCk7CisJCQkJaWYgKGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsIGYsCisJCQkJCQkgICAgICAgbmNtLT5wb3J0LmluX2VwKSB8fAorCQkJCSAgICBjb25maWdfZXBfYnlfc3BlZWQoY2Rldi0+Z2FkZ2V0LCBmLAorCQkJCQkJICAgICAgIG5jbS0+cG9ydC5vdXRfZXApKSB7CisJCQkJCW5jbS0+cG9ydC5pbl9lcC0+ZGVzYyA9IE5VTEw7CisJCQkJCW5jbS0+cG9ydC5vdXRfZXAtPmRlc2MgPSBOVUxMOworCQkJCQlnb3RvIGZhaWw7CisJCQkJfQogCQkJfQogCiAJCQkvKiBUT0RPICovCkBAIC0xMTExLDcgKzExMDUsNyBAQAogCWlmIChuY20tPm5vdGlmeS0+ZHJpdmVyX2RhdGEpIHsKIAkJdXNiX2VwX2Rpc2FibGUobmNtLT5ub3RpZnkpOwogCQluY20tPm5vdGlmeS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCQluY20tPm5vdGlmeV9kZXNjID0gTlVMTDsKKwkJbmNtLT5ub3RpZnktPmRlc2MgPSBOVUxMOwogCX0KIH0KIApAQCAtMTIyOCwxMyArMTIyMiw2IEBACiAJaWYgKCFmLT5kZXNjcmlwdG9ycykKIAkJZ290byBmYWlsOwogCi0JbmNtLT5mcy5pbiA9IHVzYl9maW5kX2VuZHBvaW50KG5jbV9mc19mdW5jdGlvbiwKLQkJCWYtPmRlc2NyaXB0b3JzLCAmZnNfbmNtX2luX2Rlc2MpOwotCW5jbS0+ZnMub3V0ID0gdXNiX2ZpbmRfZW5kcG9pbnQobmNtX2ZzX2Z1bmN0aW9uLAotCQkJZi0+ZGVzY3JpcHRvcnMsICZmc19uY21fb3V0X2Rlc2MpOwotCW5jbS0+ZnMubm90aWZ5ID0gdXNiX2ZpbmRfZW5kcG9pbnQobmNtX2ZzX2Z1bmN0aW9uLAotCQkJZi0+ZGVzY3JpcHRvcnMsICZmc19uY21fbm90aWZ5X2Rlc2MpOwotCiAJLyoKIAkgKiBzdXBwb3J0IGFsbCByZWxldmFudCBoYXJkd2FyZSBzcGVlZHMuLi4gd2UgZXhwZWN0IHRoYXQgd2hlbgogCSAqIGhhcmR3YXJlIGlzIGR1YWwgc3BlZWQsIGFsbCBidWxrLWNhcGFibGUgZW5kcG9pbnRzIHdvcmsgYXQKQEAgLTEyNTIsMTMgKzEyMzksNiBAQAogCQlmLT5oc19kZXNjcmlwdG9ycyA9IHVzYl9jb3B5X2Rlc2NyaXB0b3JzKG5jbV9oc19mdW5jdGlvbik7CiAJCWlmICghZi0+aHNfZGVzY3JpcHRvcnMpCiAJCQlnb3RvIGZhaWw7Ci0KLQkJbmNtLT5ocy5pbiA9IHVzYl9maW5kX2VuZHBvaW50KG5jbV9oc19mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJmhzX25jbV9pbl9kZXNjKTsKLQkJbmNtLT5ocy5vdXQgPSB1c2JfZmluZF9lbmRwb2ludChuY21faHNfZnVuY3Rpb24sCi0JCQkJZi0+aHNfZGVzY3JpcHRvcnMsICZoc19uY21fb3V0X2Rlc2MpOwotCQluY20tPmhzLm5vdGlmeSA9IHVzYl9maW5kX2VuZHBvaW50KG5jbV9oc19mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJmhzX25jbV9ub3RpZnlfZGVzYyk7CiAJfQogCiAJLyoKQEAgLTEyODgsOSArMTI2OCw5IEBACiAJLyogd2UgbWlnaHQgYXMgd2VsbCByZWxlYXNlIG91ciBjbGFpbXMgb24gZW5kcG9pbnRzICovCiAJaWYgKG5jbS0+bm90aWZ5KQogCQluY20tPm5vdGlmeS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCWlmIChuY20tPnBvcnQub3V0KQorCWlmIChuY20tPnBvcnQub3V0X2VwLT5kZXNjKQogCQluY20tPnBvcnQub3V0X2VwLT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JaWYgKG5jbS0+cG9ydC5pbikKKwlpZiAobmNtLT5wb3J0LmluX2VwLT5kZXNjKQogCQluY20tPnBvcnQuaW5fZXAtPmRyaXZlcl9kYXRhID0gTlVMTDsKIAogCUVSUk9SKGNkZXYsICIlczogY2FuJ3QgYmluZCwgZXJyICVkXG4iLCBmLT5uYW1lLCBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfb2JleC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfb2JleC5jCmluZGV4IDhmOGM2NDMuLjM5NDUwMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX29iZXguYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9vYmV4LmMKQEAgLTM5LDIwICszOSwxMiBAQAogICogcmVhZHkgdG8gaGFuZGxlIHRoZSBjb21tYW5kcy4KICAqLwogCi1zdHJ1Y3Qgb2JleF9lcF9kZXNjcyB7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpvYmV4X2luOwotCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgkqb2JleF9vdXQ7Ci19OwotCiBzdHJ1Y3QgZl9vYmV4IHsKIAlzdHJ1Y3QgZ3NlcmlhbAkJCXBvcnQ7CiAJdTgJCQkJY3RybF9pZDsKIAl1OAkJCQlkYXRhX2lkOwogCXU4CQkJCXBvcnRfbnVtOwogCXU4CQkJCWNhbl9hY3RpdmF0ZTsKLQotCXN0cnVjdCBvYmV4X2VwX2Rlc2NzCQlmczsKLQlzdHJ1Y3Qgb2JleF9lcF9kZXNjcwkJaHM7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmX29iZXggKmZ1bmNfdG9fb2JleChzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQpAQCAtMjI3LDEyICsyMTksMTYgQEAKIAkJCWdzZXJpYWxfZGlzY29ubmVjdCgmb2JleC0+cG9ydCk7CiAJCX0KIAotCQlpZiAoIW9iZXgtPnBvcnQuaW5fZGVzYykgeworCQlpZiAoIW9iZXgtPnBvcnQuaW4tPmRlc2MgfHwgIW9iZXgtPnBvcnQub3V0LT5kZXNjKSB7CiAJCQlEQkcoY2RldiwgImluaXQgb2JleCB0dHlHUyVkXG4iLCBvYmV4LT5wb3J0X251bSk7Ci0JCQlvYmV4LT5wb3J0LmluX2Rlc2MgPSBlcF9jaG9vc2UoY2Rldi0+Z2FkZ2V0LAotCQkJCQlvYmV4LT5ocy5vYmV4X2luLCBvYmV4LT5mcy5vYmV4X2luKTsKLQkJCW9iZXgtPnBvcnQub3V0X2Rlc2MgPSBlcF9jaG9vc2UoY2Rldi0+Z2FkZ2V0LAotCQkJCQlvYmV4LT5ocy5vYmV4X291dCwgb2JleC0+ZnMub2JleF9vdXQpOworCQkJaWYgKGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsIGYsCisJCQkJCSAgICAgICBvYmV4LT5wb3J0LmluKSB8fAorCQkJICAgIGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsIGYsCisJCQkJCSAgICAgICBvYmV4LT5wb3J0Lm91dCkpIHsKKwkJCQlvYmV4LT5wb3J0Lm91dC0+ZGVzYyA9IE5VTEw7CisJCQkJb2JleC0+cG9ydC5pbi0+ZGVzYyA9IE5VTEw7CisJCQkJZ290byBmYWlsOworCQkJfQogCQl9CiAKIAkJaWYgKGFsdCA9PSAxKSB7CkBAIC0zNDYsMTEgKzM0Miw2IEBACiAJLyogY29weSBkZXNjcmlwdG9ycywgYW5kIHRyYWNrIGVuZHBvaW50IGNvcGllcyAqLwogCWYtPmRlc2NyaXB0b3JzID0gdXNiX2NvcHlfZGVzY3JpcHRvcnMoZnNfZnVuY3Rpb24pOwogCi0Jb2JleC0+ZnMub2JleF9pbiA9IHVzYl9maW5kX2VuZHBvaW50KGZzX2Z1bmN0aW9uLAotCQkJZi0+ZGVzY3JpcHRvcnMsICZvYmV4X2ZzX2VwX2luX2Rlc2MpOwotCW9iZXgtPmZzLm9iZXhfb3V0ID0gdXNiX2ZpbmRfZW5kcG9pbnQoZnNfZnVuY3Rpb24sCi0JCQlmLT5kZXNjcmlwdG9ycywgJm9iZXhfZnNfZXBfb3V0X2Rlc2MpOwotCiAJLyogc3VwcG9ydCBhbGwgcmVsZXZhbnQgaGFyZHdhcmUgc3BlZWRzLi4uIHdlIGV4cGVjdCB0aGF0IHdoZW4KIAkgKiBoYXJkd2FyZSBpcyBkdWFsIHNwZWVkLCBhbGwgYnVsay1jYXBhYmxlIGVuZHBvaW50cyB3b3JrIGF0CiAJICogYm90aCBzcGVlZHMKQEAgLTM2NCwxMSArMzU1LDYgQEAKIAogCQkvKiBjb3B5IGRlc2NyaXB0b3JzLCBhbmQgdHJhY2sgZW5kcG9pbnQgY29waWVzICovCiAJCWYtPmhzX2Rlc2NyaXB0b3JzID0gdXNiX2NvcHlfZGVzY3JpcHRvcnMoaHNfZnVuY3Rpb24pOwotCi0JCW9iZXgtPmhzLm9iZXhfaW4gPSB1c2JfZmluZF9lbmRwb2ludChoc19mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJm9iZXhfaHNfZXBfaW5fZGVzYyk7Ci0JCW9iZXgtPmhzLm9iZXhfb3V0ID0gdXNiX2ZpbmRfZW5kcG9pbnQoaHNfZnVuY3Rpb24sCi0JCQkJZi0+aHNfZGVzY3JpcHRvcnMsICZvYmV4X2hzX2VwX291dF9kZXNjKTsKIAl9CiAKIAkvKiBBdm9pZCBsZXR0aW5nIHRoaXMgZ2FkZ2V0IGVudW1lcmF0ZSB1bnRpbCB0aGUgdXNlcnNwYWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9waG9uZXQuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCmluZGV4IDVlMTQ5NTAuLjhmOGQzZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKiAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTQyNywxNyArNDI4LDE2IEBACiAJCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CiAJCV9fcG5fcmVzZXQoZik7CiAJCWlmIChhbHQgPT0gMSkgewotCQkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpvdXQsICppbjsKIAkJCWludCBpOwogCi0JCQlvdXQgPSBlcF9jaG9vc2UoZ2FkZ2V0LAotCQkJCQkmcG5faHNfc2lua19kZXNjLAotCQkJCQkmcG5fZnNfc2lua19kZXNjKTsKLQkJCWluID0gZXBfY2hvb3NlKGdhZGdldCwKLQkJCQkJJnBuX2hzX3NvdXJjZV9kZXNjLAotCQkJCQkmcG5fZnNfc291cmNlX2Rlc2MpOwotCQkJdXNiX2VwX2VuYWJsZShmcC0+b3V0X2VwLCBvdXQpOwotCQkJdXNiX2VwX2VuYWJsZShmcC0+aW5fZXAsIGluKTsKKwkJCWlmIChjb25maWdfZXBfYnlfc3BlZWQoZ2FkZ2V0LCBmLCBmcC0+aW5fZXApIHx8CisJCQkgICAgY29uZmlnX2VwX2J5X3NwZWVkKGdhZGdldCwgZiwgZnAtPm91dF9lcCkpIHsKKwkJCQlmcC0+aW5fZXAtPmRlc2MgPSBOVUxMOworCQkJCWZwLT5vdXRfZXAtPmRlc2MgPSBOVUxMOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJdXNiX2VwX2VuYWJsZShmcC0+b3V0X2VwKTsKKwkJCXVzYl9lcF9lbmFibGUoZnAtPmluX2VwKTsKIAogCQkJcG9ydC0+dXNiID0gZnA7CiAJCQlmcC0+b3V0X2VwLT5kcml2ZXJfZGF0YSA9IGZwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfcm5kaXMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3JuZGlzLmMKaW5kZXggZmExMmVjOC4uOGYzZWFlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfcm5kaXMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9ybmRpcy5jCkBAIC03NiwyMyArNzYsMTMgQEAKICAqICAgLSBNUy1XaW5kb3dzIGRyaXZlcnMgc29tZXRpbWVzIGVtaXQgdW5kb2N1bWVudGVkIHJlcXVlc3RzLgogICovCiAKLXN0cnVjdCBybmRpc19lcF9kZXNjcyB7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSppbjsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm91dDsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm5vdGlmeTsKLX07Ci0KIHN0cnVjdCBmX3JuZGlzIHsKIAlzdHJ1Y3QgZ2V0aGVyCQkJcG9ydDsKIAl1OAkJCQljdHJsX2lkLCBkYXRhX2lkOwogCXU4CQkJCWV0aGFkZHJbRVRIX0FMRU5dOwogCWludAkJCQljb25maWc7CiAKLQlzdHJ1Y3Qgcm5kaXNfZXBfZGVzY3MJCWZzOwotCXN0cnVjdCBybmRpc19lcF9kZXNjcwkJaHM7Ci0KIAlzdHJ1Y3QgdXNiX2VwCQkJKm5vdGlmeTsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm5vdGlmeV9kZXNjOwogCXN0cnVjdCB1c2JfcmVxdWVzdAkJKm5vdGlmeV9yZXE7CiAJYXRvbWljX3QJCQlub3RpZnlfY291bnQ7CiB9OwpAQCAtMTA1LDEwICs5NSwxMiBAQAogLyogcGVhayAodGhlb3JldGljYWwpIGJ1bGsgdHJhbnNmZXIgcmF0ZSBpbiBiaXRzLXBlci1zZWNvbmQgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgYml0cmF0ZShzdHJ1Y3QgdXNiX2dhZGdldCAqZykKIHsKLQlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnKSAmJiBnLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwlpZiAoZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoZykgJiYgZy0+c3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKQorCQlyZXR1cm4gMTMgKiAxMDI0ICogOCAqIDEwMDAgKiA4OworCWVsc2UgaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZykgJiYgZy0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCiAJCXJldHVybiAxMyAqIDUxMiAqIDggKiAxMDAwICogODsKIAllbHNlCi0JCXJldHVybiAxOSAqICA2NCAqIDEgKiAxMDAwICogODsKKwkJcmV0dXJuIDE5ICogNjQgKiAxICogMTAwMCAqIDg7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yMjYsNiArMjE4LDcgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmV0aF9mc19mdW5jdGlvbltdID0gewogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc19pYWRfZGVzY3JpcHRvciwKKwogCS8qIGNvbnRyb2wgaW50ZXJmYWNlIG1hdGNoZXMgQUNNLCBub3QgRXRoZXJuZXQgKi8KIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfY29udHJvbF9pbnRmLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoZWFkZXJfZGVzYywKQEAgLTIzMyw2ICsyMjYsNyBAQAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc19hY21fZGVzY3JpcHRvciwKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfdW5pb25fZGVzYywKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNfbm90aWZ5X2Rlc2MsCisKIAkvKiBkYXRhIGludGVyZmFjZSBoYXMgbm8gYWx0c2V0dGluZyAqLwogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc19kYXRhX2ludGYsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX2luX2Rlc2MsCkBAIC0yNTEsNiArMjQ1LDcgQEAKIAkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNihTVEFUVVNfQllURUNPVU5UKSwKIAkuYkludGVydmFsID0JCUxPRzJfU1RBVFVTX0lOVEVSVkFMX01TRUMgKyA0LAogfTsKKwogc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBoc19pbl9kZXNjID0gewogCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAogCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCkBAIC0yNzEsNiArMjY2LDcgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmV0aF9oc19mdW5jdGlvbltdID0gewogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc19pYWRfZGVzY3JpcHRvciwKKwogCS8qIGNvbnRyb2wgaW50ZXJmYWNlIG1hdGNoZXMgQUNNLCBub3QgRXRoZXJuZXQgKi8KIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfY29udHJvbF9pbnRmLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoZWFkZXJfZGVzYywKQEAgLTI3OCw2ICsyNzQsNyBAQAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc19hY21fZGVzY3JpcHRvciwKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfdW5pb25fZGVzYywKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfbm90aWZ5X2Rlc2MsCisKIAkvKiBkYXRhIGludGVyZmFjZSBoYXMgbm8gYWx0c2V0dGluZyAqLwogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc19kYXRhX2ludGYsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX2luX2Rlc2MsCkBAIC0yODUsNiArMjgyLDc2IEBACiAJTlVMTCwKIH07CiAKKy8qIHN1cGVyIHNwZWVkIHN1cHBvcnQ6ICovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3Nfbm90aWZ5X2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS5iRW5kcG9pbnRBZGRyZXNzID0JVVNCX0RJUl9JTiwKKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKKwkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNihTVEFUVVNfQllURUNPVU5UKSwKKwkuYkludGVydmFsID0JCUxPRzJfU1RBVFVTX0lOVEVSVkFMX01TRUMgKyA0LAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX2ludHJfY29tcF9kZXNjID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBzc19pbnRyX2NvbXBfZGVzYywKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCisKKwkvKiB0aGUgZm9sbG93aW5nIDMgdmFsdWVzIGNhbiBiZSB0d2Vha2VkIGlmIG5lY2Vzc2FyeSAqLworCS8qIC5iTWF4QnVyc3QgPQkJMCwgKi8KKwkvKiAuYm1BdHRyaWJ1dGVzID0JMCwgKi8KKwkud0J5dGVzUGVySW50ZXJ2YWwgPQljcHVfdG9fbGUxNihTVEFUVVNfQllURUNPVU5UKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3NfaW5fZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAorCisJLmJFbmRwb2ludEFkZHJlc3MgPQlVU0JfRElSX0lOLAorCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNigxMDI0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3Nfb3V0X2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS5iRW5kcG9pbnRBZGRyZXNzID0JVVNCX0RJUl9PVVQsCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDEwMjQpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX2J1bGtfY29tcF9kZXNjID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBzc19idWxrX2NvbXBfZGVzYywKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCisKKwkvKiB0aGUgZm9sbG93aW5nIDIgdmFsdWVzIGNhbiBiZSB0d2Vha2VkIGlmIG5lY2Vzc2FyeSAqLworCS8qIC5iTWF4QnVyc3QgPQkJMCwgKi8KKwkvKiAuYm1BdHRyaWJ1dGVzID0JMCwgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpldGhfc3NfZnVuY3Rpb25bXSA9IHsKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfaWFkX2Rlc2NyaXB0b3IsCisKKwkvKiBjb250cm9sIGludGVyZmFjZSBtYXRjaGVzIEFDTSwgbm90IEV0aGVybmV0ICovCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnJuZGlzX2NvbnRyb2xfaW50ZiwKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaGVhZGVyX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmNhbGxfbWdtdF9kZXNjcmlwdG9yLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc19hY21fZGVzY3JpcHRvciwKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfdW5pb25fZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3Nfbm90aWZ5X2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX2ludHJfY29tcF9kZXNjLAorCisJLyogZGF0YSBpbnRlcmZhY2UgaGFzIG5vIGFsdHNldHRpbmcgKi8KKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfZGF0YV9pbnRmLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19pbl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19idWxrX2NvbXBfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3Nfb3V0X2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX2J1bGtfY29tcF9kZXNjLAorCU5VTEwsCit9OworCiAvKiBzdHJpbmcgZGVzY3JpcHRvcnM6ICovCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3N0cmluZyBybmRpc19zdHJpbmdfZGVmc1tdID0gewpAQCAtNDg0LDEzICs1NTEsMTMgQEAKIAkJaWYgKHJuZGlzLT5ub3RpZnktPmRyaXZlcl9kYXRhKSB7CiAJCQlWREJHKGNkZXYsICJyZXNldCBybmRpcyBjb250cm9sICVkXG4iLCBpbnRmKTsKIAkJCXVzYl9lcF9kaXNhYmxlKHJuZGlzLT5ub3RpZnkpOwotCQl9IGVsc2UgewotCQkJVkRCRyhjZGV2LCAiaW5pdCBybmRpcyBjdHJsICVkXG4iLCBpbnRmKTsKLQkJCXJuZGlzLT5ub3RpZnlfZGVzYyA9IGVwX2Nob29zZShjZGV2LT5nYWRnZXQsCi0JCQkJCXJuZGlzLT5ocy5ub3RpZnksCi0JCQkJCXJuZGlzLT5mcy5ub3RpZnkpOwogCQl9Ci0JCXVzYl9lcF9lbmFibGUocm5kaXMtPm5vdGlmeSwgcm5kaXMtPm5vdGlmeV9kZXNjKTsKKwkJaWYgKCFybmRpcy0+bm90aWZ5LT5kZXNjKSB7CisJCQlWREJHKGNkZXYsICJpbml0IHJuZGlzIGN0cmwgJWRcbiIsIGludGYpOworCQkJaWYgKGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsIGYsIHJuZGlzLT5ub3RpZnkpKQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCQl1c2JfZXBfZW5hYmxlKHJuZGlzLT5ub3RpZnkpOwogCQlybmRpcy0+bm90aWZ5LT5kcml2ZXJfZGF0YSA9IHJuZGlzOwogCiAJfSBlbHNlIGlmIChpbnRmID09IHJuZGlzLT5kYXRhX2lkKSB7CkBAIC01MDEsMTIgKzU2OCwxNiBAQAogCQkJZ2V0aGVyX2Rpc2Nvbm5lY3QoJnJuZGlzLT5wb3J0KTsKIAkJfQogCi0JCWlmICghcm5kaXMtPnBvcnQuaW4pIHsKKwkJaWYgKCFybmRpcy0+cG9ydC5pbl9lcC0+ZGVzYyB8fCAhcm5kaXMtPnBvcnQub3V0X2VwLT5kZXNjKSB7CiAJCQlEQkcoY2RldiwgImluaXQgcm5kaXNcbiIpOwotCQkJcm5kaXMtPnBvcnQuaW4gPSBlcF9jaG9vc2UoY2Rldi0+Z2FkZ2V0LAotCQkJCQlybmRpcy0+aHMuaW4sIHJuZGlzLT5mcy5pbik7Ci0JCQlybmRpcy0+cG9ydC5vdXQgPSBlcF9jaG9vc2UoY2Rldi0+Z2FkZ2V0LAotCQkJCQlybmRpcy0+aHMub3V0LCBybmRpcy0+ZnMub3V0KTsKKwkJCWlmIChjb25maWdfZXBfYnlfc3BlZWQoY2Rldi0+Z2FkZ2V0LCBmLAorCQkJCQkgICAgICAgcm5kaXMtPnBvcnQuaW5fZXApIHx8CisJCQkgICAgY29uZmlnX2VwX2J5X3NwZWVkKGNkZXYtPmdhZGdldCwgZiwKKwkJCQkJICAgICAgIHJuZGlzLT5wb3J0Lm91dF9lcCkpIHsKKwkJCQlybmRpcy0+cG9ydC5pbl9lcC0+ZGVzYyA9IE5VTEw7CisJCQkJcm5kaXMtPnBvcnQub3V0X2VwLT5kZXNjID0gTlVMTDsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CiAJCX0KIAogCQkvKiBBdm9pZCBaTFBzOyB0aGV5IGNhbiBiZSB0cm91Ymxlc29tZS4gKi8KQEAgLTY2MiwxMyArNzMzLDYgQEAKIAlpZiAoIWYtPmRlc2NyaXB0b3JzKQogCQlnb3RvIGZhaWw7CiAKLQlybmRpcy0+ZnMuaW4gPSB1c2JfZmluZF9lbmRwb2ludChldGhfZnNfZnVuY3Rpb24sCi0JCQlmLT5kZXNjcmlwdG9ycywgJmZzX2luX2Rlc2MpOwotCXJuZGlzLT5mcy5vdXQgPSB1c2JfZmluZF9lbmRwb2ludChldGhfZnNfZnVuY3Rpb24sCi0JCQlmLT5kZXNjcmlwdG9ycywgJmZzX291dF9kZXNjKTsKLQlybmRpcy0+ZnMubm90aWZ5ID0gdXNiX2ZpbmRfZW5kcG9pbnQoZXRoX2ZzX2Z1bmN0aW9uLAotCQkJZi0+ZGVzY3JpcHRvcnMsICZmc19ub3RpZnlfZGVzYyk7Ci0KIAkvKiBzdXBwb3J0IGFsbCByZWxldmFudCBoYXJkd2FyZSBzcGVlZHMuLi4gd2UgZXhwZWN0IHRoYXQgd2hlbgogCSAqIGhhcmR3YXJlIGlzIGR1YWwgc3BlZWQsIGFsbCBidWxrLWNhcGFibGUgZW5kcG9pbnRzIHdvcmsgYXQKIAkgKiBib3RoIHNwZWVkcwpAQCAtNjgzLDE2ICs3NDcsMjIgQEAKIAogCQkvKiBjb3B5IGRlc2NyaXB0b3JzLCBhbmQgdHJhY2sgZW5kcG9pbnQgY29waWVzICovCiAJCWYtPmhzX2Rlc2NyaXB0b3JzID0gdXNiX2NvcHlfZGVzY3JpcHRvcnMoZXRoX2hzX2Z1bmN0aW9uKTsKLQogCQlpZiAoIWYtPmhzX2Rlc2NyaXB0b3JzKQogCQkJZ290byBmYWlsOworCX0KIAotCQlybmRpcy0+aHMuaW4gPSB1c2JfZmluZF9lbmRwb2ludChldGhfaHNfZnVuY3Rpb24sCi0JCQkJZi0+aHNfZGVzY3JpcHRvcnMsICZoc19pbl9kZXNjKTsKLQkJcm5kaXMtPmhzLm91dCA9IHVzYl9maW5kX2VuZHBvaW50KGV0aF9oc19mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJmhzX291dF9kZXNjKTsKLQkJcm5kaXMtPmhzLm5vdGlmeSA9IHVzYl9maW5kX2VuZHBvaW50KGV0aF9oc19mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJmhzX25vdGlmeV9kZXNjKTsKKwlpZiAoZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSkgeworCQlzc19pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJCWZzX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJc3Nfb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCQkJZnNfb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJc3Nfbm90aWZ5X2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCQkJZnNfbm90aWZ5X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKworCQkvKiBjb3B5IGRlc2NyaXB0b3JzLCBhbmQgdHJhY2sgZW5kcG9pbnQgY29waWVzICovCisJCWYtPnNzX2Rlc2NyaXB0b3JzID0gdXNiX2NvcHlfZGVzY3JpcHRvcnMoZXRoX3NzX2Z1bmN0aW9uKTsKKwkJaWYgKCFmLT5zc19kZXNjcmlwdG9ycykKKwkJCWdvdG8gZmFpbDsKIAl9CiAKIAlybmRpcy0+cG9ydC5vcGVuID0gcm5kaXNfb3BlbjsKQEAgLTcxOSwxMiArNzg5LDE1IEBACiAJICovCiAKIAlEQkcoY2RldiwgIlJORElTOiAlcyBzcGVlZCBJTi8lcyBPVVQvJXMgTk9USUZZLyVzXG4iLAorCQkJZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSA/ICJzdXBlciIgOgogCQkJZ2FkZ2V0X2lzX2R1YWxzcGVlZChjLT5jZGV2LT5nYWRnZXQpID8gImR1YWwiIDogImZ1bGwiLAogCQkJcm5kaXMtPnBvcnQuaW5fZXAtPm5hbWUsIHJuZGlzLT5wb3J0Lm91dF9lcC0+bmFtZSwKIAkJCXJuZGlzLT5ub3RpZnktPm5hbWUpOwogCXJldHVybiAwOwogCiBmYWlsOgorCWlmIChnYWRnZXRfaXNfc3VwZXJzcGVlZChjLT5jZGV2LT5nYWRnZXQpICYmIGYtPnNzX2Rlc2NyaXB0b3JzKQorCQl1c2JfZnJlZV9kZXNjcmlwdG9ycyhmLT5zc19kZXNjcmlwdG9ycyk7CiAJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSAmJiBmLT5oc19kZXNjcmlwdG9ycykKIAkJdXNiX2ZyZWVfZGVzY3JpcHRvcnMoZi0+aHNfZGVzY3JpcHRvcnMpOwogCWlmIChmLT5kZXNjcmlwdG9ycykKQEAgLTczOCw5ICs4MTEsOSBAQAogCS8qIHdlIG1pZ2h0IGFzIHdlbGwgcmVsZWFzZSBvdXIgY2xhaW1zIG9uIGVuZHBvaW50cyAqLwogCWlmIChybmRpcy0+bm90aWZ5KQogCQlybmRpcy0+bm90aWZ5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JaWYgKHJuZGlzLT5wb3J0Lm91dCkKKwlpZiAocm5kaXMtPnBvcnQub3V0X2VwLT5kZXNjKQogCQlybmRpcy0+cG9ydC5vdXRfZXAtPmRyaXZlcl9kYXRhID0gTlVMTDsKLQlpZiAocm5kaXMtPnBvcnQuaW4pCisJaWYgKHJuZGlzLT5wb3J0LmluX2VwLT5kZXNjKQogCQlybmRpcy0+cG9ydC5pbl9lcC0+ZHJpdmVyX2RhdGEgPSBOVUxMOwogCiAJRVJST1IoY2RldiwgIiVzOiBjYW4ndCBiaW5kLCBlcnIgJWRcbiIsIGYtPm5hbWUsIHN0YXR1cyk7CkBAIC03NTYsNiArODI5LDggQEAKIAlybmRpc19kZXJlZ2lzdGVyKHJuZGlzLT5jb25maWcpOwogCXJuZGlzX2V4aXQoKTsKIAorCWlmIChnYWRnZXRfaXNfc3VwZXJzcGVlZChjLT5jZGV2LT5nYWRnZXQpKQorCQl1c2JfZnJlZV9kZXNjcmlwdG9ycyhmLT5zc19kZXNjcmlwdG9ycyk7CiAJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSkKIAkJdXNiX2ZyZWVfZGVzY3JpcHRvcnMoZi0+aHNfZGVzY3JpcHRvcnMpOwogCXVzYl9mcmVlX2Rlc2NyaXB0b3JzKGYtPmRlc2NyaXB0b3JzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3NlcmlhbC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc2VyaWFsLmMKaW5kZXggNDkwYjAwYi4uOTFmZGY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc2VyaWFsLmMKQEAgLTI3LDE4ICsyNywxMCBAQAogICogaWYgeW91IGNhbiBhcnJhbmdlIGFwcHJvcHJpYXRlIGhvc3Qgc2lkZSBkcml2ZXJzLgogICovCiAKLXN0cnVjdCBnc2VyX2Rlc2NzIHsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmluOwotCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgkqb3V0OwotfTsKLQogc3RydWN0IGZfZ3NlciB7CiAJc3RydWN0IGdzZXJpYWwJCQlwb3J0OwogCXU4CQkJCWRhdGFfaWQ7CiAJdTgJCQkJcG9ydF9udW07Ci0KLQlzdHJ1Y3QgZ3Nlcl9kZXNjcwkJZnM7Ci0Jc3RydWN0IGdzZXJfZGVzY3MJCWhzOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZl9nc2VyICpmdW5jX3RvX2dzZXIoc3RydWN0IHVzYl9mdW5jdGlvbiAqZikKQEAgLTEzNiwxMiArMTI4LDE1IEBACiAJaWYgKGdzZXItPnBvcnQuaW4tPmRyaXZlcl9kYXRhKSB7CiAJCURCRyhjZGV2LCAicmVzZXQgZ2VuZXJpYyB0dHlHUyVkXG4iLCBnc2VyLT5wb3J0X251bSk7CiAJCWdzZXJpYWxfZGlzY29ubmVjdCgmZ3Nlci0+cG9ydCk7Ci0JfSBlbHNlIHsKKwl9CisJaWYgKCFnc2VyLT5wb3J0LmluLT5kZXNjIHx8ICFnc2VyLT5wb3J0Lm91dC0+ZGVzYykgewogCQlEQkcoY2RldiwgImFjdGl2YXRlIGdlbmVyaWMgdHR5R1MlZFxuIiwgZ3Nlci0+cG9ydF9udW0pOwotCQlnc2VyLT5wb3J0LmluX2Rlc2MgPSBlcF9jaG9vc2UoY2Rldi0+Z2FkZ2V0LAotCQkJCWdzZXItPmhzLmluLCBnc2VyLT5mcy5pbik7Ci0JCWdzZXItPnBvcnQub3V0X2Rlc2MgPSBlcF9jaG9vc2UoY2Rldi0+Z2FkZ2V0LAotCQkJCWdzZXItPmhzLm91dCwgZ3Nlci0+ZnMub3V0KTsKKwkJaWYgKCFjb25maWdfZXBfYnlfc3BlZWQoY2Rldi0+Z2FkZ2V0LCBmLCBnc2VyLT5wb3J0LmluKSB8fAorCQkgICAgIWNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsIGYsIGdzZXItPnBvcnQub3V0KSkgeworCQkJZ3Nlci0+cG9ydC5pbi0+ZGVzYyA9IE5VTEw7CisJCQlnc2VyLT5wb3J0Lm91dC0+ZGVzYyA9IE5VTEw7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCX0KIAlnc2VyaWFsX2Nvbm5lY3QoJmdzZXItPnBvcnQsIGdzZXItPnBvcnRfbnVtKTsKIAlyZXR1cm4gMDsKQEAgLTE5MywxMiArMTg4LDYgQEAKIAkvKiBjb3B5IGRlc2NyaXB0b3JzLCBhbmQgdHJhY2sgZW5kcG9pbnQgY29waWVzICovCiAJZi0+ZGVzY3JpcHRvcnMgPSB1c2JfY29weV9kZXNjcmlwdG9ycyhnc2VyX2ZzX2Z1bmN0aW9uKTsKIAotCWdzZXItPmZzLmluID0gdXNiX2ZpbmRfZW5kcG9pbnQoZ3Nlcl9mc19mdW5jdGlvbiwKLQkJCWYtPmRlc2NyaXB0b3JzLCAmZ3Nlcl9mc19pbl9kZXNjKTsKLQlnc2VyLT5mcy5vdXQgPSB1c2JfZmluZF9lbmRwb2ludChnc2VyX2ZzX2Z1bmN0aW9uLAotCQkJZi0+ZGVzY3JpcHRvcnMsICZnc2VyX2ZzX291dF9kZXNjKTsKLQotCiAJLyogc3VwcG9ydCBhbGwgcmVsZXZhbnQgaGFyZHdhcmUgc3BlZWRzLi4uIHdlIGV4cGVjdCB0aGF0IHdoZW4KIAkgKiBoYXJkd2FyZSBpcyBkdWFsIHNwZWVkLCBhbGwgYnVsay1jYXBhYmxlIGVuZHBvaW50cyB3b3JrIGF0CiAJICogYm90aCBzcGVlZHMKQEAgLTIxMSwxMSArMjAwLDYgQEAKIAogCQkvKiBjb3B5IGRlc2NyaXB0b3JzLCBhbmQgdHJhY2sgZW5kcG9pbnQgY29waWVzICovCiAJCWYtPmhzX2Rlc2NyaXB0b3JzID0gdXNiX2NvcHlfZGVzY3JpcHRvcnMoZ3Nlcl9oc19mdW5jdGlvbik7Ci0KLQkJZ3Nlci0+aHMuaW4gPSB1c2JfZmluZF9lbmRwb2ludChnc2VyX2hzX2Z1bmN0aW9uLAotCQkJCWYtPmhzX2Rlc2NyaXB0b3JzLCAmZ3Nlcl9oc19pbl9kZXNjKTsKLQkJZ3Nlci0+aHMub3V0ID0gdXNiX2ZpbmRfZW5kcG9pbnQoZ3Nlcl9oc19mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJmdzZXJfaHNfb3V0X2Rlc2MpOwogCX0KIAogCURCRyhjZGV2LCAiZ2VuZXJpYyB0dHlHUyVkOiAlcyBzcGVlZCBJTi8lcyBPVVQvJXNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zb3VyY2VzaW5rLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zb3VyY2VzaW5rLmMKaW5kZXggZTQwM2E1My4uZTE4YjRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc291cmNlc2luay5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3NvdXJjZXNpbmsuYwpAQCAtMTMxLDYgKzEzMSw0OSBAQAogCU5VTEwsCiB9OwogCisvKiBzdXBlciBzcGVlZCBzdXBwb3J0OiAqLworCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIHNzX3NvdXJjZV9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoMTAyNCksCit9OworCitzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzc19zb3VyY2VfY29tcF9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9TU19FUF9DT01QX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAorCS5iTWF4QnVyc3QgPQkJMCwKKwkuYm1BdHRyaWJ1dGVzID0JCTAsCisJLndCeXRlc1BlckludGVydmFsID0JMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3Nfc2lua19kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoMTAyNCksCit9OworCitzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzc19zaW5rX2NvbXBfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlVU0JfRFRfU1NfRVBfQ09NUF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCwKKwkuYk1heEJ1cnN0ID0JCTAsCisJLmJtQXR0cmlidXRlcyA9CQkwLAorCS53Qnl0ZXNQZXJJbnRlcnZhbCA9CTAsCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqc3Nfc291cmNlX3NpbmtfZGVzY3NbXSA9IHsKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc291cmNlX3NpbmtfaW50ZiwKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3Nfc291cmNlX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX3NvdXJjZV9jb21wX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX3NpbmtfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3Nfc2lua19jb21wX2Rlc2MsCisJTlVMTCwKK307CisKIC8qIGZ1bmN0aW9uLXNwZWNpZmljIHN0cmluZ3M6ICovCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3N0cmluZyBzdHJpbmdzX3NvdXJjZXNpbmtbXSA9IHsKQEAgLTE4Nyw4ICsyMzAsMTggQEAKIAkJZi0+aHNfZGVzY3JpcHRvcnMgPSBoc19zb3VyY2Vfc2lua19kZXNjczsKIAl9CiAKKwkvKiBzdXBwb3J0IHN1cGVyIHNwZWVkIGhhcmR3YXJlICovCisJaWYgKGdhZGdldF9pc19zdXBlcnNwZWVkKGMtPmNkZXYtPmdhZGdldCkpIHsKKwkJc3Nfc291cmNlX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCQkJZnNfc291cmNlX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJc3Nfc2lua19kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJCWZzX3NpbmtfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQlmLT5zc19kZXNjcmlwdG9ycyA9IHNzX3NvdXJjZV9zaW5rX2Rlc2NzOworCX0KKwogCURCRyhjZGV2LCAiJXMgc3BlZWQgJXM6IElOLyVzLCBPVVQvJXNcbiIsCi0JCQlnYWRnZXRfaXNfZHVhbHNwZWVkKGMtPmNkZXYtPmdhZGdldCkgPyAiZHVhbCIgOiAiZnVsbCIsCisJICAgIChnYWRnZXRfaXNfc3VwZXJzcGVlZChjLT5jZGV2LT5nYWRnZXQpID8gInN1cGVyIiA6CisJICAgICAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChjLT5jZGV2LT5nYWRnZXQpID8gImR1YWwiIDogImZ1bGwiKSksCiAJCQlmLT5uYW1lLCBzcy0+aW5fZXAtPm5hbWUsIHNzLT5vdXRfZXAtPm5hbWUpOwogCXJldHVybiAwOwogfQpAQCAtMzQzLDE1ICszOTYsMTQgQEAKIGVuYWJsZV9zb3VyY2Vfc2luayhzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYsIHN0cnVjdCBmX3NvdXJjZXNpbmsgKnNzKQogewogCWludAkJCQkJcmVzdWx0ID0gMDsKLQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKnNyYywgKnNpbms7CiAJc3RydWN0IHVzYl9lcAkJCQkqZXA7CiAKLQlzcmMgPSBlcF9jaG9vc2UoY2Rldi0+Z2FkZ2V0LCAmaHNfc291cmNlX2Rlc2MsICZmc19zb3VyY2VfZGVzYyk7Ci0Jc2luayA9IGVwX2Nob29zZShjZGV2LT5nYWRnZXQsICZoc19zaW5rX2Rlc2MsICZmc19zaW5rX2Rlc2MpOwotCiAJLyogb25lIGVuZHBvaW50IHdyaXRlcyAoc291cmNlcykgemVyb2VzIElOICh0byB0aGUgaG9zdCkgKi8KIAllcCA9IHNzLT5pbl9lcDsKLQlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlKGVwLCBzcmMpOworCXJlc3VsdCA9IGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsICYoc3MtPmZ1bmN0aW9uKSwgZXApOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisJcmVzdWx0ID0gdXNiX2VwX2VuYWJsZShlcCk7CiAJaWYgKHJlc3VsdCA8IDApCiAJCXJldHVybiByZXN1bHQ7CiAJZXAtPmRyaXZlcl9kYXRhID0gc3M7CkBAIC0zNjcsNyArNDE5LDEwIEBACiAKIAkvKiBvbmUgZW5kcG9pbnQgcmVhZHMgKHNpbmtzKSBhbnl0aGluZyBPVVQgKGZyb20gdGhlIGhvc3QpICovCiAJZXAgPSBzcy0+b3V0X2VwOwotCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUoZXAsIHNpbmspOworCXJlc3VsdCA9IGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsICYoc3MtPmZ1bmN0aW9uKSwgZXApOworCWlmIChyZXN1bHQpCisJCWdvdG8gZmFpbDsKKwlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlKGVwKTsKIAlpZiAocmVzdWx0IDwgMCkKIAkJZ290byBmYWlsOwogCWVwLT5kcml2ZXJfZGF0YSA9IHNzOwpAQCAtNDM1LDYgKzQ5MCw4IEBACiAJdTE2CQkJd192YWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CiAJdTE2CQkJd19sZW5ndGggPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKIAorCXJlcS0+bGVuZ3RoID0gVVNCX0JVRlNJWjsKKwogCS8qIGNvbXBvc2l0ZSBkcml2ZXIgaW5mcmFzdHJ1Y3R1cmUgaGFuZGxlcyBldmVyeXRoaW5nIGV4Y2VwdAogCSAqIHRoZSB0d28gY29udHJvbCB0ZXN0IHJlcXVlc3RzLgogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc3Vic2V0LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zdWJzZXQuYwppbmRleCA4Njc1Y2E0Li4zZGM1Mzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zdWJzZXQuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zdWJzZXQuYwpAQCAtNTcsMTggKzU3LDEwIEBACiAgKiBjYXJpbmcgYWJvdXQgc3BlY2lmaWMgcHJvZHVjdCBhbmQgdmVuZG9yIElEcy4KICAqLwogCi1zdHJ1Y3QgZ2V0aF9kZXNjcyB7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSppbjsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKm91dDsKLX07Ci0KIHN0cnVjdCBmX2dldGhlciB7CiAJc3RydWN0IGdldGhlcgkJCXBvcnQ7CiAKIAljaGFyCQkJCWV0aGFkZHJbMTRdOwotCi0Jc3RydWN0IGdldGhfZGVzY3MJCWZzOwotCXN0cnVjdCBnZXRoX2Rlc2NzCQloczsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGZfZ2V0aGVyICpmdW5jX3RvX2dldGgoc3RydWN0IHVzYl9mdW5jdGlvbiAqZikKQEAgLTIwOSw2ICsyMDEsNDYgQEAKIAlOVUxMLAogfTsKIAorLyogc3VwZXIgc3BlZWQgc3VwcG9ydDogKi8KKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBzc19zdWJzZXRfaW5fZGVzYyBfX2luaXRkYXRhID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoMTAyNCksCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIHNzX3N1YnNldF9vdXRfZGVzYyBfX2luaXRkYXRhID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoMTAyNCksCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3Nfc3Vic2V0X2J1bGtfY29tcF9kZXNjIF9faW5pdGRhdGEgPSB7CisJLmJMZW5ndGggPQkJc2l6ZW9mIHNzX3N1YnNldF9idWxrX2NvbXBfZGVzYywKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCisKKwkvKiB0aGUgZm9sbG93aW5nIDIgdmFsdWVzIGNhbiBiZSB0d2Vha2VkIGlmIG5lY2Vzc2FyeSAqLworCS8qIC5iTWF4QnVyc3QgPQkJMCwgKi8KKwkvKiAuYm1BdHRyaWJ1dGVzID0JMCwgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpzc19ldGhfZnVuY3Rpb25bXSBfX2luaXRkYXRhID0geworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzdWJzZXRfZGF0YV9pbnRmLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZtZGxtX2hlYWRlcl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZtZGxtX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJm1kbG1fZGV0YWlsX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmV0aGVyX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX3N1YnNldF9pbl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19zdWJzZXRfYnVsa19jb21wX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX3N1YnNldF9vdXRfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3Nfc3Vic2V0X2J1bGtfY29tcF9kZXNjLAorCU5VTEwsCit9OworCiAvKiBzdHJpbmcgZGVzY3JpcHRvcnM6ICovCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3N0cmluZyBnZXRoX3N0cmluZ19kZWZzW10gPSB7CkBAIC0yNDMsMTAgKzI3NSwxMiBAQAogCX0KIAogCURCRyhjZGV2LCAiaW5pdCArIGFjdGl2YXRlIGNkYyBzdWJzZXRcbiIpOwotCWdldGgtPnBvcnQuaW4gPSBlcF9jaG9vc2UoY2Rldi0+Z2FkZ2V0LAotCQkJZ2V0aC0+aHMuaW4sIGdldGgtPmZzLmluKTsKLQlnZXRoLT5wb3J0Lm91dCA9IGVwX2Nob29zZShjZGV2LT5nYWRnZXQsCi0JCQlnZXRoLT5ocy5vdXQsIGdldGgtPmZzLm91dCk7CisJaWYgKGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsIGYsIGdldGgtPnBvcnQuaW5fZXApIHx8CisJICAgIGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsIGYsIGdldGgtPnBvcnQub3V0X2VwKSkgeworCQlnZXRoLT5wb3J0LmluX2VwLT5kZXNjID0gTlVMTDsKKwkJZ2V0aC0+cG9ydC5vdXRfZXAtPmRlc2MgPSBOVUxMOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAluZXQgPSBnZXRoZXJfY29ubmVjdCgmZ2V0aC0+cG9ydCk7CiAJcmV0dXJuIElTX0VSUihuZXQpID8gUFRSX0VSUihuZXQpIDogMDsKQEAgLTI5NiwxMiArMzMwLDggQEAKIAogCS8qIGNvcHkgZGVzY3JpcHRvcnMsIGFuZCB0cmFjayBlbmRwb2ludCBjb3BpZXMgKi8KIAlmLT5kZXNjcmlwdG9ycyA9IHVzYl9jb3B5X2Rlc2NyaXB0b3JzKGZzX2V0aF9mdW5jdGlvbik7Ci0KLQlnZXRoLT5mcy5pbiA9IHVzYl9maW5kX2VuZHBvaW50KGZzX2V0aF9mdW5jdGlvbiwKLQkJCWYtPmRlc2NyaXB0b3JzLCAmZnNfc3Vic2V0X2luX2Rlc2MpOwotCWdldGgtPmZzLm91dCA9IHVzYl9maW5kX2VuZHBvaW50KGZzX2V0aF9mdW5jdGlvbiwKLQkJCWYtPmRlc2NyaXB0b3JzLCAmZnNfc3Vic2V0X291dF9kZXNjKTsKLQorCWlmICghZi0+ZGVzY3JpcHRvcnMpCisJCWdvdG8gZmFpbDsKIAogCS8qIHN1cHBvcnQgYWxsIHJlbGV2YW50IGhhcmR3YXJlIHNwZWVkcy4uLiB3ZSBleHBlY3QgdGhhdCB3aGVuCiAJICogaGFyZHdhcmUgaXMgZHVhbCBzcGVlZCwgYWxsIGJ1bGstY2FwYWJsZSBlbmRwb2ludHMgd29yayBhdApAQCAtMzE1LDExICszNDUsMjAgQEAKIAogCQkvKiBjb3B5IGRlc2NyaXB0b3JzLCBhbmQgdHJhY2sgZW5kcG9pbnQgY29waWVzICovCiAJCWYtPmhzX2Rlc2NyaXB0b3JzID0gdXNiX2NvcHlfZGVzY3JpcHRvcnMoaHNfZXRoX2Z1bmN0aW9uKTsKKwkJaWYgKCFmLT5oc19kZXNjcmlwdG9ycykKKwkJCWdvdG8gZmFpbDsKKwl9CiAKLQkJZ2V0aC0+aHMuaW4gPSB1c2JfZmluZF9lbmRwb2ludChoc19ldGhfZnVuY3Rpb24sCi0JCQkJZi0+aHNfZGVzY3JpcHRvcnMsICZoc19zdWJzZXRfaW5fZGVzYyk7Ci0JCWdldGgtPmhzLm91dCA9IHVzYl9maW5kX2VuZHBvaW50KGhzX2V0aF9mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJmhzX3N1YnNldF9vdXRfZGVzYyk7CisJaWYgKGdhZGdldF9pc19zdXBlcnNwZWVkKGMtPmNkZXYtPmdhZGdldCkpIHsKKwkJc3Nfc3Vic2V0X2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCQkJZnNfc3Vic2V0X2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJc3Nfc3Vic2V0X291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJCWZzX3N1YnNldF9vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCisJCS8qIGNvcHkgZGVzY3JpcHRvcnMsIGFuZCB0cmFjayBlbmRwb2ludCBjb3BpZXMgKi8KKwkJZi0+c3NfZGVzY3JpcHRvcnMgPSB1c2JfY29weV9kZXNjcmlwdG9ycyhzc19ldGhfZnVuY3Rpb24pOworCQlpZiAoIWYtPnNzX2Rlc2NyaXB0b3JzKQorCQkJZ290byBmYWlsOwogCX0KIAogCS8qIE5PVEU6ICBhbGwgdGhhdCBpcyBkb25lIHdpdGhvdXQga25vd2luZyBvciBjYXJpbmcgYWJvdXQKQEAgLTMyOCwxNSArMzY3LDIxIEBACiAJICovCiAKIAlEQkcoY2RldiwgIkNEQyBTdWJzZXQ6ICVzIHNwZWVkIElOLyVzIE9VVC8lc1xuIiwKKwkJCWdhZGdldF9pc19zdXBlcnNwZWVkKGMtPmNkZXYtPmdhZGdldCkgPyAic3VwZXIiIDoKIAkJCWdhZGdldF9pc19kdWFsc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSA/ICJkdWFsIiA6ICJmdWxsIiwKIAkJCWdldGgtPnBvcnQuaW5fZXAtPm5hbWUsIGdldGgtPnBvcnQub3V0X2VwLT5uYW1lKTsKIAlyZXR1cm4gMDsKIAogZmFpbDoKKwlpZiAoZi0+ZGVzY3JpcHRvcnMpCisJCXVzYl9mcmVlX2Rlc2NyaXB0b3JzKGYtPmRlc2NyaXB0b3JzKTsKKwlpZiAoZi0+aHNfZGVzY3JpcHRvcnMpCisJCXVzYl9mcmVlX2Rlc2NyaXB0b3JzKGYtPmhzX2Rlc2NyaXB0b3JzKTsKKwogCS8qIHdlIG1pZ2h0IGFzIHdlbGwgcmVsZWFzZSBvdXIgY2xhaW1zIG9uIGVuZHBvaW50cyAqLwotCWlmIChnZXRoLT5wb3J0Lm91dCkKKwlpZiAoZ2V0aC0+cG9ydC5vdXRfZXAtPmRlc2MpCiAJCWdldGgtPnBvcnQub3V0X2VwLT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JaWYgKGdldGgtPnBvcnQuaW4pCisJaWYgKGdldGgtPnBvcnQuaW5fZXAtPmRlc2MpCiAJCWdldGgtPnBvcnQuaW5fZXAtPmRyaXZlcl9kYXRhID0gTlVMTDsKIAogCUVSUk9SKGNkZXYsICIlczogY2FuJ3QgYmluZCwgZXJyICVkXG4iLCBmLT5uYW1lLCBzdGF0dXMpOwpAQCAtMzQ3LDYgKzM5Miw4IEBACiBzdGF0aWMgdm9pZAogZ2V0aF91bmJpbmQoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjLCBzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQogeworCWlmIChnYWRnZXRfaXNfc3VwZXJzcGVlZChjLT5jZGV2LT5nYWRnZXQpKQorCQl1c2JfZnJlZV9kZXNjcmlwdG9ycyhmLT5zc19kZXNjcmlwdG9ycyk7CiAJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSkKIAkJdXNiX2ZyZWVfZGVzY3JpcHRvcnMoZi0+aHNfZGVzY3JpcHRvcnMpOwogCXVzYl9mcmVlX2Rlc2NyaXB0b3JzKGYtPmRlc2NyaXB0b3JzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3V2Yy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdXZjLmMKaW5kZXggYmU0NDZiNy4uN2E4YjlhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdXZjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfdXZjLmMKQEAgLTI2Miw4ICsyNjIsMTAgQEAKIAkJaWYgKHV2Yy0+c3RhdGUgIT0gVVZDX1NUQVRFX0NPTk5FQ1RFRCkKIAkJCXJldHVybiAwOwogCi0JCWlmICh1dmMtPnZpZGVvLmVwKQotCQkJdXNiX2VwX2VuYWJsZSh1dmMtPnZpZGVvLmVwLCAmdXZjX3N0cmVhbWluZ19lcCk7CisJCWlmICh1dmMtPnZpZGVvLmVwKSB7CisJCQl1dmMtPnZpZGVvLmVwLT5kZXNjID0gJnV2Y19zdHJlYW1pbmdfZXA7CisJCQl1c2JfZXBfZW5hYmxlKHV2Yy0+dmlkZW8uZXApOworCQl9CiAKIAkJbWVtc2V0KCZ2NGwyX2V2ZW50LCAwLCBzaXplb2YodjRsMl9ldmVudCkpOwogCQl2NGwyX2V2ZW50LnR5cGUgPSBVVkNfRVZFTlRfU1RSRUFNT047CkBAIC02NDksNyArNjUxLDcgQEAKIAlpZiAocmV0KQogCQlrZnJlZSh1dmMpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIAogZXJyb3I6CiAJa2ZyZWUodXZjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwppbmRleCAwMzYwZjU2Li42MzllMTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCkBAIC05MjksNiArOTI5LDcgQEAKIAogCQljYXNlIFVTQl9EVF9ERVZJQ0U6CiAJCQlWREJHKGZzZywgImdldCBkZXZpY2UgZGVzY3JpcHRvclxuIik7CisJCQlkZXZpY2VfZGVzYy5iTWF4UGFja2V0U2l6ZTAgPSBmc2ctPmVwMC0+bWF4cGFja2V0OwogCQkJdmFsdWUgPSBzaXplb2YgZGV2aWNlX2Rlc2M7CiAJCQltZW1jcHkocmVxLT5idWYsICZkZXZpY2VfZGVzYywgdmFsdWUpOwogCQkJYnJlYWs7CkBAIC05MzYsNiArOTM3LDExIEBACiAJCQlWREJHKGZzZywgImdldCBkZXZpY2UgcXVhbGlmaWVyXG4iKTsKIAkJCWlmICghZ2FkZ2V0X2lzX2R1YWxzcGVlZChmc2ctPmdhZGdldCkpCiAJCQkJYnJlYWs7CisJCQkvKgorCQkJICogQXNzdW1lIGVwMCB1c2VzIHRoZSBzYW1lIG1heHBhY2tldCB2YWx1ZSBmb3IgYm90aAorCQkJICogc3BlZWRzCisJCQkgKi8KKwkJCWRldl9xdWFsaWZpZXIuYk1heFBhY2tldFNpemUwID0gZnNnLT5lcDAtPm1heHBhY2tldDsKIAkJCXZhbHVlID0gc2l6ZW9mIGRldl9xdWFsaWZpZXI7CiAJCQltZW1jcHkocmVxLT5idWYsICZkZXZfcXVhbGlmaWVyLCB2YWx1ZSk7CiAJCQlicmVhazsKQEAgLTI3MTMsNyArMjcxOSw4IEBACiAJaW50CXJjOwogCiAJZXAtPmRyaXZlcl9kYXRhID0gZnNnOwotCXJjID0gdXNiX2VwX2VuYWJsZShlcCwgZCk7CisJZXAtPmRlc2MgPSBkOworCXJjID0gdXNiX2VwX2VuYWJsZShlcCk7CiAJaWYgKHJjKQogCQlFUlJPUihmc2csICJjYW4ndCBlbmFibGUgJXMsIHJlc3VsdCAlZFxuIiwgZXAtPm5hbWUsIHJjKTsKIAlyZXR1cm4gcmM7CkBAIC0zNDE2LDcgKzM0MjMsNiBAQAogCX0KIAogCS8qIEZpeCB1cCB0aGUgZGVzY3JpcHRvcnMgKi8KLQlkZXZpY2VfZGVzYy5iTWF4UGFja2V0U2l6ZTAgPSBmc2ctPmVwMC0+bWF4cGFja2V0OwogCWRldmljZV9kZXNjLmlkVmVuZG9yID0gY3B1X3RvX2xlMTYobW9kX2RhdGEudmVuZG9yKTsKIAlkZXZpY2VfZGVzYy5pZFByb2R1Y3QgPSBjcHVfdG9fbGUxNihtb2RfZGF0YS5wcm9kdWN0KTsKIAlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBjcHVfdG9fbGUxNihtb2RfZGF0YS5yZWxlYXNlKTsKQEAgLTM0MzAsOSArMzQzNiw2IEBACiAJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSkgewogCQlmc2dfaHNfZnVuY3Rpb25baSArIEZTR19IU19GVU5DVElPTl9QUkVfRVBfRU5UUklFU10gPSBOVUxMOwogCi0JCS8qIEFzc3VtZSBlcDAgdXNlcyB0aGUgc2FtZSBtYXhwYWNrZXQgdmFsdWUgZm9yIGJvdGggc3BlZWRzICovCi0JCWRldl9xdWFsaWZpZXIuYk1heFBhY2tldFNpemUwID0gZnNnLT5lcDAtPm1heHBhY2tldDsKLQogCQkvKiBBc3N1bWUgZW5kcG9pbnQgYWRkcmVzc2VzIGFyZSB0aGUgc2FtZSBmb3IgYm90aCBzcGVlZHMgKi8KIAkJZnNnX2hzX2J1bGtfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KIAkJCWZzZ19mc19idWxrX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKQEAgLTM0ODYsNiArMzQ4OSw4IEBACiAJfQogCiAJSU5GTyhmc2csIERSSVZFUl9ERVNDICIsIHZlcnNpb246ICIgRFJJVkVSX1ZFUlNJT04gIlxuIik7CisJSU5GTyhmc2csICJOT1RFOiBUaGlzIGRyaXZlciBpcyBkZXByZWNhdGVkLiAgIgorCQkJIkNvbnNpZGVyIHVzaW5nIGdfbWFzc19zdG9yYWdlIGluc3RlYWQuXG4iKTsKIAlJTkZPKGZzZywgIk51bWJlciBvZiBMVU5zPSVkXG4iLCBmc2ctPm5sdW5zKTsKIAogCXBhdGhidWYgPSBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfcWVfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5jCmluZGV4IDNhNjhlMDkuLjNiZjg3MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfcWVfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYwpAQCAtMTkyNyw2ICsxOTI3LDEwIEBACiAJcmV0dXJuIC1FTk9UU1VQUDsKIH0KIAorc3RhdGljIGludCBmc2xfcWVfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCisJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKTsKK3N0YXRpYyBpbnQgZnNsX3FlX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpOworCiAvKiBkZWZpbmVkIGluIHVzYl9nYWRnZXQuaCAqLwogc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBxZV9nYWRnZXRfb3BzID0gewogCS5nZXRfZnJhbWUgPSBxZV9nZXRfZnJhbWUsCkBAIC0xOTM1LDYgKzE5MzksOCBAQAogCS52YnVzX3Nlc3Npb24gPSBxZV92YnVzX3Nlc3Npb24sCiAJLnZidXNfZHJhdyA9IHFlX3ZidXNfZHJhdywKIAkucHVsbHVwID0gcWVfcHVsbHVwLAorCS5zdGFydCA9IGZzbF9xZV9zdGFydCwKKwkuc3RvcCA9IGZzbF9xZV9zdG9wLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMzIwLDcgKzIzMjYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJR2FkZ2V0IGRyaXZlciBwcm9iZSBhbmQgdW5yZWdpc3Rlci4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgdXNiX2dhZGdldF9wcm9iZV9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCitzdGF0aWMgaW50IGZzbF9xZV9zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKIAkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpCiB7CiAJaW50IHJldHZhbDsKQEAgLTIzNjksOSArMjM3NSw4IEBACiAJCXVkY19jb250cm9sbGVyLT5nYWRnZXQubmFtZSwgZHJpdmVyLT5kcml2ZXIubmFtZSk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKTsKIAotaW50IHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCitzdGF0aWMgaW50IGZzbF9xZV9zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQogewogCXN0cnVjdCBxZV9lcCAqbG9vcF9lcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjQxMSw3ICsyNDE2LDYgQEAKIAkJCWRyaXZlci0+ZHJpdmVyLm5hbWUpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKIAogLyogdWRjIHN0cnVjdHVyZSdzIGFsbG9jIGFuZCBzZXR1cCwgaW5jbHVkZSBlcC1wYXJhbSBhbGxvYyAqLwogc3RhdGljIHN0cnVjdCBxZV91ZGMgX19kZXZpbml0ICpxZV91ZGNfY29uZmlnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQpAQCAtMjY2MiwxMSArMjY2NiwxNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyNjsKIAorCXJldCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmb2ZkZXYtPmRldiwgJnVkY19jb250cm9sbGVyLT5nYWRnZXQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyNzsKKwogCWRldl9pbmZvKHVkY19jb250cm9sbGVyLT5kZXYsCiAJCQkiJXMgVVNCIGNvbnRyb2xsZXIgaW5pdGlhbGl6ZWQgYXMgZGV2aWNlXG4iLAogCQkJKHVkY19jb250cm9sbGVyLT5zb2NfdHlwZSA9PSBQT1JUX1FFKSA/ICJRRSIgOiAiQ1BNIik7CiAJcmV0dXJuIDA7CiAKK2Vycjc6CisJZGV2aWNlX3VucmVnaXN0ZXIoJnVkY19jb250cm9sbGVyLT5nYWRnZXQuZGV2KTsKIGVycjY6CiAJZnJlZV9pcnEodWRjX2NvbnRyb2xsZXItPnVzYl9pcnEsIHVkY19jb250cm9sbGVyKTsKIGVycjU6CkBAIC0yNzIxLDYgKzI3MzEsOCBAQAogCWlmICghdWRjX2NvbnRyb2xsZXIpCiAJCXJldHVybiAtRU5PREVWOwogCisJdXNiX2RlbF9nYWRnZXRfdWRjKCZ1ZGNfY29udHJvbGxlci0+Z2FkZ2V0KTsKKwogCXVkY19jb250cm9sbGVyLT5kb25lID0gJmRvbmU7CiAJdGFza2xldF9kaXNhYmxlKCZ1ZGNfY29udHJvbGxlci0+cnhfdGFza2xldCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdWRjX2NvcmUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdWRjX2NvcmUuYwppbmRleCAyY2Q5YTYwLi5kZTI0YTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VkY19jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91ZGNfY29yZS5jCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogI2luY2x1ZGUgImZzbF91c2IyX3VkYy5oIgogCkBAIC0xMTgsNiArMTE3LDE3IEBACiAjZGVmaW5lIGZzbF9yZWFkbChwKQkJKCpfZnNsX3JlYWRsKSgocCkpCiAjZGVmaW5lIGZzbF93cml0ZWwodiwgcCkJKCpfZnNsX3dyaXRlbCkoKHYpLCAocCkpCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBmc2xfc2V0X2FjY2Vzc29ycyhzdHJ1Y3QgZnNsX3VzYjJfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJaWYgKHBkYXRhLT5iaWdfZW5kaWFuX21taW8pIHsKKwkJX2ZzbF9yZWFkbCA9IF9mc2xfcmVhZGxfYmU7CisJCV9mc2xfd3JpdGVsID0gX2ZzbF93cml0ZWxfYmU7CisJfSBlbHNlIHsKKwkJX2ZzbF9yZWFkbCA9IF9mc2xfcmVhZGxfbGU7CisJCV9mc2xfd3JpdGVsID0gX2ZzbF93cml0ZWxfbGU7CisJfQorfQorCiBzdGF0aWMgaW5saW5lIHUzMiBjcHVfdG9faGMzMihjb25zdCB1MzIgeCkKIHsKIAlyZXR1cm4gdWRjX2NvbnRyb2xsZXItPnBkYXRhLT5iaWdfZW5kaWFuX2Rlc2MKQEAgLTEzMiw2ICsxNDIsOCBAQAogCQk6IGxlMzJfdG9fY3B1KChfX2ZvcmNlIF9fbGUzMil4KTsKIH0KICNlbHNlIC8qICFDT05GSUdfUFBDMzIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc2xfc2V0X2FjY2Vzc29ycyhzdHJ1Y3QgZnNsX3VzYjJfcGxhdGZvcm1fZGF0YSAqcGRhdGEpIHt9CisKICNkZWZpbmUgZnNsX3JlYWRsKGFkZHIpCQlyZWFkbChhZGRyKQogI2RlZmluZSBmc2xfd3JpdGVsKHZhbDMyLCBhZGRyKSB3cml0ZWwodmFsMzIsIGFkZHIpCiAjZGVmaW5lIGNwdV90b19oYzMyKHgpCQljcHVfdG9fbGUzMih4KQpAQCAtMTIzMiw2ICsxMjQ0LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBmc2xfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCisJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKTsKK3N0YXRpYyBpbnQgZnNsX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpOwogLyogZGVmaW5lZCBpbiBnYWRnZXQuaCAqLwogc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBmc2xfZ2FkZ2V0X29wcyA9IHsKIAkuZ2V0X2ZyYW1lID0gZnNsX2dldF9mcmFtZSwKQEAgLTEyNDAsNiArMTI1NSw4IEBACiAJLnZidXNfc2Vzc2lvbiA9IGZzbF92YnVzX3Nlc3Npb24sCiAJLnZidXNfZHJhdyA9IGZzbF92YnVzX2RyYXcsCiAJLnB1bGx1cCA9IGZzbF9wdWxsdXAsCisJLnN0YXJ0ID0gZnNsX3N0YXJ0LAorCS5zdG9wID0gZnNsX3N0b3AsCiB9OwogCiAvKiBTZXQgcHJvdG9jb2wgc3RhbGwgb24gZXAwLCBwcm90b2NvbCBzdGFsbCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZApAQCAtMTI3Nyw2ICsxMjk0LDExIEBACiAJcmVxLT5yZXEuY29tcGxldGUgPSBOVUxMOwogCXJlcS0+ZHRkX2NvdW50ID0gMDsKIAorCXJlcS0+cmVxLmRtYSA9IGRtYV9tYXBfc2luZ2xlKGVwLT51ZGMtPmdhZGdldC5kZXYucGFyZW50LAorCQkJcmVxLT5yZXEuYnVmLCByZXEtPnJlcS5sZW5ndGgsCisJCQllcF9pc19pbihlcCkgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKKwlyZXEtPm1hcHBlZCA9IDE7CisKIAlpZiAoZnNsX3JlcV90b19kdGQocmVxKSA9PSAwKQogCQlmc2xfcXVldWVfdGQoZXAsIHJlcSk7CiAJZWxzZQpAQCAtMTM0OCw5ICsxMzcwLDYgQEAKIAkvKiBGaWxsIGluIHRoZSByZXFlc3Qgc3RydWN0dXJlICovCiAJKigodTE2ICopIHJlcS0+cmVxLmJ1ZikgPSBjcHVfdG9fbGUxNih0bXApOwogCi0JLyogZmx1c2ggY2FjaGUgZm9yIHRoZSByZXEgYnVmZmVyICovCi0JZmx1c2hfZGNhY2hlX3JhbmdlKCh1MzIpcmVxLT5yZXEuYnVmLCAodTMyKXJlcS0+cmVxLmJ1ZiArIDgpOwotCiAJcmVxLT5lcCA9IGVwOwogCXJlcS0+cmVxLmxlbmd0aCA9IDI7CiAJcmVxLT5yZXEuc3RhdHVzID0gLUVJTlBST0dSRVNTOwpAQCAtMTM1OCw2ICsxMzc3LDExIEBACiAJcmVxLT5yZXEuY29tcGxldGUgPSBOVUxMOwogCXJlcS0+ZHRkX2NvdW50ID0gMDsKIAorCXJlcS0+cmVxLmRtYSA9IGRtYV9tYXBfc2luZ2xlKGVwLT51ZGMtPmdhZGdldC5kZXYucGFyZW50LAorCQkJCXJlcS0+cmVxLmJ1ZiwgcmVxLT5yZXEubGVuZ3RoLAorCQkJCWVwX2lzX2luKGVwKSA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0UpOworCXJlcS0+bWFwcGVkID0gMTsKKwogCS8qIHByaW1lIHRoZSBkYXRhIHBoYXNlICovCiAJaWYgKChmc2xfcmVxX3RvX2R0ZChyZXEpID09IDApKQogCQlmc2xfcXVldWVfdGQoZXAsIHJlcSk7CkBAIC0xOTA4LDcgKzE5MzIsNyBAQAogICogSG9vayB0byBnYWRnZXQgZHJpdmVycwogICogQ2FsbGVkIGJ5IGluaXRpYWxpemF0aW9uIGNvZGUgb2YgZ2FkZ2V0IGRyaXZlcnMKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKK3N0YXRpYyBpbnQgZnNsX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAogCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKIHsKIAlpbnQgcmV0dmFsID0gLUVOT0RFVjsKQEAgLTE5NzYsMTAgKzIwMDAsOSBAQAogCQkgICAgICAgcmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcik7CiAKIC8qIERpc2Nvbm5lY3QgZnJvbSBnYWRnZXQgZHJpdmVyICovCi1pbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3N0YXRpYyBpbnQgZnNsX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IGZzbF9lcCAqbG9vcF9lcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjAyMiw3ICsyMDQ1LDYgQEAKIAkgICAgICAgZHJpdmVyLT5kcml2ZXIubmFtZSk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJUFJPQyBGaWxlIFN5c3RlbSBTdXBwb3J0CkBAIC0yMzU0LDcgKzIzNzYsNiBAQAogCQkJc3RydWN0IGZzbF9yZXEsIHJlcSk7CiAJLyogYWxsb2NhdGUgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IHRvIGdldCB2YWxpZCBhZGRyZXNzICovCiAJdWRjLT5zdGF0dXNfcmVxLT5yZXEuYnVmID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKLQl1ZGMtPnN0YXR1c19yZXEtPnJlcS5kbWEgPSB2aXJ0X3RvX3BoeXModWRjLT5zdGF0dXNfcmVxLT5yZXEuYnVmKTsKIAogCXVkYy0+cmVzdW1lX3N0YXRlID0gVVNCX1NUQVRFX05PVEFUVEFDSEVEOwogCXVkYy0+dXNiX3N0YXRlID0gVVNCX1NUQVRFX1BPV0VSRUQ7CkBAIC0yNDQ1LDcgKzI0NjYsNyBAQAogCX0KIAogCWlmIChwZGF0YS0+b3BlcmF0aW5nX21vZGUgPT0gRlNMX1VTQjJfRFJfREVWSUNFKSB7Ci0JCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEsCisJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKIAkJCQkJZHJpdmVyX25hbWUpKSB7CiAJCQlFUlIoInJlcXVlc3QgbWVtIHJlZ2lvbiBmb3IgJXMgZmFpbGVkXG4iLCBwZGV2LT5uYW1lKTsKIAkJCXJldCA9IC1FQlVTWTsKQEAgLTI0NzAsMTMgKzI0OTEsNyBAQAogCX0KIAogCS8qIFNldCBhY2Nlc3NvcnMgb25seSBhZnRlciBwZGF0YS0+aW5pdCgpICEgKi8KLQlpZiAocGRhdGEtPmJpZ19lbmRpYW5fbW1pbykgewotCQlfZnNsX3JlYWRsID0gX2ZzbF9yZWFkbF9iZTsKLQkJX2ZzbF93cml0ZWwgPSBfZnNsX3dyaXRlbF9iZTsKLQl9IGVsc2UgewotCQlfZnNsX3JlYWRsID0gX2ZzbF9yZWFkbF9sZTsKLQkJX2ZzbF93cml0ZWwgPSBfZnNsX3dyaXRlbF9sZTsKLQl9CisJZnNsX3NldF9hY2Nlc3NvcnMocGRhdGEpOwogCiAjaWZuZGVmIENPTkZJR19BUkNIX01YQwogCWlmIChwZGF0YS0+aGF2ZV9zeXNpZl9yZWdzKQpAQCAtMjU3OCw5ICsyNTkzLDE2IEBACiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CiAJfQorCisJcmV0ID0gdXNiX2FkZF9nYWRnZXRfdWRjKCZwZGV2LT5kZXYsICZ1ZGNfY29udHJvbGxlci0+Z2FkZ2V0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kZWxfdWRjOworCiAJY3JlYXRlX3Byb2NfZmlsZSgpOwogCXJldHVybiAwOwogCitlcnJfZGVsX3VkYzoKKwlkbWFfcG9vbF9kZXN0cm95KHVkY19jb250cm9sbGVyLT50ZF9wb29sKTsKIGVycl91bnJlZ2lzdGVyOgogCWRldmljZV91bnJlZ2lzdGVyKCZ1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldik7CiBlcnJfZnJlZV9pcnE6CkBAIC0yNTkzLDcgKzI2MTUsNyBAQAogCWlvdW5tYXAoZHJfcmVncyk7CiBlcnJfcmVsZWFzZV9tZW1fcmVnaW9uOgogCWlmIChwZGF0YS0+b3BlcmF0aW5nX21vZGUgPT0gRlNMX1VTQjJfRFJfREVWSUNFKQotCQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogZXJyX2tmcmVlOgogCWtmcmVlKHVkY19jb250cm9sbGVyKTsKIAl1ZGNfY29udHJvbGxlciA9IE5VTEw7CkBAIC0yNjEyLDYgKzI2MzQsOCBAQAogCiAJaWYgKCF1ZGNfY29udHJvbGxlcikKIAkJcmV0dXJuIC1FTk9ERVY7CisKKwl1c2JfZGVsX2dhZGdldF91ZGMoJnVkY19jb250cm9sbGVyLT5nYWRnZXQpOwogCXVkY19jb250cm9sbGVyLT5kb25lID0gJmRvbmU7CiAKIAlmc2xfdWRjX2Nsa19yZWxlYXNlKCk7CkBAIC0yNjI4LDcgKzI2NTIsNyBAQAogCWZyZWVfaXJxKHVkY19jb250cm9sbGVyLT5pcnEsIHVkY19jb250cm9sbGVyKTsKIAlpb3VubWFwKGRyX3JlZ3MpOwogCWlmIChwZGF0YS0+b3BlcmF0aW5nX21vZGUgPT0gRlNMX1VTQjJfRFJfREVWSUNFKQotCQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogCiAJZGV2aWNlX3VucmVnaXN0ZXIoJnVkY19jb250cm9sbGVyLT5nYWRnZXQuZGV2KTsKIAkvKiBmcmVlIHVkYyAtLXdhaXQgZm9yIHRoZSByZWxlYXNlKCkgZmluaXNoZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdXNiMzAwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1c2IzMDBfdWRjLmMKaW5kZXggNzYzZDQ2Mi4uMjRhOTI0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1c2IzMDBfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1c2IzMDBfdWRjLmMKQEAgLTc2Nyw1NiArNzY3LDYgQEAKIAl9IHdoaWxlICghcmVnKTsKIH0KIAotLyogd3JpdGUgZGF0YSB0byBmaWZvICovCi1zdGF0aWMgdm9pZCBmdXNiMzAwX3dyZmlmbyhzdHJ1Y3QgZnVzYjMwMF9lcCAqZXAsCi0JCQkgICBzdHJ1Y3QgZnVzYjMwMF9yZXF1ZXN0ICpyZXEpCi17Ci0JaW50IGkgPSAwOwotCXU4ICp0bXA7Ci0JdTMyIGRhdGEsIHJlZzsKLQlzdHJ1Y3QgZnVzYjMwMCAqZnVzYjMwMCA9IGVwLT5mdXNiMzAwOwotCi0JdG1wID0gcmVxLT5yZXEuYnVmOwotCXJlcS0+cmVxLmFjdHVhbCA9IHJlcS0+cmVxLmxlbmd0aDsKLQotCWZvciAoaSA9IChyZXEtPnJlcS5sZW5ndGggPj4gMik7IGkgPiAwOyBpLS0pIHsKLQkJZGF0YSA9ICp0bXAgfCAqKHRtcCArIDEpIDw8IDggfAotCQkJKih0bXAgKyAyKSA8PCAxNiB8ICoodG1wICsgMykgPDwgMjQ7Ci0KLQkJaW93cml0ZTMyKGRhdGEsIGZ1c2IzMDAtPnJlZyArCi0JCQlGVVNCMzAwX09GRlNFVF9FUFBPUlQoZXAtPmVwbnVtKSk7Ci0JCXRtcCArPSA0OwotCX0KLQotCXN3aXRjaCAocmVxLT5yZXEubGVuZ3RoICUgNCkgewotCWNhc2UgMToKLQkJZGF0YSA9ICp0bXA7Ci0JCWlvd3JpdGUzMihkYXRhLCBmdXNiMzAwLT5yZWcgKwotCQkJRlVTQjMwMF9PRkZTRVRfRVBQT1JUKGVwLT5lcG51bSkpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWRhdGEgPSAqdG1wIHwgKih0bXAgKyAxKSA8PCA4OwotCQlpb3dyaXRlMzIoZGF0YSwgZnVzYjMwMC0+cmVnICsKLQkJCUZVU0IzMDBfT0ZGU0VUX0VQUE9SVChlcC0+ZXBudW0pKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlkYXRhID0gKnRtcCB8ICoodG1wICsgMSkgPDwgOCB8ICoodG1wICsgMikgPDwgMTY7Ci0JCWlvd3JpdGUzMihkYXRhLCBmdXNiMzAwLT5yZWcgKwotCQkJRlVTQjMwMF9PRkZTRVRfRVBQT1JUKGVwLT5lcG51bSkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlkbyB7Ci0JCXJlZyA9IGlvcmVhZDMyKGZ1c2IzMDAtPnJlZyArIEZVU0IzMDBfT0ZGU0VUX0lHUjEpOwotCQlyZWcgJj0gRlVTQjMwMF9JR1IxX1NZTkYwX0VNUFRZX0lOVDsKLQkJaWYgKGkpCi0JCQlwcmludGsoS0VSTl9JTkZPInN5bmMgZmlmbyBpcyBub3QgZW1wdHkhXG4iKTsKLQkJaSsrOwotCX0gd2hpbGUgKCFyZWcpOwotfQotCiBzdGF0aWMgdTggZnVzYjMwMF9nZXRfZXBuc3RhbGwoc3RydWN0IGZ1c2IzMDAgKmZ1c2IzMDAsIHU4IGVwKQogewogCXU4IHZhbHVlOwpAQCAtOTgwLDExICs5MzAsNiBAQAogCQl9IFwKIAl9IHdoaWxlICgwKQogCi1zdGF0aWMgdm9pZCBmdXNiMzAwX2VwMF9jb21wbGV0ZShzdHJ1Y3QgdXNiX2VwICplcCwKLQkJCQlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKLXsKLX0KLQogc3RhdGljIGludCBzZXR1cF9wYWNrZXQoc3RydWN0IGZ1c2IzMDAgKmZ1c2IzMDAsIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCiB7CiAJdTggKnAgPSAodTggKiljdHJsOwpAQCAtMTAyOSwxNyArOTc0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBmdXNiMzAwX3NldF9lcF9ieWNudChzdHJ1Y3QgZnVzYjMwMF9lcCAqZXAsIHUzMiBieWNudCkKLXsKLQlzdHJ1Y3QgZnVzYjMwMCAqZnVzYjMwMCA9IGVwLT5mdXNiMzAwOwotCXUzMiByZWcgPSBpb3JlYWQzMihmdXNiMzAwLT5yZWcgKyBGVVNCMzAwX09GRlNFVF9FUEZGUihlcC0+ZXBudW0pKTsKLQotCXJlZyAmPSB+RlVTQjMwMF9GRlJfQllDTlQ7Ci0JcmVnIHw9IGJ5Y250ICYgRlVTQjMwMF9GRlJfQllDTlQ7Ci0KLQlpb3dyaXRlMzIocmVnLCBmdXNiMzAwLT5yZWcgKyBGVVNCMzAwX09GRlNFVF9FUEZGUihlcC0+ZXBudW0pKTsKLX0KLQogc3RhdGljIHZvaWQgZG9uZShzdHJ1Y3QgZnVzYjMwMF9lcCAqZXAsIHN0cnVjdCBmdXNiMzAwX3JlcXVlc3QgKnJlcSwKIAkJIGludCBzdGF0dXMpCiB7CkBAIC0xMDYzLDggKzk5Nyw4IEBACiAJCWZ1c2IzMDBfc2V0X2N4ZG9uZShlcC0+ZnVzYjMwMCk7CiB9CiAKLXZvaWQgZnVzYjMwMF9maWxsX2lkbWFfcHJkdGJsKHN0cnVjdCBmdXNiMzAwX2VwICplcCwKLQkJCXN0cnVjdCBmdXNiMzAwX3JlcXVlc3QgKnJlcSkKK3N0YXRpYyB2b2lkIGZ1c2IzMDBfZmlsbF9pZG1hX3ByZHRibChzdHJ1Y3QgZnVzYjMwMF9lcCAqZXAsIGRtYV9hZGRyX3QgZCwKKwkJdTMyIGxlbikKIHsKIAl1MzIgdmFsdWU7CiAJdTMyIHJlZzsKQEAgLTEwNzYsMTAgKzEwMTAsOSBAQAogCQlyZWcgJj0gRlVTQjMwMF9FUFBSRDBfSDsKIAl9IHdoaWxlIChyZWcpOwogCi0JaW93cml0ZTMyKCh1MzIpIHJlcS0+cmVxLmJ1ZiwgZXAtPmZ1c2IzMDAtPnJlZyArCi0JCUZVU0IzMDBfT0ZGU0VUX0VQUFJEX1cxKGVwLT5lcG51bSkpOworCWlvd3JpdGUzMihkLCBlcC0+ZnVzYjMwMC0+cmVnICsgRlVTQjMwMF9PRkZTRVRfRVBQUkRfVzEoZXAtPmVwbnVtKSk7CiAKLQl2YWx1ZSA9IEZVU0IzMDBfRVBQUkQwX0JUQyhyZXEtPnJlcS5sZW5ndGgpIHwgRlVTQjMwMF9FUFBSRDBfSCB8CisJdmFsdWUgPSBGVVNCMzAwX0VQUFJEMF9CVEMobGVuKSB8IEZVU0IzMDBfRVBQUkQwX0ggfAogCQlGVVNCMzAwX0VQUFJEMF9GIHwgRlVTQjMwMF9FUFBSRDBfTCB8IEZVU0IzMDBfRVBQUkQwX0k7CiAJaW93cml0ZTMyKHZhbHVlLCBlcC0+ZnVzYjMwMC0+cmVnICsgRlVTQjMwMF9PRkZTRVRfRVBQUkRfVzAoZXAtPmVwbnVtKSk7CiAKQEAgLTExMTYsMTMgKzEwNDksMTIgQEAKIAkJCXN0cnVjdCBmdXNiMzAwX3JlcXVlc3QgKnJlcSkKIHsKIAlkbWFfYWRkcl90IGQ7Ci0JdTggKnRtcCA9IE5VTEw7CiAKIAlkID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgcmVxLT5yZXEuYnVmLCByZXEtPnJlcS5sZW5ndGgsIERNQV9UT19ERVZJQ0UpOwogCiAJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKE5VTEwsIGQpKSB7Ci0JCWtmcmVlKHJlcS0+cmVxLmJ1Zik7CiAJCXByaW50ayhLRVJOX0RFQlVHICJkbWFfbWFwcGluZ19lcnJvclxuIik7CisJCXJldHVybjsKIAl9CiAKIAlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShOVUxMLCBkLCByZXEtPnJlcS5sZW5ndGgsIERNQV9UT19ERVZJQ0UpOwpAQCAtMTEzMCwxNyArMTA2MiwxMSBAQAogCWZ1c2IzMDBfZW5hYmxlX2JpdChlcC0+ZnVzYjMwMCwgRlVTQjMwMF9PRkZTRVRfSUdFUjAsCiAJCUZVU0IzMDBfSUdFUjBfRUVQbl9QUkRfSU5UKGVwLT5lcG51bSkpOwogCi0JdG1wID0gcmVxLT5yZXEuYnVmOwotCXJlcS0+cmVxLmJ1ZiA9ICh1OCAqKWQ7Ci0KLQlmdXNiMzAwX2ZpbGxfaWRtYV9wcmR0YmwoZXAsIHJlcSk7CisJZnVzYjMwMF9maWxsX2lkbWFfcHJkdGJsKGVwLCBkLCByZXEtPnJlcS5sZW5ndGgpOwogCS8qIGNoZWNrIGlkbWEgaXMgZG9uZSAqLwogCWZ1c2IzMDBfd2FpdF9pZG1hX2ZpbmlzaGVkKGVwKTsKIAotCXJlcS0+cmVxLmJ1ZiA9IHRtcDsKLQotCWlmIChkKQotCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIGQsIHJlcS0+cmVxLmxlbmd0aCwgRE1BX1RPX0RFVklDRSk7CisJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBkLCByZXEtPnJlcS5sZW5ndGgsIERNQV9UT19ERVZJQ0UpOwogfQogCiBzdGF0aWMgdm9pZCBpbl9lcF9maWZvX2hhbmRsZXIoc3RydWN0IGZ1c2IzMDBfZXAgKmVwKQpAQCAtMTE0OCwxNCArMTA3NCw4IEBACiAJc3RydWN0IGZ1c2IzMDBfcmVxdWVzdCAqcmVxID0gbGlzdF9lbnRyeShlcC0+cXVldWUubmV4dCwKIAkJCQkJc3RydWN0IGZ1c2IzMDBfcmVxdWVzdCwgcXVldWUpOwogCi0JaWYgKHJlcS0+cmVxLmxlbmd0aCkgewotI2lmIDAKLQkJZnVzYjMwMF9zZXRfZXBfYnljbnQoZXAsIHJlcS0+cmVxLmxlbmd0aCk7Ci0JCWZ1c2IzMDBfd3JmaWZvKGVwLCByZXEpOwotI2Vsc2UKKwlpZiAocmVxLT5yZXEubGVuZ3RoKQogCQlmdXNiMzAwX3NldF9pZG1hKGVwLCByZXEpOwotI2VuZGlmCi0JfQogCWRvbmUoZXAsIHJlcSwgMCk7CiB9CiAKQEAgLTE1MDAsNyArMTQyMCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgc3RydWN0IGZ1c2IzMDAgKnRoZV9jb250cm9sbGVyOwogCi1pbnQgdXNiX2dhZGdldF9wcm9iZV9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCitzdGF0aWMgaW50IGZ1c2IzMDBfdWRjX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAogCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKIHsKIAlzdHJ1Y3QgZnVzYjMwMCAqZnVzYjMwMCA9IHRoZV9jb250cm9sbGVyOwpAQCAtMTU0NCw5ICsxNDY0LDggQEAKIAogCXJldHVybiByZXR2YWw7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKTsKIAotaW50IHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCitzdGF0aWMgaW50IGZ1c2IzMDBfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IGZ1c2IzMDAgKmZ1c2IzMDAgPSB0aGVfY29udHJvbGxlcjsKIApAQCAtMTU2Miw3ICsxNDgxLDYgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgaW50IGZ1c2IzMDBfdWRjX3B1bGx1cChzdHJ1Y3QgdXNiX2dhZGdldCAqX2dhZGdldCwgaW50IGlzX2FjdGl2ZSkKQEAgLTE1NzIsMTIgKzE0OTAsMTUgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBmdXNiMzAwX2dhZGdldF9vcHMgPSB7CiAJLnB1bGx1cAkJPSBmdXNiMzAwX3VkY19wdWxsdXAsCisJLnN0YXJ0CQk9IGZ1c2IzMDBfdWRjX3N0YXJ0LAorCS5zdG9wCQk9IGZ1c2IzMDBfdWRjX3N0b3AsCiB9OwogCiBzdGF0aWMgaW50IF9fZXhpdCBmdXNiMzAwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBmdXNiMzAwICpmdXNiMzAwID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwogCisJdXNiX2RlbF9nYWRnZXRfdWRjKCZmdXNiMzAwLT5nYWRnZXQpOwogCWlvdW5tYXAoZnVzYjMwMC0+cmVnKTsKIAlmcmVlX2lycShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCBmdXNiMzAwKTsKIApAQCAtMTcwMiw5ICsxNjIzLDE1IEBACiAJCWdvdG8gY2xlYW5fdXAzOwogCiAJaW5pdF9jb250cm9sbGVyKGZ1c2IzMDApOworCXJldCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmcGRldi0+ZGV2LCAmZnVzYjMwMC0+Z2FkZ2V0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9hZGRfdWRjOworCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgInZlcnNpb24gJXNcbiIsIERSSVZFUl9WRVJTSU9OKTsKIAogCXJldHVybiAwOworZXJyX2FkZF91ZGM6CisJZnVzYjMwMF9mcmVlX3JlcXVlc3QoJmZ1c2IzMDAtPmVwWzBdLT5lcCwgZnVzYjMwMC0+ZXAwX3JlcSk7CiAKIGNsZWFuX3VwMzoKIAlmcmVlX2lycShpcmVzLT5zdGFydCwgZnVzYjMwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ19mZnMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nX2Zmcy5jCmluZGV4IGViZjY5NzAuLjcwNGMyODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9nX2Zmcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nX2Zmcy5jCkBAIC0xNjIsNiArMTYyLDcgQEAKIAkubmFtZQkJPSBEUklWRVJfTkFNRSwKIAkuZGV2CQk9ICZnZnNfZGV2X2Rlc2MsCiAJLnN0cmluZ3MJPSBnZnNfZGV2X3N0cmluZ3MsCisJLm1heF9zcGVlZAk9IFVTQl9TUEVFRF9ISUdILAogCS51bmJpbmQJCT0gZ2ZzX3VuYmluZCwKIAkuaVByb2R1Y3QJPSBEUklWRVJfREVTQywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ2FkZ2V0X2NoaXBzLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ2FkZ2V0X2NoaXBzLmgKaW5kZXggYmNkYWM3Yy4uZjNhODNjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dhZGdldF9jaGlwcy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nYWRnZXRfY2hpcHMuaApAQCAtMTUsMTUwICsxNSw0MCBAQAogI2lmbmRlZiBfX0dBREdFVF9DSElQU19ICiAjZGVmaW5lIF9fR0FER0VUX0NISVBTX0gKIAotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX05FVDIyODAKLSNkZWZpbmUJZ2FkZ2V0X2lzX25ldDIyODAoZykJIXN0cmNtcCgibmV0MjI4MCIsIChnKS0+bmFtZSkKLSNlbHNlCi0jZGVmaW5lCWdhZGdldF9pc19uZXQyMjgwKGcpCTAKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfQU1ENTUzNlVEQwotI2RlZmluZQlnYWRnZXRfaXNfYW1kNTUzNnVkYyhnKQkhc3RyY21wKCJhbWQ1NTM2dWRjIiwgKGcpLT5uYW1lKQotI2Vsc2UKLSNkZWZpbmUJZ2FkZ2V0X2lzX2FtZDU1MzZ1ZGMoZykJMAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9EVU1NWV9IQ0QKLSNkZWZpbmUJZ2FkZ2V0X2lzX2R1bW15KGcpCSFzdHJjbXAoImR1bW15X3VkYyIsIChnKS0+bmFtZSkKLSNlbHNlCi0jZGVmaW5lCWdhZGdldF9pc19kdW1teShnKQkwCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX1BYQTI1WAotI2RlZmluZQlnYWRnZXRfaXNfcHhhKGcpCSFzdHJjbXAoInB4YTI1eF91ZGMiLCAoZyktPm5hbWUpCi0jZWxzZQotI2RlZmluZQlnYWRnZXRfaXNfcHhhKGcpCTAKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfR09LVQotI2RlZmluZQlnYWRnZXRfaXNfZ29rdShnKQkhc3RyY21wKCJnb2t1X3VkYyIsIChnKS0+bmFtZSkKLSNlbHNlCi0jZGVmaW5lCWdhZGdldF9pc19nb2t1KGcpCTAKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfT01BUAotI2RlZmluZQlnYWRnZXRfaXNfb21hcChnKQkhc3RyY21wKCJvbWFwX3VkYyIsIChnKS0+bmFtZSkKLSNlbHNlCi0jZGVmaW5lCWdhZGdldF9pc19vbWFwKGcpCTAKLSNlbmRpZgotCi0vKiB2YXJpb3VzIHVuc3RhYmxlIHZlcnNpb25zIGF2YWlsYWJsZSAqLwotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX1BYQTI3WAotI2RlZmluZQlnYWRnZXRfaXNfcHhhMjd4KGcpCSFzdHJjbXAoInB4YTI3eF91ZGMiLCAoZyktPm5hbWUpCi0jZWxzZQotI2RlZmluZQlnYWRnZXRfaXNfcHhhMjd4KGcpCTAKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfQVRNRUxfVVNCQQotI2RlZmluZSBnYWRnZXRfaXNfYXRtZWxfdXNiYShnKQkhc3RyY21wKCJhdG1lbF91c2JhX3VkYyIsIChnKS0+bmFtZSkKLSNlbHNlCi0jZGVmaW5lIGdhZGdldF9pc19hdG1lbF91c2JhKGcpCTAKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfUzNDMjQxMAotI2RlZmluZSBnYWRnZXRfaXNfczNjMjQxMChnKSAgICAhc3RyY21wKCJzM2MyNDEwX3VkYyIsIChnKS0+bmFtZSkKLSNlbHNlCi0jZGVmaW5lIGdhZGdldF9pc19zM2MyNDEwKGcpICAgIDAKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfQVQ5MQotI2RlZmluZSBnYWRnZXRfaXNfYXQ5MShnKQkhc3RyY21wKCJhdDkxX3VkYyIsIChnKS0+bmFtZSkKLSNlbHNlCi0jZGVmaW5lIGdhZGdldF9pc19hdDkxKGcpCTAKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfSU1YCi0jZGVmaW5lIGdhZGdldF9pc19pbXgoZykJIXN0cmNtcCgiaW14X3VkYyIsIChnKS0+bmFtZSkKLSNlbHNlCi0jZGVmaW5lIGdhZGdldF9pc19pbXgoZykJMAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9GU0xfVVNCMgotI2RlZmluZSBnYWRnZXRfaXNfZnNsX3VzYjIoZykJIXN0cmNtcCgiZnNsLXVzYjItdWRjIiwgKGcpLT5uYW1lKQotI2Vsc2UKLSNkZWZpbmUgZ2FkZ2V0X2lzX2ZzbF91c2IyKGcpCTAKLSNlbmRpZgotCi0vKiBNZW50b3IgaGlnaCBzcGVlZCAiZHVhbCByb2xlIiBjb250cm9sbGVyLCBpbiBwZXJpcGhlcmFsIHJvbGUgKi8KLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMKLSNkZWZpbmUgZ2FkZ2V0X2lzX211c2JoZHJjKGcpCSFzdHJjbXAoIm11c2ItaGRyYyIsIChnKS0+bmFtZSkKLSNlbHNlCi0jZGVmaW5lIGdhZGdldF9pc19tdXNiaGRyYyhnKQkwCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0xBTkdXRUxMCi0jZGVmaW5lIGdhZGdldF9pc19sYW5nd2VsbChnKQkoIXN0cmNtcCgibGFuZ3dlbGxfdWRjIiwgKGcpLT5uYW1lKSkKLSNlbHNlCi0jZGVmaW5lIGdhZGdldF9pc19sYW5nd2VsbChnKQkwCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX002NjU5MgotI2RlZmluZQlnYWRnZXRfaXNfbTY2NTkyKGcpCSFzdHJjbXAoIm02NjU5Ml91ZGMiLCAoZyktPm5hbWUpCi0jZWxzZQotI2RlZmluZQlnYWRnZXRfaXNfbTY2NTkyKGcpCTAKLSNlbmRpZgotCi0vKiBGcmVlc2NhbGUgQ1BNL1FFIFVEQyBTVVBQT1JUICovCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfRlNMX1FFCi0jZGVmaW5lIGdhZGdldF9pc19mc2xfcWUoZykJIXN0cmNtcCgiZnNsX3FlX3VkYyIsIChnKS0+bmFtZSkKLSNlbHNlCi0jZGVmaW5lIGdhZGdldF9pc19mc2xfcWUoZykJMAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9DSTEzWFhYX1BDSQotI2RlZmluZSBnYWRnZXRfaXNfY2kxM3h4eF9wY2koZykJKCFzdHJjbXAoImNpMTN4eHhfcGNpIiwgKGcpLT5uYW1lKSkKLSNlbHNlCi0jZGVmaW5lIGdhZGdldF9pc19jaTEzeHh4X3BjaShnKQkwCi0jZW5kaWYKLQotLy8gQ09ORklHX1VTQl9HQURHRVRfU1gyCi0vLyBDT05GSUdfVVNCX0dBREdFVF9BVTFYMDAKLS8vIC4uLgotCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfUjhBNjY1OTcKLSNkZWZpbmUJZ2FkZ2V0X2lzX3I4YTY2NTk3KGcpCSFzdHJjbXAoInI4YTY2NTk3X3VkYyIsIChnKS0+bmFtZSkKLSNlbHNlCi0jZGVmaW5lCWdhZGdldF9pc19yOGE2NjU5NyhnKQkwCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19VU0JfUzNDX0hTT1RHCi0jZGVmaW5lIGdhZGdldF9pc19zM2NfaHNvdGcoZykgICAgKCFzdHJjbXAoInMzYy1oc290ZyIsIChnKS0+bmFtZSkpCi0jZWxzZQotI2RlZmluZSBnYWRnZXRfaXNfczNjX2hzb3RnKGcpICAgIDAKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1VTQl9TM0NfSFNVREMKLSNkZWZpbmUgZ2FkZ2V0X2lzX3MzY19oc3VkYyhnKSAoIXN0cmNtcCgiczNjLWhzdWRjIiwgKGcpLT5uYW1lKSkKLSNlbHNlCi0jZGVmaW5lIGdhZGdldF9pc19zM2NfaHN1ZGMoZykgMAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9FRzIwVAotI2RlZmluZQlnYWRnZXRfaXNfcGNoKGcpCSghc3RyY21wKCJwY2hfdWRjIiwgKGcpLT5uYW1lKSkKLSNlbHNlCi0jZGVmaW5lCWdhZGdldF9pc19wY2goZykJMAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9DSTEzWFhYX01TTQorLyoKKyAqIE5PVElDRTogdGhlIGVudHJpZXMgYmVsb3cgYXJlIGFscGhhYmV0aWNhbCBhbmQgc2hvdWxkIGJlIGtlcHQKKyAqIHRoYXQgd2F5LgorICoKKyAqIEFsd2F5cyBiZSBzdXJlIHRvIGFkZCBuZXcgZW50cmllcyB0byB0aGUgY29ycmVjdCBwb3NpdGlvbiBvcgorICogYWNjZXB0IHRoZSBiYXNoaW5nIGxhdGVyLgorICoKKyAqIElmIHlvdSBoYXZlIGZvcmdvdHRlbiB0aGUgYWxwaGFiZXRpY2FsIG9yZGVyIGxldCBWSU0vRU1BQ1MKKyAqIGRvIHRoYXQgZm9yIHlvdS4KKyAqLworI2RlZmluZSBnYWRnZXRfaXNfYW1kNTUzNnVkYyhnKQkJKCFzdHJjbXAoImFtZDU1MzZ1ZGMiLCAoZyktPm5hbWUpKQorI2RlZmluZSBnYWRnZXRfaXNfYXQ5MShnKQkJKCFzdHJjbXAoImF0OTFfdWRjIiwgKGcpLT5uYW1lKSkKKyNkZWZpbmUgZ2FkZ2V0X2lzX2F0bWVsX3VzYmEoZykJCSghc3RyY21wKCJhdG1lbF91c2JhX3VkYyIsIChnKS0+bmFtZSkpCiAjZGVmaW5lIGdhZGdldF9pc19jaTEzeHh4X21zbShnKQkoIXN0cmNtcCgiY2kxM3h4eF9tc20iLCAoZyktPm5hbWUpKQotI2Vsc2UKLSNkZWZpbmUgZ2FkZ2V0X2lzX2NpMTN4eHhfbXNtKGcpCTAKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfUkVORVNBU19VU0JIUwotI2RlZmluZQlnYWRnZXRfaXNfcmVuZXNhc191c2JocyhnKSAoIXN0cmNtcCgicmVuZXNhc191c2Joc191ZGMiLCAoZyktPm5hbWUpKQotI2Vsc2UKLSNkZWZpbmUJZ2FkZ2V0X2lzX3JlbmVzYXNfdXNiaHMoZykgMAotI2VuZGlmCisjZGVmaW5lIGdhZGdldF9pc19jaTEzeHh4X3BjaShnKQkoIXN0cmNtcCgiY2kxM3h4eF9wY2kiLCAoZyktPm5hbWUpKQorI2RlZmluZSBnYWRnZXRfaXNfZHVtbXkoZykJCSghc3RyY21wKCJkdW1teV91ZGMiLCAoZyktPm5hbWUpKQorI2RlZmluZSBnYWRnZXRfaXNfZnNsX3FlKGcpCQkoIXN0cmNtcCgiZnNsX3FlX3VkYyIsIChnKS0+bmFtZSkpCisjZGVmaW5lIGdhZGdldF9pc19mc2xfdXNiMihnKQkJKCFzdHJjbXAoImZzbC11c2IyLXVkYyIsIChnKS0+bmFtZSkpCisjZGVmaW5lIGdhZGdldF9pc19nb2t1KGcpCQkoIXN0cmNtcCgiZ29rdV91ZGMiLCAoZyktPm5hbWUpKQorI2RlZmluZSBnYWRnZXRfaXNfaW14KGcpCQkoIXN0cmNtcCgiaW14X3VkYyIsIChnKS0+bmFtZSkpCisjZGVmaW5lIGdhZGdldF9pc19sYW5nd2VsbChnKQkJKCFzdHJjbXAoImxhbmd3ZWxsX3VkYyIsIChnKS0+bmFtZSkpCisjZGVmaW5lIGdhZGdldF9pc19tNjY1OTIoZykJCSghc3RyY21wKCJtNjY1OTJfdWRjIiwgKGcpLT5uYW1lKSkKKyNkZWZpbmUgZ2FkZ2V0X2lzX211c2JoZHJjKGcpCQkoIXN0cmNtcCgibXVzYi1oZHJjIiwgKGcpLT5uYW1lKSkKKyNkZWZpbmUgZ2FkZ2V0X2lzX25ldDIyNzIoZykJCSghc3RyY21wKCJuZXQyMjcyIiwgKGcpLT5uYW1lKSkKKyNkZWZpbmUgZ2FkZ2V0X2lzX25ldDIyODAoZykJCSghc3RyY21wKCJuZXQyMjgwIiwgKGcpLT5uYW1lKSkKKyNkZWZpbmUgZ2FkZ2V0X2lzX29tYXAoZykJCSghc3RyY21wKCJvbWFwX3VkYyIsIChnKS0+bmFtZSkpCisjZGVmaW5lIGdhZGdldF9pc19wY2goZykJCSghc3RyY21wKCJwY2hfdWRjIiwgKGcpLT5uYW1lKSkKKyNkZWZpbmUgZ2FkZ2V0X2lzX3B4YShnKQkJKCFzdHJjbXAoInB4YTI1eF91ZGMiLCAoZyktPm5hbWUpKQorI2RlZmluZSBnYWRnZXRfaXNfcHhhMjd4KGcpCQkoIXN0cmNtcCgicHhhMjd4X3VkYyIsIChnKS0+bmFtZSkpCisjZGVmaW5lIGdhZGdldF9pc19yOGE2NjU5NyhnKQkJKCFzdHJjbXAoInI4YTY2NTk3X3VkYyIsIChnKS0+bmFtZSkpCisjZGVmaW5lIGdhZGdldF9pc19yZW5lc2FzX3VzYmhzKGcpCSghc3RyY21wKCJyZW5lc2FzX3VzYmhzX3VkYyIsIChnKS0+bmFtZSkpCisjZGVmaW5lIGdhZGdldF9pc19zM2MyNDEwKGcpCQkoIXN0cmNtcCgiczNjMjQxMF91ZGMiLCAoZyktPm5hbWUpKQorI2RlZmluZSBnYWRnZXRfaXNfczNjX2hzb3RnKGcpCQkoIXN0cmNtcCgiczNjLWhzb3RnIiwgKGcpLT5uYW1lKSkKKyNkZWZpbmUgZ2FkZ2V0X2lzX3MzY19oc3VkYyhnKQkJKCFzdHJjbXAoInMzYy1oc3VkYyIsIChnKS0+bmFtZSkpCiAKIC8qKgogICogdXNiX2dhZGdldF9jb250cm9sbGVyX251bWJlciAtIHN1cHBvcnQgYmNkRGV2aWNlIGlkIGNvbnZlbnRpb24KQEAgLTIyMyw2ICsxMTMsOCBAQAogCQlyZXR1cm4gMHgyOTsKIAllbHNlIGlmIChnYWRnZXRfaXNfczNjX2hzdWRjKGdhZGdldCkpCiAJCXJldHVybiAweDMwOworCWVsc2UgaWYgKGdhZGdldF9pc19uZXQyMjcyKGdhZGdldCkpCisJCXJldHVybiAweDMxOwogCiAJcmV0dXJuIC1FTk9FTlQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nbWlkaS5jCmluZGV4IDQ3Yjg2YjkuLjhiOTIyMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9nbWlkaS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nbWlkaS5jCkBAIC01MzcsMTQgKzUzNywxNiBAQAogCXN0cnVjdCB1c2JfZXAgKmVwOwogCXVuc2lnbmVkIGk7CiAKLQllcnIgPSB1c2JfZXBfZW5hYmxlKGRldi0+aW5fZXAsICZidWxrX2luX2Rlc2MpOworCWRldi0+aW5fZXAtPmRlc2MgPSAmYnVsa19pbl9kZXNjOworCWVyciA9IHVzYl9lcF9lbmFibGUoZGV2LT5pbl9lcCk7CiAJaWYgKGVycikgewogCQlFUlJPUihkZXYsICJjYW4ndCBzdGFydCAlczogJWRcbiIsIGRldi0+aW5fZXAtPm5hbWUsIGVycik7CiAJCWdvdG8gZmFpbDsKIAl9CiAJZGV2LT5pbl9lcC0+ZHJpdmVyX2RhdGEgPSBkZXY7CiAKLQllcnIgPSB1c2JfZXBfZW5hYmxlKGRldi0+b3V0X2VwLCAmYnVsa19vdXRfZGVzYyk7CisJZGV2LT5vdXRfZXAtPmRlc2MgPSAmYnVsa19vdXRfZGVzYzsKKwllcnIgPSB1c2JfZXBfZW5hYmxlKGRldi0+b3V0X2VwKTsKIAlpZiAoZXJyKSB7CiAJCUVSUk9SKGRldiwgImNhbid0IHN0YXJ0ICVzOiAlZFxuIiwgZGV2LT5vdXRfZXAtPm5hbWUsIGVycik7CiAJCWdvdG8gZmFpbDsKQEAgLTY5Myw2ICs2OTUsNyBAQAogCQlzd2l0Y2ggKHdfdmFsdWUgPj4gOCkgewogCiAJCWNhc2UgVVNCX0RUX0RFVklDRToKKwkJCWRldmljZV9kZXNjLmJNYXhQYWNrZXRTaXplMCA9IGdhZGdldC0+ZXAwLT5tYXhwYWNrZXQ7CiAJCQl2YWx1ZSA9IG1pbih3X2xlbmd0aCwgKHUxNikgc2l6ZW9mKGRldmljZV9kZXNjKSk7CiAJCQltZW1jcHkocmVxLT5idWYsICZkZXZpY2VfZGVzYywgdmFsdWUpOwogCQkJYnJlYWs7CkBAIC0xMjQ3LDggKzEyNTAsNiBAQAogCiAJZGV2LT5yZXEtPmNvbXBsZXRlID0gZ21pZGlfc2V0dXBfY29tcGxldGU7CiAKLQlkZXZpY2VfZGVzYy5iTWF4UGFja2V0U2l6ZTAgPSBnYWRnZXQtPmVwMC0+bWF4cGFja2V0OwotCiAJZ2FkZ2V0LT5lcDAtPmRyaXZlcl9kYXRhID0gZGV2OwogCiAJSU5GTyhkZXYsICIlcywgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iLCBsb25nbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCmluZGV4IGJmNmUxMWMuLjdmODc4MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCkBAIC05OTYsOCArOTk2LDE0IEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCitzdGF0aWMgaW50IGdva3Vfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCisJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKTsKK3N0YXRpYyBpbnQgZ29rdV9zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBnb2t1X29wcyA9IHsKIAkuZ2V0X2ZyYW1lCT0gZ29rdV9nZXRfZnJhbWUsCisJLnN0YXJ0CQk9IGdva3Vfc3RhcnQsCisJLnN0b3AJCT0gZ29rdV9zdG9wLAogCS8vIG5vIHJlbW90ZSB3YWtldXAKIAkvLyBub3Qgc2VsZnBvd2VyZWQKIH07CkBAIC0xMzQ0LDcgKzEzNTAsNyBAQAogICogZGlzY29ubmVjdCBpcyByZXBvcnRlZC4gIHRoZW4gYSBob3N0IG1heSBjb25uZWN0IGFnYWluLCBvcgogICogdGhlIGRyaXZlciBtaWdodCBnZXQgdW5ib3VuZC4KICAqLwotaW50IHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorc3RhdGljIGludCBnb2t1X3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAogCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKIHsKIAlzdHJ1Y3QgZ29rdV91ZGMJKmRldiA9IHRoZV9jb250cm9sbGVyOwpAQCAtMTM4Miw3ICsxMzg4LDYgQEAKIAlEQkcoZGV2LCAicmVnaXN0ZXJlZCBnYWRnZXQgZHJpdmVyICclcydcbiIsIGRyaXZlci0+ZHJpdmVyLm5hbWUpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcik7CiAKIHN0YXRpYyB2b2lkCiBzdG9wX2FjdGl2aXR5KHN0cnVjdCBnb2t1X3VkYyAqZGV2LCBzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKQEAgLTE0MDgsNyArMTQxMyw3IEBACiAJCXVkY19lbmFibGUoZGV2KTsKIH0KIAotaW50IHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCitzdGF0aWMgaW50IGdva3Vfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKIHsKIAlzdHJ1Y3QgZ29rdV91ZGMJKmRldiA9IHRoZV9jb250cm9sbGVyOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CkBAIC0xNDI5LDggKzE0MzQsNiBAQAogCURCRyhkZXYsICJ1bnJlZ2lzdGVyZWQgZHJpdmVyICclcydcbiIsIGRyaXZlci0+ZHJpdmVyLm5hbWUpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKLQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0xNzMwLDYgKzE3MzMsOCBAQAogCiAJREJHKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKKwl1c2JfZGVsX2dhZGdldF91ZGMoJmRldi0+Z2FkZ2V0KTsKKwogCUJVR19PTihkZXYtPmRyaXZlcik7CiAKICNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUwpAQCAtMTg1NCw2ICsxODU5LDEwIEBACiAJCWdvdG8gZXJyOwogCX0KIAlkZXYtPnJlZ2lzdGVyZWQgPSAxOworCXJldHZhbCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmcGRldi0+ZGV2LCAmZGV2LT5nYWRnZXQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCiAJcmV0dXJuIDA7CiAKIGVycjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9oaWQuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9oaWQuYwppbmRleCAyNTIzZTU0Li45ZmI1NzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvaGlkLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2hpZC5jCkBAIC0yNTUsNiArMjU1LDcgQEAKIAkubmFtZQkJPSAiZ19oaWQiLAogCS5kZXYJCT0gJmRldmljZV9kZXNjLAogCS5zdHJpbmdzCT0gZGV2X3N0cmluZ3MsCisJLm1heF9zcGVlZAk9IFVTQl9TUEVFRF9ISUdILAogCS51bmJpbmQJCT0gX19leGl0X3AoaGlkX3VuYmluZCksCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lteF91ZGMuYwppbmRleCBhZGU0MDA2Li42OTJmZDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmMKQEAgLTEyMzcsOSArMTIzNywxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwogCitzdGF0aWMgaW50IGlteF91ZGNfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCisJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKTsKK3N0YXRpYyBpbnQgaW14X3VkY19zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgaW14X3VkY19vcHMgPSB7CiAJLmdldF9mcmFtZQkgPSBpbXhfdWRjX2dldF9mcmFtZSwKIAkud2FrZXVwCQkgPSBpbXhfdWRjX3dha2V1cCwKKwkuc3RhcnQJCT0gaW14X3VkY19zdGFydCwKKwkuc3RvcAkJPSBpbXhfdWRjX3N0b3AsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlteF91ZGNfc3RydWN0IGNvbnRyb2xsZXIgPSB7CkBAIC0xMzI0LDcgKzEzMjksNyBAQAogICogVVNCIGdhZGdldCBkcml2ZXIgZnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCi1pbnQgdXNiX2dhZGdldF9wcm9iZV9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCitzdGF0aWMgaW50IGlteF91ZGNfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCiAJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKQogewogCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9ICZjb250cm9sbGVyOwpAQCAtMTM2OCw5ICsxMzczLDggQEAKIAlpbXhfdXNiLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CiAJcmV0dXJuIHJldHZhbDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOwogCi1pbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3N0YXRpYyBpbnQgaW14X3VkY19zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQogewogCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9ICZjb250cm9sbGVyOwogCkBAIC0xMzk0LDcgKzEzOTgsNiBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTW9kdWxlIGZ1bmN0aW9ucwpAQCAtMTUwNCw4ICsxNTA3LDE0IEBACiAJaW14X3VzYi0+dGltZXIuZnVuY3Rpb24gPSBoYW5kbGVfY29uZmlnOwogCWlteF91c2ItPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbXhfdXNiOwogCi0JcmV0dXJuIDA7CisJcmV0ID0gdXNiX2FkZF9nYWRnZXRfdWRjKCZwZGV2LT5kZXYsICZpbXhfdXNiLT5nYWRnZXQpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDQ7CiAKKwlyZXR1cm4gMDsKK2ZhaWw0OgorCWZvciAoaSA9IDA7IGkgPCBJTVhfVVNCX05CX0VQICsgMTsgaSsrKQorCQlmcmVlX2lycShpbXhfdXNiLT51c2JkX2ludFtpXSwgaW14X3VzYik7CiBmYWlsMzoKIAljbGtfcHV0KGNsayk7CiAJY2xrX2Rpc2FibGUoY2xrKTsKQEAgLTE1MjUsNiArMTUzNCw3IEBACiAJc3RydWN0IGlteHVzYl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWludCBpOwogCisJdXNiX2RlbF9nYWRnZXRfdWRjKCZpbXhfdXNiLT5nYWRnZXQpOwogCWlteF91ZGNfZGlzYWJsZShpbXhfdXNiKTsKIAlkZWxfdGltZXIoJmlteF91c2ItPnRpbWVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwppbmRleCBhMDEzODNmLi4xYjI0MDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwpAQCAtNDMxLDggKzQzMSwxMCBAQAogCiAJLyogaGFsdCBhbnkgZW5kcG9pbnQgYnkgZG9pbmcgYSAid3JvbmcgZGlyZWN0aW9uIiBpL28gY2FsbCAqLwogCWlmICghdXNiX2VuZHBvaW50X2Rpcl9pbigmZGF0YS0+ZGVzYykpIHsKLQkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoJmRhdGEtPmRlc2MpKQorCQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYygmZGF0YS0+ZGVzYykpIHsKKwkJCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCQlEQkcgKGRhdGEtPmRldiwgIiVzIGhhbHRcbiIsIGRhdGEtPm5hbWUpOwogCQlzcGluX2xvY2tfaXJxICgmZGF0YS0+ZGV2LT5sb2NrKTsKIAkJaWYgKGxpa2VseSAoZGF0YS0+ZXAgIT0gTlVMTCkpCkBAIC04MzAsMTQgKzgzMiwxNiBAQAogCXN3aXRjaCAoZGF0YS0+ZGV2LT5nYWRnZXQtPnNwZWVkKSB7CiAJY2FzZSBVU0JfU1BFRURfTE9XOgogCWNhc2UgVVNCX1NQRUVEX0ZVTEw6Ci0JCXZhbHVlID0gdXNiX2VwX2VuYWJsZSAoZXAsICZkYXRhLT5kZXNjKTsKKwkJZXAtPmRlc2MgPSAmZGF0YS0+ZGVzYzsKKwkJdmFsdWUgPSB1c2JfZXBfZW5hYmxlKGVwKTsKIAkJaWYgKHZhbHVlID09IDApCiAJCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX0VQX0VOQUJMRUQ7CiAJCWJyZWFrOwogI2lmZGVmCUNPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRAogCWNhc2UgVVNCX1NQRUVEX0hJR0g6CiAJCS8qIGZhaWxzIGlmIGNhbGxlciBkaWRuJ3QgcHJvdmlkZSB0aGF0IGRlc2NyaXB0b3IuLi4gKi8KLQkJdmFsdWUgPSB1c2JfZXBfZW5hYmxlIChlcCwgJmRhdGEtPmhzX2Rlc2MpOworCQllcC0+ZGVzYyA9ICZkYXRhLT5oc19kZXNjOworCQl2YWx1ZSA9IHVzYl9lcF9lbmFibGUoZXApOwogCQlpZiAodmFsdWUgPT0gMCkKIAkJCWRhdGEtPnN0YXRlID0gU1RBVEVfRVBfRU5BQkxFRDsKIAkJYnJlYWs7CkBAIC0xMzQzLDcgKzEzNDcsNyBAQAogCXF1YWwuYkRldmljZVByb3RvY29sID0gZGVzYy0+YkRldmljZVByb3RvY29sOwogCiAJLyogYXNzdW1lcyBlcDAgdXNlcyB0aGUgc2FtZSB2YWx1ZSBmb3IgYm90aCBzcGVlZHMgLi4uICovCi0JcXVhbC5iTWF4UGFja2V0U2l6ZTAgPSBkZXNjLT5iTWF4UGFja2V0U2l6ZTA7CisJcXVhbC5iTWF4UGFja2V0U2l6ZTAgPSBkZXYtPmdhZGdldC0+ZXAwLT5tYXhwYWNrZXQ7CiAKIAlxdWFsLmJOdW1Db25maWd1cmF0aW9ucyA9IDE7CiAJcXVhbC5iUkVTRVJWRUQgPSAwOwpAQCAtMTQwMCw3ICsxNDA0LDYgQEAKIAkJfQogCiAJCWRldi0+c3RhdGUgPSBTVEFURV9ERVZfQ09OTkVDVEVEOwotCQlkZXYtPmRldi0+Yk1heFBhY2tldFNpemUwID0gZ2FkZ2V0LT5lcDAtPm1heHBhY2tldDsKIAogCQlJTkZPIChkZXYsICJjb25uZWN0ZWRcbiIpOwogCQlldmVudCA9IG5leHRfZXZlbnQgKGRldiwgR0FER0VURlNfQ09OTkVDVCk7CkBAIC0xNDI4LDYgKzE0MzEsNyBAQAogCiAJCWNhc2UgVVNCX0RUX0RFVklDRToKIAkJCXZhbHVlID0gbWluICh3X2xlbmd0aCwgKHUxNikgc2l6ZW9mICpkZXYtPmRldik7CisJCQlkZXYtPmRldi0+Yk1heFBhY2tldFNpemUwID0gZGV2LT5nYWRnZXQtPmVwMC0+bWF4cGFja2V0OwogCQkJcmVxLT5idWYgPSBkZXYtPmRldjsKIAkJCWJyZWFrOwogI2lmZGVmCUNPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRApAQCAtMTcwOCw3ICsxNzEyLDYgQEAKIAlzZXRfZ2FkZ2V0X2RhdGEgKGdhZGdldCwgZGV2KTsKIAlkZXYtPmdhZGdldCA9IGdhZGdldDsKIAlnYWRnZXQtPmVwMC0+ZHJpdmVyX2RhdGEgPSBkZXY7Ci0JZGV2LT5kZXYtPmJNYXhQYWNrZXRTaXplMCA9IGdhZGdldC0+ZXAwLT5tYXhwYWNrZXQ7CiAKIAkvKiBwcmVhbGxvY2F0ZSBjb250cm9sIHJlc3BvbnNlIGFuZCBidWZmZXIgKi8KIAlkZXYtPnJlcSA9IHVzYl9lcF9hbGxvY19yZXF1ZXN0IChnYWRnZXQtPmVwMCwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGFuZ3dlbGxfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGFuZ3dlbGxfdWRjLmMKaW5kZXggOWNlZTg4YS4uYTA2ZTJjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xhbmd3ZWxsX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9sYW5nd2VsbF91ZGMuYwpAQCAtNTkzLDggKzU5Myw4IEBACiAJCS8qIGVwMCAqLwogCQlkZXZfdmRiZygmZGV2LT5wZGV2LT5kZXYsICIlcy0lc1xuIiwgZXAtPm5hbWUsIERJUl9TVFJJTkcoZXApKTsKIAotCWRldl92ZGJnKCZkZXYtPnBkZXYtPmRldiwgImVwX2RxaFslZF0gYWRkcjogMHglMDh4XG4iLAotCQkJaSwgKHUzMikmKGRldi0+ZXBfZHFoW2ldKSk7CisJZGV2X3ZkYmcoJmRldi0+cGRldi0+ZGV2LCAiZXBfZHFoWyVkXSBhZGRyOiAweCVwXG4iLAorCQkJaSwgJihkZXYtPmVwX2RxaFtpXSkpOwogCiAJYml0X21hc2sgPSBpc19pbihlcCkgPwogCQkoMSA8PCAoZXAtPmVwX251bSArIDE2KSkgOiAoMSA8PCAoZXAtPmVwX251bSkpOwpAQCAtMTMyMSw3ICsxMzIxLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotCitzdGF0aWMgaW50IGxhbmd3ZWxsX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSk7CitzdGF0aWMgaW50IGxhbmd3ZWxsX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpOwogLyogZGV2aWNlIGNvbnRyb2xsZXIgdXNiX2dhZGdldF9vcHMgc3RydWN0dXJlICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9nYWRnZXRfb3BzIGxhbmd3ZWxsX29wcyA9IHsKIApAQCAtMTM0Miw2ICsxMzQ0LDkgQEAKIAogCS8qIEQrIHB1bGx1cCwgc29mdHdhcmUtY29udHJvbGxlZCBjb25uZWN0L2Rpc2Nvbm5lY3QgdG8gVVNCIGhvc3QgKi8KIAkucHVsbHVwCQk9IGxhbmd3ZWxsX3B1bGx1cCwKKworCS5zdGFydAkJPSBsYW5nd2VsbF9zdGFydCwKKwkuc3RvcAkJPSBsYW5nd2VsbF9zdG9wLAogfTsKIAogCkBAIC0xODUyLDcgKzE4NTcsNyBAQAogICogdGhlIGRyaXZlciBtaWdodCBnZXQgdW5ib3VuZC4KICAqLwogCi1pbnQgdXNiX2dhZGdldF9wcm9iZV9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCitzdGF0aWMgaW50IGxhbmd3ZWxsX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAogCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKIHsKIAlzdHJ1Y3QgbGFuZ3dlbGxfdWRjCSpkZXYgPSB0aGVfY29udHJvbGxlcjsKQEAgLTE5MTQsMTEgKzE5MTksOSBAQAogCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiPC0tLSAlcygpXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOwotCiAKIC8qIHVucmVnaXN0ZXIgZ2FkZ2V0IGRyaXZlciAqLwotaW50IHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCitzdGF0aWMgaW50IGxhbmd3ZWxsX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IGxhbmd3ZWxsX3VkYwkqZGV2ID0gdGhlX2NvbnRyb2xsZXI7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CkBAIC0xOTY1LDggKzE5NjgsNiBAQAogCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiPC0tLSAlcygpXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIpOwotCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTMyNzAsNyArMzI3MSw3IEBACiAKIAkvKiBhbGxvY2F0ZSBkZXZpY2UgZFFIIG1lbW9yeSAqLwogCXNpemUgPSBkZXYtPmVwX21heCAqIHNpemVvZihzdHJ1Y3QgbGFuZ3dlbGxfZHFoKTsKLQlkZXZfdmRiZygmZGV2LT5wZGV2LT5kZXYsICJvcmlnIHNpemUgPSAlZFxuIiwgc2l6ZSk7CisJZGV2X3ZkYmcoJmRldi0+cGRldi0+ZGV2LCAib3JpZyBzaXplID0gJXpkXG4iLCBzaXplKTsKIAlpZiAoc2l6ZSA8IERRSF9BTElHTk1FTlQpCiAJCXNpemUgPSBEUUhfQUxJR05NRU5UOwogCWVsc2UgaWYgKChzaXplICUgRFFIX0FMSUdOTUVOVCkgIT0gMCkgewpAQCAtMzI4NSw3ICszMjg2LDcgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAJZGV2LT5lcF9kcWhfc2l6ZSA9IHNpemU7Ci0JZGV2X3ZkYmcoJmRldi0+cGRldi0+ZGV2LCAiZXBfZHFoX3NpemUgPSAlZFxuIiwgZGV2LT5lcF9kcWhfc2l6ZSk7CisJZGV2X3ZkYmcoJmRldi0+cGRldi0+ZGV2LCAiZXBfZHFoX3NpemUgPSAlemRcbiIsIGRldi0+ZXBfZHFoX3NpemUpOwogCiAJLyogaW5pdGlhbGl6ZSBlcDAgc3RhdHVzIHJlcXVlc3Qgc3RydWN0dXJlICovCiAJZGV2LT5zdGF0dXNfcmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxhbmd3ZWxsX3JlcXVlc3QpLCBHRlBfS0VSTkVMKTsKQEAgLTMzNzMsNiArMzM3NCwxMCBAQAogCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyb3I7CiAKKwlyZXR2YWwgPSB1c2JfYWRkX2dhZGdldF91ZGMoJnBkZXYtPmRldiwgJmRldi0+Z2FkZ2V0KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yOworCiAJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9sYW5nd2VsbF91ZGMpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyb3I7CkBAIC0zNDAzLDYgKzM0MDgsNyBAQAogCiAJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICItLS0+ICVzKClcbiIsIF9fZnVuY19fKTsKIAorCXVzYl9kZWxfZ2FkZ2V0X3VkYygmZGV2LT5nYWRnZXQpOwogCS8qIGRpc2FibGUgaW50ZXJydXB0IGFuZCBzZXQgY29udHJvbGxlciB0byBzdG9wIHN0YXRlICovCiAJbGFuZ3dlbGxfdWRjX3N0b3AoZGV2KTsKIApAQCAtMzQ2NCw3ICszNDcwLDcgQEAKIAogCS8qIGFsbG9jYXRlIGRldmljZSBkUUggbWVtb3J5ICovCiAJc2l6ZSA9IGRldi0+ZXBfbWF4ICogc2l6ZW9mKHN0cnVjdCBsYW5nd2VsbF9kcWgpOwotCWRldl92ZGJnKCZkZXYtPnBkZXYtPmRldiwgIm9yaWcgc2l6ZSA9ICVkXG4iLCBzaXplKTsKKwlkZXZfdmRiZygmZGV2LT5wZGV2LT5kZXYsICJvcmlnIHNpemUgPSAlemRcbiIsIHNpemUpOwogCWlmIChzaXplIDwgRFFIX0FMSUdOTUVOVCkKIAkJc2l6ZSA9IERRSF9BTElHTk1FTlQ7CiAJZWxzZSBpZiAoKHNpemUgJSBEUUhfQUxJR05NRU5UKSAhPSAwKSB7CkBAIC0zNDc4LDcgKzM0ODQsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJZGV2LT5lcF9kcWhfc2l6ZSA9IHNpemU7Ci0JZGV2X3ZkYmcoJmRldi0+cGRldi0+ZGV2LCAiZXBfZHFoX3NpemUgPSAlZFxuIiwgZGV2LT5lcF9kcWhfc2l6ZSk7CisJZGV2X3ZkYmcoJmRldi0+cGRldi0+ZGV2LCAiZXBfZHFoX3NpemUgPSAlemRcbiIsIGRldi0+ZXBfZHFoX3NpemUpOwogCiAJLyogY3JlYXRlIGRURCBkbWFfcG9vbCByZXNvdXJjZSAqLwogCWRldi0+ZHRkX3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUoImxhbmd3ZWxsX2R0ZCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L202NjU5Mi11ZGMuYwppbmRleCAwODRhYTA4Li40OTFmODI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KICAqCi0gKiBBdXRob3IgOiBZb3NoaWhpcm8gU2hpbW9kYSA8c2hpbW9kYS55b3NoaWhpcm9AcmVuZXNhcy5jb20+CisgKiBBdXRob3IgOiBZb3NoaWhpcm8gU2hpbW9kYSA8eW9zaGloaXJvLnNoaW1vZGEudWhAcmVuZXNhcy5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC02OTEsNiArNjkxLDcgQEAKIAogc3RhdGljIHZvaWQgZGlzYWJsZV9jb250cm9sbGVyKHN0cnVjdCBtNjY1OTIgKm02NjU5MikKIHsKKwltNjY1OTJfYmNscihtNjY1OTIsIE02NjU5Ml9VVFNULCBNNjY1OTJfVEVTVE1PREUpOwogCWlmICghbTY2NTkyLT5wZGF0YS0+b25fY2hpcCkgewogCQltNjY1OTJfYmNscihtNjY1OTIsIE02NjU5Ml9TQ0tFLCBNNjY1OTJfU1lTQ0ZHKTsKIAkJdWRlbGF5KDEpOwpAQCAtNzgwLDcgKzc4MSw3IEBACiAJLyogd3JpdGUgZmlmbyAqLwogCWlmIChyZXEtPnJlcS5idWYpIHsKIAkJaWYgKHNpemUgPiAwKQotCQkJbTY2NTkyX3dyaXRlX2ZpZm8obTY2NTkyLCBlcC0+Zmlmb2FkZHIsIGJ1Ziwgc2l6ZSk7CisJCQltNjY1OTJfd3JpdGVfZmlmbyhtNjY1OTIsIGVwLCBidWYsIHNpemUpOwogCQlpZiAoKHNpemUgPT0gMCkgfHwgKChzaXplICUgZXAtPmVwLm1heHBhY2tldCkgIT0gMCkpCiAJCQltNjY1OTJfYnNldChtNjY1OTIsIE02NjU5Ml9CVkFMLCBlcC0+Zmlmb2N0cik7CiAJfQpAQCAtODI2LDcgKzgyNyw3IEBACiAKIAkvKiB3cml0ZSBmaWZvICovCiAJaWYgKHJlcS0+cmVxLmJ1ZikgewotCQltNjY1OTJfd3JpdGVfZmlmbyhtNjY1OTIsIGVwLT5maWZvYWRkciwgYnVmLCBzaXplKTsKKwkJbTY2NTkyX3dyaXRlX2ZpZm8obTY2NTkyLCBlcCwgYnVmLCBzaXplKTsKIAkJaWYgKChzaXplID09IDApCiAJCQkJfHwgKChzaXplICUgZXAtPmVwLm1heHBhY2tldCkgIT0gMCkKIAkJCQl8fCAoKGJ1ZnNpemUgIT0gZXAtPmVwLm1heHBhY2tldCkKQEAgLTEwNDgsMTAgKzEwNDksMzAgQEAKIAogc3RhdGljIHZvaWQgc2V0X2ZlYXR1cmUoc3RydWN0IG02NjU5MiAqbTY2NTkyLCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQogeworCXUxNiB0bXA7CisJaW50IHRpbWVvdXQgPSAzMDAwOwogCiAJc3dpdGNoIChjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykgewogCWNhc2UgVVNCX1JFQ0lQX0RFVklDRToKLQkJY29udHJvbF9lbmQobTY2NTkyLCAxKTsKKwkJc3dpdGNoIChsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpKSB7CisJCWNhc2UgVVNCX0RFVklDRV9URVNUX01PREU6CisJCQljb250cm9sX2VuZChtNjY1OTIsIDEpOworCQkJLyogV2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2Ygc3RhdHVzIHN0YWdlICovCisJCQlkbyB7CisJCQkJdG1wID0gbTY2NTkyX3JlYWQobTY2NTkyLCBNNjY1OTJfSU5UU1RTMCkgJgorCQkJCQkJCQlNNjY1OTJfQ1RTUTsKKwkJCQl1ZGVsYXkoMSk7CisJCQl9IHdoaWxlICh0bXAgIT0gTTY2NTkyX0NTX0lEU1QgfHwgdGltZW91dC0tID4gMCk7CisKKwkJCWlmICh0bXAgPT0gTTY2NTkyX0NTX0lEU1QpCisJCQkJbTY2NTkyX2JzZXQobTY2NTkyLAorCQkJCQkgICAgbGUxNl90b19jcHUoY3RybC0+d0luZGV4ID4+IDgpLAorCQkJCQkgICAgTTY2NTkyX1RFU1RNT0RFKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcGlwZV9zdGFsbChtNjY1OTIsIDApOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBVU0JfUkVDSVBfSU5URVJGQUNFOgogCQljb250cm9sX2VuZChtNjY1OTIsIDEpOwpAQCAtMTQ1NCw3ICsxNDc1LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgc3RydWN0IG02NjU5MiAqdGhlX2NvbnRyb2xsZXI7CiAKLWludCB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKK3N0YXRpYyBpbnQgbTY2NTkyX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAogCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKIHsKIAlzdHJ1Y3QgbTY2NTkyICptNjY1OTIgPSB0aGVfY29udHJvbGxlcjsKQEAgLTE1MDYsOSArMTUyNyw4IEBACiAKIAlyZXR1cm4gcmV0dmFsOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcik7CiAKLWludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQorc3RhdGljIGludCBtNjY1OTJfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKIHsKIAlzdHJ1Y3QgbTY2NTkyICptNjY1OTIgPSB0aGVfY29udHJvbGxlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTUzMyw3ICsxNTUzLDYgQEAKIAltNjY1OTItPmRyaXZlciA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludCBtNjY1OTJfZ2V0X2ZyYW1lKHN0cnVjdCB1c2JfZ2FkZ2V0ICpfZ2FkZ2V0KQpAQCAtMTU0MiwxNCArMTU2MSwzNCBAQAogCXJldHVybiBtNjY1OTJfcmVhZChtNjY1OTIsIE02NjU5Ml9GUk1OVU0pICYgMHgwM0ZGOwogfQogCitzdGF0aWMgaW50IG02NjU5Ml9wdWxsdXAoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwgaW50IGlzX29uKQoreworCXN0cnVjdCBtNjY1OTIgKm02NjU5MiA9IGdhZGdldF90b19tNjY1OTIoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm02NjU5Mi0+bG9jaywgZmxhZ3MpOworCWlmIChpc19vbikKKwkJbTY2NTkyX2JzZXQobTY2NTkyLCBNNjY1OTJfRFBSUFUsIE02NjU5Ml9TWVNDRkcpOworCWVsc2UKKwkJbTY2NTkyX2JjbHIobTY2NTkyLCBNNjY1OTJfRFBSUFUsIE02NjU5Ml9TWVNDRkcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm02NjU5Mi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgbTY2NTkyX2dhZGdldF9vcHMgPSB7CiAJLmdldF9mcmFtZQkJPSBtNjY1OTJfZ2V0X2ZyYW1lLAorCS5zdGFydAkJCT0gbTY2NTkyX3N0YXJ0LAorCS5zdG9wCQkJPSBtNjY1OTJfc3RvcCwKKwkucHVsbHVwCQkJPSBtNjY1OTJfcHVsbHVwLAogfTsKIAogc3RhdGljIGludCBfX2V4aXQgbTY2NTkyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBtNjY1OTIJCSptNjY1OTIgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CiAKKwl1c2JfZGVsX2dhZGdldF91ZGMoJm02NjU5Mi0+Z2FkZ2V0KTsKKwogCWRlbF90aW1lcl9zeW5jKCZtNjY1OTItPnRpbWVyKTsKIAlpb3VubWFwKG02NjU5Mi0+cmVnKTsKIAlmcmVlX2lycShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCBtNjY1OTIpOwpAQCAtMTY5MSw5ICsxNzMwLDE2IEBACiAKIAlpbml0X2NvbnRyb2xsZXIobTY2NTkyKTsKIAorCXJldCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmcGRldi0+ZGV2LCAmbTY2NTkyLT5nYWRnZXQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2FkZF91ZGM7CisKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAidmVyc2lvbiAlc1xuIiwgRFJJVkVSX1ZFUlNJT04pOwogCXJldHVybiAwOwogCitlcnJfYWRkX3VkYzoKKwltNjY1OTJfZnJlZV9yZXF1ZXN0KCZtNjY1OTItPmVwWzBdLmVwLCBtNjY1OTItPmVwMF9yZXEpOworCiBjbGVhbl91cDM6CiAjaWZkZWYgQ09ORklHX0hBVkVfQ0xLCiAJaWYgKG02NjU5Mi0+cGRhdGEtPm9uX2NoaXApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5oCmluZGV4IGMzY2FmMWEuLjdiOTNkNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L202NjU5Mi11ZGMuaApAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgogICoKLSAqIEF1dGhvciA6IFlvc2hpaGlybyBTaGltb2RhIDxzaGltb2RhLnlvc2hpaGlyb0ByZW5lc2FzLmNvbT4KKyAqIEF1dGhvciA6IFlvc2hpaGlybyBTaGltb2RhIDx5b3NoaWhpcm8uc2hpbW9kYS51aEByZW5lc2FzLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTU2MSwxMSArNTYxLDI2IEBACiAJaW93cml0ZTE2KHZhbCwgbTY2NTkyLT5yZWcgKyBvZmZzZXQpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbTY2NTkyX21kZnkoc3RydWN0IG02NjU5MiAqbTY2NTkyLCB1MTYgdmFsLCB1MTYgcGF0LAorCQl1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwl1MTYgdG1wOworCXRtcCA9IG02NjU5Ml9yZWFkKG02NjU5Miwgb2Zmc2V0KTsKKwl0bXAgPSB0bXAgJiAofnBhdCk7CisJdG1wID0gdG1wIHwgdmFsOworCW02NjU5Ml93cml0ZShtNjY1OTIsIHRtcCwgb2Zmc2V0KTsKK30KKworI2RlZmluZSBtNjY1OTJfYmNscihtNjY1OTIsIHZhbCwgb2Zmc2V0KQlcCisJCQltNjY1OTJfbWRmeShtNjY1OTIsIDAsIHZhbCwgb2Zmc2V0KQorI2RlZmluZSBtNjY1OTJfYnNldChtNjY1OTIsIHZhbCwgb2Zmc2V0KQlcCisJCQltNjY1OTJfbWRmeShtNjY1OTIsIHZhbCwgMCwgb2Zmc2V0KQorCiBzdGF0aWMgaW5saW5lIHZvaWQgbTY2NTkyX3dyaXRlX2ZpZm8oc3RydWN0IG02NjU5MiAqbTY2NTkyLAotCQl1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJc3RydWN0IG02NjU5Ml9lcCAqZXAsCiAJCXZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pCiB7Ci0Jdm9pZCBfX2lvbWVtICpmaWZvYWRkciA9IG02NjU5Mi0+cmVnICsgb2Zmc2V0OworCXZvaWQgX19pb21lbSAqZmlmb2FkZHIgPSBtNjY1OTItPnJlZyArIGVwLT5maWZvYWRkcjsKIAogCWlmIChtNjY1OTItPnBkYXRhLT5vbl9jaGlwKSB7CiAJCXVuc2lnbmVkIGxvbmcgY291bnQ7CkBAIC01OTEsMjYgKzYwNiwxNSBAQAogCQlpb3dyaXRlMTZfcmVwKGZpZm9hZGRyLCBidWYsIGxlbik7CiAJCWlmIChvZGQpIHsKIAkJCXVuc2lnbmVkIGNoYXIgKnAgPSBidWYgKyBsZW4qMjsKKwkJCWlmIChtNjY1OTItPnBkYXRhLT53cjBfc2hvcnRlZF90b193cjEpCisJCQkJbTY2NTkyX2JjbHIobTY2NTkyLCBNNjY1OTJfTUJXXzE2LCBlcC0+Zmlmb3NlbCk7CiAJCQlpb3dyaXRlOCgqcCwgZmlmb2FkZHIpOworCQkJaWYgKG02NjU5Mi0+cGRhdGEtPndyMF9zaG9ydGVkX3RvX3dyMSkKKwkJCQltNjY1OTJfYnNldChtNjY1OTIsIE02NjU5Ml9NQldfMTYsIGVwLT5maWZvc2VsKTsKIAkJfQogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG02NjU5Ml9tZGZ5KHN0cnVjdCBtNjY1OTIgKm02NjU5MiwgdTE2IHZhbCwgdTE2IHBhdCwKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JdTE2IHRtcDsKLQl0bXAgPSBtNjY1OTJfcmVhZChtNjY1OTIsIG9mZnNldCk7Ci0JdG1wID0gdG1wICYgKH5wYXQpOwotCXRtcCA9IHRtcCB8IHZhbDsKLQltNjY1OTJfd3JpdGUobTY2NTkyLCB0bXAsIG9mZnNldCk7Ci19Ci0KLSNkZWZpbmUgbTY2NTkyX2JjbHIobTY2NTkyLCB2YWwsIG9mZnNldCkJXAotCQkJbTY2NTkyX21kZnkobTY2NTkyLCAwLCB2YWwsIG9mZnNldCkKLSNkZWZpbmUgbTY2NTkyX2JzZXQobTY2NTkyLCB2YWwsIG9mZnNldCkJXAotCQkJbTY2NTkyX21kZnkobTY2NTkyLCB2YWwsIDAsIG9mZnNldCkKLQogI2VuZGlmCS8qIGlmbmRlZiBfX002NjU5Ml9VRENfSF9fICovCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L21hc3Nfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L21hc3Nfc3RvcmFnZS5jCmluZGV4IDAxODIyNDIuLmQzZWIyNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9tYXNzX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbWFzc19zdG9yYWdlLmMKQEAgLTE2OSw2ICsxNjksNyBAQAogCS5uYW1lCQk9ICJnX21hc3Nfc3RvcmFnZSIsCiAJLmRldgkJPSAmbXNnX2RldmljZV9kZXNjLAogCS5pUHJvZHVjdAk9IERSSVZFUl9ERVNDLAorCS5tYXhfc3BlZWQJPSBVU0JfU1BFRURfSElHSCwKIAkubmVlZHNfc2VyaWFsCT0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9tdWx0aS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L211bHRpLmMKaW5kZXggZDlmZWNlZC4uOGM3Yjc0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L211bHRpLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L211bHRpLmMKQEAgLTM1MSw2ICszNTEsNyBAQAogCS5uYW1lCQk9ICJnX211bHRpIiwKIAkuZGV2CQk9ICZkZXZpY2VfZGVzYywKIAkuc3RyaW5ncwk9IGRldl9zdHJpbmdzLAorCS5tYXhfc3BlZWQJPSBVU0JfU1BFRURfSElHSCwKIAkudW5iaW5kCQk9IF9fZXhpdF9wKG11bHRpX3VuYmluZCksCiAJLmlQcm9kdWN0CT0gRFJJVkVSX0RFU0MsCiAJLm5lZWRzX3NlcmlhbAk9IDEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbXZfdWRjX2NvcmUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9tdl91ZGNfY29yZS5jCmluZGV4IGI2MmIyNjQuLmNlMWFjMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9tdl91ZGNfY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9tdl91ZGNfY29yZS5jCkBAIC0xMTI4LDYgKzExMjgsOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG12X3VkY19zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKKwkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpOworc3RhdGljIGludCBtdl91ZGNfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcik7CiAvKiBkZXZpY2UgY29udHJvbGxlciB1c2JfZ2FkZ2V0X29wcyBzdHJ1Y3R1cmUgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgbXZfb3BzID0gewogCkBAIC0xMTM5LDYgKzExNDIsOCBAQAogCiAJLyogRCsgcHVsbHVwLCBzb2Z0d2FyZS1jb250cm9sbGVkIGNvbm5lY3QvZGlzY29ubmVjdCB0byBVU0IgaG9zdCAqLwogCS5wdWxsdXAJCT0gbXZfdWRjX3B1bGx1cCwKKwkuc3RhcnQJCT0gbXZfdWRjX3N0YXJ0LAorCS5zdG9wCQk9IG12X3VkY19zdG9wLAogfTsKIAogc3RhdGljIHZvaWQgbXZfdWRjX3Rlc3Rtb2RlKHN0cnVjdCBtdl91ZGMgKnVkYywgdTE2IGluZGV4LCBib29sIGVudGVyKQpAQCAtMTIzMCw3ICsxMjM1LDcgQEAKIAl9CiB9CiAKLWludCB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKK3N0YXRpYyBpbnQgbXZfdWRjX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAogCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKIHsKIAlzdHJ1Y3QgbXZfdWRjICp1ZGMgPSB0aGVfY29udHJvbGxlcjsKQEAgLTEyNzAsOSArMTI3NSw4IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOwogCi1pbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3N0YXRpYyBpbnQgbXZfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IG12X3VkYyAqdWRjID0gdGhlX2NvbnRyb2xsZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEyOTYsNyArMTMwMCw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7CiAKIHN0YXRpYyBpbnQKIHVkY19wcmltZV9zdGF0dXMoc3RydWN0IG12X3VkYyAqdWRjLCB1OCBkaXJlY3Rpb24sIHUxNiBzdGF0dXMsIGJvb2wgZW1wdHkpCkBAIC0xODgwLDkgKzE4ODMsMTAgQEAKIHN0YXRpYyBpbnQgbXZfdWRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG12X3VkYyAqdWRjID0gdGhlX2NvbnRyb2xsZXI7Ci0KIAlERUNMQVJFX0NPTVBMRVRJT04oZG9uZSk7CiAKKwl1c2JfZGVsX2dhZGdldF91ZGMoJnVkYy0+Z2FkZ2V0KTsKKwogCXVkYy0+ZG9uZSA9ICZkb25lOwogCiAJLyogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGluIHByb2JlICovCkBAIC0yMDc0LDE2ICsyMDc4LDE3IEBACiAKIAl0aGVfY29udHJvbGxlciA9IHVkYzsKIAotCWdvdG8gb3V0OworCXJldHZhbCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmZGV2LT5kZXYsICZ1ZGMtPmdhZGdldCk7CisJaWYgKCFyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CiBlcnJvcjoKIAlpZiAodWRjKQogCQltdl91ZGNfcmVtb3ZlKHVkYy0+ZGV2KTsKLW91dDoKIAlyZXR1cm4gcmV0dmFsOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IG12X3VkY19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgbXZfdWRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqX2RldikKIHsKIAlzdHJ1Y3QgbXZfdWRjICp1ZGMgPSB0aGVfY29udHJvbGxlcjsKIApAQCAtMjA5Miw3ICsyMDk3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdl91ZGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYpCitzdGF0aWMgaW50IG12X3VkY19yZXN1bWUoc3RydWN0IGRldmljZSAqX2RldikKIHsKIAlzdHJ1Y3QgbXZfdWRjICp1ZGMgPSB0aGVfY29udHJvbGxlcjsKIAlpbnQgcmV0dmFsOwpAQCAtMjEwMCw3ICsyMTA1LDcgQEAKIAlyZXR2YWwgPSBtdl91ZGNfcGh5X2luaXQodWRjLT5waHlfcmVncyk7CiAJaWYgKHJldHZhbCkgewogCQlkZXZfZXJyKF9kZXYsICJwaHkgaW5pdGlhbGl6YXRpb24gZXJyb3IgJWRcbiIsIHJldHZhbCk7Ci0JCWdvdG8gZXJyb3I7CisJCXJldHVybiByZXR2YWw7CiAJfQogCXVkY19yZXNldCh1ZGMpOwogCWVwMF9yZXNldCh1ZGMpOwpAQCAtMjEyMiwxMSArMjEyNywxMSBAQAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAicHhhLXUybyIsCiAjaWZkZWYgQ09ORklHX1BNCi0JCS5wbQk9IG12X3VkY19wbV9vcHMsCisJCS5wbQk9ICZtdl91ZGNfcG1fb3BzLAogI2VuZGlmCiAJfSwKIH07Ci0KK01PRFVMRV9BTElBUygicGxhdGZvcm06cHhhLXUybyIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX0FVVEhPUigiQ2hhbyBYaWUgPGNoYW8ueGllQG1hcnZlbGwuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L25jbS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25jbS5jCmluZGV4IDk5YzE3OWEuLjYyZWU1MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9uY20uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmNtLmMKQEAgLTIyOCw2ICsyMjgsNyBAQAogCS5uYW1lCQk9ICJnX25jbSIsCiAJLmRldgkJPSAmZGV2aWNlX2Rlc2MsCiAJLnN0cmluZ3MJPSBkZXZfc3RyaW5ncywKKwkubWF4X3NwZWVkCT0gVVNCX1NQRUVEX0hJR0gsCiAJLnVuYmluZAkJPSBfX2V4aXRfcChnbmNtX3VuYmluZCksCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI3Mi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyNzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdiMGUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyNzIuYwpAQCAtMCwwICsxLDI3NTIgQEAKKy8qCisgKiBEcml2ZXIgZm9yIFBMWCBORVQyMjcyIFVTQiBkZXZpY2UgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFBMWCBUZWNobm9sb2d5LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBBbmFsb2cgRGV2aWNlcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgIm5ldDIyNzIuaCIKKworI2RlZmluZSBEUklWRVJfREVTQyAiUExYIE5FVDIyNzIgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlciIKKworc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbXSA9ICJuZXQyMjcyIjsKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl92ZXJzW10gPSAiMjAwNiBPY3RvYmVyIDE3L21haW5saW5lIjsKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9kZXNjW10gPSBEUklWRVJfREVTQzsKKworc3RhdGljIGNvbnN0IGNoYXIgZXAwbmFtZVtdID0gImVwMCI7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVwX25hbWVbXSA9IHsKKwllcDBuYW1lLAorCSJlcC1hIiwgImVwLWIiLCAiZXAtYyIsCit9OworCisjZGVmaW5lIERNQV9BRERSX0lOVkFMSUQJKH4oZG1hX2FkZHJfdCkwKQorI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX05FVDIyNzJfRE1BCisvKgorICogdXNlX2RtYTogdGhlIE5FVDIyNzIgY2FuIHVzZSBhbiBleHRlcm5hbCBETUEgY29udHJvbGxlci4KKyAqIE5vdGUgdGhhdCBzaW5jZSB0aGVyZSBpcyBubyBnZW5lcmljIERNQSBhcGksIHNvbWUgZnVuY3Rpb25zLAorICogbm90YWJseSByZXF1ZXN0X2RtYSwgc3RhcnRfZG1hLCBhbmQgY2FuY2VsX2RtYSB3aWxsIG5lZWQgdG8gYmUKKyAqIG1vZGlmaWVkIGZvciB5b3VyIHBsYXRmb3JtJ3MgcGFydGljdWxhciBkbWEgY29udHJvbGxlci4KKyAqCisgKiBJZiB1c2VfZG1hIGlzIGRpc2FibGVkLCBwaW8gd2lsbCBiZSB1c2VkIGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbnQgdXNlX2RtYSA9IDA7Cittb2R1bGVfcGFyYW0odXNlX2RtYSwgYm9vbCwgMDY0NCk7CisKKy8qCisgKiBkbWFfZXA6IHNlbGVjdHMgdGhlIGVuZHBvaW50IGZvciB1c2Ugd2l0aCBkbWEgKDE9ZXAtYSwgMj1lcC1iKQorICogVGhlIE5FVDIyNzIgY2FuIG9ubHkgdXNlIGRtYSBmb3IgYSBzaW5nbGUgZW5kcG9pbnQgYXQgYSB0aW1lLgorICogQXQgc29tZSBwb2ludCB0aGlzIGNvdWxkIGJlIG1vZGlmaWVkIHRvIGFsbG93IGVpdGhlciBlbmRwb2ludAorICogdG8gdGFrZSBjb250cm9sIG9mIGRtYSBhcyBpdCBiZWNvbWVzIGF2YWlsYWJsZS4KKyAqCisgKiBOb3RlIHRoYXQgRE1BIHNob3VsZCBub3QgYmUgdXNlZCBvbiBPVVQgZW5kcG9pbnRzIHVubGVzcyBpdCBjYW4KKyAqIGJlIGd1YXJhbnRlZWQgdGhhdCBubyBzaG9ydCBwYWNrZXRzIHdpbGwgYXJyaXZlIG9uIGFuIElOIGVuZHBvaW50CisgKiB3aGlsZSB0aGUgRE1BIG9wZXJhdGlvbiBpcyBwZW5kaW5nLiAgT3RoZXJ3aXNlIHRoZSBPVVQgRE1BIHdpbGwKKyAqIHRlcm1pbmF0ZSBwcmVtYXR1cmVseSAoU2VlIE5FVDIyNzIgRXJyYXRhIDYzMC0wMjEzLTAxMDEpCisgKi8KK3N0YXRpYyB1c2hvcnQgZG1hX2VwID0gMTsKK21vZHVsZV9wYXJhbShkbWFfZXAsIHVzaG9ydCwgMDY0NCk7CisKKy8qCisgKiBkbWFfbW9kZTogbmV0MjI3MiBkbWEgbW9kZSBzZXR0aW5nIChzZWUgTE9DQ1RMMSBkZWZpbml0b24pOgorICoJbW9kZSAwID09IFNsb3cgRFJFUSBtb2RlCisgKgltb2RlIDEgPT0gRmFzdCBEUkVRIG1vZGUKKyAqCW1vZGUgMiA9PSBCdXJzdCBtb2RlCisgKi8KK3N0YXRpYyB1c2hvcnQgZG1hX21vZGUgPSAyOworbW9kdWxlX3BhcmFtKGRtYV9tb2RlLCB1c2hvcnQsIDA2NDQpOworI2Vsc2UKKyNkZWZpbmUgdXNlX2RtYSAwCisjZGVmaW5lIGRtYV9lcCAxCisjZGVmaW5lIGRtYV9tb2RlIDIKKyNlbmRpZgorCisvKgorICogZmlmb19tb2RlOiBuZXQyMjcyIGJ1ZmZlciBjb25maWd1cmF0aW9uOgorICogICAgICBtb2RlIDAgPT0gZXAte2EsYixjfSA1MTJkYiBlYWNoCisgKiAgICAgIG1vZGUgMSA9PSBlcC1hIDFrLCBlcC17YixjfSA1MTJkYgorICogICAgICBtb2RlIDIgPT0gZXAtYSAxaywgZXAtYiAxaywgZXAtYyA1MTJkYgorICogICAgICBtb2RlIDMgPT0gZXAtYSAxaywgZXAtYiBkaXNhYmxlZCwgZXAtYyA1MTJkYgorICovCitzdGF0aWMgdXNob3J0IGZpZm9fbW9kZSA9IDA7Cittb2R1bGVfcGFyYW0oZmlmb19tb2RlLCB1c2hvcnQsIDA2NDQpOworCisvKgorICogZW5hYmxlX3N1c3BlbmQ6IFdoZW4gZW5hYmxlZCwgdGhlIGRyaXZlciB3aWxsIHJlc3BvbmQgdG8KKyAqIFVTQiBzdXNwZW5kIHJlcXVlc3RzIGJ5IHBvd2VyaW5nIGRvd24gdGhlIE5FVDIyNzIuICBPdGhlcndpc2UsCisgKiBVU0Igc3VzcGVuZCByZXF1ZXN0cyB3aWxsIGJlIGlnbm9yZWQuICBUaGlzIGlzIGFjY2VwdGlibGUgZm9yCisgKiBzZWxmLXBvd2VyZWQgZGV2aWNlcy4gIEZvciBidXMgcG93ZXJlZCBkZXZpY2VzIHNldCB0aGlzIHRvIDEuCisgKi8KK3N0YXRpYyB1c2hvcnQgZW5hYmxlX3N1c3BlbmQgPSAwOworbW9kdWxlX3BhcmFtKGVuYWJsZV9zdXNwZW5kLCB1c2hvcnQsIDA2NDQpOworCitzdGF0aWMgdm9pZCBhc3NlcnRfb3V0X25ha2luZyhzdHJ1Y3QgbmV0MjI3Ml9lcCAqZXAsIGNvbnN0IGNoYXIgKndoZXJlKQoreworCXU4IHRtcDsKKworI2lmbmRlZiBERUJVRworCXJldHVybjsKKyNlbmRpZgorCisJdG1wID0gbmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9TVEFUMCk7CisJaWYgKCh0bXAgJiAoMSA8PCBOQUtfT1VUX1BBQ0tFVFMpKSA9PSAwKSB7CisJCWRldl9kYmcoZXAtPmRldi0+ZGV2LCAiJXMgJXMgJTAyeCAhTkFLXG4iLAorCQkJZXAtPmVwLm5hbWUsIHdoZXJlLCB0bXApOworCQluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9SU1BTRVQsIDEgPDwgQUxUX05BS19PVVRfUEFDS0VUUyk7CisJfQorfQorI2RlZmluZSBBU1NFUlRfT1VUX05BS0lORyhlcCkgYXNzZXJ0X291dF9uYWtpbmcoZXAsIF9fZnVuY19fKQorCitzdGF0aWMgdm9pZCBzdG9wX291dF9uYWtpbmcoc3RydWN0IG5ldDIyNzJfZXAgKmVwKQoreworCXU4IHRtcCA9IG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfU1RBVDApOworCisJaWYgKCh0bXAgJiAoMSA8PCBOQUtfT1VUX1BBQ0tFVFMpKSAhPSAwKQorCQluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9SU1BDTFIsIDEgPDwgQUxUX05BS19PVVRfUEFDS0VUUyk7Cit9CisKKyNkZWZpbmUgUElQRURJUihiQWRkcmVzcykgKHVzYl9waXBlaW4oYkFkZHJlc3MpID8gImluIiA6ICJvdXQiKQorCitzdGF0aWMgY2hhciAqdHlwZV9zdHJpbmcodTggYm1BdHRyaWJ1dGVzKQoreworCXN3aXRjaCAoKGJtQXR0cmlidXRlcykgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgeworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzogcmV0dXJuICJidWxrIjsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6IHJldHVybiAiaXNvIjsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDogIHJldHVybiAiaW50ciI7CisJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnRyb2wiOworCX0KK30KKworc3RhdGljIGNoYXIgKmJ1Zl9zdGF0ZV9zdHJpbmcodW5zaWduZWQgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgQlVGRl9GUkVFOiAgcmV0dXJuICJmcmVlIjsKKwljYXNlIEJVRkZfVkFMSUQ6IHJldHVybiAidmFsaWQiOworCWNhc2UgQlVGRl9MQ0w6ICAgcmV0dXJuICJsb2NhbCI7CisJY2FzZSBCVUZGX1VTQjogICByZXR1cm4gInVzYiI7CisJZGVmYXVsdDogICAgICAgICByZXR1cm4gInVua25vd24iOworCX0KK30KKworc3RhdGljIGNoYXIgKmRtYV9tb2RlX3N0cmluZyh2b2lkKQoreworCWlmICghdXNlX2RtYSkKKwkJcmV0dXJuICJQSU8iOworCXN3aXRjaCAoZG1hX21vZGUpIHsKKwljYXNlIDA6ICByZXR1cm4gIlNMT1cgRFJFUSI7CisJY2FzZSAxOiAgcmV0dXJuICJGQVNUIERSRVEiOworCWNhc2UgMjogIHJldHVybiAiQlVSU1QiOworCWRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCI7CisJfQorfQorCitzdGF0aWMgdm9pZCBuZXQyMjcyX2RlcXVldWVfYWxsKHN0cnVjdCBuZXQyMjcyX2VwICopOworc3RhdGljIGludCBuZXQyMjcyX2tpY2tfZG1hKHN0cnVjdCBuZXQyMjcyX2VwICosIHN0cnVjdCBuZXQyMjcyX3JlcXVlc3QgKik7CitzdGF0aWMgaW50IG5ldDIyNzJfZmlmb19zdGF0dXMoc3RydWN0IHVzYl9lcCAqKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZXBfb3BzIG5ldDIyNzJfZXBfb3BzOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQKK25ldDIyNzJfZW5hYmxlKHN0cnVjdCB1c2JfZXAgKl9lcCwgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0cnVjdCBuZXQyMjcyICpkZXY7CisJc3RydWN0IG5ldDIyNzJfZXAgKmVwOworCXUzMiBtYXg7CisJdTggdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuZXQyMjcyX2VwLCBlcCk7CisJaWYgKCFfZXAgfHwgIWRlc2MgfHwgZXAtPmRlc2MgfHwgX2VwLT5uYW1lID09IGVwMG5hbWUKKwkJCXx8IGRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQpCisJCXJldHVybiAtRUlOVkFMOworCWRldiA9IGVwLT5kZXY7CisJaWYgKCFkZXYtPmRyaXZlciB8fCBkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwltYXggPSBsZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSkgJiAweDFmZmY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJX2VwLT5tYXhwYWNrZXQgPSBtYXggJiAweDdmZmY7CisJZXAtPmRlc2MgPSBkZXNjOworCisJLyogbmV0MjI3Ml9lcF9yZXNldCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkICovCisJZXAtPnN0b3BwZWQgPSAwOworCWVwLT53ZWRnZWQgPSAwOworCisJLyogc2V0IHNwZWVkLWRlcGVuZGVudCBtYXggcGFja2V0ICovCisJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfTUFYUEtUMCwgbWF4ICYgMHhmZik7CisJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfTUFYUEtUMSwgKG1heCAmIDB4ZmYwMCkgPj4gOCk7CisKKwkvKiBzZXQgdHlwZSwgZGlyZWN0aW9uLCBhZGRyZXNzOyByZXNldCBmaWZvIGNvdW50ZXJzICovCisJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfU1RBVDEsIDEgPDwgQlVGRkVSX0ZMVVNIKTsKKwl0bXAgPSB1c2JfZW5kcG9pbnRfdHlwZShkZXNjKTsKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfYnVsayhkZXNjKSkgeworCQkvKiBjYXRjaCBzb21lIHBhcnRpY3VsYXJseSBibGF0YW50IGRyaXZlciBidWdzICovCisJCWlmICgoZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0ggJiYgbWF4ICE9IDUxMikgfHwKKwkJICAgIChkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCAmJiBtYXggPiA2NCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FUkFOR0U7CisJCX0KKwl9CisJZXAtPmlzX2lzbyA9IHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVzYykgPyAxIDogMDsKKwl0bXAgPDw9IEVORFBPSU5UX1RZUEU7CisJdG1wIHw9ICgoZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmIDB4MGYpIDw8IEVORFBPSU5UX05VTUJFUik7CisJdG1wIHw9IHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykgPDwgRU5EUE9JTlRfRElSRUNUSU9OOworCXRtcCB8PSAoMSA8PCBFTkRQT0lOVF9FTkFCTEUpOworCisJLyogZm9yIE9VVCB0cmFuc2ZlcnMsIGJsb2NrIHRoZSByeCBmaWZvIHVudGlsIGEgcmVhZCBpcyBwb3N0ZWQgKi8KKwllcC0+aXNfaW4gPSB1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpOworCWlmICghZXAtPmlzX2luKQorCQluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9SU1BTRVQsIDEgPDwgQUxUX05BS19PVVRfUEFDS0VUUyk7CisKKwluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9DRkcsIHRtcCk7CisKKwkvKiBlbmFibGUgaXJxcyAqLworCXRtcCA9ICgxIDw8IGVwLT5udW0pIHwgbmV0MjI3Ml9yZWFkKGRldiwgSVJRRU5CMCk7CisJbmV0MjI3Ml93cml0ZShkZXYsIElSUUVOQjAsIHRtcCk7CisKKwl0bXAgPSAoMSA8PCBEQVRBX1BBQ0tFVF9SRUNFSVZFRF9JTlRFUlJVUFRfRU5BQkxFKQorCQl8ICgxIDw8IERBVEFfUEFDS0VUX1RSQU5TTUlUVEVEX0lOVEVSUlVQVF9FTkFCTEUpCisJCXwgbmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9JUlFFTkIpOworCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX0lSUUVOQiwgdG1wKTsKKworCXRtcCA9IGRlc2MtPmJFbmRwb2ludEFkZHJlc3M7CisJZGV2X2RiZyhkZXYtPmRldiwgImVuYWJsZWQgJXMgKGVwJWQlcy0lcykgbWF4ICUwNHggY2ZnICUwMnhcbiIsCisJCV9lcC0+bmFtZSwgdG1wICYgMHgwZiwgUElQRURJUih0bXApLAorCQl0eXBlX3N0cmluZyhkZXNjLT5ibUF0dHJpYnV0ZXMpLCBtYXgsCisJCW5ldDIyNzJfZXBfcmVhZChlcCwgRVBfQ0ZHKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmV0MjI3Ml9lcF9yZXNldChzdHJ1Y3QgbmV0MjI3Ml9lcCAqZXApCit7CisJdTggdG1wOworCisJZXAtPmRlc2MgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZlcC0+cXVldWUpOworCisJZXAtPmVwLm1heHBhY2tldCA9IH4wOworCWVwLT5lcC5vcHMgPSAmbmV0MjI3Ml9lcF9vcHM7CisKKwkvKiBkaXNhYmxlIGlycXMsIGVuZHBvaW50ICovCisJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfSVJRRU5CLCAwKTsKKworCS8qIGluaXQgdG8gb3VyIGNob3NlbiBkZWZhdWx0cywgbm90YWJseSBzbyB0aGF0IHdlIE5BSyBPVVQKKwkgKiBwYWNrZXRzIHVudGlsIHRoZSBkcml2ZXIgcXVldWVzIGEgcmVhZC4KKwkgKi8KKwl0bXAgPSAoMSA8PCBOQUtfT1VUX1BBQ0tFVFNfTU9ERSkgfCAoMSA8PCBBTFRfTkFLX09VVF9QQUNLRVRTKTsKKwluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9SU1BTRVQsIHRtcCk7CisKKwl0bXAgPSAoMSA8PCBJTlRFUlJVUFRfTU9ERSkgfCAoMSA8PCBISURFX1NUQVRVU19QSEFTRSk7CisJaWYgKGVwLT5udW0gIT0gMCkKKwkJdG1wIHw9ICgxIDw8IEVORFBPSU5UX1RPR0dMRSkgfCAoMSA8PCBFTkRQT0lOVF9IQUxUKTsKKworCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX1JTUENMUiwgdG1wKTsKKworCS8qIHNjcnViIG1vc3Qgc3RhdHVzIGJpdHMsIGFuZCBmbHVzaCBhbnkgZmlmbyBzdGF0ZSAqLworCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX1NUQVQwLAorCQkJICAoMSA8PCBEQVRBX0lOX1RPS0VOX0lOVEVSUlVQVCkKKwkJCXwgKDEgPDwgREFUQV9PVVRfVE9LRU5fSU5URVJSVVBUKQorCQkJfCAoMSA8PCBEQVRBX1BBQ0tFVF9UUkFOU01JVFRFRF9JTlRFUlJVUFQpCisJCQl8ICgxIDw8IERBVEFfUEFDS0VUX1JFQ0VJVkVEX0lOVEVSUlVQVCkKKwkJCXwgKDEgPDwgU0hPUlRfUEFDS0VUX1RSQU5TRkVSUkVEX0lOVEVSUlVQVCkpOworCisJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfU1RBVDEsCisJCQkgICAgKDEgPDwgVElNRU9VVCkKKwkJCSAgfCAoMSA8PCBVU0JfT1VUX0FDS19TRU5UKQorCQkJICB8ICgxIDw8IFVTQl9PVVRfTkFLX1NFTlQpCisJCQkgIHwgKDEgPDwgVVNCX0lOX0FDS19SQ1ZEKQorCQkJICB8ICgxIDw8IFVTQl9JTl9OQUtfU0VOVCkKKwkJCSAgfCAoMSA8PCBVU0JfU1RBTExfU0VOVCkKKwkJCSAgfCAoMSA8PCBMT0NBTF9PVVRfWkxQKQorCQkJICB8ICgxIDw8IEJVRkZFUl9GTFVTSCkpOworCisJLyogZmlmbyBzaXplIGlzIGhhbmRsZWQgc2VwZXJhdGVseSAqLworfQorCitzdGF0aWMgaW50IG5ldDIyNzJfZGlzYWJsZShzdHJ1Y3QgdXNiX2VwICpfZXApCit7CisJc3RydWN0IG5ldDIyNzJfZXAgKmVwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuZXQyMjcyX2VwLCBlcCk7CisJaWYgKCFfZXAgfHwgIWVwLT5kZXNjIHx8IF9lcC0+bmFtZSA9PSBlcDBuYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlcC0+ZGV2LT5sb2NrLCBmbGFncyk7CisJbmV0MjI3Ml9kZXF1ZXVlX2FsbChlcCk7CisJbmV0MjI3Ml9lcF9yZXNldChlcCk7CisKKwlkZXZfdmRiZyhlcC0+ZGV2LT5kZXYsICJkaXNhYmxlZCAlc1xuIiwgX2VwLT5uYW1lKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5kZXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKK25ldDIyNzJfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICpfZXAsIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgbmV0MjI3Ml9lcCAqZXA7CisJc3RydWN0IG5ldDIyNzJfcmVxdWVzdCAqcmVxOworCisJaWYgKCFfZXApCisJCXJldHVybiBOVUxMOworCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IG5ldDIyNzJfZXAsIGVwKTsKKworCXJlcSA9IGt6YWxsb2Moc2l6ZW9mKCpyZXEpLCBnZnBfZmxhZ3MpOworCWlmICghcmVxKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcS0+cmVxLmRtYSA9IERNQV9BRERSX0lOVkFMSUQ7CisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+cXVldWUpOworCisJcmV0dXJuICZyZXEtPnJlcTsKK30KKworc3RhdGljIHZvaWQKK25ldDIyNzJfZnJlZV9yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxKQoreworCXN0cnVjdCBuZXQyMjcyX2VwICplcDsKKwlzdHJ1Y3QgbmV0MjI3Ml9yZXF1ZXN0ICpyZXE7CisKKwllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuZXQyMjcyX2VwLCBlcCk7CisJaWYgKCFfZXAgfHwgIV9yZXEpCisJCXJldHVybjsKKworCXJlcSA9IGNvbnRhaW5lcl9vZihfcmVxLCBzdHJ1Y3QgbmV0MjI3Ml9yZXF1ZXN0LCByZXEpOworCVdBUk5fT04oIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKTsKKwlrZnJlZShyZXEpOworfQorCitzdGF0aWMgdm9pZAorbmV0MjI3Ml9kb25lKHN0cnVjdCBuZXQyMjcyX2VwICplcCwgc3RydWN0IG5ldDIyNzJfcmVxdWVzdCAqcmVxLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBuZXQyMjcyICpkZXY7CisJdW5zaWduZWQgc3RvcHBlZCA9IGVwLT5zdG9wcGVkOworCisJaWYgKGVwLT5udW0gPT0gMCkgeworCQlpZiAoZXAtPmRldi0+cHJvdG9jb2xfc3RhbGwpIHsKKwkJCWVwLT5zdG9wcGVkID0gMTsKKwkJCXNldF9oYWx0KGVwKTsKKwkJfQorCQlhbGxvd19zdGF0dXMoZXApOworCX0KKworCWxpc3RfZGVsX2luaXQoJnJlcS0+cXVldWUpOworCisJaWYgKHJlcS0+cmVxLnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJCXJlcS0+cmVxLnN0YXR1cyA9IHN0YXR1czsKKwllbHNlCisJCXN0YXR1cyA9IHJlcS0+cmVxLnN0YXR1czsKKworCWRldiA9IGVwLT5kZXY7CisJaWYgKHVzZV9kbWEgJiYgcmVxLT5tYXBwZWQpIHsKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYtPmRldiwgcmVxLT5yZXEuZG1hLCByZXEtPnJlcS5sZW5ndGgsCisJCQllcC0+aXNfaW4gPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKKwkJcmVxLT5yZXEuZG1hID0gRE1BX0FERFJfSU5WQUxJRDsKKwkJcmVxLT5tYXBwZWQgPSAwOworCX0KKworCWlmIChzdGF0dXMgJiYgc3RhdHVzICE9IC1FU0hVVERPV04pCisJCWRldl92ZGJnKGRldi0+ZGV2LCAiY29tcGxldGUgJXMgcmVxICVwIHN0YXQgJWQgbGVuICV1LyV1IGJ1ZiAlcFxuIiwKKwkJCWVwLT5lcC5uYW1lLCAmcmVxLT5yZXEsIHN0YXR1cywKKwkJCXJlcS0+cmVxLmFjdHVhbCwgcmVxLT5yZXEubGVuZ3RoLCByZXEtPnJlcS5idWYpOworCisJLyogZG9uJ3QgbW9kaWZ5IHF1ZXVlIGhlYWRzIGR1cmluZyBjb21wbGV0aW9uIGNhbGxiYWNrICovCisJZXAtPnN0b3BwZWQgPSAxOworCXNwaW5fdW5sb2NrKCZkZXYtPmxvY2spOworCXJlcS0+cmVxLmNvbXBsZXRlKCZlcC0+ZXAsICZyZXEtPnJlcSk7CisJc3Bpbl9sb2NrKCZkZXYtPmxvY2spOworCWVwLT5zdG9wcGVkID0gc3RvcHBlZDsKK30KKworc3RhdGljIGludAorbmV0MjI3Ml93cml0ZV9wYWNrZXQoc3RydWN0IG5ldDIyNzJfZXAgKmVwLCB1OCAqYnVmLAorCXN0cnVjdCBuZXQyMjcyX3JlcXVlc3QgKnJlcSwgdW5zaWduZWQgbWF4KQoreworCXUxNiBfX2lvbWVtICplcF9kYXRhID0gbmV0MjI3Ml9yZWdfYWRkcihlcC0+ZGV2LCBFUF9EQVRBKTsKKwl1MTYgKmJ1ZnA7CisJdW5zaWduZWQgbGVuZ3RoLCBjb3VudDsKKwl1OCB0bXA7CisKKwlsZW5ndGggPSBtaW4ocmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0dWFsLCBtYXgpOworCXJlcS0+cmVxLmFjdHVhbCArPSBsZW5ndGg7CisKKwlkZXZfdmRiZyhlcC0+ZGV2LT5kZXYsICJ3cml0ZSBwYWNrZXQgJXMgcmVxICVwIG1heCAldSBsZW4gJXUgYXZhaWwgJXVcbiIsCisJCWVwLT5lcC5uYW1lLCByZXEsIG1heCwgbGVuZ3RoLAorCQkobmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9BVkFJTDEpIDw8IDgpIHwgbmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9BVkFJTDApKTsKKworCWNvdW50ID0gbGVuZ3RoOworCWJ1ZnAgPSAodTE2ICopYnVmOworCisJd2hpbGUgKGxpa2VseShjb3VudCA+PSAyKSkgeworCQkvKiBubyBieXRlLXN3YXAgcmVxdWlyZWQ7IGNoaXAgZW5kaWFuIHNldCBkdXJpbmcgaW5pdCAqLworCQl3cml0ZXcoKmJ1ZnArKywgZXBfZGF0YSk7CisJCWNvdW50IC09IDI7CisJfQorCWJ1ZiA9ICh1OCAqKWJ1ZnA7CisKKwkvKiB3cml0ZSBmaW5hbCBieXRlIGJ5IHBsYWNpbmcgdGhlIE5FVDIyNzIgaW50byA4LWJpdCBtb2RlICovCisJaWYgKHVubGlrZWx5KGNvdW50KSkgeworCQl0bXAgPSBuZXQyMjcyX3JlYWQoZXAtPmRldiwgTE9DQ1RMKTsKKwkJbmV0MjI3Ml93cml0ZShlcC0+ZGV2LCBMT0NDVEwsIHRtcCAmIH4oMSA8PCBEQVRBX1dJRFRIKSk7CisJCXdyaXRlYigqYnVmLCBlcF9kYXRhKTsKKwkJbmV0MjI3Ml93cml0ZShlcC0+ZGV2LCBMT0NDVEwsIHRtcCk7CisJfQorCXJldHVybiBsZW5ndGg7Cit9CisKKy8qIHJldHVybnM6IDA6IHN0aWxsIHJ1bm5pbmcsIDE6IGNvbXBsZXRlZCwgbmVnYXRpdmU6IGVycm5vICovCitzdGF0aWMgaW50CituZXQyMjcyX3dyaXRlX2ZpZm8oc3RydWN0IG5ldDIyNzJfZXAgKmVwLCBzdHJ1Y3QgbmV0MjI3Ml9yZXF1ZXN0ICpyZXEpCit7CisJdTggKmJ1ZjsKKwl1bnNpZ25lZCBjb3VudCwgbWF4OworCWludCBzdGF0dXM7CisKKwlkZXZfdmRiZyhlcC0+ZGV2LT5kZXYsICJ3cml0ZV9maWZvICVzIGFjdHVhbCAlZCBsZW4gJWRcbiIsCisJCWVwLT5lcC5uYW1lLCByZXEtPnJlcS5hY3R1YWwsIHJlcS0+cmVxLmxlbmd0aCk7CisKKwkvKgorCSAqIEtlZXAgbG9hZGluZyB0aGUgZW5kcG9pbnQgdW50aWwgdGhlIGZpbmFsIHBhY2tldCBpcyBsb2FkZWQsCisJICogb3IgdGhlIGVuZHBvaW50IGJ1ZmZlciBpcyBmdWxsLgorCSAqLworIHRvcDoKKwkvKgorCSAqIENsZWFyIGludGVycnVwdCBzdGF0dXMKKwkgKiAgLSBQYWNrZXQgVHJhbnNtaXR0ZWQgaW50ZXJydXB0IHdpbGwgYmVjb21lIHNldCBhZ2FpbiB3aGVuIHRoZQorCSAqICAgIGhvc3Qgc3VjY2Vzc2Z1bGx5IHRha2VzIGFub3RoZXIgcGFja2V0CisJICovCisJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfU1RBVDAsICgxIDw8IERBVEFfUEFDS0VUX1RSQU5TTUlUVEVEX0lOVEVSUlVQVCkpOworCXdoaWxlICghKG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfU1RBVDApICYgKDEgPDwgQlVGRkVSX0ZVTEwpKSkgeworCQlidWYgPSByZXEtPnJlcS5idWYgKyByZXEtPnJlcS5hY3R1YWw7CisJCXByZWZldGNoKGJ1Zik7CisKKwkJLyogZm9yY2UgcGFnZXNlbCAqLworCQluZXQyMjcyX2VwX3JlYWQoZXAsIEVQX1NUQVQwKTsKKworCQltYXggPSAobmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9BVkFJTDEpIDw8IDgpIHwKKwkJCShuZXQyMjcyX2VwX3JlYWQoZXAsIEVQX0FWQUlMMCkpOworCisJCWlmIChtYXggPCBlcC0+ZXAubWF4cGFja2V0KQorCQkJbWF4ID0gKG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfQVZBSUwxKSA8PCA4KQorCQkJCXwgKG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfQVZBSUwwKSk7CisKKwkJY291bnQgPSBuZXQyMjcyX3dyaXRlX3BhY2tldChlcCwgYnVmLCByZXEsIG1heCk7CisJCS8qIHNlZSBpZiB3ZSBhcmUgZG9uZSAqLworCQlpZiAocmVxLT5yZXEubGVuZ3RoID09IHJlcS0+cmVxLmFjdHVhbCkgeworCQkJLyogdmFsaWRhdGUgc2hvcnQgb3IgemxwIHBhY2tldCAqLworCQkJaWYgKGNvdW50IDwgZXAtPmVwLm1heHBhY2tldCkKKwkJCQlzZXRfZmlmb19ieXRlY291bnQoZXAsIDApOworCQkJbmV0MjI3Ml9kb25lKGVwLCByZXEsIDApOworCisJCQlpZiAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsKKwkJCQlyZXEgPSBsaXN0X2VudHJ5KGVwLT5xdWV1ZS5uZXh0LAorCQkJCQkJc3RydWN0IG5ldDIyNzJfcmVxdWVzdCwKKwkJCQkJCXF1ZXVlKTsKKwkJCQlzdGF0dXMgPSBuZXQyMjcyX2tpY2tfZG1hKGVwLCByZXEpOworCisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWlmICgobmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9TVEFUMCkKKwkJCQkJCQkmICgxIDw8IEJVRkZFUl9FTVBUWSkpKQorCQkJCQkJZ290byB0b3A7CisJCQl9CisJCQlyZXR1cm4gMTsKKwkJfQorCQluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9TVEFUMCwgKDEgPDwgREFUQV9QQUNLRVRfVFJBTlNNSVRURURfSU5URVJSVVBUKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbmV0MjI3Ml9vdXRfZmx1c2goc3RydWN0IG5ldDIyNzJfZXAgKmVwKQoreworCUFTU0VSVF9PVVRfTkFLSU5HKGVwKTsKKworCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX1NUQVQwLCAoMSA8PCBEQVRBX09VVF9UT0tFTl9JTlRFUlJVUFQpCisJCQl8ICgxIDw8IERBVEFfUEFDS0VUX1JFQ0VJVkVEX0lOVEVSUlVQVCkpOworCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX1NUQVQxLCAxIDw8IEJVRkZFUl9GTFVTSCk7Cit9CisKK3N0YXRpYyBpbnQKK25ldDIyNzJfcmVhZF9wYWNrZXQoc3RydWN0IG5ldDIyNzJfZXAgKmVwLCB1OCAqYnVmLAorCXN0cnVjdCBuZXQyMjcyX3JlcXVlc3QgKnJlcSwgdW5zaWduZWQgYXZhaWwpCit7CisJdTE2IF9faW9tZW0gKmVwX2RhdGEgPSBuZXQyMjcyX3JlZ19hZGRyKGVwLT5kZXYsIEVQX0RBVEEpOworCXVuc2lnbmVkIGlzX3Nob3J0OworCXUxNiAqYnVmcDsKKworCXJlcS0+cmVxLmFjdHVhbCArPSBhdmFpbDsKKworCWRldl92ZGJnKGVwLT5kZXYtPmRldiwgInJlYWQgcGFja2V0ICVzIHJlcSAlcCBsZW4gJXUgYXZhaWwgJXVcbiIsCisJCWVwLT5lcC5uYW1lLCByZXEsIGF2YWlsLAorCQkobmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9BVkFJTDEpIDw8IDgpIHwgbmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9BVkFJTDApKTsKKworCWlzX3Nob3J0ID0gKGF2YWlsIDwgZXAtPmVwLm1heHBhY2tldCk7CisKKwlpZiAodW5saWtlbHkoYXZhaWwgPT0gMCkpIHsKKwkJLyogcmVtb3ZlIGFueSB6bHAgZnJvbSB0aGUgYnVmZmVyICovCisJCSh2b2lkKXJlYWR3KGVwX2RhdGEpOworCQlyZXR1cm4gaXNfc2hvcnQ7CisJfQorCisJLyogRW5zdXJlIHdlIGdldCB0aGUgZmluYWwgYnl0ZSAqLworCWlmICh1bmxpa2VseShhdmFpbCAlIDIpKQorCQlhdmFpbCsrOworCWJ1ZnAgPSAodTE2ICopYnVmOworCisJZG8geworCQkqYnVmcCsrID0gcmVhZHcoZXBfZGF0YSk7CisJCWF2YWlsIC09IDI7CisJfSB3aGlsZSAoYXZhaWwpOworCisJLyoKKwkgKiBUbyBhdm9pZCBmYWxzZSBlbmRwb2ludCBhdmFpbGFibGUgcmFjZSBjb25kaXRpb24gbXVzdCByZWFkCisJICogZXAgc3RhdDAgdHdpY2UgaW4gdGhlIGNhc2Ugb2YgYSBzaG9ydCB0cmFuc2ZlcgorCSAqLworCWlmIChuZXQyMjcyX2VwX3JlYWQoZXAsIEVQX1NUQVQwKSAmICgxIDw8IFNIT1JUX1BBQ0tFVF9UUkFOU0ZFUlJFRF9JTlRFUlJVUFQpKQorCQluZXQyMjcyX2VwX3JlYWQoZXAsIEVQX1NUQVQwKTsKKworCXJldHVybiBpc19zaG9ydDsKK30KKworc3RhdGljIGludAorbmV0MjI3Ml9yZWFkX2ZpZm8oc3RydWN0IG5ldDIyNzJfZXAgKmVwLCBzdHJ1Y3QgbmV0MjI3Ml9yZXF1ZXN0ICpyZXEpCit7CisJdTggKmJ1ZjsKKwl1bnNpZ25lZCBpc19zaG9ydDsKKwlpbnQgY291bnQ7CisJaW50IHRtcDsKKwlpbnQgY2xlYW51cCA9IDA7CisJaW50IHN0YXR1cyA9IC0xOworCisJZGV2X3ZkYmcoZXAtPmRldi0+ZGV2LCAicmVhZF9maWZvICVzIGFjdHVhbCAlZCBsZW4gJWRcbiIsCisJCWVwLT5lcC5uYW1lLCByZXEtPnJlcS5hY3R1YWwsIHJlcS0+cmVxLmxlbmd0aCk7CisKKyB0b3A6CisJZG8geworCQlidWYgPSByZXEtPnJlcS5idWYgKyByZXEtPnJlcS5hY3R1YWw7CisJCXByZWZldGNodyhidWYpOworCisJCWNvdW50ID0gKG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfQVZBSUwxKSA8PCA4KQorCQkJfCBuZXQyMjcyX2VwX3JlYWQoZXAsIEVQX0FWQUlMMCk7CisKKwkJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfU1RBVDAsCisJCQkoMSA8PCBTSE9SVF9QQUNLRVRfVFJBTlNGRVJSRURfSU5URVJSVVBUKSB8CisJCQkoMSA8PCBEQVRBX1BBQ0tFVF9SRUNFSVZFRF9JTlRFUlJVUFQpKTsKKworCQl0bXAgPSByZXEtPnJlcS5sZW5ndGggLSByZXEtPnJlcS5hY3R1YWw7CisKKwkJaWYgKGNvdW50ID4gdG1wKSB7CisJCQlpZiAoKHRtcCAlIGVwLT5lcC5tYXhwYWNrZXQpICE9IDApIHsKKwkJCQlkZXZfZXJyKGVwLT5kZXYtPmRldiwKKwkJCQkJIiVzIG91dCBmaWZvICVkIGJ5dGVzLCBleHBlY3RlZCAlZFxuIiwKKwkJCQkJZXAtPmVwLm5hbWUsIGNvdW50LCB0bXApOworCQkJCWNsZWFudXAgPSAxOworCQkJfQorCQkJY291bnQgPSAodG1wID4gMCkgPyB0bXAgOiAwOworCQl9CisKKwkJaXNfc2hvcnQgPSBuZXQyMjcyX3JlYWRfcGFja2V0KGVwLCBidWYsIHJlcSwgY291bnQpOworCisJCS8qIGNvbXBsZXRpb24gKi8KKwkJaWYgKHVubGlrZWx5KGNsZWFudXAgfHwgaXNfc2hvcnQgfHwKKwkJCQkoKHJlcS0+cmVxLmFjdHVhbCA9PSByZXEtPnJlcS5sZW5ndGgpCisJCQkJICYmICFyZXEtPnJlcS56ZXJvKSkpIHsKKworCQkJaWYgKGNsZWFudXApIHsKKwkJCQluZXQyMjcyX291dF9mbHVzaChlcCk7CisJCQkJbmV0MjI3Ml9kb25lKGVwLCByZXEsIC1FT1ZFUkZMT1cpOworCQkJfSBlbHNlCisJCQkJbmV0MjI3Ml9kb25lKGVwLCByZXEsIDApOworCisJCQkvKiByZS1pbml0aWFsaXplIGVuZHBvaW50IHRyYW5zZmVyIHJlZ2lzdGVycworCQkJICogb3RoZXJ3aXNlIHRoZXkgbWF5IHJlc3VsdCBpbiBlcnJvbmVvdXMgcHJlLXZhbGlkYXRpb24KKwkJCSAqIGZvciBzdWJzZXF1ZW50IGNvbnRyb2wgcmVhZHMKKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KGVwLT5udW0gPT0gMCkpIHsKKwkJCQluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9UUkFOU0ZFUjIsIDApOworCQkJCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX1RSQU5TRkVSMSwgMCk7CisJCQkJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfVFJBTlNGRVIwLCAwKTsKKwkJCX0KKworCQkJaWYgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7CisJCQkJcmVxID0gbGlzdF9lbnRyeShlcC0+cXVldWUubmV4dCwKKwkJCQkJc3RydWN0IG5ldDIyNzJfcmVxdWVzdCwgcXVldWUpOworCQkJCXN0YXR1cyA9IG5ldDIyNzJfa2lja19kbWEoZXAsIHJlcSk7CisJCQkJaWYgKChzdGF0dXMgPCAwKSAmJgorCQkJCSAgICAhKG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfU1RBVDApICYgKDEgPDwgQlVGRkVSX0VNUFRZKSkpCisJCQkJCWdvdG8gdG9wOworCQkJfQorCQkJcmV0dXJuIDE7CisJCX0KKwl9IHdoaWxlICghKG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfU1RBVDApICYgKDEgPDwgQlVGRkVSX0VNUFRZKSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCituZXQyMjcyX3Bpb19hZHZhbmNlKHN0cnVjdCBuZXQyMjcyX2VwICplcCkKK3sKKwlzdHJ1Y3QgbmV0MjI3Ml9yZXF1ZXN0ICpyZXE7CisKKwlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkpCisJCXJldHVybjsKKworCXJlcSA9IGxpc3RfZW50cnkoZXAtPnF1ZXVlLm5leHQsIHN0cnVjdCBuZXQyMjcyX3JlcXVlc3QsIHF1ZXVlKTsKKwkoZXAtPmlzX2luID8gbmV0MjI3Ml93cml0ZV9maWZvIDogbmV0MjI3Ml9yZWFkX2ZpZm8pKGVwLCByZXEpOworfQorCisvKiByZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBuZWdhdGl2ZSBlcnJubyAqLworc3RhdGljIGludAorbmV0MjI3Ml9yZXF1ZXN0X2RtYShzdHJ1Y3QgbmV0MjI3MiAqZGV2LCB1bnNpZ25lZCBlcCwgdTMyIGJ1ZiwKKwl1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGRpcikKK3sKKwlkZXZfdmRiZyhkZXYtPmRldiwgInJlcXVlc3RfZG1hIGVwICVkIGJ1ZiAlMDh4IGxlbiAlZCBkaXIgJWRcbiIsCisJCWVwLCBidWYsIGxlbiwgZGlyKTsKKworCS8qIFRoZSBORVQyMjcyIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgZG1hIGNoYW5uZWwgKi8KKwlpZiAoZGV2LT5kbWFfYnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKwkvKgorCSAqIEVQX1RSQU5TRkVSICh1c2VkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkCisJICogaW4gYW4gT1VUIHRyYW5zZmVyKSBpcyAyNCBiaXRzIHdpZGU7IGRvbid0IGFzayBmb3IgbW9yZSB0aGFuIHRoYXQuCisJICovCisJaWYgKChkaXIgPT0gMSkgJiYgKGxlbiA+IDB4MTAwMDAwMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5kbWFfYnVzeSA9IDE7CisKKwkvKiBpbml0aWFsaXplIHBsYXRmb3JtJ3MgZG1hICovCisjaWZkZWYgQ09ORklHX1BDSQorCS8qIE5FVDIyNzIgYWRkciwgYnVmZmVyIGFkZHIsIGxlbmd0aCwgZXRjLiAqLworCXN3aXRjaCAoZGV2LT5kZXZfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUkRLMToKKwkJLyogU2V0dXAgUExYIDkwNTQgRE1BIG1vZGUgKi8KKwkJd3JpdGVsKCgxIDw8IExPQ0FMX0JVU19XSURUSCkgfAorCQkJKDEgPDwgVEFfUkVBRFlfSU5QVVRfRU5BQkxFKSB8CisJCQkoMCA8PCBMT0NBTF9CVVJTVF9FTkFCTEUpIHwKKwkJCSgxIDw8IERPTkVfSU5URVJSVVBUX0VOQUJMRSkgfAorCQkJKDEgPDwgTE9DQUxfQUREUkVTU0lOR19NT0RFKSB8CisJCQkoMSA8PCBERU1BTkRfTU9ERSkgfAorCQkJKDEgPDwgRE1BX0VPVF9FTkFCTEUpIHwKKwkJCSgxIDw8IEZBU1RfU0xPV19URVJNSU5BVEVfTU9ERV9TRUxFQ1QpIHwKKwkJCSgxIDw8IERNQV9DSEFOTkVMX0lOVEVSUlVQVF9TRUxFQ1QpLAorCQkJZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyICsgRE1BTU9ERTApOworCisJCXdyaXRlbCgweDEwMDAwMCwgZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyICsgRE1BTEFEUjApOworCQl3cml0ZWwoYnVmLCBkZXYtPnJkazEucGx4OTA1NF9iYXNlX2FkZHIgKyBETUFQQURSMCk7CisJCXdyaXRlbChsZW4sIGRldi0+cmRrMS5wbHg5MDU0X2Jhc2VfYWRkciArIERNQVNJWjApOworCQl3cml0ZWwoKGRpciA8PCBESVJFQ1RJT05fT0ZfVFJBTlNGRVIpIHwKKwkJCSgxIDw8IElOVEVSUlVQVF9BRlRFUl9URVJNSU5BTF9DT1VOVCksCisJCQlkZXYtPnJkazEucGx4OTA1NF9iYXNlX2FkZHIgKyBETUFEUFIwKTsKKwkJd3JpdGVsKCgxIDw8IExPQ0FMX0RNQV9DSEFOTkVMXzBfSU5URVJSVVBUX0VOQUJMRSkgfAorCQkJcmVhZGwoZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyICsgSU5UQ1NSKSwKKwkJCWRldi0+cmRrMS5wbHg5MDU0X2Jhc2VfYWRkciArIElOVENTUik7CisKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwluZXQyMjcyX3dyaXRlKGRldiwgRE1BUkVRLAorCQkoMCA8PCBETUFfQlVGRkVSX1ZBTElEKSB8CisJCSgxIDw8IERNQV9SRVFVRVNUX0VOQUJMRSkgfAorCQkoMSA8PCBETUFfQ09OVFJPTF9EQUNLKSB8CisJCShkZXYtPmRtYV9lb3RfcG9sYXJpdHkgPDwgRU9UX1BPTEFSSVRZKSB8CisJCShkZXYtPmRtYV9kYWNrX3BvbGFyaXR5IDw8IERBQ0tfUE9MQVJJVFkpIHwKKwkJKGRldi0+ZG1hX2RyZXFfcG9sYXJpdHkgPDwgRFJFUV9QT0xBUklUWSkgfAorCQkoKGVwID4+IDEpIDw8IERNQV9FTkRQT0lOVF9TRUxFQ1QpKTsKKworCSh2b2lkKSBuZXQyMjcyX3JlYWQoZGV2LCBTQ1JBVENIKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbmV0MjI3Ml9zdGFydF9kbWEoc3RydWN0IG5ldDIyNzIgKmRldikKK3sKKwkvKiBzdGFydCBwbGF0Zm9ybSdzIGRtYSBjb250cm9sbGVyICovCisjaWZkZWYgQ09ORklHX1BDSQorCXN3aXRjaCAoZGV2LT5kZXZfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUkRLMToKKwkJd3JpdGViKCgxIDw8IENIQU5ORUxfRU5BQkxFKSB8ICgxIDw8IENIQU5ORUxfU1RBUlQpLAorCQkJZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyICsgRE1BQ1NSMCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorfQorCisvKiByZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBuZWdhdGl2ZSBlcnJubyAqLworc3RhdGljIGludAorbmV0MjI3Ml9raWNrX2RtYShzdHJ1Y3QgbmV0MjI3Ml9lcCAqZXAsIHN0cnVjdCBuZXQyMjcyX3JlcXVlc3QgKnJlcSkKK3sKKwl1bnNpZ25lZCBzaXplOworCXU4IHRtcDsKKworCWlmICghdXNlX2RtYSB8fCAoZXAtPm51bSA8IDEpIHx8IChlcC0+bnVtID4gMikgfHwgIWVwLT5kbWEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZG9uJ3QgdXNlIGRtYSBmb3Igb2RkLWxlbmd0aCB0cmFuc2ZlcnMKKwkgKiBvdGhlcndpc2UsIHdlJ2QgbmVlZCB0byBkZWFsIHdpdGggdGhlIGxhc3QgYnl0ZSB3aXRoIHBpbworCSAqLworCWlmIChyZXEtPnJlcS5sZW5ndGggJiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl92ZGJnKGVwLT5kZXYtPmRldiwgImtpY2tfZG1hICVzIHJlcSAlcCBkbWEgJTA4bGx4XG4iLAorCQllcC0+ZXAubmFtZSwgcmVxLCAodW5zaWduZWQgbG9uZyBsb25nKSByZXEtPnJlcS5kbWEpOworCisJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfUlNQU0VULCAxIDw8IEFMVF9OQUtfT1VUX1BBQ0tFVFMpOworCisJLyogVGhlIE5FVDIyNzIgY2FuIG9ubHkgdXNlIERNQSBvbiBvbmUgZW5kcG9pbnQgYXQgYSB0aW1lICovCisJaWYgKGVwLT5kZXYtPmRtYV9idXN5KQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogTWFrZSBzdXJlIHdlIG9ubHkgRE1BIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzICh3ZSdsbCB1c2UKKwkgKiBwaW8gdG8gY29tcGxldGUgdGhlIHRyYW5zZmVyKQorCSAqLworCXNpemUgPSByZXEtPnJlcS5sZW5ndGg7CisJc2l6ZSAmPSB+MTsKKworCS8qIGRldmljZS10by1ob3N0IHRyYW5zZmVyICovCisJaWYgKGVwLT5pc19pbikgeworCQkvKiBpbml0aWFsaXplIHBsYXRmb3JtJ3MgZG1hIGNvbnRyb2xsZXIgKi8KKwkJaWYgKG5ldDIyNzJfcmVxdWVzdF9kbWEoZXAtPmRldiwgZXAtPm51bSwgcmVxLT5yZXEuZG1hLCBzaXplLCAwKSkKKwkJCS8qIHVuYWJsZSB0byBvYnRhaW4gRE1BIGNoYW5uZWw7IHJldHVybiBlcnJvciBhbmQgdXNlIHBpbyBtb2RlICovCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXEtPnJlcS5hY3R1YWwgKz0gc2l6ZTsKKworCS8qIGhvc3QtdG8tZGV2aWNlIHRyYW5zZmVyICovCisJfSBlbHNlIHsKKwkJdG1wID0gbmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9TVEFUMCk7CisKKwkJLyogaW5pdGlhbGl6ZSBwbGF0Zm9ybSdzIGRtYSBjb250cm9sbGVyICovCisJCWlmIChuZXQyMjcyX3JlcXVlc3RfZG1hKGVwLT5kZXYsIGVwLT5udW0sIHJlcS0+cmVxLmRtYSwgc2l6ZSwgMSkpCisJCQkvKiB1bmFibGUgdG8gb2J0YWluIERNQSBjaGFubmVsOyByZXR1cm4gZXJyb3IgYW5kIHVzZSBwaW8gbW9kZSAqLworCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoISh0bXAgJiAoMSA8PCBCVUZGRVJfRU1QVFkpKSkKKwkJCWVwLT5ub3RfZW1wdHkgPSAxOworCQllbHNlCisJCQllcC0+bm90X2VtcHR5ID0gMDsKKworCisJCS8qIGFsbG93IHRoZSBlbmRwb2ludCdzIGJ1ZmZlciB0byBmaWxsICovCisJCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX1JTUENMUiwgMSA8PCBBTFRfTkFLX09VVF9QQUNLRVRTKTsKKworCQkvKiB0aGlzIHRyYW5zZmVyIGNvbXBsZXRlZCBhbmQgZGF0YSdzIGFscmVhZHkgaW4gdGhlIGZpZm8KKwkJICogcmV0dXJuIGVycm9yIHNvIHBpbyBnZXRzIHVzZWQuCisJCSAqLworCQlpZiAodG1wICYgKDEgPDwgU0hPUlRfUEFDS0VUX1RSQU5TRkVSUkVEX0lOVEVSUlVQVCkpIHsKKworCQkJLyogZGVhc3NlcnQgZHJlcSAqLworCQkJbmV0MjI3Ml93cml0ZShlcC0+ZGV2LCBETUFSRVEsCisJCQkJKDAgPDwgRE1BX0JVRkZFUl9WQUxJRCkgfAorCQkJCSgwIDw8IERNQV9SRVFVRVNUX0VOQUJMRSkgfAorCQkJCSgxIDw8IERNQV9DT05UUk9MX0RBQ0spIHwKKwkJCQkoZXAtPmRldi0+ZG1hX2VvdF9wb2xhcml0eSA8PCBFT1RfUE9MQVJJVFkpIHwKKwkJCQkoZXAtPmRldi0+ZG1hX2RhY2tfcG9sYXJpdHkgPDwgREFDS19QT0xBUklUWSkgfAorCQkJCShlcC0+ZGV2LT5kbWFfZHJlcV9wb2xhcml0eSA8PCBEUkVRX1BPTEFSSVRZKSB8CisJCQkJKChlcC0+bnVtID4+IDEpIDw8IERNQV9FTkRQT0lOVF9TRUxFQ1QpKTsKKworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCS8qIERvbid0IHVzZSBwZXItcGFja2V0IGludGVycnVwdHM6IHVzZSBkbWEgaW50ZXJydXB0cyBvbmx5ICovCisJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfSVJRRU5CLCAwKTsKKworCW5ldDIyNzJfc3RhcnRfZG1hKGVwLT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ldDIyNzJfY2FuY2VsX2RtYShzdHJ1Y3QgbmV0MjI3MiAqZGV2KQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlzd2l0Y2ggKGRldi0+ZGV2X2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JESzE6CisJCXdyaXRlYigwLCBkZXYtPnJkazEucGx4OTA1NF9iYXNlX2FkZHIgKyBETUFDU1IwKTsKKwkJd3JpdGViKDEgPDwgQ0hBTk5FTF9BQk9SVCwgZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyICsgRE1BQ1NSMCk7CisJCXdoaWxlICghKHJlYWRiKGRldi0+cmRrMS5wbHg5MDU0X2Jhc2VfYWRkciArIERNQUNTUjApICYKKwkJICAgICAgICAgKDEgPDwgQ0hBTk5FTF9ET05FKSkpCisJCQljb250aW51ZTsJLyogd2FpdCBmb3IgZG1hIHRvIHN0YWJhbGl6ZSAqLworCisJCS8qIGRtYSBhYm9ydCBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0ICovCisJCXdyaXRlYigxIDw8IENIQU5ORUxfQ0xFQVJfSU5URVJSVVBULAorCQkJZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyICsgRE1BQ1NSMCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJZGV2LT5kbWFfYnVzeSA9IDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludAorbmV0MjI3Ml9xdWV1ZShzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBuZXQyMjcyX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgbmV0MjI3Ml9lcCAqZXA7CisJc3RydWN0IG5ldDIyNzIgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGF0dXMgPSAtMTsKKwl1OCBzOworCisJcmVxID0gY29udGFpbmVyX29mKF9yZXEsIHN0cnVjdCBuZXQyMjcyX3JlcXVlc3QsIHJlcSk7CisJaWYgKCFfcmVxIHx8ICFfcmVxLT5jb21wbGV0ZSB8fCAhX3JlcS0+YnVmCisJCQl8fCAhbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSkpCisJCXJldHVybiAtRUlOVkFMOworCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IG5ldDIyNzJfZXAsIGVwKTsKKwlpZiAoIV9lcCB8fCAoIWVwLT5kZXNjICYmIGVwLT5udW0gIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCWRldiA9IGVwLT5kZXY7CisJaWYgKCFkZXYtPmRyaXZlciB8fCBkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwkvKiBzZXQgdXAgZG1hIG1hcHBpbmcgaW4gY2FzZSB0aGUgY2FsbGVyIGRpZG4ndCAqLworCWlmICh1c2VfZG1hICYmIGVwLT5kbWEgJiYgX3JlcS0+ZG1hID09IERNQV9BRERSX0lOVkFMSUQpIHsKKwkJX3JlcS0+ZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LT5kZXYsIF9yZXEtPmJ1ZiwgX3JlcS0+bGVuZ3RoLAorCQkJZXAtPmlzX2luID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CisJCXJlcS0+bWFwcGVkID0gMTsKKwl9CisKKwlkZXZfdmRiZyhkZXYtPmRldiwgIiVzIHF1ZXVlIHJlcSAlcCwgbGVuICVkIGJ1ZiAlcCBkbWEgJTA4bGx4ICVzXG4iLAorCQlfZXAtPm5hbWUsIF9yZXEsIF9yZXEtPmxlbmd0aCwgX3JlcS0+YnVmLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSBfcmVxLT5kbWEsIF9yZXEtPnplcm8gPyAiemVybyIgOiAiIXplcm8iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKworCV9yZXEtPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwlfcmVxLT5hY3R1YWwgPSAwOworCisJLyoga2lja3N0YXJ0IHRoaXMgaS9vIHF1ZXVlPyAqLworCWlmIChsaXN0X2VtcHR5KCZlcC0+cXVldWUpICYmICFlcC0+c3RvcHBlZCkgeworCQkvKiBtYXliZSB0aGVyZSdzIG5vIGNvbnRyb2wgZGF0YSwganVzdCBzdGF0dXMgYWNrICovCisJCWlmIChlcC0+bnVtID09IDAgJiYgX3JlcS0+bGVuZ3RoID09IDApIHsKKwkJCW5ldDIyNzJfZG9uZShlcCwgcmVxLCAwKTsKKwkJCWRldl92ZGJnKGRldi0+ZGV2LCAiJXMgc3RhdHVzIGFja1xuIiwgZXAtPmVwLm5hbWUpOworCQkJZ290byBkb25lOworCQl9CisKKwkJLyogUmV0dXJuIHpscCwgZG9uJ3QgbGV0IGl0IGJsb2NrIHN1YnNlcXVlbnQgcGFja2V0cyAqLworCQlzID0gbmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9TVEFUMCk7CisJCWlmIChzICYgKDEgPDwgQlVGRkVSX0VNUFRZKSkgeworCQkJLyogQnVmZmVyIGlzIGVtcHR5IGNoZWNrIGZvciBhIGJsb2NraW5nIHpscCwgaGFuZGxlIGl0ICovCisJCQlpZiAoKHMgJiAoMSA8PCBOQUtfT1VUX1BBQ0tFVFMpKSAmJgorCQkJICAgIG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfU1RBVDEpICYgKDEgPDwgTE9DQUxfT1VUX1pMUCkpIHsKKwkJCQlkZXZfZGJnKGRldi0+ZGV2LCAiV0FSTklORzogcmV0dXJuaW5nIFpMUCBzaG9ydCBwYWNrZXQgdGVybWluYXRpb24hXG4iKTsKKwkJCQkvKgorCQkJCSAqIFJlcXVlc3QgaXMgZ29pbmcgdG8gdGVybWluYXRlIHdpdGggYSBzaG9ydCBwYWNrZXQgLi4uCisJCQkJICogaG9wZSB0aGUgY2xpZW50IGlzIHJlYWR5IGZvciBpdCEKKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSBuZXQyMjcyX3JlYWRfZmlmbyhlcCwgcmVxKTsKKwkJCQkvKiBjbGVhciBzaG9ydCBwYWNrZXQgbmFraW5nICovCisJCQkJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfU1RBVDAsICgxIDw8IE5BS19PVVRfUEFDS0VUUykpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCisJCS8qIHRyeSBkbWEgZmlyc3QgKi8KKwkJc3RhdHVzID0gbmV0MjI3Ml9raWNrX2RtYShlcCwgcmVxKTsKKworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJLyogZG1hIGZhaWxlZCAobW9zdCBsaWtlbHkgaW4gdXNlIGJ5IGFub3RoZXIgZW5kcG9pbnQpCisJCQkgKiBmYWxsYmFjayB0byBwaW8KKwkJCSAqLworCQkJc3RhdHVzID0gMDsKKworCQkJaWYgKGVwLT5pc19pbikKKwkJCQlzdGF0dXMgPSBuZXQyMjcyX3dyaXRlX2ZpZm8oZXAsIHJlcSk7CisJCQllbHNlIHsKKwkJCQlzID0gbmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9TVEFUMCk7CisJCQkJaWYgKChzICYgKDEgPDwgQlVGRkVSX0VNUFRZKSkgPT0gMCkKKwkJCQkJc3RhdHVzID0gbmV0MjI3Ml9yZWFkX2ZpZm8oZXAsIHJlcSk7CisJCQl9CisKKwkJCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpIHsKKwkJCQlpZiAoc3RhdHVzID4gMCkKKwkJCQkJc3RhdHVzID0gMDsKKwkJCQlyZXEgPSBOVUxMOworCQkJfQorCQl9CisJfQorCWlmIChsaWtlbHkocmVxICE9IDApKQorCQlsaXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlLCAmZXAtPnF1ZXVlKTsKKworCWlmIChsaWtlbHkoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpKQorCQluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9SU1BDTFIsIDEgPDwgQUxUX05BS19PVVRfUEFDS0VUUyk7CisgZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiBkZXF1ZXVlIEFMTCByZXF1ZXN0cyAqLworc3RhdGljIHZvaWQKK25ldDIyNzJfZGVxdWV1ZV9hbGwoc3RydWN0IG5ldDIyNzJfZXAgKmVwKQoreworCXN0cnVjdCBuZXQyMjcyX3JlcXVlc3QgKnJlcTsKKworCS8qIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQgKi8KKwllcC0+c3RvcHBlZCA9IDE7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsKKwkJcmVxID0gbGlzdF9lbnRyeShlcC0+cXVldWUubmV4dCwKKwkJCQlzdHJ1Y3QgbmV0MjI3Ml9yZXF1ZXN0LAorCQkJCXF1ZXVlKTsKKwkJbmV0MjI3Ml9kb25lKGVwLCByZXEsIC1FU0hVVERPV04pOworCX0KK30KKworLyogZGVxdWV1ZSBKVVNUIE9ORSByZXF1ZXN0ICovCitzdGF0aWMgaW50CituZXQyMjcyX2RlcXVldWUoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEpCit7CisJc3RydWN0IG5ldDIyNzJfZXAgKmVwOworCXN0cnVjdCBuZXQyMjcyX3JlcXVlc3QgKnJlcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdG9wcGVkOworCisJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbmV0MjI3Ml9lcCwgZXApOworCWlmICghX2VwIHx8ICghZXAtPmRlc2MgJiYgZXAtPm51bSAhPSAwKSB8fCAhX3JlcSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXAtPmRldi0+bG9jaywgZmxhZ3MpOworCXN0b3BwZWQgPSBlcC0+c3RvcHBlZDsKKwllcC0+c3RvcHBlZCA9IDE7CisKKwkvKiBtYWtlIHN1cmUgaXQncyBzdGlsbCBxdWV1ZWQgb24gdGhpcyBlbmRwb2ludCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmZXAtPnF1ZXVlLCBxdWV1ZSkgeworCQlpZiAoJnJlcS0+cmVxID09IF9yZXEpCisJCQlicmVhazsKKwl9CisJaWYgKCZyZXEtPnJlcSAhPSBfcmVxKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5kZXYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcXVldWUgaGVhZCBtYXkgYmUgcGFydGlhbGx5IGNvbXBsZXRlICovCisJaWYgKGVwLT5xdWV1ZS5uZXh0ID09ICZyZXEtPnF1ZXVlKSB7CisJCWRldl9kYmcoZXAtPmRldi0+ZGV2LCAidW5saW5rICglcykgcGlvXG4iLCBfZXAtPm5hbWUpOworCQluZXQyMjcyX2RvbmUoZXAsIHJlcSwgLUVDT05OUkVTRVQpOworCX0KKwlyZXEgPSBOVUxMOworCWVwLT5zdG9wcGVkID0gc3RvcHBlZDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5kZXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50CituZXQyMjcyX3NldF9oYWx0X2FuZF93ZWRnZShzdHJ1Y3QgdXNiX2VwICpfZXAsIGludCB2YWx1ZSwgaW50IHdlZGdlZCkKK3sKKwlzdHJ1Y3QgbmV0MjI3Ml9lcCAqZXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IG5ldDIyNzJfZXAsIGVwKTsKKwlpZiAoIV9lcCB8fCAoIWVwLT5kZXNjICYmIGVwLT5udW0gIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghZXAtPmRldi0+ZHJpdmVyIHx8IGVwLT5kZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikKKwkJcmV0dXJuIC1FU0hVVERPV047CisJaWYgKGVwLT5kZXNjIC8qIG5vdCBlcDAgKi8gJiYgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcC0+ZGVzYykpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVwLT5kZXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpCisJCXJldCA9IC1FQUdBSU47CisJZWxzZSBpZiAoZXAtPmlzX2luICYmIHZhbHVlICYmIG5ldDIyNzJfZmlmb19zdGF0dXMoX2VwKSAhPSAwKQorCQlyZXQgPSAtRUFHQUlOOworCWVsc2UgeworCQlkZXZfdmRiZyhlcC0+ZGV2LT5kZXYsICIlcyAlcyAlc1xuIiwgX2VwLT5uYW1lLAorCQkJdmFsdWUgPyAic2V0IiA6ICJjbGVhciIsCisJCQl3ZWRnZWQgPyAid2VkZ2UiIDogImhhbHQiKTsKKwkJLyogc2V0L2NsZWFyICovCisJCWlmICh2YWx1ZSkgeworCQkJaWYgKGVwLT5udW0gPT0gMCkKKwkJCQllcC0+ZGV2LT5wcm90b2NvbF9zdGFsbCA9IDE7CisJCQllbHNlCisJCQkJc2V0X2hhbHQoZXApOworCQkJaWYgKHdlZGdlZCkKKwkJCQllcC0+d2VkZ2VkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWNsZWFyX2hhbHQoZXApOworCQkJZXAtPndlZGdlZCA9IDA7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmRldi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbmV0MjI3Ml9zZXRfaGFsdChzdHJ1Y3QgdXNiX2VwICpfZXAsIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gbmV0MjI3Ml9zZXRfaGFsdF9hbmRfd2VkZ2UoX2VwLCB2YWx1ZSwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK25ldDIyNzJfc2V0X3dlZGdlKHN0cnVjdCB1c2JfZXAgKl9lcCkKK3sKKwlpZiAoIV9lcCB8fCBfZXAtPm5hbWUgPT0gZXAwbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG5ldDIyNzJfc2V0X2hhbHRfYW5kX3dlZGdlKF9lcCwgMSwgMSk7Cit9CisKK3N0YXRpYyBpbnQKK25ldDIyNzJfZmlmb19zdGF0dXMoc3RydWN0IHVzYl9lcCAqX2VwKQoreworCXN0cnVjdCBuZXQyMjcyX2VwICplcDsKKwl1MTYgYXZhaWw7CisKKwllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuZXQyMjcyX2VwLCBlcCk7CisJaWYgKCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+bnVtICE9IDApKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVwLT5kZXYtPmRyaXZlciB8fCBlcC0+ZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pCisJCXJldHVybiAtRVNIVVRET1dOOworCisJYXZhaWwgPSBuZXQyMjcyX2VwX3JlYWQoZXAsIEVQX0FWQUlMMSkgPDwgODsKKwlhdmFpbCB8PSBuZXQyMjcyX2VwX3JlYWQoZXAsIEVQX0FWQUlMMCk7CisJaWYgKGF2YWlsID4gZXAtPmZpZm9fc2l6ZSkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJaWYgKGVwLT5pc19pbikKKwkJYXZhaWwgPSBlcC0+Zmlmb19zaXplIC0gYXZhaWw7CisJcmV0dXJuIGF2YWlsOworfQorCitzdGF0aWMgdm9pZAorbmV0MjI3Ml9maWZvX2ZsdXNoKHN0cnVjdCB1c2JfZXAgKl9lcCkKK3sKKwlzdHJ1Y3QgbmV0MjI3Ml9lcCAqZXA7CisKKwllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuZXQyMjcyX2VwLCBlcCk7CisJaWYgKCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+bnVtICE9IDApKQorCQlyZXR1cm47CisJaWYgKCFlcC0+ZGV2LT5kcml2ZXIgfHwgZXAtPmRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQorCQlyZXR1cm47CisKKwluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9TVEFUMSwgMSA8PCBCVUZGRVJfRkxVU0gpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9lcF9vcHMgbmV0MjI3Ml9lcF9vcHMgPSB7CisJLmVuYWJsZSAgICAgICAgPSBuZXQyMjcyX2VuYWJsZSwKKwkuZGlzYWJsZSAgICAgICA9IG5ldDIyNzJfZGlzYWJsZSwKKworCS5hbGxvY19yZXF1ZXN0ID0gbmV0MjI3Ml9hbGxvY19yZXF1ZXN0LAorCS5mcmVlX3JlcXVlc3QgID0gbmV0MjI3Ml9mcmVlX3JlcXVlc3QsCisKKwkucXVldWUgICAgICAgICA9IG5ldDIyNzJfcXVldWUsCisJLmRlcXVldWUgICAgICAgPSBuZXQyMjcyX2RlcXVldWUsCisKKwkuc2V0X2hhbHQgICAgICA9IG5ldDIyNzJfc2V0X2hhbHQsCisJLnNldF93ZWRnZSAgICAgPSBuZXQyMjcyX3NldF93ZWRnZSwKKwkuZmlmb19zdGF0dXMgICA9IG5ldDIyNzJfZmlmb19zdGF0dXMsCisJLmZpZm9fZmx1c2ggICAgPSBuZXQyMjcyX2ZpZm9fZmx1c2gsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQKK25ldDIyNzJfZ2V0X2ZyYW1lKHN0cnVjdCB1c2JfZ2FkZ2V0ICpfZ2FkZ2V0KQoreworCXN0cnVjdCBuZXQyMjcyICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgcmV0OworCisJaWYgKCFfZ2FkZ2V0KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkZXYgPSBjb250YWluZXJfb2YoX2dhZGdldCwgc3RydWN0IG5ldDIyNzIsIGdhZGdldCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJcmV0ID0gbmV0MjI3Ml9yZWFkKGRldiwgRlJBTUUxKSA8PCA4OworCXJldCB8PSBuZXQyMjcyX3JlYWQoZGV2LCBGUkFNRTApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbmV0MjI3Ml93YWtldXAoc3RydWN0IHVzYl9nYWRnZXQgKl9nYWRnZXQpCit7CisJc3RydWN0IG5ldDIyNzIgKmRldjsKKwl1OCB0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghX2dhZGdldCkKKwkJcmV0dXJuIDA7CisJZGV2ID0gY29udGFpbmVyX29mKF9nYWRnZXQsIHN0cnVjdCBuZXQyMjcyLCBnYWRnZXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCXRtcCA9IG5ldDIyNzJfcmVhZChkZXYsIFVTQkNUTDApOworCWlmICh0bXAgJiAoMSA8PCBJT19XQUtFVVBfRU5BQkxFKSkKKwkJbmV0MjI3Ml93cml0ZShkZXYsIFVTQkNUTDEsICgxIDw8IEdFTkVSQVRFX1JFU1VNRSkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmV0MjI3Ml9zZXRfc2VsZnBvd2VyZWQoc3RydWN0IHVzYl9nYWRnZXQgKl9nYWRnZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbmV0MjI3MiAqZGV2OworCisJaWYgKCFfZ2FkZ2V0KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkZXYgPSBjb250YWluZXJfb2YoX2dhZGdldCwgc3RydWN0IG5ldDIyNzIsIGdhZGdldCk7CisKKwlkZXYtPmlzX3NlbGZwb3dlcmVkID0gdmFsdWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmV0MjI3Ml9wdWxsdXAoc3RydWN0IHVzYl9nYWRnZXQgKl9nYWRnZXQsIGludCBpc19vbikKK3sKKwlzdHJ1Y3QgbmV0MjI3MiAqZGV2OworCXU4IHRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFfZ2FkZ2V0KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkZXYgPSBjb250YWluZXJfb2YoX2dhZGdldCwgc3RydWN0IG5ldDIyNzIsIGdhZGdldCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJdG1wID0gbmV0MjI3Ml9yZWFkKGRldiwgVVNCQ1RMMCk7CisJZGV2LT5zb2Z0Y29ubmVjdCA9IChpc19vbiAhPSAwKTsKKwlpZiAoaXNfb24pCisJCXRtcCB8PSAoMSA8PCBVU0JfREVURUNUX0VOQUJMRSk7CisJZWxzZQorCQl0bXAgJj0gfigxIDw8IFVTQl9ERVRFQ1RfRU5BQkxFKTsKKwluZXQyMjcyX3dyaXRlKGRldiwgVVNCQ1RMMCwgdG1wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldDIyNzJfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCisJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKTsKK3N0YXRpYyBpbnQgbmV0MjI3Ml9zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBuZXQyMjcyX29wcyA9IHsKKwkuZ2V0X2ZyYW1lICAgICAgID0gbmV0MjI3Ml9nZXRfZnJhbWUsCisJLndha2V1cCAgICAgICAgICA9IG5ldDIyNzJfd2FrZXVwLAorCS5zZXRfc2VsZnBvd2VyZWQgPSBuZXQyMjcyX3NldF9zZWxmcG93ZXJlZCwKKwkucHVsbHVwCQkJPSBuZXQyMjcyX3B1bGx1cCwKKwkuc3RhcnQJCQk9IG5ldDIyNzJfc3RhcnQsCisJLnN0b3AJCQk9IG5ldDIyNzJfc3RvcCwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHNzaXplX3QKK25ldDIyNzJfc2hvd19yZWdpc3RlcnMoc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbmV0MjI3MiAqZGV2OworCWNoYXIgKm5leHQ7CisJdW5zaWduZWQgc2l6ZSwgdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHQxLCB0MjsKKwlpbnQgaTsKKwljb25zdCBjaGFyICpzOworCisJZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworCW5leHQgPSBidWY7CisJc2l6ZSA9IFBBR0VfU0laRTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZGV2LT5kcml2ZXIpCisJCXMgPSBkZXYtPmRyaXZlci0+ZHJpdmVyLm5hbWU7CisJZWxzZQorCQlzID0gIihub25lKSI7CisKKwkvKiBNYWluIENvbnRyb2wgUmVnaXN0ZXJzICovCisJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLCAiJXMgdmVyc2lvbiAlcywiCisJCSJjaGlwcmV2ICUwMngsIGxvY2N0bCAlMDJ4XG4iCisJCSJpcnFlbmIwICUwMnggaXJxZW5iMSAlMDJ4ICIKKwkJImlycXN0YXQwICUwMnggaXJxc3RhdDEgJTAyeFxuIiwKKwkJZHJpdmVyX25hbWUsIGRyaXZlcl92ZXJzLCBkZXYtPmNoaXByZXYsCisJCW5ldDIyNzJfcmVhZChkZXYsIExPQ0NUTCksCisJCW5ldDIyNzJfcmVhZChkZXYsIElSUUVOQjApLAorCQluZXQyMjcyX3JlYWQoZGV2LCBJUlFFTkIxKSwKKwkJbmV0MjI3Ml9yZWFkKGRldiwgSVJRU1RBVDApLAorCQluZXQyMjcyX3JlYWQoZGV2LCBJUlFTVEFUMSkpOworCXNpemUgLT0gdDsKKwluZXh0ICs9IHQ7CisKKwkvKiBETUEgKi8KKwl0MSA9IG5ldDIyNzJfcmVhZChkZXYsIERNQVJFUSk7CisJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLCAiXG5kbWFyZXEgJTAyeDogJXMgJXMlcyVzJXNcbiIsCisJCXQxLCBlcF9uYW1lWyh0MSAmIDB4MDEpICsgMV0sCisJCXQxICYgKDEgPDwgRE1BX0NPTlRST0xfREFDSykgPyAiZGFjayAiIDogIiIsCisJCXQxICYgKDEgPDwgRE1BX1JFUVVFU1RfRU5BQkxFKSA/ICJyZXFlbmIgIiA6ICIiLAorCQl0MSAmICgxIDw8IERNQV9SRVFVRVNUKSA/ICJyZXEgIiA6ICIiLAorCQl0MSAmICgxIDw8IERNQV9CVUZGRVJfVkFMSUQpID8gInZhbGlkICIgOiAiIik7CisJc2l6ZSAtPSB0OworCW5leHQgKz0gdDsKKworCS8qIFVTQiBDb250cm9sIFJlZ2lzdGVycyAqLworCXQxID0gbmV0MjI3Ml9yZWFkKGRldiwgVVNCQ1RMMSk7CisJaWYgKHQxICYgKDEgPDwgVkJVU19QSU4pKSB7CisJCWlmICh0MSAmICgxIDw8IFVTQl9ISUdIX1NQRUVEKSkKKwkJCXMgPSAiaGlnaCBzcGVlZCI7CisJCWVsc2UgaWYgKGRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQorCQkJcyA9ICJwb3dlcmVkIjsKKwkJZWxzZQorCQkJcyA9ICJmdWxsIHNwZWVkIjsKKwl9IGVsc2UKKwkJcyA9ICJub3QgYXR0YWNoZWQiOworCXQgPSBzY25wcmludGYobmV4dCwgc2l6ZSwKKwkJInVzYmN0bDAgJTAyeCB1c2JjdGwxICUwMnggYWRkciAweCUwMnggKCVzKVxuIiwKKwkJbmV0MjI3Ml9yZWFkKGRldiwgVVNCQ1RMMCksIHQxLAorCQluZXQyMjcyX3JlYWQoZGV2LCBPVVJBRERSKSwgcyk7CisJc2l6ZSAtPSB0OworCW5leHQgKz0gdDsKKworCS8qIEVuZHBvaW50IFJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJc3RydWN0IG5ldDIyNzJfZXAgKmVwOworCisJCWVwID0gJmRldi0+ZXBbaV07CisJCWlmIChpICYmICFlcC0+ZGVzYykKKwkJCWNvbnRpbnVlOworCisJCXQxID0gbmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9DRkcpOworCQl0MiA9IG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfUlNQU0VUKTsKKwkJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLAorCQkJIlxuJXNcdGNmZyAlMDJ4IHJzcCAoJTAyeCkgJXMlcyVzJXMlcyVzJXMlcyIKKwkJCSJpcnFlbmIgJTAyeFxuIiwKKwkJCWVwLT5lcC5uYW1lLCB0MSwgdDIsCisJCQkodDIgJiAoMSA8PCBBTFRfTkFLX09VVF9QQUNLRVRTKSkgPyAiTkFLICIgOiAiIiwKKwkJCSh0MiAmICgxIDw8IEhJREVfU1RBVFVTX1BIQVNFKSkgPyAiaGlkZSAiIDogIiIsCisJCQkodDIgJiAoMSA8PCBBVVRPVkFMSURBVEUpKSA/ICJhdXRvICIgOiAiIiwKKwkJCSh0MiAmICgxIDw8IElOVEVSUlVQVF9NT0RFKSkgPyAiaW50ZXJydXB0ICIgOiAiIiwKKwkJCSh0MiAmICgxIDw8IENPTlRST0xfU1RBVFVTX1BIQVNFX0hBTkRTSEFLRSkpID8gInN0YXR1cyAiIDogIiIsCisJCQkodDIgJiAoMSA8PCBOQUtfT1VUX1BBQ0tFVFNfTU9ERSkpID8gIk5BS21vZGUgIiA6ICIiLAorCQkJKHQyICYgKDEgPDwgRU5EUE9JTlRfVE9HR0xFKSkgPyAiREFUQTEgIiA6ICJEQVRBMCAiLAorCQkJKHQyICYgKDEgPDwgRU5EUE9JTlRfSEFMVCkpID8gIkhBTFQgIiA6ICIiLAorCQkJbmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9JUlFFTkIpKTsKKwkJc2l6ZSAtPSB0OworCQluZXh0ICs9IHQ7CisKKwkJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLAorCQkJIlx0c3RhdDAgJTAyeCBzdGF0MSAlMDJ4IGF2YWlsICUwNHggIgorCQkJIihlcCVkJXMtJXMpJXNcbiIsCisJCQluZXQyMjcyX2VwX3JlYWQoZXAsIEVQX1NUQVQwKSwKKwkJCW5ldDIyNzJfZXBfcmVhZChlcCwgRVBfU1RBVDEpLAorCQkJKG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfQVZBSUwxKSA8PCA4KSB8IG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfQVZBSUwwKSwKKwkJCXQxICYgMHgwZiwKKwkJCWVwLT5pc19pbiA/ICJpbiIgOiAib3V0IiwKKwkJCXR5cGVfc3RyaW5nKHQxID4+IDUpLAorCQkJZXAtPnN0b3BwZWQgPyAiKiIgOiAiIik7CisJCXNpemUgLT0gdDsKKwkJbmV4dCArPSB0OworCisJCXQgPSBzY25wcmludGYobmV4dCwgc2l6ZSwKKwkJCSJcdGVwX3RyYW5zZmVyICUwNnhcbiIsCisJCQkoKG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfVFJBTlNGRVIyKSAmIDB4ZmYpIDw8IDE2KSB8CisJCQkoKG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfVFJBTlNGRVIxKSAmIDB4ZmYpIDw8IDgpIHwKKwkJCSgobmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9UUkFOU0ZFUjApICYgMHhmZikpKTsKKwkJc2l6ZSAtPSB0OworCQluZXh0ICs9IHQ7CisKKwkJdDEgPSBuZXQyMjcyX2VwX3JlYWQoZXAsIEVQX0JVRkZfU1RBVEVTKSAmIDB4MDM7CisJCXQyID0gKG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfQlVGRl9TVEFURVMpID4+IDIpICYgMHgwMzsKKwkJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLAorCQkJIlx0YnVmLWEgJXMgYnVmLWIgJXNcbiIsCisJCQlidWZfc3RhdGVfc3RyaW5nKHQxKSwKKwkJCWJ1Zl9zdGF0ZV9zdHJpbmcodDIpKTsKKwkJc2l6ZSAtPSB0OworCQluZXh0ICs9IHQ7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gUEFHRV9TSVpFIC0gc2l6ZTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihyZWdpc3RlcnMsIFNfSVJVR08sIG5ldDIyNzJfc2hvd19yZWdpc3RlcnMsIE5VTEwpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkCituZXQyMjcyX3NldF9maWZvX21vZGUoc3RydWN0IG5ldDIyNzIgKmRldiwgaW50IG1vZGUpCit7CisJdTggdG1wOworCisJdG1wID0gbmV0MjI3Ml9yZWFkKGRldiwgTE9DQ1RMKSAmIDB4M2Y7CisJdG1wIHw9IChtb2RlIDw8IDYpOworCW5ldDIyNzJfd3JpdGUoZGV2LCBMT0NDVEwsIHRtcCk7CisKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5nYWRnZXQuZXBfbGlzdCk7CisKKwkvKiBhbHdheXMgZXAtYSwgZXAtYyAuLi4gbWF5YmUgbm90IGVwLWIgKi8KKwlsaXN0X2FkZF90YWlsKCZkZXYtPmVwWzFdLmVwLmVwX2xpc3QsICZkZXYtPmdhZGdldC5lcF9saXN0KTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoKKwkJbGlzdF9hZGRfdGFpbCgmZGV2LT5lcFsyXS5lcC5lcF9saXN0LCAmZGV2LT5nYWRnZXQuZXBfbGlzdCk7CisJCWRldi0+ZXBbMV0uZmlmb19zaXplID0gZGV2LT5lcFsyXS5maWZvX3NpemUgPSA1MTI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbGlzdF9hZGRfdGFpbCgmZGV2LT5lcFsyXS5lcC5lcF9saXN0LCAmZGV2LT5nYWRnZXQuZXBfbGlzdCk7CisJCWRldi0+ZXBbMV0uZmlmb19zaXplID0gMTAyNDsKKwkJZGV2LT5lcFsyXS5maWZvX3NpemUgPSA1MTI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbGlzdF9hZGRfdGFpbCgmZGV2LT5lcFsyXS5lcC5lcF9saXN0LCAmZGV2LT5nYWRnZXQuZXBfbGlzdCk7CisJCWRldi0+ZXBbMV0uZmlmb19zaXplID0gZGV2LT5lcFsyXS5maWZvX3NpemUgPSAxMDI0OworCQlicmVhazsKKwljYXNlIDM6CisJCWRldi0+ZXBbMV0uZmlmb19zaXplID0gMTAyNDsKKwkJYnJlYWs7CisJfQorCisJLyogZXAtYyBpcyBhbHdheXMgMiA1MTIgYnl0ZSBidWZmZXJzICovCisJbGlzdF9hZGRfdGFpbCgmZGV2LT5lcFszXS5lcC5lcF9saXN0LCAmZGV2LT5nYWRnZXQuZXBfbGlzdCk7CisJZGV2LT5lcFszXS5maWZvX3NpemUgPSA1MTI7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHN0cnVjdCBuZXQyMjcyICp0aGVfY29udHJvbGxlcjsKKworc3RhdGljIHZvaWQKK25ldDIyNzJfdXNiX3Jlc2V0KHN0cnVjdCBuZXQyMjcyICpkZXYpCit7CisJZGV2LT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKworCW5ldDIyNzJfY2FuY2VsX2RtYShkZXYpOworCisJbmV0MjI3Ml93cml0ZShkZXYsIElSUUVOQjAsIDApOworCW5ldDIyNzJfd3JpdGUoZGV2LCBJUlFFTkIxLCAwKTsKKworCS8qIGNsZWFyIGlycSBzdGF0ZSAqLworCW5ldDIyNzJfd3JpdGUoZGV2LCBJUlFTVEFUMCwgMHhmZik7CisJbmV0MjI3Ml93cml0ZShkZXYsIElSUVNUQVQxLCB+KDEgPDwgU1VTUEVORF9SRVFVRVNUX0lOVEVSUlVQVCkpOworCisJbmV0MjI3Ml93cml0ZShkZXYsIERNQVJFUSwKKwkJKDAgPDwgRE1BX0JVRkZFUl9WQUxJRCkgfAorCQkoMCA8PCBETUFfUkVRVUVTVF9FTkFCTEUpIHwKKwkJKDEgPDwgRE1BX0NPTlRST0xfREFDSykgfAorCQkoZGV2LT5kbWFfZW90X3BvbGFyaXR5IDw8IEVPVF9QT0xBUklUWSkgfAorCQkoZGV2LT5kbWFfZGFja19wb2xhcml0eSA8PCBEQUNLX1BPTEFSSVRZKSB8CisJCShkZXYtPmRtYV9kcmVxX3BvbGFyaXR5IDw8IERSRVFfUE9MQVJJVFkpIHwKKwkJKChkbWFfZXAgPj4gMSkgPDwgRE1BX0VORFBPSU5UX1NFTEVDVCkpOworCisJbmV0MjI3Ml9jYW5jZWxfZG1hKGRldik7CisJbmV0MjI3Ml9zZXRfZmlmb19tb2RlKGRldiwgKGZpZm9fbW9kZSA8PSAzKSA/IGZpZm9fbW9kZSA6IDApOworCisJLyogU2V0IHRoZSBORVQyMjcyIGVwIGZpZm8gZGF0YSB3aWR0aCB0byAxNi1iaXQgbW9kZSBhbmQgZm9yIGNvcnJlY3QgYnl0ZSBzd2FwcGluZworCSAqIG5vdGUgdGhhdCB0aGUgaGlnaGVyIGxldmVsIGdhZGdldCBkcml2ZXJzIGFyZSBleHBlY3RlZCB0byBjb252ZXJ0IGRhdGEgdG8gbGl0dGxlIGVuZGlhbi4KKwkgKiBFbmFibGUgYnl0ZSBzd2FwIGZvciB5b3VyIGxvY2FsIGJ1cy9jcHUgaWYgbmVlZGVkIGJ5IHNldHRpbmcgQllURV9TV0FQIGluIExPQ0NUTCBoZXJlCisJICovCisJbmV0MjI3Ml93cml0ZShkZXYsIExPQ0NUTCwgbmV0MjI3Ml9yZWFkKGRldiwgTE9DQ1RMKSB8ICgxIDw8IERBVEFfV0lEVEgpKTsKKwluZXQyMjcyX3dyaXRlKGRldiwgTE9DQ1RMMSwgKGRtYV9tb2RlIDw8IERNQV9NT0RFKSk7Cit9CisKK3N0YXRpYyB2b2lkCituZXQyMjcyX3VzYl9yZWluaXQoc3RydWN0IG5ldDIyNzIgKmRldikKK3sKKwlpbnQgaTsKKworCS8qIGJhc2ljIGVuZHBvaW50IGluaXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisJCXN0cnVjdCBuZXQyMjcyX2VwICplcCA9ICZkZXYtPmVwW2ldOworCisJCWVwLT5lcC5uYW1lID0gZXBfbmFtZVtpXTsKKwkJZXAtPmRldiA9IGRldjsKKwkJZXAtPm51bSA9IGk7CisJCWVwLT5ub3RfZW1wdHkgPSAwOworCisJCWlmICh1c2VfZG1hICYmIGVwLT5udW0gPT0gZG1hX2VwKQorCQkJZXAtPmRtYSA9IDE7CisKKwkJaWYgKGkgPiAwICYmIGkgPD0gMykKKwkJCWVwLT5maWZvX3NpemUgPSA1MTI7CisJCWVsc2UKKwkJCWVwLT5maWZvX3NpemUgPSA2NDsKKwkJbmV0MjI3Ml9lcF9yZXNldChlcCk7CisJfQorCWRldi0+ZXBbMF0uZXAubWF4cGFja2V0ID0gNjQ7CisKKwlkZXYtPmdhZGdldC5lcDAgPSAmZGV2LT5lcFswXS5lcDsKKwlkZXYtPmVwWzBdLnN0b3BwZWQgPSAwOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmdhZGdldC5lcDAtPmVwX2xpc3QpOworfQorCitzdGF0aWMgdm9pZAorbmV0MjI3Ml9lcDBfc3RhcnQoc3RydWN0IG5ldDIyNzIgKmRldikKK3sKKwlzdHJ1Y3QgbmV0MjI3Ml9lcCAqZXAwID0gJmRldi0+ZXBbMF07CisKKwluZXQyMjcyX2VwX3dyaXRlKGVwMCwgRVBfUlNQU0VULAorCQkoMSA8PCBOQUtfT1VUX1BBQ0tFVFNfTU9ERSkgfAorCQkoMSA8PCBBTFRfTkFLX09VVF9QQUNLRVRTKSk7CisJbmV0MjI3Ml9lcF93cml0ZShlcDAsIEVQX1JTUENMUiwKKwkJKDEgPDwgSElERV9TVEFUVVNfUEhBU0UpIHwKKwkJKDEgPDwgQ09OVFJPTF9TVEFUVVNfUEhBU0VfSEFORFNIQUtFKSk7CisJbmV0MjI3Ml93cml0ZShkZXYsIFVTQkNUTDAsCisJCShkZXYtPnNvZnRjb25uZWN0IDw8IFVTQl9ERVRFQ1RfRU5BQkxFKSB8CisJCSgxIDw8IFVTQl9ST09UX1BPUlRfV0FLRVVQX0VOQUJMRSkgfAorCQkoMSA8PCBJT19XQUtFVVBfRU5BQkxFKSk7CisJbmV0MjI3Ml93cml0ZShkZXYsIElSUUVOQjAsCisJCSgxIDw8IFNFVFVQX1BBQ0tFVF9JTlRFUlJVUFRfRU5BQkxFKSB8CisJCSgxIDw8IEVORFBPSU5UXzBfSU5URVJSVVBUX0VOQUJMRSkgfAorCQkoMSA8PCBETUFfRE9ORV9JTlRFUlJVUFRfRU5BQkxFKSk7CisJbmV0MjI3Ml93cml0ZShkZXYsIElSUUVOQjEsCisJCSgxIDw8IFZCVVNfSU5URVJSVVBUX0VOQUJMRSkgfAorCQkoMSA8PCBST09UX1BPUlRfUkVTRVRfSU5URVJSVVBUX0VOQUJMRSkgfAorCQkoMSA8PCBTVVNQRU5EX1JFUVVFU1RfQ0hBTkdFX0lOVEVSUlVQVF9FTkFCTEUpKTsKK30KKworLyogd2hlbiBhIGRyaXZlciBpcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCwgaXQgd2lsbCByZWNlaXZlCisgKiBjb250cm9sIHJlcXVlc3RzIGluY2x1ZGluZyBzZXRfY29uZmlndXJhdGlvbigpLCB3aGljaCBlbmFibGVzCisgKiBub24tY29udHJvbCByZXF1ZXN0cy4gIHRoZW4gdXNiIHRyYWZmaWMgZm9sbG93cyB1bnRpbCBhCisgKiBkaXNjb25uZWN0IGlzIHJlcG9ydGVkLiAgdGhlbiBhIGhvc3QgbWF5IGNvbm5lY3QgYWdhaW4sIG9yCisgKiB0aGUgZHJpdmVyIG1pZ2h0IGdldCB1bmJvdW5kLgorICovCitzdGF0aWMgaW50IG5ldDIyNzJfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCisJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpCit7CisJc3RydWN0IG5ldDIyNzIgKmRldiA9IHRoZV9jb250cm9sbGVyOworCWludCByZXQ7CisJdW5zaWduZWQgaTsKKworCWlmICghZHJpdmVyIHx8ICFiaW5kIHx8ICFkcml2ZXItPnVuYmluZCB8fCAhZHJpdmVyLT5zZXR1cCB8fAorCSAgICBkcml2ZXItPnNwZWVkICE9IFVTQl9TUEVFRF9ISUdIKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGRldi0+ZHJpdmVyKQorCQlyZXR1cm4gLUVCVVNZOworCisJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwkJZGV2LT5lcFtpXS5pcnFzID0gMDsKKwkvKiBob29rIHVwIHRoZSBkcml2ZXIgLi4uICovCisJZGV2LT5zb2Z0Y29ubmVjdCA9IDE7CisJZHJpdmVyLT5kcml2ZXIuYnVzID0gTlVMTDsKKwlkZXYtPmRyaXZlciA9IGRyaXZlcjsKKwlkZXYtPmdhZGdldC5kZXYuZHJpdmVyID0gJmRyaXZlci0+ZHJpdmVyOworCXJldCA9IGJpbmQoJmRldi0+Z2FkZ2V0KTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoZGV2LT5kZXYsICJiaW5kIHRvIGRyaXZlciAlcyAtLT4gJWRcbiIsCisJCQlkcml2ZXItPmRyaXZlci5uYW1lLCByZXQpOworCQlkZXYtPmRyaXZlciA9IE5VTEw7CisJCWRldi0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIC4uLiB0aGVuIGVuYWJsZSBob3N0IGRldGVjdGlvbiBhbmQgZXAwOyBhbmQgd2UncmUgcmVhZHkKKwkgKiBmb3Igc2V0X2NvbmZpZ3VyYXRpb24gYXMgd2VsbCBhcyBldmVudHVhbCBkaXNjb25uZWN0LgorCSAqLworCW5ldDIyNzJfZXAwX3N0YXJ0KGRldik7CisKKwlkZXZfZGJnKGRldi0+ZGV2LCAiJXMgcmVhZHlcbiIsIGRyaXZlci0+ZHJpdmVyLm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzdG9wX2FjdGl2aXR5KHN0cnVjdCBuZXQyMjcyICpkZXYsIHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCWludCBpOworCisJLyogZG9uJ3QgZGlzY29ubmVjdCBpZiBpdCdzIG5vdCBjb25uZWN0ZWQgKi8KKwlpZiAoZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pCisJCWRyaXZlciA9IE5VTEw7CisKKwkvKiBzdG9wIGhhcmR3YXJlOyBwcmV2ZW50IG5ldyByZXF1ZXN0IHN1Ym1pc3Npb25zOworCSAqIGFuZCBraWxsIGFueSBvdXRzdGFuZGluZyByZXF1ZXN0cy4KKwkgKi8KKwluZXQyMjcyX3VzYl9yZXNldChkZXYpOworCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisJCW5ldDIyNzJfZGVxdWV1ZV9hbGwoJmRldi0+ZXBbaV0pOworCisJLyogcmVwb3J0IGRpc2Nvbm5lY3Q7IHRoZSBkcml2ZXIgaXMgYWxyZWFkeSBxdWllc2NlZCAqLworCWlmIChkcml2ZXIpIHsKKwkJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7CisJCWRyaXZlci0+ZGlzY29ubmVjdCgmZGV2LT5nYWRnZXQpOworCQlzcGluX2xvY2soJmRldi0+bG9jayk7CisKKwl9CisJbmV0MjI3Ml91c2JfcmVpbml0KGRldik7Cit9CisKK3N0YXRpYyBpbnQgbmV0MjI3Ml9zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBuZXQyMjcyICpkZXYgPSB0aGVfY29udHJvbGxlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCWlmICghZHJpdmVyIHx8IGRyaXZlciAhPSBkZXYtPmRyaXZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJc3RvcF9hY3Rpdml0eShkZXYsIGRyaXZlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwluZXQyMjcyX3B1bGx1cCgmZGV2LT5nYWRnZXQsIDApOworCisJZHJpdmVyLT51bmJpbmQoJmRldi0+Z2FkZ2V0KTsKKwlkZXYtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKKwlkZXYtPmRyaXZlciA9IE5VTEw7CisKKwlkZXZfZGJnKGRldi0+ZGV2LCAidW5yZWdpc3RlcmVkIGRyaXZlciAnJXMnXG4iLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogaGFuZGxlIGVwLWEvZXAtYiBkbWEgY29tcGxldGlvbnMgKi8KK3N0YXRpYyB2b2lkCituZXQyMjcyX2hhbmRsZV9kbWEoc3RydWN0IG5ldDIyNzJfZXAgKmVwKQoreworCXN0cnVjdCBuZXQyMjcyX3JlcXVlc3QgKnJlcTsKKwl1bnNpZ25lZCBsZW47CisJaW50IHN0YXR1czsKKworCWlmICghbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkKKwkJcmVxID0gbGlzdF9lbnRyeShlcC0+cXVldWUubmV4dCwKKwkJCQlzdHJ1Y3QgbmV0MjI3Ml9yZXF1ZXN0LCBxdWV1ZSk7CisJZWxzZQorCQlyZXEgPSBOVUxMOworCisJZGV2X3ZkYmcoZXAtPmRldi0+ZGV2LCAiaGFuZGxlX2RtYSAlcyByZXEgJXBcbiIsIGVwLT5lcC5uYW1lLCByZXEpOworCisJLyogRW5zdXJlIERSRVEgaXMgZGUtYXNzZXJ0ZWQgKi8KKwluZXQyMjcyX3dyaXRlKGVwLT5kZXYsIERNQVJFUSwKKwkJKDAgPDwgRE1BX0JVRkZFUl9WQUxJRCkKKwkgICAgICB8ICgwIDw8IERNQV9SRVFVRVNUX0VOQUJMRSkKKwkgICAgICB8ICgxIDw8IERNQV9DT05UUk9MX0RBQ0spCisJICAgICAgfCAoZXAtPmRldi0+ZG1hX2VvdF9wb2xhcml0eSA8PCBFT1RfUE9MQVJJVFkpCisJICAgICAgfCAoZXAtPmRldi0+ZG1hX2RhY2tfcG9sYXJpdHkgPDwgREFDS19QT0xBUklUWSkKKwkgICAgICB8IChlcC0+ZGV2LT5kbWFfZHJlcV9wb2xhcml0eSA8PCBEUkVRX1BPTEFSSVRZKQorCSAgICAgIHwgKChlcC0+ZG1hID4+IDEpIDw8IERNQV9FTkRQT0lOVF9TRUxFQ1QpKTsKKworCWVwLT5kZXYtPmRtYV9idXN5ID0gMDsKKworCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX0lSUUVOQiwKKwkJICAoMSA8PCBEQVRBX1BBQ0tFVF9SRUNFSVZFRF9JTlRFUlJVUFRfRU5BQkxFKQorCQl8ICgxIDw8IERBVEFfUEFDS0VUX1RSQU5TTUlUVEVEX0lOVEVSUlVQVF9FTkFCTEUpCisJCXwgbmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9JUlFFTkIpKTsKKworCS8qIGRldmljZS10by1ob3N0IHRyYW5zZmVyIGNvbXBsZXRlZCAqLworCWlmIChlcC0+aXNfaW4pIHsKKwkJLyogdmFsaWRhdGUgYSBzaG9ydCBwYWNrZXQgb3IgemxwIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAoKHJlcS0+cmVxLmxlbmd0aCAlIGVwLT5lcC5tYXhwYWNrZXQgIT0gMCkgfHwKKwkJCQlyZXEtPnJlcS56ZXJvKQorCQkJc2V0X2ZpZm9fYnl0ZWNvdW50KGVwLCAwKTsKKworCQluZXQyMjcyX2RvbmUoZXAsIHJlcSwgMCk7CisJCWlmICghbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgeworCQkJcmVxID0gbGlzdF9lbnRyeShlcC0+cXVldWUubmV4dCwKKwkJCQkJc3RydWN0IG5ldDIyNzJfcmVxdWVzdCwgcXVldWUpOworCQkJc3RhdHVzID0gbmV0MjI3Ml9raWNrX2RtYShlcCwgcmVxKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCW5ldDIyNzJfcGlvX2FkdmFuY2UoZXApOworCQl9CisKKwkvKiBob3N0LXRvLWRldmljZSB0cmFuc2ZlciBjb21wbGV0ZWQgKi8KKwl9IGVsc2UgeworCQkvKiB0ZXJtaW5hdGVkIHdpdGggYSBzaG9ydCBwYWNrZXQ/ICovCisJCWlmIChuZXQyMjcyX3JlYWQoZXAtPmRldiwgSVJRU1RBVDApICYKKwkJCQkoMSA8PCBETUFfRE9ORV9JTlRFUlJVUFQpKSB7CisJCQkvKiBhYm9ydCBzeXN0ZW0gZG1hICovCisJCQluZXQyMjcyX2NhbmNlbF9kbWEoZXAtPmRldik7CisJCX0KKworCQkvKiBFUF9UUkFOU0ZFUiB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcworCQkgKiBhY3R1YWxseSByZWNlaXZlZC4KKwkJICogTk9URTogVGhlcmUgaXMgbm8gb3ZlcmZsb3cgZGV0ZWN0aW9uIG9uIEVQX1RSQU5TRkVSOgorCQkgKiBXZSBjYW4ndCBkZWFsIHdpdGggdHJhbnNmZXJzIGxhcmdlciB0aGFuIDJeMjQgYnl0ZXMhCisJCSAqLworCQlsZW4gPSAobmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9UUkFOU0ZFUjIpIDw8IDE2KQorCQkJfCAobmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9UUkFOU0ZFUjEpIDw8IDgpCisJCQl8IChuZXQyMjcyX2VwX3JlYWQoZXAsIEVQX1RSQU5TRkVSMCkpOworCisJCWlmIChlcC0+bm90X2VtcHR5KQorCQkJbGVuICs9IDQ7CisKKwkJcmVxLT5yZXEuYWN0dWFsICs9IGxlbjsKKworCQkvKiBnZXQgYW55IHJlbWFpbmluZyBkYXRhICovCisJCW5ldDIyNzJfcGlvX2FkdmFuY2UoZXApOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZAorbmV0MjI3Ml9oYW5kbGVfZXAoc3RydWN0IG5ldDIyNzJfZXAgKmVwKQoreworCXN0cnVjdCBuZXQyMjcyX3JlcXVlc3QgKnJlcTsKKwl1OCBzdGF0MCwgc3RhdDE7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpCisJCXJlcSA9IGxpc3RfZW50cnkoZXAtPnF1ZXVlLm5leHQsCisJCQlzdHJ1Y3QgbmV0MjI3Ml9yZXF1ZXN0LCBxdWV1ZSk7CisJZWxzZQorCQlyZXEgPSBOVUxMOworCisJLyogYWNrIGFsbCwgYW5kIGhhbmRsZSB3aGF0IHdlIGNhcmUgYWJvdXQgKi8KKwlzdGF0MCA9IG5ldDIyNzJfZXBfcmVhZChlcCwgRVBfU1RBVDApOworCXN0YXQxID0gbmV0MjI3Ml9lcF9yZWFkKGVwLCBFUF9TVEFUMSk7CisJZXAtPmlycXMrKzsKKworCWRldl92ZGJnKGVwLT5kZXYtPmRldiwgIiVzIGFjayBlcF9zdGF0MCAlMDJ4LCBlcF9zdGF0MSAlMDJ4LCByZXEgJXBcbiIsCisJCWVwLT5lcC5uYW1lLCBzdGF0MCwgc3RhdDEsIHJlcSA/ICZyZXEtPnJlcSA6IDApOworCisJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfU1RBVDAsIHN0YXQwICYKKwkJfigoMSA8PCBOQUtfT1VUX1BBQ0tFVFMpCisJCXwgKDEgPDwgU0hPUlRfUEFDS0VUX1RSQU5TRkVSUkVEX0lOVEVSUlVQVCkpKTsKKwluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9TVEFUMSwgc3RhdDEpOworCisJLyogZGF0YSBwYWNrZXQocykgcmVjZWl2ZWQgKGluIHRoZSBmaWZvLCBPVVQpCisJICogZGlyZWN0aW9uIG11c3QgYmUgdmFsaWRhdGVkLCBvdGhlcndpc2UgY29udHJvbCByZWFkIHN0YXR1cyBwaGFzZQorCSAqIGNvdWxkIGJlIGludGVycHJldGVkIGFzIGEgdmFsaWQgcGFja2V0CisJICovCisJaWYgKCFlcC0+aXNfaW4gJiYgKHN0YXQwICYgKDEgPDwgREFUQV9QQUNLRVRfUkVDRUlWRURfSU5URVJSVVBUKSkpCisJCW5ldDIyNzJfcGlvX2FkdmFuY2UoZXApOworCS8qIGRhdGEgcGFja2V0KHMpIHRyYW5zbWl0dGVkIChJTikgKi8KKwllbHNlIGlmIChzdGF0MCAmICgxIDw8IERBVEFfUEFDS0VUX1RSQU5TTUlUVEVEX0lOVEVSUlVQVCkpCisJCW5ldDIyNzJfcGlvX2FkdmFuY2UoZXApOworfQorCitzdGF0aWMgc3RydWN0IG5ldDIyNzJfZXAgKgorbmV0MjI3Ml9nZXRfZXBfYnlfYWRkcihzdHJ1Y3QgbmV0MjI3MiAqZGV2LCB1MTYgd0luZGV4KQoreworCXN0cnVjdCBuZXQyMjcyX2VwICplcDsKKworCWlmICgod0luZGV4ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKSA9PSAwKQorCQlyZXR1cm4gJmRldi0+ZXBbMF07CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVwLCAmZGV2LT5nYWRnZXQuZXBfbGlzdCwgZXAuZXBfbGlzdCkgeworCQl1OCBiRW5kcG9pbnRBZGRyZXNzOworCisJCWlmICghZXAtPmRlc2MpCisJCQljb250aW51ZTsKKwkJYkVuZHBvaW50QWRkcmVzcyA9IGVwLT5kZXNjLT5iRW5kcG9pbnRBZGRyZXNzOworCQlpZiAoKHdJbmRleCBeIGJFbmRwb2ludEFkZHJlc3MpICYgVVNCX0RJUl9JTikKKwkJCWNvbnRpbnVlOworCQlpZiAoKHdJbmRleCAmIDB4MGYpID09IChiRW5kcG9pbnRBZGRyZXNzICYgMHgwZikpCisJCQlyZXR1cm4gZXA7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogVVNCIFRlc3QgUGFja2V0OgorICogSktKS0pLSksgKiA5CisgKiBKSktLSkpLSyAqIDgKKyAqIEpKSkpLS0tLICogOAorICogSkpKSkpKSktLS0tLS0sgKiA4CisgKiBKSkpKSkpKSyAqIDgKKyAqIHtKS0tLS0tLSyAqIDEwfSwgSksKKyAqLworc3RhdGljIGNvbnN0IHU4IG5ldDIyNzJfdGVzdF9wYWNrZXRbXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUEsCisJMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRSwKKwkweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCTB4N0YsIDB4QkYsIDB4REYsIDB4RUYsIDB4RjcsIDB4RkIsIDB4RkQsCisJMHhGQywgMHg3RSwgMHhCRiwgMHhERiwgMHhFRiwgMHhGNywgMHhGRCwgMHg3RQorfTsKKworc3RhdGljIHZvaWQKK25ldDIyNzJfc2V0X3Rlc3RfbW9kZShzdHJ1Y3QgbmV0MjI3MiAqZGV2LCBpbnQgbW9kZSkKK3sKKwlpbnQgaTsKKworCS8qIERpc2FibGUgYWxsIG5ldDIyNzIgaW50ZXJydXB0czoKKwkgKiBOb3RoaW5nIGJ1dCBhIHBvd2VyIGN5Y2xlIHNob3VsZCBzdG9wIHRoZSB0ZXN0LgorCSAqLworCW5ldDIyNzJfd3JpdGUoZGV2LCBJUlFFTkIwLCAweDAwKTsKKwluZXQyMjcyX3dyaXRlKGRldiwgSVJRRU5CMSwgMHgwMCk7CisKKwkvKiBGb3JjZSB0cmFuY2VpdmVyIHRvIGhpZ2gtc3BlZWQgKi8KKwluZXQyMjcyX3dyaXRlKGRldiwgWENWUkRJQUcsIDEgPDwgRk9SQ0VfSElHSF9TUEVFRCk7CisKKwluZXQyMjcyX3dyaXRlKGRldiwgUEFHRVNFTCwgMCk7CisJbmV0MjI3Ml93cml0ZShkZXYsIEVQX1NUQVQwLCAxIDw8IERBVEFfUEFDS0VUX1RSQU5TTUlUVEVEX0lOVEVSUlVQVCk7CisJbmV0MjI3Ml93cml0ZShkZXYsIEVQX1JTUENMUiwKKwkJCSAgKDEgPDwgQ09OVFJPTF9TVEFUVVNfUEhBU0VfSEFORFNIQUtFKQorCQkJfCAoMSA8PCBISURFX1NUQVRVU19QSEFTRSkpOworCW5ldDIyNzJfd3JpdGUoZGV2LCBFUF9DRkcsIDEgPDwgRU5EUE9JTlRfRElSRUNUSU9OKTsKKwluZXQyMjcyX3dyaXRlKGRldiwgRVBfU1RBVDEsIDEgPDwgQlVGRkVSX0ZMVVNIKTsKKworCS8qIHdhaXQgZm9yIHN0YXR1cyBwaGFzZSB0byBjb21wbGV0ZSAqLworCXdoaWxlICghKG5ldDIyNzJfcmVhZChkZXYsIEVQX1NUQVQwKSAmCisJCQkJKDEgPDwgREFUQV9QQUNLRVRfVFJBTlNNSVRURURfSU5URVJSVVBUKSkpCisJCTsKKworCS8qIEVuYWJsZSB0ZXN0IG1vZGUgKi8KKwluZXQyMjcyX3dyaXRlKGRldiwgVVNCVEVTVCwgbW9kZSk7CisKKwkvKiBsb2FkIHRlc3QgcGFja2V0ICovCisJaWYgKG1vZGUgPT0gVEVTVF9QQUNLRVQpIHsKKwkJLyogc3dpdGNoIHRvIDggYml0IG1vZGUgKi8KKwkJbmV0MjI3Ml93cml0ZShkZXYsIExPQ0NUTCwgbmV0MjI3Ml9yZWFkKGRldiwgTE9DQ1RMKSAmCisJCQkJfigxIDw8IERBVEFfV0lEVEgpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG5ldDIyNzJfdGVzdF9wYWNrZXQpOyArK2kpCisJCQluZXQyMjcyX3dyaXRlKGRldiwgRVBfREFUQSwgbmV0MjI3Ml90ZXN0X3BhY2tldFtpXSk7CisKKwkJLyogVmFsaWRhdGUgdGVzdCBwYWNrZXQgKi8KKwkJbmV0MjI3Ml93cml0ZShkZXYsIEVQX1RSQU5TRkVSMCwgMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbmV0MjI3Ml9oYW5kbGVfc3RhdDBfaXJxcyhzdHJ1Y3QgbmV0MjI3MiAqZGV2LCB1OCBzdGF0KQoreworCXN0cnVjdCBuZXQyMjcyX2VwICplcDsKKwl1OCBudW0sIHNjcmF0Y2g7CisKKwkvKiBzdGFydGluZyBhIGNvbnRyb2wgcmVxdWVzdD8gKi8KKwlpZiAodW5saWtlbHkoc3RhdCAmICgxIDw8IFNFVFVQX1BBQ0tFVF9JTlRFUlJVUFQpKSkgeworCQl1bmlvbiB7CisJCQl1OCByYXdbOF07CisJCQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0CXI7CisJCX0gdTsKKwkJaW50IHRtcCA9IDA7CisJCXN0cnVjdCBuZXQyMjcyX3JlcXVlc3QgKnJlcTsKKworCQlpZiAoZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKKwkJCWlmIChuZXQyMjcyX3JlYWQoZGV2LCBVU0JDVEwxKSAmICgxIDw8IFVTQl9ISUdIX1NQRUVEKSkKKwkJCQlkZXYtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9ISUdIOworCQkJZWxzZQorCQkJCWRldi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX0ZVTEw7CisJCQlkZXZfZGJnKGRldi0+ZGV2LCAiJXMgc3BlZWRcbiIsCisJCQkJKGRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSA/ICJoaWdoIiA6ICJmdWxsIik7CisJCX0KKworCQllcCA9ICZkZXYtPmVwWzBdOworCQllcC0+aXJxcysrOworCisJCS8qIG1ha2Ugc3VyZSBhbnkgbGVmdG92ZXIgaW50ZXJydXB0IHN0YXRlIGlzIGNsZWFyZWQgKi8KKwkJc3RhdCAmPSB+KDEgPDwgRU5EUE9JTlRfMF9JTlRFUlJVUFQpOworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsKKwkJCXJlcSA9IGxpc3RfZW50cnkoZXAtPnF1ZXVlLm5leHQsCisJCQkJc3RydWN0IG5ldDIyNzJfcmVxdWVzdCwgcXVldWUpOworCQkJbmV0MjI3Ml9kb25lKGVwLCByZXEsCisJCQkJKHJlcS0+cmVxLmFjdHVhbCA9PSByZXEtPnJlcS5sZW5ndGgpID8gMCA6IC1FUFJPVE8pOworCQl9CisJCWVwLT5zdG9wcGVkID0gMDsKKwkJZGV2LT5wcm90b2NvbF9zdGFsbCA9IDA7CisJCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX1NUQVQwLAorCQkJICAgICgxIDw8IERBVEFfSU5fVE9LRU5fSU5URVJSVVBUKQorCQkJICB8ICgxIDw8IERBVEFfT1VUX1RPS0VOX0lOVEVSUlVQVCkKKwkJCSAgfCAoMSA8PCBEQVRBX1BBQ0tFVF9UUkFOU01JVFRFRF9JTlRFUlJVUFQpCisJCQkgIHwgKDEgPDwgREFUQV9QQUNLRVRfUkVDRUlWRURfSU5URVJSVVBUKQorCQkJICB8ICgxIDw8IFNIT1JUX1BBQ0tFVF9UUkFOU0ZFUlJFRF9JTlRFUlJVUFQpKTsKKwkJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfU1RBVDEsCisJCQkgICAgKDEgPDwgVElNRU9VVCkKKwkJCSAgfCAoMSA8PCBVU0JfT1VUX0FDS19TRU5UKQorCQkJICB8ICgxIDw8IFVTQl9PVVRfTkFLX1NFTlQpCisJCQkgIHwgKDEgPDwgVVNCX0lOX0FDS19SQ1ZEKQorCQkJICB8ICgxIDw8IFVTQl9JTl9OQUtfU0VOVCkKKwkJCSAgfCAoMSA8PCBVU0JfU1RBTExfU0VOVCkKKwkJCSAgfCAoMSA8PCBMT0NBTF9PVVRfWkxQKSk7CisKKwkJLyoKKwkJICogRW5zdXJlIENvbnRyb2wgUmVhZCBwcmUtdmFsaWRhdGlvbiBzZXR0aW5nIGlzIGJleW9uZCBtYXhpbXVtIHNpemUKKwkJICogIC0gQ29udHJvbCBXcml0ZXMgY2FuIGxlYXZlIG5vbi16ZXJvIHZhbHVlcyBpbiBFUF9UUkFOU0ZFUi4gSWYKKwkJICogICAgYW4gRVAwIHRyYW5zZmVyIGZvbGxvd2luZyB0aGUgQ29udHJvbCBXcml0ZSBpcyBhIENvbnRyb2wgUmVhZCwKKwkJICogICAgdGhlIE5FVDIyNzIgc2VlcyB0aGUgbm9uLXplcm8gRVBfVFJBTlNGRVIgYXMgYW4gdW5leHBlY3RlZAorCQkgKiAgICBwcmUtdmFsaWRhdGlvbiBjb3VudC4KKwkJICogIC0gU2V0dGluZyBFUF9UUkFOU0ZFUiBiZXlvbmQgdGhlIG1heGltdW0gRVAwIHRyYW5zZmVyIHNpemUgZW5zdXJlcworCQkgKiAgICB0aGUgcHJlLXZhbGlkYXRpb24gY291bnQgY2Fubm90IGNhdXNlIGFuIHVuZXhwZWN0ZWQgdmFsaWRhdGF0aW9uCisJCSAqLworCQluZXQyMjcyX3dyaXRlKGRldiwgUEFHRVNFTCwgMCk7CisJCW5ldDIyNzJfd3JpdGUoZGV2LCBFUF9UUkFOU0ZFUjIsIDB4ZmYpOworCQluZXQyMjcyX3dyaXRlKGRldiwgRVBfVFJBTlNGRVIxLCAweGZmKTsKKwkJbmV0MjI3Ml93cml0ZShkZXYsIEVQX1RSQU5TRkVSMCwgMHhmZik7CisKKwkJdS5yYXdbMF0gPSBuZXQyMjcyX3JlYWQoZGV2LCBTRVRVUDApOworCQl1LnJhd1sxXSA9IG5ldDIyNzJfcmVhZChkZXYsIFNFVFVQMSk7CisJCXUucmF3WzJdID0gbmV0MjI3Ml9yZWFkKGRldiwgU0VUVVAyKTsKKwkJdS5yYXdbM10gPSBuZXQyMjcyX3JlYWQoZGV2LCBTRVRVUDMpOworCQl1LnJhd1s0XSA9IG5ldDIyNzJfcmVhZChkZXYsIFNFVFVQNCk7CisJCXUucmF3WzVdID0gbmV0MjI3Ml9yZWFkKGRldiwgU0VUVVA1KTsKKwkJdS5yYXdbNl0gPSBuZXQyMjcyX3JlYWQoZGV2LCBTRVRVUDYpOworCQl1LnJhd1s3XSA9IG5ldDIyNzJfcmVhZChkZXYsIFNFVFVQNyk7CisJCS8qCisJCSAqIElmIHlvdSBoYXZlIGEgYmlnIGVuZGlhbiBjcHUgbWFrZSBzdXJlIGxlMTZfdG9fY3B1cworCQkgKiBwZXJmb3JtcyB0aGUgcHJvcGVyIGJ5dGUgc3dhcHBpbmcgaGVyZS4uLgorCQkgKi8KKwkJbGUxNl90b19jcHVzKCZ1LnIud1ZhbHVlKTsKKwkJbGUxNl90b19jcHVzKCZ1LnIud0luZGV4KTsKKwkJbGUxNl90b19jcHVzKCZ1LnIud0xlbmd0aCk7CisKKwkJLyogYWNrIHRoZSBpcnEgKi8KKwkJbmV0MjI3Ml93cml0ZShkZXYsIElSUVNUQVQwLCAxIDw8IFNFVFVQX1BBQ0tFVF9JTlRFUlJVUFQpOworCQlzdGF0IF49ICgxIDw8IFNFVFVQX1BBQ0tFVF9JTlRFUlJVUFQpOworCisJCS8qIHdhdGNoIGNvbnRyb2wgdHJhZmZpYyBhdCB0aGUgdG9rZW4gbGV2ZWwsIGFuZCBmb3JjZQorCQkgKiBzeW5jaHJvbml6YXRpb24gYmVmb3JlIGxldHRpbmcgdGhlIHN0YXR1cyBwaGFzZSBoYXBwZW4uCisJCSAqLworCQllcC0+aXNfaW4gPSAodS5yLmJSZXF1ZXN0VHlwZSAmIFVTQl9ESVJfSU4pICE9IDA7CisJCWlmIChlcC0+aXNfaW4pIHsKKwkJCXNjcmF0Y2ggPSAoMSA8PCBEQVRBX1BBQ0tFVF9UUkFOU01JVFRFRF9JTlRFUlJVUFRfRU5BQkxFKQorCQkJCXwgKDEgPDwgREFUQV9PVVRfVE9LRU5fSU5URVJSVVBUX0VOQUJMRSkKKwkJCQl8ICgxIDw8IERBVEFfSU5fVE9LRU5fSU5URVJSVVBUX0VOQUJMRSk7CisJCQlzdG9wX291dF9uYWtpbmcoZXApOworCQl9IGVsc2UKKwkJCXNjcmF0Y2ggPSAoMSA8PCBEQVRBX1BBQ0tFVF9SRUNFSVZFRF9JTlRFUlJVUFRfRU5BQkxFKQorCQkJCXwgKDEgPDwgREFUQV9PVVRfVE9LRU5fSU5URVJSVVBUX0VOQUJMRSkKKwkJCQl8ICgxIDw8IERBVEFfSU5fVE9LRU5fSU5URVJSVVBUX0VOQUJMRSk7CisJCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX0lSUUVOQiwgc2NyYXRjaCk7CisKKwkJaWYgKCh1LnIuYlJlcXVlc3RUeXBlICYgVVNCX1RZUEVfTUFTSykgIT0gVVNCX1RZUEVfU1RBTkRBUkQpCisJCQlnb3RvIGRlbGVnYXRlOworCQlzd2l0Y2ggKHUuci5iUmVxdWVzdCkgeworCQljYXNlIFVTQl9SRVFfR0VUX1NUQVRVUzogeworCQkJc3RydWN0IG5ldDIyNzJfZXAgKmU7CisJCQl1MTYgc3RhdHVzID0gMDsKKworCQkJc3dpdGNoICh1LnIuYlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spIHsKKwkJCWNhc2UgVVNCX1JFQ0lQX0VORFBPSU5UOgorCQkJCWUgPSBuZXQyMjcyX2dldF9lcF9ieV9hZGRyKGRldiwgdS5yLndJbmRleCk7CisJCQkJaWYgKCFlIHx8IHUuci53TGVuZ3RoID4gMikKKwkJCQkJZ290byBkb19zdGFsbDsKKwkJCQlpZiAobmV0MjI3Ml9lcF9yZWFkKGUsIEVQX1JTUFNFVCkgJiAoMSA8PCBFTkRQT0lOVF9IQUxUKSkKKwkJCQkJc3RhdHVzID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKTsKKwkJCQllbHNlCisJCQkJCXN0YXR1cyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CisKKwkJCQkvKiBkb24ndCBib3RoZXIgd2l0aCBhIHJlcXVlc3Qgb2JqZWN0ISAqLworCQkJCW5ldDIyNzJfZXBfd3JpdGUoJmRldi0+ZXBbMF0sIEVQX0lSUUVOQiwgMCk7CisJCQkJd3JpdGV3KHN0YXR1cywgbmV0MjI3Ml9yZWdfYWRkcihkZXYsIEVQX0RBVEEpKTsKKwkJCQlzZXRfZmlmb19ieXRlY291bnQoJmRldi0+ZXBbMF0sIDApOworCQkJCWFsbG93X3N0YXR1cyhlcCk7CisJCQkJZGV2X3ZkYmcoZGV2LT5kZXYsICIlcyBzdGF0ICUwMnhcbiIsCisJCQkJCWVwLT5lcC5uYW1lLCBzdGF0dXMpOworCQkJCWdvdG8gbmV4dF9lbmRwb2ludHM7CisJCQljYXNlIFVTQl9SRUNJUF9ERVZJQ0U6CisJCQkJaWYgKHUuci53TGVuZ3RoID4gMikKKwkJCQkJZ290byBkb19zdGFsbDsKKwkJCQlpZiAoZGV2LT5pc19zZWxmcG93ZXJlZCkKKwkJCQkJc3RhdHVzID0gKDEgPDwgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQpOworCisJCQkJLyogZG9uJ3QgYm90aGVyIHdpdGggYSByZXF1ZXN0IG9iamVjdCEgKi8KKwkJCQluZXQyMjcyX2VwX3dyaXRlKCZkZXYtPmVwWzBdLCBFUF9JUlFFTkIsIDApOworCQkJCXdyaXRldyhzdGF0dXMsIG5ldDIyNzJfcmVnX2FkZHIoZGV2LCBFUF9EQVRBKSk7CisJCQkJc2V0X2ZpZm9fYnl0ZWNvdW50KCZkZXYtPmVwWzBdLCAwKTsKKwkJCQlhbGxvd19zdGF0dXMoZXApOworCQkJCWRldl92ZGJnKGRldi0+ZGV2LCAiZGV2aWNlIHN0YXQgJTAyeFxuIiwgc3RhdHVzKTsKKwkJCQlnb3RvIG5leHRfZW5kcG9pbnRzOworCQkJY2FzZSBVU0JfUkVDSVBfSU5URVJGQUNFOgorCQkJCWlmICh1LnIud0xlbmd0aCA+IDIpCisJCQkJCWdvdG8gZG9fc3RhbGw7CisKKwkJCQkvKiBkb24ndCBib3RoZXIgd2l0aCBhIHJlcXVlc3Qgb2JqZWN0ISAqLworCQkJCW5ldDIyNzJfZXBfd3JpdGUoJmRldi0+ZXBbMF0sIEVQX0lSUUVOQiwgMCk7CisJCQkJd3JpdGV3KHN0YXR1cywgbmV0MjI3Ml9yZWdfYWRkcihkZXYsIEVQX0RBVEEpKTsKKwkJCQlzZXRfZmlmb19ieXRlY291bnQoJmRldi0+ZXBbMF0sIDApOworCQkJCWFsbG93X3N0YXR1cyhlcCk7CisJCQkJZGV2X3ZkYmcoZGV2LT5kZXYsICJpbnRlcmZhY2Ugc3RhdHVzICUwMnhcbiIsIHN0YXR1cyk7CisJCQkJZ290byBuZXh0X2VuZHBvaW50czsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6IHsKKwkJCXN0cnVjdCBuZXQyMjcyX2VwICplOworCisJCQlpZiAodS5yLmJSZXF1ZXN0VHlwZSAhPSBVU0JfUkVDSVBfRU5EUE9JTlQpCisJCQkJZ290byBkZWxlZ2F0ZTsKKwkJCWlmICh1LnIud1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUIHx8CisJCQkgICAgdS5yLndMZW5ndGggIT0gMCkKKwkJCQlnb3RvIGRvX3N0YWxsOworCQkJZSA9IG5ldDIyNzJfZ2V0X2VwX2J5X2FkZHIoZGV2LCB1LnIud0luZGV4KTsKKwkJCWlmICghZSkKKwkJCQlnb3RvIGRvX3N0YWxsOworCQkJaWYgKGUtPndlZGdlZCkgeworCQkJCWRldl92ZGJnKGRldi0+ZGV2LCAiJXMgd2VkZ2VkLCBoYWx0IG5vdCBjbGVhcmVkXG4iLAorCQkJCQllcC0+ZXAubmFtZSk7CisJCQl9IGVsc2UgeworCQkJCWRldl92ZGJnKGRldi0+ZGV2LCAiJXMgY2xlYXIgaGFsdFxuIiwgZXAtPmVwLm5hbWUpOworCQkJCWNsZWFyX2hhbHQoZSk7CisJCQl9CisJCQlhbGxvd19zdGF0dXMoZXApOworCQkJZ290byBuZXh0X2VuZHBvaW50czsKKwkJfQorCQljYXNlIFVTQl9SRVFfU0VUX0ZFQVRVUkU6IHsKKwkJCXN0cnVjdCBuZXQyMjcyX2VwICplOworCisJCQlpZiAodS5yLmJSZXF1ZXN0VHlwZSA9PSBVU0JfUkVDSVBfREVWSUNFKSB7CisJCQkJaWYgKHUuci53SW5kZXggIT0gTk9STUFMX09QRVJBVElPTikKKwkJCQkJbmV0MjI3Ml9zZXRfdGVzdF9tb2RlKGRldiwgKHUuci53SW5kZXggPj4gOCkpOworCQkJCWFsbG93X3N0YXR1cyhlcCk7CisJCQkJZGV2X3ZkYmcoZGV2LT5kZXYsICJ0ZXN0IG1vZGU6ICVkXG4iLCB1LnIud0luZGV4KTsKKwkJCQlnb3RvIG5leHRfZW5kcG9pbnRzOworCQkJfSBlbHNlIGlmICh1LnIuYlJlcXVlc3RUeXBlICE9IFVTQl9SRUNJUF9FTkRQT0lOVCkKKwkJCQlnb3RvIGRlbGVnYXRlOworCQkJaWYgKHUuci53VmFsdWUgIT0gVVNCX0VORFBPSU5UX0hBTFQgfHwKKwkJCSAgICB1LnIud0xlbmd0aCAhPSAwKQorCQkJCWdvdG8gZG9fc3RhbGw7CisJCQllID0gbmV0MjI3Ml9nZXRfZXBfYnlfYWRkcihkZXYsIHUuci53SW5kZXgpOworCQkJaWYgKCFlKQorCQkJCWdvdG8gZG9fc3RhbGw7CisJCQlzZXRfaGFsdChlKTsKKwkJCWFsbG93X3N0YXR1cyhlcCk7CisJCQlkZXZfdmRiZyhkZXYtPmRldiwgIiVzIHNldCBoYWx0XG4iLCBlcC0+ZXAubmFtZSk7CisJCQlnb3RvIG5leHRfZW5kcG9pbnRzOworCQl9CisJCWNhc2UgVVNCX1JFUV9TRVRfQUREUkVTUzogeworCQkJbmV0MjI3Ml93cml0ZShkZXYsIE9VUkFERFIsIHUuci53VmFsdWUgJiAweGZmKTsKKwkJCWFsbG93X3N0YXR1cyhlcCk7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorIGRlbGVnYXRlOgorCQkJZGV2X3ZkYmcoZGV2LT5kZXYsICJzZXR1cCAlMDJ4LiUwMnggdiUwNHggaSUwNHggIgorCQkJCSJlcF9jZmcgJTA4eFxuIiwKKwkJCQl1LnIuYlJlcXVlc3RUeXBlLCB1LnIuYlJlcXVlc3QsCisJCQkJdS5yLndWYWx1ZSwgdS5yLndJbmRleCwKKwkJCQluZXQyMjcyX2VwX3JlYWQoZXAsIEVQX0NGRykpOworCQkJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7CisJCQl0bXAgPSBkZXYtPmRyaXZlci0+c2V0dXAoJmRldi0+Z2FkZ2V0LCAmdS5yKTsKKwkJCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsKKwkJfQorCisJCS8qIHN0YWxsIGVwMCBvbiBlcnJvciAqLworCQlpZiAodG1wIDwgMCkgeworIGRvX3N0YWxsOgorCQkJZGV2X3ZkYmcoZGV2LT5kZXYsICJyZXEgJTAyeC4lMDJ4IHByb3RvY29sIFNUQUxMOyBzdGF0ICVkXG4iLAorCQkJCXUuci5iUmVxdWVzdFR5cGUsIHUuci5iUmVxdWVzdCwgdG1wKTsKKwkJCWRldi0+cHJvdG9jb2xfc3RhbGwgPSAxOworCQl9CisJLyogZW5kcG9pbnQgZG1hIGlycT8gKi8KKwl9IGVsc2UgaWYgKHN0YXQgJiAoMSA8PCBETUFfRE9ORV9JTlRFUlJVUFQpKSB7CisJCW5ldDIyNzJfY2FuY2VsX2RtYShkZXYpOworCQluZXQyMjcyX3dyaXRlKGRldiwgSVJRU1RBVDAsIDEgPDwgRE1BX0RPTkVfSU5URVJSVVBUKTsKKwkJc3RhdCAmPSB+KDEgPDwgRE1BX0RPTkVfSU5URVJSVVBUKTsKKwkJbnVtID0gKG5ldDIyNzJfcmVhZChkZXYsIERNQVJFUSkgJiAoMSA8PCBETUFfRU5EUE9JTlRfU0VMRUNUKSkKKwkJCT8gMiA6IDE7CisKKwkJZXAgPSAmZGV2LT5lcFtudW1dOworCQluZXQyMjcyX2hhbmRsZV9kbWEoZXApOworCX0KKworIG5leHRfZW5kcG9pbnRzOgorCS8qIGVuZHBvaW50IGRhdGEgaXJxPyAqLworCXNjcmF0Y2ggPSBzdGF0ICYgMHgwZjsKKwlzdGF0ICY9IH4weDBmOworCWZvciAobnVtID0gMDsgc2NyYXRjaDsgbnVtKyspIHsKKwkJdTggdDsKKworCQkvKiBkb2VzIHRoaXMgZW5kcG9pbnQncyBGSUZPIGFuZCBxdWV1ZSBuZWVkIHRlbmRpbmc/ICovCisJCXQgPSAxIDw8IG51bTsKKwkJaWYgKChzY3JhdGNoICYgdCkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlzY3JhdGNoIF49IHQ7CisKKwkJZXAgPSAmZGV2LT5lcFtudW1dOworCQluZXQyMjcyX2hhbmRsZV9lcChlcCk7CisJfQorCisJLyogc29tZSBpbnRlcnJ1cHRzIHdlIGNhbiBqdXN0IGlnbm9yZSAqLworCXN0YXQgJj0gfigxIDw8IFNPRl9JTlRFUlJVUFQpOworCisJaWYgKHN0YXQpCisJCWRldl9kYmcoZGV2LT5kZXYsICJ1bmhhbmRsZWQgaXJxc3RhdDAgJTAyeFxuIiwgc3RhdCk7Cit9CisKK3N0YXRpYyB2b2lkCituZXQyMjcyX2hhbmRsZV9zdGF0MV9pcnFzKHN0cnVjdCBuZXQyMjcyICpkZXYsIHU4IHN0YXQpCit7CisJdTggdG1wLCBtYXNrOworCisJLyogYWZ0ZXIgZGlzY29ubmVjdCB0aGVyZSdzIG5vdGhpbmcgZWxzZSB0byBkbyEgKi8KKwl0bXAgPSAoMSA8PCBWQlVTX0lOVEVSUlVQVCkgfCAoMSA8PCBST09UX1BPUlRfUkVTRVRfSU5URVJSVVBUKTsKKwltYXNrID0gKDEgPDwgVVNCX0hJR0hfU1BFRUQpIHwgKDEgPDwgVVNCX0ZVTExfU1BFRUQpOworCisJaWYgKHN0YXQgJiB0bXApIHsKKwkJbmV0MjI3Ml93cml0ZShkZXYsIElSUVNUQVQxLCB0bXApOworCQlpZiAoKCgoc3RhdCAmICgxIDw8IFJPT1RfUE9SVF9SRVNFVF9JTlRFUlJVUFQpKSAmJgorCQkJCSgobmV0MjI3Ml9yZWFkKGRldiwgVVNCQ1RMMSkgJiBtYXNrKSA9PSAwKSkKKwkJCXx8ICgobmV0MjI3Ml9yZWFkKGRldiwgVVNCQ1RMMSkgJiAoMSA8PCBWQlVTX1BJTikpCisJCQkJPT0gMCkpCisJCQkJJiYgKGRldi0+Z2FkZ2V0LnNwZWVkICE9IFVTQl9TUEVFRF9VTktOT1dOKSkgeworCQkJZGV2X2RiZyhkZXYtPmRldiwgImRpc2Nvbm5lY3QgJXNcbiIsCisJCQkJZGV2LT5kcml2ZXItPmRyaXZlci5uYW1lKTsKKwkJCXN0b3BfYWN0aXZpdHkoZGV2LCBkZXYtPmRyaXZlcik7CisJCQluZXQyMjcyX2VwMF9zdGFydChkZXYpOworCQkJcmV0dXJuOworCQl9CisJCXN0YXQgJj0gfnRtcDsKKworCQlpZiAoIXN0YXQpCisJCQlyZXR1cm47CisJfQorCisJdG1wID0gKDEgPDwgU1VTUEVORF9SRVFVRVNUX0NIQU5HRV9JTlRFUlJVUFQpOworCWlmIChzdGF0ICYgdG1wKSB7CisJCW5ldDIyNzJfd3JpdGUoZGV2LCBJUlFTVEFUMSwgdG1wKTsKKwkJaWYgKHN0YXQgJiAoMSA8PCBTVVNQRU5EX1JFUVVFU1RfSU5URVJSVVBUKSkgeworCQkJaWYgKGRldi0+ZHJpdmVyLT5zdXNwZW5kKQorCQkJCWRldi0+ZHJpdmVyLT5zdXNwZW5kKCZkZXYtPmdhZGdldCk7CisJCQlpZiAoIWVuYWJsZV9zdXNwZW5kKSB7CisJCQkJc3RhdCAmPSB+KDEgPDwgU1VTUEVORF9SRVFVRVNUX0lOVEVSUlVQVCk7CisJCQkJZGV2X2RiZyhkZXYtPmRldiwgIlN1c3BlbmQgZGlzYWJsZWQsIGlnbm9yaW5nXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChkZXYtPmRyaXZlci0+cmVzdW1lKQorCQkJCWRldi0+ZHJpdmVyLT5yZXN1bWUoJmRldi0+Z2FkZ2V0KTsKKwkJfQorCQlzdGF0ICY9IH50bXA7CisJfQorCisJLyogY2xlYXIgYW55IG90aGVyIHN0YXR1cy9pcnFzICovCisJaWYgKHN0YXQpCisJCW5ldDIyNzJfd3JpdGUoZGV2LCBJUlFTVEFUMSwgc3RhdCk7CisKKwkvKiBzb21lIHN0YXR1cyB3ZSBjYW4ganVzdCBpZ25vcmUgKi8KKwlzdGF0ICY9IH4oKDEgPDwgQ09OVFJPTF9TVEFUVVNfSU5URVJSVVBUKQorCQkJfCAoMSA8PCBTVVNQRU5EX1JFUVVFU1RfSU5URVJSVVBUKQorCQkJfCAoMSA8PCBSRVNVTUVfSU5URVJSVVBUKSk7CisJaWYgKCFzdGF0KQorCQlyZXR1cm47CisJZWxzZQorCQlkZXZfZGJnKGRldi0+ZGV2LCAidW5oYW5kbGVkIGlycXN0YXQxICUwMnhcbiIsIHN0YXQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbmV0MjI3Ml9pcnEoaW50IGlycSwgdm9pZCAqX2RldikKK3sKKwlzdHJ1Y3QgbmV0MjI3MiAqZGV2ID0gX2RldjsKKyNpZiBkZWZpbmVkKFBMWF9QQ0lfUkRLKSB8fCBkZWZpbmVkKFBMWF9QQ0lfUkRLMikKKwl1MzIgaW50Y3NyOworI2VuZGlmCisjaWYgZGVmaW5lZChQTFhfUENJX1JESykKKwl1OCBkbWFyZXE7CisjZW5kaWYKKwlzcGluX2xvY2soJmRldi0+bG9jayk7CisjaWYgZGVmaW5lZChQTFhfUENJX1JESykKKwlpbnRjc3IgPSByZWFkbChkZXYtPnJkazEucGx4OTA1NF9iYXNlX2FkZHIgKyBJTlRDU1IpOworCisJaWYgKChpbnRjc3IgJiBMT0NBTF9JTlRFUlJVUFRfVEVTVCkgPT0gTE9DQUxfSU5URVJSVVBUX1RFU1QpIHsKKwkJd3JpdGVsKGludGNzciAmIH4oMSA8PCBQQ0lfSU5URVJSVVBUX0VOQUJMRSksCisJCQkJZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyICsgSU5UQ1NSKTsKKwkJbmV0MjI3Ml9oYW5kbGVfc3RhdDFfaXJxcyhkZXYsIG5ldDIyNzJfcmVhZChkZXYsIElSUVNUQVQxKSk7CisJCW5ldDIyNzJfaGFuZGxlX3N0YXQwX2lycXMoZGV2LCBuZXQyMjcyX3JlYWQoZGV2LCBJUlFTVEFUMCkpOworCQlpbnRjc3IgPSByZWFkbChkZXYtPnJkazEucGx4OTA1NF9iYXNlX2FkZHIgKyBJTlRDU1IpOworCQl3cml0ZWwoaW50Y3NyIHwgKDEgPDwgUENJX0lOVEVSUlVQVF9FTkFCTEUpLAorCQkJZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyICsgSU5UQ1NSKTsKKwl9CisJaWYgKChpbnRjc3IgJiBETUFfQ0hBTk5FTF8wX1RFU1QpID09IERNQV9DSEFOTkVMXzBfVEVTVCkgeworCQl3cml0ZWIoKDEgPDwgQ0hBTk5FTF9DTEVBUl9JTlRFUlJVUFQgfCAoMCA8PCBDSEFOTkVMX0VOQUJMRSkpLAorCQkJCWRldi0+cmRrMS5wbHg5MDU0X2Jhc2VfYWRkciArIERNQUNTUjApOworCisJCWRtYXJlcSA9IG5ldDIyNzJfcmVhZChkZXYsIERNQVJFUSk7CisJCWlmIChkbWFyZXEgJiAweDAxKQorCQkJbmV0MjI3Ml9oYW5kbGVfZG1hKCZkZXYtPmVwWzJdKTsKKwkJZWxzZQorCQkJbmV0MjI3Ml9oYW5kbGVfZG1hKCZkZXYtPmVwWzFdKTsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFBMWF9QQ0lfUkRLMikKKwkvKiBzZWUgaWYgUENJIGludCBmb3IgdXMgYnkgY2hlY2tpbmcgaXJxc3RhdCAqLworCWludGNzciA9IHJlYWRsKGRldi0+cmRrMi5mcGdhX2Jhc2VfYWRkciArIFJESzJfSVJRU1RBVCk7CisJaWYgKCFpbnRjc3IgJiAoMSA8PCBORVQyMjcyX1BDSV9JUlEpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJLyogY2hlY2sgZG1hIGludGVycnVwdHMgKi8KKyNlbmRpZgorCS8qIFBsYXRmb3JtL2RldmNpY2UgaW50ZXJydXB0IGhhbmRsZXIgKi8KKyNpZiAhZGVmaW5lZChQTFhfUENJX1JESykKKwluZXQyMjcyX2hhbmRsZV9zdGF0MV9pcnFzKGRldiwgbmV0MjI3Ml9yZWFkKGRldiwgSVJRU1RBVDEpKTsKKwluZXQyMjcyX2hhbmRsZV9zdGF0MF9pcnFzKGRldiwgbmV0MjI3Ml9yZWFkKGRldiwgSVJRU1RBVDApKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrKCZkZXYtPmxvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IG5ldDIyNzJfcHJlc2VudChzdHJ1Y3QgbmV0MjI3MiAqZGV2KQoreworCS8qCisJICogUXVpY2sgdGVzdCB0byBzZWUgaWYgQ1BVIGNhbiBjb21tdW5pY2F0ZSBwcm9wZXJseSB3aXRoIHRoZSBORVQyMjcyLgorCSAqIFZlcmlmaWVzIGNvbm5lY3Rpb24gdXNpbmcgd3JpdGVzIGFuZCByZWFkcyB0byB3cml0ZS9yZWFkIGFuZAorCSAqIHJlYWQtb25seSByZWdpc3RlcnMuCisJICoKKwkgKiBUaGlzIHJvdXRpbmUgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgZXNwZWNpYWxseSBkdXJpbmcgZWFybHkgYnJpbmctdXAKKwkgKiBvZiBuZXcgaGFyZHdhcmUsIGhvd2V2ZXIgZm9yIGRlc2lnbnMgdGhhdCBkbyBub3QgYXBwbHkgUG93ZXIgT24gU3lzdGVtCisJICogVGVzdHMgKFBPU1QpIGl0IG1heSBkaXNjYXJkZWQgKG9yIHBlcmhhcHMgbWluaW1pemVkKS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgaWk7CisJdTggdmFsLCByZWZ2YWw7CisKKwkvKiBWZXJpZnkgTkVUMjI3MiB3cml0ZS9yZWFkIFNDUkFUQ0ggcmVnaXN0ZXIgY2FuIHdyaXRlIGFuZCByZWFkICovCisJcmVmdmFsID0gbmV0MjI3Ml9yZWFkKGRldiwgU0NSQVRDSCk7CisJZm9yIChpaSA9IDA7IGlpIDwgMHgxMDA7IGlpICs9IDcpIHsKKwkJbmV0MjI3Ml93cml0ZShkZXYsIFNDUkFUQ0gsIGlpKTsKKwkJdmFsID0gbmV0MjI3Ml9yZWFkKGRldiwgU0NSQVRDSCk7CisJCWlmICh2YWwgIT0gaWkpIHsKKwkJCWRldl9kYmcoZGV2LT5kZXYsCisJCQkJIiVzOiB3cml0ZS9yZWFkIFNDUkFUQ0ggcmVnaXN0ZXIgdGVzdCBmYWlsZWQ6ICIKKwkJCQkid3JvdGU6MHglMi4yeCwgcmVhZDoweCUyLjJ4XG4iLAorCQkJCV9fZnVuY19fLCBpaSwgdmFsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCS8qIFRvIGJlIG5pY2UsIHdlIHdyaXRlIHRoZSBvcmlnaW5hbCBTQ1JBVENIIHZhbHVlIGJhY2s6ICovCisJbmV0MjI3Ml93cml0ZShkZXYsIFNDUkFUQ0gsIHJlZnZhbCk7CisKKwkvKiBWZXJpZnkgTkVUMjI3MiBDSElQUkVWIHJlZ2lzdGVyIGlzIHJlYWQtb25seTogKi8KKwlyZWZ2YWwgPSBuZXQyMjcyX3JlYWQoZGV2LCBDSElQUkVWXzIyNzIpOworCWZvciAoaWkgPSAwOyBpaSA8IDB4MTAwOyBpaSArPSA3KSB7CisJCW5ldDIyNzJfd3JpdGUoZGV2LCBDSElQUkVWXzIyNzIsIGlpKTsKKwkJdmFsID0gbmV0MjI3Ml9yZWFkKGRldiwgQ0hJUFJFVl8yMjcyKTsKKwkJaWYgKHZhbCAhPSByZWZ2YWwpIHsKKwkJCWRldl9kYmcoZGV2LT5kZXYsCisJCQkJIiVzOiB3cml0ZS9yZWFkIENISVBSRVYgcmVnaXN0ZXIgdGVzdCBmYWlsZWQ6ICIKKwkJCQkid3JvdGUgMHglMi4yeCwgcmVhZDoweCUyLjJ4IGV4cGVjdGVkOjB4JTIuMnhcbiIsCisJCQkJX19mdW5jX18sIGlpLCB2YWwsIHJlZnZhbCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qCisJICogVmVyaWZ5IE5FVDIyNzIncyAiTkVUMjI3MCBsZWdhY3kgcmV2aXNpb24iIHJlZ2lzdGVyCisJICogIC0gTkVUMjI3MiBoYXMgdHdvIHJldmlzaW9uIHJlZ2lzdGVycy4gVGhlIE5FVDIyNzAgbGVnYWN5IHJldmlzaW9uCisJICogICAgcmVnaXN0ZXIgc2hvdWxkIHJlYWQgdGhlIHNhbWUgdmFsdWUsIHJlZ2FyZGxlc3Mgb2YgdGhlIE5FVDIyNzIKKwkgKiAgICBzaWxpY29uIHJldmlzaW9uLiAgVGhlIGxlZ2FjeSByZWdpc3RlciBhcHBsaWVzIHRvIE5FVDIyNzAKKwkgKiAgICBmaXJtd2FyZSBiZWluZyBhcHBsaWVkIHRvIHRoZSBORVQyMjcyLgorCSAqLworCXZhbCA9IG5ldDIyNzJfcmVhZChkZXYsIENISVBSRVZfTEVHQUNZKTsKKwlpZiAodmFsICE9IE5FVDIyNzBfTEVHQUNZX1JFVikgeworCQkvKgorCQkgKiBVbmV4cGVjdGVkIGxlZ2FjeSByZXZpc2lvbiB2YWx1ZQorCQkgKiAtIFBlcmhhcHMgdGhlIGNoaXAgaXMgYSBORVQyMjcwPworCQkgKi8KKwkJZGV2X2RiZyhkZXYtPmRldiwKKwkJCSIlczogV0FSTklORzogVU5FWFBFQ1RFRCBORVQyMjcyIExFR0FDWSBSRUdJU1RFUiBWQUxVRTpcbiIKKwkJCSIgLSBDSElQUkVWX0xFR0FDWTogZXhwZWN0ZWQgMHglMi4yeCwgZ290OjB4JTIuMnguIChOb3QgTkVUMjI3Mj8pXG4iLAorCQkJX19mdW5jX18sIE5FVDIyNzBfTEVHQUNZX1JFViwgdmFsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBWZXJpZnkgTkVUMjI3MiBzaWxpY29uIHJldmlzaW9uCisJICogIC0gVGhpcyByZXZpc2lvbiByZWdpc3RlciBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHNpbGljb24gdmVyc2lvbgorCSAqICAgIG9mIHRoZSBORVQyMjcyCisJICovCisJdmFsID0gbmV0MjI3Ml9yZWFkKGRldiwgQ0hJUFJFVl8yMjcyKTsKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgQ0hJUFJFVl9ORVQyMjcyX1IxOgorCQkvKgorCQkgKiBORVQyMjcyIFJldiAxIGhhcyBETUEgcmVsYXRlZCBlcnJhdGE6CisJCSAqICAtIE5ld2VyIHNpbGljb24gKFJldiAxQSBvciBiZXR0ZXIpIHJlcXVpcmVkCisJCSAqLworCQlkZXZfZGJnKGRldi0+ZGV2LAorCQkJIiVzOiBSZXYgMSBkZXRlY3RlZDogbmV3ZXIgc2lsaWNvbiByZWNvbW1lbmRlZCBmb3IgRE1BIHN1cHBvcnRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWJyZWFrOworCWNhc2UgQ0hJUFJFVl9ORVQyMjcyX1IxQToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogTkVUMjI3MiBzaWxpY29uIHZlcnNpb24gKm1heSogbm90IHdvcmsgd2l0aCB0aGlzIGZpcm13YXJlICovCisJCWRldl9kYmcoZGV2LT5kZXYsCisJCQkiJXM6IHVuZXhwZWN0ZWQgc2lsaWNvbiByZXZpc2lvbiByZWdpc3RlciB2YWx1ZTogIgorCQkJIiBDSElQUkVWXzIyNzI6IDB4JTIuMnhcbiIsCisJCQlfX2Z1bmNfXywgdmFsKTsKKwkJLyoKKwkJICogUmV0dXJuIFN1Y2Nlc3MsIGV2ZW4gdGhvdWdoIHRoZSBjaGlwIHJldiBpcyBub3QgYW4gZXhwZWN0ZWQgdmFsdWUKKwkJICogIC0gT2xkZXIsIHByZS1idWlsdCBmaXJtd2FyZSBjYW4gYXR0ZW1wdCB0byBvcGVyYXRlIG9uIG5ld2VyIHNpbGljb24KKwkJICogIC0gT2Z0ZW4sIG5ldyBzaWxpY29uIGlzIHBlcmZlY3RseSBjb21wYXRpYmxlCisJCSAqLworCX0KKworCS8qIFN1Y2Nlc3M6IE5FVDIyNzIgY2hlY2tzIG91dCBPSyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbmV0MjI3Ml9nYWRnZXRfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQoreworCXN0cnVjdCBuZXQyMjcyICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisJa2ZyZWUoZGV2KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK25ldDIyNzJfcmVtb3ZlKHN0cnVjdCBuZXQyMjcyICpkZXYpCit7CisJdXNiX2RlbF9nYWRnZXRfdWRjKCZkZXYtPmdhZGdldCk7CisKKwkvKiBzdGFydCB3aXRoIHRoZSBkcml2ZXIgYWJvdmUgdXMgKi8KKwlpZiAoZGV2LT5kcml2ZXIpIHsKKwkJLyogc2hvdWxkIGhhdmUgYmVlbiBkb25lIGFscmVhZHkgYnkgZHJpdmVyIG1vZGVsIGNvcmUgKi8KKwkJZGV2X3dhcm4oZGV2LT5kZXYsICJwY2kgcmVtb3ZlLCBkcml2ZXIgJyVzJyBpcyBzdGlsbCByZWdpc3RlcmVkXG4iLAorCQkJZGV2LT5kcml2ZXItPmRyaXZlci5uYW1lKTsKKwkJdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihkZXYtPmRyaXZlcik7CisJfQorCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJaW91bm1hcChkZXYtPmJhc2VfYWRkcik7CisKKwlkZXZpY2VfdW5yZWdpc3RlcigmZGV2LT5nYWRnZXQuZGV2KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LT5kZXYsICZkZXZfYXR0cl9yZWdpc3RlcnMpOworCisJZGV2X2luZm8oZGV2LT5kZXYsICJ1bmJpbmRcbiIpOworCXRoZV9jb250cm9sbGVyID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuZXQyMjcyICogX19kZXZpbml0CituZXQyMjcyX3Byb2JlX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBuZXQyMjcyICpyZXQ7CisKKwlpZiAodGhlX2NvbnRyb2xsZXIpIHsKKwkJZGV2X3dhcm4oZGV2LCAiaWdub3JpbmdcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOworCX0KKworCWlmICghaXJxKSB7CisJCWRldl9kYmcoZGV2LCAiTm8gSVJRIVxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCX0KKworCS8qIGFsbG9jLCBhbmQgc3RhcnQgaW5pdCAqLworCXJldCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcGluX2xvY2tfaW5pdCgmcmV0LT5sb2NrKTsKKwlyZXQtPmlycSA9IGlycTsKKwlyZXQtPmRldiA9IGRldjsKKwlyZXQtPmdhZGdldC5vcHMgPSAmbmV0MjI3Ml9vcHM7CisJcmV0LT5nYWRnZXQuaXNfZHVhbHNwZWVkID0gMTsKKworCS8qIHRoZSAiZ2FkZ2V0IiBhYnN0cmFjdHMvdmlydHVhbGl6ZXMgdGhlIGNvbnRyb2xsZXIgKi8KKwlkZXZfc2V0X25hbWUoJnJldC0+Z2FkZ2V0LmRldiwgImdhZGdldCIpOworCXJldC0+Z2FkZ2V0LmRldi5wYXJlbnQgPSBkZXY7CisJcmV0LT5nYWRnZXQuZGV2LmRtYV9tYXNrID0gZGV2LT5kbWFfbWFzazsKKwlyZXQtPmdhZGdldC5kZXYucmVsZWFzZSA9IG5ldDIyNzJfZ2FkZ2V0X3JlbGVhc2U7CisJcmV0LT5nYWRnZXQubmFtZSA9IGRyaXZlcl9uYW1lOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK25ldDIyNzJfcHJvYmVfZmluKHN0cnVjdCBuZXQyMjcyICpkZXYsIHVuc2lnbmVkIGludCBpcnFmbGFncykKK3sKKwlpbnQgcmV0OworCisJLyogU2VlIGlmIHRoZXJlLi4uICovCisJaWYgKG5ldDIyNzJfcHJlc2VudChkZXYpKSB7CisJCWRldl93YXJuKGRldi0+ZGV2LCAiMjI3MiBub3QgZm91bmQhXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJbmV0MjI3Ml91c2JfcmVzZXQoZGV2KTsKKwluZXQyMjcyX3VzYl9yZWluaXQoZGV2KTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBuZXQyMjcyX2lycSwgaXJxZmxhZ3MsIGRyaXZlcl9uYW1lLCBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYtPmRldiwgInJlcXVlc3QgaW50ZXJydXB0ICVpIGZhaWxlZFxuIiwgZGV2LT5pcnEpOworCQlnb3RvIGVycjsKKwl9CisKKwlkZXYtPmNoaXByZXYgPSBuZXQyMjcyX3JlYWQoZGV2LCBDSElQUkVWXzIyNzIpOworCisJLyogZG9uZSAqLworCWRldl9pbmZvKGRldi0+ZGV2LCAiJXNcbiIsIGRyaXZlcl9kZXNjKTsKKwlkZXZfaW5mbyhkZXYtPmRldiwgImlycSAlaSwgbWVtICVwLCBjaGlwIHJldiAlMDR4LCBkbWEgJXNcbiIsCisJCWRldi0+aXJxLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5jaGlwcmV2LAorCQlkbWFfbW9kZV9zdHJpbmcoKSk7CisJZGV2X2luZm8oZGV2LT5kZXYsICJ2ZXJzaW9uOiAlc1xuIiwgZHJpdmVyX3ZlcnMpOworCisJdGhlX2NvbnRyb2xsZXIgPSBkZXY7CisKKwlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+Z2FkZ2V0LmRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfaXJxOworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYtPmRldiwgJmRldl9hdHRyX3JlZ2lzdGVycyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGV2X3JlZzsKKworCXJldCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYyhkZXYtPmRldiwgJmRldi0+Z2FkZ2V0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9hZGRfdWRjOworCisJcmV0dXJuIDA7CisKK2Vycl9hZGRfdWRjOgorCWRldmljZV9yZW1vdmVfZmlsZShkZXYtPmRldiwgJmRldl9hdHRyX3JlZ2lzdGVycyk7CisgZXJyX2Rldl9yZWc6CisJZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+Z2FkZ2V0LmRldik7CisgZXJyX2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKyBlcnI6CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19QQ0kKKworLyoKKyAqIHdyYXAgdGhpcyBkcml2ZXIgYXJvdW5kIHRoZSBzcGVjaWZpZWQgZGV2aWNlLCBidXQKKyAqIGRvbid0IHJlc3BvbmQgb3ZlciBVU0IgdW50aWwgYSBnYWRnZXQgZHJpdmVyIGJpbmRzIHRvIHVzCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQKK25ldDIyNzJfcmRrMV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG5ldDIyNzIgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHJlc291cmNlLCBsZW4sIHRtcDsKKwl2b2lkIF9faW9tZW0gKm1lbV9tYXBwZWRfYWRkcls0XTsKKwlpbnQgcmV0LCBpOworCisJLyoKKwkgKiBCQVIgMCBob2xkcyBQTFggOTA1NCBjb25maWcgcmVnaXN0ZXJzCisJICogQkFSIDEgaXMgaS9vIG1lbW9yeTsgdW51c2VkIGhlcmUKKwkgKiBCQVIgMiBob2xkcyBFUExEIGNvbmZpZyByZWdpc3RlcnMKKwkgKiBCQVIgMyBob2xkcyBORVQyMjcyIHJlZ2lzdGVycworCSAqLworCisJLyogRmluZCBhbmQgbWFwIGFsbCBhZGRyZXNzIHNwYWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJaWYgKGkgPT0gMSkKKwkJCWNvbnRpbnVlOwkvKiBCQVIxIHVudXNlZCAqLworCisJCXJlc291cmNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOworCQlsZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpOworCisJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlc291cmNlLCBsZW4sIGRyaXZlcl9uYW1lKSkgeworCQkJZGV2X2RiZyhkZXYtPmRldiwgImNvbnRyb2xsZXIgYWxyZWFkeSBpbiB1c2VcbiIpOworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBlcnI7CisJCX0KKworCQltZW1fbWFwcGVkX2FkZHJbaV0gPSBpb3JlbWFwX25vY2FjaGUocmVzb3VyY2UsIGxlbik7CisJCWlmIChtZW1fbWFwcGVkX2FkZHJbaV0gPT0gTlVMTCkgeworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlc291cmNlLCBsZW4pOworCQkJZGV2X2RiZyhkZXYtPmRldiwgImNhbid0IG1hcCBtZW1vcnlcbiIpOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyID0gbWVtX21hcHBlZF9hZGRyWzBdOworCWRldi0+cmRrMS5lcGxkX2Jhc2VfYWRkciA9IG1lbV9tYXBwZWRfYWRkclsyXTsKKwlkZXYtPmJhc2VfYWRkciA9IG1lbV9tYXBwZWRfYWRkclszXTsKKworCS8qIFNldCBQTFggOTA1NCBidXMgd2lkdGggKDE2IGJpdHMpICovCisJdG1wID0gcmVhZGwoZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyICsgTEJSRDEpOworCXdyaXRlbCgodG1wICYgfigzIDw8IE1FTU9SWV9TUEFDRV9MT0NBTF9CVVNfV0lEVEgpKSB8IFcxNl9CSVQsCisJCQlkZXYtPnJkazEucGx4OTA1NF9iYXNlX2FkZHIgKyBMQlJEMSk7CisKKwkvKiBFbmFibGUgUExYIDkwNTQgSW50ZXJydXB0cyAqLworCXdyaXRlbChyZWFkbChkZXYtPnJkazEucGx4OTA1NF9iYXNlX2FkZHIgKyBJTlRDU1IpIHwKKwkJCSgxIDw8IFBDSV9JTlRFUlJVUFRfRU5BQkxFKSB8CisJCQkoMSA8PCBMT0NBTF9JTlRFUlJVUFRfSU5QVVRfRU5BQkxFKSwKKwkJCWRldi0+cmRrMS5wbHg5MDU0X2Jhc2VfYWRkciArIElOVENTUik7CisKKwl3cml0ZWIoKDEgPDwgQ0hBTk5FTF9DTEVBUl9JTlRFUlJVUFQgfCAoMCA8PCBDSEFOTkVMX0VOQUJMRSkpLAorCQkJZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyICsgRE1BQ1NSMCk7CisKKwkvKiByZXNldCAqLworCXdyaXRlYigoMSA8PCBFUExEX0RNQV9FTkFCTEUpIHwKKwkJKDEgPDwgRE1BX0NUTF9EQUNLKSB8CisJCSgxIDw8IERNQV9USU1FT1VUX0VOQUJMRSkgfAorCQkoMSA8PCBVU0VSKSB8CisJCSgwIDw8IE1QWF9NT0RFKSB8CisJCSgxIDw8IEJVU1dJRFRIKSB8CisJCSgxIDw8IE5FVDIyNzJfUkVTRVQpLAorCQlkZXYtPmJhc2VfYWRkciArIEVQTERfSU9fQ09OVFJPTF9SRUdJU1RFUik7CisKKwltYigpOworCXdyaXRlYihyZWFkYihkZXYtPmJhc2VfYWRkciArIEVQTERfSU9fQ09OVFJPTF9SRUdJU1RFUikgJgorCQl+KDEgPDwgTkVUMjI3Ml9SRVNFVCksCisJCWRldi0+YmFzZV9hZGRyICsgRVBMRF9JT19DT05UUk9MX1JFR0lTVEVSKTsKKwl1ZGVsYXkoMjAwKTsKKworCXJldHVybiAwOworCisgZXJyOgorCXdoaWxlICgtLWkgPj0gMCkgeworCQlpb3VubWFwKG1lbV9tYXBwZWRfYWRkcltpXSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSksCisJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorbmV0MjI3Ml9yZGsyX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgbmV0MjI3MiAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgcmVzb3VyY2UsIGxlbjsKKwl2b2lkIF9faW9tZW0gKm1lbV9tYXBwZWRfYWRkclsyXTsKKwlpbnQgcmV0LCBpOworCisJLyoKKwkgKiBCQVIgMCBob2xkcyBGR1BBIGNvbmZpZyByZWdpc3RlcnMKKwkgKiBCQVIgMSBob2xkcyBORVQyMjcyIHJlZ2lzdGVycworCSAqLworCisJLyogRmluZCBhbmQgbWFwIGFsbCBhZGRyZXNzIHNwYWNlcywgYmFyMi0zIHVudXNlZCBpbiByZGsgMiAqLworCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKwkJcmVzb3VyY2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSk7CisJCWxlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSk7CisKKwkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzb3VyY2UsIGxlbiwgZHJpdmVyX25hbWUpKSB7CisJCQlkZXZfZGJnKGRldi0+ZGV2LCAiY29udHJvbGxlciBhbHJlYWR5IGluIHVzZVxuIik7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCW1lbV9tYXBwZWRfYWRkcltpXSA9IGlvcmVtYXBfbm9jYWNoZShyZXNvdXJjZSwgbGVuKTsKKwkJaWYgKG1lbV9tYXBwZWRfYWRkcltpXSA9PSBOVUxMKSB7CisJCQlyZWxlYXNlX21lbV9yZWdpb24ocmVzb3VyY2UsIGxlbik7CisJCQlkZXZfZGJnKGRldi0+ZGV2LCAiY2FuJ3QgbWFwIG1lbW9yeVxuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlkZXYtPnJkazIuZnBnYV9iYXNlX2FkZHIgPSBtZW1fbWFwcGVkX2FkZHJbMF07CisJZGV2LT5iYXNlX2FkZHIgPSBtZW1fbWFwcGVkX2FkZHJbMV07CisKKwltYigpOworCS8qIFNldCAyMjcyIGJ1cyB3aWR0aCAoMTYgYml0cykgYW5kIHJlc2V0ICovCisJd3JpdGVsKCgxIDw8IENISVBfUkVTRVQpLCBkZXYtPnJkazIuZnBnYV9iYXNlX2FkZHIgKyBSREsyX0xPQ0NUTFJESyk7CisJdWRlbGF5KDIwMCk7CisJd3JpdGVsKCgxIDw8IEJVU19XSURUSCksIGRldi0+cmRrMi5mcGdhX2Jhc2VfYWRkciArIFJESzJfTE9DQ1RMUkRLKTsKKwkvKiBQcmludCBmcGdhIHZlcnNpb24gbnVtYmVyICovCisJZGV2X2luZm8oZGV2LT5kZXYsICJSREsyIEZQR0EgdmVyc2lvbiAlMDh4XG4iLAorCQlyZWFkbChkZXYtPnJkazIuZnBnYV9iYXNlX2FkZHIgKyBSREsyX0ZQR0FSRVYpKTsKKwkvKiBFbmFibGUgRlBHQSBJbnRlcnJ1cHRzICovCisJd3JpdGVsKCgxIDw8IE5FVDIyNzJfUENJX0lSUSksIGRldi0+cmRrMi5mcGdhX2Jhc2VfYWRkciArIFJESzJfSVJRRU5CKTsKKworCXJldHVybiAwOworCisgZXJyOgorCXdoaWxlICgtLWkgPj0gMCkgeworCQlpb3VubWFwKG1lbV9tYXBwZWRfYWRkcltpXSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSksCisJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorbmV0MjI3Ml9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0MjI3MiAqZGV2OworCWludCByZXQ7CisKKwlkZXYgPSBuZXQyMjcyX3Byb2JlX2luaXQoJnBkZXYtPmRldiwgcGRldi0+aXJxKTsKKwlpZiAoSVNfRVJSKGRldikpCisJCXJldHVybiBQVFJfRVJSKGRldik7CisJZGV2LT5kZXZfaWQgPSBwZGV2LT5kZXZpY2U7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikgPCAwKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9SREsxOiByZXQgPSBuZXQyMjcyX3JkazFfcHJvYmUocGRldiwgZGV2KTsgYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1JESzI6IHJldCA9IG5ldDIyNzJfcmRrMl9wcm9iZShwZGV2LCBkZXYpOyBicmVhazsKKwlkZWZhdWx0OiBCVUcoKTsKKwl9CisJaWYgKHJldCkKKwkJZ290byBlcnJfcGNpOworCisJcmV0ID0gbmV0MjI3Ml9wcm9iZV9maW4oZGV2LCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wY2k7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXJldHVybiAwOworCisgZXJyX3BjaToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisgZXJyX2ZyZWU6CisJa2ZyZWUoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorbmV0MjI3Ml9yZGsxX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG5ldDIyNzIgKmRldikKK3sKKwlpbnQgaTsKKworCS8qIGRpc2FibGUgUExYIDkwNTQgaW50ZXJydXB0cyAqLworCXdyaXRlbChyZWFkbChkZXYtPnJkazEucGx4OTA1NF9iYXNlX2FkZHIgKyBJTlRDU1IpICYKKwkJfigxIDw8IFBDSV9JTlRFUlJVUFRfRU5BQkxFKSwKKwkJZGV2LT5yZGsxLnBseDkwNTRfYmFzZV9hZGRyICsgSU5UQ1NSKTsKKworCS8qIGNsZWFuIHVwIHJlc291cmNlcyBhbGxvY2F0ZWQgZHVyaW5nIHByb2JlKCkgKi8KKwlpb3VubWFwKGRldi0+cmRrMS5wbHg5MDU0X2Jhc2VfYWRkcik7CisJaW91bm1hcChkZXYtPnJkazEuZXBsZF9iYXNlX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQlpZiAoaSA9PSAxKQorCQkJY29udGludWU7CS8qIEJBUjEgdW51c2VkICovCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSksCisJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorbmV0MjI3Ml9yZGsyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG5ldDIyNzIgKmRldikKK3sKKwlpbnQgaTsKKworCS8qIGRpc2FibGUgZnBnYSBpbnRlcnJ1cHRzCisJd3JpdGVsKHJlYWRsKGRldi0+cmRrMS5wbHg5MDU0X2Jhc2VfYWRkciArIElOVENTUikgJgorCQkJfigxIDw8IFBDSV9JTlRFUlJVUFRfRU5BQkxFKSwKKwkJCWRldi0+cmRrMS5wbHg5MDU0X2Jhc2VfYWRkciArIElOVENTUik7CisJKi8KKworCS8qIGNsZWFuIHVwIHJlc291cmNlcyBhbGxvY2F0ZWQgZHVyaW5nIHByb2JlKCkgKi8KKwlpb3VubWFwKGRldi0+cmRrMi5mcGdhX2Jhc2VfYWRkcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQorCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpLAorCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCBpKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorbmV0MjI3Ml9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXQyMjcyICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwluZXQyMjcyX3JlbW92ZShkZXYpOworCisJc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUkRLMTogbmV0MjI3Ml9yZGsxX3JlbW92ZShwZGV2LCBkZXYpOyBicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfUkRLMjogbmV0MjI3Ml9yZGsyX3JlbW92ZShwZGV2LCBkZXYpOyBicmVhazsKKwlkZWZhdWx0OiBCVUcoKTsKKwl9CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlrZnJlZShkZXYpOworfQorCisvKiBUYWJsZSBvZiBtYXRjaGluZyBQQ0kgSURzICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgX19kZXZpbml0ZGF0YSBwY2lfaWRzW10gPSB7CisJewkvKiBSREsgMSBjYXJkICovCisJCS5jbGFzcyAgICAgICA9ICgoUENJX0NMQVNTX0JSSURHRV9PVEhFUiA8PCA4KSB8IDB4ZmUpLAorCQkuY2xhc3NfbWFzayAgPSAwLAorCQkudmVuZG9yICAgICAgPSBQQ0lfVkVORE9SX0lEX1BMWCwKKwkJLmRldmljZSAgICAgID0gUENJX0RFVklDRV9JRF9SREsxLAorCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAorCX0sCisJewkvKiBSREsgMiBjYXJkICovCisJCS5jbGFzcyAgICAgICA9ICgoUENJX0NMQVNTX0JSSURHRV9PVEhFUiA8PCA4KSB8IDB4ZmUpLAorCQkuY2xhc3NfbWFzayAgPSAwLAorCQkudmVuZG9yICAgICAgPSBQQ0lfVkVORE9SX0lEX1BMWCwKKwkJLmRldmljZSAgICAgID0gUENJX0RFVklDRV9JRF9SREsyLAorCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAorCX0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV9pZHMpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbmV0MjI3Ml9wY2lfZHJpdmVyID0geworCS5uYW1lICAgICA9IGRyaXZlcl9uYW1lLAorCS5pZF90YWJsZSA9IHBjaV9pZHMsCisKKwkucHJvYmUgICAgPSBuZXQyMjcyX3BjaV9wcm9iZSwKKwkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChuZXQyMjcyX3BjaV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBuZXQyMjcyX3BjaV9yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZuZXQyMjcyX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBuZXQyMjcyX3BjaV91bnJlZ2lzdGVyKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZuZXQyMjcyX3BjaV9kcml2ZXIpOworfQorCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbmV0MjI3Ml9wY2lfcmVnaXN0ZXIodm9pZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIG5ldDIyNzJfcGNpX3VucmVnaXN0ZXIodm9pZCkgeyB9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorbmV0MjI3Ml9wbGF0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldDIyNzIgKmRldjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpcnFmbGFnczsKKwlyZXNvdXJjZV9zaXplX3QgYmFzZSwgbGVuOworCXN0cnVjdCByZXNvdXJjZSAqaW9tZW0sICppb21lbV9idXMsICppcnFfcmVzOworCisJaXJxX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CisJaW9tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlvbWVtX2J1cyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0JVUywgMCk7CisJaWYgKCFpcnFfcmVzIHx8ICFpb21lbSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtdXN0IHByb3ZpZGUgaXJxL2Jhc2UgYWRkciIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXYgPSBuZXQyMjcyX3Byb2JlX2luaXQoJnBkZXYtPmRldiwgaXJxX3Jlcy0+c3RhcnQpOworCWlmIChJU19FUlIoZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2KTsKKworCWlycWZsYWdzID0gMDsKKwlpZiAoaXJxX3Jlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lSUV9ISUdIRURHRSkKKwkJaXJxZmxhZ3MgfD0gSVJRRl9UUklHR0VSX1JJU0lORzsKKwlpZiAoaXJxX3Jlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lSUV9MT1dFREdFKQorCQlpcnFmbGFncyB8PSBJUlFGX1RSSUdHRVJfRkFMTElORzsKKwlpZiAoaXJxX3Jlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lSUV9ISUdITEVWRUwpCisJCWlycWZsYWdzIHw9IElSUUZfVFJJR0dFUl9ISUdIOworCWlmIChpcnFfcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSVJRX0xPV0xFVkVMKQorCQlpcnFmbGFncyB8PSBJUlFGX1RSSUdHRVJfTE9XOworCisJYmFzZSA9IGlvbWVtLT5zdGFydDsKKwlsZW4gPSByZXNvdXJjZV9zaXplKGlvbWVtKTsKKwlpZiAoaW9tZW1fYnVzKQorCQlkZXYtPmJhc2Vfc2hpZnQgPSBpb21lbV9idXMtPnN0YXJ0OworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYmFzZSwgbGVuLCBkcml2ZXJfbmFtZSkpIHsKKwkJZGV2X2RiZyhkZXYtPmRldiwgImdldCByZXF1ZXN0IG1lbW9yeSByZWdpb24hXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycjsKKwl9CisJZGV2LT5iYXNlX2FkZHIgPSBpb3JlbWFwX25vY2FjaGUoYmFzZSwgbGVuKTsKKwlpZiAoIWRldi0+YmFzZV9hZGRyKSB7CisJCWRldl9kYmcoZGV2LT5kZXYsICJjYW4ndCBtYXAgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfcmVxOworCX0KKworCXJldCA9IG5ldDIyNzJfcHJvYmVfZmluKGRldiwgSVJRRl9UUklHR0VSX0xPVyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfaW87CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJydW5uaW5nIGluIDE2LWJpdCwgJXNieXRlIHN3YXAgbG9jYWwgYnVzIG1vZGVcbiIsCisJCShuZXQyMjcyX3JlYWQoZGV2LCBMT0NDVEwpICYgKDEgPDwgQllURV9TV0FQKSkgPyAiIiA6ICJubyAiKTsKKworCXRoZV9jb250cm9sbGVyID0gZGV2OworCisJcmV0dXJuIDA7CisKKyBlcnJfaW86CisJaW91bm1hcChkZXYtPmJhc2VfYWRkcik7CisgZXJyX3JlcToKKwlyZWxlYXNlX21lbV9yZWdpb24oYmFzZSwgbGVuKTsKKyBlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQKK25ldDIyNzJfcGxhdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0MjI3MiAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwluZXQyMjcyX3JlbW92ZShkZXYpOworCisJcmVsZWFzZV9tZW1fcmVnaW9uKHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0LAorCQlyZXNvdXJjZV9zaXplKCZwZGV2LT5yZXNvdXJjZVswXSkpOworCisJa2ZyZWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBuZXQyMjcyX3BsYXRfZHJpdmVyID0geworCS5wcm9iZSAgID0gbmV0MjI3Ml9wbGF0X3Byb2JlLAorCS5yZW1vdmUgID0gX19kZXZleGl0X3AobmV0MjI3Ml9wbGF0X3JlbW92ZSksCisJLmRyaXZlciAgPSB7CisJCS5uYW1lICA9IGRyaXZlcl9uYW1lLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS8qIEZJWE1FIC5zdXNwZW5kLCAucmVzdW1lICovCit9OworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpuZXQyMjcyIik7CisKK3N0YXRpYyBpbnQgX19pbml0IG5ldDIyNzJfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBuZXQyMjcyX3BjaV9yZWdpc3RlcigpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZuZXQyMjcyX3BsYXRfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wY2k7CisJcmV0dXJuIHJldDsKKworZXJyX3BjaToKKwluZXQyMjcyX3BjaV91bnJlZ2lzdGVyKCk7CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KG5ldDIyNzJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZXQyMjcyX2NsZWFudXAodm9pZCkKK3sKKwluZXQyMjcyX3BjaV91bnJlZ2lzdGVyKCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm5ldDIyNzJfcGxhdF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobmV0MjI3Ml9jbGVhbnVwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9BVVRIT1IoIlBMWCBUZWNobm9sb2d5LCBJbmMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI3Mi5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyNzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk1MDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyNzIuaApAQCAtMCwwICsxLDYwMSBAQAorLyoKKyAqIFBMWCBORVQyMjcyIGhpZ2gvZnVsbCBzcGVlZCBVU0IgZGV2aWNlIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBQTFggVGVjaG5vbG9neSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgQW5hbG9nIERldmljZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX05FVDIyNzJfSF9fCisjZGVmaW5lIF9fTkVUMjI3Ml9IX18KKworLyogTWFpbiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkVHQUREUlBUUgkJCTB4MDAKKyNkZWZpbmUgUkVHREFUQQkJCQkweDAxCisjZGVmaW5lIElSUVNUQVQwCQkJMHgwMgorI2RlZmluZSAJRU5EUE9JTlRfMF9JTlRFUlJVUFQJCQkwCisjZGVmaW5lIAlFTkRQT0lOVF9BX0lOVEVSUlVQVAkJCTEKKyNkZWZpbmUgCUVORFBPSU5UX0JfSU5URVJSVVBUCQkJMgorI2RlZmluZSAJRU5EUE9JTlRfQ19JTlRFUlJVUFQJCQkzCisjZGVmaW5lIAlWSVJUVUFMSVpFRF9FTkRQT0lOVF9JTlRFUlJVUFQJCTQKKyNkZWZpbmUgCVNFVFVQX1BBQ0tFVF9JTlRFUlJVUFQJCQk1CisjZGVmaW5lIAlETUFfRE9ORV9JTlRFUlJVUFQJCQk2CisjZGVmaW5lIAlTT0ZfSU5URVJSVVBUCQkJCTcKKyNkZWZpbmUgSVJRU1RBVDEJCQkweDAzCisjZGVmaW5lIAlDT05UUk9MX1NUQVRVU19JTlRFUlJVUFQJCTEKKyNkZWZpbmUgCVZCVVNfSU5URVJSVVBUCQkJCTIKKyNkZWZpbmUgCVNVU1BFTkRfUkVRVUVTVF9JTlRFUlJVUFQJCTMKKyNkZWZpbmUgCVNVU1BFTkRfUkVRVUVTVF9DSEFOR0VfSU5URVJSVVBUCTQKKyNkZWZpbmUgCVJFU1VNRV9JTlRFUlJVUFQJCQk1CisjZGVmaW5lIAlST09UX1BPUlRfUkVTRVRfSU5URVJSVVBUCQk2CisjZGVmaW5lIAlSRVNFVF9TVEFUVVMJCQkJNworI2RlZmluZSBQQUdFU0VMCQkJCTB4MDQKKyNkZWZpbmUgRE1BUkVRCQkJCTB4MWMKKyNkZWZpbmUgCURNQV9FTkRQT0lOVF9TRUxFQ1QJCQkwCisjZGVmaW5lIAlEUkVRX1BPTEFSSVRZCQkJCTEKKyNkZWZpbmUgCURBQ0tfUE9MQVJJVFkJCQkJMgorI2RlZmluZSAJRU9UX1BPTEFSSVRZCQkJCTMKKyNkZWZpbmUgCURNQV9DT05UUk9MX0RBQ0sJCQk0CisjZGVmaW5lIAlETUFfUkVRVUVTVF9FTkFCTEUJCQk1CisjZGVmaW5lIAlETUFfUkVRVUVTVAkJCQk2CisjZGVmaW5lIAlETUFfQlVGRkVSX1ZBTElECQkJNworI2RlZmluZSBTQ1JBVENICQkJCTB4MWQKKyNkZWZpbmUgSVJRRU5CMAkJCQkweDIwCisjZGVmaW5lIAlFTkRQT0lOVF8wX0lOVEVSUlVQVF9FTkFCTEUJCTAKKyNkZWZpbmUgCUVORFBPSU5UX0FfSU5URVJSVVBUX0VOQUJMRQkJMQorI2RlZmluZSAJRU5EUE9JTlRfQl9JTlRFUlJVUFRfRU5BQkxFCQkyCisjZGVmaW5lIAlFTkRQT0lOVF9DX0lOVEVSUlVQVF9FTkFCTEUJCTMKKyNkZWZpbmUgCVZJUlRVQUxJWkVEX0VORFBPSU5UX0lOVEVSUlVQVF9FTkFCTEUJNAorI2RlZmluZSAJU0VUVVBfUEFDS0VUX0lOVEVSUlVQVF9FTkFCTEUJCTUKKyNkZWZpbmUgCURNQV9ET05FX0lOVEVSUlVQVF9FTkFCTEUJCTYKKyNkZWZpbmUgCVNPRl9JTlRFUlJVUFRfRU5BQkxFCQkJNworI2RlZmluZSBJUlFFTkIxCQkJCTB4MjEKKyNkZWZpbmUgCVZCVVNfSU5URVJSVVBUX0VOQUJMRQkJCTIKKyNkZWZpbmUgCVNVU1BFTkRfUkVRVUVTVF9JTlRFUlJVUFRfRU5BQkxFCTMKKyNkZWZpbmUgCVNVU1BFTkRfUkVRVUVTVF9DSEFOR0VfSU5URVJSVVBUX0VOQUJMRQk0CisjZGVmaW5lIAlSRVNVTUVfSU5URVJSVVBUX0VOQUJMRQkJCTUKKyNkZWZpbmUgCVJPT1RfUE9SVF9SRVNFVF9JTlRFUlJVUFRfRU5BQkxFCTYKKyNkZWZpbmUgTE9DQ1RMCQkJCTB4MjIKKyNkZWZpbmUgCURBVEFfV0lEVEgJCQkJMAorI2RlZmluZSAJTE9DQUxfQ0xPQ0tfT1VUUFVUCQkJMQorI2RlZmluZSAJCUxPQ0FMX0NMT0NLX09VVFBVVF9PRkYJCQkwCisjZGVmaW5lIAkJTE9DQUxfQ0xPQ0tfT1VUUFVUXzNfNzVNSFoJCTEKKyNkZWZpbmUgCQlMT0NBTF9DTE9DS19PVVRQVVRfN181TUhaCQkyCisjZGVmaW5lIAkJTE9DQUxfQ0xPQ0tfT1VUUFVUXzE1TUhaCQkzCisjZGVmaW5lIAkJTE9DQUxfQ0xPQ0tfT1VUUFVUXzMwTUhaCQk0CisjZGVmaW5lIAkJTE9DQUxfQ0xPQ0tfT1VUUFVUXzYwTUhaCQk1CisjZGVmaW5lIAlETUFfU1BMSVRfQlVTX01PREUJCQk0CisjZGVmaW5lIAlCWVRFX1NXQVAJCQkJNQorI2RlZmluZSAJQlVGRkVSX0NPTkZJR1VSQVRJT04JCQk2CisjZGVmaW5lIAkJQlVGRkVSX0NPTkZJR1VSQVRJT05fRVBBNTEyX0VQQjUxMgkwCisjZGVmaW5lIAkJQlVGRkVSX0NPTkZJR1VSQVRJT05fRVBBMTAyNF9FUEI1MTIJMQorI2RlZmluZSAJCUJVRkZFUl9DT05GSUdVUkFUSU9OX0VQQTEwMjRfRVBCMTAyNAkyCisjZGVmaW5lIAkJQlVGRkVSX0NPTkZJR1VSQVRJT05fRVBBMTAyNERCCQkzCisjZGVmaW5lIENISVBSRVZfTEVHQUNZCQkJMHgyMworI2RlZmluZSAJCU5FVDIyNzBfTEVHQUNZX1JFVgkJCTB4NDAKKyNkZWZpbmUgTE9DQ1RMMQkJCQkweDI0CisjZGVmaW5lIAlETUFfTU9ERQkJCQkwCisjZGVmaW5lIAkJU0xPV19EUkVRCQkJCTAKKyNkZWZpbmUgCQlGQVNUX0RSRVEJCQkJMQorI2RlZmluZSAJCUJVUlNUX01PREUJCQkJMgorI2RlZmluZSAJRE1BX0RBQ0tfRU5BQkxFCQkJCTIKKyNkZWZpbmUgQ0hJUFJFVl8yMjcyCQkJMHgyNQorI2RlZmluZSAJCUNISVBSRVZfTkVUMjI3Ml9SMQkJCTB4MTAKKyNkZWZpbmUgCQlDSElQUkVWX05FVDIyNzJfUjFBCQkJMHgxMQorLyogVVNCIFJlZ2lzdGVycyAqLworI2RlZmluZSBVU0JDVEwwCQkJCTB4MTgKKyNkZWZpbmUgCUlPX1dBS0VVUF9FTkFCTEUJCQkxCisjZGVmaW5lIAlVU0JfREVURUNUX0VOQUJMRQkJCTMKKyNkZWZpbmUgCVVTQl9ST09UX1BPUlRfV0FLRVVQX0VOQUJMRQkJNQorI2RlZmluZSBVU0JDVEwxCQkJCTB4MTkKKyNkZWZpbmUgCVZCVVNfUElOCQkJCTAKKyNkZWZpbmUgCQlVU0JfRlVMTF9TUEVFRAkJCQkxCisjZGVmaW5lIAkJVVNCX0hJR0hfU1BFRUQJCQkJMgorI2RlZmluZSAJR0VORVJBVEVfUkVTVU1FCQkJCTMKKyNkZWZpbmUgCVZJUlRVQUxfRU5EUE9JTlRfRU5BQkxFCQkJNAorI2RlZmluZSBGUkFNRTAJCQkJMHgxYQorI2RlZmluZSBGUkFNRTEJCQkJMHgxYgorI2RlZmluZSBPVVJBRERSCQkJCTB4MzAKKyNkZWZpbmUgCUZPUkNFX0lNTUVESUFURQkJCQk3CisjZGVmaW5lIFVTQkRJQUcJCQkJMHgzMQorI2RlZmluZSAJRk9SQ0VfVFJBTlNNSVRfQ1JDX0VSUk9SCQkwCisjZGVmaW5lIAlQUkVWRU5UX1RSQU5TTUlUX0JJVF9TVFVGRgkJMQorI2RlZmluZSAJRk9SQ0VfUkVDRUlWRV9FUlJPUgkJCTIKKyNkZWZpbmUgCUZBU1RfVElNRVMJCQkJNAorI2RlZmluZSBVU0JURVNUCQkJCTB4MzIKKyNkZWZpbmUgCVRFU1RfTU9ERV9TRUxFQ1QJCQkwCisjZGVmaW5lIAkJTk9STUFMX09QRVJBVElPTgkJCTAKKyNkZWZpbmUgCQlURVNUX0oJCQkJCTEKKyNkZWZpbmUgCQlURVNUX0sJCQkJCTIKKyNkZWZpbmUgCQlURVNUX1NFMF9OQUsJCQkJMworI2RlZmluZSAJCVRFU1RfUEFDS0VUCQkJCTQKKyNkZWZpbmUgCQlURVNUX0ZPUkNFX0VOQUJMRQkJCTUKKyNkZWZpbmUgWENWUkRJQUcJCQkweDMzCisjZGVmaW5lIAlGT1JDRV9GVUxMX1NQRUVECQkJMgorI2RlZmluZSAJRk9SQ0VfSElHSF9TUEVFRAkJCTMKKyNkZWZpbmUgCU9QTU9ERQkJCQkJNAorI2RlZmluZSAJCU5PUk1BTF9PUEVSQVRJT04JCQkwCisjZGVmaW5lIAkJTk9OX0RSSVZJTkcJCQkJMQorI2RlZmluZSAJCURJU0FCTEVfQklUU1RVRkZfQU5EX05SWklfRU5DT0RFCTIKKyNkZWZpbmUgCUxJTkVTVEFURQkJCQk2CisjZGVmaW5lIAkJU0UwX1NUQVRFCQkJCTAKKyNkZWZpbmUgCQlKX1NUQVRFCQkJCQkxCisjZGVmaW5lIAkJS19TVEFURQkJCQkJMgorI2RlZmluZSAJCVNFMV9TVEFURQkJCQkzCisjZGVmaW5lIFZJUlRPVVQwCQkJMHgzNAorI2RlZmluZSBWSVJUT1VUMQkJCTB4MzUKKyNkZWZpbmUgVklSVElOMAkJCQkweDM2CisjZGVmaW5lIFZJUlRJTjEJCQkJMHgzNworI2RlZmluZSBTRVRVUDAJCQkJMHg0MAorI2RlZmluZSBTRVRVUDEJCQkJMHg0MQorI2RlZmluZSBTRVRVUDIJCQkJMHg0MgorI2RlZmluZSBTRVRVUDMJCQkJMHg0MworI2RlZmluZSBTRVRVUDQJCQkJMHg0NAorI2RlZmluZSBTRVRVUDUJCQkJMHg0NQorI2RlZmluZSBTRVRVUDYJCQkJMHg0NgorI2RlZmluZSBTRVRVUDcJCQkJMHg0NworLyogRW5kcG9pbnQgUmVnaXN0ZXJzIChQYWdlZCB2aWEgUEFHRVNFTCkgKi8KKyNkZWZpbmUgRVBfREFUQQkJCQkweDA1CisjZGVmaW5lIEVQX1NUQVQwCQkJMHgwNgorI2RlZmluZSAJREFUQV9JTl9UT0tFTl9JTlRFUlJVUFQJCQkwCisjZGVmaW5lIAlEQVRBX09VVF9UT0tFTl9JTlRFUlJVUFQJCTEKKyNkZWZpbmUgCURBVEFfUEFDS0VUX1RSQU5TTUlUVEVEX0lOVEVSUlVQVAkyCisjZGVmaW5lIAlEQVRBX1BBQ0tFVF9SRUNFSVZFRF9JTlRFUlJVUFQJCTMKKyNkZWZpbmUgCVNIT1JUX1BBQ0tFVF9UUkFOU0ZFUlJFRF9JTlRFUlJVUFQJNAorI2RlZmluZSAJTkFLX09VVF9QQUNLRVRTCQkJCTUKKyNkZWZpbmUgCUJVRkZFUl9FTVBUWQkJCQk2CisjZGVmaW5lIAlCVUZGRVJfRlVMTAkJCQk3CisjZGVmaW5lIEVQX1NUQVQxCQkJMHgwNworI2RlZmluZSAJVElNRU9VVAkJCQkJMAorI2RlZmluZSAJVVNCX09VVF9BQ0tfU0VOVAkJCTEKKyNkZWZpbmUgCVVTQl9PVVRfTkFLX1NFTlQJCQkyCisjZGVmaW5lIAlVU0JfSU5fQUNLX1JDVkQJCQkJMworI2RlZmluZSAJVVNCX0lOX05BS19TRU5UCQkJCTQKKyNkZWZpbmUgCVVTQl9TVEFMTF9TRU5UCQkJCTUKKyNkZWZpbmUgCUxPQ0FMX09VVF9aTFAJCQkJNgorI2RlZmluZSAJQlVGRkVSX0ZMVVNICQkJCTcKKyNkZWZpbmUgRVBfVFJBTlNGRVIwCQkJMHgwOAorI2RlZmluZSBFUF9UUkFOU0ZFUjEJCQkweDA5CisjZGVmaW5lIEVQX1RSQU5TRkVSMgkJCTB4MGEKKyNkZWZpbmUgRVBfSVJRRU5CCQkJMHgwYgorI2RlZmluZSAJREFUQV9JTl9UT0tFTl9JTlRFUlJVUFRfRU5BQkxFCQkwCisjZGVmaW5lIAlEQVRBX09VVF9UT0tFTl9JTlRFUlJVUFRfRU5BQkxFCQkxCisjZGVmaW5lIAlEQVRBX1BBQ0tFVF9UUkFOU01JVFRFRF9JTlRFUlJVUFRfRU5BQkxFCTIKKyNkZWZpbmUgCURBVEFfUEFDS0VUX1JFQ0VJVkVEX0lOVEVSUlVQVF9FTkFCTEUJMworI2RlZmluZSAJU0hPUlRfUEFDS0VUX1RSQU5TRkVSUkVEX0lOVEVSUlVQVF9FTkFCTEUJNAorI2RlZmluZSBFUF9BVkFJTDAJCQkweDBjCisjZGVmaW5lIEVQX0FWQUlMMQkJCTB4MGQKKyNkZWZpbmUgRVBfUlNQQ0xSCQkJMHgwZQorI2RlZmluZSBFUF9SU1BTRVQJCQkweDBmCisjZGVmaW5lIAlFTkRQT0lOVF9IQUxUCQkJCTAKKyNkZWZpbmUgCUVORFBPSU5UX1RPR0dMRQkJCQkxCisjZGVmaW5lIAlOQUtfT1VUX1BBQ0tFVFNfTU9ERQkJCTIKKyNkZWZpbmUgCUNPTlRST0xfU1RBVFVTX1BIQVNFX0hBTkRTSEFLRQkJMworI2RlZmluZSAJSU5URVJSVVBUX01PREUJCQkJNAorI2RlZmluZSAJQVVUT1ZBTElEQVRFCQkJCTUKKyNkZWZpbmUgCUhJREVfU1RBVFVTX1BIQVNFCQkJNgorI2RlZmluZSAJQUxUX05BS19PVVRfUEFDS0VUUwkJCTcKKyNkZWZpbmUgRVBfTUFYUEtUMAkJCTB4MjgKKyNkZWZpbmUgRVBfTUFYUEtUMQkJCTB4MjkKKyNkZWZpbmUgCUFERElUSU9OQUxfVFJBTlNBQ1RJT05fT1BQT1JUVU5JVElFUwkzCisjZGVmaW5lIAkJTk9ORV9BRERJVElPTkFMX1RSQU5TQUNUSU9OCQkwCisjZGVmaW5lIAkJT05FX0FERElUSU9OQUxfVFJBTlNBQ1RJT04JCTEKKyNkZWZpbmUgCQlUV09fQURESVRJT05BTF9UUkFOU0FDVElPTgkJMgorI2RlZmluZSBFUF9DRkcJCQkJMHgyYQorI2RlZmluZSAJRU5EUE9JTlRfTlVNQkVSCQkJCTAKKyNkZWZpbmUgCUVORFBPSU5UX0RJUkVDVElPTgkJCTQKKyNkZWZpbmUgCUVORFBPSU5UX1RZUEUJCQkJNQorI2RlZmluZSAJRU5EUE9JTlRfRU5BQkxFCQkJCTcKKyNkZWZpbmUgRVBfSEJXCQkJCTB4MmIKKyNkZWZpbmUgCUhJR0hfQkFORFdJRFRIX09VVF9UUkFOU0FDVElPTl9QSUQJMAorI2RlZmluZSAJCURBVEEwX1BJRAkJCQkwCisjZGVmaW5lIAkJREFUQTFfUElECQkJCTEKKyNkZWZpbmUgCQlEQVRBMl9QSUQJCQkJMgorI2RlZmluZSAJCU1EQVRBX1BJRAkJCQkzCisjZGVmaW5lIEVQX0JVRkZfU1RBVEVTCQkJMHgyYworI2RlZmluZSAJQlVGRkVSX0FfU1RBVEUJCQkJMAorI2RlZmluZSAJQlVGRkVSX0JfU1RBVEUJCQkJMgorI2RlZmluZSAJCUJVRkZfRlJFRQkJCQkwCisjZGVmaW5lIAkJQlVGRl9WQUxJRAkJCQkxCisjZGVmaW5lIAkJQlVGRl9MQ0wJCQkJMgorI2RlZmluZSAJCUJVRkZfVVNCCQkJCTMKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkRLMQkweDkwNTQKKworLyogUENJLVJESyBFUExEIFJlZ2lzdGVycyAqLworI2RlZmluZSBSREtfRVBMRF9JT19SRUdJU1RFUjEJCTB4MDAwMDAwMDAKKyNkZWZpbmUgCVJES19FUExEX1VTQl9SRVNFVAkJCQkwCisjZGVmaW5lIAlSREtfRVBMRF9VU0JfUE9XRVJET1dOCQkJCTEKKyNkZWZpbmUgCVJES19FUExEX1VTQl9XQUtFVVAJCQkJMgorI2RlZmluZSAJUkRLX0VQTERfVVNCX0VPVAkJCQkzCisjZGVmaW5lIAlSREtfRVBMRF9EUFBVTEwJCQkJCTQKKyNkZWZpbmUgUkRLX0VQTERfSU9fUkVHSVNURVIyCQkweDAwMDAwMDA0CisjZGVmaW5lIAlSREtfRVBMRF9CVVNXSURUSAkJCQkwCisjZGVmaW5lIAlSREtfRVBMRF9VU0VSCQkJCQkyCisjZGVmaW5lIAlSREtfRVBMRF9SRVNFVF9JTlRFUlJVUFRfRU5BQkxFCQkJMworI2RlZmluZSAJUkRLX0VQTERfRE1BX1RJTUVPVVRfRU5BQkxFCQkJNAorI2RlZmluZSBSREtfRVBMRF9TVEFUVVNfUkVHSVNURVIJMHgwMDAwMDAwOAorI2RlZmluZSAJUkRLX0VQTERfVVNCX0xSRVNFVAkJCQkwCisjZGVmaW5lIFJES19FUExEX1JFVklTSU9OX1JFR0lTVEVSCTB4MDAwMDAwMGMKKworLyogUENJLVJESyBQTFggOTA1NCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgSU5UQ1NSCQkJCTB4NjgKKyNkZWZpbmUgCVBDSV9JTlRFUlJVUFRfRU5BQkxFCQkJCTgKKyNkZWZpbmUgCUxPQ0FMX0lOVEVSUlVQVF9JTlBVVF9FTkFCTEUJCQkxMQorI2RlZmluZSAJTE9DQUxfSU5QVVRfSU5URVJSVVBUX0FDVElWRQkJCTE1CisjZGVmaW5lIAlMT0NBTF9ETUFfQ0hBTk5FTF8wX0lOVEVSUlVQVF9FTkFCTEUJCTE4CisjZGVmaW5lIAlMT0NBTF9ETUFfQ0hBTk5FTF8xX0lOVEVSUlVQVF9FTkFCTEUJCTE5CisjZGVmaW5lIAlETUFfQ0hBTk5FTF8wX0lOVEVSUlVQVF9BQ1RJVkUJCQkyMQorI2RlZmluZSAJRE1BX0NIQU5ORUxfMV9JTlRFUlJVUFRfQUNUSVZFCQkJMjIKKyNkZWZpbmUgQ05UUkwJCQkJMHg2QworI2RlZmluZSAJUkVMT0FEX0NPTkZJR1VSQVRJT05fUkVHSVNURVJTCQkJMjkKKyNkZWZpbmUgCVBDSV9BREFQVEVSX1NPRlRXQVJFX1JFU0VUCQkJMzAKKyNkZWZpbmUgRE1BTU9ERTAJCQkweDgwCisjZGVmaW5lIAlMT0NBTF9CVVNfV0lEVEgJCQkJCTAKKyNkZWZpbmUgCUlOVEVSTkFMX1dBSVRfU1RBVEVTCQkJCTIKKyNkZWZpbmUgCVRBX1JFQURZX0lOUFVUX0VOQUJMRQkJCQk2CisjZGVmaW5lIAlMT0NBTF9CVVJTVF9FTkFCTEUJCQkJOAorI2RlZmluZSAJU0NBVFRFUl9HQVRIRVJfTU9ERQkJCQk5CisjZGVmaW5lIAlET05FX0lOVEVSUlVQVF9FTkFCTEUJCQkJMTAKKyNkZWZpbmUgCUxPQ0FMX0FERFJFU1NJTkdfTU9ERQkJCQkxMQorI2RlZmluZSAJREVNQU5EX01PREUJCQkJCTEyCisjZGVmaW5lIAlETUFfRU9UX0VOQUJMRQkJCQkJMTQKKyNkZWZpbmUgCUZBU1RfU0xPV19URVJNSU5BVEVfTU9ERV9TRUxFQ1QJCQkxNQorI2RlZmluZSAJRE1BX0NIQU5ORUxfSU5URVJSVVBUX1NFTEVDVAkJCTE3CisjZGVmaW5lIERNQVBBRFIwCQkJMHg4NAorI2RlZmluZSBETUFMQURSMAkJCTB4ODgKKyNkZWZpbmUgRE1BU0laMAkJCQkweDhjCisjZGVmaW5lIERNQURQUjAJCQkJMHg5MAorI2RlZmluZSAJREVTQ1JJUFRPUl9MT0NBVElPTgkJCQkwCisjZGVmaW5lIAlFTkRfT0ZfQ0hBSU4JCQkJCTEKKyNkZWZpbmUgCUlOVEVSUlVQVF9BRlRFUl9URVJNSU5BTF9DT1VOVAkJCTIKKyNkZWZpbmUgCURJUkVDVElPTl9PRl9UUkFOU0ZFUgkJCQkzCisjZGVmaW5lIERNQUNTUjAJCQkJMHhhOAorI2RlZmluZSAJQ0hBTk5FTF9FTkFCTEUJCQkJCTAKKyNkZWZpbmUgCUNIQU5ORUxfU1RBUlQJCQkJCTEKKyNkZWZpbmUgCUNIQU5ORUxfQUJPUlQJCQkJCTIKKyNkZWZpbmUgCUNIQU5ORUxfQ0xFQVJfSU5URVJSVVBUCQkJCTMKKyNkZWZpbmUgCUNIQU5ORUxfRE9ORQkJCQkJNAorI2RlZmluZSBETUFUSFIJCQkJMHhiMAorI2RlZmluZSBMQlJEMQkJCQkweGY4CisjZGVmaW5lIAlNRU1PUllfU1BBQ0VfTE9DQUxfQlVTX1dJRFRICQkJMAorI2RlZmluZSAJVzhfQklUCQkJCQkJMAorI2RlZmluZSAJVzE2X0JJVAkJCQkJCTEKKworLyogU3BlY2lhbCBPUidpbmcgb2YgSU5UQ1NSIGJpdHMgKi8KKyNkZWZpbmUgTE9DQUxfSU5URVJSVVBUX1RFU1QgXAorCSgoMSA8PCBMT0NBTF9JTlBVVF9JTlRFUlJVUFRfQUNUSVZFKSB8IFwKKwkgKDEgPDwgTE9DQUxfSU5URVJSVVBUX0lOUFVUX0VOQUJMRSkpCisKKyNkZWZpbmUgRE1BX0NIQU5ORUxfMF9URVNUIFwKKwkoKDEgPDwgRE1BX0NIQU5ORUxfMF9JTlRFUlJVUFRfQUNUSVZFKSB8IFwKKwkgKDEgPDwgTE9DQUxfRE1BX0NIQU5ORUxfMF9JTlRFUlJVUFRfRU5BQkxFKSkKKworI2RlZmluZSBETUFfQ0hBTk5FTF8xX1RFU1QgXAorCSgoMSA8PCBETUFfQ0hBTk5FTF8xX0lOVEVSUlVQVF9BQ1RJVkUpIHwgXAorCSAoMSA8PCBMT0NBTF9ETUFfQ0hBTk5FTF8xX0lOVEVSUlVQVF9FTkFCTEUpKQorCisvKiBFUExEIFJlZ2lzdGVycyAqLworI2RlZmluZSBSREtfRVBMRF9JT19SRUdJU1RFUjEJCQkweDAwMDAwMDAwCisjZGVmaW5lIAlSREtfRVBMRF9VU0JfUkVTRVQJCQkwCisjZGVmaW5lIAlSREtfRVBMRF9VU0JfUE9XRVJET1dOCQkJMQorI2RlZmluZSAJUkRLX0VQTERfVVNCX1dBS0VVUAkJCTIKKyNkZWZpbmUgCVJES19FUExEX1VTQl9FT1QJCQkzCisjZGVmaW5lIAlSREtfRVBMRF9EUFBVTEwJCQkJNAorI2RlZmluZSBSREtfRVBMRF9JT19SRUdJU1RFUjIJCQkweDAwMDAwMDA0CisjZGVmaW5lIAlSREtfRVBMRF9CVVNXSURUSAkJCTAKKyNkZWZpbmUgCVJES19FUExEX1VTRVIJCQkJMgorI2RlZmluZSAJUkRLX0VQTERfUkVTRVRfSU5URVJSVVBUX0VOQUJMRQkJMworI2RlZmluZSAJUkRLX0VQTERfRE1BX1RJTUVPVVRfRU5BQkxFCQk0CisjZGVmaW5lIFJES19FUExEX1NUQVRVU19SRUdJU1RFUgkJMHgwMDAwMDAwOAorI2RlZmluZSBSREtfRVBMRF9VU0JfTFJFU0VUCQkJCTAKKyNkZWZpbmUgUkRLX0VQTERfUkVWSVNJT05fUkVHSVNURVIJCTB4MDAwMDAwMGMKKworI2RlZmluZSBFUExEX0lPX0NPTlRST0xfUkVHSVNURVIJCTB4NDAwCisjZGVmaW5lIAlORVQyMjcyX1JFU0VUCQkJCTAKKyNkZWZpbmUgCUJVU1dJRFRICQkJCTEKKyNkZWZpbmUgCU1QWF9NT0RFCQkJCTMKKyNkZWZpbmUgCVVTRVIJCQkJCTQKKyNkZWZpbmUgCURNQV9USU1FT1VUX0VOQUJMRQkJCTUKKyNkZWZpbmUgCURNQV9DVExfREFDSwkJCQk2CisjZGVmaW5lIAlFUExEX0RNQV9FTkFCTEUJCQkJNworI2RlZmluZSBFUExEX0RNQV9DT05UUk9MX1JFR0lTVEVSCQkweDgwMAorI2RlZmluZSAJU1BMSVRfRE1BX01PREUJCQkJMAorI2RlZmluZSAJU1BMSVRfRE1BX0RJUkVDVElPTgkJCTEKKyNkZWZpbmUgCVNQTElUX0RNQV9FTkFCTEUJCQkyCisjZGVmaW5lIAlTUExJVF9ETUFfSU5URVJSVVBUX0VOQUJMRQkJMworI2RlZmluZSAJU1BMSVRfRE1BX0lOVEVSUlVQVAkJCTQKKyNkZWZpbmUgCUVQTERfRE1BX01PREUJCQkJNQorI2RlZmluZSAJRVBMRF9ETUFfQ09OVFJPTExFUl9FTkFCTEUJCTcKKyNkZWZpbmUgU1BMSVRfRE1BX0FERFJFU1NfTE9XCQkJMHhjMDAKKyNkZWZpbmUgU1BMSVRfRE1BX0FERFJFU1NfSElHSAkJCTB4MTAwMAorI2RlZmluZSBTUExJVF9ETUFfQllURV9DT1VOVF9MT1cJCTB4MTQwMAorI2RlZmluZSBTUExJVF9ETUFfQllURV9DT1VOVF9ISUdICQkweDE4MDAKKyNkZWZpbmUgRVBMRF9SRVZJU0lPTl9SRUdJU1RFUgkJCTB4MWMwMAorI2RlZmluZSBTUExJVF9ETUFfUkFNCQkJCTB4NDAwMAorI2RlZmluZSBETUFfUkFNX1NJWkUJCQkJMHgxMDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JESzIJMHgzMjcyCisKKy8qIFBDSS1SREsgdmVyc2lvbiAyIHJlZ2lzdGVycyAqLworCisvKiBNYWluIENvbnRyb2wgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUkRLMl9JUlFFTkIJCQkweDAwCisjZGVmaW5lIFJESzJfSVJRU1RBVAkJCTB4MDQKKyNkZWZpbmUgCVBCNwkJCQkyMworI2RlZmluZSAJUEI2CQkJCTIyCisjZGVmaW5lIAlQQjUJCQkJMjEKKyNkZWZpbmUgCVBCNAkJCQkyMAorI2RlZmluZSAJUEIzCQkJCTE5CisjZGVmaW5lIAlQQjIJCQkJMTgKKyNkZWZpbmUgCVBCMQkJCQkxNworI2RlZmluZSAJUEIwCQkJCTE2CisjZGVmaW5lIAlHUDMJCQkJMjMKKyNkZWZpbmUgCUdQMgkJCQkyMworI2RlZmluZSAJR1AxCQkJCTIzCisjZGVmaW5lIAlHUDAJCQkJMjMKKyNkZWZpbmUgCURNQV9SRVRSWV9BQk9SVAkJCTYKKyNkZWZpbmUgCURNQV9QQVVTRV9ET05FCQkJNQorI2RlZmluZSAJRE1BX0FCT1JUX0RPTkUJCQk0CisjZGVmaW5lIAlETUFfT1VUX0ZJRk9fVFJBTlNGRVJfRE9ORQkzCisjZGVmaW5lIAlETUFfTE9DQUxfRE9ORQkJCTIKKyNkZWZpbmUgCURNQV9QQ0lfRE9ORQkJCTEKKyNkZWZpbmUgCU5FVDIyNzJfUENJX0lSUQkJCTAKKworI2RlZmluZSBSREsyX0xPQ0NUTFJESwkJCTB4MDgKKyNkZWZpbmUgCUNISVBfUkVTRVQJCQkzCisjZGVmaW5lIAlTUExJVF9ETUEJCQkyCisjZGVmaW5lIAlNVUxUSVBMRVhfTU9ERQkJCTEKKyNkZWZpbmUgCUJVU19XSURUSAkJCTAKKworI2RlZmluZSBSREsyX0dQSU9DVEwJCQkweDEwCisjZGVmaW5lIAlHUDNfT1VUX0VOQUJMRQkJCQkJNworI2RlZmluZSAJR1AyX09VVF9FTkFCTEUJCQkJCTYKKyNkZWZpbmUgCUdQMV9PVVRfRU5BQkxFCQkJCQk1CisjZGVmaW5lIAlHUDBfT1VUX0VOQUJMRQkJCQkJNAorI2RlZmluZSAJR1AzX0RBVEEJCQkJCTMKKyNkZWZpbmUgCUdQMl9EQVRBCQkJCQkyCisjZGVmaW5lIAlHUDFfREFUQQkJCQkJMQorI2RlZmluZSAJR1AwX0RBVEEJCQkJCTAKKworI2RlZmluZSBSREsyX0xFRFNXCQkJMHgxNAorI2RlZmluZSAJTEVEMwkJCQkyNworI2RlZmluZSAJTEVEMgkJCQkyNgorI2RlZmluZSAJTEVEMQkJCQkyNQorI2RlZmluZSAJTEVEMAkJCQkyNAorI2RlZmluZSAJUEJVVFRPTgkJCQkxNgorI2RlZmluZSAJRElQU1cJCQkJMAorCisjZGVmaW5lIFJESzJfRElBRwkJCTB4MTgKKyNkZWZpbmUgCVJESzJfRkFTVF9USU1FUwkJCQkyCisjZGVmaW5lIAlGT1JDRV9QQ0lfU0VSUgkJCQkxCisjZGVmaW5lIAlGT1JDRV9QQ0lfSU5UCQkJCTAKKyNkZWZpbmUgUkRLMl9GUEdBUkVWCQkJMHgxQworCisvKiBEbWEgQ29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkRLMl9ETUFDVEwJCQkweDgwCisjZGVmaW5lIAlBRERSX0hPTEQJCQkJMjQKKyNkZWZpbmUgCVJFVFJZX0NPVU5UCQkJCTE2CS8qIDIzOjE2ICovCisjZGVmaW5lIAlGSUZPX1RIUkVTSE9MRAkJCQkxMQkvKiAxNToxMSAqLworI2RlZmluZSAJTUVNX1dSSVRFX0lOVkFMSURBVEUJCQkxMAorI2RlZmluZSAJUkVBRF9NVUxUSVBMRQkJCQk5CisjZGVmaW5lIAlSRUFEX0xJTkUJCQkJOAorI2RlZmluZSAJUkRLMl9ETUFfTU9ERQkJCQk2CS8qIDc6NiAqLworI2RlZmluZSAJQ09OVFJPTF9EQUNLCQkJCTUKKyNkZWZpbmUgCUVPVF9FTkFCTEUJCQkJNAorI2RlZmluZSAJRU9UX1BPTEFSSVRZCQkJCTMKKyNkZWZpbmUgCURBQ0tfUE9MQVJJVFkJCQkJMgorI2RlZmluZSAJRFJFUV9QT0xBUklUWQkJCQkxCisjZGVmaW5lIAlETUFfRU5BQkxFCQkJCTAKKworI2RlZmluZSBSREsyX0RNQVNUQVQJCQkweDg0CisjZGVmaW5lIAlHQVRIRVJfQ09VTlQJCQkJMTIJLyogMTQ6MTIgKi8KKyNkZWZpbmUgCUZJRk9fQ09VTlQJCQkJNgkvKiAxMTo2ICovCisjZGVmaW5lIAlGSUZPX0ZMVVNICQkJCTUKKyNkZWZpbmUgCUZJRk9fVFJBTlNGRVIJCQkJNAorI2RlZmluZSAJUEFVU0VfRE9ORQkJCQkzCisjZGVmaW5lIAlBQk9SVF9ET05FCQkJCTIKKyNkZWZpbmUgCURNQV9BQk9SVAkJCQkxCisjZGVmaW5lIAlETUFfU1RBUlQJCQkJMAorCisjZGVmaW5lIFJESzJfRE1BUENJQ09VTlQJCTB4ODgKKyNkZWZpbmUgCURNQV9ESVJFQ1RJT04JCQkJMzEKKyNkZWZpbmUgCURNQV9QQ0lfQllURV9DT1VOVAkJCTAJLyogMDoyMyAqLworCisjZGVmaW5lIFJESzJfRE1BTE9DQ09VTlQJCTB4OEMJLyogMDoyMyBkbWEgbG9jYWwgYnl0ZSBjb3VudCAqLworCisjZGVmaW5lIFJESzJfRE1BQUREUgkJCTB4OTAJLyogMjozMSBQQ0kgYnVzIHN0YXJ0aW5nIGFkZHJlc3MgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFJFR19JTkRFWEVEX1RIUkVTSE9MRAkoMSA8PCA1KQorCisvKiBEUklWRVIgREFUQSBTVFJVQ1RVUkVTIGFuZCBVVElMSVRJRVMgKi8KK3N0cnVjdCBuZXQyMjcyX2VwIHsKKwlzdHJ1Y3QgdXNiX2VwIGVwOworCXN0cnVjdCBuZXQyMjcyICpkZXY7CisJdW5zaWduZWQgbG9uZyBpcnFzOworCisJLyogYW5hbG9nb3VzIHRvIGEgaG9zdC1zaWRlIHFoICovCisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2M7CisJdW5zaWduZWQgbnVtOjgsCisJICAgICAgICAgZmlmb19zaXplOjEyLAorCSAgICAgICAgIHN0b3BwZWQ6MSwKKwkgICAgICAgICB3ZWRnZWQ6MSwKKwkgICAgICAgICBpc19pbjoxLAorCSAgICAgICAgIGlzX2lzbzoxLAorCSAgICAgICAgIGRtYToxLAorCSAgICAgICAgIG5vdF9lbXB0eToxOworfTsKKworc3RydWN0IG5ldDIyNzIgeworCS8qIGVhY2ggZGV2aWNlIHByb3ZpZGVzIG9uZSBnYWRnZXQsIHNldmVyYWwgZW5kcG9pbnRzICovCisJc3RydWN0IHVzYl9nYWRnZXQgZ2FkZ2V0OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBzaG9ydCBkZXZfaWQ7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IG5ldDIyNzJfZXAgZXBbNF07CisJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXI7CisJdW5zaWduZWQgcHJvdG9jb2xfc3RhbGw6MSwKKwkgICAgICAgICBzb2Z0Y29ubmVjdDoxLAorCSAgICAgICAgIGlzX3NlbGZwb3dlcmVkOjEsCisJICAgICAgICAgd2FrZXVwOjEsCisJICAgICAgICAgZG1hX2VvdF9wb2xhcml0eToxLAorCSAgICAgICAgIGRtYV9kYWNrX3BvbGFyaXR5OjEsCisJICAgICAgICAgZG1hX2RyZXFfcG9sYXJpdHk6MSwKKwkgICAgICAgICBkbWFfYnVzeToxOworCXUxNiBjaGlwcmV2OworCXU4IHBhZ2VzZWw7CisKKwl1bnNpZ25lZCBpbnQgaXJxOworCXVuc2lnbmVkIHNob3J0IGZpZm9fbW9kZTsKKworCXVuc2lnbmVkIGludCBiYXNlX3NoaWZ0OworCXUxNiBfX2lvbWVtICpiYXNlX2FkZHI7CisJdW5pb24geworI2lmZGVmIENPTkZJR19QQ0kKKwkJc3RydWN0IHsKKwkJCXZvaWQgX19pb21lbSAqcGx4OTA1NF9iYXNlX2FkZHI7CisJCQl2b2lkIF9faW9tZW0gKmVwbGRfYmFzZV9hZGRyOworCQl9IHJkazE7CisJCXN0cnVjdCB7CisJCQkvKiBCYXIwLCBCYXIxIGlzIGJhc2VfYWRkciBib3RoIG1lbS1tYXBwZWQgKi8KKwkJCXZvaWQgX19pb21lbSAqZnBnYV9iYXNlX2FkZHI7CisJCX0gcmRrMjsKKyNlbmRpZgorCX07Cit9OworCitzdGF0aWMgdm9pZCBfX2lvbWVtICoKK25ldDIyNzJfcmVnX2FkZHIoc3RydWN0IG5ldDIyNzIgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlyZXR1cm4gZGV2LT5iYXNlX2FkZHIgKyAocmVnIDw8IGRldi0+YmFzZV9zaGlmdCk7Cit9CisKK3N0YXRpYyB2b2lkCituZXQyMjcyX3dyaXRlKHN0cnVjdCBuZXQyMjcyICpkZXYsIHVuc2lnbmVkIGludCByZWcsIHU4IHZhbHVlKQoreworCWlmIChyZWcgPj0gUkVHX0lOREVYRURfVEhSRVNIT0xEKSB7CisJCS8qCisJCSAqIEluZGV4ZWQgcmVnaXN0ZXI7IHVzZSBSRUdBRERSUFRSL1JFR0RBVEEKKwkJICogIC0gU2F2ZSBhbmQgcmVzdG9yZSBSRUdBRERSUFRSLiBUaGlzIHByZXZlbnRzIFJFR0FERFJQVFIgZnJvbQorCQkgKiAgICBjaGFuZ2VzIGJldHdlZW4gb3RoZXIgY29kZSBzZWN0aW9ucywgYnV0IGl0IGlzIHRpbWUgY29uc3VtaW5nLgorCQkgKiAgLSBQZXJmb3JtYW5jZSB0aXBzOiBlaXRoZXIgZG8gbm90IHNhdmUgYW5kIHJlc3RvcmUgUkVHQUREUlBUUiAoaWYgaXQKKwkJICogICAgaXMgc2FmZSkgb3IgZG8gc2F2ZS9yZXN0b3JlIG9wZXJhdGlvbnMgb25seSBpbiBjcml0aWNhbCBzZWN0aW9ucy4KKwkJdTggdG1wID0gcmVhZGIoZGV2LT5iYXNlX2FkZHIgKyBSRUdBRERSUFRSKTsKKwkJICovCisJCXdyaXRlYigodTgpcmVnLCBuZXQyMjcyX3JlZ19hZGRyKGRldiwgUkVHQUREUlBUUikpOworCQl3cml0ZWIodmFsdWUsIG5ldDIyNzJfcmVnX2FkZHIoZGV2LCBSRUdEQVRBKSk7CisJCS8qIHdyaXRlYih0bXAsIG5ldDIyNzJfcmVnX2FkZHIoZGV2LCBSRUdBRERSUFRSKSk7ICovCisJfSBlbHNlCisJCXdyaXRlYih2YWx1ZSwgbmV0MjI3Ml9yZWdfYWRkcihkZXYsIHJlZykpOworfQorCitzdGF0aWMgdTgKK25ldDIyNzJfcmVhZChzdHJ1Y3QgbmV0MjI3MiAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXU4IHJldDsKKworCWlmIChyZWcgPj0gUkVHX0lOREVYRURfVEhSRVNIT0xEKSB7CisJCS8qCisJCSAqIEluZGV4ZWQgcmVnaXN0ZXI7IHVzZSBSRUdBRERSUFRSL1JFR0RBVEEKKwkJICogIC0gU2F2ZSBhbmQgcmVzdG9yZSBSRUdBRERSUFRSLiBUaGlzIHByZXZlbnRzIFJFR0FERFJQVFIgZnJvbQorCQkgKiAgICBjaGFuZ2VzIGJldHdlZW4gb3RoZXIgY29kZSBzZWN0aW9ucywgYnV0IGl0IGlzIHRpbWUgY29uc3VtaW5nLgorCQkgKiAgLSBQZXJmb3JtYW5jZSB0aXBzOiBlaXRoZXIgZG8gbm90IHNhdmUgYW5kIHJlc3RvcmUgUkVHQUREUlBUUiAoaWYgaXQKKwkJICogICAgaXMgc2FmZSkgb3IgZG8gc2F2ZS9yZXN0b3JlIG9wZXJhdGlvbnMgb25seSBpbiBjcml0aWNhbCBzZWN0aW9ucy4KKwkJdTggdG1wID0gcmVhZGIoZGV2LT5iYXNlX2FkZHIgKyBSRUdBRERSUFRSKTsKKwkJICovCisJCXdyaXRlYigodTgpcmVnLCBuZXQyMjcyX3JlZ19hZGRyKGRldiwgUkVHQUREUlBUUikpOworCQlyZXQgPSByZWFkYihuZXQyMjcyX3JlZ19hZGRyKGRldiwgUkVHREFUQSkpOworCQkvKiB3cml0ZWIodG1wLCBuZXQyMjcyX3JlZ19hZGRyKGRldiwgUkVHQUREUlBUUikpOyAqLworCX0gZWxzZQorCQlyZXQgPSByZWFkYihuZXQyMjcyX3JlZ19hZGRyKGRldiwgcmVnKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorbmV0MjI3Ml9lcF93cml0ZShzdHJ1Y3QgbmV0MjI3Ml9lcCAqZXAsIHVuc2lnbmVkIGludCByZWcsIHU4IHZhbHVlKQoreworCXN0cnVjdCBuZXQyMjcyICpkZXYgPSBlcC0+ZGV2OworCisJaWYgKGRldi0+cGFnZXNlbCAhPSBlcC0+bnVtKSB7CisJCW5ldDIyNzJfd3JpdGUoZGV2LCBQQUdFU0VMLCBlcC0+bnVtKTsKKwkJZGV2LT5wYWdlc2VsID0gZXAtPm51bTsKKwl9CisJbmV0MjI3Ml93cml0ZShkZXYsIHJlZywgdmFsdWUpOworfQorCitzdGF0aWMgdTgKK25ldDIyNzJfZXBfcmVhZChzdHJ1Y3QgbmV0MjI3Ml9lcCAqZXAsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3RydWN0IG5ldDIyNzIgKmRldiA9IGVwLT5kZXY7CisKKwlpZiAoZGV2LT5wYWdlc2VsICE9IGVwLT5udW0pIHsKKwkJbmV0MjI3Ml93cml0ZShkZXYsIFBBR0VTRUwsIGVwLT5udW0pOworCQlkZXYtPnBhZ2VzZWwgPSBlcC0+bnVtOworCX0KKwlyZXR1cm4gbmV0MjI3Ml9yZWFkKGRldiwgcmVnKTsKK30KKworc3RhdGljIHZvaWQgYWxsb3dfc3RhdHVzKHN0cnVjdCBuZXQyMjcyX2VwICplcCkKK3sKKwkvKiBlcDAgb25seSAqLworCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX1JTUENMUiwKKwkJKDEgPDwgQ09OVFJPTF9TVEFUVVNfUEhBU0VfSEFORFNIQUtFKSB8CisJCSgxIDw8IEFMVF9OQUtfT1VUX1BBQ0tFVFMpIHwKKwkJKDEgPDwgTkFLX09VVF9QQUNLRVRTX01PREUpKTsKKwllcC0+c3RvcHBlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9oYWx0KHN0cnVjdCBuZXQyMjcyX2VwICplcCkKK3sKKwkvKiBlcDAgYW5kIGJ1bGsvaW50ciBlbmRwb2ludHMgKi8KKwluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9SU1BDTFIsIDEgPDwgQ09OVFJPTF9TVEFUVVNfUEhBU0VfSEFORFNIQUtFKTsKKwluZXQyMjcyX2VwX3dyaXRlKGVwLCBFUF9SU1BTRVQsIDEgPDwgRU5EUE9JTlRfSEFMVCk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2hhbHQoc3RydWN0IG5ldDIyNzJfZXAgKmVwKQoreworCS8qIGVwMCBhbmQgYnVsay9pbnRyIGVuZHBvaW50cyAqLworCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX1JTUENMUiwKKwkJKDEgPDwgRU5EUE9JTlRfSEFMVCkgfCAoMSA8PCBFTkRQT0lOVF9UT0dHTEUpKTsKK30KKworLyogY291bnQgKDw9IDQpIGJ5dGVzIGluIHRoZSBuZXh0IGZpZm8gd3JpdGUgd2lsbCBiZSB2YWxpZCAqLworc3RhdGljIHZvaWQgc2V0X2ZpZm9fYnl0ZWNvdW50KHN0cnVjdCBuZXQyMjcyX2VwICplcCwgdW5zaWduZWQgY291bnQpCit7CisJLyogbmV0MjI3Ml9lcF93cml0ZSB3aWxsIHRydW5jYXRlIHRvIHU4IGZvciB1cyAqLworCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX1RSQU5TRkVSMiwgY291bnQgPj4gMTYpOworCW5ldDIyNzJfZXBfd3JpdGUoZXAsIEVQX1RSQU5TRkVSMSwgY291bnQgPj4gOCk7CisJbmV0MjI3Ml9lcF93cml0ZShlcCwgRVBfVFJBTlNGRVIwLCBjb3VudCk7Cit9CisKK3N0cnVjdCBuZXQyMjcyX3JlcXVlc3QgeworCXN0cnVjdCB1c2JfcmVxdWVzdCByZXE7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwl1bnNpZ25lZCBtYXBwZWQ6MSwKKwkgICAgICAgICB2YWxpZDoxOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYwppbmRleCAyNDY5NmY3Li4zZGQ0MGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKQEAgLTYzLDYgKzYzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0xNDA5LDExICsxNDEwLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbmV0MjI4MF9zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKKwkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpOworc3RhdGljIGludCBuZXQyMjgwX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9nYWRnZXRfb3BzIG5ldDIyODBfb3BzID0gewogCS5nZXRfZnJhbWUJPSBuZXQyMjgwX2dldF9mcmFtZSwKIAkud2FrZXVwCQk9IG5ldDIyODBfd2FrZXVwLAogCS5zZXRfc2VsZnBvd2VyZWQgPSBuZXQyMjgwX3NldF9zZWxmcG93ZXJlZCwKIAkucHVsbHVwCQk9IG5ldDIyODBfcHVsbHVwLAorCS5zdGFydAkJPSBuZXQyMjgwX3N0YXJ0LAorCS5zdG9wCQk9IG5ldDIyODBfc3RvcCwKIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xNzM3LDYyICsxNzQ0LDYgQEAKIAlsaXN0X2FkZF90YWlsICgmZGV2LT5lcCBbNl0uZXAuZXBfbGlzdCwgJmRldi0+Z2FkZ2V0LmVwX2xpc3QpOwogfQogCi0vKiBqdXN0IGRlY2xhcmUgdGhpcyBpbiBhbnkgZHJpdmVyIHRoYXQgcmVhbGx5IG5lZWQgaXQgKi8KLWV4dGVybiBpbnQgbmV0MjI4MF9zZXRfZmlmb19tb2RlIChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBpbnQgbW9kZSk7Ci0KLS8qKgotICogbmV0MjI4MF9zZXRfZmlmb19tb2RlIC0gY2hhbmdlIGFsbG9jYXRpb24gb2YgZmlmbyBidWZmZXJzCi0gKiBAZ2FkZ2V0OiBhY2Nlc3MgdG8gdGhlIG5ldDIyODAgZGV2aWNlIHRoYXQgd2lsbCBiZSB1cGRhdGVkCi0gKiBAbW9kZTogMCBmb3IgZGVmYXVsdCwgZm91ciAxa0IgYnVmZmVycyAoZXAtYSB0aHJvdWdoIGVwLWQpOwotICoJMSBmb3IgdHdvIDJrQiBidWZmZXJzIChlcC1hIGFuZCBlcC1iIG9ubHkpOwotICoJMiBmb3Igb25lIDJrQiBidWZmZXIgKGVwLWEpIGFuZCB0d28gMWtCIG9uZXMgKGVwLWIsIGVwLWMpLgotICoKLSAqIHJldHVybnMgemVybyBvbiBzdWNjZXNzLCBlbHNlIG5lZ2F0aXZlIGVycm5vLiAgd2hlbiB0aGlzIHN1Y2NlZWRzLAotICogdGhlIGNvbnRlbnRzIG9mIGdhZGdldC0+ZXBfbGlzdCBtYXkgaGF2ZSBjaGFuZ2VkLgotICoKLSAqIHlvdSBtYXkgb25seSBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiBlbmRwb2ludHMgYS1kIGFyZSBhbGwgZGlzYWJsZWQuCi0gKiB1c2UgaXQgd2hlbmV2ZXIgZXh0cmEgaGFyZHdhcmUgYnVmZmVyaW5nIGNhbiBoZWxwIHBlcmZvcm1hbmNlLCBzdWNoCi0gKiBhcyBiZWZvcmUgZW5hYmxpbmcgImhpZ2ggYmFuZHdpZHRoIiBpbnRlcnJ1cHQgZW5kcG9pbnRzIHRoYXQgdXNlCi0gKiBtYXhwYWNrZXQgYmlnZ2VyIHRoYW4gNTEyICh3aGVuIGRvdWJsZSBidWZmZXJpbmcgd291bGQgb3RoZXJ3aXNlCi0gKiBiZSB1bmF2YWlsYWJsZSkuCi0gKi8KLWludCBuZXQyMjgwX3NldF9maWZvX21vZGUgKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsIGludCBtb2RlKQotewotCWludAkJCWk7Ci0Jc3RydWN0IG5ldDIyODAJCSpkZXY7Ci0JaW50CQkJc3RhdHVzID0gMDsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCWlmICghZ2FkZ2V0KQotCQlyZXR1cm4gLUVOT0RFVjsKLQlkZXYgPSBjb250YWluZXJfb2YgKGdhZGdldCwgc3RydWN0IG5ldDIyODAsIGdhZGdldCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSAoJmRldi0+bG9jaywgZmxhZ3MpOwotCi0JZm9yIChpID0gMTsgaSA8PSA0OyBpKyspCi0JCWlmIChkZXYtPmVwIFtpXS5kZXNjKSB7Ci0JCQlzdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQlpZiAobW9kZSA8IDAgfHwgbW9kZSA+IDIpCi0JCXN0YXR1cyA9IC1FSU5WQUw7Ci0JaWYgKHN0YXR1cyA9PSAwKQotCQlzZXRfZmlmb19tb2RlIChkZXYsIG1vZGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChzdGF0dXMgPT0gMCkgewotCQlpZiAobW9kZSA9PSAxKQotCQkJREVCVUcgKGRldiwgImZpZm86ICBlcC1hIDJLLCBlcC1iIDJLXG4iKTsKLQkJZWxzZSBpZiAobW9kZSA9PSAyKQotCQkJREVCVUcgKGRldiwgImZpZm86ICBlcC1hIDJLLCBlcC1iIDFLLCBlcC1jIDFLXG4iKTsKLQkJLyogZWxzZSBhbGwgYXJlIDFLICovCi0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci1FWFBPUlRfU1lNQk9MIChuZXQyMjgwX3NldF9maWZvX21vZGUpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCiAvKiBrZWVwaW5nIGl0IHNpbXBsZToKICAqIC0gb25lIGJ1cyBkcml2ZXIsIGluaXR0ZWQgZmlyc3Q7CiAgKiAtIG9uZSBmdW5jdGlvbiBkcml2ZXIsIGluaXR0ZWQgc2Vjb25kCkBAIC0xOTI5LDcgKzE4ODAsNyBAQAogICogZGlzY29ubmVjdCBpcyByZXBvcnRlZC4gIHRoZW4gYSBob3N0IG1heSBjb25uZWN0IGFnYWluLCBvcgogICogdGhlIGRyaXZlciBtaWdodCBnZXQgdW5ib3VuZC4KICAqLwotaW50IHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorc3RhdGljIGludCBuZXQyMjgwX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAogCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKIHsKIAlzdHJ1Y3QgbmV0MjI4MAkJKmRldiA9IHRoZV9jb250cm9sbGVyOwpAQCAtMTk5Myw3ICsxOTQ0LDYgQEAKIAlkZXYtPmRyaXZlciA9IE5VTEw7CiAJcmV0dXJuIHJldHZhbDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOwogCiBzdGF0aWMgdm9pZAogc3RvcF9hY3Rpdml0eSAoc3RydWN0IG5ldDIyODAgKmRldiwgc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCkBAIC0yMDIxLDcgKzE5NzEsNyBAQAogCXVzYl9yZWluaXQgKGRldik7CiB9CiAKLWludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyIChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3N0YXRpYyBpbnQgbmV0MjI4MF9zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQogewogCXN0cnVjdCBuZXQyMjgwCSpkZXYgPSB0aGVfY29udHJvbGxlcjsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwpAQCAtMjA0OCw4ICsxOTk4LDYgQEAKIAlERUJVRyAoZGV2LCAidW5yZWdpc3RlcmVkIGRyaXZlciAnJXMnXG4iLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wgKHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIpOwotCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTI3MzEsNiArMjY3OSw4IEBACiB7CiAJc3RydWN0IG5ldDIyODAJCSpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOwogCisJdXNiX2RlbF9nYWRnZXRfdWRjKCZkZXYtPmdhZGdldCk7CisKIAlCVUdfT04oZGV2LT5kcml2ZXIpOwogCiAJLyogdGhlbiBjbGVhbiB1cCB0aGUgcmVzb3VyY2VzIHdlIGFsbG9jYXRlZCBkdXJpbmcgcHJvYmUoKSAqLwpAQCAtMjkxNSw2ICsyODY1LDkgQEAKIAlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUgKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9yZWdpc3RlcnMpOwogCWlmIChyZXR2YWwpIGdvdG8gZG9uZTsKIAorCXJldHZhbCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmcGRldi0+ZGV2LCAmZGV2LT5nYWRnZXQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZG9uZTsKIAlyZXR1cm4gMDsKIAogZG9uZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9ub2tpYS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25va2lhLmMKaW5kZXggNTVjYTYzYS4uYzdmYjc3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L25va2lhLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25va2lhLmMKQEAgLTI0MSw2ICsyNDEsNyBAQAogCS5uYW1lCQk9ICJnX25va2lhIiwKIAkuZGV2CQk9ICZkZXZpY2VfZGVzYywKIAkuc3RyaW5ncwk9IGRldl9zdHJpbmdzLAorCS5tYXhfc3BlZWQJPSBVU0JfU1BFRURfSElHSCwKIAkudW5iaW5kCQk9IF9fZXhpdF9wKG5va2lhX3VuYmluZCksCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCmluZGV4IDgyZmQyNDkuLjc0MGM3ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCkBAIC0xMzc1LDYgKzEzNzUsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvbWFwX3VkY19zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKKwkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpOworc3RhdGljIGludCBvbWFwX3VkY19zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKTsKKwogc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBvbWFwX2dhZGdldF9vcHMgPSB7CiAJLmdldF9mcmFtZQkJPSBvbWFwX2dldF9mcmFtZSwKIAkud2FrZXVwCQkJPSBvbWFwX3dha2V1cCwKQEAgLTEzODIsNiArMTM4Niw4IEBACiAJLnZidXNfc2Vzc2lvbgkJPSBvbWFwX3ZidXNfc2Vzc2lvbiwKIAkudmJ1c19kcmF3CQk9IG9tYXBfdmJ1c19kcmF3LAogCS5wdWxsdXAJCQk9IG9tYXBfcHVsbHVwLAorCS5zdGFydAkJCT0gb21hcF91ZGNfc3RhcnQsCisJLnN0b3AJCQk9IG9tYXBfdWRjX3N0b3AsCiB9OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjEwMiw3ICsyMTA4LDcgQEAKIAkJKTsKIH0KIAotaW50IHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorc3RhdGljIGludCBvbWFwX3VkY19zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKIAkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpCiB7CiAJaW50CQlzdGF0dXMgPSAtRU5PREVWOwpAQCAtMjE4Niw5ICsyMTkyLDggQEAKIAkJb21hcF91ZGNfZW5hYmxlX2Nsb2NrKDApOwogCXJldHVybiBzdGF0dXM7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKTsKIAotaW50IHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIgKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQorc3RhdGljIGludCBvbWFwX3VkY19zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQogewogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJaW50CQlzdGF0dXMgPSAtRU5PREVWOwpAQCAtMjIyMiw4ICsyMjI3LDYgQEAKIAlEQkcoInVucmVnaXN0ZXJlZCBkcml2ZXIgJyVzJ1xuIiwgZHJpdmVyLT5kcml2ZXIubmFtZSk7CiAJcmV0dXJuIHN0YXR1czsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7Ci0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMjk5MSw5ICsyOTk0LDE2IEBACiAKIAljcmVhdGVfcHJvY19maWxlKCk7CiAJc3RhdHVzID0gZGV2aWNlX2FkZCgmdWRjLT5nYWRnZXQuZGV2KTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGNsZWFudXA0OworCisJc3RhdHVzID0gdXNiX2FkZF9nYWRnZXRfdWRjKCZwZGV2LT5kZXYsICZ1ZGMtPmdhZGdldCk7CiAJaWYgKCFzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7CiAJLyogSWYgZmFpbCwgZmFsbCB0aHJvdWdoICovCitjbGVhbnVwNDoKKwlyZW1vdmVfcHJvY19maWxlKCk7CisKICNpZmRlZglVU0VfSVNPCiBjbGVhbnVwMzoKIAlmcmVlX2lycShwZGV2LT5yZXNvdXJjZVsyXS5zdGFydCwgdWRjKTsKQEAgLTMwMjksNiArMzAzOSw4IEBACiAKIAlpZiAoIXVkYykKIAkJcmV0dXJuIC1FTk9ERVY7CisKKwl1c2JfZGVsX2dhZGdldF91ZGMoJnVkYy0+Z2FkZ2V0KTsKIAlpZiAodWRjLT5kcml2ZXIpCiAJCXJldHVybiAtRUJVU1k7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9wY2hfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcGNoX3VkYy5jCmluZGV4IDY4ZGJjYzMuLmY5NjYxNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9wY2hfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3BjaF91ZGMuYwpAQCAtMTE3Niw2ICsxMTc2LDkgQEAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKK3N0YXRpYyBpbnQgcGNoX3VkY19zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKKwlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSk7CitzdGF0aWMgaW50IHBjaF91ZGNfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcik7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9nYWRnZXRfb3BzIHBjaF91ZGNfb3BzID0gewogCS5nZXRfZnJhbWUgPSBwY2hfdWRjX3BjZF9nZXRfZnJhbWUsCiAJLndha2V1cCA9IHBjaF91ZGNfcGNkX3dha2V1cCwKQEAgLTExODMsNiArMTE4Niw4IEBACiAJLnB1bGx1cCA9IHBjaF91ZGNfcGNkX3B1bGx1cCwKIAkudmJ1c19zZXNzaW9uID0gcGNoX3VkY19wY2RfdmJ1c19zZXNzaW9uLAogCS52YnVzX2RyYXcgPSBwY2hfdWRjX3BjZF92YnVzX2RyYXcsCisJLnN0YXJ0CT0gcGNoX3VkY19zdGFydCwKKwkuc3RvcAk9IHBjaF91ZGNfc3RvcCwKIH07CiAKIC8qKgpAQCAtMjY5MCw3ICsyNjk1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorc3RhdGljIGludCBwY2hfdWRjX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAogCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKQogewogCXN0cnVjdCBwY2hfdWRjX2RldgkqZGV2ID0gcGNoX3VkYzsKQEAgLTI3MzMsOSArMjczOCw4IEBACiAJZGV2LT5jb25uZWN0ZWQgPSAxOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcik7CiAKLWludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQorc3RhdGljIGludCBwY2hfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IHBjaF91ZGNfZGV2CSpkZXYgPSBwY2hfdWRjOwogCkBAIC0yNzYxLDcgKzI3NjUsNiBAQAogCXBjaF91ZGNfc2V0X2Rpc2Nvbm5lY3QoZGV2KTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7CiAKIHN0YXRpYyB2b2lkIHBjaF91ZGNfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CkBAIC0yNzc4LDYgKzI3ODEsOCBAQAogewogCXN0cnVjdCBwY2hfdWRjX2RldgkqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCisJdXNiX2RlbF9nYWRnZXRfdWRjKCZkZXYtPmdhZGdldCk7CisKIAkvKiBnYWRnZXQgZHJpdmVyIG11c3Qgbm90IGJlIHJlZ2lzdGVyZWQgKi8KIAlpZiAoZGV2LT5kcml2ZXIpCiAJCWRldl9lcnIoJnBkZXYtPmRldiwKQEAgLTI5NTMsNiArMjk1OCw5IEBACiAKIAkvKiBQdXQgdGhlIGRldmljZSBpbiBkaXNjb25uZWN0ZWQgc3RhdGUgdGlsbCBhIGRyaXZlciBpcyBib3VuZCAqLwogCXBjaF91ZGNfc2V0X2Rpc2Nvbm5lY3QoZGV2KTsKKwlyZXR2YWwgPSB1c2JfYWRkX2dhZGdldF91ZGMoJnBkZXYtPmRldiwgJmRldi0+Z2FkZ2V0KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZpbmlzaGVkOwogCXJldHVybiAwOwogCiBmaW5pc2hlZDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHJpbnRlci5jCmluZGV4IDI3MWVmOTQuLmEzNDFkZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYwpAQCAtODksOCArODksNyBAQAogCXU4CQkJY29uZmlnOwogCXM4CQkJaW50ZXJmYWNlOwogCXN0cnVjdCB1c2JfZXAJCSppbl9lcCwgKm91dF9lcDsKLQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IKLQkJCQkqaW4sICpvdXQ7CisKIAlzdHJ1Y3QgbGlzdF9oZWFkCXJ4X3JlcXM7CS8qIExpc3Qgb2YgZnJlZSBSWCBzdHJ1Y3RzICovCiAJc3RydWN0IGxpc3RfaGVhZAlyeF9yZXFzX2FjdGl2ZTsJLyogTGlzdCBvZiBBY3RpdmUgUlggeGZlcnMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXJ4X2J1ZmZlcnM7CS8qIExpc3Qgb2YgY29tcGxldGVkIHhmZXJzICovCkBAIC03OTUsMTIgKzc5NCwxNCBAQAogfQogCiBzdGF0aWMgaW50Ci1wcmludGVyX2ZzeW5jKHN0cnVjdCBmaWxlICpmZCwgaW50IGRhdGFzeW5jKQorcHJpbnRlcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmQsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBwcmludGVyX2RldgkqZGV2ID0gZmQtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmQtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJaW50CQkJdHhfbGlzdF9lbXB0eTsKIAorCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CiAJdHhfbGlzdF9lbXB0eSA9IChsaWtlbHkobGlzdF9lbXB0eSgmZGV2LT50eF9yZXFzKSkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwpAQCAtODEwLDYgKzgxMSw3IEBACiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPnR4X2ZsdXNoX3dhaXQsCiAJCQkJKGxpa2VseShsaXN0X2VtcHR5KCZkZXYtPnR4X3JlcXNfYWN0aXZlKSkpKTsKIAl9CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg5NSwxOSArODk3LDIwIEBACiB7CiAJaW50CQkJcmVzdWx0ID0gMDsKIAotCWRldi0+aW4gPSBlcF9kZXNjKGRldi0+Z2FkZ2V0LCAmaHNfZXBfaW5fZGVzYywgJmZzX2VwX2luX2Rlc2MpOworCWRldi0+aW5fZXAtPmRlc2MgPSBlcF9kZXNjKGRldi0+Z2FkZ2V0LCAmaHNfZXBfaW5fZGVzYywgJmZzX2VwX2luX2Rlc2MpOwogCWRldi0+aW5fZXAtPmRyaXZlcl9kYXRhID0gZGV2OwogCi0JZGV2LT5vdXQgPSBlcF9kZXNjKGRldi0+Z2FkZ2V0LCAmaHNfZXBfb3V0X2Rlc2MsICZmc19lcF9vdXRfZGVzYyk7CisJZGV2LT5vdXRfZXAtPmRlc2MgPSBlcF9kZXNjKGRldi0+Z2FkZ2V0LCAmaHNfZXBfb3V0X2Rlc2MsCisJCQkJICAgICZmc19lcF9vdXRfZGVzYyk7CiAJZGV2LT5vdXRfZXAtPmRyaXZlcl9kYXRhID0gZGV2OwogCi0JcmVzdWx0ID0gdXNiX2VwX2VuYWJsZShkZXYtPmluX2VwLCBkZXYtPmluKTsKKwlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlKGRldi0+aW5fZXApOwogCWlmIChyZXN1bHQgIT0gMCkgewogCQlEQkcoZGV2LCAiZW5hYmxlICVzIC0tPiAlZFxuIiwgZGV2LT5pbl9lcC0+bmFtZSwgcmVzdWx0KTsKIAkJZ290byBkb25lOwogCX0KIAotCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUoZGV2LT5vdXRfZXAsIGRldi0+b3V0KTsKKwlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlKGRldi0+b3V0X2VwKTsKIAlpZiAocmVzdWx0ICE9IDApIHsKIAkJREJHKGRldiwgImVuYWJsZSAlcyAtLT4gJWRcbiIsIGRldi0+aW5fZXAtPm5hbWUsIHJlc3VsdCk7CiAJCWdvdG8gZG9uZTsKQEAgLTkxOCw4ICs5MjEsOCBAQAogCWlmIChyZXN1bHQgIT0gMCkgewogCQkodm9pZCkgdXNiX2VwX2Rpc2FibGUoZGV2LT5pbl9lcCk7CiAJCSh2b2lkKSB1c2JfZXBfZGlzYWJsZShkZXYtPm91dF9lcCk7Ci0JCWRldi0+aW4gPSBOVUxMOwotCQlkZXYtPm91dCA9IE5VTEw7CisJCWRldi0+aW5fZXAtPmRlc2MgPSBOVUxMOworCQlkZXYtPm91dF9lcC0+ZGVzYyA9IE5VTEw7CiAJfQogCiAJLyogY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbGVhbnVwIG9uIGVycm9yICovCkBAIC05MzMsMTIgKzkzNiwxNCBAQAogCiAJREJHKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoZGV2LT5pbikKKwlpZiAoZGV2LT5pbl9lcC0+ZGVzYykKIAkJdXNiX2VwX2Rpc2FibGUoZGV2LT5pbl9lcCk7CiAKLQlpZiAoZGV2LT5vdXQpCisJaWYgKGRldi0+b3V0X2VwLT5kZXNjKQogCQl1c2JfZXBfZGlzYWJsZShkZXYtPm91dF9lcCk7CiAKKwlkZXYtPmluX2VwLT5kZXNjID0gTlVMTDsKKwlkZXYtPm91dF9lcC0+ZGVzYyA9IE5VTEw7CiAJZGV2LT5pbnRlcmZhY2UgPSAtMTsKIH0KIApAQCAtMTEwNCw5ICsxMTA5LDkgQEAKIAkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+dHhfcmVxcyk7CiAJfQogCi0JaWYgKHVzYl9lcF9lbmFibGUoZGV2LT5pbl9lcCwgZGV2LT5pbikpCisJaWYgKHVzYl9lcF9lbmFibGUoZGV2LT5pbl9lcCkpCiAJCURCRyhkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFVTQiBpbl9lcFxuIik7Ci0JaWYgKHVzYl9lcF9lbmFibGUoZGV2LT5vdXRfZXAsIGRldi0+b3V0KSkKKwlpZiAodXNiX2VwX2VuYWJsZShkZXYtPm91dF9lcCkpCiAJCURCRyhkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFVTQiBvdXRfZXBcbiIpOwogCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJ4X3dhaXQpOwpAQCAtMTE0Niw2ICsxMTUxLDggQEAKIAkJCXN3aXRjaCAod1ZhbHVlID4+IDgpIHsKIAogCQkJY2FzZSBVU0JfRFRfREVWSUNFOgorCQkJCWRldmljZV9kZXNjLmJNYXhQYWNrZXRTaXplMCA9CisJCQkJCWdhZGdldC0+ZXAwLT5tYXhwYWNrZXQ7CiAJCQkJdmFsdWUgPSBtaW4od0xlbmd0aCwgKHUxNikgc2l6ZW9mIGRldmljZV9kZXNjKTsKIAkJCQltZW1jcHkocmVxLT5idWYsICZkZXZpY2VfZGVzYywgdmFsdWUpOwogCQkJCWJyZWFrOwpAQCAtMTE1Myw2ICsxMTYwLDEyIEBACiAJCQljYXNlIFVTQl9EVF9ERVZJQ0VfUVVBTElGSUVSOgogCQkJCWlmICghZ2FkZ2V0LT5pc19kdWFsc3BlZWQpCiAJCQkJCWJyZWFrOworCQkJCS8qCisJCQkJICogYXNzdW1lcyBlcDAgdXNlcyB0aGUgc2FtZSB2YWx1ZSBmb3IgYm90aAorCQkJCSAqIHNwZWVkcworCQkJCSAqLworCQkJCWRldl9xdWFsaWZpZXIuYk1heFBhY2tldFNpemUwID0KKwkJCQkJZ2FkZ2V0LT5lcDAtPm1heHBhY2tldDsKIAkJCQl2YWx1ZSA9IG1pbih3TGVuZ3RoLAogCQkJCQkJKHUxNikgc2l6ZW9mIGRldl9xdWFsaWZpZXIpOwogCQkJCW1lbWNweShyZXEtPmJ1ZiwgJmRldl9xdWFsaWZpZXIsIHZhbHVlKTsKQEAgLTE0NDgsMTUgKzE0NjEsMTEgQEAKIAlvdXRfZXAtPmRyaXZlcl9kYXRhID0gb3V0X2VwOwkvKiBjbGFpbSAqLwogCiAjaWZkZWYJQ09ORklHX1VTQl9HQURHRVRfRFVBTFNQRUVECi0JLyogYXNzdW1lcyBlcDAgdXNlcyB0aGUgc2FtZSB2YWx1ZSBmb3IgYm90aCBzcGVlZHMgLi4uICovCi0JZGV2X3F1YWxpZmllci5iTWF4UGFja2V0U2l6ZTAgPSBkZXZpY2VfZGVzYy5iTWF4UGFja2V0U2l6ZTA7Ci0KLQkvKiBhbmQgdGhhdCBhbGwgZW5kcG9pbnRzIGFyZSBkdWFsLXNwZWVkICovCisJLyogYXNzdW1lcyB0aGF0IGFsbCBlbmRwb2ludHMgYXJlIGR1YWwtc3BlZWQgKi8KIAloc19lcF9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPSBmc19lcF9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CiAJaHNfZXBfb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9IGZzX2VwX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CiAjZW5kaWYJLyogRFVBTFNQRUVEICovCiAKLQlkZXZpY2VfZGVzYy5iTWF4UGFja2V0U2l6ZTAgPSBnYWRnZXQtPmVwMC0+bWF4cGFja2V0OwogCXVzYl9nYWRnZXRfc2V0X3NlbGZwb3dlcmVkKGdhZGdldCk7CiAKIAlpZiAoZ2FkZ2V0LT5pc19vdGcpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyNXhfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjV4X3VkYy5jCmluZGV4IDM2NWMwMmYuLmU0ZTU5YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyNXhfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI1eF91ZGMuYwpAQCAtMTAxMSwxMiArMTAxMSwxOCBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAorc3RhdGljIGludCBweGEyNXhfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCisJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKTsKK3N0YXRpYyBpbnQgcHhhMjV4X3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9nYWRnZXRfb3BzIHB4YTI1eF91ZGNfb3BzID0gewogCS5nZXRfZnJhbWUJPSBweGEyNXhfdWRjX2dldF9mcmFtZSwKIAkud2FrZXVwCQk9IHB4YTI1eF91ZGNfd2FrZXVwLAogCS52YnVzX3Nlc3Npb24JPSBweGEyNXhfdWRjX3ZidXNfc2Vzc2lvbiwKIAkucHVsbHVwCQk9IHB4YTI1eF91ZGNfcHVsbHVwLAogCS52YnVzX2RyYXcJPSBweGEyNXhfdWRjX3ZidXNfZHJhdywKKwkuc3RhcnQJCT0gcHhhMjV4X3N0YXJ0LAorCS5zdG9wCQk9IHB4YTI1eF9zdG9wLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTEyNjMsNyArMTI2OSw3IEBACiAgKiBkaXNjb25uZWN0IGlzIHJlcG9ydGVkLiAgdGhlbiBhIGhvc3QgbWF5IGNvbm5lY3QgYWdhaW4sIG9yCiAgKiB0aGUgZHJpdmVyIG1pZ2h0IGdldCB1bmJvdW5kLgogICovCi1pbnQgdXNiX2dhZGdldF9wcm9iZV9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCitzdGF0aWMgaW50IHB4YTI1eF9zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKIAkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpCiB7CiAJc3RydWN0IHB4YTI1eF91ZGMJKmRldiA9IHRoZV9jb250cm9sbGVyOwpAQCAtMTMyMiw3ICsxMzI4LDYgQEAKIGJpbmRfZmFpbDoKIAlyZXR1cm4gcmV0dmFsOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcik7CiAKIHN0YXRpYyB2b2lkCiBzdG9wX2FjdGl2aXR5KHN0cnVjdCBweGEyNXhfdWRjICpkZXYsIHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQpAQCAtMTM1MSw3ICsxMzU2LDcgQEAKIAl1ZGNfcmVpbml0KGRldik7CiB9CiAKLWludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQorc3RhdGljIGludCBweGEyNXhfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKIHsKIAlzdHJ1Y3QgcHhhMjV4X3VkYwkqZGV2ID0gdGhlX2NvbnRyb2xsZXI7CiAKQEAgLTEzNzksOCArMTM4NCw2IEBACiAJZHVtcF9zdGF0ZShkZXYpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKLQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0yMjE2LDcgKzIyMTksNiBAQAogCQlpZiAocmV0dmFsICE9IDApIHsKIAkJCXByX2VycigiJXM6IGNhbid0IGdldCBpcnEgJWksIGVyciAlZFxuIiwKIAkJCQlkcml2ZXJfbmFtZSwgTFVCQk9DS19VU0JfRElTQ19JUlEsIHJldHZhbCk7Ci1sdWJib2NrX2ZhaWwwOgogCQkJZ290byBlcnJfaXJxX2x1YjsKIAkJfQogCQlyZXR2YWwgPSByZXF1ZXN0X2lycShMVUJCT0NLX1VTQl9JUlEsCkBAIC0yMjI2LDIwICsyMjI4LDIzIEBACiAJCWlmIChyZXR2YWwgIT0gMCkgewogCQkJcHJfZXJyKCIlczogY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLAogCQkJCWRyaXZlcl9uYW1lLCBMVUJCT0NLX1VTQl9JUlEsIHJldHZhbCk7Ci0JCQlmcmVlX2lycShMVUJCT0NLX1VTQl9ESVNDX0lSUSwgZGV2KTsKIAkJCWdvdG8gbHViYm9ja19mYWlsMDsKIAkJfQogCX0gZWxzZQogI2VuZGlmCiAJY3JlYXRlX2RlYnVnX2ZpbGVzKGRldik7CiAKLQlyZXR1cm4gMDsKKwlyZXR2YWwgPSB1c2JfYWRkX2dhZGdldF91ZGMoJnBkZXYtPmRldiwgJmRldi0+Z2FkZ2V0KTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKIAorCXJlbW92ZV9kZWJ1Z19maWxlcyhkZXYpOwogI2lmZGVmCUNPTkZJR19BUkNIX0xVQkJPQ0sKK2x1YmJvY2tfZmFpbDA6CiAJZnJlZV9pcnEoTFVCQk9DS19VU0JfRElTQ19JUlEsIGRldik7CiAgZXJyX2lycV9sdWI6Ci0jZW5kaWYKIAlmcmVlX2lycShpcnEsIGRldik7CisjZW5kaWYKICBlcnJfaXJxMToKIAlpZiAoZ3Bpb19pc192YWxpZChkZXYtPm1hY2gtPmdwaW9fcHVsbHVwKSkKIAkJZ3Bpb19mcmVlKGRldi0+bWFjaC0+Z3Bpb19wdWxsdXApOwpAQCAtMjI2Miw2ICsyMjY3LDcgQEAKIHsKIAlzdHJ1Y3QgcHhhMjV4X3VkYyAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKKwl1c2JfZGVsX2dhZGdldF91ZGMoJmRldi0+Z2FkZ2V0KTsKIAlpZiAoZGV2LT5kcml2ZXIpCiAJCXJldHVybiAtRUJVU1k7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5jCmluZGV4IDU3NjA3NjkuLjg1YjY4YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI3eF91ZGMuYwpAQCAtMTY4MCwxMiArMTY4MCwxOCBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAorc3RhdGljIGludCBweGEyN3hfdWRjX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSk7CitzdGF0aWMgaW50IHB4YTI3eF91ZGNfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcik7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgcHhhX3VkY19vcHMgPSB7CiAJLmdldF9mcmFtZQk9IHB4YV91ZGNfZ2V0X2ZyYW1lLAogCS53YWtldXAJCT0gcHhhX3VkY193YWtldXAsCiAJLnB1bGx1cAkJPSBweGFfdWRjX3B1bGx1cCwKIAkudmJ1c19zZXNzaW9uCT0gcHhhX3VkY192YnVzX3Nlc3Npb24sCiAJLnZidXNfZHJhdwk9IHB4YV91ZGNfdmJ1c19kcmF3LAorCS5zdGFydAkJPSBweGEyN3hfdWRjX3N0YXJ0LAorCS5zdG9wCQk9IHB4YTI3eF91ZGNfc3RvcCwKIH07CiAKIC8qKgpAQCAtMTc5MSw3ICsxNzk3LDcgQEAKIH0KIAogLyoqCi0gKiB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlciAtIFJlZ2lzdGVyIGdhZGdldCBkcml2ZXIKKyAqIHB4YTI3eF9zdGFydCAtIFJlZ2lzdGVyIGdhZGdldCBkcml2ZXIKICAqIEBkcml2ZXI6IGdhZGdldCBkcml2ZXIKICAqIEBiaW5kOiBiaW5kIGZ1bmN0aW9uCiAgKgpAQCAtMTgwNSw3ICsxODExLDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgaWYgbm8gZXJyb3IsIC1FSU5WQUwsIC1FTk9ERVYsIC1FQlVTWSBvdGhlcndpc2UKICAqLwotaW50IHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorc3RhdGljIGludCBweGEyN3hfdWRjX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAogCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKIHsKIAlzdHJ1Y3QgcHhhX3VkYyAqdWRjID0gdGhlX2NvbnRyb2xsZXI7CkBAIC0xODYwLDggKzE4NjYsNiBAQAogCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOwogCXJldHVybiByZXR2YWw7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKTsKLQogCiAvKioKICAqIHN0b3BfYWN0aXZpdHkgLSBTdG9wcyB1ZGMgZW5kcG9pbnRzCkBAIC0xODg4LDEyICsxODkyLDEyIEBACiB9CiAKIC8qKgotICogdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlciAtIFVucmVnaXN0ZXIgdGhlIGdhZGdldCBkcml2ZXIKKyAqIHB4YTI3eF91ZGNfc3RvcCAtIFVucmVnaXN0ZXIgdGhlIGdhZGdldCBkcml2ZXIKICAqIEBkcml2ZXI6IGdhZGdldCBkcml2ZXIKICAqCiAgKiBSZXR1cm5zIDAgaWYgbm8gZXJyb3IsIC1FTk9ERVYsIC1FSU5WQUwgb3RoZXJ3aXNlCiAgKi8KLWludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQorc3RhdGljIGludCBweGEyN3hfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IHB4YV91ZGMgKnVkYyA9IHRoZV9jb250cm9sbGVyOwogCkBAIC0xOTE3LDcgKzE5MjEsNiBAQAogCQlyZXR1cm4gb3RnX3NldF9wZXJpcGhlcmFsKHVkYy0+dHJhbnNjZWl2ZXIsIE5VTEwpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKIAogLyoqCiAgKiBoYW5kbGVfZXAwX2N0cmxfcmVxIC0gaGFuZGxlIGNvbnRyb2wgZW5kcG9pbnQgY29udHJvbCByZXF1ZXN0CkBAIC0yNTE2LDkgKzI1MTksMTQgQEAKIAkJCWRyaXZlcl9uYW1lLCBJUlFfVVNCLCByZXR2YWwpOwogCQlnb3RvIGVycl9pcnE7CiAJfQorCXJldHZhbCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmcGRldi0+ZGV2LCAmdWRjLT5nYWRnZXQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX2FkZF91ZGM7CiAKIAlweGFfaW5pdF9kZWJ1Z2ZzKHVkYyk7CiAJcmV0dXJuIDA7CitlcnJfYWRkX3VkYzoKKwlmcmVlX2lycSh1ZGMtPmlycSwgdWRjKTsKIGVycl9pcnE6CiAJaW91bm1hcCh1ZGMtPnJlZ3MpOwogZXJyX21hcDoKQEAgLTI1MzcsNiArMjU0NSw3IEBACiAJc3RydWN0IHB4YV91ZGMgKnVkYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKF9kZXYpOwogCWludCBncGlvID0gdWRjLT5tYWNoLT5ncGlvX3B1bGx1cDsKIAorCXVzYl9kZWxfZ2FkZ2V0X3VkYygmdWRjLT5nYWRnZXQpOwogCXVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIodWRjLT5kcml2ZXIpOwogCWZyZWVfaXJxKHVkYy0+aXJxLCB1ZGMpOwogCXB4YV9jbGVhbnVwX2RlYnVnZnModWRjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5oCmluZGV4IGNkMTYyMzEuLmIwMTY5NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI3eF91ZGMuaApAQCAtODgsOSArODgsOSBAQAogI2RlZmluZSBVRENJU1JfSU5UX01BU0sJKFVEQ0lDUl9GSUZPRVJSIHwgVURDSUNSX1BLVENPTVBMKQogCiAjZGVmaW5lIFVEQ09UR0lDUl9JRVNGCSgxIDw8IDI0KQkvKiBPVEcgU0VUX0ZFQVRVUkUgY29tbWFuZCByZWN2ZCAqLwotI2RlZmluZSBVRENPVEdJQ1JfSUVYUgkoMSA8PCAxNykJLyogRXh0cmEgVHJhbnNjaWV2ZXIgSW50ZXJydXB0CisjZGVmaW5lIFVEQ09UR0lDUl9JRVhSCSgxIDw8IDE3KQkvKiBFeHRyYSBUcmFuc2NlaXZlciBJbnRlcnJ1cHQKIAkJCQkJICAgUmlzaW5nIEVkZ2UgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBVRENPVEdJQ1JfSUVYRgkoMSA8PCAxNikJLyogRXh0cmEgVHJhbnNjaWV2ZXIgSW50ZXJydXB0CisjZGVmaW5lIFVEQ09UR0lDUl9JRVhGCSgxIDw8IDE2KQkvKiBFeHRyYSBUcmFuc2NlaXZlciBJbnRlcnJ1cHQKIAkJCQkJICAgRmFsbGluZyBFZGdlIEludGVycnVwdCBFbmFibGUgKi8KICNkZWZpbmUgVURDT1RHSUNSX0lFVlY0MFIgKDEgPDwgOSkJLyogT1RHIFZidXMgVmFsaWQgNC4wViBSaXNpbmcgRWRnZQogCQkJCQkgICBJbnRlcnJ1cHQgRW5hYmxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcjhhNjY1OTctdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcjhhNjY1OTctdWRjLmMKaW5kZXggNmRjYzFmNi4uNTA5OTFlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3I4YTY2NTk3LXVkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9yOGE2NjU5Ny11ZGMuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgogICoKLSAqIEF1dGhvciA6IFlvc2hpaGlybyBTaGltb2RhIDxzaGltb2RhLnlvc2hpaGlyb0ByZW5lc2FzLmNvbT4KKyAqIEF1dGhvciA6IFlvc2hpaGlybyBTaGltb2RhIDx5b3NoaWhpcm8uc2hpbW9kYS51aEByZW5lc2FzLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTU3Niw3ICs1NzYsMTEgQEAKIAl1MTYgZW5kaWFuID0gcjhhNjY1OTctPnBkYXRhLT5lbmRpYW4gPyBCSUdFTkQgOiAwOwogCiAJaWYgKHI4YTY2NTk3LT5wZGF0YS0+b25fY2hpcCkgewotCQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCAweDA0LCBTWVNDRkcxKTsKKwkJaWYgKHI4YTY2NTk3LT5wZGF0YS0+YnVzd2FpdCkKKwkJCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCByOGE2NjU5Ny0+cGRhdGEtPmJ1c3dhaXQsCisJCQkJCVNZU0NGRzEpOworCQllbHNlCisJCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgMHgwZiwgU1lTQ0ZHMSk7CiAJCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIEhTRSwgU1lTQ0ZHMCk7CiAKIAkJcjhhNjY1OTdfYmNscihyOGE2NjU5NywgVVNCRSwgU1lTQ0ZHMCk7CkBAIC02MTgsNiArNjIyLDcgQEAKIHsKIAlpZiAocjhhNjY1OTctPnBkYXRhLT5vbl9jaGlwKSB7CiAJCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIFNDS0UsIFNZU0NGRzApOworCQlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBVVFNULCBURVNUTU9ERSk7CiAKIAkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCiAJCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCAwLCBJTlRFTkIwKTsKQEAgLTYzNSw2ICs2NDAsNyBAQAogCQlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBTQ0tFLCBTWVNDRkcwKTsKIAogCX0gZWxzZSB7CisJCXI4YTY2NTk3X2JjbHIocjhhNjY1OTcsIFVUU1QsIFRFU1RNT0RFKTsKIAkJcjhhNjY1OTdfYmNscihyOGE2NjU5NywgU0NLRSwgU1lTQ0ZHMCk7CiAJCXVkZWxheSgxKTsKIAkJcjhhNjY1OTdfYmNscihyOGE2NjU5NywgUExMQywgU1lTQ0ZHMCk7CkBAIC05OTksMTAgKzEwMDUsMjkgQEAKIAogc3RhdGljIHZvaWQgc2V0X2ZlYXR1cmUoc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5Nywgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKIHsKKwl1MTYgdG1wOworCWludCB0aW1lb3V0ID0gMzAwMDsKIAogCXN3aXRjaCAoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spIHsKIAljYXNlIFVTQl9SRUNJUF9ERVZJQ0U6Ci0JCWNvbnRyb2xfZW5kKHI4YTY2NTk3LCAxKTsKKwkJc3dpdGNoIChsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpKSB7CisJCWNhc2UgVVNCX0RFVklDRV9URVNUX01PREU6CisJCQljb250cm9sX2VuZChyOGE2NjU5NywgMSk7CisJCQkvKiBXYWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiBzdGF0dXMgc3RhZ2UgKi8KKwkJCWRvIHsKKwkJCQl0bXAgPSByOGE2NjU5N19yZWFkKHI4YTY2NTk3LCBJTlRTVFMwKSAmIENUU1E7CisJCQkJdWRlbGF5KDEpOworCQkJfSB3aGlsZSAodG1wICE9IENTX0lEU1QgfHwgdGltZW91dC0tID4gMCk7CisKKwkJCWlmICh0bXAgPT0gQ1NfSURTVCkKKwkJCQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LAorCQkJCQkgICAgICBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXggPj4gOCksCisJCQkJCSAgICAgIFRFU1RNT0RFKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcGlwZV9zdGFsbChyOGE2NjU5NywgMCk7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAljYXNlIFVTQl9SRUNJUF9JTlRFUkZBQ0U6CiAJCWNvbnRyb2xfZW5kKHI4YTY2NTk3LCAxKTsKQEAgLTE0MTAsNyArMTQzNSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHN0cnVjdCByOGE2NjU5NyAqdGhlX2NvbnRyb2xsZXI7CiAKLWludCB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKK3N0YXRpYyBpbnQgcjhhNjY1OTdfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCiAJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKQogewogCXN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcgPSB0aGVfY29udHJvbGxlcjsKQEAgLTE0NDQsNiArMTQ2OSw3IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCisJaW5pdF9jb250cm9sbGVyKHI4YTY2NTk3KTsKIAlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBWQlNFLCBJTlRFTkIwKTsKIAlpZiAocjhhNjY1OTdfcmVhZChyOGE2NjU5NywgSU5UU1RTMCkgJiBWQlNUUykgewogCQlyOGE2NjU5N19zdGFydF94Y2xvY2socjhhNjY1OTcpOwpAQCAtMTQ2Miw5ICsxNDg4LDggQEAKIAogCXJldHVybiByZXR2YWw7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKTsKIAotaW50IHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCitzdGF0aWMgaW50IHI4YTY2NTk3X3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5NyA9IHRoZV9jb250cm9sbGVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xNDc1LDIwICsxNTAwLDE2IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnI4YTY2NTk3LT5sb2NrLCBmbGFncyk7CiAJaWYgKHI4YTY2NTk3LT5nYWRnZXQuc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04pCiAJCXI4YTY2NTk3X3VzYl9kaXNjb25uZWN0KHI4YTY2NTk3KTsKKwlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBWQlNFLCBJTlRFTkIwKTsKKwlkaXNhYmxlX2NvbnRyb2xsZXIocjhhNjY1OTcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnI4YTY2NTk3LT5sb2NrLCBmbGFncyk7CiAKLQlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBWQlNFLCBJTlRFTkIwKTsKLQogCWRyaXZlci0+dW5iaW5kKCZyOGE2NjU5Ny0+Z2FkZ2V0KTsKIAotCWluaXRfY29udHJvbGxlcihyOGE2NjU5Nyk7Ci0JZGlzYWJsZV9jb250cm9sbGVyKHI4YTY2NTk3KTsKLQogCWRldmljZV9kZWwoJnI4YTY2NTk3LT5nYWRnZXQuZGV2KTsKIAlyOGE2NjU5Ny0+ZHJpdmVyID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50IHI4YTY2NTk3X2dldF9mcmFtZShzdHJ1Y3QgdXNiX2dhZGdldCAqX2dhZGdldCkKQEAgLTE0OTcsMTQgKzE1MTgsMzMgQEAKIAlyZXR1cm4gcjhhNjY1OTdfcmVhZChyOGE2NjU5NywgRlJNTlVNKSAmIDB4MDNGRjsKIH0KIAorc3RhdGljIGludCByOGE2NjU5N19wdWxsdXAoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwgaW50IGlzX29uKQoreworCXN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcgPSBnYWRnZXRfdG9fcjhhNjY1OTcoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnI4YTY2NTk3LT5sb2NrLCBmbGFncyk7CisJaWYgKGlzX29uKQorCQlyOGE2NjU5N19ic2V0KHI4YTY2NTk3LCBEUFJQVSwgU1lTQ0ZHMCk7CisJZWxzZQorCQlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBEUFJQVSwgU1lTQ0ZHMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcjhhNjY1OTctPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfb3BzIHI4YTY2NTk3X2dhZGdldF9vcHMgPSB7CiAJLmdldF9mcmFtZQkJPSByOGE2NjU5N19nZXRfZnJhbWUsCisJLnN0YXJ0CQkJPSByOGE2NjU5N19zdGFydCwKKwkuc3RvcAkJCT0gcjhhNjY1OTdfc3RvcCwKKwkucHVsbHVwCQkJPSByOGE2NjU5N19wdWxsdXAsCiB9OwogCiBzdGF0aWMgaW50IF9fZXhpdCByOGE2NjU5N19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcjhhNjY1OTcJCSpyOGE2NjU5NyA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKIAorCXVzYl9kZWxfZ2FkZ2V0X3VkYygmcjhhNjY1OTctPmdhZGdldCk7CiAJZGVsX3RpbWVyX3N5bmMoJnI4YTY2NTk3LT50aW1lcik7CiAJaW91bm1hcChyOGE2NjU5Ny0+cmVnKTsKIAlmcmVlX2lycShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCByOGE2NjU5Nyk7CkBAIC0xNjQ1LDExICsxNjg1LDE1IEBACiAJCWdvdG8gY2xlYW5fdXAzOwogCXI4YTY2NTk3LT5lcDBfcmVxLT5jb21wbGV0ZSA9IG5vcF9jb21wbGV0aW9uOwogCi0JaW5pdF9jb250cm9sbGVyKHI4YTY2NTk3KTsKKwlyZXQgPSB1c2JfYWRkX2dhZGdldF91ZGMoJnBkZXYtPmRldiwgJnI4YTY2NTk3LT5nYWRnZXQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2FkZF91ZGM7CiAKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAidmVyc2lvbiAlc1xuIiwgRFJJVkVSX1ZFUlNJT04pOwogCXJldHVybiAwOwogCitlcnJfYWRkX3VkYzoKKwlyOGE2NjU5N19mcmVlX3JlcXVlc3QoJnI4YTY2NTk3LT5lcFswXS5lcCwgcjhhNjY1OTctPmVwMF9yZXEpOwogY2xlYW5fdXAzOgogCWZyZWVfaXJxKGlycSwgcjhhNjY1OTcpOwogY2xlYW5fdXAyOgpAQCAtMTY3OSw2ICsxNzIzLDcgQEAKIAkJLm5hbWUgPQkoY2hhciAqKSB1ZGNfbmFtZSwKIAl9LAogfTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cjhhNjY1OTdfdWRjIik7CiAKIHN0YXRpYyBpbnQgX19pbml0IHI4YTY2NTk3X3VkY19pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcjhhNjY1OTctdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvcjhhNjY1OTctdWRjLmgKaW5kZXggNWZjMjJlMC4uNTAzZjc2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3I4YTY2NTk3LXVkYy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9yOGE2NjU5Ny11ZGMuaApAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgogICoKLSAqIEF1dGhvciA6IFlvc2hpaGlybyBTaGltb2RhIDxzaGltb2RhLnlvc2hpaGlyb0ByZW5lc2FzLmNvbT4KKyAqIEF1dGhvciA6IFlvc2hpaGlybyBTaGltb2RhIDx5b3NoaWhpcm8uc2hpbW9kYS51aEByZW5lc2FzLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHNvdGcuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHNvdGcuYwppbmRleCBhY2I5Y2M0Li44YmRlZTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzb3RnLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc290Zy5jCkBAIC0yNTc0LDcgKzI1NzQsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdXNiX2dhZGdldF9wcm9iZV9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCitzdGF0aWMgaW50IHMzY19oc290Z19zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKIAkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpCiB7CiAJc3RydWN0IHMzY19oc290ZyAqaHNvdGcgPSBvdXJfaHNvdGc7CkBAIC0yNjgwLDkgKzI2ODAsOSBAQAogCiAJd3JpdGVsKDAsIGhzb3RnLT5yZWdzICsgUzNDX0RBSU5UTVNLKTsKIAotCWRldl9pbmZvKGhzb3RnLT5kZXYsICJFUDA6IERJRVBDVEwwPTB4JTA4eCwgRE9FUENUTDA9MHglMDh4XG4iLAotCQkgcmVhZGwoaHNvdGctPnJlZ3MgKyBTM0NfRElFUENUTDApLAotCQkgcmVhZGwoaHNvdGctPnJlZ3MgKyBTM0NfRE9FUENUTDApKTsKKwlkZXZfZGJnKGhzb3RnLT5kZXYsICJFUDA6IERJRVBDVEwwPTB4JTA4eCwgRE9FUENUTDA9MHglMDh4XG4iLAorCQlyZWFkbChoc290Zy0+cmVncyArIFMzQ19ESUVQQ1RMMCksCisJCXJlYWRsKGhzb3RnLT5yZWdzICsgUzNDX0RPRVBDVEwwKSk7CiAKIAkvKiBlbmFibGUgaW4gYW5kIG91dCBlbmRwb2ludCBpbnRlcnJ1cHRzICovCiAJczNjX2hzb3RnX2VuX2dzaW50KGhzb3RnLCBTM0NfR0lOVFNUU19PRVBJbnQgfCBTM0NfR0lOVFNUU19JRVBJbnQpOwpAQCAtMjcwMSw3ICsyNzAxLDcgQEAKIAl1ZGVsYXkoMTApOyAgLyogc2VlIG9wZW5pYm9vdCAqLwogCV9fYmljMzIoaHNvdGctPnJlZ3MgKyBTM0NfRENUTCwgUzNDX0RDVExfUFdST25QcmdEb25lKTsKIAotCWRldl9pbmZvKGhzb3RnLT5kZXYsICJEQ1RMPTB4JTA4eFxuIiwgcmVhZGwoaHNvdGctPnJlZ3MgKyBTM0NfRENUTCkpOworCWRldl9kYmcoaHNvdGctPmRldiwgIkRDVEw9MHglMDh4XG4iLCByZWFkbChoc290Zy0+cmVncyArIFMzQ19EQ1RMKSk7CiAKIAkvKiBTM0NfRHhFUENUTF9VU0JBY3RFcCBzYXlzIFJPIGluIG1hbnVhbCwgYnV0IHNlZW1zIHRvIGJlIHNldCBieQogCSAgIHdyaXRpbmcgdG8gdGhlIEVQQ1RMIHJlZ2lzdGVyLi4gKi8KQEAgLTI3MjEsOSArMjcyMSw5IEBACiAKIAlzM2NfaHNvdGdfZW5xdWV1ZV9zZXR1cChoc290Zyk7CiAKLQlkZXZfaW5mbyhoc290Zy0+ZGV2LCAiRVAwOiBESUVQQ1RMMD0weCUwOHgsIERPRVBDVEwwPTB4JTA4eFxuIiwKLQkJIHJlYWRsKGhzb3RnLT5yZWdzICsgUzNDX0RJRVBDVEwwKSwKLQkJIHJlYWRsKGhzb3RnLT5yZWdzICsgUzNDX0RPRVBDVEwwKSk7CisJZGV2X2RiZyhoc290Zy0+ZGV2LCAiRVAwOiBESUVQQ1RMMD0weCUwOHgsIERPRVBDVEwwPTB4JTA4eFxuIiwKKwkJcmVhZGwoaHNvdGctPnJlZ3MgKyBTM0NfRElFUENUTDApLAorCQlyZWFkbChoc290Zy0+cmVncyArIFMzQ19ET0VQQ1RMMCkpOwogCiAJLyogY2xlYXIgZ2xvYmFsIE5BS3MgKi8KIAl3cml0ZWwoUzNDX0RDVExfQ0dPVVROYWsgfCBTM0NfRENUTF9DR05QSW5OQUssCkBAIC0yNzQ1LDkgKzI3NDUsOCBAQAogCWhzb3RnLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOwogCi1pbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3N0YXRpYyBpbnQgczNjX2hzb3RnX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IHMzY19oc290ZyAqaHNvdGcgPSBvdXJfaHNvdGc7CiAJaW50IGVwOwpAQCAtMjc3NSw3ICsyNzc0LDYgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKIAogc3RhdGljIGludCBzM2NfaHNvdGdfZ2FkZ2V0X2dldGZyYW1lKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCiB7CkBAIC0yNzg0LDYgKzI3ODIsOCBAQAogCiBzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfb3BzIHMzY19oc290Z19nYWRnZXRfb3BzID0gewogCS5nZXRfZnJhbWUJPSBzM2NfaHNvdGdfZ2FkZ2V0X2dldGZyYW1lLAorCS5zdGFydAkJPSBzM2NfaHNvdGdfc3RhcnQsCisJLnN0b3AJCT0gczNjX2hzb3RnX3N0b3AsCiB9OwogCiAvKioKQEAgLTI5MjEsOSArMjkyMSw5IEBACiAKIAkvKiBzZXR1cCBmaWZvcyAqLwogCi0JZGV2X2luZm8oaHNvdGctPmRldiwgIkdSWEZTSVo9MHglMDh4LCBHTlBUWEZTSVo9MHglMDh4XG4iLAotCQkgcmVhZGwoaHNvdGctPnJlZ3MgKyBTM0NfR1JYRlNJWiksCi0JCSByZWFkbChoc290Zy0+cmVncyArIFMzQ19HTlBUWEZTSVopKTsKKwlkZXZfZGJnKGhzb3RnLT5kZXYsICJHUlhGU0laPTB4JTA4eCwgR05QVFhGU0laPTB4JTA4eFxuIiwKKwkJcmVhZGwoaHNvdGctPnJlZ3MgKyBTM0NfR1JYRlNJWiksCisJCXJlYWRsKGhzb3RnLT5yZWdzICsgUzNDX0dOUFRYRlNJWikpOwogCiAJczNjX2hzb3RnX2luaXRfZmlmbyhoc290Zyk7CiAKQEAgLTI5NDUsNiArMjk0NSw3IEBACiAKIHN0YXRpYyB2b2lkIHMzY19oc290Z19kdW1wKHN0cnVjdCBzM2NfaHNvdGcgKmhzb3RnKQogeworI2lmZGVmIERFQlVHCiAJc3RydWN0IGRldmljZSAqZGV2ID0gaHNvdGctPmRldjsKIAl2b2lkIF9faW9tZW0gKnJlZ3MgPSBoc290Zy0+cmVnczsKIAl1MzIgdmFsOwpAQCAtMjk4Nyw2ICsyOTg4LDcgQEAKIAogCWRldl9pbmZvKGRldiwgIkRWQlVTRElTPTB4JTA4eCwgRFZCVVNQVUxTRT0lMDh4XG4iLAogCQkgcmVhZGwocmVncyArIFMzQ19EVkJVU0RJUyksIHJlYWRsKHJlZ3MgKyBTM0NfRFZCVVNQVUxTRSkpOworI2VuZGlmCiB9CiAKIApAQCAtMzQwMSw2ICszNDAzLDEwIEBACiAJZm9yIChlcG51bSA9IDA7IGVwbnVtIDwgUzNDX0hTT1RHX0VQUzsgZXBudW0rKykKIAkJczNjX2hzb3RnX2luaXRlcChoc290ZywgJmhzb3RnLT5lcHNbZXBudW1dLCBlcG51bSk7CiAKKwlyZXQgPSB1c2JfYWRkX2dhZGdldF91ZGMoJnBkZXYtPmRldiwgJmhzb3RnLT5nYWRnZXQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2FkZF91ZGM7CisKIAlzM2NfaHNvdGdfY3JlYXRlX2RlYnVnKGhzb3RnKTsKIAogCXMzY19oc290Z19kdW1wKGhzb3RnKTsKQEAgLTM0MDgsNiArMzQxNCwxMSBAQAogCW91cl9oc290ZyA9IGhzb3RnOwogCXJldHVybiAwOwogCitlcnJfYWRkX3VkYzoKKwlzM2NfaHNvdGdfZ2F0ZShwZGV2LCBmYWxzZSk7CisJY2xrX2Rpc2FibGUoaHNvdGctPmNsayk7CisJY2xrX3B1dChoc290Zy0+Y2xrKTsKKwogZXJyX3JlZ3M6CiAJaW91bm1hcChoc290Zy0+cmVncyk7CiAKQEAgLTM0MjUsNiArMzQzNiw4IEBACiB7CiAJc3RydWN0IHMzY19oc290ZyAqaHNvdGcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAorCXVzYl9kZWxfZ2FkZ2V0X3VkYygmaHNvdGctPmdhZGdldCk7CisKIAlzM2NfaHNvdGdfZGVsZXRlX2RlYnVnKGhzb3RnKTsKIAogCXVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoaHNvdGctPmRyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzdWRjLmMKaW5kZXggY2ZlM2NmNS4uM2ZhNzE3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHN1ZGMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1zM2MyNDQzLWNsb2NrLmg+CiAjaW5jbHVkZSA8cGxhdC91ZGMuaD4KQEAgLTExMzIsNyArMTEzMyw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1pbnQgdXNiX2dhZGdldF9wcm9iZV9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCitzdGF0aWMgaW50IHMzY19oc3VkY19zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKIAkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpCiB7CiAJc3RydWN0IHMzY19oc3VkYyAqaHN1ZGMgPSB0aGVfY29udHJvbGxlcjsKQEAgLTExODAsOSArMTE4MSw4IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOwogCi1pbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3N0YXRpYyBpbnQgczNjX2hzdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IHMzY19oc3VkYyAqaHN1ZGMgPSB0aGVfY29udHJvbGxlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTIwOSw3ICsxMjA5LDYgQEAKIAkJCWRyaXZlci0+ZHJpdmVyLm5hbWUpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKIAogc3RhdGljIGlubGluZSB1MzIgczNjX2hzdWRjX3JlYWRfZnJhbWVubyhzdHJ1Y3QgczNjX2hzdWRjICpoc3VkYykKIHsKQEAgLTEyMjMsNiArMTIyMiw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgczNjX2hzdWRjX2dhZGdldF9vcHMgPSB7CiAJLmdldF9mcmFtZQk9IHMzY19oc3VkY19nYWRnZXRfZ2V0ZnJhbWUsCisJLnN0YXJ0CQk9IHMzY19oc3VkY19zdGFydCwKKwkuc3RvcAkJPSBzM2NfaHN1ZGNfc3RvcCwKIH07CiAKIHN0YXRpYyBpbnQgczNjX2hzdWRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xMzAxLDcgKzEzMDIsOCBAQAogCWhzdWRjLT51Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAidXNiLWRldmljZSIpOwogCWlmIChJU19FUlIoaHN1ZGMtPnVjbGspKSB7CiAJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGZpbmQgdXNiLWRldmljZSBjbG9jayBzb3VyY2VcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihoc3VkYy0+dWNsayk7CisJCXJldCA9IFBUUl9FUlIoaHN1ZGMtPnVjbGspOworCQlnb3RvIGVycl9jbGs7CiAJfQogCWNsa19lbmFibGUoaHN1ZGMtPnVjbGspOwogCkBAIC0xMzA5LDggKzEzMTEsMTcgQEAKIAogCWRpc2FibGVfaXJxKGhzdWRjLT5pcnEpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKLQlyZXR1cm4gMDsKIAorCXJldCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmcGRldi0+ZGV2LCAmaHN1ZGMtPmdhZGdldCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfYWRkX3VkYzsKKworCXJldHVybiAwOworZXJyX2FkZF91ZGM6CisJY2xrX2Rpc2FibGUoaHN1ZGMtPnVjbGspOworCWNsa19wdXQoaHN1ZGMtPnVjbGspOworZXJyX2NsazoKKwlmcmVlX2lycShoc3VkYy0+aXJxLCBoc3VkYyk7CiBlcnJfaXJxOgogCWlvdW5tYXAoaHN1ZGMtPnJlZ3MpOwogCkBAIC0xMzMwLDYgKzEzNDEsNyBAQAogCX0sCiAJLnByb2JlCQk9IHMzY19oc3VkY19wcm9iZSwKIH07CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnMzYy1oc3VkYyIpOwogCiBzdGF0aWMgaW50IF9faW5pdCBzM2NfaHN1ZGNfbW9kaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuYwppbmRleCA2ZDhiMDQwLi44NWMxYjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0xNTUxLDYgKzE1NTIsMTAgQEAKIAlyZXR1cm4gLUVOT1RTVVBQOwogfQogCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSk7CitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9nYWRnZXRfb3BzIHMzYzI0MTBfb3BzID0gewogCS5nZXRfZnJhbWUJCT0gczNjMjQxMF91ZGNfZ2V0X2ZyYW1lLAogCS53YWtldXAJCQk9IHMzYzI0MTBfdWRjX3dha2V1cCwKQEAgLTE1NTgsNiArMTU2Myw4IEBACiAJLnB1bGx1cAkJCT0gczNjMjQxMF91ZGNfcHVsbHVwLAogCS52YnVzX3Nlc3Npb24JCT0gczNjMjQxMF91ZGNfdmJ1c19zZXNzaW9uLAogCS52YnVzX2RyYXcJCT0gczNjMjQxMF92YnVzX2RyYXcsCisJLnN0YXJ0CQkJPSBzM2MyNDEwX3VkY19zdGFydCwKKwkuc3RvcAkJCT0gczNjMjQxMF91ZGNfc3RvcCwKIH07CiAKIHN0YXRpYyB2b2lkIHMzYzI0MTBfdWRjX2NvbW1hbmQoZW51bSBzM2MyNDEwX3VkY19jbWRfZSBjbWQpCkBAIC0xNTY2LDcgKzE1NzMsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAodWRjX2luZm8tPnVkY19jb21tYW5kKSB7Ci0JCXVkY19pbmZvLT51ZGNfY29tbWFuZChTM0MyNDEwX1VEQ19QX0RJU0FCTEUpOworCQl1ZGNfaW5mby0+dWRjX2NvbW1hbmQoY21kKTsKIAl9IGVsc2UgaWYgKGdwaW9faXNfdmFsaWQodWRjX2luZm8tPnB1bGx1cF9waW4pKSB7CiAJCWludCB2YWx1ZTsKIApAQCAtMTY3MSwxMCArMTY3OCw3IEBACiAJczNjMjQxMF91ZGNfY29tbWFuZChTM0MyNDEwX1VEQ19QX0VOQUJMRSk7CiB9CiAKLS8qCi0gKgl1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcgotICovCi1pbnQgdXNiX2dhZGdldF9wcm9iZV9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCitzdGF0aWMgaW50IHMzYzI0MTBfdWRjX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAogCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKIHsKIAlzdHJ1Y3QgczNjMjQxMF91ZGMgKnVkYyA9IHRoZV9jb250cm9sbGVyOwpAQCAtMTcyOSwxMiArMTczMyw4IEBACiAJdWRjLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CiAJcmV0dXJuIHJldHZhbDsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOwogCi0vKgotICoJdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcgotICovCi1pbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3N0YXRpYyBpbnQgczNjMjQxMF91ZGNfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKIHsKIAlzdHJ1Y3QgczNjMjQxMF91ZGMgKnVkYyA9IHRoZV9jb250cm9sbGVyOwogCkBAIC0xOTU0LDYgKzE5NTQsMTAgQEAKIAkJCWdvdG8gZXJyX3ZidXNfaXJxOwogCX0KIAorCXJldHZhbCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmcGRldi0+ZGV2LCAmdWRjLT5nYWRnZXQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX2FkZF91ZGM7CisKIAlpZiAoczNjMjQxMF91ZGNfZGVidWdmc19yb290KSB7CiAJCXVkYy0+cmVnc19pbmZvID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXJzIiwgU19JUlVHTywKIAkJCQlzM2MyNDEwX3VkY19kZWJ1Z2ZzX3Jvb3QsCkBAIC0xOTY2LDYgKzE5NzAsMTAgQEAKIAogCXJldHVybiAwOwogCitlcnJfYWRkX3VkYzoKKwlpZiAodWRjX2luZm8gJiYgIXVkY19pbmZvLT51ZGNfY29tbWFuZCAmJgorCQkJZ3Bpb19pc192YWxpZCh1ZGNfaW5mby0+cHVsbHVwX3BpbikpCisJCWdwaW9fZnJlZSh1ZGNfaW5mby0+cHVsbHVwX3Bpbik7CiBlcnJfdmJ1c19pcnE6CiAJaWYgKHVkY19pbmZvICYmIHVkY19pbmZvLT52YnVzX3BpbiA+IDApCiAJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHVkY19pbmZvLT52YnVzX3BpbiksIHVkYyk7CkBAIC0xOTkxLDYgKzE5OTksOCBAQAogCXVuc2lnbmVkIGludCBpcnE7CiAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwl1c2JfZGVsX2dhZGdldF91ZGMoJnVkYy0+Z2FkZ2V0KTsKIAlpZiAodWRjLT5kcml2ZXIpCiAJCXJldHVybiAtRUJVU1k7CiAKQEAgLTIwNDcsMjYgKzIwNTcsMjIgQEAKICNkZWZpbmUgczNjMjQxMF91ZGNfcmVzdW1lCU5VTEwKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1ZGNfZHJpdmVyXzI0MTAgPSB7Ci0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gInMzYzI0MTAtdXNiZ2FkZ2V0IiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUJCT0gczNjMjQxMF91ZGNfcHJvYmUsCi0JLnJlbW92ZQkJPSBzM2MyNDEwX3VkY19yZW1vdmUsCi0JLnN1c3BlbmQJPSBzM2MyNDEwX3VkY19zdXNwZW5kLAotCS5yZXN1bWUJCT0gczNjMjQxMF91ZGNfcmVzdW1lLAorc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgczNjX3VkY19pZHNbXSA9IHsKKwl7ICJzM2MyNDEwLXVzYmdhZGdldCIsIH0sCisJeyAiczNjMjQ0MC11c2JnYWRnZXQiLCB9LAogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIHMzY191ZGNfaWRzKTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdWRjX2RyaXZlcl8yNDQwID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdWRjX2RyaXZlcl8yNHgwID0gewogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJzM2MyNDQwLXVzYmdhZGdldCIsCisJCS5uYW1lCT0gInMzYzI0eDAtdXNiZ2FkZ2V0IiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIAkucHJvYmUJCT0gczNjMjQxMF91ZGNfcHJvYmUsCiAJLnJlbW92ZQkJPSBzM2MyNDEwX3VkY19yZW1vdmUsCiAJLnN1c3BlbmQJPSBzM2MyNDEwX3VkY19zdXNwZW5kLAogCS5yZXN1bWUJCT0gczNjMjQxMF91ZGNfcmVzdW1lLAorCS5pZF90YWJsZQk9IHMzY191ZGNfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdWRjX2luaXQodm9pZCkKQEAgLTIwODIsMTEgKzIwODgsNyBAQAogCQlzM2MyNDEwX3VkY19kZWJ1Z2ZzX3Jvb3QgPSBOVUxMOwogCX0KIAotCXJldHZhbCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdWRjX2RyaXZlcl8yNDEwKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGVycjsKLQotCXJldHZhbCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdWRjX2RyaXZlcl8yNDQwKTsKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnVkY19kcml2ZXJfMjR4MCk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnI7CiAKQEAgLTIwOTksMTMgKzIxMDEsMTAgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHVkY19leGl0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnVkY19kcml2ZXJfMjQxMCk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnVkY19kcml2ZXJfMjQ0MCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnVkY19kcml2ZXJfMjR4MCk7CiAJZGVidWdmc19yZW1vdmUoczNjMjQxMF91ZGNfZGVidWdmc19yb290KTsKIH0KIAotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKLQogbW9kdWxlX2luaXQodWRjX2luaXQpOwogbW9kdWxlX2V4aXQodWRjX2V4aXQpOwogCkBAIC0yMTEzLDUgKzIxMTIsMyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06czNjMjQxMC11c2JnYWRnZXQiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06czNjMjQ0MC11c2JnYWRnZXQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYwppbmRleCAxYWM1N2E5Li5lZDFiODE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCkBAIC0yNDIsNiArMjQyLDcgQEAKIAkubmFtZQkJPSAiZ19zZXJpYWwiLAogCS5kZXYJCT0gJmRldmljZV9kZXNjLAogCS5zdHJpbmdzCT0gZGV2X3N0cmluZ3MsCisJLm1heF9zcGVlZAk9IFVTQl9TUEVFRF9ISUdILAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3N0b3JhZ2VfY29tbW9uLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvc3RvcmFnZV9jb21tb24uYwppbmRleCAxZmE0ZjcwLi5kM2RkMjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvc3RvcmFnZV9jb21tb24uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvc3RvcmFnZV9jb21tb24uYwpAQCAtNDk0LDcgKzQ5NCw3IEBACiB9OwogCiAvKiBNYXhwYWNrZXQgYW5kIG90aGVyIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcyB2YXJ5IGJ5IHNwZWVkLiAqLwotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqCitzdGF0aWMgX19tYXliZV91bnVzZWQgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICoKIGZzZ19lcF9kZXNjKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnLCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmZzLAogCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmhzKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMKaW5kZXggMmFjMWQyMS4uZGZlZDRjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jCkBAIC05NywxNiArOTcsMTcgQEAKIAogc3RhdGljIHVuc2lnbmVkIHFtdWx0ID0gNTsKIG1vZHVsZV9wYXJhbShxbXVsdCwgdWludCwgU19JUlVHT3xTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0MocW11bHQsICJxdWV1ZSBsZW5ndGggbXVsdGlwbGllciBhdCBoaWdoIHNwZWVkIik7CitNT0RVTEVfUEFSTV9ERVNDKHFtdWx0LCAicXVldWUgbGVuZ3RoIG11bHRpcGxpZXIgYXQgaGlnaC9zdXBlciBzcGVlZCIpOwogCiAjZWxzZQkvKiBmdWxsIHNwZWVkIChsb3cgc3BlZWQgZG9lc24ndCBkbyBidWxrKSAqLwogI2RlZmluZSBxbXVsdAkJMQogI2VuZGlmCiAKLS8qIGZvciBkdWFsLXNwZWVkIGhhcmR3YXJlLCB1c2UgZGVlcGVyIHF1ZXVlcyBhdCBoaWdoc3BlZWQgKi8KKy8qIGZvciBkdWFsLXNwZWVkIGhhcmR3YXJlLCB1c2UgZGVlcGVyIHF1ZXVlcyBhdCBoaWdoL3N1cGVyIHNwZWVkICovCiBzdGF0aWMgaW5saW5lIGludCBxbGVuKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCiB7Ci0JaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSAmJiBnYWRnZXQtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGdhZGdldCkgJiYgKGdhZGdldC0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0ggfHwKKwkJCQkJICAgIGdhZGdldC0+c3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKSkKIAkJcmV0dXJuIHFtdWx0ICogREVGQVVMVF9RTEVOOwogCWVsc2UKIAkJcmV0dXJuIERFRkFVTFRfUUxFTjsKQEAgLTU5OCw5ICs1OTksMTAgQEAKIAogCXJlcS0+bGVuZ3RoID0gbGVuZ3RoOwogCi0JLyogdGhyb3R0bGUgaGlnaHNwZWVkIElSUSByYXRlIGJhY2sgc2xpZ2h0bHkgKi8KKwkvKiB0aHJvdHRsZSBoaWdoL3N1cGVyIHNwZWVkIElSUSByYXRlIGJhY2sgc2xpZ2h0bHkgKi8KIAlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChkZXYtPmdhZGdldCkpCi0JCXJlcS0+bm9faW50ZXJydXB0ID0gKGRldi0+Z2FkZ2V0LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwkJcmVxLT5ub19pbnRlcnJ1cHQgPSAoZGV2LT5nYWRnZXQtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIIHx8CisJCQkJICAgICBkZXYtPmdhZGdldC0+c3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKQogCQkJPyAoKGF0b21pY19yZWFkKCZkZXYtPnR4X3FsZW4pICUgcW11bHQpICE9IDApCiAJCQk6IDA7CiAKQEAgLTY5Myw4ICs2OTUsOCBAQAogCQl1c2JfZXBfZGlzYWJsZShsaW5rLT5vdXRfZXApOwogCQlpZiAobmV0aWZfY2Fycmllcl9vayhuZXQpKSB7CiAJCQlEQkcoZGV2LCAiaG9zdCBzdGlsbCB1c2luZyBpbi9vdXQgZW5kcG9pbnRzXG4iKTsKLQkJCXVzYl9lcF9lbmFibGUobGluay0+aW5fZXAsIGxpbmstPmluKTsKLQkJCXVzYl9lcF9lbmFibGUobGluay0+b3V0X2VwLCBsaW5rLT5vdXQpOworCQkJdXNiX2VwX2VuYWJsZShsaW5rLT5pbl9lcCk7CisJCQl1c2JfZXBfZW5hYmxlKGxpbmstPm91dF9lcCk7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CkBAIC04NzEsNyArODczLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlsaW5rLT5pbl9lcC0+ZHJpdmVyX2RhdGEgPSBkZXY7Ci0JcmVzdWx0ID0gdXNiX2VwX2VuYWJsZShsaW5rLT5pbl9lcCwgbGluay0+aW4pOworCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUobGluay0+aW5fZXApOwogCWlmIChyZXN1bHQgIT0gMCkgewogCQlEQkcoZGV2LCAiZW5hYmxlICVzIC0tPiAlZFxuIiwKIAkJCWxpbmstPmluX2VwLT5uYW1lLCByZXN1bHQpOwpAQCAtODc5LDcgKzg4MSw3IEBACiAJfQogCiAJbGluay0+b3V0X2VwLT5kcml2ZXJfZGF0YSA9IGRldjsKLQlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlKGxpbmstPm91dF9lcCwgbGluay0+b3V0KTsKKwlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlKGxpbmstPm91dF9lcCk7CiAJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCURCRyhkZXYsICJlbmFibGUgJXMgLS0+ICVkXG4iLAogCQkJbGluay0+b3V0X2VwLT5uYW1lLCByZXN1bHQpOwpAQCAtOTY5LDcgKzk3MSw3IEBACiAJfQogCXNwaW5fdW5sb2NrKCZkZXYtPnJlcV9sb2NrKTsKIAlsaW5rLT5pbl9lcC0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCWxpbmstPmluID0gTlVMTDsKKwlsaW5rLT5pbl9lcC0+ZGVzYyA9IE5VTEw7CiAKIAl1c2JfZXBfZGlzYWJsZShsaW5rLT5vdXRfZXApOwogCXNwaW5fbG9jaygmZGV2LT5yZXFfbG9jayk7CkBAIC05ODQsNyArOTg2LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmRldi0+cmVxX2xvY2spOwogCWxpbmstPm91dF9lcC0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCWxpbmstPm91dCA9IE5VTEw7CisJbGluay0+b3V0X2VwLT5kZXNjID0gTlVMTDsKIAogCS8qIGZpbmlzaCBmb3JnZXR0aW5nIGFib3V0IHRoaXMgVVNCIGxpbmsgZXBpc29kZSAqLwogCWRldi0+aGVhZGVyX2xlbiA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuaAppbmRleCBiNTZlMWU3Li5jOTY2NDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmgKQEAgLTUyLDEwICs1Miw2IEBACiAJc3RydWN0IHVzYl9lcAkJCSppbl9lcDsKIAlzdHJ1Y3QgdXNiX2VwCQkJKm91dF9lcDsKIAotCS8qIGRlc2NyaXB0b3JzIG1hdGNoIGRldmljZSBzcGVlZCBhdCBnZXRoZXJfY29ubmVjdCgpIHRpbWUgKi8KLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmluOwotCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgkqb3V0OwotCiAJYm9vbAkJCQlpc196bHBfb2s7CiAKIAl1MTYJCQkJY2RjX2ZpbHRlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91X3NlcmlhbC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3Vfc2VyaWFsLmMKaW5kZXggNDBmNzcxNi4uYThhYTQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3Vfc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3Vfc2VyaWFsLmMKQEAgLTEyNDcsMTIgKzEyNDcsMTIgQEAKIAlwb3J0ID0gcG9ydHNbcG9ydF9udW1dLnBvcnQ7CiAKIAkvKiBhY3RpdmF0ZSB0aGUgZW5kcG9pbnRzICovCi0Jc3RhdHVzID0gdXNiX2VwX2VuYWJsZShnc2VyLT5pbiwgZ3Nlci0+aW5fZGVzYyk7CisJc3RhdHVzID0gdXNiX2VwX2VuYWJsZShnc2VyLT5pbik7CiAJaWYgKHN0YXR1cyA8IDApCiAJCXJldHVybiBzdGF0dXM7CiAJZ3Nlci0+aW4tPmRyaXZlcl9kYXRhID0gcG9ydDsKIAotCXN0YXR1cyA9IHVzYl9lcF9lbmFibGUoZ3Nlci0+b3V0LCBnc2VyLT5vdXRfZGVzYyk7CisJc3RhdHVzID0gdXNiX2VwX2VuYWJsZShnc2VyLT5vdXQpOwogCWlmIChzdGF0dXMgPCAwKQogCQlnb3RvIGZhaWxfb3V0OwogCWdzZXItPm91dC0+ZHJpdmVyX2RhdGEgPSBwb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3Vfc2VyaWFsLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9zZXJpYWwuaAppbmRleCAzMDBmMGVkLi45YjBmZTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9zZXJpYWwuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9zZXJpYWwuaApAQCAtMzUsOCArMzUsNiBAQAogCiAJc3RydWN0IHVzYl9lcAkJCSppbjsKIAlzdHJ1Y3QgdXNiX2VwCQkJKm91dDsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmluX2Rlc2M7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpvdXRfZGVzYzsKIAogCS8qIFJFVklTSVQgYXZvaWQgdGhpcyBDREMtQUNNIHN1cHBvcnQgaGFyZGVyIC4uLiAqLwogCXN0cnVjdCB1c2JfY2RjX2xpbmVfY29kaW5nIHBvcnRfbGluZV9jb2Rpbmc7CS8qIDk2MDAtOC1OLTEgZXRjICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjLWNvcmUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YmE0NzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjLWNvcmUuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyoqCisgKiB1ZGMuYyAtIENvcmUgVURDIEZyYW1ld29yaworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cworICogQXV0aG9yOiBGZWxpcGUgQmFsYmkgPGJhbGJpQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgIG9mCisgKiB0aGUgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKworLyoqCisgKiBzdHJ1Y3QgdXNiX3VkYyAtIGRlc2NyaWJlcyBvbmUgdXNiIGRldmljZSBjb250cm9sbGVyCisgKiBAZHJpdmVyIC0gdGhlIGdhZGdldCBkcml2ZXIgcG9pbnRlci4gRm9yIHVzZSBieSB0aGUgY2xhc3MgY29kZQorICogQGRldiAtIHRoZSBjaGlsZCBkZXZpY2UgdG8gdGhlIGFjdHVhbCBjb250cm9sbGVyCisgKiBAZ2FkZ2V0IC0gdGhlIGdhZGdldC4gRm9yIHVzZSBieSB0aGUgY2xhc3MgY29kZQorICogQGxpc3QgLSBmb3IgdXNlIGJ5IHRoZSB1ZGMgY2xhc3MgZHJpdmVyCisgKgorICogVGhpcyByZXByZXNlbnRzIHRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGJ5IHRoZSBVREMtY2xhc3MKKyAqIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgdWRjIGRyaXZlciBhbmQgZ2FkZ2V0IHRvZ2V0aGVyLgorICovCitzdHJ1Y3QgdXNiX3VkYyB7CisJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyCSpkcml2ZXI7CisJc3RydWN0IHVzYl9nYWRnZXQJCSpnYWRnZXQ7CisJc3RydWN0IGRldmljZQkJCWRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OworfTsKKworc3RhdGljIHN0cnVjdCBjbGFzcyAqdWRjX2NsYXNzOworc3RhdGljIExJU1RfSEVBRCh1ZGNfbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKHVkY19sb2NrKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIHVzYl9nYWRnZXRfc3RhcnQgLSB0ZWxscyB1c2IgZGV2aWNlIGNvbnRyb2xsZXIgdG8gc3RhcnQgdXAKKyAqIEBnYWRnZXQ6IFRoZSBnYWRnZXQgd2Ugd2FudCB0byBnZXQgc3RhcnRlZAorICogQGRyaXZlcjogVGhlIGRyaXZlciB3ZSB3YW50IHRvIGJpbmQgdG8gQGdhZGdldAorICogQGJpbmQ6IFRoZSBiaW5kIGZ1bmN0aW9uIGZvciBAZHJpdmVyCisgKgorICogVGhpcyBjYWxsIGlzIGlzc3VlZCBieSB0aGUgVURDIENsYXNzIGRyaXZlciB3aGVuIGl0J3MgYWJvdXQKKyAqIHRvIHJlZ2lzdGVyIGEgZ2FkZ2V0IGRyaXZlciB0byB0aGUgZGV2aWNlIGNvbnRyb2xsZXIsIGJlZm9yZQorICogY2FsbGluZyBnYWRnZXQgZHJpdmVyJ3MgYmluZCgpIG1ldGhvZC4KKyAqCisgKiBJdCBhbGxvd3MgdGhlIGNvbnRyb2xsZXIgdG8gYmUgcG93ZXJlZCBvZmYgdW50aWwgc3RyaWN0bHkKKyAqIG5lY2Vzc2FyeSB0byBoYXZlIGl0IHBvd2VyZWQgb24uCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgbmVnYXRpdmUgZXJybm8uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9nYWRnZXRfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwKKwkJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIsCisJCWludCAoKmJpbmQpKHN0cnVjdCB1c2JfZ2FkZ2V0ICopKQoreworCXJldHVybiBnYWRnZXQtPm9wcy0+c3RhcnQoZHJpdmVyLCBiaW5kKTsKK30KKworLyoqCisgKiB1c2JfZ2FkZ2V0X3VkY19zdGFydCAtIHRlbGxzIHVzYiBkZXZpY2UgY29udHJvbGxlciB0byBzdGFydCB1cAorICogQGdhZGdldDogVGhlIGdhZGdldCB3ZSB3YW50IHRvIGdldCBzdGFydGVkCisgKiBAZHJpdmVyOiBUaGUgZHJpdmVyIHdlIHdhbnQgdG8gYmluZCB0byBAZ2FkZ2V0CisgKgorICogVGhpcyBjYWxsIGlzIGlzc3VlZCBieSB0aGUgVURDIENsYXNzIGRyaXZlciB3aGVuIGl0J3MgYWJvdXQKKyAqIHRvIHJlZ2lzdGVyIGEgZ2FkZ2V0IGRyaXZlciB0byB0aGUgZGV2aWNlIGNvbnRyb2xsZXIsIGJlZm9yZQorICogY2FsbGluZyBnYWRnZXQgZHJpdmVyJ3MgYmluZCgpIG1ldGhvZC4KKyAqCisgKiBJdCBhbGxvd3MgdGhlIGNvbnRyb2xsZXIgdG8gYmUgcG93ZXJlZCBvZmYgdW50aWwgc3RyaWN0bHkKKyAqIG5lY2Vzc2FyeSB0byBoYXZlIGl0IHBvd2VyZWQgb24uCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgbmVnYXRpdmUgZXJybm8uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9nYWRnZXRfdWRjX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsCisJCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXJldHVybiBnYWRnZXQtPm9wcy0+dWRjX3N0YXJ0KGdhZGdldCwgZHJpdmVyKTsKK30KKworLyoqCisgKiB1c2JfZ2FkZ2V0X3N0b3AgLSB0ZWxscyB1c2IgZGV2aWNlIGNvbnRyb2xsZXIgd2UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlCisgKiBAZ2FkZ2V0OiBUaGUgZGV2aWNlIHdlIHdhbnQgdG8gc3RvcCBhY3Rpdml0eQorICogQGRyaXZlcjogVGhlIGRyaXZlciB0byB1bmJpbmQgZnJvbSBAZ2FkZ2V0CisgKgorICogVGhpcyBjYWxsIGlzIGlzc3VlZCBieSB0aGUgVURDIENsYXNzIGRyaXZlciBhZnRlciBjYWxsaW5nCisgKiBnYWRnZXQgZHJpdmVyJ3MgdW5iaW5kKCkgbWV0aG9kLgorICoKKyAqIFRoZSBkZXRhaWxzIGFyZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYywgYnV0IGl0IGNhbiBnbyBhcworICogZmFyIGFzIHBvd2VyaW5nIG9mZiBVREMgY29tcGxldGVseSBhbmQgZGlzYWJsZSBpdHMgZGF0YQorICogbGluZSBwdWxsdXBzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2dhZGdldF9zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsCisJCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCWdhZGdldC0+b3BzLT5zdG9wKGRyaXZlcik7Cit9CisKKy8qKgorICogdXNiX2dhZGdldF91ZGNfc3RvcCAtIHRlbGxzIHVzYiBkZXZpY2UgY29udHJvbGxlciB3ZSBkb24ndCBuZWVkIGl0IGFueW1vcmUKKyAqIEBnYWRnZXQ6IFRoZSBkZXZpY2Ugd2Ugd2FudCB0byBzdG9wIGFjdGl2aXR5CisgKiBAZHJpdmVyOiBUaGUgZHJpdmVyIHRvIHVuYmluZCBmcm9tIEBnYWRnZXQKKyAqCisgKiBUaGlzIGNhbGwgaXMgaXNzdWVkIGJ5IHRoZSBVREMgQ2xhc3MgZHJpdmVyIGFmdGVyIGNhbGxpbmcKKyAqIGdhZGdldCBkcml2ZXIncyB1bmJpbmQoKSBtZXRob2QuCisgKgorICogVGhlIGRldGFpbHMgYXJlIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLCBidXQgaXQgY2FuIGdvIGFzCisgKiBmYXIgYXMgcG93ZXJpbmcgb2ZmIFVEQyBjb21wbGV0ZWx5IGFuZCBkaXNhYmxlIGl0cyBkYXRhCisgKiBsaW5lIHB1bGx1cHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1c2JfZ2FkZ2V0X3VkY19zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsCisJCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCWdhZGdldC0+b3BzLT51ZGNfc3RvcChnYWRnZXQsIGRyaXZlcik7Cit9CisKKy8qKgorICogdXNiX3VkY19yZWxlYXNlIC0gcmVsZWFzZSB0aGUgdXNiX3VkYyBzdHJ1Y3QKKyAqIEBkZXY6IHRoZSBkZXYgbWVtYmVyIHdpdGhpbiB1c2JfdWRjCisgKgorICogVGhpcyBpcyBjYWxsZWQgYnkgZHJpdmVyJ3MgY29yZSBpbiBvcmRlciB0byBmcmVlIG1lbW9yeSBvbmNlIHRoZSBsYXN0CisgKiByZWZlcmVuY2UgaXMgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyB2b2lkIHVzYl91ZGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYl91ZGMgKnVkYzsKKworCXVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB1c2JfdWRjLCBkZXYpOworCWRldl9kYmcoZGV2LCAicmVsZWFzaW5nICclcydcbiIsIGRldl9uYW1lKGRldikpOworCWtmcmVlKHVkYyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICp1c2JfdWRjX2F0dHJfZ3JvdXBzW107CisvKioKKyAqIHVzYl9hZGRfZ2FkZ2V0X3VkYyAtIGFkZHMgYSBuZXcgZ2FkZ2V0IHRvIHRoZSB1ZGMgY2xhc3MgZHJpdmVyIGxpc3QKKyAqIEBwYXJlbnQ6IHRoZSBwYXJlbnQgZGV2aWNlIHRvIHRoaXMgdWRjLiBVc3VhbGx5IHRoZSBjb250cm9sbGVyCisgKiBkcml2ZXIncyBkZXZpY2UuCisgKiBAZ2FkZ2V0OiB0aGUgZ2FkZ2V0IHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0CisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZS4KKyAqLworaW50IHVzYl9hZGRfZ2FkZ2V0X3VkYyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJc3RydWN0IHVzYl91ZGMJCSp1ZGM7CisJaW50CQkJcmV0ID0gLUVOT01FTTsKKworCXVkYyA9IGt6YWxsb2Moc2l6ZW9mKCp1ZGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVkYykKKwkJZ290byBlcnIxOworCisJZGV2aWNlX2luaXRpYWxpemUoJnVkYy0+ZGV2KTsKKwl1ZGMtPmRldi5yZWxlYXNlID0gdXNiX3VkY19yZWxlYXNlOworCXVkYy0+ZGV2LmNsYXNzID0gdWRjX2NsYXNzOworCXVkYy0+ZGV2Lmdyb3VwcyA9IHVzYl91ZGNfYXR0cl9ncm91cHM7CisJdWRjLT5kZXYucGFyZW50ID0gcGFyZW50OworCXJldCA9IGRldl9zZXRfbmFtZSgmdWRjLT5kZXYsICIlcyIsIGtvYmplY3RfbmFtZSgmcGFyZW50LT5rb2JqKSk7CisJaWYgKHJldCkKKwkJZ290byBlcnIyOworCisJdWRjLT5nYWRnZXQgPSBnYWRnZXQ7CisKKwltdXRleF9sb2NrKCZ1ZGNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmdWRjLT5saXN0LCAmdWRjX2xpc3QpOworCisJcmV0ID0gZGV2aWNlX2FkZCgmdWRjLT5kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMzsKKworCW11dGV4X3VubG9jaygmdWRjX2xvY2spOworCisJcmV0dXJuIDA7CitlcnIzOgorCWxpc3RfZGVsKCZ1ZGMtPmxpc3QpOworCW11dGV4X3VubG9jaygmdWRjX2xvY2spOworCitlcnIyOgorCXB1dF9kZXZpY2UoJnVkYy0+ZGV2KTsKKworZXJyMToKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2FkZF9nYWRnZXRfdWRjKTsKKworc3RhdGljIGludCB1ZGNfaXNfbmV3c3R5bGUoc3RydWN0IHVzYl91ZGMgKnVkYykKK3sKKwlpZiAodWRjLT5nYWRnZXQtPm9wcy0+dWRjX3N0YXJ0ICYmIHVkYy0+Z2FkZ2V0LT5vcHMtPnVkY19zdG9wKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCB1c2JfZ2FkZ2V0X3JlbW92ZV9kcml2ZXIoc3RydWN0IHVzYl91ZGMgKnVkYykKK3sKKwlkZXZfZGJnKCZ1ZGMtPmRldiwgInVucmVnaXN0ZXJpbmcgVURDIGRyaXZlciBbJXNdXG4iLAorCQkJdWRjLT5nYWRnZXQtPm5hbWUpOworCisJa29iamVjdF91ZXZlbnQoJnVkYy0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFKTsKKworCWlmICh1ZGNfaXNfbmV3c3R5bGUodWRjKSkgeworCQl1c2JfZ2FkZ2V0X2Rpc2Nvbm5lY3QodWRjLT5nYWRnZXQpOworCQl1ZGMtPmRyaXZlci0+dW5iaW5kKHVkYy0+Z2FkZ2V0KTsKKwkJdXNiX2dhZGdldF91ZGNfc3RvcCh1ZGMtPmdhZGdldCwgdWRjLT5kcml2ZXIpOworCisJfSBlbHNlIHsKKwkJdXNiX2dhZGdldF9zdG9wKHVkYy0+Z2FkZ2V0LCB1ZGMtPmRyaXZlcik7CisJfQorCisJdWRjLT5kcml2ZXIgPSBOVUxMOworCXVkYy0+ZGV2LmRyaXZlciA9IE5VTEw7Cit9CisKKy8qKgorICogdXNiX2RlbF9nYWRnZXRfdWRjIC0gZGVsZXRlcyBAdWRjIGZyb20gdWRjX2xpc3QKKyAqIEBnYWRnZXQ6IHRoZSBnYWRnZXQgdG8gYmUgcmVtb3ZlZC4KKyAqCisgKiBUaGlzLCB3aWxsIGNhbGwgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcigpIGlmCisgKiB0aGUgQHVkYyBpcyBzdGlsbCBidXN5LgorICovCit2b2lkIHVzYl9kZWxfZ2FkZ2V0X3VkYyhzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQoreworCXN0cnVjdCB1c2JfdWRjCQkqdWRjID0gTlVMTDsKKworCW11dGV4X2xvY2soJnVkY19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVkYywgJnVkY19saXN0LCBsaXN0KQorCQlpZiAodWRjLT5nYWRnZXQgPT0gZ2FkZ2V0KQorCQkJZ290byBmb3VuZDsKKworCWRldl9lcnIoZ2FkZ2V0LT5kZXYucGFyZW50LCAiZ2FkZ2V0IG5vdCByZWdpc3RlcmVkLlxuIik7CisJbXV0ZXhfdW5sb2NrKCZ1ZGNfbG9jayk7CisKKwlyZXR1cm47CisKK2ZvdW5kOgorCWRldl92ZGJnKGdhZGdldC0+ZGV2LnBhcmVudCwgInVucmVnaXN0ZXJpbmcgZ2FkZ2V0XG4iKTsKKworCWxpc3RfZGVsKCZ1ZGMtPmxpc3QpOworCW11dGV4X3VubG9jaygmdWRjX2xvY2spOworCisJaWYgKHVkYy0+ZHJpdmVyKQorCQl1c2JfZ2FkZ2V0X3JlbW92ZV9kcml2ZXIodWRjKTsKKworCWtvYmplY3RfdWV2ZW50KCZ1ZGMtPmRldi5rb2JqLCBLT0JKX1JFTU9WRSk7CisJZGV2aWNlX3VucmVnaXN0ZXIoJnVkYy0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9kZWxfZ2FkZ2V0X3VkYyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKK3sKKwlzdHJ1Y3QgdXNiX3VkYwkJKnVkYyA9IE5VTEw7CisJaW50CQkJcmV0OworCisJaWYgKCFkcml2ZXIgfHwgIWJpbmQgfHwgIWRyaXZlci0+c2V0dXApCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdWRjX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodWRjLCAmdWRjX2xpc3QsIGxpc3QpIHsKKwkJLyogRm9yIG5vdyB3ZSB0YWtlIHRoZSBmaXJzdCBvbmUgKi8KKwkJaWYgKCF1ZGMtPmRyaXZlcikKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJcHJfZGVidWcoImNvdWxkbid0IGZpbmQgYW4gYXZhaWxhYmxlIFVEQ1xuIik7CisJbXV0ZXhfdW5sb2NrKCZ1ZGNfbG9jayk7CisJcmV0dXJuIC1FTk9ERVY7CisKK2ZvdW5kOgorCWRldl9kYmcoJnVkYy0+ZGV2LCAicmVnaXN0ZXJpbmcgVURDIGRyaXZlciBbJXNdXG4iLAorCQkJZHJpdmVyLT5mdW5jdGlvbik7CisKKwl1ZGMtPmRyaXZlciA9IGRyaXZlcjsKKwl1ZGMtPmRldi5kcml2ZXIgPSAmZHJpdmVyLT5kcml2ZXI7CisKKwlpZiAodWRjX2lzX25ld3N0eWxlKHVkYykpIHsKKwkJcmV0ID0gYmluZCh1ZGMtPmdhZGdldCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjE7CisJCXJldCA9IHVzYl9nYWRnZXRfdWRjX3N0YXJ0KHVkYy0+Z2FkZ2V0LCBkcml2ZXIpOworCQlpZiAocmV0KSB7CisJCQlkcml2ZXItPnVuYmluZCh1ZGMtPmdhZGdldCk7CisJCQlnb3RvIGVycjE7CisJCX0KKwkJdXNiX2dhZGdldF9jb25uZWN0KHVkYy0+Z2FkZ2V0KTsKKwl9IGVsc2UgeworCisJCXJldCA9IHVzYl9nYWRnZXRfc3RhcnQodWRjLT5nYWRnZXQsIGRyaXZlciwgYmluZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjE7CisKKwl9CisKKwlrb2JqZWN0X3VldmVudCgmdWRjLT5kZXYua29iaiwgS09CSl9DSEFOR0UpOworCW11dGV4X3VubG9jaygmdWRjX2xvY2spOworCXJldHVybiAwOworCitlcnIxOgorCWRldl9lcnIoJnVkYy0+ZGV2LCAiZmFpbGVkIHRvIHN0YXJ0ICVzOiAlZFxuIiwKKwkJCXVkYy0+ZHJpdmVyLT5mdW5jdGlvbiwgcmV0KTsKKwl1ZGMtPmRyaXZlciA9IE5VTEw7CisJdWRjLT5kZXYuZHJpdmVyID0gTlVMTDsKKwltdXRleF91bmxvY2soJnVkY19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOworCitpbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgdXNiX3VkYwkJKnVkYyA9IE5VTEw7CisJaW50CQkJcmV0ID0gLUVOT0RFVjsKKworCWlmICghZHJpdmVyIHx8ICFkcml2ZXItPnVuYmluZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ1ZGNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1ZGMsICZ1ZGNfbGlzdCwgbGlzdCkKKwkJaWYgKHVkYy0+ZHJpdmVyID09IGRyaXZlcikgeworCQkJdXNiX2dhZGdldF9yZW1vdmVfZHJpdmVyKHVkYyk7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCW11dGV4X3VubG9jaygmdWRjX2xvY2spOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCB1c2JfdWRjX3NycF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBuKQoreworCXN0cnVjdCB1c2JfdWRjCQkqdWRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoc3lzZnNfc3RyZXEoYnVmLCAiMSIpKQorCQl1c2JfZ2FkZ2V0X3dha2V1cCh1ZGMtPmdhZGdldCk7CisKKwlyZXR1cm4gbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihzcnAsIFNfSVdVU1IsIE5VTEwsIHVzYl91ZGNfc3JwX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgdXNiX3VkY19zb2Z0Y29ubl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBuKQoreworCXN0cnVjdCB1c2JfdWRjCQkqdWRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoc3lzZnNfc3RyZXEoYnVmLCAiY29ubmVjdCIpKSB7CisJCXVzYl9nYWRnZXRfY29ubmVjdCh1ZGMtPmdhZGdldCk7CisJfSBlbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJkaXNjb25uZWN0IikpIHsKKwkJdXNiX2dhZGdldF9kaXNjb25uZWN0KHVkYy0+Z2FkZ2V0KTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGRldiwgInVuc3VwcG9ydGVkIGNvbW1hbmQgJyVzJ1xuIiwgYnVmKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIG47Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc29mdF9jb25uZWN0LCBTX0lXVVNSLCBOVUxMLCB1c2JfdWRjX3NvZnRjb25uX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgdXNiX3VkY19zcGVlZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX3VkYwkJKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB1c2JfdWRjLCBkZXYpOworCXN0cnVjdCB1c2JfZ2FkZ2V0CSpnYWRnZXQgPSB1ZGMtPmdhZGdldDsKKworCXN3aXRjaCAoZ2FkZ2V0LT5zcGVlZCkgeworCWNhc2UgVVNCX1NQRUVEX0xPVzoKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAibG93LXNwZWVkXG4iKTsKKwljYXNlIFVTQl9TUEVFRF9GVUxMOgorCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJmdWxsLXNwZWVkXG4iKTsKKwljYXNlIFVTQl9TUEVFRF9ISUdIOgorCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJoaWdoLXNwZWVkXG4iKTsKKwljYXNlIFVTQl9TUEVFRF9XSVJFTEVTUzoKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAid2lyZWxlc3NcbiIpOworCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgorCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJzdXBlci1zcGVlZFxuIik7CisJY2FzZSBVU0JfU1BFRURfVU5LTk9XTjoJLyogRkFMTFRIUk9VR0ggKi8KKwlkZWZhdWx0OgorCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJVTktOT1dOXG4iKTsKKwl9Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc3BlZWQsIFNfSVJVU1IsIHVzYl91ZGNfc3BlZWRfc2hvdywgTlVMTCk7CisKKyNkZWZpbmUgVVNCX1VEQ19BVFRSKG5hbWUpCQkJCQlcCitzc2l6ZV90IHVzYl91ZGNfIyNuYW1lIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX3VkYwkJKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB1c2JfdWRjLCBkZXYpOyBcCisJc3RydWN0IHVzYl9nYWRnZXQJKmdhZGdldCA9IHVkYy0+Z2FkZ2V0OwkJXAorCQkJCQkJCQlcCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGdhZGdldC0+bmFtZSk7CVwKK30JCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVVNSLCB1c2JfdWRjXyMjbmFtZSMjX3Nob3csIE5VTEwpCisKK3N0YXRpYyBVU0JfVURDX0FUVFIoaXNfZHVhbHNwZWVkKTsKK3N0YXRpYyBVU0JfVURDX0FUVFIoaXNfb3RnKTsKK3N0YXRpYyBVU0JfVURDX0FUVFIoaXNfYV9wZXJpcGhlcmFsKTsKK3N0YXRpYyBVU0JfVURDX0FUVFIoYl9obnBfZW5hYmxlKTsKK3N0YXRpYyBVU0JfVURDX0FUVFIoYV9obnBfc3VwcG9ydCk7CitzdGF0aWMgVVNCX1VEQ19BVFRSKGFfYWx0X2hucF9zdXBwb3J0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnVzYl91ZGNfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfc3JwLmF0dHIsCisJJmRldl9hdHRyX3NvZnRfY29ubmVjdC5hdHRyLAorCSZkZXZfYXR0cl9zcGVlZC5hdHRyLAorCisJJmRldl9hdHRyX2lzX2R1YWxzcGVlZC5hdHRyLAorCSZkZXZfYXR0cl9pc19vdGcuYXR0ciwKKwkmZGV2X2F0dHJfaXNfYV9wZXJpcGhlcmFsLmF0dHIsCisJJmRldl9hdHRyX2JfaG5wX2VuYWJsZS5hdHRyLAorCSZkZXZfYXR0cl9hX2hucF9zdXBwb3J0LmF0dHIsCisJJmRldl9hdHRyX2FfYWx0X2hucF9zdXBwb3J0LmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHVzYl91ZGNfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSB1c2JfdWRjX2F0dHJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnVzYl91ZGNfYXR0cl9ncm91cHNbXSA9IHsKKwkmdXNiX3VkY19hdHRyX2dyb3VwLAorCU5VTEwsCit9OworCitzdGF0aWMgaW50IHVzYl91ZGNfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCXN0cnVjdCB1c2JfdWRjCQkqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHVzYl91ZGMsIGRldik7CisJaW50CQkJcmV0OworCisJcmV0ID0gYWRkX3VldmVudF92YXIoZW52LCAiVVNCX1VEQ19OQU1FPSVzIiwgdWRjLT5nYWRnZXQtPm5hbWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWRkIHVldmVudCBVU0JfVURDX05BTUVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICh1ZGMtPmRyaXZlcikgeworCQlyZXQgPSBhZGRfdWV2ZW50X3ZhcihlbnYsICJVU0JfVURDX0RSSVZFUj0lcyIsCisJCQkJdWRjLT5kcml2ZXItPmZ1bmN0aW9uKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWRkIHVldmVudCBVU0JfVURDX0RSSVZFUlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHVzYl91ZGNfaW5pdCh2b2lkKQoreworCXVkY19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInVkYyIpOworCWlmIChJU19FUlIodWRjX2NsYXNzKSkgeworCQlwcl9lcnIoImZhaWxlZCB0byBjcmVhdGUgdWRjIGNsYXNzIC0tPiAlbGRcbiIsCisJCQkJUFRSX0VSUih1ZGNfY2xhc3MpKTsKKwkJcmV0dXJuIFBUUl9FUlIodWRjX2NsYXNzKTsKKwl9CisKKwl1ZGNfY2xhc3MtPmRldl91ZXZlbnQgPSB1c2JfdWRjX3VldmVudDsKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbCh1c2JfdWRjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX3VkY19leGl0KHZvaWQpCit7CisJY2xhc3NfZGVzdHJveSh1ZGNfY2xhc3MpOworfQorbW9kdWxlX2V4aXQodXNiX3VkY19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJVREMgRnJhbWV3b3JrIik7CitNT0RVTEVfQVVUSE9SKCJGZWxpcGUgQmFsYmkgPGJhbGJpQHRpLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC93ZWJjYW0uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC93ZWJjYW0uYwppbmRleCBhNWEwZmRiLi5kZjY4ODJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvd2ViY2FtLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3dlYmNhbS5jCkBAIC0zNzMsNiArMzczLDcgQEAKIAkubmFtZQkJPSAiZ193ZWJjYW0iLAogCS5kZXYJCT0gJndlYmNhbV9kZXZpY2VfZGVzY3JpcHRvciwKIAkuc3RyaW5ncwk9IHdlYmNhbV9kZXZpY2Vfc3RyaW5ncywKKwkubWF4X3NwZWVkCT0gVVNCX1NQRUVEX0hJR0gsCiAJLnVuYmluZAkJPSB3ZWJjYW1fdW5iaW5kLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKaW5kZXggNmQxNmRiOS4uMDBlMmZkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCkBAIC0zNDAsNiArMzQwLDcgQEAKIAkubmFtZQkJPSAiemVybyIsCiAJLmRldgkJPSAmZGV2aWNlX2Rlc2MsCiAJLnN0cmluZ3MJPSBkZXZfc3RyaW5ncywKKwkubWF4X3NwZWVkCT0gVVNCX1NQRUVEX1NVUEVSLAogCS51bmJpbmQJCT0gemVyb191bmJpbmQsCiAJLnN1c3BlbmQJPSB6ZXJvX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSB6ZXJvX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1hdGg3OS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWF0aDc5LmMKaW5kZXggOThjYzhhMS4uNGQyZTg4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWF0aDc5LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWF0aDc5LmMKQEAgLTQ0LDcgKzQ0LDYgQEAKIAlzdHJ1Y3QgZWhjaV9oY2QgKmVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOwogCWNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgKmlkOwotCWludCBoY2xlbmd0aDsKIAlpbnQgcmV0OwogCiAJaWQgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpOwpAQCAtNTMsMjAgKzUyLDIzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWhjbGVuZ3RoID0gSENfTEVOR1RIKGVoY2ksIGVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPmNhcHMtPmhjX2NhcGJhc2UpKTsKIAlzd2l0Y2ggKGlkLT5kcml2ZXJfZGF0YSkgewogCWNhc2UgRUhDSV9BVEg3OV9JUF9WMToKIAkJZWhjaS0+aGFzX3N5bm9wc3lzX2hjX2J1ZyA9IDE7CiAKIAkJZWhjaS0+Y2FwcyA9IGhjZC0+cmVnczsKLQkJZWhjaS0+cmVncyA9IGhjZC0+cmVncyArIGhjbGVuZ3RoOworCQllaGNpLT5yZWdzID0gaGNkLT5yZWdzICsKKwkJCUhDX0xFTkdUSChlaGNpLAorCQkJCSAgZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOwogCQlicmVhazsKIAogCWNhc2UgRUhDSV9BVEg3OV9JUF9WMjoKIAkJaGNkLT5oYXNfdHQgPSAxOwogCiAJCWVoY2ktPmNhcHMgPSBoY2QtPnJlZ3MgKyAweDEwMDsKLQkJZWhjaS0+cmVncyA9IGhjZC0+cmVncyArIDB4MTAwICsgaGNsZW5ndGg7CisJCWVoY2ktPnJlZ3MgPSBoY2QtPnJlZ3MgKyAweDEwMCArCisJCQlIQ19MRU5HVEgoZWhjaSwKKwkJCQkgIGVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPmNhcHMtPmhjX2NhcGJhc2UpKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMTQ2LDcgKzE0OCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaGNkLT5yc3JjX3N0YXJ0CT0gcmVzLT5zdGFydDsKLQloY2QtPnJzcmNfbGVuCT0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwloY2QtPnJzcmNfbGVuCT0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuLCBoY2RfbmFtZSkpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY29udHJvbGxlciBhbHJlYWR5IGluIHVzZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktY25zM3h4eC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWNuczN4eHguYwppbmRleCBkNDE3NDVjLi42NTM2YWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktY25zM3h4eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1jbnMzeHh4LmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogCX0KIAogCWhjZC0+cnNyY19zdGFydCA9IHJlcy0+c3RhcnQ7Ci0JaGNkLT5yc3JjX2xlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJaGNkLT5yc3JjX2xlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbiwKIAkJCQlkcml2ZXItPmRlc2NyaXB0aW9uKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWZzbC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWZzbC5jCmluZGV4IGYzODBiZjkuLjM0YTMxNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1mc2wuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZnNsLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCQlnb3RvIGVycjI7CiAJfQogCWhjZC0+cnNyY19zdGFydCA9IHJlcy0+c3RhcnQ7Ci0JaGNkLT5yc3JjX2xlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJaGNkLT5yc3JjX2xlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4sCiAJCQkJZHJpdmVyLT5kZXNjcmlwdGlvbikpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY29udHJvbGxlciBhbHJlYWR5IGluIHVzZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZ3JsaWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1ncmxpYi5jCmluZGV4IDkzYjIzMGQuLmZkZmQ4YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1ncmxpYi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1ncmxpYi5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAloY2QtPnJzcmNfc3RhcnQgPSByZXMuc3RhcnQ7Ci0JaGNkLT5yc3JjX2xlbiA9IHJlcy5lbmQgLSByZXMuc3RhcnQgKyAxOworCWhjZC0+cnNyY19sZW4gPSByZXNvdXJjZV9zaXplKCZyZXMpOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuLCBoY2RfbmFtZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZFxuIiwgX19GSUxFX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCmluZGV4IGI0MzVlZDYuLmY3MmFlMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKQEAgLTEsNCArMSw4IEBACiAvKgorICogRW5oYW5jZWQgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSAoRUhDSSkgZHJpdmVyIGZvciBVU0IuCisgKgorICogTWFpbnRhaW5lcjogQWxhbiBTdGVybiA8c3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVkdT4KKyAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBieSBEYXZpZCBCcm93bmVsbAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC05MCw3ICs5NCw4IEBACiAjZGVmaW5lIEVIQ0lfSUFBX01TRUNTCQkxMAkJLyogYXJiaXRyYXJ5ICovCiAjZGVmaW5lIEVIQ0lfSU9fSklGRklFUwkJKEhaLzEwKQkJLyogaW8gd2F0Y2hkb2cgPiBpcnFfdGhyZXNoICovCiAjZGVmaW5lIEVIQ0lfQVNZTkNfSklGRklFUwkoSFovMjApCQkvKiBhc3luYyBpZGxlIHRpbWVvdXQgKi8KLSNkZWZpbmUgRUhDSV9TSFJJTktfRlJBTUVTCTUJCS8qIGFzeW5jIHFoIHVubGluayBkZWxheSAqLworI2RlZmluZSBFSENJX1NIUklOS19KSUZGSUVTCShESVZfUk9VTkRfVVAoSFosIDIwMCkgKyAxKQorCQkJCQkJLyogMjAwLW1zIGFzeW5jIHFoIHVubGluayBkZWxheSAqLwogCiAvKiBJbml0aWFsIElSUSBsYXRlbmN5OiAgZmFzdGVyIHRoYW4gaHcgZGVmYXVsdCAqLwogc3RhdGljIGludCBsb2cyX2lycV90aHJlc2ggPSAwOwkJLy8gMCB0byA2CkBAIC0xMTAsNyArMTE1LDcgQEAKIC8qIGZvciBsaW5rIHBvd2VyIG1hbmFnZW1lbnQoTFBNKSBmZWF0dXJlICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGhpcmQ7CiBtb2R1bGVfcGFyYW0oaGlyZCwgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MoaGlyZCwgImhvc3QgaW5pdGlhdGVkIHJlc3VtZSBkdXJhdGlvbiwgKzEgZm9yIGVhY2ggNzV1c1xuIik7CitNT0RVTEVfUEFSTV9ERVNDKGhpcmQsICJob3N0IGluaXRpYXRlZCByZXN1bWUgZHVyYXRpb24sICsxIGZvciBlYWNoIDc1dXMiKTsKIAogI2RlZmluZQlJTlRSX01BU0sgKFNUU19JQUEgfCBTVFNfRkFUQUwgfCBTVFNfUENEIHwgU1RTX0VSUiB8IFNUU19JTlQpCiAKQEAgLTE0OCwxMCArMTUzLDcgQEAKIAkJCWJyZWFrOwogCQkvKiBjYXNlIFRJTUVSX0FTWU5DX1NIUklOSzogKi8KIAkJZGVmYXVsdDoKLQkJCS8qIGFkZCBhIGppZmZpZSBzaW5jZSB3ZSBzeW5jaCBhZ2FpbnN0IHRoZQotCQkJICogOCBLSHogdWZyYW1lIGNvdW50ZXIuCi0JCQkgKi8KLQkJCXQgPSBESVZfUk9VTkRfVVAoRUhDSV9TSFJJTktfRlJBTUVTICogSFosIDEwMDApICsgMTsKKwkJCXQgPSBFSENJX1NIUklOS19KSUZGSUVTOwogCQkJYnJlYWs7CiAJCX0KIAkJbW9kX3RpbWVyKCZlaGNpLT53YXRjaGRvZywgdCArIGppZmZpZXMpOwpAQCAtMzM2LDYgKzMzOCw3IEBACiAjaW5jbHVkZSAiZWhjaS1tZW0uYyIKICNpbmNsdWRlICJlaGNpLXEuYyIKICNpbmNsdWRlICJlaGNpLXNjaGVkLmMiCisjaW5jbHVkZSAiZWhjaS1zeXNmcy5jIgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC01MjAsNyArNTIzLDcgQEAKIAllaGNpX3Jlc2V0IChlaGNpKTsKIAlzcGluX3VubG9ja19pcnEoJmVoY2ktPmxvY2spOwogCi0JcmVtb3ZlX2NvbXBhbmlvbl9maWxlKGVoY2kpOworCXJlbW92ZV9zeXNmc19maWxlcyhlaGNpKTsKIAlyZW1vdmVfZGVidWdfZmlsZXMgKGVoY2kpOwogCiAJLyogcm9vdCBodWIgaXMgc2h1dCBkb3duIHNlcGFyYXRlbHkgKGZpcnN0LCB3aGVuIHBvc3NpYmxlKSAqLwpAQCAtNTcxLDYgKzU3NCwxMiBAQAogCWhjY19wYXJhbXMgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5jYXBzLT5oY2NfcGFyYW1zKTsKIAogCS8qCisJICogYnkgZGVmYXVsdCBzZXQgc3RhbmRhcmQgODAlICg9PSAxMDAgdXNlYy91ZnJhbWUpIG1heCBwZXJpb2RpYworCSAqIGJhbmR3aWR0aCBhcyByZXF1aXJlZCBieSBVU0IgMi4wCisJICovCisJZWhjaS0+dWZyYW1lX3BlcmlvZGljX21heCA9IDEwMDsKKworCS8qCiAJICogaHcgZGVmYXVsdDogMUsgcGVyaW9kaWMgbGlzdCBoZWFkcywgb25lIHBlciBmcmFtZS4KIAkgKiBwZXJpb2RpY19zaXplIGNhbiBzaHJpbmsgYnkgVVNCQ01EIHVwZGF0ZSBpZiBoY2NfcGFyYW1zIGFsbG93cy4KIAkgKi8KQEAgLTc1NCw3ICs3NjMsNyBAQAogCSAqIHNpbmNlIHRoZSBjbGFzcyBkZXZpY2UgaXNuJ3QgY3JlYXRlZCB0aGF0IGVhcmx5LgogCSAqLwogCWNyZWF0ZV9kZWJ1Z19maWxlcyhlaGNpKTsKLQljcmVhdGVfY29tcGFuaW9uX2ZpbGUoZWhjaSk7CisJY3JlYXRlX3N5c2ZzX2ZpbGVzKGVoY2kpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKaW5kZXggZWE2MTg0Yi4uYmYyYzhmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwpAQCAtNDcxLDI5ICs0NzEsNiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBEaXNwbGF5IHRoZSBwb3J0cyBkZWRpY2F0ZWQgdG8gdGhlIGNvbXBhbmlvbiBjb250cm9sbGVyICovCi1zdGF0aWMgc3NpemVfdCBzaG93X2NvbXBhbmlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpOwotCWludAkJCW5wb3J0cywgaW5kZXgsIG47Ci0JaW50CQkJY291bnQgPSBQQUdFX1NJWkU7Ci0JY2hhcgkJCSpwdHIgPSBidWY7Ci0KLQllaGNpID0gaGNkX3RvX2VoY2koYnVzX3RvX2hjZChkZXZfZ2V0X2RydmRhdGEoZGV2KSkpOwotCW5wb3J0cyA9IEhDU19OX1BPUlRTKGVoY2ktPmhjc19wYXJhbXMpOwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnBvcnRzOyArK2luZGV4KSB7Ci0JCWlmICh0ZXN0X2JpdChpbmRleCwgJmVoY2ktPmNvbXBhbmlvbl9wb3J0cykpIHsKLQkJCW4gPSBzY25wcmludGYocHRyLCBjb3VudCwgIiVkXG4iLCBpbmRleCArIDEpOwotCQkJcHRyICs9IG47Ci0JCQljb3VudCAtPSBuOwotCQl9Ci0JfQotCXJldHVybiBwdHIgLSBidWY7Ci19Ci0KIC8qCiAgKiBTZXRzIHRoZSBvd25lciBvZiBhIHBvcnQKICAqLwpAQCAtNTI4LDU4ICs1MDUsNiBAQAogCX0KIH0KIAotLyoKLSAqIERlZGljYXRlIG9yIHVuZGVkaWNhdGUgYSBwb3J0IHRvIHRoZSBjb21wYW5pb24gY29udHJvbGxlci4KLSAqIFN5bnRheCBpcyAiWy1dcG9ydG51bSIsIHdoZXJlIGEgbGVhZGluZyAnLScgc2lnbiBtZWFucwotICogcmV0dXJuIGNvbnRyb2wgb2YgdGhlIHBvcnQgdG8gdGhlIEVIQ0kgY29udHJvbGxlci4KLSAqLwotc3RhdGljIHNzaXplX3Qgc3RvcmVfY29tcGFuaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpOwotCWludAkJCXBvcnRudW0sIG5ld19vd25lcjsKLQotCWVoY2kgPSBoY2RfdG9fZWhjaShidXNfdG9faGNkKGRldl9nZXRfZHJ2ZGF0YShkZXYpKSk7Ci0JbmV3X293bmVyID0gUE9SVF9PV05FUjsJCS8qIE93bmVkIGJ5IGNvbXBhbmlvbiAqLwotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmcG9ydG51bSkgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHBvcnRudW0gPCAwKSB7Ci0JCXBvcnRudW0gPSAtIHBvcnRudW07Ci0JCW5ld19vd25lciA9IDA7CQkvKiBPd25lZCBieSBFSENJICovCi0JfQotCWlmIChwb3J0bnVtIDw9IDAgfHwgcG9ydG51bSA+IEhDU19OX1BPUlRTKGVoY2ktPmhjc19wYXJhbXMpKQotCQlyZXR1cm4gLUVOT0VOVDsKLQlwb3J0bnVtLS07Ci0JaWYgKG5ld19vd25lcikKLQkJc2V0X2JpdChwb3J0bnVtLCAmZWhjaS0+Y29tcGFuaW9uX3BvcnRzKTsKLQllbHNlCi0JCWNsZWFyX2JpdChwb3J0bnVtLCAmZWhjaS0+Y29tcGFuaW9uX3BvcnRzKTsKLQlzZXRfb3duZXIoZWhjaSwgcG9ydG51bSwgbmV3X293bmVyKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoY29tcGFuaW9uLCAwNjQ0LCBzaG93X2NvbXBhbmlvbiwgc3RvcmVfY29tcGFuaW9uKTsKLQotc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX2NvbXBhbmlvbl9maWxlKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSkKLXsKLQlpbnQJaSA9IDA7Ci0KLQkvKiB3aXRoIGludGVncmF0ZWQgVFQgdGhlcmUgaXMgbm8gY29tcGFuaW9uISAqLwotCWlmICghZWhjaV9pc19UREkoZWhjaSkpCi0JCWkgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZWhjaV90b19oY2QoZWhjaSktPnNlbGYuY29udHJvbGxlciwKLQkJCQkgICAgICAgJmRldl9hdHRyX2NvbXBhbmlvbik7Ci0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfY29tcGFuaW9uX2ZpbGUoc3RydWN0IGVoY2lfaGNkICplaGNpKQotewotCS8qIHdpdGggaW50ZWdyYXRlZCBUVCB0aGVyZSBpcyBubyBjb21wYW5pb24hICovCi0JaWYgKCFlaGNpX2lzX1RESShlaGNpKSkKLQkJZGV2aWNlX3JlbW92ZV9maWxlKGVoY2lfdG9faGNkKGVoY2kpLT5zZWxmLmNvbnRyb2xsZXIsCi0JCQkJICAgJmRldl9hdHRyX2NvbXBhbmlvbik7Ci19Ci0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludCBjaGVja19yZXNldF9jb21wbGV0ZSAoCkBAIC04OTEsMTAgKzgxNiwxMSBAQAogCQkJICogcG93ZXIgc3dpdGNoaW5nOyB0aGV5J3JlIGFsbG93ZWQgdG8ganVzdCBsaW1pdCB0aGUKIAkJCSAqIGN1cnJlbnQuICBraHViZCB3aWxsIHR1cm4gdGhlIHBvd2VyIGJhY2sgb24uCiAJCQkgKi8KLQkJCWlmIChIQ1NfUFBDIChlaGNpLT5oY3NfcGFyYW1zKSl7CisJCQlpZiAoKHRlbXAgJiBQT1JUX09DKSAmJiBIQ1NfUFBDKGVoY2ktPmhjc19wYXJhbXMpKSB7CiAJCQkJZWhjaV93cml0ZWwoZWhjaSwKIAkJCQkJdGVtcCAmIH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfUE9XRVIpLAogCQkJCQlzdGF0dXNfcmVnKTsKKwkJCQl0ZW1wID0gZWhjaV9yZWFkbChlaGNpLCBzdGF0dXNfcmVnKTsKIAkJCX0KIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaXhwNHh4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaXhwNHh4LmMKaW5kZXggNTBlNjAwZC4uYzQ0NjBmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWl4cDR4eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1peHA0eHguYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJCWdvdG8gZmFpbF9yZXF1ZXN0X3Jlc291cmNlOwogCX0KIAloY2QtPnJzcmNfc3RhcnQgPSByZXMtPnN0YXJ0OwotCWhjZC0+cnNyY19sZW4gPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCWhjZC0+cnNyY19sZW4gPSByZXNvdXJjZV9zaXplKHJlcyk7CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4sCiAJCQkJZHJpdmVyLT5kZXNjcmlwdGlvbikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1tc20uYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1tc20uYwppbmRleCBiNWEwYmY2Li41OTJkNWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktbXNtLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLW1zbS5jCkBAIC00MCwyNyArNDAsOSBAQAogCWludCByZXR2YWw7CiAKIAllaGNpLT5jYXBzID0gVVNCX0NBUExFTkdUSDsKLQllaGNpLT5yZWdzID0gVVNCX0NBUExFTkdUSCArCi0JCUhDX0xFTkdUSChlaGNpLCBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5jYXBzLT5oY19jYXBiYXNlKSk7Ci0JZGJnX2hjc19wYXJhbXMoZWhjaSwgInJlc2V0Iik7Ci0JZGJnX2hjY19wYXJhbXMoZWhjaSwgInJlc2V0Iik7Ci0KLQkvKiBjYWNoZSB0aGUgZGF0YSB0byBtaW5pbWl6ZSB0aGUgY2hpcCByZWFkcyovCi0JZWhjaS0+aGNzX3BhcmFtcyA9IGVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPmNhcHMtPmhjc19wYXJhbXMpOwotCiAJaGNkLT5oYXNfdHQgPSAxOwotCWVoY2ktPnNicm4gPSBIQ0RfVVNCMjsKIAotCXJldHZhbCA9IGVoY2lfaGFsdChlaGNpKTsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOwotCi0JLyogZGF0YSBzdHJ1Y3R1cmUgaW5pdCAqLwotCXJldHZhbCA9IGVoY2lfaW5pdChoY2QpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0KLQlyZXR2YWwgPSBlaGNpX3Jlc2V0KGVoY2kpOworCXJldHZhbCA9IGVoY2lfc2V0dXAoaGNkKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktb2N0ZW9uLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktb2N0ZW9uLmMKaW5kZXggZmY1NTc1Ny4uYzNiYTNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLW9jdGVvbi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1vY3Rlb24uYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzX21lbS0+c3RhcnQ7Ci0JaGNkLT5yc3JjX2xlbiA9IHJlc19tZW0tPmVuZCAtIHJlc19tZW0tPnN0YXJ0ICsgMTsKKwloY2QtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXNfbWVtKTsKIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbiwKIAkJCQlPQ1RFT05fRUhDSV9IQ0RfTkFNRSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wbWNtc3AuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wbWNtc3AuYwppbmRleCBjZDY5MDk5Li5lOGQ1NGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcG1jbXNwLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBtY21zcC5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOwogCWlmIChyZXMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcmVzX2xlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJcmVzX2xlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNfbGVuLCAibWFiIHJlZ3MiKSkKIAkJcmV0dXJuIC1FQlVTWTsKIApAQCAtMTQwLDcgKzE0MCw3IEBACiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyMjsKIAl9Ci0JcmVzX2xlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJcmVzX2xlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNfbGVuLCAidXNiaWQgcmVncyIpKSB7CiAJCXJldHZhbCA9IC1FQlVTWTsKIAkJZ290byBlcnIyOwpAQCAtMTU0LDEzICsxNTQsMTMgQEAKIAlyZXR1cm4gMDsKIGVycjM6CiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAyKTsKLQlyZXNfbGVuID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlyZXNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNfbGVuKTsKIGVycjI6CiAJaW91bm1hcChkZXYtPm1hYl9yZWdzKTsKIGVycjE6CiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKLQlyZXNfbGVuID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlyZXNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNfbGVuKTsKIAlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gbWFwIG5vbi1FSENJIHJlZ3MuXG4iKTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJCWdvdG8gZXJyMTsKIAl9CiAJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzLT5zdGFydDsKLQloY2QtPnJzcmNfbGVuID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwloY2QtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbiwgZGV2LT5uYW1lKSkgewogCQlyZXR2YWwgPSAtRUJVU1k7CiAJCWdvdG8gZXJyMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wcGMtb2YuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wcGMtb2YuYwppbmRleCA4NTUyZGI2Li40MWQxMWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHBjLW9mLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBwYy1vZi5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAloY2QtPnJzcmNfc3RhcnQgPSByZXMuc3RhcnQ7Ci0JaGNkLT5yc3JjX2xlbiA9IHJlcy5lbmQgLSByZXMuc3RhcnQgKyAxOworCWhjZC0+cnNyY19sZW4gPSByZXNvdXJjZV9zaXplKCZyZXMpOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuLCBoY2RfbmFtZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZFxuIiwgX19GSUxFX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKaW5kZXggNWQ2YmM2Mi4uMDkxN2UzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAlpZiAoIShody0+aHdfaW5mbzEgJiBjcHVfdG9faGMzMihlaGNpLCAxIDw8IDE0KSkpIHsKIAkJdW5zaWduZWQJaXNfb3V0LCBlcG51bTsKIAotCQlpc19vdXQgPSAhKHF0ZC0+aHdfdG9rZW4gJiBjcHVfdG9faGMzMihlaGNpLCAxIDw8IDgpKTsKKwkJaXNfb3V0ID0gcWgtPmlzX291dDsKIAkJZXBudW0gPSAoaGMzMl90b19jcHVwKGVoY2ksICZody0+aHdfaW5mbzEpID4+IDgpICYgMHgwZjsKIAkJaWYgKHVubGlrZWx5ICghdXNiX2dldHRvZ2dsZSAocWgtPmRldiwgZXBudW0sIGlzX291dCkpKSB7CiAJCQlody0+aHdfdG9rZW4gJj0gfmNwdV90b19oYzMyKGVoY2ksIFFURF9UT0dHTEUpOwpAQCAtOTQ2LDYgKzk0Niw3IEBACiAJaHcgPSBxaC0+aHc7CiAJaHctPmh3X2luZm8xID0gY3B1X3RvX2hjMzIoZWhjaSwgaW5mbzEpOwogCWh3LT5od19pbmZvMiA9IGNwdV90b19oYzMyKGVoY2ksIGluZm8yKTsKKwlxaC0+aXNfb3V0ID0gIWlzX2lucHV0OwogCXVzYl9zZXR0b2dnbGUgKHVyYi0+ZGV2LCB1c2JfcGlwZWVuZHBvaW50ICh1cmItPnBpcGUpLCAhaXNfaW5wdXQsIDEpOwogCXFoX3JlZnJlc2ggKGVoY2ksIHFoKTsKIAlyZXR1cm4gcWg7CkBAIC0xMjMxLDYgKzEyMzIsOCBAQAogCiAJcHJldi0+aHctPmh3X25leHQgPSBxaC0+aHctPmh3X25leHQ7CiAJcHJldi0+cWhfbmV4dCA9IHFoLT5xaF9uZXh0OworCWlmIChlaGNpLT5xaF9zY2FuX25leHQgPT0gcWgpCisJCWVoY2ktPnFoX3NjYW5fbmV4dCA9IHFoLT5xaF9uZXh0LnFoOwogCXdtYiAoKTsKIAogCS8qIElmIHRoZSBjb250cm9sbGVyIGlzbid0IHJ1bm5pbmcsIHdlIGRvbid0IGhhdmUgdG8gd2FpdCBmb3IgaXQgKi8KQEAgLTEyNTYsNTMgKzEyNTksNDkgQEAKIAlzdHJ1Y3QgZWhjaV9xaAkJKnFoOwogCWVudW0gZWhjaV90aW1lcl9hY3Rpb24JYWN0aW9uID0gVElNRVJfSU9fV0FUQ0hET0c7CiAKLQllaGNpLT5zdGFtcCA9IGVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPnJlZ3MtPmZyYW1lX2luZGV4KTsKIAl0aW1lcl9hY3Rpb25fZG9uZSAoZWhjaSwgVElNRVJfQVNZTkNfU0hSSU5LKTsKLXJlc2NhbjoKIAlzdG9wcGVkID0gIUhDX0lTX1JVTk5JTkcoZWhjaV90b19oY2QoZWhjaSktPnN0YXRlKTsKLQlxaCA9IGVoY2ktPmFzeW5jLT5xaF9uZXh0LnFoOwotCWlmIChsaWtlbHkgKHFoICE9IE5VTEwpKSB7Ci0JCWRvIHsKLQkJCS8qIGNsZWFuIGFueSBmaW5pc2hlZCB3b3JrIGZvciB0aGlzIHFoICovCi0JCQlpZiAoIWxpc3RfZW1wdHkoJnFoLT5xdGRfbGlzdCkgJiYgKHN0b3BwZWQgfHwKLQkJCQkJcWgtPnN0YW1wICE9IGVoY2ktPnN0YW1wKSkgewotCQkJCWludCB0ZW1wOwogCi0JCQkJLyogdW5saW5rcyBjb3VsZCBoYXBwZW4gaGVyZTsgY29tcGxldGlvbgotCQkJCSAqIHJlcG9ydGluZyBkcm9wcyB0aGUgbG9jay4gIHJlc2NhbiB1c2luZwotCQkJCSAqIHRoZSBsYXRlc3Qgc2NoZWR1bGUsIGJ1dCBkb24ndCByZXNjYW4KLQkJCQkgKiBxaHMgd2UgYWxyZWFkeSBmaW5pc2hlZCAobm8gbG9vcGluZykKLQkJCQkgKiB1bmxlc3MgdGhlIGNvbnRyb2xsZXIgaXMgc3RvcHBlZC4KLQkJCQkgKi8KLQkJCQlxaCA9IHFoX2dldCAocWgpOwotCQkJCXFoLT5zdGFtcCA9IGVoY2ktPnN0YW1wOwotCQkJCXRlbXAgPSBxaF9jb21wbGV0aW9ucyAoZWhjaSwgcWgpOwotCQkJCWlmIChxaC0+bmVlZHNfcmVzY2FuKQotCQkJCQl1bmxpbmtfYXN5bmMoZWhjaSwgcWgpOwotCQkJCXFoX3B1dCAocWgpOwotCQkJCWlmICh0ZW1wICE9IDApIHsKLQkJCQkJZ290byByZXNjYW47Ci0JCQkJfQotCQkJfQorCWVoY2ktPnFoX3NjYW5fbmV4dCA9IGVoY2ktPmFzeW5jLT5xaF9uZXh0LnFoOworCXdoaWxlIChlaGNpLT5xaF9zY2FuX25leHQpIHsKKwkJcWggPSBlaGNpLT5xaF9zY2FuX25leHQ7CisJCWVoY2ktPnFoX3NjYW5fbmV4dCA9IHFoLT5xaF9uZXh0LnFoOworIHJlc2NhbjoKKwkJLyogY2xlYW4gYW55IGZpbmlzaGVkIHdvcmsgZm9yIHRoaXMgcWggKi8KKwkJaWYgKCFsaXN0X2VtcHR5KCZxaC0+cXRkX2xpc3QpKSB7CisJCQlpbnQgdGVtcDsKIAotCQkJLyogdW5saW5rIGlkbGUgZW50cmllcywgcmVkdWNpbmcgRE1BIHVzYWdlIGFzIHdlbGwKLQkJCSAqIGFzIEhDRCBzY2hlZHVsZS1zY2FubmluZyBjb3N0cy4gIGRlbGF5IGZvciBhbnkgcWgKLQkJCSAqIHdlIGp1c3Qgc2Nhbm5lZCwgdGhlcmUncyBhIG5vdC11bnVzdWFsIGNhc2UgdGhhdCBpdAotCQkJICogZG9lc24ndCBzdGF5IGlkbGUgZm9yIGxvbmcuCi0JCQkgKiAocGx1cywgYXZvaWRzIHNvbWUga2luZCBvZiByZS1hY3RpdmF0aW9uIHJhY2UuKQorCQkJLyoKKwkJCSAqIFVubGlua3MgY291bGQgaGFwcGVuIGhlcmU7IGNvbXBsZXRpb24gcmVwb3J0aW5nCisJCQkgKiBkcm9wcyB0aGUgbG9jay4gIFRoYXQncyB3aHkgZWhjaS0+cWhfc2Nhbl9uZXh0CisJCQkgKiBhbHdheXMgaG9sZHMgdGhlIG5leHQgcWggdG8gc2NhbjsgaWYgdGhlIG5leHQgcWgKKwkJCSAqIGdldHMgdW5saW5rZWQgdGhlbiBlaGNpLT5xaF9zY2FuX25leHQgaXMgYWRqdXN0ZWQKKwkJCSAqIGluIHN0YXJ0X3VubGlua19hc3luYygpLgogCQkJICovCi0JCQlpZiAobGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KQotCQkJCQkmJiBxaC0+cWhfc3RhdGUgPT0gUUhfU1RBVEVfTElOS0VEKSB7Ci0JCQkJaWYgKCFlaGNpLT5yZWNsYWltICYmIChzdG9wcGVkIHx8Ci0JCQkJCSgoZWhjaS0+c3RhbXAgLSBxaC0+c3RhbXApICYgMHgxZmZmKQotCQkJCQkJPj0gRUhDSV9TSFJJTktfRlJBTUVTICogOCkpCi0JCQkJCXN0YXJ0X3VubGlua19hc3luYyhlaGNpLCBxaCk7Ci0JCQkJZWxzZQotCQkJCQlhY3Rpb24gPSBUSU1FUl9BU1lOQ19TSFJJTks7Ci0JCQl9CisJCQlxaCA9IHFoX2dldChxaCk7CisJCQl0ZW1wID0gcWhfY29tcGxldGlvbnMoZWhjaSwgcWgpOworCQkJaWYgKHFoLT5uZWVkc19yZXNjYW4pCisJCQkJdW5saW5rX2FzeW5jKGVoY2ksIHFoKTsKKwkJCXFoLT51bmxpbmtfdGltZSA9IGppZmZpZXMgKyBFSENJX1NIUklOS19KSUZGSUVTOworCQkJcWhfcHV0KHFoKTsKKwkJCWlmICh0ZW1wICE9IDApCisJCQkJZ290byByZXNjYW47CisJCX0KIAotCQkJcWggPSBxaC0+cWhfbmV4dC5xaDsKLQkJfSB3aGlsZSAocWgpOworCQkvKiB1bmxpbmsgaWRsZSBlbnRyaWVzLCByZWR1Y2luZyBETUEgdXNhZ2UgYXMgd2VsbAorCQkgKiBhcyBIQ0Qgc2NoZWR1bGUtc2Nhbm5pbmcgY29zdHMuICBkZWxheSBmb3IgYW55IHFoCisJCSAqIHdlIGp1c3Qgc2Nhbm5lZCwgdGhlcmUncyBhIG5vdC11bnVzdWFsIGNhc2UgdGhhdCBpdAorCQkgKiBkb2Vzbid0IHN0YXkgaWRsZSBmb3IgbG9uZy4KKwkJICogKHBsdXMsIGF2b2lkcyBzb21lIGtpbmQgb2YgcmUtYWN0aXZhdGlvbiByYWNlLikKKwkJICovCisJCWlmIChsaXN0X2VtcHR5KCZxaC0+cXRkX2xpc3QpCisJCQkJJiYgcWgtPnFoX3N0YXRlID09IFFIX1NUQVRFX0xJTktFRCkgeworCQkJaWYgKCFlaGNpLT5yZWNsYWltICYmIChzdG9wcGVkIHx8CisJCQkJCXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcWgtPnVubGlua190aW1lKSkpCisJCQkJc3RhcnRfdW5saW5rX2FzeW5jKGVoY2ksIHFoKTsKKwkJCWVsc2UKKwkJCQlhY3Rpb24gPSBUSU1FUl9BU1lOQ19TSFJJTks7CisJCX0KIAl9CiAJaWYgKGFjdGlvbiA9PSBUSU1FUl9BU1lOQ19TSFJJTkspCiAJCXRpbWVyX2FjdGlvbiAoZWhjaSwgVElNRVJfQVNZTkNfU0hSSU5LKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zNXAuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zNXAuYwppbmRleCBlMzM3NGM4Li5iMzk1OGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktczVwLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXM1cC5jCkBAIC0xODksNiArMTg5LDEwMCBAQAogCQloY2QtPmRyaXZlci0+c2h1dGRvd24oaGNkKTsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBzNXBfZWhjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgczVwX2VoY2lfaGNkICpzNXBfZWhjaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBzNXBfZWhjaS0+aGNkOworCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzNXBfZWhjaV9wbGF0ZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgZWhjaS0+bmV4dF9zdGF0ZWNoYW5nZSkpCisJCW1zbGVlcCgyMCk7CisKKwkvKgorCSAqIFJvb3QgaHViIHdhcyBhbHJlYWR5IHN1c3BlbmRlZC4gRGlzYWJsZSBpcnEgZW1pc3Npb24gYW5kCisJICogbWFyayBIVyB1bmFjY2Vzc2libGUuICBUaGUgUE0gYW5kIFVTQiBjb3JlcyBtYWtlIHN1cmUgdGhhdAorCSAqIHRoZSByb290IGh1YiBpcyBlaXRoZXIgc3VzcGVuZGVkIG9yIHN0b3BwZWQuCisJICovCisJZWhjaV9wcmVwYXJlX3BvcnRzX2Zvcl9jb250cm9sbGVyX3N1c3BlbmQoZWhjaSwgZGV2aWNlX21heV93YWtldXAoZGV2KSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVoY2ktPmxvY2ssIGZsYWdzKTsKKwllaGNpX3dyaXRlbChlaGNpLCAwLCAmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOworCSh2b2lkKWVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKKworCWNsZWFyX2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWhjaS0+bG9jaywgZmxhZ3MpOworCisJaWYgKHBkYXRhICYmIHBkYXRhLT5waHlfZXhpdCkKKwkJcGRhdGEtPnBoeV9leGl0KHBkZXYsIFM1UF9VU0JfUEhZX0hPU1QpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHM1cF9laGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHM1cF9laGNpX2hjZCAqczVwX2VoY2kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gczVwX2VoY2ktPmhjZDsKKwlzdHJ1Y3QgZWhjaV9oY2QgKmVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAocGRhdGEgJiYgcGRhdGEtPnBoeV9pbml0KQorCQlwZGF0YS0+cGh5X2luaXQocGRldiwgUzVQX1VTQl9QSFlfSE9TVCk7CisKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgZWhjaS0+bmV4dF9zdGF0ZWNoYW5nZSkpCisJCW1zbGVlcCgxMDApOworCisJLyogTWFyayBoYXJkd2FyZSBhY2Nlc3NpYmxlIGFnYWluIGFzIHdlIGFyZSBvdXQgb2YgRDMgc3RhdGUgYnkgbm93ICovCisJc2V0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7CisKKwlpZiAoZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+Y29uZmlndXJlZF9mbGFnKSA9PSBGTEFHX0NGKSB7CisJCWludAltYXNrID0gSU5UUl9NQVNLOworCisJCWVoY2lfcHJlcGFyZV9wb3J0c19mb3JfY29udHJvbGxlcl9yZXN1bWUoZWhjaSk7CisJCWlmICghaGNkLT5zZWxmLnJvb3RfaHViLT5kb19yZW1vdGVfd2FrZXVwKQorCQkJbWFzayAmPSB+U1RTX1BDRDsKKwkJZWhjaV93cml0ZWwoZWhjaSwgbWFzaywgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKKwkJZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwl1c2Jfcm9vdF9odWJfbG9zdF9wb3dlcihoY2QtPnNlbGYucm9vdF9odWIpOworCisJKHZvaWQpIGVoY2lfaGFsdChlaGNpKTsKKwkodm9pZCkgZWhjaV9yZXNldChlaGNpKTsKKworCS8qIGVtcHR5aW5nIHRoZSBzY2hlZHVsZSBhYm9ydHMgYW55IHVyYnMgKi8KKwlzcGluX2xvY2tfaXJxKCZlaGNpLT5sb2NrKTsKKwlpZiAoZWhjaS0+cmVjbGFpbSkKKwkJZW5kX3VubGlua19hc3luYyhlaGNpKTsKKwllaGNpX3dvcmsoZWhjaSk7CisJc3Bpbl91bmxvY2tfaXJxKCZlaGNpLT5sb2NrKTsKKworCWVoY2lfd3JpdGVsKGVoY2ksIGVoY2ktPmNvbW1hbmQsICZlaGNpLT5yZWdzLT5jb21tYW5kKTsKKwllaGNpX3dyaXRlbChlaGNpLCBGTEFHX0NGLCAmZWhjaS0+cmVncy0+Y29uZmlndXJlZF9mbGFnKTsKKwllaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5jb21tYW5kKTsJLyogdW5ibG9jayBwb3N0ZWQgd3JpdGVzICovCisKKwkvKiBoZXJlIHdlICJrbm93IiByb290IHBvcnRzIHNob3VsZCBhbHdheXMgc3RheSBwb3dlcmVkICovCisJZWhjaV9wb3J0X3Bvd2VyKGVoY2ksIDEpOworCisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgczVwX2VoY2lfc3VzcGVuZAlOVUxMCisjZGVmaW5lIHM1cF9laGNpX3Jlc3VtZQkJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzNXBfZWhjaV9wbV9vcHMgPSB7CisJLnN1c3BlbmQJPSBzNXBfZWhjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gczVwX2VoY2lfcmVzdW1lLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczVwX2VoY2lfZHJpdmVyID0gewogCS5wcm9iZQkJPSBzNXBfZWhjaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHM1cF9laGNpX3JlbW92ZSksCkBAIC0xOTYsNiArMjkwLDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJzNXAtZWhjaSIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmczVwX2VoY2lfcG1fb3BzLAogCX0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKaW5kZXggNmM5ZmJlMy4uMmFiZjg1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCQl9CiAJfQogI2lmZGVmCURFQlVHCi0JaWYgKHVzZWNzID4gMTAwKQorCWlmICh1c2VjcyA+IGVoY2ktPnVmcmFtZV9wZXJpb2RpY19tYXgpCiAJCWVoY2lfZXJyIChlaGNpLCAidWZyYW1lICVkIHNjaGVkIG92ZXJydW46ICVkIHVzZWNzXG4iLAogCQkJZnJhbWUgKiA4ICsgdWZyYW1lLCB1c2Vjcyk7CiAjZW5kaWYKQEAgLTcwOSwxMSArNzA5LDggQEAKIAlpZiAodWZyYW1lID49IDgpCiAJCXJldHVybiAwOwogCi0JLyoKLQkgKiA4MCUgcGVyaW9kaWMgPT0gMTAwIHVzZWMvdWZyYW1lIGF2YWlsYWJsZQotCSAqIGNvbnZlcnQgInVzZWNzIHdlIG5lZWQiIHRvICJtYXggYWxyZWFkeSBjbGFpbWVkIgotCSAqLwotCXVzZWNzID0gMTAwIC0gdXNlY3M7CisJLyogY29udmVydCAidXNlY3Mgd2UgbmVlZCIgdG8gIm1heCBhbHJlYWR5IGNsYWltZWQiICovCisJdXNlY3MgPSBlaGNpLT51ZnJhbWVfcGVyaW9kaWNfbWF4IC0gdXNlY3M7CiAKIAkvKiB3ZSAia25vdyIgMiBhbmQgNCB1ZnJhbWUgaW50ZXJ2YWxzIHdlcmUgcmVqZWN0ZWQ7IHNvCiAJICogZm9yIHBlcmlvZCAwLCBjaGVjayBfZXZlcnlfIG1pY3JvZnJhbWUgaW4gdGhlIHNjaGVkdWxlLgpAQCAtMTI4Niw5ICsxMjgzLDkgQEAKIHsKIAl1ZnJhbWUgJT0gcGVyaW9kOwogCWRvIHsKLQkJLyogY2FuJ3QgY29tbWl0IG1vcmUgdGhhbiA4MCUgcGVyaW9kaWMgPT0gMTAwIHVzZWMgKi8KKwkJLyogY2FuJ3QgY29tbWl0IG1vcmUgdGhhbiB1ZnJhbWVfcGVyaW9kaWNfbWF4IHVzZWMgKi8KIAkJaWYgKHBlcmlvZGljX3VzZWNzIChlaGNpLCB1ZnJhbWUgPj4gMywgdWZyYW1lICYgMHg3KQotCQkJCT4gKDEwMCAtIHVzZWNzKSkKKwkJCQk+IChlaGNpLT51ZnJhbWVfcGVyaW9kaWNfbWF4IC0gdXNlY3MpKQogCQkJcmV0dXJuIDA7CiAKIAkJLyogd2Uga25vdyB1cmItPmludGVydmFsIGlzIDJeTiB1ZnJhbWVzICovCkBAIC0xMzQ1LDcgKzEzNDIsNyBAQAogI2VuZGlmCiAKIAkJLyogY2hlY2sgc3RhcnRzIChPVVQgdXNlcyBtb3JlIHRoYW4gb25lKSAqLwotCQltYXhfdXNlZCA9IDEwMCAtIHN0cmVhbS0+dXNlY3M7CisJCW1heF91c2VkID0gZWhjaS0+dWZyYW1lX3BlcmlvZGljX21heCAtIHN0cmVhbS0+dXNlY3M7CiAJCWZvciAodG1wID0gc3RyZWFtLT5yYXdfbWFzayAmIDB4ZmY7IHRtcDsgdG1wID4+PSAxLCB1ZisrKSB7CiAJCQlpZiAocGVyaW9kaWNfdXNlY3MgKGVoY2ksIGZyYW1lLCB1ZikgPiBtYXhfdXNlZCkKIAkJCQlyZXR1cm4gMDsKQEAgLTEzNTQsNyArMTM1MSw3IEBACiAJCS8qIGZvciBJTiwgY2hlY2sgQ1NQTElUICovCiAJCWlmIChzdHJlYW0tPmNfdXNlY3MpIHsKIAkJCXVmID0gdWZyYW1lICYgNzsKLQkJCW1heF91c2VkID0gMTAwIC0gc3RyZWFtLT5jX3VzZWNzOworCQkJbWF4X3VzZWQgPSBlaGNpLT51ZnJhbWVfcGVyaW9kaWNfbWF4IC0gc3RyZWFtLT5jX3VzZWNzOwogCQkJZG8gewogCQkJCXRtcCA9IDEgPDwgdWY7CiAJCQkJdG1wIDw8PSA4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXN5c2ZzLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGNlZDAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXN5c2ZzLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgQWxhbiBTdGVybgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIHRoaXMgZmlsZSBpcyBwYXJ0IG9mIGVoY2ktaGNkLmMgKi8KKworCisvKiBEaXNwbGF5IHRoZSBwb3J0cyBkZWRpY2F0ZWQgdG8gdGhlIGNvbXBhbmlvbiBjb250cm9sbGVyICovCitzdGF0aWMgc3NpemVfdCBzaG93X2NvbXBhbmlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpOworCWludAkJCW5wb3J0cywgaW5kZXgsIG47CisJaW50CQkJY291bnQgPSBQQUdFX1NJWkU7CisJY2hhcgkJCSpwdHIgPSBidWY7CisKKwllaGNpID0gaGNkX3RvX2VoY2koYnVzX3RvX2hjZChkZXZfZ2V0X2RydmRhdGEoZGV2KSkpOworCW5wb3J0cyA9IEhDU19OX1BPUlRTKGVoY2ktPmhjc19wYXJhbXMpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnBvcnRzOyArK2luZGV4KSB7CisJCWlmICh0ZXN0X2JpdChpbmRleCwgJmVoY2ktPmNvbXBhbmlvbl9wb3J0cykpIHsKKwkJCW4gPSBzY25wcmludGYocHRyLCBjb3VudCwgIiVkXG4iLCBpbmRleCArIDEpOworCQkJcHRyICs9IG47CisJCQljb3VudCAtPSBuOworCQl9CisJfQorCXJldHVybiBwdHIgLSBidWY7Cit9CisKKy8qCisgKiBEZWRpY2F0ZSBvciB1bmRlZGljYXRlIGEgcG9ydCB0byB0aGUgY29tcGFuaW9uIGNvbnRyb2xsZXIuCisgKiBTeW50YXggaXMgIlstXXBvcnRudW0iLCB3aGVyZSBhIGxlYWRpbmcgJy0nIHNpZ24gbWVhbnMKKyAqIHJldHVybiBjb250cm9sIG9mIHRoZSBwb3J0IHRvIHRoZSBFSENJIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2NvbXBhbmlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGVoY2lfaGNkCQkqZWhjaTsKKwlpbnQJCQlwb3J0bnVtLCBuZXdfb3duZXI7CisKKwllaGNpID0gaGNkX3RvX2VoY2koYnVzX3RvX2hjZChkZXZfZ2V0X2RydmRhdGEoZGV2KSkpOworCW5ld19vd25lciA9IFBPUlRfT1dORVI7CQkvKiBPd25lZCBieSBjb21wYW5pb24gKi8KKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnBvcnRudW0pICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwb3J0bnVtIDwgMCkgeworCQlwb3J0bnVtID0gLSBwb3J0bnVtOworCQluZXdfb3duZXIgPSAwOwkJLyogT3duZWQgYnkgRUhDSSAqLworCX0KKwlpZiAocG9ydG51bSA8PSAwIHx8IHBvcnRudW0gPiBIQ1NfTl9QT1JUUyhlaGNpLT5oY3NfcGFyYW1zKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJcG9ydG51bS0tOworCWlmIChuZXdfb3duZXIpCisJCXNldF9iaXQocG9ydG51bSwgJmVoY2ktPmNvbXBhbmlvbl9wb3J0cyk7CisJZWxzZQorCQljbGVhcl9iaXQocG9ydG51bSwgJmVoY2ktPmNvbXBhbmlvbl9wb3J0cyk7CisJc2V0X293bmVyKGVoY2ksIHBvcnRudW0sIG5ld19vd25lcik7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKGNvbXBhbmlvbiwgMDY0NCwgc2hvd19jb21wYW5pb24sIHN0b3JlX2NvbXBhbmlvbik7CisKKworLyoKKyAqIERpc3BsYXkgLyBTZXQgdWZyYW1lX3BlcmlvZGljX21heAorICovCitzdGF0aWMgc3NpemVfdCBzaG93X3VmcmFtZV9wZXJpb2RpY19tYXgoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2k7CisJaW50CQkJbjsKKworCWVoY2kgPSBoY2RfdG9fZWhjaShidXNfdG9faGNkKGRldl9nZXRfZHJ2ZGF0YShkZXYpKSk7CisJbiA9IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBlaGNpLT51ZnJhbWVfcGVyaW9kaWNfbWF4KTsKKwlyZXR1cm4gbjsKK30KKworCitzdGF0aWMgc3NpemVfdCBzdG9yZV91ZnJhbWVfcGVyaW9kaWNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2k7CisJdW5zaWduZWQJCXVmcmFtZV9wZXJpb2RpY19tYXg7CisJdW5zaWduZWQJCWZyYW1lLCB1ZnJhbWU7CisJdW5zaWduZWQgc2hvcnQJCWFsbG9jYXRlZF9tYXg7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJc3NpemVfdAkJCXJldDsKKworCWVoY2kgPSBoY2RfdG9fZWhjaShidXNfdG9faGNkKGRldl9nZXRfZHJ2ZGF0YShkZXYpKSk7CisJaWYgKGtzdHJ0b3VpbnQoYnVmLCAwLCAmdWZyYW1lX3BlcmlvZGljX21heCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1ZnJhbWVfcGVyaW9kaWNfbWF4IDwgMTAwIHx8IHVmcmFtZV9wZXJpb2RpY19tYXggPj0gMTI1KSB7CisJCWVoY2lfaW5mbyhlaGNpLCAicmVqZWN0aW5nIGludmFsaWQgcmVxdWVzdCBmb3IgIgorCQkJCSJ1ZnJhbWVfcGVyaW9kaWNfbWF4PSV1XG4iLCB1ZnJhbWVfcGVyaW9kaWNfbWF4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gLUVJTlZBTDsKKworCS8qCisJICogbG9jaywgc28gdGhhdCBvdXIgY2hlY2tpbmcgZG9lcyBub3QgcmFjZSB3aXRoIHBvc3NpYmxlIHBlcmlvZGljCisJICogYmFuZHdpZHRoIGFsbG9jYXRpb24gdGhyb3VnaCBzdWJtaXR0aW5nIG5ldyB1cmJzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlICgmZWhjaS0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBmb3IgcmVxdWVzdCB0byBkZWNyZWFzZSBtYXggcGVyaW9kaWMgYmFuZHdpZHRoLCB3ZSBoYXZlIHRvIGNoZWNrCisJICogZXZlcnkgbWljcm9mcmFtZSBpbiB0aGUgc2NoZWR1bGUgdG8gc2VlIHdoZXRoZXIgdGhlIGRlY3JlYXNlIGlzCisJICogcG9zc2libGUuCisJICovCisJaWYgKHVmcmFtZV9wZXJpb2RpY19tYXggPCBlaGNpLT51ZnJhbWVfcGVyaW9kaWNfbWF4KSB7CisJCWFsbG9jYXRlZF9tYXggPSAwOworCisJCWZvciAoZnJhbWUgPSAwOyBmcmFtZSA8IGVoY2ktPnBlcmlvZGljX3NpemU7ICsrZnJhbWUpCisJCQlmb3IgKHVmcmFtZSA9IDA7IHVmcmFtZSA8IDc7ICsrdWZyYW1lKQorCQkJCWFsbG9jYXRlZF9tYXggPSBtYXgoYWxsb2NhdGVkX21heCwKKwkJCQkJCSAgICBwZXJpb2RpY191c2VjcyAoZWhjaSwgZnJhbWUsIHVmcmFtZSkpOworCisJCWlmIChhbGxvY2F0ZWRfbWF4ID4gdWZyYW1lX3BlcmlvZGljX21heCkgeworCQkJZWhjaV9pbmZvKGVoY2ksCisJCQkJImNhbm5vdCBkZWNyZWFzZSB1ZnJhbWVfcGVyaW9kaWNfbWF4IGJlY2FzZSAiCisJCQkJInBlcmlvZGljIGJhbmR3aWR0aCBpcyBhbHJlYWR5IGFsbG9jYXRlZCAiCisJCQkJIigldSA+ICV1KVxuIiwKKwkJCQlhbGxvY2F0ZWRfbWF4LCB1ZnJhbWVfcGVyaW9kaWNfbWF4KTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCX0KKworCS8qIGluY3JlYXNpbmcgaXMgYWx3YXlzIG9rICovCisKKwllaGNpX2luZm8oZWhjaSwgInNldHRpbmcgbWF4IHBlcmlvZGljIGJhbmR3aWR0aCB0byAldSUlICIKKwkJCSIoPT0gJXUgdXNlYy91ZnJhbWUpXG4iLAorCQkJMTAwKnVmcmFtZV9wZXJpb2RpY19tYXgvMTI1LCB1ZnJhbWVfcGVyaW9kaWNfbWF4KTsKKworCWlmICh1ZnJhbWVfcGVyaW9kaWNfbWF4ICE9IDEwMCkKKwkJZWhjaV93YXJuKGVoY2ksICJtYXggcGVyaW9kaWMgYmFuZHdpZHRoIHNldCBpcyBub24tc3RhbmRhcmRcbiIpOworCisJZWhjaS0+dWZyYW1lX3BlcmlvZGljX21heCA9IHVmcmFtZV9wZXJpb2RpY19tYXg7CisJcmV0ID0gY291bnQ7CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmVoY2ktPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIERFVklDRV9BVFRSKHVmcmFtZV9wZXJpb2RpY19tYXgsIDA2NDQsIHNob3dfdWZyYW1lX3BlcmlvZGljX21heCwgc3RvcmVfdWZyYW1lX3BlcmlvZGljX21heCk7CisKKworc3RhdGljIGlubGluZSBpbnQgY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSkKK3sKKwlzdHJ1Y3QgZGV2aWNlCSpjb250cm9sbGVyID0gZWhjaV90b19oY2QoZWhjaSktPnNlbGYuY29udHJvbGxlcjsKKwlpbnQJaSA9IDA7CisKKwkvKiB3aXRoIGludGVncmF0ZWQgVFQgdGhlcmUgaXMgbm8gY29tcGFuaW9uISAqLworCWlmICghZWhjaV9pc19UREkoZWhjaSkpCisJCWkgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoY29udHJvbGxlciwgJmRldl9hdHRyX2NvbXBhbmlvbik7CisJaWYgKGkpCisJCWdvdG8gb3V0OworCisJaSA9IGRldmljZV9jcmVhdGVfZmlsZShjb250cm9sbGVyLCAmZGV2X2F0dHJfdWZyYW1lX3BlcmlvZGljX21heCk7CitvdXQ6CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfc3lzZnNfZmlsZXMoc3RydWN0IGVoY2lfaGNkICplaGNpKQoreworCXN0cnVjdCBkZXZpY2UJKmNvbnRyb2xsZXIgPSBlaGNpX3RvX2hjZChlaGNpKS0+c2VsZi5jb250cm9sbGVyOworCisJLyogd2l0aCBpbnRlZ3JhdGVkIFRUIHRoZXJlIGlzIG5vIGNvbXBhbmlvbiEgKi8KKwlpZiAoIWVoY2lfaXNfVERJKGVoY2kpKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoY29udHJvbGxlciwgJmRldl9hdHRyX2NvbXBhbmlvbik7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoY29udHJvbGxlciwgJmRldl9hdHRyX3VmcmFtZV9wZXJpb2RpY19tYXgpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXc5MHg5MDAuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS13OTB4OTAwLmMKaW5kZXggNTJhMDI3YS4uZDY2MWNmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXc5MHg5MDAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktdzkweDkwMC5jCkBAIC00MSw3ICs0MSw3IEBACiAJfQogCiAJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzLT5zdGFydDsKLQloY2QtPnJzcmNfbGVuID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwloY2QtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuLCBoY2RfbmFtZSkpIHsKIAkJcmV0dmFsID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXhpbGlueC1vZi5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXhpbGlueC1vZi5jCmluZGV4IGE2NGQ2ZDYuLjMyNzkzY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS14aWxpbngtb2YuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kteGlsaW54LW9mLmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWhjZC0+cnNyY19zdGFydCA9IHJlcy5zdGFydDsKLQloY2QtPnJzcmNfbGVuID0gcmVzLmVuZCAtIHJlcy5zdGFydCArIDE7CisJaGNkLT5yc3JjX2xlbiA9IHJlc291cmNlX3NpemUoJnJlcyk7CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4sIGhjZF9uYW1lKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkXG4iLCBfX0ZJTEVfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCmluZGV4IGJkNmZmNDguLmNjN2QzMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCkBAIC03NSw2ICs3NSw3IEBACiAJc3RydWN0IGVoY2lfcWgJCSphc3luYzsKIAlzdHJ1Y3QgZWhjaV9xaAkJKmR1bW15OwkJLyogRm9yIEFNRCBxdWlyayB1c2UgKi8KIAlzdHJ1Y3QgZWhjaV9xaAkJKnJlY2xhaW07CisJc3RydWN0IGVoY2lfcWgJCSpxaF9zY2FuX25leHQ7CiAJdW5zaWduZWQJCXNjYW5uaW5nIDogMTsKIAogCS8qIHBlcmlvZGljIHNjaGVkdWxlIHN1cHBvcnQgKi8KQEAgLTg3LDYgKzg4LDggQEAKIAl1bmlvbiBlaGNpX3NoYWRvdwkqcHNoYWRvdzsJLyogbWlycm9yIGh3IHBlcmlvZGljIHRhYmxlICovCiAJaW50CQkJbmV4dF91ZnJhbWU7CS8qIHNjYW4gcGVyaW9kaWMsIHN0YXJ0IGhlcmUgKi8KIAl1bnNpZ25lZAkJcGVyaW9kaWNfc2NoZWQ7CS8qIHBlcmlvZGljIGFjdGl2aXR5IGNvdW50ICovCisJdW5zaWduZWQJCXVmcmFtZV9wZXJpb2RpY19tYXg7IC8qIG1heCBwZXJpb2RpYyB0aW1lIHBlciB1ZnJhbWUgKi8KKwogCiAJLyogbGlzdCBvZiBpdGRzICYgc2l0ZHMgY29tcGxldGVkIHdoaWxlIGNsb2NrX2ZyYW1lIHdhcyBzdGlsbCBhY3RpdmUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWNhY2hlZF9pdGRfbGlzdDsKQEAgLTExNyw3ICsxMjAsNiBAQAogCXN0cnVjdCB0aW1lcl9saXN0CWlhYV93YXRjaGRvZzsKIAlzdHJ1Y3QgdGltZXJfbGlzdAl3YXRjaGRvZzsKIAl1bnNpZ25lZCBsb25nCQlhY3Rpb25zOwotCXVuc2lnbmVkCQlzdGFtcDsKIAl1bnNpZ25lZAkJcGVyaW9kaWNfc3RhbXA7CiAJdW5zaWduZWQJCXJhbmRvbV9mcmFtZTsKIAl1bnNpZ25lZCBsb25nCQluZXh0X3N0YXRlY2hhbmdlOwpAQCAtMzQzLDYgKzM0NSw3IEBACiAJc3RydWN0IGVoY2lfcWgJCSpyZWNsYWltOwkvKiBuZXh0IHRvIHJlY2xhaW0gKi8KIAogCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2k7CisJdW5zaWduZWQgbG9uZwkJdW5saW5rX3RpbWU7CiAKIAkvKgogCSAqIERvIE5PVCB1c2UgYXRvbWljIG9wZXJhdGlvbnMgZm9yIFFIIHJlZmNvdW50aW5nLiBPbiBzb21lIENQVXMKQEAgLTM3NCw2ICszNzcsNyBAQAogI2RlZmluZSBOT19GUkFNRSAoKHVuc2lnbmVkIHNob3J0KX4wKQkJCS8qIHBpY2sgbmV3IHN0YXJ0ICovCiAKIAlzdHJ1Y3QgdXNiX2RldmljZQkqZGV2OwkJLyogYWNjZXNzIHRvIFRUICovCisJdW5zaWduZWQJCWlzX291dDoxOwkvKiBidWxrIG9yIGludHIgT1VUICovCiAJdW5zaWduZWQJCWNsZWFyaW5nX3R0OjE7CS8qIENsZWFyLVRULUJ1ZiBpbiBwcm9ncmVzcyAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9maGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9maGNpLWhjZC5jCmluZGV4IDE5MjIzYzcuLjU3MmVhNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktaGNkLmMKQEAgLTYwNSw3ICs2MDUsNyBAQAogCQlnb3RvIGVycl9yZWdzOwogCX0KIAotCWhjZC0+cmVncyA9IGlvcmVtYXAodXNiX3JlZ3Muc3RhcnQsIHVzYl9yZWdzLmVuZCAtIHVzYl9yZWdzLnN0YXJ0ICsgMSk7CisJaGNkLT5yZWdzID0gaW9yZW1hcCh1c2JfcmVncy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmdXNiX3JlZ3MpKTsKIAlpZiAoIWhjZC0+cmVncykgewogCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCBpb3JlbWFwIHJlZ3NcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5jCmluZGV4IGM5ZTZlNDUuLjU1ZDNkNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaGNkLmMKQEAgLTE1NTUsNyArMTU1NSw3IEBACiAKIAkvKiBXZSBuZWVkIHRvIGZvcmNlZnVsbHkgcmVjbGFpbSB0aGUgc2xvdCBzaW5jZSBzb21lIHRyYW5zZmVycyBuZXZlcgogCSAgIHJldHVybiwgZS5nLiBpbnRlcnJ1cHQgdHJhbnNmZXJzIGFuZCBOQUtlZCBidWxrIHRyYW5zZmVycy4gKi8KLQlpZiAodXNiX3BpcGVidWxrKHVyYi0+cGlwZSkpIHsKKwlpZiAodXNiX3BpcGVjb250cm9sKHVyYi0+cGlwZSkgfHwgdXNiX3BpcGVidWxrKHVyYi0+cGlwZSkpIHsKIAkJc2tpcF9tYXAgPSByZWdfcmVhZDMyKGhjZC0+cmVncywgSENfQVRMX1BURF9TS0lQTUFQX1JFRyk7CiAJCXNraXBfbWFwIHw9ICgxIDw8IHFoLT5zbG90KTsKIAkJcmVnX3dyaXRlMzIoaGNkLT5yZWdzLCBIQ19BVExfUFREX1NLSVBNQVBfUkVHLCBza2lwX21hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXRoNzkuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdGg3OS5jCmluZGV4IGZmZWEzZTcuLmM2MjBjNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdGg3OS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdGg3OS5jCkBAIC05Myw4ICs5Myw4IEBACiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX3B1dF9oY2Q7CiAJfQotCWhjZC0+cnNyY19zdGFydAk9IHJlcy0+c3RhcnQ7Ci0JaGNkLT5yc3JjX2xlbgk9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzLT5zdGFydDsKKwloY2QtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuLCBoY2RfbmFtZSkpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY29udHJvbGxlciBhbHJlYWR5IGluIHVzZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktY25zM3h4eC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWNuczN4eHguYwppbmRleCBmMDVlZjg3Li41YTAwYTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktY25zM3h4eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1jbnMzeHh4LmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCQlnb3RvIGVycjE7CiAJfQogCWhjZC0+cnNyY19zdGFydCA9IHJlcy0+c3RhcnQ7Ci0JaGNkLT5yc3JjX2xlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJaGNkLT5yc3JjX2xlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbiwKIAkJCWRyaXZlci0+ZGVzY3JpcHRpb24pKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZGE4eHguYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1kYTh4eC5jCmluZGV4IGQyMmZiNGQuLjZhY2EyYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1kYTh4eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1kYTh4eC5jCkBAIC0zMjIsNyArMzIyLDcgQEAKIAkJZ290byBlcnIyOwogCX0KIAloY2QtPnJzcmNfc3RhcnQgPSBtZW0tPnN0YXJ0OwotCWhjZC0+cnNyY19sZW4gPSBtZW0tPmVuZCAtIG1lbS0+c3RhcnQgKyAxOworCWhjZC0+cnNyY19sZW4gPSByZXNvdXJjZV9zaXplKG1lbSk7CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4sIGhjZF9uYW1lKSkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJyZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYwppbmRleCA5YWExMGJkLi5mOWNmM2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCkBAIC0xLDUgKzEsNyBAQAogLyoKLSAqIE9IQ0kgSENEIChIb3N0IENvbnRyb2xsZXIgRHJpdmVyKSBmb3IgVVNCLgorICogT3BlbiBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIChPSENJKSBkcml2ZXIgZm9yIFVTQi4KKyAqCisgKiBNYWludGFpbmVyOiBBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1PgogICoKICAqIChDKSBDb3B5cmlnaHQgMTk5OSBSb21hbiBXZWlzc2dhZXJiZXIgPHdlaXNzZ0B2aWVubmEuYXQ+CiAgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNCBEYXZpZCBCcm93bmVsbCA8ZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vY3Rlb24uYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vY3Rlb24uYwppbmRleCBlNGRkZmFmLi5kOGI0NTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb2N0ZW9uLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9jdGVvbi5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAloY2QtPnJzcmNfc3RhcnQgPSByZXNfbWVtLT5zdGFydDsKLQloY2QtPnJzcmNfbGVuID0gcmVzX21lbS0+ZW5kIC0gcmVzX21lbS0+c3RhcnQgKyAxOworCWhjZC0+cnNyY19sZW4gPSByZXNvdXJjZV9zaXplKHJlc19tZW0pOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuLAogCQkJCU9DVEVPTl9PSENJX0hDRF9OQU1FKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1vZi5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1vZi5jCmluZGV4IDFjYTE4MjEuLjBjMTJmNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtb2YuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLW9mLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWhjZC0+cnNyY19zdGFydCA9IHJlcy5zdGFydDsKLQloY2QtPnJzcmNfbGVuID0gcmVzLmVuZCAtIHJlcy5zdGFydCArIDE7CisJaGNkLT5yc3JjX2xlbiA9IHJlc291cmNlX3NpemUoJnJlcyk7CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4sIGhjZF9uYW1lKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkXG4iLCBfX0ZJTEVfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLXNvYy5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1zb2MuYwppbmRleCA4OWU2NzBlLi5jMGY1OTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLXNvYy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtc29jLmMKQEAgLTU2LDcgKzU2LDcgQEAKIAlpZiAoIWhjZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzLT5zdGFydDsKLQloY2QtPnJzcmNfbGVuID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwloY2QtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuLCBoY2RfbmFtZSkpIHsKIAkJcHJfZGVidWcoIiVzOiByZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkXG4iLCBfX0ZJTEVfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMKaW5kZXggYWZlZjdiMC4uODBiZTU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1weGEyN3guYwpAQCAtMzEyLDggKzMxMiwxMCBAQAogCQlyZXR1cm4gUFRSX0VSUih1c2JfY2xrKTsKIAogCWhjZCA9IHVzYl9jcmVhdGVfaGNkIChkcml2ZXIsICZwZGV2LT5kZXYsICJweGEyN3giKTsKLQlpZiAoIWhjZCkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFoY2QpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnIwOworCX0KIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghcikgewpAQCAtMzY4LDYgKzM3MCw3IEBACiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CiAgZXJyMToKIAl1c2JfcHV0X2hjZChoY2QpOworIGVycjA6CiAJY2xrX3B1dCh1c2JfY2xrKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jCmluZGV4IGQ4ZWIzYmQuLjQyMDRkOTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc2ExMTExLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAlpZiAoIWhjZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJaGNkLT5yc3JjX3N0YXJ0ID0gZGV2LT5yZXMuc3RhcnQ7Ci0JaGNkLT5yc3JjX2xlbiA9IGRldi0+cmVzLmVuZCAtIGRldi0+cmVzLnN0YXJ0ICsgMTsKKwloY2QtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZSgmZGV2LT5yZXMpOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuLCBoY2RfbmFtZSkpIHsKIAkJZGJnKCJyZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc2guYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zaC5jCmluZGV4IGY0Nzg2N2YuLjE0Y2VjYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zaC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zaC5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwOCBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgogICoKLSAqIEF1dGhvciA6IFlvc2hpaGlybyBTaGltb2RhIDxzaGltb2RhLnlvc2hpaGlyb0ByZW5lc2FzLmNvbT4KKyAqIEF1dGhvciA6IFlvc2hpaGlybyBTaGltb2RhIDx5b3NoaWhpcm8uc2hpbW9kYS51aEByZW5lc2FzLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zbTUwMS5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNtNTAxLmMKaW5kZXggMDQxZDMwZi4uNzg5MThjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNtNTAxLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNtNTAxLmMKQEAgLTEwMyw4ICsxMDMsNyBAQAogCQlnb3RvIGVycjA7CiAJfQogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtLT5zdGFydCwgbWVtLT5lbmQgLSBtZW0tPnN0YXJ0ICsgMSwKLQkJCQlwZGV2LT5uYW1lKSkgeworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSwgcGRldi0+bmFtZSkpIHsKIAkJZGV2X2VycihkZXYsICJyZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkXG4iKTsKIAkJcmV0dmFsID0gLUVCVVNZOwogCQlnb3RvIGVycjA7CkBAIC0xMjYsNyArMTI1LDcgQEAKIAogCWlmICghZG1hX2RlY2xhcmVfY29oZXJlbnRfbWVtb3J5KGRldiwgbWVtLT5zdGFydCwKIAkJCQkJIG1lbS0+c3RhcnQgLSBtZW0tPnBhcmVudC0+c3RhcnQsCi0JCQkJCSAobWVtLT5lbmQgLSBtZW0tPnN0YXJ0KSArIDEsCisJCQkJCSByZXNvdXJjZV9zaXplKG1lbSksCiAJCQkJCSBETUFfTUVNT1JZX01BUCB8CiAJCQkJCSBETUFfTUVNT1JZX0VYQ0xVU0lWRSkpIHsKIAkJZGV2X2VycihkZXYsICJjYW5ub3QgZGVjbGFyZSBjb2hlcmVudCBtZW1vcnlcbiIpOwpAQCAtMTQ5LDcgKzE0OCw3IEBACiAJfQogCiAJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzLT5zdGFydDsKLQloY2QtPnJzcmNfbGVuID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwloY2QtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuLAlwZGV2LT5uYW1lKSkgewogCQlkZXZfZXJyKGRldiwgInJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWRcbiIpOwpAQCAtMTg1LDcgKzE4NCw3IEBACiBlcnIyOgogCWRtYV9yZWxlYXNlX2RlY2xhcmVkX21lbW9yeShkZXYpOwogZXJyMToKLQlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgbWVtLT5lbmQgLSBtZW0tPnN0YXJ0ICsgMSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CiBlcnIwOgogCXJldHVybiByZXR2YWw7CiB9CkBAIC0yMDEsNyArMjAwLDcgQEAKIAlkbWFfcmVsZWFzZV9kZWNsYXJlZF9tZW1vcnkoJnBkZXYtPmRldik7CiAJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKIAlpZiAobWVtKQotCQlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgbWVtLT5lbmQgLSBtZW0tPnN0YXJ0ICsgMSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOwogCiAJLyogbWFzayBpbnRlcnJ1cHRzIGFuZCBkaXNhYmxlIHBvd2VyICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zc2IuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zc2IuYwppbmRleCA0OGVlNjk0Li5jNGFlYTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc3NiLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNzYi5jCkBAIC0yLDcgKzIsNyBAQAogICogU29uaWNzIFNpbGljb24gQmFja3BsYW5lCiAgKiBCcm9hZGNvbSBVU0ItY29yZSBPSENJIGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAyMDA3IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgKiBDb3B5cmlnaHQgMjAwNyBNaWNoYWVsIEJ1ZXNjaCA8bUBidWVzLmNoPgogICoKICAqIERlcml2ZWQgZnJvbSB0aGUgT0hDSS1QQ0kgZHJpdmVyCiAgKiBDb3B5cmlnaHQgMTk5OSBSb21hbiBXZWlzc2dhZXJiZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS10bWlvLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktdG1pby5jCmluZGV4IDM1NTg0OTEuLjU3YWQxMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS10bWlvLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXRtaW8uYwpAQCAtMjA4LDEzICsyMDgsMTMgQEAKIAl9CiAKIAloY2QtPnJzcmNfc3RhcnQgPSByZWdzLT5zdGFydDsKLQloY2QtPnJzcmNfbGVuID0gcmVncy0+ZW5kIC0gcmVncy0+c3RhcnQgKyAxOworCWhjZC0+cnNyY19sZW4gPSByZXNvdXJjZV9zaXplKHJlZ3MpOwogCiAJdG1pbyA9IGhjZF90b190bWlvKGhjZCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmdG1pby0+bG9jayk7CiAKLQl0bWlvLT5jY3IgPSBpb3JlbWFwKGNvbmZpZy0+c3RhcnQsIGNvbmZpZy0+ZW5kIC0gY29uZmlnLT5zdGFydCArIDEpOworCXRtaW8tPmNjciA9IGlvcmVtYXAoY29uZmlnLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShjb25maWcpKTsKIAlpZiAoIXRtaW8tPmNjcikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9pb3JlbWFwX2NjcjsKQEAgLTIyOCw3ICsyMjgsNyBAQAogCiAJaWYgKCFkbWFfZGVjbGFyZV9jb2hlcmVudF9tZW1vcnkoJmRldi0+ZGV2LCBzcmFtLT5zdGFydCwKIAkJCQlzcmFtLT5zdGFydCwKLQkJCQlzcmFtLT5lbmQgLSBzcmFtLT5zdGFydCArIDEsCisJCQkJcmVzb3VyY2Vfc2l6ZShzcmFtKSwKIAkJCQlETUFfTUVNT1JZX01BUCB8IERNQV9NRU1PUllfRVhDTFVTSVZFKSkgewogCQlyZXQgPSAtRUJVU1k7CiAJCWdvdG8gZXJyX2RtYV9kZWNsYXJlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAtaGNkLmMKaW5kZXggNWZiZTk5Ny4uZGNkODg5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L294dTIxMGhwLWhjZC5jCkBAIC0zODI4LDcgKzM4MjgsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJbWVtc3RhcnQgPSByZXMtPnN0YXJ0OwotCW1lbWxlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJbWVtbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCWRldl9kYmcoJnBkZXYtPmRldiwgIk1FTSByZXNvdXJjZSAlbHgtJWx4XG4iLCBtZW1zdGFydCwgbWVtbGVuKTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW1zdGFydCwgbWVtbGVuLAogCQkJCW94dV9oY19kcml2ZXIuZGVzY3JpcHRpb24pKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MuYyBiL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCmluZGV4IGZkOTMwNjEuLmE5ZDMxNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCkBAIC0zNSw2ICszNSw4IEBACiAjZGVmaW5lIE9IQ0lfSU5UUlNUQVRVUwkJMHgwYwogI2RlZmluZSBPSENJX0lOVFJFTkFCTEUJCTB4MTAKICNkZWZpbmUgT0hDSV9JTlRSRElTQUJMRQkweDE0CisjZGVmaW5lIE9IQ0lfRk1JTlRFUlZBTAkJMHgzNAorI2RlZmluZSBPSENJX0hDUgkJKDEgPDwgMCkJLyogaG9zdCBjb250cm9sbGVyIHJlc2V0ICovCiAjZGVmaW5lIE9IQ0lfT0NSCQkoMSA8PCAzKQkvKiBvd25lcnNoaXAgY2hhbmdlIHJlcXVlc3QgKi8KICNkZWZpbmUgT0hDSV9DVFJMX1JXQwkJKDEgPDwgOSkJLyogcmVtb3RlIHdha2V1cCBjb25uZWN0ZWQgKi8KICNkZWZpbmUgT0hDSV9DVFJMX0lSCQkoMSA8PCA4KQkvKiBpbnRlcnJ1cHQgcm91dGluZyAqLwpAQCAtNDk3LDYgKzQ5OSwzMiBAQAogCiAJLyogcmVzZXQgY29udHJvbGxlciwgcHJlc2VydmluZyBSV0MgKGFuZCBwb3NzaWJseSBJUikgKi8KIAl3cml0ZWwoY29udHJvbCAmIE9IQ0lfQ1RSTF9NQVNLLCBiYXNlICsgT0hDSV9DT05UUk9MKTsKKwlyZWFkbChiYXNlICsgT0hDSV9DT05UUk9MKTsKKworCS8qIFNvbWUgTlZJRElBIGNvbnRyb2xsZXJzIHN0b3Agd29ya2luZyBpZiBrZXB0IGluIFJFU0VUIGZvciB0b28gbG9uZyAqLworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9OVklESUEpIHsKKwkJdTMyIGZtaW50ZXJ2YWw7CisJCWludCBjbnQ7CisKKwkJLyogZHJpdmUgcmVzZXQgZm9yIGF0IGxlYXN0IDUwIG1zICg3LjEuNy41KSAqLworCQltc2xlZXAoNTApOworCisJCS8qIHNvZnR3YXJlIHJlc2V0IG9mIHRoZSBjb250cm9sbGVyLCBwcmVzZXJ2aW5nIEhjRm1JbnRlcnZhbCAqLworCQlmbWludGVydmFsID0gcmVhZGwoYmFzZSArIE9IQ0lfRk1JTlRFUlZBTCk7CisJCXdyaXRlbChPSENJX0hDUiwgYmFzZSArIE9IQ0lfQ01EU1RBVFVTKTsKKworCQkvKiByZXNldCByZXF1aXJlcyBtYXggMTAgdXMgZGVsYXkgKi8KKwkJZm9yIChjbnQgPSAzMDsgY250ID4gMDsgLS1jbnQpIHsJLyogLi4uIGFsbG93IGV4dHJhIHRpbWUgKi8KKwkJCWlmICgocmVhZGwoYmFzZSArIE9IQ0lfQ01EU1RBVFVTKSAmIE9IQ0lfSENSKSA9PSAwKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEpOworCQl9CisJCXdyaXRlbChmbWludGVydmFsLCBiYXNlICsgT0hDSV9GTUlOVEVSVkFMKTsKKworCQkvKiBOb3cgd2UncmUgaW4gdGhlIFNVU1BFTkQgc3RhdGUgd2l0aCBhbGwgZGV2aWNlcyByZXNldAorCQkgKiBhbmQgd2FrZXVwcyBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZAorCQkgKi8KKwl9CiAKIAkvKgogCSAqIGRpc2FibGUgaW50ZXJydXB0cwpAQCAtNTA3LDIwICs1MzUsMzQgQEAKIAlpb3VubWFwKGJhc2UpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0Y29uc3QgZWhjaV9kbWlfbm9oYW5kb2ZmX3RhYmxlW10gPSB7CisJeworCQkvKiAgUGVnYXRyb24gTHVjaWQgKEV4b1BDKSAqLworCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIkVYT1BHMDY0MTEiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiTHVjaWQtQ0UtMTMzIiksCisJCX0sCisJfSwKKwl7CisJCS8qICBQZWdhdHJvbiBMdWNpZCAoT3JkaXNzaW1vIEFJUklTKSAqLworCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIk0xMUpCIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIkx1Y2lkLUdFLTEzMyIpLAorCQl9LAorCX0sCisJeyB9Cit9OworCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgZWhjaV9iaW9zX2hhbmRvZmYoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJCXZvaWQgX19pb21lbSAqb3BfcmVnX2Jhc2UsCiAJCQkJCXUzMiBjYXAsIHU4IG9mZnNldCkKIHsKIAlpbnQgdHJ5X2hhbmRvZmYgPSAxLCB0cmllZF9oYW5kb2ZmID0gMDsKIAotCS8qIFRoZSBQZWdhdHJvbiBMdWNpZCAoRXhvUEMpIHRhYmxldCBzcG9yYWRpY2FsbHkgd2FpdHMgZm9yIDkwCi0JICogc2Vjb25kcyB0cnlpbmcgdGhlIGhhbmRvZmYgb24gaXRzIHVudXNlZCBjb250cm9sbGVyLiAgU2tpcAotCSAqIGl0LiAqLworCS8qIFRoZSBQZWdhdHJvbiBMdWNpZCB0YWJsZXQgc3BvcmFkaWNhbGx5IHdhaXRzIGZvciA5OCBzZWNvbmRzIHRyeWluZworCSAqIHRoZSBoYW5kb2ZmIG9uIGl0cyB1bnVzZWQgY29udHJvbGxlci4gIFNraXAgaXQuICovCiAJaWYgKHBkZXYtPnZlbmRvciA9PSAweDgwODYgJiYgcGRldi0+ZGV2aWNlID09IDB4MjgzYSkgewotCQljb25zdCBjaGFyICpkbWlfYm4gPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CT0FSRF9OQU1FKTsKLQkJY29uc3QgY2hhciAqZG1pX2J2ID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQklPU19WRVJTSU9OKTsKLQkJaWYgKGRtaV9ibiAmJiAhc3RyY21wKGRtaV9ibiwgIkVYT1BHMDY0MTEiKSAmJgotCQkgICAgZG1pX2J2ICYmICFzdHJjbXAoZG1pX2J2LCAiTHVjaWQtQ0UtMTMzIikpCisJCWlmIChkbWlfY2hlY2tfc3lzdGVtKGVoY2lfZG1pX25vaGFuZG9mZl90YWJsZSkpCiAJCQl0cnlfaGFuZG9mZiA9IDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYwppbmRleCBkYjZmOGI5Li40MGEwZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKQEAgLTYsNyArNiw3IEBACiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBEYXZpZCBCcm93bmVsbAogICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAxOTk5IFJvbWFuIFdlaXNzZ2FlcmJlcgogICoKLSAqIEF1dGhvciA6IFlvc2hpaGlybyBTaGltb2RhIDxzaGltb2RhLnlvc2hpaGlyb0ByZW5lc2FzLmNvbT4KKyAqIEF1dGhvciA6IFlvc2hpaGlybyBTaGltb2RhIDx5b3NoaWhpcm8uc2hpbW9kYS51aEByZW5lc2FzLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE0MzgsNyArMTQzOCw3IEBACiAJaWYgKHBpcGVudW0gPiAwKQogCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgfigxIDw8IHBpcGVudW0pLCBCRU1QU1RTKTsKIAlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIpIHsKLQkJcjhhNjY1OTdfd3JpdGVfZmlmbyhyOGE2NjU5NywgdGQtPnBpcGUtPmZpZm9hZGRyLCBidWYsIHNpemUpOworCQlyOGE2NjU5N193cml0ZV9maWZvKHI4YTY2NTk3LCB0ZC0+cGlwZSwgYnVmLCBzaXplKTsKIAkJaWYgKCF1c2JfcGlwZWJ1bGsodXJiLT5waXBlKSB8fCB0ZC0+bWF4cGFja2V0ICE9IHNpemUpCiAJCQlyOGE2NjU5N193cml0ZShyOGE2NjU5NywgQlZBTCwgdGQtPnBpcGUtPmZpZm9jdHIpOwogCX0KQEAgLTIzMDYsNyArMjMwNiw3IEBACiAKIAkJZGJnKCJyZXN1bWUgcG9ydCA9ICVkIiwgcG9ydCk7CiAJCXJoLT5wb3J0ICY9IH5VU0JfUE9SVF9TVEFUX1NVU1BFTkQ7Ci0JCXJoLT5wb3J0IHw9IFVTQl9QT1JUX1NUQVRfQ19TVVNQRU5EIDwgMTY7CisJCXJoLT5wb3J0IHw9IFVTQl9QT1JUX1NUQVRfQ19TVVNQRU5EIDw8IDE2OwogCQlyOGE2NjU5N19tZGZ5KHI4YTY2NTk3LCBSRVNVTUUsIFJFU1VNRSB8IFVBQ1QsIGR2c3RjdHJfcmVnKTsKIAkJbXNsZWVwKDUwKTsKIAkJcjhhNjY1OTdfbWRmeShyOGE2NjU5NywgVUFDVCwgUkVTVU1FIHwgVUFDVCwgZHZzdGN0cl9yZWcpOwpAQCAtMjUxNyw2ICsyNTE3LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmcjhhNjY1OTctPmNoaWxkX2RldmljZSk7CiAKIAloY2QtPnJzcmNfc3RhcnQgPSByZXMtPnN0YXJ0OworCWhjZC0+aGFzX3R0ID0gMTsKIAogCXJldCA9IHVzYl9hZGRfaGNkKGhjZCwgaXJxLCBJUlFGX0RJU0FCTEVEIHwgaXJxX3RyaWdnZXIpOwogCWlmIChyZXQgIT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny5oIGIvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny5oCmluZGV4IDI1NTYzZTkuLmYyODc4MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTcuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LmgKQEAgLTIwMSwxMSArMjAxLDI2IEBACiAJaW93cml0ZTE2KHZhbCwgcjhhNjY1OTctPnJlZyArIG9mZnNldCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByOGE2NjU5N19tZGZ5KHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcsCisJCQkJIHUxNiB2YWwsIHUxNiBwYXQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXUxNiB0bXA7CisJdG1wID0gcjhhNjY1OTdfcmVhZChyOGE2NjU5Nywgb2Zmc2V0KTsKKwl0bXAgPSB0bXAgJiAofnBhdCk7CisJdG1wID0gdG1wIHwgdmFsOworCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCB0bXAsIG9mZnNldCk7Cit9CisKKyNkZWZpbmUgcjhhNjY1OTdfYmNscihyOGE2NjU5NywgdmFsLCBvZmZzZXQpCVwKKwkJCXI4YTY2NTk3X21kZnkocjhhNjY1OTcsIDAsIHZhbCwgb2Zmc2V0KQorI2RlZmluZSByOGE2NjU5N19ic2V0KHI4YTY2NTk3LCB2YWwsIG9mZnNldCkJXAorCQkJcjhhNjY1OTdfbWRmeShyOGE2NjU5NywgdmFsLCAwLCBvZmZzZXQpCisKIHN0YXRpYyBpbmxpbmUgdm9pZCByOGE2NjU5N193cml0ZV9maWZvKHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1MTYgKmJ1ZiwKKwkJCQkgICAgICAgc3RydWN0IHI4YTY2NTk3X3BpcGUgKnBpcGUsIHUxNiAqYnVmLAogCQkJCSAgICAgICBpbnQgbGVuKQogewotCXZvaWQgX19pb21lbSAqZmlmb2FkZHIgPSByOGE2NjU5Ny0+cmVnICsgb2Zmc2V0OworCXZvaWQgX19pb21lbSAqZmlmb2FkZHIgPSByOGE2NjU5Ny0+cmVnICsgcGlwZS0+Zmlmb2FkZHI7CiAJdW5zaWduZWQgbG9uZyBjb3VudDsKIAl1bnNpZ25lZCBjaGFyICpwYjsKIAlpbnQgaTsKQEAgLTIzMCwyNiArMjQ1LDE1IEBACiAJCWlvd3JpdGUxNl9yZXAoZmlmb2FkZHIsIGJ1ZiwgbGVuKTsKIAkJaWYgKHVubGlrZWx5KG9kZCkpIHsKIAkJCWJ1ZiA9ICZidWZbbGVuXTsKKwkJCWlmIChyOGE2NjU5Ny0+cGRhdGEtPndyMF9zaG9ydGVkX3RvX3dyMSkKKwkJCQlyOGE2NjU5N19iY2xyKHI4YTY2NTk3LCBNQldfMTYsIHBpcGUtPmZpZm9zZWwpOwogCQkJaW93cml0ZTgoKHVuc2lnbmVkIGNoYXIpKmJ1ZiwgZmlmb2FkZHIpOworCQkJaWYgKHI4YTY2NTk3LT5wZGF0YS0+d3IwX3Nob3J0ZWRfdG9fd3IxKQorCQkJCXI4YTY2NTk3X2JzZXQocjhhNjY1OTcsIE1CV18xNiwgcGlwZS0+Zmlmb3NlbCk7CiAJCX0KIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByOGE2NjU5N19tZGZ5KHN0cnVjdCByOGE2NjU5NyAqcjhhNjY1OTcsCi0JCQkJIHUxNiB2YWwsIHUxNiBwYXQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotCXUxNiB0bXA7Ci0JdG1wID0gcjhhNjY1OTdfcmVhZChyOGE2NjU5Nywgb2Zmc2V0KTsKLQl0bXAgPSB0bXAgJiAofnBhdCk7Ci0JdG1wID0gdG1wIHwgdmFsOwotCXI4YTY2NTk3X3dyaXRlKHI4YTY2NTk3LCB0bXAsIG9mZnNldCk7Ci19Ci0KLSNkZWZpbmUgcjhhNjY1OTdfYmNscihyOGE2NjU5NywgdmFsLCBvZmZzZXQpCVwKLQkJCXI4YTY2NTk3X21kZnkocjhhNjY1OTcsIDAsIHZhbCwgb2Zmc2V0KQotI2RlZmluZSByOGE2NjU5N19ic2V0KHI4YTY2NTk3LCB2YWwsIG9mZnNldCkJXAotCQkJcjhhNjY1OTdfbWRmeShyOGE2NjU5NywgdmFsLCAwLCBvZmZzZXQpCi0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfc3lzY2ZnX3JlZyhpbnQgcG9ydCkKIHsKIAlyZXR1cm4gcG9ydCA9PSAwID8gU1lTQ0ZHMCA6IFNZU0NGRzE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktZ3JsaWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1ncmxpYi5jCmluZGV4IGQwMWMxZTIuLmY3YTYyMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1ncmxpYi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1ncmxpYi5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAloY2QtPnJzcmNfc3RhcnQgPSByZXMuc3RhcnQ7Ci0JaGNkLT5yc3JjX2xlbiA9IHJlcy5lbmQgLSByZXMuc3RhcnQgKyAxOworCWhjZC0+cnNyY19sZW4gPSByZXNvdXJjZV9zaXplKCZyZXMpOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuLCBoY2RfbmFtZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZFxuIiwgX19GSUxFX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC93aGNpL2luaXQuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9pbml0LmMKaW5kZXggZjc1ODJlOC4uZDNlMTNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC93aGNpL2luaXQuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaW5pdC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAlpZiAod2hjLT5xc2V0X3Bvb2wpCiAJCWRtYV9wb29sX2Rlc3Ryb3kod2hjLT5xc2V0X3Bvb2wpOwogCi0JbGVuICAgPSB3aGMtPnVtYy0+cmVzb3VyY2UuZW5kIC0gd2hjLT51bWMtPnJlc291cmNlLnN0YXJ0ICsgMTsKKwlsZW4gICA9IHJlc291cmNlX3NpemUoJndoYy0+dW1jLT5yZXNvdXJjZSk7CiAJaWYgKHdoYy0+YmFzZSkKIAkJaW91bm1hcCh3aGMtPmJhc2UpOwogCWlmICh3aGMtPmJhc2VfcGh5cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1kYmcuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1kYmcuYwppbmRleCAyZTA0ODYxLi5lOWIwZjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktZGJnLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWRiZy5jCkBAIC0yNjYsMTEgKzI2NiwxMSBAQAogCQl4aGNpX2RiZyh4aGNpLCAiSW50ZXJydXB0ZXIgdGFyZ2V0ID0gMHgleFxuIiwKIAkJCSBHRVRfSU5UUl9UQVJHRVQobGUzMl90b19jcHUodHJiLT5saW5rLmludHJfdGFyZ2V0KSkpOwogCQl4aGNpX2RiZyh4aGNpLCAiQ3ljbGUgYml0ID0gJXVcbiIsCi0JCQkgKHVuc2lnbmVkIGludCkgKGxlMzJfdG9fY3B1KHRyYi0+bGluay5jb250cm9sKSAmIFRSQl9DWUNMRSkpOworCQkJIGxlMzJfdG9fY3B1KHRyYi0+bGluay5jb250cm9sKSAmIFRSQl9DWUNMRSk7CiAJCXhoY2lfZGJnKHhoY2ksICJUb2dnbGUgY3ljbGUgYml0ID0gJXVcbiIsCi0JCQkgKHVuc2lnbmVkIGludCkgKGxlMzJfdG9fY3B1KHRyYi0+bGluay5jb250cm9sKSAmIExJTktfVE9HR0xFKSk7CisJCQkgbGUzMl90b19jcHUodHJiLT5saW5rLmNvbnRyb2wpICYgTElOS19UT0dHTEUpOwogCQl4aGNpX2RiZyh4aGNpLCAiTm8gU25vb3AgYml0ID0gJXVcbiIsCi0JCQkgKHVuc2lnbmVkIGludCkgKGxlMzJfdG9fY3B1KHRyYi0+bGluay5jb250cm9sKSAmIFRSQl9OT19TTk9PUCkpOworCQkJIGxlMzJfdG9fY3B1KHRyYi0+bGluay5jb250cm9sKSAmIFRSQl9OT19TTk9PUCk7CiAJCWJyZWFrOwogCWNhc2UgVFJCX1RZUEUoVFJCX1RSQU5TRkVSKToKIAkJYWRkcmVzcyA9IGxlNjRfdG9fY3B1KHRyYi0+dHJhbnNfZXZlbnQuYnVmZmVyKTsKQEAgLTI4NCw5ICsyODQsOSBAQAogCQlhZGRyZXNzID0gbGU2NF90b19jcHUodHJiLT5ldmVudF9jbWQuY21kX3RyYik7CiAJCXhoY2lfZGJnKHhoY2ksICJDb21tYW5kIFRSQiBwb2ludGVyID0gJWxsdVxuIiwgYWRkcmVzcyk7CiAJCXhoY2lfZGJnKHhoY2ksICJDb21wbGV0aW9uIHN0YXR1cyA9ICV1XG4iLAotCQkJICh1bnNpZ25lZCBpbnQpIEdFVF9DT01QX0NPREUobGUzMl90b19jcHUodHJiLT5ldmVudF9jbWQuc3RhdHVzKSkpOworCQkJIEdFVF9DT01QX0NPREUobGUzMl90b19jcHUodHJiLT5ldmVudF9jbWQuc3RhdHVzKSkpOwogCQl4aGNpX2RiZyh4aGNpLCAiRmxhZ3MgPSAweCV4XG4iLAotCQkJICh1bnNpZ25lZCBpbnQpIGxlMzJfdG9fY3B1KHRyYi0+ZXZlbnRfY21kLmZsYWdzKSk7CisJCQkgbGUzMl90b19jcHUodHJiLT5ldmVudF9jbWQuZmxhZ3MpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJeGhjaV9kYmcoeGhjaSwgIlVua25vd24gVFJCIHdpdGggVFJCIHR5cGUgSUQgJXVcbiIsCkBAIC0zMTgsMTAgKzMxOCwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBUUkJTX1BFUl9TRUdNRU5UOyArK2kpIHsKIAkJdHJiID0gJnNlZy0+dHJic1tpXTsKIAkJeGhjaV9kYmcoeGhjaSwgIkAlMDE2bGx4ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIGFkZHIsCi0JCQkgKHUzMilsb3dlcl8zMl9iaXRzKGxlNjRfdG9fY3B1KHRyYi0+bGluay5zZWdtZW50X3B0cikpLAotCQkJICh1MzIpdXBwZXJfMzJfYml0cyhsZTY0X3RvX2NwdSh0cmItPmxpbmsuc2VnbWVudF9wdHIpKSwKLQkJCSAodW5zaWduZWQgaW50KSBsZTMyX3RvX2NwdSh0cmItPmxpbmsuaW50cl90YXJnZXQpLAotCQkJICh1bnNpZ25lZCBpbnQpIGxlMzJfdG9fY3B1KHRyYi0+bGluay5jb250cm9sKSk7CisJCQkgbG93ZXJfMzJfYml0cyhsZTY0X3RvX2NwdSh0cmItPmxpbmsuc2VnbWVudF9wdHIpKSwKKwkJCSB1cHBlcl8zMl9iaXRzKGxlNjRfdG9fY3B1KHRyYi0+bGluay5zZWdtZW50X3B0cikpLAorCQkJIGxlMzJfdG9fY3B1KHRyYi0+bGluay5pbnRyX3RhcmdldCksCisJCQkgbGUzMl90b19jcHUodHJiLT5saW5rLmNvbnRyb2wpKTsKIAkJYWRkciArPSBzaXplb2YoKnRyYik7CiAJfQogfQpAQCAtNDAyLDggKzQwMiw4IEBACiAJCQkgYWRkciwKIAkJCSBsb3dlcl8zMl9iaXRzKGxlNjRfdG9fY3B1KGVudHJ5LT5zZWdfYWRkcikpLAogCQkJIHVwcGVyXzMyX2JpdHMobGU2NF90b19jcHUoZW50cnktPnNlZ19hZGRyKSksCi0JCQkgKHVuc2lnbmVkIGludCkgbGUzMl90b19jcHUoZW50cnktPnNlZ19zaXplKSwKLQkJCSAodW5zaWduZWQgaW50KSBsZTMyX3RvX2NwdShlbnRyeS0+cnN2ZCkpOworCQkJIGxlMzJfdG9fY3B1KGVudHJ5LT5zZWdfc2l6ZSksCisJCQkgbGUzMl90b19jcHUoZW50cnktPnJzdmQpKTsKIAkJYWRkciArPSBzaXplb2YoKmVudHJ5KTsKIAl9CiB9CkBAIC00MzgsMTMgKzQzOCwxMyBAQAogCXN0cnVjdCB4aGNpX3Nsb3RfY3R4ICpzbG90X2N0eCA9IHhoY2lfZ2V0X3Nsb3RfY3R4KHhoY2ksIGN0eCk7CiAKIAlzd2l0Y2ggKEdFVF9TTE9UX1NUQVRFKGxlMzJfdG9fY3B1KHNsb3RfY3R4LT5kZXZfc3RhdGUpKSkgewotCWNhc2UgMDoKKwljYXNlIFNMT1RfU1RBVEVfRU5BQkxFRDoKIAkJcmV0dXJuICJlbmFibGVkL2Rpc2FibGVkIjsKLQljYXNlIDE6CisJY2FzZSBTTE9UX1NUQVRFX0RFRkFVTFQ6CiAJCXJldHVybiAiZGVmYXVsdCI7Ci0JY2FzZSAyOgorCWNhc2UgU0xPVF9TVEFURV9BRERSRVNTRUQ6CiAJCXJldHVybiAiYWRkcmVzc2VkIjsKLQljYXNlIDM6CisJY2FzZSBTTE9UX1NUQVRFX0NPTkZJR1VSRUQ6CiAJCXJldHVybiAiY29uZmlndXJlZCI7CiAJZGVmYXVsdDoKIAkJcmV0dXJuICJyZXNlcnZlZCI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMKaW5kZXggMjZjYWJhNC4uZDQ0Njg4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYwpAQCAtODksOCArODksOCBAQAogCQlyZXR1cm47CiAJcHJldi0+bmV4dCA9IG5leHQ7CiAJaWYgKGxpbmtfdHJicykgewotCQlwcmV2LT50cmJzW1RSQlNfUEVSX1NFR01FTlQtMV0ubGluay4KLQkJCXNlZ21lbnRfcHRyID0gY3B1X3RvX2xlNjQobmV4dC0+ZG1hKTsKKwkJcHJldi0+dHJic1tUUkJTX1BFUl9TRUdNRU5ULTFdLmxpbmsuc2VnbWVudF9wdHIgPQorCQkJY3B1X3RvX2xlNjQobmV4dC0+ZG1hKTsKIAogCQkvKiBTZXQgdGhlIGxhc3QgVFJCIGluIHRoZSBzZWdtZW50IHRvIGhhdmUgYSBUUkIgdHlwZSBJRCBvZiBMaW5rIFRSQiAqLwogCQl2YWwgPSBsZTMyX3RvX2NwdShwcmV2LT50cmJzW1RSQlNfUEVSX1NFR01FTlQtMV0ubGluay5jb250cm9sKTsKQEAgLTE4Nyw4ICsxODcsOCBAQAogCiAJaWYgKGxpbmtfdHJicykgewogCQkvKiBTZWUgc2VjdGlvbiA0LjkuMi4xIGFuZCA2LjQuNC4xICovCi0JCXByZXYtPnRyYnNbVFJCU19QRVJfU0VHTUVOVC0xXS5saW5rLgotCQkJY29udHJvbCB8PSBjcHVfdG9fbGUzMihMSU5LX1RPR0dMRSk7CisJCXByZXYtPnRyYnNbVFJCU19QRVJfU0VHTUVOVC0xXS5saW5rLmNvbnRyb2wgfD0KKwkJCWNwdV90b19sZTMyKExJTktfVE9HR0xFKTsKIAkJeGhjaV9kYmcoeGhjaSwgIldyb3RlIGxpbmsgdG9nZ2xlIGZsYWcgdG8iCiAJCQkJIiBzZWdtZW50ICVwICh2aXJ0dWFsKSwgMHglbGx4IChETUEpXG4iLAogCQkJCXByZXYsICh1bnNpZ25lZCBsb25nIGxvbmcpcHJldi0+ZG1hKTsKQEAgLTU0OSw4ICs1NDksOCBAQAogCQlhZGRyID0gY3VyX3JpbmctPmZpcnN0X3NlZy0+ZG1hIHwKIAkJCVNDVF9GT1JfQ1RYKFNDVF9QUklfVFIpIHwKIAkJCWN1cl9yaW5nLT5jeWNsZV9zdGF0ZTsKLQkJc3RyZWFtX2luZm8tPnN0cmVhbV9jdHhfYXJyYXlbY3VyX3N0cmVhbV0uCi0JCQlzdHJlYW1fcmluZyA9IGNwdV90b19sZTY0KGFkZHIpOworCQlzdHJlYW1faW5mby0+c3RyZWFtX2N0eF9hcnJheVtjdXJfc3RyZWFtXS5zdHJlYW1fcmluZyA9CisJCQljcHVfdG9fbGU2NChhZGRyKTsKIAkJeGhjaV9kYmcoeGhjaSwgIlNldHRpbmcgc3RyZWFtICVkIHJpbmcgcHRyIHRvIDB4JTA4bGx4XG4iLAogCQkJCWN1cl9zdHJlYW0sICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkZHIpOwogCkBAIC03ODYsNyArNzg2LDcgQEAKIAl4aGNpX2RiZyh4aGNpLCAiU2V0IHNsb3QgaWQgJWQgZGNiYWEgZW50cnkgJXAgdG8gMHglbGx4XG4iLAogCQkgc2xvdF9pZCwKIAkJICZ4aGNpLT5kY2JhYS0+ZGV2X2NvbnRleHRfcHRyc1tzbG90X2lkXSwKLQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGxlNjRfdG9fY3B1KHhoY2ktPmRjYmFhLT5kZXZfY29udGV4dF9wdHJzW3Nsb3RfaWRdKSk7CisJCSBsZTY0X3RvX2NwdSh4aGNpLT5kY2JhYS0+ZGV2X2NvbnRleHRfcHRyc1tzbG90X2lkXSkpOwogCiAJcmV0dXJuIDE7CiBmYWlsOgpAQCAtODkwLDE5ICs4OTAsMTkgQEAKIAljdHJsX2N0eC0+YWRkX2ZsYWdzID0gY3B1X3RvX2xlMzIoU0xPVF9GTEFHIHwgRVAwX0ZMQUcpOwogCiAJLyogMykgT25seSB0aGUgY29udHJvbCBlbmRwb2ludCBpcyB2YWxpZCAtIG9uZSBlbmRwb2ludCBjb250ZXh0ICovCi0Jc2xvdF9jdHgtPmRldl9pbmZvIHw9IGNwdV90b19sZTMyKExBU1RfQ1RYKDEpIHwgKHUzMikgdWRldi0+cm91dGUpOworCXNsb3RfY3R4LT5kZXZfaW5mbyB8PSBjcHVfdG9fbGUzMihMQVNUX0NUWCgxKSB8IHVkZXYtPnJvdXRlKTsKIAlzd2l0Y2ggKHVkZXYtPnNwZWVkKSB7CiAJY2FzZSBVU0JfU1BFRURfU1VQRVI6Ci0JCXNsb3RfY3R4LT5kZXZfaW5mbyB8PSBjcHVfdG9fbGUzMigodTMyKSBTTE9UX1NQRUVEX1NTKTsKKwkJc2xvdF9jdHgtPmRldl9pbmZvIHw9IGNwdV90b19sZTMyKFNMT1RfU1BFRURfU1MpOwogCQlicmVhazsKIAljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQlzbG90X2N0eC0+ZGV2X2luZm8gfD0gY3B1X3RvX2xlMzIoKHUzMikgU0xPVF9TUEVFRF9IUyk7CisJCXNsb3RfY3R4LT5kZXZfaW5mbyB8PSBjcHVfdG9fbGUzMihTTE9UX1NQRUVEX0hTKTsKIAkJYnJlYWs7CiAJY2FzZSBVU0JfU1BFRURfRlVMTDoKLQkJc2xvdF9jdHgtPmRldl9pbmZvIHw9IGNwdV90b19sZTMyKCh1MzIpIFNMT1RfU1BFRURfRlMpOworCQlzbG90X2N0eC0+ZGV2X2luZm8gfD0gY3B1X3RvX2xlMzIoU0xPVF9TUEVFRF9GUyk7CiAJCWJyZWFrOwogCWNhc2UgVVNCX1NQRUVEX0xPVzoKLQkJc2xvdF9jdHgtPmRldl9pbmZvIHw9IGNwdV90b19sZTMyKCh1MzIpIFNMT1RfU1BFRURfTFMpOworCQlzbG90X2N0eC0+ZGV2X2luZm8gfD0gY3B1X3RvX2xlMzIoU0xPVF9TUEVFRF9MUyk7CiAJCWJyZWFrOwogCWNhc2UgVVNCX1NQRUVEX1dJUkVMRVNTOgogCQl4aGNpX2RiZyh4aGNpLCAiRklYTUUgeEhDSSBkb2Vzbid0IHN1cHBvcnQgd2lyZWxlc3Mgc3BlZWRzXG4iKTsKQEAgLTkxNiw3ICs5MTYsNyBAQAogCXBvcnRfbnVtID0geGhjaV9maW5kX3JlYWxfcG9ydF9udW1iZXIoeGhjaSwgdWRldik7CiAJaWYgKCFwb3J0X251bSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0Jc2xvdF9jdHgtPmRldl9pbmZvMiB8PSBjcHVfdG9fbGUzMigodTMyKSBST09UX0hVQl9QT1JUKHBvcnRfbnVtKSk7CisJc2xvdF9jdHgtPmRldl9pbmZvMiB8PSBjcHVfdG9fbGUzMihST09UX0hVQl9QT1JUKHBvcnRfbnVtKSk7CiAJLyogU2V0IHRoZSBwb3J0IG51bWJlciBpbiB0aGUgdmlydHVhbF9kZXZpY2UgdG8gdGhlIGZha2VkIHBvcnQgbnVtYmVyICovCiAJZm9yICh0b3BfZGV2ID0gdWRldjsgdG9wX2Rldi0+cGFyZW50ICYmIHRvcF9kZXYtPnBhcmVudC0+cGFyZW50OwogCQkJdG9wX2RldiA9IHRvcF9kZXYtPnBhcmVudCkKQEAgLTk4NSw5ICs5ODUsMTkgQEAKIAlpbnRlcnZhbCA9IGNsYW1wX3ZhbChlcC0+ZGVzYy5iSW50ZXJ2YWwsIDEsIDE2KSAtIDE7CiAJaWYgKGludGVydmFsICE9IGVwLT5kZXNjLmJJbnRlcnZhbCAtIDEpCiAJCWRldl93YXJuKCZ1ZGV2LT5kZXYsCi0JCQkgImVwICUjeCAtIHJvdW5kaW5nIGludGVydmFsIHRvICVkIG1pY3JvZnJhbWVzXG4iLAorCQkJICJlcCAlI3ggLSByb3VuZGluZyBpbnRlcnZhbCB0byAlZCAlc2ZyYW1lc1xuIiwKIAkJCSBlcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzLAotCQkJIDEgPDwgaW50ZXJ2YWwpOworCQkJIDEgPDwgaW50ZXJ2YWwsCisJCQkgdWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0ZVTEwgPyAiIiA6ICJtaWNybyIpOworCisJaWYgKHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMKSB7CisJCS8qCisJCSAqIEZ1bGwgc3BlZWQgaXNvYyBlbmRwb2ludHMgc3BlY2lmeSBpbnRlcnZhbCBpbiBmcmFtZXMsCisJCSAqIG5vdCBtaWNyb2ZyYW1lcy4gV2UgYXJlIHVzaW5nIG1pY3JvZnJhbWVzIGV2ZXJ5d2hlcmUsCisJCSAqIHNvIGFkanVzdCBhY2NvcmRpbmdseS4KKwkJICovCisJCWludGVydmFsICs9IDM7CS8qIDEgZnJhbWUgPSAyXjMgdWZyYW1lcyAqLworCX0KIAogCXJldHVybiBpbnRlcnZhbDsKIH0KQEAgLTEyMDUsOCArMTIxNSw2IEBACiAJCWVwX2N0eC0+ZXBfaW5mbzIgfD0gY3B1X3RvX2xlMzIoTUFYX1BBQ0tFVChtYXhfcGFja2V0KSk7CiAJCS8qIGRpZyBvdXQgbWF4IGJ1cnN0IGZyb20gZXAgY29tcGFuaW9uIGRlc2MgKi8KIAkJbWF4X3BhY2tldCA9IGVwLT5zc19lcF9jb21wLmJNYXhCdXJzdDsKLQkJaWYgKCFtYXhfcGFja2V0KQotCQkJeGhjaV93YXJuKHhoY2ksICJXQVJOIG5vIFNTIGVuZHBvaW50IGJNYXhCdXJzdFxuIik7CiAJCWVwX2N0eC0+ZXBfaW5mbzIgfD0gY3B1X3RvX2xlMzIoTUFYX0JVUlNUKG1heF9wYWNrZXQpKTsKIAkJYnJlYWs7CiAJY2FzZSBVU0JfU1BFRURfSElHSDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYwppbmRleCBjNDA4ZTlmLi5jYjE2ZGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCkBAIC0yOSw2ICsyOSw5IEBACiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfRlJFU0NPX0xPR0lDCTB4MWI3MwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZSRVNDT19MT0dJQ19QREsJMHgxMDAwCiAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FVFJPTgkJMHgxYjZmCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVNST0NLX1A2NwkweDcwMjMKKwogc3RhdGljIGNvbnN0IGNoYXIgaGNkX25hbWVbXSA9ICJ4aGNpX2hjZCI7CiAKIC8qIGNhbGxlZCBhZnRlciBwb3dlcnVwLCBieSBwcm9iZSBvciBzeXN0ZW0tcG0gIndha2V1cCIgKi8KQEAgLTEwNiwxMiArMTA5LDIyIEBACiAKIAkvKiBMb29rIGZvciB2ZW5kb3Itc3BlY2lmaWMgcXVpcmtzICovCiAJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0ZSRVNDT19MT0dJQyAmJgotCQkJcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfRlJFU0NPX0xPR0lDX1BESyAmJgotCQkJcGRldi0+cmV2aXNpb24gPT0gMHgwKSB7CisJCQlwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9GUkVTQ09fTE9HSUNfUERLKSB7CisJCWlmIChwZGV2LT5yZXZpc2lvbiA9PSAweDApIHsKIAkJCXhoY2ktPnF1aXJrcyB8PSBYSENJX1JFU0VUX0VQX1FVSVJLOwogCQkJeGhjaV9kYmcoeGhjaSwgIlFVSVJLOiBGcmVzY28gTG9naWMgeEhDIG5lZWRzIGNvbmZpZ3VyZSIKIAkJCQkJIiBlbmRwb2ludCBjbWQgYWZ0ZXIgcmVzZXQgZW5kcG9pbnRcbiIpOworCQl9CisJCS8qIEZyZXNjbyBMb2dpYyBjb25maXJtczogYWxsIHJldmlzaW9ucyBvZiB0aGlzIGNoaXAgZG8gbm90CisJCSAqIHN1cHBvcnQgTVNJLCBldmVuIHRob3VnaCBzb21lIG9mIHRoZW0gY2xhaW0gdG8gaW4gdGhlaXIgUENJCisJCSAqIGNhcGFiaWxpdGllcy4KKwkJICovCisJCXhoY2ktPnF1aXJrcyB8PSBYSENJX0JST0tFTl9NU0k7CisJCXhoY2lfZGJnKHhoY2ksICJRVUlSSzogRnJlc2NvIExvZ2ljIHJldmlzaW9uICV1ICIKKwkJCQkiaGFzIGJyb2tlbiBNU0kgaW1wbGVtZW50YXRpb25cbiIsCisJCQkJcGRldi0+cmV2aXNpb24pOwogCX0KKwogCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ORUMpCiAJCXhoY2ktPnF1aXJrcyB8PSBYSENJX05FQ19IT1NUOwogCkBAIC0xMjQsNiArMTM3LDExIEBACiAJCXhoY2ktPnF1aXJrcyB8PSBYSENJX0VQX0xJTUlUX1FVSVJLOwogCQl4aGNpLT5saW1pdF9hY3RpdmVfZXBzID0gNjQ7CiAJfQorCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9FVFJPTiAmJgorCQkJcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVNST0NLX1A2NykgeworCQl4aGNpLT5xdWlya3MgfD0gWEhDSV9SRVNFVF9PTl9SRVNVTUU7CisJCXhoY2lfZGJnKHhoY2ksICJRVUlSSzogUmVzZXR0aW5nIG9uIHJlc3VtZVxuIik7CisJfQogCiAJLyogTWFrZSBzdXJlIHRoZSBIQyBpcyBoYWx0ZWQuICovCiAJcmV0dmFsID0geGhjaV9oYWx0KHhoY2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKaW5kZXggY2MxNDg1Yi4uNzExM2QxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCkBAIC0xMTMsMTUgKzExMywxMyBAQAogCWlmIChyaW5nID09IHhoY2ktPmV2ZW50X3JpbmcpCiAJCXJldHVybiB0cmIgPT0gJnNlZy0+dHJic1tUUkJTX1BFUl9TRUdNRU5UXTsKIAllbHNlCi0JCXJldHVybiAobGUzMl90b19jcHUodHJiLT5saW5rLmNvbnRyb2wpICYgVFJCX1RZUEVfQklUTUFTSykKLQkJCT09IFRSQl9UWVBFKFRSQl9MSU5LKTsKKwkJcmV0dXJuIFRSQl9UWVBFX0xJTktfTEUzMih0cmItPmxpbmsuY29udHJvbCk7CiB9CiAKIHN0YXRpYyBpbnQgZW5xdWV1ZV9pc19saW5rX3RyYihzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQogewogCXN0cnVjdCB4aGNpX2xpbmtfdHJiICpsaW5rID0gJnJpbmctPmVucXVldWUtPmxpbms7Ci0JcmV0dXJuICgobGUzMl90b19jcHUobGluay0+Y29udHJvbCkgJiBUUkJfVFlQRV9CSVRNQVNLKSA9PQotCQlUUkJfVFlQRShUUkJfTElOSykpOworCXJldHVybiBUUkJfVFlQRV9MSU5LX0xFMzIobGluay0+Y29udHJvbCk7CiB9CiAKIC8qIFVwZGF0ZXMgdHJiIHRvIHBvaW50IHRvIHRoZSBuZXh0IFRSQiBpbiB0aGUgcmluZywgYW5kIHVwZGF0ZXMgc2VnIGlmIHRoZSBuZXh0CkBAIC0zNzIsNyArMzcwLDcgQEAKIAl3aGlsZSAoY3VyX3NlZy0+dHJicyA+IHRyYiB8fAogCQkJJmN1cl9zZWctPnRyYnNbVFJCU19QRVJfU0VHTUVOVCAtIDFdIDwgdHJiKSB7CiAJCWdlbmVyaWNfdHJiID0gJmN1cl9zZWctPnRyYnNbVFJCU19QRVJfU0VHTUVOVCAtIDFdLmdlbmVyaWM7Ci0JCWlmIChsZTMyX3RvX2NwdShnZW5lcmljX3RyYi0+ZmllbGRbM10pICYgTElOS19UT0dHTEUpCisJCWlmIChnZW5lcmljX3RyYi0+ZmllbGRbM10gJiBjcHVfdG9fbGUzMihMSU5LX1RPR0dMRSkpCiAJCQkqY3ljbGVfc3RhdGUgXj0gMHgxOwogCQljdXJfc2VnID0gY3VyX3NlZy0+bmV4dDsKIAkJaWYgKGN1cl9zZWcgPT0gc3RhcnRfc2VnKQpAQCAtNDg5LDggKzQ4Nyw4IEBACiAJfQogCiAJdHJiID0gJnN0YXRlLT5uZXdfZGVxX3B0ci0+Z2VuZXJpYzsKLQlpZiAoKGxlMzJfdG9fY3B1KHRyYi0+ZmllbGRbM10pICYgVFJCX1RZUEVfQklUTUFTSykgPT0KLQkgICAgVFJCX1RZUEUoVFJCX0xJTkspICYmIChsZTMyX3RvX2NwdSh0cmItPmZpZWxkWzNdKSAmIExJTktfVE9HR0xFKSkKKwlpZiAoVFJCX1RZUEVfTElOS19MRTMyKHRyYi0+ZmllbGRbM10pICYmCisJICAgICh0cmItPmZpZWxkWzNdICYgY3B1X3RvX2xlMzIoTElOS19UT0dHTEUpKSkKIAkJc3RhdGUtPm5ld19jeWNsZV9zdGF0ZSBePSAweDE7CiAJbmV4dF90cmIoeGhjaSwgZXBfcmluZywgJnN0YXRlLT5uZXdfZGVxX3NlZywgJnN0YXRlLT5uZXdfZGVxX3B0cik7CiAKQEAgLTUyNSw4ICs1MjMsNyBAQAogCWZvciAoY3VyX3NlZyA9IGN1cl90ZC0+c3RhcnRfc2VnLCBjdXJfdHJiID0gY3VyX3RkLT5maXJzdF90cmI7CiAJCQl0cnVlOwogCQkJbmV4dF90cmIoeGhjaSwgZXBfcmluZywgJmN1cl9zZWcsICZjdXJfdHJiKSkgewotCQlpZiAoKGxlMzJfdG9fY3B1KGN1cl90cmItPmdlbmVyaWMuZmllbGRbM10pICYgVFJCX1RZUEVfQklUTUFTSykKLQkJICAgID09IFRSQl9UWVBFKFRSQl9MSU5LKSkgeworCQlpZiAoVFJCX1RZUEVfTElOS19MRTMyKGN1cl90cmItPmdlbmVyaWMuZmllbGRbM10pKSB7CiAJCQkvKiBVbmNoYWluIGFueSBjaGFpbmVkIExpbmsgVFJCcywgYnV0CiAJCQkgKiBsZWF2ZSB0aGUgcG9pbnRlcnMgaW50YWN0LgogCQkJICovCkBAIC0xMDAwLDcgKzk5Nyw3IEBACiAJICogYnV0IHdlIGRvbid0IGNhcmUuCiAJICovCiAJeGhjaV9kYmcoeGhjaSwgIklnbm9yaW5nIHJlc2V0IGVwIGNvbXBsZXRpb24gY29kZSBvZiAldVxuIiwKLQkJICh1bnNpZ25lZCBpbnQpIEdFVF9DT01QX0NPREUobGUzMl90b19jcHUoZXZlbnQtPnN0YXR1cykpKTsKKwkJIEdFVF9DT01QX0NPREUobGUzMl90b19jcHUoZXZlbnQtPnN0YXR1cykpKTsKIAogCS8qIEhXIHdpdGggdGhlIHJlc2V0IGVuZHBvaW50IHF1aXJrIG5lZWRzIHRvIGhhdmUgYSBjb25maWd1cmUgZW5kcG9pbnQKIAkgKiBjb21tYW5kIGNvbXBsZXRlIGJlZm9yZSB0aGUgZW5kcG9pbnQgY2FuIGJlIHVzZWQuICBRdWV1ZSB0aGF0IGhlcmUKQEAgLTE0NTgsNyArMTQ1NSw4IEBACiAJCSAqIGVuZHBvaW50IGFueXdheS4gIENoZWNrIGlmIGEgYmFiYmxlIGhhbHRlZCB0aGUKIAkJICogZW5kcG9pbnQuCiAJCSAqLwotCQlpZiAoKGxlMzJfdG9fY3B1KGVwX2N0eC0+ZXBfaW5mbykgJiBFUF9TVEFURV9NQVNLKSA9PSBFUF9TVEFURV9IQUxURUQpCisJCWlmICgoZXBfY3R4LT5lcF9pbmZvICYgY3B1X3RvX2xlMzIoRVBfU1RBVEVfTUFTSykpID09CisJCSAgICBjcHVfdG9fbGUzMihFUF9TVEFURV9IQUxURUQpKQogCQkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKQEAgLTE3MzMsNiArMTczMSw3IEBACiAJCWZyYW1lLT5zdGF0dXMgPSAtRU9WRVJGTE9XOwogCQlza2lwX3RkID0gdHJ1ZTsKIAkJYnJlYWs7CisJY2FzZSBDT01QX0RFVl9FUlI6CiAJY2FzZSBDT01QX1NUQUxMOgogCQlmcmFtZS0+c3RhdHVzID0gLUVQUk9UTzsKIAkJc2tpcF90ZCA9IHRydWU7CkBAIC0xNzUyLDEwICsxNzUxLDggQEAKIAkJZm9yIChjdXJfdHJiID0gZXBfcmluZy0+ZGVxdWV1ZSwKIAkJICAgICBjdXJfc2VnID0gZXBfcmluZy0+ZGVxX3NlZzsgY3VyX3RyYiAhPSBldmVudF90cmI7CiAJCSAgICAgbmV4dF90cmIoeGhjaSwgZXBfcmluZywgJmN1cl9zZWcsICZjdXJfdHJiKSkgewotCQkJaWYgKChsZTMyX3RvX2NwdShjdXJfdHJiLT5nZW5lcmljLmZpZWxkWzNdKSAmCi0JCQkgVFJCX1RZUEVfQklUTUFTSykgIT0gVFJCX1RZUEUoVFJCX1RSX05PT1ApICYmCi0JCQkgICAgKGxlMzJfdG9fY3B1KGN1cl90cmItPmdlbmVyaWMuZmllbGRbM10pICYKLQkJCSBUUkJfVFlQRV9CSVRNQVNLKSAhPSBUUkJfVFlQRShUUkJfTElOSykpCisJCQlpZiAoIVRSQl9UWVBFX05PT1BfTEUzMihjdXJfdHJiLT5nZW5lcmljLmZpZWxkWzNdKSAmJgorCQkJICAgICFUUkJfVFlQRV9MSU5LX0xFMzIoY3VyX3RyYi0+Z2VuZXJpYy5maWVsZFszXSkpCiAJCQkJbGVuICs9IFRSQl9MRU4obGUzMl90b19jcHUoY3VyX3RyYi0+Z2VuZXJpYy5maWVsZFsyXSkpOwogCQl9CiAJCWxlbiArPSBUUkJfTEVOKGxlMzJfdG9fY3B1KGN1cl90cmItPmdlbmVyaWMuZmllbGRbMl0pKSAtCkBAIC0xNzY3LDkgKzE3NjQsNiBAQAogCQl9CiAJfQogCi0JaWYgKChpZHggPT0gdXJiX3ByaXYtPmxlbmd0aCAtIDEpICYmICpzdGF0dXMgPT0gLUVJTlBST0dSRVNTKQotCQkqc3RhdHVzID0gMDsKLQogCXJldHVybiBmaW5pc2hfdGQoeGhjaSwgdGQsIGV2ZW50X3RyYiwgZXZlbnQsIGVwLCBzdGF0dXMsIGZhbHNlKTsKIH0KIApAQCAtMTc4MiwxMyArMTc3NiwxMiBAQAogCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmcmFtZTsKIAlpbnQgaWR4OwogCi0JZXBfcmluZyA9IHhoY2lfZG1hX3RvX3RyYW5zZmVyX3JpbmcoZXAsIGV2ZW50LT5idWZmZXIpOworCWVwX3JpbmcgPSB4aGNpX2RtYV90b190cmFuc2Zlcl9yaW5nKGVwLCBsZTY0X3RvX2NwdShldmVudC0+YnVmZmVyKSk7CiAJdXJiX3ByaXYgPSB0ZC0+dXJiLT5oY3ByaXY7CiAJaWR4ID0gdXJiX3ByaXYtPnRkX2NudDsKIAlmcmFtZSA9ICZ0ZC0+dXJiLT5pc29fZnJhbWVfZGVzY1tpZHhdOwogCi0JLyogVGhlIHRyYW5zZmVyIGlzIHBhcnRseSBkb25lICovCi0JKnN0YXR1cyA9IC1FWERFVjsKKwkvKiBUaGUgdHJhbnNmZXIgaXMgcGFydGx5IGRvbmUuICovCiAJZnJhbWUtPnN0YXR1cyA9IC1FWERFVjsKIAogCS8qIGNhbGMgYWN0dWFsIGxlbmd0aCAqLwpAQCAtMTg4OCwxMCArMTg4MSw4IEBACiAJCWZvciAoY3VyX3RyYiA9IGVwX3JpbmctPmRlcXVldWUsIGN1cl9zZWcgPSBlcF9yaW5nLT5kZXFfc2VnOwogCQkJCWN1cl90cmIgIT0gZXZlbnRfdHJiOwogCQkJCW5leHRfdHJiKHhoY2ksIGVwX3JpbmcsICZjdXJfc2VnLCAmY3VyX3RyYikpIHsKLQkJCWlmICgobGUzMl90b19jcHUoY3VyX3RyYi0+Z2VuZXJpYy5maWVsZFszXSkgJgotCQkJIFRSQl9UWVBFX0JJVE1BU0spICE9IFRSQl9UWVBFKFRSQl9UUl9OT09QKSAmJgotCQkJICAgIChsZTMyX3RvX2NwdShjdXJfdHJiLT5nZW5lcmljLmZpZWxkWzNdKSAmCi0JCQkgVFJCX1RZUEVfQklUTUFTSykgIT0gVFJCX1RZUEUoVFJCX0xJTkspKQorCQkJaWYgKCFUUkJfVFlQRV9OT09QX0xFMzIoY3VyX3RyYi0+Z2VuZXJpYy5maWVsZFszXSkgJiYKKwkJCSAgICAhVFJCX1RZUEVfTElOS19MRTMyKGN1cl90cmItPmdlbmVyaWMuZmllbGRbM10pKQogCQkJCXRkLT51cmItPmFjdHVhbF9sZW5ndGggKz0KIAkJCQkJVFJCX0xFTihsZTMyX3RvX2NwdShjdXJfdHJiLT5nZW5lcmljLmZpZWxkWzJdKSk7CiAJCX0KQEAgLTIwMTYsNiArMjAwNywxMCBAQAogCQkJCSBUUkJfVE9fU0xPVF9JRChsZTMyX3RvX2NwdShldmVudC0+ZmxhZ3MpKSwKIAkJCQkgZXBfaW5kZXgpOwogCQlnb3RvIGNsZWFudXA7CisJY2FzZSBDT01QX0RFVl9FUlI6CisJCXhoY2lfd2Fybih4aGNpLCAiV0FSTjogZGV0ZWN0IGFuIGluY29tcGF0aWJsZSBkZXZpY2UiKTsKKwkJc3RhdHVzID0gLUVQUk9UTzsKKwkJYnJlYWs7CiAJY2FzZSBDT01QX01JU1NFRF9JTlQ6CiAJCS8qCiAJCSAqIFdoZW4gZW5jb3VudGVyIG1pc3NlZCBzZXJ2aWNlIGVycm9yLCBvbmUgb3IgbW9yZSBpc29jIHRkcwpAQCAtMjA0Niw4ICsyMDQxLDggQEAKIAkJCQkgIFRSQl9UT19TTE9UX0lEKGxlMzJfdG9fY3B1KGV2ZW50LT5mbGFncykpLAogCQkJCSAgZXBfaW5kZXgpOwogCQkJeGhjaV9kYmcoeGhjaSwgIkV2ZW50IFRSQiB3aXRoIFRSQiB0eXBlIElEICV1XG4iLAotCQkJCSAodW5zaWduZWQgaW50KSAobGUzMl90b19jcHUoZXZlbnQtPmZsYWdzKQotCQkJCQkJICYgVFJCX1RZUEVfQklUTUFTSyk+PjEwKTsKKwkJCQkgKGxlMzJfdG9fY3B1KGV2ZW50LT5mbGFncykgJgorCQkJCSAgVFJCX1RZUEVfQklUTUFTSyk+PjEwKTsKIAkJCXhoY2lfcHJpbnRfdHJiX29mZnNldHMoeGhjaSwgKHVuaW9uIHhoY2lfdHJiICopIGV2ZW50KTsKIAkJCWlmIChlcC0+c2tpcCkgewogCQkJCWVwLT5za2lwID0gZmFsc2U7CkBAIC0yMDYzLDYgKzIwNTgsMjAgQEAKIAkJLyogSXMgdGhpcyBhIFRSQiBpbiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBURD8gKi8KIAkJZXZlbnRfc2VnID0gdHJiX2luX3RkKGVwX3JpbmctPmRlcV9zZWcsIGVwX3JpbmctPmRlcXVldWUsCiAJCQkJdGQtPmxhc3RfdHJiLCBldmVudF9kbWEpOworCisJCS8qCisJCSAqIFNraXAgdGhlIEZvcmNlIFN0b3BwZWQgRXZlbnQuIFRoZSBldmVudF90cmIoZXZlbnRfZG1hKSBvZiBGU0UKKwkJICogaXMgbm90IGluIHRoZSBjdXJyZW50IFREIHBvaW50ZWQgYnkgZXBfcmluZy0+ZGVxdWV1ZSBiZWNhdXNlCisJCSAqIHRoYXQgdGhlIGhhcmR3YXJlIGRlcXVldWUgcG9pbnRlciBzdGlsbCBhdCB0aGUgcHJldmlvdXMgVFJCCisJCSAqIG9mIHRoZSBjdXJyZW50IFRELiBUaGUgcHJldmlvdXMgVFJCIG1heWJlIGEgTGluayBURCBvciB0aGUKKwkJICogbGFzdCBUUkIgb2YgdGhlIHByZXZpb3VzIFRELiBUaGUgY29tbWFuZCBjb21wbGV0aW9uIGhhbmRsZQorCQkgKiB3aWxsIHRha2UgY2FyZSB0aGUgcmVzdC4KKwkJICovCisJCWlmICghZXZlbnRfc2VnICYmIHRyYl9jb21wX2NvZGUgPT0gQ09NUF9TVE9QX0lOVkFMKSB7CisJCQlyZXQgPSAwOworCQkJZ290byBjbGVhbnVwOworCQl9CisKIAkJaWYgKCFldmVudF9zZWcpIHsKIAkJCWlmICghZXAtPnNraXAgfHwKIAkJCSAgICAhdXNiX2VuZHBvaW50X3hmZXJfaXNvYygmdGQtPnVyYi0+ZXAtPmRlc2MpKSB7CkBAIC0yMTA0LDkgKzIxMTMsNyBAQAogCQkgKiBjb3JyZXNwb25kaW5nIFREIGhhcyBiZWVuIGNhbmNlbGxlZC4gSnVzdCBpZ25vcmUKIAkJICogdGhlIFRELgogCQkgKi8KLQkJaWYgKChsZTMyX3RvX2NwdShldmVudF90cmItPmdlbmVyaWMuZmllbGRbM10pCi0JCQkgICAgICYgVFJCX1RZUEVfQklUTUFTSykKLQkJCQkgPT0gVFJCX1RZUEUoVFJCX1RSX05PT1ApKSB7CisJCWlmIChUUkJfVFlQRV9OT09QX0xFMzIoZXZlbnRfdHJiLT5nZW5lcmljLmZpZWxkWzNdKSkgewogCQkJeGhjaV9kYmcoeGhjaSwKIAkJCQkgImV2ZW50X3RyYiBpcyBhIG5vLW9wIFRSQi4gU2tpcCBpdFxuIik7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC0yMTU4LDYgKzIxNjUsMTEgQEAKIAkJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJCQkJCXN0YXR1cyk7CiAJCQlzcGluX3VubG9jaygmeGhjaS0+bG9jayk7CisJCQkvKiBFSENJLCBVSENJLCBhbmQgT0hDSSBhbHdheXMgdW5jb25kaXRpb25hbGx5IHNldCB0aGUKKwkJCSAqIHVyYi0+c3RhdHVzIG9mIGFuIGlzb2Nocm9ub3VzIGVuZHBvaW50IHRvIDAuCisJCQkgKi8KKwkJCWlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKQorCQkJCXN0YXR1cyA9IDA7CiAJCQl1c2JfaGNkX2dpdmViYWNrX3VyYihidXNfdG9faGNkKHVyYi0+ZGV2LT5idXMpLCB1cmIsIHN0YXR1cyk7CiAJCQlzcGluX2xvY2soJnhoY2ktPmxvY2spOwogCQl9CkBAIC0yNDMyLDcgKzI0NDQsNyBAQAogCQkJCW5leHQtPmxpbmsuY29udHJvbCB8PSBjcHVfdG9fbGUzMihUUkJfQ0hBSU4pOwogCiAJCQl3bWIoKTsKLQkJCW5leHQtPmxpbmsuY29udHJvbCBePSBjcHVfdG9fbGUzMigodTMyKSBUUkJfQ1lDTEUpOworCQkJbmV4dC0+bGluay5jb250cm9sIF49IGNwdV90b19sZTMyKFRSQl9DWUNMRSk7CiAKIAkJCS8qIFRvZ2dsZSB0aGUgY3ljbGUgYml0IGFmdGVyIHRoZSBsYXN0IHJpbmcgc2VnbWVudC4gKi8KIAkJCWlmIChsYXN0X3RyYl9vbl9sYXN0X3NlZyh4aGNpLCByaW5nLCByaW5nLT5lbnFfc2VnLCBuZXh0KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwppbmRleCBkOTY2MGViLi43NjNmNDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwpAQCAtNDMwLDEyICs0MzAsMTkgQEAKIAkJZnJlZV9pcnEoaGNkLT5pcnEsIGhjZCk7CiAJaGNkLT5pcnEgPSAtMTsKIAorCS8qIFNvbWUgRnJlc2NvIExvZ2ljIGhvc3QgY29udHJvbGxlcnMgYWR2ZXJ0aXNlIE1TSSwgYnV0IGZhaWwgdG8KKwkgKiBnZW5lcmF0ZSBpbnRlcnJ1cHRzLiAgRG9uJ3QgZXZlbiB0cnkgdG8gZW5hYmxlIE1TSS4KKwkgKi8KKwlpZiAoeGhjaS0+cXVpcmtzICYgWEhDSV9CUk9LRU5fTVNJKQorCQlnb3RvIGxlZ2FjeV9pcnE7CisKIAlyZXQgPSB4aGNpX3NldHVwX21zaXgoeGhjaSk7CiAJaWYgKHJldCkKIAkJLyogZmFsbCBiYWNrIHRvIG1zaSovCiAJCXJldCA9IHhoY2lfc2V0dXBfbXNpKHhoY2kpOwogCiAJaWYgKHJldCkgeworbGVnYWN5X2lycToKIAkJLyogZmFsbCBiYWNrIHRvIGxlZ2FjeSBpbnRlcnJ1cHQqLwogCQlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsICZ1c2JfaGNkX2lycSwgSVJRRl9TSEFSRUQsCiAJCQkJCWhjZC0+aXJxX2Rlc2NyLCBoY2QpOwpAQCAtNzUyLDYgKzc1OSw4IEBACiAJCW1zbGVlcCgxMDApOwogCiAJc3Bpbl9sb2NrX2lycSgmeGhjaS0+bG9jayk7CisJaWYgKHhoY2ktPnF1aXJrcyAmIFhIQ0lfUkVTRVRfT05fUkVTVU1FKQorCQloaWJlcm5hdGVkID0gdHJ1ZTsKIAogCWlmICghaGliZXJuYXRlZCkgewogCQkvKiBzdGVwIDE6IHJlc3RvcmUgcmVnaXN0ZXIgKi8KQEAgLTEzMzMsOCArMTM0Miw4IEBACiAJLyogSWYgdGhlIEhDIGFscmVhZHkga25vd3MgdGhlIGVuZHBvaW50IGlzIGRpc2FibGVkLAogCSAqIG9yIHRoZSBIQ0QgaGFzIG5vdGVkIGl0IGlzIGRpc2FibGVkLCBpZ25vcmUgdGhpcyByZXF1ZXN0CiAJICovCi0JaWYgKChsZTMyX3RvX2NwdShlcF9jdHgtPmVwX2luZm8pICYgRVBfU1RBVEVfTUFTSykgPT0KLQkgICAgRVBfU1RBVEVfRElTQUJMRUQgfHwKKwlpZiAoKChlcF9jdHgtPmVwX2luZm8gJiBjcHVfdG9fbGUzMihFUF9TVEFURV9NQVNLKSkgPT0KKwkgICAgIGNwdV90b19sZTMyKEVQX1NUQVRFX0RJU0FCTEVEKSkgfHwKIAkgICAgbGUzMl90b19jcHUoY3RybF9jdHgtPmRyb3BfZmxhZ3MpICYKIAkgICAgeGhjaV9nZXRfZW5kcG9pbnRfZmxhZygmZXAtPmRlc2MpKSB7CiAJCXhoY2lfd2Fybih4aGNpLCAieEhDSSAlcyBjYWxsZWQgd2l0aCBkaXNhYmxlZCBlcCAlcFxuIiwKQEAgLTEzOTQsNiArMTQwMyw3IEBACiAJdTMyIGFkZGVkX2N0eHM7CiAJdW5zaWduZWQgaW50IGxhc3RfY3R4OwogCXUzMiBuZXdfYWRkX2ZsYWdzLCBuZXdfZHJvcF9mbGFncywgbmV3X3Nsb3RfaW5mbzsKKwlzdHJ1Y3QgeGhjaV92aXJ0X2RldmljZSAqdmlydF9kZXY7CiAJaW50IHJldCA9IDA7CiAKIAlyZXQgPSB4aGNpX2NoZWNrX2FyZ3MoaGNkLCB1ZGV2LCBlcCwgMSwgdHJ1ZSwgX19mdW5jX18pOwpAQCAtMTQxOCwxMSArMTQyOCwyNSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpbl9jdHggPSB4aGNpLT5kZXZzW3VkZXYtPnNsb3RfaWRdLT5pbl9jdHg7Ci0Jb3V0X2N0eCA9IHhoY2ktPmRldnNbdWRldi0+c2xvdF9pZF0tPm91dF9jdHg7CisJdmlydF9kZXYgPSB4aGNpLT5kZXZzW3VkZXYtPnNsb3RfaWRdOworCWluX2N0eCA9IHZpcnRfZGV2LT5pbl9jdHg7CisJb3V0X2N0eCA9IHZpcnRfZGV2LT5vdXRfY3R4OwogCWN0cmxfY3R4ID0geGhjaV9nZXRfaW5wdXRfY29udHJvbF9jdHgoeGhjaSwgaW5fY3R4KTsKIAllcF9pbmRleCA9IHhoY2lfZ2V0X2VuZHBvaW50X2luZGV4KCZlcC0+ZGVzYyk7CiAJZXBfY3R4ID0geGhjaV9nZXRfZXBfY3R4KHhoY2ksIG91dF9jdHgsIGVwX2luZGV4KTsKKworCS8qIElmIHRoaXMgZW5kcG9pbnQgaXMgYWxyZWFkeSBpbiB1c2UsIGFuZCB0aGUgdXBwZXIgbGF5ZXJzIGFyZSB0cnlpbmcKKwkgKiB0byBhZGQgaXQgYWdhaW4gd2l0aG91dCBkcm9wcGluZyBpdCwgcmVqZWN0IHRoZSBhZGRpdGlvbi4KKwkgKi8KKwlpZiAodmlydF9kZXYtPmVwc1tlcF9pbmRleF0ucmluZyAmJgorCQkJIShsZTMyX3RvX2NwdShjdHJsX2N0eC0+ZHJvcF9mbGFncykgJgorCQkJCXhoY2lfZ2V0X2VuZHBvaW50X2ZsYWcoJmVwLT5kZXNjKSkpIHsKKwkJeGhjaV93YXJuKHhoY2ksICJUcnlpbmcgdG8gYWRkIGVuZHBvaW50IDB4JXggIgorCQkJCSJ3aXRob3V0IGRyb3BwaW5nIGl0LlxuIiwKKwkJCQkodW5zaWduZWQgaW50KSBlcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogSWYgdGhlIEhDRCBoYXMgYWxyZWFkeSBub3RlZCB0aGUgZW5kcG9pbnQgaXMgZW5hYmxlZCwKIAkgKiBpZ25vcmUgdGhpcyByZXF1ZXN0LgogCSAqLwpAQCAtMTQzOCw4ICsxNDYyLDcgQEAKIAkgKiBwcm9jZXNzIGNvbnRleHQsIG5vdCBpbnRlcnJ1cHQgY29udGV4dCAob3Igc28gZG9jdW1lbmF0aW9uCiAJICogZm9yIHVzYl9zZXRfaW50ZXJmYWNlKCkgYW5kIHVzYl9zZXRfY29uZmlndXJhdGlvbigpIGNsYWltKS4KIAkgKi8KLQlpZiAoeGhjaV9lbmRwb2ludF9pbml0KHhoY2ksIHhoY2ktPmRldnNbdWRldi0+c2xvdF9pZF0sCi0JCQkJdWRldiwgZXAsIEdGUF9OT0lPKSA8IDApIHsKKwlpZiAoeGhjaV9lbmRwb2ludF9pbml0KHhoY2ksIHZpcnRfZGV2LCB1ZGV2LCBlcCwgR0ZQX05PSU8pIDwgMCkgewogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlcyAtIGNvdWxkIG5vdCBpbml0aWFsaXplIGVwICUjeFxuIiwKIAkJCQlfX2Z1bmNfXywgZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTUzMCw2ICsxNTUzLDExIEBACiAJCQkJImFuZCBlbmRwb2ludCBpcyBub3QgZGlzYWJsZWQuXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CisJY2FzZSBDT01QX0RFVl9FUlI6CisJCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJFUlJPUjogSW5jb21wYXRpYmxlIGRldmljZSBmb3IgZW5kcG9pbnQgIgorCQkJCSJjb25maWd1cmUgY29tbWFuZC5cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlicmVhazsKIAljYXNlIENPTVBfU1VDQ0VTUzoKIAkJZGV2X2RiZygmdWRldi0+ZGV2LCAiU3VjY2Vzc2Z1bCBFbmRwb2ludCBDb25maWd1cmUgY29tbWFuZFxuIik7CiAJCXJldCA9IDA7CkBAIC0xNTY0LDYgKzE1OTIsMTEgQEAKIAkJeGhjaV9kYmdfY3R4KHhoY2ksIHZpcnRfZGV2LT5vdXRfY3R4LCAxKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CisJY2FzZSBDT01QX0RFVl9FUlI6CisJCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJFUlJPUjogSW5jb21wYXRpYmxlIGRldmljZSBmb3IgZXZhbHVhdGUgIgorCQkJCSJjb250ZXh0IGNvbW1hbmQuXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJYnJlYWs7CiAJY2FzZSBDT01QX01FTF9FUlI6CiAJCS8qIE1heCBFeGl0IExhdGVuY3kgdG9vIGxhcmdlIGVycm9yICovCiAJCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJXQVJOOiBNYXggRXhpdCBMYXRlbmN5IHRvbyBsYXJnZVxuIik7CkBAIC0xNzI1LDggKzE3NTgsNyBAQAogCQkvKiBFbnF1ZXVlIHBvaW50ZXIgY2FuIGJlIGxlZnQgcG9pbnRpbmcgdG8gdGhlIGxpbmsgVFJCLAogCQkgKiB3ZSBtdXN0IGhhbmRsZSB0aGF0CiAJCSAqLwotCQlpZiAoKGxlMzJfdG9fY3B1KGNvbW1hbmQtPmNvbW1hbmRfdHJiLT5saW5rLmNvbnRyb2wpCi0JCSAgICAgJiBUUkJfVFlQRV9CSVRNQVNLKSA9PSBUUkJfVFlQRShUUkJfTElOSykpCisJCWlmIChUUkJfVFlQRV9MSU5LX0xFMzIoY29tbWFuZC0+Y29tbWFuZF90cmItPmxpbmsuY29udHJvbCkpCiAJCQljb21tYW5kLT5jb21tYW5kX3RyYiA9CiAJCQkJeGhjaS0+Y21kX3JpbmctPmVucV9zZWctPm5leHQtPnRyYnM7CiAKQEAgLTE4NDksOCArMTg4MSw4IEBACiAKIAkvKiBGcmVlIGFueSByaW5ncyB0aGF0IHdlcmUgZHJvcHBlZCwgYnV0IG5vdCBjaGFuZ2VkLiAqLwogCWZvciAoaSA9IDE7IGkgPCAzMTsgKytpKSB7Ci0JCWlmICgoY3RybF9jdHgtPmRyb3BfZmxhZ3MgJiAoMSA8PCAoaSArIDEpKSkgJiYKLQkJCQkhKGN0cmxfY3R4LT5hZGRfZmxhZ3MgJiAoMSA8PCAoaSArIDEpKSkpCisJCWlmICgobGUzMl90b19jcHUoY3RybF9jdHgtPmRyb3BfZmxhZ3MpICYgKDEgPDwgKGkgKyAxKSkpICYmCisJCSAgICAhKGxlMzJfdG9fY3B1KGN0cmxfY3R4LT5hZGRfZmxhZ3MpICYgKDEgPDwgKGkgKyAxKSkpKQogCQkJeGhjaV9mcmVlX29yX2NhY2hlX2VuZHBvaW50X3JpbmcoeGhjaSwgdmlydF9kZXYsIGkpOwogCX0KIAl4aGNpX3plcm9faW5fY3R4KHhoY2ksIHZpcnRfZGV2KTsKQEAgLTI0NjcsNiArMjQ5OSw3IEBACiAJc3RydWN0IHhoY2lfY29tbWFuZCAqcmVzZXRfZGV2aWNlX2NtZDsKIAlpbnQgdGltZWxlZnQ7CiAJaW50IGxhc3RfZnJlZWRfZW5kcG9pbnQ7CisJc3RydWN0IHhoY2lfc2xvdF9jdHggKnNsb3RfY3R4OwogCiAJcmV0ID0geGhjaV9jaGVja19hcmdzKGhjZCwgdWRldiwgTlVMTCwgMCwgZmFsc2UsIF9fZnVuY19fKTsKIAlpZiAocmV0IDw9IDApCkBAIC0yNDk5LDYgKzI1MzIsMTIgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIElmIGRldmljZSBpcyBub3Qgc2V0dXAsIHRoZXJlIGlzIG5vIHBvaW50IGluIHJlc2V0dGluZyBpdCAqLworCXNsb3RfY3R4ID0geGhjaV9nZXRfc2xvdF9jdHgoeGhjaSwgdmlydF9kZXYtPm91dF9jdHgpOworCWlmIChHRVRfU0xPVF9TVEFURShsZTMyX3RvX2NwdShzbG90X2N0eC0+ZGV2X3N0YXRlKSkgPT0KKwkJCQkJCVNMT1RfU1RBVEVfRElTQUJMRUQpCisJCXJldHVybiAwOworCiAJeGhjaV9kYmcoeGhjaSwgIlJlc2V0dGluZyBkZXZpY2Ugd2l0aCBzbG90IElEICV1XG4iLCBzbG90X2lkKTsKIAkvKiBBbGxvY2F0ZSB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgc3RydWN0IGNvbXBsZXRpb24uCiAJICogQXNzdW1lIHdlJ3JlIGluIHByb2Nlc3MgY29udGV4dCwgc2luY2UgdGhlIG5vcm1hbCBkZXZpY2UgcmVzZXQKQEAgLTI1MTksOCArMjU1OCw3IEBACiAJLyogRW5xdWV1ZSBwb2ludGVyIGNhbiBiZSBsZWZ0IHBvaW50aW5nIHRvIHRoZSBsaW5rIFRSQiwKIAkgKiB3ZSBtdXN0IGhhbmRsZSB0aGF0CiAJICovCi0JaWYgKChsZTMyX3RvX2NwdShyZXNldF9kZXZpY2VfY21kLT5jb21tYW5kX3RyYi0+bGluay5jb250cm9sKQotCSAgICAgJiBUUkJfVFlQRV9CSVRNQVNLKSA9PSBUUkJfVFlQRShUUkJfTElOSykpCisJaWYgKFRSQl9UWVBFX0xJTktfTEUzMihyZXNldF9kZXZpY2VfY21kLT5jb21tYW5kX3RyYi0+bGluay5jb250cm9sKSkKIAkJcmVzZXRfZGV2aWNlX2NtZC0+Y29tbWFuZF90cmIgPQogCQkJeGhjaS0+Y21kX3JpbmctPmVucV9zZWctPm5leHQtPnRyYnM7CiAKQEAgLTI4MzksNiArMjg3NywxMSBAQAogCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiRGV2aWNlIG5vdCByZXNwb25kaW5nIHRvIHNldCBhZGRyZXNzLlxuIik7CiAJCXJldCA9IC1FUFJPVE87CiAJCWJyZWFrOworCWNhc2UgQ09NUF9ERVZfRVJSOgorCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiRVJST1I6IEluY29tcGF0aWJsZSBkZXZpY2UgZm9yIGFkZHJlc3MgIgorCQkJCSJkZXZpY2UgY29tbWFuZC5cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlicmVhazsKIAljYXNlIENPTVBfU1VDQ0VTUzoKIAkJeGhjaV9kYmcoeGhjaSwgIlN1Y2Nlc3NmdWwgQWRkcmVzcyBEZXZpY2UgY29tbWFuZFxuIik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmggYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaAppbmRleCBhYzAxOTZlLi5jYWU4ZTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaApAQCAtNTYwLDYgKzU2MCwxMSBAQAogI2RlZmluZSBTTE9UX1NUQVRFCSgweDFmIDw8IDI3KQogI2RlZmluZSBHRVRfU0xPVF9TVEFURShwKQkoKChwKSAmICgweDFmIDw8IDI3KSkgPj4gMjcpCiAKKyNkZWZpbmUgU0xPVF9TVEFURV9ESVNBQkxFRAkwCisjZGVmaW5lIFNMT1RfU1RBVEVfRU5BQkxFRAlTTE9UX1NUQVRFX0RJU0FCTEVECisjZGVmaW5lIFNMT1RfU1RBVEVfREVGQVVMVAkxCisjZGVmaW5lIFNMT1RfU1RBVEVfQUREUkVTU0VECTIKKyNkZWZpbmUgU0xPVF9TVEFURV9DT05GSUdVUkVECTMKIAogLyoqCiAgKiBzdHJ1Y3QgeGhjaV9lcF9jdHgKQEAgLTg2OSw2ICs4NzQsOCBAQAogI2RlZmluZSBDT01QX1BJTkdfRVJSCTIwCiAvKiBFdmVudCBSaW5nIGlzIGZ1bGwgKi8KICNkZWZpbmUgQ09NUF9FUl9GVUxMCTIxCisvKiBJbmNvbXBhdGlibGUgRGV2aWNlIEVycm9yICovCisjZGVmaW5lIENPTVBfREVWX0VSUgkyMgogLyogTWlzc2VkIFNlcnZpY2UgRXJyb3IgLSBIQyBjb3VsZG4ndCBzZXJ2aWNlIGFuIGlzb2MgZXAgd2l0aGluIGludGVydmFsICovCiAjZGVmaW5lIENPTVBfTUlTU0VEX0lOVAkyMwogLyogU3VjY2Vzc2Z1bGx5IHN0b3BwZWQgY29tbWFuZCByaW5nICovCkBAIC0xMDY1LDYgKzEwNzIsMTMgQEAKIC8qIEdldCBORUMgZmlybXdhcmUgcmV2aXNpb24uICovCiAjZGVmaW5lCVRSQl9ORUNfR0VUX0ZXCQk0OQogCisjZGVmaW5lIFRSQl9UWVBFX0xJTksoeCkJKCgoeCkgJiBUUkJfVFlQRV9CSVRNQVNLKSA9PSBUUkJfVFlQRShUUkJfTElOSykpCisvKiBBYm92ZSwgYnV0IGZvciBfX2xlMzIgdHlwZXMgLS0gY2FuIGF2b2lkIHdvcmsgYnkgc3dhcHBpbmcgY29uc3RhbnRzOiAqLworI2RlZmluZSBUUkJfVFlQRV9MSU5LX0xFMzIoeCkJKCgoeCkgJiBjcHVfdG9fbGUzMihUUkJfVFlQRV9CSVRNQVNLKSkgPT0gXAorCQkJCSBjcHVfdG9fbGUzMihUUkJfVFlQRShUUkJfTElOSykpKQorI2RlZmluZSBUUkJfVFlQRV9OT09QX0xFMzIoeCkJKCgoeCkgJiBjcHVfdG9fbGUzMihUUkJfVFlQRV9CSVRNQVNLKSkgPT0gXAorCQkJCSBjcHVfdG9fbGUzMihUUkJfVFlQRShUUkJfVFJfTk9PUCkpKQorCiAjZGVmaW5lIE5FQ19GV19NSU5PUihwKQkJKCgocCkgPj4gMCkgJiAweGZmKQogI2RlZmluZSBORUNfRldfTUFKT1IocCkJCSgoKHApID4+IDgpICYgMHhmZikKIApAQCAtMTMwMiw2ICsxMzE2LDggQEAKICAqIGNvbW1hbmRzLgogICovCiAjZGVmaW5lIFhIQ0lfRVBfTElNSVRfUVVJUksJKDEgPDwgNSkKKyNkZWZpbmUgWEhDSV9CUk9LRU5fTVNJCQkoMSA8PCA2KQorI2RlZmluZSBYSENJX1JFU0VUX09OX1JFU1VNRQkoMSA8PCA3KQogCXVuc2lnbmVkIGludAkJbnVtX2FjdGl2ZV9lcHM7CiAJdW5zaWduZWQgaW50CQlsaW1pdF9hY3RpdmVfZXBzOwogCS8qIFRoZXJlIGFyZSB0d28gcm9vdGh1YnMgdG8ga2VlcCB0cmFjayBvZiBidXMgc3VzcGVuZCBpbmZvIGZvciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYyBiL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMKaW5kZXggYjE2YmQzYy4uMmY0MTA4OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAgICAgICAgIHUzMiBjb250cm9scmVnOwogICAgICAgICB1OCByZXNwb25zZVs0ICsgMTAyNF07CiAgICAgICAgIGludCBleHBlY3RlZDsKLSAgICAgICAgaW50IHJlY2lldmVkOworICAgICAgICBpbnQgcmVjZWl2ZWQ7CiAgICAgICAgIGludCBlZF9mb3VuZDsKIH07CiAjZGVmaW5lIGtyZWZfdG9fdXNiX2Z0ZGkoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCB1c2JfZnRkaSwga3JlZikKQEAgLTM1Myw3ICszNTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXhfbG9jaygmZnRkaS0+dTEzMl9sb2NrKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZnRkaS0+cmVjaWV2ZWQgPSAwOworICAgICAgICBmdGRpLT5yZWNlaXZlZCA9IDA7CiAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKICAgICAgICAgZnRkaS0+ZWRfZm91bmQgPSAwOwogICAgICAgICBtdXRleF91bmxvY2soJmZ0ZGktPnUxMzJfbG9jayk7CkBAIC00MTEsNyArNDExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZnRkaS0+cmVjaWV2ZWQgPSAwOworICAgICAgICBmdGRpLT5yZWNlaXZlZCA9IDA7CiAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKICAgICAgICAgZnRkaS0+ZWRfZm91bmQgPSAwOwogICAgICAgICBtdXRleF91bmxvY2soJmZ0ZGktPnUxMzJfbG9jayk7CkBAIC00NDcsNyArNDQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZnRkaS0+cmVjaWV2ZWQgPSAwOworICAgICAgICBmdGRpLT5yZWNlaXZlZCA9IDA7CiAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKICAgICAgICAgZnRkaS0+ZWRfZm91bmQgPSAwOwogICAgICAgICBtdXRleF91bmxvY2soJmZ0ZGktPnUxMzJfbG9jayk7CkBAIC04NzQsNyArODc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmZnRkaS0+dTEzMl9sb2NrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9kb19jYWxsYmFjayhmdGRpLCB0YXJnZXQsIDQgKyBmdGRpLT5yZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5yZWNpZXZlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5yZWNlaXZlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5leHBlY3RlZCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5lZF9mb3VuZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnRkaS0+cmVzcG9uc2U7CkBAIC04OTAsNyArODkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmZnRkaS0+dTEzMl9sb2NrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9kb19jYWxsYmFjayhmdGRpLCB0YXJnZXQsIDQgKyBmdGRpLT5yZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5yZWNpZXZlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5yZWNlaXZlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5leHBlY3RlZCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5lZF9mb3VuZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnRkaS0+cmVzcG9uc2U7CkBAIC05MDUsNyArOTA1LDcgQEAKICAgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJmZ0ZGktPnUxMzJfbG9jayk7CiAgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2RvX2NhbGxiYWNrKGZ0ZGksIHRhcmdldCwgNCArIGZ0ZGktPnJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgZnRkaS0+cmVjaWV2ZWQgPSAwOworICAgICAgICAgICAgICAgIGZ0ZGktPnJlY2VpdmVkID0gMDsKICAgICAgICAgICAgICAgICBmdGRpLT5leHBlY3RlZCA9IDQ7CiAgICAgICAgICAgICAgICAgZnRkaS0+ZWRfZm91bmQgPSAwOwogICAgICAgICAgICAgICAgIHJldHVybiBmdGRpLT5yZXNwb25zZTsKQEAgLTkxNCw3ICs5MTQsNyBAQAogICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmZnRkaS0+dTEzMl9sb2NrKTsKICAgICAgICAgICAgICAgICBmdGRpX2VsYW5fZG9fY2FsbGJhY2soZnRkaSwgdGFyZ2V0LCA0ICsgZnRkaS0+cmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkKTsKLSAgICAgICAgICAgICAgICBmdGRpLT5yZWNpZXZlZCA9IDA7CisgICAgICAgICAgICAgICAgZnRkaS0+cmVjZWl2ZWQgPSAwOwogICAgICAgICAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKICAgICAgICAgICAgICAgICBmdGRpLT5lZF9mb3VuZCA9IDA7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZ0ZGktPnJlc3BvbnNlOwpAQCAtOTM0LDcgKzkzNCw3IEBACiAgICAgICAgIGlmICh0YXJnZXQtPmFjdGl2ZSkKICAgICAgICAgICAgICAgICBmdGRpX2VsYW5fZG9fY2FsbGJhY2soZnRkaSwgdGFyZ2V0LCBOVUxMLCAwKTsKICAgICAgICAgdGFyZ2V0LT5hYmFuZG9uaW5nID0gMDsKLSAgICAgICAgZnRkaS0+cmVjaWV2ZWQgPSAwOworICAgICAgICBmdGRpLT5yZWNlaXZlZCA9IDA7CiAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKICAgICAgICAgZnRkaS0+ZWRfZm91bmQgPSAwOwogICAgICAgICByZXR1cm4gZnRkaS0+cmVzcG9uc2U7CkBAIC05NTEsNyArOTUxLDcgQEAKICovCiBzdGF0aWMgaW50IGZ0ZGlfZWxhbl9yZXNwb25kX2VuZ2luZShzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCiB7Ci0gICAgICAgIHU4ICpiID0gZnRkaS0+cmVzcG9uc2UgKyBmdGRpLT5yZWNpZXZlZDsKKyAgICAgICAgdTggKmIgPSBmdGRpLT5yZXNwb25zZSArIGZ0ZGktPnJlY2VpdmVkOwogICAgICAgICBpbnQgYnl0ZXNfcmVhZCA9IDA7CiAgICAgICAgIGludCByZXRyeV9vbl9lbXB0eSA9IDE7CiAgICAgICAgIGludCByZXRyeV9vbl90aW1lb3V0ID0gMzsKQEAgLTEwNDMsMTEgKzEwNDMsMTEgQEAKICAgICAgICAgICAgICAgICB1OCBjID0gZnRkaS0+YnVsa19pbl9idWZmZXJbKytmdGRpLT5idWxrX2luX2xhc3RdOwogICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQgKz0gMTsKICAgICAgICAgICAgICAgICBmdGRpLT5idWxrX2luX2xlZnQgLT0gMTsKLSAgICAgICAgICAgICAgICBpZiAoZnRkaS0+cmVjaWV2ZWQgPT0gMCAmJiBjID09IDB4RkYpIHsKKyAgICAgICAgICAgICAgICBpZiAoZnRkaS0+cmVjZWl2ZWQgPT0gMCAmJiBjID09IDB4RkYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaGF2ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICpiKysgPSBjOwotICAgICAgICAgICAgICAgIGlmICgrK2Z0ZGktPnJlY2lldmVkIDwgZnRkaS0+ZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKytmdGRpLT5yZWNlaXZlZCA8IGZ0ZGktPmV4cGVjdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGhhdmU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmdGRpLT5lZF9mb3VuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVkX251bWJlciA9IChmdGRpLT5yZXNwb25zZVswXSA+PiA1KSAmIDB4MDM7CkBAIC0xMDY5LDcgKzEwNjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2RvX2NhbGxiYWNrKGZ0ZGksIHRhcmdldCwgNCArIGZ0ZGktPnJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnJlY2lldmVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnJlY2VpdmVkID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmVkX2ZvdW5kID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBmdGRpLT5yZXNwb25zZTsKQEAgLTEwODksNyArMTA4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAqcmVzcG9uZC0+dmFsdWUgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgKnJlc3BvbmQtPnJlc3VsdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSgmcmVzcG9uZC0+d2FpdF9jb21wbGV0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnJlY2lldmVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnJlY2VpdmVkID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmVkX2ZvdW5kID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBmdGRpLT5yZXNwb25zZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9tb25fdGV4dC5jIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKaW5kZXggYzMwMmUxOS4uMWMzYWZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKQEAgLTY3MCw2ICs2NzAsOSBAQAogCWludCBidXNudW0gPSB1YnVzPyB1YnVzLT5idXNudW06IDA7CiAJaW50IHJjOwogCisJaWYgKG1vbl9kaXIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKIAlpZiAodWJ1cyAhPSBOVUxMKSB7CiAJCXJjID0gc25wcmludGYobmFtZSwgTkFNRVNaLCAiJWR0IiwgYnVzbnVtKTsKIAkJaWYgKHJjIDw9IDAgfHwgcmMgPj0gTkFNRVNaKQpAQCAtNzQwLDEyICs3NDMsMTIgQEAKIAogCW1vbmRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigidXNibW9uIiwgdXNiX2RlYnVnX3Jvb3QpOwogCWlmIChJU19FUlIobW9uZGlyKSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgVEFHICI6IGRlYnVnZnMgaXMgbm90IGF2YWlsYWJsZVxuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQkvKiBkZWJ1Z2ZzIG5vdCBhdmFpbGFibGUsIGJ1dCB3ZSBjYW4gdXNlIHVzYm1vbiB3aXRob3V0IGl0ICovCisJCXJldHVybiAwOwogCX0KIAlpZiAobW9uZGlyID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFIFRBRyAiOiB1bmFibGUgdG8gY3JlYXRlIHVzYm1vbiBkaXJlY3RvcnlcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW1vbl9kaXIgPSBtb25kaXI7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKaW5kZXggMTMwOTM0OC4uNjE5MmI0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwpAQCAtOCw3ICs4LDcgQEAKIAogIyAoTSlIRFJDID0gKE11bHRpcG9pbnQpIEhpZ2hzcGVlZCBEdWFsLVJvbGUgQ29udHJvbGxlcgogY29uZmlnIFVTQl9NVVNCX0hEUkMKLQlkZXBlbmRzIG9uIChVU0IgfHwgVVNCX0dBREdFVCkKKwlkZXBlbmRzIG9uIFVTQiAmJiBVU0JfR0FER0VUCiAJZGVwZW5kcyBvbiAoQVJNIHx8IChCRjU0eCAmJiAhQkY1NDQpIHx8IChCRjUyeCAmJiAhQkY1MjIgJiYgIUJGNTIzKSkKIAlzZWxlY3QgTk9QX1VTQl9YQ0VJViBpZiAoQVJDSF9EQVZJTkNJIHx8IE1BQ0hfT01BUDNFVk0gfHwgQkxBQ0tGSU4pCiAJc2VsZWN0IFRXTDQwMzBfVVNCIGlmIE1BQ0hfT01BUF8zNDMwU0RQCkBAIC02Nyw3OSArNjcsNiBAQAogCiBlbmRjaG9pY2UKIAotY2hvaWNlCi0JcHJvbXB0ICJEcml2ZXIgTW9kZSIKLQlkZXBlbmRzIG9uIFVTQl9NVVNCX0hEUkMKLQloZWxwCi0JICBEdWFsLVJvbGUgZGV2aWNlcyBjYW4gc3VwcG9ydCBib3RoIGhvc3QgYW5kIHBlcmlwaGVyYWwgcm9sZXMsCi0JICBhcyB3ZWxsIGFzIGEgdGhlIHNwZWNpYWwgIk9URyBEZXZpY2UiIHJvbGUgd2hpY2ggY2FuIHN3aXRjaAotCSAgYmV0d2VlbiBib3RoIHJvbGVzIGFzIG5lZWRlZC4KLQotIyB1c2UgVVNCX01VU0JfSERSQ19IQ0Qgbm90IFVTQl9NVVNCX0hPU1QgdG8gI2lmZGVmIGhvc3Qgc2lkZSBzdXBwb3J0OwotIyBPVEcgbmVlZHMgYm90aCByb2xlcywgbm90IGp1c3QgVVNCX01VU0JfSE9TVC4KLWNvbmZpZyBVU0JfTVVTQl9IT1NUCi0JZGVwZW5kcyBvbiBVU0IKLQlib29sICJVU0IgSG9zdCIKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIHRoZSBVU0IgaG9zdCByb2xlLgotCSAgSWYgaXQgaGFzIGEgVVNCICJBIiAocmVjdGFuZ3VsYXIpLCAiTWluaS1BIiAodW5jb21tb24pLAotCSAgb3IgIk1pbmktQUIiIGNvbm5lY3RvciwgaXQgc3VwcG9ydHMgdGhlIGhvc3Qgcm9sZS4KLQkgIChXaXRoIGEgIk1pbmktQUIiIGNvbm5lY3RvciwgeW91IHNob3VsZCBlbmFibGUgVVNCIE9URy4pCi0KLSMgdXNlIFVTQl9HQURHRVRfTVVTQl9IRFJDIG5vdCBVU0JfTVVTQl9QRVJJUEhFUkFMIHRvICNpZmRlZiBwZXJpcGhlcmFsCi0jIHNpZGUgc3VwcG9ydCAuLi4gT1RHIG5lZWRzIGJvdGggcm9sZXMKLWNvbmZpZyBVU0JfTVVTQl9QRVJJUEhFUkFMCi0JZGVwZW5kcyBvbiBVU0JfR0FER0VUCi0JYm9vbCAiVVNCIFBlcmlwaGVyYWwgKGdhZGdldCBzdGFjaykiCi0Jc2VsZWN0IFVTQl9HQURHRVRfTVVTQl9IRFJDCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyB0aGUgVVNCIHBlcmlwaGVyYWwgcm9sZS4KLQkgIElmIGl0IGhhcyBhIFVTQiAiQiIgKHNxdWFyaXNoKSwgIk1pbmktQiIsIG9yICJNaW5pLUFCIgotCSAgY29ubmVjdG9yLCBpdCBzdXBwb3J0cyB0aGUgcGVyaXBoZXJhbCByb2xlLgotCSAgKFdpdGggYSAiTWluaS1BQiIgY29ubmVjdG9yLCB5b3Ugc2hvdWxkIGVuYWJsZSBVU0IgT1RHLikKLQotY29uZmlnIFVTQl9NVVNCX09URwotCWRlcGVuZHMgb24gVVNCICYmIFVTQl9HQURHRVQgJiYgUE0gJiYgRVhQRVJJTUVOVEFMCi0JYm9vbCAiQm90aCBob3N0IGFuZCBwZXJpcGhlcmFsOiAgVVNCIE9URyAoT24gVGhlIEdvKSBEZXZpY2UiCi0Jc2VsZWN0IFVTQl9HQURHRVRfTVVTQl9IRFJDCi0Jc2VsZWN0IFVTQl9PVEcKLQloZWxwCi0JICAgVGhlIG1vc3Qgbm90YWJsZSBmZWF0dXJlIG9mIFVTQiBPVEcgaXMgc3VwcG9ydCBmb3IgYQotCSAgICJEdWFsLVJvbGUiIGRldmljZSwgd2hpY2ggY2FuIGFjdCBhcyBlaXRoZXIgYSBkZXZpY2UKLQkgICBvciBhIGhvc3QuICBUaGUgaW5pdGlhbCByb2xlIGNob2ljZSBjYW4gYmUgY2hhbmdlZAotCSAgIGxhdGVyLCB3aGVuIHR3byBkdWFsLXJvbGUgZGV2aWNlcyB0YWxrIHRvIGVhY2ggb3RoZXIuCi0KLQkgICBBdCB0aGlzIHdyaXRpbmcsIHRoZSBPVEcgc3VwcG9ydCBpbiB0aGlzIGRyaXZlciBpcyBpbmNvbXBsZXRlLAotCSAgIG9taXR0aW5nIHRoZSBtYW5kYXRvcnkgSE5QIG9yIFNSUCBwcm90b2NvbHMuICBIb3dldmVyLCBzb21lCi0JICAgb2YgdGhlIGNhYmxlIGJhc2VkIHJvbGUgc3dpdGNoaW5nIHdvcmtzLiAgKFRoYXQgaXMsIGdyb3VuZGluZwotCSAgIHRoZSBJRCBwaW4gc3dpdGNoZXMgdGhlIGNvbnRyb2xsZXIgdG8gaG9zdCBtb2RlLCB3aGlsZSBsZWF2aW5nCi0JICAgaXQgZmxvYXRpbmcgbGVhdmVzIGl0IGluIHBlcmlwaGVyYWwgbW9kZS4pCi0KLQkgICBTZWxlY3QgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgYSBNaW5pLUFCIGNvbm5lY3Rvciwgb3IKLQkgICB0byBzaW1wbGlmeSBjZXJ0YWluIGtpbmRzIG9mIGNvbmZpZ3VyYXRpb24uCi0KLQkgICBUbyBpbXBsZW1lbnQgeW91ciBPVEcgVGFyZ2V0ZWQgUGVyaXBoZXJhbHMgTGlzdCAoVFBMKSwgZW5hYmxlCi0JICAgVVNCX09UR19XSElURUxJU1QgYW5kIHVwZGF0ZSAiZHJpdmVycy91c2IvY29yZS9vdGdfd2hpdGVsaXN0LmgiCi0JICAgdG8gbWF0Y2ggeW91ciByZXF1aXJlbWVudHMuCi0KLWVuZGNob2ljZQotCi0jIGVuYWJsZSBwZXJpcGhlcmFsIHN1cHBvcnQgKGluY2x1ZGluZyB3aXRoIE9URykKLWNvbmZpZyBVU0JfR0FER0VUX01VU0JfSERSQwotCWJvb2wKLQlkZXBlbmRzIG9uIFVTQl9NVVNCX0hEUkMgJiYgKFVTQl9NVVNCX1BFUklQSEVSQUwgfHwgVVNCX01VU0JfT1RHKQotIwlkZWZhdWx0IHkKLSMJc2VsZWN0IFVTQl9HQURHRVRfRFVBTFNQRUVECi0jCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECi0KLSMgZW5hYmxlcyBob3N0IHN1cHBvcnQgKGluY2x1ZGluZyB3aXRoIE9URykKLWNvbmZpZyBVU0JfTVVTQl9IRFJDX0hDRAotCWJvb2wKLQlkZXBlbmRzIG9uIFVTQl9NVVNCX0hEUkMgJiYgKFVTQl9NVVNCX0hPU1QgfHwgVVNCX01VU0JfT1RHKQotCXNlbGVjdCBVU0JfT1RHIGlmIFVTQl9HQURHRVRfTVVTQl9IRFJDCi0JZGVmYXVsdCB5Ci0KLQogY29uZmlnIE1VU0JfUElPX09OTFkKIAlib29sICdEaXNhYmxlIERNQSAoYWx3YXlzIHVzZSBQSU8pJwogCWRlcGVuZHMgb24gVVNCX01VU0JfSERSQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL211c2IvTWFrZWZpbGUKaW5kZXggYzRkMjI4Yi4uZDhmZDlkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9tdXNiL01ha2VmaWxlCkBAIC02LDggKzYsOCBAQAogCiBtdXNiX2hkcmMteSA6PSBtdXNiX2NvcmUubwogCi1tdXNiX2hkcmMtJChDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMpCSs9IG11c2JfZ2FkZ2V0X2VwMC5vIG11c2JfZ2FkZ2V0Lm8KLW11c2JfaGRyYy0kKENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRCkJCSs9IG11c2JfdmlydGh1Yi5vIG11c2JfaG9zdC5vCittdXNiX2hkcmMteQkJCQkJKz0gbXVzYl9nYWRnZXRfZXAwLm8gbXVzYl9nYWRnZXQubworbXVzYl9oZHJjLXkJCQkJCSs9IG11c2JfdmlydGh1Yi5vIG11c2JfaG9zdC5vCiBtdXNiX2hkcmMtJChDT05GSUdfREVCVUdfRlMpCQkJKz0gbXVzYl9kZWJ1Z2ZzLm8KIAogIyBIYXJkd2FyZSBHbHVlIExheWVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL2FtMzV4LmMgYi9kcml2ZXJzL3VzYi9tdXNiL2FtMzV4LmMKaW5kZXggMjNhYzI4Zi4uMDhmMWQwYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvYW0zNXguYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL2FtMzV4LmMKQEAgLTEyNCwxMSArMTI0LDcgQEAKIAltdXNiX3dyaXRlbChyZWdfYmFzZSwgVVNCX0VORF9PRl9JTlRSX1JFRywgMCk7CiB9CiAKLSNpZmRlZiBDT05GSUdfVVNCX01VU0JfSERSQ19IQ0QKICNkZWZpbmUgcG9ydHN0YXRlKHN0bXQpCQlzdG10Ci0jZWxzZQotI2RlZmluZSBwb3J0c3RhdGUoc3RtdCkKLSNlbmRpZgogCiBzdGF0aWMgdm9pZCBhbTM1eF9tdXNiX3NldF92YnVzKHN0cnVjdCBtdXNiICptdXNiLCBpbnQgaXNfb24pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmggYi9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmgKaW5kZXggYmQ5MzUyYS4uYzg0ZGFlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5oCisrKyBiL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uaApAQCAtNDcsNyArNDcsNyBAQAogICogU28sIG5lZWQgdG8gZWl0aGVyIHVzZSBzaWxpY29uIHYwLjIrIG9yIGRpc2FibGUgRE1BIG1vZGUgaW4gTVVTQi4KICAqLwogI2lmIEFOT01BTFlfMDUwMDAzODAgJiYgZGVmaW5lZChDT05GSUdfQkY1MngpICYmIFwKLSAgICBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSAmJiAhZGVmaW5lZChDT05GSUdfTVVTQl9QSU9fT05MWSkKKwkhZGVmaW5lZChDT05GSUdfTVVTQl9QSU9fT05MWSkKICMgZXJyb3IgIlBsZWFzZSB1c2UgUElPIG1vZGUgaW4gTVVTQiBkcml2ZXIgb24gYmY1MnggY2hpcCB2MC4wIGFuZCB2MC4xIgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvZGE4eHguYyBiL2RyaXZlcnMvdXNiL211c2IvZGE4eHguYwppbmRleCA2NjJlZDM0Li40ZGE3NDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL2RhOHh4LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9kYTh4eC5jCkBAIC0xNzIsMTEgKzE3Miw3IEBACiAJbXVzYl93cml0ZWwocmVnX2Jhc2UsIERBOFhYX1VTQl9FTkRfT0ZfSU5UUl9SRUcsIDApOwogfQogCi0jaWZkZWYgQ09ORklHX1VTQl9NVVNCX0hEUkNfSENECi0jZGVmaW5lIHBvcnRzdGF0ZShzdG10KSAJc3RtdAotI2Vsc2UKLSNkZWZpbmUgcG9ydHN0YXRlKHN0bXQpCi0jZW5kaWYKKyNkZWZpbmUgcG9ydHN0YXRlKHN0bXQpCQlzdG10CiAKIHN0YXRpYyB2b2lkIGRhOHh4X211c2Jfc2V0X3ZidXMoc3RydWN0IG11c2IgKm11c2IsIGludCBpc19vbikKIHsKQEAgLTM5NywyMSArMzkzLDE1IEBACiAKIAljZmdjaGlwMiAmPSB+Q0ZHQ0hJUDJfT1RHTU9ERTsKIAlzd2l0Y2ggKG11c2JfbW9kZSkgewotI2lmZGVmCUNPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCWNhc2UgTVVTQl9IT1NUOgkJLyogRm9yY2UgVkJVUyB2YWxpZCwgSUQgPSAwICovCiAJCWNmZ2NoaXAyIHw9IENGR0NISVAyX0ZPUkNFX0hPU1Q7CiAJCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYJQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDCiAJY2FzZSBNVVNCX1BFUklQSEVSQUw6CS8qIEZvcmNlIFZCVVMgdmFsaWQsIElEID0gMSAqLwogCQljZmdjaGlwMiB8PSBDRkdDSElQMl9GT1JDRV9ERVZJQ0U7CiAJCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYJQ09ORklHX1VTQl9NVVNCX09URwogCWNhc2UgTVVTQl9PVEc6CQkvKiBEb24ndCBvdmVycmlkZSB0aGUgVkJVUy9JRCBjb21wYXJhdG9ycyAqLwogCQljZmdjaGlwMiB8PSBDRkdDSElQMl9OT19PVkVSUklERTsKIAkJYnJlYWs7Ci0jZW5kaWYKIAlkZWZhdWx0OgogCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJUcnlpbmcgdG8gc2V0IHVuc3VwcG9ydGVkIG1vZGUgJXVcbiIsIG11c2JfbW9kZSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9kYXZpbmNpLmMgYi9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYwppbmRleCAyYTJhZGY2Li44YmRmMjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYwpAQCAtMTQzLDEyICsxNDMsNyBAQAogfQogCiAKLSNpZmRlZiBDT05GSUdfVVNCX01VU0JfSERSQ19IQ0QKICNkZWZpbmUJcG9ydHN0YXRlKHN0bXQpCQlzdG10Ci0jZWxzZQotI2RlZmluZQlwb3J0c3RhdGUoc3RtdCkKLSNlbmRpZgotCiAKIC8qCiAgKiBWQlVTIFNXSVRDSElORyBJUyBCT0FSRC1TUEVDSUZJQyAuLi4gYXQgbGVhc3QgZm9yIHRoZSBETTY0NDYgRVZNLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKaW5kZXggYWI4ZTEwMC4uMjBhMjg3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCkBAIC05Niw2ICs5Niw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCkBAIC0zMjcsOCArMzI4LDYgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmZGVmCUNPTkZJR19VU0JfTVVTQl9PVEcKLQogLyoKICAqIEhhbmRsZXMgT1RHIGhucCB0aW1lb3V0cywgc3VjaCBhcyBiX2FzZTBfYnJzdAogICovCkBAIC00MDAsOCArMzk5LDYgQEAKIAltdXNiLT5wb3J0MV9zdGF0dXMgJj0gfihVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElPTiA8PCAxNik7CiB9CiAKLSNlbmRpZgotCiAvKgogICogSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSB0byByZWNvcmQgVVNCICJnbG9iYWwiIGludGVycnVwdHMuCiAgKiBTaW5jZSB0aGVzZSBkbyBub3QgaGFwcGVuIG9mdGVuIGFuZCBzaWduaWZ5IHRoaW5ncyBvZgpAQCAtNDMxLDcgKzQyOCw2IEBACiAJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIlJFU1VNRSAoJXMpXG4iLCBvdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2LT5zdGF0ZSkpOwogCiAJCWlmIChkZXZjdGwgJiBNVVNCX0RFVkNUTF9ITSkgewotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCQkJdm9pZCBfX2lvbWVtICptYmFzZSA9IG11c2ItPm1yZWdzOwogCiAJCQlzd2l0Y2ggKG11c2ItPnhjZWl2LT5zdGF0ZSkgewpAQCAtNDcxLDE3ICs0NjcsMTMgQEAKIAkJCQkJImhvc3QiLAogCQkJCQlvdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2LT5zdGF0ZSkpOwogCQkJfQotI2VuZGlmCiAJCX0gZWxzZSB7CiAJCQlzd2l0Y2ggKG11c2ItPnhjZWl2LT5zdGF0ZSkgewotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCQkJY2FzZSBPVEdfU1RBVEVfQV9TVVNQRU5EOgogCQkJCS8qIHBvc3NpYmx5IERJU0NPTk5FQ1QgaXMgdXBjb21pbmcgKi8KIAkJCQltdXNiLT54Y2Vpdi0+c3RhdGUgPSBPVEdfU1RBVEVfQV9IT1NUOwogCQkJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKG11c2JfdG9faGNkKG11c2IpKTsKIAkJCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQwogCQkJY2FzZSBPVEdfU1RBVEVfQl9XQUlUX0FDT046CiAJCQljYXNlIE9UR19TVEFURV9CX1BFUklQSEVSQUw6CiAJCQkJLyogZGlzY29ubmVjdCB3aGlsZSBzdXNwZW5kZWQ/ICB3ZSBtYXkKQEAgLTQ5OSw3ICs0OTEsNiBAQAogCQkJY2FzZSBPVEdfU1RBVEVfQl9JRExFOgogCQkJCW11c2ItPmludF91c2IgJj0gfk1VU0JfSU5UUl9TVVNQRU5EOwogCQkJCWJyZWFrOwotI2VuZGlmCiAJCQlkZWZhdWx0OgogCQkJCVdBUk5JTkcoImJvZ3VzICVzIFJFU1VNRSAoJXMpXG4iLAogCQkJCQkicGVyaXBoZXJhbCIsCkBAIC01MDgsNyArNDk5LDYgQEAKIAkJfQogCX0KIAotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCS8qIHNlZSBtYW51YWwgZm9yIHRoZSBvcmRlciBvZiB0aGUgdGVzdHMgKi8KIAlpZiAoaW50X3VzYiAmIE1VU0JfSU5UUl9TRVNTUkVRKSB7CiAJCXZvaWQgX19pb21lbSAqbWJhc2UgPSBtdXNiLT5tcmVnczsKQEAgLTYwOCwxNCArNTk4LDEyIEBACiAJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKIAl9CiAKLSNlbmRpZgogCWlmIChpbnRfdXNiICYgTVVTQl9JTlRSX1NVU1BFTkQpIHsKIAkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiU1VTUEVORCAoJXMpIGRldmN0bCAlMDJ4IHBvd2VyICUwMnhcbiIsCiAJCQlvdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2LT5zdGF0ZSksIGRldmN0bCwgcG93ZXIpOwogCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7CiAKIAkJc3dpdGNoIChtdXNiLT54Y2Vpdi0+c3RhdGUpIHsKLSNpZmRlZglDT05GSUdfVVNCX01VU0JfT1RHCiAJCWNhc2UgT1RHX1NUQVRFX0FfUEVSSVBIRVJBTDoKIAkJCS8qIFdlIGFsc28gY29tZSBoZXJlIGlmIHRoZSBjYWJsZSBpcyByZW1vdmVkLCBzaW5jZQogCQkJICogdGhpcyBzaWxpY29uIGRvZXNuJ3QgcmVwb3J0IElELW5vLWxvbmdlci1ncm91bmRlZC4KQEAgLTYzMiw3ICs2MjAsNiBAQAogCQkJCQkJPyA6IE9UR19USU1FX0FfV0FJVF9CQ09OKSk7CiAKIAkJCWJyZWFrOwotI2VuZGlmCiAJCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKIAkJCWlmICghbXVzYi0+aXNfYWN0aXZlKQogCQkJCWJyZWFrOwpAQCAtNjQxLDEzICs2MjgsMTEgQEAKIAkJCW11c2ItPmlzX2FjdGl2ZSA9IGlzX290Z19lbmFibGVkKG11c2IpCiAJCQkJCSYmIG11c2ItPnhjZWl2LT5nYWRnZXQtPmJfaG5wX2VuYWJsZTsKIAkJCWlmIChtdXNiLT5pc19hY3RpdmUpIHsKLSNpZmRlZglDT05GSUdfVVNCX01VU0JfT1RHCiAJCQkJbXVzYi0+eGNlaXYtPnN0YXRlID0gT1RHX1NUQVRFX0JfV0FJVF9BQ09OOwogCQkJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIkhOUDogU2V0dGluZyB0aW1lciBmb3IgYl9hc2UwX2Jyc3RcbiIpOwogCQkJCW1vZF90aW1lcigmbXVzYi0+b3RnX3RpbWVyLCBqaWZmaWVzCiAJCQkJCSsgbXNlY3NfdG9famlmZmllcygKIAkJCQkJCQlPVEdfVElNRV9CX0FTRTBfQlJTVCkpOwotI2VuZGlmCiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX0JDT046CkBAIC02NzEsNyArNjU2LDYgQEAKIAkJfQogCX0KIAotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCWlmIChpbnRfdXNiICYgTVVTQl9JTlRSX0NPTk5FQ1QpIHsKIAkJc3RydWN0IHVzYl9oY2QgKmhjZCA9IG11c2JfdG9faGNkKG11c2IpOwogCkBAIC02ODEsNyArNjY1LDYgQEAKIAogCQltdXNiLT5lcDBfc3RhZ2UgPSBNVVNCX0VQMF9TVEFSVDsKIAotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9PVEcKIAkJLyogZmx1c2ggZW5kcG9pbnRzIHdoZW4gdHJhbnNpdGlvbmluZyBmcm9tIERldmljZSBNb2RlICovCiAJCWlmIChpc19wZXJpcGhlcmFsX2FjdGl2ZShtdXNiKSkgewogCQkJLyogUkVWSVNJVCBITlA7IGp1c3QgZm9yY2UgZGlzY29ubmVjdCAqLwpAQCAtNjg5LDcgKzY3Miw2IEBACiAJCW11c2Jfd3JpdGV3KG11c2ItPm1yZWdzLCBNVVNCX0lOVFJUWEUsIG11c2ItPmVwbWFzayk7CiAJCW11c2Jfd3JpdGV3KG11c2ItPm1yZWdzLCBNVVNCX0lOVFJSWEUsIG11c2ItPmVwbWFzayAmIDB4ZmZmZSk7CiAJCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0lOVFJVU0JFLCAweGY3KTsKLSNlbmRpZgogCQltdXNiLT5wb3J0MV9zdGF0dXMgJj0gfihVU0JfUE9SVF9TVEFUX0xPV19TUEVFRAogCQkJCQl8VVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVECiAJCQkJCXxVU0JfUE9SVF9TVEFUX0VOQUJMRQpAQCAtNzM4LDcgKzcyMCw2IEBACiAJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIkNPTk5FQ1QgKCVzKSBkZXZjdGwgJTAyeFxuIiwKIAkJCQlvdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2LT5zdGF0ZSksIGRldmN0bCk7CiAJfQotI2VuZGlmCS8qIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRCAqLwogCiAJaWYgKChpbnRfdXNiICYgTVVTQl9JTlRSX0RJU0NPTk5FQ1QpICYmICFtdXNiLT5pZ25vcmVfZGlzY29ubmVjdCkgewogCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJESVNDT05ORUNUICglcykgYXMgJXMsIGRldmN0bCAlMDJ4XG4iLApAQCAtNzQ3LDcgKzcyOCw2IEBACiAJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKIAogCQlzd2l0Y2ggKG11c2ItPnhjZWl2LT5zdGF0ZSkgewotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCQljYXNlIE9UR19TVEFURV9BX0hPU1Q6CiAJCWNhc2UgT1RHX1NUQVRFX0FfU1VTUEVORDoKIAkJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKG11c2JfdG9faGNkKG11c2IpKTsKQEAgLTc1Niw4ICs3MzYsNiBAQAogCQkJCW11c2JfcGxhdGZvcm1fdHJ5X2lkbGUobXVzYiwgamlmZmllcwogCQkJCQkrIG1zZWNzX3RvX2ppZmZpZXMobXVzYi0+YV93YWl0X2Jjb24pKTsKIAkJCWJyZWFrOwotI2VuZGlmCS8qIEhPU1QgKi8KLSNpZmRlZiBDT05GSUdfVVNCX01VU0JfT1RHCiAJCWNhc2UgT1RHX1NUQVRFX0JfSE9TVDoKIAkJCS8qIFJFVklTSVQgdGhpcyBiZWhhdmVzIGZvciAicmVhbCBkaXNjb25uZWN0IgogCQkJICogY2FzZXM7IG1ha2Ugc3VyZSB0aGUgb3RoZXIgdHJhbnNpdGlvbnMgZnJvbQpAQCAtNzc2LDEzICs3NTQsMTAgQEAKIAkJCS8qIEZBTExUSFJPVUdIICovCiAJCWNhc2UgT1RHX1NUQVRFX0JfV0FJVF9BQ09OOgogCQkJLyogRkFMTFRIUk9VR0ggKi8KLSNlbmRpZgkvKiBPVEcgKi8KLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMKIAkJY2FzZSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOgogCQljYXNlIE9UR19TVEFURV9CX0lETEU6CiAJCQltdXNiX2dfZGlzY29ubmVjdChtdXNiKTsKIAkJCWJyZWFrOwotI2VuZGlmCS8qIEdBREdFVCAqLwogCQlkZWZhdWx0OgogCQkJV0FSTklORygidW5oYW5kbGVkIERJU0NPTk5FQ1QgdHJhbnNpdGlvbiAoJXMpXG4iLAogCQkJCW90Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPnN0YXRlKSk7CkBAIC04MTMsNyArNzg4LDYgQEAKIAkJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIkJVUyBSRVNFVCBhcyAlc1xuIiwKIAkJCQlvdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2LT5zdGF0ZSkpOwogCQkJc3dpdGNoIChtdXNiLT54Y2Vpdi0+c3RhdGUpIHsKLSNpZmRlZiBDT05GSUdfVVNCX09URwogCQkJY2FzZSBPVEdfU1RBVEVfQV9TVVNQRU5EOgogCQkJCS8qIFdlIG5lZWQgdG8gaWdub3JlIGRpc2Nvbm5lY3Qgb24gc3VzcGVuZAogCQkJCSAqIG90aGVyd2lzZSB0dXNiIDIuMCB3b24ndCByZWNvbm5lY3QgYWZ0ZXIgYQpAQCAtODQxLDcgKzgxNSw2IEBACiAJCQkJbXVzYi0+eGNlaXYtPnN0YXRlID0gT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDsKIAkJCQltdXNiX2dfcmVzZXQobXVzYik7CiAJCQkJYnJlYWs7Ci0jZW5kaWYKIAkJCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKIAkJCQltdXNiLT54Y2Vpdi0+c3RhdGUgPSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOwogCQkJCS8qIEZBTExUSFJPVUdIICovCkBAIC05MjYsNyArODk5LDYgQEAKIAogCS8qIHB1dCBpbnRvIGJhc2ljIGhpZ2hzcGVlZCBtb2RlIGFuZCBzdGFydCBzZXNzaW9uICovCiAJbXVzYl93cml0ZWIocmVncywgTVVTQl9QT1dFUiwgTVVTQl9QT1dFUl9JU09VUERBVEUKLQkJCQkJCXwgTVVTQl9QT1dFUl9TT0ZUQ09OTgogCQkJCQkJfCBNVVNCX1BPV0VSX0hTRU5BQgogCQkJCQkJLyogRU5TVVNQRU5EIHdlZGdlcyB0dXNiICovCiAJCQkJCQkvKiB8IE1VU0JfUE9XRVJfRU5TVVNQRU5EICovCkBAIC0xMDM3LDEwICsxMDA5LDE1IEBACiAgKiBXZSBkb24ndCBjdXJyZW50bHkgdXNlIGR5bmFtaWMgZmlmbyBzZXR1cCBjYXBhYmlsaXR5IHRvIGRvIGFueXRoaW5nCiAgKiBtb3JlIHRoYW4gc2VsZWN0aW5nIG9uZSBvZiBhIGJ1bmNoIG9mIHByZWRlZmluZWQgY29uZmlndXJhdGlvbnMuCiAgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9UVVNCNjAxMCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfT01BUDJQTFVTKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfQU0zNVgpCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfVFVTQjYwMTApCQkJXAorCXx8IGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX1RVU0I2MDEwX01PRFVMRSkJXAorCXx8IGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX09NQVAyUExVUykJCVwKKwl8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9PTUFQMlBMVVNfTU9EVUxFKQlcCisJfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfQU0zNVgpCQlcCisJfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfQU0zNVhfTU9EVUxFKQogc3RhdGljIHVzaG9ydCBfX2luaXRkYXRhIGZpZm9fbW9kZSA9IDQ7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9VWDUwMCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX1VYNTAwKQkJCVwKKwl8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9VWDUwMF9NT0RVTEUpCiBzdGF0aWMgdXNob3J0IF9faW5pdGRhdGEgZmlmb19tb2RlID0gNTsKICNlbHNlCiBzdGF0aWMgdXNob3J0IF9faW5pdGRhdGEgZmlmb19tb2RlID0gMjsKQEAgLTExOTAsMTQgKzExNjcsMTIgQEAKIAkvKiBjb25maWd1cmUgdGhlIEZJRk8gKi8KIAltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9JTkRFWCwgaHdfZXAtPmVwbnVtKTsKIAotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCS8qIEVQMCByZXNlcnZlZCBlbmRwb2ludCBmb3IgY29udHJvbCwgYmlkaXJlY3Rpb25hbDsKIAkgKiBFUDEgcmVzZXJ2ZWQgZm9yIGJ1bGssIHR3byB1bmlkaXJlY3Rpb24gaGFsdmVzLgogCSAqLwogCWlmIChod19lcC0+ZXBudW0gPT0gMSkKIAkJbXVzYi0+YnVsa19lcCA9IGh3X2VwOwogCS8qIFJFVklTSVQgZXJyb3IgY2hlY2s6ICBiZSBzdXJlIGVwMCBjYW4gYm90aCByeCBhbmQgdHggLi4uICovCi0jZW5kaWYKIAlzd2l0Y2ggKGNmZy0+c3R5bGUpIHsKIAljYXNlIEZJRk9fVFg6CiAJCW11c2Jfd3JpdGVfdHhmaWZvc3oobWJhc2UsIGNfc2l6ZSk7CkBAIC0xMzE2LDEyICsxMjkxLDEwIEBACiAJCQluICsgMSwgbXVzYi0+Y29uZmlnLT5udW1fZXBzICogMiAtIDEsCiAJCQlvZmZzZXQsICgxIDw8IChtdXNiLT5jb25maWctPnJhbV9iaXRzICsgMikpKTsKIAotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCWlmICghbXVzYi0+YnVsa19lcCkgewogCQlwcl9kZWJ1ZygiJXM6IG1pc3NpbmcgYnVsa1xuIiwgbXVzYl9kcml2ZXJfbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLSNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzUyLDcgKzEzMjUsNiBAQAogCiAJCS8qIEZJWE1FIHNldCB1cCBod19lcC0+e3J4LHR4fV9kb3VibGVfYnVmZmVyZWQgKi8KIAotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCQkvKiBwaWNrIGFuIFJYL1RYIGVuZHBvaW50IGZvciBidWxrICovCiAJCWlmIChod19lcC0+bWF4X3BhY2tldF9zel90eCA8IDUxMgogCQkJCXx8IGh3X2VwLT5tYXhfcGFja2V0X3N6X3J4IDwgNTEyKQpAQCAtMTM2NCwxNSArMTMzNiwxMiBAQAogCQlpZiAobXVzYi0+YnVsa19lcCkKIAkJCWNvbnRpbnVlOwogCQltdXNiLT5idWxrX2VwID0gaHdfZXA7Ci0jZW5kaWYKIAl9CiAKLSNpZmRlZiBDT05GSUdfVVNCX01VU0JfSERSQ19IQ0QKIAlpZiAoIW11c2ItPmJ1bGtfZXApIHsKIAkJcHJfZGVidWcoIiVzOiBtaXNzaW5nIGJ1bGtcbiIsIG11c2JfZHJpdmVyX25hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0jZW5kaWYKIAogCXJldHVybiAwOwogfQpAQCAtMTQyOCwxMyArMTM5NywxMSBAQAogCX0gZWxzZSB7CiAJCW11c2ItPmlzX211bHRpcG9pbnQgPSAwOwogCQl0eXBlID0gIiI7Ci0jaWZkZWYgQ09ORklHX1VTQl9NVVNCX0hEUkNfSENECiAjaWZuZGVmCUNPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCQkiJXM6IGtlcm5lbCBtdXN0IGJsYWNrbGlzdCBleHRlcm5hbCBodWJzXG4iLAogCQkJbXVzYl9kcml2ZXJfbmFtZSk7CiAjZW5kaWYKLSNlbmRpZgogCX0KIAogCS8qIGxvZyByZWxlYXNlIGluZm8gKi8KQEAgLTE0NzgsMTEgKzE0NDUsOSBAQAogI2VuZGlmCiAKIAkJaHdfZXAtPnJlZ3MgPSBNVVNCX0VQX09GRlNFVChpLCAwKSArIG1iYXNlOwotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCQlod19lcC0+dGFyZ2V0X3JlZ3MgPSBtdXNiX3JlYWRfdGFyZ2V0X3JlZ19iYXNlKGksIG1iYXNlKTsKIAkJaHdfZXAtPnJ4X3JlaW5pdCA9IDE7CiAJCWh3X2VwLT50eF9yZWluaXQgPSAxOwotI2VuZGlmCiAKIAkJaWYgKGh3X2VwLT5tYXhfcGFja2V0X3N6X3R4KSB7CiAJCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsCkBAIC0xNTYwLDE0ICsxNTI1LDYgQEAKIAkJKGRldmN0bCAmIE1VU0JfREVWQ1RMX0hNKSA/ICJob3N0IiA6ICJwZXJpcGhlcmFsIiwKIAkJbXVzYi0+aW50X3VzYiwgbXVzYi0+aW50X3R4LCBtdXNiLT5pbnRfcngpOwogCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDCi0JaWYgKGlzX290Z19lbmFibGVkKG11c2IpIHx8IGlzX3BlcmlwaGVyYWxfZW5hYmxlZChtdXNiKSkKLQkJaWYgKCFtdXNiLT5nYWRnZXRfZHJpdmVyKSB7Ci0JCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJObyBnYWRnZXQgZHJpdmVyIGxvYWRlZFxuIik7Ci0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0KLSNlbmRpZgotCiAJLyogdGhlIGNvcmUgY2FuIGludGVycnVwdCB1cyBmb3IgbXVsdGlwbGUgcmVhc29uczsgZG9jcyBoYXZlCiAJICogYSBnZW5lcmljIGludGVycnVwdCBmbG93Y2hhcnQgdG8gZm9sbG93CiAJICovCkBAIC0xNzY2LDggKzE3MjMsNiBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKHZidXMsIDA2NDQsIG11c2JfdmJ1c19zaG93LCBtdXNiX3ZidXNfc3RvcmUpOwogCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDCi0KIC8qIEdhZGdldCBkcml2ZXJzIGNhbid0IGtub3cgdGhhdCBhIGhvc3QgaXMgY29ubmVjdGVkIHNvIHRoZXkgbWlnaHQgd2FudAogICogdG8gc3RhcnQgU1JQLCBidXQgdXNlcnMgY2FuLiAgVGhpcyBhbGxvd3MgdXNlcnNwYWNlIHRvIHRyaWdnZXIgU1JQLgogICovCkBAIC0xNzkxLDE0ICsxNzQ2LDEwIEBACiB9CiBzdGF0aWMgREVWSUNFX0FUVFIoc3JwLCAwNjQ0LCBOVUxMLCBtdXNiX3NycF9zdG9yZSk7CiAKLSNlbmRpZiAvKiBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMgKi8KLQogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm11c2JfYXR0cmlidXRlc1tdID0gewogCSZkZXZfYXR0cl9tb2RlLmF0dHIsCiAJJmRldl9hdHRyX3ZidXMuYXR0ciwKLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMKIAkmZGV2X2F0dHJfc3JwLmF0dHIsCi0jZW5kaWYKIAlOVUxMCiB9OwogCkBAIC0xODMxLDcgKzE3ODIsNiBAQAogCXN0cnVjdCBtdXNiCQkqbXVzYjsKIAlzdHJ1Y3QgbXVzYl9od19lcAkqZXA7CiAJaW50CQkJZXBudW07Ci0jaWZkZWYgQ09ORklHX1VTQl9NVVNCX0hEUkNfSENECiAJc3RydWN0IHVzYl9oY2QJKmhjZDsKIAogCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZtdXNiX2hjX2RyaXZlciwgZGV2LCBkZXZfbmFtZShkZXYpKTsKQEAgLTE4NDksMTIgKzE3OTksNiBAQAogCiAJbXVzYi0+dmJ1c2Vycl9yZXRyeSA9IFZCVVNFUlJfUkVUUllfQ09VTlQ7CiAJbXVzYi0+YV93YWl0X2Jjb24gPSBPVEdfVElNRV9BX1dBSVRfQkNPTjsKLSNlbHNlCi0JbXVzYiA9IGt6YWxsb2Moc2l6ZW9mICptdXNiLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW11c2IpCi0JCXJldHVybiBOVUxMOwotCi0jZW5kaWYKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBtdXNiKTsKIAltdXNiLT5tcmVncyA9IG1iYXNlOwogCW11c2ItPmN0cmxfYmFzZSA9IG1iYXNlOwpAQCAtMTg4NCw5ICsxODI4LDcgQEAKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJm11c2ItPmNvbnRyb2xsZXItPmtvYmosICZtdXNiX2F0dHJfZ3JvdXApOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMKIAltdXNiX2dhZGdldF9jbGVhbnVwKG11c2IpOwotI2VuZGlmCiAKIAlpZiAobXVzYi0+bklycSA+PSAwKSB7CiAJCWlmIChtdXNiLT5pcnFfd2FrZSkKQEAgLTE5MDAsMTEgKzE4NDIsNyBAQAogCQlkbWFfY29udHJvbGxlcl9kZXN0cm95KGMpOwogCX0KIAotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAotCXVzYl9wdXRfaGNkKG11c2JfdG9faGNkKG11c2IpKTsKLSNlbHNlCiAJa2ZyZWUobXVzYik7Ci0jZW5kaWYKIH0KIAogLyoKQEAgLTE5NTQsNyArMTg5Miw3IEBACiAJICogICAtIGluaXRpYWxpemVzIG11c2ItPnhjZWl2LCB1c3VhbGx5IGJ5IG90Z19nZXRfdHJhbnNjZWl2ZXIoKQogCSAqICAgLSBzdG9wcyBwb3dlcmluZyBWQlVTCiAJICoKLQkgKiBUaGVyZSBhcmUgdmFyaW91cyB0cmFuc2NpZXZlciBjb25maWd1cmF0aW9ucy4gIEJsYWNrZmluLAorCSAqIFRoZXJlIGFyZSB2YXJpb3VzIHRyYW5zY2VpdmVyIGNvbmZpZ3VyYXRpb25zLiAgQmxhY2tmaW4sCiAJICogRGFWaW5jaSwgVFVTQjYweDAsIGFuZCBvdGhlcnMgaW50ZWdyYXRlIHRoZW0uICBPTUFQMyB1c2VzCiAJICogZXh0ZXJuYWwvZGlzY3JldGUgb25lcyBpbiB2YXJpb3VzIGZsYXZvcnMgKHR3bDQwMzAgZmFtaWx5LAogCSAqIGlzcDE1MDQsIG5vbi1PVEcsIGV0YykgbW9zdGx5IGhvb2tpbmcgdXAgdGhyb3VnaCBVTFBJLgpAQCAtMTk5OSw5ICsxOTM3LDcgQEAKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZ290byBmYWlsMzsKIAotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9PVEcKIAlzZXR1cF90aW1lcigmbXVzYi0+b3RnX3RpbWVyLCBtdXNiX290Z190aW1lcl9mdW5jLCAodW5zaWduZWQgbG9uZykgbXVzYik7Ci0jZW5kaWYKIAogCS8qIEluaXQgSVJRIHdvcmtxdWV1ZSBiZWZvcmUgcmVxdWVzdF9pcnEgKi8KIAlJTklUX1dPUksoJm11c2ItPmlycV93b3JrLCBtdXNiX2lycV93b3JrKTsKQEAgLTIyMTMsNyArMjE0OSwxNiBAQAogCW11c2ItPmNvbnRleHQuZGV2Y3RsID0gbXVzYl9yZWFkYihtdXNiX2Jhc2UsIE1VU0JfREVWQ1RMKTsKIAogCWZvciAoaSA9IDA7IGkgPCBtdXNiLT5jb25maWctPm51bV9lcHM7ICsraSkgewotCQllcGlvID0gbXVzYi0+ZW5kcG9pbnRzW2ldLnJlZ3M7CisJCXN0cnVjdCBtdXNiX2h3X2VwCSpod19lcDsKKworCQlod19lcCA9ICZtdXNiLT5lbmRwb2ludHNbaV07CisJCWlmICghaHdfZXApCisJCQljb250aW51ZTsKKworCQllcGlvID0gaHdfZXAtPnJlZ3M7CisJCWlmICghZXBpbykKKwkJCWNvbnRpbnVlOworCiAJCW11c2ItPmNvbnRleHQuaW5kZXhfcmVnc1tpXS50eG1heHAgPQogCQkJbXVzYl9yZWFkdyhlcGlvLCBNVVNCX1RYTUFYUCk7CiAJCW11c2ItPmNvbnRleHQuaW5kZXhfcmVnc1tpXS50eGNzciA9CkBAIC0yMjc5LDcgKzIyMjQsMTYgQEAKIAltdXNiX3dyaXRlYihtdXNiX2Jhc2UsIE1VU0JfREVWQ1RMLCBtdXNiLT5jb250ZXh0LmRldmN0bCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbXVzYi0+Y29uZmlnLT5udW1fZXBzOyArK2kpIHsKLQkJZXBpbyA9IG11c2ItPmVuZHBvaW50c1tpXS5yZWdzOworCQlzdHJ1Y3QgbXVzYl9od19lcAkqaHdfZXA7CisKKwkJaHdfZXAgPSAmbXVzYi0+ZW5kcG9pbnRzW2ldOworCQlpZiAoIWh3X2VwKQorCQkJY29udGludWU7CisKKwkJZXBpbyA9IGh3X2VwLT5yZWdzOworCQlpZiAoIWVwaW8pCisJCQljb250aW51ZTsKKwogCQltdXNiX3dyaXRldyhlcGlvLCBNVVNCX1RYTUFYUCwKIAkJCW11c2ItPmNvbnRleHQuaW5kZXhfcmVnc1tpXS50eG1heHApOwogCQltdXNiX3dyaXRldyhlcGlvLCBNVVNCX1RYQ1NSLApAQCAtMjMyOCwxMyArMjI4MiwxMyBAQAogCQkJCW11c2ItPmNvbnRleHQuaW5kZXhfcmVnc1tpXS5yeGh1YnBvcnQpOwogCQl9CiAJfQorCW11c2Jfd3JpdGViKG11c2JfYmFzZSwgTVVTQl9JTkRFWCwgbXVzYi0+Y29udGV4dC5pbmRleCk7CiB9CiAKIHN0YXRpYyBpbnQgbXVzYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG11c2IJKm11c2IgPSBkZXZfdG9fbXVzYihkZXYpOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0Jc3RydWN0IG11c2IJKm11c2IgPSBkZXZfdG9fbXVzYigmcGRldi0+ZGV2KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtdXNiLT5sb2NrLCBmbGFncyk7CiAKQEAgLTIzNTYsOCArMjMxMCw3IEBACiAKIHN0YXRpYyBpbnQgbXVzYl9yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgbXVzYgkqbXVzYiA9IGRldl90b19tdXNiKCZwZGV2LT5kZXYpOworCXN0cnVjdCBtdXNiCSptdXNiID0gZGV2X3RvX211c2IoZGV2KTsKIAogCW11c2JfcmVzdG9yZV9jb250ZXh0KG11c2IpOwogCkBAIC0yNDI1LDM0ICsyMzc4LDEzIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG11c2JfaW5pdCh2b2lkKQogewotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCWlmICh1c2JfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIDA7Ci0jZW5kaWYKIAogCXByX2luZm8oIiVzOiB2ZXJzaW9uICIgTVVTQl9WRVJTSU9OICIsICIKLSNpZmRlZiBDT05GSUdfTVVTQl9QSU9fT05MWQotCQkicGlvIgotI2VsaWYgZGVmaW5lZChDT05GSUdfVVNCX1RJX0NQUElfRE1BKQotCQkiY3BwaS1kbWEiCi0jZWxpZiBkZWZpbmVkKENPTkZJR19VU0JfSU5WRU5UUkFfRE1BKQotCQkibXVzYi1kbWEiCi0jZWxpZiBkZWZpbmVkKENPTkZJR19VU0JfVFVTQl9PTUFQX0RNQSkKLQkJInR1c2Itb21hcC1kbWEiCi0jZWxpZiBkZWZpbmVkKENPTkZJR19VU0JfVVg1MDBfRE1BKQotCQkidXg1MDAtZG1hIgotI2Vsc2UKIAkJIj9kbWE/IgotI2VuZGlmCiAJCSIsICIKLSNpZmRlZiBDT05GSUdfVVNCX01VU0JfT1RHCi0JCSJvdGcgKHBlcmlwaGVyYWwraG9zdCkiCi0jZWxpZiBkZWZpbmVkKENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQykKLQkJInBlcmlwaGVyYWwiCi0jZWxpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRCkKLQkJImhvc3QiCi0jZW5kaWYKLQkJLAorCQkib3RnIChwZXJpcGhlcmFsK2hvc3QpIiwKIAkJbXVzYl9kcml2ZXJfbmFtZSk7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmbXVzYl9kcml2ZXIsIG11c2JfcHJvYmUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKaW5kZXggMGUwNTNiNS4uNjY4ZWVlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oCkBAIC03MiwxMCArNzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KICNpbmNsdWRlICJtdXNiX2hvc3QuaCIKIAotCi0KLSNpZmRlZiBDT05GSUdfVVNCX01VU0JfT1RHCi0KICNkZWZpbmUJaXNfcGVyaXBoZXJhbF9lbmFibGVkKG11c2IpCSgobXVzYiktPmJvYXJkX21vZGUgIT0gTVVTQl9IT1NUKQogI2RlZmluZQlpc19ob3N0X2VuYWJsZWQobXVzYikJCSgobXVzYiktPmJvYXJkX21vZGUgIT0gTVVTQl9QRVJJUEhFUkFMKQogI2RlZmluZQlpc19vdGdfZW5hYmxlZChtdXNiKQkJKChtdXNiKS0+Ym9hcmRfbW9kZSA9PSBNVVNCX09URykKQEAgLTg2LDI0ICs4Miw2IEBACiAjZGVmaW5lIGlzX3BlcmlwaGVyYWxfYWN0aXZlKG0pCQkoIShtKS0+aXNfaG9zdCkKICNkZWZpbmUgaXNfaG9zdF9hY3RpdmUobSkJCSgobSktPmlzX2hvc3QpCiAKLSNlbHNlCi0jZGVmaW5lCWlzX3BlcmlwaGVyYWxfZW5hYmxlZChtdXNiKQlpc19wZXJpcGhlcmFsX2NhcGFibGUoKQotI2RlZmluZQlpc19ob3N0X2VuYWJsZWQobXVzYikJCWlzX2hvc3RfY2FwYWJsZSgpCi0jZGVmaW5lCWlzX290Z19lbmFibGVkKG11c2IpCQkwCi0KLSNkZWZpbmUJaXNfcGVyaXBoZXJhbF9hY3RpdmUobXVzYikJaXNfcGVyaXBoZXJhbF9jYXBhYmxlKCkKLSNkZWZpbmUJaXNfaG9zdF9hY3RpdmUobXVzYikJCWlzX2hvc3RfY2FwYWJsZSgpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX09URykgfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfUEVSSVBIRVJBTCkKLS8qIGZvciBzb21lIHJlYXNvbiwgdGhlICJzZWxlY3QgVVNCX0dBREdFVF9NVVNCX0hEUkMiIGRvZXNuJ3QgYWx3YXlzCi0gKiBvdmVycmlkZSB0aGF0IGNob2ljZSBzZWxlY3Rpb24gKG9mdGVuIFVTQl9HQURHRVRfRFVNTVlfSENEKS4KLSAqLwotI2lmbmRlZiBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMKLSNlcnJvciBib2d1cyBLY29uZmlnIG91dHB1dCAuLi4gc2VsZWN0IENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQwotI2VuZGlmCi0jZW5kaWYJLyogbmVlZCBNVVNCIGdhZGdldCBzZWxlY3Rpb24gKi8KLQogI2lmbmRlZiBDT05GSUdfSEFWRV9DTEsKIC8qIER1bW15IHN0dWIgZm9yIGNsayBmcmFtZXdvcmsgKi8KICNkZWZpbmUgY2xrX2dldChkZXYsIGlkKQlOVUxMCkBAIC0xMTksOCArOTcsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBFUklQSEVSQUwgUk9MRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQwotCiAjZGVmaW5lCWlzX3BlcmlwaGVyYWxfY2FwYWJsZSgpCSgxKQogCiBleHRlcm4gaXJxcmV0dXJuX3QgbXVzYl9nX2VwMF9pcnEoc3RydWN0IG11c2IgKik7CkBAIC0xMzIsNDAgKzEwOCwxNCBAQAogZXh0ZXJuIHZvaWQgbXVzYl9nX3dha2V1cChzdHJ1Y3QgbXVzYiAqKTsKIGV4dGVybiB2b2lkIG11c2JfZ19kaXNjb25uZWN0KHN0cnVjdCBtdXNiICopOwogCi0jZWxzZQotCi0jZGVmaW5lCWlzX3BlcmlwaGVyYWxfY2FwYWJsZSgpCSgwKQotCi1zdGF0aWMgaW5saW5lIGlycXJldHVybl90IG11c2JfZ19lcDBfaXJxKHN0cnVjdCBtdXNiICptKSB7IHJldHVybiBJUlFfTk9ORTsgfQotc3RhdGljIGlubGluZSB2b2lkIG11c2JfZ19yZXNldChzdHJ1Y3QgbXVzYiAqbSkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX2dfc3VzcGVuZChzdHJ1Y3QgbXVzYiAqbSkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX2dfcmVzdW1lKHN0cnVjdCBtdXNiICptKSB7fQotc3RhdGljIGlubGluZSB2b2lkIG11c2JfZ193YWtldXAoc3RydWN0IG11c2IgKm0pIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgbXVzYl9nX2Rpc2Nvbm5lY3Qoc3RydWN0IG11c2IgKm0pIHt9Ci0KLSNlbmRpZgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhPU1QgUk9MRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAotCiAjZGVmaW5lCWlzX2hvc3RfY2FwYWJsZSgpCSgxKQogCiBleHRlcm4gaXJxcmV0dXJuX3QgbXVzYl9oX2VwMF9pcnEoc3RydWN0IG11c2IgKik7CiBleHRlcm4gdm9pZCBtdXNiX2hvc3RfdHgoc3RydWN0IG11c2IgKiwgdTgpOwogZXh0ZXJuIHZvaWQgbXVzYl9ob3N0X3J4KHN0cnVjdCBtdXNiICosIHU4KTsKIAotI2Vsc2UKLQotI2RlZmluZQlpc19ob3N0X2NhcGFibGUoKQkoMCkKLQotc3RhdGljIGlubGluZSBpcnFyZXR1cm5fdCBtdXNiX2hfZXAwX2lycShzdHJ1Y3QgbXVzYiAqbSkgeyByZXR1cm4gSVJRX05PTkU7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX2hvc3RfdHgoc3RydWN0IG11c2IgKm0sIHU4IGUpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgbXVzYl9ob3N0X3J4KHN0cnVjdCBtdXNiICptLCB1OCBlKSB7fQotCi0jZW5kaWYKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBNVVNCX0NfTlVNX0VQUwpAQCAtMjYxLDcgKzIxMSw3IEBACiAgKiBAdHJ5X2lsZGU6CXRyaWVzIHRvIGlkbGUgdGhlIElQCiAgKiBAdmJ1c19zdGF0dXM6IHJldHVybnMgdmJ1cyBzdGF0dXMgaWYgcG9zc2libGUKICAqIEBzZXRfdmJ1czoJZm9yY2VzIHZidXMgc3RhdHVzCi0gKiBAY2hhbm5lbF9wcm9ncmFtOiBwcmUgY2hlY2sgZm9yIHN0YW5kYXJkIGRtYSBjaGFubmVsX3Byb2dyYW0gZnVuYworICogQGFkanVzdF9jaGFubmVsX3BhcmFtczogcHJlIGNoZWNrIGZvciBzdGFuZGFyZCBkbWEgY2hhbm5lbF9wcm9ncmFtIGZ1bmMKICAqLwogc3RydWN0IG11c2JfcGxhdGZvcm1fb3BzIHsKIAlpbnQJKCppbml0KShzdHJ1Y3QgbXVzYiAqbXVzYik7CkBAIC0zMTUsNyArMjY1LDYgQEAKIAl2b2lkIF9faW9tZW0JCSpmaWZvX3N5bmNfdmE7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCXZvaWQgX19pb21lbQkJKnRhcmdldF9yZWdzOwogCiAJLyogY3VycmVudGx5IHNjaGVkdWxlZCBwZXJpcGhlcmFsIGVuZHBvaW50ICovCkBAIC0zMjQsMzEgKzI3MywyMCBAQAogCiAJdTgJCQlyeF9yZWluaXQ7CiAJdTgJCQl0eF9yZWluaXQ7Ci0jZW5kaWYKIAotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQwogCS8qIHBlcmlwaGVyYWwgc2lkZSAqLwogCXN0cnVjdCBtdXNiX2VwCQllcF9pbjsJCQkvKiBUWCAqLwogCXN0cnVjdCBtdXNiX2VwCQllcF9vdXQ7CQkJLyogUlggKi8KLSNlbmRpZgogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbXVzYl9yZXF1ZXN0ICpuZXh0X2luX3JlcXVlc3Qoc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwKQogewotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQwogCXJldHVybiBuZXh0X3JlcXVlc3QoJmh3X2VwLT5lcF9pbik7Ci0jZWxzZQotCXJldHVybiBOVUxMOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG11c2JfcmVxdWVzdCAqbmV4dF9vdXRfcmVxdWVzdChzdHJ1Y3QgbXVzYl9od19lcCAqaHdfZXApCiB7Ci0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDCiAJcmV0dXJuIG5leHRfcmVxdWVzdCgmaHdfZXAtPmVwX291dCk7Ci0jZWxzZQotCXJldHVybiBOVUxMOwotI2VuZGlmCiB9CiAKIHN0cnVjdCBtdXNiX2Nzcl9yZWdzIHsKQEAgLTM5Myw3ICszMzEsNiBAQAogCiAJdTMyCQkJcG9ydDFfc3RhdHVzOwogCi0jaWZkZWYgQ09ORklHX1VTQl9NVVNCX0hEUkNfSENECiAJdW5zaWduZWQgbG9uZwkJcmhfdGltZXI7CiAKIAllbnVtIG11c2JfaF9lcDBfc3RhdGUJZXAwX3N0YWdlOwpAQCAtNDExLDcgKzM0OCw2IEBACiAJc3RydWN0IGxpc3RfaGVhZAlvdXRfYnVsazsJLyogb2YgbXVzYl9xaCAqLwogCiAJc3RydWN0IHRpbWVyX2xpc3QJb3RnX3RpbWVyOwotI2VuZGlmCiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCW5iOwogCiAJc3RydWN0IGRtYV9jb250cm9sbGVyCSpkbWFfY29udHJvbGxlcjsKQEAgLTQ3Miw3ICs0MDgsNiBAQAogI2RlZmluZQljYW5fYnVsa19jb21iaW5lKG11c2IsdHlwZSkgXAogCSgoKHR5cGUpID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspICYmIChtdXNiKS0+YnVsa19jb21iaW5lKQogCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDCiAJLyogaXNfc3VzcGVuZGVkIG1lYW5zIFVTQiBCX1BFUklQSEVSQUwgc3VzcGVuZCAqLwogCXVuc2lnbmVkCQlpc19zdXNwZW5kZWQ6MTsKIApAQCAtNDk2LDcgKzQzMSw2IEBACiAJZW51bSBtdXNiX2dfZXAwX3N0YXRlCWVwMF9zdGF0ZTsKIAlzdHJ1Y3QgdXNiX2dhZGdldAlnOwkJCS8qIHRoZSBnYWRnZXQgKi8KIAlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmdhZGdldF9kcml2ZXI7CS8qIGl0cyBkcml2ZXIgKi8KLSNlbmRpZgogCiAJLyoKIAkgKiBGSVhNRTogUmVtb3ZlIHRoaXMgZmxhZy4KQEAgLTUxOCwxMiArNDUyLDEwIEBACiAjZW5kaWYKIH07CiAKLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG11c2IgKmdhZGdldF90b19tdXNiKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnKQogewogCXJldHVybiBjb250YWluZXJfb2YoZywgc3RydWN0IG11c2IsIGcpOwogfQotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQkxBQ0tGSU4KIHN0YXRpYyBpbmxpbmUgaW50IG11c2JfcmVhZF9maWZvc2l6ZShzdHJ1Y3QgbXVzYiAqbXVzYiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYwppbmRleCAwYTUwYTM1Li5iNjdhMDYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCkBAIC0xNTI0LDYgKzE1MjQsMTIgQEAKIAkJY3NyID0gbXVzYl9yZWFkdyhlcGlvLCBNVVNCX1RYQ1NSKTsKIAkJaWYgKGNzciAmIE1VU0JfVFhDU1JfRklGT05PVEVNUFRZKSB7CiAJCQljc3IgfD0gTVVTQl9UWENTUl9GTFVTSEZJRk8gfCBNVVNCX1RYQ1NSX1BfV1pDX0JJVFM7CisJCQkvKgorCQkJICogU2V0dGluZyBib3RoIFRYUEtUUkRZIGFuZCBGTFVTSEZJRk8gbWFrZXMgY29udHJvbGxlcgorCQkJICogdG8gaW50ZXJydXB0IGN1cnJlbnQgRklGTyBsb2FkaW5nLCBidXQgbm90IGZsdXNoaW5nCisJCQkgKiB0aGUgYWxyZWFkeSBsb2FkZWQgb25lcy4KKwkJCSAqLworCQkJY3NyICY9IH5NVVNCX1RYQ1NSX1RYUEtUUkRZOwogCQkJbXVzYl93cml0ZXcoZXBpbywgTVVTQl9UWENTUiwgY3NyKTsKIAkJCS8qIFJFVklTSVQgbWF5IGJlIGluYXBwcm9wcmlhdGUgdy9vIEZJRk9OT1RFTVBUWSAuLi4gKi8KIAkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIGNzcik7CkBAIC0xNjU3LDggKzE2NjMsOCBAQAogCiAJLyogRklYTUUgaWYgb24sIEhkcmNTdGFydDsgaWYgb2ZmLCBIZHJjU3RvcCAqLwogCi0JZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiZ2FkZ2V0ICVzIEQrIHB1bGx1cCAlc1xuIiwKLQkJbXVzYi0+Z2FkZ2V0X2RyaXZlci0+ZnVuY3Rpb24sIGlzX29uID8gIm9uIiA6ICJvZmYiKTsKKwlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJnYWRnZXQgRCsgcHVsbHVwICVzXG4iLAorCQlpc19vbiA/ICJvbiIgOiAib2ZmIik7CiAJbXVzYl93cml0ZWIobXVzYi0+bXJlZ3MsIE1VU0JfUE9XRVIsIHBvd2VyKTsKIH0KIApAQCAtMTcwNCw2ICsxNzEwLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbXVzYl9nYWRnZXRfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXQgKmcsCisJCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKTsKK3N0YXRpYyBpbnQgbXVzYl9nYWRnZXRfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldCAqZywKKwkJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9nYWRnZXRfb3BzIG11c2JfZ2FkZ2V0X29wZXJhdGlvbnMgPSB7CiAJLmdldF9mcmFtZQkJPSBtdXNiX2dhZGdldF9nZXRfZnJhbWUsCiAJLndha2V1cAkJCT0gbXVzYl9nYWRnZXRfd2FrZXVwLApAQCAtMTcxMSw2ICsxNzIyLDggQEAKIAkvKiAudmJ1c19zZXNzaW9uCQk9IG11c2JfZ2FkZ2V0X3ZidXNfc2Vzc2lvbiwgKi8KIAkudmJ1c19kcmF3CQk9IG11c2JfZ2FkZ2V0X3ZidXNfZHJhdywKIAkucHVsbHVwCQkJPSBtdXNiX2dhZGdldF9wdWxsdXAsCisJLnVkY19zdGFydAkJPSBtdXNiX2dhZGdldF9zdGFydCwKKwkudWRjX3N0b3AJCT0gbXVzYl9nYWRnZXRfc3RvcCwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNzIxLDcgKzE3MzQsNiBAQAogICogYWJvdXQgdGhlcmUgYmVpbmcgb25seSBvbmUgZXh0ZXJuYWwgdXBzdHJlYW0gcG9ydC4gIEl0IGFzc3VtZXMKICAqIGFsbCBwZXJpcGhlcmFsIHBvcnRzIGFyZSBleHRlcm5hbC4uLgogICovCi1zdGF0aWMgc3RydWN0IG11c2IgKnRoZV9nYWRnZXQ7CiAKIHN0YXRpYyB2b2lkIG11c2JfZ2FkZ2V0X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtMTgwOCw5ICsxODIwLDYgQEAKIAkgKiBtdXNiIHBlcmlwaGVyYWxzIGF0IHRoZSBzYW1lIHRpbWUsIG9ubHkgdGhlIGJ1cyBsb2NrCiAJICogaXMgcHJvYmFibHkgaGVsZC4KIAkgKi8KLQlpZiAodGhlX2dhZGdldCkKLQkJcmV0dXJuIC1FQlVTWTsKLQl0aGVfZ2FkZ2V0ID0gbXVzYjsKIAogCW11c2ItPmcub3BzID0gJm11c2JfZ2FkZ2V0X29wZXJhdGlvbnM7CiAJbXVzYi0+Zy5pc19kdWFsc3BlZWQgPSAxOwpAQCAtMTgzNCwxOCArMTg0MywyMiBAQAogCXN0YXR1cyA9IGRldmljZV9yZWdpc3RlcigmbXVzYi0+Zy5kZXYpOwogCWlmIChzdGF0dXMgIT0gMCkgewogCQlwdXRfZGV2aWNlKCZtdXNiLT5nLmRldik7Ci0JCXRoZV9nYWRnZXQgPSBOVUxMOworCQlyZXR1cm4gc3RhdHVzOwogCX0KKwlzdGF0dXMgPSB1c2JfYWRkX2dhZGdldF91ZGMobXVzYi0+Y29udHJvbGxlciwgJm11c2ItPmcpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CitlcnI6CisJZGV2aWNlX3VucmVnaXN0ZXIoJm11c2ItPmcuZGV2KTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiB2b2lkIG11c2JfZ2FkZ2V0X2NsZWFudXAoc3RydWN0IG11c2IgKm11c2IpCiB7Ci0JaWYgKG11c2IgIT0gdGhlX2dhZGdldCkKLQkJcmV0dXJuOwotCisJdXNiX2RlbF9nYWRnZXRfdWRjKCZtdXNiLT5nKTsKIAlkZXZpY2VfdW5yZWdpc3RlcigmbXVzYi0+Zy5kZXYpOwotCXRoZV9nYWRnZXQgPSBOVUxMOwogfQogCiAvKgpAQCAtMTg1Nyw1OSArMTg3MCwzMCBAQAogICogLUVOT01FTSBubyBtZW1vcnkgdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uCiAgKgogICogQHBhcmFtIGRyaXZlciB0aGUgZ2FkZ2V0IGRyaXZlcgotICogQHBhcmFtIGJpbmQgdGhlIGRyaXZlcidzIGJpbmQgZnVuY3Rpb24KICAqIEByZXR1cm4gPDAgaWYgZXJyb3IsIDAgaWYgZXZlcnl0aGluZyBpcyBmaW5lCiAgKi8KLWludCB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKLQkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpCitzdGF0aWMgaW50IG11c2JfZ2FkZ2V0X3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0ICpnLAorCQlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKIHsKLQlzdHJ1Y3QgbXVzYgkJKm11c2IgPSB0aGVfZ2FkZ2V0OworCXN0cnVjdCBtdXNiCQkqbXVzYiA9IGdhZGdldF90b19tdXNiKGcpOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCWludAkJCXJldHZhbCA9IC1FSU5WQUw7CiAKLQlpZiAoIWRyaXZlcgotCQkJfHwgZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfSElHSAotCQkJfHwgIWJpbmQgfHwgIWRyaXZlci0+c2V0dXApCisJaWYgKGRyaXZlci0+c3BlZWQgIT0gVVNCX1NQRUVEX0hJR0gpCiAJCWdvdG8gZXJyMDsKIAotCS8qIGRyaXZlciBtdXN0IGJlIGluaXRpYWxpemVkIHRvIHN1cHBvcnQgcGVyaXBoZXJhbCBtb2RlICovCi0JaWYgKCFtdXNiKSB7Ci0JCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIm5vIGRldj8/XG4iKTsKLQkJcmV0dmFsID0gLUVOT0RFVjsKLQkJZ290byBlcnIwOwotCX0KLQogCXBtX3J1bnRpbWVfZ2V0X3N5bmMobXVzYi0+Y29udHJvbGxlcik7CiAKIAlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJyZWdpc3RlcmluZyBkcml2ZXIgJXNcbiIsIGRyaXZlci0+ZnVuY3Rpb24pOwogCi0JaWYgKG11c2ItPmdhZGdldF9kcml2ZXIpIHsKLQkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiJXMgaXMgYWxyZWFkeSBib3VuZCB0byAlc1xuIiwKLQkJCQltdXNiX2RyaXZlcl9uYW1lLAotCQkJCW11c2ItPmdhZGdldF9kcml2ZXItPmRyaXZlci5uYW1lKTsKLQkJcmV0dmFsID0gLUVCVVNZOwotCQlnb3RvIGVycjA7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKwltdXNiLT5zb2Z0Y29ubmVjdCA9IDA7CiAJbXVzYi0+Z2FkZ2V0X2RyaXZlciA9IGRyaXZlcjsKLQltdXNiLT5nLmRldi5kcml2ZXIgPSAmZHJpdmVyLT5kcml2ZXI7Ci0JZHJpdmVyLT5kcml2ZXIuYnVzID0gTlVMTDsKLQltdXNiLT5zb2Z0Y29ubmVjdCA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dmFsID0gYmluZCgmbXVzYi0+Zyk7Ci0JaWYgKHJldHZhbCkgewotCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJiaW5kIHRvIGRyaXZlciAlcyBmYWlsZWQgLS0+ICVkXG4iLAotCQkJCWRyaXZlci0+ZHJpdmVyLm5hbWUsIHJldHZhbCk7Ci0JCWdvdG8gZXJyMTsKLQl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCW11c2ItPmlzX2FjdGl2ZSA9IDE7CiAKIAlvdGdfc2V0X3BlcmlwaGVyYWwobXVzYi0+eGNlaXYsICZtdXNiLT5nKTsKIAltdXNiLT54Y2Vpdi0+c3RhdGUgPSBPVEdfU1RBVEVfQl9JRExFOwotCW11c2ItPmlzX2FjdGl2ZSA9IDE7CiAKIAkvKgogCSAqIEZJWE1FIHRoaXMgaWdub3JlcyB0aGUgc29mdGNvbm5lY3QgZmxhZy4gIERyaXZlcnMgYXJlCkBAIC0xOTIxLDggKzE5MDUsNiBAQAogCWlmICghaXNfb3RnX2VuYWJsZWQobXVzYikpCiAJCW11c2Jfc3RhcnQobXVzYik7CiAKLQlvdGdfc2V0X3BlcmlwaGVyYWwobXVzYi0+eGNlaXYsICZtdXNiLT5nKTsKLQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIAogCWlmIChpc19vdGdfZW5hYmxlZChtdXNiKSkgewpAQCAtMTk1NCwxNSArMTkzNiw5IEBACiBlcnIyOgogCWlmICghaXNfb3RnX2VuYWJsZWQobXVzYikpCiAJCW11c2Jfc3RvcChtdXNiKTsKLQotZXJyMToKLQltdXNiLT5nYWRnZXRfZHJpdmVyID0gTlVMTDsKLQltdXNiLT5nLmRldi5kcml2ZXIgPSBOVUxMOwotCiBlcnIwOgogCXJldHVybiByZXR2YWw7CiB9Ci1FWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKTsKIAogc3RhdGljIHZvaWQgc3RvcF9hY3Rpdml0eShzdHJ1Y3QgbXVzYiAqbXVzYiwgc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CkBAIC0yMDEyLDE3ICsxOTg4LDEyIEBACiAgKgogICogQHBhcmFtIGRyaXZlciB0aGUgZ2FkZ2V0IGRyaXZlciB0byB1bnJlZ2lzdGVyCiAgKi8KLWludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQorc3RhdGljIGludCBtdXNiX2dhZGdldF9zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnLAorCQlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKIHsKLQlzdHJ1Y3QgbXVzYgkqbXVzYiA9IHRoZV9nYWRnZXQ7CisJc3RydWN0IG11c2IJKm11c2IgPSBnYWRnZXRfdG9fbXVzYihnKTsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0JaWYgKCFkcml2ZXIgfHwgIWRyaXZlci0+dW5iaW5kIHx8ICFtdXNiKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghbXVzYi0+Z2FkZ2V0X2RyaXZlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlpZiAobXVzYi0+eGNlaXYtPmxhc3RfZXZlbnQgPT0gVVNCX0VWRU5UX05PTkUpCiAJCXBtX3J1bnRpbWVfZ2V0X3N5bmMobXVzYi0+Y29udHJvbGxlcik7CiAKQEAgLTIwMzMsOSArMjAwNCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwogCi0jaWZkZWYJQ09ORklHX1VTQl9NVVNCX09URwogCW11c2JfaG5wX3N0b3AobXVzYik7Ci0jZW5kaWYKIAogCSh2b2lkKSBtdXNiX2dhZGdldF92YnVzX2RyYXcoJm11c2ItPmcsIDApOwogCkBAIC0yMDQ1LDEzICsyMDE0LDYgQEAKIAogCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgInVucmVnaXN0ZXJpbmcgZHJpdmVyICVzXG4iLCBkcml2ZXItPmZ1bmN0aW9uKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKLQlkcml2ZXItPnVuYmluZCgmbXVzYi0+Zyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKLQotCW11c2ItPmdhZGdldF9kcml2ZXIgPSBOVUxMOwotCW11c2ItPmcuZGV2LmRyaXZlciA9IE5VTEw7Ci0KIAltdXNiLT5pc19hY3RpdmUgPSAwOwogCW11c2JfcGxhdGZvcm1fdHJ5X2lkbGUobXVzYiwgMCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwpAQCAtMjA3MSw4ICsyMDMzLDYgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKLQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0yMTU4LDcgKzIxMTgsNiBAQAogCiAJc3dpdGNoIChtdXNiLT54Y2Vpdi0+c3RhdGUpIHsKIAlkZWZhdWx0OgotI2lmZGVmCUNPTkZJR19VU0JfTVVTQl9PVEcKIAkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiVW5oYW5kbGVkIGRpc2Nvbm5lY3QgJXMsIHNldHRpbmcgYV9pZGxlXG4iLAogCQkJb3RnX3N0YXRlX3N0cmluZyhtdXNiLT54Y2Vpdi0+c3RhdGUpKTsKIAkJbXVzYi0+eGNlaXYtPnN0YXRlID0gT1RHX1NUQVRFX0FfSURMRTsKQEAgLTIxNzAsNyArMjEyOSw2IEBACiAJCWJyZWFrOwogCWNhc2UgT1RHX1NUQVRFX0JfV0FJVF9BQ09OOgogCWNhc2UgT1RHX1NUQVRFX0JfSE9TVDoKLSNlbmRpZgogCWNhc2UgT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDoKIAljYXNlIE9UR19TVEFURV9CX0lETEU6CiAJCW11c2ItPnhjZWl2LT5zdGF0ZSA9IE9UR19TVEFURV9CX0lETEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0X2VwMC5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldF9lcDAuYwppbmRleCBiMmZhZmYyLi45Mzc4YjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0X2VwMC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXRfZXAwLmMKQEAgLTg4LDcgKzg4LDYgQEAKIAljYXNlIFVTQl9SRUNJUF9ERVZJQ0U6CiAJCXJlc3VsdFswXSA9IG11c2ItPmlzX3NlbGZfcG93ZXJlZCA8PCBVU0JfREVWSUNFX1NFTEZfUE9XRVJFRDsKIAkJcmVzdWx0WzBdIHw9IG11c2ItPm1heV93YWtldXAgPDwgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQOwotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9PVEcKIAkJaWYgKG11c2ItPmcuaXNfb3RnKSB7CiAJCQlyZXN1bHRbMF0gfD0gbXVzYi0+Zy5iX2hucF9lbmFibGUKIAkJCQk8PCBVU0JfREVWSUNFX0JfSE5QX0VOQUJMRTsKQEAgLTk3LDcgKzk2LDYgQEAKIAkJCXJlc3VsdFswXSB8PSBtdXNiLT5nLmFfaG5wX3N1cHBvcnQKIAkJCQk8PCBVU0JfREVWSUNFX0FfSE5QX1NVUFBPUlQ7CiAJCX0KLSNlbmRpZgogCQlicmVhazsKIAogCWNhc2UgVVNCX1JFQ0lQX0lOVEVSRkFDRToKQEAgLTM5Miw3ICszOTAsNiBAQAogCQkJCQlpZiAoaGFuZGxlZCA+IDApCiAJCQkJCQltdXNiLT50ZXN0X21vZGUgPSB0cnVlOwogCQkJCQlicmVhazsKLSNpZmRlZiBDT05GSUdfVVNCX01VU0JfT1RHCiAJCQkJY2FzZSBVU0JfREVWSUNFX0JfSE5QX0VOQUJMRToKIAkJCQkJaWYgKCFtdXNiLT5nLmlzX290ZykKIAkJCQkJCWdvdG8gc3RhbGw7CkBAIC00MDksNyArNDA2LDYgQEAKIAkJCQkJCWdvdG8gc3RhbGw7CiAJCQkJCW11c2ItPmcuYV9hbHRfaG5wX3N1cHBvcnQgPSAxOwogCQkJCQlicmVhazsKLSNlbmRpZgogCQkJCWNhc2UgVVNCX0RFVklDRV9ERUJVR19NT0RFOgogCQkJCQloYW5kbGVkID0gMDsKIAkJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYwppbmRleCA3Mjk1ZTMxLi44YjI0NzNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKQEAgLTE1NzUsNyArMTU3NSw3IEBACiAJCQkvKiBldmVuIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgd2UgZGlkIHRoZSBkbWEKIAkJCSAqIGZvciBpc29fZnJhbWVfZGVzYy0+bGVuZ3RoCiAJCQkgKi8KLQkJCWlmIChkLT5zdGF0dXMgIT0gRUlMU0VRICYmIGQtPnN0YXR1cyAhPSAtRU9WRVJGTE9XKQorCQkJaWYgKGQtPnN0YXR1cyAhPSAtRUlMU0VRICYmIGQtPnN0YXR1cyAhPSAtRU9WRVJGTE9XKQogCQkJCWQtPnN0YXR1cyA9IDA7CiAKIAkJCWlmICgrK3FoLT5pc29faWR4ID49IHVyYi0+bnVtYmVyX29mX3BhY2tldHMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuaAppbmRleCAxNGIwMDc3Li42MjJkMDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5oCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmgKQEAgLTk1LDcgKzk1LDYgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXJiICpuZXh0X3VyYihzdHJ1Y3QgbXVzYl9xaCAqcWgpCiB7Ci0jaWZkZWYgQ09ORklHX1VTQl9NVVNCX0hEUkNfSENECiAJc3RydWN0IGxpc3RfaGVhZAkqcXVldWU7CiAKIAlpZiAoIXFoKQpAQCAtMTA0LDkgKzEwMyw2IEBACiAJaWYgKGxpc3RfZW1wdHkocXVldWUpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gbGlzdF9lbnRyeShxdWV1ZS0+bmV4dCwgc3RydWN0IHVyYiwgdXJiX2xpc3QpOwotI2Vsc2UKLQlyZXR1cm4gTlVMTDsKLSNlbmRpZgogfQogCiAjZW5kaWYJCQkJLyogX01VU0JfSE9TVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfdmlydGh1Yi5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX3ZpcnRodWIuYwppbmRleCAyZDgwYTU3Li5lOWY4MGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfdmlydGh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl92aXJ0aHViLmMKQEAgLTg4LDE0ICs4OCwxMiBAQAogCQkJCQkJT1RHX1RJTUVfQV9BSURMX0JESVMpKTsKIAkJCW11c2JfcGxhdGZvcm1fdHJ5X2lkbGUobXVzYiwgMCk7CiAJCQlicmVhazsKLSNpZmRlZglDT05GSUdfVVNCX01VU0JfT1RHCiAJCWNhc2UgT1RHX1NUQVRFX0JfSE9TVDoKIAkJCW11c2ItPnhjZWl2LT5zdGF0ZSA9IE9UR19TVEFURV9CX1dBSVRfQUNPTjsKIAkJCW11c2ItPmlzX2FjdGl2ZSA9IGlzX290Z19lbmFibGVkKG11c2IpCiAJCQkJCSYmIG11c2ItPnhjZWl2LT5ob3N0LT5iX2hucF9lbmFibGU7CiAJCQltdXNiX3BsYXRmb3JtX3RyeV9pZGxlKG11c2IsIDApOwogCQkJYnJlYWs7Ci0jZW5kaWYKIAkJZGVmYXVsdDoKIAkJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgImJvZ3VzIHJoIHN1c3BlbmQ/ICVzXG4iLAogCQkJCW90Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPnN0YXRlKSk7CkBAIC0xMTgsMTMgKzExNiwxMSBAQAogCXU4CQlwb3dlcjsKIAl2b2lkIF9faW9tZW0JKm1iYXNlID0gbXVzYi0+bXJlZ3M7CiAKLSNpZmRlZiBDT05GSUdfVVNCX01VU0JfT1RHCiAJaWYgKG11c2ItPnhjZWl2LT5zdGF0ZSA9PSBPVEdfU1RBVEVfQl9JRExFKSB7CiAJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIkhOUDogUmV0dXJuaW5nIGZyb20gSE5QOyBubyBodWIgcmVzZXQgZnJvbSBiX2lkbGVcbiIpOwogCQltdXNiLT5wb3J0MV9zdGF0dXMgJj0gflVTQl9QT1JUX1NUQVRfUkVTRVQ7CiAJCXJldHVybjsKIAl9Ci0jZW5kaWYKIAogCWlmICghaXNfaG9zdF9hY3RpdmUobXVzYikpCiAJCXJldHVybjsKQEAgLTE5MSwxNCArMTg3LDEyIEBACiAKIAlzd2l0Y2ggKG11c2ItPnhjZWl2LT5zdGF0ZSkgewogCWNhc2UgT1RHX1NUQVRFX0FfU1VTUEVORDoKLSNpZmRlZglDT05GSUdfVVNCX01VU0JfT1RHCiAJCWlmIChpc19vdGdfZW5hYmxlZChtdXNiKQogCQkJCSYmIG11c2ItPnhjZWl2LT5ob3N0LT5iX2hucF9lbmFibGUpIHsKIAkJCW11c2ItPnhjZWl2LT5zdGF0ZSA9IE9UR19TVEFURV9BX1BFUklQSEVSQUw7CiAJCQltdXNiLT5nLmlzX2FfcGVyaXBoZXJhbCA9IDE7CiAJCQlicmVhazsKIAkJfQotI2VuZGlmCiAJCS8qIEZBTExUSFJPVUdIICovCiAJY2FzZSBPVEdfU1RBVEVfQV9IT1NUOgogCQltdXNiLT54Y2Vpdi0+c3RhdGUgPSBPVEdfU1RBVEVfQV9XQUlUX0JDT047CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMgYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKaW5kZXggYzVkNGM0NC4uYmE4NWYyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYwpAQCAtNTEsOSArNTEsNyBAQAogewogCXN0cnVjdCBtdXNiCSptdXNiID0gKHZvaWQgKilfbXVzYjsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCXU4CXBvd2VyOwotI2VuZGlmCiAJdTgJZGV2Y3RsOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKQEAgLTcwLDcgKzY4LDYgQEAKIAkJCU1VU0JfSFNUX01PREUobXVzYik7CiAJCX0KIAkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX1VTQl9NVVNCX0hEUkNfSENECiAJY2FzZSBPVEdfU1RBVEVfQV9TVVNQRU5EOgogCQkvKiBmaW5pc2ggUkVTVU1FIHNpZ25hbGluZz8gKi8KIAkJaWYgKG11c2ItPnBvcnQxX3N0YXR1cyAmIE1VU0JfUE9SVF9TVEFUX1JFU1VNRSkgewpAQCAtODcsMTUgKzg0LDEyIEBACiAJCQltdXNiLT54Y2Vpdi0+c3RhdGUgPSBPVEdfU1RBVEVfQV9IT1NUOwogCQl9CiAJCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1VTQl9NVVNCX0hEUkNfSENECiAJY2FzZSBPVEdfU1RBVEVfQV9IT1NUOgogCQlkZXZjdGwgPSBtdXNiX3JlYWRiKG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCk7CiAJCWlmIChkZXZjdGwgJiAgTVVTQl9ERVZDVExfQkRFVklDRSkKIAkJCW11c2ItPnhjZWl2LT5zdGF0ZSA9IE9UR19TVEFURV9CX0lETEU7CiAJCWVsc2UKIAkJCW11c2ItPnhjZWl2LT5zdGF0ZSA9IE9UR19TVEFURV9BX1dBSVRfQkNPTjsKLSNlbmRpZgogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTI0MywxMyArMjM3LDExIEBACiAJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIklEIEdORFxuIik7CiAKIAkJaWYgKGlzX290Z19lbmFibGVkKG11c2IpKSB7Ci0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDCiAJCQlpZiAobXVzYi0+Z2FkZ2V0X2RyaXZlcikgewogCQkJCXBtX3J1bnRpbWVfZ2V0X3N5bmMobXVzYi0+Y29udHJvbGxlcik7CiAJCQkJb3RnX2luaXQobXVzYi0+eGNlaXYpOwogCQkJCW9tYXAyNDMwX211c2Jfc2V0X3ZidXMobXVzYiwgMSk7CiAJCQl9Ci0jZW5kaWYKIAkJfSBlbHNlIHsKIAkJCXBtX3J1bnRpbWVfZ2V0X3N5bmMobXVzYi0+Y29udHJvbGxlcik7CiAJCQlvdGdfaW5pdChtdXNiLT54Y2Vpdik7CkBAIC0yNjAsMjEgKzI1MiwxNiBAQAogCWNhc2UgVVNCX0VWRU5UX1ZCVVM6CiAJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIlZCVVMgQ29ubmVjdFxuIik7CiAKLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMKIAkJaWYgKG11c2ItPmdhZGdldF9kcml2ZXIpCiAJCQlwbV9ydW50aW1lX2dldF9zeW5jKG11c2ItPmNvbnRyb2xsZXIpOwotI2VuZGlmCiAJCW90Z19pbml0KG11c2ItPnhjZWl2KTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQl9FVkVOVF9OT05FOgogCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJWQlVTIERpc2Nvbm5lY3RcbiIpOwogCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDCiAJCWlmIChpc19vdGdfZW5hYmxlZChtdXNiKSB8fCBpc19wZXJpcGhlcmFsX2VuYWJsZWQobXVzYikpCi0JCQlpZiAobXVzYi0+Z2FkZ2V0X2RyaXZlcikKLSNlbmRpZgotCQkJeworCQkJaWYgKG11c2ItPmdhZGdldF9kcml2ZXIpIHsKIAkJCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KG11c2ItPmNvbnRyb2xsZXIpOwogCQkJCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKG11c2ItPmNvbnRyb2xsZXIpOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi90dXNiNjAxMC5jIGIvZHJpdmVycy91c2IvbXVzYi90dXNiNjAxMC5jCmluZGV4IGI0MTAzNTcuLjllZWM0MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvdHVzYjYwMTAuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL3R1c2I2MDEwLmMKQEAgLTI2OSw4ICsyNjksNiBAQAogCiBzdGF0aWMgc3RydWN0IG11c2IgKnRoZV9tdXNiOwogCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDCi0KIC8qIFRoaXMgaXMgdXNlZCBieSBnYWRnZXQgZHJpdmVycywgYW5kIE9URyB0cmFuc2NlaXZlciBsb2dpYywgYWxsb3dpbmcKICAqIGF0IG1vc3QgbUEgY3VycmVudCB0byBiZSBkcmF3biBmcm9tIFZCVVMgZHVyaW5nIGEgRGVmYXVsdC1CIHNlc3Npb24KICAqICh0aGF0IGlzLCB3aGlsZSBWQlVTIGV4Y2VlZHMgNC40VikuICBJbiBEZWZhdWx0LUEgKGluY2x1ZGluZyBwdXJlIGhvc3QKQEAgLTMxMCwxMCArMzA4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2Vsc2UKLSNkZWZpbmUgdHVzYl9kcmF3X3Bvd2VyCU5VTEwKLSNlbmRpZgotCiAvKiB3b3JrYXJvdW5kIGZvciBpc3N1ZSAxMzogIGNoYW5nZSBjbG9jayBkdXJpbmcgY2hpcCBpZGxlCiAgKiAodG8gYmUgZml4ZWQgaW4gcmV2MyBzaWxpY29uKSAuLi4gc3ltcHRvbXMgaW5jbHVkZSBkaXNjb25uZWN0CiAgKiBvciBsb29waW5nIHN1c3BlbmQvcmVzdW1lIGN5Y2xlcwpAQCAtNDQwLDE5ICs0MzQsMTUgQEAKIAkJaWYgKGlzX2hvc3RfYWN0aXZlKG11c2IpICYmIChtdXNiLT5wb3J0MV9zdGF0dXMgPj4gMTYpKQogCQkJZ290byBkb25lOwogCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDCi0JCWlmIChpc19wZXJpcGhlcmFsX2VuYWJsZWQobXVzYikgJiYgIW11c2ItPmdhZGdldF9kcml2ZXIpCisJCWlmIChpc19wZXJpcGhlcmFsX2VuYWJsZWQobXVzYikgJiYgIW11c2ItPmdhZGdldF9kcml2ZXIpIHsKIAkJCXdha2V1cHMgPSAwOwotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCXdha2V1cHMgPSBUVVNCX1BSQ01fV0hPU1RESVNDT04KLQkJCQkJfCBUVVNCX1BSQ01fV0JVUworCQkJCXwgVFVTQl9QUkNNX1dCVVMKIAkJCQkJfCBUVVNCX1BSQ01fV1ZCVVM7CiAJCQlpZiAoaXNfb3RnX2VuYWJsZWQobXVzYikpCiAJCQkJd2FrZXVwcyB8PSBUVVNCX1BSQ01fV0lEOwogCQl9Ci0jZWxzZQotCQl3YWtldXBzID0gVFVTQl9QUkNNX1dIT1NURElTQ09OIHwgVFVTQl9QUkNNX1dCVVM7Ci0jZW5kaWYKIAkJdHVzYl9hbGxvd19pZGxlKG11c2IsIHdha2V1cHMpOwogCX0KIGRvbmU6CkBAIC02MTAsMzAgKzYwMCwyMiBAQAogCiAJc3dpdGNoIChtdXNiX21vZGUpIHsKIAotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCWNhc2UgTVVTQl9IT1NUOgkJLyogRGlzYWJsZSBQSFkgSUQgZGV0ZWN0LCBncm91bmQgSUQgKi8KIAkJcGh5X290Z19jdHJsICY9IH5UVVNCX1BIWV9PVEdfQ1RSTF9PVEdfSURfUFVMTFVQOwogCQlwaHlfb3RnX2VuYSB8PSBUVVNCX1BIWV9PVEdfQ1RSTF9PVEdfSURfUFVMTFVQOwogCQlkZXZfY29uZiB8PSBUVVNCX0RFVl9DT05GX0lEX1NFTDsKIAkJZGV2X2NvbmYgJj0gflRVU0JfREVWX0NPTkZfU09GVF9JRDsKIAkJYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQwogCWNhc2UgTVVTQl9QRVJJUEhFUkFMOgkvKiBEaXNhYmxlIFBIWSBJRCBkZXRlY3QsIGtlZXAgSUQgcHVsbC11cCBvbiAqLwogCQlwaHlfb3RnX2N0cmwgfD0gVFVTQl9QSFlfT1RHX0NUUkxfT1RHX0lEX1BVTExVUDsKIAkJcGh5X290Z19lbmEgfD0gVFVTQl9QSFlfT1RHX0NUUkxfT1RHX0lEX1BVTExVUDsKIAkJZGV2X2NvbmYgfD0gKFRVU0JfREVWX0NPTkZfSURfU0VMIHwgVFVTQl9ERVZfQ09ORl9TT0ZUX0lEKTsKIAkJYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19VU0JfTVVTQl9PVEcKIAljYXNlIE1VU0JfT1RHOgkJLyogVXNlIFBIWSBJRCBkZXRlY3Rpb24gKi8KIAkJcGh5X290Z19jdHJsIHw9IFRVU0JfUEhZX09UR19DVFJMX09UR19JRF9QVUxMVVA7CiAJCXBoeV9vdGdfZW5hIHw9IFRVU0JfUEhZX09UR19DVFJMX09UR19JRF9QVUxMVVA7CiAJCWRldl9jb25mICY9IH4oVFVTQl9ERVZfQ09ORl9JRF9TRUwgfCBUVVNCX0RFVl9DT05GX1NPRlRfSUQpOwogCQlicmVhazsKLSNlbmRpZgogCiAJZGVmYXVsdDoKIAkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiVHJ5aW5nIHRvIHNldCBtb2RlICVpXG4iLCBtdXNiX21vZGUpOwpAQCAtNjg0LDcgKzY2Niw2IEBACiAJCS8qIEItZGV2IHN0YXRlIG1hY2hpbmU6ICBubyB2YnVzIH49IGRpc2Nvbm5lY3QgKi8KIAkJaWYgKChpc19vdGdfZW5hYmxlZChtdXNiKSAmJiAhbXVzYi0+eGNlaXYtPmRlZmF1bHRfYSkKIAkJCQl8fCAhaXNfaG9zdF9lbmFibGVkKG11c2IpKSB7Ci0jaWZkZWYgQ09ORklHX1VTQl9NVVNCX0hEUkNfSENECiAJCQkvKiA/IG11c2Jfcm9vdF9kaXNjb25uZWN0KG11c2IpOyAqLwogCQkJbXVzYi0+cG9ydDFfc3RhdHVzICY9CiAJCQkJfihVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04KQEAgLTY5Myw3ICs2NzQsNiBAQAogCQkJCXwgVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVECiAJCQkJfCBVU0JfUE9SVF9TVEFUX1RFU1QKIAkJCQkpOwotI2VuZGlmCiAKIAkJCWlmIChvdGdfc3RhdCAmIFRVU0JfREVWX09UR19TVEFUX1NFU1NfRU5EKSB7CiAJCQkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiRm9yY2luZyBkaXNjb25uZWN0IChubyBpbnRlcnJ1cHQpXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL290Zy9pc3AxMzAxX29tYXAuYyBiL2RyaXZlcnMvdXNiL290Zy9pc3AxMzAxX29tYXAuYwppbmRleCA4YzI4MjI1Li5jYTliNjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9vdGcvaXNwMTMwMV9vbWFwLmMKKysrIGIvZHJpdmVycy91c2Ivb3RnL2lzcDEzMDFfb21hcC5jCkBAIC02NjAsNyArNjYwLDcgQEAKIAlpbnQJCXJldCA9IElSUV9OT05FOwogCXN0cnVjdCBpc3AxMzAxCSppc3AgPSBfaXNwOwogCi0JLyogdXBkYXRlIElTUDEzMDEgdHJhbnNjaWV2ZXIgZnJvbSBPVEcgY29udHJvbGxlciAqLworCS8qIHVwZGF0ZSBJU1AxMzAxIHRyYW5zY2VpdmVyIGZyb20gT1RHIGNvbnRyb2xsZXIgKi8KIAlpZiAob3RnX2lycSAmIE9QUlRfQ0hHKSB7CiAJCW9tYXBfd3JpdGV3KE9QUlRfQ0hHLCBPVEdfSVJRX1NSQyk7CiAJCWlzcDEzMDFfZGVmZXJfd29yayhpc3AsIFdPUktfVVBEQVRFX0lTUCk7CkBAIC03NTUsNyArNzU1LDcgQEAKIAkJb21hcF93cml0ZXcoQV9WQlVTX0VSUiwgT1RHX0lSUV9TUkMpOwogCQlyZXQgPSBJUlFfSEFORExFRDsKIAotCS8qIHN3aXRjaCBkcml2ZXI7IHRoZSB0cmFuc2NpZXZlciBjb2RlIGFjdGl2YXRlcyBpdCwKKwkvKiBzd2l0Y2ggZHJpdmVyOyB0aGUgdHJhbnNjZWl2ZXIgY29kZSBhY3RpdmF0ZXMgaXQsCiAJICogdW5nYXRpbmcgdGhlIHVkYyBjbG9jayBvciByZXN1bWluZyBPSENJLgogCSAqLwogCX0gZWxzZSBpZiAob3RnX2lycSAmIERSSVZFUl9TV0lUQ0gpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL290Zy9vdGdfZnNtLmMgYi9kcml2ZXJzL3VzYi9vdGcvb3RnX2ZzbS5jCmluZGV4IGIwY2M0MjIuLjA5MTE3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL290Zy9vdGdfZnNtLmMKKysrIGIvZHJpdmVycy91c2Ivb3RnL290Z19mc20uYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgIm90Z19mc20uaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivb3RnL3R3bDQwMzAtdXNiLmMgYi9kcml2ZXJzL3VzYi9vdGcvdHdsNDAzMC11c2IuYwppbmRleCBlZmViNGQxLi4xNGY2NmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9vdGcvdHdsNDAzMC11c2IuYworKysgYi9kcml2ZXJzL3VzYi9vdGcvdHdsNDAzMC11c2IuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiB9OwogCiAvKiBpbnRlcm5hbCBkZWZpbmUgb24gdG9wIG9mIGNvbnRhaW5lcl9vZiAqLwotI2RlZmluZSB4Y2Vpdl90b190d2woeCkJCWNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCB0d2w0MDMwX3VzYiwgb3RnKTsKKyNkZWZpbmUgeGNlaXZfdG9fdHdsKHgpCQljb250YWluZXJfb2YoKHgpLCBzdHJ1Y3QgdHdsNDAzMF91c2IsIG90ZykKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivb3RnL3R3bDYwMzAtdXNiLmMgYi9kcml2ZXJzL3VzYi9vdGcvdHdsNjAzMC11c2IuYwppbmRleCBjZmI1YWE3Li5iNGQyYzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9vdGcvdHdsNjAzMC11c2IuYworKysgYi9kcml2ZXJzL3VzYi9vdGcvdHdsNjAzMC11c2IuYwpAQCAtOTUsMTEgKzk1LDE1IEBACiAKIAlzdHJ1Y3QgcmVndWxhdG9yCQkqdXNiM3YzOwogCisJLyogdXNlZCB0byBzZXQgdmJ1cywgaW4gYXRvbWljIHBhdGggKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJc2V0X3ZidXNfd29yazsKKwogCWludAkJCWlycTE7CiAJaW50CQkJaXJxMjsKIAl1OAkJCWxpbmtzdGF0OwogCXU4CQkJYXNsZWVwOwogCWJvb2wJCQlpcnFfZW5hYmxlZDsKKwlib29sCQkJdmJ1c19lbmFibGU7CiAJdW5zaWduZWQgbG9uZwkJZmVhdHVyZXM7CiB9OwogCkBAIC0zNzAsMjAgKzM3NCwzMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHR3bDYwMzBfc2V0X3ZidXMoc3RydWN0IG90Z190cmFuc2NlaXZlciAqeCwgYm9vbCBlbmFibGVkKQorc3RhdGljIHZvaWQgb3RnX3NldF92YnVzX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQogewotCXN0cnVjdCB0d2w2MDMwX3VzYiAqdHdsID0geGNlaXZfdG9fdHdsKHgpOworCXN0cnVjdCB0d2w2MDMwX3VzYiAqdHdsID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCB0d2w2MDMwX3VzYiwKKwkJCQkJCQkJc2V0X3ZidXNfd29yayk7CiAKIAkvKgogCSAqIFN0YXJ0IGRyaXZpbmcgVkJVUy4gU2V0IE9QQV9NT0RFIGJpdCBpbiBDSEFSR0VSVVNCX0NUUkwxCiAJICogcmVnaXN0ZXIuIFRoaXMgZW5hYmxlcyBib29zdCBtb2RlLgogCSAqLwotCWlmIChlbmFibGVkKQorCisJaWYgKHR3bC0+dmJ1c19lbmFibGUpCiAJCXR3bDYwMzBfd3JpdGViKHR3bCwgVFdMX01PRFVMRV9NQUlOX0NIQVJHRSAsIDB4NDAsCi0JCQkJCQlDSEFSR0VSVVNCX0NUUkwxKTsKLQkgZWxzZQorCQkJCQkJCUNIQVJHRVJVU0JfQ1RSTDEpOworCWVsc2UKIAkJdHdsNjAzMF93cml0ZWIodHdsLCBUV0xfTU9EVUxFX01BSU5fQ0hBUkdFICwgMHgwMCwKLQkJCQkJCUNIQVJHRVJVU0JfQ1RSTDEpOworCQkJCQkJCUNIQVJHRVJVU0JfQ1RSTDEpOworfQorCitzdGF0aWMgaW50IHR3bDYwMzBfc2V0X3ZidXMoc3RydWN0IG90Z190cmFuc2NlaXZlciAqeCwgYm9vbCBlbmFibGVkKQoreworCXN0cnVjdCB0d2w2MDMwX3VzYiAqdHdsID0geGNlaXZfdG9fdHdsKHgpOworCisJdHdsLT52YnVzX2VuYWJsZSA9IGVuYWJsZWQ7CisJc2NoZWR1bGVfd29yaygmdHdsLT5zZXRfdmJ1c193b3JrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC00NDQsNiArNDU5LDggQEAKIAogCUFUT01JQ19JTklUX05PVElGSUVSX0hFQUQoJnR3bC0+b3RnLm5vdGlmaWVyKTsKIAorCUlOSVRfV09SSygmdHdsLT5zZXRfdmJ1c193b3JrLCBvdGdfc2V0X3ZidXNfd29yayk7CisKIAl0d2wtPmlycV9lbmFibGVkID0gdHJ1ZTsKIAlzdGF0dXMgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh0d2wtPmlycTEsIE5VTEwsIHR3bDYwMzBfdXNib3RnX2lycSwKIAkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORywKQEAgLTQ5NCw2ICs1MTEsNyBAQAogCXJlZ3VsYXRvcl9wdXQodHdsLT51c2IzdjMpOwogCXBkYXRhLT5waHlfZXhpdCh0d2wtPmRldik7CiAJZGV2aWNlX3JlbW92ZV9maWxlKHR3bC0+ZGV2LCAmZGV2X2F0dHJfdmJ1cyk7CisJY2FuY2VsX3dvcmtfc3luYygmdHdsLT5zZXRfdmJ1c193b3JrKTsKIAlrZnJlZSh0d2wpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL0tjb25maWcgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL0tjb25maWcKaW5kZXggYjJlNjQ5MS4uMjg2Y2JmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKICMKLSMgUmVuZXNhcyBVU0IgQ29udHJvbGxlciBEcml2ZXJzCisjIFJlbmVzYXMgVVNCSFMgQ29udHJvbGxlciBEcml2ZXJzCiAjCiAKIGNvbmZpZyBVU0JfUkVORVNBU19VU0JIUwpAQCAtNywxMCArNyw5IEBACiAJZGVwZW5kcyBvbiBTVVBFUkggfHwgQVJDSF9TSE1PQklMRQogCWRlZmF1bHQgbgogCWhlbHAKLQkgICBSZW5lc2FzIFVTQkhTIGlzIGEgZGlzY3JldGUgVVNCIGhvc3QgYW5kIHBlcmlwaGVyYWwgY29udHJvbGxlciBjaGlwCi0JICAgdGhhdCBzdXBwb3J0cyBib3RoIGZ1bGwgYW5kIGhpZ2ggc3BlZWQgVVNCIDIuMCBkYXRhIHRyYW5zZmVycy4KLQkgICBJdCBoYXMgbmluZSBvciBtb3JlIGNvbmZpZ3VyYWJsZSBlbmRwb2ludHMsIGFuZCBlbmRwb2ludCB6ZXJvLgorCSAgUmVuZXNhcyBVU0JIUyBpcyBhIGRpc2NyZXRlIFVTQiBob3N0IGFuZCBwZXJpcGhlcmFsIGNvbnRyb2xsZXIgY2hpcAorCSAgdGhhdCBzdXBwb3J0cyBib3RoIGZ1bGwgYW5kIGhpZ2ggc3BlZWQgVVNCIDIuMCBkYXRhIHRyYW5zZmVycy4KKwkgIEl0IGhhcyBuaW5lIG9yIG1vcmUgY29uZmlndXJhYmxlIGVuZHBvaW50cywgYW5kIGVuZHBvaW50IHplcm8uCiAKLQkgICBTYXkgInkiIHRvIGxpbmsgdGhlIGRyaXZlciBzdGF0aWNhbGx5LCBvciAibSIgdG8gYnVpbGQgYQotCSAgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJyZW5lc2FzX3VzYmhzIiBhbmQgZm9yY2UgYWxsCi0JICAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCisJICBTYXkgInkiIHRvIGxpbmsgdGhlIGRyaXZlciBzdGF0aWNhbGx5LCBvciAibSIgdG8gYnVpbGQgYQorCSAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgInJlbmVzYXNfdXNiaHMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL01ha2VmaWxlIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9NYWtlZmlsZQppbmRleCBiODc5OGFkLi5jZTA4MzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvTWFrZWZpbGUKQEAgLTQsNiArNCw2IEBACiAKIG9iai0kKENPTkZJR19VU0JfUkVORVNBU19VU0JIUykJKz0gcmVuZXNhc191c2Jocy5vCiAKLXJlbmVzYXNfdXNiaHMteQkJCTo9IGNvbW1vbi5vIG1vZC5vIHBpcGUubworcmVuZXNhc191c2Jocy15CQkJOj0gY29tbW9uLm8gbW9kLm8gcGlwZS5vIGZpZm8ubwogCiByZW5lc2FzX3VzYmhzLSQoQ09ORklHX1VTQl9SRU5FU0FTX1VTQkhTX1VEQykJKz0gbW9kX2dhZGdldC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2NvbW1vbi5jIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9jb21tb24uYwppbmRleCBmMzY2NGQ2Li5kODIzOWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvY29tbW9uLmMKQEAgLTIxLDYgKzIxLDI5IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlICIuL2NvbW1vbi5oIgogCisvKgorICoJCWltYWdlIG9mIHJlbmVzYXNfdXNiaHMKKyAqCisgKiBleCkgZ2FkZ2V0IGNhc2UKKworICogbW9kLmMKKyAqIG1vZF9nYWRnZXQuYworICogbW9kX2hvc3QuYwkJcGlwZS5jCQlmaWZvLmMKKyAqCisgKgkJCSstLS0tLS0tKwkrLS0tLS0tLS0tLS0rCisgKgkJCXwgcGlwZTAgfC0tLS0tLT58IGZpZm8gcGlvICB8CisgKiArLS0tLS0tLS0tLS0tKwkrLS0tLS0tLSsJKy0tLS0tLS0tLS0tKworICogfCBtb2RfZ2FkZ2V0IHw9PT09PT4gfCBwaXBlMSB8LS0rCisgKiArLS0tLS0tLS0tLS0tKwkrLS0tLS0tLSsgIHwJKy0tLS0tLS0tLS0tKworICoJCQl8IHBpcGUyIHwgIHwgICstfCBmaWZvIGRtYTAgfAorICogKy0tLS0tLS0tLS0tLSsJKy0tLS0tLS0rICB8ICB8CSstLS0tLS0tLS0tLSsKKyAqIHwgbW9kX2hvc3QgICB8CXwgcGlwZTMgfDwtfC0tKworICogKy0tLS0tLS0tLS0tLSsJKy0tLS0tLS0rICB8CSstLS0tLS0tLS0tLSsKKyAqCQkJfCAuLi4uICB8ICArLS0tPnwgZmlmbyBkbWExIHwKKyAqCQkJfCAuLi4uICB8CSstLS0tLS0tLS0tLSsKKyAqLworCisKICNkZWZpbmUgVVNCSFNGX1JVTlRJTUVfUFdDVFJMCSgxIDw8IDApCiAKIC8qIHN0YXR1cyAqLwpAQCAtMzA0LDYgKzMyNyw4IEBACiAJCXByaXYtPmRwYXJhbS0+cGlwZV90eXBlID0gdXNiaHNjX2RlZmF1bHRfcGlwZV90eXBlOwogCQlwcml2LT5kcGFyYW0tPnBpcGVfc2l6ZSA9IEFSUkFZX1NJWkUodXNiaHNjX2RlZmF1bHRfcGlwZV90eXBlKTsKIAl9CisJaWYgKCFwcml2LT5kcGFyYW0tPnBpb19kbWFfYm9yZGVyKQorCQlwcml2LT5kcGFyYW0tPnBpb19kbWFfYm9yZGVyID0gNjQ7IC8qIDY0Ynl0ZSAqLwogCiAJLyogRklYTUUgKi8KIAkvKiBydW50aW1lIHBvd2VyIGNvbnRyb2wgPyAqLwpAQCAtMzIzLDEwICszNDgsMTQgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBwcm9iZV9lbmRfaW91bm1hcDsKIAotCXJldCA9IHVzYmhzX21vZF9wcm9iZShwcml2KTsKKwlyZXQgPSB1c2Joc19maWZvX3Byb2JlKHByaXYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIHByb2JlX2VuZF9waXBlX2V4aXQ7CiAKKwlyZXQgPSB1c2Joc19tb2RfcHJvYmUocHJpdik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcHJvYmVfZW5kX2ZpZm9fZXhpdDsKKwogCS8qIGRldl9zZXRfZHJ2ZGF0YSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHVzYmhzX21vZF9pbml0ICovCiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIHByaXYpOwogCkBAIC0zNzQsNiArNDAzLDggQEAKIAl1c2Joc19wbGF0Zm9ybV9jYWxsKHByaXYsIGhhcmR3YXJlX2V4aXQsIHBkZXYpOwogcHJvYmVfZW5kX21vZF9leGl0OgogCXVzYmhzX21vZF9yZW1vdmUocHJpdik7Citwcm9iZV9lbmRfZmlmb19leGl0OgorCXVzYmhzX2ZpZm9fcmVtb3ZlKHByaXYpOwogcHJvYmVfZW5kX3BpcGVfZXhpdDoKIAl1c2Joc19waXBlX3JlbW92ZShwcml2KTsKIHByb2JlX2VuZF9pb3VubWFwOgpAQCAtNDA0LDYgKzQzNSw3IEBACiAKIAl1c2Joc19wbGF0Zm9ybV9jYWxsKHByaXYsIGhhcmR3YXJlX2V4aXQsIHBkZXYpOwogCXVzYmhzX21vZF9yZW1vdmUocHJpdik7CisJdXNiaHNfZmlmb19yZW1vdmUocHJpdik7CiAJdXNiaHNfcGlwZV9yZW1vdmUocHJpdik7CiAJaW91bm1hcChwcml2LT5iYXNlKTsKIAlrZnJlZShwcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvY29tbW9uLmggYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2NvbW1vbi5oCmluZGV4IDBhYWRjYjQuLmI0MTA0NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvY29tbW9uLmgKKysrIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9jb21tb24uaApAQCAtMzYsNiArMzYsMTIgQEAKICNkZWZpbmUgQ0ZJRk8JCTB4MDAxNAogI2RlZmluZSBDRklGT1NFTAkweDAwMjAKICNkZWZpbmUgQ0ZJRk9DVFIJMHgwMDIyCisjZGVmaW5lIEQwRklGTwkJMHgwMTAwCisjZGVmaW5lIEQwRklGT1NFTAkweDAwMjgKKyNkZWZpbmUgRDBGSUZPQ1RSCTB4MDAyQQorI2RlZmluZSBEMUZJRk8JCTB4MDEyMAorI2RlZmluZSBEMUZJRk9TRUwJMHgwMDJDCisjZGVmaW5lIEQxRklGT0NUUgkweDAwMkUKICNkZWZpbmUgSU5URU5CMAkJMHgwMDMwCiAjZGVmaW5lIElOVEVOQjEJCTB4MDAzMgogI2RlZmluZSBCUkRZRU5CCQkweDAwMzYKQEAgLTYwLDYgKzY2LDMwIEBACiAjZGVmaW5lIFBJUEVNQVhQCTB4MDA2QwogI2RlZmluZSBQSVBFUEVSSQkweDAwNkUKICNkZWZpbmUgUElQRW5DVFIJMHgwMDcwCisjZGVmaW5lIFBJUEUxVFJFCTB4MDA5MAorI2RlZmluZSBQSVBFMVRSTgkweDAwOTIKKyNkZWZpbmUgUElQRTJUUkUJMHgwMDk0CisjZGVmaW5lIFBJUEUyVFJOCTB4MDA5NgorI2RlZmluZSBQSVBFM1RSRQkweDAwOTgKKyNkZWZpbmUgUElQRTNUUk4JMHgwMDlBCisjZGVmaW5lIFBJUEU0VFJFCTB4MDA5QworI2RlZmluZSBQSVBFNFRSTgkweDAwOUUKKyNkZWZpbmUgUElQRTVUUkUJMHgwMEEwCisjZGVmaW5lIFBJUEU1VFJOCTB4MDBBMgorI2RlZmluZSBQSVBFQlRSRQkweDAwQTQKKyNkZWZpbmUgUElQRUJUUk4JMHgwMEE2CisjZGVmaW5lIFBJUEVDVFJFCTB4MDBBOAorI2RlZmluZSBQSVBFQ1RSTgkweDAwQUEKKyNkZWZpbmUgUElQRURUUkUJMHgwMEFDCisjZGVmaW5lIFBJUEVEVFJOCTB4MDBBRQorI2RlZmluZSBQSVBFRVRSRQkweDAwQjAKKyNkZWZpbmUgUElQRUVUUk4JMHgwMEIyCisjZGVmaW5lIFBJUEVGVFJFCTB4MDBCNAorI2RlZmluZSBQSVBFRlRSTgkweDAwQjYKKyNkZWZpbmUgUElQRTlUUkUJMHgwMEI4CisjZGVmaW5lIFBJUEU5VFJOCTB4MDBCQQorI2RlZmluZSBQSVBFQVRSRQkweDAwQkMKKyNkZWZpbmUgUElQRUFUUk4JMHgwMEJFCiAKIC8qIFNZU0NGRyAqLwogI2RlZmluZSBTQ0tFCSgxIDw8IDEwKQkvKiBVU0IgTW9kdWxlIENsb2NrIEVuYWJsZSAqLwpAQCAtNzgsNiArMTA4LDcgQEAKICNkZWZpbmUgIFJIU1RfSElHSF9TUEVFRCAzCS8qIEhpZ2gtc3BlZWQgY29ubmVjdGlvbiAqLwogCiAvKiBDRklGT1NFTCAqLworI2RlZmluZSBEUkVRRQkoMSA8PCAxMikJLyogRE1BIFRyYW5zZmVyIFJlcXVlc3QgRW5hYmxlICovCiAjZGVmaW5lIE1CV18zMgkoMHgyIDw8IDEwKQkvKiBDRklGTyBQb3J0IEFjY2VzcyBCaXQgV2lkdGggKi8KIAogLyogQ0ZJRk9DVFIgKi8KQEAgLTE2NCw2ICsxOTUsMTAgQEAKIAogI2RlZmluZSBDQ1BMCQkoMSA8PCAyKQkvKiBDb250cm9sIFRyYW5zZmVyIEVuZCBFbmFibGUgKi8KIAorLyogUElQRW5UUkUgKi8KKyNkZWZpbmUgVFJFTkIJCSgxIDw8IDkpCS8qIFRyYW5zYWN0aW9uIENvdW50ZXIgRW5hYmxlICovCisjZGVmaW5lIFRSQ0xSCQkoMSA8PCA4KQkvKiBUcmFuc2FjdGlvbiBDb3VudGVyIENsZWFyICovCisKIC8qIEZSTU5VTSAqLwogI2RlZmluZSBGUk5NX01BU0sJKDB4N0ZGKQogCkBAIC0xOTQsNiArMjI5LDExIEBACiAJICogcGlwZSBjb250cm9sCiAJICovCiAJc3RydWN0IHVzYmhzX3BpcGVfaW5mbyBwaXBlX2luZm87CisKKwkvKgorCSAqIGZpZm8gY29udHJvbAorCSAqLworCXN0cnVjdCB1c2Joc19maWZvX2luZm8gZmlmb19pbmZvOwogfTsKIAogLyoKQEAgLTIwNCw2ICsyNDQsMTAgQEAKIHZvaWQgdXNiaHNfYnNldChzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTE2IG1hc2ssIHUxNiBkYXRhKTsKIAogaW50IHVzYmhzY19kcnZjbGxiY2tfbm90aWZ5X2hvdHBsdWcoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisKKyNkZWZpbmUgdXNiaHNfbG9jayhwLCBmKSBzcGluX2xvY2tfaXJxc2F2ZSh1c2Joc19wcml2X3RvX2xvY2socCksIGYpCisjZGVmaW5lIHVzYmhzX3VubG9jayhwLCBmKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKHVzYmhzX3ByaXZfdG9fbG9jayhwKSwgZikKKwogLyoKICAqIHN5c2NvbmZpZwogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2ZpZm8uYyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvZmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjg5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2ZpZm8uYwpAQCAtMCwwICsxLDEwMTUgQEAKKy8qCisgKiBSZW5lc2FzIFVTQiBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqIEt1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSAiLi9jb21tb24uaCIKKyNpbmNsdWRlICIuL3BpcGUuaCIKKworI2RlZmluZSB1c2Joc2ZfZ2V0X2NmaWZvKHApCSgmKChwKS0+Zmlmb19pbmZvLmNmaWZvKSkKKyNkZWZpbmUgdXNiaHNmX2dldF9kMGZpZm8ocCkJKCYoKHApLT5maWZvX2luZm8uZDBmaWZvKSkKKyNkZWZpbmUgdXNiaHNmX2dldF9kMWZpZm8ocCkJKCYoKHApLT5maWZvX2luZm8uZDFmaWZvKSkKKworI2RlZmluZSB1c2Joc2ZfZmlmb19pc19idXN5KGYpCSgoZiktPnBpcGUpIC8qIHNlZSB1c2Joc19waXBlX3NlbGVjdF9maWZvICovCisKKy8qCisgKgkJcGFja2V0IGluaXRpYWxpemUKKyAqLwordm9pZCB1c2Joc19wa3RfaW5pdChzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QpCit7CisJcGt0LT5kbWEgPSBETUFfQUREUl9JTlZBTElEOworCUlOSVRfTElTVF9IRUFEKCZwa3QtPm5vZGUpOworfQorCisvKgorICoJCXBhY2tldCBjb250cm9sIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyBpbnQgdXNiaHNmX251bGxfaGFuZGxlKHN0cnVjdCB1c2Joc19wa3QgKnBrdCwgaW50ICppc19kb25lKQoreworCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNfcGlwZV90b19wcml2KHBrdC0+cGlwZSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNfcHJpdl90b19kZXYocHJpdik7CisKKwlkZXZfZXJyKGRldiwgIm51bGwgaGFuZGxlclxuIik7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCB1c2Joc19wa3RfaGFuZGxlIHVzYmhzZl9udWxsX2hhbmRsZXIgPSB7CisJLnByZXBhcmUgPSB1c2Joc2ZfbnVsbF9oYW5kbGUsCisJLnRyeV9ydW4gPSB1c2Joc2ZfbnVsbF9oYW5kbGUsCit9OworCit2b2lkIHVzYmhzX3BrdF9wdXNoKHN0cnVjdCB1c2Joc19waXBlICpwaXBlLCBzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QsCisJCSAgICBzdHJ1Y3QgdXNiaHNfcGt0X2hhbmRsZSAqaGFuZGxlciwKKwkJICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IHplcm8pCit7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGlwZSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNfcHJpdl90b19kZXYocHJpdik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiBsb2NrICoqKioqKioqKioqKioqKioqKioqLworCXVzYmhzX2xvY2socHJpdiwgZmxhZ3MpOworCisJaWYgKCFoYW5kbGVyKSB7CisJCWRldl9lcnIoZGV2LCAibm8gaGFuZGxlciBmdW5jdGlvblxuIik7CisJCWhhbmRsZXIgPSAmdXNiaHNmX251bGxfaGFuZGxlcjsKKwl9CisKKwlsaXN0X2RlbF9pbml0KCZwa3QtPm5vZGUpOworCWxpc3RfYWRkX3RhaWwoJnBrdC0+bm9kZSwgJnBpcGUtPmxpc3QpOworCisJcGt0LT5waXBlCT0gcGlwZTsKKwlwa3QtPmJ1Zgk9IGJ1ZjsKKwlwa3QtPmhhbmRsZXIJPSBoYW5kbGVyOworCXBrdC0+bGVuZ3RoCT0gbGVuOworCXBrdC0+emVybwk9IHplcm87CisJcGt0LT5hY3R1YWwJPSAwOworCisJdXNiaHNfdW5sb2NrKHByaXYsIGZsYWdzKTsKKwkvKioqKioqKioqKioqKioqKioqKiogIHNwaW4gdW5sb2NrICoqKioqKioqKioqKioqKioqKi8KKworCXVzYmhzX3BrdF9zdGFydChwaXBlKTsKK30KKworc3RhdGljIHZvaWQgX191c2Joc2ZfcGt0X2RlbChzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QpCit7CisJbGlzdF9kZWxfaW5pdCgmcGt0LT5ub2RlKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2Joc19wa3QgKl9fdXNiaHNmX3BrdF9nZXQoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUpCit7CisJaWYgKGxpc3RfZW1wdHkoJnBpcGUtPmxpc3QpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBsaXN0X2VudHJ5KHBpcGUtPmxpc3QubmV4dCwgc3RydWN0IHVzYmhzX3BrdCwgbm9kZSk7Cit9CisKK3N0cnVjdCB1c2Joc19wa3QgKnVzYmhzX3BrdF9wb3Aoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsIHN0cnVjdCB1c2Joc19wa3QgKnBrdCkKK3sKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzX3BpcGVfdG9fcHJpdihwaXBlKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoqKioqKioqKioqKioqKioqKioqICBzcGluIGxvY2sgKioqKioqKioqKioqKioqKioqKiovCisJdXNiaHNfbG9jayhwcml2LCBmbGFncyk7CisKKwlpZiAoIXBrdCkKKwkJcGt0ID0gX191c2Joc2ZfcGt0X2dldChwaXBlKTsKKworCWlmIChwa3QpCisJCV9fdXNiaHNmX3BrdF9kZWwocGt0KTsKKworCXVzYmhzX3VubG9jayhwcml2LCBmbGFncyk7CisJLyoqKioqKioqKioqKioqKioqKioqICBzcGluIHVubG9jayAqKioqKioqKioqKioqKioqKiovCisKKwlyZXR1cm4gcGt0OworfQorCitpbnQgX191c2Joc19wa3RfaGFuZGxlcihzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSwgaW50IHR5cGUpCit7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGlwZSk7CisJc3RydWN0IHVzYmhzX3BpcGVfaW5mbyAqaW5mbyA9IHVzYmhzX3ByaXZfdG9fcGlwZWluZm8ocHJpdik7CisJc3RydWN0IHVzYmhzX3BrdCAqcGt0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVzYmhzX3ByaXZfdG9fZGV2KHByaXYpOworCWludCAoKmZ1bmMpKHN0cnVjdCB1c2Joc19wa3QgKnBrdCwgaW50ICppc19kb25lKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCWludCBpc19kb25lID0gMDsKKworCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiBsb2NrICoqKioqKioqKioqKioqKioqKioqLworCXVzYmhzX2xvY2socHJpdiwgZmxhZ3MpOworCisJcGt0ID0gX191c2Joc2ZfcGt0X2dldChwaXBlKTsKKwlpZiAoIXBrdCkKKwkJZ290byBfX3VzYmhzX3BrdF9oYW5kbGVyX2VuZDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgVVNCSFNGX1BLVF9QUkVQQVJFOgorCQlmdW5jID0gcGt0LT5oYW5kbGVyLT5wcmVwYXJlOworCQlicmVhazsKKwljYXNlIFVTQkhTRl9QS1RfVFJZX1JVTjoKKwkJZnVuYyA9IHBrdC0+aGFuZGxlci0+dHJ5X3J1bjsKKwkJYnJlYWs7CisJY2FzZSBVU0JIU0ZfUEtUX0RNQV9ET05FOgorCQlmdW5jID0gcGt0LT5oYW5kbGVyLT5kbWFfZG9uZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJ1bmtub3duIHBrdCBoYW5kZXJcbiIpOworCQlnb3RvIF9fdXNiaHNfcGt0X2hhbmRsZXJfZW5kOworCX0KKworCXJldCA9IGZ1bmMocGt0LCAmaXNfZG9uZSk7CisKKwlpZiAoaXNfZG9uZSkKKwkJX191c2Joc2ZfcGt0X2RlbChwa3QpOworCitfX3VzYmhzX3BrdF9oYW5kbGVyX2VuZDoKKwl1c2Joc191bmxvY2socHJpdiwgZmxhZ3MpOworCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiB1bmxvY2sgKioqKioqKioqKioqKioqKioqLworCisJaWYgKGlzX2RvbmUpIHsKKwkJaW5mby0+ZG9uZShwa3QpOworCQl1c2Joc19wa3Rfc3RhcnQocGlwZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqCQlpcnEgZW5hYmxlL2Rpc2FibGUgZnVuY3Rpb24KKyAqLworI2RlZmluZSB1c2Joc2ZfaXJxX2VtcHR5X2N0cmwocCwgZSkgdXNiaHNmX2lycV9jYWxsYmFja19jdHJsKHAsIGJlbXBzdHMsIGUpCisjZGVmaW5lIHVzYmhzZl9pcnFfcmVhZHlfY3RybChwLCBlKSB1c2Joc2ZfaXJxX2NhbGxiYWNrX2N0cmwocCwgYnJkeXN0cywgZSkKKyNkZWZpbmUgdXNiaHNmX2lycV9jYWxsYmFja19jdHJsKHBpcGUsIHN0YXR1cywgZW5hYmxlKQkJCVwKKwkoewkJCQkJCQkJXAorCQlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzX3BpcGVfdG9fcHJpdihwaXBlKTsJXAorCQlzdHJ1Y3QgdXNiaHNfbW9kICptb2QgPSB1c2Joc19tb2RfZ2V0X2N1cnJlbnQocHJpdik7CVwKKwkJdTE2IHN0YXR1cyA9ICgxIDw8IHVzYmhzX3BpcGVfbnVtYmVyKHBpcGUpKTsJCVwKKwkJaWYgKCFtb2QpCQkJCQkJXAorCQkJcmV0dXJuOwkJCQkJCVwKKwkJaWYgKGVuYWJsZSkJCQkJCQlcCisJCQltb2QtPmlycV8jI3N0YXR1cyB8PSBzdGF0dXM7CQkJXAorCQllbHNlCQkJCQkJCVwKKwkJCW1vZC0+aXJxXyMjc3RhdHVzICY9IH5zdGF0dXM7CQkJXAorCQl1c2Joc19pcnFfY2FsbGJhY2tfdXBkYXRlKHByaXYsIG1vZCk7CQkJXAorCX0pCisKK3N0YXRpYyB2b2lkIHVzYmhzZl90eF9pcnFfY3RybChzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSwgaW50IGVuYWJsZSkKK3sKKwkvKgorCSAqIEFuZCBEQ1AgcGlwZSBjYW4gTk9UIHVzZSAicmVhZHkgaW50ZXJydXB0IiBmb3IgInNlbmQiCisJICogaXQgc2hvdWxkIHVzZSAiZW1wdHkiIGludGVycnVwdC4KKwkgKiBzZWUKKwkgKiAgICJPcGVyYXRpb24iIC0gIkludGVycnVwdCBGdW5jdGlvbiIgLSAiQlJEWSBJbnRlcnJ1cHQiCisJICoKKwkgKiBvbiB0aGUgb3RoZXIgaGFuZCwgbm9ybWFsIHBpcGUgY2FuIHVzZSAicmVhZHkgaW50ZXJydXB0IiBmb3IgInNlbmQiCisJICogZXZlbiB0aG91Z2ggaXQgaXMgc2luZ2xlL2RvdWJsZSBidWZmZXIKKwkgKi8KKwlpZiAodXNiaHNfcGlwZV9pc19kY3AocGlwZSkpCisJCXVzYmhzZl9pcnFfZW1wdHlfY3RybChwaXBlLCBlbmFibGUpOworCWVsc2UKKwkJdXNiaHNmX2lycV9yZWFkeV9jdHJsKHBpcGUsIGVuYWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmhzZl9yeF9pcnFfY3RybChzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSwgaW50IGVuYWJsZSkKK3sKKwl1c2Joc2ZfaXJxX3JlYWR5X2N0cmwocGlwZSwgZW5hYmxlKTsKK30KKworLyoKKyAqCQlGSUZPIGN0cmwKKyAqLworc3RhdGljIHZvaWQgdXNiaHNmX3NlbmRfdGVybWluYXRvcihzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSwKKwkJCQkgICBzdHJ1Y3QgdXNiaHNfZmlmbyAqZmlmbykKK3sKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzX3BpcGVfdG9fcHJpdihwaXBlKTsKKworCXVzYmhzX2JzZXQocHJpdiwgZmlmby0+Y3RyLCBCVkFMLCBCVkFMKTsKK30KKworc3RhdGljIGludCB1c2Joc2ZfZmlmb19iYXJyaWVyKHN0cnVjdCB1c2Joc19wcml2ICpwcml2LAorCQkJICAgICAgIHN0cnVjdCB1c2Joc19maWZvICpmaWZvKQoreworCWludCB0aW1lb3V0ID0gMTAyNDsKKworCWRvIHsKKwkJLyogVGhlIEZJRk8gcG9ydCBpcyBhY2Nlc3NpYmxlICovCisJCWlmICh1c2Joc19yZWFkKHByaXYsIGZpZm8tPmN0cikgJiBGUkRZKQorCQkJcmV0dXJuIDA7CisKKwkJdWRlbGF5KDEwKTsKKwl9IHdoaWxlICh0aW1lb3V0LS0pOworCisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIHZvaWQgdXNiaHNmX2ZpZm9fY2xlYXIoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsCisJCQkgICAgICBzdHJ1Y3QgdXNiaHNfZmlmbyAqZmlmbykKK3sKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzX3BpcGVfdG9fcHJpdihwaXBlKTsKKworCWlmICghdXNiaHNfcGlwZV9pc19kY3AocGlwZSkpCisJCXVzYmhzZl9maWZvX2JhcnJpZXIocHJpdiwgZmlmbyk7CisKKwl1c2Joc193cml0ZShwcml2LCBmaWZvLT5jdHIsIEJDTFIpOworfQorCitzdGF0aWMgaW50IHVzYmhzZl9maWZvX3Jjdl9sZW4oc3RydWN0IHVzYmhzX3ByaXYgKnByaXYsCisJCQkgICAgICAgc3RydWN0IHVzYmhzX2ZpZm8gKmZpZm8pCit7CisJcmV0dXJuIHVzYmhzX3JlYWQocHJpdiwgZmlmby0+Y3RyKSAmIERUTE5fTUFTSzsKK30KKworc3RhdGljIHZvaWQgdXNiaHNmX2ZpZm9fdW5zZWxlY3Qoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsCisJCQkJIHN0cnVjdCB1c2Joc19maWZvICpmaWZvKQoreworCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNfcGlwZV90b19wcml2KHBpcGUpOworCisJdXNiaHNfcGlwZV9zZWxlY3RfZmlmbyhwaXBlLCBOVUxMKTsKKwl1c2Joc193cml0ZShwcml2LCBmaWZvLT5zZWwsIDApOworfQorCitzdGF0aWMgaW50IHVzYmhzZl9maWZvX3NlbGVjdChzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSwKKwkJCSAgICAgIHN0cnVjdCB1c2Joc19maWZvICpmaWZvLAorCQkJICAgICAgaW50IHdyaXRlKQoreworCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNfcGlwZV90b19wcml2KHBpcGUpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVzYmhzX3ByaXZfdG9fZGV2KHByaXYpOworCWludCB0aW1lb3V0ID0gMTAyNDsKKwl1MTYgbWFzayA9ICgoMSA8PCA1KSB8IDB4Rik7CQkvKiBtYXNrIG9mIElTRUwgfCBDVVJQSVBFICovCisJdTE2IGJhc2UgPSB1c2Joc19waXBlX251bWJlcihwaXBlKTsJLyogQ1VSUElQRSAqLworCisJaWYgKHVzYmhzX3BpcGVfaXNfYnVzeShwaXBlKSB8fAorCSAgICB1c2Joc2ZfZmlmb19pc19idXN5KGZpZm8pKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHVzYmhzX3BpcGVfaXNfZGNwKHBpcGUpKQorCQliYXNlIHw9ICgxID09IHdyaXRlKSA8PCA1OwkvKiBJU0VMICovCisKKwkvKiAiYmFzZSIgd2lsbCBiZSB1c2VkIGJlbG93ICAqLworCXVzYmhzX3dyaXRlKHByaXYsIGZpZm8tPnNlbCwgYmFzZSB8IE1CV18zMik7CisKKwkvKiBjaGVjayBJU0VMIGFuZCBDVVJQSVBFIHZhbHVlICovCisJd2hpbGUgKHRpbWVvdXQtLSkgeworCQlpZiAoYmFzZSA9PSAobWFzayAmIHVzYmhzX3JlYWQocHJpdiwgZmlmby0+c2VsKSkpIHsKKwkJCXVzYmhzX3BpcGVfc2VsZWN0X2ZpZm8ocGlwZSwgZmlmbyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl1ZGVsYXkoMTApOworCX0KKworCWRldl9lcnIoZGV2LCAiZmlmbyBzZWxlY3QgZXJyb3JcbiIpOworCisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKgkJUElPIHB1c2ggaGFuZGxlcgorICovCitzdGF0aWMgaW50IHVzYmhzZl9waW9fdHJ5X3B1c2goc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgKmlzX2RvbmUpCit7CisJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSBwa3QtPnBpcGU7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGlwZSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNfcHJpdl90b19kZXYocHJpdik7CisJc3RydWN0IHVzYmhzX2ZpZm8gKmZpZm8gPSB1c2Joc2ZfZ2V0X2NmaWZvKHByaXYpOyAvKiBDRklGTyAqLworCXZvaWQgX19pb21lbSAqYWRkciA9IHByaXYtPmJhc2UgKyBmaWZvLT5wb3J0OworCXU4ICpidWY7CisJaW50IG1heHAgPSB1c2Joc19waXBlX2dldF9tYXhwYWNrZXQocGlwZSk7CisJaW50IHRvdGFsX2xlbjsKKwlpbnQgaSwgcmV0LCBsZW47CisJaW50IGlzX3Nob3J0OworCisJcmV0ID0gdXNiaHNmX2ZpZm9fc2VsZWN0KHBpcGUsIGZpZm8sIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHVzYmhzX3BpcGVfaXNfYWNjZXNzaWJsZShwaXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKiBpbmFjY2Vzc2libGUgcGlwZSBpcyBub3QgYW4gZXJyb3IgKi8KKwkJcmV0ID0gMDsKKwkJZ290byB1c2Joc19maWZvX3dyaXRlX2J1c3k7CisJfQorCisJcmV0ID0gdXNiaHNmX2ZpZm9fYmFycmllcihwcml2LCBmaWZvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byB1c2Joc19maWZvX3dyaXRlX2J1c3k7CisKKwlidWYJCT0gcGt0LT5idWYgICAgKyBwa3QtPmFjdHVhbDsKKwlsZW4JCT0gcGt0LT5sZW5ndGggLSBwa3QtPmFjdHVhbDsKKwlsZW4JCT0gbWluKGxlbiwgbWF4cCk7CisJdG90YWxfbGVuCT0gbGVuOworCWlzX3Nob3J0CT0gdG90YWxfbGVuIDwgbWF4cDsKKworCS8qCisJICogRklYTUUKKwkgKgorCSAqIDMyLWJpdCBhY2Nlc3Mgb25seQorCSAqLworCWlmIChsZW4gPj0gNCAmJiAhKCh1bnNpZ25lZCBsb25nKWJ1ZiAmIDB4MDMpKSB7CisJCWlvd3JpdGUzMl9yZXAoYWRkciwgYnVmLCBsZW4gLyA0KTsKKwkJbGVuICU9IDQ7CisJCWJ1ZiArPSB0b3RhbF9sZW4gLSBsZW47CisJfQorCisJLyogdGhlIHJlc3Qgb3BlcmF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlpb3dyaXRlOChidWZbaV0sIGFkZHIgKyAoMHgwMyAtIChpICYgMHgwMykpKTsKKworCS8qCisJICogdmFyaWFibGUgdXBkYXRlCisJICovCisJcGt0LT5hY3R1YWwgKz0gdG90YWxfbGVuOworCisJaWYgKHBrdC0+YWN0dWFsIDwgcGt0LT5sZW5ndGgpCisJCSppc19kb25lID0gMDsJCS8qIHRoZXJlIGFyZSByZW1haW5kZXIgZGF0YSAqLworCWVsc2UgaWYgKGlzX3Nob3J0KQorCQkqaXNfZG9uZSA9IDE7CQkvKiBzaG9ydCBwYWNrZXQgKi8KKwllbHNlCisJCSppc19kb25lID0gIXBrdC0+emVybzsJLyogc2VuZCB6ZXJvIHBhY2tldCA/ICovCisKKwkvKgorCSAqIHBpcGUvaXJxIGhhbmRsaW5nCisJICovCisJaWYgKGlzX3Nob3J0KQorCQl1c2Joc2Zfc2VuZF90ZXJtaW5hdG9yKHBpcGUsIGZpZm8pOworCisJdXNiaHNmX3R4X2lycV9jdHJsKHBpcGUsICEqaXNfZG9uZSk7CisJdXNiaHNfcGlwZV9lbmFibGUocGlwZSk7CisKKwlkZXZfZGJnKGRldiwgIiAgc2VuZCAlZCAoJWQvICVkLyAlZC8gJWQpXG4iLAorCQl1c2Joc19waXBlX251bWJlcihwaXBlKSwKKwkJcGt0LT5sZW5ndGgsIHBrdC0+YWN0dWFsLCAqaXNfZG9uZSwgcGt0LT56ZXJvKTsKKworCS8qCisJICogVHJhbnNtaXNzaW9uIGVuZAorCSAqLworCWlmICgqaXNfZG9uZSkgeworCQlpZiAodXNiaHNfcGlwZV9pc19kY3AocGlwZSkpCisJCQl1c2Joc19kY3BfY29udHJvbF90cmFuc2Zlcl9kb25lKHBpcGUpOworCX0KKworCXVzYmhzZl9maWZvX3Vuc2VsZWN0KHBpcGUsIGZpZm8pOworCisJcmV0dXJuIDA7CisKK3VzYmhzX2ZpZm9fd3JpdGVfYnVzeToKKwl1c2Joc2ZfZmlmb191bnNlbGVjdChwaXBlLCBmaWZvKTsKKworCS8qCisJICogcGlwZSBpcyBidXN5LgorCSAqIHJldHJ5IGluIGludGVycnVwdAorCSAqLworCXVzYmhzZl90eF9pcnFfY3RybChwaXBlLCAxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCB1c2Joc19wa3RfaGFuZGxlIHVzYmhzX2ZpZm9fcGlvX3B1c2hfaGFuZGxlciA9IHsKKwkucHJlcGFyZSA9IHVzYmhzZl9waW9fdHJ5X3B1c2gsCisJLnRyeV9ydW4gPSB1c2Joc2ZfcGlvX3RyeV9wdXNoLAorfTsKKworLyoKKyAqCQlQSU8gcG9wIGhhbmRsZXIKKyAqLworc3RhdGljIGludCB1c2Joc2ZfcHJlcGFyZV9wb3Aoc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgKmlzX2RvbmUpCit7CisJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSBwa3QtPnBpcGU7CisKKwlpZiAodXNiaHNfcGlwZV9pc19idXN5KHBpcGUpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogcGlwZSBlbmFibGUgdG8gcHJlcGFyZSBwYWNrZXQgcmVjZWl2ZQorCSAqLworCisJdXNiaHNfcGlwZV9lbmFibGUocGlwZSk7CisJdXNiaHNmX3J4X2lycV9jdHJsKHBpcGUsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiaHNmX3Bpb190cnlfcG9wKHN0cnVjdCB1c2Joc19wa3QgKnBrdCwgaW50ICppc19kb25lKQoreworCXN0cnVjdCB1c2Joc19waXBlICpwaXBlID0gcGt0LT5waXBlOworCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNfcGlwZV90b19wcml2KHBpcGUpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVzYmhzX3ByaXZfdG9fZGV2KHByaXYpOworCXN0cnVjdCB1c2Joc19maWZvICpmaWZvID0gdXNiaHNmX2dldF9jZmlmbyhwcml2KTsgLyogQ0ZJRk8gKi8KKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBwcml2LT5iYXNlICsgZmlmby0+cG9ydDsKKwl1OCAqYnVmOworCXUzMiBkYXRhID0gMDsKKwlpbnQgbWF4cCA9IHVzYmhzX3BpcGVfZ2V0X21heHBhY2tldChwaXBlKTsKKwlpbnQgcmN2X2xlbiwgbGVuOworCWludCBpLCByZXQ7CisJaW50IHRvdGFsX2xlbiA9IDA7CisKKwlyZXQgPSB1c2Joc2ZfZmlmb19zZWxlY3QocGlwZSwgZmlmbywgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAwOworCisJcmV0ID0gdXNiaHNmX2ZpZm9fYmFycmllcihwcml2LCBmaWZvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byB1c2Joc19maWZvX3JlYWRfYnVzeTsKKworCXJjdl9sZW4gPSB1c2Joc2ZfZmlmb19yY3ZfbGVuKHByaXYsIGZpZm8pOworCisJYnVmCQk9IHBrdC0+YnVmICAgICsgcGt0LT5hY3R1YWw7CisJbGVuCQk9IHBrdC0+bGVuZ3RoIC0gcGt0LT5hY3R1YWw7CisJbGVuCQk9IG1pbihsZW4sIHJjdl9sZW4pOworCXRvdGFsX2xlbgk9IGxlbjsKKworCS8qCisJICogQnVmZmVyIGNsZWFyIGlmIFplcm8tTGVuZ3RoIHBhY2tldAorCSAqCisJICogc2VlCisJICogIk9wZXJhdGlvbiIgLSAiRklGTyBCdWZmZXIgTWVtb3J5IiAtICJGSUZPIFBvcnQgRnVuY3Rpb24iCisJICovCisJaWYgKDAgPT0gcmN2X2xlbikgeworCQl1c2Joc2ZfZmlmb19jbGVhcihwaXBlLCBmaWZvKTsKKwkJZ290byB1c2Joc19maWZvX3JlYWRfZW5kOworCX0KKworCS8qCisJICogRklYTUUKKwkgKgorCSAqIDMyLWJpdCBhY2Nlc3Mgb25seQorCSAqLworCWlmIChsZW4gPj0gNCAmJiAhKCh1bnNpZ25lZCBsb25nKWJ1ZiAmIDB4MDMpKSB7CisJCWlvcmVhZDMyX3JlcChhZGRyLCBidWYsIGxlbiAvIDQpOworCQlsZW4gJT0gNDsKKwkJYnVmICs9IHRvdGFsX2xlbiAtIGxlbjsKKwl9CisKKwkvKiB0aGUgcmVzdCBvcGVyYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKCEoaSAmIDB4MDMpKQorCQkJZGF0YSA9IGlvcmVhZDMyKGFkZHIpOworCisJCWJ1ZltpXSA9IChkYXRhID4+ICgoaSAmIDB4MDMpICogOCkpICYgMHhmZjsKKwl9CisKKwlwa3QtPmFjdHVhbCArPSB0b3RhbF9sZW47CisKK3VzYmhzX2ZpZm9fcmVhZF9lbmQ6CisJaWYgKChwa3QtPmFjdHVhbCA9PSBwa3QtPmxlbmd0aCkgfHwJLyogcmVjZWl2ZSBhbGwgZGF0YSAqLworCSAgICAodG90YWxfbGVuIDwgbWF4cCkpIHsJCS8qIHNob3J0IHBhY2tldCAqLworCQkqaXNfZG9uZSA9IDE7CisJCXVzYmhzZl9yeF9pcnFfY3RybChwaXBlLCAwKTsKKwkJdXNiaHNfcGlwZV9kaXNhYmxlKHBpcGUpOworCX0KKworCWRldl9kYmcoZGV2LCAiICByZWN2ICVkICglZC8gJWQvICVkLyAlZClcbiIsCisJCXVzYmhzX3BpcGVfbnVtYmVyKHBpcGUpLAorCQlwa3QtPmxlbmd0aCwgcGt0LT5hY3R1YWwsICppc19kb25lLCBwa3QtPnplcm8pOworCit1c2Joc19maWZvX3JlYWRfYnVzeToKKwl1c2Joc2ZfZmlmb191bnNlbGVjdChwaXBlLCBmaWZvKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCB1c2Joc19wa3RfaGFuZGxlIHVzYmhzX2ZpZm9fcGlvX3BvcF9oYW5kbGVyID0geworCS5wcmVwYXJlID0gdXNiaHNmX3ByZXBhcmVfcG9wLAorCS50cnlfcnVuID0gdXNiaHNmX3Bpb190cnlfcG9wLAorfTsKKworLyoKKyAqCQlEQ1AgY3Ryb2wgc3RhdGdlIGhhbmRsZXIKKyAqLworc3RhdGljIGludCB1c2Joc2ZfY3RybF9zdGFnZV9lbmQoc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgKmlzX2RvbmUpCit7CisJdXNiaHNfZGNwX2NvbnRyb2xfdHJhbnNmZXJfZG9uZShwa3QtPnBpcGUpOworCisJKmlzX2RvbmUgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB1c2Joc19wa3RfaGFuZGxlIHVzYmhzX2N0cmxfc3RhZ2VfZW5kX2hhbmRsZXIgPSB7CisJLnByZXBhcmUgPSB1c2Joc2ZfY3RybF9zdGFnZV9lbmQsCisJLnRyeV9ydW4gPSB1c2Joc2ZfY3RybF9zdGFnZV9lbmQsCit9OworCisvKgorICoJCURNQSBmaWZvIGZ1bmN0aW9ucworICovCitzdGF0aWMgc3RydWN0IGRtYV9jaGFuICp1c2Joc2ZfZG1hX2NoYW5fZ2V0KHN0cnVjdCB1c2Joc19maWZvICpmaWZvLAorCQkJCQkgICAgc3RydWN0IHVzYmhzX3BrdCAqcGt0KQoreworCWlmICgmdXNiaHNfZmlmb19kbWFfcHVzaF9oYW5kbGVyID09IHBrdC0+aGFuZGxlcikKKwkJcmV0dXJuIGZpZm8tPnR4X2NoYW47CisKKwlpZiAoJnVzYmhzX2ZpZm9fZG1hX3BvcF9oYW5kbGVyID09IHBrdC0+aGFuZGxlcikKKwkJcmV0dXJuIGZpZm8tPnJ4X2NoYW47CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB1c2Joc19maWZvICp1c2Joc2ZfZ2V0X2RtYV9maWZvKHN0cnVjdCB1c2Joc19wcml2ICpwcml2LAorCQkJCQkgICAgICBzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QpCit7CisJc3RydWN0IHVzYmhzX2ZpZm8gKmZpZm87CisKKwkvKiBETUEgOjogRDBGSUZPICovCisJZmlmbyA9IHVzYmhzZl9nZXRfZDBmaWZvKHByaXYpOworCWlmICh1c2Joc2ZfZG1hX2NoYW5fZ2V0KGZpZm8sIHBrdCkgJiYKKwkgICAgIXVzYmhzZl9maWZvX2lzX2J1c3koZmlmbykpCisJCXJldHVybiBmaWZvOworCisJLyogRE1BIDo6IEQxRklGTyAqLworCWZpZm8gPSB1c2Joc2ZfZ2V0X2QxZmlmbyhwcml2KTsKKwlpZiAodXNiaHNmX2RtYV9jaGFuX2dldChmaWZvLCBwa3QpICYmCisJICAgICF1c2Joc2ZfZmlmb19pc19idXN5KGZpZm8pKQorCQlyZXR1cm4gZmlmbzsKKworCXJldHVybiBOVUxMOworfQorCisjZGVmaW5lIHVzYmhzZl9kbWFfc3RhcnQocCwgZikJX191c2Joc2ZfZG1hX2N0cmwocCwgZiwgRFJFUUUpCisjZGVmaW5lIHVzYmhzZl9kbWFfc3RvcChwLCBmKQlfX3VzYmhzZl9kbWFfY3RybChwLCBmLCAwKQorc3RhdGljIHZvaWQgX191c2Joc2ZfZG1hX2N0cmwoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsCisJCQkgICAgICBzdHJ1Y3QgdXNiaHNfZmlmbyAqZmlmbywKKwkJCSAgICAgIHUxNiBkcmVxZSkKK3sKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzX3BpcGVfdG9fcHJpdihwaXBlKTsKKworCXVzYmhzX2JzZXQocHJpdiwgZmlmby0+c2VsLCBEUkVRRSwgZHJlcWUpOworfQorCisjZGVmaW5lIHVzYmhzZl9kbWFfbWFwKHApCV9fdXNiaHNmX2RtYV9tYXBfY3RybChwLCAxKQorI2RlZmluZSB1c2Joc2ZfZG1hX3VubWFwKHApCV9fdXNiaHNmX2RtYV9tYXBfY3RybChwLCAwKQorc3RhdGljIGludCBfX3VzYmhzZl9kbWFfbWFwX2N0cmwoc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgbWFwKQoreworCXN0cnVjdCB1c2Joc19waXBlICpwaXBlID0gcGt0LT5waXBlOworCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNfcGlwZV90b19wcml2KHBpcGUpOworCXN0cnVjdCB1c2Joc19waXBlX2luZm8gKmluZm8gPSB1c2Joc19wcml2X3RvX3BpcGVpbmZvKHByaXYpOworCisJcmV0dXJuIGluZm8tPmRtYV9tYXBfY3RybChwa3QsIG1hcCk7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmhzZl9kbWFfY29tcGxldGUodm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkIHVzYmhzZl9kbWFfcHJlcGFyZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QgPSAoc3RydWN0IHVzYmhzX3BrdCAqKWRhdGE7CisJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSBwa3QtPnBpcGU7CisJc3RydWN0IHVzYmhzX2ZpZm8gKmZpZm8gPSB1c2Joc19waXBlX3RvX2ZpZm8ocGlwZSk7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGlwZSk7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSB1c2Joc2ZfZG1hX2NoYW5fZ2V0KGZpZm8sIHBrdCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNfcHJpdl90b19kZXYocHJpdik7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCWRtYV9jb29raWVfdCBjb29raWU7CisKKwlkaXIgPSB1c2Joc19waXBlX2lzX2Rpcl9pbihwaXBlKSA/IERNQV9GUk9NX0RFVklDRSA6IERNQV9UT19ERVZJQ0U7CisKKwlzZ19pbml0X3RhYmxlKCZzZywgMSk7CisJc2dfc2V0X3BhZ2UoJnNnLCB2aXJ0X3RvX3BhZ2UocGt0LT5kbWEpLAorCQkgICAgcGt0LT5sZW5ndGgsIG9mZnNldF9pbl9wYWdlKHBrdC0+ZG1hKSk7CisJc2dfZG1hX2FkZHJlc3MoJnNnKSA9IHBrdC0+ZG1hICsgcGt0LT5hY3R1YWw7CisJc2dfZG1hX2xlbigmc2cpID0gcGt0LT50cmFuczsKKworCWRlc2MgPSBjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKGNoYW4sICZzZywgMSwgZGlyLAorCQkJCQkJICBETUFfUFJFUF9JTlRFUlJVUFQgfAorCQkJCQkJICBETUFfQ1RSTF9BQ0spOworCWlmICghZGVzYykKKwkJcmV0dXJuOworCisJZGVzYy0+Y2FsbGJhY2sJCT0gdXNiaHNmX2RtYV9jb21wbGV0ZTsKKwlkZXNjLT5jYWxsYmFja19wYXJhbQk9IHBpcGU7CisKKwljb29raWUgPSBkZXNjLT50eF9zdWJtaXQoZGVzYyk7CisJaWYgKGNvb2tpZSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc3VibWl0IGRtYSBkZXNjcmlwdG9yXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRldl9kYmcoZGV2LCAiICAlcyAlZCAoJWQvICVkKVxuIiwKKwkJZmlmby0+bmFtZSwgdXNiaHNfcGlwZV9udW1iZXIocGlwZSksIHBrdC0+bGVuZ3RoLCBwa3QtPnplcm8pOworCisJdXNiaHNmX2RtYV9zdGFydChwaXBlLCBmaWZvKTsKKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhjaGFuKTsKK30KKworLyoKKyAqCQlETUEgcHVzaCBoYW5kbGVyCisgKi8KK3N0YXRpYyBpbnQgdXNiaHNmX2RtYV9wcmVwYXJlX3B1c2goc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgKmlzX2RvbmUpCit7CisJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSBwa3QtPnBpcGU7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGlwZSk7CisJc3RydWN0IHVzYmhzX2ZpZm8gKmZpZm87CisJaW50IGxlbiA9IHBrdC0+bGVuZ3RoIC0gcGt0LT5hY3R1YWw7CisJaW50IHJldDsKKworCWlmICh1c2Joc19waXBlX2lzX2J1c3kocGlwZSkpCisJCXJldHVybiAwOworCisJLyogdXNlIFBJTyBpZiBwYWNrZXQgaXMgbGVzcyB0aGFuIHBpb19kbWFfYm9yZGVyIG9yIHBpcGUgaXMgRENQICovCisJaWYgKChsZW4gPCB1c2Joc19nZXRfZHBhcmFtKHByaXYsIHBpb19kbWFfYm9yZGVyKSkgfHwKKwkgICAgdXNiaHNfcGlwZV9pc19kY3AocGlwZSkpCisJCWdvdG8gdXNiaHNmX3Bpb19wcmVwYXJlX3B1c2g7CisKKwlpZiAobGVuICUgNCkgLyogMzJiaXQgYWxpZ25tZW50ICovCisJCWdvdG8gdXNiaHNmX3Bpb19wcmVwYXJlX3B1c2g7CisKKwlpZiAoKCh1MzIpcGt0LT5idWYgKyBwa3QtPmFjdHVhbCkgJiAweDcpIC8qIDhieXRlIGFsaWdubWVudCAqLworCQlnb3RvIHVzYmhzZl9waW9fcHJlcGFyZV9wdXNoOworCisJLyogZ2V0IGVuYWJsZSBETUEgZmlmbyAqLworCWZpZm8gPSB1c2Joc2ZfZ2V0X2RtYV9maWZvKHByaXYsIHBrdCk7CisJaWYgKCFmaWZvKQorCQlnb3RvIHVzYmhzZl9waW9fcHJlcGFyZV9wdXNoOworCisJaWYgKHVzYmhzZl9kbWFfbWFwKHBrdCkgPCAwKQorCQlnb3RvIHVzYmhzZl9waW9fcHJlcGFyZV9wdXNoOworCisJcmV0ID0gdXNiaHNmX2ZpZm9fc2VsZWN0KHBpcGUsIGZpZm8sIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHVzYmhzZl9waW9fcHJlcGFyZV9wdXNoX3VubWFwOworCisJcGt0LT50cmFucyA9IGxlbjsKKworCXRhc2tsZXRfaW5pdCgmZmlmby0+dGFza2xldCwKKwkJICAgICB1c2Joc2ZfZG1hX3ByZXBhcmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwa3QpOworCisJdGFza2xldF9zY2hlZHVsZSgmZmlmby0+dGFza2xldCk7CisKKwlyZXR1cm4gMDsKKwordXNiaHNmX3Bpb19wcmVwYXJlX3B1c2hfdW5tYXA6CisJdXNiaHNmX2RtYV91bm1hcChwa3QpOwordXNiaHNmX3Bpb19wcmVwYXJlX3B1c2g6CisJLyoKKwkgKiBjaGFuZ2UgaGFuZGxlciB0byBQSU8KKwkgKi8KKwlwa3QtPmhhbmRsZXIgPSAmdXNiaHNfZmlmb19waW9fcHVzaF9oYW5kbGVyOworCisJcmV0dXJuIHBrdC0+aGFuZGxlci0+cHJlcGFyZShwa3QsIGlzX2RvbmUpOworfQorCitzdGF0aWMgaW50IHVzYmhzZl9kbWFfcHVzaF9kb25lKHN0cnVjdCB1c2Joc19wa3QgKnBrdCwgaW50ICppc19kb25lKQoreworCXN0cnVjdCB1c2Joc19waXBlICpwaXBlID0gcGt0LT5waXBlOworCisJcGt0LT5hY3R1YWwgPSBwa3QtPnRyYW5zOworCisJKmlzX2RvbmUgPSAhcGt0LT56ZXJvOwkvKiBzZW5kIHplcm8gcGFja2V0ID8gKi8KKworCXVzYmhzZl9kbWFfc3RvcChwaXBlLCBwaXBlLT5maWZvKTsKKwl1c2Joc2ZfZG1hX3VubWFwKHBrdCk7CisJdXNiaHNmX2ZpZm9fdW5zZWxlY3QocGlwZSwgcGlwZS0+Zmlmbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHVzYmhzX3BrdF9oYW5kbGUgdXNiaHNfZmlmb19kbWFfcHVzaF9oYW5kbGVyID0geworCS5wcmVwYXJlCT0gdXNiaHNmX2RtYV9wcmVwYXJlX3B1c2gsCisJLmRtYV9kb25lCT0gdXNiaHNmX2RtYV9wdXNoX2RvbmUsCit9OworCisvKgorICoJCURNQSBwb3AgaGFuZGxlcgorICovCitzdGF0aWMgaW50IHVzYmhzZl9kbWFfdHJ5X3BvcChzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QsIGludCAqaXNfZG9uZSkKK3sKKwlzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSA9IHBrdC0+cGlwZTsKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzX3BpcGVfdG9fcHJpdihwaXBlKTsKKwlzdHJ1Y3QgdXNiaHNfZmlmbyAqZmlmbzsKKwlpbnQgbGVuLCByZXQ7CisKKwlpZiAodXNiaHNfcGlwZV9pc19idXN5KHBpcGUpKQorCQlyZXR1cm4gMDsKKworCWlmICh1c2Joc19waXBlX2lzX2RjcChwaXBlKSkKKwkJZ290byB1c2Joc2ZfcGlvX3ByZXBhcmVfcG9wOworCisJLyogZ2V0IGVuYWJsZSBETUEgZmlmbyAqLworCWZpZm8gPSB1c2Joc2ZfZ2V0X2RtYV9maWZvKHByaXYsIHBrdCk7CisJaWYgKCFmaWZvKQorCQlnb3RvIHVzYmhzZl9waW9fcHJlcGFyZV9wb3A7CisKKwlpZiAoKCh1MzIpcGt0LT5idWYgKyBwa3QtPmFjdHVhbCkgJiAweDcpIC8qIDhieXRlIGFsaWdubWVudCAqLworCQlnb3RvIHVzYmhzZl9waW9fcHJlcGFyZV9wb3A7CisKKwlyZXQgPSB1c2Joc2ZfZmlmb19zZWxlY3QocGlwZSwgZmlmbywgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdXNiaHNmX3Bpb19wcmVwYXJlX3BvcDsKKworCS8qIHVzZSBQSU8gaWYgcGFja2V0IGlzIGxlc3MgdGhhbiBwaW9fZG1hX2JvcmRlciAqLworCWxlbiA9IHVzYmhzZl9maWZvX3Jjdl9sZW4ocHJpdiwgZmlmbyk7CisJbGVuID0gbWluKHBrdC0+bGVuZ3RoIC0gcGt0LT5hY3R1YWwsIGxlbik7CisJaWYgKGxlbiAlIDQpIC8qIDMyYml0IGFsaWdubWVudCAqLworCQlnb3RvIHVzYmhzZl9waW9fcHJlcGFyZV9wb3BfdW5zZWxlY3Q7CisKKwlpZiAobGVuIDwgdXNiaHNfZ2V0X2RwYXJhbShwcml2LCBwaW9fZG1hX2JvcmRlcikpCisJCWdvdG8gdXNiaHNmX3Bpb19wcmVwYXJlX3BvcF91bnNlbGVjdDsKKworCXJldCA9IHVzYmhzZl9maWZvX2JhcnJpZXIocHJpdiwgZmlmbyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdXNiaHNmX3Bpb19wcmVwYXJlX3BvcF91bnNlbGVjdDsKKworCWlmICh1c2Joc2ZfZG1hX21hcChwa3QpIDwgMCkKKwkJZ290byB1c2Joc2ZfcGlvX3ByZXBhcmVfcG9wX3Vuc2VsZWN0OworCisJLyogRE1BICovCisKKwkvKgorCSAqIHVzYmhzX2ZpZm9fZG1hX3BvcF9oYW5kbGVyIDo6IHByZXBhcmUKKwkgKiBlbmFibGVkIGlycSB0byBjb21lIGhlcmUuCisJICogYnV0IGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgZm9yIERNQS4gZGlzYWJsZSBpdC4KKwkgKi8KKwl1c2Joc2ZfcnhfaXJxX2N0cmwocGlwZSwgMCk7CisKKwlwa3QtPnRyYW5zID0gbGVuOworCisJdGFza2xldF9pbml0KCZmaWZvLT50YXNrbGV0LAorCQkgICAgIHVzYmhzZl9kbWFfcHJlcGFyZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBrdCk7CisKKwl0YXNrbGV0X3NjaGVkdWxlKCZmaWZvLT50YXNrbGV0KTsKKworCXJldHVybiAwOworCit1c2Joc2ZfcGlvX3ByZXBhcmVfcG9wX3Vuc2VsZWN0OgorCXVzYmhzZl9maWZvX3Vuc2VsZWN0KHBpcGUsIGZpZm8pOwordXNiaHNmX3Bpb19wcmVwYXJlX3BvcDoKKworCS8qCisJICogY2hhbmdlIGhhbmRsZXIgdG8gUElPCisJICovCisJcGt0LT5oYW5kbGVyID0gJnVzYmhzX2ZpZm9fcGlvX3BvcF9oYW5kbGVyOworCisJcmV0dXJuIHBrdC0+aGFuZGxlci0+dHJ5X3J1bihwa3QsIGlzX2RvbmUpOworfQorCitzdGF0aWMgaW50IHVzYmhzZl9kbWFfcG9wX2RvbmUoc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgKmlzX2RvbmUpCit7CisJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSBwa3QtPnBpcGU7CisJaW50IG1heHAgPSB1c2Joc19waXBlX2dldF9tYXhwYWNrZXQocGlwZSk7CisKKwl1c2Joc2ZfZG1hX3N0b3AocGlwZSwgcGlwZS0+Zmlmbyk7CisJdXNiaHNmX2RtYV91bm1hcChwa3QpOworCXVzYmhzZl9maWZvX3Vuc2VsZWN0KHBpcGUsIHBpcGUtPmZpZm8pOworCisJcGt0LT5hY3R1YWwgKz0gcGt0LT50cmFuczsKKworCWlmICgocGt0LT5hY3R1YWwgPT0gcGt0LT5sZW5ndGgpIHx8CS8qIHJlY2VpdmUgYWxsIGRhdGEgKi8KKwkgICAgKHBrdC0+dHJhbnMgPCBtYXhwKSkgewkJLyogc2hvcnQgcGFja2V0ICovCisJCSppc19kb25lID0gMTsKKwl9IGVsc2UgeworCQkvKiByZS1lbmFibGUgKi8KKwkJdXNiaHNmX3ByZXBhcmVfcG9wKHBrdCwgaXNfZG9uZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB1c2Joc19wa3RfaGFuZGxlIHVzYmhzX2ZpZm9fZG1hX3BvcF9oYW5kbGVyID0geworCS5wcmVwYXJlCT0gdXNiaHNmX3ByZXBhcmVfcG9wLAorCS50cnlfcnVuCT0gdXNiaHNmX2RtYV90cnlfcG9wLAorCS5kbWFfZG9uZQk9IHVzYmhzZl9kbWFfcG9wX2RvbmUKK307CisKKy8qCisgKgkJRE1BIHNldHRpbmcKKyAqLworc3RhdGljIGJvb2wgdXNiaHNmX2RtYV9maWx0ZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3Qgc2hfZG1hZV9zbGF2ZSAqc2xhdmUgPSBwYXJhbTsKKworCS8qCisJICogRklYTUUKKwkgKgorCSAqIHVzYmhzIGRvZXNuJ3QgcmVjb2duaXplIGlkID0gMCBhcyB2YWxpZCBETUEKKwkgKi8KKwlpZiAoMCA9PSBzbGF2ZS0+c2xhdmVfaWQpCisJCXJldHVybiBmYWxzZTsKKworCWNoYW4tPnByaXZhdGUgPSBzbGF2ZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCB1c2Joc2ZfZG1hX3F1aXQoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYsIHN0cnVjdCB1c2Joc19maWZvICpmaWZvKQoreworCWlmIChmaWZvLT50eF9jaGFuKQorCQlkbWFfcmVsZWFzZV9jaGFubmVsKGZpZm8tPnR4X2NoYW4pOworCWlmIChmaWZvLT5yeF9jaGFuKQorCQlkbWFfcmVsZWFzZV9jaGFubmVsKGZpZm8tPnJ4X2NoYW4pOworCisJZmlmby0+dHhfY2hhbiA9IE5VTEw7CisJZmlmby0+cnhfY2hhbiA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmhzZl9kbWFfaW5pdChzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiwKKwkJCSAgICBzdHJ1Y3QgdXNiaHNfZmlmbyAqZmlmbykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1c2Joc19wcml2X3RvX2Rldihwcml2KTsKKwlkbWFfY2FwX21hc2tfdCBtYXNrOworCisJZG1hX2NhcF96ZXJvKG1hc2spOworCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgbWFzayk7CisJZmlmby0+dHhfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgdXNiaHNmX2RtYV9maWx0ZXIsCisJCQkJCSAgICAmZmlmby0+dHhfc2xhdmUpOworCisJZG1hX2NhcF96ZXJvKG1hc2spOworCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgbWFzayk7CisJZmlmby0+cnhfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgdXNiaHNmX2RtYV9maWx0ZXIsCisJCQkJCSAgICAmZmlmby0+cnhfc2xhdmUpOworCisJaWYgKGZpZm8tPnR4X2NoYW4gfHwgZmlmby0+cnhfY2hhbikKKwkJZGV2X2RiZyhkZXYsICJlbmFibGUgRE1BRW5naW5lICglcyVzJXMpXG4iLAorCQkJIGZpZm8tPm5hbWUsCisJCQkgZmlmby0+dHhfY2hhbiA/ICJbVFhdIiA6ICIgICAgIiwKKwkJCSBmaWZvLT5yeF9jaGFuID8gIltSWF0iIDogIiAgICAiKTsKK30KKworLyoKKyAqCQlpcnEgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgdXNiaHNmX2lycV9lbXB0eShzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiwKKwkJCSAgICBzdHJ1Y3QgdXNiaHNfaXJxX3N0YXRlICppcnFfc3RhdGUpCit7CisJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNfcHJpdl90b19kZXYocHJpdik7CisJaW50IGksIHJldDsKKworCWlmICghaXJxX3N0YXRlLT5iZW1wc3RzKSB7CisJCWRldl9lcnIoZGV2LCAiZGVidWcgJXMgISFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZGV2X2RiZyhkZXYsICJpcnEgZW1wdHkgWzB4JTA0eF1cbiIsIGlycV9zdGF0ZS0+YmVtcHN0cyk7CisKKwkvKgorCSAqIHNlYXJjaCBpbnRlcnJ1cHRlZCAicGlwZSIKKwkgKiBub3QgInVlcCIuCisJICovCisJdXNiaHNfZm9yX2VhY2hfcGlwZV93aXRoX2RjcChwaXBlLCBwcml2LCBpKSB7CisJCWlmICghKGlycV9zdGF0ZS0+YmVtcHN0cyAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IHVzYmhzX3BrdF9ydW4ocGlwZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X2VycihkZXYsICJpcnFfZW1wdHkgcnVuX2Vycm9yICVkIDogJWRcbiIsIGksIHJldCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiaHNmX2lycV9yZWFkeShzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiwKKwkJCSAgICBzdHJ1Y3QgdXNiaHNfaXJxX3N0YXRlICppcnFfc3RhdGUpCit7CisJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNfcHJpdl90b19kZXYocHJpdik7CisJaW50IGksIHJldDsKKworCWlmICghaXJxX3N0YXRlLT5icmR5c3RzKSB7CisJCWRldl9lcnIoZGV2LCAiZGVidWcgJXMgISFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZGV2X2RiZyhkZXYsICJpcnEgcmVhZHkgWzB4JTA0eF1cbiIsIGlycV9zdGF0ZS0+YnJkeXN0cyk7CisKKwkvKgorCSAqIHNlYXJjaCBpbnRlcnJ1cHRlZCAicGlwZSIKKwkgKiBub3QgInVlcCIuCisJICovCisJdXNiaHNfZm9yX2VhY2hfcGlwZV93aXRoX2RjcChwaXBlLCBwcml2LCBpKSB7CisJCWlmICghKGlycV9zdGF0ZS0+YnJkeXN0cyAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IHVzYmhzX3BrdF9ydW4ocGlwZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X2VycihkZXYsICJpcnFfcmVhZHkgcnVuX2Vycm9yICVkIDogJWRcbiIsIGksIHJldCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmhzZl9kbWFfY29tcGxldGUodm9pZCAqYXJnKQoreworCXN0cnVjdCB1c2Joc19waXBlICpwaXBlID0gYXJnOworCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNfcGlwZV90b19wcml2KHBpcGUpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVzYmhzX3ByaXZfdG9fZGV2KHByaXYpOworCWludCByZXQ7CisKKwlyZXQgPSB1c2Joc19wa3RfZG1hZG9uZShwaXBlKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkZXYsICJkbWFfY29tcGxldGUgcnVuX2Vycm9yICVkIDogJWRcbiIsCisJCQl1c2Joc19waXBlX251bWJlcihwaXBlKSwgcmV0KTsKK30KKworLyoKKyAqCQlmaWZvIGluaXQKKyAqLwordm9pZCB1c2Joc19maWZvX2luaXQoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYpCit7CisJc3RydWN0IHVzYmhzX21vZCAqbW9kID0gdXNiaHNfbW9kX2dldF9jdXJyZW50KHByaXYpOworCXN0cnVjdCB1c2Joc19maWZvICpjZmlmbyA9IHVzYmhzZl9nZXRfY2ZpZm8ocHJpdik7CisJc3RydWN0IHVzYmhzX2ZpZm8gKmQwZmlmbyA9IHVzYmhzZl9nZXRfZDBmaWZvKHByaXYpOworCXN0cnVjdCB1c2Joc19maWZvICpkMWZpZm8gPSB1c2Joc2ZfZ2V0X2QxZmlmbyhwcml2KTsKKworCW1vZC0+aXJxX2VtcHR5CQk9IHVzYmhzZl9pcnFfZW1wdHk7CisJbW9kLT5pcnFfcmVhZHkJCT0gdXNiaHNmX2lycV9yZWFkeTsKKwltb2QtPmlycV9iZW1wc3RzCT0gMDsKKwltb2QtPmlycV9icmR5c3RzCT0gMDsKKworCWNmaWZvLT5waXBlCT0gTlVMTDsKKwljZmlmby0+dHhfY2hhbgk9IE5VTEw7CisJY2ZpZm8tPnJ4X2NoYW4JPSBOVUxMOworCisJZDBmaWZvLT5waXBlCT0gTlVMTDsKKwlkMGZpZm8tPnR4X2NoYW4JPSBOVUxMOworCWQwZmlmby0+cnhfY2hhbgk9IE5VTEw7CisKKwlkMWZpZm8tPnBpcGUJPSBOVUxMOworCWQxZmlmby0+dHhfY2hhbgk9IE5VTEw7CisJZDFmaWZvLT5yeF9jaGFuCT0gTlVMTDsKKworCXVzYmhzZl9kbWFfaW5pdChwcml2LCB1c2Joc2ZfZ2V0X2QwZmlmbyhwcml2KSk7CisJdXNiaHNmX2RtYV9pbml0KHByaXYsIHVzYmhzZl9nZXRfZDFmaWZvKHByaXYpKTsKK30KKwordm9pZCB1c2Joc19maWZvX3F1aXQoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYpCit7CisJc3RydWN0IHVzYmhzX21vZCAqbW9kID0gdXNiaHNfbW9kX2dldF9jdXJyZW50KHByaXYpOworCisJbW9kLT5pcnFfZW1wdHkJCT0gTlVMTDsKKwltb2QtPmlycV9yZWFkeQkJPSBOVUxMOworCW1vZC0+aXJxX2JlbXBzdHMJPSAwOworCW1vZC0+aXJxX2JyZHlzdHMJPSAwOworCisJdXNiaHNmX2RtYV9xdWl0KHByaXYsIHVzYmhzZl9nZXRfZDBmaWZvKHByaXYpKTsKKwl1c2Joc2ZfZG1hX3F1aXQocHJpdiwgdXNiaHNmX2dldF9kMWZpZm8ocHJpdikpOworfQorCitpbnQgdXNiaHNfZmlmb19wcm9iZShzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgdXNiaHNfZmlmbyAqZmlmbzsKKworCS8qIENGSUZPICovCisJZmlmbyA9IHVzYmhzZl9nZXRfY2ZpZm8ocHJpdik7CisJZmlmby0+bmFtZQk9ICJDRklGTyI7CisJZmlmby0+cG9ydAk9IENGSUZPOworCWZpZm8tPnNlbAk9IENGSUZPU0VMOworCWZpZm8tPmN0cgk9IENGSUZPQ1RSOworCisJLyogRDBGSUZPICovCisJZmlmbyA9IHVzYmhzZl9nZXRfZDBmaWZvKHByaXYpOworCWZpZm8tPm5hbWUJPSAiRDBGSUZPIjsKKwlmaWZvLT5wb3J0CT0gRDBGSUZPOworCWZpZm8tPnNlbAk9IEQwRklGT1NFTDsKKwlmaWZvLT5jdHIJPSBEMEZJRk9DVFI7CisJZmlmby0+dHhfc2xhdmUuc2xhdmVfaWQJPSB1c2Joc19nZXRfZHBhcmFtKHByaXYsIGQwX3R4X2lkKTsKKwlmaWZvLT5yeF9zbGF2ZS5zbGF2ZV9pZAk9IHVzYmhzX2dldF9kcGFyYW0ocHJpdiwgZDBfcnhfaWQpOworCisJLyogRDFGSUZPICovCisJZmlmbyA9IHVzYmhzZl9nZXRfZDFmaWZvKHByaXYpOworCWZpZm8tPm5hbWUJPSAiRDFGSUZPIjsKKwlmaWZvLT5wb3J0CT0gRDFGSUZPOworCWZpZm8tPnNlbAk9IEQxRklGT1NFTDsKKwlmaWZvLT5jdHIJPSBEMUZJRk9DVFI7CisJZmlmby0+dHhfc2xhdmUuc2xhdmVfaWQJPSB1c2Joc19nZXRfZHBhcmFtKHByaXYsIGQxX3R4X2lkKTsKKwlmaWZvLT5yeF9zbGF2ZS5zbGF2ZV9pZAk9IHVzYmhzX2dldF9kcGFyYW0ocHJpdiwgZDFfcnhfaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdXNiaHNfZmlmb19yZW1vdmUoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYpCit7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2ZpZm8uaCBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvZmlmby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNmQ4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2ZpZm8uaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIFJlbmVzYXMgVVNCIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgorICogS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworI2lmbmRlZiBSRU5FU0FTX1VTQl9GSUZPX0gKKyNkZWZpbmUgUkVORVNBU19VU0JfRklGT19ICisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaF9kbWEuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSAicGlwZS5oIgorCisjZGVmaW5lCURNQV9BRERSX0lOVkFMSUQJKH4oZG1hX2FkZHJfdCkwKQorCitzdHJ1Y3QgdXNiaHNfZmlmbyB7CisJY2hhciAqbmFtZTsKKwl1MzIgcG9ydDsJLyogeEZJRk8gKi8KKwl1MzIgc2VsOwkvKiB4RklGT1NFTCAqLworCXUzMiBjdHI7CS8qIHhGSUZPQ1RSICovCisKKwlzdHJ1Y3QgdXNiaHNfcGlwZQkqcGlwZTsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGFza2xldDsKKworCXN0cnVjdCBkbWFfY2hhbgkJKnR4X2NoYW47CisJc3RydWN0IGRtYV9jaGFuCQkqcnhfY2hhbjsKKworCXN0cnVjdCBzaF9kbWFlX3NsYXZlCXR4X3NsYXZlOworCXN0cnVjdCBzaF9kbWFlX3NsYXZlCXJ4X3NsYXZlOworfTsKKworc3RydWN0IHVzYmhzX2ZpZm9faW5mbyB7CisJc3RydWN0IHVzYmhzX2ZpZm8gY2ZpZm87CisJc3RydWN0IHVzYmhzX2ZpZm8gZDBmaWZvOworCXN0cnVjdCB1c2Joc19maWZvIGQxZmlmbzsKK307CisKK3N0cnVjdCB1c2Joc19wa3RfaGFuZGxlOworc3RydWN0IHVzYmhzX3BrdCB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCB1c2Joc19waXBlICpwaXBlOworCXN0cnVjdCB1c2Joc19wa3RfaGFuZGxlICpoYW5kbGVyOworCWRtYV9hZGRyX3QgZG1hOworCXZvaWQgKmJ1ZjsKKwlpbnQgbGVuZ3RoOworCWludCB0cmFuczsKKwlpbnQgYWN0dWFsOworCWludCB6ZXJvOworfTsKKworc3RydWN0IHVzYmhzX3BrdF9oYW5kbGUgeworCWludCAoKnByZXBhcmUpKHN0cnVjdCB1c2Joc19wa3QgKnBrdCwgaW50ICppc19kb25lKTsKKwlpbnQgKCp0cnlfcnVuKShzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QsIGludCAqaXNfZG9uZSk7CisJaW50ICgqZG1hX2RvbmUpKHN0cnVjdCB1c2Joc19wa3QgKnBrdCwgaW50ICppc19kb25lKTsKK307CisKKy8qCisgKiBmaWZvCisgKi8KK2ludCB1c2Joc19maWZvX3Byb2JlKHN0cnVjdCB1c2Joc19wcml2ICpwcml2KTsKK3ZvaWQgdXNiaHNfZmlmb19yZW1vdmUoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYpOwordm9pZCB1c2Joc19maWZvX2luaXQoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYpOwordm9pZCB1c2Joc19maWZvX3F1aXQoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYpOworCisvKgorICogcGFja2V0IGluZm8KKyAqLworZW51bSB7CisJVVNCSFNGX1BLVF9QUkVQQVJFLAorCVVTQkhTRl9QS1RfVFJZX1JVTiwKKwlVU0JIU0ZfUEtUX0RNQV9ET05FLAorfTsKKworZXh0ZXJuIHN0cnVjdCB1c2Joc19wa3RfaGFuZGxlIHVzYmhzX2ZpZm9fcGlvX3B1c2hfaGFuZGxlcjsKK2V4dGVybiBzdHJ1Y3QgdXNiaHNfcGt0X2hhbmRsZSB1c2Joc19maWZvX3Bpb19wb3BfaGFuZGxlcjsKK2V4dGVybiBzdHJ1Y3QgdXNiaHNfcGt0X2hhbmRsZSB1c2Joc19jdHJsX3N0YWdlX2VuZF9oYW5kbGVyOworCitleHRlcm4gc3RydWN0IHVzYmhzX3BrdF9oYW5kbGUgdXNiaHNfZmlmb19kbWFfcHVzaF9oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB1c2Joc19wa3RfaGFuZGxlIHVzYmhzX2ZpZm9fZG1hX3BvcF9oYW5kbGVyOworCisKK3ZvaWQgdXNiaHNfcGt0X2luaXQoc3RydWN0IHVzYmhzX3BrdCAqcGt0KTsKK3ZvaWQgdXNiaHNfcGt0X3B1c2goc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsIHN0cnVjdCB1c2Joc19wa3QgKnBrdCwKKwkJICAgIHN0cnVjdCB1c2Joc19wa3RfaGFuZGxlICpoYW5kbGVyLAorCQkgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgemVybyk7CitzdHJ1Y3QgdXNiaHNfcGt0ICp1c2Joc19wa3RfcG9wKHN0cnVjdCB1c2Joc19waXBlICpwaXBlLCBzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QpOworaW50IF9fdXNiaHNfcGt0X2hhbmRsZXIoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsIGludCB0eXBlKTsKKworI2RlZmluZSB1c2Joc19wa3Rfc3RhcnQocCkJX191c2Joc19wa3RfaGFuZGxlcihwLCBVU0JIU0ZfUEtUX1BSRVBBUkUpCisjZGVmaW5lIHVzYmhzX3BrdF9ydW4ocCkJX191c2Joc19wa3RfaGFuZGxlcihwLCBVU0JIU0ZfUEtUX1RSWV9SVU4pCisjZGVmaW5lIHVzYmhzX3BrdF9kbWFkb25lKHApCV9fdXNiaHNfcGt0X2hhbmRsZXIocCwgVVNCSFNGX1BLVF9ETUFfRE9ORSkKKworI2VuZGlmIC8qIFJFTkVTQVNfVVNCX0ZJRk9fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYwppbmRleCAyMDZjZmFiLi5iYTc5ZGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYwpAQCAtMjYsMjYgKzI2LDI1IEBACiAgKi8KIHN0cnVjdCB1c2Joc2dfcmVxdWVzdCB7CiAJc3RydWN0IHVzYl9yZXF1ZXN0CXJlcTsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisJc3RydWN0IHVzYmhzX3BrdAlwa3Q7CiB9OwogCiAjZGVmaW5lIEVQX05BTUVfU0laRSA4CiBzdHJ1Y3QgdXNiaHNnX2dwcml2Owotc3RydWN0IHVzYmhzZ19waXBlX2hhbmRsZTsKIHN0cnVjdCB1c2Joc2dfdWVwIHsKIAlzdHJ1Y3QgdXNiX2VwCQkgZXA7CiAJc3RydWN0IHVzYmhzX3BpcGUJKnBpcGU7Ci0Jc3RydWN0IGxpc3RfaGVhZAkgbGlzdDsKIAogCWNoYXIgZXBfbmFtZVtFUF9OQU1FX1NJWkVdOwogCiAJc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXY7Ci0Jc3RydWN0IHVzYmhzZ19waXBlX2hhbmRsZSAqaGFuZGxlcjsKKwlzdHJ1Y3QgdXNiaHNfcGt0X2hhbmRsZSAqaGFuZGxlcjsKIH07CiAKIHN0cnVjdCB1c2Joc2dfZ3ByaXYgewogCXN0cnVjdCB1c2JfZ2FkZ2V0CSBnYWRnZXQ7CiAJc3RydWN0IHVzYmhzX21vZAkgbW9kOworCXN0cnVjdCBsaXN0X2hlYWQJIGxpbms7CiAKIAlzdHJ1Y3QgdXNiaHNnX3VlcAkqdWVwOwogCWludAkJCSB1ZXBfc2l6ZTsKQEAgLTU4LDEyICs1Nyw2IEBACiAjZGVmaW5lIFVTQkhTR19TVEFUVVNfV0VER0UJCSgxIDw8IDIpCiB9OwogCi1zdHJ1Y3QgdXNiaHNnX3BpcGVfaGFuZGxlIHsKLQlpbnQgKCpwcmVwYXJlKShzdHJ1Y3QgdXNiaHNnX3VlcCAqdWVwLCBzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QgKnVyZXEpOwotCWludCAoKnRyeV9ydW4pKHN0cnVjdCB1c2Joc2dfdWVwICp1ZXAsIHN0cnVjdCB1c2Joc2dfcmVxdWVzdCAqdXJlcSk7Ci0Jdm9pZCAoKmlycV9tYXNrKShzdHJ1Y3QgdXNiaHNnX3VlcCAqdWVwLCBpbnQgZW5hYmxlKTsKLX07Ci0KIHN0cnVjdCB1c2Joc2dfcmVjaXBfaGFuZGxlIHsKIAljaGFyICpuYW1lOwogCWludCAoKmRldmljZSkoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYsIHN0cnVjdCB1c2Joc2dfdWVwICp1ZXAsCkBAIC0xMDAsNyArOTMsNiBAQAogCWNvbnRhaW5lcl9vZihyLCBzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QsIHJlcSkKIAogI2RlZmluZSB1c2Joc2dfZXBfdG9fdWVwKGUpCQljb250YWluZXJfb2YoZSwgc3RydWN0IHVzYmhzZ191ZXAsIGVwKQotI2RlZmluZSB1c2Joc2dfZ3ByaXZfdG9fbG9jayhncCkJdXNiaHNfcHJpdl90b19sb2NrKChncCktPm1vZC5wcml2KQogI2RlZmluZSB1c2Joc2dfZ3ByaXZfdG9fZGV2KGdwKQkJdXNiaHNfcHJpdl90b19kZXYoKGdwKS0+bW9kLnByaXYpCiAjZGVmaW5lIHVzYmhzZ19ncHJpdl90b19wcml2KGdwKQkoKGdwKS0+bW9kLnByaXYpCiAjZGVmaW5lIHVzYmhzZ19ncHJpdl90b19kY3AoZ3ApCQkoKGdwKS0+dWVwKQpAQCAtMTEwLDYgKzEwMiwxMCBAQAogI2RlZmluZSB1c2Joc2dfcGlwZV90b191ZXAocCkJCSgocCktPm1vZF9wcml2YXRlKQogI2RlZmluZSB1c2Joc2dfaXNfZGNwKHUpCQkoKHUpID09IHVzYmhzZ19ncHJpdl90b19kY3AoKHUpLT5ncHJpdikpCiAKKyNkZWZpbmUgdXNiaHNnX3VyZXFfdG9fcGt0KHUpCQkoJih1KS0+cGt0KQorI2RlZmluZSB1c2Joc2dfcGt0X3RvX3VyZXEoaSkJXAorCWNvbnRhaW5lcl9vZihpLCBzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QsIHBrdCkKKwogI2RlZmluZSB1c2Joc2dfaXNfbm90X2Nvbm5lY3RlZChncCkgKChncCktPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikKIAogLyogc3RhdHVzICovCkBAIC0xMTgsMzcgKzExNCwxOCBAQAogI2RlZmluZSB1c2Joc2dfc3RhdHVzX2NscihncCwgYikgKGdwLT5zdGF0dXMgJj0gfmIpCiAjZGVmaW5lIHVzYmhzZ19zdGF0dXNfaGFzKGdwLCBiKSAoZ3AtPnN0YXR1cyAmICAgYikKIAotLyoKLSAqCQl1c2Joc2dfdHJ5bG9jawotICoKLSAqIFRoaXMgZHJpdmVyIGRvbid0IHVzZSBzcGluX3RyeV9sb2NrCi0gKiB0byBhdm9pZCB3YXJuaW5nIG9mIENPTkZJR19ERUJVR19TUElOTE9DSwotICovCi1zdGF0aWMgc3BpbmxvY2tfdCAqdXNiaHNnX3RyeWxvY2soc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYsCi0JCQkJICB1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLQlzcGlubG9ja190ICpsb2NrID0gdXNiaHNnX2dwcml2X3RvX2xvY2soZ3ByaXYpOworLyogY29udHJvbGxlciAqLworTElTVF9IRUFEKHRoZV9jb250cm9sbGVyX2xpbmspOwogCi0JLyogY2hlY2sgc3BpbiBsb2NrIHN0YXR1cwotCSAqIHRvIGF2b2lkIGRlYWRsb2NrL25lc3QgKi8KLQlpZiAoc3Bpbl9pc19sb2NrZWQobG9jaykpCi0JCXJldHVybiBOVUxMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgKmZsYWdzKTsKLQotCXJldHVybiBsb2NrOwotfQotCi1zdGF0aWMgdm9pZCB1c2Joc2dfdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQotewotCWlmICghbG9jaykKLQkJcmV0dXJuOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCAqZmxhZ3MpOwotfQorI2RlZmluZSB1c2Joc2dfZm9yX2VhY2hfY29udHJvbGxlcihncHJpdilcCisJbGlzdF9mb3JfZWFjaF9lbnRyeShncHJpdiwgJnRoZV9jb250cm9sbGVyX2xpbmssIGxpbmspCisjZGVmaW5lIHVzYmhzZ19jb250cm9sbGVyX3JlZ2lzdGVyKGdwcml2KVwKKwlsaXN0X2FkZF90YWlsKCYoZ3ByaXYpLT5saW5rLCAmdGhlX2NvbnRyb2xsZXJfbGluaykKKyNkZWZpbmUgdXNiaHNnX2NvbnRyb2xsZXJfdW5yZWdpc3RlcihncHJpdilcCisJbGlzdF9kZWxfaW5pdCgmKGdwcml2KS0+bGluaykKIAogLyoKLSAqCQlsaXN0IHB1c2gvcG9wCisgKgkJcXVldWUgcHVzaC9wb3AKICAqLwogc3RhdGljIHZvaWQgdXNiaHNnX3F1ZXVlX3B1c2goc3RydWN0IHVzYmhzZ191ZXAgKnVlcCwKIAkJCSAgICAgIHN0cnVjdCB1c2Joc2dfcmVxdWVzdCAqdXJlcSkKQEAgLTE1Niw3OSArMTMzLDE3IEBACiAJc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfdWVwX3RvX2dwcml2KHVlcCk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNnX2dwcml2X3RvX2RldihncHJpdik7CiAJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSB1c2Joc2dfdWVwX3RvX3BpcGUodWVwKTsKKwlzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QgPSB1c2Joc2dfdXJlcV90b19wa3QodXJlcSk7CisJc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEgPSAmdXJlcS0+cmVxOwogCi0JLyoKLQkgKioqKioqKioqICBhc3N1bWUgdW5kZXIgc3BpbiBsb2NrICAqKioqKioqKioKLQkgKi8KLQlsaXN0X2RlbF9pbml0KCZ1cmVxLT5ub2RlKTsKLQlsaXN0X2FkZF90YWlsKCZ1cmVxLT5ub2RlLCAmdWVwLT5saXN0KTsKLQl1cmVxLT5yZXEuYWN0dWFsID0gMDsKLQl1cmVxLT5yZXEuc3RhdHVzID0gLUVJTlBST0dSRVNTOworCXJlcS0+YWN0dWFsID0gMDsKKwlyZXEtPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwl1c2Joc19wa3RfcHVzaChwaXBlLCBwa3QsIHVlcC0+aGFuZGxlciwKKwkJICAgICAgIHJlcS0+YnVmLCByZXEtPmxlbmd0aCwgcmVxLT56ZXJvKTsKIAogCWRldl9kYmcoZGV2LCAicGlwZSAlZCA6IHF1ZXVlIHB1c2ggKCVkKVxuIiwKIAkJdXNiaHNfcGlwZV9udW1iZXIocGlwZSksCi0JCXVyZXEtPnJlcS5sZW5ndGgpOwotfQotCi1zdGF0aWMgc3RydWN0IHVzYmhzZ19yZXF1ZXN0ICp1c2Joc2dfcXVldWVfZ2V0KHN0cnVjdCB1c2Joc2dfdWVwICp1ZXApCi17Ci0JLyoKLQkgKioqKioqKioqICBhc3N1bWUgdW5kZXIgc3BpbiBsb2NrICAqKioqKioqKioKLQkgKi8KLQlpZiAobGlzdF9lbXB0eSgmdWVwLT5saXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gbGlzdF9lbnRyeSh1ZXAtPmxpc3QubmV4dCwgc3RydWN0IHVzYmhzZ19yZXF1ZXN0LCBub2RlKTsKLX0KLQotI2RlZmluZSB1c2Joc2dfcXVldWVfcHJlcGFyZSh1ZXApIF9fdXNiaHNnX3F1ZXVlX2hhbmRsZXIodWVwLCAxKTsKLSNkZWZpbmUgdXNiaHNnX3F1ZXVlX2hhbmRsZSh1ZXApICBfX3VzYmhzZ19xdWV1ZV9oYW5kbGVyKHVlcCwgMCk7Ci1zdGF0aWMgaW50IF9fdXNiaHNnX3F1ZXVlX2hhbmRsZXIoc3RydWN0IHVzYmhzZ191ZXAgKnVlcCwgaW50IHByZXBhcmUpCi17Ci0Jc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfdWVwX3RvX2dwcml2KHVlcCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNnX2dwcml2X3RvX2RldihncHJpdik7Ci0Jc3RydWN0IHVzYmhzZ19yZXF1ZXN0ICp1cmVxOwotCXNwaW5sb2NrX3QgKmxvY2s7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghdWVwLT5oYW5kbGVyKSB7Ci0JCWRldl9lcnIoZGV2LCAibm8gaGFuZGxlciBmdW5jdGlvblxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qCi0JICogQ0FVVElPTiBbKnF1ZXVlIGhhbmRsZXIqXQotCSAqCi0JICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmb3Igc3RhcnQvcmVzdGFydCBxdWV1ZSBvcGVyYXRpb24uCi0JICogT1RPSCB0aGUgbW9zdCBtdWNoIHdvcnJ5IGZvciBVU0IgZHJpdmVyIGlzIHNwaW5sb2NrIG5lc3QuCi0JICogU3BlY2lhbGx5IGl0IGFyZQotCSAqICAgLSB1c2JfZXBfb3BzICA6OiBxdWV1ZQotCSAqICAgLSB1c2JfcmVxdWVzdCA6OiBjb21wbGV0ZQotCSAqCi0JICogQnV0IHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBuZWVkIG5vdCBjYXJlIGFib3V0IHNwaW5sb2NrLgotCSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNpbmcgdXNiaHNnX3RyeWxvY2sgZm9yIGl0LgotCSAqIGlmICJpc19sb2NrZWQiIGlzIDEsIHRoaXMgbWVhbiB0aGlzIGZ1bmN0aW9uIGxvY2sgaXQuCi0JICogYnV0IGlmIGl0IGlzIDAsIHRoaXMgbWVhbiBpdCBpcyBhbHJlYWR5IHVuZGVyIHNwaW4gbG9jay4KLQkgKiBzZWUgYWxzbwotCSAqICAgQ0FVVElPTiBbKmVuZHBvaW50IHF1ZXVlKl0KLQkgKiAgIENBVVRJT04gWypyZXF1ZXN0IGNvbXBsZXRlKl0KLQkgKi8KLQotCS8qKioqKioqKioqKioqKioqKiogIHNwaW4gdHJ5IGxvY2sgKioqKioqKioqKioqKioqKioqKi8KLQlsb2NrID0gdXNiaHNnX3RyeWxvY2soZ3ByaXYsICZmbGFncyk7Ci0KLQl1cmVxID0gdXNiaHNnX3F1ZXVlX2dldCh1ZXApOwotCWlmICh1cmVxKSB7Ci0JCWlmIChwcmVwYXJlKQotCQkJcmV0ID0gdWVwLT5oYW5kbGVyLT5wcmVwYXJlKHVlcCwgdXJlcSk7Ci0JCWVsc2UKLQkJCXJldCA9IHVlcC0+aGFuZGxlci0+dHJ5X3J1bih1ZXAsIHVyZXEpOwotCX0KLQl1c2Joc2dfdW5sb2NrKGxvY2ssICZmbGFncyk7Ci0JLyoqKioqKioqKioqKioqKioqKioqICBzcGluIHVubG9jayAqKioqKioqKioqKioqKioqKiovCi0KLQlyZXR1cm4gcmV0OworCQlyZXEtPmxlbmd0aCk7CiB9CiAKIHN0YXRpYyB2b2lkIHVzYmhzZ19xdWV1ZV9wb3Aoc3RydWN0IHVzYmhzZ191ZXAgKnVlcCwKQEAgLTIzOSwyODggKzE1NCw5MCBAQAogCXN0cnVjdCB1c2Joc19waXBlICpwaXBlID0gdXNiaHNnX3VlcF90b19waXBlKHVlcCk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNnX2dwcml2X3RvX2RldihncHJpdik7CiAKLQkvKgotCSAqKioqKioqKiogIGFzc3VtZSB1bmRlciBzcGluIGxvY2sgICoqKioqKioqKgotCSAqLwotCi0JLyoKLQkgKiBDQVVUSU9OIFsqcmVxdWVzdCBjb21wbGV0ZSpdCi0JICoKLQkgKiBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IG5vdCB0byBiZSBjYWxsZWQgaW4gY29ycmVjdCBvcmRlcgotCSAqIGlmICJjb21wbGV0ZSIgaXMgY2FsbGVkIHdpdGhvdXQgc3BpbmxvY2suCi0JICoKLQkgKiBTbywgdGhpcyBmdW5jdGlvbiBhc3N1bWUgaXQgaXMgdW5kZXIgc3BpbmxvY2ssCi0JICogYW5kIGNhbGwgdXNiX3JlcXVlc3QgOjogY29tcGxldGUuCi0JICoKLQkgKiBCdXQgdGhpcyAiY29tcGxldGUiIHdpbGwgcHVzaCBuZXh0IHVzYl9yZXF1ZXN0LgotCSAqIEl0IG1lYW4gInVzYl9lcF9vcHMgOjogcXVldWUiIHdoaWNoIGlzIHVzaW5nIHNwaW5sb2NrIGlzIGNhbGxlZAotCSAqIHVuZGVyIHNwaW5sb2NrLgotCSAqCi0JICogVG8gYXZvaWQgZGVhZC1sb2NrLCB0aGlzIGRyaXZlciBpcyB1c2luZyB1c2Joc2dfdHJ5bG9jay4KLQkgKiAgIENBVVRJT04gWyplbmRwb2ludCBxdWV1ZSpdCi0JICogICBDQVVUSU9OIFsqcXVldWUgaGFuZGxlcipdCi0JICovCi0KIAlkZXZfZGJnKGRldiwgInBpcGUgJWQgOiBxdWV1ZSBwb3BcbiIsIHVzYmhzX3BpcGVfbnVtYmVyKHBpcGUpKTsKIAotCWxpc3RfZGVsX2luaXQoJnVyZXEtPm5vZGUpOwotCiAJdXJlcS0+cmVxLnN0YXR1cyA9IHN0YXR1czsKIAl1cmVxLT5yZXEuY29tcGxldGUoJnVlcC0+ZXAsICZ1cmVxLT5yZXEpOwotCi0JLyogbW9yZSByZXF1ZXN0ID8gKi8KLQlpZiAoMCA9PSBzdGF0dXMpCi0JCXVzYmhzZ19xdWV1ZV9wcmVwYXJlKHVlcCk7CiB9CiAKLS8qCi0gKgkJaXJxIGVuYWJsZS9kaXNhYmxlIGZ1bmN0aW9uCi0gKi8KLSNkZWZpbmUgdXNiaHNnX2lycV9jYWxsYmFja19jdHJsKHVlcCwgc3RhdHVzLCBlbmFibGUpCQkJXAotCSh7CQkJCQkJCQlcCi0JCXN0cnVjdCB1c2Joc2dfZ3ByaXYgKmdwcml2ID0gdXNiaHNnX3VlcF90b19ncHJpdih1ZXApOwlcCi0JCXN0cnVjdCB1c2Joc19waXBlICpwaXBlID0gdXNiaHNnX3VlcF90b19waXBlKHVlcCk7CVwKLQkJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc2dfZ3ByaXZfdG9fcHJpdihncHJpdik7CVwKLQkJc3RydWN0IHVzYmhzX21vZCAqbW9kID0gdXNiaHNfbW9kX2dldF9jdXJyZW50KHByaXYpOwlcCi0JCWlmICghbW9kKQkJCQkJCVwKLQkJCXJldHVybjsJCQkJCQlcCi0JCWlmIChlbmFibGUpCQkJCQkJXAotCQkJbW9kLT5pcnFfIyNzdGF0dXMgfD0gKDEgPDwgdXNiaHNfcGlwZV9udW1iZXIocGlwZSkpOyBcCi0JCWVsc2UJCQkJCQkJXAotCQkJbW9kLT5pcnFfIyNzdGF0dXMgJj0gfigxIDw8IHVzYmhzX3BpcGVfbnVtYmVyKHBpcGUpKTsgXAotCQl1c2Joc19pcnFfY2FsbGJhY2tfdXBkYXRlKHByaXYsIG1vZCk7CQkJXAotCX0pCi0KLXN0YXRpYyB2b2lkIHVzYmhzZ19pcnFfZW1wdHlfY3RybChzdHJ1Y3QgdXNiaHNnX3VlcCAqdWVwLCBpbnQgZW5hYmxlKQorc3RhdGljIHZvaWQgdXNiaHNnX3F1ZXVlX2RvbmUoc3RydWN0IHVzYmhzX3BrdCAqcGt0KQogewotCXVzYmhzZ19pcnFfY2FsbGJhY2tfY3RybCh1ZXAsIGJlbXBzdHMsIGVuYWJsZSk7Ci19CisJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSBwa3QtPnBpcGU7CisJc3RydWN0IHVzYmhzZ191ZXAgKnVlcCA9IHVzYmhzZ19waXBlX3RvX3VlcChwaXBlKTsKKwlzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QgKnVyZXEgPSB1c2Joc2dfcGt0X3RvX3VyZXEocGt0KTsKIAotc3RhdGljIHZvaWQgdXNiaHNnX2lycV9yZWFkeV9jdHJsKHN0cnVjdCB1c2Joc2dfdWVwICp1ZXAsIGludCBlbmFibGUpCi17Ci0JdXNiaHNnX2lycV9jYWxsYmFja19jdHJsKHVlcCwgYnJkeXN0cywgZW5hYmxlKTsKLX0KKwl1cmVxLT5yZXEuYWN0dWFsID0gcGt0LT5hY3R1YWw7CiAKLS8qCi0gKgkJaGFuZGxlciBmdW5jdGlvbgotICovCi1zdGF0aWMgaW50IHVzYmhzZ190cnlfcnVuX2N0cmxfc3RhZ2VfZW5kKHN0cnVjdCB1c2Joc2dfdWVwICp1ZXAsCi0JCQkJCSBzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QgKnVyZXEpCi17Ci0Jc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSB1c2Joc2dfdWVwX3RvX3BpcGUodWVwKTsKLQotCS8qCi0JICoqKioqKioqKiAgYXNzdW1lIHVuZGVyIHNwaW4gbG9jayAgKioqKioqKioqCi0JICovCi0KLQl1c2Joc19kY3BfY29udHJvbF90cmFuc2Zlcl9kb25lKHBpcGUpOwogCXVzYmhzZ19xdWV1ZV9wb3AodWVwLCB1cmVxLCAwKTsKLQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVzYmhzZ190cnlfcnVuX3NlbmRfcGFja2V0KHN0cnVjdCB1c2Joc2dfdWVwICp1ZXAsCi0JCQkJICAgICAgc3RydWN0IHVzYmhzZ19yZXF1ZXN0ICp1cmVxKQotewotCXN0cnVjdCB1c2Joc19waXBlICpwaXBlID0gdXNiaHNnX3VlcF90b19waXBlKHVlcCk7Ci0Jc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEgPSAmdXJlcS0+cmVxOwotCXN0cnVjdCB1c2Joc2dfZ3ByaXYgKmdwcml2ID0gdXNiaHNnX3VlcF90b19ncHJpdih1ZXApOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVzYmhzZ19ncHJpdl90b19kZXYoZ3ByaXYpOwotCXZvaWQgKmJ1ZjsKLQlpbnQgcmVtYWluZGVyLCBzZW5kOwotCWludCBpc19kb25lID0gMDsKLQlpbnQgZW5hYmxlOwotCWludCBtYXhwOwotCi0JLyoKLQkgKioqKioqKioqICBhc3N1bWUgdW5kZXIgc3BpbiBsb2NrICAqKioqKioqKioKLQkgKi8KLQotCW1heHAJCT0gdXNiaHNfcGlwZV9nZXRfbWF4cGFja2V0KHBpcGUpOwotCWJ1ZgkJPSByZXEtPmJ1ZiAgICArIHJlcS0+YWN0dWFsOwotCXJlbWFpbmRlcgk9IHJlcS0+bGVuZ3RoIC0gcmVxLT5hY3R1YWw7Ci0KLQlzZW5kID0gdXNiaHNfZmlmb193cml0ZShwaXBlLCBidWYsIHJlbWFpbmRlcik7Ci0KLQkvKgotCSAqIHNlbmQgPCAwIDogcGlwZSBidXN5Ci0JICogc2VuZCA9IDAgOiBzZW5kIHplcm8gcGFja2V0Ci0JICogc2VuZCA+IDAgOiBzZW5kIGRhdGEKLQkgKgotCSAqIHNlbmQgPD0gbWF4X3BhY2tldAotCSAqLwotCWlmIChzZW5kID4gMCkKLQkJcmVxLT5hY3R1YWwgKz0gc2VuZDsKLQotCS8qIHNlbmQgYWxsIHBhY2tldCA/ICovCi0JaWYgKHNlbmQgPCByZW1haW5kZXIpCi0JCWlzX2RvbmUgPSAwOwkJLyogdGhlcmUgYXJlIHJlbWFpbmRlciBkYXRhICovCi0JZWxzZSBpZiAoc2VuZCA8IG1heHApCi0JCWlzX2RvbmUgPSAxOwkJLyogc2hvcnQgcGFja2V0ICovCi0JZWxzZQotCQlpc19kb25lID0gIXJlcS0+emVybzsJLyogc2VuZCB6ZXJvIHBhY2tldCA/ICovCi0KLQlkZXZfZGJnKGRldiwgIiAgc2VuZCAlZCAoJWQvICVkLyAlZC8gJWQpXG4iLAotCQl1c2Joc19waXBlX251bWJlcihwaXBlKSwKLQkJcmVtYWluZGVyLCBzZW5kLCBpc19kb25lLCByZXEtPnplcm8pOwotCi0JLyoKLQkgKiBlbmFibGUgaW50ZXJydXB0IGFuZCBzZW5kIGFnYWluIGluIGlycSBoYW5kbGVyCi0JICogaWYgaXQgc3RpbGwgaGF2ZSByZW1haW5kZXIgZGF0YSB3aGljaCBzaG91bGQgYmUgc2VudC4KLQkgKi8KLQllbmFibGUgPSAhaXNfZG9uZTsKLQl1ZXAtPmhhbmRsZXItPmlycV9tYXNrKHVlcCwgZW5hYmxlKTsKLQotCS8qCi0JICogdXNiaHNfZmlmb19lbmFibGUgZXhlY3V0ZQotCSAqICAtIGFmdGVyIGNhbGxiYWNrX3VwZGF0ZSwKLQkgKiAgLSBiZWZvcmUgcXVldWVfcG9wIC8gc3RhZ2VfZW5kCi0JICovCi0JdXNiaHNfZmlmb19lbmFibGUocGlwZSk7Ci0KLQkvKgotCSAqIGFsbCBkYXRhIHdlcmUgc2VudCA/Ci0JICovCi0JaWYgKGlzX2RvbmUpIHsKLQkJLyogaXQgY2FyZSBiZWxvdyBjYWxsIGluCi0JCSAgICJmdW5jdGlvbiBtb2RlIiAqLwotCQlpZiAodXNiaHNnX2lzX2RjcCh1ZXApKQotCQkJdXNiaHNfZGNwX2NvbnRyb2xfdHJhbnNmZXJfZG9uZShwaXBlKTsKLQotCQl1c2Joc2dfcXVldWVfcG9wKHVlcCwgdXJlcSwgMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiaHNnX3ByZXBhcmVfc2VuZF9wYWNrZXQoc3RydWN0IHVzYmhzZ191ZXAgKnVlcCwKLQkJCQkgICAgICBzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QgKnVyZXEpCi17Ci0Jc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSB1c2Joc2dfdWVwX3RvX3BpcGUodWVwKTsKLQotCS8qCi0JICoqKioqKioqKiAgYXNzdW1lIHVuZGVyIHNwaW4gbG9jayAgKioqKioqKioqCi0JICovCi0KLQl1c2Joc19maWZvX3ByZXBhcmVfd3JpdGUocGlwZSk7Ci0JdXNiaHNnX3RyeV9ydW5fc2VuZF9wYWNrZXQodWVwLCB1cmVxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYmhzZ190cnlfcnVuX3JlY2VpdmVfcGFja2V0KHN0cnVjdCB1c2Joc2dfdWVwICp1ZXAsCi0JCQkJCSBzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QgKnVyZXEpCi17Ci0Jc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSB1c2Joc2dfdWVwX3RvX3BpcGUodWVwKTsKLQlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9ICZ1cmVxLT5yZXE7Ci0Jc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfdWVwX3RvX2dwcml2KHVlcCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNnX2dwcml2X3RvX2RldihncHJpdik7Ci0Jdm9pZCAqYnVmOwotCWludCBtYXhwOwotCWludCByZW1haW5kZXIsIHJlY3Y7Ci0JaW50IGlzX2RvbmUgPSAwOwotCi0JLyoKLQkgKioqKioqKioqICBhc3N1bWUgdW5kZXIgc3BpbiBsb2NrICAqKioqKioqKioKLQkgKi8KLQotCW1heHAJCT0gdXNiaHNfcGlwZV9nZXRfbWF4cGFja2V0KHBpcGUpOwotCWJ1ZgkJPSByZXEtPmJ1ZiAgICArIHJlcS0+YWN0dWFsOwotCXJlbWFpbmRlcgk9IHJlcS0+bGVuZ3RoIC0gcmVxLT5hY3R1YWw7Ci0KLQlyZWN2ID0gdXNiaHNfZmlmb19yZWFkKHBpcGUsIGJ1ZiwgcmVtYWluZGVyKTsKLQkvKgotCSAqIHJlY3YgPCAwICA6IHBpcGUgYnVzeQotCSAqIHJlY3YgPj0gMCA6IHJlY2VpdmUgZGF0YQotCSAqCi0JICogcmVjdiA8PSBtYXhfcGFja2V0Ci0JICovCi0JaWYgKHJlY3YgPCAwKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JLyogdXBkYXRlIHBhcmFtZXRlcnMgKi8KLQlyZXEtPmFjdHVhbCArPSByZWN2OwotCi0JaWYgKChyZWN2ID09IHJlbWFpbmRlcikgfHwJLyogcmVjZWl2ZSBhbGwgZGF0YSAqLwotCSAgICAocmVjdiA8IG1heHApKQkJLyogc2hvcnQgcGFja2V0ICovCi0JCWlzX2RvbmUgPSAxOwotCi0JZGV2X2RiZyhkZXYsICIgIHJlY3YgJWQgKCVkLyAlZC8gJWQvICVkKVxuIiwKLQkJdXNiaHNfcGlwZV9udW1iZXIocGlwZSksCi0JCXJlbWFpbmRlciwgcmVjdiwgaXNfZG9uZSwgcmVxLT56ZXJvKTsKLQotCS8qIHJlYWQgYWxsIGRhdGEgPyAqLwotCWlmIChpc19kb25lKSB7Ci0JCWludCBkaXNhYmxlID0gMDsKLQotCQl1ZXAtPmhhbmRsZXItPmlycV9tYXNrKHVlcCwgZGlzYWJsZSk7Ci0JCXVzYmhzX2ZpZm9fZGlzYWJsZShwaXBlKTsKLQkJdXNiaHNnX3F1ZXVlX3BvcCh1ZXAsIHVyZXEsIDApOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYmhzZ19wcmVwYXJlX3JlY2VpdmVfcGFja2V0KHN0cnVjdCB1c2Joc2dfdWVwICp1ZXAsCi0JCQkJCSBzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QgKnVyZXEpCi17Ci0Jc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSB1c2Joc2dfdWVwX3RvX3BpcGUodWVwKTsKLQlpbnQgZW5hYmxlID0gMTsKLQlpbnQgcmV0OwotCi0JLyoKLQkgKioqKioqKioqICBhc3N1bWUgdW5kZXIgc3BpbiBsb2NrICAqKioqKioqKioKLQkgKi8KLQotCXJldCA9IHVzYmhzX2ZpZm9fcHJlcGFyZV9yZWFkKHBpcGUpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyoKLQkgKiBkYXRhIHdpbGwgYmUgcmVhZCBpbiBpbnRlcnJ1cHQgaGFuZGxlcgotCSAqLwotCXVlcC0+aGFuZGxlci0+aXJxX21hc2sodWVwLCBlbmFibGUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCB1c2Joc2dfcGlwZV9oYW5kbGUgdXNiaHNnX2hhbmRsZXJfc2VuZF9ieV9lbXB0eSA9IHsKLQkucHJlcGFyZQk9IHVzYmhzZ19wcmVwYXJlX3NlbmRfcGFja2V0LAotCS50cnlfcnVuCT0gdXNiaHNnX3RyeV9ydW5fc2VuZF9wYWNrZXQsCi0JLmlycV9tYXNrCT0gdXNiaHNnX2lycV9lbXB0eV9jdHJsLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2Joc2dfcGlwZV9oYW5kbGUgdXNiaHNnX2hhbmRsZXJfc2VuZF9ieV9yZWFkeSA9IHsKLQkucHJlcGFyZQk9IHVzYmhzZ19wcmVwYXJlX3NlbmRfcGFja2V0LAotCS50cnlfcnVuCT0gdXNiaHNnX3RyeV9ydW5fc2VuZF9wYWNrZXQsCi0JLmlycV9tYXNrCT0gdXNiaHNnX2lycV9yZWFkeV9jdHJsLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2Joc2dfcGlwZV9oYW5kbGUgdXNiaHNnX2hhbmRsZXJfcmVjdl9ieV9yZWFkeSA9IHsKLQkucHJlcGFyZQk9IHVzYmhzZ19wcmVwYXJlX3JlY2VpdmVfcGFja2V0LAotCS50cnlfcnVuCT0gdXNiaHNnX3RyeV9ydW5fcmVjZWl2ZV9wYWNrZXQsCi0JLmlycV9tYXNrCT0gdXNiaHNnX2lycV9yZWFkeV9jdHJsLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2Joc2dfcGlwZV9oYW5kbGUgdXNiaHNnX2hhbmRsZXJfY3RybF9zdGFnZV9lbmQgPSB7Ci0JLnByZXBhcmUJPSB1c2Joc2dfdHJ5X3J1bl9jdHJsX3N0YWdlX2VuZCwKLQkudHJ5X3J1bgk9IHVzYmhzZ190cnlfcnVuX2N0cmxfc3RhZ2VfZW5kLAotfTsKLQogLyoKLSAqIERDUCBwaXBlIGNhbiBOT1QgdXNlICJyZWFkeSBpbnRlcnJ1cHQiIGZvciAic2VuZCIKLSAqIGl0IHNob3VsZCB1c2UgImVtcHR5IiBpbnRlcnJ1cHQuCi0gKiBzZWUKLSAqICAgIk9wZXJhdGlvbiIgLSAiSW50ZXJydXB0IEZ1bmN0aW9uIiAtICJCUkRZIEludGVycnVwdCIKLSAqCi0gKiBvbiB0aGUgb3RoZXIgaGFuZCwgbm9ybWFsIHBpcGUgY2FuIHVzZSAicmVhZHkgaW50ZXJydXB0IiBmb3IgInNlbmQiCi0gKiBldmVuIHRob3VnaCBpdCBpcyBzaW5nbGUvZG91YmxlIGJ1ZmZlcgorICoJCWRtYSBtYXAvdW5tYXAKICAqLwotI2RlZmluZSB1c2Joc2dfaGFuZGxlcl9zZW5kX2N0cmwJdXNiaHNnX2hhbmRsZXJfc2VuZF9ieV9lbXB0eQotI2RlZmluZSB1c2Joc2dfaGFuZGxlcl9yZWN2X2N0cmwJdXNiaHNnX2hhbmRsZXJfcmVjdl9ieV9yZWFkeQorc3RhdGljIGludCB1c2Joc2dfZG1hX21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCB1c2Joc19wa3QgKnBrdCwKKwkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCB1c2Joc2dfcmVxdWVzdCAqdXJlcSA9IHVzYmhzZ19wa3RfdG9fdXJlcShwa3QpOworCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxID0gJnVyZXEtPnJlcTsKIAotI2RlZmluZSB1c2Joc2dfaGFuZGxlcl9zZW5kX3BhY2tldAl1c2Joc2dfaGFuZGxlcl9zZW5kX2J5X3JlYWR5Ci0jZGVmaW5lIHVzYmhzZ19oYW5kbGVyX3JlY3ZfcGFja2V0CXVzYmhzZ19oYW5kbGVyX3JlY3ZfYnlfcmVhZHkKKwlpZiAocGt0LT5kbWEgIT0gRE1BX0FERFJfSU5WQUxJRCkgeworCQlkZXZfZXJyKGRldiwgImRtYSBpcyBhbHJlYWR5IG1hcHBlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChyZXEtPmRtYSA9PSBETUFfQUREUl9JTlZBTElEKSB7CisJCXBrdC0+ZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LCBwa3QtPmJ1ZiwgcGt0LT5sZW5ndGgsIGRpcik7CisJfSBlbHNlIHsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCByZXEtPmRtYSwgcmVxLT5sZW5ndGgsIGRpcik7CisJCXBrdC0+ZG1hID0gcmVxLT5kbWE7CisJfQorCisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgcGt0LT5kbWEpKSB7CisJCWRldl9lcnIoZGV2LCAiZG1hIG1hcHBpbmcgZXJyb3IgJXhcbiIsIHBrdC0+ZG1hKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiaHNnX2RtYV91bm1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IHVzYmhzX3BrdCAqcGt0LAorCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QgKnVyZXEgPSB1c2Joc2dfcGt0X3RvX3VyZXEocGt0KTsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9ICZ1cmVxLT5yZXE7CisKKwlpZiAocGt0LT5kbWEgPT0gRE1BX0FERFJfSU5WQUxJRCkgeworCQlkZXZfZXJyKGRldiwgImRtYSBpcyBub3QgbWFwcGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHJlcS0+ZG1hID09IERNQV9BRERSX0lOVkFMSUQpCisJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBwa3QtPmRtYSwgcGt0LT5sZW5ndGgsIGRpcik7CisJZWxzZQorCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYsIHJlcS0+ZG1hLCByZXEtPmxlbmd0aCwgZGlyKTsKKworCXBrdC0+ZG1hID0gRE1BX0FERFJfSU5WQUxJRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmhzZ19kbWFfbWFwX2N0cmwoc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgbWFwKQoreworCXN0cnVjdCB1c2Joc19waXBlICpwaXBlID0gcGt0LT5waXBlOworCXN0cnVjdCB1c2Joc2dfdWVwICp1ZXAgPSB1c2Joc2dfcGlwZV90b191ZXAocGlwZSk7CisJc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfdWVwX3RvX2dwcml2KHVlcCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNnX2dwcml2X3RvX2RldihncHJpdik7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCisJZGlyID0gdXNiaHNfcGlwZV9pc19kaXJfaW4ocGlwZSkgPyBETUFfRlJPTV9ERVZJQ0UgOiBETUFfVE9fREVWSUNFOworCisJaWYgKG1hcCkKKwkJcmV0dXJuIHVzYmhzZ19kbWFfbWFwKGRldiwgcGt0LCBkaXIpOworCWVsc2UKKwkJcmV0dXJuIHVzYmhzZ19kbWFfdW5tYXAoZGV2LCBwa3QsIGRpcik7Cit9CiAKIC8qCiAgKgkJVVNCX1RZUEVfU1RBTkRBUkQgLyBjbGVhciBmZWF0dXJlIGZ1bmN0aW9ucwpAQCAtNTQ2LDE1ICsyNjMsMTMgQEAKIAlzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSA9IHVzYmhzZ191ZXBfdG9fcGlwZSh1ZXApOwogCiAJaWYgKCF1c2Joc2dfc3RhdHVzX2hhcyhncHJpdiwgVVNCSFNHX1NUQVRVU19XRURHRSkpIHsKLQkJdXNiaHNfZmlmb19kaXNhYmxlKHBpcGUpOworCQl1c2Joc19waXBlX2Rpc2FibGUocGlwZSk7CiAJCXVzYmhzX3BpcGVfY2xlYXJfc2VxdWVuY2UocGlwZSk7Ci0JCXVzYmhzX2ZpZm9fZW5hYmxlKHBpcGUpOworCQl1c2Joc19waXBlX2VuYWJsZShwaXBlKTsKIAl9CiAKIAl1c2Joc2dfcmVjaXBfaGFuZGxlcl9zdGRfY29udHJvbF9kb25lKHByaXYsIHVlcCwgY3RybCk7CiAKLQl1c2Joc2dfcXVldWVfcHJlcGFyZSh1ZXApOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU3NSw2ICsyOTAsNyBAQAogCXN0cnVjdCB1c2Joc2dfZ3ByaXYgKmdwcml2ID0gdXNiaHNnX3ByaXZfdG9fZ3ByaXYocHJpdik7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNnX2dwcml2X3RvX2RldihncHJpdik7CiAJc3RydWN0IHVzYmhzZ191ZXAgKnVlcDsKKwlzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZTsKIAlpbnQgcmVjaXAgPSBjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSzsKIAlpbnQgbnRoID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KSAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKIAlpbnQgcmV0OwpAQCAtNTgzLDkgKzI5OSwxMSBAQAogCWNoYXIgKm1zZzsKIAogCXVlcCA9IHVzYmhzZ19ncHJpdl90b19udGhfdWVwKGdwcml2LCBudGgpOwotCWlmICghdXNiaHNnX3VlcF90b19waXBlKHVlcCkpIHsKKwlwaXBlID0gdXNiaHNnX3VlcF90b19waXBlKHVlcCk7CisJaWYgKCFwaXBlKSB7CiAJCWRldl9lcnIoZGV2LCAid3JvbmcgcmVjaXAgcmVxdWVzdFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVzYmhzZ19yZWNpcF9ydW5faGFuZGxlX2VuZDsKIAl9CiAKIAlzd2l0Y2ggKHJlY2lwKSB7CkBAIC02MDgsMTAgKzMyNiwyMCBAQAogCX0KIAogCWlmIChmdW5jKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAkJZGV2X2RiZyhkZXYsICIlcyAocGlwZSAlZCA6JXMpXG4iLCBoYW5kbGVyLT5uYW1lLCBudGgsIG1zZyk7CisKKwkJLyoqKioqKioqKioqKioqKioqKioqICBzcGluIGxvY2sgKioqKioqKioqKioqKioqKioqKiovCisJCXVzYmhzX2xvY2socHJpdiwgZmxhZ3MpOwogCQlyZXQgPSBmdW5jKHByaXYsIHVlcCwgY3RybCk7CisJCXVzYmhzX3VubG9jayhwcml2LCBmbGFncyk7CisJCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiB1bmxvY2sgKioqKioqKioqKioqKioqKioqLwogCX0KIAordXNiaHNnX3JlY2lwX3J1bl9oYW5kbGVfZW5kOgorCXVzYmhzX3BrdF9zdGFydChwaXBlKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY2MCwxMyArMzg4LDEzIEBACiAKIAlzd2l0Y2ggKHN0YWdlKSB7CiAJY2FzZSBSRUFEX0RBVEFfU1RBR0U6Ci0JCWRjcC0+aGFuZGxlciA9ICZ1c2Joc2dfaGFuZGxlcl9zZW5kX2N0cmw7CisJCWRjcC0+aGFuZGxlciA9ICZ1c2Joc19maWZvX3Bpb19wdXNoX2hhbmRsZXI7CiAJCWJyZWFrOwogCWNhc2UgV1JJVEVfREFUQV9TVEFHRToKLQkJZGNwLT5oYW5kbGVyID0gJnVzYmhzZ19oYW5kbGVyX3JlY3ZfY3RybDsKKwkJZGNwLT5oYW5kbGVyID0gJnVzYmhzX2ZpZm9fcGlvX3BvcF9oYW5kbGVyOwogCQlicmVhazsKIAljYXNlIE5PREFUQV9TVEFUVVNfU1RBR0U6Ci0JCWRjcC0+aGFuZGxlciA9ICZ1c2Joc2dfaGFuZGxlcl9jdHJsX3N0YWdlX2VuZDsKKwkJZGNwLT5oYW5kbGVyID0gJnVzYmhzX2N0cmxfc3RhZ2VfZW5kX2hhbmRsZXI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiByZXQ7CkBAIC02OTUsMTI4ICs0MjMsMjcgQEAKIAkJcmV0ID0gZ3ByaXYtPmRyaXZlci0+c2V0dXAoJmdwcml2LT5nYWRnZXQsICZjdHJsKTsKIAogCWlmIChyZXQgPCAwKQotCQl1c2Joc19maWZvX3N0YWxsKHBpcGUpOworCQl1c2Joc19waXBlX3N0YWxsKHBpcGUpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB1c2Joc2dfaXJxX2VtcHR5KHN0cnVjdCB1c2Joc19wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCB1c2Joc19pcnFfc3RhdGUgKmlycV9zdGF0ZSkKLXsKLQlzdHJ1Y3QgdXNiaHNnX2dwcml2ICpncHJpdiA9IHVzYmhzZ19wcml2X3RvX2dwcml2KHByaXYpOwotCXN0cnVjdCB1c2Joc2dfdWVwICp1ZXA7Ci0Jc3RydWN0IHVzYmhzX3BpcGUgKnBpcGU7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNnX2dwcml2X3RvX2RldihncHJpdik7Ci0JaW50IGksIHJldDsKLQotCWlmICghaXJxX3N0YXRlLT5iZW1wc3RzKSB7Ci0JCWRldl9lcnIoZGV2LCAiZGVidWcgJXMgISFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JZGV2X2RiZyhkZXYsICJpcnEgZW1wdHkgWzB4JTA0eF1cbiIsIGlycV9zdGF0ZS0+YmVtcHN0cyk7Ci0KLQkvKgotCSAqIHNlYXJjaCBpbnRlcnJ1cHRlZCAicGlwZSIKLQkgKiBub3QgInVlcCIuCi0JICovCi0JdXNiaHNfZm9yX2VhY2hfcGlwZV93aXRoX2RjcChwaXBlLCBwcml2LCBpKSB7Ci0JCWlmICghKGlycV9zdGF0ZS0+YmVtcHN0cyAmICgxIDw8IGkpKSkKLQkJCWNvbnRpbnVlOwotCi0JCXVlcAk9IHVzYmhzZ19waXBlX3RvX3VlcChwaXBlKTsKLQkJcmV0CT0gdXNiaHNnX3F1ZXVlX2hhbmRsZSh1ZXApOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl9lcnIoZGV2LCAic2VuZCBlcnJvciAlZCA6ICVkXG4iLCBpLCByZXQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYmhzZ19pcnFfcmVhZHkoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IHVzYmhzX2lycV9zdGF0ZSAqaXJxX3N0YXRlKQotewotCXN0cnVjdCB1c2Joc2dfZ3ByaXYgKmdwcml2ID0gdXNiaHNnX3ByaXZfdG9fZ3ByaXYocHJpdik7Ci0Jc3RydWN0IHVzYmhzZ191ZXAgKnVlcDsKLQlzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1c2Joc2dfZ3ByaXZfdG9fZGV2KGdwcml2KTsKLQlpbnQgaSwgcmV0OwotCi0JaWYgKCFpcnFfc3RhdGUtPmJyZHlzdHMpIHsKLQkJZGV2X2VycihkZXYsICJkZWJ1ZyAlcyAhIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlkZXZfZGJnKGRldiwgImlycSByZWFkeSBbMHglMDR4XVxuIiwgaXJxX3N0YXRlLT5icmR5c3RzKTsKLQotCS8qCi0JICogc2VhcmNoIGludGVycnVwdGVkICJwaXBlIgotCSAqIG5vdCAidWVwIi4KLQkgKi8KLQl1c2Joc19mb3JfZWFjaF9waXBlX3dpdGhfZGNwKHBpcGUsIHByaXYsIGkpIHsKLQkJaWYgKCEoaXJxX3N0YXRlLT5icmR5c3RzICYgKDEgPDwgaSkpKQotCQkJY29udGludWU7Ci0KLQkJdWVwCT0gdXNiaHNnX3BpcGVfdG9fdWVwKHBpcGUpOwotCQlyZXQJPSB1c2Joc2dfcXVldWVfaGFuZGxlKHVlcCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZGV2X2VycihkZXYsICJyZWNlaXZlIGVycm9yICVkIDogJWRcbiIsIGksIHJldCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKgogICoJCXVzYl9kY3Bfb3BzCiAgKgogICovCi1zdGF0aWMgaW50IHVzYmhzZ19kY3BfZW5hYmxlKHN0cnVjdCB1c2Joc2dfdWVwICp1ZXApCi17Ci0Jc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfdWVwX3RvX2dwcml2KHVlcCk7Ci0Jc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc2dfZ3ByaXZfdG9fcHJpdihncHJpdik7Ci0Jc3RydWN0IHVzYmhzX3BpcGUgKnBpcGU7Ci0KLQkvKgotCSAqKioqKioqKiogIGFzc3VtZSB1bmRlciBzcGluIGxvY2sgICoqKioqKioqKgotCSAqLwotCi0JcGlwZSA9IHVzYmhzX2RjcF9tYWxsb2MocHJpdik7Ci0JaWYgKCFwaXBlKQotCQlyZXR1cm4gLUVJTzsKLQotCXVlcC0+cGlwZQkJPSBwaXBlOwotCXVlcC0+cGlwZS0+bW9kX3ByaXZhdGUJPSB1ZXA7Ci0JSU5JVF9MSVNUX0hFQUQoJnVlcC0+bGlzdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSB1c2Joc2dfZGNwX2Rpc2FibGUgdXNiaHNnX3BpcGVfZGlzYWJsZQogc3RhdGljIGludCB1c2Joc2dfcGlwZV9kaXNhYmxlKHN0cnVjdCB1c2Joc2dfdWVwICp1ZXApCiB7CiAJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSB1c2Joc2dfdWVwX3RvX3BpcGUodWVwKTsKLQlzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QgKnVyZXE7Ci0JaW50IGRpc2FibGUgPSAwOworCXN0cnVjdCB1c2Joc19wa3QgKnBrdDsKIAotCS8qCi0JICoqKioqKioqKiAgYXNzdW1lIHVuZGVyIHNwaW4gbG9jayAgKioqKioqKioqCi0JICovCi0KLQl1c2Joc19maWZvX2Rpc2FibGUocGlwZSk7Ci0KLQkvKgotCSAqIGRpc2FibGUgcGlwZSBpcnEKLQkgKi8KLQl1c2Joc2dfaXJxX2VtcHR5X2N0cmwodWVwLCBkaXNhYmxlKTsKLQl1c2Joc2dfaXJxX3JlYWR5X2N0cmwodWVwLCBkaXNhYmxlKTsKKwl1c2Joc19waXBlX2Rpc2FibGUocGlwZSk7CiAKIAl3aGlsZSAoMSkgewotCQl1cmVxID0gdXNiaHNnX3F1ZXVlX2dldCh1ZXApOwotCQlpZiAoIXVyZXEpCisJCXBrdCA9IHVzYmhzX3BrdF9wb3AocGlwZSwgTlVMTCk7CisJCWlmICghcGt0KQogCQkJYnJlYWs7Ci0KLQkJdXNiaHNnX3F1ZXVlX3BvcCh1ZXAsIHVyZXEsIC1FQ09OTlJFU0VUKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTg0Myw1NyArNDcwLDQ0IEBACiAJc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfdWVwX3RvX2dwcml2KHVlcCk7CiAJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc2dfZ3ByaXZfdG9fcHJpdihncHJpdik7CiAJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGU7Ci0Jc3BpbmxvY2tfdCAqbG9jazsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAtRUlPOwogCiAJLyoKIAkgKiBpZiBpdCBhbHJlYWR5IGhhdmUgcGlwZSwKIAkgKiBub3RoaW5nIHRvIGRvCiAJICovCi0JaWYgKHVlcC0+cGlwZSkKKwlpZiAodWVwLT5waXBlKSB7CisJCXVzYmhzX3BpcGVfY2xlYXIodWVwLT5waXBlKTsKKwkJdXNiaHNfcGlwZV9jbGVhcl9zZXF1ZW5jZSh1ZXAtPnBpcGUpOwogCQlyZXR1cm4gMDsKLQotCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiBsb2NrICoqKioqKioqKioqKioqKioqKioqLwotCWxvY2sgPSB1c2Joc2dfdHJ5bG9jayhncHJpdiwgJmZsYWdzKTsKKwl9CiAKIAlwaXBlID0gdXNiaHNfcGlwZV9tYWxsb2MocHJpdiwgZGVzYyk7CiAJaWYgKHBpcGUpIHsKIAkJdWVwLT5waXBlCQk9IHBpcGU7CiAJCXBpcGUtPm1vZF9wcml2YXRlCT0gdWVwOwotCQlJTklUX0xJU1RfSEVBRCgmdWVwLT5saXN0KTsKIAorCQkvKgorCQkgKiB1c2Joc19maWZvX2RtYV9wdXNoL3BvcF9oYW5kbGVyIHRyeSB0bworCQkgKiB1c2UgZG1hZW5naW5lIGlmIHBvc3NpYmxlLgorCQkgKiBJdCB3aWxsIHVzZSBwaW8gaGFuZGxlciBpZiBpbXBvc3NpYmxlLgorCQkgKi8KIAkJaWYgKHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykpCi0JCQl1ZXAtPmhhbmRsZXIgPSAmdXNiaHNnX2hhbmRsZXJfc2VuZF9wYWNrZXQ7CisJCQl1ZXAtPmhhbmRsZXIgPSAmdXNiaHNfZmlmb19kbWFfcHVzaF9oYW5kbGVyOwogCQllbHNlCi0JCQl1ZXAtPmhhbmRsZXIgPSAmdXNiaHNnX2hhbmRsZXJfcmVjdl9wYWNrZXQ7CisJCQl1ZXAtPmhhbmRsZXIgPSAmdXNiaHNfZmlmb19kbWFfcG9wX2hhbmRsZXI7CiAKIAkJcmV0ID0gMDsKIAl9CiAKLQl1c2Joc2dfdW5sb2NrKGxvY2ssICZmbGFncyk7Ci0JLyoqKioqKioqKioqKioqKioqKioqICBzcGluIHVubG9jayAqKioqKioqKioqKioqKioqKiovCi0KIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHVzYmhzZ19lcF9kaXNhYmxlKHN0cnVjdCB1c2JfZXAgKmVwKQogewogCXN0cnVjdCB1c2Joc2dfdWVwICp1ZXAgPSB1c2Joc2dfZXBfdG9fdWVwKGVwKTsKLQlzdHJ1Y3QgdXNiaHNnX2dwcml2ICpncHJpdiA9IHVzYmhzZ191ZXBfdG9fZ3ByaXYodWVwKTsKLQlzcGlubG9ja190ICpsb2NrOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKIAotCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiBsb2NrICoqKioqKioqKioqKioqKioqKioqLwotCWxvY2sgPSB1c2Joc2dfdHJ5bG9jayhncHJpdiwgJmZsYWdzKTsKLQotCXJldCA9IHVzYmhzZ19waXBlX2Rpc2FibGUodWVwKTsKLQotCXVzYmhzZ191bmxvY2sobG9jaywgJmZsYWdzKTsKLQkvKioqKioqKioqKioqKioqKioqKiogIHNwaW4gdW5sb2NrICoqKioqKioqKioqKioqKioqKi8KLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHVzYmhzZ19waXBlX2Rpc2FibGUodWVwKTsKIH0KIAogc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqdXNiaHNnX2VwX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqZXAsCkBAIC05MDUsNyArNTE5LDEwIEBACiAJaWYgKCF1cmVxKQogCQlyZXR1cm4gTlVMTDsKIAotCUlOSVRfTElTVF9IRUFEKCZ1cmVxLT5ub2RlKTsKKwl1c2Joc19wa3RfaW5pdCh1c2Joc2dfdXJlcV90b19wa3QodXJlcSkpOworCisJdXJlcS0+cmVxLmRtYSA9IERNQV9BRERSX0lOVkFMSUQ7CisKIAlyZXR1cm4gJnVyZXEtPnJlcTsKIH0KIApAQCAtOTE0LDcgKzUzMSw3IEBACiB7CiAJc3RydWN0IHVzYmhzZ19yZXF1ZXN0ICp1cmVxID0gdXNiaHNnX3JlcV90b191cmVxKHJlcSk7CiAKLQlXQVJOX09OKCFsaXN0X2VtcHR5KCZ1cmVxLT5ub2RlKSk7CisJV0FSTl9PTighbGlzdF9lbXB0eSgmdXJlcS0+cGt0Lm5vZGUpKTsKIAlrZnJlZSh1cmVxKTsKIH0KIApAQCAtOTI1LDY5ICs1NDIsMjcgQEAKIAlzdHJ1Y3QgdXNiaHNnX2dwcml2ICpncHJpdiA9IHVzYmhzZ191ZXBfdG9fZ3ByaXYodWVwKTsKIAlzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QgKnVyZXEgPSB1c2Joc2dfcmVxX3RvX3VyZXEocmVxKTsKIAlzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSA9IHVzYmhzZ191ZXBfdG9fcGlwZSh1ZXApOwotCXNwaW5sb2NrX3QgKmxvY2s7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQotCS8qCi0JICogQ0FVVElPTiBbKmVuZHBvaW50IHF1ZXVlKl0KLQkgKgotCSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZnJvbSB1c2JfcmVxdWVzdCA6OiBjb21wbGV0ZQotCSAqIG9yIHVzYiBkcml2ZXIgdGltaW5nLgotCSAqIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdXNiX3JlcXVlc3QgOjogY29tcGxldGUsCi0JICogaXQgaXMgYWxyZWFkeSB1bmRlciBzcGlubG9jayBvbiB0aGlzIGRyaXZlci4KLQkgKiBidXQgaXQgaXMgY2FsbGVkIGZybSB1c2IgZHJpdmVyLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBjYWxsIHNwaW5sb2NrLgotCSAqCi0JICogVGhpcyBmdW5jdGlvbiBpcyB1c2luZyB1c2JzaGdfdHJ5bG9jayB0byBzb2x2ZSB0aGlzIGlzc3VlLgotCSAqIGlmICJpc19sb2NrZWQiIGlzIDEsIHRoaXMgbWVhbiB0aGlzIGZ1bmN0aW9uIGxvY2sgaXQuCi0JICogYnV0IGlmIGl0IGlzIDAsIHRoaXMgbWVhbiBpdCBpcyBhbHJlYWR5IHVuZGVyIHNwaW4gbG9jay4KLQkgKiBzZWUgYWxzbwotCSAqICAgQ0FVVElPTiBbKnF1ZXVlIGhhbmRsZXIqXQotCSAqICAgQ0FVVElPTiBbKnJlcXVlc3QgY29tcGxldGUqXQotCSAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqICBzcGluIGxvY2sgKioqKioqKioqKioqKioqKioqKiovCi0JbG9jayA9IHVzYmhzZ190cnlsb2NrKGdwcml2LCAmZmxhZ3MpOwogCiAJLyogcGFyYW0gY2hlY2sgKi8KIAlpZiAodXNiaHNnX2lzX25vdF9jb25uZWN0ZWQoZ3ByaXYpCXx8CiAJICAgIHVubGlrZWx5KCFncHJpdi0+ZHJpdmVyKQkJfHwKIAkgICAgdW5saWtlbHkoIXBpcGUpKQotCQlyZXQgPSAtRVNIVVRET1dOOwotCWVsc2UKLQkJdXNiaHNnX3F1ZXVlX3B1c2godWVwLCB1cmVxKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CiAKLQl1c2Joc2dfdW5sb2NrKGxvY2ssICZmbGFncyk7Ci0JLyoqKioqKioqKioqKioqKioqKioqICBzcGluIHVubG9jayAqKioqKioqKioqKioqKioqKiovCisJdXNiaHNnX3F1ZXVlX3B1c2godWVwLCB1cmVxKTsKIAotCXVzYmhzZ19xdWV1ZV9wcmVwYXJlKHVlcCk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHVzYmhzZ19lcF9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgdXNiaHNnX3VlcCAqdWVwID0gdXNiaHNnX2VwX3RvX3VlcChlcCk7CiAJc3RydWN0IHVzYmhzZ19yZXF1ZXN0ICp1cmVxID0gdXNiaHNnX3JlcV90b191cmVxKHJlcSk7Ci0Jc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfdWVwX3RvX2dwcml2KHVlcCk7Ci0Jc3BpbmxvY2tfdCAqbG9jazsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB1c2Joc19waXBlICpwaXBlID0gdXNiaHNnX3VlcF90b19waXBlKHVlcCk7CiAKLQkvKgotCSAqIHNlZQotCSAqICAgQ0FVVElPTiBbKnF1ZXVlIGhhbmRsZXIqXQotCSAqICAgQ0FVVElPTiBbKmVuZHBvaW50IHF1ZXVlKl0KLQkgKiAgIENBVVRJT04gWypyZXF1ZXN0IGNvbXBsZXRlKl0KLQkgKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiBsb2NrICoqKioqKioqKioqKioqKioqKioqLwotCWxvY2sgPSB1c2Joc2dfdHJ5bG9jayhncHJpdiwgJmZsYWdzKTsKLQorCXVzYmhzX3BrdF9wb3AocGlwZSwgdXNiaHNnX3VyZXFfdG9fcGt0KHVyZXEpKTsKIAl1c2Joc2dfcXVldWVfcG9wKHVlcCwgdXJlcSwgLUVDT05OUkVTRVQpOwogCi0JdXNiaHNnX3VubG9jayhsb2NrLCAmZmxhZ3MpOwotCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiB1bmxvY2sgKioqKioqKioqKioqKioqKioqLwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5Niw0MiArNTcxLDMyIEBACiAJc3RydWN0IHVzYmhzZ191ZXAgKnVlcCA9IHVzYmhzZ19lcF90b191ZXAoZXApOwogCXN0cnVjdCB1c2Joc19waXBlICpwaXBlID0gdXNiaHNnX3VlcF90b19waXBlKHVlcCk7CiAJc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfdWVwX3RvX2dwcml2KHVlcCk7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc2dfZ3ByaXZfdG9fcHJpdihncHJpdik7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNnX2dwcml2X3RvX2RldihncHJpdik7Ci0Jc3BpbmxvY2tfdCAqbG9jazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAtRUFHQUlOOwogCi0JLyoKLQkgKiBzZWUKLQkgKiAgIENBVVRJT04gWypxdWV1ZSBoYW5kbGVyKl0KLQkgKiAgIENBVVRJT04gWyplbmRwb2ludCBxdWV1ZSpdCi0JICogICBDQVVUSU9OIFsqcmVxdWVzdCBjb21wbGV0ZSpdCi0JICovCisJdXNiaHNnX3BpcGVfZGlzYWJsZSh1ZXApOworCisJZGV2X2RiZyhkZXYsICJzZXQgaGFsdCAlZCAocGlwZSAlZClcbiIsCisJCWhhbHQsIHVzYmhzX3BpcGVfbnVtYmVyKHBpcGUpKTsKIAogCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiBsb2NrICoqKioqKioqKioqKioqKioqKioqLwotCWxvY2sgPSB1c2Joc2dfdHJ5bG9jayhncHJpdiwgJmZsYWdzKTsKLQlpZiAoIXVzYmhzZ19xdWV1ZV9nZXQodWVwKSkgeworCXVzYmhzX2xvY2socHJpdiwgZmxhZ3MpOwogCi0JCWRldl9kYmcoZGV2LCAic2V0IGhhbHQgJWQgKHBpcGUgJWQpXG4iLAotCQkJaGFsdCwgdXNiaHNfcGlwZV9udW1iZXIocGlwZSkpOworCWlmIChoYWx0KQorCQl1c2Joc19waXBlX3N0YWxsKHBpcGUpOworCWVsc2UKKwkJdXNiaHNfcGlwZV9kaXNhYmxlKHBpcGUpOwogCi0JCWlmIChoYWx0KQotCQkJdXNiaHNfZmlmb19zdGFsbChwaXBlKTsKLQkJZWxzZQotCQkJdXNiaHNfZmlmb19kaXNhYmxlKHBpcGUpOworCWlmIChoYWx0ICYmIHdlZGdlKQorCQl1c2Joc2dfc3RhdHVzX3NldChncHJpdiwgVVNCSFNHX1NUQVRVU19XRURHRSk7CisJZWxzZQorCQl1c2Joc2dfc3RhdHVzX2NscihncHJpdiwgVVNCSFNHX1NUQVRVU19XRURHRSk7CiAKLQkJaWYgKGhhbHQgJiYgd2VkZ2UpCi0JCQl1c2Joc2dfc3RhdHVzX3NldChncHJpdiwgVVNCSFNHX1NUQVRVU19XRURHRSk7Ci0JCWVsc2UKLQkJCXVzYmhzZ19zdGF0dXNfY2xyKGdwcml2LCBVU0JIU0dfU1RBVFVTX1dFREdFKTsKLQotCQlyZXQgPSAwOwotCX0KLQotCXVzYmhzZ191bmxvY2sobG9jaywgJmZsYWdzKTsKKwl1c2Joc191bmxvY2socHJpdiwgZmxhZ3MpOwogCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiB1bmxvY2sgKioqKioqKioqKioqKioqKioqLwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1c2Joc2dfZXBfc2V0X2hhbHQoc3RydWN0IHVzYl9lcCAqZXAsIGludCB2YWx1ZSkKQEAgLTEwNjcsMjggKzYzMiw0MCBAQAogCXN0cnVjdCB1c2Joc2dfdWVwICpkY3AgPSB1c2Joc2dfZ3ByaXZfdG9fZGNwKGdwcml2KTsKIAlzdHJ1Y3QgdXNiaHNfbW9kICptb2QgPSB1c2Joc19tb2RfZ2V0X2N1cnJlbnQocHJpdik7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNfcHJpdl90b19kZXYocHJpdik7Ci0Jc3BpbmxvY2tfdCAqbG9jazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOwogCiAJLyoqKioqKioqKioqKioqKioqKioqICBzcGluIGxvY2sgKioqKioqKioqKioqKioqKioqKiovCi0JbG9jayA9IHVzYmhzZ190cnlsb2NrKGdwcml2LCAmZmxhZ3MpOworCXVzYmhzX2xvY2socHJpdiwgZmxhZ3MpOworCisJdXNiaHNnX3N0YXR1c19zZXQoZ3ByaXYsIHN0YXR1cyk7CisJaWYgKCEodXNiaHNnX3N0YXR1c19oYXMoZ3ByaXYsIFVTQkhTR19TVEFUVVNfU1RBUlRFRCkgJiYKKwkgICAgICB1c2Joc2dfc3RhdHVzX2hhcyhncHJpdiwgVVNCSFNHX1NUQVRVU19SRUdJU1RFUkQpKSkKKwkJcmV0ID0gLTE7IC8qIG5vdCByZWFkeSAqLworCisJdXNiaHNfdW5sb2NrKHByaXYsIGZsYWdzKTsKKwkvKioqKioqKioqKioqKioqKioqKiogIHNwaW4gdW5sb2NrICoqKioqKioqKioqKioqKioqKioqLworCisJaWYgKHJldCA8IDApCisJCXJldHVybiAwOyAvKiBub3QgcmVhZHkgaXMgbm90IGVycm9yICovCiAKIAkvKgogCSAqIGVuYWJsZSBpbnRlcnJ1cHQgYW5kIHN5c3RlbXMgaWYgcmVhZHkKIAkgKi8KLQl1c2Joc2dfc3RhdHVzX3NldChncHJpdiwgc3RhdHVzKTsKLQlpZiAoISh1c2Joc2dfc3RhdHVzX2hhcyhncHJpdiwgVVNCSFNHX1NUQVRVU19TVEFSVEVEKSAmJgotCSAgICAgIHVzYmhzZ19zdGF0dXNfaGFzKGdwcml2LCBVU0JIU0dfU1RBVFVTX1JFR0lTVEVSRCkpKQotCQlnb3RvIHVzYmhzZ190cnlfc3RhcnRfdW5sb2NrOwotCiAJZGV2X2RiZyhkZXYsICJzdGFydCBnYWRnZXRcbiIpOwogCiAJLyoKIAkgKiBwaXBlIGluaXRpYWxpemUgYW5kIGVuYWJsZSBEQ1AKIAkgKi8KLQl1c2Joc19waXBlX2luaXQocHJpdik7CisJdXNiaHNfcGlwZV9pbml0KHByaXYsCisJCQl1c2Joc2dfcXVldWVfZG9uZSwKKwkJCXVzYmhzZ19kbWFfbWFwX2N0cmwpOworCXVzYmhzX2ZpZm9faW5pdChwcml2KTsKIAl1c2Joc2dfdWVwX2luaXQoZ3ByaXYpOwotCXVzYmhzZ19kY3BfZW5hYmxlKGRjcCk7CisKKwkvKiBkY3AgaW5pdCAqLworCWRjcC0+cGlwZQkJPSB1c2Joc19kY3BfbWFsbG9jKHByaXYpOworCWRjcC0+cGlwZS0+bW9kX3ByaXZhdGUJPSBkY3A7CiAKIAkvKgogCSAqIHN5c3RlbSBjb25maWcgZW5ibGUKQEAgLTExMDUsMTYgKzY4Miw4IEBACiAJICovCiAJbW9kLT5pcnFfZGV2X3N0YXRlCT0gdXNiaHNnX2lycV9kZXZfc3RhdGU7CiAJbW9kLT5pcnFfY3RybF9zdGFnZQk9IHVzYmhzZ19pcnFfY3RybF9zdGFnZTsKLQltb2QtPmlycV9lbXB0eQkJPSB1c2Joc2dfaXJxX2VtcHR5OwotCW1vZC0+aXJxX3JlYWR5CQk9IHVzYmhzZ19pcnFfcmVhZHk7Ci0JbW9kLT5pcnFfYmVtcHN0cwk9IDA7Ci0JbW9kLT5pcnFfYnJkeXN0cwk9IDA7CiAJdXNiaHNfaXJxX2NhbGxiYWNrX3VwZGF0ZShwcml2LCBtb2QpOwogCi11c2Joc2dfdHJ5X3N0YXJ0X3VubG9jazoKLQl1c2Joc2dfdW5sb2NrKGxvY2ssICZmbGFncyk7Ci0JLyoqKioqKioqKioqKioqKioqKioqICBzcGluIHVubG9jayAqKioqKioqKioqKioqKioqKioqKi8KLQogCXJldHVybiAwOwogfQogCkBAIC0xMTI0LDMxICs2OTMsMzMgQEAKIAlzdHJ1Y3QgdXNiaHNfbW9kICptb2QgPSB1c2Joc19tb2RfZ2V0X2N1cnJlbnQocHJpdik7CiAJc3RydWN0IHVzYmhzZ191ZXAgKmRjcCA9IHVzYmhzZ19ncHJpdl90b19kY3AoZ3ByaXYpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVzYmhzX3ByaXZfdG9fZGV2KHByaXYpOwotCXNwaW5sb2NrX3QgKmxvY2s7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKIAogCS8qKioqKioqKioqKioqKioqKioqKiAgc3BpbiBsb2NrICoqKioqKioqKioqKioqKioqKioqLwotCWxvY2sgPSB1c2Joc2dfdHJ5bG9jayhncHJpdiwgJmZsYWdzKTsKKwl1c2Joc19sb2NrKHByaXYsIGZsYWdzKTsKKworCXVzYmhzZ19zdGF0dXNfY2xyKGdwcml2LCBzdGF0dXMpOworCWlmICghdXNiaHNnX3N0YXR1c19oYXMoZ3ByaXYsIFVTQkhTR19TVEFUVVNfU1RBUlRFRCkgJiYKKwkgICAgIXVzYmhzZ19zdGF0dXNfaGFzKGdwcml2LCBVU0JIU0dfU1RBVFVTX1JFR0lTVEVSRCkpCisJCXJldCA9IC0xOyAvKiBhbHJlYWR5IGRvbmUgKi8KKworCXVzYmhzX3VubG9jayhwcml2LCBmbGFncyk7CisJLyoqKioqKioqKioqKioqKioqKioqICBzcGluIHVubG9jayAqKioqKioqKioqKioqKioqKioqKi8KKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gMDsgLyogYWxyZWFkeSBkb25lIGlzIG5vdCBlcnJvciAqLwogCiAJLyoKIAkgKiBkaXNhYmxlIGludGVycnVwdCBhbmQgc3lzdGVtcyBpZiAxc3QgdHJ5CiAJICovCi0JdXNiaHNnX3N0YXR1c19jbHIoZ3ByaXYsIHN0YXR1cyk7Ci0JaWYgKCF1c2Joc2dfc3RhdHVzX2hhcyhncHJpdiwgVVNCSFNHX1NUQVRVU19TVEFSVEVEKSAmJgotCSAgICAhdXNiaHNnX3N0YXR1c19oYXMoZ3ByaXYsIFVTQkhTR19TVEFUVVNfUkVHSVNURVJEKSkKLQkJZ290byB1c2Joc2dfdHJ5X3N0b3BfdW5sb2NrOworCXVzYmhzX2ZpZm9fcXVpdChwcml2KTsKIAogCS8qIGRpc2FibGUgYWxsIGlycSAqLwogCW1vZC0+aXJxX2Rldl9zdGF0ZQk9IE5VTEw7CiAJbW9kLT5pcnFfY3RybF9zdGFnZQk9IE5VTEw7Ci0JbW9kLT5pcnFfZW1wdHkJCT0gTlVMTDsKLQltb2QtPmlycV9yZWFkeQkJPSBOVUxMOwotCW1vZC0+aXJxX2JlbXBzdHMJPSAwOwotCW1vZC0+aXJxX2JyZHlzdHMJPSAwOwogCXVzYmhzX2lycV9jYWxsYmFja191cGRhdGUocHJpdiwgbW9kKTsKIAotCXVzYmhzZ19kY3BfZGlzYWJsZShkY3ApOwotCiAJZ3ByaXYtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOwogCiAJLyogZGlzYWJsZSBzeXMgKi8KQEAgLTExNTYsOCArNzI3LDcgQEAKIAl1c2Joc19zeXNfZnVuY3Rpb25fY3RybChwcml2LCAwKTsKIAl1c2Joc19zeXNfdXNiX2N0cmwocHJpdiwgMCk7CiAKLQl1c2Joc2dfdW5sb2NrKGxvY2ssICZmbGFncyk7Ci0JLyoqKioqKioqKioqKioqKioqKioqICBzcGluIHVubG9jayAqKioqKioqKioqKioqKioqKioqKi8KKwl1c2Joc2dfcGlwZV9kaXNhYmxlKGRjcCk7CiAKIAlpZiAoZ3ByaXYtPmRyaXZlciAmJgogCSAgICBncHJpdi0+ZHJpdmVyLT5kaXNjb25uZWN0KQpAQCAtMTE2NiwxMSArNzM2LDYgQEAKIAlkZXZfZGJnKGRldiwgInN0b3AgZ2FkZ2V0XG4iKTsKIAogCXJldHVybiAwOwotCi11c2Joc2dfdHJ5X3N0b3BfdW5sb2NrOgotCXVzYmhzZ191bmxvY2sobG9jaywgJmZsYWdzKTsKLQotCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTE3OCwxMSArNzQzLDEwIEBACiAgKgkJbGludXggdXNiIGZ1bmN0aW9uCiAgKgogICovCi1zdHJ1Y3QgdXNiaHNnX2dwcml2ICp0aGVfY29udHJvbGxlcjsKLWludCB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKK3N0YXRpYyBpbnQgdXNiaHNnX2dhZGdldF9zdGFydChzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKIAkJCSAgICBpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKIHsKLQlzdHJ1Y3QgdXNiaHNnX2dwcml2ICpncHJpdiA9IHRoZV9jb250cm9sbGVyOworCXN0cnVjdCB1c2Joc2dfZ3ByaXYgKmdwcml2OwogCXN0cnVjdCB1c2Joc19wcml2ICpwcml2OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgcmV0OwpAQCAtMTE5MiwxMCArNzU2LDE3IEBACiAJICAgICFkcml2ZXItPnNldHVwCXx8CiAJICAgIGRyaXZlci0+c3BlZWQgIT0gVVNCX1NQRUVEX0hJR0gpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghZ3ByaXYpCi0JCXJldHVybiAtRU5PREVWOwotCWlmIChncHJpdi0+ZHJpdmVyKQotCQlyZXR1cm4gLUVCVVNZOworCisJLyoKKwkgKiBmaW5kIHVudXNlZCBjb250cm9sbGVyCisJICovCisJdXNiaHNnX2Zvcl9lYWNoX2NvbnRyb2xsZXIoZ3ByaXYpIHsKKwkJaWYgKCFncHJpdi0+ZHJpdmVyKQorCQkJZ290byBmaW5kX3VudXNlZF9jb250cm9sbGVyOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKKworZmluZF91bnVzZWRfY29udHJvbGxlcjoKIAogCWRldiAgPSB1c2Joc2dfZ3ByaXZfdG9fZGV2KGdwcml2KTsKIAlwcml2ID0gdXNiaHNnX2dwcml2X3RvX3ByaXYoZ3ByaXYpOwpAQCAtMTIyOSwyMiArODAwLDI4IEBACiAKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcik7CiAKLWludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQorc3RhdGljIGludCB1c2Joc2dfZ2FkZ2V0X3N0b3Aoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7Ci0Jc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB0aGVfY29udHJvbGxlcjsKKwlzdHJ1Y3QgdXNiaHNnX2dwcml2ICpncHJpdjsKIAlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1c2Joc2dfZ3ByaXZfdG9fZGV2KGdwcml2KTsKLQotCWlmICghZ3ByaXYpCi0JCXJldHVybiAtRU5PREVWOworCXN0cnVjdCBkZXZpY2UgKmRldjsKIAogCWlmICghZHJpdmVyCQl8fAotCSAgICAhZHJpdmVyLT51bmJpbmQJfHwKLQkgICAgZHJpdmVyICE9IGdwcml2LT5kcml2ZXIpCisJICAgICFkcml2ZXItPnVuYmluZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKgorCSAqIGZpbmQgY29udHJvbGxlcgorCSAqLworCXVzYmhzZ19mb3JfZWFjaF9jb250cm9sbGVyKGdwcml2KSB7CisJCWlmIChncHJpdi0+ZHJpdmVyID09IGRyaXZlcikKKwkJCWdvdG8gZmluZF9tYXRjaGluZ19jb250cm9sbGVyOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKKworZmluZF9tYXRjaGluZ19jb250cm9sbGVyOgorCiAJZGV2ICA9IHVzYmhzZ19ncHJpdl90b19kZXYoZ3ByaXYpOwogCXByaXYgPSB1c2Joc2dfZ3ByaXZfdG9fcHJpdihncHJpdik7CiAKQEAgLTEyNjAsNyArODM3LDYgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKIAogLyoKICAqCQl1c2IgZ2FkZ2V0IG9wcwpAQCAtMTI3NSw2ICs4NTEsOCBAQAogCiBzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfb3BzIHVzYmhzZ19nYWRnZXRfb3BzID0gewogCS5nZXRfZnJhbWUJCT0gdXNiaHNnX2dldF9mcmFtZSwKKwkuc3RhcnQJCQk9IHVzYmhzZ19nYWRnZXRfc3RhcnQsCisJLnN0b3AJCQk9IHVzYmhzZ19nYWRnZXRfc3RvcCwKIH07CiAKIHN0YXRpYyBpbnQgdXNiaHNnX3N0YXJ0KHN0cnVjdCB1c2Joc19wcml2ICpwcml2KQpAQCAtMTI5NCw2ICs4NzIsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVzYmhzX3ByaXZfdG9fZGV2KHByaXYpOwogCWludCBwaXBlX3NpemUgPSB1c2Joc19nZXRfZHBhcmFtKHByaXYsIHBpcGVfc2l6ZSk7CiAJaW50IGk7CisJaW50IHJldDsKIAogCWdwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYmhzZ19ncHJpdiksIEdGUF9LRVJORUwpOwogCWlmICghZ3ByaXYpIHsKQEAgLTEzMDQsNiArODgzLDcgQEAKIAl1ZXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiaHNnX3VlcCkgKiBwaXBlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghdWVwKSB7CiAJCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIGVwXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byB1c2Joc19tb2RfZ2FkZ2V0X3Byb2JlX2Vycl9ncHJpdjsKIAl9CiAKQEAgLTEzNTAsNyArOTMwLDYgQEAKIAkJdWVwLT5lcC5uYW1lCQk9IHVlcC0+ZXBfbmFtZTsKIAkJdWVwLT5lcC5vcHMJCT0gJnVzYmhzZ19lcF9vcHM7CiAJCUlOSVRfTElTVF9IRUFEKCZ1ZXAtPmVwLmVwX2xpc3QpOwotCQlJTklUX0xJU1RfSEVBRCgmdWVwLT5saXN0KTsKIAogCQkvKiBpbml0IERDUCAqLwogCQlpZiAodXNiaHNnX2lzX2RjcCh1ZXApKSB7CkBAIC0xMzY0LDIxICs5NDMsMzMgQEAKIAkJfQogCX0KIAotCXRoZV9jb250cm9sbGVyID0gZ3ByaXY7CisJdXNiaHNnX2NvbnRyb2xsZXJfcmVnaXN0ZXIoZ3ByaXYpOworCisJcmV0ID0gdXNiX2FkZF9nYWRnZXRfdWRjKGRldiwgJmdwcml2LT5nYWRnZXQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2FkZF91ZGM7CisKIAogCWRldl9pbmZvKGRldiwgImdhZGdldCBwcm9iZWRcbiIpOwogCiAJcmV0dXJuIDA7CitlcnJfYWRkX3VkYzoKKwlrZnJlZShncHJpdi0+dWVwKTsKIAogdXNiaHNfbW9kX2dhZGdldF9wcm9iZV9lcnJfZ3ByaXY6CiAJa2ZyZWUoZ3ByaXYpOwogCi0JcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBfX2RldmV4aXQgdXNiaHNfbW9kX2dhZGdldF9yZW1vdmUoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfcHJpdl90b19ncHJpdihwcml2KTsKIAorCXVzYl9kZWxfZ2FkZ2V0X3VkYygmZ3ByaXYtPmdhZGdldCk7CisKKwl1c2Joc2dfY29udHJvbGxlcl91bnJlZ2lzdGVyKGdwcml2KTsKKworCWtmcmVlKGdwcml2LT51ZXApOwogCWtmcmVlKGdwcml2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvcGlwZS5jIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9waXBlLmMKaW5kZXggYmM0NTIxYy4uMWIxNGNhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9waXBlLmMKKysrIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9waXBlLmMKQEAgLTE1LDcgKzE1LDYgQEAKICAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgIi4vY29tbW9uLmgiCiAjaW5jbHVkZSAiLi9waXBlLmgiCkBAIC0yMywxMyArMjIsOCBAQAogLyoKICAqCQltYWNyb3MKICAqLwotI2RlZmluZSB1c2Joc3BfcHJpdl90b19waXBlaW5mbyhwcikJKCYocHIpLT5waXBlX2luZm8pCi0jZGVmaW5lIHVzYmhzcF9waXBlX3RvX3ByaXYocCkJCSgocCktPnByaXYpCi0KICNkZWZpbmUgdXNiaHNwX2FkZHJfb2Zmc2V0KHApCSgodXNiaHNfcGlwZV9udW1iZXIocCkgLSAxKSAqIDIpCiAKLSNkZWZpbmUgdXNiaHNwX2lzX2RjcChwKQkoKHApLT5wcml2LT5waXBlX2luZm8ucGlwZSA9PSAocCkpCi0KICNkZWZpbmUgdXNiaHNwX2ZsYWdzX3NldChwLCBmKQkoKHApLT5mbGFncyB8PSAgVVNCSFNfUElQRV9GTEFHU18jI2YpCiAjZGVmaW5lIHVzYmhzcF9mbGFnc19jbHIocCwgZikJKChwKS0+ZmxhZ3MgJj0gflVTQkhTX1BJUEVfRkxBR1NfIyNmKQogI2RlZmluZSB1c2Joc3BfZmxhZ3NfaGFzKHAsIGYpCSgocCktPmZsYWdzICYgICBVU0JIU19QSVBFX0ZMQUdTXyMjZikKQEAgLTc3LDEwICs3MSwxMCBAQAogICovCiBzdGF0aWMgdm9pZCB1c2Joc3BfcGlwZWN0cmxfc2V0KHN0cnVjdCB1c2Joc19waXBlICpwaXBlLCB1MTYgbWFzaywgdTE2IHZhbCkKIHsKLQlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzcF9waXBlX3RvX3ByaXYocGlwZSk7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGlwZSk7CiAJaW50IG9mZnNldCA9IHVzYmhzcF9hZGRyX29mZnNldChwaXBlKTsKIAotCWlmICh1c2Joc3BfaXNfZGNwKHBpcGUpKQorCWlmICh1c2Joc19waXBlX2lzX2RjcChwaXBlKSkKIAkJdXNiaHNfYnNldChwcml2LCBEQ1BDVFIsIG1hc2ssIHZhbCk7CiAJZWxzZQogCQl1c2Joc19ic2V0KHByaXYsIFBJUEVuQ1RSICsgb2Zmc2V0LCBtYXNrLCB2YWwpOwpAQCAtODgsMTAgKzgyLDEwIEBACiAKIHN0YXRpYyB1MTYgdXNiaHNwX3BpcGVjdHJsX2dldChzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSkKIHsKLQlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzcF9waXBlX3RvX3ByaXYocGlwZSk7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGlwZSk7CiAJaW50IG9mZnNldCA9IHVzYmhzcF9hZGRyX29mZnNldChwaXBlKTsKIAotCWlmICh1c2Joc3BfaXNfZGNwKHBpcGUpKQorCWlmICh1c2Joc19waXBlX2lzX2RjcChwaXBlKSkKIAkJcmV0dXJuIHVzYmhzX3JlYWQocHJpdiwgRENQQ1RSKTsKIAllbHNlCiAJCXJldHVybiB1c2Joc19yZWFkKHByaXYsIFBJUEVuQ1RSICsgb2Zmc2V0KTsKQEAgLTEwNCw5ICs5OCw5IEBACiAJCQkJICB1MTYgZGNwX3JlZywgdTE2IHBpcGVfcmVnLAogCQkJCSAgdTE2IG1hc2ssIHUxNiB2YWwpCiB7Ci0Jc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc3BfcGlwZV90b19wcml2KHBpcGUpOworCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNfcGlwZV90b19wcml2KHBpcGUpOwogCi0JaWYgKHVzYmhzcF9pc19kY3AocGlwZSkpCisJaWYgKHVzYmhzX3BpcGVfaXNfZGNwKHBpcGUpKQogCQl1c2Joc19ic2V0KHByaXYsIGRjcF9yZWcsIG1hc2ssIHZhbCk7CiAJZWxzZQogCQl1c2Joc19ic2V0KHByaXYsIHBpcGVfcmVnLCBtYXNrLCB2YWwpOwpAQCAtMTE1LDkgKzEwOSw5IEBACiBzdGF0aWMgdTE2IF9fdXNiaHNwX3BpcGVfeHh4X2dldChzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSwKIAkJCQkgdTE2IGRjcF9yZWcsIHUxNiBwaXBlX3JlZykKIHsKLQlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzcF9waXBlX3RvX3ByaXYocGlwZSk7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGlwZSk7CiAKLQlpZiAodXNiaHNwX2lzX2RjcChwaXBlKSkKKwlpZiAodXNiaHNfcGlwZV9pc19kY3AocGlwZSkpCiAJCXJldHVybiB1c2Joc19yZWFkKHByaXYsIGRjcF9yZWcpOwogCWVsc2UKIAkJcmV0dXJuIHVzYmhzX3JlYWQocHJpdiwgcGlwZV9yZWcpOwpAQCAtMTM2LDcgKzEzMCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHVzYmhzcF9waXBlX2J1Zl9zZXQoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsIHUxNiBtYXNrLCB1MTYgdmFsKQogewotCWlmICh1c2Joc3BfaXNfZGNwKHBpcGUpKQorCWlmICh1c2Joc19waXBlX2lzX2RjcChwaXBlKSkKIAkJcmV0dXJuOwogCiAJX191c2Joc3BfcGlwZV94eHhfc2V0KHBpcGUsIDAsIFBJUEVCVUYsIG1hc2ssIHZhbCk7CkBAIC0xNjAsNyArMTU0LDcgQEAKICAqLwogc3RhdGljIHZvaWQgdXNiaHNwX3BpcGVfc2VsZWN0KHN0cnVjdCB1c2Joc19waXBlICpwaXBlKQogewotCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNwX3BpcGVfdG9fcHJpdihwaXBlKTsKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzX3BpcGVfdG9fcHJpdihwaXBlKTsKIAogCS8qCiAJICogT24gcGlwZSwgdGhpcyBpcyBuZWNlc3NhcnkgYmVmb3JlCkBAIC0xODIsNyArMTc2LDcgQEAKIAogc3RhdGljIGludCB1c2Joc3BfcGlwZV9iYXJyaWVyKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKQogewotCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNwX3BpcGVfdG9fcHJpdihwaXBlKTsKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzX3BpcGVfdG9fcHJpdihwaXBlKTsKIAlpbnQgdGltZW91dCA9IDEwMjQ7CiAJdTE2IHZhbDsKIApAQCAtMjA1LDcgKzE5OSw3IEBACiAJICogICAtICJQaXBlIENvbnRyb2wgUmVnaXN0ZXJzIFN3aXRjaGluZyBQcm9jZWR1cmUiCiAJICovCiAJdXNiaHNfd3JpdGUocHJpdiwgQ0ZJRk9TRUwsIDApOwotCXVzYmhzX2ZpZm9fZGlzYWJsZShwaXBlKTsKKwl1c2Joc19waXBlX2Rpc2FibGUocGlwZSk7CiAKIAlkbyB7CiAJCXZhbCAgPSB1c2Joc3BfcGlwZWN0cmxfZ2V0KHBpcGUpOwpAQCAtMjIwLDcgKzIxNCw3IEBACiAJcmV0dXJuIC1FQlVTWTsKIH0KIAotc3RhdGljIGludCB1c2Joc3BfcGlwZV9pc19hY2Nlc3NpYmxlKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKQoraW50IHVzYmhzX3BpcGVfaXNfYWNjZXNzaWJsZShzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSkKIHsKIAl1MTYgdmFsOwogCkBAIC0yNTMsNyArMjQ3LDcgQEAKIAl9CiB9CiAKLXZvaWQgdXNiaHNfZmlmb19kaXNhYmxlKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKQordm9pZCB1c2Joc19waXBlX2Rpc2FibGUoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUpCiB7CiAJaW50IHRpbWVvdXQgPSAxMDI0OwogCXUxNiB2YWw7CkBAIC0yNzMsNyArMjY3LDcgQEAKIAl9IHdoaWxlICh0aW1lb3V0LS0pOwogfQogCi12b2lkIHVzYmhzX2ZpZm9fZW5hYmxlKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKQordm9pZCB1c2Joc19waXBlX2VuYWJsZShzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSkKIHsKIAkvKiBzZWUgIlBpcGUgbiBDb250cm9sIFJlZ2lzdGVyIiAtICJQSUQiICovCiAJX191c2Joc3BfcGlkX3RyeV9uYWtfaWZfc3RhbGwocGlwZSk7CkBAIC0yODEsNyArMjc1LDcgQEAKIAl1c2Joc3BfcGlwZWN0cmxfc2V0KHBpcGUsIFBJRF9NQVNLLCBQSURfQlVGKTsKIH0KIAotdm9pZCB1c2Joc19maWZvX3N0YWxsKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKQordm9pZCB1c2Joc19waXBlX3N0YWxsKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKQogewogCXUxNiBwaWQgPSB1c2Joc3BfcGlwZWN0cmxfZ2V0KHBpcGUpOwogCkBAIC0zMDIsMTkxICsyOTYsNiBAQAogfQogCiAvKgotICoJCUNGSUZPIGN0cmwKLSAqLwotdm9pZCB1c2Joc19maWZvX3NlbmRfdGVybWluYXRvcihzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSkKLXsKLQlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzcF9waXBlX3RvX3ByaXYocGlwZSk7Ci0KLQl1c2Joc19ic2V0KHByaXYsIENGSUZPQ1RSLCBCVkFMLCBCVkFMKTsKLX0KLQotc3RhdGljIHZvaWQgdXNiaHNwX2ZpZm9fY2xlYXIoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUpCi17Ci0Jc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc3BfcGlwZV90b19wcml2KHBpcGUpOwotCi0JdXNiaHNfd3JpdGUocHJpdiwgQ0ZJRk9DVFIsIEJDTFIpOwotfQotCi1zdGF0aWMgaW50IHVzYmhzcF9maWZvX2JhcnJpZXIoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYpCi17Ci0JaW50IHRpbWVvdXQgPSAxMDI0OwotCi0JZG8gewotCQkvKiBUaGUgRklGTyBwb3J0IGlzIGFjY2Vzc2libGUgKi8KLQkJaWYgKHVzYmhzX3JlYWQocHJpdiwgQ0ZJRk9DVFIpICYgRlJEWSkKLQkJCXJldHVybiAwOwotCi0JCXVkZWxheSgxMCk7Ci0JfSB3aGlsZSAodGltZW91dC0tKTsKLQotCXJldHVybiAtRUJVU1k7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiaHNwX2ZpZm9fcmN2X2xlbihzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdikKLXsKLQlyZXR1cm4gdXNiaHNfcmVhZChwcml2LCBDRklGT0NUUikgJiBEVExOX01BU0s7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiaHNwX2ZpZm9fc2VsZWN0KHN0cnVjdCB1c2Joc19waXBlICpwaXBlLCBpbnQgd3JpdGUpCi17Ci0Jc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc3BfcGlwZV90b19wcml2KHBpcGUpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVzYmhzX3ByaXZfdG9fZGV2KHByaXYpOwotCWludCB0aW1lb3V0ID0gMTAyNDsKLQl1MTYgbWFzayA9ICgoMSA8PCA1KSB8IDB4Rik7CQkvKiBtYXNrIG9mIElTRUwgfCBDVVJQSVBFICovCi0JdTE2IGJhc2UgPSB1c2Joc19waXBlX251bWJlcihwaXBlKTsJLyogQ1VSUElQRSAqLwotCi0JaWYgKHVzYmhzcF9pc19kY3AocGlwZSkpCi0JCWJhc2UgfD0gKDEgPT0gd3JpdGUpIDw8IDU7CS8qIElTRUwgKi8KLQotCS8qICJiYXNlIiB3aWxsIGJlIHVzZWQgYmVsb3cgICovCi0JdXNiaHNfd3JpdGUocHJpdiwgQ0ZJRk9TRUwsIGJhc2UgfCBNQldfMzIpOwotCi0JLyogY2hlY2sgSVNFTCBhbmQgQ1VSUElQRSB2YWx1ZSAqLwotCXdoaWxlICh0aW1lb3V0LS0pIHsKLQkJaWYgKGJhc2UgPT0gKG1hc2sgJiB1c2Joc19yZWFkKHByaXYsIENGSUZPU0VMKSkpCi0JCQlyZXR1cm4gMDsKLQkJdWRlbGF5KDEwKTsKLQl9Ci0KLQlkZXZfZXJyKGRldiwgImZpZm8gc2VsZWN0IGVycm9yXG4iKTsKLQotCXJldHVybiAtRUlPOwotfQotCi1pbnQgdXNiaHNfZmlmb19wcmVwYXJlX3dyaXRlKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKQotewotCXJldHVybiB1c2Joc3BfZmlmb19zZWxlY3QocGlwZSwgMSk7Ci19Ci0KLWludCB1c2Joc19maWZvX3dyaXRlKHN0cnVjdCB1c2Joc19waXBlICpwaXBlLCB1OCAqYnVmLCBpbnQgbGVuKQotewotCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNwX3BpcGVfdG9fcHJpdihwaXBlKTsKLQl2b2lkIF9faW9tZW0gKmFkZHIgPSBwcml2LT5iYXNlICsgQ0ZJRk87Ci0JaW50IG1heHAgPSB1c2Joc19waXBlX2dldF9tYXhwYWNrZXQocGlwZSk7Ci0JaW50IHRvdGFsX2xlbjsKLQlpbnQgaSwgcmV0OwotCi0JcmV0ID0gdXNiaHNwX3BpcGVfaXNfYWNjZXNzaWJsZShwaXBlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHVzYmhzcF9maWZvX3NlbGVjdChwaXBlLCAxKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHVzYmhzcF9maWZvX2JhcnJpZXIocHJpdik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlsZW4gPSBtaW4obGVuLCBtYXhwKTsKLQl0b3RhbF9sZW4gPSBsZW47Ci0KLQkvKgotCSAqIEZJWE1FCi0JICoKLQkgKiAzMi1iaXQgYWNjZXNzIG9ubHkKLQkgKi8KLQlpZiAobGVuID49IDQgJiYKLQkgICAgISgodW5zaWduZWQgbG9uZylidWYgJiAweDAzKSkgewotCQlpb3dyaXRlMzJfcmVwKGFkZHIsIGJ1ZiwgbGVuIC8gNCk7Ci0JCWxlbiAlPSA0OwotCQlidWYgKz0gdG90YWxfbGVuIC0gbGVuOwotCX0KLQotCS8qIHRoZSByZXN0IG9wZXJhdGlvbiAqLwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJaW93cml0ZTgoYnVmW2ldLCBhZGRyICsgKDB4MDMgLSAoaSAmIDB4MDMpKSk7Ci0KLQlpZiAodG90YWxfbGVuIDwgbWF4cCkKLQkJdXNiaHNfZmlmb19zZW5kX3Rlcm1pbmF0b3IocGlwZSk7Ci0KLQlyZXR1cm4gdG90YWxfbGVuOwotfQotCi1pbnQgdXNiaHNfZmlmb19wcmVwYXJlX3JlYWQoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUpCi17Ci0JaW50IHJldDsKLQotCS8qCi0JICogc2VsZWN0IHBpcGUgYW5kIGVuYWJsZSBpdCB0byBwcmVwYXJlIHBhY2tldCByZWNlaXZlCi0JICovCi0JcmV0ID0gdXNiaHNwX2ZpZm9fc2VsZWN0KHBpcGUsIDApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JdXNiaHNfZmlmb19lbmFibGUocGlwZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgdXNiaHNfZmlmb19yZWFkKHN0cnVjdCB1c2Joc19waXBlICpwaXBlLCB1OCAqYnVmLCBpbnQgbGVuKQotewotCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNwX3BpcGVfdG9fcHJpdihwaXBlKTsKLQl2b2lkIF9faW9tZW0gKmFkZHIgPSBwcml2LT5iYXNlICsgQ0ZJRk87Ci0JaW50IHJjdl9sZW47Ci0JaW50IGksIHJldDsKLQlpbnQgdG90YWxfbGVuOwotCXUzMiBkYXRhID0gMDsKLQotCXJldCA9IHVzYmhzcF9maWZvX3NlbGVjdChwaXBlLCAwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHVzYmhzcF9maWZvX2JhcnJpZXIocHJpdik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyY3ZfbGVuID0gdXNiaHNwX2ZpZm9fcmN2X2xlbihwcml2KTsKLQotCS8qCi0JICogQnVmZmVyIGNsZWFyIGlmIFplcm8tTGVuZ3RoIHBhY2tldAotCSAqCi0JICogc2VlCi0JICogIk9wZXJhdGlvbiIgLSAiRklGTyBCdWZmZXIgTWVtb3J5IiAtICJGSUZPIFBvcnQgRnVuY3Rpb24iCi0JICovCi0JaWYgKDAgPT0gcmN2X2xlbikgewotCQl1c2Joc3BfZmlmb19jbGVhcihwaXBlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbGVuID0gbWluKHJjdl9sZW4sIGxlbik7Ci0JdG90YWxfbGVuID0gbGVuOwotCi0JLyoKLQkgKiBGSVhNRQotCSAqCi0JICogMzItYml0IGFjY2VzcyBvbmx5Ci0JICovCi0JaWYgKGxlbiA+PSA0ICYmCi0JICAgICEoKHVuc2lnbmVkIGxvbmcpYnVmICYgMHgwMykpIHsKLQkJaW9yZWFkMzJfcmVwKGFkZHIsIGJ1ZiwgbGVuIC8gNCk7Ci0JCWxlbiAlPSA0OwotCQlidWYgKz0gcmN2X2xlbiAtIGxlbjsKLQl9Ci0KLQkvKiB0aGUgcmVzdCBvcGVyYXRpb24gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKCEoaSAmIDB4MDMpKQotCQkJZGF0YSA9IGlvcmVhZDMyKGFkZHIpOwotCi0JCWJ1ZltpXSA9IChkYXRhID4+ICgoaSAmIDB4MDMpICogOCkpICYgMHhmZjsKLQl9Ci0KLQlyZXR1cm4gdG90YWxfbGVuOwotfQotCi0vKgogICoJCXBpcGUgc2V0dXAKICAqLwogc3RhdGljIGludCB1c2Joc3BfcG9zc2libGVfZG91YmxlX2J1ZmZlcihzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSkKQEAgLTUxOSw3ICszMjgsNyBAQAogCX07CiAJaW50IGlzX2RvdWJsZSA9IHVzYmhzcF9wb3NzaWJsZV9kb3VibGVfYnVmZmVyKHBpcGUpOwogCi0JaWYgKHVzYmhzcF9pc19kY3AocGlwZSkpCisJaWYgKHVzYmhzX3BpcGVfaXNfZGNwKHBpcGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qCkBAIC01NTAsMTIgKzM1OSwxNSBAQAogCiAJLyogRElSICovCiAJaWYgKHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykpCi0JCXVzYmhzcF9mbGFnc19zZXQocGlwZSwgSVNfRElSX0lOKTsKKwkJdXNiaHNwX2ZsYWdzX3NldChwaXBlLCBJU19ESVJfSE9TVCk7CiAKIAlpZiAoKGlzX2hvc3QgICYmIHVzYl9lbmRwb2ludF9kaXJfb3V0KGRlc2MpKSB8fAogCSAgICAoIWlzX2hvc3QgJiYgdXNiX2VuZHBvaW50X2Rpcl9pbihkZXNjKSkpCiAJCWRpciB8PSBESVJfT1VUOwogCisJaWYgKCFkaXIpCisJCXVzYmhzcF9mbGFnc19zZXQocGlwZSwgSVNfRElSX0lOKTsKKwogCS8qIFNIVE5BSyAqLwogCWlmICh1c2Joc3BfdHlwZV9pcyhwaXBlLCBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgogCSAgICAhZGlyKQpAQCAtNTg3LDggKzM5OSw4IEBACiAJCQkJIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYywKIAkJCQkgaW50IGlzX2hvc3QpCiB7Ci0Jc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc3BfcGlwZV90b19wcml2KHBpcGUpOwotCXN0cnVjdCB1c2Joc19waXBlX2luZm8gKmluZm8gPSB1c2Joc3BfcHJpdl90b19waXBlaW5mbyhwcml2KTsKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzX3BpcGVfdG9fcHJpdihwaXBlKTsKKwlzdHJ1Y3QgdXNiaHNfcGlwZV9pbmZvICppbmZvID0gdXNiaHNfcHJpdl90b19waXBlaW5mbyhwcml2KTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1c2Joc19wcml2X3RvX2Rldihwcml2KTsKIAlpbnQgcGlwZV9udW0gPSB1c2Joc19waXBlX251bWJlcihwaXBlKTsKIAlpbnQgaXNfZG91YmxlID0gdXNiaHNwX3Bvc3NpYmxlX2RvdWJsZV9idWZmZXIocGlwZSk7CkBAIC02NjYsNyArNDc4LDcgQEAKICAqLwogaW50IHVzYmhzX3BpcGVfZ2V0X21heHBhY2tldChzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSkKIHsKLQl1MTYgbWFzayA9IHVzYmhzcF9pc19kY3AocGlwZSkgPyBEQ1BfTUFYUF9NQVNLIDogUElQRV9NQVhQX01BU0s7CisJdTE2IG1hc2sgPSB1c2Joc19waXBlX2lzX2RjcChwaXBlKSA/IERDUF9NQVhQX01BU0sgOiBQSVBFX01BWFBfTUFTSzsKIAogCXVzYmhzcF9waXBlX3NlbGVjdChwaXBlKTsKIApAQCAtNjc4LDExICs0OTAsMjIgQEAKIAlyZXR1cm4gdXNiaHNwX2ZsYWdzX2hhcyhwaXBlLCBJU19ESVJfSU4pOwogfQogCitpbnQgdXNiaHNfcGlwZV9pc19kaXJfaG9zdChzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSkKK3sKKwlyZXR1cm4gdXNiaHNwX2ZsYWdzX2hhcyhwaXBlLCBJU19ESVJfSE9TVCk7Cit9CisKIHZvaWQgdXNiaHNfcGlwZV9jbGVhcl9zZXF1ZW5jZShzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSkKIHsKIAl1c2Joc3BfcGlwZWN0cmxfc2V0KHBpcGUsIFNRQ0xSLCBTUUNMUik7CiB9CiAKK3ZvaWQgdXNiaHNfcGlwZV9jbGVhcihzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSkKK3sKKwl1c2Joc3BfcGlwZWN0cmxfc2V0KHBpcGUsIEFDTFJNLCBBQ0xSTSk7CisJdXNiaHNwX3BpcGVjdHJsX3NldChwaXBlLCBBQ0xSTSwgMCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdXNiaHNfcGlwZSAqdXNiaHNwX2dldF9waXBlKHN0cnVjdCB1c2Joc19wcml2ICpwcml2LCB1MzIgdHlwZSkKIHsKIAlzdHJ1Y3QgdXNiaHNfcGlwZSAqcG9zLCAqcGlwZTsKQEAgLTcxNCwxMiArNTM3LDIwIEBACiAJcmV0dXJuIHBpcGU7CiB9CiAKLXZvaWQgdXNiaHNfcGlwZV9pbml0KHN0cnVjdCB1c2Joc19wcml2ICpwcml2KQordm9pZCB1c2Joc19waXBlX2luaXQoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYsCisJCSAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCB1c2Joc19wa3QgKnBrdCksCisJCSAgICAgaW50ICgqZG1hX21hcF9jdHJsKShzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QsIGludCBtYXApKQogewotCXN0cnVjdCB1c2Joc19waXBlX2luZm8gKmluZm8gPSB1c2Joc3BfcHJpdl90b19waXBlaW5mbyhwcml2KTsKKwlzdHJ1Y3QgdXNiaHNfcGlwZV9pbmZvICppbmZvID0gdXNiaHNfcHJpdl90b19waXBlaW5mbyhwcml2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1c2Joc19wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZTsKIAlpbnQgaTsKIAorCWlmICghZG9uZSkgeworCQlkZXZfZXJyKGRldiwgIm5vIGRvbmUgZnVuY3Rpb25cbiIpOworCQlyZXR1cm47CisJfQorCiAJLyoKIAkgKiBGSVhNRQogCSAqCkBAIC03MzgsMTAgKzU2OSwxNiBAQAogCQkJaW5mby0+YnVmbm1iX2xhc3QrKzsKIAogCQl1c2Joc3BfZmxhZ3NfaW5pdChwaXBlKTsKKwkJcGlwZS0+ZmlmbyA9IE5VTEw7CiAJCXBpcGUtPm1vZF9wcml2YXRlID0gTlVMTDsKKwkJSU5JVF9MSVNUX0hFQUQoJnBpcGUtPmxpc3QpOwogCi0JCXVzYmhzcF9maWZvX2NsZWFyKHBpcGUpOworCQkvKiBwaXBlIGZvcmNlIGluaXQgKi8KKwkJdXNiaHNfcGlwZV9jbGVhcihwaXBlKTsKIAl9CisKKwlpbmZvLT5kb25lID0gZG9uZTsKKwlpbmZvLT5kbWFfbWFwX2N0cmwgPSBkbWFfbWFwX2N0cmw7CiB9CiAKIHN0cnVjdCB1c2Joc19waXBlICp1c2Joc19waXBlX21hbGxvYyhzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiwKQEAgLTc2MSw3ICs1OTgsOSBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQl1c2Joc19maWZvX2Rpc2FibGUocGlwZSk7CisJSU5JVF9MSVNUX0hFQUQoJnBpcGUtPmxpc3QpOworCisJdXNiaHNfcGlwZV9kaXNhYmxlKHBpcGUpOwogCiAJLyogbWFrZSBzdXJlIHBpcGUgaXMgbm90IGJ1c3kgKi8KIAlyZXQgPSB1c2Joc3BfcGlwZV9iYXJyaWVyKHBpcGUpOwpAQCAtNzc0LDExICs2MTMsNiBAQAogCXBpcGVidWYgID0gdXNiaHNwX3NldHVwX3BpcGVidWZmKHBpcGUsIGRlc2MsIGlzX2hvc3QpOwogCXBpcGVtYXhwID0gdXNiaHNwX3NldHVwX3BpcGVtYXhwKHBpcGUsIGRlc2MsIGlzX2hvc3QpOwogCi0JLyogYnVmZmVyIGNsZWFyCi0JICogc2VlIFBJUEVDRkcgOjogQkZSRSAqLwotCXVzYmhzcF9waXBlY3RybF9zZXQocGlwZSwgQUNMUk0sIEFDTFJNKTsKLQl1c2Joc3BfcGlwZWN0cmxfc2V0KHBpcGUsIEFDTFJNLCAwKTsKLQogCXVzYmhzcF9waXBlX3NlbGVjdChwaXBlKTsKIAl1c2Joc3BfcGlwZV9jZmdfc2V0KHBpcGUsIDB4RkZGRiwgcGlwZWNmZyk7CiAJdXNiaHNwX3BpcGVfYnVmX3NldChwaXBlLCAweEZGRkYsIHBpcGVidWYpOwpAQCAtNzk0LDYgKzYyOCwxOCBAQAogCXJldHVybiBwaXBlOwogfQogCit2b2lkIHVzYmhzX3BpcGVfc2VsZWN0X2ZpZm8oc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsIHN0cnVjdCB1c2Joc19maWZvICpmaWZvKQoreworCWlmIChwaXBlLT5maWZvKQorCQlwaXBlLT5maWZvLT5waXBlID0gTlVMTDsKKworCXBpcGUtPmZpZm8gPSBmaWZvOworCisJaWYgKGZpZm8pCisJCWZpZm8tPnBpcGUgPSBwaXBlOworfQorCisKIC8qCiAgKgkJZGNwIGNvbnRyb2wKICAqLwpAQCAtODEzLDI1ICs2NTksMjUgQEAKIAogCXVzYmhzcF9waXBlX3NlbGVjdChwaXBlKTsKIAl1c2Joc19waXBlX2NsZWFyX3NlcXVlbmNlKHBpcGUpOworCUlOSVRfTElTVF9IRUFEKCZwaXBlLT5saXN0KTsKIAogCXJldHVybiBwaXBlOwogfQogCiB2b2lkIHVzYmhzX2RjcF9jb250cm9sX3RyYW5zZmVyX2RvbmUoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUpCiB7Ci0JV0FSTl9PTighdXNiaHNwX2lzX2RjcChwaXBlKSk7CisJV0FSTl9PTighdXNiaHNfcGlwZV9pc19kY3AocGlwZSkpOwogCi0JdXNiaHNfZmlmb19lbmFibGUocGlwZSk7CisJdXNiaHNfcGlwZV9lbmFibGUocGlwZSk7CiAJdXNiaHNwX3BpcGVjdHJsX3NldChwaXBlLCBDQ1BMLCBDQ1BMKTsKIH0KIAotCiAvKgogICoJCXBpcGUgbW9kdWxlIGZ1bmN0aW9uCiAgKi8KIGludCB1c2Joc19waXBlX3Byb2JlKHN0cnVjdCB1c2Joc19wcml2ICpwcml2KQogewotCXN0cnVjdCB1c2Joc19waXBlX2luZm8gKmluZm8gPSB1c2Joc3BfcHJpdl90b19waXBlaW5mbyhwcml2KTsKKwlzdHJ1Y3QgdXNiaHNfcGlwZV9pbmZvICppbmZvID0gdXNiaHNfcHJpdl90b19waXBlaW5mbyhwcml2KTsKIAlzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1c2Joc19wcml2X3RvX2Rldihwcml2KTsKIAl1MzIgKnBpcGVfdHlwZSA9IHVzYmhzX2dldF9kcGFyYW0ocHJpdiwgcGlwZV90eXBlKTsKQEAgLTg2OCw3ICs3MTQsNyBAQAogCiB2b2lkIHVzYmhzX3BpcGVfcmVtb3ZlKHN0cnVjdCB1c2Joc19wcml2ICpwcml2KQogewotCXN0cnVjdCB1c2Joc19waXBlX2luZm8gKmluZm8gPSB1c2Joc3BfcHJpdl90b19waXBlaW5mbyhwcml2KTsKKwlzdHJ1Y3QgdXNiaHNfcGlwZV9pbmZvICppbmZvID0gdXNiaHNfcHJpdl90b19waXBlaW5mbyhwcml2KTsKIAogCWtmcmVlKGluZm8tPnBpcGUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9waXBlLmggYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3BpcGUuaAppbmRleCAxY2NhOWI3Li40MTUzNGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3BpcGUuaAorKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3BpcGUuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBSRU5FU0FTX1VTQl9QSVBFX0gKIAogI2luY2x1ZGUgIi4vY29tbW9uLmgiCisjaW5jbHVkZSAiLi9maWZvLmgiCiAKIC8qCiAgKglzdHJ1Y3QKQEAgLTI2LDEwICsyNywxMyBAQAogCXUzMiBwaXBlX3R5cGU7CS8qIFVTQl9FTkRQT0lOVF9YRkVSX3h4eCAqLwogCiAJc3RydWN0IHVzYmhzX3ByaXYgKnByaXY7CisJc3RydWN0IHVzYmhzX2ZpZm8gKmZpZm87CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCiAJdTMyIGZsYWdzOwogI2RlZmluZSBVU0JIU19QSVBFX0ZMQUdTX0lTX1VTRUQJCSgxIDw8IDApCiAjZGVmaW5lIFVTQkhTX1BJUEVfRkxBR1NfSVNfRElSX0lOCQkoMSA8PCAxKQorI2RlZmluZSBVU0JIU19QSVBFX0ZMQUdTX0lTX0RJUl9IT1NUCQkoMSA8PCAyKQogCiAJdm9pZCAqbW9kX3ByaXZhdGU7CiB9OwpAQCAtMzgsNiArNDIsOSBAQAogCXN0cnVjdCB1c2Joc19waXBlICpwaXBlOwogCWludCBzaXplOwkvKiBhcnJheSBzaXplIG9mICJwaXBlIiAqLwogCWludCBidWZubWJfbGFzdDsJLyogRklYTUUgOiBkcml2ZXIgbmVlZHMgZ29vZCBhbGxvY2F0b3IgKi8KKworCXZvaWQgKCpkb25lKShzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QpOworCWludCAoKmRtYV9tYXBfY3RybCkoc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgbWFwKTsKIH07CiAKIC8qCkBAIC01NSwyNSArNjIsOSBAQAogCV9fdXNiaHNfZm9yX2VhY2hfcGlwZSgwLCBwb3MsICYoKHByaXYpLT5waXBlX2luZm8pLCBpKQogCiAvKgotICogcGlwZSBtb2R1bGUgcHJvYmUgLyByZW1vdmUKKyAqIGRhdGEKICAqLwotaW50IHVzYmhzX3BpcGVfcHJvYmUoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYpOwotdm9pZCB1c2Joc19waXBlX3JlbW92ZShzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdik7Ci0KLS8qCi0gKiBjZmlmbwotICovCi1pbnQgdXNiaHNfZmlmb193cml0ZShzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSwgdTggKmJ1ZiwgaW50IGxlbik7Ci1pbnQgdXNiaHNfZmlmb19yZWFkKHN0cnVjdCB1c2Joc19waXBlICpwaXBlLCB1OCAqYnVmLCBpbnQgbGVuKTsKLWludCB1c2Joc19maWZvX3ByZXBhcmVfd3JpdGUoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUpOwotaW50IHVzYmhzX2ZpZm9fcHJlcGFyZV9yZWFkKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKTsKLQotdm9pZCB1c2Joc19maWZvX2VuYWJsZShzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSk7Ci12b2lkIHVzYmhzX2ZpZm9fZGlzYWJsZShzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSk7Ci12b2lkIHVzYmhzX2ZpZm9fc3RhbGwoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUpOwotCi12b2lkIHVzYmhzX2ZpZm9fc2VuZF90ZXJtaW5hdG9yKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKTsKLQorI2RlZmluZSB1c2Joc19wcml2X3RvX3BpcGVpbmZvKHByKQkoJihwciktPnBpcGVfaW5mbykKIAogLyoKICAqIHVzYiByZXF1ZXN0CkBAIC04NywxMyArNzgsMjcgQEAKIHN0cnVjdCB1c2Joc19waXBlCiAqdXNiaHNfcGlwZV9tYWxsb2Moc3RydWN0IHVzYmhzX3ByaXYgKnByaXYsCiAJCSAgIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYyk7Ci0KK2ludCB1c2Joc19waXBlX3Byb2JlKHN0cnVjdCB1c2Joc19wcml2ICpwcml2KTsKK3ZvaWQgdXNiaHNfcGlwZV9yZW1vdmUoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYpOwogaW50IHVzYmhzX3BpcGVfaXNfZGlyX2luKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKTsKLXZvaWQgdXNiaHNfcGlwZV9pbml0KHN0cnVjdCB1c2Joc19wcml2ICpwcml2KTsKK2ludCB1c2Joc19waXBlX2lzX2Rpcl9ob3N0KHN0cnVjdCB1c2Joc19waXBlICpwaXBlKTsKK3ZvaWQgdXNiaHNfcGlwZV9pbml0KHN0cnVjdCB1c2Joc19wcml2ICpwcml2LAorCQkgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QpLAorCQkgICAgIGludCAoKmRtYV9tYXBfY3RybCkoc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgbWFwKSk7CiBpbnQgdXNiaHNfcGlwZV9nZXRfbWF4cGFja2V0KHN0cnVjdCB1c2Joc19waXBlICpwaXBlKTsKIHZvaWQgdXNiaHNfcGlwZV9jbGVhcl9zZXF1ZW5jZShzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSk7Cit2b2lkIHVzYmhzX3BpcGVfY2xlYXIoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUpOworaW50IHVzYmhzX3BpcGVfaXNfYWNjZXNzaWJsZShzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSk7Cit2b2lkIHVzYmhzX3BpcGVfZW5hYmxlKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKTsKK3ZvaWQgdXNiaHNfcGlwZV9kaXNhYmxlKHN0cnVjdCB1c2Joc19waXBlICpwaXBlKTsKK3ZvaWQgdXNiaHNfcGlwZV9zdGFsbChzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSk7Cit2b2lkIHVzYmhzX3BpcGVfc2VsZWN0X2ZpZm8oc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsIHN0cnVjdCB1c2Joc19maWZvICpmaWZvKTsKIAorI2RlZmluZSB1c2Joc19waXBlX3RvX3ByaXYocCkJKChwKS0+cHJpdikKICNkZWZpbmUgdXNiaHNfcGlwZV9udW1iZXIocCkJKGludCkoKHApIC0gKHApLT5wcml2LT5waXBlX2luZm8ucGlwZSkKKyNkZWZpbmUgdXNiaHNfcGlwZV9pc19kY3AocCkJKChwKS0+cHJpdi0+cGlwZV9pbmZvLnBpcGUgPT0gKHApKQorI2RlZmluZSB1c2Joc19waXBlX3RvX2ZpZm8ocCkJKChwKS0+ZmlmbykKKyNkZWZpbmUgdXNiaHNfcGlwZV9pc19idXN5KHApCXVzYmhzX3BpcGVfdG9fZmlmbyhwKQogCiAvKgogICogZGNwIGNvbnRyb2wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKaW5kZXggZThkYmRlNS4uMmUwNmI5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKQEAgLTE3OSw2ICsxNzksNyBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV8yMzJSTF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzhVMjIzMkNfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80MjMySF9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzIzMkhfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NSUNST19DSEFNRUxFT05fUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9SRUxBSVNfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9PUEVORENDX1BJRCkgfSwKQEAgLTY0Nyw2ICs2NDgsNyBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRVZFUl9FQ09fUFJPX0NEUykgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzFfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMl9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8zX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8wX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8xX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8yX1BJRCkgfSwKQEAgLTg0Nyw3ICs4NDksOCBAQAogCVtGVDIyMzJDXSA9ICJGVDIyMzJDIiwKIAlbRlQyMzJSTF0gPSAiRlQyMzJSTCIsCiAJW0ZUMjIzMkhdID0gIkZUMjIzMkgiLAotCVtGVDQyMzJIXSA9ICJGVDQyMzJIIgorCVtGVDQyMzJIXSA9ICJGVDQyMzJIIiwKKwlbRlQyMzJIXSAgPSAiRlQyMzJIIgogfTsKIAogCkBAIC0xMTY3LDYgKzExNzAsNyBAQAogCQlicmVhazsKIAljYXNlIEZUMjIzMkg6IC8qIEZUMjIzMkggY2hpcCAqLwogCWNhc2UgRlQ0MjMySDogLyogRlQ0MjMySCBjaGlwICovCisJY2FzZSBGVDIzMkg6ICAvKiBGVDIzMkggY2hpcCAqLwogCQlpZiAoKGJhdWQgPD0gMTIwMDAwMDApICYgKGJhdWQgPj0gMTIwMCkpIHsKIAkJCWRpdl92YWx1ZSA9IGZ0ZGlfMjIzMmhfYmF1ZF90b19kaXZpc29yKGJhdWQpOwogCQl9IGVsc2UgaWYgKGJhdWQgPCAxMjAwKSB7CkBAIC0xNDI4LDkgKzE0MzIsMTIgQEAKIAl9IGVsc2UgaWYgKHZlcnNpb24gPCAweDYwMCkgewogCQkvKiBBc3N1bWUgaXQncyBhbiBGVDIzMkJNIChvciBGVDI0NUJNKSAqLwogCQlwcml2LT5jaGlwX3R5cGUgPSBGVDIzMkJNOwotCX0gZWxzZSB7Ci0JCS8qIEFzc3VtZSBpdCdzIGFuIEZUMjMyUiAqLworCX0gZWxzZSBpZiAodmVyc2lvbiA8IDB4OTAwKSB7CisJCS8qIEFzc3VtZSBpdCdzIGFuIEZUMjMyUkwgKi8KIAkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMzJSTDsKKwl9IGVsc2UgeworCQkvKiBBc3N1bWUgaXQncyBhbiBGVDIzMkggKi8KKwkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMzJIOwogCX0KIAlkZXZfaW5mbygmdWRldi0+ZGV2LCAiRGV0ZWN0ZWQgJXNcbiIsIGZ0ZGlfY2hpcF9uYW1lW3ByaXYtPmNoaXBfdHlwZV0pOwogfQpAQCAtMTU1OCw3ICsxNTY1LDggQEAKIAkJICAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMjMyQyB8fAogCQkgICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIzMlJMIHx8CiAJCSAgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUMjIzMkggfHwKLQkJICAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQ0MjMySCkpIHsKKwkJICAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQ0MjMySCB8fAorCQkgICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIzMkgpKSB7CiAJCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBvcnQtPmRldiwKIAkJCQkJCSAgICAmZGV2X2F0dHJfbGF0ZW5jeV90aW1lcik7CiAJCX0KQEAgLTE1NzksNyArMTU4Nyw4IEBACiAJCSAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMjMyQyB8fAogCQkgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUMjMyUkwgfHwKIAkJICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIyMzJIIHx8Ci0JCSAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQ0MjMySCkgeworCQkgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUNDIzMkggfHwKKyAgICAgICAgICAgICAgICAgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUMjMySCkgewogCQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwb3J0LT5kZXYsICZkZXZfYXR0cl9sYXRlbmN5X3RpbWVyKTsKIAkJfQogCX0KQEAgLTIyMTEsNiArMjIyMCw3IEBACiAJY2FzZSBGVDIzMlJMOgogCWNhc2UgRlQyMjMySDoKIAljYXNlIEZUNDIzMkg6CisJY2FzZSBGVDIzMkg6CiAJCWxlbiA9IDI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCmluZGV4IDIxM2ZlM2QuLjE5NTg0ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCkBAIC0xNTYsNyArMTU2LDggQEAKIAlGVDIyMzJDID0gNCwKIAlGVDIzMlJMID0gNSwKIAlGVDIyMzJIID0gNiwKLQlGVDQyMzJIID0gNworCUZUNDIzMkggPSA3LAorCUZUMjMySCAgPSA4CiB9OwogCiBlbnVtIGZ0ZGlfc2lvX2JhdWRyYXRlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaAppbmRleCAxZDk0NmNkLi4xOTE1NmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvX2lkcy5oCkBAIC0yMiw2ICsyMiw3IEBACiAjZGVmaW5lIEZURElfOFUyMzJBTV9BTFRfUElEIDB4NjAwNiAvKiBGVERJJ3MgYWx0ZXJuYXRlIFBJRCBmb3IgYWJvdmUgKi8KICNkZWZpbmUgRlRESV84VTIyMzJDX1BJRCAweDYwMTAgLyogRHVhbCBjaGFubmVsIGRldmljZSAqLwogI2RlZmluZSBGVERJXzQyMzJIX1BJRCAweDYwMTEgLyogUXVhZCBjaGFubmVsIGhpLXNwZWVkIGRldmljZSAqLworI2RlZmluZSBGVERJXzIzMkhfUElEICAweDYwMTQgLyogU2luZ2xlIGNoYW5uZWwgaGktc3BlZWQgZGV2aWNlICovCiAjZGVmaW5lIEZURElfU0lPX1BJRAkweDgzNzIJLyogUHJvZHVjdCBJZCBTSU8gYXBwbGljYXRpb24gb2YgOFUxMDBBWCAqLwogI2RlZmluZSBGVERJXzIzMlJMX1BJRCAgMHhGQkZBICAvKiBQcm9kdWN0IElEIGZvciBGVDIzMlJMICovCiAKQEAgLTM1MSw2ICszNTIsNyBAQAogICovCiAjZGVmaW5lIEZURElfNE5fR0FMQVhZX0RFXzFfUElECTB4RjNDMAogI2RlZmluZSBGVERJXzROX0dBTEFYWV9ERV8yX1BJRAkweEYzQzEKKyNkZWZpbmUgRlRESV80Tl9HQUxBWFlfREVfM19QSUQJMHhGM0MyCiAKIC8qCiAgKiBMaW54IFRlY2hub2xvZ2llcyBwcm9kdWN0IGlkcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCmluZGV4IDMxOGRkMDAuLjYwYjI1ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKQEAgLTMxMSwxMCArMzExLDYgQEAKICNkZWZpbmUgWlRFX1BST0RVQ1RfQUMyNzI2CQkJMHhmZmY1CiAjZGVmaW5lIFpURV9QUk9EVUNUX0FDODcxMFQJCQkweGZmZmYKIAotLyogWlRFIFBST0RVQ1RTIC0tIGFsdGVybmF0ZSB2ZW5kb3IgSUQgKi8KLSNkZWZpbmUgWlRFX1ZFTkRPUl9JRDIJCQkJMHgxZDZiCi0jZGVmaW5lIFpURV9QUk9EVUNUX01GXzMzMAkJCTB4MDAwMgotCiAjZGVmaW5lIEJFTlFfVkVORE9SX0lECQkJCTB4MDRhNQogI2RlZmluZSBCRU5RX1BST0RVQ1RfSDEwCQkJMHg0MDY4CiAKQEAgLTM0MCwxMSArMzM2LDEyIEBACiAjZGVmaW5lIFRPU0hJQkFfUFJPRFVDVF9HNDUwCQkJMHgwZDQ1CiAKICNkZWZpbmUgQUxJTktfVkVORE9SX0lECQkJCTB4MWUwZQorI2RlZmluZSBBTElOS19QUk9EVUNUX1BIMzAwCQkJMHg5MTAwCiAjZGVmaW5lIEFMSU5LX1BST0RVQ1RfM0dVCQkJMHg5MjAwCiAKIC8qIEFMQ0FURUwgUFJPRFVDVFMgKi8KICNkZWZpbmUgQUxDQVRFTF9WRU5ET1JfSUQJCQkweDFiYmIKLSNkZWZpbmUgQUxDQVRFTF9QUk9EVUNUX1gwNjBTCQkJMHgwMDAwCisjZGVmaW5lIEFMQ0FURUxfUFJPRFVDVF9YMDYwU19YMjAwCQkweDAwMDAKIAogI2RlZmluZSBQSVJFTExJX1ZFTkRPUl9JRAkJCTB4MTI2NgogI2RlZmluZSBQSVJFTExJX1BST0RVQ1RfQzEwMF8xCQkJMHgxMDAyCkBAIC0zNzksNiArMzc2LDkgQEAKICAqIEl0IHNlZW1zIHRvIGNvbnRhaW4gYSBRdWFsY29tbSBRU0M2MjQwLzYyOTAgY2hpcHNldCAgICAgICAgICAgICovCiAjZGVmaW5lIEZPVVJfR19TWVNURU1TX1BST0RVQ1RfVzE0CQkweDk2MDMKIAorLyogWm9vbSAqLworI2RlZmluZSBaT09NX1BST0RVQ1RfNDU5NwkJCTB4OTYwNworCiAvKiBIYWllciBwcm9kdWN0cyAqLwogI2RlZmluZSBIQUlFUl9WRU5ET1JfSUQJCQkJMHgyMDFlCiAjZGVmaW5lIEhBSUVSX1BST0RVQ1RfQ0UxMDAJCQkweDIwMDkKQEAgLTQzMiw2ICs0MzIsMjAgQEAKIAkucmVhc29uID0gT1BUSU9OX0JMQUNLTElTVF9TRU5EU0VUVVAKIH07CiAKK3N0YXRpYyBjb25zdCB1OCBhbGNhdGVsX3gyMDBfbm9fc2VuZHNldHVwW10gPSB7IDAsIDEgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uX2JsYWNrbGlzdF9pbmZvIGFsY2F0ZWxfeDIwMF9ibGFja2xpc3QgPSB7CisJLmluZm9sZW4gPSBBUlJBWV9TSVpFKGFsY2F0ZWxfeDIwMF9ub19zZW5kc2V0dXApLAorCS5pZmFjZWluZm8gPSBhbGNhdGVsX3gyMDBfbm9fc2VuZHNldHVwLAorCS5yZWFzb24gPSBPUFRJT05fQkxBQ0tMSVNUX1NFTkRTRVRVUAorfTsKKworc3RhdGljIGNvbnN0IHU4IHp0ZV9rMzc2NV96X25vX3NlbmRzZXR1cFtdID0geyAwLCAxLCAyIH07CitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbl9ibGFja2xpc3RfaW5mbyB6dGVfazM3NjVfel9ibGFja2xpc3QgPSB7CisJLmluZm9sZW4gPSBBUlJBWV9TSVpFKHp0ZV9rMzc2NV96X25vX3NlbmRzZXR1cCksCisJLmlmYWNlaW5mbyA9IHp0ZV9rMzc2NV96X25vX3NlbmRzZXR1cCwKKwkucmVhc29uID0gT1BUSU9OX0JMQUNLTElTVF9TRU5EU0VUVVAKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBvcHRpb25faWRzW10gPSB7CiAJeyBVU0JfREVWSUNFKE9QVElPTl9WRU5ET1JfSUQsIE9QVElPTl9QUk9EVUNUX0NPTFQpIH0sCiAJeyBVU0JfREVWSUNFKE9QVElPTl9WRU5ET1JfSUQsIE9QVElPTl9QUk9EVUNUX1JJQ09MQSkgfSwKQEAgLTkxNiwxMyArOTMwLDEzIEBACiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAwNzMsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAxMzAsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAxNDEsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCi0JeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDIwMDIsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDIwMDIsIDB4ZmYsCisJICAweGZmLCAweGZmKSwgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZ6dGVfazM3NjVfel9ibGFja2xpc3QgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MjAwMywgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0NETUFfVEVDSCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0FDODcxMCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0FDMjcyNiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0FDODcxMFQsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCi0JeyBVU0JfREVWSUNFKFpURV9WRU5ET1JfSUQyLCBaVEVfUFJPRFVDVF9NRl8zMzApIH0sCiAJeyBVU0JfREVWSUNFKEJFTlFfVkVORE9SX0lELCBCRU5RX1BST0RVQ1RfSDEwKSB9LAogCXsgVVNCX0RFVklDRShETElOS19WRU5ET1JfSUQsIERMSU5LX1BST0RVQ1RfRFdNXzY1MikgfSwKIAl7IFVTQl9ERVZJQ0UoQUxJTktfVkVORE9SX0lELCBETElOS19QUk9EVUNUX0RXTV82NTJfVTUpIH0sIC8qIFllcywgQUxJTktfVkVORE9SX0lEICovCkBAIC05MzUsMTMgKzk0OSwxNyBAQAogCXsgVVNCX0RFVklDRShUT1NISUJBX1ZFTkRPUl9JRCwgVE9TSElCQV9QUk9EVUNUX0c0NTApIH0sCiAJeyBVU0JfREVWSUNFKFRPU0hJQkFfVkVORE9SX0lELCBUT1NISUJBX1BST0RVQ1RfSFNEUEFfTUlOSUNBUkQgKSB9LCAvKiBUb3NoaWJhIDNHIEhTRFBBID09IE5vdmF0ZWwgRXhwZWRpdGUgRVU4NzBEIE1pbmlDYXJkICovCiAJeyBVU0JfREVWSUNFKEFMSU5LX1ZFTkRPUl9JRCwgMHg5MDAwKSB9LAorCXsgVVNCX0RFVklDRShBTElOS19WRU5ET1JfSUQsIEFMSU5LX1BST0RVQ1RfUEgzMDApIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhBTElOS19WRU5ET1JfSUQsIEFMSU5LX1BST0RVQ1RfM0dVLCAweGZmLCAweGZmLCAweGZmKSB9LAotCXsgVVNCX0RFVklDRShBTENBVEVMX1ZFTkRPUl9JRCwgQUxDQVRFTF9QUk9EVUNUX1gwNjBTKSB9LAorCXsgVVNCX0RFVklDRShBTENBVEVMX1ZFTkRPUl9JRCwgQUxDQVRFTF9QUk9EVUNUX1gwNjBTX1gyMDApLAorCSAgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZhbGNhdGVsX3gyMDBfYmxhY2tsaXN0CisJfSwKIAl7IFVTQl9ERVZJQ0UoQUlSUExVU19WRU5ET1JfSUQsIEFJUlBMVVNfUFJPRFVDVF9NQ0Q2NTApIH0sCiAJeyBVU0JfREVWSUNFKFRMQVlURUNIX1ZFTkRPUl9JRCwgVExBWVRFQ0hfUFJPRFVDVF9URVU4MDApIH0sCiAJeyBVU0JfREVWSUNFKExPTkdDSEVFUl9WRU5ET1JfSUQsIEZPVVJfR19TWVNURU1TX1BST0RVQ1RfVzE0KSwKICAgCSAgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZmb3VyX2dfdzE0X2JsYWNrbGlzdAogICAJfSwKKwl7IFVTQl9ERVZJQ0UoTE9OR0NIRUVSX1ZFTkRPUl9JRCwgWk9PTV9QUk9EVUNUXzQ1OTcpIH0sCiAJeyBVU0JfREVWSUNFKEhBSUVSX1ZFTkRPUl9JRCwgSEFJRVJfUFJPRFVDVF9DRTEwMCkgfSwKIAkvKiBQaXJlbGxpICAqLwogCXsgVVNCX0RFVklDRShQSVJFTExJX1ZFTkRPUl9JRCwgUElSRUxMSV9QUk9EVUNUX0MxMDBfMSl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCmluZGV4IDMwNDYxZmMuLjFkMzMyNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKQEAgLTkxLDYgKzkxLDcgQEAKIAl7IFVTQl9ERVZJQ0UoU09OWV9WRU5ET1JfSUQsIFNPTllfUU4zVVNCX1BST0RVQ1RfSUQpIH0sCiAJeyBVU0JfREVWSUNFKFNBTldBX1ZFTkRPUl9JRCwgU0FOV0FfUFJPRFVDVF9JRCkgfSwKIAl7IFVTQl9ERVZJQ0UoQURMSU5LX1ZFTkRPUl9JRCwgQURMSU5LX05ENjUzMF9QUk9EVUNUX0lEKSB9LAorCXsgVVNCX0RFVklDRShXSU5DSElQSEVBRF9WRU5ET1JfSUQsIFdJTkNISVBIRUFEX1VTQlNFUl9QUk9EVUNUX0lEKSB9LAogCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKQEAgLTM0MiwxMCArMzQzLDI4IEBACiAJCQkJYmF1ZCA9IDYwMDAwMDA7CiAJCX0KIAkJZGJnKCIlcyAtIGJhdWQgc2V0ID0gJWQiLCBfX2Z1bmNfXywgYmF1ZCk7Ci0JCWJ1ZlswXSA9IGJhdWQgJiAweGZmOwotCQlidWZbMV0gPSAoYmF1ZCA+PiA4KSAmIDB4ZmY7Ci0JCWJ1ZlsyXSA9IChiYXVkID4+IDE2KSAmIDB4ZmY7Ci0JCWJ1ZlszXSA9IChiYXVkID4+IDI0KSAmIDB4ZmY7CisJCWlmIChiYXVkIDw9IDExNTIwMCkgeworCQkJYnVmWzBdID0gYmF1ZCAmIDB4ZmY7CisJCQlidWZbMV0gPSAoYmF1ZCA+PiA4KSAmIDB4ZmY7CisJCQlidWZbMl0gPSAoYmF1ZCA+PiAxNikgJiAweGZmOworCQkJYnVmWzNdID0gKGJhdWQgPj4gMjQpICYgMHhmZjsKKwkJfSBlbHNlIHsKKwkJCS8qIGFwcGFyZW50bHkgdGhlIGZvcm11bGEgZm9yIGhpZ2hlciBzcGVlZHMgaXM6CisJCQkgKiBiYXVkcmF0ZSA9IDEyTSAqIDMyIC8gKDJeYnVmWzFdKSAvIGJ1ZlswXQorCQkJICovCisJCQl1bnNpZ25lZCB0bXAgPSAxMioxMDAwKjEwMDAqMzIgLyBiYXVkOworCQkJYnVmWzNdID0gMHg4MDsKKwkJCWJ1ZlsyXSA9IDA7CisJCQlidWZbMV0gPSAodG1wID49IDI1Nik7CisJCQl3aGlsZSAodG1wID49IDI1NikgeworCQkJCXRtcCA+Pj0gMjsKKwkJCQlidWZbMV0gPDw9IDE7CisJCQl9CisJCQlpZiAodG1wID4gMjU2KSB7CisJCQkJdG1wICU9IDI1NjsKKwkJCX0KKwkJCWJ1ZlswXSA9IHRtcDsKKwkJfQogCX0KIAogCS8qIEZvciByZWZlcmVuY2UgYnVmWzRdPTAgaXMgMSBzdG9wIGJpdHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuaAppbmRleCAxYjAyNWY3Li5jYTBkMjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5oCkBAIC0xNDQsMyArMTQ0LDcgQEAKIC8qIEFETElOSyBORC02NTMwIFJTMjMyLFJTNDg1IGFuZCBSUzQyMiBhZGFwdGVyICovCiAjZGVmaW5lIEFETElOS19WRU5ET1JfSUQJCTB4MGI2MwogI2RlZmluZSBBRExJTktfTkQ2NTMwX1BST0RVQ1RfSUQJMHg2NTMwCisKKy8qIFdpbkNoaXBIZWFkIFVTQi0+UlMgMjMyIGFkYXB0ZXIgKi8KKyNkZWZpbmUgV0lOQ0hJUEhFQURfVkVORE9SX0lECQkweDQzNDgKKyNkZWZpbmUgV0lOQ0hJUEhFQURfVVNCU0VSX1BST0RVQ1RfSUQJMHg1NTIzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwppbmRleCBjNmQ5MmE1Li5lYTg0NDU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKQEAgLTE3NDUsNiArMTc0NSw3IEBACiAJfQogCWlmIChmd19wLT5zaXplID4gVElfRklSTVdBUkVfQlVGX1NJWkUpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICIlcyAtIGZpcm13YXJlIHRvbyBsYXJnZSAlenVcbiIsIF9fZnVuY19fLCBmd19wLT5zaXplKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19wKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKaW5kZXggOTc5ODcyNS4uNThhYWJlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZwpAQCAtNDAsNiArNDAsMTAgQEAKIAogCSAgSWYgdGhpcyBkcml2ZXIgaXMgY29tcGlsZWQgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgbmFtZWQgdW1zLXJlYWx0ZWsuCiAKK2NvbmZpZyBSRUFMVEVLX0FVVE9QTQorCWJvb2wgIlJlYWx0ZWsgQ2FyZCBSZWFkZXIgYXV0b3N1c3BlbmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQl9TVE9SQUdFX1JFQUxURUsgJiYgQ09ORklHX1BNX1JVTlRJTUUKKwlkZWZhdWx0IHkKIAogY29uZmlnIFVTQl9TVE9SQUdFX0RBVEFGQUIKIAl0cmlzdGF0ZSAiRGF0YWZhYiBDb21wYWN0IEZsYXNoIFJlYWRlciBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9yZWFsdGVrX2NyLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3JlYWx0ZWtfY3IuYwppbmRleCBkNTA5YTRhLi4zNGFkYzRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3JlYWx0ZWtfY3IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3JlYWx0ZWtfY3IuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIApAQCAtNTEsNiArNTAsMzUgQEAKIG1vZHVsZV9wYXJhbShhdXRvX2RlbGlua19lbiwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGF1dG9fZGVsaW5rX2VuLCAiZW5hYmxlIGF1dG8gZGVsaW5rIik7CiAKKyNpZmRlZiBDT05GSUdfUkVBTFRFS19BVVRPUE0KK3N0YXRpYyBpbnQgc3NfZW4gPSAxOworbW9kdWxlX3BhcmFtKHNzX2VuLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0Moc3NfZW4sICJlbmFibGUgc2VsZWN0aXZlIHN1c3BlbmQiKTsKKworc3RhdGljIGludCBzc19kZWxheSA9IDUwOworbW9kdWxlX3BhcmFtKHNzX2RlbGF5LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0Moc3NfZGVsYXksCisJCSAic2Vjb25kcyB0byBkZWxheSBiZWZvcmUgZW50ZXJpbmcgc2VsZWN0aXZlIHN1c3BlbmQiKTsKKworZW51bSBSVFM1MVhfU1RBVCB7CisJUlRTNTFYX1NUQVRfSU5JVCwKKwlSVFM1MVhfU1RBVF9JRExFLAorCVJUUzUxWF9TVEFUX1JVTiwKKwlSVFM1MVhfU1RBVF9TUworfTsKKworI2RlZmluZSBQT0xMSU5HX0lOVEVSVkFMCTUwCisKKyNkZWZpbmUgcnRzNTF4X3NldF9zdGF0KGNoaXAsIHN0YXQpCVwKKwkoKGNoaXApLT5zdGF0ZSA9IChlbnVtIFJUUzUxWF9TVEFUKShzdGF0KSkKKyNkZWZpbmUgcnRzNTF4X2dldF9zdGF0KGNoaXApCQkoKGNoaXApLT5zdGF0ZSkKKworI2RlZmluZSBTRVRfTFVOX1JFQURZKGNoaXAsIGx1bikJKChjaGlwKS0+bHVuX3JlYWR5IHw9ICgodTgpMSA8PCAobHVuKSkpCisjZGVmaW5lIENMUl9MVU5fUkVBRFkoY2hpcCwgbHVuKQkoKGNoaXApLT5sdW5fcmVhZHkgJj0gfigodTgpMSA8PCAobHVuKSkpCisjZGVmaW5lIFRTVF9MVU5fUkVBRFkoY2hpcCwgbHVuKQkoKGNoaXApLT5sdW5fcmVhZHkgJiAoKHU4KTEgPDwgKGx1bikpKQorCisjZW5kaWYKKwogc3RydWN0IHJ0czUxeF9zdGF0dXMgewogCXUxNiB2aWQ7CiAJdTE2IHBpZDsKQEAgLTcwLDE0ICs5OCwyNSBAQAogfTsKIAogc3RydWN0IHJ0czUxeF9jaGlwIHsKLQl1MTYJCQl2ZW5kb3JfaWQ7Ci0JdTE2CQkJcHJvZHVjdF9pZDsKLQljaGFyCQkJbWF4X2x1bjsKKwl1MTYgdmVuZG9yX2lkOworCXUxNiBwcm9kdWN0X2lkOworCWNoYXIgbWF4X2x1bjsKIAotCXN0cnVjdCBydHM1MXhfc3RhdHVzCSpzdGF0dXM7Ci0JaW50CQkJc3RhdHVzX2xlbjsKKwlzdHJ1Y3QgcnRzNTF4X3N0YXR1cyAqc3RhdHVzOworCWludCBzdGF0dXNfbGVuOwogCi0JdTMyCQkJZmxhZzsKKwl1MzIgZmxhZzsKKyNpZmRlZiBDT05GSUdfUkVBTFRFS19BVVRPUE0KKwlzdHJ1Y3QgdXNfZGF0YSAqdXM7CisJc3RydWN0IHRpbWVyX2xpc3QgcnRzNTF4X3N1c3BlbmRfdGltZXI7CisJdW5zaWduZWQgbG9uZyB0aW1lcl9leHBpcmVzOworCWludCBwd3Jfc3RhdGU7CisJdTggbHVuX3JlYWR5OworCWVudW0gUlRTNTFYX1NUQVQgc3RhdGU7CisJaW50IHN1cHBvcnRfYXV0b19kZWxpbms7CisjZW5kaWYKKwkvKiB1c2VkIHRvIGJhY2sgdXAgdGhlIHByb3RvY2FsIGNob29zZW4gaW4gcHJvYmUxIHBoYXNlICovCisJcHJvdG9fY21uZCBwcm90b19oYW5kbGVyX2JhY2t1cDsKIH07CiAKIC8qIGZsYWcgZGVmaW5pdGlvbiAqLwpAQCAtOTcsOSArMTM2LDE0IEBACiAjZGVmaW5lIFJUUzUxWF9HRVRfVklEKGNoaXApCQkoKGNoaXApLT52ZW5kb3JfaWQpCiAjZGVmaW5lIFJUUzUxWF9HRVRfUElEKGNoaXApCQkoKGNoaXApLT5wcm9kdWN0X2lkKQogCisjZGVmaW5lIFZFTkRPUl9JRChjaGlwKQkJCSgoY2hpcCktPnN0YXR1c1swXS52aWQpCisjZGVmaW5lIFBST0RVQ1RfSUQoY2hpcCkJCSgoY2hpcCktPnN0YXR1c1swXS5waWQpCiAjZGVmaW5lIEZXX1ZFUlNJT04oY2hpcCkJCSgoY2hpcCktPnN0YXR1c1swXS5md192ZXIpCiAjZGVmaW5lIFNUQVRVU19MRU4oY2hpcCkJCSgoY2hpcCktPnN0YXR1c19sZW4pCiAKKyNkZWZpbmUgU1RBVFVTX1NVQ0NFU1MJCTAKKyNkZWZpbmUgU1RBVFVTX0ZBSUwJCTEKKwogLyogQ2hlY2sgY2FyZCByZWFkZXIgZnVuY3Rpb24gKi8KICNkZWZpbmUgU1VQUE9SVF9ERVRBSUxFRF9UWVBFMShjaGlwKQlcCiAJCUNIS19CSVQoKGNoaXApLT5zdGF0dXNbMF0uZnVuY3Rpb25bMF0sIDEpCkBAIC0xMTksMTUgKzE2Myw2IEBACiAjZGVmaW5lIENIRUNLX0lEKGNoaXAsIHBpZCwgZndfdmVyKQlcCiAJCShDSEVDS19QSUQoKGNoaXApLCAocGlkKSkgJiYgQ0hFQ0tfRldfVkVSKChjaGlwKSwgKGZ3X3ZlcikpKQogCi0jZGVmaW5lIHdhaXRfdGltZW91dF94KHRhc2tfc3RhdGUsIG1zZWNzKQlcCi1kbyB7CQkJCQkJXAotCXNldF9jdXJyZW50X3N0YXRlKCh0YXNrX3N0YXRlKSk7CVwKLQlzY2hlZHVsZV90aW1lb3V0KChtc2VjcykgKiBIWiAvIDEwMDApOwlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIHdhaXRfdGltZW91dChtc2VjcykJCVwKLQkJd2FpdF90aW1lb3V0X3goVEFTS19JTlRFUlJVUFRJQkxFLCAobXNlY3MpKQotCiBzdGF0aWMgaW50IGluaXRfcmVhbHRla19jcihzdHJ1Y3QgdXNfZGF0YSAqdXMpOwogCiAvKgpAQCAtMTQzLDggKzE3OCw5IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCByZWFsdGVrX2NyX2lkc1tdID0gewogIwlpbmNsdWRlICJ1bnVzdWFsX3JlYWx0ZWsuaCIKLQl7IH0JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCisJe30JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKKwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHJlYWx0ZWtfY3JfaWRzKTsKIAogI3VuZGVmIFVOVVNVQUxfREVWCkBAIC0xNjUsNyArMjAxLDcgQEAKIAogc3RhdGljIHN0cnVjdCB1c191bnVzdWFsX2RldiByZWFsdGVrX2NyX3VudXN1YWxfZGV2X2xpc3RbXSA9IHsKICMJaW5jbHVkZSAidW51c3VhbF9yZWFsdGVrLmgiCi0JeyB9CQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKICN1bmRlZiBVTlVTVUFMX0RFVgpAQCAtMTc0LDggKzIxMCw4IEBACiAJCQkJIHU4ICpjbWQsIGludCBjbWRfbGVuLCB1OCAqYnVmLCBpbnQgYnVmX2xlbiwKIAkJCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLCBpbnQgKmFjdF9sZW4pCiB7Ci0Jc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwotCXN0cnVjdCBidWxrX2NzX3dyYXAgKmJjcyA9IChzdHJ1Y3QgYnVsa19jc193cmFwICopIHVzLT5pb2J1ZjsKKwlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKXVzLT5pb2J1ZjsKKwlzdHJ1Y3QgYnVsa19jc193cmFwICpiY3MgPSAoc3RydWN0IGJ1bGtfY3Nfd3JhcCAqKXVzLT5pb2J1ZjsKIAlpbnQgcmVzdWx0OwogCXVuc2lnbmVkIGludCByZXNpZHVlOwogCXVuc2lnbmVkIGludCBjc3dsZW47CkBAIC0xOTUsNyArMjMxLDcgQEAKIAogCS8qIHNlbmQgaXQgdG8gb3V0IGVuZHBvaW50ICovCiAJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSwKLQkJCQliY2IsIGNid2xlbiwgTlVMTCk7CisJCQkJCSAgICBiY2IsIGNid2xlbiwgTlVMTCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKQEAgLTIwNCwyNCArMjQwLDIzIEBACiAKIAlpZiAoYnVmICYmIGJ1Zl9sZW4pIHsKIAkJdW5zaWduZWQgaW50IHBpcGUgPSAoZGlyID09IERNQV9GUk9NX0RFVklDRSkgPwotCQkJCXVzLT5yZWN2X2J1bGtfcGlwZSA6IHVzLT5zZW5kX2J1bGtfcGlwZTsKKwkJICAgIHVzLT5yZWN2X2J1bGtfcGlwZSA6IHVzLT5zZW5kX2J1bGtfcGlwZTsKIAkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHBpcGUsCi0JCQkJYnVmLCBidWZfbGVuLCBOVUxMKTsKKwkJCQkJCSAgICBidWYsIGJ1Zl9sZW4sIE5VTEwpOwogCQlpZiAocmVzdWx0ID09IFVTQl9TVE9SX1hGRVJfRVJST1IpCiAJCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAogCS8qIGdldCBDU1cgZm9yIGRldmljZSBzdGF0dXMgKi8KIAlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLAotCQkJCWJjcywgVVNfQlVMS19DU19XUkFQX0xFTiwgJmNzd2xlbik7CisJCQkJCSAgICBiY3MsIFVTX0JVTEtfQ1NfV1JBUF9MRU4sICZjc3dsZW4pOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCiAJLyogY2hlY2sgYnVsayBzdGF0dXMgKi8KIAlpZiAoYmNzLT5TaWduYXR1cmUgIT0gY3B1X3RvX2xlMzIoVVNfQlVMS19DU19TSUdOKSkgewogCQlVU19ERUJVR1AoIlNpZ25hdHVyZSBtaXNtYXRjaDogZ290ICUwOFgsIGV4cGVjdGluZyAlMDhYXG4iLAotCQkJICBsZTMyX3RvX2NwdShiY3MtPlNpZ25hdHVyZSksCi0JCQkgIFVTX0JVTEtfQ1NfU0lHTik7CisJCQkgIGxlMzJfdG9fY3B1KGJjcy0+U2lnbmF0dXJlKSwgVVNfQlVMS19DU19TSUdOKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKQEAgLTI0OSw4ICsyODQsOCBAQAogCiAJY2FzZSBVU19CVUxLX1NUQVRfUEhBU0U6CiAJCS8qIHBoYXNlIGVycm9yIC0tIG5vdGUgdGhhdCBhIHRyYW5zcG9ydCByZXNldCB3aWxsIGJlCi0JCQkqIGludm9rZWQgYnkgdGhlIGludm9rZV90cmFuc3BvcnQoKSBmdW5jdGlvbgotCQkJKi8KKwkJICogaW52b2tlZCBieSB0aGUgaW52b2tlX3RyYW5zcG9ydCgpIGZ1bmN0aW9uCisJCSAqLwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIApAQCAtMjY2LDEwICszMDEsMTAgQEAKIAkvKiBpc3N1ZSB0aGUgY29tbWFuZCAqLwogCXVzLT5pb2J1ZlswXSA9IDA7CiAJcmVzdWx0ID0gdXNiX3N0b3JfY29udHJvbF9tc2codXMsIHVzLT5yZWN2X2N0cmxfcGlwZSwKLQkJCQkgVVNfQlVMS19HRVRfTUFYX0xVTiwKLQkJCQkgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX0NMQVNTIHwKLQkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKLQkJCQkgMCwgdXMtPmlmbnVtLCB1cy0+aW9idWYsIDEsIDEwKkhaKTsKKwkJCQkgICAgICBVU19CVUxLX0dFVF9NQVhfTFVOLAorCQkJCSAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8CisJCQkJICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQkgICAgICAwLCB1cy0+aWZudW0sIHVzLT5pb2J1ZiwgMSwgMTAgKiBIWik7CiAKIAlVU19ERUJVR1AoIkdldE1heExVTiBjb21tYW5kIHJlc3VsdCBpcyAlZCwgZGF0YSBpcyAlZFxuIiwKIAkJICByZXN1bHQsIHVzLT5pb2J1ZlswXSk7CkBAIC0yODQsMTYgKzMxOSwxNiBAQAogc3RhdGljIGludCBydHM1MXhfcmVhZF9tZW0oc3RydWN0IHVzX2RhdGEgKnVzLCB1MTYgYWRkciwgdTggKmRhdGEsIHUxNiBsZW4pCiB7CiAJaW50IHJldHZhbDsKLQl1OCBjbW5kWzEyXSA9IHswfTsKKwl1OCBjbW5kWzEyXSA9IHsgMCB9OwogCiAJVVNfREVCVUdQKCIlcywgYWRkciA9IDB4JXgsIGxlbiA9ICVkXG4iLCBfX2Z1bmNfXywgYWRkciwgbGVuKTsKIAogCWNtbmRbMF0gPSAweEYwOwogCWNtbmRbMV0gPSAweDBEOwotCWNtbmRbMl0gPSAodTgpKGFkZHIgPj4gOCk7Ci0JY21uZFszXSA9ICh1OClhZGRyOwotCWNtbmRbNF0gPSAodTgpKGxlbiA+PiA4KTsKLQljbW5kWzVdID0gKHU4KWxlbjsKKwljbW5kWzJdID0gKHU4KSAoYWRkciA+PiA4KTsKKwljbW5kWzNdID0gKHU4KSBhZGRyOworCWNtbmRbNF0gPSAodTgpIChsZW4gPj4gOCk7CisJY21uZFs1XSA9ICh1OCkgbGVuOwogCiAJcmV0dmFsID0gcnRzNTF4X2J1bGtfdHJhbnNwb3J0KHVzLCAwLCBjbW5kLCAxMiwKIAkJCQkgICAgICAgZGF0YSwgbGVuLCBETUFfRlJPTV9ERVZJQ0UsIE5VTEwpOwpAQCAtMzA2LDE2ICszNDEsMTYgQEAKIHN0YXRpYyBpbnQgcnRzNTF4X3dyaXRlX21lbShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHUxNiBhZGRyLCB1OCAqZGF0YSwgdTE2IGxlbikKIHsKIAlpbnQgcmV0dmFsOwotCXU4IGNtbmRbMTJdID0gezB9OworCXU4IGNtbmRbMTJdID0geyAwIH07CiAKIAlVU19ERUJVR1AoIiVzLCBhZGRyID0gMHgleCwgbGVuID0gJWRcbiIsIF9fZnVuY19fLCBhZGRyLCBsZW4pOwogCiAJY21uZFswXSA9IDB4RjA7CiAJY21uZFsxXSA9IDB4MEU7Ci0JY21uZFsyXSA9ICh1OCkoYWRkciA+PiA4KTsKLQljbW5kWzNdID0gKHU4KWFkZHI7Ci0JY21uZFs0XSA9ICh1OCkobGVuID4+IDgpOwotCWNtbmRbNV0gPSAodTgpbGVuOworCWNtbmRbMl0gPSAodTgpIChhZGRyID4+IDgpOworCWNtbmRbM10gPSAodTgpIGFkZHI7CisJY21uZFs0XSA9ICh1OCkgKGxlbiA+PiA4KTsKKwljbW5kWzVdID0gKHU4KSBsZW47CiAKIAlyZXR2YWwgPSBydHM1MXhfYnVsa190cmFuc3BvcnQodXMsIDAsIGNtbmQsIDEyLAogCQkJCSAgICAgICBkYXRhLCBsZW4sIERNQV9UT19ERVZJQ0UsIE5VTEwpOwpAQCAtMzI5LDcgKzM2NCw3IEBACiAJCQkgICAgICB1OCBsdW4sIHU4ICpzdGF0dXMsIGludCBsZW4sIGludCAqYWN0bGVuKQogewogCWludCByZXR2YWw7Ci0JdTggY21uZFsxMl0gPSB7MH07CisJdTggY21uZFsxMl0gPSB7IDAgfTsKIAogCVVTX0RFQlVHUCgiJXMsIGx1biA9ICVkXG4iLCBfX2Z1bmNfXywgbHVuKTsKIApAQCAtMzU2LDEyICszOTEsMTIgQEAKIAogCVVTX0RFQlVHUCgiY2hpcC0+c3RhdHVzX2xlbiA9ICVkXG4iLCBjaGlwLT5zdGF0dXNfbGVuKTsKIAotCWNoaXAtPnN0YXR1c1tsdW5dLnZpZCA9ICgodTE2KWJ1ZlswXSA8PCA4KSB8IGJ1ZlsxXTsKLQljaGlwLT5zdGF0dXNbbHVuXS5waWQgPSAoKHUxNilidWZbMl0gPDwgOCkgfCBidWZbM107CisJY2hpcC0+c3RhdHVzW2x1bl0udmlkID0gKCh1MTYpIGJ1ZlswXSA8PCA4KSB8IGJ1ZlsxXTsKKwljaGlwLT5zdGF0dXNbbHVuXS5waWQgPSAoKHUxNikgYnVmWzJdIDw8IDgpIHwgYnVmWzNdOwogCWNoaXAtPnN0YXR1c1tsdW5dLmN1cl9sdW4gPSBidWZbNF07CiAJY2hpcC0+c3RhdHVzW2x1bl0uY2FyZF90eXBlID0gYnVmWzVdOwogCWNoaXAtPnN0YXR1c1tsdW5dLnRvdGFsX2x1biA9IGJ1Zls2XTsKLQljaGlwLT5zdGF0dXNbbHVuXS5md192ZXIgPSAoKHUxNilidWZbN10gPDwgOCkgfCBidWZbOF07CisJY2hpcC0+c3RhdHVzW2x1bl0uZndfdmVyID0gKCh1MTYpIGJ1Zls3XSA8PCA4KSB8IGJ1Zls4XTsKIAljaGlwLT5zdGF0dXNbbHVuXS5waHlfZXhpc3QgPSBidWZbOV07CiAJY2hpcC0+c3RhdHVzW2x1bl0ubXVsdGlfZmxhZyA9IGJ1ZlsxMF07CiAJY2hpcC0+c3RhdHVzW2x1bl0ubXVsdGlfY2FyZCA9IGJ1ZlsxMV07CkBAIC00MzIsNiArNDY3LDggQEAKIAlpbnQgcmV0dmFsOwogCXU4IHZhbHVlOwogCisJVVNfREVCVUdQKCIlczogPC0tLVxuIiwgX19mdW5jX18pOworCiAJaWYgKCFDSEtfQVVUT19ERUxJTksoY2hpcCkpCiAJCXJldHVybiAwOwogCkBAIC00NjUsNyArNTAyLDcgQEAKIAkJCUNMUl9CSVQodmFsdWUsIDIpOwogCiAJCWlmIChDSEVDS19JRChjaGlwLCAweDAxNTksIDB4NTg4OSkgfHwKLQkJCQlDSEVDS19JRChjaGlwLCAweDAxMzgsIDB4Mzg4MCkpIHsKKwkJICAgIENIRUNLX0lEKGNoaXAsIDB4MDEzOCwgMHgzODgwKSkgewogCQkJQ0xSX0JJVCh2YWx1ZSwgMCk7CiAJCQlDTFJfQklUKHZhbHVlLCA3KTsKIAkJfQpAQCAtNDg3LDYgKzUyNCw4IEBACiAJCX0KIAl9CiAKKwlVU19ERUJVR1AoIiVzOiAtLS0+XG4iLCBfX2Z1bmNfXyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDk2LDYgKzUzNSw4IEBACiAJaW50IHJldHZhbDsKIAl1OCB2YWx1ZTsKIAorCVVTX0RFQlVHUCgiJXM6IDwtLS1cbiIsIF9fZnVuY19fKTsKKwogCWlmICghQ0hLX0FVVE9fREVMSU5LKGNoaXApKQogCQlyZXR1cm4gMDsKIApAQCAtNTI4LDE0ICs1NjksMTQgQEAKIAkJCXJldHVybiAtRUlPOwogCX0gZWxzZSB7CiAJCWlmIChDSEVDS19JRChjaGlwLCAweDAxNTksIDB4NTg4OSkgfHwKLQkJCQlDSEVDS19JRChjaGlwLCAweDAxMzgsIDB4Mzg4MCkgfHwKLQkJCQlDSEVDS19JRChjaGlwLCAweDAxMzgsIDB4Mzg4MikpIHsKKwkJICAgIENIRUNLX0lEKGNoaXAsIDB4MDEzOCwgMHgzODgwKSB8fAorCQkgICAgQ0hFQ0tfSUQoY2hpcCwgMHgwMTM4LCAweDM4ODIpKSB7CiAJCQlyZXR2YWwgPSBydHM1MXhfcmVhZF9tZW0odXMsIDB4RkU0NywgJnZhbHVlLCAxKTsKIAkJCWlmIChyZXR2YWwgPCAwKQogCQkJCXJldHVybiAtRUlPOwogCiAJCQlpZiAoQ0hFQ0tfSUQoY2hpcCwgMHgwMTU5LCAweDU4ODkpIHx8Ci0JCQkJCUNIRUNLX0lEKGNoaXAsIDB4MDEzOCwgMHgzODgwKSkgeworCQkJICAgIENIRUNLX0lEKGNoaXAsIDB4MDEzOCwgMHgzODgwKSkgewogCQkJCVNFVF9CSVQodmFsdWUsIDApOwogCQkJCVNFVF9CSVQodmFsdWUsIDcpOwogCQkJfQpAQCAtNTU2LDI1ICs1OTcsMzIzIEBACiAJCX0KIAl9CiAKKwlVU19ERUJVR1AoIiVzOiAtLS0+XG4iLCBfX2Z1bmNfXyk7CisKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZnc1ODk1X2luaXQoc3RydWN0IHVzX2RhdGEgKnVzKQoreworCXN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCA9IChzdHJ1Y3QgcnRzNTF4X2NoaXAgKikodXMtPmV4dHJhKTsKKwlpbnQgcmV0dmFsOworCXU4IHZhbDsKKworCVVTX0RFQlVHUCgiJXM6IDwtLS1cbiIsIF9fZnVuY19fKTsKKworCWlmICgoUFJPRFVDVF9JRChjaGlwKSAhPSAweDAxNTgpIHx8IChGV19WRVJTSU9OKGNoaXApICE9IDB4NTg5NSkpIHsKKwkJVVNfREVCVUdQKCJOb3QgdGhlIHNwZWNpZmllZCBkZXZpY2UsIHJldHVybiBpbW1lZGlhdGVseSFcbiIpOworCX0gZWxzZSB7CisJCXJldHZhbCA9IHJ0czUxeF9yZWFkX21lbSh1cywgMHhGRDZGLCAmdmFsLCAxKTsKKwkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUyAmJiAodmFsICYgMHgxRikgPT0gMCkgeworCQkJdmFsID0gMHgxRjsKKwkJCXJldHZhbCA9IHJ0czUxeF93cml0ZV9tZW0odXMsIDB4RkQ3MCwgJnZhbCwgMSk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVVTX0RFQlVHUCgiV3JpdGUgbWVtb3J5IGZhaWxcbiIpOworCQl9IGVsc2UgeworCQkJVVNfREVCVUdQKCJSZWFkIG1lbW9yeSBmYWlsLCBPUiAodmFsICYgMHgxRikgIT0gMFxuIik7CisJCX0KKwl9CisKKwlVU19ERUJVR1AoIiVzOiAtLS0+XG4iLCBfX2Z1bmNfXyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUkVBTFRFS19BVVRPUE0KK3N0YXRpYyB2b2lkIGZ3NTg5NV9zZXRfbW1jX3dwKHN0cnVjdCB1c19kYXRhICp1cykKK3sKKwlzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAgPSAoc3RydWN0IHJ0czUxeF9jaGlwICopKHVzLT5leHRyYSk7CisJaW50IHJldHZhbDsKKwl1OCBidWZbMTNdOworCisJVVNfREVCVUdQKCIlczogPC0tLVxuIiwgX19mdW5jX18pOworCisJaWYgKChQUk9EVUNUX0lEKGNoaXApICE9IDB4MDE1OCkgfHwgKEZXX1ZFUlNJT04oY2hpcCkgIT0gMHg1ODk1KSkgeworCQlVU19ERUJVR1AoIk5vdCB0aGUgc3BlY2lmaWVkIGRldmljZSwgcmV0dXJuIGltbWVkaWF0ZWx5IVxuIik7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gcnRzNTF4X3JlYWRfbWVtKHVzLCAweEZENkYsIGJ1ZiwgMSk7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MgJiYgKGJ1ZlswXSAmIDB4MjQpID09IDB4MjQpIHsKKwkJCS8qIFNEIEV4aXN0IGFuZCBTRCBXUCAqLworCQkJcmV0dmFsID0gcnRzNTF4X3JlYWRfbWVtKHVzLCAweEQwNEUsIGJ1ZiwgMSk7CisJCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJYnVmWzBdIHw9IDB4MDQ7CisJCQkJcmV0dmFsID0gcnRzNTF4X3dyaXRlX21lbSh1cywgMHhGRDcwLCBidWYsIDEpOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCVVTX0RFQlVHUCgiV3JpdGUgbWVtb3J5IGZhaWxcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlVU19ERUJVR1AoIlJlYWQgbWVtb3J5IGZhaWxcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJVVNfREVCVUdQKCJSZWFkIG1lbW9yeSBmYWlsLCBPUiAoYnVmWzBdJjB4MjQpIT0weDI0XG4iKTsKKwkJfQorCX0KKworCVVTX0RFQlVHUCgiJXM6IC0tLT5cbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHZvaWQgcnRzNTF4X21vZGlfc3VzcGVuZF90aW1lcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJVVNfREVCVUdQKCIlczogPC0tLSwgc3RhdGU6JWRcbiIsIF9fZnVuY19fLCBydHM1MXhfZ2V0X3N0YXQoY2hpcCkpOworCisJY2hpcC0+dGltZXJfZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDAqc3NfZGVsYXkpOworCW1vZF90aW1lcigmY2hpcC0+cnRzNTF4X3N1c3BlbmRfdGltZXIsIGNoaXAtPnRpbWVyX2V4cGlyZXMpOworCisJVVNfREVCVUdQKCIlczogLS0tPlxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgdm9pZCBydHM1MXhfc3VzcGVuZF90aW1lcl9mbih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwID0gKHN0cnVjdCBydHM1MXhfY2hpcCAqKWRhdGE7CisJc3RydWN0IHVzX2RhdGEgKnVzID0gY2hpcC0+dXM7CisKKwlVU19ERUJVR1AoIiVzOiA8LS0tXG4iLCBfX2Z1bmNfXyk7CisKKwlzd2l0Y2ggKHJ0czUxeF9nZXRfc3RhdChjaGlwKSkgeworCWNhc2UgUlRTNTFYX1NUQVRfSU5JVDoKKwljYXNlIFJUUzUxWF9TVEFUX1JVTjoKKwkJcnRzNTF4X21vZGlfc3VzcGVuZF90aW1lcihjaGlwKTsKKwkJYnJlYWs7CisJY2FzZSBSVFM1MVhfU1RBVF9JRExFOgorCWNhc2UgUlRTNTFYX1NUQVRfU1M6CisJCVVTX0RFQlVHUCgiJXM6IFJUUzUxWF9TVEFUX1NTLCBpbnRmLT5wbV91c2FnZV9jbnQ6JWQsIgorCQkJInBvd2VyLnVzYWdlOiVkXG4iLCBfX2Z1bmNfXywKKwkJCWF0b21pY19yZWFkKCZ1cy0+cHVzYl9pbnRmLT5wbV91c2FnZV9jbnQpLAorCQkJYXRvbWljX3JlYWQoJnVzLT5wdXNiX2ludGYtPmRldi5wb3dlci51c2FnZV9jb3VudCkpOworCisJCWlmIChhdG9taWNfcmVhZCgmdXMtPnB1c2JfaW50Zi0+cG1fdXNhZ2VfY250KSA+IDApIHsKKwkJCVVTX0RFQlVHUCgiJXM6IFJlYWR5IHRvIGVudGVyIFNTIHN0YXRlLlxuIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJ0czUxeF9zZXRfc3RhdChjaGlwLCBSVFM1MVhfU1RBVF9TUyk7CisJCQkvKiBpZ25vcmUgbWFzcyBzdG9yYWdlIGludGVyZmFjZSdzIGNoaWxkcmVuICovCisJCQlwbV9zdXNwZW5kX2lnbm9yZV9jaGlsZHJlbigmdXMtPnB1c2JfaW50Zi0+ZGV2LCB0cnVlKTsKKwkJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZSh1cy0+cHVzYl9pbnRmKTsKKwkJCVVTX0RFQlVHUCgiJXM6IFJUUzUxWF9TVEFUX1NTIDAxLCIKKwkJCQkiaW50Zi0+cG1fdXNhZ2VfY250OiVkLCBwb3dlci51c2FnZTolZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlhdG9taWNfcmVhZCgmdXMtPnB1c2JfaW50Zi0+cG1fdXNhZ2VfY250KSwKKwkJCQlhdG9taWNfcmVhZCgKKwkJCQkJJnVzLT5wdXNiX2ludGYtPmRldi5wb3dlci51c2FnZV9jb3VudCkpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVVTX0RFQlVHUCgiJXM6IFVua25vbnduIHN0YXRlICEhIVxuIiwgX19mdW5jX18pOworCQlicmVhazsKKwl9CisKKwlVU19ERUJVR1AoIiVzOiAtLS0+XG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdvcmtpbmdfc2NzaShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpCit7CisJaWYgKChzcmItPmNtbmRbMF0gPT0gVEVTVF9VTklUX1JFQURZKSB8fAorCSAgICAoc3JiLT5jbW5kWzBdID09IEFMTE9XX01FRElVTV9SRU1PVkFMKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBydHM1MXhfaW52b2tlX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKK3sKKwlzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAgPSAoc3RydWN0IHJ0czUxeF9jaGlwICopKHVzLT5leHRyYSk7CisJc3RhdGljIGludCBjYXJkX2ZpcnN0X3Nob3cgPSAxOworCXN0YXRpYyB1OCBtZWRpYV9ub3RfcHJlc2VudFtdID0geyAweDcwLCAwLCAweDAyLCAwLCAwLCAwLCAwLAorCQkxMCwgMCwgMCwgMCwgMCwgMHgzQSwgMCwgMCwgMCwgMCwgMAorCX07CisJc3RhdGljIHU4IGludmFsaWRfY21kX2ZpZWxkW10gPSB7IDB4NzAsIDAsIDB4MDUsIDAsIDAsIDAsIDAsCisJCTEwLCAwLCAwLCAwLCAwLCAweDI0LCAwLCAwLCAwLCAwLCAwCisJfTsKKwlpbnQgcmV0OworCisJVVNfREVCVUdQKCIlczogPC0tLVxuIiwgX19mdW5jX18pOworCisJaWYgKHdvcmtpbmdfc2NzaShzcmIpKSB7CisJCVVTX0RFQlVHUCgiJXM6IHdvcmtpbmcgc2NzaSwgaW50Zi0+cG1fdXNhZ2VfY250OiVkLCIKKwkJCSJwb3dlci51c2FnZTolZFxuIiwgX19mdW5jX18sCisJCQlhdG9taWNfcmVhZCgmdXMtPnB1c2JfaW50Zi0+cG1fdXNhZ2VfY250KSwKKwkJCWF0b21pY19yZWFkKCZ1cy0+cHVzYl9pbnRmLT5kZXYucG93ZXIudXNhZ2VfY291bnQpKTsKKworCQlpZiAoYXRvbWljX3JlYWQoJnVzLT5wdXNiX2ludGYtPnBtX3VzYWdlX2NudCkgPD0gMCkgeworCQkJcmV0ID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHVzLT5wdXNiX2ludGYpOworCQkJVVNfREVCVUdQKCIlczogd29ya2luZyBzY3NpLCByZXQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCQl9CisJCWlmIChydHM1MXhfZ2V0X3N0YXQoY2hpcCkgIT0gUlRTNTFYX1NUQVRfUlVOKQorCQkJcnRzNTF4X3NldF9zdGF0KGNoaXAsIFJUUzUxWF9TVEFUX1JVTik7CisJCWNoaXAtPnByb3RvX2hhbmRsZXJfYmFja3VwKHNyYiwgdXMpOworCX0gZWxzZSB7CisJCWlmIChydHM1MXhfZ2V0X3N0YXQoY2hpcCkgPT0gUlRTNTFYX1NUQVRfU1MpIHsKKwkJCVVTX0RFQlVHUCgiJXM6IE5PVCB3b3JraW5nIHNjc2lcbiIsIF9fZnVuY19fKTsKKwkJCWlmICgoc3JiLT5jbW5kWzBdID09IFRFU1RfVU5JVF9SRUFEWSkgJiYKKwkJCSAgICAoY2hpcC0+cHdyX3N0YXRlID09IFVTX1NVU1BFTkQpKSB7CisJCQkJaWYgKFRTVF9MVU5fUkVBRFkoY2hpcCwgc3JiLT5kZXZpY2UtPmx1bikpIHsKKwkJCQkJc3JiLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOworCQkJCX0gZWxzZSB7CisJCQkJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQkJCQltZW1jcHkoc3JiLT5zZW5zZV9idWZmZXIsCisJCQkJCSAgICAgICBtZWRpYV9ub3RfcHJlc2VudCwKKwkJCQkJICAgICAgIFVTX1NFTlNFX1NJWkUpOworCQkJCX0KKwkJCQlVU19ERUJVR1AoIiVzOiBURVNUX1VOSVRfUkVBRFktLS0+XG4iLAorCQkJCQkgIF9fZnVuY19fKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChzcmItPmNtbmRbMF0gPT0gQUxMT1dfTUVESVVNX1JFTU9WQUwpIHsKKwkJCQlpbnQgcHJldmVudCA9IHNyYi0+Y21uZFs0XSAmIDB4MTsKKwkJCQlpZiAocHJldmVudCkgeworCQkJCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJCQkJbWVtY3B5KHNyYi0+c2Vuc2VfYnVmZmVyLAorCQkJCQkgICAgICAgaW52YWxpZF9jbWRfZmllbGQsCisJCQkJCSAgICAgICBVU19TRU5TRV9TSVpFKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CisJCQkJfQorCQkJCVVTX0RFQlVHUCgiJXM6IEFMTE9XX01FRElVTV9SRU1PVkFMLS0tPlxuIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlVU19ERUJVR1AoIiVzOiBOT1Qgd29ya2luZyBzY3NpLCBub3QgU1NcbiIsIF9fZnVuY19fKTsKKwkJCWNoaXAtPnByb3RvX2hhbmRsZXJfYmFja3VwKHNyYiwgdXMpOworCQkJLyogQ2hlY2sgd2V0aGVyIGNhcmQgaXMgcGx1Z2dlZCBpbiAqLworCQkJaWYgKHNyYi0+Y21uZFswXSA9PSBURVNUX1VOSVRfUkVBRFkpIHsKKwkJCQlpZiAoc3JiLT5yZXN1bHQgPT0gU0FNX1NUQVRfR09PRCkgeworCQkJCQlTRVRfTFVOX1JFQURZKGNoaXAsIHNyYi0+ZGV2aWNlLT5sdW4pOworCQkJCQlpZiAoY2FyZF9maXJzdF9zaG93KSB7CisJCQkJCQljYXJkX2ZpcnN0X3Nob3cgPSAwOworCQkJCQkJZnc1ODk1X3NldF9tbWNfd3AodXMpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJQ0xSX0xVTl9SRUFEWShjaGlwLCBzcmItPmRldmljZS0+bHVuKTsKKwkJCQkJY2FyZF9maXJzdF9zaG93ID0gMTsKKwkJCQl9CisJCQl9CisJCQlpZiAocnRzNTF4X2dldF9zdGF0KGNoaXApICE9IFJUUzUxWF9TVEFUX0lETEUpCisJCQkJcnRzNTF4X3NldF9zdGF0KGNoaXAsIFJUUzUxWF9TVEFUX0lETEUpOworCQl9CisJfQorb3V0OgorCVVTX0RFQlVHUCgiJXM6IHN0YXRlOiVkXG4iLCBfX2Z1bmNfXywgcnRzNTF4X2dldF9zdGF0KGNoaXApKTsKKwlpZiAocnRzNTF4X2dldF9zdGF0KGNoaXApID09IFJUUzUxWF9TVEFUX1JVTikKKwkJcnRzNTF4X21vZGlfc3VzcGVuZF90aW1lcihjaGlwKTsKKworCVVTX0RFQlVHUCgiJXM6IC0tLT5cbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGludCByZWFsdGVrX2NyX2F1dG9zdXNwZW5kX3NldHVwKHN0cnVjdCB1c19kYXRhICp1cykKK3sKKwlzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXA7CisJc3RydWN0IHJ0czUxeF9zdGF0dXMgKnN0YXR1cyA9IE5VTEw7CisJdTggYnVmWzE2XTsKKwlpbnQgcmV0dmFsOworCisJY2hpcCA9IChzdHJ1Y3QgcnRzNTF4X2NoaXAgKil1cy0+ZXh0cmE7CisJY2hpcC0+c3VwcG9ydF9hdXRvX2RlbGluayA9IDA7CisJY2hpcC0+cHdyX3N0YXRlID0gVVNfUkVTVU1FOworCWNoaXAtPmx1bl9yZWFkeSA9IDA7CisJcnRzNTF4X3NldF9zdGF0KGNoaXAsIFJUUzUxWF9TVEFUX0lOSVQpOworCisJcmV0dmFsID0gcnRzNTF4X3JlYWRfc3RhdHVzKHVzLCAwLCBidWYsIDE2LCAmKGNoaXAtPnN0YXR1c19sZW4pKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCVVTX0RFQlVHUCgiUmVhZCBzdGF0dXMgZmFpbFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlzdGF0dXMgPSBjaGlwLT5zdGF0dXM7CisJc3RhdHVzLT52aWQgPSAoKHUxNikgYnVmWzBdIDw8IDgpIHwgYnVmWzFdOworCXN0YXR1cy0+cGlkID0gKCh1MTYpIGJ1ZlsyXSA8PCA4KSB8IGJ1ZlszXTsKKwlzdGF0dXMtPmN1cl9sdW4gPSBidWZbNF07CisJc3RhdHVzLT5jYXJkX3R5cGUgPSBidWZbNV07CisJc3RhdHVzLT50b3RhbF9sdW4gPSBidWZbNl07CisJc3RhdHVzLT5md192ZXIgPSAoKHUxNikgYnVmWzddIDw8IDgpIHwgYnVmWzhdOworCXN0YXR1cy0+cGh5X2V4aXN0ID0gYnVmWzldOworCXN0YXR1cy0+bXVsdGlfZmxhZyA9IGJ1ZlsxMF07CisJc3RhdHVzLT5tdWx0aV9jYXJkID0gYnVmWzExXTsKKwlzdGF0dXMtPmxvZ19leGlzdCA9IGJ1ZlsxMl07CisJaWYgKGNoaXAtPnN0YXR1c19sZW4gPT0gMTYpIHsKKwkJc3RhdHVzLT5kZXRhaWxlZF90eXBlLmRldGFpbGVkX3R5cGUxID0gYnVmWzEzXTsKKwkJc3RhdHVzLT5mdW5jdGlvblswXSA9IGJ1ZlsxNF07CisJCXN0YXR1cy0+ZnVuY3Rpb25bMV0gPSBidWZbMTVdOworCX0KKworCS8qIGJhY2sgdXAgdGhlIHByb3RvX2hhbmRsZXIgaW4gdXMtPmV4dHJhICovCisJY2hpcCA9IChzdHJ1Y3QgcnRzNTF4X2NoaXAgKikodXMtPmV4dHJhKTsKKwljaGlwLT5wcm90b19oYW5kbGVyX2JhY2t1cCA9IHVzLT5wcm90b19oYW5kbGVyOworCS8qIFNldCB0aGUgYXV0b3N1c3BlbmRfZGVsYXkgdG8gMCAqLworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KCZ1cy0+cHVzYl9kZXYtPmRldiwgMCk7CisJLyogb3ZlcnJpZGUgdXMtPnByb3RvX2hhbmRsZXIgc2V0dGVkIGluIGdldF9wcm90b2NvbCgpICovCisJdXMtPnByb3RvX2hhbmRsZXIgPSBydHM1MXhfaW52b2tlX3RyYW5zcG9ydDsKKworCWNoaXAtPnRpbWVyX2V4cGlyZXMgPSAwOworCXNldHVwX3RpbWVyKCZjaGlwLT5ydHM1MXhfc3VzcGVuZF90aW1lciwgcnRzNTF4X3N1c3BlbmRfdGltZXJfZm4sCisJCQkodW5zaWduZWQgbG9uZyljaGlwKTsKKwlmdzU4OTVfaW5pdCh1cyk7CisKKwkvKiBlbmFibGUgYXV0b3N1c3BlbmQgZnVuY2l0b24gb2YgdGhlIHVzYiBkZXZpY2UgKi8KKwl1c2JfZW5hYmxlX2F1dG9zdXNwZW5kKHVzLT5wdXNiX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCByZWFsdGVrX2NyX2Rlc3RydWN0b3Iodm9pZCAqZXh0cmEpCiB7CiAJc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwID0gKHN0cnVjdCBydHM1MXhfY2hpcCAqKWV4dHJhOwogCisJVVNfREVCVUdQKCIlczogPC0tLVxuIiwgX19mdW5jX18pOworCiAJaWYgKCFjaGlwKQogCQlyZXR1cm47Ci0KKyNpZmRlZiBDT05GSUdfUkVBTFRFS19BVVRPUE0KKwlpZiAoc3NfZW4pIHsKKwkJZGVsX3RpbWVyKCZjaGlwLT5ydHM1MXhfc3VzcGVuZF90aW1lcik7CisJCWNoaXAtPnRpbWVyX2V4cGlyZXMgPSAwOworCX0KKyNlbmRpZgogCWtmcmVlKGNoaXAtPnN0YXR1cyk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyB2b2lkIHJlYWx0ZWtfcG1faG9vayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIGludCBwbV9zdGF0ZSkKK2ludCByZWFsdGVrX2NyX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKLQlpZiAocG1fc3RhdGUgPT0gVVNfU1VTUEVORCkKLQkJKHZvaWQpY29uZmlnX2F1dG9kZWxpbmtfYmVmb3JlX3Bvd2VyX2Rvd24odXMpOworCXN0cnVjdCB1c19kYXRhICp1cyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOworCisJVVNfREVCVUdQKCIlczogPC0tLVxuIiwgX19mdW5jX18pOworCisJLyogd2FpdCB1bnRpbCBubyBjb21tYW5kIGlzIHJ1bm5pbmcgKi8KKwltdXRleF9sb2NrKCZ1cy0+ZGV2X211dGV4KTsKKworCWNvbmZpZ19hdXRvZGVsaW5rX2JlZm9yZV9wb3dlcl9kb3duKHVzKTsKKworCW11dGV4X3VubG9jaygmdXMtPmRldl9tdXRleCk7CisKKwlVU19ERUJVR1AoIiVzOiAtLS0+XG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKIH0KKworc3RhdGljIGludCByZWFsdGVrX2NyX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCit7CisJc3RydWN0IHVzX2RhdGEgKnVzID0gdXNiX2dldF9pbnRmZGF0YShpZmFjZSk7CisKKwlVU19ERUJVR1AoIiVzOiA8LS0tXG4iLCBfX2Z1bmNfXyk7CisKKwlmdzU4OTVfaW5pdCh1cyk7CisJY29uZmlnX2F1dG9kZWxpbmtfYWZ0ZXJfcG93ZXJfb24odXMpOworCisJVVNfREVCVUdQKCIlczogLS0tPlxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSByZWFsdGVrX2NyX3N1c3BlbmQJTlVMTAorI2RlZmluZSByZWFsdGVrX2NyX3Jlc3VtZQlOVUxMCiAjZW5kaWYKIAogc3RhdGljIGludCBpbml0X3JlYWx0ZWtfY3Ioc3RydWN0IHVzX2RhdGEgKnVzKQpAQCAtNTg4LDEwICs5MjcsNiBAQAogCiAJdXMtPmV4dHJhID0gY2hpcDsKIAl1cy0+ZXh0cmFfZGVzdHJ1Y3RvciA9IHJlYWx0ZWtfY3JfZGVzdHJ1Y3RvcjsKLSNpZmRlZiBDT05GSUdfUE0KLQl1cy0+c3VzcGVuZF9yZXN1bWVfaG9vayA9IHJlYWx0ZWtfcG1faG9vazsKLSNlbmRpZgotCiAJdXMtPm1heF9sdW4gPSBjaGlwLT5tYXhfbHVuID0gcnRzNTF4X2dldF9tYXhfbHVuKHVzKTsKIAogCVVTX0RFQlVHUCgiY2hpcC0+bWF4X2x1biA9ICVkXG4iLCBjaGlwLT5tYXhfbHVuKTsKQEAgLTYwMiwxOCArOTM3LDI0IEBACiAJCWdvdG8gSU5JVF9GQUlMOwogCiAJZm9yIChpID0gMDsgaSA8PSAoaW50KShjaGlwLT5tYXhfbHVuKTsgaSsrKSB7Ci0JCXJldHZhbCA9IHJ0czUxeF9jaGVja19zdGF0dXModXMsICh1OClpKTsKKwkJcmV0dmFsID0gcnRzNTF4X2NoZWNrX3N0YXR1cyh1cywgKHU4KSBpKTsKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlnb3RvIElOSVRfRkFJTDsKIAl9CiAKIAlpZiAoQ0hFQ0tfRldfVkVSKGNoaXAsIDB4NTg4OCkgfHwgQ0hFQ0tfRldfVkVSKGNoaXAsIDB4NTg4OSkgfHwKLQkJCUNIRUNLX0ZXX1ZFUihjaGlwLCAweDU5MDEpKQorCSAgICBDSEVDS19GV19WRVIoY2hpcCwgMHg1OTAxKSkKIAkJU0VUX0FVVE9fREVMSU5LKGNoaXApOwogCWlmIChTVEFUVVNfTEVOKGNoaXApID09IDE2KSB7CiAJCWlmIChTVVBQT1JUX0FVVE9fREVMSU5LKGNoaXApKQogCQkJU0VUX0FVVE9fREVMSU5LKGNoaXApOwogCX0KKyNpZmRlZiBDT05GSUdfUkVBTFRFS19BVVRPUE0KKwlpZiAoc3NfZW4pIHsKKwkJY2hpcC0+dXMgPSB1czsKKwkJcmVhbHRla19jcl9hdXRvc3VzcGVuZF9zZXR1cCh1cyk7CisJfQorI2VuZGlmCiAKIAlVU19ERUJVR1AoImNoaXAtPmZsYWcgPSAweCV4XG4iLCBjaGlwLT5mbGFnKTsKIApAQCAtNjMyLDcgKzk3Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcmVhbHRla19jcl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKLQkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCisJCQkgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCB1c19kYXRhICp1czsKIAlpbnQgcmVzdWx0OwpAQCAtNjQwLDI1ICs5ODEsMzAgQEAKIAlVU19ERUJVR1AoIlByb2JlIFJlYWx0ZWsgQ2FyZCBSZWFkZXIhXG4iKTsKIAogCXJlc3VsdCA9IHVzYl9zdG9yX3Byb2JlMSgmdXMsIGludGYsIGlkLAotCQkJKGlkIC0gcmVhbHRla19jcl9pZHMpICsgcmVhbHRla19jcl91bnVzdWFsX2Rldl9saXN0KTsKKwkJCQkgKGlkIC0gcmVhbHRla19jcl9pZHMpICsKKwkJCQkgcmVhbHRla19jcl91bnVzdWFsX2Rldl9saXN0KTsKIAlpZiAocmVzdWx0KQogCQlyZXR1cm4gcmVzdWx0OwogCiAJcmVzdWx0ID0gdXNiX3N0b3JfcHJvYmUyKHVzKTsKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciByZWFsdGVrX2NyX2RyaXZlciA9IHsKLQkubmFtZSA9CQkidW1zLXJlYWx0ZWsiLAotCS5wcm9iZSA9CXJlYWx0ZWtfY3JfcHJvYmUsCi0JLmRpc2Nvbm5lY3QgPQl1c2Jfc3Rvcl9kaXNjb25uZWN0LAotCS5zdXNwZW5kID0JdXNiX3N0b3Jfc3VzcGVuZCwKLQkucmVzdW1lID0JdXNiX3N0b3JfcmVzdW1lLAotCS5yZXNldF9yZXN1bWUgPQl1c2Jfc3Rvcl9yZXNldF9yZXN1bWUsCi0JLnByZV9yZXNldCA9CXVzYl9zdG9yX3ByZV9yZXNldCwKLQkucG9zdF9yZXNldCA9CXVzYl9zdG9yX3Bvc3RfcmVzZXQsCi0JLmlkX3RhYmxlID0JcmVhbHRla19jcl9pZHMsCi0JLnNvZnRfdW5iaW5kID0JMSwKKwkubmFtZSA9ICJ1bXMtcmVhbHRlayIsCisJLnByb2JlID0gcmVhbHRla19jcl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHVzYl9zdG9yX2Rpc2Nvbm5lY3QsCisJLyogLnN1c3BlbmQgPSAgICAgIHVzYl9zdG9yX3N1c3BlbmQsICovCisJLyogLnJlc3VtZSA9ICAgICAgIHVzYl9zdG9yX3Jlc3VtZSwgKi8KKwkucmVzZXRfcmVzdW1lID0gdXNiX3N0b3JfcmVzZXRfcmVzdW1lLAorCS5zdXNwZW5kID0gcmVhbHRla19jcl9zdXNwZW5kLAorCS5yZXN1bWUgPSByZWFsdGVrX2NyX3Jlc3VtZSwKKwkucHJlX3Jlc2V0ID0gdXNiX3N0b3JfcHJlX3Jlc2V0LAorCS5wb3N0X3Jlc2V0ID0gdXNiX3N0b3JfcG9zdF9yZXNldCwKKwkuaWRfdGFibGUgPSByZWFsdGVrX2NyX2lkcywKKwkuc29mdF91bmJpbmQgPSAxLAorCS5zdXBwb3J0c19hdXRvc3VzcGVuZCA9IDEsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCByZWFsdGVrX2NyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCmluZGV4IDAwNDE4OTkuLmU4YWUyMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwpAQCAtODE5LDYgKzgxOSwzNSBAQAogCQl9CiAJfQogCisJLyoKKwkgKiBTb21lIGRldmljZXMgZG9uJ3Qgd29yayBvciByZXR1cm4gaW5jb3JyZWN0IGRhdGEgdGhlIGZpcnN0CisJICogdGltZSB0aGV5IGdldCBhIFJFQUQoMTApIGNvbW1hbmQsIG9yIGZvciB0aGUgZmlyc3QgUkVBRCgxMCkKKwkgKiBhZnRlciBhIG1lZGlhIGNoYW5nZS4gIElmIHRoZSBJTklUSUFMX1JFQUQxMCBmbGFnIGlzIHNldCwKKwkgKiBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgUkVBRCgxMCkgY29tbWFuZHMgc3VjY2VlZC4gIElmIHRoZQorCSAqIHByZXZpb3VzIG9uZSBzdWNjZWVkZWQgYW5kIHRoaXMgb25lIGZhaWxlZCwgc2V0IHRoZSBSRURPX1JFQUQxMAorCSAqIGZsYWcgdG8gZm9yY2UgYSByZXRyeS4KKwkgKi8KKwlpZiAodW5saWtlbHkoKHVzLT5mZmxhZ3MgJiBVU19GTF9JTklUSUFMX1JFQUQxMCkgJiYKKwkJCXNyYi0+Y21uZFswXSA9PSBSRUFEXzEwKSkgeworCQlpZiAoc3JiLT5yZXN1bHQgPT0gU0FNX1NUQVRfR09PRCkgeworCQkJc2V0X2JpdChVU19GTElEWF9SRUFEMTBfV09SS0VELCAmdXMtPmRmbGFncyk7CisJCX0gZWxzZSBpZiAodGVzdF9iaXQoVVNfRkxJRFhfUkVBRDEwX1dPUktFRCwgJnVzLT5kZmxhZ3MpKSB7CisJCQljbGVhcl9iaXQoVVNfRkxJRFhfUkVBRDEwX1dPUktFRCwgJnVzLT5kZmxhZ3MpOworCQkJc2V0X2JpdChVU19GTElEWF9SRURPX1JFQUQxMCwgJnVzLT5kZmxhZ3MpOworCQl9CisKKwkJLyoKKwkJICogTmV4dCwgaWYgdGhlIFJFRE9fUkVBRDEwIGZsYWcgaXMgc2V0LCByZXR1cm4gYSByZXN1bHQKKwkJICogY29kZSB0aGF0IHdpbGwgY2F1c2UgdGhlIFNDU0kgY29yZSB0byByZXRyeSB0aGUgUkVBRCgxMCkKKwkJICogY29tbWFuZCBpbW1lZGlhdGVseS4KKwkJICovCisJCWlmICh0ZXN0X2JpdChVU19GTElEWF9SRURPX1JFQUQxMCwgJnVzLT5kZmxhZ3MpKSB7CisJCQljbGVhcl9iaXQoVVNfRkxJRFhfUkVET19SRUFEMTAsICZ1cy0+ZGZsYWdzKTsKKwkJCXNyYi0+cmVzdWx0ID0gRElEX0lNTV9SRVRSWSA8PCAxNjsKKwkJCXNyYi0+c2Vuc2VfYnVmZmVyWzBdID0gMDsKKwkJfQorCX0KKwogCS8qIERpZCB3ZSB0cmFuc2ZlciBsZXNzIHRoYW4gdGhlIG1pbmltdW0gYW1vdW50IHJlcXVpcmVkPyAqLwogCWlmICgoc3JiLT5yZXN1bHQgPT0gU0FNX1NUQVRfR09PRCB8fCBzcmItPnNlbnNlX2J1ZmZlclsyXSA9PSAwKSAmJgogCQkJc2NzaV9idWZmbGVuKHNyYikgLSBzY3NpX2dldF9yZXNpZChzcmIpIDwgc3JiLT51bmRlcmZsb3cpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAppbmRleCBjMTYwMmI4Li5jY2ZmMzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKQEAgLTExMTQsNiArMTExNCwxNiBAQAogCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKIAorLyogUmVwb3J0ZWQgYnkgUGF1bCBIYXJ0bWFuIDxwYXVsLmhhcnRtYW4rbGludXhAZ21haWwuY29tPgorICogVGhpcyBjYXJkIHJlYWRlciByZXR1cm5zICJJbGxlZ2FsIFJlcXVlc3QsIExvZ2ljYWwgQmxvY2sgQWRkcmVzcworICogT3V0IG9mIFJhbmdlIiBmb3IgdGhlIGZpcnN0IFJFQUQoMTApIGFmdGVyIGEgbmV3IGNhcmQgaXMgaW5zZXJ0ZWQuCisgKi8KK1VOVVNVQUxfREVWKCAgMHgwOTBjLCAweDYwMDAsIDB4MDEwMCwgMHgwMTAwLAorCQkiRmVpeWEiLAorCQkiU0QvU0RIQyBDYXJkIFJlYWRlciIsCisJCVVTQl9TQ19ERVZJQ0UsIFVTQl9QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0lOSVRJQUxfUkVBRDEwICksCisKIC8qIFRoaXMgUGVudGF4IHN0aWxsIGNhbWVyYSBpcyBub3QgY29uZm9ybWFudAogICogdG8gdGhlIFVTQiBzdG9yYWdlIHNwZWNpZmljYXRpb246IC0KICAqIC0gSXQgZG9lcyBub3QgbGlrZSB0aGUgSU5RVUlSWSBjb21tYW5kLiBTbyB3ZSBtdXN0IGhhbmRsZSB0aGlzIGNvbW1hbmQKQEAgLTE4ODgsNiArMTg5OCwxNSBAQAogCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9OT19SRUFEX0RJU0NfSU5GTyApLAogCisvKiBSZXBvcnRlZCBieSBTdmVuIEdlZ2d1cyA8c3Zlbi11c2JzdEBnZWdndXMubmV0PgorICogVGhpcyBlbmNyeXB0ZWQgcGVuIGRyaXZlIHJldHVybnMgYm9ndXMgZGF0YSBmb3IgdGhlIGluaXRpYWwgUkVBRCgxMCkuCisgKi8KK1VOVVNVQUxfREVWKCAgMHgxYjFjLCAweDFhYjUsIDB4MDIwMCwgMHgwMjAwLAorCQkiQ29yc2FpciIsCisJCSJQYWRsb2NrIHYyIiwKKwkJVVNCX1NDX0RFVklDRSwgVVNCX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfSU5JVElBTF9SRUFEMTAgKSwKKwogLyogUGF0Y2ggYnkgUmljaGFyZCBTY2j8dHogPHIuc2NodHpAdC1vbmxpbmUuZGU+CiAgKiBUaGlzIGV4dGVybmFsIGhhcmQgZHJpdmUgZW5jbG9zdXJlIHVzZXMgYSBKTWljcm9uIGNoaXAgd2hpY2gKICAqIG5lZWRzIHRoZSBVU19GTF9JR05PUkVfUkVTSURVRSBmbGFnIHRvIHdvcmsgcHJvcGVybHkuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCA1ZWU3YWM0Li4wY2EwOTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKQEAgLTQ0MCw3ICs0NDAsOCBAQAogCQkJVVNfRkxfTk9UX0xPQ0tBQkxFIHwgVVNfRkxfTUFYX1NFQ1RPUlNfNjQgfAogCQkJVVNfRkxfQ0FQQUNJVFlfT0sgfCBVU19GTF9JR05PUkVfUkVTSURVRSB8CiAJCQlVU19GTF9TSU5HTEVfTFVOIHwgVVNfRkxfTk9fV1BfREVURUNUIHwKLQkJCVVTX0ZMX05PX1JFQURfRElTQ19JTkZPIHwgVVNfRkxfTk9fUkVBRF9DQVBBQ0lUWV8xNik7CisJCQlVU19GTF9OT19SRUFEX0RJU0NfSU5GTyB8IFVTX0ZMX05PX1JFQURfQ0FQQUNJVFlfMTYgfAorCQkJVVNfRkxfSU5JVElBTF9SRUFEMTApOwogCiAJcCA9IHF1aXJrczsKIAl3aGlsZSAoKnApIHsKQEAgLTQ5MCw2ICs0OTEsOSBAQAogCQljYXNlICdtJzoKIAkJCWYgfD0gVVNfRkxfTUFYX1NFQ1RPUlNfNjQ7CiAJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlmIHw9IFVTX0ZMX0lOSVRJQUxfUkVBRDEwOworCQkJYnJlYWs7CiAJCWNhc2UgJ28nOgogCQkJZiB8PSBVU19GTF9DQVBBQ0lUWV9PSzsKIAkJCWJyZWFrOwpAQCAtOTUzLDYgKzk1NywxMyBAQAogCWlmIChyZXN1bHQpCiAJCWdvdG8gQmFkRGV2aWNlOwogCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIHJldHVybnMgaW52YWxpZCBkYXRhIGZvciB0aGUgZmlyc3QgUkVBRCgxMCkKKwkgKiBjb21tYW5kLCBpbmRpY2F0ZSB0aGUgY29tbWFuZCBzaG91bGQgYmUgcmV0cmllZC4KKwkgKi8KKwlpZiAodXMtPmZmbGFncyAmIFVTX0ZMX0lOSVRJQUxfUkVBRDEwKQorCQlzZXRfYml0KFVTX0ZMSURYX1JFRE9fUkVBRDEwLCAmdXMtPmRmbGFncyk7CisKIAkvKiBBY3F1aXJlIGFsbCB0aGUgb3RoZXIgcmVzb3VyY2VzIGFuZCBhZGQgdGhlIGhvc3QgKi8KIAlyZXN1bHQgPSB1c2Jfc3Rvcl9hY3F1aXJlX3Jlc291cmNlcyh1cyk7CiAJaWYgKHJlc3VsdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCmluZGV4IDg5ZDNiZmYuLjdiMGYyMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaApAQCAtNzMsNiArNzMsOCBAQAogI2RlZmluZSBVU19GTElEWF9SRVNFVFRJTkcJNAkvKiBkZXZpY2UgcmVzZXQgaW4gcHJvZ3Jlc3MgKi8KICNkZWZpbmUgVVNfRkxJRFhfVElNRURfT1VUCTUJLyogU0NTSSBtaWRsYXllciB0aW1lZCBvdXQgICovCiAjZGVmaW5lIFVTX0ZMSURYX0RPTlRfU0NBTgk2CS8qIGRvbid0IHNjYW4gKGRpc2Nvbm5lY3QpICAqLworI2RlZmluZSBVU19GTElEWF9SRURPX1JFQUQxMAk3CS8qIHJlZG8gUkVBRCgxMCkgY29tbWFuZCAgICAqLworI2RlZmluZSBVU19GTElEWF9SRUFEMTBfV09SS0VECTgJLyogcHJldmlvdXMgUkVBRCgxMCkgc3VjY2VlZGVkICovCiAKICNkZWZpbmUgVVNCX1NUT1JfU1RSSU5HX0xFTiAzMgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS9jYmFmLmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9jYmFmLmMKaW5kZXggYzBjNTY2NS4uMjAwZmQ3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvY2JhZi5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2NiYWYuYwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJaWYgKHJlc3VsdCA8IG5lZWRlZCkgewogCQlkZXZfZXJyKGRldiwgIk5vdCBlbm91Z2ggZGF0YSBpbiBERVZJQ0VfSU5GTyByZXBseSAoJXp1IHZzICIKIAkJCSIlenUgYnl0ZXMgbmVlZGVkKVxuIiwgKHNpemVfdClyZXN1bHQsIG5lZWRlZCk7Ci0JCXJldHVybiByZXN1bHQ7CisJCXJldHVybiAtRU5PRU5UOwogCX0KIAogCXN0cmxjcHkoY2JhZi0+ZGV2aWNlX25hbWUsIGRpLT5EZXZpY2VGcmllbmRseU5hbWUsIENCQV9OQU1FX0xFTik7CkBAIC0zNTAsNyArMzUwLDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAlyZXN1bHQgPSBjYmFmX2NkaWRfZ2V0KGNiYWYpOwogCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gLXJlc3VsdDsKKwkJcmV0dXJuIHJlc3VsdDsKIAlyZXR1cm4gc2l6ZTsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUih3dXNiX2NoaWQsIDA2MDAsIGNiYWZfd3VzYl9jaGlkX3Nob3csIGNiYWZfd3VzYl9jaGlkX3N0b3JlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYwppbmRleCA2Y2NkOTNhLi40MTkzMzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS14ZmVyLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EteGZlci5jCkBAIC04Myw2ICs4Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSAid2EtaGMuaCIKICNpbmNsdWRlICJ3dXNiaGMuaCIKQEAgLTEyMTcsMTYgKzEyMTgsMTQgQEAKIAlpZiAoc3RhdHVzID09IDApCiAJCXJldHVybiAwOwogCWlmIChzdGF0dXMgPj0gQVJSQVlfU0laRSh4bGF0KSkgewotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlcygpOiBCVUc/ICIKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICIlcygpOiBCVUc/ICIKIAkJCSAgICAgICAiVW5rbm93biBXQSB0cmFuc2ZlciBzdGF0dXMgMHglMDJ4XG4iLAogCQkJICAgICAgIF9fZnVuY19fLCByZWFsX3N0YXR1cyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAllcnJubyA9IHhsYXRbc3RhdHVzXTsKIAlpZiAodW5saWtlbHkoZXJybm8gPiAwKSkgewotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlcygpOiBCVUc/ICIKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICIlcygpOiBCVUc/ICIKIAkJCSAgICAgICAiSW5jb25zaXN0ZW50IFdBIHN0YXR1czogMHglMDJ4XG4iLAogCQkJICAgICAgIF9fZnVuY19fLCByZWFsX3N0YXR1cyk7CiAJCWVycm5vID0gLWVycm5vOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvdXdiZC5jIGIvZHJpdmVycy91d2IvdXdiZC5jCmluZGV4IDAwMWM4YjQuLmJkY2IxM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL3V3YmQuYworKysgYi9kcml2ZXJzL3V3Yi91d2JkLmMKQEAgLTI1Niw3ICsyNTYsNyBAQAogICogVVdCIERhZW1vbgogICoKICAqIExpc3RlbnMgdG8gYWxsIFVXQiBub3RpZmljYXRpb25zIGFuZCB0YWtlcyBjYXJlIHRvIHRyYWNrIHRoZSBzdGF0ZQotICogb2YgdGhlIFVXQiBuZWlnaGJvb3Job29kIGZvciB0aGUga2VybmVsLiBXaGVuIHdlIGRvIGEgcnVuLCB3ZQorICogb2YgdGhlIFVXQiBuZWlnaGJvdXJob29kIGZvciB0aGUga2VybmVsLiBXaGVuIHdlIGRvIGEgcnVuLCB3ZQogICogc3BpbmxvY2ssIG1vdmUgdGhlIGxpc3QgdG8gYSBwcml2YXRlIGNvcHkgYW5kIHJlbGVhc2UgdGhlCiAgKiBsb2NrLiBIb2xkIGl0IGFzIGxpdHRsZSBhcyBwb3NzaWJsZS4gTm90IGEgY29uZmxpY3Q6IGl0IGlzCiAgKiBndWFyYW50ZWVkIHdlIG93biB0aGUgZXZlbnRzIGluIHRoZSBwcml2YXRlIGxpc3QuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi93aGMtcmMuYyBiL2RyaXZlcnMvdXdiL3doYy1yYy5jCmluZGV4IDcwYTAwNGEuLjNhZTNjNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL3doYy1yYy5jCisrKyBiL2RyaXZlcnMvdXdiL3doYy1yYy5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlzdHJ1Y3QgdW1jX2RldiAqdW1jX2RldiA9IHdoY3JjLT51bWNfZGV2OwogCiAJd2hjcmMtPmFyZWEgPSB1bWNfZGV2LT5yZXNvdXJjZS5zdGFydDsKLQl3aGNyYy0+cmNfbGVuID0gdW1jX2Rldi0+cmVzb3VyY2UuZW5kIC0gdW1jX2Rldi0+cmVzb3VyY2Uuc3RhcnQgKyAxOworCXdoY3JjLT5yY19sZW4gPSByZXNvdXJjZV9zaXplKCZ1bWNfZGV2LT5yZXNvdXJjZSk7CiAJcmVzdWx0ID0gLUVCVVNZOwogCWlmIChyZXF1ZXN0X21lbV9yZWdpb24od2hjcmMtPmFyZWEsIHdoY3JjLT5yY19sZW4sIEtCVUlMRF9NT0ROQU1FKSA9PSBOVUxMKSB7CiAJCWRldl9lcnIoZGV2LCAiY2FuJ3QgcmVxdWVzdCBVUkMgcmVnaW9uICglenUgYnl0ZXMgQCAweCVseCk6ICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC9uZXQuYyBiL2RyaXZlcnMvdmhvc3QvbmV0LmMKaW5kZXggZTIyNGE5Mi4uODgyYTUxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC9uZXQuYworKysgYi9kcml2ZXJzL3Zob3N0L25ldC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlydGlvX25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KQEAgLTI4LDEwICsyOSwxOCBAQAogCiAjaW5jbHVkZSAidmhvc3QuaCIKIAorc3RhdGljIGludCBleHBlcmltZW50YWxfemNvcHl0eDsKK21vZHVsZV9wYXJhbShleHBlcmltZW50YWxfemNvcHl0eCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZXhwZXJpbWVudGFsX3pjb3B5dHgsICJFbmFibGUgRXhwZXJpbWVudGFsIFplcm8gQ29weSBUWCIpOworCiAvKiBNYXggbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIGJlZm9yZSByZXF1ZXVlaW5nIHRoZSBqb2IuCiAgKiBVc2luZyB0aGlzIGxpbWl0IHByZXZlbnRzIG9uZSB2aXJ0cXVldWUgZnJvbSBzdGFydmluZyBvdGhlcnMuICovCiAjZGVmaW5lIFZIT1NUX05FVF9XRUlHSFQgMHg4MDAwMAogCisvKiBNQVggbnVtYmVyIG9mIFRYIHVzZWQgYnVmZmVycyBmb3Igb3V0c3RhbmRpbmcgemVyb2NvcHkgKi8KKyNkZWZpbmUgVkhPU1RfTUFYX1BFTkQgMTI4CisjZGVmaW5lIFZIT1NUX0dPT0RDT1BZX0xFTiAyNTYKKwogZW51bSB7CiAJVkhPU1RfTkVUX1ZRX1JYID0gMCwKIAlWSE9TVF9ORVRfVlFfVFggPSAxLApAQCAtNTQsNiArNjMsMTIgQEAKIAllbnVtIHZob3N0X25ldF9wb2xsX3N0YXRlIHR4X3BvbGxfc3RhdGU7CiB9OwogCitzdGF0aWMgYm9vbCB2aG9zdF9zb2NrX3pjb3B5KHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJcmV0dXJuIHVubGlrZWx5KGV4cGVyaW1lbnRhbF96Y29weXR4KSAmJgorCQlzb2NrX2ZsYWcoc29jay0+c2ssIFNPQ0tfWkVST0NPUFkpOworfQorCiAvKiBQb3AgZmlyc3QgbGVuIGJ5dGVzIGZyb20gaW92ZWMuIFJldHVybiBudW1iZXIgb2Ygc2VnbWVudHMgdXNlZC4gKi8KIHN0YXRpYyBpbnQgbW92ZV9pb3ZlY19oZHIoc3RydWN0IGlvdmVjICpmcm9tLCBzdHJ1Y3QgaW92ZWMgKnRvLAogCQkJICBzaXplX3QgbGVuLCBpbnQgaW92X2NvdW50KQpAQCAtMTI5LDYgKzE0NCw4IEBACiAJaW50IGVyciwgd21lbTsKIAlzaXplX3QgaGRyX3NpemU7CiAJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3Qgdmhvc3RfdWJ1Zl9yZWYgKnVuaW5pdGlhbGl6ZWRfdmFyKHVidWZzKTsKKwlib29sIHpjb3B5OwogCiAJLyogVE9ETzogY2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyBmcm9tIHZob3N0X3dvcmtlcj8gKi8KIAlzb2NrID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHZxLT5wcml2YXRlX2RhdGEsIDEpOwpAQCAtMTQ5LDggKzE2NiwxMyBAQAogCWlmICh3bWVtIDwgc29jay0+c2stPnNrX3NuZGJ1ZiAvIDIpCiAJCXR4X3BvbGxfc3RvcChuZXQpOwogCWhkcl9zaXplID0gdnEtPnZob3N0X2hsZW47CisJemNvcHkgPSB2aG9zdF9zb2NrX3pjb3B5KHNvY2spOwogCiAJZm9yICg7OykgeworCQkvKiBSZWxlYXNlIERNQXMgZG9uZSBidWZmZXJzIGZpcnN0ICovCisJCWlmICh6Y29weSkKKwkJCXZob3N0X3plcm9jb3B5X3NpZ25hbF91c2VkKHZxKTsKKwogCQloZWFkID0gdmhvc3RfZ2V0X3ZxX2Rlc2MoJm5ldC0+ZGV2LCB2cSwgdnEtPmlvdiwKIAkJCQkJIEFSUkFZX1NJWkUodnEtPmlvdiksCiAJCQkJCSAmb3V0LCAmaW4sCkBAIC0xNjAsMTIgKzE4MiwyNSBAQAogCQkJYnJlYWs7CiAJCS8qIE5vdGhpbmcgbmV3PyAgV2FpdCBmb3IgZXZlbnRmZCB0byB0ZWxsIHVzIHRoZXkgcmVmaWxsZWQuICovCiAJCWlmIChoZWFkID09IHZxLT5udW0pIHsKKwkJCWludCBudW1fcGVuZHM7CisKIAkJCXdtZW0gPSBhdG9taWNfcmVhZCgmc29jay0+c2stPnNrX3dtZW1fYWxsb2MpOwogCQkJaWYgKHdtZW0gPj0gc29jay0+c2stPnNrX3NuZGJ1ZiAqIDMgLyA0KSB7CiAJCQkJdHhfcG9sbF9zdGFydChuZXQsIHNvY2spOwogCQkJCXNldF9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc29jay0+ZmxhZ3MpOwogCQkJCWJyZWFrOwogCQkJfQorCQkJLyogSWYgbW9yZSBvdXRzdGFuZGluZyBETUFzLCBxdWV1ZSB0aGUgd29yay4KKwkJCSAqIEhhbmRsZSB1cGVuZF9pZHggd3JhcCBhcm91bmQKKwkJCSAqLworCQkJbnVtX3BlbmRzID0gbGlrZWx5KHZxLT51cGVuZF9pZHggPj0gdnEtPmRvbmVfaWR4KSA/CisJCQkJICAgICh2cS0+dXBlbmRfaWR4IC0gdnEtPmRvbmVfaWR4KSA6CisJCQkJICAgICh2cS0+dXBlbmRfaWR4ICsgVUlPX01BWElPViAtIHZxLT5kb25lX2lkeCk7CisJCQlpZiAodW5saWtlbHkobnVtX3BlbmRzID4gVkhPU1RfTUFYX1BFTkQpKSB7CisJCQkJdHhfcG9sbF9zdGFydChuZXQsIHNvY2spOworCQkJCXNldF9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc29jay0+ZmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQogCQkJaWYgKHVubGlrZWx5KHZob3N0X2VuYWJsZV9ub3RpZnkoJm5ldC0+ZGV2LCB2cSkpKSB7CiAJCQkJdmhvc3RfZGlzYWJsZV9ub3RpZnkoJm5ldC0+ZGV2LCB2cSk7CiAJCQkJY29udGludWU7CkBAIC0xODgsOSArMjIzLDM5IEBACiAJCQkgICAgICAgaW92X2xlbmd0aCh2cS0+aGRyLCBzKSwgaGRyX3NpemUpOwogCQkJYnJlYWs7CiAJCX0KKwkJLyogdXNlIG1zZ19jb250cm9sIHRvIHBhc3Mgdmhvc3QgemVyb2NvcHkgdWJ1ZiBpbmZvIHRvIHNrYiAqLworCQlpZiAoemNvcHkpIHsKKwkJCXZxLT5oZWFkc1t2cS0+dXBlbmRfaWR4XS5pZCA9IGhlYWQ7CisJCQlpZiAobGVuIDwgVkhPU1RfR09PRENPUFlfTEVOKSB7CisJCQkJLyogY29weSBkb24ndCBuZWVkIHRvIHdhaXQgZm9yIERNQSBkb25lICovCisJCQkJdnEtPmhlYWRzW3ZxLT51cGVuZF9pZHhdLmxlbiA9CisJCQkJCQkJVkhPU1RfRE1BX0RPTkVfTEVOOworCQkJCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJCQkJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwkJCQl1YnVmcyA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCB1YnVmX2luZm8gKnVidWYgPSAmdnEtPnVidWZfaW5mb1toZWFkXTsKKworCQkJCXZxLT5oZWFkc1t2cS0+dXBlbmRfaWR4XS5sZW4gPSBsZW47CisJCQkJdWJ1Zi0+Y2FsbGJhY2sgPSB2aG9zdF96ZXJvY29weV9jYWxsYmFjazsKKwkJCQl1YnVmLT5hcmcgPSB2cS0+dWJ1ZnM7CisJCQkJdWJ1Zi0+ZGVzYyA9IHZxLT51cGVuZF9pZHg7CisJCQkJbXNnLm1zZ19jb250cm9sID0gdWJ1ZjsKKwkJCQltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YodWJ1Zik7CisJCQkJdWJ1ZnMgPSB2cS0+dWJ1ZnM7CisJCQkJa3JlZl9nZXQoJnVidWZzLT5rcmVmKTsKKwkJCX0KKwkJCXZxLT51cGVuZF9pZHggPSAodnEtPnVwZW5kX2lkeCArIDEpICUgVUlPX01BWElPVjsKKwkJfQogCQkvKiBUT0RPOiBDaGVjayBzcGVjaWZpYyBlcnJvciBhbmQgYm9tYiBvdXQgdW5sZXNzIEVOT0JVRlM/ICovCiAJCWVyciA9IHNvY2stPm9wcy0+c2VuZG1zZyhOVUxMLCBzb2NrLCAmbXNnLCBsZW4pOwogCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmICh6Y29weSkgeworCQkJCWlmICh1YnVmcykKKwkJCQkJdmhvc3RfdWJ1Zl9wdXQodWJ1ZnMpOworCQkJCXZxLT51cGVuZF9pZHggPSAoKHVuc2lnbmVkKXZxLT51cGVuZF9pZHggLSAxKSAlCisJCQkJCVVJT19NQVhJT1Y7CisJCQl9CiAJCQl2aG9zdF9kaXNjYXJkX3ZxX2Rlc2ModnEsIDEpOwogCQkJdHhfcG9sbF9zdGFydChuZXQsIHNvY2spOwogCQkJYnJlYWs7CkBAIC0xOTgsNyArMjYzLDggQEAKIAkJaWYgKGVyciAhPSBsZW4pCiAJCQlwcl9kZWJ1ZygiVHJ1bmNhdGVkIFRYIHBhY2tldDogIgogCQkJCSAiIGxlbiAlZCAhPSAlemRcbiIsIGVyciwgbGVuKTsKLQkJdmhvc3RfYWRkX3VzZWRfYW5kX3NpZ25hbCgmbmV0LT5kZXYsIHZxLCBoZWFkLCAwKTsKKwkJaWYgKCF6Y29weSkKKwkJCXZob3N0X2FkZF91c2VkX2FuZF9zaWduYWwoJm5ldC0+ZGV2LCB2cSwgaGVhZCwgMCk7CiAJCXRvdGFsX2xlbiArPSBsZW47CiAJCWlmICh1bmxpa2VseSh0b3RhbF9sZW4gPj0gVkhPU1RfTkVUX1dFSUdIVCkpIHsKIAkJCXZob3N0X3BvbGxfcXVldWUoJnZxLT5wb2xsKTsKQEAgLTYwMyw2ICs2NjksNyBAQAogewogCXN0cnVjdCBzb2NrZXQgKnNvY2ssICpvbGRzb2NrOwogCXN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxOworCXN0cnVjdCB2aG9zdF91YnVmX3JlZiAqdWJ1ZnMsICpvbGR1YnVmcyA9IE5VTEw7CiAJaW50IHI7CiAKIAltdXRleF9sb2NrKCZuLT5kZXYubXV0ZXgpOwpAQCAtNjMyLDEzICs2OTksMzEgQEAKIAlvbGRzb2NrID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZCh2cS0+cHJpdmF0ZV9kYXRhLAogCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZ2cS0+bXV0ZXgpKTsKIAlpZiAoc29jayAhPSBvbGRzb2NrKSB7CisJCXVidWZzID0gdmhvc3RfdWJ1Zl9hbGxvYyh2cSwgc29jayAmJiB2aG9zdF9zb2NrX3pjb3B5KHNvY2spKTsKKwkJaWYgKElTX0VSUih1YnVmcykpIHsKKwkJCXIgPSBQVFJfRVJSKHVidWZzKTsKKwkJCWdvdG8gZXJyX3VidWZzOworCQl9CisJCW9sZHVidWZzID0gdnEtPnVidWZzOworCQl2cS0+dWJ1ZnMgPSB1YnVmczsKIAkJdmhvc3RfbmV0X2Rpc2FibGVfdnEobiwgdnEpOwogCQlyY3VfYXNzaWduX3BvaW50ZXIodnEtPnByaXZhdGVfZGF0YSwgc29jayk7CiAJCXZob3N0X25ldF9lbmFibGVfdnEobiwgdnEpOworCisJCXIgPSB2aG9zdF9pbml0X3VzZWQodnEpOworCQlpZiAocikKKwkJCWdvdG8gZXJyX3ZxOwogCX0KIAogCW11dGV4X3VubG9jaygmdnEtPm11dGV4KTsKIAorCWlmIChvbGR1YnVmcykgeworCQl2aG9zdF91YnVmX3B1dF9hbmRfd2FpdChvbGR1YnVmcyk7CisJCW11dGV4X2xvY2soJnZxLT5tdXRleCk7CisJCXZob3N0X3plcm9jb3B5X3NpZ25hbF91c2VkKHZxKTsKKwkJbXV0ZXhfdW5sb2NrKCZ2cS0+bXV0ZXgpOworCX0KKwogCWlmIChvbGRzb2NrKSB7CiAJCXZob3N0X25ldF9mbHVzaF92cShuLCBpbmRleCk7CiAJCWZwdXQob2xkc29jay0+ZmlsZSk7CkBAIC02NDcsNiArNzMyLDggQEAKIAltdXRleF91bmxvY2soJm4tPmRldi5tdXRleCk7CiAJcmV0dXJuIDA7CiAKK2Vycl91YnVmczoKKwlmcHV0KHNvY2stPmZpbGUpOwogZXJyX3ZxOgogCW11dGV4X3VubG9jaygmdnEtPm11dGV4KTsKIGVycjoKQEAgLTc3Niw2ICs4NjMsOCBAQAogCiBzdGF0aWMgaW50IHZob3N0X25ldF9pbml0KHZvaWQpCiB7CisJaWYgKGV4cGVyaW1lbnRhbF96Y29weXR4KQorCQl2aG9zdF9lbmFibGVfemNvcHkoVkhPU1RfTkVUX1ZRX1RYKTsKIAlyZXR1cm4gbWlzY19yZWdpc3Rlcigmdmhvc3RfbmV0X21pc2MpOwogfQogbW9kdWxlX2luaXQodmhvc3RfbmV0X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC90ZXN0LmMgYi9kcml2ZXJzL3Zob3N0L3Rlc3QuYwppbmRleCA3MzRlMWQ3Li5mYzlhMWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Rlc3QuYworKysgYi9kcml2ZXJzL3Zob3N0L3Rlc3QuYwpAQCAtMTk1LDggKzE5NSwxMyBAQAogCQkJCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmdnEtPm11dGV4KSk7CiAJCXJjdV9hc3NpZ25fcG9pbnRlcih2cS0+cHJpdmF0ZV9kYXRhLCBwcml2KTsKIAorCQlyID0gdmhvc3RfaW5pdF91c2VkKCZuLT52cXNbaW5kZXhdKTsKKwogCQltdXRleF91bmxvY2soJnZxLT5tdXRleCk7CiAKKwkJaWYgKHIpCisJCQlnb3RvIGVycjsKKwogCQlpZiAob2xkcHJpdikgewogCQkJdmhvc3RfdGVzdF9mbHVzaF92cShuLCBpbmRleCk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYwppbmRleCBlYTk2NmIzLi5jMTRjNDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKKysrIGIvZHJpdmVycy92aG9zdC92aG9zdC5jCkBAIC0zNyw2ICszNyw4IEBACiAJVkhPU1RfTUVNT1JZX0ZfTE9HID0gMHgxLAogfTsKIAorc3RhdGljIHVuc2lnbmVkIHZob3N0X3pjb3B5X21hc2sgX19yZWFkX21vc3RseTsKKwogI2RlZmluZSB2aG9zdF91c2VkX2V2ZW50KHZxKSAoKHUxNiBfX3VzZXIgKikmdnEtPmF2YWlsLT5yaW5nW3ZxLT5udW1dKQogI2RlZmluZSB2aG9zdF9hdmFpbF9ldmVudCh2cSkgKCh1MTYgX191c2VyICopJnZxLT51c2VkLT5yaW5nW3ZxLT5udW1dKQogCkBAIC0xNzksNiArMTgxLDkgQEAKIAl2cS0+Y2FsbF9jdHggPSBOVUxMOwogCXZxLT5jYWxsID0gTlVMTDsKIAl2cS0+bG9nX2N0eCA9IE5VTEw7CisJdnEtPnVwZW5kX2lkeCA9IDA7CisJdnEtPmRvbmVfaWR4ID0gMDsKKwl2cS0+dWJ1ZnMgPSBOVUxMOwogfQogCiBzdGF0aWMgaW50IHZob3N0X3dvcmtlcih2b2lkICpkYXRhKQpAQCAtMjI1LDEwICsyMzAsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgdmhvc3RfdnFfZnJlZV9pb3ZlY3Moc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCit7CisJa2ZyZWUodnEtPmluZGlyZWN0KTsKKwl2cS0+aW5kaXJlY3QgPSBOVUxMOworCWtmcmVlKHZxLT5sb2cpOworCXZxLT5sb2cgPSBOVUxMOworCWtmcmVlKHZxLT5oZWFkcyk7CisJdnEtPmhlYWRzID0gTlVMTDsKKwlrZnJlZSh2cS0+dWJ1Zl9pbmZvKTsKKwl2cS0+dWJ1Zl9pbmZvID0gTlVMTDsKK30KKwordm9pZCB2aG9zdF9lbmFibGVfemNvcHkoaW50IHZxKQoreworCXZob3N0X3pjb3B5X21hc2sgfD0gMHgxIDw8IHZxOworfQorCiAvKiBIZWxwZXIgdG8gYWxsb2NhdGUgaW92ZWMgYnVmZmVycyBmb3IgYWxsIHZxcy4gKi8KIHN0YXRpYyBsb25nIHZob3N0X2Rldl9hbGxvY19pb3ZlY3Moc3RydWN0IHZob3N0X2RldiAqZGV2KQogewogCWludCBpOworCWJvb2wgemNvcHk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udnFzOyArK2kpIHsKIAkJZGV2LT52cXNbaV0uaW5kaXJlY3QgPSBrbWFsbG9jKHNpemVvZiAqZGV2LT52cXNbaV0uaW5kaXJlY3QgKgpAQCAtMjM3LDE5ICsyNjAsMjEgQEAKIAkJCQkJICBHRlBfS0VSTkVMKTsKIAkJZGV2LT52cXNbaV0uaGVhZHMgPSBrbWFsbG9jKHNpemVvZiAqZGV2LT52cXNbaV0uaGVhZHMgKgogCQkJCQkgICAgVUlPX01BWElPViwgR0ZQX0tFUk5FTCk7Ci0KKwkJemNvcHkgPSB2aG9zdF96Y29weV9tYXNrICYgKDB4MSA8PCBpKTsKKwkJaWYgKHpjb3B5KQorCQkJZGV2LT52cXNbaV0udWJ1Zl9pbmZvID0KKwkJCQlrbWFsbG9jKHNpemVvZiAqZGV2LT52cXNbaV0udWJ1Zl9pbmZvICoKKwkJCQkJVUlPX01BWElPViwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZGV2LT52cXNbaV0uaW5kaXJlY3QgfHwgIWRldi0+dnFzW2ldLmxvZyB8fAotCQkJIWRldi0+dnFzW2ldLmhlYWRzKQorCQkJIWRldi0+dnFzW2ldLmhlYWRzIHx8CisJCQkoemNvcHkgJiYgIWRldi0+dnFzW2ldLnVidWZfaW5mbykpCiAJCQlnb3RvIGVycl9ub21lbTsKIAl9CiAJcmV0dXJuIDA7CiAKIGVycl9ub21lbToKLQlmb3IgKDsgaSA+PSAwOyAtLWkpIHsKLQkJa2ZyZWUoZGV2LT52cXNbaV0uaW5kaXJlY3QpOwotCQlrZnJlZShkZXYtPnZxc1tpXS5sb2cpOwotCQlrZnJlZShkZXYtPnZxc1tpXS5oZWFkcyk7Ci0JfQorCWZvciAoOyBpID49IDA7IC0taSkKKwkJdmhvc3RfdnFfZnJlZV9pb3ZlY3MoJmRldi0+dnFzW2ldKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIApAQCAtMjU3LDE0ICsyODIsOCBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGRldi0+bnZxczsgKytpKSB7Ci0JCWtmcmVlKGRldi0+dnFzW2ldLmluZGlyZWN0KTsKLQkJZGV2LT52cXNbaV0uaW5kaXJlY3QgPSBOVUxMOwotCQlrZnJlZShkZXYtPnZxc1tpXS5sb2cpOwotCQlkZXYtPnZxc1tpXS5sb2cgPSBOVUxMOwotCQlrZnJlZShkZXYtPnZxc1tpXS5oZWFkcyk7Ci0JCWRldi0+dnFzW2ldLmhlYWRzID0gTlVMTDsKLQl9CisJZm9yIChpID0gMDsgaSA8IGRldi0+bnZxczsgKytpKQorCQl2aG9zdF92cV9mcmVlX2lvdmVjcygmZGV2LT52cXNbaV0pOwogfQogCiBsb25nIHZob3N0X2Rldl9pbml0KHN0cnVjdCB2aG9zdF9kZXYgKmRldiwKQEAgLTI4Nyw2ICszMDYsNyBAQAogCQlkZXYtPnZxc1tpXS5sb2cgPSBOVUxMOwogCQlkZXYtPnZxc1tpXS5pbmRpcmVjdCA9IE5VTEw7CiAJCWRldi0+dnFzW2ldLmhlYWRzID0gTlVMTDsKKwkJZGV2LT52cXNbaV0udWJ1Zl9pbmZvID0gTlVMTDsKIAkJZGV2LT52cXNbaV0uZGV2ID0gZGV2OwogCQltdXRleF9pbml0KCZkZXYtPnZxc1tpXS5tdXRleCk7CiAJCXZob3N0X3ZxX3Jlc2V0KGRldiwgZGV2LT52cXMgKyBpKTsKQEAgLTM5MCw2ICs0MTAsMzAgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogSW4gY2FzZSBvZiBETUEgZG9uZSBub3QgaW4gb3JkZXIgaW4gbG93ZXIgZGV2aWNlIGRyaXZlciBmb3Igc29tZSByZWFzb24uCisgKiB1cGVuZF9pZHggaXMgdXNlZCB0byB0cmFjayBlbmQgb2YgdXNlZCBpZHgsIGRvbmVfaWR4IGlzIHVzZWQgdG8gdHJhY2sgaGVhZAorICogb2YgdXNlZCBpZHguIE9uY2UgbG93ZXIgZGV2aWNlIERNQSBkb25lIGNvbnRpZ3VvdXNseSwgd2Ugd2lsbCBzaWduYWwgS1ZNCisgKiBndWVzdCB1c2VkIGlkeC4KKyAqLworaW50IHZob3N0X3plcm9jb3B5X3NpZ25hbF91c2VkKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQoreworCWludCBpOworCWludCBqID0gMDsKKworCWZvciAoaSA9IHZxLT5kb25lX2lkeDsgaSAhPSB2cS0+dXBlbmRfaWR4OyBpID0gKGkgKyAxKSAlIFVJT19NQVhJT1YpIHsKKwkJaWYgKCh2cS0+aGVhZHNbaV0ubGVuID09IFZIT1NUX0RNQV9ET05FX0xFTikpIHsKKwkJCXZxLT5oZWFkc1tpXS5sZW4gPSBWSE9TVF9ETUFfQ0xFQVJfTEVOOworCQkJdmhvc3RfYWRkX3VzZWRfYW5kX3NpZ25hbCh2cS0+ZGV2LCB2cSwKKwkJCQkJCSAgdnEtPmhlYWRzW2ldLmlkLCAwKTsKKwkJCSsrajsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJaWYgKGopCisJCXZxLT5kb25lX2lkeCA9IGk7CisJcmV0dXJuIGo7Cit9CisKIC8qIENhbGxlciBzaG91bGQgaGF2ZSBkZXZpY2UgbXV0ZXggKi8KIHZvaWQgdmhvc3RfZGV2X2NsZWFudXAoc3RydWN0IHZob3N0X2RldiAqZGV2KQogewpAQCAtNDAwLDYgKzQ0NCwxMyBAQAogCQkJdmhvc3RfcG9sbF9zdG9wKCZkZXYtPnZxc1tpXS5wb2xsKTsKIAkJCXZob3N0X3BvbGxfZmx1c2goJmRldi0+dnFzW2ldLnBvbGwpOwogCQl9CisJCS8qIFdhaXQgZm9yIGFsbCBsb3dlciBkZXZpY2UgRE1BcyBkb25lLiAqLworCQlpZiAoZGV2LT52cXNbaV0udWJ1ZnMpCisJCQl2aG9zdF91YnVmX3B1dF9hbmRfd2FpdChkZXYtPnZxc1tpXS51YnVmcyk7CisKKwkJLyogU2lnbmFsIGd1ZXN0IGFzIGFwcHJvcHJpYXRlLiAqLworCQl2aG9zdF96ZXJvY29weV9zaWduYWxfdXNlZCgmZGV2LT52cXNbaV0pOworCiAJCWlmIChkZXYtPnZxc1tpXS5lcnJvcl9jdHgpCiAJCQlldmVudGZkX2N0eF9wdXQoZGV2LT52cXNbaV0uZXJyb3JfY3R4KTsKIAkJaWYgKGRldi0+dnFzW2ldLmVycm9yKQpAQCAtNTc4LDE3ICs2MjksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGluaXRfdXNlZChzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSwKLQkJICAgICBzdHJ1Y3QgdnJpbmdfdXNlZCBfX3VzZXIgKnVzZWQpCi17Ci0JaW50IHIgPSBwdXRfdXNlcih2cS0+dXNlZF9mbGFncywgJnVzZWQtPmZsYWdzKTsKLQotCWlmIChyKQotCQlyZXR1cm4gcjsKLQl2cS0+c2lnbmFsbGVkX3VzZWRfdmFsaWQgPSBmYWxzZTsKLQlyZXR1cm4gZ2V0X3VzZXIodnEtPmxhc3RfdXNlZF9pZHgsICZ1c2VkLT5pZHgpOwotfQotCiBzdGF0aWMgbG9uZyB2aG9zdF9zZXRfdnJpbmcoc3RydWN0IHZob3N0X2RldiAqZCwgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJncCkKIHsKIAlzdHJ1Y3QgZmlsZSAqZXZlbnRmcCwgKmZpbGVwID0gTlVMTCwKQEAgLTcwMSwxMCArNzQxLDYgQEAKIAkJCX0KIAkJfQogCi0JCXIgPSBpbml0X3VzZWQodnEsIChzdHJ1Y3QgdnJpbmdfdXNlZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZykKLQkJCSAgICAgIGEudXNlZF91c2VyX2FkZHIpOwotCQlpZiAocikKLQkJCWJyZWFrOwogCQl2cS0+bG9nX3VzZWQgPSAhIShhLmZsYWdzICYgKDB4MSA8PCBWSE9TVF9WUklOR19GX0xPRykpOwogCQl2cS0+ZGVzYyA9ICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWEuZGVzY191c2VyX2FkZHI7CiAJCXZxLT5hdmFpbCA9ICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWEuYXZhaWxfdXNlcl9hZGRyOwpAQCAtOTU5LDYgKzk5NSw1NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHZob3N0X3VwZGF0ZV91c2VkX2ZsYWdzKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQoreworCXZvaWQgX191c2VyICp1c2VkOworCWlmIChfX3B1dF91c2VyKHZxLT51c2VkX2ZsYWdzLCAmdnEtPnVzZWQtPmZsYWdzKSA8IDApCisJCXJldHVybiAtRUZBVUxUOworCWlmICh1bmxpa2VseSh2cS0+bG9nX3VzZWQpKSB7CisJCS8qIE1ha2Ugc3VyZSB0aGUgZmxhZyBpcyBzZWVuIGJlZm9yZSBsb2cuICovCisJCXNtcF93bWIoKTsKKwkJLyogTG9nIHVzZWQgZmxhZyB3cml0ZS4gKi8KKwkJdXNlZCA9ICZ2cS0+dXNlZC0+ZmxhZ3M7CisJCWxvZ193cml0ZSh2cS0+bG9nX2Jhc2UsIHZxLT5sb2dfYWRkciArCisJCQkgICh1c2VkIC0gKHZvaWQgX191c2VyICopdnEtPnVzZWQpLAorCQkJICBzaXplb2YgdnEtPnVzZWQtPmZsYWdzKTsKKwkJaWYgKHZxLT5sb2dfY3R4KQorCQkJZXZlbnRmZF9zaWduYWwodnEtPmxvZ19jdHgsIDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aG9zdF91cGRhdGVfYXZhaWxfZXZlbnQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsIHUxNiBhdmFpbF9ldmVudCkKK3sKKwlpZiAoX19wdXRfdXNlcih2cS0+YXZhaWxfaWR4LCB2aG9zdF9hdmFpbF9ldmVudCh2cSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodW5saWtlbHkodnEtPmxvZ191c2VkKSkgeworCQl2b2lkIF9fdXNlciAqdXNlZDsKKwkJLyogTWFrZSBzdXJlIHRoZSBldmVudCBpcyBzZWVuIGJlZm9yZSBsb2cuICovCisJCXNtcF93bWIoKTsKKwkJLyogTG9nIGF2YWlsIGV2ZW50IHdyaXRlICovCisJCXVzZWQgPSB2aG9zdF9hdmFpbF9ldmVudCh2cSk7CisJCWxvZ193cml0ZSh2cS0+bG9nX2Jhc2UsIHZxLT5sb2dfYWRkciArCisJCQkgICh1c2VkIC0gKHZvaWQgX191c2VyICopdnEtPnVzZWQpLAorCQkJICBzaXplb2YgKnZob3N0X2F2YWlsX2V2ZW50KHZxKSk7CisJCWlmICh2cS0+bG9nX2N0eCkKKwkJCWV2ZW50ZmRfc2lnbmFsKHZxLT5sb2dfY3R4LCAxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCB2aG9zdF9pbml0X3VzZWQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCit7CisJaW50IHI7CisJaWYgKCF2cS0+cHJpdmF0ZV9kYXRhKQorCQlyZXR1cm4gMDsKKworCXIgPSB2aG9zdF91cGRhdGVfdXNlZF9mbGFncyh2cSk7CisJaWYgKHIpCisJCXJldHVybiByOworCXZxLT5zaWduYWxsZWRfdXNlZF92YWxpZCA9IGZhbHNlOworCXJldHVybiBnZXRfdXNlcih2cS0+bGFzdF91c2VkX2lkeCwgJnZxLT51c2VkLT5pZHgpOworfQorCiBzdGF0aWMgaW50IHRyYW5zbGF0ZV9kZXNjKHN0cnVjdCB2aG9zdF9kZXYgKmRldiwgdTY0IGFkZHIsIHUzMiBsZW4sCiAJCQkgIHN0cnVjdCBpb3ZlYyBpb3ZbXSwgaW50IGlvdl9zaXplKQogewpAQCAtMTQzMCwzNCArMTUxNywyMCBAQAogCQlyZXR1cm4gZmFsc2U7CiAJdnEtPnVzZWRfZmxhZ3MgJj0gflZSSU5HX1VTRURfRl9OT19OT1RJRlk7CiAJaWYgKCF2aG9zdF9oYXNfZmVhdHVyZShkZXYsIFZJUlRJT19SSU5HX0ZfRVZFTlRfSURYKSkgewotCQlyID0gcHV0X3VzZXIodnEtPnVzZWRfZmxhZ3MsICZ2cS0+dXNlZC0+ZmxhZ3MpOworCQlyID0gdmhvc3RfdXBkYXRlX3VzZWRfZmxhZ3ModnEpOwogCQlpZiAocikgewogCQkJdnFfZXJyKHZxLCAiRmFpbGVkIHRvIGVuYWJsZSBub3RpZmljYXRpb24gYXQgJXA6ICVkXG4iLAogCQkJICAgICAgICZ2cS0+dXNlZC0+ZmxhZ3MsIHIpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJfSBlbHNlIHsKLQkJciA9IHB1dF91c2VyKHZxLT5hdmFpbF9pZHgsIHZob3N0X2F2YWlsX2V2ZW50KHZxKSk7CisJCXIgPSB2aG9zdF91cGRhdGVfYXZhaWxfZXZlbnQodnEsIHZxLT5hdmFpbF9pZHgpOwogCQlpZiAocikgewogCQkJdnFfZXJyKHZxLCAiRmFpbGVkIHRvIHVwZGF0ZSBhdmFpbCBldmVudCBpbmRleCBhdCAlcDogJWRcbiIsCiAJCQkgICAgICAgdmhvc3RfYXZhaWxfZXZlbnQodnEpLCByKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCX0KLQlpZiAodW5saWtlbHkodnEtPmxvZ191c2VkKSkgewotCQl2b2lkIF9fdXNlciAqdXNlZDsKLQkJLyogTWFrZSBzdXJlIGRhdGEgaXMgc2VlbiBiZWZvcmUgbG9nLiAqLwotCQlzbXBfd21iKCk7Ci0JCXVzZWQgPSB2aG9zdF9oYXNfZmVhdHVyZShkZXYsIFZJUlRJT19SSU5HX0ZfRVZFTlRfSURYKSA/Ci0JCQkmdnEtPnVzZWQtPmZsYWdzIDogdmhvc3RfYXZhaWxfZXZlbnQodnEpOwotCQkvKiBMb2cgdXNlZCBmbGFncyBvciBldmVudCBpbmRleCBlbnRyeSB3cml0ZS4gQm90aCBhcmUgMTYgYml0Ci0JCSAqIGZpZWxkcy4gKi8KLQkJbG9nX3dyaXRlKHZxLT5sb2dfYmFzZSwgdnEtPmxvZ19hZGRyICsKLQkJCSAgICh1c2VkIC0gKHZvaWQgX191c2VyICopdnEtPnVzZWQpLAotCQkJICBzaXplb2YodTE2KSk7Ci0JCWlmICh2cS0+bG9nX2N0eCkKLQkJCWV2ZW50ZmRfc2lnbmFsKHZxLT5sb2dfY3R4LCAxKTsKLQl9CiAJLyogVGhleSBjb3VsZCBoYXZlIHNsaXBwZWQgb25lIGluIGFzIHdlIHdlcmUgZG9pbmcgdGhhdDogbWFrZQogCSAqIHN1cmUgaXQncyB3cml0dGVuLCB0aGVuIGNoZWNrIGFnYWluLiAqLwogCXNtcF9tYigpOwpAQCAtMTQ4MCw5ICsxNTUzLDU1IEBACiAJCXJldHVybjsKIAl2cS0+dXNlZF9mbGFncyB8PSBWUklOR19VU0VEX0ZfTk9fTk9USUZZOwogCWlmICghdmhvc3RfaGFzX2ZlYXR1cmUoZGV2LCBWSVJUSU9fUklOR19GX0VWRU5UX0lEWCkpIHsKLQkJciA9IHB1dF91c2VyKHZxLT51c2VkX2ZsYWdzLCAmdnEtPnVzZWQtPmZsYWdzKTsKKwkJciA9IHZob3N0X3VwZGF0ZV91c2VkX2ZsYWdzKHZxKTsKIAkJaWYgKHIpCiAJCQl2cV9lcnIodnEsICJGYWlsZWQgdG8gZW5hYmxlIG5vdGlmaWNhdGlvbiBhdCAlcDogJWRcbiIsCiAJCQkgICAgICAgJnZxLT51c2VkLT5mbGFncywgcik7CiAJfQogfQorCitzdGF0aWMgdm9pZCB2aG9zdF96ZXJvY29weV9kb25lX3NpZ25hbChzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3Qgdmhvc3RfdWJ1Zl9yZWYgKnVidWZzID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCB2aG9zdF91YnVmX3JlZiwKKwkJCQkJCSAgICBrcmVmKTsKKwl3YWtlX3VwKCZ1YnVmcy0+d2FpdCk7Cit9CisKK3N0cnVjdCB2aG9zdF91YnVmX3JlZiAqdmhvc3RfdWJ1Zl9hbGxvYyhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSwKKwkJCQkJYm9vbCB6Y29weSkKK3sKKwlzdHJ1Y3Qgdmhvc3RfdWJ1Zl9yZWYgKnVidWZzOworCS8qIE5vIHplcm8gY29weSBiYWNrZW5kPyBOb3RoaW5nIHRvIGNvdW50LiAqLworCWlmICghemNvcHkpCisJCXJldHVybiBOVUxMOworCXVidWZzID0ga21hbGxvYyhzaXplb2YgKnVidWZzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVidWZzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlrcmVmX2luaXQoJnVidWZzLT5rcmVmKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1YnVmcy0+d2FpdCk7CisJdWJ1ZnMtPnZxID0gdnE7CisJcmV0dXJuIHVidWZzOworfQorCit2b2lkIHZob3N0X3VidWZfcHV0KHN0cnVjdCB2aG9zdF91YnVmX3JlZiAqdWJ1ZnMpCit7CisJa3JlZl9wdXQoJnVidWZzLT5rcmVmLCB2aG9zdF96ZXJvY29weV9kb25lX3NpZ25hbCk7Cit9CisKK3ZvaWQgdmhvc3RfdWJ1Zl9wdXRfYW5kX3dhaXQoc3RydWN0IHZob3N0X3VidWZfcmVmICp1YnVmcykKK3sKKwlrcmVmX3B1dCgmdWJ1ZnMtPmtyZWYsIHZob3N0X3plcm9jb3B5X2RvbmVfc2lnbmFsKTsKKwl3YWl0X2V2ZW50KHVidWZzLT53YWl0LCAhYXRvbWljX3JlYWQoJnVidWZzLT5rcmVmLnJlZmNvdW50KSk7CisJa2ZyZWUodWJ1ZnMpOworfQorCit2b2lkIHZob3N0X3plcm9jb3B5X2NhbGxiYWNrKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdWJ1Zl9pbmZvICp1YnVmID0gYXJnOworCXN0cnVjdCB2aG9zdF91YnVmX3JlZiAqdWJ1ZnMgPSB1YnVmLT5hcmc7CisJc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEgPSB1YnVmcy0+dnE7CisKKwkvKiBzZXQgbGVuID0gMSB0byBtYXJrIHRoaXMgZGVzYyBidWZmZXJzIGRvbmUgRE1BICovCisJdnEtPmhlYWRzW3VidWYtPmRlc2NdLmxlbiA9IFZIT1NUX0RNQV9ET05FX0xFTjsKKwlrcmVmX3B1dCgmdWJ1ZnMtPmtyZWYsIHZob3N0X3plcm9jb3B5X2RvbmVfc2lnbmFsKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaCBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaAppbmRleCA4ZTAzMzc5Li4xNGM5YWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmgKKysrIGIvZHJpdmVycy92aG9zdC92aG9zdC5oCkBAIC0xMyw2ICsxMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19yaW5nLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCisvKiBUaGlzIGlzIGZvciB6ZXJvY29weSwgdXNlZCBidWZmZXIgbGVuIGlzIHNldCB0byAxIHdoZW4gbG93ZXIgZGV2aWNlIERNQQorICogZG9uZSAqLworI2RlZmluZSBWSE9TVF9ETUFfRE9ORV9MRU4JMQorI2RlZmluZSBWSE9TVF9ETUFfQ0xFQVJfTEVOCTAKKwogc3RydWN0IHZob3N0X2RldmljZTsKIAogc3RydWN0IHZob3N0X3dvcms7CkBAIC01MCw2ICs1NSwxOCBAQAogCXU2NCBsZW47CiB9OwogCitzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlOworCitzdHJ1Y3Qgdmhvc3RfdWJ1Zl9yZWYgeworCXN0cnVjdCBrcmVmIGtyZWY7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwlzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTsKK307CisKK3N0cnVjdCB2aG9zdF91YnVmX3JlZiAqdmhvc3RfdWJ1Zl9hbGxvYyhzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICosIGJvb2wgemNvcHkpOwordm9pZCB2aG9zdF91YnVmX3B1dChzdHJ1Y3Qgdmhvc3RfdWJ1Zl9yZWYgKik7Cit2b2lkIHZob3N0X3VidWZfcHV0X2FuZF93YWl0KHN0cnVjdCB2aG9zdF91YnVmX3JlZiAqKTsKKwogLyogVGhlIHZpcnRxdWV1ZSBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgcXVldWUgYXR0YWNoZWQgdG8gYSBkZXZpY2UuICovCiBzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlIHsKIAlzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXY7CkBAIC0xMTQsNiArMTMxLDE2IEBACiAJLyogTG9nIHdyaXRlIGRlc2NyaXB0b3JzICovCiAJdm9pZCBfX3VzZXIgKmxvZ19iYXNlOwogCXN0cnVjdCB2aG9zdF9sb2cgKmxvZzsKKwkvKiB2aG9zdCB6ZXJvY29weSBzdXBwb3J0IGZpZWxkcyBiZWxvdzogKi8KKwkvKiBsYXN0IHVzZWQgaWR4IGZvciBvdXRzdGFuZGluZyBETUEgemVyb2NvcHkgYnVmZmVycyAqLworCWludCB1cGVuZF9pZHg7CisJLyogZmlyc3QgdXNlZCBpZHggZm9yIERNQSBkb25lIHplcm9jb3B5IGJ1ZmZlcnMgKi8KKwlpbnQgZG9uZV9pZHg7CisJLyogYW4gYXJyYXkgb2YgdXNlcnNwYWNlIGJ1ZmZlcnMgaW5mbyAqLworCXN0cnVjdCB1YnVmX2luZm8gKnVidWZfaW5mbzsKKwkvKiBSZWZlcmVuY2UgY291bnRpbmcgZm9yIG91dHN0YW5kaW5nIHVidWZzLgorCSAqIFByb3RlY3RlZCBieSB2cSBtdXRleC4gV3JpdGVycyBtdXN0IGFsc28gdGFrZSBkZXZpY2UgbXV0ZXguICovCisJc3RydWN0IHZob3N0X3VidWZfcmVmICp1YnVmczsKIH07CiAKIHN0cnVjdCB2aG9zdF9kZXYgewpAQCAtMTQ3LDYgKzE3NCw3IEBACiAJCSAgICAgIHN0cnVjdCB2aG9zdF9sb2cgKmxvZywgdW5zaWduZWQgaW50ICpsb2dfbnVtKTsKIHZvaWQgdmhvc3RfZGlzY2FyZF92cV9kZXNjKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKiwgaW50IG4pOwogCitpbnQgdmhvc3RfaW5pdF91c2VkKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKik7CiBpbnQgdmhvc3RfYWRkX3VzZWQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqLCB1bnNpZ25lZCBpbnQgaGVhZCwgaW50IGxlbik7CiBpbnQgdmhvc3RfYWRkX3VzZWRfbihzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICosIHN0cnVjdCB2cmluZ191c2VkX2VsZW0gKmhlYWRzLAogCQkgICAgIHVuc2lnbmVkIGNvdW50KTsKQEAgLTE2MCw2ICsxODgsOCBAQAogCiBpbnQgdmhvc3RfbG9nX3dyaXRlKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLCBzdHJ1Y3Qgdmhvc3RfbG9nICpsb2csCiAJCSAgICB1bnNpZ25lZCBpbnQgbG9nX251bSwgdTY0IGxlbik7Cit2b2lkIHZob3N0X3plcm9jb3B5X2NhbGxiYWNrKHZvaWQgKmFyZyk7CitpbnQgdmhvc3RfemVyb2NvcHlfc2lnbmFsX3VzZWQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpOwogCiAjZGVmaW5lIHZxX2Vycih2cSwgZm10LCAuLi4pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQlwcl9kZWJ1Zyhwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgIFwKQEAgLTE4Niw0ICsyMTYsNiBAQAogCXJldHVybiBhY2tlZF9mZWF0dXJlcyAmICgxIDw8IGJpdCk7CiB9CiAKK3ZvaWQgdmhvc3RfZW5hYmxlX3pjb3B5KGludCB2cSk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYyBiL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKaW5kZXggNWZjOTgzYy4uY2YwM2FkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYworKysgYi9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCkBAIC00NDcsNiArNDQ3LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCisJZmItPmZiLmRldmljZQkJPSAmZmItPmRldi0+ZGV2OworCiAJZmItPmZiLmZpeC5tbWlvX3N0YXJ0CT0gZmItPmRldi0+cmVzLnN0YXJ0OwogCWZiLT5mYi5maXgubW1pb19sZW4JPSByZXNvdXJjZV9zaXplKCZmYi0+ZGV2LT5yZXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2FyY2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2FyY2ZiLmMKaW5kZXggM2VjNDkyMy4uYzIyZThkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hcmNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXJjZmIuYwpAQCAtNTE1LDExICs1MTUsMTAgQEAKIAogCS8qIFdlIG5lZWQgYSBmbGF0IGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBBcmMncwogCSAgIGxlc3MtZmxhdCBhY3R1YWwgcGFnZWQgZnJhbWVidWZmZXIgKi8KLQlpZiAoISh2aWRlb21lbW9yeSA9IHZtYWxsb2ModmlkZW9tZW1vcnlzaXplKSkpCisJdmlkZW9tZW1vcnkgPSB2emFsbG9jKHZpZGVvbWVtb3J5c2l6ZSk7CisJaWYgKCF2aWRlb21lbW9yeSkKIAkJcmV0dXJuIHJldHZhbDsKIAotCW1lbXNldCh2aWRlb21lbW9yeSwgMCwgdmlkZW9tZW1vcnlzaXplKTsKLQogCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGFyY2ZiX3BhciksICZkZXYtPmRldik7CiAJaWYgKCFpbmZvKQogCQlnb3RvIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXRtZWxfbGNkZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXRtZWxfbGNkZmIuYwppbmRleCA0NDg0YzcyLi44MTdhYjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0bWVsX2xjZGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdG1lbF9sY2RmYi5jCkBAIC05MDYsNyArOTA2LDcgQEAKIAlpZiAobWFwKSB7CiAJCS8qIHVzZSBhIHByZS1hbGxvY2F0ZWQgbWVtb3J5IGJ1ZmZlciAqLwogCQlpbmZvLT5maXguc21lbV9zdGFydCA9IG1hcC0+c3RhcnQ7Ci0JCWluZm8tPmZpeC5zbWVtX2xlbiA9IG1hcC0+ZW5kIC0gbWFwLT5zdGFydCArIDE7CisJCWluZm8tPmZpeC5zbWVtX2xlbiA9IHJlc291cmNlX3NpemUobWFwKTsKIAkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW5mby0+Zml4LnNtZW1fc3RhcnQsCiAJCQkJCWluZm8tPmZpeC5zbWVtX2xlbiwgcGRldi0+bmFtZSkpIHsKIAkJCXJldCA9IC1FQlVTWTsKQEAgLTkzMiw3ICs5MzIsNyBAQAogCiAJLyogTENEQyByZWdpc3RlcnMgKi8KIAlpbmZvLT5maXgubW1pb19zdGFydCA9IHJlZ3MtPnN0YXJ0OwotCWluZm8tPmZpeC5tbWlvX2xlbiA9IHJlZ3MtPmVuZCAtIHJlZ3MtPnN0YXJ0ICsgMTsKKwlpbmZvLT5maXgubW1pb19sZW4gPSByZXNvdXJjZV9zaXplKHJlZ3MpOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW5mby0+Zml4Lm1taW9fc3RhcnQsCiAJCQkJaW5mby0+Zml4Lm1taW9fbGVuLCBwZGV2LT5uYW1lKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCmluZGV4IGViYjg5M2MuLjQ0YmRjZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKQEAgLTI0OCwxMCArMjQ4LDYgQEAKIAogc3RhdGljIGludCBhdHlfaW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKLSNpZmRlZiBDT05GSUdfQVRBUkkKLXN0YXRpYyBpbnQgc3RvcmVfdmlkZW9fcGFyKGNoYXIgKnZpZGVvcGFyLCB1bnNpZ25lZCBjaGFyIG02NF9udW0pOwotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIGF0eV9nZXRfY3J0Yyhjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIHN0cnVjdCBjcnRjICpjcnRjKTsKIAogc3RhdGljIHZvaWQgYXR5X3NldF9jcnRjKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgY29uc3Qgc3RydWN0IGNydGMgKmNydGMpOwpAQCAtMjI2OCwxMSArMjI2NCwxMyBAQAogCXJldHVybjsKIH0KIAorI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyB2b2lkIGF0eV9ibF9leGl0KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKIHsKIAliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmQpOwogCXByaW50aygiYXR5OiBCYWNrbGlnaHQgdW5sb2FkZWRcbiIpOwogfQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAogI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUICovCiAKQEAgLTI3ODksNyArMjc4Nyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmZGVmIENPTkZJR19BVEFSSQorI2lmIGRlZmluZWQoQ09ORklHX0FUQVJJKSAmJiAhZGVmaW5lZChNT0RVTEUpCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzdG9yZV92aWRlb19wYXIoY2hhciAqdmlkZW9fc3RyLCB1bnNpZ25lZCBjaGFyIG02NF9udW0pCiB7CiAJY2hhciAqcDsKQEAgLTI4MTgsNyArMjgxNiw3IEBACiAJcGh5c192bWVtYmFzZVttNjRfbnVtXSA9IDA7CiAJcmV0dXJuIC0xOwogfQotI2VuZGlmIC8qIENPTkZJR19BVEFSSSAqLworI2VuZGlmIC8qIENPTkZJR19BVEFSSSAmJiAhTU9EVUxFICovCiAKIC8qCiAgKiBCbGFuayB0aGUgZGlzcGxheS4KQEAgLTM0NjAsOSArMzQ1OCwxMCBAQAogCiAJcmFkZHIgPSBhZGRyICsgMHg3ZmYwMDBVTDsKIAlycnAgPSAmcGRldi0+cmVzb3VyY2VbMl07Ci0JaWYgKChycnAtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pICYmIHJlcXVlc3RfbWVtX3JlZ2lvbihycnAtPnN0YXJ0LCBycnAtPmVuZCAtIHJycC0+c3RhcnQgKyAxLCAiYXR5ZmIiKSkgeworCWlmICgocnJwLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSAmJgorCSAgICByZXF1ZXN0X21lbV9yZWdpb24ocnJwLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShycnApLCAiYXR5ZmIiKSkgewogCQlwYXItPmF1eF9zdGFydCA9IHJycC0+c3RhcnQ7Ci0JCXBhci0+YXV4X3NpemUgPSBycnAtPmVuZCAtIHJycC0+c3RhcnQgKyAxOworCQlwYXItPmF1eF9zaXplID0gcmVzb3VyY2Vfc2l6ZShycnApOwogCQlyYWRkciA9IHJycC0+c3RhcnQ7CiAJCVBSSU5US0koInVzaW5nIGF1eGlsaWFyeSByZWdpc3RlciBhcGVydHVyZVxuIik7CiAJfQpAQCAtMzU1Miw3ICszNTUxLDcgQEAKIAogCS8qIFJlc2VydmUgc3BhY2UgKi8KIAlyZXNfc3RhcnQgPSBycC0+c3RhcnQ7Ci0JcmVzX3NpemUgPSBycC0+ZW5kIC0gcnAtPnN0YXJ0ICsgMTsKKwlyZXNfc2l6ZSA9IHJlc291cmNlX3NpemUocnApOwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlc19zdGFydCwgcmVzX3NpemUsICJhdHlmYiIpKQogCQlyZXR1cm4gLUVCVVNZOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmMKaW5kZXggMzRiMmZjNDcuLjAxYThmZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmMKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCX0KIAogCWF1MTEwMGZiX2ZpeC5tbWlvX3N0YXJ0ID0gcmVnc19yZXMtPnN0YXJ0OwotCWF1MTEwMGZiX2ZpeC5tbWlvX2xlbiA9IHJlZ3NfcmVzLT5lbmQgLSByZWdzX3Jlcy0+c3RhcnQgKyAxOworCWF1MTEwMGZiX2ZpeC5tbWlvX2xlbiA9IHJlc291cmNlX3NpemUocmVnc19yZXMpOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYXUxMTAwZmJfZml4Lm1taW9fc3RhcnQsIGF1MTEwMGZiX2ZpeC5tbWlvX2xlbiwKIAkJCQlEUklWRVJfTkFNRSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCmluZGV4IDBjOTM3M2IuLjFlNTRiOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZwpAQCAtMTE3LDYgKzExNywxNCBAQAogCSAgSWYgeW91IGhhdmUgYW4gTEQ5MDQwIFBhbmVsLCBzYXkgWSB0byBlbmFibGUgaXRzCiAJICBjb250cm9sIGRyaXZlci4KIAorY29uZmlnIExDRF9BTVMzNjlGRzA2CisJdHJpc3RhdGUgIkFNUzM2OUZHMDYgQU1PTEVEIExDRCBEcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkgJiYgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEFNUzM2OUZHMDYgQU1PTEVEIFBhbmVsLCBzYXkgWSB0byBlbmFibGUgaXRzCisJICBMQ0QgY29udHJvbCBkcml2ZXIuCisKIGVuZGlmICMgTENEX0NMQVNTX0RFVklDRQogCiAjCkBAIC0zMDIsNiArMzEwLDE4IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKIAkgIGJlIGNhbGxlZCBhZHA4ODYwX2JsLgogCitjb25maWcgQkFDS0xJR0hUX0FEUDg4NzAKKwl0cmlzdGF0ZSAiQmFja2xpZ2h0IERyaXZlciBmb3IgQURQODg3MCB1c2luZyBXTEVEIgorCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBJMkMKKwlzZWxlY3QgTkVXX0xFRFMKKwlzZWxlY3QgTEVEU19DTEFTUworCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgTENEIGJhY2tsaWdodCBjb25uZWN0ZWQgdG8gdGhlIEFEUDg4NzAsCisJICBzYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGlzIGRyaXZlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgYWRwODg3MF9ibC4KKwogY29uZmlnIEJBQ0tMSUdIVF84OFBNODYwWAogCXRyaXN0YXRlICJCYWNrbGlnaHQgRHJpdmVyIGZvciA4OFBNODYwNiB1c2luZyBXTEVEIgogCWRlcGVuZHMgb24gTUZEXzg4UE04NjBYCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCmluZGV4IGI5Y2E4NDkuLmJmMWRkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCkBAIC0xMyw2ICsxMyw3IEBACiBvYmotJChDT05GSUdfTENEX1RPU0EpCQkgICArPSB0b3NhX2xjZC5vCiBvYmotJChDT05GSUdfTENEX1M2RTYzTTApCSs9IHM2ZTYzbTAubwogb2JqLSQoQ09ORklHX0xDRF9MRDkwNDApCSs9IGxkOTA0MC5vCitvYmotJChDT05GSUdfTENEX0FNUzM2OUZHMDYpCSs9IGFtczM2OWZnMDYubwogCiBvYmotJChDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRSkgKz0gYmFja2xpZ2h0Lm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfQVRNRUxfUFdNKSAgICArPSBhdG1lbC1wd20tYmwubwpAQCAtMzQsNiArMzUsNyBAQAogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9BRFgpICAgICs9IGFkeF9ibC5vCiBvYmotJChDT05GSUdfQkFDS0xJR0hUX0FEUDU1MjApCSs9IGFkcDU1MjBfYmwubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9BRFA4ODYwKQkrPSBhZHA4ODYwX2JsLm8KK29iai0kKENPTkZJR19CQUNLTElHSFRfQURQODg3MCkJKz0gYWRwODg3MF9ibC5vCiBvYmotJChDT05GSUdfQkFDS0xJR0hUXzg4UE04NjBYKSArPSA4OHBtODYweF9ibC5vCiBvYmotJChDT05GSUdfQkFDS0xJR0hUX1BDRjUwNjMzKQkrPSBwY2Y1MDYzMy1iYWNrbGlnaHQubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODYwX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODYwX2JsLmMKaW5kZXggZDJhOTZhNC4uMTgzYjZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwODg2MF9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NjBfYmwuYwpAQCAtNzIyLDggKzcyMiw3IEBACiAJCWdvdG8gb3V0MjsKIAl9CiAKLQlibC0+cHJvcHMubWF4X2JyaWdodG5lc3MgPQotCQlibC0+cHJvcHMuYnJpZ2h0bmVzcyA9IEFEUDg4NjBfTUFYX0JSSUdIVE5FU1M7CisJYmwtPnByb3BzLmJyaWdodG5lc3MgPSBBRFA4ODYwX01BWF9CUklHSFRORVNTOwogCiAJZGF0YS0+YmwgPSBibDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwODg3MF9ibC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwODg3MF9ibC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTg4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODcwX2JsLmMKQEAgLTAsMCArMSwxMDEyIEBACisvKgorICogQmFja2xpZ2h0IGRyaXZlciBmb3IgQW5hbG9nIERldmljZXMgQURQODg3MCBCYWNrbGlnaHQgRGV2aWNlcworICoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTEgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvaTJjL2FkcDg4NzAuaD4KKyNkZWZpbmUgQURQODg3MF9FWFRfRkVBVFVSRVMKKyNkZWZpbmUgQURQODg3MF9VU0VfTEVEUworCisKKyNkZWZpbmUgQURQODg3MF9NRkRWSUQJMHgwMCAgLyogTWFudWZhY3R1cmVyIGFuZCBkZXZpY2UgSUQgKi8KKyNkZWZpbmUgQURQODg3MF9NRENSCTB4MDEgIC8qIERldmljZSBtb2RlIGFuZCBzdGF0dXMgKi8KKyNkZWZpbmUgQURQODg3MF9JTlRfU1RBVCAweDAyICAvKiBJbnRlcnJ1cHRzIHN0YXR1cyAqLworI2RlZmluZSBBRFA4ODcwX0lOVF9FTgkweDAzICAvKiBJbnRlcnJ1cHRzIGVuYWJsZSAqLworI2RlZmluZSBBRFA4ODcwX0NGR1IJMHgwNCAgLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBBRFA4ODcwX0JMU0VMCTB4MDUgIC8qIFNpbmsgZW5hYmxlIGJhY2tsaWdodCBvciBpbmRlcGVuZGVudCAqLworI2RlZmluZSBBRFA4ODcwX1BXTUxFRAkweDA2ICAvKiBQV00gRW5hYmxlIFNlbGVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBBRFA4ODcwX0JMT0ZGCTB4MDcgIC8qIEJhY2tsaWdodCBvZmYgdGltZW91dCAqLworI2RlZmluZSBBRFA4ODcwX0JMRElNCTB4MDggIC8qIEJhY2tsaWdodCBkaW0gdGltZW91dCAqLworI2RlZmluZSBBRFA4ODcwX0JMRlIJMHgwOSAgLyogQmFja2xpZ2h0IGZhZGUgaW4gYW5kIG91dCByYXRlcyAqLworI2RlZmluZSBBRFA4ODcwX0JMTVgxCTB4MEEgIC8qIEJhY2tsaWdodCAoQnJpZ2h0bmVzcyBMZXZlbCAxLWRheWxpZ2h0KSBtYXhpbXVtIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTERNMQkweDBCICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgMS1kYXlsaWdodCkgZGltIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTE1YMgkweDBDICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgMi1icmlnaHQpIG1heGltdW0gY3VycmVudCAqLworI2RlZmluZSBBRFA4ODcwX0JMRE0yCTB4MEQgIC8qIEJhY2tsaWdodCAoQnJpZ2h0bmVzcyBMZXZlbCAyLWJyaWdodCkgZGltIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTE1YMwkweDBFICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgMy1vZmZpY2UpIG1heGltdW0gY3VycmVudCAqLworI2RlZmluZSBBRFA4ODcwX0JMRE0zCTB4MEYgIC8qIEJhY2tsaWdodCAoQnJpZ2h0bmVzcyBMZXZlbCAzLW9mZmljZSkgZGltIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTE1YNAkweDEwICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgNC1pbmRvb3IpIG1heGltdW0gY3VycmVudCAqLworI2RlZmluZSBBRFA4ODcwX0JMRE00CTB4MTEgIC8qIEJhY2tsaWdodCAoQnJpZ2h0bmVzcyBMZXZlbCA0LWluZG9vcikgZGltIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTE1YNQkweDEyICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgNS1kYXJrKSBtYXhpbXVtIGN1cnJlbnQgKi8KKyNkZWZpbmUgQURQODg3MF9CTERNNQkweDEzICAvKiBCYWNrbGlnaHQgKEJyaWdodG5lc3MgTGV2ZWwgNS1kYXJrKSBkaW0gY3VycmVudCAqLworI2RlZmluZSBBRFA4ODcwX0lTQ0xBVwkweDFBICAvKiBJbmRlcGVuZGVudCBzaW5rIGN1cnJlbnQgZmFkZSBsYXcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9JU0NDCTB4MUIgIC8qIEluZGVwZW5kZW50IHNpbmsgY3VycmVudCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEUDg4NzBfSVNDVDEJMHgxQyAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IFRpbWVyIFJlZ2lzdGVyIExFRFs3OjVdICovCisjZGVmaW5lIEFEUDg4NzBfSVNDVDIJMHgxRCAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IFRpbWVyIFJlZ2lzdGVyIExFRFs0OjFdICovCisjZGVmaW5lIEFEUDg4NzBfSVNDRgkweDFFICAvKiBJbmRlcGVuZGVudCBzaW5rIGN1cnJlbnQgZmFkZSByZWdpc3RlciAqLworI2RlZmluZSBBRFA4ODcwX0lTQzEJMHgxRiAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IExFRDEgKi8KKyNkZWZpbmUgQURQODg3MF9JU0MyCTB4MjAgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQyICovCisjZGVmaW5lIEFEUDg4NzBfSVNDMwkweDIxICAvKiBJbmRlcGVuZGVudCBTaW5rIEN1cnJlbnQgTEVEMyAqLworI2RlZmluZSBBRFA4ODcwX0lTQzQJMHgyMiAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IExFRDQgKi8KKyNkZWZpbmUgQURQODg3MF9JU0M1CTB4MjMgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQ1ICovCisjZGVmaW5lIEFEUDg4NzBfSVNDNgkweDI0ICAvKiBJbmRlcGVuZGVudCBTaW5rIEN1cnJlbnQgTEVENiAqLworI2RlZmluZSBBRFA4ODcwX0lTQzcJMHgyNSAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IExFRDcgKEJyaWdodG5lc3MgTGV2ZWwgMS1kYXlsaWdodCkgKi8KKyNkZWZpbmUgQURQODg3MF9JU0M3X0wyCTB4MjYgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQ3IChCcmlnaHRuZXNzIExldmVsIDItYnJpZ2h0KSAqLworI2RlZmluZSBBRFA4ODcwX0lTQzdfTDMJMHgyNyAgLyogSW5kZXBlbmRlbnQgU2luayBDdXJyZW50IExFRDcgKEJyaWdodG5lc3MgTGV2ZWwgMy1vZmZpY2UpICovCisjZGVmaW5lIEFEUDg4NzBfSVNDN19MNAkweDI4ICAvKiBJbmRlcGVuZGVudCBTaW5rIEN1cnJlbnQgTEVENyAoQnJpZ2h0bmVzcyBMZXZlbCA0LWluZG9vcikgKi8KKyNkZWZpbmUgQURQODg3MF9JU0M3X0w1CTB4MjkgIC8qIEluZGVwZW5kZW50IFNpbmsgQ3VycmVudCBMRUQ3IChCcmlnaHRuZXNzIExldmVsIDUtZGFyaykgKi8KKyNkZWZpbmUgQURQODg3MF9DTVBfQ1RMCTB4MkQgIC8qIEFMUyBDb21wYXJhdG9yIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9BTFMxX0VOCTB4MkUgIC8qIE1haW4gQUxTIGNvbXBhcmF0b3IgbGV2ZWwgZW5hYmxlICovCisjZGVmaW5lIEFEUDg4NzBfQUxTMl9FTgkweDJGICAvKiBTZWNvbmQgQUxTIGNvbXBhcmF0b3IgbGV2ZWwgZW5hYmxlICovCisjZGVmaW5lIEFEUDg4NzBfQUxTMV9TVEFUIDB4MzAgIC8qIE1haW4gQUxTIENvbXBhcmF0b3IgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEFEUDg4NzBfQUxTMl9TVEFUIDB4MzEgIC8qIFNlY29uZCBBTFMgQ29tcGFyYXRvciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9MMlRSUAkweDMyICAvKiBMMiBjb21wYXJhdG9yIHJlZmVyZW5jZSAqLworI2RlZmluZSBBRFA4ODcwX0wySFlTCTB4MzMgIC8qIEwyIGh5c3RlcmVzaXMgKi8KKyNkZWZpbmUgQURQODg3MF9MM1RSUAkweDM0ICAvKiBMMyBjb21wYXJhdG9yIHJlZmVyZW5jZSAqLworI2RlZmluZSBBRFA4ODcwX0wzSFlTCTB4MzUgIC8qIEwzIGh5c3RlcmVzaXMgKi8KKyNkZWZpbmUgQURQODg3MF9MNFRSUAkweDM2ICAvKiBMNCBjb21wYXJhdG9yIHJlZmVyZW5jZSAqLworI2RlZmluZSBBRFA4ODcwX0w0SFlTCTB4MzcgIC8qIEw0IGh5c3RlcmVzaXMgKi8KKyNkZWZpbmUgQURQODg3MF9MNVRSUAkweDM4ICAvKiBMNSBjb21wYXJhdG9yIHJlZmVyZW5jZSAqLworI2RlZmluZSBBRFA4ODcwX0w1SFlTCTB4MzkgIC8qIEw1IGh5c3RlcmVzaXMgKi8KKyNkZWZpbmUgQURQODg3MF9QSDFMRVZMCTB4NDAgIC8qIEZpcnN0IHBob3RvdHJhbnNpc3RvciBhbWJpZW50IGxpZ2h0IGxldmVsLWxvdyBieXRlIHJlZ2lzdGVyICovCisjZGVmaW5lIEFEUDg4NzBfUEgxTEVWSAkweDQxICAvKiBGaXJzdCBwaG90b3RyYW5zaXN0b3IgYW1iaWVudCBsaWdodCBsZXZlbC1oaWdoIGJ5dGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQODg3MF9QSDJMRVZMCTB4NDIgIC8qIFNlY29uZCBwaG90b3RyYW5zaXN0b3IgYW1iaWVudCBsaWdodCBsZXZlbC1sb3cgYnl0ZSByZWdpc3RlciAqLworI2RlZmluZSBBRFA4ODcwX1BIMkxFVkgJMHg0MyAgLyogU2Vjb25kIHBob3RvdHJhbnNpc3RvciBhbWJpZW50IGxpZ2h0IGxldmVsLWhpZ2ggYnl0ZSByZWdpc3RlciAqLworCisjZGVmaW5lIEFEUDg4NzBfTUFOVUZJRAkJMHgzICAvKiBBbmFsb2cgRGV2aWNlcyBBRDg4NzAgTWFudWZhY3R1cmVyIGFuZCBkZXZpY2UgSUQgKi8KKyNkZWZpbmUgQURQODg3MF9ERVZJRCh4KQkoKHgpICYgMHhGKQorI2RlZmluZSBBRFA4ODcwX01BTklEKHgpCSgoeCkgPj4gNCkKKworLyogTURDUiBEZXZpY2UgbW9kZSBhbmQgc3RhdHVzICovCisjZGVmaW5lIEQ3QUxTRU4JCQkoMSA8PCA3KQorI2RlZmluZSBJTlRfQ0ZHCQkJKDEgPDwgNikKKyNkZWZpbmUgTlNUQlkJCQkoMSA8PCA1KQorI2RlZmluZSBESU1fRU4JCQkoMSA8PCA0KQorI2RlZmluZSBHRFdOX0RJUwkJKDEgPDwgMykKKyNkZWZpbmUgU0lTX0VOCQkJKDEgPDwgMikKKyNkZWZpbmUgQ01QX0FVVE9FTgkJKDEgPDwgMSkKKyNkZWZpbmUgQkxFTgkJCSgxIDw8IDApCisKKy8qIEFEUDg4NzBfQUxTMV9FTiBNYWluIEFMUyBjb21wYXJhdG9yIGxldmVsIGVuYWJsZSAqLworI2RlZmluZSBMNV9FTgkJCSgxIDw8IDMpCisjZGVmaW5lIEw0X0VOCQkJKDEgPDwgMikKKyNkZWZpbmUgTDNfRU4JCQkoMSA8PCAxKQorI2RlZmluZSBMMl9FTgkJCSgxIDw8IDApCisKKyNkZWZpbmUgQ0ZHUl9CTFZfU0hJRlQJCTMKKyNkZWZpbmUgQ0ZHUl9CTFZfTUFTSwkJMHg3CisjZGVmaW5lIEFEUDg4NzBfRkxBR19MRURfTUFTSwkweEZGCisKKyNkZWZpbmUgRkFERV9WQUwoaW4sIG91dCkJKCgweEYgJiAoaW4pKSB8ICgoMHhGICYgKG91dCkpIDw8IDQpKQorI2RlZmluZSBCTF9DRkdSX1ZBTChsYXcsIGJsdikJKCgoKGJsdikgJiBDRkdSX0JMVl9NQVNLKSA8PCBDRkdSX0JMVl9TSElGVCkgfCAoKDB4MyAmIChsYXcpKSA8PCAxKSkKKyNkZWZpbmUgQUxTX0NNUFJfQ0ZHX1ZBTChmaWx0KQkoKDB4NyAmIChmaWx0KSkgPDwgMSkKKworc3RydWN0IGFkcDg4NzBfYmwgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsOworCXN0cnVjdCBhZHA4ODcwX2xlZCAqbGVkOworCXN0cnVjdCBhZHA4ODcwX2JhY2tsaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl1bnNpZ25lZCBsb25nIGNhY2hlZF9kYXlsaWdodF9tYXg7CisJaW50IGlkOworCWludCByZXZpZDsKKwlpbnQgY3VycmVudF9icmlnaHRuZXNzOworfTsKKworc3RydWN0IGFkcDg4NzBfbGVkIHsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2CWNkZXY7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKwllbnVtIGxlZF9icmlnaHRuZXNzCW5ld19icmlnaHRuZXNzOworCWludAkJCWlkOworCWludAkJCWZsYWdzOworfTsKKworc3RhdGljIGludCBhZHA4ODcwX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHJlZywgdWludDhfdCAqdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHJlYWRpbmcgYXQgMHglMDJ4XG4iLCByZWcpOworCQlyZXR1cm4gcmV0OworCX0KKworCSp2YWwgPSByZXQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhZHA4ODcwX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsKQoreworCWludCByZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWwpOworCWlmIChyZXQpCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHdyaXRlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRwODg3MF9zZXRfYml0cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcmVnLCB1aW50OF90IGJpdF9tYXNrKQoreworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdWludDhfdCByZWdfdmFsOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldCA9IGFkcDg4NzBfcmVhZChjbGllbnQsIHJlZywgJnJlZ192YWwpOworCisJaWYgKCFyZXQgJiYgKChyZWdfdmFsICYgYml0X21hc2spID09IDApKSB7CisJCXJlZ192YWwgfD0gYml0X21hc2s7CisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCByZWcsIHJlZ192YWwpOworCX0KKworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZHA4ODcwX2Nscl9iaXRzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCByZWcsIHVpbnQ4X3QgYml0X21hc2spCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1aW50OF90IHJlZ192YWw7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCisJcmV0ID0gYWRwODg3MF9yZWFkKGNsaWVudCwgcmVnLCAmcmVnX3ZhbCk7CisKKwlpZiAoIXJldCAmJiAocmVnX3ZhbCAmIGJpdF9tYXNrKSkgeworCQlyZWdfdmFsICY9IH5iaXRfbWFzazsKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIHJlZywgcmVnX3ZhbCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSW5kZXBlbmRlbnQgc2luayAvIExFRAorICovCisjaWYgZGVmaW5lZChBRFA4ODcwX1VTRV9MRURTKQorc3RhdGljIHZvaWQgYWRwODg3MF9sZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFkcDg4NzBfbGVkICpsZWQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFkcDg4NzBfbGVkLCB3b3JrKTsKKwlhZHA4ODcwX3dyaXRlKGxlZC0+Y2xpZW50LCBBRFA4ODcwX0lTQzEgKyBsZWQtPmlkIC0gMSwKKwkJCSBsZWQtPm5ld19icmlnaHRuZXNzID4+IDEpOworfQorCitzdGF0aWMgdm9pZCBhZHA4ODcwX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkgICBlbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQoreworCXN0cnVjdCBhZHA4ODcwX2xlZCAqbGVkOworCisJbGVkID0gY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgYWRwODg3MF9sZWQsIGNkZXYpOworCWxlZC0+bmV3X2JyaWdodG5lc3MgPSB2YWx1ZTsKKwkvKgorCSAqIFVzZSB3b3JrcXVldWUgZm9yIElPIHNpbmNlIEkyQyBvcGVyYXRpb25zIGNhbiBzbGVlcC4KKwkgKi8KKwlzY2hlZHVsZV93b3JrKCZsZWQtPndvcmspOworfQorCitzdGF0aWMgaW50IGFkcDg4NzBfbGVkX3NldHVwKHN0cnVjdCBhZHA4ODcwX2xlZCAqbGVkKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBsZWQtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0lTQzEgKyBsZWQtPmlkIC0gMSwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkcDg4NzBfc2V0X2JpdHMoY2xpZW50LCBBRFA4ODcwX0lTQ0MsIDEgPDwgKGxlZC0+aWQgLSAxKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChsZWQtPmlkID4gNCkKKwkJcmV0ID0gYWRwODg3MF9zZXRfYml0cyhjbGllbnQsIEFEUDg4NzBfSVNDVDEsCisJCQkJKGxlZC0+ZmxhZ3MgJiAweDMpIDw8ICgobGVkLT5pZCAtIDUpICogMikpOworCWVsc2UKKwkJcmV0ID0gYWRwODg3MF9zZXRfYml0cyhjbGllbnQsIEFEUDg4NzBfSVNDVDIsCisJCQkJKGxlZC0+ZmxhZ3MgJiAweDMpIDw8ICgobGVkLT5pZCAtIDEpICogMikpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWRwODg3MF9sZWRfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWRwODg3MF9iYWNrbGlnaHRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQljbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGFkcDg4NzBfbGVkICpsZWQsICpsZWRfZGF0OworCXN0cnVjdCBsZWRfaW5mbyAqY3VyX2xlZDsKKwlpbnQgcmV0LCBpOworCisKKwlsZWQgPSBrY2FsbG9jKHBkYXRhLT5udW1fbGVkcywgc2l6ZW9mKCpsZWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAobGVkID09IE5VTEwpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gYWxsb2MgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfSVNDTEFXLCBwZGF0YS0+bGVkX2ZhZGVfbGF3KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCisJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfSVNDVDEsCisJCQkocGRhdGEtPmxlZF9vbl90aW1lICYgMHgzKSA8PCA2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCisJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfSVNDRiwKKwkJCUZBREVfVkFMKHBkYXRhLT5sZWRfZmFkZV9pbiwgcGRhdGEtPmxlZF9mYWRlX291dCkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9sZWRzOyArK2kpIHsKKwkJY3VyX2xlZCA9ICZwZGF0YS0+bGVkc1tpXTsKKwkJbGVkX2RhdCA9ICZsZWRbaV07CisKKwkJbGVkX2RhdC0+aWQgPSBjdXJfbGVkLT5mbGFncyAmIEFEUDg4NzBfRkxBR19MRURfTUFTSzsKKworCQlpZiAobGVkX2RhdC0+aWQgPiA3IHx8IGxlZF9kYXQtPmlkIDwgMSkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJbnZhbGlkIExFRCBJRCAlZFxuIiwKKwkJCQlsZWRfZGF0LT5pZCk7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWlmIChwZGF0YS0+YmxfbGVkX2Fzc2lnbiAmICgxIDw8IChsZWRfZGF0LT5pZCAtIDEpKSkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJMRUQgJWQgdXNlZCBieSBCYWNrbGlnaHRcbiIsCisJCQkJbGVkX2RhdC0+aWQpOworCQkJZ290byBlcnI7CisJCX0KKworCQlsZWRfZGF0LT5jZGV2Lm5hbWUgPSBjdXJfbGVkLT5uYW1lOworCQlsZWRfZGF0LT5jZGV2LmRlZmF1bHRfdHJpZ2dlciA9IGN1cl9sZWQtPmRlZmF1bHRfdHJpZ2dlcjsKKwkJbGVkX2RhdC0+Y2Rldi5icmlnaHRuZXNzX3NldCA9IGFkcDg4NzBfbGVkX3NldDsKKwkJbGVkX2RhdC0+Y2Rldi5icmlnaHRuZXNzID0gTEVEX09GRjsKKwkJbGVkX2RhdC0+ZmxhZ3MgPSBjdXJfbGVkLT5mbGFncyA+PiBGTEFHX09GRlRfU0hJRlQ7CisJCWxlZF9kYXQtPmNsaWVudCA9IGNsaWVudDsKKwkJbGVkX2RhdC0+bmV3X2JyaWdodG5lc3MgPSBMRURfT0ZGOworCQlJTklUX1dPUksoJmxlZF9kYXQtPndvcmssIGFkcDg4NzBfbGVkX3dvcmspOworCisJCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZsZWRfZGF0LT5jZGV2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgTEVEICVkXG4iLAorCQkJCWxlZF9kYXQtPmlkKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJcmV0ID0gYWRwODg3MF9sZWRfc2V0dXAobGVkX2RhdCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHdyaXRlXG4iKTsKKwkJCWkrKzsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJZGF0YS0+bGVkID0gbGVkOworCisJcmV0dXJuIDA7CisKKyBlcnI6CisJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgLS1pKSB7CisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZsZWRbaV0uY2Rldik7CisJCWNhbmNlbF93b3JrX3N5bmMoJmxlZFtpXS53b3JrKTsKKwl9CisKKyBlcnJfZnJlZToKKwlrZnJlZShsZWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWRwODg3MF9sZWRfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkcDg4NzBfYmFja2xpZ2h0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwkJY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fbGVkczsgaSsrKSB7CisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZkYXRhLT5sZWRbaV0uY2Rldik7CisJCWNhbmNlbF93b3JrX3N5bmMoJmRhdGEtPmxlZFtpXS53b3JrKTsKKwl9CisKKwlrZnJlZShkYXRhLT5sZWQpOworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkcDg4NzBfbGVkX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkcDg4NzBfbGVkX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYWRwODg3MF9ibF9zZXQoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsLCBpbnQgYnJpZ2h0bmVzcykKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGJsX2dldF9kYXRhKGJsKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJaWYgKGRhdGEtPnBkYXRhLT5lbl9hbWJsX3NlbnMpIHsKKwkJaWYgKChicmlnaHRuZXNzID4gMCkgJiYgKGJyaWdodG5lc3MgPCBBRFA4ODcwX01BWF9CUklHSFRORVNTKSkgeworCQkJLyogRGlzYWJsZSBBbWJpZW50IExpZ2h0IGF1dG8gYWRqdXN0ICovCisJCQlyZXQgPSBhZHA4ODcwX2Nscl9iaXRzKGNsaWVudCwgQURQODg3MF9NRENSLAorCQkJCQlDTVBfQVVUT0VOKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVgxLCBicmlnaHRuZXNzKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBNQVhfQlJJR0hUTkVTUyAtPiBFbmFibGUgQW1iaWVudCBMaWdodCBhdXRvIGFkanVzdAorCQkJICogcmVzdG9yZSBkYXlsaWdodCBsMSBzeXNmcyBicmlnaHRuZXNzCisJCQkgKi8KKwkJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVgxLAorCQkJCQkgZGF0YS0+Y2FjaGVkX2RheWxpZ2h0X21heCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKKwkJCXJldCA9IGFkcDg4NzBfc2V0X2JpdHMoY2xpZW50LCBBRFA4ODcwX01EQ1IsCisJCQkJCSBDTVBfQVVUT0VOKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVgxLCBicmlnaHRuZXNzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGRhdGEtPmN1cnJlbnRfYnJpZ2h0bmVzcyAmJiBicmlnaHRuZXNzID09IDApCisJCXJldCA9IGFkcDg4NzBfc2V0X2JpdHMoY2xpZW50LAorCQkJCUFEUDg4NzBfTURDUiwgRElNX0VOKTsKKwllbHNlIGlmIChkYXRhLT5jdXJyZW50X2JyaWdodG5lc3MgPT0gMCAmJiBicmlnaHRuZXNzKQorCQlyZXQgPSBhZHA4ODcwX2Nscl9iaXRzKGNsaWVudCwKKwkJCQlBRFA4ODcwX01EQ1IsIERJTV9FTik7CisKKwlpZiAoIXJldCkKKwkJZGF0YS0+Y3VycmVudF9icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRwODg3MF9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKK3sKKwlpbnQgYnJpZ2h0bmVzcyA9IGJsLT5wcm9wcy5icmlnaHRuZXNzOworCWlmIChibC0+cHJvcHMucG93ZXIgIT0gRkJfQkxBTktfVU5CTEFOSykKKwkJYnJpZ2h0bmVzcyA9IDA7CisKKwlpZiAoYmwtPnByb3BzLmZiX2JsYW5rICE9IEZCX0JMQU5LX1VOQkxBTkspCisJCWJyaWdodG5lc3MgPSAwOworCisJcmV0dXJuIGFkcDg4NzBfYmxfc2V0KGJsLCBicmlnaHRuZXNzKTsKK30KKworc3RhdGljIGludCBhZHA4ODcwX2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGJsX2dldF9kYXRhKGJsKTsKKworCXJldHVybiBkYXRhLT5jdXJyZW50X2JyaWdodG5lc3M7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBhZHA4ODcwX2JsX29wcyA9IHsKKwkudXBkYXRlX3N0YXR1cwk9IGFkcDg4NzBfYmxfdXBkYXRlX3N0YXR1cywKKwkuZ2V0X2JyaWdodG5lc3MJPSBhZHA4ODcwX2JsX2dldF9icmlnaHRuZXNzLAorfTsKKworc3RhdGljIGludCBhZHA4ODcwX2JsX3NldHVwKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGJsX2dldF9kYXRhKGJsKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCXN0cnVjdCBhZHA4ODcwX2JhY2tsaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCWludCByZXQgPSAwOworCisJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQkxTRUwsIH5wZGF0YS0+YmxfbGVkX2Fzc2lnbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX1BXTUxFRCwgcGRhdGEtPnB3bV9hc3NpZ24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTE1YMSwgcGRhdGEtPmwxX2RheWxpZ2h0X21heCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMRE0xLCBwZGF0YS0+bDFfZGF5bGlnaHRfZGltKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHBkYXRhLT5lbl9hbWJsX3NlbnMpIHsKKwkJZGF0YS0+Y2FjaGVkX2RheWxpZ2h0X21heCA9IHBkYXRhLT5sMV9kYXlsaWdodF9tYXg7CisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVgyLAorCQkJCQkJcGRhdGEtPmwyX2JyaWdodF9tYXgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQkxETTIsCisJCQkJCQlwZGF0YS0+bDJfYnJpZ2h0X2RpbSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVgzLAorCQkJCQkJcGRhdGEtPmwzX29mZmljZV9tYXgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQkxETTMsCisJCQkJCQlwZGF0YS0+bDNfb2ZmaWNlX2RpbSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMTVg0LAorCQkJCQkJcGRhdGEtPmw0X2luZG9vcl9tYXgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTERNNCwKKwkJCQkJCXBkYXRhLT5sNF9pbmRvcl9kaW0pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9CTE1YNSwKKwkJCQkJCXBkYXRhLT5sNV9kYXJrX21heCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMRE01LAorCQkJCQkJcGRhdGEtPmw1X2RhcmtfZGltKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDJUUlAsIHBkYXRhLT5sMl90cmlwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDJIWVMsIHBkYXRhLT5sMl9oeXN0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDNUUlAsIHBkYXRhLT5sM190cmlwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDNIWVMsIHBkYXRhLT5sM19oeXN0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDRUUlAsIHBkYXRhLT5sNF90cmlwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDRIWVMsIHBkYXRhLT5sNF9oeXN0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDVUUlAsIHBkYXRhLT5sNV90cmlwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfTDVIWVMsIHBkYXRhLT5sNV9oeXN0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQUxTMV9FTiwgTDVfRU4gfCBMNF9FTiB8CisJCQkJCQlMM19FTiB8IEwyX0VOKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYWRwODg3MF93cml0ZShjbGllbnQsIEFEUDg4NzBfQ01QX0NUTCwKKwkJCUFMU19DTVBSX0NGR19WQUwocGRhdGEtPmFibWxfZmlsdCkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBhZHA4ODcwX3dyaXRlKGNsaWVudCwgQURQODg3MF9DRkdSLAorCQkJQkxfQ0ZHUl9WQUwocGRhdGEtPmJsX2ZhZGVfbGF3LCAwKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkcDg4NzBfd3JpdGUoY2xpZW50LCBBRFA4ODcwX0JMRlIsIEZBREVfVkFMKHBkYXRhLT5ibF9mYWRlX2luLAorCQkJcGRhdGEtPmJsX2ZhZGVfb3V0KSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkvKgorCSAqIEFEUDg4NzAgUmV2MCByZXF1aXJlcyBHRFdOX0RJUyBiaXQgc2V0CisJICovCisKKwlyZXQgPSBhZHA4ODcwX3NldF9iaXRzKGNsaWVudCwgQURQODg3MF9NRENSLCBCTEVOIHwgRElNX0VOIHwgTlNUQlkgfAorCQkJKGRhdGEtPnJldmlkID09IDAgPyBHRFdOX0RJUyA6IDApKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnJvcjsKKwl1aW50OF90IHJlZ192YWw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwllcnJvciA9IGFkcDg4NzBfcmVhZChkYXRhLT5jbGllbnQsIHJlZywgJnJlZ192YWwpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcmVnX3ZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBpbnQgcmVnKQoreworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlhZHA4ODcwX3dyaXRlKGRhdGEtPmNsaWVudCwgcmVnLCB2YWwpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDVfZGFya19tYXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDg4NzBfc2hvdyhkZXYsIGJ1ZiwgQURQODg3MF9CTE1YNSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDVfZGFya19tYXhfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGFkcDg4NzBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA4ODcwX0JMTVg1KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihsNV9kYXJrX21heCwgMDY2NCwgYWRwODg3MF9ibF9sNV9kYXJrX21heF9zaG93LAorCQkJYWRwODg3MF9ibF9sNV9kYXJrX21heF9zdG9yZSk7CisKKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sNF9pbmRvb3JfbWF4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxNWDQpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2w0X2luZG9vcl9tYXhfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGFkcDg4NzBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA4ODcwX0JMTVg0KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihsNF9pbmRvb3JfbWF4LCAwNjY0LCBhZHA4ODcwX2JsX2w0X2luZG9vcl9tYXhfc2hvdywKKwkJCWFkcDg4NzBfYmxfbDRfaW5kb29yX21heF9zdG9yZSk7CisKKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sM19vZmZpY2VfbWF4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWRwODg3MF9zaG93KGRldiwgYnVmLCBBRFA4ODcwX0JMTVgzKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sM19vZmZpY2VfbWF4X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTE1YMyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihsM19vZmZpY2VfbWF4LCAwNjY0LCBhZHA4ODcwX2JsX2wzX29mZmljZV9tYXhfc2hvdywKKwkJCWFkcDg4NzBfYmxfbDNfb2ZmaWNlX21heF9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDJfYnJpZ2h0X21heF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWRwODg3MF9zaG93KGRldiwgYnVmLCBBRFA4ODcwX0JMTVgyKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sMl9icmlnaHRfbWF4X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTE1YMik7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDJfYnJpZ2h0X21heCwgMDY2NCwgYWRwODg3MF9ibF9sMl9icmlnaHRfbWF4X3Nob3csCisJCQlhZHA4ODcwX2JsX2wyX2JyaWdodF9tYXhfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wxX2RheWxpZ2h0X21heF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDg4NzBfc2hvdyhkZXYsIGJ1ZiwgQURQODg3MF9CTE1YMSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDFfZGF5bGlnaHRfbWF4X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhLT5jYWNoZWRfZGF5bGlnaHRfbWF4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGFkcDg4NzBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA4ODcwX0JMTVgxKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihsMV9kYXlsaWdodF9tYXgsIDA2NjQsIGFkcDg4NzBfYmxfbDFfZGF5bGlnaHRfbWF4X3Nob3csCisJCQlhZHA4ODcwX2JsX2wxX2RheWxpZ2h0X21heF9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDVfZGFya19kaW1fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxETTUpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2w1X2RhcmtfZGltX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGFkcDg4NzBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA4ODcwX0JMRE01KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihsNV9kYXJrX2RpbSwgMDY2NCwgYWRwODg3MF9ibF9sNV9kYXJrX2RpbV9zaG93LAorCQkJYWRwODg3MF9ibF9sNV9kYXJrX2RpbV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDRfaW5kb29yX2RpbV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDg4NzBfc2hvdyhkZXYsIGJ1ZiwgQURQODg3MF9CTERNNCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDRfaW5kb29yX2RpbV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTERNNCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDRfaW5kb29yX2RpbSwgMDY2NCwgYWRwODg3MF9ibF9sNF9pbmRvb3JfZGltX3Nob3csCisJCQlhZHA4ODcwX2JsX2w0X2luZG9vcl9kaW1fc3RvcmUpOworCisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDNfb2ZmaWNlX2RpbV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGFkcDg4NzBfc2hvdyhkZXYsIGJ1ZiwgQURQODg3MF9CTERNMyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfbDNfb2ZmaWNlX2RpbV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTERNMyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDNfb2ZmaWNlX2RpbSwgMDY2NCwgYWRwODg3MF9ibF9sM19vZmZpY2VfZGltX3Nob3csCisJCQlhZHA4ODcwX2JsX2wzX29mZmljZV9kaW1fc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wyX2JyaWdodF9kaW1fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxETTIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wyX2JyaWdodF9kaW1fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gYWRwODg3MF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIEFEUDg4NzBfQkxETTIpOworfQorc3RhdGljIERFVklDRV9BVFRSKGwyX2JyaWdodF9kaW0sIDA2NjQsIGFkcDg4NzBfYmxfbDJfYnJpZ2h0X2RpbV9zaG93LAorCQkJYWRwODg3MF9ibF9sMl9icmlnaHRfZGltX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgYWRwODg3MF9ibF9sMV9kYXlsaWdodF9kaW1fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBhZHA4ODcwX3Nob3coZGV2LCBidWYsIEFEUDg4NzBfQkxETTEpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHA4ODcwX2JsX2wxX2RheWxpZ2h0X2RpbV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBhZHA4ODcwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQODg3MF9CTERNMSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobDFfZGF5bGlnaHRfZGltLCAwNjY0LCBhZHA4ODcwX2JsX2wxX2RheWxpZ2h0X2RpbV9zaG93LAorCQkJYWRwODg3MF9ibF9sMV9kYXlsaWdodF9kaW1fc3RvcmUpOworCisjaWZkZWYgQURQODg3MF9FWFRfRkVBVFVSRVMKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfYW1iaWVudF9saWdodF9sZXZlbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyb3I7CisJdWludDhfdCByZWdfdmFsOworCXVpbnQxNl90IHJldF92YWw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwllcnJvciA9IGFkcDg4NzBfcmVhZChkYXRhLT5jbGllbnQsIEFEUDg4NzBfUEgxTEVWTCwgJnJlZ192YWwpOworCWlmIChlcnJvciA8IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlyZXRfdmFsID0gcmVnX3ZhbDsKKwllcnJvciA9IGFkcDg4NzBfcmVhZChkYXRhLT5jbGllbnQsIEFEUDg4NzBfUEgxTEVWSCwgJnJlZ192YWwpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKiBSZXR1cm4gMTMtYml0IGNvbnZlcnNpb24gdmFsdWUgZm9yIHRoZSBmaXJzdCBsaWdodCBzZW5zb3IgKi8KKwlyZXRfdmFsICs9IChyZWdfdmFsICYgMHgxRikgPDwgODsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCByZXRfdmFsKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihhbWJpZW50X2xpZ2h0X2xldmVsLCAwNDQ0LAorCQlhZHA4ODcwX2JsX2FtYmllbnRfbGlnaHRfbGV2ZWxfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfYW1iaWVudF9saWdodF96b25lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnJvcjsKKwl1aW50OF90IHJlZ192YWw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwllcnJvciA9IGFkcDg4NzBfcmVhZChkYXRhLT5jbGllbnQsIEFEUDg4NzBfQ0ZHUiwgJnJlZ192YWwpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwKKwkJKChyZWdfdmFsID4+IENGR1JfQkxWX1NISUZUKSAmIENGR1JfQkxWX01BU0spICsgMSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkcDg4NzBfYmxfYW1iaWVudF9saWdodF96b25lX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFkcDg4NzBfYmwgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwl1aW50OF90IHJlZ192YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsID09IDApIHsKKwkJLyogRW5hYmxlIGF1dG9tYXRpYyBhbWJpZW50IGxpZ2h0IHNlbnNpbmcgKi8KKwkJYWRwODg3MF9zZXRfYml0cyhkYXRhLT5jbGllbnQsIEFEUDg4NzBfTURDUiwgQ01QX0FVVE9FTik7CisJfSBlbHNlIGlmICgodmFsID4gMCkgJiYgKHZhbCA8IDYpKSB7CisJCS8qIERpc2FibGUgYXV0b21hdGljIGFtYmllbnQgbGlnaHQgc2Vuc2luZyAqLworCQlhZHA4ODcwX2Nscl9iaXRzKGRhdGEtPmNsaWVudCwgQURQODg3MF9NRENSLCBDTVBfQVVUT0VOKTsKKworCQkvKiBTZXQgdXNlciBzdXBwbGllZCBhbWJpZW50IGxpZ2h0IHpvbmUgKi8KKwkJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJCWFkcDg4NzBfcmVhZChkYXRhLT5jbGllbnQsIEFEUDg4NzBfQ0ZHUiwgJnJlZ192YWwpOworCQlyZWdfdmFsICY9IH4oQ0ZHUl9CTFZfTUFTSyA8PCBDRkdSX0JMVl9TSElGVCk7CisJCXJlZ192YWwgfD0gKHZhbCAtIDEpIDw8IENGR1JfQkxWX1NISUZUOworCQlhZHA4ODcwX3dyaXRlKGRhdGEtPmNsaWVudCwgQURQODg3MF9DRkdSLCByZWdfdmFsKTsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYW1iaWVudF9saWdodF96b25lLCAwNjY0LAorCQlhZHA4ODcwX2JsX2FtYmllbnRfbGlnaHRfem9uZV9zaG93LAorCQlhZHA4ODcwX2JsX2FtYmllbnRfbGlnaHRfem9uZV9zdG9yZSk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkcDg4NzBfYmxfYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9sNV9kYXJrX21heC5hdHRyLAorCSZkZXZfYXR0cl9sNV9kYXJrX2RpbS5hdHRyLAorCSZkZXZfYXR0cl9sNF9pbmRvb3JfbWF4LmF0dHIsCisJJmRldl9hdHRyX2w0X2luZG9vcl9kaW0uYXR0ciwKKwkmZGV2X2F0dHJfbDNfb2ZmaWNlX21heC5hdHRyLAorCSZkZXZfYXR0cl9sM19vZmZpY2VfZGltLmF0dHIsCisJJmRldl9hdHRyX2wyX2JyaWdodF9tYXguYXR0ciwKKwkmZGV2X2F0dHJfbDJfYnJpZ2h0X2RpbS5hdHRyLAorCSZkZXZfYXR0cl9sMV9kYXlsaWdodF9tYXguYXR0ciwKKwkmZGV2X2F0dHJfbDFfZGF5bGlnaHRfZGltLmF0dHIsCisjaWZkZWYgQURQODg3MF9FWFRfRkVBVFVSRVMKKwkmZGV2X2F0dHJfYW1iaWVudF9saWdodF9sZXZlbC5hdHRyLAorCSZkZXZfYXR0cl9hbWJpZW50X2xpZ2h0X3pvbmUuYXR0ciwKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkcDg4NzBfYmxfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZHA4ODcwX2JsX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHA4ODcwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJvcHM7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsOworCXN0cnVjdCBhZHA4ODcwX2JsICpkYXRhOworCXN0cnVjdCBhZHA4ODcwX2JhY2tsaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJCWNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdWludDhfdCByZWdfdmFsOworCWludCByZXQ7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCQkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlNNQlVTIEJ5dGUgRGF0YSBub3QgU3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGE/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gYWRwODg3MF9yZWFkKGNsaWVudCwgQURQODg3MF9NRkRWSUQsICZyZWdfdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoQURQODg3MF9NQU5JRChyZWdfdmFsKSAhPSBBRFA4ODcwX01BTlVGSUQpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcHJvYmVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEtPnJldmlkID0gQURQODg3MF9ERVZJRChyZWdfdmFsKTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJZGF0YS0+cGRhdGEgPSBwZGF0YTsKKwlkYXRhLT5pZCA9IGlkLT5kcml2ZXJfZGF0YTsKKwlkYXRhLT5jdXJyZW50X2JyaWdodG5lc3MgPSAwOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCisJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CisKKwltZW1zZXQoJnByb3BzLCAwLCBzaXplb2YocHJvcHMpKTsKKwlwcm9wcy50eXBlID0gQkFDS0xJR0hUX1JBVzsKKwlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IHByb3BzLmJyaWdodG5lc3MgPSBBRFA4ODcwX01BWF9CUklHSFRORVNTOworCWJsID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihkZXZfZHJpdmVyX3N0cmluZygmY2xpZW50LT5kZXYpLAorCQkJJmNsaWVudC0+ZGV2LCBkYXRhLCAmYWRwODg3MF9ibF9vcHMsICZwcm9wcyk7CisJaWYgKElTX0VSUihibCkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgYmFja2xpZ2h0XG4iKTsKKwkJcmV0ID0gUFRSX0VSUihibCk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlkYXRhLT5ibCA9IGJsOworCisJaWYgKHBkYXRhLT5lbl9hbWJsX3NlbnMpCisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmYmwtPmRldi5rb2JqLAorCQkJJmFkcDg4NzBfYmxfYXR0cl9ncm91cCk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHN5c2ZzXG4iKTsKKwkJZ290byBvdXQxOworCX0KKworCXJldCA9IGFkcDg4NzBfYmxfc2V0dXAoYmwpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmwpOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiUmV2LiVkIEJhY2tsaWdodFxuIiwgZGF0YS0+cmV2aWQpOworCisJaWYgKHBkYXRhLT5udW1fbGVkcykKKwkJYWRwODg3MF9sZWRfcHJvYmUoY2xpZW50KTsKKworCXJldHVybiAwOworCitvdXQ6CisJaWYgKGRhdGEtPnBkYXRhLT5lbl9hbWJsX3NlbnMpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGF0YS0+YmwtPmRldi5rb2JqLAorCQkJJmFkcDg4NzBfYmxfYXR0cl9ncm91cCk7CitvdXQxOgorCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihibCk7CitvdXQyOgorCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWRwODg3MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWRwODg3MF9ibCAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJYWRwODg3MF9jbHJfYml0cyhjbGllbnQsIEFEUDg4NzBfTURDUiwgTlNUQlkpOworCisJaWYgKGRhdGEtPmxlZCkKKwkJYWRwODg3MF9sZWRfcmVtb3ZlKGNsaWVudCk7CisKKwlpZiAoZGF0YS0+cGRhdGEtPmVuX2FtYmxfc2VucykKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkYXRhLT5ibC0+ZGV2LmtvYmosCisJCQkmYWRwODg3MF9ibF9hdHRyX2dyb3VwKTsKKworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5ibCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhZHA4ODcwX2kyY19zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCWFkcDg4NzBfY2xyX2JpdHMoY2xpZW50LCBBRFA4ODcwX01EQ1IsIE5TVEJZKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkcDg4NzBfaTJjX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWFkcDg4NzBfc2V0X2JpdHMoY2xpZW50LCBBRFA4ODcwX01EQ1IsIE5TVEJZKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYWRwODg3MF9pMmNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGFkcDg4NzBfaTJjX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkcDg4NzBfaWRbXSA9IHsKKwl7ICJhZHA4ODcwIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZHA4ODcwX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkcDg4NzBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJfSwKKwkucHJvYmUgICAgPSBhZHA4ODcwX3Byb2JlLAorCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGFkcDg4NzBfcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IGFkcDg4NzBfaTJjX3N1c3BlbmQsCisJLnJlc3VtZSAgPSBhZHA4ODcwX2kyY19yZXN1bWUsCisJLmlkX3RhYmxlID0gYWRwODg3MF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkcDg4NzBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWRwODg3MF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRwODg3MF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFkcDg4NzBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZHA4ODcwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZHA4ODcwX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRFA4ODcwIEJhY2tsaWdodCBkcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YWRwODg3MC1iYWNrbGlnaHQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FtczM2OWZnMDYuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FtczM2OWZnMDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjBhNDkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYW1zMzY5ZmcwNi5jCkBAIC0wLDAgKzEsNjQ2IEBACisvKgorICogYW1zMzY5ZmcwNiBBTU9MRUQgTENEIHBhbmVsIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogSmluZ29vIEhhbiAgPGpnMS5oYW5Ac2Ftc3VuZy5jb20+CisgKgorICogRGVyaXZlZCBmcm9tIGRyaXZlcnMvdmlkZW8vczZlNjNtMC5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9sY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKworI2RlZmluZSBTTEVFUE1TRUMJCTB4MTAwMAorI2RlZmluZSBFTkRERUYJCQkweDIwMDAKKyNkZWZpbmUJREVGTUFTSwkJCTB4RkYwMAorI2RlZmluZSBDT01NQU5EX09OTFkJCTB4RkUKKyNkZWZpbmUgREFUQV9PTkxZCQkweEZGCisKKyNkZWZpbmUgTUFYX0dBTU1BX0xFVkVMCQk1CisjZGVmaW5lIEdBTU1BX1RBQkxFX0NPVU5UCTIxCisKKyNkZWZpbmUgTUlOX0JSSUdIVE5FU1MJCTAKKyNkZWZpbmUgTUFYX0JSSUdIVE5FU1MJCTI1NQorI2RlZmluZSBERUZBVUxUX0JSSUdIVE5FU1MJMTUwCisKK3N0cnVjdCBhbXMzNjlmZzA2IHsKKwlzdHJ1Y3QgZGV2aWNlCQkJKmRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKKwl1bnNpZ25lZCBpbnQJCQlwb3dlcjsKKwlzdHJ1Y3QgbGNkX2RldmljZQkJKmxkOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlCQkqYmQ7CisJc3RydWN0IGxjZF9wbGF0Zm9ybV9kYXRhCSpsY2RfcGQ7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX2Rpc3BsYXlfb25bXSA9IHsKKwkweDE0LCAweDAzLAorCUVORERFRiwgMHgwMDAwCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX2Rpc3BsYXlfb2ZmW10gPSB7CisJMHgxNCwgMHgwMCwKKwlFTkRERUYsIDB4MDAwMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9zdGFuZF9ieV9vbltdID0geworCTB4MUQsIDB4QTEsCisJU0xFRVBNU0VDLCAyMDAsCisJRU5EREVGLCAweDAwMDAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzZXFfc3RhbmRfYnlfb2ZmW10gPSB7CisJMHgxRCwgMHhBMCwKKwlTTEVFUE1TRUMsIDI1MCwKKwlFTkRERUYsIDB4MDAwMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9zZXR0aW5nW10gPSB7CisJMHgzMSwgMHgwOCwKKwkweDMyLCAweDE0LAorCTB4MzAsIDB4MDIsCisJMHgyNywgMHgwMSwKKwkweDEyLCAweDA4LAorCTB4MTMsIDB4MDgsCisJMHgxNSwgMHgwMCwKKwkweDE2LCAweDAwLAorCisJMHhlZiwgMHhkMCwKKwlEQVRBX09OTFksIDB4ZTgsCisKKwkweDM5LCAweDQ0LAorCTB4NDAsIDB4MDAsCisJMHg0MSwgMHgzZiwKKwkweDQyLCAweDJhLAorCTB4NDMsIDB4MjcsCisJMHg0NCwgMHgyNywKKwkweDQ1LCAweDFmLAorCTB4NDYsIDB4NDQsCisJMHg1MCwgMHgwMCwKKwkweDUxLCAweDAwLAorCTB4NTIsIDB4MTcsCisJMHg1MywgMHgyNCwKKwkweDU0LCAweDI2LAorCTB4NTUsIDB4MWYsCisJMHg1NiwgMHg0MywKKwkweDYwLCAweDAwLAorCTB4NjEsIDB4M2YsCisJMHg2MiwgMHgyYSwKKwkweDYzLCAweDI1LAorCTB4NjQsIDB4MjQsCisJMHg2NSwgMHgxYiwKKwkweDY2LCAweDVjLAorCisJMHgxNywgMHgyMiwKKwkweDE4LCAweDMzLAorCTB4MTksIDB4MDMsCisJMHgxYSwgMHgwMSwKKwkweDIyLCAweGE0LAorCTB4MjMsIDB4MDAsCisJMHgyNiwgMHhhMCwKKworCTB4MWQsIDB4YTAsCisJU0xFRVBNU0VDLCAzMDAsCisKKwkweDE0LCAweDAzLAorCisJRU5EREVGLCAweDAwMDAKK307CisKKy8qIGdhbW1hIHZhbHVlOiAyLjIgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYW1zMzY5ZmcwNl8yMl8yNTBbXSA9IHsKKwkweDAwLCAweDNmLCAweDJhLCAweDI3LCAweDI3LCAweDFmLCAweDQ0LAorCTB4MDAsIDB4MDAsIDB4MTcsIDB4MjQsIDB4MjYsIDB4MWYsIDB4NDMsCisJMHgwMCwgMHgzZiwgMHgyYSwgMHgyNSwgMHgyNCwgMHgxYiwgMHg1YywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYW1zMzY5ZmcwNl8yMl8yMDBbXSA9IHsKKwkweDAwLCAweDNmLCAweDI4LCAweDI5LCAweDI3LCAweDIxLCAweDNlLAorCTB4MDAsIDB4MDAsIDB4MTAsIDB4MjUsIDB4MjcsIDB4MjAsIDB4M2QsCisJMHgwMCwgMHgzZiwgMHgyOCwgMHgyNywgMHgyNSwgMHgxZCwgMHg1MywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYW1zMzY5ZmcwNl8yMl8xNTBbXSA9IHsKKwkweDAwLCAweDNmLCAweDJkLCAweDI5LCAweDI4LCAweDIzLCAweDM3LAorCTB4MDAsIDB4MDAsIDB4MGIsIDB4MjUsIDB4MjgsIDB4MjIsIDB4MzYsCisJMHgwMCwgMHgzZiwgMHgyYiwgMHgyOCwgMHgyNiwgMHgxZiwgMHg0YSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYW1zMzY5ZmcwNl8yMl8xMDBbXSA9IHsKKwkweDAwLCAweDNmLCAweDMwLCAweDJhLCAweDJiLCAweDI0LCAweDJmLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjksIDB4MjQsIDB4MmUsCisJMHgwMCwgMHgzZiwgMHgyZiwgMHgyOSwgMHgyOSwgMHgyMSwgMHgzZiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYW1zMzY5ZmcwNl8yMl81MFtdID0geworCTB4MDAsIDB4M2YsIDB4M2MsIDB4MmMsIDB4MmQsIDB4MjcsIDB4MjQsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyYSwgMHgyNywgMHgyMywKKwkweDAwLCAweDNmLCAweDNiLCAweDJjLCAweDJiLCAweDI0LCAweDMxLAorfTsKKworc3RydWN0IGFtczM2OWZnMDZfZ2FtbWEgeworCXVuc2lnbmVkIGludCAqZ2FtbWFfMjJfdGFibGVbTUFYX0dBTU1BX0xFVkVMXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYW1zMzY5ZmcwNl9nYW1tYSBnYW1tYV90YWJsZSA9IHsKKwkuZ2FtbWFfMjJfdGFibGVbMF0gPSAodW5zaWduZWQgaW50ICopJmFtczM2OWZnMDZfMjJfNTAsCisJLmdhbW1hXzIyX3RhYmxlWzFdID0gKHVuc2lnbmVkIGludCAqKSZhbXMzNjlmZzA2XzIyXzEwMCwKKwkuZ2FtbWFfMjJfdGFibGVbMl0gPSAodW5zaWduZWQgaW50ICopJmFtczM2OWZnMDZfMjJfMTUwLAorCS5nYW1tYV8yMl90YWJsZVszXSA9ICh1bnNpZ25lZCBpbnQgKikmYW1zMzY5ZmcwNl8yMl8yMDAsCisJLmdhbW1hXzIyX3RhYmxlWzRdID0gKHVuc2lnbmVkIGludCAqKSZhbXMzNjlmZzA2XzIyXzI1MCwKK307CisKK3N0YXRpYyBpbnQgYW1zMzY5ZmcwNl9zcGlfd3JpdGVfYnl0ZShzdHJ1Y3QgYW1zMzY5ZmcwNiAqbGNkLCBpbnQgYWRkciwgaW50IGRhdGEpCit7CisJdTE2IGJ1ZlsxXTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyID0geworCQkubGVuCQk9IDIsCisJCS50eF9idWYJCT0gYnVmLAorCX07CisKKwlidWZbMF0gPSAoYWRkciA8PCA4KSB8IGRhdGE7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKworCXJldHVybiBzcGlfc3luYyhsY2QtPnNwaSwgJm1zZyk7Cit9CisKK3N0YXRpYyBpbnQgYW1zMzY5ZmcwNl9zcGlfd3JpdGUoc3RydWN0IGFtczM2OWZnMDYgKmxjZCwgdW5zaWduZWQgY2hhciBhZGRyZXNzLAorCXVuc2lnbmVkIGNoYXIgY29tbWFuZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChhZGRyZXNzICE9IERBVEFfT05MWSkKKwkJcmV0ID0gYW1zMzY5ZmcwNl9zcGlfd3JpdGVfYnl0ZShsY2QsIDB4NzAsIGFkZHJlc3MpOworCWlmIChjb21tYW5kICE9IENPTU1BTkRfT05MWSkKKwkJcmV0ID0gYW1zMzY5ZmcwNl9zcGlfd3JpdGVfYnl0ZShsY2QsIDB4NzIsIGNvbW1hbmQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbXMzNjlmZzA2X3BhbmVsX3NlbmRfc2VxdWVuY2Uoc3RydWN0IGFtczM2OWZnMDYgKmxjZCwKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqd2J1ZikKK3sKKwlpbnQgcmV0ID0gMCwgaSA9IDA7CisKKwl3aGlsZSAoKHdidWZbaV0gJiBERUZNQVNLKSAhPSBFTkRERUYpIHsKKwkJaWYgKCh3YnVmW2ldICYgREVGTUFTSykgIT0gU0xFRVBNU0VDKSB7CisJCQlyZXQgPSBhbXMzNjlmZzA2X3NwaV93cml0ZShsY2QsIHdidWZbaV0sIHdidWZbaSsxXSk7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQl9IGVsc2UKKwkJCW1kZWxheSh3YnVmW2krMV0pOworCQlpICs9IDI7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfYW1zMzY5ZmcwNl9nYW1tYV9jdGwoc3RydWN0IGFtczM2OWZnMDYgKmxjZCwKKwljb25zdCB1bnNpZ25lZCBpbnQgKmdhbW1hKQoreworCXVuc2lnbmVkIGludCBpID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaSA9IDAgOyBpIDwgR0FNTUFfVEFCTEVfQ09VTlQgLyAzOyBpKyspIHsKKwkJcmV0ID0gYW1zMzY5ZmcwNl9zcGlfd3JpdGUobGNkLCAweDQwICsgaSwgZ2FtbWFbaV0pOworCQlyZXQgPSBhbXMzNjlmZzA2X3NwaV93cml0ZShsY2QsIDB4NTAgKyBpLCBnYW1tYVtpKzcqMV0pOworCQlyZXQgPSBhbXMzNjlmZzA2X3NwaV93cml0ZShsY2QsIDB4NjAgKyBpLCBnYW1tYVtpKzcqMl0pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGxjZC0+ZGV2LCAiZmFpbGVkIHRvIHNldCBnYW1tYSB0YWJsZS5cbiIpOworCQkJZ290byBnYW1tYV9lcnI7CisJCX0KKwl9CisKK2dhbW1hX2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtczM2OWZnMDZfZ2FtbWFfY3RsKHN0cnVjdCBhbXMzNjlmZzA2ICpsY2QsIGludCBicmlnaHRuZXNzKQoreworCWludCByZXQgPSAwOworCWludCBnYW1tYSA9IDA7CisKKwlpZiAoKGJyaWdodG5lc3MgPj0gMCkgJiYgKGJyaWdodG5lc3MgPD0gNTApKQorCQlnYW1tYSA9IDA7CisJZWxzZSBpZiAoKGJyaWdodG5lc3MgPiA1MCkgJiYgKGJyaWdodG5lc3MgPD0gMTAwKSkKKwkJZ2FtbWEgPSAxOworCWVsc2UgaWYgKChicmlnaHRuZXNzID4gMTAwKSAmJiAoYnJpZ2h0bmVzcyA8PSAxNTApKQorCQlnYW1tYSA9IDI7CisJZWxzZSBpZiAoKGJyaWdodG5lc3MgPiAxNTApICYmIChicmlnaHRuZXNzIDw9IDIwMCkpCisJCWdhbW1hID0gMzsKKwllbHNlIGlmICgoYnJpZ2h0bmVzcyA+IDIwMCkgJiYgKGJyaWdodG5lc3MgPD0gMjU1KSkKKwkJZ2FtbWEgPSA0OworCisJcmV0ID0gX2FtczM2OWZnMDZfZ2FtbWFfY3RsKGxjZCwgZ2FtbWFfdGFibGUuZ2FtbWFfMjJfdGFibGVbZ2FtbWFdKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1zMzY5ZmcwNl9sZGlfaW5pdChzdHJ1Y3QgYW1zMzY5ZmcwNiAqbGNkKQoreworCWludCByZXQsIGk7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0ICppbml0X3NlcVtdID0geworCQlzZXFfc2V0dGluZywKKwkJc2VxX3N0YW5kX2J5X29mZiwKKwl9OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdF9zZXEpOyBpKyspIHsKKwkJcmV0ID0gYW1zMzY5ZmcwNl9wYW5lbF9zZW5kX3NlcXVlbmNlKGxjZCwgaW5pdF9zZXFbaV0pOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbXMzNjlmZzA2X2xkaV9lbmFibGUoc3RydWN0IGFtczM2OWZnMDYgKmxjZCkKK3sKKwlpbnQgcmV0LCBpOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCAqaW5pdF9zZXFbXSA9IHsKKwkJc2VxX3N0YW5kX2J5X29mZiwKKwkJc2VxX2Rpc3BsYXlfb24sCisJfTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGluaXRfc2VxKTsgaSsrKSB7CisJCXJldCA9IGFtczM2OWZnMDZfcGFuZWxfc2VuZF9zZXF1ZW5jZShsY2QsIGluaXRfc2VxW2ldKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1zMzY5ZmcwNl9sZGlfZGlzYWJsZShzdHJ1Y3QgYW1zMzY5ZmcwNiAqbGNkKQoreworCWludCByZXQsIGk7CisKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgKmluaXRfc2VxW10gPSB7CisJCXNlcV9kaXNwbGF5X29mZiwKKwkJc2VxX3N0YW5kX2J5X29uLAorCX07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbml0X3NlcSk7IGkrKykgeworCQlyZXQgPSBhbXMzNjlmZzA2X3BhbmVsX3NlbmRfc2VxdWVuY2UobGNkLCBpbml0X3NlcVtpXSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtczM2OWZnMDZfcG93ZXJfaXNfb24oaW50IHBvd2VyKQoreworCXJldHVybiAoKHBvd2VyKSA8PSBGQl9CTEFOS19OT1JNQUwpOworfQorCitzdGF0aWMgaW50IGFtczM2OWZnMDZfcG93ZXJfb24oc3RydWN0IGFtczM2OWZnMDYgKmxjZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbGNkX3BsYXRmb3JtX2RhdGEgKnBkID0gTlVMTDsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSBOVUxMOworCisJcGQgPSBsY2QtPmxjZF9wZDsKKwlpZiAoIXBkKSB7CisJCWRldl9lcnIobGNkLT5kZXYsICJwbGF0Zm9ybSBkYXRhIGlzIE5VTEwuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJYmQgPSBsY2QtPmJkOworCWlmICghYmQpIHsKKwkJZGV2X2VycihsY2QtPmRldiwgImJhY2tsaWdodCBkZXZpY2UgaXMgTlVMTC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoIXBkLT5wb3dlcl9vbikgeworCQlkZXZfZXJyKGxjZC0+ZGV2LCAicG93ZXJfb24gaXMgTlVMTC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9IGVsc2UgeworCQlwZC0+cG93ZXJfb24obGNkLT5sZCwgMSk7CisJCW1kZWxheShwZC0+cG93ZXJfb25fZGVsYXkpOworCX0KKworCWlmICghcGQtPnJlc2V0KSB7CisJCWRldl9lcnIobGNkLT5kZXYsICJyZXNldCBpcyBOVUxMLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSB7CisJCXBkLT5yZXNldChsY2QtPmxkKTsKKwkJbWRlbGF5KHBkLT5yZXNldF9kZWxheSk7CisJfQorCisJcmV0ID0gYW1zMzY5ZmcwNl9sZGlfaW5pdChsY2QpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihsY2QtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGxkaS5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGFtczM2OWZnMDZfbGRpX2VuYWJsZShsY2QpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihsY2QtPmRldiwgImZhaWxlZCB0byBlbmFibGUgbGRpLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2V0IGJyaWdodG5lc3MgdG8gY3VycmVudCB2YWx1ZSBhZnRlciBwb3dlciBvbiBvciByZXN1bWUuICovCisJcmV0ID0gYW1zMzY5ZmcwNl9nYW1tYV9jdGwobGNkLCBiZC0+cHJvcHMuYnJpZ2h0bmVzcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGxjZC0+ZGV2LCAibGNkIGdhbW1hIHNldHRpbmcgZmFpbGVkLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1zMzY5ZmcwNl9wb3dlcl9vZmYoc3RydWN0IGFtczM2OWZnMDYgKmxjZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbGNkX3BsYXRmb3JtX2RhdGEgKnBkID0gTlVMTDsKKworCXBkID0gbGNkLT5sY2RfcGQ7CisJaWYgKCFwZCkgeworCQlkZXZfZXJyKGxjZC0+ZGV2LCAicGxhdGZvcm0gZGF0YSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0ID0gYW1zMzY5ZmcwNl9sZGlfZGlzYWJsZShsY2QpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihsY2QtPmRldiwgImxjZCBzZXR0aW5nIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZGVsYXkocGQtPnBvd2VyX29mZl9kZWxheSk7CisKKwlpZiAoIXBkLT5wb3dlcl9vbikgeworCQlkZXZfZXJyKGxjZC0+ZGV2LCAicG93ZXJfb24gaXMgTlVMTC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9IGVsc2UKKwkJcGQtPnBvd2VyX29uKGxjZC0+bGQsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1zMzY5ZmcwNl9wb3dlcihzdHJ1Y3QgYW1zMzY5ZmcwNiAqbGNkLCBpbnQgcG93ZXIpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYW1zMzY5ZmcwNl9wb3dlcl9pc19vbihwb3dlcikgJiYKKwkJIWFtczM2OWZnMDZfcG93ZXJfaXNfb24obGNkLT5wb3dlcikpCisJCXJldCA9IGFtczM2OWZnMDZfcG93ZXJfb24obGNkKTsKKwllbHNlIGlmICghYW1zMzY5ZmcwNl9wb3dlcl9pc19vbihwb3dlcikgJiYKKwkJYW1zMzY5ZmcwNl9wb3dlcl9pc19vbihsY2QtPnBvd2VyKSkKKwkJcmV0ID0gYW1zMzY5ZmcwNl9wb3dlcl9vZmYobGNkKTsKKworCWlmICghcmV0KQorCQlsY2QtPnBvd2VyID0gcG93ZXI7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtczM2OWZnMDZfZ2V0X3Bvd2VyKHN0cnVjdCBsY2RfZGV2aWNlICpsZCkKK3sKKwlzdHJ1Y3QgYW1zMzY5ZmcwNiAqbGNkID0gbGNkX2dldF9kYXRhKGxkKTsKKworCXJldHVybiBsY2QtPnBvd2VyOworfQorCitzdGF0aWMgaW50IGFtczM2OWZnMDZfc2V0X3Bvd2VyKHN0cnVjdCBsY2RfZGV2aWNlICpsZCwgaW50IHBvd2VyKQoreworCXN0cnVjdCBhbXMzNjlmZzA2ICpsY2QgPSBsY2RfZ2V0X2RhdGEobGQpOworCisJaWYgKHBvd2VyICE9IEZCX0JMQU5LX1VOQkxBTksgJiYgcG93ZXIgIT0gRkJfQkxBTktfUE9XRVJET1dOICYmCisJCXBvd2VyICE9IEZCX0JMQU5LX05PUk1BTCkgeworCQlkZXZfZXJyKGxjZC0+ZGV2LCAicG93ZXIgdmFsdWUgc2hvdWxkIGJlIDAsIDEgb3IgNC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gYW1zMzY5ZmcwNl9wb3dlcihsY2QsIHBvd2VyKTsKK30KKworc3RhdGljIGludCBhbXMzNjlmZzA2X2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gYmQtPnByb3BzLmJyaWdodG5lc3M7Cit9CisKK3N0YXRpYyBpbnQgYW1zMzY5ZmcwNl9zZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJaW50IHJldCA9IDA7CisJaW50IGJyaWdodG5lc3MgPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKKwlzdHJ1Y3QgYW1zMzY5ZmcwNiAqbGNkID0gZGV2X2dldF9kcnZkYXRhKCZiZC0+ZGV2KTsKKworCWlmIChicmlnaHRuZXNzIDwgTUlOX0JSSUdIVE5FU1MgfHwKKwkJYnJpZ2h0bmVzcyA+IGJkLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcykgeworCQlkZXZfZXJyKCZiZC0+ZGV2LCAibGNkIGJyaWdodG5lc3Mgc2hvdWxkIGJlICVkIHRvICVkLlxuIiwKKwkJCU1JTl9CUklHSFRORVNTLCBNQVhfQlJJR0hUTkVTUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGFtczM2OWZnMDZfZ2FtbWFfY3RsKGxjZCwgYmQtPnByb3BzLmJyaWdodG5lc3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmYmQtPmRldiwgImxjZCBicmlnaHRuZXNzIHNldHRpbmcgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGNkX29wcyBhbXMzNjlmZzA2X2xjZF9vcHMgPSB7CisJLmdldF9wb3dlciA9IGFtczM2OWZnMDZfZ2V0X3Bvd2VyLAorCS5zZXRfcG93ZXIgPSBhbXMzNjlmZzA2X3NldF9wb3dlciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBhbXMzNjlmZzA2X2JhY2tsaWdodF9vcHMgPSB7CisJLmdldF9icmlnaHRuZXNzID0gYW1zMzY5ZmcwNl9nZXRfYnJpZ2h0bmVzcywKKwkudXBkYXRlX3N0YXR1cyA9IGFtczM2OWZnMDZfc2V0X2JyaWdodG5lc3MsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhbXMzNjlmZzA2X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFtczM2OWZnMDYgKmxjZCA9IE5VTEw7CisJc3RydWN0IGxjZF9kZXZpY2UgKmxkID0gTlVMTDsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSBOVUxMOworCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wczsKKworCWxjZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbXMzNjlmZzA2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsY2QpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogYW1zMzY5ZmcwNiBsY2QgcGFuZWwgdXNlcyAzLXdpcmUgMTZiaXRzIFNQSSBNb2RlLiAqLworCXNwaS0+Yml0c19wZXJfd29yZCA9IDE2OworCisJcmV0ID0gc3BpX3NldHVwKHNwaSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJzcGkgc2V0dXAgZmFpbGVkLlxuIik7CisJCWdvdG8gb3V0X2ZyZWVfbGNkOworCX0KKworCWxjZC0+c3BpID0gc3BpOworCWxjZC0+ZGV2ID0gJnNwaS0+ZGV2OworCisJbGNkLT5sY2RfcGQgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghbGNkLT5sY2RfcGQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJwbGF0Zm9ybSBkYXRhIGlzIE5VTExcbiIpOworCQlnb3RvIG91dF9mcmVlX2xjZDsKKwl9CisKKwlsZCA9IGxjZF9kZXZpY2VfcmVnaXN0ZXIoImFtczM2OWZnMDYiLCAmc3BpLT5kZXYsIGxjZCwKKwkJJmFtczM2OWZnMDZfbGNkX29wcyk7CisJaWYgKElTX0VSUihsZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihsZCk7CisJCWdvdG8gb3V0X2ZyZWVfbGNkOworCX0KKworCWxjZC0+bGQgPSBsZDsKKworCW1lbXNldCgmcHJvcHMsIDAsIHNpemVvZihzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMpKTsKKwlwcm9wcy50eXBlID0gQkFDS0xJR0hUX1JBVzsKKwlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IE1BWF9CUklHSFRORVNTOworCisJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJhbXMzNjlmZzA2LWJsIiwgJnNwaS0+ZGV2LCBsY2QsCisJCSZhbXMzNjlmZzA2X2JhY2tsaWdodF9vcHMsICZwcm9wcyk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJcmV0ID0gIFBUUl9FUlIoYmQpOworCQlnb3RvIG91dF9sY2RfdW5yZWdpc3RlcjsKKwl9CisKKwliZC0+cHJvcHMuYnJpZ2h0bmVzcyA9IERFRkFVTFRfQlJJR0hUTkVTUzsKKwlsY2QtPmJkID0gYmQ7CisKKwlpZiAoIWxjZC0+bGNkX3BkLT5sY2RfZW5hYmxlZCkgeworCQkvKgorCQkgKiBpZiBsY2QgcGFuZWwgd2FzIG9mZiBmcm9tIGJvb3Rsb2FkZXIgdGhlbgorCQkgKiBjdXJyZW50IGxjZCBzdGF0dXMgaXMgcG93ZXJkb3duIGFuZCB0aGVuCisJCSAqIGl0IGVuYWJsZXMgbGNkIHBhbmVsLgorCQkgKi8KKwkJbGNkLT5wb3dlciA9IEZCX0JMQU5LX1BPV0VSRE9XTjsKKworCQlhbXMzNjlmZzA2X3Bvd2VyKGxjZCwgRkJfQkxBTktfVU5CTEFOSyk7CisJfSBlbHNlCisJCWxjZC0+cG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgbGNkKTsKKworCWRldl9pbmZvKCZzcGktPmRldiwgImFtczM2OWZnMDYgcGFuZWwgZHJpdmVyIGhhcyBiZWVuIHByb2JlZC5cbiIpOworCisJcmV0dXJuIDA7CisKK291dF9sY2RfdW5yZWdpc3RlcjoKKwlsY2RfZGV2aWNlX3VucmVnaXN0ZXIobGQpOworb3V0X2ZyZWVfbGNkOgorCWtmcmVlKGxjZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYW1zMzY5ZmcwNl9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYW1zMzY5ZmcwNiAqbGNkID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisKKwlhbXMzNjlmZzA2X3Bvd2VyKGxjZCwgRkJfQkxBTktfUE9XRVJET1dOKTsKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIobGNkLT5iZCk7CisJbGNkX2RldmljZV91bnJlZ2lzdGVyKGxjZC0+bGQpOworCWtmcmVlKGxjZCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1BNKQorc3RhdGljIHVuc2lnbmVkIGludCBiZWZvcmVfcG93ZXI7CisKK3N0YXRpYyBpbnQgYW1zMzY5ZmcwNl9zdXNwZW5kKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbXMzNjlmZzA2ICpsY2QgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAibGNkLT5wb3dlciA9ICVkXG4iLCBsY2QtPnBvd2VyKTsKKworCWJlZm9yZV9wb3dlciA9IGxjZC0+cG93ZXI7CisKKwkvKgorCSAqIHdoZW4gbGNkIHBhbmVsIGlzIHN1c3BlbmQsIGxjZCBwYW5lbCBiZWNvbWVzIG9mZgorCSAqIHJlZ2FyZGxlc3Mgb2Ygc3RhdHVzLgorCSAqLworCXJldCA9IGFtczM2OWZnMDZfcG93ZXIobGNkLCBGQl9CTEFOS19QT1dFUkRPV04pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbXMzNjlmZzA2X3Jlc3VtZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhbXMzNjlmZzA2ICpsY2QgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCS8qCisJICogYWZ0ZXIgc3VzcGVuZGVkLCBpZiBsY2QgcGFuZWwgc3RhdHVzIGlzIEZCX0JMQU5LX1VOQkxBTksKKwkgKiAoYXQgdGhhdCB0aW1lLCBiZWZvcmVfcG93ZXIgaXMgRkJfQkxBTktfVU5CTEFOSykgdGhlbgorCSAqIGl0IGNoYW5nZXMgdGhhdCBzdGF0dXMgdG8gRkJfQkxBTktfUE9XRVJET1dOIHRvIGdldCBsY2Qgb24uCisJICovCisJaWYgKGJlZm9yZV9wb3dlciA9PSBGQl9CTEFOS19VTkJMQU5LKQorCQlsY2QtPnBvd2VyID0gRkJfQkxBTktfUE9XRVJET1dOOworCisJZGV2X2RiZygmc3BpLT5kZXYsICJiZWZvcmVfcG93ZXIgPSAlZFxuIiwgYmVmb3JlX3Bvd2VyKTsKKworCXJldCA9IGFtczM2OWZnMDZfcG93ZXIobGNkLCBiZWZvcmVfcG93ZXIpOworCisJcmV0dXJuIHJldDsKK30KKyNlbHNlCisjZGVmaW5lIGFtczM2OWZnMDZfc3VzcGVuZAlOVUxMCisjZGVmaW5lIGFtczM2OWZnMDZfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhbXMzNjlmZzA2X3NodXRkb3duKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFtczM2OWZnMDYgKmxjZCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOworCisJYW1zMzY5ZmcwNl9wb3dlcihsY2QsIEZCX0JMQU5LX1BPV0VSRE9XTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhbXMzNjlmZzA2X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhbXMzNjlmZzA2IiwKKwkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGFtczM2OWZnMDZfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhbXMzNjlmZzA2X3JlbW92ZSksCisJLnNodXRkb3duCT0gYW1zMzY5ZmcwNl9zaHV0ZG93biwKKwkuc3VzcGVuZAk9IGFtczM2OWZnMDZfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFtczM2OWZnMDZfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYW1zMzY5ZmcwNl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFtczM2OWZnMDZfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtczM2OWZnMDZfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYW1zMzY5ZmcwNl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbXMzNjlmZzA2X2luaXQpOworbW9kdWxlX2V4aXQoYW1zMzY5ZmcwNl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSmluZ29vIEhhbiA8amcxLmhhbkBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiYW1zMzY5ZmcwNiBMQ0QgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sZDkwNDAuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xkOTA0MC5jCmluZGV4IDcyODFiMjUuLjU5MzQ2NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xkOTA0MC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xkOTA0MC5jCkBAIC02NjgsNiArNjY4LDcgQEAKIAlzdHJ1Y3QgbGQ5MDQwICpsY2QgPSBOVUxMOwogCXN0cnVjdCBsY2RfZGV2aWNlICpsZCA9IE5VTEw7CiAJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkID0gTlVMTDsKKwlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJvcHM7CiAKIAlsY2QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGQ5MDQwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFsY2QpCkBAIC02OTksMTQgKzcwMCwxNyBAQAogCiAJbGNkLT5sZCA9IGxkOwogCisJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOworCXByb3BzLnR5cGUgPSBCQUNLTElHSFRfUkFXOworCXByb3BzLm1heF9icmlnaHRuZXNzID0gTUFYX0JSSUdIVE5FU1M7CisKIAliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoImxkOTA0MC1ibCIsICZzcGktPmRldiwKLQkJbGNkLCAmbGQ5MDQwX2JhY2tsaWdodF9vcHMsIE5VTEwpOwotCWlmIChJU19FUlIobGQpKSB7Ci0JCXJldCA9IFBUUl9FUlIobGQpOwotCQlnb3RvIG91dF9mcmVlX2xjZDsKKwkJbGNkLCAmbGQ5MDQwX2JhY2tsaWdodF9vcHMsICZwcm9wcyk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihiZCk7CisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfbGNkOwogCX0KIAotCWJkLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IE1BWF9CUklHSFRORVNTOwogCWJkLT5wcm9wcy5icmlnaHRuZXNzID0gTUFYX0JSSUdIVE5FU1M7CiAJbGNkLT5iZCA9IGJkOwogCkBAIC03MzEsNiArNzM1LDggQEAKIAlkZXZfaW5mbygmc3BpLT5kZXYsICJsZDkwNDAgcGFuZWwgZHJpdmVyIGhhcyBiZWVuIHByb2JlZC5cbiIpOwogCXJldHVybiAwOwogCitvdXRfdW5yZWdpc3Rlcl9sY2Q6CisJbGNkX2RldmljZV91bnJlZ2lzdGVyKGxjZC0+bGQpOwogb3V0X2ZyZWVfbGNkOgogCWtmcmVlKGxjZCk7CiAJcmV0dXJuIHJldDsKQEAgLTc0MSw2ICs3NDcsNyBAQAogCXN0cnVjdCBsZDkwNDAgKmxjZCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOwogCiAJbGQ5MDQwX3Bvd2VyKGxjZCwgRkJfQkxBTktfUE9XRVJET1dOKTsKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIobGNkLT5iZCk7CiAJbGNkX2RldmljZV91bnJlZ2lzdGVyKGxjZC0+bGQpOwogCWtmcmVlKGxjZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3M2ZTYzbTAuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3M2ZTYzbTAuYwppbmRleCAzMjIwNDBmLi42OTRlNWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9zNmU2M20wLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvczZlNjNtMC5jCkBAIC03MzgsNiArNzM4LDcgQEAKIAlzdHJ1Y3QgczZlNjNtMCAqbGNkID0gTlVMTDsKIAlzdHJ1Y3QgbGNkX2RldmljZSAqbGQgPSBOVUxMOwogCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCA9IE5VTEw7CisJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHByb3BzOwogCiAJbGNkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHM2ZTYzbTApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxjZCkKQEAgLTc2OSwxNiArNzcwLDE4IEBACiAKIAlsY2QtPmxkID0gbGQ7CiAKKwltZW1zZXQoJnByb3BzLCAwLCBzaXplb2Yoc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzKSk7CisJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9SQVc7CisJcHJvcHMubWF4X2JyaWdodG5lc3MgPSBNQVhfQlJJR0hUTkVTUzsKKwogCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigiczZlNjNtMGJsLWJsIiwgJnNwaS0+ZGV2LCBsY2QsCi0JCSZzNmU2M20wX2JhY2tsaWdodF9vcHMsIE5VTEwpOworCQkmczZlNjNtMF9iYWNrbGlnaHRfb3BzLCAmcHJvcHMpOwogCWlmIChJU19FUlIoYmQpKSB7CiAJCXJldCA9ICBQVFJfRVJSKGJkKTsKIAkJZ290byBvdXRfbGNkX3VucmVnaXN0ZXI7CiAJfQogCi0JYmQtPnByb3BzLm1heF9icmlnaHRuZXNzID0gTUFYX0JSSUdIVE5FU1M7CiAJYmQtPnByb3BzLmJyaWdodG5lc3MgPSBNQVhfQlJJR0hUTkVTUzsKLQliZC0+cHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9SQVc7CiAJbGNkLT5iZCA9IGJkOwogCiAJLyoKQEAgLTg0MCw3ICs4NDMsNyBAQAogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfUE0pCi11bnNpZ25lZCBpbnQgYmVmb3JlX3Bvd2VyOworc3RhdGljIHVuc2lnbmVkIGludCBiZWZvcmVfcG93ZXI7CiAKIHN0YXRpYyBpbnQgczZlNjNtMF9zdXNwZW5kKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHBtX21lc3NhZ2VfdCBtZXNnKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iZjUzNy1scTAzNS5jIGIvZHJpdmVycy92aWRlby9iZjUzNy1scTAzNS5jCmluZGV4IDQ3YzIxZmIuLmJlYTUzYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmY1MzctbHEwMzUuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JmNTM3LWxxMDM1LmMKQEAgLTc4OSw2ICs3ODksNyBAQAogCWkyY19hZGRfZHJpdmVyKCZhZDUyODBfZHJpdmVyKTsKIAogCW1lbXNldCgmcHJvcHMsIDAsIHNpemVvZihwcm9wcykpOworCXByb3BzLnR5cGUgPSBCQUNLTElHSFRfUkFXOwogCXByb3BzLm1heF9icmlnaHRuZXNzID0gTUFYX0JSSUdIRU5FU1M7CiAJYmxfZGV2ID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigiYmY1MzctYmwiLCBOVUxMLCBOVUxMLAogCQkJCQkgICAmYmZpbl9scTAzNWZiX2JsX29wcywgJnByb3BzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYnJvYWRzaGVldGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2Jyb2Fkc2hlZXRmYi5jCmluZGV4IGViZGE2ODcuLjM3N2RkZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYnJvYWRzaGVldGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9icm9hZHNoZWV0ZmIuYwpAQCAtMTEwMSwxMiArMTEwMSwxMCBAQAogCiAJdmlkZW9tZW1vcnlzaXplID0gcm91bmR1cCgoZHB5dypkcHloKSwgUEFHRV9TSVpFKTsKIAotCXZpZGVvbWVtb3J5ID0gdm1hbGxvYyh2aWRlb21lbW9yeXNpemUpOworCXZpZGVvbWVtb3J5ID0gdnphbGxvYyh2aWRlb21lbW9yeXNpemUpOwogCWlmICghdmlkZW9tZW1vcnkpCiAJCWdvdG8gZXJyX2ZiX3JlbDsKIAotCW1lbXNldCh2aWRlb21lbW9yeSwgMCwgdmlkZW9tZW1vcnlzaXplKTsKLQogCWluZm8tPnNjcmVlbl9iYXNlID0gKGNoYXIgKil2aWRlb21lbW9yeTsKIAlpbmZvLT5mYm9wcyA9ICZicm9hZHNoZWV0ZmJfb3BzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvYmFsdF9sY2RmYi5jIGIvZHJpdmVycy92aWRlby9jb2JhbHRfbGNkZmIuYwppbmRleCA0MmZlMTU1Li5lMDI3NjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvYmFsdF9sY2RmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29iYWx0X2xjZGZiLmMKQEAgLTMwMyw3ICszMDMsNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCWluZm8tPnNjcmVlbl9zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlpbmZvLT5zY3JlZW5fc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgaW5mby0+c2NyZWVuX3NpemUpOwogCWluZm8tPmZib3BzID0gJmNvYmFsdF9sY2RfZmJvcHM7CiAJaW5mby0+Zml4ID0gY29iYWx0X2xjZGZiX2ZpeDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCmluZGV4IGMyMjVkY2MuLjkwNzViZWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKQEAgLTcwOSwxMSArNzA5LDExIEBACiAKIAkvKiBNYXAgaW4gZnJhbWUgYnVmZmVyIGFuZCByZWdpc3RlcnMgKi8KIAlwLT5mYl9vcmlnX2Jhc2UgPSBmYl9yZXMuc3RhcnQ7Ci0JcC0+ZmJfb3JpZ19zaXplID0gZmJfcmVzLmVuZCAtIGZiX3Jlcy5zdGFydCArIDE7CisJcC0+ZmJfb3JpZ19zaXplID0gcmVzb3VyY2Vfc2l6ZSgmZmJfcmVzKTsKIAkvKiB1c2UgdGhlIGJpZy1lbmRpYW4gYXBlcnR1cmUgKD8/KSAqLwogCXAtPmZyYW1lX2J1ZmZlcl9waHlzID0gZmJfcmVzLnN0YXJ0ICsgMHg4MDAwMDA7CiAJcC0+Y29udHJvbF9yZWdzX3BoeXMgPSByZWdfcmVzLnN0YXJ0OwotCXAtPmNvbnRyb2xfcmVnc19zaXplID0gcmVnX3Jlcy5lbmQgLSByZWdfcmVzLnN0YXJ0ICsgMTsKKwlwLT5jb250cm9sX3JlZ3Nfc2l6ZSA9IHJlc291cmNlX3NpemUoJnJlZ19yZXMpOwogCiAJaWYgKCFwLT5mYl9vcmlnX2Jhc2UgfHwKIAkgICAgIXJlcXVlc3RfbWVtX3JlZ2lvbihwLT5mYl9vcmlnX2Jhc2UscC0+ZmJfb3JpZ19zaXplLCJjb250cm9sZmIiKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9lZmlmYi5jIGIvZHJpdmVycy92aWRlby9lZmlmYi5jCmluZGV4IGZiMjA1ODQuLjc4NDEzOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZWZpZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2VmaWZiLmMKQEAgLTE2LDYgKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDx2aWRlby92Z2EuaD4KIAorc3RhdGljIGJvb2wgcmVxdWVzdF9tZW1fc3VjY2VlZGVkID0gZmFsc2U7CisKIHN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZWZpZmJfZGVmaW5lZCBfX2RldmluaXRkYXRhID0gewogCS5hY3RpdmF0ZQkJPSBGQl9BQ1RJVkFURV9OT1csCiAJLmhlaWdodAkJCT0gLTEsCkBAIC0yODEsNyArMjgzLDkgQEAKIHsKIAlpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCiAJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5iYXNlLCBpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplKTsKKwlpZiAocmVxdWVzdF9tZW1fc3VjY2VlZGVkKQorCQlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uYmFzZSwKKwkJCQkgICBpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplKTsKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogfQogCkBAIC0zMjYsMTQgKzMzMCwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlZmlmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBlZmlmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJaW50IGVycjsKIAl1bnNpZ25lZCBpbnQgc2l6ZV92bW9kZTsKIAl1bnNpZ25lZCBpbnQgc2l6ZV9yZW1hcDsKIAl1bnNpZ25lZCBpbnQgc2l6ZV90b3RhbDsKLQlpbnQgcmVxdWVzdF9zdWNjZWVkZWQgPSAwOwogCiAJaWYgKCFzY3JlZW5faW5mby5sZmJfZGVwdGgpCiAJCXNjcmVlbl9pbmZvLmxmYl9kZXB0aCA9IDMyOwpAQCAtMzg3LDcgKzM5MCw3IEBACiAJZWZpZmJfZml4LnNtZW1fbGVuID0gc2l6ZV9yZW1hcDsKIAogCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oZWZpZmJfZml4LnNtZW1fc3RhcnQsIHNpemVfcmVtYXAsICJlZmlmYiIpKSB7Ci0JCXJlcXVlc3Rfc3VjY2VlZGVkID0gMTsKKwkJcmVxdWVzdF9tZW1fc3VjY2VlZGVkID0gdHJ1ZTsKIAl9IGVsc2UgewogCQkvKiBXZSBjYW5ub3QgbWFrZSB0aGlzIGZhdGFsLiBTb21ldGltZXMgdGhpcyBjb21lcyBmcm9tIG1hZ2ljCiAJCSAgIHNwYWNlcyBvdXIgcmVzb3VyY2UgaGFuZGxlcnMgc2ltcGx5IGRvbid0IGtub3cgYWJvdXQgKi8KQEAgLTQxMyw3ICs0MTYsNyBAQAogCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLmJhc2UgPSBlZmlmYl9maXguc21lbV9zdGFydDsKIAlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplID0gc2l6ZV9yZW1hcDsKIAotCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcChlZmlmYl9maXguc21lbV9zdGFydCwgZWZpZmJfZml4LnNtZW1fbGVuKTsKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXBfd2MoZWZpZmJfZml4LnNtZW1fc3RhcnQsIGVmaWZiX2ZpeC5zbWVtX2xlbik7CiAJaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgImVmaWZiOiBhYm9ydCwgY2Fubm90IGlvcmVtYXAgdmlkZW8gbWVtb3J5ICIKIAkJCQkiMHgleCBAIDB4JWx4XG4iLApAQCAtNDkxLDEzICs0OTQsMTIgQEAKIGVycl9yZWxlYXNlX2ZiOgogCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiBlcnJfcmVsZWFzZV9tZW06Ci0JaWYgKHJlcXVlc3Rfc3VjY2VlZGVkKQorCWlmIChyZXF1ZXN0X21lbV9zdWNjZWVkZWQpCiAJCXJlbGVhc2VfbWVtX3JlZ2lvbihlZmlmYl9maXguc21lbV9zdGFydCwgc2l6ZV90b3RhbCk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWZpZmJfZHJpdmVyID0gewotCS5wcm9iZQk9IGVmaWZiX3Byb2JlLAogCS5kcml2ZXIJPSB7CiAJCS5uYW1lCT0gImVmaWZiIiwKIAl9LApAQCAtNTI4LDEzICs1MzAsMjEgQEAKIAlpZiAoIXNjcmVlbl9pbmZvLmxmYl9saW5lbGVuZ3RoKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZWZpZmJfZHJpdmVyKTsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVmaWZiX2RldmljZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCWlmICghcmV0KSB7Ci0JCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZWZpZmJfZGV2aWNlKTsKLQkJaWYgKHJldCkKLQkJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZlZmlmYl9kcml2ZXIpOworCS8qCisJICogVGhpcyBpcyBub3QganVzdCBhbiBvcHRpbWl6YXRpb24uICBXZSB3aWxsIGludGVyZmVyZQorCSAqIHdpdGggYSByZWFsIGRyaXZlciBpZiB3ZSBnZXQgcmVwcm9iZWQsIHNvIGRvbid0IGFsbG93CisJICogaXQuCisJICovCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZlZmlmYl9kcml2ZXIsIGVmaWZiX3Byb2JlKTsKKwlpZiAocmV0KSB7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZlZmlmYl9kZXZpY2UpOworCQlyZXR1cm4gcmV0OwogCX0KKwogCXJldHVybiByZXQ7CiB9CiBtb2R1bGVfaW5pdChlZmlmYl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZXA5M3h4LWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2VwOTN4eC1mYi5jCmluZGV4IGNiZGIxYmQuLjQwZTVmMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZXA5M3h4LWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9lcDkzeHgtZmIuYwpAQCAtNCw3ICs0LDcgQEAKICAqIEZyYW1lYnVmZmVyIHN1cHBvcnQgZm9yIHRoZSBFUDkzeHggc2VyaWVzLgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNyBCbHVld2F0ZXIgU3lzdGVtcyBMdGQKLSAqIEF1dGhvcjogUnlhbiBNYWxsb24gPHJ5YW5AYmx1ZXdhdGVyc3lzLmNvbT4KKyAqIEF1dGhvcjogUnlhbiBNYWxsb24KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+CiAgKgpAQCAtNjQ0LDYgKzY0NCw2IEBACiAKIE1PRFVMRV9ERVNDUklQVElPTigiRVA5M1hYIEZyYW1lYnVmZmVyIERyaXZlciIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTplcDkzeHgtZmIiKTsKLU1PRFVMRV9BVVRIT1IoIlJ5YW4gTWFsbG9uIDxyeWFuJmJsdWV3YXRlcnN5cy5jb20+LCAiCitNT0RVTEVfQVVUSE9SKCJSeWFuIE1hbGxvbiwgIgogCSAgICAgICJIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYl9kZWZpby5jIGIvZHJpdmVycy92aWRlby9mYl9kZWZpby5jCmluZGV4IDgwNDAwMDEuLjMyODE0ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJfZGVmaW8uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZiX2RlZmlvLmMKQEAgLTY2LDE5ICs2NiwyNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZmJfZGVmZXJyZWRfaW9fZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK2ludCBmYl9kZWZlcnJlZF9pb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJaW50IGVyciA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qIFNraXAgaWYgZGVmZXJyZWQgaW8gaXMgY29tcGlsZWQtaW4gYnV0IGRpc2FibGVkIG9uIHRoaXMgZmJkZXYgKi8KIAlpZiAoIWluZm8tPmZiZGVmaW8pCiAJCXJldHVybiAwOwogCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCS8qIEtpbGwgb2ZmIHRoZSBkZWxheWVkIHdvcmsgKi8KIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmluZm8tPmRlZmVycmVkX3dvcmspOwogCiAJLyogUnVuIGl0IGltbWVkaWF0ZWx5ICovCi0JcmV0dXJuIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW5mby0+ZGVmZXJyZWRfd29yaywgMCk7CisJZXJyID0gc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpbmZvLT5kZWZlcnJlZF93b3JrLCAwKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZmJfZGVmZXJyZWRfaW9fZnN5bmMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZzbC1kaXUtZmIuYyBiL2RyaXZlcnMvdmlkZW8vZnNsLWRpdS1mYi5jCmluZGV4IGJlZGY1YmUuLjBhY2M3ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZnNsLWRpdS1mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZnNsLWRpdS1mYi5jCkBAIC01NTUsOCArNTU1LDYgQEAKIHN0YXRpYyBpbnQgZnNsX2RpdV9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0JdW5zaWduZWQgbG9uZyBodG90YWwsIHZ0b3RhbDsKLQogCXByX2RlYnVnKCJjaGVja192YXIgeHJlczogJWRcbiIsIHZhci0+eHJlcyk7CiAJcHJfZGVidWcoImNoZWNrX3ZhciB5cmVzOiAlZFxuIiwgdmFyLT55cmVzKTsKIApAQCAtNjM1LDIwICs2MzMsNiBAQAogCiAJCWJyZWFrOwogCX0KLQkvKiBJZiB0aGUgcGl4Y2xvY2sgaXMgYmVsb3cgdGhlIG1pbmltdW0gc3BlYydkIHZhbHVlIHRoZW4gc2V0IHRvCi0JICogcmVmcmVzaCByYXRlIGZvciA2MEh6IHNpbmNlIHRoaXMgaXMgc3VwcG9ydGVkIGJ5IG1vc3QgbW9uaXRvcnMuCi0JICogUmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9mYi8gZm9yIGNhbGN1bGF0aW9ucy4KLQkgKi8KLQlpZiAoKHZhci0+cGl4Y2xvY2sgPCBNSU5fUElYX0NMSykgfHwgKHZhci0+cGl4Y2xvY2sgPiBNQVhfUElYX0NMSykpIHsKLQkJaHRvdGFsID0gdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbiArCi0JCSAgICB2YXItPmxlZnRfbWFyZ2luOwotCQl2dG90YWwgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuICsKLQkJICAgIHZhci0+dXBwZXJfbWFyZ2luOwotCQl2YXItPnBpeGNsb2NrID0gKHZ0b3RhbCAqIGh0b3RhbCAqIDZVTCkgLyAxMDBVTDsKLQkJdmFyLT5waXhjbG9jayA9IEtIWjJQSUNPUyh2YXItPnBpeGNsb2NrKTsKLQkJcHJfZGVidWcoInBpeGNsb2NrIHNldCBmb3IgNjBIeiByZWZyZXNoID0gJXUgcHNcbiIsCi0JCQl2YXItPnBpeGNsb2NrKTsKLQl9CiAKIAl2YXItPmhlaWdodCA9IC0xOwogCXZhci0+d2lkdGggPSAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKaW5kZXggYzZiNTU0Zi4uNWE1ZDA5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKQEAgLTI5LDcgKzI5LDcgQEAKIHN0YXRpYyBjaGFyIHBhbmVsX29wdGlvblszMl0gPSAiIjsKIAogLyogTW9kZXMgcmVsZXZhbnQgdG8gdGhlIEdYMSAodGFrZW4gZnJvbSBtb2RlZGIuYykgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlIF9faW5pdGRhdGEgZ3gxX21vZGVkYltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgX19kZXZpbml0ZGF0YSBneDFfbW9kZWRiW10gPSB7CiAJLyogNjQweDQ4MC02MCBWRVNBICovCiAJeyBOVUxMLCA2MCwgNjQwLCA0ODAsIDM5NjgyLCAgNDgsIDE2LCAzMywgMTAsIDk2LCAyLAogCSAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCkBAIC0xOTUsNyArMTk1LDcgQEAKIAlyZXR1cm4gcGFyLT52aWRfb3BzLT5ibGFua19kaXNwbGF5KGluZm8sIGJsYW5rX21vZGUpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBneDFmYl9tYXBfdmlkZW9fbWVtb3J5KHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgZ3gxZmJfbWFwX3ZpZGVvX21lbW9yeShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1bnNpZ25lZCBneF9iYXNlOwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJLmZiX2ltYWdlYmxpdAk9IGNmYl9pbWFnZWJsaXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX2luZm8gKiBfX2luaXQgZ3gxZmJfaW5pdF9mYmluZm8oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBmYl9pbmZvICogX19kZXZpbml0IGd4MWZiX2luaXRfZmJpbmZvKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhcjsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKQEAgLTMxOCw3ICszMTgsNyBAQAogCXJldHVybiBpbmZvOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBneDFmYl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBfX2RldmluaXQgZ3gxZmJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhcjsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKQEAgLTM4Miw3ICszODIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGd4MWZiX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBneDFmYl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGdlb2RlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CkBAIC00NDEsNyArNDQxLDcgQEAKIAkubmFtZQkJPSAiZ3gxZmIiLAogCS5pZF90YWJsZQk9IGd4MWZiX2lkX3RhYmxlLAogCS5wcm9iZQkJPSBneDFmYl9wcm9iZSwKLQkucmVtb3ZlCQk9IGd4MWZiX3JlbW92ZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGd4MWZiX3JlbW92ZSksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBneDFmYl9pbml0KHZvaWQpCkBAIC00NTYsNyArNDU2LDcgQEAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZ3gxZmJfZHJpdmVyKTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGd4MWZiX2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBneDFmYl9jbGVhbnVwKHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZneDFmYl9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9oZWN1YmFmYi5jIGIvZHJpdmVycy92aWRlby9oZWN1YmFmYi5jCmluZGV4IDFiOTQ2NDMuLjYxNDI1MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaGVjdWJhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2hlY3ViYWZiLmMKQEAgLTIzMSwxMCArMjMxLDkgQEAKIAogCXZpZGVvbWVtb3J5c2l6ZSA9IChEUFlfVypEUFlfSCkvODsKIAotCWlmICghKHZpZGVvbWVtb3J5ID0gdm1hbGxvYyh2aWRlb21lbW9yeXNpemUpKSkKLQkJcmV0dXJuIHJldHZhbDsKLQotCW1lbXNldCh2aWRlb21lbW9yeSwgMCwgdmlkZW9tZW1vcnlzaXplKTsKKwl2aWRlb21lbW9yeSA9IHZ6YWxsb2ModmlkZW9tZW1vcnlzaXplKTsKKwlpZiAoIXZpZGVvbWVtb3J5KQorCQlnb3RvIGVycl92aWRlb21lbV9hbGxvYzsKIAogCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGhlY3ViYWZiX3BhciksICZkZXYtPmRldik7CiAJaWYgKCFpbmZvKQpAQCAtMjc2LDYgKzI3NSw3IEBACiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIGVycl9mYmFsbG9jOgogCXZmcmVlKHZpZGVvbWVtb3J5KTsKK2Vycl92aWRlb21lbV9hbGxvYzoKIAltb2R1bGVfcHV0KGJvYXJkLT5vd25lcik7CiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLmggYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC5oCmluZGV4IGYzN2RlNjAuLjE0MTRiNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLmgKKysrIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTAuaApAQCAtMTM3LDcgKzEzNyw3IEBACiAjZGVmaW5lIERSQU1fT04gICAgICAgICAgICAgICAgICAgICAweDA4ICAgICAgICAgICAgCiAjZGVmaW5lIERSQU1fT0ZGICAgICAgICAgICAgICAgICAgICAweEU3CiAjZGVmaW5lIFBHX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIFJJTkdfU0laRV9NQVNLICAgICAgICAgICAgICAoUklOR0JVRkZFUl9TSVpFIC0gMSk7CisjZGVmaW5lIFJJTkdfU0laRV9NQVNLICAgICAgICAgICAgICAoUklOR0JVRkZFUl9TSVpFIC0gMSkKIAogLyogZGVmaW5lcyBmb3IgcmVzdG9yaW5nIHJlZ2lzdGVycyBwYXJ0aWFsbHkgKi8KICNkZWZpbmUgQUREUl9NQVBfTUFTSyAgICAgICAgICAgICAgICgweDA3IDw8IDUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2lteGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2lteGZiLmMKaW5kZXggZDJjY2ZkNi4uZjEzNWRiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbXhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaW14ZmIuYwpAQCAtODU2LDEwICs4NTYsMTAgQEAKIAkJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKCZwZGV2LT5kZXYsZmJpLT5tYXBfc2l6ZSxmYmktPm1hcF9jcHUsCiAJCQlmYmktPm1hcF9kbWEpOwogZmFpbGVkX21hcDoKLQljbGtfcHV0KGZiaS0+Y2xrKTsKLWZhaWxlZF9nZXRjbG9jazoKIAlpb3VubWFwKGZiaS0+cmVncyk7CiBmYWlsZWRfaW9yZW1hcDoKKwljbGtfcHV0KGZiaS0+Y2xrKTsKK2ZhaWxlZF9nZXRjbG9jazoKIAlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIGZhaWxlZF9yZXE6CiAJa2ZyZWUoaW5mby0+cHNldWRvX3BhbGV0dGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYjg2Mnh4L21iODYyeHhmYmRydi5jIGIvZHJpdmVycy92aWRlby9tYjg2Mnh4L21iODYyeHhmYmRydi5jCmluZGV4IGY3MGJkNjMuLmVlMWRlM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWI4NjJ4eC9tYjg2Mnh4ZmJkcnYuYworKysgYi9kcml2ZXJzL3ZpZGVvL21iODYyeHgvbWI4NjJ4eGZiZHJ2LmMKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCQlnb3RvIGZicmVsOwogCX0KIAotCXJlc19zaXplID0gMSArIHJlcy5lbmQgLSByZXMuc3RhcnQ7CisJcmVzX3NpemUgPSByZXNvdXJjZV9zaXplKCZyZXMpOwogCXBhci0+cmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy5zdGFydCwgcmVzX3NpemUsIERSVl9OQU1FKTsKIAlpZiAocGFyLT5yZXMgPT0gTlVMTCkgewogCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBjbGFpbSBmcmFtZWJ1ZmZlci9tbWlvXG4iKTsKQEAgLTc4Nyw3ICs3ODcsNyBAQAogewogCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBkZXZfZ2V0X2RydmRhdGEoJm9mZGV2LT5kZXYpOwogCXN0cnVjdCBtYjg2Mnh4ZmJfcGFyICpwYXIgPSBmYmktPnBhcjsKLQlyZXNvdXJjZV9zaXplX3QgcmVzX3NpemUgPSAxICsgcGFyLT5yZXMtPmVuZCAtIHBhci0+cmVzLT5zdGFydDsKKwlyZXNvdXJjZV9zaXplX3QgcmVzX3NpemUgPSByZXNvdXJjZV9zaXplKHBhci0+cmVzKTsKIAl1bnNpZ25lZCBsb25nIHJlZzsKIAogCWRldl9kYmcoZmJpLT5kZXYsICIlcyByZWxlYXNlXG4iLCBmYmktPmZpeC5pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21ldHJvbm9tZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL21ldHJvbm9tZWZiLmMKaW5kZXggZWQ2NGVkZi4uOTdkNDVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tZXRyb25vbWVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWV0cm9ub21lZmIuYwpAQCAtNjI4LDEyICs2MjgsMTAgQEAKIAkvKiB3ZSBuZWVkIHRvIGFkZCBhIHNwYXJlIHBhZ2UgYmVjYXVzZSBvdXIgY3N1bSBjYWNoaW5nIHNjaGVtZSB3YWxrcwogCSAqIHRvIHRoZSBlbmQgb2YgdGhlIHBhZ2UgKi8KIAl2aWRlb21lbW9yeXNpemUgPSBQQUdFX1NJWkUgKyAoZncgKiBmaCk7Ci0JdmlkZW9tZW1vcnkgPSB2bWFsbG9jKHZpZGVvbWVtb3J5c2l6ZSk7CisJdmlkZW9tZW1vcnkgPSB2emFsbG9jKHZpZGVvbWVtb3J5c2l6ZSk7CiAJaWYgKCF2aWRlb21lbW9yeSkKIAkJZ290byBlcnJfZmJfcmVsOwogCi0JbWVtc2V0KHZpZGVvbWVtb3J5LCAwLCB2aWRlb21lbW9yeXNpemUpOwotCiAJaW5mby0+c2NyZWVuX2Jhc2UgPSAoY2hhciBfX2ZvcmNlIF9faW9tZW0gKil2aWRlb21lbW9yeTsKIAlpbmZvLT5mYm9wcyA9ICZtZXRyb25vbWVmYl9vcHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMgYi9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCmluZGV4IDQ4YzNlYTguLmNiMTc1ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKKysrIGIvZHJpdmVycy92aWRlby9tb2RlZGIuYwpAQCAtMTEyOCwzICsxMTI4LDQgQEAKIEVYUE9SVF9TWU1CT0woZmJfZmluZF9uZWFyZXN0X21vZGUpOwogRVhQT1JUX1NZTUJPTChmYl92aWRlb21vZGVfdG9fbW9kZWxpc3QpOwogRVhQT1JUX1NZTUJPTChmYl9maW5kX21vZGUpOworRVhQT1JUX1NZTUJPTChmYl9maW5kX21vZGVfY3Z0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kcC5jIGIvZHJpdmVycy92aWRlby9tc20vbWRwLmMKaW5kZXggYzM2MzZkNS4uMjQzZDE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRwLmMKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRwLmMKQEAgLTQwNiw4ICs0MDYsNyBAQAogCQlnb3RvIGVycm9yX2dldF9pcnE7CiAJfQogCi0JbWRwLT5iYXNlID0gaW9yZW1hcChyZXNvdXJjZS0+c3RhcnQsCi0JCQkgICAgcmVzb3VyY2UtPmVuZCAtIHJlc291cmNlLT5zdGFydCk7CisJbWRwLT5iYXNlID0gaW9yZW1hcChyZXNvdXJjZS0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzb3VyY2UpKTsKIAlpZiAobWRwLT5iYXNlID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtc21mYjogY2Fubm90IGFsbG9jYXRlIG1kcCByZWdzIVxuIik7CiAJCXJldCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tc21fZmIuYyBiL2RyaXZlcnMvdmlkZW8vbXNtL21zbV9mYi5jCmluZGV4IGVjMzUxMzAuLmM2ZTNiNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21zbV9mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21zbV9mYi5jCkBAIC01MjUsMTAgKzUyNSw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlmYi0+Zml4LnNtZW1fc3RhcnQgPSByZXNvdXJjZS0+c3RhcnQ7Ci0JZmItPmZpeC5zbWVtX2xlbiA9IHJlc291cmNlLT5lbmQgLSByZXNvdXJjZS0+c3RhcnQ7Ci0JZmJyYW0gPSBpb3JlbWFwKHJlc291cmNlLT5zdGFydCwKLQkJCXJlc291cmNlLT5lbmQgLSByZXNvdXJjZS0+c3RhcnQpOwotCWlmIChmYnJhbSA9PSAwKSB7CisJZmItPmZpeC5zbWVtX2xlbiA9IHJlc291cmNlX3NpemUocmVzb3VyY2UpOworCWZicmFtID0gaW9yZW1hcChyZXNvdXJjZS0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzb3VyY2UpKTsKKwlpZiAoZmJyYW0gPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIm1zbWZiOiBjYW5ub3QgYWxsb2NhdGUgZmJyYW0hXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udWM5MDBmYi5jIGIvZHJpdmVycy92aWRlby9udWM5MDBmYi5jCmluZGV4IGY4MzhkOWUuLjBmZmY1OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnVjOTAwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL251YzkwMGZiLmMKQEAgLTU1MSw3ICs1NTEsNyBAQAogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAotCXNpemUgPSAocmVzLT5lbmQgLSByZXMtPnN0YXJ0KSArIDE7CisJc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAlmYmktPm1lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBzaXplLCBwZGV2LT5uYW1lKTsKIAlpZiAoZmJpLT5tZW0gPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2MgbWVtb3J5IHJlZ2lvblxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYyBiL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jCmluZGV4IGVmNTMyZDkuLmYyN2FlMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jCkBAIC01NjcsNyArNTY3LDcgQEAKIAkgKiBub3J0aGJyaWRnZSBhbmQgdGhhdCBjYW4gZmFpbC4gT25seSByZXF1ZXN0IGZyYW1lYnVmZmVyCiAJICovCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGluZm8tPnJzcmNfZmIuc3RhcnQsCi0JCQkJcGluZm8tPnJzcmNfZmIuZW5kIC0gcGluZm8tPnJzcmNfZmIuc3RhcnQgKyAxLAorCQkJCXJlc291cmNlX3NpemUoJnBpbmZvLT5yc3JjX2ZiKSwKIAkJCQkicGxhdGludW1mYiBmcmFtZWJ1ZmZlciIpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicGxhdGludW1mYjogQ2FuJ3QgcmVxdWVzdCBmcmFtZWJ1ZmZlciAhXG4iKTsKIAkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKQEAgLTY1OCw4ICs2NTgsNyBAQAogCWlvdW5tYXAocGluZm8tPmNtYXBfcmVncyk7CiAKIAlyZWxlYXNlX21lbV9yZWdpb24ocGluZm8tPnJzcmNfZmIuc3RhcnQsCi0JCQkgICBwaW5mby0+cnNyY19mYi5lbmQgLQotCQkJICAgcGluZm8tPnJzcmNfZmIuc3RhcnQgKyAxKTsKKwkJCSAgIHJlc291cmNlX3NpemUoJnBpbmZvLT5yc3JjX2ZiKSk7CiAKIAlyZWxlYXNlX21lbV9yZWdpb24ocGluZm8tPmNtYXBfcmVnc19waHlzLCAweDEwMDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3B4YTE2OGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3B4YTE2OGZiLmMKaW5kZXggMzVmNjFkZC4uMThlYWQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9weGExNjhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcHhhMTY4ZmIuYwpAQCAtNjIzLDE5ICs2MjMsMjEgQEAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmIChyZXMgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBJTyBtZW1vcnkgZGVmaW5lZFxuIik7Ci0JCXJldHVybiAtRU5PRU5UOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGZhaWxlZF9wdXRfY2xrOwogCX0KIAogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJaWYgKGlycSA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gSVJRIGRlZmluZWRcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBmYWlsZWRfcHV0X2NsazsKIAl9CiAKIAlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBweGExNjhmYl9pbmZvKSwgJnBkZXYtPmRldik7CiAJaWYgKGluZm8gPT0gTlVMTCkgewotCQljbGtfcHV0KGNsayk7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxlZF9wdXRfY2xrOwogCX0KIAogCS8qIEluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICovCkBAIC02NjAsNyArNjYyLDcgQEAKIAlpbmZvLT5maXgueXBhbnN0ZXAgPSAwOwogCWluZm8tPmZpeC55d3JhcHN0ZXAgPSAwOwogCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gcmVzLT5zdGFydDsKLQlpbmZvLT5maXgubW1pb19sZW4gPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCWluZm8tPmZpeC5tbWlvX2xlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9OT05FOwogCWluZm8tPmZib3BzID0gJnB4YTE2OGZiX29wczsKIAlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IGZiaS0+cHNldWRvX3BhbGV0dGU7CkBAIC02NzEsNyArNjczLDcgQEAKIAlmYmktPnJlZ19iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKGZiaS0+cmVnX2Jhc2UgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxlZDsKKwkJZ290byBmYWlsZWRfZnJlZV9pbmZvOwogCX0KIAogCS8qCkBAIC02ODMsNyArNjg1LDcgQEAKIAkJCQkJCSZmYmktPmZiX3N0YXJ0X2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGluZm8tPnNjcmVlbl9iYXNlID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsZWQ7CisJCWdvdG8gZmFpbGVkX2ZyZWVfaW5mbzsKIAl9CiAKIAlpbmZvLT5maXguc21lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWZiaS0+ZmJfc3RhcnRfZG1hOwpAQCAtNzcyLDggKzc3NCw5IEBACiBmYWlsZWRfZnJlZV9mYm1lbToKIAlkbWFfZnJlZV9jb2hlcmVudChmYmktPmRldiwgaW5mby0+Zml4LnNtZW1fbGVuLAogCQkJaW5mby0+c2NyZWVuX2Jhc2UsIGZiaS0+ZmJfc3RhcnRfZG1hKTsKLWZhaWxlZDoKK2ZhaWxlZF9mcmVlX2luZm86CiAJa2ZyZWUoaW5mbyk7CitmYWlsZWRfcHV0X2NsazoKIAljbGtfcHV0KGNsayk7CiAKIAlkZXZfZXJyKCZwZGV2LT5kZXYsICJmcmFtZSBidWZmZXIgZGV2aWNlIGluaXQgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3MzYy1mYi5jIGIvZHJpdmVycy92aWRlby9zM2MtZmIuYwppbmRleCAwMzUyYWZhLi40YWVjZjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3MzYy1mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vczNjLWZiLmMKQEAgLTIzNSwxMyArMjM1LDEyIEBACiAJCQkgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHMzY19mYl93aW4gKndpbiA9IGluZm8tPnBhcjsKLQlzdHJ1Y3QgczNjX2ZiX3BkX3dpbiAqd2luZGF0YSA9IHdpbi0+d2luZGF0YTsKIAlzdHJ1Y3QgczNjX2ZiICpzZmIgPSB3aW4tPnBhcmVudDsKIAogCWRldl9kYmcoc2ZiLT5kZXYsICJjaGVja2luZyBwYXJhbWV0ZXJzXG4iKTsKIAotCXZhci0+eHJlc192aXJ0dWFsID0gbWF4KCh1bnNpZ25lZCBpbnQpd2luZGF0YS0+dmlydHVhbF94LCB2YXItPnhyZXMpOwotCXZhci0+eXJlc192aXJ0dWFsID0gbWF4KCh1bnNpZ25lZCBpbnQpd2luZGF0YS0+dmlydHVhbF95LCB2YXItPnlyZXMpOworCXZhci0+eHJlc192aXJ0dWFsID0gbWF4KHZhci0+eHJlc192aXJ0dWFsLCB2YXItPnhyZXMpOworCXZhci0+eXJlc192aXJ0dWFsID0gbWF4KHZhci0+eXJlc192aXJ0dWFsLCB2YXItPnlyZXMpOwogCiAJaWYgKCFzM2NfZmJfdmFsaWRhdGVfd2luX2JwcCh3aW4sIHZhci0+Yml0c19wZXJfcGl4ZWwpKSB7CiAJCWRldl9kYmcoc2ZiLT5kZXYsICJ3aW4gJWQ6IHVuc3VwcG9ydGVkIGJwcCAlZFxuIiwKQEAgLTU1OCw2ICs1NTcsMTMgQEAKIAl2aWRvc2Rfc2V0X2FscGhhKHdpbiwgYWxwaGEpOwogCXZpZG9zZF9zZXRfc2l6ZSh3aW4sIGRhdGEpOwogCisJLyogRW5hYmxlIERNQSBjaGFubmVsIGZvciB0aGlzIHdpbmRvdyAqLworCWlmIChzZmItPnZhcmlhbnQuaGFzX3NoYWRvd2NvbikgeworCQlkYXRhID0gcmVhZGwoc2ZiLT5yZWdzICsgU0hBRE9XQ09OKTsKKwkJZGF0YSB8PSBTSEFET1dDT05fQ0h4X0VOQUJMRSh3aW5fbm8pOworCQl3cml0ZWwoZGF0YSwgc2ZiLT5yZWdzICsgU0hBRE9XQ09OKTsKKwl9CisKIAlkYXRhID0gV0lOQ09OeF9FTldJTjsKIAogCS8qIG5vdGUsIHNpbmNlIHdlIGhhdmUgdG8gcm91bmQgdXAgdGhlIGJpdHMtcGVyLXBpeGVsLCB3ZSBlbmQgdXAKQEAgLTYzNywxMyArNjQzLDYgQEAKIAl3cml0ZWwoZGF0YSwgcmVncyArIHNmYi0+dmFyaWFudC53aW5jb24gKyAod2luX25vICogNCkpOwogCXdyaXRlbCgweDAsIHJlZ3MgKyBzZmItPnZhcmlhbnQud2lubWFwICsgKHdpbl9ubyAqIDQpKTsKIAotCS8qIEVuYWJsZSBETUEgY2hhbm5lbCBmb3IgdGhpcyB3aW5kb3cgKi8KLQlpZiAoc2ZiLT52YXJpYW50Lmhhc19zaGFkb3djb24pIHsKLQkJZGF0YSA9IHJlYWRsKHNmYi0+cmVncyArIFNIQURPV0NPTik7Ci0JCWRhdGEgfD0gU0hBRE9XQ09OX0NIeF9FTkFCTEUod2luX25vKTsKLQkJd3JpdGVsKGRhdGEsIHNmYi0+cmVncyArIFNIQURPV0NPTik7Ci0JfQotCiAJc2hhZG93X3Byb3RlY3Rfd2luKHdpbiwgMCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE0ODcsMTEgKzE0ODYsMTAgQEAKIAogCXJlbGVhc2VfbWVtX3JlZ2lvbihzZmItPnJlZ3NfcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShzZmItPnJlZ3NfcmVzKSk7CiAKLQlrZnJlZShzZmIpOwotCiAJcG1fcnVudGltZV9wdXRfc3luYyhzZmItPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKHNmYi0+ZGV2KTsKIAorCWtmcmVlKHNmYik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jIGIvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfZHJpdmVyLmMKaW5kZXggM2I3ZjJmNS4uNGRlNTQxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfZHJpdmVyLmMKKysrIGIvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfZHJpdmVyLmMKQEAgLTIyMzcsNiArMjIzNywyMiBAQAogCQkJCSAmaW5mby0+bW9kZWxpc3QpOwogI2VuZGlmCiAJaW5mby0+dmFyID0gc2F2YWdlZmJfdmFyODAweDYwMHg4OworCS8qIGlmIGEgcGFuZWwgd2FzIGRldGVjdGVkLCBkZWZhdWx0IHRvIGEgQ1ZUIG1vZGUgaW5zdGVhZCAqLworCWlmIChwYXItPlNhdmFnZVBhbmVsV2lkdGgpIHsKKwkJc3RydWN0IGZiX3ZpZGVvbW9kZSBjdnRfbW9kZTsKKworCQltZW1zZXQoJmN2dF9tb2RlLCAwLCBzaXplb2YoY3Z0X21vZGUpKTsKKwkJY3Z0X21vZGUueHJlcyA9IHBhci0+U2F2YWdlUGFuZWxXaWR0aDsKKwkJY3Z0X21vZGUueXJlcyA9IHBhci0+U2F2YWdlUGFuZWxIZWlnaHQ7CisJCWN2dF9tb2RlLnJlZnJlc2ggPSA2MDsKKwkJLyogRklYTUU6IGlmIHdlIGtub3cgdGhlcmUgaXMgb25seSB0aGUgcGFuZWwKKwkJICogd2UgY2FuIGVuYWJsZSByZWR1Y2VkIGJsYW5raW5nIGFzIHdlbGwgKi8KKwkJaWYgKGZiX2ZpbmRfbW9kZV9jdnQoJmN2dF9tb2RlLCAwLCAwKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIENWVCBtb2RlIGZvdW5kIGZvciBwYW5lbFxuIik7CisJCWVsc2UgaWYgKGZiX2ZpbmRfbW9kZSgmaW5mby0+dmFyLCBpbmZvLCBOVUxMLCBOVUxMLCAwLAorCQkJCSAgICAgICZjdnRfbW9kZSwgMCkgIT0gMykKKwkJCWluZm8tPnZhciA9IHNhdmFnZWZiX3ZhcjgwMHg2MDB4ODsKKwl9CiAKIAlpZiAobW9kZV9vcHRpb24pIHsKIAkJZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIG1vZGVfb3B0aW9uLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfaGRtaS5jIGIvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfaGRtaS5jCmluZGV4IDZhZTQwYjYuLjdkNTRlMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2hkbWkuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9oZG1pLmMKQEAgLTExMjcsMjMgKzExMjcsMTYgQEAKIAkJc3RydWN0IGZiX2luZm8gKmluZm8gPSBoZG1pLT5pbmZvOwogCQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gMCwgaGRtaV9yYXRlOwogCi0JCS8qIEEgZGV2aWNlIGhhcyBiZWVuIHBsdWdnZWQgaW4gKi8KLQkJcG1fcnVudGltZV9nZXRfc3luYyhoZG1pLT5kZXYpOwotCiAJCXJldCA9IHNoX2hkbWlfcmVhZF9lZGlkKGhkbWksICZoZG1pX3JhdGUsICZwYXJlbnRfcmF0ZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwbV9ydW50aW1lX3B1dChoZG1pLT5kZXYpOworCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwotCQl9CiAKIAkJaGRtaS0+aHBfc3RhdGUgPSBIRE1JX0hPVFBMVUdfRURJRF9ET05FOwogCiAJCS8qIFJlY29uZmlndXJlIHRoZSBjbG9jayAqLwogCQlyZXQgPSBzaF9oZG1pX2Nsa19jb25maWd1cmUoaGRtaSwgaGRtaV9yYXRlLCBwYXJlbnRfcmF0ZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwbV9ydW50aW1lX3B1dChoZG1pLT5kZXYpOworCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwotCQl9CiAKIAkJbXNsZWVwKDEwKTsKIAkJc2hfaGRtaV9jb25maWd1cmUoaGRtaSk7CkBAIC0xMTkxLDcgKzExODQsNiBAQAogCQlmYl9zZXRfc3VzcGVuZChoZG1pLT5pbmZvLCAxKTsKIAogCQljb25zb2xlX3VubG9jaygpOwotCQlwbV9ydW50aW1lX3B1dChoZG1pLT5kZXYpOwogCX0KIAogb3V0OgpAQCAtMTMxMiw3ICsxMzA0LDcgQEAKIAlJTklUX0RFTEFZRURfV09SSygmaGRtaS0+ZWRpZF93b3JrLCBzaF9oZG1pX2VkaWRfd29ya19mbik7CiAKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKLQlwbV9ydW50aW1lX3Jlc3VtZSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKCZwZGV2LT5kZXYpOwogCiAJLyogUHJvZHVjdCBhbmQgcmV2aXNpb24gSURzIGFyZSAwIGluIHNoLW1vYmlsZSB2ZXJzaW9uICovCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIkRldGVjdGVkIEhETUkgY29udHJvbGxlciAweCV4OjB4JXhcbiIsCkBAIC0xMzQwLDcgKzEzMzIsNyBAQAogZWNvZGVjOgogCWZyZWVfaXJxKGlycSwgaGRtaSk7CiBlcmVxaXJxOgotCXBtX3J1bnRpbWVfc3VzcGVuZCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dCgmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAJaW91bm1hcChoZG1pLT5iYXNlKTsKIGVtYXA6CkBAIC0xMzc3LDcgKzEzNjksNyBAQAogCWZyZWVfaXJxKGlycSwgaGRtaSk7CiAJLyogV2FpdCBmb3IgYWxyZWFkeSBzY2hlZHVsZWQgd29yayAqLwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaGRtaS0+ZWRpZF93b3JrKTsKLQlwbV9ydW50aW1lX3N1c3BlbmQoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCWNsa19kaXNhYmxlKGhkbWktPmhkbWlfY2xrKTsKIAljbGtfcHV0KGhkbWktPmhkbWlfY2xrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5jIGIvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbGNkY2ZiLmMKaW5kZXggNDA0YzAzYi4uMDE5ZGJkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbGNkY2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbGNkY2ZiLmMKQEAgLTQ3MCw3ICs0NzAsNyBAQAogCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCBicHAgPSAwOwogCXVuc2lnbmVkIGxvbmcgbGRkZHNyOwotCWludCBrLCBtOworCWludCBrLCBtLCByZXQ7CiAKIAkvKiBlbmFibGUgY2xvY2tzIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIGhhcmR3YXJlICovCiAJZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUocHJpdi0+Y2gpOyBrKyspIHsKQEAgLTU0MCw3ICs1NDAsNyBAQAogCiAJCWJvYXJkX2NmZyA9ICZjaC0+Y2ZnLmJvYXJkX2NmZzsKIAkJaWYgKGJvYXJkX2NmZy0+c2V0dXBfc3lzKSB7Ci0JCQlpbnQgcmV0ID0gYm9hcmRfY2ZnLT5zZXR1cF9zeXMoYm9hcmRfY2ZnLT5ib2FyZF9kYXRhLAorCQkJcmV0ID0gYm9hcmRfY2ZnLT5zZXR1cF9zeXMoYm9hcmRfY2ZnLT5ib2FyZF9kYXRhLAogCQkJCQkJY2gsICZzaF9tb2JpbGVfbGNkY19zeXNfYnVzX29wcyk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9tZXJhbS5jIGIvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbWVyYW0uYwppbmRleCA5MTcwYzgyLi5jYzdkNzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9tZXJhbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX21lcmFtLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCQlpY2Jfb2Zmc2V0ID0gMHhjMDAwMDAwMCB8IChjZmctPmN1cnJlbnRfcmVnIDw8IDIzKTsKIAogCSppY2JfYWRkcl95ID0gaWNiX29mZnNldCB8IChjZmctPmljYlswXS5tYXJrZXJfaWNiIDw8IDI0KTsKLQlpZiAoKCppY2JfYWRkcl9jKSAmJiBpc19udmNvbG9yKGNmZy0+cGl4ZWxmb3JtYXQpKQorCWlmIChpc19udmNvbG9yKGNmZy0+cGl4ZWxmb3JtYXQpKQogCQkqaWNiX2FkZHJfYyA9IGljYl9vZmZzZXQgfCAoY2ZnLT5pY2JbMV0ubWFya2VyX2ljYiA8PCAyNCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jIGIvZHJpdmVycy92aWRlby9zbTUwMWZiLmMKaW5kZXggODdmMGJlMS4uNjI5NGRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zbTUwMWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zbTUwMWZiLmMKQEAgLTE2NjQsNyArMTY2NCw3IEBACiAJCQkgICByZXNvdXJjZV9zaXplKGluZm8tPnJlZ3NfcmVzKSk7CiB9CiAKLXN0YXRpYyBpbnQgc201MDFmYl9pbml0X2ZiKHN0cnVjdCBmYl9pbmZvICpmYiwKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNtNTAxZmJfaW5pdF9mYihzdHJ1Y3QgZmJfaW5mbyAqZmIsCiAJCQkgICBlbnVtIHNtNTAxX2NvbnRyb2xsZXIgaGVhZCwKIAkJCSAgIGNvbnN0IGNoYXIgKmZibmFtZSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdWRsZmIuYyBiL2RyaXZlcnMvdmlkZW8vdWRsZmIuYwppbmRleCA1MmIwZjNlLi4wODdmYzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3VkbGZiLmMKKysrIGIvZHJpdmVycy92aWRlby91ZGxmYi5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogI2luY2x1ZGUgPHZpZGVvL3VkbGZiLmg+CiAjaW5jbHVkZSAiZWRpZC5oIgogCkBAIC0xMjMzLDggKzEyMzIsMTIgQEAKIAkJCWlmIChkbGZiX2lzX3ZhbGlkX21vZGUoJmluZm8tPm1vbnNwZWNzLm1vZGVkYltpXSwgaW5mbykpCiAJCQkJZmJfYWRkX3ZpZGVvbW9kZSgmaW5mby0+bW9uc3BlY3MubW9kZWRiW2ldLAogCQkJCQkmaW5mby0+bW9kZWxpc3QpOwotCQkJZWxzZSAvKiBpZiB3ZSd2ZSByZW1vdmVkIHRvcC9iZXN0IG1vZGUgKi8KLQkJCQlpbmZvLT5tb25zcGVjcy5taXNjICY9IH5GQl9NSVNDXzFTVF9ERVRBSUw7CisJCQllbHNlIHsKKwkJCQlpZiAoaSA9PSAwKQorCQkJCQkvKiBpZiB3ZSd2ZSByZW1vdmVkIHRvcC9iZXN0IG1vZGUgKi8KKwkJCQkJaW5mby0+bW9uc3BlY3MubWlzYworCQkJCQkJJj0gfkZCX01JU0NfMVNUX0RFVEFJTDsKKwkJCX0KIAkJfQogCiAJCWRlZmF1bHRfdm1vZGUgPSBmYl9maW5kX2Jlc3RfZGlzcGxheSgmaW5mby0+bW9uc3BlY3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Zlc2FmYi5jIGIvZHJpdmVycy92aWRlby92ZXNhZmIuYwppbmRleCBhOTliYmU4Li41MDFiMzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Zlc2FmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMKQEAgLTE3NSw2ICsxNzUsNyBAQAogCiBzdGF0aWMgdm9pZCB2ZXNhZmJfZGVzdHJveShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwogCWlmIChpbmZvLT5zY3JlZW5fYmFzZSkKIAkJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLmJhc2UsIGluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLnNpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92Z2ExNmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYwppbmRleCA1M2IyYzVhLi4zMDVjOTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYwpAQCAtMTI2NSw5ICsxMjY1LDExIEBACiAKIHN0YXRpYyB2b2lkIHZnYTE2ZmJfZGVzdHJveShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2YoaW5mby0+ZGV2aWNlLCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOwogCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwogCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAJLyogWFhYIHVuc2hhcmUgVkdBIHJlZ2lvbnMgKi8KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYWZiZGV2LmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jCmluZGV4IGNmNDNjODAuLjUzYWE0NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYWZiZGV2LmMKKysrIGIvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYwpAQCAtMjAxNiw3ICsyMDE2LDcgQEAKIGludCBfX2luaXQgdmlhZmJfaW5pdCh2b2lkKQogewogCXUzMiBkdW1teV94LCBkdW1teV95OwotCWludCByOworCWludCByID0gMDsKIAogCWlmIChtYWNoaW5lX2lzX29scGMoKSkKIAkJLyogQXBwbHkgWE8tMS41LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICovCkBAIC0yMDM5LDcgKzIwMzksNyBAQAogCXByaW50ayhLRVJOX0lORk8KICAgICAgICAiVklBIEdyYXBoaWNzIEludGVncmF0aW9uIENoaXBzZXQgZnJhbWVidWZmZXIgJWQuJWQgaW5pdGlhbGl6aW5nXG4iLAogCSAgICAgICBWRVJTSU9OX01BSk9SLCBWRVJTSU9OX01JTk9SKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcjsKIH0KIAogdm9pZCBfX2V4aXQgdmlhZmJfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jIGIvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCmluZGV4IGEyMDIxOGMuLmJlYWM1MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYworKysgYi9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKQEAgLTM5NSwxMCArMzk1LDkgQEAKIAlzcGluX2xvY2tfaW5pdCgmaW5mby0+ZGlydHlfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmluZm8tPnJlc2l6ZV9sb2NrKTsKIAotCWluZm8tPmZiID0gdm1hbGxvYyhmYl9zaXplKTsKKwlpbmZvLT5mYiA9IHZ6YWxsb2MoZmJfc2l6ZSk7CiAJaWYgKGluZm8tPmZiID09IE5VTEwpCiAJCWdvdG8gZXJyb3Jfbm9tZW07Ci0JbWVtc2V0KGluZm8tPmZiLCAwLCBmYl9zaXplKTsKIAogCWluZm8tPm5yX3BhZ2VzID0gKGZiX3NpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnQvS2NvbmZpZyBiL2RyaXZlcnMvdmlydC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2RiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpcnQvS2NvbmZpZwpAQCAtMCwwICsxLDMyIEBACisjCisjIFZpcnR1YWxpemF0aW9uIHN1cHBvcnQgZHJpdmVycworIworCittZW51Y29uZmlnIFZJUlRfRFJJVkVSUworCWJvb2wgIlZpcnR1YWxpemF0aW9uIGRyaXZlcnMiCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBnZXQgdG8gc2VlIG9wdGlvbnMgZm9yIGRldmljZSBkcml2ZXJzIHRoYXQgc3VwcG9ydAorCSAgdmlydHVhbGl6YXRpb24gZW52aXJvbm1lbnRzLgorCisJICBJZiB5b3Ugc2F5IE4sIGFsbCBvcHRpb25zIGluIHRoaXMgc3VibWVudSB3aWxsIGJlIHNraXBwZWQgYW5kIGRpc2FibGVkLgorCitpZiBWSVJUX0RSSVZFUlMKKworY29uZmlnIEZTTF9IVl9NQU5BR0VSCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBoeXBlcnZpc29yIG1hbmFnZW1lbnQgZHJpdmVyIgorCWRlcGVuZHMgb24gRlNMX1NPQworCWhlbHAKKyAgICAgICAgICBUaGUgRnJlZXNjYWxlIGh5cGVydmlzb3IgbWFuYWdlbWVudCBkcml2ZXIgcHJvdmlkZXMgc2V2ZXJhbCBzZXJ2aWNlcworCSAgdG8gZHJpdmVycyBhbmQgYXBwbGljYXRpb25zIHJlbGF0ZWQgdG8gdGhlIEZyZWVzY2FsZSBoeXBlcnZpc29yOgorCisgICAgICAgICAgMSkgQW4gaW9jdGwgaW50ZXJmYWNlIGZvciBxdWVyeWluZyBhbmQgbWFuYWdpbmcgcGFydGl0aW9ucy4KKworICAgICAgICAgIDIpIEEgZmlsZSBpbnRlcmZhY2UgdG8gcmVhZGluZyBpbmNvbWluZyBkb29yYmVsbHMuCisKKyAgICAgICAgICAzKSBBbiBpbnRlcnJ1cHQgaGFuZGxlciBmb3Igc2h1dHRpbmcgZG93biB0aGUgcGFydGl0aW9uIHVwb24KKwkgICAgIHJlY2VpdmluZyB0aGUgc2h1dGRvd24gZG9vcmJlbGwgZnJvbSBhIG1hbmFnZXIgcGFydGl0aW9uLgorCisgICAgICAgICAgNCkgQSBrZXJuZWwgaW50ZXJmYWNlIGZvciByZWNlaXZpbmcgY2FsbGJhY2tzIHdoZW4gYSBtYW5hZ2VkCisJICAgICBwYXJ0aXRpb24gc2h1dHMgZG93bi4KKworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlydC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDdmMDRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aXJ0L01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgZHJpdmVycyB0aGF0IHN1cHBvcnQgdmlydHVhbGl6YXRpb24KKyMKKworb2JqLSQoQ09ORklHX0ZTTF9IVl9NQU5BR0VSKQkrPSBmc2xfaHlwZXJ2aXNvci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnQvZnNsX2h5cGVydmlzb3IuYyBiL2RyaXZlcnMvdmlydC9mc2xfaHlwZXJ2aXNvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTE2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpcnQvZnNsX2h5cGVydmlzb3IuYwpAQCAtMCwwICsxLDkzOCBAQAorLyoKKyAqIEZyZWVzY2FsZSBIeXBlcnZpc29yIE1hbmFnZW1lbnQgRHJpdmVyCisKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBBdXRob3I6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKgorICogVGhlIEZyZWVzY2FsZSBoeXBlcnZpc29yIG1hbmFnZW1lbnQgZHJpdmVyIHByb3ZpZGVzIHNldmVyYWwgc2VydmljZXMgdG8KKyAqIGRyaXZlcnMgYW5kIGFwcGxpY2F0aW9ucyByZWxhdGVkIHRvIHRoZSBGcmVlc2NhbGUgaHlwZXJ2aXNvcjoKKyAqCisgKiAxLiBBbiBpb2N0bCBpbnRlcmZhY2UgZm9yIHF1ZXJ5aW5nIGFuZCBtYW5hZ2luZyBwYXJ0aXRpb25zLgorICoKKyAqIDIuIEEgZmlsZSBpbnRlcmZhY2UgdG8gcmVhZGluZyBpbmNvbWluZyBkb29yYmVsbHMuCisgKgorICogMy4gQW4gaW50ZXJydXB0IGhhbmRsZXIgZm9yIHNodXR0aW5nIGRvd24gdGhlIHBhcnRpdGlvbiB1cG9uIHJlY2VpdmluZyB0aGUKKyAqICAgIHNodXRkb3duIGRvb3JiZWxsIGZyb20gYSBtYW5hZ2VyIHBhcnRpdGlvbi4KKyAqCisgKiA0LiBBIGtlcm5lbCBpbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBjYWxsYmFja3Mgd2hlbiBhIG1hbmFnZWQgcGFydGl0aW9uCisgKiAgICBzaHV0cyBkb3duLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9mc2xfaGNhbGxzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mc2xfaHlwZXJ2aXNvci5oPgorCitzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChmYWlsb3Zlcl9zdWJzY3JpYmVycyk7CisKKy8qCisgKiBJb2N0bCBpbnRlcmZhY2UgZm9yIEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fUkVTVEFSVAorICoKKyAqIFJlc3RhcnQgYSBydW5uaW5nIHBhcnRpdGlvbgorICovCitzdGF0aWMgbG9uZyBpb2N0bF9yZXN0YXJ0KHN0cnVjdCBmc2xfaHZfaW9jdGxfcmVzdGFydCBfX3VzZXIgKnApCit7CisJc3RydWN0IGZzbF9odl9pb2N0bF9yZXN0YXJ0IHBhcmFtOworCisJLyogR2V0IHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHVzZXIgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnBhcmFtLCBwLCBzaXplb2Yoc3RydWN0IGZzbF9odl9pb2N0bF9yZXN0YXJ0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcGFyYW0ucmV0ID0gZmhfcGFydGl0aW9uX3Jlc3RhcnQocGFyYW0ucGFydGl0aW9uKTsKKworCWlmIChjb3B5X3RvX3VzZXIoJnAtPnJldCwgJnBhcmFtLnJldCwgc2l6ZW9mKF9fdTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJb2N0bCBpbnRlcmZhY2UgZm9yIEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fU1RBVFVTCisgKgorICogUXVlcnkgdGhlIHN0YXR1cyBvZiBhIHBhcnRpdGlvbgorICovCitzdGF0aWMgbG9uZyBpb2N0bF9zdGF0dXMoc3RydWN0IGZzbF9odl9pb2N0bF9zdGF0dXMgX191c2VyICpwKQoreworCXN0cnVjdCBmc2xfaHZfaW9jdGxfc3RhdHVzIHBhcmFtOworCXUzMiBzdGF0dXM7CisKKwkvKiBHZXQgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgdXNlciAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW0sIHAsIHNpemVvZihzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0YXR1cykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXBhcmFtLnJldCA9IGZoX3BhcnRpdGlvbl9nZXRfc3RhdHVzKHBhcmFtLnBhcnRpdGlvbiwgJnN0YXR1cyk7CisJaWYgKCFwYXJhbS5yZXQpCisJCXBhcmFtLnN0YXR1cyA9IHN0YXR1czsKKworCWlmIChjb3B5X3RvX3VzZXIocCwgJnBhcmFtLCBzaXplb2Yoc3RydWN0IGZzbF9odl9pb2N0bF9zdGF0dXMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElvY3RsIGludGVyZmFjZSBmb3IgRlNMX0hWX0lPQ1RMX1BBUlRJVElPTl9TVEFSVAorICoKKyAqIFN0YXJ0IGEgc3RvcHBlZCBwYXJ0aXRpb24uCisgKi8KK3N0YXRpYyBsb25nIGlvY3RsX3N0YXJ0KHN0cnVjdCBmc2xfaHZfaW9jdGxfc3RhcnQgX191c2VyICpwKQoreworCXN0cnVjdCBmc2xfaHZfaW9jdGxfc3RhcnQgcGFyYW07CisKKwkvKiBHZXQgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgdXNlciAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW0sIHAsIHNpemVvZihzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0YXJ0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcGFyYW0ucmV0ID0gZmhfcGFydGl0aW9uX3N0YXJ0KHBhcmFtLnBhcnRpdGlvbiwgcGFyYW0uZW50cnlfcG9pbnQsCisJCQkJICAgICAgIHBhcmFtLmxvYWQpOworCisJaWYgKGNvcHlfdG9fdXNlcigmcC0+cmV0LCAmcGFyYW0ucmV0LCBzaXplb2YoX191MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElvY3RsIGludGVyZmFjZSBmb3IgRlNMX0hWX0lPQ1RMX1BBUlRJVElPTl9TVE9QCisgKgorICogU3RvcCBhIHJ1bm5pbmcgcGFydGl0aW9uCisgKi8KK3N0YXRpYyBsb25nIGlvY3RsX3N0b3Aoc3RydWN0IGZzbF9odl9pb2N0bF9zdG9wIF9fdXNlciAqcCkKK3sKKwlzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0b3AgcGFyYW07CisKKwkvKiBHZXQgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgdXNlciAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW0sIHAsIHNpemVvZihzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0b3ApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlwYXJhbS5yZXQgPSBmaF9wYXJ0aXRpb25fc3RvcChwYXJhbS5wYXJ0aXRpb24pOworCisJaWYgKGNvcHlfdG9fdXNlcigmcC0+cmV0LCAmcGFyYW0ucmV0LCBzaXplb2YoX191MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElvY3RsIGludGVyZmFjZSBmb3IgRlNMX0hWX0lPQ1RMX01FTUNQWQorICoKKyAqIFRoZSBGSF9NRU1DUFkgaHlwZXJjYWxsIHRha2VzIGFuIGFycmF5IG9mIGFkZHJlc3MvYWRkcmVzcy9zaXplIHN0cnVjdHVyZXMKKyAqIHRvIHJlcHJlc2VudCB0aGUgZGF0YSBiZWluZyBjb3BpZWQuICBBcyBhIGNvbnZlbmllbmNlIHRvIHRoZSB1c2VyLCB0aGlzCisgKiBpb2N0bCB0YWtlcyBhIHVzZXItY3JlYXRlIGJ1ZmZlciBhbmQgYSBwb2ludGVyIHRvIGEgZ3Vlc3QgcGh5c2ljYWxseQorICogY29udGlndW91cyBidWZmZXIgaW4gdGhlIHJlbW90ZSBwYXJ0aXRpb24sIGFuZCBjcmVhdGVzIHRoZQorICogYWRkcmVzcy9hZGRyZXNzL3NpemUgYXJyYXkgZm9yIHRoZSBoeXBlcmNhbGwuCisgKi8KK3N0YXRpYyBsb25nIGlvY3RsX21lbWNweShzdHJ1Y3QgZnNsX2h2X2lvY3RsX21lbWNweSBfX3VzZXIgKnApCit7CisJc3RydWN0IGZzbF9odl9pb2N0bF9tZW1jcHkgcGFyYW07CisKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKKwl2b2lkICpzZ19saXN0X3VuYWxpZ25lZCA9IE5VTEw7CisJc3RydWN0IGZoX3NnX2xpc3QgKnNnX2xpc3QgPSBOVUxMOworCisJdW5zaWduZWQgaW50IG51bV9wYWdlczsKKwl1bnNpZ25lZCBsb25nIGxiX29mZnNldDsgLyogT2Zmc2V0IHdpdGhpbiBhIHBhZ2Ugb2YgdGhlIGxvY2FsIGJ1ZmZlciAqLworCisJdW5zaWduZWQgaW50IGk7CisJbG9uZyByZXQgPSAwOworCWludCBudW1fcGlubmVkOyAvKiByZXR1cm4gdmFsdWUgZnJvbSBnZXRfdXNlcl9wYWdlcygpICovCisJcGh5c19hZGRyX3QgcmVtb3RlX3BhZGRyOyAvKiBUaGUgbmV4dCBhZGRyZXNzIGluIHRoZSByZW1vdGUgYnVmZmVyICovCisJdWludDMyX3QgY291bnQ7IC8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byBjb3B5ICovCisKKwkvKiBHZXQgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgdXNlciAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW0sIHAsIHNpemVvZihzdHJ1Y3QgZnNsX2h2X2lvY3RsX21lbWNweSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qCisJICogT25lIHBhcnRpdGlvbiBtdXN0IGJlIGxvY2FsLCB0aGUgb3RoZXIgbXVzdCBiZSByZW1vdGUuICBJbiBvdGhlcgorCSAqIHdvcmRzLCBpZiBzb3VyY2UgYW5kIHRhcmdldCBhcmUgYm90aCAtMSwgb3IgYXJlIGJvdGggbm90IC0xLCB0aGVuCisJICogcmV0dXJuIGFuIGVycm9yLgorCSAqLworCWlmICgocGFyYW0uc291cmNlID09IC0xKSA9PSAocGFyYW0udGFyZ2V0ID09IC0xKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIFRoZSBhcnJheSBvZiBwYWdlcyByZXR1cm5lZCBieSBnZXRfdXNlcl9wYWdlcygpIGNvdmVycyBvbmx5CisJICogcGFnZS1hbGlnbmVkIG1lbW9yeS4gIFNpbmNlIHRoZSB1c2VyIGJ1ZmZlciBpcyBwcm9iYWJseSBub3QKKwkgKiBwYWdlLWFsaWduZWQsIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBkaXNjcmVwYW5jeS4KKwkgKgorCSAqIFdlIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IHdpdGhpbiBhIHBhZ2Ugb2YgdGhlIFMvRyBsaXN0LCBhbmQgbWFrZQorCSAqIGFkanVzdG1lbnRzIGFjY29yZGluZ2x5LiAgVGhpcyB3aWxsIHJlc3VsdCBpbiBhIHBhZ2UgbGlzdCB0aGF0IGxvb2tzCisJICogbGlrZSB0aGlzOgorCSAqCisJICogICAgICAtLS0tICAgIDwtLSBmaXJzdCBwYWdlIHN0YXJ0cyBiZWZvcmUgdGhlIGJ1ZmZlcgorCSAqICAgICB8ICAgIHwKKwkgKiAgICAgfC8vLy98LT4gLS0tLQorCSAqICAgICB8Ly8vL3wgIHwgICAgfAorCSAqICAgICAgLS0tLSAgIHwgICAgfAorCSAqICAgICAgICAgICAgIHwgICAgfAorCSAqICAgICAgLS0tLSAgIHwgICAgfAorCSAqICAgICB8Ly8vL3wgIHwgICAgfAorCSAqICAgICB8Ly8vL3wgIHwgICAgfAorCSAqICAgICB8Ly8vL3wgIHwgICAgfAorCSAqICAgICAgLS0tLSAgIHwgICAgfAorCSAqICAgICAgICAgICAgIHwgICAgfAorCSAqICAgICAgLS0tLSAgIHwgICAgfAorCSAqICAgICB8Ly8vL3wgIHwgICAgfAorCSAqICAgICB8Ly8vL3wgIHwgICAgfAorCSAqICAgICB8Ly8vL3wgIHwgICAgfAorCSAqICAgICAgLS0tLSAgIHwgICAgfAorCSAqICAgICAgICAgICAgIHwgICAgfAorCSAqICAgICAgLS0tLSAgIHwgICAgfAorCSAqICAgICB8Ly8vL3wgIHwgICAgfAorCSAqICAgICB8Ly8vL3wtPiAtLS0tCisJICogICAgIHwgICAgfCAgIDwtLSBsYXN0IHBhZ2UgZW5kcyBhZnRlciB0aGUgYnVmZmVyCisJICogICAgICAtLS0tCisJICoKKwkgKiBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IHBhZ2UgYW5kIHRoZSBzdGFydCBvZiB0aGUKKwkgKiBidWZmZXIgaXMgbGJfb2Zmc2V0LiAgVGhlIGhhc2hlZCAoLy8vKSBhcmVhcyBhcmUgdGhlIHBhcnRzIG9mIHRoZQorCSAqIHBhZ2UgbGlzdCB0aGF0IGNvbnRhaW4gdGhlIGFjdHVhbCBidWZmZXIuCisJICoKKwkgKiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCB0aGUgbnVtYmVyIG9mIHBhZ2VzIGlzCisJICogZXF1YWwgdG8gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBTL0cgbGlzdCB0aGF0IHdlIGdpdmUgdG8gdGhlCisJICogaHlwZXJ2aXNvci4KKwkgKi8KKwlsYl9vZmZzZXQgPSBwYXJhbS5sb2NhbF92YWRkciAmIChQQUdFX1NJWkUgLSAxKTsKKwludW1fcGFnZXMgPSAocGFyYW0uY291bnQgKyBsYl9vZmZzZXQgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCisJLyogQWxsb2NhdGUgdGhlIGJ1ZmZlcnMgd2UgbmVlZCAqLworCisJLyoKKwkgKiAncGFnZXMnIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBwYWdlIHBvaW50ZXJzIHRoYXQncyBpbml0aWFsaXplZCBieQorCSAqIGdldF91c2VyX3BhZ2VzKCkuCisJICovCisJcGFnZXMgPSBremFsbG9jKG51bV9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlcykgeworCQlwcl9kZWJ1ZygiZnNsLWh2OiBjb3VsZCBub3QgYWxsb2NhdGUgcGFnZSBsaXN0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBzZ19saXN0IGlzIHRoZSBsaXN0IG9mIGZoX3NnX2xpc3Qgb2JqZWN0cyB0aGF0IHdlIHBhc3MgdG8gdGhlCisJICogaHlwZXJ2aXNvci4KKwkgKi8KKwlzZ19saXN0X3VuYWxpZ25lZCA9IGttYWxsb2MobnVtX3BhZ2VzICogc2l6ZW9mKHN0cnVjdCBmaF9zZ19saXN0KSArCisJCXNpemVvZihzdHJ1Y3QgZmhfc2dfbGlzdCkgLSAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNnX2xpc3RfdW5hbGlnbmVkKSB7CisJCXByX2RlYnVnKCJmc2wtaHY6IGNvdWxkIG5vdCBhbGxvY2F0ZSBTL0cgbGlzdFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJc2dfbGlzdCA9IFBUUl9BTElHTihzZ19saXN0X3VuYWxpZ25lZCwgc2l6ZW9mKHN0cnVjdCBmaF9zZ19saXN0KSk7CisKKwkvKiBHZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiB0aGUgc291cmNlIGJ1ZmZlciAqLworCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwludW1fcGlubmVkID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sCisJCXBhcmFtLmxvY2FsX3ZhZGRyIC0gbGJfb2Zmc2V0LCBudW1fcGFnZXMsCisJCShwYXJhbS5zb3VyY2UgPT0gLTEpID8gUkVBRCA6IFdSSVRFLAorCQkwLCBwYWdlcywgTlVMTCk7CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCWlmIChudW1fcGlubmVkICE9IG51bV9wYWdlcykgeworCQkvKiBnZXRfdXNlcl9wYWdlcygpIGZhaWxlZCAqLworCQlwcl9kZWJ1ZygiZnNsLWh2OiBjb3VsZCBub3QgbG9jayBzb3VyY2UgYnVmZmVyXG4iKTsKKwkJcmV0ID0gKG51bV9waW5uZWQgPCAwKSA/IG51bV9waW5uZWQgOiAtRUZBVUxUOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyoKKwkgKiBCdWlsZCB0aGUgZmhfc2dfbGlzdFtdIGFycmF5LiAgVGhlIGZpcnN0IHBhZ2UgaXMgc3BlY2lhbAorCSAqIGJlY2F1c2UgaXQncyBtaXNhbGlnbmVkLgorCSAqLworCWlmIChwYXJhbS5zb3VyY2UgPT0gLTEpIHsKKwkJc2dfbGlzdFswXS5zb3VyY2UgPSBwYWdlX3RvX3BoeXMocGFnZXNbMF0pICsgbGJfb2Zmc2V0OworCQlzZ19saXN0WzBdLnRhcmdldCA9IHBhcmFtLnJlbW90ZV9wYWRkcjsKKwl9IGVsc2UgeworCQlzZ19saXN0WzBdLnNvdXJjZSA9IHBhcmFtLnJlbW90ZV9wYWRkcjsKKwkJc2dfbGlzdFswXS50YXJnZXQgPSBwYWdlX3RvX3BoeXMocGFnZXNbMF0pICsgbGJfb2Zmc2V0OworCX0KKwlzZ19saXN0WzBdLnNpemUgPSBtaW5fdCh1aW50NjRfdCwgcGFyYW0uY291bnQsIFBBR0VfU0laRSAtIGxiX29mZnNldCk7CisKKwlyZW1vdGVfcGFkZHIgPSBwYXJhbS5yZW1vdGVfcGFkZHIgKyBzZ19saXN0WzBdLnNpemU7CisJY291bnQgPSBwYXJhbS5jb3VudCAtIHNnX2xpc3RbMF0uc2l6ZTsKKworCWZvciAoaSA9IDE7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQlpZiAocGFyYW0uc291cmNlID09IC0xKSB7CisJCQkvKiBsb2NhbCB0byByZW1vdGUgKi8KKwkJCXNnX2xpc3RbaV0uc291cmNlID0gcGFnZV90b19waHlzKHBhZ2VzW2ldKTsKKwkJCXNnX2xpc3RbaV0udGFyZ2V0ID0gcmVtb3RlX3BhZGRyOworCQl9IGVsc2UgeworCQkJLyogcmVtb3RlIHRvIGxvY2FsICovCisJCQlzZ19saXN0W2ldLnNvdXJjZSA9IHJlbW90ZV9wYWRkcjsKKwkJCXNnX2xpc3RbaV0udGFyZ2V0ID0gcGFnZV90b19waHlzKHBhZ2VzW2ldKTsKKwkJfQorCQlzZ19saXN0W2ldLnNpemUgPSBtaW5fdCh1aW50NjRfdCwgY291bnQsIFBBR0VfU0laRSk7CisKKwkJcmVtb3RlX3BhZGRyICs9IHNnX2xpc3RbaV0uc2l6ZTsKKwkJY291bnQgLT0gc2dfbGlzdFtpXS5zaXplOworCX0KKworCXBhcmFtLnJldCA9IGZoX3BhcnRpdGlvbl9tZW1jcHkocGFyYW0uc291cmNlLCBwYXJhbS50YXJnZXQsCisJCXZpcnRfdG9fcGh5cyhzZ19saXN0KSwgbnVtX3BhZ2VzKTsKKworZXhpdDoKKwlpZiAocGFnZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKQorCQkJaWYgKHBhZ2VzW2ldKQorCQkJCXB1dF9wYWdlKHBhZ2VzW2ldKTsKKwl9CisKKwlrZnJlZShzZ19saXN0X3VuYWxpZ25lZCk7CisJa2ZyZWUocGFnZXMpOworCisJaWYgKCFyZXQpCisJCWlmIChjb3B5X3RvX3VzZXIoJnAtPnJldCwgJnBhcmFtLnJldCwgc2l6ZW9mKF9fdTMyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBJb2N0bCBpbnRlcmZhY2UgZm9yIEZTTF9IVl9JT0NUTF9ET09SQkVMTAorICoKKyAqIFJpbmcgYSBkb29yYmVsbAorICovCitzdGF0aWMgbG9uZyBpb2N0bF9kb29yYmVsbChzdHJ1Y3QgZnNsX2h2X2lvY3RsX2Rvb3JiZWxsIF9fdXNlciAqcCkKK3sKKwlzdHJ1Y3QgZnNsX2h2X2lvY3RsX2Rvb3JiZWxsIHBhcmFtOworCisJLyogR2V0IHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHVzZXIuICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJhbSwgcCwgc2l6ZW9mKHN0cnVjdCBmc2xfaHZfaW9jdGxfZG9vcmJlbGwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlwYXJhbS5yZXQgPSBldl9kb29yYmVsbF9zZW5kKHBhcmFtLmRvb3JiZWxsKTsKKworCWlmIChjb3B5X3RvX3VzZXIoJnAtPnJldCwgJnBhcmFtLnJldCwgc2l6ZW9mKF9fdTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGlvY3RsX2R0cHJvcChzdHJ1Y3QgZnNsX2h2X2lvY3RsX3Byb3AgX191c2VyICpwLCBpbnQgc2V0KQoreworCXN0cnVjdCBmc2xfaHZfaW9jdGxfcHJvcCBwYXJhbTsKKwljaGFyIF9fdXNlciAqdXBhdGgsICp1cHJvcG5hbWU7CisJdm9pZCBfX3VzZXIgKnVwcm9wdmFsOworCWNoYXIgKnBhdGggPSBOVUxMLCAqcHJvcG5hbWUgPSBOVUxMOworCXZvaWQgKnByb3B2YWwgPSBOVUxMOworCWludCByZXQgPSAwOworCisJLyogR2V0IHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHVzZXIuICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJhbSwgcCwgc2l6ZW9mKHN0cnVjdCBmc2xfaHZfaW9jdGxfcHJvcCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVwYXRoID0gKGNoYXIgX191c2VyICopKHVpbnRwdHJfdClwYXJhbS5wYXRoOworCXVwcm9wbmFtZSA9IChjaGFyIF9fdXNlciAqKSh1aW50cHRyX3QpcGFyYW0ucHJvcG5hbWU7CisJdXByb3B2YWwgPSAodm9pZCBfX3VzZXIgKikodWludHB0cl90KXBhcmFtLnByb3B2YWw7CisKKwlwYXRoID0gc3RybmR1cF91c2VyKHVwYXRoLCBGSF9EVFBST1BfTUFYX1BBVEhMRU4pOworCWlmIChJU19FUlIocGF0aCkpIHsKKwkJcmV0ID0gUFRSX0VSUihwYXRoKTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJvcG5hbWUgPSBzdHJuZHVwX3VzZXIodXByb3BuYW1lLCBGSF9EVFBST1BfTUFYX1BBVEhMRU4pOworCWlmIChJU19FUlIocHJvcG5hbWUpKSB7CisJCXJldCA9IFBUUl9FUlIocHJvcG5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocGFyYW0ucHJvcGxlbiA+IEZIX0RUUFJPUF9NQVhfUFJPUExFTikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlwcm9wdmFsID0ga21hbGxvYyhwYXJhbS5wcm9wbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByb3B2YWwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHNldCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIocHJvcHZhbCwgdXByb3B2YWwsIHBhcmFtLnByb3BsZW4pKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlwYXJhbS5yZXQgPSBmaF9wYXJ0aXRpb25fc2V0X2R0cHJvcChwYXJhbS5oYW5kbGUsCisJCQkJCQkgICAgdmlydF90b19waHlzKHBhdGgpLAorCQkJCQkJICAgIHZpcnRfdG9fcGh5cyhwcm9wbmFtZSksCisJCQkJCQkgICAgdmlydF90b19waHlzKHByb3B2YWwpLAorCQkJCQkJICAgIHBhcmFtLnByb3BsZW4pOworCX0gZWxzZSB7CisJCXBhcmFtLnJldCA9IGZoX3BhcnRpdGlvbl9nZXRfZHRwcm9wKHBhcmFtLmhhbmRsZSwKKwkJCQkJCSAgICB2aXJ0X3RvX3BoeXMocGF0aCksCisJCQkJCQkgICAgdmlydF90b19waHlzKHByb3BuYW1lKSwKKwkJCQkJCSAgICB2aXJ0X3RvX3BoeXMocHJvcHZhbCksCisJCQkJCQkgICAgJnBhcmFtLnByb3BsZW4pOworCisJCWlmIChwYXJhbS5yZXQgPT0gMCkgeworCQkJaWYgKGNvcHlfdG9fdXNlcih1cHJvcHZhbCwgcHJvcHZhbCwgcGFyYW0ucHJvcGxlbikgfHwKKwkJCSAgICBwdXRfdXNlcihwYXJhbS5wcm9wbGVuLCAmcC0+cHJvcGxlbikpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCisJaWYgKHB1dF91c2VyKHBhcmFtLnJldCwgJnAtPnJldCkpCisJCXJldCA9IC1FRkFVTFQ7CisKK291dDoKKwlrZnJlZShwYXRoKTsKKwlrZnJlZShwcm9wdmFsKTsKKwlrZnJlZShwcm9wbmFtZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSW9jdGwgbWFpbiBlbnRyeSBwb2ludAorICovCitzdGF0aWMgbG9uZyBmc2xfaHZfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgdW5zaWduZWQgbG9uZyBhcmdhZGRyKQoreworCXZvaWQgX191c2VyICphcmcgPSAodm9pZCBfX3VzZXIgKilhcmdhZGRyOworCWxvbmcgcmV0OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fUkVTVEFSVDoKKwkJcmV0ID0gaW9jdGxfcmVzdGFydChhcmcpOworCQlicmVhazsKKwljYXNlIEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fR0VUX1NUQVRVUzoKKwkJcmV0ID0gaW9jdGxfc3RhdHVzKGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlNMX0hWX0lPQ1RMX1BBUlRJVElPTl9TVEFSVDoKKwkJcmV0ID0gaW9jdGxfc3RhcnQoYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGU0xfSFZfSU9DVExfUEFSVElUSU9OX1NUT1A6CisJCXJldCA9IGlvY3RsX3N0b3AoYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGU0xfSFZfSU9DVExfTUVNQ1BZOgorCQlyZXQgPSBpb2N0bF9tZW1jcHkoYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGU0xfSFZfSU9DVExfRE9PUkJFTEw6CisJCXJldCA9IGlvY3RsX2Rvb3JiZWxsKGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlNMX0hWX0lPQ1RMX0dFVFBST1A6CisJCXJldCA9IGlvY3RsX2R0cHJvcChhcmcsIDApOworCQlicmVhazsKKwljYXNlIEZTTF9IVl9JT0NUTF9TRVRQUk9QOgorCQlyZXQgPSBpb2N0bF9kdHByb3AoYXJnLCAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoImZzbC1odjogYmFkIGlvY3RsIGRpcj0ldSB0eXBlPSV1IGNtZD0ldSBzaXplPSV1XG4iLAorCQkJIF9JT0NfRElSKGNtZCksIF9JT0NfVFlQRShjbWQpLCBfSU9DX05SKGNtZCksCisJCQkgX0lPQ19TSVpFKGNtZCkpOworCQlyZXR1cm4gLUVOT1RUWTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBMaW5rZWQgbGlzdCBvZiBwcm9jZXNzZXMgdGhhdCBoYXZlIHVzIG9wZW4gKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGRiX2xpc3Q7CisKKy8qIHNwaW5sb2NrIGZvciBkYl9saXN0ICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRiX2xpc3RfbG9jayk7CisKKy8qIFRoZSBzaXplIG9mIHRoZSBkb29yYmVsbCBldmVudCBxdWV1ZS4gIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gKi8KKyNkZWZpbmUgUVNJWkUJMTYKKworLyogUmV0dXJucyB0aGUgbmV4dCBoZWFkL3RhaWwgcG9pbnRlciwgd3JhcHBpbmcgYXJvdW5kIHRoZSBxdWV1ZSBpZiBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgbmV4dHAoeCkgKCgoeCkgKyAxKSAmIChRU0laRSAtIDEpKQorCisvKiBQZXItb3BlbiBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGRvb3JiZWxsX3F1ZXVlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3BpbmxvY2tfdCBsb2NrOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJdW5zaWduZWQgaW50IGhlYWQ7CisJdW5zaWduZWQgaW50IHRhaWw7CisJdWludDMyX3QgcVtRU0laRV07Cit9OworCisvKiBMaW5rZWQgbGlzdCBvZiBJU1JzIHRoYXQgd2UgcmVnaXN0ZXJlZCAqLworc3RydWN0IGxpc3RfaGVhZCBpc3JfbGlzdDsKKworLyogUGVyLUlTUiBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGRvb3JiZWxsX2lzciB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGludCBpcnE7CisJdWludDMyX3QgZG9vcmJlbGw7CS8qIFRoZSBkb29yYmVsbCBoYW5kbGUgKi8KKwl1aW50MzJfdCBwYXJ0aXRpb247CS8qIFRoZSBwYXJ0aXRpb24gaGFuZGxlLCBpZiB1c2VkICovCit9OworCisvKgorICogQWRkIGEgZG9vcmJlbGwgdG8gYWxsIG9mIHRoZSBkb29yYmVsbCBxdWV1ZXMKKyAqLworc3RhdGljIHZvaWQgZnNsX2h2X3F1ZXVlX2Rvb3JiZWxsKHVpbnQzMl90IGRvb3JiZWxsKQoreworCXN0cnVjdCBkb29yYmVsbF9xdWV1ZSAqZGJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBQcmV2ZW50IGFub3RoZXIgY29yZSBmcm9tIG1vZGlmeWluZyBkYl9saXN0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRiX2xpc3RfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkYnEsICZkYl9saXN0LCBsaXN0KSB7CisJCWlmIChkYnEtPmhlYWQgIT0gbmV4dHAoZGJxLT50YWlsKSkgeworCQkJZGJxLT5xW2RicS0+dGFpbF0gPSBkb29yYmVsbDsKKwkJCS8qCisJCQkgKiBUaGlzIG1lbW9yeSBiYXJyaWVyIGVsaW1pbmF0ZXMgdGhlIG5lZWQgdG8gZ3JhYgorCQkJICogdGhlIHNwaW5sb2NrIGZvciBkYnEuCisJCQkgKi8KKwkJCXNtcF93bWIoKTsKKwkJCWRicS0+dGFpbCA9IG5leHRwKGRicS0+dGFpbCk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRicS0+d2FpdCk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYl9saXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIEludGVycnVwdCBoYW5kbGVyIGZvciBhbGwgZG9vcmJlbGxzCisgKgorICogV2UgdXNlIHRoZSBzYW1lIGludGVycnVwdCBoYW5kbGVyIGZvciBhbGwgZG9vcmJlbGxzLiAgV2hlbmV2ZXIgYSBkb29yYmVsbAorICogaXMgcnVuZywgYW5kIHdlIHJlY2VpdmUgYW4gaW50ZXJydXB0LCB3ZSBqdXN0IHB1dCB0aGUgaGFuZGxlIGZvciB0aGF0CisgKiBkb29yYmVsbCAocGFzc2VkIHRvIHVzIGFzICpkYXRhKSBpbnRvIGFsbCBvZiB0aGUgcXVldWVzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX2h2X2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCWZzbF9odl9xdWV1ZV9kb29yYmVsbCgodWludHB0cl90KSBkYXRhKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIFN0YXRlIGNoYW5nZSB0aHJlYWQgZnVuY3Rpb24KKyAqCisgKiBUaGUgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcnJpdmVzIGluIGFuIGludGVycnVwdCwgYnV0IHdlIGNhbid0IGNhbGwKKyAqIGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oKSBpbiBhbiBpbnRlcnJ1cHQgaGFuZGxlci4gIFdlIGNvdWxkIGNhbGwKKyAqIGF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCksIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgdGhlIGNsaWVudHMnIGNhbGwtYmFjaworICogZnVuY3Rpb24gdG8gcnVuIGluIGludGVycnVwdCBjb250ZXh0LiAgU2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBpbXBvc2UgdGhhdAorICogcmVzdHJpY3Rpb24gb24gdGhlIGNsaWVudHMsIHdlIHVzZSBhIHRocmVhZGVkIElSUSB0byBwcm9jZXNzIHRoZQorICogbm90aWZpY2F0aW9uIGluIGtlcm5lbCBjb250ZXh0LgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX2h2X3N0YXRlX2NoYW5nZV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZG9vcmJlbGxfaXNyICpkYmlzciA9IGRhdGE7CisKKwlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZmYWlsb3Zlcl9zdWJzY3JpYmVycywgZGJpc3ItPnBhcnRpdGlvbiwKKwkJCQkgICAgIE5VTEwpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIHN0YXRlLWNoYW5nZSBkb29yYmVsbHMKKyAqLworc3RhdGljIGlycXJldHVybl90IGZzbF9odl9zdGF0ZV9jaGFuZ2VfaXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwlzdHJ1Y3QgZG9vcmJlbGxfaXNyICpkYmlzciA9IGRhdGE7CisJaW50IHJldDsKKworCS8qIEl0J3Mgc3RpbGwgYSBkb29yYmVsbCwgc28gYWRkIGl0IHRvIGFsbCB0aGUgcXVldWVzLiAqLworCWZzbF9odl9xdWV1ZV9kb29yYmVsbChkYmlzci0+ZG9vcmJlbGwpOworCisJLyogRGV0ZXJtaW5lIHRoZSBuZXcgc3RhdGUsIGFuZCBpZiBpdCdzIHN0b3BwZWQsIG5vdGlmeSB0aGUgY2xpZW50cy4gKi8KKwlyZXQgPSBmaF9wYXJ0aXRpb25fZ2V0X3N0YXR1cyhkYmlzci0+cGFydGl0aW9uLCAmc3RhdHVzKTsKKwlpZiAoIXJldCAmJiAoc3RhdHVzID09IEZIX1BBUlRJVElPTl9TVE9QUEVEKSkKKwkJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIFJldHVybnMgYSBiaXRtYXNrIGluZGljYXRpbmcgd2hldGhlciBhIHJlYWQgd2lsbCBibG9jaworICovCitzdGF0aWMgdW5zaWduZWQgaW50IGZzbF9odl9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnApCit7CisJc3RydWN0IGRvb3JiZWxsX3F1ZXVlICpkYnEgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkYnEtPmxvY2ssIGZsYWdzKTsKKworCXBvbGxfd2FpdChmaWxwLCAmZGJxLT53YWl0LCBwKTsKKwltYXNrID0gKGRicS0+aGVhZCA9PSBkYnEtPnRhaWwpID8gMCA6IChQT0xMSU4gfCBQT0xMUkROT1JNKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRicS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGhhbmRsZXMgZm9yIGFueSBpbmNvbWluZyBkb29yYmVsbHMKKyAqCisgKiBJZiB0aGVyZSBhcmUgZG9vcmJlbGwgaGFuZGxlcyBpbiB0aGUgcXVldWUgZm9yIHRoaXMgb3BlbiBpbnN0YW5jZSwgdGhlbgorICogcmV0dXJuIHRoZW0gdG8gdGhlIGNhbGxlciBhcyBhbiBhcnJheSBvZiAzMi1iaXQgaW50ZWdlcnMuICBPdGhlcndpc2UsCisgKiBibG9jayB1bnRpbCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgaGFuZGxlIHRvIHJldHVybi4KKyAqLworc3RhdGljIHNzaXplX3QgZnNsX2h2X3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sCisJCQkgICBsb2ZmX3QgKm9mZikKK3sKKwlzdHJ1Y3QgZG9vcmJlbGxfcXVldWUgKmRicSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwl1aW50MzJfdCBfX3VzZXIgKnAgPSAodWludDMyX3QgX191c2VyICopIGJ1ZjsgLyogZm9yIHB1dF91c2VyKCkgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNzaXplX3QgY291bnQgPSAwOworCisJLyogTWFrZSBzdXJlIHdlIHN0b3Agd2hlbiB0aGUgdXNlciBidWZmZXIgaXMgZnVsbC4gKi8KKwl3aGlsZSAobGVuID49IHNpemVvZih1aW50MzJfdCkpIHsKKwkJdWludDMyX3QgZGJlbGw7CS8qIExvY2FsIGNvcHkgb2YgZG9vcmJlbGwgcXVldWUgZGF0YSAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYnEtPmxvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBJZiB0aGUgcXVldWUgaXMgZW1wdHksIHRoZW4gZWl0aGVyIHdlJ3JlIGRvbmUgb3Igd2UgbmVlZAorCQkgKiB0byBibG9jay4gIElmIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgT19OT05CTE9DSywgdGhlbgorCQkgKiB3ZSByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisJCSAqLworCQlpZiAoZGJxLT5oZWFkID09IGRicS0+dGFpbCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGJxLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoY291bnQpCisJCQkJYnJlYWs7CisJCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRicS0+d2FpdCwKKwkJCQkJCSAgICAgZGJxLT5oZWFkICE9IGRicS0+dGFpbCkpCisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogRXZlbiB0aG91Z2ggd2UgaGF2ZSBhbiBzbXBfd21iKCkgaW4gdGhlIElTUiwgdGhlIGNvcmUKKwkJICogbWlnaHQgc3BlY3VsYXRpdmVseSBleGVjdXRlIHRoZSAiZGJlbGwgPSAuLi4iIGJlbG93IHdoaWxlCisJCSAqIGl0J3MgZXZhbHVhdGluZyB0aGUgaWYtc3RhdGVtZW50IGFib3ZlLiAgSW4gdGhhdCBjYXNlLCB0aGUKKwkJICogdmFsdWUgcHV0IGludG8gZGJlbGwgY291bGQgYmUgc3RhbGUgaWYgdGhlIGNvcmUgYWNjZXB0cyB0aGUKKwkJICogc3BlY3VsYXRpb24uIFRvIHByZXZlbnQgdGhhdCwgd2UgbmVlZCBhIHJlYWQgbWVtb3J5IGJhcnJpZXIKKwkJICogaGVyZSBhcyB3ZWxsLgorCQkgKi8KKwkJc21wX3JtYigpOworCisJCS8qIENvcHkgdGhlIGRhdGEgdG8gYSB0ZW1wb3JhcnkgbG9jYWwgYnVmZmVyLCBiZWNhdXNlCisJCSAqIHdlIGNhbid0IGNhbGwgY29weV90b191c2VyKCkgZnJvbSBpbnNpZGUgYSBzcGlubG9jaworCQkgKi8KKwkJZGJlbGwgPSBkYnEtPnFbZGJxLT5oZWFkXTsKKwkJZGJxLT5oZWFkID0gbmV4dHAoZGJxLT5oZWFkKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYnEtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAocHV0X3VzZXIoZGJlbGwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXArKzsKKwkJY291bnQgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJbGVuIC09IHNpemVvZih1aW50MzJfdCk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogT3BlbiB0aGUgZHJpdmVyIGFuZCBwcmVwYXJlIGZvciByZWFkaW5nIGRvb3JiZWxscy4KKyAqCisgKiBFdmVyeSB0aW1lIGFuIGFwcGxpY2F0aW9uIG9wZW5zIHRoZSBkcml2ZXIsIHdlIGNyZWF0ZSBhIGRvb3JiZWxsIHF1ZXVlCisgKiBmb3IgdGhhdCBmaWxlIGhhbmRsZS4gIFRoaXMgcXVldWUgaXMgdXNlZCBmb3IgYW55IGluY29taW5nIGRvb3JiZWxscy4KKyAqLworc3RhdGljIGludCBmc2xfaHZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZG9vcmJlbGxfcXVldWUgKmRicTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJZGJxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRvb3JiZWxsX3F1ZXVlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYnEpIHsKKwkJcHJfZXJyKCJmc2wtaHY6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmZGJxLT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkYnEtPndhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRiX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZkYnEtPmxpc3QsICZkYl9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYl9saXN0X2xvY2ssIGZsYWdzKTsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGRicTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDbG9zZSB0aGUgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgZnNsX2h2X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBkb29yYmVsbF9xdWV1ZSAqZGJxID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkYl9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmZGJxLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYl9saXN0X2xvY2ssIGZsYWdzKTsKKworCWtmcmVlKGRicSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmc2xfaHZfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGZzbF9odl9vcGVuLAorCS5yZWxlYXNlID0gZnNsX2h2X2Nsb3NlLAorCS5wb2xsID0gZnNsX2h2X3BvbGwsCisJLnJlYWQgPSBmc2xfaHZfcmVhZCwKKwkudW5sb2NrZWRfaW9jdGwgPSBmc2xfaHZfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZnNsX2h2X21pc2NfZGV2ID0geworCU1JU0NfRFlOQU1JQ19NSU5PUiwKKwkiZnNsLWh2IiwKKwkmZnNsX2h2X2ZvcHMKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBmc2xfaHZfc2h1dGRvd25faXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJb3JkZXJseV9wb3dlcm9mZihmYWxzZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBoYW5kbGUgb2YgdGhlIHBhcmVudCBvZiB0aGUgZ2l2ZW4gbm9kZQorICoKKyAqIFRoZSBoYW5kbGUgaXMgdGhlIHZhbHVlIG9mIHRoZSAnaHYtaGFuZGxlJyBwcm9wZXJ0eQorICovCitzdGF0aWMgaW50IGdldF9wYXJlbnRfaGFuZGxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7CisJY29uc3QgdWludDMyX3QgKnByb3A7CisJdWludDMyX3QgaGFuZGxlOworCWludCBsZW47CisKKwlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KG5wKTsKKwlpZiAoIXBhcmVudCkKKwkJLyogSXQncyBub3QgcmVhbGx5IHBvc3NpYmxlIGZvciB0aGlzIHRvIGZhaWwgKi8KKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIFRoZSBwcm9wZXIgbmFtZSBmb3IgdGhlIGhhbmRsZSBwcm9wZXJ0eSBpcyAiaHYtaGFuZGxlIiwgYnV0IHNvbWUKKwkgKiBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgaHlwZXJ2aXNvciB1c2VkICJyZWciLgorCSAqLworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkocGFyZW50LCAiaHYtaGFuZGxlIiwgJmxlbik7CisJaWYgKCFwcm9wKQorCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KHBhcmVudCwgInJlZyIsICZsZW4pOworCisJaWYgKCFwcm9wIHx8IChsZW4gIT0gc2l6ZW9mKHVpbnQzMl90KSkpIHsKKwkJLyogVGhpcyBjYW4gaGFwcGVuIG9ubHkgaWYgdGhlIG5vZGUgaXMgbWFsZm9ybWVkICovCisJCW9mX25vZGVfcHV0KHBhcmVudCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWhhbmRsZSA9IGJlMzJfdG9fY3B1cChwcm9wKTsKKwlvZl9ub2RlX3B1dChwYXJlbnQpOworCisJcmV0dXJuIGhhbmRsZTsKK30KKworLyoKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGZhaWxvdmVyIGV2ZW50cworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGRldmljZSBkcml2ZXJzIHRvIHJlZ2lzdGVyIHRoZWlyIGNhbGxiYWNrCisgKiBmdW5jdGlvbnMgZm9yIGZhaWwtb3ZlciBldmVudHMuCisgKi8KK2ludCBmc2xfaHZfZmFpbG92ZXJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmZhaWxvdmVyX3N1YnNjcmliZXJzLCBuYik7Cit9CitFWFBPUlRfU1lNQk9MKGZzbF9odl9mYWlsb3Zlcl9yZWdpc3Rlcik7CisKKy8qCisgKiBVbnJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGZhaWxvdmVyIGV2ZW50cworICovCitpbnQgZnNsX2h2X2ZhaWxvdmVyX3VucmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmZmFpbG92ZXJfc3Vic2NyaWJlcnMsIG5iKTsKK30KK0VYUE9SVF9TWU1CT0woZnNsX2h2X2ZhaWxvdmVyX3VucmVnaXN0ZXIpOworCisvKgorICogUmV0dXJuIFRSVUUgaWYgd2UncmUgcnVubmluZyB1bmRlciBGU0wgaHlwZXJ2aXNvcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIHRoZSBGcmVlc2NhbGUKKyAqIGh5cGVydmlzb3IsIGFuZCByZXR1cm5zIHplcm8gaWYgd2UncmUgbm90LCBvciBub24temVybyBpZiB3ZSBhcmUuCisgKgorICogRmlyc3QsIGl0IGNoZWNrcyBpZiBNU1JbR1NdPT0xLCB3aGljaCBtZWFucyB3ZSdyZSBydW5uaW5nIHVuZGVyIHNvbWUKKyAqIGh5cGVydmlzb3IuICBUaGVuIGl0IGNoZWNrcyBpZiB0aGVyZSBpcyBhIGh5cGVydmlzb3Igbm9kZSBpbiB0aGUgZGV2aWNlCisgKiB0cmVlLiAgQ3VycmVudGx5LCB0aGF0IG1lYW5zIHRoZXJlIG5lZWRzIHRvIGJlIGEgbm9kZSBpbiB0aGUgcm9vdCBjYWxsZWQKKyAqICJoeXBlcnZpc29yIiBhbmQgd2hpY2ggaGFzIGEgcHJvcGVydHkgbmFtZWQgImZzbCxodi12ZXJzaW9uIi4KKyAqLworc3RhdGljIGludCBoYXNfZnNsX2h5cGVydmlzb3Iodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJaW50IHJldDsKKworCWlmICghKG1mbXNyKCkgJiBNU1JfR1MpKQorCQlyZXR1cm4gMDsKKworCW5vZGUgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2h5cGVydmlzb3IiKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAwOworCisJcmV0ID0gb2ZfZmluZF9wcm9wZXJ0eShub2RlLCAiZnNsLGh2LXZlcnNpb24iLCBOVUxMKSAhPSBOVUxMOworCisJb2Zfbm9kZV9wdXQobm9kZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnJlZXNjYWxlIGh5cGVydmlzb3IgbWFuYWdlbWVudCBkcml2ZXIgaW5pdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhpcyBtb2R1bGUgaXMgbG9hZGVkLgorICoKKyAqIFJlZ2lzdGVyIG91cnNlbHZlcyBhcyBhIG1pc2NlbGxhbmVvdXMgZHJpdmVyLiAgVGhpcyB3aWxsIHJlZ2lzdGVyIHRoZQorICogZm9wcyBzdHJ1Y3R1cmUgYW5kIGNyZWF0ZSB0aGUgcmlnaHQgc3lzZnMgZW50cmllcyBmb3IgdWRldi4KKyAqLworc3RhdGljIGludCBfX2luaXQgZnNsX2h5cGVydmlzb3JfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IGRvb3JiZWxsX2lzciAqZGJpc3IsICpuOworCWludCByZXQ7CisKKwlwcl9pbmZvKCJGcmVlc2NhbGUgaHlwZXJ2aXNvciBtYW5hZ2VtZW50IGRyaXZlclxuIik7CisKKwlpZiAoIWhhc19mc2xfaHlwZXJ2aXNvcigpKSB7CisJCXByX2luZm8oImZzbC1odjogbm8gaHlwZXJ2aXNvciBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmZzbF9odl9taXNjX2Rldik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoImZzbC1odjogY2Fubm90IHJlZ2lzdGVyIGRldmljZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJmRiX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpc3JfbGlzdCk7CisKKwlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsIE5VTEwsICJlcGFwcixodi1yZWNlaXZlLWRvb3JiZWxsIikgeworCQl1bnNpZ25lZCBpbnQgaXJxOworCQljb25zdCB1aW50MzJfdCAqaGFuZGxlOworCisJCWhhbmRsZSA9IG9mX2dldF9wcm9wZXJ0eShucCwgImludGVycnVwdHMiLCBOVUxMKTsKKwkJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCQlpZiAoIWhhbmRsZSB8fCAoaXJxID09IE5PX0lSUSkpIHsKKwkJCXByX2VycigiZnNsLWh2OiBubyAnaW50ZXJydXB0cycgcHJvcGVydHkgaW4gJXMgbm9kZVxuIiwKKwkJCQlucC0+ZnVsbF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZGJpc3IgPSBremFsbG9jKHNpemVvZigqZGJpc3IpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkYmlzcikKKwkJCWdvdG8gb3V0X29mX21lbW9yeTsKKworCQlkYmlzci0+aXJxID0gaXJxOworCQlkYmlzci0+ZG9vcmJlbGwgPSBiZTMyX3RvX2NwdXAoaGFuZGxlKTsKKworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsaHYtc2h1dGRvd24tZG9vcmJlbGwiKSkgeworCQkJLyogVGhlIHNodXRkb3duIGRvb3JiZWxsIGdldHMgaXRzIG93biBJU1IgKi8KKwkJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgZnNsX2h2X3NodXRkb3duX2lzciwgMCwKKwkJCQkJICBucC0+bmFtZSwgTlVMTCk7CisJCX0gZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsCisJCQkiZnNsLGh2LXN0YXRlLWNoYW5nZS1kb29yYmVsbCIpKSB7CisJCQkvKgorCQkJICogVGhlIHN0YXRlIGNoYW5nZSBkb29yYmVsbCB0cmlnZ2VycyBhIG5vdGlmaWNhdGlvbiBpZgorCQkJICogdGhlIHN0YXRlIG9mIHRoZSBtYW5hZ2VkIHBhcnRpdGlvbiBjaGFuZ2VzIHRvCisJCQkgKiAic3RvcHBlZCIuIFdlIG5lZWQgYSBzZXBhcmF0ZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IKKwkJCSAqIHRoYXQsIGFuZCB3ZSBhbHNvIG5lZWQgdG8ga25vdyB0aGUgaGFuZGxlIG9mIHRoZQorCQkJICogdGFyZ2V0IHBhcnRpdGlvbiwgbm90IGp1c3QgdGhlIGhhbmRsZSBvZiB0aGUKKwkJCSAqIGRvb3JiZWxsLgorCQkJICovCisJCQlkYmlzci0+cGFydGl0aW9uID0gcmV0ID0gZ2V0X3BhcmVudF9oYW5kbGUobnApOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoImZzbC1odjogbm9kZSAlcyBoYXMgbWlzc2luZyBvciAiCisJCQkJICAgICAgICJtYWxmb3JtZWQgcGFyZW50XG4iLCBucC0+ZnVsbF9uYW1lKTsKKwkJCQlrZnJlZShkYmlzcik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIGZzbF9odl9zdGF0ZV9jaGFuZ2VfaXNyLAorCQkJCQkJICAgZnNsX2h2X3N0YXRlX2NoYW5nZV90aHJlYWQsCisJCQkJCQkgICAwLCBucC0+bmFtZSwgZGJpc3IpOworCQl9IGVsc2UKKwkJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgZnNsX2h2X2lzciwgMCwgbnAtPm5hbWUsIGRiaXNyKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJmc2wtaHY6IGNvdWxkIG5vdCByZXF1ZXN0IGlycSAldSBmb3Igbm9kZSAlc1xuIiwKKwkJCSAgICAgICBpcnEsIG5wLT5mdWxsX25hbWUpOworCQkJa2ZyZWUoZGJpc3IpOworCQkJY29udGludWU7CisJCX0KKworCQlsaXN0X2FkZCgmZGJpc3ItPmxpc3QsICZpc3JfbGlzdCk7CisKKwkJcHJfaW5mbygiZnNsLWh2OiByZWdpc3RlcmVkIGhhbmRsZXIgZm9yIGRvb3JiZWxsICV1XG4iLAorCQkJZGJpc3ItPmRvb3JiZWxsKTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X29mX21lbW9yeToKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGJpc3IsIG4sICZpc3JfbGlzdCwgbGlzdCkgeworCQlmcmVlX2lycShkYmlzci0+aXJxLCBkYmlzcik7CisJCWxpc3RfZGVsKCZkYmlzci0+bGlzdCk7CisJCWtmcmVlKGRiaXNyKTsKKwl9CisKKwltaXNjX2RlcmVnaXN0ZXIoJmZzbF9odl9taXNjX2Rldik7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIEZyZWVzY2FsZSBoeXBlcnZpc29yIG1hbmFnZW1lbnQgZHJpdmVyIHRlcm1pbmF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGlzIGRyaXZlciBpcyB1bmxvYWRlZC4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGZzbF9oeXBlcnZpc29yX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgZG9vcmJlbGxfaXNyICpkYmlzciwgKm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGJpc3IsIG4sICZpc3JfbGlzdCwgbGlzdCkgeworCQlmcmVlX2lycShkYmlzci0+aXJxLCBkYmlzcik7CisJCWxpc3RfZGVsKCZkYmlzci0+bGlzdCk7CisJCWtmcmVlKGRiaXNyKTsKKwl9CisKKwltaXNjX2RlcmVnaXN0ZXIoJmZzbF9odl9taXNjX2Rldik7Cit9CisKK21vZHVsZV9pbml0KGZzbF9oeXBlcnZpc29yX2luaXQpOworbW9kdWxlX2V4aXQoZnNsX2h5cGVydmlzb3JfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBoeXBlcnZpc29yIG1hbmFnZW1lbnQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnRpby9LY29uZmlnIGIvZHJpdmVycy92aXJ0aW8vS2NvbmZpZwppbmRleCAzZGQ2Mjk0Li41N2U0OTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpcnRpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlydGlvL0tjb25maWcKQEAgLTcsNiArNyw4IEBACiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIFZJUlRJTwogCittZW51ICJWaXJ0aW8gZHJpdmVycyIKKwogY29uZmlnIFZJUlRJT19QQ0kKIAl0cmlzdGF0ZSAiUENJIGRyaXZlciBmb3IgdmlydGlvIGRldmljZXMgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgRVhQRVJJTUVOVEFMCkBAIC0zMywzICszNSw0IEBACiAKIAkgSWYgdW5zdXJlLCBzYXkgTS4KIAorZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcgYi9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZwppbmRleCAwMGQ2MTVkLi45NzlkNmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZwpAQCAtNDIsNyArNDIsNyBAQAogCiBjb25maWcgVzFfTUFTVEVSX0RTMVdNCiAJdHJpc3RhdGUgIk1heGltIERTMVdNIDEtd2lyZSBidXNtYXN0ZXIiCi0JZGVwZW5kcyBvbiBXMQorCWRlcGVuZHMgb24gVzEgJiYgR0VORVJJQ19IQVJESVJRUwogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBEUzFXTSAxLXdpcmUgZHJpdmVyLCBzdWNoIGFzIHRoYXQKIAkgIGluIEhQIGlQQVEgZGV2aWNlcyBsaWtlIGg1eHh4LCBoMjIwMCwgYW5kIEFTSUMzLWJhc2VkIGxpa2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9kczF3bS5jIGIvZHJpdmVycy93MS9tYXN0ZXJzL2RzMXdtLmMKaW5kZXggYWQ1NzU5My4uYTBjODk2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL2RzMXdtLmMKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL2RzMXdtLmMKQEAgLTEwOSw2ICsxMDksNyBAQAogCS8qIGJ5dGUgdG8gd3JpdGUgdGhhdCBtYWtlcyBhbGwgaW50ciBkaXNhYmxlZCwgKi8KIAkvKiBjb25zaWRlcmluZyBhY3RpdmVfc3RhdGUgKElBUykgKG9wdGltaXphdGlvbikgKi8KIAl1OCAgICAgICBpbnRfZW5fcmVnX25vbmU7CisJdW5zaWduZWQgaW50IHJlc2V0X3JlY292ZXJfZGVsYXk7IC8qIHNlZSBkczF3bS5oICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHMxd21fd3JpdGVfcmVnaXN0ZXIoc3RydWN0IGRzMXdtX2RhdGEgKmRzMXdtX2RhdGEsIHUzMiByZWcsCkBAIC0xODcsNiArMTg4LDkgQEAKIAkJcmV0dXJuIDE7CiAJfQogCisJaWYgKGRzMXdtX2RhdGEtPnJlc2V0X3JlY292ZXJfZGVsYXkpCisJCW1zbGVlcChkczF3bV9kYXRhLT5yZXNldF9yZWNvdmVyX2RlbGF5KTsKKwogCXJldHVybiAwOwogfQogCkBAIC00OTAsNiArNDk0LDcgQEAKIAl9CiAJZHMxd21fZGF0YS0+aXJxID0gcmVzLT5zdGFydDsKIAlkczF3bV9kYXRhLT5pbnRfZW5fcmVnX25vbmUgPSAocGxhdC0+YWN0aXZlX2hpZ2ggPyBEUzFXTV9JTlRFTl9JQVMgOiAwKTsKKwlkczF3bV9kYXRhLT5yZXNldF9yZWNvdmVyX2RlbGF5ID0gcGxhdC0+cmVzZXRfcmVjb3Zlcl9kZWxheTsKIAogCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JUlFfSElHSEVER0UpCiAJCWlycV9zZXRfaXJxX3R5cGUoZHMxd21fZGF0YS0+aXJxLCBJUlFfVFlQRV9FREdFX1JJU0lORyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKaW5kZXggMDIyZjllYi4uMjFkODE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZwpAQCAtNTM1LDggKzUzNSw3IEBACiAKIGNvbmZpZyBJTlRFTF9TQ1VfV0FUQ0hET0cKIAlib29sICJJbnRlbCBTQ1UgV2F0Y2hkb2cgZm9yIE1vYmlsZSBQbGF0Zm9ybXMiCi0JZGVwZW5kcyBvbiBXQVRDSERPRwotCWRlcGVuZHMgb24gSU5URUxfU0NVX0lQQworCWRlcGVuZHMgb24gWDg2X01SU1QKIAktLS1oZWxwLS0tCiAJICBIYXJkd2FyZSBkcml2ZXIgZm9yIHRoZSB3YXRjaGRvZyB0aW1lIGJ1aWx0IGludG8gdGhlIEludGVsIFNDVQogCSAgZm9yIEludGVsIE1vYmlsZSBQbGF0Zm9ybXMuCkBAIC02MDAsOCArNTk5LDcgQEAKIAogY29uZmlnIEhQX1dBVENIRE9HCiAJdHJpc3RhdGUgIkhQIFByb0xpYW50IGlMTzIrIEhhcmR3YXJlIFdhdGNoZG9nIFRpbWVyIgotCWRlcGVuZHMgb24gWDg2Ci0JZGVmYXVsdCBtCisJZGVwZW5kcyBvbiBYODYgJiYgUENJCiAJaGVscAogCSAgQSBzb2Z0d2FyZSBtb25pdG9yaW5nIHdhdGNoZG9nIGFuZCBOTUkgc291cmNpbmcgZHJpdmVyLiBUaGlzIGRyaXZlcgogCSAgd2lsbCBkZXRlY3QgbG9ja3VwcyBhbmQgcHJvdmlkZSBhIHN0YWNrIHRyYWNlLiBUaGlzIGlzIGEgZHJpdmVyIHRoYXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvYXQzMmFwNzAweF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXQzMmFwNzAweF93ZHQuYwppbmRleCA3NTBiYzUyLi40Y2E1ZDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2F0MzJhcDcwMHhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9hdDMyYXA3MDB4X3dkdC5jCkBAIC00NDgsNyArNDQ4LDcgQEAKIH0KIG1vZHVsZV9leGl0KGF0MzJfd2R0X2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJIYW5zLUNocmlzdGlhbiBFZ3R2ZWR0IDxoY2VndHZlZHRAYXRtZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8ZWd0dmVkdEBzYW1mdW5kZXQubm8+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIldhdGNoZG9nIGRyaXZlciBmb3IgQXRtZWwgQVQzMkFQNzAwWCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9nZWZfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2dlZl93ZHQuYwppbmRleCAyOWE3Y2Q0Li5iMTQ2MDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2dlZl93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2dlZl93ZHQuYwpAQCAtMzI5LDQgKzMyOSw0IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkdFIHdhdGNoZG9nIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTogZ2VmX3dkdCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpnZWZfd2R0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2ludGVsX3NjdV93YXRjaGRvZy5jIGIvZHJpdmVycy93YXRjaGRvZy9pbnRlbF9zY3Vfd2F0Y2hkb2cuYwppbmRleCA5MTliZGQxLi5iYTQzODYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2ludGVsX3NjdV93YXRjaGRvZy5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaW50ZWxfc2N1X3dhdGNoZG9nLmMKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NmaS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vaW50ZWxfc2N1X2lwYy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXR4LTFfd2R0LmMKaW5kZXggMTQ3OWRjNC4uMDQzMGUwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jCkBAIC02NiwyMyArNjYsMTggQEAKIAlpbnQgZGVmYXVsdF90aWNrczsKIAl1bnNpZ25lZCBsb25nIGludXNlOwogCXVuc2lnbmVkIGdwaW87Ci0JaW50IGdzdGF0ZTsKKwl1bnNpZ25lZCBpbnQgZ3N0YXRlOwogfSBtdHgxX3dkdF9kZXZpY2U7CiAKIHN0YXRpYyB2b2lkIG10eDFfd2R0X3RyaWdnZXIodW5zaWduZWQgbG9uZyB1bnVzZWQpCiB7Ci0JdTMyIHRtcDsKLQogCXNwaW5fbG9jaygmbXR4MV93ZHRfZGV2aWNlLmxvY2spOwogCWlmIChtdHgxX3dkdF9kZXZpY2UucnVubmluZykKIAkJdGlja3MtLTsKIAogCS8qIHRvZ2dsZSB3ZHQgZ3BpbyAqLwotCW10eDFfd2R0X2RldmljZS5nc3RhdGUgPSB+bXR4MV93ZHRfZGV2aWNlLmdzdGF0ZTsKLQlpZiAobXR4MV93ZHRfZGV2aWNlLmdzdGF0ZSkKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG10eDFfd2R0X2RldmljZS5ncGlvLCAxKTsKLQllbHNlCi0JCWdwaW9fZGlyZWN0aW9uX2lucHV0KG10eDFfd2R0X2RldmljZS5ncGlvKTsKKwltdHgxX3dkdF9kZXZpY2UuZ3N0YXRlID0gIW10eDFfd2R0X2RldmljZS5nc3RhdGU7CisJZ3Bpb19zZXRfdmFsdWUobXR4MV93ZHRfZGV2aWNlLmdwaW8sIG10eDFfd2R0X2RldmljZS5nc3RhdGUpOwogCiAJaWYgKG10eDFfd2R0X2RldmljZS5xdWV1ZSAmJiB0aWNrcykKIAkJbW9kX3RpbWVyKCZtdHgxX3dkdF9kZXZpY2UudGltZXIsIGppZmZpZXMgKyBNVFgxX1dEVF9JTlRFUlZBTCk7CkBAIC0xMDUsNyArMTAwLDcgQEAKIAlpZiAoIW10eDFfd2R0X2RldmljZS5xdWV1ZSkgewogCQltdHgxX3dkdF9kZXZpY2UucXVldWUgPSAxOwogCQltdHgxX3dkdF9kZXZpY2UuZ3N0YXRlID0gMTsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG10eDFfd2R0X2RldmljZS5ncGlvLCAxKTsKKwkJZ3Bpb19zZXRfdmFsdWUobXR4MV93ZHRfZGV2aWNlLmdwaW8sIDEpOwogCQltb2RfdGltZXIoJm10eDFfd2R0X2RldmljZS50aW1lciwgamlmZmllcyArIE1UWDFfV0RUX0lOVEVSVkFMKTsKIAl9CiAJbXR4MV93ZHRfZGV2aWNlLnJ1bm5pbmcrKzsKQEAgLTEyMCw3ICsxMTUsNyBAQAogCWlmIChtdHgxX3dkdF9kZXZpY2UucXVldWUpIHsKIAkJbXR4MV93ZHRfZGV2aWNlLnF1ZXVlID0gMDsKIAkJbXR4MV93ZHRfZGV2aWNlLmdzdGF0ZSA9IDA7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChtdHgxX3dkdF9kZXZpY2UuZ3BpbywgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKG10eDFfd2R0X2RldmljZS5ncGlvLCAwKTsKIAl9CiAJdGlja3MgPSBtdHgxX3dkdF9kZXZpY2UuZGVmYXVsdF90aWNrczsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdHgxX3dkdF9kZXZpY2UubG9jaywgZmxhZ3MpOwpAQCAtMjE0LDYgKzIwOSwxMiBAQAogCWludCByZXQ7CiAKIAltdHgxX3dkdF9kZXZpY2UuZ3BpbyA9IHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0OworCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUobXR4MV93ZHRfZGV2aWNlLmdwaW8sCisJCQkJR1BJT0ZfT1VUX0lOSVRfSElHSCwgIm10eDEtd2R0Iik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgZ3BpbyIpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXNwaW5fbG9ja19pbml0KCZtdHgxX3dkdF9kZXZpY2UubG9jayk7CiAJaW5pdF9jb21wbGV0aW9uKCZtdHgxX3dkdF9kZXZpY2Uuc3RvcCk7CkBAIC0yMzksMTEgKzI0MCwxMyBAQAogCQltdHgxX3dkdF9kZXZpY2UucXVldWUgPSAwOwogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtdHgxX3dkdF9kZXZpY2Uuc3RvcCk7CiAJfQorCisJZ3Bpb19mcmVlKG10eDFfd2R0X2RldmljZS5ncGlvKTsKIAltaXNjX2RlcmVnaXN0ZXIoJm10eDFfd2R0X21pc2MpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdHgxX3dkdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG10eDFfd2R0X2RyaXZlciA9IHsKIAkucHJvYmUgPSBtdHgxX3dkdF9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3AobXR4MV93ZHRfcmVtb3ZlKSwKIAkuZHJpdmVyLm5hbWUgPSAibXR4MS13ZHQiLApAQCAtMjUyLDEyICsyNTUsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgbXR4MV93ZHRfaW5pdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm10eDFfd2R0KTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtdHgxX3dkdF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbXR4MV93ZHRfZXhpdCh2b2lkKQogewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtdHgxX3dkdCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm10eDFfd2R0X2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KG10eDFfd2R0X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3dtODMxeF93ZHQuYwppbmRleCA4YzRiMmQ1Li44NzFjYWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3dtODMxeF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3dtODMxeF93ZHQuYwpAQCAtMzIwLDYgKzMyMCwxMSBAQAogCXN0cnVjdCB3bTgzMXhfd2F0Y2hkb2dfcGRhdGEgKnBkYXRhOwogCWludCByZWcsIHJldDsKIAorCWlmICh3bTgzMXgpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAid204MzF4IHdhdGNoZG9nIGFscmVhZHkgcmVnaXN0ZXJlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCiAJd204MzF4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCiAJcmV0ID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgV004MzFYX1dBVENIRE9HKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL0tjb25maWcgYi9kcml2ZXJzL3hlbi9LY29uZmlnCmluZGV4IGE1OTYzOGIuLmY4MTUyODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL0tjb25maWcKKysrIGIvZHJpdmVycy94ZW4vS2NvbmZpZwpAQCAtOSw2ICs5LDUzIEBACiAJICB0aGUgc3lzdGVtIHRvIGV4cGFuZCB0aGUgZG9tYWluJ3MgbWVtb3J5IGFsbG9jYXRpb24sIG9yIGFsdGVybmF0aXZlbHkKIAkgIHJldHVybiB1bm5lZWRlZCBtZW1vcnkgdG8gdGhlIHN5c3RlbS4KIAorY29uZmlnIFhFTl9TRUxGQkFMTE9PTklORworCWJvb2wgIkR5bmFtaWNhbGx5IHNlbGYtYmFsbG9vbiBrZXJuZWwgbWVtb3J5IHRvIHRhcmdldCIKKwlkZXBlbmRzIG9uIFhFTiAmJiBYRU5fQkFMTE9PTiAmJiBDTEVBTkNBQ0hFICYmIFNXQVAKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTZWxmLWJhbGxvb25pbmcgZHluYW1pY2FsbHkgYmFsbG9vbnMgYXZhaWxhYmxlIGtlcm5lbCBtZW1vcnkgZHJpdmVuCisJICBieSB0aGUgY3VycmVudCB1c2FnZSBvZiBhbm9ueW1vdXMgbWVtb3J5ICgiY29tbWl0dGVkIEFTIikgYW5kCisJICBjb250cm9sbGVkIGJ5IHZhcmlvdXMgc3lzZnMtc2V0dGFibGUgcGFyYW1ldGVycy4gIENvbmZpZ3VyaW5nCisJICBGUk9OVFNXQVAgaXMgaGlnaGx5IHJlY29tbWVuZGVkOyBpZiBpdCBpcyBub3QgY29uZmlndXJlZCwgc2VsZi0KKwkgIGJhbGxvb25pbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBidXQgY2FuIGJlIGVuYWJsZWQgd2l0aCB0aGUKKwkgICdzZWxmYmFsbG9vbmluZycga2VybmVsIGJvb3QgcGFyYW1ldGVyLiAgSWYgRlJPTlRTV0FQIGlzIGNvbmZpZ3VyZWQsCisJICBmcm9udHN3YXAtc2VsZnNocmlua2luZyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYnV0IGNhbiBiZSBkaXNhYmxlZAorCSAgd2l0aCB0aGUgJ25vc2VsZnNocmluaycga2VybmVsIGJvb3QgcGFyYW1ldGVyOyBhbmQgc2VsZi1iYWxsb29uaW5nCisJICBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYnV0IGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSAnbm9zZWxmYmFsbG9vbmluZycKKwkgIGtlcm5lbCBib290IHBhcmFtZXRlci4gIE5vdGUgdGhhdCBzeXN0ZW1zIHdpdGhvdXQgYSBzdWZmaWNpZW50bHkKKwkgIGxhcmdlIHN3YXAgZGV2aWNlIHNob3VsZCBub3QgZW5hYmxlIHNlbGYtYmFsbG9vbmluZy4KKworY29uZmlnIFhFTl9CQUxMT09OX01FTU9SWV9IT1RQTFVHCisJYm9vbCAiTWVtb3J5IGhvdHBsdWcgc3VwcG9ydCBmb3IgWGVuIGJhbGxvb24gZHJpdmVyIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gWEVOX0JBTExPT04gJiYgTUVNT1JZX0hPVFBMVUcKKwloZWxwCisJICBNZW1vcnkgaG90cGx1ZyBzdXBwb3J0IGZvciBYZW4gYmFsbG9vbiBkcml2ZXIgYWxsb3dzIGV4cGFuZGluZyBtZW1vcnkKKwkgIGF2YWlsYWJsZSBmb3IgdGhlIHN5c3RlbSBhYm92ZSBsaW1pdCBkZWNsYXJlZCBhdCBzeXN0ZW0gc3RhcnR1cC4KKwkgIEl0IGlzIHZlcnkgdXNlZnVsIG9uIGNyaXRpY2FsIHN5c3RlbXMgd2hpY2ggcmVxdWlyZSBsb25nCisJICBydW4gd2l0aG91dCByZWJvb3RpbmcuCisKKwkgIE1lbW9yeSBjb3VsZCBiZSBob3RwbHVnZ2VkIGluIGZvbGxvd2luZyBzdGVwczoKKworCSAgICAxKSBkb20wOiB4bCBtZW0tbWF4IDxkb21VPiA8bWF4bWVtPgorCSAgICAgICB3aGVyZSA8bWF4bWVtPiBpcyA+PSByZXF1ZXN0ZWQgbWVtb3J5IHNpemUsCisKKwkgICAgMikgZG9tMDogeGwgbWVtLXNldCA8ZG9tVT4gPG1lbW9yeT4KKwkgICAgICAgd2hlcmUgPG1lbW9yeT4gaXMgcmVxdWVzdGVkIG1lbW9yeSBzaXplOyBhbHRlcm5hdGl2ZWx5IG1lbW9yeQorCSAgICAgICBjb3VsZCBiZSBhZGRlZCBieSB3cml0aW5nIHByb3BlciB2YWx1ZSB0bworCSAgICAgICAvc3lzL2RldmljZXMvc3lzdGVtL3hlbl9tZW1vcnkveGVuX21lbW9yeTAvdGFyZ2V0IG9yCisJICAgICAgIC9zeXMvZGV2aWNlcy9zeXN0ZW0veGVuX21lbW9yeS94ZW5fbWVtb3J5MC90YXJnZXRfa2Igb24gZHVtVSwKKworCSAgICAzKSBkb21VOiBmb3IgaSBpbiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnkqL3N0YXRlOyBkbyBcCisJICAgICAgICAgICAgICAgWyAiYGNhdCAiJGkiYCIgPSBvZmZsaW5lIF0gJiYgZWNobyBvbmxpbmUgPiAiJGkiOyBkb25lCisKKwkgIE1lbW9yeSBjb3VsZCBiZSBvbmxpbmVkIGF1dG9tYXRpY2FsbHkgb24gZG9tVSBieSBhZGRpbmcgZm9sbG93aW5nIGxpbmUgdG8gdWRldiBydWxlczoKKworCSAgU1VCU1lTVEVNPT0ibWVtb3J5IiwgQUNUSU9OPT0iYWRkIiwgUlVOKz0iL2Jpbi9zaCAtYyAnWyAtZiAvc3lzJGRldnBhdGgvc3RhdGUgXSAmJiBlY2hvIG9ubGluZSA+IC9zeXMkZGV2cGF0aC9zdGF0ZSciCisKKwkgIEluIHRoYXQgY2FzZSBzdGVwIDMgc2hvdWxkIGJlIG9taXR0ZWQuCisKIGNvbmZpZyBYRU5fU0NSVUJfUEFHRVMKIAlib29sICJTY3J1YiBwYWdlcyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0gdG8gc3lzdGVtIgogCWRlcGVuZHMgb24gWEVOX0JBTExPT04KQEAgLTEwNSw0ICsxNTIsMzMgQEAKIAlkZXBlbmRzIG9uIFBDSQogCXNlbGVjdCBTV0lPVExCCiAKK2NvbmZpZyBYRU5fVE1FTQorCWJvb2wKKwlkZWZhdWx0IHkgaWYgKENMRUFOQ0FDSEUgfHwgRlJPTlRTV0FQKQorCWhlbHAKKwkgIFNoaW0gdG8gaW50ZXJmYWNlIGluLWtlcm5lbCBUcmFuc2NlbmRlbnQgTWVtb3J5IGhvb2tzCisJICAoZS5nLiBjbGVhbmNhY2hlIGFuZCBmcm9udHN3YXApIHRvIFhlbiB0bWVtIGh5cGVyY2FsbHMuCisKK2NvbmZpZyBYRU5fUENJREVWX0JBQ0tFTkQKKwl0cmlzdGF0ZSAiWGVuIFBDSS1kZXZpY2UgYmFja2VuZCBkcml2ZXIiCisJZGVwZW5kcyBvbiBQQ0kgJiYgWDg2ICYmIFhFTgorCWRlcGVuZHMgb24gWEVOX0JBQ0tFTkQKKwlkZWZhdWx0IG0KKwloZWxwCisJICBUaGUgUENJIGRldmljZSBiYWNrZW5kIGRyaXZlciBhbGxvd3MgdGhlIGtlcm5lbCB0byBleHBvcnQgYXJiaXRyYXJ5CisJICBQQ0kgZGV2aWNlcyB0byBvdGhlciBndWVzdHMuIElmIHlvdSBzZWxlY3QgdGhpcyB0byBiZSBhIG1vZHVsZSwgeW91CisJICB3aWxsIG5lZWQgdG8gbWFrZSBzdXJlIG5vIG90aGVyIGRyaXZlciBoYXMgYm91bmQgdG8gdGhlIGRldmljZShzKQorCSAgeW91IHdhbnQgdG8gbWFrZSB2aXNpYmxlIHRvIG90aGVyIGd1ZXN0cy4KKworCSAgVGhlIHBhcmFtZXRlciAicGFzc3Rocm91Z2giIGFsbG93cyB5b3Ugc3BlY2lmeSBob3cgeW91IHdhbnQgdGhlIFBDSQorCSAgZGV2aWNlcyB0byBhcHBlYXIgaW4gdGhlIGd1ZXN0LiBZb3UgY2FuIGNob29zZSB0aGUgZGVmYXVsdCAoMCkgd2hlcmUKKwkgIFBDSSB0b3BvbG9neSBzdGFydHMgYXQgMDAuMDAuMCwgb3IgKDEpIGZvciBwYXNzdGhyb3VnaCBpZiB5b3Ugd2FudAorCSAgdGhlIFBDSSBkZXZpY2VzIHRvcG9sb2d5IGFwcGVhciB0aGUgc2FtZSBhcyBpbiB0aGUgaG9zdC4KKworCSAgVGhlICJoaWRlIiBwYXJhbWV0ZXIgKG9ubHkgYXBwbGljYWJsZSBpZiBiYWNrZW5kIGRyaXZlciBpcyBjb21waWxlZAorCSAgaW50byB0aGUga2VybmVsKSBhbGxvd3MgeW91IHRvIGJpbmQgdGhlIFBDSSBkZXZpY2VzIHRvIHRoaXMgbW9kdWxlCisJICBmcm9tIHRoZSBkZWZhdWx0IGRldmljZSBkcml2ZXJzLiBUaGUgYXJndW1lbnQgaXMgdGhlIGxpc3Qgb2YgUENJIEJERnM6CisJICB4ZW4tcGNpYmFjay5oaWRlPSgwMzowMC4wKSgwNDowMC4wKQorCisJICBJZiBpbiBkb3VidCwgc2F5IG0uCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9NYWtlZmlsZSBiL2RyaXZlcnMveGVuL01ha2VmaWxlCmluZGV4IGJiYzE4MjUuLjcyYmJiMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMveGVuL01ha2VmaWxlCkBAIC0xLDYgKzEsNSBAQAogb2JqLXkJKz0gZ3JhbnQtdGFibGUubyBmZWF0dXJlcy5vIGV2ZW50cy5vIG1hbmFnZS5vIGJhbGxvb24ubwogb2JqLXkJKz0geGVuYnVzLwotb2JqLXkJKz0gdG1lbS5vCiAKIG5vc3RhY2twIDo9ICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKQogQ0ZMQUdTX2ZlYXR1cmVzLm8JCQk6PSAkKG5vc3RhY2twKQpAQCAtOSwxNCArOCwxNyBAQAogb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKQkJKz0gY3B1X2hvdHBsdWcubwogb2JqLSQoQ09ORklHX1hFTl9YRU5DT01NKQkJKz0geGVuY29tbS5vCiBvYmotJChDT05GSUdfWEVOX0JBTExPT04pCQkrPSB4ZW4tYmFsbG9vbi5vCitvYmotJChDT05GSUdfWEVOX1NFTEZCQUxMT09OSU5HKQkrPSB4ZW4tc2VsZmJhbGxvb24ubwogb2JqLSQoQ09ORklHX1hFTl9ERVZfRVZUQ0hOKQkJKz0geGVuLWV2dGNobi5vCiBvYmotJChDT05GSUdfWEVOX0dOVERFVikJCSs9IHhlbi1nbnRkZXYubwogb2JqLSQoQ09ORklHX1hFTl9HUkFOVF9ERVZfQUxMT0MpCSs9IHhlbi1nbnRhbGxvYy5vCiBvYmotJChDT05GSUdfWEVORlMpCQkJKz0geGVuZnMvCiBvYmotJChDT05GSUdfWEVOX1NZU19IWVBFUlZJU09SKQkrPSBzeXMtaHlwZXJ2aXNvci5vCiBvYmotJChDT05GSUdfWEVOX1BMQVRGT1JNX1BDSSkJCSs9IHhlbi1wbGF0Zm9ybS1wY2kubworb2JqLSQoQ09ORklHX1hFTl9UTUVNKQkJCSs9IHRtZW0ubwogb2JqLSQoQ09ORklHX1NXSU9UTEJfWEVOKQkJKz0gc3dpb3RsYi14ZW4ubwogb2JqLSQoQ09ORklHX1hFTl9ET00wKQkJCSs9IHBjaS5vCitvYmotJChDT05GSUdfWEVOX1BDSURFVl9CQUNLRU5EKQkrPSB4ZW4tcGNpYmFjay8KIAogeGVuLWV2dGNobi15CQkJCTo9IGV2dGNobi5vCiB4ZW4tZ250ZGV2LXkJCQkJOj0gZ250ZGV2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2JhbGxvb24uYyBiL2RyaXZlcnMveGVuL2JhbGxvb24uYwppbmRleCBmNTQyOTBiLi41ZGZkOGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9iYWxsb29uLmMKKysrIGIvZHJpdmVycy94ZW4vYmFsbG9vbi5jCkBAIC00LDYgKzQsMTIgQEAKICAqIENvcHlyaWdodCAoYykgMjAwMywgQiBEcmFnb3ZpYwogICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQsIE0gV2lsbGlhbXNvbiwgSyBGcmFzZXIKICAqIENvcHlyaWdodCAoYykgMjAwNSBEYW4gTS4gU21pdGgsIElCTSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDEwIERhbmllbCBLaXBlcgorICoKKyAqIE1lbW9yeSBob3RwbHVnIHN1cHBvcnQgd2FzIHdyaXR0ZW4gYnkgRGFuaWVsIEtpcGVyLiBXb3JrIG9uCisgKiBpdCB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZSB1bmRlciBHb29nbGUgU3VtbWVyIG9mIENvZGUgMjAxMAorICogcHJvZ3JhbS4gSmVyZW15IEZpdHpoYXJkaW5nZSBmcm9tIENpdHJpeCB3YXMgdGhlIG1lbnRvciBmb3IKKyAqIHRoaXMgcHJvamVjdC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKQEAgLTQwLDYgKzQ2LDkgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9ob3RwbHVnLmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CkBAIC0xOTQsNiArMjAzLDg3IEBACiAJcmV0dXJuIEJQX0VBR0FJTjsKIH0KIAorI2lmZGVmIENPTkZJR19YRU5fQkFMTE9PTl9NRU1PUllfSE9UUExVRworc3RhdGljIGxvbmcgY3VycmVudF9jcmVkaXQodm9pZCkKK3sKKwlyZXR1cm4gYmFsbG9vbl9zdGF0cy50YXJnZXRfcGFnZXMgLSBiYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXMgLQorCQliYWxsb29uX3N0YXRzLmhvdHBsdWdfcGFnZXM7Cit9CisKK3N0YXRpYyBib29sIGJhbGxvb25faXNfaW5mbGF0ZWQodm9pZCkKK3sKKwlpZiAoYmFsbG9vbl9zdGF0cy5iYWxsb29uX2xvdyB8fCBiYWxsb29uX3N0YXRzLmJhbGxvb25faGlnaCB8fAorCQkJYmFsbG9vbl9zdGF0cy5iYWxsb29uX2hvdHBsdWcpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogcmVzZXJ2ZV9hZGRpdGlvbmFsX21lbW9yeSgpIGFkZHMgbWVtb3J5IHJlZ2lvbiBvZiBzaXplID49IGNyZWRpdCBhYm92ZQorICogbWF4X3Bmbi4gTmV3IHJlZ2lvbiBpcyBzZWN0aW9uIGFsaWduZWQgYW5kIHNpemUgaXMgbW9kaWZpZWQgdG8gYmUgbXVsdGlwbGUKKyAqIG9mIHNlY3Rpb24gc2l6ZS4gVGhvc2UgZmVhdHVyZXMgYWxsb3cgb3B0aW1hbCB1c2Ugb2YgYWRkcmVzcyBzcGFjZSBhbmQKKyAqIGVzdGFibGlzaCBwcm9wZXIgYWxpZ25tZW50IHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZmlyc3QgdGltZSBhZnRlcgorICogYm9vdCAobGFzdCBzZWN0aW9uIG5vdCBmdWxseSBwb3B1bGF0ZWQgYXQgYm9vdCB0aW1lIGNvbnRhaW5zIHVudXNlZCBtZW1vcnkKKyAqIHBhZ2VzIHdpdGggUEdfcmVzZXJ2ZWQgYml0IG5vdCBzZXQ7IG9ubGluZV9wYWdlc19yYW5nZSgpIGRvZXMgbm90IGFsbG93IHBhZ2UKKyAqIG9ubGluaW5nIGluIHdob2xlIHJhbmdlIGlmIGZpcnN0IG9ubGluZWQgcGFnZSBkb2VzIG5vdCBoYXZlIFBHX3Jlc2VydmVkCisgKiBiaXQgc2V0KS4gUmVhbCBzaXplIG9mIGFkZGVkIG1lbW9yeSBpcyBlc3RhYmxpc2hlZCBhdCBwYWdlIG9ubGluaW5nIHN0YWdlLgorICovCisKK3N0YXRpYyBlbnVtIGJwX3N0YXRlIHJlc2VydmVfYWRkaXRpb25hbF9tZW1vcnkobG9uZyBjcmVkaXQpCit7CisJaW50IG5pZCwgcmM7CisJdTY0IGhvdHBsdWdfc3RhcnRfcGFkZHI7CisJdW5zaWduZWQgbG9uZyBiYWxsb29uX2hvdHBsdWcgPSBjcmVkaXQ7CisKKwlob3RwbHVnX3N0YXJ0X3BhZGRyID0gUEZOX1BIWVMoU0VDVElPTl9BTElHTl9VUChtYXhfcGZuKSk7CisJYmFsbG9vbl9ob3RwbHVnID0gcm91bmRfdXAoYmFsbG9vbl9ob3RwbHVnLCBQQUdFU19QRVJfU0VDVElPTik7CisJbmlkID0gbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQoaG90cGx1Z19zdGFydF9wYWRkcik7CisKKwlyYyA9IGFkZF9tZW1vcnkobmlkLCBob3RwbHVnX3N0YXJ0X3BhZGRyLCBiYWxsb29uX2hvdHBsdWcgPDwgUEFHRV9TSElGVCk7CisKKwlpZiAocmMpIHsKKwkJcHJfaW5mbygieGVuX2JhbGxvb246ICVzOiBhZGRfbWVtb3J5KCkgZmFpbGVkOiAlaVxuIiwgX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIEJQX0VBR0FJTjsKKwl9CisKKwliYWxsb29uX2hvdHBsdWcgLT0gY3JlZGl0OworCisJYmFsbG9vbl9zdGF0cy5ob3RwbHVnX3BhZ2VzICs9IGNyZWRpdDsKKwliYWxsb29uX3N0YXRzLmJhbGxvb25faG90cGx1ZyA9IGJhbGxvb25faG90cGx1ZzsKKworCXJldHVybiBCUF9ET05FOworfQorCitzdGF0aWMgdm9pZCB4ZW5fb25saW5lX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJX19vbmxpbmVfcGFnZV9zZXRfbGltaXRzKHBhZ2UpOworCisJbXV0ZXhfbG9jaygmYmFsbG9vbl9tdXRleCk7CisKKwlfX2JhbGxvb25fYXBwZW5kKHBhZ2UpOworCisJaWYgKGJhbGxvb25fc3RhdHMuaG90cGx1Z19wYWdlcykKKwkJLS1iYWxsb29uX3N0YXRzLmhvdHBsdWdfcGFnZXM7CisJZWxzZQorCQktLWJhbGxvb25fc3RhdHMuYmFsbG9vbl9ob3RwbHVnOworCisJbXV0ZXhfdW5sb2NrKCZiYWxsb29uX211dGV4KTsKK30KKworc3RhdGljIGludCB4ZW5fbWVtb3J5X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICp2KQoreworCWlmICh2YWwgPT0gTUVNX09OTElORSkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZiYWxsb29uX3dvcmtlciwgMCk7CisKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHhlbl9tZW1vcnlfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB4ZW5fbWVtb3J5X25vdGlmaWVyLAorCS5wcmlvcml0eSA9IDAKK307CisjZWxzZQogc3RhdGljIGxvbmcgY3VycmVudF9jcmVkaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHRhcmdldCA9IGJhbGxvb25fc3RhdHMudGFyZ2V0X3BhZ2VzOwpAQCAtMjA2LDYgKzI5NiwyMSBAQAogCXJldHVybiB0YXJnZXQgLSBiYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXM7CiB9CiAKK3N0YXRpYyBib29sIGJhbGxvb25faXNfaW5mbGF0ZWQodm9pZCkKK3sKKwlpZiAoYmFsbG9vbl9zdGF0cy5iYWxsb29uX2xvdyB8fCBiYWxsb29uX3N0YXRzLmJhbGxvb25faGlnaCkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBlbnVtIGJwX3N0YXRlIHJlc2VydmVfYWRkaXRpb25hbF9tZW1vcnkobG9uZyBjcmVkaXQpCit7CisJYmFsbG9vbl9zdGF0cy50YXJnZXRfcGFnZXMgPSBiYWxsb29uX3N0YXRzLmN1cnJlbnRfcGFnZXM7CisJcmV0dXJuIEJQX0RPTkU7Cit9CisjZW5kaWYgLyogQ09ORklHX1hFTl9CQUxMT09OX01FTU9SWV9IT1RQTFVHICovCisKIHN0YXRpYyBlbnVtIGJwX3N0YXRlIGluY3JlYXNlX3Jlc2VydmF0aW9uKHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiB7CiAJaW50IHJjOwpAQCAtMjE3LDYgKzMyMiwxNSBAQAogCQkuZG9taWQgICAgICAgID0gRE9NSURfU0VMRgogCX07CiAKKyNpZmRlZiBDT05GSUdfWEVOX0JBTExPT05fTUVNT1JZX0hPVFBMVUcKKwlpZiAoIWJhbGxvb25fc3RhdHMuYmFsbG9vbl9sb3cgJiYgIWJhbGxvb25fc3RhdHMuYmFsbG9vbl9oaWdoKSB7CisJCW5yX3BhZ2VzID0gbWluKG5yX3BhZ2VzLCBiYWxsb29uX3N0YXRzLmJhbGxvb25faG90cGx1Zyk7CisJCWJhbGxvb25fc3RhdHMuaG90cGx1Z19wYWdlcyArPSBucl9wYWdlczsKKwkJYmFsbG9vbl9zdGF0cy5iYWxsb29uX2hvdHBsdWcgLT0gbnJfcGFnZXM7CisJCXJldHVybiBCUF9ET05FOworCX0KKyNlbmRpZgorCiAJaWYgKG5yX3BhZ2VzID4gQVJSQVlfU0laRShmcmFtZV9saXN0KSkKIAkJbnJfcGFnZXMgPSBBUlJBWV9TSVpFKGZyYW1lX2xpc3QpOwogCkBAIC0yNzksNiArMzkzLDE1IEBACiAJCS5kb21pZCAgICAgICAgPSBET01JRF9TRUxGCiAJfTsKIAorI2lmZGVmIENPTkZJR19YRU5fQkFMTE9PTl9NRU1PUllfSE9UUExVRworCWlmIChiYWxsb29uX3N0YXRzLmhvdHBsdWdfcGFnZXMpIHsKKwkJbnJfcGFnZXMgPSBtaW4obnJfcGFnZXMsIGJhbGxvb25fc3RhdHMuaG90cGx1Z19wYWdlcyk7CisJCWJhbGxvb25fc3RhdHMuaG90cGx1Z19wYWdlcyAtPSBucl9wYWdlczsKKwkJYmFsbG9vbl9zdGF0cy5iYWxsb29uX2hvdHBsdWcgKz0gbnJfcGFnZXM7CisJCXJldHVybiBCUF9ET05FOworCX0KKyNlbmRpZgorCiAJaWYgKG5yX3BhZ2VzID4gQVJSQVlfU0laRShmcmFtZV9saXN0KSkKIAkJbnJfcGFnZXMgPSBBUlJBWV9TSVpFKGZyYW1lX2xpc3QpOwogCkBAIC0zNDAsOCArNDYzLDEyIEBACiAJZG8gewogCQljcmVkaXQgPSBjdXJyZW50X2NyZWRpdCgpOwogCi0JCWlmIChjcmVkaXQgPiAwKQotCQkJc3RhdGUgPSBpbmNyZWFzZV9yZXNlcnZhdGlvbihjcmVkaXQpOworCQlpZiAoY3JlZGl0ID4gMCkgeworCQkJaWYgKGJhbGxvb25faXNfaW5mbGF0ZWQoKSkKKwkJCQlzdGF0ZSA9IGluY3JlYXNlX3Jlc2VydmF0aW9uKGNyZWRpdCk7CisJCQllbHNlCisJCQkJc3RhdGUgPSByZXNlcnZlX2FkZGl0aW9uYWxfbWVtb3J5KGNyZWRpdCk7CisJCX0KIAogCQlpZiAoY3JlZGl0IDwgMCkKIAkJCXN0YXRlID0gZGVjcmVhc2VfcmVzZXJ2YXRpb24oLWNyZWRpdCwgR0ZQX0JBTExPT04pOwpAQCAtNDQ4LDYgKzU3NSwxNCBAQAogCWJhbGxvb25fc3RhdHMucmV0cnlfY291bnQgPSAxOwogCWJhbGxvb25fc3RhdHMubWF4X3JldHJ5X2NvdW50ID0gUkVUUllfVU5MSU1JVEVEOwogCisjaWZkZWYgQ09ORklHX1hFTl9CQUxMT09OX01FTU9SWV9IT1RQTFVHCisJYmFsbG9vbl9zdGF0cy5ob3RwbHVnX3BhZ2VzID0gMDsKKwliYWxsb29uX3N0YXRzLmJhbGxvb25faG90cGx1ZyA9IDA7CisKKwlzZXRfb25saW5lX3BhZ2VfY2FsbGJhY2soJnhlbl9vbmxpbmVfcGFnZSk7CisJcmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKCZ4ZW5fbWVtb3J5X25iKTsKKyNlbmRpZgorCiAJLyoKIAkgKiBJbml0aWFsaXNlIHRoZSBiYWxsb29uIHdpdGggZXhjZXNzIG1lbW9yeSBzcGFjZS4gIFdlIG5lZWQKIAkgKiB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgYWRkIG1lbW9yeSB3aGljaCBkb2Vzbid0IGV4aXN0IG9yCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ldmVudHMuYyBiL2RyaXZlcnMveGVuL2V2ZW50cy5jCmluZGV4IDNmZjgyMmIuLmRhNzBmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2V2ZW50cy5jCisrKyBiL2RyaXZlcnMveGVuL2V2ZW50cy5jCkBAIC0zOTUsOSArMzk1LDkgQEAKIHN0YXRpYyB2b2lkIHhlbl9pcnFfaW5pdCh1bnNpZ25lZCBpcnEpCiB7CiAJc3RydWN0IGlycV9pbmZvICppbmZvOworI2lmZGVmIENPTkZJR19TTVAKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCi0jaWZkZWYgQ09ORklHX1NNUAogCS8qIEJ5IGRlZmF1bHQgYWxsIGV2ZW50IGNoYW5uZWxzIG5vdGlmeSBDUFUjMC4gKi8KIAljcHVtYXNrX2NvcHkoZGVzYy0+aXJxX2RhdGEuYWZmaW5pdHksIGNwdW1hc2tfb2YoMCkpOwogI2VuZGlmCkBAIC02MTUsMTcgKzYxNSwxNSBAQAogCXJldHVybiAtMTsKIH0KIAotaW50IHhlbl9hbGxvY2F0ZV9waXJxX2dzaSh1bnNpZ25lZCBnc2kpCi17Ci0JcmV0dXJuIGdzaTsKLX0KLQogLyoKICAqIERvIG5vdCBtYWtlIGFueSBhc3N1bXB0aW9ucyByZWdhcmRpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZQogICogSVJRIG51bWJlciByZXR1cm5lZCBoZXJlIGFuZCB0aGUgWGVuIHBpcnEgYXJndW1lbnQuCiAgKgogICogTm90ZTogV2UgZG9uJ3QgYXNzaWduIGFuIGV2ZW50IGNoYW5uZWwgdW50aWwgdGhlIGlycSBhY3R1YWxseSBzdGFydGVkCiAgKiB1cC4gIFJldHVybiBhbiBleGlzdGluZyBpcnEgaWYgd2UndmUgYWxyZWFkeSBnb3Qgb25lIGZvciB0aGUgZ3NpLgorICoKKyAqIFNoYXJlYWJsZSBpbXBsaWVzIGxldmVsIHRyaWdnZXJlZCwgbm90IHNoYXJlYWJsZSBpbXBsaWVzIGVkZ2UKKyAqIHRyaWdnZXJlZCBoZXJlLgogICovCiBpbnQgeGVuX2JpbmRfcGlycV9nc2lfdG9faXJxKHVuc2lnbmVkIGdzaSwKIAkJCSAgICAgdW5zaWduZWQgcGlycSwgaW50IHNoYXJlYWJsZSwgY2hhciAqbmFtZSkKQEAgLTY2NCwxNiArNjYyLDEzIEBACiAKIAlwaXJxX3F1ZXJ5X3VubWFzayhpcnEpOwogCS8qIFdlIHRyeSB0byB1c2UgdGhlIGhhbmRsZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc2VtYW50aWMgZm9yIHRoZQotCSAqIHR5cGUgb2YgaW50ZXJydXB0OiBpZiB0aGUgaW50ZXJydXB0IGRvZXNuJ3QgbmVlZCBhbiBlb2kKLQkgKiAocGlycV9uZWVkc19lb2kgcmV0dXJucyBmYWxzZSksIHdlIHRyZWF0IGl0IGxpa2UgYW4gZWRnZQotCSAqIHRyaWdnZXJlZCBpbnRlcnJ1cHQgc28gd2UgdXNlIGhhbmRsZV9lZGdlX2lycS4KLQkgKiBBcyBhIG1hdHRlciBvZiBmYWN0IHRoaXMgb25seSBoYXBwZW5zIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBwaHlzaWNhbCBpbnRlcnJ1cHQgaXMgZWRnZSB0cmlnZ2VyZWQgb3IgYW4gbXNpLgorCSAqIHR5cGUgb2YgaW50ZXJydXB0OiBpZiB0aGUgaW50ZXJydXB0IGlzIGFuIGVkZ2UgdHJpZ2dlcmVkCisJICogaW50ZXJydXB0IHdlIHVzZSBoYW5kbGVfZWRnZV9pcnEuCiAJICoKLQkgKiBPbiB0aGUgb3RoZXIgaGFuZCBpZiB0aGUgaW50ZXJydXB0IG5lZWRzIGFuIGVvaSAocGlycV9uZWVkc19lb2kKLQkgKiByZXR1cm5zIHRydWUpIHdlIHRyZWF0IGl0IGxpa2UgYSBsZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0IHNvIHdlCi0JICogdXNlIGhhbmRsZV9mYXN0ZW9pX2lycSBsaWtlIHRoZSBuYXRpdmUgY29kZSBkb2VzIGZvciB0aGlzIGtpbmQgb2YKKwkgKiBPbiB0aGUgb3RoZXIgaGFuZCBpZiB0aGUgaW50ZXJydXB0IGlzIGxldmVsIHRyaWdnZXJlZCB3ZSB1c2UKKwkgKiBoYW5kbGVfZmFzdGVvaV9pcnEgbGlrZSB0aGUgbmF0aXZlIGNvZGUgZG9lcyBmb3IgdGhpcyBraW5kIG9mCiAJICogaW50ZXJydXB0cy4KKwkgKgogCSAqIERlcGVuZGluZyBvbiB0aGUgWGVuIHZlcnNpb24sIHBpcnFfbmVlZHNfZW9pIG1pZ2h0IHJldHVybiB0cnVlCiAJICogbm90IG9ubHkgZm9yIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzIGJ1dCBmb3IgZWRnZSB0cmlnZ2VyZWQKIAkgKiBpbnRlcnJ1cHRzIHRvby4gSW4gYW55IGNhc2UgWGVuIGFsd2F5cyBob25vcnMgdGhlIGVvaSBtZWNoYW5pc20sCkBAIC02ODEsNyArNjc2LDcgQEAKIAkgKiBoYXNuJ3QgcmVjZWl2ZWQgYW4gZW9pIHlldC4gVGhlcmVmb3JlIHVzaW5nIHRoZSBmYXN0ZW9pIGhhbmRsZXIKIAkgKiBpcyB0aGUgcmlnaHQgY2hvaWNlIGVpdGhlciB3YXkuCiAJICovCi0JaWYgKHBpcnFfbmVlZHNfZW9pKGlycSkpCisJaWYgKHNoYXJlYWJsZSkKIAkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmeGVuX3BpcnFfY2hpcCwKIAkJCQloYW5kbGVfZmFzdGVvaV9pcnEsIG5hbWUpOwogCWVsc2UKQEAgLTE2OTMsNiArMTY4OCw2IEBACiAJfSBlbHNlIHsKIAkJaXJxX2N0eF9pbml0KHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCWlmICh4ZW5faW5pdGlhbF9kb21haW4oKSkKLQkJCXhlbl9zZXR1cF9waXJxcygpOworCQkJcGNpX3hlbl9pbml0aWFsX2RvbWFpbigpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3N3aW90bGIteGVuLmMgYi9kcml2ZXJzL3hlbi9zd2lvdGxiLXhlbi5jCmluZGV4IDY1ZWEyMWEuLjZlOGMxNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3N3aW90bGIteGVuLmMKKysrIGIvZHJpdmVycy94ZW4vc3dpb3RsYi14ZW4uYwpAQCAtMTQ3LDkgKzE0NywxNSBAQAogewogCXVuc2lnbmVkIGxvbmcgYnl0ZXM7CiAJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgbnJfdGJsOwogCi0JeGVuX2lvX3RsYl9uc2xhYnMgPSAoNjQgKiAxMDI0ICogMTAyNCA+PiBJT19UTEJfU0hJRlQpOwotCXhlbl9pb190bGJfbnNsYWJzID0gQUxJR04oeGVuX2lvX3RsYl9uc2xhYnMsIElPX1RMQl9TRUdTSVpFKTsKKwlucl90YmwgPSBzd2lvbHRiX25yX3RibCgpOworCWlmIChucl90YmwpCisJCXhlbl9pb190bGJfbnNsYWJzID0gbnJfdGJsOworCWVsc2UgeworCQl4ZW5faW9fdGxiX25zbGFicyA9ICg2NCAqIDEwMjQgKiAxMDI0ID4+IElPX1RMQl9TSElGVCk7CisJCXhlbl9pb190bGJfbnNsYWJzID0gQUxJR04oeGVuX2lvX3RsYl9uc2xhYnMsIElPX1RMQl9TRUdTSVpFKTsKKwl9CiAKIAlieXRlcyA9IHhlbl9pb190bGJfbnNsYWJzIDw8IElPX1RMQl9TSElGVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vdG1lbS5jIGIvZHJpdmVycy94ZW4vdG1lbS5jCmluZGV4IDgxNmE0NDkuLmQzNjk5NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3RtZW0uYworKysgYi9kcml2ZXJzL3hlbi90bWVtLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogWGVuIGltcGxlbWVudGF0aW9uIGZvciB0cmFuc2NlbmRlbnQgbWVtb3J5ICh0bWVtKQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE9yYWNsZSBDb3JwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIE9yYWNsZSBDb3JwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIEF1dGhvcjogRGFuIE1hZ2VuaGVpbWVyCiAgKi8KIApAQCAtOSw4ICs5LDE0IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NsZWFuY2FjaGUuaD4KIAorLyogdGVtcG9yYXJ5IGlmZGVmIHVudGlsIGluY2x1ZGUvbGludXgvZnJvbnRzd2FwLmggaXMgdXBzdHJlYW0gKi8KKyNpZmRlZiBDT05GSUdfRlJPTlRTV0FQCisjaW5jbHVkZSA8bGludXgvZnJvbnRzd2FwLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+CkBAIC0xMjIsMTQgKzEyOCw4IEBACiAJcmV0dXJuIHhlbl90bWVtX29wKFRNRU1fRkxVU0hfT0JKRUNULCBwb29sX2lkLCBvaWQsIDAsIDAsIDAsIDAsIDApOwogfQogCi1zdGF0aWMgaW50IHhlbl90bWVtX2Rlc3Ryb3lfcG9vbCh1MzIgcG9vbF9pZCkKLXsKLQlzdHJ1Y3QgdG1lbV9vaWQgb2lkID0geyB7IDAgfSB9OwotCi0JcmV0dXJuIHhlbl90bWVtX29wKFRNRU1fREVTVFJPWV9QT09MLCBwb29sX2lkLCBvaWQsIDAsIDAsIDAsIDAsIDApOwotfQotCi1pbnQgdG1lbV9lbmFibGVkOworaW50IHRtZW1fZW5hYmxlZCBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTCh0bWVtX2VuYWJsZWQpOwogCiBzdGF0aWMgaW50IF9faW5pdCBlbmFibGVfdG1lbShjaGFyICpzKQogewpAQCAtMTM5LDYgKzEzOSwxNCBAQAogCiBfX3NldHVwKCJ0bWVtIiwgZW5hYmxlX3RtZW0pOwogCisjaWZkZWYgQ09ORklHX0NMRUFOQ0FDSEUKK3N0YXRpYyBpbnQgeGVuX3RtZW1fZGVzdHJveV9wb29sKHUzMiBwb29sX2lkKQoreworCXN0cnVjdCB0bWVtX29pZCBvaWQgPSB7IHsgMCB9IH07CisKKwlyZXR1cm4geGVuX3RtZW1fb3AoVE1FTV9ERVNUUk9ZX1BPT0wsIHBvb2xfaWQsIG9pZCwgMCwgMCwgMCwgMCwgMCk7Cit9CisKIC8qIGNsZWFuY2FjaGUgb3BzICovCiAKIHN0YXRpYyB2b2lkIHRtZW1fY2xlYW5jYWNoZV9wdXRfcGFnZShpbnQgcG9vbCwgc3RydWN0IGNsZWFuY2FjaGVfZmlsZWtleSBrZXksCkBAIC0yNDAsMTggKzI0OCwxNTYgQEAKIAkuaW5pdF9zaGFyZWRfZnMgPSB0bWVtX2NsZWFuY2FjaGVfaW5pdF9zaGFyZWRfZnMsCiAJLmluaXRfZnMgPSB0bWVtX2NsZWFuY2FjaGVfaW5pdF9mcwogfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0ZST05UU1dBUAorLyogZnJvbnRzd2FwIHRtZW0gb3BlcmF0aW9ucyAqLworCisvKiBhIHNpbmdsZSB0bWVtIHBvb2xpZCBpcyB1c2VkIGZvciBhbGwgZnJvbnRzd2FwICJ0eXBlcyIgKHN3YXBmaWxlcykgKi8KK3N0YXRpYyBpbnQgdG1lbV9mcm9udHN3YXBfcG9vbGlkOworCisvKgorICogU3dpenpsaW5nIGluY3JlYXNlcyBvYmplY3RzIHBlciBzd2FwdHlwZSwgaW5jcmVhc2luZyB0bWVtIGNvbmN1cnJlbmN5CisgKiBmb3IgaGVhdnkgc3dhcGxvYWRzLiAgTGF0ZXIsIGxhcmdlciBucl9jcHVzIC0+IGxhcmdlciBTV0laX0JJVFMKKyAqLworI2RlZmluZSBTV0laX0JJVFMJCTQKKyNkZWZpbmUgU1dJWl9NQVNLCQkoKDEgPDwgU1dJWl9CSVRTKSAtIDEpCisjZGVmaW5lIF9vc3dpeihfdHlwZSwgX2luZCkJKChfdHlwZSA8PCBTV0laX0JJVFMpIHwgKF9pbmQgJiBTV0laX01BU0spKQorI2RlZmluZSBpc3dpeihfaW5kKQkJKF9pbmQgPj4gU1dJWl9CSVRTKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0bWVtX29pZCBvc3dpeih1bnNpZ25lZCB0eXBlLCB1MzIgaW5kKQoreworCXN0cnVjdCB0bWVtX29pZCBvaWQgPSB7IC5vaWQgPSB7IDAgfSB9OworCW9pZC5vaWRbMF0gPSBfb3N3aXoodHlwZSwgaW5kKTsKKwlyZXR1cm4gb2lkOworfQorCisvKiByZXR1cm5zIDAgaWYgdGhlIHBhZ2Ugd2FzIHN1Y2Nlc3NmdWxseSBwdXQgaW50byBmcm9udHN3YXAsIC0xIGlmIG5vdCAqLworc3RhdGljIGludCB0bWVtX2Zyb250c3dhcF9wdXRfcGFnZSh1bnNpZ25lZCB0eXBlLCBwZ29mZl90IG9mZnNldCwKKwkJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1NjQgaW5kNjQgPSAodTY0KW9mZnNldDsKKwl1MzIgaW5kID0gKHUzMilvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwlpbnQgcG9vbCA9IHRtZW1fZnJvbnRzd2FwX3Bvb2xpZDsKKwlpbnQgcmV0OworCisJaWYgKHBvb2wgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKGluZDY0ICE9IGluZCkKKwkJcmV0dXJuIC0xOworCW1iKCk7IC8qIGVuc3VyZSBwYWdlIGlzIHF1aWVzY2VudDsgdG1lbSBtYXkgYWRkcmVzcyBpdCB3aXRoIGFuIGFsaWFzICovCisJcmV0ID0geGVuX3RtZW1fcHV0X3BhZ2UocG9vbCwgb3N3aXoodHlwZSwgaW5kKSwgaXN3aXooaW5kKSwgcGZuKTsKKwkvKiB0cmFuc2xhdGUgWGVuIHRtZW0gcmV0dXJuIHZhbHVlcyB0byBsaW51eCBzZW1hbnRpY3MgKi8KKwlpZiAocmV0ID09IDEpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCisvKgorICogcmV0dXJucyAwIGlmIHRoZSBwYWdlIHdhcyBzdWNjZXNzZnVsbHkgZ290dGVuIGZyb20gZnJvbnRzd2FwLCAtMSBpZgorICogd2FzIG5vdCBwcmVzZW50IChzaG91bGQgbmV2ZXIgaGFwcGVuISkKKyAqLworc3RhdGljIGludCB0bWVtX2Zyb250c3dhcF9nZXRfcGFnZSh1bnNpZ25lZCB0eXBlLCBwZ29mZl90IG9mZnNldCwKKwkJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1NjQgaW5kNjQgPSAodTY0KW9mZnNldDsKKwl1MzIgaW5kID0gKHUzMilvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwlpbnQgcG9vbCA9IHRtZW1fZnJvbnRzd2FwX3Bvb2xpZDsKKwlpbnQgcmV0OworCisJaWYgKHBvb2wgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKGluZDY0ICE9IGluZCkKKwkJcmV0dXJuIC0xOworCXJldCA9IHhlbl90bWVtX2dldF9wYWdlKHBvb2wsIG9zd2l6KHR5cGUsIGluZCksIGlzd2l6KGluZCksIHBmbik7CisJLyogdHJhbnNsYXRlIFhlbiB0bWVtIHJldHVybiB2YWx1ZXMgdG8gbGludXggc2VtYW50aWNzICovCisJaWYgKHJldCA9PSAxKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworLyogZmx1c2ggYSBzaW5nbGUgcGFnZSBmcm9tIGZyb250c3dhcCAqLworc3RhdGljIHZvaWQgdG1lbV9mcm9udHN3YXBfZmx1c2hfcGFnZSh1bnNpZ25lZCB0eXBlLCBwZ29mZl90IG9mZnNldCkKK3sKKwl1NjQgaW5kNjQgPSAodTY0KW9mZnNldDsKKwl1MzIgaW5kID0gKHUzMilvZmZzZXQ7CisJaW50IHBvb2wgPSB0bWVtX2Zyb250c3dhcF9wb29saWQ7CisKKwlpZiAocG9vbCA8IDApCisJCXJldHVybjsKKwlpZiAoaW5kNjQgIT0gaW5kKQorCQlyZXR1cm47CisJKHZvaWQpIHhlbl90bWVtX2ZsdXNoX3BhZ2UocG9vbCwgb3N3aXoodHlwZSwgaW5kKSwgaXN3aXooaW5kKSk7Cit9CisKKy8qIGZsdXNoIGFsbCBwYWdlcyBmcm9tIHRoZSBwYXNzZWQgc3dhcHR5cGUgKi8KK3N0YXRpYyB2b2lkIHRtZW1fZnJvbnRzd2FwX2ZsdXNoX2FyZWEodW5zaWduZWQgdHlwZSkKK3sKKwlpbnQgcG9vbCA9IHRtZW1fZnJvbnRzd2FwX3Bvb2xpZDsKKwlpbnQgaW5kOworCisJaWYgKHBvb2wgPCAwKQorCQlyZXR1cm47CisJZm9yIChpbmQgPSBTV0laX01BU0s7IGluZCA+PSAwOyBpbmQtLSkKKwkJKHZvaWQpeGVuX3RtZW1fZmx1c2hfb2JqZWN0KHBvb2wsIG9zd2l6KHR5cGUsIGluZCkpOworfQorCitzdGF0aWMgdm9pZCB0bWVtX2Zyb250c3dhcF9pbml0KHVuc2lnbmVkIGlnbm9yZWQpCit7CisJc3RydWN0IHRtZW1fcG9vbF91dWlkIHByaXZhdGUgPSBUTUVNX1BPT0xfUFJJVkFURV9VVUlEOworCisJLyogYSBzaW5nbGUgdG1lbSBwb29saWQgaXMgdXNlZCBmb3IgYWxsIGZyb250c3dhcCAidHlwZXMiIChzd2FwZmlsZXMpICovCisJaWYgKHRtZW1fZnJvbnRzd2FwX3Bvb2xpZCA8IDApCisJCXRtZW1fZnJvbnRzd2FwX3Bvb2xpZCA9CisJCSAgICB4ZW5fdG1lbV9uZXdfcG9vbChwcml2YXRlLCBUTUVNX1BPT0xfUEVSU0lTVCwgUEFHRV9TSVpFKTsKK30KKworc3RhdGljIGludCBfX2luaXRkYXRhIHVzZV9mcm9udHN3YXAgPSAxOworCitzdGF0aWMgaW50IF9faW5pdCBub19mcm9udHN3YXAoY2hhciAqcykKK3sKKwl1c2VfZnJvbnRzd2FwID0gMDsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibm9mcm9udHN3YXAiLCBub19mcm9udHN3YXApOworCitzdGF0aWMgc3RydWN0IGZyb250c3dhcF9vcHMgdG1lbV9mcm9udHN3YXBfb3BzID0geworCS5wdXRfcGFnZSA9IHRtZW1fZnJvbnRzd2FwX3B1dF9wYWdlLAorCS5nZXRfcGFnZSA9IHRtZW1fZnJvbnRzd2FwX2dldF9wYWdlLAorCS5mbHVzaF9wYWdlID0gdG1lbV9mcm9udHN3YXBfZmx1c2hfcGFnZSwKKwkuZmx1c2hfYXJlYSA9IHRtZW1fZnJvbnRzd2FwX2ZsdXNoX2FyZWEsCisJLmluaXQgPSB0bWVtX2Zyb250c3dhcF9pbml0Cit9OworI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19pbml0IHhlbl90bWVtX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgY2xlYW5jYWNoZV9vcHMgb2xkX29wczsKLQogCWlmICgheGVuX2RvbWFpbigpKQogCQlyZXR1cm4gMDsKKyNpZmRlZiBDT05GSUdfRlJPTlRTV0FQCisJaWYgKHRtZW1fZW5hYmxlZCAmJiB1c2VfZnJvbnRzd2FwKSB7CisJCWNoYXIgKnMgPSAiIjsKKwkJc3RydWN0IGZyb250c3dhcF9vcHMgb2xkX29wcyA9CisJCQlmcm9udHN3YXBfcmVnaXN0ZXJfb3BzKCZ0bWVtX2Zyb250c3dhcF9vcHMpOworCisJCXRtZW1fZnJvbnRzd2FwX3Bvb2xpZCA9IC0xOworCQlpZiAob2xkX29wcy5pbml0ICE9IE5VTEwpCisJCQlzID0gIiAoV0FSTklORzogZnJvbnRzd2FwX29wcyBvdmVycmlkZGVuKSI7CisJCXByaW50ayhLRVJOX0lORk8gImZyb250c3dhcCBlbmFibGVkLCBSQU0gcHJvdmlkZWQgYnkgIgorCQkJCSAiWGVuIFRyYW5zY2VuZGVudCBNZW1vcnlcbiIpOworCX0KKyNlbmRpZgogI2lmZGVmIENPTkZJR19DTEVBTkNBQ0hFCiAJQlVHX09OKHNpemVvZihzdHJ1Y3QgY2xlYW5jYWNoZV9maWxla2V5KSAhPSBzaXplb2Yoc3RydWN0IHRtZW1fb2lkKSk7CiAJaWYgKHRtZW1fZW5hYmxlZCAmJiB1c2VfY2xlYW5jYWNoZSkgewogCQljaGFyICpzID0gIiI7Ci0JCW9sZF9vcHMgPSBjbGVhbmNhY2hlX3JlZ2lzdGVyX29wcygmdG1lbV9jbGVhbmNhY2hlX29wcyk7CisJCXN0cnVjdCBjbGVhbmNhY2hlX29wcyBvbGRfb3BzID0KKwkJCWNsZWFuY2FjaGVfcmVnaXN0ZXJfb3BzKCZ0bWVtX2NsZWFuY2FjaGVfb3BzKTsKIAkJaWYgKG9sZF9vcHMuaW5pdF9mcyAhPSBOVUxMKQogCQkJcyA9ICIgKFdBUk5JTkc6IGNsZWFuY2FjaGVfb3BzIG92ZXJyaWRkZW4pIjsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiY2xlYW5jYWNoZSBlbmFibGVkLCBSQU0gcHJvdmlkZWQgYnkgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuLWJhbGxvb24uYyBiL2RyaXZlcnMveGVuL3hlbi1iYWxsb29uLmMKaW5kZXggYTRmZjIyNS4uNWM5ZGM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuLWJhbGxvb24uYworKysgYi9kcml2ZXJzL3hlbi94ZW4tYmFsbG9vbi5jCkBAIC05OCw2ICs5OCw4IEBACiAKIAlyZWdpc3Rlcl9iYWxsb29uKCZiYWxsb29uX3N5c2Rldik7CiAKKwlyZWdpc3Rlcl94ZW5fc2VsZmJhbGxvb25pbmcoJmJhbGxvb25fc3lzZGV2KTsKKwogCXRhcmdldF93YXRjaC5jYWxsYmFjayA9IHdhdGNoX3RhcmdldDsKIAl4ZW5zdG9yZV9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gYmFsbG9vbl9pbml0X3dhdGNoZXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL01ha2VmaWxlIGIvZHJpdmVycy94ZW4veGVuLXBjaWJhY2svTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlMGFkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorb2JqLSQoQ09ORklHX1hFTl9QQ0lERVZfQkFDS0VORCkgKz0geGVuLXBjaWJhY2subworCit4ZW4tcGNpYmFjay15IDo9IHBjaV9zdHViLm8gcGNpYmFja19vcHMubyB4ZW5idXMubworeGVuLXBjaWJhY2steSArPSBjb25mX3NwYWNlLm8gY29uZl9zcGFjZV9oZWFkZXIubyBcCisJCSBjb25mX3NwYWNlX2NhcGFiaWxpdHkubyBcCisJCSBjb25mX3NwYWNlX3F1aXJrcy5vIHZwY2kubyBcCisJCSBwYXNzdGhyb3VnaC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9jb25mX3NwYWNlLmMgYi9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9jb25mX3NwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwMzE0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL2NvbmZfc3BhY2UuYwpAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIFBDSSBCYWNrZW5kIC0gRnVuY3Rpb25zIGZvciBjcmVhdGluZyBhIHZpcnR1YWwgY29uZmlndXJhdGlvbiBzcGFjZSBmb3IKKyAqICAgICAgICAgICAgICAgZXhwb3J0ZWQgUENJIERldmljZXMuCisgKiAgICAgICAgICAgICAgIEl0J3MgZGFuZ2Vyb3VzIHRvIGFsbG93IFBDSSBEcml2ZXIgRG9tYWlucyB0byBjaGFuZ2UgdGhlaXIKKyAqICAgICAgICAgICAgICAgZGV2aWNlJ3MgcmVzb3VyY2VzIChtZW1vcnksIGkvbyBwb3J0cywgaW50ZXJydXB0cykuIFdlIG5lZWQgdG8KKyAqICAgICAgICAgICAgICAgcmVzdHJpY3QgY2hhbmdlcyB0byBjZXJ0YWluIFBDSSBDb25maWd1cmF0aW9uIHJlZ2lzdGVyczoKKyAqICAgICAgICAgICAgICAgQkFScywgSU5URVJSVVBUX1BJTiwgbW9zdCByZWdpc3RlcnMgaW4gdGhlIGhlYWRlci4uLgorICoKKyAqIEF1dGhvcjogUnlhbiBXaWxzb24gPGhhcDlAZXBvY2gubmNzYy5taWw+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInBjaWJhY2suaCIKKyNpbmNsdWRlICJjb25mX3NwYWNlLmgiCisjaW5jbHVkZSAiY29uZl9zcGFjZV9xdWlya3MuaCIKKworI2RlZmluZSBEUlZfTkFNRQkieGVuLXBjaWJhY2siCitzdGF0aWMgaW50IHBlcm1pc3NpdmU7Cittb2R1bGVfcGFyYW0ocGVybWlzc2l2ZSwgYm9vbCwgMDY0NCk7CisKKy8qIFRoaXMgaXMgd2hlcmUgeGVuX3BjaWJrX3JlYWRfY29uZmlnX2J5dGUsIHhlbl9wY2lia19yZWFkX2NvbmZpZ193b3JkLAorICogeGVuX3BjaWJrX3dyaXRlX2NvbmZpZ193b3JkLCBhbmQgeGVuX3BjaWJrX3dyaXRlX2NvbmZpZ19ieXRlIGFyZSBjcmVhdGVkLiAqLworI2RlZmluZSBERUZJTkVfUENJX0NPTkZJRyhvcCwgc2l6ZSwgdHlwZSkJCQlcCitpbnQgeGVuX3BjaWJrXyMjb3AjI19jb25maWdfIyNzaXplCQkJCVwKKyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB0eXBlIHZhbHVlLCB2b2lkICpkYXRhKQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHBjaV8jI29wIyNfY29uZmlnXyMjc2l6ZShkZXYsIG9mZnNldCwgdmFsdWUpOwlcCit9CisKK0RFRklORV9QQ0lfQ09ORklHKHJlYWQsIGJ5dGUsIHU4ICopCitERUZJTkVfUENJX0NPTkZJRyhyZWFkLCB3b3JkLCB1MTYgKikKK0RFRklORV9QQ0lfQ09ORklHKHJlYWQsIGR3b3JkLCB1MzIgKikKKworREVGSU5FX1BDSV9DT05GSUcod3JpdGUsIGJ5dGUsIHU4KQorREVGSU5FX1BDSV9DT05GSUcod3JpdGUsIHdvcmQsIHUxNikKK0RFRklORV9QQ0lfQ09ORklHKHdyaXRlLCBkd29yZCwgdTMyKQorCitzdGF0aWMgaW50IGNvbmZfc3BhY2VfcmVhZChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJICAgY29uc3Qgc3RydWN0IGNvbmZpZ19maWVsZF9lbnRyeSAqZW50cnksCisJCQkgICBpbnQgb2Zmc2V0LCB1MzIgKnZhbHVlKQoreworCWludCByZXQgPSAwOworCWNvbnN0IHN0cnVjdCBjb25maWdfZmllbGQgKmZpZWxkID0gZW50cnktPmZpZWxkOworCisJKnZhbHVlID0gMDsKKworCXN3aXRjaCAoZmllbGQtPnNpemUpIHsKKwljYXNlIDE6CisJCWlmIChmaWVsZC0+dS5iLnJlYWQpCisJCQlyZXQgPSBmaWVsZC0+dS5iLnJlYWQoZGV2LCBvZmZzZXQsICh1OCAqKSB2YWx1ZSwKKwkJCQkJICAgICAgZW50cnktPmRhdGEpOworCQlicmVhazsKKwljYXNlIDI6CisJCWlmIChmaWVsZC0+dS53LnJlYWQpCisJCQlyZXQgPSBmaWVsZC0+dS53LnJlYWQoZGV2LCBvZmZzZXQsICh1MTYgKikgdmFsdWUsCisJCQkJCSAgICAgIGVudHJ5LT5kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpZiAoZmllbGQtPnUuZHcucmVhZCkKKwkJCXJldCA9IGZpZWxkLT51LmR3LnJlYWQoZGV2LCBvZmZzZXQsIHZhbHVlLCBlbnRyeS0+ZGF0YSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbmZfc3BhY2Vfd3JpdGUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkX2VudHJ5ICplbnRyeSwKKwkJCSAgICBpbnQgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJaW50IHJldCA9IDA7CisJY29uc3Qgc3RydWN0IGNvbmZpZ19maWVsZCAqZmllbGQgPSBlbnRyeS0+ZmllbGQ7CisKKwlzd2l0Y2ggKGZpZWxkLT5zaXplKSB7CisJY2FzZSAxOgorCQlpZiAoZmllbGQtPnUuYi53cml0ZSkKKwkJCXJldCA9IGZpZWxkLT51LmIud3JpdGUoZGV2LCBvZmZzZXQsICh1OCkgdmFsdWUsCisJCQkJCSAgICAgICBlbnRyeS0+ZGF0YSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWYgKGZpZWxkLT51Lncud3JpdGUpCisJCQlyZXQgPSBmaWVsZC0+dS53LndyaXRlKGRldiwgb2Zmc2V0LCAodTE2KSB2YWx1ZSwKKwkJCQkJICAgICAgIGVudHJ5LT5kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpZiAoZmllbGQtPnUuZHcud3JpdGUpCisJCQlyZXQgPSBmaWVsZC0+dS5kdy53cml0ZShkZXYsIG9mZnNldCwgdmFsdWUsCisJCQkJCQllbnRyeS0+ZGF0YSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfbWFzayhpbnQgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA9PSAxKQorCQlyZXR1cm4gMHhmZjsKKwllbHNlIGlmIChzaXplID09IDIpCisJCXJldHVybiAweGZmZmY7CisJZWxzZQorCQlyZXR1cm4gMHhmZmZmZmZmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgdmFsaWRfcmVxdWVzdChpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwkvKiBWYWxpZGF0ZSByZXF1ZXN0IChubyB1bi1hbGlnbmVkIHJlcXVlc3RzKSAqLworCWlmICgoc2l6ZSA9PSAxIHx8IHNpemUgPT0gMiB8fCBzaXplID09IDQpICYmIChvZmZzZXQgJSBzaXplKSA9PSAwKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbWVyZ2VfdmFsdWUodTMyIHZhbCwgdTMyIG5ld192YWwsIHUzMiBuZXdfdmFsX21hc2ssCisJCQkgICAgICBpbnQgb2Zmc2V0KQoreworCWlmIChvZmZzZXQgPj0gMCkgeworCQluZXdfdmFsX21hc2sgPDw9IChvZmZzZXQgKiA4KTsKKwkJbmV3X3ZhbCA8PD0gKG9mZnNldCAqIDgpOworCX0gZWxzZSB7CisJCW5ld192YWxfbWFzayA+Pj0gKG9mZnNldCAqIC04KTsKKwkJbmV3X3ZhbCA+Pj0gKG9mZnNldCAqIC04KTsKKwl9CisJdmFsID0gKHZhbCAmIH5uZXdfdmFsX21hc2spIHwgKG5ld192YWwgJiBuZXdfdmFsX21hc2spOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBwY2liaW9zX2Vycl90b19lcnJubyhpbnQgZXJyKQoreworCXN3aXRjaCAoZXJyKSB7CisJY2FzZSBQQ0lCSU9TX1NVQ0NFU1NGVUw6CisJCXJldHVybiBYRU5fUENJX0VSUl9zdWNjZXNzOworCWNhc2UgUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOgorCQlyZXR1cm4gWEVOX1BDSV9FUlJfZGV2X25vdF9mb3VuZDsKKwljYXNlIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjoKKwkJcmV0dXJuIFhFTl9QQ0lfRVJSX2ludmFsaWRfb2Zmc2V0OworCWNhc2UgUENJQklPU19GVU5DX05PVF9TVVBQT1JURUQ6CisJCXJldHVybiBYRU5fUENJX0VSUl9ub3RfaW1wbGVtZW50ZWQ7CisJY2FzZSBQQ0lCSU9TX1NFVF9GQUlMRUQ6CisJCXJldHVybiBYRU5fUENJX0VSUl9hY2Nlc3NfZGVuaWVkOworCX0KKwlyZXR1cm4gZXJyOworfQorCitpbnQgeGVuX3BjaWJrX2NvbmZpZ19yZWFkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIGludCBzaXplLAorCQkJICB1MzIgKnJldF92YWwpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHhlbl9wY2lia19kZXZfZGF0YSAqZGV2X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwljb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkX2VudHJ5ICpjZmdfZW50cnk7CisJY29uc3Qgc3RydWN0IGNvbmZpZ19maWVsZCAqZmllbGQ7CisJaW50IHJlcV9zdGFydCwgcmVxX2VuZCwgZmllbGRfc3RhcnQsIGZpZWxkX2VuZDsKKwkvKiBpZiByZWFkIGZhaWxzIGZvciBhbnkgcmVhc29uLCByZXR1cm4gMAorCSAqIChhcyBpZiBkZXZpY2UgZGlkbid0IHJlc3BvbmQpICovCisJdTMyIHZhbHVlID0gMCwgdG1wX3ZhbDsKKworCWlmICh1bmxpa2VseSh2ZXJib3NlX3JlcXVlc3QpKQorCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlczogcmVhZCAlZCBieXRlcyBhdCAweCV4XG4iLAorCQkgICAgICAgcGNpX25hbWUoZGV2KSwgc2l6ZSwgb2Zmc2V0KTsKKworCWlmICghdmFsaWRfcmVxdWVzdChvZmZzZXQsIHNpemUpKSB7CisJCWVyciA9IFhFTl9QQ0lfRVJSX2ludmFsaWRfb2Zmc2V0OworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBHZXQgdGhlIHJlYWwgdmFsdWUgZmlyc3QsIHRoZW4gbW9kaWZ5IGFzIGFwcHJvcHJpYXRlICovCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOgorCQllcnIgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIG9mZnNldCwgKHU4ICopICZ2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZXJyID0gcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBvZmZzZXQsICh1MTYgKikgJnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBvZmZzZXQsICZ2YWx1ZSk7CisJCWJyZWFrOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2ZnX2VudHJ5LCAmZGV2X2RhdGEtPmNvbmZpZ19maWVsZHMsIGxpc3QpIHsKKwkJZmllbGQgPSBjZmdfZW50cnktPmZpZWxkOworCisJCXJlcV9zdGFydCA9IG9mZnNldDsKKwkJcmVxX2VuZCA9IG9mZnNldCArIHNpemU7CisJCWZpZWxkX3N0YXJ0ID0gT0ZGU0VUKGNmZ19lbnRyeSk7CisJCWZpZWxkX2VuZCA9IE9GRlNFVChjZmdfZW50cnkpICsgZmllbGQtPnNpemU7CisKKwkJaWYgKChyZXFfc3RhcnQgPj0gZmllbGRfc3RhcnQgJiYgcmVxX3N0YXJ0IDwgZmllbGRfZW5kKQorCQkgICAgfHwgKHJlcV9lbmQgPiBmaWVsZF9zdGFydCAmJiByZXFfZW5kIDw9IGZpZWxkX2VuZCkpIHsKKwkJCWVyciA9IGNvbmZfc3BhY2VfcmVhZChkZXYsIGNmZ19lbnRyeSwgZmllbGRfc3RhcnQsCisJCQkJCSAgICAgICZ0bXBfdmFsKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisKKwkJCXZhbHVlID0gbWVyZ2VfdmFsdWUodmFsdWUsIHRtcF92YWwsCisJCQkJCSAgICBnZXRfbWFzayhmaWVsZC0+c2l6ZSksCisJCQkJCSAgICBmaWVsZF9zdGFydCAtIHJlcV9zdGFydCk7CisJCX0KKwl9CisKK291dDoKKwlpZiAodW5saWtlbHkodmVyYm9zZV9yZXF1ZXN0KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXM6IHJlYWQgJWQgYnl0ZXMgYXQgMHgleCA9ICV4XG4iLAorCQkgICAgICAgcGNpX25hbWUoZGV2KSwgc2l6ZSwgb2Zmc2V0LCB2YWx1ZSk7CisKKwkqcmV0X3ZhbCA9IHZhbHVlOworCXJldHVybiBwY2liaW9zX2Vycl90b19lcnJubyhlcnIpOworfQorCitpbnQgeGVuX3BjaWJrX2NvbmZpZ193cml0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSwgdTMyIHZhbHVlKQoreworCWludCBlcnIgPSAwLCBoYW5kbGVkID0gMDsKKwlzdHJ1Y3QgeGVuX3BjaWJrX2Rldl9kYXRhICpkZXZfZGF0YSA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCWNvbnN0IHN0cnVjdCBjb25maWdfZmllbGRfZW50cnkgKmNmZ19lbnRyeTsKKwljb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkICpmaWVsZDsKKwl1MzIgdG1wX3ZhbDsKKwlpbnQgcmVxX3N0YXJ0LCByZXFfZW5kLCBmaWVsZF9zdGFydCwgZmllbGRfZW5kOworCisJaWYgKHVubGlrZWx5KHZlcmJvc2VfcmVxdWVzdCkpCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICBEUlZfTkFNRSAiOiAlczogd3JpdGUgcmVxdWVzdCAlZCBieXRlcyBhdCAweCV4ID0gJXhcbiIsCisJCSAgICAgICBwY2lfbmFtZShkZXYpLCBzaXplLCBvZmZzZXQsIHZhbHVlKTsKKworCWlmICghdmFsaWRfcmVxdWVzdChvZmZzZXQsIHNpemUpKQorCQlyZXR1cm4gWEVOX1BDSV9FUlJfaW52YWxpZF9vZmZzZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNmZ19lbnRyeSwgJmRldl9kYXRhLT5jb25maWdfZmllbGRzLCBsaXN0KSB7CisJCWZpZWxkID0gY2ZnX2VudHJ5LT5maWVsZDsKKworCQlyZXFfc3RhcnQgPSBvZmZzZXQ7CisJCXJlcV9lbmQgPSBvZmZzZXQgKyBzaXplOworCQlmaWVsZF9zdGFydCA9IE9GRlNFVChjZmdfZW50cnkpOworCQlmaWVsZF9lbmQgPSBPRkZTRVQoY2ZnX2VudHJ5KSArIGZpZWxkLT5zaXplOworCisJCWlmICgocmVxX3N0YXJ0ID49IGZpZWxkX3N0YXJ0ICYmIHJlcV9zdGFydCA8IGZpZWxkX2VuZCkKKwkJICAgIHx8IChyZXFfZW5kID4gZmllbGRfc3RhcnQgJiYgcmVxX2VuZCA8PSBmaWVsZF9lbmQpKSB7CisJCQl0bXBfdmFsID0gMDsKKworCQkJZXJyID0geGVuX3BjaWJrX2NvbmZpZ19yZWFkKGRldiwgZmllbGRfc3RhcnQsCisJCQkJCQkgIGZpZWxkLT5zaXplLCAmdG1wX3ZhbCk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCisJCQl0bXBfdmFsID0gbWVyZ2VfdmFsdWUodG1wX3ZhbCwgdmFsdWUsIGdldF9tYXNrKHNpemUpLAorCQkJCQkgICAgICByZXFfc3RhcnQgLSBmaWVsZF9zdGFydCk7CisKKwkJCWVyciA9IGNvbmZfc3BhY2Vfd3JpdGUoZGV2LCBjZmdfZW50cnksIGZpZWxkX3N0YXJ0LAorCQkJCQkgICAgICAgdG1wX3ZhbCk7CisKKwkJCS8qIGhhbmRsZWQgaXMgc2V0IHRydWUgaGVyZSwgYnV0IG5vdCBldmVyeSBieXRlCisJCQkgKiBtYXkgaGF2ZSBiZWVuIHdyaXR0ZW4hIFByb3Blcmx5IGRldGVjdGluZyBpZgorCQkJICogZXZlcnkgYnl0ZSBpcyBoYW5kbGVkIGlzIHVubmVjZXNzYXJ5IGFzIHRoZQorCQkJICogZmxhZyBpcyB1c2VkIHRvIGRldGVjdCBkZXZpY2VzIHRoYXQgbmVlZAorCQkJICogc3BlY2lhbCBoZWxwZXJzIHRvIHdvcmsgY29ycmVjdGx5LgorCQkJICovCisJCQloYW5kbGVkID0gMTsKKwkJfQorCX0KKworCWlmICghaGFuZGxlZCAmJiAhZXJyKSB7CisJCS8qIEJ5IGRlZmF1bHQsIGFueXRoaW5nIG5vdCBzcGVjaWZpY2lhbGx5IGhhbmRsZWQgYWJvdmUgaXMKKwkJICogcmVhZC1vbmx5LiBUaGUgcGVybWlzc2l2ZSBmbGFnIGNoYW5nZXMgdGhpcyBiZWhhdmlvciBzbworCQkgKiB0aGF0IGFueXRoaW5nIG5vdCBzcGVjaWZpY2FsbHkgaGFuZGxlZCBhYm92ZSBpcyB3cml0YWJsZS4KKwkJICogVGhpcyBtZWFucyB0aGF0IHNvbWUgZmllbGRzIG1heSBzdGlsbCBiZSByZWFkLW9ubHkgYmVjYXVzZQorCQkgKiB0aGV5IGhhdmUgZW50cmllcyBpbiB0aGUgY29uZmlnX2ZpZWxkIGxpc3QgdGhhdCBpbnRlcmNlcHQKKwkJICogdGhlIHdyaXRlIGFuZCBkbyBub3RoaW5nLiAqLworCQlpZiAoZGV2X2RhdGEtPnBlcm1pc3NpdmUgfHwgcGVybWlzc2l2ZSkgeworCQkJc3dpdGNoIChzaXplKSB7CisJCQljYXNlIDE6CisJCQkJZXJyID0gcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgb2Zmc2V0LAorCQkJCQkJCSAgICAodTgpIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQllcnIgPSBwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBvZmZzZXQsCisJCQkJCQkJICAgICh1MTYpIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQllcnIgPSBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgb2Zmc2V0LAorCQkJCQkJCSAgICAgKHUzMikgdmFsdWUpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKCFkZXZfZGF0YS0+d2FybmVkX29uX3dyaXRlKSB7CisJCQlkZXZfZGF0YS0+d2FybmVkX29uX3dyaXRlID0gMTsKKwkJCWRldl93YXJuKCZkZXYtPmRldiwgIkRyaXZlciB0cmllZCB0byB3cml0ZSB0byBhICIKKwkJCQkgInJlYWQtb25seSBjb25maWd1cmF0aW9uIHNwYWNlIGZpZWxkIGF0IG9mZnNldCIKKwkJCQkgIiAweCV4LCBzaXplICVkLiBUaGlzIG1heSBiZSBoYXJtbGVzcywgYnV0IGlmICIKKwkJCQkgInlvdSBoYXZlIHByb2JsZW1zIHdpdGggeW91ciBkZXZpY2U6XG4iCisJCQkJICIxKSBzZWUgcGVybWlzc2l2ZSBhdHRyaWJ1dGUgaW4gc3lzZnNcbiIKKwkJCQkgIjIpIHJlcG9ydCBwcm9ibGVtcyB0byB0aGUgeGVuLWRldmVsICIKKwkJCQkgIm1haWxpbmcgbGlzdCBhbG9uZyB3aXRoIGRldGFpbHMgb2YgeW91ciAiCisJCQkJICJkZXZpY2Ugb2J0YWluZWQgZnJvbSBsc3BjaS5cbiIsIG9mZnNldCwgc2l6ZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcGNpYmlvc19lcnJfdG9fZXJybm8oZXJyKTsKK30KKwordm9pZCB4ZW5fcGNpYmtfY29uZmlnX2ZyZWVfZHluX2ZpZWxkcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCB4ZW5fcGNpYmtfZGV2X2RhdGEgKmRldl9kYXRhID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGNvbmZpZ19maWVsZF9lbnRyeSAqY2ZnX2VudHJ5LCAqdDsKKwljb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkICpmaWVsZDsKKworCWRldl9kYmcoJmRldi0+ZGV2LCAiZnJlZS1pbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHZpcnR1YWwgIgorCQkJICAgImNvbmZpZ3VyYXRpb24gc3BhY2UgZmllbGRzXG4iKTsKKwlpZiAoIWRldl9kYXRhKQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2ZnX2VudHJ5LCB0LCAmZGV2X2RhdGEtPmNvbmZpZ19maWVsZHMsIGxpc3QpIHsKKwkJZmllbGQgPSBjZmdfZW50cnktPmZpZWxkOworCisJCWlmIChmaWVsZC0+Y2xlYW4pIHsKKwkJCWZpZWxkLT5jbGVhbigoc3RydWN0IGNvbmZpZ19maWVsZCAqKWZpZWxkKTsKKworCQkJa2ZyZWUoY2ZnX2VudHJ5LT5kYXRhKTsKKworCQkJbGlzdF9kZWwoJmNmZ19lbnRyeS0+bGlzdCk7CisJCQlrZnJlZShjZmdfZW50cnkpOworCQl9CisKKwl9Cit9CisKK3ZvaWQgeGVuX3BjaWJrX2NvbmZpZ19yZXNldF9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgeGVuX3BjaWJrX2Rldl9kYXRhICpkZXZfZGF0YSA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCWNvbnN0IHN0cnVjdCBjb25maWdfZmllbGRfZW50cnkgKmNmZ19lbnRyeTsKKwljb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkICpmaWVsZDsKKworCWRldl9kYmcoJmRldi0+ZGV2LCAicmVzZXR0aW5nIHZpcnR1YWwgY29uZmlndXJhdGlvbiBzcGFjZVxuIik7CisJaWYgKCFkZXZfZGF0YSkKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZmdfZW50cnksICZkZXZfZGF0YS0+Y29uZmlnX2ZpZWxkcywgbGlzdCkgeworCQlmaWVsZCA9IGNmZ19lbnRyeS0+ZmllbGQ7CisKKwkJaWYgKGZpZWxkLT5yZXNldCkKKwkJCWZpZWxkLT5yZXNldChkZXYsIE9GRlNFVChjZmdfZW50cnkpLCBjZmdfZW50cnktPmRhdGEpOworCX0KK30KKwordm9pZCB4ZW5fcGNpYmtfY29uZmlnX2ZyZWVfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHhlbl9wY2lia19kZXZfZGF0YSAqZGV2X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgY29uZmlnX2ZpZWxkX2VudHJ5ICpjZmdfZW50cnksICp0OworCWNvbnN0IHN0cnVjdCBjb25maWdfZmllbGQgKmZpZWxkOworCisJZGV2X2RiZygmZGV2LT5kZXYsICJmcmVlLWluZyB2aXJ0dWFsIGNvbmZpZ3VyYXRpb24gc3BhY2UgZmllbGRzXG4iKTsKKwlpZiAoIWRldl9kYXRhKQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2ZnX2VudHJ5LCB0LCAmZGV2X2RhdGEtPmNvbmZpZ19maWVsZHMsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmNmZ19lbnRyeS0+bGlzdCk7CisKKwkJZmllbGQgPSBjZmdfZW50cnktPmZpZWxkOworCisJCWlmIChmaWVsZC0+cmVsZWFzZSkKKwkJCWZpZWxkLT5yZWxlYXNlKGRldiwgT0ZGU0VUKGNmZ19lbnRyeSksIGNmZ19lbnRyeS0+ZGF0YSk7CisKKwkJa2ZyZWUoY2ZnX2VudHJ5KTsKKwl9Cit9CisKK2ludCB4ZW5fcGNpYmtfY29uZmlnX2FkZF9maWVsZF9vZmZzZXQoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGNvbmZpZ19maWVsZCAqZmllbGQsCisJCQkJICAgIHVuc2lnbmVkIGludCBiYXNlX29mZnNldCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgeGVuX3BjaWJrX2Rldl9kYXRhICpkZXZfZGF0YSA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBjb25maWdfZmllbGRfZW50cnkgKmNmZ19lbnRyeTsKKwl2b2lkICp0bXA7CisKKwljZmdfZW50cnkgPSBrbWFsbG9jKHNpemVvZigqY2ZnX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZmdfZW50cnkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJY2ZnX2VudHJ5LT5kYXRhID0gTlVMTDsKKwljZmdfZW50cnktPmZpZWxkID0gZmllbGQ7CisJY2ZnX2VudHJ5LT5iYXNlX29mZnNldCA9IGJhc2Vfb2Zmc2V0OworCisJLyogc2lsZW50bHkgaWdub3JlIGR1cGxpY2F0ZSBmaWVsZHMgKi8KKwllcnIgPSB4ZW5fcGNpYmtfZmllbGRfaXNfZHVwKGRldiwgT0ZGU0VUKGNmZ19lbnRyeSkpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaWYgKGZpZWxkLT5pbml0KSB7CisJCXRtcCA9IGZpZWxkLT5pbml0KGRldiwgT0ZGU0VUKGNmZ19lbnRyeSkpOworCisJCWlmIChJU19FUlIodG1wKSkgeworCQkJZXJyID0gUFRSX0VSUih0bXApOworCQkJZ290byBvdXQ7CisJCX0KKworCQljZmdfZW50cnktPmRhdGEgPSB0bXA7CisJfQorCisJZGV2X2RiZygmZGV2LT5kZXYsICJhZGRlZCBjb25maWcgZmllbGQgYXQgb2Zmc2V0IDB4JTAyeFxuIiwKKwkJT0ZGU0VUKGNmZ19lbnRyeSkpOworCWxpc3RfYWRkX3RhaWwoJmNmZ19lbnRyeS0+bGlzdCwgJmRldl9kYXRhLT5jb25maWdfZmllbGRzKTsKKworb3V0OgorCWlmIChlcnIpCisJCWtmcmVlKGNmZ19lbnRyeSk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBUaGlzIHNldHMgdXAgdGhlIGRldmljZSdzIHZpcnR1YWwgY29uZmlndXJhdGlvbiBzcGFjZSB0byBrZWVwIHRyYWNrIG9mCisgKiBjZXJ0YWluIHJlZ2lzdGVycyAobGlrZSB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVycyAoQkFScykgc28gdGhhdCB3ZSBjYW4KKyAqIGtlZXAgdGhlIGNsaWVudCBmcm9tIG1hbmlwdWxhdGluZyB0aGVtIGRpcmVjdGx5LgorICovCitpbnQgeGVuX3BjaWJrX2NvbmZpZ19pbml0X2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCB4ZW5fcGNpYmtfZGV2X2RhdGEgKmRldl9kYXRhID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwlkZXZfZGJnKCZkZXYtPmRldiwgImluaXRpYWxpemluZyB2aXJ0dWFsIGNvbmZpZ3VyYXRpb24gc3BhY2VcbiIpOworCisJSU5JVF9MSVNUX0hFQUQoJmRldl9kYXRhLT5jb25maWdfZmllbGRzKTsKKworCWVyciA9IHhlbl9wY2lia19jb25maWdfaGVhZGVyX2FkZF9maWVsZHMoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IHhlbl9wY2lia19jb25maWdfY2FwYWJpbGl0eV9hZGRfZmllbGRzKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSB4ZW5fcGNpYmtfY29uZmlnX3F1aXJrc19pbml0KGRldik7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitpbnQgeGVuX3BjaWJrX2NvbmZpZ19pbml0KHZvaWQpCit7CisJcmV0dXJuIHhlbl9wY2lia19jb25maWdfY2FwYWJpbGl0eV9pbml0KCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9jb25mX3NwYWNlLmggYi9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9jb25mX3NwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2YzkzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL2NvbmZfc3BhY2UuaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIFBDSSBCYWNrZW5kIC0gQ29tbW9uIGRhdGEgc3RydWN0dXJlcyBmb3Igb3ZlcnJpZGluZyB0aGUgY29uZmlndXJhdGlvbiBzcGFjZQorICoKKyAqIEF1dGhvcjogUnlhbiBXaWxzb24gPGhhcDlAZXBvY2gubmNzYy5taWw+CisgKi8KKworI2lmbmRlZiBfX1hFTl9QQ0lCQUNLX0NPTkZfU1BBQ0VfSF9fCisjZGVmaW5lIF9fWEVOX1BDSUJBQ0tfQ09ORl9TUEFDRV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworLyogY29uZl9maWVsZF9pbml0IGNhbiByZXR1cm4gYW4gZXJybm8gaW4gYSBwdHIgd2l0aCBFUlJfUFRSKCkgKi8KK3R5cGVkZWYgdm9pZCAqKCpjb25mX2ZpZWxkX2luaXQpIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0KTsKK3R5cGVkZWYgdm9pZCAoKmNvbmZfZmllbGRfcmVzZXQpIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoKmNvbmZfZmllbGRfZnJlZSkgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIHZvaWQgKmRhdGEpOworCit0eXBlZGVmIGludCAoKmNvbmZfZHdvcmRfd3JpdGUpIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB1MzIgdmFsdWUsCisJCQkJIHZvaWQgKmRhdGEpOwordHlwZWRlZiBpbnQgKCpjb25mX3dvcmRfd3JpdGUpIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB1MTYgdmFsdWUsCisJCQkJdm9pZCAqZGF0YSk7Cit0eXBlZGVmIGludCAoKmNvbmZfYnl0ZV93cml0ZSkgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIHU4IHZhbHVlLAorCQkJCXZvaWQgKmRhdGEpOwordHlwZWRlZiBpbnQgKCpjb25mX2R3b3JkX3JlYWQpIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB1MzIgKnZhbHVlLAorCQkJCXZvaWQgKmRhdGEpOwordHlwZWRlZiBpbnQgKCpjb25mX3dvcmRfcmVhZCkgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIHUxNiAqdmFsdWUsCisJCQkgICAgICAgdm9pZCAqZGF0YSk7Cit0eXBlZGVmIGludCAoKmNvbmZfYnl0ZV9yZWFkKSAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG9mZnNldCwgdTggKnZhbHVlLAorCQkJICAgICAgIHZvaWQgKmRhdGEpOworCisvKiBUaGVzZSBhcmUgdGhlIGZpZWxkcyB3aXRoaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3BhY2Ugd2hpY2ggd2UKKyAqIGFyZSBpbnRlcmVzdGVkIGluIGludGVyY2VwdGluZyByZWFkcy93cml0ZXMgdG8gYW5kIGNoYW5naW5nIHRoZWlyCisgKiB2YWx1ZXMuCisgKi8KK3N0cnVjdCBjb25maWdfZmllbGQgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IG1hc2s7CisJY29uZl9maWVsZF9pbml0IGluaXQ7CisJY29uZl9maWVsZF9yZXNldCByZXNldDsKKwljb25mX2ZpZWxkX2ZyZWUgcmVsZWFzZTsKKwl2b2lkICgqY2xlYW4pIChzdHJ1Y3QgY29uZmlnX2ZpZWxkICpmaWVsZCk7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJY29uZl9kd29yZF93cml0ZSB3cml0ZTsKKwkJCWNvbmZfZHdvcmRfcmVhZCByZWFkOworCQl9IGR3OworCQlzdHJ1Y3QgeworCQkJY29uZl93b3JkX3dyaXRlIHdyaXRlOworCQkJY29uZl93b3JkX3JlYWQgcmVhZDsKKwkJfSB3OworCQlzdHJ1Y3QgeworCQkJY29uZl9ieXRlX3dyaXRlIHdyaXRlOworCQkJY29uZl9ieXRlX3JlYWQgcmVhZDsKKwkJfSBiOworCX0gdTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgY29uZmlnX2ZpZWxkX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJY29uc3Qgc3RydWN0IGNvbmZpZ19maWVsZCAqZmllbGQ7CisJdW5zaWduZWQgaW50IGJhc2Vfb2Zmc2V0OworCXZvaWQgKmRhdGE7Cit9OworCisjZGVmaW5lIE9GRlNFVChjZmdfZW50cnkpICgoY2ZnX2VudHJ5KS0+YmFzZV9vZmZzZXQrKGNmZ19lbnRyeSktPmZpZWxkLT5vZmZzZXQpCisKKy8qIEFkZCBmaWVsZHMgdG8gYSBkZXZpY2UgLSB0aGUgYWRkX2ZpZWxkcyBtYWNybyBleHBlY3RzIHRvIGdldCBhIHBvaW50ZXIgdG8KKyAqIHRoZSBmaXJzdCBlbnRyeSBpbiBhbiBhcnJheSAob2Ygd2hpY2ggdGhlIGVuZGluZyBpcyBtYXJrZWQgYnkgc2l6ZT09MCkKKyAqLworaW50IHhlbl9wY2lia19jb25maWdfYWRkX2ZpZWxkX29mZnNldChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkICpmaWVsZCwKKwkJCQkgICAgdW5zaWduZWQgaW50IG9mZnNldCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHhlbl9wY2lia19jb25maWdfYWRkX2ZpZWxkKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBjb25maWdfZmllbGQgKmZpZWxkKQoreworCXJldHVybiB4ZW5fcGNpYmtfY29uZmlnX2FkZF9maWVsZF9vZmZzZXQoZGV2LCBmaWVsZCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhlbl9wY2lia19jb25maWdfYWRkX2ZpZWxkcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkgICAgY29uc3Qgc3RydWN0IGNvbmZpZ19maWVsZCAqZmllbGQpCit7CisJaW50IGksIGVyciA9IDA7CisJZm9yIChpID0gMDsgZmllbGRbaV0uc2l6ZSAhPSAwOyBpKyspIHsKKwkJZXJyID0geGVuX3BjaWJrX2NvbmZpZ19hZGRfZmllbGQoZGV2LCAmZmllbGRbaV0pOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhlbl9wY2lia19jb25maWdfYWRkX2ZpZWxkc19vZmZzZXQoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJY29uc3Qgc3RydWN0IGNvbmZpZ19maWVsZCAqZmllbGQsCisJCQkJCXVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJaW50IGksIGVyciA9IDA7CisJZm9yIChpID0gMDsgZmllbGRbaV0uc2l6ZSAhPSAwOyBpKyspIHsKKwkJZXJyID0geGVuX3BjaWJrX2NvbmZpZ19hZGRfZmllbGRfb2Zmc2V0KGRldiwgJmZpZWxkW2ldLCBvZmZzZXQpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qIFJlYWQvV3JpdGUgdGhlIHJlYWwgY29uZmlndXJhdGlvbiBzcGFjZSAqLworaW50IHhlbl9wY2lia19yZWFkX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIHU4ICp2YWx1ZSwKKwkJCSAgICAgICB2b2lkICpkYXRhKTsKK2ludCB4ZW5fcGNpYmtfcmVhZF9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB1MTYgKnZhbHVlLAorCQkJICAgICAgIHZvaWQgKmRhdGEpOworaW50IHhlbl9wY2lia19yZWFkX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB1MzIgKnZhbHVlLAorCQkJCXZvaWQgKmRhdGEpOworaW50IHhlbl9wY2lia193cml0ZV9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB1OCB2YWx1ZSwKKwkJCQkgdm9pZCAqZGF0YSk7CitpbnQgeGVuX3BjaWJrX3dyaXRlX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIHUxNiB2YWx1ZSwKKwkJCQl2b2lkICpkYXRhKTsKK2ludCB4ZW5fcGNpYmtfd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIHUzMiB2YWx1ZSwKKwkJCQkgdm9pZCAqZGF0YSk7CisKK2ludCB4ZW5fcGNpYmtfY29uZmlnX2NhcGFiaWxpdHlfaW5pdCh2b2lkKTsKKworaW50IHhlbl9wY2lia19jb25maWdfaGVhZGVyX2FkZF9maWVsZHMoc3RydWN0IHBjaV9kZXYgKmRldik7CitpbnQgeGVuX3BjaWJrX2NvbmZpZ19jYXBhYmlsaXR5X2FkZF9maWVsZHMoc3RydWN0IHBjaV9kZXYgKmRldik7CisKKyNlbmRpZgkJCQkvKiBfX1hFTl9QQ0lCQUNLX0NPTkZfU1BBQ0VfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9jb25mX3NwYWNlX2NhcGFiaWxpdHkuYyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL2NvbmZfc3BhY2VfY2FwYWJpbGl0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODNlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9jb25mX3NwYWNlX2NhcGFiaWxpdHkuYwpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIFBDSSBCYWNrZW5kIC0gSGFuZGxlcyB0aGUgdmlydHVhbCBmaWVsZHMgZm91bmQgb24gdGhlIGNhcGFiaWxpdHkgbGlzdHMKKyAqICAgICAgICAgICAgICAgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3BhY2UuCisgKgorICogQXV0aG9yOiBSeWFuIFdpbHNvbiA8aGFwOUBlcG9jaC5uY3NjLm1pbD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAicGNpYmFjay5oIgorI2luY2x1ZGUgImNvbmZfc3BhY2UuaCIKKworc3RhdGljIExJU1RfSEVBRChjYXBhYmlsaXRpZXMpOworc3RydWN0IHhlbl9wY2lia19jb25maWdfY2FwYWJpbGl0eSB7CisJc3RydWN0IGxpc3RfaGVhZCBjYXBfbGlzdDsKKworCWludCBjYXBhYmlsaXR5OworCisJLyogSWYgdGhlIGRldmljZSBoYXMgdGhlIGNhcGFiaWxpdHkgZm91bmQgYWJvdmUsIGFkZCB0aGVzZSBmaWVsZHMgKi8KKwljb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkICpmaWVsZHM7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbmZpZ19maWVsZCBjYXBsaXN0X2hlYWRlcltdID0geworCXsKKwkgLm9mZnNldCAgICA9IFBDSV9DQVBfTElTVF9JRCwKKwkgLnNpemUgICAgICA9IDIsIC8qIGVuY29tcGFzcyBQQ0lfQ0FQX0xJU1RfSUQgJiBQQ0lfQ0FQX0xJU1RfTkVYVCAqLworCSAudS53LnJlYWQgID0geGVuX3BjaWJrX3JlYWRfY29uZmlnX3dvcmQsCisJIC51Lncud3JpdGUgPSBOVUxMLAorCX0sCisJe30KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl9jYXBhYmlsaXR5KHN0cnVjdCB4ZW5fcGNpYmtfY29uZmlnX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlsaXN0X2FkZF90YWlsKCZjYXAtPmNhcF9saXN0LCAmY2FwYWJpbGl0aWVzKTsKK30KKworaW50IHhlbl9wY2lia19jb25maWdfY2FwYWJpbGl0eV9hZGRfZmllbGRzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHhlbl9wY2lia19jb25maWdfY2FwYWJpbGl0eSAqY2FwOworCWludCBjYXBfb2Zmc2V0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYXAsICZjYXBhYmlsaXRpZXMsIGNhcF9saXN0KSB7CisJCWNhcF9vZmZzZXQgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgY2FwLT5jYXBhYmlsaXR5KTsKKwkJaWYgKGNhcF9vZmZzZXQpIHsKKwkJCWRldl9kYmcoJmRldi0+ZGV2LCAiRm91bmQgY2FwYWJpbGl0eSAweCV4IGF0IDB4JXhcbiIsCisJCQkJY2FwLT5jYXBhYmlsaXR5LCBjYXBfb2Zmc2V0KTsKKworCQkJZXJyID0geGVuX3BjaWJrX2NvbmZpZ19hZGRfZmllbGRzX29mZnNldChkZXYsCisJCQkJCQkJICAgICAgIGNhcGxpc3RfaGVhZGVyLAorCQkJCQkJCSAgICAgICBjYXBfb2Zmc2V0KTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCQllcnIgPSB4ZW5fcGNpYmtfY29uZmlnX2FkZF9maWVsZHNfb2Zmc2V0KGRldiwKKwkJCQkJCQkgICAgICAgY2FwLT5maWVsZHMsCisJCQkJCQkJICAgICAgIGNhcF9vZmZzZXQpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdnBkX2FkZHJlc3Nfd3JpdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG9mZnNldCwgdTE2IHZhbHVlLAorCQkJICAgICB2b2lkICpkYXRhKQoreworCS8qIERpc2FsbG93IHdyaXRlcyB0byB0aGUgdml0YWwgcHJvZHVjdCBkYXRhICovCisJaWYgKHZhbHVlICYgUENJX1ZQRF9BRERSX0YpCisJCXJldHVybiBQQ0lCSU9TX1NFVF9GQUlMRUQ7CisJZWxzZQorCQlyZXR1cm4gcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgb2Zmc2V0LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkIGNhcGxpc3RfdnBkW10gPSB7CisJeworCSAub2Zmc2V0ICAgID0gUENJX1ZQRF9BRERSLAorCSAuc2l6ZSAgICAgID0gMiwKKwkgLnUudy5yZWFkICA9IHhlbl9wY2lia19yZWFkX2NvbmZpZ193b3JkLAorCSAudS53LndyaXRlID0gdnBkX2FkZHJlc3Nfd3JpdGUsCisJIH0sCisJeworCSAub2Zmc2V0ICAgICA9IFBDSV9WUERfREFUQSwKKwkgLnNpemUgICAgICAgPSA0LAorCSAudS5kdy5yZWFkICA9IHhlbl9wY2lia19yZWFkX2NvbmZpZ19kd29yZCwKKwkgLnUuZHcud3JpdGUgPSBOVUxMLAorCSB9LAorCXt9Cit9OworCitzdGF0aWMgaW50IHBtX2NhcHNfcmVhZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB1MTYgKnZhbHVlLAorCQkJdm9pZCAqZGF0YSkKK3sKKwlpbnQgZXJyOworCXUxNiByZWFsX3ZhbHVlOworCisJZXJyID0gcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBvZmZzZXQsICZyZWFsX3ZhbHVlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCSp2YWx1ZSA9IHJlYWxfdmFsdWUgJiB+UENJX1BNX0NBUF9QTUVfTUFTSzsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qIFBNX09LX0JJVFMgc3BlY2lmaWVzIHRoZSBiaXRzIHRoYXQgdGhlIGRyaXZlciBkb21haW4gaXMgYWxsb3dlZCB0byBjaGFuZ2UuCisgKiBDYW4ndCBhbGxvdyBkcml2ZXIgZG9tYWluIHRvIGVuYWJsZSBQTUVzIC0gdGhleSdyZSBzaGFyZWQgKi8KKyNkZWZpbmUgUE1fT0tfQklUUyAoUENJX1BNX0NUUkxfUE1FX1NUQVRVU3xQQ0lfUE1fQ1RSTF9EQVRBX1NFTF9NQVNLKQorCitzdGF0aWMgaW50IHBtX2N0cmxfd3JpdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG9mZnNldCwgdTE2IG5ld192YWx1ZSwKKwkJCSB2b2lkICpkYXRhKQoreworCWludCBlcnI7CisJdTE2IG9sZF92YWx1ZTsKKwlwY2lfcG93ZXJfdCBuZXdfc3RhdGUsIG9sZF9zdGF0ZTsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgb2Zmc2V0LCAmb2xkX3ZhbHVlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCW9sZF9zdGF0ZSA9IChwY2lfcG93ZXJfdCkob2xkX3ZhbHVlICYgUENJX1BNX0NUUkxfU1RBVEVfTUFTSyk7CisJbmV3X3N0YXRlID0gKHBjaV9wb3dlcl90KShuZXdfdmFsdWUgJiBQQ0lfUE1fQ1RSTF9TVEFURV9NQVNLKTsKKworCW5ld192YWx1ZSAmPSBQTV9PS19CSVRTOworCWlmICgob2xkX3ZhbHVlICYgUE1fT0tfQklUUykgIT0gbmV3X3ZhbHVlKSB7CisJCW5ld192YWx1ZSA9IChvbGRfdmFsdWUgJiB+UE1fT0tfQklUUykgfCBuZXdfdmFsdWU7CisJCWVyciA9IHBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIG9mZnNldCwgbmV3X3ZhbHVlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIExldCBwY2kgY29yZSBoYW5kbGUgdGhlIHBvd2VyIG1hbmFnZW1lbnQgY2hhbmdlICovCisJZGV2X2RiZygmZGV2LT5kZXYsICJzZXQgcG93ZXIgc3RhdGUgdG8gJXhcbiIsIG5ld19zdGF0ZSk7CisJZXJyID0gcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIG5ld19zdGF0ZSk7CisJaWYgKGVycikgeworCQllcnIgPSBQQ0lCSU9TX1NFVF9GQUlMRUQ7CisJCWdvdG8gb3V0OworCX0KKworIG91dDoKKwlyZXR1cm4gZXJyOworfQorCisvKiBFbnN1cmUgUE1FcyBhcmUgZGlzYWJsZWQgKi8KK3N0YXRpYyB2b2lkICpwbV9jdHJsX2luaXQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG9mZnNldCkKK3sKKwlpbnQgZXJyOworCXUxNiB2YWx1ZTsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgb2Zmc2V0LCAmdmFsdWUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaWYgKHZhbHVlICYgUENJX1BNX0NUUkxfUE1FX0VOQUJMRSkgeworCQl2YWx1ZSAmPSB+UENJX1BNX0NUUkxfUE1FX0VOQUJMRTsKKwkJZXJyID0gcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgb2Zmc2V0LCB2YWx1ZSk7CisJfQorCitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25maWdfZmllbGQgY2FwbGlzdF9wbVtdID0geworCXsKKwkJLm9mZnNldCAgICAgPSBQQ0lfUE1fUE1DLAorCQkuc2l6ZSAgICAgICA9IDIsCisJCS51LncucmVhZCAgID0gcG1fY2Fwc19yZWFkLAorCX0sCisJeworCQkub2Zmc2V0ICAgICA9IFBDSV9QTV9DVFJMLAorCQkuc2l6ZSAgICAgICA9IDIsCisJCS5pbml0ICAgICAgID0gcG1fY3RybF9pbml0LAorCQkudS53LnJlYWQgICA9IHhlbl9wY2lia19yZWFkX2NvbmZpZ193b3JkLAorCQkudS53LndyaXRlICA9IHBtX2N0cmxfd3JpdGUsCisJfSwKKwl7CisJCS5vZmZzZXQgICAgID0gUENJX1BNX1BQQl9FWFRFTlNJT05TLAorCQkuc2l6ZSAgICAgICA9IDEsCisJCS51LmIucmVhZCAgID0geGVuX3BjaWJrX3JlYWRfY29uZmlnX2J5dGUsCisJfSwKKwl7CisJCS5vZmZzZXQgICAgID0gUENJX1BNX0RBVEFfUkVHSVNURVIsCisJCS5zaXplICAgICAgID0gMSwKKwkJLnUuYi5yZWFkICAgPSB4ZW5fcGNpYmtfcmVhZF9jb25maWdfYnl0ZSwKKwl9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHhlbl9wY2lia19jb25maWdfY2FwYWJpbGl0eSB4ZW5fcGNpYmtfY29uZmlnX2NhcGFiaWxpdHlfcG0gPSB7CisJLmNhcGFiaWxpdHkgPSBQQ0lfQ0FQX0lEX1BNLAorCS5maWVsZHMgPSBjYXBsaXN0X3BtLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeGVuX3BjaWJrX2NvbmZpZ19jYXBhYmlsaXR5IHhlbl9wY2lia19jb25maWdfY2FwYWJpbGl0eV92cGQgPSB7CisJLmNhcGFiaWxpdHkgPSBQQ0lfQ0FQX0lEX1ZQRCwKKwkuZmllbGRzID0gY2FwbGlzdF92cGQsCit9OworCitpbnQgeGVuX3BjaWJrX2NvbmZpZ19jYXBhYmlsaXR5X2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9jYXBhYmlsaXR5KCZ4ZW5fcGNpYmtfY29uZmlnX2NhcGFiaWxpdHlfdnBkKTsKKwlyZWdpc3Rlcl9jYXBhYmlsaXR5KCZ4ZW5fcGNpYmtfY29uZmlnX2NhcGFiaWxpdHlfcG0pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9jb25mX3NwYWNlX2hlYWRlci5jIGIvZHJpdmVycy94ZW4veGVuLXBjaWJhY2svY29uZl9zcGFjZV9oZWFkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTNjYmRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy94ZW4veGVuLXBjaWJhY2svY29uZl9zcGFjZV9oZWFkZXIuYwpAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqIFBDSSBCYWNrZW5kIC0gSGFuZGxlcyB0aGUgdmlydHVhbCBmaWVsZHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3BhY2UgaGVhZGVycy4KKyAqCisgKiBBdXRob3I6IFJ5YW4gV2lsc29uIDxoYXA5QGVwb2NoLm5jc2MubWlsPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJwY2liYWNrLmgiCisjaW5jbHVkZSAiY29uZl9zcGFjZS5oIgorCitzdHJ1Y3QgcGNpX2Jhcl9pbmZvIHsKKwl1MzIgdmFsOworCXUzMiBsZW5fdmFsOworCWludCB3aGljaDsKK307CisKKyNkZWZpbmUgRFJWX05BTUUJInhlbi1wY2liYWNrIgorI2RlZmluZSBpc19lbmFibGVfY21kKHZhbHVlKSAoKHZhbHVlKSYoUENJX0NPTU1BTkRfTUVNT1JZfFBDSV9DT01NQU5EX0lPKSkKKyNkZWZpbmUgaXNfbWFzdGVyX2NtZCh2YWx1ZSkgKCh2YWx1ZSkmUENJX0NPTU1BTkRfTUFTVEVSKQorCitzdGF0aWMgaW50IGNvbW1hbmRfcmVhZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB1MTYgKnZhbHVlLCB2b2lkICpkYXRhKQoreworCWludCBpOworCWludCByZXQ7CisKKwlyZXQgPSB4ZW5fcGNpYmtfcmVhZF9jb25maWdfd29yZChkZXYsIG9mZnNldCwgdmFsdWUsIGRhdGEpOworCWlmICghYXRvbWljX3JlYWQoJmRldi0+ZW5hYmxlX2NudCkpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CisJCWlmIChkZXYtPnJlc291cmNlW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCSp2YWx1ZSB8PSBQQ0lfQ09NTUFORF9JTzsKKwkJaWYgKGRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJCSp2YWx1ZSB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb21tYW5kX3dyaXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIHUxNiB2YWx1ZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgeGVuX3BjaWJrX2Rldl9kYXRhICpkZXZfZGF0YTsKKwlpbnQgZXJyOworCisJZGV2X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlpZiAoIXBjaV9pc19lbmFibGVkKGRldikgJiYgaXNfZW5hYmxlX2NtZCh2YWx1ZSkpIHsKKwkJaWYgKHVubGlrZWx5KHZlcmJvc2VfcmVxdWVzdCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlczogZW5hYmxlXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKGRldikpOworCQllcnIgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKGRldl9kYXRhKQorCQkJZGV2X2RhdGEtPmVuYWJsZV9pbnR4ID0gMTsKKwl9IGVsc2UgaWYgKHBjaV9pc19lbmFibGVkKGRldikgJiYgIWlzX2VuYWJsZV9jbWQodmFsdWUpKSB7CisJCWlmICh1bmxpa2VseSh2ZXJib3NlX3JlcXVlc3QpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXM6IGRpc2FibGVcbiIsCisJCQkgICAgICAgcGNpX25hbWUoZGV2KSk7CisJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCQlpZiAoZGV2X2RhdGEpCisJCQlkZXZfZGF0YS0+ZW5hYmxlX2ludHggPSAwOworCX0KKworCWlmICghZGV2LT5pc19idXNtYXN0ZXIgJiYgaXNfbWFzdGVyX2NtZCh2YWx1ZSkpIHsKKwkJaWYgKHVubGlrZWx5KHZlcmJvc2VfcmVxdWVzdCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlczogc2V0IGJ1cyBtYXN0ZXJcbiIsCisJCQkgICAgICAgcGNpX25hbWUoZGV2KSk7CisJCXBjaV9zZXRfbWFzdGVyKGRldik7CisJfQorCisJaWYgKHZhbHVlICYgUENJX0NPTU1BTkRfSU5WQUxJREFURSkgeworCQlpZiAodW5saWtlbHkodmVyYm9zZV9yZXF1ZXN0KSkKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkgICAgICAgRFJWX05BTUUgIjogJXM6IGVuYWJsZSBtZW1vcnktd3JpdGUtaW52YWxpZGF0ZVxuIiwKKwkJCSAgICAgICBwY2lfbmFtZShkZXYpKTsKKwkJZXJyID0gcGNpX3NldF9td2koZGV2KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgIERSVl9OQU1FICI6ICVzOiBjYW5ub3QgZW5hYmxlICIKKwkJCSAgICAgICAibWVtb3J5LXdyaXRlLWludmFsaWRhdGUgKCVkKVxuIiwKKwkJCSAgICAgICBwY2lfbmFtZShkZXYpLCBlcnIpOworCQkJdmFsdWUgJj0gflBDSV9DT01NQU5EX0lOVkFMSURBVEU7CisJCX0KKwl9CisKKwlyZXR1cm4gcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgb2Zmc2V0LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgcm9tX3dyaXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIHUzMiB2YWx1ZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNpX2Jhcl9pbmZvICpiYXIgPSBkYXRhOworCisJaWYgKHVubGlrZWx5KCFiYXIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogZHJpdmVyIGRhdGEgbm90IGZvdW5kIGZvciAlc1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKGRldikpOworCQlyZXR1cm4gWEVOX1BDSV9FUlJfb3BfZmFpbGVkOworCX0KKworCS8qIEEgd3JpdGUgdG8gb2J0YWluIHRoZSBsZW5ndGggbXVzdCBoYXBwZW4gYXMgYSAzMi1iaXQgd3JpdGUuCisJICogVGhpcyBkb2VzIG5vdCAoeWV0KSBzdXBwb3J0IHdyaXRpbmcgaW5kaXZpZHVhbCBieXRlcworCSAqLworCWlmICh2YWx1ZSA9PSB+UENJX1JPTV9BRERSRVNTX0VOQUJMRSkKKwkJYmFyLT53aGljaCA9IDE7CisJZWxzZSB7CisJCXUzMiB0bXB2YWw7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIG9mZnNldCwgJnRtcHZhbCk7CisJCWlmICh0bXB2YWwgIT0gYmFyLT52YWwgJiYgdmFsdWUgPT0gYmFyLT52YWwpIHsKKwkJCS8qIEFsbG93IHJlc3RvcmF0aW9uIG9mIGJhciB2YWx1ZS4gKi8KKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBvZmZzZXQsIGJhci0+dmFsKTsKKwkJfQorCQliYXItPndoaWNoID0gMDsKKwl9CisKKwkvKiBEbyB3ZSBuZWVkIHRvIHN1cHBvcnQgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSByb20gYWRkcmVzcyBoZXJlPyAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIEZvciB0aGUgQkFScywgb25seSBhbGxvdyB3cml0ZXMgd2hpY2ggd3JpdGUgfjAgb3IKKyAqIHRoZSBjb3JyZWN0IHJlc291cmNlIGluZm9ybWF0aW9uCisgKiAoTmVlZGVkIGZvciB3aGVuIHRoZSBkcml2ZXIgcHJvYmVzIHRoZSByZXNvdXJjZSB1c2FnZSkKKyAqLworc3RhdGljIGludCBiYXJfd3JpdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG9mZnNldCwgdTMyIHZhbHVlLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwY2lfYmFyX2luZm8gKmJhciA9IGRhdGE7CisKKwlpZiAodW5saWtlbHkoIWJhcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiBkcml2ZXIgZGF0YSBub3QgZm91bmQgZm9yICVzXG4iLAorCQkgICAgICAgcGNpX25hbWUoZGV2KSk7CisJCXJldHVybiBYRU5fUENJX0VSUl9vcF9mYWlsZWQ7CisJfQorCisJLyogQSB3cml0ZSB0byBvYnRhaW4gdGhlIGxlbmd0aCBtdXN0IGhhcHBlbiBhcyBhIDMyLWJpdCB3cml0ZS4KKwkgKiBUaGlzIGRvZXMgbm90ICh5ZXQpIHN1cHBvcnQgd3JpdGluZyBpbmRpdmlkdWFsIGJ5dGVzCisJICovCisJaWYgKHZhbHVlID09IH4wKQorCQliYXItPndoaWNoID0gMTsKKwllbHNlIHsKKwkJdTMyIHRtcHZhbDsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgb2Zmc2V0LCAmdG1wdmFsKTsKKwkJaWYgKHRtcHZhbCAhPSBiYXItPnZhbCAmJiB2YWx1ZSA9PSBiYXItPnZhbCkgeworCQkJLyogQWxsb3cgcmVzdG9yYXRpb24gb2YgYmFyIHZhbHVlLiAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIG9mZnNldCwgYmFyLT52YWwpOworCQl9CisJCWJhci0+d2hpY2ggPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJhcl9yZWFkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIHUzMiAqIHZhbHVlLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwY2lfYmFyX2luZm8gKmJhciA9IGRhdGE7CisKKwlpZiAodW5saWtlbHkoIWJhcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiBkcml2ZXIgZGF0YSBub3QgZm91bmQgZm9yICVzXG4iLAorCQkgICAgICAgcGNpX25hbWUoZGV2KSk7CisJCXJldHVybiBYRU5fUENJX0VSUl9vcF9mYWlsZWQ7CisJfQorCisJKnZhbHVlID0gYmFyLT53aGljaCA/IGJhci0+bGVuX3ZhbCA6IGJhci0+dmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWFkX2Rldl9iYXIoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQlzdHJ1Y3QgcGNpX2Jhcl9pbmZvICpiYXJfaW5mbywgaW50IG9mZnNldCwKKwkJCQl1MzIgbGVuX21hc2spCit7CisJaW50CXBvczsKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlcyA9IGRldi0+cmVzb3VyY2U7CisKKwlpZiAob2Zmc2V0ID09IFBDSV9ST01fQUREUkVTUyB8fCBvZmZzZXQgPT0gUENJX1JPTV9BRERSRVNTMSkKKwkJcG9zID0gUENJX1JPTV9SRVNPVVJDRTsKKwllbHNlIHsKKwkJcG9zID0gKG9mZnNldCAtIFBDSV9CQVNFX0FERFJFU1NfMCkgLyA0OworCQlpZiAocG9zICYmICgocmVzW3BvcyAtIDFdLmZsYWdzICYgKFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UgfAorCQkJCVBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSykpID09CisJCQkgICAoUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkgfAorCQkJCVBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpKSkgeworCQkJYmFyX2luZm8tPnZhbCA9IHJlc1twb3MgLSAxXS5zdGFydCA+PiAzMjsKKwkJCWJhcl9pbmZvLT5sZW5fdmFsID0gcmVzW3BvcyAtIDFdLmVuZCA+PiAzMjsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWJhcl9pbmZvLT52YWwgPSByZXNbcG9zXS5zdGFydCB8CisJCQkocmVzW3Bvc10uZmxhZ3MgJiBQQ0lfUkVHSU9OX0ZMQUdfTUFTSyk7CisJYmFyX2luZm8tPmxlbl92YWwgPSByZXNbcG9zXS5lbmQgLSByZXNbcG9zXS5zdGFydCArIDE7Cit9CisKK3N0YXRpYyB2b2lkICpiYXJfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBwY2lfYmFyX2luZm8gKmJhciA9IGttYWxsb2Moc2l6ZW9mKCpiYXIpLCBHRlBfS0VSTkVMKTsKKworCWlmICghYmFyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXJlYWRfZGV2X2JhcihkZXYsIGJhciwgb2Zmc2V0LCB+MCk7CisJYmFyLT53aGljaCA9IDA7CisKKwlyZXR1cm4gYmFyOworfQorCitzdGF0aWMgdm9pZCAqcm9tX2luaXQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgcGNpX2Jhcl9pbmZvICpiYXIgPSBrbWFsbG9jKHNpemVvZigqYmFyKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJhcikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlyZWFkX2Rldl9iYXIoZGV2LCBiYXIsIG9mZnNldCwgflBDSV9ST01fQUREUkVTU19FTkFCTEUpOworCWJhci0+d2hpY2ggPSAwOworCisJcmV0dXJuIGJhcjsKK30KKworc3RhdGljIHZvaWQgYmFyX3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBjaV9iYXJfaW5mbyAqYmFyID0gZGF0YTsKKworCWJhci0+d2hpY2ggPSAwOworfQorCitzdGF0aWMgdm9pZCBiYXJfcmVsZWFzZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB2b2lkICpkYXRhKQoreworCWtmcmVlKGRhdGEpOworfQorCitzdGF0aWMgaW50IHhlbl9wY2lia19yZWFkX3ZlbmRvcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LAorCQkJICAgICAgIHUxNiAqdmFsdWUsIHZvaWQgKmRhdGEpCit7CisJKnZhbHVlID0gZGV2LT52ZW5kb3I7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZW5fcGNpYmtfcmVhZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG9mZnNldCwKKwkJCSAgICAgICB1MTYgKnZhbHVlLCB2b2lkICpkYXRhKQoreworCSp2YWx1ZSA9IGRldi0+ZGV2aWNlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZXJydXB0X3JlYWQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG9mZnNldCwgdTggKiB2YWx1ZSwKKwkJCSAgdm9pZCAqZGF0YSkKK3sKKwkqdmFsdWUgPSAodTgpIGRldi0+aXJxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmlzdF93cml0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCB1OCB2YWx1ZSwgdm9pZCAqZGF0YSkKK3sKKwl1OCBjdXJfdmFsdWU7CisJaW50IGVycjsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgb2Zmc2V0LCAmY3VyX3ZhbHVlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWlmICgoY3VyX3ZhbHVlICYgflBDSV9CSVNUX1NUQVJUKSA9PSAodmFsdWUgJiB+UENJX0JJU1RfU1RBUlQpCisJICAgIHx8IHZhbHVlID09IFBDSV9CSVNUX1NUQVJUKQorCQllcnIgPSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBvZmZzZXQsIHZhbHVlKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkIGhlYWRlcl9jb21tb25bXSA9IHsKKwl7CisJIC5vZmZzZXQgICAgPSBQQ0lfVkVORE9SX0lELAorCSAuc2l6ZSAgICAgID0gMiwKKwkgLnUudy5yZWFkICA9IHhlbl9wY2lia19yZWFkX3ZlbmRvciwKKwl9LAorCXsKKwkgLm9mZnNldCAgICA9IFBDSV9ERVZJQ0VfSUQsCisJIC5zaXplICAgICAgPSAyLAorCSAudS53LnJlYWQgID0geGVuX3BjaWJrX3JlYWRfZGV2aWNlLAorCX0sCisJeworCSAub2Zmc2V0ICAgID0gUENJX0NPTU1BTkQsCisJIC5zaXplICAgICAgPSAyLAorCSAudS53LnJlYWQgID0gY29tbWFuZF9yZWFkLAorCSAudS53LndyaXRlID0gY29tbWFuZF93cml0ZSwKKwl9LAorCXsKKwkgLm9mZnNldCAgICA9IFBDSV9JTlRFUlJVUFRfTElORSwKKwkgLnNpemUgICAgICA9IDEsCisJIC51LmIucmVhZCAgPSBpbnRlcnJ1cHRfcmVhZCwKKwl9LAorCXsKKwkgLm9mZnNldCAgICA9IFBDSV9JTlRFUlJVUFRfUElOLAorCSAuc2l6ZSAgICAgID0gMSwKKwkgLnUuYi5yZWFkICA9IHhlbl9wY2lia19yZWFkX2NvbmZpZ19ieXRlLAorCX0sCisJeworCSAvKiBBbnkgc2lkZSBlZmZlY3RzIG9mIGxldHRpbmcgZHJpdmVyIGRvbWFpbiBjb250cm9sIGNhY2hlIGxpbmU/ICovCisJIC5vZmZzZXQgICAgPSBQQ0lfQ0FDSEVfTElORV9TSVpFLAorCSAuc2l6ZSAgICAgID0gMSwKKwkgLnUuYi5yZWFkICA9IHhlbl9wY2lia19yZWFkX2NvbmZpZ19ieXRlLAorCSAudS5iLndyaXRlID0geGVuX3BjaWJrX3dyaXRlX2NvbmZpZ19ieXRlLAorCX0sCisJeworCSAub2Zmc2V0ICAgID0gUENJX0xBVEVOQ1lfVElNRVIsCisJIC5zaXplICAgICAgPSAxLAorCSAudS5iLnJlYWQgID0geGVuX3BjaWJrX3JlYWRfY29uZmlnX2J5dGUsCisJfSwKKwl7CisJIC5vZmZzZXQgICAgPSBQQ0lfQklTVCwKKwkgLnNpemUgICAgICA9IDEsCisJIC51LmIucmVhZCAgPSB4ZW5fcGNpYmtfcmVhZF9jb25maWdfYnl0ZSwKKwkgLnUuYi53cml0ZSA9IGJpc3Rfd3JpdGUsCisJfSwKKwl7fQorfTsKKworI2RlZmluZSBDRkdfRklFTERfQkFSKHJlZ19vZmZzZXQpCQkJXAorCXsJCQkJCQlcCisJLm9mZnNldCAgICAgPSByZWdfb2Zmc2V0LAkJCVwKKwkuc2l6ZSAgICAgICA9IDQsCQkJCVwKKwkuaW5pdCAgICAgICA9IGJhcl9pbml0LAkJCQlcCisJLnJlc2V0ICAgICAgPSBiYXJfcmVzZXQsCQkJXAorCS5yZWxlYXNlICAgID0gYmFyX3JlbGVhc2UsCQkJXAorCS51LmR3LnJlYWQgID0gYmFyX3JlYWQsCQkJCVwKKwkudS5kdy53cml0ZSA9IGJhcl93cml0ZSwJCQlcCisJfQorCisjZGVmaW5lIENGR19GSUVMRF9ST00ocmVnX29mZnNldCkJCQlcCisJewkJCQkJCVwKKwkub2Zmc2V0ICAgICA9IHJlZ19vZmZzZXQsCQkJXAorCS5zaXplICAgICAgID0gNCwJCQkJXAorCS5pbml0ICAgICAgID0gcm9tX2luaXQsCQkJCVwKKwkucmVzZXQgICAgICA9IGJhcl9yZXNldCwJCQlcCisJLnJlbGVhc2UgICAgPSBiYXJfcmVsZWFzZSwJCQlcCisJLnUuZHcucmVhZCAgPSBiYXJfcmVhZCwJCQkJXAorCS51LmR3LndyaXRlID0gcm9tX3dyaXRlLAkJCVwKKwl9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkIGhlYWRlcl8wW10gPSB7CisJQ0ZHX0ZJRUxEX0JBUihQQ0lfQkFTRV9BRERSRVNTXzApLAorCUNGR19GSUVMRF9CQVIoUENJX0JBU0VfQUREUkVTU18xKSwKKwlDRkdfRklFTERfQkFSKFBDSV9CQVNFX0FERFJFU1NfMiksCisJQ0ZHX0ZJRUxEX0JBUihQQ0lfQkFTRV9BRERSRVNTXzMpLAorCUNGR19GSUVMRF9CQVIoUENJX0JBU0VfQUREUkVTU180KSwKKwlDRkdfRklFTERfQkFSKFBDSV9CQVNFX0FERFJFU1NfNSksCisJQ0ZHX0ZJRUxEX1JPTShQQ0lfUk9NX0FERFJFU1MpLAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbmZpZ19maWVsZCBoZWFkZXJfMVtdID0geworCUNGR19GSUVMRF9CQVIoUENJX0JBU0VfQUREUkVTU18wKSwKKwlDRkdfRklFTERfQkFSKFBDSV9CQVNFX0FERFJFU1NfMSksCisJQ0ZHX0ZJRUxEX1JPTShQQ0lfUk9NX0FERFJFU1MxKSwKKwl7fQorfTsKKworaW50IHhlbl9wY2lia19jb25maWdfaGVhZGVyX2FkZF9maWVsZHMoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0geGVuX3BjaWJrX2NvbmZpZ19hZGRfZmllbGRzKGRldiwgaGVhZGVyX2NvbW1vbik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlzd2l0Y2ggKGRldi0+aGRyX3R5cGUpIHsKKwljYXNlIFBDSV9IRUFERVJfVFlQRV9OT1JNQUw6CisJCWVyciA9IHhlbl9wY2lia19jb25maWdfYWRkX2ZpZWxkcyhkZXYsIGhlYWRlcl8wKTsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9IRUFERVJfVFlQRV9CUklER0U6CisJCWVyciA9IHhlbl9wY2lia19jb25maWdfYWRkX2ZpZWxkcyhkZXYsIGhlYWRlcl8xKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXM6IFVuc3VwcG9ydGVkIGhlYWRlciB0eXBlICVkIVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKGRldiksIGRldi0+aGRyX3R5cGUpOworCQlicmVhazsKKwl9CisKK291dDoKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuLXBjaWJhY2svY29uZl9zcGFjZV9xdWlya3MuYyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL2NvbmZfc3BhY2VfcXVpcmtzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxYTg4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL2NvbmZfc3BhY2VfcXVpcmtzLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBQQ0kgQmFja2VuZCAtIEhhbmRsZSBzcGVjaWFsIG92ZXJsYXlzIGZvciBicm9rZW4gZGV2aWNlcy4KKyAqCisgKiBBdXRob3I6IFJ5YW4gV2lsc29uIDxoYXA5QGVwb2NoLm5jc2MubWlsPgorICogQXV0aG9yOiBDaHJpcyBCb29raG9sdCA8aGFwMTBAZXBvY2gubmNzYy5taWw+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInBjaWJhY2suaCIKKyNpbmNsdWRlICJjb25mX3NwYWNlLmgiCisjaW5jbHVkZSAiY29uZl9zcGFjZV9xdWlya3MuaCIKKworTElTVF9IRUFEKHhlbl9wY2lia19xdWlya3MpOworI2RlZmluZQlEUlZfTkFNRQkieGVuLXBjaWJhY2siCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICoKK21hdGNoX29uZV9kZXZpY2UoY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkLCBjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmICgoaWQtPnZlbmRvciA9PSBQQ0lfQU5ZX0lEIHx8IGlkLT52ZW5kb3IgPT0gZGV2LT52ZW5kb3IpICYmCisJICAgIChpZC0+ZGV2aWNlID09IFBDSV9BTllfSUQgfHwgaWQtPmRldmljZSA9PSBkZXYtPmRldmljZSkgJiYKKwkgICAgKGlkLT5zdWJ2ZW5kb3IgPT0gUENJX0FOWV9JRCB8fAorCQkJCWlkLT5zdWJ2ZW5kb3IgPT0gZGV2LT5zdWJzeXN0ZW1fdmVuZG9yKSAmJgorCSAgICAoaWQtPnN1YmRldmljZSA9PSBQQ0lfQU5ZX0lEIHx8CisJCQkJaWQtPnN1YmRldmljZSA9PSBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpICYmCisJICAgICEoKGlkLT5jbGFzcyBeIGRldi0+Y2xhc3MpICYgaWQtPmNsYXNzX21hc2spKQorCQlyZXR1cm4gaWQ7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGVuX3BjaWJrX2NvbmZpZ19xdWlyayAqeGVuX3BjaWJrX2ZpbmRfcXVpcmsoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgeGVuX3BjaWJrX2NvbmZpZ19xdWlyayAqdG1wX3F1aXJrOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfcXVpcmssICZ4ZW5fcGNpYmtfcXVpcmtzLCBxdWlya3NfbGlzdCkKKwkJaWYgKG1hdGNoX29uZV9kZXZpY2UoJnRtcF9xdWlyay0+ZGV2aWQsIGRldikgIT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCXRtcF9xdWlyayA9IE5VTEw7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUKKwkgICAgICAgIjpxdWlyayBkaWRuJ3QgbWF0Y2ggYW55IGRldmljZSB4ZW5fcGNpYmFjayBrbm93cyBhYm91dFxuIik7CitvdXQ6CisJcmV0dXJuIHRtcF9xdWlyazsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlZ2lzdGVyX3F1aXJrKHN0cnVjdCB4ZW5fcGNpYmtfY29uZmlnX3F1aXJrICpxdWlyaykKK3sKKwlsaXN0X2FkZF90YWlsKCZxdWlyay0+cXVpcmtzX2xpc3QsICZ4ZW5fcGNpYmtfcXVpcmtzKTsKK30KKworaW50IHhlbl9wY2lia19maWVsZF9pc19kdXAoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgeGVuX3BjaWJrX2Rldl9kYXRhICpkZXZfZGF0YSA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBjb25maWdfZmllbGRfZW50cnkgKmNmZ19lbnRyeTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2ZnX2VudHJ5LCAmZGV2X2RhdGEtPmNvbmZpZ19maWVsZHMsIGxpc3QpIHsKKwkJaWYgKE9GRlNFVChjZmdfZW50cnkpID09IHJlZykgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCB4ZW5fcGNpYmtfY29uZmlnX3F1aXJrc19hZGRfZmllbGQoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IGNvbmZpZ19maWVsZAorCQkJCSAgICAqZmllbGQpCit7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGZpZWxkLT5zaXplKSB7CisJY2FzZSAxOgorCQlmaWVsZC0+dS5iLnJlYWQgPSB4ZW5fcGNpYmtfcmVhZF9jb25maWdfYnl0ZTsKKwkJZmllbGQtPnUuYi53cml0ZSA9IHhlbl9wY2lia193cml0ZV9jb25maWdfYnl0ZTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlmaWVsZC0+dS53LnJlYWQgPSB4ZW5fcGNpYmtfcmVhZF9jb25maWdfd29yZDsKKwkJZmllbGQtPnUudy53cml0ZSA9IHhlbl9wY2lia193cml0ZV9jb25maWdfd29yZDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlmaWVsZC0+dS5kdy5yZWFkID0geGVuX3BjaWJrX3JlYWRfY29uZmlnX2R3b3JkOworCQlmaWVsZC0+dS5kdy53cml0ZSA9IHhlbl9wY2lia193cml0ZV9jb25maWdfZHdvcmQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXhlbl9wY2lia19jb25maWdfYWRkX2ZpZWxkKGRldiwgZmllbGQpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworaW50IHhlbl9wY2lia19jb25maWdfcXVpcmtzX2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgeGVuX3BjaWJrX2NvbmZpZ19xdWlyayAqcXVpcms7CisJaW50IHJldCA9IDA7CisKKwlxdWlyayA9IGt6YWxsb2Moc2l6ZW9mKCpxdWlyayksIEdGUF9BVE9NSUMpOworCWlmICghcXVpcmspIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcXVpcmstPmRldmlkLnZlbmRvciA9IGRldi0+dmVuZG9yOworCXF1aXJrLT5kZXZpZC5kZXZpY2UgPSBkZXYtPmRldmljZTsKKwlxdWlyay0+ZGV2aWQuc3VidmVuZG9yID0gZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCXF1aXJrLT5kZXZpZC5zdWJkZXZpY2UgPSBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJcXVpcmstPmRldmlkLmNsYXNzID0gMDsKKwlxdWlyay0+ZGV2aWQuY2xhc3NfbWFzayA9IDA7CisJcXVpcmstPmRldmlkLmRyaXZlcl9kYXRhID0gMFVMOworCisJcXVpcmstPnBkZXYgPSBkZXY7CisKKwlyZWdpc3Rlcl9xdWlyayhxdWlyayk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCB4ZW5fcGNpYmtfY29uZmlnX2ZpZWxkX2ZyZWUoc3RydWN0IGNvbmZpZ19maWVsZCAqZmllbGQpCit7CisJa2ZyZWUoZmllbGQpOworfQorCitpbnQgeGVuX3BjaWJrX2NvbmZpZ19xdWlya19yZWxlYXNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHhlbl9wY2lia19jb25maWdfcXVpcmsgKnF1aXJrOworCWludCByZXQgPSAwOworCisJcXVpcmsgPSB4ZW5fcGNpYmtfZmluZF9xdWlyayhkZXYpOworCWlmICghcXVpcmspIHsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIG91dDsKKwl9CisKKwlsaXN0X2RlbCgmcXVpcmstPnF1aXJrc19saXN0KTsKKwlrZnJlZShxdWlyayk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuLXBjaWJhY2svY29uZl9zcGFjZV9xdWlya3MuaCBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL2NvbmZfc3BhY2VfcXVpcmtzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjYzUxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL2NvbmZfc3BhY2VfcXVpcmtzLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIFBDSSBCYWNrZW5kIC0gRGF0YSBzdHJ1Y3R1cmVzIGZvciBzcGVjaWFsIG92ZXJsYXlzIGZvciBicm9rZW4gZGV2aWNlcy4KKyAqCisgKiBSeWFuIFdpbHNvbiA8aGFwOUBlcG9jaC5uY3NjLm1pbD4KKyAqIENocmlzIEJvb2tob2x0IDxoYXAxMEBlcG9jaC5uY3NjLm1pbD4KKyAqLworCisjaWZuZGVmIF9fWEVOX1BDSUJBQ0tfQ09ORl9TUEFDRV9RVUlSS1NfSF9fCisjZGVmaW5lIF9fWEVOX1BDSUJBQ0tfQ09ORl9TUEFDRV9RVUlSS1NfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKK3N0cnVjdCB4ZW5fcGNpYmtfY29uZmlnX3F1aXJrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1aXJrc19saXN0OworCXN0cnVjdCBwY2lfZGV2aWNlX2lkIGRldmlkOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworfTsKKworaW50IHhlbl9wY2lia19jb25maWdfcXVpcmtzX2FkZF9maWVsZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgY29uZmlnX2ZpZWxkCisJCQkJICAgICpmaWVsZCk7CisKK2ludCB4ZW5fcGNpYmtfY29uZmlnX3F1aXJrc19yZW1vdmVfZmllbGQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlZyk7CisKK2ludCB4ZW5fcGNpYmtfY29uZmlnX3F1aXJrc19pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCit2b2lkIHhlbl9wY2lia19jb25maWdfZmllbGRfZnJlZShzdHJ1Y3QgY29uZmlnX2ZpZWxkICpmaWVsZCk7CisKK2ludCB4ZW5fcGNpYmtfY29uZmlnX3F1aXJrX3JlbGVhc2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CisKK2ludCB4ZW5fcGNpYmtfZmllbGRfaXNfZHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIGludCByZWcpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3Bhc3N0aHJvdWdoLmMgYi9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9wYXNzdGhyb3VnaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzJhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9wYXNzdGhyb3VnaC5jCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogUENJIEJhY2tlbmQgLSBQcm92aWRlcyByZXN0cmljdGVkIGFjY2VzcyB0byB0aGUgcmVhbCBQQ0kgYnVzIHRvcG9sb2d5CisgKiAgICAgICAgICAgICAgIHRvIHRoZSBmcm9udGVuZAorICoKKyAqICAgQXV0aG9yOiBSeWFuIFdpbHNvbiA8aGFwOUBlcG9jaC5uY3NjLm1pbD4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSAicGNpYmFjay5oIgorCitzdHJ1Y3QgcGFzc3Rocm91Z2hfZGV2X2RhdGEgeworCS8qIEFjY2VzcyB0byBkZXZfbGlzdCBtdXN0IGJlIHByb3RlY3RlZCBieSBsb2NrICovCisJc3RydWN0IGxpc3RfaGVhZCBkZXZfbGlzdDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKl9feGVuX3BjaWJrX2dldF9wY2lfZGV2KHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2LAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRvbWFpbiwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBidXMsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGV2Zm4pCit7CisJc3RydWN0IHBhc3N0aHJvdWdoX2Rldl9kYXRhICpkZXZfZGF0YSA9IHBkZXYtPnBjaV9kZXZfZGF0YTsKKwlzdHJ1Y3QgcGNpX2Rldl9lbnRyeSAqZGV2X2VudHJ5OworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X2RhdGEtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2X2VudHJ5LCAmZGV2X2RhdGEtPmRldl9saXN0LCBsaXN0KSB7CisJCWlmIChkb21haW4gPT0gKHVuc2lnbmVkIGludClwY2lfZG9tYWluX25yKGRldl9lbnRyeS0+ZGV2LT5idXMpCisJCSAgICAmJiBidXMgPT0gKHVuc2lnbmVkIGludClkZXZfZW50cnktPmRldi0+YnVzLT5udW1iZXIKKwkJICAgICYmIGRldmZuID09IGRldl9lbnRyeS0+ZGV2LT5kZXZmbikgeworCQkJZGV2ID0gZGV2X2VudHJ5LT5kZXY7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9kYXRhLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgaW50IF9feGVuX3BjaWJrX2FkZF9wY2lfZGV2KHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2LAorCQkJCSAgIHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJICAgaW50IGRldmlkLCBwdWJsaXNoX3BjaV9kZXZfY2IgcHVibGlzaF9jYikKK3sKKwlzdHJ1Y3QgcGFzc3Rocm91Z2hfZGV2X2RhdGEgKmRldl9kYXRhID0gcGRldi0+cGNpX2Rldl9kYXRhOworCXN0cnVjdCBwY2lfZGV2X2VudHJ5ICpkZXZfZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZG9tYWluLCBidXMsIGRldmZuOworCWludCBlcnI7CisKKwlkZXZfZW50cnkgPSBrbWFsbG9jKHNpemVvZigqZGV2X2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZfZW50cnkpCisJCXJldHVybiAtRU5PTUVNOworCWRldl9lbnRyeS0+ZGV2ID0gZGV2OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9kYXRhLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmZGV2X2VudHJ5LT5saXN0LCAmZGV2X2RhdGEtPmRldl9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfZGF0YS0+bG9jaywgZmxhZ3MpOworCisJLyogUHVibGlzaCB0aGlzIGRldmljZS4gKi8KKwlkb21haW4gPSAodW5zaWduZWQgaW50KXBjaV9kb21haW5fbnIoZGV2LT5idXMpOworCWJ1cyA9ICh1bnNpZ25lZCBpbnQpZGV2LT5idXMtPm51bWJlcjsKKwlkZXZmbiA9IGRldi0+ZGV2Zm47CisJZXJyID0gcHVibGlzaF9jYihwZGV2LCBkb21haW4sIGJ1cywgZGV2Zm4sIGRldmlkKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9feGVuX3BjaWJrX3JlbGVhc2VfcGNpX2RldihzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCQkJc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGFzc3Rocm91Z2hfZGV2X2RhdGEgKmRldl9kYXRhID0gcGRldi0+cGNpX2Rldl9kYXRhOworCXN0cnVjdCBwY2lfZGV2X2VudHJ5ICpkZXZfZW50cnksICp0OworCXN0cnVjdCBwY2lfZGV2ICpmb3VuZF9kZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X2RhdGEtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXZfZW50cnksIHQsICZkZXZfZGF0YS0+ZGV2X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGRldl9lbnRyeS0+ZGV2ID09IGRldikgeworCQkJbGlzdF9kZWwoJmRldl9lbnRyeS0+bGlzdCk7CisJCQlmb3VuZF9kZXYgPSBkZXZfZW50cnktPmRldjsKKwkJCWtmcmVlKGRldl9lbnRyeSk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfZGF0YS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGZvdW5kX2RldikKKwkJcGNpc3R1Yl9wdXRfcGNpX2Rldihmb3VuZF9kZXYpOworfQorCitzdGF0aWMgaW50IF9feGVuX3BjaWJrX2luaXRfZGV2aWNlcyhzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGFzc3Rocm91Z2hfZGV2X2RhdGEgKmRldl9kYXRhOworCisJZGV2X2RhdGEgPSBrbWFsbG9jKHNpemVvZigqZGV2X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldl9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZkZXZfZGF0YS0+bG9jayk7CisKKwlJTklUX0xJU1RfSEVBRCgmZGV2X2RhdGEtPmRldl9saXN0KTsKKworCXBkZXYtPnBjaV9kZXZfZGF0YSA9IGRldl9kYXRhOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX194ZW5fcGNpYmtfcHVibGlzaF9wY2lfcm9vdHMoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsCisJCQkJCSBwdWJsaXNoX3BjaV9yb290X2NiIHB1Ymxpc2hfcm9vdF9jYikKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcGFzc3Rocm91Z2hfZGV2X2RhdGEgKmRldl9kYXRhID0gcGRldi0+cGNpX2Rldl9kYXRhOworCXN0cnVjdCBwY2lfZGV2X2VudHJ5ICpkZXZfZW50cnksICplLCAqdG1wOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJaW50IGZvdW5kOworCXVuc2lnbmVkIGludCBkb21haW4sIGJ1czsKKworCXNwaW5fbG9jaygmZGV2X2RhdGEtPmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldl9lbnRyeSwgdG1wLCAmZGV2X2RhdGEtPmRldl9saXN0LCBsaXN0KSB7CisJCS8qIE9ubHkgcHVibGlzaCB0aGlzIGRldmljZSBhcyBhIHJvb3QgaWYgbm9uZSBvZiBpdHMKKwkJICogcGFyZW50IGJyaWRnZXMgYXJlIGV4cG9ydGVkCisJCSAqLworCQlmb3VuZCA9IDA7CisJCWRldiA9IGRldl9lbnRyeS0+ZGV2LT5idXMtPnNlbGY7CisJCWZvciAoOyAhZm91bmQgJiYgZGV2ICE9IE5VTEw7IGRldiA9IGRldi0+YnVzLT5zZWxmKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsICZkZXZfZGF0YS0+ZGV2X2xpc3QsIGxpc3QpIHsKKwkJCQlpZiAoZGV2ID09IGUtPmRldikgeworCQkJCQlmb3VuZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWRvbWFpbiA9ICh1bnNpZ25lZCBpbnQpcGNpX2RvbWFpbl9ucihkZXZfZW50cnktPmRldi0+YnVzKTsKKwkJYnVzID0gKHVuc2lnbmVkIGludClkZXZfZW50cnktPmRldi0+YnVzLT5udW1iZXI7CisKKwkJaWYgKCFmb3VuZCkgeworCQkJc3Bpbl91bmxvY2soJmRldl9kYXRhLT5sb2NrKTsKKwkJCWVyciA9IHB1Ymxpc2hfcm9vdF9jYihwZGV2LCBkb21haW4sIGJ1cyk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQkJc3Bpbl9sb2NrKCZkZXZfZGF0YS0+bG9jayk7CisJCX0KKwl9CisKKwlpZiAoIWVycikKKwkJc3Bpbl91bmxvY2soJmRldl9kYXRhLT5sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9feGVuX3BjaWJrX3JlbGVhc2VfZGV2aWNlcyhzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGFzc3Rocm91Z2hfZGV2X2RhdGEgKmRldl9kYXRhID0gcGRldi0+cGNpX2Rldl9kYXRhOworCXN0cnVjdCBwY2lfZGV2X2VudHJ5ICpkZXZfZW50cnksICp0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldl9lbnRyeSwgdCwgJmRldl9kYXRhLT5kZXZfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmZGV2X2VudHJ5LT5saXN0KTsKKwkJcGNpc3R1Yl9wdXRfcGNpX2RldihkZXZfZW50cnktPmRldik7CisJCWtmcmVlKGRldl9lbnRyeSk7CisJfQorCisJa2ZyZWUoZGV2X2RhdGEpOworCXBkZXYtPnBjaV9kZXZfZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX194ZW5fcGNpYmtfZ2V0X3BjaWZyb250X2RldihzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorCQkJCQlzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCQkJdW5zaWduZWQgaW50ICpkb21haW4sIHVuc2lnbmVkIGludCAqYnVzLAorCQkJCQl1bnNpZ25lZCBpbnQgKmRldmZuKQoreworCSpkb21haW4gPSBwY2lfZG9tYWluX25yKHBjaWRldi0+YnVzKTsKKwkqYnVzID0gcGNpZGV2LT5idXMtPm51bWJlcjsKKwkqZGV2Zm4gPSBwY2lkZXYtPmRldmZuOworCXJldHVybiAxOworfQorCitzdHJ1Y3QgeGVuX3BjaWJrX2JhY2tlbmQgeGVuX3BjaWJrX3Bhc3N0aHJvdWdoX2JhY2tlbmQgPSB7CisJLm5hbWUgICAgICAgICAgID0gInBhc3N0aHJvdWdoIiwKKwkuaW5pdCAgICAgICAgICAgPSBfX3hlbl9wY2lia19pbml0X2RldmljZXMsCisJLmZyZWUJCT0gX194ZW5fcGNpYmtfcmVsZWFzZV9kZXZpY2VzLAorCS5maW5kICAgICAgICAgICA9IF9feGVuX3BjaWJrX2dldF9wY2lmcm9udF9kZXYsCisJLnB1Ymxpc2ggICAgICAgID0gX194ZW5fcGNpYmtfcHVibGlzaF9wY2lfcm9vdHMsCisJLnJlbGVhc2UgICAgICAgID0gX194ZW5fcGNpYmtfcmVsZWFzZV9wY2lfZGV2LAorCS5hZGQgICAgICAgICAgICA9IF9feGVuX3BjaWJrX2FkZF9wY2lfZGV2LAorCS5nZXQgICAgICAgICAgICA9IF9feGVuX3BjaWJrX2dldF9wY2lfZGV2LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3BjaV9zdHViLmMgYi9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9wY2lfc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYzIxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9wY2lfc3R1Yi5jCkBAIC0wLDAgKzEsMTM3NiBAQAorLyoKKyAqIFBDSSBTdHViIERyaXZlciAtIEdyYWJzIGRldmljZXMgaW4gYmFja2VuZCB0byBiZSBleHBvcnRlZCBsYXRlcgorICoKKyAqIFJ5YW4gV2lsc29uIDxoYXA5QGVwb2NoLm5jc2MubWlsPgorICogQ2hyaXMgQm9va2hvbHQgPGhhcDEwQGVwb2NoLm5jc2MubWlsPgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KKyNpbmNsdWRlIDxhc20veGVuL3BjaS5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorI2luY2x1ZGUgInBjaWJhY2suaCIKKyNpbmNsdWRlICJjb25mX3NwYWNlLmgiCisjaW5jbHVkZSAiY29uZl9zcGFjZV9xdWlya3MuaCIKKworI2RlZmluZSBEUlZfTkFNRQkieGVuLXBjaWJhY2siCisKK3N0YXRpYyBjaGFyICpwY2lfZGV2c190b19oaWRlOword2FpdF9xdWV1ZV9oZWFkX3QgeGVuX3BjaWJrX2Flcl93YWl0X3F1ZXVlOworLypBZGQgc2VtIGZvciBzeW5jIEFFUiBoYW5kbGluZyBhbmQgeGVuX3BjaWJrIHJlbW92ZS9yZWNvbmZpZ3VlIG9wcywKKyogV2Ugd2FudCB0byBhdm9pZCBpbiBtaWRkbGUgb2YgQUVSIG9wcywgeGVuX3BjaWJrIGRldmljZXMgaXMgYmVpbmcgcmVtb3ZlZAorKi8KK3N0YXRpYyBERUNMQVJFX1JXU0VNKHBjaXN0dWJfc2VtKTsKK21vZHVsZV9wYXJhbV9uYW1lZChoaWRlLCBwY2lfZGV2c190b19oaWRlLCBjaGFycCwgMDQ0NCk7CisKK3N0cnVjdCBwY2lzdHViX2RldmljZV9pZCB7CisJc3RydWN0IGxpc3RfaGVhZCBzbG90X2xpc3Q7CisJaW50IGRvbWFpbjsKKwl1bnNpZ25lZCBjaGFyIGJ1czsKKwl1bnNpZ25lZCBpbnQgZGV2Zm47Cit9Oworc3RhdGljIExJU1RfSEVBRChwY2lzdHViX2RldmljZV9pZHMpOworc3RhdGljIERFRklORV9TUElOTE9DSyhkZXZpY2VfaWRzX2xvY2spOworCitzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2UgeworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZfbGlzdDsKKwlzcGlubG9ja190IGxvY2s7CisKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCXN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2Oy8qIG5vbi1OVUxMIGlmIHN0cnVjdCBwY2lfZGV2IGlzIGluIHVzZSAqLworfTsKKworLyogQWNjZXNzIHRvIHBjaXN0dWJfZGV2aWNlcyAmIHNlaXplZF9kZXZpY2VzIGxpc3RzIGFuZCB0aGUgaW5pdGlhbGl6ZV9kZXZpY2VzCisgKiBmbGFnIG11c3QgYmUgbG9ja2VkIHdpdGggcGNpc3R1Yl9kZXZpY2VzX2xvY2sKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhwY2lzdHViX2RldmljZXNfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKHBjaXN0dWJfZGV2aWNlcyk7CisKKy8qIHdhaXQgZm9yIGRldmljZV9pbml0Y2FsbCBiZWZvcmUgaW5pdGlhbGl6aW5nIG91ciBkZXZpY2VzCisgKiAoc2VlIHBjaXN0dWJfaW5pdF9kZXZpY2VzX2xhdGUpCisgKi8KK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZV9kZXZpY2VzOworc3RhdGljIExJU1RfSEVBRChzZWl6ZWRfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2UgKnBjaXN0dWJfZGV2aWNlX2FsbG9jKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaXN0dWJfZGV2aWNlICpwc2RldjsKKworCWRldl9kYmcoJmRldi0+ZGV2LCAicGNpc3R1Yl9kZXZpY2VfYWxsb2NcbiIpOworCisJcHNkZXYgPSBremFsbG9jKHNpemVvZigqcHNkZXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBzZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCXBzZGV2LT5kZXYgPSBwY2lfZGV2X2dldChkZXYpOworCWlmICghcHNkZXYtPmRldikgeworCQlrZnJlZShwc2Rldik7CisJCXJldHVybiBOVUxMOworCX0KKworCWtyZWZfaW5pdCgmcHNkZXYtPmtyZWYpOworCXNwaW5fbG9ja19pbml0KCZwc2Rldi0+bG9jayk7CisKKwlyZXR1cm4gcHNkZXY7Cit9CisKKy8qIERvbid0IGNhbGwgdGhpcyBkaXJlY3RseSBhcyBpdCdzIGNhbGxlZCBieSBwY2lzdHViX2RldmljZV9wdXQgKi8KK3N0YXRpYyB2b2lkIHBjaXN0dWJfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHBjaXN0dWJfZGV2aWNlICpwc2RldjsKKworCXBzZGV2ID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBwY2lzdHViX2RldmljZSwga3JlZik7CisKKwlkZXZfZGJnKCZwc2Rldi0+ZGV2LT5kZXYsICJwY2lzdHViX2RldmljZV9yZWxlYXNlXG4iKTsKKworCXhlbl91bnJlZ2lzdGVyX2RldmljZV9kb21haW5fb3duZXIocHNkZXYtPmRldik7CisKKwkvKiBDbGVhbi11cCB0aGUgZGV2aWNlICovCisJeGVuX3BjaWJrX3Jlc2V0X2RldmljZShwc2Rldi0+ZGV2KTsKKwl4ZW5fcGNpYmtfY29uZmlnX2ZyZWVfZHluX2ZpZWxkcyhwc2Rldi0+ZGV2KTsKKwl4ZW5fcGNpYmtfY29uZmlnX2ZyZWVfZGV2KHBzZGV2LT5kZXYpOworCWtmcmVlKHBjaV9nZXRfZHJ2ZGF0YShwc2Rldi0+ZGV2KSk7CisJcGNpX3NldF9kcnZkYXRhKHBzZGV2LT5kZXYsIE5VTEwpOworCisJcGNpX2Rldl9wdXQocHNkZXYtPmRldik7CisKKwlrZnJlZShwc2Rldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lzdHViX2RldmljZV9nZXQoc3RydWN0IHBjaXN0dWJfZGV2aWNlICpwc2RldikKK3sKKwlrcmVmX2dldCgmcHNkZXYtPmtyZWYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpc3R1Yl9kZXZpY2VfcHV0KHN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXYpCit7CisJa3JlZl9wdXQoJnBzZGV2LT5rcmVmLCBwY2lzdHViX2RldmljZV9yZWxlYXNlKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lzdHViX2RldmljZSAqcGNpc3R1Yl9kZXZpY2VfZmluZChpbnQgZG9tYWluLCBpbnQgYnVzLAorCQkJCQkJICBpbnQgc2xvdCwgaW50IGZ1bmMpCit7CisJc3RydWN0IHBjaXN0dWJfZGV2aWNlICpwc2RldiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwc2RldiwgJnBjaXN0dWJfZGV2aWNlcywgZGV2X2xpc3QpIHsKKwkJaWYgKHBzZGV2LT5kZXYgIT0gTlVMTAorCQkgICAgJiYgZG9tYWluID09IHBjaV9kb21haW5fbnIocHNkZXYtPmRldi0+YnVzKQorCQkgICAgJiYgYnVzID09IHBzZGV2LT5kZXYtPmJ1cy0+bnVtYmVyCisJCSAgICAmJiBQQ0lfREVWRk4oc2xvdCwgZnVuYykgPT0gcHNkZXYtPmRldi0+ZGV2Zm4pIHsKKwkJCXBjaXN0dWJfZGV2aWNlX2dldChwc2Rldik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIGRpZG4ndCBmaW5kIGl0ICovCisJcHNkZXYgPSBOVUxMOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpc3R1Yl9kZXZpY2VzX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcHNkZXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqcGNpc3R1Yl9kZXZpY2VfZ2V0X3BjaV9kZXYoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsCisJCQkJCQkgIHN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwY2lzdHViX2RldmljZV9nZXQocHNkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBzZGV2LT5sb2NrLCBmbGFncyk7CisJaWYgKCFwc2Rldi0+cGRldikgeworCQlwc2Rldi0+cGRldiA9IHBkZXY7CisJCXBjaV9kZXYgPSBwc2Rldi0+ZGV2OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwc2Rldi0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFwY2lfZGV2KQorCQlwY2lzdHViX2RldmljZV9wdXQocHNkZXYpOworCisJcmV0dXJuIHBjaV9kZXY7Cit9CisKK3N0cnVjdCBwY2lfZGV2ICpwY2lzdHViX2dldF9wY2lfZGV2X2J5X3Nsb3Qoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsCisJCQkJCSAgICBpbnQgZG9tYWluLCBpbnQgYnVzLAorCQkJCQkgICAgaW50IHNsb3QsIGludCBmdW5jKQoreworCXN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXY7CisJc3RydWN0IHBjaV9kZXYgKmZvdW5kX2RldiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwc2RldiwgJnBjaXN0dWJfZGV2aWNlcywgZGV2X2xpc3QpIHsKKwkJaWYgKHBzZGV2LT5kZXYgIT0gTlVMTAorCQkgICAgJiYgZG9tYWluID09IHBjaV9kb21haW5fbnIocHNkZXYtPmRldi0+YnVzKQorCQkgICAgJiYgYnVzID09IHBzZGV2LT5kZXYtPmJ1cy0+bnVtYmVyCisJCSAgICAmJiBQQ0lfREVWRk4oc2xvdCwgZnVuYykgPT0gcHNkZXYtPmRldi0+ZGV2Zm4pIHsKKwkJCWZvdW5kX2RldiA9IHBjaXN0dWJfZGV2aWNlX2dldF9wY2lfZGV2KHBkZXYsIHBzZGV2KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpc3R1Yl9kZXZpY2VzX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZm91bmRfZGV2OworfQorCitzdHJ1Y3QgcGNpX2RldiAqcGNpc3R1Yl9nZXRfcGNpX2RldihzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCQkgICAgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2UgKnBzZGV2OworCXN0cnVjdCBwY2lfZGV2ICpmb3VuZF9kZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpc3R1Yl9kZXZpY2VzX2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocHNkZXYsICZwY2lzdHViX2RldmljZXMsIGRldl9saXN0KSB7CisJCWlmIChwc2Rldi0+ZGV2ID09IGRldikgeworCQkJZm91bmRfZGV2ID0gcGNpc3R1Yl9kZXZpY2VfZ2V0X3BjaV9kZXYocGRldiwgcHNkZXYpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCXJldHVybiBmb3VuZF9kZXY7Cit9CisKK3ZvaWQgcGNpc3R1Yl9wdXRfcGNpX2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXYsICpmb3VuZF9wc2RldiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwc2RldiwgJnBjaXN0dWJfZGV2aWNlcywgZGV2X2xpc3QpIHsKKwkJaWYgKHBzZGV2LT5kZXYgPT0gZGV2KSB7CisJCQlmb3VuZF9wc2RldiA9IHBzZGV2OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCisJLypob2xkIHRoaXMgbG9jayBmb3IgYXZvaWRpbmcgYnJlYWtpbmcgbGluayBiZXR3ZWVuCisJKiBwY2lzdHViIGFuZCB4ZW5fcGNpYmsgd2hlbiBBRVIgaXMgaW4gcHJvY2Vzc2luZworCSovCisJZG93bl93cml0ZSgmcGNpc3R1Yl9zZW0pOworCS8qIENsZWFudXAgb3VyIGRldmljZQorCSAqIChzbyBpdCdzIHJlYWR5IGZvciB0aGUgbmV4dCBkb21haW4pCisJICovCisJeGVuX3BjaWJrX3Jlc2V0X2RldmljZShmb3VuZF9wc2Rldi0+ZGV2KTsKKwl4ZW5fcGNpYmtfY29uZmlnX2ZyZWVfZHluX2ZpZWxkcyhmb3VuZF9wc2Rldi0+ZGV2KTsKKwl4ZW5fcGNpYmtfY29uZmlnX3Jlc2V0X2Rldihmb3VuZF9wc2Rldi0+ZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmb3VuZF9wc2Rldi0+bG9jaywgZmxhZ3MpOworCWZvdW5kX3BzZGV2LT5wZGV2ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmb3VuZF9wc2Rldi0+bG9jaywgZmxhZ3MpOworCisJcGNpc3R1Yl9kZXZpY2VfcHV0KGZvdW5kX3BzZGV2KTsKKwl1cF93cml0ZSgmcGNpc3R1Yl9zZW0pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2lzdHViX21hdGNoX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2VfaWQgKnBkZXZfaWQpCit7CisJLyogTWF0Y2ggdGhlIHNwZWNpZmllZCBkZXZpY2UgYnkgZG9tYWluLCBidXMsIHNsb3QsIGZ1bmMgYW5kIGFsc28gaWYKKwkgKiBhbnkgb2YgdGhlIGRldmljZSdzIHBhcmVudCBicmlkZ2VzIG1hdGNoLgorCSAqLworCWZvciAoOyBkZXYgIT0gTlVMTDsgZGV2ID0gZGV2LT5idXMtPnNlbGYpIHsKKwkJaWYgKHBjaV9kb21haW5fbnIoZGV2LT5idXMpID09IHBkZXZfaWQtPmRvbWFpbgorCQkgICAgJiYgZGV2LT5idXMtPm51bWJlciA9PSBwZGV2X2lkLT5idXMKKwkJICAgICYmIGRldi0+ZGV2Zm4gPT0gcGRldl9pZC0+ZGV2Zm4pCisJCQlyZXR1cm4gMTsKKworCQkvKiBTb21ldGltZXMgdG9wbW9zdCBicmlkZ2UgbGlua3MgdG8gaXRzZWxmLiAqLworCQlpZiAoZGV2ID09IGRldi0+YnVzLT5zZWxmKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjaXN0dWJfbWF0Y2goc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2VfaWQgKnBkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZm91bmQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9pZHNfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGRldl9pZCwgJnBjaXN0dWJfZGV2aWNlX2lkcywgc2xvdF9saXN0KSB7CisJCWlmIChwY2lzdHViX21hdGNoX29uZShkZXYsIHBkZXZfaWQpKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfaWRzX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGNpc3R1Yl9pbml0X2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCB4ZW5fcGNpYmtfZGV2X2RhdGEgKmRldl9kYXRhOworCWludCBlcnIgPSAwOworCisJZGV2X2RiZygmZGV2LT5kZXYsICJpbml0aWFsaXppbmcuLi5cbiIpOworCisJLyogVGhlIFBDSSBiYWNrZW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBhIG1vZHVsZSAob3IgdG8gd29yayB3aXRoCisJICogcmVtb3ZhYmxlIFBDSSBkZXZpY2VzICh5ZXQpLiBJZiBpdCB3ZXJlLCB4ZW5fcGNpYmtfY29uZmlnX2ZyZWUoKQorCSAqIHdvdWxkIG5lZWQgdG8gYmUgY2FsbGVkIHNvbWV3aGVyZSB0byBmcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkCisJICogaGVyZSBhbmQgdGhlbiB0byBjYWxsIGtmcmVlKHBjaV9nZXRfZHJ2ZGF0YShwc2Rldi0+ZGV2KSkuCisJICovCisJZGV2X2RhdGEgPSBremFsbG9jKHNpemVvZigqZGV2X2RhdGEpICsgIHN0cmxlbihEUlZfTkFNRSAiW10iKQorCQkJCSsgc3RybGVuKHBjaV9uYW1lKGRldikpICsgMSwgR0ZQX0FUT01JQyk7CisJaWYgKCFkZXZfZGF0YSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcGNpX3NldF9kcnZkYXRhKGRldiwgZGV2X2RhdGEpOworCisJLyoKKwkgKiBTZXR1cCBuYW1lIGZvciBmYWtlIElSUSBoYW5kbGVyLiBJdCB3aWxsIG9ubHkgYmUgZW5hYmxlZAorCSAqIG9uY2UgdGhlIGRldmljZSBpcyB0dXJuZWQgb24gYnkgdGhlIGd1ZXN0LgorCSAqLworCXNwcmludGYoZGV2X2RhdGEtPmlycV9uYW1lLCBEUlZfTkFNRSAiWyVzXSIsIHBjaV9uYW1lKGRldikpOworCisJZGV2X2RiZygmZGV2LT5kZXYsICJpbml0aWFsaXppbmcgY29uZmlnXG4iKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnhlbl9wY2lia19hZXJfd2FpdF9xdWV1ZSk7CisJZXJyID0geGVuX3BjaWJrX2NvbmZpZ19pbml0X2RldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogSEFDSzogRm9yY2UgZGV2aWNlICgmIEFDUEkpIHRvIGRldGVybWluZSB3aGF0IElSUSBpdCdzIG9uIC0gd2UKKwkgKiBtdXN0IGRvIHRoaXMgaGVyZSBiZWNhdXNlIHBjaWJpb3NfZW5hYmxlX2RldmljZSBtYXkgc3BlY2lmeQorCSAqIHRoZSBwY2kgZGV2aWNlJ3MgdHJ1ZSBpcnEgKGFuZCBwb3NzaWJseSBpdHMgb3RoZXIgcmVzb3VyY2VzKQorCSAqIGlmIHRoZXkgZGlmZmVyIGZyb20gd2hhdCdzIGluIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlLgorCSAqIFRoaXMgbWFrZXMgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZGV2aWNlJ3MgcmVzb3VyY2VzIHdvbid0CisJICogY2hhbmdlIGFmdGVyIHRoaXMgcG9pbnQgKG90aGVyd2lzZSB0aGlzIGNvZGUgbWF5IGJyZWFrISkKKwkgKi8KKwlkZXZfZGJnKCZkZXYtPmRldiwgImVuYWJsaW5nIGRldmljZVxuIik7CisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGNvbmZpZ19yZWxlYXNlOworCisJLyogTm93IGRpc2FibGUgdGhlIGRldmljZSAodGhpcyBhbHNvIGVuc3VyZXMgc29tZSBwcml2YXRlIGRldmljZQorCSAqIGRhdGEgaXMgc2V0dXAgYmVmb3JlIHdlIGV4cG9ydCkKKwkgKi8KKwlkZXZfZGJnKCZkZXYtPmRldiwgInJlc2V0IGRldmljZVxuIik7CisJeGVuX3BjaWJrX3Jlc2V0X2RldmljZShkZXYpOworCisJcmV0dXJuIDA7CisKK2NvbmZpZ19yZWxlYXNlOgorCXhlbl9wY2lia19jb25maWdfZnJlZV9kZXYoZGV2KTsKKworb3V0OgorCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCWtmcmVlKGRldl9kYXRhKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQmVjYXVzZSBzb21lIGluaXRpYWxpemF0aW9uIHN0aWxsIGhhcHBlbnMgb24KKyAqIGRldmljZXMgZHVyaW5nIGZzX2luaXRjYWxsLCB3ZSBuZWVkIHRvIGRlZmVyCisgKiBmdWxsIGluaXRpYWxpemF0aW9uIG9mIG91ciBkZXZpY2VzIHVudGlsCisgKiBkZXZpY2VfaW5pdGNhbGwuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBjaXN0dWJfaW5pdF9kZXZpY2VzX2xhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2UgKnBzZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IDA7CisKKwlwcl9kZWJ1ZyhEUlZfTkFNRSAiOiBwY2lzdHViX2luaXRfZGV2aWNlc19sYXRlXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzZWl6ZWRfZGV2aWNlcykpIHsKKwkJcHNkZXYgPSBjb250YWluZXJfb2Yoc2VpemVkX2RldmljZXMubmV4dCwKKwkJCQkgICAgIHN0cnVjdCBwY2lzdHViX2RldmljZSwgZGV2X2xpc3QpOworCQlsaXN0X2RlbCgmcHNkZXYtPmRldl9saXN0KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCisJCWVyciA9IHBjaXN0dWJfaW5pdF9kZXZpY2UocHNkZXYtPmRldik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnBzZGV2LT5kZXYtPmRldiwKKwkJCQkiZXJyb3IgJWQgaW5pdGlhbGl6aW5nIGRldmljZVxuIiwgZXJyKTsKKwkJCWtmcmVlKHBzZGV2KTsKKwkJCXBzZGV2ID0gTlVMTDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCisJCWlmIChwc2RldikKKwkJCWxpc3RfYWRkX3RhaWwoJnBzZGV2LT5kZXZfbGlzdCwgJnBjaXN0dWJfZGV2aWNlcyk7CisJfQorCisJaW5pdGlhbGl6ZV9kZXZpY2VzID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaXN0dWJfZGV2aWNlc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGNpc3R1Yl9zZWl6ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gMDsKKworCXBzZGV2ID0gcGNpc3R1Yl9kZXZpY2VfYWxsb2MoZGV2KTsKKwlpZiAoIXBzZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCisJaWYgKGluaXRpYWxpemVfZGV2aWNlcykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCisJCS8qIGRvbid0IHdhbnQgaXJxcyBkaXNhYmxlZCB3aGVuIGNhbGxpbmcgcGNpc3R1Yl9pbml0X2RldmljZSAqLworCQllcnIgPSBwY2lzdHViX2luaXRfZGV2aWNlKHBzZGV2LT5kZXYpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCisJCWlmICghZXJyKQorCQkJbGlzdF9hZGQoJnBzZGV2LT5kZXZfbGlzdCwgJnBjaXN0dWJfZGV2aWNlcyk7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJkZWZlcnJpbmcgaW5pdGlhbGl6YXRpb25cbiIpOworCQlsaXN0X2FkZCgmcHNkZXYtPmRldl9saXN0LCAmc2VpemVkX2RldmljZXMpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaXN0dWJfZGV2aWNlc19sb2NrLCBmbGFncyk7CisKKwlpZiAoZXJyKQorCQlwY2lzdHViX2RldmljZV9wdXQocHNkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGNpc3R1Yl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWRldl9kYmcoJmRldi0+ZGV2LCAicHJvYmluZy4uLlxuIik7CisKKwlpZiAocGNpc3R1Yl9tYXRjaChkZXYpKSB7CisKKwkJaWYgKGRldi0+aGRyX3R5cGUgIT0gUENJX0hFQURFUl9UWVBFX05PUk1BTAorCQkgICAgJiYgZGV2LT5oZHJfdHlwZSAhPSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSB7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbid0IGV4cG9ydCBwY2kgZGV2aWNlcyB0aGF0ICIKKwkJCQkiZG9uJ3QgaGF2ZSBhIG5vcm1hbCAoMCkgb3IgYnJpZGdlICgxKSAiCisJCQkJImhlYWRlciB0eXBlIVxuIik7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KKworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJzZWl6aW5nIGRldmljZVxuIik7CisJCWVyciA9IHBjaXN0dWJfc2VpemUoZGV2KTsKKwl9IGVsc2UKKwkJLyogRGlkbid0IGZpbmQgdGhlIGRldmljZSAqLworCQllcnIgPSAtRU5PREVWOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcGNpc3R1Yl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2UgKnBzZGV2LCAqZm91bmRfcHNkZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKCZkZXYtPmRldiwgInJlbW92aW5nXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCisJeGVuX3BjaWJrX2NvbmZpZ19xdWlya19yZWxlYXNlKGRldik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBzZGV2LCAmcGNpc3R1Yl9kZXZpY2VzLCBkZXZfbGlzdCkgeworCQlpZiAocHNkZXYtPmRldiA9PSBkZXYpIHsKKwkJCWZvdW5kX3BzZGV2ID0gcHNkZXY7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaXN0dWJfZGV2aWNlc19sb2NrLCBmbGFncyk7CisKKwlpZiAoZm91bmRfcHNkZXYpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJmb3VuZCBkZXZpY2UgdG8gcmVtb3ZlIC0gaW4gdXNlPyAlcFxuIiwKKwkJCWZvdW5kX3BzZGV2LT5wZGV2KTsKKworCQlpZiAoZm91bmRfcHNkZXYtPnBkZXYpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogKioqKioqIHJlbW92aW5nIGRldmljZSAiCisJCQkgICAgICAgIiVzIHdoaWxlIHN0aWxsIGluLXVzZSEgKioqKioqXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKGZvdW5kX3BzZGV2LT5kZXYpKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogKioqKioqIGRyaXZlciBkb21haW4gbWF5IgorCQkJICAgICAgICIgc3RpbGwgYWNjZXNzIHRoaXMgZGV2aWNlJ3MgaS9vIHJlc291cmNlcyFcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiAqKioqKiogc2h1dGRvd24gZHJpdmVyICIKKwkJCSAgICAgICAiZG9tYWluIGJlZm9yZSBiaW5kaW5nIGRldmljZVxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6ICoqKioqKiB0byBvdGhlciBkcml2ZXJzICIKKwkJCSAgICAgICAib3IgZG9tYWluc1xuIik7CisKKwkJCXhlbl9wY2lia19yZWxlYXNlX3BjaV9kZXYoZm91bmRfcHNkZXYtPnBkZXYsCisJCQkJCQlmb3VuZF9wc2Rldi0+ZGV2KTsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCQlsaXN0X2RlbCgmZm91bmRfcHNkZXYtPmRldl9saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpc3R1Yl9kZXZpY2VzX2xvY2ssIGZsYWdzKTsKKworCQkvKiB0aGUgZmluYWwgcHV0IGZvciByZWxlYXNpbmcgZnJvbSB0aGUgbGlzdCAqLworCQlwY2lzdHViX2RldmljZV9wdXQoZm91bmRfcHNkZXYpOworCX0KK30KKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHBjaXN0dWJfaWRzKSA9IHsKKwl7CisJIC52ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCSAuZGV2aWNlID0gUENJX0FOWV9JRCwKKwkgLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCSB9LAorCXswLH0sCit9OworCisjZGVmaW5lIFBDSV9OT0RFTkFNRV9NQVggNDAKK3N0YXRpYyB2b2lkIGtpbGxfZG9tYWluX2J5X2RldmljZShzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2UgKnBzZGV2KQoreworCXN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24geGJ0OworCWludCBlcnI7CisJY2hhciBub2RlbmFtZVtQQ0lfTk9ERU5BTUVfTUFYXTsKKworCWlmICghcHNkZXYpCisJCWRldl9lcnIoJnBzZGV2LT5kZXYtPmRldiwKKwkJCSJkZXZpY2UgaXMgTlVMTCB3aGVuIGRvIEFFUiByZWNvdmVyeS9raWxsX2RvbWFpblxuIik7CisJc25wcmludGYobm9kZW5hbWUsIFBDSV9OT0RFTkFNRV9NQVgsICIvbG9jYWwvZG9tYWluLzAvYmFja2VuZC9wY2kvJWQvMCIsCisJCXBzZGV2LT5wZGV2LT54ZGV2LT5vdGhlcmVuZF9pZCk7CisJbm9kZW5hbWVbc3RybGVuKG5vZGVuYW1lKV0gPSAnXDAnOworCithZ2FpbjoKKwllcnIgPSB4ZW5idXNfdHJhbnNhY3Rpb25fc3RhcnQoJnhidCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwc2Rldi0+ZGV2LT5kZXYsCisJCQkiZXJyb3IgJWQgd2hlbiBzdGFydCB4ZW5idXMgdHJhbnNhY3Rpb25cbiIsIGVycik7CisJCXJldHVybjsKKwl9CisJLypQViBBRVIgaGFuZGxlcnMgd2lsbCBzZXQgdGhpcyBmbGFnKi8KKwl4ZW5idXNfcHJpbnRmKHhidCwgbm9kZW5hbWUsICJhZXJTdGF0ZSIgLCAiYWVyZmFpbCIpOworCWVyciA9IHhlbmJ1c190cmFuc2FjdGlvbl9lbmQoeGJ0LCAwKTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPT0gLUVBR0FJTikKKwkJCWdvdG8gYWdhaW47CisJCWRldl9lcnIoJnBzZGV2LT5kZXYtPmRldiwKKwkJCSJlcnJvciAlZCB3aGVuIGVuZCB4ZW5idXMgdHJhbnNhY3Rpb25cbiIsIGVycik7CisJCXJldHVybjsKKwl9Cit9CisKKy8qIEZvciBlYWNoIGFlciByZWNvdmVyeSBzdGVwIGVycm9yX2RldGVjdGVkLCBtbWlvX2VuYWJsZWQsIGV0YywgZnJvbnRfZW5kIGFuZAorICogYmFja2VuZCBuZWVkIHRvIGhhdmUgY29vcGVyYXRpb24uIEluIHhlbl9wY2liaywgdGhvc2Ugc3RlcHMgd2lsbCBkbyBzaW1pbGFyCisgKiBqb2JzOiBzZW5kIHNlcnZpY2UgcmVxdWVzdCBhbmQgd2FpdGluZyBmb3IgZnJvbnRfZW5kIHJlc3BvbnNlLgorKi8KK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IGNvbW1vbl9wcm9jZXNzKHN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXYsCisJCQkJICAgICAgIHBjaV9jaGFubmVsX3N0YXRlX3Qgc3RhdGUsIGludCBhZXJfY21kLAorCQkJCSAgICAgICBwY2lfZXJzX3Jlc3VsdF90IHJlc3VsdCkKK3sKKwlwY2lfZXJzX3Jlc3VsdF90IHJlcyA9IHJlc3VsdDsKKwlzdHJ1Y3QgeGVuX3BjaWVfYWVyX29wICphZXJfb3A7CisJaW50IHJldDsKKworCS8qd2l0aCBQViBBRVIgZHJpdmVycyovCisJYWVyX29wID0gJihwc2Rldi0+cGRldi0+c2hfaW5mby0+YWVyX29wKTsKKwlhZXJfb3AtPmNtZCA9IGFlcl9jbWQgOworCS8qdXNlZnVsIGZvciBlcnJvcl9kZXRlY3RlZCBjYWxsYmFjayovCisJYWVyX29wLT5lcnIgPSBzdGF0ZTsKKwkvKnBjaWZyb250X2VuZCBCREYqLworCXJldCA9IHhlbl9wY2lia19nZXRfcGNpZnJvbnRfZGV2KHBzZGV2LT5kZXYsIHBzZGV2LT5wZGV2LAorCQkmYWVyX29wLT5kb21haW4sICZhZXJfb3AtPmJ1cywgJmFlcl9vcC0+ZGV2Zm4pOworCWlmICghcmV0KSB7CisJCWRldl9lcnIoJnBzZGV2LT5kZXYtPmRldiwKKwkJCURSVl9OQU1FICI6IGZhaWxlZCB0byBnZXQgcGNpZnJvbnQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX05PTkU7CisJfQorCXdtYigpOworCisJZGV2X2RiZygmcHNkZXYtPmRldi0+ZGV2LAorCQkJRFJWX05BTUUgIjogYWVyX29wICV4IGRvbSAleCBidXMgJXggZGV2Zm4gJXhcbiIsCisJCQlhZXJfY21kLCBhZXJfb3AtPmRvbWFpbiwgYWVyX29wLT5idXMsIGFlcl9vcC0+ZGV2Zm4pOworCS8qbG9jYWwgZmxhZyB0byBtYXJrIHRoZXJlJ3MgYWVyIHJlcXVlc3QsIHhlbl9wY2liayBjYWxsYmFjayB3aWxsIHVzZQorCSogdGhpcyBmbGFnIHRvIGp1ZGdlIHdoZXRoZXIgd2UgbmVlZCB0byBjaGVjayBwY2ktZnJvbnQgZ2l2ZSBhZXIKKwkqIHNlcnZpY2UgYWNrIHNpZ25hbAorCSovCisJc2V0X2JpdChfUENJQl9vcF9wZW5kaW5nLCAodW5zaWduZWQgbG9uZyAqKSZwc2Rldi0+cGRldi0+ZmxhZ3MpOworCisJLypJdCBpcyBwb3NzaWJsZSB0aGF0IGEgcGNpZnJvbnQgY29uZl9yZWFkX3dyaXRlIG9wcyByZXF1ZXN0IGludm9rZXMKKwkqIHRoZSBjYWxsYmFjayB3aGljaCBjYXVzZSB0aGUgc3B1cmlvdXMgZXhlY3V0aW9uIG9mIHdha2VfdXAuCisJKiBZZXQgaXQgaXMgaGFybWxlc3MgYW5kIGJldHRlciB0aGFuIGEgc3BpbmxvY2sgaGVyZQorCSovCisJc2V0X2JpdChfWEVOX1BDSUJfYWN0aXZlLAorCQkodW5zaWduZWQgbG9uZyAqKSZwc2Rldi0+cGRldi0+c2hfaW5mby0+ZmxhZ3MpOworCXdtYigpOworCW5vdGlmeV9yZW1vdGVfdmlhX2lycShwc2Rldi0+cGRldi0+ZXZ0Y2huX2lycSk7CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoeGVuX3BjaWJrX2Flcl93YWl0X3F1ZXVlLAorCQkJCSAhKHRlc3RfYml0KF9YRU5fUENJQl9hY3RpdmUsICh1bnNpZ25lZCBsb25nICopCisJCQkJICZwc2Rldi0+cGRldi0+c2hfaW5mby0+ZmxhZ3MpKSwgMzAwKkhaKTsKKworCWlmICghcmV0KSB7CisJCWlmICh0ZXN0X2JpdChfWEVOX1BDSUJfYWN0aXZlLAorCQkJKHVuc2lnbmVkIGxvbmcgKikmcHNkZXYtPnBkZXYtPnNoX2luZm8tPmZsYWdzKSkgeworCQkJZGV2X2VycigmcHNkZXYtPmRldi0+ZGV2LAorCQkJCSJwY2lmcm9udCBhZXIgcHJvY2VzcyBub3QgcmVzcG9uZGluZyFcbiIpOworCQkJY2xlYXJfYml0KF9YRU5fUENJQl9hY3RpdmUsCisJCQkgICh1bnNpZ25lZCBsb25nICopJnBzZGV2LT5wZGV2LT5zaF9pbmZvLT5mbGFncyk7CisJCQlhZXJfb3AtPmVyciA9IFBDSV9FUlNfUkVTVUxUX05PTkU7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCWNsZWFyX2JpdChfUENJQl9vcF9wZW5kaW5nLCAodW5zaWduZWQgbG9uZyAqKSZwc2Rldi0+cGRldi0+ZmxhZ3MpOworCisJaWYgKHRlc3RfYml0KF9YRU5fUENJRl9hY3RpdmUsCisJCSh1bnNpZ25lZCBsb25nICopJnBzZGV2LT5wZGV2LT5zaF9pbmZvLT5mbGFncykpIHsKKwkJZGV2X2RiZygmcHNkZXYtPmRldi0+ZGV2LAorCQkJInNjaGVkdWxlIHBjaV9jb25mIHNlcnZpY2UgaW4geGVuX3BjaWJrXG4iKTsKKwkJeGVuX3BjaWJrX3Rlc3RfYW5kX3NjaGVkdWxlX29wKHBzZGV2LT5wZGV2KTsKKwl9CisKKwlyZXMgPSAocGNpX2Vyc19yZXN1bHRfdClhZXJfb3AtPmVycjsKKwlyZXR1cm4gcmVzOworfQorCisvKgorKiB4ZW5fcGNpYmtfc2xvdF9yZXNldDogaXQgd2lsbCBzZW5kIHRoZSBzbG90X3Jlc2V0IHJlcXVlc3QgdG8gIHBjaWZyb250IGluIGNhc2UKKyogb2YgdGhlIGRldmljZSBkcml2ZXIgY291bGQgcHJvdmlkZSB0aGlzIHNlcnZpY2UsIGFuZCB0aGVuIHdhaXQgZm9yIHBjaWZyb250CisqIGFjay4KKyogQGRldjogcG9pbnRlciB0byBQQ0kgZGV2aWNlcworKiByZXR1cm4gdmFsdWUgaXMgdXNlZCBieSBhZXJfY29yZSBkb19yZWNvdmVyeSBwb2xpY3kKKyovCitzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCB4ZW5fcGNpYmtfc2xvdF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXY7CisJcGNpX2Vyc19yZXN1bHRfdCByZXN1bHQ7CisKKwlyZXN1bHQgPSBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7CisJZGV2X2RiZygmZGV2LT5kZXYsICJ4ZW5fcGNpYmtfc2xvdF9yZXNldChidXM6JXgsZGV2Zm46JXgpXG4iLAorCQlkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuKTsKKworCWRvd25fd3JpdGUoJnBjaXN0dWJfc2VtKTsKKwlwc2RldiA9IHBjaXN0dWJfZGV2aWNlX2ZpbmQocGNpX2RvbWFpbl9ucihkZXYtPmJ1cyksCisJCQkJZGV2LT5idXMtPm51bWJlciwKKwkJCQlQQ0lfU0xPVChkZXYtPmRldmZuKSwKKwkJCQlQQ0lfRlVOQyhkZXYtPmRldmZuKSk7CisKKwlpZiAoIXBzZGV2IHx8ICFwc2Rldi0+cGRldikgeworCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCURSVl9OQU1FICIgZGV2aWNlIGlzIG5vdCBmb3VuZC9hc3NpZ25lZFxuIik7CisJCWdvdG8gZW5kOworCX0KKworCWlmICghcHNkZXYtPnBkZXYtPnNoX2luZm8pIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsIERSVl9OQU1FICIgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQgb3Igb3duZWQiCisJCQkiIGJ5IEhWTSwga2lsbCBpdFxuIik7CisJCWtpbGxfZG9tYWluX2J5X2RldmljZShwc2Rldik7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwlpZiAoIXRlc3RfYml0KF9YRU5fUENJQl9BRVJIQU5ETEVSLAorCQkodW5zaWduZWQgbG9uZyAqKSZwc2Rldi0+cGRldi0+c2hfaW5mby0+ZmxhZ3MpKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJImd1ZXN0IHdpdGggbm8gQUVSIGRyaXZlciBzaG91bGQgaGF2ZSBiZWVuIGtpbGxlZFxuIik7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisJcmVzdWx0ID0gY29tbW9uX3Byb2Nlc3MocHNkZXYsIDEsIFhFTl9QQ0lfT1BfYWVyX3Nsb3RyZXNldCwgcmVzdWx0KTsKKworCWlmIChyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfTk9ORSB8fAorCQlyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVCkgeworCQlkZXZfZGJnKCZkZXYtPmRldiwKKwkJCSJObyBBRVIgc2xvdF9yZXNldCBzZXJ2aWNlIG9yIGRpc2Nvbm5lY3RlZCFcbiIpOworCQlraWxsX2RvbWFpbl9ieV9kZXZpY2UocHNkZXYpOworCX0KK3JlbGVhc2U6CisJcGNpc3R1Yl9kZXZpY2VfcHV0KHBzZGV2KTsKK2VuZDoKKwl1cF93cml0ZSgmcGNpc3R1Yl9zZW0pOworCXJldHVybiByZXN1bHQ7CisKK30KKworCisvKnhlbl9wY2lia19tbWlvX2VuYWJsZWQ6IGl0IHdpbGwgc2VuZCB0aGUgbW1pb19lbmFibGVkIHJlcXVlc3QgdG8gIHBjaWZyb250CisqIGluIGNhc2Ugb2YgdGhlIGRldmljZSBkcml2ZXIgY291bGQgcHJvdmlkZSB0aGlzIHNlcnZpY2UsIGFuZCB0aGVuIHdhaXQKKyogZm9yIHBjaWZyb250IGFjaworKiBAZGV2OiBwb2ludGVyIHRvIFBDSSBkZXZpY2VzCisqIHJldHVybiB2YWx1ZSBpcyB1c2VkIGJ5IGFlcl9jb3JlIGRvX3JlY292ZXJ5IHBvbGljeQorKi8KKworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgeGVuX3BjaWJrX21taW9fZW5hYmxlZChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXY7CisJcGNpX2Vyc19yZXN1bHRfdCByZXN1bHQ7CisKKwlyZXN1bHQgPSBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7CisJZGV2X2RiZygmZGV2LT5kZXYsICJ4ZW5fcGNpYmtfbW1pb19lbmFibGVkKGJ1czoleCxkZXZmbjoleClcbiIsCisJCWRldi0+YnVzLT5udW1iZXIsIGRldi0+ZGV2Zm4pOworCisJZG93bl93cml0ZSgmcGNpc3R1Yl9zZW0pOworCXBzZGV2ID0gcGNpc3R1Yl9kZXZpY2VfZmluZChwY2lfZG9tYWluX25yKGRldi0+YnVzKSwKKwkJCQlkZXYtPmJ1cy0+bnVtYmVyLAorCQkJCVBDSV9TTE9UKGRldi0+ZGV2Zm4pLAorCQkJCVBDSV9GVU5DKGRldi0+ZGV2Zm4pKTsKKworCWlmICghcHNkZXYgfHwgIXBzZGV2LT5wZGV2KSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJRFJWX05BTUUgIiBkZXZpY2UgaXMgbm90IGZvdW5kL2Fzc2lnbmVkXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKCFwc2Rldi0+cGRldi0+c2hfaW5mbykgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgRFJWX05BTUUgIiBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZCBvciBvd25lZCIKKwkJCSIgYnkgSFZNLCBraWxsIGl0XG4iKTsKKwkJa2lsbF9kb21haW5fYnlfZGV2aWNlKHBzZGV2KTsKKwkJZ290byByZWxlYXNlOworCX0KKworCWlmICghdGVzdF9iaXQoX1hFTl9QQ0lCX0FFUkhBTkRMRVIsCisJCSh1bnNpZ25lZCBsb25nICopJnBzZGV2LT5wZGV2LT5zaF9pbmZvLT5mbGFncykpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiZ3Vlc3Qgd2l0aCBubyBBRVIgZHJpdmVyIHNob3VsZCBoYXZlIGJlZW4ga2lsbGVkXG4iKTsKKwkJZ290byByZWxlYXNlOworCX0KKwlyZXN1bHQgPSBjb21tb25fcHJvY2Vzcyhwc2RldiwgMSwgWEVOX1BDSV9PUF9hZXJfbW1pbywgcmVzdWx0KTsKKworCWlmIChyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfTk9ORSB8fAorCQlyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVCkgeworCQlkZXZfZGJnKCZkZXYtPmRldiwKKwkJCSJObyBBRVIgbW1pb19lbmFibGVkIHNlcnZpY2Ugb3IgZGlzY29ubmVjdGVkIVxuIik7CisJCWtpbGxfZG9tYWluX2J5X2RldmljZShwc2Rldik7CisJfQorcmVsZWFzZToKKwlwY2lzdHViX2RldmljZV9wdXQocHNkZXYpOworZW5kOgorCXVwX3dyaXRlKCZwY2lzdHViX3NlbSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyp4ZW5fcGNpYmtfZXJyb3JfZGV0ZWN0ZWQ6IGl0IHdpbGwgc2VuZCB0aGUgZXJyb3JfZGV0ZWN0ZWQgcmVxdWVzdCB0byAgcGNpZnJvbnQKKyogaW4gY2FzZSBvZiB0aGUgZGV2aWNlIGRyaXZlciBjb3VsZCBwcm92aWRlIHRoaXMgc2VydmljZSwgYW5kIHRoZW4gd2FpdAorKiBmb3IgcGNpZnJvbnQgYWNrLgorKiBAZGV2OiBwb2ludGVyIHRvIFBDSSBkZXZpY2VzCisqIEBlcnJvcjogdGhlIGN1cnJlbnQgUENJIGNvbm5lY3Rpb24gc3RhdGUKKyogcmV0dXJuIHZhbHVlIGlzIHVzZWQgYnkgYWVyX2NvcmUgZG9fcmVjb3ZlcnkgcG9saWN5CisqLworCitzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCB4ZW5fcGNpYmtfZXJyb3JfZGV0ZWN0ZWQoc3RydWN0IHBjaV9kZXYgKmRldiwKKwlwY2lfY2hhbm5lbF9zdGF0ZV90IGVycm9yKQoreworCXN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXY7CisJcGNpX2Vyc19yZXN1bHRfdCByZXN1bHQ7CisKKwlyZXN1bHQgPSBQQ0lfRVJTX1JFU1VMVF9DQU5fUkVDT1ZFUjsKKwlkZXZfZGJnKCZkZXYtPmRldiwgInhlbl9wY2lia19lcnJvcl9kZXRlY3RlZChidXM6JXgsZGV2Zm46JXgpXG4iLAorCQlkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuKTsKKworCWRvd25fd3JpdGUoJnBjaXN0dWJfc2VtKTsKKwlwc2RldiA9IHBjaXN0dWJfZGV2aWNlX2ZpbmQocGNpX2RvbWFpbl9ucihkZXYtPmJ1cyksCisJCQkJZGV2LT5idXMtPm51bWJlciwKKwkJCQlQQ0lfU0xPVChkZXYtPmRldmZuKSwKKwkJCQlQQ0lfRlVOQyhkZXYtPmRldmZuKSk7CisKKwlpZiAoIXBzZGV2IHx8ICFwc2Rldi0+cGRldikgeworCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCURSVl9OQU1FICIgZGV2aWNlIGlzIG5vdCBmb3VuZC9hc3NpZ25lZFxuIik7CisJCWdvdG8gZW5kOworCX0KKworCWlmICghcHNkZXYtPnBkZXYtPnNoX2luZm8pIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsIERSVl9OQU1FICIgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQgb3Igb3duZWQiCisJCQkiIGJ5IEhWTSwga2lsbCBpdFxuIik7CisJCWtpbGxfZG9tYWluX2J5X2RldmljZShwc2Rldik7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwkvKkd1ZXN0IG93bnMgdGhlIGRldmljZSB5ZXQgbm8gYWVyIGhhbmRsZXIgcmVnaWVzdGVkLCBraWxsIGd1ZXN0Ki8KKwlpZiAoIXRlc3RfYml0KF9YRU5fUENJQl9BRVJIQU5ETEVSLAorCQkodW5zaWduZWQgbG9uZyAqKSZwc2Rldi0+cGRldi0+c2hfaW5mby0+ZmxhZ3MpKSB7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiZ3Vlc3QgbWF5IGhhdmUgbm8gYWVyIGRyaXZlciwga2lsbCBpdFxuIik7CisJCWtpbGxfZG9tYWluX2J5X2RldmljZShwc2Rldik7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisJcmVzdWx0ID0gY29tbW9uX3Byb2Nlc3MocHNkZXYsIGVycm9yLCBYRU5fUENJX09QX2Flcl9kZXRlY3RlZCwgcmVzdWx0KTsKKworCWlmIChyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfTk9ORSB8fAorCQlyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVCkgeworCQlkZXZfZGJnKCZkZXYtPmRldiwKKwkJCSJObyBBRVIgZXJyb3JfZGV0ZWN0ZWQgc2VydmljZSBvciBkaXNjb25uZWN0ZWQhXG4iKTsKKwkJa2lsbF9kb21haW5fYnlfZGV2aWNlKHBzZGV2KTsKKwl9CityZWxlYXNlOgorCXBjaXN0dWJfZGV2aWNlX3B1dChwc2Rldik7CitlbmQ6CisJdXBfd3JpdGUoJnBjaXN0dWJfc2VtKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKnhlbl9wY2lia19lcnJvcl9yZXN1bWU6IGl0IHdpbGwgc2VuZCB0aGUgZXJyb3JfcmVzdW1lIHJlcXVlc3QgdG8gIHBjaWZyb250CisqIGluIGNhc2Ugb2YgdGhlIGRldmljZSBkcml2ZXIgY291bGQgcHJvdmlkZSB0aGlzIHNlcnZpY2UsIGFuZCB0aGVuIHdhaXQKKyogZm9yIHBjaWZyb250IGFjay4KKyogQGRldjogcG9pbnRlciB0byBQQ0kgZGV2aWNlcworKi8KKworc3RhdGljIHZvaWQgeGVuX3BjaWJrX2Vycm9yX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXY7CisKKwlkZXZfZGJnKCZkZXYtPmRldiwgInhlbl9wY2lia19lcnJvcl9yZXN1bWUoYnVzOiV4LGRldmZuOiV4KVxuIiwKKwkJZGV2LT5idXMtPm51bWJlciwgZGV2LT5kZXZmbik7CisKKwlkb3duX3dyaXRlKCZwY2lzdHViX3NlbSk7CisJcHNkZXYgPSBwY2lzdHViX2RldmljZV9maW5kKHBjaV9kb21haW5fbnIoZGV2LT5idXMpLAorCQkJCWRldi0+YnVzLT5udW1iZXIsCisJCQkJUENJX1NMT1QoZGV2LT5kZXZmbiksCisJCQkJUENJX0ZVTkMoZGV2LT5kZXZmbikpOworCisJaWYgKCFwc2RldiB8fCAhcHNkZXYtPnBkZXYpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQlEUlZfTkFNRSAiIGRldmljZSBpcyBub3QgZm91bmQvYXNzaWduZWRcbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoIXBzZGV2LT5wZGV2LT5zaF9pbmZvKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCBEUlZfTkFNRSAiIGRldmljZSBpcyBub3QgY29ubmVjdGVkIG9yIG93bmVkIgorCQkJIiBieSBIVk0sIGtpbGwgaXRcbiIpOworCQlraWxsX2RvbWFpbl9ieV9kZXZpY2UocHNkZXYpOworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJaWYgKCF0ZXN0X2JpdChfWEVOX1BDSUJfQUVSSEFORExFUiwKKwkJKHVuc2lnbmVkIGxvbmcgKikmcHNkZXYtPnBkZXYtPnNoX2luZm8tPmZsYWdzKSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSJndWVzdCB3aXRoIG5vIEFFUiBkcml2ZXIgc2hvdWxkIGhhdmUgYmVlbiBraWxsZWRcbiIpOworCQlraWxsX2RvbWFpbl9ieV9kZXZpY2UocHNkZXYpOworCQlnb3RvIHJlbGVhc2U7CisJfQorCWNvbW1vbl9wcm9jZXNzKHBzZGV2LCAxLCBYRU5fUENJX09QX2Flcl9yZXN1bWUsCisJCSAgICAgICBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQpOworcmVsZWFzZToKKwlwY2lzdHViX2RldmljZV9wdXQocHNkZXYpOworZW5kOgorCXVwX3dyaXRlKCZwY2lzdHViX3NlbSk7CisJcmV0dXJuOworfQorCisvKmFkZCB4ZW5fcGNpYmsgQUVSIGhhbmRsaW5nKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2Vycm9yX2hhbmRsZXJzIHhlbl9wY2lia19lcnJvcl9oYW5kbGVyID0geworCS5lcnJvcl9kZXRlY3RlZCA9IHhlbl9wY2lia19lcnJvcl9kZXRlY3RlZCwKKwkubW1pb19lbmFibGVkID0geGVuX3BjaWJrX21taW9fZW5hYmxlZCwKKwkuc2xvdF9yZXNldCA9IHhlbl9wY2lia19zbG90X3Jlc2V0LAorCS5yZXN1bWUgPSB4ZW5fcGNpYmtfZXJyb3JfcmVzdW1lLAorfTsKKworLyoKKyAqIE5vdGU6IFRoZXJlIGlzIG5vIE1PRFVMRV9ERVZJQ0VfVEFCTEUgZW50cnkgaGVyZSBiZWNhdXNlIHRoaXMgaXNuJ3QKKyAqIGZvciBhIG5vcm1hbCBkZXZpY2UuIEkgZG9uJ3Qgd2FudCBpdCB0byBiZSBsb2FkZWQgYXV0b21hdGljYWxseS4KKyAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgeGVuX3BjaWJrX3BjaV9kcml2ZXIgPSB7CisJLyogVGhlIG5hbWUgc2hvdWxkIGJlIHhlbl9wY2liYWNrLCBidXQgdW50aWwgdGhlIHRvb2xzIGFyZSB1cGRhdGVkCisJICogd2Ugd2lsbCBrZWVwIGl0IGFzIHBjaWJhY2suICovCisJLm5hbWUgPSAicGNpYmFjayIsCisJLmlkX3RhYmxlID0gcGNpc3R1Yl9pZHMsCisJLnByb2JlID0gcGNpc3R1Yl9wcm9iZSwKKwkucmVtb3ZlID0gcGNpc3R1Yl9yZW1vdmUsCisJLmVycl9oYW5kbGVyID0gJnhlbl9wY2lia19lcnJvcl9oYW5kbGVyLAorfTsKKworc3RhdGljIGlubGluZSBpbnQgc3RyX3RvX3Nsb3QoY29uc3QgY2hhciAqYnVmLCBpbnQgKmRvbWFpbiwgaW50ICpidXMsCisJCQkgICAgICBpbnQgKnNsb3QsIGludCAqZnVuYykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc3NjYW5mKGJ1ZiwgIiAleDoleDoleC4leCIsIGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jKTsKKwlpZiAoZXJyID09IDQpCisJCXJldHVybiAwOworCWVsc2UgaWYgKGVyciA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogdHJ5IGFnYWluIHdpdGhvdXQgZG9tYWluICovCisJKmRvbWFpbiA9IDA7CisJZXJyID0gc3NjYW5mKGJ1ZiwgIiAleDoleC4leCIsIGJ1cywgc2xvdCwgZnVuYyk7CisJaWYgKGVyciA9PSAzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdHJfdG9fcXVpcmsoY29uc3QgY2hhciAqYnVmLCBpbnQgKmRvbWFpbiwgaW50ICpidXMsIGludAorCQkJICAgICAgICpzbG90LCBpbnQgKmZ1bmMsIGludCAqcmVnLCBpbnQgKnNpemUsIGludCAqbWFzaykKK3sKKwlpbnQgZXJyOworCisJZXJyID0KKwkgICAgc3NjYW5mKGJ1ZiwgIiAlMDR4OiUwMng6JTAyeC4lMXgtJTA4eDolMXg6JTA4eCIsIGRvbWFpbiwgYnVzLCBzbG90LAorCQkgICBmdW5jLCByZWcsIHNpemUsIG1hc2spOworCWlmIChlcnIgPT0gNykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcGNpc3R1Yl9kZXZpY2VfaWRfYWRkKGludCBkb21haW4sIGludCBidXMsIGludCBzbG90LCBpbnQgZnVuYykKK3sKKwlzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2VfaWQgKnBjaV9kZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXBjaV9kZXZfaWQgPSBrbWFsbG9jKHNpemVvZigqcGNpX2Rldl9pZCksIEdGUF9LRVJORUwpOworCWlmICghcGNpX2Rldl9pZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwY2lfZGV2X2lkLT5kb21haW4gPSBkb21haW47CisJcGNpX2Rldl9pZC0+YnVzID0gYnVzOworCXBjaV9kZXZfaWQtPmRldmZuID0gUENJX0RFVkZOKHNsb3QsIGZ1bmMpOworCisJcHJfZGVidWcoRFJWX05BTUUgIjogd2FudHMgdG8gc2VpemUgJTA0eDolMDJ4OiUwMnguJTAxeFxuIiwKKwkJIGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2VfaWRzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZwY2lfZGV2X2lkLT5zbG90X2xpc3QsICZwY2lzdHViX2RldmljZV9pZHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9pZHNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpc3R1Yl9kZXZpY2VfaWRfcmVtb3ZlKGludCBkb21haW4sIGludCBidXMsIGludCBzbG90LCBpbnQgZnVuYykKK3sKKwlzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2VfaWQgKnBjaV9kZXZfaWQsICp0OworCWludCBkZXZmbiA9IFBDSV9ERVZGTihzbG90LCBmdW5jKTsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9pZHNfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwY2lfZGV2X2lkLCB0LCAmcGNpc3R1Yl9kZXZpY2VfaWRzLAorCQkJCSBzbG90X2xpc3QpIHsKKwkJaWYgKHBjaV9kZXZfaWQtPmRvbWFpbiA9PSBkb21haW4KKwkJICAgICYmIHBjaV9kZXZfaWQtPmJ1cyA9PSBidXMgJiYgcGNpX2Rldl9pZC0+ZGV2Zm4gPT0gZGV2Zm4pIHsKKwkJCS8qIERvbid0IGJyZWFrOyBoZXJlIGJlY2F1c2UgaXQncyBwb3NzaWJsZSB0aGUgc2FtZQorCQkJICogc2xvdCBjb3VsZCBiZSBpbiB0aGUgbGlzdCBtb3JlIHRoYW4gb25jZQorCQkJICovCisJCQlsaXN0X2RlbCgmcGNpX2Rldl9pZC0+c2xvdF9saXN0KTsKKwkJCWtmcmVlKHBjaV9kZXZfaWQpOworCisJCQllcnIgPSAwOworCisJCQlwcl9kZWJ1ZyhEUlZfTkFNRSAiOiByZW1vdmVkICUwNHg6JTAyeDolMDJ4LiUwMXggZnJvbSAiCisJCQkJICJzZWl6ZSBsaXN0XG4iLCBkb21haW4sIGJ1cywgc2xvdCwgZnVuYyk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2lkc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBjaXN0dWJfcmVnX2FkZChpbnQgZG9tYWluLCBpbnQgYnVzLCBpbnQgc2xvdCwgaW50IGZ1bmMsIGludCByZWcsCisJCQkgICBpbnQgc2l6ZSwgaW50IG1hc2spCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHBjaXN0dWJfZGV2aWNlICpwc2RldjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCXN0cnVjdCBjb25maWdfZmllbGQgKmZpZWxkOworCisJcHNkZXYgPSBwY2lzdHViX2RldmljZV9maW5kKGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jKTsKKwlpZiAoIXBzZGV2IHx8ICFwc2Rldi0+ZGV2KSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwlkZXYgPSBwc2Rldi0+ZGV2OworCisJZmllbGQgPSBremFsbG9jKHNpemVvZigqZmllbGQpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWZpZWxkKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWZpZWxkLT5vZmZzZXQgPSByZWc7CisJZmllbGQtPnNpemUgPSBzaXplOworCWZpZWxkLT5tYXNrID0gbWFzazsKKwlmaWVsZC0+aW5pdCA9IE5VTEw7CisJZmllbGQtPnJlc2V0ID0gTlVMTDsKKwlmaWVsZC0+cmVsZWFzZSA9IE5VTEw7CisJZmllbGQtPmNsZWFuID0geGVuX3BjaWJrX2NvbmZpZ19maWVsZF9mcmVlOworCisJZXJyID0geGVuX3BjaWJrX2NvbmZpZ19xdWlya3NfYWRkX2ZpZWxkKGRldiwgZmllbGQpOworCWlmIChlcnIpCisJCWtmcmVlKGZpZWxkKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3NpemVfdCBwY2lzdHViX3Nsb3RfYWRkKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQpCit7CisJaW50IGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jOworCWludCBlcnI7CisKKwllcnIgPSBzdHJfdG9fc2xvdChidWYsICZkb21haW4sICZidXMsICZzbG90LCAmZnVuYyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBwY2lzdHViX2RldmljZV9pZF9hZGQoZG9tYWluLCBidXMsIHNsb3QsIGZ1bmMpOworCitvdXQ6CisJaWYgKCFlcnIpCisJCWVyciA9IGNvdW50OworCXJldHVybiBlcnI7Cit9CisKK0RSSVZFUl9BVFRSKG5ld19zbG90LCBTX0lXVVNSLCBOVUxMLCBwY2lzdHViX3Nsb3RfYWRkKTsKKworc3RhdGljIHNzaXplX3QgcGNpc3R1Yl9zbG90X3JlbW92ZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LCBjb25zdCBjaGFyICpidWYsCisJCQkJICAgc2l6ZV90IGNvdW50KQoreworCWludCBkb21haW4sIGJ1cywgc2xvdCwgZnVuYzsKKwlpbnQgZXJyOworCisJZXJyID0gc3RyX3RvX3Nsb3QoYnVmLCAmZG9tYWluLCAmYnVzLCAmc2xvdCwgJmZ1bmMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gcGNpc3R1Yl9kZXZpY2VfaWRfcmVtb3ZlKGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jKTsKKworb3V0OgorCWlmICghZXJyKQorCQllcnIgPSBjb3VudDsKKwlyZXR1cm4gZXJyOworfQorCitEUklWRVJfQVRUUihyZW1vdmVfc2xvdCwgU19JV1VTUiwgTlVMTCwgcGNpc3R1Yl9zbG90X3JlbW92ZSk7CisKK3N0YXRpYyBzc2l6ZV90IHBjaXN0dWJfc2xvdF9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2VfaWQgKnBjaV9kZXZfaWQ7CisJc2l6ZV90IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9pZHNfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGNpX2Rldl9pZCwgJnBjaXN0dWJfZGV2aWNlX2lkcywgc2xvdF9saXN0KSB7CisJCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCisJCQlicmVhazsKKworCQljb3VudCArPSBzY25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkJCSAgICIlMDR4OiUwMng6JTAyeC4lMDF4XG4iLAorCQkJCSAgIHBjaV9kZXZfaWQtPmRvbWFpbiwgcGNpX2Rldl9pZC0+YnVzLAorCQkJCSAgIFBDSV9TTE9UKHBjaV9kZXZfaWQtPmRldmZuKSwKKwkJCQkgICBQQ0lfRlVOQyhwY2lfZGV2X2lkLT5kZXZmbikpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfaWRzX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBjb3VudDsKK30KKworRFJJVkVSX0FUVFIoc2xvdHMsIFNfSVJVU1IsIHBjaXN0dWJfc2xvdF9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgcGNpc3R1Yl9pcnFfaGFuZGxlcl9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2UgKnBzZGV2OworCXN0cnVjdCB4ZW5fcGNpYmtfZGV2X2RhdGEgKmRldl9kYXRhOworCXNpemVfdCBjb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocHNkZXYsICZwY2lzdHViX2RldmljZXMsIGRldl9saXN0KSB7CisJCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCisJCQlicmVhazsKKwkJaWYgKCFwc2Rldi0+ZGV2KQorCQkJY29udGludWU7CisJCWRldl9kYXRhID0gcGNpX2dldF9kcnZkYXRhKHBzZGV2LT5kZXYpOworCQlpZiAoIWRldl9kYXRhKQorCQkJY29udGludWU7CisJCWNvdW50ICs9CisJCSAgICBzY25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkJICAgICAgIiVzOiVzOiVzaW5nOiVsZFxuIiwKKwkJCSAgICAgIHBjaV9uYW1lKHBzZGV2LT5kZXYpLAorCQkJICAgICAgZGV2X2RhdGEtPmlzcl9vbiA/ICJvbiIgOiAib2ZmIiwKKwkJCSAgICAgIGRldl9kYXRhLT5hY2tfaW50ciA/ICJhY2siIDogIm5vdCBhY2siLAorCQkJICAgICAgZGV2X2RhdGEtPmhhbmRsZWQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOworCXJldHVybiBjb3VudDsKK30KKworRFJJVkVSX0FUVFIoaXJxX2hhbmRsZXJzLCBTX0lSVVNSLCBwY2lzdHViX2lycV9oYW5kbGVyX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBwY2lzdHViX2lycV9oYW5kbGVyX3N3aXRjaChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBjaXN0dWJfZGV2aWNlICpwc2RldjsKKwlzdHJ1Y3QgeGVuX3BjaWJrX2Rldl9kYXRhICpkZXZfZGF0YTsKKwlpbnQgZG9tYWluLCBidXMsIHNsb3QsIGZ1bmM7CisJaW50IGVyciA9IC1FTk9FTlQ7CisKKwllcnIgPSBzdHJfdG9fc2xvdChidWYsICZkb21haW4sICZidXMsICZzbG90LCAmZnVuYyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlwc2RldiA9IHBjaXN0dWJfZGV2aWNlX2ZpbmQoZG9tYWluLCBidXMsIHNsb3QsIGZ1bmMpOworCisJaWYgKCFwc2RldikKKwkJZ290byBvdXQ7CisKKwlkZXZfZGF0YSA9IHBjaV9nZXRfZHJ2ZGF0YShwc2Rldi0+ZGV2KTsKKwlpZiAoIWRldl9kYXRhKQorCQlnb3RvIG91dDsKKworCWRldl9kYmcoJnBzZGV2LT5kZXYtPmRldiwgIiVzIGZha2UgaXJxIGhhbmRsZXI6ICVkLT4lZFxuIiwKKwkJZGV2X2RhdGEtPmlycV9uYW1lLCBkZXZfZGF0YS0+aXNyX29uLAorCQkhZGV2X2RhdGEtPmlzcl9vbik7CisKKwlkZXZfZGF0YS0+aXNyX29uID0gIShkZXZfZGF0YS0+aXNyX29uKTsKKwlpZiAoZGV2X2RhdGEtPmlzcl9vbikKKwkJZGV2X2RhdGEtPmFja19pbnRyID0gMTsKK291dDoKKwlpZiAoIWVycikKKwkJZXJyID0gY291bnQ7CisJcmV0dXJuIGVycjsKK30KK0RSSVZFUl9BVFRSKGlycV9oYW5kbGVyX3N0YXRlLCBTX0lXVVNSLCBOVUxMLCBwY2lzdHViX2lycV9oYW5kbGVyX3N3aXRjaCk7CisKK3N0YXRpYyBzc2l6ZV90IHBjaXN0dWJfcXVpcmtfYWRkKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGNvdW50KQoreworCWludCBkb21haW4sIGJ1cywgc2xvdCwgZnVuYywgcmVnLCBzaXplLCBtYXNrOworCWludCBlcnI7CisKKwllcnIgPSBzdHJfdG9fcXVpcmsoYnVmLCAmZG9tYWluLCAmYnVzLCAmc2xvdCwgJmZ1bmMsICZyZWcsICZzaXplLAorCQkJICAgJm1hc2spOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gcGNpc3R1Yl9yZWdfYWRkKGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jLCByZWcsIHNpemUsIG1hc2spOworCitvdXQ6CisJaWYgKCFlcnIpCisJCWVyciA9IGNvdW50OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBjaXN0dWJfcXVpcmtfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LCBjaGFyICpidWYpCit7CisJaW50IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB4ZW5fcGNpYmtfY29uZmlnX3F1aXJrICpxdWlyazsKKwlzdHJ1Y3QgeGVuX3BjaWJrX2Rldl9kYXRhICpkZXZfZGF0YTsKKwljb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkICpmaWVsZDsKKwljb25zdCBzdHJ1Y3QgY29uZmlnX2ZpZWxkX2VudHJ5ICpjZmdfZW50cnk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2lkc19sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShxdWlyaywgJnhlbl9wY2lia19xdWlya3MsIHF1aXJrc19saXN0KSB7CisJCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCisJCQlnb3RvIG91dDsKKworCQljb3VudCArPSBzY25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkJCSAgICIlMDJ4OiUwMnguJTAxeFxuXHQlMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCQkJCSAgIHF1aXJrLT5wZGV2LT5idXMtPm51bWJlciwKKwkJCQkgICBQQ0lfU0xPVChxdWlyay0+cGRldi0+ZGV2Zm4pLAorCQkJCSAgIFBDSV9GVU5DKHF1aXJrLT5wZGV2LT5kZXZmbiksCisJCQkJICAgcXVpcmstPmRldmlkLnZlbmRvciwgcXVpcmstPmRldmlkLmRldmljZSwKKwkJCQkgICBxdWlyay0+ZGV2aWQuc3VidmVuZG9yLAorCQkJCSAgIHF1aXJrLT5kZXZpZC5zdWJkZXZpY2UpOworCisJCWRldl9kYXRhID0gcGNpX2dldF9kcnZkYXRhKHF1aXJrLT5wZGV2KTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNmZ19lbnRyeSwgJmRldl9kYXRhLT5jb25maWdfZmllbGRzLCBsaXN0KSB7CisJCQlmaWVsZCA9IGNmZ19lbnRyeS0+ZmllbGQ7CisJCQlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQorCQkJCWdvdG8gb3V0OworCisJCQljb3VudCArPSBzY25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkJCQkgICAiXHRcdCUwOHg6JTAxeDolMDh4XG4iLAorCQkJCQkgICBjZmdfZW50cnktPmJhc2Vfb2Zmc2V0ICsKKwkJCQkJICAgZmllbGQtPm9mZnNldCwgZmllbGQtPnNpemUsCisJCQkJCSAgIGZpZWxkLT5tYXNrKTsKKwkJfQorCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9pZHNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCitEUklWRVJfQVRUUihxdWlya3MsIFNfSVJVU1IgfCBTX0lXVVNSLCBwY2lzdHViX3F1aXJrX3Nob3csIHBjaXN0dWJfcXVpcmtfYWRkKTsKKworc3RhdGljIHNzaXplX3QgcGVybWlzc2l2ZV9hZGQoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50KQoreworCWludCBkb21haW4sIGJ1cywgc2xvdCwgZnVuYzsKKwlpbnQgZXJyOworCXN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXY7CisJc3RydWN0IHhlbl9wY2lia19kZXZfZGF0YSAqZGV2X2RhdGE7CisJZXJyID0gc3RyX3RvX3Nsb3QoYnVmLCAmZG9tYWluLCAmYnVzLCAmc2xvdCwgJmZ1bmMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXBzZGV2ID0gcGNpc3R1Yl9kZXZpY2VfZmluZChkb21haW4sIGJ1cywgc2xvdCwgZnVuYyk7CisJaWYgKCFwc2RldikgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCFwc2Rldi0+ZGV2KSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisJZGV2X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEocHNkZXYtPmRldik7CisJLyogdGhlIGRyaXZlciBkYXRhIGZvciBhIGRldmljZSBzaG91bGQgbmV2ZXIgYmUgbnVsbCBhdCB0aGlzIHBvaW50ICovCisJaWYgKCFkZXZfZGF0YSkgeworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gcmVsZWFzZTsKKwl9CisJaWYgKCFkZXZfZGF0YS0+cGVybWlzc2l2ZSkgeworCQlkZXZfZGF0YS0+cGVybWlzc2l2ZSA9IDE7CisJCS8qIExldCB1c2VyIGtub3cgdGhhdCB3aGF0IHRoZXkncmUgZG9pbmcgY291bGQgYmUgdW5zYWZlICovCisJCWRldl93YXJuKCZwc2Rldi0+ZGV2LT5kZXYsICJlbmFibGluZyBwZXJtaXNzaXZlIG1vZGUgIgorCQkJICJjb25maWd1cmF0aW9uIHNwYWNlIGFjY2Vzc2VzIVxuIik7CisJCWRldl93YXJuKCZwc2Rldi0+ZGV2LT5kZXYsCisJCQkgInBlcm1pc3NpdmUgbW9kZSBpcyBwb3RlbnRpYWxseSB1bnNhZmUhXG4iKTsKKwl9CityZWxlYXNlOgorCXBjaXN0dWJfZGV2aWNlX3B1dChwc2Rldik7CitvdXQ6CisJaWYgKCFlcnIpCisJCWVyciA9IGNvdW50OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBlcm1pc3NpdmVfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjaXN0dWJfZGV2aWNlICpwc2RldjsKKwlzdHJ1Y3QgeGVuX3BjaWJrX2Rldl9kYXRhICpkZXZfZGF0YTsKKwlzaXplX3QgY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaXN0dWJfZGV2aWNlc19sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwc2RldiwgJnBjaXN0dWJfZGV2aWNlcywgZGV2X2xpc3QpIHsKKwkJaWYgKGNvdW50ID49IFBBR0VfU0laRSkKKwkJCWJyZWFrOworCQlpZiAoIXBzZGV2LT5kZXYpCisJCQljb250aW51ZTsKKwkJZGV2X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEocHNkZXYtPmRldik7CisJCWlmICghZGV2X2RhdGEgfHwgIWRldl9kYXRhLT5wZXJtaXNzaXZlKQorCQkJY29udGludWU7CisJCWNvdW50ICs9CisJCSAgICBzY25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiJXNcbiIsCisJCQkgICAgICBwY2lfbmFtZShwc2Rldi0+ZGV2KSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaXN0dWJfZGV2aWNlc19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNvdW50OworfQorCitEUklWRVJfQVRUUihwZXJtaXNzaXZlLCBTX0lSVVNSIHwgU19JV1VTUiwgcGVybWlzc2l2ZV9zaG93LCBwZXJtaXNzaXZlX2FkZCk7CisKK3N0YXRpYyB2b2lkIHBjaXN0dWJfZXhpdCh2b2lkKQoreworCWRyaXZlcl9yZW1vdmVfZmlsZSgmeGVuX3BjaWJrX3BjaV9kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfbmV3X3Nsb3QpOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmeGVuX3BjaWJrX3BjaV9kcml2ZXIuZHJpdmVyLAorCQkJICAgJmRyaXZlcl9hdHRyX3JlbW92ZV9zbG90KTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnhlbl9wY2lia19wY2lfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX3Nsb3RzKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnhlbl9wY2lia19wY2lfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX3F1aXJrcyk7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZ4ZW5fcGNpYmtfcGNpX2RyaXZlci5kcml2ZXIsCisJCQkgICAmZHJpdmVyX2F0dHJfcGVybWlzc2l2ZSk7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZ4ZW5fcGNpYmtfcGNpX2RyaXZlci5kcml2ZXIsCisJCQkgICAmZHJpdmVyX2F0dHJfaXJxX2hhbmRsZXJzKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnhlbl9wY2lia19wY2lfZHJpdmVyLmRyaXZlciwKKwkJCSAgICZkcml2ZXJfYXR0cl9pcnFfaGFuZGxlcl9zdGF0ZSk7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ4ZW5fcGNpYmtfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaXN0dWJfaW5pdCh2b2lkKQoreworCWludCBwb3MgPSAwOworCWludCBlcnIgPSAwOworCWludCBkb21haW4sIGJ1cywgc2xvdCwgZnVuYzsKKwlpbnQgcGFyc2VkOworCisJaWYgKHBjaV9kZXZzX3RvX2hpZGUgJiYgKnBjaV9kZXZzX3RvX2hpZGUpIHsKKwkJZG8geworCQkJcGFyc2VkID0gMDsKKworCQkJZXJyID0gc3NjYW5mKHBjaV9kZXZzX3RvX2hpZGUgKyBwb3MsCisJCQkJICAgICAiICgleDoleDoleC4leCkgJW4iLAorCQkJCSAgICAgJmRvbWFpbiwgJmJ1cywgJnNsb3QsICZmdW5jLCAmcGFyc2VkKTsKKwkJCWlmIChlcnIgIT0gNCkgeworCQkJCWRvbWFpbiA9IDA7CisJCQkJZXJyID0gc3NjYW5mKHBjaV9kZXZzX3RvX2hpZGUgKyBwb3MsCisJCQkJCSAgICAgIiAoJXg6JXguJXgpICVuIiwKKwkJCQkJICAgICAmYnVzLCAmc2xvdCwgJmZ1bmMsICZwYXJzZWQpOworCQkJCWlmIChlcnIgIT0gMykKKwkJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKworCQkJZXJyID0gcGNpc3R1Yl9kZXZpY2VfaWRfYWRkKGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisKKwkJCS8qIGlmIHBhcnNlZDw9MCwgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KKwkJCXBvcyArPSBwYXJzZWQ7CisJCX0gd2hpbGUgKHBhcnNlZCA+IDAgJiYgcGNpX2RldnNfdG9faGlkZVtwb3NdKTsKKwl9CisKKwkvKiBJZiB3ZSdyZSB0aGUgZmlyc3QgUENJIERldmljZSBEcml2ZXIgdG8gcmVnaXN0ZXIsIHdlJ3JlIHRoZQorCSAqIGZpcnN0IG9uZSB0byBnZXQgb2ZmZXJlZCBQQ0kgZGV2aWNlcyBhcyB0aGV5IGJlY29tZQorCSAqIGF2YWlsYWJsZSAoYW5kIHRodXMgd2UgY2FuIGJlIHRoZSBmaXJzdCB0byBncmFiIHRoZW0pCisJICovCisJZXJyID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmeGVuX3BjaWJrX3BjaV9kcml2ZXIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWVyciA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmeGVuX3BjaWJrX3BjaV9kcml2ZXIuZHJpdmVyLAorCQkJCSAmZHJpdmVyX2F0dHJfbmV3X3Nsb3QpOworCWlmICghZXJyKQorCQllcnIgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJnhlbl9wY2lia19wY2lfZHJpdmVyLmRyaXZlciwKKwkJCQkJICZkcml2ZXJfYXR0cl9yZW1vdmVfc2xvdCk7CisJaWYgKCFlcnIpCisJCWVyciA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmeGVuX3BjaWJrX3BjaV9kcml2ZXIuZHJpdmVyLAorCQkJCQkgJmRyaXZlcl9hdHRyX3Nsb3RzKTsKKwlpZiAoIWVycikKKwkJZXJyID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZ4ZW5fcGNpYmtfcGNpX2RyaXZlci5kcml2ZXIsCisJCQkJCSAmZHJpdmVyX2F0dHJfcXVpcmtzKTsKKwlpZiAoIWVycikKKwkJZXJyID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZ4ZW5fcGNpYmtfcGNpX2RyaXZlci5kcml2ZXIsCisJCQkJCSAmZHJpdmVyX2F0dHJfcGVybWlzc2l2ZSk7CisKKwlpZiAoIWVycikKKwkJZXJyID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZ4ZW5fcGNpYmtfcGNpX2RyaXZlci5kcml2ZXIsCisJCQkJCSAmZHJpdmVyX2F0dHJfaXJxX2hhbmRsZXJzKTsKKwlpZiAoIWVycikKKwkJZXJyID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZ4ZW5fcGNpYmtfcGNpX2RyaXZlci5kcml2ZXIsCisJCQkJCSZkcml2ZXJfYXR0cl9pcnFfaGFuZGxlcl9zdGF0ZSk7CisJaWYgKGVycikKKwkJcGNpc3R1Yl9leGl0KCk7CisKK291dDoKKwlyZXR1cm4gZXJyOworCitwYXJzZV9lcnJvcjoKKwlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogRXJyb3IgcGFyc2luZyBwY2lfZGV2c190b19oaWRlIGF0IFwiJXNcIlxuIiwKKwkgICAgICAgcGNpX2RldnNfdG9faGlkZSArIHBvcyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKyNpZm5kZWYgTU9EVUxFCisvKgorICogZnNfaW5pdGNhbGwgaGFwcGVucyBiZWZvcmUgZGV2aWNlX2luaXRjYWxsCisgKiBzbyB4ZW5fcGNpYmsgKnNob3VsZCogZ2V0IGNhbGxlZCBmaXJzdCAoYi9jIHdlCisgKiB3YW50IHRvIHN1Y2sgdXAgYW55IGRldmljZSBiZWZvcmUgb3RoZXIgZHJpdmVycworICogZ2V0IGEgY2hhbmNlIGJ5IGJlaW5nIHRoZSBmaXJzdCBwY2kgZGV2aWNlCisgKiBkcml2ZXIgdG8gcmVnaXN0ZXIpCisgKi8KK2ZzX2luaXRjYWxsKHBjaXN0dWJfaW5pdCk7CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgeGVuX3BjaWJrX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCF4ZW5faW5pdGlhbF9kb21haW4oKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllcnIgPSB4ZW5fcGNpYmtfY29uZmlnX2luaXQoKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisjaWZkZWYgTU9EVUxFCisJZXJyID0gcGNpc3R1Yl9pbml0KCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisjZW5kaWYKKworCXBjaXN0dWJfaW5pdF9kZXZpY2VzX2xhdGUoKTsKKwllcnIgPSB4ZW5fcGNpYmtfeGVuYnVzX3JlZ2lzdGVyKCk7CisJaWYgKGVycikKKwkJcGNpc3R1Yl9leGl0KCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgeGVuX3BjaWJrX2NsZWFudXAodm9pZCkKK3sKKwl4ZW5fcGNpYmtfeGVuYnVzX3VucmVnaXN0ZXIoKTsKKwlwY2lzdHViX2V4aXQoKTsKK30KKworbW9kdWxlX2luaXQoeGVuX3BjaWJrX2luaXQpOworbW9kdWxlX2V4aXQoeGVuX3BjaWJrX2NsZWFudXApOworCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9wY2liYWNrLmggYi9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9wY2liYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlMTMxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3BjaWJhY2suaApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIFBDSSBCYWNrZW5kIENvbW1vbiBEYXRhIFN0cnVjdHVyZXMgJiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKKyAqCisgKiAgIEF1dGhvcjogUnlhbiBXaWxzb24gPGhhcDlAZXBvY2gubmNzYy5taWw+CisgKi8KKyNpZm5kZWYgX19YRU5fUENJQkFDS19IX18KKyNkZWZpbmUgX19YRU5fUENJQkFDS19IX18KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPHhlbi94ZW5idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2lvL3BjaWlmLmg+CisKK3N0cnVjdCBwY2lfZGV2X2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKK307CisKKyNkZWZpbmUgX1BERVZGX29wX2FjdGl2ZQkoMCkKKyNkZWZpbmUgUERFVkZfb3BfYWN0aXZlCQkoMTw8KF9QREVWRl9vcF9hY3RpdmUpKQorI2RlZmluZSBfUENJQl9vcF9wZW5kaW5nCSgxKQorI2RlZmluZSBQQ0lCX29wX3BlbmRpbmcJCSgxPDwoX1BDSUJfb3BfcGVuZGluZykpCisKK3N0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlIHsKKwl2b2lkICpwY2lfZGV2X2RhdGE7CisJc3BpbmxvY2tfdCBkZXZfbG9jazsKKwlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqeGRldjsKKwlzdHJ1Y3QgeGVuYnVzX3dhdGNoIGJlX3dhdGNoOworCXU4IGJlX3dhdGNoaW5nOworCWludCBldnRjaG5faXJxOworCXN0cnVjdCB4ZW5fcGNpX3NoYXJlZGluZm8gKnNoX2luZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgb3Bfd29yazsKK307CisKK3N0cnVjdCB4ZW5fcGNpYmtfZGV2X2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgY29uZmlnX2ZpZWxkczsKKwl1bnNpZ25lZCBpbnQgcGVybWlzc2l2ZToxOworCXVuc2lnbmVkIGludCB3YXJuZWRfb25fd3JpdGU6MTsKKwl1bnNpZ25lZCBpbnQgZW5hYmxlX2ludHg6MTsKKwl1bnNpZ25lZCBpbnQgaXNyX29uOjE7IC8qIFdoZXRoZXIgdGhlIElSUSBoYW5kbGVyIGlzIGluc3RhbGxlZC4gKi8KKwl1bnNpZ25lZCBpbnQgYWNrX2ludHI6MTsgLyogLi4gYW5kIEFDSy1pbmcgKi8KKwl1bnNpZ25lZCBsb25nIGhhbmRsZWQ7CisJdW5zaWduZWQgaW50IGlycTsgLyogU2F2ZWQgaW4gY2FzZSBkZXZpY2UgdHJhbnNpdGlvbnMgdG8gTVNJL01TSS1YICovCisJY2hhciBpcnFfbmFtZVswXTsgLyogeGVuLXBjaWJrWzAwMDowNDowMC4wXSAqLworfTsKKworLyogVXNlZCBieSBYZW5CdXMgYW5kIHhlbl9wY2lia19vcHMuYyAqLworZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IHhlbl9wY2lia19hZXJfd2FpdF9xdWV1ZTsKK2V4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGVuX3BjaWJrX3dxOworLyogVXNlZCBieSBwY2lzdHViLmMgYW5kIGNvbmZfc3BhY2VfcXVpcmtzLmMgKi8KK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHhlbl9wY2lia19xdWlya3M7CisKKy8qIEdldC9QdXQgUENJIERldmljZXMgdGhhdCBhcmUgaGlkZGVuIGZyb20gdGhlIFBDSSBCYWNrZW5kIERvbWFpbiAqLworc3RydWN0IHBjaV9kZXYgKnBjaXN0dWJfZ2V0X3BjaV9kZXZfYnlfc2xvdChzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCQkJICAgIGludCBkb21haW4sIGludCBidXMsCisJCQkJCSAgICBpbnQgc2xvdCwgaW50IGZ1bmMpOworc3RydWN0IHBjaV9kZXYgKnBjaXN0dWJfZ2V0X3BjaV9kZXYoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsCisJCQkJICAgIHN0cnVjdCBwY2lfZGV2ICpkZXYpOwordm9pZCBwY2lzdHViX3B1dF9wY2lfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCisvKiBFbnN1cmUgYSBkZXZpY2UgaXMgdHVybmVkIG9mZiBvciByZXNldCAqLwordm9pZCB4ZW5fcGNpYmtfcmVzZXRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworLyogQWNjZXNzIGEgdmlydHVhbCBjb25maWd1cmF0aW9uIHNwYWNlIGZvciBhIFBDSSBkZXZpY2UgKi8KK2ludCB4ZW5fcGNpYmtfY29uZmlnX2luaXQodm9pZCk7CitpbnQgeGVuX3BjaWJrX2NvbmZpZ19pbml0X2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3ZvaWQgeGVuX3BjaWJrX2NvbmZpZ19mcmVlX2R5bl9maWVsZHMoc3RydWN0IHBjaV9kZXYgKmRldik7Cit2b2lkIHhlbl9wY2lia19jb25maWdfcmVzZXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwordm9pZCB4ZW5fcGNpYmtfY29uZmlnX2ZyZWVfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworaW50IHhlbl9wY2lia19jb25maWdfcmVhZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSwKKwkJCSAgdTMyICpyZXRfdmFsKTsKK2ludCB4ZW5fcGNpYmtfY29uZmlnX3dyaXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBvZmZzZXQsIGludCBzaXplLAorCQkJICAgdTMyIHZhbHVlKTsKKworLyogSGFuZGxlIHJlcXVlc3RzIGZvciBzcGVjaWZpYyBkZXZpY2VzIGZyb20gdGhlIGZyb250ZW5kICovCit0eXBlZGVmIGludCAoKnB1Ymxpc2hfcGNpX2Rldl9jYikgKHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2LAorCQkJCSAgIHVuc2lnbmVkIGludCBkb21haW4sIHVuc2lnbmVkIGludCBidXMsCisJCQkJICAgdW5zaWduZWQgaW50IGRldmZuLCB1bnNpZ25lZCBpbnQgZGV2aWQpOwordHlwZWRlZiBpbnQgKCpwdWJsaXNoX3BjaV9yb290X2NiKSAoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsCisJCQkJICAgIHVuc2lnbmVkIGludCBkb21haW4sIHVuc2lnbmVkIGludCBidXMpOworCisvKiBCYWNrZW5kIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIHR3byB0eXBlcyBvZiBCREYgcmVwcmVzZW50YXRpb246CisgKiAgdnBjaSAtIEJERnMgc3RhcnQgYXQgMDAKKyAqICBwYXNzdGhyb3VnaCAtIEJERnMgYXJlIGV4YWN0bHkgbGlrZSBpbiB0aGUgaG9zdC4KKyAqLworc3RydWN0IHhlbl9wY2lia19iYWNrZW5kIHsKKwljaGFyICpuYW1lOworCWludCAoKmluaXQpKHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2KTsKKwl2b2lkICgqZnJlZSkoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYpOworCWludCAoKmZpbmQpKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2LAorCQkgICAgdW5zaWduZWQgaW50ICpkb21haW4sIHVuc2lnbmVkIGludCAqYnVzLAorCQkgICAgdW5zaWduZWQgaW50ICpkZXZmbik7CisJaW50ICgqcHVibGlzaCkoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsIHB1Ymxpc2hfcGNpX3Jvb3RfY2IgY2IpOworCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwgc3RydWN0IHBjaV9kZXYgKmRldik7CisJaW50ICgqYWRkKShzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwgc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJICAgaW50IGRldmlkLCBwdWJsaXNoX3BjaV9kZXZfY2IgcHVibGlzaF9jYik7CisJc3RydWN0IHBjaV9kZXYgKigqZ2V0KShzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZG9tYWluLCB1bnNpZ25lZCBpbnQgYnVzLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBkZXZmbik7Cit9OworCitleHRlcm4gc3RydWN0IHhlbl9wY2lia19iYWNrZW5kIHhlbl9wY2lia192cGNpX2JhY2tlbmQ7CitleHRlcm4gc3RydWN0IHhlbl9wY2lia19iYWNrZW5kIHhlbl9wY2lia19wYXNzdGhyb3VnaF9iYWNrZW5kOworZXh0ZXJuIHN0cnVjdCB4ZW5fcGNpYmtfYmFja2VuZCAqeGVuX3BjaWJrX2JhY2tlbmQ7CisKK3N0YXRpYyBpbmxpbmUgaW50IHhlbl9wY2lia19hZGRfcGNpX2RldihzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCQkJc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJaW50IGRldmlkLAorCQkJCQlwdWJsaXNoX3BjaV9kZXZfY2IgcHVibGlzaF9jYikKK3sKKwlpZiAoeGVuX3BjaWJrX2JhY2tlbmQgJiYgeGVuX3BjaWJrX2JhY2tlbmQtPmFkZCkKKwkJcmV0dXJuIHhlbl9wY2lia19iYWNrZW5kLT5hZGQocGRldiwgZGV2LCBkZXZpZCwgcHVibGlzaF9jYik7CisJcmV0dXJuIC0xOworfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZW5fcGNpYmtfcmVsZWFzZV9wY2lfZGV2KHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2LAorCQkJCQkgICAgIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWYgKHhlbl9wY2lia19iYWNrZW5kICYmIHhlbl9wY2lia19iYWNrZW5kLT5mcmVlKQorCQlyZXR1cm4geGVuX3BjaWJrX2JhY2tlbmQtPnJlbGVhc2UocGRldiwgZGV2KTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9kZXYgKgoreGVuX3BjaWJrX2dldF9wY2lfZGV2KHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgZG9tYWluLAorCQkgICAgICB1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4pCit7CisJaWYgKHhlbl9wY2lia19iYWNrZW5kICYmIHhlbl9wY2lia19iYWNrZW5kLT5nZXQpCisJCXJldHVybiB4ZW5fcGNpYmtfYmFja2VuZC0+Z2V0KHBkZXYsIGRvbWFpbiwgYnVzLCBkZXZmbik7CisJcmV0dXJuIE5VTEw7Cit9OworLyoqCisqIEFkZCBmb3IgZG9tYWluMCBQQ0lFLUFFUiBoYW5kbGluZy4gR2V0IGd1ZXN0IGRvbWFpbi9idXMvZGV2Zm4gaW4geGVuX3BjaWJrCisqIGJlZm9yZSBzZW5kaW5nIGFlciByZXF1ZXN0IHRvIHBjaWZyb250LCBzbyB0aGF0IGd1ZXN0IGNvdWxkIGlkZW50aWZ5CisqIGRldmljZSwgY29vcGVhcnRlIHdpdGggeGVuX3BjaWJrIHRvIGZpbmlzaCBhZXIgcmVjb3Zlcnkgam9iIGlmIGRldmljZSBkcml2ZXIKKyogaGFzIHRoZSBjYXBhYmlsaXR5CisqLworc3RhdGljIGlubGluZSBpbnQgeGVuX3BjaWJrX2dldF9wY2lmcm9udF9kZXYoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKKwkJCQkJICAgICBzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgKmRvbWFpbiwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgKmJ1cywKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgKmRldmZuKQoreworCWlmICh4ZW5fcGNpYmtfYmFja2VuZCAmJiB4ZW5fcGNpYmtfYmFja2VuZC0+ZmluZCkKKwkJcmV0dXJuIHhlbl9wY2lia19iYWNrZW5kLT5maW5kKHBjaWRldiwgcGRldiwgZG9tYWluLCBidXMsCisJCQkJCSAgICAgICBkZXZmbik7CisJcmV0dXJuIC0xOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IHhlbl9wY2lia19pbml0X2RldmljZXMoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYpCit7CisJaWYgKHhlbl9wY2lia19iYWNrZW5kICYmIHhlbl9wY2lia19iYWNrZW5kLT5pbml0KQorCQlyZXR1cm4geGVuX3BjaWJrX2JhY2tlbmQtPmluaXQocGRldik7CisJcmV0dXJuIC0xOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IHhlbl9wY2lia19wdWJsaXNoX3BjaV9yb290cyhzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCQkJICAgICAgcHVibGlzaF9wY2lfcm9vdF9jYiBjYikKK3sKKwlpZiAoeGVuX3BjaWJrX2JhY2tlbmQgJiYgeGVuX3BjaWJrX2JhY2tlbmQtPnB1Ymxpc2gpCisJCXJldHVybiB4ZW5fcGNpYmtfYmFja2VuZC0+cHVibGlzaChwZGV2LCBjYik7CisJcmV0dXJuIC0xOworfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZW5fcGNpYmtfcmVsZWFzZV9kZXZpY2VzKHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2KQoreworCWlmICh4ZW5fcGNpYmtfYmFja2VuZCAmJiB4ZW5fcGNpYmtfYmFja2VuZC0+ZnJlZSkKKwkJcmV0dXJuIHhlbl9wY2lia19iYWNrZW5kLT5mcmVlKHBkZXYpOworfTsKKy8qIEhhbmRsZXMgZXZlbnRzIGZyb20gZnJvbnQtZW5kICovCitpcnFyZXR1cm5fdCB4ZW5fcGNpYmtfaGFuZGxlX2V2ZW50KGludCBpcnEsIHZvaWQgKmRldl9pZCk7Cit2b2lkIHhlbl9wY2lia19kb19vcChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpOworCitpbnQgeGVuX3BjaWJrX3hlbmJ1c19yZWdpc3Rlcih2b2lkKTsKK3ZvaWQgeGVuX3BjaWJrX3hlbmJ1c191bnJlZ2lzdGVyKHZvaWQpOworCitleHRlcm4gaW50IHZlcmJvc2VfcmVxdWVzdDsKKwordm9pZCB4ZW5fcGNpYmtfdGVzdF9hbmRfc2NoZWR1bGVfb3Aoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYpOworI2VuZGlmCisKKy8qIEhhbmRsZXMgc2hhcmVkIElSUXMgdGhhdCBjYW4gdG8gZGV2aWNlIGRvbWFpbiBhbmQgY29udHJvbCBkb21haW4uICovCit2b2lkIHhlbl9wY2lia19pcnFfaGFuZGxlcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcmVzZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuLXBjaWJhY2svcGNpYmFja19vcHMuYyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3BjaWJhY2tfb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5NWMzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3BjaWJhY2tfb3BzLmMKQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiBQQ0kgQmFja2VuZCBPcGVyYXRpb25zIC0gcmVzcG9uZCB0byBQQ0kgcmVxdWVzdHMgZnJvbSBGcm9udGVuZAorICoKKyAqICAgQXV0aG9yOiBSeWFuIFdpbHNvbiA8aGFwOUBlcG9jaC5uY3NjLm1pbD4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlICJwY2liYWNrLmgiCisKKyNkZWZpbmUgRFJWX05BTUUJInhlbi1wY2liYWNrIgoraW50IHZlcmJvc2VfcmVxdWVzdDsKK21vZHVsZV9wYXJhbSh2ZXJib3NlX3JlcXVlc3QsIGludCwgMDY0NCk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB4ZW5fcGNpYmtfZ3Vlc3RfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisKKy8qIEVuc3VyZSBhIGRldmljZSBpcyBoYXMgdGhlIGZha2UgSVJRIGhhbmRsZXIgInR1cm5lZCBvbi9vZmYiIGFuZCBpcworICogcmVhZHkgdG8gYmUgZXhwb3J0ZWQuIFRoaXMgTVVTVCBiZSBydW4gYWZ0ZXIgeGVuX3BjaWJrX3Jlc2V0X2RldmljZQorICogd2hpY2ggZG9lcyB0aGUgYWN0dWFsIFBDSSBkZXZpY2UgZW5hYmxlL2Rpc2FibGUuCisgKi8KK3N0YXRpYyB2b2lkIHhlbl9wY2lia19jb250cm9sX2lzcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcmVzZXQpCit7CisJc3RydWN0IHhlbl9wY2lia19kZXZfZGF0YSAqZGV2X2RhdGE7CisJaW50IHJjOworCWludCBlbmFibGUgPSAwOworCisJZGV2X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlpZiAoIWRldl9kYXRhKQorCQlyZXR1cm47CisKKwkvKiBXZSBkb24ndCBkZWFsIHdpdGggYnJpZGdlcyAqLworCWlmIChkZXYtPmhkcl90eXBlICE9IFBDSV9IRUFERVJfVFlQRV9OT1JNQUwpCisJCXJldHVybjsKKworCWlmIChyZXNldCkgeworCQlkZXZfZGF0YS0+ZW5hYmxlX2ludHggPSAwOworCQlkZXZfZGF0YS0+YWNrX2ludHIgPSAwOworCX0KKwllbmFibGUgPSAgZGV2X2RhdGEtPmVuYWJsZV9pbnR4OworCisJLyogQXNrZWQgdG8gZGlzYWJsZSwgYnV0IElTUiBpc24ndCBydW5uaWcgKi8KKwlpZiAoIWVuYWJsZSAmJiAhZGV2X2RhdGEtPmlzcl9vbikKKwkJcmV0dXJuOworCisJLyogU3F1aXJyZWwgYXdheSB0aGUgSVJRcyBpbiB0aGUgZGV2X2RhdGEuIFdlIG5lZWQgdGhpcworCSAqIGIvYyB3aGVuIGRldmljZSB0cmFuc2l0aW9ucyB0byBNU0ksIHRoZSBkZXYtPmlycSBpcworCSAqIG92ZXJ3cml0dGVuIHdpdGggdGhlIE1TSSB2ZWN0b3IuCisJICovCisJaWYgKGVuYWJsZSkKKwkJZGV2X2RhdGEtPmlycSA9IGRldi0+aXJxOworCisJLyoKKwkgKiBTUi1JT1YgZGV2aWNlcyBpbiBhbGwgdXNlIE1TSS1YIGFuZCBoYXZlIG5vIGxlZ2FjeQorCSAqIGludGVycnVwdHMsIHNvIGluaGliaXQgY3JlYXRpbmcgYSBmYWtlIElSUSBoYW5kbGVyIGZvciB0aGVtLgorCSAqLworCWlmIChkZXZfZGF0YS0+aXJxID09IDApCisJCWdvdG8gb3V0OworCisJZGV2X2RiZygmZGV2LT5kZXYsICIlczogIyVkICVzICVzJXMgJXMtPiAlc1xuIiwKKwkJZGV2X2RhdGEtPmlycV9uYW1lLAorCQlkZXZfZGF0YS0+aXJxLAorCQlwY2lfaXNfZW5hYmxlZChkZXYpID8gIm9uIiA6ICJvZmYiLAorCQlkZXYtPm1zaV9lbmFibGVkID8gIk1TSSIgOiAiIiwKKwkJZGV2LT5tc2l4X2VuYWJsZWQgPyAiTVNJL1giIDogIiIsCisJCWRldl9kYXRhLT5pc3Jfb24gPyAiZW5hYmxlIiA6ICJkaXNhYmxlIiwKKwkJZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCisJaWYgKGVuYWJsZSkgeworCQlyYyA9IHJlcXVlc3RfaXJxKGRldl9kYXRhLT5pcnEsCisJCQkJeGVuX3BjaWJrX2d1ZXN0X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQkJZGV2X2RhdGEtPmlycV9uYW1lLCBkZXYpOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiJXM6IGZhaWxlZCB0byBpbnN0YWxsIGZha2UgSVJRICIgXAorCQkJCSJoYW5kbGVyIGZvciBJUlEgJWQhIChyYzolZClcbiIsCisJCQkJZGV2X2RhdGEtPmlycV9uYW1lLCBkZXZfZGF0YS0+aXJxLCByYyk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCWZyZWVfaXJxKGRldl9kYXRhLT5pcnEsIGRldik7CisJCWRldl9kYXRhLT5pcnEgPSAwOworCX0KKwlkZXZfZGF0YS0+aXNyX29uID0gZW5hYmxlOworCWRldl9kYXRhLT5hY2tfaW50ciA9IGVuYWJsZTsKK291dDoKKwlkZXZfZGJnKCZkZXYtPmRldiwgIiVzOiAjJWQgJXMgJXMlcyAlc1xuIiwKKwkJZGV2X2RhdGEtPmlycV9uYW1lLAorCQlkZXZfZGF0YS0+aXJxLAorCQlwY2lfaXNfZW5hYmxlZChkZXYpID8gIm9uIiA6ICJvZmYiLAorCQlkZXYtPm1zaV9lbmFibGVkID8gIk1TSSIgOiAiIiwKKwkJZGV2LT5tc2l4X2VuYWJsZWQgPyAiTVNJL1giIDogIiIsCisJCWVuYWJsZSA/IChkZXZfZGF0YS0+aXNyX29uID8gImVuYWJsZWQiIDogImZhaWxlZCB0byBlbmFibGUiKSA6CisJCQkoZGV2X2RhdGEtPmlzcl9vbiA/ICJmYWlsZWQgdG8gZGlzYWJsZSIgOiAiZGlzYWJsZWQiKSk7Cit9CisKKy8qIEVuc3VyZSBhIGRldmljZSBpcyAidHVybmVkIG9mZiIgYW5kIHJlYWR5IHRvIGJlIGV4cG9ydGVkLgorICogKEFsc28gc2VlIHhlbl9wY2lia19jb25maWdfcmVzZXQgdG8gZW5zdXJlIHZpcnR1YWwgY29uZmlndXJhdGlvbiBzcGFjZSBpcworICogcmVhZHkgdG8gYmUgcmUtZXhwb3J0ZWQpCisgKi8KK3ZvaWQgeGVuX3BjaWJrX3Jlc2V0X2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUxNiBjbWQ7CisKKwl4ZW5fcGNpYmtfY29udHJvbF9pc3IoZGV2LCAxIC8qIHJlc2V0IGRldmljZSAqLyk7CisKKwkvKiBEaXNhYmxlIGRldmljZXMgKGJ1dCBub3QgYnJpZGdlcykgKi8KKwlpZiAoZGV2LT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfTk9STUFMKSB7CisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwkJLyogVGhlIGd1ZXN0IGNvdWxkIGhhdmUgYmVlbiBhYnJ1cHRseSBraWxsZWQgd2l0aG91dAorCQkgKiBkaXNhYmxpbmcgTVNJL01TSS1YIGludGVycnVwdHMuKi8KKwkJaWYgKGRldi0+bXNpeF9lbmFibGVkKQorCQkJcGNpX2Rpc2FibGVfbXNpeChkZXYpOworCQlpZiAoZGV2LT5tc2lfZW5hYmxlZCkKKwkJCXBjaV9kaXNhYmxlX21zaShkZXYpOworI2VuZGlmCisJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAwKTsKKworCQlkZXYtPmlzX2J1c21hc3RlciA9IDA7CisJfSBlbHNlIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisJCWlmIChjbWQgJiAoUENJX0NPTU1BTkRfSU5WQUxJREFURSkpIHsKKwkJCWNtZCAmPSB+KFBDSV9DT01NQU5EX0lOVkFMSURBVEUpOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisKKwkJCWRldi0+aXNfYnVzbWFzdGVyID0gMDsKKwkJfQorCX0KK30KKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCitzdGF0aWMKK2ludCB4ZW5fcGNpYmtfZW5hYmxlX21zaShzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCSBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgeGVuX3BjaV9vcCAqb3ApCit7CisJc3RydWN0IHhlbl9wY2lia19kZXZfZGF0YSAqZGV2X2RhdGE7CisJaW50IG90aGVyZW5kID0gcGRldi0+eGRldi0+b3RoZXJlbmRfaWQ7CisJaW50IHN0YXR1czsKKworCWlmICh1bmxpa2VseSh2ZXJib3NlX3JlcXVlc3QpKQorCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlczogZW5hYmxlIE1TSVxuIiwgcGNpX25hbWUoZGV2KSk7CisKKwlzdGF0dXMgPSBwY2lfZW5hYmxlX21zaShkZXYpOworCisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgImVycm9yIGVuYWJsZSBtc2kgZm9yIGd1ZXN0ICV4IHN0YXR1cyAleFxuIiwKKwkJCW90aGVyZW5kLCBzdGF0dXMpOworCQlvcC0+dmFsdWUgPSAwOworCQlyZXR1cm4gWEVOX1BDSV9FUlJfb3BfZmFpbGVkOworCX0KKworCS8qIFRoZSB2YWx1ZSB0aGUgZ3Vlc3QgbmVlZHMgaXMgYWN0dWFsbHkgdGhlIElEVCB2ZWN0b3IsIG5vdCB0aGUKKwkgKiB0aGUgbG9jYWwgZG9tYWluJ3MgSVJRIG51bWJlci4gKi8KKworCW9wLT52YWx1ZSA9IGRldi0+aXJxID8geGVuX3BpcnFfZnJvbV9pcnEoZGV2LT5pcnEpIDogMDsKKwlpZiAodW5saWtlbHkodmVyYm9zZV9yZXF1ZXN0KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXM6IE1TSTogJWRcbiIsIHBjaV9uYW1lKGRldiksCisJCQlvcC0+dmFsdWUpOworCisJZGV2X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlpZiAoZGV2X2RhdGEpCisJCWRldl9kYXRhLT5hY2tfaW50ciA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljCitpbnQgeGVuX3BjaWJrX2Rpc2FibGVfbXNpKHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2LAorCQkJICBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgeGVuX3BjaV9vcCAqb3ApCit7CisJc3RydWN0IHhlbl9wY2lia19kZXZfZGF0YSAqZGV2X2RhdGE7CisKKwlpZiAodW5saWtlbHkodmVyYm9zZV9yZXF1ZXN0KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXM6IGRpc2FibGUgTVNJXG4iLAorCQkgICAgICAgcGNpX25hbWUoZGV2KSk7CisJcGNpX2Rpc2FibGVfbXNpKGRldik7CisKKwlvcC0+dmFsdWUgPSBkZXYtPmlycSA/IHhlbl9waXJxX2Zyb21faXJxKGRldi0+aXJxKSA6IDA7CisJaWYgKHVubGlrZWx5KHZlcmJvc2VfcmVxdWVzdCkpCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICI6ICVzOiBNU0k6ICVkXG4iLCBwY2lfbmFtZShkZXYpLAorCQkJb3AtPnZhbHVlKTsKKwlkZXZfZGF0YSA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCWlmIChkZXZfZGF0YSkKKwkJZGV2X2RhdGEtPmFja19pbnRyID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljCitpbnQgeGVuX3BjaWJrX2VuYWJsZV9tc2l4KHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2LAorCQkJICBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgeGVuX3BjaV9vcCAqb3ApCit7CisJc3RydWN0IHhlbl9wY2lia19kZXZfZGF0YSAqZGV2X2RhdGE7CisJaW50IGksIHJlc3VsdDsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllczsKKworCWlmICh1bmxpa2VseSh2ZXJib3NlX3JlcXVlc3QpKQorCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlczogZW5hYmxlIE1TSS1YXG4iLAorCQkgICAgICAgcGNpX25hbWUoZGV2KSk7CisJaWYgKG9wLT52YWx1ZSA+IFNIX0lORk9fTUFYX1ZFQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllbnRyaWVzID0ga21hbGxvYyhvcC0+dmFsdWUgKiBzaXplb2YoKmVudHJpZXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZW50cmllcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBvcC0+dmFsdWU7IGkrKykgeworCQllbnRyaWVzW2ldLmVudHJ5ID0gb3AtPm1zaXhfZW50cmllc1tpXS5lbnRyeTsKKwkJZW50cmllc1tpXS52ZWN0b3IgPSBvcC0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvcjsKKwl9CisKKwlyZXN1bHQgPSBwY2lfZW5hYmxlX21zaXgoZGV2LCBlbnRyaWVzLCBvcC0+dmFsdWUpOworCisJaWYgKHJlc3VsdCA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBvcC0+dmFsdWU7IGkrKykgeworCQkJb3AtPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGVudHJpZXNbaV0uZW50cnk7CisJCQlpZiAoZW50cmllc1tpXS52ZWN0b3IpCisJCQkJb3AtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IgPQorCQkJCQl4ZW5fcGlycV9mcm9tX2lycShlbnRyaWVzW2ldLnZlY3Rvcik7CisJCQkJaWYgKHVubGlrZWx5KHZlcmJvc2VfcmVxdWVzdCkpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICI6ICVzOiAiIFwKKwkJCQkJCSJNU0ktWFslZF06ICVkXG4iLAorCQkJCQkJcGNpX25hbWUoZGV2KSwgaSwKKwkJCQkJCW9wLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yKTsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogJXM6IGZhaWxlZCB0byBlbmFibGUgTVNJLVg6IGVyciAlZCFcbiIsCisJCQlwY2lfbmFtZShkZXYpLCByZXN1bHQpOworCX0KKwlrZnJlZShlbnRyaWVzKTsKKworCW9wLT52YWx1ZSA9IHJlc3VsdDsKKwlkZXZfZGF0YSA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCWlmIChkZXZfZGF0YSkKKwkJZGV2X2RhdGEtPmFja19pbnRyID0gMDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYworaW50IHhlbl9wY2lia19kaXNhYmxlX21zaXgoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsCisJCQkgICBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgeGVuX3BjaV9vcCAqb3ApCit7CisJc3RydWN0IHhlbl9wY2lia19kZXZfZGF0YSAqZGV2X2RhdGE7CisJaWYgKHVubGlrZWx5KHZlcmJvc2VfcmVxdWVzdCkpCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICI6ICVzOiBkaXNhYmxlIE1TSS1YXG4iLAorCQkJcGNpX25hbWUoZGV2KSk7CisJcGNpX2Rpc2FibGVfbXNpeChkZXYpOworCisJLyoKKwkgKiBTUi1JT1YgZGV2aWNlcyAod2hpY2ggZG9uJ3QgaGF2ZSBhbnkgbGVnYWN5IElSUSkgaGF2ZQorCSAqIGFuIHVuZGVmaW5lZCBJUlEgdmFsdWUgb2YgemVyby4KKwkgKi8KKwlvcC0+dmFsdWUgPSBkZXYtPmlycSA/IHhlbl9waXJxX2Zyb21faXJxKGRldi0+aXJxKSA6IDA7CisJaWYgKHVubGlrZWx5KHZlcmJvc2VfcmVxdWVzdCkpCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICI6ICVzOiBNU0ktWDogJWRcbiIsIHBjaV9uYW1lKGRldiksCisJCQlvcC0+dmFsdWUpOworCWRldl9kYXRhID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJaWYgKGRldl9kYXRhKQorCQlkZXZfZGF0YS0+YWNrX2ludHIgPSAxOworCXJldHVybiAwOworfQorI2VuZGlmCisvKgorKiBOb3cgdGhlIHNhbWUgZXZ0Y2huIGlzIHVzZWQgZm9yIGJvdGggcGNpZnJvbnQgY29uZl9yZWFkX3dyaXRlIHJlcXVlc3QKKyogYXMgd2VsbCBhcyBwY2llIGFlciBmcm9udCBlbmQgYWNrLiBXZSB1c2UgYSBuZXcgd29ya19xdWV1ZSB0byBzY2hlZHVsZQorKiB4ZW5fcGNpYmsgY29uZl9yZWFkX3dyaXRlIHNlcnZpY2UgZm9yIGF2b2lkaW5nIGNvbmZpY3Qgd2l0aCBhZXJfY29yZQorKiBkb19yZWNvdmVyeSBqb2Igd2hpY2ggYWxzbyB1c2UgdGhlIHN5c3RlbSBkZWZhdWx0IHdvcmtfcXVldWUKKyovCit2b2lkIHhlbl9wY2lia190ZXN0X2FuZF9zY2hlZHVsZV9vcChzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldikKK3sKKwkvKiBDaGVjayB0aGF0IGZyb250ZW5kIGlzIHJlcXVlc3RpbmcgYW4gb3BlcmF0aW9uIGFuZCB0aGF0IHdlIGFyZSBub3QKKwkgKiBhbHJlYWR5IHByb2Nlc3NpbmcgYSByZXF1ZXN0ICovCisJaWYgKHRlc3RfYml0KF9YRU5fUENJRl9hY3RpdmUsICh1bnNpZ25lZCBsb25nICopJnBkZXYtPnNoX2luZm8tPmZsYWdzKQorCSAgICAmJiAhdGVzdF9hbmRfc2V0X2JpdChfUERFVkZfb3BfYWN0aXZlLCAmcGRldi0+ZmxhZ3MpKSB7CisJCXF1ZXVlX3dvcmsoeGVuX3BjaWJrX3dxLCAmcGRldi0+b3Bfd29yayk7CisJfQorCS8qX1hFTl9QQ0lCX2FjdGl2ZSBzaG91bGQgaGF2ZSBiZWVuIGNsZWFyZWQgYnkgcGNpZnJvbnQuIEFuZCBhbHNvIG1ha2UKKwlzdXJlIHhlbl9wY2liayBpcyB3YWl0aW5nIGZvciBhY2sgYnkgY2hlY2tpbmcgX1BDSUJfb3BfcGVuZGluZyovCisJaWYgKCF0ZXN0X2JpdChfWEVOX1BDSUJfYWN0aXZlLCAodW5zaWduZWQgbG9uZyAqKSZwZGV2LT5zaF9pbmZvLT5mbGFncykKKwkgICAgJiYgdGVzdF9iaXQoX1BDSUJfb3BfcGVuZGluZywgJnBkZXYtPmZsYWdzKSkgeworCQl3YWtlX3VwKCZ4ZW5fcGNpYmtfYWVyX3dhaXRfcXVldWUpOworCX0KK30KKworLyogUGVyZm9ybWluZyB0aGUgY29uZmlndXJhdGlvbiBzcGFjZSByZWFkcy93cml0ZXMgbXVzdCBub3QgYmUgZG9uZSBpbiBhdG9taWMKKyAqIGNvbnRleHQgYmVjYXVzZSBzb21lIG9mIHRoZSBwY2lfKiBmdW5jdGlvbnMgY2FuIHNsZWVwIChtb3N0bHkgZHVlIHRvIEFDUEkKKyAqIHVzZSBvZiBzZW1hcGhvcmVzKS4gVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbSBhIHdvcmsKKyAqIHF1ZXVlIGluIHByb2Nlc3MgY29udGV4dCB0YWtpbmcgYSBzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSBhcyBhIHBhcmFtZXRlciAqLworCit2b2lkIHhlbl9wY2lia19kb19vcChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYgPQorCQljb250YWluZXJfb2YoZGF0YSwgc3RydWN0IHhlbl9wY2lia19kZXZpY2UsIG9wX3dvcmspOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJc3RydWN0IHhlbl9wY2lia19kZXZfZGF0YSAqZGV2X2RhdGEgPSBOVUxMOworCXN0cnVjdCB4ZW5fcGNpX29wICpvcCA9ICZwZGV2LT5zaF9pbmZvLT5vcDsKKwlpbnQgdGVzdF9pbnR4ID0gMDsKKworCWRldiA9IHhlbl9wY2lia19nZXRfcGNpX2RldihwZGV2LCBvcC0+ZG9tYWluLCBvcC0+YnVzLCBvcC0+ZGV2Zm4pOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlvcC0+ZXJyID0gWEVOX1BDSV9FUlJfZGV2X25vdF9mb3VuZDsKKwllbHNlIHsKKwkJZGV2X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwkJaWYgKGRldl9kYXRhKQorCQkJdGVzdF9pbnR4ID0gZGV2X2RhdGEtPmVuYWJsZV9pbnR4OworCQlzd2l0Y2ggKG9wLT5jbWQpIHsKKwkJY2FzZSBYRU5fUENJX09QX2NvbmZfcmVhZDoKKwkJCW9wLT5lcnIgPSB4ZW5fcGNpYmtfY29uZmlnX3JlYWQoZGV2LAorCQkJCSAgb3AtPm9mZnNldCwgb3AtPnNpemUsICZvcC0+dmFsdWUpOworCQkJYnJlYWs7CisJCWNhc2UgWEVOX1BDSV9PUF9jb25mX3dyaXRlOgorCQkJb3AtPmVyciA9IHhlbl9wY2lia19jb25maWdfd3JpdGUoZGV2LAorCQkJCSAgb3AtPm9mZnNldCwgb3AtPnNpemUsCW9wLT52YWx1ZSk7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCQljYXNlIFhFTl9QQ0lfT1BfZW5hYmxlX21zaToKKwkJCW9wLT5lcnIgPSB4ZW5fcGNpYmtfZW5hYmxlX21zaShwZGV2LCBkZXYsIG9wKTsKKwkJCWJyZWFrOworCQljYXNlIFhFTl9QQ0lfT1BfZGlzYWJsZV9tc2k6CisJCQlvcC0+ZXJyID0geGVuX3BjaWJrX2Rpc2FibGVfbXNpKHBkZXYsIGRldiwgb3ApOworCQkJYnJlYWs7CisJCWNhc2UgWEVOX1BDSV9PUF9lbmFibGVfbXNpeDoKKwkJCW9wLT5lcnIgPSB4ZW5fcGNpYmtfZW5hYmxlX21zaXgocGRldiwgZGV2LCBvcCk7CisJCQlicmVhazsKKwkJY2FzZSBYRU5fUENJX09QX2Rpc2FibGVfbXNpeDoKKwkJCW9wLT5lcnIgPSB4ZW5fcGNpYmtfZGlzYWJsZV9tc2l4KHBkZXYsIGRldiwgb3ApOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCW9wLT5lcnIgPSBYRU5fUENJX0VSUl9ub3RfaW1wbGVtZW50ZWQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIW9wLT5lcnIgJiYgZGV2ICYmIGRldl9kYXRhKSB7CisJCS8qIFRyYW5zaXRpb24gZGV0ZWN0ZWQgKi8KKwkJaWYgKChkZXZfZGF0YS0+ZW5hYmxlX2ludHggIT0gdGVzdF9pbnR4KSkKKwkJCXhlbl9wY2lia19jb250cm9sX2lzcihkZXYsIDAgLyogbm8gcmVzZXQgKi8pOworCX0KKwkvKiBUZWxsIHRoZSBkcml2ZXIgZG9tYWluIHRoYXQgd2UncmUgZG9uZS4gKi8KKwl3bWIoKTsKKwljbGVhcl9iaXQoX1hFTl9QQ0lGX2FjdGl2ZSwgKHVuc2lnbmVkIGxvbmcgKikmcGRldi0+c2hfaW5mby0+ZmxhZ3MpOworCW5vdGlmeV9yZW1vdGVfdmlhX2lycShwZGV2LT5ldnRjaG5faXJxKTsKKworCS8qIE1hcmsgdGhhdCB3ZSdyZSBkb25lLiAqLworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOyAvKiAvYWZ0ZXIvIGNsZWFyaW5nIFBDSUZfYWN0aXZlICovCisJY2xlYXJfYml0KF9QREVWRl9vcF9hY3RpdmUsICZwZGV2LT5mbGFncyk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsgLyogL2JlZm9yZS8gZmluYWwgY2hlY2sgZm9yIHdvcmsgKi8KKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZHJpdmVyIGRvbWFpbiB0cmllZCB0byBzdGFydCBhbm90aGVyIHJlcXVlc3QgaW4KKwkgKiBiZXR3ZWVuIGNsZWFyaW5nIF9YRU5fUENJRl9hY3RpdmUgYW5kIGNsZWFyaW5nIF9QREVWRl9vcF9hY3RpdmUuCisJKi8KKwl4ZW5fcGNpYmtfdGVzdF9hbmRfc2NoZWR1bGVfb3AocGRldik7Cit9CisKK2lycXJldHVybl90IHhlbl9wY2lia19oYW5kbGVfZXZlbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2ID0gZGV2X2lkOworCisJeGVuX3BjaWJrX3Rlc3RfYW5kX3NjaGVkdWxlX29wKHBkZXYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorc3RhdGljIGlycXJldHVybl90IHhlbl9wY2lia19ndWVzdF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSAoc3RydWN0IHBjaV9kZXYgKilkZXZfaWQ7CisJc3RydWN0IHhlbl9wY2lia19kZXZfZGF0YSAqZGV2X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChkZXZfZGF0YS0+aXNyX29uICYmIGRldl9kYXRhLT5hY2tfaW50cikgeworCQlkZXZfZGF0YS0+aGFuZGxlZCsrOworCQlpZiAoKGRldl9kYXRhLT5oYW5kbGVkICUgMTAwMCkgPT0gMCkgeworCQkJaWYgKHhlbl90ZXN0X2lycV9zaGFyZWQoaXJxKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzIElSUSBsaW5lIGlzIG5vdCBzaGFyZWQgIgorCQkJCQkid2l0aCBvdGhlciBkb21haW5zLiBUdXJuaW5nIElTUiBvZmZcbiIsCisJCQkJCSBkZXZfZGF0YS0+aXJxX25hbWUpOworCQkJCWRldl9kYXRhLT5hY2tfaW50ciA9IDA7CisJCQl9CisJCX0KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlyZXR1cm4gSVJRX05PTkU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay92cGNpLmMgYi9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay92cGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE0MmNmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3ZwY2kuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqIFBDSSBCYWNrZW5kIC0gUHJvdmlkZXMgYSBWaXJ0dWFsIFBDSSBidXMgKHdpdGggcmVhbCBkZXZpY2VzKQorICogICAgICAgICAgICAgICB0byB0aGUgZnJvbnRlbmQKKyAqCisgKiAgIEF1dGhvcjogUnlhbiBXaWxzb24gPGhhcDlAZXBvY2gubmNzYy5taWw+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJwY2liYWNrLmgiCisKKyNkZWZpbmUgUENJX1NMT1RfTUFYIDMyCisjZGVmaW5lIERSVl9OQU1FCSJ4ZW4tcGNpYmFjayIKKworc3RydWN0IHZwY2lfZGV2X2RhdGEgeworCS8qIEFjY2VzcyB0byBkZXZfbGlzdCBtdXN0IGJlIHByb3RlY3RlZCBieSBsb2NrICovCisJc3RydWN0IGxpc3RfaGVhZCBkZXZfbGlzdFtQQ0lfU0xPVF9NQVhdOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9maXJzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXJldHVybiBoZWFkLT5uZXh0OworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKl9feGVuX3BjaWJrX2dldF9wY2lfZGV2KHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2LAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRvbWFpbiwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBidXMsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGV2Zm4pCit7CisJc3RydWN0IHBjaV9kZXZfZW50cnkgKmVudHJ5OworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXN0cnVjdCB2cGNpX2Rldl9kYXRhICp2cGNpX2RldiA9IHBkZXYtPnBjaV9kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRvbWFpbiAhPSAwIHx8IGJ1cyAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChQQ0lfU0xPVChkZXZmbikgPCBQQ0lfU0xPVF9NQVgpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZwY2lfZGV2LT5sb2NrLCBmbGFncyk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwKKwkJCQkgICAgJnZwY2lfZGV2LT5kZXZfbGlzdFtQQ0lfU0xPVChkZXZmbildLAorCQkJCSAgICBsaXN0KSB7CisJCQlpZiAoUENJX0ZVTkMoZW50cnktPmRldi0+ZGV2Zm4pID09IFBDSV9GVU5DKGRldmZuKSkgeworCQkJCWRldiA9IGVudHJ5LT5kZXY7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cGNpX2Rldi0+bG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgaW5saW5lIGludCBtYXRjaF9zbG90KHN0cnVjdCBwY2lfZGV2ICpsLCBzdHJ1Y3QgcGNpX2RldiAqcikKK3sKKwlpZiAocGNpX2RvbWFpbl9ucihsLT5idXMpID09IHBjaV9kb21haW5fbnIoci0+YnVzKQorCSAgICAmJiBsLT5idXMgPT0gci0+YnVzICYmIFBDSV9TTE9UKGwtPmRldmZuKSA9PSBQQ0lfU0xPVChyLT5kZXZmbikpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX194ZW5fcGNpYmtfYWRkX3BjaV9kZXYoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsCisJCQkJICAgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGRldmlkLAorCQkJCSAgIHB1Ymxpc2hfcGNpX2Rldl9jYiBwdWJsaXNoX2NiKQoreworCWludCBlcnIgPSAwLCBzbG90LCBmdW5jID0gLTE7CisJc3RydWN0IHBjaV9kZXZfZW50cnkgKnQsICpkZXZfZW50cnk7CisJc3RydWN0IHZwY2lfZGV2X2RhdGEgKnZwY2lfZGV2ID0gcGRldi0+cGNpX2Rldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKGRldi0+Y2xhc3MgPj4gMjQpID09IFBDSV9CQVNFX0NMQVNTX0JSSURHRSkgeworCQllcnIgPSAtRUZBVUxUOworCQl4ZW5idXNfZGV2X2ZhdGFsKHBkZXYtPnhkZXYsIGVyciwKKwkJCQkgIkNhbid0IGV4cG9ydCBicmlkZ2VzIG9uIHRoZSB2aXJ0dWFsIFBDSSBidXMiKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2X2VudHJ5ID0ga21hbGxvYyhzaXplb2YoKmRldl9lbnRyeSksIEdGUF9LRVJORUwpOworCWlmICghZGV2X2VudHJ5KSB7CisJCWVyciA9IC1FTk9NRU07CisJCXhlbmJ1c19kZXZfZmF0YWwocGRldi0+eGRldiwgZXJyLAorCQkJCSAiRXJyb3IgYWRkaW5nIGVudHJ5IHRvIHZpcnR1YWwgUENJIGJ1cyIpOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXZfZW50cnktPmRldiA9IGRldjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cGNpX2Rldi0+bG9jaywgZmxhZ3MpOworCisJLyogS2VlcCBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzIHRvZ2V0aGVyIG9uIHRoZSB2aXJ0dWFsIFBDSSBidXMgKi8KKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgUENJX1NMT1RfTUFYOyBzbG90KyspIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZ2cGNpX2Rldi0+ZGV2X2xpc3Rbc2xvdF0pKSB7CisJCQl0ID0gbGlzdF9lbnRyeShsaXN0X2ZpcnN0KCZ2cGNpX2Rldi0+ZGV2X2xpc3Rbc2xvdF0pLAorCQkJCSAgICAgICBzdHJ1Y3QgcGNpX2Rldl9lbnRyeSwgbGlzdCk7CisKKwkJCWlmIChtYXRjaF9zbG90KGRldiwgdC0+ZGV2KSkgeworCQkJCXByX2luZm8oRFJWX05BTUUgIjogdnBjaTogJXM6ICIKKwkJCQkJImFzc2lnbiB0byB2aXJ0dWFsIHNsb3QgJWQgZnVuYyAlZFxuIiwKKwkJCQkJcGNpX25hbWUoZGV2KSwgc2xvdCwKKwkJCQkJUENJX0ZVTkMoZGV2LT5kZXZmbikpOworCQkJCWxpc3RfYWRkX3RhaWwoJmRldl9lbnRyeS0+bGlzdCwKKwkJCQkJICAgICAgJnZwY2lfZGV2LT5kZXZfbGlzdFtzbG90XSk7CisJCQkJZnVuYyA9IFBDSV9GVU5DKGRldi0+ZGV2Zm4pOworCQkJCWdvdG8gdW5sb2NrOworCQkJfQorCQl9CisJfQorCisJLyogQXNzaWduIHRvIGEgbmV3IHNsb3Qgb24gdGhlIHZpcnR1YWwgUENJIGJ1cyAqLworCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBQQ0lfU0xPVF9NQVg7IHNsb3QrKykgeworCQlpZiAobGlzdF9lbXB0eSgmdnBjaV9kZXYtPmRldl9saXN0W3Nsb3RdKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJICAgICAgICI6IHZwY2k6ICVzOiBhc3NpZ24gdG8gdmlydHVhbCBzbG90ICVkXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKGRldiksIHNsb3QpOworCQkJbGlzdF9hZGRfdGFpbCgmZGV2X2VudHJ5LT5saXN0LAorCQkJCSAgICAgICZ2cGNpX2Rldi0+ZGV2X2xpc3Rbc2xvdF0pOworCQkJZnVuYyA9IFBDSV9GVU5DKGRldi0+ZGV2Zm4pOworCQkJZ290byB1bmxvY2s7CisJCX0KKwl9CisKKwllcnIgPSAtRU5PTUVNOworCXhlbmJ1c19kZXZfZmF0YWwocGRldi0+eGRldiwgZXJyLAorCQkJICJObyBtb3JlIHNwYWNlIG9uIHJvb3QgdmlydHVhbCBQQ0kgYnVzIik7CisKK3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cGNpX2Rldi0+bG9jaywgZmxhZ3MpOworCisJLyogUHVibGlzaCB0aGlzIGRldmljZS4gKi8KKwlpZiAoIWVycikKKwkJZXJyID0gcHVibGlzaF9jYihwZGV2LCAwLCAwLCBQQ0lfREVWRk4oc2xvdCwgZnVuYyksIGRldmlkKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9feGVuX3BjaWJrX3JlbGVhc2VfcGNpX2RldihzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCQkJc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgc2xvdDsKKwlzdHJ1Y3QgdnBjaV9kZXZfZGF0YSAqdnBjaV9kZXYgPSBwZGV2LT5wY2lfZGV2X2RhdGE7CisJc3RydWN0IHBjaV9kZXYgKmZvdW5kX2RldiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cGNpX2Rldi0+bG9jaywgZmxhZ3MpOworCisJZm9yIChzbG90ID0gMDsgc2xvdCA8IFBDSV9TTE9UX01BWDsgc2xvdCsrKSB7CisJCXN0cnVjdCBwY2lfZGV2X2VudHJ5ICplLCAqdG1wOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgdG1wLCAmdnBjaV9kZXYtPmRldl9saXN0W3Nsb3RdLAorCQkJCQkgbGlzdCkgeworCQkJaWYgKGUtPmRldiA9PSBkZXYpIHsKKwkJCQlsaXN0X2RlbCgmZS0+bGlzdCk7CisJCQkJZm91bmRfZGV2ID0gZS0+ZGV2OworCQkJCWtmcmVlKGUpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBjaV9kZXYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChmb3VuZF9kZXYpCisJCXBjaXN0dWJfcHV0X3BjaV9kZXYoZm91bmRfZGV2KTsKK30KKworc3RhdGljIGludCBfX3hlbl9wY2lia19pbml0X2RldmljZXMoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYpCit7CisJaW50IHNsb3Q7CisJc3RydWN0IHZwY2lfZGV2X2RhdGEgKnZwY2lfZGV2OworCisJdnBjaV9kZXYgPSBrbWFsbG9jKHNpemVvZigqdnBjaV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZwY2lfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZ2cGNpX2Rldi0+bG9jayk7CisKKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgUENJX1NMT1RfTUFYOyBzbG90KyspCisJCUlOSVRfTElTVF9IRUFEKCZ2cGNpX2Rldi0+ZGV2X2xpc3Rbc2xvdF0pOworCisJcGRldi0+cGNpX2Rldl9kYXRhID0gdnBjaV9kZXY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX3hlbl9wY2lia19wdWJsaXNoX3BjaV9yb290cyhzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCQkJIHB1Ymxpc2hfcGNpX3Jvb3RfY2IgcHVibGlzaF9jYikKK3sKKwkvKiBUaGUgVmlydHVhbCBQQ0kgYnVzIGhhcyBvbmx5IG9uZSByb290ICovCisJcmV0dXJuIHB1Ymxpc2hfY2IocGRldiwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9feGVuX3BjaWJrX3JlbGVhc2VfZGV2aWNlcyhzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldikKK3sKKwlpbnQgc2xvdDsKKwlzdHJ1Y3QgdnBjaV9kZXZfZGF0YSAqdnBjaV9kZXYgPSBwZGV2LT5wY2lfZGV2X2RhdGE7CisKKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgUENJX1NMT1RfTUFYOyBzbG90KyspIHsKKwkJc3RydWN0IHBjaV9kZXZfZW50cnkgKmUsICp0bXA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCB0bXAsICZ2cGNpX2Rldi0+ZGV2X2xpc3Rbc2xvdF0sCisJCQkJCSBsaXN0KSB7CisJCQlsaXN0X2RlbCgmZS0+bGlzdCk7CisJCQlwY2lzdHViX3B1dF9wY2lfZGV2KGUtPmRldik7CisJCQlrZnJlZShlKTsKKwkJfQorCX0KKworCWtmcmVlKHZwY2lfZGV2KTsKKwlwZGV2LT5wY2lfZGV2X2RhdGEgPSBOVUxMOworfQorCitzdGF0aWMgaW50IF9feGVuX3BjaWJrX2dldF9wY2lmcm9udF9kZXYoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKKwkJCQkJc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsCisJCQkJCXVuc2lnbmVkIGludCAqZG9tYWluLCB1bnNpZ25lZCBpbnQgKmJ1cywKKwkJCQkJdW5zaWduZWQgaW50ICpkZXZmbikKK3sKKwlzdHJ1Y3QgcGNpX2Rldl9lbnRyeSAqZW50cnk7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJc3RydWN0IHZwY2lfZGV2X2RhdGEgKnZwY2lfZGV2ID0gcGRldi0+cGNpX2Rldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGZvdW5kID0gMCwgc2xvdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cGNpX2Rldi0+bG9jaywgZmxhZ3MpOworCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBQQ0lfU0xPVF9NQVg7IHNsb3QrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LAorCQkJICAgICZ2cGNpX2Rldi0+ZGV2X2xpc3Rbc2xvdF0sCisJCQkgICAgbGlzdCkgeworCQkJZGV2ID0gZW50cnktPmRldjsKKwkJCWlmIChkZXYgJiYgZGV2LT5idXMtPm51bWJlciA9PSBwY2lkZXYtPmJ1cy0+bnVtYmVyCisJCQkJJiYgcGNpX2RvbWFpbl9ucihkZXYtPmJ1cykgPT0KKwkJCQkJcGNpX2RvbWFpbl9ucihwY2lkZXYtPmJ1cykKKwkJCQkmJiBkZXYtPmRldmZuID09IHBjaWRldi0+ZGV2Zm4pIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJKmRvbWFpbiA9IDA7CisJCQkJKmJ1cyA9IDA7CisJCQkJKmRldmZuID0gUENJX0RFVkZOKHNsb3QsCisJCQkJCSBQQ0lfRlVOQyhwY2lkZXYtPmRldmZuKSk7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBjaV9kZXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0cnVjdCB4ZW5fcGNpYmtfYmFja2VuZCB4ZW5fcGNpYmtfdnBjaV9iYWNrZW5kID0geworCS5uYW1lCQk9ICJ2cGNpIiwKKwkuaW5pdAkJPSBfX3hlbl9wY2lia19pbml0X2RldmljZXMsCisJLmZyZWUJCT0gX194ZW5fcGNpYmtfcmVsZWFzZV9kZXZpY2VzLAorCS5maW5kCQk9IF9feGVuX3BjaWJrX2dldF9wY2lmcm9udF9kZXYsCisJLnB1Ymxpc2gJPSBfX3hlbl9wY2lia19wdWJsaXNoX3BjaV9yb290cywKKwkucmVsZWFzZQk9IF9feGVuX3BjaWJrX3JlbGVhc2VfcGNpX2RldiwKKwkuYWRkCQk9IF9feGVuX3BjaWJrX2FkZF9wY2lfZGV2LAorCS5nZXQJCT0gX194ZW5fcGNpYmtfZ2V0X3BjaV9kZXYsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuLXBjaWJhY2sveGVuYnVzLmMgYi9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay94ZW5idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDZjNGNlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3hlbmJ1cy5jCkBAIC0wLDAgKzEsNzQ5IEBACisvKgorICogUENJIEJhY2tlbmQgWGVuYnVzIFNldHVwIC0gaGFuZGxlcyBzZXR1cCB3aXRoIGZyb250ZW5kIGFuZCB4ZW5kCisgKgorICogICBBdXRob3I6IFJ5YW4gV2lsc29uIDxoYXA5QGVwb2NoLm5jc2MubWlsPgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgorI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KKyNpbmNsdWRlIDxhc20veGVuL3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgInBjaWJhY2suaCIKKworI2RlZmluZQlEUlZfTkFNRQkieGVuLXBjaWJhY2siCisjZGVmaW5lIElOVkFMSURfRVZUQ0hOX0lSUSAgKC0xKQorc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnhlbl9wY2lia193cTsKKworc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IHBhc3N0aHJvdWdoOworbW9kdWxlX3BhcmFtKHBhc3N0aHJvdWdoLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocGFzc3Rocm91Z2gsCisJIk9wdGlvbiB0byBzcGVjaWZ5IGhvdyB0byBleHBvcnQgUENJIHRvcG9sb2d5IHRvIGd1ZXN0OlxuIlwKKwkiIDAgLSAoZGVmYXVsdCkgSGlkZSB0aGUgdHJ1ZSBQQ0kgdG9wb2xvZ3kgYW5kIG1ha2VzIHRoZSBmcm9udGVuZFxuIlwKKwkiICAgdGhlcmUgaXMgYSBzaW5nbGUgUENJIGJ1cyB3aXRoIG9ubHkgdGhlIGV4cG9ydGVkIGRldmljZXMgb24gaXQuXG4iXAorCSIgICBGb3IgZXhhbXBsZSwgYSBkZXZpY2UgYXQgMDM6MDUuMCB3aWxsIGJlIHJlLWFzc2lnbmVkIHRvIDAwOjAwLjBcbiJcCisJIiAgIHdoaWxlIHNlY29uZCBkZXZpY2UgYXQgMDI6MWEuMSB3aWxsIGJlIHJlLWFzc2lnbmVkIHRvIDAwOjAxLjEuXG4iXAorCSIgMSAtIFBhc3N0aHJvdWdoIHByb3ZpZGVzIGEgcmVhbCB2aWV3IG9mIHRoZSBQQ0kgdG9wb2xvZ3kgdG8gdGhlXG4iXAorCSIgICBmcm9udGVuZCAoZm9yIGV4YW1wbGUsIGEgZGV2aWNlIGF0IDA2OjAxLmIgd2lsbCBzdGlsbCBhcHBlYXIgYXRcbiJcCisJIiAgIDA2OjAxLmIgdG8gdGhlIGZyb250ZW5kKS4gVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBYZW4gMi4wLnhcbiJcCisJIiAgIGV4cG9zZWQgUENJIGRldmljZXMgdG8gaXRzIGRyaXZlciBkb21haW5zLiBUaGlzIG1heSBiZSByZXF1aXJlZFxuIlwKKwkiICAgZm9yIGRyaXZlcnMgd2hpY2ggZGVwZW5kIG9uIGZpbmRpbmcgdGhlaXIgaGFyZHdhcmQgaW4gY2VydGFpblxuIlwKKwkiICAgYnVzL3Nsb3QgbG9jYXRpb25zLiIpOworCitzdGF0aWMgc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKmFsbG9jX3BkZXYoc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhkZXYpCit7CisJc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXY7CisKKwlwZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHhlbl9wY2lia19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAocGRldiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlkZXZfZGJnKCZ4ZGV2LT5kZXYsICJhbGxvY2F0ZWQgcGRldiBAIDB4JXBcbiIsIHBkZXYpOworCisJcGRldi0+eGRldiA9IHhkZXY7CisJZGV2X3NldF9kcnZkYXRhKCZ4ZGV2LT5kZXYsIHBkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJnBkZXYtPmRldl9sb2NrKTsKKworCXBkZXYtPnNoX2luZm8gPSBOVUxMOworCXBkZXYtPmV2dGNobl9pcnEgPSBJTlZBTElEX0VWVENITl9JUlE7CisJcGRldi0+YmVfd2F0Y2hpbmcgPSAwOworCisJSU5JVF9XT1JLKCZwZGV2LT5vcF93b3JrLCB4ZW5fcGNpYmtfZG9fb3ApOworCisJaWYgKHhlbl9wY2lia19pbml0X2RldmljZXMocGRldikpIHsKKwkJa2ZyZWUocGRldik7CisJCXBkZXYgPSBOVUxMOworCX0KK291dDoKKwlyZXR1cm4gcGRldjsKK30KKworc3RhdGljIHZvaWQgeGVuX3BjaWJrX2Rpc2Nvbm5lY3Qoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYpCit7CisJc3Bpbl9sb2NrKCZwZGV2LT5kZXZfbG9jayk7CisKKwkvKiBFbnN1cmUgdGhlIGd1ZXN0IGNhbid0IHRyaWdnZXIgb3VyIGhhbmRsZXIgYmVmb3JlIHJlbW92aW5nIGRldmljZXMgKi8KKwlpZiAocGRldi0+ZXZ0Y2huX2lycSAhPSBJTlZBTElEX0VWVENITl9JUlEpIHsKKwkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZGV2LT5ldnRjaG5faXJxLCBwZGV2KTsKKwkJcGRldi0+ZXZ0Y2huX2lycSA9IElOVkFMSURfRVZUQ0hOX0lSUTsKKwl9CisJc3Bpbl91bmxvY2soJnBkZXYtPmRldl9sb2NrKTsKKworCS8qIElmIHRoZSBkcml2ZXIgZG9tYWluIHN0YXJ0ZWQgYW4gb3AsIG1ha2Ugc3VyZSB3ZSBjb21wbGV0ZSBpdAorCSAqIGJlZm9yZSByZWxlYXNpbmcgdGhlIHNoYXJlZCBtZW1vcnkgKi8KKworCS8qIE5vdGUsIHRoZSB3b3JrcXVldWUgZG9lcyBub3QgdXNlIHNwaW5sb2NrcyBhdCBhbGwuKi8KKwlmbHVzaF93b3JrcXVldWUoeGVuX3BjaWJrX3dxKTsKKworCXNwaW5fbG9jaygmcGRldi0+ZGV2X2xvY2spOworCWlmIChwZGV2LT5zaF9pbmZvICE9IE5VTEwpIHsKKwkJeGVuYnVzX3VubWFwX3JpbmdfdmZyZWUocGRldi0+eGRldiwgcGRldi0+c2hfaW5mbyk7CisJCXBkZXYtPnNoX2luZm8gPSBOVUxMOworCX0KKwlzcGluX3VubG9jaygmcGRldi0+ZGV2X2xvY2spOworCit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGRldihzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldikKK3sKKwlpZiAocGRldi0+YmVfd2F0Y2hpbmcpIHsKKwkJdW5yZWdpc3Rlcl94ZW5idXNfd2F0Y2goJnBkZXYtPmJlX3dhdGNoKTsKKwkJcGRldi0+YmVfd2F0Y2hpbmcgPSAwOworCX0KKworCXhlbl9wY2lia19kaXNjb25uZWN0KHBkZXYpOworCisJeGVuX3BjaWJrX3JlbGVhc2VfZGV2aWNlcyhwZGV2KTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+eGRldi0+ZGV2LCBOVUxMKTsKKwlwZGV2LT54ZGV2ID0gTlVMTDsKKworCWtmcmVlKHBkZXYpOworfQorCitzdGF0aWMgaW50IHhlbl9wY2lia19kb19hdHRhY2goc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsIGludCBnbnRfcmVmLAorCQkJICAgICBpbnQgcmVtb3RlX2V2dGNobikKK3sKKwlpbnQgZXJyID0gMDsKKwl2b2lkICp2YWRkcjsKKworCWRldl9kYmcoJnBkZXYtPnhkZXYtPmRldiwKKwkJIkF0dGFjaGluZyB0byBmcm9udGVuZCByZXNvdXJjZXMgLSBnbnRfcmVmPSVkIGV2dGNobj0lZFxuIiwKKwkJZ250X3JlZiwgcmVtb3RlX2V2dGNobik7CisKKwllcnIgPSB4ZW5idXNfbWFwX3JpbmdfdmFsbG9jKHBkZXYtPnhkZXYsIGdudF9yZWYsICZ2YWRkcik7CisJaWYgKGVyciA8IDApIHsKKwkJeGVuYnVzX2Rldl9mYXRhbChwZGV2LT54ZGV2LCBlcnIsCisJCQkJIkVycm9yIG1hcHBpbmcgb3RoZXIgZG9tYWluIHBhZ2UgaW4gb3Vycy4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrKCZwZGV2LT5kZXZfbG9jayk7CisJcGRldi0+c2hfaW5mbyA9IHZhZGRyOworCXNwaW5fdW5sb2NrKCZwZGV2LT5kZXZfbG9jayk7CisKKwllcnIgPSBiaW5kX2ludGVyZG9tYWluX2V2dGNobl90b19pcnFoYW5kbGVyKAorCQlwZGV2LT54ZGV2LT5vdGhlcmVuZF9pZCwgcmVtb3RlX2V2dGNobiwgeGVuX3BjaWJrX2hhbmRsZV9ldmVudCwKKwkJMCwgRFJWX05BTUUsIHBkZXYpOworCWlmIChlcnIgPCAwKSB7CisJCXhlbmJ1c19kZXZfZmF0YWwocGRldi0+eGRldiwgZXJyLAorCQkJCSAiRXJyb3IgYmluZGluZyBldmVudCBjaGFubmVsIHRvIElSUSIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2soJnBkZXYtPmRldl9sb2NrKTsKKwlwZGV2LT5ldnRjaG5faXJxID0gZXJyOworCXNwaW5fdW5sb2NrKCZwZGV2LT5kZXZfbG9jayk7CisJZXJyID0gMDsKKworCWRldl9kYmcoJnBkZXYtPnhkZXYtPmRldiwgIkF0dGFjaGVkIVxuIik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB4ZW5fcGNpYmtfYXR0YWNoKHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2KQoreworCWludCBlcnIgPSAwOworCWludCBnbnRfcmVmLCByZW1vdGVfZXZ0Y2huOworCWNoYXIgKm1hZ2ljID0gTlVMTDsKKworCisJLyogTWFrZSBzdXJlIHdlIG9ubHkgZG8gdGhpcyBzZXR1cCBvbmNlICovCisJaWYgKHhlbmJ1c19yZWFkX2RyaXZlcl9zdGF0ZShwZGV2LT54ZGV2LT5ub2RlbmFtZSkgIT0KKwkgICAgWGVuYnVzU3RhdGVJbml0aWFsaXNlZCkKKwkJZ290byBvdXQ7CisKKwkvKiBXYWl0IGZvciBmcm9udGVuZCB0byBzdGF0ZSB0aGF0IGl0IGhhcyBwdWJsaXNoZWQgdGhlIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoeGVuYnVzX3JlYWRfZHJpdmVyX3N0YXRlKHBkZXYtPnhkZXYtPm90aGVyZW5kKSAhPQorCSAgICBYZW5idXNTdGF0ZUluaXRpYWxpc2VkKQorCQlnb3RvIG91dDsKKworCWRldl9kYmcoJnBkZXYtPnhkZXYtPmRldiwgIlJlYWRpbmcgZnJvbnRlbmQgY29uZmlnXG4iKTsKKworCWVyciA9IHhlbmJ1c19nYXRoZXIoWEJUX05JTCwgcGRldi0+eGRldi0+b3RoZXJlbmQsCisJCQkgICAgInBjaS1vcC1yZWYiLCAiJXUiLCAmZ250X3JlZiwKKwkJCSAgICAiZXZlbnQtY2hhbm5lbCIsICIldSIsICZyZW1vdGVfZXZ0Y2huLAorCQkJICAgICJtYWdpYyIsIE5VTEwsICZtYWdpYywgTlVMTCk7CisJaWYgKGVycikgeworCQkvKiBJZiBjb25maWd1cmF0aW9uIGRpZG4ndCBnZXQgcmVhZCBjb3JyZWN0bHksIHdhaXQgbG9uZ2VyICovCisJCXhlbmJ1c19kZXZfZmF0YWwocGRldi0+eGRldiwgZXJyLAorCQkJCSAiRXJyb3IgcmVhZGluZyBjb25maWd1cmF0aW9uIGZyb20gZnJvbnRlbmQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG1hZ2ljID09IE5VTEwgfHwgc3RyY21wKG1hZ2ljLCBYRU5fUENJX01BR0lDKSAhPSAwKSB7CisJCXhlbmJ1c19kZXZfZmF0YWwocGRldi0+eGRldiwgLUVGQVVMVCwKKwkJCQkgInZlcnNpb24gbWlzbWF0Y2ggKCVzLyVzKSB3aXRoIHBjaWZyb250IC0gIgorCQkJCSAiaGFsdGluZyB4ZW5fcGNpYmsiLAorCQkJCSBtYWdpYywgWEVOX1BDSV9NQUdJQyk7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHhlbl9wY2lia19kb19hdHRhY2gocGRldiwgZ250X3JlZiwgcmVtb3RlX2V2dGNobik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlkZXZfZGJnKCZwZGV2LT54ZGV2LT5kZXYsICJDb25uZWN0aW5nLi4uXG4iKTsKKworCWVyciA9IHhlbmJ1c19zd2l0Y2hfc3RhdGUocGRldi0+eGRldiwgWGVuYnVzU3RhdGVDb25uZWN0ZWQpOworCWlmIChlcnIpCisJCXhlbmJ1c19kZXZfZmF0YWwocGRldi0+eGRldiwgZXJyLAorCQkJCSAiRXJyb3Igc3dpdGNoaW5nIHRvIGNvbm5lY3RlZCBzdGF0ZSEiKTsKKworCWRldl9kYmcoJnBkZXYtPnhkZXYtPmRldiwgIkNvbm5lY3RlZD8gJWRcbiIsIGVycik7CitvdXQ6CisKKwlrZnJlZShtYWdpYyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHhlbl9wY2lia19wdWJsaXNoX3BjaV9kZXYoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsCisJCQkJICAgdW5zaWduZWQgaW50IGRvbWFpbiwgdW5zaWduZWQgaW50IGJ1cywKKwkJCQkgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIHVuc2lnbmVkIGludCBkZXZpZCkKK3sKKwlpbnQgZXJyOworCWludCBsZW47CisJY2hhciBzdHJbNjRdOworCisJbGVuID0gc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgInZkZXYtJWQiLCBkZXZpZCk7CisJaWYgKHVubGlrZWx5KGxlbiA+PSAoc2l6ZW9mKHN0cikgLSAxKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0geGVuYnVzX3ByaW50ZihYQlRfTklMLCBwZGV2LT54ZGV2LT5ub2RlbmFtZSwgc3RyLAorCQkJICAgICIlMDR4OiUwMng6JTAyeC4lMDJ4IiwgZG9tYWluLCBidXMsCisJCQkgICAgUENJX1NMT1QoZGV2Zm4pLCBQQ0lfRlVOQyhkZXZmbikpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB4ZW5fcGNpYmtfZXhwb3J0X2RldmljZShzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldiwKKwkJCQkgaW50IGRvbWFpbiwgaW50IGJ1cywgaW50IHNsb3QsIGludCBmdW5jLAorCQkJCSBpbnQgZGV2aWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgZXJyID0gMDsKKworCWRldl9kYmcoJnBkZXYtPnhkZXYtPmRldiwgImV4cG9ydGluZyBkb20gJXggYnVzICV4IHNsb3QgJXggZnVuYyAleFxuIiwKKwkJZG9tYWluLCBidXMsIHNsb3QsIGZ1bmMpOworCisJZGV2ID0gcGNpc3R1Yl9nZXRfcGNpX2Rldl9ieV9zbG90KHBkZXYsIGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jKTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRUlOVkFMOworCQl4ZW5idXNfZGV2X2ZhdGFsKHBkZXYtPnhkZXYsIGVyciwKKwkJCQkgIkNvdWxkbid0IGxvY2F0ZSBQQ0kgZGV2aWNlICIKKwkJCQkgIiglMDR4OiUwMng6JTAyeC4lMDF4KSEgIgorCQkJCSAicGVyaGFwcyBhbHJlYWR5IGluLXVzZT8iLAorCQkJCSBkb21haW4sIGJ1cywgc2xvdCwgZnVuYyk7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHhlbl9wY2lia19hZGRfcGNpX2RldihwZGV2LCBkZXYsIGRldmlkLAorCQkJCSAgICB4ZW5fcGNpYmtfcHVibGlzaF9wY2lfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWRldl9kYmcoJmRldi0+ZGV2LCAicmVnaXN0ZXJpbmcgZm9yICVkXG4iLCBwZGV2LT54ZGV2LT5vdGhlcmVuZF9pZCk7CisJaWYgKHhlbl9yZWdpc3Rlcl9kZXZpY2VfZG9tYWluX293bmVyKGRldiwKKwkJCQkJICAgICBwZGV2LT54ZGV2LT5vdGhlcmVuZF9pZCkgIT0gMCkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBhbm90aGVyICIgXAorCQkJImRvbWFpbiEgT3Zlci13cml0dGluZyB0aGUgb3duZXJzaGlwLCBidXQgYmV3YXJlLlxuIik7CisJCXhlbl91bnJlZ2lzdGVyX2RldmljZV9kb21haW5fb3duZXIoZGV2KTsKKwkJeGVuX3JlZ2lzdGVyX2RldmljZV9kb21haW5fb3duZXIoZGV2LCBwZGV2LT54ZGV2LT5vdGhlcmVuZF9pZCk7CisJfQorCisJLyogVE9ETzogSXQnZCBiZSBuaWNlIHRvIGV4cG9ydCBhIGJyaWRnZSBhbmQgaGF2ZSBhbGwgb2YgaXRzIGNoaWxkcmVuCisJICogZ2V0IGV4cG9ydGVkIHdpdGggaXQuIFRoaXMgbWF5IGJlIGJlc3QgZG9uZSBpbiB4ZW5kICh3aGljaCB3aWxsCisJICogaGF2ZSB0byBjYWxjdWxhdGUgcmVzb3VyY2UgdXNhZ2UgYW55d2F5KSBidXQgd2UgcHJvYmFibHkgd2FudCB0bworCSAqIHB1dCBzb21ldGhpbmcgaW4gaGVyZSB0byBlbnN1cmUgdGhhdCBpZiBhIGJyaWRnZSBnZXRzIGdpdmVuIHRvIGEKKwkgKiBkcml2ZXIgZG9tYWluLCB0aGF0IGFsbCBkZXZpY2VzIHVuZGVyIHRoYXQgYnJpZGdlIGFyZSBub3QgZ2l2ZW4KKwkgKiB0byBvdGhlciBkcml2ZXIgZG9tYWlucyAoYXMgaGUgd2hvIGNvbnRyb2xzIHRoZSBicmlkZ2UgY2FuIGRpc2FibGUKKwkgKiBpdCBhbmQgc3RvcCB0aGUgb3RoZXIgZGV2aWNlcyBmcm9tIHdvcmtpbmcpLgorCSAqLworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgeGVuX3BjaWJrX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYsCisJCQkJIGludCBkb21haW4sIGludCBidXMsIGludCBzbG90LCBpbnQgZnVuYykKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCisJZGV2X2RiZygmcGRldi0+eGRldi0+ZGV2LCAicmVtb3ZpbmcgZG9tICV4IGJ1cyAleCBzbG90ICV4IGZ1bmMgJXhcbiIsCisJCWRvbWFpbiwgYnVzLCBzbG90LCBmdW5jKTsKKworCWRldiA9IHhlbl9wY2lia19nZXRfcGNpX2RldihwZGV2LCBkb21haW4sIGJ1cywgUENJX0RFVkZOKHNsb3QsIGZ1bmMpKTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRUlOVkFMOworCQlkZXZfZGJnKCZwZGV2LT54ZGV2LT5kZXYsICJDb3VsZG4ndCBsb2NhdGUgUENJIGRldmljZSAiCisJCQkiKCUwNHg6JTAyeDolMDJ4LiUwMXgpISBub3Qgb3duZWQgYnkgdGhpcyBkb21haW5cbiIsCisJCQlkb21haW4sIGJ1cywgc2xvdCwgZnVuYyk7CisJCWdvdG8gb3V0OworCX0KKworCWRldl9kYmcoJmRldi0+ZGV2LCAidW5yZWdpc3RlcmluZyBmb3IgJWRcbiIsIHBkZXYtPnhkZXYtPm90aGVyZW5kX2lkKTsKKwl4ZW5fdW5yZWdpc3Rlcl9kZXZpY2VfZG9tYWluX293bmVyKGRldik7CisKKwl4ZW5fcGNpYmtfcmVsZWFzZV9wY2lfZGV2KHBkZXYsIGRldik7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHhlbl9wY2lia19wdWJsaXNoX3BjaV9yb290KHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZG9tYWluLCB1bnNpZ25lZCBpbnQgYnVzKQoreworCXVuc2lnbmVkIGludCBkLCBiOworCWludCBpLCByb290X251bSwgbGVuLCBlcnI7CisJY2hhciBzdHJbNjRdOworCisJZGV2X2RiZygmcGRldi0+eGRldi0+ZGV2LCAiUHVibGlzaGluZyBwY2kgcm9vdHNcbiIpOworCisJZXJyID0geGVuYnVzX3NjYW5mKFhCVF9OSUwsIHBkZXYtPnhkZXYtPm5vZGVuYW1lLAorCQkJICAgInJvb3RfbnVtIiwgIiVkIiwgJnJvb3RfbnVtKTsKKwlpZiAoZXJyID09IDAgfHwgZXJyID09IC1FTk9FTlQpCisJCXJvb3RfbnVtID0gMDsKKwllbHNlIGlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIFZlcmlmeSB0aGF0IHdlIGhhdmVuJ3QgYWxyZWFkeSBwdWJsaXNoZWQgdGhpcyBwY2kgcm9vdCAqLworCWZvciAoaSA9IDA7IGkgPCByb290X251bTsgaSsrKSB7CisJCWxlbiA9IHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICJyb290LSVkIiwgaSk7CisJCWlmICh1bmxpa2VseShsZW4gPj0gKHNpemVvZihzdHIpIC0gMSkpKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQllcnIgPSB4ZW5idXNfc2NhbmYoWEJUX05JTCwgcGRldi0+eGRldi0+bm9kZW5hbWUsCisJCQkJICAgc3RyLCAiJXg6JXgiLCAmZCwgJmIpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0OworCQlpZiAoZXJyICE9IDIpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChkID09IGRvbWFpbiAmJiBiID09IGJ1cykgeworCQkJZXJyID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJbGVuID0gc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgInJvb3QtJWQiLCByb290X251bSk7CisJaWYgKHVubGlrZWx5KGxlbiA+PSAoc2l6ZW9mKHN0cikgLSAxKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2X2RiZygmcGRldi0+eGRldi0+ZGV2LCAid3JpdGluZyByb290ICVkIGF0ICUwNHg6JTAyeFxuIiwKKwkJcm9vdF9udW0sIGRvbWFpbiwgYnVzKTsKKworCWVyciA9IHhlbmJ1c19wcmludGYoWEJUX05JTCwgcGRldi0+eGRldi0+bm9kZW5hbWUsIHN0ciwKKwkJCSAgICAiJTA0eDolMDJ4IiwgZG9tYWluLCBidXMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0geGVuYnVzX3ByaW50ZihYQlRfTklMLCBwZGV2LT54ZGV2LT5ub2RlbmFtZSwKKwkJCSAgICAicm9vdF9udW0iLCAiJWQiLCAocm9vdF9udW0gKyAxKSk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHhlbl9wY2lia19yZWNvbmZpZ3VyZShzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldikKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgbnVtX2RldnM7CisJaW50IGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jOworCWludCBzdWJzdGF0ZTsKKwlpbnQgaSwgbGVuOworCWNoYXIgc3RhdGVfc3RyWzY0XTsKKwljaGFyIGRldl9zdHJbNjRdOworCisKKwlkZXZfZGJnKCZwZGV2LT54ZGV2LT5kZXYsICJSZWNvbmZpZ3VyaW5nIGRldmljZSAuLi5cbiIpOworCisJLyogTWFrZSBzdXJlIHdlIG9ubHkgcmVjb25maWd1cmUgb25jZSAqLworCWlmICh4ZW5idXNfcmVhZF9kcml2ZXJfc3RhdGUocGRldi0+eGRldi0+bm9kZW5hbWUpICE9CisJICAgIFhlbmJ1c1N0YXRlUmVjb25maWd1cmluZykKKwkJZ290byBvdXQ7CisKKwllcnIgPSB4ZW5idXNfc2NhbmYoWEJUX05JTCwgcGRldi0+eGRldi0+bm9kZW5hbWUsICJudW1fZGV2cyIsICIlZCIsCisJCQkgICAmbnVtX2RldnMpOworCWlmIChlcnIgIT0gMSkgeworCQlpZiAoZXJyID49IDApCisJCQllcnIgPSAtRUlOVkFMOworCQl4ZW5idXNfZGV2X2ZhdGFsKHBkZXYtPnhkZXYsIGVyciwKKwkJCQkgIkVycm9yIHJlYWRpbmcgbnVtYmVyIG9mIGRldmljZXMiKTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9kZXZzOyBpKyspIHsKKwkJbGVuID0gc25wcmludGYoc3RhdGVfc3RyLCBzaXplb2Yoc3RhdGVfc3RyKSwgInN0YXRlLSVkIiwgaSk7CisJCWlmICh1bmxpa2VseShsZW4gPj0gKHNpemVvZihzdGF0ZV9zdHIpIC0gMSkpKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJeGVuYnVzX2Rldl9mYXRhbChwZGV2LT54ZGV2LCBlcnIsCisJCQkJCSAiU3RyaW5nIG92ZXJmbG93IHdoaWxlIHJlYWRpbmcgIgorCQkJCQkgImNvbmZpZ3VyYXRpb24iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVyciA9IHhlbmJ1c19zY2FuZihYQlRfTklMLCBwZGV2LT54ZGV2LT5ub2RlbmFtZSwgc3RhdGVfc3RyLAorCQkJCSAgICIlZCIsICZzdWJzdGF0ZSk7CisJCWlmIChlcnIgIT0gMSkKKwkJCXN1YnN0YXRlID0gWGVuYnVzU3RhdGVVbmtub3duOworCisJCXN3aXRjaCAoc3Vic3RhdGUpIHsKKwkJY2FzZSBYZW5idXNTdGF0ZUluaXRpYWxpc2luZzoKKwkJCWRldl9kYmcoJnBkZXYtPnhkZXYtPmRldiwgIkF0dGFjaGluZyBkZXYtJWQgLi4uXG4iLCBpKTsKKworCQkJbGVuID0gc25wcmludGYoZGV2X3N0ciwgc2l6ZW9mKGRldl9zdHIpLCAiZGV2LSVkIiwgaSk7CisJCQlpZiAodW5saWtlbHkobGVuID49IChzaXplb2YoZGV2X3N0cikgLSAxKSkpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCXhlbmJ1c19kZXZfZmF0YWwocGRldi0+eGRldiwgZXJyLAorCQkJCQkJICJTdHJpbmcgb3ZlcmZsb3cgd2hpbGUgIgorCQkJCQkJICJyZWFkaW5nIGNvbmZpZ3VyYXRpb24iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWVyciA9IHhlbmJ1c19zY2FuZihYQlRfTklMLCBwZGV2LT54ZGV2LT5ub2RlbmFtZSwKKwkJCQkJICAgZGV2X3N0ciwgIiV4OiV4OiV4LiV4IiwKKwkJCQkJICAgJmRvbWFpbiwgJmJ1cywgJnNsb3QsICZmdW5jKTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJeGVuYnVzX2Rldl9mYXRhbChwZGV2LT54ZGV2LCBlcnIsCisJCQkJCQkgIkVycm9yIHJlYWRpbmcgZGV2aWNlICIKKwkJCQkJCSAiY29uZmlndXJhdGlvbiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKGVyciAhPSA0KSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQl4ZW5idXNfZGV2X2ZhdGFsKHBkZXYtPnhkZXYsIGVyciwKKwkJCQkJCSAiRXJyb3IgcGFyc2luZyBwY2kgZGV2aWNlICIKKwkJCQkJCSAiY29uZmlndXJhdGlvbiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQllcnIgPSB4ZW5fcGNpYmtfZXhwb3J0X2RldmljZShwZGV2LCBkb21haW4sIGJ1cywgc2xvdCwKKwkJCQkJCSAgICBmdW5jLCBpKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisKKwkJCS8qIFB1Ymxpc2ggcGNpIHJvb3RzLiAqLworCQkJZXJyID0geGVuX3BjaWJrX3B1Ymxpc2hfcGNpX3Jvb3RzKHBkZXYsCisJCQkJCQl4ZW5fcGNpYmtfcHVibGlzaF9wY2lfcm9vdCk7CisJCQlpZiAoZXJyKSB7CisJCQkJeGVuYnVzX2Rldl9mYXRhbChwZGV2LT54ZGV2LCBlcnIsCisJCQkJCQkgIkVycm9yIHdoaWxlIHB1Ymxpc2ggUENJIHJvb3QiCisJCQkJCQkgImJ1c2VzIGZvciBmcm9udGVuZCIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQllcnIgPSB4ZW5idXNfcHJpbnRmKFhCVF9OSUwsIHBkZXYtPnhkZXYtPm5vZGVuYW1lLAorCQkJCQkgICAgc3RhdGVfc3RyLCAiJWQiLAorCQkJCQkgICAgWGVuYnVzU3RhdGVJbml0aWFsaXNlZCk7CisJCQlpZiAoZXJyKSB7CisJCQkJeGVuYnVzX2Rldl9mYXRhbChwZGV2LT54ZGV2LCBlcnIsCisJCQkJCQkgIkVycm9yIHN3aXRjaGluZyBzdWJzdGF0ZSBvZiAiCisJCQkJCQkgImRldi0lZFxuIiwgaSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFhlbmJ1c1N0YXRlQ2xvc2luZzoKKwkJCWRldl9kYmcoJnBkZXYtPnhkZXYtPmRldiwgIkRldGFjaGluZyBkZXYtJWQgLi4uXG4iLCBpKTsKKworCQkJbGVuID0gc25wcmludGYoZGV2X3N0ciwgc2l6ZW9mKGRldl9zdHIpLCAidmRldi0lZCIsIGkpOworCQkJaWYgKHVubGlrZWx5KGxlbiA+PSAoc2l6ZW9mKGRldl9zdHIpIC0gMSkpKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQl4ZW5idXNfZGV2X2ZhdGFsKHBkZXYtPnhkZXYsIGVyciwKKwkJCQkJCSAiU3RyaW5nIG92ZXJmbG93IHdoaWxlICIKKwkJCQkJCSAicmVhZGluZyBjb25maWd1cmF0aW9uIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQllcnIgPSB4ZW5idXNfc2NhbmYoWEJUX05JTCwgcGRldi0+eGRldi0+bm9kZW5hbWUsCisJCQkJCSAgIGRldl9zdHIsICIleDoleDoleC4leCIsCisJCQkJCSAgICZkb21haW4sICZidXMsICZzbG90LCAmZnVuYyk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCXhlbmJ1c19kZXZfZmF0YWwocGRldi0+eGRldiwgZXJyLAorCQkJCQkJICJFcnJvciByZWFkaW5nIGRldmljZSAiCisJCQkJCQkgImNvbmZpZ3VyYXRpb24iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChlcnIgIT0gNCkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJeGVuYnVzX2Rldl9mYXRhbChwZGV2LT54ZGV2LCBlcnIsCisJCQkJCQkgIkVycm9yIHBhcnNpbmcgcGNpIGRldmljZSAiCisJCQkJCQkgImNvbmZpZ3VyYXRpb24iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJZXJyID0geGVuX3BjaWJrX3JlbW92ZV9kZXZpY2UocGRldiwgZG9tYWluLCBidXMsIHNsb3QsCisJCQkJCQkgICAgZnVuYyk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0OworCisJCQkvKiBUT0RPOiBJZiBhdCBzb21lIHBvaW50IHdlIGltcGxlbWVudCBzdXBwb3J0IGZvciBwY2kKKwkJCSAqIHJvb3QgaG90LXJlbW92ZSBvbiBwY2lmcm9udCBzaWRlLCB3ZSdsbCBuZWVkIHRvCisJCQkgKiByZW1vdmUgdW5uZWNlc3NhcnkgeGVuc3RvcmUgbm9kZXMgb2YgcGNpIHJvb3RzIGhlcmUuCisJCQkgKi8KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJZXJyID0geGVuYnVzX3N3aXRjaF9zdGF0ZShwZGV2LT54ZGV2LCBYZW5idXNTdGF0ZVJlY29uZmlndXJlZCk7CisJaWYgKGVycikgeworCQl4ZW5idXNfZGV2X2ZhdGFsKHBkZXYtPnhkZXYsIGVyciwKKwkJCQkgIkVycm9yIHN3aXRjaGluZyB0byByZWNvbmZpZ3VyZWQgc3RhdGUhIik7CisJCWdvdG8gb3V0OworCX0KKworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4ZW5fcGNpYmtfZnJvbnRlbmRfY2hhbmdlZChzdHJ1Y3QgeGVuYnVzX2RldmljZSAqeGRldiwKKwkJCQkgICAgIGVudW0geGVuYnVzX3N0YXRlIGZlX3N0YXRlKQoreworCXN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZ4ZGV2LT5kZXYpOworCisJZGV2X2RiZygmeGRldi0+ZGV2LCAiZmUgc3RhdGUgY2hhbmdlZCAlZFxuIiwgZmVfc3RhdGUpOworCisJc3dpdGNoIChmZV9zdGF0ZSkgeworCWNhc2UgWGVuYnVzU3RhdGVJbml0aWFsaXNlZDoKKwkJeGVuX3BjaWJrX2F0dGFjaChwZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIFhlbmJ1c1N0YXRlUmVjb25maWd1cmluZzoKKwkJeGVuX3BjaWJrX3JlY29uZmlndXJlKHBkZXYpOworCQlicmVhazsKKworCWNhc2UgWGVuYnVzU3RhdGVDb25uZWN0ZWQ6CisJCS8qIHBjaWZyb250IHN3aXRjaGVkIGl0cyBzdGF0ZSBmcm9tIHJlY29uZmlndXJpbmcgdG8gY29ubmVjdGVkLgorCQkgKiBUaGVuIHN3aXRjaCB0byBjb25uZWN0ZWQgc3RhdGUuCisJCSAqLworCQl4ZW5idXNfc3dpdGNoX3N0YXRlKHhkZXYsIFhlbmJ1c1N0YXRlQ29ubmVjdGVkKTsKKwkJYnJlYWs7CisKKwljYXNlIFhlbmJ1c1N0YXRlQ2xvc2luZzoKKwkJeGVuX3BjaWJrX2Rpc2Nvbm5lY3QocGRldik7CisJCXhlbmJ1c19zd2l0Y2hfc3RhdGUoeGRldiwgWGVuYnVzU3RhdGVDbG9zaW5nKTsKKwkJYnJlYWs7CisKKwljYXNlIFhlbmJ1c1N0YXRlQ2xvc2VkOgorCQl4ZW5fcGNpYmtfZGlzY29ubmVjdChwZGV2KTsKKwkJeGVuYnVzX3N3aXRjaF9zdGF0ZSh4ZGV2LCBYZW5idXNTdGF0ZUNsb3NlZCk7CisJCWlmICh4ZW5idXNfZGV2X2lzX29ubGluZSh4ZGV2KSkKKwkJCWJyZWFrOworCQkvKiBmYWxsIHRocm91Z2ggaWYgbm90IG9ubGluZSAqLworCWNhc2UgWGVuYnVzU3RhdGVVbmtub3duOgorCQlkZXZfZGJnKCZ4ZGV2LT5kZXYsICJmcm9udGVuZCBpcyBnb25lISB1bnJlZ2lzdGVyIGRldmljZVxuIik7CisJCWRldmljZV91bnJlZ2lzdGVyKCZ4ZGV2LT5kZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCB4ZW5fcGNpYmtfc2V0dXBfYmFja2VuZChzdHJ1Y3QgeGVuX3BjaWJrX2RldmljZSAqcGRldikKK3sKKwkvKiBHZXQgY29uZmlndXJhdGlvbiBmcm9tIHhlbmQgKGlmIGF2YWlsYWJsZSBub3cpICovCisJaW50IGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jOworCWludCBlcnIgPSAwOworCWludCBpLCBudW1fZGV2czsKKwljaGFyIGRldl9zdHJbNjRdOworCWNoYXIgc3RhdGVfc3RyWzY0XTsKKworCS8qIEl0J3MgcG9zc2libGUgd2UgY291bGQgZ2V0IHRoZSBjYWxsIHRvIHNldHVwIHR3aWNlLCBzbyBtYWtlIHN1cmUKKwkgKiB3ZSdyZSBub3QgYWxyZWFkeSBjb25uZWN0ZWQuCisJICovCisJaWYgKHhlbmJ1c19yZWFkX2RyaXZlcl9zdGF0ZShwZGV2LT54ZGV2LT5ub2RlbmFtZSkgIT0KKwkgICAgWGVuYnVzU3RhdGVJbml0V2FpdCkKKwkJZ290byBvdXQ7CisKKwlkZXZfZGJnKCZwZGV2LT54ZGV2LT5kZXYsICJnZXR0aW5nIGJlIHNldHVwXG4iKTsKKworCWVyciA9IHhlbmJ1c19zY2FuZihYQlRfTklMLCBwZGV2LT54ZGV2LT5ub2RlbmFtZSwgIm51bV9kZXZzIiwgIiVkIiwKKwkJCSAgICZudW1fZGV2cyk7CisJaWYgKGVyciAhPSAxKSB7CisJCWlmIChlcnIgPj0gMCkKKwkJCWVyciA9IC1FSU5WQUw7CisJCXhlbmJ1c19kZXZfZmF0YWwocGRldi0+eGRldiwgZXJyLAorCQkJCSAiRXJyb3IgcmVhZGluZyBudW1iZXIgb2YgZGV2aWNlcyIpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2RldnM7IGkrKykgeworCQlpbnQgbCA9IHNucHJpbnRmKGRldl9zdHIsIHNpemVvZihkZXZfc3RyKSwgImRldi0lZCIsIGkpOworCQlpZiAodW5saWtlbHkobCA+PSAoc2l6ZW9mKGRldl9zdHIpIC0gMSkpKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJeGVuYnVzX2Rldl9mYXRhbChwZGV2LT54ZGV2LCBlcnIsCisJCQkJCSAiU3RyaW5nIG92ZXJmbG93IHdoaWxlIHJlYWRpbmcgIgorCQkJCQkgImNvbmZpZ3VyYXRpb24iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZXJyID0geGVuYnVzX3NjYW5mKFhCVF9OSUwsIHBkZXYtPnhkZXYtPm5vZGVuYW1lLCBkZXZfc3RyLAorCQkJCSAgICIleDoleDoleC4leCIsICZkb21haW4sICZidXMsICZzbG90LCAmZnVuYyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQl4ZW5idXNfZGV2X2ZhdGFsKHBkZXYtPnhkZXYsIGVyciwKKwkJCQkJICJFcnJvciByZWFkaW5nIGRldmljZSBjb25maWd1cmF0aW9uIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoZXJyICE9IDQpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQl4ZW5idXNfZGV2X2ZhdGFsKHBkZXYtPnhkZXYsIGVyciwKKwkJCQkJICJFcnJvciBwYXJzaW5nIHBjaSBkZXZpY2UgIgorCQkJCQkgImNvbmZpZ3VyYXRpb24iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZXJyID0geGVuX3BjaWJrX2V4cG9ydF9kZXZpY2UocGRldiwgZG9tYWluLCBidXMsIHNsb3QsIGZ1bmMsIGkpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJLyogU3dpdGNoIHN1YnN0YXRlIG9mIHRoaXMgZGV2aWNlLiAqLworCQlsID0gc25wcmludGYoc3RhdGVfc3RyLCBzaXplb2Yoc3RhdGVfc3RyKSwgInN0YXRlLSVkIiwgaSk7CisJCWlmICh1bmxpa2VseShsID49IChzaXplb2Yoc3RhdGVfc3RyKSAtIDEpKSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCXhlbmJ1c19kZXZfZmF0YWwocGRldi0+eGRldiwgZXJyLAorCQkJCQkgIlN0cmluZyBvdmVyZmxvdyB3aGlsZSByZWFkaW5nICIKKwkJCQkJICJjb25maWd1cmF0aW9uIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQllcnIgPSB4ZW5idXNfcHJpbnRmKFhCVF9OSUwsIHBkZXYtPnhkZXYtPm5vZGVuYW1lLCBzdGF0ZV9zdHIsCisJCQkJICAgICIlZCIsIFhlbmJ1c1N0YXRlSW5pdGlhbGlzZWQpOworCQlpZiAoZXJyKSB7CisJCQl4ZW5idXNfZGV2X2ZhdGFsKHBkZXYtPnhkZXYsIGVyciwgIkVycm9yIHN3aXRjaGluZyAiCisJCQkJCSAic3Vic3RhdGUgb2YgZGV2LSVkXG4iLCBpKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZXJyID0geGVuX3BjaWJrX3B1Ymxpc2hfcGNpX3Jvb3RzKHBkZXYsIHhlbl9wY2lia19wdWJsaXNoX3BjaV9yb290KTsKKwlpZiAoZXJyKSB7CisJCXhlbmJ1c19kZXZfZmF0YWwocGRldi0+eGRldiwgZXJyLAorCQkJCSAiRXJyb3Igd2hpbGUgcHVibGlzaCBQQ0kgcm9vdCBidXNlcyAiCisJCQkJICJmb3IgZnJvbnRlbmQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0geGVuYnVzX3N3aXRjaF9zdGF0ZShwZGV2LT54ZGV2LCBYZW5idXNTdGF0ZUluaXRpYWxpc2VkKTsKKwlpZiAoZXJyKQorCQl4ZW5idXNfZGV2X2ZhdGFsKHBkZXYtPnhkZXYsIGVyciwKKwkJCQkgIkVycm9yIHN3aXRjaGluZyB0byBpbml0aWFsaXNlZCBzdGF0ZSEiKTsKKworb3V0OgorCWlmICghZXJyKQorCQkvKiBzZWUgaWYgcGNpZnJvbnQgaXMgYWxyZWFkeSBjb25maWd1cmVkIChpZiBub3QsIHdlJ2xsIHdhaXQpICovCisJCXhlbl9wY2lia19hdHRhY2gocGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB4ZW5fcGNpYmtfYmVfd2F0Y2goc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gsCisJCQkgICAgIGNvbnN0IGNoYXIgKip2ZWMsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYgPQorCSAgICBjb250YWluZXJfb2Yod2F0Y2gsIHN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlLCBiZV93YXRjaCk7CisKKwlzd2l0Y2ggKHhlbmJ1c19yZWFkX2RyaXZlcl9zdGF0ZShwZGV2LT54ZGV2LT5ub2RlbmFtZSkpIHsKKwljYXNlIFhlbmJ1c1N0YXRlSW5pdFdhaXQ6CisJCXhlbl9wY2lia19zZXR1cF9iYWNrZW5kKHBkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCB4ZW5fcGNpYmtfeGVuYnVzX3Byb2JlKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYsCisJCQkJY29uc3Qgc3RydWN0IHhlbmJ1c19kZXZpY2VfaWQgKmlkKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCB4ZW5fcGNpYmtfZGV2aWNlICpwZGV2ID0gYWxsb2NfcGRldihkZXYpOworCisJaWYgKHBkZXYgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgZXJyLAorCQkJCSAiRXJyb3IgYWxsb2NhdGluZyB4ZW5fcGNpYmtfZGV2aWNlIHN0cnVjdCIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiB3YWl0IGZvciB4ZW5kIHRvIGNvbmZpZ3VyZSB1cyAqLworCWVyciA9IHhlbmJ1c19zd2l0Y2hfc3RhdGUoZGV2LCBYZW5idXNTdGF0ZUluaXRXYWl0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCS8qIHdhdGNoIHRoZSBiYWNrZW5kIG5vZGUgZm9yIGJhY2tlbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAqLworCWVyciA9IHhlbmJ1c193YXRjaF9wYXRoKGRldiwgZGV2LT5ub2RlbmFtZSwgJnBkZXYtPmJlX3dhdGNoLAorCQkJCXhlbl9wY2lia19iZV93YXRjaCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlwZGV2LT5iZV93YXRjaGluZyA9IDE7CisKKwkvKiBXZSBuZWVkIHRvIGZvcmNlIGEgY2FsbCB0byBvdXIgY2FsbGJhY2sgaGVyZSBpbiBjYXNlCisJICogeGVuZCBhbHJlYWR5IGNvbmZpZ3VyZWQgdXMhCisJICovCisJeGVuX3BjaWJrX2JlX3dhdGNoKCZwZGV2LT5iZV93YXRjaCwgTlVMTCwgMCk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHhlbl9wY2lia194ZW5idXNfcmVtb3ZlKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhlbl9wY2lia19kZXZpY2UgKnBkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKworCWlmIChwZGV2ICE9IE5VTEwpCisJCWZyZWVfcGRldihwZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHhlbmJ1c19kZXZpY2VfaWQgeGVucGNpX2lkc1tdID0geworCXsicGNpIn0sCisJeyIifSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeGVuYnVzX2RyaXZlciB4ZW5idXNfeGVuX3BjaWJrX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuaWRzCQkJPSB4ZW5wY2lfaWRzLAorCS5wcm9iZQkJCT0geGVuX3BjaWJrX3hlbmJ1c19wcm9iZSwKKwkucmVtb3ZlCQkJPSB4ZW5fcGNpYmtfeGVuYnVzX3JlbW92ZSwKKwkub3RoZXJlbmRfY2hhbmdlZAk9IHhlbl9wY2lia19mcm9udGVuZF9jaGFuZ2VkLAorfTsKKworc3RydWN0IHhlbl9wY2lia19iYWNrZW5kICp4ZW5fcGNpYmtfYmFja2VuZDsKKworaW50IF9faW5pdCB4ZW5fcGNpYmtfeGVuYnVzX3JlZ2lzdGVyKHZvaWQpCit7CisJeGVuX3BjaWJrX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgieGVuX3BjaWJhY2tfd29ya3F1ZXVlIik7CisJaWYgKCF4ZW5fcGNpYmtfd3EpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY3JlYXRlIgorCQkJInhlbl9wY2liYWNrX3dvcmtxdWV1ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXhlbl9wY2lia19iYWNrZW5kID0gJnhlbl9wY2lia192cGNpX2JhY2tlbmQ7CisJaWYgKHBhc3N0aHJvdWdoKQorCQl4ZW5fcGNpYmtfYmFja2VuZCA9ICZ4ZW5fcGNpYmtfcGFzc3Rocm91Z2hfYmFja2VuZDsKKwlwcl9pbmZvKERSVl9OQU1FICI6IGJhY2tlbmQgaXMgJXNcbiIsIHhlbl9wY2lia19iYWNrZW5kLT5uYW1lKTsKKwlyZXR1cm4geGVuYnVzX3JlZ2lzdGVyX2JhY2tlbmQoJnhlbmJ1c194ZW5fcGNpYmtfZHJpdmVyKTsKK30KKwordm9pZCBfX2V4aXQgeGVuX3BjaWJrX3hlbmJ1c191bnJlZ2lzdGVyKHZvaWQpCit7CisJZGVzdHJveV93b3JrcXVldWUoeGVuX3BjaWJrX3dxKTsKKwl4ZW5idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJnhlbmJ1c194ZW5fcGNpYmtfZHJpdmVyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbi1zZWxmYmFsbG9vbi5jIGIvZHJpdmVycy94ZW4veGVuLXNlbGZiYWxsb29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwOTM3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbi1zZWxmYmFsbG9vbi5jCkBAIC0wLDAgKzEsNDg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBYZW4gc2VsZmJhbGxvb24gZHJpdmVyIChhbmQgb3B0aW9uYWwgZnJvbnRzd2FwIHNlbGYtc2hyaW5raW5nIGRyaXZlcikKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSwgRGFuIE1hZ2VuaGVpbWVyLCBPcmFjbGUgQ29ycC4KKyAqCisgKiBUaGlzIGNvZGUgY29tcGxlbWVudHMgdGhlIGNsZWFuY2FjaGUgYW5kIGZyb250c3dhcCBwYXRjaHNldHMgdG8gb3B0aW1pemUKKyAqIHN1cHBvcnQgZm9yIFhlbiBUcmFuc2NlbmRlbnQgTWVtb3J5ICgidG1lbSIpLiAgVGhlIHBvbGljeSBpdCBpbXBsZW1lbnRzCisgKiBpcyBydWRpbWVudGFyeSBhbmQgd2lsbCBsaWtlbHkgaW1wcm92ZSBvdmVyIHRpbWUsIGJ1dCBpdCBkb2VzIHdvcmsgd2VsbAorICogZW5vdWdoIHRvZGF5LgorICoKKyAqIFR3byBmdW5jdGlvbmFsaXRpZXMgYXJlIGltcGxlbWVudGVkIGhlcmUgd2hpY2ggYm90aCB1c2UgImNvbnRyb2wgdGhlb3J5IgorICogKGZlZWRiYWNrKSB0byBvcHRpbWl6ZSBtZW1vcnkgdXRpbGl6YXRpb24uIEluIGEgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQKKyAqIHN1Y2ggYXMgWGVuLCBSQU0gaXMgb2Z0ZW4gYSBzY2FyY2UgcmVzb3VyY2UgYW5kIHdlIHdvdWxkIGxpa2UgdG8gZW5zdXJlCisgKiB0aGF0IGVhY2ggb2YgYSBwb3NzaWJseSBsYXJnZSBudW1iZXIgb2YgdmlydHVhbCBtYWNoaW5lcyBpcyB1c2luZyBSQU0KKyAqIGVmZmljaWVudGx5LCBpLmUuIHVzaW5nIGFzIGxpdHRsZSBhcyBwb3NzaWJsZSB3aGVuIHVuZGVyIGxpZ2h0IGxvYWQKKyAqIGFuZCBvYnRhaW5pbmcgYXMgbXVjaCBhcyBwb3NzaWJsZSB3aGVuIG1lbW9yeSBkZW1hbmRzIGFyZSBoaWdoLgorICogU2luY2UgUkFNIG5lZWRzIHZhcnkgaGlnaGx5IGR5bmFtaWNhbGx5IGFuZCBzb21ldGltZXMgZHJhbWF0aWNhbGx5LAorICogImh5c3RlcmVzaXMiIGlzIHVzZWQsIHRoYXQgaXMsIG1lbW9yeSB0YXJnZXQgaXMgZGV0ZXJtaW5lZCBub3QganVzdAorICogb24gY3VycmVudCBkYXRhIGJ1dCBhbHNvIG9uIHBhc3QgZGF0YSBzdG9yZWQgaW4gdGhlIHN5c3RlbS4KKyAqCisgKiAiU2VsZmJhbGxvb25pbmciIGNyZWF0ZXMgbWVtb3J5IHByZXNzdXJlIGJ5IG1hbmFnaW5nIHRoZSBYZW4gYmFsbG9vbgorICogZHJpdmVyIHRvIGRlY3JlYXNlIGFuZCBpbmNyZWFzZSBhdmFpbGFibGUga2VybmVsIG1lbW9yeSwgZHJpdmVuCisgKiBsYXJnZWx5IGJ5IHRoZSB0YXJnZXQgdmFsdWUgb2YgIkNvbW1pdHRlZF9BUyIgKHNlZSAvcHJvYy9tZW1pbmZvKS4KKyAqIFNpbmNlIENvbW1pdHRlZF9BUyBkb2VzIG5vdCBhY2NvdW50IGZvciBjbGVhbiBtYXBwZWQgcGFnZXMgKGkuZS4gcGFnZXMKKyAqIGluIFJBTSB0aGF0IGFyZSBpZGVudGljYWwgdG8gcGFnZXMgb24gZGlzayksIHNlbGZiYWxsb29uaW5nIGhhcyB0aGUKKyAqIGFmZmVjdCBvZiBwdXNoaW5nIGxlc3MgZnJlcXVlbnRseSB1c2VkIGNsZWFuIHBhZ2VjYWNoZSBwYWdlcyBvdXQgb2YKKyAqIGtlcm5lbCBSQU0gYW5kLCBwcmVzdW1hYmx5IHVzaW5nIGNsZWFuY2FjaGUsIGludG8gWGVuIHRtZW0gd2hlcmUKKyAqIFhlbiBjYW4gbW9yZSBlZmZpY2llbnRseSBvcHRpbWl6ZSBSQU0gdXRpbGl6YXRpb24gZm9yIHN1Y2ggcGFnZXMuCisgKgorICogV2hlbiBrZXJuZWwgbWVtb3J5IGRlbWFuZCB1bmV4cGVjdGVkbHkgaW5jcmVhc2VzIGZhc3RlciB0aGFuIFhlbiwgdmlhCisgKiB0aGUgc2VsZmJhbGxvb24gZHJpdmVyLCBpcyBhYmxlIHRvIChvciBjaG9vc2VzIHRvKSBwcm92aWRlIHVzYWJsZSBSQU0sCisgKiB0aGUga2VybmVsIG1heSBpbnZva2Ugc3dhcHBpbmcuICBJbiBtb3N0IGNhc2VzLCBmcm9udHN3YXAgaXMgYWJsZQorICogdG8gYWJzb3JiIHRoaXMgc3dhcHBpbmcgaW50byBYZW4gdG1lbS4gIEhvd2V2ZXIsIGR1ZSB0byB0aGUgZmFjdAorICogdGhhdCB0aGUga2VybmVsIHN3YXAgc3Vic3lzdGVtIGFzc3VtZXMgc3dhcHBpbmcgb2NjdXJzIHRvIGEgZGlzaywKKyAqIHN3YXBwZWQgcGFnZXMgbWF5IHNpdCBvbiB0aGUgZGlzayBmb3IgYSB2ZXJ5IGxvbmcgdGltZTsgZXZlbiBpZgorICogdGhlIGtlcm5lbCBrbm93cyB0aGUgcGFnZSB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uICBUaGlzIGlzIGJlY2F1c2UKKyAqIHRoZSBkaXNrIHNwYWNlIGNvc3RzIHZlcnkgbGl0dGxlIGFuZCBjYW4gYmUgb3ZlcndyaXR0ZW4gd2hlbgorICogbmVjZXNzYXJ5LiAgV2hlbiBzdWNoIHN0YWxlIHBhZ2VzIGFyZSBpbiBmcm9udHN3YXAsIGhvd2V2ZXIsIHRoZXkKKyAqIGFyZSB0YWtpbmcgdXAgdmFsdWFibGUgcmVhbCBlc3RhdGUuICAiRnJvbnRzd2FwIHNlbGZzaHJpbmtpbmciIHdvcmtzCisgKiB0byByZXNvbHZlIHRoaXM6ICBXaGVuIGZyb250c3dhcCBhY3Rpdml0eSBpcyBvdGhlcndpc2Ugc3RhYmxlCisgKiBhbmQgdGhlIGd1ZXN0IGtlcm5lbCBpcyBub3QgdW5kZXIgbWVtb3J5IHByZXNzdXJlLCB0aGUgImZyb250c3dhcAorICogc2VsZnNocmlua2luZyIgYWNjb3VudHMgZm9yIHRoaXMgYnkgcHJvdmlkaW5nIHByZXNzdXJlIHRvIHJlbW92ZSBzb21lCisgKiBwYWdlcyBmcm9tIGZyb250c3dhcCBhbmQgcmV0dXJuIHRoZW0gdG8ga2VybmVsIG1lbW9yeS4KKyAqCisgKiBGb3IgYm90aCAic2VsZmJhbGxvb25pbmciIGFuZCAiZnJvbnRzd2FwLXNlbGZzaHJpbmtpbmciLCBhIHdvcmtlcgorICogdGhyZWFkIGlzIHVzZWQgYW5kIHN5c2ZzIHR1bmFibGVzIGFyZSBwcm92aWRlZCB0byBhZGp1c3QgdGhlIGZyZXF1ZW5jeQorICogYW5kIHJhdGUgb2YgYWRqdXN0bWVudHMgdG8gYWNoaWV2ZSB0aGUgZ29hbCwgYXMgd2VsbCBhcyB0byBkaXNhYmxlIG9uZQorICogb3IgYm90aCBmdW5jdGlvbnMgaW5kZXBlbmRlbnRseS4KKyAqCisgKiBXaGlsZSBzb21lIGFyZ3VlIHRoYXQgdGhpcyBmdW5jdGlvbmFsaXR5IGNhbiBhbmQgc2hvdWxkIGJlIGltcGxlbWVudGVkCisgKiBpbiB1c2Vyc3BhY2UsIGl0IGhhcyBiZWVuIG9ic2VydmVkIHRoYXQgYmFkIHRoaW5ncyBoYXBwZW4gKGUuZy4gT09NcykuCisgKgorICogU3lzdGVtIGNvbmZpZ3VyYXRpb24gbm90ZTogU2VsZmJhbGxvb25pbmcgc2hvdWxkIG5vdCBiZSBlbmFibGVkIG9uCisgKiBzeXN0ZW1zIHdpdGhvdXQgYSBzdWZmaWNpZW50bHkgbGFyZ2Ugc3dhcCBkZXZpY2UgY29uZmlndXJlZDsgZm9yIGJlc3QKKyAqIHJlc3VsdHMsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdG90YWwgc3dhcCBiZSBpbmNyZWFzZWQgYnkgdGhlIHNpemUKKyAqIG9mIHRoZSBndWVzdCBtZW1vcnkuICBBbHNvLCB3aGlsZSB0ZWNobmljYWxseSBub3QgcmVxdWlyZWQgdG8gYmUKKyAqIGNvbmZpZ3VyZWQsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IGZyb250c3dhcCBhbHNvIGJlIGNvbmZpZ3VyZWQKKyAqIGFuZCBlbmFibGVkIHdoZW4gc2VsZmJhbGxvb25pbmcgaXMgcnVubmluZy4gIFNvLCBzZWxmYmFsbG9vbmluZworICogaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBpZiBmcm9udHN3YXAgaXMgbm90IGNvbmZpZ3VyZWQgYW5kIGNhbiBvbmx5CisgKiBiZSBlbmFibGVkIHdpdGggdGhlICJzZWxmYmFsbG9vbmluZyIga2VybmVsIGJvb3Qgb3B0aW9uOyBzaW1pbGFybHkKKyAqIHNlbGZiYWxsb29uaW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBpZiBmcm9udHN3YXAgaXMgY29uZmlndXJlZCBhbmQKKyAqIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSAibm9zZWxmYmFsbG9vbmluZyIga2VybmVsIGJvb3Qgb3B0aW9uLiAgRmluYWxseSwKKyAqIHdoZW4gZnJvbnRzd2FwIGlzIGNvbmZpZ3VyZWQsIGZyb250c3dhcC1zZWxmc2hyaW5raW5nIGNhbiBiZSBkaXNhYmxlZAorICogd2l0aCB0aGUgIm5vc2VsZnNocmluayIga2VybmVsIGJvb3Qgb3B0aW9uLgorICoKKyAqIFNlbGZiYWxsb29uaW5nIGlzIGRpc2FsbG93ZWQgaW4gZG9tYWluMCBhbmQgZm9yY2UtZGlzYWJsZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKworI2luY2x1ZGUgPHhlbi9iYWxsb29uLmg+CisKKyNpbmNsdWRlIDx4ZW4vdG1lbS5oPgorCisvKiBFbmFibGUvZGlzYWJsZSB3aXRoIHN5c2ZzLiAqLworc3RhdGljIGludCB4ZW5fc2VsZmJhbGxvb25pbmdfZW5hYmxlZCBfX3JlYWRfbW9zdGx5OworCisvKgorICogQ29udHJvbHMgcmF0ZSBhdCB3aGljaCBtZW1vcnkgdGFyZ2V0ICh0aGlzIGl0ZXJhdGlvbikgYXBwcm9hY2hlcworICogdWx0aW1hdGUgZ29hbCB3aGVuIG1lbW9yeSBuZWVkIGlzIGluY3JlYXNpbmcgKHVwLWh5c3RlcmVzaXMpIG9yCisgKiBkZWNyZWFzaW5nIChkb3duLWh5c3RlcmVzaXMpLiBIaWdoZXIgdmFsdWVzIG9mIGh5c3RlcmVzaXMgY2F1c2UKKyAqIHNsb3dlciBpbmNyZWFzZXMvZGVjcmVhc2VzLiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB2YXJpb3VzCisgKiBwYXJhbWV0ZXJzIHdlcmUgZGVlbWVkIHJlYXNvbmFibGUgYnkgZXhwZXJpbWVudGF0aW9uLCBtYXkgYmUKKyAqIHdvcmtsb2FkLWRlcGVuZGVudCwgYW5kIGNhbiBhbGwgYmUgYWRqdXN0ZWQgdmlhIHN5c2ZzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNlbGZiYWxsb29uX2Rvd25oeXN0ZXJlc2lzIF9fcmVhZF9tb3N0bHkgPSA4Oworc3RhdGljIHVuc2lnbmVkIGludCBzZWxmYmFsbG9vbl91cGh5c3RlcmVzaXMgX19yZWFkX21vc3RseSA9IDE7CisKKy8qIEluIEhaLCBjb250cm9scyBmcmVxdWVuY3kgb2Ygd29ya2VyIGludm9jYXRpb24uICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNlbGZiYWxsb29uX2ludGVydmFsIF9fcmVhZF9tb3N0bHkgPSA1OworCitzdGF0aWMgdm9pZCBzZWxmYmFsbG9vbl9wcm9jZXNzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoc2VsZmJhbGxvb25fd29ya2VyLCBzZWxmYmFsbG9vbl9wcm9jZXNzKTsKKworI2lmZGVmIENPTkZJR19GUk9OVFNXQVAKKyNpbmNsdWRlIDxsaW51eC9mcm9udHN3YXAuaD4KKworLyogRW5hYmxlL2Rpc2FibGUgd2l0aCBzeXNmcy4gKi8KK3N0YXRpYyBib29sIGZyb250c3dhcF9zZWxmc2hyaW5raW5nIF9fcmVhZF9tb3N0bHk7CisKKy8qIEVuYWJsZS9kaXNhYmxlIHdpdGgga2VybmVsIGJvb3Qgb3B0aW9uLiAqLworc3RhdGljIGJvb2wgdXNlX2Zyb250c3dhcF9zZWxmc2hyaW5rIF9faW5pdGRhdGEgPSB0cnVlOworCisvKgorICogVGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgd2VyZSBkZWVtZWQgcmVhc29uYWJsZQorICogYnkgZXhwZXJpbWVudGF0aW9uLCBtYXkgYmUgd29ya2xvYWQtZGVwZW5kZW50LCBhbmQgY2FuIGFsbCBiZQorICogYWRqdXN0ZWQgdmlhIHN5c2ZzLgorICovCisKKy8qIENvbnRyb2wgcmF0ZSBmb3IgZnJvbnRzd2FwIHNocmlua2luZy4gSGlnaGVyIGh5c3RlcmVzaXMgaXMgc2xvd2VyLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBmcm9udHN3YXBfaHlzdGVyZXNpcyBfX3JlYWRfbW9zdGx5ID0gMjA7CisKKy8qCisgKiBOdW1iZXIgb2Ygc2VsZmJhbGxvb24gd29ya2VyIGludm9jYXRpb25zIHRvIHdhaXQgYmVmb3JlIG9ic2VydmluZyB0aGF0CisgKiBmcm9udHN3YXAgc2VsZnNocmlua2luZyBzaG91bGQgY29tbWVuY2UuIE5vdGUgdGhhdCBzZWxmc2hyaW5raW5nIGRvZXMKKyAqIG5vdCB1c2UgYSBzZXBhcmF0ZSB3b3JrZXIgdGhyZWFkLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGZyb250c3dhcF9pbmVydGlhIF9fcmVhZF9tb3N0bHkgPSAzOworCisvKiBDb3VudGRvd24gdG8gbmV4dCBpbnZvY2F0aW9uIG9mIGZyb250c3dhcF9zaHJpbmsoKSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZnJvbnRzd2FwX2luZXJ0aWFfY291bnRlcjsKKworLyoKKyAqIEludm9rZWQgYnkgdGhlIHNlbGZiYWxsb29uIHdvcmtlciB0aHJlYWQsIHVzZXMgY3VycmVudCBudW1iZXIgb2YgcGFnZXMKKyAqIGluIGZyb250c3dhcCAoZnJvbnRzd2FwX2N1cnJfcGFnZXMoKSksIHByZXZpb3VzIHN0YXR1cywgYW5kIGNvbnRyb2wKKyAqIHZhbHVlcyAoaHlzdGVyZXNpcyBhbmQgaW5lcnRpYSkgdG8gZGV0ZXJtaW5lIGlmIGZyb250c3dhcCBzaG91bGQgYmUKKyAqIHNocnVuayBhbmQgd2hhdCB0aGUgbmV3IGZyb250c3dhcCBzaXplIHNob3VsZCBiZS4gIE5vdGUgdGhhdAorICogZnJvbnRzd2FwX3NocmluayBpcyBlc3NlbnRpYWxseSBhIHBhcnRpYWwgc3dhcG9mZiB0aGF0IGltbWVkaWF0ZWx5CisgKiB0cmFuc2ZlcnMgcGFnZXMgZnJvbSB0aGUgInN3YXAgZGV2aWNlIiAoZnJvbnRzd2FwKSBiYWNrIGludG8ga2VybmVsCisgKiBSQU07IGRlc3BpdGUgdGhlIG5hbWUsIGZyb250c3dhcCAic2hyaW5raW5nIiBpcyB2ZXJ5IGRpZmZlcmVudCBmcm9tCisgKiB0aGUgInNocmlua2VyIiBpbnRlcmZhY2UgdXNlZCBieSB0aGUga2VybmVsIE1NIHN1YnN5c3RlbSB0byByZWNsYWltCisgKiBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIGZyb250c3dhcF9zZWxmc2hyaW5rKHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VyX2Zyb250c3dhcF9wYWdlczsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2Zyb250c3dhcF9wYWdlczsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyB0Z3RfZnJvbnRzd2FwX3BhZ2VzOworCisJbGFzdF9mcm9udHN3YXBfcGFnZXMgPSBjdXJfZnJvbnRzd2FwX3BhZ2VzOworCWN1cl9mcm9udHN3YXBfcGFnZXMgPSBmcm9udHN3YXBfY3Vycl9wYWdlcygpOworCWlmICghY3VyX2Zyb250c3dhcF9wYWdlcyB8fAorCQkJKGN1cl9mcm9udHN3YXBfcGFnZXMgPiBsYXN0X2Zyb250c3dhcF9wYWdlcykpIHsKKwkJZnJvbnRzd2FwX2luZXJ0aWFfY291bnRlciA9IGZyb250c3dhcF9pbmVydGlhOworCQlyZXR1cm47CisJfQorCWlmIChmcm9udHN3YXBfaW5lcnRpYV9jb3VudGVyICYmIC0tZnJvbnRzd2FwX2luZXJ0aWFfY291bnRlcikKKwkJcmV0dXJuOworCWlmIChjdXJfZnJvbnRzd2FwX3BhZ2VzIDw9IGZyb250c3dhcF9oeXN0ZXJlc2lzKQorCQl0Z3RfZnJvbnRzd2FwX3BhZ2VzID0gMDsKKwllbHNlCisJCXRndF9mcm9udHN3YXBfcGFnZXMgPSBjdXJfZnJvbnRzd2FwX3BhZ2VzIC0KKwkJCShjdXJfZnJvbnRzd2FwX3BhZ2VzIC8gZnJvbnRzd2FwX2h5c3RlcmVzaXMpOworCWZyb250c3dhcF9zaHJpbmsodGd0X2Zyb250c3dhcF9wYWdlcyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHhlbl9ub2Zyb250c3dhcF9zZWxmc2hyaW5rX3NldHVwKGNoYXIgKnMpCit7CisJdXNlX2Zyb250c3dhcF9zZWxmc2hyaW5rID0gZmFsc2U7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm5vc2VsZnNocmluayIsIHhlbl9ub2Zyb250c3dhcF9zZWxmc2hyaW5rX3NldHVwKTsKKworLyogRGlzYWJsZSB3aXRoIGtlcm5lbCBib290IG9wdGlvbi4gKi8KK3N0YXRpYyBib29sIHVzZV9zZWxmYmFsbG9vbmluZyBfX2luaXRkYXRhID0gdHJ1ZTsKKworc3RhdGljIGludCBfX2luaXQgeGVuX25vc2VsZmJhbGxvb25pbmdfc2V0dXAoY2hhciAqcykKK3sKKwl1c2Vfc2VsZmJhbGxvb25pbmcgPSBmYWxzZTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibm9zZWxmYmFsbG9vbmluZyIsIHhlbl9ub3NlbGZiYWxsb29uaW5nX3NldHVwKTsKKyNlbHNlIC8qICFDT05GSUdfRlJPTlRTV0FQICovCisvKiBFbmFibGUgd2l0aCBrZXJuZWwgYm9vdCBvcHRpb24uICovCitzdGF0aWMgYm9vbCB1c2Vfc2VsZmJhbGxvb25pbmcgX19pbml0ZGF0YSA9IGZhbHNlOworCitzdGF0aWMgaW50IF9faW5pdCB4ZW5fc2VsZmJhbGxvb25pbmdfc2V0dXAoY2hhciAqcykKK3sKKwl1c2Vfc2VsZmJhbGxvb25pbmcgPSB0cnVlOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJzZWxmYmFsbG9vbmluZyIsIHhlbl9zZWxmYmFsbG9vbmluZ19zZXR1cCk7CisjZW5kaWYgLyogQ09ORklHX0ZST05UU1dBUCAqLworCisvKgorICogVXNlIGN1cnJlbnQgYmFsbG9vbiBzaXplLCB0aGUgZ29hbCAodm1fY29tbWl0dGVkX2FzKSwgYW5kIGh5c3RlcmVzaXMKKyAqIHBhcmFtZXRlcnMgdG8gc2V0IGEgbmV3IHRhcmdldCBiYWxsb29uIHNpemUKKyAqLworc3RhdGljIHZvaWQgc2VsZmJhbGxvb25fcHJvY2VzcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdW5zaWduZWQgbG9uZyBjdXJfcGFnZXMsIGdvYWxfcGFnZXMsIHRndF9wYWdlczsKKwlib29sIHJlc2V0X3RpbWVyID0gZmFsc2U7CisKKwlpZiAoeGVuX3NlbGZiYWxsb29uaW5nX2VuYWJsZWQpIHsKKwkJY3VyX3BhZ2VzID0gYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzOworCQl0Z3RfcGFnZXMgPSBjdXJfcGFnZXM7IC8qIGRlZmF1bHQgaXMgbm8gY2hhbmdlICovCisJCWdvYWxfcGFnZXMgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZ2bV9jb21taXR0ZWRfYXMpICsKKwkJCWJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlcyAtIHRvdGFscmFtX3BhZ2VzOworI2lmZGVmIENPTkZJR19GUk9OVFNXQVAKKwkJLyogYWxsb3cgc3BhY2UgZm9yIGZyb250c3dhcCBwYWdlcyB0byBiZSByZXBhdHJpYXRlZCAqLworCQlpZiAoZnJvbnRzd2FwX3NlbGZzaHJpbmtpbmcgJiYgZnJvbnRzd2FwX2VuYWJsZWQpCisJCQlnb2FsX3BhZ2VzICs9IGZyb250c3dhcF9jdXJyX3BhZ2VzKCk7CisjZW5kaWYKKwkJaWYgKGN1cl9wYWdlcyA+IGdvYWxfcGFnZXMpCisJCQl0Z3RfcGFnZXMgPSBjdXJfcGFnZXMgLQorCQkJCSgoY3VyX3BhZ2VzIC0gZ29hbF9wYWdlcykgLworCQkJCSAgc2VsZmJhbGxvb25fZG93bmh5c3RlcmVzaXMpOworCQllbHNlIGlmIChjdXJfcGFnZXMgPCBnb2FsX3BhZ2VzKQorCQkJdGd0X3BhZ2VzID0gY3VyX3BhZ2VzICsKKwkJCQkoKGdvYWxfcGFnZXMgLSBjdXJfcGFnZXMpIC8KKwkJCQkgIHNlbGZiYWxsb29uX3VwaHlzdGVyZXNpcyk7CisJCS8qIGVsc2UgaWYgY3VyX3BhZ2VzID09IGdvYWxfcGFnZXMsIG5vIGNoYW5nZSAqLworCQliYWxsb29uX3NldF9uZXdfdGFyZ2V0KHRndF9wYWdlcyk7CisJCXJlc2V0X3RpbWVyID0gdHJ1ZTsKKwl9CisjaWZkZWYgQ09ORklHX0ZST05UU1dBUAorCWlmIChmcm9udHN3YXBfc2VsZnNocmlua2luZyAmJiBmcm9udHN3YXBfZW5hYmxlZCkgeworCQlmcm9udHN3YXBfc2VsZnNocmluaygpOworCQlyZXNldF90aW1lciA9IHRydWU7CisJfQorI2VuZGlmCisJaWYgKHJlc2V0X3RpbWVyKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnNlbGZiYWxsb29uX3dvcmtlciwKKwkJCXNlbGZiYWxsb29uX2ludGVydmFsICogSFopOworfQorCisjaWZkZWYgQ09ORklHX1NZU0ZTCisKKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisKKyNkZWZpbmUgU0VMRkJBTExPT05fU0hPVyhuYW1lLCBmb3JtYXQsIGFyZ3MuLi4pCQkJCVwKKwlzdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAlcCisJCQkJCSAgIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLCBcCisJCQkJCSAgIGNoYXIgKmJ1ZikgXAorCXsgXAorCQlyZXR1cm4gc3ByaW50ZihidWYsIGZvcm1hdCwgIyNhcmdzKTsgXAorCX0KKworU0VMRkJBTExPT05fU0hPVyhzZWxmYmFsbG9vbmluZywgIiVkXG4iLCB4ZW5fc2VsZmJhbGxvb25pbmdfZW5hYmxlZCk7CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3NlbGZiYWxsb29uaW5nKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLAorCQkJICAgIHNpemVfdCBjb3VudCkKK3sKKwlib29sIHdhc19lbmFibGVkID0geGVuX3NlbGZiYWxsb29uaW5nX2VuYWJsZWQ7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IGVycjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ0bXApOworCWlmIChlcnIgfHwgKCh0bXAgIT0gMCkgJiYgKHRtcCAhPSAxKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJeGVuX3NlbGZiYWxsb29uaW5nX2VuYWJsZWQgPSAhIXRtcDsKKwlpZiAoIXdhc19lbmFibGVkICYmIHhlbl9zZWxmYmFsbG9vbmluZ19lbmFibGVkKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnNlbGZiYWxsb29uX3dvcmtlciwKKwkJCXNlbGZiYWxsb29uX2ludGVydmFsICogSFopOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgU1lTREVWX0FUVFIoc2VsZmJhbGxvb25pbmcsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBzaG93X3NlbGZiYWxsb29uaW5nLCBzdG9yZV9zZWxmYmFsbG9vbmluZyk7CisKK1NFTEZCQUxMT09OX1NIT1coc2VsZmJhbGxvb25faW50ZXJ2YWwsICIlZFxuIiwgc2VsZmJhbGxvb25faW50ZXJ2YWwpOworCitzdGF0aWMgc3NpemVfdCBzdG9yZV9zZWxmYmFsbG9vbl9pbnRlcnZhbChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJICBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IGVycjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAoZXJyIHx8IHZhbCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzZWxmYmFsbG9vbl9pbnRlcnZhbCA9IHZhbDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBTWVNERVZfQVRUUihzZWxmYmFsbG9vbl9pbnRlcnZhbCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHNob3dfc2VsZmJhbGxvb25faW50ZXJ2YWwsIHN0b3JlX3NlbGZiYWxsb29uX2ludGVydmFsKTsKKworU0VMRkJBTExPT05fU0hPVyhzZWxmYmFsbG9vbl9kb3duaHlzLCAiJWRcbiIsIHNlbGZiYWxsb29uX2Rvd25oeXN0ZXJlc2lzKTsKKworc3RhdGljIHNzaXplX3Qgc3RvcmVfc2VsZmJhbGxvb25fZG93bmh5cyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsCisJCQkJCSBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IGVycjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAoZXJyIHx8IHZhbCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzZWxmYmFsbG9vbl9kb3duaHlzdGVyZXNpcyA9IHZhbDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBTWVNERVZfQVRUUihzZWxmYmFsbG9vbl9kb3duaHlzdGVyZXNpcywgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHNob3dfc2VsZmJhbGxvb25fZG93bmh5cywgc3RvcmVfc2VsZmJhbGxvb25fZG93bmh5cyk7CisKKworU0VMRkJBTExPT05fU0hPVyhzZWxmYmFsbG9vbl91cGh5cywgIiVkXG4iLCBzZWxmYmFsbG9vbl91cGh5c3RlcmVzaXMpOworCitzdGF0aWMgc3NpemVfdCBzdG9yZV9zZWxmYmFsbG9vbl91cGh5cyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgICAgICBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IGVycjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAoZXJyIHx8IHZhbCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzZWxmYmFsbG9vbl91cGh5c3RlcmVzaXMgPSB2YWw7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgU1lTREVWX0FUVFIoc2VsZmJhbGxvb25fdXBoeXN0ZXJlc2lzLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgc2hvd19zZWxmYmFsbG9vbl91cGh5cywgc3RvcmVfc2VsZmJhbGxvb25fdXBoeXMpOworCisjaWZkZWYgQ09ORklHX0ZST05UU1dBUAorU0VMRkJBTExPT05fU0hPVyhmcm9udHN3YXBfc2VsZnNocmlua2luZywgIiVkXG4iLCBmcm9udHN3YXBfc2VsZnNocmlua2luZyk7CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2Zyb250c3dhcF9zZWxmc2hyaW5raW5nKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLAorCQkJCQkgICAgIHNpemVfdCBjb3VudCkKK3sKKwlib29sIHdhc19lbmFibGVkID0gZnJvbnRzd2FwX3NlbGZzaHJpbmtpbmc7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IGVycjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdG1wKTsKKwlpZiAoZXJyIHx8ICgodG1wICE9IDApICYmICh0bXAgIT0gMSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmcm9udHN3YXBfc2VsZnNocmlua2luZyA9ICEhdG1wOworCWlmICghd2FzX2VuYWJsZWQgJiYgIXhlbl9zZWxmYmFsbG9vbmluZ19lbmFibGVkICYmCisJICAgICBmcm9udHN3YXBfc2VsZnNocmlua2luZykKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzZWxmYmFsbG9vbl93b3JrZXIsCisJCQlzZWxmYmFsbG9vbl9pbnRlcnZhbCAqIEhaKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIFNZU0RFVl9BVFRSKGZyb250c3dhcF9zZWxmc2hyaW5raW5nLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgc2hvd19mcm9udHN3YXBfc2VsZnNocmlua2luZywgc3RvcmVfZnJvbnRzd2FwX3NlbGZzaHJpbmtpbmcpOworCitTRUxGQkFMTE9PTl9TSE9XKGZyb250c3dhcF9pbmVydGlhLCAiJWRcbiIsIGZyb250c3dhcF9pbmVydGlhKTsKKworc3RhdGljIHNzaXplX3Qgc3RvcmVfZnJvbnRzd2FwX2luZXJ0aWEoc3RydWN0IHN5c19kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICAgICAgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBlcnI7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJZXJyID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7CisJaWYgKGVyciB8fCB2YWwgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZnJvbnRzd2FwX2luZXJ0aWEgPSB2YWw7CisJZnJvbnRzd2FwX2luZXJ0aWFfY291bnRlciA9IHZhbDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBTWVNERVZfQVRUUihmcm9udHN3YXBfaW5lcnRpYSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHNob3dfZnJvbnRzd2FwX2luZXJ0aWEsIHN0b3JlX2Zyb250c3dhcF9pbmVydGlhKTsKKworU0VMRkJBTExPT05fU0hPVyhmcm9udHN3YXBfaHlzdGVyZXNpcywgIiVkXG4iLCBmcm9udHN3YXBfaHlzdGVyZXNpcyk7CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2Zyb250c3dhcF9oeXN0ZXJlc2lzKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY29uc3QgY2hhciAqYnVmLAorCQkJCQkgIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgZXJyOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChlcnIgfHwgdmFsID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWZyb250c3dhcF9oeXN0ZXJlc2lzID0gdmFsOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIFNZU0RFVl9BVFRSKGZyb250c3dhcF9oeXN0ZXJlc2lzLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgc2hvd19mcm9udHN3YXBfaHlzdGVyZXNpcywgc3RvcmVfZnJvbnRzd2FwX2h5c3RlcmVzaXMpOworCisjZW5kaWYgLyogQ09ORklHX0ZST05UU1dBUCAqLworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2VsZmJhbGxvb25fYXR0cnNbXSA9IHsKKwkmYXR0cl9zZWxmYmFsbG9vbmluZy5hdHRyLAorCSZhdHRyX3NlbGZiYWxsb29uX2ludGVydmFsLmF0dHIsCisJJmF0dHJfc2VsZmJhbGxvb25fZG93bmh5c3RlcmVzaXMuYXR0ciwKKwkmYXR0cl9zZWxmYmFsbG9vbl91cGh5c3RlcmVzaXMuYXR0ciwKKyNpZmRlZiBDT05GSUdfRlJPTlRTV0FQCisJJmF0dHJfZnJvbnRzd2FwX3NlbGZzaHJpbmtpbmcuYXR0ciwKKwkmYXR0cl9mcm9udHN3YXBfaHlzdGVyZXNpcy5hdHRyLAorCSZhdHRyX2Zyb250c3dhcF9pbmVydGlhLmF0dHIsCisjZW5kaWYKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBzZWxmYmFsbG9vbl9ncm91cCA9IHsKKwkubmFtZSA9ICJzZWxmYmFsbG9vbiIsCisJLmF0dHJzID0gc2VsZmJhbGxvb25fYXR0cnMKK307CisjZW5kaWYKKworaW50IHJlZ2lzdGVyX3hlbl9zZWxmYmFsbG9vbmluZyhzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KQoreworCWludCBlcnJvciA9IC0xOworCisjaWZkZWYgQ09ORklHX1NZU0ZTCisJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c2Rldi0+a29iaiwgJnNlbGZiYWxsb29uX2dyb3VwKTsKKyNlbmRpZgorCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfeGVuX3NlbGZiYWxsb29uaW5nKTsKKworc3RhdGljIGludCBfX2luaXQgeGVuX3NlbGZiYWxsb29uX2luaXQodm9pZCkKK3sKKwlib29sIGVuYWJsZSA9IGZhbHNlOworCisJaWYgKCF4ZW5fZG9tYWluKCkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHhlbl9pbml0aWFsX2RvbWFpbigpKSB7CisJCXByX2luZm8oInhlbi9iYWxsb29uOiBYZW4gc2VsZmJhbGxvb25pbmcgZHJpdmVyICIKKwkJCQkiZGlzYWJsZWQgZm9yIGRvbWFpbjAuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJeGVuX3NlbGZiYWxsb29uaW5nX2VuYWJsZWQgPSB0bWVtX2VuYWJsZWQgJiYgdXNlX3NlbGZiYWxsb29uaW5nOworCWlmICh4ZW5fc2VsZmJhbGxvb25pbmdfZW5hYmxlZCkgeworCQlwcl9pbmZvKCJ4ZW4vYmFsbG9vbjogSW5pdGlhbGl6aW5nIFhlbiAiCisJCQkJCSJzZWxmYmFsbG9vbmluZyBkcml2ZXIuXG4iKTsKKwkJZW5hYmxlID0gdHJ1ZTsKKwl9CisjaWZkZWYgQ09ORklHX0ZST05UU1dBUAorCWZyb250c3dhcF9zZWxmc2hyaW5raW5nID0gdG1lbV9lbmFibGVkICYmIHVzZV9mcm9udHN3YXBfc2VsZnNocmluazsKKwlpZiAoZnJvbnRzd2FwX3NlbGZzaHJpbmtpbmcpIHsKKwkJcHJfaW5mbygieGVuL2JhbGxvb246IEluaXRpYWxpemluZyBmcm9udHN3YXAgIgorCQkJCQkic2VsZnNocmlua2luZyBkcml2ZXIuXG4iKTsKKwkJZW5hYmxlID0gdHJ1ZTsKKwl9CisjZW5kaWYKKwlpZiAoIWVuYWJsZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnNlbGZiYWxsb29uX3dvcmtlciwgc2VsZmJhbGxvb25faW50ZXJ2YWwgKiBIWik7CisKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKHhlbl9zZWxmYmFsbG9vbl9pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCmluZGV4IDczOTc2OTUuLmJkMmY5MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYworKysgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKQEAgLTM3OCwyNiArMzc4LDMyIEBACiAJCWtmcmVlKHRvX3hlbmJ1c19kZXZpY2UoZGV2KSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHhlbmRldl9zaG93X25vZGVuYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IG5vZGVuYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCB0b194ZW5idXNfZGV2aWNlKGRldiktPm5vZGVuYW1lKTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihub2RlbmFtZSwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCB4ZW5kZXZfc2hvd19ub2RlbmFtZSwgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHhlbmRldl9zaG93X2RldnR5cGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBkZXZ0eXBlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHRvX3hlbmJ1c19kZXZpY2UoZGV2KS0+ZGV2aWNldHlwZSk7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGV2dHlwZSwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCB4ZW5kZXZfc2hvd19kZXZ0eXBlLCBOVUxMKTsKIAotc3RhdGljIHNzaXplX3QgeGVuZGV2X3Nob3dfbW9kYWxpYXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAieGVuOiVzXG4iLCB0b194ZW5idXNfZGV2aWNlKGRldiktPmRldmljZXR5cGUpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzOiVzXG4iLCBkZXYtPmJ1cy0+bmFtZSwKKwkJICAgICAgIHRvX3hlbmJ1c19kZXZpY2UoZGV2KS0+ZGV2aWNldHlwZSk7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kYWxpYXMsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwgeGVuZGV2X3Nob3dfbW9kYWxpYXMsIE5VTEwpOworCitzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB4ZW5idXNfZGV2X2F0dHJzW10gPSB7CisJX19BVFRSX1JPKG5vZGVuYW1lKSwKKwlfX0FUVFJfUk8oZGV2dHlwZSksCisJX19BVFRSX1JPKG1vZGFsaWFzKSwKKwlfX0FUVFJfTlVMTAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHhlbmJ1c19kZXZfYXR0cnMpOwogCiBpbnQgeGVuYnVzX3Byb2JlX25vZGUoc3RydWN0IHhlbl9idXNfdHlwZSAqYnVzLAogCQkgICAgICBjb25zdCBjaGFyICp0eXBlLApAQCAtNDQ5LDI1ICs0NTUsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZmFpbDsKIAotCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmeGVuZGV2LT5kZXYsICZkZXZfYXR0cl9ub2RlbmFtZSk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsX3VucmVnaXN0ZXI7Ci0KLQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnhlbmRldi0+ZGV2LCAmZGV2X2F0dHJfZGV2dHlwZSk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsX3JlbW92ZV9ub2RlbmFtZTsKLQotCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmeGVuZGV2LT5kZXYsICZkZXZfYXR0cl9tb2RhbGlhcyk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsX3JlbW92ZV9kZXZ0eXBlOwotCiAJcmV0dXJuIDA7Ci1mYWlsX3JlbW92ZV9kZXZ0eXBlOgotCWRldmljZV9yZW1vdmVfZmlsZSgmeGVuZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZ0eXBlKTsKLWZhaWxfcmVtb3ZlX25vZGVuYW1lOgotCWRldmljZV9yZW1vdmVfZmlsZSgmeGVuZGV2LT5kZXYsICZkZXZfYXR0cl9ub2RlbmFtZSk7Ci1mYWlsX3VucmVnaXN0ZXI6Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJnhlbmRldi0+ZGV2KTsKIGZhaWw6CiAJa2ZyZWUoeGVuZGV2KTsKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5oIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5oCmluZGV4IDg4OGI5OTAuLmI4MTQ5MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuaAorKysgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmgKQEAgLTQ4LDYgKzQ4LDggQEAKIAlzdHJ1Y3QgYnVzX3R5cGUgYnVzOwogfTsKIAorZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHhlbmJ1c19kZXZfYXR0cnNbXTsKKwogZXh0ZXJuIGludCB4ZW5idXNfbWF0Y2goc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpOwogZXh0ZXJuIGludCB4ZW5idXNfZGV2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKl9kZXYpOwogZXh0ZXJuIGludCB4ZW5idXNfZGV2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmVfYmFja2VuZC5jIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9iYWNrZW5kLmMKaW5kZXggNmNmNDY3Yi4uNjBhZGY5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9iYWNrZW5kLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9iYWNrZW5kLmMKQEAgLTEwNyw2ICsxMDcsOSBAQAogCWlmICh4ZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPXhlbi1iYWNrZW5kOiVzIiwgeGRldi0+ZGV2aWNldHlwZSkpCisJCXJldHVybiAtRU5PTUVNOworCiAJLyogc3R1ZmYgd2Ugd2FudCB0byBwYXNzIHRvIC9zYmluL2hvdHBsdWcgKi8KIAlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiWEVOQlVTX1RZUEU9JXMiLCB4ZGV2LT5kZXZpY2V0eXBlKSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xODMsMTAgKzE4Niw2IEBACiAJeGVuYnVzX290aGVyZW5kX2NoYW5nZWQod2F0Y2gsIHZlYywgbGVuLCAwKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHhlbmJ1c19iYWNrZW5kX2Rldl9hdHRyc1tdID0gewotCV9fQVRUUl9OVUxMCi19OwotCiBzdGF0aWMgc3RydWN0IHhlbl9idXNfdHlwZSB4ZW5idXNfYmFja2VuZCA9IHsKIAkucm9vdCA9ICJiYWNrZW5kIiwKIAkubGV2ZWxzID0gMywJCS8qIGJhY2tlbmQvdHlwZS88ZnJvbnRlbmQ+LzxpZD4gKi8KQEAgLTIwMCw3ICsxOTksNyBAQAogCQkucHJvYmUJCT0geGVuYnVzX2Rldl9wcm9iZSwKIAkJLnJlbW92ZQkJPSB4ZW5idXNfZGV2X3JlbW92ZSwKIAkJLnNodXRkb3duCT0geGVuYnVzX2Rldl9zaHV0ZG93biwKLQkJLmRldl9hdHRycwk9IHhlbmJ1c19iYWNrZW5kX2Rldl9hdHRycywKKwkJLmRldl9hdHRycwk9IHhlbmJ1c19kZXZfYXR0cnMsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmVfZnJvbnRlbmQuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmVfZnJvbnRlbmQuYwppbmRleCBiNmEyNjkwLi5lZDJiYTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9mcm9udGVuZC5jCkBAIC04MSwxMCArODEsNiBAQAogCXhlbmJ1c19vdGhlcmVuZF9jaGFuZ2VkKHdhdGNoLCB2ZWMsIGxlbiwgMSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB4ZW5idXNfZnJvbnRlbmRfZGV2X2F0dHJzW10gPSB7Ci0JX19BVFRSX05VTEwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB4ZW5idXNfcG1fb3BzID0gewogCS5zdXNwZW5kCT0geGVuYnVzX2Rldl9zdXNwZW5kLAogCS5yZXN1bWUJCT0geGVuYnVzX2Rldl9yZXN1bWUsCkBAIC0xMDYsNyArMTAyLDcgQEAKIAkJLnByb2JlCQk9IHhlbmJ1c19kZXZfcHJvYmUsCiAJCS5yZW1vdmUJCT0geGVuYnVzX2Rldl9yZW1vdmUsCiAJCS5zaHV0ZG93bgk9IHhlbmJ1c19kZXZfc2h1dGRvd24sCi0JCS5kZXZfYXR0cnMJPSB4ZW5idXNfZnJvbnRlbmRfZGV2X2F0dHJzLAorCQkuZGV2X2F0dHJzCT0geGVuYnVzX2Rldl9hdHRycywKIAogCQkucG0JCT0gJnhlbmJ1c19wbV9vcHMsCiAJfSwKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL01ha2VmaWxlIGIvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggMGQxNWEzZC4uNWY0M2JmYiAxMDA2NDQKLS0tIGEvZmlybXdhcmUvTWFrZWZpbGUKKysrIGIvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTgyLDYgKzgyLDcgQEAKIGZ3LXNoaXBwZWQtJChDT05GSUdfUENNQ0lBX1NNQzkxQzkyKSArPSBvc2l0ZWNoL1hpbGlueDdPRC5iaW4KIGZ3LXNoaXBwZWQtJChDT05GSUdfU0NTSV9BRFZBTlNZUykgKz0gYWR2YW5zeXMvbWNvZGUuYmluIGFkdmFuc3lzLzM4QzE2MDAuYmluIFwKIAkJCQkgICAgICBhZHZhbnN5cy8zNTUwLmJpbiBhZHZhbnN5cy8zOEMwODAwLmJpbgorZnctc2hpcHBlZC0kKENPTkZJR19TQ1NJX0lTQ0kpICs9IGlzY2kvaXNjaV9maXJtd2FyZS5iaW4KIGZ3LXNoaXBwZWQtJChDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCkgKz0gcWxvZ2ljLzEwNDAuYmluIHFsb2dpYy8xMjgwLmJpbiBcCiAJCQkJCSBxbG9naWMvMTIxNjAuYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX1NDU0lfUUxPR0lDUFRJKSArPSBxbG9naWMvaXNwMTAwMC5iaW4KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2lzY2kvaXNjaV9maXJtd2FyZS5iaW4uaWhleCBiL2Zpcm13YXJlL2lzY2kvaXNjaV9maXJtd2FyZS5iaW4uaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTY2MTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvaXNjaS9pc2NpX2Zpcm13YXJlLmJpbi5paGV4CkBAIC0wLDAgKzEsMTYgQEAKKzoxMDAwMDAwMDQ5NTM0MzU1NEY0NTRENDJFODAwMTgxMDAwMDIwMDAwODcKKzoxMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMTAxMDAwMDAwMDAwMDAwREUKKzoxMDAwMjAwMEZGRkZDRjVGMDEwMDAwMDAwOEREMEIwMDAwRkMwRjAwQTgKKzoxMDAwMzAwMDA5N0MwQjAwNkVGQzBBMDBGRkZGQ0Y1RjAxMDAwMDAwOEYKKzoxMDAwNDAwMDA4REQwQjAwMDBGQzBGMDAwOTdDMEIwMDZFRkMwQTAwQjEKKzoxMDAwNTAwMEZGRkZDRjVGMDEwMDAwMDAwOEREMEIwMDAwRkMwRjAwNzgKKzoxMDAwNjAwMDA5N0MwQjAwNkVGQzBBMDBGRkZGQ0Y1RjAxMDAwMDAwNUYKKzoxMDAwNzAwMDA4REQwQjAwMDBGQzBGMDAwOTdDMEIwMDZFRkMwQTAwODEKKzoxMDAwODAwMDAxMDEwMDAwMDAwMDAwMDBGRkZGQ0Y1RjAyMDAwMDAwNDAKKzoxMDAwOTAwMDA4REQwQjAwMDBGQzBGMDAwOTdDMEIwMDZFRkMwQTAwNjEKKzoxMDAwQTAwMEZGRkZDRjVGMDIwMDAwMDAwOEREMEIwMDAwRkMwRjAwMjcKKzoxMDAwQjAwMDA5N0MwQjAwNkVGQzBBMDBGRkZGQ0Y1RjAyMDAwMDAwMEUKKzoxMDAwQzAwMDA4REQwQjAwMDBGQzBGMDAwOTdDMEIwMDZFRkMwQTAwMzEKKzoxMDAwRDAwMEZGRkZDRjVGMDIwMDAwMDAwOEREMEIwMDAwRkMwRjAwRjcKKzowODAwRTAwMDA5N0MwQjAwNkVGQzBBMDAxNAorOjAwMDAwMDAxRkYKZGlmZiAtLWdpdCBhL2ZzLzlwL2FjbC5jIGIvZnMvOXAvYWNsLmMKaW5kZXggNTM1YWI2ZS4uODE0YmUwNyAxMDA2NDQKLS0tIGEvZnMvOXAvYWNsLmMKKysrIGIvZnMvOXAvYWNsLmMKQEAgLTk2LDE0ICs5NiwxMSBAQAogCXJldHVybiBhY2w7CiB9CiAKLWludCB2OWZzX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQorc3RydWN0IHBvc2l4X2FjbCAqdjlmc19pb3BfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKIAotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKLQogCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhpbm9kZSk7CiAJaWYgKCgodjlzZXMtPmZsYWdzICYgVjlGU19BQ0NFU1NfTUFTSykgIT0gVjlGU19BQ0NFU1NfQ0xJRU5UKSB8fAogCQkJKCh2OXNlcy0+ZmxhZ3MgJiBWOUZTX0FDTF9NQVNLKSAhPSBWOUZTX1BPU0lYX0FDTCkpIHsKQEAgLTExMSwxOCArMTA4LDEwIEBACiAJCSAqIE9uIGFjY2VzcyA9IGNsaWVudCAgYW5kIGFjbCA9IG9uIG1vZGUgZ2V0IHRoZSBhY2wKIAkJICogdmFsdWVzIGZyb20gdGhlIHNlcnZlcgogCQkgKi8KLQkJcmV0dXJuIDA7CisJCXJldHVybiBOVUxMOwogCX0KLQlhY2wgPSB2OWZzX2dldF9jYWNoZWRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOworCXJldHVybiB2OWZzX2dldF9jYWNoZWRfYWNsKGlub2RlLCB0eXBlKTsKIAotCWlmIChJU19FUlIoYWNsKSkKLQkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKLQlpZiAoYWNsKSB7Ci0JCWludCBlcnJvciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBhY2wsIG1hc2spOwotCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCXJldHVybiAtRUFHQUlOOwogfQogCiBzdGF0aWMgaW50IHY5ZnNfc2V0X2FjbChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCB0eXBlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCkBAIC0xNjUsMzIgKzE1NCwzMiBAQAogaW50IHY5ZnNfYWNsX2NobW9kKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpjbG9uZTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAogCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJYWNsID0gdjlmc19nZXRfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKIAlpZiAoYWNsKSB7Ci0JCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX0tFUk5FTCk7CisJCXJldHZhbCA9IHBvc2l4X2FjbF9jaG1vZCgmYWNsLCBHRlBfS0VSTkVMLCBpbm9kZS0+aV9tb2RlKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCXJldHZhbCA9IHY5ZnNfc2V0X2FjbChkZW50cnksIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKIAkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKLQkJaWYgKCFjbG9uZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlyZXR2YWwgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7Ci0JCWlmICghcmV0dmFsKQotCQkJcmV0dmFsID0gdjlmc19zZXRfYWNsKGRlbnRyeSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7Ci0JCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKIAl9CiAJcmV0dXJuIHJldHZhbDsKIH0KIAogaW50IHY5ZnNfc2V0X2NyZWF0ZV9hY2woc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJc3RydWN0IHBvc2l4X2FjbCAqZHBhY2wsIHN0cnVjdCBwb3NpeF9hY2wgKnBhY2wpCisJCQlzdHJ1Y3QgcG9zaXhfYWNsICoqZHBhY2wsIHN0cnVjdCBwb3NpeF9hY2wgKipwYWNsKQogewotCXY5ZnNfc2V0X2FjbChkZW50cnksIEFDTF9UWVBFX0RFRkFVTFQsIGRwYWNsKTsKLQl2OWZzX3NldF9hY2woZGVudHJ5LCBBQ0xfVFlQRV9BQ0NFU1MsIHBhY2wpOwotCXBvc2l4X2FjbF9yZWxlYXNlKGRwYWNsKTsKLQlwb3NpeF9hY2xfcmVsZWFzZShwYWNsKTsKKwlpZiAoZGVudHJ5KSB7CisJCXY5ZnNfc2V0X2FjbChkZW50cnksIEFDTF9UWVBFX0RFRkFVTFQsICpkcGFjbCk7CisJCXY5ZnNfc2V0X2FjbChkZW50cnksIEFDTF9UWVBFX0FDQ0VTUywgKnBhY2wpOworCX0KKwlwb3NpeF9hY2xfcmVsZWFzZSgqZHBhY2wpOworCXBvc2l4X2FjbF9yZWxlYXNlKCpwYWNsKTsKKwkqZHBhY2wgPSAqcGFjbCA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwOSwyOSArMTk4LDE4IEBACiAJCQltb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJfQogCWlmIChhY2wpIHsKLQkJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmU7Ci0KIAkJaWYgKFNfSVNESVIobW9kZSkpCi0JCQkqZHBhY2wgPSBhY2w7Ci0JCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX05PRlMpOwotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlpZiAoIWNsb25lKQotCQkJZ290byBjbGVhbnVwOwotCi0JCXJldHZhbCA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShjbG9uZSwgJm1vZGUpOwotCQlpZiAocmV0dmFsIDwgMCkgewotCQkJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOwotCQkJZ290byBjbGVhbnVwOwotCQl9CisJCQkqZHBhY2wgPSBwb3NpeF9hY2xfZHVwKGFjbCk7CisJCXJldHZhbCA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZtb2RlKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcmV0dmFsOwogCQlpZiAocmV0dmFsID4gMCkKLQkJCSpwYWNsID0gY2xvbmU7CisJCQkqcGFjbCA9IGFjbDsKKwkJZWxzZQorCQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKIAl9CiAJKm1vZGVwICA9IG1vZGU7CiAJcmV0dXJuIDA7Ci1jbGVhbnVwOgotCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7Ci0JcmV0dXJuIHJldHZhbDsKLQogfQogCiBzdGF0aWMgaW50IHY5ZnNfcmVtb3RlX2dldF9hY2woc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLApkaWZmIC0tZ2l0IGEvZnMvOXAvYWNsLmggYi9mcy85cC9hY2wuaAppbmRleCA3ZWYzYWM5Li5kZGI3YWUxIDEwMDY0NAotLS0gYS9mcy85cC9hY2wuaAorKysgYi9mcy85cC9hY2wuaApAQCAtMTYsMTQgKzE2LDE0IEBACiAKICNpZmRlZiBDT05GSUdfOVBfRlNfUE9TSVhfQUNMCiBleHRlcm4gaW50IHY5ZnNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHA5X2ZpZCAqKTsKLWV4dGVybiBpbnQgdjlmc19jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncyk7CitleHRlcm4gc3RydWN0IHBvc2l4X2FjbCAqdjlmc19pb3BfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSk7CiBleHRlcm4gaW50IHY5ZnNfYWNsX2NobW9kKHN0cnVjdCBkZW50cnkgKik7CiBleHRlcm4gaW50IHY5ZnNfc2V0X2NyZWF0ZV9hY2woc3RydWN0IGRlbnRyeSAqLAotCQkJICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKiwgc3RydWN0IHBvc2l4X2FjbCAqKTsKKwkJCSAgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICoqLCBzdHJ1Y3QgcG9zaXhfYWNsICoqKTsKIGV4dGVybiBpbnQgdjlmc19hY2xfbW9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgbW9kZV90ICptb2RlcCwKIAkJCSBzdHJ1Y3QgcG9zaXhfYWNsICoqZHBhY2wsIHN0cnVjdCBwb3NpeF9hY2wgKipwYWNsKTsKICNlbHNlCi0jZGVmaW5lIHY5ZnNfY2hlY2tfYWNsIE5VTEwKKyNkZWZpbmUgdjlmc19pb3BfZ2V0X2FjbCBOVUxMCiBzdGF0aWMgaW5saW5lIGludCB2OWZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHA5X2ZpZCAqZmlkKQogewogCXJldHVybiAwOwpAQCAtMzMsOCArMzMsOCBAQAogCXJldHVybiAwOwogfQogc3RhdGljIGlubGluZSBpbnQgdjlmc19zZXRfY3JlYXRlX2FjbChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCQkJICAgICAgc3RydWN0IHBvc2l4X2FjbCAqZHBhY2wsCi0JCQkJICAgICAgc3RydWN0IHBvc2l4X2FjbCAqcGFjbCkKKwkJCQkgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICoqZHBhY2wsCisJCQkJICAgICAgc3RydWN0IHBvc2l4X2FjbCAqKnBhY2wpCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy85cC9jYWNoZS5jIGIvZnMvOXAvY2FjaGUuYwppbmRleCA1YjMzNWM1Li45NDVhYTVmIDEwMDY0NAotLS0gYS9mcy85cC9jYWNoZS5jCisrKyBiL2ZzLzlwL2NhY2hlLmMKQEAgLTEwOCwxMSArMTA4LDEwIEBACiAJCQkJCSB2b2lkICpidWZmZXIsIHVpbnQxNl90IGJ1Zm1heCkKIHsKIAljb25zdCBzdHJ1Y3Qgdjlmc19pbm9kZSAqdjlpbm9kZSA9IGNvb2tpZV9uZXRmc19kYXRhOwotCW1lbWNweShidWZmZXIsICZ2OWlub2RlLT5mc2NhY2hlX2tleS0+cGF0aCwKLQkgICAgICAgc2l6ZW9mKHY5aW5vZGUtPmZzY2FjaGVfa2V5LT5wYXRoKSk7CisJbWVtY3B5KGJ1ZmZlciwgJnY5aW5vZGUtPnFpZC5wYXRoLCBzaXplb2Yodjlpbm9kZS0+cWlkLnBhdGgpKTsKIAlQOV9EUFJJTlRLKFA5X0RFQlVHX0ZTQywgImlub2RlICVwIGdldCBrZXkgJWxsdSIsICZ2OWlub2RlLT52ZnNfaW5vZGUsCi0JCSAgIHY5aW5vZGUtPmZzY2FjaGVfa2V5LT5wYXRoKTsKLQlyZXR1cm4gc2l6ZW9mKHY5aW5vZGUtPmZzY2FjaGVfa2V5LT5wYXRoKTsKKwkJICAgdjlpbm9kZS0+cWlkLnBhdGgpOworCXJldHVybiBzaXplb2Yodjlpbm9kZS0+cWlkLnBhdGgpOwogfQogCiBzdGF0aWMgdm9pZCB2OWZzX2NhY2hlX2lub2RlX2dldF9hdHRyKGNvbnN0IHZvaWQgKmNvb2tpZV9uZXRmc19kYXRhLApAQCAtMTI5LDExICsxMjgsMTAgQEAKIAkJCQkJIHZvaWQgKmJ1ZmZlciwgdWludDE2X3QgYnVmbGVuKQogewogCWNvbnN0IHN0cnVjdCB2OWZzX2lub2RlICp2OWlub2RlID0gY29va2llX25ldGZzX2RhdGE7Ci0JbWVtY3B5KGJ1ZmZlciwgJnY5aW5vZGUtPmZzY2FjaGVfa2V5LT52ZXJzaW9uLAotCSAgICAgICBzaXplb2Yodjlpbm9kZS0+ZnNjYWNoZV9rZXktPnZlcnNpb24pKTsKKwltZW1jcHkoYnVmZmVyLCAmdjlpbm9kZS0+cWlkLnZlcnNpb24sIHNpemVvZih2OWlub2RlLT5xaWQudmVyc2lvbikpOwogCVA5X0RQUklOVEsoUDlfREVCVUdfRlNDLCAiaW5vZGUgJXAgZ2V0IGF1eCAldSIsICZ2OWlub2RlLT52ZnNfaW5vZGUsCi0JCSAgIHY5aW5vZGUtPmZzY2FjaGVfa2V5LT52ZXJzaW9uKTsKLQlyZXR1cm4gc2l6ZW9mKHY5aW5vZGUtPmZzY2FjaGVfa2V5LT52ZXJzaW9uKTsKKwkJICAgdjlpbm9kZS0+cWlkLnZlcnNpb24pOworCXJldHVybiBzaXplb2Yodjlpbm9kZS0+cWlkLnZlcnNpb24pOwogfQogCiBzdGF0aWMgZW51bQpAQCAtMTQzLDExICsxNDEsMTEgQEAKIHsKIAljb25zdCBzdHJ1Y3Qgdjlmc19pbm9kZSAqdjlpbm9kZSA9IGNvb2tpZV9uZXRmc19kYXRhOwogCi0JaWYgKGJ1ZmxlbiAhPSBzaXplb2Yodjlpbm9kZS0+ZnNjYWNoZV9rZXktPnZlcnNpb24pKQorCWlmIChidWZsZW4gIT0gc2l6ZW9mKHY5aW5vZGUtPnFpZC52ZXJzaW9uKSkKIAkJcmV0dXJuIEZTQ0FDSEVfQ0hFQ0tBVVhfT0JTT0xFVEU7CiAKLQlpZiAobWVtY21wKGJ1ZmZlciwgJnY5aW5vZGUtPmZzY2FjaGVfa2V5LT52ZXJzaW9uLAotCQkgICBzaXplb2Yodjlpbm9kZS0+ZnNjYWNoZV9rZXktPnZlcnNpb24pKSkKKwlpZiAobWVtY21wKGJ1ZmZlciwgJnY5aW5vZGUtPnFpZC52ZXJzaW9uLAorCQkgICBzaXplb2Yodjlpbm9kZS0+cWlkLnZlcnNpb24pKSkKIAkJcmV0dXJuIEZTQ0FDSEVfQ0hFQ0tBVVhfT0JTT0xFVEU7CiAKIAlyZXR1cm4gRlNDQUNIRV9DSEVDS0FVWF9PS0FZOwpkaWZmIC0tZ2l0IGEvZnMvOXAvY2FjaGUuaCBiL2ZzLzlwL2NhY2hlLmgKaW5kZXggMDQ5NTA3YS4uNDBjYzU0YyAxMDA2NDQKLS0tIGEvZnMvOXAvY2FjaGUuaAorKysgYi9mcy85cC9jYWNoZS5oCkBAIC05MywxNSArOTMsNiBAQAogCUJVR19PTihQYWdlRnNDYWNoZShwYWdlKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB2OWZzX2ZzY2FjaGVfc2V0X2tleShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQlzdHJ1Y3QgcDlfcWlkICpxaWQpCi17Ci0Jc3RydWN0IHY5ZnNfaW5vZGUgKnY5aW5vZGUgPSBWOUZTX0koaW5vZGUpOwotCXNwaW5fbG9jaygmdjlpbm9kZS0+ZnNjYWNoZV9sb2NrKTsKLQl2OWlub2RlLT5mc2NhY2hlX2tleSA9IHFpZDsKLQlzcGluX3VubG9jaygmdjlpbm9kZS0+ZnNjYWNoZV9sb2NrKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHY5ZnNfZnNjYWNoZV93YWl0X29uX3BhZ2Vfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCSAgIHN0cnVjdCBwYWdlICpwYWdlKQogewpkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmcy5jIGIvZnMvOXAvdjlmcy5jCmluZGV4IGM4MmIwMTcuLmVmOTY2MTggMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Y5ZnMuYworKysgYi9mcy85cC92OWZzLmMKQEAgLTc4LDYgKzc4LDI1IEBACiAJe09wdF9lcnIsIE5VTEx9CiB9OwogCisvKiBJbnRlcnByZXQgbW91bnQgb3B0aW9ucyBmb3IgY2FjaGUgbW9kZSAqLworc3RhdGljIGludCBnZXRfY2FjaGVfbW9kZShjaGFyICpzKQoreworCWludCB2ZXJzaW9uID0gLUVJTlZBTDsKKworCWlmICghc3RyY21wKHMsICJsb29zZSIpKSB7CisJCXZlcnNpb24gPSBDQUNIRV9MT09TRTsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIkNhY2hlIG1vZGU6IGxvb3NlXG4iKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAocywgImZzY2FjaGUiKSkgeworCQl2ZXJzaW9uID0gQ0FDSEVfRlNDQUNIRTsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIkNhY2hlIG1vZGU6IGZzY2FjaGVcbiIpOworCX0gZWxzZSBpZiAoIXN0cmNtcChzLCAibm9uZSIpKSB7CisJCXZlcnNpb24gPSBDQUNIRV9OT05FOworCQlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiQ2FjaGUgbW9kZTogbm9uZVxuIik7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gIjlwOiBVbmtub3duIENhY2hlIG1vZGUgJXMuXG4iLCBzKTsKKwlyZXR1cm4gdmVyc2lvbjsKK30KKwogLyoqCiAgKiB2OWZzX3BhcnNlX29wdGlvbnMgLSBwYXJzZSBtb3VudCBvcHRpb25zIGludG8gc2Vzc2lvbiBzdHJ1Y3R1cmUKICAqIEB2OXNlczogZXhpc3RpbmcgdjlmcyBzZXNzaW9uIGluZm9ybWF0aW9uCkBAIC05Nyw3ICsxMTYsNyBAQAogCS8qIHNldHVwIGRlZmF1bHRzICovCiAJdjlzZXMtPmFmaWQgPSB+MDsKIAl2OXNlcy0+ZGVidWcgPSAwOwotCXY5c2VzLT5jYWNoZSA9IDA7CisJdjlzZXMtPmNhY2hlID0gQ0FDSEVfTk9ORTsKICNpZmRlZiBDT05GSUdfOVBfRlNDQUNIRQogCXY5c2VzLT5jYWNoZXRhZyA9IE5VTEw7CiAjZW5kaWYKQEAgLTE3MSwxMyArMTkwLDEzIEBACiAJCQkJICAicHJvYmxlbSBhbGxvY2F0aW5nIGNvcHkgb2YgY2FjaGUgYXJnXG4iKTsKIAkJCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKIAkJCX0KKwkJCXJldCA9IGdldF9jYWNoZV9tb2RlKHMpOworCQkJaWYgKHJldCA9PSAtRUlOVkFMKSB7CisJCQkJa2ZyZWUocyk7CisJCQkJZ290byBmcmVlX2FuZF9yZXR1cm47CisJCQl9CiAKLQkJCWlmIChzdHJjbXAocywgImxvb3NlIikgPT0gMCkKLQkJCQl2OXNlcy0+Y2FjaGUgPSBDQUNIRV9MT09TRTsKLQkJCWVsc2UgaWYgKHN0cmNtcChzLCAiZnNjYWNoZSIpID09IDApCi0JCQkJdjlzZXMtPmNhY2hlID0gQ0FDSEVfRlNDQUNIRTsKLQkJCWVsc2UKLQkJCQl2OXNlcy0+Y2FjaGUgPSBDQUNIRV9OT05FOworCQkJdjlzZXMtPmNhY2hlID0gcmV0OwogCQkJa2ZyZWUocyk7CiAJCQlicmVhazsKIApAQCAtMjAwLDkgKzIxOSwxNSBAQAogCQkJfSBlbHNlIHsKIAkJCQl2OXNlcy0+ZmxhZ3MgfD0gVjlGU19BQ0NFU1NfU0lOR0xFOwogCQkJCXY5c2VzLT51aWQgPSBzaW1wbGVfc3RydG91bChzLCAmZSwgMTApOwotCQkJCWlmICgqZSAhPSAnXDAnKQotCQkJCQl2OXNlcy0+dWlkID0gfjA7CisJCQkJaWYgKCplICE9ICdcMCcpIHsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiOXA6IFVua25vd24gYWNjZXNzICIKKwkJCQkJCQkiYXJndW1lbnQgJXMuXG4iLCBzKTsKKwkJCQkJa2ZyZWUocyk7CisJCQkJCWdvdG8gZnJlZV9hbmRfcmV0dXJuOworCQkJCX0KIAkJCX0KKwogCQkJa2ZyZWUocyk7CiAJCQlicmVhazsKIApAQCAtNDg3LDggKzUxMiw4IEBACiAJc3RydWN0IHY5ZnNfaW5vZGUgKnY5aW5vZGUgPSAoc3RydWN0IHY5ZnNfaW5vZGUgKilmb287CiAjaWZkZWYgQ09ORklHXzlQX0ZTQ0FDSEUKIAl2OWlub2RlLT5mc2NhY2hlID0gTlVMTDsKLQl2OWlub2RlLT5mc2NhY2hlX2tleSA9IE5VTEw7CiAjZW5kaWYKKwltZW1zZXQoJnY5aW5vZGUtPnFpZCwgMCwgc2l6ZW9mKHY5aW5vZGUtPnFpZCkpOwogCWlub2RlX2luaXRfb25jZSgmdjlpbm9kZS0+dmZzX2lub2RlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmcy5oIGIvZnMvOXAvdjlmcy5oCmluZGV4IGU1ZWJlZGYuLmU3ODk1NmMgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Y5ZnMuaAorKysgYi9mcy85cC92OWZzLmgKQEAgLTEyNSw4ICsxMjUsOCBAQAogI2lmZGVmIENPTkZJR185UF9GU0NBQ0hFCiAJc3BpbmxvY2tfdCBmc2NhY2hlX2xvY2s7CiAJc3RydWN0IGZzY2FjaGVfY29va2llICpmc2NhY2hlOwotCXN0cnVjdCBwOV9xaWQgKmZzY2FjaGVfa2V5OwogI2VuZGlmCisJc3RydWN0IHA5X3FpZCBxaWQ7CiAJdW5zaWduZWQgaW50IGNhY2hlX3ZhbGlkaXR5OwogCXN0cnVjdCBwOV9maWQgKndyaXRlYmFja19maWQ7CiAJc3RydWN0IG11dGV4IHZfbXV0ZXg7CkBAIC0xNTMsMTMgKzE1MywxMyBAQAogCQkJdm9pZCAqcCk7CiBleHRlcm4gc3RydWN0IGlub2RlICp2OWZzX2lub2RlX2Zyb21fZmlkKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsCiAJCQkJCSBzdHJ1Y3QgcDlfZmlkICpmaWQsCi0JCQkJCSBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKwkJCQkJIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBuZXcpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnNfZG90bDsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uc19kb3RsOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zX2RvdGw7CiBleHRlcm4gc3RydWN0IGlub2RlICp2OWZzX2lub2RlX2Zyb21fZmlkX2RvdGwoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywKIAkJCQkJICAgICAgc3RydWN0IHA5X2ZpZCAqZmlkLAotCQkJCQkgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKwkJCQkJICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG5ldyk7CiAKIC8qIG90aGVyIGRlZmF1bHQgZ2xvYmFscyAqLwogI2RlZmluZSBWOUZTX1BPUlQJNTY0CkBAIC0yMDEsOCArMjAxLDI3IEBACiAJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCWlmICh2OWZzX3Byb3RvX2RvdGwodjlzZXMpKQotCQlyZXR1cm4gdjlmc19pbm9kZV9mcm9tX2ZpZF9kb3RsKHY5c2VzLCBmaWQsIHNiKTsKKwkJcmV0dXJuIHY5ZnNfaW5vZGVfZnJvbV9maWRfZG90bCh2OXNlcywgZmlkLCBzYiwgMCk7CiAJZWxzZQotCQlyZXR1cm4gdjlmc19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBzYik7CisJCXJldHVybiB2OWZzX2lub2RlX2Zyb21fZmlkKHY5c2VzLCBmaWQsIHNiLCAwKTsKIH0KKworLyoqCisgKiB2OWZzX2dldF9uZXdfaW5vZGVfZnJvbV9maWQgLSBIZWxwZXIgcm91dGluZSB0byBwb3B1bGF0ZSBhbiBpbm9kZSBieQorICogaXNzdWluZyBhIGF0dHJpYnV0ZSByZXF1ZXN0CisgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBmaWQ6IGZpZCB0byBpc3N1ZSBhdHRyaWJ1dGUgcmVxdWVzdCBmb3IKKyAqIEBzYjogc3VwZXJibG9jayBvbiB3aGljaCB0byBjcmVhdGUgaW5vZGUKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICoKK3Y5ZnNfZ2V0X25ld19pbm9kZV9mcm9tX2ZpZChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3QgcDlfZmlkICpmaWQsCisJCQkgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpZiAodjlmc19wcm90b19kb3RsKHY5c2VzKSkKKwkJcmV0dXJuIHY5ZnNfaW5vZGVfZnJvbV9maWRfZG90bCh2OXNlcywgZmlkLCBzYiwgMSk7CisJZWxzZQorCQlyZXR1cm4gdjlmc19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBzYiwgMSk7Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmc192ZnMuaCBiL2ZzLzlwL3Y5ZnNfdmZzLmgKaW5kZXggNDAxNDE2MC4uNDZjZTM1NyAxMDA2NDQKLS0tIGEvZnMvOXAvdjlmc192ZnMuaAorKysgYi9mcy85cC92OWZzX3Zmcy5oCkBAIC03MCw3ICs3MCw4IEBACiBzc2l6ZV90IHY5ZnNfZmlkX3JlYWRuKHN0cnVjdCBwOV9maWQgKiwgY2hhciAqLCBjaGFyIF9fdXNlciAqLCB1MzIsIHU2NCk7CiB2b2lkIHY5ZnNfYmxhbmtfd3N0YXQoc3RydWN0IHA5X3dzdGF0ICp3c3RhdCk7CiBpbnQgdjlmc192ZnNfc2V0YXR0cl9kb3RsKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwotaW50IHY5ZnNfZmlsZV9mc3luY19kb3RsKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgZGF0YXN5bmMpOworaW50IHY5ZnNfZmlsZV9mc3luY19kb3RsKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCisJCQkgaW50IGRhdGFzeW5jKTsKIHNzaXplX3Qgdjlmc19maWxlX3dyaXRlX2ludGVybmFsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcDlfZmlkICosCiAJCQkJIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICosIGludCk7CiBpbnQgdjlmc19yZWZyZXNoX2lub2RlKHN0cnVjdCBwOV9maWQgKmZpZCwgc3RydWN0IGlub2RlICppbm9kZSk7CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfZmlsZS5jIGIvZnMvOXAvdmZzX2ZpbGUuYwppbmRleCBmZmVkNTU4Li4zYzE3M2ZjIDEwMDY0NAotLS0gYS9mcy85cC92ZnNfZmlsZS5jCisrKyBiL2ZzLzlwL3Zmc19maWxlLmMKQEAgLTUxOSwzMiArNTE5LDUwIEBACiB9CiAKIAotc3RhdGljIGludCB2OWZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGludCBkYXRhc3luYykKK3N0YXRpYyBpbnQgdjlmc19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCisJCQkgICBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IHA5X2ZpZCAqZmlkOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX21hcHBpbmctPmhvc3Q7CiAJc3RydWN0IHA5X3dzdGF0IHdzdGF0OwogCWludCByZXR2YWw7CiAKKwlyZXR2YWwgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJmaWxwICVwIGRhdGFzeW5jICV4XG4iLCBmaWxwLCBkYXRhc3luYyk7CiAKIAlmaWQgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJdjlmc19ibGFua193c3RhdCgmd3N0YXQpOwogCiAJcmV0dmFsID0gcDlfY2xpZW50X3dzdGF0KGZpZCwgJndzdGF0KTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwogCXJldHVybiByZXR2YWw7CiB9CiAKLWludCB2OWZzX2ZpbGVfZnN5bmNfZG90bChzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGRhdGFzeW5jKQoraW50IHY5ZnNfZmlsZV9mc3luY19kb3RsKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCisJCQkgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBwOV9maWQgKmZpZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OwogCWludCByZXR2YWw7CiAKKwlyZXR2YWwgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJ2OWZzX2ZpbGVfZnN5bmNfZG90bDogZmlscCAlcCBkYXRhc3luYyAleFxuIiwKIAkJCWZpbHAsIGRhdGFzeW5jKTsKIAogCWZpZCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAogCXJldHZhbCA9IHA5X2NsaWVudF9mc3luYyhmaWQsIGRhdGFzeW5jKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19pbm9kZS5jIGIvZnMvOXAvdmZzX2lub2RlLmMKaW5kZXggN2Y2YzY3Ny4uOGJiNTUwNyAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2lub2RlLmMKKysrIGIvZnMvOXAvdmZzX2lub2RlLmMKQEAgLTIxNiw3ICsyMTYsNiBAQAogCQlyZXR1cm4gTlVMTDsKICNpZmRlZiBDT05GSUdfOVBfRlNDQUNIRQogCXY5aW5vZGUtPmZzY2FjaGUgPSBOVUxMOwotCXY5aW5vZGUtPmZzY2FjaGVfa2V5ID0gTlVMTDsKIAlzcGluX2xvY2tfaW5pdCgmdjlpbm9kZS0+ZnNjYWNoZV9sb2NrKTsKICNlbmRpZgogCXY5aW5vZGUtPndyaXRlYmFja19maWQgPSBOVUxMOwpAQCAtNDMzLDE3ICs0MzIsNjAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgdjlmc190ZXN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCit7CisJaW50IHVtb2RlOworCXN0cnVjdCB2OWZzX2lub2RlICp2OWlub2RlID0gVjlGU19JKGlub2RlKTsKKwlzdHJ1Y3QgcDlfd3N0YXQgKnN0ID0gKHN0cnVjdCBwOV93c3RhdCAqKWRhdGE7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoaW5vZGUpOworCisJdW1vZGUgPSBwOW1vZGUydW5peG1vZGUodjlzZXMsIHN0LT5tb2RlKTsKKwkvKiBkb24ndCBtYXRjaCBpbm9kZSBvZiBkaWZmZXJlbnQgdHlwZSAqLworCWlmICgoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgIT0gKHVtb2RlICYgU19JRk1UKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBjb21wYXJlIHFpZCBkZXRhaWxzICovCisJaWYgKG1lbWNtcCgmdjlpbm9kZS0+cWlkLnZlcnNpb24sCisJCSAgICZzdC0+cWlkLnZlcnNpb24sIHNpemVvZih2OWlub2RlLT5xaWQudmVyc2lvbikpKQorCQlyZXR1cm4gMDsKKworCWlmICh2OWlub2RlLT5xaWQudHlwZSAhPSBzdC0+cWlkLnR5cGUpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHY5ZnNfdGVzdF9uZXdfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2OWZzX3NldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgdjlmc19pbm9kZSAqdjlpbm9kZSA9IFY5RlNfSShpbm9kZSk7CisJc3RydWN0IHA5X3dzdGF0ICpzdCA9IChzdHJ1Y3QgcDlfd3N0YXQgKilkYXRhOworCisJbWVtY3B5KCZ2OWlub2RlLT5xaWQsICZzdC0+cWlkLCBzaXplb2Yoc3QtPnFpZCkpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGlub2RlICp2OWZzX3FpZF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJICAgc3RydWN0IHA5X3FpZCAqcWlkLAotCQkJCSAgIHN0cnVjdCBwOV93c3RhdCAqc3QpCisJCQkJICAgc3RydWN0IHA5X3dzdGF0ICpzdCwKKwkJCQkgICBpbnQgbmV3KQogewogCWludCByZXR2YWwsIHVtb2RlOwogCXVuc2lnbmVkIGxvbmcgaV9pbm87CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gc2ItPnNfZnNfaW5mbzsKKwlpbnQgKCp0ZXN0KShzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKTsKKworCWlmIChuZXcpCisJCXRlc3QgPSB2OWZzX3Rlc3RfbmV3X2lub2RlOworCWVsc2UKKwkJdGVzdCA9IHY5ZnNfdGVzdF9pbm9kZTsKIAogCWlfaW5vID0gdjlmc19xaWQyaW5vKHFpZCk7Ci0JaW5vZGUgPSBpZ2V0X2xvY2tlZChzYiwgaV9pbm8pOworCWlub2RlID0gaWdldDVfbG9ja2VkKHNiLCBpX2lubywgdGVzdCwgdjlmc19zZXRfaW5vZGUsIHN0KTsKIAlpZiAoIWlub2RlKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkKQEAgLTQ1Myw2ICs0OTUsNyBAQAogCSAqIEZJWE1FISEgd2UgbWF5IG5lZWQgc3VwcG9ydCBmb3Igc3RhbGUgaW5vZGVzCiAJICogbGF0ZXIuCiAJICovCisJaW5vZGUtPmlfaW5vID0gaV9pbm87CiAJdW1vZGUgPSBwOW1vZGUydW5peG1vZGUodjlzZXMsIHN0LT5tb2RlKTsKIAlyZXR2YWwgPSB2OWZzX2luaXRfaW5vZGUodjlzZXMsIGlub2RlLCB1bW9kZSk7CiAJaWYgKHJldHZhbCkKQEAgLTQ2MCw3ICs1MDMsNiBAQAogCiAJdjlmc19zdGF0Mmlub2RlKHN0LCBpbm9kZSwgc2IpOwogI2lmZGVmIENPTkZJR185UF9GU0NBQ0hFCi0Jdjlmc19mc2NhY2hlX3NldF9rZXkoaW5vZGUsICZzdC0+cWlkKTsKIAl2OWZzX2NhY2hlX2lub2RlX2dldF9jb29raWUoaW5vZGUpOwogI2VuZGlmCiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CkBAIC00NzQsNyArNTE2LDcgQEAKIAogc3RydWN0IGlub2RlICoKIHY5ZnNfaW5vZGVfZnJvbV9maWQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHA5X2ZpZCAqZmlkLAotCQkgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKKwkJICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBuZXcpCiB7CiAJc3RydWN0IHA5X3dzdGF0ICpzdDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKQEAgLTQ4Myw3ICs1MjUsNyBAQAogCWlmIChJU19FUlIoc3QpKQogCQlyZXR1cm4gRVJSX0NBU1Qoc3QpOwogCi0JaW5vZGUgPSB2OWZzX3FpZF9pZ2V0KHNiLCAmc3QtPnFpZCwgc3QpOworCWlub2RlID0gdjlmc19xaWRfaWdldChzYiwgJnN0LT5xaWQsIHN0LCBuZXcpOwogCXA5c3RhdF9mcmVlKHN0KTsKIAlrZnJlZShzdCk7CiAJcmV0dXJuIGlub2RlOwpAQCAtNDkyLDM4ICs1MzQsNTAgQEAKIC8qKgogICogdjlmc19yZW1vdmUgLSBoZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGZpbGVzIGFuZCBkaXJlY3RvcmllcwogICogQGRpcjogZGlyZWN0b3J5IGlub2RlIHRoYXQgaXMgYmVpbmcgZGVsZXRlZAotICogQGZpbGU6ICBkZW50cnkgdGhhdCBpcyBiZWluZyBkZWxldGVkCisgKiBAZGVudHJ5OiAgZGVudHJ5IHRoYXQgaXMgYmVpbmcgZGVsZXRlZAogICogQHJtZGlyOiByZW1vdmluZyBhIGRpcmVjdG9yeQogICoKICAqLwogCi1zdGF0aWMgaW50IHY5ZnNfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpmaWxlLCBpbnQgcm1kaXIpCitzdGF0aWMgaW50IHY5ZnNfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBmbGFncykKIHsKLQlpbnQgcmV0dmFsOwotCXN0cnVjdCBwOV9maWQgKnY5ZmlkOwotCXN0cnVjdCBpbm9kZSAqZmlsZV9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCByZXR2YWwgPSAtRU9QTk9UU1VQUDsKKwlzdHJ1Y3QgcDlfZmlkICp2OWZpZCwgKmRmaWQ7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKIAotCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiaW5vZGU6ICVwIGRlbnRyeTogJXAgcm1kaXI6ICVkXG4iLCBkaXIsIGZpbGUsCi0JCXJtZGlyKTsKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlOiAlcCBkZW50cnk6ICVwIHJtZGlyOiAleFxuIiwKKwkJICAgZGlyLCBkZW50cnksIGZsYWdzKTsKIAotCWZpbGVfaW5vZGUgPSBmaWxlLT5kX2lub2RlOwotCXY5ZmlkID0gdjlmc19maWRfY2xvbmUoZmlsZSk7Ci0JaWYgKElTX0VSUih2OWZpZCkpCi0JCXJldHVybiBQVFJfRVJSKHY5ZmlkKTsKLQotCXJldHZhbCA9IHA5X2NsaWVudF9yZW1vdmUodjlmaWQpOworCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWRmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LT5kX3BhcmVudCk7CisJaWYgKElTX0VSUihkZmlkKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKGRmaWQpOworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImZpZCBsb29rdXAgZmFpbGVkICVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlpZiAodjlmc19wcm90b19kb3RsKHY5c2VzKSkKKwkJcmV0dmFsID0gcDlfY2xpZW50X3VubGlua2F0KGRmaWQsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGZsYWdzKTsKKwlpZiAocmV0dmFsID09IC1FT1BOT1RTVVBQKSB7CisJCS8qIFRyeSB0aGUgb25lIGJhc2VkIG9uIHBhdGggKi8KKwkJdjlmaWQgPSB2OWZzX2ZpZF9jbG9uZShkZW50cnkpOworCQlpZiAoSVNfRVJSKHY5ZmlkKSkKKwkJCXJldHVybiBQVFJfRVJSKHY5ZmlkKTsKKwkJcmV0dmFsID0gcDlfY2xpZW50X3JlbW92ZSh2OWZpZCk7CisJfQogCWlmICghcmV0dmFsKSB7CiAJCS8qCiAJCSAqIGRpcmVjdG9yaWVzIG9uIHVubGluayBzaG91bGQgaGF2ZSB6ZXJvCiAJCSAqIGxpbmsgY291bnQKIAkJICovCi0JCWlmIChybWRpcikgewotCQkJY2xlYXJfbmxpbmsoZmlsZV9pbm9kZSk7CisJCWlmIChmbGFncyAmIEFUX1JFTU9WRURJUikgeworCQkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQkJZHJvcF9ubGluayhkaXIpOwogCQl9IGVsc2UKLQkJCWRyb3BfbmxpbmsoZmlsZV9pbm9kZSk7CisJCQlkcm9wX25saW5rKGlub2RlKTsKIAotCQl2OWZzX2ludmFsaWRhdGVfaW5vZGVfYXR0cihmaWxlX2lub2RlKTsKKwkJdjlmc19pbnZhbGlkYXRlX2lub2RlX2F0dHIoaW5vZGUpOwogCQl2OWZzX2ludmFsaWRhdGVfaW5vZGVfYXR0cihkaXIpOwogCX0KIAlyZXR1cm4gcmV0dmFsOwpAQCAtNTg1LDcgKzYzOSw3IEBACiAJfQogCiAJLyogaW5zdGFudGlhdGUgaW5vZGUgYW5kIGFzc2lnbiB0aGUgdW5vcGVuZWQgZmlkIHRvIHRoZSBkZW50cnkgKi8KLQlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlX2Zyb21fZmlkKHY5c2VzLCBmaWQsIGRpci0+aV9zYik7CisJaW5vZGUgPSB2OWZzX2dldF9uZXdfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkgewogCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJpbm9kZSBjcmVhdGlvbiBmYWlsZWQgJWRcbiIsIGVycik7CkBAIC02MzMsOCArNjg3LDggQEAKIAlmaWQgPSBOVUxMOwogCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOwogCXBlcm0gPSB1bml4bW9kZTJwOW1vZGUodjlzZXMsIG1vZGUpOwotCWlmIChuZCAmJiBuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikKLQkJZmxhZ3MgPSBuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgLSAxOworCWlmIChuZCkKKwkJZmxhZ3MgPSBuZC0+aW50ZW50Lm9wZW4uZmxhZ3M7CiAJZWxzZQogCQlmbGFncyA9IE9fUkRXUjsKIApAQCAtNjQ5LDcgKzcwMyw3IEBACiAKIAl2OWZzX2ludmFsaWRhdGVfaW5vZGVfYXR0cihkaXIpOwogCS8qIGlmIHdlIGFyZSBvcGVuaW5nIGEgZmlsZSwgYXNzaWduIHRoZSBvcGVuIGZpZCB0byB0aGUgZmlsZSAqLwotCWlmIChuZCAmJiBuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikgeworCWlmIChuZCkgewogCQl2OWlub2RlID0gVjlGU19JKGRlbnRyeS0+ZF9pbm9kZSk7CiAJCW11dGV4X2xvY2soJnY5aW5vZGUtPnZfbXV0ZXgpOwogCQlpZiAodjlzZXMtPmNhY2hlICYmICF2OWlub2RlLT53cml0ZWJhY2tfZmlkICYmCkBAIC04MTQsNyArODY4LDcgQEAKIAogaW50IHY5ZnNfdmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGRlbnRyeSAqZCkKIHsKLQlyZXR1cm4gdjlmc19yZW1vdmUoaSwgZCwgMSk7CisJcmV0dXJuIHY5ZnNfcmVtb3ZlKGksIGQsIEFUX1JFTU9WRURJUik7CiB9CiAKIC8qKgpAQCAtODYyLDkgKzkxNiwxMiBAQAogCiAJZG93bl93cml0ZSgmdjlzZXMtPnJlbmFtZV9zZW0pOwogCWlmICh2OWZzX3Byb3RvX2RvdGwodjlzZXMpKSB7Ci0JCXJldHZhbCA9IHA5X2NsaWVudF9yZW5hbWUob2xkZmlkLCBuZXdkaXJmaWQsCi0JCQkJCShjaGFyICopIG5ld19kZW50cnktPmRfbmFtZS5uYW1lKTsKLQkJaWYgKHJldHZhbCAhPSAtRU5PU1lTKQorCQlyZXR2YWwgPSBwOV9jbGllbnRfcmVuYW1lYXQob2xkZGlyZmlkLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkJICAgIG5ld2RpcmZpZCwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlpZiAocmV0dmFsID09IC1FT1BOT1RTVVBQKQorCQkJcmV0dmFsID0gcDlfY2xpZW50X3JlbmFtZShvbGRmaWQsIG5ld2RpcmZpZCwKKwkJCQkJCSAgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlpZiAocmV0dmFsICE9IC1FT1BOT1RTVVBQKQogCQkJZ290byBjbHVua19uZXdkaXI7CiAJfQogCWlmIChvbGRfZGVudHJ5LT5kX3BhcmVudCAhPSBuZXdfZGVudHJ5LT5kX3BhcmVudCkgewpAQCAtODg5LDExICs5NDYsNiBAQAogCQkJCWNsZWFyX25saW5rKG5ld19pbm9kZSk7CiAJCQllbHNlCiAJCQkJZHJvcF9ubGluayhuZXdfaW5vZGUpOwotCQkJLyoKLQkJCSAqIFdvcmsgYXJvdW5kIHZmcyByZW5hbWUgcmVoYXNoIGJ1ZyB3aXRoCi0JCQkgKiBGU19SRU5BTUVfRE9FU19EX01PVkUKLQkJCSAqLwotCQkJdjlmc19pbnZhbGlkYXRlX2lub2RlX2F0dHIobmV3X2lub2RlKTsKIAkJfQogCQlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKIAkJCWlmICghbmV3X2lub2RlKQpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2lub2RlX2RvdGwuYyBiL2ZzLzlwL3Zmc19pbm9kZV9kb3RsLmMKaW5kZXggNjkxYzc4Zi4uOWEyNmRjZSAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2lub2RlX2RvdGwuYworKysgYi9mcy85cC92ZnNfaW5vZGVfZG90bC5jCkBAIC04NiwxOCArODYsNjMgQEAKIAlyZXR1cm4gZGVudHJ5OwogfQogCitzdGF0aWMgaW50IHY5ZnNfdGVzdF9pbm9kZV9kb3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHY5ZnNfaW5vZGUgKnY5aW5vZGUgPSBWOUZTX0koaW5vZGUpOworCXN0cnVjdCBwOV9zdGF0X2RvdGwgKnN0ID0gKHN0cnVjdCBwOV9zdGF0X2RvdGwgKilkYXRhOworCisJLyogZG9uJ3QgbWF0Y2ggaW5vZGUgb2YgZGlmZmVyZW50IHR5cGUgKi8KKwlpZiAoKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpICE9IChzdC0+c3RfbW9kZSAmIFNfSUZNVCkpCisJCXJldHVybiAwOworCisJaWYgKGlub2RlLT5pX2dlbmVyYXRpb24gIT0gc3QtPnN0X2dlbikKKwkJcmV0dXJuIDA7CisKKwkvKiBjb21wYXJlIHFpZCBkZXRhaWxzICovCisJaWYgKG1lbWNtcCgmdjlpbm9kZS0+cWlkLnZlcnNpb24sCisJCSAgICZzdC0+cWlkLnZlcnNpb24sIHNpemVvZih2OWlub2RlLT5xaWQudmVyc2lvbikpKQorCQlyZXR1cm4gMDsKKworCWlmICh2OWlub2RlLT5xaWQudHlwZSAhPSBzdC0+cWlkLnR5cGUpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiBBbHdheXMgZ2V0IGEgbmV3IGlub2RlICovCitzdGF0aWMgaW50IHY5ZnNfdGVzdF9uZXdfaW5vZGVfZG90bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY5ZnNfc2V0X2lub2RlX2RvdGwoc3RydWN0IGlub2RlICppbm9kZSwgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHY5ZnNfaW5vZGUgKnY5aW5vZGUgPSBWOUZTX0koaW5vZGUpOworCXN0cnVjdCBwOV9zdGF0X2RvdGwgKnN0ID0gKHN0cnVjdCBwOV9zdGF0X2RvdGwgKilkYXRhOworCisJbWVtY3B5KCZ2OWlub2RlLT5xaWQsICZzdC0+cWlkLCBzaXplb2Yoc3QtPnFpZCkpOworCWlub2RlLT5pX2dlbmVyYXRpb24gPSBzdC0+c3RfZ2VuOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGlub2RlICp2OWZzX3FpZF9pZ2V0X2RvdGwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkJc3RydWN0IHA5X3FpZCAqcWlkLAogCQkJCQlzdHJ1Y3QgcDlfZmlkICpmaWQsCi0JCQkJCXN0cnVjdCBwOV9zdGF0X2RvdGwgKnN0KQorCQkJCQlzdHJ1Y3QgcDlfc3RhdF9kb3RsICpzdCwKKwkJCQkJaW50IG5ldykKIHsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGxvbmcgaV9pbm87CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gc2ItPnNfZnNfaW5mbzsKKwlpbnQgKCp0ZXN0KShzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKTsKKworCWlmIChuZXcpCisJCXRlc3QgPSB2OWZzX3Rlc3RfbmV3X2lub2RlX2RvdGw7CisJZWxzZQorCQl0ZXN0ID0gdjlmc190ZXN0X2lub2RlX2RvdGw7CiAKIAlpX2lubyA9IHY5ZnNfcWlkMmlubyhxaWQpOwotCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIGlfaW5vKTsKKwlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgaV9pbm8sIHRlc3QsIHY5ZnNfc2V0X2lub2RlX2RvdGwsIHN0KTsKIAlpZiAoIWlub2RlKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkKQEAgLTEwNywxMyArMTUyLDEzIEBACiAJICogRklYTUUhISB3ZSBtYXkgbmVlZCBzdXBwb3J0IGZvciBzdGFsZSBpbm9kZXMKIAkgKiBsYXRlci4KIAkgKi8KKwlpbm9kZS0+aV9pbm8gPSBpX2lubzsKIAlyZXR2YWwgPSB2OWZzX2luaXRfaW5vZGUodjlzZXMsIGlub2RlLCBzdC0+c3RfbW9kZSk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJvcjsKIAogCXY5ZnNfc3RhdDJpbm9kZV9kb3RsKHN0LCBpbm9kZSk7CiAjaWZkZWYgQ09ORklHXzlQX0ZTQ0FDSEUKLQl2OWZzX2ZzY2FjaGVfc2V0X2tleShpbm9kZSwgJnN0LT5xaWQpOwogCXY5ZnNfY2FjaGVfaW5vZGVfZ2V0X2Nvb2tpZShpbm9kZSk7CiAjZW5kaWYKIAlyZXR2YWwgPSB2OWZzX2dldF9hY2woaW5vZGUsIGZpZCk7CkBAIC0xMzEsMTYgKzE3NiwxNiBAQAogCiBzdHJ1Y3QgaW5vZGUgKgogdjlmc19pbm9kZV9mcm9tX2ZpZF9kb3RsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCBwOV9maWQgKmZpZCwKLQkJCSBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorCQkJIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBuZXcpCiB7CiAJc3RydWN0IHA5X3N0YXRfZG90bCAqc3Q7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAKLQlzdCA9IHA5X2NsaWVudF9nZXRhdHRyX2RvdGwoZmlkLCBQOV9TVEFUU19CQVNJQyk7CisJc3QgPSBwOV9jbGllbnRfZ2V0YXR0cl9kb3RsKGZpZCwgUDlfU1RBVFNfQkFTSUMgfCBQOV9TVEFUU19HRU4pOwogCWlmIChJU19FUlIoc3QpKQogCQlyZXR1cm4gRVJSX0NBU1Qoc3QpOwogCi0JaW5vZGUgPSB2OWZzX3FpZF9pZ2V0X2RvdGwoc2IsICZzdC0+cWlkLCBmaWQsIHN0KTsKKwlpbm9kZSA9IHY5ZnNfcWlkX2lnZXRfZG90bChzYiwgJnN0LT5xaWQsIGZpZCwgc3QsIG5ldyk7CiAJa2ZyZWUoc3QpOwogCXJldHVybiBpbm9kZTsKIH0KQEAgLTE3Myw4ICsyMTgsOCBAQAogCXN0cnVjdCBwb3NpeF9hY2wgKnBhY2wgPSBOVUxMLCAqZGFjbCA9IE5VTEw7CiAKIAl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGlyKTsKLQlpZiAobmQgJiYgbmQtPmZsYWdzICYgTE9PS1VQX09QRU4pCi0JCWZsYWdzID0gbmQtPmludGVudC5vcGVuLmZsYWdzIC0gMTsKKwlpZiAobmQpCisJCWZsYWdzID0gbmQtPmludGVudC5vcGVuLmZsYWdzOwogCWVsc2UgewogCQkvKgogCQkgKiBjcmVhdGUgY2FsbCB3aXRob3V0IExPT0tVUF9PUEVOIGlzIGR1ZQpAQCAtMjMwLDcgKzI3NSw3IEBACiAJCWZpZCA9IE5VTEw7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWlub2RlID0gdjlmc19nZXRfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKKwlpbm9kZSA9IHY5ZnNfZ2V0X25ld19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOwogCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwogCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwgZXJyKTsKQEAgLTI0Miw3ICsyODcsNyBAQAogCQlnb3RvIGVycm9yOwogCiAJLyogTm93IHNldCB0aGUgQUNMIGJhc2VkIG9uIHRoZSBkZWZhdWx0IHZhbHVlICovCi0Jdjlmc19zZXRfY3JlYXRlX2FjbChkZW50cnksIGRhY2wsIHBhY2wpOworCXY5ZnNfc2V0X2NyZWF0ZV9hY2woZGVudHJ5LCAmZGFjbCwgJnBhY2wpOwogCiAJdjlpbm9kZSA9IFY5RlNfSShpbm9kZSk7CiAJbXV0ZXhfbG9jaygmdjlpbm9kZS0+dl9tdXRleCk7CkBAIC0yODMsNiArMzI4LDcgQEAKIGVycl9jbHVua19vbGRfZmlkOgogCWlmIChvZmlkKQogCQlwOV9jbGllbnRfY2x1bmsob2ZpZCk7CisJdjlmc19zZXRfY3JlYXRlX2FjbChOVUxMLCAmZGFjbCwgJnBhY2wpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTM1MCw3ICszOTYsNyBAQAogCQkJZ290byBlcnJvcjsKIAkJfQogCi0JCWlub2RlID0gdjlmc19nZXRfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKKwkJaW5vZGUgPSB2OWZzX2dldF9uZXdfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKIAkJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwogCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJpbm9kZSBjcmVhdGlvbiBmYWlsZWQgJWRcbiIsCkBAIC0zNzYsMTIgKzQyMiwxMyBAQAogCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCX0KIAkvKiBOb3cgc2V0IHRoZSBBQ0wgYmFzZWQgb24gdGhlIGRlZmF1bHQgdmFsdWUgKi8KLQl2OWZzX3NldF9jcmVhdGVfYWNsKGRlbnRyeSwgZGFjbCwgcGFjbCk7CisJdjlmc19zZXRfY3JlYXRlX2FjbChkZW50cnksICZkYWNsLCAmcGFjbCk7CiAJaW5jX25saW5rKGRpcik7CiAJdjlmc19pbnZhbGlkYXRlX2lub2RlX2F0dHIoZGlyKTsKIGVycm9yOgogCWlmIChmaWQpCiAJCXA5X2NsaWVudF9jbHVuayhmaWQpOworCXY5ZnNfc2V0X2NyZWF0ZV9hY2woTlVMTCwgJmRhY2wsICZwYWNsKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC01NDcsNyArNTk0LDcgQEAKIAkJCWlub2RlLT5pX2Jsb2NrcyA9IHN0YXQtPnN0X2Jsb2NrczsKIAl9CiAJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfR0VOKQotCQkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IHN0YXQtPnN0X2dlbjsKKwkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IHN0YXQtPnN0X2dlbjsKIAogCS8qIEN1cnJlbnRseSB3ZSBkb24ndCBzdXBwb3J0IFA5X1NUQVRTX0JUSU1FIGFuZCBQOV9TVEFUU19EQVRBX1ZFUlNJT04KIAkgKiBiZWNhdXNlIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgZG9lcyBub3QgaGF2ZSBmaWVsZHMgZm9yIHRoZW0uCkBAIC02MDMsNyArNjUwLDcgQEAKIAkJfQogCiAJCS8qIGluc3RhbnRpYXRlIGlub2RlIGFuZCBhc3NpZ24gdGhlIHVub3BlbmVkIGZpZCB0byBkZW50cnkgKi8KLQkJaW5vZGUgPSB2OWZzX2dldF9pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOworCQlpbm9kZSA9IHY5ZnNfZ2V0X25ld19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOwogCQlpZiAoSVNfRVJSKGlub2RlKSkgewogCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7CiAJCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwKQEAgLTc1Niw3ICs4MDMsNyBAQAogCQkJZ290byBlcnJvcjsKIAkJfQogCi0JCWlub2RlID0gdjlmc19nZXRfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKKwkJaW5vZGUgPSB2OWZzX2dldF9uZXdfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKIAkJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwogCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJpbm9kZSBjcmVhdGlvbiBmYWlsZWQgJWRcbiIsCkBAIC03ODEsMTAgKzgyOCwxMSBAQAogCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCX0KIAkvKiBOb3cgc2V0IHRoZSBBQ0wgYmFzZWQgb24gdGhlIGRlZmF1bHQgdmFsdWUgKi8KLQl2OWZzX3NldF9jcmVhdGVfYWNsKGRlbnRyeSwgZGFjbCwgcGFjbCk7CisJdjlmc19zZXRfY3JlYXRlX2FjbChkZW50cnksICZkYWNsLCAmcGFjbCk7CiBlcnJvcjoKIAlpZiAoZmlkKQogCQlwOV9jbGllbnRfY2x1bmsoZmlkKTsKKwl2OWZzX3NldF9jcmVhdGVfYWNsKE5VTEwsICZkYWNsLCAmcGFjbCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtODY5LDcgKzkxNyw3IEBACiAJLmdldHhhdHRyID0gZ2VuZXJpY19nZXR4YXR0ciwKIAkucmVtb3ZleGF0dHIgPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogCS5saXN0eGF0dHIgPSB2OWZzX2xpc3R4YXR0ciwKLQkuY2hlY2tfYWNsID0gdjlmc19jaGVja19hY2wsCisJLmdldF9hY2wgPSB2OWZzX2lvcF9nZXRfYWNsLAogfTsKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19maWxlX2lub2RlX29wZXJhdGlvbnNfZG90bCA9IHsKQEAgLTg3OSw3ICs5MjcsNyBAQAogCS5nZXR4YXR0ciA9IGdlbmVyaWNfZ2V0eGF0dHIsCiAJLnJlbW92ZXhhdHRyID0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIAkubGlzdHhhdHRyID0gdjlmc19saXN0eGF0dHIsCi0JLmNoZWNrX2FjbCA9IHY5ZnNfY2hlY2tfYWNsLAorCS5nZXRfYWNsID0gdjlmc19pb3BfZ2V0X2FjbCwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zX2RvdGwgPSB7CmRpZmYgLS1naXQgYS9mcy9NYWtlZmlsZSBiL2ZzL01ha2VmaWxlCmluZGV4IGZiNjhjMmIuLmFmYzEwOTYgMTAwNjQ0Ci0tLSBhL2ZzL01ha2VmaWxlCisrKyBiL2ZzL01ha2VmaWxlCkBAIC0yOSw3ICsyOSw2IEBACiBvYmotJChDT05GSUdfQUlPKSAgICAgICAgICAgICAgICs9IGFpby5vCiBvYmotJChDT05GSUdfRklMRV9MT0NLSU5HKSAgICAgICs9IGxvY2tzLm8KIG9iai0kKENPTkZJR19DT01QQVQpCQkrPSBjb21wYXQubyBjb21wYXRfaW9jdGwubwotb2JqLSQoQ09ORklHX05GU0RfREVQUkVDQVRFRCkJKz0gbmZzY3RsLm8KIG9iai0kKENPTkZJR19CSU5GTVRfQU9VVCkJKz0gYmluZm10X2FvdXQubwogb2JqLSQoQ09ORklHX0JJTkZNVF9FTTg2KQkrPSBiaW5mbXRfZW04Ni5vCiBvYmotJChDT05GSUdfQklORk1UX01JU0MpCSs9IGJpbmZtdF9taXNjLm8KZGlmZiAtLWdpdCBhL2ZzL2FmZnMvYWZmcy5oIGIvZnMvYWZmcy9hZmZzLmgKaW5kZXggMGU5NWY3My4uYzJiOWM3OSAxMDA2NDQKLS0tIGEvZnMvYWZmcy9hZmZzLmgKKysrIGIvZnMvYWZmcy9hZmZzLmgKQEAgLTE4Miw3ICsxODIsNyBAQAogCiB2b2lkCQlhZmZzX2ZyZWVfcHJlYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSk7CiBleHRlcm4gdm9pZAlhZmZzX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqKTsKLWludAkJYWZmc19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICosIGludCk7CitpbnQJCWFmZnNfZmlsZV9mc3luYyhzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGxvZmZfdCwgaW50KTsKIAogLyogZGlyLmMgKi8KIApkaWZmIC0tZ2l0IGEvZnMvYWZmcy9maWxlLmMgYi9mcy9hZmZzL2ZpbGUuYwppbmRleCBhY2YzMjFiLi4yZjRjOTM1IDEwMDY0NAotLS0gYS9mcy9hZmZzL2ZpbGUuYworKysgYi9mcy9hZmZzL2ZpbGUuYwpAQCAtOTIzLDE0ICs5MjMsMjAgQEAKIAlhZmZzX2ZyZWVfcHJlYWxsb2MoaW5vZGUpOwogfQogCi1pbnQgYWZmc19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgZGF0YXN5bmMpCitpbnQgYWZmc19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OwogCWludCByZXQsIGVycjsKIAorCWVyciA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXQgPSB3cml0ZV9pbm9kZV9ub3coaW5vZGUsIDApOwogCWVyciA9IHN5bmNfYmxvY2tkZXYoaW5vZGUtPmlfc2ItPnNfYmRldik7CiAJaWYgKCFyZXQpCiAJCXJldCA9IGVycjsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL2Fmc192bC5oIGIvZnMvYWZzL2Fmc192bC5oCmluZGV4IDhiYmVmZTAuLjgwMGY2MDcgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9hZnNfdmwuaAorKysgYi9mcy9hZnMvYWZzX3ZsLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKIAlBRlNWTF9CQURWT0xPUEVSIAk9IDM2MzU0MiwJLyogQmFkIHZvbHVtZSBvcGVyYXRpb24gY29kZSAqLwogCUFGU1ZMX0JBRFJFTExPQ0tUWVBFIAk9IDM2MzU0MywJLyogQmFkIHJlbGVhc2UgbG9jayB0eXBlICovCiAJQUZTVkxfUkVSRUxFQVNFIAk9IDM2MzU0NCwJLyogU3RhdHVzIHJlcG9ydDogbGFzdCByZWxlYXNlIHdhcyBhYm9ydGVkICovCi0JQUZTVkxfQkFEU0VSVkVSRkxBRyAJPSAzNjM1NDUsCS8qIEludmFsaWQgcmVwbGljYXRpb24gc2l0ZSBzZXJ2ZXIgwrBhZyAqLworCUFGU1ZMX0JBRFNFUlZFUkZMQUcgCT0gMzYzNTQ1LAkvKiBJbnZhbGlkIHJlcGxpY2F0aW9uIHNpdGUgc2VydmVyIGZsYWcgKi8KIAlBRlNWTF9QRVJNIAkJPSAzNjM1NDYsCS8qIE5vIHBlcm1pc3Npb24gYWNjZXNzICovCiAJQUZTVkxfTk9NRU0gCQk9IDM2MzU0NywJLyogbWFsbG9jL3JlYWxsb2MgZmFpbGVkIHRvIGFsbG9jIGVub3VnaCBtZW1vcnkgKi8KIH07CmRpZmYgLS1naXQgYS9mcy9hZnMvZGlyLmMgYi9mcy9hZnMvZGlyLmMKaW5kZXggMjBjMTA2Zi4uMWIwYjE5NSAxMDA2NDQKLS0tIGEvZnMvYWZzL2Rpci5jCisrKyBiL2ZzL2Fmcy9kaXIuYwpAQCAtNTg0LDExICs1ODQsMTEgQEAKIAogc3VjY2VzczoKIAlkX2FkZChkZW50cnksIGlub2RlKTsKLQlfbGVhdmUoIiA9IDAgeyB2bj0ldSB1PSV1IH0gLT4geyBpbm89JWx1IHY9JWxsdSB9IiwKKwlfbGVhdmUoIiA9IDAgeyB2bj0ldSB1PSV1IH0gLT4geyBpbm89JWx1IHY9JXUgfSIsCiAJICAgICAgIGZpZC52bm9kZSwKIAkgICAgICAgZmlkLnVuaXF1ZSwKIAkgICAgICAgZGVudHJ5LT5kX2lub2RlLT5pX2lubywKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZW50cnktPmRfaW5vZGUtPmlfdmVyc2lvbik7CisJICAgICAgIGRlbnRyeS0+ZF9pbm9kZS0+aV9nZW5lcmF0aW9uKTsKIAogCXJldHVybiBOVUxMOwogfQpAQCAtNjcxLDEwICs2NzEsMTAgQEAKIAkJICogYmVlbiBkZWxldGVkIGFuZCByZXBsYWNlZCwgYW5kIHRoZSBvcmlnaW5hbCB2bm9kZSBJRCBoYXMKIAkJICogYmVlbiByZXVzZWQgKi8KIAkJaWYgKGZpZC51bmlxdWUgIT0gdm5vZGUtPmZpZC51bmlxdWUpIHsKLQkJCV9kZWJ1ZygiJXM6IGZpbGUgZGVsZXRlZCAodXEgJXUgLT4gJXUgSTolbGx1KSIsCisJCQlfZGVidWcoIiVzOiBmaWxlIGRlbGV0ZWQgKHVxICV1IC0+ICV1IEk6JXUpIiwKIAkJCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lLCBmaWQudW5pcXVlLAogCQkJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGVudHJ5LT5kX2lub2RlLT5pX3ZlcnNpb24pOworCQkJICAgICAgIGRlbnRyeS0+ZF9pbm9kZS0+aV9nZW5lcmF0aW9uKTsKIAkJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwogCQkJc2V0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJnZub2RlLT5mbGFncyk7CiAJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ZzY2xpZW50LmMgYi9mcy9hZnMvZnNjbGllbnQuYwppbmRleCA0YmQwMjE4Li4zNDZlMzI4IDEwMDY0NAotLS0gYS9mcy9hZnMvZnNjbGllbnQuYworKysgYi9mcy9hZnMvZnNjbGllbnQuYwpAQCAtODksNyArODksNyBAQAogCQkJaV9zaXplX3dyaXRlKCZ2bm9kZS0+dmZzX2lub2RlLCBzaXplKTsKIAkJCXZub2RlLT52ZnNfaW5vZGUuaV91aWQgPSBzdGF0dXMtPm93bmVyOwogCQkJdm5vZGUtPnZmc19pbm9kZS5pX2dpZCA9IHN0YXR1cy0+Z3JvdXA7Ci0JCQl2bm9kZS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IHZub2RlLT5maWQudW5pcXVlOworCQkJdm5vZGUtPnZmc19pbm9kZS5pX2dlbmVyYXRpb24gPSB2bm9kZS0+ZmlkLnVuaXF1ZTsKIAkJCXZub2RlLT52ZnNfaW5vZGUuaV9ubGluayA9IHN0YXR1cy0+bmxpbms7CiAKIAkJCW1vZGUgPSB2bm9kZS0+dmZzX2lub2RlLmlfbW9kZTsKQEAgLTEwMiw2ICsxMDIsNyBAQAogCQl2bm9kZS0+dmZzX2lub2RlLmlfY3RpbWUudHZfc2VjCT0gc3RhdHVzLT5tdGltZV9zZXJ2ZXI7CiAJCXZub2RlLT52ZnNfaW5vZGUuaV9tdGltZQk9IHZub2RlLT52ZnNfaW5vZGUuaV9jdGltZTsKIAkJdm5vZGUtPnZmc19pbm9kZS5pX2F0aW1lCT0gdm5vZGUtPnZmc19pbm9kZS5pX2N0aW1lOworCQl2bm9kZS0+dmZzX2lub2RlLmlfdmVyc2lvbgk9IGRhdGFfdmVyc2lvbjsKIAl9CiAKIAlleHBlY3RlZF92ZXJzaW9uID0gc3RhdHVzLT5kYXRhX3ZlcnNpb247CmRpZmYgLS1naXQgYS9mcy9hZnMvaW5vZGUuYyBiL2ZzL2Fmcy9pbm9kZS5jCmluZGV4IGRiNjZjNTIuLjBmZGFiNmUgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9pbm9kZS5jCisrKyBiL2ZzL2Fmcy9pbm9kZS5jCkBAIC03NSw3ICs3NSw4IEBACiAJaW5vZGUtPmlfY3RpbWUudHZfbnNlYwk9IDA7CiAJaW5vZGUtPmlfYXRpbWUJCT0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZTsKIAlpbm9kZS0+aV9ibG9ja3MJCT0gMDsKLQlpbm9kZS0+aV92ZXJzaW9uCT0gdm5vZGUtPmZpZC51bmlxdWU7CisJaW5vZGUtPmlfZ2VuZXJhdGlvbgk9IHZub2RlLT5maWQudW5pcXVlOworCWlub2RlLT5pX3ZlcnNpb24JPSB2bm9kZS0+c3RhdHVzLmRhdGFfdmVyc2lvbjsKIAlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcwk9ICZhZnNfZnNfYW9wczsKIAogCS8qIGNoZWNrIHRvIHNlZSB3aGV0aGVyIGEgc3ltYm9saWMgbGluayBpcyByZWFsbHkgYSBtb3VudHBvaW50ICovCkBAIC0xMDAsNyArMTAxLDcgQEAKIAlzdHJ1Y3QgYWZzX2lnZXRfZGF0YSAqZGF0YSA9IG9wYXF1ZTsKIAogCXJldHVybiBpbm9kZS0+aV9pbm8gPT0gZGF0YS0+ZmlkLnZub2RlICYmCi0JCWlub2RlLT5pX3ZlcnNpb24gPT0gZGF0YS0+ZmlkLnVuaXF1ZTsKKwkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9PSBkYXRhLT5maWQudW5pcXVlOwogfQogCiAvKgpAQCAtMTIyLDcgKzEyMyw3IEBACiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShpbm9kZSk7CiAKIAlpbm9kZS0+aV9pbm8gPSBkYXRhLT5maWQudm5vZGU7Ci0JaW5vZGUtPmlfdmVyc2lvbiA9IGRhdGEtPmZpZC51bmlxdWU7CisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGRhdGEtPmZpZC51bmlxdWU7CiAJdm5vZGUtPmZpZCA9IGRhdGEtPmZpZDsKIAl2bm9kZS0+dm9sdW1lID0gZGF0YS0+dm9sdW1lOwogCkBAIC0zODAsOCArMzgxLDcgQEAKIAogCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCi0JX2VudGVyKCJ7IGlubz0lbHUgdj0lbGx1IH0iLCBpbm9kZS0+aV9pbm8sCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpaW5vZGUtPmlfdmVyc2lvbik7CisJX2VudGVyKCJ7IGlubz0lbHUgdj0ldSB9IiwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9nZW5lcmF0aW9uKTsKIAogCWdlbmVyaWNfZmlsbGF0dHIoaW5vZGUsIHN0YXQpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ludGVybmFsLmggYi9mcy9hZnMvaW50ZXJuYWwuaAppbmRleCA1YTliNjg0Li5kMmIwODg4IDEwMDY0NAotLS0gYS9mcy9hZnMvaW50ZXJuYWwuaAorKysgYi9mcy9hZnMvaW50ZXJuYWwuaApAQCAtNjI3LDcgKzYyNyw3IEBACiBleHRlcm4gdm9pZCBhZnNfY2FjaGVfcGVybWl0KHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqLCBsb25nKTsKIGV4dGVybiB2b2lkIGFmc196YXBfcGVybWl0cyhzdHJ1Y3QgcmN1X2hlYWQgKik7CiBleHRlcm4gc3RydWN0IGtleSAqYWZzX3JlcXVlc3Rfa2V5KHN0cnVjdCBhZnNfY2VsbCAqKTsKLWV4dGVybiBpbnQgYWZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICosIGludCwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgYWZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICosIGludCk7CiAKIC8qCiAgKiBzZXJ2ZXIuYwpAQCAtNzUwLDcgKzc1MCw3IEBACiBleHRlcm4gc3NpemVfdCBhZnNfZmlsZV93cml0ZShzdHJ1Y3Qga2lvY2IgKiwgY29uc3Qgc3RydWN0IGlvdmVjICosCiAJCQkgICAgICB1bnNpZ25lZCBsb25nLCBsb2ZmX3QpOwogZXh0ZXJuIGludCBhZnNfd3JpdGViYWNrX2FsbChzdHJ1Y3QgYWZzX3Zub2RlICopOwotZXh0ZXJuIGludCBhZnNfZnN5bmMoc3RydWN0IGZpbGUgKiwgaW50KTsKK2V4dGVybiBpbnQgYWZzX2ZzeW5jKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgbG9mZl90LCBpbnQpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zZWN1cml0eS5jIGIvZnMvYWZzL3NlY3VyaXR5LmMKaW5kZXggZjQ0YjlkMy4uOGQwMTA0MiAxMDA2NDQKLS0tIGEvZnMvYWZzL3NlY3VyaXR5LmMKKysrIGIvZnMvYWZzL3NlY3VyaXR5LmMKQEAgLTI4NSwxNCArMjg1LDE0IEBACiAgKiAtIEFGUyBBQ0xzIGFyZSBhdHRhY2hlZCB0byBkaXJlY3RvcmllcyBvbmx5LCBhbmQgYSBmaWxlIGlzIGNvbnRyb2xsZWQgYnkgaXRzCiAgKiAgIHBhcmVudCBkaXJlY3RvcnkncyBBQ0wKICAqLwotaW50IGFmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitpbnQgYWZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCiB7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShpbm9kZSk7CiAJYWZzX2FjY2Vzc190IHVuaW5pdGlhbGl6ZWRfdmFyKGFjY2Vzcyk7CiAJc3RydWN0IGtleSAqa2V5OwogCWludCByZXQ7CiAKLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKKwlpZiAobWFzayAmIE1BWV9OT1RfQkxPQ0spCiAJCXJldHVybiAtRUNISUxEOwogCiAJX2VudGVyKCJ7eyV4OiV1fSwlbHh9LCV4LCIsCkBAIC0zNTAsNyArMzUwLDcgQEAKIAl9CiAKIAlrZXlfcHV0KGtleSk7Ci0JcmV0ID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBmbGFncywgTlVMTCk7CisJcmV0ID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrKTsKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9mcy9hZnMvc3VwZXIuYyBiL2ZzL2Fmcy9zdXBlci5jCmluZGV4IGZiMjQwZTguLjM1NmRjZjAgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9zdXBlci5jCisrKyBiL2ZzL2Fmcy9zdXBlci5jCkBAIC0zMSw4ICszMSw4IEBACiBzdGF0aWMgdm9pZCBhZnNfaV9pbml0X29uY2Uodm9pZCAqZm9vKTsKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphZnNfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCiAJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgYWZzX2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBzdGF0aWMgc3RydWN0IGlub2RlICphZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7Ci1zdGF0aWMgdm9pZCBhZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIHZvaWQgYWZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiBzdGF0aWMgaW50IGFmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKIApAQCAtNDAsNyArNDAsNyBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJPSAiYWZzIiwKIAkubW91bnQJCT0gYWZzX21vdW50LAotCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorCS5raWxsX3NiCT0gYWZzX2tpbGxfc3VwZXIsCiAJLmZzX2ZsYWdzCT0gMCwKIH07CiAKQEAgLTUwLDcgKzUwLDYgQEAKIAkuZHJvcF9pbm9kZQk9IGFmc19kcm9wX2lub2RlLAogCS5kZXN0cm95X2lub2RlCT0gYWZzX2Rlc3Ryb3lfaW5vZGUsCiAJLmV2aWN0X2lub2RlCT0gYWZzX2V2aWN0X2lub2RlLAotCS5wdXRfc3VwZXIJPSBhZnNfcHV0X3N1cGVyLAogCS5zaG93X29wdGlvbnMJPSBnZW5lcmljX3Nob3dfb3B0aW9ucywKIH07CiAKQEAgLTI4MiwxOSArMjgxLDI1IEBACiAgKi8KIHN0YXRpYyBpbnQgYWZzX3Rlc3Rfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqcGFyYW1zID0gZGF0YTsKKwlzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKmFzMSA9IGRhdGE7CiAJc3RydWN0IGFmc19zdXBlcl9pbmZvICphcyA9IHNiLT5zX2ZzX2luZm87CiAKLQlyZXR1cm4gYXMtPnZvbHVtZSA9PSBwYXJhbXMtPnZvbHVtZTsKKwlyZXR1cm4gYXMtPnZvbHVtZSA9PSBhczEtPnZvbHVtZTsKK30KKworc3RhdGljIGludCBhZnNfc2V0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCit7CisJc2ItPnNfZnNfaW5mbyA9IGRhdGE7CisJcmV0dXJuIHNldF9hbm9uX3N1cGVyKHNiLCBOVUxMKTsKIH0KIAogLyoKICAqIGZpbGwgaW4gdGhlIHN1cGVyYmxvY2sKICAqLwotc3RhdGljIGludCBhZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBhZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICBzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqcGFyYW1zKQogewotCXN0cnVjdCBhZnNfbW91bnRfcGFyYW1zICpwYXJhbXMgPSBkYXRhOwotCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXMgPSBOVUxMOworCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXMgPSBzYi0+c19mc19pbmZvOwogCXN0cnVjdCBhZnNfZmlkIGZpZDsKIAlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKQEAgLTMwMiwyMyArMzA3LDEzIEBACiAKIAlfZW50ZXIoIiIpOwogCi0JLyogYWxsb2NhdGUgYSBzdXBlcmJsb2NrIGluZm8gcmVjb3JkICovCi0JYXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX3N1cGVyX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFzKSB7Ci0JCV9sZWF2ZSgiID0gLUVOT01FTSIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlhZnNfZ2V0X3ZvbHVtZShwYXJhbXMtPnZvbHVtZSk7Ci0JYXMtPnZvbHVtZSA9IHBhcmFtcy0+dm9sdW1lOwotCiAJLyogZmlsbCBpbiB0aGUgc3VwZXJibG9jayAqLwogCXNiLT5zX2Jsb2Nrc2l6ZQkJPSBQQUdFX0NBQ0hFX1NJWkU7CiAJc2ItPnNfYmxvY2tzaXplX2JpdHMJPSBQQUdFX0NBQ0hFX1NISUZUOwogCXNiLT5zX21hZ2ljCQk9IEFGU19GU19NQUdJQzsKIAlzYi0+c19vcAkJPSAmYWZzX3N1cGVyX29wczsKLQlzYi0+c19mc19pbmZvCQk9IGFzOwogCXNiLT5zX2JkaQkJPSAmYXMtPnZvbHVtZS0+YmRpOworCXN0cmxjcHkoc2ItPnNfaWQsIGFzLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLCBzaXplb2Yoc2ItPnNfaWQpKTsKIAogCS8qIGFsbG9jYXRlIHRoZSByb290IGlub2RlIGFuZCBkZW50cnkgKi8KIAlmaWQudmlkCQk9IGFzLT52b2x1bWUtPnZpZDsKQEAgLTMyNiw3ICszMjEsNyBAQAogCWZpZC51bmlxdWUJPSAxOwogCWlub2RlID0gYWZzX2lnZXQoc2IsIHBhcmFtcy0+a2V5LCAmZmlkLCBOVUxMLCBOVUxMKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkKLQkJZ290byBlcnJvcl9pbm9kZTsKKwkJcmV0dXJuIFBUUl9FUlIoaW5vZGUpOwogCiAJaWYgKHBhcmFtcy0+YXV0b2NlbGwpCiAJCXNldF9iaXQoQUZTX1ZOT0RFX0FVVE9DRUxMLCAmQUZTX0ZTX0koaW5vZGUpLT5mbGFncyk7CkBAIC0zNDIsMTYgKzMzNyw4IEBACiAJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7CiAKLWVycm9yX2lub2RlOgotCXJldCA9IFBUUl9FUlIoaW5vZGUpOwotCWlub2RlID0gTlVMTDsKIGVycm9yOgogCWlwdXQoaW5vZGUpOwotCWFmc19wdXRfdm9sdW1lKGFzLT52b2x1bWUpOwotCWtmcmVlKGFzKTsKLQotCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwotCiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTM2Nyw2ICszNTQsNyBAQAogCXN0cnVjdCBhZnNfdm9sdW1lICp2b2w7CiAJc3RydWN0IGtleSAqa2V5OwogCWNoYXIgKm5ld19vcHRzID0ga3N0cmR1cChvcHRpb25zLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKmFzOwogCWludCByZXQ7CiAKIAlfZW50ZXIoIiwsJXMsJXAiLCBkZXZfbmFtZSwgb3B0aW9ucyk7CkBAIC0zOTksMTIgKzM4NywyMiBAQAogCQlyZXQgPSBQVFJfRVJSKHZvbCk7CiAJCWdvdG8gZXJyb3I7CiAJfQotCXBhcmFtcy52b2x1bWUgPSB2b2w7CisKKwkvKiBhbGxvY2F0ZSBhIHN1cGVyYmxvY2sgaW5mbyByZWNvcmQgKi8KKwlhcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfc3VwZXJfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghYXMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJYWZzX3B1dF92b2x1bWUodm9sKTsKKwkJZ290byBlcnJvcjsKKwl9CisJYXMtPnZvbHVtZSA9IHZvbDsKIAogCS8qIGFsbG9jYXRlIGEgZGV2aWNlbGVzcyBzdXBlcmJsb2NrICovCi0Jc2IgPSBzZ2V0KGZzX3R5cGUsIGFmc190ZXN0X3N1cGVyLCBzZXRfYW5vbl9zdXBlciwgJnBhcmFtcyk7CisJc2IgPSBzZ2V0KGZzX3R5cGUsIGFmc190ZXN0X3N1cGVyLCBhZnNfc2V0X3N1cGVyLCBhcyk7CiAJaWYgKElTX0VSUihzYikpIHsKIAkJcmV0ID0gUFRSX0VSUihzYik7CisJCWFmc19wdXRfdm9sdW1lKHZvbCk7CisJCWtmcmVlKGFzKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTQyMiwxNiArNDIwLDE2IEBACiAJfSBlbHNlIHsKIAkJX2RlYnVnKCJyZXVzZSIpOwogCQlBU1NFUlRDTVAoc2ItPnNfZmxhZ3MsICYsIE1TX0FDVElWRSk7CisJCWFmc19wdXRfdm9sdW1lKHZvbCk7CisJCWtmcmVlKGFzKTsKIAl9CiAKLQlhZnNfcHV0X3ZvbHVtZShwYXJhbXMudm9sdW1lKTsKIAlhZnNfcHV0X2NlbGwocGFyYW1zLmNlbGwpOwogCWtmcmVlKG5ld19vcHRzKTsKIAlfbGVhdmUoIiA9IDAgWyVwXSIsIHNiKTsKIAlyZXR1cm4gZGdldChzYi0+c19yb290KTsKIAogZXJyb3I6Ci0JYWZzX3B1dF92b2x1bWUocGFyYW1zLnZvbHVtZSk7CiAJYWZzX3B1dF9jZWxsKHBhcmFtcy5jZWxsKTsKIAlrZXlfcHV0KHBhcmFtcy5rZXkpOwogCWtmcmVlKG5ld19vcHRzKTsKQEAgLTQzOSwxOCArNDM3LDEyIEBACiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAotLyoKLSAqIGZpbmlzaCB0aGUgdW5tb3VudGluZyBwcm9jZXNzIG9uIHRoZSBzdXBlcmJsb2NrCi0gKi8KLXN0YXRpYyB2b2lkIGFmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyB2b2lkIGFmc19raWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGFmc19zdXBlcl9pbmZvICphcyA9IHNiLT5zX2ZzX2luZm87Ci0KLQlfZW50ZXIoIiIpOwotCisJa2lsbF9hbm9uX3N1cGVyKHNiKTsKIAlhZnNfcHV0X3ZvbHVtZShhcy0+dm9sdW1lKTsKLQotCV9sZWF2ZSgiIik7CisJa2ZyZWUoYXMpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvYWZzL3dyaXRlLmMgYi9mcy9hZnMvd3JpdGUuYwppbmRleCA3ODliM2FmLi45YWE1MmQ5IDEwMDY0NAotLS0gYS9mcy9hZnMvd3JpdGUuYworKysgYi9mcy9hZnMvd3JpdGUuYwpAQCAtODQsMjMgKzg0LDIxIEBACiAgKiBwYXJ0bHkgb3Igd2hvbGx5IGZpbGwgYSBwYWdlIHRoYXQncyB1bmRlciBwcmVwYXJhdGlvbiBmb3Igd3JpdGluZwogICovCiBzdGF0aWMgaW50IGFmc19maWxsX3BhZ2Uoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSwKLQkJCSBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHN0cnVjdCBwYWdlICpwYWdlKQorCQkJIGxvZmZfdCBwb3MsIHN0cnVjdCBwYWdlICpwYWdlKQogewogCWxvZmZfdCBpX3NpemU7Ci0JdW5zaWduZWQgZW9mOwogCWludCByZXQ7CisJaW50IGxlbjsKIAotCV9lbnRlcigiLCwlbGx1LCV1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZylwb3MsIGxlbik7Ci0KLQlBU1NFUlRDTVAobGVuLCA8PSwgUEFHRV9DQUNIRV9TSVpFKTsKKwlfZW50ZXIoIiwsJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpcG9zKTsKIAogCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKCZ2bm9kZS0+dmZzX2lub2RlKTsKLQlpZiAocG9zICsgbGVuID4gaV9zaXplKQotCQllb2YgPSBpX3NpemU7CisJaWYgKHBvcyArIFBBR0VfQ0FDSEVfU0laRSA+IGlfc2l6ZSkKKwkJbGVuID0gaV9zaXplIC0gcG9zOwogCWVsc2UKLQkJZW9mID0gUEFHRV9DQUNIRV9TSVpFOworCQlsZW4gPSBQQUdFX0NBQ0hFX1NJWkU7CiAKLQlyZXQgPSBhZnNfdm5vZGVfZmV0Y2hfZGF0YSh2bm9kZSwga2V5LCAwLCBlb2YsIHBhZ2UpOworCXJldCA9IGFmc192bm9kZV9mZXRjaF9kYXRhKHZub2RlLCBrZXksIHBvcywgbGVuLCBwYWdlKTsKIAlpZiAocmV0IDwgMCkgewogCQlpZiAocmV0ID09IC1FTk9FTlQpIHsKIAkJCV9kZWJ1ZygiZ290IE5PRU5UIGZyb20gc2VydmVyIgpAQCAtMTUzLDkgKzE1MSw4IEBACiAJKnBhZ2VwID0gcGFnZTsKIAkvKiBwYWdlIHdvbid0IGxlYWsgaW4gZXJyb3IgY2FzZTogaXQgZXZlbnR1YWxseSBnZXRzIGNsZWFuZWQgb2ZmIExSVSAqLwogCi0JaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJX2RlYnVnKCJub3QgdXAgdG8gZGF0ZSIpOwotCQlyZXQgPSBhZnNfZmlsbF9wYWdlKHZub2RlLCBrZXksIHBvcywgbGVuLCBwYWdlKTsKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSAmJiBsZW4gIT0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCXJldCA9IGFmc19maWxsX3BhZ2Uodm5vZGUsIGtleSwgaW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCwgcGFnZSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlrZnJlZShjYW5kaWRhdGUpOwogCQkJX2xlYXZlKCIgPSAlZCBbcHJlcF0iLCByZXQpOwpAQCAtNjg0LDkgKzY4MSwxMCBAQAogICogLSB0aGUgcmV0dXJuIHN0YXR1cyBmcm9tIHRoaXMgY2FsbCBwcm92aWRlcyBhIHJlbGlhYmxlIGluZGljYXRpb24gb2YKICAqICAgd2hldGhlciBhbnkgd3JpdGUgZXJyb3JzIG9jY3VycmVkIGZvciB0aGlzIHByb2Nlc3MuCiAgKi8KLWludCBhZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK2ludCBhZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgYWZzX3dyaXRlYmFjayAqd2IsICp4d2I7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShkZW50cnktPmRfaW5vZGUpOwogCWludCByZXQ7CkBAIC02OTUsMTIgKzY5MywxOSBAQAogCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKIAkgICAgICAgZGF0YXN5bmMpOwogCisJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwogCS8qIHVzZSBhIHdyaXRlYmFjayByZWNvcmQgYXMgYSBtYXJrZXIgaW4gdGhlIHF1ZXVlIC0gd2hlbiB0aGlzIHJlYWNoZXMKIAkgKiB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLCBhbGwgdGhlIG91dHN0YW5kaW5nIHdyaXRlcyBhcmUgZWl0aGVyCiAJICogY29tcGxldGVkIG9yIHJlamVjdGVkICovCiAJd2IgPSBremFsbG9jKHNpemVvZigqd2IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdiKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIXdiKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KIAl3Yi0+dm5vZGUgPSB2bm9kZTsKIAl3Yi0+Zmlyc3QgPSAwOwogCXdiLT5sYXN0ID0gLTE7CkBAIC03MjMsNyArNzI4LDcgQEAKIAlpZiAocmV0IDwgMCkgewogCQlhZnNfcHV0X3dyaXRlYmFjayh3Yik7CiAJCV9sZWF2ZSgiID0gJWQgW3diXSIsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCS8qIHdhaXQgZm9yIHRoZSBwcmVjZWRpbmcgd3JpdGVzIHRvIGFjdHVhbGx5IGNvbXBsZXRlICovCkBAIC03MzIsNiArNzM3LDggQEAKIAkJCQkgICAgICAgdm5vZGUtPndyaXRlYmFja3MubmV4dCA9PSAmd2ItPmxpbmspOwogCWFmc19wdXRfd3JpdGViYWNrKHdiKTsKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKK291dDoKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9hbm9uX2lub2Rlcy5jIGIvZnMvYW5vbl9pbm9kZXMuYwppbmRleCBjNTU2N2NiLi40ZDQzM2QzIDEwMDY0NAotLS0gYS9mcy9hbm9uX2lub2Rlcy5jCisrKyBiL2ZzL2Fub25faW5vZGVzLmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogCXJldHVybiAwOwogCiBlcnJfbW50cHV0OgotCW1udHB1dChhbm9uX2lub2RlX21udCk7CisJa2Vybl91bm1vdW50KGFub25faW5vZGVfbW50KTsKIGVycl91bnJlZ2lzdGVyX2ZpbGVzeXN0ZW06CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZhbm9uX2lub2RlX2ZzX3R5cGUpOwogZXJyX2V4aXQ6CmRpZmYgLS1naXQgYS9mcy9hdHRyLmMgYi9mcy9hdHRyLmMKaW5kZXggY2FmMmFhNS4uNTM4ZTI3OSAxMDA2NDQKLS0tIGEvZnMvYXR0ci5jCisrKyBiL2ZzL2F0dHIuYwpAQCAtMjMyLDE3ICsyMzIsMTEgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmIChpYV92YWxpZCAmIEFUVFJfU0laRSkKLQkJZG93bl93cml0ZSgmZGVudHJ5LT5kX2lub2RlLT5pX2FsbG9jX3NlbSk7Ci0KIAlpZiAoaW5vZGUtPmlfb3AtPnNldGF0dHIpCiAJCWVycm9yID0gaW5vZGUtPmlfb3AtPnNldGF0dHIoZGVudHJ5LCBhdHRyKTsKIAllbHNlCiAJCWVycm9yID0gc2ltcGxlX3NldGF0dHIoZGVudHJ5LCBhdHRyKTsKIAotCWlmIChpYV92YWxpZCAmIEFUVFJfU0laRSkKLQkJdXBfd3JpdGUoJmRlbnRyeS0+ZF9pbm9kZS0+aV9hbGxvY19zZW0pOwotCiAJaWYgKCFlcnJvcikKIAkJZnNub3RpZnlfY2hhbmdlKGRlbnRyeSwgaWFfdmFsaWQpOwogCmRpZmYgLS1naXQgYS9mcy9iYWRfaW5vZGUuYyBiL2ZzL2JhZF9pbm9kZS5jCmluZGV4IDlhZDIzNjkuLjkyMDVjZjIgMTAwNjQ0Ci0tLSBhL2ZzL2JhZF9pbm9kZS5jCisrKyBiL2ZzL2JhZF9pbm9kZS5jCkBAIC04Nyw3ICs4Nyw4IEBACiAJcmV0dXJuIC1FSU87CiB9CiAKLXN0YXRpYyBpbnQgYmFkX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK3N0YXRpYyBpbnQgYmFkX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwKKwkJCSAgaW50IGRhdGFzeW5jKQogewogCXJldHVybiAtRUlPOwogfQpAQCAtMjI5LDExICsyMzAsOCBAQAogCXJldHVybiAtRUlPOwogfQogCi1zdGF0aWMgaW50IGJhZF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IGJhZF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKLQogCXJldHVybiAtRUlPOwogfQogCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmLmMgYi9mcy9iaW5mbXRfZWxmLmMKaW5kZXggMzAzOTgzZi4uZGQwZmRmYyAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZi5jCisrKyBiL2ZzL2JpbmZtdF9lbGYuYwpAQCAtNjY4LDggKzY2OCw3IEBACiAJCQkgKiBtbS0+ZHVtcGFibGUgPSAwIHJlZ2FyZGxlc3Mgb2YgdGhlIGludGVycHJldGVyJ3MKIAkJCSAqIHBlcm1pc3Npb25zLgogCQkJICovCi0JCQlpZiAoZmlsZV9wZXJtaXNzaW9uKGludGVycHJldGVyLCBNQVlfUkVBRCkgPCAwKQotCQkJCWJwcm0tPmludGVycF9mbGFncyB8PSBCSU5QUk1fRkxBR1NfRU5GT1JDRV9OT05EVU1QOworCQkJd291bGRfZHVtcChicHJtLCBpbnRlcnByZXRlcik7CiAKIAkJCXJldHZhbCA9IGtlcm5lbF9yZWFkKGludGVycHJldGVyLCAwLCBicHJtLT5idWYsCiAJCQkJCSAgICAgQklOUFJNX0JVRl9TSVpFKTsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYyBiL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYwppbmRleCA2MzAzOWVkLi4zMDc0NWY0IDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmX2ZkcGljLmMKKysrIGIvZnMvYmluZm10X2VsZl9mZHBpYy5jCkBAIC0yNDUsOCArMjQ1LDcgQEAKIAkJCSAqIG1tLT5kdW1wYWJsZSA9IDAgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJwcmV0ZXIncwogCQkJICogcGVybWlzc2lvbnMuCiAJCQkgKi8KLQkJCWlmIChmaWxlX3Blcm1pc3Npb24oaW50ZXJwcmV0ZXIsIE1BWV9SRUFEKSA8IDApCi0JCQkJYnBybS0+aW50ZXJwX2ZsYWdzIHw9IEJJTlBSTV9GTEFHU19FTkZPUkNFX05PTkRVTVA7CisJCQl3b3VsZF9kdW1wKGJwcm0sIGludGVycHJldGVyKTsKIAogCQkJcmV0dmFsID0ga2VybmVsX3JlYWQoaW50ZXJwcmV0ZXIsIDAsIGJwcm0tPmJ1ZiwKIAkJCQkJICAgICBCSU5QUk1fQlVGX1NJWkUpOwpAQCAtMTg2NCw2ICsxODYzLDcgQEAKIAlrZnJlZShwc2luZm8pOwogCWtmcmVlKG5vdGVzKTsKIAlrZnJlZShmcHUpOworCWtmcmVlKHNoZHI0ZXh0bnVtKTsKICNpZmRlZiBFTEZfQ09SRV9DT1BZX1hGUFJFR1MKIAlrZnJlZSh4ZnB1KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X21pc2MuYyBiL2ZzL2JpbmZtdF9taXNjLmMKaW5kZXggMWJlZmUyZS4uYmExYTFhZSAxMDA2NDQKLS0tIGEvZnMvYmluZm10X21pc2MuYworKysgYi9mcy9iaW5mbXRfbWlzYy5jCkBAIC0xNDksOCArMTQ5LDcgQEAKIAogCQkvKiBpZiB0aGUgYmluYXJ5IGlzIG5vdCByZWFkYWJsZSB0aGFuIGVuZm9yY2UgbW0tPmR1bXBhYmxlPTAKIAkJICAgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJwcmV0ZXIncyBwZXJtaXNzaW9ucyAqLwotCQlpZiAoZmlsZV9wZXJtaXNzaW9uKGJwcm0tPmZpbGUsIE1BWV9SRUFEKSkKLQkJCWJwcm0tPmludGVycF9mbGFncyB8PSBCSU5QUk1fRkxBR1NfRU5GT1JDRV9OT05EVU1QOworCQl3b3VsZF9kdW1wKGJwcm0sIGJwcm0tPmZpbGUpOwogCiAJCWFsbG93X3dyaXRlX2FjY2VzcyhicHJtLT5maWxlKTsKIAkJYnBybS0+ZmlsZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IDFhMjQyMWYuLmM2MmZiODQgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC0zNTUsMjUgKzM1NSwzMCBAQAogCW11dGV4X2xvY2soJmJkX2lub2RlLT5pX211dGV4KTsKIAlzaXplID0gaV9zaXplX3JlYWQoYmRfaW5vZGUpOwogCisJcmV0dmFsID0gLUVJTlZBTDsKIAlzd2l0Y2ggKG9yaWdpbikgewotCQljYXNlIDI6CisJCWNhc2UgU0VFS19FTkQ6CiAJCQlvZmZzZXQgKz0gc2l6ZTsKIAkJCWJyZWFrOwotCQljYXNlIDE6CisJCWNhc2UgU0VFS19DVVI6CiAJCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CisJCWNhc2UgU0VFS19TRVQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gb3V0OwogCX0KLQlyZXR2YWwgPSAtRUlOVkFMOwogCWlmIChvZmZzZXQgPj0gMCAmJiBvZmZzZXQgPD0gc2l6ZSkgewogCQlpZiAob2Zmc2V0ICE9IGZpbGUtPmZfcG9zKSB7CiAJCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKIAkJfQogCQlyZXR2YWwgPSBvZmZzZXQ7CiAJfQorb3V0OgogCW11dGV4X3VubG9jaygmYmRfaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiB9CiAJCi1pbnQgYmxrZGV2X2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgZGF0YXN5bmMpCitpbnQgYmxrZGV2X2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmJkX2lub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBJX0JERVYoYmRfaW5vZGUpOwpAQCAtMzg0LDE0ICszODksMTAgQEAKIAkgKiBpX211dGV4IGFuZCBkb2luZyBzbyBjYXVzZXMgcGVyZm9ybWFuY2UgaXNzdWVzIHdpdGggY29uY3VycmVudAogCSAqIE9fU1lOQyB3cml0ZXJzIHRvIGEgYmxvY2sgZGV2aWNlLgogCSAqLwotCW11dGV4X3VubG9jaygmYmRfaW5vZGUtPmlfbXV0ZXgpOwotCiAJZXJyb3IgPSBibGtkZXZfaXNzdWVfZmx1c2goYmRldiwgR0ZQX0tFUk5FTCwgTlVMTCk7CiAJaWYgKGVycm9yID09IC1FT1BOT1RTVVBQKQogCQllcnJvciA9IDA7CiAKLQltdXRleF9sb2NrKCZiZF9pbm9kZS0+aV9tdXRleCk7Ci0KIAlyZXR1cm4gZXJyb3I7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa2Rldl9mc3luYyk7CkBAIC03NjIsNyArNzYzLDE5IEBACiAJaWYgKCFkaXNrKQogCQlyZXR1cm4gRVJSX1BUUigtRU5YSU8pOwogCi0Jd2hvbGUgPSBiZGdldF9kaXNrKGRpc2ssIDApOworCS8qCisJICogTm9ybWFsbHksIEBiZGV2IHNob3VsZCBlcXVhbCB3aGF0J3MgcmV0dXJuZWQgZnJvbSBiZGdldF9kaXNrKCkKKwkgKiBpZiBwYXJ0bm8gaXMgMDsgaG93ZXZlciwgc29tZSBkcml2ZXJzIChmbG9wcHkpIHVzZSBtdWx0aXBsZQorCSAqIGJkZXYncyBmb3IgdGhlIHNhbWUgcGh5c2ljYWwgZGV2aWNlIGFuZCBAYmRldiBtYXkgYmUgb25lIG9mIHRoZQorCSAqIGFsaWFzZXMuICBLZWVwIEBiZGV2IGlmIHBhcnRubyBpcyAwLiAgVGhpcyBtZWFucyBjbGFpbWVyCisJICogdHJhY2tpbmcgaXMgYnJva2VuIGZvciB0aG9zZSBkZXZpY2VzIGJ1dCBpdCBoYXMgYWx3YXlzIGJlZW4gdGhhdAorCSAqIHdheS4KKwkgKi8KKwlpZiAocGFydG5vKQorCQl3aG9sZSA9IGJkZ2V0X2Rpc2soZGlzaywgMCk7CisJZWxzZQorCQl3aG9sZSA9IGJkZ3JhYihiZGV2KTsKKwogCW1vZHVsZV9wdXQoZGlzay0+Zm9wcy0+b3duZXIpOwogCXB1dF9kaXNrKGRpc2spOwogCWlmICghd2hvbGUpCkBAIC0xNDM1LDYgKzE0NDgsOCBAQAogCiBpbnQgYmxrZGV2X3B1dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUpCiB7CisJbXV0ZXhfbG9jaygmYmRldi0+YmRfbXV0ZXgpOworCiAJaWYgKG1vZGUgJiBGTU9ERV9FWENMKSB7CiAJCWJvb2wgYmRldl9mcmVlOwogCkBAIC0xNDQzLDcgKzE0NTgsNiBAQAogCQkgKiBhcmUgcHJvdGVjdGVkIHdpdGggYmRldl9sb2NrLiAgYmRfbXV0ZXggaXMgdG8KIAkJICogc3luY2hyb25pemUgZGlza19ob2xkZXIgdW5saW5raW5nLgogCQkgKi8KLQkJbXV0ZXhfbG9jaygmYmRldi0+YmRfbXV0ZXgpOwogCQlzcGluX2xvY2soJmJkZXZfbG9jayk7CiAKIAkJV0FSTl9PTl9PTkNFKC0tYmRldi0+YmRfaG9sZGVycyA8IDApOwpAQCAtMTQ2MSwxNyArMTQ3NSwyMSBAQAogCQkgKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBjbGFpbSwgcmVtb3ZlIGhvbGRlciBsaW5rIGFuZAogCQkgKiB1bmJsb2NrIGV2cG9sbCBpZiBpdCB3YXMgYSB3cml0ZSBob2xkZXIuCiAJCSAqLwotCQlpZiAoYmRldl9mcmVlKSB7Ci0JCQlpZiAoYmRldi0+YmRfd3JpdGVfaG9sZGVyKSB7Ci0JCQkJZGlza191bmJsb2NrX2V2ZW50cyhiZGV2LT5iZF9kaXNrKTsKLQkJCQlkaXNrX2NoZWNrX2V2ZW50cyhiZGV2LT5iZF9kaXNrKTsKLQkJCQliZGV2LT5iZF93cml0ZV9ob2xkZXIgPSBmYWxzZTsKLQkJCX0KKwkJaWYgKGJkZXZfZnJlZSAmJiBiZGV2LT5iZF93cml0ZV9ob2xkZXIpIHsKKwkJCWRpc2tfdW5ibG9ja19ldmVudHMoYmRldi0+YmRfZGlzayk7CisJCQliZGV2LT5iZF93cml0ZV9ob2xkZXIgPSBmYWxzZTsKIAkJfQotCi0JCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOwogCX0KIAorCS8qCisJICogVHJpZ2dlciBldmVudCBjaGVja2luZyBhbmQgdGVsbCBkcml2ZXJzIHRvIGZsdXNoIE1FRElBX0NIQU5HRQorCSAqIGV2ZW50LiAgVGhpcyBpcyB0byBlbnN1cmUgZGV0ZWN0aW9uIG9mIG1lZGlhIHJlbW92YWwgY29tbWFuZGVkCisJICogZnJvbSB1c2VybGFuZCAtIGUuZy4gZWplY3QoMSkuCisJICovCisJZGlza19mbHVzaF9ldmVudHMoYmRldi0+YmRfZGlzaywgRElTS19FVkVOVF9NRURJQV9DSEFOR0UpOworCisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9tdXRleCk7CisKIAlyZXR1cm4gX19ibGtkZXZfcHV0KGJkZXYsIG1vZGUsIDApOwogfQogRVhQT1JUX1NZTUJPTChibGtkZXZfcHV0KTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2FjbC5jIGIvZnMvYnRyZnMvYWNsLmMKaW5kZXggZjY2ZmM5OS4uNjVhNzM1ZCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvYWNsLmMKKysrIGIvZnMvYnRyZnMvYWNsLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2lmZGVmIENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wKIAotc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKmJ0cmZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCitzdHJ1Y3QgcG9zaXhfYWNsICpidHJmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQogewogCWludCBzaXplOwogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC0xOTUsMjggKzE5NSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGJ0cmZzX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQotewotCWludCBlcnJvciA9IC1FQUdBSU47Ci0KLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkgewotCQlpZiAoIW5lZ2F0aXZlX2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUykpCi0JCQllcnJvciA9IC1FQ0hJTEQ7Ci0KLQl9IGVsc2UgewotCQlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7Ci0JCWFjbCA9IGJ0cmZzX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0JCWlmIChJU19FUlIoYWNsKSkKLQkJCXJldHVybiBQVFJfRVJSKGFjbCk7Ci0JCWlmIChhY2wpIHsKLQkJCWVycm9yID0gcG9zaXhfYWNsX3Blcm1pc3Npb24oaW5vZGUsIGFjbCwgbWFzayk7Ci0JCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCQl9Ci0JfQotCi0JcmV0dXJuIGVycm9yOwotfQotCiAvKgogICogYnRyZnNfaW5pdF9hY2wgaXMgYWxyZWFkeSBnZW5lcmFsbHkgY2FsbGVkIHVuZGVyIGZzX211dGV4LCBzbyB0aGUgbG9ja2luZwogICogc3R1ZmYgaGFzIGJlZW4gZml4ZWQgdG8gd29yayB3aXRoIHRoYXQuICBJZiB0aGUgbG9ja2luZyBzdHVmZiBjaGFuZ2VzLCB3ZQpAQCAtMjQ0LDggKzIyMiw3IEBACiAJfQogCiAJaWYgKElTX1BPU0lYQUNMKGRpcikgJiYgYWNsKSB7Ci0JCXN0cnVjdCBwb3NpeF9hY2wgKmNsb25lOwotCQltb2RlX3QgbW9kZTsKKwkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCQlyZXQgPSBidHJmc19zZXRfYWNsKHRyYW5zLCBpbm9kZSwgYWNsLApAQCAtMjUzLDIyICsyMzAsMTUgQEAKIAkJCWlmIChyZXQpCiAJCQkJZ290byBmYWlsZWQ7CiAJCX0KLQkJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfTk9GUyk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWlmICghY2xvbmUpCi0JCQlnb3RvIGZhaWxlZDsKKwkJcmV0ID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfTk9GUywgJm1vZGUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CiAKLQkJbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JCXJldCA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShjbG9uZSwgJm1vZGUpOwotCQlpZiAocmV0ID49IDApIHsKLQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOwotCQkJaWYgKHJldCA+IDApIHsKLQkJCQkvKiB3ZSBuZWVkIGFuIGFjbCAqLwotCQkJCXJldCA9IGJ0cmZzX3NldF9hY2wodHJhbnMsIGlub2RlLCBjbG9uZSwKLQkJCQkJCSAgICBBQ0xfVFlQRV9BQ0NFU1MpOwotCQkJfQorCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJaWYgKHJldCA+IDApIHsKKwkJCS8qIHdlIG5lZWQgYW4gYWNsICovCisJCQlyZXQgPSBidHJmc19zZXRfYWNsKHRyYW5zLCBpbm9kZSwgYWNsLCBBQ0xfVFlQRV9BQ0NFU1MpOwogCQl9Ci0JCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKIAl9CiBmYWlsZWQ6CiAJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKQEAgLTI3OCw3ICsyNDgsNyBAQAogCiBpbnQgYnRyZnNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqY2xvbmU7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCWludCByZXQgPSAwOwogCiAJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCkBAIC0yOTEsMTcgKzI2MSwxMSBAQAogCWlmIChJU19FUlJfT1JfTlVMTChhY2wpKQogCQlyZXR1cm4gUFRSX0VSUihhY2wpOwogCi0JY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKKwlyZXQgPSBwb3NpeF9hY2xfY2htb2QoJmFjbCwgR0ZQX0tFUk5FTCwgaW5vZGUtPmlfbW9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBidHJmc19zZXRfYWNsKE5VTEwsIGlub2RlLCBhY2wsIEFDTF9UWVBFX0FDQ0VTUyk7CiAJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKLQlpZiAoIWNsb25lKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IHBvc2l4X2FjbF9jaG1vZF9tYXNxKGNsb25lLCBpbm9kZS0+aV9tb2RlKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gYnRyZnNfc2V0X2FjbChOVUxMLCBpbm9kZSwgY2xvbmUsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0KLQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9idHJmcy9jdHJlZS5jIGIvZnMvYnRyZnMvY3RyZWUuYwppbmRleCBkODQwODkzLi4yZTY2Nzg2IDEwMDY0NAotLS0gYS9mcy9idHJmcy9jdHJlZS5jCisrKyBiL2ZzL2J0cmZzL2N0cmVlLmMKQEAgLTEyMjgsNiArMTIyOCw3IEBACiAJdTMyIG5yOwogCXUzMiBibG9ja3NpemU7CiAJdTMyIG5zY2FuID0gMDsKKwlib29sIG1hcCA9IHRydWU7CiAKIAlpZiAobGV2ZWwgIT0gMSkKIAkJcmV0dXJuOwpAQCAtMTI0OSw4ICsxMjUwLDExIEBACiAKIAlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobm9kZSk7CiAJbnIgPSBzbG90OworCWlmIChub2RlLT5tYXBfdG9rZW4gfHwgcGF0aC0+c2tpcF9sb2NraW5nKQorCQltYXAgPSBmYWxzZTsKKwogCXdoaWxlICgxKSB7Ci0JCWlmICghbm9kZS0+bWFwX3Rva2VuKSB7CisJCWlmIChtYXAgJiYgIW5vZGUtPm1hcF90b2tlbikgewogCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KG5yKTsKIAkJCW1hcF9wcml2YXRlX2V4dGVudF9idWZmZXIobm9kZSwgb2Zmc2V0LAogCQkJCQkJICBzaXplb2Yoc3RydWN0IGJ0cmZzX2tleV9wdHIpLApAQCAtMTI3Nyw3ICsxMjgxLDcgQEAKIAkJaWYgKChzZWFyY2ggPD0gdGFyZ2V0ICYmIHRhcmdldCAtIHNlYXJjaCA8PSA2NTUzNikgfHwKIAkJICAgIChzZWFyY2ggPiB0YXJnZXQgJiYgc2VhcmNoIC0gdGFyZ2V0IDw9IDY1NTM2KSkgewogCQkJZ2VuID0gYnRyZnNfbm9kZV9wdHJfZ2VuZXJhdGlvbihub2RlLCBucik7Ci0JCQlpZiAobm9kZS0+bWFwX3Rva2VuKSB7CisJCQlpZiAobWFwICYmIG5vZGUtPm1hcF90b2tlbikgewogCQkJCXVubWFwX2V4dGVudF9idWZmZXIobm9kZSwgbm9kZS0+bWFwX3Rva2VuLAogCQkJCQkJICAgIEtNX1VTRVIxKTsKIAkJCQlub2RlLT5tYXBfdG9rZW4gPSBOVUxMOwpAQCAtMTI4OSw3ICsxMjkzLDcgQEAKIAkJaWYgKChucmVhZCA+IDY1NTM2IHx8IG5zY2FuID4gMzIpKQogCQkJYnJlYWs7CiAJfQotCWlmIChub2RlLT5tYXBfdG9rZW4pIHsKKwlpZiAobWFwICYmIG5vZGUtPm1hcF90b2tlbikgewogCQl1bm1hcF9leHRlbnRfYnVmZmVyKG5vZGUsIG5vZGUtPm1hcF90b2tlbiwgS01fVVNFUjEpOwogCQlub2RlLT5tYXBfdG9rZW4gPSBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2N0cmVlLmggYi9mcy9idHJmcy9jdHJlZS5oCmluZGV4IDM3OGI1YjQuLmZlOTI4N2IgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2N0cmVlLmgKKysrIGIvZnMvYnRyZnMvY3RyZWUuaApAQCAtMTksNyArMTksNiBAQAogI2lmbmRlZiBfX0JUUkZTX0NUUkVFX18KICNkZWZpbmUgX19CVFJGU19DVFJFRV9fCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTk2Nyw2ICs5NjYsMTIgQEAKIAlzdHJ1Y3Qgc3JjdV9zdHJ1Y3Qgc3Vidm9sX3NyY3U7CiAKIAlzcGlubG9ja190IHRyYW5zX2xvY2s7CisJLyoKKwkgKiB0aGUgcmVsb2MgbXV0ZXggZ29lcyB3aXRoIHRoZSB0cmFucyBsb2NrLCBpdCBpcyB0YWtlbgorCSAqIGR1cmluZyBjb21taXQgdG8gcHJvdGVjdCB1cyBmcm9tIHRoZSByZWxvY2F0aW9uIGNvZGUKKwkgKi8KKwlzdHJ1Y3QgbXV0ZXggcmVsb2NfbXV0ZXg7CisKIAlzdHJ1Y3QgbGlzdF9oZWFkIHRyYW5zX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBoYXNoZXJzOwogCXN0cnVjdCBsaXN0X2hlYWQgZGVhZF9yb290czsKQEAgLTExNzIsNiArMTE3NywxNCBAQAogCXUzMiB0eXBlOwogCiAJdTY0IGhpZ2hlc3Rfb2JqZWN0aWQ7CisKKwkvKiBidHJmc19yZWNvcmRfcm9vdF9pbl90cmFucyBpcyBhIG11bHRpLXN0ZXAgcHJvY2VzcywKKwkgKiBhbmQgaXQgY2FuIHJhY2Ugd2l0aCB0aGUgYmFsYW5jaW5nIGNvZGUuICAgQnV0IHRoZQorCSAqIHJhY2UgaXMgdmVyeSBzbWFsbCwgYW5kIG9ubHkgdGhlIGZpcnN0IHRpbWUgdGhlIHJvb3QKKwkgKiBpcyBhZGRlZCB0byBlYWNoIHRyYW5zYWN0aW9uLiAgU28gaW5fdHJhbnNfc2V0dXAKKwkgKiBpcyB1c2VkIHRvIHRlbGwgdXMgd2hlbiBtb3JlIGNoZWNrcyBhcmUgcmVxdWlyZWQKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGluX3RyYW5zX3NldHVwOwogCWludCByZWZfY293czsKIAlpbnQgdHJhY2tfZGlydHk7CiAJaW50IGluX3JhZGl4OwpAQCAtMTE4MSw3ICsxMTk0LDYgQEAKIAlzdHJ1Y3QgYnRyZnNfa2V5IGRlZnJhZ19tYXg7CiAJaW50IGRlZnJhZ19ydW5uaW5nOwogCWNoYXIgKm5hbWU7Ci0JaW50IGluX3N5c2ZzOwogCiAJLyogdGhlIGRpcnR5IGxpc3QgaXMgb25seSB1c2VkIGJ5IG5vbi1yZWZlcmVuY2UgY291bnRlZCByb290cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZGlydHlfbGlzdDsKQEAgLTEyMDcsNyArMTIxOSw3IEBACiAJICogcmlnaHQgbm93IHRoaXMganVzdCBnZXRzIHVzZWQgc28gdGhhdCBhIHJvb3QgaGFzIGl0cyBvd24gZGV2aWQKIAkgKiBmb3Igc3RhdC4gIEl0IG1heSBiZSB1c2VkIGZvciBtb3JlIGxhdGVyCiAJICovCi0Jc3RydWN0IHN1cGVyX2Jsb2NrIGFub25fc3VwZXI7CisJZGV2X3QgYW5vbl9kZXY7CiB9OwogCiBzdHJ1Y3QgYnRyZnNfaW9jdGxfZGVmcmFnX3JhbmdlX2FyZ3MgewpAQCAtMTMyMyw2ICsxMzM1LDExIEBACiAgKi8KICNkZWZpbmUgQlRSRlNfU1RSSU5HX0lURU1fS0VZCTI1MwogCisvKgorICogRmxhZ3MgZm9yIG1vdW50IG9wdGlvbnMuCisgKgorICogTm90ZTogZG9uJ3QgZm9yZ2V0IHRvIGFkZCBuZXcgb3B0aW9ucyB0byBidHJmc19zaG93X29wdGlvbnMoKQorICovCiAjZGVmaW5lIEJUUkZTX01PVU5UX05PREFUQVNVTQkJKDEgPDwgMCkKICNkZWZpbmUgQlRSRlNfTU9VTlRfTk9EQVRBQ09XCQkoMSA8PCAxKQogI2RlZmluZSBCVFJGU19NT1VOVF9OT0JBUlJJRVIJCSgxIDw8IDIpCkBAIC0yNDkzLDYgKzI1MTAsOSBAQAogaW50IGJ0cmZzX2xvb2t1cF9jc3Vtc19yYW5nZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHN0YXJ0LCB1NjQgZW5kLAogCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBpbnQgc2VhcmNoX2NvbW1pdCk7CiAvKiBpbm9kZS5jICovCitzdHJ1Y3QgZXh0ZW50X21hcCAqYnRyZnNfZ2V0X2V4dGVudF9maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCSAgIHNpemVfdCBwZ19vZmZzZXQsIHU2NCBzdGFydCwgdTY0IGxlbiwKKwkJCQkJICAgaW50IGNyZWF0ZSk7CiAKIC8qIFJIRUwgYW5kIEVMIGtlcm5lbHMgaGF2ZSBhIHBhdGNoIHRoYXQgcmVuYW1lcyBQR19jaGVja2VkIHRvIEZzTWlzYyAqLwogI2lmIGRlZmluZWQoQ2xlYXJQYWdlRnNNaXNjKSAmJiAhZGVmaW5lZChDbGVhclBhZ2VDaGVja2VkKQpAQCAtMjU4NSw3ICsyNjA1LDcgQEAKIGludCBidHJmc19hZGRfaW5vZGVfZGVmcmFnKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgYnRyZnNfcnVuX2RlZnJhZ19pbm9kZXMoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pOwotaW50IGJ0cmZzX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKTsKK2ludCBidHJmc19zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKTsKIGludCBidHJmc19kcm9wX2V4dGVudF9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCQkgICAgaW50IHNraXBfcGlubmVkKTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ0cmZzX2ZpbGVfb3BlcmF0aW9uczsKQEAgLTI2MjUsOSArMjY0NSw5IEBACiAKIC8qIGFjbC5jICovCiAjaWZkZWYgQ09ORklHX0JUUkZTX0ZTX1BPU0lYX0FDTAotaW50IGJ0cmZzX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKTsKK3N0cnVjdCBwb3NpeF9hY2wgKmJ0cmZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpOwogI2Vsc2UKLSNkZWZpbmUgYnRyZnNfY2hlY2tfYWNsIE5VTEwKKyNkZWZpbmUgYnRyZnNfZ2V0X2FjbCBOVUxMCiAjZW5kaWYKIGludCBidHJmc19pbml0X2FjbChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5jIGIvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5jCmluZGV4IDY0NjJjMjkuLjk4YzY4ZTYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuYworKysgYi9mcy9idHJmcy9kZWxheWVkLWlub2RlLmMKQEAgLTgyLDYgKzgyLDM5IEBACiAJcmV0dXJuIHJvb3QtPmZzX2luZm8tPmRlbGF5ZWRfcm9vdDsKIH0KIAorc3RhdGljIHN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKmJ0cmZzX2dldF9kZWxheWVkX25vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfaW5vZGUgKmJ0cmZzX2lub2RlID0gQlRSRlNfSShpbm9kZSk7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBidHJmc19pbm9kZS0+cm9vdDsKKwl1NjQgaW5vID0gYnRyZnNfaW5vKGlub2RlKTsKKwlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpub2RlOworCisJbm9kZSA9IEFDQ0VTU19PTkNFKGJ0cmZzX2lub2RlLT5kZWxheWVkX25vZGUpOworCWlmIChub2RlKSB7CisJCWF0b21pY19pbmMoJm5vZGUtPnJlZnMpOworCQlyZXR1cm4gbm9kZTsKKwl9CisKKwlzcGluX2xvY2soJnJvb3QtPmlub2RlX2xvY2spOworCW5vZGUgPSByYWRpeF90cmVlX2xvb2t1cCgmcm9vdC0+ZGVsYXllZF9ub2Rlc190cmVlLCBpbm8pOworCWlmIChub2RlKSB7CisJCWlmIChidHJmc19pbm9kZS0+ZGVsYXllZF9ub2RlKSB7CisJCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsJLyogY2FuIGJlIGFjY2Vzc2VkICovCisJCQlCVUdfT04oYnRyZnNfaW5vZGUtPmRlbGF5ZWRfbm9kZSAhPSBub2RlKTsKKwkJCXNwaW5fdW5sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKKwkJCXJldHVybiBub2RlOworCQl9CisJCWJ0cmZzX2lub2RlLT5kZWxheWVkX25vZGUgPSBub2RlOworCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsJLyogY2FuIGJlIGFjY2Vzc2VkICovCisJCWF0b21pY19pbmMoJm5vZGUtPnJlZnMpOwkvKiBjYWNoZWQgaW4gdGhlIGlub2RlICovCisJCXNwaW5fdW5sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKKwkJcmV0dXJuIG5vZGU7CisJfQorCXNwaW5fdW5sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqYnRyZnNfZ2V0X29yX2NyZWF0ZV9kZWxheWVkX25vZGUoCiAJCQkJCQkJc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTkyLDI2ICsxMjUsOSBAQAogCWludCByZXQ7CiAKIGFnYWluOgotCW5vZGUgPSBBQ0NFU1NfT05DRShidHJmc19pbm9kZS0+ZGVsYXllZF9ub2RlKTsKLQlpZiAobm9kZSkgewotCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsJLyogY2FuIGJlIGFjY2Vzc2VkICovCisJbm9kZSA9IGJ0cmZzX2dldF9kZWxheWVkX25vZGUoaW5vZGUpOworCWlmIChub2RlKQogCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlzcGluX2xvY2soJnJvb3QtPmlub2RlX2xvY2spOwotCW5vZGUgPSByYWRpeF90cmVlX2xvb2t1cCgmcm9vdC0+ZGVsYXllZF9ub2Rlc190cmVlLCBpbm8pOwotCWlmIChub2RlKSB7Ci0JCWlmIChidHJmc19pbm9kZS0+ZGVsYXllZF9ub2RlKSB7Ci0JCQlzcGluX3VubG9jaygmcm9vdC0+aW5vZGVfbG9jayk7Ci0JCQlnb3RvIGFnYWluOwotCQl9Ci0JCWJ0cmZzX2lub2RlLT5kZWxheWVkX25vZGUgPSBub2RlOwotCQlhdG9taWNfaW5jKCZub2RlLT5yZWZzKTsJLyogY2FuIGJlIGFjY2Vzc2VkICovCi0JCWF0b21pY19pbmMoJm5vZGUtPnJlZnMpOwkvKiBjYWNoZWQgaW4gdGhlIGlub2RlICovCi0JCXNwaW5fdW5sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCXNwaW5fdW5sb2NrKCZyb290LT5pbm9kZV9sb2NrKTsKIAogCW5vZGUgPSBrbWVtX2NhY2hlX2FsbG9jKGRlbGF5ZWRfbm9kZV9jYWNoZSwgR0ZQX05PRlMpOwogCWlmICghbm9kZSkKQEAgLTI5Nyw3ICszMTMsNiBAQAogCQlpdGVtLT5kYXRhX2xlbiA9IGRhdGFfbGVuOwogCQlpdGVtLT5pbnNfb3JfZGVsID0gMDsKIAkJaXRlbS0+Ynl0ZXNfcmVzZXJ2ZWQgPSAwOwotCQlpdGVtLT5ibG9ja19yc3YgPSBOVUxMOwogCQlpdGVtLT5kZWxheWVkX25vZGUgPSBOVUxMOwogCQlhdG9taWNfc2V0KCZpdGVtLT5yZWZzLCAxKTsKIAl9CkBAIC01NDksMTkgKzU2NCw2IEBACiAJcmV0dXJuIG5leHQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqYnRyZnNfZ2V0X2RlbGF5ZWRfbm9kZSgKLQkJCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBidHJmc19pbm9kZSAqYnRyZnNfaW5vZGUgPSBCVFJGU19JKGlub2RlKTsKLQlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpkZWxheWVkX25vZGU7Ci0KLQlkZWxheWVkX25vZGUgPSBidHJmc19pbm9kZS0+ZGVsYXllZF9ub2RlOwotCWlmIChkZWxheWVkX25vZGUpCi0JCWF0b21pY19pbmMoJmRlbGF5ZWRfbm9kZS0+cmVmcyk7Ci0KLQlyZXR1cm4gZGVsYXllZF9ub2RlOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBidHJmc19yb290ICpidHJmc19nZXRfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkJCSAgIHU2NCByb290X2lkKQogewpAQCAtNTkzLDEwICs1OTUsOCBAQAogCiAJbnVtX2J5dGVzID0gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsIDEpOwogCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9taWdyYXRlKHNyY19yc3YsIGRzdF9yc3YsIG51bV9ieXRlcyk7Ci0JaWYgKCFyZXQpIHsKKwlpZiAoIXJldCkKIAkJaXRlbS0+Ynl0ZXNfcmVzZXJ2ZWQgPSBudW1fYnl0ZXM7Ci0JCWl0ZW0tPmJsb2NrX3JzdiA9IGRzdF9yc3Y7Ci0JfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTYwNCwxMCArNjA0LDEzIEBACiBzdGF0aWMgdm9pZCBidHJmc19kZWxheWVkX2l0ZW1fcmVsZWFzZV9tZXRhZGF0YShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkJCXN0cnVjdCBidHJmc19kZWxheWVkX2l0ZW0gKml0ZW0pCiB7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqcnN2OworCiAJaWYgKCFpdGVtLT5ieXRlc19yZXNlcnZlZCkKIAkJcmV0dXJuOwogCi0JYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgaXRlbS0+YmxvY2tfcnN2LAorCXJzdiA9ICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCWJ0cmZzX2Jsb2NrX3Jzdl9yZWxlYXNlKHJvb3QsIHJzdiwKIAkJCQlpdGVtLT5ieXRlc19yZXNlcnZlZCk7CiB9CiAKQEAgLTEwMTQsNiArMTAxNyw3IEBACiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcm9vdCAqZGVsYXllZF9yb290OwogCXN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKmN1cnJfbm9kZSwgKnByZXZfbm9kZTsKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3Y7CiAJaW50IHJldCA9IDA7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwpAQCAtMTAyMSw2ICsxMDI1LDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOwogCisJYmxvY2tfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKKwl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisKIAlkZWxheWVkX3Jvb3QgPSBidHJmc19nZXRfZGVsYXllZF9yb290KHJvb3QpOwogCiAJY3Vycl9ub2RlID0gYnRyZnNfZmlyc3RfZGVsYXllZF9ub2RlKGRlbGF5ZWRfcm9vdCk7CkBAIC0xMDQ1LDYgKzEwNTIsNyBAQAogCX0KIAogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwl0cmFucy0+YmxvY2tfcnN2ID0gYmxvY2tfcnN2OwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwNTIsNiArMTA2MCw3IEBACiAJCQkJCSAgICAgIHN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKm5vZGUpCiB7CiAJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2OwogCWludCByZXQ7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwpAQCAtMTA1OSw2ICsxMDY4LDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOwogCisJYmxvY2tfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKKwl0cmFucy0+YmxvY2tfcnN2ID0gJm5vZGUtPnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisKIAlyZXQgPSBidHJmc19pbnNlcnRfZGVsYXllZF9pdGVtcyh0cmFucywgcGF0aCwgbm9kZS0+cm9vdCwgbm9kZSk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IGJ0cmZzX2RlbGV0ZV9kZWxheWVkX2l0ZW1zKHRyYW5zLCBwYXRoLCBub2RlLT5yb290LCBub2RlKTsKQEAgLTEwNjYsNiArMTA3OCw3IEBACiAJCXJldCA9IGJ0cmZzX3VwZGF0ZV9kZWxheWVkX2lub2RlKHRyYW5zLCBub2RlLT5yb290LCBwYXRoLCBub2RlKTsKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAKKwl0cmFucy0+YmxvY2tfcnN2ID0gYmxvY2tfcnN2OwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMTYsNiArMTEyOSw3IEBACiAJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqZGVsYXllZF9ub2RlID0gTlVMTDsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3Y7CiAJdW5zaWduZWQgbG9uZyBuciA9IDA7CiAJaW50IG5lZWRfcmVxdWV1ZSA9IDA7CiAJaW50IHJldDsKQEAgLTExMzQsNiArMTE0OCw5IEBACiAJaWYgKElTX0VSUih0cmFucykpCiAJCWdvdG8gZnJlZV9wYXRoOwogCisJYmxvY2tfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKKwl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisKIAlyZXQgPSBidHJmc19pbnNlcnRfZGVsYXllZF9pdGVtcyh0cmFucywgcGF0aCwgcm9vdCwgZGVsYXllZF9ub2RlKTsKIAlpZiAoIXJldCkKIAkJcmV0ID0gYnRyZnNfZGVsZXRlX2RlbGF5ZWRfaXRlbXModHJhbnMsIHBhdGgsIHJvb3QsCkBAIC0xMTc2LDYgKzExOTMsNyBAQAogCiAJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CiAKKwl0cmFucy0+YmxvY2tfcnN2ID0gYmxvY2tfcnN2OwogCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl9kbWV0YSh0cmFucywgcm9vdCk7CiAJX19idHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIG5yKTsKIGZyZWVfcGF0aDoKQEAgLTEyMjIsNiArMTI0MCwxMyBAQAogCXJldHVybiAwOwogfQogCit2b2lkIGJ0cmZzX2Fzc2VydF9kZWxheWVkX3Jvb3RfZW1wdHkoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcm9vdCAqZGVsYXllZF9yb290OworCWRlbGF5ZWRfcm9vdCA9IGJ0cmZzX2dldF9kZWxheWVkX3Jvb3Qocm9vdCk7CisJV0FSTl9PTihidHJmc19maXJzdF9kZWxheWVkX25vZGUoZGVsYXllZF9yb290KSk7Cit9CisKIHZvaWQgYnRyZnNfYmFsYW5jZV9kZWxheWVkX2l0ZW1zKHN0cnVjdCBidHJmc19yb290ICpyb290KQogewogCXN0cnVjdCBidHJmc19kZWxheWVkX3Jvb3QgKmRlbGF5ZWRfcm9vdDsKQEAgLTEzODIsOCArMTQwNyw3IEBACiAKIGludCBidHJmc19pbm9kZV9kZWxheWVkX2Rpcl9pbmRleF9jb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKmRlbGF5ZWRfbm9kZSA9IEJUUkZTX0koaW5vZGUpLT5kZWxheWVkX25vZGU7Ci0JaW50IHJldCA9IDA7CisJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfbm9kZSAqZGVsYXllZF9ub2RlID0gYnRyZnNfZ2V0X2RlbGF5ZWRfbm9kZShpbm9kZSk7CiAKIAlpZiAoIWRlbGF5ZWRfbm9kZSkKIAkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0xMzkzLDExICsxNDE3LDE0IEBACiAJICogYSBuZXcgZGlyZWN0b3J5IGluZGV4IGlzIGFkZGVkIGludG8gdGhlIGRlbGF5ZWQgbm9kZSBhbmQgaW5kZXhfY250CiAJICogaXMgdXBkYXRlZCBub3cuIFNvIHdlIG5lZWRuJ3QgbG9jayB0aGUgZGVsYXllZCBub2RlLgogCSAqLwotCWlmICghZGVsYXllZF9ub2RlLT5pbmRleF9jbnQpCisJaWYgKCFkZWxheWVkX25vZGUtPmluZGV4X2NudCkgeworCQlidHJmc19yZWxlYXNlX2RlbGF5ZWRfbm9kZShkZWxheWVkX25vZGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlCVFJGU19JKGlub2RlKS0+aW5kZXhfY250ID0gZGVsYXllZF9ub2RlLT5pbmRleF9jbnQ7Ci0JcmV0dXJuIHJldDsKKwlidHJmc19yZWxlYXNlX2RlbGF5ZWRfbm9kZShkZWxheWVkX25vZGUpOworCXJldHVybiAwOwogfQogCiB2b2lkIGJ0cmZzX2dldF9kZWxheWVkX2l0ZW1zKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsaXN0X2hlYWQgKmluc19saXN0LApAQCAtMTU5MSw2ICsxNjE4LDU3IEBACiAJCQkJICAgICAgaW5vZGUtPmlfY3RpbWUudHZfbnNlYyk7CiB9CiAKK2ludCBidHJmc19maWxsX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqcmRldikKK3sKKwlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9ub2RlICpkZWxheWVkX25vZGU7CisJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlub2RlX2l0ZW07CisJc3RydWN0IGJ0cmZzX3RpbWVzcGVjICp0c3BlYzsKKworCWRlbGF5ZWRfbm9kZSA9IGJ0cmZzX2dldF9kZWxheWVkX25vZGUoaW5vZGUpOworCWlmICghZGVsYXllZF9ub2RlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW11dGV4X2xvY2soJmRlbGF5ZWRfbm9kZS0+bXV0ZXgpOworCWlmICghZGVsYXllZF9ub2RlLT5pbm9kZV9kaXJ0eSkgeworCQltdXRleF91bmxvY2soJmRlbGF5ZWRfbm9kZS0+bXV0ZXgpOworCQlidHJmc19yZWxlYXNlX2RlbGF5ZWRfbm9kZShkZWxheWVkX25vZGUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpbm9kZV9pdGVtID0gJmRlbGF5ZWRfbm9kZS0+aW5vZGVfaXRlbTsKKworCWlub2RlLT5pX3VpZCA9IGJ0cmZzX3N0YWNrX2lub2RlX3VpZChpbm9kZV9pdGVtKTsKKwlpbm9kZS0+aV9naWQgPSBidHJmc19zdGFja19pbm9kZV9naWQoaW5vZGVfaXRlbSk7CisJYnRyZnNfaV9zaXplX3dyaXRlKGlub2RlLCBidHJmc19zdGFja19pbm9kZV9zaXplKGlub2RlX2l0ZW0pKTsKKwlpbm9kZS0+aV9tb2RlID0gYnRyZnNfc3RhY2tfaW5vZGVfbW9kZShpbm9kZV9pdGVtKTsKKwlpbm9kZS0+aV9ubGluayA9IGJ0cmZzX3N0YWNrX2lub2RlX25saW5rKGlub2RlX2l0ZW0pOworCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgYnRyZnNfc3RhY2tfaW5vZGVfbmJ5dGVzKGlub2RlX2l0ZW0pKTsKKwlCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbiA9IGJ0cmZzX3N0YWNrX2lub2RlX2dlbmVyYXRpb24oaW5vZGVfaXRlbSk7CisJQlRSRlNfSShpbm9kZSktPnNlcXVlbmNlID0gYnRyZnNfc3RhY2tfaW5vZGVfc2VxdWVuY2UoaW5vZGVfaXRlbSk7CisJaW5vZGUtPmlfcmRldiA9IDA7CisJKnJkZXYgPSBidHJmc19zdGFja19pbm9kZV9yZGV2KGlub2RlX2l0ZW0pOworCUJUUkZTX0koaW5vZGUpLT5mbGFncyA9IGJ0cmZzX3N0YWNrX2lub2RlX2ZsYWdzKGlub2RlX2l0ZW0pOworCisJdHNwZWMgPSBidHJmc19pbm9kZV9hdGltZShpbm9kZV9pdGVtKTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBidHJmc19zdGFja190aW1lc3BlY19zZWModHNwZWMpOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBidHJmc19zdGFja190aW1lc3BlY19uc2VjKHRzcGVjKTsKKworCXRzcGVjID0gYnRyZnNfaW5vZGVfbXRpbWUoaW5vZGVfaXRlbSk7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gYnRyZnNfc3RhY2tfdGltZXNwZWNfc2VjKHRzcGVjKTsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gYnRyZnNfc3RhY2tfdGltZXNwZWNfbnNlYyh0c3BlYyk7CisKKwl0c3BlYyA9IGJ0cmZzX2lub2RlX2N0aW1lKGlub2RlX2l0ZW0pOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGJ0cmZzX3N0YWNrX3RpbWVzcGVjX3NlYyh0c3BlYyk7CisJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IGJ0cmZzX3N0YWNrX3RpbWVzcGVjX25zZWModHNwZWMpOworCisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IEJUUkZTX0koaW5vZGUpLT5nZW5lcmF0aW9uOworCUJUUkZTX0koaW5vZGUpLT5pbmRleF9jbnQgPSAodTY0KS0xOworCisJbXV0ZXhfdW5sb2NrKCZkZWxheWVkX25vZGUtPm11dGV4KTsKKwlidHJmc19yZWxlYXNlX2RlbGF5ZWRfbm9kZShkZWxheWVkX25vZGUpOworCXJldHVybiAwOworfQorCiBpbnQgYnRyZnNfZGVsYXllZF91cGRhdGVfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9kZWxheWVkLWlub2RlLmggYi9mcy9idHJmcy9kZWxheWVkLWlub2RlLmgKaW5kZXggZWI3ZDI0MC4uOGQyN2FmNCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5oCisrKyBiL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuaApAQCAtNzUsNyArNzUsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdHJlZV9saXN0OwkvKiB1c2VkIGZvciBiYXRjaCBpbnNlcnQvZGVsZXRlIGl0ZW1zICovCiAJc3RydWN0IGxpc3RfaGVhZCByZWFkZGlyX2xpc3Q7CS8qIHVzZWQgZm9yIHJlYWRkaXIgaXRlbXMgKi8KIAl1NjQgYnl0ZXNfcmVzZXJ2ZWQ7Ci0Jc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2OwogCXN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKmRlbGF5ZWRfbm9kZTsKIAlhdG9taWNfdCByZWZzOwogCWludCBpbnNfb3JfZGVsOwpAQCAtMTIwLDYgKzExOSw3IEBACiAKIGludCBidHJmc19kZWxheWVkX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgYnRyZnNfZmlsbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgKnJkZXYpOwogCiAvKiBVc2VkIGZvciBkcm9wIGRlYWQgcm9vdCAqLwogdm9pZCBidHJmc19raWxsX2FsbF9kZWxheWVkX25vZGVzKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKQEAgLTEzOCw0ICsxMzgsOCBAQAogLyogZm9yIGluaXQgKi8KIGludCBfX2luaXQgYnRyZnNfZGVsYXllZF9pbm9kZV9pbml0KHZvaWQpOwogdm9pZCBidHJmc19kZWxheWVkX2lub2RlX2V4aXQodm9pZCk7CisKKy8qIGZvciBkZWJ1Z2dpbmcgKi8KK3ZvaWQgYnRyZnNfYXNzZXJ0X2RlbGF5ZWRfcm9vdF9lbXB0eShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZGlzay1pby5jIGIvZnMvYnRyZnMvZGlzay1pby5jCmluZGV4IGEyMDNkMzYuLmIyMzFhZTEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2Rpc2staW8uYworKysgYi9mcy9idHJmcy9kaXNrLWlvLmMKQEAgLTEwNDQsNyArMTA0NCw2IEBACiAJcm9vdC0+bGFzdF90cmFucyA9IDA7CiAJcm9vdC0+aGlnaGVzdF9vYmplY3RpZCA9IDA7CiAJcm9vdC0+bmFtZSA9IE5VTEw7Ci0Jcm9vdC0+aW5fc3lzZnMgPSAwOwogCXJvb3QtPmlub2RlX3RyZWUgPSBSQl9ST09UOwogCUlOSVRfUkFESVhfVFJFRSgmcm9vdC0+ZGVsYXllZF9ub2Rlc190cmVlLCBHRlBfQVRPTUlDKTsKIAlyb290LT5ibG9ja19yc3YgPSBOVUxMOwpAQCAtMTA3OCwxMiArMTA3Nyw3IEBACiAJaW5pdF9jb21wbGV0aW9uKCZyb290LT5rb2JqX3VucmVnaXN0ZXIpOwogCXJvb3QtPmRlZnJhZ19ydW5uaW5nID0gMDsKIAlyb290LT5yb290X2tleS5vYmplY3RpZCA9IG9iamVjdGlkOwotCXJvb3QtPmFub25fc3VwZXIuc19yb290ID0gTlVMTDsKLQlyb290LT5hbm9uX3N1cGVyLnNfZGV2ID0gMDsKLQlJTklUX0xJU1RfSEVBRCgmcm9vdC0+YW5vbl9zdXBlci5zX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZyb290LT5hbm9uX3N1cGVyLnNfaW5zdGFuY2VzKTsKLQlpbml0X3J3c2VtKCZyb290LT5hbm9uX3N1cGVyLnNfdW1vdW50KTsKLQorCXJvb3QtPmFub25fZGV2ID0gMDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMwMCwxOSArMTI5NCwyMSBAQAogCQlyZXR1cm4gcm9vdDsKIAogCXJvb3QtPmZyZWVfaW5vX2N0bCA9IGt6YWxsb2Moc2l6ZW9mKCpyb290LT5mcmVlX2lub19jdGwpLCBHRlBfTk9GUyk7Ci0JaWYgKCFyb290LT5mcmVlX2lub19jdGwpCi0JCWdvdG8gZmFpbDsKIAlyb290LT5mcmVlX2lub19waW5uZWQgPSBremFsbG9jKHNpemVvZigqcm9vdC0+ZnJlZV9pbm9fcGlubmVkKSwKIAkJCQkJR0ZQX05PRlMpOwotCWlmICghcm9vdC0+ZnJlZV9pbm9fcGlubmVkKQorCWlmICghcm9vdC0+ZnJlZV9pbm9fcGlubmVkIHx8ICFyb290LT5mcmVlX2lub19jdGwpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsOworCX0KIAogCWJ0cmZzX2luaXRfZnJlZV9pbm9fY3RsKHJvb3QpOwogCW11dGV4X2luaXQoJnJvb3QtPmZzX2NvbW1pdF9tdXRleCk7CiAJc3Bpbl9sb2NrX2luaXQoJnJvb3QtPmNhY2hlX2xvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJvb3QtPmNhY2hlX3dhaXQpOwogCi0Jc2V0X2Fub25fc3VwZXIoJnJvb3QtPmFub25fc3VwZXIsIE5VTEwpOworCXJldCA9IGdldF9hbm9uX2JkZXYoJnJvb3QtPmFub25fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CiAKIAlpZiAoYnRyZnNfcm9vdF9yZWZzKCZyb290LT5yb290X2l0ZW0pID09IDApIHsKIAkJcmV0ID0gLUVOT0VOVDsKQEAgLTE2MTgsNiArMTYxNCw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5kZWxheWVkX2lwdXRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPmRlZnJhZ19pbm9kZXNfbG9jayk7CisJbXV0ZXhfaW5pdCgmZnNfaW5mby0+cmVsb2NfbXV0ZXgpOwogCiAJaW5pdF9jb21wbGV0aW9uKCZmc19pbmZvLT5rb2JqX3VucmVnaXN0ZXIpOwogCWZzX2luZm8tPnRyZWVfcm9vdCA9IHRyZWVfcm9vdDsKQEAgLTE2NjgsOCArMTY2NSw2IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCk7CiAJaW5pdF9yd3NlbSgmZnNfaW5mby0+c2NydWJfc3VwZXJfbG9jayk7CiAJZnNfaW5mby0+c2NydWJfd29ya2Vyc19yZWZjbnQgPSAwOwotCWJ0cmZzX2luaXRfd29ya2VycygmZnNfaW5mby0+c2NydWJfd29ya2VycywgInNjcnViIiwKLQkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUsICZmc19pbmZvLT5nZW5lcmljX3dvcmtlcik7CiAKIAlzYi0+c19ibG9ja3NpemUgPSA0MDk2OwogCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gYmxrc2l6ZV9iaXRzKDQwOTYpOwpAQCAtMjM5MywxMCArMjM4OCw4IEBACiB7CiAJaXB1dChyb290LT5jYWNoZV9pbm9kZSk7CiAJV0FSTl9PTighUkJfRU1QVFlfUk9PVCgmcm9vdC0+aW5vZGVfdHJlZSkpOwotCWlmIChyb290LT5hbm9uX3N1cGVyLnNfZGV2KSB7Ci0JCWRvd25fd3JpdGUoJnJvb3QtPmFub25fc3VwZXIuc191bW91bnQpOwotCQlraWxsX2Fub25fc3VwZXIoJnJvb3QtPmFub25fc3VwZXIpOwotCX0KKwlpZiAocm9vdC0+YW5vbl9kZXYpCisJCWZyZWVfYW5vbl9iZGV2KHJvb3QtPmFub25fZGV2KTsKIAlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+bm9kZSk7CiAJZnJlZV9leHRlbnRfYnVmZmVyKHJvb3QtPmNvbW1pdF9yb290KTsKIAlrZnJlZShyb290LT5mcmVlX2lub19jdGwpOwpAQCAtMjkxMSw5ICsyOTA0LDggQEAKIAogCUlOSVRfTElTVF9IRUFEKCZzcGxpY2UpOwogCi0JbGlzdF9zcGxpY2VfaW5pdCgmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfaW5vZGVzLCAmc3BsaWNlKTsKLQogCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfbG9jayk7CisJbGlzdF9zcGxpY2VfaW5pdCgmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfaW5vZGVzLCAmc3BsaWNlKTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmc3BsaWNlKSkgewogCQlidHJmc19pbm9kZSA9IGxpc3RfZW50cnkoc3BsaWNlLm5leHQsIHN0cnVjdCBidHJmc19pbm9kZSwKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCmluZGV4IDViOWI2YjYuLjcxY2Q0NTYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtMzA4OSw2ICszMDg5LDEzIEBACiAJCQl9CiAJCQlnb3RvIGFnYWluOwogCQl9CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBsZXNzIHBpbm5lZCBieXRlcyB0aGFuIHdlIHdhbnQgdG8gYWxsb2NhdGUgdGhlbgorCQkgKiBkb24ndCBib3RoZXIgY29tbWl0dGluZyB0aGUgdHJhbnNhY3Rpb24sIGl0IHdvbid0IGhlbHAgdXMuCisJCSAqLworCQlpZiAoZGF0YV9zaW5mby0+Ynl0ZXNfcGlubmVkIDwgYnl0ZXMpCisJCQljb21taXR0ZWQgPSAxOwogCQlzcGluX3VubG9jaygmZGF0YV9zaW5mby0+bG9jayk7CiAKIAkJLyogY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFuZCB0cnkgYWdhaW4gKi8KQEAgLTMzMDcsMTAgKzMzMTQsNiBAQAogCWlmIChyZXNlcnZlZCA9PSAwKQogCQlyZXR1cm4gMDsKIAotCS8qIG5vdGhpbmcgdG8gc2hyaW5rIC0gbm90aGluZyB0byByZWNsYWltICovCi0JaWYgKHJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2J5dGVzID09IDApCi0JCXJldHVybiAwOwotCiAJbWF4X3JlY2xhaW0gPSBtaW4ocmVzZXJ2ZWQsIHRvX3JlY2xhaW0pOwogCiAJd2hpbGUgKGxvb3BzIDwgMTAyNCkgewpAQCAtNDgzOSw3ICs0ODQyLDcgQEAKIAkJCQkgICAgIHU2NCBudW1fYnl0ZXMsIHU2NCBlbXB0eV9zaXplLAogCQkJCSAgICAgdTY0IHNlYXJjaF9zdGFydCwgdTY0IHNlYXJjaF9lbmQsCiAJCQkJICAgICB1NjQgaGludF9ieXRlLCBzdHJ1Y3QgYnRyZnNfa2V5ICppbnMsCi0JCQkJICAgICBpbnQgZGF0YSkKKwkJCQkgICAgIHU2NCBkYXRhKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gb3JpZ19yb290LT5mc19pbmZvLT5leHRlbnRfcm9vdDsKQEAgLTQ4NjYsNyArNDg2OSw3IEBACiAKIAlzcGFjZV9pbmZvID0gX19maW5kX3NwYWNlX2luZm8ocm9vdC0+ZnNfaW5mbywgZGF0YSk7CiAJaWYgKCFzcGFjZV9pbmZvKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTm8gc3BhY2UgaW5mbyBmb3IgJWRcbiIsIGRhdGEpOworCQlwcmludGsoS0VSTl9FUlIgIk5vIHNwYWNlIGluZm8gZm9yICVsbHVcbiIsIGRhdGEpOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAKQEAgLTUyMTEsOSArNTIxNCw3IEBACiAJICogTE9PUF9OT19FTVBUWV9TSVpFLCBzZXQgZW1wdHlfc2l6ZSBhbmQgZW1wdHlfY2x1c3RlciB0byAwIGFuZCB0cnkKIAkgKgkJCWFnYWluCiAJICovCi0JaWYgKCFpbnMtPm9iamVjdGlkICYmIGxvb3AgPCBMT09QX05PX0VNUFRZX1NJWkUgJiYKLQkgICAgKGZvdW5kX3VuY2FjaGVkX2JnIHx8IGVtcHR5X3NpemUgfHwgZW1wdHlfY2x1c3RlciB8fAotCSAgICAgYWxsb3dlZF9jaHVua19hbGxvYykpIHsKKwlpZiAoIWlucy0+b2JqZWN0aWQgJiYgbG9vcCA8IExPT1BfTk9fRU1QVFlfU0laRSkgewogCQlpbmRleCA9IDA7CiAJCWlmIChsb29wID09IExPT1BfRklORF9JREVBTCAmJiBmb3VuZF91bmNhY2hlZF9iZykgewogCQkJZm91bmRfdW5jYWNoZWRfYmcgPSBmYWxzZTsKQEAgLTUyNTMsMzIgKzUyNTQsMzYgQEAKIAkJCWdvdG8gc2VhcmNoOwogCQl9CiAKLQkJaWYgKGxvb3AgPCBMT09QX0NBQ0hJTkdfV0FJVCkgewotCQkJbG9vcCsrOwotCQkJZ290byBzZWFyY2g7Ci0JCX0KKwkJbG9vcCsrOwogCiAJCWlmIChsb29wID09IExPT1BfQUxMT0NfQ0hVTkspIHsKKwkJICAgICAgIGlmIChhbGxvd2VkX2NodW5rX2FsbG9jKSB7CisJCQkJcmV0ID0gZG9fY2h1bmtfYWxsb2ModHJhbnMsIHJvb3QsIG51bV9ieXRlcyArCisJCQkJCQkgICAgIDIgKiAxMDI0ICogMTAyNCwgZGF0YSwKKwkJCQkJCSAgICAgQ0hVTktfQUxMT0NfTElNSVRFRCk7CisJCQkJYWxsb3dlZF9jaHVua19hbGxvYyA9IDA7CisJCQkJaWYgKHJldCA9PSAxKQorCQkJCQlkb25lX2NodW5rX2FsbG9jID0gMTsKKwkJCX0gZWxzZSBpZiAoIWRvbmVfY2h1bmtfYWxsb2MgJiYKKwkJCQkgICBzcGFjZV9pbmZvLT5mb3JjZV9hbGxvYyA9PQorCQkJCSAgIENIVU5LX0FMTE9DX05PX0ZPUkNFKSB7CisJCQkJc3BhY2VfaW5mby0+Zm9yY2VfYWxsb2MgPSBDSFVOS19BTExPQ19MSU1JVEVEOworCQkJfQorCisJCSAgICAgICAvKgorCQkJKiBXZSBkaWRuJ3QgYWxsb2NhdGUgYSBjaHVuaywgZ28gYWhlYWQgYW5kIGRyb3AgdGhlCisJCQkqIGVtcHR5IHNpemUgYW5kIGxvb3AgYWdhaW4uCisJCQkqLworCQkgICAgICAgaWYgKCFkb25lX2NodW5rX2FsbG9jKQorCQkJICAgICAgIGxvb3AgPSBMT09QX05PX0VNUFRZX1NJWkU7CisJCX0KKworCQlpZiAobG9vcCA9PSBMT09QX05PX0VNUFRZX1NJWkUpIHsKIAkJCWVtcHR5X3NpemUgPSAwOwogCQkJZW1wdHlfY2x1c3RlciA9IDA7CiAJCX0KIAotCQlpZiAoYWxsb3dlZF9jaHVua19hbGxvYykgewotCQkJcmV0ID0gZG9fY2h1bmtfYWxsb2ModHJhbnMsIHJvb3QsIG51bV9ieXRlcyArCi0JCQkJCSAgICAgMiAqIDEwMjQgKiAxMDI0LCBkYXRhLAotCQkJCQkgICAgIENIVU5LX0FMTE9DX0xJTUlURUQpOwotCQkJYWxsb3dlZF9jaHVua19hbGxvYyA9IDA7Ci0JCQlkb25lX2NodW5rX2FsbG9jID0gMTsKLQkJfSBlbHNlIGlmICghZG9uZV9jaHVua19hbGxvYyAmJgotCQkJICAgc3BhY2VfaW5mby0+Zm9yY2VfYWxsb2MgPT0gQ0hVTktfQUxMT0NfTk9fRk9SQ0UpIHsKLQkJCXNwYWNlX2luZm8tPmZvcmNlX2FsbG9jID0gQ0hVTktfQUxMT0NfTElNSVRFRDsKLQkJfQotCi0JCWlmIChsb29wIDwgTE9PUF9OT19FTVBUWV9TSVpFKSB7Ci0JCQlsb29wKys7Ci0JCQlnb3RvIHNlYXJjaDsKLQkJfQotCQlyZXQgPSAtRU5PU1BDOworCQlnb3RvIHNlYXJjaDsKIAl9IGVsc2UgaWYgKCFpbnMtPm9iamVjdGlkKSB7CiAJCXJldCA9IC1FTk9TUEM7CiAJfSBlbHNlIGlmIChpbnMtPm9iamVjdGlkKSB7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfaW8uaCBiL2ZzL2J0cmZzL2V4dGVudF9pby5oCmluZGV4IDRlODQ0NWEuLmExMWE5MmUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudF9pby5oCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9pby5oCkBAIC0xMjYsOSArMTI2LDkgQEAKIAl1bnNpZ25lZCBsb25nIG1hcF9sZW47CiAJc3RydWN0IHBhZ2UgKmZpcnN0X3BhZ2U7CiAJdW5zaWduZWQgbG9uZyBiZmxhZ3M7Ci0JYXRvbWljX3QgcmVmczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxlYWtfbGlzdDsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7CisJYXRvbWljX3QgcmVmczsKIAogCS8qIHRoZSBzcGlubG9jayBpcyB1c2VkIHRvIHByb3RlY3QgbW9zdCBvcGVyYXRpb25zICovCiAJc3BpbmxvY2tfdCBsb2NrOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZmlsZS5jIGIvZnMvYnRyZnMvZmlsZS5jCmluZGV4IGZhNGVmMTguLjU5Y2JkYjEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2ZpbGUuYworKysgYi9mcy9idHJmcy9maWxlLmMKQEAgLTE0NTIsNyArMTQ1Miw3IEBACiAgKiBpbXBvcnRhbnQgb3B0aW1pemF0aW9uIGZvciBkaXJlY3RvcmllcyBiZWNhdXNlIGhvbGRpbmcgdGhlIG11dGV4IHByZXZlbnRzCiAgKiBuZXcgb3BlcmF0aW9ucyBvbiB0aGUgZGlyIHdoaWxlIHdlIHdyaXRlIHRvIGRpc2suCiAgKi8KLWludCBidHJmc19zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK2ludCBidHJmc19zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKQEAgLTE0NjIsOSArMTQ2MiwxMyBAQAogCiAJdHJhY2VfYnRyZnNfc3luY19maWxlKGZpbGUsIGRhdGFzeW5jKTsKIAorCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKIAkvKiB3ZSB3YWl0IGZpcnN0LCBzaW5jZSB0aGUgd3JpdGViYWNrIG1heSBjaGFuZ2UgdGhlIGlub2RlICovCiAJcm9vdC0+bG9nX2JhdGNoKys7Ci0JLyogdGhlIFZGUyBjYWxsZWQgZmlsZW1hcF9mZGF0YXdyaXRlIGZvciB1cyAqLwogCWJ0cmZzX3dhaXRfb3JkZXJlZF9yYW5nZShpbm9kZSwgMCwgKHU2NCktMSk7CiAJcm9vdC0+bG9nX2JhdGNoKys7CiAKQEAgLTE0NzIsOCArMTQ3NiwxMCBAQAogCSAqIGNoZWNrIHRoZSB0cmFuc2FjdGlvbiB0aGF0IGxhc3QgbW9kaWZpZWQgdGhpcyBpbm9kZQogCSAqIGFuZCBzZWUgaWYgaXRzIGFscmVhZHkgYmVlbiBjb21taXR0ZWQKIAkgKi8KLQlpZiAoIUJUUkZTX0koaW5vZGUpLT5sYXN0X3RyYW5zKQorCWlmICghQlRSRlNfSShpbm9kZSktPmxhc3RfdHJhbnMpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCWdvdG8gb3V0OworCX0KIAogCS8qCiAJICogaWYgdGhlIGxhc3QgdHJhbnNhY3Rpb24gdGhhdCBjaGFuZ2VkIHRoaXMgZmlsZSB3YXMgYmVmb3JlCkBAIC0xNDg0LDYgKzE0OTAsNyBAQAogCWlmIChCVFJGU19JKGlub2RlKS0+bGFzdF90cmFucyA8PQogCSAgICByb290LT5mc19pbmZvLT5sYXN0X3RyYW5zX2NvbW1pdHRlZCkgewogCQlCVFJGU19JKGlub2RlKS0+bGFzdF90cmFucyA9IDA7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTE0OTYsMTIgKzE1MDMsMTUgQEAKIAl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDApOwogCWlmIChJU19FUlIodHJhbnMpKSB7CiAJCXJldCA9IFBUUl9FUlIodHJhbnMpOworCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAkJZ290byBvdXQ7CiAJfQogCiAJcmV0ID0gYnRyZnNfbG9nX2RlbnRyeV9zYWZlKHRyYW5zLCByb290LCBkZW50cnkpOwotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCAwKSB7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQlnb3RvIG91dDsKKwl9CiAKIAkvKiB3ZSd2ZSBsb2dnZWQgYWxsIHRoZSBpdGVtcyBhbmQgbm93IGhhdmUgYSBjb25zaXN0ZW50CiAJICogdmVyc2lvbiBvZiB0aGUgZmlsZSBpbiB0aGUgbG9nLiAgSXQgaXMgcG9zc2libGUgdGhhdApAQCAtMTUxMyw3ICsxNTIzLDcgQEAKIAkgKiBmaWxlIGFnYWluLCBidXQgdGhhdCB3aWxsIGVuZCB1cCB1c2luZyB0aGUgc3luY2hyb25pemF0aW9uCiAJICogaW5zaWRlIGJ0cmZzX3N5bmNfbG9nIHRvIGtlZXAgdGhpbmdzIHNhZmUuCiAJICovCi0JbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJaWYgKHJldCAhPSBCVFJGU19OT19MT0dfU1lOQykgewogCQlpZiAocmV0ID4gMCkgewpAQCAtMTUyOCw3ICsxNTM4LDYgQEAKIAl9IGVsc2UgewogCQlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCX0KLQltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogb3V0OgogCXJldHVybiByZXQgPiAwID8gLUVJTyA6IHJldDsKIH0KQEAgLTE2NjQsOCArMTY3MywxNTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGZpbmRfZGVzaXJlZF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90ICpvZmZzZXQsIGludCBvcmlnaW4pCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqY2FjaGVkX3N0YXRlID0gTlVMTDsKKwl1NjQgbG9ja3N0YXJ0ID0gKm9mZnNldDsKKwl1NjQgbG9ja2VuZCA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwl1NjQgc3RhcnQgPSAqb2Zmc2V0OworCXU2NCBvcmlnX3N0YXJ0ID0gKm9mZnNldDsKKwl1NjQgbGVuID0gaV9zaXplX3JlYWQoaW5vZGUpOworCXU2NCBsYXN0X2VuZCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlsb2NrZW5kID0gbWF4X3QodTY0LCByb290LT5zZWN0b3JzaXplLCBsb2NrZW5kKTsKKwlpZiAobG9ja2VuZCA8PSBsb2Nrc3RhcnQpCisJCWxvY2tlbmQgPSBsb2Nrc3RhcnQgKyByb290LT5zZWN0b3JzaXplOworCisJbGVuID0gbG9ja2VuZCAtIGxvY2tzdGFydCArIDE7CisKKwlsZW4gPSBtYXhfdCh1NjQsIGxlbiwgcm9vdC0+c2VjdG9yc2l6ZSk7CisJaWYgKGlub2RlLT5pX3NpemUgPT0gMCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWxvY2tfZXh0ZW50X2JpdHMoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBsb2Nrc3RhcnQsIGxvY2tlbmQsIDAsCisJCQkgJmNhY2hlZF9zdGF0ZSwgR0ZQX05PRlMpOworCisJLyoKKwkgKiBEZWxhbGxvYyBpcyBzdWNoIGEgcGFpbi4gIElmIHdlIGhhdmUgYSBob2xlIGFuZCB3ZSBoYXZlIHBlbmRpbmcKKwkgKiBkZWxhbGxvYyBmb3IgYSBwb3J0aW9uIG9mIHRoZSBob2xlIHdlIHdpbGwgZ2V0IGJhY2sgYSBob2xlIHRoYXQKKwkgKiBleGlzdHMgZm9yIHRoZSBlbnRpcmUgcmFuZ2Ugc2luY2UgaXQgaGFzbid0IGJlZW4gYWN0dWFsbHkgd3JpdHRlbgorCSAqIHlldC4gIFNvIHRvIHRha2UgY2FyZSBvZiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBsb29rIGZvciBhbiBleHRlbnQganVzdAorCSAqIGJlZm9yZSB0aGUgcG9zaXRpb24gd2Ugd2FudCBpbiBjYXNlIHRoZXJlIGlzIG91dHN0YW5kaW5nIGRlbGFsbG9jCisJICogZ29pbmcgb24gaGVyZS4KKwkgKi8KKwlpZiAob3JpZ2luID09IFNFRUtfSE9MRSAmJiBzdGFydCAhPSAwKSB7CisJCWlmIChzdGFydCA8PSByb290LT5zZWN0b3JzaXplKQorCQkJZW0gPSBidHJmc19nZXRfZXh0ZW50X2ZpZW1hcChpbm9kZSwgTlVMTCwgMCwgMCwKKwkJCQkJCSAgICAgcm9vdC0+c2VjdG9yc2l6ZSwgMCk7CisJCWVsc2UKKwkJCWVtID0gYnRyZnNfZ2V0X2V4dGVudF9maWVtYXAoaW5vZGUsIE5VTEwsIDAsCisJCQkJCQkgICAgIHN0YXJ0IC0gcm9vdC0+c2VjdG9yc2l6ZSwKKwkJCQkJCSAgICAgcm9vdC0+c2VjdG9yc2l6ZSwgMCk7CisJCWlmIChJU19FUlIoZW0pKSB7CisJCQlyZXQgPSAtRU5YSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQlsYXN0X2VuZCA9IGVtLT5zdGFydCArIGVtLT5sZW47CisJCWlmIChlbS0+YmxvY2tfc3RhcnQgPT0gRVhURU5UX01BUF9ERUxBTExPQykKKwkJCWxhc3RfZW5kID0gbWluX3QodTY0LCBsYXN0X2VuZCwgaW5vZGUtPmlfc2l6ZSk7CisJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJZW0gPSBidHJmc19nZXRfZXh0ZW50X2ZpZW1hcChpbm9kZSwgTlVMTCwgMCwgc3RhcnQsIGxlbiwgMCk7CisJCWlmIChJU19FUlIoZW0pKSB7CisJCQlyZXQgPSAtRU5YSU87CisJCQlicmVhazsKKwkJfQorCisJCWlmIChlbS0+YmxvY2tfc3RhcnQgPT0gRVhURU5UX01BUF9IT0xFKSB7CisJCQlpZiAodGVzdF9iaXQoRVhURU5UX0ZMQUdfVkFDQU5DWSwgJmVtLT5mbGFncykpIHsKKwkJCQlpZiAobGFzdF9lbmQgPD0gb3JpZ19zdGFydCkgeworCQkJCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQkJCQlyZXQgPSAtRU5YSU87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG9yaWdpbiA9PSBTRUVLX0hPTEUpIHsKKwkJCQkqb2Zmc2V0ID0gc3RhcnQ7CisJCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChvcmlnaW4gPT0gU0VFS19EQVRBKSB7CisJCQkJaWYgKGVtLT5ibG9ja19zdGFydCA9PSBFWFRFTlRfTUFQX0RFTEFMTE9DKSB7CisJCQkJCWlmIChzdGFydCA+PSBpbm9kZS0+aV9zaXplKSB7CisJCQkJCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQkJCQkJcmV0ID0gLUVOWElPOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkqb2Zmc2V0ID0gc3RhcnQ7CisJCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXN0YXJ0ID0gZW0tPnN0YXJ0ICsgZW0tPmxlbjsKKwkJbGFzdF9lbmQgPSBlbS0+c3RhcnQgKyBlbS0+bGVuOworCisJCWlmIChlbS0+YmxvY2tfc3RhcnQgPT0gRVhURU5UX01BUF9ERUxBTExPQykKKwkJCWxhc3RfZW5kID0gbWluX3QodTY0LCBsYXN0X2VuZCwgaW5vZGUtPmlfc2l6ZSk7CisKKwkJaWYgKHRlc3RfYml0KEVYVEVOVF9GTEFHX1ZBQ0FOQ1ksICZlbS0+ZmxhZ3MpKSB7CisJCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQkJcmV0ID0gLUVOWElPOworCQkJYnJlYWs7CisJCX0KKwkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCWlmICghcmV0KQorCQkqb2Zmc2V0ID0gbWluKCpvZmZzZXQsIGlub2RlLT5pX3NpemUpOworb3V0OgorCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgbG9ja3N0YXJ0LCBsb2NrZW5kLAorCQkJICAgICAmY2FjaGVkX3N0YXRlLCBHRlBfTk9GUyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvZmZfdCBidHJmc19maWxlX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJc3dpdGNoIChvcmlnaW4pIHsKKwljYXNlIFNFRUtfRU5EOgorCWNhc2UgU0VFS19DVVI6CisJCW9mZnNldCA9IGdlbmVyaWNfZmlsZV9sbHNlZWtfdW5sb2NrZWQoZmlsZSwgb2Zmc2V0LCBvcmlnaW4pOworCQlnb3RvIG91dDsKKwljYXNlIFNFRUtfREFUQToKKwljYXNlIFNFRUtfSE9MRToKKwkJcmV0ID0gZmluZF9kZXNpcmVkX2V4dGVudChpbm9kZSwgJm9mZnNldCwgb3JpZ2luKTsKKwkJaWYgKHJldCkgeworCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKG9mZnNldCA8IDAgJiYgIShmaWxlLT5mX21vZGUgJiBGTU9ERV9VTlNJR05FRF9PRkZTRVQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAob2Zmc2V0ID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU3BlY2lhbCBsb2NrIG5lZWRlZCBoZXJlPyAqLworCWlmIChvZmZzZXQgIT0gZmlsZS0+Zl9wb3MpIHsKKwkJZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7CisJCWZpbGUtPmZfdmVyc2lvbiA9IDA7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCXJldHVybiBvZmZzZXQ7Cit9CisKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYnRyZnNfZmlsZV9vcGVyYXRpb25zID0gewotCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkubGxzZWVrCQk9IGJ0cmZzX2ZpbGVfbGxzZWVrLAogCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKIAkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKIAkuYWlvX3JlYWQgICAgICAgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCmRpZmYgLS1naXQgYS9mcy9idHJmcy9mcmVlLXNwYWNlLWNhY2hlLmMgYi9mcy9idHJmcy9mcmVlLXNwYWNlLWNhY2hlLmMKaW5kZXggYWQxNDQ3My4uYmYwZDYxNSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jCisrKyBiL2ZzL2J0cmZzL2ZyZWUtc3BhY2UtY2FjaGUuYwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJcGdvZmZfdCBpbmRleCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmaXJzdF9wYWdlX29mZnNldDsKIAlpbnQgbnVtX2NoZWNrc3VtczsKLQlpbnQgcmV0ID0gMCwgcmV0MjsKKwlpbnQgcmV0ID0gMDsKIAogCUlOSVRfTElTVF9IRUFEKCZiaXRtYXBzKTsKIApAQCAtNDIxLDExICs0MjEsMTAgQEAKIAkJCQkJZ290byBmcmVlX2NhY2hlOwogCQkJCX0KIAkJCQlzcGluX2xvY2soJmN0bC0+dHJlZV9sb2NrKTsKLQkJCQlyZXQyID0gbGlua19mcmVlX3NwYWNlKGN0bCwgZSk7CisJCQkJcmV0ID0gbGlua19mcmVlX3NwYWNlKGN0bCwgZSk7CiAJCQkJY3RsLT50b3RhbF9iaXRtYXBzKys7CiAJCQkJY3RsLT5vcC0+cmVjYWxjX3RocmVzaG9sZHMoY3RsKTsKIAkJCQlzcGluX3VubG9jaygmY3RsLT50cmVlX2xvY2spOwotCQkJCWxpc3RfYWRkX3RhaWwoJmUtPmxpc3QsICZiaXRtYXBzKTsKIAkJCQlpZiAocmV0KSB7CiAJCQkJCXByaW50ayhLRVJOX0VSUiAiRHVwbGljYXRlIGVudHJpZXMgaW4gIgogCQkJCQkgICAgICAgImZyZWUgc3BhY2UgY2FjaGUsIGR1bXBpbmdcbiIpOwpAQCAtNDM0LDYgKzQzMyw3IEBACiAJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCQkJZ290byBmcmVlX2NhY2hlOwogCQkJCX0KKwkJCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmYml0bWFwcyk7CiAJCQl9CiAKIAkJCW51bV9lbnRyaWVzLS07CkBAIC0xNDE3LDYgKzE0MTcsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHU2NCBhZGRfYnl0ZXNfdG9fYml0bWFwKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsLAorCQkJICAgICAgIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlICppbmZvLCB1NjQgb2Zmc2V0LAorCQkJICAgICAgIHU2NCBieXRlcykKK3sKKwl1NjQgYnl0ZXNfdG9fc2V0ID0gMDsKKwl1NjQgZW5kOworCisJZW5kID0gaW5mby0+b2Zmc2V0ICsgKHU2NCkoQklUU19QRVJfQklUTUFQICogY3RsLT51bml0KTsKKworCWJ5dGVzX3RvX3NldCA9IG1pbihlbmQgLSBvZmZzZXQsIGJ5dGVzKTsKKworCWJpdG1hcF9zZXRfYml0cyhjdGwsIGluZm8sIG9mZnNldCwgYnl0ZXNfdG9fc2V0KTsKKworCXJldHVybiBieXRlc190b19zZXQ7CisKK30KKwogc3RhdGljIGJvb2wgdXNlX2JpdG1hcChzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKmN0bCwKIAkJICAgICAgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmluZm8pCiB7CkBAIC0xNDUzLDEyICsxNDcwLDE4IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9vcCBmcmVlX3NwYWNlX29wID0geworCS5yZWNhbGNfdGhyZXNob2xkcwk9IHJlY2FsY3VsYXRlX3RocmVzaG9sZHMsCisJLnVzZV9iaXRtYXAJCT0gdXNlX2JpdG1hcCwKK307CisKIHN0YXRpYyBpbnQgaW5zZXJ0X2ludG9fYml0bWFwKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsLAogCQkJICAgICAgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmluZm8pCiB7CiAJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmJpdG1hcF9pbmZvOworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAgPSBOVUxMOwogCWludCBhZGRlZCA9IDA7Ci0JdTY0IGJ5dGVzLCBvZmZzZXQsIGVuZDsKKwl1NjQgYnl0ZXMsIG9mZnNldCwgYnl0ZXNfYWRkZWQ7CiAJaW50IHJldDsKIAogCWJ5dGVzID0gaW5mby0+Ynl0ZXM7CkBAIC0xNDY3LDcgKzE0OTAsNDkgQEAKIAlpZiAoIWN0bC0+b3AtPnVzZV9iaXRtYXAoY3RsLCBpbmZvKSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoY3RsLT5vcCA9PSAmZnJlZV9zcGFjZV9vcCkKKwkJYmxvY2tfZ3JvdXAgPSBjdGwtPnByaXZhdGU7CiBhZ2FpbjoKKwkvKgorCSAqIFNpbmNlIHdlIGxpbmsgYml0bWFwcyByaWdodCBpbnRvIHRoZSBjbHVzdGVyIHdlIG5lZWQgdG8gc2VlIGlmIHdlCisJICogaGF2ZSBhIGNsdXN0ZXIgaGVyZSwgYW5kIGlmIHNvIGFuZCBpdCBoYXMgb3VyIGJpdG1hcCB3ZSBuZWVkIHRvIGFkZAorCSAqIHRoZSBmcmVlIHNwYWNlIHRvIHRoYXQgYml0bWFwLgorCSAqLworCWlmIChibG9ja19ncm91cCAmJiAhbGlzdF9lbXB0eSgmYmxvY2tfZ3JvdXAtPmNsdXN0ZXJfbGlzdCkpIHsKKwkJc3RydWN0IGJ0cmZzX2ZyZWVfY2x1c3RlciAqY2x1c3RlcjsKKwkJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICplbnRyeTsKKworCQljbHVzdGVyID0gbGlzdF9lbnRyeShibG9ja19ncm91cC0+Y2x1c3Rlcl9saXN0Lm5leHQsCisJCQkJICAgICBzdHJ1Y3QgYnRyZnNfZnJlZV9jbHVzdGVyLAorCQkJCSAgICAgYmxvY2tfZ3JvdXBfbGlzdCk7CisJCXNwaW5fbG9jaygmY2x1c3Rlci0+bG9jayk7CisJCW5vZGUgPSByYl9maXJzdCgmY2x1c3Rlci0+cm9vdCk7CisJCWlmICghbm9kZSkgeworCQkJc3Bpbl91bmxvY2soJmNsdXN0ZXItPmxvY2spOworCQkJZ290byBub19jbHVzdGVyX2JpdG1hcDsKKwkJfQorCisJCWVudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIG9mZnNldF9pbmRleCk7CisJCWlmICghZW50cnktPmJpdG1hcCkgeworCQkJc3Bpbl91bmxvY2soJmNsdXN0ZXItPmxvY2spOworCQkJZ290byBub19jbHVzdGVyX2JpdG1hcDsKKwkJfQorCisJCWlmIChlbnRyeS0+b2Zmc2V0ID09IG9mZnNldF90b19iaXRtYXAoY3RsLCBvZmZzZXQpKSB7CisJCQlieXRlc19hZGRlZCA9IGFkZF9ieXRlc190b19iaXRtYXAoY3RsLCBlbnRyeSwKKwkJCQkJCQkgIG9mZnNldCwgYnl0ZXMpOworCQkJYnl0ZXMgLT0gYnl0ZXNfYWRkZWQ7CisJCQlvZmZzZXQgKz0gYnl0ZXNfYWRkZWQ7CisJCX0KKwkJc3Bpbl91bmxvY2soJmNsdXN0ZXItPmxvY2spOworCQlpZiAoIWJ5dGVzKSB7CisJCQlyZXQgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK25vX2NsdXN0ZXJfYml0bWFwOgogCWJpdG1hcF9pbmZvID0gdHJlZV9zZWFyY2hfb2Zmc2V0KGN0bCwgb2Zmc2V0X3RvX2JpdG1hcChjdGwsIG9mZnNldCksCiAJCQkJCSAxLCAwKTsKIAlpZiAoIWJpdG1hcF9pbmZvKSB7CkBAIC0xNDc1LDE5ICsxNTQwLDEwIEBACiAJCWdvdG8gbmV3X2JpdG1hcDsKIAl9CiAKLQllbmQgPSBiaXRtYXBfaW5mby0+b2Zmc2V0ICsgKHU2NCkoQklUU19QRVJfQklUTUFQICogY3RsLT51bml0KTsKLQotCWlmIChvZmZzZXQgPj0gYml0bWFwX2luZm8tPm9mZnNldCAmJiBvZmZzZXQgKyBieXRlcyA+IGVuZCkgewotCQliaXRtYXBfc2V0X2JpdHMoY3RsLCBiaXRtYXBfaW5mbywgb2Zmc2V0LCBlbmQgLSBvZmZzZXQpOwotCQlieXRlcyAtPSBlbmQgLSBvZmZzZXQ7Ci0JCW9mZnNldCA9IGVuZDsKLQkJYWRkZWQgPSAwOwotCX0gZWxzZSBpZiAob2Zmc2V0ID49IGJpdG1hcF9pbmZvLT5vZmZzZXQgJiYgb2Zmc2V0ICsgYnl0ZXMgPD0gZW5kKSB7Ci0JCWJpdG1hcF9zZXRfYml0cyhjdGwsIGJpdG1hcF9pbmZvLCBvZmZzZXQsIGJ5dGVzKTsKLQkJYnl0ZXMgPSAwOwotCX0gZWxzZSB7Ci0JCUJVRygpOwotCX0KKwlieXRlc19hZGRlZCA9IGFkZF9ieXRlc190b19iaXRtYXAoY3RsLCBiaXRtYXBfaW5mbywgb2Zmc2V0LCBieXRlcyk7CisJYnl0ZXMgLT0gYnl0ZXNfYWRkZWQ7CisJb2Zmc2V0ICs9IGJ5dGVzX2FkZGVkOworCWFkZGVkID0gMDsKIAogCWlmICghYnl0ZXMpIHsKIAkJcmV0ID0gMTsKQEAgLTE3NjYsMTEgKzE4MjIsNiBAQAogCSAgICAgICAiXG4iLCBjb3VudCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9vcCBmcmVlX3NwYWNlX29wID0gewotCS5yZWNhbGNfdGhyZXNob2xkcwk9IHJlY2FsY3VsYXRlX3RocmVzaG9sZHMsCi0JLnVzZV9iaXRtYXAJCT0gdXNlX2JpdG1hcCwKLX07Ci0KIHZvaWQgYnRyZnNfaW5pdF9mcmVlX3NwYWNlX2N0bChzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwKQogewogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsID0gYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2VfY3RsOwpAQCAtMTg0Miw5ICsxODkzLDEyIEBACiAKIAl3aGlsZSAoKG5vZGUgPSByYl9sYXN0KCZjdGwtPmZyZWVfc3BhY2Vfb2Zmc2V0KSkgIT0gTlVMTCkgewogCQlpbmZvID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIG9mZnNldF9pbmRleCk7Ci0JCXVubGlua19mcmVlX3NwYWNlKGN0bCwgaW5mbyk7Ci0JCWtmcmVlKGluZm8tPmJpdG1hcCk7Ci0JCWttZW1fY2FjaGVfZnJlZShidHJmc19mcmVlX3NwYWNlX2NhY2hlcCwgaW5mbyk7CisJCWlmICghaW5mby0+Yml0bWFwKSB7CisJCQl1bmxpbmtfZnJlZV9zcGFjZShjdGwsIGluZm8pOworCQkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX2ZyZWVfc3BhY2VfY2FjaGVwLCBpbmZvKTsKKwkJfSBlbHNlIHsKKwkJCWZyZWVfYml0bWFwKGN0bCwgaW5mbyk7CisJCX0KIAkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CiAJCQlzcGluX3VubG9jaygmY3RsLT50cmVlX2xvY2spOwogCQkJY29uZF9yZXNjaGVkKCk7CkBAIC0yMTQyLDkgKzIxOTYsMTEgQEAKIC8qCiAgKiBUaGlzIHNlYXJjaGVzIHRoZSBibG9jayBncm91cCBmb3IganVzdCBleHRlbnRzIHRvIGZpbGwgdGhlIGNsdXN0ZXIgd2l0aC4KICAqLwotc3RhdGljIGludCBzZXR1cF9jbHVzdGVyX25vX2JpdG1hcChzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwLAotCQkJCSAgIHN0cnVjdCBidHJmc19mcmVlX2NsdXN0ZXIgKmNsdXN0ZXIsCi0JCQkJICAgdTY0IG9mZnNldCwgdTY0IGJ5dGVzLCB1NjQgbWluX2J5dGVzKQorc3RhdGljIG5vaW5saW5lIGludAorc2V0dXBfY2x1c3Rlcl9ub19iaXRtYXAoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCwKKwkJCXN0cnVjdCBidHJmc19mcmVlX2NsdXN0ZXIgKmNsdXN0ZXIsCisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpiaXRtYXBzLCB1NjQgb2Zmc2V0LCB1NjQgYnl0ZXMsCisJCQl1NjQgbWluX2J5dGVzKQogewogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsID0gYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2VfY3RsOwogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICpmaXJzdCA9IE5VTEw7CkBAIC0yMTY2LDYgKzIyMjIsOCBAQAogCSAqIGV4dGVudCBlbnRyeS4KIAkgKi8KIAl3aGlsZSAoZW50cnktPmJpdG1hcCkgeworCQlpZiAobGlzdF9lbXB0eSgmZW50cnktPmxpc3QpKQorCQkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsIGJpdG1hcHMpOwogCQlub2RlID0gcmJfbmV4dCgmZW50cnktPm9mZnNldF9pbmRleCk7CiAJCWlmICghbm9kZSkKIAkJCXJldHVybiAtRU5PU1BDOwpAQCAtMjE4NSw4ICsyMjQzLDEyIEBACiAJCQlyZXR1cm4gLUVOT1NQQzsKIAkJZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwgb2Zmc2V0X2luZGV4KTsKIAotCQlpZiAoZW50cnktPmJpdG1hcCkKKwkJaWYgKGVudHJ5LT5iaXRtYXApIHsKKwkJCWlmIChsaXN0X2VtcHR5KCZlbnRyeS0+bGlzdCkpCisJCQkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsIGJpdG1hcHMpOwogCQkJY29udGludWU7CisJCX0KKwogCQkvKgogCQkgKiB3ZSBoYXZlbid0IGZpbGxlZCB0aGUgZW1wdHkgc2l6ZSBhbmQgdGhlIHdpbmRvdyBpcwogCQkgKiB2ZXJ5IGxhcmdlLiAgcmVzZXQgYW5kIHRyeSBhZ2FpbgpAQCAtMjIzOCw5ICsyMzAwLDExIEBACiAgKiBUaGlzIHNwZWNpZmljYWxseSBsb29rcyBmb3IgYml0bWFwcyB0aGF0IG1heSB3b3JrIGluIHRoZSBjbHVzdGVyLCB3ZSBhc3N1bWUKICAqIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZCB0byBmaW5kIGV4dGVudHMgdGhhdCB3aWxsIHdvcmsuCiAgKi8KLXN0YXRpYyBpbnQgc2V0dXBfY2x1c3Rlcl9iaXRtYXAoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCwKLQkJCQlzdHJ1Y3QgYnRyZnNfZnJlZV9jbHVzdGVyICpjbHVzdGVyLAotCQkJCXU2NCBvZmZzZXQsIHU2NCBieXRlcywgdTY0IG1pbl9ieXRlcykKK3N0YXRpYyBub2lubGluZSBpbnQKK3NldHVwX2NsdXN0ZXJfYml0bWFwKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAsCisJCSAgICAgc3RydWN0IGJ0cmZzX2ZyZWVfY2x1c3RlciAqY2x1c3RlciwKKwkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpiaXRtYXBzLCB1NjQgb2Zmc2V0LCB1NjQgYnl0ZXMsCisJCSAgICAgdTY0IG1pbl9ieXRlcykKIHsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKmN0bCA9IGJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX2N0bDsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZW50cnk7CkBAIC0yMjUwLDEwICsyMzE0LDM5IEBACiAJaWYgKGN0bC0+dG90YWxfYml0bWFwcyA9PSAwKQogCQlyZXR1cm4gLUVOT1NQQzsKIAorCS8qCisJICogRmlyc3QgY2hlY2sgb3VyIGNhY2hlZCBsaXN0IG9mIGJpdG1hcHMgYW5kIHNlZSBpZiB0aGVyZSBpcyBhbiBlbnRyeQorCSAqIGhlcmUgdGhhdCB3aWxsIHdvcmsuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgYml0bWFwcywgbGlzdCkgeworCQlpZiAoZW50cnktPmJ5dGVzIDwgbWluX2J5dGVzKQorCQkJY29udGludWU7CisJCXJldCA9IGJ0cmZzX2JpdG1hcF9jbHVzdGVyKGJsb2NrX2dyb3VwLCBlbnRyeSwgY2x1c3Rlciwgb2Zmc2V0LAorCQkJCQkgICBieXRlcywgbWluX2J5dGVzKTsKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIElmIHdlIGRvIGhhdmUgZW50cmllcyBvbiBvdXIgbGlzdCBhbmQgd2UgYXJlIGhlcmUgdGhlbiB3ZSBkaWRuJ3QgZmluZAorCSAqIGFueXRoaW5nLCBzbyBnbyBhaGVhZCBhbmQgZ2V0IHRoZSBuZXh0IGVudHJ5IGFmdGVyIHRoZSBsYXN0IGVudHJ5IGluCisJICogdGhpcyBsaXN0IGFuZCBzdGFydCB0aGUgc2VhcmNoIGZyb20gdGhlcmUuCisJICovCisJaWYgKCFsaXN0X2VtcHR5KGJpdG1hcHMpKSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShiaXRtYXBzLT5wcmV2LCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwKKwkJCQkgICBsaXN0KTsKKwkJbm9kZSA9IHJiX25leHQoJmVudHJ5LT5vZmZzZXRfaW5kZXgpOworCQlpZiAoIW5vZGUpCisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwgb2Zmc2V0X2luZGV4KTsKKwkJZ290byBzZWFyY2g7CisJfQorCiAJZW50cnkgPSB0cmVlX3NlYXJjaF9vZmZzZXQoY3RsLCBvZmZzZXRfdG9fYml0bWFwKGN0bCwgb2Zmc2V0KSwgMCwgMSk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuIC1FTk9TUEM7CiAKK3NlYXJjaDoKIAlub2RlID0gJmVudHJ5LT5vZmZzZXRfaW5kZXg7CiAJZG8gewogCQllbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLCBvZmZzZXRfaW5kZXgpOwpAQCAtMjI4NCw2ICsyMzc3LDggQEAKIAkJCSAgICAgdTY0IG9mZnNldCwgdTY0IGJ5dGVzLCB1NjQgZW1wdHlfc2l6ZSkKIHsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKmN0bCA9IGJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX2N0bDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJpdG1hcHM7CisJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmVudHJ5LCAqdG1wOwogCXU2NCBtaW5fYnl0ZXM7CiAJaW50IHJldDsKIApAQCAtMjMyMiwxMSArMjQxNywxNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBzZXR1cF9jbHVzdGVyX25vX2JpdG1hcChibG9ja19ncm91cCwgY2x1c3Rlciwgb2Zmc2V0LCBieXRlcywKLQkJCQkgICAgICBtaW5fYnl0ZXMpOworCUlOSVRfTElTVF9IRUFEKCZiaXRtYXBzKTsKKwlyZXQgPSBzZXR1cF9jbHVzdGVyX25vX2JpdG1hcChibG9ja19ncm91cCwgY2x1c3RlciwgJmJpdG1hcHMsIG9mZnNldCwKKwkJCQkgICAgICBieXRlcywgbWluX2J5dGVzKTsKIAlpZiAocmV0KQotCQlyZXQgPSBzZXR1cF9jbHVzdGVyX2JpdG1hcChibG9ja19ncm91cCwgY2x1c3Rlciwgb2Zmc2V0LAotCQkJCQkgICBieXRlcywgbWluX2J5dGVzKTsKKwkJcmV0ID0gc2V0dXBfY2x1c3Rlcl9iaXRtYXAoYmxvY2tfZ3JvdXAsIGNsdXN0ZXIsICZiaXRtYXBzLAorCQkJCQkgICBvZmZzZXQsIGJ5dGVzLCBtaW5fYnl0ZXMpOworCisJLyogQ2xlYXIgb3VyIHRlbXBvcmFyeSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCB0bXAsICZiaXRtYXBzLCBsaXN0KQorCQlsaXN0X2RlbF9pbml0KCZlbnRyeS0+bGlzdCk7CiAKIAlpZiAoIXJldCkgewogCQlhdG9taWNfaW5jKCZibG9ja19ncm91cC0+Y291bnQpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW5vZGUuYyBiL2ZzL2J0cmZzL2lub2RlLmMKaW5kZXggZWJmOTVmNy4uZTkxYjA5NyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaW5vZGUuYworKysgYi9mcy9idHJmcy9pbm9kZS5jCkBAIC0xOTg2LDcgKzE5ODYsNyBAQAogCX0KIAogCWlmIChCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJiBCVFJGU19JTk9ERV9OT0RBVEFTVU0pCi0JCXJldHVybiAwOworCQlnb3RvIGdvb2Q7CiAKIAlpZiAocm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgPT0gQlRSRlNfREFUQV9SRUxPQ19UUkVFX09CSkVDVElEICYmCiAJICAgIHRlc3RfcmFuZ2VfYml0KGlvX3RyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9OT0RBVEFTVU0sIDEsIE5VTEwpKSB7CkBAIC0yNTA5LDYgKzI1MDksMTEgQEAKIAlpbnQgbWF5YmVfYWNsczsKIAl1MzIgcmRldjsKIAlpbnQgcmV0OworCWJvb2wgZmlsbGVkID0gZmFsc2U7CisKKwlyZXQgPSBidHJmc19maWxsX2lub2RlKGlub2RlLCAmcmRldik7CisJaWYgKCFyZXQpCisJCWZpbGxlZCA9IHRydWU7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCUJVR19PTighcGF0aCk7CkBAIC0yNTIwLDYgKzI1MjUsMTAgQEAKIAkJZ290byBtYWtlX2JhZDsKIAogCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKworCWlmIChmaWxsZWQpCisJCWdvdG8gY2FjaGVfYWNsOworCiAJaW5vZGVfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAogCQkJCSAgICBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSk7CiAJaWYgKCFsZWFmLT5tYXBfdG9rZW4pCkBAIC0yNTU2LDcgKzI1NjUsNyBAQAogCiAJQlRSRlNfSShpbm9kZSktPmluZGV4X2NudCA9ICh1NjQpLTE7CiAJQlRSRlNfSShpbm9kZSktPmZsYWdzID0gYnRyZnNfaW5vZGVfZmxhZ3MobGVhZiwgaW5vZGVfaXRlbSk7Ci0KK2NhY2hlX2FjbDoKIAkvKgogCSAqIHRyeSB0byBwcmVjYWNoZSBhIE5VTEwgYWNsIGVudHJ5IGZvciBmaWxlcyB0aGF0IGRvbid0IGhhdmUKIAkgKiBhbnkgeGF0dHJzIG9yIGFjbHMKQEAgLTI1NzIsNyArMjU4MSw2IEBACiAJfQogCiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwotCWlub2RlX2l0ZW0gPSBOVUxMOwogCiAJc3dpdGNoIChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSB7CiAJY2FzZSBTX0lGUkVHOgpAQCAtMjY3MCwxMiArMjY3OCwxNCBAQAogCWludCByZXQ7CiAKIAkvKgotCSAqIElmIHJvb3QgaXMgdHJlZSByb290LCBpdCBtZWFucyB0aGlzIGlub2RlIGlzIHVzZWQgdG8KLQkgKiBzdG9yZSBmcmVlIHNwYWNlIGluZm9ybWF0aW9uLiBBbmQgdGhlc2UgaW5vZGVzIGFyZSB1cGRhdGVkCi0JICogd2hlbiBjb21taXR0aW5nIHRoZSB0cmFuc2FjdGlvbiwgc28gdGhleSBuZWVkbid0IGRlbGF5ZSB0bwotCSAqIGJlIHVwZGF0ZWQsIG9yIGRlYWRsb2NrIHdpbGwgb2NjdXJlZC4KKwkgKiBJZiB0aGUgaW5vZGUgaXMgYSBmcmVlIHNwYWNlIGlub2RlLCB3ZSBjYW4gZGVhZGxvY2sgZHVyaW5nIGNvbW1pdAorCSAqIGlmIHdlIHB1dCBpdCBpbnRvIHRoZSBkZWxheWVkIGNvZGUuCisJICoKKwkgKiBUaGUgZGF0YSByZWxvY2F0aW9uIGlub2RlIHNob3VsZCBhbHNvIGJlIGRpcmVjdGx5IHVwZGF0ZWQKKwkgKiB3aXRob3V0IGRlbGF5CiAJICovCi0JaWYgKCFpc19mcmVlX3NwYWNlX2lub2RlKHJvb3QsIGlub2RlKSkgeworCWlmICghaXNfZnJlZV9zcGFjZV9pbm9kZShyb290LCBpbm9kZSkKKwkgICAgJiYgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfREFUQV9SRUxPQ19UUkVFX09CSkVDVElEKSB7CiAJCXJldCA9IGJ0cmZzX2RlbGF5ZWRfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CiAJCWlmICghcmV0KQogCQkJYnRyZnNfc2V0X2lub2RlX2xhc3RfdHJhbnModHJhbnMsIGlub2RlKTsKQEAgLTMwNzYsNiArMzA4Niw3IEBACiAJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBkaXIpOwogCUJVR19PTihyZXQpOwogCisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCXJldHVybiAwOwogfQogCkBAIC0zNjQ2LDcgKzM2NTcsNyBAQAogCWJ0cmZzX2lfc2l6ZV93cml0ZShpbm9kZSwgMCk7CiAKIAl3aGlsZSAoMSkgewotCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDApOworCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJCUJVR19PTihJU19FUlIodHJhbnMpKTsKIAkJdHJhbnMtPmJsb2NrX3JzdiA9IHJvb3QtPm9ycGhhbl9ibG9ja19yc3Y7CiAKQEAgLTQwNjgsMTMgKzQwNzksNyBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmJ0cmZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCSAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0KLQlpbm9kZSA9IGJ0cmZzX2xvb2t1cF9kZW50cnkoZGlyLCBkZW50cnkpOwotCWlmIChJU19FUlIoaW5vZGUpKQotCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwotCi0JcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOworCXJldHVybiBkX3NwbGljZV9hbGlhcyhidHJmc19sb29rdXBfZGVudHJ5KGRpciwgZGVudHJ5KSwgZGVudHJ5KTsKIH0KIAogdW5zaWduZWQgY2hhciBidHJmc19maWxldHlwZV90YWJsZVtdID0gewpAQCAtNDUxOSw2ICs0NTI0LDcgQEAKIAlpbm9kZV90cmVlX2FkZChpbm9kZSk7CiAKIAl0cmFjZV9idHJmc19pbm9kZV9uZXcoaW5vZGUpOworCWJ0cmZzX3NldF9pbm9kZV9sYXN0X3RyYW5zKHRyYW5zLCBpbm9kZSk7CiAKIAlyZXR1cm4gaW5vZGU7CiBmYWlsOgpAQCAtNDc2MCwxMSArNDc2NiwxMCBAQAogCWlmIChlcnIpIHsKIAkJZHJvcF9pbm9kZSA9IDE7CiAJfSBlbHNlIHsKLQkJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwkJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKIAkJZXJyID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CiAJCUJVR19PTihlcnIpOwogCQlidHJmc19sb2dfbmV3X25hbWUodHJhbnMsIGlub2RlLCBOVUxMLCBwYXJlbnQpOwotCQlkcHV0KHBhcmVudCk7CiAJfQogCiAJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CkBAIC02ODg4LDcgKzY4OTMsNyBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJZ2VuZXJpY19maWxsYXR0cihpbm9kZSwgc3RhdCk7Ci0Jc3RhdC0+ZGV2ID0gQlRSRlNfSShpbm9kZSktPnJvb3QtPmFub25fc3VwZXIuc19kZXY7CisJc3RhdC0+ZGV2ID0gQlRSRlNfSShpbm9kZSktPnJvb3QtPmFub25fZGV2OwogCXN0YXQtPmJsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CiAJc3RhdC0+YmxvY2tzID0gKGlub2RlX2dldF9ieXRlcyhpbm9kZSkgKwogCQkJQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX2J5dGVzKSA+PiA5OwpAQCAtNzA1Niw5ICs3MDYxLDggQEAKIAlCVUdfT04ocmV0KTsKIAogCWlmIChvbGRfaW5vICE9IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpIHsKLQkJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gZGdldF9wYXJlbnQobmV3X2RlbnRyeSk7CisJCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IG5ld19kZW50cnktPmRfcGFyZW50OwogCQlidHJmc19sb2dfbmV3X25hbWUodHJhbnMsIG9sZF9pbm9kZSwgb2xkX2RpciwgcGFyZW50KTsKLQkJZHB1dChwYXJlbnQpOwogCQlidHJmc19lbmRfbG9nX3RyYW5zKHJvb3QpOwogCX0KIG91dF9mYWlsOgpAQCAtNzMxOSw3ICs3MzIzLDcgQEAKIAlyZXR1cm4gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMocGFnZSk7CiB9CiAKLXN0YXRpYyBpbnQgYnRyZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQorc3RhdGljIGludCBidHJmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CiAKQEAgLTczMjcsNyArNzMzMSw3IEBACiAJCXJldHVybiAtRVJPRlM7CiAJaWYgKChCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJiBCVFJGU19JTk9ERV9SRUFET05MWSkgJiYgKG1hc2sgJiBNQVlfV1JJVEUpKQogCQlyZXR1cm4gLUVBQ0NFUzsKLQlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBmbGFncywgYnRyZnNfY2hlY2tfYWNsKTsKKwlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJ0cmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0gewpAQCAtNzM0NywxMCArNzM1MSwxMiBAQAogCS5saXN0eGF0dHIJPSBidHJmc19saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyCT0gYnRyZnNfcmVtb3ZleGF0dHIsCiAJLnBlcm1pc3Npb24JPSBidHJmc19wZXJtaXNzaW9uLAorCS5nZXRfYWNsCT0gYnRyZnNfZ2V0X2FjbCwKIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYnRyZnNfZGlyX3JvX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLmxvb2t1cAkJPSBidHJmc19sb29rdXAsCiAJLnBlcm1pc3Npb24JPSBidHJmc19wZXJtaXNzaW9uLAorCS5nZXRfYWNsCT0gYnRyZnNfZ2V0X2FjbCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ0cmZzX2Rpcl9maWxlX29wZXJhdGlvbnMgPSB7CkBAIC03NDE5LDYgKzc0MjUsNyBAQAogCS5yZW1vdmV4YXR0cgk9IGJ0cmZzX3JlbW92ZXhhdHRyLAogCS5wZXJtaXNzaW9uCT0gYnRyZnNfcGVybWlzc2lvbiwKIAkuZmllbWFwCQk9IGJ0cmZzX2ZpZW1hcCwKKwkuZ2V0X2FjbAk9IGJ0cmZzX2dldF9hY2wsCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJ0cmZzX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9ucyA9IHsKIAkuZ2V0YXR0cgk9IGJ0cmZzX2dldGF0dHIsCkBAIC03NDI4LDYgKzc0MzUsNyBAQAogCS5nZXR4YXR0cgk9IGJ0cmZzX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBidHJmc19saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyCT0gYnRyZnNfcmVtb3ZleGF0dHIsCisJLmdldF9hY2wJPSBidHJmc19nZXRfYWNsLAogfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBidHJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKQEAgLTc0MzksNiArNzQ0Nyw3IEBACiAJLmdldHhhdHRyCT0gYnRyZnNfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0cgk9IGJ0cmZzX2xpc3R4YXR0ciwKIAkucmVtb3ZleGF0dHIJPSBidHJmc19yZW1vdmV4YXR0ciwKKwkuZ2V0X2FjbAk9IGJ0cmZzX2dldF9hY2wsCiB9OwogCiBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgYnRyZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9pb2N0bC5jIGIvZnMvYnRyZnMvaW9jdGwuYwppbmRleCBhYzM3MDQwLi42MjI1NDMzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9pb2N0bC5jCisrKyBiL2ZzL2J0cmZzL2lvY3RsLmMKQEAgLTMyMyw3ICszMjMsNyBAQAogCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppbm9kZV9pdGVtOwogCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOwogCXN0cnVjdCBidHJmc19yb290ICpuZXdfcm9vdDsKLQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CiAJc3RydWN0IGlub2RlICpkaXI7CiAJaW50IHJldDsKIAlpbnQgZXJyOwpAQCAtMzMyLDEwICszMzIsOCBAQAogCXU2NCBpbmRleCA9IDA7CiAKIAlyZXQgPSBidHJmc19maW5kX2ZyZWVfb2JqZWN0aWQocm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LCAmb2JqZWN0aWQpOwotCWlmIChyZXQpIHsKLQkJZHB1dChwYXJlbnQpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JfQogCiAJZGlyID0gcGFyZW50LT5kX2lub2RlOwogCkBAIC0zNDYsMTAgKzM0NCw4IEBACiAJICogMiAtIGRpciBpdGVtcwogCSAqLwogCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgNik7Ci0JaWYgKElTX0VSUih0cmFucykpIHsKLQkJZHB1dChwYXJlbnQpOworCWlmIChJU19FUlIodHJhbnMpKQogCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7Ci0JfQogCiAJbGVhZiA9IGJ0cmZzX2FsbG9jX2ZyZWVfYmxvY2sodHJhbnMsIHJvb3QsIHJvb3QtPmxlYWZzaXplLAogCQkJCSAgICAgIDAsIG9iamVjdGlkLCBOVUxMLCAwLCAwLCAwKTsKQEAgLTQzOSw3ICs0MzUsNiBAQAogCiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGJ0cmZzX2xvb2t1cF9kZW50cnkoZGlyLCBkZW50cnkpKTsKIGZhaWw6Ci0JZHB1dChwYXJlbnQpOwogCWlmIChhc3luY190cmFuc2lkKSB7CiAJCSphc3luY190cmFuc2lkID0gdHJhbnMtPnRyYW5zaWQ7CiAJCWVyciA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbl9hc3luYyh0cmFucywgcm9vdCwgMSk7CkBAIC00NTYsNyArNDUxLDYgQEAKIAkJCSAgIGJvb2wgcmVhZG9ubHkpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CiAJc3RydWN0IGJ0cmZzX3BlbmRpbmdfc25hcHNob3QgKnBlbmRpbmdfc25hcHNob3Q7CiAJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CiAJaW50IHJldDsKQEAgLTQ4Miw4ICs0NzYsMTAgQEAKIAlyZXQgPSBidHJmc19zbmFwX3Jlc2VydmVfbWV0YWRhdGEodHJhbnMsIHBlbmRpbmdfc25hcHNob3QpOwogCUJVR19PTihyZXQpOwogCisJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAlsaXN0X2FkZCgmcGVuZGluZ19zbmFwc2hvdC0+bGlzdCwKIAkJICZ0cmFucy0+dHJhbnNhY3Rpb24tPnBlbmRpbmdfc25hcHNob3RzKTsKKwlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJaWYgKGFzeW5jX3RyYW5zaWQpIHsKIAkJKmFzeW5jX3RyYW5zaWQgPSB0cmFucy0+dHJhbnNpZDsKIAkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uX2FzeW5jKHRyYW5zLApAQCAtNTAyLDkgKzQ5OCw3IEBACiAJaWYgKHJldCkKIAkJZ290byBmYWlsOwogCi0JcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKLQlpbm9kZSA9IGJ0cmZzX2xvb2t1cF9kZW50cnkocGFyZW50LT5kX2lub2RlLCBkZW50cnkpOwotCWRwdXQocGFyZW50KTsKKwlpbm9kZSA9IGJ0cmZzX2xvb2t1cF9kZW50cnkoZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSwgZGVudHJ5KTsKIAlpZiAoSVNfRVJSKGlub2RlKSkgewogCQlyZXQgPSBQVFJfRVJSKGlub2RlKTsKIAkJZ290byBmYWlsOwpAQCAtMjA1NCwyOSArMjA0OCwzNCBAQAogCiBzdGF0aWMgbG9uZyBidHJmc19pb2N0bF9mc19pbmZvKHN0cnVjdCBidHJmc19yb290ICpyb290LCB2b2lkIF9fdXNlciAqYXJnKQogewotCXN0cnVjdCBidHJmc19pb2N0bF9mc19pbmZvX2FyZ3MgZmlfYXJnczsKKwlzdHJ1Y3QgYnRyZnNfaW9jdGxfZnNfaW5mb19hcmdzICpmaV9hcmdzOwogCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpuZXh0OwogCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzID0gcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlczsKKwlpbnQgcmV0ID0gMDsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWZpX2FyZ3MubnVtX2RldmljZXMgPSBmc19kZXZpY2VzLT5udW1fZGV2aWNlczsKLQlmaV9hcmdzLm1heF9pZCA9IDA7Ci0JbWVtY3B5KCZmaV9hcmdzLmZzaWQsIHJvb3QtPmZzX2luZm8tPmZzaWQsIHNpemVvZihmaV9hcmdzLmZzaWQpKTsKKwlmaV9hcmdzID0ga3phbGxvYyhzaXplb2YoKmZpX2FyZ3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpX2FyZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJZmlfYXJncy0+bnVtX2RldmljZXMgPSBmc19kZXZpY2VzLT5udW1fZGV2aWNlczsKKwltZW1jcHkoJmZpX2FyZ3MtPmZzaWQsIHJvb3QtPmZzX2luZm8tPmZzaWQsIHNpemVvZihmaV9hcmdzLT5mc2lkKSk7CiAKIAltdXRleF9sb2NrKCZmc19kZXZpY2VzLT5kZXZpY2VfbGlzdF9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldmljZSwgbmV4dCwgJmZzX2RldmljZXMtPmRldmljZXMsIGRldl9saXN0KSB7Ci0JCWlmIChkZXZpY2UtPmRldmlkID4gZmlfYXJncy5tYXhfaWQpCi0JCQlmaV9hcmdzLm1heF9pZCA9IGRldmljZS0+ZGV2aWQ7CisJCWlmIChkZXZpY2UtPmRldmlkID4gZmlfYXJncy0+bWF4X2lkKQorCQkJZmlfYXJncy0+bWF4X2lkID0gZGV2aWNlLT5kZXZpZDsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZmc19kZXZpY2VzLT5kZXZpY2VfbGlzdF9tdXRleCk7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmZpX2FyZ3MsIHNpemVvZihmaV9hcmdzKSkpCi0JCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBmaV9hcmdzLCBzaXplb2YoKmZpX2FyZ3MpKSkKKwkJcmV0ID0gLUVGQVVMVDsKIAotCXJldHVybiAwOworCWtmcmVlKGZpX2FyZ3MpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBsb25nIGJ0cmZzX2lvY3RsX2Rldl9pbmZvKHN0cnVjdCBidHJmc19yb290ICpyb290LCB2b2lkIF9fdXNlciAqYXJnKQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcmVsb2NhdGlvbi5jIGIvZnMvYnRyZnMvcmVsb2NhdGlvbi5jCmluZGV4IGIxZWYyN2MuLjVlMGEzZGMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3JlbG9jYXRpb24uYworKysgYi9mcy9idHJmcy9yZWxvY2F0aW9uLmMKQEAgLTEzNjgsNyArMTM2OCw3IEBACiAJaW50IHJldDsKIAogCWlmICghcm9vdC0+cmVsb2Nfcm9vdCkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJcmVsb2Nfcm9vdCA9IHJvb3QtPnJlbG9jX3Jvb3Q7CiAJcm9vdF9pdGVtID0gJnJlbG9jX3Jvb3QtPnJvb3RfaXRlbTsKQEAgLTEzOTAsNiArMTM5MCw4IEBACiAJcmV0ID0gYnRyZnNfdXBkYXRlX3Jvb3QodHJhbnMsIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKIAkJCQkmcmVsb2Nfcm9vdC0+cm9vdF9rZXksIHJvb3RfaXRlbSk7CiAJQlVHX09OKHJldCk7CisKK291dDoKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE0MiwxMCArMjE0NCwxMSBAQAogCXU2NCBudW1fYnl0ZXMgPSAwOwogCWludCByZXQ7CiAKLQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnJlbG9jX211dGV4KTsKIAlyYy0+bWVyZ2luZ19yc3Zfc2l6ZSArPSByb290LT5ub2Rlc2l6ZSAqIChCVFJGU19NQVhfTEVWRUwgLSAxKSAqIDI7CiAJcmMtPm1lcmdpbmdfcnN2X3NpemUgKz0gcmMtPm5vZGVzX3JlbG9jYXRlZCAqIDI7Ci0Jc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+cmVsb2NfbXV0ZXgpOworCiBhZ2FpbjoKIAlpZiAoIWVycikgewogCQludW1fYnl0ZXMgPSByYy0+bWVyZ2luZ19yc3Zfc2l6ZTsKQEAgLTIyMTQsOSArMjIxNywxNiBAQAogCWludCByZXQ7CiBhZ2FpbjoKIAlyb290ID0gcmMtPmV4dGVudF9yb290OwotCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisKKwkvKgorCSAqIHRoaXMgc2VyaWFsaXplcyB1cyB3aXRoIGJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zYWN0aW9uLAorCSAqIHdlIGhhdmUgdG8gbWFrZSBzdXJlIG5vYm9keSBpcyBpbiB0aGUgbWlkZGxlIG9mCisJICogYWRkaW5nIHRoZWlyIHJvb3RzIHRvIHRoZSBsaXN0IHdoaWxlIHdlIGFyZQorCSAqIGRvaW5nIHRoaXMgc3BsaWNlCisJICovCisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+cmVsb2NfbXV0ZXgpOwogCWxpc3Rfc3BsaWNlX2luaXQoJnJjLT5yZWxvY19yb290cywgJnJlbG9jX3Jvb3RzKTsKLQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5yZWxvY19tdXRleCk7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnJlbG9jX3Jvb3RzKSkgewogCQlmb3VuZCA9IDE7CkBAIC0zNTkwLDE3ICszNjAwLDE5IEBACiBzdGF0aWMgdm9pZCBzZXRfcmVsb2NfY29udHJvbChzdHJ1Y3QgcmVsb2NfY29udHJvbCAqcmMpCiB7CiAJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSByYy0+ZXh0ZW50X3Jvb3QtPmZzX2luZm87Ci0Jc3Bpbl9sb2NrKCZmc19pbmZvLT50cmFuc19sb2NrKTsKKworCW11dGV4X2xvY2soJmZzX2luZm8tPnJlbG9jX211dGV4KTsKIAlmc19pbmZvLT5yZWxvY19jdGwgPSByYzsKLQlzcGluX3VubG9jaygmZnNfaW5mby0+dHJhbnNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5yZWxvY19tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIHVuc2V0X3JlbG9jX2NvbnRyb2woc3RydWN0IHJlbG9jX2NvbnRyb2wgKnJjKQogewogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gcmMtPmV4dGVudF9yb290LT5mc19pbmZvOwotCXNwaW5fbG9jaygmZnNfaW5mby0+dHJhbnNfbG9jayk7CisKKwltdXRleF9sb2NrKCZmc19pbmZvLT5yZWxvY19tdXRleCk7CiAJZnNfaW5mby0+cmVsb2NfY3RsID0gTlVMTDsKLQlzcGluX3VubG9jaygmZnNfaW5mby0+dHJhbnNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5yZWxvY19tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgY2hlY2tfZXh0ZW50X2ZsYWdzKHU2NCBmbGFncykKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3NjcnViLmMgYi9mcy9idHJmcy9zY3J1Yi5jCmluZGV4IGRmNTBmZDEuLmE4ZDAzZDUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3NjcnViLmMKKysrIGIvZnMvYnRyZnMvc2NydWIuYwpAQCAtMTYsMTMgKzE2LDcgQEAKICAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgImN0cmVlLmgiCiAjaW5jbHVkZSAidm9sdW1lcy5oIgogI2luY2x1ZGUgImRpc2staW8uaCIKQEAgLTgwNCwxOCArNzk4LDEyIEBACiAKIAkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CiAJCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9ub3BsdWc7CiAKLQkJbCA9IHBhdGgtPm5vZGVzWzBdOwotCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07Ci0JCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsLCAma2V5LCBzbG90KTsKLQkJaWYgKGtleS5vYmplY3RpZCAhPSBsb2dpY2FsKSB7Ci0JCQlyZXQgPSBidHJmc19wcmV2aW91c19pdGVtKHJvb3QsIHBhdGgsIDAsCi0JCQkJCQkgIEJUUkZTX0VYVEVOVF9JVEVNX0tFWSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIG91dDsKLQkJfQotCisJCS8qCisJCSAqIHdlIG1pZ2h0IG1pc3MgaGFsZiBhbiBleHRlbnQgaGVyZSwgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIsCisJCSAqIGFzIGl0J3Mgb25seSB0aGUgcHJlZmV0Y2gKKwkJICovCiAJCXdoaWxlICgxKSB7CiAJCQlsID0gcGF0aC0+bm9kZXNbMF07CiAJCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07CkBAIC04MjQsNyArODEyLDcgQEAKIAkJCQlpZiAocmV0ID09IDApCiAJCQkJCWNvbnRpbnVlOwogCQkJCWlmIChyZXQgPCAwKQotCQkJCQlnb3RvIG91dDsKKwkJCQkJZ290byBvdXRfbm9wbHVnOwogCiAJCQkJYnJlYWs7CiAJCQl9CkBAIC05MDYsMTUgKzg5NCwyMCBAQAogCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKLQotCQlsID0gcGF0aC0+bm9kZXNbMF07Ci0JCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKLQkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGwsICZrZXksIHNsb3QpOwotCQlpZiAoa2V5Lm9iamVjdGlkICE9IGxvZ2ljYWwpIHsKKwkJaWYgKHJldCA+IDApIHsKIAkJCXJldCA9IGJ0cmZzX3ByZXZpb3VzX2l0ZW0ocm9vdCwgcGF0aCwgMCwKIAkJCQkJCSAgQlRSRlNfRVhURU5UX0lURU1fS0VZKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gb3V0OworCQkJaWYgKHJldCA+IDApIHsKKwkJCQkvKiB0aGVyZSdzIG5vIHNtYWxsZXIgaXRlbSwgc28gc3RpY2sgd2l0aCB0aGUKKwkJCQkgKiBsYXJnZXIgb25lICovCisJCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOworCQkJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksCisJCQkJCQkJcGF0aCwgMCwgMCk7CisJCQkJaWYgKHJldCA8IDApCisJCQkJCWdvdG8gb3V0OworCQkJfQogCQl9CiAKIAkJd2hpbGUgKDEpIHsKQEAgLTk4OSw2ICs5ODIsNyBAQAogCiBvdXQ6CiAJYmxrX2ZpbmlzaF9wbHVnKCZwbHVnKTsKK291dF9ub3BsdWc6CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKIH0KQEAgLTEwNjQsOCArMTA1OCwxNSBAQAogCXdoaWxlICgxKSB7CiAJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOwogCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0OwotCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCWlmIChyZXQgPiAwKSB7CisJCQlpZiAocGF0aC0+c2xvdHNbMF0gPj0KKwkJCSAgICBidHJmc19oZWFkZXJfbnJpdGVtcyhwYXRoLT5ub2Rlc1swXSkpIHsKKwkJCQlyZXQgPSBidHJmc19uZXh0X2xlYWYocm9vdCwgcGF0aCk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KIAogCQlsID0gcGF0aC0+bm9kZXNbMF07CiAJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKQEAgLTEwNzUsNyArMTA3Niw3IEBACiAJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gc2Rldi0+ZGV2LT5kZXZpZCkKIAkJCWJyZWFrOwogCi0JCWlmIChidHJmc19rZXlfdHlwZSgma2V5KSAhPSBCVFJGU19ERVZfRVhURU5UX0tFWSkKKwkJaWYgKGJ0cmZzX2tleV90eXBlKCZmb3VuZF9rZXkpICE9IEJUUkZTX0RFVl9FWFRFTlRfS0VZKQogCQkJYnJlYWs7CiAKIAkJaWYgKGZvdW5kX2tleS5vZmZzZXQgPj0gZW5kKQpAQCAtMTEwNCw3ICsxMTA1LDcgQEAKIAkJY2FjaGUgPSBidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAoZnNfaW5mbywgY2h1bmtfb2Zmc2V0KTsKIAkJaWYgKCFjYWNoZSkgewogCQkJcmV0ID0gLUVOT0VOVDsKLQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CiAJCX0KIAkJcmV0ID0gc2NydWJfY2h1bmsoc2RldiwgY2h1bmtfdHJlZSwgY2h1bmtfb2JqZWN0aWQsCiAJCQkJICBjaHVua19vZmZzZXQsIGxlbmd0aCk7CkBAIC0xMTE2LDkgKzExMTcsMTMgQEAKIAkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwogCX0KIAotb3V0OgogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKLQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiByZXQgY2FuIHN0aWxsIGJlIDEgZnJvbSBzZWFyY2hfc2xvdCBvciBuZXh0X2xlYWYsCisJICogdGhhdCdzIG5vdCBhbiBlcnJvcgorCSAqLworCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKIH0KIAogc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBpbnQgc2NydWJfc3VwZXJzKHN0cnVjdCBzY3J1Yl9kZXYgKnNkZXYpCkBAIC0xMTU1LDggKzExNjAsMTIgQEAKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CiAKIAltdXRleF9sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKLQlpZiAoZnNfaW5mby0+c2NydWJfd29ya2Vyc19yZWZjbnQgPT0gMCkKKwlpZiAoZnNfaW5mby0+c2NydWJfd29ya2Vyc19yZWZjbnQgPT0gMCkgeworCQlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPnNjcnViX3dvcmtlcnMsICJzY3J1YiIsCisJCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplLCAmZnNfaW5mby0+Z2VuZXJpY193b3JrZXIpOworCQlmc19pbmZvLT5zY3J1Yl93b3JrZXJzLmlkbGVfdGhyZXNoID0gNDsKIAkJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+c2NydWJfd29ya2VycywgMSk7CisJfQogCSsrZnNfaW5mby0+c2NydWJfd29ya2Vyc19yZWZjbnQ7CiAJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc3VwZXIuYyBiL2ZzL2J0cmZzL3N1cGVyLmMKaW5kZXggMTE3ZTc0ZS4uMTU2MzRkNCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvc3VwZXIuYworKysgYi9mcy9idHJmcy9zdXBlci5jCkBAIC03MjMsNiArNzIzLDEyIEBACiAJCXNlcV9wdXRzKHNlcSwgIixjbGVhcl9jYWNoZSIpOwogCWlmIChidHJmc190ZXN0X29wdChyb290LCBVU0VSX1NVQlZPTF9STV9BTExPV0VEKSkKIAkJc2VxX3B1dHMoc2VxLCAiLHVzZXJfc3Vidm9sX3JtX2FsbG93ZWQiKTsKKwlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgRU5PU1BDX0RFQlVHKSkKKwkJc2VxX3B1dHMoc2VxLCAiLGVub3NwY19kZWJ1ZyIpOworCWlmIChidHJmc190ZXN0X29wdChyb290LCBBVVRPX0RFRlJBRykpCisJCXNlcV9wdXRzKHNlcSwgIixhdXRvZGVmcmFnIik7CisJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIElOT0RFX01BUF9DQUNIRSkpCisJCXNlcV9wdXRzKHNlcSwgIixpbm9kZV9jYWNoZSIpOwogCXJldHVybiAwOwogfQogCkBAIC04MjUsNyArODMxLDcgQEAKIAl9IGVsc2UgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKLQkJcy0+c19mbGFncyA9IGZsYWdzOworCQlzLT5zX2ZsYWdzID0gZmxhZ3MgfCBNU19OT1NFQzsKIAkJc3RybGNweShzLT5zX2lkLCBiZGV2bmFtZShiZGV2LCBiKSwgc2l6ZW9mKHMtPnNfaWQpKTsKIAkJZXJyb3IgPSBidHJmc19maWxsX3N1cGVyKHMsIGZzX2RldmljZXMsIGRhdGEsCiAJCQkJCSBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3N5c2ZzLmMgYi9mcy9idHJmcy9zeXNmcy5jCmluZGV4IGMzYzIyM2EuLmRhYWM5YWUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3N5c2ZzLmMKKysrIGIvZnMvYnRyZnMvc3lzZnMuYwpAQCAtMjgsMTUyICsyOCw2IEBACiAjaW5jbHVkZSAiZGlzay1pby5oIgogI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCiAKLXN0YXRpYyBzc2l6ZV90IHJvb3RfYmxvY2tzX3VzZWRfc2hvdyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpYnRyZnNfcm9vdF91c2VkKCZyb290LT5yb290X2l0ZW0pKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgcm9vdF9ibG9ja19saW1pdF9zaG93KHN0cnVjdCBidHJmc19yb290ICpyb290LCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19yb290X2xpbWl0KCZyb290LT5yb290X2l0ZW0pKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3VwZXJfYmxvY2tzX3VzZWRfc2hvdyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnMsIGNoYXIgKmJ1ZikKLXsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpYnRyZnNfc3VwZXJfYnl0ZXNfdXNlZCgmZnMtPnN1cGVyX2NvcHkpKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3VwZXJfdG90YWxfYmxvY2tzX3Nob3coc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19zdXBlcl90b3RhbF9ieXRlcygmZnMtPnN1cGVyX2NvcHkpKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3VwZXJfYmxvY2tzaXplX3Nob3coc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19zdXBlcl9zZWN0b3JzaXplKCZmcy0+c3VwZXJfY29weSkpOwotfQotCi0vKiB0aGlzIGlzIGZvciByb290IGF0dHJzIChzdWJ2b2xzL3NuYXBzaG90cykgKi8KLXN0cnVjdCBidHJmc19yb290X2F0dHIgewotCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGJ0cmZzX3Jvb3QgKiwgY2hhciAqKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBidHJmc19yb290ICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKLX07Ci0KLSNkZWZpbmUgUk9PVF9BVFRSKG5hbWUsIG1vZGUsIHNob3csIHN0b3JlKSBcCi1zdGF0aWMgc3RydWN0IGJ0cmZzX3Jvb3RfYXR0ciBidHJmc19yb290X2F0dHJfIyNuYW1lID0gX19BVFRSKG5hbWUsIG1vZGUsIFwKLQkJCQkJCQkgICAgICBzaG93LCBzdG9yZSkKLQotUk9PVF9BVFRSKGJsb2Nrc191c2VkLAkwNDQ0LAlyb290X2Jsb2Nrc191c2VkX3Nob3csCU5VTEwpOwotUk9PVF9BVFRSKGJsb2NrX2xpbWl0LAkwNjQ0LAlyb290X2Jsb2NrX2xpbWl0X3Nob3csCU5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYnRyZnNfcm9vdF9hdHRyc1tdID0gewotCSZidHJmc19yb290X2F0dHJfYmxvY2tzX3VzZWQuYXR0ciwKLQkmYnRyZnNfcm9vdF9hdHRyX2Jsb2NrX2xpbWl0LmF0dHIsCi0JTlVMTCwKLX07Ci0KLS8qIHRoaXMgaXMgZm9yIHN1cGVyIGF0dHJzIChhY3R1YWwgZnVsbCBmcykgKi8KLXN0cnVjdCBidHJmc19zdXBlcl9hdHRyIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBidHJmc19mc19pbmZvICosIGNoYXIgKik7Ci0Jc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Ci19OwotCi0jZGVmaW5lIFNVUEVSX0FUVFIobmFtZSwgbW9kZSwgc2hvdywgc3RvcmUpIFwKLXN0YXRpYyBzdHJ1Y3QgYnRyZnNfc3VwZXJfYXR0ciBidHJmc19zdXBlcl9hdHRyXyMjbmFtZSA9IF9fQVRUUihuYW1lLCBtb2RlLCBcCi0JCQkJCQkJCXNob3csIHN0b3JlKQotCi1TVVBFUl9BVFRSKGJsb2Nrc191c2VkLAkJMDQ0NCwJc3VwZXJfYmxvY2tzX3VzZWRfc2hvdywJCU5VTEwpOwotU1VQRVJfQVRUUih0b3RhbF9ibG9ja3MsCTA0NDQsCXN1cGVyX3RvdGFsX2Jsb2Nrc19zaG93LAlOVUxMKTsKLVNVUEVSX0FUVFIoYmxvY2tzaXplLAkJMDQ0NCwJc3VwZXJfYmxvY2tzaXplX3Nob3csCQlOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJ0cmZzX3N1cGVyX2F0dHJzW10gPSB7Ci0JJmJ0cmZzX3N1cGVyX2F0dHJfYmxvY2tzX3VzZWQuYXR0ciwKLQkmYnRyZnNfc3VwZXJfYXR0cl90b3RhbF9ibG9ja3MuYXR0ciwKLQkmYnRyZnNfc3VwZXJfYXR0cl9ibG9ja3NpemUuYXR0ciwKLQlOVUxMLAotfTsKLQotc3RhdGljIHNzaXplX3QgYnRyZnNfc3VwZXJfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBidHJmc19mc19pbmZvLAotCQkJCQkJc3VwZXJfa29iaik7Ci0Jc3RydWN0IGJ0cmZzX3N1cGVyX2F0dHIgKmEgPSBjb250YWluZXJfb2YoYXR0ciwKLQkJCQkJCSAgc3RydWN0IGJ0cmZzX3N1cGVyX2F0dHIsCi0JCQkJCQkgIGF0dHIpOwotCi0JcmV0dXJuIGEtPnNob3cgPyBhLT5zaG93KGZzLCBidWYpIDogMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYnRyZnNfc3VwZXJfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBidHJmc19mc19pbmZvLAotCQkJCQkJc3VwZXJfa29iaik7Ci0Jc3RydWN0IGJ0cmZzX3N1cGVyX2F0dHIgKmEgPSBjb250YWluZXJfb2YoYXR0ciwKLQkJCQkJCSAgc3RydWN0IGJ0cmZzX3N1cGVyX2F0dHIsCi0JCQkJCQkgIGF0dHIpOwotCi0JcmV0dXJuIGEtPnN0b3JlID8gYS0+c3RvcmUoZnMsIGJ1ZiwgbGVuKSA6IDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJ0cmZzX3Jvb3RfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGJ0cmZzX3Jvb3QsCi0JCQkJCQlyb290X2tvYmopOwotCXN0cnVjdCBidHJmc19yb290X2F0dHIgKmEgPSBjb250YWluZXJfb2YoYXR0ciwKLQkJCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdF9hdHRyLAotCQkJCQkJIGF0dHIpOwotCi0JcmV0dXJuIGEtPnNob3cgPyBhLT5zaG93KHJvb3QsIGJ1ZikgOiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBidHJmc19yb290X2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBidHJmc19yb290LAotCQkJCQkJcm9vdF9rb2JqKTsKLQlzdHJ1Y3QgYnRyZnNfcm9vdF9hdHRyICphID0gY29udGFpbmVyX29mKGF0dHIsCi0JCQkJCQkgc3RydWN0IGJ0cmZzX3Jvb3RfYXR0ciwKLQkJCQkJCSBhdHRyKTsKLQlyZXR1cm4gYS0+c3RvcmUgPyBhLT5zdG9yZShyb290LCBidWYsIGxlbikgOiAwOwotfQotCi1zdGF0aWMgdm9pZCBidHJmc19zdXBlcl9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQotewotCXN0cnVjdCBidHJmc19mc19pbmZvICpmcyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgYnRyZnNfZnNfaW5mbywKLQkJCQkJCXN1cGVyX2tvYmopOwotCWNvbXBsZXRlKCZmcy0+a29ial91bnJlZ2lzdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgYnRyZnNfcm9vdF9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQotewotCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBidHJmc19yb290LAotCQkJCQkJcm9vdF9rb2JqKTsKLQljb21wbGV0ZSgmcm9vdC0+a29ial91bnJlZ2lzdGVyKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgYnRyZnNfc3VwZXJfYXR0cl9vcHMgPSB7Ci0JLnNob3cJPSBidHJmc19zdXBlcl9hdHRyX3Nob3csCi0JLnN0b3JlCT0gYnRyZnNfc3VwZXJfYXR0cl9zdG9yZSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGJ0cmZzX3Jvb3RfYXR0cl9vcHMgPSB7Ci0JLnNob3cJPSBidHJmc19yb290X2F0dHJfc2hvdywKLQkuc3RvcmUJPSBidHJmc19yb290X2F0dHJfc3RvcmUsCi19OwotCiAvKiAvc3lzL2ZzL2J0cmZzLyBlbnRyeSAqLwogc3RhdGljIHN0cnVjdCBrc2V0ICpidHJmc19rc2V0OwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy90cmFuc2FjdGlvbi5jIGIvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYwppbmRleCBkZDcxOTY2Li41MWRjZWM4IDEwMDY0NAotLS0gYS9mcy9idHJmcy90cmFuc2FjdGlvbi5jCisrKyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKQEAgLTEyNiwyOCArMTI2LDg1IEBACiAgKiB0byBtYWtlIHN1cmUgdGhlIG9sZCByb290IGZyb20gYmVmb3JlIHdlIGpvaW5lZCB0aGUgdHJhbnNhY3Rpb24gaXMgZGVsZXRlZAogICogd2hlbiB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cwogICovCi1pbnQgYnRyZnNfcmVjb3JkX3Jvb3RfaW5fdHJhbnMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCitzdGF0aWMgaW50IHJlY29yZF9yb290X2luX3RyYW5zKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQogewogCWlmIChyb290LT5yZWZfY293cyAmJiByb290LT5sYXN0X3RyYW5zIDwgdHJhbnMtPnRyYW5zaWQpIHsKIAkJV0FSTl9PTihyb290ID09IHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290KTsKIAkJV0FSTl9PTihyb290LT5jb21taXRfcm9vdCAhPSByb290LT5ub2RlKTsKIAorCQkvKgorCQkgKiBzZWUgYmVsb3cgZm9yIGluX3RyYW5zX3NldHVwIHVzYWdlIHJ1bGVzCisJCSAqIHdlIGhhdmUgdGhlIHJlbG9jIG11dGV4IGhlbGQgbm93LCBzbyB0aGVyZQorCQkgKiBpcyBvbmx5IG9uZSB3cml0ZXIgaW4gdGhpcyBmdW5jdGlvbgorCQkgKi8KKwkJcm9vdC0+aW5fdHJhbnNfc2V0dXAgPSAxOworCisJCS8qIG1ha2Ugc3VyZSByZWFkZXJzIGZpbmQgaW5fdHJhbnNfc2V0dXAgYmVmb3JlCisJCSAqIHRoZXkgZmluZCBvdXIgcm9vdC0+bGFzdF90cmFucyB1cGRhdGUKKwkJICovCisJCXNtcF93bWIoKTsKKwogCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4X2xvY2spOwogCQlpZiAocm9vdC0+bGFzdF90cmFucyA9PSB0cmFucy0+dHJhbnNpZCkgewogCQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4X2xvY2spOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJcm9vdC0+bGFzdF90cmFucyA9IHRyYW5zLT50cmFuc2lkOwogCQlyYWRpeF90cmVlX3RhZ19zZXQoJnJvb3QtPmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4LAogCQkJICAgKHVuc2lnbmVkIGxvbmcpcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCiAJCQkgICBCVFJGU19ST09UX1RSQU5TX1RBRyk7CiAJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5mc19yb290c19yYWRpeF9sb2NrKTsKKwkJcm9vdC0+bGFzdF90cmFucyA9IHRyYW5zLT50cmFuc2lkOworCisJCS8qIHRoaXMgaXMgcHJldHR5IHRyaWNreS4gIFdlIGRvbid0IHdhbnQgdG8KKwkJICogdGFrZSB0aGUgcmVsb2NhdGlvbiBsb2NrIGluIGJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zCisJCSAqIHVubGVzcyB3ZSdyZSByZWFsbHkgZG9pbmcgdGhlIGZpcnN0IHNldHVwIGZvciB0aGlzIHJvb3QgaW4KKwkJICogdGhpcyB0cmFuc2FjdGlvbi4KKwkJICoKKwkJICogTm9ybWFsbHkgd2UnZCB1c2Ugcm9vdC0+bGFzdF90cmFucyBhcyBhIGZsYWcgdG8gZGVjaWRlCisJCSAqIGlmIHdlIHdhbnQgdG8gdGFrZSB0aGUgZXhwZW5zaXZlIG11dGV4LgorCQkgKgorCQkgKiBCdXQsIHdlIGhhdmUgdG8gc2V0IHJvb3QtPmxhc3RfdHJhbnMgYmVmb3JlIHdlCisJCSAqIGluaXQgdGhlIHJlbG9jYXRpb24gcm9vdCwgb3RoZXJ3aXNlLCB3ZSB0cmlwIG92ZXIgd2FybmluZ3MKKwkJICogaW4gY3RyZWUuYy4gIFRoZSBzb2x1dGlvbiB1c2VkIGhlcmUgaXMgdG8gZmxhZyBvdXJzZWx2ZXMKKwkJICogd2l0aCByb290LT5pbl90cmFuc19zZXR1cC4gIFdoZW4gdGhpcyBpcyAxLCB3ZSdyZSBzdGlsbAorCQkgKiBmaXhpbmcgdXAgdGhlIHJlbG9jIHRyZWVzIGFuZCBldmVyeW9uZSBtdXN0IHdhaXQuCisJCSAqCisJCSAqIFdoZW4gdGhpcyBpcyB6ZXJvLCB0aGV5IGNhbiB0cnVzdCByb290LT5sYXN0X3RyYW5zIGFuZCBmbHkKKwkJICogdGhyb3VnaCBidHJmc19yZWNvcmRfcm9vdF9pbl90cmFucyB3aXRob3V0IGhhdmluZyB0byB0YWtlIHRoZQorCQkgKiBsb2NrLiAgc21wX3dtYigpIG1ha2VzIHN1cmUgdGhhdCBhbGwgdGhlIHdyaXRlcyBhYm92ZSBhcmUKKwkJICogZG9uZSBiZWZvcmUgd2UgcG9wIGluIHRoZSB6ZXJvIGJlbG93CisJCSAqLwogCQlidHJmc19pbml0X3JlbG9jX3Jvb3QodHJhbnMsIHJvb3QpOworCQlzbXBfd21iKCk7CisJCXJvb3QtPmluX3RyYW5zX3NldHVwID0gMDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKKworaW50IGJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCWlmICghcm9vdC0+cmVmX2Nvd3MpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBzZWUgcmVjb3JkX3Jvb3RfaW5fdHJhbnMgZm9yIGNvbW1lbnRzIGFib3V0IGluX3RyYW5zX3NldHVwIHVzYWdlCisJICogYW5kIGJhcnJpZXJzCisJICovCisJc21wX3JtYigpOworCWlmIChyb290LT5sYXN0X3RyYW5zID09IHRyYW5zLT50cmFuc2lkICYmCisJICAgICFyb290LT5pbl90cmFuc19zZXR1cCkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT5yZWxvY19tdXRleCk7CisJcmVjb3JkX3Jvb3RfaW5fdHJhbnModHJhbnMsIHJvb3QpOworCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+cmVsb2NfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKIC8qIHdhaXQgZm9yIGNvbW1pdCBhZ2FpbnN0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHRvIGJlY29tZSB1bmJsb2NrZWQKICAqIHdoZW4gdGhpcyBpcyBkb25lLCBpdCBpcyBzYWZlIHRvIHN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uLCBidXQgdGhlIGN1cnJlbnQKICAqIHRyYW5zYWN0aW9uIG1pZ2h0IG5vdCBiZSBmdWxseSBvbiBkaXNrLgpAQCAtMzQ5LDcgKzQwNiw3IEBACiAJCQkJCSAgICBsaXN0KSB7CiAJCQlpZiAodC0+aW5fY29tbWl0KSB7CiAJCQkJaWYgKHQtPmNvbW1pdF9kb25lKQotCQkJCQlnb3RvIG91dDsKKwkJCQkJYnJlYWs7CiAJCQkJY3VyX3RyYW5zID0gdDsKIAkJCQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7CiAJCQkJYnJlYWs7CkBAIC04ODIsNyArOTM5LDcgQEAKIAlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOwogCXBhcmVudF9pbm9kZSA9IHBhcmVudC0+ZF9pbm9kZTsKIAlwYXJlbnRfcm9vdCA9IEJUUkZTX0kocGFyZW50X2lub2RlKS0+cm9vdDsKLQlidHJmc19yZWNvcmRfcm9vdF9pbl90cmFucyh0cmFucywgcGFyZW50X3Jvb3QpOworCXJlY29yZF9yb290X2luX3RyYW5zKHRyYW5zLCBwYXJlbnRfcm9vdCk7CiAKIAkvKgogCSAqIGluc2VydCB0aGUgZGlyZWN0b3J5IGl0ZW0KQEAgLTkwMCw3ICs5NTcsMTYgQEAKIAlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHBhcmVudF9yb290LCBwYXJlbnRfaW5vZGUpOwogCUJVR19PTihyZXQpOwogCi0JYnRyZnNfcmVjb3JkX3Jvb3RfaW5fdHJhbnModHJhbnMsIHJvb3QpOworCS8qCisJICogcHVsbCBpbiB0aGUgZGVsYXllZCBkaXJlY3RvcnkgdXBkYXRlCisJICogYW5kIHRoZSBkZWxheWVkIGlub2RlIGl0ZW0KKwkgKiBvdGhlcndpc2Ugd2UgY29ycnVwdCB0aGUgRlMgZHVyaW5nCisJICogc25hcHNob3QKKwkgKi8KKwlyZXQgPSBidHJmc19ydW5fZGVsYXllZF9pdGVtcyh0cmFucywgcm9vdCk7CisJQlVHX09OKHJldCk7CisKKwlyZWNvcmRfcm9vdF9pbl90cmFucyh0cmFucywgcm9vdCk7CiAJYnRyZnNfc2V0X3Jvb3RfbGFzdF9zbmFwc2hvdCgmcm9vdC0+cm9vdF9pdGVtLCB0cmFucy0+dHJhbnNpZCk7CiAJbWVtY3B5KG5ld19yb290X2l0ZW0sICZyb290LT5yb290X2l0ZW0sIHNpemVvZigqbmV3X3Jvb3RfaXRlbSkpOwogCWJ0cmZzX2NoZWNrX2FuZF9pbml0X3Jvb3RfaXRlbShuZXdfcm9vdF9pdGVtKTsKQEAgLTk2MSwxNCArMTAyNyw2IEBACiAJaW50IHJldDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGVuZGluZywgaGVhZCwgbGlzdCkgewotCQkvKgotCQkgKiBXZSBtdXN0IGRlYWwgd2l0aCB0aGUgZGVsYXllZCBpdGVtcyBiZWZvcmUgY3JlYXRpbmcKLQkJICogc25hcHNob3RzLCBvciB3ZSB3aWxsIGNyZWF0ZSBhIHNuYXB0aG90IHdpdGggaW5jb25zaXN0ZW50Ci0JCSAqIGluZm9ybWF0aW9uLgotCQkqLwotCQlyZXQgPSBidHJmc19ydW5fZGVsYXllZF9pdGVtcyh0cmFucywgZnNfaW5mby0+ZnNfcm9vdCk7Ci0JCUJVR19PTihyZXQpOwotCiAJCXJldCA9IGNyZWF0ZV9wZW5kaW5nX3NuYXBzaG90KHRyYW5zLCBmc19pbmZvLCBwZW5kaW5nKTsKIAkJQlVHX09OKHJldCk7CiAJfQpAQCAtMTExOCw4ICsxMTc2LDExIEBACiAJCXdhaXRfY3VycmVudF90cmFuc19jb21taXRfc3RhcnRfYW5kX3VuYmxvY2socm9vdCwgY3VyX3RyYW5zKTsKIAllbHNlCiAJCXdhaXRfY3VycmVudF90cmFuc19jb21taXRfc3RhcnQocm9vdCwgY3VyX3RyYW5zKTsKLQlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKIAorCWlmIChjdXJyZW50LT5qb3VybmFsX2luZm8gPT0gdHJhbnMpCisJCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IE5VTEw7CisKKwlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIzOCwyMSArMTI5OSw0MiBAQAogCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKIAogCQlmaW5pc2hfd2FpdCgmY3VyX3RyYW5zLT53cml0ZXJfd2FpdCwgJndhaXQpOwotCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwotCQlyb290LT5mc19pbmZvLT50cmFuc19ub19qb2luID0gMTsKLQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCX0gd2hpbGUgKGF0b21pY19yZWFkKCZjdXJfdHJhbnMtPm51bV93cml0ZXJzKSA+IDEgfHwKIAkJIChzaG91bGRfZ3JvdyAmJiBjdXJfdHJhbnMtPm51bV9qb2luZWQgIT0gam9pbmVkKSk7CiAKLQlyZXQgPSBjcmVhdGVfcGVuZGluZ19zbmFwc2hvdHModHJhbnMsIHJvb3QtPmZzX2luZm8pOwotCUJVR19PTihyZXQpOworCS8qCisJICogT2sgbm93IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRvIGJsb2NrIG91dCBhbnkgb3RoZXIgam9pbnMgd2hpbGUgd2UKKwkgKiBjb21taXQgdGhlIHRyYW5zYWN0aW9uLiAgV2UgY291bGQgaGF2ZSBzdGFydGVkIGEgam9pbiBiZWZvcmUgc2V0dGluZworCSAqIG5vX2pvaW4gc28gbWFrZSBzdXJlIHRvIHdhaXQgZm9yIG51bV93cml0ZXJzIHRvID09IDEgYWdhaW4uCisJICovCisJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKKwlyb290LT5mc19pbmZvLT50cmFuc19ub19qb2luID0gMTsKKwlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisJd2FpdF9ldmVudChjdXJfdHJhbnMtPndyaXRlcl93YWl0LAorCQkgICBhdG9taWNfcmVhZCgmY3VyX3RyYW5zLT5udW1fd3JpdGVycykgPT0gMSk7CisKKwkvKgorCSAqIHRoZSByZWxvYyBtdXRleCBtYWtlcyBzdXJlIHRoYXQgd2Ugc3RvcAorCSAqIHRoZSBiYWxhbmNpbmcgY29kZSBmcm9tIGNvbWluZyBpbiBhbmQgbW92aW5nCisJICogZXh0ZW50cyBhcm91bmQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY29tbWl0CisJICovCisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+cmVsb2NfbXV0ZXgpOwogCiAJcmV0ID0gYnRyZnNfcnVuX2RlbGF5ZWRfaXRlbXModHJhbnMsIHJvb3QpOwogCUJVR19PTihyZXQpOwogCisJcmV0ID0gY3JlYXRlX3BlbmRpbmdfc25hcHNob3RzKHRyYW5zLCByb290LT5mc19pbmZvKTsKKwlCVUdfT04ocmV0KTsKKwogCXJldCA9IGJ0cmZzX3J1bl9kZWxheWVkX3JlZnModHJhbnMsIHJvb3QsICh1bnNpZ25lZCBsb25nKS0xKTsKIAlCVUdfT04ocmV0KTsKIAorCS8qCisJICogbWFrZSBzdXJlIG5vbmUgb2YgdGhlIGNvZGUgYWJvdmUgbWFuYWdlZCB0byBzbGlwIGluIGEKKwkgKiBkZWxheWVkIGl0ZW0KKwkgKi8KKwlidHJmc19hc3NlcnRfZGVsYXllZF9yb290X2VtcHR5KHJvb3QpOworCiAJV0FSTl9PTihjdXJfdHJhbnMgIT0gdHJhbnMtPnRyYW5zYWN0aW9uKTsKIAogCWJ0cmZzX3NjcnViX3BhdXNlKHJvb3QpOwpAQCAtMTMwOSw2ICsxMzkxLDcgQEAKIAlyb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uID0gTlVMTDsKIAlyb290LT5mc19pbmZvLT50cmFuc19ub19qb2luID0gMDsKIAlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5yZWxvY19tdXRleCk7CiAKIAl3YWtlX3VwKCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0KTsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJlZS1sb2cuYyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKaW5kZXggNTkyMzk2Yy4uNGNlOGE5ZiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJlZS1sb2cuYworKysgYi9mcy9idHJmcy90cmVlLWxvZy5jCkBAIC0zMTc3LDcgKzMxNzcsNyBAQAogCQl0bXBfa2V5Lm9mZnNldCA9ICh1NjQpLTE7CiAKIAkJd2MucmVwbGF5X2Rlc3QgPSBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fbmFtZShmc19pbmZvLCAmdG1wX2tleSk7Ci0JCUJVR19PTighd2MucmVwbGF5X2Rlc3QpOworCQlCVUdfT04oSVNfRVJSX09SX05VTEwod2MucmVwbGF5X2Rlc3QpKTsKIAogCQl3Yy5yZXBsYXlfZGVzdC0+bG9nX3Jvb3QgPSBsb2c7CiAJCWJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKHRyYW5zLCB3Yy5yZXBsYXlfZGVzdCk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy92b2x1bWVzLmMgYi9mcy9idHJmcy92b2x1bWVzLmMKaW5kZXggZGE1NDFkZi4uMTk0NTBiYyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdm9sdW1lcy5jCisrKyBiL2ZzL2J0cmZzL3ZvbHVtZXMuYwpAQCAtNjg5LDEyICs2ODksOCBAQAogCXRyYW5zaWQgPSBidHJmc19zdXBlcl9nZW5lcmF0aW9uKGRpc2tfc3VwZXIpOwogCWlmIChkaXNrX3N1cGVyLT5sYWJlbFswXSkKIAkJcHJpbnRrKEtFUk5fSU5GTyAiZGV2aWNlIGxhYmVsICVzICIsIGRpc2tfc3VwZXItPmxhYmVsKTsKLQllbHNlIHsKLQkJLyogRklYTUUsIG1ha2UgYSByZWFkbCB1dWlkIHBhcnNlciAqLwotCQlwcmludGsoS0VSTl9JTkZPICJkZXZpY2UgZnNpZCAlbGx4LSVsbHggIiwKLQkJICAgICAgICoodW5zaWduZWQgbG9uZyBsb25nICopZGlza19zdXBlci0+ZnNpZCwKLQkJICAgICAgICoodW5zaWduZWQgbG9uZyBsb25nICopKGRpc2tfc3VwZXItPmZzaWQgKyA4KSk7Ci0JfQorCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZGV2aWNlIGZzaWQgJXBVICIsIGRpc2tfc3VwZXItPmZzaWQpOwogCXByaW50ayhLRVJOX0NPTlQgImRldmlkICVsbHUgdHJhbnNpZCAlbGx1ICVzXG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRldmlkLCAodW5zaWduZWQgbG9uZyBsb25nKXRyYW5zaWQsIHBhdGgpOwogCXJldCA9IGRldmljZV9saXN0X2FkZChwYXRoLCBkaXNrX3N1cGVyLCBkZXZpZCwgZnNfZGV2aWNlc19yZXQpOwpAQCAtMjEwMiw3ICsyMDk4LDggQEAKIAkJCQkJICAgY2h1bmtfcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCiAJCQkJCSAgIGZvdW5kX2tleS5vYmplY3RpZCwKIAkJCQkJICAgZm91bmRfa2V5Lm9mZnNldCk7Ci0JCUJVR19PTihyZXQgJiYgcmV0ICE9IC1FTk9TUEMpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PU1BDKQorCQkJZ290byBlcnJvcjsKIAkJa2V5Lm9mZnNldCA9IGZvdW5kX2tleS5vZmZzZXQgLSAxOwogCX0KIAlyZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvYnVmZmVyLmMgYi9mcy9idWZmZXIuYwppbmRleCA0OWM5YWFkLi4xYTgwYjA0IDEwMDY0NAotLS0gYS9mcy9idWZmZXIuYworKysgYi9mcy9idWZmZXIuYwpAQCAtMTkwMiwxMCArMTkwMiw4IEBACiAJCWlmICghYnVmZmVyX3VwdG9kYXRlKCp3YWl0X2JoKSkKIAkJCWVyciA9IC1FSU87CiAJfQotCWlmICh1bmxpa2VseShlcnIpKSB7CisJaWYgKHVubGlrZWx5KGVycikpCiAJCXBhZ2VfemVyb19uZXdfYnVmZmVycyhwYWdlLCBmcm9tLCB0byk7Ci0JCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwotCX0KIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChfX2Jsb2NrX3dyaXRlX2JlZ2luKTsKZGlmZiAtLWdpdCBhL2ZzL2NhY2hlZmlsZXMvYmluZC5jIGIvZnMvY2FjaGVmaWxlcy9iaW5kLmMKaW5kZXggYTI2MDNlNy4uNjIyZjQ2OSAxMDA2NDQKLS0tIGEvZnMvY2FjaGVmaWxlcy9iaW5kLmMKKysrIGIvZnMvY2FjaGVmaWxlcy9iaW5kLmMKQEAgLTEyOSw4ICsxMjksNiBAQAogCSAgICAhcm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIgfHwKIAkgICAgIXJvb3QtPmRfaW5vZGUtPmlfb3AtPnNldHhhdHRyIHx8CiAJICAgICFyb290LT5kX2lub2RlLT5pX29wLT5nZXR4YXR0ciB8fAotCSAgICAhcm9vdC0+ZF9zYiB8fAotCSAgICAhcm9vdC0+ZF9zYi0+c19vcCB8fAogCSAgICAhcm9vdC0+ZF9zYi0+c19vcC0+c3RhdGZzIHx8CiAJICAgICFyb290LT5kX3NiLT5zX29wLT5zeW5jX2ZzKQogCQlnb3RvIGVycm9yX3Vuc3VwcG9ydGVkOwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9hZGRyLmMgYi9mcy9jZXBoL2FkZHIuYwppbmRleCAzM2RhNDlkLi41YTM5NTNkIDEwMDY0NAotLS0gYS9mcy9jZXBoL2FkZHIuYworKysgYi9mcy9jZXBoL2FkZHIuYwpAQCAtNDUzLDcgKzQ1Myw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAlCVUdfT04oIWlub2RlKTsKLQlpZ3JhYihpbm9kZSk7CisJaWhvbGQoaW5vZGUpOwogCWVyciA9IHdyaXRlcGFnZV9ub3VubG9jayhwYWdlLCB3YmMpOwogCXVubG9ja19wYWdlKHBhZ2UpOwogCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9jYXBzLmMgYi9mcy9jZXBoL2NhcHMuYwppbmRleCAxZjcyYjAwLi44ZDc0YWQ3IDEwMDY0NAotLS0gYS9mcy9jZXBoL2NhcHMuYworKysgYi9mcy9jZXBoL2NhcHMuYwpAQCAtMTgxMSw3ICsxODExLDcgQEAKIAlzcGluX3VubG9jaygmY2ktPmlfdW5zYWZlX2xvY2spOwogfQogCi1pbnQgY2VwaF9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQoraW50IGNlcGhfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKQEAgLTE4MjIsOSArMTgyMiwxMCBAQAogCWRvdXQoImZzeW5jICVwJXNcbiIsIGlub2RlLCBkYXRhc3luYyA/ICIgZGF0YXN5bmMiIDogIiIpOwogCXN5bmNfd3JpdGVfd2FpdChpbm9kZSk7CiAKLQlyZXQgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlub2RlLT5pX21hcHBpbmcpOworCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJZGlydHkgPSB0cnlfZmx1c2hfY2Fwcyhpbm9kZSwgTlVMTCwgJmZsdXNoX3RpZCk7CiAJZG91dCgiZnN5bmMgZGlydHkgY2FwcyBhcmUgJXNcbiIsIGNlcGhfY2FwX3N0cmluZyhkaXJ0eSkpOwpAQCAtMTg0MSw2ICsxODQyLDcgQEAKIAl9CiAKIAlkb3V0KCJmc3luYyAlcCVzIGRvbmVcbiIsIGlub2RlLCBkYXRhc3luYyA/ICIgZGF0YXN5bmMiIDogIiIpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI5NDAsMTQgKzI5NDIsMTIgQEAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJm1kc2MtPmNhcF9kaXJ0eSkpIHsKIAkJY2kgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtZHNjLT5jYXBfZGlydHksIHN0cnVjdCBjZXBoX2lub2RlX2luZm8sCiAJCQkJICAgICAgaV9kaXJ0eV9pdGVtKTsKLQkJaW5vZGUgPSBpZ3JhYigmY2ktPnZmc19pbm9kZSk7CisJCWlub2RlID0gJmNpLT52ZnNfaW5vZGU7CisJCWlob2xkKGlub2RlKTsKIAkJZG91dCgiZmx1c2hfZGlydHlfY2FwcyAlcFxuIiwgaW5vZGUpOwogCQlzcGluX3VubG9jaygmbWRzYy0+Y2FwX2RpcnR5X2xvY2spOwotCQlpZiAoaW5vZGUpIHsKLQkJCWNlcGhfY2hlY2tfY2FwcyhjaSwgQ0hFQ0tfQ0FQU19OT0RFTEFZfENIRUNLX0NBUFNfRkxVU0gsCi0JCQkJCU5VTEwpOwotCQkJaXB1dChpbm9kZSk7Ci0JCX0KKwkJY2VwaF9jaGVja19jYXBzKGNpLCBDSEVDS19DQVBTX05PREVMQVl8Q0hFQ0tfQ0FQU19GTFVTSCwgTlVMTCk7CisJCWlwdXQoaW5vZGUpOwogCQlzcGluX2xvY2soJm1kc2MtPmNhcF9kaXJ0eV9sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2soJm1kc2MtPmNhcF9kaXJ0eV9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvZGlyLmMgYi9mcy9jZXBoL2Rpci5jCmluZGV4IDMzNzI5ZTguLjEwNjVhYzcgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvZGlyLmMKKysrIGIvZnMvY2VwaC9kaXIuYwpAQCAtMjUyLDcgKzI1Miw3IEBACiAJCW9mZiA9IDE7CiAJfQogCWlmIChmaWxwLT5mX3BvcyA9PSAxKSB7Ci0JCWlub190IGlubyA9IGZpbHAtPmZfZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9pbm87CisJCWlub190IGlubyA9IHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpOwogCQlkb3V0KCJyZWFkZGlyIG9mZiAxIC0+ICcuLidcbiIpOwogCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGNlcGhfbWFrZV9mcG9zKDAsIDEpLAogCQkJICAgIGNlcGhfdHJhbnNsYXRlX2lubyhpbm9kZS0+aV9zYiwgaW5vKSwKQEAgLTMwOCw3ICszMDgsOCBAQAogCQlyZXEgPSBjZXBoX21kc2NfY3JlYXRlX3JlcXVlc3QobWRzYywgb3AsIFVTRV9BVVRIX01EUyk7CiAJCWlmIChJU19FUlIocmVxKSkKIAkJCXJldHVybiBQVFJfRVJSKHJlcSk7Ci0JCXJlcS0+cl9pbm9kZSA9IGlncmFiKGlub2RlKTsKKwkJcmVxLT5yX2lub2RlID0gaW5vZGU7CisJCWlob2xkKGlub2RlKTsKIAkJcmVxLT5yX2RlbnRyeSA9IGRnZXQoZmlscC0+Zl9kZW50cnkpOwogCQkvKiBoaW50cyB0byByZXF1ZXN0IC0+IG1kcyBzZWxlY3Rpb24gY29kZSAqLwogCQlyZXEtPnJfZGlyZWN0X21vZGUgPSBVU0VfQVVUSF9NRFM7CkBAIC00NDUsMTQgKzQ0NiwxOSBAQAogCWxvZmZfdCByZXR2YWw7CiAKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJcmV0dmFsID0gLUVJTlZBTDsKIAlzd2l0Y2ggKG9yaWdpbikgewogCWNhc2UgU0VFS19FTkQ6CiAJCW9mZnNldCArPSBpbm9kZS0+aV9zaXplICsgMjsgICAvKiBGSVhNRSAqLwogCQlicmVhazsKIAljYXNlIFNFRUtfQ1VSOgogCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CisJY2FzZSBTRUVLX1NFVDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBvdXQ7CiAJfQotCXJldHZhbCA9IC1FSU5WQUw7CisKIAlpZiAob2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDw9IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7CiAJCWlmIChvZmZzZXQgIT0gZmlsZS0+Zl9wb3MpIHsKIAkJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OwpAQCAtNDc2LDYgKzQ4Miw3IEBACiAJCWlmIChvZmZzZXQgPiBvbGRfb2Zmc2V0KQogCQkJZmktPmRpcl9yZWxlYXNlX2NvdW50LS07CiAJfQorb3V0OgogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC01NjUsNyArNTcyLDYgQEAKIAkvKiBvcGVuIChidXQgbm90IGNyZWF0ZSEpIGludGVudD8gKi8KIAlpZiAobmQgJiYKIAkgICAgKG5kLT5mbGFncyAmIExPT0tVUF9PUEVOKSAmJgotCSAgICAobmQtPmZsYWdzICYgTE9PS1VQX0NPTlRJTlVFKSA9PSAwICYmIC8qIG9ubHkgb3BlbiBsYXN0IGNvbXBvbmVudCAqLwogCSAgICAhKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIE9fQ1JFQVQpKSB7CiAJCWludCBtb2RlID0gbmQtPmludGVudC5vcGVuLmNyZWF0ZV9tb2RlICYgfmN1cnJlbnQtPmZzLT51bWFzazsKIAkJcmV0dXJuIGNlcGhfbG9va3VwX29wZW4oZGlyLCBkZW50cnksIG5kLCBtb2RlLCAxKTsKQEAgLTc4NywxMCArNzkzLDEyIEBACiAJcmVxLT5yX2RlbnRyeV9kcm9wID0gQ0VQSF9DQVBfRklMRV9TSEFSRUQ7CiAJcmVxLT5yX2RlbnRyeV91bmxlc3MgPSBDRVBIX0NBUF9GSUxFX0VYQ0w7CiAJZXJyID0gY2VwaF9tZHNjX2RvX3JlcXVlc3QobWRzYywgZGlyLCByZXEpOwotCWlmIChlcnIpCisJaWYgKGVycikgewogCQlkX2Ryb3AoZGVudHJ5KTsKLQllbHNlIGlmICghcmVxLT5yX3JlcGx5X2luZm8uaGVhZC0+aXNfZGVudHJ5KQotCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaWdyYWIob2xkX2RlbnRyeS0+ZF9pbm9kZSkpOworCX0gZWxzZSBpZiAoIXJlcS0+cl9yZXBseV9pbmZvLmhlYWQtPmlzX2RlbnRyeSkgeworCQlpaG9sZChvbGRfZGVudHJ5LT5kX2lub2RlKTsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIG9sZF9kZW50cnktPmRfaW5vZGUpOworCX0KIAljZXBoX21kc2NfcHV0X3JlcXVlc3QocmVxKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTExMCw3ICsxMTE4LDggQEAKICAqIGFuIGZzeW5jKCkgb24gYSBkaXIgd2lsbCB3YWl0IGZvciBhbnkgdW5jb21taXR0ZWQgZGlyZWN0b3J5CiAgKiBvcGVyYXRpb25zIHRvIGNvbW1pdC4KICAqLwotc3RhdGljIGludCBjZXBoX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQorc3RhdGljIGludCBjZXBoX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkJICBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKQEAgLTExMjAsNiArMTEyOSwxMSBAQAogCWludCByZXQgPSAwOwogCiAJZG91dCgiZGlyX2ZzeW5jICVwXG4iLCBpbm9kZSk7CisJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwogCXNwaW5fbG9jaygmY2ktPmlfdW5zYWZlX2xvY2spOwogCWlmIChsaXN0X2VtcHR5KGhlYWQpKQogCQlnb3RvIG91dDsKQEAgLTExNTMsNiArMTE2Nyw4IEBACiAJfSB3aGlsZSAocmVxLT5yX3RpZCA8IGxhc3RfdGlkKTsKIG91dDoKIAlzcGluX3VubG9jaygmY2ktPmlfdW5zYWZlX2xvY2spOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvY2VwaC9leHBvcnQuYyBiL2ZzL2NlcGgvZXhwb3J0LmMKaW5kZXggYTYxMGQzZC4uZjY3YjY4NyAxMDA2NDQKLS0tIGEvZnMvY2VwaC9leHBvcnQuYworKysgYi9mcy9jZXBoL2V4cG9ydC5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJZXJyID0gY2VwaF9tZHNjX2RvX3JlcXVlc3QobWRzYywgTlVMTCwgcmVxKTsKIAkJaW5vZGUgPSByZXEtPnJfdGFyZ2V0X2lub2RlOwogCQlpZiAoaW5vZGUpCi0JCQlpZ3JhYihpbm9kZSk7CisJCQlpaG9sZChpbm9kZSk7CiAJCWNlcGhfbWRzY19wdXRfcmVxdWVzdChyZXEpOwogCQlpZiAoIWlub2RlKQogCQkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CkBAIC0xNjcsNyArMTY3LDcgQEAKIAkJZXJyID0gY2VwaF9tZHNjX2RvX3JlcXVlc3QobWRzYywgTlVMTCwgcmVxKTsKIAkJaW5vZGUgPSByZXEtPnJfdGFyZ2V0X2lub2RlOwogCQlpZiAoaW5vZGUpCi0JCQlpZ3JhYihpbm9kZSk7CisJCQlpaG9sZChpbm9kZSk7CiAJCWNlcGhfbWRzY19wdXRfcmVxdWVzdChyZXEpOwogCQlpZiAoIWlub2RlKQogCQkJcmV0dXJuIEVSUl9QVFIoZXJyID8gZXJyIDogLUVTVEFMRSk7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2ZpbGUuYyBiL2ZzL2NlcGgvZmlsZS5jCmluZGV4IDIwMzI1MmQuLjBkMGVhZTAgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvZmlsZS5jCisrKyBiL2ZzL2NlcGgvZmlsZS5jCkBAIC0xOTEsNyArMTkxLDggQEAKIAkJZXJyID0gUFRSX0VSUihyZXEpOwogCQlnb3RvIG91dDsKIAl9Ci0JcmVxLT5yX2lub2RlID0gaWdyYWIoaW5vZGUpOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCWlob2xkKGlub2RlKTsKIAlyZXEtPnJfbnVtX2NhcHMgPSAxOwogCWVyciA9IGNlcGhfbWRzY19kb19yZXF1ZXN0KG1kc2MsIHBhcmVudF9pbm9kZSwgcmVxKTsKIAlpZiAoIWVycikKQEAgLTIyNSw3ICsyMjYsNyBAQAogCXN0cnVjdCBpbm9kZSAqcGFyZW50X2lub2RlID0gZ2V0X2RlbnRyeV9wYXJlbnRfaW5vZGUoZmlsZS0+Zl9kZW50cnkpOwogCXN0cnVjdCBjZXBoX21kc19yZXF1ZXN0ICpyZXE7CiAJaW50IGVycjsKLQlpbnQgZmxhZ3MgPSBuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgLSAxOyAgLyogc2lsbHkgdmZzISAqLworCWludCBmbGFncyA9IG5kLT5pbnRlbnQub3Blbi5mbGFnczsKIAogCWRvdXQoImNlcGhfbG9va3VwX29wZW4gZGVudHJ5ICVwICclLipzJyBmbGFncyAlZCBtb2RlIDAlb1xuIiwKIAkgICAgIGRlbnRyeSwgZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lLCBmbGFncywgbW9kZSk7CkBAIC0yODIsMTQgKzI4MywxMyBAQAogc3RhdGljIGludCBzdHJpcGVkX3JlYWQoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCXU2NCBvZmYsIHU2NCBsZW4sCiAJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnVtX3BhZ2VzLAotCQkJaW50ICpjaGVja2VvZiwgYm9vbCBhbGlnbl90b19wYWdlcywKKwkJCWludCAqY2hlY2tlb2YsIGJvb2wgb19kaXJlY3QsCiAJCQl1bnNpZ25lZCBsb25nIGJ1Zl9hbGlnbikKIHsKIAlzdHJ1Y3QgY2VwaF9mc19jbGllbnQgKmZzYyA9IGNlcGhfaW5vZGVfdG9fY2xpZW50KGlub2RlKTsKIAlzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSA9IGNlcGhfaW5vZGUoaW5vZGUpOwogCXU2NCBwb3MsIHRoaXNfbGVuOwogCWludCBpb19hbGlnbiwgcGFnZV9hbGlnbjsKLQlpbnQgcGFnZV9vZmYgPSBvZmYgJiB+UEFHRV9DQUNIRV9NQVNLOyAvKiBmaXJzdCBieXRlJ3Mgb2Zmc2V0IGluIHBhZ2UgKi8KIAlpbnQgbGVmdCwgcGFnZXNfbGVmdDsKIAlpbnQgcmVhZDsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VfcG9zOwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJaW9fYWxpZ24gPSBvZmYgJiB+UEFHRV9NQVNLOwogCiBtb3JlOgotCWlmIChhbGlnbl90b19wYWdlcykKKwlpZiAob19kaXJlY3QpCiAJCXBhZ2VfYWxpZ24gPSAocG9zIC0gaW9fYWxpZ24gKyBidWZfYWxpZ24pICYgflBBR0VfTUFTSzsKIAllbHNlCiAJCXBhZ2VfYWxpZ24gPSBwb3MgJiB+UEFHRV9NQVNLOwpAQCAtMzE3LDIwICszMTcsMTkgQEAKIAkJCQkgIGNpLT5pX3RydW5jYXRlX3NlcSwKIAkJCQkgIGNpLT5pX3RydW5jYXRlX3NpemUsCiAJCQkJICBwYWdlX3BvcywgcGFnZXNfbGVmdCwgcGFnZV9hbGlnbik7Ci0JaGl0X3N0cmlwZSA9IHRoaXNfbGVuIDwgbGVmdDsKLQl3YXNfc2hvcnQgPSByZXQgPj0gMCAmJiByZXQgPCB0aGlzX2xlbjsKIAlpZiAocmV0ID09IC1FTk9FTlQpCiAJCXJldCA9IDA7CisJaGl0X3N0cmlwZSA9IHRoaXNfbGVuIDwgbGVmdDsKKwl3YXNfc2hvcnQgPSByZXQgPj0gMCAmJiByZXQgPCB0aGlzX2xlbjsKIAlkb3V0KCJzdHJpcGVkX3JlYWQgJWxsdX4ldSAocmVhZCAldSkgZ290ICVkJXMlc1xuIiwgcG9zLCBsZWZ0LCByZWFkLAogCSAgICAgcmV0LCBoaXRfc3RyaXBlID8gIiBISVRTVFJJUEUiIDogIiIsIHdhc19zaG9ydCA/ICIgU0hPUlQiIDogIiIpOwogCiAJaWYgKHJldCA+IDApIHsKLQkJaW50IGRpZHBhZ2VzID0KLQkJCSgocG9zICYgflBBR0VfQ0FDSEVfTUFTSykgKyByZXQpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWludCBkaWRwYWdlcyA9IChwYWdlX2FsaWduICsgcmV0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCiAJCWlmIChyZWFkIDwgcG9zIC0gb2ZmKSB7CiAJCQlkb3V0KCIgemVybyBnYXAgJWxsdSB0byAlbGx1XG4iLCBvZmYgKyByZWFkLCBwb3MpOwotCQkJY2VwaF96ZXJvX3BhZ2VfdmVjdG9yX3JhbmdlKHBhZ2Vfb2ZmICsgcmVhZCwKKwkJCWNlcGhfemVyb19wYWdlX3ZlY3Rvcl9yYW5nZShwYWdlX2FsaWduICsgcmVhZCwKIAkJCQkJCSAgICBwb3MgLSBvZmYgLSByZWFkLCBwYWdlcyk7CiAJCX0KIAkJcG9zICs9IHJldDsKQEAgLTM0NSwyMCArMzQ0LDIyIEBACiAJfQogCiAJaWYgKHdhc19zaG9ydCkgewotCQkvKiB3YXMgb3JpZ2luYWwgZXh0ZW50IGZ1bGx5IGluc2lkZSBpX3NpemU/ICovCi0JCWlmIChwb3MgKyBsZWZ0IDw9IGlub2RlLT5pX3NpemUpIHsKLQkJCWRvdXQoInplcm8gdGFpbFxuIik7Ci0JCQljZXBoX3plcm9fcGFnZV92ZWN0b3JfcmFuZ2UocGFnZV9vZmYgKyByZWFkLCBsZW4gLSByZWFkLAotCQkJCQkJICAgIHBhZ2VzKTsKLQkJCXJlYWQgPSBsZW47Ci0JCQlnb3RvIG91dDsKLQkJfQorCQkvKiBkaWQgd2UgYm91bmNlIG9mZiBlb2Y/ICovCisJCWlmIChwb3MgKyBsZWZ0ID4gaW5vZGUtPmlfc2l6ZSkKKwkJCSpjaGVja2VvZiA9IDE7CiAKLQkJLyogY2hlY2sgaV9zaXplICovCi0JCSpjaGVja2VvZiA9IDE7CisJCS8qIHplcm8gdHJhaWxpbmcgYnl0ZXMgKGluc2lkZSBpX3NpemUpICovCisJCWlmIChsZWZ0ID4gMCAmJiBwb3MgPCBpbm9kZS0+aV9zaXplKSB7CisJCQlpZiAocG9zICsgbGVmdCA+IGlub2RlLT5pX3NpemUpCisJCQkJbGVmdCA9IGlub2RlLT5pX3NpemUgLSBwb3M7CisKKwkJCWRvdXQoInplcm8gdGFpbCAlZFxuIiwgbGVmdCk7CisJCQljZXBoX3plcm9fcGFnZV92ZWN0b3JfcmFuZ2UocGFnZV9hbGlnbiArIHJlYWQsIGxlZnQsCisJCQkJCQkgICAgcGFnZXMpOworCQkJcmVhZCArPSBsZWZ0OworCQl9CiAJfQogCi1vdXQ6CiAJaWYgKHJldCA+PSAwKQogCQlyZXQgPSByZWFkOwogCWRvdXQoInN0cmlwZWRfcmVhZCByZXR1cm5zICVkXG4iLCByZXQpOwpAQCAtNDc1LDkgKzQ3Niw2IEBACiAJZWxzZQogCQlwb3MgPSAqb2Zmc2V0OwogCi0JaW9fYWxpZ24gPSBwb3MgJiB+UEFHRV9NQVNLOwotCWJ1Zl9hbGlnbiA9ICh1bnNpZ25lZCBsb25nKWRhdGEgJiB+UEFHRV9NQVNLOwotCiAJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBwb3MsIHBvcyArIGxlZnQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNTAxLDYgKzQ5OSw4IEBACiAJICogYm91bmRhcnkuICB0aGlzIGlzbid0IGF0b21pYywgdW5mb3J0dW5hdGVseS4gIDooCiAJICovCiBtb3JlOgorCWlvX2FsaWduID0gcG9zICYgflBBR0VfTUFTSzsKKwlidWZfYWxpZ24gPSAodW5zaWduZWQgbG9uZylkYXRhICYgflBBR0VfTUFTSzsKIAlsZW4gPSBsZWZ0OwogCWlmIChmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpIHsKIAkJLyogd3JpdGUgZnJvbSBiZWdpbm5pbmcgb2YgZmlyc3QgcGFnZSwgcmVnYXJkbGVzcyBvZgpAQCAtNTkwLDYgKzU5MCw3IEBACiAJCXBvcyArPSBsZW47CiAJCXdyaXR0ZW4gKz0gbGVuOwogCQlsZWZ0IC09IGxlbjsKKwkJZGF0YSArPSB3cml0dGVuOwogCQlpZiAobGVmdCkKIAkJCWdvdG8gbW9yZTsKIApAQCAtNjU4LDcgKzY1OSw3IEBACiAKIAkJLyogaGl0IEVPRiBvciBob2xlPyAqLwogCQlpZiAoc3RhdHJldCA9PSAwICYmICpwcG9zIDwgaW5vZGUtPmlfc2l6ZSkgewotCQkJZG91dCgiYWlvX3JlYWQgc3luY19yZWFkIGhpdCBob2xlLCByZWFkaW5nIG1vcmVcbiIpOworCQkJZG91dCgiYWlvX3JlYWQgc3luY19yZWFkIGhpdCBob2xlLCBwcG9zICVsbGQgPCBzaXplICVsbGQsIHJlYWRpbmcgbW9yZVxuIiwgKnBwb3MsIGlub2RlLT5pX3NpemUpOwogCQkJcmVhZCArPSByZXQ7CiAJCQliYXNlICs9IHJldDsKIAkJCWxlbiAtPSByZXQ7CkBAIC03NjcsMTMgKzc2OCwxNiBAQAogCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCV9fY2VwaF9kb19wZW5kaW5nX3ZtdHJ1bmNhdGUoaW5vZGUpOwotCXN3aXRjaCAob3JpZ2luKSB7Ci0JY2FzZSBTRUVLX0VORDoKKwlpZiAob3JpZ2luICE9IFNFRUtfQ1VSIHx8IG9yaWdpbiAhPSBTRUVLX1NFVCkgewogCQlyZXQgPSBjZXBoX2RvX2dldGF0dHIoaW5vZGUsIENFUEhfU1RBVF9DQVBfU0laRSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlvZmZzZXQgPSByZXQ7CiAJCQlnb3RvIG91dDsKIAkJfQorCX0KKworCXN3aXRjaCAob3JpZ2luKSB7CisJY2FzZSBTRUVLX0VORDoKIAkJb2Zmc2V0ICs9IGlub2RlLT5pX3NpemU7CiAJCWJyZWFrOwogCWNhc2UgU0VFS19DVVI6CkBAIC03ODksNiArNzkzLDE5IEBACiAJCX0KIAkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOwogCQlicmVhazsKKwljYXNlIFNFRUtfREFUQToKKwkJaWYgKG9mZnNldCA+PSBpbm9kZS0+aV9zaXplKSB7CisJCQlyZXQgPSAtRU5YSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNFRUtfSE9MRToKKwkJaWYgKG9mZnNldCA+PSBpbm9kZS0+aV9zaXplKSB7CisJCQlyZXQgPSAtRU5YSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQlvZmZzZXQgPSBpbm9kZS0+aV9zaXplOworCQlicmVhazsKIAl9CiAKIAlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykgewpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9pbm9kZS5jIGIvZnMvY2VwaC9pbm9kZS5jCmluZGV4IDcwYjZhNDguLmRmYjI4MzEgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvaW5vZGUuYworKysgYi9mcy9jZXBoL2lub2RlLmMKQEAgLTExMDEsMTAgKzExMDEsMTAgQEAKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CiAJCQlyZXEtPnJfZGVudHJ5ID0gZG47ICAvKiBtYXkgaGF2ZSBzcGxpY2VkICovCi0JCQlpZ3JhYihpbik7CisJCQlpaG9sZChpbik7CiAJCX0gZWxzZSBpZiAoY2VwaF9pbm8oaW4pID09IHZpbm8uaW5vICYmCiAJCQkgICBjZXBoX3NuYXAoaW4pID09IHZpbm8uc25hcCkgewotCQkJaWdyYWIoaW4pOworCQkJaWhvbGQoaW4pOwogCQl9IGVsc2UgewogCQkJZG91dCgiICVwIGxpbmtzIHRvICVwICVsbHguJWxseCwgbm90ICVsbHguJWxseFxuIiwKIAkJCSAgICAgZG4sIGluLCBjZXBoX2lubyhpbiksIGNlcGhfc25hcChpbiksCkBAIC0xMTQ0LDcgKzExNDQsNyBAQAogCQkJZ290byBkb25lOwogCQl9CiAJCXJlcS0+cl9kZW50cnkgPSBkbjsgIC8qIG1heSBoYXZlIHNwbGljZWQgKi8KLQkJaWdyYWIoaW4pOworCQlpaG9sZChpbik7CiAJCXJpbmZvLT5oZWFkLT5pc19kZW50cnkgPSAxOyAgLyogZm9vbCBub3RyYWNlIGhhbmRsZXJzICovCiAJfQogCkBAIC0xMzI4LDcgKzEzMjgsNyBAQAogCWlmIChxdWV1ZV93b3JrKGNlcGhfaW5vZGVfdG9fY2xpZW50KGlub2RlKS0+d2Jfd3EsCiAJCSAgICAgICAmY2VwaF9pbm9kZShpbm9kZSktPmlfd2Jfd29yaykpIHsKIAkJZG91dCgiY2VwaF9xdWV1ZV93cml0ZWJhY2sgJXBcbiIsIGlub2RlKTsKLQkJaWdyYWIoaW5vZGUpOworCQlpaG9sZChpbm9kZSk7CiAJfSBlbHNlIHsKIAkJZG91dCgiY2VwaF9xdWV1ZV93cml0ZWJhY2sgJXAgZmFpbGVkXG4iLCBpbm9kZSk7CiAJfQpAQCAtMTM1Myw3ICsxMzUzLDcgQEAKIAlpZiAocXVldWVfd29yayhjZXBoX2lub2RlX3RvX2NsaWVudChpbm9kZSktPnBnX2ludl93cSwKIAkJICAgICAgICZjZXBoX2lub2RlKGlub2RlKS0+aV9wZ19pbnZfd29yaykpIHsKIAkJZG91dCgiY2VwaF9xdWV1ZV9pbnZhbGlkYXRlICVwXG4iLCBpbm9kZSk7Ci0JCWlncmFiKGlub2RlKTsKKwkJaWhvbGQoaW5vZGUpOwogCX0gZWxzZSB7CiAJCWRvdXQoImNlcGhfcXVldWVfaW52YWxpZGF0ZSAlcCBmYWlsZWRcbiIsIGlub2RlKTsKIAl9CkBAIC0xNDc3LDcgKzE0NzcsNyBAQAogCWlmIChxdWV1ZV93b3JrKGNlcGhfc2JfdG9fY2xpZW50KGlub2RlLT5pX3NiKS0+dHJ1bmNfd3EsCiAJCSAgICAgICAmY2ktPmlfdm10cnVuY2F0ZV93b3JrKSkgewogCQlkb3V0KCJjZXBoX3F1ZXVlX3ZtdHJ1bmNhdGUgJXBcbiIsIGlub2RlKTsKLQkJaWdyYWIoaW5vZGUpOworCQlpaG9sZChpbm9kZSk7CiAJfSBlbHNlIHsKIAkJZG91dCgiY2VwaF9xdWV1ZV92bXRydW5jYXRlICVwIGZhaWxlZCwgcGVuZGluZz0lZFxuIiwKIAkJICAgICBpbm9kZSwgY2ktPmlfdHJ1bmNhdGVfcGVuZGluZyk7CkBAIC0xNzM4LDcgKzE3MzgsOCBAQAogCQlfX21hcmtfaW5vZGVfZGlydHkoaW5vZGUsIGlub2RlX2RpcnR5X2ZsYWdzKTsKIAogCWlmIChtYXNrKSB7Ci0JCXJlcS0+cl9pbm9kZSA9IGlncmFiKGlub2RlKTsKKwkJcmVxLT5yX2lub2RlID0gaW5vZGU7CisJCWlob2xkKGlub2RlKTsKIAkJcmVxLT5yX2lub2RlX2Ryb3AgPSByZWxlYXNlOwogCQlyZXEtPnJfYXJncy5zZXRhdHRyLm1hc2sgPSBjcHVfdG9fbGUzMihtYXNrKTsKIAkJcmVxLT5yX251bV9jYXBzID0gMTsKQEAgLTE3NzksNyArMTc4MCw4IEBACiAJcmVxID0gY2VwaF9tZHNjX2NyZWF0ZV9yZXF1ZXN0KG1kc2MsIENFUEhfTURTX09QX0dFVEFUVFIsIFVTRV9BTllfTURTKTsKIAlpZiAoSVNfRVJSKHJlcSkpCiAJCXJldHVybiBQVFJfRVJSKHJlcSk7Ci0JcmVxLT5yX2lub2RlID0gaWdyYWIoaW5vZGUpOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCWlob2xkKGlub2RlKTsKIAlyZXEtPnJfbnVtX2NhcHMgPSAxOwogCXJlcS0+cl9hcmdzLmdldGF0dHIubWFzayA9IGNwdV90b19sZTMyKG1hc2spOwogCWVyciA9IGNlcGhfbWRzY19kb19yZXF1ZXN0KG1kc2MsIE5VTEwsIHJlcSk7CkBAIC0xNzkzLDE3ICsxNzk1LDE3IEBACiAgKiBDaGVjayBpbm9kZSBwZXJtaXNzaW9ucy4gIFdlIHZlcmlmeSB3ZSBoYXZlIGEgdmFsaWQgdmFsdWUgZm9yCiAgKiB0aGUgQVVUSCBjYXAsIHRoZW4gY2FsbCB0aGUgZ2VuZXJpYyBoYW5kbGVyLgogICovCi1pbnQgY2VwaF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitpbnQgY2VwaF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCWludCBlcnI7CiAKLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKKwlpZiAobWFzayAmIE1BWV9OT1RfQkxPQ0spCiAJCXJldHVybiAtRUNISUxEOwogCiAJZXJyID0gY2VwaF9kb19nZXRhdHRyKGlub2RlLCBDRVBIX0NBUF9BVVRIX1NIQVJFRCk7CiAKIAlpZiAoIWVycikKLQkJZXJyID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBmbGFncywgTlVMTCk7CisJCWVyciA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzayk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvY2VwaC9pb2N0bC5jIGIvZnMvY2VwaC9pb2N0bC5jCmluZGV4IDg4ODhjOWJhLi5lZjBiNWY0IDEwMDY0NAotLS0gYS9mcy9jZXBoL2lvY3RsLmMKKysrIGIvZnMvY2VwaC9pb2N0bC5jCkBAIC03Myw3ICs3Myw4IEBACiAJCQkJICAgICAgIFVTRV9BVVRIX01EUyk7CiAJaWYgKElTX0VSUihyZXEpKQogCQlyZXR1cm4gUFRSX0VSUihyZXEpOwotCXJlcS0+cl9pbm9kZSA9IGlncmFiKGlub2RlKTsKKwlyZXEtPnJfaW5vZGUgPSBpbm9kZTsKKwlpaG9sZChpbm9kZSk7CiAJcmVxLT5yX2lub2RlX2Ryb3AgPSBDRVBIX0NBUF9GSUxFX1NIQVJFRCB8IENFUEhfQ0FQX0ZJTEVfRVhDTDsKIAogCXJlcS0+cl9hcmdzLnNldGxheW91dC5sYXlvdXQuZmxfc3RyaXBlX3VuaXQgPQpAQCAtMTM1LDcgKzEzNiw4IEBACiAKIAlpZiAoSVNfRVJSKHJlcSkpCiAJCXJldHVybiBQVFJfRVJSKHJlcSk7Ci0JcmVxLT5yX2lub2RlID0gaWdyYWIoaW5vZGUpOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCWlob2xkKGlub2RlKTsKIAogCXJlcS0+cl9hcmdzLnNldGxheW91dC5sYXlvdXQuZmxfc3RyaXBlX3VuaXQgPQogCQkJY3B1X3RvX2xlMzIobC5zdHJpcGVfdW5pdCk7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2xvY2tzLmMgYi9mcy9jZXBoL2xvY2tzLmMKaW5kZXggNDc2YjMyOS4uODA1NzZkMCAxMDA2NDQKLS0tIGEvZnMvY2VwaC9sb2Nrcy5jCisrKyBiL2ZzL2NlcGgvbG9ja3MuYwpAQCAtMjMsNyArMjMsOCBAQAogCXJlcSA9IGNlcGhfbWRzY19jcmVhdGVfcmVxdWVzdChtZHNjLCBvcGVyYXRpb24sIFVTRV9BVVRIX01EUyk7CiAJaWYgKElTX0VSUihyZXEpKQogCQlyZXR1cm4gUFRSX0VSUihyZXEpOwotCXJlcS0+cl9pbm9kZSA9IGlncmFiKGlub2RlKTsKKwlyZXEtPnJfaW5vZGUgPSBpbm9kZTsKKwlpaG9sZChpbm9kZSk7CiAKIAkvKiBtZHMgcmVxdWlyZXMgc3RhcnQgYW5kIGxlbmd0aCByYXRoZXIgdGhhbiBzdGFydCBhbmQgZW5kICovCiAJaWYgKExMT05HX01BWCA9PSBmbC0+ZmxfZW5kKQpAQCAtMzIsMTEgKzMzLDEwIEBACiAJCWxlbmd0aCA9IGZsLT5mbF9lbmQgLSBmbC0+Zmxfc3RhcnQgKyAxOwogCiAJZG91dCgiY2VwaF9sb2NrX21lc3NhZ2U6IHJ1bGU6ICVkLCBvcDogJWQsIHBpZDogJWxsdSwgc3RhcnQ6ICVsbHUsICIKLQkgICAgICJsZW5ndGg6ICVsbHUsIHdhaXQ6ICVkLCB0eXBlYDogJWQiLCAoaW50KWxvY2tfdHlwZSwKKwkgICAgICJsZW5ndGg6ICVsbHUsIHdhaXQ6ICVkLCB0eXBlOiAlZCIsIChpbnQpbG9ja190eXBlLAogCSAgICAgKGludClvcGVyYXRpb24sICh1NjQpZmwtPmZsX3BpZCwgZmwtPmZsX3N0YXJ0LAogCSAgICAgbGVuZ3RoLCB3YWl0LCBmbC0+ZmxfdHlwZSk7CiAKLQogCXJlcS0+cl9hcmdzLmZpbGVsb2NrX2NoYW5nZS5ydWxlID0gbG9ja190eXBlOwogCXJlcS0+cl9hcmdzLmZpbGVsb2NrX2NoYW5nZS50eXBlID0gY21kOwogCXJlcS0+cl9hcmdzLmZpbGVsb2NrX2NoYW5nZS5waWQgPSBjcHVfdG9fbGU2NCgodTY0KWZsLT5mbF9waWQpOwpAQCAtNzAsNyArNzAsNyBAQAogCX0KIAljZXBoX21kc2NfcHV0X3JlcXVlc3QocmVxKTsKIAlkb3V0KCJjZXBoX2xvY2tfbWVzc2FnZTogcnVsZTogJWQsIG9wOiAlZCwgcGlkOiAlbGx1LCBzdGFydDogJWxsdSwgIgotCSAgICAgImxlbmd0aDogJWxsdSwgd2FpdDogJWQsIHR5cGVgOiAlZCwgZXJyIGNvZGUgJWQiLCAoaW50KWxvY2tfdHlwZSwKKwkgICAgICJsZW5ndGg6ICVsbHUsIHdhaXQ6ICVkLCB0eXBlOiAlZCwgZXJyIGNvZGUgJWQiLCAoaW50KWxvY2tfdHlwZSwKIAkgICAgIChpbnQpb3BlcmF0aW9uLCAodTY0KWZsLT5mbF9waWQsIGZsLT5mbF9zdGFydCwKIAkgICAgIGxlbmd0aCwgd2FpdCwgZmwtPmZsX3R5cGUsIGVycik7CiAJcmV0dXJuIGVycjsKQEAgLTEwOSwxNiArMTA5LDIwIEBACiAJCQlkb3V0KCJtZHMgbG9ja2VkLCBsb2NraW5nIGxvY2FsbHkiKTsKIAkJCWVyciA9IHBvc2l4X2xvY2tfZmlsZShmaWxlLCBmbCwgTlVMTCk7CiAJCQlpZiAoZXJyICYmIChDRVBIX01EU19PUF9TRVRGSUxFTE9DSyA9PSBvcCkpIHsKLQkJCQkvKiB1bmRvISBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGUga2VybmVsIGRldGVjdHMKLQkJCQkgKiBsb2NhbCBkZWFkbG9jay4gKi8KKwkJCQkvKiB1bmRvISBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZgorCQkJCSAqIHRoZSBrZXJuZWwgZGV0ZWN0cyBsb2NhbAorCQkJCSAqIGRlYWRsb2NrLiAqLwogCQkJCWNlcGhfbG9ja19tZXNzYWdlKENFUEhfTE9DS19GQ05UTCwgb3AsIGZpbGUsCiAJCQkJCQkgIENFUEhfTE9DS19VTkxPQ0ssIDAsIGZsKTsKLQkJCQlkb3V0KCJnb3QgJWQgb24gcG9zaXhfbG9ja19maWxlLCB1bmRpZCBsb2NrIiwgZXJyKTsKKwkJCQlkb3V0KCJnb3QgJWQgb24gcG9zaXhfbG9ja19maWxlLCB1bmRpZCBsb2NrIiwKKwkJCQkgICAgIGVycik7CiAJCQl9CiAJCX0KIAotCX0gZWxzZSB7Ci0JCWRvdXQoIm1kcyByZXR1cm5lZCBlcnJvciBjb2RlICVkIiwgZXJyKTsKKwl9IGVsc2UgaWYgKGVyciA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJZG91dCgidW5kb2luZyBsb2NrXG4iKTsKKwkJY2VwaF9sb2NrX21lc3NhZ2UoQ0VQSF9MT0NLX0ZDTlRMLCBvcCwgZmlsZSwKKwkJCQkgIENFUEhfTE9DS19VTkxPQ0ssIDAsIGZsKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE1NSw4ICsxNTksMTEgQEAKIAkJCQkJICBmaWxlLCBDRVBIX0xPQ0tfVU5MT0NLLCAwLCBmbCk7CiAJCQlkb3V0KCJnb3QgJWQgb24gZmxvY2tfbG9ja19maWxlX3dhaXQsIHVuZGlkIGxvY2siLCBlcnIpOwogCQl9Ci0JfSBlbHNlIHsKLQkJZG91dCgibWRzIGVycm9yIGNvZGUgJWQiLCBlcnIpOworCX0gZWxzZSBpZiAoZXJyID09IC1FUkVTVEFSVFNZUykgeworCQlkb3V0KCJ1bmRvaW5nIGxvY2tcbiIpOworCQljZXBoX2xvY2tfbWVzc2FnZShDRVBIX0xPQ0tfRkxPQ0ssCisJCQkJICBDRVBIX01EU19PUF9TRVRGSUxFTE9DSywKKwkJCQkgIGZpbGUsIENFUEhfTE9DS19VTkxPQ0ssIDAsIGZsKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2NlcGgvbWRzX2NsaWVudC5jIGIvZnMvY2VwaC9tZHNfY2xpZW50LmMKaW5kZXggNzk3NDNkMS4uMGMxZDkxNyAxMDA2NDQKLS0tIGEvZnMvY2VwaC9tZHNfY2xpZW50LmMKKysrIGIvZnMvY2VwaC9tZHNfY2xpZW50LmMKQEAgLTE0MzgsMTIgKzE0MzgsMTUgQEAKIAlzdHJ1Y3QgZGVudHJ5ICp0ZW1wOwogCWNoYXIgKnBhdGg7CiAJaW50IGxlbiwgcG9zOworCXVuc2lnbmVkIHNlcTsKIAogCWlmIChkZW50cnkgPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIHJldHJ5OgogCWxlbiA9IDA7CisJc2VxID0gcmVhZF9zZXFiZWdpbigmcmVuYW1lX2xvY2spOworCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKHRlbXAgPSBkZW50cnk7ICFJU19ST09UKHRlbXApOykgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdGVtcC0+ZF9pbm9kZTsKIAkJaWYgKGlub2RlICYmIGNlcGhfc25hcChpbm9kZSkgPT0gQ0VQSF9TTkFQRElSKQpAQCAtMTQ1NSwxMCArMTQ1OCwxMiBAQAogCQkJbGVuICs9IDEgKyB0ZW1wLT5kX25hbWUubGVuOwogCQl0ZW1wID0gdGVtcC0+ZF9wYXJlbnQ7CiAJCWlmICh0ZW1wID09IE5VTEwpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcHJfZXJyKCJidWlsZF9wYXRoIGNvcnJ1cHQgZGVudHJ5ICVwXG4iLCBkZW50cnkpOwogCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJCX0KIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJaWYgKGxlbikKIAkJbGVuLS07ICAvKiBubyBsZWFkaW5nICcvJyAqLwogCkBAIC0xNDY3LDkgKzE0NzIsMTIgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJcG9zID0gbGVuOwogCXBhdGhbcG9zXSA9IDA7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yICh0ZW1wID0gZGVudHJ5OyAhSVNfUk9PVCh0ZW1wKSAmJiBwb3MgIT0gMDsgKSB7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB0ZW1wLT5kX2lub2RlOworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCisJCXNwaW5fbG9jaygmdGVtcC0+ZF9sb2NrKTsKKwkJaW5vZGUgPSB0ZW1wLT5kX2lub2RlOwogCQlpZiAoaW5vZGUgJiYgY2VwaF9zbmFwKGlub2RlKSA9PSBDRVBIX1NOQVBESVIpIHsKIAkJCWRvdXQoImJ1aWxkX3BhdGggcGF0aCslZDogJXAgU05BUERJUlxuIiwKIAkJCSAgICAgcG9zLCB0ZW1wKTsKQEAgLTE0NzgsMjEgKzE0ODYsMjYgQEAKIAkJCWJyZWFrOwogCQl9IGVsc2UgewogCQkJcG9zIC09IHRlbXAtPmRfbmFtZS5sZW47Ci0JCQlpZiAocG9zIDwgMCkKKwkJCWlmIChwb3MgPCAwKSB7CisJCQkJc3Bpbl91bmxvY2soJnRlbXAtPmRfbG9jayk7CiAJCQkJYnJlYWs7CisJCQl9CiAJCQlzdHJuY3B5KHBhdGggKyBwb3MsIHRlbXAtPmRfbmFtZS5uYW1lLAogCQkJCXRlbXAtPmRfbmFtZS5sZW4pOwogCQl9CisJCXNwaW5fdW5sb2NrKCZ0ZW1wLT5kX2xvY2spOwogCQlpZiAocG9zKQogCQkJcGF0aFstLXBvc10gPSAnLyc7CiAJCXRlbXAgPSB0ZW1wLT5kX3BhcmVudDsKIAkJaWYgKHRlbXAgPT0gTlVMTCkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlwcl9lcnIoImJ1aWxkX3BhdGggY29ycnVwdCBkZW50cnlcbiIpOwogCQkJa2ZyZWUocGF0aCk7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkJfQogCX0KLQlpZiAocG9zICE9IDApIHsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAocG9zICE9IDAgfHwgcmVhZF9zZXFyZXRyeSgmcmVuYW1lX2xvY2ssIHNlcSkpIHsKIAkJcHJfZXJyKCJidWlsZF9wYXRoIGRpZCBub3QgZW5kIHBhdGggbG9va3VwIHdoZXJlICIKIAkJICAgICAgICJleHBlY3RlZCwgbmFtZWxlbiBpcyAlZCwgcG9zIGlzICVkXG4iLCBsZW4sIHBvcyk7CiAJCS8qIHByZXN1bWFibHkgdGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHJhY2luZyB3aXRoIGEKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvc25hcC5jIGIvZnMvY2VwaC9zbmFwLmMKaW5kZXggMjQwNjdkNi4uNTRiMTRkZSAxMDA2NDQKLS0tIGEvZnMvY2VwaC9zbmFwLmMKKysrIGIvZnMvY2VwaC9zbmFwLmMKQEAgLTcyMiw3ICs3MjIsNyBAQAogCQljaSA9IGxpc3RfZmlyc3RfZW50cnkoJm1kc2MtPnNuYXBfZmx1c2hfbGlzdCwKIAkJCQlzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvLCBpX3NuYXBfZmx1c2hfaXRlbSk7CiAJCWlub2RlID0gJmNpLT52ZnNfaW5vZGU7Ci0JCWlncmFiKGlub2RlKTsKKwkJaWhvbGQoaW5vZGUpOwogCQlzcGluX3VubG9jaygmbWRzYy0+c25hcF9mbHVzaF9sb2NrKTsKIAkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAkJX19jZXBoX2ZsdXNoX3NuYXBzKGNpLCAmc2Vzc2lvbiwgMCk7CmRpZmYgLS1naXQgYS9mcy9jZXBoL3N1cGVyLmggYi9mcy9jZXBoL3N1cGVyLmgKaW5kZXggZjVjYWJlZi4uMzA0NDZiMSAxMDA2NDQKLS0tIGEvZnMvY2VwaC9zdXBlci5oCisrKyBiL2ZzL2NlcGgvc3VwZXIuaApAQCAtNjkyLDcgKzY5Miw3IEBACiBleHRlcm4gdm9pZCBjZXBoX3F1ZXVlX3dyaXRlYmFjayhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAogZXh0ZXJuIGludCBjZXBoX2RvX2dldGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOwotZXh0ZXJuIGludCBjZXBoX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncyk7CitleHRlcm4gaW50IGNlcGhfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiBleHRlcm4gaW50IGNlcGhfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CiBleHRlcm4gaW50IGNlcGhfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJc3RydWN0IGtzdGF0ICpzdGF0KTsKQEAgLTcyOCw3ICs3MjgsOCBAQAogCiBleHRlcm4gdm9pZCBjZXBoX3F1ZXVlX2NhcHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGV4dGVybiBpbnQgY2VwaF93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7Ci1leHRlcm4gaW50IGNlcGhfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYyk7CitleHRlcm4gaW50IGNlcGhfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwKKwkJICAgICAgaW50IGRhdGFzeW5jKTsKIGV4dGVybiB2b2lkIGNlcGhfa2lja19mbHVzaGluZ19jYXBzKHN0cnVjdCBjZXBoX21kc19jbGllbnQgKm1kc2MsCiAJCQkJICAgIHN0cnVjdCBjZXBoX21kc19zZXNzaW9uICpzZXNzaW9uKTsKIGV4dGVybiBzdHJ1Y3QgY2VwaF9jYXAgKmNlcGhfZ2V0X2NhcF9mb3JfbWRzKHN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpLApkaWZmIC0tZ2l0IGEvZnMvY2VwaC94YXR0ci5jIGIvZnMvY2VwaC94YXR0ci5jCmluZGV4IGYyYjYyODYuLmY0MmQ3MzAgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgveGF0dHIuYworKysgYi9mcy9jZXBoL3hhdHRyLmMKQEAgLTY2NSw3ICs2NjUsOCBAQAogCQllcnIgPSBQVFJfRVJSKHJlcSk7CiAJCWdvdG8gb3V0OwogCX0KLQlyZXEtPnJfaW5vZGUgPSBpZ3JhYihpbm9kZSk7CisJcmVxLT5yX2lub2RlID0gaW5vZGU7CisJaWhvbGQoaW5vZGUpOwogCXJlcS0+cl9pbm9kZV9kcm9wID0gQ0VQSF9DQVBfWEFUVFJfU0hBUkVEOwogCXJlcS0+cl9udW1fY2FwcyA9IDE7CiAJcmVxLT5yX2FyZ3Muc2V0eGF0dHIuZmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7CkBAIC03OTUsNyArNzk2LDggQEAKIAkJCQkgICAgICAgVVNFX0FVVEhfTURTKTsKIAlpZiAoSVNfRVJSKHJlcSkpCiAJCXJldHVybiBQVFJfRVJSKHJlcSk7Ci0JcmVxLT5yX2lub2RlID0gaWdyYWIoaW5vZGUpOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCWlob2xkKGlub2RlKTsKIAlyZXEtPnJfaW5vZGVfZHJvcCA9IENFUEhfQ0FQX1hBVFRSX1NIQVJFRDsKIAlyZXEtPnJfbnVtX2NhcHMgPSAxOwogCXJlcS0+cl9wYXRoMiA9IGtzdHJkdXAobmFtZSwgR0ZQX05PRlMpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9LY29uZmlnIGIvZnMvY2lmcy9LY29uZmlnCmluZGV4IDFjZDRjM2EuLmY2NmNjMTYgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvS2NvbmZpZworKysgYi9mcy9jaWZzL0tjb25maWcKQEAgLTcsNiArNyw3IEBACiAJc2VsZWN0IENSWVBUT19NRDUKIAlzZWxlY3QgQ1JZUFRPX0hNQUMKIAlzZWxlY3QgQ1JZUFRPX0FSQzQKKwlzZWxlY3QgQ1JZUFRPX0VDQgogCXNlbGVjdCBDUllQVE9fREVTCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgY2xpZW50IFZGUyBtb2R1bGUgZm9yIHRoZSBDb21tb24gSW50ZXJuZXQgRmlsZSBTeXN0ZW0KQEAgLTE0OCwxMyArMTQ5LDEzIEBACiAKIGNvbmZpZyBDSUZTX0FDTAogCSAgYm9vbCAiUHJvdmlkZSBDSUZTIEFDTCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCSAgZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgQ0lGU19YQVRUUgorCSAgZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgQ0lGU19YQVRUUiAmJiBLRVlTCiAJICBoZWxwCiAJICAgIEFsbG93cyB0byBmZXRjaCBDSUZTL05URlMgQUNMIGZyb20gdGhlIHNlcnZlci4gIFRoZSBEQUNMIGJsb2IKIAkgICAgaXMgaGFuZGVkIG92ZXIgdG8gdGhlIGFwcGxpY2F0aW9uL2NhbGxlci4KIAogY29uZmlnIENJRlNfTkZTRF9FWFBPUlQKIAkgIGJvb2wgIkFsbG93IG5mc2QgdG8gZXhwb3J0IENJRlMgZmlsZSBzeXN0ZW0gKEVYUEVSSU1FTlRBTCkiCi0JICBkZXBlbmRzIG9uIENJRlMgJiYgRVhQRVJJTUVOVEFMCisJICBkZXBlbmRzIG9uIENJRlMgJiYgRVhQRVJJTUVOVEFMICYmIEJST0tFTgogCSAgaGVscAogCSAgIEFsbG93cyBORlMgc2VydmVyIHRvIGV4cG9ydCBhIENJRlMgbW91bnRlZCBzaGFyZSAobmZzZCBvdmVyIGNpZnMpCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NhY2hlLmMgYi9mcy9jaWZzL2NhY2hlLmMKaW5kZXggZGQ4NTg0ZC4uNTQ1NTA5YyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jYWNoZS5jCisrKyBiL2ZzL2NpZnMvY2FjaGUuYwpAQCAtOTIsNyArOTIsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWNFUlJPUigxLCAiQ0lGUzogVW5rbm93biBuZXR3b3JrIGZhbWlseSAnJWQnIiwgc2EtPnNhX2ZhbWlseSk7CisJCWNFUlJPUigxLCAiVW5rbm93biBuZXR3b3JrIGZhbWlseSAnJWQnIiwgc2EtPnNhX2ZhbWlseSk7CiAJCWtleV9sZW4gPSAwOwogCQlicmVhazsKIAl9CkBAIC0xNTIsNyArMTUyLDcgQEAKIAogCXNoYXJlbmFtZSA9IGV4dHJhY3Rfc2hhcmVuYW1lKHRjb24tPnRyZWVOYW1lKTsKIAlpZiAoSVNfRVJSKHNoYXJlbmFtZSkpIHsKLQkJY0ZZSSgxLCAiQ0lGUzogY291bGRuJ3QgZXh0cmFjdCBzaGFyZW5hbWVcbiIpOworCQljRllJKDEsICIlczogY291bGRuJ3QgZXh0cmFjdCBzaGFyZW5hbWVcbiIsIF9fZnVuY19fKTsKIAkJc2hhcmVuYW1lID0gTlVMTDsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMzAyLDcgKzMwMiw3IEBACiAJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKIAlmaXJzdCA9IDA7CiAKLQljRllJKDEsICJjaWZzIGlub2RlIDB4JXAgbm93IHVuY2FjaGVkIiwgY2lmc2kpOworCWNGWUkoMSwgIiVzOiBjaWZzIGlub2RlIDB4JXAgbm93IHVuY2FjaGVkIiwgX19mdW5jX18sIGNpZnNpKTsKIAogCWZvciAoOzspIHsKIAkJbnJfcGFnZXMgPSBwYWdldmVjX2xvb2t1cCgmcHZlYywKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19mc19zYi5oIGIvZnMvY2lmcy9jaWZzX2ZzX3NiLmgKaW5kZXggZmZiMTQ1OS4uNzI2MGUxMSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzX2ZzX3NiLmgKKysrIGIvZnMvY2lmcy9jaWZzX2ZzX3NiLmgKQEAgLTQyLDYgKzQyLDcgQEAKICNkZWZpbmUgQ0lGU19NT1VOVF9NVUxUSVVTRVIJMHgyMDAwMCAvKiBtdWx0aXVzZXIgbW91bnQgKi8KICNkZWZpbmUgQ0lGU19NT1VOVF9TVFJJQ1RfSU8JMHg0MDAwMCAvKiBzdHJpY3QgY2FjaGUgbW9kZSAqLwogI2RlZmluZSBDSUZTX01PVU5UX1JXUElERk9SV0FSRAkweDgwMDAwIC8qIHVzZSBwaWQgZm9yd2FyZGluZyBmb3IgcncgKi8KKyNkZWZpbmUgQ0lGU19NT1VOVF9QT1NJWEFDTAkweDEwMDAwMCAvKiBtaXJyb3Igb2YgTVNfUE9TSVhBQ0wgaW4gbW50X2NpZnNfZmxhZ3MgKi8KIAogc3RydWN0IGNpZnNfc2JfaW5mbyB7CiAJc3RydWN0IHJiX3Jvb3QgdGxpbmtfdHJlZTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwppbmRleCBkZmJkOWYxLi41YTBlZTdmIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAlpZiAoY2lmc19wZHUgPT0gTlVMTCB8fCBzZXJ2ZXIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY2lmc19wZHUtPkNvbW1hbmQgPT0gU01CX0NPTV9ORUdPVElBVEUpCisJaWYgKCFzZXJ2ZXItPnNlc3Npb25fZXN0YWIpCiAJCXJldHVybiAwOwogCiAJaWYgKGNpZnNfcGR1LT5Db21tYW5kID09IFNNQl9DT01fTE9DS0lOR19BTkRYKSB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNmcy5jIGIvZnMvY2lmcy9jaWZzZnMuYwppbmRleCA5ODk0NDJkLi44NjU1MTc0IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNmcy5jCisrKyBiL2ZzL2NpZnMvY2lmc2ZzLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgImNpZnNmcy5oIgogI2luY2x1ZGUgImNpZnNwZHUuaCIKQEAgLTEwNCw4ICsxMDUsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1jaWZzX3JlYWRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvLAotCQljb25zdCBjaGFyICpkZXZuYW1lLCBpbnQgc2lsZW50KQorY2lmc19yZWFkX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwpAQCAtMTEzLDIyICsxMTMsMTYgQEAKIAogCWNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKIAotCXNwaW5fbG9ja19pbml0KCZjaWZzX3NiLT50bGlua190cmVlX2xvY2spOwotCWNpZnNfc2ItPnRsaW5rX3RyZWUgPSBSQl9ST09UOworCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfUE9TSVhBQ0wpCisJCXNiLT5zX2ZsYWdzIHw9IE1TX1BPU0lYQUNMOwogCi0JcmMgPSBiZGlfc2V0dXBfYW5kX3JlZ2lzdGVyKCZjaWZzX3NiLT5iZGksICJjaWZzIiwgQkRJX0NBUF9NQVBfQ09QWSk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJaWYgKGNpZnNfc2JfbWFzdGVyX3Rjb24oY2lmc19zYiktPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0xBUkdFX0ZJTEVTKQorCQlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7CisJZWxzZQorCQlzYi0+c19tYXhieXRlcyA9IE1BWF9OT05fTEZTOwogCi0JY2lmc19zYi0+YmRpLnJhX3BhZ2VzID0gZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzOwotCi0JcmMgPSBjaWZzX21vdW50KHNiLCBjaWZzX3NiLCB2b2x1bWVfaW5mbywgZGV2bmFtZSk7Ci0KLQlpZiAocmMpIHsKLQkJaWYgKCFzaWxlbnQpCi0JCQljRVJST1IoMSwgImNpZnNfbW91bnQgZmFpbGVkIHcvcmV0dXJuIGNvZGUgPSAlZCIsIHJjKTsKLQkJZ290byBvdXRfbW91bnRfZmFpbGVkOwotCX0KKwkvKiBCQiBGSVhNRSBmaXggdGltZV9ncmFuIHRvIGJlIGxhcmdlciBmb3IgTEFOTUFOIHNlc3Npb25zICovCisJc2ItPnNfdGltZV9ncmFuID0gMTAwOwogCiAJc2ItPnNfbWFnaWMgPSBDSUZTX01BR0lDX05VTUJFUjsKIAlzYi0+c19vcCA9ICZjaWZzX3N1cGVyX29wczsKQEAgLTE3MCwzNyArMTY0LDE0IEBACiAJaWYgKGlub2RlKQogCQlpcHV0KGlub2RlKTsKIAotCWNpZnNfdW1vdW50KHNiLCBjaWZzX3NiKTsKLQotb3V0X21vdW50X2ZhaWxlZDoKLQliZGlfZGVzdHJveSgmY2lmc19zYi0+YmRpKTsKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkCi1jaWZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIHZvaWQgY2lmc19raWxsX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwotCi0JY0ZZSSgxLCAiSW4gY2lmc19wdXRfc3VwZXIiKTsKLQljaWZzX3NiID0gQ0lGU19TQihzYik7Ci0JaWYgKGNpZnNfc2IgPT0gTlVMTCkgewotCQljRllJKDEsICJFbXB0eSBjaWZzIHN1cGVyYmxvY2sgaW5mbyBwYXNzZWQgdG8gdW5tb3VudCIpOwotCQlyZXR1cm47Ci0JfQotCi0JcmMgPSBjaWZzX3Vtb3VudChzYiwgY2lmc19zYik7Ci0JaWYgKHJjKQotCQljRVJST1IoMSwgImNpZnNfdW1vdW50IGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICVkIiwgcmMpOwotCWlmIChjaWZzX3NiLT5tb3VudGRhdGEpIHsKLQkJa2ZyZWUoY2lmc19zYi0+bW91bnRkYXRhKTsKLQkJY2lmc19zYi0+bW91bnRkYXRhID0gTlVMTDsKLQl9Ci0KLQl1bmxvYWRfbmxzKGNpZnNfc2ItPmxvY2FsX25scyk7Ci0JYmRpX2Rlc3Ryb3koJmNpZnNfc2ItPmJkaSk7Ci0Ja2ZyZWUoY2lmc19zYik7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0Ioc2IpOworCWtpbGxfYW5vbl9zdXBlcihzYik7CisJY2lmc191bW91bnQoY2lmc19zYik7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTI1MywxMyArMjI0LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2lmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IGNpZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwogCi0JaWYgKGZsYWdzICYgSVBFUk1fRkxBR19SQ1UpCi0JCXJldHVybiAtRUNISUxEOwotCiAJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOwogCiAJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19QRVJNKSB7CkBAIC0yNzEsNyArMjM5LDcgQEAKIAkJb24gdGhlIGNsaWVudCAoYWJvdmUgYW5kIGJleW9uZCBBQ0wgb24gc2VydmVycykgZm9yCiAJCXNlcnZlcnMgd2hpY2ggZG8gbm90IHN1cHBvcnQgc2V0dGluZyBhbmQgdmlld2luZyBtb2RlIGJpdHMsCiAJCXNvIGFsbG93aW5nIGNsaWVudCB0byBjaGVjayBwZXJtaXNzaW9ucyBpcyB1c2VmdWwgKi8KLQkJcmV0dXJuIGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgZmxhZ3MsIE5VTEwpOworCQlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpjaWZzX2lub2RlX2NhY2hlcDsKQEAgLTM1Miw2ICszMjAsMzcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkCitjaWZzX3Nob3dfc2VjdXJpdHkoc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCit7CisJc2VxX3ByaW50ZihzLCAiLHNlYz0iKTsKKworCXN3aXRjaCAoc2VydmVyLT5zZWNUeXBlKSB7CisJY2FzZSBMQU5NQU46CisJCXNlcV9wcmludGYocywgImxhbm1hbiIpOworCQlicmVhazsKKwljYXNlIE5UTE12MjoKKwkJc2VxX3ByaW50ZihzLCAibnRsbXYyIik7CisJCWJyZWFrOworCWNhc2UgTlRMTToKKwkJc2VxX3ByaW50ZihzLCAibnRsbSIpOworCQlicmVhazsKKwljYXNlIEtlcmJlcm9zOgorCQlzZXFfcHJpbnRmKHMsICJrcmI1Iik7CisJCWJyZWFrOworCWNhc2UgUmF3TlRMTVNTUDoKKwkJc2VxX3ByaW50ZihzLCAibnRsbXNzcCIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBzaG91bGRuJ3QgZXZlciBoYXBwZW4gKi8KKwkJc2VxX3ByaW50ZihzLCAidW5rbm93biIpOworCQlicmVhazsKKwl9CisKKwlpZiAoc2VydmVyLT5zZWNfbW9kZSAmIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpCisJCXNlcV9wcmludGYocywgImkiKTsKK30KKwogLyoKICAqIGNpZnNfc2hvd19vcHRpb25zKCkgaXMgZm9yIGRpc3BsYXlpbmcgbW91bnQgb3B0aW9ucyBpbiAvcHJvYy9tb3VudHMuCiAgKiBOb3QgYWxsIHNldHRhYmxlIG9wdGlvbnMgYXJlIGRpc3BsYXllZCBidXQgbW9zdCBvZiB0aGUgaW1wb3J0YW50CkBAIC0zNjUsNiArMzY0LDggQEAKIAlzdHJ1Y3Qgc29ja2FkZHIgKnNyY2FkZHI7CiAJc3JjYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmdGNvbi0+c2VzLT5zZXJ2ZXItPnNyY2FkZHI7CiAKKwljaWZzX3Nob3dfc2VjdXJpdHkocywgdGNvbi0+c2VzLT5zZXJ2ZXIpOworCiAJc2VxX3ByaW50ZihzLCAiLHVuYz0lcyIsIHRjb24tPnRyZWVOYW1lKTsKIAogCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTVVMVElVU0VSKQpAQCAtNTE4LDcgKzUxOSw2IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBjaWZzX3N1cGVyX29wcyA9IHsKLQkucHV0X3N1cGVyID0gY2lmc19wdXRfc3VwZXIsCiAJLnN0YXRmcyA9IGNpZnNfc3RhdGZzLAogCS5hbGxvY19pbm9kZSA9IGNpZnNfYWxsb2NfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUgPSBjaWZzX2Rlc3Ryb3lfaW5vZGUsCkBAIC01NDMsOTEgKzU0Myw1NSBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKgogY2lmc19nZXRfcm9vdChzdHJ1Y3Qgc21iX3ZvbCAqdm9sLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWludCB4aWQsIHJjOwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IHFzdHIgbmFtZTsKLQlzdHJ1Y3QgZGVudHJ5ICpkcGFyZW50ID0gTlVMTCwgKmRjaGlsZCA9IE5VTEwsICphbGlhczsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0Ioc2IpOwotCXVuc2lnbmVkIGludCBpLCBmdWxsX2xlbiwgbGVuOwotCWNoYXIgKmZ1bGxfcGF0aCA9IE5VTEwsICpwc3RhcnQ7CisJY2hhciAqZnVsbF9wYXRoID0gTlVMTDsKKwljaGFyICpzLCAqcDsKIAljaGFyIHNlcDsKKwlpbnQgeGlkOwogCiAJZnVsbF9wYXRoID0gY2lmc19idWlsZF9wYXRoX3RvX3Jvb3Qodm9sLCBjaWZzX3NiLAogCQkJCQkgICAgY2lmc19zYl9tYXN0ZXJfdGNvbihjaWZzX3NiKSk7CiAJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAljRllJKDEsICJHZXQgcm9vdCBkZW50cnkgZm9yICVzIiwgZnVsbF9wYXRoKTsKIAogCXhpZCA9IEdldFhpZCgpOwogCXNlcCA9IENJRlNfRElSX1NFUChjaWZzX3NiKTsKLQlkcGFyZW50ID0gZGdldChzYi0+c19yb290KTsKLQlmdWxsX2xlbiA9IHN0cmxlbihmdWxsX3BhdGgpOwotCWZ1bGxfcGF0aFtmdWxsX2xlbl0gPSBzZXA7Ci0JcHN0YXJ0ID0gZnVsbF9wYXRoICsgMTsKKwlkZW50cnkgPSBkZ2V0KHNiLT5zX3Jvb3QpOworCXAgPSBzID0gZnVsbF9wYXRoOwogCi0JZm9yIChpID0gMSwgbGVuID0gMDsgaSA8PSBmdWxsX2xlbjsgaSsrKSB7Ci0JCWlmIChmdWxsX3BhdGhbaV0gIT0gc2VwIHx8ICFsZW4pIHsKLQkJCWxlbisrOwotCQkJY29udGludWU7Ci0JCX0KKwlkbyB7CisJCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX2lub2RlOworCQlzdHJ1Y3QgZGVudHJ5ICpjaGlsZDsKIAotCQlmdWxsX3BhdGhbaV0gPSAwOwotCQljRllJKDEsICJnZXQgZGVudHJ5IGZvciAlcyIsIHBzdGFydCk7CisJCS8qIHNraXAgc2VwYXJhdG9ycyAqLworCQl3aGlsZSAoKnMgPT0gc2VwKQorCQkJcysrOworCQlpZiAoISpzKQorCQkJYnJlYWs7CisJCXAgPSBzKys7CisJCS8qIG5leHQgc2VwYXJhdG9yICovCisJCXdoaWxlICgqcyAmJiAqcyAhPSBzZXApCisJCQlzKys7CiAKLQkJbmFtZS5uYW1lID0gcHN0YXJ0OwotCQluYW1lLmxlbiA9IGxlbjsKLQkJbmFtZS5oYXNoID0gZnVsbF9uYW1lX2hhc2gocHN0YXJ0LCBsZW4pOwotCQlkY2hpbGQgPSBkX2xvb2t1cChkcGFyZW50LCAmbmFtZSk7Ci0JCWlmIChkY2hpbGQgPT0gTlVMTCkgewotCQkJY0ZZSSgxLCAibm90IGV4aXN0cyIpOwotCQkJZGNoaWxkID0gZF9hbGxvYyhkcGFyZW50LCAmbmFtZSk7Ci0JCQlpZiAoZGNoaWxkID09IE5VTEwpIHsKLQkJCQlkcHV0KGRwYXJlbnQpOwotCQkJCWRwYXJlbnQgPSBOVUxMOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0KLQkJY0ZZSSgxLCAiZ2V0IGlub2RlIik7Ci0JCWlmIChkY2hpbGQtPmRfaW5vZGUgPT0gTlVMTCkgewotCQkJY0ZZSSgxLCAibm90IGV4aXN0cyIpOwotCQkJaW5vZGUgPSBOVUxMOwotCQkJaWYgKGNpZnNfc2JfbWFzdGVyX3Rjb24oQ0lGU19TQihzYikpLT51bml4X2V4dCkKLQkJCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmaW5vZGUsIGZ1bGxfcGF0aCwKLQkJCQkJCQkgICAgICBzYiwgeGlkKTsKLQkJCWVsc2UKLQkJCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm8oJmlub2RlLCBmdWxsX3BhdGgsCi0JCQkJCQkJIE5VTEwsIHNiLCB4aWQsIE5VTEwpOwotCQkJaWYgKHJjKSB7Ci0JCQkJZHB1dChkY2hpbGQpOwotCQkJCWRwdXQoZHBhcmVudCk7Ci0JCQkJZHBhcmVudCA9IE5VTEw7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlhbGlhcyA9IGRfbWF0ZXJpYWxpc2VfdW5pcXVlKGRjaGlsZCwgaW5vZGUpOwotCQkJaWYgKGFsaWFzICE9IE5VTEwpIHsKLQkJCQlkcHV0KGRjaGlsZCk7Ci0JCQkJaWYgKElTX0VSUihhbGlhcykpIHsKLQkJCQkJZHB1dChkcGFyZW50KTsKLQkJCQkJZHBhcmVudCA9IE5VTEw7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCQlkY2hpbGQgPSBhbGlhczsKLQkJCX0KLQkJfQotCQljRllJKDEsICJwYXJlbnQgJXAsIGNoaWxkICVwIiwgZHBhcmVudCwgZGNoaWxkKTsKLQotCQlkcHV0KGRwYXJlbnQpOwotCQlkcGFyZW50ID0gZGNoaWxkOwotCQlsZW4gPSAwOwotCQlwc3RhcnQgPSBmdWxsX3BhdGggKyBpICsgMTsKLQkJZnVsbF9wYXRoW2ldID0gc2VwOwotCX0KLW91dDoKKwkJbXV0ZXhfbG9jaygmZGlyLT5pX211dGV4KTsKKwkJY2hpbGQgPSBsb29rdXBfb25lX2xlbihwLCBkZW50cnksIHMgLSBwKTsKKwkJbXV0ZXhfdW5sb2NrKCZkaXItPmlfbXV0ZXgpOworCQlkcHV0KGRlbnRyeSk7CisJCWRlbnRyeSA9IGNoaWxkOworCX0gd2hpbGUgKCFJU19FUlIoZGVudHJ5KSk7CiAJX0ZyZWVYaWQoeGlkKTsKIAlrZnJlZShmdWxsX3BhdGgpOwotCXJldHVybiBkcGFyZW50OworCXJldHVybiBkZW50cnk7Cit9CisKK3N0YXRpYyBpbnQgY2lmc19zZXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2lmc19tbnRfZGF0YSAqbW50X2RhdGEgPSBkYXRhOworCXNiLT5zX2ZzX2luZm8gPSBtbnRfZGF0YS0+Y2lmc19zYjsKKwlyZXR1cm4gc2V0X2Fub25fc3VwZXIoc2IsIE5VTEwpOwogfQogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqCkBAIC02NDMsODIgKzYwNyw4MCBAQAogCiAJY0ZZSSgxLCAiRGV2bmFtZTogJXMgZmxhZ3M6ICVkICIsIGRldl9uYW1lLCBmbGFncyk7CiAKLQlyYyA9IGNpZnNfc2V0dXBfdm9sdW1lX2luZm8oJnZvbHVtZV9pbmZvLCAoY2hhciAqKWRhdGEsIGRldl9uYW1lKTsKLQlpZiAocmMpCi0JCXJldHVybiBFUlJfUFRSKHJjKTsKKwl2b2x1bWVfaW5mbyA9IGNpZnNfZ2V0X3ZvbHVtZV9pbmZvKChjaGFyICopZGF0YSwgZGV2X25hbWUpOworCWlmIChJU19FUlIodm9sdW1lX2luZm8pKQorCQlyZXR1cm4gRVJSX0NBU1Qodm9sdW1lX2luZm8pOwogCiAJY2lmc19zYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaWZzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2lmc19zYiA9PSBOVUxMKSB7CiAJCXJvb3QgPSBFUlJfUFRSKC1FTk9NRU0pOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfbmxzOworCX0KKworCWNpZnNfc2ItPm1vdW50ZGF0YSA9IGtzdHJuZHVwKGRhdGEsIFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNpZnNfc2ItPm1vdW50ZGF0YSA9PSBOVUxMKSB7CisJCXJvb3QgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG91dF9jaWZzX3NiOwogCX0KIAogCWNpZnNfc2V0dXBfY2lmc19zYih2b2x1bWVfaW5mbywgY2lmc19zYik7CiAKKwlyYyA9IGNpZnNfbW91bnQoY2lmc19zYiwgdm9sdW1lX2luZm8pOworCWlmIChyYykgeworCQlpZiAoIShmbGFncyAmIE1TX1NJTEVOVCkpCisJCQljRVJST1IoMSwgImNpZnNfbW91bnQgZmFpbGVkIHcvcmV0dXJuIGNvZGUgPSAlZCIsIHJjKTsKKwkJcm9vdCA9IEVSUl9QVFIocmMpOworCQlnb3RvIG91dF9tb3VudGRhdGE7CisJfQorCiAJbW50X2RhdGEudm9sID0gdm9sdW1lX2luZm87CiAJbW50X2RhdGEuY2lmc19zYiA9IGNpZnNfc2I7CiAJbW50X2RhdGEuZmxhZ3MgPSBmbGFnczsKIAotCXNiID0gc2dldChmc190eXBlLCBjaWZzX21hdGNoX3N1cGVyLCBzZXRfYW5vbl9zdXBlciwgJm1udF9kYXRhKTsKKwlzYiA9IHNnZXQoZnNfdHlwZSwgY2lmc19tYXRjaF9zdXBlciwgY2lmc19zZXRfc3VwZXIsICZtbnRfZGF0YSk7CiAJaWYgKElTX0VSUihzYikpIHsKIAkJcm9vdCA9IEVSUl9DQVNUKHNiKTsKLQkJZ290byBvdXRfY2lmc19zYjsKKwkJY2lmc191bW91bnQoY2lmc19zYik7CisJCWdvdG8gb3V0OwogCX0KIAotCWlmIChzYi0+c19mc19pbmZvKSB7CisJaWYgKHNiLT5zX3Jvb3QpIHsKIAkJY0ZZSSgxLCAiVXNlIGV4aXN0aW5nIHN1cGVyYmxvY2siKTsKLQkJZ290byBvdXRfc2hhcmVkOworCQljaWZzX3Vtb3VudChjaWZzX3NiKTsKKwl9IGVsc2UgeworCQlzYi0+c19mbGFncyA9IGZsYWdzOworCQkvKiBCQiBzaG91bGQgd2UgbWFrZSB0aGlzIGNvbnRpbmdlbnQgb24gbW91bnQgcGFybT8gKi8KKwkJc2ItPnNfZmxhZ3MgfD0gTVNfTk9ESVJBVElNRSB8IE1TX05PQVRJTUU7CisKKwkJcmMgPSBjaWZzX3JlYWRfc3VwZXIoc2IpOworCQlpZiAocmMpIHsKKwkJCXJvb3QgPSBFUlJfUFRSKHJjKTsKKwkJCWdvdG8gb3V0X3N1cGVyOworCQl9CisKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwogCX0KIAotCS8qCi0JICogQ29weSBtb3VudCBwYXJhbXMgZm9yIHVzZSBpbiBzdWJtb3VudHMuIEJldHRlciB0byBkbwotCSAqIHRoZSBjb3B5IGhlcmUgYW5kIGRlYWwgd2l0aCB0aGUgZXJyb3IgYmVmb3JlIGNsZWFudXAgZ2V0cwotCSAqIGNvbXBsaWNhdGVkIHBvc3QtbW91bnQuCi0JICovCi0JY2lmc19zYi0+bW91bnRkYXRhID0ga3N0cm5kdXAoZGF0YSwgUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2lmc19zYi0+bW91bnRkYXRhID09IE5VTEwpIHsKLQkJcm9vdCA9IEVSUl9QVFIoLUVOT01FTSk7Ci0JCWdvdG8gb3V0X3N1cGVyOwotCX0KLQotCXNiLT5zX2ZsYWdzID0gZmxhZ3M7Ci0JLyogQkIgc2hvdWxkIHdlIG1ha2UgdGhpcyBjb250aW5nZW50IG9uIG1vdW50IHBhcm0/ICovCi0Jc2ItPnNfZmxhZ3MgfD0gTVNfTk9ESVJBVElNRSB8IE1TX05PQVRJTUU7Ci0Jc2ItPnNfZnNfaW5mbyA9IGNpZnNfc2I7Ci0KLQlyYyA9IGNpZnNfcmVhZF9zdXBlcihzYiwgdm9sdW1lX2luZm8sIGRldl9uYW1lLAotCQkJICAgICBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKLQlpZiAocmMpIHsKLQkJcm9vdCA9IEVSUl9QVFIocmMpOwotCQlnb3RvIG91dF9zdXBlcjsKLQl9Ci0KLQlzYi0+c19mbGFncyB8PSBNU19BQ1RJVkU7Ci0KIAlyb290ID0gY2lmc19nZXRfcm9vdCh2b2x1bWVfaW5mbywgc2IpOwotCWlmIChyb290ID09IE5VTEwpCisJaWYgKElTX0VSUihyb290KSkKIAkJZ290byBvdXRfc3VwZXI7CiAKIAljRllJKDEsICJkZW50cnkgcm9vdCBpczogJXAiLCByb290KTsKIAlnb3RvIG91dDsKIAotb3V0X3NoYXJlZDoKLQlyb290ID0gY2lmc19nZXRfcm9vdCh2b2x1bWVfaW5mbywgc2IpOwotCWlmIChyb290KQotCQljRllJKDEsICJkZW50cnkgcm9vdCBpczogJXAiLCByb290KTsKLQlnb3RvIG91dDsKLQogb3V0X3N1cGVyOgotCWtmcmVlKGNpZnNfc2ItPm1vdW50ZGF0YSk7CiAJZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIoc2IpOwotCi1vdXRfY2lmc19zYjoKLQl1bmxvYWRfbmxzKGNpZnNfc2ItPmxvY2FsX25scyk7Ci0Ja2ZyZWUoY2lmc19zYik7Ci0KIG91dDoKLQljaWZzX2NsZWFudXBfdm9sdW1lX2luZm8oJnZvbHVtZV9pbmZvKTsKKwljaWZzX2NsZWFudXBfdm9sdW1lX2luZm8odm9sdW1lX2luZm8pOwogCXJldHVybiByb290OworCitvdXRfbW91bnRkYXRhOgorCWtmcmVlKGNpZnNfc2ItPm1vdW50ZGF0YSk7CitvdXRfY2lmc19zYjoKKwlrZnJlZShjaWZzX3NiKTsKK291dF9ubHM6CisJdW5sb2FkX25scyh2b2x1bWVfaW5mby0+bG9jYWxfbmxzKTsKKwlnb3RvIG91dDsKIH0KIAogc3RhdGljIHNzaXplX3QgY2lmc19maWxlX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LApAQCAtNzQyLDggKzcwNCwxMSBAQAogCiBzdGF0aWMgbG9mZl90IGNpZnNfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQogewotCS8qIG9yaWdpbiA9PSBTRUVLX0VORCA9PiB3ZSBtdXN0IHJldmFsaWRhdGUgdGhlIGNhY2hlZCBmaWxlIGxlbmd0aCAqLwotCWlmIChvcmlnaW4gPT0gU0VFS19FTkQpIHsKKwkvKgorCSAqIG9yaWdpbiA9PSBTRUVLX0VORCB8fCBTRUVLX0RBVEEgfHwgU0VFS19IT0xFID0+IHdlIG11c3QgcmV2YWxpZGF0ZQorCSAqIHRoZSBjYWNoZWQgZmlsZSBsZW5ndGgKKwkgKi8KKwlpZiAob3JpZ2luICE9IFNFRUtfU0VUIHx8IG9yaWdpbiAhPSBTRUVLX0NVUikgewogCQlpbnQgcmM7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCkBAIC04MDcsNyArNzcyLDcgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkubmFtZSA9ICJjaWZzIiwKIAkubW91bnQgPSBjaWZzX2RvX21vdW50LAotCS5raWxsX3NiID0ga2lsbF9hbm9uX3N1cGVyLAorCS5raWxsX3NiID0gY2lmc19raWxsX3NiLAogCS8qICAuZnNfZmxhZ3MgKi8KIH07CiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjaWZzX2Rpcl9pbm9kZV9vcHMgPSB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNmcy5oIGIvZnMvY2lmcy9jaWZzZnMuaAppbmRleCA2NDMxM2Y3Li5mYmQwNTBjIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNmcy5oCisrKyBiL2ZzL2NpZnMvY2lmc2ZzLmgKQEAgLTkxLDggKzkxLDggQEAKIGV4dGVybiBzc2l6ZV90IGNpZnNfc3RyaWN0X3dyaXRldihzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAogCQkJCSAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKTsKIGV4dGVybiBpbnQgY2lmc19sb2NrKHN0cnVjdCBmaWxlICosIGludCwgc3RydWN0IGZpbGVfbG9jayAqKTsKLWV4dGVybiBpbnQgY2lmc19mc3luYyhzdHJ1Y3QgZmlsZSAqLCBpbnQpOwotZXh0ZXJuIGludCBjaWZzX3N0cmljdF9mc3luYyhzdHJ1Y3QgZmlsZSAqLCBpbnQpOworZXh0ZXJuIGludCBjaWZzX2ZzeW5jKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgbG9mZl90LCBpbnQpOworZXh0ZXJuIGludCBjaWZzX3N0cmljdF9mc3luYyhzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGxvZmZfdCwgaW50KTsKIGV4dGVybiBpbnQgY2lmc19mbHVzaChzdHJ1Y3QgZmlsZSAqLCBmbF9vd25lcl90IGlkKTsKIGV4dGVybiBpbnQgY2lmc19maWxlX21tYXAoc3RydWN0IGZpbGUgKiAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIGV4dGVybiBpbnQgY2lmc19maWxlX3N0cmljdF9tbWFwKHN0cnVjdCBmaWxlICogLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CkBAIC0xMjksNSArMTI5LDUgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgY2lmc19leHBvcnRfb3BzOwogI2VuZGlmIC8qIENJRlNfTkZTRF9FWFBPUlQgKi8KIAotI2RlZmluZSBDSUZTX1ZFUlNJT04gICAiMS43MiIKKyNkZWZpbmUgQ0lGU19WRVJTSU9OICAgIjEuNzQiCiAjZW5kaWYJCQkJLyogX0NJRlNGU19IICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNwcm90by5oIGIvZnMvY2lmcy9jaWZzcHJvdG8uaAppbmRleCA5NTNmODQ0Li44ZGYyOGU5IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNwcm90by5oCisrKyBiL2ZzL2NpZnMvY2lmc3Byb3RvLmgKQEAgLTE1NCwxMiArMTU0LDExIEBACiBleHRlcm4gdm9pZCBjaWZzX3NldHVwX2NpZnNfc2Ioc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbywKIAkJCSAgICAgICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKTsKIGV4dGVybiBpbnQgY2lmc19tYXRjaF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIGNpZnNfY2xlYW51cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqKnB2b2x1bWVfaW5mbyk7Ci1leHRlcm4gaW50IGNpZnNfc2V0dXBfdm9sdW1lX2luZm8oc3RydWN0IHNtYl92b2wgKipwdm9sdW1lX2luZm8sCi0JCQkJICBjaGFyICptb3VudF9kYXRhLCBjb25zdCBjaGFyICpkZXZuYW1lKTsKLWV4dGVybiBpbnQgY2lmc19tb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGNpZnNfc2JfaW5mbyAqLAotCQkgICAgICBzdHJ1Y3Qgc21iX3ZvbCAqLCBjb25zdCBjaGFyICopOwotZXh0ZXJuIGludCBjaWZzX3Vtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGNpZnNfc2JfaW5mbyAqKTsKK2V4dGVybiB2b2lkIGNpZnNfY2xlYW51cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqcHZvbHVtZV9pbmZvKTsKK2V4dGVybiBzdHJ1Y3Qgc21iX3ZvbCAqY2lmc19nZXRfdm9sdW1lX2luZm8oY2hhciAqbW91bnRfZGF0YSwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmRldm5hbWUpOworZXh0ZXJuIGludCBjaWZzX21vdW50KHN0cnVjdCBjaWZzX3NiX2luZm8gKiwgc3RydWN0IHNtYl92b2wgKik7CitleHRlcm4gdm9pZCBjaWZzX3Vtb3VudChzdHJ1Y3QgY2lmc19zYl9pbmZvICopOwogZXh0ZXJuIHZvaWQgY2lmc19kZnNfcmVsZWFzZV9hdXRvbW91bnRfdGltZXIodm9pZCk7CiB2b2lkIGNpZnNfcHJvY19pbml0KHZvaWQpOwogdm9pZCBjaWZzX3Byb2NfY2xlYW4odm9pZCk7CkBAIC0yMTgsNyArMjE3LDggQEAKIAkJCXN0cnVjdCBkZnNfaW5mbzNfcGFyYW0gKipwcmVmZXJyYWxzLAogCQkJaW50IHJlbWFwKTsKIGV4dGVybiB2b2lkIHJlc2V0X2NpZnNfdW5peF9jYXBzKGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCi0JCQkJIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBzbWJfdm9sICp2b2wpOworCQkJCSBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLAorCQkJCSBzdHJ1Y3Qgc21iX3ZvbCAqdm9sKTsKIGV4dGVybiBpbnQgQ0lGU1NNQlFGU0luZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwKIAkJCXN0cnVjdCBrc3RhdGZzICpGU0RhdGEpOwogZXh0ZXJuIGludCBTTUJPbGRRRlNJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IDZkODhiODIuLmU2NjI5N2IgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC02NSw2ICs2NSw4IEBACiBzdGF0aWMgaW50IGdlbmVyaWNfaXBfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOwogc3RhdGljIHZvaWQgdGxpbmtfcmJfaW5zZXJ0KHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3QgdGNvbl9saW5rICpuZXdfdGxpbmspOwogc3RhdGljIHZvaWQgY2lmc19wcnVuZV90bGlua3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyBpbnQgY2lmc19zZXR1cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm8sIGNoYXIgKm1vdW50X2RhdGEsCisJCQkJCWNvbnN0IGNoYXIgKmRldm5hbWUpOwogCiAvKgogICogY2lmcyB0Y3Agc2Vzc2lvbiByZWNvbm5lY3Rpb24KQEAgLTE1Miw3ICsxNTQsNyBAQAogCQltaWRfZW50cnktPmNhbGxiYWNrKG1pZF9lbnRyeSk7CiAJfQogCi0Jd2hpbGUgKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KSB7CisJZG8gewogCQl0cnlfdG9fZnJlZXplKCk7CiAKIAkJLyogd2Ugc2hvdWxkIHRyeSBvbmx5IHRoZSBwb3J0IHdlIGNvbm5lY3RlZCB0byBiZWZvcmUgKi8KQEAgLTE2Nyw3ICsxNjksNyBAQAogCQkJCXNlcnZlci0+dGNwU3RhdHVzID0gQ2lmc05lZWROZWdvdGlhdGU7CiAJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOwogCQl9Ci0JfQorCX0gd2hpbGUgKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KTsKIAogCXJldHVybiByYzsKIH0KQEAgLTMxOCw5ICszMjAsMTAgQEAKIH0KIAogc3RhdGljIGludAotY2lmc19kZW11bHRpcGxleF90aHJlYWQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQorY2lmc19kZW11bHRpcGxleF90aHJlYWQodm9pZCAqcCkKIHsKIAlpbnQgbGVuZ3RoOworCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciA9IHA7CiAJdW5zaWduZWQgaW50IHBkdV9sZW5ndGgsIHRvdGFsX3JlYWQ7CiAJc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXIgPSBOVUxMOwogCXN0cnVjdCBzbWJfaGRyICpiaWdidWYgPSBOVUxMOwpAQCAtNzg0LDcgKzc4Nyw3IEBACiAJCQkgc3RydWN0IHNtYl92b2wgKnZvbCkKIHsKIAljaGFyICp2YWx1ZSwgKmRhdGEsICplbmQ7Ci0JY2hhciAqbW91bnRkYXRhX2NvcHksICpvcHRpb25zOworCWNoYXIgKm1vdW50ZGF0YV9jb3B5ID0gTlVMTCwgKm9wdGlvbnM7CiAJdW5zaWduZWQgaW50ICB0ZW1wX2xlbiwgaSwgajsKIAljaGFyIHNlcGFyYXRvclsyXTsKIAlzaG9ydCBpbnQgb3ZlcnJpZGVfdWlkID0gLTE7CkBAIC0xMzkxLDcgKzEzOTQsNyBAQAogCQkJCSIvcHJvYy9mcy9jaWZzL0xvb2t1cENhY2hlRW5hYmxlZCB0byAwXG4iKTsKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiZnNjIiwgMykgPT0gMCkgewogI2lmbmRlZiBDT05GSUdfQ0lGU19GU0NBQ0hFCi0JCQljRVJST1IoMSwgIkZTLUNhY2hlIHN1cHBvcnQgbmVlZHMgQ09ORklHX0NJRlNfRlNDQUNIRSIKKwkJCWNFUlJPUigxLCAiRlMtQ2FjaGUgc3VwcG9ydCBuZWVkcyBDT05GSUdfQ0lGU19GU0NBQ0hFICIKIAkJCQkgICJrZXJuZWwgY29uZmlnIG9wdGlvbiBzZXQiKTsKIAkJCWdvdG8gY2lmc19wYXJzZV9tb3VudF9lcnI7CiAjZW5kaWYKQEAgLTE3ODksNyArMTc5Miw3IEBACiAJICogdGhpcyB3aWxsIHN1Y2NlZWQuIE5vIG5lZWQgZm9yIHRyeV9tb2R1bGVfZ2V0KCkuCiAJICovCiAJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKLQl0Y3Bfc2VzLT50c2sgPSBrdGhyZWFkX3J1bigodm9pZCAqKSh2b2lkICopY2lmc19kZW11bHRpcGxleF90aHJlYWQsCisJdGNwX3Nlcy0+dHNrID0ga3RocmVhZF9ydW4oY2lmc19kZW11bHRpcGxleF90aHJlYWQsCiAJCQkJICB0Y3Bfc2VzLCAiY2lmc2QiKTsKIAlpZiAoSVNfRVJSKHRjcF9zZXMtPnRzaykpIHsKIAkJcmMgPSBQVFJfRVJSKHRjcF9zZXMtPnRzayk7CkBAIC0xOTc2LDcgKzE5NzksNyBAQAogCQl3YXJuZWRfb25fbnRsbSA9IHRydWU7CiAJCWNFUlJPUigxLCAiZGVmYXVsdCBzZWN1cml0eSBtZWNoYW5pc20gcmVxdWVzdGVkLiAgVGhlIGRlZmF1bHQgIgogCQkJInNlY3VyaXR5IG1lY2hhbmlzbSB3aWxsIGJlIHVwZ3JhZGVkIGZyb20gbnRsbSB0byAiCi0JCQkibnRsbXYyIGluIGtlcm5lbCByZWxlYXNlIDIuNi40MSIpOworCQkJIm50bG12MiBpbiBrZXJuZWwgcmVsZWFzZSAzLjEiKTsKIAl9CiAJc2VzLT5vdmVycmlkZVNlY0ZsZyA9IHZvbHVtZV9pbmZvLT5zZWNGbGc7CiAKQEAgLTIxNDksNyArMjE1MiwxMCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0Y29uX2xpbmsgKgotY2lmc19zYl9tYXN0ZXJfdGxpbmsoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYik7CitjaWZzX3NiX21hc3Rlcl90bGluayhzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKQoreworCXJldHVybiBjaWZzX3NiLT5tYXN0ZXJfdGxpbms7Cit9CiAKIHN0YXRpYyBpbnQKIGNvbXBhcmVfbW91bnRfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgY2lmc19tbnRfZGF0YSAqbW50X2RhdGEpCkBAIC0yMjM3LDggKzIyNDMsOCBAQAogCiAJcmMgPSBjb21wYXJlX21vdW50X29wdGlvbnMoc2IsIG1udF9kYXRhKTsKIG91dDoKLQljaWZzX3B1dF90bGluayh0bGluayk7CiAJc3Bpbl91bmxvY2soJmNpZnNfdGNwX3Nlc19sb2NrKTsKKwljaWZzX3B1dF90bGluayh0bGluayk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNDcxLDE0ICsyNDc3LDYgQEAKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IHNvY2tldC0+b3BzLT5jb25uZWN0KHNvY2tldCwgc2FkZHIsIHNsZW4sIDApOwotCWlmIChyYyA8IDApIHsKLQkJY0ZZSSgxLCAiRXJyb3IgJWQgY29ubmVjdGluZyB0byBzZXJ2ZXIiLCByYyk7Ci0JCXNvY2tfcmVsZWFzZShzb2NrZXQpOwotCQlzZXJ2ZXItPnNzb2NrZXQgPSBOVUxMOwotCQlyZXR1cm4gcmM7Ci0JfQotCiAJLyoKIAkgKiBFdmVudHVhbGx5IGNoZWNrIGZvciBvdGhlciBzb2NrZXQgb3B0aW9ucyB0byBjaGFuZ2UgZnJvbQogCSAqIHRoZSBkZWZhdWx0LiBzb2NrX3NldHNvY2tvcHQgbm90IHVzZWQgYmVjYXVzZSBpdCBleHBlY3RzCkBAIC0yNTA3LDYgKzI1MDUsMTQgQEAKIAkJIHNvY2tldC0+c2stPnNrX3NuZGJ1ZiwKIAkJIHNvY2tldC0+c2stPnNrX3JjdmJ1Ziwgc29ja2V0LT5zay0+c2tfcmN2dGltZW8pOwogCisJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsIHNhZGRyLCBzbGVuLCAwKTsKKwlpZiAocmMgPCAwKSB7CisJCWNGWUkoMSwgIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gc2VydmVyIiwgcmMpOworCQlzb2NrX3JlbGVhc2Uoc29ja2V0KTsKKwkJc2VydmVyLT5zc29ja2V0ID0gTlVMTDsKKwkJcmV0dXJuIHJjOworCX0KKwogCWlmIChzcG9ydCA9PSBodG9ucyhSRkMxMDAxX1BPUlQpKQogCQlyYyA9IGlwX3JmYzEwMDFfY29ubmVjdChzZXJ2ZXIpOwogCkBAIC0yNTQzLDcgKzI1NDksNyBAQAogfQogCiB2b2lkIHJlc2V0X2NpZnNfdW5peF9jYXBzKGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCi0JCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBzbWJfdm9sICp2b2xfaW5mbykKKwkJCSAgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgc3RydWN0IHNtYl92b2wgKnZvbF9pbmZvKQogewogCS8qIGlmIHdlIGFyZSByZWNvbm5lY3RpbmcgdGhlbiBzaG91bGQgd2UgY2hlY2sgdG8gc2VlIGlmCiAJICogYW55IHJlcXVlc3RlZCBjYXBhYmlsaXRpZXMgY2hhbmdlZCBsb2NhbGx5IGUuZy4gdmlhCkBAIC0yNTk3LDIyICsyNjAzLDIzIEBACiAJCQljYXAgJj0gfkNJRlNfVU5JWF9QT1NJWF9BQ0xfQ0FQOwogCQllbHNlIGlmIChDSUZTX1VOSVhfUE9TSVhfQUNMX0NBUCAmIGNhcCkgewogCQkJY0ZZSSgxLCAibmVnb3RpYXRlZCBwb3NpeCBhY2wgc3VwcG9ydCIpOwotCQkJaWYgKHNiKQotCQkJCXNiLT5zX2ZsYWdzIHw9IE1TX1BPU0lYQUNMOworCQkJaWYgKGNpZnNfc2IpCisJCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgfD0KKwkJCQkJQ0lGU19NT1VOVF9QT1NJWEFDTDsKIAkJfQogCiAJCWlmICh2b2xfaW5mbyAmJiB2b2xfaW5mby0+cG9zaXhfcGF0aHMgPT0gMCkKIAkJCWNhcCAmPSB+Q0lGU19VTklYX1BPU0lYX1BBVEhOQU1FU19DQVA7CiAJCWVsc2UgaWYgKGNhcCAmIENJRlNfVU5JWF9QT1NJWF9QQVRITkFNRVNfQ0FQKSB7CiAJCQljRllJKDEsICJuZWdvdGlhdGUgcG9zaXggcGF0aG5hbWVzIik7Ci0JCQlpZiAoc2IpCi0JCQkJQ0lGU19TQihzYiktPm1udF9jaWZzX2ZsYWdzIHw9CisJCQlpZiAoY2lmc19zYikKKwkJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyB8PQogCQkJCQlDSUZTX01PVU5UX1BPU0lYX1BBVEhTOwogCQl9CiAKLQkJaWYgKHNiICYmIChDSUZTX1NCKHNiKS0+cnNpemUgPiAxMjcgKiAxMDI0KSkgeworCQlpZiAoY2lmc19zYiAmJiAoY2lmc19zYi0+cnNpemUgPiAxMjcgKiAxMDI0KSkgewogCQkJaWYgKChjYXAgJiBDSUZTX1VOSVhfTEFSR0VfUkVBRF9DQVApID09IDApIHsKLQkJCQlDSUZTX1NCKHNiKS0+cnNpemUgPSAxMjcgKiAxMDI0OworCQkJCWNpZnNfc2ItPnJzaXplID0gMTI3ICogMTAyNDsKIAkJCQljRllJKERCRzIsICJsYXJnZXIgcmVhZHMgbm90IHN1cHBvcnRlZCBieSBzcnYiKTsKIAkJCX0KIAkJfQpAQCAtMjY1OSw2ICsyNjY2LDkgQEAKIHsKIAlJTklUX0RFTEFZRURfV09SSygmY2lmc19zYi0+cHJ1bmVfdGxpbmtzLCBjaWZzX3BydW5lX3RsaW5rcyk7CiAKKwlzcGluX2xvY2tfaW5pdCgmY2lmc19zYi0+dGxpbmtfdHJlZV9sb2NrKTsKKwljaWZzX3NiLT50bGlua190cmVlID0gUkJfUk9PVDsKKwogCWlmIChwdm9sdW1lX2luZm8tPnJzaXplID4gQ0lGU01heEJ1ZlNpemUpIHsKIAkJY0VSUk9SKDEsICJyc2l6ZSAlZCB0b28gbGFyZ2UsIHVzaW5nIE1heEJ1ZlNpemUiLAogCQkJcHZvbHVtZV9pbmZvLT5yc2l6ZSk7CkBAIC0yNzQ3LDIxICsyNzU3LDIxIEBACiAKIC8qCiAgKiBXaGVuIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdmVyeSBsYXJnZSB3cml0ZXMgdmlhIFBPU0lYIGV4dGVuc2lvbnMsIHdlIGNhbgotICogYWxsb3cgdXAgdG8gMl4yNCAtIFBBR0VfQ0FDSEVfU0laRS4KKyAqIGFsbG93IHVwIHRvIDJeMjQtMSwgbWludXMgdGhlIHNpemUgb2YgYSBXUklURV9BTkRfWCBoZWFkZXIsIG5vdCBpbmNsdWRpbmcKKyAqIHRoZSBSRkMxMDAxIGxlbmd0aC4KICAqCiAgKiBOb3RlIHRoYXQgdGhpcyBtaWdodCBtYWtlIGZvciAiaW50ZXJlc3RpbmciIGFsbG9jYXRpb24gcHJvYmxlbXMgZHVyaW5nCi0gKiB3cml0ZWJhY2sgaG93ZXZlciAoYXMgd2UgaGF2ZSB0byBhbGxvY2F0ZSBhbiBhcnJheSBvZiBwb2ludGVycyBmb3IgdGhlCi0gKiBwYWdlcykuIEEgMTZNIHdyaXRlIG1lYW5zIH4zMmtiIHBhZ2UgYXJyYXkgd2l0aCBQQUdFX0NBQ0hFX1NJWkUgPT0gNDA5Ni4KKyAqIHdyaXRlYmFjayBob3dldmVyIGFzIHdlIGhhdmUgdG8gYWxsb2NhdGUgYW4gYXJyYXkgb2YgcG9pbnRlcnMgZm9yIHRoZQorICogcGFnZXMuIEEgMTZNIHdyaXRlIG1lYW5zIH4zMmtiIHBhZ2UgYXJyYXkgd2l0aCBQQUdFX0NBQ0hFX1NJWkUgPT0gNDA5Ni4KICAqLwotI2RlZmluZSBDSUZTX01BWF9XU0laRSAoKDE8PDI0KSAtIFBBR0VfQ0FDSEVfU0laRSkKKyNkZWZpbmUgQ0lGU19NQVhfV1NJWkUgKCgxPDwyNCkgLSAxIC0gc2l6ZW9mKFdSSVRFX1JFUSkgKyA0KQogCiAvKgotICogV2hlbiB0aGUgc2VydmVyIGRvZXNuJ3QgYWxsb3cgbGFyZ2UgcG9zaXggd3JpdGVzLCBkZWZhdWx0IHRvIGEgd3NpemUgb2YKLSAqIDEyOGsgLSBQQUdFX0NBQ0hFX1NJWkUgLS0gb25lIHBhZ2UgbGVzcyB0aGFuIHRoZSBsYXJnZXN0IGZyYW1lIHNpemUKLSAqIGRlc2NyaWJlZCBpbiBSRkMxMDAxLiBUaGlzIGFsbG93cyBzcGFjZSBmb3IgdGhlIGhlYWRlciB3aXRob3V0IGdvaW5nIG92ZXIKLSAqIHRoYXQgYnkgZGVmYXVsdC4KKyAqIFdoZW4gdGhlIHNlcnZlciBkb2Vzbid0IGFsbG93IGxhcmdlIHBvc2l4IHdyaXRlcywgb25seSBhbGxvdyBhIHdzaXplIG9mCisgKiAxMjhrIG1pbnVzIHRoZSBzaXplIG9mIHRoZSBXUklURV9BTkRfWCBoZWFkZXIuIFRoYXQgYWxsb3dzIGZvciBhIHdyaXRlIHVwCisgKiB0byB0aGUgbWF4aW11bSBzaXplIGRlc2NyaWJlZCBieSBSRkMxMDAyLgogICovCi0jZGVmaW5lIENJRlNfTUFYX1JGQzEwMDFfV1NJWkUgKDEyOCAqIDEwMjQgLSBQQUdFX0NBQ0hFX1NJWkUpCisjZGVmaW5lIENJRlNfTUFYX1JGQzEwMDJfV1NJWkUgKDEyOCAqIDEwMjQgLSBzaXplb2YoV1JJVEVfUkVRKSArIDQpCiAKIC8qCiAgKiBUaGUgZGVmYXVsdCB3c2l6ZSBpcyAxTS4gZmluZF9nZXRfcGFnZXMgc2VlbXMgdG8gcmV0dXJuIGEgbWF4aW11bSBvZiAyNTYKQEAgLTI3ODAsMTEgKzI3OTAsMTggQEAKIAogCS8qIGNhbiBzZXJ2ZXIgc3VwcG9ydCAyNC1iaXQgd3JpdGUgc2l6ZXM/ICh2aWEgVU5JWCBleHRlbnNpb25zKSAqLwogCWlmICghdGNvbi0+dW5peF9leHQgfHwgISh1bml4X2NhcCAmIENJRlNfVU5JWF9MQVJHRV9XUklURV9DQVApKQotCQl3c2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgd3NpemUsIENJRlNfTUFYX1JGQzEwMDFfV1NJWkUpOworCQl3c2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgd3NpemUsIENJRlNfTUFYX1JGQzEwMDJfV1NJWkUpOwogCi0JLyogbm8gQ0FQX0xBUkdFX1dSSVRFX1g/IExpbWl0IGl0IHRvIDE2IGJpdHMgKi8KLQlpZiAoIShzZXJ2ZXItPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9XUklURV9YKSkKLQkJd3NpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHdzaXplLCBVU0hSVF9NQVgpOworCS8qCisJICogbm8gQ0FQX0xBUkdFX1dSSVRFX1ggb3IgaXMgc2lnbmluZyBlbmFibGVkIHdpdGhvdXQgQ0FQX1VOSVggc2V0PworCSAqIExpbWl0IGl0IHRvIG1heCBidWZmZXIgb2ZmZXJlZCBieSB0aGUgc2VydmVyLCBtaW51cyB0aGUgc2l6ZSBvZiB0aGUKKwkgKiBXUklURVggaGVhZGVyLCBub3QgaW5jbHVkaW5nIHRoZSA0IGJ5dGUgUkZDMTAwMSBsZW5ndGguCisJICovCisJaWYgKCEoc2VydmVyLT5jYXBhYmlsaXRpZXMgJiBDQVBfTEFSR0VfV1JJVEVfWCkgfHwKKwkgICAgKCEoc2VydmVyLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgJiYKKwkgICAgIChzZXJ2ZXItPnNlY19tb2RlICYgKFNFQ01PREVfU0lHTl9FTkFCTEVEfFNFQ01PREVfU0lHTl9SRVFVSVJFRCkpKSkKKwkJd3NpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHdzaXplLAorCQkJCXNlcnZlci0+bWF4QnVmIC0gc2l6ZW9mKFdSSVRFX1JFUSkgKyA0KTsKIAogCS8qIGhhcmQgbGltaXQgb2YgQ0lGU19NQVhfV1NJWkUgKi8KIAl3c2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgd3NpemUsIENJRlNfTUFYX1dTSVpFKTsKQEAgLTI4MTYsMTUgKzI4MzMsOSBAQAogCXJldHVybiByYzsKIH0KIAotdm9pZAotY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKHN0cnVjdCBzbWJfdm9sICoqcHZvbHVtZV9pbmZvKQorc3RhdGljIHZvaWQKK2NsZWFudXBfdm9sdW1lX2luZm9fY29udGVudHMoc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvKQogewotCXN0cnVjdCBzbWJfdm9sICp2b2x1bWVfaW5mbzsKLQotCWlmICghcHZvbHVtZV9pbmZvIHx8ICEqcHZvbHVtZV9pbmZvKQotCQlyZXR1cm47Ci0KLQl2b2x1bWVfaW5mbyA9ICpwdm9sdW1lX2luZm87CiAJa2ZyZWUodm9sdW1lX2luZm8tPnVzZXJuYW1lKTsKIAlremZyZWUodm9sdW1lX2luZm8tPnBhc3N3b3JkKTsKIAlrZnJlZSh2b2x1bWVfaW5mby0+VU5DKTsKQEAgLTI4MzIsMjggKzI4NDMsNDQgQEAKIAlrZnJlZSh2b2x1bWVfaW5mby0+ZG9tYWlubmFtZSk7CiAJa2ZyZWUodm9sdW1lX2luZm8tPmlvY2hhcnNldCk7CiAJa2ZyZWUodm9sdW1lX2luZm8tPnByZXBhdGgpOwotCWtmcmVlKHZvbHVtZV9pbmZvKTsKLQkqcHZvbHVtZV9pbmZvID0gTlVMTDsKLQlyZXR1cm47CiB9CiAKK3ZvaWQKK2NpZnNfY2xlYW51cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm8pCit7CisJaWYgKCF2b2x1bWVfaW5mbykKKwkJcmV0dXJuOworCWNsZWFudXBfdm9sdW1lX2luZm9fY29udGVudHModm9sdW1lX2luZm8pOworCWtmcmVlKHZvbHVtZV9pbmZvKTsKK30KKworCiAjaWZkZWYgQ09ORklHX0NJRlNfREZTX1VQQ0FMTAogLyogYnVpbGRfcGF0aF90b19yb290IHJldHVybnMgZnVsbCBwYXRoIHRvIHJvb3Qgd2hlbgogICogd2UgZG8gbm90IGhhdmUgYW4gZXhpdGluZyBjb25uZWN0aW9uICh0Y29uKSAqLwogc3RhdGljIGNoYXIgKgotYnVpbGRfdW5jX3BhdGhfdG9fcm9vdChjb25zdCBzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm8sCitidWlsZF91bmNfcGF0aF90b19yb290KGNvbnN0IHN0cnVjdCBzbWJfdm9sICp2b2wsCiAJCWNvbnN0IHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCiB7Ci0JY2hhciAqZnVsbF9wYXRoOworCWNoYXIgKmZ1bGxfcGF0aCwgKnBvczsKKwl1bnNpZ25lZCBpbnQgcHBsZW4gPSB2b2wtPnByZXBhdGggPyBzdHJsZW4odm9sLT5wcmVwYXRoKSA6IDA7CisJdW5zaWduZWQgaW50IHVuY19sZW4gPSBzdHJubGVuKHZvbC0+VU5DLCBNQVhfVFJFRV9TSVpFICsgMSk7CiAKLQlpbnQgdW5jX2xlbiA9IHN0cm5sZW4odm9sdW1lX2luZm8tPlVOQywgTUFYX1RSRUVfU0laRSArIDEpOwotCWZ1bGxfcGF0aCA9IGttYWxsb2ModW5jX2xlbiArIDEsIEdGUF9LRVJORUwpOworCWZ1bGxfcGF0aCA9IGttYWxsb2ModW5jX2xlbiArIHBwbGVuICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXN0cm5jcHkoZnVsbF9wYXRoLCB2b2x1bWVfaW5mby0+VU5DLCB1bmNfbGVuKTsKLQlmdWxsX3BhdGhbdW5jX2xlbl0gPSAwOyAvKiBhZGQgdHJhaWxpbmcgbnVsbCAqLworCXN0cm5jcHkoZnVsbF9wYXRoLCB2b2wtPlVOQywgdW5jX2xlbik7CisJcG9zID0gZnVsbF9wYXRoICsgdW5jX2xlbjsKKworCWlmIChwcGxlbikgeworCQlzdHJuY3B5KHBvcywgdm9sLT5wcmVwYXRoLCBwcGxlbik7CisJCXBvcyArPSBwcGxlbjsKKwl9CisKKwkqcG9zID0gJ1wwJzsgLyogYWRkIHRyYWlsaW5nIG51bGwgKi8KIAljb252ZXJ0X2RlbGltaXRlcihmdWxsX3BhdGgsIENJRlNfRElSX1NFUChjaWZzX3NiKSk7CisJY0ZZSSgxLCAiJXM6IGZ1bGxfcGF0aD0lcyIsIF9fZnVuY19fLCBmdWxsX3BhdGgpOwogCXJldHVybiBmdWxsX3BhdGg7CiB9CiAKQEAgLTI4OTYsMTUgKzI5MjMsMTggQEAKIAkJCQkJCSAgICZmYWtlX2Rldm5hbWUpOwogCiAJCWZyZWVfZGZzX2luZm9fYXJyYXkocmVmZXJyYWxzLCBudW1fcmVmZXJyYWxzKTsKLQkJa2ZyZWUoZmFrZV9kZXZuYW1lKTsKLQotCQlpZiAoY2lmc19zYi0+bW91bnRkYXRhICE9IE5VTEwpCi0JCQlrZnJlZShjaWZzX3NiLT5tb3VudGRhdGEpOwogCiAJCWlmIChJU19FUlIobWRhdGEpKSB7CiAJCQlyYyA9IFBUUl9FUlIobWRhdGEpOwogCQkJbWRhdGEgPSBOVUxMOworCQl9IGVsc2UgeworCQkJY2xlYW51cF92b2x1bWVfaW5mb19jb250ZW50cyh2b2x1bWVfaW5mbyk7CisJCQltZW1zZXQodm9sdW1lX2luZm8sICdcMCcsIHNpemVvZigqdm9sdW1lX2luZm8pKTsKKwkJCXJjID0gY2lmc19zZXR1cF92b2x1bWVfaW5mbyh2b2x1bWVfaW5mbywgbWRhdGEsCisJCQkJCQkJZmFrZV9kZXZuYW1lKTsKIAkJfQorCQlrZnJlZShmYWtlX2Rldm5hbWUpOworCQlrZnJlZShjaWZzX3NiLT5tb3VudGRhdGEpOwogCQljaWZzX3NiLT5tb3VudGRhdGEgPSBtZGF0YTsKIAl9CiAJa2ZyZWUoZnVsbF9wYXRoKTsKQEAgLTI5MTIsMjkgKzI5NDIsMjAgQEAKIH0KICNlbmRpZgogCi1pbnQgY2lmc19zZXR1cF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc21iX3ZvbCAqKnB2b2x1bWVfaW5mbywgY2hhciAqbW91bnRfZGF0YSwKLQkJCSAgIGNvbnN0IGNoYXIgKmRldm5hbWUpCitzdGF0aWMgaW50CitjaWZzX3NldHVwX3ZvbHVtZV9pbmZvKHN0cnVjdCBzbWJfdm9sICp2b2x1bWVfaW5mbywgY2hhciAqbW91bnRfZGF0YSwKKwkJCWNvbnN0IGNoYXIgKmRldm5hbWUpCiB7Ci0Jc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvOwogCWludCByYyA9IDA7CiAKLQkqcHZvbHVtZV9pbmZvID0gTlVMTDsKLQotCXZvbHVtZV9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNtYl92b2wpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZvbHVtZV9pbmZvKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGNpZnNfcGFyc2VfbW91bnRfb3B0aW9ucyhtb3VudF9kYXRhLCBkZXZuYW1lLAotCQkJCSAgICAgdm9sdW1lX2luZm8pKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChjaWZzX3BhcnNlX21vdW50X29wdGlvbnMobW91bnRfZGF0YSwgZGV2bmFtZSwgdm9sdW1lX2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh2b2x1bWVfaW5mby0+bnVsbGF1dGgpIHsKIAkJY0ZZSSgxLCAibnVsbCB1c2VyIik7Ci0JCXZvbHVtZV9pbmZvLT51c2VybmFtZSA9ICIiOworCQl2b2x1bWVfaW5mby0+dXNlcm5hbWUgPSBremFsbG9jKDEsIEdGUF9LRVJORUwpOworCQlpZiAodm9sdW1lX2luZm8tPnVzZXJuYW1lID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKIAl9IGVsc2UgaWYgKHZvbHVtZV9pbmZvLT51c2VybmFtZSkgewogCQkvKiBCQiBmaXhtZSBwYXJzZSBmb3IgZG9tYWluIG5hbWUgaGVyZSAqLwogCQljRllJKDEsICJVc2VybmFtZTogJXMiLCB2b2x1bWVfaW5mby0+dXNlcm5hbWUpOwpAQCAtMjk0Miw4ICsyOTYzLDcgQEAKIAkJY2lmc2Vycm9yKCJObyB1c2VybmFtZSBzcGVjaWZpZWQiKTsKIAkvKiBJbiB1c2Vyc3BhY2UgbW91bnQgaGVscGVyIHdlIGNhbiBnZXQgdXNlciBuYW1lIGZyb20gYWx0ZXJuYXRlCiAJICAgbG9jYXRpb25zIHN1Y2ggYXMgZW52IHZhcmlhYmxlcyBhbmQgZmlsZXMgb24gZGlzayAqLwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiB0aGlzIGlzIG5lZWRlZCBmb3IgQVNDSUkgY3AgdG8gVW5pY29kZSBjb252ZXJ0cyAqLwpAQCAtMjk1NSwyMSArMjk3NSwzNCBAQAogCQlpZiAodm9sdW1lX2luZm8tPmxvY2FsX25scyA9PSBOVUxMKSB7CiAJCQljRVJST1IoMSwgIkNJRlMgbW91bnQgZXJyb3I6IGlvY2hhcnNldCAlcyBub3QgZm91bmQiLAogCQkJCSB2b2x1bWVfaW5mby0+aW9jaGFyc2V0KTsKLQkJCXJjID0gLUVMSUJBQ0M7Ci0JCQlnb3RvIG91dDsKKwkJCXJldHVybiAtRUxJQkFDQzsKIAkJfQogCX0KIAotCSpwdm9sdW1lX2luZm8gPSB2b2x1bWVfaW5mbzsKLQlyZXR1cm4gcmM7Ci1vdXQ6Ci0JY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKCZ2b2x1bWVfaW5mbyk7CiAJcmV0dXJuIHJjOwogfQogCitzdHJ1Y3Qgc21iX3ZvbCAqCitjaWZzX2dldF92b2x1bWVfaW5mbyhjaGFyICptb3VudF9kYXRhLCBjb25zdCBjaGFyICpkZXZuYW1lKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm87CisKKwl2b2x1bWVfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWJfdm9sKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2b2x1bWVfaW5mbykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlyYyA9IGNpZnNfc2V0dXBfdm9sdW1lX2luZm8odm9sdW1lX2luZm8sIG1vdW50X2RhdGEsIGRldm5hbWUpOworCWlmIChyYykgeworCQljaWZzX2NsZWFudXBfdm9sdW1lX2luZm8odm9sdW1lX2luZm8pOworCQl2b2x1bWVfaW5mbyA9IEVSUl9QVFIocmMpOworCX0KKworCXJldHVybiB2b2x1bWVfaW5mbzsKK30KKwogaW50Ci1jaWZzX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsCi0JICAgc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvLCBjb25zdCBjaGFyICpkZXZuYW1lKQorY2lmc19tb3VudChzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLCBzdHJ1Y3Qgc21iX3ZvbCAqdm9sdW1lX2luZm8pCiB7CiAJaW50IHJjID0gMDsKIAlpbnQgeGlkOwpAQCAtMjk4MCw2ICszMDEzLDE1IEBACiAJc3RydWN0IHRjb25fbGluayAqdGxpbms7CiAjaWZkZWYgQ09ORklHX0NJRlNfREZTX1VQQ0FMTAogCWludCByZWZlcnJhbF93YWxrc19jb3VudCA9IDA7CisjZW5kaWYKKworCXJjID0gYmRpX3NldHVwX2FuZF9yZWdpc3RlcigmY2lmc19zYi0+YmRpLCAiY2lmcyIsIEJESV9DQVBfTUFQX0NPUFkpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJY2lmc19zYi0+YmRpLnJhX3BhZ2VzID0gZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzOworCisjaWZkZWYgQ09ORklHX0NJRlNfREZTX1VQQ0FMTAogdHJ5X21vdW50X2FnYWluOgogCS8qIGNsZWFudXAgYWN0aXZpdGllcyBpZiB3ZSdyZSBjaGFzaW5nIGEgcmVmZXJyYWwgKi8KIAlpZiAocmVmZXJyYWxfd2Fsa3NfY291bnQpIHsKQEAgLTI5ODgsNyArMzAzMCw2IEBACiAJCWVsc2UgaWYgKHBTZXNJbmZvKQogCQkJY2lmc19wdXRfc21iX3NlcyhwU2VzSW5mbyk7CiAKLQkJY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKCZ2b2x1bWVfaW5mbyk7CiAJCUZyZWVYaWQoeGlkKTsKIAl9CiAjZW5kaWYKQEAgLTMwMDQsNiArMzA0NSw3IEBACiAJc3J2VGNwID0gY2lmc19nZXRfdGNwX3Nlc3Npb24odm9sdW1lX2luZm8pOwogCWlmIChJU19FUlIoc3J2VGNwKSkgewogCQlyYyA9IFBUUl9FUlIoc3J2VGNwKTsKKwkJYmRpX2Rlc3Ryb3koJmNpZnNfc2ItPmJkaSk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzAxNSwxNCArMzA1Nyw2IEBACiAJCWdvdG8gbW91bnRfZmFpbF9jaGVjazsKIAl9CiAKLQlpZiAocFNlc0luZm8tPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9GSUxFUykKLQkJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOwotCWVsc2UKLQkJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTk9OX0xGUzsKLQotCS8qIEJCIEZJWE1FIGZpeCB0aW1lX2dyYW4gdG8gYmUgbGFyZ2VyIGZvciBMQU5NQU4gc2Vzc2lvbnMgKi8KLQlzYi0+c190aW1lX2dyYW4gPSAxMDA7Ci0KIAkvKiBzZWFyY2ggZm9yIGV4aXN0aW5nIHRjb24gdG8gdGhpcyBzZXJ2ZXIgc2hhcmUgKi8KIAl0Y29uID0gY2lmc19nZXRfdGNvbihwU2VzSW5mbywgdm9sdW1lX2luZm8pOwogCWlmIChJU19FUlIodGNvbikpIHsKQEAgLTMwMzUsNyArMzA2OSw3IEBACiAJaWYgKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpIHsKIAkJLyogcmVzZXQgb2YgY2FwcyBjaGVja3MgbW91bnQgdG8gc2VlIGlmIHVuaXggZXh0ZW5zaW9ucwogCQkgICBkaXNhYmxlZCBmb3IganVzdCB0aGlzIG1vdW50ICovCi0JCXJlc2V0X2NpZnNfdW5peF9jYXBzKHhpZCwgdGNvbiwgc2IsIHZvbHVtZV9pbmZvKTsKKwkJcmVzZXRfY2lmc191bml4X2NhcHMoeGlkLCB0Y29uLCBjaWZzX3NiLCB2b2x1bWVfaW5mbyk7CiAJCWlmICgodGNvbi0+c2VzLT5zZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgJiYKIAkJICAgIChsZTY0X3RvX2NwdSh0Y29uLT5mc1VuaXhJbmZvLkNhcGFiaWxpdHkpICYKIAkJICAgICBDSUZTX1VOSVhfVFJBTlNQT1JUX0VOQ1JZUFRJT05fTUFOREFUT1JZX0NBUCkpIHsKQEAgLTMxNTgsNiArMzE5Miw3IEBACiAJCQljaWZzX3B1dF9zbWJfc2VzKHBTZXNJbmZvKTsKIAkJZWxzZQogCQkJY2lmc19wdXRfdGNwX3Nlc3Npb24oc3J2VGNwKTsKKwkJYmRpX2Rlc3Ryb3koJmNpZnNfc2ItPmJkaSk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzE3MSw2ICszMjA2LDEwIEBACiAJcmV0dXJuIHJjOwogfQogCisvKgorICogSXNzdWUgYSBUUkVFX0NPTk5FQ1QgcmVxdWVzdC4gTm90ZSB0aGF0IGZvciBJUEMkIHNoYXJlcywgdGhhdCB0aGUgdGNvbgorICogcG9pbnRlciBtYXkgYmUgTlVMTC4KKyAqLwogaW50CiBDSUZTVENvbih1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc19zZXMgKnNlcywKIAkgY29uc3QgY2hhciAqdHJlZSwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwKQEAgLTMyMDUsNyArMzI0NCw3IEBACiAJcFNNQi0+QW5kWENvbW1hbmQgPSAweEZGOwogCXBTTUItPkZsYWdzID0gY3B1X3RvX2xlMTYoVENPTl9FWFRFTkRFRF9TRUNJTkZPKTsKIAliY2NfcHRyID0gJnBTTUItPlBhc3N3b3JkWzBdOwotCWlmICgoc2VzLT5zZXJ2ZXItPnNlY19tb2RlKSAmIFNFQ01PREVfVVNFUikgeworCWlmICghdGNvbiB8fCAoc2VzLT5zZXJ2ZXItPnNlY19tb2RlICYgU0VDTU9ERV9VU0VSKSkgewogCQlwU01CLT5QYXNzd29yZExlbmd0aCA9IGNwdV90b19sZTE2KDEpOwkvKiBtaW5pbXVtICovCiAJCSpiY2NfcHRyID0gMDsgLyogcGFzc3dvcmQgaXMgbnVsbCBieXRlICovCiAJCWJjY19wdHIrKzsgICAgICAgICAgICAgIC8qIHNraXAgcGFzc3dvcmQgKi8KQEAgLTMzMjgsOCArMzM2Nyw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQKLWNpZnNfdW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCit2b2lkCitjaWZzX3Vtb3VudChzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKQogewogCXN0cnVjdCByYl9yb290ICpyb290ID0gJmNpZnNfc2ItPnRsaW5rX3RyZWU7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CkBAIC0zMzUwLDcgKzMzODksMTAgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmNpZnNfc2ItPnRsaW5rX3RyZWVfbG9jayk7CiAKLQlyZXR1cm4gMDsKKwliZGlfZGVzdHJveSgmY2lmc19zYi0+YmRpKTsKKwlrZnJlZShjaWZzX3NiLT5tb3VudGRhdGEpOworCXVubG9hZF9ubHMoY2lmc19zYi0+bG9jYWxfbmxzKTsKKwlrZnJlZShjaWZzX3NiKTsKIH0KIAogaW50IGNpZnNfbmVnb3RpYXRlX3Byb3RvY29sKHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzX3NlcyAqc2VzKQpAQCAtMzM3MSw3ICszNDEzLDcgQEAKIAl9CiAJaWYgKHJjID09IDApIHsKIAkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7Ci0JCWlmIChzZXJ2ZXItPnRjcFN0YXR1cyAhPSBDaWZzRXhpdGluZykKKwkJaWYgKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkTmVnb3RpYXRlKQogCQkJc2VydmVyLT50Y3BTdGF0dXMgPSBDaWZzR29vZDsKIAkJZWxzZQogCQkJcmMgPSAtRUhPU1RET1dOOwpAQCAtMzQ0NCw3ICszNDg2LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jc25wcmludGYodXNlcm5hbWUsIE1BWF9VU0VSTkFNRV9TSVpFLCAia3JiNTB4JXgiLCBmc3VpZCk7CisJc25wcmludGYodXNlcm5hbWUsIHNpemVvZih1c2VybmFtZSksICJrcmI1MHgleCIsIGZzdWlkKTsKIAl2b2xfaW5mby0+dXNlcm5hbWUgPSB1c2VybmFtZTsKIAl2b2xfaW5mby0+bG9jYWxfbmxzID0gY2lmc19zYi0+bG9jYWxfbmxzOwogCXZvbF9pbmZvLT5saW51eF91aWQgPSBmc3VpZDsKQEAgLTM0ODQsMTIgKzM1MjYsNiBAQAogCXJldHVybiB0Y29uOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0Y29uX2xpbmsgKgotY2lmc19zYl9tYXN0ZXJfdGxpbmsoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYikKLXsKLQlyZXR1cm4gY2lmc19zYi0+bWFzdGVyX3RsaW5rOwotfQotCiBzdHJ1Y3QgY2lmc190Y29uICoKIGNpZnNfc2JfbWFzdGVyX3Rjb24oc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYikKIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZGlyLmMgYi9mcy9jaWZzL2Rpci5jCmluZGV4IDgxOTE0ZGYuLjQ5OWYyN2YgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZGlyLmMKKysrIGIvZnMvY2lmcy9kaXIuYwpAQCAtNTUsNiArNTUsNyBAQAogCWNoYXIgZGlyc2VwOwogCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKGRpcmVudHJ5LT5kX3NiKTsKIAlzdHJ1Y3QgY2lmc190Y29uICp0Y29uID0gY2lmc19zYl9tYXN0ZXJfdGNvbihjaWZzX3NiKTsKKwl1bnNpZ25lZCBzZXE7CiAKIAlpZiAoZGlyZW50cnkgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7ICAvKiBub3QgbXVjaCB3ZSBjYW4gZG8gaWYgZGVudHJ5IGlzIGZyZWVkIGFuZApAQCAtNjgsMjIgKzY5LDI5IEBACiAJCWRmc3BsZW4gPSAwOwogY2lmc19icF9yZW5hbWVfcmV0cnk6CiAJbmFtZWxlbiA9IGRmc3BsZW47CisJc2VxID0gcmVhZF9zZXFiZWdpbigmcmVuYW1lX2xvY2spOworCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKHRlbXAgPSBkaXJlbnRyeTsgIUlTX1JPT1QodGVtcCk7KSB7CiAJCW5hbWVsZW4gKz0gKDEgKyB0ZW1wLT5kX25hbWUubGVuKTsKIAkJdGVtcCA9IHRlbXAtPmRfcGFyZW50OwogCQlpZiAodGVtcCA9PSBOVUxMKSB7CiAJCQljRVJST1IoMSwgImNvcnJ1cHQgZGVudHJ5Iik7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCiAJZnVsbF9wYXRoID0ga21hbGxvYyhuYW1lbGVuKzEsIEdGUF9LRVJORUwpOwogCWlmIChmdWxsX3BhdGggPT0gTlVMTCkKIAkJcmV0dXJuIGZ1bGxfcGF0aDsKIAlmdWxsX3BhdGhbbmFtZWxlbl0gPSAwOwkvKiB0cmFpbGluZyBudWxsICovCisJcmN1X3JlYWRfbG9jaygpOwogCWZvciAodGVtcCA9IGRpcmVudHJ5OyAhSVNfUk9PVCh0ZW1wKTspIHsKKwkJc3Bpbl9sb2NrKCZ0ZW1wLT5kX2xvY2spOwogCQluYW1lbGVuIC09IDEgKyB0ZW1wLT5kX25hbWUubGVuOwogCQlpZiAobmFtZWxlbiA8IDApIHsKKwkJCXNwaW5fdW5sb2NrKCZ0ZW1wLT5kX2xvY2spOwogCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQlmdWxsX3BhdGhbbmFtZWxlbl0gPSBkaXJzZXA7CkBAIC05MSwxNCArOTksMTcgQEAKIAkJCQl0ZW1wLT5kX25hbWUubGVuKTsKIAkJCWNGWUkoMCwgIm5hbWU6ICVzIiwgZnVsbF9wYXRoICsgbmFtZWxlbik7CiAJCX0KKwkJc3Bpbl91bmxvY2soJnRlbXAtPmRfbG9jayk7CiAJCXRlbXAgPSB0ZW1wLT5kX3BhcmVudDsKIAkJaWYgKHRlbXAgPT0gTlVMTCkgewogCQkJY0VSUk9SKDEsICJjb3JydXB0IGRlbnRyeSIpOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlrZnJlZShmdWxsX3BhdGgpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9Ci0JaWYgKG5hbWVsZW4gIT0gZGZzcGxlbikgeworCXJjdV9yZWFkX3VubG9jaygpOworCWlmIChuYW1lbGVuICE9IGRmc3BsZW4gfHwgcmVhZF9zZXFyZXRyeSgmcmVuYW1lX2xvY2ssIHNlcSkpIHsKIAkJY0VSUk9SKDEsICJkaWQgbm90IGVuZCBwYXRoIGxvb2t1cCB3aGVyZSBleHBlY3RlZCBuYW1lbGVuIGlzICVkIiwKIAkJCW5hbWVsZW4pOwogCQkvKiBwcmVzdW1hYmx5IHRoaXMgaXMgb25seSBwb3NzaWJsZSBpZiByYWNpbmcgd2l0aCBhIHJlbmFtZQpAQCAtMTY4LDcgKzE3OSw3IEBACiAJaWYgKG9wbG9ja0VuYWJsZWQpCiAJCW9wbG9jayA9IFJFUV9PUExPQ0s7CiAKLQlpZiAobmQgJiYgKG5kLT5mbGFncyAmIExPT0tVUF9PUEVOKSkKKwlpZiAobmQpCiAJCW9mbGFncyA9IG5kLT5pbnRlbnQub3Blbi5maWxlLT5mX2ZsYWdzOwogCWVsc2UKIAkJb2ZsYWdzID0gT19SRE9OTFkgfCBPX0NSRUFUOwpAQCAtMjAzLDcgKzIxNCw3IEBACiAJCSAgIHdoaWNoIHNob3VsZCBiZSByYXJlIGZvciBwYXRoIG5vdCBjb3ZlcmVkIG9uIGZpbGVzKSAqLwogCX0KIAotCWlmIChuZCAmJiAobmQtPmZsYWdzICYgTE9PS1VQX09QRU4pKSB7CisJaWYgKG5kKSB7CiAJCS8qIGlmIHRoZSBmaWxlIGlzIGdvaW5nIHRvIHN0YXkgb3BlbiwgdGhlbiB3ZQogCQkgICBuZWVkIHRvIHNldCB0aGUgZGVzaXJlZCBhY2Nlc3MgcHJvcGVybHkgKi8KIAkJZGVzaXJlZEFjY2VzcyA9IDA7CkBAIC0zMTcsNyArMzI4LDcgQEAKIAllbHNlCiAJCWNGWUkoMSwgIkNyZWF0ZSB3b3JrZWQsIGdldF9pbm9kZV9pbmZvIGZhaWxlZCByYyA9ICVkIiwgcmMpOwogCi0JaWYgKG5ld2lub2RlICYmIG5kICYmIChuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikpIHsKKwlpZiAobmV3aW5vZGUgJiYgbmQpIHsKIAkJc3RydWN0IGNpZnNGaWxlSW5mbyAqcGZpbGVfaW5mbzsKIAkJc3RydWN0IGZpbGUgKmZpbHA7CiAKQEAgLTU1Nyw3ICs1NjgsNyBAQAogCSAqIHJlZHVjdGlvbiBpbiBuZXR3b3JrIHRyYWZmaWMgaW4gdGhlIG90aGVyIHBhdGhzLgogCSAqLwogCWlmIChwVGNvbi0+dW5peF9leHQpIHsKLQkJaWYgKG5kICYmICEobmQtPmZsYWdzICYgKExPT0tVUF9QQVJFTlQgfCBMT09LVVBfRElSRUNUT1JZKSkgJiYKKwkJaWYgKG5kICYmICEobmQtPmZsYWdzICYgTE9PS1VQX0RJUkVDVE9SWSkgJiYKIAkJICAgICAobmQtPmZsYWdzICYgTE9PS1VQX09QRU4pICYmICFwVGNvbi0+YnJva2VuX3Bvc2l4X29wZW4gJiYKIAkJICAgICAobmQtPmludGVudC5vcGVuLmZpbGUtPmZfZmxhZ3MgJiBPX0NSRUFUKSkgewogCQkJcmMgPSBjaWZzX3Bvc2l4X29wZW4oZnVsbF9wYXRoLCAmbmV3SW5vZGUsCkBAIC02MzAsNyArNjQxLDcgQEAKIHN0YXRpYyBpbnQKIGNpZnNfZF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQlpZiAobmQtPmZsYWdzICYgTE9PS1VQX1JDVSkKKwlpZiAobmQgJiYgKG5kLT5mbGFncyAmIExPT0tVUF9SQ1UpKQogCQlyZXR1cm4gLUVDSElMRDsKIAogCWlmIChkaXJlbnRyeS0+ZF9pbm9kZSkgewpAQCAtNjUyLDEwICs2NjMsOCBAQAogCSAqIGNhc2Ugc2Vuc2l0aXZlIG5hbWUgd2hpY2ggaXMgc3BlY2lmaWVkIGJ5IHVzZXIgaWYgdGhpcyBpcwogCSAqIGZvciBjcmVhdGlvbi4KIAkgKi8KLQlpZiAoIShuZC0+ZmxhZ3MgJiAoTE9PS1VQX0NPTlRJTlVFIHwgTE9PS1VQX1BBUkVOVCkpKSB7Ci0JCWlmIChuZC0+ZmxhZ3MgJiAoTE9PS1VQX0NSRUFURSB8IExPT0tVUF9SRU5BTUVfVEFSR0VUKSkKLQkJCXJldHVybiAwOwotCX0KKwlpZiAobmQtPmZsYWdzICYgKExPT0tVUF9DUkVBVEUgfCBMT09LVVBfUkVOQU1FX1RBUkdFVCkpCisJCXJldHVybiAwOwogCiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGlyZW50cnktPmRfdGltZSArIEhaKSB8fCAhbG9va3VwQ2FjaGVFbmFibGVkKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmlsZS5jIGIvZnMvY2lmcy9maWxlLmMKaW5kZXggYmI3MTQ3MS4uMzc4YWNkYSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9maWxlLmMKKysrIGIvZnMvY2lmcy9maWxlLmMKQEAgLTE0MDEsNyArMTQwMSw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgY2lmc19zdHJpY3RfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK2ludCBjaWZzX3N0cmljdF9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkgICAgICBpbnQgZGF0YXN5bmMpCiB7CiAJaW50IHhpZDsKIAlpbnQgcmMgPSAwOwpAQCAtMTQxMCw2ICsxNDExLDExIEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOwogCisJcmMgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwogCXhpZCA9IEdldFhpZCgpOwogCiAJY0ZZSSgxLCAiU3luYyBmaWxlIC0gbmFtZTogJXMgZGF0YXN5bmM6IDB4JXgiLApAQCAtMTQyOCwxNiArMTQzNCwyMyBAQAogCQlyYyA9IENJRlNTTUJGbHVzaCh4aWQsIHRjb24sIHNtYmZpbGUtPm5ldGZpZCk7CiAKIAlGcmVlWGlkKHhpZCk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQogCi1pbnQgY2lmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQoraW50IGNpZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKQogewogCWludCB4aWQ7CiAJaW50IHJjID0gMDsKIAlzdHJ1Y3QgY2lmc190Y29uICp0Y29uOwogCXN0cnVjdCBjaWZzRmlsZUluZm8gKnNtYmZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKworCXJjID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKIAl4aWQgPSBHZXRYaWQoKTsKIApAQCAtMTQ0OSw2ICsxNDYyLDcgQEAKIAkJcmMgPSBDSUZTU01CRmx1c2goeGlkLCB0Y29uLCBzbWJmaWxlLT5uZXRmaWQpOwogCiAJRnJlZVhpZCh4aWQpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTczNyw3ICsxNzUxLDcgQEAKIAkJCWlvX3Bhcm1zLnBpZCA9IHBpZDsKIAkJCWlvX3Bhcm1zLnRjb24gPSBwVGNvbjsKIAkJCWlvX3Bhcm1zLm9mZnNldCA9ICpwb2Zmc2V0OwotCQkJaW9fcGFybXMubGVuZ3RoID0gbGVuOworCQkJaW9fcGFybXMubGVuZ3RoID0gY3VyX2xlbjsKIAkJCXJjID0gQ0lGU1NNQlJlYWQoeGlkLCAmaW9fcGFybXMsICZieXRlc19yZWFkLAogCQkJCQkgJnJlYWRfZGF0YSwgJmJ1Zl90eXBlKTsKIAkJCXBTTUJyID0gKHN0cnVjdCBzbWJfY29tX3JlYWRfcnNwICopcmVhZF9kYXRhOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9mc2NhY2hlLmMgYi9mcy9jaWZzL2ZzY2FjaGUuYwppbmRleCBkMzY4YTQ3Li40MmU1MzYzIDEwMDY0NAotLS0gYS9mcy9jaWZzL2ZzY2FjaGUuYworKysgYi9mcy9jaWZzL2ZzY2FjaGUuYwpAQCAtMjgsMTQgKzI4LDE0IEBACiAJc2VydmVyLT5mc2NhY2hlID0KIAkJZnNjYWNoZV9hY3F1aXJlX2Nvb2tpZShjaWZzX2ZzY2FjaGVfbmV0ZnMucHJpbWFyeV9pbmRleCwKIAkJCQkmY2lmc19mc2NhY2hlX3NlcnZlcl9pbmRleF9kZWYsIHNlcnZlcik7Ci0JY0ZZSSgxLCAiQ0lGUzogZ2V0IGNsaWVudCBjb29raWUgKDB4JXAvMHglcCkiLCBzZXJ2ZXIsCi0JCQkJc2VydmVyLT5mc2NhY2hlKTsKKwljRllJKDEsICIlczogKDB4JXAvMHglcCkiLCBfX2Z1bmNfXywgc2VydmVyLAorCQkJc2VydmVyLT5mc2NhY2hlKTsKIH0KIAogdm9pZCBjaWZzX2ZzY2FjaGVfcmVsZWFzZV9jbGllbnRfY29va2llKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcikKIHsKLQljRllJKDEsICJDSUZTOiByZWxlYXNlIGNsaWVudCBjb29raWUgKDB4JXAvMHglcCkiLCBzZXJ2ZXIsCi0JCQkJc2VydmVyLT5mc2NhY2hlKTsKKwljRllJKDEsICIlczogKDB4JXAvMHglcCkiLCBfX2Z1bmNfXywgc2VydmVyLAorCQkJc2VydmVyLT5mc2NhY2hlKTsKIAlmc2NhY2hlX3JlbGlucXVpc2hfY29va2llKHNlcnZlci0+ZnNjYWNoZSwgMCk7CiAJc2VydmVyLT5mc2NhY2hlID0gTlVMTDsKIH0KQEAgLTQ3LDEzICs0NywxMyBAQAogCXRjb24tPmZzY2FjaGUgPQogCQlmc2NhY2hlX2FjcXVpcmVfY29va2llKHNlcnZlci0+ZnNjYWNoZSwKIAkJCQkmY2lmc19mc2NhY2hlX3N1cGVyX2luZGV4X2RlZiwgdGNvbik7Ci0JY0ZZSSgxLCAiQ0lGUzogZ2V0IHN1cGVyYmxvY2sgY29va2llICgweCVwLzB4JXApIiwKLQkJCQlzZXJ2ZXItPmZzY2FjaGUsIHRjb24tPmZzY2FjaGUpOworCWNGWUkoMSwgIiVzOiAoMHglcC8weCVwKSIsIF9fZnVuY19fLCBzZXJ2ZXItPmZzY2FjaGUsCisJCQl0Y29uLT5mc2NhY2hlKTsKIH0KIAogdm9pZCBjaWZzX2ZzY2FjaGVfcmVsZWFzZV9zdXBlcl9jb29raWUoc3RydWN0IGNpZnNfdGNvbiAqdGNvbikKIHsKLQljRllJKDEsICJDSUZTOiByZWxlYXNpbmcgc3VwZXJibG9jayBjb29raWUgKDB4JXApIiwgdGNvbi0+ZnNjYWNoZSk7CisJY0ZZSSgxLCAiJXM6ICgweCVwKSIsIF9fZnVuY19fLCB0Y29uLT5mc2NhY2hlKTsKIAlmc2NhY2hlX3JlbGlucXVpc2hfY29va2llKHRjb24tPmZzY2FjaGUsIDApOwogCXRjb24tPmZzY2FjaGUgPSBOVUxMOwogfQpAQCAtNzAsOCArNzAsOCBAQAogCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfRlNDQUNIRSkgewogCQljaWZzaS0+ZnNjYWNoZSA9IGZzY2FjaGVfYWNxdWlyZV9jb29raWUodGNvbi0+ZnNjYWNoZSwKIAkJCQkmY2lmc19mc2NhY2hlX2lub2RlX29iamVjdF9kZWYsIGNpZnNpKTsKLQkJY0ZZSSgxLCAiQ0lGUzogZ290IEZIIGNvb2tpZSAoMHglcC8weCVwKSIsIHRjb24tPmZzY2FjaGUsCi0JCQkJY2lmc2ktPmZzY2FjaGUpOworCQljRllJKDEsICIlczogZ290IEZIIGNvb2tpZSAoMHglcC8weCVwKSIsIF9fZnVuY19fLAorCQkJCXRjb24tPmZzY2FjaGUsIGNpZnNpLT5mc2NhY2hlKTsKIAl9CiB9CiAKQEAgLTgwLDggKzgwLDcgQEAKIAlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc2kgPSBDSUZTX0koaW5vZGUpOwogCiAJaWYgKGNpZnNpLT5mc2NhY2hlKSB7Ci0JCWNGWUkoMSwgIkNJRlMgcmVsZWFzaW5nIGlub2RlIGNvb2tpZSAoMHglcCkiLAotCQkJCWNpZnNpLT5mc2NhY2hlKTsKKwkJY0ZZSSgxLCAiJXM6ICgweCVwKSIsIF9fZnVuY19fLCBjaWZzaS0+ZnNjYWNoZSk7CiAJCWZzY2FjaGVfcmVsaW5xdWlzaF9jb29raWUoY2lmc2ktPmZzY2FjaGUsIDApOwogCQljaWZzaS0+ZnNjYWNoZSA9IE5VTEw7CiAJfQpAQCAtOTIsOCArOTEsOCBAQAogCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IENJRlNfSShpbm9kZSk7CiAKIAlpZiAoY2lmc2ktPmZzY2FjaGUpIHsKLQkJY0ZZSSgxLCAiQ0lGUyBkaXNhYmxpbmcgaW5vZGUgY29va2llICgweCVwKSIsCi0JCQkJY2lmc2ktPmZzY2FjaGUpOworCQljRllJKDEsICIlczogKDB4JXApIiwgX19mdW5jX18sIGNpZnNpLT5mc2NhY2hlKTsKKwkJZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhjaWZzaS0+ZnNjYWNoZSwgaW5vZGUpOwogCQlmc2NhY2hlX3JlbGlucXVpc2hfY29va2llKGNpZnNpLT5mc2NhY2hlLCAxKTsKIAkJY2lmc2ktPmZzY2FjaGUgPSBOVUxMOwogCX0KQEAgLTEyMSw4ICsxMjAsOCBAQAogCQkJCQljaWZzX3NiX21hc3Rlcl90Y29uKGNpZnNfc2IpLT5mc2NhY2hlLAogCQkJCQkmY2lmc19mc2NhY2hlX2lub2RlX29iamVjdF9kZWYsCiAJCQkJCWNpZnNpKTsKLQkJY0ZZSSgxLCAiQ0lGUzogbmV3IGNvb2tpZSAweCVwIG9sZGNvb2tpZSAweCVwIiwKLQkJCQljaWZzaS0+ZnNjYWNoZSwgb2xkKTsKKwkJY0ZZSSgxLCAiJXM6IG5ldyBjb29raWUgMHglcCBvbGRjb29raWUgMHglcCIsCisJCQkJX19mdW5jX18sIGNpZnNpLT5mc2NhY2hlLCBvbGQpOwogCX0KIH0KIApAQCAtMTMyLDggKzEzMSw4IEBACiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwogCQlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc2kgPSBDSUZTX0koaW5vZGUpOwogCi0JCWNGWUkoMSwgIkNJRlM6IGZzY2FjaGUgcmVsZWFzZSBwYWdlICgweCVwLzB4JXApIiwKLQkJCQlwYWdlLCBjaWZzaS0+ZnNjYWNoZSk7CisJCWNGWUkoMSwgIiVzOiAoMHglcC8weCVwKSIsIF9fZnVuY19fLCBwYWdlLAorCQkJCWNpZnNpLT5mc2NhY2hlKTsKIAkJaWYgKCFmc2NhY2hlX21heWJlX3JlbGVhc2VfcGFnZShjaWZzaS0+ZnNjYWNoZSwgcGFnZSwgZ2ZwKSkKIAkJCXJldHVybiAwOwogCX0KQEAgLTE0NCw4ICsxNDMsNyBAQAogc3RhdGljIHZvaWQgY2lmc19yZWFkcGFnZV9mcm9tX2ZzY2FjaGVfY29tcGxldGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmN0eCwKIAkJCQkJCWludCBlcnJvcikKIHsKLQljRllJKDEsICJDRlM6IHJlYWRwYWdlX2Zyb21fZnNjYWNoZV9jb21wbGV0ZSAoMHglcC8lZCkiLAotCQkJcGFnZSwgZXJyb3IpOworCWNGWUkoMSwgIiVzOiAoMHglcC8lZCkiLCBfX2Z1bmNfXywgcGFnZSwgZXJyb3IpOwogCWlmICghZXJyb3IpCiAJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKQEAgLTE1OCw3ICsxNTYsNyBAQAogewogCWludCByZXQ7CiAKLQljRllJKDEsICJDSUZTOiByZWFkcGFnZV9mcm9tX2ZzY2FjaGUoZnNjOiVwLCBwOiVwLCBpOjB4JXAiLAorCWNGWUkoMSwgIiVzOiAoZnNjOiVwLCBwOiVwLCBpOjB4JXAiLCBfX2Z1bmNfXywKIAkJCUNJRlNfSShpbm9kZSktPmZzY2FjaGUsIHBhZ2UsIGlub2RlKTsKIAlyZXQgPSBmc2NhY2hlX3JlYWRfb3JfYWxsb2NfcGFnZShDSUZTX0koaW5vZGUpLT5mc2NhY2hlLCBwYWdlLAogCQkJCQkgY2lmc19yZWFkcGFnZV9mcm9tX2ZzY2FjaGVfY29tcGxldGUsCkBAIC0xNjcsMTEgKzE2NSwxMSBAQAogCXN3aXRjaCAocmV0KSB7CiAKIAljYXNlIDA6IC8qIHBhZ2UgZm91bmQgaW4gZnNjYWNoZSwgcmVhZCBzdWJtaXR0ZWQgKi8KLQkJY0ZZSSgxLCAiQ0lGUzogcmVhZHBhZ2VfZnJvbV9mc2NhY2hlOiBzdWJtaXR0ZWQiKTsKKwkJY0ZZSSgxLCAiJXM6IHN1Ym1pdHRlZCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldDsKIAljYXNlIC1FTk9CVUZTOgkvKiBwYWdlIHdvbid0IGJlIGNhY2hlZCAqLwogCWNhc2UgLUVOT0RBVEE6CS8qIHBhZ2Ugbm90IGluIGNhY2hlICovCi0JCWNGWUkoMSwgIkNJRlM6IHJlYWRwYWdlX2Zyb21fZnNjYWNoZSAlZCIsIHJldCk7CisJCWNGWUkoMSwgIiVzOiAlZCIsIF9fZnVuY19fLCByZXQpOwogCQlyZXR1cm4gMTsKIAogCWRlZmF1bHQ6CkBAIC0xOTAsNyArMTg4LDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JY0ZZSSgxLCAiQ0lGUzogX19jaWZzX3JlYWRwYWdlc19mcm9tX2ZzY2FjaGUgKDB4JXAvJXUvMHglcCkiLAorCWNGWUkoMSwgIiVzOiAoMHglcC8ldS8weCVwKSIsIF9fZnVuY19fLAogCQkJQ0lGU19JKGlub2RlKS0+ZnNjYWNoZSwgKm5yX3BhZ2VzLCBpbm9kZSk7CiAJcmV0ID0gZnNjYWNoZV9yZWFkX29yX2FsbG9jX3BhZ2VzKENJRlNfSShpbm9kZSktPmZzY2FjaGUsIG1hcHBpbmcsCiAJCQkJCSAgcGFnZXMsIG5yX3BhZ2VzLApAQCAtMTk5LDEyICsxOTcsMTIgQEAKIAkJCQkJICBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTsKIAlzd2l0Y2ggKHJldCkgewogCWNhc2UgMDoJLyogcmVhZCBzdWJtaXR0ZWQgdG8gdGhlIGNhY2hlIGZvciBhbGwgcGFnZXMgKi8KLQkJY0ZZSSgxLCAiQ0lGUzogcmVhZHBhZ2VzX2Zyb21fZnNjYWNoZTogc3VibWl0dGVkIik7CisJCWNGWUkoMSwgIiVzOiBzdWJtaXR0ZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXQ7CiAKIAljYXNlIC1FTk9CVUZTOgkvKiBzb21lIHBhZ2VzIGFyZSBub3QgY2FjaGVkIGFuZCBjYW4ndCBiZSAqLwogCWNhc2UgLUVOT0RBVEE6CS8qIHNvbWUgcGFnZXMgYXJlIG5vdCBjYWNoZWQgKi8KLQkJY0ZZSSgxLCAiQ0lGUzogcmVhZHBhZ2VzX2Zyb21fZnNjYWNoZTogbm8gcGFnZSIpOworCQljRllJKDEsICIlczogbm8gcGFnZSIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDE7CiAKIAlkZWZhdWx0OgpAQCAtMjE4LDcgKzIxNiw3IEBACiB7CiAJaW50IHJldDsKIAotCWNGWUkoMSwgIkNJRlM6IHJlYWRwYWdlX3RvX2ZzY2FjaGUoZnNjOiAlcCwgcDogJXAsIGk6ICVwIiwKKwljRllJKDEsICIlczogKGZzYzogJXAsIHA6ICVwLCBpOiAlcCkiLCBfX2Z1bmNfXywKIAkJCUNJRlNfSShpbm9kZSktPmZzY2FjaGUsIHBhZ2UsIGlub2RlKTsKIAlyZXQgPSBmc2NhY2hlX3dyaXRlX3BhZ2UoQ0lGU19JKGlub2RlKS0+ZnNjYWNoZSwgcGFnZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJldCAhPSAwKQpAQCAtMjMwLDcgKzIyOCw3IEBACiAJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNpID0gQ0lGU19JKGlub2RlKTsKIAlzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKmNvb2tpZSA9IGNpZnNpLT5mc2NhY2hlOwogCi0JY0ZZSSgxLCAiQ0lGUzogZnNjYWNoZSBpbnZhbGlkYXRlcGFnZSAoMHglcC8weCVwKSIsIHBhZ2UsIGNvb2tpZSk7CisJY0ZZSSgxLCAiJXM6ICgweCVwLzB4JXApIiwgX19mdW5jX18sIHBhZ2UsIGNvb2tpZSk7CiAJZnNjYWNoZV93YWl0X29uX3BhZ2Vfd3JpdGUoY29va2llLCBwYWdlKTsKIAlmc2NhY2hlX3VuY2FjaGVfcGFnZShjb29raWUsIHBhZ2UpOwogfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9yZWFkZGlyLmMgYi9mcy9jaWZzL3JlYWRkaXIuYwppbmRleCA2NzUxZTc0Li45NjVhM2FmIDEwMDY0NAotLS0gYS9mcy9jaWZzL3JlYWRkaXIuYworKysgYi9mcy9jaWZzL3JlYWRkaXIuYwpAQCAtNzk2LDcgKzc5Niw3IEBACiAJCWZpbGUtPmZfcG9zKys7CiAJY2FzZSAxOgogCQlpZiAoZmlsbGRpcihkaXJlbnRyeSwgIi4uIiwgMiwgZmlsZS0+Zl9wb3MsCi0JCSAgICAgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkgeworCQkgICAgIHBhcmVudF9pbm8oZmlsZS0+Zl9wYXRoLmRlbnRyeSksIERUX0RJUikgPCAwKSB7CiAJCQljRVJST1IoMSwgIkZpbGxkaXIgZm9yIHBhcmVudCBkaXIgZmFpbGVkIik7CiAJCQlyYyA9IC1FTk9NRU07CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvc2Vzcy5jIGIvZnMvY2lmcy9zZXNzLmMKaW5kZXggMzg5MmFiOC4uZDNlNjE5NiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9zZXNzLmMKKysrIGIvZnMvY2lmcy9zZXNzLmMKQEAgLTQyOCw4ICs0MjgsNyBAQAogCQkJKFNFQ01PREVfU0lHTl9SRVFVSVJFRCB8IFNFQ01PREVfU0lHTl9FTkFCTEVEKSkgewogCQlmbGFncyB8PSBOVExNU1NQX05FR09USUFURV9TSUdOOwogCQlpZiAoIXNlcy0+c2VydmVyLT5zZXNzaW9uX2VzdGFiKQotCQkJZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfS0VZX1hDSCB8Ci0JCQkJTlRMTVNTUF9ORUdPVElBVEVfRVhURU5ERURfU0VDOworCQkJZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfS0VZX1hDSDsKIAl9CiAKIAlzZWNfYmxvYi0+TmVnb3RpYXRlRmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7CkBAIC00NjUsMTAgKzQ2NCwxMSBAQAogCQlOVExNU1NQX05FR09USUFURV8xMjggfCBOVExNU1NQX05FR09USUFURV9VTklDT0RFIHwKIAkJTlRMTVNTUF9ORUdPVElBVEVfTlRMTSB8IE5UTE1TU1BfTkVHT1RJQVRFX0VYVEVOREVEX1NFQzsKIAlpZiAoc2VzLT5zZXJ2ZXItPnNlY19tb2RlICYKLQkgICAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKQorCSAgIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpIHsKIAkJZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfU0lHTjsKLQlpZiAoc2VzLT5zZXJ2ZXItPnNlY19tb2RlICYgU0VDTU9ERV9TSUdOX1JFUVVJUkVEKQotCQlmbGFncyB8PSBOVExNU1NQX05FR09USUFURV9BTFdBWVNfU0lHTjsKKwkJaWYgKCFzZXMtPnNlcnZlci0+c2Vzc2lvbl9lc3RhYikKKwkJCWZsYWdzIHw9IE5UTE1TU1BfTkVHT1RJQVRFX0tFWV9YQ0g7CisJfQogCiAJdG1wID0gcGJ1ZmZlciArIHNpemVvZihBVVRIRU5USUNBVEVfTUVTU0FHRSk7CiAJc2VjX2Jsb2ItPk5lZ290aWF0ZUZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9zbWJlbmNyeXB0LmMgYi9mcy9jaWZzL3NtYmVuY3J5cHQuYwppbmRleCAxNTI1ZDVlLi4xYzViNzcwIDEwMDY0NAotLS0gYS9mcy9jaWZzL3NtYmVuY3J5cHQuYworKysgYi9mcy9jaWZzL3NtYmVuY3J5cHQuYwpAQCAtOTAsMTIgKzkwLDEwIEBACiAJc2dfaW5pdF9vbmUoJnNnb3V0LCBvdXQsIDgpOwogCiAJcmMgPSBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoJmRlc2MsICZzZ291dCwgJnNnaW4sIDgpOwotCWlmIChyYykgeworCWlmIChyYykKIAkJY0VSUk9SKDEsICJjb3VsZCBub3QgZW5jcnlwdCBjcnlwdCBrZXkgcmM6ICVkXG4iLCByYyk7Ci0JCWNyeXB0b19mcmVlX2Jsa2NpcGhlcih0Zm1fZGVzKTsKLQkJZ290byBzbWJoYXNoX2VycjsKLQl9CiAKKwljcnlwdG9fZnJlZV9ibGtjaXBoZXIodGZtX2Rlcyk7CiBzbWJoYXNoX2VycjoKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9mcy9jb2RhL2NvZGFfaW50LmggYi9mcy9jb2RhL2NvZGFfaW50LmgKaW5kZXggNmI0NDNmZi4uYjcxNDNjZiAxMDA2NDQKLS0tIGEvZnMvY29kYS9jb2RhX2ludC5oCisrKyBiL2ZzL2NvZGEvY29kYV9pbnQuaApAQCAtMTEsNyArMTEsNyBAQAogCiB2b2lkIGNvZGFfZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpOwogaW50IGNvZGFfaW5pdF9pbm9kZWNhY2hlKHZvaWQpOwotaW50IGNvZGFfZnN5bmMoc3RydWN0IGZpbGUgKmNvZGFfZmlsZSwgaW50IGRhdGFzeW5jKTsKK2ludCBjb2RhX2ZzeW5jKHN0cnVjdCBmaWxlICpjb2RhX2ZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKTsKIHZvaWQgY29kYV9zeXNjdGxfaW5pdCh2b2lkKTsKIHZvaWQgY29kYV9zeXNjdGxfY2xlYW4odm9pZCk7CiAKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvY29kYV9saW51eC5oIGIvZnMvY29kYS9jb2RhX2xpbnV4LmgKaW5kZXggOWIwYzUzMi4uNDRlMTdlOSAxMDA2NDQKLS0tIGEvZnMvY29kYS9jb2RhX2xpbnV4LmgKKysrIGIvZnMvY29kYS9jb2RhX2xpbnV4LmgKQEAgLTM5LDcgKzM5LDcgQEAKIC8qIG9wZXJhdGlvbnMgc2hhcmVkIG92ZXIgbW9yZSB0aGFuIG9uZSBmaWxlICovCiBpbnQgY29kYV9vcGVuKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGZpbGUgKmYpOwogaW50IGNvZGFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmksIHN0cnVjdCBmaWxlICpmKTsKLWludCBjb2RhX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncyk7CitpbnQgY29kYV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKTsKIGludCBjb2RhX3JldmFsaWRhdGVfaW5vZGUoc3RydWN0IGRlbnRyeSAqKTsKIGludCBjb2RhX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ICopOwogaW50IGNvZGFfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvZGlyLmMgYi9mcy9jb2RhL2Rpci5jCmluZGV4IDJiOGRhZTQuLjAyMzk0MzMgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvZGlyLmMKKysrIGIvZnMvY29kYS9kaXIuYwpAQCAtMTMyLDExICsxMzIsMTEgQEAKIH0KIAogCi1pbnQgY29kYV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitpbnQgY29kYV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCWludCBlcnJvcjsKIAotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQorCWlmIChtYXNrICYgTUFZX05PVF9CTE9DSykKIAkJcmV0dXJuIC1FQ0hJTEQ7CiAKIAltYXNrICY9IE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0VYRUM7CkBAIC00NDksOCArNDQ5LDcgQEAKIAlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOwogCXN0cnVjdCBkZW50cnkgKmRlOwogCXN0cnVjdCB2ZW51c19kaXJlbnQgKnZkaXI7Ci0JdW5zaWduZWQgbG9uZyB2ZGlyX3NpemUgPQotCSAgICAodW5zaWduZWQgbG9uZykoJigoc3RydWN0IHZlbnVzX2RpcmVudCAqKTApLT5kX25hbWUpOworCXVuc2lnbmVkIGxvbmcgdmRpcl9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IHZlbnVzX2RpcmVudCwgZF9uYW1lKTsKIAl1bnNpZ25lZCBpbnQgdHlwZTsKIAlzdHJ1Y3QgcXN0ciBuYW1lOwogCWlub190IGlubzsKQEAgLTQ3NCw3ICs0NzMsNyBAQAogCQljb2RhX2ZpbGUtPmZfcG9zKys7CiAJfQogCWlmIChjb2RhX2ZpbGUtPmZfcG9zID09IDEpIHsKLQkJcmV0ID0gZmlsbGRpcihidWYsICIuLiIsIDIsIDEsIGRlLT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9pbm8sIERUX0RJUik7CisJCXJldCA9IGZpbGxkaXIoYnVmLCAiLi4iLCAyLCAxLCBwYXJlbnRfaW5vKGRlKSwgRFRfRElSKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAkJcmVzdWx0Kys7CmRpZmYgLS1naXQgYS9mcy9jb2RhL2ZpbGUuYyBiL2ZzL2NvZGEvZmlsZS5jCmluZGV4IDA0MzMwNTcuLjhlZGQ0MDQgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvZmlsZS5jCisrKyBiL2ZzL2NvZGEvZmlsZS5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGNvZGFfZnN5bmMoc3RydWN0IGZpbGUgKmNvZGFfZmlsZSwgaW50IGRhdGFzeW5jKQoraW50IGNvZGFfZnN5bmMoc3RydWN0IGZpbGUgKmNvZGFfZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IGZpbGUgKmhvc3RfZmlsZTsKIAlzdHJ1Y3QgaW5vZGUgKmNvZGFfaW5vZGUgPSBjb2RhX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CkBAIC0yMTAsNiArMjEwLDExIEBACiAJICAgICAgU19JU0xOSyhjb2RhX2lub2RlLT5pX21vZGUpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwllcnIgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGNvZGFfaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwltdXRleF9sb2NrKCZjb2RhX2lub2RlLT5pX211dGV4KTsKKwogCWNmaSA9IENPREFfRlRPQyhjb2RhX2ZpbGUpOwogCUJVR19PTighY2ZpIHx8IGNmaS0+Y2ZpX21hZ2ljICE9IENPREFfTUFHSUMpOwogCWhvc3RfZmlsZSA9IGNmaS0+Y2ZpX2NvbnRhaW5lcjsKQEAgLTIxNyw2ICsyMjIsNyBAQAogCWVyciA9IHZmc19mc3luYyhob3N0X2ZpbGUsIGRhdGFzeW5jKTsKIAlpZiAoIWVyciAmJiAhZGF0YXN5bmMpCiAJCWVyciA9IHZlbnVzX2ZzeW5jKGNvZGFfaW5vZGUtPmlfc2IsIGNvZGFfaTJmKGNvZGFfaW5vZGUpKTsKKwltdXRleF91bmxvY2soJmNvZGFfaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2NvZGEvcGlvY3RsLmMgYi9mcy9jb2RhL3Bpb2N0bC5jCmluZGV4IDZjYmIzYWYuLmVlMDk4MWYgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvcGlvY3RsLmMKKysrIGIvZnMvY29kYS9waW9jdGwuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgImNvZGFfbGludXguaCIKIAogLyogcGlvY3RsIG9wcyAqLwotc3RhdGljIGludCBjb2RhX2lvY3RsX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncyk7CitzdGF0aWMgaW50IGNvZGFfaW9jdGxfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiBzdGF0aWMgbG9uZyBjb2RhX3Bpb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCXVuc2lnbmVkIGxvbmcgdXNlcl9kYXRhKTsKIApAQCAtNDEsMTAgKzQxLDggQEAKIH07CiAKIC8qIHRoZSBjb2RhIHBpb2N0bCBpbm9kZSBvcHMgKi8KLXN0YXRpYyBpbnQgY29kYV9pb2N0bF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IGNvZGFfaW9jdGxfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKLQkJcmV0dXJuIC1FQ0hJTEQ7CiAJcmV0dXJuIChtYXNrICYgTUFZX0VYRUMpID8gLUVBQ0NFUyA6IDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKaW5kZXggMGVhMDA4My4uMGI0OGQwMSAxMDA2NDQKLS0tIGEvZnMvY29tcGF0LmMKKysrIGIvZnMvY29tcGF0LmMKQEAgLTE2NzUsMjU2ICsxNjc1LDEwIEBACiB9CiAjZW5kaWYgLyogSEFWRV9TRVRfUkVTVE9SRV9TSUdNQVNLICovCiAKLSNpZiAoZGVmaW5lZChDT05GSUdfTkZTRCkgfHwgZGVmaW5lZChDT05GSUdfTkZTRF9NT0RVTEUpKSAmJiAhZGVmaW5lZChDT05GSUdfTkZTRF9ERVBSRUNBVEVEKQotLyogU3R1ZmYgZm9yIE5GUyBzZXJ2ZXIgc3lzY2FsbHMuLi4gKi8KLXN0cnVjdCBjb21wYXRfbmZzY3RsX3N2YyB7Ci0JdTE2CQkJc3ZjMzJfcG9ydDsKLQlzMzIJCQlzdmMzMl9udGhyZWFkczsKLX07Ci0KLXN0cnVjdCBjb21wYXRfbmZzY3RsX2NsaWVudCB7Ci0JczgJCQljbDMyX2lkZW50W05GU0NMTlRfSURNQVgrMV07Ci0JczMyCQkJY2wzMl9uYWRkcjsKLQlzdHJ1Y3QgaW5fYWRkcgkJY2wzMl9hZGRybGlzdFtORlNDTE5UX0FERFJNQVhdOwotCXMzMgkJCWNsMzJfZmhrZXl0eXBlOwotCXMzMgkJCWNsMzJfZmhrZXlsZW47Ci0JdTgJCQljbDMyX2Zoa2V5W05GU0NMTlRfS0VZTUFYXTsKLX07Ci0KLXN0cnVjdCBjb21wYXRfbmZzY3RsX2V4cG9ydCB7Ci0JY2hhcgkJZXgzMl9jbGllbnRbTkZTQ0xOVF9JRE1BWCsxXTsKLQljaGFyCQlleDMyX3BhdGhbTkZTX01BWFBBVEhMRU4rMV07Ci0JY29tcGF0X2Rldl90CWV4MzJfZGV2OwotCWNvbXBhdF9pbm9fdAlleDMyX2lubzsKLQljb21wYXRfaW50X3QJZXgzMl9mbGFnczsKLQlfX2NvbXBhdF91aWRfdAlleDMyX2Fub25fdWlkOwotCV9fY29tcGF0X2dpZF90CWV4MzJfYW5vbl9naWQ7Ci19OwotCi1zdHJ1Y3QgY29tcGF0X25mc2N0bF9mZHBhcm0gewotCXN0cnVjdCBzb2NrYWRkcgkJZ2QzMl9hZGRyOwotCXM4CQkJZ2QzMl9wYXRoW05GU19NQVhQQVRITEVOKzFdOwotCWNvbXBhdF9pbnRfdAkJZ2QzMl92ZXJzaW9uOwotfTsKLQotc3RydWN0IGNvbXBhdF9uZnNjdGxfZnNwYXJtIHsKLQlzdHJ1Y3Qgc29ja2FkZHIJCWdkMzJfYWRkcjsKLQlzOAkJCWdkMzJfcGF0aFtORlNfTUFYUEFUSExFTisxXTsKLQljb21wYXRfaW50X3QJCWdkMzJfbWF4bGVuOwotfTsKLQotc3RydWN0IGNvbXBhdF9uZnNjdGxfYXJnIHsKLQljb21wYXRfaW50X3QJCWNhMzJfdmVyc2lvbjsJLyogc2FmZWd1YXJkICovCi0JdW5pb24gewotCQlzdHJ1Y3QgY29tcGF0X25mc2N0bF9zdmMJdTMyX3N2YzsKLQkJc3RydWN0IGNvbXBhdF9uZnNjdGxfY2xpZW50CXUzMl9jbGllbnQ7Ci0JCXN0cnVjdCBjb21wYXRfbmZzY3RsX2V4cG9ydAl1MzJfZXhwb3J0OwotCQlzdHJ1Y3QgY29tcGF0X25mc2N0bF9mZHBhcm0JdTMyX2dldGZkOwotCQlzdHJ1Y3QgY29tcGF0X25mc2N0bF9mc3Bhcm0JdTMyX2dldGZzOwotCX0gdTsKLSNkZWZpbmUgY2EzMl9zdmMJdS51MzJfc3ZjCi0jZGVmaW5lIGNhMzJfY2xpZW50CXUudTMyX2NsaWVudAotI2RlZmluZSBjYTMyX2V4cG9ydAl1LnUzMl9leHBvcnQKLSNkZWZpbmUgY2EzMl9nZXRmZAl1LnUzMl9nZXRmZAotI2RlZmluZSBjYTMyX2dldGZzCXUudTMyX2dldGZzCi19OwotCi11bmlvbiBjb21wYXRfbmZzY3RsX3JlcyB7Ci0JX191OAkJCWNyMzJfZ2V0ZmhbTkZTX0ZIU0laRV07Ci0Jc3RydWN0IGtuZnNkX2ZoCQljcjMyX2dldGZzOwotfTsKLQotc3RhdGljIGludCBjb21wYXRfbmZzX3N2Y190cmFucyhzdHJ1Y3QgbmZzY3RsX2FyZyAqa2FyZywKLQkJCQlzdHJ1Y3QgY29tcGF0X25mc2N0bF9hcmcgX191c2VyICphcmcpCi17Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICZhcmctPmNhMzJfc3ZjLCBzaXplb2YoYXJnLT5jYTMyX3N2YykpIHx8Ci0JCWdldF91c2VyKGthcmctPmNhX3ZlcnNpb24sICZhcmctPmNhMzJfdmVyc2lvbikgfHwKLQkJX19nZXRfdXNlcihrYXJnLT5jYV9zdmMuc3ZjX3BvcnQsICZhcmctPmNhMzJfc3ZjLnN2YzMyX3BvcnQpIHx8Ci0JCV9fZ2V0X3VzZXIoa2FyZy0+Y2Ffc3ZjLnN2Y19udGhyZWFkcywKLQkJCQkmYXJnLT5jYTMyX3N2Yy5zdmMzMl9udGhyZWFkcykpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNvbXBhdF9uZnNfY2xudF90cmFucyhzdHJ1Y3QgbmZzY3RsX2FyZyAqa2FyZywKLQkJCQlzdHJ1Y3QgY29tcGF0X25mc2N0bF9hcmcgX191c2VyICphcmcpCi17Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICZhcmctPmNhMzJfY2xpZW50LAotCQkJc2l6ZW9mKGFyZy0+Y2EzMl9jbGllbnQpKSB8fAotCQlnZXRfdXNlcihrYXJnLT5jYV92ZXJzaW9uLCAmYXJnLT5jYTMyX3ZlcnNpb24pIHx8Ci0JCV9fY29weV9mcm9tX3VzZXIoJmthcmctPmNhX2NsaWVudC5jbF9pZGVudFswXSwKLQkJCQkmYXJnLT5jYTMyX2NsaWVudC5jbDMyX2lkZW50WzBdLAotCQkJCU5GU0NMTlRfSURNQVgpIHx8Ci0JCV9fZ2V0X3VzZXIoa2FyZy0+Y2FfY2xpZW50LmNsX25hZGRyLAotCQkJCSZhcmctPmNhMzJfY2xpZW50LmNsMzJfbmFkZHIpIHx8Ci0JCV9fY29weV9mcm9tX3VzZXIoJmthcmctPmNhX2NsaWVudC5jbF9hZGRybGlzdFswXSwKLQkJCQkmYXJnLT5jYTMyX2NsaWVudC5jbDMyX2FkZHJsaXN0WzBdLAotCQkJCShzaXplb2Yoc3RydWN0IGluX2FkZHIpICogTkZTQ0xOVF9BRERSTUFYKSkgfHwKLQkJX19nZXRfdXNlcihrYXJnLT5jYV9jbGllbnQuY2xfZmhrZXl0eXBlLAotCQkJCSZhcmctPmNhMzJfY2xpZW50LmNsMzJfZmhrZXl0eXBlKSB8fAotCQlfX2dldF91c2VyKGthcmctPmNhX2NsaWVudC5jbF9maGtleWxlbiwKLQkJCQkmYXJnLT5jYTMyX2NsaWVudC5jbDMyX2Zoa2V5bGVuKSB8fAotCQlfX2NvcHlfZnJvbV91c2VyKCZrYXJnLT5jYV9jbGllbnQuY2xfZmhrZXlbMF0sCi0JCQkJJmFyZy0+Y2EzMl9jbGllbnQuY2wzMl9maGtleVswXSwKLQkJCQlORlNDTE5UX0tFWU1BWCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29tcGF0X25mc19leHBfdHJhbnMoc3RydWN0IG5mc2N0bF9hcmcgKmthcmcsCi0JCQkJc3RydWN0IGNvbXBhdF9uZnNjdGxfYXJnIF9fdXNlciAqYXJnKQotewotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCAmYXJnLT5jYTMyX2V4cG9ydCwKLQkJCQlzaXplb2YoYXJnLT5jYTMyX2V4cG9ydCkpIHx8Ci0JCWdldF91c2VyKGthcmctPmNhX3ZlcnNpb24sICZhcmctPmNhMzJfdmVyc2lvbikgfHwKLQkJX19jb3B5X2Zyb21fdXNlcigma2FyZy0+Y2FfZXhwb3J0LmV4X2NsaWVudFswXSwKLQkJCQkmYXJnLT5jYTMyX2V4cG9ydC5leDMyX2NsaWVudFswXSwKLQkJCQlORlNDTE5UX0lETUFYKSB8fAotCQlfX2NvcHlfZnJvbV91c2VyKCZrYXJnLT5jYV9leHBvcnQuZXhfcGF0aFswXSwKLQkJCQkmYXJnLT5jYTMyX2V4cG9ydC5leDMyX3BhdGhbMF0sCi0JCQkJTkZTX01BWFBBVEhMRU4pIHx8Ci0JCV9fZ2V0X3VzZXIoa2FyZy0+Y2FfZXhwb3J0LmV4X2RldiwKLQkJCQkmYXJnLT5jYTMyX2V4cG9ydC5leDMyX2RldikgfHwKLQkJX19nZXRfdXNlcihrYXJnLT5jYV9leHBvcnQuZXhfaW5vLAotCQkJCSZhcmctPmNhMzJfZXhwb3J0LmV4MzJfaW5vKSB8fAotCQlfX2dldF91c2VyKGthcmctPmNhX2V4cG9ydC5leF9mbGFncywKLQkJCQkmYXJnLT5jYTMyX2V4cG9ydC5leDMyX2ZsYWdzKSB8fAotCQlfX2dldF91c2VyKGthcmctPmNhX2V4cG9ydC5leF9hbm9uX3VpZCwKLQkJCQkmYXJnLT5jYTMyX2V4cG9ydC5leDMyX2Fub25fdWlkKSB8fAotCQlfX2dldF91c2VyKGthcmctPmNhX2V4cG9ydC5leF9hbm9uX2dpZCwKLQkJCQkmYXJnLT5jYTMyX2V4cG9ydC5leDMyX2Fub25fZ2lkKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JU0VUX1VJRChrYXJnLT5jYV9leHBvcnQuZXhfYW5vbl91aWQsIGthcmctPmNhX2V4cG9ydC5leF9hbm9uX3VpZCk7Ci0JU0VUX0dJRChrYXJnLT5jYV9leHBvcnQuZXhfYW5vbl9naWQsIGthcmctPmNhX2V4cG9ydC5leF9hbm9uX2dpZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjb21wYXRfbmZzX2dldGZkX3RyYW5zKHN0cnVjdCBuZnNjdGxfYXJnICprYXJnLAotCQkJCXN0cnVjdCBjb21wYXRfbmZzY3RsX2FyZyBfX3VzZXIgKmFyZykKLXsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgJmFyZy0+Y2EzMl9nZXRmZCwKLQkJCXNpemVvZihhcmctPmNhMzJfZ2V0ZmQpKSB8fAotCQlnZXRfdXNlcihrYXJnLT5jYV92ZXJzaW9uLCAmYXJnLT5jYTMyX3ZlcnNpb24pIHx8Ci0JCV9fY29weV9mcm9tX3VzZXIoJmthcmctPmNhX2dldGZkLmdkX2FkZHIsCi0JCQkJJmFyZy0+Y2EzMl9nZXRmZC5nZDMyX2FkZHIsCi0JCQkJKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSkgfHwKLQkJX19jb3B5X2Zyb21fdXNlcigma2FyZy0+Y2FfZ2V0ZmQuZ2RfcGF0aCwKLQkJCQkmYXJnLT5jYTMyX2dldGZkLmdkMzJfcGF0aCwKLQkJCQkoTkZTX01BWFBBVEhMRU4rMSkpIHx8Ci0JCV9fZ2V0X3VzZXIoa2FyZy0+Y2FfZ2V0ZmQuZ2RfdmVyc2lvbiwKLQkJCQkmYXJnLT5jYTMyX2dldGZkLmdkMzJfdmVyc2lvbikpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29tcGF0X25mc19nZXRmc190cmFucyhzdHJ1Y3QgbmZzY3RsX2FyZyAqa2FyZywKLQkJCQlzdHJ1Y3QgY29tcGF0X25mc2N0bF9hcmcgX191c2VyICphcmcpCi17Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsJmFyZy0+Y2EzMl9nZXRmcyxzaXplb2YoYXJnLT5jYTMyX2dldGZzKSkgfHwKLQkJZ2V0X3VzZXIoa2FyZy0+Y2FfdmVyc2lvbiwgJmFyZy0+Y2EzMl92ZXJzaW9uKSB8fAotCQlfX2NvcHlfZnJvbV91c2VyKCZrYXJnLT5jYV9nZXRmcy5nZF9hZGRyLAotCQkJCSZhcmctPmNhMzJfZ2V0ZnMuZ2QzMl9hZGRyLAotCQkJCShzaXplb2Yoc3RydWN0IHNvY2thZGRyKSkpIHx8Ci0JCV9fY29weV9mcm9tX3VzZXIoJmthcmctPmNhX2dldGZzLmdkX3BhdGgsCi0JCQkJJmFyZy0+Y2EzMl9nZXRmcy5nZDMyX3BhdGgsCi0JCQkJKE5GU19NQVhQQVRITEVOKzEpKSB8fAotCQlfX2dldF91c2VyKGthcmctPmNhX2dldGZzLmdkX21heGxlbiwKLQkJCQkmYXJnLT5jYTMyX2dldGZzLmdkMzJfbWF4bGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyByZWFsbHkgZG9lc24ndCBuZWVkIHRyYW5zbGF0aW9ucywgd2UgYXJlIG9ubHkgcGFzc2luZwotICogYmFjayBhIHVuaW9uIHdoaWNoIGNvbnRhaW5zIG9wYXF1ZSBuZnMgZmlsZSBoYW5kbGUgZGF0YS4KLSAqLwotc3RhdGljIGludCBjb21wYXRfbmZzX2dldGZoX3Jlc190cmFucyh1bmlvbiBuZnNjdGxfcmVzICprcmVzLAotCQkJCXVuaW9uIGNvbXBhdF9uZnNjdGxfcmVzIF9fdXNlciAqcmVzKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBjb3B5X3RvX3VzZXIocmVzLCBrcmVzLCBzaXplb2YoKnJlcykpOwotCi0JcmV0dXJuIChlcnIpID8gLUVGQVVMVCA6IDA7Ci19Ci0KLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25mc3NlcnZjdGwoaW50IGNtZCwKLQkJCQlzdHJ1Y3QgY29tcGF0X25mc2N0bF9hcmcgX191c2VyICphcmcsCi0JCQkJdW5pb24gY29tcGF0X25mc2N0bF9yZXMgX191c2VyICpyZXMpCi17Ci0Jc3RydWN0IG5mc2N0bF9hcmcgKmthcmc7Ci0JdW5pb24gbmZzY3RsX3JlcyAqa3JlczsKLQltbV9zZWdtZW50X3Qgb2xkZnM7Ci0JaW50IGVycjsKLQotCWthcmcgPSBrbWFsbG9jKHNpemVvZigqa2FyZyksIEdGUF9VU0VSKTsKLQlrcmVzID0ga21hbGxvYyhzaXplb2YoKmtyZXMpLCBHRlBfVVNFUik7Ci0JaWYoIWthcmcgfHwgIWtyZXMpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXN3aXRjaChjbWQpIHsKLQljYXNlIE5GU0NUTF9TVkM6Ci0JCWVyciA9IGNvbXBhdF9uZnNfc3ZjX3RyYW5zKGthcmcsIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNDVExfQUREQ0xJRU5UOgotCQllcnIgPSBjb21wYXRfbmZzX2NsbnRfdHJhbnMoa2FyZywgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE5GU0NUTF9ERUxDTElFTlQ6Ci0JCWVyciA9IGNvbXBhdF9uZnNfY2xudF90cmFucyhrYXJnLCBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgTkZTQ1RMX0VYUE9SVDoKLQljYXNlIE5GU0NUTF9VTkVYUE9SVDoKLQkJZXJyID0gY29tcGF0X25mc19leHBfdHJhbnMoa2FyZywgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE5GU0NUTF9HRVRGRDoKLQkJZXJyID0gY29tcGF0X25mc19nZXRmZF90cmFucyhrYXJnLCBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgTkZTQ1RMX0dFVEZTOgotCQllcnIgPSBjb21wYXRfbmZzX2dldGZzX3RyYW5zKGthcmcsIGFyZyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZXJyID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGVycikKLQkJZ290byBkb25lOwotCi0Jb2xkZnMgPSBnZXRfZnMoKTsKLQlzZXRfZnMoS0VSTkVMX0RTKTsKLQkvKiBUaGUgX191c2VyIHBvaW50ZXIgY2FzdHMgYXJlIHZhbGlkIGJlY2F1c2Ugb2YgdGhlIHNldF9mcygpICovCi0JZXJyID0gc3lzX25mc3NlcnZjdGwoY21kLCAodm9pZCBfX3VzZXIgKikga2FyZywgKHZvaWQgX191c2VyICopIGtyZXMpOwotCXNldF9mcyhvbGRmcyk7Ci0KLQlpZiAoZXJyKQotCQlnb3RvIGRvbmU7Ci0KLQlpZigoY21kID09IE5GU0NUTF9HRVRGRCkgfHwKLQkgICAoY21kID09IE5GU0NUTF9HRVRGUykpCi0JCWVyciA9IGNvbXBhdF9uZnNfZ2V0ZmhfcmVzX3RyYW5zKGtyZXMsIHJlcyk7Ci0KLWRvbmU6Ci0Ja2ZyZWUoa2FyZyk7Ci0Ja2ZyZWUoa3Jlcyk7Ci0JcmV0dXJuIGVycjsKLX0KLSNlbHNlIC8qICFORlNEICovCiBsb25nIGFzbWxpbmthZ2UgY29tcGF0X3N5c19uZnNzZXJ2Y3RsKGludCBjbWQsIHZvaWQgKm5vdHVzZWQsIHZvaWQgKm5vdHVzZWQyKQogewogCXJldHVybiBzeXNfbmlfc3lzY2FsbCgpOwogfQotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRVBPTEwKIApkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2lvY3RsLmMgYi9mcy9jb21wYXRfaW9jdGwuYwppbmRleCA2MWFiYjYzLi44YmUwODZlIDEwMDY0NAotLS0gYS9mcy9jb21wYXRfaW9jdGwuYworKysgYi9mcy9jb21wYXRfaW9jdGwuYwpAQCAtNjgsNiArNjgsOCBAQAogCiAjaWZkZWYgQ09ORklHX0JMT0NLCiAjaW5jbHVkZSA8bGludXgvbG9vcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CisjaW5jbHVkZSA8bGludXgvZmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KICNpbmNsdWRlIDxzY3NpL3NnLmg+CkBAIC05NDQsNiArOTQ2LDkgQEAKIElHTk9SRV9JT0NUTChMT09QX0NMUl9GRCkKIC8qIG1kIGNhbGxzIHRoaXMgb24gcmFuZG9tIGJsb2NrZGV2cyAqLwogSUdOT1JFX0lPQ1RMKFJBSURfVkVSU0lPTikKKy8qIHFlbXUvcWVtdS1pbWcgbWlnaHQgY2FsbCB0aGVzZSB0d28gb24gcGxhaW4gZmlsZXMgZm9yIHByb2JpbmcgKi8KK0lHTk9SRV9JT0NUTChDRFJPTV9EUklWRV9TVEFUVVMpCitJR05PUkVfSU9DVEwoRkRHRVRQUk0zMikKIC8qIFNHIHN0dWZmICovCiBDT01QQVRJQkxFX0lPQ1RMKFNHX1NFVF9USU1FT1VUKQogQ09NUEFUSUJMRV9JT0NUTChTR19HRVRfVElNRU9VVCkKZGlmZiAtLWdpdCBhL2ZzL2NyYW1mcy9pbm9kZS5jIGIvZnMvY3JhbWZzL2lub2RlLmMKaW5kZXggZTE0MTkzOS4uNzM5ZmI1OSAxMDA2NDQKLS0tIGEvZnMvY3JhbWZzL2lub2RlLmMKKysrIGIvZnMvY3JhbWZzL2lub2RlLmMKQEAgLTM3LDcgKzM3LDcgQEAKIC8qIFRoZXNlIG1hY3JvcyBtYXkgY2hhbmdlIGluIGZ1dHVyZSwgdG8gcHJvdmlkZSBiZXR0ZXIgc3RfaW5vIHNlbWFudGljcy4gKi8KICNkZWZpbmUgT0ZGU0VUKHgpCSgoeCktPmlfaW5vKQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjcmFtaW5vKHN0cnVjdCBjcmFtZnNfaW5vZGUgKmNpbm8sIHVuc2lnbmVkIGludCBvZmZzZXQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcmFtaW5vKGNvbnN0IHN0cnVjdCBjcmFtZnNfaW5vZGUgKmNpbm8sIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7CiAJaWYgKCFjaW5vLT5vZmZzZXQpCiAJCXJldHVybiBvZmZzZXQgKyAxOwpAQCAtNjEsNyArNjEsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlub2RlICpnZXRfY3JhbWZzX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0Jc3RydWN0IGNyYW1mc19pbm9kZSAqY3JhbWZzX2lub2RlLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQorCWNvbnN0IHN0cnVjdCBjcmFtZnNfaW5vZGUgKmNyYW1mc19pbm9kZSwgdW5zaWduZWQgaW50IG9mZnNldCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgemVyb3RpbWU7CkBAIC0zMTcsNyArMzE3LDcgQEAKIAkvKiBTZXQgaXQgYWxsIHVwLi4gKi8KIAlzYi0+c19vcCA9ICZjcmFtZnNfb3BzOwogCXJvb3QgPSBnZXRfY3JhbWZzX2lub2RlKHNiLCAmc3VwZXIucm9vdCwgMCk7Ci0JaWYgKCFyb290KQorCWlmIChJU19FUlIocm9vdCkpCiAJCWdvdG8gb3V0OwogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CiAJaWYgKCFzYi0+c19yb290KSB7CkBAIC00MjMsNiArNDIzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICogY3JhbWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKIAlpbnQgc29ydGVkOwogCiAJbXV0ZXhfbG9jaygmcmVhZF9tdXRleCk7CkBAIC00NDksOCArNDUwLDggQEAKIAogCQlmb3IgKDs7KSB7CiAJCQlpZiAoIW5hbWVsZW4pIHsKLQkJCQltdXRleF91bmxvY2soJnJlYWRfbXV0ZXgpOwotCQkJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCQkJCWlub2RlID0gRVJSX1BUUigtRUlPKTsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWlmIChuYW1lW25hbWVsZW4tMV0pCiAJCQkJYnJlYWs7CkBAIC00NjIsMTcgKzQ2MywxOCBAQAogCQlpZiAocmV0dmFsID4gMCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIXJldHZhbCkgewotCQkJc3RydWN0IGNyYW1mc19pbm9kZSBlbnRyeSA9ICpkZTsKLQkJCW11dGV4X3VubG9jaygmcmVhZF9tdXRleCk7Ci0JCQlkX2FkZChkZW50cnksIGdldF9jcmFtZnNfaW5vZGUoZGlyLT5pX3NiLCAmZW50cnksIGRpcl9vZmYpKTsKLQkJCXJldHVybiBOVUxMOworCQkJaW5vZGUgPSBnZXRfY3JhbWZzX2lub2RlKGRpci0+aV9zYiwgZGUsIGRpcl9vZmYpOworCQkJYnJlYWs7CiAJCX0KIAkJLyogZWxzZSAocmV0dmFsIDwgMCkgKi8KIAkJaWYgKHNvcnRlZCkKIAkJCWJyZWFrOwogCX0KK291dDoKIAltdXRleF91bmxvY2soJnJlYWRfbXV0ZXgpOwotCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggMzdmNzJlZS4uYmUxODU5OCAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTM0NCw2ICszNDQsMjQgQEAKIEVYUE9SVF9TWU1CT0woZF9kcm9wKTsKIAogLyoKKyAqIGRfY2xlYXJfbmVlZF9sb29rdXAgLSBkcm9wIGEgZGVudHJ5IGZyb20gY2FjaGUgYW5kIGNsZWFyIHRoZSBuZWVkIGxvb2t1cCBmbGFnCisgKiBAZGVudHJ5OiBkZW50cnkgdG8gZHJvcAorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2UgZG8gYSBsb29rdXAgb24gYSBwbGFjZWhvbGRlciBkZW50cnkgdGhhdCBuZWVkZWQgdG8gYmUKKyAqIGxvb2tlZCB1cC4gIFRoZSBkZW50cnkgc2hvdWxkIGhhdmUgYmVlbiBoYXNoZWQgaW4gb3JkZXIgZm9yIGl0IHRvIGJlIGZvdW5kIGJ5CisgKiB0aGUgbG9va3VwIGNvZGUsIGJ1dCBub3cgbmVlZHMgdG8gYmUgdW5oYXNoZWQgd2hpbGUgd2UgZG8gdGhlIGFjdHVhbCBsb29rdXAKKyAqIGFuZCBjbGVhciB0aGUgRENBQ0hFX05FRURfTE9PS1VQIGZsYWcuCisgKi8KK3ZvaWQgZF9jbGVhcl9uZWVkX2xvb2t1cChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJX19kX2Ryb3AoZGVudHJ5KTsKKwlkZW50cnktPmRfZmxhZ3MgJj0gfkRDQUNIRV9ORUVEX0xPT0tVUDsKKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworfQorRVhQT1JUX1NZTUJPTChkX2NsZWFyX25lZWRfbG9va3VwKTsKKworLyoKICAqIEZpbmlzaCBvZmYgYSBkZW50cnkgd2UndmUgZGVjaWRlZCB0byBraWxsLgogICogZGVudHJ5LT5kX2xvY2sgbXVzdCBiZSBoZWxkLCByZXR1cm5zIHdpdGggaXQgdW5sb2NrZWQuCiAgKiBJZiByZWYgaXMgbm9uLXplcm8sIHRoZW4gZGVjcmVtZW50IHRoZSByZWZjb3VudCB0b28uCkBAIC00MzIsOCArNDUwLDEzIEBACiAgCWlmIChkX3VuaGFzaGVkKGRlbnRyeSkpCiAJCWdvdG8ga2lsbF9pdDsKIAotCS8qIE90aGVyd2lzZSBsZWF2ZSBpdCBjYWNoZWQgYW5kIGVuc3VyZSBpdCdzIG9uIHRoZSBMUlUgKi8KLQlkZW50cnktPmRfZmxhZ3MgfD0gRENBQ0hFX1JFRkVSRU5DRUQ7CisJLyoKKwkgKiBJZiB0aGlzIGRlbnRyeSBuZWVkcyBsb29rdXAsIGRvbid0IHNldCB0aGUgcmVmZXJlbmNlZCBmbGFnIHNvIHRoYXQgaXQKKwkgKiBpcyBtb3JlIGxpa2VseSB0byBiZSBjbGVhbmVkIHVwIGJ5IHRoZSBkY2FjaGUgc2hyaW5rZXIgaW4gY2FzZSBvZgorCSAqIG1lbW9yeSBwcmVzc3VyZS4KKwkgKi8KKwlpZiAoIWRfbmVlZF9sb29rdXAoZGVudHJ5KSkKKwkJZGVudHJ5LT5kX2ZsYWdzIHw9IERDQUNIRV9SRUZFUkVOQ0VEOwogCWRlbnRyeV9scnVfYWRkKGRlbnRyeSk7CiAKIAlkZW50cnktPmRfY291bnQtLTsKQEAgLTUyNiwxMCArNTQ5LDYgQEAKIAkgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CiAJcmV0ID0gZGVudHJ5LT5kX3BhcmVudDsKLQlpZiAoIXJldCkgewotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJZ290byBvdXQ7Ci0JfQogCXNwaW5fbG9jaygmcmV0LT5kX2xvY2spOwogCWlmICh1bmxpa2VseShyZXQgIT0gZGVudHJ5LT5kX3BhcmVudCkpIHsKIAkJc3Bpbl91bmxvY2soJnJldC0+ZF9sb2NrKTsKQEAgLTU0MCw3ICs1NTksNiBAQAogCUJVR19PTighcmV0LT5kX2NvdW50KTsKIAlyZXQtPmRfY291bnQrKzsKIAlzcGluX3VubG9jaygmcmV0LT5kX2xvY2spOwotb3V0OgogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGRnZXRfcGFyZW50KTsKQEAgLTcyMCwxMyArNzM4LDExIEBACiAgKgogICogSWYgZmxhZ3MgY29udGFpbnMgRENBQ0hFX1JFRkVSRU5DRUQgcmVmZXJlbmNlIGRlbnRyaWVzIHdpbGwgbm90IGJlIHBydW5lZC4KICAqLwotc3RhdGljIHZvaWQgX19zaHJpbmtfZGNhY2hlX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqY291bnQsIGludCBmbGFncykKK3N0YXRpYyB2b2lkIF9fc2hyaW5rX2RjYWNoZV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgY291bnQsIGludCBmbGFncykKIHsKLQkvKiBjYWxsZWQgZnJvbSBwcnVuZV9kY2FjaGUoKSBhbmQgc2hyaW5rX2RjYWNoZV9wYXJlbnQoKSAqLwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlMSVNUX0hFQUQocmVmZXJlbmNlZCk7CiAJTElTVF9IRUFEKHRtcCk7Ci0JaW50IGNudCA9ICpjb3VudDsKIAogcmVsb2NrOgogCXNwaW5fbG9jaygmZGNhY2hlX2xydV9sb2NrKTsKQEAgLTc1NCw3ICs3NzAsNyBAQAogCQl9IGVsc2UgewogCQkJbGlzdF9tb3ZlX3RhaWwoJmRlbnRyeS0+ZF9scnUsICZ0bXApOwogCQkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQkJCWlmICghLS1jbnQpCisJCQlpZiAoIS0tY291bnQpCiAJCQkJYnJlYWs7CiAJCX0KIAkJY29uZF9yZXNjaGVkX2xvY2soJmRjYWNoZV9scnVfbG9jayk7CkBAIC03NjQsODMgKzc4MCwyMiBAQAogCXNwaW5fdW5sb2NrKCZkY2FjaGVfbHJ1X2xvY2spOwogCiAJc2hyaW5rX2RlbnRyeV9saXN0KCZ0bXApOwotCi0JKmNvdW50ID0gY250OwogfQogCiAvKioKLSAqIHBydW5lX2RjYWNoZSAtIHNocmluayB0aGUgZGNhY2hlCi0gKiBAY291bnQ6IG51bWJlciBvZiBlbnRyaWVzIHRvIHRyeSB0byBmcmVlCisgKiBwcnVuZV9kY2FjaGVfc2IgLSBzaHJpbmsgdGhlIGRjYWNoZQorICogQG5yX3RvX3NjYW46IG51bWJlciBvZiBlbnRyaWVzIHRvIHRyeSB0byBmcmVlCiAgKgotICogU2hyaW5rIHRoZSBkY2FjaGUuIFRoaXMgaXMgZG9uZSB3aGVuIHdlIG5lZWQgbW9yZSBtZW1vcnksIG9yIHNpbXBseSB3aGVuIHdlCi0gKiBuZWVkIHRvIHVubW91bnQgc29tZXRoaW5nIChhdCB3aGljaCBwb2ludCB3ZSBuZWVkIHRvIHVudXNlIGFsbCBkZW50cmllcykuCisgKiBBdHRlbXB0IHRvIHNocmluayB0aGUgc3VwZXJibG9jayBkY2FjaGUgTFJVIGJ5IEBucl90b19zY2FuIGVudHJpZXMuIFRoaXMgaXMKKyAqIGRvbmUgd2hlbiB3ZSBuZWVkIG1vcmUgbWVtb3J5IGFuIGNhbGxlZCBmcm9tIHRoZSBzdXBlcmJsb2NrIHNocmlua2VyCisgKiBmdW5jdGlvbi4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIG1heSBmYWlsIHRvIGZyZWUgYW55IHJlc291cmNlcyBpZiBhbGwgdGhlIGRlbnRyaWVzIGFyZSBpbiB1c2UuCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBmYWlsIHRvIGZyZWUgYW55IHJlc291cmNlcyBpZiBhbGwgdGhlIGRlbnRyaWVzIGFyZSBpbgorICogdXNlLgogICovCi1zdGF0aWMgdm9pZCBwcnVuZV9kY2FjaGUoaW50IGNvdW50KQordm9pZCBwcnVuZV9kY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG5yX3RvX3NjYW4pCiB7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgKnAgPSBOVUxMOwotCWludCB3X2NvdW50OwotCWludCB1bnVzZWQgPSBkZW50cnlfc3RhdC5ucl91bnVzZWQ7Ci0JaW50IHBydW5lX3JhdGlvOwotCWludCBwcnVuZWQ7Ci0KLQlpZiAodW51c2VkID09IDAgfHwgY291bnQgPT0gMCkKLQkJcmV0dXJuOwotCWlmIChjb3VudCA+PSB1bnVzZWQpCi0JCXBydW5lX3JhdGlvID0gMTsKLQllbHNlCi0JCXBydW5lX3JhdGlvID0gdW51c2VkIC8gY291bnQ7Ci0Jc3Bpbl9sb2NrKCZzYl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNiLCAmc3VwZXJfYmxvY2tzLCBzX2xpc3QpIHsKLQkJaWYgKGxpc3RfZW1wdHkoJnNiLT5zX2luc3RhbmNlcykpCi0JCQljb250aW51ZTsKLQkJaWYgKHNiLT5zX25yX2RlbnRyeV91bnVzZWQgPT0gMCkKLQkJCWNvbnRpbnVlOwotCQlzYi0+c19jb3VudCsrOwotCQkvKiBOb3csIHdlIHJlY2xhaW0gdW51c2VkIGRlbnRyaW5zIHdpdGggZmFpcm5lc3MuCi0JCSAqIFdlIHJlY2xhaW0gdGhlbSBzYW1lIHBlcmNlbnRhZ2UgZnJvbSBlYWNoIHN1cGVyYmxvY2suCi0JCSAqIFdlIGNhbGN1bGF0ZSBudW1iZXIgb2YgZGVudHJpZXMgdG8gc2NhbiBvbiB0aGlzIHNiCi0JCSAqIGFzIGZvbGxvd3MsIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gaXMgYXJyYW5nZWQgdG8gYXZvaWQKLQkJICogb3ZlcmZsb3dzOgotCQkgKiBudW1iZXIgb2YgZGVudHJpZXMgdG8gc2NhbiBvbiB0aGlzIHNiID0KLQkJICogY291bnQgKiAobnVtYmVyIG9mIGRlbnRyaWVzIG9uIHRoaXMgc2IgLwotCQkgKiBudW1iZXIgb2YgZGVudHJpZXMgaW4gdGhlIG1hY2hpbmUpCi0JCSAqLwotCQlzcGluX3VubG9jaygmc2JfbG9jayk7Ci0JCWlmIChwcnVuZV9yYXRpbyAhPSAxKQotCQkJd19jb3VudCA9IChzYi0+c19ucl9kZW50cnlfdW51c2VkIC8gcHJ1bmVfcmF0aW8pICsgMTsKLQkJZWxzZQotCQkJd19jb3VudCA9IHNiLT5zX25yX2RlbnRyeV91bnVzZWQ7Ci0JCXBydW5lZCA9IHdfY291bnQ7Ci0JCS8qCi0JCSAqIFdlIG5lZWQgdG8gYmUgc3VyZSB0aGlzIGZpbGVzeXN0ZW0gaXNuJ3QgYmVpbmcgdW5tb3VudGVkLAotCQkgKiBvdGhlcndpc2Ugd2UgY291bGQgcmFjZSB3aXRoIGdlbmVyaWNfc2h1dGRvd25fc3VwZXIoKSwgYW5kCi0JCSAqIGVuZCB1cCBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIGFuIGlub2RlIHdoaWxlIHRoZSBmaWxlc3lzdGVtCi0JCSAqIGlzIHVubW91bnRlZC4gIFNvIHdlIHRyeSB0byBnZXQgc191bW91bnQsIGFuZCBtYWtlIHN1cmUKLQkJICogc19yb290IGlzbid0IE5VTEwuCi0JCSAqLwotCQlpZiAoZG93bl9yZWFkX3RyeWxvY2soJnNiLT5zX3Vtb3VudCkpIHsKLQkJCWlmICgoc2ItPnNfcm9vdCAhPSBOVUxMKSAmJgotCQkJICAgICghbGlzdF9lbXB0eSgmc2ItPnNfZGVudHJ5X2xydSkpKSB7Ci0JCQkJX19zaHJpbmtfZGNhY2hlX3NiKHNiLCAmd19jb3VudCwKLQkJCQkJCURDQUNIRV9SRUZFUkVOQ0VEKTsKLQkJCQlwcnVuZWQgLT0gd19jb3VudDsKLQkJCX0KLQkJCXVwX3JlYWQoJnNiLT5zX3Vtb3VudCk7Ci0JCX0KLQkJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKLQkJaWYgKHApCi0JCQlfX3B1dF9zdXBlcihwKTsKLQkJY291bnQgLT0gcHJ1bmVkOwotCQlwID0gc2I7Ci0JCS8qIG1vcmUgd29yayBsZWZ0IHRvIGRvPyAqLwotCQlpZiAoY291bnQgPD0gMCkKLQkJCWJyZWFrOwotCX0KLQlpZiAocCkKLQkJX19wdXRfc3VwZXIocCk7Ci0Jc3Bpbl91bmxvY2soJnNiX2xvY2spOworCV9fc2hyaW5rX2RjYWNoZV9zYihzYiwgbnJfdG9fc2NhbiwgRENBQ0hFX1JFRkVSRU5DRUQpOwogfQogCiAvKioKQEAgLTEyMTUsNDUgKzExNzAsMTMgQEAKIAlpbnQgZm91bmQ7CiAKIAl3aGlsZSAoKGZvdW5kID0gc2VsZWN0X3BhcmVudChwYXJlbnQpKSAhPSAwKQotCQlfX3Nocmlua19kY2FjaGVfc2Ioc2IsICZmb3VuZCwgMCk7CisJCV9fc2hyaW5rX2RjYWNoZV9zYihzYiwgZm91bmQsIDApOwogfQogRVhQT1JUX1NZTUJPTChzaHJpbmtfZGNhY2hlX3BhcmVudCk7CiAKLS8qCi0gKiBTY2FuIGBzYy0+bnJfc2xhYl90b19yZWNsYWltJyBkZW50cmllcyBhbmQgcmV0dXJuIHRoZSBudW1iZXIgd2hpY2ggcmVtYWluLgotICoKLSAqIFdlIG5lZWQgdG8gYXZvaWQgcmVlbnRlcmluZyB0aGUgZmlsZXN5c3RlbSBpZiB0aGUgY2FsbGVyIGlzIHBlcmZvcm1pbmcgYQotICogR0ZQX05PRlMgYWxsb2NhdGlvbiBhdHRlbXB0LiAgT25lIGV4YW1wbGUgZGVhZGxvY2sgaXM6Ci0gKgotICogZXh0Ml9uZXdfYmxvY2stPmdldGJsay0+R0ZQLT5zaHJpbmtfZGNhY2hlX21lbW9yeS0+cHJ1bmVfZGNhY2hlLT4KLSAqIHBydW5lX29uZV9kZW50cnktPmRwdXQtPmRlbnRyeV9pcHV0LT5pcHV0LT5pbm9kZS0+aV9zYi0+c19vcC0+cHV0X2lub2RlLT4KLSAqIGV4dDJfZGlzY2FyZF9wcmVhbGxvYy0+ZXh0Ml9mcmVlX2Jsb2Nrcy0+bG9ja19zdXBlci0+REVBRExPQ0suCi0gKgotICogSW4gdGhpcyBjYXNlIHdlIHJldHVybiAtMSB0byB0ZWxsIHRoZSBjYWxsZXIgdGhhdCB3ZSBiYWxlZC4KLSAqLwotc3RhdGljIGludCBzaHJpbmtfZGNhY2hlX21lbW9yeShzdHJ1Y3Qgc2hyaW5rZXIgKnNocmluaywKLQkJCQlzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQotewotCWludCBuciA9IHNjLT5ucl90b19zY2FuOwotCWdmcF90IGdmcF9tYXNrID0gc2MtPmdmcF9tYXNrOwotCi0JaWYgKG5yKSB7Ci0JCWlmICghKGdmcF9tYXNrICYgX19HRlBfRlMpKQotCQkJcmV0dXJuIC0xOwotCQlwcnVuZV9kY2FjaGUobnIpOwotCX0KLQotCXJldHVybiAoZGVudHJ5X3N0YXQubnJfdW51c2VkIC8gMTAwKSAqIHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgZGNhY2hlX3Nocmlua2VyID0gewotCS5zaHJpbmsgPSBzaHJpbmtfZGNhY2hlX21lbW9yeSwKLQkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAotfTsKLQogLyoqCi0gKiBkX2FsbG9jCS0JYWxsb2NhdGUgYSBkY2FjaGUgZW50cnkKLSAqIEBwYXJlbnQ6IHBhcmVudCBvZiBlbnRyeSB0byBhbGxvY2F0ZQorICogX19kX2FsbG9jCS0JYWxsb2NhdGUgYSBkY2FjaGUgZW50cnkKKyAqIEBzYjogZmlsZXN5c3RlbSBpdCB3aWxsIGJlbG9uZyB0bwogICogQG5hbWU6IHFzdHIgb2YgdGhlIG5hbWUKICAqCiAgKiBBbGxvY2F0ZXMgYSBkZW50cnkuIEl0IHJldHVybnMgJU5VTEwgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IG1lbW9yeQpAQCAtMTI2MSw3ICsxMTg0LDcgQEAKICAqIGNvcGllZCBhbmQgdGhlIGNvcHkgcGFzc2VkIGluIG1heSBiZSByZXVzZWQgYWZ0ZXIgdGhpcyBjYWxsLgogICovCiAgCi1zdHJ1Y3QgZGVudHJ5ICpkX2FsbG9jKHN0cnVjdCBkZW50cnkgKiBwYXJlbnQsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKQorc3RydWN0IGRlbnRyeSAqX19kX2FsbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAljaGFyICpkbmFtZTsKQEAgLTEyOTEsOCArMTIxNCw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJmRlbnRyeS0+ZF9sb2NrKTsKIAlzZXFjb3VudF9pbml0KCZkZW50cnktPmRfc2VxKTsKIAlkZW50cnktPmRfaW5vZGUgPSBOVUxMOwotCWRlbnRyeS0+ZF9wYXJlbnQgPSBOVUxMOwotCWRlbnRyeS0+ZF9zYiA9IE5VTEw7CisJZGVudHJ5LT5kX3BhcmVudCA9IGRlbnRyeTsKKwlkZW50cnktPmRfc2IgPSBzYjsKIAlkZW50cnktPmRfb3AgPSBOVUxMOwogCWRlbnRyeS0+ZF9mc2RhdGEgPSBOVUxMOwogCUlOSVRfSExJU1RfQkxfTk9ERSgmZGVudHJ5LT5kX2hhc2gpOwpAQCAtMTMwMCwzNiArMTIyMyw0NyBAQAogCUlOSVRfTElTVF9IRUFEKCZkZW50cnktPmRfc3ViZGlycyk7CiAJSU5JVF9MSVNUX0hFQUQoJmRlbnRyeS0+ZF9hbGlhcyk7CiAJSU5JVF9MSVNUX0hFQUQoJmRlbnRyeS0+ZF91LmRfY2hpbGQpOwotCi0JaWYgKHBhcmVudCkgewotCQlzcGluX2xvY2soJnBhcmVudC0+ZF9sb2NrKTsKLQkJLyoKLQkJICogZG9uJ3QgbmVlZCBjaGlsZCBsb2NrIGJlY2F1c2UgaXQgaXMgbm90IHN1YmplY3QKLQkJICogdG8gY29uY3VycmVuY3kgaGVyZQotCQkgKi8KLQkJX19kZ2V0X2Rsb2NrKHBhcmVudCk7Ci0JCWRlbnRyeS0+ZF9wYXJlbnQgPSBwYXJlbnQ7Ci0JCWRlbnRyeS0+ZF9zYiA9IHBhcmVudC0+ZF9zYjsKLQkJZF9zZXRfZF9vcChkZW50cnksIGRlbnRyeS0+ZF9zYi0+c19kX29wKTsKLQkJbGlzdF9hZGQoJmRlbnRyeS0+ZF91LmRfY2hpbGQsICZwYXJlbnQtPmRfc3ViZGlycyk7Ci0JCXNwaW5fdW5sb2NrKCZwYXJlbnQtPmRfbG9jayk7Ci0JfQorCWRfc2V0X2Rfb3AoZGVudHJ5LCBkZW50cnktPmRfc2ItPnNfZF9vcCk7CiAKIAl0aGlzX2NwdV9pbmMobnJfZGVudHJ5KTsKIAogCXJldHVybiBkZW50cnk7CiB9CisKKy8qKgorICogZF9hbGxvYwktCWFsbG9jYXRlIGEgZGNhY2hlIGVudHJ5CisgKiBAcGFyZW50OiBwYXJlbnQgb2YgZW50cnkgdG8gYWxsb2NhdGUKKyAqIEBuYW1lOiBxc3RyIG9mIHRoZSBuYW1lCisgKgorICogQWxsb2NhdGVzIGEgZGVudHJ5LiBJdCByZXR1cm5zICVOVUxMIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudCBtZW1vcnkKKyAqIGF2YWlsYWJsZS4gT24gYSBzdWNjZXNzIHRoZSBkZW50cnkgaXMgcmV0dXJuZWQuIFRoZSBuYW1lIHBhc3NlZCBpbiBpcworICogY29waWVkIGFuZCB0aGUgY29weSBwYXNzZWQgaW4gbWF5IGJlIHJldXNlZCBhZnRlciB0aGlzIGNhbGwuCisgKi8KK3N0cnVjdCBkZW50cnkgKmRfYWxsb2Moc3RydWN0IGRlbnRyeSAqIHBhcmVudCwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gX19kX2FsbG9jKHBhcmVudC0+ZF9zYiwgbmFtZSk7CisJaWYgKCFkZW50cnkpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrKCZwYXJlbnQtPmRfbG9jayk7CisJLyoKKwkgKiBkb24ndCBuZWVkIGNoaWxkIGxvY2sgYmVjYXVzZSBpdCBpcyBub3Qgc3ViamVjdAorCSAqIHRvIGNvbmN1cnJlbmN5IGhlcmUKKwkgKi8KKwlfX2RnZXRfZGxvY2socGFyZW50KTsKKwlkZW50cnktPmRfcGFyZW50ID0gcGFyZW50OworCWxpc3RfYWRkKCZkZW50cnktPmRfdS5kX2NoaWxkLCAmcGFyZW50LT5kX3N1YmRpcnMpOworCXNwaW5fdW5sb2NrKCZwYXJlbnQtPmRfbG9jayk7CisKKwlyZXR1cm4gZGVudHJ5OworfQogRVhQT1JUX1NZTUJPTChkX2FsbG9jKTsKIAogc3RydWN0IGRlbnRyeSAqZF9hbGxvY19wc2V1ZG8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZF9hbGxvYyhOVUxMLCBuYW1lKTsKLQlpZiAoZGVudHJ5KSB7Ci0JCWRlbnRyeS0+ZF9zYiA9IHNiOwotCQlkX3NldF9kX29wKGRlbnRyeSwgZGVudHJ5LT5kX3NiLT5zX2Rfb3ApOwotCQlkZW50cnktPmRfcGFyZW50ID0gZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IF9fZF9hbGxvYyhzYiwgbmFtZSk7CisJaWYgKGRlbnRyeSkKIAkJZGVudHJ5LT5kX2ZsYWdzIHw9IERDQUNIRV9ESVNDT05ORUNURUQ7Ci0JfQogCXJldHVybiBkZW50cnk7CiB9CiBFWFBPUlRfU1lNQk9MKGRfYWxsb2NfcHNldWRvKTsKQEAgLTE0OTksMTMgKzE0MzMsOSBAQAogCWlmIChyb290X2lub2RlKSB7CiAJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcXN0ciBuYW1lID0geyAubmFtZSA9ICIvIiwgLmxlbiA9IDEgfTsKIAotCQlyZXMgPSBkX2FsbG9jKE5VTEwsICZuYW1lKTsKLQkJaWYgKHJlcykgewotCQkJcmVzLT5kX3NiID0gcm9vdF9pbm9kZS0+aV9zYjsKLQkJCWRfc2V0X2Rfb3AocmVzLCByZXMtPmRfc2ItPnNfZF9vcCk7Ci0JCQlyZXMtPmRfcGFyZW50ID0gcmVzOworCQlyZXMgPSBfX2RfYWxsb2Mocm9vdF9pbm9kZS0+aV9zYiwgJm5hbWUpOworCQlpZiAocmVzKQogCQkJZF9pbnN0YW50aWF0ZShyZXMsIHJvb3RfaW5vZGUpOwotCQl9CiAJfQogCXJldHVybiByZXM7CiB9CkBAIC0xNTY2LDEzICsxNDk2LDExIEBACiAJaWYgKHJlcykKIAkJZ290byBvdXRfaXB1dDsKIAotCXRtcCA9IGRfYWxsb2MoTlVMTCwgJmFub25zdHJpbmcpOworCXRtcCA9IF9fZF9hbGxvYyhpbm9kZS0+aV9zYiwgJmFub25zdHJpbmcpOwogCWlmICghdG1wKSB7CiAJCXJlcyA9IEVSUl9QVFIoLUVOT01FTSk7CiAJCWdvdG8gb3V0X2lwdXQ7CiAJfQotCXRtcC0+ZF9wYXJlbnQgPSB0bXA7IC8qIG1ha2Ugc3VyZSBkcHV0IGRvZXNuJ3QgY3JvYWsgKi8KLQogCiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAlyZXMgPSBfX2RfZmluZF9hbnlfYWxpYXMoaW5vZGUpOwpAQCAtMTU4NCw4ICsxNTEyLDYgQEAKIAogCS8qIGF0dGFjaCBhIGRpc2Nvbm5lY3RlZCBkZW50cnkgKi8KIAlzcGluX2xvY2soJnRtcC0+ZF9sb2NrKTsKLQl0bXAtPmRfc2IgPSBpbm9kZS0+aV9zYjsKLQlkX3NldF9kX29wKHRtcCwgdG1wLT5kX3NiLT5zX2Rfb3ApOwogCXRtcC0+ZF9pbm9kZSA9IGlub2RlOwogCXRtcC0+ZF9mbGFncyB8PSBEQ0FDSEVfRElTQ09OTkVDVEVEOwogCWxpc3RfYWRkKCZ0bXAtPmRfYWxpYXMsICZpbm9kZS0+aV9kZW50cnkpOwpAQCAtMTYyNiw2ICsxNTUyLDkgQEAKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpuZXcgPSBOVUxMOwogCisJaWYgKElTX0VSUihpbm9kZSkpCisJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CisKIAlpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCQluZXcgPSBfX2RfZmluZF9hbGlhcyhpbm9kZSwgMSk7CkBAIC0xNzA4LDI5ICsxNjM3LDIyIEBACiAJfQogCiAJLyoKKwkgKiBXZSBhcmUgZ29pbmcgdG8gaW5zdGFudGlhdGUgdGhpcyBkZW50cnksIHVuaGFzaCBpdCBhbmQgY2xlYXIgdGhlCisJICogbG9va3VwIGZsYWcgc28gd2UgY2FuIGRvIHRoYXQuCisJICovCisJaWYgKHVubGlrZWx5KGRfbmVlZF9sb29rdXAoZm91bmQpKSkKKwkJZF9jbGVhcl9uZWVkX2xvb2t1cChmb3VuZCk7CisKKwkvKgogCSAqIE5lZ2F0aXZlIGRlbnRyeTogaW5zdGFudGlhdGUgaXQgdW5sZXNzIHRoZSBpbm9kZSBpcyBhIGRpcmVjdG9yeSBhbmQKIAkgKiBhbHJlYWR5IGhhcyBhIGRlbnRyeS4KIAkgKi8KLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBsaXN0X2VtcHR5KCZpbm9kZS0+aV9kZW50cnkpKSB7Ci0JCV9fZF9pbnN0YW50aWF0ZShmb3VuZCwgaW5vZGUpOwotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JCXNlY3VyaXR5X2RfaW5zdGFudGlhdGUoZm91bmQsIGlub2RlKTsKLQkJcmV0dXJuIGZvdW5kOworCW5ldyA9IGRfc3BsaWNlX2FsaWFzKGlub2RlLCBmb3VuZCk7CisJaWYgKG5ldykgeworCQlkcHV0KGZvdW5kKTsKKwkJZm91bmQgPSBuZXc7CiAJfQotCi0JLyoKLQkgKiBJbiBjYXNlIGEgZGlyZWN0b3J5IGFscmVhZHkgaGFzIGEgKGRpc2Nvbm5lY3RlZCkgZW50cnkgZ3JhYiBhCi0JICogcmVmZXJlbmNlIHRvIGl0LCBtb3ZlIGl0IGluIHBsYWNlIGFuZCB1c2UgaXQuCi0JICovCi0JbmV3ID0gbGlzdF9lbnRyeShpbm9kZS0+aV9kZW50cnkubmV4dCwgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7Ci0JX19kZ2V0KG5ldyk7Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwotCXNlY3VyaXR5X2RfaW5zdGFudGlhdGUoZm91bmQsIGlub2RlKTsKLQlkX21vdmUobmV3LCBmb3VuZCk7Ci0JaXB1dChpbm9kZSk7Ci0JZHB1dChmb3VuZCk7Ci0JcmV0dXJuIG5ldzsKKwlyZXR1cm4gZm91bmQ7CiAKIGVycl9vdXQ6CiAJaXB1dChpbm9kZSk7CkBAIC0xODEzLDggKzE3MzUsNiBAQAogCQl0bmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CiAJCWkgPSBkZW50cnktPmRfaW5vZGU7CiAJCXByZWZldGNoKHRuYW1lKTsKLQkJaWYgKGkpCi0JCQlwcmVmZXRjaChpKTsKIAkJLyoKIAkJICogVGhpcyBzZXFjb3VudCBjaGVjayBpcyByZXF1aXJlZCB0byBlbnN1cmUgbmFtZSBhbmQKIAkJICogbGVuIGFyZSBsb2FkZWQgYXRvbWljYWxseSwgc28gYXMgbm90IHRvIHdhbGsgb2ZmIHRoZQpAQCAtMjIxMywxNCArMjEzMywxNSBAQAogICogVGhlIGhhc2ggdmFsdWUgaGFzIHRvIG1hdGNoIHRoZSBoYXNoIHF1ZXVlIHRoYXQgdGhlIGRlbnRyeSBpcyBvbi4uCiAgKi8KIC8qCi0gKiBkX21vdmUgLSBtb3ZlIGEgZGVudHJ5CisgKiBfX2RfbW92ZSAtIG1vdmUgYSBkZW50cnkKICAqIEBkZW50cnk6IGVudHJ5IHRvIG1vdmUKICAqIEB0YXJnZXQ6IG5ldyBkZW50cnkKICAqCiAgKiBVcGRhdGUgdGhlIGRjYWNoZSB0byByZWZsZWN0IHRoZSBtb3ZlIG9mIGEgZmlsZSBuYW1lLiBOZWdhdGl2ZQotICogZGNhY2hlIGVudHJpZXMgc2hvdWxkIG5vdCBiZSBtb3ZlZCBpbiB0aGlzIHdheS4KKyAqIGRjYWNoZSBlbnRyaWVzIHNob3VsZCBub3QgYmUgbW92ZWQgaW4gdGhpcyB3YXkuICBDYWxsZXIgaG9sZAorICogcmVuYW1lX2xvY2suCiAgKi8KLXZvaWQgZF9tb3ZlKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBkZW50cnkgKiB0YXJnZXQpCitzdGF0aWMgdm9pZCBfX2RfbW92ZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICogdGFyZ2V0KQogewogCWlmICghZGVudHJ5LT5kX2lub2RlKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJWRlM6IG1vdmluZyBuZWdhdGl2ZSBkY2FjaGUgZW50cnlcbiIpOwpAQCAtMjIyOCw4ICsyMTQ5LDYgQEAKIAlCVUdfT04oZF9hbmNlc3RvcihkZW50cnksIHRhcmdldCkpOwogCUJVR19PTihkX2FuY2VzdG9yKHRhcmdldCwgZGVudHJ5KSk7CiAKLQl3cml0ZV9zZXFsb2NrKCZyZW5hbWVfbG9jayk7Ci0KIAlkZW50cnlfbG9ja19mb3JfbW92ZShkZW50cnksIHRhcmdldCk7CiAKIAl3cml0ZV9zZXFjb3VudF9iZWdpbigmZGVudHJ5LT5kX3NlcSk7CkBAIC0yMjc1LDYgKzIxOTQsMjAgQEAKIAlzcGluX3VubG9jaygmdGFyZ2V0LT5kX2xvY2spOwogCWZzbm90aWZ5X2RfbW92ZShkZW50cnkpOwogCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7Cit9CisKKy8qCisgKiBkX21vdmUgLSBtb3ZlIGEgZGVudHJ5CisgKiBAZGVudHJ5OiBlbnRyeSB0byBtb3ZlCisgKiBAdGFyZ2V0OiBuZXcgZGVudHJ5CisgKgorICogVXBkYXRlIHRoZSBkY2FjaGUgdG8gcmVmbGVjdCB0aGUgbW92ZSBvZiBhIGZpbGUgbmFtZS4gTmVnYXRpdmUKKyAqIGRjYWNoZSBlbnRyaWVzIHNob3VsZCBub3QgYmUgbW92ZWQgaW4gdGhpcyB3YXkuCisgKi8KK3ZvaWQgZF9tb3ZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGRlbnRyeSAqdGFyZ2V0KQoreworCXdyaXRlX3NlcWxvY2soJnJlbmFtZV9sb2NrKTsKKwlfX2RfbW92ZShkZW50cnksIHRhcmdldCk7CiAJd3JpdGVfc2VxdW5sb2NrKCZyZW5hbWVfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKGRfbW92ZSk7CkBAIC0yMzAyLDcgKzIyMzUsNyBAQAogICogVGhpcyBoZWxwZXIgYXR0ZW1wdHMgdG8gY29wZSB3aXRoIHJlbW90ZWx5IHJlbmFtZWQgZGlyZWN0b3JpZXMKICAqCiAgKiBJdCBhc3N1bWVzIHRoYXQgdGhlIGNhbGxlciBpcyBhbHJlYWR5IGhvbGRpbmcKLSAqIGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXggYW5kIHRoZSBpbm9kZS0+aV9sb2NrCisgKiBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX211dGV4LCBpbm9kZS0+aV9sb2NrIGFuZCByZW5hbWVfbG9jawogICoKICAqIE5vdGU6IElmIGV2ZXIgdGhlIGxvY2tpbmcgaW4gbG9ja19yZW5hbWUoKSBjaGFuZ2VzLCB0aGVuIHBsZWFzZQogICogcmVtZW1iZXIgdG8gdXBkYXRlIHRoaXMgdG9vLi4uCkBAIC0yMzE3LDExICsyMjUwLDYgQEAKIAlpZiAoYWxpYXMtPmRfcGFyZW50ID09IGRlbnRyeS0+ZF9wYXJlbnQpCiAJCWdvdG8gb3V0X3VuYWxpYXM7CiAKLQkvKiBDaGVjayBmb3IgbG9vcHMgKi8KLQlyZXQgPSBFUlJfUFRSKC1FTE9PUCk7Ci0JaWYgKGRfYW5jZXN0b3IoYWxpYXMsIGRlbnRyeSkpCi0JCWdvdG8gb3V0X2VycjsKLQogCS8qIFNlZSBsb2NrX3JlbmFtZSgpICovCiAJcmV0ID0gRVJSX1BUUigtRUJVU1kpOwogCWlmICghbXV0ZXhfdHJ5bG9jaygmZGVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfbXV0ZXgpKQpAQCAtMjMzMSw3ICsyMjU5LDcgQEAKIAkJZ290byBvdXRfZXJyOwogCW0yID0gJmFsaWFzLT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9tdXRleDsKIG91dF91bmFsaWFzOgotCWRfbW92ZShhbGlhcywgZGVudHJ5KTsKKwlfX2RfbW92ZShhbGlhcywgZGVudHJ5KTsKIAlyZXQgPSBhbGlhczsKIG91dF9lcnI6CiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwpAQCAtMjQxNiwxNSArMjM0NCwyNCBAQAogCQlhbGlhcyA9IF9fZF9maW5kX2FsaWFzKGlub2RlLCAwKTsKIAkJaWYgKGFsaWFzKSB7CiAJCQlhY3R1YWwgPSBhbGlhczsKLQkJCS8qIElzIHRoaXMgYW4gYW5vbnltb3VzIG1vdW50cG9pbnQgdGhhdCB3ZSBjb3VsZCBzcGxpY2UKLQkJCSAqIGludG8gb3VyIHRyZWU/ICovCi0JCQlpZiAoSVNfUk9PVChhbGlhcykpIHsKKwkJCXdyaXRlX3NlcWxvY2soJnJlbmFtZV9sb2NrKTsKKworCQkJaWYgKGRfYW5jZXN0b3IoYWxpYXMsIGRlbnRyeSkpIHsKKwkJCQkvKiBDaGVjayBmb3IgbG9vcHMgKi8KKwkJCQlhY3R1YWwgPSBFUlJfUFRSKC1FTE9PUCk7CisJCQl9IGVsc2UgaWYgKElTX1JPT1QoYWxpYXMpKSB7CisJCQkJLyogSXMgdGhpcyBhbiBhbm9ueW1vdXMgbW91bnRwb2ludCB0aGF0IHdlCisJCQkJICogY291bGQgc3BsaWNlIGludG8gb3VyIHRyZWU/ICovCiAJCQkJX19kX21hdGVyaWFsaXNlX2RlbnRyeShkZW50cnksIGFsaWFzKTsKKwkJCQl3cml0ZV9zZXF1bmxvY2soJnJlbmFtZV9sb2NrKTsKIAkJCQlfX2RfZHJvcChhbGlhcyk7CiAJCQkJZ290byBmb3VuZDsKKwkJCX0gZWxzZSB7CisJCQkJLyogTm9wZSwgYnV0IHdlIG11c3QoISkgYXZvaWQgZGlyZWN0b3J5CisJCQkJICogYWxpYXNpbmcgKi8KKwkJCQlhY3R1YWwgPSBfX2RfdW5hbGlhcyhpbm9kZSwgZGVudHJ5LCBhbGlhcyk7CiAJCQl9Ci0JCQkvKiBOb3BlLCBidXQgd2UgbXVzdCghKSBhdm9pZCBkaXJlY3RvcnkgYWxpYXNpbmcgKi8KLQkJCWFjdHVhbCA9IF9fZF91bmFsaWFzKGlub2RlLCBkZW50cnksIGFsaWFzKTsKKwkJCXdyaXRlX3NlcXVubG9jaygmcmVuYW1lX2xvY2spOwogCQkJaWYgKElTX0VSUihhY3R1YWwpKQogCQkJCWRwdXQoYWxpYXMpOwogCQkJZ290byBvdXRfbm9sb2NrOwpAQCAtMzAzMCw4ICsyOTY3LDYgQEAKIAkgKi8KIAlkZW50cnlfY2FjaGUgPSBLTUVNX0NBQ0hFKGRlbnRyeSwKIAkJU0xBQl9SRUNMQUlNX0FDQ09VTlR8U0xBQl9QQU5JQ3xTTEFCX01FTV9TUFJFQUQpOwotCQotCXJlZ2lzdGVyX3Nocmlua2VyKCZkY2FjaGVfc2hyaW5rZXIpOwogCiAJLyogSGFzaCBtYXkgaGF2ZSBiZWVuIHNldCB1cCBpbiBkY2FjaGVfaW5pdF9lYXJseSAqLwogCWlmICghaGFzaGRpc3QpCmRpZmYgLS1naXQgYS9mcy9kY29va2llcy5jIGIvZnMvZGNvb2tpZXMuYwppbmRleCBhMjFjYWJkLi5kZGEwZGM3IDEwMDY0NAotLS0gYS9mcy9kY29va2llcy5jCisrKyBiL2ZzL2Rjb29raWVzLmMKQEAgLTE3OCw2ICsxNzgsOCBAQAogCS8qIEZJWE1FOiAoZGVsZXRlZCkgPyAqLwogCXBhdGggPSBkX3BhdGgoJmRjcy0+cGF0aCwga2J1ZiwgUEFHRV9TSVpFKTsKIAorCW11dGV4X3VubG9jaygmZGNvb2tpZV9tdXRleCk7CisKIAlpZiAoSVNfRVJSKHBhdGgpKSB7CiAJCWVyciA9IFBUUl9FUlIocGF0aCk7CiAJCWdvdG8gb3V0X2ZyZWU7CkBAIC0xOTQsNiArMTk2LDcgQEAKIAogb3V0X2ZyZWU6CiAJa2ZyZWUoa2J1Zik7CisJcmV0dXJuIGVycjsKIG91dDoKIAltdXRleF91bmxvY2soJmRjb29raWVfbXV0ZXgpOwogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9mcy9kaXJlY3QtaW8uYyBiL2ZzL2RpcmVjdC1pby5jCmluZGV4IGFjNWYxNjQuLjAxZDJkOWUgMTAwNjQ0Ci0tLSBhL2ZzL2RpcmVjdC1pby5jCisrKyBiL2ZzL2RpcmVjdC1pby5jCkBAIC0xMzUsNiArMTM1LDUwIEBACiAJc3RydWN0IHBhZ2UgKnBhZ2VzW0RJT19QQUdFU107CS8qIHBhZ2UgYnVmZmVyICovCiB9OwogCitzdGF0aWMgdm9pZCBfX2lub2RlX2Rpb193YWl0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKndxID0gYml0X3dhaXRxdWV1ZSgmaW5vZGUtPmlfc3RhdGUsIF9fSV9ESU9fV0FLRVVQKTsKKwlERUZJTkVfV0FJVF9CSVQocSwgJmlub2RlLT5pX3N0YXRlLCBfX0lfRElPX1dBS0VVUCk7CisKKwlkbyB7CisJCXByZXBhcmVfdG9fd2FpdCh3cSwgJnEud2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX2Rpb19jb3VudCkpCisJCQlzY2hlZHVsZSgpOworCX0gd2hpbGUgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9kaW9fY291bnQpKTsKKwlmaW5pc2hfd2FpdCh3cSwgJnEud2FpdCk7Cit9CisKKy8qKgorICogaW5vZGVfZGlvX3dhaXQgLSB3YWl0IGZvciBvdXRzdGFuZGluZyBESU8gcmVxdWVzdHMgdG8gZmluaXNoCisgKiBAaW5vZGU6IGlub2RlIHRvIHdhaXQgZm9yCisgKgorICogV2FpdHMgZm9yIGFsbCBwZW5kaW5nIGRpcmVjdCBJL08gcmVxdWVzdHMgdG8gZmluaXNoIHNvIHRoYXQgd2UgY2FuCisgKiBwcm9jZWVkIHdpdGggYSB0cnVuY2F0ZSBvciBlcXVpdmFsZW50IG9wZXJhdGlvbi4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB1bmRlciBhIGxvY2sgdGhhdCBzZXJpYWxpemVzIHRha2luZyBuZXcgcmVmZXJlbmNlcworICogdG8gaV9kaW9fY291bnQsIHVzdWFsbHkgYnkgaW5vZGUtPmlfbXV0ZXguCisgKi8KK3ZvaWQgaW5vZGVfZGlvX3dhaXQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX2Rpb19jb3VudCkpCisJCV9faW5vZGVfZGlvX3dhaXQoaW5vZGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW5vZGVfZGlvX3dhaXQpOworCisvKgorICogaW5vZGVfZGlvX2RvbmUgLSBzaWduYWwgZmluaXNoIG9mIGEgZGlyZWN0IEkvTyByZXF1ZXN0cworICogQGlub2RlOiBpbm9kZSB0aGUgZGlyZWN0IEkvTyBoYXBwZW5zIG9uCisgKgorICogVGhpcyBpcyBjYWxsZWQgb25jZSB3ZSd2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgZGlyZWN0IEkvTyByZXF1ZXN0LAorICogYW5kIGlzIHVzZWQgdG8gd2FrZSB1cCBjYWxsZXJzIHdhaXRpbmcgZm9yIGRpcmVjdCBJL08gdG8gYmUgcXVpZXNjZWQuCisgKi8KK3ZvaWQgaW5vZGVfZGlvX2RvbmUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaW5vZGUtPmlfZGlvX2NvdW50KSkKKwkJd2FrZV91cF9iaXQoJmlub2RlLT5pX3N0YXRlLCBfX0lfRElPX1dBS0VVUCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbm9kZV9kaW9fZG9uZSk7CisKIC8qCiAgKiBIb3cgbWFueSBwYWdlcyBhcmUgaW4gdGhlIHF1ZXVlPwogICovCkBAIC0yNDksMTQgKzI5MywxMiBAQAogCWlmIChkaW8tPmVuZF9pbyAmJiBkaW8tPnJlc3VsdCkgewogCQlkaW8tPmVuZF9pbyhkaW8tPmlvY2IsIG9mZnNldCwgdHJhbnNmZXJyZWQsCiAJCQkgICAgZGlvLT5tYXBfYmguYl9wcml2YXRlLCByZXQsIGlzX2FzeW5jKTsKLQl9IGVsc2UgaWYgKGlzX2FzeW5jKSB7Ci0JCWFpb19jb21wbGV0ZShkaW8tPmlvY2IsIHJldCwgMCk7CisJfSBlbHNlIHsKKwkJaWYgKGlzX2FzeW5jKQorCQkJYWlvX2NvbXBsZXRlKGRpby0+aW9jYiwgcmV0LCAwKTsKKwkJaW5vZGVfZGlvX2RvbmUoZGlvLT5pbm9kZSk7CiAJfQogCi0JaWYgKGRpby0+ZmxhZ3MgJiBESU9fTE9DS0lORykKLQkJLyogbG9ja2RlcDogbm9uLW93bmVyIHJlbGVhc2UgKi8KLQkJdXBfcmVhZF9ub25fb3duZXIoJmRpby0+aW5vZGUtPmlfYWxsb2Nfc2VtKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk4MCw5ICsxMDIyLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogUmVsZWFzZXMgYm90aCBpX211dGV4IGFuZCBpX2FsbG9jX3NlbQotICovCiBzdGF0aWMgc3NpemVfdAogZGlyZWN0X2lvX3dvcmtlcihpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlub2RlICppbm9kZSwgCiAJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgCkBAIC0xMTQ2LDE1ICsxMTg1LDE2IEBACiAgKiAgICBGb3Igd3JpdGVzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGlfbXV0ZXggYW5kIHJldHVybnMgd2l0aAogICogICAgaV9tdXRleCBoZWxkLCBmb3IgcmVhZHMsIGlfbXV0ZXggaXMgbm90IGhlbGQgb24gZW50cnksIGJ1dCBpdCBpcwogICogICAgdGFrZW4gYW5kIGRyb3BwZWQgYWdhaW4gYmVmb3JlIHJldHVybmluZy4KLSAqICAgIEZvciByZWFkcyBhbmQgd3JpdGVzIGlfYWxsb2Nfc2VtIGlzIHRha2VuIGluIHNoYXJlZCBtb2RlIGFuZCByZWxlYXNlZAotICogICAgb24gSS9PIGNvbXBsZXRpb24gKHdoaWNoIG1heSBoYXBwZW4gYXN5bmNocm9ub3VzbHkgYWZ0ZXIgcmV0dXJuaW5nIHRvCi0gKiAgICB0aGUgY2FsbGVyKS4KLSAqCiAgKiAgLSBpZiB0aGUgZmxhZ3MgdmFsdWUgZG9lcyBOT1QgY29udGFpbiBESU9fTE9DS0lORyB3ZSBkb24ndCB1c2UgYW55CiAgKiAgICBpbnRlcm5hbCBsb2NraW5nIGJ1dCByYXRoZXIgcmVseSBvbiB0aGUgZmlsZXN5c3RlbSB0byBzeW5jaHJvbml6ZQogICogICAgZGlyZWN0IEkvTyByZWFkcy93cml0ZXMgdmVyc3VzIGVhY2ggb3RoZXIgYW5kIHRydW5jYXRlLgotICogICAgRm9yIHJlYWRzIGFuZCB3cml0ZXMgYm90aCBpX211dGV4IGFuZCBpX2FsbG9jX3NlbSBhcmUgbm90IGhlbGQgb24KLSAqICAgIGVudHJ5IGFuZCBhcmUgbmV2ZXIgdGFrZW4uCisgKgorICogVG8gaGVscCB3aXRoIGxvY2tpbmcgYWdhaW5zdCB0cnVuY2F0ZSB3ZSBpbmNyZW1lbnRlZCB0aGUgaV9kaW9fY291bnQKKyAqIGNvdW50ZXIgYmVmb3JlIHN0YXJ0aW5nIGRpcmVjdCBJL08sIGFuZCBkZWNyZW1lbnQgaXQgb25jZSB3ZSBhcmUgZG9uZS4KKyAqIFRydW5jYXRlIGNhbiB3YWl0IGZvciBpdCB0byByZWFjaCB6ZXJvIHRvIHByb3ZpZGUgZXhjbHVzaW9uLiAgSXQgaXMKKyAqIGV4cGVjdGVkIHRoYXQgZmlsZXN5c3RlbSBwcm92aWRlIGV4Y2x1c2lvbiBiZXR3ZWVuIG5ldyBkaXJlY3QgSS9PCisgKiBhbmQgdHJ1bmNhdGVzLiAgRm9yIERJT19MT0NLSU5HIGZpbGVzeXN0ZW1zIHRoaXMgaXMgZG9uZSBieSBpX211dGV4LAorICogYnV0IG90aGVyIGZpbGVzeXN0ZW1zIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHRoaXMgb24gdGhlaXIgb3duLgogICovCiBzc2l6ZV90CiBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTEyMDAsNiArMTI0MCwxMCBAQAogCQl9CiAJfQogCisJLyogd2F0Y2ggb3V0IGZvciBhIDAgbGVuIGlvIGZyb20gYSB0cmlja3N5IGZzICovCisJaWYgKHJ3ID09IFJFQUQgJiYgZW5kID09IG9mZnNldCkKKwkJcmV0dXJuIDA7CisKIAlkaW8gPSBrbWFsbG9jKHNpemVvZigqZGlvKSwgR0ZQX0tFUk5FTCk7CiAJcmV0dmFsID0gLUVOT01FTTsKIAlpZiAoIWRpbykKQEAgLTEyMTMsOCArMTI1Nyw3IEBACiAKIAlkaW8tPmZsYWdzID0gZmxhZ3M7CiAJaWYgKGRpby0+ZmxhZ3MgJiBESU9fTE9DS0lORykgewotCQkvKiB3YXRjaCBvdXQgZm9yIGEgMCBsZW4gaW8gZnJvbSBhIHRyaWNrc3kgZnMgKi8KLQkJaWYgKHJ3ID09IFJFQUQgJiYgZW5kID4gb2Zmc2V0KSB7CisJCWlmIChydyA9PSBSRUFEKSB7CiAJCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9CiAJCQkJCWlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZzsKIApAQCAtMTIyOSwxNSArMTI3MiwxNCBAQAogCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9Ci0KLQkJLyoKLQkJICogV2lsbCBiZSByZWxlYXNlZCBhdCBJL08gY29tcGxldGlvbiwgcG9zc2libHkgaW4gYQotCQkgKiBkaWZmZXJlbnQgdGhyZWFkLgotCQkgKi8KLQkJZG93bl9yZWFkX25vbl9vd25lcigmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKIAl9CiAKIAkvKgorCSAqIFdpbGwgYmUgZGVjcmVtZW50ZWQgYXQgSS9PIGNvbXBsZXRpb24gdGltZS4KKwkgKi8KKwlhdG9taWNfaW5jKCZpbm9kZS0+aV9kaW9fY291bnQpOworCisJLyoKIAkgKiBGb3IgZmlsZSBleHRlbmRpbmcgd3JpdGVzIHVwZGF0aW5nIGlfc2l6ZSBiZWZvcmUgZGF0YQogCSAqIHdyaXRlb3V0cyBjb21wbGV0ZSBjYW4gZXhwb3NlIHVuaW5pdGlhbGl6ZWQgYmxvY2tzLiBTbwogCSAqIGV2ZW4gZm9yIEFJTywgd2UgbmVlZCB0byB3YWl0IGZvciBpL28gdG8gY29tcGxldGUgYmVmb3JlCmRpZmYgLS1naXQgYS9mcy9kbG0vYXN0LmMgYi9mcy9kbG0vYXN0LmMKaW5kZXggYWJjNDlmMi4uOTBlNTk5NyAxMDA2NDQKLS0tIGEvZnMvZGxtL2FzdC5jCisrKyBiL2ZzL2RsbS9hc3QuYwpAQCAtMTQsMTcgKzE0LDkgQEAKICNpbmNsdWRlICJkbG1faW50ZXJuYWwuaCIKICNpbmNsdWRlICJsb2NrLmgiCiAjaW5jbHVkZSAidXNlci5oIgotI2luY2x1ZGUgImFzdC5oIgogCi0jZGVmaW5lIFdBS0VfQVNUUyAgMAotCi1zdGF0aWMgdWludDY0X3QJCQlhc3Rfc2VxX2NvdW50Owotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQJCWFzdF9xdWV1ZTsKLXN0YXRpYyBzcGlubG9ja190CQlhc3RfcXVldWVfbG9jazsKLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKglhc3RkX3Rhc2s7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZwkJYXN0ZF93YWtlZmxhZ3M7Ci1zdGF0aWMgc3RydWN0IG11dGV4CQlhc3RkX3J1bm5pbmc7Ci0KK3N0YXRpYyB1aW50NjRfdAkJCWRsbV9jYl9zZXE7CitzdGF0aWMgc3BpbmxvY2tfdAkJZGxtX2NiX3NlcV9zcGluOwogCiBzdGF0aWMgdm9pZCBkbG1fZHVtcF9sa2JfY2FsbGJhY2tzKHN0cnVjdCBkbG1fbGtiICpsa2IpCiB7CkBAIC01NywyMSArNDksMTMgQEAKIAl9CiB9CiAKLXZvaWQgZGxtX2RlbF9hc3Qoc3RydWN0IGRsbV9sa2IgKmxrYikKLXsKLQlzcGluX2xvY2soJmFzdF9xdWV1ZV9sb2NrKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmxrYi0+bGtiX2FzdHF1ZXVlKSkKLQkJbGlzdF9kZWxfaW5pdCgmbGtiLT5sa2JfYXN0cXVldWUpOwotCXNwaW5fdW5sb2NrKCZhc3RfcXVldWVfbG9jayk7Ci19Ci0KIGludCBkbG1fYWRkX2xrYl9jYWxsYmFjayhzdHJ1Y3QgZGxtX2xrYiAqbGtiLCB1aW50MzJfdCBmbGFncywgaW50IG1vZGUsCiAJCQkgaW50IHN0YXR1cywgdWludDMyX3Qgc2JmbGFncywgdWludDY0X3Qgc2VxKQogewogCXN0cnVjdCBkbG1fbHMgKmxzID0gbGtiLT5sa2JfcmVzb3VyY2UtPnJlc19sczsKIAl1aW50NjRfdCBwcmV2X3NlcTsKIAlpbnQgcHJldl9tb2RlOwotCWludCBpOworCWludCBpLCBydjsKIAogCWZvciAoaSA9IDA7IGkgPCBETE1fQ0FMTEJBQ0tTX1NJWkU7IGkrKykgewogCQlpZiAobGtiLT5sa2JfY2FsbGJhY2tzW2ldLnNlcSkKQEAgLTEwMCw3ICs4NCw4IEBACiAJCQkJCSAgbW9kZSwKIAkJCQkJICAodW5zaWduZWQgbG9uZyBsb25nKXByZXZfc2VxLAogCQkJCQkgIHByZXZfbW9kZSk7Ci0JCQkJcmV0dXJuIDA7CisJCQkJcnYgPSAwOworCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9CiAKQEAgLTEwOSw2ICs5NCw3IEBACiAJCWxrYi0+bGtiX2NhbGxiYWNrc1tpXS5tb2RlID0gbW9kZTsKIAkJbGtiLT5sa2JfY2FsbGJhY2tzW2ldLnNiX3N0YXR1cyA9IHN0YXR1czsKIAkJbGtiLT5sa2JfY2FsbGJhY2tzW2ldLnNiX2ZsYWdzID0gKHNiZmxhZ3MgJiAweDAwMDAwMEZGKTsKKwkJcnYgPSAwOwogCQlicmVhazsKIAl9CiAKQEAgLTExNywyMSArMTAzLDI0IEBACiAJCQkgIGxrYi0+bGtiX2lkLCAodW5zaWduZWQgbG9uZyBsb25nKXNlcSwKIAkJCSAgZmxhZ3MsIG1vZGUsIHN0YXR1cywgc2JmbGFncyk7CiAJCWRsbV9kdW1wX2xrYl9jYWxsYmFja3MobGtiKTsKLQkJcmV0dXJuIC0xOworCQlydiA9IC0xOworCQlnb3RvIG91dDsKIAl9Ci0KLQlyZXR1cm4gMDsKKyBvdXQ6CisJcmV0dXJuIHJ2OwogfQogCiBpbnQgZGxtX3JlbV9sa2JfY2FsbGJhY2soc3RydWN0IGRsbV9scyAqbHMsIHN0cnVjdCBkbG1fbGtiICpsa2IsCiAJCQkgc3RydWN0IGRsbV9jYWxsYmFjayAqY2IsIGludCAqcmVzaWQpCiB7Ci0JaW50IGk7CisJaW50IGksIHJ2OwogCiAJKnJlc2lkID0gMDsKIAotCWlmICghbGtiLT5sa2JfY2FsbGJhY2tzWzBdLnNlcSkKLQkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKCFsa2ItPmxrYl9jYWxsYmFja3NbMF0uc2VxKSB7CisJCXJ2ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQogCiAJLyogb2xkZXN0IHVuZGVsaXZlcmVkIGNiIGlzIGNhbGxiYWNrc1swXSAqLwogCkBAIC0xNjMsNyArMTUyLDggQEAKIAkJCQkgIGNiLT5tb2RlLAogCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylsa2ItPmxrYl9sYXN0X2Nhc3Quc2VxLAogCQkJCSAgbGtiLT5sa2JfbGFzdF9jYXN0Lm1vZGUpOwotCQkJcmV0dXJuIDA7CisJCQlydiA9IDA7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIApAQCAtMTc2LDE3MSArMTY2LDE1MCBAQAogCQltZW1jcHkoJmxrYi0+bGtiX2xhc3RfYmFzdCwgY2IsIHNpemVvZihzdHJ1Y3QgZGxtX2NhbGxiYWNrKSk7CiAJCWxrYi0+bGtiX2xhc3RfYmFzdF90aW1lID0ga3RpbWVfZ2V0KCk7CiAJfQotCi0JcmV0dXJuIDA7CisJcnYgPSAwOworIG91dDoKKwlyZXR1cm4gcnY7CiB9CiAKLXZvaWQgZGxtX2FkZF9hc3Qoc3RydWN0IGRsbV9sa2IgKmxrYiwgdWludDMyX3QgZmxhZ3MsIGludCBtb2RlLCBpbnQgc3RhdHVzLAotCQkgdWludDMyX3Qgc2JmbGFncykKK3ZvaWQgZGxtX2FkZF9jYihzdHJ1Y3QgZGxtX2xrYiAqbGtiLCB1aW50MzJfdCBmbGFncywgaW50IG1vZGUsIGludCBzdGF0dXMsCisJCXVpbnQzMl90IHNiZmxhZ3MpCiB7Ci0JdWludDY0X3Qgc2VxOworCXN0cnVjdCBkbG1fbHMgKmxzID0gbGtiLT5sa2JfcmVzb3VyY2UtPnJlc19sczsKKwl1aW50NjRfdCBuZXdfc2VxLCBwcmV2X3NlcTsKIAlpbnQgcnY7CiAKLQlzcGluX2xvY2soJmFzdF9xdWV1ZV9sb2NrKTsKLQotCXNlcSA9ICsrYXN0X3NlcV9jb3VudDsKKwlzcGluX2xvY2soJmRsbV9jYl9zZXFfc3Bpbik7CisJbmV3X3NlcSA9ICsrZGxtX2NiX3NlcTsKKwlzcGluX3VubG9jaygmZGxtX2NiX3NlcV9zcGluKTsKIAogCWlmIChsa2ItPmxrYl9mbGFncyAmIERMTV9JRkxfVVNFUikgewotCQlzcGluX3VubG9jaygmYXN0X3F1ZXVlX2xvY2spOwotCQlkbG1fdXNlcl9hZGRfYXN0KGxrYiwgZmxhZ3MsIG1vZGUsIHN0YXR1cywgc2JmbGFncywgc2VxKTsKKwkJZGxtX3VzZXJfYWRkX2FzdChsa2IsIGZsYWdzLCBtb2RlLCBzdGF0dXMsIHNiZmxhZ3MsIG5ld19zZXEpOwogCQlyZXR1cm47CiAJfQogCi0JcnYgPSBkbG1fYWRkX2xrYl9jYWxsYmFjayhsa2IsIGZsYWdzLCBtb2RlLCBzdGF0dXMsIHNiZmxhZ3MsIHNlcSk7Ci0JaWYgKHJ2IDwgMCkgewotCQlzcGluX3VubG9jaygmYXN0X3F1ZXVlX2xvY2spOwotCQlyZXR1cm47Ci0JfQorCW11dGV4X2xvY2soJmxrYi0+bGtiX2NiX211dGV4KTsKKwlwcmV2X3NlcSA9IGxrYi0+bGtiX2NhbGxiYWNrc1swXS5zZXE7CiAKLQlpZiAobGlzdF9lbXB0eSgmbGtiLT5sa2JfYXN0cXVldWUpKSB7CisJcnYgPSBkbG1fYWRkX2xrYl9jYWxsYmFjayhsa2IsIGZsYWdzLCBtb2RlLCBzdGF0dXMsIHNiZmxhZ3MsIG5ld19zZXEpOworCWlmIChydiA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKCFwcmV2X3NlcSkgewogCQlrcmVmX2dldCgmbGtiLT5sa2JfcmVmKTsKLQkJbGlzdF9hZGRfdGFpbCgmbGtiLT5sa2JfYXN0cXVldWUsICZhc3RfcXVldWUpOwotCX0KLQlzcGluX3VubG9jaygmYXN0X3F1ZXVlX2xvY2spOwogCi0Jc2V0X2JpdChXQUtFX0FTVFMsICZhc3RkX3dha2VmbGFncyk7Ci0Jd2FrZV91cF9wcm9jZXNzKGFzdGRfdGFzayk7CisJCWlmICh0ZXN0X2JpdChMU0ZMX0NCX0RFTEFZLCAmbHMtPmxzX2ZsYWdzKSkgeworCQkJbXV0ZXhfbG9jaygmbHMtPmxzX2NiX211dGV4KTsKKwkJCWxpc3RfYWRkKCZsa2ItPmxrYl9jYl9saXN0LCAmbHMtPmxzX2NiX2RlbGF5KTsKKwkJCW11dGV4X3VubG9jaygmbHMtPmxzX2NiX211dGV4KTsKKwkJfSBlbHNlIHsKKwkJCXF1ZXVlX3dvcmsobHMtPmxzX2NhbGxiYWNrX3dxLCAmbGtiLT5sa2JfY2Jfd29yayk7CisJCX0KKwl9Cisgb3V0OgorCW11dGV4X3VubG9jaygmbGtiLT5sa2JfY2JfbXV0ZXgpOwogfQogCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2FzdHModm9pZCkKK3ZvaWQgZGxtX2NhbGxiYWNrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBkbG1fbHMgKmxzID0gTlVMTDsKLQlzdHJ1Y3QgZGxtX3JzYiAqciA9IE5VTEw7Ci0Jc3RydWN0IGRsbV9sa2IgKmxrYjsKKwlzdHJ1Y3QgZGxtX2xrYiAqbGtiID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkbG1fbGtiLCBsa2JfY2Jfd29yayk7CisJc3RydWN0IGRsbV9scyAqbHMgPSBsa2ItPmxrYl9yZXNvdXJjZS0+cmVzX2xzOwogCXZvaWQgKCpjYXN0Zm4pICh2b2lkICphc3RwYXJhbSk7CiAJdm9pZCAoKmJhc3RmbikgKHZvaWQgKmFzdHBhcmFtLCBpbnQgbW9kZSk7CiAJc3RydWN0IGRsbV9jYWxsYmFjayBjYWxsYmFja3NbRExNX0NBTExCQUNLU19TSVpFXTsKIAlpbnQgaSwgcnYsIHJlc2lkOwogCi1yZXBlYXQ6Ci0Jc3Bpbl9sb2NrKCZhc3RfcXVldWVfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZhc3RfcXVldWUsIGxrYl9hc3RxdWV1ZSkgewotCQlyID0gbGtiLT5sa2JfcmVzb3VyY2U7Ci0JCWxzID0gci0+cmVzX2xzOworCW1lbXNldCgmY2FsbGJhY2tzLCAwLCBzaXplb2YoY2FsbGJhY2tzKSk7CiAKLQkJaWYgKGRsbV9sb2NraW5nX3N0b3BwZWQobHMpKQotCQkJY29udGludWU7Ci0KLQkJLyogd2UgcmVtb3ZlIGZyb20gYXN0cXVldWUgbGlzdCBhbmQgcmVtb3ZlIGV2ZXJ5dGhpbmcgaW4KLQkJICAgbGtiX2NhbGxiYWNrcyBiZWZvcmUgcmVsZWFzaW5nIHRoZSBzcGlubG9jayBzbyBlbXB0eQotCQkgICBsa2JfYXN0cXVldWUgaXMgYWx3YXlzIGNvbnNpc3RlbnQgd2l0aCBlbXB0eSBsa2JfY2FsbGJhY2tzICovCi0KLQkJbGlzdF9kZWxfaW5pdCgmbGtiLT5sa2JfYXN0cXVldWUpOwotCi0JCWNhc3RmbiA9IGxrYi0+bGtiX2FzdGZuOwotCQliYXN0Zm4gPSBsa2ItPmxrYl9iYXN0Zm47Ci0KLQkJbWVtc2V0KCZjYWxsYmFja3MsIDAsIHNpemVvZihjYWxsYmFja3MpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgRExNX0NBTExCQUNLU19TSVpFOyBpKyspIHsKLQkJCXJ2ID0gZGxtX3JlbV9sa2JfY2FsbGJhY2sobHMsIGxrYiwgJmNhbGxiYWNrc1tpXSwgJnJlc2lkKTsKLQkJCWlmIChydiA8IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmFzdF9xdWV1ZV9sb2NrKTsKLQotCQlpZiAocmVzaWQpIHsKLQkJCS8qIHNob3VsZG4ndCBoYXBwZW4sIGZvciBsb29wIHNob3VsZCBoYXZlIHJlbW92ZWQgYWxsICovCi0JCQlsb2dfZXJyb3IobHMsICJjYWxsYmFjayByZXNpZCAlZCBsa2IgJXgiLAotCQkJCSAgcmVzaWQsIGxrYi0+bGtiX2lkKTsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCBETE1fQ0FMTEJBQ0tTX1NJWkU7IGkrKykgewotCQkJaWYgKCFjYWxsYmFja3NbaV0uc2VxKQotCQkJCWJyZWFrOwotCQkJaWYgKGNhbGxiYWNrc1tpXS5mbGFncyAmIERMTV9DQl9TS0lQKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKGNhbGxiYWNrc1tpXS5mbGFncyAmIERMTV9DQl9CQVNUKSB7Ci0JCQkJYmFzdGZuKGxrYi0+bGtiX2FzdHBhcmFtLCBjYWxsYmFja3NbaV0ubW9kZSk7Ci0JCQl9IGVsc2UgaWYgKGNhbGxiYWNrc1tpXS5mbGFncyAmIERMTV9DQl9DQVNUKSB7Ci0JCQkJbGtiLT5sa2JfbGtzYi0+c2Jfc3RhdHVzID0gY2FsbGJhY2tzW2ldLnNiX3N0YXR1czsKLQkJCQlsa2ItPmxrYl9sa3NiLT5zYl9mbGFncyA9IGNhbGxiYWNrc1tpXS5zYl9mbGFnczsKLQkJCQljYXN0Zm4obGtiLT5sa2JfYXN0cGFyYW0pOwotCQkJfQotCQl9Ci0KLQkJLyogcmVtb3ZlcyByZWYgZm9yIGFzdF9xdWV1ZSwgbWF5IGNhdXNlIGxrYiB0byBiZSBmcmVlZCAqLwotCQlkbG1fcHV0X2xrYihsa2IpOwotCi0JCWNvbmRfcmVzY2hlZCgpOwotCQlnb3RvIHJlcGVhdDsKKwltdXRleF9sb2NrKCZsa2ItPmxrYl9jYl9tdXRleCk7CisJaWYgKCFsa2ItPmxrYl9jYWxsYmFja3NbMF0uc2VxKSB7CisJCS8qIG5vIGNhbGxiYWNrIHdvcmsgZXhpc3RzLCBzaG91bGRuJ3QgaGFwcGVuICovCisJCWxvZ19lcnJvcihscywgImRsbV9jYWxsYmFja193b3JrICV4IG5vIHdvcmsiLCBsa2ItPmxrYl9pZCk7CisJCWRsbV9wcmludF9sa2IobGtiKTsKKwkJZGxtX2R1bXBfbGtiX2NhbGxiYWNrcyhsa2IpOwogCX0KLQlzcGluX3VubG9jaygmYXN0X3F1ZXVlX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IERMTV9DQUxMQkFDS1NfU0laRTsgaSsrKSB7CisJCXJ2ID0gZGxtX3JlbV9sa2JfY2FsbGJhY2sobHMsIGxrYiwgJmNhbGxiYWNrc1tpXSwgJnJlc2lkKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChyZXNpZCkgeworCQkvKiBjYnMgcmVtYWluLCBsb29wIHNob3VsZCBoYXZlIHJlbW92ZWQgYWxsLCBzaG91bGRuJ3QgaGFwcGVuICovCisJCWxvZ19lcnJvcihscywgImRsbV9jYWxsYmFja193b3JrICV4IHJlc2lkICVkIiwgbGtiLT5sa2JfaWQsCisJCQkgIHJlc2lkKTsKKwkJZGxtX3ByaW50X2xrYihsa2IpOworCQlkbG1fZHVtcF9sa2JfY2FsbGJhY2tzKGxrYik7CisJfQorCW11dGV4X3VubG9jaygmbGtiLT5sa2JfY2JfbXV0ZXgpOworCisJY2FzdGZuID0gbGtiLT5sa2JfYXN0Zm47CisJYmFzdGZuID0gbGtiLT5sa2JfYmFzdGZuOworCisJZm9yIChpID0gMDsgaSA8IERMTV9DQUxMQkFDS1NfU0laRTsgaSsrKSB7CisJCWlmICghY2FsbGJhY2tzW2ldLnNlcSkKKwkJCWJyZWFrOworCQlpZiAoY2FsbGJhY2tzW2ldLmZsYWdzICYgRExNX0NCX1NLSVApIHsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGNhbGxiYWNrc1tpXS5mbGFncyAmIERMTV9DQl9CQVNUKSB7CisJCQliYXN0Zm4obGtiLT5sa2JfYXN0cGFyYW0sIGNhbGxiYWNrc1tpXS5tb2RlKTsKKwkJfSBlbHNlIGlmIChjYWxsYmFja3NbaV0uZmxhZ3MgJiBETE1fQ0JfQ0FTVCkgeworCQkJbGtiLT5sa2JfbGtzYi0+c2Jfc3RhdHVzID0gY2FsbGJhY2tzW2ldLnNiX3N0YXR1czsKKwkJCWxrYi0+bGtiX2xrc2ItPnNiX2ZsYWdzID0gY2FsbGJhY2tzW2ldLnNiX2ZsYWdzOworCQkJY2FzdGZuKGxrYi0+bGtiX2FzdHBhcmFtKTsKKwkJfQorCX0KKworCS8qIHVuZG8ga3JlZl9nZXQgZnJvbSBkbG1fYWRkX2NhbGxiYWNrLCBtYXkgY2F1c2UgbGtiIHRvIGJlIGZyZWVkICovCisJZGxtX3B1dF9sa2IobGtiKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbm9fYXN0cyh2b2lkKQoraW50IGRsbV9jYWxsYmFja19zdGFydChzdHJ1Y3QgZGxtX2xzICpscykKIHsKLQlpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrKCZhc3RfcXVldWVfbG9jayk7Ci0JcmV0ID0gbGlzdF9lbXB0eSgmYXN0X3F1ZXVlKTsKLQlzcGluX3VubG9jaygmYXN0X3F1ZXVlX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZGxtX2FzdGQodm9pZCAqZGF0YSkKLXsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAoIXRlc3RfYml0KFdBS0VfQVNUUywgJmFzdGRfd2FrZWZsYWdzKSkKLQkJCXNjaGVkdWxlKCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLQkJbXV0ZXhfbG9jaygmYXN0ZF9ydW5uaW5nKTsKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXQUtFX0FTVFMsICZhc3RkX3dha2VmbGFncykpCi0JCQlwcm9jZXNzX2FzdHMoKTsKLQkJbXV0ZXhfdW5sb2NrKCZhc3RkX3J1bm5pbmcpOworCWxzLT5sc19jYWxsYmFja193cSA9IGFsbG9jX3dvcmtxdWV1ZSgiZGxtX2NhbGxiYWNrIiwKKwkJCQkJICAgICBXUV9VTkJPVU5EIHwKKwkJCQkJICAgICBXUV9NRU1fUkVDTEFJTSB8CisJCQkJCSAgICAgV1FfTk9OX1JFRU5UUkFOVCwKKwkJCQkJICAgICAwKTsKKwlpZiAoIWxzLT5sc19jYWxsYmFja193cSkgeworCQlsb2dfcHJpbnQoImNhbid0IHN0YXJ0IGRsbV9jYWxsYmFjayB3b3JrcXVldWUiKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXJldHVybiAwOwogfQogCi12b2lkIGRsbV9hc3RkX3dha2Uodm9pZCkKK3ZvaWQgZGxtX2NhbGxiYWNrX3N0b3Aoc3RydWN0IGRsbV9scyAqbHMpCiB7Ci0JaWYgKCFub19hc3RzKCkpIHsKLQkJc2V0X2JpdChXQUtFX0FTVFMsICZhc3RkX3dha2VmbGFncyk7Ci0JCXdha2VfdXBfcHJvY2Vzcyhhc3RkX3Rhc2spOworCWlmIChscy0+bHNfY2FsbGJhY2tfd3EpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGxzLT5sc19jYWxsYmFja193cSk7Cit9CisKK3ZvaWQgZGxtX2NhbGxiYWNrX3N1c3BlbmQoc3RydWN0IGRsbV9scyAqbHMpCit7CisJc2V0X2JpdChMU0ZMX0NCX0RFTEFZLCAmbHMtPmxzX2ZsYWdzKTsKKworCWlmIChscy0+bHNfY2FsbGJhY2tfd3EpCisJCWZsdXNoX3dvcmtxdWV1ZShscy0+bHNfY2FsbGJhY2tfd3EpOworfQorCit2b2lkIGRsbV9jYWxsYmFja19yZXN1bWUoc3RydWN0IGRsbV9scyAqbHMpCit7CisJc3RydWN0IGRsbV9sa2IgKmxrYiwgKnNhZmU7CisJaW50IGNvdW50ID0gMDsKKworCWNsZWFyX2JpdChMU0ZMX0NCX0RFTEFZLCAmbHMtPmxzX2ZsYWdzKTsKKworCWlmICghbHMtPmxzX2NhbGxiYWNrX3dxKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZscy0+bHNfY2JfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsa2IsIHNhZmUsICZscy0+bHNfY2JfZGVsYXksIGxrYl9jYl9saXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmxrYi0+bGtiX2NiX2xpc3QpOworCQlxdWV1ZV93b3JrKGxzLT5sc19jYWxsYmFja193cSwgJmxrYi0+bGtiX2NiX3dvcmspOworCQljb3VudCsrOwogCX0KLX0KKwltdXRleF91bmxvY2soJmxzLT5sc19jYl9tdXRleCk7CiAKLWludCBkbG1fYXN0ZF9zdGFydCh2b2lkKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKLQlpbnQgZXJyb3IgPSAwOwotCi0JSU5JVF9MSVNUX0hFQUQoJmFzdF9xdWV1ZSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFzdF9xdWV1ZV9sb2NrKTsKLQltdXRleF9pbml0KCZhc3RkX3J1bm5pbmcpOwotCi0JcCA9IGt0aHJlYWRfcnVuKGRsbV9hc3RkLCBOVUxMLCAiZGxtX2FzdGQiKTsKLQlpZiAoSVNfRVJSKHApKQotCQllcnJvciA9IFBUUl9FUlIocCk7Ci0JZWxzZQotCQlhc3RkX3Rhc2sgPSBwOwotCXJldHVybiBlcnJvcjsKLX0KLQotdm9pZCBkbG1fYXN0ZF9zdG9wKHZvaWQpCi17Ci0Ja3RocmVhZF9zdG9wKGFzdGRfdGFzayk7Ci19Ci0KLXZvaWQgZGxtX2FzdGRfc3VzcGVuZCh2b2lkKQotewotCW11dGV4X2xvY2soJmFzdGRfcnVubmluZyk7Ci19Ci0KLXZvaWQgZGxtX2FzdGRfcmVzdW1lKHZvaWQpCi17Ci0JbXV0ZXhfdW5sb2NrKCZhc3RkX3J1bm5pbmcpOworCWxvZ19kZWJ1ZyhscywgImRsbV9jYWxsYmFja19yZXN1bWUgJWQiLCBjb3VudCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2RsbS9hc3QuaCBiL2ZzL2RsbS9hc3QuaAppbmRleCA4YWE4OWM5Li43NTdiNTUxIDEwMDY0NAotLS0gYS9mcy9kbG0vYXN0LmgKKysrIGIvZnMvZGxtL2FzdC5oCkBAIC0xOCwxNCArMTgsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCB1aW50MzJfdCBzYmZsYWdzLCB1aW50NjRfdCBzZXEpOwogaW50IGRsbV9yZW1fbGtiX2NhbGxiYWNrKHN0cnVjdCBkbG1fbHMgKmxzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkbG1fY2FsbGJhY2sgKmNiLCBpbnQgKnJlc2lkKTsKLXZvaWQgZGxtX2FkZF9hc3Qoc3RydWN0IGRsbV9sa2IgKmxrYiwgdWludDMyX3QgZmxhZ3MsIGludCBtb2RlLCBpbnQgc3RhdHVzLAotCQkgdWludDMyX3Qgc2JmbGFncyk7Cit2b2lkIGRsbV9hZGRfY2Ioc3RydWN0IGRsbV9sa2IgKmxrYiwgdWludDMyX3QgZmxhZ3MsIGludCBtb2RlLCBpbnQgc3RhdHVzLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHNiZmxhZ3MpOwogCi12b2lkIGRsbV9hc3RkX3dha2Uodm9pZCk7Ci1pbnQgZGxtX2FzdGRfc3RhcnQodm9pZCk7Ci12b2lkIGRsbV9hc3RkX3N0b3Aodm9pZCk7Ci12b2lkIGRsbV9hc3RkX3N1c3BlbmQodm9pZCk7Ci12b2lkIGRsbV9hc3RkX3Jlc3VtZSh2b2lkKTsKK3ZvaWQgZGxtX2NhbGxiYWNrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2ludCBkbG1fY2FsbGJhY2tfc3RhcnQoc3RydWN0IGRsbV9scyAqbHMpOwordm9pZCBkbG1fY2FsbGJhY2tfc3RvcChzdHJ1Y3QgZGxtX2xzICpscyk7Cit2b2lkIGRsbV9jYWxsYmFja19zdXNwZW5kKHN0cnVjdCBkbG1fbHMgKmxzKTsKK3ZvaWQgZGxtX2NhbGxiYWNrX3Jlc3VtZShzdHJ1Y3QgZGxtX2xzICpscyk7CiAKICNlbmRpZgogCisKZGlmZiAtLWdpdCBhL2ZzL2RsbS9jb25maWcuYyBiL2ZzL2RsbS9jb25maWcuYwppbmRleCA5YjAyNmVhLi42Y2Y3MmZjIDEwMDY0NAotLS0gYS9mcy9kbG0vY29uZmlnLmMKKysrIGIvZnMvZGxtL2NvbmZpZy5jCkBAIC0yOCw3ICsyOCw4IEBACiAgKiAvY29uZmlnL2RsbS88Y2x1c3Rlcj4vc3BhY2VzLzxzcGFjZT4vbm9kZXMvPG5vZGU+L3dlaWdodAogICogL2NvbmZpZy9kbG0vPGNsdXN0ZXI+L2NvbW1zLzxjb21tPi9ub2RlaWQKICAqIC9jb25maWcvZGxtLzxjbHVzdGVyPi9jb21tcy88Y29tbT4vbG9jYWwKLSAqIC9jb25maWcvZGxtLzxjbHVzdGVyPi9jb21tcy88Y29tbT4vYWRkcgorICogL2NvbmZpZy9kbG0vPGNsdXN0ZXI+L2NvbW1zLzxjb21tPi9hZGRyICAgICAgKHdyaXRlIG9ubHkpCisgKiAvY29uZmlnL2RsbS88Y2x1c3Rlcj4vY29tbXMvPGNvbW0+L2FkZHJfbGlzdCAocmVhZCBvbmx5KQogICogVGhlIDxjbHVzdGVyPiBsZXZlbCBpcyB1c2VsZXNzLCBidXQgSSBoYXZlbid0IGZpZ3VyZWQgb3V0IGhvdyB0byBhdm9pZCBpdC4KICAqLwogCkBAIC04MCw2ICs4MSw3IEBACiAJCQkJc2l6ZV90IGxlbik7CiBzdGF0aWMgc3NpemVfdCBjb21tX2FkZHJfd3JpdGUoc3RydWN0IGRsbV9jb21tICpjbSwgY29uc3QgY2hhciAqYnVmLAogCQkJCXNpemVfdCBsZW4pOworc3RhdGljIHNzaXplX3QgY29tbV9hZGRyX2xpc3RfcmVhZChzdHJ1Y3QgZGxtX2NvbW0gKmNtLCBjaGFyICpidWYpOwogc3RhdGljIHNzaXplX3Qgbm9kZV9ub2RlaWRfcmVhZChzdHJ1Y3QgZGxtX25vZGUgKm5kLCBjaGFyICpidWYpOwogc3RhdGljIHNzaXplX3Qgbm9kZV9ub2RlaWRfd3JpdGUoc3RydWN0IGRsbV9ub2RlICpuZCwgY29uc3QgY2hhciAqYnVmLAogCQkJCXNpemVfdCBsZW4pOwpAQCAtOTIsNyArOTQsNiBAQAogCXVuc2lnbmVkIGludCBjbF90Y3BfcG9ydDsKIAl1bnNpZ25lZCBpbnQgY2xfYnVmZmVyX3NpemU7CiAJdW5zaWduZWQgaW50IGNsX3JzYnRibF9zaXplOwotCXVuc2lnbmVkIGludCBjbF9sa2J0Ymxfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgY2xfZGlydGJsX3NpemU7CiAJdW5zaWduZWQgaW50IGNsX3JlY292ZXJfdGltZXI7CiAJdW5zaWduZWQgaW50IGNsX3Rvc3Nfc2VjczsKQEAgLTEwMSwxMyArMTAyLDEzIEBACiAJdW5zaWduZWQgaW50IGNsX3Byb3RvY29sOwogCXVuc2lnbmVkIGludCBjbF90aW1ld2Fybl9jczsKIAl1bnNpZ25lZCBpbnQgY2xfd2FpdHdhcm5fdXM7CisJdW5zaWduZWQgaW50IGNsX25ld19yc2JfY291bnQ7CiB9OwogCiBlbnVtIHsKIAlDTFVTVEVSX0FUVFJfVENQX1BPUlQgPSAwLAogCUNMVVNURVJfQVRUUl9CVUZGRVJfU0laRSwKIAlDTFVTVEVSX0FUVFJfUlNCVEJMX1NJWkUsCi0JQ0xVU1RFUl9BVFRSX0xLQlRCTF9TSVpFLAogCUNMVVNURVJfQVRUUl9ESVJUQkxfU0laRSwKIAlDTFVTVEVSX0FUVFJfUkVDT1ZFUl9USU1FUiwKIAlDTFVTVEVSX0FUVFJfVE9TU19TRUNTLApAQCAtMTE2LDYgKzExNyw3IEBACiAJQ0xVU1RFUl9BVFRSX1BST1RPQ09MLAogCUNMVVNURVJfQVRUUl9USU1FV0FSTl9DUywKIAlDTFVTVEVSX0FUVFJfV0FJVFdBUk5fVVMsCisJQ0xVU1RFUl9BVFRSX05FV19SU0JfQ09VTlQsCiB9OwogCiBzdHJ1Y3QgY2x1c3Rlcl9hdHRyaWJ1dGUgewpAQCAtMTYwLDcgKzE2Miw2IEBACiBDTFVTVEVSX0FUVFIodGNwX3BvcnQsIDEpOwogQ0xVU1RFUl9BVFRSKGJ1ZmZlcl9zaXplLCAxKTsKIENMVVNURVJfQVRUUihyc2J0Ymxfc2l6ZSwgMSk7Ci1DTFVTVEVSX0FUVFIobGtidGJsX3NpemUsIDEpOwogQ0xVU1RFUl9BVFRSKGRpcnRibF9zaXplLCAxKTsKIENMVVNURVJfQVRUUihyZWNvdmVyX3RpbWVyLCAxKTsKIENMVVNURVJfQVRUUih0b3NzX3NlY3MsIDEpOwpAQCAtMTY5LDEyICsxNzAsMTIgQEAKIENMVVNURVJfQVRUUihwcm90b2NvbCwgMCk7CiBDTFVTVEVSX0FUVFIodGltZXdhcm5fY3MsIDEpOwogQ0xVU1RFUl9BVFRSKHdhaXR3YXJuX3VzLCAwKTsKK0NMVVNURVJfQVRUUihuZXdfcnNiX2NvdW50LCAwKTsKIAogc3RhdGljIHN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgKmNsdXN0ZXJfYXR0cnNbXSA9IHsKIAlbQ0xVU1RFUl9BVFRSX1RDUF9QT1JUXSA9ICZjbHVzdGVyX2F0dHJfdGNwX3BvcnQuYXR0ciwKIAlbQ0xVU1RFUl9BVFRSX0JVRkZFUl9TSVpFXSA9ICZjbHVzdGVyX2F0dHJfYnVmZmVyX3NpemUuYXR0ciwKIAlbQ0xVU1RFUl9BVFRSX1JTQlRCTF9TSVpFXSA9ICZjbHVzdGVyX2F0dHJfcnNidGJsX3NpemUuYXR0ciwKLQlbQ0xVU1RFUl9BVFRSX0xLQlRCTF9TSVpFXSA9ICZjbHVzdGVyX2F0dHJfbGtidGJsX3NpemUuYXR0ciwKIAlbQ0xVU1RFUl9BVFRSX0RJUlRCTF9TSVpFXSA9ICZjbHVzdGVyX2F0dHJfZGlydGJsX3NpemUuYXR0ciwKIAlbQ0xVU1RFUl9BVFRSX1JFQ09WRVJfVElNRVJdID0gJmNsdXN0ZXJfYXR0cl9yZWNvdmVyX3RpbWVyLmF0dHIsCiAJW0NMVVNURVJfQVRUUl9UT1NTX1NFQ1NdID0gJmNsdXN0ZXJfYXR0cl90b3NzX3NlY3MuYXR0ciwKQEAgLTE4Myw2ICsxODQsNyBAQAogCVtDTFVTVEVSX0FUVFJfUFJPVE9DT0xdID0gJmNsdXN0ZXJfYXR0cl9wcm90b2NvbC5hdHRyLAogCVtDTFVTVEVSX0FUVFJfVElNRVdBUk5fQ1NdID0gJmNsdXN0ZXJfYXR0cl90aW1ld2Fybl9jcy5hdHRyLAogCVtDTFVTVEVSX0FUVFJfV0FJVFdBUk5fVVNdID0gJmNsdXN0ZXJfYXR0cl93YWl0d2Fybl91cy5hdHRyLAorCVtDTFVTVEVSX0FUVFJfTkVXX1JTQl9DT1VOVF0gPSAmY2x1c3Rlcl9hdHRyX25ld19yc2JfY291bnQuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtMTkwLDYgKzE5Miw3IEBACiAJQ09NTV9BVFRSX05PREVJRCA9IDAsCiAJQ09NTV9BVFRSX0xPQ0FMLAogCUNPTU1fQVRUUl9BRERSLAorCUNPTU1fQVRUUl9BRERSX0xJU1QsCiB9OwogCiBzdHJ1Y3QgY29tbV9hdHRyaWJ1dGUgewpAQCAtMjE3LDE0ICsyMjAsMjIgQEAKIHN0YXRpYyBzdHJ1Y3QgY29tbV9hdHRyaWJ1dGUgY29tbV9hdHRyX2FkZHIgPSB7CiAJLmF0dHIgICA9IHsgLmNhX293bmVyID0gVEhJU19NT0RVTEUsCiAgICAgICAgICAgICAgICAgICAgIC5jYV9uYW1lID0gImFkZHIiLAotICAgICAgICAgICAgICAgICAgICAuY2FfbW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSIH0sCisgICAgICAgICAgICAgICAgICAgIC5jYV9tb2RlID0gU19JV1VTUiB9LAogCS5zdG9yZSAgPSBjb21tX2FkZHJfd3JpdGUsCiB9OwogCitzdGF0aWMgc3RydWN0IGNvbW1fYXR0cmlidXRlIGNvbW1fYXR0cl9hZGRyX2xpc3QgPSB7CisJLmF0dHIgICA9IHsgLmNhX293bmVyID0gVEhJU19NT0RVTEUsCisgICAgICAgICAgICAgICAgICAgIC5jYV9uYW1lID0gImFkZHJfbGlzdCIsCisgICAgICAgICAgICAgICAgICAgIC5jYV9tb2RlID0gU19JUlVHTyB9LAorCS5zaG93ICAgPSBjb21tX2FkZHJfbGlzdF9yZWFkLAorfTsKKwogc3RhdGljIHN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgKmNvbW1fYXR0cnNbXSA9IHsKIAlbQ09NTV9BVFRSX05PREVJRF0gPSAmY29tbV9hdHRyX25vZGVpZC5hdHRyLAogCVtDT01NX0FUVFJfTE9DQUxdID0gJmNvbW1fYXR0cl9sb2NhbC5hdHRyLAogCVtDT01NX0FUVFJfQUREUl0gPSAmY29tbV9hdHRyX2FkZHIuYXR0ciwKKwlbQ09NTV9BVFRSX0FERFJfTElTVF0gPSAmY29tbV9hdHRyX2FkZHJfbGlzdC5hdHRyLAogCU5VTEwsCiB9OwogCkBAIC00MzUsNyArNDQ2LDYgQEAKIAljbC0+Y2xfdGNwX3BvcnQgPSBkbG1fY29uZmlnLmNpX3RjcF9wb3J0OwogCWNsLT5jbF9idWZmZXJfc2l6ZSA9IGRsbV9jb25maWcuY2lfYnVmZmVyX3NpemU7CiAJY2wtPmNsX3JzYnRibF9zaXplID0gZGxtX2NvbmZpZy5jaV9yc2J0Ymxfc2l6ZTsKLQljbC0+Y2xfbGtidGJsX3NpemUgPSBkbG1fY29uZmlnLmNpX2xrYnRibF9zaXplOwogCWNsLT5jbF9kaXJ0Ymxfc2l6ZSA9IGRsbV9jb25maWcuY2lfZGlydGJsX3NpemU7CiAJY2wtPmNsX3JlY292ZXJfdGltZXIgPSBkbG1fY29uZmlnLmNpX3JlY292ZXJfdGltZXI7CiAJY2wtPmNsX3Rvc3Nfc2VjcyA9IGRsbV9jb25maWcuY2lfdG9zc19zZWNzOwpAQCAtNDQ0LDYgKzQ1NCw3IEBACiAJY2wtPmNsX3Byb3RvY29sID0gZGxtX2NvbmZpZy5jaV9wcm90b2NvbDsKIAljbC0+Y2xfdGltZXdhcm5fY3MgPSBkbG1fY29uZmlnLmNpX3RpbWV3YXJuX2NzOwogCWNsLT5jbF93YWl0d2Fybl91cyA9IGRsbV9jb25maWcuY2lfd2FpdHdhcm5fdXM7CisJY2wtPmNsX25ld19yc2JfY291bnQgPSBkbG1fY29uZmlnLmNpX25ld19yc2JfY291bnQ7CiAKIAlzcGFjZV9saXN0ID0gJnNwcy0+c3NfZ3JvdXA7CiAJY29tbV9saXN0ID0gJmNtcy0+Y3NfZ3JvdXA7CkBAIC03MjAsNiArNzMxLDUwIEBACiAJcmV0dXJuIGxlbjsKIH0KIAorc3RhdGljIHNzaXplX3QgY29tbV9hZGRyX2xpc3RfcmVhZChzdHJ1Y3QgZGxtX2NvbW0gKmNtLCBjaGFyICpidWYpCit7CisJc3NpemVfdCBzOworCXNzaXplX3QgYWxsb3dhbmNlOworCWludCBpOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcl9pbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyX2luNjsKKwkKKwkvKiBUYWtlbiBmcm9tIGlwNl9hZGRyX3N0cmluZygpIGRlZmluZWQgaW4gbGliL3ZzcHJpbnRmLmMgKi8KKwljaGFyIGJ1ZjBbc2l6ZW9mKCJBRl9JTkVUNgl4eHh4Onh4eHg6eHh4eDp4eHh4Onh4eHg6eHh4eDoyNTUuMjU1LjI1NS4yNTVcbiIpXTsKKwkKKworCS8qIERlcml2ZWQgZnJvbSBTSU1QTEVfQVRUUl9TSVpFIG9mIGZzL2NvbmZpZ2ZzL2ZpbGUuYyAqLworCWFsbG93YW5jZSA9IDQwOTY7CisJYnVmWzBdID0gJ1wwJzsKKworCWZvciAoaSA9IDA7IGkgPCBjbS0+YWRkcl9jb3VudDsgaSsrKSB7CisJCWFkZHIgPSBjbS0+YWRkcltpXTsKKworCQlzd2l0Y2goYWRkci0+c3NfZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCWFkZHJfaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcjsKKwkJCXMgPSBzcHJpbnRmKGJ1ZjAsICJBRl9JTkVUCSVwSTRcbiIsICZhZGRyX2luLT5zaW5fYWRkci5zX2FkZHIpOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlhZGRyX2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcjsKKwkJCXMgPSBzcHJpbnRmKGJ1ZjAsICJBRl9JTkVUNgklcEk2XG4iLCAmYWRkcl9pbjYtPnNpbjZfYWRkcik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXMgPSBzcHJpbnRmKGJ1ZjAsICIlc1xuIiwgIjxVTktOT1dOPiIpOworCQkJYnJlYWs7CisJCX0KKwkJYWxsb3dhbmNlIC09IHM7CisJCWlmIChhbGxvd2FuY2UgPj0gMCkKKwkJCXN0cmNhdChidWYsIGJ1ZjApOworCQllbHNlIHsKKwkJCWFsbG93YW5jZSArPSBzOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDQwOTYgLSBhbGxvd2FuY2U7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfbm9kZShzdHJ1Y3QgY29uZmlnX2l0ZW0gKmksIHN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgKmEsCiAJCQkgY2hhciAqYnVmKQogewpAQCAtOTgzLDcgKzEwMzgsNiBAQAogI2RlZmluZSBERUZBVUxUX1RDUF9QT1JUICAgICAgIDIxMDY0CiAjZGVmaW5lIERFRkFVTFRfQlVGRkVSX1NJWkUgICAgIDQwOTYKICNkZWZpbmUgREVGQVVMVF9SU0JUQkxfU0laRSAgICAgMTAyNAotI2RlZmluZSBERUZBVUxUX0xLQlRCTF9TSVpFICAgICAxMDI0CiAjZGVmaW5lIERFRkFVTFRfRElSVEJMX1NJWkUgICAgIDEwMjQKICNkZWZpbmUgREVGQVVMVF9SRUNPVkVSX1RJTUVSICAgICAgNQogI2RlZmluZSBERUZBVUxUX1RPU1NfU0VDUyAgICAgICAgIDEwCkBAIC05OTIsMTIgKzEwNDYsMTIgQEAKICNkZWZpbmUgREVGQVVMVF9QUk9UT0NPTCAgICAgICAgICAgMAogI2RlZmluZSBERUZBVUxUX1RJTUVXQVJOX0NTICAgICAgNTAwIC8qIDUgc2VjID0gNTAwIGNlbnRpc2Vjb25kcyAqLwogI2RlZmluZSBERUZBVUxUX1dBSVRXQVJOX1VTCSAgIDAKKyNkZWZpbmUgREVGQVVMVF9ORVdfUlNCX0NPVU5UICAgIDEyOAogCiBzdHJ1Y3QgZGxtX2NvbmZpZ19pbmZvIGRsbV9jb25maWcgPSB7CiAJLmNpX3RjcF9wb3J0ID0gREVGQVVMVF9UQ1BfUE9SVCwKIAkuY2lfYnVmZmVyX3NpemUgPSBERUZBVUxUX0JVRkZFUl9TSVpFLAogCS5jaV9yc2J0Ymxfc2l6ZSA9IERFRkFVTFRfUlNCVEJMX1NJWkUsCi0JLmNpX2xrYnRibF9zaXplID0gREVGQVVMVF9MS0JUQkxfU0laRSwKIAkuY2lfZGlydGJsX3NpemUgPSBERUZBVUxUX0RJUlRCTF9TSVpFLAogCS5jaV9yZWNvdmVyX3RpbWVyID0gREVGQVVMVF9SRUNPVkVSX1RJTUVSLAogCS5jaV90b3NzX3NlY3MgPSBERUZBVUxUX1RPU1NfU0VDUywKQEAgLTEwMDUsNiArMTA1OSw3IEBACiAJLmNpX2xvZ19kZWJ1ZyA9IERFRkFVTFRfTE9HX0RFQlVHLAogCS5jaV9wcm90b2NvbCA9IERFRkFVTFRfUFJPVE9DT0wsCiAJLmNpX3RpbWV3YXJuX2NzID0gREVGQVVMVF9USU1FV0FSTl9DUywKLQkuY2lfd2FpdHdhcm5fdXMgPSBERUZBVUxUX1dBSVRXQVJOX1VTCisJLmNpX3dhaXR3YXJuX3VzID0gREVGQVVMVF9XQUlUV0FSTl9VUywKKwkuY2lfbmV3X3JzYl9jb3VudCA9IERFRkFVTFRfTkVXX1JTQl9DT1VOVAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZGxtL2NvbmZpZy5oIGIvZnMvZGxtL2NvbmZpZy5oCmluZGV4IGRkMGNlMjQuLjMwOTlkMGQgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9jb25maWcuaAorKysgYi9mcy9kbG0vY29uZmlnLmgKQEAgLTIwLDcgKzIwLDYgQEAKIAlpbnQgY2lfdGNwX3BvcnQ7CiAJaW50IGNpX2J1ZmZlcl9zaXplOwogCWludCBjaV9yc2J0Ymxfc2l6ZTsKLQlpbnQgY2lfbGtidGJsX3NpemU7CiAJaW50IGNpX2RpcnRibF9zaXplOwogCWludCBjaV9yZWNvdmVyX3RpbWVyOwogCWludCBjaV90b3NzX3NlY3M7CkBAIC0yOSw2ICsyOCw3IEBACiAJaW50IGNpX3Byb3RvY29sOwogCWludCBjaV90aW1ld2Fybl9jczsKIAlpbnQgY2lfd2FpdHdhcm5fdXM7CisJaW50IGNpX25ld19yc2JfY291bnQ7CiB9OwogCiBleHRlcm4gc3RydWN0IGRsbV9jb25maWdfaW5mbyBkbG1fY29uZmlnOwpkaWZmIC0tZ2l0IGEvZnMvZGxtL2RsbV9pbnRlcm5hbC5oIGIvZnMvZGxtL2RsbV9pbnRlcm5hbC5oCmluZGV4IDAyNjI0NTEuLmZlMjg2MGMgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9kbG1faW50ZXJuYWwuaAorKysgYi9mcy9kbG0vZGxtX2ludGVybmFsLmgKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kbG0uaD4KQEAgLTUyLDcgKzUzLDYgQEAKIHN0cnVjdCBkbG1fbGtiOwogc3RydWN0IGRsbV9yc2I7CiBzdHJ1Y3QgZGxtX21lbWJlcjsKLXN0cnVjdCBkbG1fbGtidGFibGU7CiBzdHJ1Y3QgZGxtX3JzYnRhYmxlOwogc3RydWN0IGRsbV9kaXJ0YWJsZTsKIHN0cnVjdCBkbG1fZGlyZW50cnk7CkBAIC0xMDgsMTEgKzEwOCw2IEBACiAJc3BpbmxvY2tfdAkJbG9jazsKIH07CiAKLXN0cnVjdCBkbG1fbGtidGFibGUgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlyd2xvY2tfdAkJbG9jazsKLQl1aW50MTZfdAkJY291bnRlcjsKLX07CiAKIC8qCiAgKiBMb2Nrc3BhY2UgbWVtYmVyIChwZXIgbm9kZSBpbiBhIGxzKQpAQCAtMjQ4LDE3ICsyNDMsMTggQEAKIAlpbnQ4X3QJCQlsa2Jfd2FpdF9jb3VudDsKIAlpbnQJCQlsa2Jfd2FpdF9ub2RlaWQ7IC8qIGZvciBkZWJ1Z2dpbmcgKi8KIAotCXN0cnVjdCBsaXN0X2hlYWQJbGtiX2lkdGJsX2xpc3Q7CS8qIGxvY2tzcGFjZSBsa2J0YmwgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWxrYl9zdGF0ZXF1ZXVlOwkvKiByc2IgZy9jL3cgbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbGtiX3JzYl9sb29rdXA7CS8qIHdhaXRpbmcgZm9yIHJzYiBsb29rdXAgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWxrYl93YWl0X3JlcGx5OwkvKiB3YWl0aW5nIGZvciByZW1vdGUgcmVwbHkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWxrYl9hc3RxdWV1ZTsJLyogbmVlZCBhc3QgdG8gYmUgc2VudCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbGtiX293bnF1ZXVlOwkvKiBsaXN0IG9mIGxvY2tzIGZvciBhIHByb2Nlc3MgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWxrYl90aW1lX2xpc3Q7CiAJa3RpbWVfdAkJCWxrYl90aW1lc3RhbXA7CiAJa3RpbWVfdAkJCWxrYl93YWl0X3RpbWU7CiAJdW5zaWduZWQgbG9uZwkJbGtiX3RpbWVvdXRfY3M7CiAKKwlzdHJ1Y3QgbXV0ZXgJCWxrYl9jYl9tdXRleDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJbGtiX2NiX3dvcms7CisJc3RydWN0IGxpc3RfaGVhZAlsa2JfY2JfbGlzdDsgLyogZm9yIGxzX2NiX2RlbGF5IG9yIHByb2MtPmFzdHMgKi8KIAlzdHJ1Y3QgZGxtX2NhbGxiYWNrCWxrYl9jYWxsYmFja3NbRExNX0NBTExCQUNLU19TSVpFXTsKIAlzdHJ1Y3QgZGxtX2NhbGxiYWNrCWxrYl9sYXN0X2Nhc3Q7CiAJc3RydWN0IGRsbV9jYWxsYmFjawlsa2JfbGFzdF9iYXN0OwpAQCAtMjk5LDcgKzI5NSw3IEBACiAJaW50CQkJcmVzX3JlY292ZXJfbG9ja3NfY291bnQ7CiAKIAljaGFyCQkJKnJlc19sdmJwdHI7Ci0JY2hhcgkJCXJlc19uYW1lWzFdOworCWNoYXIJCQlyZXNfbmFtZVtETE1fUkVTTkFNRV9NQVhMRU4rMV07CiB9OwogCiAvKiBmaW5kX3JzYigpIGZsYWdzICovCkBAIC00NjUsMTIgKzQ2MSwxMiBAQAogCXVuc2lnbmVkIGxvbmcJCWxzX3NjYW5fdGltZTsKIAlzdHJ1Y3Qga29iamVjdAkJbHNfa29iajsKIAorCXN0cnVjdCBpZHIJCWxzX2xrYmlkcjsKKwlzcGlubG9ja190CQlsc19sa2JpZHJfc3BpbjsKKwogCXN0cnVjdCBkbG1fcnNidGFibGUJKmxzX3JzYnRibDsKIAl1aW50MzJfdAkJbHNfcnNidGJsX3NpemU7CiAKLQlzdHJ1Y3QgZGxtX2xrYnRhYmxlCSpsc19sa2J0Ymw7Ci0JdWludDMyX3QJCWxzX2xrYnRibF9zaXplOwotCiAJc3RydWN0IGRsbV9kaXJ0YWJsZQkqbHNfZGlydGJsOwogCXVpbnQzMl90CQlsc19kaXJ0Ymxfc2l6ZTsKIApAQCAtNDgzLDYgKzQ3OSwxMCBAQAogCXN0cnVjdCBtdXRleAkJbHNfdGltZW91dF9tdXRleDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxzX3RpbWVvdXQ7CiAKKwlzcGlubG9ja190CQlsc19uZXdfcnNiX3NwaW47CisJaW50CQkJbHNfbmV3X3JzYl9jb3VudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxzX25ld19yc2I7CS8qIG5ldyByc2Igc3RydWN0cyAqLworCiAJc3RydWN0IGxpc3RfaGVhZAlsc19ub2RlczsJLyogY3VycmVudCBub2RlcyBpbiBscyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbHNfbm9kZXNfZ29uZTsJLyogZGVhZCBub2RlIGxpc3QsIHJlY292ZXJ5ICovCiAJaW50CQkJbHNfbnVtX25vZGVzOwkvKiBudW1iZXIgb2Ygbm9kZXMgaW4gbHMgKi8KQEAgLTUwNiw4ICs1MDYsMTIgQEAKIAogCXN0cnVjdCBtaXNjZGV2aWNlICAgICAgIGxzX2RldmljZTsKIAorCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSpsc19jYWxsYmFja193cTsKKwogCS8qIHJlY292ZXJ5IHJlbGF0ZWQgKi8KIAorCXN0cnVjdCBtdXRleAkJbHNfY2JfbXV0ZXg7CisJc3RydWN0IGxpc3RfaGVhZAlsc19jYl9kZWxheTsgLyogc2F2ZSBmb3IgcXVldWVfd29yayBsYXRlciAqLwogCXN0cnVjdCB0aW1lcl9saXN0CWxzX3RpbWVyOwogCXN0cnVjdCB0YXNrX3N0cnVjdAkqbHNfcmVjb3ZlcmRfdGFzazsKIAlzdHJ1Y3QgbXV0ZXgJCWxzX3JlY292ZXJkX2FjdGl2ZTsKQEAgLTU0NCw2ICs1NDgsNyBAQAogI2RlZmluZSBMU0ZMX1JDT01fV0FJVAkJNAogI2RlZmluZSBMU0ZMX1VFVkVOVF9XQUlUCTUKICNkZWZpbmUgTFNGTF9USU1FV0FSTgkJNgorI2RlZmluZSBMU0ZMX0NCX0RFTEFZCQk3CiAKIC8qIG11Y2ggb2YgdGhpcyBpcyBqdXN0IHNhdmluZyB1c2VyIHNwYWNlIHBvaW50ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUKICAgIGxvY2sgdGhhdCB3ZSBwYXNzIGJhY2sgdG8gdGhlIHVzZXIgbGliIHdpdGggYW4gYXN0ICovCmRpZmYgLS1naXQgYS9mcy9kbG0vbG9jay5jIGIvZnMvZGxtL2xvY2suYwppbmRleCBmNzFkMGI1Li44M2I1ZTMyIDEwMDY0NAotLS0gYS9mcy9kbG0vbG9jay5jCisrKyBiL2ZzL2RsbS9sb2NrLmMKQEAgLTMwNSw3ICszMDUsNyBAQAogCQlydiA9IC1FREVBRExLOwogCX0KIAotCWRsbV9hZGRfYXN0KGxrYiwgRExNX0NCX0NBU1QsIGxrYi0+bGtiX2dybW9kZSwgcnYsIGxrYi0+bGtiX3NiZmxhZ3MpOworCWRsbV9hZGRfY2IobGtiLCBETE1fQ0JfQ0FTVCwgbGtiLT5sa2JfZ3Jtb2RlLCBydiwgbGtiLT5sa2Jfc2JmbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBxdWV1ZV9jYXN0X292ZXJsYXAoc3RydWN0IGRsbV9yc2IgKnIsIHN0cnVjdCBkbG1fbGtiICpsa2IpCkBAIC0zMTksNyArMzE5LDcgQEAKIAlpZiAoaXNfbWFzdGVyX2NvcHkobGtiKSkgewogCQlzZW5kX2Jhc3QociwgbGtiLCBycW1vZGUpOwogCX0gZWxzZSB7Ci0JCWRsbV9hZGRfYXN0KGxrYiwgRExNX0NCX0JBU1QsIHJxbW9kZSwgMCwgMCk7CisJCWRsbV9hZGRfY2IobGtiLCBETE1fQ0JfQkFTVCwgcnFtb2RlLCAwLCAwKTsKIAl9CiB9CiAKQEAgLTMyNywxOSArMzI3LDY4IEBACiAgKiBCYXNpYyBvcGVyYXRpb25zIG9uIHJzYidzIGFuZCBsa2IncwogICovCiAKLXN0YXRpYyBzdHJ1Y3QgZGxtX3JzYiAqY3JlYXRlX3JzYihzdHJ1Y3QgZGxtX2xzICpscywgY2hhciAqbmFtZSwgaW50IGxlbikKK3N0YXRpYyBpbnQgcHJlX3JzYl9zdHJ1Y3Qoc3RydWN0IGRsbV9scyAqbHMpCit7CisJc3RydWN0IGRsbV9yc2IgKnIxLCAqcjI7CisJaW50IGNvdW50ID0gMDsKKworCXNwaW5fbG9jaygmbHMtPmxzX25ld19yc2Jfc3Bpbik7CisJaWYgKGxzLT5sc19uZXdfcnNiX2NvdW50ID4gZGxtX2NvbmZpZy5jaV9uZXdfcnNiX2NvdW50IC8gMikgeworCQlzcGluX3VubG9jaygmbHMtPmxzX25ld19yc2Jfc3Bpbik7CisJCXJldHVybiAwOworCX0KKwlzcGluX3VubG9jaygmbHMtPmxzX25ld19yc2Jfc3Bpbik7CisKKwlyMSA9IGRsbV9hbGxvY2F0ZV9yc2IobHMpOworCXIyID0gZGxtX2FsbG9jYXRlX3JzYihscyk7CisKKwlzcGluX2xvY2soJmxzLT5sc19uZXdfcnNiX3NwaW4pOworCWlmIChyMSkgeworCQlsaXN0X2FkZCgmcjEtPnJlc19oYXNoY2hhaW4sICZscy0+bHNfbmV3X3JzYik7CisJCWxzLT5sc19uZXdfcnNiX2NvdW50Kys7CisJfQorCWlmIChyMikgeworCQlsaXN0X2FkZCgmcjItPnJlc19oYXNoY2hhaW4sICZscy0+bHNfbmV3X3JzYik7CisJCWxzLT5sc19uZXdfcnNiX2NvdW50Kys7CisJfQorCWNvdW50ID0gbHMtPmxzX25ld19yc2JfY291bnQ7CisJc3Bpbl91bmxvY2soJmxzLT5sc19uZXdfcnNiX3NwaW4pOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKKy8qIElmIGxzLT5sc19uZXdfcnNiIGlzIGVtcHR5LCByZXR1cm4gLUVBR0FJTiwgc28gdGhlIGNhbGxlciBjYW4KKyAgIHVubG9jayBhbnkgc3BpbmxvY2tzLCBnbyBiYWNrIGFuZCBjYWxsIHByZV9yc2Jfc3RydWN0IGFnYWluLgorICAgT3RoZXJ3aXNlLCB0YWtlIGFuIHJzYiBvZmYgdGhlIGxpc3QgYW5kIHJldHVybiBpdC4gKi8KKworc3RhdGljIGludCBnZXRfcnNiX3N0cnVjdChzdHJ1Y3QgZGxtX2xzICpscywgY2hhciAqbmFtZSwgaW50IGxlbiwKKwkJCSAgc3RydWN0IGRsbV9yc2IgKipyX3JldCkKIHsKIAlzdHJ1Y3QgZGxtX3JzYiAqcjsKKwlpbnQgY291bnQ7CiAKLQlyID0gZGxtX2FsbG9jYXRlX3JzYihscywgbGVuKTsKLQlpZiAoIXIpCi0JCXJldHVybiBOVUxMOworCXNwaW5fbG9jaygmbHMtPmxzX25ld19yc2Jfc3Bpbik7CisJaWYgKGxpc3RfZW1wdHkoJmxzLT5sc19uZXdfcnNiKSkgeworCQljb3VudCA9IGxzLT5sc19uZXdfcnNiX2NvdW50OworCQlzcGluX3VubG9jaygmbHMtPmxzX25ld19yc2Jfc3Bpbik7CisJCWxvZ19kZWJ1ZyhscywgImZpbmRfcnNiIHJldHJ5ICVkICVkICVzIiwKKwkJCSAgY291bnQsIGRsbV9jb25maWcuY2lfbmV3X3JzYl9jb3VudCwgbmFtZSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZscy0+bHNfbmV3X3JzYiwgc3RydWN0IGRsbV9yc2IsIHJlc19oYXNoY2hhaW4pOworCWxpc3RfZGVsKCZyLT5yZXNfaGFzaGNoYWluKTsKKwlscy0+bHNfbmV3X3JzYl9jb3VudC0tOworCXNwaW5fdW5sb2NrKCZscy0+bHNfbmV3X3JzYl9zcGluKTsKIAogCXItPnJlc19scyA9IGxzOwogCXItPnJlc19sZW5ndGggPSBsZW47CiAJbWVtY3B5KHItPnJlc19uYW1lLCBuYW1lLCBsZW4pOwogCW11dGV4X2luaXQoJnItPnJlc19tdXRleCk7CiAKKwlJTklUX0xJU1RfSEVBRCgmci0+cmVzX2hhc2hjaGFpbik7CiAJSU5JVF9MSVNUX0hFQUQoJnItPnJlc19sb29rdXApOwogCUlOSVRfTElTVF9IRUFEKCZyLT5yZXNfZ3JhbnRxdWV1ZSk7CiAJSU5JVF9MSVNUX0hFQUQoJnItPnJlc19jb252ZXJ0cXVldWUpOwpAQCAtMzQ3LDcgKzM5Niw4IEBACiAJSU5JVF9MSVNUX0hFQUQoJnItPnJlc19yb290X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZyLT5yZXNfcmVjb3Zlcl9saXN0KTsKIAotCXJldHVybiByOworCSpyX3JldCA9IHI7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2VhcmNoX3JzYl9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGNoYXIgKm5hbWUsIGludCBsZW4sCkBAIC00MDUsMTYgKzQ1NSw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50IHNlYXJjaF9yc2Ioc3RydWN0IGRsbV9scyAqbHMsIGNoYXIgKm5hbWUsIGludCBsZW4sIGludCBiLAotCQkgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBkbG1fcnNiICoqcl9yZXQpCi17Ci0JaW50IGVycm9yOwotCXNwaW5fbG9jaygmbHMtPmxzX3JzYnRibFtiXS5sb2NrKTsKLQllcnJvciA9IF9zZWFyY2hfcnNiKGxzLCBuYW1lLCBsZW4sIGIsIGZsYWdzLCByX3JldCk7Ci0Jc3Bpbl91bmxvY2soJmxzLT5sc19yc2J0YmxbYl0ubG9jayk7Ci0JcmV0dXJuIGVycm9yOwotfQotCiAvKgogICogRmluZCByc2IgaW4gcnNidGJsIGFuZCBwb3RlbnRpYWxseSBjcmVhdGUvYWRkIG9uZQogICoKQEAgLTQzMiwzNSArNDcyLDQ4IEBACiBzdGF0aWMgaW50IGZpbmRfcnNiKHN0cnVjdCBkbG1fbHMgKmxzLCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKIAkJICAgIHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IGRsbV9yc2IgKipyX3JldCkKIHsKLQlzdHJ1Y3QgZGxtX3JzYiAqciA9IE5VTEwsICp0bXA7CisJc3RydWN0IGRsbV9yc2IgKnIgPSBOVUxMOwogCXVpbnQzMl90IGhhc2gsIGJ1Y2tldDsKLQlpbnQgZXJyb3IgPSAtRUlOVkFMOworCWludCBlcnJvcjsKIAotCWlmIChuYW1lbGVuID4gRExNX1JFU05BTUVfTUFYTEVOKQorCWlmIChuYW1lbGVuID4gRExNX1JFU05BTUVfTUFYTEVOKSB7CisJCWVycm9yID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CisJfQogCiAJaWYgKGRsbV9ub19kaXJlY3RvcnkobHMpKQogCQlmbGFncyB8PSBSX0NSRUFURTsKIAotCWVycm9yID0gMDsKIAloYXNoID0gamhhc2gobmFtZSwgbmFtZWxlbiwgMCk7CiAJYnVja2V0ID0gaGFzaCAmIChscy0+bHNfcnNidGJsX3NpemUgLSAxKTsKIAotCWVycm9yID0gc2VhcmNoX3JzYihscywgbmFtZSwgbmFtZWxlbiwgYnVja2V0LCBmbGFncywgJnIpOworIHJldHJ5OgorCWlmIChmbGFncyAmIFJfQ1JFQVRFKSB7CisJCWVycm9yID0gcHJlX3JzYl9zdHJ1Y3QobHMpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrKCZscy0+bHNfcnNidGJsW2J1Y2tldF0ubG9jayk7CisKKwllcnJvciA9IF9zZWFyY2hfcnNiKGxzLCBuYW1lLCBuYW1lbGVuLCBidWNrZXQsIGZsYWdzLCAmcik7CiAJaWYgKCFlcnJvcikKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCWlmIChlcnJvciA9PSAtRUJBRFIgJiYgIShmbGFncyAmIFJfQ1JFQVRFKSkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCS8qIHRoZSByc2Igd2FzIGZvdW5kIGJ1dCB3YXNuJ3QgYSBtYXN0ZXIgY29weSAqLwogCWlmIChlcnJvciA9PSAtRU5PVEJMSykKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAotCWVycm9yID0gLUVOT01FTTsKLQlyID0gY3JlYXRlX3JzYihscywgbmFtZSwgbmFtZWxlbik7Ci0JaWYgKCFyKQotCQlnb3RvIG91dDsKKwllcnJvciA9IGdldF9yc2Jfc3RydWN0KGxzLCBuYW1lLCBuYW1lbGVuLCAmcik7CisJaWYgKGVycm9yID09IC1FQUdBSU4pIHsKKwkJc3Bpbl91bmxvY2soJmxzLT5sc19yc2J0YmxbYnVja2V0XS5sb2NrKTsKKwkJZ290byByZXRyeTsKKwl9CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF91bmxvY2s7CiAKIAlyLT5yZXNfaGFzaCA9IGhhc2g7CiAJci0+cmVzX2J1Y2tldCA9IGJ1Y2tldDsKQEAgLTQ3NCwxOCArNTI3LDEwIEBACiAJCQlub2RlaWQgPSAwOwogCQlyLT5yZXNfbm9kZWlkID0gbm9kZWlkOwogCX0KLQotCXNwaW5fbG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOwotCWVycm9yID0gX3NlYXJjaF9yc2IobHMsIG5hbWUsIG5hbWVsZW4sIGJ1Y2tldCwgMCwgJnRtcCk7Ci0JaWYgKCFlcnJvcikgewotCQlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOwotCQlkbG1fZnJlZV9yc2Iocik7Ci0JCXIgPSB0bXA7Ci0JCWdvdG8gb3V0OwotCX0KIAlsaXN0X2FkZCgmci0+cmVzX2hhc2hjaGFpbiwgJmxzLT5sc19yc2J0YmxbYnVja2V0XS5saXN0KTsKLQlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOwogCWVycm9yID0gMDsKKyBvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZscy0+bHNfcnNidGJsW2J1Y2tldF0ubG9jayk7CiAgb3V0OgogCSpyX3JldCA9IHI7CiAJcmV0dXJuIGVycm9yOwpAQCAtNTgwLDkgKzYyNSw4IEBACiAKIHN0YXRpYyBpbnQgY3JlYXRlX2xrYihzdHJ1Y3QgZGxtX2xzICpscywgc3RydWN0IGRsbV9sa2IgKipsa2JfcmV0KQogewotCXN0cnVjdCBkbG1fbGtiICpsa2IsICp0bXA7Ci0JdWludDMyX3QgbGtpZCA9IDA7Ci0JdWludDE2X3QgYnVja2V0OworCXN0cnVjdCBkbG1fbGtiICpsa2I7CisJaW50IHJ2LCBpZDsKIAogCWxrYiA9IGRsbV9hbGxvY2F0ZV9sa2IobHMpOwogCWlmICghbGtiKQpAQCAtNTk0LDYwICs2MzgsNDIgQEAKIAlJTklUX0xJU1RfSEVBRCgmbGtiLT5sa2Jfb3ducXVldWUpOwogCUlOSVRfTElTVF9IRUFEKCZsa2ItPmxrYl9yc2JfbG9va3VwKTsKIAlJTklUX0xJU1RfSEVBRCgmbGtiLT5sa2JfdGltZV9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmbGtiLT5sa2JfYXN0cXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZsa2ItPmxrYl9jYl9saXN0KTsKKwltdXRleF9pbml0KCZsa2ItPmxrYl9jYl9tdXRleCk7CisJSU5JVF9XT1JLKCZsa2ItPmxrYl9jYl93b3JrLCBkbG1fY2FsbGJhY2tfd29yayk7CiAKLQlnZXRfcmFuZG9tX2J5dGVzKCZidWNrZXQsIHNpemVvZihidWNrZXQpKTsKLQlidWNrZXQgJj0gKGxzLT5sc19sa2J0Ymxfc2l6ZSAtIDEpOworIHJldHJ5OgorCXJ2ID0gaWRyX3ByZV9nZXQoJmxzLT5sc19sa2JpZHIsIEdGUF9OT0ZTKTsKKwlpZiAoIXJ2KQorCQlyZXR1cm4gLUVOT01FTTsKIAotCXdyaXRlX2xvY2soJmxzLT5sc19sa2J0YmxbYnVja2V0XS5sb2NrKTsKKwlzcGluX2xvY2soJmxzLT5sc19sa2JpZHJfc3Bpbik7CisJcnYgPSBpZHJfZ2V0X25ld19hYm92ZSgmbHMtPmxzX2xrYmlkciwgbGtiLCAxLCAmaWQpOworCWlmICghcnYpCisJCWxrYi0+bGtiX2lkID0gaWQ7CisJc3Bpbl91bmxvY2soJmxzLT5sc19sa2JpZHJfc3Bpbik7CiAKLQkvKiBjb3VudGVyIGNhbiByb2xsIG92ZXIgc28gd2UgbXVzdCB2ZXJpZnkgbGtpZCBpcyBub3QgaW4gdXNlICovCisJaWYgKHJ2ID09IC1FQUdBSU4pCisJCWdvdG8gcmV0cnk7CiAKLQl3aGlsZSAobGtpZCA9PSAwKSB7Ci0JCWxraWQgPSAoYnVja2V0IDw8IDE2KSB8IGxzLT5sc19sa2J0YmxbYnVja2V0XS5jb3VudGVyKys7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZscy0+bHNfbGtidGJsW2J1Y2tldF0ubGlzdCwKLQkJCQkgICAgbGtiX2lkdGJsX2xpc3QpIHsKLQkJCWlmICh0bXAtPmxrYl9pZCAhPSBsa2lkKQotCQkJCWNvbnRpbnVlOwotCQkJbGtpZCA9IDA7Ci0JCQlicmVhazsKLQkJfQorCWlmIChydiA8IDApIHsKKwkJbG9nX2Vycm9yKGxzLCAiY3JlYXRlX2xrYiBpZHIgZXJyb3IgJWQiLCBydik7CisJCXJldHVybiBydjsKIAl9CiAKLQlsa2ItPmxrYl9pZCA9IGxraWQ7Ci0JbGlzdF9hZGQoJmxrYi0+bGtiX2lkdGJsX2xpc3QsICZscy0+bHNfbGtidGJsW2J1Y2tldF0ubGlzdCk7Ci0Jd3JpdGVfdW5sb2NrKCZscy0+bHNfbGtidGJsW2J1Y2tldF0ubG9jayk7Ci0KIAkqbGtiX3JldCA9IGxrYjsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBkbG1fbGtiICpfX2ZpbmRfbGtiKHN0cnVjdCBkbG1fbHMgKmxzLCB1aW50MzJfdCBsa2lkKQotewotCXN0cnVjdCBkbG1fbGtiICpsa2I7Ci0JdWludDE2X3QgYnVja2V0ID0gKGxraWQgPj4gMTYpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZscy0+bHNfbGtidGJsW2J1Y2tldF0ubGlzdCwgbGtiX2lkdGJsX2xpc3QpIHsKLQkJaWYgKGxrYi0+bGtiX2lkID09IGxraWQpCi0JCQlyZXR1cm4gbGtiOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIGludCBmaW5kX2xrYihzdHJ1Y3QgZGxtX2xzICpscywgdWludDMyX3QgbGtpZCwgc3RydWN0IGRsbV9sa2IgKipsa2JfcmV0KQogewogCXN0cnVjdCBkbG1fbGtiICpsa2I7Ci0JdWludDE2X3QgYnVja2V0ID0gKGxraWQgPj4gMTYpOwogCi0JaWYgKGJ1Y2tldCA+PSBscy0+bHNfbGtidGJsX3NpemUpCi0JCXJldHVybiAtRUJBRFNMVDsKLQotCXJlYWRfbG9jaygmbHMtPmxzX2xrYnRibFtidWNrZXRdLmxvY2spOwotCWxrYiA9IF9fZmluZF9sa2IobHMsIGxraWQpOworCXNwaW5fbG9jaygmbHMtPmxzX2xrYmlkcl9zcGluKTsKKwlsa2IgPSBpZHJfZmluZCgmbHMtPmxzX2xrYmlkciwgbGtpZCk7CiAJaWYgKGxrYikKIAkJa3JlZl9nZXQoJmxrYi0+bGtiX3JlZik7Ci0JcmVhZF91bmxvY2soJmxzLT5sc19sa2J0YmxbYnVja2V0XS5sb2NrKTsKKwlzcGluX3VubG9jaygmbHMtPmxzX2xrYmlkcl9zcGluKTsKIAogCSpsa2JfcmV0ID0gbGtiOwogCXJldHVybiBsa2IgPyAwIDogLUVOT0VOVDsKQEAgLTY2OCwxMiArNjk0LDEyIEBACiAKIHN0YXRpYyBpbnQgX19wdXRfbGtiKHN0cnVjdCBkbG1fbHMgKmxzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiKQogewotCXVpbnQxNl90IGJ1Y2tldCA9IChsa2ItPmxrYl9pZCA+PiAxNik7CisJdWludDMyX3QgbGtpZCA9IGxrYi0+bGtiX2lkOwogCi0Jd3JpdGVfbG9jaygmbHMtPmxzX2xrYnRibFtidWNrZXRdLmxvY2spOworCXNwaW5fbG9jaygmbHMtPmxzX2xrYmlkcl9zcGluKTsKIAlpZiAoa3JlZl9wdXQoJmxrYi0+bGtiX3JlZiwga2lsbF9sa2IpKSB7Ci0JCWxpc3RfZGVsKCZsa2ItPmxrYl9pZHRibF9saXN0KTsKLQkJd3JpdGVfdW5sb2NrKCZscy0+bHNfbGtidGJsW2J1Y2tldF0ubG9jayk7CisJCWlkcl9yZW1vdmUoJmxzLT5sc19sa2JpZHIsIGxraWQpOworCQlzcGluX3VubG9jaygmbHMtPmxzX2xrYmlkcl9zcGluKTsKIAogCQlkZXRhY2hfbGtiKGxrYik7CiAKQEAgLTY4Myw3ICs3MDksNyBAQAogCQlkbG1fZnJlZV9sa2IobGtiKTsKIAkJcmV0dXJuIDE7CiAJfSBlbHNlIHsKLQkJd3JpdGVfdW5sb2NrKCZscy0+bHNfbGtidGJsW2J1Y2tldF0ubG9jayk7CisJCXNwaW5fdW5sb2NrKCZscy0+bHNfbGtiaWRyX3NwaW4pOwogCQlyZXR1cm4gMDsKIAl9CiB9CkBAIC04NDksOSArODc1LDcgQEAKIAogCQlpZiAoIW51bV9ub2RlcykgewogCQkJbnVtX25vZGVzID0gbHMtPmxzX251bV9ub2RlczsKLQkJCXdhcm5lZCA9IGttYWxsb2MoR0ZQX0tFUk5FTCwgbnVtX25vZGVzICogc2l6ZW9mKGludCkpOwotCQkJaWYgKHdhcm5lZCkKLQkJCQltZW1zZXQod2FybmVkLCAwLCBudW1fbm9kZXMgKiBzaXplb2YoaW50KSk7CisJCQl3YXJuZWQgPSBremFsbG9jKG51bV9ub2RlcyAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKIAkJfQogCQlpZiAoIXdhcm5lZCkKIAkJCWNvbnRpbnVlOwpAQCAtODYzLDkgKzg4Nyw3IEBACiAJCQkgIGRsbV9jb25maWcuY2lfd2FpdHdhcm5fdXMsIGxrYi0+bGtiX3dhaXRfbm9kZWlkKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZscy0+bHNfd2FpdGVyc19tdXRleCk7Ci0KLQlpZiAod2FybmVkKQotCQlrZnJlZSh3YXJuZWQpOworCWtmcmVlKHdhcm5lZCk7CiAKIAlpZiAoZGVidWdfZXhwaXJlZCkKIAkJbG9nX2RlYnVnKGxzLCAic2Nhbl93YWl0ZXJzICV1IHdhcm4gJXUgb3ZlciAlZCB1cyBtYXggJWxsZCB1cyIsCkBAIC0yNDAxLDkgKzI0MjMsNiBAQAogCiAJaWYgKGRlYWRsaykgewogCQkvKiBpdCdzIGxlZnQgb24gdGhlIGdyYW50ZWQgcXVldWUgKi8KLQkJbG9nX2RlYnVnKHItPnJlc19scywgImRlYWRsb2NrICV4IG5vZGUgJWQgc3RzJWQgZyVkIHIlZCAlcyIsCi0JCQkgIGxrYi0+bGtiX2lkLCBsa2ItPmxrYl9ub2RlaWQsIGxrYi0+bGtiX3N0YXR1cywKLQkJCSAgbGtiLT5sa2JfZ3Jtb2RlLCBsa2ItPmxrYl9ycW1vZGUsIHItPnJlc19uYW1lKTsKIAkJcmV2ZXJ0X2xvY2sociwgbGtiKTsKIAkJcXVldWVfY2FzdChyLCBsa2IsIC1FREVBRExLKTsKIAkJZXJyb3IgPSAtRURFQURMSzsKQEAgLTM5OTMsOCArNDAxMiw2IEBACiAJZGVmYXVsdDoKIAkJbG9nX2Vycm9yKGxzLCAidW5rbm93biBtZXNzYWdlIHR5cGUgJWQiLCBtcy0+bV90eXBlKTsKIAl9Ci0KLQlkbG1fYXN0ZF93YWtlKCk7CiB9CiAKIC8qIElmIHRoZSBsb2Nrc3BhY2UgaXMgaW4gcmVjb3ZlcnkgbW9kZSAobG9ja2luZyBzdG9wcGVkKSwgdGhlbiBub3JtYWwKQEAgLTQxMzMsNyArNDE1MCw3IEBACiAJc3RydWN0IGRsbV9tZXNzYWdlICptc19zdHViOwogCWludCB3YWl0X3R5cGUsIHN0dWJfdW5sb2NrX3Jlc3VsdCwgc3R1Yl9jYW5jZWxfcmVzdWx0OwogCi0JbXNfc3R1YiA9IGttYWxsb2MoR0ZQX0tFUk5FTCwgc2l6ZW9mKHN0cnVjdCBkbG1fbWVzc2FnZSkpOworCW1zX3N0dWIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX21lc3NhZ2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1zX3N0dWIpIHsKIAkJbG9nX2Vycm9yKGxzLCAiZGxtX3JlY292ZXJfd2FpdGVyc19wcmUgbm8gbWVtIik7CiAJCXJldHVybjsKQEAgLTQ4MDksNyArNDgyNiw3IEBACiAJCWdvdG8gb3V0X3B1dDsKIAogCXNwaW5fbG9jaygmdWEtPnByb2MtPmxvY2tzX3NwaW4pOwotCS8qIGRsbV91c2VyX2FkZF9hc3QoKSBtYXkgaGF2ZSBhbHJlYWR5IHRha2VuIGxrYiBvZmYgdGhlIHByb2MgbGlzdCAqLworCS8qIGRsbV91c2VyX2FkZF9jYigpIG1heSBoYXZlIGFscmVhZHkgdGFrZW4gbGtiIG9mZiB0aGUgcHJvYyBsaXN0ICovCiAJaWYgKCFsaXN0X2VtcHR5KCZsa2ItPmxrYl9vd25xdWV1ZSkpCiAJCWxpc3RfbW92ZSgmbGtiLT5sa2Jfb3ducXVldWUsICZ1YS0+cHJvYy0+dW5sb2NraW5nKTsKIAlzcGluX3VubG9jaygmdWEtPnByb2MtPmxvY2tzX3NwaW4pOwpAQCAtNDk0Niw3ICs0OTYzLDcgQEAKIAogLyogV2UgaGF2ZSB0byByZWxlYXNlIGNsZWFyX3Byb2NfbG9ja3MgbXV0ZXggYmVmb3JlIGNhbGxpbmcgdW5sb2NrX3Byb2NfbG9jaygpCiAgICAod2hpY2ggZG9lcyBsb2NrX3JzYikgZHVlIHRvIGRlYWRsb2NrIHdpdGggcmVjZWl2aW5nIGEgbWVzc2FnZSB0aGF0IGRvZXMKLSAgIGxvY2tfcnNiIGZvbGxvd2VkIGJ5IGRsbV91c2VyX2FkZF9hc3QoKSAqLworICAgbG9ja19yc2IgZm9sbG93ZWQgYnkgZGxtX3VzZXJfYWRkX2NiKCkgKi8KIAogc3RhdGljIHN0cnVjdCBkbG1fbGtiICpkZWxfcHJvY19sb2NrKHN0cnVjdCBkbG1fbHMgKmxzLAogCQkJCSAgICAgc3RydWN0IGRsbV91c2VyX3Byb2MgKnByb2MpCkBAIC00OTY5LDcgKzQ5ODYsNyBAQAogCXJldHVybiBsa2I7CiB9CiAKLS8qIFRoZSBsc19jbGVhcl9wcm9jX2xvY2tzIG11dGV4IHByb3RlY3RzIGFnYWluc3QgZGxtX3VzZXJfYWRkX2FzdHMoKSB3aGljaAorLyogVGhlIGxzX2NsZWFyX3Byb2NfbG9ja3MgbXV0ZXggcHJvdGVjdHMgYWdhaW5zdCBkbG1fdXNlcl9hZGRfY2IoKSB3aGljaAogICAgMSkgcmVmZXJlbmNlcyBsa2ItPnVhIHdoaWNoIHdlIGZyZWUgaGVyZSBhbmQgMikgYWRkcyBsa2JzIHRvIHByb2MtPmFzdHMsCiAgICB3aGljaCB3ZSBjbGVhciBoZXJlLiAqLwogCkBAIC01MDExLDEwICs1MDI4LDEwIEBACiAJCWRsbV9wdXRfbGtiKGxrYik7CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxrYiwgc2FmZSwgJnByb2MtPmFzdHMsIGxrYl9hc3RxdWV1ZSkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsa2IsIHNhZmUsICZwcm9jLT5hc3RzLCBsa2JfY2JfbGlzdCkgewogCQltZW1zZXQoJmxrYi0+bGtiX2NhbGxiYWNrcywgMCwKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGxtX2NhbGxiYWNrKSAqIERMTV9DQUxMQkFDS1NfU0laRSk7Ci0JCWxpc3RfZGVsX2luaXQoJmxrYi0+bGtiX2FzdHF1ZXVlKTsKKwkJbGlzdF9kZWxfaW5pdCgmbGtiLT5sa2JfY2JfbGlzdCk7CiAJCWRsbV9wdXRfbGtiKGxrYik7CiAJfQogCkBAIC01MDUzLDEwICs1MDcwLDEwIEBACiAJc3Bpbl91bmxvY2soJnByb2MtPmxvY2tzX3NwaW4pOwogCiAJc3Bpbl9sb2NrKCZwcm9jLT5hc3RzX3NwaW4pOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsa2IsIHNhZmUsICZwcm9jLT5hc3RzLCBsa2JfYXN0cXVldWUpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGtiLCBzYWZlLCAmcHJvYy0+YXN0cywgbGtiX2NiX2xpc3QpIHsKIAkJbWVtc2V0KCZsa2ItPmxrYl9jYWxsYmFja3MsIDAsCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGRsbV9jYWxsYmFjaykgKiBETE1fQ0FMTEJBQ0tTX1NJWkUpOwotCQlsaXN0X2RlbF9pbml0KCZsa2ItPmxrYl9hc3RxdWV1ZSk7CisJCWxpc3RfZGVsX2luaXQoJmxrYi0+bGtiX2NiX2xpc3QpOwogCQlkbG1fcHV0X2xrYihsa2IpOwogCX0KIAlzcGluX3VubG9jaygmcHJvYy0+YXN0c19zcGluKTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9sb2Nrc3BhY2UuYyBiL2ZzL2RsbS9sb2Nrc3BhY2UuYwppbmRleCAxNGNiZjQwLi5hMWQ4ZjFhIDEwMDY0NAotLS0gYS9mcy9kbG0vbG9ja3NwYWNlLmMKKysrIGIvZnMvZGxtL2xvY2tzcGFjZS5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSAibG9ja3NwYWNlLmgiCiAjaW5jbHVkZSAibWVtYmVyLmgiCiAjaW5jbHVkZSAicmVjb3ZlcmQuaCIKLSNpbmNsdWRlICJhc3QuaCIKICNpbmNsdWRlICJkaXIuaCIKICNpbmNsdWRlICJsb3djb21tcy5oIgogI2luY2x1ZGUgImNvbmZpZy5oIgpAQCAtMjQsNiArMjMsNyBAQAogI2luY2x1ZGUgInJlY292ZXIuaCIKICNpbmNsdWRlICJyZXF1ZXN0cXVldWUuaCIKICNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAiYXN0LmgiCiAKIHN0YXRpYyBpbnQJCQlsc19jb3VudDsKIHN0YXRpYyBzdHJ1Y3QgbXV0ZXgJCWxzX2xvY2s7CkBAIC0zNTksMTcgKzM1OSwxMCBAQAogewogCWludCBlcnJvcjsKIAotCS8qIFRocmVhZCB3aGljaCBwcm9jZXNzIGxvY2sgcmVxdWVzdHMgZm9yIGFsbCBsb2Nrc3BhY2UncyAqLwotCWVycm9yID0gZGxtX2FzdGRfc3RhcnQoKTsKLQlpZiAoZXJyb3IpIHsKLQkJbG9nX3ByaW50KCJjYW5ub3Qgc3RhcnQgZGxtX2FzdGQgdGhyZWFkICVkIiwgZXJyb3IpOwotCQlnb3RvIGZhaWw7Ci0JfQotCiAJZXJyb3IgPSBkbG1fc2NhbmRfc3RhcnQoKTsKIAlpZiAoZXJyb3IpIHsKIAkJbG9nX3ByaW50KCJjYW5ub3Qgc3RhcnQgZGxtX3NjYW5kIHRocmVhZCAlZCIsIGVycm9yKTsKLQkJZ290byBhc3RkX2ZhaWw7CisJCWdvdG8gZmFpbDsKIAl9CiAKIAkvKiBUaHJlYWQgZm9yIHNlbmRpbmcvcmVjZWl2aW5nIG1lc3NhZ2VzIGZvciBhbGwgbG9ja3NwYWNlJ3MgKi8KQEAgLTM4Myw4ICszNzYsNiBAQAogCiAgc2NhbmRfZmFpbDoKIAlkbG1fc2NhbmRfc3RvcCgpOwotIGFzdGRfZmFpbDoKLQlkbG1fYXN0ZF9zdG9wKCk7CiAgZmFpbDoKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0zOTMsNyArMzg0LDYgQEAKIHsKIAlkbG1fc2NhbmRfc3RvcCgpOwogCWRsbV9sb3djb21tc19zdG9wKCk7Ci0JZGxtX2FzdGRfc3RvcCgpOwogfQogCiBzdGF0aWMgaW50IG5ld19sb2Nrc3BhY2UoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIHZvaWQgKipsb2Nrc3BhY2UsCkBAIC00NjMsNyArNDUzLDcgQEAKIAlzaXplID0gZGxtX2NvbmZpZy5jaV9yc2J0Ymxfc2l6ZTsKIAlscy0+bHNfcnNidGJsX3NpemUgPSBzaXplOwogCi0JbHMtPmxzX3JzYnRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fcnNidGFibGUpICogc2l6ZSwgR0ZQX05PRlMpOworCWxzLT5sc19yc2J0YmwgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX3JzYnRhYmxlKSAqIHNpemUpOwogCWlmICghbHMtPmxzX3JzYnRibCkKIAkJZ290byBvdXRfbHNmcmVlOwogCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKQEAgLTQ3MiwyMiArNDYyLDEzIEBACiAJCXNwaW5fbG9ja19pbml0KCZscy0+bHNfcnNidGJsW2ldLmxvY2spOwogCX0KIAotCXNpemUgPSBkbG1fY29uZmlnLmNpX2xrYnRibF9zaXplOwotCWxzLT5sc19sa2J0Ymxfc2l6ZSA9IHNpemU7Ci0KLQlscy0+bHNfbGtidGJsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9sa2J0YWJsZSkgKiBzaXplLCBHRlBfTk9GUyk7Ci0JaWYgKCFscy0+bHNfbGtidGJsKQotCQlnb3RvIG91dF9yc2JmcmVlOwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJSU5JVF9MSVNUX0hFQUQoJmxzLT5sc19sa2J0YmxbaV0ubGlzdCk7Ci0JCXJ3bG9ja19pbml0KCZscy0+bHNfbGtidGJsW2ldLmxvY2spOwotCQlscy0+bHNfbGtidGJsW2ldLmNvdW50ZXIgPSAxOwotCX0KKwlpZHJfaW5pdCgmbHMtPmxzX2xrYmlkcik7CisJc3Bpbl9sb2NrX2luaXQoJmxzLT5sc19sa2JpZHJfc3Bpbik7CiAKIAlzaXplID0gZGxtX2NvbmZpZy5jaV9kaXJ0Ymxfc2l6ZTsKIAlscy0+bHNfZGlydGJsX3NpemUgPSBzaXplOwogCi0JbHMtPmxzX2RpcnRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fZGlydGFibGUpICogc2l6ZSwgR0ZQX05PRlMpOworCWxzLT5sc19kaXJ0YmwgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgZGxtX2RpcnRhYmxlKSAqIHNpemUpOwogCWlmICghbHMtPmxzX2RpcnRibCkKIAkJZ290byBvdXRfbGtiZnJlZTsKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CkBAIC01MDIsNiArNDgzLDkgQEAKIAlJTklUX0xJU1RfSEVBRCgmbHMtPmxzX3RpbWVvdXQpOwogCW11dGV4X2luaXQoJmxzLT5sc190aW1lb3V0X211dGV4KTsKIAorCUlOSVRfTElTVF9IRUFEKCZscy0+bHNfbmV3X3JzYik7CisJc3Bpbl9sb2NrX2luaXQoJmxzLT5sc19uZXdfcnNiX3NwaW4pOworCiAJSU5JVF9MSVNUX0hFQUQoJmxzLT5sc19ub2Rlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJmxzLT5sc19ub2Rlc19nb25lKTsKIAlscy0+bHNfbnVtX25vZGVzID0gMDsKQEAgLTUyMCw2ICs1MDQsOSBAQAogCWluaXRfY29tcGxldGlvbigmbHMtPmxzX21lbWJlcnNfZG9uZSk7CiAJbHMtPmxzX21lbWJlcnNfcmVzdWx0ID0gLTE7CiAKKwltdXRleF9pbml0KCZscy0+bHNfY2JfbXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZscy0+bHNfY2JfZGVsYXkpOworCiAJbHMtPmxzX3JlY292ZXJkX3Rhc2sgPSBOVUxMOwogCW11dGV4X2luaXQoJmxzLT5sc19yZWNvdmVyZF9hY3RpdmUpOwogCXNwaW5fbG9ja19pbml0KCZscy0+bHNfcmVjb3Zlcl9sb2NrKTsKQEAgLTU1MywxOCArNTQwLDI2IEBACiAJbGlzdF9hZGQoJmxzLT5sc19saXN0LCAmbHNsaXN0KTsKIAlzcGluX3VubG9jaygmbHNsaXN0X2xvY2spOwogCisJaWYgKGZsYWdzICYgRExNX0xTRkxfRlMpIHsKKwkJZXJyb3IgPSBkbG1fY2FsbGJhY2tfc3RhcnQobHMpOworCQlpZiAoZXJyb3IpIHsKKwkJCWxvZ19lcnJvcihscywgImNhbid0IHN0YXJ0IGRsbV9jYWxsYmFjayAlZCIsIGVycm9yKTsKKwkJCWdvdG8gb3V0X2RlbGlzdDsKKwkJfQorCX0KKwogCS8qIG5lZWRzIHRvIGZpbmQgbHMgaW4gbHNsaXN0ICovCiAJZXJyb3IgPSBkbG1fcmVjb3ZlcmRfc3RhcnQobHMpOwogCWlmIChlcnJvcikgewogCQlsb2dfZXJyb3IobHMsICJjYW4ndCBzdGFydCBkbG1fcmVjb3ZlcmQgJWQiLCBlcnJvcik7Ci0JCWdvdG8gb3V0X2RlbGlzdDsKKwkJZ290byBvdXRfY2FsbGJhY2s7CiAJfQogCiAJbHMtPmxzX2tvYmoua3NldCA9IGRsbV9rc2V0OwogCWVycm9yID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmxzLT5sc19rb2JqLCAmZGxtX2t0eXBlLCBOVUxMLAogCQkJCSAgICAgIiVzIiwgbHMtPmxzX25hbWUpOwogCWlmIChlcnJvcikKLQkJZ290byBvdXRfc3RvcDsKKwkJZ290byBvdXRfcmVjb3ZlcmQ7CiAJa29iamVjdF91ZXZlbnQoJmxzLT5sc19rb2JqLCBLT0JKX0FERCk7CiAKIAkvKiBsZXQga29iamVjdCBoYW5kbGUgZnJlZWluZyBvZiBscyBpZiB0aGVyZSdzIGFuIGVycm9yICovCkBAIC01NzgsNyArNTczLDcgQEAKIAogCWVycm9yID0gZG9fdWV2ZW50KGxzLCAxKTsKIAlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X3N0b3A7CisJCWdvdG8gb3V0X3JlY292ZXJkOwogCiAJd2FpdF9mb3JfY29tcGxldGlvbigmbHMtPmxzX21lbWJlcnNfZG9uZSk7CiAJZXJyb3IgPSBscy0+bHNfbWVtYmVyc19yZXN1bHQ7CkBAIC01OTUsMTkgKzU5MCwyMCBAQAogCWRvX3VldmVudChscywgMCk7CiAJZGxtX2NsZWFyX21lbWJlcnMobHMpOwogCWtmcmVlKGxzLT5sc19ub2RlX2FycmF5KTsKLSBvdXRfc3RvcDoKKyBvdXRfcmVjb3ZlcmQ6CiAJZGxtX3JlY292ZXJkX3N0b3AobHMpOworIG91dF9jYWxsYmFjazoKKwlkbG1fY2FsbGJhY2tfc3RvcChscyk7CiAgb3V0X2RlbGlzdDoKIAlzcGluX2xvY2soJmxzbGlzdF9sb2NrKTsKIAlsaXN0X2RlbCgmbHMtPmxzX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZsc2xpc3RfbG9jayk7CiAJa2ZyZWUobHMtPmxzX3JlY292ZXJfYnVmKTsKICBvdXRfZGlyZnJlZToKLQlrZnJlZShscy0+bHNfZGlydGJsKTsKKwl2ZnJlZShscy0+bHNfZGlydGJsKTsKICBvdXRfbGtiZnJlZToKLQlrZnJlZShscy0+bHNfbGtidGJsKTsKLSBvdXRfcnNiZnJlZToKLQlrZnJlZShscy0+bHNfcnNidGJsKTsKKwlpZHJfZGVzdHJveSgmbHMtPmxzX2xrYmlkcik7CisJdmZyZWUobHMtPmxzX3JzYnRibCk7CiAgb3V0X2xzZnJlZToKIAlpZiAoZG9fdW5yZWcpCiAJCWtvYmplY3RfcHV0KCZscy0+bHNfa29iaik7CkBAIC02NDEsNTAgKzYzNyw2NCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyogUmV0dXJuIDEgaWYgdGhlIGxvY2tzcGFjZSBzdGlsbCBoYXMgYWN0aXZlIHJlbW90ZSBsb2NrcywKLSAqICAgICAgICAyIGlmIHRoZSBsb2Nrc3BhY2Ugc3RpbGwgaGFzIGFjdGl2ZSBsb2NhbCBsb2Nrcy4KLSAqLwotc3RhdGljIGludCBsb2Nrc3BhY2VfYnVzeShzdHJ1Y3QgZGxtX2xzICpscykKK3N0YXRpYyBpbnQgbGtiX2lkcl9pc19sb2NhbChpbnQgaWQsIHZvaWQgKnAsIHZvaWQgKmRhdGEpCiB7Ci0JaW50IGksIGxrYl9mb3VuZCA9IDA7Ci0Jc3RydWN0IGRsbV9sa2IgKmxrYjsKKwlzdHJ1Y3QgZGxtX2xrYiAqbGtiID0gcDsKIAotCS8qIE5PVEU6IFdlIGNoZWNrIHRoZSBsb2NraWR0YmwgaGVyZSByYXRoZXIgdGhhbiB0aGUgcmVzb3VyY2UgdGFibGUuCi0JICAgVGhpcyBpcyBiZWNhdXNlIHRoZXJlIG1heSBiZSBMS0JzIHF1ZXVlZCBhcyBBU1RzIHRoYXQgaGF2ZSBiZWVuCi0JICAgdW5saW5rZWQgZnJvbSB0aGVpciBSU0JzIGFuZCBhcmUgcGVuZGluZyBkZWxldGlvbiBvbmNlIHRoZSBBU1QgaGFzCi0JICAgYmVlbiBkZWxpdmVyZWQgKi8KKwlpZiAoIWxrYi0+bGtiX25vZGVpZCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbHMtPmxzX2xrYnRibF9zaXplOyBpKyspIHsKLQkJcmVhZF9sb2NrKCZscy0+bHNfbGtidGJsW2ldLmxvY2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJmxzLT5sc19sa2J0YmxbaV0ubGlzdCkpIHsKLQkJCWxrYl9mb3VuZCA9IDE7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJmxzLT5sc19sa2J0YmxbaV0ubGlzdCwKLQkJCQkJICAgIGxrYl9pZHRibF9saXN0KSB7Ci0JCQkJaWYgKCFsa2ItPmxrYl9ub2RlaWQpIHsKLQkJCQkJcmVhZF91bmxvY2soJmxzLT5sc19sa2J0YmxbaV0ubG9jayk7Ci0JCQkJCXJldHVybiAyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZWFkX3VubG9jaygmbHMtPmxzX2xrYnRibFtpXS5sb2NrKTsKK3N0YXRpYyBpbnQgbGtiX2lkcl9pc19hbnkoaW50IGlkLCB2b2lkICpwLCB2b2lkICpkYXRhKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxrYl9pZHJfZnJlZShpbnQgaWQsIHZvaWQgKnAsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRsbV9sa2IgKmxrYiA9IHA7CisKKwlpZiAobGtiLT5sa2JfbHZicHRyICYmIGxrYi0+bGtiX2ZsYWdzICYgRExNX0lGTF9NU1RDUFkpCisJCWRsbV9mcmVlX2x2Yihsa2ItPmxrYl9sdmJwdHIpOworCisJZGxtX2ZyZWVfbGtiKGxrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIE5PVEU6IFdlIGNoZWNrIHRoZSBsa2JpZHIgaGVyZSByYXRoZXIgdGhhbiB0aGUgcmVzb3VyY2UgdGFibGUuCisgICBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgbWF5IGJlIExLQnMgcXVldWVkIGFzIEFTVHMgdGhhdCBoYXZlIGJlZW4gdW5saW5rZWQKKyAgIGZyb20gdGhlaXIgUlNCcyBhbmQgYXJlIHBlbmRpbmcgZGVsZXRpb24gb25jZSB0aGUgQVNUIGhhcyBiZWVuIGRlbGl2ZXJlZCAqLworCitzdGF0aWMgaW50IGxvY2tzcGFjZV9idXN5KHN0cnVjdCBkbG1fbHMgKmxzLCBpbnQgZm9yY2UpCit7CisJaW50IHJ2OworCisJc3Bpbl9sb2NrKCZscy0+bHNfbGtiaWRyX3NwaW4pOworCWlmIChmb3JjZSA9PSAwKSB7CisJCXJ2ID0gaWRyX2Zvcl9lYWNoKCZscy0+bHNfbGtiaWRyLCBsa2JfaWRyX2lzX2FueSwgbHMpOworCX0gZWxzZSBpZiAoZm9yY2UgPT0gMSkgeworCQlydiA9IGlkcl9mb3JfZWFjaCgmbHMtPmxzX2xrYmlkciwgbGtiX2lkcl9pc19sb2NhbCwgbHMpOworCX0gZWxzZSB7CisJCXJ2ID0gMDsKIAl9Ci0JcmV0dXJuIGxrYl9mb3VuZDsKKwlzcGluX3VubG9jaygmbHMtPmxzX2xrYmlkcl9zcGluKTsKKwlyZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBpbnQgcmVsZWFzZV9sb2Nrc3BhY2Uoc3RydWN0IGRsbV9scyAqbHMsIGludCBmb3JjZSkKIHsKLQlzdHJ1Y3QgZGxtX2xrYiAqbGtiOwogCXN0cnVjdCBkbG1fcnNiICpyc2I7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKIAlpbnQgaSwgYnVzeSwgcnY7CiAKLQlidXN5ID0gbG9ja3NwYWNlX2J1c3kobHMpOworCWJ1c3kgPSBsb2Nrc3BhY2VfYnVzeShscywgZm9yY2UpOwogCiAJc3Bpbl9sb2NrKCZsc2xpc3RfbG9jayk7CiAJaWYgKGxzLT5sc19jcmVhdGVfY291bnQgPT0gMSkgewotCQlpZiAoYnVzeSA+IGZvcmNlKQorCQlpZiAoYnVzeSkgewogCQkJcnYgPSAtRUJVU1k7Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyogcmVtb3ZlX2xvY2tzcGFjZSB0YWtlcyBscyBvZmYgbHNsaXN0ICovCiAJCQlscy0+bHNfY3JlYXRlX2NvdW50ID0gMDsKIAkJCXJ2ID0gMDsKQEAgLTcwOCwxMiArNzE4LDEyIEBACiAKIAlkbG1fcmVjb3ZlcmRfc3RvcChscyk7CiAKKwlkbG1fY2FsbGJhY2tfc3RvcChscyk7CisKIAlyZW1vdmVfbG9ja3NwYWNlKGxzKTsKIAogCWRsbV9kZWxldGVfZGVidWdfZmlsZShscyk7CiAKLQlkbG1fYXN0ZF9zdXNwZW5kKCk7Ci0KIAlrZnJlZShscy0+bHNfcmVjb3Zlcl9idWYpOwogCiAJLyoKQEAgLTcyMSwzMSArNzMxLDE1IEBACiAJICovCiAKIAlkbG1fZGlyX2NsZWFyKGxzKTsKLQlrZnJlZShscy0+bHNfZGlydGJsKTsKKwl2ZnJlZShscy0+bHNfZGlydGJsKTsKIAogCS8qCi0JICogRnJlZSBhbGwgbGtiJ3Mgb24gbGtidGJsW10gbGlzdHMuCisJICogRnJlZSBhbGwgbGtiJ3MgaW4gaWRyCiAJICovCiAKLQlmb3IgKGkgPSAwOyBpIDwgbHMtPmxzX2xrYnRibF9zaXplOyBpKyspIHsKLQkJaGVhZCA9ICZscy0+bHNfbGtidGJsW2ldLmxpc3Q7Ci0JCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgewotCQkJbGtiID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgZGxtX2xrYiwKLQkJCQkJIGxrYl9pZHRibF9saXN0KTsKLQotCQkJbGlzdF9kZWwoJmxrYi0+bGtiX2lkdGJsX2xpc3QpOwotCi0JCQlkbG1fZGVsX2FzdChsa2IpOwotCi0JCQlpZiAobGtiLT5sa2JfbHZicHRyICYmIGxrYi0+bGtiX2ZsYWdzICYgRExNX0lGTF9NU1RDUFkpCi0JCQkJZGxtX2ZyZWVfbHZiKGxrYi0+bGtiX2x2YnB0cik7Ci0KLQkJCWRsbV9mcmVlX2xrYihsa2IpOwotCQl9Ci0JfQotCWRsbV9hc3RkX3Jlc3VtZSgpOwotCi0Ja2ZyZWUobHMtPmxzX2xrYnRibCk7CisJaWRyX2Zvcl9lYWNoKCZscy0+bHNfbGtiaWRyLCBsa2JfaWRyX2ZyZWUsIGxzKTsKKwlpZHJfcmVtb3ZlX2FsbCgmbHMtPmxzX2xrYmlkcik7CisJaWRyX2Rlc3Ryb3koJmxzLT5sc19sa2JpZHIpOwogCiAJLyoKIAkgKiBGcmVlIGFsbCByc2IncyBvbiByc2J0YmxbXSBsaXN0cwpAQCAtNzcwLDcgKzc2NCwxNCBAQAogCQl9CiAJfQogCi0Ja2ZyZWUobHMtPmxzX3JzYnRibCk7CisJdmZyZWUobHMtPmxzX3JzYnRibCk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmxzLT5sc19uZXdfcnNiKSkgeworCQlyc2IgPSBsaXN0X2ZpcnN0X2VudHJ5KCZscy0+bHNfbmV3X3JzYiwgc3RydWN0IGRsbV9yc2IsCisJCQkJICAgICAgIHJlc19oYXNoY2hhaW4pOworCQlsaXN0X2RlbCgmcnNiLT5yZXNfaGFzaGNoYWluKTsKKwkJZGxtX2ZyZWVfcnNiKHJzYik7CisJfQogCiAJLyoKIAkgKiBGcmVlIHN0cnVjdHVyZXMgb24gYW55IG90aGVyIGxpc3RzCmRpZmYgLS1naXQgYS9mcy9kbG0vbG93Y29tbXMuYyBiL2ZzL2RsbS9sb3djb21tcy5jCmluZGV4IDVlMmM3MWYuLjk5MDYyNmUgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9sb3djb21tcy5jCisrKyBiL2ZzL2RsbS9sb3djb21tcy5jCkBAIC01MTIsMTIgKzUxMiwxMCBAQAogCQkJfQogCQkJbWFrZV9zb2NrYWRkcigmcHJpbS5zc3BfYWRkciwgMCwgJmFkZHJfbGVuKTsKIAkJCWlmIChkbG1fYWRkcl90b19ub2RlaWQoJnByaW0uc3NwX2FkZHIsICZub2RlaWQpKSB7Ci0JCQkJaW50IGk7CiAJCQkJdW5zaWduZWQgY2hhciAqYj0odW5zaWduZWQgY2hhciAqKSZwcmltLnNzcF9hZGRyOwogCQkJCWxvZ19wcmludCgicmVqZWN0IGNvbm5lY3QgZnJvbSB1bmtub3duIGFkZHIiKTsKLQkJCQlmb3IgKGk9MDsgaTxzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpO2krKykKLQkJCQkJcHJpbnRrKCIlMDJ4ICIsIGJbaV0pOwotCQkJCXByaW50aygiXG4iKTsKKwkJCQlwcmludF9oZXhfZHVtcF9ieXRlcygic3M6ICIsIERVTVBfUFJFRklYX05PTkUsIAorCQkJCQkJICAgICBiLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpKTsKIAkJCQlzY3RwX3NlbmRfc2h1dGRvd24ocHJpbS5zc3BfYXNzb2NfaWQpOwogCQkJCXJldHVybjsKIAkJCX0KQEAgLTc0OCw3ICs3NDYsMTAgQEAKIAkvKiBHZXQgdGhlIG5ldyBub2RlJ3MgTk9ERUlEICovCiAJbWFrZV9zb2NrYWRkcigmcGVlcmFkZHIsIDAsICZsZW4pOwogCWlmIChkbG1fYWRkcl90b19ub2RlaWQoJnBlZXJhZGRyLCAmbm9kZWlkKSkgeworCQl1bnNpZ25lZCBjaGFyICpiPSh1bnNpZ25lZCBjaGFyICopJnBlZXJhZGRyOwogCQlsb2dfcHJpbnQoImNvbm5lY3QgZnJvbSBub24gY2x1c3RlciBub2RlIik7CisJCXByaW50X2hleF9kdW1wX2J5dGVzKCJzczogIiwgRFVNUF9QUkVGSVhfTk9ORSwgCisJCQkJICAgICBiLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpKTsKIAkJc29ja19yZWxlYXNlKG5ld3NvY2spOwogCQltdXRleF91bmxvY2soJmNvbi0+c29ja19tdXRleCk7CiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9tZW1vcnkuYyBiL2ZzL2RsbS9tZW1vcnkuYwppbmRleCA4ZTBkMDBkLi5kYTY0ZGY3IDEwMDY0NAotLS0gYS9mcy9kbG0vbWVtb3J5LmMKKysrIGIvZnMvZGxtL21lbW9yeS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSAibWVtb3J5LmgiCiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbGtiX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpyc2JfY2FjaGU7CiAKIAogaW50IF9faW5pdCBkbG1fbWVtb3J5X2luaXQodm9pZCkKQEAgLTI2LDYgKzI3LDE0IEBACiAJCQkJX19hbGlnbm9mX18oc3RydWN0IGRsbV9sa2IpLCAwLCBOVUxMKTsKIAlpZiAoIWxrYl9jYWNoZSkKIAkJcmV0ID0gLUVOT01FTTsKKworCXJzYl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJkbG1fcnNiIiwgc2l6ZW9mKHN0cnVjdCBkbG1fcnNiKSwKKwkJCQlfX2FsaWdub2ZfXyhzdHJ1Y3QgZGxtX3JzYiksIDAsIE5VTEwpOworCWlmICghcnNiX2NhY2hlKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShsa2JfY2FjaGUpOworCQlyZXQgPSAtRU5PTUVNOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTMzLDYgKzQyLDggQEAKIHsKIAlpZiAobGtiX2NhY2hlKQogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kobGtiX2NhY2hlKTsKKwlpZiAocnNiX2NhY2hlKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocnNiX2NhY2hlKTsKIH0KIAogY2hhciAqZGxtX2FsbG9jYXRlX2x2YihzdHJ1Y3QgZGxtX2xzICpscykKQEAgLTQ4LDE2ICs1OSwxMSBAQAogCWtmcmVlKHApOwogfQogCi0vKiBGSVhNRTogaGF2ZSBzb21lIG1pbmltYWwgc3BhY2UgYnVpbHQtaW4gdG8gcnNiIGZvciB0aGUgbmFtZSBhbmQKLSAgIGttYWxsb2MgYSBzZXBhcmF0ZSBuYW1lIGlmIG5lZWRlZCwgbGlrZSBkZW50cmllcyBhcmUgZG9uZSAqLwotCi1zdHJ1Y3QgZGxtX3JzYiAqZGxtX2FsbG9jYXRlX3JzYihzdHJ1Y3QgZGxtX2xzICpscywgaW50IG5hbWVsZW4pCitzdHJ1Y3QgZGxtX3JzYiAqZGxtX2FsbG9jYXRlX3JzYihzdHJ1Y3QgZGxtX2xzICpscykKIHsKIAlzdHJ1Y3QgZGxtX3JzYiAqcjsKIAotCURMTV9BU1NFUlQobmFtZWxlbiA8PSBETE1fUkVTTkFNRV9NQVhMRU4sKTsKLQotCXIgPSBremFsbG9jKHNpemVvZigqcikgKyBuYW1lbGVuLCBHRlBfTk9GUyk7CisJciA9IGttZW1fY2FjaGVfemFsbG9jKHJzYl9jYWNoZSwgR0ZQX05PRlMpOwogCXJldHVybiByOwogfQogCkBAIC02NSw3ICs3MSw3IEBACiB7CiAJaWYgKHItPnJlc19sdmJwdHIpCiAJCWRsbV9mcmVlX2x2YihyLT5yZXNfbHZicHRyKTsKLQlrZnJlZShyKTsKKwlrbWVtX2NhY2hlX2ZyZWUocnNiX2NhY2hlLCByKTsKIH0KIAogc3RydWN0IGRsbV9sa2IgKmRsbV9hbGxvY2F0ZV9sa2Ioc3RydWN0IGRsbV9scyAqbHMpCmRpZmYgLS1naXQgYS9mcy9kbG0vbWVtb3J5LmggYi9mcy9kbG0vbWVtb3J5LmgKaW5kZXggNDg1ZmIyOS4uMTc3YzExYyAxMDA2NDQKLS0tIGEvZnMvZGxtL21lbW9yeS5oCisrKyBiL2ZzL2RsbS9tZW1vcnkuaApAQCAtMTYsNyArMTYsNyBAQAogCiBpbnQgZGxtX21lbW9yeV9pbml0KHZvaWQpOwogdm9pZCBkbG1fbWVtb3J5X2V4aXQodm9pZCk7Ci1zdHJ1Y3QgZGxtX3JzYiAqZGxtX2FsbG9jYXRlX3JzYihzdHJ1Y3QgZGxtX2xzICpscywgaW50IG5hbWVsZW4pOworc3RydWN0IGRsbV9yc2IgKmRsbV9hbGxvY2F0ZV9yc2Ioc3RydWN0IGRsbV9scyAqbHMpOwogdm9pZCBkbG1fZnJlZV9yc2Ioc3RydWN0IGRsbV9yc2IgKnIpOwogc3RydWN0IGRsbV9sa2IgKmRsbV9hbGxvY2F0ZV9sa2Ioc3RydWN0IGRsbV9scyAqbHMpOwogdm9pZCBkbG1fZnJlZV9sa2Ioc3RydWN0IGRsbV9sa2IgKmwpOwpkaWZmIC0tZ2l0IGEvZnMvZGxtL3Bsb2NrLmMgYi9mcy9kbG0vcGxvY2suYwppbmRleCBlMmI4NzgwLi4wMWZkNWMxIDEwMDY0NAotLS0gYS9mcy9kbG0vcGxvY2suYworKysgYi9mcy9kbG0vcGxvY2suYwpAQCAtOTIsNyArOTIsNyBAQAogCW9wLT5pbmZvLm51bWJlcgkJPSBudW1iZXI7CiAJb3AtPmluZm8uc3RhcnQJCT0gMDsKIAlvcC0+aW5mby5lbmQJCT0gT0ZGU0VUX01BWDsKLQlpZiAoZmwtPmZsX2xtb3BzICYmIGZsLT5mbF9sbW9wcy0+ZmxfZ3JhbnQpCisJaWYgKGZsLT5mbF9sbW9wcyAmJiBmbC0+ZmxfbG1vcHMtPmxtX2dyYW50KQogCQlvcC0+aW5mby5vd25lcgk9IChfX3U2NCkgZmwtPmZsX3BpZDsKIAllbHNlCiAJCW9wLT5pbmZvLm93bmVyCT0gKF9fdTY0KShsb25nKSBmbC0+Zmxfb3duZXI7CkBAIC0xMjgsMTEgKzEyOCwxMSBAQAogCW9wLT5pbmZvLm51bWJlcgkJPSBudW1iZXI7CiAJb3AtPmluZm8uc3RhcnQJCT0gZmwtPmZsX3N0YXJ0OwogCW9wLT5pbmZvLmVuZAkJPSBmbC0+ZmxfZW5kOwotCWlmIChmbC0+ZmxfbG1vcHMgJiYgZmwtPmZsX2xtb3BzLT5mbF9ncmFudCkgeworCWlmIChmbC0+ZmxfbG1vcHMgJiYgZmwtPmZsX2xtb3BzLT5sbV9ncmFudCkgewogCQkvKiBmbF9vd25lciBpcyBsb2NrZCB3aGljaCBkb2Vzbid0IGRpc3Rpbmd1aXNoCiAJCSAgIHByb2Nlc3NlcyBvbiB0aGUgbmZzIGNsaWVudCAqLwogCQlvcC0+aW5mby5vd25lcgk9IChfX3U2NCkgZmwtPmZsX3BpZDsKLQkJeG9wLT5jYWxsYmFjawk9IGZsLT5mbF9sbW9wcy0+ZmxfZ3JhbnQ7CisJCXhvcC0+Y2FsbGJhY2sJPSBmbC0+ZmxfbG1vcHMtPmxtX2dyYW50OwogCQlsb2Nrc19pbml0X2xvY2soJnhvcC0+ZmxjKTsKIAkJbG9ja3NfY29weV9sb2NrKCZ4b3AtPmZsYywgZmwpOwogCQl4b3AtPmZsCQk9IGZsOwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJb3AtPmluZm8ubnVtYmVyCQk9IG51bWJlcjsKIAlvcC0+aW5mby5zdGFydAkJPSBmbC0+Zmxfc3RhcnQ7CiAJb3AtPmluZm8uZW5kCQk9IGZsLT5mbF9lbmQ7Ci0JaWYgKGZsLT5mbF9sbW9wcyAmJiBmbC0+ZmxfbG1vcHMtPmZsX2dyYW50KQorCWlmIChmbC0+ZmxfbG1vcHMgJiYgZmwtPmZsX2xtb3BzLT5sbV9ncmFudCkKIAkJb3AtPmluZm8ub3duZXIJPSAoX191NjQpIGZsLT5mbF9waWQ7CiAJZWxzZQogCQlvcC0+aW5mby5vd25lcgk9IChfX3U2NCkobG9uZykgZmwtPmZsX293bmVyOwpAQCAtMzI3LDcgKzMyNyw3IEBACiAJb3AtPmluZm8ubnVtYmVyCQk9IG51bWJlcjsKIAlvcC0+aW5mby5zdGFydAkJPSBmbC0+Zmxfc3RhcnQ7CiAJb3AtPmluZm8uZW5kCQk9IGZsLT5mbF9lbmQ7Ci0JaWYgKGZsLT5mbF9sbW9wcyAmJiBmbC0+ZmxfbG1vcHMtPmZsX2dyYW50KQorCWlmIChmbC0+ZmxfbG1vcHMgJiYgZmwtPmZsX2xtb3BzLT5sbV9ncmFudCkKIAkJb3AtPmluZm8ub3duZXIJPSAoX191NjQpIGZsLT5mbF9waWQ7CiAJZWxzZQogCQlvcC0+aW5mby5vd25lcgk9IChfX3U2NCkobG9uZykgZmwtPmZsX293bmVyOwpkaWZmIC0tZ2l0IGEvZnMvZGxtL3JlY292ZXJkLmMgYi9mcy9kbG0vcmVjb3ZlcmQuYwppbmRleCBmZDY3N2M4Li43NzRkYTNjIDEwMDY0NAotLS0gYS9mcy9kbG0vcmVjb3ZlcmQuYworKysgYi9mcy9kbG0vcmVjb3ZlcmQuYwpAQCAtNTgsMTMgKzU4LDcgQEAKIAogCW11dGV4X2xvY2soJmxzLT5sc19yZWNvdmVyZF9hY3RpdmUpOwogCi0JLyoKLQkgKiBTdXNwZW5kaW5nIGFuZCByZXN1bWluZyBkbG1fYXN0ZCBlbnN1cmVzIHRoYXQgbm8gbGtiJ3MgZnJvbSB0aGlzIGxzCi0JICogd2lsbCBiZSBwcm9jZXNzZWQgYnkgZGxtX2FzdGQgZHVyaW5nIHJlY292ZXJ5LgotCSAqLwotCi0JZGxtX2FzdGRfc3VzcGVuZCgpOwotCWRsbV9hc3RkX3Jlc3VtZSgpOworCWRsbV9jYWxsYmFja19zdXNwZW5kKGxzKTsKIAogCS8qCiAJICogRnJlZSBub24tbWFzdGVyIHRvc3NlZCByc2Incy4gIE1hc3RlciByc2IncyBhcmUga2VwdCBvbiB0b3NzCkBAIC0yMDIsNiArMTk2LDggQEAKIAogCWRsbV9hZGp1c3RfdGltZW91dHMobHMpOwogCisJZGxtX2NhbGxiYWNrX3Jlc3VtZShscyk7CisKIAllcnJvciA9IGVuYWJsZV9sb2NraW5nKGxzLCBydi0+c2VxKTsKIAlpZiAoZXJyb3IpIHsKIAkJbG9nX2RlYnVnKGxzLCAiZW5hYmxlX2xvY2tpbmcgZmFpbGVkICVkIiwgZXJyb3IpOwpAQCAtMjIyLDggKzIxOCw2IEBACiAKIAlkbG1fZ3JhbnRfYWZ0ZXJfcHVyZ2UobHMpOwogCi0JZGxtX2FzdGRfd2FrZSgpOwotCiAJbG9nX2RlYnVnKGxzLCAicmVjb3ZlciAlbGx4IGRvbmU6ICV1IG1zIiwKIAkJICAodW5zaWduZWQgbG9uZyBsb25nKXJ2LT5zZXEsCiAJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS91c2VyLmMgYi9mcy9kbG0vdXNlci5jCmluZGV4IGU5NmJmM2UuLmQ4ZWE2MDcgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS91c2VyLmMKKysrIGIvZnMvZGxtL3VzZXIuYwpAQCAtMjEzLDkgKzIxMyw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChsaXN0X2VtcHR5KCZsa2ItPmxrYl9hc3RxdWV1ZSkpIHsKKwlpZiAobGlzdF9lbXB0eSgmbGtiLT5sa2JfY2JfbGlzdCkpIHsKIAkJa3JlZl9nZXQoJmxrYi0+bGtiX3JlZik7Ci0JCWxpc3RfYWRkX3RhaWwoJmxrYi0+bGtiX2FzdHF1ZXVlLCAmcHJvYy0+YXN0cyk7CisJCWxpc3RfYWRkX3RhaWwoJmxrYi0+bGtiX2NiX2xpc3QsICZwcm9jLT5hc3RzKTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKIAl9CiAJc3Bpbl91bmxvY2soJnByb2MtPmFzdHNfc3Bpbik7CkBAIC04MzIsMjQgKzgzMiwyNCBAQAogCX0KIAogCS8qIGlmIHdlIGVtcHR5IGxrYl9jYWxsYmFja3MsIHdlIGRvbid0IHdhbnQgdG8gdW5sb2NrIHRoZSBzcGlubG9jawotCSAgIHdpdGhvdXQgcmVtb3ZpbmcgbGtiX2FzdHF1ZXVlOyBzbyBlbXB0eSBsa2JfYXN0cXVldWUgaXMgYWx3YXlzCisJICAgd2l0aG91dCByZW1vdmluZyBsa2JfY2JfbGlzdDsgc28gZW1wdHkgbGtiX2NiX2xpc3QgaXMgYWx3YXlzCiAJICAgY29uc2lzdGVudCB3aXRoIGVtcHR5IGxrYl9jYWxsYmFja3MgKi8KIAotCWxrYiA9IGxpc3RfZW50cnkocHJvYy0+YXN0cy5uZXh0LCBzdHJ1Y3QgZGxtX2xrYiwgbGtiX2FzdHF1ZXVlKTsKKwlsa2IgPSBsaXN0X2VudHJ5KHByb2MtPmFzdHMubmV4dCwgc3RydWN0IGRsbV9sa2IsIGxrYl9jYl9saXN0KTsKIAogCXJ2ID0gZGxtX3JlbV9sa2JfY2FsbGJhY2sobGtiLT5sa2JfcmVzb3VyY2UtPnJlc19scywgbGtiLCAmY2IsICZyZXNpZCk7CiAJaWYgKHJ2IDwgMCkgewogCQkvKiB0aGlzIHNob3VsZG4ndCBoYXBwZW47IGxrYiBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbQogCQkgICBsaXN0IHdoZW4gcmVzaWQgd2FzIHplcm8gKi8KIAkJbG9nX3ByaW50KCJkbG1fcmVtX2xrYl9jYWxsYmFjayBlbXB0eSAleCIsIGxrYi0+bGtiX2lkKTsKLQkJbGlzdF9kZWxfaW5pdCgmbGtiLT5sa2JfYXN0cXVldWUpOworCQlsaXN0X2RlbF9pbml0KCZsa2ItPmxrYl9jYl9saXN0KTsKIAkJc3Bpbl91bmxvY2soJnByb2MtPmFzdHNfc3Bpbik7CiAJCS8qIHJlbW92ZXMgcmVmIGZvciBwcm9jLT5hc3RzLCBtYXkgY2F1c2UgbGtiIHRvIGJlIGZyZWVkICovCiAJCWRsbV9wdXRfbGtiKGxrYik7CiAJCWdvdG8gdHJ5X2Fub3RoZXI7CiAJfQogCWlmICghcmVzaWQpCi0JCWxpc3RfZGVsX2luaXQoJmxrYi0+bGtiX2FzdHF1ZXVlKTsKKwkJbGlzdF9kZWxfaW5pdCgmbGtiLT5sa2JfY2JfbGlzdCk7CiAJc3Bpbl91bmxvY2soJnByb2MtPmFzdHNfc3Bpbik7CiAKIAlpZiAoY2IuZmxhZ3MgJiBETE1fQ0JfU0tJUCkgewpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvZmlsZS5jIGIvZnMvZWNyeXB0ZnMvZmlsZS5jCmluZGV4IDRlYzllYjAuLmM2YWM5OGMgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2ZpbGUuYworKysgYi9mcy9lY3J5cHRmcy9maWxlLmMKQEAgLTI3MCwxNCArMjcwLDE1IEBACiB9CiAKIHN0YXRpYyBpbnQKLWVjcnlwdGZzX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpCitlY3J5cHRmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCiB7CiAJaW50IHJjID0gMDsKIAotCXJjID0gZ2VuZXJpY19maWxlX2ZzeW5jKGZpbGUsIGRhdGFzeW5jKTsKKwlyYyA9IGdlbmVyaWNfZmlsZV9mc3luYyhmaWxlLCBzdGFydCwgZW5kLCBkYXRhc3luYyk7CiAJaWYgKHJjKQogCQlnb3RvIG91dDsKLQlyYyA9IHZmc19mc3luYyhlY3J5cHRmc19maWxlX3RvX2xvd2VyKGZpbGUpLCBkYXRhc3luYyk7CisJcmMgPSB2ZnNfZnN5bmNfcmFuZ2UoZWNyeXB0ZnNfZmlsZV90b19sb3dlcihmaWxlKSwgc3RhcnQsIGVuZCwKKwkJCSAgICAgZGF0YXN5bmMpOwogb3V0OgogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2lub2RlLmMgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCmluZGV4IDczNDlhZGUuLjM0MGM2NTcgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2lub2RlLmMKKysrIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwpAQCAtMTQ3LDcgKzE0Nyw2IEBACiAgKiBAbG93ZXJfZGlyX2lub2RlOiBpbm9kZSBvZiB0aGUgcGFyZW50IGluIHRoZSBsb3dlciBmcyBvZiB0aGUgbmV3IGZpbGUKICAqIEBkZW50cnk6IE5ldyBmaWxlJ3MgZGVudHJ5CiAgKiBAbW9kZTogVGhlIG1vZGUgb2YgdGhlIG5ldyBmaWxlCi0gKiBAbmQ6IG5hbWVpZGF0YSBvZiBlY3J5cHRmcycgcGFyZW50J3MgZGVudHJ5ICYgdmZzbW91bnQKICAqCiAgKiBDcmVhdGVzIHRoZSBmaWxlIGluIHRoZSBsb3dlciBmaWxlIHN5c3RlbS4KICAqCkBAIC0xNTUsMzEgKzE1NCwxMCBAQAogICovCiBzdGF0aWMgaW50CiBlY3J5cHRmc19jcmVhdGVfdW5kZXJseWluZ19maWxlKHN0cnVjdCBpbm9kZSAqbG93ZXJfZGlyX2lub2RlLAotCQkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCi0JCQkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCisJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZGVudHJ5KTsKLQlzdHJ1Y3QgdmZzbW91bnQgKmxvd2VyX21udCA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcl9tbnQoZGVudHJ5KTsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnlfc2F2ZTsKLQlzdHJ1Y3QgdmZzbW91bnQgKnZmc21vdW50X3NhdmU7Ci0JdW5zaWduZWQgaW50IGZsYWdzX3NhdmU7Ci0JaW50IHJjOwotCi0JaWYgKG5kKSB7Ci0JCWRlbnRyeV9zYXZlID0gbmQtPnBhdGguZGVudHJ5OwotCQl2ZnNtb3VudF9zYXZlID0gbmQtPnBhdGgubW50OwotCQlmbGFnc19zYXZlID0gbmQtPmZsYWdzOwotCQluZC0+cGF0aC5kZW50cnkgPSBsb3dlcl9kZW50cnk7Ci0JCW5kLT5wYXRoLm1udCA9IGxvd2VyX21udDsKLQkJbmQtPmZsYWdzICY9IH5MT09LVVBfT1BFTjsKLQl9Ci0JcmMgPSB2ZnNfY3JlYXRlKGxvd2VyX2Rpcl9pbm9kZSwgbG93ZXJfZGVudHJ5LCBtb2RlLCBuZCk7Ci0JaWYgKG5kKSB7Ci0JCW5kLT5wYXRoLmRlbnRyeSA9IGRlbnRyeV9zYXZlOwotCQluZC0+cGF0aC5tbnQgPSB2ZnNtb3VudF9zYXZlOwotCQluZC0+ZmxhZ3MgPSBmbGFnc19zYXZlOwotCX0KLQlyZXR1cm4gcmM7CisJcmV0dXJuIHZmc19jcmVhdGUobG93ZXJfZGlyX2lub2RlLCBsb3dlcl9kZW50cnksIG1vZGUsIE5VTEwpOwogfQogCiAvKioKQEAgLTE5Nyw4ICsxNzUsNyBAQAogICovCiBzdGF0aWMgaW50CiBlY3J5cHRmc19kb19jcmVhdGUoc3RydWN0IGlub2RlICpkaXJlY3RvcnlfaW5vZGUsCi0JCSAgIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2RlbnRyeSwgaW50IG1vZGUsCi0JCSAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQorCQkgICBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kZW50cnksIGludCBtb2RlKQogewogCWludCByYzsKIAlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnk7CkBAIC0yMTMsNyArMTkwLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCXJjID0gZWNyeXB0ZnNfY3JlYXRlX3VuZGVybHlpbmdfZmlsZShsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlLAotCQkJCQkgICAgIGVjcnlwdGZzX2RlbnRyeSwgbW9kZSwgbmQpOworCQkJCQkgICAgIGVjcnlwdGZzX2RlbnRyeSwgbW9kZSk7CiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWx1cmUgdG8gY3JlYXRlIGRlbnRyeSBpbiBsb3dlciBmczsgIgogCQkgICAgICAgInJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKQEAgLTI5NCw3ICsyNzEsNyBAQAogCWludCByYzsKIAogCS8qIGVjcnlwdGZzX2RvX2NyZWF0ZSgpIGNhbGxzIGVjcnlwdGZzX2ludGVycG9zZSgpICovCi0JcmMgPSBlY3J5cHRmc19kb19jcmVhdGUoZGlyZWN0b3J5X2lub2RlLCBlY3J5cHRmc19kZW50cnksIG1vZGUsIG5kKTsKKwlyYyA9IGVjcnlwdGZzX2RvX2NyZWF0ZShkaXJlY3RvcnlfaW5vZGUsIGVjcnlwdGZzX2RlbnRyeSwgbW9kZSk7CiAJaWYgKHVubGlrZWx5KHJjKSkgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAiRmFpbGVkIHRvIGNyZWF0ZSBmaWxlIGluIgogCQkJCSJsb3dlciBmaWxlc3lzdGVtXG4iKTsKQEAgLTk0MiwxMCArOTE5LDggQEAKIH0KIAogc3RhdGljIGludAotZWNyeXB0ZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQorZWNyeXB0ZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKLQkJcmV0dXJuIC1FQ0hJTEQ7CiAJcmV0dXJuIGlub2RlX3Blcm1pc3Npb24oZWNyeXB0ZnNfaW5vZGVfdG9fbG93ZXIoaW5vZGUpLCBtYXNrKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYyBiL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKaW5kZXggMjdhN2ZlZi4uZmE4MDQ5ZSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYworKysgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCkBAIC0yMjQ4LDcgKzIyNDgsNyBAQAogCQkgICAgICAgYXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAogCQkgICAgICAgY3J5cHRfc3RhdC0+a2V5X3NpemUpOwogCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywKLQkJCQkiQ2FjaGVkIHNlc3Npb24ga2V5ICIgImVuY3J5cHRpb24ga2V5OiBcbiIpOworCQkJCSJDYWNoZWQgc2Vzc2lvbiBrZXkgZW5jcnlwdGlvbiBrZXk6XG4iKTsKIAkJaWYgKGVjcnlwdGZzX3ZlcmJvc2l0eSA+IDApCiAJCQllY3J5cHRmc19kdW1wX2hleChzZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleSwgMTYpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2Vmcy9uYW1laS5jIGIvZnMvZWZzL25hbWVpLmMKaW5kZXggMTUxMWJmOS4uODMyYjEwZCAxMDA2NDQKLS0tIGEvZnMvZWZzL25hbWVpLmMKKysrIGIvZnMvZWZzL25hbWVpLmMKQEAgLTYwLDE0ICs2MCwxMSBAQAogCiBzdHJ1Y3QgZGVudHJ5ICplZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKSB7CiAJZWZzX2lub190IGlub2RlbnVtOwotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKIAogCWlub2RlbnVtID0gZWZzX2ZpbmRfZW50cnkoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4pOwotCWlmIChpbm9kZW51bSkgeworCWlmIChpbm9kZW51bSkKIAkJaW5vZGUgPSBlZnNfaWdldChkaXItPmlfc2IsIGlub2RlbnVtKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpCi0JCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwotCX0KIAogCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCBlYTVmNzQ4Li44NDJkNTcwIDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC05NjMsOSArOTYzLDE4IEBACiAJCWxlYWRlci0+Z3JvdXBfbGVhZGVyID0gdHNrOwogCiAJCXRzay0+ZXhpdF9zaWduYWwgPSBTSUdDSExEOworCQlsZWFkZXItPmV4aXRfc2lnbmFsID0gLTE7CiAKIAkJQlVHX09OKGxlYWRlci0+ZXhpdF9zdGF0ZSAhPSBFWElUX1pPTUJJRSk7CiAJCWxlYWRlci0+ZXhpdF9zdGF0ZSA9IEVYSVRfREVBRDsKKworCQkvKgorCQkgKiBXZSBhcmUgZ29pbmcgdG8gcmVsZWFzZV90YXNrKCktPnB0cmFjZV91bmxpbmsoKSBzaWxlbnRseSwKKwkJICogdGhlIHRyYWNlciBjYW4gc2xlZXAgaW4gZG9fd2FpdCgpLiBFWElUX0RFQUQgZ3VhcmFudGVlcworCQkgKiB0aGUgdHJhY2VyIHdvbnQndCBibG9jayBhZ2FpbiB3YWl0aW5nIGZvciB0aGlzIHRocmVhZC4KKwkJICovCisJCWlmICh1bmxpa2VseShsZWFkZXItPnB0cmFjZSkpCisJCQlfX3dha2VfdXBfcGFyZW50KGxlYWRlciwgbGVhZGVyLT5wYXJlbnQpOwogCQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKIAogCQlyZWxlYXNlX3Rhc2sobGVhZGVyKTsKQEAgLTEwOTMsNiArMTEwMiw3IEBACiAKIAlicHJtLT5tbSA9IE5VTEw7CQkvKiBXZSdyZSB1c2luZyBpdCBub3cgKi8KIAorCXNldF9mcyhVU0VSX0RTKTsKIAljdXJyZW50LT5mbGFncyAmPSB+KFBGX1JBTkRPTUlaRSB8IFBGX0tUSFJFQUQpOwogCWZsdXNoX3RocmVhZCgpOwogCWN1cnJlbnQtPnBlcnNvbmFsaXR5ICY9IH5icHJtLT5wZXJfY2xlYXI7CkBAIC0xMTA0LDYgKzExMTQsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0woZmx1c2hfb2xkX2V4ZWMpOwogCit2b2lkIHdvdWxkX2R1bXAoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGlub2RlX3Blcm1pc3Npb24oZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgTUFZX1JFQUQpIDwgMCkKKwkJYnBybS0+aW50ZXJwX2ZsYWdzIHw9IEJJTlBSTV9GTEFHU19FTkZPUkNFX05PTkRVTVA7Cit9CitFWFBPUlRfU1lNQk9MKHdvdWxkX2R1bXApOworCiB2b2lkIHNldHVwX25ld19leGVjKHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtKQogewogCWludCBpLCBjaDsKQEAgLTExNDMsOSArMTE2MCwxMCBAQAogCWlmIChicHJtLT5jcmVkLT51aWQgIT0gY3VycmVudF9ldWlkKCkgfHwKIAkgICAgYnBybS0+Y3JlZC0+Z2lkICE9IGN1cnJlbnRfZWdpZCgpKSB7CiAJCWN1cnJlbnQtPnBkZWF0aF9zaWduYWwgPSAwOwotCX0gZWxzZSBpZiAoZmlsZV9wZXJtaXNzaW9uKGJwcm0tPmZpbGUsIE1BWV9SRUFEKSB8fAotCQkgICBicHJtLT5pbnRlcnBfZmxhZ3MgJiBCSU5QUk1fRkxBR1NfRU5GT1JDRV9OT05EVU1QKSB7Ci0JCXNldF9kdW1wYWJsZShjdXJyZW50LT5tbSwgc3VpZF9kdW1wYWJsZSk7CisJfSBlbHNlIHsKKwkJd291bGRfZHVtcChicHJtLCBicHJtLT5maWxlKTsKKwkJaWYgKGJwcm0tPmludGVycF9mbGFncyAmIEJJTlBSTV9GTEFHU19FTkZPUkNFX05PTkRVTVApCisJCQlzZXRfZHVtcGFibGUoY3VycmVudC0+bW0sIHN1aWRfZHVtcGFibGUpOwogCX0KIAogCS8qCkBAIC0xMjI0LDcgKzEyNDIsMTIgQEAKIAl1bnNpZ25lZCBuX2ZzOwogCWludCByZXMgPSAwOwogCi0JYnBybS0+dW5zYWZlID0gdHJhY2Vob29rX3Vuc2FmZV9leGVjKHApOworCWlmIChwLT5wdHJhY2UpIHsKKwkJaWYgKHAtPnB0cmFjZSAmIFBUX1BUUkFDRV9DQVApCisJCQlicHJtLT51bnNhZmUgfD0gTFNNX1VOU0FGRV9QVFJBQ0VfQ0FQOworCQllbHNlCisJCQlicHJtLT51bnNhZmUgfD0gTFNNX1VOU0FGRV9QVFJBQ0U7CisJfQogCiAJbl9mcyA9IDE7CiAJc3Bpbl9sb2NrKCZwLT5mcy0+bG9jayk7CkBAIC0xMzUyLDE5ICsxMzc1LDIxIEBACiAJdW5zaWduZWQgaW50IGRlcHRoID0gYnBybS0+cmVjdXJzaW9uX2RlcHRoOwogCWludCB0cnkscmV0dmFsOwogCXN0cnVjdCBsaW51eF9iaW5mbXQgKmZtdDsKKwlwaWRfdCBvbGRfcGlkOwogCiAJcmV0dmFsID0gc2VjdXJpdHlfYnBybV9jaGVjayhicHJtKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JLyoga2VybmVsIG1vZHVsZSBsb2FkZXIgZml4dXAgKi8KLQkvKiBzbyB3ZSBkb24ndCB0cnkgdG8gbG9hZCBydW4gbW9kcHJvYmUgaW4ga2VybmVsIHNwYWNlLiAqLwotCXNldF9mcyhVU0VSX0RTKTsKLQogCXJldHZhbCA9IGF1ZGl0X2Jwcm0oYnBybSk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAorCS8qIE5lZWQgdG8gZmV0Y2ggcGlkIGJlZm9yZSBsb2FkX2JpbmFyeSBjaGFuZ2VzIGl0ICovCisJcmN1X3JlYWRfbG9jaygpOworCW9sZF9waWQgPSB0YXNrX3BpZF9ucl9ucyhjdXJyZW50LCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudC0+cGFyZW50KSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKIAlyZXR2YWwgPSAtRU5PRU5UOwogCWZvciAodHJ5PTA7IHRyeTwyOyB0cnkrKykgewogCQlyZWFkX2xvY2soJmJpbmZtdF9sb2NrKTsKQEAgLTEzODQsNyArMTQwOSw4IEBACiAJCQlicHJtLT5yZWN1cnNpb25fZGVwdGggPSBkZXB0aDsKIAkJCWlmIChyZXR2YWwgPj0gMCkgewogCQkJCWlmIChkZXB0aCA9PSAwKQotCQkJCQl0cmFjZWhvb2tfcmVwb3J0X2V4ZWMoZm10LCBicHJtLCByZWdzKTsKKwkJCQkJcHRyYWNlX2V2ZW50KFBUUkFDRV9FVkVOVF9FWEVDLAorCQkJCQkJCW9sZF9waWQpOwogCQkJCXB1dF9iaW5mbXQoZm10KTsKIAkJCQlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CiAJCQkJaWYgKGJwcm0tPmZpbGUpCkBAIC0xNzcyLDcgKzE3OTgsNyBAQAogCiAJdCA9IHN0YXJ0OwogCWRvIHsKLQkJdGFza19jbGVhcl9ncm91cF9zdG9wX3BlbmRpbmcodCk7CisJCXRhc2tfY2xlYXJfam9iY3RsX3BlbmRpbmcodCwgSk9CQ1RMX1BFTkRJTkdfTUFTSyk7CiAJCWlmICh0ICE9IGN1cnJlbnQgJiYgdC0+bW0pIHsKIAkJCXNpZ2FkZHNldCgmdC0+cGVuZGluZy5zaWduYWwsIFNJR0tJTEwpOwogCQkJc2lnbmFsX3dha2VfdXAodCwgMSk7CkBAIC0xOTk5LDcgKzIwMjUsNyBAQAogICogaXMgYSBzcGVjaWFsIHZhbHVlIHRoYXQgd2UgdXNlIHRvIHRyYXAgcmVjdXJzaXZlCiAgKiBjb3JlIGR1bXBzCiAgKi8KLXN0YXRpYyBpbnQgdW1oX3BpcGVfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgdW1oX3BpcGVfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldykKIHsKIAlzdHJ1Y3QgZmlsZSAqcnAsICp3cDsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwpkaWZmIC0tZ2l0IGEvZnMvZXhvZnMvZmlsZS5jIGIvZnMvZXhvZnMvZmlsZS5jCmluZGV4IDQ1Y2EzMjMuLjQ5MWM2YzAgMTAwNjQ0Ci0tLSBhL2ZzL2V4b2ZzL2ZpbGUuYworKysgYi9mcy9leG9mcy9maWxlLmMKQEAgLTQyLDExICs0MiwxOSBAQAogICogICBOb3RlLCBpbiBleG9mcyBhbGwgbWV0YWRhdGEgaXMgd3JpdHRlbiBhcyBwYXJ0IG9mIGlub2RlLCByZWdhcmRsZXNzLgogICogICBUaGUgd3JpdGVvdXQgaXMgc3luY2hyb25vdXMKICAqLwotc3RhdGljIGludCBleG9mc19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgZGF0YXN5bmMpCitzdGF0aWMgaW50IGV4b2ZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwKKwkJCSAgICBpbnQgZGF0YXN5bmMpCiB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfbWFwcGluZy0+aG9zdDsKIAlpbnQgcmV0OwogCisJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldCA9IHN5bmNfaW5vZGVfbWV0YWRhdGEoZmlscC0+Zl9tYXBwaW5nLT5ob3N0LCAxKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9leG9mcy9uYW1laS5jIGIvZnMvZXhvZnMvbmFtZWkuYwppbmRleCA0ZDcwZGIxLi5iNTRjNDM3IDEwMDY0NAotLS0gYS9mcy9leG9mcy9uYW1laS5jCisrKyBiL2ZzL2V4b2ZzL25hbWVpLmMKQEAgLTU1LDEyICs1NSw3IEBACiAJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOwogCiAJaW5vID0gZXhvZnNfaW5vZGVfYnlfbmFtZShkaXIsIGRlbnRyeSk7Ci0JaW5vZGUgPSBOVUxMOwotCWlmIChpbm8pIHsKLQkJaW5vZGUgPSBleG9mc19pZ2V0KGRpci0+aV9zYiwgaW5vKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpCi0JCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwotCX0KKwlpbm9kZSA9IGlubyA/IGV4b2ZzX2lnZXQoZGlyLT5pX3NiLCBpbm8pIDogTlVMTDsKIAlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4b2ZzL3N1cGVyLmMgYi9mcy9leG9mcy9zdXBlci5jCmluZGV4IDA2MDY1YmQuLmM1N2JlZGQgMTAwNjQ0Ci0tLSBhL2ZzL2V4b2ZzL3N1cGVyLmMKKysrIGIvZnMvZXhvZnMvc3VwZXIuYwpAQCAtOTEzLDcgKzkxMyw3IEBACiAJdW5zaWduZWQgbG9uZyBpbm8gPSBleG9mc19wYXJlbnRfaW5vKGNoaWxkKTsKIAogCWlmICghaW5vKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CiAKIAlyZXR1cm4gZF9vYnRhaW5fYWxpYXMoZXhvZnNfaWdldChjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKSk7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQyL2FjbC5jIGIvZnMvZXh0Mi9hY2wuYwppbmRleCBhYmVhNWExLi41MmMwNTM3IDEwMDY0NAotLS0gYS9mcy9leHQyL2FjbC5jCisrKyBiL2ZzL2V4dDIvYWNsLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogLyoKICAqIGlub2RlLT5pX211dGV4OiBkb24ndCBjYXJlCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICoKK3N0cnVjdCBwb3NpeF9hY2wgKgogZXh0Ml9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQogewogCWludCBuYW1lX2luZGV4OwpAQCAtMjMxLDI5ICsyMzEsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotaW50Ci1leHQyX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQotewotCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKLQotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKSB7Ci0JCWlmICghbmVnYXRpdmVfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKSkKLQkJCXJldHVybiAtRUNISUxEOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQlhY2wgPSBleHQyX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0JaWYgKElTX0VSUihhY2wpKQotCQlyZXR1cm4gUFRSX0VSUihhY2wpOwotCWlmIChhY2wpIHsKLQkJaW50IGVycm9yID0gcG9zaXhfYWNsX3Blcm1pc3Npb24oaW5vZGUsIGFjbCwgbWFzayk7Ci0JCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlyZXR1cm4gLUVBR0FJTjsKLX0KLQogLyoKICAqIEluaXRpYWxpemUgdGhlIEFDTHMgb2YgYSBuZXcgaW5vZGUuIENhbGxlZCBmcm9tIGV4dDJfbmV3X2lub2RlLgogICoKQEAgLTI3NiwyOSArMjUzLDIwIEBACiAJCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJfQogCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSAmJiBhY2wpIHsKLSAgICAgICAgICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmNsb25lOwotCSAgICAgICBtb2RlX3QgbW9kZTsKLQorCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCQllcnJvciA9IGV4dDJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQkJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlpZiAoIWNsb25lKQotCQkJZ290byBjbGVhbnVwOwotCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKLQkJZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlX21hc3EoY2xvbmUsICZtb2RlKTsKLQkJaWYgKGVycm9yID49IDApIHsKLQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOwotCQkJaWYgKGVycm9yID4gMCkgewotCQkJCS8qIFRoaXMgaXMgYW4gZXh0ZW5kZWQgQUNMICovCi0JCQkJZXJyb3IgPSBleHQyX3NldF9hY2woaW5vZGUsCi0JCQkJCQkgICAgIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOwotCQkJfQorCQllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX0tFUk5FTCwgJm1vZGUpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJcmV0dXJuIGVycm9yOworCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJaWYgKGVycm9yID4gMCkgeworCQkJLyogVGhpcyBpcyBhbiBleHRlbmRlZCBBQ0wgKi8KKwkJCWVycm9yID0gZXh0Ml9zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGFjbCk7CiAJCX0KLQkJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOwogCX0KIGNsZWFudXA6CiAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKQEAgLTMyMiw3ICsyOTAsNyBAQAogaW50CiBleHQyX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKICAgICAgICAgaW50IGVycm9yOwogCiAJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSkKQEAgLTMzMiwxNCArMzAwLDExIEBACiAJYWNsID0gZXh0Ml9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOwogCWlmIChJU19FUlIoYWNsKSB8fCAhYWNsKQogCQlyZXR1cm4gUFRSX0VSUihhY2wpOwotCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX0tFUk5FTCk7CisJZXJyb3IgPSBwb3NpeF9hY2xfY2htb2QoJmFjbCwgR0ZQX0tFUk5FTCwgaW5vZGUtPmlfbW9kZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBleHQyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCWlmICghY2xvbmUpCi0JCXJldHVybiAtRU5PTUVNOwotCWVycm9yID0gcG9zaXhfYWNsX2NobW9kX21hc3EoY2xvbmUsIGlub2RlLT5pX21vZGUpOwotCWlmICghZXJyb3IpCi0JCWVycm9yID0gZXh0Ml9zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKLQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQyL2FjbC5oIGIvZnMvZXh0Mi9hY2wuaAppbmRleCBjOTM5YjdiLi41YzBhNmE0IDEwMDY0NAotLS0gYS9mcy9leHQyL2FjbC5oCisrKyBiL2ZzL2V4dDIvYWNsLmgKQEAgLTU0LDEzICs1NCwxMyBAQAogI2lmZGVmIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTAogCiAvKiBhY2wuYyAqLwotZXh0ZXJuIGludCBleHQyX2NoZWNrX2FjbCAoc3RydWN0IGlub2RlICosIGludCwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBzdHJ1Y3QgcG9zaXhfYWNsICpleHQyX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpOwogZXh0ZXJuIGludCBleHQyX2FjbF9jaG1vZCAoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBleHQyX2luaXRfYWNsIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICopOwogCiAjZWxzZQogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jZGVmaW5lIGV4dDJfY2hlY2tfYWNsCU5VTEwKKyNkZWZpbmUgZXh0Ml9nZXRfYWNsCU5VTEwKICNkZWZpbmUgZXh0Ml9nZXRfYWNsCU5VTEwKICNkZWZpbmUgZXh0Ml9zZXRfYWNsCU5VTEwKIApkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9leHQyLmggYi9mcy9leHQyL2V4dDIuaAppbmRleCA2NDViZTllLi5hZjlmYzg5IDEwMDY0NAotLS0gYS9mcy9leHQyL2V4dDIuaAorKysgYi9mcy9leHQyL2V4dDIuaApAQCAtMTUwLDcgKzE1MCw4IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQyX2Rpcl9vcGVyYXRpb25zOwogCiAvKiBmaWxlLmMgKi8KLWV4dGVybiBpbnQgZXh0Ml9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKTsKK2V4dGVybiBpbnQgZXh0Ml9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkgICAgICBpbnQgZGF0YXN5bmMpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0Ml9maWxlX29wZXJhdGlvbnM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQyX3hpcF9maWxlX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy9leHQyL2ZpbGUuYyBiL2ZzL2V4dDIvZmlsZS5jCmluZGV4IDQ5ZWVjOTQuLmE1YjNhNWQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZmlsZS5jCisrKyBiL2ZzL2V4dDIvZmlsZS5jCkBAIC00MCwxMyArNDAsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGV4dDJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK2ludCBleHQyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYykKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlLT5mX21hcHBpbmctPmhvc3QtPmlfc2I7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOwogCi0JcmV0ID0gZ2VuZXJpY19maWxlX2ZzeW5jKGZpbGUsIGRhdGFzeW5jKTsKKwlyZXQgPSBnZW5lcmljX2ZpbGVfZnN5bmMoZmlsZSwgc3RhcnQsIGVuZCwgZGF0YXN5bmMpOwogCWlmIChyZXQgPT0gLUVJTyB8fCB0ZXN0X2FuZF9jbGVhcl9iaXQoQVNfRUlPLCAmbWFwcGluZy0+ZmxhZ3MpKSB7CiAJCS8qIFdlIGRvbid0IHJlYWxseSBrbm93IHdoZXJlIHRoZSBJTyBlcnJvciBoYXBwZW5lZC4uLiAqLwogCQlleHQyX2Vycm9yKHNiLCBfX2Z1bmNfXywKQEAgLTEwMiw2ICsxMDIsNiBAQAogCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAjZW5kaWYKIAkuc2V0YXR0cgk9IGV4dDJfc2V0YXR0ciwKLQkuY2hlY2tfYWNsCT0gZXh0Ml9jaGVja19hY2wsCisJLmdldF9hY2wJPSBleHQyX2dldF9hY2wsCiAJLmZpZW1hcAkJPSBleHQyX2ZpZW1hcCwKIH07CmRpZmYgLS1naXQgYS9mcy9leHQyL2lub2RlLmMgYi9mcy9leHQyL2lub2RlLmMKaW5kZXggNzg4ZTA5YS4uYThhNThmNiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pbm9kZS5jCisrKyBiL2ZzL2V4dDIvaW5vZGUuYwpAQCAtODQzLDggKzg0Myw4IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJc3NpemVfdCByZXQ7CiAKLQlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LAotCQkJCWlvdiwgb2Zmc2V0LCBucl9zZWdzLCBleHQyX2dldF9ibG9jaywgTlVMTCk7CisJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW92LCBvZmZzZXQsIG5yX3NlZ3MsCisJCQkJIGV4dDJfZ2V0X2Jsb2NrKTsKIAlpZiAocmV0IDwgMCAmJiAocncgJiBXUklURSkpCiAJCWV4dDJfd3JpdGVfZmFpbGVkKG1hcHBpbmcsIG9mZnNldCArIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKSk7CiAJcmV0dXJuIHJldDsKQEAgLTExODQsNiArMTE4NCw4IEBACiAJaWYgKElTX0FQUEVORChpbm9kZSkgfHwgSVNfSU1NVVRBQkxFKGlub2RlKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAorCWlub2RlX2Rpb193YWl0KGlub2RlKTsKKwogCWlmIChtYXBwaW5nX2lzX3hpcChpbm9kZS0+aV9tYXBwaW5nKSkKIAkJZXJyb3IgPSB4aXBfdHJ1bmNhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBuZXdzaXplKTsKIAllbHNlIGlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkpCmRpZmYgLS1naXQgYS9mcy9leHQyL25hbWVpLmMgYi9mcy9leHQyL25hbWVpLmMKaW5kZXggZWQ1YzVkNC4uNzYxZmRlOCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9uYW1laS5jCisrKyBiL2ZzL2V4dDIvbmFtZWkuYwpAQCAtNjcsMTUgKzY3LDExIEBACiAJaW5vZGUgPSBOVUxMOwogCWlmIChpbm8pIHsKIAkJaW5vZGUgPSBleHQyX2lnZXQoZGlyLT5pX3NiLCBpbm8pOwotCQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQkJaWYgKFBUUl9FUlIoaW5vZGUpID09IC1FU1RBTEUpIHsKLQkJCQlleHQyX2Vycm9yKGRpci0+aV9zYiwgX19mdW5jX18sCi0JCQkJCQkiZGVsZXRlZCBpbm9kZSByZWZlcmVuY2VkOiAlbHUiLAotCQkJCQkJKHVuc2lnbmVkIGxvbmcpIGlubyk7Ci0JCQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7Ci0JCQl9CisJCWlmIChpbm9kZSA9PSBFUlJfUFRSKC1FU1RBTEUpKSB7CisJCQlleHQyX2Vycm9yKGRpci0+aV9zYiwgX19mdW5jX18sCisJCQkJCSJkZWxldGVkIGlub2RlIHJlZmVyZW5jZWQ6ICVsdSIsCisJCQkJCSh1bnNpZ25lZCBsb25nKSBpbm8pOworCQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAJCX0KIAl9CiAJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwpAQCAtNDEyLDcgKzQwOCw3IEBACiAJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKICNlbmRpZgogCS5zZXRhdHRyCT0gZXh0Ml9zZXRhdHRyLAotCS5jaGVja19hY2wJPSBleHQyX2NoZWNrX2FjbCwKKwkuZ2V0X2FjbAk9IGV4dDJfZ2V0X2FjbCwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zID0gewpAQCAtNDIzLDUgKzQxOSw1IEBACiAJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKICNlbmRpZgogCS5zZXRhdHRyCT0gZXh0Ml9zZXRhdHRyLAotCS5jaGVja19hY2wJPSBleHQyX2NoZWNrX2FjbCwKKwkuZ2V0X2FjbAk9IGV4dDJfZ2V0X2FjbCwKIH07CmRpZmYgLS1naXQgYS9mcy9leHQzL2FjbC5jIGIvZnMvZXh0My9hY2wuYwppbmRleCA5ZDAyMWMwLi42YzI5YmYwIDEwMDY0NAotLS0gYS9mcy9leHQzL2FjbC5jCisrKyBiL2ZzL2V4dDMvYWNsLmMKQEAgLTEzMSw3ICsxMzEsNyBAQAogICoKICAqIGlub2RlLT5pX211dGV4OiBkb24ndCBjYXJlCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICoKK3N0cnVjdCBwb3NpeF9hY2wgKgogZXh0M19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQogewogCWludCBuYW1lX2luZGV4OwpAQCAtMjM5LDI5ICsyMzksNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotaW50Ci1leHQzX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQotewotCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKLQotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKSB7Ci0JCWlmICghbmVnYXRpdmVfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKSkKLQkJCXJldHVybiAtRUNISUxEOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQlhY2wgPSBleHQzX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0JaWYgKElTX0VSUihhY2wpKQotCQlyZXR1cm4gUFRSX0VSUihhY2wpOwotCWlmIChhY2wpIHsKLQkJaW50IGVycm9yID0gcG9zaXhfYWNsX3Blcm1pc3Npb24oaW5vZGUsIGFjbCwgbWFzayk7Ci0JCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlyZXR1cm4gLUVBR0FJTjsKLX0KLQogLyoKICAqIEluaXRpYWxpemUgdGhlIEFDTHMgb2YgYSBuZXcgaW5vZGUuIENhbGxlZCBmcm9tIGV4dDNfbmV3X2lub2RlLgogICoKQEAgLTI4NCw4ICsyNjEsNyBAQAogCQkJaW5vZGUtPmlfbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwogCX0KIAlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkgJiYgYWNsKSB7Ci0JCXN0cnVjdCBwb3NpeF9hY2wgKmNsb25lOwotCQltb2RlX3QgbW9kZTsKKwkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCQllcnJvciA9IGV4dDNfc2V0X2FjbChoYW5kbGUsIGlub2RlLApAQCAtMjkzLDIyICsyNjksMTUgQEAKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQkJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfTk9GUyk7Ci0JCWVycm9yID0gLUVOT01FTTsKLQkJaWYgKCFjbG9uZSkKLQkJCWdvdG8gY2xlYW51cDsKKwkJZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9OT0ZTLCAmbW9kZSk7CisJCWlmIChlcnJvciA8IDApCisJCQlyZXR1cm4gZXJyb3I7CiAKLQkJbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZV9tYXNxKGNsb25lLCAmbW9kZSk7Ci0JCWlmIChlcnJvciA+PSAwKSB7Ci0JCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKLQkJCWlmIChlcnJvciA+IDApIHsKLQkJCQkvKiBUaGlzIGlzIGFuIGV4dGVuZGVkIEFDTCAqLwotCQkJCWVycm9yID0gZXh0M19zZXRfYWNsKGhhbmRsZSwgaW5vZGUsCi0JCQkJCQkgICAgIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOwotCQkJfQorCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJaWYgKGVycm9yID4gMCkgeworCQkJLyogVGhpcyBpcyBhbiBleHRlbmRlZCBBQ0wgKi8KKwkJCWVycm9yID0gZXh0M19zZXRfYWNsKGhhbmRsZSwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKIAkJfQotCQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CiAJfQogY2xlYW51cDoKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwpAQCAtMzMyLDcgKzMwMSw5IEBACiBpbnQKIGV4dDNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqY2xvbmU7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCWhhbmRsZV90ICpoYW5kbGU7CisJaW50IHJldHJpZXMgPSAwOwogICAgICAgICBpbnQgZXJyb3I7CiAKIAlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKQEAgLTM0MiwzMSArMzEzLDI0IEBACiAJYWNsID0gZXh0M19nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOwogCWlmIChJU19FUlIoYWNsKSB8fCAhYWNsKQogCQlyZXR1cm4gUFRSX0VSUihhY2wpOwotCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX0tFUk5FTCk7Ci0JcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKLQlpZiAoIWNsb25lKQotCQlyZXR1cm4gLUVOT01FTTsKLQllcnJvciA9IHBvc2l4X2FjbF9jaG1vZF9tYXNxKGNsb25lLCBpbm9kZS0+aV9tb2RlKTsKLQlpZiAoIWVycm9yKSB7Ci0JCWhhbmRsZV90ICpoYW5kbGU7Ci0JCWludCByZXRyaWVzID0gMDsKLQotCXJldHJ5OgotCQloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsCi0JCQkJRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOwotCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJCWVycm9yID0gUFRSX0VSUihoYW5kbGUpOwotCQkJZXh0M19zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycm9yKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWVycm9yID0gZXh0M19zZXRfYWNsKGhhbmRsZSwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOwotCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOwotCQlpZiAoZXJyb3IgPT0gLUVOT1NQQyAmJgotCQkgICAgZXh0M19zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSkKLQkJCWdvdG8gcmV0cnk7CisJZXJyb3IgPSBwb3NpeF9hY2xfY2htb2QoJmFjbCwgR0ZQX0tFUk5FTCwgaW5vZGUtPmlfbW9kZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CityZXRyeToKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsCisJCQlFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCWVycm9yID0gUFRSX0VSUihoYW5kbGUpOworCQlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyb3IpOworCQlnb3RvIG91dDsKIAl9CisJZXJyb3IgPSBleHQzX3NldF9hY2woaGFuZGxlLCBpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBhY2wpOworCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKGVycm9yID09IC1FTk9TUEMgJiYKKwkgICAgZXh0M19zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSkKKwkJZ290byByZXRyeTsKIG91dDoKLQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvYWNsLmggYi9mcy9leHQzL2FjbC5oCmluZGV4IDVmYWY4MDQuLmRiYzkyMWUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvYWNsLmgKKysrIGIvZnMvZXh0My9hY2wuaApAQCAtNTQsMTMgKzU0LDEzIEBACiAjaWZkZWYgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMCiAKIC8qIGFjbC5jICovCi1leHRlcm4gaW50IGV4dDNfY2hlY2tfYWNsIChzdHJ1Y3QgaW5vZGUgKiwgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHN0cnVjdCBwb3NpeF9hY2wgKmV4dDNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSk7CiBleHRlcm4gaW50IGV4dDNfYWNsX2NobW9kIChzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gaW50IGV4dDNfaW5pdF9hY2wgKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CiAKICNlbHNlICAvKiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2RlZmluZSBleHQzX2NoZWNrX2FjbCBOVUxMCisjZGVmaW5lIGV4dDNfZ2V0X2FjbCBOVUxMCiAKIHN0YXRpYyBpbmxpbmUgaW50CiBleHQzX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9maWxlLmMgYi9mcy9leHQzL2ZpbGUuYwppbmRleCBmNTVkZjBlLi4yYmU1Yjk5IDEwMDY0NAotLS0gYS9mcy9leHQzL2ZpbGUuYworKysgYi9mcy9leHQzL2ZpbGUuYwpAQCAtNzksNyArNzksNyBAQAogCS5saXN0eGF0dHIJPSBleHQzX2xpc3R4YXR0ciwKIAkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogI2VuZGlmCi0JLmNoZWNrX2FjbAk9IGV4dDNfY2hlY2tfYWNsLAorCS5nZXRfYWNsCT0gZXh0M19nZXRfYWNsLAogCS5maWVtYXAJCT0gZXh0M19maWVtYXAsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9leHQzL2ZzeW5jLmMgYi9mcy9leHQzL2ZzeW5jLmMKaW5kZXggMDliMTNiYi4uMGJjZjYzYSAxMDA2NDQKLS0tIGEvZnMvZXh0My9mc3luYy5jCisrKyBiL2ZzL2V4dDMvZnN5bmMuYwpAQCAtNDMsNyArNDMsNyBAQAogICogaW5vZGUgdG8gZGlzay4KICAqLwogCi1pbnQgZXh0M19zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK2ludCBleHQzX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CkBAIC01NCw2ICs1NCwxNyBAQAogCWlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkKIAkJcmV0dXJuIDA7CiAKKwlyZXQgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFRha2luZyB0aGUgbXV0ZXggaGVyZSBqdXN0IHRvIGtlZXAgY29uc2lzdGVudCB3aXRoIGhvdyBmc3luYyB3YXMKKwkgKiBjYWxsZWQgcHJldmlvdXNseSwgaG93ZXZlciBpdCBsb29rcyBsaWtlIHdlIGRvbid0IG5lZWQgdG8gdGFrZQorCSAqIGlfbXV0ZXggYXQgYWxsLgorCSAqLworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwogCUpfQVNTRVJUKGV4dDNfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpID09IE5VTEwpOwogCiAJLyoKQEAgLTcwLDggKzgxLDEwIEBACiAJICogICh0aGV5IHdlcmUgZGlydGllZCBieSBjb21taXQpLiAgQnV0IHRoYXQncyBPSyAtIHRoZSBibG9ja3MgYXJlCiAJICogIHNhZmUgaW4tam91cm5hbCwgd2hpY2ggaXMgYWxsIGZzeW5jKCkgbmVlZHMgdG8gZW5zdXJlLgogCSAqLwotCWlmIChleHQzX3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKQorCWlmIChleHQzX3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKSB7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQlyZXR1cm4gZXh0M19mb3JjZV9jb21taXQoaW5vZGUtPmlfc2IpOworCX0KIAogCWlmIChkYXRhc3luYykKIAkJY29tbWl0X3RpZCA9IGF0b21pY19yZWFkKCZlaS0+aV9kYXRhc3luY190aWQpOwpAQCAtOTEsNSArMTA0LDYgQEAKIAkgKi8KIAlpZiAobmVlZHNfYmFycmllcikKIAkJYmxrZGV2X2lzc3VlX2ZsdXNoKGlub2RlLT5pX3NiLT5zX2JkZXYsIEdGUF9LRVJORUwsIE5VTEwpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggMzQ1MWQyMy4uMjk3OGEyYSAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMTgxNiw5ICsxODE2LDggQEAKIAl9CiAKIHJldHJ5OgotCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKLQkJCQkgb2Zmc2V0LCBucl9zZWdzLAotCQkJCSBleHQzX2dldF9ibG9jaywgTlVMTCk7CisJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW92LCBvZmZzZXQsIG5yX3NlZ3MsCisJCQkJIGV4dDNfZ2V0X2Jsb2NrKTsKIAkvKgogCSAqIEluIGNhc2Ugb2YgZXJyb3IgZXh0ZW5kaW5nIHdyaXRlIG1heSBoYXZlIGluc3RhbnRpYXRlZCBhIGZldwogCSAqIGJsb2NrcyBvdXRzaWRlIGlfc2l6ZS4gVHJpbSB0aGVzZSBvZmYgYWdhaW4uCkBAIC0zMjE2LDYgKzMyMTUsOSBAQAogCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCX0KIAorCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkKKwkJaW5vZGVfZGlvX3dhaXQoaW5vZGUpOworCiAJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKIAkgICAgYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUgJiYgYXR0ci0+aWFfc2l6ZSA8IGlub2RlLT5pX3NpemUpIHsKIAkJaGFuZGxlX3QgKmhhbmRsZTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvbmFtZWkuYyBiL2ZzL2V4dDMvbmFtZWkuYwppbmRleCAzNGI2ZDliLi4zYjU3MjMwIDEwMDY0NAotLS0gYS9mcy9leHQzL25hbWVpLmMKKysrIGIvZnMvZXh0My9uYW1laS5jCkBAIC0xMDM4LDE1ICsxMDM4LDExIEBACiAJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAkJfQogCQlpbm9kZSA9IGV4dDNfaWdldChkaXItPmlfc2IsIGlubyk7Ci0JCWlmIChJU19FUlIoaW5vZGUpKSB7Ci0JCQlpZiAoUFRSX0VSUihpbm9kZSkgPT0gLUVTVEFMRSkgewotCQkJCWV4dDNfZXJyb3IoZGlyLT5pX3NiLCBfX2Z1bmNfXywKLQkJCQkJCSJkZWxldGVkIGlub2RlIHJlZmVyZW5jZWQ6ICVsdSIsCi0JCQkJCQlpbm8pOwotCQkJCXJldHVybiBFUlJfUFRSKC1FSU8pOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwotCQkJfQorCQlpZiAoaW5vZGUgPT0gRVJSX1BUUigtRVNUQUxFKSkgeworCQkJZXh0M19lcnJvcihkaXItPmlfc2IsIF9fZnVuY19fLAorCQkJCQkiZGVsZXRlZCBpbm9kZSByZWZlcmVuY2VkOiAlbHUiLAorCQkJCQlpbm8pOworCQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAJCX0KIAl9CiAJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwpAQCAtMjUzMyw3ICsyNTI5LDcgQEAKIAkubGlzdHhhdHRyCT0gZXh0M19saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKICNlbmRpZgotCS5jaGVja19hY2wJPSBleHQzX2NoZWNrX2FjbCwKKwkuZ2V0X2FjbAk9IGV4dDNfZ2V0X2FjbCwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zID0gewpAQCAtMjU0NCw1ICsyNTQwLDUgQEAKIAkubGlzdHhhdHRyCT0gZXh0M19saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKICNlbmRpZgotCS5jaGVja19hY2wJPSBleHQzX2NoZWNrX2FjbCwKKwkuZ2V0X2FjbAk9IGV4dDNfZ2V0X2FjbCwKIH07CmRpZmYgLS1naXQgYS9mcy9leHQzL3N1cGVyLmMgYi9mcy9leHQzL3N1cGVyLmMKaW5kZXggYWFkMTUzZS4uYjU3ZWEyZiAxMDA2NDQKLS0tIGEvZnMvZXh0My9zdXBlci5jCisrKyBiL2ZzL2V4dDMvc3VwZXIuYwpAQCAtMTcxOCw2ICsxNzE4LDggQEAKIAlzYmktPnNfcmVzdWlkID0gbGUxNl90b19jcHUoZXMtPnNfZGVmX3Jlc3VpZCk7CiAJc2JpLT5zX3Jlc2dpZCA9IGxlMTZfdG9fY3B1KGVzLT5zX2RlZl9yZXNnaWQpOwogCisJLyogZW5hYmxlIGJhcnJpZXJzIGJ5IGRlZmF1bHQgKi8KKwlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEJBUlJJRVIpOwogCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgUkVTRVJWQVRJT04pOwogCiAJaWYgKCFwYXJzZV9vcHRpb25zICgoY2hhciAqKSBkYXRhLCBzYiwgJmpvdXJuYWxfaW51bSwgJmpvdXJuYWxfZGV2bnVtLApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9hY2wuYyBiL2ZzL2V4dDQvYWNsLmMKaW5kZXggMjFlYWNkNy4uZGNhMmQxZCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9hY2wuYworKysgYi9mcy9leHQ0L2FjbC5jCkBAIC0xMzEsNyArMTMxLDcgQEAKICAqCiAgKiBpbm9kZS0+aV9tdXRleDogZG9uJ3QgY2FyZQogICovCi1zdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCitzdHJ1Y3QgcG9zaXhfYWNsICoKIGV4dDRfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAlpbnQgbmFtZV9pbmRleDsKQEAgLTIzNywyOSArMjM3LDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWludAotZXh0NF9jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7Ci0KLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkgewotCQlpZiAoIW5lZ2F0aXZlX2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUykpCi0JCQlyZXR1cm4gLUVDSElMRDsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0JYWNsID0gZXh0NF9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOwotCWlmIChJU19FUlIoYWNsKSkKLQkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKLQlpZiAoYWNsKSB7Ci0JCWludCBlcnJvciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBhY2wsIG1hc2spOwotCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JcmV0dXJuIC1FQUdBSU47Ci19Ci0KIC8qCiAgKiBJbml0aWFsaXplIHRoZSBBQ0xzIG9mIGEgbmV3IGlub2RlLiBDYWxsZWQgZnJvbSBleHQ0X25ld19pbm9kZS4KICAqCkBAIC0yODIsOCArMjU5LDcgQEAKIAkJCWlub2RlLT5pX21vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKIAl9CiAJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpICYmIGFjbCkgewotCQlzdHJ1Y3QgcG9zaXhfYWNsICpjbG9uZTsKLQkJbW9kZV90IG1vZGU7CisJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJZXJyb3IgPSBleHQ0X3NldF9hY2woaGFuZGxlLCBpbm9kZSwKQEAgLTI5MSwyMiArMjY3LDE1IEBACiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCQl9Ci0JCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX05PRlMpOwotCQllcnJvciA9IC1FTk9NRU07Ci0JCWlmICghY2xvbmUpCi0JCQlnb3RvIGNsZWFudXA7CisJCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfTk9GUywgJm1vZGUpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJcmV0dXJuIGVycm9yOwogCi0JCW1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCQllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShjbG9uZSwgJm1vZGUpOwotCQlpZiAoZXJyb3IgPj0gMCkgewotCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7Ci0JCQlpZiAoZXJyb3IgPiAwKSB7Ci0JCQkJLyogVGhpcyBpcyBhbiBleHRlbmRlZCBBQ0wgKi8KLQkJCQllcnJvciA9IGV4dDRfc2V0X2FjbChoYW5kbGUsIGlub2RlLAotCQkJCQkJICAgICBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKLQkJCX0KKwkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCWlmIChlcnJvciA+IDApIHsKKwkJCS8qIFRoaXMgaXMgYW4gZXh0ZW5kZWQgQUNMICovCisJCQllcnJvciA9IGV4dDRfc2V0X2FjbChoYW5kbGUsIGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGFjbCk7CiAJCX0KLQkJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOwogCX0KIGNsZWFudXA6CiAJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKQEAgLTMzMCw5ICsyOTksMTIgQEAKIGludAogZXh0NF9hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpjbG9uZTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgcmV0cmllcyA9IDA7CiAJaW50IGVycm9yOwogCisKIAlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCkBAIC0zNDAsMzEgKzMxMiwyNCBAQAogCWFjbCA9IGV4dDRfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKIAlpZiAoSVNfRVJSKGFjbCkgfHwgIWFjbCkKIAkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKLQljbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9LRVJORUwpOwotCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7Ci0JaWYgKCFjbG9uZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZXJyb3IgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7Ci0JaWYgKCFlcnJvcikgewotCQloYW5kbGVfdCAqaGFuZGxlOwotCQlpbnQgcmV0cmllcyA9IDA7Ci0KLQlyZXRyeToKLQkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLAotCQkJCUVYVDRfREFUQV9UUkFOU19CTE9DS1MoaW5vZGUtPmlfc2IpKTsKLQkJaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCQllcnJvciA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnJvcik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQllcnJvciA9IGV4dDRfc2V0X2FjbChoYW5kbGUsIGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKLQkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKLQkJaWYgKGVycm9yID09IC1FTk9TUEMgJiYKLQkJICAgIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCi0JCQlnb3RvIHJldHJ5OworCWVycm9yID0gcG9zaXhfYWNsX2NobW9kKCZhY2wsIEdGUF9LRVJORUwsIGlub2RlLT5pX21vZGUpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworcmV0cnk6CisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLAorCQkJRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQllcnJvciA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycm9yKTsKKwkJZ290byBvdXQ7CiAJfQorCWVycm9yID0gZXh0NF9zZXRfYWNsKGhhbmRsZSwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKKwlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmIChlcnJvciA9PSAtRU5PU1BDICYmCisJICAgIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CiBvdXQ6Ci0JcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2FjbC5oIGIvZnMvZXh0NC9hY2wuaAppbmRleCBkZWM4MjExLi4xOGNiMzllIDEwMDY0NAotLS0gYS9mcy9leHQ0L2FjbC5oCisrKyBiL2ZzL2V4dDQvYWNsLmgKQEAgLTU0LDEzICs1NCwxMyBAQAogI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTAogCiAvKiBhY2wuYyAqLwotZXh0ZXJuIGludCBleHQ0X2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKiwgaW50LCB1bnNpZ25lZCBpbnQpOworc3RydWN0IHBvc2l4X2FjbCAqZXh0NF9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgZXh0NF9hY2xfY2htb2Qoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBleHQ0X2luaXRfYWNsKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CiAKICNlbHNlICAvKiBDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0wgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2RlZmluZSBleHQ0X2NoZWNrX2FjbCBOVUxMCisjZGVmaW5lIGV4dDRfZ2V0X2FjbCBOVUxMCiAKIHN0YXRpYyBpbmxpbmUgaW50CiBleHQ0X2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaAppbmRleCAxOTIxMzkyLi5mYTQ0ZGY4IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDQuaAorKysgYi9mcy9leHQ0L2V4dDQuaApAQCAtMTc1OCw3ICsxNzU4LDcgQEAKIGV4dGVybiB2b2lkIGV4dDRfaHRyZWVfZnJlZV9kaXJfaW5mbyhzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqcCk7CiAKIC8qIGZzeW5jLmMgKi8KLWV4dGVybiBpbnQgZXh0NF9zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKiwgaW50KTsKK2V4dGVybiBpbnQgZXh0NF9zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBsb2ZmX3QsIGludCk7CiBleHRlcm4gaW50IGV4dDRfZmx1c2hfY29tcGxldGVkX0lPKHN0cnVjdCBpbm9kZSAqKTsKIAogLyogaGFzaC5jICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oIGIvZnMvZXh0NC9leHQ0X2V4dGVudHMuaAppbmRleCAyZTI5YWJiLi4wOTVjMzZmIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCisrKyBiL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKQEAgLTEyNSw3ICsxMjUsNyBAQAogICogcG9zaXRpdmUgcmV0Y29kZSAtIHNpZ25hbCBmb3IgZXh0NF9leHRfd2Fsa19zcGFjZSgpLCBzZWUgYmVsb3cKICAqIGNhbGxiYWNrIG11c3QgcmV0dXJuIHZhbGlkIGV4dGVudCAocGFzc2VkIG9yIG5ld2x5IGNyZWF0ZWQpCiAgKi8KLXR5cGVkZWYgaW50ICgqZXh0X3ByZXBhcmVfY2FsbGJhY2spKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqLAordHlwZWRlZiBpbnQgKCpleHRfcHJlcGFyZV9jYWxsYmFjaykoc3RydWN0IGlub2RlICosIGV4dDRfbGJsa190LAogCQkJCQlzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgKiwKIAkJCQkJc3RydWN0IGV4dDRfZXh0ZW50ICosIHZvaWQgKik7CiAKQEAgLTEzMyw4ICsxMzMsMTEgQEAKICNkZWZpbmUgRVhUX0JSRUFLICAgICAgMQogI2RlZmluZSBFWFRfUkVQRUFUICAgICAyCiAKLS8qIE1heGltdW0gbG9naWNhbCBibG9jayBpbiBhIGZpbGU7IGV4dDRfZXh0ZW50J3MgZWVfYmxvY2sgaXMgX19sZTMyICovCi0jZGVmaW5lIEVYVF9NQVhfQkxPQ0sJMHhmZmZmZmZmZgorLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIGxvZ2ljYWwgYmxvY2tzIGluIGEgZmlsZTsgZXh0NF9leHRlbnQncyBlZV9ibG9jayBpcworICogX19sZTMyLgorICovCisjZGVmaW5lIEVYVF9NQVhfQkxPQ0tTCTB4ZmZmZmZmZmYKIAogLyoKICAqIEVYVF9JTklUX01BWF9MRU4gaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyB3ZSBjYW4gaGF2ZSBpbiBhbgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzLmMgYi9mcy9leHQ0L2V4dGVudHMuYwppbmRleCA1MTk5YmFjLi5mODE1Y2M4IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dGVudHMuYworKysgYi9mcy9leHQ0L2V4dGVudHMuYwpAQCAtMTQwOCw3ICsxNDA4LDcgQEAKIAogLyoKICAqIGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrOgotICogcmV0dXJucyBhbGxvY2F0ZWQgYmxvY2sgaW4gc3Vic2VxdWVudCBleHRlbnQgb3IgRVhUX01BWF9CTE9DSy4KKyAqIHJldHVybnMgYWxsb2NhdGVkIGJsb2NrIGluIHN1YnNlcXVlbnQgZXh0ZW50IG9yIEVYVF9NQVhfQkxPQ0tTLgogICogTk9URTogaXQgY29uc2lkZXJzIGJsb2NrIG51bWJlciBmcm9tIGluZGV4IGVudHJ5IGFzCiAgKiBhbGxvY2F0ZWQgYmxvY2suIFRodXMsIGluZGV4IGVudHJpZXMgaGF2ZSB0byBiZSBjb25zaXN0ZW50CiAgKiB3aXRoIGxlYXZlcy4KQEAgLTE0MjIsNyArMTQyMiw3IEBACiAJZGVwdGggPSBwYXRoLT5wX2RlcHRoOwogCiAJaWYgKGRlcHRoID09IDAgJiYgcGF0aC0+cF9leHQgPT0gTlVMTCkKLQkJcmV0dXJuIEVYVF9NQVhfQkxPQ0s7CisJCXJldHVybiBFWFRfTUFYX0JMT0NLUzsKIAogCXdoaWxlIChkZXB0aCA+PSAwKSB7CiAJCWlmIChkZXB0aCA9PSBwYXRoLT5wX2RlcHRoKSB7CkBAIC0xNDM5LDEyICsxNDM5LDEyIEBACiAJCWRlcHRoLS07CiAJfQogCi0JcmV0dXJuIEVYVF9NQVhfQkxPQ0s7CisJcmV0dXJuIEVYVF9NQVhfQkxPQ0tTOwogfQogCiAvKgogICogZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrOgotICogcmV0dXJucyBmaXJzdCBhbGxvY2F0ZWQgYmxvY2sgZnJvbSBuZXh0IGxlYWYgb3IgRVhUX01BWF9CTE9DSworICogcmV0dXJucyBmaXJzdCBhbGxvY2F0ZWQgYmxvY2sgZnJvbSBuZXh0IGxlYWYgb3IgRVhUX01BWF9CTE9DS1MKICAqLwogc3RhdGljIGV4dDRfbGJsa190IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCkKQEAgLTE0NTYsNyArMTQ1Niw3IEBACiAKIAkvKiB6ZXJvLXRyZWUgaGFzIG5vIGxlYWYgYmxvY2tzIGF0IGFsbCAqLwogCWlmIChkZXB0aCA9PSAwKQotCQlyZXR1cm4gRVhUX01BWF9CTE9DSzsKKwkJcmV0dXJuIEVYVF9NQVhfQkxPQ0tTOwogCiAJLyogZ28gdG8gaW5kZXggYmxvY2sgKi8KIAlkZXB0aC0tOwpAQCAtMTQ2OSw3ICsxNDY5LDcgQEAKIAkJZGVwdGgtLTsKIAl9CiAKLQlyZXR1cm4gRVhUX01BWF9CTE9DSzsKKwlyZXR1cm4gRVhUX01BWF9CTE9DS1M7CiB9CiAKIC8qCkBAIC0xNjc3LDEzICsxNjc3LDEzIEBACiAJICovCiAJaWYgKGIyIDwgYjEpIHsKIAkJYjIgPSBleHQ0X2V4dF9uZXh0X2FsbG9jYXRlZF9ibG9jayhwYXRoKTsKLQkJaWYgKGIyID09IEVYVF9NQVhfQkxPQ0spCisJCWlmIChiMiA9PSBFWFRfTUFYX0JMT0NLUykKIAkJCWdvdG8gb3V0OwogCX0KIAogCS8qIGNoZWNrIGZvciB3cmFwIHRocm91Z2ggemVybyBvbiBleHRlbnQgbG9naWNhbCBzdGFydCBibG9jayovCiAJaWYgKGIxICsgbGVuMSA8IGIxKSB7Ci0JCWxlbjEgPSBFWFRfTUFYX0JMT0NLIC0gYjE7CisJCWxlbjEgPSBFWFRfTUFYX0JMT0NLUyAtIGIxOwogCQluZXdleHQtPmVlX2xlbiA9IGNwdV90b19sZTE2KGxlbjEpOwogCQlyZXQgPSAxOwogCX0KQEAgLTE3NjcsNyArMTc2Nyw3IEBACiAJZmV4ID0gRVhUX0xBU1RfRVhURU5UKGVoKTsKIAluZXh0ID0gZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKGlub2RlLCBwYXRoKTsKIAlpZiAobGUzMl90b19jcHUobmV3ZXh0LT5lZV9ibG9jaykgPiBsZTMyX3RvX2NwdShmZXgtPmVlX2Jsb2NrKQotCSAgICAmJiBuZXh0ICE9IEVYVF9NQVhfQkxPQ0spIHsKKwkgICAgJiYgbmV4dCAhPSBFWFRfTUFYX0JMT0NLUykgewogCQlleHRfZGVidWcoIm5leHQgbGVhZiBibG9jayAtICVkXG4iLCBuZXh0KTsKIAkJQlVHX09OKG5wYXRoICE9IE5VTEwpOwogCQlucGF0aCA9IGV4dDRfZXh0X2ZpbmRfZXh0ZW50KGlub2RlLCBuZXh0LCBOVUxMKTsKQEAgLTE4ODcsNyArMTg4Nyw3IEBACiAJQlVHX09OKGZ1bmMgPT0gTlVMTCk7CiAJQlVHX09OKGlub2RlID09IE5VTEwpOwogCi0Jd2hpbGUgKGJsb2NrIDwgbGFzdCAmJiBibG9jayAhPSBFWFRfTUFYX0JMT0NLKSB7CisJd2hpbGUgKGJsb2NrIDwgbGFzdCAmJiBibG9jayAhPSBFWFRfTUFYX0JMT0NLUykgewogCQludW0gPSBsYXN0IC0gYmxvY2s7CiAJCS8qIGZpbmQgZXh0ZW50IGZvciB0aGlzIGJsb2NrICovCiAJCWRvd25fcmVhZCgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSk7CkBAIC0xOTU4LDcgKzE5NTgsNyBAQAogCQkJZXJyID0gLUVJTzsKIAkJCWJyZWFrOwogCQl9Ci0JCWVyciA9IGZ1bmMoaW5vZGUsIHBhdGgsICZjYmV4LCBleCwgY2JkYXRhKTsKKwkJZXJyID0gZnVuYyhpbm9kZSwgbmV4dCwgJmNiZXgsIGV4LCBjYmRhdGEpOwogCQlleHQ0X2V4dF9kcm9wX3JlZnMocGF0aCk7CiAKIAkJaWYgKGVyciA8IDApCkBAIC0yMDIwLDcgKzIwMjAsNyBAQAogCWlmIChleCA9PSBOVUxMKSB7CiAJCS8qIHRoZXJlIGlzIG5vIGV4dGVudCB5ZXQsIHNvIGdhcCBpcyBbMDstXSAqLwogCQlsYmxvY2sgPSAwOwotCQlsZW4gPSBFWFRfTUFYX0JMT0NLOworCQlsZW4gPSBFWFRfTUFYX0JMT0NLUzsKIAkJZXh0X2RlYnVnKCJjYWNoZSBnYXAod2hvbGUgZmlsZSk6Iik7CiAJfSBlbHNlIGlmIChibG9jayA8IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykpIHsKIAkJbGJsb2NrID0gYmxvY2s7CkBAIC0yMzUwLDcgKzIzNTAsNyBAQAogCQkJICogbmV2ZXIgaGFwcGVuIGJlY2F1c2UgYXQgbGVhc3Qgb25lIG9mIHRoZSBlbmQgcG9pbnRzCiAJCQkgKiBuZWVkcyB0byBiZSBvbiB0aGUgZWRnZSBvZiB0aGUgZXh0ZW50LgogCQkJICovCi0JCQlpZiAoZW5kID09IEVYVF9NQVhfQkxPQ0spIHsKKwkJCWlmIChlbmQgPT0gRVhUX01BWF9CTE9DS1MgLSAxKSB7CiAJCQkJZXh0X2RlYnVnKCIgIGJhZCB0cnVuY2F0ZSAldToldVxuIiwKIAkJCQkJCXN0YXJ0LCBlbmQpOwogCQkJCWJsb2NrID0gMDsKQEAgLTIzOTgsNyArMjM5OCw3IEBACiAJCQkgKiBJZiB0aGlzIGlzIGEgdHJ1bmNhdGUsIHRoaXMgY29uZGl0aW9uCiAJCQkgKiBzaG91bGQgbmV2ZXIgaGFwcGVuCiAJCQkgKi8KLQkJCWlmIChlbmQgPT0gRVhUX01BWF9CTE9DSykgeworCQkJaWYgKGVuZCA9PSBFWFRfTUFYX0JMT0NLUyAtIDEpIHsKIAkJCQlleHRfZGVidWcoIiAgYmFkIHRydW5jYXRlICV1OiV1XG4iLAogCQkJCQlzdGFydCwgZW5kKTsKIAkJCQllcnIgPSAtRUlPOwpAQCAtMjQ3OCw3ICsyNDc4LDcgQEAKIAkJICogd2UgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUgbGVhZgogCQkgKi8KIAkJaWYgKG51bSA9PSAwKSB7Ci0JCQlpZiAoZW5kICE9IEVYVF9NQVhfQkxPQ0spIHsKKwkJCWlmIChlbmQgIT0gRVhUX01BWF9CTE9DS1MgLSAxKSB7CiAJCQkJLyoKIAkJCQkgKiBGb3IgaG9sZSBwdW5jaGluZywgd2UgbmVlZCB0byBzY29vdCBhbGwgdGhlCiAJCQkJICogZXh0ZW50cyB1cCB3aGVuIGFuIGV4dGVudCBpcyByZW1vdmVkIHNvIHRoYXQKQEAgLTM2OTksNyArMzY5OSw3IEBACiAKIAlsYXN0X2Jsb2NrID0gKGlub2RlLT5pX3NpemUgKyBzYi0+c19ibG9ja3NpemUgLSAxKQogCQkJPj4gRVhUNF9CTE9DS19TSVpFX0JJVFMoc2IpOwotCWVyciA9IGV4dDRfZXh0X3JlbW92ZV9zcGFjZShpbm9kZSwgbGFzdF9ibG9jaywgRVhUX01BWF9CTE9DSyk7CisJZXJyID0gZXh0NF9leHRfcmVtb3ZlX3NwYWNlKGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLUyAtIDEpOwogCiAJLyogSW4gYSBtdWx0aS10cmFuc2FjdGlvbiB0cnVuY2F0ZSwgd2Ugb25seSBtYWtlIHRoZSBmaW5hbAogCSAqIHRyYW5zYWN0aW9uIHN5bmNocm9ub3VzLgpAQCAtMzkxNCwxNCArMzkxNCwxMyBAQAogLyoKICAqIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBmb3IgZWFjaCBleHRlbnQgdG8gZ2F0aGVyIEZJRU1BUCBpbmZvcm1hdGlvbi4KICAqLwotc3RhdGljIGludCBleHQ0X2V4dF9maWVtYXBfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsCitzdGF0aWMgaW50IGV4dDRfZXh0X2ZpZW1hcF9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBuZXh0LAogCQkgICAgICAgc3RydWN0IGV4dDRfZXh0X2NhY2hlICpuZXdleCwgc3RydWN0IGV4dDRfZXh0ZW50ICpleCwKIAkJICAgICAgIHZvaWQgKmRhdGEpCiB7CiAJX191NjQJbG9naWNhbDsKIAlfX3U2NAlwaHlzaWNhbDsKIAlfX3U2NAlsZW5ndGg7Ci0JbG9mZl90CXNpemU7CiAJX191MzIJZmxhZ3MgPSAwOwogCWludAkJcmV0ID0gMDsKIAlzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvID0gZGF0YTsKQEAgLTQxMDMsOCArNDEwMiw3IEBACiAJaWYgKGV4ICYmIGV4dDRfZXh0X2lzX3VuaW5pdGlhbGl6ZWQoZXgpKQogCQlmbGFncyB8PSBGSUVNQVBfRVhURU5UX1VOV1JJVFRFTjsKIAotCXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JaWYgKGxvZ2ljYWwgKyBsZW5ndGggPj0gc2l6ZSkKKwlpZiAobmV4dCA9PSBFWFRfTUFYX0JMT0NLUykKIAkJZmxhZ3MgfD0gRklFTUFQX0VYVEVOVF9MQVNUOwogCiAJcmV0ID0gZmllbWFwX2ZpbGxfbmV4dF9leHRlbnQoZmllaW5mbywgbG9naWNhbCwgcGh5c2ljYWwsCkBAIC00MzQ3LDggKzQzNDUsOCBAQAogCiAJCXN0YXJ0X2JsayA9IHN0YXJ0ID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCQlsYXN0X2JsayA9IChzdGFydCArIGxlbiAtIDEpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwotCQlpZiAobGFzdF9ibGsgPj0gRVhUX01BWF9CTE9DSykKLQkJCWxhc3RfYmxrID0gRVhUX01BWF9CTE9DSy0xOworCQlpZiAobGFzdF9ibGsgPj0gRVhUX01BWF9CTE9DS1MpCisJCQlsYXN0X2JsayA9IEVYVF9NQVhfQkxPQ0tTLTE7CiAJCWxlbl9ibGtzID0gKChleHQ0X2xibGtfdCkgbGFzdF9ibGspIC0gc3RhcnRfYmxrICsgMTsKIAogCQkvKgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9maWxlLmMgYi9mcy9leHQ0L2ZpbGUuYwppbmRleCAyYzA5NzIzLi5lNDA5NWU5IDEwMDY0NAotLS0gYS9mcy9leHQ0L2ZpbGUuYworKysgYi9mcy9leHQ0L2ZpbGUuYwpAQCAtMjM2LDYgKzIzNiwyNyBAQAogCQl9CiAJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKIAkJYnJlYWs7CisJY2FzZSBTRUVLX0RBVEE6CisJCS8qCisJCSAqIEluIHRoZSBnZW5lcmljIGNhc2UgdGhlIGVudGlyZSBmaWxlIGlzIGRhdGEsIHNvIGFzIGxvbmcgYXMKKwkJICogb2Zmc2V0IGlzbid0IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgdGhlbiB0aGUgb2Zmc2V0IGlzIGRhdGEuCisJCSAqLworCQlpZiAob2Zmc2V0ID49IGlub2RlLT5pX3NpemUpIHsKKwkJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlicmVhazsKKwljYXNlIFNFRUtfSE9MRToKKwkJLyoKKwkJICogVGhlcmUgaXMgYSB2aXJ0dWFsIGhvbGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgc28gYXMgbG9uZyBhcworCQkgKiBvZmZzZXQgaXNuJ3QgaV9zaXplIG9yIGxhcmdlciwgcmV0dXJuIGlfc2l6ZS4KKwkJICovCisJCWlmIChvZmZzZXQgPj0gaW5vZGUtPmlfc2l6ZSkgeworCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCW9mZnNldCA9IGlub2RlLT5pX3NpemU7CisJCWJyZWFrOwogCX0KIAogCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IG1heGJ5dGVzKSB7CkBAIC0yODAsNyArMzAxLDcgQEAKIAkubGlzdHhhdHRyCT0gZXh0NF9saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKICNlbmRpZgotCS5jaGVja19hY2wJPSBleHQ0X2NoZWNrX2FjbCwKKwkuZ2V0X2FjbAk9IGV4dDRfZ2V0X2FjbCwKIAkuZmllbWFwCQk9IGV4dDRfZmllbWFwLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9mc3luYy5jIGIvZnMvZXh0NC9mc3luYy5jCmluZGV4IGNlNjZkMmYuLmRhM2JlZDMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZnN5bmMuYworKysgYi9mcy9leHQ0L2ZzeW5jLmMKQEAgLTE1MSw2ICsxNTEsMzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIF9fc3luY19maWxlIC0gZ2VuZXJpY19maWxlX2ZzeW5jIHdpdGhvdXQgdGhlIGxvY2tpbmcgYW5kIGZpbGVtYXBfd3JpdGUKKyAqIEBpbm9kZToJaW5vZGUgdG8gc3luYworICogQGRhdGFzeW5jOglvbmx5IHN5bmMgZXNzZW50aWFsIG1ldGFkYXRhIGlmIHRydWUKKyAqCisgKiBUaGlzIGlzIGp1c3QgZ2VuZXJpY19maWxlX2ZzeW5jIHdpdGhvdXQgdGhlIGxvY2tpbmcuICBUaGlzIGlzIG5lZWRlZCBmb3IKKyAqIG5vam91cm5hbCBtb2RlIHRvIG1ha2Ugc3VyZSB0aGlzIGlub2RlcyBkYXRhL21ldGFkYXRhIG1ha2VzIGl0IHRvIGRpc2sKKyAqIHByb3Blcmx5LiAgVGhlIGlfbXV0ZXggc2hvdWxkIGJlIGhlbGQgYWxyZWFkeS4KKyAqLworc3RhdGljIGludCBfX3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRhdGFzeW5jKQoreworCWludCBlcnI7CisJaW50IHJldDsKKworCXJldCA9IHN5bmNfbWFwcGluZ19idWZmZXJzKGlub2RlLT5pX21hcHBpbmcpOworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkpCisJCXJldHVybiByZXQ7CisJaWYgKGRhdGFzeW5jICYmICEoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZX0RBVEFTWU5DKSkKKwkJcmV0dXJuIHJldDsKKworCWVyciA9IHN5bmNfaW5vZGVfbWV0YWRhdGEoaW5vZGUsIDEpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gZXJyOworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBha3BtOiBBIG5ldyBkZXNpZ24gZm9yIGV4dDRfc3luY19maWxlKCkuCiAgKgpAQCAtMTY1LDcgKzE5MSw3IEBACiAgKiBpX211dGV4IGxvY2sgaXMgaGVsZCB3aGVuIGVudGVyaW5nIGFuZCBleGl0aW5nIHRoaXMgZnVuY3Rpb24KICAqLwogCi1pbnQgZXh0NF9zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK2ludCBleHQ0X3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CkBAIC0xNzgsMTUgKzIwNCwyMCBAQAogCiAJdHJhY2VfZXh0NF9zeW5jX2ZpbGVfZW50ZXIoZmlsZSwgZGF0YXN5bmMpOwogCisJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwogCWlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJcmV0ID0gZXh0NF9mbHVzaF9jb21wbGV0ZWRfSU8oaW5vZGUpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAogCWlmICgham91cm5hbCkgewotCQlyZXQgPSBnZW5lcmljX2ZpbGVfZnN5bmMoZmlsZSwgZGF0YXN5bmMpOworCQlyZXQgPSBfX3N5bmNfaW5vZGUoaW5vZGUsIGRhdGFzeW5jKTsKIAkJaWYgKCFyZXQgJiYgIWxpc3RfZW1wdHkoJmlub2RlLT5pX2RlbnRyeSkpCiAJCQlyZXQgPSBleHQ0X3N5bmNfcGFyZW50KGlub2RlKTsKIAkJZ290byBvdXQ7CkBAIC0yMjAsNiArMjUxLDcgQEAKIAlpZiAobmVlZHNfYmFycmllcikKIAkJYmxrZGV2X2lzc3VlX2ZsdXNoKGlub2RlLT5pX3NiLT5zX2JkZXYsIEdGUF9LRVJORUwsIE5VTEwpOwogIG91dDoKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAl0cmFjZV9leHQ0X3N5bmNfZmlsZV9leGl0KGlub2RlLCByZXQpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggYTU3NjNlMy4uNjc4Y2RlOCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtMjYzNCw3ICsyNjM0LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhZ2VfYnVmcyA9IE5VTEw7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CiAKLQl0cmFjZV9leHQ0X3dyaXRlcGFnZShpbm9kZSwgcGFnZSk7CisJdHJhY2VfZXh0NF93cml0ZXBhZ2UocGFnZSk7CiAJc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAlpZiAocGFnZS0+aW5kZXggPT0gc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKQogCQlsZW4gPSBzaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKQEAgLTM1MDEsMTAgKzM1MDEsOCBAQAogCQkJCSBvZmZzZXQsIG5yX3NlZ3MsCiAJCQkJIGV4dDRfZ2V0X2Jsb2NrLCBOVUxMLCBOVUxMLCAwKTsKIAllbHNlIHsKLQkJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwKLQkJCQkgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LAotCQkJCSBvZmZzZXQsIG5yX3NlZ3MsCi0JCQkJIGV4dDRfZ2V0X2Jsb2NrLCBOVUxMKTsKKwkJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW92LAorCQkJCSBvZmZzZXQsIG5yX3NlZ3MsIGV4dDRfZ2V0X2Jsb2NrKTsKIAogCQlpZiAodW5saWtlbHkoKHJ3ICYgV1JJVEUpICYmIHJldCA8IDApKSB7CiAJCQlsb2ZmX3QgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CkBAIC0zNTc1LDYgKzM1NzMsNyBAQAogCQkJICAgIHNzaXplX3Qgc2l6ZSwgdm9pZCAqcHJpdmF0ZSwgaW50IHJldCwKIAkJCSAgICBib29sIGlzX2FzeW5jKQogeworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpb2NiLT5raV9maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogICAgICAgICBleHQ0X2lvX2VuZF90ICppb19lbmQgPSBpb2NiLT5wcml2YXRlOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzU5Niw2ICszNTk1LDcgQEAKIG91dDoKIAkJaWYgKGlzX2FzeW5jKQogCQkJYWlvX2NvbXBsZXRlKGlvY2IsIHJldCwgMCk7CisJCWlub2RlX2Rpb19kb25lKGlub2RlKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzYxNiw2ICszNjE2LDkgQEAKIAkvKiBxdWV1ZSB0aGUgd29yayB0byBjb252ZXJ0IHVud3JpdHRlbiBleHRlbnRzIHRvIHdyaXR0ZW4gKi8KIAlxdWV1ZV93b3JrKHdxLCAmaW9fZW5kLT53b3JrKTsKIAlpb2NiLT5wcml2YXRlID0gTlVMTDsKKworCS8qIFhYWDogcHJvYmFibHkgc2hvdWxkIG1vdmUgaW50byB0aGUgcmVhbCBJL08gY29tcGxldGlvbiBoYW5kbGVyICovCisJaW5vZGVfZGlvX2RvbmUoaW5vZGUpOwogfQogCiBzdGF0aWMgdm9pZCBleHQ0X2VuZF9pb19idWZmZXJfd3JpdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQpAQCAtMzc0OCwxMSArMzc1MSwxMyBAQAogCQkJRVhUNF9JKGlub2RlKS0+Y3VyX2Fpb19kaW8gPSBpb2NiLT5wcml2YXRlOwogCQl9CiAKLQkJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwKKwkJcmV0ID0gX19ibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLAogCQkJCQkgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LAogCQkJCQkgb2Zmc2V0LCBucl9zZWdzLAogCQkJCQkgZXh0NF9nZXRfYmxvY2tfd3JpdGUsCi0JCQkJCSBleHQ0X2VuZF9pb19kaW8pOworCQkJCQkgZXh0NF9lbmRfaW9fZGlvLAorCQkJCQkgTlVMTCwKKwkJCQkJIERJT19MT0NLSU5HIHwgRElPX1NLSVBfSE9MRVMpOwogCQlpZiAoaW9jYi0+cHJpdmF0ZSkKIAkJCUVYVDRfSShpbm9kZSktPmN1cl9haW9fZGlvID0gTlVMTDsKIAkJLyoKQEAgLTUzNTEsNiArNTM1Niw4IEBACiAJfQogCiAJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCWlub2RlX2Rpb193YWl0KGlub2RlKTsKKwogCQlpZiAoIShleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSkpIHsKIAkJCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpOwogCkBAIC01ODQzLDgwICs1ODUwLDg0IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2bWYtPnBhZ2U7CiAJbG9mZl90IHNpemU7CiAJdW5zaWduZWQgbG9uZyBsZW47Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0Jdm9pZCAqZnNkYXRhOworCWludCByZXQ7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSB2bWEtPnZtX2ZpbGU7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCWhhbmRsZV90ICpoYW5kbGU7CisJZ2V0X2Jsb2NrX3QgKmdldF9ibG9jazsKKwlpbnQgcmV0cmllcyA9IDA7CiAKIAkvKgotCSAqIEdldCBpX2FsbG9jX3NlbSB0byBzdG9wIHRydW5jYXRlcyBtZXNzaW5nIHdpdGggdGhlIGlub2RlLiBXZSBjYW5ub3QKLQkgKiBnZXQgaV9tdXRleCBiZWNhdXNlIHdlIGFyZSBhbHJlYWR5IGhvbGRpbmcgbW1hcF9zZW0uCisJICogVGhpcyBjaGVjayBpcyByYWN5IGJ1dCBjYXRjaGVzIHRoZSBjb21tb24gY2FzZS4gV2UgcmVseSBvbgorCSAqIF9fYmxvY2tfcGFnZV9ta3dyaXRlKCkgdG8gZG8gYSByZWxpYWJsZSBjaGVjay4KIAkgKi8KLQlkb3duX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0Jc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQlpZiAocGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nIHx8IHNpemUgPD0gcGFnZV9vZmZzZXQocGFnZSkKLQkgICAgfHwgIVBhZ2VVcHRvZGF0ZShwYWdlKSkgewotCQkvKiBwYWdlIGdvdCB0cnVuY2F0ZWQgZnJvbSB1bmRlciB1cz8gKi8KLQkJZ290byBvdXRfdW5sb2NrOworCXZmc19jaGVja19mcm96ZW4oaW5vZGUtPmlfc2IsIFNCX0ZSRUVaRV9XUklURSk7CisJLyogRGVsYWxsb2MgY2FzZSBpcyBlYXN5Li4uICovCisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBERUxBTExPQykgJiYKKwkgICAgIWV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkgJiYKKwkgICAgIWV4dDRfbm9uZGFfc3dpdGNoKGlub2RlLT5pX3NiKSkgeworCQlkbyB7CisJCQlyZXQgPSBfX2Jsb2NrX3BhZ2VfbWt3cml0ZSh2bWEsIHZtZiwKKwkJCQkJCSAgIGV4dDRfZGFfZ2V0X2Jsb2NrX3ByZXApOworCQl9IHdoaWxlIChyZXQgPT0gLUVOT1NQQyAmJgorCQkgICAgICAgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSk7CisJCWdvdG8gb3V0X3JldDsKIAl9Ci0JcmV0ID0gMDsKIAogCWxvY2tfcGFnZShwYWdlKTsKLQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCWlmIChQYWdlTWFwcGVkVG9EaXNrKHBhZ2UpKSB7Ci0JCXVwX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0JCXJldHVybiBWTV9GQVVMVF9MT0NLRUQ7CisJc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwkvKiBQYWdlIGdvdCB0cnVuY2F0ZWQgZnJvbSB1bmRlciB1cz8gKi8KKwlpZiAocGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nIHx8IHBhZ2Vfb2Zmc2V0KHBhZ2UpID4gc2l6ZSkgeworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcmV0ID0gVk1fRkFVTFRfTk9QQUdFOworCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAocGFnZS0+aW5kZXggPT0gc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKQogCQlsZW4gPSBzaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKIAllbHNlCiAJCWxlbiA9IFBBR0VfQ0FDSEVfU0laRTsKLQogCS8qCi0JICogcmV0dXJuIGlmIHdlIGhhdmUgYWxsIHRoZSBidWZmZXJzIG1hcHBlZC4gVGhpcyBhdm9pZAotCSAqIHRoZSBuZWVkIHRvIGNhbGwgd3JpdGVfYmVnaW4vd3JpdGVfZW5kIHdoaWNoIGRvZXMgYQotCSAqIGpvdXJuYWxfc3RhcnQvam91cm5hbF9zdG9wIHdoaWNoIGNhbiBibG9jayBhbmQgdGFrZQotCSAqIGxvbmcgdGltZQorCSAqIFJldHVybiBpZiB3ZSBoYXZlIGFsbCB0aGUgYnVmZmVycyBtYXBwZWQuIFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIGRvCisJICogam91cm5hbF9zdGFydC9qb3VybmFsX3N0b3Agd2hpY2ggY2FuIGJsb2NrIGFuZCB0YWtlIGEgbG9uZyB0aW1lCiAJICovCiAJaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKIAkJaWYgKCF3YWxrX3BhZ2VfYnVmZmVycyhOVUxMLCBwYWdlX2J1ZmZlcnMocGFnZSksIDAsIGxlbiwgTlVMTCwKIAkJCQkJZXh0NF9iaF91bm1hcHBlZCkpIHsKLQkJCXVwX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0JCQlyZXR1cm4gVk1fRkFVTFRfTE9DS0VEOworCQkJLyogV2FpdCBzbyB0aGF0IHdlIGRvbid0IGNoYW5nZSBwYWdlIHVuZGVyIElPICovCisJCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQkJcmV0ID0gVk1fRkFVTFRfTE9DS0VEOworCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JLyoKLQkgKiBPSywgd2UgbmVlZCB0byBmaWxsIHRoZSBob2xlLi4uIERvIHdyaXRlX2JlZ2luIHdyaXRlX2VuZAotCSAqIHRvIGRvIGJsb2NrIGFsbG9jYXRpb24vcmVzZXJ2YXRpb24uV2UgYXJlIG5vdCBob2xkaW5nCi0JICogaW5vZGUuaV9fbXV0ZXggaGVyZS4gVGhhdCBhbGxvdyAqIHBhcmFsbGVsIHdyaXRlX2JlZ2luLAotCSAqIHdyaXRlX2VuZCBjYWxsLiBsb2NrX3BhZ2UgcHJldmVudCB0aGlzIGZyb20gaGFwcGVuaW5nCi0JICogb24gdGhlIHNhbWUgcGFnZSB0aG91Z2gKLQkgKi8KLQlyZXQgPSBtYXBwaW5nLT5hX29wcy0+d3JpdGVfYmVnaW4oZmlsZSwgbWFwcGluZywgcGFnZV9vZmZzZXQocGFnZSksCi0JCQlsZW4sIEFPUF9GTEFHX1VOSU5URVJSVVBUSUJMRSwgJnBhZ2UsICZmc2RhdGEpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF91bmxvY2s7Ci0JcmV0ID0gbWFwcGluZy0+YV9vcHMtPndyaXRlX2VuZChmaWxlLCBtYXBwaW5nLCBwYWdlX29mZnNldChwYWdlKSwKLQkJCWxlbiwgbGVuLCBwYWdlLCBmc2RhdGEpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF91bmxvY2s7Ci0JcmV0ID0gMDsKLQotCS8qCi0JICogd3JpdGVfYmVnaW4vZW5kIG1pZ2h0IGhhdmUgY3JlYXRlZCBhIGRpcnR5IHBhZ2UgYW5kIHNvbWVvbmUKLQkgKiBjb3VsZCB3YW5kZXIgaW4gYW5kIHN0YXJ0IHRoZSBJTy4gIE1ha2Ugc3VyZSB0aGF0IGhhc24ndAotCSAqIGhhcHBlbmVkLgotCSAqLwotCWxvY2tfcGFnZShwYWdlKTsKLQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCXVwX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0JcmV0dXJuIFZNX0ZBVUxUX0xPQ0tFRDsKLW91dF91bmxvY2s6Ci0JaWYgKHJldCkKKwkvKiBPSywgd2UgbmVlZCB0byBmaWxsIHRoZSBob2xlLi4uICovCisJaWYgKGV4dDRfc2hvdWxkX2Rpb3JlYWRfbm9sb2NrKGlub2RlKSkKKwkJZ2V0X2Jsb2NrID0gZXh0NF9nZXRfYmxvY2tfd3JpdGU7CisJZWxzZQorCQlnZXRfYmxvY2sgPSBleHQ0X2dldF9ibG9jazsKK3JldHJ5X2FsbG9jOgorCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgZXh0NF93cml0ZXBhZ2VfdHJhbnNfYmxvY2tzKGlub2RlKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXJldCA9IFZNX0ZBVUxUX1NJR0JVUzsKLQl1cF9yZWFkKCZpbm9kZS0+aV9hbGxvY19zZW0pOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gX19ibG9ja19wYWdlX21rd3JpdGUodm1hLCB2bWYsIGdldF9ibG9jayk7CisJaWYgKCFyZXQgJiYgZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkgeworCQlpZiAod2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBwYWdlX2J1ZmZlcnMocGFnZSksIDAsCisJCQkgIFBBR0VfQ0FDSEVfU0laRSwgTlVMTCwgZG9fam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKSkgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlyZXQgPSBWTV9GQVVMVF9TSUdCVVM7CisJCQlnb3RvIG91dDsKKwkJfQorCQlleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9KREFUQSk7CisJfQorCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnlfYWxsb2M7CitvdXRfcmV0OgorCXJldCA9IGJsb2NrX3BhZ2VfbWt3cml0ZV9yZXR1cm4ocmV0KTsKK291dDoKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmMgYi9mcy9leHQ0L21iYWxsb2MuYwppbmRleCA4NTlmMmFlLi42ZWQ4NTlkIDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuYworKysgYi9mcy9leHQ0L21iYWxsb2MuYwpAQCAtMzU3OCw4ICszNTc4LDggQEAKIAkJZnJlZSArPSBuZXh0IC0gYml0OwogCiAJCXRyYWNlX2V4dDRfbWJhbGxvY19kaXNjYXJkKHNiLCBOVUxMLCBncm91cCwgYml0LCBuZXh0IC0gYml0KTsKLQkJdHJhY2VfZXh0NF9tYl9yZWxlYXNlX2lub2RlX3BhKHNiLCBwYS0+cGFfaW5vZGUsIHBhLAotCQkJCQkgICAgICAgZ3JwX2Jsa19zdGFydCArIGJpdCwgbmV4dCAtIGJpdCk7CisJCXRyYWNlX2V4dDRfbWJfcmVsZWFzZV9pbm9kZV9wYShwYSwgZ3JwX2Jsa19zdGFydCArIGJpdCwKKwkJCQkJICAgICAgIG5leHQgLSBiaXQpOwogCQltYl9mcmVlX2Jsb2NrcyhwYS0+cGFfaW5vZGUsIGU0YiwgYml0LCBuZXh0IC0gYml0KTsKIAkJYml0ID0gbmV4dCArIDE7CiAJfQpAQCAtMzYwOCw3ICszNjA4LDcgQEAKIAlleHQ0X2dyb3VwX3QgZ3JvdXA7CiAJZXh0NF9ncnBibGtfdCBiaXQ7CiAKLQl0cmFjZV9leHQ0X21iX3JlbGVhc2VfZ3JvdXBfcGEoc2IsIHBhKTsKKwl0cmFjZV9leHQ0X21iX3JlbGVhc2VfZ3JvdXBfcGEocGEpOwogCUJVR19PTihwYS0+cGFfZGVsZXRlZCA9PSAwKTsKIAlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCBwYS0+cGFfcHN0YXJ0LCAmZ3JvdXAsICZiaXQpOwogCUJVR19PTihncm91cCAhPSBlNGItPmJkX2dyb3VwICYmIHBhLT5wYV9sZW4gIT0gMCk7CkBAIC00NDQ4LDcgKzQ0NDgsNyBAQAogICogQGlub2RlOgkJaW5vZGUKICAqIEBibG9jazoJCXN0YXJ0IHBoeXNpY2FsIGJsb2NrIHRvIGZyZWUKICAqIEBjb3VudDoJCW51bWJlciBvZiBibG9ja3MgdG8gY291bnQKLSAqIEBtZXRhZGF0YTogCQlBcmUgdGhlc2UgbWV0YWRhdGEgYmxvY2tzCisgKiBAZmxhZ3M6CQlmbGFncyB1c2VkIGJ5IGV4dDRfZnJlZV9ibG9ja3MKICAqLwogdm9pZCBleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGV4dDRfZnNibGtfdCBibG9jaywKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbW92ZV9leHRlbnQuYyBiL2ZzL2V4dDQvbW92ZV9leHRlbnQuYwppbmRleCAyYjgzMDRiLi5mNTc0NTVhIDEwMDY0NAotLS0gYS9mcy9leHQ0L21vdmVfZXh0ZW50LmMKKysrIGIvZnMvZXh0NC9tb3ZlX2V4dGVudC5jCkBAIC0xMDAyLDEyICsxMDAyLDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICgob3JpZ19zdGFydCA+IEVYVF9NQVhfQkxPQ0spIHx8Ci0JICAgIChkb25vcl9zdGFydCA+IEVYVF9NQVhfQkxPQ0spIHx8Ci0JICAgICgqbGVuID4gRVhUX01BWF9CTE9DSykgfHwKLQkgICAgKG9yaWdfc3RhcnQgKyAqbGVuID4gRVhUX01BWF9CTE9DSykpICB7CisJaWYgKChvcmlnX3N0YXJ0ID49IEVYVF9NQVhfQkxPQ0tTKSB8fAorCSAgICAoZG9ub3Jfc3RhcnQgPj0gRVhUX01BWF9CTE9DS1MpIHx8CisJICAgICgqbGVuID4gRVhUX01BWF9CTE9DS1MpIHx8CisJICAgIChvcmlnX3N0YXJ0ICsgKmxlbiA+PSBFWFRfTUFYX0JMT0NLUykpICB7CiAJCWV4dDRfZGVidWcoImV4dDQgbW92ZSBleHRlbnQ6IENhbid0IGhhbmRsZSBvdmVyIFsldV0gYmxvY2tzICIKLQkJCSJbaW5vOm9yaWcgJWx1LCBkb25vciAlbHVdXG4iLCBFWFRfTUFYX0JMT0NLLAorCQkJIltpbm86b3JpZyAlbHUsIGRvbm9yICVsdV1cbiIsIEVYVF9NQVhfQkxPQ0tTLAogCQkJb3JpZ19pbm9kZS0+aV9pbm8sIGRvbm9yX2lub2RlLT5pX2lubyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbmFtZWkuYyBiL2ZzL2V4dDQvbmFtZWkuYwppbmRleCBiNzU0Yjc3Li44YzliYWJhIDEwMDY0NAotLS0gYS9mcy9leHQ0L25hbWVpLmMKKysrIGIvZnMvZXh0NC9uYW1laS5jCkBAIC0xMDM3LDE1ICsxMDM3LDExIEBACiAJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAkJfQogCQlpbm9kZSA9IGV4dDRfaWdldChkaXItPmlfc2IsIGlubyk7Ci0JCWlmIChJU19FUlIoaW5vZGUpKSB7Ci0JCQlpZiAoUFRSX0VSUihpbm9kZSkgPT0gLUVTVEFMRSkgewotCQkJCUVYVDRfRVJST1JfSU5PREUoZGlyLAotCQkJCQkJICJkZWxldGVkIGlub2RlIHJlZmVyZW5jZWQ6ICV1IiwKLQkJCQkJCSBpbm8pOwotCQkJCXJldHVybiBFUlJfUFRSKC1FSU8pOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwotCQkJfQorCQlpZiAoaW5vZGUgPT0gRVJSX1BUUigtRVNUQUxFKSkgeworCQkJRVhUNF9FUlJPUl9JTk9ERShkaXIsCisJCQkJCSAiZGVsZXRlZCBpbm9kZSByZWZlcmVuY2VkOiAldSIsCisJCQkJCSBpbm8pOworCQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAJCX0KIAl9CiAJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwpAQCAtMjU5NCw3ICsyNTkwLDcgQEAKIAkubGlzdHhhdHRyCT0gZXh0NF9saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKICNlbmRpZgotCS5jaGVja19hY2wJPSBleHQ0X2NoZWNrX2FjbCwKKwkuZ2V0X2FjbAk9IGV4dDRfZ2V0X2FjbCwKIAkuZmllbWFwICAgICAgICAgPSBleHQ0X2ZpZW1hcCwKIH07CiAKQEAgLTI2MDYsNSArMjYwMiw1IEBACiAJLmxpc3R4YXR0cgk9IGV4dDRfbGlzdHhhdHRyLAogCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAjZW5kaWYKLQkuY2hlY2tfYWNsCT0gZXh0NF9jaGVja19hY2wsCisJLmdldF9hY2wJPSBleHQ0X2dldF9hY2wsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zdXBlci5jIGIvZnMvZXh0NC9zdXBlci5jCmluZGV4IGNjNWMxNTcuLjllYTcxYWEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvc3VwZXIuYworKysgYi9mcy9leHQ0L3N1cGVyLmMKQEAgLTIyNDMsNiArMjI0MywxMiBAQAogICogaW4gdGhlIHZmcy4gIGV4dDQgaW5vZGUgaGFzIDQ4IGJpdHMgb2YgaV9ibG9jayBpbiBmc2Jsb2NrIHVuaXRzLAogICogc28gdGhhdCB3b24ndCBiZSBhIGxpbWl0aW5nIGZhY3Rvci4KICAqCisgKiBIb3dldmVyIHRoZXJlIGlzIG90aGVyIGxpbWl0aW5nIGZhY3Rvci4gV2UgZG8gc3RvcmUgZXh0ZW50cyBpbiB0aGUgZm9ybQorICogb2Ygc3RhcnRpbmcgYmxvY2sgYW5kIGxlbmd0aCwgaGVuY2UgdGhlIHJlc3VsdGluZyBsZW5ndGggb2YgdGhlIGV4dGVudAorICogY292ZXJpbmcgbWF4aW11bSBmaWxlIHNpemUgbXVzdCBmaXQgaW50byBvbi1kaXNrIGZvcm1hdCBjb250YWluZXJzIGFzCisgKiB3ZWxsLiBHaXZlbiB0aGF0IGxlbmd0aCBpcyBhbHdheXMgYnkgMSB1bml0IGJpZ2dlciB0aGFuIG1heCB1bml0IChiZWNhdXNlCisgKiB3ZSBjb3VudCAwIGFzIHdlbGwpIHdlIGhhdmUgdG8gbG93ZXIgdGhlIHNfbWF4Ynl0ZXMgYnkgb25lIGZzIGJsb2NrLgorICoKICAqIE5vdGUsIHRoaXMgZG9lcyAqbm90KiBjb25zaWRlciBhbnkgbWV0YWRhdGEgb3ZlcmhlYWQgZm9yIHZmcyBpX2Jsb2Nrcy4KICAqLwogc3RhdGljIGxvZmZfdCBleHQ0X21heF9zaXplKGludCBibGtiaXRzLCBpbnQgaGFzX2h1Z2VfZmlsZXMpCkBAIC0yMjY0LDEwICsyMjcwLDEzIEBACiAJCXVwcGVyX2xpbWl0IDw8PSBibGtiaXRzOwogCX0KIAotCS8qIDMyLWJpdCBleHRlbnQtc3RhcnQgY29udGFpbmVyLCBlZV9ibG9jayAqLwotCXJlcyA9IDFMTCA8PCAzMjsKKwkvKgorCSAqIDMyLWJpdCBleHRlbnQtc3RhcnQgY29udGFpbmVyLCBlZV9ibG9jay4gV2UgbG93ZXIgdGhlIG1heGJ5dGVzCisJICogYnkgb25lIGZzIGJsb2NrLCBzbyBlZV9sZW4gY2FuIGNvdmVyIHRoZSBleHRlbnQgb2YgbWF4aW11bSBmaWxlCisJICogc2l6ZQorCSAqLworCXJlcyA9ICgxTEwgPDwgMzIpIC0gMTsKIAlyZXMgPDw9IGJsa2JpdHM7Ci0JcmVzIC09IDE7CiAKIAkvKiBTYW5pdHkgY2hlY2sgYWdhaW5zdCB2bS0gJiB2ZnMtIGltcG9zZWQgbGltaXRzICovCiAJaWYgKHJlcyA+IHVwcGVyX2xpbWl0KQpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZhdC5oIGIvZnMvZmF0L2ZhdC5oCmluZGV4IDgyNzZjYzIuLmE1ZDM4NTMgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9mYXQuaAorKysgYi9mcy9mYXQvZmF0LmgKQEAgLTEwOSw2ICsxMDksNyBAQAogCWludCBpX2F0dHJzOwkJLyogdW51c2VkIGF0dHJpYnV0ZSBiaXRzICovCiAJbG9mZl90IGlfcG9zOwkJLyogb24tZGlzayBwb3NpdGlvbiBvZiBkaXJlY3RvcnkgZW50cnkgb3IgMCAqLwogCXN0cnVjdCBobGlzdF9ub2RlIGlfZmF0X2hhc2g7CS8qIGhhc2ggYnkgaV9sb2NhdGlvbiAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgdHJ1bmNhdGVfbG9jazsgLyogcHJvdGVjdCBibWFwIGFnYWluc3QgdHJ1bmNhdGUgKi8KIAlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOwogfTsKIApAQCAtMzA5LDcgKzMxMCw4IEBACiBleHRlcm4gdm9pZCBmYXRfdHJ1bmNhdGVfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQpOwogZXh0ZXJuIGludCBmYXRfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkgICAgICAgc3RydWN0IGtzdGF0ICpzdGF0KTsKLWV4dGVybiBpbnQgZmF0X2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYyk7CitleHRlcm4gaW50IGZhdF9maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCisJCQkgIGludCBkYXRhc3luYyk7CiAKIC8qIGZhdC9pbm9kZS5jICovCiBleHRlcm4gdm9pZCBmYXRfYXR0YWNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBpX3Bvcyk7CmRpZmYgLS1naXQgYS9mcy9mYXQvZmlsZS5jIGIvZnMvZmF0L2ZpbGUuYwppbmRleCA3MjU3NzUyLi5jMTE4YWNmIDEwMDY0NAotLS0gYS9mcy9mYXQvZmlsZS5jCisrKyBiL2ZzL2ZhdC9maWxlLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCQlpZiAoYXR0ciAmIEFUVFJfU1lTKQogCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CiAJCWVsc2UKLQkJCWlub2RlLT5pX2ZsYWdzICY9IFNfSU1NVVRBQkxFOworCQkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfSU1NVVRBQkxFOwogCX0KIAogCWZhdF9zYXZlX2F0dHJzKGlub2RlLCBhdHRyKTsKQEAgLTE0OSwxMiArMTQ5LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBmYXRfZmlsZV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGRhdGFzeW5jKQoraW50IGZhdF9maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OwogCWludCByZXMsIGVycjsKIAotCXJlcyA9IGdlbmVyaWNfZmlsZV9mc3luYyhmaWxwLCBkYXRhc3luYyk7CisJcmVzID0gZ2VuZXJpY19maWxlX2ZzeW5jKGZpbHAsIHN0YXJ0LCBlbmQsIGRhdGFzeW5jKTsKIAllcnIgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhNU0RPU19TQihpbm9kZS0+aV9zYiktPmZhdF9pbm9kZS0+aV9tYXBwaW5nKTsKIAogCXJldHVybiByZXMgPyByZXMgOiBlcnI7CkBAIC0zOTcsNiArMzk3LDggQEAKIAkgKiBzZXF1ZW5jZS4KIAkgKi8KIAlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJaW5vZGVfZGlvX3dhaXQoaW5vZGUpOworCiAJCWlmIChhdHRyLT5pYV9zaXplID4gaW5vZGUtPmlfc2l6ZSkgewogCQkJZXJyb3IgPSBmYXRfY29udF9leHBhbmQoaW5vZGUsIGF0dHItPmlhX3NpemUpOwogCQkJaWYgKGVycm9yIHx8IGF0dHItPmlhX3ZhbGlkID09IEFUVFJfU0laRSkKQEAgLTQyOSw4ICs0MzEsMTAgQEAKIAl9CiAKIAlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJZG93bl93cml0ZSgmTVNET1NfSShpbm9kZSktPnRydW5jYXRlX2xvY2spOwogCQl0cnVuY2F0ZV9zZXRzaXplKGlub2RlLCBhdHRyLT5pYV9zaXplKTsKIAkJZmF0X3RydW5jYXRlX2Jsb2Nrcyhpbm9kZSwgYXR0ci0+aWFfc2l6ZSk7CisJCXVwX3dyaXRlKCZNU0RPU19JKGlub2RlKS0+dHJ1bmNhdGVfbG9jayk7CiAJfQogCiAJc2V0YXR0cl9jb3B5KGlub2RlLCBhdHRyKTsKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9pbm9kZS5jIGIvZnMvZmF0L2lub2RlLmMKaW5kZXggY2I4ZDgzOS4uNTk0MmZlYyAxMDA2NDQKLS0tIGEvZnMvZmF0L2lub2RlLmMKKysrIGIvZnMvZmF0L2lub2RlLmMKQEAgLTIxMSw4ICsyMTEsOCBAQAogCSAqIEZBVCBuZWVkIHRvIHVzZSB0aGUgRElPX0xPQ0tJTkcgZm9yIGF2b2lkaW5nIHRoZSByYWNlCiAJICogY29uZGl0aW9uIG9mIGZhdF9nZXRfYmxvY2soKSBhbmQgLT50cnVuY2F0ZSgpLgogCSAqLwotCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsCi0JCQkJIGlvdiwgb2Zmc2V0LCBucl9zZWdzLCBmYXRfZ2V0X2Jsb2NrLCBOVUxMKTsKKwlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpb3YsIG9mZnNldCwgbnJfc2VncywKKwkJCQkgZmF0X2dldF9ibG9jayk7CiAJaWYgKHJldCA8IDAgJiYgKHJ3ICYgV1JJVEUpKQogCQlmYXRfd3JpdGVfZmFpbGVkKG1hcHBpbmcsIG9mZnNldCArIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKSk7CiAKQEAgLTIyNCw5ICsyMjQsOSBAQAogCXNlY3Rvcl90IGJsb2NrbnI7CiAKIAkvKiBmYXRfZ2V0X2NsdXN0ZXIoKSBhc3N1bWVzIHRoZSByZXF1ZXN0ZWQgYmxvY2tuciBpc24ndCB0cnVuY2F0ZWQuICovCi0JZG93bl9yZWFkKCZtYXBwaW5nLT5ob3N0LT5pX2FsbG9jX3NlbSk7CisJZG93bl9yZWFkKCZNU0RPU19JKG1hcHBpbmctPmhvc3QpLT50cnVuY2F0ZV9sb2NrKTsKIAlibG9ja25yID0gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsIGJsb2NrLCBmYXRfZ2V0X2Jsb2NrKTsKLQl1cF9yZWFkKCZtYXBwaW5nLT5ob3N0LT5pX2FsbG9jX3NlbSk7CisJdXBfcmVhZCgmTVNET1NfSShtYXBwaW5nLT5ob3N0KS0+dHJ1bmNhdGVfbG9jayk7CiAKIAlyZXR1cm4gYmxvY2tucjsKIH0KQEAgLTUxMCw2ICs1MTAsOCBAQAogCWVpID0ga21lbV9jYWNoZV9hbGxvYyhmYXRfaW5vZGVfY2FjaGVwLCBHRlBfTk9GUyk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CisKKwlpbml0X3J3c2VtKCZlaS0+dHJ1bmNhdGVfbG9jayk7CiAJcmV0dXJuICZlaS0+dmZzX2lub2RlOwogfQogCmRpZmYgLS1naXQgYS9mcy9mYXQvbmFtZWlfbXNkb3MuYyBiL2ZzL2ZhdC9uYW1laV9tc2Rvcy5jCmluZGV4IDNiMjIyZGEuLjY2ZTgzYjggMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9uYW1laV9tc2Rvcy5jCisrKyBiL2ZzL2ZhdC9uYW1laV9tc2Rvcy5jCkBAIC0yMDksMjkgKzIwOSwyMCBAQAogCWludCBlcnI7CiAKIAlsb2NrX3N1cGVyKHNiKTsKLQogCWVyciA9IG1zZG9zX2ZpbmQoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZzaW5mbyk7Ci0JaWYgKGVycikgewotCQlpZiAoZXJyID09IC1FTk9FTlQpIHsKLQkJCWlub2RlID0gTlVMTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWdvdG8gZXJyb3I7CisJc3dpdGNoIChlcnIpIHsKKwljYXNlIC1FTk9FTlQ6CisJCWlub2RlID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlpbm9kZSA9IGZhdF9idWlsZF9pbm9kZShzYiwgc2luZm8uZGUsIHNpbmZvLmlfcG9zKTsKKwkJYnJlbHNlKHNpbmZvLmJoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaW5vZGUgPSBFUlJfUFRSKGVycik7CiAJfQotCi0JaW5vZGUgPSBmYXRfYnVpbGRfaW5vZGUoc2IsIHNpbmZvLmRlLCBzaW5mby5pX3Bvcyk7Ci0JYnJlbHNlKHNpbmZvLmJoKTsKLQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKLQkJZ290byBlcnJvcjsKLQl9Ci1vdXQ6CiAJdW5sb2NrX3N1cGVyKHNiKTsKIAlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7Ci0KLWVycm9yOgotCXVubG9ja19zdXBlcihzYik7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAogLyoqKioqIENyZWF0ZXMgYSBkaXJlY3RvcnkgZW50cnkgKG5hbWUgaXMgYWxyZWFkeSBmb3JtYXR0ZWQpLiAqLwpkaWZmIC0tZ2l0IGEvZnMvZmF0L25hbWVpX3ZmYXQuYyBiL2ZzL2ZhdC9uYW1laV92ZmF0LmMKaW5kZXggMjBiNGVhNS4uYmIzZjI5YyAxMDA2NDQKLS0tIGEvZnMvZmF0L25hbWVpX3ZmYXQuYworKysgYi9mcy9mYXQvbmFtZWlfdmZhdC5jCkBAIC04MiwxMCArODIsOCBAQAogCSAqIGNhc2Ugc2Vuc2l0aXZlIG5hbWUgd2hpY2ggaXMgc3BlY2lmaWVkIGJ5IHVzZXIgaWYgdGhpcyBpcwogCSAqIGZvciBjcmVhdGlvbi4KIAkgKi8KLQlpZiAoIShuZC0+ZmxhZ3MgJiAoTE9PS1VQX0NPTlRJTlVFIHwgTE9PS1VQX1BBUkVOVCkpKSB7Ci0JCWlmIChuZC0+ZmxhZ3MgJiAoTE9PS1VQX0NSRUFURSB8IExPT0tVUF9SRU5BTUVfVEFSR0VUKSkKLQkJCXJldHVybiAwOwotCX0KKwlpZiAobmQtPmZsYWdzICYgKExPT0tVUF9DUkVBVEUgfCBMT09LVVBfUkVOQU1FX1RBUkdFVCkpCisJCXJldHVybiAwOwogCiAJcmV0dXJuIHZmYXRfcmV2YWxpZGF0ZV9zaG9ydG5hbWUoZGVudHJ5KTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2ZzLXdyaXRlYmFjay5jIGIvZnMvZnMtd3JpdGViYWNrLmMKaW5kZXggMGYwMTVhMC4uYjhjNTA3YyAxMDA2NDQKLS0tIGEvZnMvZnMtd3JpdGViYWNrLmMKKysrIGIvZnMvZnMtd3JpdGViYWNrLmMKQEAgLTQ2MSwzMiArNDYxLDYgQEAKIH0KIAogLyoKLSAqIEZvciBiYWNrZ3JvdW5kIHdyaXRlYmFjayB0aGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgdGhlIHNiIHBpbm5lZAotICogYmVmb3JlIGNhbGxpbmcgd3JpdGViYWNrLiBTbyBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBwaW4gaXQsIHNvIGl0IGRvZXNuJ3QKLSAqIGdvIGF3YXkgd2hpbGUgd2UgYXJlIHdyaXRpbmcgaW5vZGVzIGZyb20gaXQuCi0gKi8KLXN0YXRpYyBib29sIHBpbl9zYl9mb3Jfd3JpdGViYWNrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0Jc3Bpbl9sb2NrKCZzYl9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmc2ItPnNfaW5zdGFuY2VzKSkgewotCQlzcGluX3VubG9jaygmc2JfbG9jayk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzYi0+c19jb3VudCsrOwotCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKLQotCWlmIChkb3duX3JlYWRfdHJ5bG9jaygmc2ItPnNfdW1vdW50KSkgewotCQlpZiAoc2ItPnNfcm9vdCkKLQkJCXJldHVybiB0cnVlOwotCQl1cF9yZWFkKCZzYi0+c191bW91bnQpOwotCX0KLQotCXB1dF9zdXBlcihzYik7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKgogICogV3JpdGUgYSBwb3J0aW9uIG9mIGJfaW8gaW5vZGVzIHdoaWNoIGJlbG9uZyB0byBAc2IuCiAgKgogICogSWYgQG9ubHlfdGhpc19zYiBpcyB0cnVlLCB0aGVuIGZpbmQgYW5kIHdyaXRlIGFsbCBzdWNoCkBAIC01ODUsNyArNTU5LDcgQEAKIAkJc3RydWN0IGlub2RlICppbm9kZSA9IHdiX2lub2RlKHdiLT5iX2lvLnByZXYpOwogCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAKLQkJaWYgKCFwaW5fc2JfZm9yX3dyaXRlYmFjayhzYikpIHsKKwkJaWYgKCFncmFiX3N1cGVyX3Bhc3NpdmUoc2IpKSB7CiAJCQlyZXF1ZXVlX2lvKGlub2RlKTsKIAkJCWNvbnRpbnVlOwogCQl9CmRpZmYgLS1naXQgYS9mcy9mc2NhY2hlL3BhZ2UuYyBiL2ZzL2ZzY2FjaGUvcGFnZS5jCmluZGV4IGEyYTVkMTkuLjNmN2E1OWIgMTAwNjQ0Ci0tLSBhL2ZzL2ZzY2FjaGUvcGFnZS5jCisrKyBiL2ZzL2ZzY2FjaGUvcGFnZS5jCkBAIC05NTQsMyArOTU0LDQzIEBACiAJcGFnZXZlY19yZWluaXQocGFnZXZlYyk7CiB9CiBFWFBPUlRfU1lNQk9MKGZzY2FjaGVfbWFya19wYWdlc19jYWNoZWQpOworCisvKgorICogVW5jYWNoZSBhbGwgdGhlIHBhZ2VzIGluIGFuIGlub2RlIHRoYXQgYXJlIG1hcmtlZCBQR19mc2NhY2hlLCBhc3N1bWluZyB0aGVtCisgKiB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvb2tpZS4KKyAqLwordm9pZCBfX2ZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMoc3RydWN0IGZzY2FjaGVfY29va2llICpjb29raWUsCisJCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdldmVjIHB2ZWM7CisJcGdvZmZfdCBuZXh0OworCWludCBpOworCisJX2VudGVyKCIlcCwlcCIsIGNvb2tpZSwgaW5vZGUpOworCisJaWYgKCFtYXBwaW5nIHx8IG1hcHBpbmctPm5ycGFnZXMgPT0gMCkgeworCQlfbGVhdmUoIiBbbm8gcGFnZXNdIik7CisJCXJldHVybjsKKwl9CisKKwlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCW5leHQgPSAwOworCWRvIHsKKwkJaWYgKCFwYWdldmVjX2xvb2t1cCgmcHZlYywgbWFwcGluZywgbmV4dCwgUEFHRVZFQ19TSVpFKSkKKwkJCWJyZWFrOworCQlmb3IgKGkgPSAwOyBpIDwgcGFnZXZlY19jb3VudCgmcHZlYyk7IGkrKykgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOworCQkJbmV4dCA9IHBhZ2UtPmluZGV4OworCQkJaWYgKFBhZ2VGc0NhY2hlKHBhZ2UpKSB7CisJCQkJX19mc2NhY2hlX3dhaXRfb25fcGFnZV93cml0ZShjb29raWUsIHBhZ2UpOworCQkJCV9fZnNjYWNoZV91bmNhY2hlX3BhZ2UoY29va2llLCBwYWdlKTsKKwkJCX0KKwkJfQorCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9IHdoaWxlICgrK25leHQpOworCisJX2xlYXZlKCIiKTsKK30KK0VYUE9SVF9TWU1CT0woX19mc2NhY2hlX3VuY2FjaGVfYWxsX2lub2RlX3BhZ2VzKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGlyLmMgYi9mcy9mdXNlL2Rpci5jCmluZGV4IGQ1MDE2MDcxLi45ZjYzZTQ5IDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rpci5jCisrKyBiL2ZzL2Z1c2UvZGlyLmMKQEAgLTM4Miw3ICszODIsNyBAQAogCXN0cnVjdCBmdXNlX2VudHJ5X291dCBvdXRlbnRyeTsKIAlzdHJ1Y3QgZnVzZV9maWxlICpmZjsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKLQlpbnQgZmxhZ3MgPSBuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgLSAxOworCWludCBmbGFncyA9IG5kLT5pbnRlbnQub3Blbi5mbGFnczsKIAogCWlmIChmYy0+bm9fY3JlYXRlKQogCQlyZXR1cm4gLUVOT1NZUzsKQEAgLTU3Niw3ICs1NzYsNyBAQAogc3RhdGljIGludCBmdXNlX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZW50cnksIGludCBtb2RlLAogCQkgICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7Ci0JaWYgKG5kICYmIChuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikpIHsKKwlpZiAobmQpIHsKIAkJaW50IGVyciA9IGZ1c2VfY3JlYXRlX29wZW4oZGlyLCBlbnRyeSwgbW9kZSwgbmQpOwogCQlpZiAoZXJyICE9IC1FTk9TWVMpCiAJCQlyZXR1cm4gZXJyOwpAQCAtOTcxLDkgKzk3MSw5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBmdXNlX3Blcm1fZ2V0YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IGZ1c2VfcGVybV9nZXRhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQorCWlmIChtYXNrICYgTUFZX05PVF9CTE9DSykKIAkJcmV0dXJuIC1FQ0hJTEQ7CiAKIAlyZXR1cm4gZnVzZV9kb19nZXRhdHRyKGlub2RlLCBOVUxMLCBOVUxMKTsKQEAgLTk5Miw3ICs5OTIsNyBAQAogICogYWNjZXNzIHJlcXVlc3QgaXMgc2VudC4gIEV4ZWN1dGUgcGVybWlzc2lvbiBpcyBzdGlsbCBjaGVja2VkCiAgKiBsb2NhbGx5IGJhc2VkIG9uIGZpbGUgbW9kZS4KICAqLwotc3RhdGljIGludCBmdXNlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncykKK3N0YXRpYyBpbnQgZnVzZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CiAJYm9vbCByZWZyZXNoZWQgPSBmYWxzZTsKQEAgLTEwMTEsMjMgKzEwMTEsMjIgQEAKIAkJaWYgKGZpLT5pX3RpbWUgPCBnZXRfamlmZmllc182NCgpKSB7CiAJCQlyZWZyZXNoZWQgPSB0cnVlOwogCi0JCQllcnIgPSBmdXNlX3Blcm1fZ2V0YXR0cihpbm9kZSwgZmxhZ3MpOworCQkJZXJyID0gZnVzZV9wZXJtX2dldGF0dHIoaW5vZGUsIG1hc2spOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQogCiAJaWYgKGZjLT5mbGFncyAmIEZVU0VfREVGQVVMVF9QRVJNSVNTSU9OUykgewotCQllcnIgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIGZsYWdzLCBOVUxMKTsKKwkJZXJyID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrKTsKIAogCQkvKiBJZiBwZXJtaXNzaW9uIGlzIGRlbmllZCwgdHJ5IHRvIHJlZnJlc2ggZmlsZQogCQkgICBhdHRyaWJ1dGVzLiAgVGhpcyBpcyBhbHNvIG5lZWRlZCwgYmVjYXVzZSB0aGUgcm9vdAogCQkgICBub2RlIHdpbGwgYXQgZmlyc3QgaGF2ZSBubyBwZXJtaXNzaW9ucyAqLwogCQlpZiAoZXJyID09IC1FQUNDRVMgJiYgIXJlZnJlc2hlZCkgewotCQkJZXJyID0gZnVzZV9wZXJtX2dldGF0dHIoaW5vZGUsIGZsYWdzKTsKKwkJCWVyciA9IGZ1c2VfcGVybV9nZXRhdHRyKGlub2RlLCBtYXNrKTsKIAkJCWlmICghZXJyKQotCQkJCWVyciA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywKLQkJCQkJCQlmbGFncywgTlVMTCk7CisJCQkJZXJyID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrKTsKIAkJfQogCiAJCS8qIE5vdGU6IHRoZSBvcHBvc2l0ZSBvZiB0aGUgYWJvdmUgdGVzdCBkb2VzIG5vdApAQCAtMTAzNSw3ICsxMDM0LDcgQEAKIAkJICAgbm90aWNlZCBpbW1lZGlhdGVseSwgb25seSBhZnRlciB0aGUgYXR0cmlidXRlCiAJCSAgIHRpbWVvdXQgaGFzIGV4cGlyZWQgKi8KIAl9IGVsc2UgaWYgKG1hc2sgJiAoTUFZX0FDQ0VTUyB8IE1BWV9DSERJUikpIHsKLQkJaWYgKGZsYWdzICYgSVBFUk1fRkxBR19SQ1UpCisJCWlmIChtYXNrICYgTUFZX05PVF9CTE9DSykKIAkJCXJldHVybiAtRUNISUxEOwogCiAJCWVyciA9IGZ1c2VfYWNjZXNzKGlub2RlLCBtYXNrKTsKQEAgLTEwNDQsNyArMTA0Myw3IEBACiAJCQlpZiAocmVmcmVzaGVkKQogCQkJCXJldHVybiAtRUFDQ0VTOwogCi0JCQllcnIgPSBmdXNlX3Blcm1fZ2V0YXR0cihpbm9kZSwgZmxhZ3MpOworCQkJZXJyID0gZnVzZV9wZXJtX2dldGF0dHIoaW5vZGUsIG1hc2spOwogCQkJaWYgKCFlcnIgJiYgIShpbm9kZS0+aV9tb2RlICYgU19JWFVHTykpCiAJCQkJcmV0dXJuIC1FQUNDRVM7CiAJCX0KQEAgLTExNzcsOSArMTE3NiwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZ1c2VfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpCitzdGF0aWMgaW50IGZ1c2VfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCisJCQkgIGludCBkYXRhc3luYykKIHsKLQlyZXR1cm4gZnVzZV9mc3luY19jb21tb24oZmlsZSwgZGF0YXN5bmMsIDEpOworCXJldHVybiBmdXNlX2ZzeW5jX2NvbW1vbihmaWxlLCBzdGFydCwgZW5kLCBkYXRhc3luYywgMSk7CiB9CiAKIHN0YXRpYyBib29sIHVwZGF0ZV9tdGltZSh1bnNpZ25lZCBpdmFsaWQpCmRpZmYgLS1naXQgYS9mcy9mdXNlL2ZpbGUuYyBiL2ZzL2Z1c2UvZmlsZS5jCmluZGV4IDgyYTY2NDYuLmQ0ODBkOWEgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZmlsZS5jCisrKyBiL2ZzL2Z1c2UvZmlsZS5jCkBAIC00MDAsNyArNDAwLDggQEAKIAlmdXNlX3JlbGVhc2Vfbm93cml0ZShpbm9kZSk7CiB9CiAKLWludCBmdXNlX2ZzeW5jX2NvbW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jLCBpbnQgaXNkaXIpCitpbnQgZnVzZV9mc3luY19jb21tb24oc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwKKwkJICAgICAgaW50IGRhdGFzeW5jLCBpbnQgaXNkaXIpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwpAQCAtNDEyLDkgKzQxMywxNSBAQAogCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQogCQlyZXR1cm4gLUVJTzsKIAorCWVyciA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCWlmICgoIWlzZGlyICYmIGZjLT5ub19mc3luYykgfHwgKGlzZGlyICYmIGZjLT5ub19mc3luY2RpcikpCiAJCXJldHVybiAwOwogCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCiAJLyoKIAkgKiBTdGFydCB3cml0ZWJhY2sgYWdhaW5zdCBhbGwgZGlydHkgcGFnZXMgb2YgdGhlIGlub2RlLCB0aGVuCiAJICogd2FpdCBmb3IgYWxsIG91dHN0YW5kaW5nIHdyaXRlcywgYmVmb3JlIHNlbmRpbmcgdGhlIEZTWU5DCkBAIC00MjIsMTMgKzQyOSwxNSBAQAogCSAqLwogCWVyciA9IHdyaXRlX2lub2RlX25vdyhpbm9kZSwgMCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CiAKIAlmdXNlX3N5bmNfd3JpdGVzKGlub2RlKTsKIAogCXJlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7Ci0JaWYgKElTX0VSUihyZXEpKQotCQlyZXR1cm4gUFRSX0VSUihyZXEpOworCWlmIChJU19FUlIocmVxKSkgeworCQllcnIgPSBQVFJfRVJSKHJlcSk7CisJCWdvdG8gb3V0OworCX0KIAogCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOwogCWluYXJnLmZoID0gZmYtPmZoOwpAQCAtNDQ4LDEyICs0NTcsMTUgQEAKIAkJCWZjLT5ub19mc3luYyA9IDE7CiAJCWVyciA9IDA7CiAJfQorb3V0OgorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZnVzZV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQorc3RhdGljIGludCBmdXNlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCisJCSAgICAgIGludCBkYXRhc3luYykKIHsKLQlyZXR1cm4gZnVzZV9mc3luY19jb21tb24oZmlsZSwgZGF0YXN5bmMsIDApOworCXJldHVybiBmdXNlX2ZzeW5jX2NvbW1vbihmaWxlLCBzdGFydCwgZW5kLCBkYXRhc3luYywgMCk7CiB9CiAKIHZvaWQgZnVzZV9yZWFkX2ZpbGwoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgcG9zLApAQCAtMTQ5NSw3ICsxNTA3LDcgQEAKIAlwaWRfdCBwaWQgPSBmbC0+ZmxfdHlwZSAhPSBGX1VOTENLID8gY3VycmVudC0+dGdpZCA6IDA7CiAJaW50IGVycjsKIAotCWlmIChmbC0+ZmxfbG1vcHMgJiYgZmwtPmZsX2xtb3BzLT5mbF9ncmFudCkgeworCWlmIChmbC0+ZmxfbG1vcHMgJiYgZmwtPmZsX2xtb3BzLT5sbV9ncmFudCkgewogCQkvKiBOTE0gbmVlZHMgYXN5bmNocm9ub3VzIGxvY2tzLCB3aGljaCB3ZSBkb24ndCBzdXBwb3J0IHlldCAqLwogCQlyZXR1cm4gLUVOT0xDSzsKIAl9CkBAIC0xNjAwLDE1ICsxNjEyLDMyIEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0Jc3dpdGNoIChvcmlnaW4pIHsKLQljYXNlIFNFRUtfRU5EOgorCWlmIChvcmlnaW4gIT0gU0VFS19DVVIgfHwgb3JpZ2luICE9IFNFRUtfU0VUKSB7CiAJCXJldHZhbCA9IGZ1c2VfdXBkYXRlX2F0dHJpYnV0ZXMoaW5vZGUsIE5VTEwsIGZpbGUsIE5VTEwpOwogCQlpZiAocmV0dmFsKQogCQkJZ290byBleGl0OworCX0KKworCXN3aXRjaCAob3JpZ2luKSB7CisJY2FzZSBTRUVLX0VORDoKIAkJb2Zmc2V0ICs9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAkJYnJlYWs7CiAJY2FzZSBTRUVLX0NVUjoKIAkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIFNFRUtfREFUQToKKwkJaWYgKG9mZnNldCA+PSBpX3NpemVfcmVhZChpbm9kZSkpIHsKKwkJCXJldHZhbCA9IC1FTlhJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNFRUtfSE9MRToKKwkJaWYgKG9mZnNldCA+PSBpX3NpemVfcmVhZChpbm9kZSkpIHsKKwkJCXJldHZhbCA9IC1FTlhJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlvZmZzZXQgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJCWJyZWFrOwogCX0KIAlyZXR2YWwgPSAtRUlOVkFMOwogCWlmIChvZmZzZXQgPj0gMCAmJiBvZmZzZXQgPD0gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oCmluZGV4IGI3ODhiZWMuLmM2YWEyZDQgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmgKKysrIGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtNTg5LDcgKzU4OSw4IEBACiAvKioKICAqIFNlbmQgRlNZTkMgb3IgRlNZTkNESVIgcmVxdWVzdAogICovCi1pbnQgZnVzZV9mc3luY19jb21tb24oc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYywgaW50IGlzZGlyKTsKK2ludCBmdXNlX2ZzeW5jX2NvbW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkgICAgICBpbnQgZGF0YXN5bmMsIGludCBpc2Rpcik7CiAKIC8qKgogICogTm90aWZ5IHBvbGwgd2FrZXVwCmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKaW5kZXggY2M2ZWM0Yi4uMzhmODRjZCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9pbm9kZS5jCisrKyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtOTIxLDYgKzkyMSw4IEBACiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfTUFORExPQ0spCiAJCWdvdG8gZXJyOwogCisJc2ItPnNfZmxhZ3MgJj0gfk1TX05PU0VDOworCiAJaWYgKCFwYXJzZV9mdXNlX29wdCgoY2hhciAqKSBkYXRhLCAmZCwgaXNfYmRldikpCiAJCWdvdG8gZXJyOwogCmRpZmYgLS1naXQgYS9mcy9nZW5lcmljX2FjbC5jIGIvZnMvZ2VuZXJpY19hY2wuYwppbmRleCA4ZjI2ZDFhLi5kNWUzM2EwIDEwMDY0NAotLS0gYS9mcy9nZW5lcmljX2FjbC5jCisrKyBiL2ZzL2dlbmVyaWNfYWNsLmMKQEAgLTEzMiwzMSArMTMyLDE3IEBACiAJaWYgKCFTX0lTTE5LKGlub2RlLT5pX21vZGUpKQogCQlhY2wgPSBnZXRfY2FjaGVkX2FjbChkaXIsIEFDTF9UWVBFX0RFRkFVTFQpOwogCWlmIChhY2wpIHsKLQkJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmU7Ci0KLQkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLQkJCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX0tFUk5FTCk7Ci0JCQllcnJvciA9IC1FTk9NRU07Ci0JCQlpZiAoIWNsb25lKQotCQkJCWdvdG8gY2xlYW51cDsKLQkJCXNldF9jYWNoZWRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBjbG9uZSk7Ci0JCQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7Ci0JCX0KLQkJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlpZiAoIWNsb25lKQotCQkJZ290byBjbGVhbnVwOwotCQllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShjbG9uZSwgJm1vZGUpOwotCQlpZiAoZXJyb3IgPj0gMCkgewotCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7Ci0JCQlpZiAoZXJyb3IgPiAwKQotCQkJCXNldF9jYWNoZWRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKLQkJfQotCQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CisJCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfS0VSTkVMLCAmbW9kZSk7CisJCWlmIChlcnJvciA8IDApCisJCQlyZXR1cm4gZXJyb3I7CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQlpZiAoZXJyb3IgPiAwKQorCQkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKIAl9CiAJZXJyb3IgPSAwOwogCi1jbGVhbnVwOgogCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMTcwLDQ0ICsxNTYsMjIgQEAKIGludAogZ2VuZXJpY19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpjbG9uZTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJaW50IGVycm9yID0gMDsKIAogCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJYWNsID0gZ2V0X2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CiAJaWYgKGFjbCkgewotCQljbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9LRVJORUwpOworCQllcnJvciA9IHBvc2l4X2FjbF9jaG1vZCgmYWNsLCBHRlBfS0VSTkVMLCBpbm9kZS0+aV9tb2RlKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCQlzZXRfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBhY2wpOwogCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCQlpZiAoIWNsb25lKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWVycm9yID0gcG9zaXhfYWNsX2NobW9kX21hc3EoY2xvbmUsIGlub2RlLT5pX21vZGUpOwotCQlpZiAoIWVycm9yKQotCQkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOwotCQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CiAJfQogCXJldHVybiBlcnJvcjsKIH0KIAotaW50Ci1nZW5lcmljX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQotewotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKSB7Ci0JCWlmICghbmVnYXRpdmVfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKSkKLQkJCXJldHVybiAtRUNISUxEOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKLQotCQlhY2wgPSBnZXRfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKLQkJaWYgKGFjbCkgewotCQkJaW50IGVycm9yID0gcG9zaXhfYWNsX3Blcm1pc3Npb24oaW5vZGUsIGFjbCwgbWFzayk7Ci0JCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JfQotCXJldHVybiAtRUFHQUlOOwotfQotCiBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBnZW5lcmljX2FjbF9hY2Nlc3NfaGFuZGxlciA9IHsKIAkucHJlZml4ID0gUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUywKIAkuZmxhZ3MJPSBBQ0xfVFlQRV9BQ0NFU1MsCmRpZmYgLS1naXQgYS9mcy9nZnMyL2FjbC5jIGIvZnMvZ2ZzMi9hY2wuYwppbmRleCBjYmMwNzE1Li44ODRjOWFmIDEwMDY0NAotLS0gYS9mcy9nZnMyL2FjbC5jCisrKyBiL2ZzL2dmczIvYWNsLmMKQEAgLTY3LDM2ICs2Nyw5IEBACiAJcmV0dXJuIGFjbDsKIH0KIAotLyoqCi0gKiBnZnMyX2NoZWNrX2FjbCAtIENoZWNrIGFuIEFDTCB0byBzZWUgaWYgd2UncmUgYWxsb3dlZCB0byBkbyBzb21ldGhpbmcKLSAqIEBpbm9kZTogdGhlIGZpbGUgd2Ugd2FudCB0byBkbyBzb21ldGhpbmcgdG8KLSAqIEBtYXNrOiB3aGF0IHdlIHdhbnQgdG8gZG8KLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLWludCBnZnMyX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQorc3RydWN0IHBvc2l4X2FjbCAqZ2ZzMl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQogewotCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkgewotCQlpZiAoIW5lZ2F0aXZlX2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUykpCi0JCQlyZXR1cm4gLUVDSElMRDsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0JYWNsID0gZ2ZzMl9hY2xfZ2V0KEdGUzJfSShpbm9kZSksIEFDTF9UWVBFX0FDQ0VTUyk7Ci0JaWYgKElTX0VSUihhY2wpKQotCQlyZXR1cm4gUFRSX0VSUihhY2wpOwotCi0JaWYgKGFjbCkgewotCQllcnJvciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBhY2wsIG1hc2spOwotCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JcmV0dXJuIC1FQUdBSU47CisJcmV0dXJuIGdmczJfYWNsX2dldChHRlMyX0koaW5vZGUpLCB0eXBlKTsKIH0KIAogc3RhdGljIGludCBnZnMyX3NldF9tb2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIG1vZGVfdCBtb2RlKQpAQCAtMTQzLDcgKzExNiw3IEBACiBpbnQgZ2ZzMl9hY2xfY3JlYXRlKHN0cnVjdCBnZnMyX2lub2RlICpkaXAsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZkaXAtPmlfaW5vZGUpOwotCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKIAltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJaW50IGVycm9yID0gMDsKIApAQCAtMTY4LDE2ICsxNDEsMTAgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAotCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX05PRlMpOwotCWVycm9yID0gLUVOT01FTTsKLQlpZiAoIWNsb25lKQotCQlnb3RvIG91dDsKLQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCWFjbCA9IGNsb25lOwotCi0JZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlX21hc3EoYWNsLCAmbW9kZSk7CisJZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9OT0ZTLCAmbW9kZSk7CiAJaWYgKGVycm9yIDwgMCkKLQkJZ290byBvdXQ7CisJCXJldHVybiBlcnJvcjsKKwogCWlmIChlcnJvciA9PSAwKQogCQlnb3RvIG11bmdlOwogCkBAIC0xOTMsNyArMTYwLDcgQEAKIAogaW50IGdmczJfYWNsX2NobW9kKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGlhdHRyICphdHRyKQogewotCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKIAljaGFyICpkYXRhOwogCXVuc2lnbmVkIGludCBsZW47CiAJaW50IGVycm9yOwpAQCAtMjA0LDI1ICsxNzEsMTkgQEAKIAlpZiAoIWFjbCkKIAkJcmV0dXJuIGdmczJfc2V0YXR0cl9zaW1wbGUoaXAsIGF0dHIpOwogCi0JY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfTk9GUyk7Ci0JZXJyb3IgPSAtRU5PTUVNOwotCWlmICghY2xvbmUpCi0JCWdvdG8gb3V0OwotCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7Ci0JYWNsID0gY2xvbmU7CisJZXJyb3IgPSBwb3NpeF9hY2xfY2htb2QoJmFjbCwgR0ZQX05PRlMsIGF0dHItPmlhX21vZGUpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCi0JZXJyb3IgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShhY2wsIGF0dHItPmlhX21vZGUpOwotCWlmICghZXJyb3IpIHsKLQkJbGVuID0gcG9zaXhfYWNsX3RvX3hhdHRyKGFjbCwgTlVMTCwgMCk7Ci0JCWRhdGEgPSBrbWFsbG9jKGxlbiwgR0ZQX05PRlMpOwotCQllcnJvciA9IC1FTk9NRU07Ci0JCWlmIChkYXRhID09IE5VTEwpCi0JCQlnb3RvIG91dDsKLQkJcG9zaXhfYWNsX3RvX3hhdHRyKGFjbCwgZGF0YSwgbGVuKTsKLQkJZXJyb3IgPSBnZnMyX3hhdHRyX2FjbF9jaG1vZChpcCwgYXR0ciwgZGF0YSk7Ci0JCWtmcmVlKGRhdGEpOwotCQlzZXRfY2FjaGVkX2FjbCgmaXAtPmlfaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKLQl9CisJbGVuID0gcG9zaXhfYWNsX3RvX3hhdHRyKGFjbCwgTlVMTCwgMCk7CisJZGF0YSA9IGttYWxsb2MobGVuLCBHRlBfTk9GUyk7CisJZXJyb3IgPSAtRU5PTUVNOworCWlmIChkYXRhID09IE5VTEwpCisJCWdvdG8gb3V0OworCXBvc2l4X2FjbF90b194YXR0cihhY2wsIGRhdGEsIGxlbik7CisJZXJyb3IgPSBnZnMyX3hhdHRyX2FjbF9jaG1vZChpcCwgYXR0ciwgZGF0YSk7CisJa2ZyZWUoZGF0YSk7CisJc2V0X2NhY2hlZF9hY2woJmlwLT5pX2lub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGFjbCk7CiAKIG91dDoKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9hY2wuaCBiL2ZzL2dmczIvYWNsLmgKaW5kZXggYTkzOTA3Yy4uMGRhMzhkYyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hY2wuaAorKysgYi9mcy9nZnMyL2FjbC5oCkBAIC0xNiw3ICsxNiw3IEBACiAjZGVmaW5lIEdGUzJfUE9TSVhfQUNMX0RFRkFVTFQJCSJwb3NpeF9hY2xfZGVmYXVsdCIKICNkZWZpbmUgR0ZTMl9BQ0xfTUFYX0VOVFJJRVMJCTI1CiAKLWV4dGVybiBpbnQgZ2ZzMl9jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCk7CitleHRlcm4gc3RydWN0IHBvc2l4X2FjbCAqZ2ZzMl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgZ2ZzMl9hY2xfY3JlYXRlKHN0cnVjdCBnZnMyX2lub2RlICpkaXAsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogZXh0ZXJuIGludCBnZnMyX2FjbF9jaG1vZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBpYXR0ciAqYXR0cik7CiBleHRlcm4gY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgZ2ZzMl94YXR0cl9zeXN0ZW1faGFuZGxlcjsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYW9wcy5jIGIvZnMvZ2ZzMi9hb3BzLmMKaW5kZXggODAyYWM1ZS4uZjlmYmJlOSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hb3BzLmMKKysrIGIvZnMvZ2ZzMi9hb3BzLmMKQEAgLTEwNjksNiArMTA2OSw3IEBACiAJCXJldHVybiAwOwogCiAJZ2ZzMl9sb2dfbG9jayhzZHApOworCXNwaW5fbG9jaygmc2RwLT5zZF9haWxfbG9jayk7CiAJaGVhZCA9IGJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCWRvIHsKIAkJaWYgKGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCkpCkBAIC0xMDgwLDYgKzEwODEsNyBAQAogCQkJZ290byBub3RfcG9zc2libGU7CiAJCWJoID0gYmgtPmJfdGhpc19wYWdlOwogCX0gd2hpbGUoYmggIT0gaGVhZCk7CisJc3Bpbl91bmxvY2soJnNkcC0+c2RfYWlsX2xvY2spOwogCWdmczJfbG9nX3VubG9jayhzZHApOwogCiAJaGVhZCA9IGJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOwpAQCAtMTExMiw2ICsxMTE0LDcgQEAKIAlXQVJOX09OKGJ1ZmZlcl9kaXJ0eShiaCkpOwogCVdBUk5fT04oYnVmZmVyX3Bpbm5lZChiaCkpOwogY2Fubm90X3JlbGVhc2U6CisJc3Bpbl91bmxvY2soJnNkcC0+c2RfYWlsX2xvY2spOwogCWdmczJfbG9nX3VubG9jayhzZHApOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9ibWFwLmMgYi9mcy9nZnMyL2JtYXAuYwppbmRleCBlNjU0OTNhLi43ODc4YzQ3IDEwMDY0NAotLS0gYS9mcy9nZnMyL2JtYXAuYworKysgYi9mcy9nZnMyL2JtYXAuYwpAQCAtODU0LDExICs4NTQsNyBAQAogCQkJYmxlbisrOwogCQllbHNlIHsKIAkJCWlmIChic3RhcnQpIHsKLQkJCQlpZiAobWV0YWRhdGEpCi0JCQkJCV9fZ2ZzMl9mcmVlX21ldGEoaXAsIGJzdGFydCwgYmxlbik7Ci0JCQkJZWxzZQotCQkJCQlfX2dmczJfZnJlZV9kYXRhKGlwLCBic3RhcnQsIGJsZW4pOwotCisJCQkJX19nZnMyX2ZyZWVfYmxvY2tzKGlwLCBic3RhcnQsIGJsZW4sIG1ldGFkYXRhKTsKIAkJCQlidG90YWwgKz0gYmxlbjsKIAkJCX0KIApAQCAtODcwLDExICs4NjYsNyBAQAogCQlnZnMyX2FkZF9pbm9kZV9ibG9ja3MoJmlwLT5pX2lub2RlLCAtMSk7CiAJfQogCWlmIChic3RhcnQpIHsKLQkJaWYgKG1ldGFkYXRhKQotCQkJX19nZnMyX2ZyZWVfbWV0YShpcCwgYnN0YXJ0LCBibGVuKTsKLQkJZWxzZQotCQkJX19nZnMyX2ZyZWVfZGF0YShpcCwgYnN0YXJ0LCBibGVuKTsKLQorCQlfX2dmczJfZnJlZV9ibG9ja3MoaXAsIGJzdGFydCwgYmxlbiwgbWV0YWRhdGEpOwogCQlidG90YWwgKz0gYmxlbjsKIAl9CiAKQEAgLTEyMjQsNiArMTIxNiw4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCWlub2RlX2Rpb193YWl0KGlub2RlKTsKKwogCW9sZHNpemUgPSBpbm9kZS0+aV9zaXplOwogCWlmIChuZXdzaXplID49IG9sZHNpemUpCiAJCXJldHVybiBkb19ncm93KGlub2RlLCBuZXdzaXplKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZGlyLmMgYi9mcy9nZnMyL2Rpci5jCmluZGV4IDA5MWVlNDcuLjFjYzJmOGUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZGlyLmMKKysrIGIvZnMvZ2ZzMi9kaXIuYwpAQCAtMzM5LDYgKzMzOSw2NyBAQAogCXJldHVybiAoY29waWVkKSA/IGNvcGllZCA6IGVycm9yOwogfQogCisvKioKKyAqIGdmczJfZGlyX2dldF9oYXNoX3RhYmxlIC0gR2V0IHBvaW50ZXIgdG8gdGhlIGRpciBoYXNoIHRhYmxlCisgKiBAaXA6IFRoZSBpbm9kZSBpbiBxdWVzdGlvbgorICoKKyAqIFJldHVybnM6IFRoZSBoYXNoIHRhYmxlIG9yIGFuIGVycm9yCisgKi8KKworc3RhdGljIF9fYmU2NCAqZ2ZzMl9kaXJfZ2V0X2hhc2hfdGFibGUoc3RydWN0IGdmczJfaW5vZGUgKmlwKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmaXAtPmlfaW5vZGU7CisJaW50IHJldDsKKwl1MzIgaHNpemU7CisJX19iZTY0ICpoYzsKKworCUJVR19PTighKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VYSEFTSCkpOworCisJaGMgPSBpcC0+aV9oYXNoX2NhY2hlOworCWlmIChoYykKKwkJcmV0dXJuIGhjOworCisJaHNpemUgPSAxIDw8IGlwLT5pX2RlcHRoOworCWhzaXplICo9IHNpemVvZihfX2JlNjQpOworCWlmIChoc2l6ZSAhPSBpX3NpemVfcmVhZCgmaXAtPmlfaW5vZGUpKSB7CisJCWdmczJfY29uc2lzdF9pbm9kZShpcCk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKworCWhjID0ga21hbGxvYyhoc2l6ZSwgR0ZQX05PRlMpOworCXJldCA9IC1FTk9NRU07CisJaWYgKGhjID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcmV0ID0gZ2ZzMl9kaXJfcmVhZF9kYXRhKGlwLCAoY2hhciAqKWhjLCAwLCBoc2l6ZSwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUoaGMpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaWYgKGlwLT5pX2hhc2hfY2FjaGUpCisJCWtmcmVlKGhjKTsKKwllbHNlCisJCWlwLT5pX2hhc2hfY2FjaGUgPSBoYzsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisKKwlyZXR1cm4gaXAtPmlfaGFzaF9jYWNoZTsKK30KKworLyoqCisgKiBnZnMyX2Rpcl9oYXNoX2ludmFsIC0gSW52YWxpZGF0ZSBkaXIgaGFzaAorICogQGlwOiBUaGUgZGlyZWN0b3J5IGlub2RlCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBleGNsdXNpdmUgZ2xvY2ssIG9yIGR1cmluZyBnbG9jayBpbnZhbGlkYXRpb24uCisgKi8KK3ZvaWQgZ2ZzMl9kaXJfaGFzaF9pbnZhbChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCit7CisJX19iZTY0ICpoYyA9IGlwLT5pX2hhc2hfY2FjaGU7CisJaXAtPmlfaGFzaF9jYWNoZSA9IE5VTEw7CisJa2ZyZWUoaGMpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBnZnMyX2RpcmVudF9zZW50aW5lbChjb25zdCBzdHJ1Y3QgZ2ZzMl9kaXJlbnQgKmRlbnQpCiB7CiAJcmV0dXJuIGRlbnQtPmRlX2ludW0ubm9fYWRkciA9PSAwIHx8IGRlbnQtPmRlX2ludW0ubm9fZm9ybWFsX2lubyA9PSAwOwpAQCAtNjg2LDE3ICs3NDcsMTIgQEAKIHN0YXRpYyBpbnQgZ2V0X2xlYWZfbnIoc3RydWN0IGdmczJfaW5vZGUgKmRpcCwgdTMyIGluZGV4LAogCQkgICAgICAgdTY0ICpsZWFmX291dCkKIHsKLQlfX2JlNjQgbGVhZl9ubzsKLQlpbnQgZXJyb3I7CisJX19iZTY0ICpoYXNoOwogCi0JZXJyb3IgPSBnZnMyX2Rpcl9yZWFkX2RhdGEoZGlwLCAoY2hhciAqKSZsZWFmX25vLAotCQkJCSAgICBpbmRleCAqIHNpemVvZihfX2JlNjQpLAotCQkJCSAgICBzaXplb2YoX19iZTY0KSwgMCk7Ci0JaWYgKGVycm9yICE9IHNpemVvZih1NjQpKQotCQlyZXR1cm4gKGVycm9yIDwgMCkgPyBlcnJvciA6IC1FSU87Ci0KLQkqbGVhZl9vdXQgPSBiZTY0X3RvX2NwdShsZWFmX25vKTsKLQorCWhhc2ggPSBnZnMyX2Rpcl9nZXRfaGFzaF90YWJsZShkaXApOworCWlmIChJU19FUlIoaGFzaCkpCisJCXJldHVybiBQVFJfRVJSKGhhc2gpOworCSpsZWFmX291dCA9IGJlNjRfdG9fY3B1KCooaGFzaCArIGluZGV4KSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk2Niw2ICsxMDIyLDggQEAKIAlmb3IgKHggPSAwOyB4IDwgaGFsZl9sZW47IHgrKykKIAkJbHBbeF0gPSBjcHVfdG9fYmU2NChibik7CiAKKwlnZnMyX2Rpcl9oYXNoX2ludmFsKGRpcCk7CisKIAllcnJvciA9IGdmczJfZGlyX3dyaXRlX2RhdGEoZGlwLCAoY2hhciAqKWxwLCBzdGFydCAqIHNpemVvZih1NjQpLAogCQkJCSAgICBoYWxmX2xlbiAqIHNpemVvZih1NjQpKTsKIAlpZiAoZXJyb3IgIT0gaGFsZl9sZW4gKiBzaXplb2YodTY0KSkgewpAQCAtMTA1Miw3MCArMTExMCw1NCBAQAogCiBzdGF0aWMgaW50IGRpcl9kb3VibGVfZXhoYXNoKHN0cnVjdCBnZnMyX2lub2RlICpkaXApCiB7Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZkaXAtPmlfaW5vZGUpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZGliaDsKIAl1MzIgaHNpemU7Ci0JdTY0ICpidWY7Ci0JdTY0ICpmcm9tLCAqdG87Ci0JdTY0IGJsb2NrOwotCXU2NCBkaXNrc2l6ZSA9IGlfc2l6ZV9yZWFkKCZkaXAtPmlfaW5vZGUpOworCXUzMiBoc2l6ZV9ieXRlczsKKwlfX2JlNjQgKmhjOworCV9fYmU2NCAqaGMyLCAqaDsKIAlpbnQgeDsKIAlpbnQgZXJyb3IgPSAwOwogCiAJaHNpemUgPSAxIDw8IGRpcC0+aV9kZXB0aDsKLQlpZiAoaHNpemUgKiBzaXplb2YodTY0KSAhPSBkaXNrc2l6ZSkgewotCQlnZnMyX2NvbnNpc3RfaW5vZGUoZGlwKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCWhzaXplX2J5dGVzID0gaHNpemUgKiBzaXplb2YoX19iZTY0KTsKIAotCS8qICBBbGxvY2F0ZSBib3RoIHRoZSAiZnJvbSIgYW5kICJ0byIgYnVmZmVycyBpbiBvbmUgYmlnIGNodW5rICAqLworCWhjID0gZ2ZzMl9kaXJfZ2V0X2hhc2hfdGFibGUoZGlwKTsKKwlpZiAoSVNfRVJSKGhjKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGMpOwogCi0JYnVmID0ga2NhbGxvYygzLCBzZHAtPnNkX2hhc2hfYnNpemUsIEdGUF9OT0ZTKTsKLQlpZiAoIWJ1ZikKKwloID0gaGMyID0ga21hbGxvYyhoc2l6ZV9ieXRlcyAqIDIsIEdGUF9OT0ZTKTsKKwlpZiAoIWhjMikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IgKGJsb2NrID0gZGlza3NpemUgPj4gc2RwLT5zZF9oYXNoX2JzaXplX3NoaWZ0OyBibG9jay0tOykgewotCQllcnJvciA9IGdmczJfZGlyX3JlYWRfZGF0YShkaXAsIChjaGFyICopYnVmLAotCQkJCQkgICAgYmxvY2sgKiBzZHAtPnNkX2hhc2hfYnNpemUsCi0JCQkJCSAgICBzZHAtPnNkX2hhc2hfYnNpemUsIDEpOwotCQlpZiAoZXJyb3IgIT0gc2RwLT5zZF9oYXNoX2JzaXplKSB7Ci0JCQlpZiAoZXJyb3IgPj0gMCkKLQkJCQllcnJvciA9IC1FSU87Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlmcm9tID0gYnVmOwotCQl0byA9ICh1NjQgKikoKGNoYXIgKilidWYgKyBzZHAtPnNkX2hhc2hfYnNpemUpOwotCi0JCWZvciAoeCA9IHNkcC0+c2RfaGFzaF9wdHJzOyB4LS07IGZyb20rKykgewotCQkJKnRvKysgPSAqZnJvbTsJLyogIE5vIGVuZGlhbmVzcyB3b3JyaWVzICAqLwotCQkJKnRvKysgPSAqZnJvbTsKLQkJfQotCi0JCWVycm9yID0gZ2ZzMl9kaXJfd3JpdGVfZGF0YShkaXAsCi0JCQkJCSAgICAgKGNoYXIgKilidWYgKyBzZHAtPnNkX2hhc2hfYnNpemUsCi0JCQkJCSAgICAgYmxvY2sgKiBzZHAtPnNkX3NiLnNiX2JzaXplLAotCQkJCQkgICAgIHNkcC0+c2Rfc2Iuc2JfYnNpemUpOwotCQlpZiAoZXJyb3IgIT0gc2RwLT5zZF9zYi5zYl9ic2l6ZSkgewotCQkJaWYgKGVycm9yID49IDApCi0JCQkJZXJyb3IgPSAtRUlPOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0Ja2ZyZWUoYnVmKTsKLQogCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihkaXAsICZkaWJoKTsKLQlpZiAoIWdmczJfYXNzZXJ0X3dpdGhkcmF3KHNkcCwgIWVycm9yKSkgewotCQlkaXAtPmlfZGVwdGgrKzsKLQkJZ2ZzMl9kaW5vZGVfb3V0KGRpcCwgZGliaC0+Yl9kYXRhKTsKLQkJYnJlbHNlKGRpYmgpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlmb3IgKHggPSAwOyB4IDwgaHNpemU7IHgrKykgeworCQkqaCsrID0gKmhjOworCQkqaCsrID0gKmhjOworCQloYysrOwogCX0KIAotCXJldHVybiBlcnJvcjsKKwllcnJvciA9IGdmczJfZGlyX3dyaXRlX2RhdGEoZGlwLCAoY2hhciAqKWhjMiwgMCwgaHNpemVfYnl0ZXMgKiAyKTsKKwlpZiAoZXJyb3IgIT0gKGhzaXplX2J5dGVzICogMikpCisJCWdvdG8gZmFpbDsKKworCWdmczJfZGlyX2hhc2hfaW52YWwoZGlwKTsKKwlkaXAtPmlfaGFzaF9jYWNoZSA9IGhjMjsKKwlkaXAtPmlfZGVwdGgrKzsKKwlnZnMyX2Rpbm9kZV9vdXQoZGlwLCBkaWJoLT5iX2RhdGEpOworCWJyZWxzZShkaWJoKTsKKwlyZXR1cm4gMDsKIAogZmFpbDoKLQlrZnJlZShidWYpOworCS8qIFJlcGxhY2Ugb3JpZ2luYWwgaGFzaCB0YWJsZSAmIHNpemUgKi8KKwlnZnMyX2Rpcl93cml0ZV9kYXRhKGRpcCwgKGNoYXIgKiloYywgMCwgaHNpemVfYnl0ZXMpOworCWlfc2l6ZV93cml0ZSgmZGlwLT5pX2lub2RlLCBoc2l6ZV9ieXRlcyk7CisJZ2ZzMl9kaW5vZGVfb3V0KGRpcCwgZGliaC0+Yl9kYXRhKTsKKwlicmVsc2UoZGliaCk7CitvdXRfa2ZyZWU6CisJa2ZyZWUoaGMyKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTEzNDgsNiArMTM5MCw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCisKIC8qKgogICogZGlyX2VfcmVhZCAtIFJlYWRzIHRoZSBlbnRyaWVzIGZyb20gYSBkaXJlY3RvcnkgaW50byBhIGZpbGxkaXIgYnVmZmVyCiAgKiBAZGlwOiBkaW5vZGUgcG9pbnRlcgpAQCAtMTM2Miw5ICsxNDA1LDcgQEAKIAkJICAgICAgZmlsbGRpcl90IGZpbGxkaXIpCiB7CiAJc3RydWN0IGdmczJfaW5vZGUgKmRpcCA9IEdGUzJfSShpbm9kZSk7Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKIAl1MzIgaHNpemUsIGxlbiA9IDA7Ci0JdTMyIGh0X29mZnNldCwgbHBfb2Zmc2V0LCBodF9vZmZzZXRfY3VyID0gLTE7CiAJdTMyIGhhc2gsIGluZGV4OwogCV9fYmU2NCAqbHA7CiAJaW50IGNvcGllZCA9IDA7CkBAIC0xMzcyLDM3ICsxNDEzLDE3IEBACiAJdW5zaWduZWQgZGVwdGggPSAwOwogCiAJaHNpemUgPSAxIDw8IGRpcC0+aV9kZXB0aDsKLQlpZiAoaHNpemUgKiBzaXplb2YodTY0KSAhPSBpX3NpemVfcmVhZChpbm9kZSkpIHsKLQkJZ2ZzMl9jb25zaXN0X2lub2RlKGRpcCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQogCWhhc2ggPSBnZnMyX2Rpcl9vZmZzZXQyaGFzaCgqb2Zmc2V0KTsKIAlpbmRleCA9IGhhc2ggPj4gKDMyIC0gZGlwLT5pX2RlcHRoKTsKIAotCWxwID0ga21hbGxvYyhzZHAtPnNkX2hhc2hfYnNpemUsIEdGUF9OT0ZTKTsKLQlpZiAoIWxwKQotCQlyZXR1cm4gLUVOT01FTTsKKwlscCA9IGdmczJfZGlyX2dldF9oYXNoX3RhYmxlKGRpcCk7CisJaWYgKElTX0VSUihscCkpCisJCXJldHVybiBQVFJfRVJSKGxwKTsKIAogCXdoaWxlIChpbmRleCA8IGhzaXplKSB7Ci0JCWxwX29mZnNldCA9IGluZGV4ICYgKHNkcC0+c2RfaGFzaF9wdHJzIC0gMSk7Ci0JCWh0X29mZnNldCA9IGluZGV4IC0gbHBfb2Zmc2V0OwotCi0JCWlmIChodF9vZmZzZXRfY3VyICE9IGh0X29mZnNldCkgewotCQkJZXJyb3IgPSBnZnMyX2Rpcl9yZWFkX2RhdGEoZGlwLCAoY2hhciAqKWxwLAotCQkJCQkJaHRfb2Zmc2V0ICogc2l6ZW9mKF9fYmU2NCksCi0JCQkJCQlzZHAtPnNkX2hhc2hfYnNpemUsIDEpOwotCQkJaWYgKGVycm9yICE9IHNkcC0+c2RfaGFzaF9ic2l6ZSkgewotCQkJCWlmIChlcnJvciA+PSAwKQotCQkJCQllcnJvciA9IC1FSU87Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlodF9vZmZzZXRfY3VyID0gaHRfb2Zmc2V0OwotCQl9Ci0KIAkJZXJyb3IgPSBnZnMyX2Rpcl9yZWFkX2xlYWYoaW5vZGUsIG9mZnNldCwgb3BhcXVlLCBmaWxsZGlyLAogCQkJCQkgICAmY29waWVkLCAmZGVwdGgsCi0JCQkJCSAgIGJlNjRfdG9fY3B1KGxwW2xwX29mZnNldF0pKTsKKwkJCQkJICAgYmU2NF90b19jcHUobHBbaW5kZXhdKSk7CiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwogCkBAIC0xNDEwLDggKzE0MzEsNiBAQAogCQlpbmRleCA9IChpbmRleCAmIH4obGVuIC0gMSkpICsgbGVuOwogCX0KIAotb3V0OgotCWtmcmVlKGxwKTsKIAlpZiAoZXJyb3IgPiAwKQogCQllcnJvciA9IDA7CiAJcmV0dXJuIGVycm9yOwpAQCAtMTkxNCw0MyArMTkzMywyMiBAQAogCiBpbnQgZ2ZzMl9kaXJfZXhoYXNoX2RlYWxsb2Moc3RydWN0IGdmczJfaW5vZGUgKmRpcCkKIHsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmRpcC0+aV9pbm9kZSk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgZ2ZzMl9sZWFmICpsZWFmOwogCXUzMiBoc2l6ZSwgbGVuOwotCXUzMiBodF9vZmZzZXQsIGxwX29mZnNldCwgaHRfb2Zmc2V0X2N1ciA9IC0xOwogCXUzMiBpbmRleCA9IDAsIG5leHRfaW5kZXg7CiAJX19iZTY0ICpscDsKIAl1NjQgbGVhZl9ubzsKIAlpbnQgZXJyb3IgPSAwLCBsYXN0OwogCiAJaHNpemUgPSAxIDw8IGRpcC0+aV9kZXB0aDsKLQlpZiAoaHNpemUgKiBzaXplb2YodTY0KSAhPSBpX3NpemVfcmVhZCgmZGlwLT5pX2lub2RlKSkgewotCQlnZnMyX2NvbnNpc3RfaW5vZGUoZGlwKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQogCi0JbHAgPSBrbWFsbG9jKHNkcC0+c2RfaGFzaF9ic2l6ZSwgR0ZQX05PRlMpOwotCWlmICghbHApCi0JCXJldHVybiAtRU5PTUVNOworCWxwID0gZ2ZzMl9kaXJfZ2V0X2hhc2hfdGFibGUoZGlwKTsKKwlpZiAoSVNfRVJSKGxwKSkKKwkJcmV0dXJuIFBUUl9FUlIobHApOwogCiAJd2hpbGUgKGluZGV4IDwgaHNpemUpIHsKLQkJbHBfb2Zmc2V0ID0gaW5kZXggJiAoc2RwLT5zZF9oYXNoX3B0cnMgLSAxKTsKLQkJaHRfb2Zmc2V0ID0gaW5kZXggLSBscF9vZmZzZXQ7Ci0KLQkJaWYgKGh0X29mZnNldF9jdXIgIT0gaHRfb2Zmc2V0KSB7Ci0JCQllcnJvciA9IGdmczJfZGlyX3JlYWRfZGF0YShkaXAsIChjaGFyICopbHAsCi0JCQkJCQlodF9vZmZzZXQgKiBzaXplb2YoX19iZTY0KSwKLQkJCQkJCXNkcC0+c2RfaGFzaF9ic2l6ZSwgMSk7Ci0JCQlpZiAoZXJyb3IgIT0gc2RwLT5zZF9oYXNoX2JzaXplKSB7Ci0JCQkJaWYgKGVycm9yID49IDApCi0JCQkJCWVycm9yID0gLUVJTzsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWh0X29mZnNldF9jdXIgPSBodF9vZmZzZXQ7Ci0JCX0KLQotCQlsZWFmX25vID0gYmU2NF90b19jcHUobHBbbHBfb2Zmc2V0XSk7CisJCWxlYWZfbm8gPSBiZTY0X3RvX2NwdShscFtpbmRleF0pOwogCQlpZiAobGVhZl9ubykgewogCQkJZXJyb3IgPSBnZXRfbGVhZihkaXAsIGxlYWZfbm8sICZiaCk7CiAJCQlpZiAoZXJyb3IpCkBAIC0xOTc2LDcgKzE5NzQsNiBAQAogCX0KIAogb3V0OgotCWtmcmVlKGxwKTsKIAogCXJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2dmczIvZGlyLmggYi9mcy9nZnMyL2Rpci5oCmluZGV4IGU2ODZhZjEuLmZmNTc3MmYgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZGlyLmgKKysrIGIvZnMvZ2ZzMi9kaXIuaApAQCAtMzUsNiArMzUsNyBAQAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBxc3RyICpmaWxlbmFtZSk7CiBleHRlcm4gaW50IGdmczJfZGlyX2dldF9uZXdfYnVmZmVyKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0IGJsb2NrLAogCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocCk7CitleHRlcm4gdm9pZCBnZnMyX2Rpcl9oYXNoX2ludmFsKHN0cnVjdCBnZnMyX2lub2RlICppcCk7CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGdmczJfZGlza19oYXNoKGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCiB7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2ZpbGUuYyBiL2ZzL2dmczIvZmlsZS5jCmluZGV4IGE5ZjVjYmUuLmVkZWI5ZTggMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZmlsZS5jCisrKyBiL2ZzL2dmczIvZmlsZS5jCkBAIC0xNzQsNyArMTc0LDkgQEAKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwogCXVuc2lnbmVkIGludCBmbGFncyA9IGlub2RlLT5pX2ZsYWdzOwogCi0JZmxhZ3MgJj0gfihTX1NZTkN8U19BUFBFTkR8U19JTU1VVEFCTEV8U19OT0FUSU1FfFNfRElSU1lOQyk7CisJZmxhZ3MgJj0gfihTX1NZTkN8U19BUFBFTkR8U19JTU1VVEFCTEV8U19OT0FUSU1FfFNfRElSU1lOQ3xTX05PU0VDKTsKKwlpZiAoKGlwLT5pX2VhdHRyID09IDApICYmICFpc19zeGlkKGlub2RlLT5pX21vZGUpKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PU0VDOwogCWlmIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9JTU1VVEFCTEUpCiAJCWZsYWdzIHw9IFNfSU1NVVRBQkxFOwogCWlmIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9BUFBFTkRPTkxZKQpAQCAtMjQzLDcgKzI0NSw3IEBACiAJICAgICFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKQogCQlnb3RvIG91dDsKIAlpZiAoIUlTX0lNTVVUQUJMRShpbm9kZSkpIHsKLQkJZXJyb3IgPSBnZnMyX3Blcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgMCk7CisJCWVycm9yID0gZ2ZzMl9wZXJtaXNzaW9uKGlub2RlLCBNQVlfV1JJVEUpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKIAl9CkBAIC01NDQsNyArNTQ2LDkgQEAKIAogLyoqCiAgKiBnZnMyX2ZzeW5jIC0gc3luYyB0aGUgZGlydHkgZGF0YSBmb3IgYSBmaWxlIChhY3Jvc3MgdGhlIGNsdXN0ZXIpCi0gKiBAZmlsZTogdGhlIGZpbGUgdGhhdCBwb2ludHMgdG8gdGhlIGRlbnRyeSAod2UgaWdub3JlIHRoaXMpCisgKiBAZmlsZTogdGhlIGZpbGUgdGhhdCBwb2ludHMgdG8gdGhlIGRlbnRyeQorICogQHN0YXJ0OiB0aGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gc3luYworICogQGVuZDogdGhlIGVuZCBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byBzeW5jCiAgKiBAZGF0YXN5bmM6IHNldCBpZiB3ZSBjYW4gaWdub3JlIHRpbWVzdGFtcCBjaGFuZ2VzCiAgKgogICogVGhlIFZGUyB3aWxsIGZsdXNoIGRhdGEgZm9yIHVzLiBXZSBvbmx5IG5lZWQgdG8gd29ycnkKQEAgLTU1MywyMyArNTU3LDMyIEBACiAgKiBSZXR1cm5zOiBlcnJubwogICovCiAKLXN0YXRpYyBpbnQgZ2ZzMl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQorc3RhdGljIGludCBnZnMyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCisJCSAgICAgIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCWludCBzeW5jX3N0YXRlID0gaW5vZGUtPmlfc3RhdGUgJiAoSV9ESVJUWV9TWU5DfElfRElSVFlfREFUQVNZTkMpOwogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CiAJaW50IHJldDsKIAorCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKIAlpZiAoZGF0YXN5bmMpCiAJCXN5bmNfc3RhdGUgJj0gfklfRElSVFlfU1lOQzsKIAogCWlmIChzeW5jX3N0YXRlKSB7CiAJCXJldCA9IHN5bmNfaW5vZGVfbWV0YWRhdGEoaW5vZGUsIDEpOwotCQlpZiAocmV0KQorCQlpZiAocmV0KSB7CisJCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAkJCXJldHVybiByZXQ7CisJCX0KIAkJZ2ZzMl9haWxfZmx1c2goaXAtPmlfZ2wpOwogCX0KIAorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb2NrLmMgYi9mcy9nZnMyL2dsb2NrLmMKaW5kZXggMjc5MmE3OS4uODhlOGEyMyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9jay5jCisrKyBiL2ZzL2dmczIvZ2xvY2suYwpAQCAtNDA5LDYgKzQwOSwxMCBAQAogCWlmIChoZWxkMSAmJiBoZWxkMiAmJiBsaXN0X2VtcHR5KCZnbC0+Z2xfaG9sZGVycykpCiAJCWNsZWFyX2JpdChHTEZfUVVFVUVELCAmZ2wtPmdsX2ZsYWdzKTsKIAorCWlmIChuZXdfc3RhdGUgIT0gZ2wtPmdsX3RhcmdldCkKKwkJLyogc2hvcnRlbiBvdXIgbWluaW11bSBob2xkIHRpbWUgKi8KKwkJZ2wtPmdsX2hvbGRfdGltZSA9IG1heChnbC0+Z2xfaG9sZF90aW1lIC0gR0xfR0xPQ0tfSE9MRF9ERUNSLAorCQkJCSAgICAgICBHTF9HTE9DS19NSU5fSE9MRCk7CiAJZ2wtPmdsX3N0YXRlID0gbmV3X3N0YXRlOwogCWdsLT5nbF90Y2hhbmdlID0gamlmZmllczsKIH0KQEAgLTY2MywyMCArNjY3LDMwIEBACiAJCWRyb3BfcmVmID0gMTsKIAl9CiAJc3Bpbl9sb2NrKCZnbC0+Z2xfc3Bpbik7Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChHTEZfUEVORElOR19ERU1PVEUsICZnbC0+Z2xfZmxhZ3MpICYmCisJaWYgKHRlc3RfYml0KEdMRl9QRU5ESU5HX0RFTU9URSwgJmdsLT5nbF9mbGFncykgJiYKIAkgICAgZ2wtPmdsX3N0YXRlICE9IExNX1NUX1VOTE9DS0VEICYmCiAJICAgIGdsLT5nbF9kZW1vdGVfc3RhdGUgIT0gTE1fU1RfRVhDTFVTSVZFKSB7CiAJCXVuc2lnbmVkIGxvbmcgaG9sZHRpbWUsIG5vdyA9IGppZmZpZXM7Ci0JCWhvbGR0aW1lID0gZ2wtPmdsX3RjaGFuZ2UgKyBnbC0+Z2xfb3BzLT5nb19taW5faG9sZF90aW1lOworCisJCWhvbGR0aW1lID0gZ2wtPmdsX3RjaGFuZ2UgKyBnbC0+Z2xfaG9sZF90aW1lOwogCQlpZiAodGltZV9iZWZvcmUobm93LCBob2xkdGltZSkpCiAJCQlkZWxheSA9IGhvbGR0aW1lIC0gbm93OwotCQlzZXRfYml0KGRlbGF5ID8gR0xGX1BFTkRJTkdfREVNT1RFIDogR0xGX0RFTU9URSwgJmdsLT5nbF9mbGFncyk7CisKKwkJaWYgKCFkZWxheSkgeworCQkJY2xlYXJfYml0KEdMRl9QRU5ESU5HX0RFTU9URSwgJmdsLT5nbF9mbGFncyk7CisJCQlzZXRfYml0KEdMRl9ERU1PVEUsICZnbC0+Z2xfZmxhZ3MpOworCQl9CiAJfQogCXJ1bl9xdWV1ZShnbCwgMCk7CiAJc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKLQlpZiAoIWRlbGF5IHx8Ci0JICAgIHF1ZXVlX2RlbGF5ZWRfd29yayhnbG9ja193b3JrcXVldWUsICZnbC0+Z2xfd29yaywgZGVsYXkpID09IDApCisJaWYgKCFkZWxheSkKIAkJZ2ZzMl9nbG9ja19wdXQoZ2wpOworCWVsc2UgeworCQlpZiAoZ2wtPmdsX25hbWUubG5fdHlwZSAhPSBMTV9UWVBFX0lOT0RFKQorCQkJZGVsYXkgPSAwOworCQlpZiAocXVldWVfZGVsYXllZF93b3JrKGdsb2NrX3dvcmtxdWV1ZSwgJmdsLT5nbF93b3JrLCBkZWxheSkgPT0gMCkKKwkJCWdmczJfZ2xvY2tfcHV0KGdsKTsKKwl9CiAJaWYgKGRyb3BfcmVmKQogCQlnZnMyX2dsb2NrX3B1dChnbCk7CiB9CkBAIC03MzgsNiArNzUyLDcgQEAKIAlnbC0+Z2xfdGNoYW5nZSA9IGppZmZpZXM7CiAJZ2wtPmdsX29iamVjdCA9IE5VTEw7CiAJZ2wtPmdsX3NiZCA9IHNkcDsKKwlnbC0+Z2xfaG9sZF90aW1lID0gR0xfR0xPQ0tfREZUX0hPTEQ7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmdsLT5nbF93b3JrLCBnbG9ja193b3JrX2Z1bmMpOwogCUlOSVRfV09SSygmZ2wtPmdsX2RlbGV0ZSwgZGVsZXRlX3dvcmtfZnVuYyk7CiAKQEAgLTg1MCw4ICs4NjUsMTUgQEAKIAogc3RhdGljIHZvaWQgd2FpdF9vbl9ob2xkZXIoc3RydWN0IGdmczJfaG9sZGVyICpnaCkKIHsKKwl1bnNpZ25lZCBsb25nIHRpbWUxID0gamlmZmllczsKKwogCW1pZ2h0X3NsZWVwKCk7CiAJd2FpdF9vbl9iaXQoJmdoLT5naF9pZmxhZ3MsIEhJRl9XQUlULCBnZnMyX2dsb2NrX2hvbGRlcl93YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZTEgKyBIWikpIC8qIGhhdmUgd2Ugd2FpdGVkID4gYSBzZWNvbmQ/ICovCisJCS8qIExlbmd0aGVuIHRoZSBtaW5pbXVtIGhvbGQgdGltZS4gKi8KKwkJZ2gtPmdoX2dsLT5nbF9ob2xkX3RpbWUgPSBtaW4oZ2gtPmdoX2dsLT5nbF9ob2xkX3RpbWUgKworCQkJCQkgICAgICBHTF9HTE9DS19IT0xEX0lOQ1IsCisJCQkJCSAgICAgIEdMX0dMT0NLX01BWF9IT0xEKTsKIH0KIAogc3RhdGljIHZvaWQgd2FpdF9vbl9kZW1vdGUoc3RydWN0IGdmczJfZ2xvY2sgKmdsKQpAQCAtMTA4OCw4ICsxMTEwLDkgQEAKIAogCWdmczJfZ2xvY2tfaG9sZChnbCk7CiAJaWYgKHRlc3RfYml0KEdMRl9QRU5ESU5HX0RFTU9URSwgJmdsLT5nbF9mbGFncykgJiYKLQkgICAgIXRlc3RfYml0KEdMRl9ERU1PVEUsICZnbC0+Z2xfZmxhZ3MpKQotCQlkZWxheSA9IGdsLT5nbF9vcHMtPmdvX21pbl9ob2xkX3RpbWU7CisJICAgICF0ZXN0X2JpdChHTEZfREVNT1RFLCAmZ2wtPmdsX2ZsYWdzKSAmJgorCSAgICBnbC0+Z2xfbmFtZS5sbl90eXBlID09IExNX1RZUEVfSU5PREUpCisJCWRlbGF5ID0gZ2wtPmdsX2hvbGRfdGltZTsKIAlpZiAocXVldWVfZGVsYXllZF93b3JrKGdsb2NrX3dvcmtxdWV1ZSwgJmdsLT5nbF93b3JrLCBkZWxheSkgPT0gMCkKIAkJZ2ZzMl9nbG9ja19wdXQoZ2wpOwogfQpAQCAtMTI2OCwxMiArMTI5MSwxMyBAQAogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAogCWdmczJfZ2xvY2tfaG9sZChnbCk7Ci0JaG9sZHRpbWUgPSBnbC0+Z2xfdGNoYW5nZSArIGdsLT5nbF9vcHMtPmdvX21pbl9ob2xkX3RpbWU7Ci0JaWYgKHRlc3RfYml0KEdMRl9RVUVVRUQsICZnbC0+Z2xfZmxhZ3MpKSB7CisJaG9sZHRpbWUgPSBnbC0+Z2xfdGNoYW5nZSArIGdsLT5nbF9ob2xkX3RpbWU7CisJaWYgKHRlc3RfYml0KEdMRl9RVUVVRUQsICZnbC0+Z2xfZmxhZ3MpICYmCisJICAgIGdsLT5nbF9uYW1lLmxuX3R5cGUgPT0gTE1fVFlQRV9JTk9ERSkgewogCQlpZiAodGltZV9iZWZvcmUobm93LCBob2xkdGltZSkpCiAJCQlkZWxheSA9IGhvbGR0aW1lIC0gbm93OwogCQlpZiAodGVzdF9iaXQoR0xGX1JFUExZX1BFTkRJTkcsICZnbC0+Z2xfZmxhZ3MpKQotCQkJZGVsYXkgPSBnbC0+Z2xfb3BzLT5nb19taW5faG9sZF90aW1lOworCQkJZGVsYXkgPSBnbC0+Z2xfaG9sZF90aW1lOwogCX0KIAogCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOwpAQCAtMTY2Miw3ICsxNjg2LDcgQEAKIAlkdGltZSAqPSAxMDAwMDAwL0haOyAvKiBkZW1vdGUgdGltZSBpbiB1U2VjICovCiAJaWYgKCF0ZXN0X2JpdChHTEZfREVNT1RFLCAmZ2wtPmdsX2ZsYWdzKSkKIAkJZHRpbWUgPSAwOwotCWdmczJfcHJpbnRfZGJnKHNlcSwgIkc6ICBzOiVzIG46JXUvJWxseCBmOiVzIHQ6JXMgZDolcy8lbGx1IGE6JWQgdjolZCByOiVkXG4iLAorCWdmczJfcHJpbnRfZGJnKHNlcSwgIkc6ICBzOiVzIG46JXUvJWxseCBmOiVzIHQ6JXMgZDolcy8lbGx1IGE6JWQgdjolZCByOiVkIG06JWxkXG4iLAogCQkgIHN0YXRlMnN0cihnbC0+Z2xfc3RhdGUpLAogCQkgIGdsLT5nbF9uYW1lLmxuX3R5cGUsCiAJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylnbC0+Z2xfbmFtZS5sbl9udW1iZXIsCkBAIC0xNjcxLDcgKzE2OTUsNyBAQAogCQkgIHN0YXRlMnN0cihnbC0+Z2xfZGVtb3RlX3N0YXRlKSwgZHRpbWUsCiAJCSAgYXRvbWljX3JlYWQoJmdsLT5nbF9haWxfY291bnQpLAogCQkgIGF0b21pY19yZWFkKCZnbC0+Z2xfcmV2b2tlcyksCi0JCSAgYXRvbWljX3JlYWQoJmdsLT5nbF9yZWYpKTsKKwkJICBhdG9taWNfcmVhZCgmZ2wtPmdsX3JlZiksIGdsLT5nbF9ob2xkX3RpbWUpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShnaCwgJmdsLT5nbF9ob2xkZXJzLCBnaF9saXN0KSB7CiAJCWVycm9yID0gZHVtcF9ob2xkZXIoc2VxLCBnaCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb2NrLmggYi9mcy9nZnMyL2dsb2NrLmgKaW5kZXggNmIyZjc1Ny4uNjY3MDcxMSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9jay5oCisrKyBiL2ZzL2dmczIvZ2xvY2suaApAQCAtMTEzLDYgKzExMywxMiBAQAogCiAjZGVmaW5lIEdMUl9UUllGQUlMRUQJCTEzCiAKKyNkZWZpbmUgR0xfR0xPQ0tfTUFYX0hPTEQgICAgICAgIChsb25nKShIWiAvIDUpCisjZGVmaW5lIEdMX0dMT0NLX0RGVF9IT0xEICAgICAgICAobG9uZykoSFogLyA1KQorI2RlZmluZSBHTF9HTE9DS19NSU5fSE9MRCAgICAgICAgKGxvbmcpKDEwKQorI2RlZmluZSBHTF9HTE9DS19IT0xEX0lOQ1IgICAgICAgKGxvbmcpKEhaIC8gMjApCisjZGVmaW5lIEdMX0dMT0NLX0hPTERfREVDUiAgICAgICAobG9uZykoSFogLyA0MCkKKwogc3RydWN0IGxtX2xvY2tvcHMgewogCWNvbnN0IGNoYXIgKmxtX3Byb3RvX25hbWU7CiAJaW50ICgqbG1fbW91bnQpIChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgY29uc3QgY2hhciAqZnNuYW1lKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvcHMuYyBiL2ZzL2dmczIvZ2xvcHMuYwppbmRleCA4ZWY3MGY0Li5kYTIxZWNhIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb3BzLmMKKysrIGIvZnMvZ2ZzMi9nbG9wcy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAicmdycC5oIgogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJ0cmFucy5oIgorI2luY2x1ZGUgImRpci5oIgogCiAvKioKICAqIF9fZ2ZzMl9haWxfZmx1c2ggLSByZW1vdmUgYWxsIGJ1ZmZlcnMgZm9yIGEgZ2l2ZW4gbG9jayBmcm9tIHRoZSBBSUwKQEAgLTQ3LDEwICs0OCwxMCBAQAogCQkJCWJkX2FpbF9nbF9saXN0KTsKIAkJYmggPSBiZC0+YmRfYmg7CiAJCWdmczJfcmVtb3ZlX2Zyb21fYWlsKGJkKTsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfYWlsX2xvY2spOwotCiAJCWJkLT5iZF9iaCA9IE5VTEw7CiAJCWJoLT5iX3ByaXZhdGUgPSBOVUxMOworCQlzcGluX3VubG9jaygmc2RwLT5zZF9haWxfbG9jayk7CisKIAkJYmQtPmJkX2Jsa25vID0gYmgtPmJfYmxvY2tucjsKIAkJZ2ZzMl9sb2dfbG9jayhzZHApOwogCQlnZnMyX2Fzc2VydF93aXRoZHJhdyhzZHAsICFidWZmZXJfYnVzeShiaCkpOwpAQCAtMjE4LDExICsyMTksMTQgQEAKIAkJaWYgKGlwKSB7CiAJCQlzZXRfYml0KEdJRl9JTlZBTElELCAmaXAtPmlfZmxhZ3MpOwogCQkJZm9yZ2V0X2FsbF9jYWNoZWRfYWNscygmaXAtPmlfaW5vZGUpOworCQkJZ2ZzMl9kaXJfaGFzaF9pbnZhbChpcCk7CiAJCX0KIAl9CiAKLQlpZiAoaXAgPT0gR0ZTMl9JKGdsLT5nbF9zYmQtPnNkX3JpbmRleCkpCisJaWYgKGlwID09IEdGUzJfSShnbC0+Z2xfc2JkLT5zZF9yaW5kZXgpKSB7CisJCWdmczJfbG9nX2ZsdXNoKGdsLT5nbF9zYmQsIE5VTEwpOwogCQlnbC0+Z2xfc2JkLT5zZF9yaW5kZXhfdXB0b2RhdGUgPSAwOworCX0KIAlpZiAoaXAgJiYgU19JU1JFRyhpcC0+aV9pbm9kZS5pX21vZGUpKQogCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpcC0+aV9pbm9kZS5pX21hcHBpbmcsIDApOwogfQpAQCAtMzE0LDYgKzMxOCw4IEBACiAJaXAtPmlfZ2VuZXJhdGlvbiA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfZ2VuZXJhdGlvbik7CiAKIAlpcC0+aV9kaXNrZmxhZ3MgPSBiZTMyX3RvX2NwdShzdHItPmRpX2ZsYWdzKTsKKwlpcC0+aV9lYXR0ciA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfZWF0dHIpOworCS8qIGlfZGlza2ZsYWdzIGFuZCBpX2VhdHRyIG11c3QgYmUgc2V0IGJlZm9yZSBnZnMyX3NldF9pbm9kZV9mbGFncygpICovCiAJZ2ZzMl9zZXRfaW5vZGVfZmxhZ3MoJmlwLT5pX2lub2RlKTsKIAloZWlnaHQgPSBiZTE2X3RvX2NwdShzdHItPmRpX2hlaWdodCk7CiAJaWYgKHVubGlrZWx5KGhlaWdodCA+IEdGUzJfTUFYX01FVEFfSEVJR0hUKSkKQEAgLTMyNiw3ICszMzIsNiBAQAogCWlwLT5pX2RlcHRoID0gKHU4KWRlcHRoOwogCWlwLT5pX2VudHJpZXMgPSBiZTMyX3RvX2NwdShzdHItPmRpX2VudHJpZXMpOwogCi0JaXAtPmlfZWF0dHIgPSBiZTY0X3RvX2NwdShzdHItPmRpX2VhdHRyKTsKIAlpZiAoU19JU1JFRyhpcC0+aV9pbm9kZS5pX21vZGUpKQogCQlnZnMyX3NldF9hb3BzKCZpcC0+aV9pbm9kZSk7CiAKQEAgLTU0Nyw3ICs1NTIsNiBAQAogCS5nb19sb2NrID0gaW5vZGVfZ29fbG9jaywKIAkuZ29fZHVtcCA9IGlub2RlX2dvX2R1bXAsCiAJLmdvX3R5cGUgPSBMTV9UWVBFX0lOT0RFLAotCS5nb19taW5faG9sZF90aW1lID0gSFogLyA1LAogCS5nb19mbGFncyA9IEdMT0ZfQVNQQUNFLAogfTsKIApAQCAtNTU4LDcgKzU2Miw2IEBACiAJLmdvX3VubG9jayA9IHJncnBfZ29fdW5sb2NrLAogCS5nb19kdW1wID0gZ2ZzMl9yZ3JwX2R1bXAsCiAJLmdvX3R5cGUgPSBMTV9UWVBFX1JHUlAsCi0JLmdvX21pbl9ob2xkX3RpbWUgPSBIWiAvIDUsCiAJLmdvX2ZsYWdzID0gR0xPRl9BU1BBQ0UsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2luY29yZS5oIGIvZnMvZ2ZzMi9pbmNvcmUuaAppbmRleCAwYTA2NGU5Li44OTJhYzM3IDEwMDY0NAotLS0gYS9mcy9nZnMyL2luY29yZS5oCisrKyBiL2ZzL2dmczIvaW5jb3JlLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdF9ibC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KIAogI2RlZmluZSBESU9fV0FJVAkweDAwMDAwMDEwCiAjZGVmaW5lIERJT19NRVRBREFUQQkweDAwMDAwMDIwCkBAIC0xNjIsNyArMTYzLDYgQEAKIAlpbnQgKCpnb19kdW1wKShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgY29uc3Qgc3RydWN0IGdmczJfZ2xvY2sgKmdsKTsKIAl2b2lkICgqZ29fY2FsbGJhY2spIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpOwogCWNvbnN0IGludCBnb190eXBlOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgZ29fbWluX2hvbGRfdGltZTsKIAljb25zdCB1bnNpZ25lZCBsb25nIGdvX2ZsYWdzOwogI2RlZmluZSBHTE9GX0FTUEFDRSAxCiB9OwpAQCAtMjIwLDYgKzIyMCw3IEBACiAKIAl1bnNpZ25lZCBpbnQgZ2xfaGFzaDsKIAl1bnNpZ25lZCBsb25nIGdsX2RlbW90ZV90aW1lOyAvKiB0aW1lIG9mIGZpcnN0IGRlbW90ZSByZXF1ZXN0ICovCisJbG9uZyBnbF9ob2xkX3RpbWU7CiAJc3RydWN0IGxpc3RfaGVhZCBnbF9ob2xkZXJzOwogCiAJY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyAqZ2xfb3BzOwpAQCAtMjg0LDYgKzI4NSw3IEBACiAJdTY0IGlfZ29hbDsJLyogZ29hbCBibG9jayBmb3IgYWxsb2NhdGlvbnMgKi8KIAlzdHJ1Y3Qgcndfc2VtYXBob3JlIGlfcndfbXV0ZXg7CiAJc3RydWN0IGxpc3RfaGVhZCBpX3RydW5jX2xpc3Q7CisJX19iZTY0ICppX2hhc2hfY2FjaGU7CiAJdTMyIGlfZW50cmllczsKIAl1MzIgaV9kaXNrZmxhZ3M7CiAJdTggaV9oZWlnaHQ7CkBAIC01NDYsNiArNTQ4LDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9nbG9jayAqc2RfdHJhbnNfZ2w7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgc2RfZ2xvY2tfd2FpdDsKIAlhdG9taWNfdCBzZF9nbG9ja19kaXNwb3NhbDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBzZF9sb2NraW5nX2luaXQ7CiAKIAkvKiBJbm9kZSBTdHVmZiAqLwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2lub2RlLmMgYi9mcy9nZnMyL2lub2RlLmMKaW5kZXggMDNlMGM1Mi4uOTAwY2Y5OCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9pbm9kZS5jCisrKyBiL2ZzL2dmczIvaW5vZGUuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJfQogCiAJaWYgKCFpc19yb290KSB7Ci0JCWVycm9yID0gZ2ZzMl9wZXJtaXNzaW9uKGRpciwgTUFZX0VYRUMsIDApOworCQllcnJvciA9IGdmczJfcGVybWlzc2lvbihkaXIsIE1BWV9FWEVDKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtMzM3LDcgKzMzNyw3IEBACiB7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBnZnMyX3Blcm1pc3Npb24oJmRpcC0+aV9pbm9kZSwgTUFZX1dSSVRFIHwgTUFZX0VYRUMsIDApOworCWVycm9yID0gZ2ZzMl9wZXJtaXNzaW9uKCZkaXAtPmlfaW5vZGUsIE1BWV9XUklURSB8IE1BWV9FWEVDKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIApAQCAtNzkyLDEzICs3OTIsOCBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmdmczJfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKLQotCWlub2RlID0gZ2ZzMl9sb29rdXBpKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAwKTsKLQlpZiAoaW5vZGUgJiYgSVNfRVJSKGlub2RlKSkKLQkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKLQotCWlmIChpbm9kZSkgeworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBnZnMyX2xvb2t1cGkoZGlyLCAmZGVudHJ5LT5kX25hbWUsIDApOworCWlmIChpbm9kZSAmJiAhSVNfRVJSKGlub2RlKSkgewogCQlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wgPSBHRlMyX0koaW5vZGUpLT5pX2dsOwogCQlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CiAJCWludCBlcnJvcjsKQEAgLTgwOCwxMSArODAzLDggQEAKIAkJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIAkJfQogCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmZ2gpOwotCQlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiAJfQotCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwotCi0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwogfQogCiAvKioKQEAgLTg1Nyw3ICs4NDksNyBAQAogCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKQogCQlnb3RvIG91dF9ndW5sb2NrOwogCi0JZXJyb3IgPSBnZnMyX3Blcm1pc3Npb24oZGlyLCBNQVlfV1JJVEUgfCBNQVlfRVhFQywgMCk7CisJZXJyb3IgPSBnZnMyX3Blcm1pc3Npb24oZGlyLCBNQVlfV1JJVEUgfCBNQVlfRVhFQyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9ndW5sb2NrOwogCkBAIC05OTAsNyArOTgyLDcgQEAKIAlpZiAoSVNfQVBQRU5EKCZkaXAtPmlfaW5vZGUpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JZXJyb3IgPSBnZnMyX3Blcm1pc3Npb24oJmRpcC0+aV9pbm9kZSwgTUFZX1dSSVRFIHwgTUFZX0VYRUMsIDApOworCWVycm9yID0gZ2ZzMl9wZXJtaXNzaW9uKCZkaXAtPmlfaW5vZGUsIE1BWV9XUklURSB8IE1BWV9FWEVDKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIApAQCAtMTMzNiw3ICsxMzI4LDcgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCWVycm9yID0gZ2ZzMl9wZXJtaXNzaW9uKG5kaXIsIE1BWV9XUklURSB8IE1BWV9FWEVDLCAwKTsKKwkJZXJyb3IgPSBnZnMyX3Blcm1pc3Npb24obmRpciwgTUFZX1dSSVRFIHwgTUFZX0VYRUMpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9ndW5sb2NrOwogCkBAIC0xMzcxLDcgKzEzNjMsNyBAQAogCS8qIENoZWNrIG91dCB0aGUgZGlyIHRvIGJlIHJlbmFtZWQgKi8KIAogCWlmIChkaXJfcmVuYW1lKSB7Ci0JCWVycm9yID0gZ2ZzMl9wZXJtaXNzaW9uKG9kZW50cnktPmRfaW5vZGUsIE1BWV9XUklURSwgMCk7CisJCWVycm9yID0gZ2ZzMl9wZXJtaXNzaW9uKG9kZW50cnktPmRfaW5vZGUsIE1BWV9XUklURSk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2d1bmxvY2s7CiAJfQpAQCAtMTU0Myw3ICsxNTM1LDcgQEAKICAqIFJldHVybnM6IGVycm5vCiAgKi8KIAotaW50IGdmczJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQoraW50IGdmczJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXA7CiAJc3RydWN0IGdmczJfaG9sZGVyIGlfZ2g7CkBAIC0xNTUzLDcgKzE1NDUsNyBAQAogCiAJaXAgPSBHRlMyX0koaW5vZGUpOwogCWlmIChnZnMyX2dsb2NrX2lzX2xvY2tlZF9ieV9tZShpcC0+aV9nbCkgPT0gTlVMTCkgewotCQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKKwkJaWYgKG1hc2sgJiBNQVlfTk9UX0JMT0NLKQogCQkJcmV0dXJuIC1FQ0hJTEQ7CiAJCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIExNX0ZMQUdfQU5ZLCAmaV9naCk7CiAJCWlmIChlcnJvcikKQEAgLTE1NjQsNyArMTU1Niw3IEBACiAJaWYgKChtYXNrICYgTUFZX1dSSVRFKSAmJiBJU19JTU1VVEFCTEUoaW5vZGUpKQogCQllcnJvciA9IC1FQUNDRVM7CiAJZWxzZQotCQllcnJvciA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgZmxhZ3MsIGdmczJfY2hlY2tfYWNsKTsKKwkJZXJyb3IgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2spOwogCWlmICh1bmxvY2spCiAJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZpX2doKTsKIApAQCAtMTg1NCw2ICsxODQ2LDcgQEAKIAkubGlzdHhhdHRyID0gZ2ZzMl9saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyID0gZ2ZzMl9yZW1vdmV4YXR0ciwKIAkuZmllbWFwID0gZ2ZzMl9maWVtYXAsCisJLmdldF9hY2wgPSBnZnMyX2dldF9hY2wsCiB9OwogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBnZnMyX2Rpcl9pb3BzID0gewpAQCAtMTg3NCw2ICsxODY3LDcgQEAKIAkubGlzdHhhdHRyID0gZ2ZzMl9saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyID0gZ2ZzMl9yZW1vdmV4YXR0ciwKIAkuZmllbWFwID0gZ2ZzMl9maWVtYXAsCisJLmdldF9hY2wgPSBnZnMyX2dldF9hY2wsCiB9OwogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBnZnMyX3N5bWxpbmtfaW9wcyA9IHsKQEAgLTE4ODgsNSArMTg4Miw2IEBACiAJLmxpc3R4YXR0ciA9IGdmczJfbGlzdHhhdHRyLAogCS5yZW1vdmV4YXR0ciA9IGdmczJfcmVtb3ZleGF0dHIsCiAJLmZpZW1hcCA9IGdmczJfZmllbWFwLAorCS5nZXRfYWNsID0gZ2ZzMl9nZXRfYWNsLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbm9kZS5oIGIvZnMvZ2ZzMi9pbm9kZS5oCmluZGV4IDMxNjA2MDcuLjhkOTBlMGMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5vZGUuaAorKysgYi9mcy9nZnMyL2lub2RlLmgKQEAgLTEwOCw3ICsxMDgsNyBAQAogCiBleHRlcm4gc3RydWN0IGlub2RlICpnZnMyX2xvb2t1cGkoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLAogCQkJCSAgaW50IGlzX3Jvb3QpOwotZXh0ZXJuIGludCBnZnMyX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncyk7CitleHRlcm4gaW50IGdmczJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiBleHRlcm4gaW50IGdmczJfc2V0YXR0cl9zaW1wbGUoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwogZXh0ZXJuIHN0cnVjdCBpbm9kZSAqZ2ZzMl9sb29rdXBfc2ltcGxlKHN0cnVjdCBpbm9kZSAqZGlwLCBjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiB2b2lkIGdmczJfZGlub2RlX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHZvaWQgKmJ1Zik7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvZy5jIGIvZnMvZ2ZzMi9sb2cuYwppbmRleCA5MDMxMTVmLi44NWM2MjkyIDEwMDY0NAotLS0gYS9mcy9nZnMyL2xvZy5jCisrKyBiL2ZzL2dmczIvbG9nLmMKQEAgLTkwMyw2ICs5MDMsNyBAQAogCQlpZiAoZ2ZzMl9haWwxX2VtcHR5KHNkcCkpCiAJCQlicmVhazsKIAl9CisJZ2ZzMl9sb2dfZmx1c2goc2RwLCBOVUxMKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZ2ZzMl9qcm5sX2ZsdXNoX3JlcWQoc3RydWN0IGdmczJfc2JkICpzZHApCmRpZmYgLS1naXQgYS9mcy9nZnMyL21haW4uYyBiL2ZzL2dmczIvbWFpbi5jCmluZGV4IGMyYjM0Y2QuLjI5ZTFhY2UgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbWFpbi5jCisrKyBiL2ZzL2dmczIvbWFpbi5jCkBAIC00MSw2ICs0MSw3IEBACiAJaW5pdF9yd3NlbSgmaXAtPmlfcndfbXV0ZXgpOwogCUlOSVRfTElTVF9IRUFEKCZpcC0+aV90cnVuY19saXN0KTsKIAlpcC0+aV9hbGxvYyA9IE5VTEw7CisJaXAtPmlfaGFzaF9jYWNoZSA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIGdmczJfaW5pdF9nbG9ja19vbmNlKHZvaWQgKmZvbykKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggOGFjOWFlMS4uNTE2NTE2ZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTcyLDYgKzcyLDcgQEAKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkcC0+c2RfZ2xvY2tfd2FpdCk7CiAJYXRvbWljX3NldCgmc2RwLT5zZF9nbG9ja19kaXNwb3NhbCwgMCk7CisJaW5pdF9jb21wbGV0aW9uKCZzZHAtPnNkX2xvY2tpbmdfaW5pdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnNkcC0+c2Rfc3RhdGZzX3NwaW4pOwogCiAJc3Bpbl9sb2NrX2luaXQoJnNkcC0+c2RfcmluZGV4X3NwaW4pOwpAQCAtMTAxNywxMSArMTAxOCwxMyBAQAogCQlmc25hbWUrKzsKIAlpZiAobG0tPmxtX21vdW50ID09IE5VTEwpIHsKIAkJZnNfaW5mbyhzZHAsICJOb3cgbW91bnRpbmcgRlMuLi5cbiIpOworCQljb21wbGV0ZSgmc2RwLT5zZF9sb2NraW5nX2luaXQpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0ID0gbG0tPmxtX21vdW50KHNkcCwgZnNuYW1lKTsKIAlpZiAocmV0ID09IDApCiAJCWZzX2luZm8oc2RwLCAiSm9pbmVkIGNsdXN0ZXIuIE5vdyBtb3VudGluZyBGUy4uLlxuIik7CisJY29tcGxldGUoJnNkcC0+c2RfbG9ja2luZ19pbml0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDkxLDYgKzEwOTQsNyBAQAogCWlmIChzZHAtPnNkX2FyZ3MuYXJfbm9iYXJyaWVyKQogCQlzZXRfYml0KFNERl9OT0JBUlJJRVJTLCAmc2RwLT5zZF9mbGFncyk7CiAKKwlzYi0+c19mbGFncyB8PSBNU19OT1NFQzsKIAlzYi0+c19tYWdpYyA9IEdGUzJfTUFHSUM7CiAJc2ItPnNfb3AgPSAmZ2ZzMl9zdXBlcl9vcHM7CiAJc2ItPnNfZF9vcCA9ICZnZnMyX2RvcHM7CmRpZmYgLS1naXQgYS9mcy9nZnMyL3JncnAuYyBiL2ZzL2dmczIvcmdycC5jCmluZGV4IDliNzgwZGYuLjdmOGFmMWUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcmdycC5jCisrKyBiL2ZzL2dmczIvcmdycC5jCkBAIC0xNjA3LDE0ICsxNjA3LDE1IEBACiB9CiAKIC8qKgotICogZ2ZzMl9mcmVlX2RhdGEgLSBmcmVlIGEgY29udGlndW91cyBydW4gb2YgZGF0YSBibG9jayhzKQorICogX19nZnMyX2ZyZWVfYmxvY2tzIC0gZnJlZSBhIGNvbnRpZ3VvdXMgcnVuIG9mIGJsb2NrKHMpCiAgKiBAaXA6IHRoZSBpbm9kZSB0aGVzZSBibG9ja3MgYXJlIGJlaW5nIGZyZWVkIGZyb20KICAqIEBic3RhcnQ6IGZpcnN0IGJsb2NrIG9mIGEgcnVuIG9mIGNvbnRpZ3VvdXMgYmxvY2tzCiAgKiBAYmxlbjogdGhlIGxlbmd0aCBvZiB0aGUgYmxvY2sgcnVuCisgKiBAbWV0YTogMSBpZiB0aGUgYmxvY2tzIHJlcHJlc2VudCBtZXRhZGF0YQogICoKICAqLwogCi12b2lkIF9fZ2ZzMl9mcmVlX2RhdGEoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1NjQgYnN0YXJ0LCB1MzIgYmxlbikKK3ZvaWQgX19nZnMyX2ZyZWVfYmxvY2tzKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0IGJzdGFydCwgdTMyIGJsZW4sIGludCBtZXRhKQogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7CkBAIC0xNjMxLDU0ICsxNjMyLDExIEBACiAJZ2ZzMl90cmFuc19hZGRfcmcocmdkKTsKIAogCS8qIERpcmVjdG9yaWVzIGtlZXAgdGhlaXIgZGF0YSBpbiB0aGUgbWV0YWRhdGEgYWRkcmVzcyBzcGFjZSAqLwotCWlmIChpcC0+aV9kZXB0aCkKKwlpZiAobWV0YSB8fCBpcC0+aV9kZXB0aCkKIAkJZ2ZzMl9tZXRhX3dpcGUoaXAsIGJzdGFydCwgYmxlbik7CiB9CiAKIC8qKgotICogZ2ZzMl9mcmVlX2RhdGEgLSBmcmVlIGEgY29udGlndW91cyBydW4gb2YgZGF0YSBibG9jayhzKQotICogQGlwOiB0aGUgaW5vZGUgdGhlc2UgYmxvY2tzIGFyZSBiZWluZyBmcmVlZCBmcm9tCi0gKiBAYnN0YXJ0OiBmaXJzdCBibG9jayBvZiBhIHJ1biBvZiBjb250aWd1b3VzIGJsb2NrcwotICogQGJsZW46IHRoZSBsZW5ndGggb2YgdGhlIGJsb2NrIHJ1bgotICoKLSAqLwotCi12b2lkIGdmczJfZnJlZV9kYXRhKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0IGJzdGFydCwgdTMyIGJsZW4pCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7Ci0KLQlfX2dmczJfZnJlZV9kYXRhKGlwLCBic3RhcnQsIGJsZW4pOwotCWdmczJfc3RhdGZzX2NoYW5nZShzZHAsIDAsICtibGVuLCAwKTsKLQlnZnMyX3F1b3RhX2NoYW5nZShpcCwgLShzNjQpYmxlbiwgaXAtPmlfaW5vZGUuaV91aWQsIGlwLT5pX2lub2RlLmlfZ2lkKTsKLX0KLQotLyoqCi0gKiBnZnMyX2ZyZWVfbWV0YSAtIGZyZWUgYSBjb250aWd1b3VzIHJ1biBvZiBkYXRhIGJsb2NrKHMpCi0gKiBAaXA6IHRoZSBpbm9kZSB0aGVzZSBibG9ja3MgYXJlIGJlaW5nIGZyZWVkIGZyb20KLSAqIEBic3RhcnQ6IGZpcnN0IGJsb2NrIG9mIGEgcnVuIG9mIGNvbnRpZ3VvdXMgYmxvY2tzCi0gKiBAYmxlbjogdGhlIGxlbmd0aCBvZiB0aGUgYmxvY2sgcnVuCi0gKgotICovCi0KLXZvaWQgX19nZnMyX2ZyZWVfbWV0YShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCBic3RhcnQsIHUzMiBibGVuKQotewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7Ci0KLQlyZ2QgPSByZ2Jsa19mcmVlKHNkcCwgYnN0YXJ0LCBibGVuLCBHRlMyX0JMS1NUX0ZSRUUpOwotCWlmICghcmdkKQotCQlyZXR1cm47Ci0JdHJhY2VfZ2ZzMl9ibG9ja19hbGxvYyhpcCwgYnN0YXJ0LCBibGVuLCBHRlMyX0JMS1NUX0ZSRUUpOwotCXJnZC0+cmRfZnJlZSArPSBibGVuOwotCi0JZ2ZzMl90cmFuc19hZGRfYmgocmdkLT5yZF9nbCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLCAxKTsKLQlnZnMyX3JncnBfb3V0KHJnZCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLT5iX2RhdGEpOwotCi0JZ2ZzMl90cmFuc19hZGRfcmcocmdkKTsKLQlnZnMyX21ldGFfd2lwZShpcCwgYnN0YXJ0LCBibGVuKTsKLX0KLQotLyoqCiAgKiBnZnMyX2ZyZWVfbWV0YSAtIGZyZWUgYSBjb250aWd1b3VzIHJ1biBvZiBkYXRhIGJsb2NrKHMpCiAgKiBAaXA6IHRoZSBpbm9kZSB0aGVzZSBibG9ja3MgYXJlIGJlaW5nIGZyZWVkIGZyb20KICAqIEBic3RhcnQ6IGZpcnN0IGJsb2NrIG9mIGEgcnVuIG9mIGNvbnRpZ3VvdXMgYmxvY2tzCkBAIC0xNjkwLDcgKzE2NDgsNyBAQAogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCi0JX19nZnMyX2ZyZWVfbWV0YShpcCwgYnN0YXJ0LCBibGVuKTsKKwlfX2dmczJfZnJlZV9ibG9ja3MoaXAsIGJzdGFydCwgYmxlbiwgMSk7CiAJZ2ZzMl9zdGF0ZnNfY2hhbmdlKHNkcCwgMCwgK2JsZW4sIDApOwogCWdmczJfcXVvdGFfY2hhbmdlKGlwLCAtKHM2NClibGVuLCBpcC0+aV9pbm9kZS5pX3VpZCwgaXAtPmlfaW5vZGUuaV9naWQpOwogfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9yZ3JwLmggYi9mcy9nZnMyL3JncnAuaAppbmRleCBhODBlMzAzLi5kMjUzZjlhIDEwMDY0NAotLS0gYS9mcy9nZnMyL3JncnAuaAorKysgYi9mcy9nZnMyL3JncnAuaApAQCAtNTIsOSArNTIsNyBAQAogZXh0ZXJuIGludCBnZnMyX2FsbG9jX2Jsb2NrKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0ICpibiwgdW5zaWduZWQgaW50ICpuKTsKIGV4dGVybiBpbnQgZ2ZzMl9hbGxvY19kaShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCAqYm4sIHU2NCAqZ2VuZXJhdGlvbik7CiAKLWV4dGVybiB2b2lkIF9fZ2ZzMl9mcmVlX2RhdGEoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1NjQgYnN0YXJ0LCB1MzIgYmxlbik7Ci1leHRlcm4gdm9pZCBnZnMyX2ZyZWVfZGF0YShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCBic3RhcnQsIHUzMiBibGVuKTsKLWV4dGVybiB2b2lkIF9fZ2ZzMl9mcmVlX21ldGEoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1NjQgYnN0YXJ0LCB1MzIgYmxlbik7CitleHRlcm4gdm9pZCBfX2dmczJfZnJlZV9ibG9ja3Moc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1NjQgYnN0YXJ0LCB1MzIgYmxlbiwgaW50IG1ldGEpOwogZXh0ZXJuIHZvaWQgZ2ZzMl9mcmVlX21ldGEoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1NjQgYnN0YXJ0LCB1MzIgYmxlbik7CiBleHRlcm4gdm9pZCBnZnMyX2ZyZWVfZGkoc3RydWN0IGdmczJfcmdycGQgKnJnZCwgc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKIGV4dGVybiB2b2lkIGdmczJfdW5saW5rX2RpKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9zdXBlci5jIGIvZnMvZ2ZzMi9zdXBlci5jCmluZGV4IGVkNTQwZTcuLmI3YmVhZGQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvc3VwZXIuYworKysgYi9mcy9nZnMyL3N1cGVyLmMKQEAgLTc1NywxMyArNzU3LDE3IEBACiAJc3RydWN0IHRpbWVzcGVjIGF0aW1lOwogCXN0cnVjdCBnZnMyX2Rpbm9kZSAqZGk7CiAJaW50IHJldCA9IC1FQUdBSU47CisJaW50IHVubG9ja19yZXF1aXJlZCA9IDA7CiAKIAkvKiBTa2lwIHRpbWVzdGFtcCB1cGRhdGUsIGlmIHRoaXMgaXMgZnJvbSBhIG1lbWFsbG9jICovCiAJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpCiAJCWdvdG8gZG9fZmx1c2g7Ci0JcmV0ID0gZ2ZzMl9nbG9ja19ucV9pbml0KGlwLT5pX2dsLCBMTV9TVF9FWENMVVNJVkUsIDAsICZnaCk7Ci0JaWYgKHJldCkKLQkJZ290byBkb19mbHVzaDsKKwlpZiAoIWdmczJfZ2xvY2tfaXNfbG9ja2VkX2J5X21lKGlwLT5pX2dsKSkgeworCQlyZXQgPSBnZnMyX2dsb2NrX25xX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgJmdoKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZG9fZmx1c2g7CisJCXVubG9ja19yZXF1aXJlZCA9IDE7CisJfQogCXJldCA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCBSRVNfRElOT0RFLCAwKTsKIAlpZiAocmV0KQogCQlnb3RvIGRvX3VubG9jazsKQEAgLTc4MCw3ICs3ODQsOCBAQAogCX0KIAlnZnMyX3RyYW5zX2VuZChzZHApOwogZG9fdW5sb2NrOgotCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZnaCk7CisJaWYgKHVubG9ja19yZXF1aXJlZCkKKwkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmdoKTsKIGRvX2ZsdXNoOgogCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkKIAkJZ2ZzMl9sb2dfZmx1c2goR0ZTMl9TQihpbm9kZSksIGlwLT5pX2dsKTsKQEAgLTE0MjcsNyArMTQzMiwyMCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyoKKy8qKgorICogZ2ZzMl9ldmljdF9pbm9kZSAtIFJlbW92ZSBhbiBpbm9kZSBmcm9tIGNhY2hlCisgKiBAaW5vZGU6IFRoZSBpbm9kZSB0byBldmljdAorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyB0byBjb25zaWRlcjoKKyAqIDEuIGlfbmxpbmsgPT0gMCwgd2UgYXJlIGZpbmFsIG9wZW5lciAoYW5kIG11c3QgZGVhbGxvY2F0ZSkKKyAqIDIuIGlfbmxpbmsgPT0gMCwgd2UgYXJlIG5vdCB0aGUgZmluYWwgb3BlbmVyIChhbmQgY2Fubm90IGRlYWxsb2NhdGUpCisgKiAzLiBpX25saW5rID4gMAorICoKKyAqIElmIHRoZSBmcyBpcyByZWFkIG9ubHksIHRoZW4gd2UgaGF2ZSB0byB0cmVhdCBhbGwgY2FzZXMgYXMgcGVyICMzCisgKiBzaW5jZSB3ZSBhcmUgdW5hYmxlIHRvIGRvIGFueSBkZWFsbG9jYXRpb24uIFRoZSBpbm9kZSB3aWxsIGJlCisgKiBkZWFsbG9jYXRlZCBieSB0aGUgbmV4dCByZWFkL3dyaXRlIG5vZGUgdG8gYXR0ZW1wdCBhbiBhbGxvY2F0aW9uCisgKiBpbiB0aGUgc2FtZSByZXNvdXJjZSBncm91cAorICoKICAqIFdlIGhhdmUgdG8gKGF0IHRoZSBtb21lbnQpIGhvbGQgdGhlIGlub2RlcyBtYWluIGxvY2sgdG8gY292ZXIKICAqIHRoZSBnYXAgYmV0d2VlbiB1bmxvY2tpbmcgdGhlIHNoYXJlZCBsb2NrIG9uIHRoZSBpb3BlbiBsb2NrIGFuZAogICogdGFraW5nIHRoZSBleGNsdXNpdmUgbG9jay4gSSdkIHJhdGhlciBkbyBhIHNoYXJlZCAtPiBleGNsdXNpdmUKQEAgLTE0NzAsNiArMTQ4OCw4IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF90cnVuY2F0ZTsKIAorCS8qIENhc2UgMSBzdGFydHMgaGVyZSAqLworCiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYKIAkgICAgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VYSEFTSCkpIHsKIAkJZXJyb3IgPSBnZnMyX2Rpcl9leGhhc2hfZGVhbGxvYyhpcCk7CkBAIC0xNDkzLDEzICsxNTEzLDE2IEBACiAJZ290byBvdXRfdW5sb2NrOwogCiBvdXRfdHJ1bmNhdGU6CisJLyogQ2FzZSAyIHN0YXJ0cyBoZXJlICovCiAJZXJyb3IgPSBnZnMyX3RyYW5zX2JlZ2luKHNkcCwgMCwgc2RwLT5zZF9qZGVzYy0+amRfYmxvY2tzKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3VubG9jazsKLQlnZnMyX2ZpbmFsX3JlbGVhc2VfcGFnZXMoaXApOworCS8qIE5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIGdsb2NrIHJlbGVhc2UgJiBhbHNvIGluIGEgdHJhbnNhY3Rpb24gKi8KKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAJZ2ZzMl90cmFuc19lbmQoc2RwKTsKIAogb3V0X3VubG9jazoKKwkvKiBFcnJvciBwYXRoIGZvciBjYXNlIDEgKi8KIAlpZiAodGVzdF9iaXQoSElGX0hPTERFUiwgJmlwLT5pX2lvcGVuX2doLmdoX2lmbGFncykpCiAJCWdmczJfZ2xvY2tfZHEoJmlwLT5pX2lvcGVuX2doKTsKIAlnZnMyX2hvbGRlcl91bmluaXQoJmlwLT5pX2lvcGVuX2doKTsKQEAgLTE1MDcsOSArMTUzMCwxMCBAQAogCWlmIChlcnJvciAmJiBlcnJvciAhPSBHTFJfVFJZRkFJTEVEICYmIGVycm9yICE9IC1FUk9GUykKIAkJZnNfd2FybihzZHAsICJnZnMyX2V2aWN0X2lub2RlOiAlZFxuIiwgZXJyb3IpOwogb3V0OgorCS8qIENhc2UgMyBzdGFydHMgaGVyZSAqLwogCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAllbmRfd3JpdGViYWNrKGlub2RlKTsKLQorCWdmczJfZGlyX2hhc2hfaW52YWwoaXApOwogCWlwLT5pX2dsLT5nbF9vYmplY3QgPSBOVUxMOwogCWdmczJfZ2xvY2tfYWRkX3RvX2xydShpcC0+aV9nbCk7CiAJZ2ZzMl9nbG9ja19wdXQoaXAtPmlfZ2wpOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9zeXMuYyBiL2ZzL2dmczIvc3lzLmMKaW5kZXggZTIwZWFiMy4uNDQzY2FiYyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9zeXMuYworKysgYi9mcy9nZnMyL3N5cy5jCkBAIC0zMzgsNiArMzM4LDkgQEAKIAlydiA9IHNzY2FuZihidWYsICIldSIsICZmaXJzdCk7CiAJaWYgKHJ2ICE9IDEgfHwgZmlyc3QgPiAxKQogCQlyZXR1cm4gLUVJTlZBTDsKKwlydiA9IHdhaXRfZm9yX2NvbXBsZXRpb25fa2lsbGFibGUoJnNkcC0+c2RfbG9ja2luZ19pbml0KTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKIAlzcGluX2xvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOwogCXJ2ID0gLUVCVVNZOwogCWlmICh0ZXN0X2JpdChTREZfTk9KT1VSTkFMSUQsICZzZHAtPnNkX2ZsYWdzKSA9PSAwKQpAQCAtNDE0LDcgKzQxNyw5IEBACiAJcnYgPSBzc2NhbmYoYnVmLCAiJWQiLCAmamlkKTsKIAlpZiAocnYgIT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0KKwlydiA9IHdhaXRfZm9yX2NvbXBsZXRpb25fa2lsbGFibGUoJnNkcC0+c2RfbG9ja2luZ19pbml0KTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKIAlzcGluX2xvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOwogCXJ2ID0gLUVJTlZBTDsKIAlpZiAoc2RwLT5zZF9sb2Nrc3RydWN0LmxzX29wcy0+bG1fbW91bnQgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2ZzL2hmcy9pbm9kZS5jIGIvZnMvaGZzL2lub2RlLmMKaW5kZXggZmZmMTZjOS4uOTZhMWI2MiAxMDA2NDQKLS0tIGEvZnMvaGZzL2lub2RlLmMKKysrIGIvZnMvaGZzL2lub2RlLmMKQEAgLTEyMyw4ICsxMjMsOCBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmctPmhvc3Q7CiAJc3NpemVfdCByZXQ7CiAKLQlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCi0JCQkJICBvZmZzZXQsIG5yX3NlZ3MsIGhmc19nZXRfYmxvY2ssIE5VTEwpOworCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlvdiwgb2Zmc2V0LCBucl9zZWdzLAorCQkJCSBoZnNfZ2V0X2Jsb2NrKTsKIAogCS8qCiAJICogSW4gY2FzZSBvZiBlcnJvciBleHRlbmRpbmcgd3JpdGUgbWF5IGhhdmUgaW5zdGFudGlhdGVkIGEgZmV3CkBAIC02MTUsNiArNjE1LDggQEAKIAogCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpICYmCiAJICAgIGF0dHItPmlhX3NpemUgIT0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJCWlub2RlX2Rpb193YWl0KGlub2RlKTsKKwogCQllcnJvciA9IHZtdHJ1bmNhdGUoaW5vZGUsIGF0dHItPmlhX3NpemUpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CkBAIC02MjUsMTIgKzYyNywxOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhmc19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgZGF0YXN5bmMpCitzdGF0aWMgaW50IGhmc19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCisJCQkgIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OwogCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOwogCWludCByZXQsIGVycjsKIAorCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKIAkvKiBzeW5jIHRoZSBpbm9kZSB0byBidWZmZXJzICovCiAJcmV0ID0gd3JpdGVfaW5vZGVfbm93KGlub2RlLCAwKTsKIApAQCAtNjQ3LDYgKzY1NSw3IEBACiAJZXJyID0gc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKIAlpZiAoIXJldCkKIAkJcmV0ID0gZXJyOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvYnJlYy5jIGIvZnMvaGZzcGx1cy9icmVjLmMKaW5kZXggMjMxMmRlMy4uMmE3MzRjZiAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9icmVjLmMKKysrIGIvZnMvaGZzcGx1cy9icmVjLmMKQEAgLTQzLDYgKzQzLDEwIEBACiAJCQlub2RlLT50cmVlLT5ub2RlX3NpemUgLSAocmVjICsgMSkgKiAyKTsKIAkJaWYgKCFyZWNvZmYpCiAJCQlyZXR1cm4gMDsKKwkJaWYgKHJlY29mZiA+IG5vZGUtPnRyZWUtPm5vZGVfc2l6ZSAtIDIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiByZWNvZmYgJWQgdG9vIGxhcmdlXG4iLCByZWNvZmYpOworCQkJcmV0dXJuIDA7CisJCX0KIAogCQlyZXR2YWwgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgcmVjb2ZmKSArIDI7CiAJCWlmIChyZXR2YWwgPiBub2RlLT50cmVlLT5tYXhfa2V5X2xlbiArIDIpIHsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvY2F0YWxvZy5jIGIvZnMvaGZzcGx1cy9jYXRhbG9nLmMKaW5kZXggYjRiYTFiMy4uNGRmYmZlYyAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9jYXRhbG9nLmMKKysrIGIvZnMvaGZzcGx1cy9jYXRhbG9nLmMKQEAgLTIxMiw3ICsyMTIsOSBAQAogCiAJZHByaW50KERCR19DQVRfTU9ELCAiY3JlYXRlX2NhdDogJXMsJXUoJWQpXG4iLAogCQlzdHItPm5hbWUsIGNuaWQsIGlub2RlLT5pX25saW5rKTsKLQloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLT5jYXRfdHJlZSwgJmZkKTsKKwllcnIgPSBoZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLT5jYXRfdHJlZSwgJmZkKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJaGZzcGx1c19jYXRfYnVpbGRfa2V5KHNiLCBmZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKIAllbnRyeV9zaXplID0gaGZzcGx1c19maWxsX2NhdF90aHJlYWQoc2IsICZlbnRyeSwKQEAgLTI2OSw3ICsyNzEsOSBAQAogCiAJZHByaW50KERCR19DQVRfTU9ELCAiZGVsZXRlX2NhdDogJXMsJXVcbiIsCiAJCXN0ciA/IHN0ci0+bmFtZSA6IE5VTEwsIGNuaWQpOwotCWhmc19maW5kX2luaXQoSEZTUExVU19TQihzYiktPmNhdF90cmVlLCAmZmQpOworCWVyciA9IGhmc19maW5kX2luaXQoSEZTUExVU19TQihzYiktPmNhdF90cmVlLCAmZmQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAoIXN0cikgewogCQlpbnQgbGVuOwpAQCAtMzQ3LDEyICszNTEsMTQgQEAKIAlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBzcmNfZmQsIGRzdF9mZDsKIAloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKIAlpbnQgZW50cnlfc2l6ZSwgdHlwZTsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyOwogCiAJZHByaW50KERCR19DQVRfTU9ELCAicmVuYW1lX2NhdDogJXUgLSAlbHUsJXMgLSAlbHUsJXNcbiIsCiAJCWNuaWQsIHNyY19kaXItPmlfaW5vLCBzcmNfbmFtZS0+bmFtZSwKIAkJZHN0X2Rpci0+aV9pbm8sIGRzdF9uYW1lLT5uYW1lKTsKLQloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLT5jYXRfdHJlZSwgJnNyY19mZCk7CisJZXJyID0gaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS0+Y2F0X3RyZWUsICZzcmNfZmQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAJZHN0X2ZkID0gc3JjX2ZkOwogCiAJLyogZmluZCB0aGUgb2xkIGRpciBlbnRyeSBhbmQgcmVhZCB0aGUgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9kaXIuYyBiL2ZzL2hmc3BsdXMvZGlyLmMKaW5kZXggNGRmNTA1OS4uMjViMjQ0MyAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9kaXIuYworKysgYi9mcy9oZnNwbHVzL2Rpci5jCkBAIC0zOCw3ICszOCw5IEBACiAJc2IgPSBkaXItPmlfc2I7CiAKIAlkZW50cnktPmRfZnNkYXRhID0gTlVMTDsKLQloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLT5jYXRfdHJlZSwgJmZkKTsKKwllcnIgPSBoZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLT5jYXRfdHJlZSwgJmZkKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgJmRlbnRyeS0+ZF9uYW1lKTsKIGFnYWluOgogCWVyciA9IGhmc19icmVjX3JlYWQoJmZkLCAmZW50cnksIHNpemVvZihlbnRyeSkpOwpAQCAtMTMyLDcgKzEzNCw5IEBACiAJaWYgKGZpbHAtPmZfcG9zID49IGlub2RlLT5pX3NpemUpCiAJCXJldHVybiAwOwogCi0JaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS0+Y2F0X3RyZWUsICZmZCk7CisJZXJyID0gaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS0+Y2F0X3RyZWUsICZmZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGlub2RlLT5pX2lubywgTlVMTCk7CiAJZXJyID0gaGZzX2JyZWNfZmluZCgmZmQpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2V4dGVudHMuYyBiL2ZzL2hmc3BsdXMvZXh0ZW50cy5jCmluZGV4IGIxOTkxYTIuLjU4NDllM2UgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvZXh0ZW50cy5jCisrKyBiL2ZzL2hmc3BsdXMvZXh0ZW50cy5jCkBAIC0xMTksMjIgKzExOSwzMSBAQAogCXNldF9iaXQoSEZTUExVU19JX0VYVF9ESVJUWSwgJmhpcC0+ZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBoZnNwbHVzX2V4dF93cml0ZV9leHRlbnRfbG9ja2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW50IGhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudF9sb2NrZWQoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwlpbnQgcmVzOworCiAJaWYgKEhGU1BMVVNfSShpbm9kZSktPmV4dGVudF9zdGF0ZSAmIEhGU1BMVVNfRVhUX0RJUlRZKSB7CiAJCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOwogCi0JCWhmc19maW5kX2luaXQoSEZTUExVU19TQihpbm9kZS0+aV9zYiktPmV4dF90cmVlLCAmZmQpOworCQlyZXMgPSBoZnNfZmluZF9pbml0KEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLT5leHRfdHJlZSwgJmZkKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CiAJCV9faGZzcGx1c19leHRfd3JpdGVfZXh0ZW50KGlub2RlLCAmZmQpOwogCQloZnNfZmluZF9leGl0KCZmZCk7CiAJfQorCXJldHVybiAwOwogfQogCi12b2lkIGhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoraW50IGhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCWludCByZXM7CisKIAltdXRleF9sb2NrKCZIRlNQTFVTX0koaW5vZGUpLT5leHRlbnRzX2xvY2spOwotCWhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudF9sb2NrZWQoaW5vZGUpOworCXJlcyA9IGhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudF9sb2NrZWQoaW5vZGUpOwogCW11dGV4X3VubG9jaygmSEZTUExVU19JKGlub2RlKS0+ZXh0ZW50c19sb2NrKTsKKworCXJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9faGZzcGx1c19leHRfcmVhZF9leHRlbnQoc3RydWN0IGhmc19maW5kX2RhdGEgKmZkLApAQCAtMTk0LDkgKzIwMywxMSBAQAogCSAgICBibG9jayA8IGhpcC0+Y2FjaGVkX3N0YXJ0ICsgaGlwLT5jYWNoZWRfYmxvY2tzKQogCQlyZXR1cm4gMDsKIAotCWhmc19maW5kX2luaXQoSEZTUExVU19TQihpbm9kZS0+aV9zYiktPmV4dF90cmVlLCAmZmQpOwotCXJlcyA9IF9faGZzcGx1c19leHRfY2FjaGVfZXh0ZW50KCZmZCwgaW5vZGUsIGJsb2NrKTsKLQloZnNfZmluZF9leGl0KCZmZCk7CisJcmVzID0gaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS0+ZXh0X3RyZWUsICZmZCk7CisJaWYgKCFyZXMpIHsKKwkJcmVzID0gX19oZnNwbHVzX2V4dF9jYWNoZV9leHRlbnQoJmZkLCBpbm9kZSwgYmxvY2spOworCQloZnNfZmluZF9leGl0KCZmZCk7CisJfQogCXJldHVybiByZXM7CiB9CiAKQEAgLTIwOSw2ICsyMjAsNyBAQAogCXN0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8gKmhpcCA9IEhGU1BMVVNfSShpbm9kZSk7CiAJaW50IHJlcyA9IC1FSU87CiAJdTMyIGFibG9jaywgZGJsb2NrLCBtYXNrOworCXNlY3Rvcl90IHNlY3RvcjsKIAlpbnQgd2FzX2RpcnR5ID0gMDsKIAlpbnQgc2hpZnQ7CiAKQEAgLTI1NSwxMCArMjY3LDEyIEBACiBkb25lOgogCWRwcmludChEQkdfRVhURU5ULCAiZ2V0X2Jsb2NrKCVsdSk6ICVsbHUgLSAldVxuIiwKIAkJaW5vZGUtPmlfaW5vLCAobG9uZyBsb25nKWlibG9jaywgZGJsb2NrKTsKKwogCW1hc2sgPSAoMSA8PCBzYmktPmZzX3NoaWZ0KSAtIDE7Ci0JbWFwX2JoKGJoX3Jlc3VsdCwgc2IsCi0JCShkYmxvY2sgPDwgc2JpLT5mc19zaGlmdCkgKyBzYmktPmJsb2Nrb2Zmc2V0ICsKLQkJCShpYmxvY2sgJiBtYXNrKSk7CisJc2VjdG9yID0gKChzZWN0b3JfdClkYmxvY2sgPDwgc2JpLT5mc19zaGlmdCkgKworCQkgIHNiaS0+YmxvY2tvZmZzZXQgKyAoaWJsb2NrICYgbWFzayk7CisJbWFwX2JoKGJoX3Jlc3VsdCwgc2IsIHNlY3Rvcik7CisKIAlpZiAoY3JlYXRlKSB7CiAJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CiAJCWhpcC0+cGh5c19zaXplICs9IHNiLT5zX2Jsb2Nrc2l6ZTsKQEAgLTM3MSw3ICszODUsOSBAQAogCWlmICh0b3RhbF9ibG9ja3MgPT0gYmxvY2tzKQogCQlyZXR1cm4gMDsKIAotCWhmc19maW5kX2luaXQoSEZTUExVU19TQihzYiktPmV4dF90cmVlLCAmZmQpOworCXJlcyA9IGhmc19maW5kX2luaXQoSEZTUExVU19TQihzYiktPmV4dF90cmVlLCAmZmQpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CiAJZG8gewogCQlyZXMgPSBfX2hmc3BsdXNfZXh0X3JlYWRfZXh0ZW50KCZmZCwgZXh0X2VudHJ5LCBjbmlkLAogCQkJCQkJdG90YWxfYmxvY2tzLCB0eXBlKTsKQEAgLTQ2OSw3ICs0ODUsOSBAQAogCiBpbnNlcnRfZXh0ZW50OgogCWRwcmludChEQkdfRVhURU5ULCAiaW5zZXJ0IG5ldyBleHRlbnRcbiIpOwotCWhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudF9sb2NrZWQoaW5vZGUpOworCXJlcyA9IGhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudF9sb2NrZWQoaW5vZGUpOworCWlmIChyZXMpCisJCWdvdG8gb3V0OwogCiAJbWVtc2V0KGhpcC0+Y2FjaGVkX2V4dGVudHMsIDAsIHNpemVvZihoZnNwbHVzX2V4dGVudF9yZWMpKTsKIAloaXAtPmNhY2hlZF9leHRlbnRzWzBdLnN0YXJ0X2Jsb2NrID0gY3B1X3RvX2JlMzIoc3RhcnQpOwpAQCAtNTAwLDcgKzUxOCw2IEBACiAJCXN0cnVjdCBwYWdlICpwYWdlOwogCQl2b2lkICpmc2RhdGE7CiAJCXUzMiBzaXplID0gaW5vZGUtPmlfc2l6ZTsKLQkJaW50IHJlczsKIAogCQlyZXMgPSBwYWdlY2FjaGVfd3JpdGVfYmVnaW4oTlVMTCwgbWFwcGluZywgc2l6ZSwgMCwKIAkJCQkJCUFPUF9GTEFHX1VOSU5URVJSVVBUSUJMRSwKQEAgLTUyMyw3ICs1NDAsMTIgQEAKIAkJZ290byBvdXQ7CiAKIAltdXRleF9sb2NrKCZoaXAtPmV4dGVudHNfbG9jayk7Ci0JaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS0+ZXh0X3RyZWUsICZmZCk7CisJcmVzID0gaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS0+ZXh0X3RyZWUsICZmZCk7CisJaWYgKHJlcykgeworCQltdXRleF91bmxvY2soJmhpcC0+ZXh0ZW50c19sb2NrKTsKKwkJLyogWFhYOiBXZSBsYWNrIGVycm9yIGhhbmRsaW5nIG9mIGhmc3BsdXNfZmlsZV90cnVuY2F0ZSgpICovCisJCXJldHVybjsKKwl9CiAJd2hpbGUgKDEpIHsKIAkJaWYgKGFsbG9jX2NudCA9PSBoaXAtPmZpcnN0X2Jsb2NrcykgewogCQkJaGZzcGx1c19mcmVlX2V4dGVudHMoc2IsIGhpcC0+Zmlyc3RfZXh0ZW50cywKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oIGIvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKaW5kZXggZDY4NTc1Mi4uZDc2NzRkMCAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKKysrIGIvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgogCiAjZGVmaW5lIERCR19CTk9ERV9SRUZTCTB4MDAwMDAwMDEKQEAgLTExMCw3ICsxMTEsOSBAQAogc3RydWN0IGhmc19idHJlZTsKIAogc3RydWN0IGhmc3BsdXNfc2JfaW5mbyB7CisJdm9pZCAqc192aGRyX2J1ZjsKIAlzdHJ1Y3QgaGZzcGx1c192aCAqc192aGRyOworCXZvaWQgKnNfYmFja3VwX3ZoZHJfYnVmOwogCXN0cnVjdCBoZnNwbHVzX3ZoICpzX2JhY2t1cF92aGRyOwogCXN0cnVjdCBoZnNfYnRyZWUgKmV4dF90cmVlOwogCXN0cnVjdCBoZnNfYnRyZWUgKmNhdF90cmVlOwpAQCAtMjU4LDYgKzI2MSwxNSBAQAogCXN0cnVjdCBoZnNwbHVzX2NhdF9rZXkga2V5OwogfTsKIAorLyoKKyAqIEZpbmQgbWluaW11bSBhY2NlcHRpYmxlIEkvTyBzaXplIGZvciBhbiBoZnNwbHVzIHNiLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGhmc3BsdXNfbWluX2lvX3NpemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gbWF4X3QodW5zaWduZWQgc2hvcnQsIGJkZXZfbG9naWNhbF9ibG9ja19zaXplKHNiLT5zX2JkZXYpLAorCQkgICAgIEhGU1BMVVNfU0VDVE9SX1NJWkUpOworfQorCiAjZGVmaW5lIGhmc19idHJlZV9vcGVuIGhmc3BsdXNfYnRyZWVfb3BlbgogI2RlZmluZSBoZnNfYnRyZWVfY2xvc2UgaGZzcGx1c19idHJlZV9jbG9zZQogI2RlZmluZSBoZnNfYnRyZWVfd3JpdGUgaGZzcGx1c19idHJlZV93cml0ZQpAQCAtMzc0LDcgKzM4Niw3IEBACiAKIC8qIGV4dGVudHMuYyAqLwogaW50IGhmc3BsdXNfZXh0X2NtcF9rZXkoY29uc3QgaGZzcGx1c19idHJlZV9rZXkgKiwgY29uc3QgaGZzcGx1c19idHJlZV9rZXkgKik7Ci12b2lkIGhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKik7CitpbnQgaGZzcGx1c19leHRfd3JpdGVfZXh0ZW50KHN0cnVjdCBpbm9kZSAqKTsKIGludCBoZnNwbHVzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOwogaW50IGhmc3BsdXNfZnJlZV9mb3JrKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1MzIsCiAJCXN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3ICosIGludCk7CkBAIC0zOTIsNyArNDA0LDggQEAKIGludCBoZnNwbHVzX2NhdF93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiBzdHJ1Y3QgaW5vZGUgKmhmc3BsdXNfbmV3X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQpOwogdm9pZCBoZnNwbHVzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7Ci1pbnQgaGZzcGx1c19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpOworaW50IGhmc3BsdXNfZmlsZV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkgICAgICAgaW50IGRhdGFzeW5jKTsKIAogLyogaW9jdGwuYyAqLwogbG9uZyBoZnNwbHVzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CkBAIC00MzYsOCArNDQ5LDggQEAKIC8qIHdyYXBwZXIuYyAqLwogaW50IGhmc3BsdXNfcmVhZF93cmFwcGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGludCBoZnNfcGFydF9maW5kKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWN0b3JfdCAqLCBzZWN0b3JfdCAqKTsKLWludCBoZnNwbHVzX3N1Ym1pdF9iaW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLAotCQl2b2lkICpkYXRhLCBpbnQgcncpOworaW50IGhmc3BsdXNfc3VibWl0X2JpbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzZWN0b3JfdCBzZWN0b3IsCisJCXZvaWQgKmJ1Ziwgdm9pZCAqKmRhdGEsIGludCBydyk7CiAKIC8qIHRpbWUgbWFjcm9zICovCiAjZGVmaW5lIF9faGZzcF9tdDJ1dCh0KQkJKGJlMzJfdG9fY3B1KHQpIC0gMjA4Mjg0NDgwMFUpCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2lub2RlLmMgYi9mcy9oZnNwbHVzL2lub2RlLmMKaW5kZXggYjI0OGE2Y2YuLjRjYzFlM2EgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvaW5vZGUuYworKysgYi9mcy9oZnNwbHVzL2lub2RlLmMKQEAgLTExOSw4ICsxMTksOCBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmctPmhvc3Q7CiAJc3NpemVfdCByZXQ7CiAKLQlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCi0JCQkJICBvZmZzZXQsIG5yX3NlZ3MsIGhmc3BsdXNfZ2V0X2Jsb2NrLCBOVUxMKTsKKwlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpb3YsIG9mZnNldCwgbnJfc2VncywKKwkJCQkgaGZzcGx1c19nZXRfYmxvY2spOwogCiAJLyoKIAkgKiBJbiBjYXNlIG9mIGVycm9yIGV4dGVuZGluZyB3cml0ZSBtYXkgaGF2ZSBpbnN0YW50aWF0ZWQgYSBmZXcKQEAgLTE5NSwxMSArMTk1LDEzIEBACiAJaGlwLT5mbGFncyA9IDA7CiAJc2V0X2JpdChIRlNQTFVTX0lfUlNSQywgJmhpcC0+ZmxhZ3MpOwogCi0JaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS0+Y2F0X3RyZWUsICZmZCk7Ci0JZXJyID0gaGZzcGx1c19maW5kX2NhdChzYiwgZGlyLT5pX2lubywgJmZkKTsKLQlpZiAoIWVycikKLQkJZXJyID0gaGZzcGx1c19jYXRfcmVhZF9pbm9kZShpbm9kZSwgJmZkKTsKLQloZnNfZmluZF9leGl0KCZmZCk7CisJZXJyID0gaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS0+Y2F0X3RyZWUsICZmZCk7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gaGZzcGx1c19maW5kX2NhdChzYiwgZGlyLT5pX2lubywgJmZkKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBoZnNwbHVzX2NhdF9yZWFkX2lub2RlKGlub2RlLCAmZmQpOworCQloZnNfZmluZF9leGl0KCZmZCk7CisJfQogCWlmIChlcnIpIHsKIAkJaXB1dChpbm9kZSk7CiAJCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0yOTYsNiArMjk4LDggQEAKIAogCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpICYmCiAJICAgIGF0dHItPmlhX3NpemUgIT0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJCWlub2RlX2Rpb193YWl0KGlub2RlKTsKKwogCQllcnJvciA9IHZtdHJ1bmNhdGUoaW5vZGUsIGF0dHItPmlhX3NpemUpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CkBAIC0zMDYsMTMgKzMxMCwxOSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaGZzcGx1c19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpCitpbnQgaGZzcGx1c19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCisJCSAgICAgICBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgaGZzcGx1c19pbm9kZV9pbmZvICpoaXAgPSBIRlNQTFVTX0koaW5vZGUpOwogCXN0cnVjdCBoZnNwbHVzX3NiX2luZm8gKnNiaSA9IEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpOwogCWludCBlcnJvciA9IDAsIGVycm9yMjsKIAorCWVycm9yID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKIAkvKgogCSAqIFN5bmMgaW5vZGUgbWV0YWRhdGEgaW50byB0aGUgY2F0YWxvZyBhbmQgZXh0ZW50IHRyZWVzLgogCSAqLwpAQCAtMzQwLDYgKzM1MCw4IEBACiAJaWYgKCF0ZXN0X2JpdChIRlNQTFVTX1NCX05PQkFSUklFUiwgJnNiaS0+ZmxhZ3MpKQogCQlibGtkZXZfaXNzdWVfZmx1c2goaW5vZGUtPmlfc2ItPnNfYmRldiwgR0ZQX0tFUk5FTCwgTlVMTCk7CiAKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwogCXJldHVybiBlcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9wYXJ0X3RibC5jIGIvZnMvaGZzcGx1cy9wYXJ0X3RibC5jCmluZGV4IDQwYWQ4OGMuLmViMzU1ZDggMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvcGFydF90YmwuYworKysgYi9mcy9oZnNwbHVzL3BhcnRfdGJsLmMKQEAgLTg4LDExICs4OCwxMiBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi1zdGF0aWMgaW50IGhmc19wYXJzZV9uZXdfcG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgbmV3X3BtYXAgKnBtLAotCQlzZWN0b3JfdCAqcGFydF9zdGFydCwgc2VjdG9yX3QgKnBhcnRfc2l6ZSkKK3N0YXRpYyBpbnQgaGZzX3BhcnNlX25ld19wbWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmJ1ZiwKKwkJc3RydWN0IG5ld19wbWFwICpwbSwgc2VjdG9yX3QgKnBhcnRfc3RhcnQsIHNlY3Rvcl90ICpwYXJ0X3NpemUpCiB7CiAJc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqc2JpID0gSEZTUExVU19TQihzYik7CiAJaW50IHNpemUgPSBiZTMyX3RvX2NwdShwbS0+cG1NYXBCbGtDbnQpOworCWludCBidWZfc2l6ZSA9IGhmc3BsdXNfbWluX2lvX3NpemUoc2IpOwogCWludCByZXM7CiAJaW50IGkgPSAwOwogCkBAIC0xMDcsMTEgKzEwOCwxNCBAQAogCQlpZiAoKytpID49IHNpemUpCiAJCQlyZXR1cm4gLUVOT0VOVDsKIAotCQlyZXMgPSBoZnNwbHVzX3N1Ym1pdF9iaW8oc2ItPnNfYmRldiwKLQkJCQkJICpwYXJ0X3N0YXJ0ICsgSEZTX1BNQVBfQkxLICsgaSwKLQkJCQkJIHBtLCBSRUFEKTsKLQkJaWYgKHJlcykKLQkJCXJldHVybiByZXM7CisJCXBtID0gKHN0cnVjdCBuZXdfcG1hcCAqKSgodTggKilwbSArIEhGU1BMVVNfU0VDVE9SX1NJWkUpOworCQlpZiAoKHU4ICopcG0gLSAodTggKilidWYgPj0gYnVmX3NpemUpIHsKKwkJCXJlcyA9IGhmc3BsdXNfc3VibWl0X2JpbyhzYiwKKwkJCQkJCSAqcGFydF9zdGFydCArIEhGU19QTUFQX0JMSyArIGksCisJCQkJCQkgYnVmLCAodm9pZCAqKikmcG0sIFJFQUQpOworCQkJaWYgKHJlcykKKwkJCQlyZXR1cm4gcmVzOworCQl9CiAJfSB3aGlsZSAocG0tPnBtU2lnID09IGNwdV90b19iZTE2KEhGU19ORVdfUE1BUF9NQUdJQykpOwogCiAJcmV0dXJuIC1FTk9FTlQ7CkBAIC0xMjQsMTUgKzEyOCwxNSBAQAogaW50IGhmc19wYXJ0X2ZpbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJc2VjdG9yX3QgKnBhcnRfc3RhcnQsIHNlY3Rvcl90ICpwYXJ0X3NpemUpCiB7Ci0Jdm9pZCAqZGF0YTsKKwl2b2lkICpidWYsICpkYXRhOwogCWludCByZXM7CiAKLQlkYXRhID0ga21hbGxvYyhIRlNQTFVTX1NFQ1RPUl9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpCisJYnVmID0ga21hbGxvYyhoZnNwbHVzX21pbl9pb19zaXplKHNiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmVzID0gaGZzcGx1c19zdWJtaXRfYmlvKHNiLT5zX2JkZXYsICpwYXJ0X3N0YXJ0ICsgSEZTX1BNQVBfQkxLLAotCQkJCSBkYXRhLCBSRUFEKTsKKwlyZXMgPSBoZnNwbHVzX3N1Ym1pdF9iaW8oc2IsICpwYXJ0X3N0YXJ0ICsgSEZTX1BNQVBfQkxLLAorCQkJCSBidWYsICZkYXRhLCBSRUFEKTsKIAlpZiAocmVzKQogCQlnb3RvIG91dDsKIApAQCAtMTQxLDEzICsxNDUsMTMgQEAKIAkJcmVzID0gaGZzX3BhcnNlX29sZF9wbWFwKHNiLCBkYXRhLCBwYXJ0X3N0YXJ0LCBwYXJ0X3NpemUpOwogCQlicmVhazsKIAljYXNlIEhGU19ORVdfUE1BUF9NQUdJQzoKLQkJcmVzID0gaGZzX3BhcnNlX25ld19wbWFwKHNiLCBkYXRhLCBwYXJ0X3N0YXJ0LCBwYXJ0X3NpemUpOworCQlyZXMgPSBoZnNfcGFyc2VfbmV3X3BtYXAoc2IsIGJ1ZiwgZGF0YSwgcGFydF9zdGFydCwgcGFydF9zaXplKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmVzID0gLUVOT0VOVDsKIAkJYnJlYWs7CiAJfQogb3V0OgotCWtmcmVlKGRhdGEpOworCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIHJlczsKIH0KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvc3VwZXIuYyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwppbmRleCBiNDliNTU1Li5jMTA2Y2EyIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL3N1cGVyLmMKKysrIGIvZnMvaGZzcGx1cy9zdXBlci5jCkBAIC03MywxMSArNzMsMTMgQEAKIAogCWlmIChpbm9kZS0+aV9pbm8gPj0gSEZTUExVU19GSVJTVFVTRVJfQ05JRCB8fAogCSAgICBpbm9kZS0+aV9pbm8gPT0gSEZTUExVU19ST09UX0NOSUQpIHsKLQkJaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS0+Y2F0X3RyZWUsICZmZCk7Ci0JCWVyciA9IGhmc3BsdXNfZmluZF9jYXQoaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgJmZkKTsKLQkJaWYgKCFlcnIpCi0JCQllcnIgPSBoZnNwbHVzX2NhdF9yZWFkX2lub2RlKGlub2RlLCAmZmQpOwotCQloZnNfZmluZF9leGl0KCZmZCk7CisJCWVyciA9IGhmc19maW5kX2luaXQoSEZTUExVU19TQihpbm9kZS0+aV9zYiktPmNhdF90cmVlLCAmZmQpOworCQlpZiAoIWVycikgeworCQkJZXJyID0gaGZzcGx1c19maW5kX2NhdChpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmZmQpOworCQkJaWYgKCFlcnIpCisJCQkJZXJyID0gaGZzcGx1c19jYXRfcmVhZF9pbm9kZShpbm9kZSwgJmZkKTsKKwkJCWhmc19maW5kX2V4aXQoJmZkKTsKKwkJfQogCX0gZWxzZSB7CiAJCWVyciA9IGhmc3BsdXNfc3lzdGVtX3JlYWRfaW5vZGUoaW5vZGUpOwogCX0KQEAgLTEzMyw5ICsxMzUsMTMgQEAKIHN0YXRpYyBpbnQgaGZzcGx1c193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKIHsKKwlpbnQgZXJyOworCiAJZHByaW50KERCR19JTk9ERSwgImhmc3BsdXNfd3JpdGVfaW5vZGU6ICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKIAotCWhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudChpbm9kZSk7CisJZXJyID0gaGZzcGx1c19leHRfd3JpdGVfZXh0ZW50KGlub2RlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKGlub2RlLT5pX2lubyA+PSBIRlNQTFVTX0ZJUlNUVVNFUl9DTklEIHx8CiAJICAgIGlub2RlLT5pX2lubyA9PSBIRlNQTFVTX1JPT1RfQ05JRCkKQEAgLTE5NywxNyArMjAzLDE3IEBACiAJCXdyaXRlX2JhY2t1cCA9IDE7CiAJfQogCi0JZXJyb3IyID0gaGZzcGx1c19zdWJtaXRfYmlvKHNiLT5zX2JkZXYsCisJZXJyb3IyID0gaGZzcGx1c19zdWJtaXRfYmlvKHNiLAogCQkJCSAgIHNiaS0+cGFydF9zdGFydCArIEhGU1BMVVNfVk9MSEVBRF9TRUNUT1IsCi0JCQkJICAgc2JpLT5zX3ZoZHIsIFdSSVRFX1NZTkMpOworCQkJCSAgIHNiaS0+c192aGRyX2J1ZiwgTlVMTCwgV1JJVEVfU1lOQyk7CiAJaWYgKCFlcnJvcikKIAkJZXJyb3IgPSBlcnJvcjI7CiAJaWYgKCF3cml0ZV9iYWNrdXApCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IyID0gaGZzcGx1c19zdWJtaXRfYmlvKHNiLT5zX2JkZXYsCisJZXJyb3IyID0gaGZzcGx1c19zdWJtaXRfYmlvKHNiLAogCQkJCSAgc2JpLT5wYXJ0X3N0YXJ0ICsgc2JpLT5zZWN0X2NvdW50IC0gMiwKLQkJCQkgIHNiaS0+c19iYWNrdXBfdmhkciwgV1JJVEVfU1lOQyk7CisJCQkJICBzYmktPnNfYmFja3VwX3ZoZHJfYnVmLCBOVUxMLCBXUklURV9TWU5DKTsKIAlpZiAoIWVycm9yKQogCQllcnJvcjIgPSBlcnJvcjsKIG91dDoKQEAgLTI1MSw4ICsyNTcsOCBAQAogCWhmc19idHJlZV9jbG9zZShzYmktPmV4dF90cmVlKTsKIAlpcHV0KHNiaS0+YWxsb2NfZmlsZSk7CiAJaXB1dChzYmktPmhpZGRlbl9kaXIpOwotCWtmcmVlKHNiaS0+c192aGRyKTsKLQlrZnJlZShzYmktPnNfYmFja3VwX3ZoZHIpOworCWtmcmVlKHNiaS0+c192aGRyX2J1Zik7CisJa2ZyZWUoc2JpLT5zX2JhY2t1cF92aGRyX2J1Zik7CiAJdW5sb2FkX25scyhzYmktPm5scyk7CiAJa2ZyZWUoc2ItPnNfZnNfaW5mbyk7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CkBAIC0zOTMsNiArMzk5LDEzIEBACiAJaWYgKCFzYmktPnJzcmNfY2x1bXBfYmxvY2tzKQogCQlzYmktPnJzcmNfY2x1bXBfYmxvY2tzID0gMTsKIAorCWVyciA9IGdlbmVyaWNfY2hlY2tfYWRkcmVzc2FibGUoc2JpLT5hbGxvY19ibGtzel9zaGlmdCwKKwkJCQkJc2JpLT50b3RhbF9ibG9ja3MpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGZpbGVzeXN0ZW0gc2l6ZSB0b28gbGFyZ2UuXG4iKTsKKwkJZ290byBvdXRfZnJlZV92aGRyOworCX0KKwogCS8qIFNldCB1cCBvcGVyYXRpb25zIHNvIHdlIGNhbiBsb2FkIG1ldGFkYXRhICovCiAJc2ItPnNfb3AgPSAmaGZzcGx1c19zb3BzOwogCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKQEAgLTQxNyw2ICs0MzAsOCBAQAogCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJfQogCisJZXJyID0gLUVJTlZBTDsKKwogCS8qIExvYWQgbWV0YWRhdGEgb2JqZWN0cyAoQipUcmVlcykgKi8KIAlzYmktPmV4dF90cmVlID0gaGZzX2J0cmVlX29wZW4oc2IsIEhGU1BMVVNfRVhUX0NOSUQpOwogCWlmICghc2JpLT5leHRfdHJlZSkgewpAQCAtNDQ3LDcgKzQ2Miw5IEBACiAKIAlzdHIubGVuID0gc2l6ZW9mKEhGU1BfSElEREVORElSX05BTUUpIC0gMTsKIAlzdHIubmFtZSA9IEhGU1BfSElEREVORElSX05BTUU7Ci0JaGZzX2ZpbmRfaW5pdChzYmktPmNhdF90cmVlLCAmZmQpOworCWVyciA9IGhmc19maW5kX2luaXQoc2JpLT5jYXRfdHJlZSwgJmZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9wdXRfcm9vdDsKIAloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIEhGU1BMVVNfUk9PVF9DTklELCAmc3RyKTsKIAlpZiAoIWhmc19icmVjX3JlYWQoJmZkLCAmZW50cnksIHNpemVvZihlbnRyeSkpKSB7CiAJCWhmc19maW5kX2V4aXQoJmZkKTsKQEAgLTUwMCw3ICs1MTcsNyBAQAogb3V0X3B1dF9oaWRkZW5fZGlyOgogCWlwdXQoc2JpLT5oaWRkZW5fZGlyKTsKIG91dF9wdXRfcm9vdDoKLQlpcHV0KHNiaS0+YWxsb2NfZmlsZSk7CisJaXB1dChyb290KTsKIG91dF9wdXRfYWxsb2NfZmlsZToKIAlpcHV0KHNiaS0+YWxsb2NfZmlsZSk7CiBvdXRfY2xvc2VfY2F0X3RyZWU6CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3VuaWNvZGUuYyBiL2ZzL2hmc3BsdXMvdW5pY29kZS5jCmluZGV4IGEzZjBiZmMuLmEzMjk5OGYgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvdW5pY29kZS5jCisrKyBiL2ZzL2hmc3BsdXMvdW5pY29kZS5jCkBAIC0xNDIsNyArMTQyLDExIEBACiAJCS8qIHNlYXJjaCBmb3Igc2luZ2xlIGRlY29tcG9zZWQgY2hhciAqLwogCQlpZiAobGlrZWx5KGNvbXBvc2UpKQogCQkJY2UxID0gaGZzcGx1c19jb21wb3NlX2xvb2t1cChoZnNwbHVzX2NvbXBvc2VfdGFibGUsIGMwKTsKLQkJaWYgKGNlMSAmJiAoY2MgPSBjZTFbMF0pKSB7CisJCWlmIChjZTEpCisJCQljYyA9IGNlMVswXTsKKwkJZWxzZQorCQkJY2MgPSAwOworCQlpZiAoY2MpIHsKIAkJCS8qIHN0YXJ0IG9mIGEgcG9zc2libHkgZGVjb21wb3NlZCBIYW5ndWwgY2hhciAqLwogCQkJaWYgKGNjICE9IDB4ZmZmZikKIAkJCQlnb3RvIGRvbmU7CkBAIC0yMDksNyArMjEzLDggQEAKIAkJCQlpKys7CiAJCQkJY2UyID0gY2UxOwogCQkJfQotCQkJaWYgKChjYyA9IGNlMlswXSkpIHsKKwkJCWNjID0gY2UyWzBdOworCQkJaWYgKGNjKSB7CiAJCQkJaXAgKz0gaTsKIAkJCQl1c3RybGVuIC09IGk7CiAJCQkJZ290byBkb25lOwpAQCAtMzAxLDcgKzMwNiwxMSBAQAogCXdoaWxlIChvdXRsZW4gPCBIRlNQTFVTX01BWF9TVFJMRU4gJiYgbGVuID4gMCkgewogCQlzaXplID0gYXNjMnVuaWNoYXIoc2IsIGFzdHIsIGxlbiwgJmMpOwogCi0JCWlmIChkZWNvbXBvc2UgJiYgKGRzdHIgPSBkZWNvbXBvc2VfdW5pY2hhcihjLCAmZHNpemUpKSkgeworCQlpZiAoZGVjb21wb3NlKQorCQkJZHN0ciA9IGRlY29tcG9zZV91bmljaGFyKGMsICZkc2l6ZSk7CisJCWVsc2UKKwkJCWRzdHIgPSBOVUxMOworCQlpZiAoZHN0cikgewogCQkJaWYgKG91dGxlbiArIGRzaXplID4gSEZTUExVU19NQVhfU1RSTEVOKQogCQkJCWJyZWFrOwogCQkJZG8gewpAQCAtMzQ2LDE1ICszNTUsMjMgQEAKIAkJYXN0ciArPSBzaXplOwogCQlsZW4gLT0gc2l6ZTsKIAotCQlpZiAoZGVjb21wb3NlICYmIChkc3RyID0gZGVjb21wb3NlX3VuaWNoYXIoYywgJmRzaXplKSkpIHsKKwkJaWYgKGRlY29tcG9zZSkKKwkJCWRzdHIgPSBkZWNvbXBvc2VfdW5pY2hhcihjLCAmZHNpemUpOworCQllbHNlCisJCQlkc3RyID0gTlVMTDsKKwkJaWYgKGRzdHIpIHsKIAkJCWRvIHsKIAkJCQljMiA9ICpkc3RyKys7Ci0JCQkJaWYgKCFjYXNlZm9sZCB8fCAoYzIgPSBjYXNlX2ZvbGQoYzIpKSkKKwkJCQlpZiAoY2FzZWZvbGQpCisJCQkJCWMyID0gY2FzZV9mb2xkKGMyKTsKKwkJCQlpZiAoIWNhc2Vmb2xkIHx8IGMyKQogCQkJCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2goYzIsIGhhc2gpOwogCQkJfSB3aGlsZSAoLS1kc2l6ZSA+IDApOwogCQl9IGVsc2UgewogCQkJYzIgPSBjOwotCQkJaWYgKCFjYXNlZm9sZCB8fCAoYzIgPSBjYXNlX2ZvbGQoYzIpKSkKKwkJCWlmIChjYXNlZm9sZCkKKwkJCQljMiA9IGNhc2VfZm9sZChjMik7CisJCQlpZiAoIWNhc2Vmb2xkIHx8IGMyKQogCQkJCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaChjMiwgaGFzaCk7CiAJCX0KIAl9CkBAIC00MjIsMTIgKzQzOSwxNCBAQAogCQljMSA9ICpkc3RyMTsKIAkJYzIgPSAqZHN0cjI7CiAJCWlmIChjYXNlZm9sZCkgewotCQkJaWYgICghKGMxID0gY2FzZV9mb2xkKGMxKSkpIHsKKwkJCWMxID0gY2FzZV9mb2xkKGMxKTsKKwkJCWlmICghYzEpIHsKIAkJCQlkc3RyMSsrOwogCQkJCWRzaXplMS0tOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJaWYgKCEoYzIgPSBjYXNlX2ZvbGQoYzIpKSkgeworCQkJYzIgPSBjYXNlX2ZvbGQoYzIpOworCQkJaWYgKCFjMikgewogCQkJCWRzdHIyKys7CiAJCQkJZHNpemUyLS07CiAJCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3dyYXBwZXIuYyBiL2ZzL2hmc3BsdXMvd3JhcHBlci5jCmluZGV4IDMwMzFkODEuLjEwZTUxNWEgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvd3JhcHBlci5jCisrKyBiL2ZzL2hmc3BsdXMvd3JhcHBlci5jCkBAIC0zMSwzMSArMzEsNzcgQEAKIAljb21wbGV0ZShiaW8tPmJpX3ByaXZhdGUpOwogfQogCi1pbnQgaGZzcGx1c19zdWJtaXRfYmlvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwKLQkJdm9pZCAqZGF0YSwgaW50IHJ3KQorLyoKKyAqIGhmc3BsdXNfc3VibWl0X2JpbyAtIFBlcmZyb20gYmxvY2sgSS9PCisgKiBAc2I6IHN1cGVyIGJsb2NrIG9mIHZvbHVtZSBmb3IgSS9PCisgKiBAc2VjdG9yOiBibG9jayB0byByZWFkIG9yIHdyaXRlLCBmb3IgYmxvY2tzIG9mIEhGU1BMVVNfU0VDVE9SX1NJWkUgYnl0ZXMKKyAqIEBidWY6IGJ1ZmZlciBmb3IgSS9PCisgKiBAZGF0YTogb3V0cHV0IHBvaW50ZXIgZm9yIGxvY2F0aW9uIG9mIHJlcXVlc3RlZCBkYXRhCisgKiBAcnc6IGRpcmVjdGlvbiBvZiBJL08KKyAqCisgKiBUaGUgdW5pdCBvZiBJL08gaXMgaGZzcGx1c19taW5faW9fc2l6ZShzYiksIHdoaWNoIG1heSBiZSBiaWdnZXIgdGhhbgorICogSEZTUExVU19TRUNUT1JfU0laRSwgYW5kIEBidWYgbXVzdCBiZSBzaXplZCBhY2NvcmRpbmdseS4gT24gcmVhZHMKKyAqIEBkYXRhIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIHJlcXVlc3RlZCBzZWN0b3IsCisgKiB3aGljaCBtYXkgbm90IGJlIHRoZSBzYW1lIGxvY2F0aW9uIGFzIEBidWYuCisgKgorICogSWYgQHNlY3RvciBpcyBub3QgYWxpZ25lZCB0byB0aGUgYmRldiBsb2dpY2FsIGJsb2NrIHNpemUgaXQgd2lsbAorICogYmUgcm91bmRlZCBkb3duLiBGb3Igd3JpdGVzIHRoaXMgbWVhbnMgdGhhdCBAYnVmIHNob3VsZCBjb250YWluIGRhdGEKKyAqIHRoYXQgc3RhcnRzIGF0IHRoZSByb3VuZGVkLWRvd24gYWRkcmVzcy4gQXMgbG9uZyBhcyB0aGUgZGF0YSB3YXMKKyAqIHJlYWQgdXNpbmcgaGZzcGx1c19zdWJtaXRfYmlvKCkgYW5kIHRoZSBzYW1lIGJ1ZmZlciBpcyB1c2VkIHRoaW5ncworICogd2lsbCB3b3JrIGNvcnJlY3RseS4KKyAqLworaW50IGhmc3BsdXNfc3VibWl0X2JpbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzZWN0b3JfdCBzZWN0b3IsCisJCXZvaWQgKmJ1Ziwgdm9pZCAqKmRhdGEsIGludCBydykKIHsKIAlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyh3YWl0KTsKIAlzdHJ1Y3QgYmlvICpiaW87CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGlvX3NpemU7CisJbG9mZl90IHN0YXJ0OworCWludCBvZmZzZXQ7CisKKwkvKgorCSAqIEFsaWduIHNlY3RvciB0byBoYXJkd2FyZSBzZWN0b3Igc2l6ZSBhbmQgZmluZCBvZmZzZXQuIFdlCisJICogYXNzdW1lIHRoYXQgaW9fc2l6ZSBpcyBhIHBvd2VyIG9mIHR3bywgd2hpY2ggX3Nob3VsZF8KKwkgKiBiZSB0cnVlLgorCSAqLworCWlvX3NpemUgPSBoZnNwbHVzX21pbl9pb19zaXplKHNiKTsKKwlzdGFydCA9IChsb2ZmX3Qpc2VjdG9yIDw8IEhGU1BMVVNfU0VDVE9SX1NISUZUOworCW9mZnNldCA9IHN0YXJ0ICYgKGlvX3NpemUgLSAxKTsKKwlzZWN0b3IgJj0gfigoaW9fc2l6ZSA+PiBIRlNQTFVTX1NFQ1RPUl9TSElGVCkgLSAxKTsKIAogCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgMSk7CiAJYmlvLT5iaV9zZWN0b3IgPSBzZWN0b3I7Ci0JYmlvLT5iaV9iZGV2ID0gYmRldjsKKwliaW8tPmJpX2JkZXYgPSBzYi0+c19iZGV2OwogCWJpby0+YmlfZW5kX2lvID0gaGZzcGx1c19lbmRfaW9fc3luYzsKIAliaW8tPmJpX3ByaXZhdGUgPSAmd2FpdDsKIAotCS8qCi0JICogV2UgYWx3YXlzIHN1Ym1pdCBvbmUgc2VjdG9yIGF0IGEgdGltZSwgc28gYmlvX2FkZF9wYWdlIG11c3Qgbm90IGZhaWwuCi0JICovCi0JaWYgKGJpb19hZGRfcGFnZShiaW8sIHZpcnRfdG9fcGFnZShkYXRhKSwgSEZTUExVU19TRUNUT1JfU0laRSwKLQkJCSBvZmZzZXRfaW5fcGFnZShkYXRhKSkgIT0gSEZTUExVU19TRUNUT1JfU0laRSkKLQkJQlVHKCk7CisJaWYgKCEocncgJiBXUklURSkgJiYgZGF0YSkKKwkJKmRhdGEgPSAodTggKilidWYgKyBvZmZzZXQ7CisKKwl3aGlsZSAoaW9fc2l6ZSA+IDApIHsKKwkJdW5zaWduZWQgaW50IHBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoYnVmKTsKKwkJdW5zaWduZWQgaW50IGxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgUEFHRV9TSVpFIC0gcGFnZV9vZmZzZXQsCisJCQkJCSBpb19zaXplKTsKKworCQlyZXQgPSBiaW9fYWRkX3BhZ2UoYmlvLCB2aXJ0X3RvX3BhZ2UoYnVmKSwgbGVuLCBwYWdlX29mZnNldCk7CisJCWlmIChyZXQgIT0gbGVuKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJaW9fc2l6ZSAtPSBsZW47CisJCWJ1ZiA9ICh1OCAqKWJ1ZiArIGxlbjsKKwl9CiAKIAlzdWJtaXRfYmlvKHJ3LCBiaW8pOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwogCiAJaWYgKCFiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSkpCi0JCXJldHVybiAtRUlPOwotCXJldHVybiAwOworCQlyZXQgPSAtRUlPOworCitvdXQ6CisJYmlvX3B1dChiaW8pOworCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKIH0KIAogc3RhdGljIGludCBoZnNwbHVzX3JlYWRfbWRiKHZvaWQgKmJ1ZnB0ciwgc3RydWN0IGhmc3BsdXNfd2QgKndkKQpAQCAtMTM4LDIzICsxODQsMTkgQEAKIAogCWlmIChoZnNwbHVzX2dldF9sYXN0X3Nlc3Npb24oc2IsICZwYXJ0X3N0YXJ0LCAmcGFydF9zaXplKSkKIAkJZ290byBvdXQ7Ci0JaWYgKCh1NjQpcGFydF9zdGFydCArIHBhcnRfc2l6ZSA+IDB4MTAwMDAwMDAwVUxMKSB7Ci0JCXByX2VycigiaGZzOiB2b2x1bWVzIGxhcmdlciB0aGFuIDJUQiBhcmUgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOwotCQlnb3RvIG91dDsKLQl9CiAKIAllcnJvciA9IC1FTk9NRU07Ci0Jc2JpLT5zX3ZoZHIgPSBrbWFsbG9jKEhGU1BMVVNfU0VDVE9SX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghc2JpLT5zX3ZoZHIpCisJc2JpLT5zX3ZoZHJfYnVmID0ga21hbGxvYyhoZnNwbHVzX21pbl9pb19zaXplKHNiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmktPnNfdmhkcl9idWYpCiAJCWdvdG8gb3V0OwotCXNiaS0+c19iYWNrdXBfdmhkciA9IGttYWxsb2MoSEZTUExVU19TRUNUT1JfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzYmktPnNfYmFja3VwX3ZoZHIpCisJc2JpLT5zX2JhY2t1cF92aGRyX2J1ZiA9IGttYWxsb2MoaGZzcGx1c19taW5faW9fc2l6ZShzYiksIEdGUF9LRVJORUwpOworCWlmICghc2JpLT5zX2JhY2t1cF92aGRyX2J1ZikKIAkJZ290byBvdXRfZnJlZV92aGRyOwogCiByZXJlYWQ6Ci0JZXJyb3IgPSBoZnNwbHVzX3N1Ym1pdF9iaW8oc2ItPnNfYmRldiwKLQkJCQkgICBwYXJ0X3N0YXJ0ICsgSEZTUExVU19WT0xIRUFEX1NFQ1RPUiwKLQkJCQkgICBzYmktPnNfdmhkciwgUkVBRCk7CisJZXJyb3IgPSBoZnNwbHVzX3N1Ym1pdF9iaW8oc2IsIHBhcnRfc3RhcnQgKyBIRlNQTFVTX1ZPTEhFQURfU0VDVE9SLAorCQkJCSAgIHNiaS0+c192aGRyX2J1ZiwgKHZvaWQgKiopJnNiaS0+c192aGRyLAorCQkJCSAgIFJFQUQpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZnJlZV9iYWNrdXBfdmhkcjsKIApAQCAtMTY5LDggKzIxMSw5IEBACiAJCWlmICghaGZzcGx1c19yZWFkX21kYihzYmktPnNfdmhkciwgJndkKSkKIAkJCWdvdG8gb3V0X2ZyZWVfYmFja3VwX3ZoZHI7CiAJCXdkLmFibGtfc2l6ZSA+Pj0gSEZTUExVU19TRUNUT1JfU0hJRlQ7Ci0JCXBhcnRfc3RhcnQgKz0gd2QuYWJsa19zdGFydCArIHdkLmVtYmVkX3N0YXJ0ICogd2QuYWJsa19zaXplOwotCQlwYXJ0X3NpemUgPSB3ZC5lbWJlZF9jb3VudCAqIHdkLmFibGtfc2l6ZTsKKwkJcGFydF9zdGFydCArPSAoc2VjdG9yX3Qpd2QuYWJsa19zdGFydCArCisJCQkgICAgICAgKHNlY3Rvcl90KXdkLmVtYmVkX3N0YXJ0ICogd2QuYWJsa19zaXplOworCQlwYXJ0X3NpemUgPSAoc2VjdG9yX3Qpd2QuZW1iZWRfY291bnQgKiB3ZC5hYmxrX3NpemU7CiAJCWdvdG8gcmVyZWFkOwogCWRlZmF1bHQ6CiAJCS8qCkBAIC0xODMsOSArMjI2LDkgQEAKIAkJZ290byByZXJlYWQ7CiAJfQogCi0JZXJyb3IgPSBoZnNwbHVzX3N1Ym1pdF9iaW8oc2ItPnNfYmRldiwKLQkJCQkgICBwYXJ0X3N0YXJ0ICsgcGFydF9zaXplIC0gMiwKLQkJCQkgICBzYmktPnNfYmFja3VwX3ZoZHIsIFJFQUQpOworCWVycm9yID0gaGZzcGx1c19zdWJtaXRfYmlvKHNiLCBwYXJ0X3N0YXJ0ICsgcGFydF9zaXplIC0gMiwKKwkJCQkgICBzYmktPnNfYmFja3VwX3ZoZHJfYnVmLAorCQkJCSAgICh2b2lkICoqKSZzYmktPnNfYmFja3VwX3ZoZHIsIFJFQUQpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZnJlZV9iYWNrdXBfdmhkcjsKIApkaWZmIC0tZ2l0IGEvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMgYi9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYwppbmRleCAyNjM4YzgzNGUuLjBkMjJhZmQgMTAwNjQ0Ci0tLSBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCisrKyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCkBAIC0zNjIsOSArMzYyLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBob3N0ZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK2ludCBob3N0ZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKQogewotCXJldHVybiBmc3luY19maWxlKEhPU1RGU19JKGZpbGUtPmZfbWFwcGluZy0+aG9zdCktPmZkLCBkYXRhc3luYyk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlpbnQgcmV0OworCisJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCXJldCA9IGZzeW5jX2ZpbGUoSE9TVEZTX0koaW5vZGUpLT5mZCwgZGF0YXN5bmMpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG9zdGZzX2ZpbGVfZm9wcyA9IHsKQEAgLTc0OCwxMiArNzU5LDEyIEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGhvc3Rmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vLCBpbnQgZGVzaXJlZCwgdW5zaWduZWQgaW50IGZsYWdzKQoraW50IGhvc3Rmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vLCBpbnQgZGVzaXJlZCkKIHsKIAljaGFyICpuYW1lOwogCWludCByID0gMCwgdyA9IDAsIHggPSAwLCBlcnI7CiAKLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKKwlpZiAoZGVzaXJlZCAmIE1BWV9OT1RfQkxPQ0spCiAJCXJldHVybiAtRUNISUxEOwogCiAJaWYgKGRlc2lyZWQgJiBNQVlfUkVBRCkgciA9IDE7CkBAIC03NzAsNyArNzgxLDcgQEAKIAkJZXJyID0gYWNjZXNzX2ZpbGUobmFtZSwgciwgdywgeCk7CiAJX19wdXRuYW1lKG5hbWUpOwogCWlmICghZXJyKQotCQllcnIgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vLCBkZXNpcmVkLCBmbGFncywgTlVMTCk7CisJCWVyciA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm8sIGRlc2lyZWQpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvZGlyLmMgYi9mcy9ocGZzL2Rpci5jCmluZGV4IGY0NmFlMDIuLjk2YThlZDkgMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvZGlyLmMKKysrIGIvZnMvaHBmcy9kaXIuYwpAQCAtMjksNiArMjksMTAgQEAKIAlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICpocGZzX2lub2RlID0gaHBmc19pKGkpOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGktPmlfc2I7CiAKKwkvKiBTb21lYm9keSBlbHNlIHdpbGwgaGF2ZSB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZSAqLworCWlmICh3aGVuY2UgPT0gU0VFS19EQVRBIHx8IHdoZW5jZSA9PSBTRUVLX0hPTEUpCisJCXJldHVybiAtRUlOVkFMOworCiAJaHBmc19sb2NrKHMpOwogCiAJLypwcmludGsoImRpciBsc2Vla1xuIik7Ki8KZGlmZiAtLWdpdCBhL2ZzL2hwZnMvZmlsZS5jIGIvZnMvaHBmcy9maWxlLmMKaW5kZXggODljNTAwZS4uODlkMmE1OCAxMDA2NDQKLS0tIGEvZnMvaHBmcy9maWxlLmMKKysrIGIvZnMvaHBmcy9maWxlLmMKQEAgLTE4LDkgKzE4LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBocGZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK2ludCBocGZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJaW50IHJldDsKKworCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoZmlsZS0+Zl9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCXJldHVybiBzeW5jX2Jsb2NrZGV2KGlub2RlLT5pX3NiLT5zX2JkZXYpOwogfQogCmRpZmYgLS1naXQgYS9mcy9ocGZzL2hwZnNfZm4uaCBiL2ZzL2hwZnMvaHBmc19mbi5oCmluZGV4IGRkNTUyZjguLjMzMWI1ZTIgMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvaHBmc19mbi5oCisrKyBiL2ZzL2hwZnMvaHBmc19mbi5oCkBAIC0yNTgsNyArMjU4LDcgQEAKIAogLyogZmlsZS5jICovCiAKLWludCBocGZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKiwgaW50KTsKK2ludCBocGZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBsb2ZmX3QsIGludCk7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBocGZzX2ZpbGVfb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGhwZnNfZmlsZV9pb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaHBmc19hb3BzOwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9uYW1laS5jIGIvZnMvaHBmcy9uYW1laS5jCmluZGV4IGFjZjk1ZGEuLjJkZjY5ZTIgMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvbmFtZWkuYworKysgYi9mcy9ocGZzL25hbWVpLmMKQEAgLTM5OCw3ICszOTgsNyBAQAogCQkJaHBmc191bmxvY2soZGlyLT5pX3NiKTsKIAkJCXJldHVybiAtRU5PU1BDOwogCQl9Ci0JCWlmIChnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgMCwgTlVMTCkgfHwKKwkJaWYgKGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFKSB8fAogCQkgICAgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwKIAkJICAgIGdldF93cml0ZV9hY2Nlc3MoaW5vZGUpKSB7CiAJCQlkX3JlaGFzaChkZW50cnkpOwpkaWZmIC0tZ2l0IGEvZnMvaHBwZnMvaHBwZnMuYyBiL2ZzL2hwcGZzL2hwcGZzLmMKaW5kZXggODdlZDQ4ZS4uODYzNWJlNSAxMDA2NDQKLS0tIGEvZnMvaHBwZnMvaHBwZnMuYworKysgYi9mcy9ocHBmcy9ocHBmcy5jCkBAIC0xMzksNyArMTM5LDggQEAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpocHBmc19sb29rdXAoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeSwgKm5ldywgKnBhcmVudDsKKwlzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeSwgKnBhcmVudDsKKwlzdHJ1Y3QgcXN0ciAqbmFtZSA9ICZkZW50cnktPmRfbmFtZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWludCBlcnIsIGRlbGV0ZWQ7CiAKQEAgLTE0OSwyMyArMTUwLDkgQEAKIAllbHNlIGlmIChkZWxldGVkKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIAotCWVyciA9IC1FTk9NRU07CiAJcGFyZW50ID0gSFBQRlNfSShpbm8pLT5wcm9jX2RlbnRyeTsKIAltdXRleF9sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCXByb2NfZGVudHJ5ID0gZF9sb29rdXAocGFyZW50LCAmZGVudHJ5LT5kX25hbWUpOwotCWlmIChwcm9jX2RlbnRyeSA9PSBOVUxMKSB7Ci0JCXByb2NfZGVudHJ5ID0gZF9hbGxvYyhwYXJlbnQsICZkZW50cnktPmRfbmFtZSk7Ci0JCWlmIChwcm9jX2RlbnRyeSA9PSBOVUxMKSB7Ci0JCQltdXRleF91bmxvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQluZXcgPSAoKnBhcmVudC0+ZF9pbm9kZS0+aV9vcC0+bG9va3VwKShwYXJlbnQtPmRfaW5vZGUsCi0JCQkJCQkgICAgICAgcHJvY19kZW50cnksIE5VTEwpOwotCQlpZiAobmV3KSB7Ci0JCQlkcHV0KHByb2NfZGVudHJ5KTsKLQkJCXByb2NfZGVudHJ5ID0gbmV3OwotCQl9Ci0JfQorCXByb2NfZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZS0+bmFtZSwgcGFyZW50LCBuYW1lLT5sZW4pOwogCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAogCWlmIChJU19FUlIocHJvY19kZW50cnkpKQpAQCAtMTc0LDEzICsxNjEsMTEgQEAKIAllcnIgPSAtRU5PTUVNOwogCWlub2RlID0gZ2V0X2lub2RlKGluby0+aV9zYiwgcHJvY19kZW50cnkpOwogCWlmICghaW5vZGUpCi0JCWdvdG8gb3V0X2RwdXQ7CisJCWdvdG8gb3V0OwogCiAgCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCXJldHVybiBOVUxMOwogCi0gb3V0X2RwdXQ6Ci0JZHB1dChwcm9jX2RlbnRyeSk7CiAgb3V0OgogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CkBAIC01ODgsOSArNTczLDEwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBocHBmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQorc3RhdGljIGludCBocHBmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkgICAgICAgaW50IGRhdGFzeW5jKQogewotCXJldHVybiAwOworCXJldHVybiBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGZpbGUtPmZfbWFwcGluZywgc3RhcnQsIGVuZCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhwcGZzX2Rpcl9mb3BzID0gewpAQCAtNjkwLDggKzY3NiwxMCBAQAogCXN0cnVjdCBpbm9kZSAqcHJvY19pbm8gPSBkZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzYik7CiAKLQlpZiAoIWlub2RlKQorCWlmICghaW5vZGUpIHsKKwkJZHB1dChkZW50cnkpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CiAKIAlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpIHsKIAkJaW5vZGUtPmlfb3AgPSAmaHBwZnNfZGlyX2lvcHM7CkBAIC03MDQsNyArNjkyLDcgQEAKIAkJaW5vZGUtPmlfZm9wID0gJmhwcGZzX2ZpbGVfZm9wczsKIAl9CiAKLQlIUFBGU19JKGlub2RlKS0+cHJvY19kZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisJSFBQRlNfSShpbm9kZSktPnByb2NfZGVudHJ5ID0gZGVudHJ5OwogCiAJaW5vZGUtPmlfdWlkID0gcHJvY19pbm8tPmlfdWlkOwogCWlub2RlLT5pX2dpZCA9IHByb2NfaW5vLT5pX2dpZDsKQEAgLTczNyw3ICs3MjUsNyBAQAogCXNiLT5zX2ZzX2luZm8gPSBwcm9jX21udDsKIAogCWVyciA9IC1FTk9NRU07Ci0Jcm9vdF9pbm9kZSA9IGdldF9pbm9kZShzYiwgcHJvY19tbnQtPm1udF9zYi0+c19yb290KTsKKwlyb290X2lub2RlID0gZ2V0X2lub2RlKHNiLCBkZ2V0KHByb2NfbW50LT5tbnRfc2ItPnNfcm9vdCkpOwogCWlmICghcm9vdF9pbm9kZSkKIAkJZ290byBvdXRfbW50cHV0OwogCmRpZmYgLS1naXQgYS9mcy9odWdldGxiZnMvaW5vZGUuYyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCmluZGV4IDdhYWZlYjguLjg3YjZlMDQgMTAwNjQ0Ci0tLSBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCisrKyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCkBAIC05NCw3ICs5NCw3IEBACiAJdm1hLT52bV9mbGFncyB8PSBWTV9IVUdFVExCIHwgVk1fUkVTRVJWRUQ7CiAJdm1hLT52bV9vcHMgPSAmaHVnZXRsYl92bV9vcHM7CiAKLQlpZiAodm1hLT52bV9wZ29mZiAmIH4oaHVnZV9wYWdlX21hc2soaCkgPj4gUEFHRV9TSElGVCkpCisJaWYgKHZtYS0+dm1fcGdvZmYgJiAofmh1Z2VfcGFnZV9tYXNrKGgpID4+IFBBR0VfU0hJRlQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXZtYV9sZW4gPSAobG9mZl90KSh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOwpAQCAtMTAzMCw2ICsxMDMwLDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2h1Z2V0bGJmc19mcyh2b2lkKQogewogCWttZW1fY2FjaGVfZGVzdHJveShodWdldGxiZnNfaW5vZGVfY2FjaGVwKTsKKwlrZXJuX3VubW91bnQoaHVnZXRsYmZzX3Zmc21vdW50KTsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmh1Z2V0bGJmc19mc190eXBlKTsKIAliZGlfZGVzdHJveSgmaHVnZXRsYmZzX2JhY2tpbmdfZGV2X2luZm8pOwogfQpkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggMGY3ZTg4YS4uOTZjNzdiOCAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYworKysgYi9mcy9pbm9kZS5jCkBAIC0zMyw4ICszMyw4IEBACiAgKgogICogaW5vZGUtPmlfbG9jayBwcm90ZWN0czoKICAqICAgaW5vZGUtPmlfc3RhdGUsIGlub2RlLT5pX2hhc2gsIF9faWdldCgpCi0gKiBpbm9kZV9scnVfbG9jayBwcm90ZWN0czoKLSAqICAgaW5vZGVfbHJ1LCBpbm9kZS0+aV9scnUKKyAqIGlub2RlLT5pX3NiLT5zX2lub2RlX2xydV9sb2NrIHByb3RlY3RzOgorICogICBpbm9kZS0+aV9zYi0+c19pbm9kZV9scnUsIGlub2RlLT5pX2xydQogICogaW5vZGVfc2JfbGlzdF9sb2NrIHByb3RlY3RzOgogICogICBzYi0+c19pbm9kZXMsIGlub2RlLT5pX3NiX2xpc3QKICAqIGlub2RlX3diX2xpc3RfbG9jayBwcm90ZWN0czoKQEAgLTQ2LDcgKzQ2LDcgQEAKICAqCiAgKiBpbm9kZV9zYl9saXN0X2xvY2sKICAqICAgaW5vZGUtPmlfbG9jawotICogICAgIGlub2RlX2xydV9sb2NrCisgKiAgICAgaW5vZGUtPmlfc2ItPnNfaW5vZGVfbHJ1X2xvY2sKICAqCiAgKiBpbm9kZV93Yl9saXN0X2xvY2sKICAqICAgaW5vZGUtPmlfbG9jawpAQCAtNjQsMjQgKzY0LDEwIEBACiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgKmlub2RlX2hhc2h0YWJsZSBfX3JlYWRfbW9zdGx5Owogc3RhdGljIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wIERFRklORV9TUElOTE9DSyhpbm9kZV9oYXNoX2xvY2spOwogCi1zdGF0aWMgTElTVF9IRUFEKGlub2RlX2xydSk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlub2RlX2xydV9sb2NrKTsKLQogX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGlub2RlX3NiX2xpc3RfbG9jayk7CiBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0soaW5vZGVfd2JfbGlzdF9sb2NrKTsKIAogLyoKLSAqIGlwcnVuZV9zZW0gcHJvdmlkZXMgZXhjbHVzaW9uIGJldHdlZW4gdGhlIGljYWNoZSBzaHJpbmtpbmcgYW5kIHRoZQotICogdW1vdW50IHBhdGguCi0gKgotICogV2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCBpdCB0byBwcm90ZWN0IGFueXRoaW5nIGluIHRoZSB1bW91bnQgcGF0aCwKLSAqIGJ1dCBvbmx5IG5lZWQgdG8gY3ljbGUgdGhyb3VnaCBpdCB0byBtYWtlIHN1cmUgYW55IGlub2RlIHRoYXQKLSAqIHBydW5lX2ljYWNoZSB0b29rIG9mZiB0aGUgTFJVIGxpc3QgaGFzIGJlZW4gZnVsbHkgdG9ybiBkb3duIGJ5IHRoZQotICogdGltZSB3ZSBhcmUgcGFzdCBldmljdF9pbm9kZXMuCi0gKi8KLXN0YXRpYyBERUNMQVJFX1JXU0VNKGlwcnVuZV9zZW0pOwotCi0vKgogICogRW1wdHkgYW9wcy4gQ2FuIGJlIHVzZWQgZm9yIHRoZSBjYXNlcyB3aGVyZSB0aGUgdXNlciBkb2VzIG5vdAogICogZGVmaW5lIGFueSBvZiB0aGUgYWRkcmVzc19zcGFjZSBvcGVyYXRpb25zLgogICovCkBAIC05NSw2ICs4MSw3IEBACiBzdHJ1Y3QgaW5vZGVzX3N0YXRfdCBpbm9kZXNfc3RhdDsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgbnJfaW5vZGVzKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIG5yX3VudXNlZCk7CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaW5vZGVfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CiAKQEAgLTEwOSw3ICs5NiwxMSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBnZXRfbnJfaW5vZGVzX3VudXNlZCh2b2lkKQogewotCXJldHVybiBpbm9kZXNfc3RhdC5ucl91bnVzZWQ7CisJaW50IGk7CisJaW50IHN1bSA9IDA7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCisJCXN1bSArPSBwZXJfY3B1KG5yX3VudXNlZCwgaSk7CisJcmV0dXJuIHN1bSA8IDAgPyAwIDogc3VtOwogfQogCiBpbnQgZ2V0X25yX2RpcnR5X2lub2Rlcyh2b2lkKQpAQCAtMTI3LDYgKzExOCw3IEBACiAJCSAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCWlub2Rlc19zdGF0Lm5yX2lub2RlcyA9IGdldF9ucl9pbm9kZXMoKTsKKwlpbm9kZXNfc3RhdC5ucl91bnVzZWQgPSBnZXRfbnJfaW5vZGVzX3VudXNlZCgpOwogCXJldHVybiBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIH0KICNlbmRpZgpAQCAtMTc2LDggKzE2OCw3IEBACiAJbXV0ZXhfaW5pdCgmaW5vZGUtPmlfbXV0ZXgpOwogCWxvY2tkZXBfc2V0X2NsYXNzKCZpbm9kZS0+aV9tdXRleCwgJnNiLT5zX3R5cGUtPmlfbXV0ZXhfa2V5KTsKIAotCWluaXRfcndzZW0oJmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0JbG9ja2RlcF9zZXRfY2xhc3MoJmlub2RlLT5pX2FsbG9jX3NlbSwgJnNiLT5zX3R5cGUtPmlfYWxsb2Nfc2VtX2tleSk7CisJYXRvbWljX3NldCgmaW5vZGUtPmlfZGlvX2NvdW50LCAwKTsKIAogCW1hcHBpbmctPmFfb3BzID0gJmVtcHR5X2FvcHM7CiAJbWFwcGluZy0+aG9zdCA9IGlub2RlOwpAQCAtMzM3LDIyICszMjgsMjQgQEAKIAogc3RhdGljIHZvaWQgaW5vZGVfbHJ1X2xpc3RfYWRkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3Bpbl9sb2NrKCZpbm9kZV9scnVfbG9jayk7CisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9zYi0+c19pbm9kZV9scnVfbG9jayk7CiAJaWYgKGxpc3RfZW1wdHkoJmlub2RlLT5pX2xydSkpIHsKLQkJbGlzdF9hZGQoJmlub2RlLT5pX2xydSwgJmlub2RlX2xydSk7Ci0JCWlub2Rlc19zdGF0Lm5yX3VudXNlZCsrOworCQlsaXN0X2FkZCgmaW5vZGUtPmlfbHJ1LCAmaW5vZGUtPmlfc2ItPnNfaW5vZGVfbHJ1KTsKKwkJaW5vZGUtPmlfc2ItPnNfbnJfaW5vZGVzX3VudXNlZCsrOworCQl0aGlzX2NwdV9pbmMobnJfdW51c2VkKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmlub2RlX2xydV9sb2NrKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfc2ItPnNfaW5vZGVfbHJ1X2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBpbm9kZV9scnVfbGlzdF9kZWwoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzcGluX2xvY2soJmlub2RlX2xydV9sb2NrKTsKKwlzcGluX2xvY2soJmlub2RlLT5pX3NiLT5zX2lub2RlX2xydV9sb2NrKTsKIAlpZiAoIWxpc3RfZW1wdHkoJmlub2RlLT5pX2xydSkpIHsKIAkJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfbHJ1KTsKLQkJaW5vZGVzX3N0YXQubnJfdW51c2VkLS07CisJCWlub2RlLT5pX3NiLT5zX25yX2lub2Rlc191bnVzZWQtLTsKKwkJdGhpc19jcHVfZGVjKG5yX3VudXNlZCk7CiAJfQotCXNwaW5fdW5sb2NrKCZpbm9kZV9scnVfbG9jayk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX3NiLT5zX2lub2RlX2xydV9sb2NrKTsKIH0KIAogLyoqCkBAIC00MjMsNyArNDE2LDE0IEBACiB2b2lkIGVuZF93cml0ZWJhY2soc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAltaWdodF9zbGVlcCgpOworCS8qCisJICogV2UgaGF2ZSB0byBjeWNsZSB0cmVlX2xvY2sgaGVyZSBiZWNhdXNlIHJlY2xhaW0gY2FuIGJlIHN0aWxsIGluIHRoZQorCSAqIHByb2Nlc3Mgb2YgcmVtb3ZpbmcgdGhlIGxhc3QgcGFnZSAoaW4gX19kZWxldGVfZnJvbV9wYWdlX2NhY2hlKCkpCisJICogYW5kIHdlIG11c3Qgbm90IGZyZWUgbWFwcGluZyB1bmRlciBpdC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZpbm9kZS0+aV9kYXRhLnRyZWVfbG9jayk7CiAJQlVHX09OKGlub2RlLT5pX2RhdGEubnJwYWdlcyk7CisJc3Bpbl91bmxvY2tfaXJxKCZpbm9kZS0+aV9kYXRhLnRyZWVfbG9jayk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZpbm9kZS0+aV9kYXRhLnByaXZhdGVfbGlzdCkpOwogCUJVR19PTighKGlub2RlLT5pX3N0YXRlICYgSV9GUkVFSU5HKSk7CiAJQlVHX09OKGlub2RlLT5pX3N0YXRlICYgSV9DTEVBUik7CkBAIC01MzAsMTQgKzUzMCw2IEBACiAJc3Bpbl91bmxvY2soJmlub2RlX3NiX2xpc3RfbG9jayk7CiAKIAlkaXNwb3NlX2xpc3QoJmRpc3Bvc2UpOwotCi0JLyoKLQkgKiBDeWNsZSB0aHJvdWdoIGlwcnVuZV9zZW0gdG8gbWFrZSBzdXJlIGFueSBpbm9kZSB0aGF0IHBydW5lX2ljYWNoZQotCSAqIG1vdmVkIG9mZiB0aGUgbGlzdCBiZWZvcmUgd2UgdG9vayB0aGUgbG9jayBoYXMgYmVlbiBmdWxseSB0b3JuCi0JICogZG93bi4KLQkgKi8KLQlkb3duX3dyaXRlKCZpcHJ1bmVfc2VtKTsKLQl1cF93cml0ZSgmaXBydW5lX3NlbSk7CiB9CiAKIC8qKgpAQCAtNjAwLDggKzU5MiwxMCBAQAogfQogCiAvKgotICogU2NhbiBgZ29hbCcgaW5vZGVzIG9uIHRoZSB1bnVzZWQgbGlzdCBmb3IgZnJlZWFibGUgb25lcy4gVGhleSBhcmUgbW92ZWQgdG8gYQotICogdGVtcG9yYXJ5IGxpc3QgYW5kIHRoZW4gYXJlIGZyZWVkIG91dHNpZGUgaW5vZGVfbHJ1X2xvY2sgYnkgZGlzcG9zZV9saXN0KCkuCisgKiBXYWxrIHRoZSBzdXBlcmJsb2NrIGlub2RlIExSVSBmb3IgZnJlZWFibGUgaW5vZGVzIGFuZCBhdHRlbXB0IHRvIGZyZWUgdGhlbS4KKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIHN1cGVyYmxvY2sgc2hyaW5rZXIgZnVuY3Rpb24gd2l0aCBhIG51bWJlciBvZiBpbm9kZXMKKyAqIHRvIHRyaW0gZnJvbSB0aGUgTFJVLiBJbm9kZXMgdG8gYmUgZnJlZWQgYXJlIG1vdmVkIHRvIGEgdGVtcG9yYXJ5IGxpc3QgYW5kCisgKiB0aGVuIGFyZSBmcmVlZCBvdXRzaWRlIGlub2RlX2xvY2sgYnkgZGlzcG9zZV9saXN0KCkuCiAgKgogICogQW55IGlub2RlcyB3aGljaCBhcmUgcGlubmVkIHB1cmVseSBiZWNhdXNlIG9mIGF0dGFjaGVkIHBhZ2VjYWNoZSBoYXZlIHRoZWlyCiAgKiBwYWdlY2FjaGUgcmVtb3ZlZC4gIElmIHRoZSBpbm9kZSBoYXMgbWV0YWRhdGEgYnVmZmVycyBhdHRhY2hlZCB0bwpAQCAtNjE1LDI5ICs2MDksMjggQEAKICAqIExSVSBkb2VzIG5vdCBoYXZlIHN0cmljdCBvcmRlcmluZy4gSGVuY2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNsYWltIGlub2RlcwogICogd2l0aCB0aGlzIGZsYWcgc2V0IGJlY2F1c2UgdGhleSBhcmUgdGhlIGlub2RlcyB0aGF0IGFyZSBvdXQgb2Ygb3JkZXIuCiAgKi8KLXN0YXRpYyB2b2lkIHBydW5lX2ljYWNoZShpbnQgbnJfdG9fc2NhbikKK3ZvaWQgcHJ1bmVfaWNhY2hlX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBucl90b19zY2FuKQogewogCUxJU1RfSEVBRChmcmVlYWJsZSk7CiAJaW50IG5yX3NjYW5uZWQ7CiAJdW5zaWduZWQgbG9uZyByZWFwID0gMDsKIAotCWRvd25fcmVhZCgmaXBydW5lX3NlbSk7Ci0Jc3Bpbl9sb2NrKCZpbm9kZV9scnVfbG9jayk7Ci0JZm9yIChucl9zY2FubmVkID0gMDsgbnJfc2Nhbm5lZCA8IG5yX3RvX3NjYW47IG5yX3NjYW5uZWQrKykgeworCXNwaW5fbG9jaygmc2ItPnNfaW5vZGVfbHJ1X2xvY2spOworCWZvciAobnJfc2Nhbm5lZCA9IG5yX3RvX3NjYW47IG5yX3NjYW5uZWQgPj0gMDsgbnJfc2Nhbm5lZC0tKSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKLQkJaWYgKGxpc3RfZW1wdHkoJmlub2RlX2xydSkpCisJCWlmIChsaXN0X2VtcHR5KCZzYi0+c19pbm9kZV9scnUpKQogCQkJYnJlYWs7CiAKLQkJaW5vZGUgPSBsaXN0X2VudHJ5KGlub2RlX2xydS5wcmV2LCBzdHJ1Y3QgaW5vZGUsIGlfbHJ1KTsKKwkJaW5vZGUgPSBsaXN0X2VudHJ5KHNiLT5zX2lub2RlX2xydS5wcmV2LCBzdHJ1Y3QgaW5vZGUsIGlfbHJ1KTsKIAogCQkvKgotCQkgKiB3ZSBhcmUgaW52ZXJ0aW5nIHRoZSBpbm9kZV9scnVfbG9jay9pbm9kZS0+aV9sb2NrIGhlcmUsCisJCSAqIHdlIGFyZSBpbnZlcnRpbmcgdGhlIHNiLT5zX2lub2RlX2xydV9sb2NrL2lub2RlLT5pX2xvY2sgaGVyZSwKIAkJICogc28gdXNlIGEgdHJ5bG9jay4gSWYgd2UgZmFpbCB0byBnZXQgdGhlIGxvY2ssIGp1c3QgbW92ZSB0aGUKIAkJICogaW5vZGUgdG8gdGhlIGJhY2sgb2YgdGhlIGxpc3Qgc28gd2UgZG9uJ3Qgc3BpbiBvbiBpdC4KIAkJICovCiAJCWlmICghc3Bpbl90cnlsb2NrKCZpbm9kZS0+aV9sb2NrKSkgewotCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9scnUsICZpbm9kZV9scnUpOworCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9scnUsICZzYi0+c19pbm9kZV9scnUpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNjQ5LDI4ICs2NDIsMjkgQEAKIAkJICAgIChpbm9kZS0+aV9zdGF0ZSAmIH5JX1JFRkVSRU5DRUQpKSB7CiAJCQlsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9scnUpOwogCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwotCQkJaW5vZGVzX3N0YXQubnJfdW51c2VkLS07CisJCQlzYi0+c19ucl9pbm9kZXNfdW51c2VkLS07CisJCQl0aGlzX2NwdV9kZWMobnJfdW51c2VkKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJLyogcmVjZW50bHkgcmVmZXJlbmNlZCBpbm9kZXMgZ2V0IG9uZSBtb3JlIHBhc3MgKi8KIAkJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9SRUZFUkVOQ0VEKSB7CiAJCQlpbm9kZS0+aV9zdGF0ZSAmPSB+SV9SRUZFUkVOQ0VEOwotCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9scnUsICZpbm9kZV9scnUpOworCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9scnUsICZzYi0+c19pbm9kZV9scnUpOwogCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKGlub2RlX2hhc19idWZmZXJzKGlub2RlKSB8fCBpbm9kZS0+aV9kYXRhLm5ycGFnZXMpIHsKIAkJCV9faWdldChpbm9kZSk7CiAJCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JCQlzcGluX3VubG9jaygmaW5vZGVfbHJ1X2xvY2spOworCQkJc3Bpbl91bmxvY2soJnNiLT5zX2lub2RlX2xydV9sb2NrKTsKIAkJCWlmIChyZW1vdmVfaW5vZGVfYnVmZmVycyhpbm9kZSkpCiAJCQkJcmVhcCArPSBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoJmlub2RlLT5pX2RhdGEsCiAJCQkJCQkJCTAsIC0xKTsKIAkJCWlwdXQoaW5vZGUpOwotCQkJc3Bpbl9sb2NrKCZpbm9kZV9scnVfbG9jayk7CisJCQlzcGluX2xvY2soJnNiLT5zX2lub2RlX2xydV9sb2NrKTsKIAotCQkJaWYgKGlub2RlICE9IGxpc3RfZW50cnkoaW5vZGVfbHJ1Lm5leHQsCisJCQlpZiAoaW5vZGUgIT0gbGlzdF9lbnRyeShzYi0+c19pbm9kZV9scnUubmV4dCwKIAkJCQkJCXN0cnVjdCBpbm9kZSwgaV9scnUpKQogCQkJCWNvbnRpbnVlOwkvKiB3cm9uZyBpbm9kZSBvciBsaXN0X2VtcHR5ICovCiAJCQkvKiBhdm9pZCBsb2NrIGludmVyc2lvbnMgd2l0aCB0cnlsb2NrICovCkBAIC02ODYsNTEgKzY4MCwxOCBAQAogCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAKIAkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9scnUsICZmcmVlYWJsZSk7Ci0JCWlub2Rlc19zdGF0Lm5yX3VudXNlZC0tOworCQlzYi0+c19ucl9pbm9kZXNfdW51c2VkLS07CisJCXRoaXNfY3B1X2RlYyhucl91bnVzZWQpOwogCX0KIAlpZiAoY3VycmVudF9pc19rc3dhcGQoKSkKIAkJX19jb3VudF92bV9ldmVudHMoS1NXQVBEX0lOT0RFU1RFQUwsIHJlYXApOwogCWVsc2UKIAkJX19jb3VudF92bV9ldmVudHMoUEdJTk9ERVNURUFMLCByZWFwKTsKLQlzcGluX3VubG9jaygmaW5vZGVfbHJ1X2xvY2spOworCXNwaW5fdW5sb2NrKCZzYi0+c19pbm9kZV9scnVfbG9jayk7CiAKIAlkaXNwb3NlX2xpc3QoJmZyZWVhYmxlKTsKLQl1cF9yZWFkKCZpcHJ1bmVfc2VtKTsKIH0KIAotLyoKLSAqIHNocmlua19pY2FjaGVfbWVtb3J5KCkgd2lsbCBhdHRlbXB0IHRvIHJlY2xhaW0gc29tZSB1bnVzZWQgaW5vZGVzLiAgSGVyZSwKLSAqICJ1bnVzZWQiIG1lYW5zIHRoYXQgbm8gZGVudHJpZXMgYXJlIHJlZmVycmluZyB0byB0aGUgaW5vZGVzOiB0aGUgZmlsZXMgYXJlCi0gKiBub3Qgb3BlbiBhbmQgdGhlIGRjYWNoZSByZWZlcmVuY2VzIHRvIHRob3NlIGlub2RlcyBoYXZlIGFscmVhZHkgYmVlbgotICogcmVjbGFpbWVkLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBudW1iZXIgb2YgaW5vZGVzIHRvIHNjYW4sIGFuZCBpdCByZXR1cm5zIHRoZQotICogdG90YWwgbnVtYmVyIG9mIHJlbWFpbmluZyBwb3NzaWJseS1yZWNsYWltYWJsZSBpbm9kZXMuCi0gKi8KLXN0YXRpYyBpbnQgc2hyaW5rX2ljYWNoZV9tZW1vcnkoc3RydWN0IHNocmlua2VyICpzaHJpbmssCi0JCQkJc3RydWN0IHNocmlua19jb250cm9sICpzYykKLXsKLQlpbnQgbnIgPSBzYy0+bnJfdG9fc2NhbjsKLQlnZnBfdCBnZnBfbWFzayA9IHNjLT5nZnBfbWFzazsKLQotCWlmIChucikgewotCQkvKgotCQkgKiBOYXN0eSBkZWFkbG9jayBhdm9pZGFuY2UuICBXZSBtYXkgaG9sZCB2YXJpb3VzIEZTIGxvY2tzLAotCQkgKiBhbmQgd2UgZG9uJ3Qgd2FudCB0byByZWN1cnNlIGludG8gdGhlIEZTIHRoYXQgY2FsbGVkIHVzCi0JCSAqIGluIGNsZWFyX2lub2RlKCkgYW5kIGZyaWVuZHMuLgotCQkgKi8KLQkJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9GUykpCi0JCQlyZXR1cm4gLTE7Ci0JCXBydW5lX2ljYWNoZShucik7Ci0JfQotCXJldHVybiAoZ2V0X25yX2lub2Rlc191bnVzZWQoKSAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOwotfQotCi1zdGF0aWMgc3RydWN0IHNocmlua2VyIGljYWNoZV9zaHJpbmtlciA9IHsKLQkuc2hyaW5rID0gc2hyaW5rX2ljYWNoZV9tZW1vcnksCi0JLnNlZWtzID0gREVGQVVMVF9TRUVLUywKLX07Ci0KIHN0YXRpYyB2b2lkIF9fd2FpdF9vbl9mcmVlaW5nX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogLyoKICAqIENhbGxlZCB3aXRoIHRoZSBpbm9kZSBsb2NrIGhlbGQuCkBAIC0xMzI0LDcgKzEyODUsNyBAQAogCiAJV0FSTl9PTihpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKTsKIAotCWlmIChvcCAmJiBvcC0+ZHJvcF9pbm9kZSkKKwlpZiAob3AtPmRyb3BfaW5vZGUpCiAJCWRyb3AgPSBvcC0+ZHJvcF9pbm9kZShpbm9kZSk7CiAJZWxzZQogCQlkcm9wID0gZ2VuZXJpY19kcm9wX2lub2RlKGlub2RlKTsKQEAgLTE2MTAsNyArMTU3MSw2IEBACiAJCQkJCSAoU0xBQl9SRUNMQUlNX0FDQ09VTlR8U0xBQl9QQU5JQ3wKIAkJCQkJIFNMQUJfTUVNX1NQUkVBRCksCiAJCQkJCSBpbml0X29uY2UpOwotCXJlZ2lzdGVyX3Nocmlua2VyKCZpY2FjaGVfc2hyaW5rZXIpOwogCiAJLyogSGFzaCBtYXkgaGF2ZSBiZWVuIHNldCB1cCBpbiBpbm9kZV9pbml0X2Vhcmx5ICovCiAJaWYgKCFoYXNoZGlzdCkKZGlmZiAtLWdpdCBhL2ZzL2ludGVybmFsLmggYi9mcy9pbnRlcm5hbC5oCmluZGV4IGIyOWM0NmUuLmZlMzI3YzIgMTAwNjQ0Ci0tLSBhL2ZzL2ludGVybmFsLmgKKysrIGIvZnMvaW50ZXJuYWwuaApAQCAtOTcsNiArOTcsNyBAQAogICogc3VwZXIuYwogICovCiBleHRlcm4gaW50IGRvX3JlbW91bnRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgdm9pZCAqLCBpbnQpOworZXh0ZXJuIGJvb2wgZ3JhYl9zdXBlcl9wYXNzaXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogZXh0ZXJuIHZvaWQgX19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBleHRlcm4gdm9pZCBwdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBleHRlcm4gc3RydWN0IGRlbnRyeSAqbW91bnRfZnMoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiwKQEAgLTEzNSwzICsxMzYsOCBAQAogZXh0ZXJuIGludCBnZXRfbnJfZGlydHlfaW5vZGVzKHZvaWQpOwogZXh0ZXJuIHZvaWQgZXZpY3RfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiBpbnQgaW52YWxpZGF0ZV9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGJvb2wpOworCisvKgorICogZGNhY2hlLmMKKyAqLworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKl9fZF9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3Qgc3RydWN0IHFzdHIgKik7CmRpZmYgLS1naXQgYS9mcy9pc29mcy9kaXIuYyBiL2ZzL2lzb2ZzL2Rpci5jCmluZGV4IDA1NDJiNmUuLmYyMDQzN2MgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2Rpci5jCisrKyBiL2ZzL2lzb2ZzL2Rpci5jCkBAIC0yNTQsMTkgKzI1NCwxNiBAQAogCWNoYXIgKnRtcG5hbWU7CiAJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICp0bXBkZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlzdHJ1Y3QgaXNvZnNfc2JfaW5mbyAqc2JpID0gSVNPRlNfU0IoaW5vZGUtPmlfc2IpOwogCiAJdG1wbmFtZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICh0bXBuYW1lID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbXV0ZXhfbG9jaygmc2JpLT5zX211dGV4KTsKIAl0bXBkZSA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgKHRtcG5hbWUrMTAyNCk7CiAKIAlyZXN1bHQgPSBkb19pc29mc19yZWFkZGlyKGlub2RlLCBmaWxwLCBkaXJlbnQsIGZpbGxkaXIsIHRtcG5hbWUsIHRtcGRlKTsKIAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgdG1wbmFtZSk7Ci0JbXV0ZXhfdW5sb2NrKCZzYmktPnNfbXV0ZXgpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2lub2RlLmMgYi9mcy9pc29mcy9pbm9kZS5jCmluZGV4IDNkYjViYTQuLmE1ZDAzNjcgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2lub2RlLmMKKysrIGIvZnMvaXNvZnMvaW5vZGUuYwpAQCAtODYzLDcgKzg2Myw2IEBACiAJc2JpLT5zX3V0ZjggPSBvcHQudXRmODsKIAlzYmktPnNfbm9jb21wcmVzcyA9IG9wdC5ub2NvbXByZXNzOwogCXNiaS0+c19vdmVycmlkZXJvY2twZXJtID0gb3B0Lm92ZXJyaWRlcm9ja3Blcm07Ci0JbXV0ZXhfaW5pdCgmc2JpLT5zX211dGV4KTsKIAkvKgogCSAqIEl0IHdvdWxkIGJlIGluY3JlZGlibHkgc3R1cGlkIHRvIGFsbG93IHBlb3BsZSB0byBtYXJrIGV2ZXJ5IGZpbGUKIAkgKiBvbiB0aGUgZGlzayBhcyBzdWlkLCBzbyB3ZSBtZXJlbHkgYWxsb3cgdGhlbSB0byBzZXQgdGhlIGRlZmF1bHQKQEAgLTk3NCw3ICs5NzMsNyBAQAogb3V0X25vX3JlYWQ6CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGJyZWFkIGZhaWxlZCwgZGV2PSVzLCBpc29fYmxrbnVtPSVkLCBibG9jaz0lZFxuIiwKIAkJX19mdW5jX18sIHMtPnNfaWQsIGlzb19ibGtudW0sIGJsb2NrKTsKLQlnb3RvIG91dF9mcmVlc2JpOworCWdvdG8gb3V0X2ZyZWViaDsKIG91dF9iYWRfem9uZV9zaXplOgogCXByaW50ayhLRVJOX1dBUk5JTkcgIklTT0ZTOiBCYWQgbG9naWNhbCB6b25lIHNpemUgJWxkXG4iLAogCQlzYmktPnNfbG9nX3pvbmVfc2l6ZSk7CkBAIC05ODksNiArOTg4LDcgQEAKIAogb3V0X2ZyZWViaDoKIAlicmVsc2UoYmgpOworCWJyZWxzZShwcmlfYmgpOwogb3V0X2ZyZWVzYmk6CiAJa2ZyZWUob3B0LmlvY2hhcnNldCk7CiAJa2ZyZWUoc2JpKTsKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2lzb2ZzLmggYi9mcy9pc29mcy9pc29mcy5oCmluZGV4IDI4ODJkYzAuLjdkMzNkZTggMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2lzb2ZzLmgKKysrIGIvZnMvaXNvZnMvaXNvZnMuaApAQCAtNTUsNyArNTUsNiBAQAogCWdpZF90IHNfZ2lkOwogCXVpZF90IHNfdWlkOwogCXN0cnVjdCBubHNfdGFibGUgKnNfbmxzX2lvY2hhcnNldDsgLyogTmF0aXZlIGxhbmd1YWdlIHN1cHBvcnQgdGFibGUgKi8KLQlzdHJ1Y3QgbXV0ZXggc19tdXRleDsgLyogcmVwbGFjZXMgQktMLCBwbGVhc2UgcmVtb3ZlIGlmIHBvc3NpYmxlICovCiB9OwogCiAjZGVmaW5lIElTT0ZTX0lOVkFMSURfTU9ERSAoKG1vZGVfdCkgLTEpCmRpZmYgLS1naXQgYS9mcy9pc29mcy9uYW1laS5jIGIvZnMvaXNvZnMvbmFtZWkuYwppbmRleCA0ZmIzZTgwLi4xZTI5NDZmIDEwMDY0NAotLS0gYS9mcy9pc29mcy9uYW1laS5jCisrKyBiL2ZzL2lzb2ZzL25hbWVpLmMKQEAgLTE2OCw3ICsxNjgsNiBAQAogCWludCBmb3VuZDsKIAl1bnNpZ25lZCBsb25nIHVuaW5pdGlhbGl6ZWRfdmFyKGJsb2NrKTsKIAl1bnNpZ25lZCBsb25nIHVuaW5pdGlhbGl6ZWRfdmFyKG9mZnNldCk7Ci0Jc3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaSA9IElTT0ZTX1NCKGRpci0+aV9zYik7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIApAQCAtMTc2LDIxICsxNzUsMTMgQEAKIAlpZiAoIXBhZ2UpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JbXV0ZXhfbG9jaygmc2JpLT5zX211dGV4KTsKIAlmb3VuZCA9IGlzb2ZzX2ZpbmRfZW50cnkoZGlyLCBkZW50cnksCiAJCQkJJmJsb2NrLCAmb2Zmc2V0LAogCQkJCXBhZ2VfYWRkcmVzcyhwYWdlKSwKIAkJCQkxMDI0ICsgcGFnZV9hZGRyZXNzKHBhZ2UpKTsKIAlfX2ZyZWVfcGFnZShwYWdlKTsKIAotCWlub2RlID0gTlVMTDsKLQlpZiAoZm91bmQpIHsKLQkJaW5vZGUgPSBpc29mc19pZ2V0KGRpci0+aV9zYiwgYmxvY2ssIG9mZnNldCk7Ci0JCWlmIChJU19FUlIoaW5vZGUpKSB7Ci0JCQltdXRleF91bmxvY2soJnNiaS0+c19tdXRleCk7Ci0JCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmc2JpLT5zX211dGV4KTsKKwlpbm9kZSA9IGZvdW5kID8gaXNvZnNfaWdldChkaXItPmlfc2IsIGJsb2NrLCBvZmZzZXQpIDogTlVMTDsKKwogCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL3JvY2suYyBiL2ZzL2lzb2ZzL3JvY2suYwppbmRleCBmOWNkMDRkLi4xZmJjN2RlIDEwMDY0NAotLS0gYS9mcy9pc29mcy9yb2NrLmMKKysrIGIvZnMvaXNvZnMvcm9jay5jCkBAIC02NzgsNyArNjc4LDYgQEAKIAogCWluaXRfcm9ja19zdGF0ZSgmcnMsIGlub2RlKTsKIAlibG9jayA9IGVpLT5pX2lnZXQ1X2Jsb2NrOwotCW11dGV4X2xvY2soJnNiaS0+c19tdXRleCk7CiAJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgYmxvY2spOwogCWlmICghYmgpCiAJCWdvdG8gb3V0X25vcmVhZDsKQEAgLTc0OCw3ICs3NDcsNiBAQAogCQlnb3RvIGZhaWw7CiAJYnJlbHNlKGJoKTsKIAkqcnBudCA9ICdcMCc7Ci0JbXV0ZXhfdW5sb2NrKCZzYmktPnNfbXV0ZXgpOwogCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAlrdW5tYXAocGFnZSk7CiAJdW5sb2NrX3BhZ2UocGFnZSk7CkBAIC03NjUsNyArNzYzLDYgQEAKIAlwcmludGsoInN5bWxpbmsgc3BhbnMgaXNvOTY2MCBibG9ja3NcbiIpOwogZmFpbDoKIAlicmVsc2UoYmgpOwotCW11dGV4X3VubG9jaygmc2JpLT5zX211dGV4KTsKIGVycm9yOgogCVNldFBhZ2VFcnJvcihwYWdlKTsKIAlrdW5tYXAocGFnZSk7CmRpZmYgLS1naXQgYS9mcy9qYmQyL2NoZWNrcG9pbnQuYyBiL2ZzL2piZDIvY2hlY2twb2ludC5jCmluZGV4IDZhNzlmZDAuLjJjNjJjNWEgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvY2hlY2twb2ludC5jCisrKyBiL2ZzL2piZDIvY2hlY2twb2ludC5jCkBAIC05NywxMCArOTcsMTQgQEAKIAogCWlmIChqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lICYmICFidWZmZXJfbG9ja2VkKGJoKSAmJgogCSAgICAhYnVmZmVyX2RpcnR5KGJoKSAmJiAhYnVmZmVyX3dyaXRlX2lvX2Vycm9yKGJoKSkgeworCQkvKgorCQkgKiBHZXQgb3VyIHJlZmVyZW5jZSBzbyB0aGF0IGJoIGNhbm5vdCBiZSBmcmVlZCBiZWZvcmUKKwkJICogd2UgdW5sb2NrIGl0CisJCSAqLworCQlnZXRfYmgoYmgpOwogCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVtb3ZlIGZyb20gY2hlY2twb2ludCBsaXN0Iik7CiAJCXJldCA9IF9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKSArIDE7CiAJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwotCQlqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CiAJCUJVRkZFUl9UUkFDRShiaCwgInJlbGVhc2UiKTsKIAkJX19icmVsc2UoYmgpOwogCX0gZWxzZSB7CkBAIC0yMjMsOCArMjI3LDggQEAKIAkJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCQkJZ290byByZXN0YXJ0OwogCQl9CisJCWdldF9iaChiaCk7CiAJCWlmIChidWZmZXJfbG9ja2VkKGJoKSkgewotCQkJYXRvbWljX2luYygmYmgtPmJfY291bnQpOwogCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogCQkJd2FpdF9vbl9idWZmZXIoYmgpOwpAQCAtMjQzLDcgKzI0Nyw2IEBACiAJCSAqLwogCQlyZWxlYXNlZCA9IF9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKTsKIAkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7Ci0JCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKIAkJX19icmVsc2UoYmgpOwogCX0KIApAQCAtMjg0LDcgKzI4Nyw3IEBACiAJaW50IHJldCA9IDA7CiAKIAlpZiAoYnVmZmVyX2xvY2tlZChiaCkpIHsKLQkJYXRvbWljX2luYygmYmgtPmJfY291bnQpOworCQlnZXRfYmgoYmgpOwogCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKIAkJd2FpdF9vbl9idWZmZXIoYmgpOwpAQCAtMzE2LDEyICszMTksMTIgQEAKIAkJcmV0ID0gMTsKIAkJaWYgKHVubGlrZWx5KGJ1ZmZlcl93cml0ZV9pb19lcnJvcihiaCkpKQogCQkJcmV0ID0gLUVJTzsKKwkJZ2V0X2JoKGJoKTsKIAkJSl9BU1NFUlRfSkgoamgsICFidWZmZXJfamJkZGlydHkoYmgpKTsKIAkJQlVGRkVSX1RSQUNFKGJoLCAicmVtb3ZlIGZyb20gY2hlY2twb2ludCIpOwogCQlfX2piZDJfam91cm5hbF9yZW1vdmVfY2hlY2twb2ludChqaCk7CiAJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwotCQlqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CiAJCV9fYnJlbHNlKGJoKTsKIAl9IGVsc2UgewogCQkvKgpAQCAtNTU0LDcgKzU1Nyw4IEBACiAvKgogICogam91cm5hbF9jbGVhbl9vbmVfY3BfbGlzdAogICoKLSAqIEZpbmQgYWxsIHRoZSB3cml0dGVuLWJhY2sgY2hlY2twb2ludCBidWZmZXJzIGluIHRoZSBnaXZlbiBsaXN0IGFuZCByZWxlYXNlIHRoZW0uCisgKiBGaW5kIGFsbCB0aGUgd3JpdHRlbi1iYWNrIGNoZWNrcG9pbnQgYnVmZmVycyBpbiB0aGUgZ2l2ZW4gbGlzdCBhbmQKKyAqIHJlbGVhc2UgdGhlbS4KICAqCiAgKiBDYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCiAgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgpAQCAtNjYzLDggKzY2Nyw4IEBACiAgKiBjaGVja3BvaW50IGxpc3RzLgogICoKICAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIDEgaWYgaXQgZnJlZXMgdGhlIHRyYW5zYWN0aW9uLCAwIG90aGVyd2lzZS4KKyAqIFRoZSBmdW5jdGlvbiBjYW4gZnJlZSBqaCBhbmQgYmguCiAgKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSkKICAqLwpAQCAtNjg0LDEzICs2ODgsMTQgQEAKIAl9CiAJam91cm5hbCA9IHRyYW5zYWN0aW9uLT50X2pvdXJuYWw7CiAKKwlKQlVGRkVSX1RSQUNFKGpoLCAicmVtb3ZpbmcgZnJvbSB0cmFuc2FjdGlvbiIpOwogCV9fYnVmZmVyX3VubGluayhqaCk7CiAJamgtPmJfY3BfdHJhbnNhY3Rpb24gPSBOVUxMOworCWpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKIAogCWlmICh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgIT0gTlVMTCB8fAogCSAgICB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QgIT0gTlVMTCkKIAkJZ290byBvdXQ7Ci0JSkJVRkZFUl9UUkFDRShqaCwgInRyYW5zYWN0aW9uIGhhcyBubyBtb3JlIGJ1ZmZlcnMiKTsKIAogCS8qCiAJICogVGhlcmUgaXMgb25lIHNwZWNpYWwgY2FzZSB0byB3b3JyeSBhYm91dDogaWYgd2UgaGF2ZSBqdXN0IHB1bGxlZCB0aGUKQEAgLTcwMSwxMCArNzA2LDggQEAKIAkgKiBUaGUgbG9ja2luZyBoZXJlIGFyb3VuZCB0X3N0YXRlIGlzIGEgYml0IHNsZWF6eS4KIAkgKiBTZWUgdGhlIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiBqYmQyX2pvdXJuYWxfY29tbWl0X3RyYW5zYWN0aW9uKCkuCiAJICovCi0JaWYgKHRyYW5zYWN0aW9uLT50X3N0YXRlICE9IFRfRklOSVNIRUQpIHsKLQkJSkJVRkZFUl9UUkFDRShqaCwgImJlbG9uZ3MgdG8gcnVubmluZy9jb21taXR0aW5nIHRyYW5zYWN0aW9uIik7CisJaWYgKHRyYW5zYWN0aW9uLT50X3N0YXRlICE9IFRfRklOSVNIRUQpCiAJCWdvdG8gb3V0OwotCX0KIAogCS8qIE9LLCB0aGF0IHdhcyB0aGUgbGFzdCBidWZmZXIgZm9yIHRoZSB0cmFuc2FjdGlvbjogd2UgY2FuIG5vdwogCSAgIHNhZmVseSByZW1vdmUgdGhpcyB0cmFuc2FjdGlvbiBmcm9tIHRoZSBsb2cgKi8KQEAgLTcyMyw3ICs3MjYsNiBAQAogCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9sb2dzcGFjZSk7CiAJcmV0ID0gMTsKIG91dDoKLQlKQlVGRkVSX1RSQUNFKGpoLCAiZXhpdCIpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc0Miw2ICs3NDQsOCBAQAogCUpfQVNTRVJUX0pIKGpoLCBidWZmZXJfZGlydHkoamgyYmgoamgpKSB8fCBidWZmZXJfamJkZGlydHkoamgyYmgoamgpKSk7CiAJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2NwX3RyYW5zYWN0aW9uID09IE5VTEwpOwogCisJLyogR2V0IHJlZmVyZW5jZSBmb3IgY2hlY2twb2ludGluZyB0cmFuc2FjdGlvbiAqLworCWpiZDJfam91cm5hbF9ncmFiX2pvdXJuYWxfaGVhZChqaDJiaChqaCkpOwogCWpoLT5iX2NwX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CiAKIAlpZiAoIXRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCkgewpkaWZmIC0tZ2l0IGEvZnMvamJkMi9jb21taXQuYyBiL2ZzL2piZDIvY29tbWl0LmMKaW5kZXggN2YyMWNmMy4uZWVmNjk3OSAxMDA2NDQKLS0tIGEvZnMvamJkMi9jb21taXQuYworKysgYi9mcy9qYmQyL2NvbW1pdC5jCkBAIC04NDgsMTAgKzg0OCwxNiBAQAogCXdoaWxlIChjb21taXRfdHJhbnNhY3Rpb24tPnRfZm9yZ2V0KSB7CiAJCXRyYW5zYWN0aW9uX3QgKmNwX3RyYW5zYWN0aW9uOwogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlpbnQgdHJ5X3RvX2ZyZWUgPSAwOwogCiAJCWpoID0gY29tbWl0X3RyYW5zYWN0aW9uLT50X2ZvcmdldDsKIAkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAkJYmggPSBqaDJiaChqaCk7CisJCS8qCisJCSAqIEdldCBhIHJlZmVyZW5jZSBzbyB0aGF0IGJoIGNhbm5vdCBiZSBmcmVlZCBiZWZvcmUgd2UgYXJlCisJCSAqIGRvbmUgd2l0aCBpdC4KKwkJICovCisJCWdldF9iaChiaCk7CiAJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKIAkJSl9BU1NFUlRfSkgoamgsCWpoLT5iX3RyYW5zYWN0aW9uID09IGNvbW1pdF90cmFuc2FjdGlvbik7CiAKQEAgLTkxNCwyOCArOTIwLDI3IEBACiAJCQlfX2piZDJfam91cm5hbF9pbnNlcnRfY2hlY2twb2ludChqaCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKIAkJCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpCiAJCQkJY2xlYXJfYnVmZmVyX2piZGRpcnR5KGJoKTsKLQkJCUpCVUZGRVJfVFJBQ0UoamgsICJyZWZpbGUgZm9yIGNoZWNrcG9pbnQgd3JpdGViYWNrIik7Ci0JCQlfX2piZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKGpoKTsKLQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogCQl9IGVsc2UgewogCQkJSl9BU1NFUlRfQkgoYmgsICFidWZmZXJfZGlydHkoYmgpKTsKLQkJCS8qIFRoZSBidWZmZXIgb24gQkpfRm9yZ2V0IGxpc3QgYW5kIG5vdCBqYmRkaXJ0eSBtZWFucworCQkJLyoKKwkJCSAqIFRoZSBidWZmZXIgb24gQkpfRm9yZ2V0IGxpc3QgYW5kIG5vdCBqYmRkaXJ0eSBtZWFucwogCQkJICogaXQgaGFzIGJlZW4gZnJlZWQgYnkgdGhpcyB0cmFuc2FjdGlvbiBhbmQgaGVuY2UgaXQKIAkJCSAqIGNvdWxkIG5vdCBoYXZlIGJlZW4gcmVhbGxvY2F0ZWQgdW50aWwgdGhpcwogCQkJICogdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZC4gKkJVVCogaXQgY291bGQgYmUKIAkJCSAqIHJlYWxsb2NhdGVkIG9uY2Ugd2UgaGF2ZSB3cml0dGVuIGFsbCB0aGUgZGF0YSB0bwogCQkJICogZGlzayBhbmQgYmVmb3JlIHdlIHByb2Nlc3MgdGhlIGJ1ZmZlciBvbiBCSl9Gb3JnZXQKLQkJCSAqIGxpc3QuICovCi0JCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVmaWxlIG9yIHVuZmlsZSBmcmVlZCBidWZmZXIiKTsKLQkJCV9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoamgpOwotCQkJaWYgKCFqaC0+Yl90cmFuc2FjdGlvbikgewotCQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwotCQkJCSAvKiBuZWVkcyBhIGJyZWxzZSAqLwotCQkJCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKLQkJCQlyZWxlYXNlX2J1ZmZlcl9wYWdlKGJoKTsKLQkJCX0gZWxzZQotCQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJICogbGlzdC4KKwkJCSAqLworCQkJaWYgKCFqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uKQorCQkJCXRyeV90b19mcmVlID0gMTsKIAkJfQorCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVmaWxlIG9yIHVuZmlsZSBidWZmZXIiKTsKKwkJX19qYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihqaCk7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlpZiAodHJ5X3RvX2ZyZWUpCisJCQlyZWxlYXNlX2J1ZmZlcl9wYWdlKGJoKTsJLyogRHJvcHMgYmggcmVmZXJlbmNlICovCisJCWVsc2UKKwkJCV9fYnJlbHNlKGJoKTsKIAkJY29uZF9yZXNjaGVkX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvam91cm5hbC5jIGIvZnMvamJkMi9qb3VybmFsLmMKaW5kZXggOWE3ODI2OS4uMGRmYTViNSAxMDA2NDQKLS0tIGEvZnMvamJkMi9qb3VybmFsLmMKKysrIGIvZnMvamJkMi9qb3VybmFsLmMKQEAgLTIwNzgsMTAgKzIwNzgsOSBAQAogICogV2hlbiBhIGJ1ZmZlciBoYXMgaXRzIEJIX0pCRCBiaXQgc2V0IGl0IGlzIGltbXVuZSBmcm9tIGJlaW5nIHJlbGVhc2VkIGJ5CiAgKiBjb3JlIGtlcm5lbCBjb2RlLCBtYWlubHkgdmlhIC0+Yl9jb3VudC4KICAqCi0gKiBBIGpvdXJuYWxfaGVhZCBtYXkgYmUgZGV0YWNoZWQgZnJvbSBpdHMgYnVmZmVyX2hlYWQgd2hlbiB0aGUgam91cm5hbF9oZWFkJ3MKLSAqIGJfdHJhbnNhY3Rpb24sIGJfY3BfdHJhbnNhY3Rpb24gYW5kIGJfbmV4dF90cmFuc2FjdGlvbiBwb2ludGVycyBhcmUgTlVMTC4KLSAqIFZhcmlvdXMgcGxhY2VzIGluIEpCRCBjYWxsIGpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKCkgdG8gaW5kaWNhdGUgdGhhdCB0aGUKLSAqIGpvdXJuYWxfaGVhZCBjYW4gYmUgZHJvcHBlZCBpZiBuZWVkZWQuCisgKiBBIGpvdXJuYWxfaGVhZCBpcyBkZXRhY2hlZCBmcm9tIGl0cyBidWZmZXJfaGVhZCB3aGVuIHRoZSBqb3VybmFsX2hlYWQncworICogYl9qY291bnQgcmVhY2hlcyB6ZXJvLiBSdW5uaW5nIHRyYW5zYWN0aW9uIChiX3RyYW5zYWN0aW9uKSBhbmQgY2hlY2twb2ludAorICogdHJhbnNhY3Rpb24gKGJfY3BfdHJhbnNhY3Rpb24pIGhvbGQgdGhlaXIgcmVmZXJlbmNlcyB0byBiX2pjb3VudC4KICAqCiAgKiBWYXJpb3VzIHBsYWNlcyBpbiB0aGUga2VybmVsIHdhbnQgdG8gYXR0YWNoIGEgam91cm5hbF9oZWFkIHRvIGEgYnVmZmVyX2hlYWQKICAqIF9iZWZvcmVfIGF0dGFjaGluZyB0aGUgam91cm5hbF9oZWFkIHRvIGEgdHJhbnNhY3Rpb24uICBUbyBwcm90ZWN0IHRoZQpAQCAtMjA5NCwxNyArMjA5MywxNiBAQAogICoJKEF0dGFjaCBhIGpvdXJuYWxfaGVhZCBpZiBuZWVkZWQuICBJbmNyZW1lbnRzIGJfamNvdW50KQogICoJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBqYmQyX2pvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChiaCk7CiAgKgkuLi4KKyAqICAgICAgKEdldCBhbm90aGVyIHJlZmVyZW5jZSBmb3IgdHJhbnNhY3Rpb24pCisgKglqYmQyX2pvdXJuYWxfZ3JhYl9qb3VybmFsX2hlYWQoYmgpOwogICoJamgtPmJfdHJhbnNhY3Rpb24gPSB4eHg7CisgKgkoUHV0IG9yaWdpbmFsIHJlZmVyZW5jZSkKICAqCWpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKLSAqCi0gKiBOb3csIHRoZSBqb3VybmFsX2hlYWQncyBiX2pjb3VudCBpcyB6ZXJvLCBidXQgaXQgaXMgc2FmZSBmcm9tIGJlaW5nIHJlbGVhc2VkCi0gKiBiZWNhdXNlIGl0IGhhcyBhIG5vbi16ZXJvIGJfdHJhbnNhY3Rpb24uCiAgKi8KIAogLyoKICAqIEdpdmUgYSBidWZmZXJfaGVhZCBhIGpvdXJuYWxfaGVhZC4KICAqCi0gKiBEb2Vzbid0IG5lZWQgdGhlIGpvdXJuYWwgbG9jay4KICAqIE1heSBzbGVlcC4KICAqLwogc3RydWN0IGpvdXJuYWxfaGVhZCAqamJkMl9qb3VybmFsX2FkZF9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKQEAgLTIxNjgsNjEgKzIxNjYsMjkgQEAKIAlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKIAogCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9qY291bnQgPj0gMCk7Ci0KLQlnZXRfYmgoYmgpOwotCWlmIChqaC0+Yl9qY291bnQgPT0gMCkgewotCQlpZiAoamgtPmJfdHJhbnNhY3Rpb24gPT0gTlVMTCAmJgotCQkJCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0gTlVMTCAmJgotCQkJCWpoLT5iX2NwX3RyYW5zYWN0aW9uID09IE5VTEwpIHsKLQkJCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lKTsKLQkJCUpfQVNTRVJUX0JIKGJoLCBidWZmZXJfamJkKGJoKSk7Ci0JCQlKX0FTU0VSVF9CSChiaCwgamgyYmgoamgpID09IGJoKTsKLQkJCUJVRkZFUl9UUkFDRShiaCwgInJlbW92ZSBqb3VybmFsX2hlYWQiKTsKLQkJCWlmIChqaC0+Yl9mcm96ZW5fZGF0YSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmcmVlaW5nICIKLQkJCQkJCSJiX2Zyb3plbl9kYXRhXG4iLAotCQkJCQkJX19mdW5jX18pOwotCQkJCWpiZDJfZnJlZShqaC0+Yl9mcm96ZW5fZGF0YSwgYmgtPmJfc2l6ZSk7Ci0JCQl9Ci0JCQlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZnJlZWluZyAiCi0JCQkJCQkiYl9jb21taXR0ZWRfZGF0YVxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQlqYmQyX2ZyZWUoamgtPmJfY29tbWl0dGVkX2RhdGEsIGJoLT5iX3NpemUpOwotCQkJfQotCQkJYmgtPmJfcHJpdmF0ZSA9IE5VTEw7Ci0JCQlqaC0+Yl9iaCA9IE5VTEw7CS8qIGRlYnVnLCByZWFsbHkgKi8KLQkJCWNsZWFyX2J1ZmZlcl9qYmQoYmgpOwotCQkJX19icmVsc2UoYmgpOwotCQkJam91cm5hbF9mcmVlX2pvdXJuYWxfaGVhZChqaCk7Ci0JCX0gZWxzZSB7Ci0JCQlCVUZGRVJfVFJBQ0UoYmgsICJqb3VybmFsX2hlYWQgd2FzIGxvY2tlZCIpOwotCQl9CisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX3RyYW5zYWN0aW9uID09IE5VTEwpOworCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IE5VTEwpOworCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9jcF90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwlKX0FTU0VSVF9KSChqaCwgamgtPmJfamxpc3QgPT0gQkpfTm9uZSk7CisJSl9BU1NFUlRfQkgoYmgsIGJ1ZmZlcl9qYmQoYmgpKTsKKwlKX0FTU0VSVF9CSChiaCwgamgyYmgoamgpID09IGJoKTsKKwlCVUZGRVJfVFJBQ0UoYmgsICJyZW1vdmUgam91cm5hbF9oZWFkIik7CisJaWYgKGpoLT5iX2Zyb3plbl9kYXRhKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmcmVlaW5nIGJfZnJvemVuX2RhdGFcbiIsIF9fZnVuY19fKTsKKwkJamJkMl9mcmVlKGpoLT5iX2Zyb3plbl9kYXRhLCBiaC0+Yl9zaXplKTsKIAl9CisJaWYgKGpoLT5iX2NvbW1pdHRlZF9kYXRhKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmcmVlaW5nIGJfY29tbWl0dGVkX2RhdGFcbiIsIF9fZnVuY19fKTsKKwkJamJkMl9mcmVlKGpoLT5iX2NvbW1pdHRlZF9kYXRhLCBiaC0+Yl9zaXplKTsKKwl9CisJYmgtPmJfcHJpdmF0ZSA9IE5VTEw7CisJamgtPmJfYmggPSBOVUxMOwkvKiBkZWJ1ZywgcmVhbGx5ICovCisJY2xlYXJfYnVmZmVyX2piZChiaCk7CisJam91cm5hbF9mcmVlX2pvdXJuYWxfaGVhZChqaCk7CiB9CiAKIC8qCi0gKiBqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZCgpOiBpZiB0aGUgYnVmZmVyIGlzbid0IGF0dGFjaGVkIHRvIGEgdHJhbnNhY3Rpb24KLSAqIGFuZCBoYXMgYSB6ZXJvIGJfamNvdW50IHRoZW4gcmVtb3ZlIGFuZCByZWxlYXNlIGl0cyBqb3VybmFsX2hlYWQuICAgSWYgd2UgZGlkCi0gKiBzZWUgdGhhdCB0aGUgYnVmZmVyIGlzIG5vdCB1c2VkIGJ5IGFueSB0cmFuc2FjdGlvbiB3ZSBhbHNvICJsb2dpY2FsbHkiCi0gKiBkZWNyZW1lbnQgLT5iX2NvdW50LgotICoKLSAqIFdlIGluIGZhY3QgdGFrZSBhbiBhZGRpdGlvbmFsIGluY3JlbWVudCBvbiAtPmJfY291bnQgYXMgYSBjb252ZW5pZW5jZSwKLSAqIGJlY2F1c2UgdGhlIGNhbGxlciB1c3VhbGx5IHdhbnRzIHRvIGRvIGFkZGl0aW9uYWwgdGhpbmdzIHdpdGggdGhlIGJoCi0gKiBhZnRlciBjYWxsaW5nIGhlcmUuCi0gKiBUaGUgY2FsbGVyIG9mIGpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKCkgKm11c3QqIHJ1biBfX2JyZWxzZShiaCkgYXQgc29tZQotICogdGltZS4gIE9uY2UgdGhlIGNhbGxlciBoYXMgcnVuIF9fYnJlbHNlKCksIHRoZSBidWZmZXIgaXMgZWxpZ2libGUgZm9yCi0gKiByZWFwaW5nIGJ5IHRyeV90b19mcmVlX2J1ZmZlcnMoKS4KLSAqLwotdm9pZCBqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWpiZF9sb2NrX2JoX2pvdXJuYWxfaGVhZChiaCk7Ci0JX19qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOwotCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKLX0KLQotLyoKLSAqIERyb3AgYSByZWZlcmVuY2Ugb24gdGhlIHBhc3NlZCBqb3VybmFsX2hlYWQuICBJZiBpdCBmZWxsIHRvIHplcm8gdGhlbiB0cnkgdG8KKyAqIERyb3AgYSByZWZlcmVuY2Ugb24gdGhlIHBhc3NlZCBqb3VybmFsX2hlYWQuICBJZiBpdCBmZWxsIHRvIHplcm8gdGhlbgogICogcmVsZWFzZSB0aGUgam91cm5hbF9oZWFkIGZyb20gdGhlIGJ1ZmZlcl9oZWFkLgogICovCiB2b2lkIGpiZDJfam91cm5hbF9wdXRfam91cm5hbF9oZWFkKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQpAQCAtMjIzMiwxMSArMjE5OCwxMiBAQAogCWpiZF9sb2NrX2JoX2pvdXJuYWxfaGVhZChiaCk7CiAJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2pjb3VudCA+IDApOwogCS0tamgtPmJfamNvdW50OwotCWlmICghamgtPmJfamNvdW50ICYmICFqaC0+Yl90cmFuc2FjdGlvbikgeworCWlmICghamgtPmJfamNvdW50KSB7CiAJCV9fam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKKwkJamJkX3VubG9ja19iaF9qb3VybmFsX2hlYWQoYmgpOwogCQlfX2JyZWxzZShiaCk7Ci0JfQotCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwl9IGVsc2UKKwkJamJkX3VubG9ja19iaF9qb3VybmFsX2hlYWQoYmgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvamJkMi90cmFuc2FjdGlvbi5jIGIvZnMvamJkMi90cmFuc2FjdGlvbi5jCmluZGV4IDNlZWM4MmQuLjJkNzEwOTQgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvdHJhbnNhY3Rpb24uYworKysgYi9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHZvaWQgX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKTsKK3N0YXRpYyB2b2lkIF9famJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpOwogCiAvKgogICogamJkMl9nZXRfdHJhbnNhY3Rpb246IG9idGFpbiBhIG5ldyB0cmFuc2FjdGlvbl90IG9iamVjdC4KQEAgLTc2NCw3ICs3NjUsNiBAQAogCWlmICghamgtPmJfdHJhbnNhY3Rpb24pIHsKIAkJSkJVRkZFUl9UUkFDRShqaCwgIm5vIHRyYW5zYWN0aW9uIik7CiAJCUpfQVNTRVJUX0pIKGpoLCAhamgtPmJfbmV4dF90cmFuc2FjdGlvbik7Ci0JCWpoLT5iX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CiAJCUpCVUZGRVJfVFJBQ0UoamgsICJmaWxlIGFzIEJKX1Jlc2VydmVkIik7CiAJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCQlfX2piZDJfam91cm5hbF9maWxlX2J1ZmZlcihqaCwgdHJhbnNhY3Rpb24sIEJKX1Jlc2VydmVkKTsKQEAgLTgxNCw3ICs4MTQsNiBAQAogICogaW50IGpiZDJfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKCkgLSBub3RpZnkgaW50ZW50IHRvIG1vZGlmeSBhIGJ1ZmZlciBmb3IgbWV0YWRhdGEgKG5vdCBkYXRhKSB1cGRhdGUuCiAgKiBAaGFuZGxlOiB0cmFuc2FjdGlvbiB0byBhZGQgYnVmZmVyIG1vZGlmaWNhdGlvbnMgdG8KICAqIEBiaDogICAgIGJoIHRvIGJlIHVzZWQgZm9yIG1ldGFkYXRhIHdyaXRlcwotICogQGNyZWRpdHM6IHZhcmlhYmxlIHRoYXQgd2lsbCByZWNlaXZlIGNyZWRpdHMgZm9yIHRoZSBidWZmZXIKICAqCiAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgb3IgMCBvbiBzdWNjZXNzLgogICoKQEAgLTg5Niw4ICs4OTUsNiBAQAogCQkgKiBjb21taXR0ZWQgYW5kIHNvIGl0J3Mgc2FmZSB0byBjbGVhciB0aGUgZGlydHkgYml0LgogCQkgKi8KIAkJY2xlYXJfYnVmZmVyX2RpcnR5KGpoMmJoKGpoKSk7Ci0JCWpoLT5iX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247Ci0KIAkJLyogZmlyc3QgYWNjZXNzIGJ5IHRoaXMgdHJhbnNhY3Rpb24gKi8KIAkJamgtPmJfbW9kaWZpZWQgPSAwOwogCkBAIC05MzIsNyArOTI5LDYgQEAKICAqICAgICBub24tcmV3aW5kYWJsZSBjb25zZXF1ZW5jZXMKICAqIEBoYW5kbGU6IHRyYW5zYWN0aW9uCiAgKiBAYmg6IGJ1ZmZlciB0byB1bmRvCi0gKiBAY3JlZGl0czogc3RvcmUgdGhlIG51bWJlciBvZiB0YWtlbiBjcmVkaXRzIGhlcmUgKGlmIG5vdCBOVUxMKQogICoKICAqIFNvbWV0aW1lcyB0aGVyZSBpcyBhIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtZXRhZGF0YSB3aGljaCBoYXMKICAqIGJlZW4gY29tbWl0dGVkIHRvIGRpc2sgYW5kIHRoYXQgd2hpY2ggaGFzIG5vdC4gIFRoZSBleHQzZnMgY29kZSB1c2VzCkBAIC0xMjMyLDggKzEyMjgsNiBAQAogCQkJX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoamgsIHRyYW5zYWN0aW9uLCBCSl9Gb3JnZXQpOwogCQl9IGVsc2UgewogCQkJX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7Ci0JCQlqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7Ci0JCQlfX2JyZWxzZShiaCk7CiAJCQlpZiAoIWJ1ZmZlcl9qYmQoYmgpKSB7CiAJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAkJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKQEAgLTE1NTYsMTkgKzE1NTAsMzIgQEAKIAkJbWFya19idWZmZXJfZGlydHkoYmgpOwkvKiBFeHBvc2UgaXQgdG8gdGhlIFZNICovCiB9CiAKLXZvaWQgX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKKy8qCisgKiBSZW1vdmUgYnVmZmVyIGZyb20gYWxsIHRyYW5zYWN0aW9ucy4KKyAqCisgKiBDYWxsZWQgd2l0aCBiaF9zdGF0ZSBsb2NrIGFuZCBqX2xpc3RfbG9jaworICoKKyAqIGpoIGFuZCBiaCBtYXkgYmUgYWxyZWFkeSBmcmVlZCB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAqLworc3RhdGljIHZvaWQgX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKIHsKIAlfX2piZDJfam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoamgpOwogCWpoLT5iX3RyYW5zYWN0aW9uID0gTlVMTDsKKwlqYmQyX2pvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CiB9CiAKIHZvaWQgamJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKIHsKLQlqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CisKKwkvKiBHZXQgcmVmZXJlbmNlIHNvIHRoYXQgYnVmZmVyIGNhbm5vdCBiZSBmcmVlZCBiZWZvcmUgd2UgdW5sb2NrIGl0ICovCisJZ2V0X2JoKGJoKTsKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CiAJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKLQlqYmRfdW5sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJX19icmVsc2UoYmgpOwogfQogCiAvKgpAQCAtMTU5NSw4ICsxNjAyLDYgQEAKIAkJaWYgKGpoLT5iX2psaXN0ID09IEJKX05vbmUpIHsKIAkJCUpCVUZGRVJfVFJBQ0UoamgsICJyZW1vdmUgZnJvbSBjaGVja3BvaW50IGxpc3QiKTsKIAkJCV9famJkMl9qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKTsKLQkJCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKLQkJCV9fYnJlbHNlKGJoKTsKIAkJfQogCX0KIAlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwpAQCAtMTY1OSw3ICsxNjY0LDYgQEAKIAkJLyoKIAkJICogV2UgdGFrZSBvdXIgb3duIHJlZiBhZ2FpbnN0IHRoZSBqb3VybmFsX2hlYWQgaGVyZSB0byBhdm9pZAogCQkgKiBoYXZpbmcgdG8gYWRkIHRvbnMgb2YgbG9ja2luZyBhcm91bmQgZWFjaCBpbnN0YW5jZSBvZgotCQkgKiBqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZCgpIGFuZAogCQkgKiBqYmQyX2pvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZCgpLgogCQkgKi8KIAkJamggPSBqYmQyX2pvdXJuYWxfZ3JhYl9qb3VybmFsX2hlYWQoYmgpOwpAQCAtMTY5NywxMCArMTcwMSw5IEBACiAJaW50IG1heV9mcmVlID0gMTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOwogCi0JX19qYmQyX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7Ci0KIAlpZiAoamgtPmJfY3BfdHJhbnNhY3Rpb24pIHsKIAkJSkJVRkZFUl9UUkFDRShqaCwgIm9uIHJ1bm5pbmcrY3AgdHJhbnNhY3Rpb24iKTsKKwkJX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKGpoKTsKIAkJLyoKIAkJICogV2UgZG9uJ3Qgd2FudCB0byB3cml0ZSB0aGUgYnVmZmVyIGFueW1vcmUsIGNsZWFyIHRoZQogCQkgKiBiaXQgc28gdGhhdCB3ZSBkb24ndCBjb25mdXNlIGNoZWNrcyBpbgpAQCAtMTcxMSw4ICsxNzE0LDcgQEAKIAkJbWF5X2ZyZWUgPSAwOwogCX0gZWxzZSB7CiAJCUpCVUZGRVJfVFJBQ0UoamgsICJvbiBydW5uaW5nIHRyYW5zYWN0aW9uIik7Ci0JCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKLQkJX19icmVsc2UoYmgpOworCQlfX2piZDJfam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKIAl9CiAJcmV0dXJuIG1heV9mcmVlOwogfQpAQCAtMTk5MCw2ICsxOTkyLDggQEAKIAogCWlmIChqaC0+Yl90cmFuc2FjdGlvbikKIAkJX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKGpoKTsKKwllbHNlCisJCWpiZDJfam91cm5hbF9ncmFiX2pvdXJuYWxfaGVhZChiaCk7CiAJamgtPmJfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKIAogCXN3aXRjaCAoamxpc3QpIHsKQEAgLTIwNDEsOSArMjA0NSwxMCBAQAogICogYWxyZWFkeSBzdGFydGVkIHRvIGJlIHVzZWQgYnkgYSBzdWJzZXF1ZW50IHRyYW5zYWN0aW9uLCByZWZpbGUgdGhlCiAgKiBidWZmZXIgb24gdGhhdCB0cmFuc2FjdGlvbidzIG1ldGFkYXRhIGxpc3QuCiAgKgotICogQ2FsbGVkIHVuZGVyIGpvdXJuYWwtPmpfbGlzdF9sb2NrCi0gKgorICogQ2FsbGVkIHVuZGVyIGpfbGlzdF9sb2NrCiAgKiBDYWxsZWQgdW5kZXIgamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKQorICoKKyAqIGpoIGFuZCBiaCBtYXkgYmUgYWxyZWFkeSBmcmVlIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zCiAgKi8KIHZvaWQgX19qYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKIHsKQEAgLTIwNjcsNiArMjA3MiwxMSBAQAogCiAJd2FzX2RpcnR5ID0gdGVzdF9jbGVhcl9idWZmZXJfamJkZGlydHkoYmgpOwogCV9famJkMl9qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihqaCk7CisJLyoKKwkgKiBXZSBzZXQgYl90cmFuc2FjdGlvbiBoZXJlIGJlY2F1c2UgYl9uZXh0X3RyYW5zYWN0aW9uIHdpbGwgaW5oZXJpdAorCSAqIG91ciBqaCByZWZlcmVuY2UgYW5kIHRodXMgX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoKSBtdXN0IG5vdAorCSAqIHRha2UgYSBuZXcgb25lLgorCSAqLwogCWpoLT5iX3RyYW5zYWN0aW9uID0gamgtPmJfbmV4dF90cmFuc2FjdGlvbjsKIAlqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID0gTlVMTDsKIAlpZiAoYnVmZmVyX2ZyZWVkKGJoKSkKQEAgLTIwODMsMzAgKzIwOTMsMjEgQEAKIH0KIAogLyoKLSAqIEZvciB0aGUgdW5sb2NrZWQgdmVyc2lvbiBvZiB0aGlzIGNhbGwsIGFsc28gbWFrZSBzdXJlIHRoYXQgYW55Ci0gKiBoYW5naW5nIGpvdXJuYWxfaGVhZCBpcyBjbGVhbmVkIHVwIGlmIG5lY2Vzc2FyeS4KKyAqIF9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoKSB3aXRoIG5lY2Vzc2FyeSBsb2NraW5nIGFkZGVkLiBXZSB0YWtlIG91cgorICogYmggcmVmZXJlbmNlIHNvIHRoYXQgd2UgY2FuIHNhZmVseSB1bmxvY2sgYmguCiAgKgotICogX19qYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlciBpcyB1c3VhbGx5IGNhbGxlZCBhcyBwYXJ0IG9mIGEgc2luZ2xlIGxvY2tlZAotICogb3BlcmF0aW9uIG9uIGEgYnVmZmVyX2hlYWQsIGluIHdoaWNoIHRoZSBjYWxsZXIgaXMgcHJvYmFibHkgZ29pbmcgdG8KLSAqIGJlIGhvb2tpbmcgdGhlIGpvdXJuYWxfaGVhZCBvbnRvIG90aGVyIGxpc3RzLiAgSW4gdGhhdCBjYXNlIGl0IGlzIHVwCi0gKiB0byB0aGUgY2FsbGVyIHRvIHJlbW92ZSB0aGUgam91cm5hbF9oZWFkIGlmIG5lY2Vzc2FyeS4gIEZvciB0aGUKLSAqIHVubG9ja2VkIGpiZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyIGNhbGwsIHRoZSBjYWxsZXIgaXNuJ3QgZ29pbmcgdG8gYmUKLSAqIGRvaW5nIGFueXRoaW5nIGVsc2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBuZWVkIHRvIGRvIHRoZSBjbGVhbnVwCi0gKiBvdXJzZWx2ZXMgdG8gYXZvaWQgYSBqaCBsZWFrLgotICoKLSAqICoqKiBUaGUgam91cm5hbF9oZWFkIG1heSBiZSBmcmVlZCBieSB0aGlzIGNhbGwhICoqKgorICogVGhlIGpoIGFuZCBiaCBtYXkgYmUgZnJlZWQgYnkgdGhpcyBjYWxsLgogICovCiB2b2lkIGpiZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKIAorCS8qIEdldCByZWZlcmVuY2Ugc28gdGhhdCBidWZmZXIgY2Fubm90IGJlIGZyZWVkIGJlZm9yZSB3ZSB1bmxvY2sgaXQgKi8KKwlnZXRfYmgoYmgpOwogCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKIAlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKLQogCV9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoamgpOwogCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwotCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKLQogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJX19icmVsc2UoYmgpOwogfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvYWNsLmMgYi9mcy9qZmZzMi9hY2wuYwppbmRleCA4MjhhMGUxLi4yN2M1MTFhIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9hY2wuYworKysgYi9mcy9qZmZzMi9hY2wuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICpqZmZzMl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQorc3RydWN0IHBvc2l4X2FjbCAqamZmczJfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJY2hhciAqdmFsdWUgPSBOVUxMOwpAQCAtMjU5LDMwICsyNTksMTEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBqZmZzMl9jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncykKK2ludCBqZmZzMl9pbml0X2FjbF9wcmUoc3RydWN0IGlub2RlICpkaXJfaSwgc3RydWN0IGlub2RlICppbm9kZSwgbW9kZV90ICppX21vZGUpCiB7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCWludCByYzsKIAotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKLQotCWFjbCA9IGpmZnMyX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0JaWYgKElTX0VSUihhY2wpKQotCQlyZXR1cm4gUFRSX0VSUihhY2wpOwotCWlmIChhY2wpIHsKLQkJcmMgPSBwb3NpeF9hY2xfcGVybWlzc2lvbihpbm9kZSwgYWNsLCBtYXNrKTsKLQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlyZXR1cm4gLUVBR0FJTjsKLX0KLQotaW50IGpmZnMyX2luaXRfYWNsX3ByZShzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmlfbW9kZSkKLXsKLQlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpjbG9uZTsKLQlpbnQgcmM7Ci0KIAljYWNoZV9ub19hY2woaW5vZGUpOwogCiAJaWYgKFNfSVNMTksoKmlfbW9kZSkpCkBAIC0yOTgsMTggKzI3OSwxMyBAQAogCQlpZiAoU19JU0RJUigqaV9tb2RlKSkKIAkJCXNldF9jYWNoZWRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBhY2wpOwogCi0JCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY2xvbmUpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJcmMgPSBwb3NpeF9hY2xfY3JlYXRlX21hc3EoY2xvbmUsIChtb2RlX3QgKilpX21vZGUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisJCXJjID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfS0VSTkVMLCBpX21vZGUpOworCQlpZiAocmMgPCAwKQogCQkJcmV0dXJuIHJjOwotCQl9CiAJCWlmIChyYyA+IDApCi0JCQlzZXRfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJCQlzZXRfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBhY2wpOwogCi0JCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zMzUsNyArMzExLDcgQEAKIAogaW50IGpmZnMyX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKIAlpbnQgcmM7CiAKIAlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKQEAgLTM0MywxNCArMzE5LDExIEBACiAJYWNsID0gamZmczJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKIAlpZiAoSVNfRVJSKGFjbCkgfHwgIWFjbCkKIAkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKLQljbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9LRVJORUwpOworCXJjID0gcG9zaXhfYWNsX2NobW9kKCZhY2wsIEdGUF9LRVJORUwsIGlub2RlLT5pX21vZGUpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCXJjID0gamZmczJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBhY2wpOwogCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7Ci0JaWYgKCFjbG9uZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmMgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7Ci0JaWYgKCFyYykKLQkJcmMgPSBqZmZzMl9zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKLQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9hY2wuaCBiL2ZzL2pmZnMyL2FjbC5oCmluZGV4IDMxMTlmNTkuLmIzNDIxYzcgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2FjbC5oCisrKyBiL2ZzL2pmZnMyL2FjbC5oCkBAIC0yNiw5ICsyNiw5IEBACiAKICNpZmRlZiBDT05GSUdfSkZGUzJfRlNfUE9TSVhfQUNMCiAKLWV4dGVybiBpbnQgamZmczJfY2hlY2tfYWNsKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHVuc2lnbmVkIGludCk7CitzdHJ1Y3QgcG9zaXhfYWNsICpqZmZzMl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgamZmczJfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqKTsKLWV4dGVybiBpbnQgamZmczJfaW5pdF9hY2xfcHJlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKiwgaW50ICopOworZXh0ZXJuIGludCBqZmZzMl9pbml0X2FjbF9wcmUoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqLCBtb2RlX3QgKik7CiBleHRlcm4gaW50IGpmZnMyX2luaXRfYWNsX3Bvc3Qoc3RydWN0IGlub2RlICopOwogCiBleHRlcm4gY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgamZmczJfYWNsX2FjY2Vzc194YXR0cl9oYW5kbGVyOwpAQCAtMzYsNyArMzYsNyBAQAogCiAjZWxzZQogCi0jZGVmaW5lIGpmZnMyX2NoZWNrX2FjbAkJCQkoTlVMTCkKKyNkZWZpbmUgamZmczJfZ2V0X2FjbAkJCQkoTlVMTCkKICNkZWZpbmUgamZmczJfYWNsX2NobW9kKGlub2RlKQkJCSgwKQogI2RlZmluZSBqZmZzMl9pbml0X2FjbF9wcmUoZGlyX2ksaW5vZGUsbW9kZSkJKDApCiAjZGVmaW5lIGpmZnMyX2luaXRfYWNsX3Bvc3QoaW5vZGUpCQkoMCkKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2Rpci5jIGIvZnMvamZmczIvZGlyLmMKaW5kZXggNGJjYTZhMi4uOTY1OWI3YyAxMDA2NDQKLS0tIGEvZnMvamZmczIvZGlyLmMKKysrIGIvZnMvamZmczIvZGlyLmMKQEAgLTU2LDcgKzU2LDcgQEAKIAkucm1kaXIgPQlqZmZzMl9ybWRpciwKIAkubWtub2QgPQlqZmZzMl9ta25vZCwKIAkucmVuYW1lID0JamZmczJfcmVuYW1lLAotCS5jaGVja19hY2wgPQlqZmZzMl9jaGVja19hY2wsCisJLmdldF9hY2wgPQlqZmZzMl9nZXRfYWNsLAogCS5zZXRhdHRyID0JamZmczJfc2V0YXR0ciwKIAkuc2V0eGF0dHIgPQlqZmZzMl9zZXR4YXR0ciwKIAkuZ2V0eGF0dHIgPQlqZmZzMl9nZXR4YXR0ciwKQEAgLTEwMiwxMCArMTAyLDggQEAKIAltdXRleF91bmxvY2soJmRpcl9mLT5zZW0pOwogCWlmIChpbm8pIHsKIAkJaW5vZGUgPSBqZmZzMl9pZ2V0KGRpcl9pLT5pX3NiLCBpbm8pOwotCQlpZiAoSVNfRVJSKGlub2RlKSkgeworCQlpZiAoSVNfRVJSKGlub2RlKSkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlnZXQoKSBmYWlsZWQgZm9yIGlubyAjJXVcbiIsIGlubyk7Ci0JCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwotCQl9CiAJfQogCiAJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCB0YXJnZXQpOwpAQCAtODIyLDcgKzgyMCwxMCBAQAogCiAJaWYgKHZpY3RpbV9mKSB7CiAJCS8qIFRoZXJlIHdhcyBhIHZpY3RpbS4gS2lsbCBpdCBvZmYgbmljZWx5ICovCi0JCWRyb3BfbmxpbmsobmV3X2RlbnRyeS0+ZF9pbm9kZSk7CisJCWlmIChTX0lTRElSKG5ld19kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCQljbGVhcl9ubGluayhuZXdfZGVudHJ5LT5kX2lub2RlKTsKKwkJZWxzZQorCQkJZHJvcF9ubGluayhuZXdfZGVudHJ5LT5kX2lub2RlKTsKIAkJLyogRG9uJ3Qgb29wcyBpZiB0aGUgdmljdGltIHdhcyBhIGRpcmVudCBwb2ludGluZyB0byBhbgogCQkgICBpbm9kZSB3aGljaCBkaWRuJ3QgZXhpc3QuICovCiAJCWlmICh2aWN0aW1fZi0+aW5vY2FjaGUpIHsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2ZpbGUuYyBiL2ZzL2pmZnMyL2ZpbGUuYwppbmRleCAxYzBhMDhkLi42MWU2NzIzIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9maWxlLmMKKysrIGIvZnMvamZmczIvZmlsZS5jCkBAIC0yNywxMyArMjcsMjAgQEAKIAkJCXN0cnVjdCBwYWdlICoqcGFnZXAsIHZvaWQgKipmc2RhdGEpOwogc3RhdGljIGludCBqZmZzMl9yZWFkcGFnZSAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwZyk7CiAKLWludCBqZmZzMl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGRhdGFzeW5jKQoraW50IGpmZnMyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OwogCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhpbm9kZS0+aV9zYik7CisJaW50IHJldDsKIAorCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAkvKiBUcmlnZ2VyIEdDIHRvIGZsdXNoIGFueSBwZW5kaW5nIHdyaXRlcyBmb3IgdGhpcyBpbm9kZSAqLwogCWpmZnMyX2ZsdXNoX3didWZfZ2MoYywgaW5vZGUtPmlfaW5vKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtNTYsNyArNjMsNyBAQAogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZmZzMl9maWxlX2lub2RlX29wZXJhdGlvbnMgPQogewotCS5jaGVja19hY2wgPQlqZmZzMl9jaGVja19hY2wsCisJLmdldF9hY2wgPQlqZmZzMl9nZXRfYWNsLAogCS5zZXRhdHRyID0JamZmczJfc2V0YXR0ciwKIAkuc2V0eGF0dHIgPQlqZmZzMl9zZXR4YXR0ciwKIAkuZ2V0eGF0dHIgPQlqZmZzMl9nZXR4YXR0ciwKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2ZzLmMgYi9mcy9qZmZzMi9mcy5jCmluZGV4IDQ2YWQ2MTkuLmVlZWFkMzMgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZzLmMKKysrIGIvZnMvamZmczIvZnMuYwpAQCAtNDA2LDcgKzQwNiw3IEBACiAKIC8qIGpmZnMyX25ld19pbm9kZTogYWxsb2NhdGUgYSBuZXcgaW5vZGUgYW5kIGlub2NhY2hlLCBhZGQgaXQgdG8gdGhlIGhhc2gsCiAgICBmaWxsIGluIHRoZSByYXdfaW5vZGUgd2hpbGUgeW91J3JlIGF0IGl0LiAqLwotc3RydWN0IGlub2RlICpqZmZzMl9uZXdfaW5vZGUgKHN0cnVjdCBpbm9kZSAqZGlyX2ksIGludCBtb2RlLCBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaSkKK3N0cnVjdCBpbm9kZSAqamZmczJfbmV3X2lub2RlIChzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBtb2RlX3QgbW9kZSwgc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmkpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyX2ktPmlfc2I7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9vcy1saW51eC5oIGIvZnMvamZmczIvb3MtbGludXguaAppbmRleCA2NWM2YzQzLi41MjY5NzljIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9vcy1saW51eC5oCisrKyBiL2ZzL2pmZnMyL29zLWxpbnV4LmgKQEAgLTE1OCw3ICsxNTgsNyBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZmczJfZmlsZV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmZnMyX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGpmZnMyX2ZpbGVfYWRkcmVzc19vcGVyYXRpb25zOwotaW50IGpmZnMyX2ZzeW5jKHN0cnVjdCBmaWxlICosIGludCk7CitpbnQgamZmczJfZnN5bmMoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBsb2ZmX3QsIGludCk7CiBpbnQgamZmczJfZG9fcmVhZHBhZ2VfdW5sb2NrIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGcpOwogCiAvKiBpb2N0bC5jICovCkBAIC0xNzMsNyArMTczLDcgQEAKIHN0cnVjdCBpbm9kZSAqamZmczJfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CiB2b2lkIGpmZnMyX2V2aWN0X2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CiB2b2lkIGpmZnMyX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncyk7Ci1zdHJ1Y3QgaW5vZGUgKmpmZnMyX25ld19pbm9kZSAoc3RydWN0IGlub2RlICpkaXJfaSwgaW50IG1vZGUsCitzdHJ1Y3QgaW5vZGUgKmpmZnMyX25ld19pbm9kZSAoc3RydWN0IGlub2RlICpkaXJfaSwgbW9kZV90IG1vZGUsCiAJCQkgICAgICAgc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmkpOwogaW50IGpmZnMyX3N0YXRmcyAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKIGludCBqZmZzMl9yZW1vdW50X2ZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9yZWFkaW5vZGUuYyBiL2ZzL2pmZnMyL3JlYWRpbm9kZS5jCmluZGV4IDJhYjFhMGQuLmVlNTdiYWMgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3JlYWRpbm9kZS5jCisrKyBiL2ZzL2pmZnMyL3JlYWRpbm9kZS5jCkBAIC0xMDQxLDcgKzEwNDEsNyBAQAogCQkvKiBGSVhNRTogcG9pbnQoKSAqLwogCQllcnIgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIHJlZl9vZmZzZXQocmVmKSwgbGVuLCAmcmV0bGVuLCBidWYpOwogCQlpZiAoZXJyKSB7Ci0JCQlKRkZTMl9FUlJPUigiY2FuIG5vdCByZWFkICVkIGJ5dGVzIGZyb20gMHglMDh4LCAiICJlcnJvciBjb2RlOiAlZC5cbiIsIGxlbiwgcmVmX29mZnNldChyZWYpLCBlcnIpOworCQkJSkZGUzJfRVJST1IoImNhbiBub3QgcmVhZCAlZCBieXRlcyBmcm9tIDB4JTA4eCwgZXJyb3IgY29kZTogJWQuXG4iLCBsZW4sIHJlZl9vZmZzZXQocmVmKSwgZXJyKTsKIAkJCWdvdG8gZnJlZV9vdXQ7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3ltbGluay5jIGIvZnMvamZmczIvc3ltbGluay5jCmluZGV4IGI5NTU2MjYuLmUzMDM1YWYgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3N5bWxpbmsuYworKysgYi9mcy9qZmZzMi9zeW1saW5rLmMKQEAgLTIwLDcgKzIwLDcgQEAKIHsKIAkucmVhZGxpbmsgPQlnZW5lcmljX3JlYWRsaW5rLAogCS5mb2xsb3dfbGluayA9CWpmZnMyX2ZvbGxvd19saW5rLAotCS5jaGVja19hY2wgPQlqZmZzMl9jaGVja19hY2wsCisJLmdldF9hY2wgPQlqZmZzMl9nZXRfYWNsLAogCS5zZXRhdHRyID0JamZmczJfc2V0YXR0ciwKIAkuc2V0eGF0dHIgPQlqZmZzMl9zZXR4YXR0ciwKIAkuZ2V0eGF0dHIgPQlqZmZzMl9nZXR4YXR0ciwKZGlmZiAtLWdpdCBhL2ZzL2pmcy9hY2wuYyBiL2ZzL2pmcy9hY2wuYwppbmRleCBlNWRlOTQyLi5iM2EzMmNhIDEwMDY0NAotLS0gYS9mcy9qZnMvYWNsLmMKKysrIGIvZnMvamZzL2FjbC5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAiamZzX3hhdHRyLmgiCiAjaW5jbHVkZSAiamZzX2FjbC5oIgogCi1zdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqamZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCitzdHJ1Y3QgcG9zaXhfYWNsICpqZnNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJY2hhciAqZWFfbmFtZTsKQEAgLTExNCwzMCArMTE0LDkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBqZnNfY2hlY2tfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IHBvc2l4X2FjbCAqYWNsOwotCi0JaWYgKGZsYWdzICYgSVBFUk1fRkxBR19SQ1UpCi0JCXJldHVybiAtRUNISUxEOwotCi0JYWNsID0gamZzX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0JaWYgKElTX0VSUihhY2wpKQotCQlyZXR1cm4gUFRSX0VSUihhY2wpOwotCWlmIChhY2wpIHsKLQkJaW50IGVycm9yID0gcG9zaXhfYWNsX3Blcm1pc3Npb24oaW5vZGUsIGFjbCwgbWFzayk7Ci0JCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlyZXR1cm4gLUVBR0FJTjsKLX0KLQogaW50IGpmc19pbml0X2FjbCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQogewogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqY2xvbmU7Ci0JbW9kZV90IG1vZGU7CiAJaW50IHJjID0gMDsKIAogCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQpAQCAtMTQ4LDI1ICsxMjcsMTggQEAKIAkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKIAogCWlmIChhY2wpIHsKKwkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJcmMgPSBqZnNfc2V0X2FjbCh0aWQsIGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBhY2wpOwogCQkJaWYgKHJjKQogCQkJCWdvdG8gY2xlYW51cDsKIAkJfQotCQljbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNsb25lKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JCXJjID0gcG9zaXhfYWNsX2NyZWF0ZV9tYXNxKGNsb25lLCAmbW9kZSk7Ci0JCWlmIChyYyA+PSAwKSB7Ci0JCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKLQkJCWlmIChyYyA+IDApCi0JCQkJcmMgPSBqZnNfc2V0X2FjbCh0aWQsIGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsCi0JCQkJCQkgY2xvbmUpOwotCQl9Ci0JCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKKwkJcmMgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9LRVJORUwsICZtb2RlKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gY2xlYW51cDsgLyogcG9zaXhfYWNsX3JlbGVhc2UoTlVMTCkgaXMgbm8tb3AgKi8KKwkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCWlmIChyYyA+IDApCisJCQlyYyA9IGpmc19zZXRfYWNsKHRpZCwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKIGNsZWFudXA6CiAJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CiAJfSBlbHNlCkBAIC0xODAsOCArMTUyLDkgQEAKIAogaW50IGpmc19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpjbG9uZTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJaW50IHJjOworCXRpZF90IHRpZDsKIAogCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0xOTAsMjIgKzE2MywxOCBAQAogCWlmIChJU19FUlIoYWNsKSB8fCAhYWNsKQogCQlyZXR1cm4gUFRSX0VSUihhY2wpOwogCi0JY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKKwlyYyA9IHBvc2l4X2FjbF9jaG1vZCgmYWNsLCBHRlBfS0VSTkVMLCBpbm9kZS0+aV9tb2RlKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXRpZCA9IHR4QmVnaW4oaW5vZGUtPmlfc2IsIDApOworCW11dGV4X2xvY2soJkpGU19JUChpbm9kZSktPmNvbW1pdF9tdXRleCk7CisJcmMgPSBqZnNfc2V0X2FjbCh0aWQsIGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGFjbCk7CisJaWYgKCFyYykKKwkJcmMgPSB0eENvbW1pdCh0aWQsIDEsICZpbm9kZSwgMCk7CisJdHhFbmQodGlkKTsKKwltdXRleF91bmxvY2soJkpGU19JUChpbm9kZSktPmNvbW1pdF9tdXRleCk7CisKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCWlmICghY2xvbmUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmMgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7Ci0JaWYgKCFyYykgewotCQl0aWRfdCB0aWQgPSB0eEJlZ2luKGlub2RlLT5pX3NiLCAwKTsKLQkJbXV0ZXhfbG9jaygmSkZTX0lQKGlub2RlKS0+Y29tbWl0X211dGV4KTsKLQkJcmMgPSBqZnNfc2V0X2FjbCh0aWQsIGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKLQkJaWYgKCFyYykKLQkJCXJjID0gdHhDb21taXQodGlkLCAxLCAmaW5vZGUsIDApOwotCQl0eEVuZCh0aWQpOwotCQltdXRleF91bmxvY2soJkpGU19JUChpbm9kZSktPmNvbW1pdF9tdXRleCk7Ci0JfQotCi0JcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOwogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2ZzL2pmcy9maWxlLmMgYi9mcy9qZnMvZmlsZS5jCmluZGV4IGM1Y2U2YzEuLjg0NGY5NDYgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9maWxlLmMKKysrIGIvZnMvamZzL2ZpbGUuYwpAQCAtMjgsMTkgKzI4LDI2IEBACiAjaW5jbHVkZSAiamZzX2FjbC5oIgogI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgogCi1pbnQgamZzX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpCitpbnQgamZzX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCWludCByYyA9IDA7CiAKKwlyYyA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZKSB8fAogCSAgICAoZGF0YXN5bmMgJiYgIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFlfREFUQVNZTkMpKSkgewogCQkvKiBNYWtlIHN1cmUgY29tbWl0dGVkIGNoYW5nZXMgaGl0IHRoZSBkaXNrICovCiAJCWpmc19mbHVzaF9qb3VybmFsKEpGU19TQkkoaW5vZGUtPmlfc2IpLT5sb2csIDEpOworCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAkJcmV0dXJuIHJjOwogCX0KIAogCXJjIHw9IGpmc19jb21taXRfaW5vZGUoaW5vZGUsIDEpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmV0dXJuIHJjID8gLUVJTyA6IDA7CiB9CkBAIC02Niw5ICs3Myw5IEBACiAJCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaW5vZGUpOwogCQlzcGluX2xvY2tfaXJxKCZqaS0+YWdfbG9jayk7CiAJCWlmIChqaS0+YWN0aXZlX2FnID09IC0xKSB7Ci0JCQlqaS0+YWN0aXZlX2FnID0gamktPmFnbm87Ci0JCQlhdG9taWNfaW5jKAotCQkJICAgICZKRlNfU0JJKGlub2RlLT5pX3NiKS0+Ym1hcC0+ZGJfYWN0aXZlW2ppLT5hZ25vXSk7CisJCQlzdHJ1Y3QgamZzX3NiX2luZm8gKmpmc19zYiA9IEpGU19TQkkoaW5vZGUtPmlfc2IpOworCQkJamktPmFjdGl2ZV9hZyA9IEJMS1RPQUcoYWRkcmVzc1BYRCgmamktPml4cHhkKSwgamZzX3NiKTsKKwkJCWF0b21pY19pbmMoICZqZnNfc2ItPmJtYXAtPmRiX2FjdGl2ZVtqaS0+YWN0aXZlX2FnXSk7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxKCZqaS0+YWdfbG9jayk7CiAJfQpAQCAtMTEwLDYgKzExNyw4IEBACiAKIAlpZiAoKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgJiYKIAkgICAgaWF0dHItPmlhX3NpemUgIT0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJCWlub2RlX2Rpb193YWl0KGlub2RlKTsKKwogCQlyYyA9IHZtdHJ1bmNhdGUoaW5vZGUsIGlhdHRyLT5pYV9zaXplKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwpAQCAtMTMxLDcgKzE0MCw3IEBACiAJLnJlbW92ZXhhdHRyCT0gamZzX3JlbW92ZXhhdHRyLAogCS5zZXRhdHRyCT0gamZzX3NldGF0dHIsCiAjaWZkZWYgQ09ORklHX0pGU19QT1NJWF9BQ0wKLQkuY2hlY2tfYWNsCT0gamZzX2NoZWNrX2FjbCwKKwkuZ2V0X2FjbAk9IGpmc19nZXRfYWNsLAogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9mcy9qZnMvaW5vZGUuYyBiL2ZzL2pmcy9pbm9kZS5jCmluZGV4IDEwOTY1NTkuLjc3YjY5YjIgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9pbm9kZS5jCisrKyBiL2ZzL2pmcy9pbm9kZS5jCkBAIC0zMjksOCArMzI5LDggQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCXNzaXplX3QgcmV0OwogCi0JcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LAotCQkJCW9mZnNldCwgbnJfc2VncywgamZzX2dldF9ibG9jaywgTlVMTCk7CisJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW92LCBvZmZzZXQsIG5yX3NlZ3MsCisJCQkJIGpmc19nZXRfYmxvY2spOwogCiAJLyoKIAkgKiBJbiBjYXNlIG9mIGVycm9yIGV4dGVuZGluZyB3cml0ZSBtYXkgaGF2ZSBpbnN0YW50aWF0ZWQgYSBmZXcKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfYWNsLmggYi9mcy9qZnMvamZzX2FjbC5oCmluZGV4IGY5Mjg1YzQuLmFkODRmZTUgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfYWNsLmgKKysrIGIvZnMvamZzL2pmc19hY2wuaApAQCAtMjAsNyArMjAsNyBAQAogCiAjaWZkZWYgQ09ORklHX0pGU19QT1NJWF9BQ0wKIAotaW50IGpmc19jaGVja19hY2woc3RydWN0IGlub2RlICosIGludCwgdW5zaWduZWQgaW50IGZsYWdzKTsKK3N0cnVjdCBwb3NpeF9hY2wgKmpmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKIGludCBqZnNfaW5pdF9hY2wodGlkX3QsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CiBpbnQgamZzX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIApkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbWFwLmMgYi9mcy9qZnMvamZzX2ltYXAuYwppbmRleCBlZDUzYTQ3Li5iNzhiMmY5IDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2ltYXAuYworKysgYi9mcy9qZnMvamZzX2ltYXAuYwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJcmVsZWFzZV9tZXRhcGFnZShtcCk7CiAKIAkvKiBzZXQgdGhlIGFnIGZvciB0aGUgaW5vZGUgKi8KLQlKRlNfSVAoaXApLT5hZ25vID0gQkxLVE9BRyhhZ3N0YXJ0LCBzYmkpOworCUpGU19JUChpcCktPmFnc3RhcnQgPSBhZ3N0YXJ0OwogCUpGU19JUChpcCktPmFjdGl2ZV9hZyA9IC0xOwogCiAJcmV0dXJuIChyYyk7CkBAIC05MDEsNyArOTAxLDcgQEAKIAogCS8qIGdldCB0aGUgYWxsb2NhdGlvbiBncm91cCBmb3IgdGhpcyBpbm8uCiAJICovCi0JYWdubyA9IEpGU19JUChpcCktPmFnbm87CisJYWdubyA9IEJMS1RPQUcoSkZTX0lQKGlwKS0+YWdzdGFydCwgSkZTX1NCSShpcC0+aV9zYikpOwogCiAJLyogTG9jayB0aGUgQUcgc3BlY2lmaWMgaW5vZGUgbWFwIGluZm9ybWF0aW9uCiAJICovCkBAIC0xMzE1LDEyICsxMzE1LDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGRpSW5pdElub2RlKHN0cnVjdCBpbm9kZSAqaXAsIGludCBpYWdubywgaW50IGlubywgaW50IGV4dG5vLCBzdHJ1Y3QgaWFnICogaWFncCkKIHsKLQlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoaXAtPmlfc2IpOwogCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwID0gSkZTX0lQKGlwKTsKIAogCWlwLT5pX2lubyA9IChpYWdubyA8PCBMMklOT1NQRVJJQUcpICsgaW5vOwogCWpmc19pcC0+aXhweGQgPSBpYWdwLT5pbm9leHRbZXh0bm9dOwotCWpmc19pcC0+YWdubyA9IEJMS1RPQUcobGU2NF90b19jcHUoaWFncC0+YWdzdGFydCksIHNiaSk7CisJamZzX2lwLT5hZ3N0YXJ0ID0gbGU2NF90b19jcHUoaWFncC0+YWdzdGFydCk7CiAJamZzX2lwLT5hY3RpdmVfYWcgPSAtMTsKIH0KIApAQCAtMTM3OSw3ICsxMzc4LDcgQEAKIAkgKi8KIAogCS8qIGdldCB0aGUgYWcgbnVtYmVyIG9mIHRoaXMgaWFnICovCi0JYWdubyA9IEpGU19JUChwaXApLT5hZ25vOworCWFnbm8gPSBCTEtUT0FHKEpGU19JUChwaXApLT5hZ3N0YXJ0LCBKRlNfU0JJKHBpcC0+aV9zYikpOwogCiAJaWYgKGF0b21pY19yZWFkKCZKRlNfU0JJKHBpcC0+aV9zYiktPmJtYXAtPmRiX2FjdGl2ZVthZ25vXSkpIHsKIAkJLyoKQEAgLTI5MjEsMTAgKzI5MjAsOSBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQkvKiBhZ3N0YXJ0IHRoYXQgY29tcHV0ZXMgdG8gdGhlIHNhbWUgYWcgaXMgdHJlYXRlZCBhcyBzYW1lOyAqLwogCQlhZ3N0YXJ0ID0gbGU2NF90b19jcHUoaWFncC0+YWdzdGFydCk7Ci0JCS8qIGlhZ3AtPmFnc3RhcnQgPSBhZ3N0YXJ0ICYgfihtcC0+ZGJfYWdzaXplIC0gMSk7ICovCiAJCW4gPSBhZ3N0YXJ0ID4+IG1wLT5kYl9hZ2wyc2l6ZTsKKwkJaWFncC0+YWdzdGFydCA9IGNwdV90b19sZTY0KChzNjQpbiA8PCBtcC0+ZGJfYWdsMnNpemUpOwogCiAJCS8qIGNvbXB1dGUgYmFja2VkIGlub2RlcyAqLwogCQludW1pbm9zID0gKEVYVFNQRVJJQUcgLSBsZTMyX3RvX2NwdShpYWdwLT5uZnJlZWV4dHMpKQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbmNvcmUuaCBiL2ZzL2pmcy9qZnNfaW5jb3JlLmgKaW5kZXggMTQzOWYxMS4uNTg0YTRhMSAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19pbmNvcmUuaAorKysgYi9mcy9qZnMvamZzX2luY29yZS5oCkBAIC01MCw4ICs1MCw5IEBACiAJc2hvcnQJYnRpbmRleDsJLyogYnRwYWdlIGVudHJ5IGluZGV4Ki8KIAlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsJLyogaW5vZGUgbWFwCQkJKi8KIAl1bnNpZ25lZCBsb25nIGNmbGFnOwkvKiBjb21taXQgZmxhZ3MJCSovCisJdTY0CWFnc3RhcnQ7CS8qIGFnc3RhcnQgb2YgdGhlIGNvbnRhaW5pbmcgSUFHICovCiAJdTE2CWJ4ZmxhZzsJCS8qIHhmbGFnIG9mIHBzZXVkbyBidWZmZXI/CSovCi0JdW5jaGFyCWFnbm87CQkvKiBhZyBudW1iZXIJCQkqLworCXVuY2hhcglwYWQ7CiAJc2lnbmVkIGNoYXIgYWN0aXZlX2FnOwkvKiBhZyBjdXJyZW50bHkgYWxsb2NhdGluZyBmcm9tCSovCiAJbGlkX3QJYmxpZDsJCS8qIGxpZCBvZiBwc2V1ZG8gYnVmZmVyPwkqLwogCWxpZF90CWF0bGhlYWQ7CS8qIGFub255bW91cyB0bG9jayBsaXN0IGhlYWQJKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfaW5vZGUuaCBiL2ZzL2pmcy9qZnNfaW5vZGUuaAppbmRleCBlYzJmYjhiLi45MjcxY2ZlIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2lub2RlLmgKKysrIGIvZnMvamZzL2pmc19pbm9kZS5oCkBAIC0yMSw3ICsyMSw3IEBACiBzdHJ1Y3QgZmlkOwogCiBleHRlcm4gc3RydWN0IGlub2RlICppYWxsb2Moc3RydWN0IGlub2RlICosIHVtb2RlX3QpOwotZXh0ZXJuIGludCBqZnNfZnN5bmMoc3RydWN0IGZpbGUgKiwgaW50KTsKK2V4dGVybiBpbnQgamZzX2ZzeW5jKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgbG9mZl90LCBpbnQpOwogZXh0ZXJuIGxvbmcgamZzX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gbG9uZyBqZnNfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gc3RydWN0IGlub2RlICpqZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2xvZ21nci5jIGIvZnMvamZzL2pmc19sb2dtZ3IuYwppbmRleCAyNzhlM2ZiLi41ODM2MzZmIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2xvZ21nci5jCisrKyBiL2ZzL2pmcy9qZnNfbG9nbWdyLmMKQEAgLTExMjMsNyArMTEyMyw3IEBACiAJYmRldiA9IGJsa2Rldl9nZXRfYnlfZGV2KHNiaS0+bG9nZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFfEZNT0RFX0VYQ0wsCiAJCQkJIGxvZyk7CiAJaWYgKElTX0VSUihiZGV2KSkgewotCQlyYyA9IC1QVFJfRVJSKGJkZXYpOworCQlyYyA9IFBUUl9FUlIoYmRldik7CiAJCWdvdG8gZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2pmcy9uYW1laS5jIGIvZnMvamZzL25hbWVpLmMKaW5kZXggZWFhZjJiNS4uMjliMWYxYSAxMDA2NDQKLS0tIGEvZnMvamZzL25hbWVpLmMKKysrIGIvZnMvamZzL25hbWVpLmMKQEAgLTE0NTYsMzQgKzE0NTYsMjMgQEAKIAlpbm9fdCBpbnVtOwogCXN0cnVjdCBpbm9kZSAqaXA7CiAJc3RydWN0IGNvbXBvbmVudF9uYW1lIGtleTsKLQljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKLQlpbnQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOwogCWludCByYzsKIAotCWpmc19pbmZvKCJqZnNfbG9va3VwOiBuYW1lID0gJXMiLCBuYW1lKTsKKwlqZnNfaW5mbygiamZzX2xvb2t1cDogbmFtZSA9ICVzIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKLQlpZiAoKG5hbWVbMF0gPT0gJy4nKSAmJiAobGVuID09IDEpKQotCQlpbnVtID0gZGlwLT5pX2lubzsKLQllbHNlIGlmIChzdHJjbXAobmFtZSwgIi4uIikgPT0gMCkKLQkJaW51bSA9IFBBUkVOVChkaXApOwotCWVsc2UgewotCQlpZiAoKHJjID0gZ2V0X1VDU25hbWUoJmtleSwgZGVudHJ5KSkpCi0JCQlyZXR1cm4gRVJSX1BUUihyYyk7Ci0JCXJjID0gZHRTZWFyY2goZGlwLCAma2V5LCAmaW51bSwgJmJ0c3RhY2ssIEpGU19MT09LVVApOwotCQlmcmVlX1VDU25hbWUoJmtleSk7Ci0JCWlmIChyYyA9PSAtRU5PRU5UKSB7Ci0JCQlkX2FkZChkZW50cnksIE5VTEwpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0gZWxzZSBpZiAocmMpIHsKLQkJCWpmc19lcnIoImpmc19sb29rdXA6IGR0U2VhcmNoIHJldHVybmVkICVkIiwgcmMpOwotCQkJcmV0dXJuIEVSUl9QVFIocmMpOwotCQl9Ci0JfQotCi0JaXAgPSBqZnNfaWdldChkaXAtPmlfc2IsIGludW0pOwotCWlmIChJU19FUlIoaXApKSB7Ci0JCWpmc19lcnIoImpmc19sb29rdXA6IGlnZXQgZmFpbGVkIG9uIGludW0gJWQiLCAodWludCkgaW51bSk7Ci0JCXJldHVybiBFUlJfQ0FTVChpcCk7CisJaWYgKChyYyA9IGdldF9VQ1NuYW1lKCZrZXksIGRlbnRyeSkpKQorCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJcmMgPSBkdFNlYXJjaChkaXAsICZrZXksICZpbnVtLCAmYnRzdGFjaywgSkZTX0xPT0tVUCk7CisJZnJlZV9VQ1NuYW1lKCZrZXkpOworCWlmIChyYyA9PSAtRU5PRU5UKSB7CisJCWlwID0gTlVMTDsKKwl9IGVsc2UgaWYgKHJjKSB7CisJCWpmc19lcnIoImpmc19sb29rdXA6IGR0U2VhcmNoIHJldHVybmVkICVkIiwgcmMpOworCQlpcCA9IEVSUl9QVFIocmMpOworCX0gZWxzZSB7CisJCWlwID0gamZzX2lnZXQoZGlwLT5pX3NiLCBpbnVtKTsKKwkJaWYgKElTX0VSUihpcCkpCisJCQlqZnNfZXJyKCJqZnNfbG9va3VwOiBpZ2V0IGZhaWxlZCBvbiBpbnVtICVkIiwgKHVpbnQpaW51bSk7CiAJfQogCiAJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlwLCBkZW50cnkpOwpAQCAtMTU0OCw3ICsxNTM3LDcgQEAKIAkucmVtb3ZleGF0dHIJPSBqZnNfcmVtb3ZleGF0dHIsCiAJLnNldGF0dHIJPSBqZnNfc2V0YXR0ciwKICNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAotCS5jaGVja19hY2wJPSBqZnNfY2hlY2tfYWNsLAorCS5nZXRfYWNsCT0gamZzX2dldF9hY2wsCiAjZW5kaWYKIH07CiAKQEAgLTE1OTcsOCArMTU4Niw2IEBACiAKIHN0YXRpYyBpbnQgamZzX2NpX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQlpZiAobmQgJiYgbmQtPmZsYWdzICYgTE9PS1VQX1JDVSkKLQkJcmV0dXJuIC1FQ0hJTEQ7CiAJLyoKIAkgKiBUaGlzIGlzIG5vdCBuZWdhdGl2ZSBkZW50cnkuIEFsd2F5cyB2YWxpZC4KIAkgKgpAQCAtMTYyNCwxMCArMTYxMSw4IEBACiAJICogY2FzZSBzZW5zaXRpdmUgbmFtZSB3aGljaCBpcyBzcGVjaWZpZWQgYnkgdXNlciBpZiB0aGlzIGlzCiAJICogZm9yIGNyZWF0aW9uLgogCSAqLwotCWlmICghKG5kLT5mbGFncyAmIChMT09LVVBfQ09OVElOVUUgfCBMT09LVVBfUEFSRU5UKSkpIHsKLQkJaWYgKG5kLT5mbGFncyAmIChMT09LVVBfQ1JFQVRFIHwgTE9PS1VQX1JFTkFNRV9UQVJHRVQpKQotCQkJcmV0dXJuIDA7Ci0JfQorCWlmIChuZC0+ZmxhZ3MgJiAoTE9PS1VQX0NSRUFURSB8IExPT0tVUF9SRU5BTUVfVEFSR0VUKSkKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2pmcy9yZXNpemUuYyBiL2ZzL2pmcy9yZXNpemUuYwppbmRleCA4ZWE1ZWZiLi44ZDBjMWM3IDEwMDY0NAotLS0gYS9mcy9qZnMvcmVzaXplLmMKKysrIGIvZnMvamZzL3Jlc2l6ZS5jCkBAIC04MCw3ICs4MCw3IEBACiAJaW50IGxvZ19mb3JtYXR0ZWQgPSAwOwogCXN0cnVjdCBpbm9kZSAqaXBsaXN0WzFdOwogCXN0cnVjdCBqZnNfc3VwZXJibG9jayAqal9zYiwgKmpfc2IyOwotCXVpbnQgb2xkX2Fnc2l6ZTsKKwlzNjQgb2xkX2Fnc2l6ZTsKIAlpbnQgYWdzaXplY2hhbmdlZCA9IDA7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmJoMjsKIApkaWZmIC0tZ2l0IGEvZnMvbGliZnMuYyBiL2ZzL2xpYmZzLmMKaW5kZXggYzg4ZWFiNS4uYzE4ZTlhMSAxMDA2NDQKLS0tIGEvZnMvbGliZnMuYworKysgYi9mcy9saWJmcy5jCkBAIC0xNiw2ICsxNiw4IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwogc3RhdGljIGlubGluZSBpbnQgc2ltcGxlX3Bvc2l0aXZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlyZXR1cm4gZGVudHJ5LT5kX2lub2RlICYmICFkX3VuaGFzaGVkKGRlbnRyeSk7CkBAIC0yNDYsMTMgKzI0OCwxMSBAQAogCXJvb3QtPmlfaW5vID0gMTsKIAlyb290LT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVTUiB8IFNfSVdVU1I7CiAJcm9vdC0+aV9hdGltZSA9IHJvb3QtPmlfbXRpbWUgPSByb290LT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCWRlbnRyeSA9IGRfYWxsb2MoTlVMTCwgJmRfbmFtZSk7CisJZGVudHJ5ID0gX19kX2FsbG9jKHMsICZkX25hbWUpOwogCWlmICghZGVudHJ5KSB7CiAJCWlwdXQocm9vdCk7CiAJCWdvdG8gRW5vbWVtOwogCX0KLQlkZW50cnktPmRfc2IgPSBzOwotCWRlbnRyeS0+ZF9wYXJlbnQgPSBkZW50cnk7CiAJZF9pbnN0YW50aWF0ZShkZW50cnksIHJvb3QpOwogCXMtPnNfcm9vdCA9IGRlbnRyeTsKIAlzLT5zX2Rfb3AgPSBkb3BzOwpAQCAtMzI4LDggKzMyOCwxMCBAQAogCiAJaWYgKG5ld19kZW50cnktPmRfaW5vZGUpIHsKIAkJc2ltcGxlX3VubGluayhuZXdfZGlyLCBuZXdfZGVudHJ5KTsKLQkJaWYgKHRoZXlfYXJlX2RpcnMpCisJCWlmICh0aGV5X2FyZV9kaXJzKSB7CisJCQlkcm9wX25saW5rKG5ld19kZW50cnktPmRfaW5vZGUpOwogCQkJZHJvcF9ubGluayhvbGRfZGlyKTsKKwkJfQogCX0gZWxzZSBpZiAodGhleV9hcmVfZGlycykgewogCQlkcm9wX25saW5rKG9sZF9kaXIpOwogCQlpbmNfbmxpbmsobmV3X2Rpcik7CkBAIC04MjIsNyArODI0LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlhdHRyLT5zZXRfYnVmW3NpemVdID0gJ1wwJzsKLQl2YWwgPSBzaW1wbGVfc3RydG9sKGF0dHItPnNldF9idWYsIE5VTEwsIDApOworCXZhbCA9IHNpbXBsZV9zdHJ0b2xsKGF0dHItPnNldF9idWYsIE5VTEwsIDApOwogCXJldCA9IGF0dHItPnNldChhdHRyLT5kYXRhLCB2YWwpOwogCWlmIChyZXQgPT0gMCkKIAkJcmV0ID0gbGVuOyAvKiBvbiBzdWNjZXNzLCBjbGFpbSB3ZSBnb3QgdGhlIHdob2xlIGlucHV0ICovCkBAIC05MDUsMjEgKzkwNywyOSBAQAogICogZmlsZXN5c3RlbXMgd2hpY2ggdHJhY2sgYWxsIG5vbi1pbm9kZSBtZXRhZGF0YSBpbiB0aGUgYnVmZmVycyBsaXN0CiAgKiBoYW5naW5nIG9mZiB0aGUgYWRkcmVzc19zcGFjZSBzdHJ1Y3R1cmUuCiAgKi8KLWludCBnZW5lcmljX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK2ludCBnZW5lcmljX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwKKwkJICAgICAgIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCWludCBlcnI7CiAJaW50IHJldDsKIAorCWVyciA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXQgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhpbm9kZS0+aV9tYXBwaW5nKTsKIAlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFkpKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dDsKIAlpZiAoZGF0YXN5bmMgJiYgIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFlfREFUQVNZTkMpKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dDsKIAogCWVyciA9IHN5bmNfaW5vZGVfbWV0YWRhdGEoaW5vZGUsIDEpOwogCWlmIChyZXQgPT0gMCkKIAkJcmV0ID0gZXJyOworb3V0OgorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmlsZV9mc3luYyk7CkBAIC05NTYsNyArOTY2LDcgQEAKIC8qCiAgKiBOby1vcCBpbXBsZW1lbnRhdGlvbiBvZiAtPmZzeW5jIGZvciBpbi1tZW1vcnkgZmlsZXN5c3RlbXMuCiAgKi8KLWludCBub29wX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpCitpbnQgbm9vcF9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9jbG50cHJvYy5jIGIvZnMvbG9ja2QvY2xudHByb2MuYwppbmRleCBhZGI0NWVjLi5lMzc0MDUwIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9jbG50cHJvYy5jCisrKyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKQEAgLTcwOCw3ICs3MDgsMTMgQEAKIAogCWlmICh0YXNrLT50a19zdGF0dXMgPCAwKSB7CiAJCWRwcmludGsoImxvY2tkOiB1bmxvY2sgZmFpbGVkIChlcnIgPSAlZClcbiIsIC10YXNrLT50a19zdGF0dXMpOwotCQlnb3RvIHJldHJ5X3JlYmluZDsKKwkJc3dpdGNoICh0YXNrLT50a19zdGF0dXMpIHsKKwkJY2FzZSAtRUFDQ0VTOgorCQljYXNlIC1FSU86CisJCQlnb3RvIGRpZTsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gcmV0cnlfcmViaW5kOworCQl9CiAJfQogCWlmIChzdGF0dXMgPT0gTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EKSB7CiAJCXJwY19kZWxheSh0YXNrLCBOTE1DTE5UX0dSQUNFX1dBSVQpOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjbG9jay5jIGIvZnMvbG9ja2Qvc3ZjbG9jay5jCmluZGV4IDZlMzE2OTUuLmYwMTc5YzMgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Y2xvY2suYworKysgYi9mcy9sb2NrZC9zdmNsb2NrLmMKQEAgLTYzMiw3ICs2MzIsNyBAQAogCiAvKgogICogVGhpcyBpcyBhIGNhbGxiYWNrIGZyb20gdGhlIGZpbGVzeXN0ZW0gZm9yIFZGUyBmaWxlIGxvY2sgcmVxdWVzdHMuCi0gKiBJdCB3aWxsIGJlIHVzZWQgaWYgZmxfZ3JhbnQgaXMgZGVmaW5lZCBhbmQgdGhlIGZpbGVzeXN0ZW0gY2FuIG5vdAorICogSXQgd2lsbCBiZSB1c2VkIGlmIGxtX2dyYW50IGlzIGRlZmluZWQgYW5kIHRoZSBmaWxlc3lzdGVtIGNhbiBub3QKICAqIHJlc3BvbmQgdG8gdGhlIHJlcXVlc3QgaW1tZWRpYXRlbHkuCiAgKiBGb3IgR0VUTEsgcmVxdWVzdCBpdCB3aWxsIGNvcHkgdGhlIHJlcGx5IHRvIHRoZSBubG1fYmxvY2suCiAgKiBGb3IgU0VUTEsgb3IgU0VUTEtXIHJlcXVlc3QgaXQgd2lsbCBnZXQgdGhlIGxvY2FsIHBvc2l4IGxvY2suCkBAIC03MTksOSArNzE5LDkgQEAKIH0KIAogY29uc3Qgc3RydWN0IGxvY2tfbWFuYWdlcl9vcGVyYXRpb25zIG5sbXN2Y19sb2NrX29wZXJhdGlvbnMgPSB7Ci0JLmZsX2NvbXBhcmVfb3duZXIgPSBubG1zdmNfc2FtZV9vd25lciwKLQkuZmxfbm90aWZ5ID0gbmxtc3ZjX25vdGlmeV9ibG9ja2VkLAotCS5mbF9ncmFudCA9IG5sbXN2Y19ncmFudF9kZWZlcnJlZCwKKwkubG1fY29tcGFyZV9vd25lciA9IG5sbXN2Y19zYW1lX293bmVyLAorCS5sbV9ub3RpZnkgPSBubG1zdmNfbm90aWZ5X2Jsb2NrZWQsCisJLmxtX2dyYW50ID0gbmxtc3ZjX2dyYW50X2RlZmVycmVkLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jCmluZGV4IDBhNGY1MGQuLjcwM2Y1NDUgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tzLmMKKysrIGIvZnMvbG9ja3MuYwpAQCAtMTYwLDEwICsxNjAsMjIgQEAKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpmaWxlbG9ja19jYWNoZSBfX3JlYWRfbW9zdGx5OwogCitzdGF0aWMgdm9pZCBsb2Nrc19pbml0X2xvY2tfaGVhZHMoc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJSU5JVF9MSVNUX0hFQUQoJmZsLT5mbF9saW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmZmwtPmZsX2Jsb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmbC0+Zmxfd2FpdCk7Cit9CisKIC8qIEFsbG9jYXRlIGFuIGVtcHR5IGxvY2sgc3RydWN0dXJlLiAqLwogc3RydWN0IGZpbGVfbG9jayAqbG9ja3NfYWxsb2NfbG9jayh2b2lkKQogewotCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGZpbGVsb2NrX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9IGttZW1fY2FjaGVfemFsbG9jKGZpbGVsb2NrX2NhY2hlLCBHRlBfS0VSTkVMKTsKKworCWlmIChmbCkKKwkJbG9ja3NfaW5pdF9sb2NrX2hlYWRzKGZsKTsKKworCXJldHVybiBmbDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tzX2FsbG9jX2xvY2spOwogCkBAIC0xNzUsOCArMTg3LDggQEAKIAkJZmwtPmZsX29wcyA9IE5VTEw7CiAJfQogCWlmIChmbC0+ZmxfbG1vcHMpIHsKLQkJaWYgKGZsLT5mbF9sbW9wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKQotCQkJZmwtPmZsX2xtb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUoZmwpOworCQlpZiAoZmwtPmZsX2xtb3BzLT5sbV9yZWxlYXNlX3ByaXZhdGUpCisJCQlmbC0+ZmxfbG1vcHMtPmxtX3JlbGVhc2VfcHJpdmF0ZShmbCk7CiAJCWZsLT5mbF9sbW9wcyA9IE5VTEw7CiAJfQogCkBAIC0xOTcsMzUgKzIwOSwxMiBAQAogCiB2b2lkIGxvY2tzX2luaXRfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKIHsKLQlJTklUX0xJU1RfSEVBRCgmZmwtPmZsX2xpbmspOwotCUlOSVRfTElTVF9IRUFEKCZmbC0+ZmxfYmxvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZsLT5mbF93YWl0KTsKLQlmbC0+ZmxfbmV4dCA9IE5VTEw7Ci0JZmwtPmZsX2Zhc3luYyA9IE5VTEw7Ci0JZmwtPmZsX293bmVyID0gTlVMTDsKLQlmbC0+ZmxfcGlkID0gMDsKLQlmbC0+ZmxfbnNwaWQgPSBOVUxMOwotCWZsLT5mbF9maWxlID0gTlVMTDsKLQlmbC0+ZmxfZmxhZ3MgPSAwOwotCWZsLT5mbF90eXBlID0gMDsKLQlmbC0+Zmxfc3RhcnQgPSBmbC0+ZmxfZW5kID0gMDsKLQlmbC0+Zmxfb3BzID0gTlVMTDsKLQlmbC0+ZmxfbG1vcHMgPSBOVUxMOworCW1lbXNldChmbCwgMCwgc2l6ZW9mKHN0cnVjdCBmaWxlX2xvY2spKTsKKwlsb2Nrc19pbml0X2xvY2tfaGVhZHMoZmwpOwogfQogCiBFWFBPUlRfU1lNQk9MKGxvY2tzX2luaXRfbG9jayk7CiAKLS8qCi0gKiBJbml0aWFsaXNlcyB0aGUgZmllbGRzIG9mIHRoZSBmaWxlIGxvY2sgd2hpY2ggYXJlIGludmFyaWFudCBmb3IKLSAqIGZyZWUgZmlsZV9sb2Nrcy4KLSAqLwotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbykKLXsKLQlzdHJ1Y3QgZmlsZV9sb2NrICpsb2NrID0gKHN0cnVjdCBmaWxlX2xvY2sgKikgZm9vOwotCi0JbG9ja3NfaW5pdF9sb2NrKGxvY2spOwotfQotCiBzdGF0aWMgdm9pZCBsb2Nrc19jb3B5X3ByaXZhdGUoc3RydWN0IGZpbGVfbG9jayAqbmV3LCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKIHsKIAlpZiAoZmwtPmZsX29wcykgewpAQCAtNDM0LDkgKzQyMyw5IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbG9ja19tYW5hZ2VyX29wZXJhdGlvbnMgbGVhc2VfbWFuYWdlcl9vcHMgPSB7Ci0JLmZsX2JyZWFrID0gbGVhc2VfYnJlYWtfY2FsbGJhY2ssCi0JLmZsX3JlbGVhc2VfcHJpdmF0ZSA9IGxlYXNlX3JlbGVhc2VfcHJpdmF0ZV9jYWxsYmFjaywKLQkuZmxfY2hhbmdlID0gbGVhc2VfbW9kaWZ5LAorCS5sbV9icmVhayA9IGxlYXNlX2JyZWFrX2NhbGxiYWNrLAorCS5sbV9yZWxlYXNlX3ByaXZhdGUgPSBsZWFzZV9yZWxlYXNlX3ByaXZhdGVfY2FsbGJhY2ssCisJLmxtX2NoYW5nZSA9IGxlYXNlX21vZGlmeSwKIH07CiAKIC8qCkBAIC00ODksOSArNDc4LDkgQEAKICAqLwogc3RhdGljIGludCBwb3NpeF9zYW1lX293bmVyKHN0cnVjdCBmaWxlX2xvY2sgKmZsMSwgc3RydWN0IGZpbGVfbG9jayAqZmwyKQogewotCWlmIChmbDEtPmZsX2xtb3BzICYmIGZsMS0+ZmxfbG1vcHMtPmZsX2NvbXBhcmVfb3duZXIpCisJaWYgKGZsMS0+ZmxfbG1vcHMgJiYgZmwxLT5mbF9sbW9wcy0+bG1fY29tcGFyZV9vd25lcikKIAkJcmV0dXJuIGZsMi0+ZmxfbG1vcHMgPT0gZmwxLT5mbF9sbW9wcyAmJgotCQkJZmwxLT5mbF9sbW9wcy0+ZmxfY29tcGFyZV9vd25lcihmbDEsIGZsMik7CisJCQlmbDEtPmZsX2xtb3BzLT5sbV9jb21wYXJlX293bmVyKGZsMSwgZmwyKTsKIAlyZXR1cm4gZmwxLT5mbF9vd25lciA9PSBmbDItPmZsX293bmVyOwogfQogCkBAIC01NDEsOCArNTMwLDggQEAKIAkJd2FpdGVyID0gbGlzdF9maXJzdF9lbnRyeSgmYmxvY2tlci0+ZmxfYmxvY2ssCiAJCQkJc3RydWN0IGZpbGVfbG9jaywgZmxfYmxvY2spOwogCQlfX2xvY2tzX2RlbGV0ZV9ibG9jayh3YWl0ZXIpOwotCQlpZiAod2FpdGVyLT5mbF9sbW9wcyAmJiB3YWl0ZXItPmZsX2xtb3BzLT5mbF9ub3RpZnkpCi0JCQl3YWl0ZXItPmZsX2xtb3BzLT5mbF9ub3RpZnkod2FpdGVyKTsKKwkJaWYgKHdhaXRlci0+ZmxfbG1vcHMgJiYgd2FpdGVyLT5mbF9sbW9wcy0+bG1fbm90aWZ5KQorCQkJd2FpdGVyLT5mbF9sbW9wcy0+bG1fbm90aWZ5KHdhaXRlcik7CiAJCWVsc2UKIAkJCXdha2VfdXAoJndhaXRlci0+Zmxfd2FpdCk7CiAJfQpAQCAtMTIyOSw3ICsxMjE4LDcgQEAKIAkJCWZsLT5mbF90eXBlID0gZnV0dXJlOwogCQkJZmwtPmZsX2JyZWFrX3RpbWUgPSBicmVha190aW1lOwogCQkJLyogbGVhc2UgbXVzdCBoYXZlIGxtb3BzIGJyZWFrIGNhbGxiYWNrICovCi0JCQlmbC0+ZmxfbG1vcHMtPmZsX2JyZWFrKGZsKTsKKwkJCWZsLT5mbF9sbW9wcy0+bG1fYnJlYWsoZmwpOwogCQl9CiAJfQogCkBAIC0xMzM5LDcgKzEzMjgsNyBAQAogICoJQGFyZzogdHlwZSBvZiBsZWFzZSB0byBvYnRhaW4KICAqCUBmbHA6IGlucHV0IC0gZmlsZV9sb2NrIHRvIHVzZSwgb3V0cHV0IC0gZmlsZV9sb2NrIGluc2VydGVkCiAgKgotICoJVGhlIChpbnB1dCkgZmxwLT5mbF9sbW9wcy0+ZmxfYnJlYWsgZnVuY3Rpb24gaXMgcmVxdWlyZWQKKyAqCVRoZSAoaW5wdXQpIGZscC0+ZmxfbG1vcHMtPmxtX2JyZWFrIGZ1bmN0aW9uIGlzIHJlcXVpcmVkCiAgKglieSBicmVha19sZWFzZSgpLgogICoKICAqCUNhbGxlZCB3aXRoIGZpbGVfbG9ja19sb2NrIGhlbGQuCkBAIC0xMzY1LDcgKzEzNTQsNyBAQAogCiAJdGltZV9vdXRfbGVhc2VzKGlub2RlKTsKIAotCUJVR19PTighKCpmbHApLT5mbF9sbW9wcy0+ZmxfYnJlYWspOworCUJVR19PTighKCpmbHApLT5mbF9sbW9wcy0+bG1fYnJlYWspOwogCiAJaWYgKGFyZyAhPSBGX1VOTENLKSB7CiAJCWVycm9yID0gLUVBR0FJTjsKQEAgLTE0MDcsNyArMTM5Niw3IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKG15X2JlZm9yZSAhPSBOVUxMKSB7Ci0JCWVycm9yID0gbGVhc2UtPmZsX2xtb3BzLT5mbF9jaGFuZ2UobXlfYmVmb3JlLCBhcmcpOworCQllcnJvciA9IGxlYXNlLT5mbF9sbW9wcy0+bG1fY2hhbmdlKG15X2JlZm9yZSwgYXJnKTsKIAkJaWYgKCFlcnJvcikKIAkJCSpmbHAgPSAqbXlfYmVmb3JlOwogCQlnb3RvIG91dDsKQEAgLTE0NDMsNyArMTQzMiw3IEBACiAgKglAbGVhc2U6IGZpbGVfbG9jayB0byB1c2UKICAqCiAgKglDYWxsIHRoaXMgdG8gZXN0YWJsaXNoIGEgbGVhc2Ugb24gdGhlIGZpbGUuCi0gKglUaGUgKCpsZWFzZSktPmZsX2xtb3BzLT5mbF9icmVhayBvcGVyYXRpb24gbXVzdCBiZSBzZXQ7IGlmIG5vdCwKKyAqCVRoZSAoKmxlYXNlKS0+ZmxfbG1vcHMtPmxtX2JyZWFrIG9wZXJhdGlvbiBtdXN0IGJlIHNldDsgaWYgbm90LAogICoJYnJlYWtfbGVhc2Ugd2lsbCBvb3BzIQogICoKICAqCVRoaXMgd2lsbCBjYWxsIHRoZSBmaWxlc3lzdGVtJ3Mgc2V0bGVhc2UgZmlsZSBtZXRob2QsIGlmCkBAIC0xNzQxLDEwICsxNzMwLDEwIEBACiAgKiBUbyBhdm9pZCBibG9ja2luZyBrZXJuZWwgZGFlbW9ucywgc3VjaCBhcyBsb2NrZCwgdGhhdCBuZWVkIHRvIGFjcXVpcmUgUE9TSVgKICAqIGxvY2tzLCB0aGUgLT5sb2NrKCkgaW50ZXJmYWNlIG1heSByZXR1cm4gYXN5bmNocm9ub3VzbHksIGJlZm9yZSB0aGUgbG9jayBoYXMKICAqIGJlZW4gZ3JhbnRlZCBvciBkZW5pZWQgYnkgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSwgaWYgKGFuZCBvbmx5IGlmKQotICogZmxfZ3JhbnQgaXMgc2V0LiBDYWxsZXJzIGV4cGVjdGluZyAtPmxvY2soKSB0byByZXR1cm4gYXN5bmNocm9ub3VzbHkKKyAqIGxtX2dyYW50IGlzIHNldC4gQ2FsbGVycyBleHBlY3RpbmcgLT5sb2NrKCkgdG8gcmV0dXJuIGFzeW5jaHJvbm91c2x5CiAgKiB3aWxsIG9ubHkgdXNlIEZfU0VUTEssIG5vdCBGX1NFVExLVzsgdGhleSB3aWxsIHNldCBGTF9TTEVFUCBpZiAoYW5kIG9ubHkgaWYpCiAgKiB0aGUgcmVxdWVzdCBpcyBmb3IgYSBibG9ja2luZyBsb2NrLiBXaGVuIC0+bG9jaygpIGRvZXMgcmV0dXJuIGFzeW5jaHJvbm91c2x5LAotICogaXQgbXVzdCByZXR1cm4gRklMRV9MT0NLX0RFRkVSUkVELCBhbmQgY2FsbCAtPmZsX2dyYW50KCkgd2hlbiB0aGUgbG9jaworICogaXQgbXVzdCByZXR1cm4gRklMRV9MT0NLX0RFRkVSUkVELCBhbmQgY2FsbCAtPmxtX2dyYW50KCkgd2hlbiB0aGUgbG9jawogICogcmVxdWVzdCBjb21wbGV0ZXMuCiAgKiBJZiB0aGUgcmVxdWVzdCBpcyBmb3Igbm9uLWJsb2NraW5nIGxvY2sgdGhlIGZpbGUgc3lzdGVtIHNob3VsZCByZXR1cm4KICAqIEZJTEVfTE9DS19ERUZFUlJFRCB0aGVuIHRyeSB0byBnZXQgdGhlIGxvY2sgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIHJvdXRpbmUKQEAgLTE3NTQsNyArMTc0Myw3IEBACiAgKiBncmFudHMgYSBsb2NrIHNvIHRoZSBWRlMgY2FuIGZpbmQgb3V0IHdoaWNoIGxvY2tzIGFyZSBsb2NhbGx5IGhlbGQgYW5kIGRvCiAgKiB0aGUgY29ycmVjdCBsb2NrIGNsZWFudXAgd2hlbiByZXF1aXJlZC4KICAqIFRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gbXVzdCBub3QgZHJvcCB0aGUga2VybmVsIGxvY2sgb3IgY2FsbAotICogLT5mbF9ncmFudCgpIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIGNhbGxlciB3aXRoIGEgRklMRV9MT0NLX0RFRkVSUkVECisgKiAtPmxtX2dyYW50KCkgYmVmb3JlIHJldHVybmluZyB0byB0aGUgY2FsbGVyIHdpdGggYSBGSUxFX0xPQ0tfREVGRVJSRUQKICAqIHJldHVybiBjb2RlLgogICovCiBpbnQgdmZzX2xvY2tfZmlsZShzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwsIHN0cnVjdCBmaWxlX2xvY2sgKmNvbmYpCkBAIC0yMzIzLDggKzIzMTIsOCBAQAogc3RhdGljIGludCBfX2luaXQgZmlsZWxvY2tfaW5pdCh2b2lkKQogewogCWZpbGVsb2NrX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImZpbGVfbG9ja19jYWNoZSIsCi0JCQlzaXplb2Yoc3RydWN0IGZpbGVfbG9jayksIDAsIFNMQUJfUEFOSUMsCi0JCQlpbml0X29uY2UpOworCQkJc2l6ZW9mKHN0cnVjdCBmaWxlX2xvY2spLCAwLCBTTEFCX1BBTklDLCBOVUxMKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9sb2dmcy9kaXIuYyBiL2ZzL2xvZ2ZzL2Rpci5jCmluZGV4IDllZDg5ZDEuLmIzZmYzZDggMTAwNjQ0Ci0tLSBhL2ZzL2xvZ2ZzL2Rpci5jCisrKyBiL2ZzL2xvZ2ZzL2Rpci5jCkBAIC0zNzEsMTEgKzM3MSw5IEBACiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCiAJaW5vZGUgPSBsb2dmc19pZ2V0KGRpci0+aV9zYiwgaW5vKTsKLQlpZiAoSVNfRVJSKGlub2RlKSkgeworCWlmIChJU19FUlIoaW5vZGUpKQogCQlwcmludGsoS0VSTl9FUlIiTG9nRlM6IENhbm5vdCByZWFkIGlub2RlICMlbGx4IGZvciBkZW50cnkgKCVseCwgJWx4KW4iLAogCQkJCWlubywgZGlyLT5pX2lubywgaW5kZXgpOwotCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwotCX0KIAlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CiAKQEAgLTU1NSwxMyArNTUzLDYgQEAKIAlyZXR1cm4gX19sb2dmc19jcmVhdGUoZGlyLCBkZW50cnksIGlub2RlLCB0YXJnZXQsIGRlc3RsZW4pOwogfQogCi1zdGF0aWMgaW50IGxvZ2ZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKLQkJcmV0dXJuIC1FQ0hJTEQ7Ci0JcmV0dXJuIGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgZmxhZ3MsIE5VTEwpOwotfQotCiBzdGF0aWMgaW50IGxvZ2ZzX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsCiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKQEAgLTgyMCw3ICs4MTEsNiBAQAogCS5ta25vZAkJPSBsb2dmc19ta25vZCwKIAkucmVuYW1lCQk9IGxvZ2ZzX3JlbmFtZSwKIAkucm1kaXIJCT0gbG9nZnNfcm1kaXIsCi0JLnBlcm1pc3Npb24JPSBsb2dmc19wZXJtaXNzaW9uLAogCS5zeW1saW5rCT0gbG9nZnNfc3ltbGluaywKIAkudW5saW5rCQk9IGxvZ2ZzX3VubGluaywKIH07CmRpZmYgLS1naXQgYS9mcy9sb2dmcy9maWxlLmMgYi9mcy9sb2dmcy9maWxlLmMKaW5kZXggYzJhZDcwMi4uYjU0OGM4NyAxMDA2NDQKLS0tIGEvZnMvbG9nZnMvZmlsZS5jCisrKyBiL2ZzL2xvZ2ZzL2ZpbGUuYwpAQCAtMjE5LDExICsyMTksMjAgQEAKIAl9CiB9CiAKLWludCBsb2dmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQoraW50IGxvZ2ZzX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0LT5pX3NiOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJaW50IHJldDsKIAorCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlsb2dmc193cml0ZV9hbmNob3Ioc2IpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2xvZ2ZzL2xvZ2ZzLmggYi9mcy9sb2dmcy9sb2dmcy5oCmluZGV4IDU3YWZkNGEuLmYyMmQxMDggMTAwNjQ0Ci0tLSBhL2ZzL2xvZ2ZzL2xvZ2ZzLmgKKysrIGIvZnMvbG9nZnMvbG9nZnMuaApAQCAtNTA2LDcgKzUwNiw3IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBsb2dmc19yZWdfYW9wczsKIGludCBsb2dmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpOwogbG9uZyBsb2dmc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotaW50IGxvZ2ZzX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpOworaW50IGxvZ2ZzX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYyk7CiAKIC8qIGdjLmMgKi8KIHUzMiBnZXRfYmVzdF9jYW5kKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBjYW5kaWRhdGVfbGlzdCAqbGlzdCwgdTMyICplYyk7CmRpZmYgLS1naXQgYS9mcy9taW5peC9pbm9kZS5jIGIvZnMvbWluaXgvaW5vZGUuYwppbmRleCBhZGNkYzBhLi5lN2QyM2UyIDEwMDY0NAotLS0gYS9mcy9taW5peC9pbm9kZS5jCisrKyBiL2ZzL21pbml4L2lub2RlLmMKQEAgLTU5Niw4ICs1OTYsNyBAQAogCiBpbnQgbWluaXhfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCiB7Ci0Jc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOwotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAlnZW5lcmljX2ZpbGxhdHRyKGRlbnRyeS0+ZF9pbm9kZSwgc3RhdCk7CiAJaWYgKElOT0RFX1ZFUlNJT04oZGVudHJ5LT5kX2lub2RlKSA9PSBNSU5JWF9WMSkKIAkJc3RhdC0+YmxvY2tzID0gKEJMT0NLX1NJWkUgLyA1MTIpICogVjFfbWluaXhfYmxvY2tzKHN0YXQtPnNpemUsIHNiKTsKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IGUyZTRlOGQuLmY4YzY5ZDMgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlX2Nncm91cC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzX3N0cnVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtMTczLDI0ICsxNzQsNzQgQEAKIEVYUE9SVF9TWU1CT0wocHV0bmFtZSk7CiAjZW5kaWYKIAorc3RhdGljIGludCBjaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCit7CisjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAorCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKworCS8qCisJICogVW5kZXIgUkNVIHdhbGssIHdlIGNhbm5vdCBldmVuIGRvIGEgImdldF9jYWNoZWRfYWNsKCkiLAorCSAqIGJlY2F1c2UgdGhhdCBpbnZvbHZlcyBsb2NraW5nIGFuZCBnZXR0aW5nIGEgcmVmY291bnQgb24KKwkgKiBhIGNhY2hlZCBBQ0wuCisJICoKKwkgKiBTbyB0aGUgb25seSBjYXNlIHdlIGhhbmRsZSBkdXJpbmcgUkNVIHdhbGtpbmcgaXMgdGhlCisJICogY2FzZSBvZiBhIGNhY2hlZCAibm8gQUNMIGF0IGFsbCIsIHdoaWNoIG5lZWRzIG5vIGxvY2tzCisJICogb3IgcmVmY291bnRzLgorCSAqLworCWlmIChtYXNrICYgTUFZX05PVF9CTE9DSykgeworCSAgICAgICAgaWYgKG5lZ2F0aXZlX2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUykpCisJICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworCSAgICAgICAgcmV0dXJuIC1FQ0hJTEQ7CisJfQorCisJYWNsID0gZ2V0X2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisKKwkvKgorCSAqIEEgZmlsZXN5c3RlbSBjYW4gZm9yY2UgYSBBQ0wgY2FsbGJhY2sgYnkganVzdCBuZXZlciBmaWxsaW5nIHRoZQorCSAqIEFDTCBjYWNoZS4gQnV0IG5vcm1hbGx5IHlvdSdkIGZpbGwgdGhlIGNhY2hlIGVpdGhlciBhdCBpbm9kZQorCSAqIGluc3RhbnRpYXRpb24gdGltZSwgb3Igb24gdGhlIGZpcnN0IC0+Z2V0X2FjbCBjYWxsLgorCSAqCisJICogSWYgdGhlIGZpbGVzeXN0ZW0gZG9lc24ndCBoYXZlIGEgZ2V0X2FjbCgpIGZ1bmN0aW9uIGF0IGFsbCwgd2UnbGwKKwkgKiBqdXN0IGNyZWF0ZSB0aGUgbmVnYXRpdmUgY2FjaGUgZW50cnkuCisJICovCisJaWYgKGFjbCA9PSBBQ0xfTk9UX0NBQ0hFRCkgeworCSAgICAgICAgaWYgKGlub2RlLT5pX29wLT5nZXRfYWNsKSB7CisJCQlhY2wgPSBpbm9kZS0+aV9vcC0+Z2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKwkJCWlmIChJU19FUlIoYWNsKSkKKwkJCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCQl9IGVsc2UgeworCQkgICAgICAgIHNldF9jYWNoZWRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIE5VTEwpOworCQkgICAgICAgIHJldHVybiAtRUFHQUlOOworCQl9CisJfQorCisJaWYgKGFjbCkgeworCSAgICAgICAgaW50IGVycm9yID0gcG9zaXhfYWNsX3Blcm1pc3Npb24oaW5vZGUsIGFjbCwgbWFzayk7CisJICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCSAgICAgICAgcmV0dXJuIGVycm9yOworCX0KKyNlbmRpZgorCisJcmV0dXJuIC1FQUdBSU47Cit9CisKIC8qCiAgKiBUaGlzIGRvZXMgYmFzaWMgUE9TSVggQUNMIHBlcm1pc3Npb24gY2hlY2tpbmcKICAqLwotc3RhdGljIGludCBhY2xfcGVybWlzc2lvbl9jaGVjayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzLAotCQlpbnQgKCpjaGVja19hY2wpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpKQorc3RhdGljIGludCBhY2xfcGVybWlzc2lvbl9jaGVjayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKIAl1bnNpZ25lZCBpbnQgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAKLQltYXNrICY9IE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0VYRUM7CisJbWFzayAmPSBNQVlfUkVBRCB8IE1BWV9XUklURSB8IE1BWV9FWEVDIHwgTUFZX05PVF9CTE9DSzsKIAogCWlmIChjdXJyZW50X3VzZXJfbnMoKSAhPSBpbm9kZV91c2VybnMoaW5vZGUpKQogCQlnb3RvIG90aGVyX3Blcm1zOwogCi0JaWYgKGN1cnJlbnRfZnN1aWQoKSA9PSBpbm9kZS0+aV91aWQpCisJaWYgKGxpa2VseShjdXJyZW50X2ZzdWlkKCkgPT0gaW5vZGUtPmlfdWlkKSkKIAkJbW9kZSA+Pj0gNjsKIAllbHNlIHsKLQkJaWYgKElTX1BPU0lYQUNMKGlub2RlKSAmJiAobW9kZSAmIFNfSVJXWEcpICYmIGNoZWNrX2FjbCkgewotCQkJaW50IGVycm9yID0gY2hlY2tfYWNsKGlub2RlLCBtYXNrLCBmbGFncyk7CisJCWlmIChJU19QT1NJWEFDTChpbm9kZSkgJiYgKG1vZGUgJiBTX0lSV1hHKSkgeworCQkJaW50IGVycm9yID0gY2hlY2tfYWNsKGlub2RlLCBtYXNrKTsKIAkJCWlmIChlcnJvciAhPSAtRUFHQUlOKQogCQkJCXJldHVybiBlcnJvcjsKIAkJfQpAQCAtMjAzLDcgKzI1NCw3IEBACiAJLyoKIAkgKiBJZiB0aGUgREFDcyBhcmUgb2sgd2UgZG9uJ3QgbmVlZCBhbnkgY2FwYWJpbGl0eSBjaGVjay4KIAkgKi8KLQlpZiAoKG1hc2sgJiB+bW9kZSkgPT0gMCkKKwlpZiAoKG1hc2sgJiB+bW9kZSAmIChNQVlfUkVBRCB8IE1BWV9XUklURSB8IE1BWV9FWEVDKSkgPT0gMCkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIC1FQUNDRVM7CiB9CkBAIC0yMTIsOCArMjYzLDYgQEAKICAqIGdlbmVyaWNfcGVybWlzc2lvbiAtICBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cyBvbiBhIFBvc2l4LWxpa2UgZmlsZXN5c3RlbQogICogQGlub2RlOglpbm9kZSB0byBjaGVjayBhY2Nlc3MgcmlnaHRzIGZvcgogICogQG1hc2s6CXJpZ2h0IHRvIGNoZWNrIGZvciAoJU1BWV9SRUFELCAlTUFZX1dSSVRFLCAlTUFZX0VYRUMpCi0gKiBAY2hlY2tfYWNsOglvcHRpb25hbCBjYWxsYmFjayB0byBjaGVjayBmb3IgUG9zaXggQUNMcwotICogQGZsYWdzOglJUEVSTV9GTEFHXyBmbGFncy4KICAqCiAgKiBVc2VkIHRvIGNoZWNrIGZvciByZWFkL3dyaXRlL2V4ZWN1dGUgcGVybWlzc2lvbnMgb24gYSBmaWxlLgogICogV2UgdXNlICJmc3VpZCIgZm9yIHRoaXMsIGxldHRpbmcgdXMgc2V0IGFyYml0cmFyeSBwZXJtaXNzaW9ucwpAQCAtMjI0LDIzICsyNzMsMzIgQEAKICAqIHJlcXVlc3QgY2Fubm90IGJlIHNhdGlzZmllZCAoZWcuIHJlcXVpcmVzIGJsb2NraW5nIG9yIHRvbyBtdWNoIGNvbXBsZXhpdHkpLgogICogSXQgd291bGQgdGhlbiBiZSBjYWxsZWQgYWdhaW4gaW4gcmVmLXdhbGsgbW9kZS4KICAqLwotaW50IGdlbmVyaWNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzLAotCWludCAoKmNoZWNrX2FjbCkoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncykpCitpbnQgZ2VuZXJpY19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCWludCByZXQ7CiAKIAkvKgogCSAqIERvIHRoZSBiYXNpYyBQT1NJWCBBQ0wgcGVybWlzc2lvbiBjaGVja3MuCiAJICovCi0JcmV0ID0gYWNsX3Blcm1pc3Npb25fY2hlY2soaW5vZGUsIG1hc2ssIGZsYWdzLCBjaGVja19hY2wpOworCXJldCA9IGFjbF9wZXJtaXNzaW9uX2NoZWNrKGlub2RlLCBtYXNrKTsKIAlpZiAocmV0ICE9IC1FQUNDRVMpCiAJCXJldHVybiByZXQ7CiAKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkvKiBEQUNzIGFyZSBvdmVycmlkYWJsZSBmb3IgZGlyZWN0b3JpZXMgKi8KKwkJaWYgKG5zX2NhcGFibGUoaW5vZGVfdXNlcm5zKGlub2RlKSwgQ0FQX0RBQ19PVkVSUklERSkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCEobWFzayAmIE1BWV9XUklURSkpCisJCQlpZiAobnNfY2FwYWJsZShpbm9kZV91c2VybnMoaW5vZGUpLCBDQVBfREFDX1JFQURfU0VBUkNIKSkKKwkJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQogCS8qCiAJICogUmVhZC93cml0ZSBEQUNzIGFyZSBhbHdheXMgb3ZlcnJpZGFibGUuCi0JICogRXhlY3V0YWJsZSBEQUNzIGFyZSBvdmVycmlkYWJsZSBpZiBhdCBsZWFzdCBvbmUgZXhlYyBiaXQgaXMgc2V0LgorCSAqIEV4ZWN1dGFibGUgREFDcyBhcmUgb3ZlcnJpZGFibGUgd2hlbiB0aGVyZSBpcworCSAqIGF0IGxlYXN0IG9uZSBleGVjIGJpdCBzZXQuCiAJICovCi0JaWYgKCEobWFzayAmIE1BWV9FWEVDKSB8fCBleGVjdXRlX29rKGlub2RlKSkKKwlpZiAoIShtYXNrICYgTUFZX0VYRUMpIHx8IChpbm9kZS0+aV9tb2RlICYgU19JWFVHTykpCiAJCWlmIChuc19jYXBhYmxlKGlub2RlX3VzZXJucyhpbm9kZSksIENBUF9EQUNfT1ZFUlJJREUpKQogCQkJcmV0dXJuIDA7CiAKQEAgLTI0OCw3ICszMDYsNyBAQAogCSAqIFNlYXJjaGluZyBpbmNsdWRlcyBleGVjdXRhYmxlIG9uIGRpcmVjdG9yaWVzLCBlbHNlIGp1c3QgcmVhZC4KIAkgKi8KIAltYXNrICY9IE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0VYRUM7Ci0JaWYgKG1hc2sgPT0gTUFZX1JFQUQgfHwgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIShtYXNrICYgTUFZX1dSSVRFKSkpCisJaWYgKG1hc2sgPT0gTUFZX1JFQUQpCiAJCWlmIChuc19jYXBhYmxlKGlub2RlX3VzZXJucyhpbm9kZSksIENBUF9EQUNfUkVBRF9TRUFSQ0gpKQogCQkJcmV0dXJuIDA7CiAKQEAgLTI4NywxMCArMzQ1LDkgQEAKIAl9CiAKIAlpZiAoaW5vZGUtPmlfb3AtPnBlcm1pc3Npb24pCi0JCXJldHZhbCA9IGlub2RlLT5pX29wLT5wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCAwKTsKKwkJcmV0dmFsID0gaW5vZGUtPmlfb3AtPnBlcm1pc3Npb24oaW5vZGUsIG1hc2spOwogCWVsc2UKLQkJcmV0dmFsID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCAwLAotCQkJCWlub2RlLT5pX29wLT5jaGVja19hY2wpOworCQlyZXR2YWwgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2spOwogCiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTMwMyw2OSArMzYwLDYgQEAKIH0KIAogLyoqCi0gKiBmaWxlX3Blcm1pc3Npb24gIC0gIGNoZWNrIGZvciBhZGRpdGlvbmFsIGFjY2VzcyByaWdodHMgdG8gYSBnaXZlbiBmaWxlCi0gKiBAZmlsZToJZmlsZSB0byBjaGVjayBhY2Nlc3MgcmlnaHRzIGZvcgotICogQG1hc2s6CXJpZ2h0IHRvIGNoZWNrIGZvciAoJU1BWV9SRUFELCAlTUFZX1dSSVRFLCAlTUFZX0VYRUMpCi0gKgotICogVXNlZCB0byBjaGVjayBmb3IgcmVhZC93cml0ZS9leGVjdXRlIHBlcm1pc3Npb25zIG9uIGFuIGFscmVhZHkgb3BlbmVkCi0gKiBmaWxlLgotICoKLSAqIE5vdGU6Ci0gKglEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24gaW4gbmV3IGNvZGUuICBBbGwgYWNjZXNzIGNoZWNrcyBzaG91bGQKLSAqCWJlIGRvbmUgdXNpbmcgaW5vZGVfcGVybWlzc2lvbigpLgotICovCi1pbnQgZmlsZV9wZXJtaXNzaW9uKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbWFzaykKLXsKLQlyZXR1cm4gaW5vZGVfcGVybWlzc2lvbihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBtYXNrKTsKLX0KLQotLyoKLSAqIGdldF93cml0ZV9hY2Nlc3MoKSBnZXRzIHdyaXRlIHBlcm1pc3Npb24gZm9yIGEgZmlsZS4KLSAqIHB1dF93cml0ZV9hY2Nlc3MoKSByZWxlYXNlcyB0aGlzIHdyaXRlIHBlcm1pc3Npb24uCi0gKiBUaGlzIGlzIHVzZWQgZm9yIHJlZ3VsYXIgZmlsZXMuCi0gKiBXZSBjYW5ub3Qgc3VwcG9ydCB3cml0ZSAoYW5kIG1heWJlIG1tYXAgcmVhZC13cml0ZSBzaGFyZWQpIGFjY2Vzc2VzIGFuZAotICogTUFQX0RFTllXUklURSBtbWFwcGluZ3Mgc2ltdWx0YW5lb3VzbHkuIFRoZSBpX3dyaXRlY291bnQgZmllbGQgb2YgYW4gaW5vZGUKLSAqIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogMDogbm8gd3JpdGVycywgbm8gVk1fREVOWVdSSVRFIG1hcHBpbmdzCi0gKiA8IDA6ICgtaV93cml0ZWNvdW50KSB2bV9hcmVhX3N0cnVjdHMgd2l0aCBWTV9ERU5ZV1JJVEUgc2V0IGV4aXN0Ci0gKiA+IDA6IChpX3dyaXRlY291bnQpIHVzZXJzIGFyZSB3cml0aW5nIHRvIHRoZSBmaWxlLgotICoKLSAqIE5vcm1hbGx5IHdlIG9wZXJhdGUgb24gdGhhdCBjb3VudGVyIHdpdGggYXRvbWljX3tpbmMsZGVjfSBhbmQgaXQncyBzYWZlCi0gKiBleGNlcHQgZm9yIHRoZSBjYXNlcyB3aGVyZSB3ZSBkb24ndCBob2xkIGlfd3JpdGVjb3VudCB5ZXQuIFRoZW4gd2UgbmVlZCB0bwotICogdXNlIHtnZXQsZGVueX1fd3JpdGVfYWNjZXNzKCkgLSB0aGVzZSBmdW5jdGlvbnMgY2hlY2sgdGhlIHNpZ24gYW5kIHJlZnVzZQotICogdG8gZG8gdGhlIGNoYW5nZSBpZiBzaWduIGlzIHdyb25nLiBFeGNsdXNpb24gYmV0d2VlbiB0aGVtIGlzIHByb3ZpZGVkIGJ5Ci0gKiB0aGUgaW5vZGUtPmlfbG9jayBzcGlubG9jay4KLSAqLwotCi1pbnQgZ2V0X3dyaXRlX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKLXsKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCWlmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfd3JpdGVjb3VudCkgPCAwKSB7Ci0JCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQkJcmV0dXJuIC1FVFhUQlNZOwotCX0KLQlhdG9taWNfaW5jKCZpbm9kZS0+aV93cml0ZWNvdW50KTsKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGRlbnlfd3JpdGVfYWNjZXNzKHN0cnVjdCBmaWxlICogZmlsZSkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV93cml0ZWNvdW50KSA+IDApIHsKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwotCQlyZXR1cm4gLUVUWFRCU1k7Ci0JfQotCWF0b21pY19kZWMoJmlub2RlLT5pX3dyaXRlY291bnQpOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi0vKioKICAqIHBhdGhfZ2V0IC0gZ2V0IGEgcmVmZXJlbmNlIHRvIGEgcGF0aAogICogQHBhdGg6IHBhdGggdG8gZ2V0IHRoZSByZWZlcmVuY2UgdG8KICAqCkBAIC00MzIsNiArNDI2LDggQEAKIAkJCWdvdG8gZXJyX3BhcmVudDsKIAkJQlVHX09OKG5kLT5pbm9kZSAhPSBwYXJlbnQtPmRfaW5vZGUpOwogCX0gZWxzZSB7CisJCWlmIChkZW50cnktPmRfcGFyZW50ICE9IHBhcmVudCkKKwkJCWdvdG8gZXJyX3BhcmVudDsKIAkJc3Bpbl9sb2NrX25lc3RlZCgmZGVudHJ5LT5kX2xvY2ssIERFTlRSWV9EX0xPQ0tfTkVTVEVEKTsKIAkJaWYgKCFfX2RfcmN1X3RvX3JlZmNvdW50KGRlbnRyeSwgbmQtPnNlcSkpCiAJCQlnb3RvIGVycl9jaGlsZDsKQEAgLTQ4OSwyOCArNDg1LDYgQEAKIAlyZXR1cm4gZGVudHJ5LT5kX29wLT5kX3JldmFsaWRhdGUoZGVudHJ5LCBuZCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKLWRvX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKLXsKLQlpbnQgc3RhdHVzID0gZF9yZXZhbGlkYXRlKGRlbnRyeSwgbmQpOwotCWlmICh1bmxpa2VseShzdGF0dXMgPD0gMCkpIHsKLQkJLyoKLQkJICogVGhlIGRlbnRyeSBmYWlsZWQgdmFsaWRhdGlvbi4KLQkJICogSWYgZF9yZXZhbGlkYXRlIHJldHVybmVkIDAgYXR0ZW1wdCB0byBpbnZhbGlkYXRlCi0JCSAqIHRoZSBkZW50cnkgb3RoZXJ3aXNlIGRfcmV2YWxpZGF0ZSBpcyBhc2tpbmcgdXMKLQkJICogdG8gcmV0dXJuIGEgZmFpbCBzdGF0dXMuCi0JCSAqLwotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJZHB1dChkZW50cnkpOwotCQkJZGVudHJ5ID0gRVJSX1BUUihzdGF0dXMpOwotCQl9IGVsc2UgaWYgKCFkX2ludmFsaWRhdGUoZGVudHJ5KSkgewotCQkJZHB1dChkZW50cnkpOwotCQkJZGVudHJ5ID0gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gZGVudHJ5OwotfQotCiAvKioKICAqIGNvbXBsZXRlX3dhbGsgLSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgcGF0aCB3YWxrCiAgKiBAbmQ6ICBwb2ludGVyIG5hbWVpZGF0YQpAQCAtNTY1LDQwICs1MzksNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qCi0gKiBTaG9ydC1jdXQgdmVyc2lvbiBvZiBwZXJtaXNzaW9uKCksIGZvciBjYWxsaW5nIG9uIGRpcmVjdG9yaWVzCi0gKiBkdXJpbmcgcGF0aG5hbWUgcmVzb2x1dGlvbi4gIENvbWJpbmVzIHBhcnRzIG9mIHBlcm1pc3Npb24oKQotICogYW5kIGdlbmVyaWNfcGVybWlzc2lvbigpLCBhbmQgdGVzdHMgT05MWSBmb3IgTUFZX0VYRUMgcGVybWlzc2lvbi4KLSAqCi0gKiBJZiBhcHByb3ByaWF0ZSwgY2hlY2sgREFDIG9ubHkuICBJZiBub3QgYXBwcm9wcmlhdGUsIG9yCi0gKiBzaG9ydC1jdXQgREFDIGZhaWxzLCB0aGVuIGNhbGwgLT5wZXJtaXNzaW9uKCkgdG8gZG8gbW9yZQotICogY29tcGxldGUgcGVybWlzc2lvbiBjaGVjay4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgZXhlY19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMgPSBpbm9kZV91c2VybnMoaW5vZGUpOwotCi0JaWYgKGlub2RlLT5pX29wLT5wZXJtaXNzaW9uKSB7Ci0JCXJldCA9IGlub2RlLT5pX29wLT5wZXJtaXNzaW9uKGlub2RlLCBNQVlfRVhFQywgZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXJldCA9IGFjbF9wZXJtaXNzaW9uX2NoZWNrKGlub2RlLCBNQVlfRVhFQywgZmxhZ3MsCi0JCQkJaW5vZGUtPmlfb3AtPmNoZWNrX2FjbCk7Ci0JfQotCWlmIChsaWtlbHkoIXJldCkpCi0JCWdvdG8gb2s7Ci0JaWYgKHJldCA9PSAtRUNISUxEKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKG5zX2NhcGFibGUobnMsIENBUF9EQUNfT1ZFUlJJREUpIHx8Ci0JCQluc19jYXBhYmxlKG5zLCBDQVBfREFDX1JFQURfU0VBUkNIKSkKLQkJZ290byBvazsKLQotCXJldHVybiByZXQ7Ci1vazoKLQlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfZXhlY19wZXJtaXNzaW9uKGlub2RlLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBzZXRfcm9vdChzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlpZiAoIW5kLT5yb290Lm1udCkKQEAgLTc3Myw3ICs3MTMsNyBAQAogCS8qIFdlIGRvbid0IHdhbnQgdG8gbW91bnQgaWYgc29tZW9uZSBzdXBwbGllZCBBVF9OT19BVVRPTU9VTlQKIAkgKiBhbmQgdGhpcyBpcyB0aGUgdGVybWluYWwgcGFydCBvZiB0aGUgcGF0aC4KIAkgKi8KLQlpZiAoKGZsYWdzICYgTE9PS1VQX05PX0FVVE9NT1VOVCkgJiYgIShmbGFncyAmIExPT0tVUF9DT05USU5VRSkpCisJaWYgKChmbGFncyAmIExPT0tVUF9OT19BVVRPTU9VTlQpICYmICEoZmxhZ3MgJiBMT09LVVBfUEFSRU5UKSkKIAkJcmV0dXJuIC1FSVNESVI7IC8qIHdlIGFjdHVhbGx5IHdhbnQgdG8gc3RvcCBoZXJlICovCiAKIAkvKiBXZSB3YW50IHRvIG1vdW50IGlmIHNvbWVvbmUgaXMgdHJ5aW5nIHRvIG9wZW4vY3JlYXRlIGEgZmlsZSBvZiBhbnkKQEAgLTc4NSw3ICs3MjUsNyBAQAogCSAqIGFwcGVuZGVkIGEgJy8nIHRvIHRoZSBuYW1lLgogCSAqLwogCWlmICghKGZsYWdzICYgTE9PS1VQX0ZPTExPVykgJiYKLQkgICAgIShmbGFncyAmIChMT09LVVBfQ09OVElOVUUgfCBMT09LVVBfRElSRUNUT1JZIHwKKwkgICAgIShmbGFncyAmIChMT09LVVBfUEFSRU5UIHwgTE9PS1VQX0RJUkVDVE9SWSB8CiAJCSAgICAgICBMT09LVVBfT1BFTiB8IExPT0tVUF9DUkVBVEUpKSkKIAkJcmV0dXJuIC1FSVNESVI7CiAKQEAgLTgwNCw3ICs3NDQsNyBAQAogCQkgKiB0aGUgcGF0aCBiZWluZyBsb29rZWQgdXA7IGlmIGl0IHdhc24ndCB0aGVuIHRoZSByZW1haW5kZXIgb2YKIAkJICogdGhlIHBhdGggaXMgaW5hY2Nlc3NpYmxlIGFuZCB3ZSBzaG91bGQgc2F5IHNvLgogCQkgKi8KLQkJaWYgKFBUUl9FUlIobW50KSA9PSAtRUlTRElSICYmIChmbGFncyAmIExPT0tVUF9DT05USU5VRSkpCisJCWlmIChQVFJfRVJSKG1udCkgPT0gLUVJU0RJUiAmJiAoZmxhZ3MgJiBMT09LVVBfUEFSRU5UKSkKIAkJCXJldHVybiAtRVJFTU9URTsKIAkJcmV0dXJuIFBUUl9FUlIobW50KTsKIAl9CkBAIC04MTIsNiArNzUyLDExIEBACiAJaWYgKCFtbnQpIC8qIG1vdW50IGNvbGxpc2lvbiAqLwogCQlyZXR1cm4gMDsKIAorCWlmICghKm5lZWRfbW50cHV0KSB7CisJCS8qIGxvY2tfbW91bnQoKSBtYXkgcmVsZWFzZSBwYXRoLT5tbnQgb24gZXJyb3IgKi8KKwkJbW50Z2V0KHBhdGgtPm1udCk7CisJCSpuZWVkX21udHB1dCA9IHRydWU7CisJfQogCWVyciA9IGZpbmlzaF9hdXRvbW91bnQobW50LCBwYXRoKTsKIAogCXN3aXRjaCAoZXJyKSB7CkBAIC04MTksMTIgKzc2NCw5IEBACiAJCS8qIFNvbWVvbmUgZWxzZSBtYWRlIGEgbW91bnQgaGVyZSB3aGlsc3Qgd2Ugd2VyZSBidXN5ICovCiAJCXJldHVybiAwOwogCWNhc2UgMDoKLQkJZHB1dChwYXRoLT5kZW50cnkpOwotCQlpZiAoKm5lZWRfbW50cHV0KQotCQkJbW50cHV0KHBhdGgtPm1udCk7CisJCXBhdGhfcHV0KHBhdGgpOwogCQlwYXRoLT5tbnQgPSBtbnQ7CiAJCXBhdGgtPmRlbnRyeSA9IGRnZXQobW50LT5tbnRfcm9vdCk7Ci0JCSpuZWVkX21udHB1dCA9IHRydWU7CiAJCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCXJldHVybiBlcnI7CkBAIC04NDQsOSArNzg2LDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgZm9sbG93X21hbmFnZWQoc3RydWN0IHBhdGggKnBhdGgsIHVuc2lnbmVkIGZsYWdzKQogeworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gcGF0aC0+bW50OyAvKiBoZWxkIGJ5IGNhbGxlciwgbXVzdCBiZSBsZWZ0IGFsb25lICovCiAJdW5zaWduZWQgbWFuYWdlZDsKIAlib29sIG5lZWRfbW50cHV0ID0gZmFsc2U7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCS8qIEdpdmVuIHRoYXQgd2UncmUgbm90IGhvbGRpbmcgYSBsb2NrIGhlcmUsIHdlIHJldGFpbiB0aGUgdmFsdWUgaW4gYQogCSAqIGxvY2FsIHZhcmlhYmxlIGZvciBlYWNoIGRlbnRyeSBhcyB3ZSBsb29rIGF0IGl0IHNvIHRoYXQgd2UgZG9uJ3Qgc2VlCkBAIC04NjEsNyArODA0LDcgQEAKIAkJCUJVR19PTighcGF0aC0+ZGVudHJ5LT5kX29wLT5kX21hbmFnZSk7CiAJCQlyZXQgPSBwYXRoLT5kZW50cnktPmRfb3AtPmRfbWFuYWdlKHBhdGgtPmRlbnRyeSwgZmFsc2UpOwogCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldCA9PSAtRUlTRElSID8gMCA6IHJldDsKKwkJCQlicmVhazsKIAkJfQogCiAJCS8qIFRyYW5zaXQgdG8gYSBtb3VudGVkIGZpbGVzeXN0ZW0uICovCkBAIC04ODcsMTQgKzgzMCwxOSBAQAogCQlpZiAobWFuYWdlZCAmIERDQUNIRV9ORUVEX0FVVE9NT1VOVCkgewogCQkJcmV0ID0gZm9sbG93X2F1dG9tb3VudChwYXRoLCBmbGFncywgJm5lZWRfbW50cHV0KTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQgPT0gLUVJU0RJUiA/IDAgOiByZXQ7CisJCQkJYnJlYWs7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCS8qIFdlIGRpZG4ndCBjaGFuZ2UgdGhlIGN1cnJlbnQgcGF0aCBwb2ludCAqLwogCQlicmVhazsKIAl9Ci0JcmV0dXJuIDA7CisKKwlpZiAobmVlZF9tbnRwdXQgJiYgcGF0aC0+bW50ID09IG1udCkKKwkJbW50cHV0KHBhdGgtPm1udCk7CisJaWYgKHJldCA9PSAtRUlTRElSKQorCQlyZXQgPSAwOworCXJldHVybiByZXQ7CiB9CiAKIGludCBmb2xsb3dfZG93bl9vbmUoc3RydWN0IHBhdGggKnBhdGgpCkBAIC05MzEsNyArODc5LDYgQEAKIAkJICogRG9uJ3QgZm9yZ2V0IHdlIG1pZ2h0IGhhdmUgYSBub24tbW91bnRwb2ludCBtYW5hZ2VkIGRlbnRyeQogCQkgKiB0aGF0IHdhbnRzIHRvIGJsb2NrIHRyYW5zaXQuCiAJCSAqLwotCQkqaW5vZGUgPSBwYXRoLT5kZW50cnktPmRfaW5vZGU7CiAJCWlmICh1bmxpa2VseShtYW5hZ2VkX2RlbnRyeV9taWdodF9ibG9jayhwYXRoLT5kZW50cnkpKSkKIAkJCXJldHVybiBmYWxzZTsKIApAQCAtOTQ0LDYgKzg5MSwxMiBAQAogCQlwYXRoLT5tbnQgPSBtb3VudGVkOwogCQlwYXRoLT5kZW50cnkgPSBtb3VudGVkLT5tbnRfcm9vdDsKIAkJbmQtPnNlcSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJnBhdGgtPmRlbnRyeS0+ZF9zZXEpOworCQkvKgorCQkgKiBVcGRhdGUgdGhlIGlub2RlIHRvby4gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayB0aGUKKwkJICogZGVudHJ5IHNlcXVlbmNlIG51bWJlciBoZXJlIGFmdGVyIHRoaXMgZF9pbm9kZSByZWFkLAorCQkgKiBiZWNhdXNlIGEgbW91bnQtcG9pbnQgaXMgYWx3YXlzIHBpbm5lZC4KKwkJICovCisJCSppbm9kZSA9IHBhdGgtPmRlbnRyeS0+ZF9pbm9kZTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CkBAIC0xMDAzLDkgKzk1Niw2IEBACiAgKiBGb2xsb3cgZG93biB0byB0aGUgY292ZXJpbmcgbW91bnQgY3VycmVudGx5IHZpc2libGUgdG8gdXNlcnNwYWNlLiAgQXQgZWFjaAogICogcG9pbnQsIHRoZSBmaWxlc3lzdGVtIG93bmluZyB0aGF0IGRlbnRyeSBtYXkgYmUgcXVlcmllZCBhcyB0byB3aGV0aGVyIHRoZQogICogY2FsbGVyIGlzIHBlcm1pdHRlZCB0byBwcm9jZWVkIG9yIG5vdC4KLSAqCi0gKiBDYXJlIG11c3QgYmUgdGFrZW4gYXMgbmFtZXNwYWNlX3NlbSBtYXkgYmUgaGVsZCAoaW5kaWNhdGVkIGJ5IG1vdW50aW5nX2hlcmUKLSAqIGJlaW5nIHRydWUpLgogICovCiBpbnQgZm9sbG93X2Rvd24oc3RydWN0IHBhdGggKnBhdGgpCiB7CkBAIC0xMTIxLDYgKzEwNzEsMzAgQEAKIH0KIAogLyoKKyAqIFdlIGFscmVhZHkgaGF2ZSBhIGRlbnRyeSwgYnV0IHJlcXVpcmUgYSBsb29rdXAgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBwYXJlbnQKKyAqIGRpcmVjdG9yeSB0byBmaWxsIGluIGRfaW5vZGUuIFJldHVybnMgdGhlIG5ldyBkZW50cnksIG9yIEVSUl9QVFIgb24gZXJyb3IuCisgKiBwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXggbXVzdCBiZSBoZWxkLiBkX2xvb2t1cCBtdXN0IGhhdmUgdmVyaWZpZWQgdGhhdCBubworICogY2hpbGQgZXhpc3RzIHdoaWxlIHVuZGVyIGlfbXV0ZXguCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkX2lub2RlX2xvb2t1cChzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYXJlbnQtPmRfaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqb2xkOworCisJLyogRG9uJ3QgY3JlYXRlIGNoaWxkIGRlbnRyeSBmb3IgYSBkZWFkIGRpcmVjdG9yeS4gKi8KKwlpZiAodW5saWtlbHkoSVNfREVBRERJUihpbm9kZSkpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKworCW9sZCA9IGlub2RlLT5pX29wLT5sb29rdXAoaW5vZGUsIGRlbnRyeSwgbmQpOworCWlmICh1bmxpa2VseShvbGQpKSB7CisJCWRwdXQoZGVudHJ5KTsKKwkJZGVudHJ5ID0gb2xkOworCX0KKwlyZXR1cm4gZGVudHJ5OworfQorCisvKgogICogIEl0J3MgbW9yZSBjb252b2x1dGVkIHRoYW4gSSdkIGxpa2UgaXQgdG8gYmUsIGJ1dC4uLiBpdCdzIHN0aWxsIGZhaXJseQogICogIHNtYWxsIGFuZCBmb3Igbm93IEknZCBwcmVmZXIgdG8gaGF2ZSBmYXN0IHBhdGggYXMgc3RyYWlnaHQgYXMgcG9zc2libGUuCiAgKiAgSXQgX2lzXyB0aW1lLWNyaXRpY2FsLgpAQCAtMTE1OSw2ICsxMTMzLDggQEAKIAkJCQlnb3RvIHVubGF6eTsKIAkJCX0KIAkJfQorCQlpZiAodW5saWtlbHkoZF9uZWVkX2xvb2t1cChkZW50cnkpKSkKKwkJCWdvdG8gdW5sYXp5OwogCQlwYXRoLT5tbnQgPSBtbnQ7CiAJCXBhdGgtPmRlbnRyeSA9IGRlbnRyeTsKIAkJaWYgKHVubGlrZWx5KCFfX2ZvbGxvd19tb3VudF9yY3UobmQsIHBhdGgsIGlub2RlKSkpCkBAIC0xMTczLDYgKzExNDksMTAgQEAKIAkJZGVudHJ5ID0gX19kX2xvb2t1cChwYXJlbnQsIG5hbWUpOwogCX0KIAorCWlmIChkZW50cnkgJiYgdW5saWtlbHkoZF9uZWVkX2xvb2t1cChkZW50cnkpKSkgeworCQlkcHV0KGRlbnRyeSk7CisJCWRlbnRyeSA9IE5VTEw7CisJfQogcmV0cnk6CiAJaWYgKHVubGlrZWx5KCFkZW50cnkpKSB7CiAJCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFyZW50LT5kX2lub2RlOwpAQCAtMTE4OSw2ICsxMTY5LDE1IEBACiAJCQkvKiBrbm93biBnb29kICovCiAJCQluZWVkX3JldmFsID0gMDsKIAkJCXN0YXR1cyA9IDE7CisJCX0gZWxzZSBpZiAodW5saWtlbHkoZF9uZWVkX2xvb2t1cChkZW50cnkpKSkgeworCQkJZGVudHJ5ID0gZF9pbm9kZV9sb29rdXAocGFyZW50LCBkZW50cnksIG5kKTsKKwkJCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQkJCW11dGV4X3VubG9jaygmZGlyLT5pX211dGV4KTsKKwkJCQlyZXR1cm4gUFRSX0VSUihkZW50cnkpOworCQkJfQorCQkJLyoga25vd24gZ29vZCAqLworCQkJbmVlZF9yZXZhbCA9IDA7CisJCQlzdGF0dXMgPSAxOwogCQl9CiAJCW11dGV4X3VubG9jaygmZGlyLT5pX211dGV4KTsKIAl9CkBAIC0xMjIxLDEzICsxMjEwLDEzIEBACiBzdGF0aWMgaW5saW5lIGludCBtYXlfbG9va3VwKHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCWlmIChuZC0+ZmxhZ3MgJiBMT09LVVBfUkNVKSB7Ci0JCWludCBlcnIgPSBleGVjX3Blcm1pc3Npb24obmQtPmlub2RlLCBJUEVSTV9GTEFHX1JDVSk7CisJCWludCBlcnIgPSBpbm9kZV9wZXJtaXNzaW9uKG5kLT5pbm9kZSwgTUFZX0VYRUN8TUFZX05PVF9CTE9DSyk7CiAJCWlmIChlcnIgIT0gLUVDSElMRCkKIAkJCXJldHVybiBlcnI7CiAJCWlmICh1bmxhenlfd2FsayhuZCwgTlVMTCkpCiAJCQlyZXR1cm4gLUVDSElMRDsKIAl9Ci0JcmV0dXJuIGV4ZWNfcGVybWlzc2lvbihuZC0+aW5vZGUsIDApOworCXJldHVybiBpbm9kZV9wZXJtaXNzaW9uKG5kLT5pbm9kZSwgTUFZX0VYRUMpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBoYW5kbGVfZG90cyhzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgaW50IHR5cGUpCkBAIC0xMzQxLDcgKzEzMzAsNiBAQAogewogCXN0cnVjdCBwYXRoIG5leHQ7CiAJaW50IGVycjsKLQl1bnNpZ25lZCBpbnQgbG9va3VwX2ZsYWdzID0gbmQtPmZsYWdzOwogCQogCXdoaWxlICgqbmFtZT09Jy8nKQogCQluYW1lKys7CkBAIC0xMzU1LDggKzEzNDMsNiBAQAogCQl1bnNpZ25lZCBpbnQgYzsKIAkJaW50IHR5cGU7CiAKLQkJbmQtPmZsYWdzIHw9IExPT0tVUF9DT05USU5VRTsKLQogCQllcnIgPSBtYXlfbG9va3VwKG5kKTsKICAJCWlmIChlcnIpCiAJCQlicmVhazsKQEAgLTE0MTgsOCArMTQwNCw2IEBACiAJCS8qIGhlcmUgZW5kcyB0aGUgbWFpbiBsb29wICovCiAKIGxhc3RfY29tcG9uZW50OgotCQkvKiBDbGVhciBMT09LVVBfQ09OVElOVUUgaWZmIGl0IHdhcyBwcmV2aW91c2x5IHVuc2V0ICovCi0JCW5kLT5mbGFncyAmPSBsb29rdXBfZmxhZ3MgfCB+TE9PS1VQX0NPTlRJTlVFOwogCQluZC0+bGFzdCA9IHRoaXM7CiAJCW5kLT5sYXN0X3R5cGUgPSB0eXBlOwogCQlyZXR1cm4gMDsKQEAgLTE1MDIsNyArMTQ4Niw3IEBACiAJCQlpZiAoIVNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQogCQkJCWdvdG8gZnB1dF9mYWlsOwogCi0JCQlyZXR2YWwgPSBmaWxlX3Blcm1pc3Npb24oZmlsZSwgTUFZX0VYRUMpOworCQkJcmV0dmFsID0gaW5vZGVfcGVybWlzc2lvbihkZW50cnktPmRfaW5vZGUsIE1BWV9FWEVDKTsKIAkJCWlmIChyZXR2YWwpCiAJCQkJZ290byBmcHV0X2ZhaWw7CiAJCX0KQEAgLTE2NDAsMTYgKzE2MjQsMjIgQEAKICAqIEBtbnQ6IHBvaW50ZXIgdG8gdmZzIG1vdW50IG9mIHRoZSBiYXNlIGRpcmVjdG9yeQogICogQG5hbWU6IHBvaW50ZXIgdG8gZmlsZSBuYW1lCiAgKiBAZmxhZ3M6IGxvb2t1cCBmbGFncwotICogQG5kOiBwb2ludGVyIHRvIG5hbWVpZGF0YQorICogQHBhdGg6IHBvaW50ZXIgdG8gc3RydWN0IHBhdGggdG8gZmlsbAogICovCiBpbnQgdmZzX3BhdGhfbG9va3VwKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHZmc21vdW50ICptbnQsCiAJCSAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCSAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKKwkJICAgIHN0cnVjdCBwYXRoICpwYXRoKQogewotCW5kLT5yb290LmRlbnRyeSA9IGRlbnRyeTsKLQluZC0+cm9vdC5tbnQgPSBtbnQ7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyOworCW5kLnJvb3QuZGVudHJ5ID0gZGVudHJ5OworCW5kLnJvb3QubW50ID0gbW50OworCUJVR19PTihmbGFncyAmIExPT0tVUF9QQVJFTlQpOwogCS8qIHRoZSBmaXJzdCBhcmd1bWVudCBvZiBkb19wYXRoX2xvb2t1cCgpIGlzIGlnbm9yZWQgd2l0aCBMT09LVVBfUk9PVCAqLwotCXJldHVybiBkb19wYXRoX2xvb2t1cChBVF9GRENXRCwgbmFtZSwgZmxhZ3MgfCBMT09LVVBfUk9PVCwgbmQpOworCWVyciA9IGRvX3BhdGhfbG9va3VwKEFUX0ZEQ1dELCBuYW1lLCBmbGFncyB8IExPT0tVUF9ST09ULCAmbmQpOworCWlmICghZXJyKQorCQkqcGF0aCA9IG5kLnBhdGg7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKl9fbG9va3VwX2hhc2goc3RydWN0IHFzdHIgKm5hbWUsCkBAIC0xNjU5LDcgKzE2NDksNyBAQAogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlpbnQgZXJyOwogCi0JZXJyID0gZXhlY19wZXJtaXNzaW9uKGlub2RlLCAwKTsKKwllcnIgPSBpbm9kZV9wZXJtaXNzaW9uKGlub2RlLCBNQVlfRVhFQyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIApAQCAtMTY3MCw4ICsxNjYwLDM0IEBACiAJICovCiAJZGVudHJ5ID0gZF9sb29rdXAoYmFzZSwgbmFtZSk7CiAKLQlpZiAoZGVudHJ5ICYmIChkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfT1BfUkVWQUxJREFURSkpCi0JCWRlbnRyeSA9IGRvX3JldmFsaWRhdGUoZGVudHJ5LCBuZCk7CisJaWYgKGRlbnRyeSAmJiBkX25lZWRfbG9va3VwKGRlbnRyeSkpIHsKKwkJLyoKKwkJICogX19sb29rdXBfaGFzaCBpcyBjYWxsZWQgd2l0aCB0aGUgcGFyZW50IGRpcidzIGlfbXV0ZXggYWxyZWFkeQorCQkgKiBoZWxkLCBzbyB3ZSBhcmUgZ29vZCB0byBnbyBoZXJlLgorCQkgKi8KKwkJZGVudHJ5ID0gZF9pbm9kZV9sb29rdXAoYmFzZSwgZGVudHJ5LCBuZCk7CisJCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJCXJldHVybiBkZW50cnk7CisJfQorCisJaWYgKGRlbnRyeSAmJiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX09QX1JFVkFMSURBVEUpKSB7CisJCWludCBzdGF0dXMgPSBkX3JldmFsaWRhdGUoZGVudHJ5LCBuZCk7CisJCWlmICh1bmxpa2VseShzdGF0dXMgPD0gMCkpIHsKKwkJCS8qCisJCQkgKiBUaGUgZGVudHJ5IGZhaWxlZCB2YWxpZGF0aW9uLgorCQkJICogSWYgZF9yZXZhbGlkYXRlIHJldHVybmVkIDAgYXR0ZW1wdCB0byBpbnZhbGlkYXRlCisJCQkgKiB0aGUgZGVudHJ5IG90aGVyd2lzZSBkX3JldmFsaWRhdGUgaXMgYXNraW5nIHVzCisJCQkgKiB0byByZXR1cm4gYSBmYWlsIHN0YXR1cy4KKwkJCSAqLworCQkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCQlkcHV0KGRlbnRyeSk7CisJCQkJcmV0dXJuIEVSUl9QVFIoc3RhdHVzKTsKKwkJCX0gZWxzZSBpZiAoIWRfaW52YWxpZGF0ZShkZW50cnkpKSB7CisJCQkJZHB1dChkZW50cnkpOworCQkJCWRlbnRyeSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CiAKIAlpZiAoIWRlbnRyeSkKIAkJZGVudHJ5ID0gZF9hbGxvY19hbmRfbG9va3VwKGJhc2UsIG5hbWUsIG5kKTsKQEAgLTE5OTksMjcgKzIwMTUsMTAgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLS8qCi0gKiBOb3RlIHRoYXQgd2hpbGUgdGhlIGZsYWcgdmFsdWUgKGxvdyB0d28gYml0cykgZm9yIHN5c19vcGVuIG1lYW5zOgotICoJMDAgLSByZWFkLW9ubHkKLSAqCTAxIC0gd3JpdGUtb25seQotICoJMTAgLSByZWFkLXdyaXRlCi0gKgkxMSAtIHNwZWNpYWwKLSAqIGl0IGlzIGNoYW5nZWQgaW50bwotICoJMDAgLSBubyBwZXJtaXNzaW9ucyBuZWVkZWQKLSAqCTAxIC0gcmVhZC1wZXJtaXNzaW9uCi0gKgkxMCAtIHdyaXRlLXBlcm1pc3Npb24KLSAqCTExIC0gcmVhZC13cml0ZQotICogZm9yIHRoZSBpbnRlcm5hbCByb3V0aW5lcyAoaWUgb3Blbl9uYW1laSgpL2ZvbGxvd19saW5rKCkgZXRjKQotICogVGhpcyBpcyBtb3JlIGxvZ2ljYWwsIGFuZCBhbHNvIGFsbG93cyB0aGUgMDAgIm5vIHBlcm0gbmVlZGVkIgotICogdG8gYmUgdXNlZCBmb3Igc3ltbGlua3MgKHdoZXJlIHRoZSBwZXJtaXNzaW9ucyBhcmUgY2hlY2tlZAotICogbGF0ZXIpLgotICoKLSovCiBzdGF0aWMgaW5saW5lIGludCBvcGVuX3RvX25hbWVpX2ZsYWdzKGludCBmbGFnKQogewotCWlmICgoZmxhZysxKSAmIE9fQUNDTU9ERSkKLQkJZmxhZysrOworCWlmICgoZmxhZyAmIE9fQUNDTU9ERSkgPT0gMykKKwkJZmxhZy0tOwogCXJldHVybiBmbGFnOwogfQogCkBAIC0yMzE0LDM1ICsyMzEzLDI5IEBACiAJcmV0dXJuIGZpbGU7CiB9CiAKLS8qKgotICogbG9va3VwX2NyZWF0ZSAtIGxvb2t1cCBhIGRlbnRyeSwgY3JlYXRpbmcgaXQgaWYgaXQgZG9lc24ndCBleGlzdAotICogQG5kOiBuYW1laWRhdGEgaW5mbwotICogQGlzX2RpcjogZGlyZWN0b3J5IGZsYWcKLSAqCi0gKiBTaW1wbGUgZnVuY3Rpb24gdG8gbG9va3VwIGFuZCByZXR1cm4gYSBkZW50cnkgYW5kIGNyZWF0ZSBpdAotICogaWYgaXQgZG9lc24ndCBleGlzdC4gIElzIFNNUC1zYWZlLgotICoKLSAqIFJldHVybnMgd2l0aCBuZC0+cGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXggbG9ja2VkLgotICovCi1zdHJ1Y3QgZGVudHJ5ICpsb29rdXBfY3JlYXRlKHN0cnVjdCBuYW1laWRhdGEgKm5kLCBpbnQgaXNfZGlyKQorc3RydWN0IGRlbnRyeSAqa2Vybl9wYXRoX2NyZWF0ZShpbnQgZGZkLCBjb25zdCBjaGFyICpwYXRobmFtZSwgc3RydWN0IHBhdGggKnBhdGgsIGludCBpc19kaXIpCiB7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gRVJSX1BUUigtRUVYSVNUKTsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvciA9IGRvX3BhdGhfbG9va3VwKGRmZCwgcGF0aG5hbWUsIExPT0tVUF9QQVJFTlQsICZuZCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CiAKLQltdXRleF9sb2NrX25lc3RlZCgmbmQtPnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4LCBJX01VVEVYX1BBUkVOVCk7CiAJLyoKIAkgKiBZdWNreSBsYXN0IGNvbXBvbmVudCBvciBubyBsYXN0IGNvbXBvbmVudCBhdCBhbGw/CiAJICogKGZvby8uLCBmb28vLi4sIC8vLy8vKQogCSAqLwotCWlmIChuZC0+bGFzdF90eXBlICE9IExBU1RfTk9STSkKLQkJZ290byBmYWlsOwotCW5kLT5mbGFncyAmPSB+TE9PS1VQX1BBUkVOVDsKLQluZC0+ZmxhZ3MgfD0gTE9PS1VQX0NSRUFURSB8IExPT0tVUF9FWENMOwotCW5kLT5pbnRlbnQub3Blbi5mbGFncyA9IE9fRVhDTDsKKwlpZiAobmQubGFzdF90eXBlICE9IExBU1RfTk9STSkKKwkJZ290byBvdXQ7CisJbmQuZmxhZ3MgJj0gfkxPT0tVUF9QQVJFTlQ7CisJbmQuZmxhZ3MgfD0gTE9PS1VQX0NSRUFURSB8IExPT0tVUF9FWENMOworCW5kLmludGVudC5vcGVuLmZsYWdzID0gT19FWENMOwogCiAJLyoKIAkgKiBEbyB0aGUgZmluYWwgbG9va3VwLgogCSAqLwotCWRlbnRyeSA9IGxvb2t1cF9oYXNoKG5kKTsKKwltdXRleF9sb2NrX25lc3RlZCgmbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfUEFSRU5UKTsKKwlkZW50cnkgPSBsb29rdXBfaGFzaCgmbmQpOwogCWlmIChJU19FUlIoZGVudHJ5KSkKIAkJZ290byBmYWlsOwogCkBAIC0yMzU0LDE4ICsyMzQ3LDM1IEBACiAJICogYWxsIGlzIGZpbmUuIExldCdzIGJlIGJhc3RhcmRzIC0geW91IGhhZCAvIG9uIHRoZSBlbmQsIHlvdSd2ZQogCSAqIGJlZW4gYXNraW5nIGZvciAobm9uLWV4aXN0ZW50KSBkaXJlY3RvcnkuIC1FTk9FTlQgZm9yIHlvdS4KIAkgKi8KLQlpZiAodW5saWtlbHkoIWlzX2RpciAmJiBuZC0+bGFzdC5uYW1lW25kLT5sYXN0Lmxlbl0pKSB7CisJaWYgKHVubGlrZWx5KCFpc19kaXIgJiYgbmQubGFzdC5uYW1lW25kLmxhc3QubGVuXSkpIHsKIAkJZHB1dChkZW50cnkpOwogCQlkZW50cnkgPSBFUlJfUFRSKC1FTk9FTlQpOworCQlnb3RvIGZhaWw7CiAJfQorCSpwYXRoID0gbmQucGF0aDsKIAlyZXR1cm4gZGVudHJ5OwogZWV4aXN0OgogCWRwdXQoZGVudHJ5KTsKIAlkZW50cnkgPSBFUlJfUFRSKC1FRVhJU1QpOwogZmFpbDoKKwltdXRleF91bmxvY2soJm5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKK291dDoKKwlwYXRoX3B1dCgmbmQucGF0aCk7CiAJcmV0dXJuIGRlbnRyeTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGxvb2t1cF9jcmVhdGUpOworRVhQT1JUX1NZTUJPTChrZXJuX3BhdGhfY3JlYXRlKTsKKworc3RydWN0IGRlbnRyeSAqdXNlcl9wYXRoX2NyZWF0ZShpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqcGF0aG5hbWUsIHN0cnVjdCBwYXRoICpwYXRoLCBpbnQgaXNfZGlyKQoreworCWNoYXIgKnRtcCA9IGdldG5hbWUocGF0aG5hbWUpOworCXN0cnVjdCBkZW50cnkgKnJlczsKKwlpZiAoSVNfRVJSKHRtcCkpCisJCXJldHVybiBFUlJfQ0FTVCh0bXApOworCXJlcyA9IGtlcm5fcGF0aF9jcmVhdGUoZGZkLCB0bXAsIHBhdGgsIGlzX2Rpcik7CisJcHV0bmFtZSh0bXApOworCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9MKHVzZXJfcGF0aF9jcmVhdGUpOwogCiBpbnQgdmZzX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCBkZXYpCiB7CkBAIC0yNDE1LDU0ICsyNDI1LDQ2IEBACiBTWVNDQUxMX0RFRklORTQobWtub2RhdCwgaW50LCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLCBpbnQsIG1vZGUsCiAJCXVuc2lnbmVkLCBkZXYpCiB7Ci0JaW50IGVycm9yOwotCWNoYXIgKnRtcDsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Ci0Jc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3QgcGF0aCBwYXRoOworCWludCBlcnJvcjsKIAogCWlmIChTX0lTRElSKG1vZGUpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JZXJyb3IgPSB1c2VyX3BhdGhfcGFyZW50KGRmZCwgZmlsZW5hbWUsICZuZCwgJnRtcCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7CisJZGVudHJ5ID0gdXNlcl9wYXRoX2NyZWF0ZShkZmQsIGZpbGVuYW1lLCAmcGF0aCwgMCk7CisJaWYgKElTX0VSUihkZW50cnkpKQorCQlyZXR1cm4gUFRSX0VSUihkZW50cnkpOwogCi0JZGVudHJ5ID0gbG9va3VwX2NyZWF0ZSgmbmQsIDApOwotCWlmIChJU19FUlIoZGVudHJ5KSkgewotCQllcnJvciA9IFBUUl9FUlIoZGVudHJ5KTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQlpZiAoIUlTX1BPU0lYQUNMKG5kLnBhdGguZGVudHJ5LT5kX2lub2RlKSkKKwlpZiAoIUlTX1BPU0lYQUNMKHBhdGguZGVudHJ5LT5kX2lub2RlKSkKIAkJbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwogCWVycm9yID0gbWF5X21rbm9kKG1vZGUpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZHB1dDsKLQllcnJvciA9IG1udF93YW50X3dyaXRlKG5kLnBhdGgubW50KTsKKwllcnJvciA9IG1udF93YW50X3dyaXRlKHBhdGgubW50KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2RwdXQ7Ci0JZXJyb3IgPSBzZWN1cml0eV9wYXRoX21rbm9kKCZuZC5wYXRoLCBkZW50cnksIG1vZGUsIGRldik7CisJZXJyb3IgPSBzZWN1cml0eV9wYXRoX21rbm9kKCZwYXRoLCBkZW50cnksIG1vZGUsIGRldik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9kcm9wX3dyaXRlOwogCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCQljYXNlIDA6IGNhc2UgU19JRlJFRzoKLQkJCWVycm9yID0gdmZzX2NyZWF0ZShuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZSxkZW50cnksbW9kZSwmbmQpOworCQkJZXJyb3IgPSB2ZnNfY3JlYXRlKHBhdGguZGVudHJ5LT5kX2lub2RlLGRlbnRyeSxtb2RlLE5VTEwpOwogCQkJYnJlYWs7CiAJCWNhc2UgU19JRkNIUjogY2FzZSBTX0lGQkxLOgotCQkJZXJyb3IgPSB2ZnNfbWtub2QobmQucGF0aC5kZW50cnktPmRfaW5vZGUsZGVudHJ5LG1vZGUsCisJCQllcnJvciA9IHZmc19ta25vZChwYXRoLmRlbnRyeS0+ZF9pbm9kZSxkZW50cnksbW9kZSwKIAkJCQkJbmV3X2RlY29kZV9kZXYoZGV2KSk7CiAJCQlicmVhazsKIAkJY2FzZSBTX0lGSUZPOiBjYXNlIFNfSUZTT0NLOgotCQkJZXJyb3IgPSB2ZnNfbWtub2QobmQucGF0aC5kZW50cnktPmRfaW5vZGUsZGVudHJ5LG1vZGUsMCk7CisJCQllcnJvciA9IHZmc19ta25vZChwYXRoLmRlbnRyeS0+ZF9pbm9kZSxkZW50cnksbW9kZSwwKTsKIAkJCWJyZWFrOwogCX0KIG91dF9kcm9wX3dyaXRlOgotCW1udF9kcm9wX3dyaXRlKG5kLnBhdGgubW50KTsKKwltbnRfZHJvcF93cml0ZShwYXRoLm1udCk7CiBvdXRfZHB1dDoKIAlkcHV0KGRlbnRyeSk7Ci1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwotCXBhdGhfcHV0KCZuZC5wYXRoKTsKLQlwdXRuYW1lKHRtcCk7CisJbXV0ZXhfdW5sb2NrKCZwYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJcGF0aF9wdXQoJnBhdGgpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMjQ5NSwzOCArMjQ5NywyOSBAQAogCiBTWVNDQUxMX0RFRklORTMobWtkaXJhdCwgaW50LCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCBpbnQsIG1vZGUpCiB7Ci0JaW50IGVycm9yID0gMDsKLQljaGFyICogdG1wOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLQlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCXN0cnVjdCBwYXRoIHBhdGg7CisJaW50IGVycm9yOwogCi0JZXJyb3IgPSB1c2VyX3BhdGhfcGFyZW50KGRmZCwgcGF0aG5hbWUsICZuZCwgJnRtcCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF9lcnI7Ci0KLQlkZW50cnkgPSBsb29rdXBfY3JlYXRlKCZuZCwgMSk7Ci0JZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CisJZGVudHJ5ID0gdXNlcl9wYXRoX2NyZWF0ZShkZmQsIHBhdGhuYW1lLCAmcGF0aCwgMSk7CiAJaWYgKElTX0VSUihkZW50cnkpKQotCQlnb3RvIG91dF91bmxvY2s7CisJCXJldHVybiBQVFJfRVJSKGRlbnRyeSk7CiAKLQlpZiAoIUlTX1BPU0lYQUNMKG5kLnBhdGguZGVudHJ5LT5kX2lub2RlKSkKKwlpZiAoIUlTX1BPU0lYQUNMKHBhdGguZGVudHJ5LT5kX2lub2RlKSkKIAkJbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwotCWVycm9yID0gbW50X3dhbnRfd3JpdGUobmQucGF0aC5tbnQpOworCWVycm9yID0gbW50X3dhbnRfd3JpdGUocGF0aC5tbnQpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZHB1dDsKLQllcnJvciA9IHNlY3VyaXR5X3BhdGhfbWtkaXIoJm5kLnBhdGgsIGRlbnRyeSwgbW9kZSk7CisJZXJyb3IgPSBzZWN1cml0eV9wYXRoX21rZGlyKCZwYXRoLCBkZW50cnksIG1vZGUpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZHJvcF93cml0ZTsKLQllcnJvciA9IHZmc19ta2RpcihuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5LCBtb2RlKTsKKwllcnJvciA9IHZmc19ta2RpcihwYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5LCBtb2RlKTsKIG91dF9kcm9wX3dyaXRlOgotCW1udF9kcm9wX3dyaXRlKG5kLnBhdGgubW50KTsKKwltbnRfZHJvcF93cml0ZShwYXRoLm1udCk7CiBvdXRfZHB1dDoKIAlkcHV0KGRlbnRyeSk7Ci1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwotCXBhdGhfcHV0KCZuZC5wYXRoKTsKLQlwdXRuYW1lKHRtcCk7Ci1vdXRfZXJyOgorCW11dGV4X3VubG9jaygmcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCXBhdGhfcHV0KCZwYXRoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTI2MjQsNiArMjYxNywxMCBAQAogCWVycm9yID0gUFRSX0VSUihkZW50cnkpOwogCWlmIChJU19FUlIoZGVudHJ5KSkKIAkJZ290byBleGl0MjsKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkgeworCQllcnJvciA9IC1FTk9FTlQ7CisJCWdvdG8gZXhpdDM7CisJfQogCWVycm9yID0gbW50X3dhbnRfd3JpdGUobmQucGF0aC5tbnQpOwogCWlmIChlcnJvcikKIAkJZ290byBleGl0MzsKQEAgLTI3MTIsOCArMjcwOSw5IEBACiAJCWlmIChuZC5sYXN0Lm5hbWVbbmQubGFzdC5sZW5dKQogCQkJZ290byBzbGFzaGVzOwogCQlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQkJaWYgKGlub2RlKQotCQkJaWhvbGQoaW5vZGUpOworCQlpZiAoIWlub2RlKQorCQkJZ290byBzbGFzaGVzOworCQlpaG9sZChpbm9kZSk7CiAJCWVycm9yID0gbW50X3dhbnRfd3JpdGUobmQucGF0aC5tbnQpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGV4aXQyOwpAQCAtMjc4MSwzOCArMjc3OSwzMSBAQAogewogCWludCBlcnJvcjsKIAljaGFyICpmcm9tOwotCWNoYXIgKnRvOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLQlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCXN0cnVjdCBwYXRoIHBhdGg7CiAKIAlmcm9tID0gZ2V0bmFtZShvbGRuYW1lKTsKIAlpZiAoSVNfRVJSKGZyb20pKQogCQlyZXR1cm4gUFRSX0VSUihmcm9tKTsKIAotCWVycm9yID0gdXNlcl9wYXRoX3BhcmVudChuZXdkZmQsIG5ld25hbWUsICZuZCwgJnRvKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X3B1dG5hbWU7Ci0KLQlkZW50cnkgPSBsb29rdXBfY3JlYXRlKCZuZCwgMCk7CisJZGVudHJ5ID0gdXNlcl9wYXRoX2NyZWF0ZShuZXdkZmQsIG5ld25hbWUsICZwYXRoLCAwKTsKIAllcnJvciA9IFBUUl9FUlIoZGVudHJ5KTsKIAlpZiAoSVNfRVJSKGRlbnRyeSkpCi0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfcHV0bmFtZTsKIAotCWVycm9yID0gbW50X3dhbnRfd3JpdGUobmQucGF0aC5tbnQpOworCWVycm9yID0gbW50X3dhbnRfd3JpdGUocGF0aC5tbnQpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZHB1dDsKLQllcnJvciA9IHNlY3VyaXR5X3BhdGhfc3ltbGluaygmbmQucGF0aCwgZGVudHJ5LCBmcm9tKTsKKwllcnJvciA9IHNlY3VyaXR5X3BhdGhfc3ltbGluaygmcGF0aCwgZGVudHJ5LCBmcm9tKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7Ci0JZXJyb3IgPSB2ZnNfc3ltbGluayhuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5LCBmcm9tKTsKKwllcnJvciA9IHZmc19zeW1saW5rKHBhdGguZGVudHJ5LT5kX2lub2RlLCBkZW50cnksIGZyb20pOwogb3V0X2Ryb3Bfd3JpdGU6Ci0JbW50X2Ryb3Bfd3JpdGUobmQucGF0aC5tbnQpOworCW1udF9kcm9wX3dyaXRlKHBhdGgubW50KTsKIG91dF9kcHV0OgogCWRwdXQoZGVudHJ5KTsKLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JcGF0aF9wdXQoJm5kLnBhdGgpOwotCXB1dG5hbWUodG8pOworCW11dGV4X3VubG9jaygmcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCXBhdGhfcHV0KCZwYXRoKTsKIG91dF9wdXRuYW1lOgogCXB1dG5hbWUoZnJvbSk7CiAJcmV0dXJuIGVycm9yOwpAQCAtMjg3NywxMSArMjg2OCw5IEBACiAJCWludCwgbmV3ZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuZXduYW1lLCBpbnQsIGZsYWdzKQogewogCXN0cnVjdCBkZW50cnkgKm5ld19kZW50cnk7Ci0Jc3RydWN0IG5hbWVpZGF0YSBuZDsKLQlzdHJ1Y3QgcGF0aCBvbGRfcGF0aDsKKwlzdHJ1Y3QgcGF0aCBvbGRfcGF0aCwgbmV3X3BhdGg7CiAJaW50IGhvdyA9IDA7CiAJaW50IGVycm9yOwotCWNoYXIgKnRvOwogCiAJaWYgKChmbGFncyAmIH4oQVRfU1lNTElOS19GT0xMT1cgfCBBVF9FTVBUWV9QQVRIKSkgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yOTAzLDMyICsyODkyLDI3IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQllcnJvciA9IHVzZXJfcGF0aF9wYXJlbnQobmV3ZGZkLCBuZXduYW1lLCAmbmQsICZ0byk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dDsKLQllcnJvciA9IC1FWERFVjsKLQlpZiAob2xkX3BhdGgubW50ICE9IG5kLnBhdGgubW50KQotCQlnb3RvIG91dF9yZWxlYXNlOwotCW5ld19kZW50cnkgPSBsb29rdXBfY3JlYXRlKCZuZCwgMCk7CisJbmV3X2RlbnRyeSA9IHVzZXJfcGF0aF9jcmVhdGUobmV3ZGZkLCBuZXduYW1lLCAmbmV3X3BhdGgsIDApOwogCWVycm9yID0gUFRSX0VSUihuZXdfZGVudHJ5KTsKIAlpZiAoSVNfRVJSKG5ld19kZW50cnkpKQotCQlnb3RvIG91dF91bmxvY2s7Ci0JZXJyb3IgPSBtbnRfd2FudF93cml0ZShuZC5wYXRoLm1udCk7CisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRVhERVY7CisJaWYgKG9sZF9wYXRoLm1udCAhPSBuZXdfcGF0aC5tbnQpCisJCWdvdG8gb3V0X2RwdXQ7CisJZXJyb3IgPSBtbnRfd2FudF93cml0ZShuZXdfcGF0aC5tbnQpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZHB1dDsKLQllcnJvciA9IHNlY3VyaXR5X3BhdGhfbGluayhvbGRfcGF0aC5kZW50cnksICZuZC5wYXRoLCBuZXdfZGVudHJ5KTsKKwllcnJvciA9IHNlY3VyaXR5X3BhdGhfbGluayhvbGRfcGF0aC5kZW50cnksICZuZXdfcGF0aCwgbmV3X2RlbnRyeSk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9kcm9wX3dyaXRlOwotCWVycm9yID0gdmZzX2xpbmsob2xkX3BhdGguZGVudHJ5LCBuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgbmV3X2RlbnRyeSk7CisJZXJyb3IgPSB2ZnNfbGluayhvbGRfcGF0aC5kZW50cnksIG5ld19wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgbmV3X2RlbnRyeSk7CiBvdXRfZHJvcF93cml0ZToKLQltbnRfZHJvcF93cml0ZShuZC5wYXRoLm1udCk7CisJbW50X2Ryb3Bfd3JpdGUobmV3X3BhdGgubW50KTsKIG91dF9kcHV0OgogCWRwdXQobmV3X2RlbnRyeSk7Ci1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwotb3V0X3JlbGVhc2U6Ci0JcGF0aF9wdXQoJm5kLnBhdGgpOwotCXB1dG5hbWUodG8pOworCW11dGV4X3VubG9jaygmbmV3X3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwlwYXRoX3B1dCgmbmV3X3BhdGgpOwogb3V0OgogCXBhdGhfcHV0KCZvbGRfcGF0aCk7CiAKQEAgLTMzMzQsMTEgKzMzMTgsOSBAQAogRVhQT1JUX1NZTUJPTChfX3BhZ2Vfc3ltbGluayk7CiBFWFBPUlRfU1lNQk9MKHBhZ2Vfc3ltbGluayk7CiBFWFBPUlRfU1lNQk9MKHBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zKTsKLUVYUE9SVF9TWU1CT0woa2Vybl9wYXRoX3BhcmVudCk7CiBFWFBPUlRfU1lNQk9MKGtlcm5fcGF0aCk7CiBFWFBPUlRfU1lNQk9MKHZmc19wYXRoX2xvb2t1cCk7CiBFWFBPUlRfU1lNQk9MKGlub2RlX3Blcm1pc3Npb24pOwotRVhQT1JUX1NZTUJPTChmaWxlX3Blcm1pc3Npb24pOwogRVhQT1JUX1NZTUJPTCh1bmxvY2tfcmVuYW1lKTsKIEVYUE9SVF9TWU1CT0wodmZzX2NyZWF0ZSk7CiBFWFBPUlRfU1lNQk9MKHZmc19mb2xsb3dfbGluayk7CmRpZmYgLS1naXQgYS9mcy9uYW1lc3BhY2UuYyBiL2ZzL25hbWVzcGFjZS5jCmluZGV4IGZlNTliZDEuLjIyYmZlODIgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC05MzQsOCArOTM0LDggQEAKIAlpbnQgcmVzID0gMDsKIAogCWJyX3JlYWRfbG9jayh2ZnNtb3VudF9sb2NrKTsKLQlpZiAocC0+ZXZlbnQgIT0gbnMtPmV2ZW50KSB7Ci0JCXAtPmV2ZW50ID0gbnMtPmV2ZW50OworCWlmIChwLT5tLnBvbGxfZXZlbnQgIT0gbnMtPmV2ZW50KSB7CisJCXAtPm0ucG9sbF9ldmVudCA9IG5zLT5ldmVudDsKIAkJcmVzID0gMTsKIAl9CiAJYnJfcmVhZF91bmxvY2sodmZzbW91bnRfbG9jayk7CkBAIC0yNzIxLDYgKzI3MjEsMjUgQEAKIAogc3RydWN0IHZmc21vdW50ICprZXJuX21vdW50X2RhdGEoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIHZmc19rZXJuX21vdW50KHR5cGUsIE1TX0tFUk5NT1VOVCwgdHlwZS0+bmFtZSwgZGF0YSk7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisJbW50ID0gdmZzX2tlcm5fbW91bnQodHlwZSwgTVNfS0VSTk1PVU5ULCB0eXBlLT5uYW1lLCBkYXRhKTsKKwlpZiAoIUlTX0VSUihtbnQpKSB7CisJCS8qCisJCSAqIGl0IGlzIGEgbG9uZ3Rlcm0gbW91bnQsIGRvbid0IHJlbGVhc2UgbW50IHVudGlsCisJCSAqIHdlIHVubW91bnQgYmVmb3JlIGZpbGUgc3lzIGlzIHVucmVnaXN0ZXJlZAorCQkqLworCQltbnRfbWFrZV9sb25ndGVybShtbnQpOworCX0KKwlyZXR1cm4gbW50OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa2Vybl9tb3VudF9kYXRhKTsKKwordm9pZCBrZXJuX3VubW91bnQoc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJLyogcmVsZWFzZSBsb25nIHRlcm0gbW91bnQgc28gbW91bnQgcG9pbnQgY2FuIGJlIHJlbGVhc2VkICovCisJaWYgKCFJU19FUlJfT1JfTlVMTChtbnQpKSB7CisJCW1udF9tYWtlX3Nob3J0dGVybShtbnQpOworCQltbnRwdXQobW50KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGtlcm5fdW5tb3VudCk7CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9maWxlLmMgYi9mcy9uY3Bmcy9maWxlLmMKaW5kZXggMGVkNjVlMC4uNjRhMzI2NCAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZmlsZS5jCisrKyBiL2ZzL25jcGZzL2ZpbGUuYwpAQCAtMjAsOSArMjAsOSBAQAogCiAjaW5jbHVkZSAibmNwX2ZzLmgiCiAKLXN0YXRpYyBpbnQgbmNwX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpCitzdGF0aWMgaW50IG5jcF9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCiB7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoZmlsZS0+Zl9tYXBwaW5nLCBzdGFydCwgZW5kKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWNoZV9saWIuYyBiL2ZzL25mcy9jYWNoZV9saWIuYwppbmRleCA4NDY5MDMxLi5jOThiNDM5IDEwMDY0NAotLS0gYS9mcy9uZnMvY2FjaGVfbGliLmMKKysrIGIvZnMvbmZzL2NhY2hlX2xpYi5jCkBAIC0xMTMsMTkgKzExMywxOCBAQAogCiBpbnQgbmZzX2NhY2hlX3JlZ2lzdGVyKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkKQogewotCXN0cnVjdCBuYW1laWRhdGEgbmQ7CiAJc3RydWN0IHZmc21vdW50ICptbnQ7CisJc3RydWN0IHBhdGggcGF0aDsKIAlpbnQgcmV0OwogCiAJbW50ID0gcnBjX2dldF9tb3VudCgpOwogCWlmIChJU19FUlIobW50KSkKIAkJcmV0dXJuIFBUUl9FUlIobW50KTsKLQlyZXQgPSB2ZnNfcGF0aF9sb29rdXAobW50LT5tbnRfcm9vdCwgbW50LCAiL2NhY2hlIiwgMCwgJm5kKTsKKwlyZXQgPSB2ZnNfcGF0aF9sb29rdXAobW50LT5tbnRfcm9vdCwgbW50LCAiL2NhY2hlIiwgMCwgJnBhdGgpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwotCXJldCA9IHN1bnJwY19jYWNoZV9yZWdpc3Rlcl9waXBlZnMobmQucGF0aC5kZW50cnksCi0JCQljZC0+bmFtZSwgMDYwMCwgY2QpOwotCXBhdGhfcHV0KCZuZC5wYXRoKTsKKwlyZXQgPSBzdW5ycGNfY2FjaGVfcmVnaXN0ZXJfcGlwZWZzKHBhdGguZGVudHJ5LCBjZC0+bmFtZSwgMDYwMCwgY2QpOworCXBhdGhfcHV0KCZwYXRoKTsKIAlpZiAoIXJldCkKIAkJcmV0dXJuIHJldDsKIGVycjoKZGlmZiAtLWdpdCBhL2ZzL25mcy9kaXIuYyBiL2ZzL25mcy9kaXIuYwppbmRleCBlZGVkZGJkLi41N2Y1NzhlIDEwMDY0NAotLS0gYS9mcy9uZnMvZGlyLmMKKysrIGIvZnMvbmZzL2Rpci5jCkBAIC01Niw3ICs1Niw3IEBACiBzdGF0aWMgaW50IG5mc19ta25vZChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQsIGRldl90KTsKIHN0YXRpYyBpbnQgbmZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKLXN0YXRpYyBpbnQgbmZzX2ZzeW5jX2RpcihzdHJ1Y3QgZmlsZSAqLCBpbnQpOworc3RhdGljIGludCBuZnNfZnN5bmNfZGlyKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgbG9mZl90LCBpbnQpOwogc3RhdGljIGxvZmZfdCBuZnNfbGxzZWVrX2RpcihzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CiBzdGF0aWMgdm9pZCBuZnNfcmVhZGRpcl9jbGVhcl9hcnJheShzdHJ1Y3QgcGFnZSopOwogCkBAIC05NDUsMTUgKzk0NSwxOSBAQAogICogQWxsIGRpcmVjdG9yeSBvcGVyYXRpb25zIHVuZGVyIE5GUyBhcmUgc3luY2hyb25vdXMsIHNvIGZzeW5jKCkKICAqIGlzIGEgZHVtbXkgb3BlcmF0aW9uLgogICovCi1zdGF0aWMgaW50IG5mc19mc3luY19kaXIoc3RydWN0IGZpbGUgKmZpbHAsIGludCBkYXRhc3luYykKK3N0YXRpYyBpbnQgbmZzX2ZzeW5jX2RpcihzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkJIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX3BhdGguZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAKIAlkZnByaW50ayhGSUxFLCAiTkZTOiBmc3luYyBkaXIoJXMvJXMpIGRhdGFzeW5jICVkXG4iLAogCQkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQlkYXRhc3luYyk7CiAKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJbmZzX2luY19zdGF0cyhkZW50cnktPmRfaW5vZGUsIE5GU0lPU19WRlNGU1lOQyk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5NywxNCArMTAwMSwxMiBAQAogICogUmV0dXJuIHRoZSBpbnRlbnQgZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhpcyBwYXJ0aWN1bGFyIHBhdGggY29tcG9uZW50CiAgKgogICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHNldCBvZiBpbnRlbnRzIG9ubHkgYXBwbHkgdG8gdGhlIHZlcnkgbGFzdAotICogY29tcG9uZW50IG9mIHRoZSBwYXRoLgotICogV2UgY2hlY2sgZm9yIHRoaXMgdXNpbmcgTE9PS1VQX0NPTlRJTlVFIGFuZCBMT09LVVBfUEFSRU5ULgorICogY29tcG9uZW50IG9mIHRoZSBwYXRoIGFuZCBub25lIG9mIHRoZW0gaXMgc2V0IGJlZm9yZSB0aGF0IGxhc3QKKyAqIGNvbXBvbmVudC4KICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbmZzX2xvb2t1cF9jaGVja19pbnRlbnQoc3RydWN0IG5hbWVpZGF0YSAqbmQsCiAJCQkJCQl1bnNpZ25lZCBpbnQgbWFzaykKIHsKLQlpZiAobmQtPmZsYWdzICYgKExPT0tVUF9DT05USU5VRXxMT09LVVBfUEFSRU5UKSkKLQkJcmV0dXJuIDA7CiAJcmV0dXJuIG5kLT5mbGFncyAmIG1hc2s7CiB9CiAKQEAgLTEzMzgsMjUgKzEzNDAsMzEgQEAKIAkJcmV0dXJuIDA7CiAJLyogQXJlIHdlIHRyeWluZyB0byB3cml0ZSB0byBhIHJlYWQgb25seSBwYXJ0aXRpb24/ICovCiAJaWYgKF9fbW50X2lzX3JlYWRvbmx5KG5kLT5wYXRoLm1udCkgJiYKLQkgICAgKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIChPX0NSRUFUfE9fVFJVTkN8Rk1PREVfV1JJVEUpKSkKKwkgICAgKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIChPX0NSRUFUfE9fVFJVTkN8T19BQ0NNT0RFKSkpCiAJCXJldHVybiAwOwogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKm5hbWVpZGF0YV90b19uZnNfb3Blbl9jb250ZXh0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitzdGF0aWMgZm1vZGVfdCBmbGFnc190b19tb2RlKGludCBmbGFncykKIHsKLQlzdHJ1Y3QgcGF0aCBwYXRoID0gewotCQkubW50ID0gbmQtPnBhdGgubW50LAotCQkuZGVudHJ5ID0gZGVudHJ5LAotCX07CisJZm1vZGVfdCByZXMgPSAoX19mb3JjZSBmbW9kZV90KWZsYWdzICYgRk1PREVfRVhFQzsKKwlpZiAoKGZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1dST05MWSkKKwkJcmVzIHw9IEZNT0RFX1JFQUQ7CisJaWYgKChmbGFncyAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFkpCisJCXJlcyB8PSBGTU9ERV9XUklURTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmNyZWF0ZV9uZnNfb3Blbl9jb250ZXh0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG9wZW5fZmxhZ3MpCit7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eDsKIAlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7Ci0JZm1vZGVfdCBmbW9kZSA9IG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWEVDKTsKKwlmbW9kZV90IGZtb2RlID0gZmxhZ3NfdG9fbW9kZShvcGVuX2ZsYWdzKTsKIAogCWNyZWQgPSBycGNfbG9va3VwX2NyZWQoKTsKIAlpZiAoSVNfRVJSKGNyZWQpKQogCQlyZXR1cm4gRVJSX0NBU1QoY3JlZCk7Ci0JY3R4ID0gYWxsb2NfbmZzX29wZW5fY29udGV4dCgmcGF0aCwgY3JlZCwgZm1vZGUpOworCWN0eCA9IGFsbG9jX25mc19vcGVuX2NvbnRleHQoZGVudHJ5LCBjcmVkLCBmbW9kZSk7CiAJcHV0X3JwY2NyZWQoY3JlZCk7CiAJaWYgKGN0eCA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKQEAgLTEzNzYsMTMgKzEzODQsMTMgQEAKIAogCS8qIElmIHRoZSBvcGVuX2ludGVudCBpcyBmb3IgZXhlY3V0ZSwgd2UgaGF2ZSBhbiBleHRyYSBjaGVjayB0byBtYWtlICovCiAJaWYgKGN0eC0+bW9kZSAmIEZNT0RFX0VYRUMpIHsKLQkJcmV0ID0gbmZzX21heV9vcGVuKGN0eC0+cGF0aC5kZW50cnktPmRfaW5vZGUsCisJCXJldCA9IG5mc19tYXlfb3BlbihjdHgtPmRlbnRyeS0+ZF9pbm9kZSwKIAkJCQljdHgtPmNyZWQsCiAJCQkJbmQtPmludGVudC5vcGVuLmZsYWdzKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAl9Ci0JZmlscCA9IGxvb2t1cF9pbnN0YW50aWF0ZV9maWxwKG5kLCBjdHgtPnBhdGguZGVudHJ5LCBkb19vcGVuKTsKKwlmaWxwID0gbG9va3VwX2luc3RhbnRpYXRlX2ZpbHAobmQsIGN0eC0+ZGVudHJ5LCBkb19vcGVuKTsKIAlpZiAoSVNfRVJSKGZpbHApKQogCQlyZXQgPSBQVFJfRVJSKGZpbHApOwogCWVsc2UKQEAgLTE0MjAsMTIgKzE0MjgsMTMgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JY3R4ID0gbmFtZWlkYXRhX3RvX25mc19vcGVuX2NvbnRleHQoZGVudHJ5LCBuZCk7CisJb3Blbl9mbGFncyA9IG5kLT5pbnRlbnQub3Blbi5mbGFnczsKKworCWN0eCA9IGNyZWF0ZV9uZnNfb3Blbl9jb250ZXh0KGRlbnRyeSwgb3Blbl9mbGFncyk7CiAJcmVzID0gRVJSX0NBU1QoY3R4KTsKIAlpZiAoSVNfRVJSKGN0eCkpCiAJCWdvdG8gb3V0OwogCi0Jb3Blbl9mbGFncyA9IG5kLT5pbnRlbnQub3Blbi5mbGFnczsKIAlpZiAobmQtPmZsYWdzICYgTE9PS1VQX0NSRUFURSkgewogCQlhdHRyLmlhX21vZGUgPSBuZC0+aW50ZW50Lm9wZW4uY3JlYXRlX21vZGU7CiAJCWF0dHIuaWFfdmFsaWQgPSBBVFRSX01PREU7CkBAIC0xNDYzLDggKzE0NzIsOCBAQAogCXJlcyA9IGRfYWRkX3VuaXF1ZShkZW50cnksIGlub2RlKTsKIAluZnNfdW5ibG9ja19zaWxseXJlbmFtZShkZW50cnktPmRfcGFyZW50KTsKIAlpZiAocmVzICE9IE5VTEwpIHsKLQkJZHB1dChjdHgtPnBhdGguZGVudHJ5KTsKLQkJY3R4LT5wYXRoLmRlbnRyeSA9IGRnZXQocmVzKTsKKwkJZHB1dChjdHgtPmRlbnRyeSk7CisJCWN0eC0+ZGVudHJ5ID0gZGdldChyZXMpOwogCQlkZW50cnkgPSByZXM7CiAJfQogCWVyciA9IG5mc19pbnRlbnRfc2V0X2ZpbGUobmQsIGN0eCk7CkBAIC0xNTE3LDcgKzE1MjYsNyBAQAogCS8qIFdlIGNhbid0IGNyZWF0ZSBuZXcgZmlsZXMsIG9yIHRydW5jYXRlIGV4aXN0aW5nIG9uZXMgaGVyZSAqLwogCW9wZW5mbGFncyAmPSB+KE9fQ1JFQVR8T19FWENMfE9fVFJVTkMpOwogCi0JY3R4ID0gbmFtZWlkYXRhX3RvX25mc19vcGVuX2NvbnRleHQoZGVudHJ5LCBuZCk7CisJY3R4ID0gY3JlYXRlX25mc19vcGVuX2NvbnRleHQoZGVudHJ5LCBvcGVuZmxhZ3MpOwogCXJldCA9IFBUUl9FUlIoY3R4KTsKIAlpZiAoSVNfRVJSKGN0eCkpCiAJCWdvdG8gb3V0OwpAQCAtMTU3MCw3ICsxNTc5LDcgQEAKIAlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4ID0gTlVMTDsKIAlzdHJ1Y3QgaWF0dHIgYXR0cjsKIAlpbnQgZXJyb3I7Ci0JaW50IG9wZW5fZmxhZ3MgPSAwOworCWludCBvcGVuX2ZsYWdzID0gT19DUkVBVHxPX0VYQ0w7CiAKIAlkZnByaW50ayhWRlMsICJORlM6IGNyZWF0ZSglcy8lbGQpLCAlc1xuIiwKIAkJCWRpci0+aV9zYi0+c19pZCwgZGlyLT5pX2lubywgZGVudHJ5LT5kX25hbWUubmFtZSk7CkBAIC0xNTc4LDI3ICsxNTg3LDI3IEBACiAJYXR0ci5pYV9tb2RlID0gbW9kZTsKIAlhdHRyLmlhX3ZhbGlkID0gQVRUUl9NT0RFOwogCi0JaWYgKChuZC0+ZmxhZ3MgJiBMT09LVVBfQ1JFQVRFKSAhPSAwKSB7CisJaWYgKG5kKQogCQlvcGVuX2ZsYWdzID0gbmQtPmludGVudC5vcGVuLmZsYWdzOwogCi0JCWN0eCA9IG5hbWVpZGF0YV90b19uZnNfb3Blbl9jb250ZXh0KGRlbnRyeSwgbmQpOwotCQllcnJvciA9IFBUUl9FUlIoY3R4KTsKLQkJaWYgKElTX0VSUihjdHgpKQotCQkJZ290byBvdXRfZXJyX2Ryb3A7Ci0JfQorCWN0eCA9IGNyZWF0ZV9uZnNfb3Blbl9jb250ZXh0KGRlbnRyeSwgb3Blbl9mbGFncyk7CisJZXJyb3IgPSBQVFJfRVJSKGN0eCk7CisJaWYgKElTX0VSUihjdHgpKQorCQlnb3RvIG91dF9lcnJfZHJvcDsKIAogCWVycm9yID0gTkZTX1BST1RPKGRpciktPmNyZWF0ZShkaXIsIGRlbnRyeSwgJmF0dHIsIG9wZW5fZmxhZ3MsIGN0eCk7CiAJaWYgKGVycm9yICE9IDApCiAJCWdvdG8gb3V0X3B1dF9jdHg7Ci0JaWYgKGN0eCAhPSBOVUxMKSB7CisJaWYgKG5kKSB7CiAJCWVycm9yID0gbmZzX2ludGVudF9zZXRfZmlsZShuZCwgY3R4KTsKIAkJaWYgKGVycm9yIDwgMCkKIAkJCWdvdG8gb3V0X2VycjsKKwl9IGVsc2UgeworCQlwdXRfbmZzX29wZW5fY29udGV4dChjdHgpOwogCX0KIAlyZXR1cm4gMDsKIG91dF9wdXRfY3R4OgotCWlmIChjdHggIT0gTlVMTCkKLQkJcHV0X25mc19vcGVuX2NvbnRleHQoY3R4KTsKKwlwdXRfbmZzX29wZW5fY29udGV4dChjdHgpOwogb3V0X2Vycl9kcm9wOgogCWRfZHJvcChkZW50cnkpOwogb3V0X2VycjoKQEAgLTE2NjAsNyArMTY2OSw3IEBACiB7CiAJc3RydWN0IGlhdHRyIGF0dHI7CiAJaW50IGVycm9yOwotCWludCBvcGVuX2ZsYWdzID0gMDsKKwlpbnQgb3Blbl9mbGFncyA9IE9fQ1JFQVR8T19FWENMOwogCiAJZGZwcmludGsoVkZTLCAiTkZTOiBjcmVhdGUoJXMvJWxkKSwgJXNcbiIsCiAJCQlkaXItPmlfc2ItPnNfaWQsIGRpci0+aV9pbm8sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwpAQCAtMTY2OCw3ICsxNjc3LDcgQEAKIAlhdHRyLmlhX21vZGUgPSBtb2RlOwogCWF0dHIuaWFfdmFsaWQgPSBBVFRSX01PREU7CiAKLQlpZiAoKG5kLT5mbGFncyAmIExPT0tVUF9DUkVBVEUpICE9IDApCisJaWYgKG5kKQogCQlvcGVuX2ZsYWdzID0gbmQtPmludGVudC5vcGVuLmZsYWdzOwogCiAJZXJyb3IgPSBORlNfUFJPVE8oZGlyKS0+Y3JlYXRlKGRpciwgZGVudHJ5LCAmYXR0ciwgb3Blbl9mbGFncywgTlVMTCk7CkBAIC0yMjU5LDExICsyMjY4LDExIEBACiB7CiAJaW50IG1hc2sgPSAwOwogCi0JaWYgKG9wZW5mbGFncyAmIEZNT0RFX1JFQUQpCisJaWYgKChvcGVuZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fV1JPTkxZKQogCQltYXNrIHw9IE1BWV9SRUFEOwotCWlmIChvcGVuZmxhZ3MgJiBGTU9ERV9XUklURSkKKwlpZiAoKG9wZW5mbGFncyAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFkpCiAJCW1hc2sgfD0gTUFZX1dSSVRFOwotCWlmIChvcGVuZmxhZ3MgJiBGTU9ERV9FWEVDKQorCWlmIChvcGVuZmxhZ3MgJiBfX0ZNT0RFX0VYRUMpCiAJCW1hc2sgfD0gTUFZX0VYRUM7CiAJcmV0dXJuIG1hc2s7CiB9CkBAIC0yMjczLDEyICsyMjgyLDEyIEBACiAJcmV0dXJuIG5mc19kb19hY2Nlc3MoaW5vZGUsIGNyZWQsIG5mc19vcGVuX3Blcm1pc3Npb25fbWFzayhvcGVuZmxhZ3MpKTsKIH0KIAotaW50IG5mc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitpbnQgbmZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCiB7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkOwogCWludCByZXMgPSAwOwogCi0JaWYgKGZsYWdzICYgSVBFUk1fRkxBR19SQ1UpCisJaWYgKG1hc2sgJiBNQVlfTk9UX0JMT0NLKQogCQlyZXR1cm4gLUVDSElMRDsKIAogCW5mc19pbmNfc3RhdHMoaW5vZGUsIE5GU0lPU19WRlNBQ0NFU1MpOwpAQCAtMjMyOCw3ICsyMzM3LDcgQEAKIG91dF9ub3RzdXA6CiAJcmVzID0gbmZzX3JldmFsaWRhdGVfaW5vZGUoTkZTX1NFUlZFUihpbm9kZSksIGlub2RlKTsKIAlpZiAocmVzID09IDApCi0JCXJlcyA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgZmxhZ3MsIE5VTEwpOworCQlyZXMgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2spOwogCWdvdG8gb3V0OwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnMvZGlyZWN0LmMgYi9mcy9uZnMvZGlyZWN0LmMKaW5kZXggOGVlYTI1My4uYjM1ZDI1YiAxMDA2NDQKLS0tIGEvZnMvbmZzL2RpcmVjdC5jCisrKyBiL2ZzL25mcy9kaXJlY3QuYwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJCQkJCQlsb2ZmX3QgcG9zKQogewogCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHggPSBkcmVxLT5jdHg7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGN0eC0+cGF0aC5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGN0eC0+ZGVudHJ5LT5kX2lub2RlOwogCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW92LT5pb3ZfYmFzZTsKIAlzaXplX3QgY291bnQgPSBpb3YtPmlvdl9sZW47CiAJc2l6ZV90IHJzaXplID0gTkZTX1NFUlZFUihpbm9kZSktPnJzaXplOwpAQCAtNzE1LDcgKzcxNSw3IEBACiAJCQkJCQkgbG9mZl90IHBvcywgaW50IHN5bmMpCiB7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9IGRyZXEtPmN0eDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gY3R4LT5wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gY3R4LT5kZW50cnktPmRfaW5vZGU7CiAJdW5zaWduZWQgbG9uZyB1c2VyX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3YtPmlvdl9iYXNlOwogCXNpemVfdCBjb3VudCA9IGlvdi0+aW92X2xlbjsKIAlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2s7CmRpZmYgLS1naXQgYS9mcy9uZnMvZmlsZS5jIGIvZnMvbmZzL2ZpbGUuYwppbmRleCAyZjA5M2VkLi4yOGI4YzNmIDEwMDY0NAotLS0gYS9mcy9uZnMvZmlsZS5jCisrKyBiL2ZzL25mcy9maWxlLmMKQEAgLTU1LDcgKzU1LDcgQEAKIHN0YXRpYyBzc2l6ZV90IG5mc19maWxlX3dyaXRlKHN0cnVjdCBraW9jYiAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpOwogc3RhdGljIGludCAgbmZzX2ZpbGVfZmx1c2goc3RydWN0IGZpbGUgKiwgZmxfb3duZXJfdCBpZCk7Ci1zdGF0aWMgaW50ICBuZnNfZmlsZV9mc3luYyhzdHJ1Y3QgZmlsZSAqLCBpbnQgZGF0YXN5bmMpOworc3RhdGljIGludCAgbmZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBsb2ZmX3QsIGludCBkYXRhc3luYyk7CiBzdGF0aWMgaW50IG5mc19jaGVja19mbGFncyhpbnQgZmxhZ3MpOwogc3RhdGljIGludCBuZnNfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpOwogc3RhdGljIGludCBuZnNfZmxvY2soc3RydWN0IGZpbGUgKmZpbHAsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKTsKQEAgLTE4Nyw4ICsxODcsMTEgQEAKIAkJCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLAogCQkJb2Zmc2V0LCBvcmlnaW4pOwogCi0JLyogb3JpZ2luID09IFNFRUtfRU5EID0+IHdlIG11c3QgcmV2YWxpZGF0ZSB0aGUgY2FjaGVkIGZpbGUgbGVuZ3RoICovCi0JaWYgKG9yaWdpbiA9PSBTRUVLX0VORCkgeworCS8qCisJICogb3JpZ2luID09IFNFRUtfRU5EIHx8IFNFRUtfREFUQSB8fCBTRUVLX0hPTEUgPT4gd2UgbXVzdCByZXZhbGlkYXRlCisJICogdGhlIGNhY2hlZCBmaWxlIGxlbmd0aAorCSAqLworCWlmIChvcmlnaW4gIT0gU0VFS19TRVQgfHwgb3JpZ2luICE9IFNFRUtfQ1VSKSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX21hcHBpbmctPmhvc3Q7CiAKIAkJaW50IHJldHZhbCA9IG5mc19yZXZhbGlkYXRlX2ZpbGVfc2l6ZShpbm9kZSwgZmlscCk7CkBAIC0zMDUsNyArMzA4LDcgQEAKICAqIGZhbGwgYmFjayB0byBkb2luZyBhIHN5bmNocm9ub3VzIHdyaXRlLgogICovCiBzdGF0aWMgaW50Ci1uZnNfZmlsZV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQorbmZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9IG5mc19maWxlX29wZW5fY29udGV4dChmaWxlKTsKQEAgLTMxMywxMSArMzE2LDE1IEBACiAJaW50IGhhdmVfZXJyb3IsIHN0YXR1czsKIAlpbnQgcmV0ID0gMDsKIAotCiAJZHByaW50aygiTkZTOiBmc3luYyBmaWxlKCVzLyVzKSBkYXRhc3luYyAlZFxuIiwKIAkJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLAogCQkJZGF0YXN5bmMpOwogCisJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwogCW5mc19pbmNfc3RhdHMoaW5vZGUsIE5GU0lPU19WRlNGU1lOQyk7CiAJaGF2ZV9lcnJvciA9IHRlc3RfYW5kX2NsZWFyX2JpdChORlNfQ09OVEVYVF9FUlJPUl9XUklURSwgJmN0eC0+ZmxhZ3MpOwogCXN0YXR1cyA9IG5mc19jb21taXRfaW5vZGUoaW5vZGUsIEZMVVNIX1NZTkMpOwpAQCAtMzI5LDYgKzMzNiw3IEBACiAJaWYgKCFyZXQgJiYgIWRhdGFzeW5jKQogCQkvKiBhcHBsaWNhdGlvbiBoYXMgYXNrZWQgZm9yIG1ldGEtZGF0YSBzeW5jICovCiAJCXJldCA9IHBuZnNfbGF5b3V0Y29tbWl0X2lub2RlKGlub2RlLCB0cnVlKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnMvZnNjYWNoZS5jIGIvZnMvbmZzL2ZzY2FjaGUuYwppbmRleCBjZTE1M2E2Li40MTkxMTljIDEwMDY0NAotLS0gYS9mcy9uZnMvZnNjYWNoZS5jCisrKyBiL2ZzL25mcy9mc2NhY2hlLmMKQEAgLTI1OSwxMiArMjU5LDEwIEBACiAJCWRmcHJpbnRrKEZTQ0FDSEUsCiAJCQkgIk5GUzogbmZzaSAweCVwIHR1cm5pbmcgY2FjaGUgb2ZmXG4iLCBORlNfSShpbm9kZSkpOwogCi0JCS8qIE5lZWQgdG8gaW52YWxpZGF0ZSBhbnkgbWFwcGVkIHBhZ2VzIHRoYXQgd2VyZSByZWFkIGluIGJlZm9yZQotCQkgKiB0dXJuaW5nIG9mZiB0aGUgY2FjaGUuCisJCS8qIE5lZWQgdG8gdW5jYWNoZSBhbnkgcGFnZXMgYXR0YWNoZWQgdG8gdGhpcyBpbm9kZSB0aGF0CisJCSAqIGZzY2FjaGUga25vd3MgYWJvdXQgYmVmb3JlIHR1cm5pbmcgb2ZmIHRoZSBjYWNoZS4KIAkJICovCi0JCWlmIChpbm9kZS0+aV9tYXBwaW5nICYmIGlub2RlLT5pX21hcHBpbmctPm5ycGFnZXMpCi0JCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMihpbm9kZS0+aV9tYXBwaW5nKTsKLQorCQlmc2NhY2hlX3VuY2FjaGVfYWxsX2lub2RlX3BhZ2VzKE5GU19JKGlub2RlKS0+ZnNjYWNoZSwgaW5vZGUpOwogCQluZnNfZnNjYWNoZV96YXBfaW5vZGVfY29va2llKGlub2RlKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvaWRtYXAuYyBiL2ZzL25mcy9pZG1hcC5jCmluZGV4IDc5NjY0YTEuLmYyMDgwMWEgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pZG1hcC5jCisrKyBiL2ZzL25mcy9pZG1hcC5jCkBAIC0zNiw2ICszNiw4IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2lkbWFwLmg+CiAKIHN0YXRpYyBpbnQgbmZzX21hcF9zdHJpbmdfdG9fbnVtZXJpYyhjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwgX191MzIgKnJlcykKIHsKQEAgLTU5LDEyICs2MSwxMCBAQAogCiAjaWZkZWYgQ09ORklHX05GU19VU0VfTkVXX0lETUFQUEVSCiAKLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY3JlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfZnNfc2IuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNfaWRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9rZXljdGwuaD4KICNpbmNsdWRlIDxsaW51eC9rZXktdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CkBAIC0yODQsMTggKzI4NCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9ycGNfcGlwZV9mcy5oPgogCiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZnNfaWRtYXAuaD4KICNpbmNsdWRlICJuZnM0X2ZzLmgiCiAKICNkZWZpbmUgSURNQVBfSEFTSF9TWiAgICAgICAgICAxMjgKZGlmZiAtLWdpdCBhL2ZzL25mcy9pbm9kZS5jIGIvZnMvbmZzL2lub2RlLmMKaW5kZXggMTQ0ZjJhMy4uZmUxMjAzNyAxMDA2NDQKLS0tIGEvZnMvbmZzL2lub2RlLmMKKysrIGIvZnMvbmZzL2lub2RlLmMKQEAgLTI1Niw3ICsyNTYsOCBAQAogCiAJbmZzX2F0dHJfY2hlY2tfbW91bnRwb2ludChzYiwgZmF0dHIpOwogCi0JaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9GSUxFSUQpID09IDAgJiYgKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX01PVU5UUE9JTlQpID09IDApCisJaWYgKCgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfRklMRUlEKSA9PSAwKSAmJgorCSAgICAhbmZzX2F0dHJfdXNlX21vdW50ZWRfb25fZmlsZWlkKGZhdHRyKSkKIAkJZ290byBvdXRfbm9faW5vZGU7CiAJaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9UWVBFKSA9PSAwKQogCQlnb3RvIG91dF9ub19pbm9kZTsKQEAgLTU2Niw3ICs1NjcsNyBAQAogc3RydWN0IG5mc19sb2NrX2NvbnRleHQgKm5mc19nZXRfbG9ja19jb250ZXh0KHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpCiB7CiAJc3RydWN0IG5mc19sb2NrX2NvbnRleHQgKnJlcywgKm5ldyA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGN0eC0+cGF0aC5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGN0eC0+ZGVudHJ5LT5kX2lub2RlOwogCiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAlyZXMgPSBfX25mc19maW5kX2xvY2tfY29udGV4dChjdHgpOwpAQCAtNTkzLDcgKzU5NCw3IEBACiB2b2lkIG5mc19wdXRfbG9ja19jb250ZXh0KHN0cnVjdCBuZnNfbG9ja19jb250ZXh0ICpsX2N0eCkKIHsKIAlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4ID0gbF9jdHgtPm9wZW5fY29udGV4dDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gY3R4LT5wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gY3R4LT5kZW50cnktPmRfaW5vZGU7CiAKIAlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJmxfY3R4LT5jb3VudCwgJmlub2RlLT5pX2xvY2spKQogCQlyZXR1cm47CkBAIC02MTksNyArNjIwLDcgQEAKIAkJcmV0dXJuOwogCWlmICghaXNfc3luYykKIAkJcmV0dXJuOwotCWlub2RlID0gY3R4LT5wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGN0eC0+ZGVudHJ5LT5kX2lub2RlOwogCWlmICghbGlzdF9lbXB0eSgmTkZTX0koaW5vZGUpLT5vcGVuX2ZpbGVzKSkKIAkJcmV0dXJuOwogCXNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOwpAQCAtNjI4LDE0ICs2MjksMTQgQEAKIAluZnNfcmV2YWxpZGF0ZV9pbm9kZShzZXJ2ZXIsIGlub2RlKTsKIH0KIAotc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmFsbG9jX25mc19vcGVuX2NvbnRleHQoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgZm1vZGVfdCBmX21vZGUpCitzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqYWxsb2NfbmZzX29wZW5fY29udGV4dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgZm1vZGVfdCBmX21vZGUpCiB7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eDsKIAogCWN0eCA9IGttYWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoY3R4ICE9IE5VTEwpIHsKLQkJY3R4LT5wYXRoID0gKnBhdGg7Ci0JCXBhdGhfZ2V0KCZjdHgtPnBhdGgpOworCQluZnNfc2JfYWN0aXZlKGRlbnRyeS0+ZF9zYik7CisJCWN0eC0+ZGVudHJ5ID0gZGdldChkZW50cnkpOwogCQljdHgtPmNyZWQgPSBnZXRfcnBjY3JlZChjcmVkKTsKIAkJY3R4LT5zdGF0ZSA9IE5VTEw7CiAJCWN0eC0+bW9kZSA9IGZfbW9kZTsKQEAgLTY1Nyw3ICs2NTgsOCBAQAogCiBzdGF0aWMgdm9pZCBfX3B1dF9uZnNfb3Blbl9jb250ZXh0KHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsIGludCBpc19zeW5jKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBjdHgtPnBhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBjdHgtPmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gY3R4LT5kZW50cnktPmRfc2I7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmN0eC0+bGlzdCkpIHsKIAkJaWYgKCFhdG9taWNfZGVjX2FuZF9sb2NrKCZjdHgtPmxvY2tfY29udGV4dC5jb3VudCwgJmlub2RlLT5pX2xvY2spKQpAQCAtNjcwLDcgKzY3Miw4IEBACiAJCU5GU19QUk9UTyhpbm9kZSktPmNsb3NlX2NvbnRleHQoY3R4LCBpc19zeW5jKTsKIAlpZiAoY3R4LT5jcmVkICE9IE5VTEwpCiAJCXB1dF9ycGNjcmVkKGN0eC0+Y3JlZCk7Ci0JcGF0aF9wdXQoJmN0eC0+cGF0aCk7CisJZHB1dChjdHgtPmRlbnRyeSk7CisJbmZzX3NiX2RlYWN0aXZlKHNiKTsKIAlrZnJlZShjdHgpOwogfQogCkBAIC03NDAsNyArNzQzLDcgQEAKIAljcmVkID0gcnBjX2xvb2t1cF9jcmVkKCk7CiAJaWYgKElTX0VSUihjcmVkKSkKIAkJcmV0dXJuIFBUUl9FUlIoY3JlZCk7Ci0JY3R4ID0gYWxsb2NfbmZzX29wZW5fY29udGV4dCgmZmlscC0+Zl9wYXRoLCBjcmVkLCBmaWxwLT5mX21vZGUpOworCWN0eCA9IGFsbG9jX25mc19vcGVuX2NvbnRleHQoZmlscC0+Zl9wYXRoLmRlbnRyeSwgY3JlZCwgZmlscC0+Zl9tb2RlKTsKIAlwdXRfcnBjY3JlZChjcmVkKTsKIAlpZiAoY3R4ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTI5NCw3ICsxMjk3LDggQEAKIAkJaWYgKG5ld19pc2l6ZSAhPSBjdXJfaXNpemUpIHsKIAkJCS8qIERvIHdlIHBlcmhhcHMgaGF2ZSBhbnkgb3V0c3RhbmRpbmcgd3JpdGVzLCBvciBoYXMKIAkJCSAqIHRoZSBmaWxlIGdyb3duIGJleW9uZCBvdXIgbGFzdCB3cml0ZT8gKi8KLQkJCWlmIChuZnNpLT5ucGFnZXMgPT0gMCB8fCBuZXdfaXNpemUgPiBjdXJfaXNpemUpIHsKKwkJCWlmICgobmZzaS0+bnBhZ2VzID09IDAgJiYgIXRlc3RfYml0KE5GU19JTk9fTEFZT1VUQ09NTUlULCAmbmZzaS0+ZmxhZ3MpKSB8fAorCQkJICAgICBuZXdfaXNpemUgPiBjdXJfaXNpemUpIHsKIAkJCQlpX3NpemVfd3JpdGUoaW5vZGUsIG5ld19pc2l6ZSk7CiAJCQkJaW52YWxpZCB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQTsKIAkJCX0KZGlmZiAtLWdpdCBhL2ZzL25mcy9pbnRlcm5hbC5oIGIvZnMvbmZzL2ludGVybmFsLmgKaW5kZXggYjkwNTZjYi4uMmE1NTM0NyAxMDA2NDQKLS0tIGEvZnMvbmZzL2ludGVybmFsLmgKKysrIGIvZnMvbmZzL2ludGVybmFsLmgKQEAgLTQ1LDYgKzQ1LDE3IEBACiAJCWZhdHRyLT52YWxpZCB8PSBORlNfQVRUUl9GQVRUUl9NT1VOVFBPSU5UOwogfQogCitzdGF0aWMgaW5saW5lIGludCBuZnNfYXR0cl91c2VfbW91bnRlZF9vbl9maWxlaWQoc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJaWYgKCgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfTU9VTlRFRF9PTl9GSUxFSUQpID09IDApIHx8CisJICAgICgoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX01PVU5UUE9JTlQpID09IDApICYmCisJICAgICAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1Y0X1JFRkVSUkFMKSA9PSAwKSkpCisJCXJldHVybiAwOworCisJZmF0dHItPmZpbGVpZCA9IGZhdHRyLT5tb3VudGVkX29uX2ZpbGVpZDsKKwlyZXR1cm4gMTsKK30KKwogc3RydWN0IG5mc19jbG9uZV9tb3VudCB7CiAJY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAljb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzM2FjbC5jIGIvZnMvbmZzL25mczNhY2wuYwppbmRleCAyNzQzNDI3Li5lNDllNzMxIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzM2FjbC5jCisrKyBiL2ZzL25mcy9uZnMzYWNsLmMKQEAgLTQyNywxNiArNDI3LDEyIEBACiAJfQogCWlmICghZGZhY2wpCiAJCXJldHVybiAwOwotCWFjbCA9IHBvc2l4X2FjbF9jbG9uZShkZmFjbCwgR0ZQX0tFUk5FTCk7Ci0JZXJyb3IgPSAtRU5PTUVNOwotCWlmICghYWNsKQotCQlnb3RvIG91dF9yZWxlYXNlX2RmYWNsOwotCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZV9tYXNxKGFjbCwgJm1vZGUpOworCWFjbCA9IHBvc2l4X2FjbF9kdXAoZGZhY2wpOworCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfS0VSTkVMLCAmbW9kZSk7CiAJaWYgKGVycm9yIDwgMCkKLQkJZ290byBvdXRfcmVsZWFzZV9hY2w7CisJCWdvdG8gb3V0X3JlbGVhc2VfZGZhY2w7CiAJZXJyb3IgPSBuZnMzX3Byb2Nfc2V0YWNscyhpbm9kZSwgYWNsLCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8KIAkJCQkJCSAgICAgIGRmYWNsIDogTlVMTCk7Ci1vdXRfcmVsZWFzZV9hY2w6CiAJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKIG91dF9yZWxlYXNlX2RmYWNsOgogCXBvc2l4X2FjbF9yZWxlYXNlKGRmYWNsKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0X2ZzLmggYi9mcy9uZnMvbmZzNF9mcy5oCmluZGV4IGM0YTY5ODMuLmI3ODhmMmUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0X2ZzLmgKKysrIGIvZnMvbmZzL25mczRfZnMuaApAQCAtMjM4LDcgKzIzOCw3IEBACiBleHRlcm4gaW50IG5mczRfcHJvY19yZW5ldyhzdHJ1Y3QgbmZzX2NsaWVudCAqLCBzdHJ1Y3QgcnBjX2NyZWQgKik7CiBleHRlcm4gaW50IG5mczRfaW5pdF9jbGllbnRpZChzdHJ1Y3QgbmZzX2NsaWVudCAqLCBzdHJ1Y3QgcnBjX2NyZWQgKik7CiBleHRlcm4gaW50IG5mczQxX2luaXRfY2xpZW50aWQoc3RydWN0IG5mc19jbGllbnQgKiwgc3RydWN0IHJwY19jcmVkICopOwotZXh0ZXJuIGludCBuZnM0X2RvX2Nsb3NlKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGdmcF90IGdmcF9tYXNrLCBpbnQgd2FpdCwgYm9vbCByb2MpOworZXh0ZXJuIGludCBuZnM0X2RvX2Nsb3NlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZ2ZwX3QgZ2ZwX21hc2ssIGludCB3YWl0LCBib29sIHJvYyk7CiBleHRlcm4gaW50IG5mczRfc2VydmVyX2NhcGFiaWxpdGllcyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKTsKIGV4dGVybiBpbnQgbmZzNF9wcm9jX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCiAJCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqZnNfbG9jYXRpb25zLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CkBAIC0zNDEsOCArMzQxLDggQEAKIGV4dGVybiB2b2lkIG5mczRfcHV0X3N0YXRlX293bmVyKHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICopOwogZXh0ZXJuIHN0cnVjdCBuZnM0X3N0YXRlICogbmZzNF9nZXRfb3Blbl9zdGF0ZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKik7CiBleHRlcm4gdm9pZCBuZnM0X3B1dF9vcGVuX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICopOwotZXh0ZXJuIHZvaWQgbmZzNF9jbG9zZV9zdGF0ZShzdHJ1Y3QgcGF0aCAqLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqLCBmbW9kZV90KTsKLWV4dGVybiB2b2lkIG5mczRfY2xvc2Vfc3luYyhzdHJ1Y3QgcGF0aCAqLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqLCBmbW9kZV90KTsKK2V4dGVybiB2b2lkIG5mczRfY2xvc2Vfc3RhdGUoc3RydWN0IG5mczRfc3RhdGUgKiwgZm1vZGVfdCk7CitleHRlcm4gdm9pZCBuZnM0X2Nsb3NlX3N5bmMoc3RydWN0IG5mczRfc3RhdGUgKiwgZm1vZGVfdCk7CiBleHRlcm4gdm9pZCBuZnM0X3N0YXRlX3NldF9tb2RlX2xvY2tlZChzdHJ1Y3QgbmZzNF9zdGF0ZSAqLCBmbW9kZV90KTsKIGV4dGVybiB2b2lkIG5mczRfc2NoZWR1bGVfbGVhc2VfcmVjb3Zlcnkoc3RydWN0IG5mc19jbGllbnQgKik7CiBleHRlcm4gdm9pZCBuZnM0X3NjaGVkdWxlX3N0YXRlX21hbmFnZXIoc3RydWN0IG5mc19jbGllbnQgKik7CkBAIC0zNzMsOCArMzczLDggQEAKIAogI2Vsc2UKIAotI2RlZmluZSBuZnM0X2Nsb3NlX3N0YXRlKGEsIGIsIGMpIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbmZzNF9jbG9zZV9zeW5jKGEsIGIsIGMpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbmZzNF9jbG9zZV9zdGF0ZShhLCBiKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIG5mczRfY2xvc2Vfc3luYyhhLCBiKSBkbyB7IH0gd2hpbGUgKDApCiAKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0ICovCiAjZW5kaWYgLyogX19MSU5VWF9GU19ORlNfTkZTNF9GUy5IICovCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYyBiL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCmluZGV4IDQyNjkwODguLmY5ZDAzYWIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCisrKyBiL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCkBAIC0zMCw2ICszMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19wYWdlLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIm5mczRmaWxlbGF5b3V0LmgiCkBAIC0zOTcsNyArMzk4LDYgQEAKIAkgKiB0aGlzIG9mZnNldCBhbmQgc2F2ZSB0aGUgb3JpZ2luYWwgb2Zmc2V0LgogCSAqLwogCWRhdGEtPmFyZ3Mub2Zmc2V0ID0gZmlsZWxheW91dF9nZXRfZHNlcnZlcl9vZmZzZXQobHNlZywgb2Zmc2V0KTsKLQlkYXRhLT5tZHNfb2Zmc2V0ID0gb2Zmc2V0OwogCiAJLyogUGVyZm9ybSBhbiBhc3luY2hyb25vdXMgd3JpdGUgKi8KIAlzdGF0dXMgPSBuZnNfaW5pdGlhdGVfd3JpdGUoZGF0YSwgZHMtPmRzX2NscC0+Y2xfcnBjY2xpZW50LApAQCAtNTUyLDEzICs1NTIsMTggQEAKIAkJX19mdW5jX18sIG5mbF91dGlsLCBmbC0+bnVtX2ZoLCBmbC0+Zmlyc3Rfc3RyaXBlX2luZGV4LAogCQlmbC0+cGF0dGVybl9vZmZzZXQpOwogCi0JaWYgKCFmbC0+bnVtX2ZoKQorCS8qIE5vdGUgdGhhdCBhIHplcm8gdmFsdWUgZm9yIG51bV9maCBpcyBsZWdhbCBmb3IgU1RSSVBFX1NQQVJTRS4KKwkgKiBGdXRoZXIgY2hlY2tpbmcgaXMgZG9uZSBpbiBmaWxlbGF5b3V0X2NoZWNrX2xheW91dCAqLworCWlmIChmbC0+bnVtX2ZoIDwgMCB8fCBmbC0+bnVtX2ZoID4KKwkgICAgbWF4KE5GUzRfUE5GU19NQVhfU1RSSVBFX0NOVCwgTkZTNF9QTkZTX01BWF9NVUxUSV9DTlQpKQogCQlnb3RvIG91dF9lcnI7CiAKLQlmbC0+ZmhfYXJyYXkgPSBremFsbG9jKGZsLT5udW1fZmggKiBzaXplb2Yoc3RydWN0IG5mc19maCAqKSwKLQkJCSAgICAgICBnZnBfZmxhZ3MpOwotCWlmICghZmwtPmZoX2FycmF5KQotCQlnb3RvIG91dF9lcnI7CisJaWYgKGZsLT5udW1fZmggPiAwKSB7CisJCWZsLT5maF9hcnJheSA9IGt6YWxsb2MoZmwtPm51bV9maCAqIHNpemVvZihzdHJ1Y3QgbmZzX2ZoICopLAorCQkJCSAgICAgICBnZnBfZmxhZ3MpOworCQlpZiAoIWZsLT5maF9hcnJheSkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgZmwtPm51bV9maDsgaSsrKSB7CiAJCS8qIERvIHdlIHdhbnQgdG8gdXNlIGEgbWVtcG9vbCBoZXJlPyAqLwpAQCAtNjYxLDggKzY2Niw5IEBACiAJdTY0IHBfc3RyaXBlLCByX3N0cmlwZTsKIAl1MzIgc3RyaXBlX3VuaXQ7CiAKLQlpZiAoIXBuZnNfZ2VuZXJpY19wZ190ZXN0KHBnaW8sIHByZXYsIHJlcSkpCi0JCXJldHVybiAwOworCWlmICghcG5mc19nZW5lcmljX3BnX3Rlc3QocGdpbywgcHJldiwgcmVxKSB8fAorCSAgICAhbmZzX2dlbmVyaWNfcGdfdGVzdChwZ2lvLCBwcmV2LCByZXEpKQorCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAoIXBnaW8tPnBnX2xzZWcpCiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRwcm9jLmMgYi9mcy9uZnMvbmZzNHByb2MuYwppbmRleCBkMmM0YjU5Li4yNmJlY2U4IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHByb2MuYworKysgYi9mcy9uZnMvbmZzNHByb2MuYwpAQCAtNzYzLDggKzc2Myw4IEBACiAJc3RydWN0IG5mc19vcGVuX2NvbmZpcm1yZXMgY19yZXM7CiAJc3RydWN0IG5mc19mYXR0ciBmX2F0dHI7CiAJc3RydWN0IG5mc19mYXR0ciBkaXJfYXR0cjsKLQlzdHJ1Y3QgcGF0aCBwYXRoOwogCXN0cnVjdCBkZW50cnkgKmRpcjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKm93bmVyOwogCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKIAlzdHJ1Y3QgaWF0dHIgYXR0cnM7CkBAIC03ODYsMTIgKzc4NiwxMiBAQAogCW5mc19mYXR0cl9pbml0KCZwLT5kaXJfYXR0cik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmZzNF9vcGVuZGF0YSAqbmZzNF9vcGVuZGF0YV9hbGxvYyhzdHJ1Y3QgcGF0aCAqcGF0aCwKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9vcGVuZGF0YSAqbmZzNF9vcGVuZGF0YV9hbGxvYyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCwgZm1vZGVfdCBmbW9kZSwgaW50IGZsYWdzLAogCQljb25zdCBzdHJ1Y3QgaWF0dHIgKmF0dHJzLAogCQlnZnBfdCBnZnBfbWFzaykKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZ2V0X3BhcmVudChwYXRoLT5kZW50cnkpOworCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7CiAJc3RydWN0IGlub2RlICpkaXIgPSBwYXJlbnQtPmRfaW5vZGU7CiAJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoZGlyKTsKIAlzdHJ1Y3QgbmZzNF9vcGVuZGF0YSAqcDsKQEAgLTgwMiw4ICs4MDIsOCBAQAogCXAtPm9fYXJnLnNlcWlkID0gbmZzX2FsbG9jX3NlcWlkKCZzcC0+c29fc2VxaWQsIGdmcF9tYXNrKTsKIAlpZiAocC0+b19hcmcuc2VxaWQgPT0gTlVMTCkKIAkJZ290byBlcnJfZnJlZTsKLQlwYXRoX2dldChwYXRoKTsKLQlwLT5wYXRoID0gKnBhdGg7CisJbmZzX3NiX2FjdGl2ZShkZW50cnktPmRfc2IpOworCXAtPmRlbnRyeSA9IGRnZXQoZGVudHJ5KTsKIAlwLT5kaXIgPSBwYXJlbnQ7CiAJcC0+b3duZXIgPSBzcDsKIAlhdG9taWNfaW5jKCZzcC0+c29fY291bnQpOwpAQCAtODEyLDcgKzgxMiw3IEBACiAJcC0+b19hcmcuZm1vZGUgPSBmbW9kZSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKIAlwLT5vX2FyZy5jbGllbnRpZCA9IHNlcnZlci0+bmZzX2NsaWVudC0+Y2xfY2xpZW50aWQ7CiAJcC0+b19hcmcuaWQgPSBzcC0+c29fb3duZXJfaWQuaWQ7Ci0JcC0+b19hcmcubmFtZSA9ICZwLT5wYXRoLmRlbnRyeS0+ZF9uYW1lOworCXAtPm9fYXJnLm5hbWUgPSAmZGVudHJ5LT5kX25hbWU7CiAJcC0+b19hcmcuc2VydmVyID0gc2VydmVyOwogCXAtPm9fYXJnLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzazsKIAlwLT5vX2FyZy5jbGFpbSA9IE5GUzRfT1BFTl9DTEFJTV9OVUxMOwpAQCAtODQyLDEzICs4NDIsMTUgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9vcGVuZGF0YSAqcCA9IGNvbnRhaW5lcl9vZihrcmVmLAogCQkJc3RydWN0IG5mczRfb3BlbmRhdGEsIGtyZWYpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBwLT5kZW50cnktPmRfc2I7CiAKIAluZnNfZnJlZV9zZXFpZChwLT5vX2FyZy5zZXFpZCk7CiAJaWYgKHAtPnN0YXRlICE9IE5VTEwpCiAJCW5mczRfcHV0X29wZW5fc3RhdGUocC0+c3RhdGUpOwogCW5mczRfcHV0X3N0YXRlX293bmVyKHAtPm93bmVyKTsKIAlkcHV0KHAtPmRpcik7Ci0JcGF0aF9wdXQoJnAtPnBhdGgpOworCWRwdXQocC0+ZGVudHJ5KTsKKwluZnNfc2JfZGVhY3RpdmUoc2IpOwogCWtmcmVlKHApOwogfQogCkBAIC0xMTMwLDcgKzExMzIsNyBAQAogewogCXN0cnVjdCBuZnM0X29wZW5kYXRhICpvcGVuZGF0YTsKIAotCW9wZW5kYXRhID0gbmZzNF9vcGVuZGF0YV9hbGxvYygmY3R4LT5wYXRoLCBzdGF0ZS0+b3duZXIsIDAsIDAsIE5VTEwsIEdGUF9OT0ZTKTsKKwlvcGVuZGF0YSA9IG5mczRfb3BlbmRhdGFfYWxsb2MoY3R4LT5kZW50cnksIHN0YXRlLT5vd25lciwgMCwgMCwgTlVMTCwgR0ZQX05PRlMpOwogCWlmIChvcGVuZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAlvcGVuZGF0YS0+c3RhdGUgPSBzdGF0ZTsKQEAgLTExNTQsNyArMTE1Niw3IEBACiAJbmV3c3RhdGUgPSBuZnM0X29wZW5kYXRhX3RvX25mczRfc3RhdGUob3BlbmRhdGEpOwogCWlmIChJU19FUlIobmV3c3RhdGUpKQogCQlyZXR1cm4gUFRSX0VSUihuZXdzdGF0ZSk7Ci0JbmZzNF9jbG9zZV9zdGF0ZSgmb3BlbmRhdGEtPnBhdGgsIG5ld3N0YXRlLCBmbW9kZSk7CisJbmZzNF9jbG9zZV9zdGF0ZShuZXdzdGF0ZSwgZm1vZGUpOwogCSpyZXMgPSBuZXdzdGF0ZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEzNTIsNyArMTM1NCw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJc3RhdGUgPSBuZnM0X29wZW5kYXRhX3RvX25mczRfc3RhdGUoZGF0YSk7CiAJaWYgKCFJU19FUlIoc3RhdGUpKQotCQluZnM0X2Nsb3NlX3N0YXRlKCZkYXRhLT5wYXRoLCBzdGF0ZSwgZGF0YS0+b19hcmcuZm1vZGUpOworCQluZnM0X2Nsb3NlX3N0YXRlKHN0YXRlLCBkYXRhLT5vX2FyZy5mbW9kZSk7CiBvdXRfZnJlZToKIAluZnM0X29wZW5kYXRhX3B1dChkYXRhKTsKIH0KQEAgLTE0OTcsNyArMTQ5OSw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJc3RhdGUgPSBuZnM0X29wZW5kYXRhX3RvX25mczRfc3RhdGUoZGF0YSk7CiAJaWYgKCFJU19FUlIoc3RhdGUpKQotCQluZnM0X2Nsb3NlX3N0YXRlKCZkYXRhLT5wYXRoLCBzdGF0ZSwgZGF0YS0+b19hcmcuZm1vZGUpOworCQluZnM0X2Nsb3NlX3N0YXRlKHN0YXRlLCBkYXRhLT5vX2FyZy5mbW9kZSk7CiBvdXRfZnJlZToKIAluZnM0X29wZW5kYXRhX3B1dChkYXRhKTsKIH0KQEAgLTE2NDgsNyArMTY1MCw3IEBACiAJCXJldHVybiBQVFJfRVJSKG9wZW5kYXRhKTsKIAlyZXQgPSBuZnM0X29wZW5fcmVjb3ZlcihvcGVuZGF0YSwgc3RhdGUpOwogCWlmIChyZXQgPT0gLUVTVEFMRSkKLQkJZF9kcm9wKGN0eC0+cGF0aC5kZW50cnkpOworCQlkX2Ryb3AoY3R4LT5kZW50cnkpOwogCW5mczRfb3BlbmRhdGFfcHV0KG9wZW5kYXRhKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTcwNiw3ICsxNzA4LDcgQEAKIC8qCiAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlZCBuZnM0X3N0YXRlCiAgKi8KLXN0YXRpYyBpbnQgX25mczRfZG9fb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHBhdGggKnBhdGgsIGZtb2RlX3QgZm1vZGUsIGludCBmbGFncywgc3RydWN0IGlhdHRyICpzYXR0ciwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqKnJlcykKK3N0YXRpYyBpbnQgX25mczRfZG9fb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBmbW9kZV90IGZtb2RlLCBpbnQgZmxhZ3MsIHN0cnVjdCBpYXR0ciAqc2F0dHIsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgc3RydWN0IG5mczRfc3RhdGUgKipyZXMpCiB7CiAJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgICpzcDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZSAgICAgKnN0YXRlID0gTlVMTDsKQEAgLTE3MjMsMTUgKzE3MjUsMTUgQEAKIAlzdGF0dXMgPSBuZnM0X3JlY292ZXJfZXhwaXJlZF9sZWFzZShzZXJ2ZXIpOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBlcnJfcHV0X3N0YXRlX293bmVyOwotCWlmIChwYXRoLT5kZW50cnktPmRfaW5vZGUgIT0gTlVMTCkKLQkJbmZzNF9yZXR1cm5faW5jb21wYXRpYmxlX2RlbGVnYXRpb24ocGF0aC0+ZGVudHJ5LT5kX2lub2RlLCBmbW9kZSk7CisJaWYgKGRlbnRyeS0+ZF9pbm9kZSAhPSBOVUxMKQorCQluZnM0X3JldHVybl9pbmNvbXBhdGlibGVfZGVsZWdhdGlvbihkZW50cnktPmRfaW5vZGUsIGZtb2RlKTsKIAlzdGF0dXMgPSAtRU5PTUVNOwotCW9wZW5kYXRhID0gbmZzNF9vcGVuZGF0YV9hbGxvYyhwYXRoLCBzcCwgZm1vZGUsIGZsYWdzLCBzYXR0ciwgR0ZQX0tFUk5FTCk7CisJb3BlbmRhdGEgPSBuZnM0X29wZW5kYXRhX2FsbG9jKGRlbnRyeSwgc3AsIGZtb2RlLCBmbGFncywgc2F0dHIsIEdGUF9LRVJORUwpOwogCWlmIChvcGVuZGF0YSA9PSBOVUxMKQogCQlnb3RvIGVycl9wdXRfc3RhdGVfb3duZXI7CiAKLQlpZiAocGF0aC0+ZGVudHJ5LT5kX2lub2RlICE9IE5VTEwpCi0JCW9wZW5kYXRhLT5zdGF0ZSA9IG5mczRfZ2V0X29wZW5fc3RhdGUocGF0aC0+ZGVudHJ5LT5kX2lub2RlLCBzcCk7CisJaWYgKGRlbnRyeS0+ZF9pbm9kZSAhPSBOVUxMKQorCQlvcGVuZGF0YS0+c3RhdGUgPSBuZnM0X2dldF9vcGVuX3N0YXRlKGRlbnRyeS0+ZF9pbm9kZSwgc3ApOwogCiAJc3RhdHVzID0gX25mczRfcHJvY19vcGVuKG9wZW5kYXRhKTsKIAlpZiAoc3RhdHVzICE9IDApCkBAIC0xNzY5LDE0ICsxNzcxLDE0IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlICpuZnM0X2RvX29wZW4oc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBwYXRoICpwYXRoLCBmbW9kZV90IGZtb2RlLCBpbnQgZmxhZ3MsIHN0cnVjdCBpYXR0ciAqc2F0dHIsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZSAqbmZzNF9kb19vcGVuKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGZtb2RlX3QgZm1vZGUsIGludCBmbGFncywgc3RydWN0IGlhdHRyICpzYXR0ciwgc3RydWN0IHJwY19jcmVkICpjcmVkKQogewogCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CiAJc3RydWN0IG5mczRfc3RhdGUgKnJlczsKIAlpbnQgc3RhdHVzOwogCiAJZG8gewotCQlzdGF0dXMgPSBfbmZzNF9kb19vcGVuKGRpciwgcGF0aCwgZm1vZGUsIGZsYWdzLCBzYXR0ciwgY3JlZCwgJnJlcyk7CisJCXN0YXR1cyA9IF9uZnM0X2RvX29wZW4oZGlyLCBkZW50cnksIGZtb2RlLCBmbGFncywgc2F0dHIsIGNyZWQsICZyZXMpOwogCQlpZiAoc3RhdHVzID09IDApCiAJCQlicmVhazsKIAkJLyogTk9URTogQkFEX1NFUUlEIG1lYW5zIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCBkaXNhZ3JlZSBhYm91dCB0aGUKQEAgLTE4NzMsNyArMTg3NSw2IEBACiB9CiAKIHN0cnVjdCBuZnM0X2Nsb3NlZGF0YSB7Ci0Jc3RydWN0IHBhdGggcGF0aDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKIAlzdHJ1Y3QgbmZzX2Nsb3NlYXJncyBhcmc7CkBAIC0xODg4LDEzICsxODg5LDE0IEBACiB7CiAJc3RydWN0IG5mczRfY2xvc2VkYXRhICpjYWxsZGF0YSA9IGRhdGE7CiAJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwID0gY2FsbGRhdGEtPnN0YXRlLT5vd25lcjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gY2FsbGRhdGEtPnN0YXRlLT5pbm9kZS0+aV9zYjsKIAogCWlmIChjYWxsZGF0YS0+cm9jKQogCQlwbmZzX3JvY19yZWxlYXNlKGNhbGxkYXRhLT5zdGF0ZS0+aW5vZGUpOwogCW5mczRfcHV0X29wZW5fc3RhdGUoY2FsbGRhdGEtPnN0YXRlKTsKIAluZnNfZnJlZV9zZXFpZChjYWxsZGF0YS0+YXJnLnNlcWlkKTsKIAluZnM0X3B1dF9zdGF0ZV9vd25lcihzcCk7Ci0JcGF0aF9wdXQoJmNhbGxkYXRhLT5wYXRoKTsKKwluZnNfc2JfZGVhY3RpdmUoc2IpOwogCWtmcmVlKGNhbGxkYXRhKTsKIH0KIApAQCAtMjAxNCw3ICsyMDE2LDcgQEAKICAqCiAgKiBOT1RFOiBDYWxsZXIgbXVzdCBiZSBob2xkaW5nIHRoZSBzcC0+c29fb3duZXIgc2VtYXBob3JlIQogICovCi1pbnQgbmZzNF9kb19jbG9zZShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBnZnBfdCBnZnBfbWFzaywgaW50IHdhaXQsIGJvb2wgcm9jKQoraW50IG5mczRfZG9fY2xvc2Uoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBnZnBfdCBnZnBfbWFzaywgaW50IHdhaXQsIGJvb2wgcm9jKQogewogCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKHN0YXRlLT5pbm9kZSk7CiAJc3RydWN0IG5mczRfY2xvc2VkYXRhICpjYWxsZGF0YTsKQEAgLTIwNTAsOCArMjA1Miw3IEBACiAJY2FsbGRhdGEtPnJlcy5zZXFpZCA9IGNhbGxkYXRhLT5hcmcuc2VxaWQ7CiAJY2FsbGRhdGEtPnJlcy5zZXJ2ZXIgPSBzZXJ2ZXI7CiAJY2FsbGRhdGEtPnJvYyA9IHJvYzsKLQlwYXRoX2dldChwYXRoKTsKLQljYWxsZGF0YS0+cGF0aCA9ICpwYXRoOworCW5mc19zYl9hY3RpdmUoY2FsbGRhdGEtPmlub2RlLT5pX3NiKTsKIAogCW1zZy5ycGNfYXJncCA9ICZjYWxsZGF0YS0+YXJnOwogCW1zZy5ycGNfcmVzcCA9ICZjYWxsZGF0YS0+cmVzOwpAQCAtMjA4MCw3ICsyMDgxLDcgQEAKIAlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CiAKIAkvKiBQcm90ZWN0IGFnYWluc3QgY29uY3VycmVudCBzaWxseWRlbGV0ZXMgKi8KLQlzdGF0ZSA9IG5mczRfZG9fb3BlbihkaXIsICZjdHgtPnBhdGgsIGN0eC0+bW9kZSwgb3Blbl9mbGFncywgYXR0ciwgY3R4LT5jcmVkKTsKKwlzdGF0ZSA9IG5mczRfZG9fb3BlbihkaXIsIGN0eC0+ZGVudHJ5LCBjdHgtPm1vZGUsIG9wZW5fZmxhZ3MsIGF0dHIsIGN0eC0+Y3JlZCk7CiAJaWYgKElTX0VSUihzdGF0ZSkpCiAJCXJldHVybiBFUlJfQ0FTVChzdGF0ZSk7CiAJY3R4LT5zdGF0ZSA9IHN0YXRlOwpAQCAtMjA5Miw5ICsyMDkzLDkgQEAKIAlpZiAoY3R4LT5zdGF0ZSA9PSBOVUxMKQogCQlyZXR1cm47CiAJaWYgKGlzX3N5bmMpCi0JCW5mczRfY2xvc2Vfc3luYygmY3R4LT5wYXRoLCBjdHgtPnN0YXRlLCBjdHgtPm1vZGUpOworCQluZnM0X2Nsb3NlX3N5bmMoY3R4LT5zdGF0ZSwgY3R4LT5tb2RlKTsKIAllbHNlCi0JCW5mczRfY2xvc2Vfc3RhdGUoJmN0eC0+cGF0aCwgY3R4LT5zdGF0ZSwgY3R4LT5tb2RlKTsKKwkJbmZzNF9jbG9zZV9zdGF0ZShjdHgtPnN0YXRlLCBjdHgtPm1vZGUpOwogfQogCiBzdGF0aWMgaW50IF9uZnM0X3NlcnZlcl9jYXBhYmlsaXRpZXMoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKQEAgLTIyNjUsMTIgKzIyNjYsMTQgQEAKIAlyZXR1cm4gbmZzNF9tYXBfZXJyb3JzKHN0YXR1cyk7CiB9CiAKK3N0YXRpYyB2b2lkIG5mc19maXh1cF9yZWZlcnJhbF9hdHRyaWJ1dGVzKHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKTsKIC8qCiAgKiBHZXQgbG9jYXRpb25zIGFuZCAobWF5YmUpIG90aGVyIGF0dHJpYnV0ZXMgb2YgYSByZWZlcnJhbC4KICAqIE5vdGUgdGhhdCB3ZSdsbCBhY3R1YWxseSBmb2xsb3cgdGhlIHJlZmVycmFsIGxhdGVyIHdoZW4KICAqIHdlIGRldGVjdCBmc2lkIG1pc21hdGNoIGluIGlub2RlIHJldmFsaWRhdGlvbgogICovCi1zdGF0aWMgaW50IG5mczRfZ2V0X3JlZmVycmFsKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCitzdGF0aWMgaW50IG5mczRfZ2V0X3JlZmVycmFsKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKKwkJCSAgICAgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCiB7CiAJaW50IHN0YXR1cyA9IC1FTk9NRU07CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwpAQCAtMjI4OCwxNSArMjI5MSwxNiBAQAogCQlnb3RvIG91dDsKIAkvKiBNYWtlIHN1cmUgc2VydmVyIHJldHVybmVkIGEgZGlmZmVyZW50IGZzaWQgZm9yIHRoZSByZWZlcnJhbCAqLwogCWlmIChuZnNfZnNpZF9lcXVhbCgmTkZTX1NFUlZFUihkaXIpLT5mc2lkLCAmbG9jYXRpb25zLT5mYXR0ci5mc2lkKSkgewotCQlkcHJpbnRrKCIlczogc2VydmVyIGRpZCBub3QgcmV0dXJuIGEgZGlmZmVyZW50IGZzaWQgZm9yIGEgcmVmZXJyYWwgYXQgJXNcbiIsIF9fZnVuY19fLCBuYW1lLT5uYW1lKTsKKwkJZHByaW50aygiJXM6IHNlcnZlciBkaWQgbm90IHJldHVybiBhIGRpZmZlcmVudCBmc2lkIGZvciIKKwkJCSIgYSByZWZlcnJhbCBhdCAlc1xuIiwgX19mdW5jX18sIG5hbWUtPm5hbWUpOwogCQlzdGF0dXMgPSAtRUlPOwogCQlnb3RvIG91dDsKIAl9CisJLyogRml4dXAgYXR0cmlidXRlcyBmb3IgdGhlIG5mc19sb29rdXAoKSBjYWxsIHRvIG5mc19maGdldCgpICovCisJbmZzX2ZpeHVwX3JlZmVycmFsX2F0dHJpYnV0ZXMoJmxvY2F0aW9ucy0+ZmF0dHIpOwogCisJLyogcmVwbGFjZSB0aGUgbG9va3VwIG5mc19mYXR0ciB3aXRoIHRoZSBsb2NhdGlvbnMgbmZzX2ZhdHRyICovCiAJbWVtY3B5KGZhdHRyLCAmbG9jYXRpb25zLT5mYXR0ciwgc2l6ZW9mKHN0cnVjdCBuZnNfZmF0dHIpKTsKLQlmYXR0ci0+dmFsaWQgfD0gTkZTX0FUVFJfRkFUVFJfVjRfUkVGRVJSQUw7Ci0JaWYgKCFmYXR0ci0+bW9kZSkKLQkJZmF0dHItPm1vZGUgPSBTX0lGRElSOwogCW1lbXNldChmaGFuZGxlLCAwLCBzaXplb2Yoc3RydWN0IG5mc19maCkpOwogb3V0OgogCWlmIChwYWdlKQpAQCAtMjYxMywxMCArMjYxNyw3IEBACiBuZnM0X3Byb2NfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqc2F0dHIsCiAgICAgICAgICAgICAgICAgIGludCBmbGFncywgc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCkKIHsKLQlzdHJ1Y3QgcGF0aCBteV9wYXRoID0gewotCQkuZGVudHJ5ID0gZGVudHJ5LAotCX07Ci0Jc3RydWN0IHBhdGggKnBhdGggPSAmbXlfcGF0aDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZSA9IGRlbnRyeTsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkID0gTlVMTDsKIAlmbW9kZV90IGZtb2RlID0gMDsKQEAgLTI2MjQsMTEgKzI2MjUsMTEgQEAKIAogCWlmIChjdHggIT0gTlVMTCkgewogCQljcmVkID0gY3R4LT5jcmVkOwotCQlwYXRoID0gJmN0eC0+cGF0aDsKKwkJZGUgPSBjdHgtPmRlbnRyeTsKIAkJZm1vZGUgPSBjdHgtPm1vZGU7CiAJfQogCXNhdHRyLT5pYV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7Ci0Jc3RhdGUgPSBuZnM0X2RvX29wZW4oZGlyLCBwYXRoLCBmbW9kZSwgZmxhZ3MsIHNhdHRyLCBjcmVkKTsKKwlzdGF0ZSA9IG5mczRfZG9fb3BlbihkaXIsIGRlLCBmbW9kZSwgZmxhZ3MsIHNhdHRyLCBjcmVkKTsKIAlkX2Ryb3AoZGVudHJ5KTsKIAlpZiAoSVNfRVJSKHN0YXRlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKHN0YXRlKTsKQEAgLTI2MzksNyArMjY0MCw3IEBACiAJaWYgKGN0eCAhPSBOVUxMKQogCQljdHgtPnN0YXRlID0gc3RhdGU7CiAJZWxzZQotCQluZnM0X2Nsb3NlX3N5bmMocGF0aCwgc3RhdGUsIGZtb2RlKTsKKwkJbmZzNF9jbG9zZV9zeW5jKHN0YXRlLCBmbW9kZSk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTQyOTEsNyArNDI5Miw3IEBACiAJCW1lbWNweShkYXRhLT5sc3AtPmxzX3N0YXRlaWQuZGF0YSwgZGF0YS0+cmVzLnN0YXRlaWQuZGF0YSwKIAkJCQkJc2l6ZW9mKGRhdGEtPmxzcC0+bHNfc3RhdGVpZC5kYXRhKSk7CiAJCWRhdGEtPmxzcC0+bHNfZmxhZ3MgfD0gTkZTX0xPQ0tfSU5JVElBTElaRUQ7Ci0JCXJlbmV3X2xlYXNlKE5GU19TRVJWRVIoZGF0YS0+Y3R4LT5wYXRoLmRlbnRyeS0+ZF9pbm9kZSksIGRhdGEtPnRpbWVzdGFtcCk7CisJCXJlbmV3X2xlYXNlKE5GU19TRVJWRVIoZGF0YS0+Y3R4LT5kZW50cnktPmRfaW5vZGUpLCBkYXRhLT50aW1lc3RhbXApOwogCX0KIG91dDoKIAlkcHJpbnRrKCIlczogZG9uZSwgcmV0ID0gJWQhXG4iLCBfX2Z1bmNfXywgZGF0YS0+cnBjX3N0YXR1cyk7CkBAIC00NjY3LDExICs0NjY4LDE1IEBACiAJcmV0dXJuIGxlbjsKIH0KIAorLyoKKyAqIG5mc19maGdldCB3aWxsIHVzZSBlaXRoZXIgdGhlIG1vdW50ZWRfb25fZmlsZWlkIG9yIHRoZSBmaWxlaWQKKyAqLwogc3RhdGljIHZvaWQgbmZzX2ZpeHVwX3JlZmVycmFsX2F0dHJpYnV0ZXMoc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7Ci0JaWYgKCEoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX0ZJTEVJRCkgJiYKLQkJKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX0ZTSUQpICYmCi0JCShmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9WNF9SRUZFUlJBTCkpKQorCWlmICghKCgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfTU9VTlRFRF9PTl9GSUxFSUQpIHx8CisJICAgICAgIChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9GSUxFSUQpKSAmJgorCSAgICAgIChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9GU0lEKSAmJgorCSAgICAgIChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9WNF9SRUZFUlJBTCkpKQogCQlyZXR1cm47CiAKIAlmYXR0ci0+dmFsaWQgfD0gTkZTX0FUVFJfRkFUVFJfVFlQRSB8IE5GU19BVFRSX0ZBVFRSX01PREUgfApAQCAtNDY4Niw3ICs0NjkxLDYgQEAKIAlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihkaXIpOwogCXUzMiBiaXRtYXNrWzJdID0gewogCQlbMF0gPSBGQVRUUjRfV09SRDBfRlNJRCB8IEZBVFRSNF9XT1JEMF9GU19MT0NBVElPTlMsCi0JCVsxXSA9IEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRCwKIAl9OwogCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uc19hcmcgYXJncyA9IHsKIAkJLmRpcl9maCA9IE5GU19GSChkaXIpLApAQCAtNDcwNSwxMSArNDcwOSwxOCBAQAogCWludCBzdGF0dXM7CiAKIAlkcHJpbnRrKCIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKKworCS8qIEFzayBmb3IgdGhlIGZpbGVpZCBvZiB0aGUgYWJzZW50IGZpbGVzeXN0ZW0gaWYgbW91bnRlZF9vbl9maWxlaWQKKwkgKiBpcyBub3Qgc3VwcG9ydGVkICovCisJaWYgKE5GU19TRVJWRVIoZGlyKS0+YXR0cl9iaXRtYXNrWzFdICYgRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlEKQorCQliaXRtYXNrWzFdIHw9IEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRDsKKwllbHNlCisJCWJpdG1hc2tbMF0gfD0gRkFUVFI0X1dPUkQwX0ZJTEVJRDsKKwogCW5mc19mYXR0cl9pbml0KCZmc19sb2NhdGlvbnMtPmZhdHRyKTsKIAlmc19sb2NhdGlvbnMtPnNlcnZlciA9IHNlcnZlcjsKIAlmc19sb2NhdGlvbnMtPm5sb2NhdGlvbnMgPSAwOwogCXN0YXR1cyA9IG5mczRfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCBzZXJ2ZXIsICZtc2csICZhcmdzLnNlcV9hcmdzLCAmcmVzLnNlcV9yZXMsIDApOwotCW5mc19maXh1cF9yZWZlcnJhbF9hdHRyaWJ1dGVzKCZmc19sb2NhdGlvbnMtPmZhdHRyKTsKIAlkcHJpbnRrKCIlczogcmV0dXJuZWQgc3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01MDk4LDcgKzUxMDksNiBAQAogCWlmIChteHJlc3Bfc3ogPT0gMCkKIAkJbXhyZXNwX3N6ID0gTkZTX01BWF9GSUxFX0lPX1NJWkU7CiAJLyogRm9yZSBjaGFubmVsIGF0dHJpYnV0ZXMgKi8KLQlhcmdzLT5mY19hdHRycy5oZWFkZXJwYWRzeiA9IDA7CiAJYXJncy0+ZmNfYXR0cnMubWF4X3Jxc3Rfc3ogPSBteHJxc3Rfc3o7CiAJYXJncy0+ZmNfYXR0cnMubWF4X3Jlc3Bfc3ogPSBteHJlc3Bfc3o7CiAJYXJncy0+ZmNfYXR0cnMubWF4X29wcyA9IE5GUzRfTUFYX09QUzsKQEAgLTUxMTEsNyArNTEyMSw2IEBACiAJCWFyZ3MtPmZjX2F0dHJzLm1heF9vcHMsIGFyZ3MtPmZjX2F0dHJzLm1heF9yZXFzKTsKIAogCS8qIEJhY2sgY2hhbm5lbCBhdHRyaWJ1dGVzICovCi0JYXJncy0+YmNfYXR0cnMuaGVhZGVycGFkc3ogPSAwOwogCWFyZ3MtPmJjX2F0dHJzLm1heF9ycXN0X3N6ID0gUEFHRV9TSVpFOwogCWFyZ3MtPmJjX2F0dHJzLm1heF9yZXNwX3N6ID0gUEFHRV9TSVpFOwogCWFyZ3MtPmJjX2F0dHJzLm1heF9yZXNwX3N6X2NhY2hlZCA9IDA7CkBAIC01MTMxLDggKzUxNDAsNiBAQAogCXN0cnVjdCBuZnM0X2NoYW5uZWxfYXR0cnMgKnNlbnQgPSAmYXJncy0+ZmNfYXR0cnM7CiAJc3RydWN0IG5mczRfY2hhbm5lbF9hdHRycyAqcmN2ZCA9ICZzZXNzaW9uLT5mY19hdHRyczsKIAotCWlmIChyY3ZkLT5oZWFkZXJwYWRzeiA+IHNlbnQtPmhlYWRlcnBhZHN6KQotCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAocmN2ZC0+bWF4X3Jlc3Bfc3ogPiBzZW50LT5tYXhfcmVzcF9zeikKIAkJcmV0dXJuIC1FSU5WQUw7CiAJLyoKQEAgLTU2OTcsNiArNTcwNCw3IEBACiB7CiAJc3RydWN0IG5mczRfbGF5b3V0cmV0dXJuICpscnAgPSBjYWxsZGF0YTsKIAlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvID0gTkZTX0kobHJwLT5hcmdzLmlub2RlKS0+bGF5b3V0OwogCiAJZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAKQEAgLTU3MDgsMTYgKzU3MTYsMTUgQEAKIAkJbmZzX3Jlc3RhcnRfcnBjKHRhc2ssIGxycC0+Y2xwKTsKIAkJcmV0dXJuOwogCX0KKwlzcGluX2xvY2soJmxvLT5wbGhfaW5vZGUtPmlfbG9jayk7CiAJaWYgKHRhc2stPnRrX3N0YXR1cyA9PSAwKSB7Ci0JCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvID0gTkZTX0kobHJwLT5hcmdzLmlub2RlKS0+bGF5b3V0OwotCiAJCWlmIChscnAtPnJlcy5scnNfcHJlc2VudCkgewotCQkJc3Bpbl9sb2NrKCZsby0+cGxoX2lub2RlLT5pX2xvY2spOwogCQkJcG5mc19zZXRfbGF5b3V0X3N0YXRlaWQobG8sICZscnAtPnJlcy5zdGF0ZWlkLCB0cnVlKTsKLQkJCXNwaW5fdW5sb2NrKCZsby0+cGxoX2lub2RlLT5pX2xvY2spOwogCQl9IGVsc2UKIAkJCUJVR19PTighbGlzdF9lbXB0eSgmbG8tPnBsaF9zZWdzKSk7CiAJfQorCWxvLT5wbGhfYmxvY2tfbGdldHMtLTsKKwlzcGluX3VubG9jaygmbG8tPnBsaF9pbm9kZS0+aV9sb2NrKTsKIAlkcHJpbnRrKCI8LS0gJXNcbiIsIF9fZnVuY19fKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRzdGF0ZS5jIGIvZnMvbmZzL25mczRzdGF0ZS5jCmluZGV4IGU5N2RkMjEuLjdhY2ZlODggMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0c3RhdGUuYworKysgYi9mcy9uZnMvbmZzNHN0YXRlLmMKQEAgLTY0MSw3ICs2NDEsNyBAQAogLyoKICAqIENsb3NlIHRoZSBjdXJyZW50IGZpbGUuCiAgKi8KLXN0YXRpYyB2b2lkIF9fbmZzNF9jbG9zZShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLAorc3RhdGljIHZvaWQgX19uZnM0X2Nsb3NlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwKIAkJZm1vZGVfdCBmbW9kZSwgZ2ZwX3QgZ2ZwX21hc2ssIGludCB3YWl0KQogewogCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpvd25lciA9IHN0YXRlLT5vd25lcjsKQEAgLTY4NSwxOCArNjg1LDE4IEBACiAJfSBlbHNlIHsKIAkJYm9vbCByb2MgPSBwbmZzX3JvYyhzdGF0ZS0+aW5vZGUpOwogCi0JCW5mczRfZG9fY2xvc2UocGF0aCwgc3RhdGUsIGdmcF9tYXNrLCB3YWl0LCByb2MpOworCQluZnM0X2RvX2Nsb3NlKHN0YXRlLCBnZnBfbWFzaywgd2FpdCwgcm9jKTsKIAl9CiB9CiAKLXZvaWQgbmZzNF9jbG9zZV9zdGF0ZShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBmbW9kZV90IGZtb2RlKQordm9pZCBuZnM0X2Nsb3NlX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZm1vZGVfdCBmbW9kZSkKIHsKLQlfX25mczRfY2xvc2UocGF0aCwgc3RhdGUsIGZtb2RlLCBHRlBfTk9GUywgMCk7CisJX19uZnM0X2Nsb3NlKHN0YXRlLCBmbW9kZSwgR0ZQX05PRlMsIDApOwogfQogCi12b2lkIG5mczRfY2xvc2Vfc3luYyhzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBmbW9kZV90IGZtb2RlKQordm9pZCBuZnM0X2Nsb3NlX3N5bmMoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBmbW9kZV90IGZtb2RlKQogewotCV9fbmZzNF9jbG9zZShwYXRoLCBzdGF0ZSwgZm1vZGUsIEdGUF9LRVJORUwsIDEpOworCV9fbmZzNF9jbG9zZShzdGF0ZSwgZm1vZGUsIEdGUF9LRVJORUwsIDEpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczR4ZHIuYyBiL2ZzL25mcy9uZnM0eGRyLmMKaW5kZXggZDg2OWE1ZS4uZTZlOGYzYiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczR4ZHIuYworKysgYi9mcy9uZnMvbmZzNHhkci5jCkBAIC05MSw3ICs5MSw3IEBACiAjZGVmaW5lIGVuY29kZV9nZXRmaF9tYXhzeiAgICAgIChvcF9lbmNvZGVfaGRyX21heHN6KQogI2RlZmluZSBkZWNvZGVfZ2V0ZmhfbWF4c3ogICAgICAob3BfZGVjb2RlX2hkcl9tYXhzeiArIDEgKyBcCiAJCQkJKCgzK05GUzRfRkhTSVpFKSA+PiAyKSkKLSNkZWZpbmUgbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3ogMworI2RlZmluZSBuZnM0X2ZhdHRyX2JpdG1hcF9tYXhzeiA0CiAjZGVmaW5lIGVuY29kZV9nZXRhdHRyX21heHN6ICAgIChvcF9lbmNvZGVfaGRyX21heHN6ICsgbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3opCiAjZGVmaW5lIG5mczRfbmFtZV9tYXhzegkJKDEgKyAoKDMgKyBORlM0X01BWE5BTUxFTikgPj4gMikpCiAjZGVmaW5lIG5mczRfcGF0aF9tYXhzegkJKDEgKyAoKDMgKyBORlM0X01BWFBBVEhMRU4pID4+IDIpKQpAQCAtMjU1LDcgKzI1NSw3IEBACiAjZGVmaW5lIGRlY29kZV9mc19sb2NhdGlvbnNfbWF4c3ogXAogCQkJCSgwKQogI2RlZmluZSBlbmNvZGVfc2VjaW5mb19tYXhzegkob3BfZW5jb2RlX2hkcl9tYXhzeiArIG5mczRfbmFtZV9tYXhzeikKLSNkZWZpbmUgZGVjb2RlX3NlY2luZm9fbWF4c3oJKG9wX2RlY29kZV9oZHJfbWF4c3ogKyA0ICsgKE5GU19NQVhfU0VDRkxBVk9SUyAqICgxNiArIEdTU19PSURfTUFYX0xFTikpKQorI2RlZmluZSBkZWNvZGVfc2VjaW5mb19tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIDEgKyAoKE5GU19NQVhfU0VDRkxBVk9SUyAqICgxNiArIEdTU19PSURfTUFYX0xFTikpIC8gNCkpCiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKICNkZWZpbmUgTkZTNF9NQVhfTUFDSElORV9OQU1FX0xFTiAoNjQpCkBAIC0xNzI1LDcgKzE3MjUsNyBAQAogCSpwKysgPSBjcHVfdG9fYmUzMihhcmdzLT5mbGFncyk7CQkJLypmbGFncyAqLwogCiAJLyogRm9yZSBDaGFubmVsICovCi0JKnArKyA9IGNwdV90b19iZTMyKGFyZ3MtPmZjX2F0dHJzLmhlYWRlcnBhZHN6KTsJLyogaGVhZGVyIHBhZGRpbmcgc2l6ZSAqLworCSpwKysgPSBjcHVfdG9fYmUzMigwKTsJCQkJLyogaGVhZGVyIHBhZGRpbmcgc2l6ZSAqLwogCSpwKysgPSBjcHVfdG9fYmUzMihhcmdzLT5mY19hdHRycy5tYXhfcnFzdF9zeik7CS8qIG1heCByZXEgc2l6ZSAqLwogCSpwKysgPSBjcHVfdG9fYmUzMihhcmdzLT5mY19hdHRycy5tYXhfcmVzcF9zeik7CS8qIG1heCByZXNwIHNpemUgKi8KIAkqcCsrID0gY3B1X3RvX2JlMzIobWF4X3Jlc3Bfc3pfY2FjaGVkKTsJCS8qIE1heCByZXNwIHN6IGNhY2hlZCAqLwpAQCAtMTczNCw3ICsxNzM0LDcgQEAKIAkqcCsrID0gY3B1X3RvX2JlMzIoMCk7CQkJCS8qIHJkbWFjaGFubmVsX2F0dHJzICovCiAKIAkvKiBCYWNrIENoYW5uZWwgKi8KLQkqcCsrID0gY3B1X3RvX2JlMzIoYXJncy0+ZmNfYXR0cnMuaGVhZGVycGFkc3opOwkvKiBoZWFkZXIgcGFkZGluZyBzaXplICovCisJKnArKyA9IGNwdV90b19iZTMyKDApOwkJCQkvKiBoZWFkZXIgcGFkZGluZyBzaXplICovCiAJKnArKyA9IGNwdV90b19iZTMyKGFyZ3MtPmJjX2F0dHJzLm1heF9ycXN0X3N6KTsJLyogbWF4IHJlcSBzaXplICovCiAJKnArKyA9IGNwdV90b19iZTMyKGFyZ3MtPmJjX2F0dHJzLm1heF9yZXNwX3N6KTsJLyogbWF4IHJlc3Agc2l6ZSAqLwogCSpwKysgPSBjcHVfdG9fYmUzMihhcmdzLT5iY19hdHRycy5tYXhfcmVzcF9zel9jYWNoZWQpOwkvKiBNYXggcmVzcCBzeiBjYWNoZWQgKi8KQEAgLTMwOTgsNyArMzA5OCw3IEBACiAJcmV0dXJuIC1FSU87CiB9CiAKLXN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZXJyb3Ioc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCkKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZXJyb3Ioc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgaW50MzJfdCAqcmVzKQogewogCV9fYmUzMiAqcDsKIApAQCAtMzEwOSw3ICszMTA5LDcgQEAKIAkJaWYgKHVubGlrZWx5KCFwKSkKIAkJCWdvdG8gb3V0X292ZXJmbG93OwogCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9SREFUVFJfRVJST1I7Ci0JCXJldHVybiAtYmUzMl90b19jcHVwKHApOworCQkqcmVzID0gLWJlMzJfdG9fY3B1cChwKTsKIAl9CiAJcmV0dXJuIDA7CiBvdXRfb3ZlcmZsb3c6CkBAIC00MDcwLDYgKzQwNzAsNyBAQAogCWludCBzdGF0dXM7CiAJdW1vZGVfdCBmbW9kZSA9IDA7CiAJdWludDMyX3QgdHlwZTsKKwlpbnQzMl90IGVycjsKIAogCXN0YXR1cyA9IGRlY29kZV9hdHRyX3R5cGUoeGRyLCBiaXRtYXAsICZ0eXBlKTsKIAlpZiAoc3RhdHVzIDwgMCkKQEAgLTQwOTUsMTMgKzQwOTYsMTIgQEAKIAkJZ290byB4ZHJfZXJyb3I7CiAJZmF0dHItPnZhbGlkIHw9IHN0YXR1czsKIAotCXN0YXR1cyA9IGRlY29kZV9hdHRyX2Vycm9yKHhkciwgYml0bWFwKTsKLQlpZiAoc3RhdHVzID09IC1ORlM0RVJSX1dST05HU0VDKSB7Ci0JCW5mc19maXh1cF9zZWNpbmZvX2F0dHJpYnV0ZXMoZmF0dHIsIGZoKTsKLQkJc3RhdHVzID0gMDsKLQl9CisJZXJyID0gMDsKKwlzdGF0dXMgPSBkZWNvZGVfYXR0cl9lcnJvcih4ZHIsIGJpdG1hcCwgJmVycik7CiAJaWYgKHN0YXR1cyA8IDApCiAJCWdvdG8geGRyX2Vycm9yOworCWlmIChlcnIgPT0gLU5GUzRFUlJfV1JPTkdTRUMpCisJCW5mc19maXh1cF9zZWNpbmZvX2F0dHJpYnV0ZXMoZmF0dHIsIGZoKTsKIAogCXN0YXR1cyA9IGRlY29kZV9hdHRyX2ZpbGVoYW5kbGUoeGRyLCBiaXRtYXAsIGZoKTsKIAlpZiAoc3RhdHVzIDwgMCkKQEAgLTQ5OTcsMTIgKzQ5OTcsMTQgQEAKIAkJCSAgICAgc3RydWN0IG5mczRfY2hhbm5lbF9hdHRycyAqYXR0cnMpCiB7CiAJX19iZTMyICpwOwotCXUzMiBucl9hdHRyczsKKwl1MzIgbnJfYXR0cnMsIHZhbDsKIAogCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDI4KTsKIAlpZiAodW5saWtlbHkoIXApKQogCQlnb3RvIG91dF9vdmVyZmxvdzsKLQlhdHRycy0+aGVhZGVycGFkc3ogPSBiZTMyX3RvX2NwdXAocCsrKTsKKwl2YWwgPSBiZTMyX3RvX2NwdXAocCsrKTsJLyogaGVhZGVycGFkc3ogKi8KKwlpZiAodmFsKQorCQlyZXR1cm4gLUVJTlZBTDsJCS8qIG5vIHN1cHBvcnQgZm9yIGhlYWRlciBwYWRkaW5nIHlldCAqLwogCWF0dHJzLT5tYXhfcnFzdF9zeiA9IGJlMzJfdG9fY3B1cChwKyspOwogCWF0dHJzLT5tYXhfcmVzcF9zeiA9IGJlMzJfdG9fY3B1cChwKyspOwogCWF0dHJzLT5tYXhfcmVzcF9zel9jYWNoZWQgPSBiZTMyX3RvX2NwdXAocCsrKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9vYmpsYXlvdXQvb2JqaW9fb3NkLmMgYi9mcy9uZnMvb2JqbGF5b3V0L29iamlvX29zZC5jCmluZGV4IDljZjIwOGQuLjhmZjJlYTMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9vYmpsYXlvdXQvb2JqaW9fb3NkLmMKKysrIGIvZnMvbmZzL29iamxheW91dC9vYmppb19vc2QuYwpAQCAtMTA4LDcgKzEwOCw2IEBACiAJCWRlID0gbjsKIAl9CiAKLQlhdG9taWNfaW5jKCZkZS0+aWRfbm9kZS5yZWYpOwogCXJldHVybiBkZTsKIH0KIApAQCAtMTAwMSw2ICsxMDAwLDkgQEAKIAlpZiAoIXBuZnNfZ2VuZXJpY19wZ190ZXN0KHBnaW8sIHByZXYsIHJlcSkpCiAJCXJldHVybiBmYWxzZTsKIAorCWlmIChwZ2lvLT5wZ19sc2VnID09IE5VTEwpCisJCXJldHVybiB0cnVlOworCiAJcmV0dXJuIHBnaW8tPnBnX2NvdW50ICsgcmVxLT53Yl9ieXRlcyA8PQogCQkJT0JKSU9fTFNFRyhwZ2lvLT5wZ19sc2VnKS0+bWF4X2lvX3NpemU7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvb2JqbGF5b3V0L29iamxheW91dC5jIGIvZnMvbmZzL29iamxheW91dC9vYmpsYXlvdXQuYwppbmRleCBkYzM5NTZjLi4xZDA2ZjhlIDEwMDY0NAotLS0gYS9mcy9uZnMvb2JqbGF5b3V0L29iamxheW91dC5jCisrKyBiL2ZzL25mcy9vYmpsYXlvdXQvb2JqbGF5b3V0LmMKQEAgLTI5MSw3ICsyOTEsNyBAQAogCXN0cnVjdCBuZnNfcmVhZF9kYXRhICpyZGF0YTsKIAogCXN0YXRlLT5zdGF0dXMgPSBzdGF0dXM7Ci0JZHByaW50aygiJXM6IEJlZ2luIHN0YXR1cz0lbGQgZW9mPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzLCBlb2YpOworCWRwcmludGsoIiVzOiBCZWdpbiBzdGF0dXM9JXpkIGVvZj0lZFxuIiwgX19mdW5jX18sIHN0YXR1cywgZW9mKTsKIAlyZGF0YSA9IHN0YXRlLT5ycGNkYXRhOwogCXJkYXRhLT50YXNrLnRrX3N0YXR1cyA9IHN0YXR1czsKIAlpZiAoc3RhdHVzID49IDApIHsKZGlmZiAtLWdpdCBhL2ZzL25mcy9wYWdlbGlzdC5jIGIvZnMvbmZzL3BhZ2VsaXN0LmMKaW5kZXggNzkxMzk2MS4uMTg0NDlmNCAxMDA2NDQKLS0tIGEvZnMvbmZzL3BhZ2VsaXN0LmMKKysrIGIvZnMvbmZzL3BhZ2VsaXN0LmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCWlmICghbmZzX2xvY2tfcmVxdWVzdF9kb250Z2V0KHJlcSkpCiAJCXJldHVybiAwOwogCWlmICh0ZXN0X2JpdChQR19NQVBQRUQsICZyZXEtPndiX2ZsYWdzKSkKLQkJcmFkaXhfdHJlZV90YWdfc2V0KCZORlNfSShyZXEtPndiX2NvbnRleHQtPnBhdGguZGVudHJ5LT5kX2lub2RlKS0+bmZzX3BhZ2VfdHJlZSwgcmVxLT53Yl9pbmRleCwgTkZTX1BBR0VfVEFHX0xPQ0tFRCk7CisJCXJhZGl4X3RyZWVfdGFnX3NldCgmTkZTX0kocmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGUpLT5uZnNfcGFnZV90cmVlLCByZXEtPndiX2luZGV4LCBORlNfUEFHRV9UQUdfTE9DS0VEKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTI0LDcgKzEyNCw3IEBACiB2b2lkIG5mc19jbGVhcl9wYWdlX3RhZ19sb2NrZWQoc3RydWN0IG5mc19wYWdlICpyZXEpCiB7CiAJaWYgKHRlc3RfYml0KFBHX01BUFBFRCwgJnJlcS0+d2JfZmxhZ3MpKSB7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPnBhdGguZGVudHJ5LT5kX2lub2RlOworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGU7CiAJCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CiAKIAkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKQEAgLTIwNCw3ICsyMDQsNyBAQAogCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOwogfQogCi1zdGF0aWMgYm9vbCBuZnNfZ2VuZXJpY19wZ190ZXN0KHN0cnVjdCBuZnNfcGFnZWlvX2Rlc2NyaXB0b3IgKmRlc2MsIHN0cnVjdCBuZnNfcGFnZSAqcHJldiwgc3RydWN0IG5mc19wYWdlICpyZXEpCitib29sIG5mc19nZW5lcmljX3BnX3Rlc3Qoc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqZGVzYywgc3RydWN0IG5mc19wYWdlICpwcmV2LCBzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKIHsKIAkvKgogCSAqIEZJWE1FOiBpZGVhbGx5IHdlIHNob3VsZCBiZSBhYmxlIHRvIGNvYWxlc2NlIGFsbCByZXF1ZXN0cwpAQCAtMjE4LDYgKzIxOCw3IEBACiAKIAlyZXR1cm4gZGVzYy0+cGdfY291bnQgKyByZXEtPndiX2J5dGVzIDw9IGRlc2MtPnBnX2JzaXplOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZzX2dlbmVyaWNfcGdfdGVzdCk7CiAKIC8qKgogICogbmZzX3BhZ2Vpb19pbml0IC0gaW5pdGlhbGlzZSBhIHBhZ2UgaW8gZGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvZnMvbmZzL3BuZnMuYyBiL2ZzL25mcy9wbmZzLmMKaW5kZXggOGMxMzA5ZC4uMjljMGNhNyAxMDA2NDQKLS0tIGEvZnMvbmZzL3BuZnMuYworKysgYi9mcy9uZnMvcG5mcy5jCkBAIC02MzQsMTQgKzYzNCwxNiBAQAogCiAJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CiAJbG8gPSBuZnNpLT5sYXlvdXQ7Ci0JaWYgKCFsbyB8fCAhbWFya19tYXRjaGluZ19sc2Vnc19pbnZhbGlkKGxvLCAmdG1wX2xpc3QsIE5VTEwpKSB7CisJaWYgKCFsbykgewogCQlzcGluX3VubG9jaygmaW5vLT5pX2xvY2spOwotCQlkcHJpbnRrKCIlczogbm8gbGF5b3V0IHNlZ21lbnRzIHRvIHJldHVyblxuIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKKwkJZHByaW50aygiJXM6IG5vIGxheW91dCB0byByZXR1cm5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHN0YXR1czsKIAl9CiAJc3RhdGVpZCA9IG5mc2ktPmxheW91dC0+cGxoX3N0YXRlaWQ7CiAJLyogUmVmZXJlbmNlIG1hdGNoZWQgaW4gbmZzNF9sYXlvdXRyZXR1cm5fcmVsZWFzZSAqLwogCWdldF9sYXlvdXRfaGRyKGxvKTsKKwltYXJrX21hdGNoaW5nX2xzZWdzX2ludmFsaWQobG8sICZ0bXBfbGlzdCwgTlVMTCk7CisJbG8tPnBsaF9ibG9ja19sZ2V0cysrOwogCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CiAJcG5mc19mcmVlX2xzZWdfbGlzdCgmdG1wX2xpc3QpOwogCkBAIC02NTAsNiArNjUyLDkgQEAKIAlscnAgPSBremFsbG9jKHNpemVvZigqbHJwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KGxycCA9PSBOVUxMKSkgewogCQlzdGF0dXMgPSAtRU5PTUVNOworCQlzZXRfYml0KE5GU19MQVlPVVRfUldfRkFJTEVELCAmbG8tPnBsaF9mbGFncyk7CisJCXNldF9iaXQoTkZTX0xBWU9VVF9ST19GQUlMRUQsICZsby0+cGxoX2ZsYWdzKTsKKwkJcHV0X2xheW91dF9oZHIobG8pOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTg4Nyw3ICs4OTIsNyBAQAogCQkJcmV0ID0gZ2V0X2xzZWcobHNlZyk7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoY21wX2xheW91dChyYW5nZSwgJmxzZWctPnBsc19yYW5nZSkgPiAwKQorCQlpZiAobHNlZy0+cGxzX3JhbmdlLm9mZnNldCA+IHJhbmdlLT5vZmZzZXQpCiAJCQlicmVhazsKIAl9CiAKQEAgLTEwNTksMjMgKzEwNjQsMzYgQEAKIAkJZ2ZwX2ZsYWdzID0gR0ZQX05PRlM7CiAJfQogCi0JaWYgKHBnaW8tPnBnX2NvdW50ID09IHByZXYtPndiX2J5dGVzKSB7CisJaWYgKHBnaW8tPnBnX2xzZWcgPT0gTlVMTCkgeworCQlpZiAocGdpby0+cGdfY291bnQgIT0gcHJldi0+d2JfYnl0ZXMpCisJCQlyZXR1cm4gdHJ1ZTsKIAkJLyogVGhpcyBpcyBmaXJzdCBjb2VsZXNjZSBjYWxsIGZvciBhIHNlcmllcyBvZiBuZnNfcGFnZXMgKi8KIAkJcGdpby0+cGdfbHNlZyA9IHBuZnNfdXBkYXRlX2xheW91dChwZ2lvLT5wZ19pbm9kZSwKIAkJCQkJCSAgIHByZXYtPndiX2NvbnRleHQsCi0JCQkJCQkgICByZXFfb2Zmc2V0KHJlcSksCisJCQkJCQkgICByZXFfb2Zmc2V0KHByZXYpLAogCQkJCQkJICAgcGdpby0+cGdfY291bnQsCiAJCQkJCQkgICBhY2Nlc3NfdHlwZSwKIAkJCQkJCSAgIGdmcF9mbGFncyk7Ci0JCXJldHVybiB0cnVlOworCQlpZiAocGdpby0+cGdfbHNlZyA9PSBOVUxMKQorCQkJcmV0dXJuIHRydWU7CiAJfQogCi0JaWYgKHBnaW8tPnBnX2xzZWcgJiYKLQkgICAgcmVxX29mZnNldChyZXEpID4gZW5kX29mZnNldChwZ2lvLT5wZ19sc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0LAotCQkJCQkgcGdpby0+cGdfbHNlZy0+cGxzX3JhbmdlLmxlbmd0aCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOworCS8qCisJICogVGVzdCBpZiBhIG5mc19wYWdlIGlzIGZ1bGx5IGNvbnRhaW5lZCBpbiB0aGUgcG5mc19sYXlvdXRfcmFuZ2UuCisJICogTm90ZSB0aGF0IHRoaXMgdGVzdCBtYWtlcyBzZXZlcmFsIGFzc3VtcHRpb25zOgorCSAqIC0gdGhhdCB0aGUgcHJldmlvdXMgbmZzX3BhZ2UgaW4gdGhlIHN0cnVjdCBuZnNfcGFnZWlvX2Rlc2NyaXB0b3IKKwkgKiAgIGlzIGtub3duIHRvIGxpZSB3aXRoaW4gdGhlIHJhbmdlLgorCSAqICAgLSB0aGF0IHRoZSBuZnNfcGFnZSBiZWluZyB0ZXN0ZWQgaXMga25vd24gdG8gYmUgY29udGlndW91cyB3aXRoIHRoZQorCSAqICAgcHJldmlvdXMgbmZzX3BhZ2UuCisJICogICAtIExheW91dCByYW5nZXMgYXJlIHBhZ2UgYWxpZ25lZCwgc28gd2Ugb25seSBoYXZlIHRvIHRlc3QgdGhlCisJICogICBzdGFydCBvZmZzZXQgb2YgdGhlIHJlcXVlc3QuCisJICoKKwkgKiBQbGVhc2UgYWxzbyBub3RlIHRoYXQgJ2VuZF9vZmZzZXQnIGlzIGFjdHVhbGx5IHRoZSBvZmZzZXQgb2YgdGhlCisJICogZmlyc3QgYnl0ZSB0aGF0IGxpZXMgb3V0c2lkZSB0aGUgcG5mc19sYXlvdXRfcmFuZ2UuIEZJWE1FPworCSAqCisJICovCisJcmV0dXJuIHJlcV9vZmZzZXQocmVxKSA8IGVuZF9vZmZzZXQocGdpby0+cGdfbHNlZy0+cGxzX3JhbmdlLm9mZnNldCwKKwkJCQkJIHBnaW8tPnBnX2xzZWctPnBsc19yYW5nZS5sZW5ndGgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG5mc19nZW5lcmljX3BnX3Rlc3QpOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvcG5mcy5oIGIvZnMvbmZzL3BuZnMuaAppbmRleCA0OGQwYThlLi45NmJmNGU2IDEwMDY0NAotLS0gYS9mcy9uZnMvcG5mcy5oCisrKyBiL2ZzL25mcy9wbmZzLmgKQEAgLTE4Niw2ICsxODYsNyBAQAogLyogcG5mc19kZXYuYyAqLwogc3RydWN0IG5mczRfZGV2aWNlaWRfbm9kZSB7CiAJc3RydWN0IGhsaXN0X25vZGUJCW5vZGU7CisJc3RydWN0IGhsaXN0X25vZGUJCXRtcG5vZGU7CiAJY29uc3Qgc3RydWN0IHBuZnNfbGF5b3V0ZHJpdmVyX3R5cGUgKmxkOwogCWNvbnN0IHN0cnVjdCBuZnNfY2xpZW50CQkqbmZzX2NsaWVudDsKIAlzdHJ1Y3QgbmZzNF9kZXZpY2VpZAkJZGV2aWNlaWQ7CmRpZmYgLS1naXQgYS9mcy9uZnMvcG5mc19kZXYuYyBiL2ZzL25mcy9wbmZzX2Rldi5jCmluZGV4IGM2NWUxMzMuLmYwZjhlMWUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wbmZzX2Rldi5jCisrKyBiL2ZzL25mcy9wbmZzX2Rldi5jCkBAIC0xNzQsNiArMTc0LDcgQEAKIAkJCWNvbnN0IHN0cnVjdCBuZnM0X2RldmljZWlkICppZCkKIHsKIAlJTklUX0hMSVNUX05PREUoJmQtPm5vZGUpOworCUlOSVRfSExJU1RfTk9ERSgmZC0+dG1wbm9kZSk7CiAJZC0+bGQgPSBsZDsKIAlkLT5uZnNfY2xpZW50ID0gbmZzX2NsaWVudDsKIAlkLT5kZXZpY2VpZCA9ICppZDsKQEAgLTIwOCw2ICsyMDksNyBAQAogCiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZuZXctPm5vZGUsICZuZnM0X2RldmljZWlkX2NhY2hlW2hhc2hdKTsKIAlzcGluX3VubG9jaygmbmZzNF9kZXZpY2VpZF9sb2NrKTsKKwlhdG9taWNfaW5jKCZuZXctPnJlZik7CiAKIAlyZXR1cm4gbmV3OwogfQpAQCAtMjM4LDI0ICsyNDAsMjkgQEAKIF9kZXZpY2VpZF9wdXJnZV9jbGllbnQoY29uc3Qgc3RydWN0IG5mc19jbGllbnQgKmNscCwgbG9uZyBoYXNoKQogewogCXN0cnVjdCBuZnM0X2RldmljZWlkX25vZGUgKmQ7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm4sICpuZXh0OworCXN0cnVjdCBobGlzdF9ub2RlICpuOwogCUhMSVNUX0hFQUQodG1wKTsKIAorCXNwaW5fbG9jaygmbmZzNF9kZXZpY2VpZF9sb2NrKTsKIAlyY3VfcmVhZF9sb2NrKCk7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGQsIG4sICZuZnM0X2RldmljZWlkX2NhY2hlW2hhc2hdLCBub2RlKQogCQlpZiAoZC0+bmZzX2NsaWVudCA9PSBjbHAgJiYgYXRvbWljX3JlYWQoJmQtPnJlZikpIHsKIAkJCWhsaXN0X2RlbF9pbml0X3JjdSgmZC0+bm9kZSk7Ci0JCQlobGlzdF9hZGRfaGVhZCgmZC0+bm9kZSwgJnRtcCk7CisJCQlobGlzdF9hZGRfaGVhZCgmZC0+dG1wbm9kZSwgJnRtcCk7CiAJCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKKwlzcGluX3VubG9jaygmbmZzNF9kZXZpY2VpZF9sb2NrKTsKIAogCWlmIChobGlzdF9lbXB0eSgmdG1wKSkKIAkJcmV0dXJuOwogCiAJc3luY2hyb25pemVfcmN1KCk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkLCBuLCBuZXh0LCAmdG1wLCBub2RlKQorCXdoaWxlICghaGxpc3RfZW1wdHkoJnRtcCkpIHsKKwkJZCA9IGhsaXN0X2VudHJ5KHRtcC5maXJzdCwgc3RydWN0IG5mczRfZGV2aWNlaWRfbm9kZSwgdG1wbm9kZSk7CisJCWhsaXN0X2RlbCgmZC0+dG1wbm9kZSk7CiAJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkLT5yZWYpKQogCQkJZC0+bGQtPmZyZWVfZGV2aWNlaWRfbm9kZShkKTsKKwl9CiB9CiAKIHZvaWQKQEAgLTI2Myw4ICsyNzAsOCBAQAogewogCWxvbmcgaDsKIAotCXNwaW5fbG9jaygmbmZzNF9kZXZpY2VpZF9sb2NrKTsKKwlpZiAoIShjbHAtPmNsX2V4Y2hhbmdlX2ZsYWdzICYgRVhDSEdJRDRfRkxBR19VU0VfUE5GU19NRFMpKQorCQlyZXR1cm47CiAJZm9yIChoID0gMDsgaCA8IE5GUzRfREVWSUNFX0lEX0hBU0hfU0laRTsgaCsrKQogCQlfZGV2aWNlaWRfcHVyZ2VfY2xpZW50KGNscCwgaCk7Ci0Jc3Bpbl91bmxvY2soJm5mczRfZGV2aWNlaWRfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvcmVhZC5jIGIvZnMvbmZzL3JlYWQuYwppbmRleCAyMGE3Zjk1Li5hNjg2NzlmIDEwMDY0NAotLS0gYS9mcy9uZnMvcmVhZC5jCisrKyBiL2ZzL25mcy9yZWFkLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiBzdGF0aWMgdm9pZCBuZnNfcmVhZHBhZ2VfcmVsZWFzZShzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmRfaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPnBhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqZF9pbm9kZSA9IHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlOwogCiAJaWYgKFBhZ2VVcHRvZGF0ZShyZXEtPndiX3BhZ2UpKQogCQluZnNfcmVhZHBhZ2VfdG9fZnNjYWNoZShkX2lub2RlLCByZXEtPndiX3BhZ2UsIDApOwpAQCAtMTUyLDggKzE1Miw4IEBACiAJdW5sb2NrX3BhZ2UocmVxLT53Yl9wYWdlKTsKIAogCWRwcmludGsoIk5GUzogcmVhZCBkb25lICglcy8lTGQgJWRAJUxkKVxuIiwKLQkJCXJlcS0+d2JfY29udGV4dC0+cGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCi0JCQkobG9uZyBsb25nKU5GU19GSUxFSUQocmVxLT53Yl9jb250ZXh0LT5wYXRoLmRlbnRyeS0+ZF9pbm9kZSksCisJCQlyZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19pZCwKKwkJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChyZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZSksCiAJCQlyZXEtPndiX2J5dGVzLAogCQkJKGxvbmcgbG9uZylyZXFfb2Zmc2V0KHJlcSkpOwogCW5mc19yZWxlYXNlX3JlcXVlc3QocmVxKTsKQEAgLTIwNyw3ICsyMDcsNyBAQAogCQl1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBvZmZzZXQsCiAJCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPnBhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZTsKIAogCWRhdGEtPnJlcQkgID0gcmVxOwogCWRhdGEtPmlub2RlCSAgPSBpbm9kZTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9zdXBlci5jIGIvZnMvbmZzL3N1cGVyLmMKaW5kZXggY2U0MGU1Yy4uYjk2MWNlYSAxMDA2NDQKLS0tIGEvZnMvbmZzL3N1cGVyLmMKKysrIGIvZnMvbmZzL3N1cGVyLmMKQEAgLTI3NzMsMTYgKzI3NzMsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuZnNfZm9sbG93X3JlbW90ZV9wYXRoKHN0cnVjdCB2ZnNtb3VudCAqcm9vdF9tbnQsCiAJCWNvbnN0IGNoYXIgKmV4cG9ydF9wYXRoKQogewotCXN0cnVjdCBuYW1laWRhdGEgKm5kID0gTlVMTDsKIAlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnNfcHJpdmF0ZTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnM7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IHJldDsKIAotCW5kID0ga21hbGxvYyhzaXplb2YoKm5kKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5kID09IE5VTEwpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCiAJbnNfcHJpdmF0ZSA9IGNyZWF0ZV9tbnRfbnMocm9vdF9tbnQpOwogCXJldCA9IFBUUl9FUlIobnNfcHJpdmF0ZSk7CiAJaWYgKElTX0VSUihuc19wcml2YXRlKSkKQEAgLTI3OTMsNyArMjc4OSw3IEBACiAJCWdvdG8gb3V0X3B1dF9tbnRfbnM7CiAKIAlyZXQgPSB2ZnNfcGF0aF9sb29rdXAocm9vdF9tbnQtPm1udF9yb290LCByb290X21udCwKLQkJCWV4cG9ydF9wYXRoLCBMT09LVVBfRk9MTE9XLCBuZCk7CisJCQlleHBvcnRfcGF0aCwgTE9PS1VQX0ZPTExPVywgJnBhdGgpOwogCiAJbmZzX3JlZmVycmFsX2xvb3BfdW5wcm90ZWN0KCk7CiAJcHV0X21udF9ucyhuc19wcml2YXRlKTsKQEAgLTI4MDEsMTIgKzI3OTcsMTEgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gb3V0X2VycjsKIAotCXMgPSBuZC0+cGF0aC5tbnQtPm1udF9zYjsKKwlzID0gcGF0aC5tbnQtPm1udF9zYjsKIAlhdG9taWNfaW5jKCZzLT5zX2FjdGl2ZSk7Ci0JZGVudHJ5ID0gZGdldChuZC0+cGF0aC5kZW50cnkpOworCWRlbnRyeSA9IGRnZXQocGF0aC5kZW50cnkpOwogCi0JcGF0aF9wdXQoJm5kLT5wYXRoKTsKLQlrZnJlZShuZCk7CisJcGF0aF9wdXQoJnBhdGgpOwogCWRvd25fd3JpdGUoJnMtPnNfdW1vdW50KTsKIAlyZXR1cm4gZGVudHJ5Owogb3V0X3B1dF9tbnRfbnM6CkBAIC0yODE0LDcgKzI4MDksNiBAQAogb3V0X21udHB1dDoKIAltbnRwdXQocm9vdF9tbnQpOwogb3V0X2VycjoKLQlrZnJlZShuZCk7CiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbmZzL3dyaXRlLmMgYi9mcy9uZnMvd3JpdGUuYwppbmRleCBlMjY4ZTNiLi4wODU3OTMxIDEwMDY0NAotLS0gYS9mcy9uZnMvd3JpdGUuYworKysgYi9mcy9uZnMvd3JpdGUuYwpAQCAtNDA5LDcgKzQwOSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIG5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcmVxLT53Yl9jb250ZXh0LT5wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKIAogCUJVR19PTiAoIU5GU19XQkFDS19CVVNZKHJlcSkpOwpAQCAtNDM4LDcgKzQzOCw3IEBACiBzdGF0aWMgdm9pZAogbmZzX21hcmtfcmVxdWVzdF9jb21taXQoc3RydWN0IG5mc19wYWdlICpyZXEsIHN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPnBhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwogCiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKQEAgLTg1MiwxOCArODUyLDIwIEBACiAJCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnLAogCQlpbnQgaG93KQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPnBhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZTsKIAogCS8qIFNldCB1cCB0aGUgUlBDIGFyZ3VtZW50IGFuZCByZXBseSBzdHJ1Y3RzCiAJICogTkI6IHRha2UgY2FyZSBub3QgdG8gbWVzcyBhYm91dCB3aXRoIGRhdGEtPmNvbW1pdCBldCBhbC4gKi8KIAogCWRhdGEtPnJlcSA9IHJlcTsKLQlkYXRhLT5pbm9kZSA9IGlub2RlID0gcmVxLT53Yl9jb250ZXh0LT5wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlkYXRhLT5pbm9kZSA9IGlub2RlID0gcmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGU7CiAJZGF0YS0+Y3JlZCA9IHJlcS0+d2JfY29udGV4dC0+Y3JlZDsKIAlkYXRhLT5sc2VnID0gZ2V0X2xzZWcobHNlZyk7CiAKIAlkYXRhLT5hcmdzLmZoICAgICA9IE5GU19GSChpbm9kZSk7CiAJZGF0YS0+YXJncy5vZmZzZXQgPSByZXFfb2Zmc2V0KHJlcSkgKyBvZmZzZXQ7CisJLyogcG5mc19zZXRfbGF5b3V0Y29tbWl0IG5lZWRzIHRoaXMgKi8KKwlkYXRhLT5tZHNfb2Zmc2V0ID0gZGF0YS0+YXJncy5vZmZzZXQ7CiAJZGF0YS0+YXJncy5wZ2Jhc2UgPSByZXEtPndiX3BnYmFzZSArIG9mZnNldDsKIAlkYXRhLT5hcmdzLnBhZ2VzICA9IGRhdGEtPnBhZ2V2ZWM7CiAJZGF0YS0+YXJncy5jb3VudCAgPSBjb3VudDsKQEAgLTEwNTEsOSArMTA1Myw5IEBACiAKIAlkcHJpbnRrKCJORlM6ICU1dSB3cml0ZSglcy8lbGxkICVkQCVsbGQpIiwKIAkJdGFzay0+dGtfcGlkLAotCQlkYXRhLT5yZXEtPndiX2NvbnRleHQtPnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2lkLAorCQlkYXRhLT5yZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19pZCwKIAkJKGxvbmcgbG9uZykKLQkJICBORlNfRklMRUlEKGRhdGEtPnJlcS0+d2JfY29udGV4dC0+cGF0aC5kZW50cnktPmRfaW5vZGUpLAorCQkgIE5GU19GSUxFSUQoZGF0YS0+cmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGUpLAogCQlkYXRhLT5yZXEtPndiX2J5dGVzLCAobG9uZyBsb25nKXJlcV9vZmZzZXQoZGF0YS0+cmVxKSk7CiAKIAluZnNfd3JpdGViYWNrX2RvbmUodGFzaywgZGF0YSk7CkBAIC0xMTQ2LDggKzExNDgsOCBAQAogCiAJCWRwcmludGsoIk5GUzogJTV1IHdyaXRlICglcy8lbGxkICVkQCVsbGQpIiwKIAkJCWRhdGEtPnRhc2sudGtfcGlkLAotCQkJcmVxLT53Yl9jb250ZXh0LT5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19pZCwKLQkJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChyZXEtPndiX2NvbnRleHQtPnBhdGguZGVudHJ5LT5kX2lub2RlKSwKKwkJCXJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2lkLAorCQkJKGxvbmcgbG9uZylORlNfRklMRUlEKHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlKSwKIAkJCXJlcS0+d2JfYnl0ZXMsCiAJCQkobG9uZyBsb25nKXJlcV9vZmZzZXQocmVxKSk7CiAKQEAgLTEzNDUsNyArMTM0Nyw3IEBACiAJCQkgICAgc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcpCiB7CiAJc3RydWN0IG5mc19wYWdlICpmaXJzdCA9IG5mc19saXN0X2VudHJ5KGhlYWQtPm5leHQpOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaXJzdC0+d2JfY29udGV4dC0+cGF0aC5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpcnN0LT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGU7CiAKIAkvKiBTZXQgdXAgdGhlIFJQQyBhcmd1bWVudCBhbmQgcmVwbHkgc3RydWN0cwogCSAqIE5COiB0YWtlIGNhcmUgbm90IHRvIG1lc3MgYWJvdXQgd2l0aCBkYXRhLT5jb21taXQgZXQgYWwuICovCkBAIC0xNDMzLDggKzE0MzUsOCBAQAogCQluZnNfY2xlYXJfcmVxdWVzdF9jb21taXQocmVxKTsKIAogCQlkcHJpbnRrKCJORlM6ICAgICAgIGNvbW1pdCAoJXMvJWxsZCAlZEAlbGxkKSIsCi0JCQlyZXEtPndiX2NvbnRleHQtPnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2lkLAotCQkJKGxvbmcgbG9uZylORlNfRklMRUlEKHJlcS0+d2JfY29udGV4dC0+cGF0aC5kZW50cnktPmRfaW5vZGUpLAorCQkJcmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfc2ItPnNfaWQsCisJCQkobG9uZyBsb25nKU5GU19GSUxFSUQocmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGUpLAogCQkJcmVxLT53Yl9ieXRlcywKIAkJCShsb25nIGxvbmcpcmVxX29mZnNldChyZXEpKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKZGlmZiAtLWdpdCBhL2ZzL25mc2N0bC5jIGIvZnMvbmZzY3RsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNGU4ZmMuLjAwMDAwMDAKLS0tIGEvZnMvbmZzY3RsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqCWZzL25mc2N0bC5jCi0gKgotICoJVGhpcyBzaG91bGQgZXZlbnR1YWxseSBtb3ZlIHRvIHVzZXJsYW5kLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC9zeXNjYWxsLmg+Ci0jaW5jbHVkZSA8bGludXgvY3JlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+Ci0jaW5jbHVkZSA8bGludXgvbW91bnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLS8qCi0gKiBvcGVuIGEgZmlsZSBvbiBuZnNkIGZzCi0gKi8KLQotc3RhdGljIHN0cnVjdCBmaWxlICpkb19vcGVuKGNoYXIgKm5hbWUsIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKLQlzdHJ1Y3QgZmlsZSAqZmlsZTsKLQotCW1udCA9IGRvX2tlcm5fbW91bnQoIm5mc2QiLCAwLCAibmZzZCIsIE5VTEwpOwotCWlmIChJU19FUlIobW50KSkKLQkJcmV0dXJuIChzdHJ1Y3QgZmlsZSAqKW1udDsKLQotCWZpbGUgPSBmaWxlX29wZW5fcm9vdChtbnQtPm1udF9yb290LCBtbnQsIG5hbWUsIGZsYWdzKTsKLQotCW1udHB1dChtbnQpOwkvKiBkcm9wIGRvX2tlcm5fbW91bnQgcmVmZXJlbmNlICovCi0JcmV0dXJuIGZpbGU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7IGludCB3c2l6ZTsgaW50IHJzaXplOwotfSBtYXBbXSA9IHsKLQlbTkZTQ1RMX1NWQ10gPSB7Ci0JCS5uYW1lCT0gIi5zdmMiLAotCQkud3NpemUJPSBzaXplb2Yoc3RydWN0IG5mc2N0bF9zdmMpCi0JfSwKLQlbTkZTQ1RMX0FERENMSUVOVF0gPSB7Ci0JCS5uYW1lCT0gIi5hZGQiLAotCQkud3NpemUJPSBzaXplb2Yoc3RydWN0IG5mc2N0bF9jbGllbnQpCi0JfSwKLQlbTkZTQ1RMX0RFTENMSUVOVF0gPSB7Ci0JCS5uYW1lCT0gIi5kZWwiLAotCQkud3NpemUJPSBzaXplb2Yoc3RydWN0IG5mc2N0bF9jbGllbnQpCi0JfSwKLQlbTkZTQ1RMX0VYUE9SVF0gPSB7Ci0JCS5uYW1lCT0gIi5leHBvcnQiLAotCQkud3NpemUJPSBzaXplb2Yoc3RydWN0IG5mc2N0bF9leHBvcnQpCi0JfSwKLQlbTkZTQ1RMX1VORVhQT1JUXSA9IHsKLQkJLm5hbWUJPSAiLnVuZXhwb3J0IiwKLQkJLndzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZnNjdGxfZXhwb3J0KQotCX0sCi0JW05GU0NUTF9HRVRGRF0gPSB7Ci0JCS5uYW1lCT0gIi5nZXRmZCIsCi0JCS53c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZzY3RsX2ZkcGFybSksCi0JCS5yc2l6ZQk9IE5GU19GSFNJWkUKLQl9LAotCVtORlNDVExfR0VURlNdID0gewotCQkubmFtZQk9ICIuZ2V0ZnMiLAotCQkud3NpemUJPSBzaXplb2Yoc3RydWN0IG5mc2N0bF9mc3Bhcm0pLAotCQkucnNpemUJPSBzaXplb2Yoc3RydWN0IGtuZnNkX2ZoKQotCX0sCi19OwotCi1TWVNDQUxMX0RFRklORTMobmZzc2VydmN0bCwgaW50LCBjbWQsIHN0cnVjdCBuZnNjdGxfYXJnIF9fdXNlciAqLCBhcmcsCi0JCXZvaWQgX191c2VyICosIHJlcykKLXsKLQlzdHJ1Y3QgZmlsZSAqZmlsZTsKLQl2b2lkIF9fdXNlciAqcCA9ICZhcmctPnU7Ci0JaW50IHZlcnNpb247Ci0JaW50IGVycjsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdmVyc2lvbiwgJmFyZy0+Y2FfdmVyc2lvbiwgc2l6ZW9mKGludCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmICh2ZXJzaW9uICE9IE5GU0NUTF9WRVJTSU9OKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjbWQgPCAwIHx8IGNtZCA+PSBBUlJBWV9TSVpFKG1hcCkgfHwgIW1hcFtjbWRdLm5hbWUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZmlsZSA9IGRvX29wZW4obWFwW2NtZF0ubmFtZSwgbWFwW2NtZF0ucnNpemUgPyBPX1JEV1IgOiBPX1dST05MWSk7CQotCWlmIChJU19FUlIoZmlsZSkpCi0JCXJldHVybiBQVFJfRVJSKGZpbGUpOwotCWVyciA9IGZpbGUtPmZfb3AtPndyaXRlKGZpbGUsIHAsIG1hcFtjbWRdLndzaXplLCAmZmlsZS0+Zl9wb3MpOwotCWlmIChlcnIgPj0gMCAmJiBtYXBbY21kXS5yc2l6ZSkKLQkJZXJyID0gZmlsZS0+Zl9vcC0+cmVhZChmaWxlLCByZXMsIG1hcFtjbWRdLnJzaXplLCAmZmlsZS0+Zl9wb3MpOwotCWlmIChlcnIgPj0gMCkKLQkJZXJyID0gMDsKLQlmcHV0KGZpbGUpOwotCXJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9mcy9uZnNkL0tjb25maWcgYi9mcy9uZnNkL0tjb25maWcKaW5kZXggMThiM2U4OS4uMTBlNjM2NiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9LY29uZmlnCisrKyBiL2ZzL25mc2QvS2NvbmZpZwpAQCAtMjgsMTggKzI4LDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIE5GU0RfREVQUkVDQVRFRAotCWJvb2wgIkluY2x1ZGUgc3VwcG9ydCBmb3IgZGVwcmVjYXRlZCBzeXNjYWxsIGludGVyZmFjZSB0byBORlNEIgotCWRlcGVuZHMgb24gTkZTRAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoZSBzeXNjYWxsIGludGVyZmFjZSB0byBuZnNkIHdhcyBvYnNvbGV0ZWQgaW4gMi42LjAgYnkgYSBuZXcKLQkgIGZpbGVzeXN0ZW0gYmFzZWQgaW50ZXJmYWNlLiAgVGhlIG9sZCBpbnRlcmZhY2UgaXMgZHVlIGZvciByZW1vdmFsCi0JICBpbiAyLjYuNDAuICBJZiB5b3Ugd2lzaCB0byByZW1vdmUgdGhlIGludGVyZmFjZSBiZWZvcmUgdGhlbgotCSAgc2F5IE4uCi0KLQkgIEluIHVuc3VyZSwgc2F5IFkuCi0KIGNvbmZpZyBORlNEX1YyX0FDTAogCWJvb2wKIAlkZXBlbmRzIG9uIE5GU0QKQEAgLTgyLDYgKzcwLDcgQEAKIAlzZWxlY3QgTkZTRF9WMwogCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAlzZWxlY3QgU1VOUlBDX0dTUworCXNlbGVjdCBDUllQVE8KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgaW4geW91ciBzeXN0ZW0ncyBORlMgc2VydmVyIGZvcgogCSAgdmVyc2lvbiA0IG9mIHRoZSBORlMgcHJvdG9jb2wgKFJGQyAzNTMwKS4KZGlmZiAtLWdpdCBhL2ZzL25mc2QvY2FjaGUuaCBiL2ZzL25mc2QvY2FjaGUuaAppbmRleCBkODkyYmU2Li45M2NjOWQzIDEwMDY0NAotLS0gYS9mcy9uZnNkL2NhY2hlLmgKKysrIGIvZnMvbmZzZC9jYWNoZS5oCkBAIC02OSw3ICs2OSw3IEBACiAKIGludAluZnNkX3JlcGx5X2NhY2hlX2luaXQodm9pZCk7CiB2b2lkCW5mc2RfcmVwbHlfY2FjaGVfc2h1dGRvd24odm9pZCk7Ci1pbnQJbmZzZF9jYWNoZV9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICosIGludCk7CitpbnQJbmZzZF9jYWNoZV9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICopOwogdm9pZAluZnNkX2NhY2hlX3VwZGF0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgaW50LCBfX2JlMzIgKik7CiAKICNpZmRlZiBDT05GSUdfTkZTRF9WNApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9leHBvcnQuYyBiL2ZzL25mc2QvZXhwb3J0LmMKaW5kZXggYjk1NjZlNC4uZjRjYzFlMiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9leHBvcnQuYworKysgYi9mcy9uZnNkL2V4cG9ydC5jCkBAIC03OTcsNTggKzc5Nyw2IEBACiAJcmV0dXJuIGVrOwogfQogCi0jaWZkZWYgQ09ORklHX05GU0RfREVQUkVDQVRFRAotc3RhdGljIGludCBleHBfc2V0X2tleShzdmNfY2xpZW50ICpjbHAsIGludCBmc2lkX3R5cGUsIHUzMiAqZnNpZHYsCi0JCSAgICAgICBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQotewotCXN0cnVjdCBzdmNfZXhwa2V5IGtleSwgKmVrOwotCi0Ja2V5LmVrX2NsaWVudCA9IGNscDsKLQlrZXkuZWtfZnNpZHR5cGUgPSBmc2lkX3R5cGU7Ci0JbWVtY3B5KGtleS5la19mc2lkLCBmc2lkdiwga2V5X2xlbihmc2lkX3R5cGUpKTsKLQlrZXkuZWtfcGF0aCA9IGV4cC0+ZXhfcGF0aDsKLQlrZXkuaC5leHBpcnlfdGltZSA9IE5FVkVSOwotCWtleS5oLmZsYWdzID0gMDsKLQotCWVrID0gc3ZjX2V4cGtleV9sb29rdXAoJmtleSk7Ci0JaWYgKGVrKQotCQllayA9IHN2Y19leHBrZXlfdXBkYXRlKCZrZXksZWspOwotCWlmIChlaykgewotCQljYWNoZV9wdXQoJmVrLT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotLyoKLSAqIEZpbmQgdGhlIGNsaWVudCdzIGV4cG9ydCBlbnRyeSBtYXRjaGluZyB4ZGV2L3hpbm8uCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHN2Y19leHBrZXkgKgotZXhwX2dldF9rZXkoc3ZjX2NsaWVudCAqY2xwLCBkZXZfdCBkZXYsIGlub190IGlubykKLXsKLQl1MzIgZnNpZHZbM107Ci0JCi0JaWYgKG9sZF92YWxpZF9kZXYoZGV2KSkgewotCQlta19mc2lkKEZTSURfREVWLCBmc2lkdiwgZGV2LCBpbm8sIDAsIE5VTEwpOwotCQlyZXR1cm4gZXhwX2ZpbmRfa2V5KGNscCwgRlNJRF9ERVYsIGZzaWR2LCBOVUxMKTsKLQl9Ci0JbWtfZnNpZChGU0lEX0VOQ09ERV9ERVYsIGZzaWR2LCBkZXYsIGlubywgMCwgTlVMTCk7Ci0JcmV0dXJuIGV4cF9maW5kX2tleShjbHAsIEZTSURfRU5DT0RFX0RFViwgZnNpZHYsIE5VTEwpOwotfQotCi0vKgotICogRmluZCB0aGUgY2xpZW50J3MgZXhwb3J0IGVudHJ5IG1hdGNoaW5nIGZzaWQKLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3ZjX2V4cGtleSAqCi1leHBfZ2V0X2ZzaWRfa2V5KHN2Y19jbGllbnQgKmNscCwgaW50IGZzaWQpCi17Ci0JdTMyIGZzaWR2WzJdOwotCi0JbWtfZnNpZChGU0lEX05VTSwgZnNpZHYsIDAsIDAsIGZzaWQsIE5VTEwpOwotCi0JcmV0dXJuIGV4cF9maW5kX2tleShjbHAsIEZTSURfTlVNLCBmc2lkdiwgTlVMTCk7Ci19Ci0jZW5kaWYKIAogc3RhdGljIHN2Y19leHBvcnQgKmV4cF9nZXRfYnlfbmFtZShzdmNfY2xpZW50ICpjbHAsIGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoLAogCQkJCSAgICAgc3RydWN0IGNhY2hlX3JlcSAqcmVxcCkKQEAgLTg5MCwyNzUgKzgzOCw3IEBACiAJcmV0dXJuIGV4cDsKIH0KIAotI2lmZGVmIENPTkZJR19ORlNEX0RFUFJFQ0FURUQKLS8qCi0gKiBIYXNodGFibGUgbG9ja2luZy4gV3JpdGUgbG9ja3MgYXJlIHBsYWNlZCBvbmx5IGJ5IHVzZXIgcHJvY2Vzc2VzCi0gKiB3YW50aW5nIHRvIG1vZGlmeSBleHBvcnQgaW5mb3JtYXRpb24uCi0gKiBXcml0ZSBsb2NraW5nIG9ubHkgZG9uZSBpbiB0aGlzIGZpbGUuICBSZWFkIGxvY2tpbmcKLSAqIG5lZWRlZCBleHRlcm5hbGx5LgotICovCiAKLXN0YXRpYyBERUNMQVJFX1JXU0VNKGhhc2hfc2VtKTsKLQotdm9pZAotZXhwX3JlYWRsb2NrKHZvaWQpCi17Ci0JZG93bl9yZWFkKCZoYXNoX3NlbSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZXhwX3dyaXRlbG9jayh2b2lkKQotewotCWRvd25fd3JpdGUoJmhhc2hfc2VtKTsKLX0KLQotdm9pZAotZXhwX3JlYWR1bmxvY2sodm9pZCkKLXsKLQl1cF9yZWFkKCZoYXNoX3NlbSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZXhwX3dyaXRldW5sb2NrKHZvaWQpCi17Ci0JdXBfd3JpdGUoJmhhc2hfc2VtKTsKLX0KLSNlbHNlCi0KLS8qIGhhc2hfc2VtIG5vdCBuZWVkZWQgb25jZSBkZXByZWNhdGVkIGludGVyZmFjZSBpcyByZW1vdmVkICovCi12b2lkIGV4cF9yZWFkbG9jayh2b2lkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIGV4cF93cml0ZWxvY2sodm9pZCl7fQotdm9pZCBleHBfcmVhZHVubG9jayh2b2lkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIGV4cF93cml0ZXVubG9jayh2b2lkKXt9Ci0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX05GU0RfREVQUkVDQVRFRAotc3RhdGljIHZvaWQJCWV4cF9kb191bmV4cG9ydChzdmNfZXhwb3J0ICp1bmV4cCk7Ci1zdGF0aWMgaW50CQlleHBfdmVyaWZ5X3N0cmluZyhjaGFyICpjcCwgaW50IG1heCk7Ci0KLXN0YXRpYyB2b2lkIGV4cF9mc2lkX3VuaGFzaChzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQotewotCXN0cnVjdCBzdmNfZXhwa2V5ICplazsKLQotCWlmICgoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9GU0lEKSA9PSAwKQotCQlyZXR1cm47Ci0KLQllayA9IGV4cF9nZXRfZnNpZF9rZXkoZXhwLT5leF9jbGllbnQsIGV4cC0+ZXhfZnNpZCk7Ci0JaWYgKCFJU19FUlIoZWspKSB7Ci0JCXN1bnJwY19pbnZhbGlkYXRlKCZlay0+aCwgJnN2Y19leHBrZXlfY2FjaGUpOwotCQljYWNoZV9wdXQoJmVrLT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGV4cF9mc2lkX2hhc2goc3ZjX2NsaWVudCAqY2xwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQotewotCXUzMiBmc2lkWzJdOwotIAotCWlmICgoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9GU0lEKSA9PSAwKQotCQlyZXR1cm4gMDsKLQotCW1rX2ZzaWQoRlNJRF9OVU0sIGZzaWQsIDAsIDAsIGV4cC0+ZXhfZnNpZCwgTlVMTCk7Ci0JcmV0dXJuIGV4cF9zZXRfa2V5KGNscCwgRlNJRF9OVU0sIGZzaWQsIGV4cCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXhwX2hhc2goc3RydWN0IGF1dGhfZG9tYWluICpjbHAsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApCi17Ci0JdTMyIGZzaWRbMl07Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGV4cC0+ZXhfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JZGV2X3QgZGV2ID0gaW5vZGUtPmlfc2ItPnNfZGV2OwotCi0JaWYgKG9sZF92YWxpZF9kZXYoZGV2KSkgewotCQlta19mc2lkKEZTSURfREVWLCBmc2lkLCBkZXYsIGlub2RlLT5pX2lubywgMCwgTlVMTCk7Ci0JCXJldHVybiBleHBfc2V0X2tleShjbHAsIEZTSURfREVWLCBmc2lkLCBleHApOwotCX0KLQlta19mc2lkKEZTSURfRU5DT0RFX0RFViwgZnNpZCwgZGV2LCBpbm9kZS0+aV9pbm8sIDAsIE5VTEwpOwotCXJldHVybiBleHBfc2V0X2tleShjbHAsIEZTSURfRU5DT0RFX0RFViwgZnNpZCwgZXhwKTsKLX0KLQotc3RhdGljIHZvaWQgZXhwX3VuaGFzaChzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQotewotCXN0cnVjdCBzdmNfZXhwa2V5ICplazsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZXhwLT5leF9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQotCWVrID0gZXhwX2dldF9rZXkoZXhwLT5leF9jbGllbnQsIGlub2RlLT5pX3NiLT5zX2RldiwgaW5vZGUtPmlfaW5vKTsKLQlpZiAoIUlTX0VSUihlaykpIHsKLQkJc3VucnBjX2ludmFsaWRhdGUoJmVrLT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7Ci0JCWNhY2hlX3B1dCgmZWstPmgsICZzdmNfZXhwa2V5X2NhY2hlKTsKLQl9Ci19Ci0JCi0vKgotICogRXhwb3J0IGEgZmlsZSBzeXN0ZW0uCi0gKi8KLWludAotZXhwX2V4cG9ydChzdHJ1Y3QgbmZzY3RsX2V4cG9ydCAqbnhwKQotewotCXN2Y19jbGllbnQJKmNscDsKLQlzdHJ1Y3Qgc3ZjX2V4cG9ydAkqZXhwID0gTlVMTDsKLQlzdHJ1Y3Qgc3ZjX2V4cG9ydAluZXc7Ci0Jc3RydWN0IHN2Y19leHBrZXkJKmZzaWRfa2V5ID0gTlVMTDsKLQlzdHJ1Y3QgcGF0aCBwYXRoOwotCWludAkJZXJyOwotCi0JLyogQ29uc2lzdGVuY3kgY2hlY2sgKi8KLQllcnIgPSAtRUlOVkFMOwotCWlmICghZXhwX3ZlcmlmeV9zdHJpbmcobnhwLT5leF9wYXRoLCBORlNfTUFYUEFUSExFTikgfHwKLQkgICAgIWV4cF92ZXJpZnlfc3RyaW5nKG54cC0+ZXhfY2xpZW50LCBORlNDTE5UX0lETUFYKSkKLQkJZ290byBvdXQ7Ci0KLQlkcHJpbnRrKCJleHBfZXhwb3J0IGNhbGxlZCBmb3IgJXM6JXMgKCV4LyVsZCBmbCAleCkuXG4iLAotCQkJbnhwLT5leF9jbGllbnQsIG54cC0+ZXhfcGF0aCwKLQkJCSh1bnNpZ25lZClueHAtPmV4X2RldiwgKGxvbmcpbnhwLT5leF9pbm8sCi0JCQlueHAtPmV4X2ZsYWdzKTsKLQotCS8qIFRyeSB0byBsb2NrIHRoZSBleHBvcnQgdGFibGUgZm9yIHVwZGF0ZSAqLwotCWV4cF93cml0ZWxvY2soKTsKLQotCS8qIExvb2sgdXAgY2xpZW50IGluZm8gKi8KLQlpZiAoIShjbHAgPSBhdXRoX2RvbWFpbl9maW5kKG54cC0+ZXhfY2xpZW50KSkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCi0JLyogTG9vayB1cCB0aGUgZGVudHJ5ICovCi0JZXJyID0ga2Vybl9wYXRoKG54cC0+ZXhfcGF0aCwgMCwgJnBhdGgpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X3B1dF9jbHA7Ci0JZXJyID0gLUVJTlZBTDsKLQotCWV4cCA9IGV4cF9nZXRfYnlfbmFtZShjbHAsICZwYXRoLCBOVUxMKTsKLQotCW1lbXNldCgmbmV3LCAwLCBzaXplb2YobmV3KSk7Ci0KLQkvKiBtdXN0IG1ha2Ugc3VyZSB0aGVyZSB3b24ndCBiZSBhbiBleF9mc2lkIGNsYXNoICovCi0JaWYgKChueHAtPmV4X2ZsYWdzICYgTkZTRVhQX0ZTSUQpICYmCi0JICAgICghSVNfRVJSKGZzaWRfa2V5ID0gZXhwX2dldF9mc2lkX2tleShjbHAsIG54cC0+ZXhfZGV2KSkpICYmCi0JICAgIGZzaWRfa2V5LT5la19wYXRoLm1udCAmJgotCSAgICAoZnNpZF9rZXktPmVrX3BhdGgubW50ICE9IHBhdGgubW50IHx8Ci0JICAgICBmc2lkX2tleS0+ZWtfcGF0aC5kZW50cnkgIT0gcGF0aC5kZW50cnkpKQotCQlnb3RvIGZpbmlzaDsKLQotCWlmICghSVNfRVJSKGV4cCkpIHsKLQkJLyoganVzdCBhIGZsYWdzL2lkL2ZzaWQgdXBkYXRlICovCi0KLQkJZXhwX2ZzaWRfdW5oYXNoKGV4cCk7Ci0JCWV4cC0+ZXhfZmxhZ3MgICAgPSBueHAtPmV4X2ZsYWdzOwotCQlleHAtPmV4X2Fub25fdWlkID0gbnhwLT5leF9hbm9uX3VpZDsKLQkJZXhwLT5leF9hbm9uX2dpZCA9IG54cC0+ZXhfYW5vbl9naWQ7Ci0JCWV4cC0+ZXhfZnNpZCAgICAgPSBueHAtPmV4X2RldjsKLQotCQllcnIgPSBleHBfZnNpZF9oYXNoKGNscCwgZXhwKTsKLQkJZ290byBmaW5pc2g7Ci0JfQotCi0JZXJyID0gY2hlY2tfZXhwb3J0KHBhdGguZGVudHJ5LT5kX2lub2RlLCAmbnhwLT5leF9mbGFncywgTlVMTCk7Ci0JaWYgKGVycikgZ290byBmaW5pc2g7Ci0KLQllcnIgPSAtRU5PTUVNOwotCi0JZHByaW50aygibmZzZDogY3JlYXRpbmcgZXhwb3J0IGVudHJ5ICVwIGZvciBjbGllbnQgJXBcbiIsIGV4cCwgY2xwKTsKLQotCW5ldy5oLmV4cGlyeV90aW1lID0gTkVWRVI7Ci0JbmV3LmguZmxhZ3MgPSAwOwotCW5ldy5leF9wYXRobmFtZSA9IGtzdHJkdXAobnhwLT5leF9wYXRoLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ldy5leF9wYXRobmFtZSkKLQkJZ290byBmaW5pc2g7Ci0JbmV3LmV4X2NsaWVudCA9IGNscDsKLQluZXcuZXhfcGF0aCA9IHBhdGg7Ci0JbmV3LmV4X2ZsYWdzID0gbnhwLT5leF9mbGFnczsKLQluZXcuZXhfYW5vbl91aWQgPSBueHAtPmV4X2Fub25fdWlkOwotCW5ldy5leF9hbm9uX2dpZCA9IG54cC0+ZXhfYW5vbl9naWQ7Ci0JbmV3LmV4X2ZzaWQgPSBueHAtPmV4X2RldjsKLQotCWV4cCA9IHN2Y19leHBvcnRfbG9va3VwKCZuZXcpOwotCWlmIChleHApCi0JCWV4cCA9IHN2Y19leHBvcnRfdXBkYXRlKCZuZXcsIGV4cCk7Ci0KLQlpZiAoIWV4cCkKLQkJZ290byBmaW5pc2g7Ci0KLQlpZiAoZXhwX2hhc2goY2xwLCBleHApIHx8Ci0JICAgIGV4cF9mc2lkX2hhc2goY2xwLCBleHApKSB7Ci0JCS8qIGZhaWxlZCB0byBjcmVhdGUgYXQgbGVhc3Qgb25lIGluZGV4ICovCi0JCWV4cF9kb191bmV4cG9ydChleHApOwotCQljYWNoZV9mbHVzaCgpOwotCX0gZWxzZQotCQllcnIgPSAwOwotZmluaXNoOgotCWtmcmVlKG5ldy5leF9wYXRobmFtZSk7Ci0JaWYgKCFJU19FUlJfT1JfTlVMTChleHApKQotCQlleHBfcHV0KGV4cCk7Ci0JaWYgKCFJU19FUlJfT1JfTlVMTChmc2lkX2tleSkpCi0JCWNhY2hlX3B1dCgmZnNpZF9rZXktPmgsICZzdmNfZXhwa2V5X2NhY2hlKTsKLQlwYXRoX3B1dCgmcGF0aCk7Ci1vdXRfcHV0X2NscDoKLQlhdXRoX2RvbWFpbl9wdXQoY2xwKTsKLW91dF91bmxvY2s6Ci0JZXhwX3dyaXRldW5sb2NrKCk7Ci1vdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIFVuZXhwb3J0IGEgZmlsZSBzeXN0ZW0uIFRoZSBleHBvcnQgZW50cnkgaGFzIGFscmVhZHkKLSAqIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBjbGllbnQncyBsaXN0IG9mIGV4cG9ydGVkIGZzJ3MuCi0gKi8KLXN0YXRpYyB2b2lkCi1leHBfZG9fdW5leHBvcnQoc3ZjX2V4cG9ydCAqdW5leHApCi17Ci0Jc3VucnBjX2ludmFsaWRhdGUoJnVuZXhwLT5oLCAmc3ZjX2V4cG9ydF9jYWNoZSk7Ci0JZXhwX3VuaGFzaCh1bmV4cCk7Ci0JZXhwX2ZzaWRfdW5oYXNoKHVuZXhwKTsKLX0KLQotCi0vKgotICogdW5leHBvcnQgc3lzY2FsbC4KLSAqLwotaW50Ci1leHBfdW5leHBvcnQoc3RydWN0IG5mc2N0bF9leHBvcnQgKm54cCkKLXsKLQlzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbTsKLQlzdmNfZXhwb3J0ICpleHA7Ci0Jc3RydWN0IHBhdGggcGF0aDsKLQlpbnQJCWVycjsKLQotCS8qIENvbnNpc3RlbmN5IGNoZWNrICovCi0JaWYgKCFleHBfdmVyaWZ5X3N0cmluZyhueHAtPmV4X3BhdGgsIE5GU19NQVhQQVRITEVOKSB8fAotCSAgICAhZXhwX3ZlcmlmeV9zdHJpbmcobnhwLT5leF9jbGllbnQsIE5GU0NMTlRfSURNQVgpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWV4cF93cml0ZWxvY2soKTsKLQotCWVyciA9IC1FSU5WQUw7Ci0JZG9tID0gYXV0aF9kb21haW5fZmluZChueHAtPmV4X2NsaWVudCk7Ci0JaWYgKCFkb20pIHsKLQkJZHByaW50aygibmZzZDogdW5leHBvcnQgY291bGRuJ3QgZmluZCAlc1xuIiwgbnhwLT5leF9jbGllbnQpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JZXJyID0ga2Vybl9wYXRoKG54cC0+ZXhfcGF0aCwgMCwgJnBhdGgpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2RvbWFpbjsKLQotCWVyciA9IC1FSU5WQUw7Ci0JZXhwID0gZXhwX2dldF9ieV9uYW1lKGRvbSwgJnBhdGgsIE5VTEwpOwotCXBhdGhfcHV0KCZwYXRoKTsKLQlpZiAoSVNfRVJSKGV4cCkpCi0JCWdvdG8gb3V0X2RvbWFpbjsKLQotCWV4cF9kb191bmV4cG9ydChleHApOwotCWV4cF9wdXQoZXhwKTsKLQllcnIgPSAwOwotCi1vdXRfZG9tYWluOgotCWF1dGhfZG9tYWluX3B1dChkb20pOwotCWNhY2hlX2ZsdXNoKCk7Ci1vdXRfdW5sb2NrOgotCWV4cF93cml0ZXVubG9jaygpOwotCXJldHVybiBlcnI7Ci19Ci0jZW5kaWYgLyogQ09ORklHX05GU0RfREVQUkVDQVRFRCAqLwogCiAvKgogICogT2J0YWluIHRoZSByb290IGZoIG9uIGJlaGFsZiBvZiBhIGNsaWVudC4KQEAgLTEzNjcsNyArMTA0Nyw2IEBACiAJdW5zaWduZWQgaGFzaCwgZXhwb3J0OwogCXN0cnVjdCBjYWNoZV9oZWFkICpjaDsKIAkKLQlleHBfcmVhZGxvY2soKTsKIAlyZWFkX2xvY2soJnN2Y19leHBvcnRfY2FjaGUuaGFzaF9sb2NrKTsKIAlpZiAoIW4tLSkKIAkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKQEAgLTE0MTgsNyArMTA5Nyw2IEBACiAJX19yZWxlYXNlcyhzdmNfZXhwb3J0X2NhY2hlLmhhc2hfbG9jaykKIHsKIAlyZWFkX3VubG9jaygmc3ZjX2V4cG9ydF9jYWNoZS5oYXNoX2xvY2spOwotCWV4cF9yZWFkdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmxhZ3MgewpAQCAtMTU1MCw5NyArMTIyOCw2IEBACiAJLnNob3cJPSBlX3Nob3csCiB9OwogCi0jaWZkZWYgQ09ORklHX05GU0RfREVQUkVDQVRFRAotLyoKLSAqIEFkZCBvciBtb2RpZnkgYSBjbGllbnQuCi0gKiBDaGFuZ2UgcmVxdWVzdHMgbWF5IGludm9sdmUgdGhlIGxpc3Qgb2YgaG9zdCBhZGRyZXNzZXMuIFRoZSBsaXN0IG9mCi0gKiBleHBvcnRzIGFuZCBwb3NzaWJseSBleGlzdGluZyB1aWQgbWFwcyBhcmUgbGVmdCB1bnRvdWNoZWQuCi0gKi8KLWludAotZXhwX2FkZGNsaWVudChzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqbmNwKQotewotCXN0cnVjdCBhdXRoX2RvbWFpbgkqZG9tOwotCWludAkJCWksIGVycjsKLQlzdHJ1Y3QgaW42X2FkZHIgYWRkcjY7Ci0KLQkvKiBGaXJzdCwgY29uc2lzdGVuY3kgY2hlY2suICovCi0JZXJyID0gLUVJTlZBTDsKLQlpZiAoISBleHBfdmVyaWZ5X3N0cmluZyhuY3AtPmNsX2lkZW50LCBORlNDTE5UX0lETUFYKSkKLQkJZ290byBvdXQ7Ci0JaWYgKG5jcC0+Y2xfbmFkZHIgPiBORlNDTE5UX0FERFJNQVgpCi0JCWdvdG8gb3V0OwotCi0JLyogTG9jayB0aGUgaGFzaHRhYmxlICovCi0JZXhwX3dyaXRlbG9jaygpOwotCi0JZG9tID0gdW5peF9kb21haW5fZmluZChuY3AtPmNsX2lkZW50KTsKLQotCWVyciA9IC1FTk9NRU07Ci0JaWYgKCFkb20pCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCS8qIEluc2VydCBjbGllbnQgaW50byBoYXNodGFibGUuICovCi0JZm9yIChpID0gMDsgaSA8IG5jcC0+Y2xfbmFkZHI7IGkrKykgewotCQlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKG5jcC0+Y2xfYWRkcmxpc3RbaV0uc19hZGRyLCAmYWRkcjYpOwotCQlhdXRoX3VuaXhfYWRkX2FkZHIoJmluaXRfbmV0LCAmYWRkcjYsIGRvbSk7Ci0JfQotCWF1dGhfdW5peF9mb3JnZXRfb2xkKGRvbSk7Ci0JYXV0aF9kb21haW5fcHV0KGRvbSk7Ci0KLQllcnIgPSAwOwotCi1vdXRfdW5sb2NrOgotCWV4cF93cml0ZXVubG9jaygpOwotb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBEZWxldGUgYSBjbGllbnQgZ2l2ZW4gYW4gaWRlbnRpZmllci4KLSAqLwotaW50Ci1leHBfZGVsY2xpZW50KHN0cnVjdCBuZnNjdGxfY2xpZW50ICpuY3ApCi17Ci0JaW50CQllcnI7Ci0Jc3RydWN0IGF1dGhfZG9tYWluICpkb207Ci0KLQllcnIgPSAtRUlOVkFMOwotCWlmICghZXhwX3ZlcmlmeV9zdHJpbmcobmNwLT5jbF9pZGVudCwgTkZTQ0xOVF9JRE1BWCkpCi0JCWdvdG8gb3V0OwotCi0JLyogTG9jayB0aGUgaGFzaHRhYmxlICovCi0JZXhwX3dyaXRlbG9jaygpOwotCi0JZG9tID0gYXV0aF9kb21haW5fZmluZChuY3AtPmNsX2lkZW50KTsKLQkvKiBqdXN0IG1ha2Ugc3VyZSB0aGF0IG5vIGFkZHJlc3NlcyB3b3JrIAotCSAqIGFuZCB0aGF0IGl0IHdpbGwgZXhwaXJlIHNvb24gCi0JICovCi0JaWYgKGRvbSkgewotCQllcnIgPSBhdXRoX3VuaXhfZm9yZ2V0X29sZChkb20pOwotCQlhdXRoX2RvbWFpbl9wdXQoZG9tKTsKLQl9Ci0KLQlleHBfd3JpdGV1bmxvY2soKTsKLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogVmVyaWZ5IHRoYXQgc3RyaW5nIGlzIG5vbi1lbXB0eSBhbmQgZG9lcyBub3QgZXhjZWVkIG1heCBsZW5ndGguCi0gKi8KLXN0YXRpYyBpbnQKLWV4cF92ZXJpZnlfc3RyaW5nKGNoYXIgKmNwLCBpbnQgbWF4KQotewotCWludAlpOwotCi0JZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKQotCQlpZiAoIWNwW2ldKQotCQkJcmV0dXJuIGk7Ci0JY3BbaV0gPSAwOwotCXByaW50ayhLRVJOX05PVElDRSAibmZzZDogY291bGRuJ3QgdmFsaWRhdGUgc3RyaW5nICVzXG4iLCBjcCk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX05GU0RfREVQUkVDQVRFRCAqLwogCiAvKgogICogSW5pdGlhbGl6ZSB0aGUgZXhwb3J0cyBtb2R1bGUuCkBAIC0xNjY3LDEwICsxMjU0LDggQEAKIHZvaWQKIG5mc2RfZXhwb3J0X2ZsdXNoKHZvaWQpCiB7Ci0JZXhwX3dyaXRlbG9jaygpOwogCWNhY2hlX3B1cmdlKCZzdmNfZXhwa2V5X2NhY2hlKTsKIAljYWNoZV9wdXJnZSgmc3ZjX2V4cG9ydF9jYWNoZSk7Ci0JZXhwX3dyaXRldW5sb2NrKCk7CiB9CiAKIC8qCkBAIC0xNjgyLDEyICsxMjY3LDkgQEAKIAogCWRwcmludGsoIm5mc2Q6IHNodXR0aW5nIGRvd24gZXhwb3J0IG1vZHVsZS5cbiIpOwogCi0JZXhwX3dyaXRlbG9jaygpOwotCiAJY2FjaGVfdW5yZWdpc3Rlcigmc3ZjX2V4cGtleV9jYWNoZSk7CiAJY2FjaGVfdW5yZWdpc3Rlcigmc3ZjX2V4cG9ydF9jYWNoZSk7CiAJc3ZjYXV0aF91bml4X3B1cmdlKCk7CiAKLQlleHBfd3JpdGV1bmxvY2soKTsKIAlkcHJpbnRrKCJuZnNkOiBleHBvcnQgc2h1dGRvd24gY29tcGxldGUuXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbG9ja2QuYyBiL2ZzL25mc2QvbG9ja2QuYwppbmRleCA3YzgzMWEyLi43N2U3YTVjIDEwMDY0NAotLS0gYS9mcy9uZnNkL2xvY2tkLmMKKysrIGIvZnMvbmZzZC9sb2NrZC5jCkBAIC0zNSwxMCArMzUsOCBAQAogCW1lbWNweSgoY2hhciopJmZoLmZoX2hhbmRsZS5maF9iYXNlLCBmLT5kYXRhLCBmLT5zaXplKTsKIAlmaC5maF9leHBvcnQgPSBOVUxMOwogCi0JZXhwX3JlYWRsb2NrKCk7CiAJbmZzZXJyID0gbmZzZF9vcGVuKHJxc3RwLCAmZmgsIFNfSUZSRUcsIE5GU0RfTUFZX0xPQ0ssIGZpbHApOwogCWZoX3B1dCgmZmgpOwotCWV4cF9yZWFkdW5sb2NrKCk7CiAgCS8qIFdlIHJldHVybiBubG0gZXJyb3IgY29kZXMgYXMgbmxtIGRvZXNuJ3Qga25vdwogCSAqIGFib3V0IG5mc2QsIGJ1dCBuZnNkIGRvZXMga25vdyBhYm91dCBubG0uLgogCSAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cHJvYy5jIGIvZnMvbmZzZC9uZnM0cHJvYy5jCmluZGV4IDNhNmRiZDcuLmU4MDc3NzYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHByb2MuYworKysgYi9mcy9uZnNkL25mczRwcm9jLmMKQEAgLTI5MSw2ICsyOTEsMTUgQEAKIAlpZiAob3Blbi0+b3BfY3JlYXRlICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgIT0gTkZTNF9PUEVOX0NMQUlNX05VTEwpCiAJCXJldHVybiBuZnNlcnJfaW52YWw7CiAKKwkvKgorCSAqIFJGQzU2NjEgMTguNTEuMworCSAqIEJlZm9yZSBSRUNMQUlNX0NPTVBMRVRFIGRvbmUsIHNlcnZlciBzaG91bGQgZGVueSBuZXcgbG9jaworCSAqLworCWlmIChuZnNkNF9oYXNfc2Vzc2lvbihjc3RhdGUpICYmCisJICAgICFjc3RhdGUtPnNlc3Npb24tPnNlX2NsaWVudC0+Y2xfZmlyc3RzdGF0ZSAmJgorCSAgICBvcGVuLT5vcF9jbGFpbV90eXBlICE9IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKKwkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKKwogCWlmIChuZnNkNF9oYXNfc2Vzc2lvbihjc3RhdGUpKQogCQljb3B5X2NsaWVudGlkKCZvcGVuLT5vcF9jbGllbnRpZCwgY3N0YXRlLT5zZXNzaW9uKTsKIApAQCAtOTk4LDYgKzEwMDcsMTUgQEAKIAluZnNkNG9wX2Z1bmMgb3BfZnVuYzsKIAl1MzIgb3BfZmxhZ3M7CiAJY2hhciAqb3BfbmFtZTsKKwkvKgorCSAqIFdlIHVzZSB0aGUgRFJDIGZvciBjb21wb3VuZHMgY29udGFpbmluZyBub24taWRlbXBvdGVudAorCSAqIG9wZXJhdGlvbnMsICpleGNlcHQqIHRob3NlIHRoYXQgYXJlIDQuMS1zcGVjaWZpYyAoc2luY2UKKwkgKiBzZXNzaW9ucyBwcm92aWRlIHRoZWlyIG93biBFT1MpLCBhbmQgZXhjZXB0IGZvciBzdGF0ZWZ1bAorCSAqIG9wZXJhdGlvbnMgb3RoZXIgdGhhbiBzZXRjbGllbnRpZCBhbmQgc2V0Y2xpZW50aWRfY29uZmlybQorCSAqIChzaW5jZSBzZXF1ZW5jZSBudW1iZXJzIHByb3ZpZGUgRU9TIGZvciBvcGVuLCBsb2NrLCBldGMgaW4KKwkgKiB0aGUgdjQuMCBjYXNlKS4KKwkgKi8KKwlib29sIG9wX2NhY2hlcmVzdWx0OwogfTsKIAogc3RhdGljIHN0cnVjdCBuZnNkNF9vcGVyYXRpb24gbmZzZDRfb3BzW107CkBAIC0xMDQyLDYgKzEwNjAsMTEgQEAKIAlyZXR1cm4gJm5mc2Q0X29wc1tvcC0+b3BudW1dOwogfQogCitib29sIG5mc2Q0X2NhY2hlX3RoaXNfb3Aoc3RydWN0IG5mc2Q0X29wICpvcCkKK3sKKwlyZXR1cm4gT1BERVNDKG9wKS0+b3BfY2FjaGVyZXN1bHQ7Cit9CisKIHN0YXRpYyBib29sIG5lZWRfd3JvbmdzZWNfY2hlY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKIHsKIAlzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AgPSBycXN0cC0+cnFfcmVzcDsKQEAgLTEyMDksNyArMTIzMiw2IEBACiAJZmhfcHV0KCZyZXNwLT5jc3RhdGUuc2F2ZV9maCk7CiAJQlVHX09OKHJlc3AtPmNzdGF0ZS5yZXBsYXlfb3duZXIpOwogb3V0OgotCW5mc2Q0X3JlbGVhc2VfY29tcG91bmRhcmdzKGFyZ3MpOwogCS8qIFJlc2V0IGRlZmVycmFsIG1lY2hhbmlzbSBmb3IgUlBDIGRlZmVycmFscyAqLwogCXJxc3RwLT5ycV91c2VkZWZlcnJhbCA9IDE7CiAJZHByaW50aygibmZzdjQgY29tcG91bmQgcmV0dXJuZWQgJWRcbiIsIG50b2hsKHN0YXR1cykpOwpAQCAtMTIzMiw2ICsxMjU0LDcgQEAKIAlbT1BfQ1JFQVRFXSA9IHsKIAkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X2NyZWF0ZSwKIAkJLm9wX25hbWUgPSAiT1BfQ1JFQVRFIiwKKwkJLm9wX2NhY2hlcmVzdWx0ID0gdHJ1ZSwKIAl9LAogCVtPUF9ERUxFR1JFVFVSTl0gPSB7CiAJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9kZWxlZ3JldHVybiwKQEAgLTEyNDksNiArMTI3Miw3IEBACiAJW09QX0xJTktdID0gewogCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfbGluaywKIAkJLm9wX25hbWUgPSAiT1BfTElOSyIsCisJCS5vcF9jYWNoZXJlc3VsdCA9IHRydWUsCiAJfSwKIAlbT1BfTE9DS10gPSB7CiAJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9sb2NrLApAQCAtMTMyMiwxMCArMTM0NiwxMiBAQAogCVtPUF9SRU1PVkVdID0gewogCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfcmVtb3ZlLAogCQkub3BfbmFtZSA9ICJPUF9SRU1PVkUiLAorCQkub3BfY2FjaGVyZXN1bHQgPSB0cnVlLAogCX0sCiAJW09QX1JFTkFNRV0gPSB7CiAJCS5vcF9uYW1lID0gIk9QX1JFTkFNRSIsCiAJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9yZW5hbWUsCisJCS5vcF9jYWNoZXJlc3VsdCA9IHRydWUsCiAJfSwKIAlbT1BfUkVORVddID0gewogCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfcmVuZXcsCkBAIC0xMzUxLDE2ICsxMzc3LDE5IEBACiAJW09QX1NFVEFUVFJdID0gewogCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfc2V0YXR0ciwKIAkJLm9wX25hbWUgPSAiT1BfU0VUQVRUUiIsCisJCS5vcF9jYWNoZXJlc3VsdCA9IHRydWUsCiAJfSwKIAlbT1BfU0VUQ0xJRU5USURdID0gewogCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfc2V0Y2xpZW50aWQsCiAJCS5vcF9mbGFncyA9IEFMTE9XRURfV0lUSE9VVF9GSCB8IEFMTE9XRURfT05fQUJTRU5UX0ZTLAogCQkub3BfbmFtZSA9ICJPUF9TRVRDTElFTlRJRCIsCisJCS5vcF9jYWNoZXJlc3VsdCA9IHRydWUsCiAJfSwKIAlbT1BfU0VUQ0xJRU5USURfQ09ORklSTV0gPSB7CiAJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9zZXRjbGllbnRpZF9jb25maXJtLAogCQkub3BfZmxhZ3MgPSBBTExPV0VEX1dJVEhPVVRfRkggfCBBTExPV0VEX09OX0FCU0VOVF9GUywKIAkJLm9wX25hbWUgPSAiT1BfU0VUQ0xJRU5USURfQ09ORklSTSIsCisJCS5vcF9jYWNoZXJlc3VsdCA9IHRydWUsCiAJfSwKIAlbT1BfVkVSSUZZXSA9IHsKIAkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3ZlcmlmeSwKQEAgLTEzNjksNiArMTM5OCw3IEBACiAJW09QX1dSSVRFXSA9IHsKIAkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3dyaXRlLAogCQkub3BfbmFtZSA9ICJPUF9XUklURSIsCisJCS5vcF9jYWNoZXJlc3VsdCA9IHRydWUsCiAJfSwKIAlbT1BfUkVMRUFTRV9MT0NLT1dORVJdID0gewogCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfcmVsZWFzZV9sb2Nrb3duZXIsCkBAIC0xNDAyLDYgKzE0MzIsMTEgQEAKIAkJLm9wX2ZsYWdzID0gQUxMT1dFRF9XSVRIT1VUX0ZIIHwgQUxMT1dFRF9BU19GSVJTVF9PUCwKIAkJLm9wX25hbWUgPSAiT1BfU0VRVUVOQ0UiLAogCX0sCisJW09QX0RFU1RST1lfQ0xJRU5USURdID0geworCQkub3BfZnVuYyA9IE5VTEwsCisJCS5vcF9mbGFncyA9IEFMTE9XRURfV0lUSE9VVF9GSCB8IEFMTE9XRURfQVNfRklSU1RfT1AsCisJCS5vcF9uYW1lID0gIk9QX0RFU1RST1lfQ0xJRU5USUQiLAorCX0sCiAJW09QX1JFQ0xBSU1fQ09NUExFVEVdID0gewogCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfcmVjbGFpbV9jb21wbGV0ZSwKIAkJLm9wX2ZsYWdzID0gQUxMT1dFRF9XSVRIT1VUX0ZILApAQCAtMTQxMiw2ICsxNDQ3LDE2IEBACiAJCS5vcF9mbGFncyA9IE9QX0hBTkRMRVNfV1JPTkdTRUMsCiAJCS5vcF9uYW1lID0gIk9QX1NFQ0lORk9fTk9fTkFNRSIsCiAJfSwKKwlbT1BfVEVTVF9TVEFURUlEXSA9IHsKKwkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3Rlc3Rfc3RhdGVpZCwKKwkJLm9wX2ZsYWdzID0gQUxMT1dFRF9XSVRIT1VUX0ZILAorCQkub3BfbmFtZSA9ICJPUF9URVNUX1NUQVRFSUQiLAorCX0sCisJW09QX0ZSRUVfU1RBVEVJRF0gPSB7CisJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9mcmVlX3N0YXRlaWQsCisJCS5vcF9mbGFncyA9IEFMTE9XRURfV0lUSE9VVF9GSCwKKwkJLm9wX25hbWUgPSAiT1BfRlJFRV9TVEFURUlEIiwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm5mc2Q0X29wX25hbWUodW5zaWduZWQgb3BudW0pCkBAIC0xNDI0LDE2ICsxNDY5LDYgQEAKICNkZWZpbmUgbmZzZDRfdm9pZHJlcwkJCW5mc2Q0X3ZvaWRhcmdzCiBzdHJ1Y3QgbmZzZDRfdm9pZGFyZ3MgeyBpbnQgZHVtbXk7IH07CiAKLS8qCi0gKiBUT0RPOiBBdCB0aGUgcHJlc2VudCB0aW1lLCB0aGUgTkZTdjQgc2VydmVyIGRvZXMgbm90IGRvIFhJRCBjYWNoaW5nCi0gKiBvZiByZXF1ZXN0cy4gIEltcGxlbWVudGluZyBYSUQgY2FjaGluZyB3b3VsZCBub3QgYmUgYSBzZXJpb3VzIHByb2JsZW0sCi0gKiBhbHRob3VnaCBpdCB3b3VsZCByZXF1aXJlIGEgbWlsZCBjaGFuZ2UgaW4gaW50ZXJmYWNlcyBzaW5jZSBvbmUKLSAqIGRvZXNuJ3Qga25vdyB3aGV0aGVyIGFuIE5GU3Y0IHJlcXVlc3QgaXMgaWRlbXBvdGVudCB1bnRpbCBhZnRlciB0aGUKLSAqIFhEUiBkZWNvZGUuICBIb3dldmVyLCBYSUQgY2FjaGluZyB0b3RhbGx5IGNvbmZ1c2VzIHB5bmZzIChQZXRlcgotICogQXN0cmFuZCdzIHJlZ3Jlc3Npb24gdGVzdHN1aXRlIGZvciBORlN2NCBzZXJ2ZXJzKSwgd2hpY2ggcmV1c2VzCi0gKiBYSUQncyBsaWJlcmFsbHksIHNvIEkndmUgbGVmdCBpdCB1bmltcGxlbWVudGVkIHVudGlsIHB5bmZzIGdlbmVyYXRlcwotICogYmV0dGVyIFhJRCdzLgotICovCiBzdGF0aWMgc3RydWN0IHN2Y19wcm9jZWR1cmUJCW5mc2RfcHJvY2VkdXJlczRbMl0gPSB7CiAJW05GU1BST0M0X05VTExdID0gewogCQkucGNfZnVuYyA9IChzdmNfcHJvY2Z1bmMpIG5mc2Q0X3Byb2NfbnVsbCwKQEAgLTE0NDksNiArMTQ4NCw3IEBACiAJCS5wY19lbmNvZGUgPSAoa3hkcnByb2NfdCkgbmZzNHN2Y19lbmNvZGVfY29tcG91bmRyZXMsCiAJCS5wY19hcmdzaXplID0gc2l6ZW9mKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MpLAogCQkucGNfcmVzc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMpLAorCQkucGNfcmVsZWFzZSA9IG5mc2Q0X3JlbGVhc2VfY29tcG91bmRhcmdzLAogCQkucGNfY2FjaGV0eXBlID0gUkNfTk9DQUNIRSwKIAkJLnBjX3hkcnJlc3NpemUgPSBORlNEX0JVRlNJWkUvNCwKIAl9LApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cmVjb3Zlci5jIGIvZnMvbmZzZC9uZnM0cmVjb3Zlci5jCmluZGV4IGZmYjU5ZWYuLjI5ZDc3ZjYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHJlY292ZXIuYworKysgYi9mcy9uZnNkL25mczRyZWNvdmVyLmMKQEAgLTE5MSw1MiArMTkxLDQyIEBACiB9CiAKIHN0YXRpYyBpbnQKLW5mc2Q0X2xpc3RfcmVjX2RpcihzdHJ1Y3QgZGVudHJ5ICpkaXIsIHJlY2Rpcl9mdW5jICpmKQorbmZzZDRfbGlzdF9yZWNfZGlyKHJlY2Rpcl9mdW5jICpmKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpvcmlnaW5hbF9jcmVkOwotCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCBkZW50cnkgKmRpciA9IHJlY19maWxlLT5mX3BhdGguZGVudHJ5OwogCUxJU1RfSEVBRChuYW1lcyk7Ci0Jc3RydWN0IG5hbWVfbGlzdCAqZW50cnk7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCWludCBzdGF0dXM7CiAKLQlpZiAoIXJlY19maWxlKQotCQlyZXR1cm4gMDsKLQogCXN0YXR1cyA9IG5mczRfc2F2ZV9jcmVkcygmb3JpZ2luYWxfY3JlZCk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCXJldHVybiBzdGF0dXM7CiAKLQlmaWxwID0gZGVudHJ5X29wZW4oZGdldChkaXIpLCBtbnRnZXQocmVjX2ZpbGUtPmZfcGF0aC5tbnQpLCBPX1JET05MWSwKLQkJCSAgIGN1cnJlbnRfY3JlZCgpKTsKLQlzdGF0dXMgPSBQVFJfRVJSKGZpbHApOwotCWlmIChJU19FUlIoZmlscCkpCi0JCWdvdG8gb3V0OwotCXN0YXR1cyA9IHZmc19yZWFkZGlyKGZpbHAsIG5mc2Q0X2J1aWxkX25hbWVsaXN0LCAmbmFtZXMpOwotCWZwdXQoZmlscCk7CisJc3RhdHVzID0gdmZzX2xsc2VlayhyZWNfZmlsZSwgMCwgU0VFS19TRVQpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW5mczRfcmVzZXRfY3JlZHMob3JpZ2luYWxfY3JlZCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gdmZzX3JlYWRkaXIocmVjX2ZpbGUsIG5mc2Q0X2J1aWxkX25hbWVsaXN0LCAmbmFtZXMpOwogCW11dGV4X2xvY2tfbmVzdGVkKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfUEFSRU5UKTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJm5hbWVzKSkgeworCQlzdHJ1Y3QgbmFtZV9saXN0ICplbnRyeTsKIAkJZW50cnkgPSBsaXN0X2VudHJ5KG5hbWVzLm5leHQsIHN0cnVjdCBuYW1lX2xpc3QsIGxpc3QpOwotCi0JCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKGVudHJ5LT5uYW1lLCBkaXIsIEhFWERJUl9MRU4tMSk7Ci0JCWlmIChJU19FUlIoZGVudHJ5KSkgewotCQkJc3RhdHVzID0gUFRSX0VSUihkZW50cnkpOwotCQkJYnJlYWs7CisJCWlmICghc3RhdHVzKSB7CisJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJCQlkZW50cnkgPSBsb29rdXBfb25lX2xlbihlbnRyeS0+bmFtZSwgZGlyLCBIRVhESVJfTEVOLTEpOworCQkJaWYgKElTX0VSUihkZW50cnkpKSB7CisJCQkJc3RhdHVzID0gUFRSX0VSUihkZW50cnkpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3RhdHVzID0gZihkaXIsIGRlbnRyeSk7CisJCQlkcHV0KGRlbnRyeSk7CiAJCX0KLQkJc3RhdHVzID0gZihkaXIsIGRlbnRyeSk7Ci0JCWRwdXQoZGVudHJ5KTsKLQkJaWYgKHN0YXR1cykKLQkJCWJyZWFrOwogCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwogCQlrZnJlZShlbnRyeSk7CiAJfQogCW11dGV4X3VubG9jaygmZGlyLT5kX2lub2RlLT5pX211dGV4KTsKLW91dDoKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJm5hbWVzKSkgewotCQllbnRyeSA9IGxpc3RfZW50cnkobmFtZXMubmV4dCwgc3RydWN0IG5hbWVfbGlzdCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0JCWtmcmVlKGVudHJ5KTsKLQl9CiAJbmZzNF9yZXNldF9jcmVkcyhvcmlnaW5hbF9jcmVkKTsKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMzIyLDcgKzMxMiw3IEBACiAJc3RhdHVzID0gbW50X3dhbnRfd3JpdGUocmVjX2ZpbGUtPmZfcGF0aC5tbnQpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IG5mc2Q0X2xpc3RfcmVjX2RpcihyZWNfZmlsZS0+Zl9wYXRoLmRlbnRyeSwgcHVyZ2Vfb2xkKTsKKwlzdGF0dXMgPSBuZnNkNF9saXN0X3JlY19kaXIocHVyZ2Vfb2xkKTsKIAlpZiAoc3RhdHVzID09IDApCiAJCXZmc19mc3luYyhyZWNfZmlsZSwgMCk7CiAJbW50X2Ryb3Bfd3JpdGUocmVjX2ZpbGUtPmZfcGF0aC5tbnQpOwpAQCAtMzUyLDcgKzM0Miw3IEBACiAJaWYgKCFyZWNfZmlsZSkKIAkJcmV0dXJuIDA7CiAKLQlzdGF0dXMgPSBuZnNkNF9saXN0X3JlY19kaXIocmVjX2ZpbGUtPmZfcGF0aC5kZW50cnksIGxvYWRfcmVjZGlyKTsKKwlzdGF0dXMgPSBuZnNkNF9saXN0X3JlY19kaXIobG9hZF9yZWNkaXIpOwogCWlmIChzdGF0dXMpCiAJCXByaW50aygibmZzZDQ6IGZhaWxlZCBsb2FkaW5nIGNsaWVudHMgZnJvbSByZWNvdmVyeSIKIAkJCSIgZGlyZWN0b3J5ICVzXG4iLCByZWNfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0c3RhdGUuYyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKaW5kZXggZTk4ZjNjMi4uMzc4N2VjMSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0c3RhdGUuYworKysgYi9mcy9uZnNkL25mczRzdGF0ZS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgogI2luY2x1ZGUgInhkcjQuaCIKQEAgLTYwLDkgKzYxLDEyIEBACiAKIC8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCiBzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVpZCAqIGZpbmRfc3RhdGVpZChzdGF0ZWlkX3QgKnN0aWQsIGludCBmbGFncyk7CitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVpZCAqIHNlYXJjaF9mb3Jfc3RhdGVpZChzdGF0ZWlkX3QgKnN0aWQpOworc3RhdGljIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKiBzZWFyY2hfZm9yX2RlbGVnYXRpb24oc3RhdGVpZF90ICpzdGlkKTsKIHN0YXRpYyBzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICogZmluZF9kZWxlZ2F0aW9uX3N0YXRlaWQoc3RydWN0IGlub2RlICppbm8sIHN0YXRlaWRfdCAqc3RpZCk7CiBzdGF0aWMgY2hhciB1c2VyX3JlY292ZXJ5X2Rpcm5hbWVbUEFUSF9NQVhdID0gIi92YXIvbGliL25mcy92NHJlY292ZXJ5IjsKIHN0YXRpYyB2b2lkIG5mczRfc2V0X3JlY2RpcihjaGFyICpyZWNkaXIpOworc3RhdGljIGludCBjaGVja19mb3JfbG9ja3Moc3RydWN0IG5mczRfZmlsZSAqZmlscCwgc3RydWN0IG5mczRfc3RhdGVvd25lciAqbG93bmVyKTsKIAogLyogTG9ja2luZzogKi8KIApAQCAtMzgxLDE0ICszODUsNiBAQAogCUJVRygpOwogfQogCi1zdGF0aWMgaW50IG5mczRfYWNjZXNzX2JtYXBfdG9fb21vZGUoc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwKQotewotCXVuc2lnbmVkIGludCBhY2Nlc3M7Ci0KLQlzZXRfYWNjZXNzKCZhY2Nlc3MsIHN0cC0+c3RfYWNjZXNzX2JtYXApOwotCXJldHVybiBuZnM0X2FjY2Vzc190b19vbW9kZShhY2Nlc3MpOwotfQotCiBzdGF0aWMgdm9pZCB1bmhhc2hfZ2VuZXJpY19zdGF0ZWlkKHN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCkKIHsKIAlsaXN0X2RlbCgmc3RwLT5zdF9oYXNoKTsKQEAgLTM5OCwxMSArMzk0LDE0IEBACiAKIHN0YXRpYyB2b2lkIGZyZWVfZ2VuZXJpY19zdGF0ZWlkKHN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCkKIHsKLQlpbnQgb2ZsYWc7CisJaW50IGk7CiAKIAlpZiAoc3RwLT5zdF9hY2Nlc3NfYm1hcCkgewotCQlvZmxhZyA9IG5mczRfYWNjZXNzX2JtYXBfdG9fb21vZGUoc3RwKTsKLQkJbmZzNF9maWxlX3B1dF9hY2Nlc3Moc3RwLT5zdF9maWxlLCBvZmxhZyk7CisJCWZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKwkJCWlmICh0ZXN0X2JpdChpLCAmc3RwLT5zdF9hY2Nlc3NfYm1hcCkpCisJCQkJbmZzNF9maWxlX3B1dF9hY2Nlc3Moc3RwLT5zdF9maWxlLAorCQkJCQkJbmZzNF9hY2Nlc3NfdG9fb21vZGUoaSkpOworCQl9CiAJfQogCXB1dF9uZnM0X2ZpbGUoc3RwLT5zdF9maWxlKTsKIAlrbWVtX2NhY2hlX2ZyZWUoc3RhdGVpZF9zbGFiLCBzdHApOwpAQCAtMTUwNyw2ICsxNTA2LDI5IEBACiAJcmV0dXJuIHNsb3QtPnNsX3N0YXR1czsKIH0KIAorI2RlZmluZSBORlNEX01JTl9SRVFfSERSX1NFUV9TWgkoKFwKKwkJCTIgKiAyICsgLyogY3JlZGVudGlhbCx2ZXJpZmllcjogQVVUSF9OVUxMLCBsZW5ndGggMCAqLyBcCisJCQkxICsJLyogTUlOIHRhZyBpcyBsZW5ndGggd2l0aCB6ZXJvLCBvbmx5IGxlbmd0aCAqLyBcCisJCQkzICsJLyogdmVyc2lvbiwgb3Bjb3VudCwgb3Bjb2RlICovIFwKKwkJCVhEUl9RVUFETEVOKE5GUzRfTUFYX1NFU1NJT05JRF9MRU4pICsgXAorCQkJCS8qIHNlcWlkLCBzbG90SUQsIHNsb3RJRCwgY2FjaGUgKi8gXAorCQkJNCApICogc2l6ZW9mKF9fYmUzMikpCisKKyNkZWZpbmUgTkZTRF9NSU5fUkVTUF9IRFJfU0VRX1NaICgoXAorCQkJMiArCS8qIHZlcmlmaWVyOiBBVVRIX05VTEwsIGxlbmd0aCAwICovXAorCQkJMSArCS8qIHN0YXR1cyAqLyBcCisJCQkxICsJLyogTUlOIHRhZyBpcyBsZW5ndGggd2l0aCB6ZXJvLCBvbmx5IGxlbmd0aCAqLyBcCisJCQkzICsJLyogb3Bjb3VudCwgb3Bjb2RlLCBvcHN0YXR1cyovIFwKKwkJCVhEUl9RVUFETEVOKE5GUzRfTUFYX1NFU1NJT05JRF9MRU4pICsgXAorCQkJCS8qIHNlcWlkLCBzbG90SUQsIHNsb3RJRCwgc2xvdElELCBzdGF0dXMgKi8gXAorCQkJNSApICogc2l6ZW9mKF9fYmUzMikpCisKK3N0YXRpYyBfX2JlMzIgY2hlY2tfZm9yZWNoYW5uZWxfYXR0cnMoc3RydWN0IG5mc2Q0X2NoYW5uZWxfYXR0cnMgZmNoYW5uZWwpCit7CisJcmV0dXJuIGZjaGFubmVsLm1heHJlcV9zeiA8IE5GU0RfTUlOX1JFUV9IRFJfU0VRX1NaCisJCXx8IGZjaGFubmVsLm1heHJlc3Bfc3ogPCBORlNEX01JTl9SRVNQX0hEUl9TRVFfU1o7Cit9CisKIF9fYmUzMgogbmZzZDRfY3JlYXRlX3Nlc3Npb24oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKIAkJICAgICBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKQEAgLTE1NzUsNiArMTU5NywxMCBAQAogCWNyX3Nlcy0+ZmxhZ3MgJj0gflNFU1NJT040X1BFUlNJU1Q7CiAJY3Jfc2VzLT5mbGFncyAmPSB+U0VTU0lPTjRfUkRNQTsKIAorCXN0YXR1cyA9IG5mc2Vycl90b29zbWFsbDsKKwlpZiAoY2hlY2tfZm9yZWNoYW5uZWxfYXR0cnMoY3Jfc2VzLT5mb3JlX2NoYW5uZWwpKQorCQlnb3RvIG91dDsKKwogCXN0YXR1cyA9IG5mc2Vycl9qdWtlYm94OwogCW5ldyA9IGFsbG9jX2luaXRfc2Vzc2lvbihycXN0cCwgY29uZiwgY3Jfc2VzKTsKIAlpZiAoIW5ldykKQEAgLTE3MzYsNiArMTc2MiwxNCBAQAogCXJldHVybiBhcmdzLT5vcGNudCA+IHNlc3Npb24tPnNlX2ZjaGFubmVsLm1heG9wczsKIH0KIAorc3RhdGljIGJvb2wgbmZzZDRfcmVxdWVzdF90b29fYmlnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCQkJICBzdHJ1Y3QgbmZzZDRfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlzdHJ1Y3QgeGRyX2J1ZiAqeGIgPSAmcnFzdHAtPnJxX2FyZzsKKworCXJldHVybiB4Yi0+bGVuID4gc2Vzc2lvbi0+c2VfZmNoYW5uZWwubWF4cmVxX3N6OworfQorCiBfX2JlMzIKIG5mc2Q0X3NlcXVlbmNlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCiAJICAgICAgIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLApAQCAtMTc2OCw2ICsxODAyLDEwIEBACiAJaWYgKG5mc2Q0X3Nlc3Npb25fdG9vX21hbnlfb3BzKHJxc3RwLCBzZXNzaW9uKSkKIAkJZ290byBvdXQ7CiAKKwlzdGF0dXMgPSBuZnNlcnJfcmVxX3Rvb19iaWc7CisJaWYgKG5mc2Q0X3JlcXVlc3RfdG9vX2JpZyhycXN0cCwgc2Vzc2lvbikpCisJCWdvdG8gb3V0OworCiAJc3RhdHVzID0gbmZzZXJyX2JhZHNsb3Q7CiAJaWYgKHNlcS0+c2xvdGlkID49IHNlc3Npb24tPnNlX2ZjaGFubmVsLm1heHJlcXMpCiAJCWdvdG8gb3V0OwpAQCAtMjMzNywxNSArMjM3NSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1uZnM0X2ZpbGVfZG93bmdyYWRlKHN0cnVjdCBuZnM0X2ZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgc2hhcmVfYWNjZXNzKQotewotCWlmIChzaGFyZV9hY2Nlc3MgJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURSkKLQkJbmZzNF9maWxlX3B1dF9hY2Nlc3MoZnAsIE9fV1JPTkxZKTsKLQlpZiAoc2hhcmVfYWNjZXNzICYgTkZTNF9TSEFSRV9BQ0NFU1NfUkVBRCkKLQkJbmZzNF9maWxlX3B1dF9hY2Nlc3MoZnAsIE9fUkRPTkxZKTsKLX0KLQogc3RhdGljIHZvaWQgbmZzZF9icmVha19vbmVfZGVsZWcoc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHApCiB7CiAJLyogV2UncmUgYXNzdW1pbmcgdGhlIHN0YXRlIGNvZGUgbmV2ZXIgZHJvcHMgaXRzIHJlZmVyZW5jZQpAQCAtMjM5Niw4ICsyNDI1LDggQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBsb2NrX21hbmFnZXJfb3BlcmF0aW9ucyBuZnNkX2xlYXNlX21uZ19vcHMgPSB7Ci0JLmZsX2JyZWFrID0gbmZzZF9icmVha19kZWxlZ19jYiwKLQkuZmxfY2hhbmdlID0gbmZzZF9jaGFuZ2VfZGVsZWdfY2IsCisJLmxtX2JyZWFrID0gbmZzZF9icmVha19kZWxlZ19jYiwKKwkubG1fY2hhbmdlID0gbmZzZF9jaGFuZ2VfZGVsZWdfY2IsCiB9OwogCiAKQEAgLTI1NTYsMTIgKzI1ODUsMTggQEAKIAlyZXR1cm4gZmxhZ3M7CiB9CiAKLXN0YXRpYyBfX2JlMzIgbmZzNF9nZXRfdmZzX2ZpbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mczRfZmlsZQotKmZwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJfZmgsIHUzMiBuZnM0X2FjY2VzcykKK3N0YXRpYyBfX2JlMzIgbmZzNF9nZXRfdmZzX2ZpbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mczRfZmlsZSAqZnAsCisJCXN0cnVjdCBzdmNfZmggKmN1cl9maCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCiB7CiAJX19iZTMyIHN0YXR1czsKLQlpbnQgb2ZsYWcgPSBuZnM0X2FjY2Vzc190b19vbW9kZShuZnM0X2FjY2Vzcyk7Ci0JaW50IGFjY2VzcyA9IG5mczRfYWNjZXNzX3RvX2FjY2VzcyhuZnM0X2FjY2Vzcyk7CisJaW50IG9mbGFnID0gbmZzNF9hY2Nlc3NfdG9fb21vZGUob3Blbi0+b3Bfc2hhcmVfYWNjZXNzKTsKKwlpbnQgYWNjZXNzID0gbmZzNF9hY2Nlc3NfdG9fYWNjZXNzKG9wZW4tPm9wX3NoYXJlX2FjY2Vzcyk7CisKKwkvKiBDTEFJTV9ERUxFR0FURV9DVVIgaXMgdXNlZCBpbiByZXNwb25zZSB0byBhIGJyb2tlbiBsZWFzZTsKKwkgKiBhbGxvd2luZyBpdCB0byBicmVhayB0aGUgbGVhc2UgYW5kIHJldHVybiBFQUdBSU4gbGVhdmVzIHRoZQorCSAqIGNsaWVudCB1bmFibGUgdG8gbWFrZSBwcm9ncmVzcyBpbiByZXR1cm5pbmcgdGhlIGRlbGVnYXRpb24gKi8KKwlpZiAob3Blbi0+b3BfY2xhaW1fdHlwZSA9PSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSKQorCQlhY2Nlc3MgfD0gTkZTRF9NQVlfTk9UX0JSRUFLX0xFQVNFOwogCiAJaWYgKCFmcC0+ZmlfZmRzW29mbGFnXSkgewogCQlzdGF0dXMgPSBuZnNkX29wZW4ocnFzdHAsIGN1cl9maCwgU19JRlJFRywgYWNjZXNzLApAQCAtMjU4Niw3ICsyNjIxLDcgQEAKIAlpZiAoc3RwID09IE5VTEwpCiAJCXJldHVybiBuZnNlcnJfcmVzb3VyY2U7CiAKLQlzdGF0dXMgPSBuZnM0X2dldF92ZnNfZmlsZShycXN0cCwgZnAsIGN1cl9maCwgb3Blbi0+b3Bfc2hhcmVfYWNjZXNzKTsKKwlzdGF0dXMgPSBuZnM0X2dldF92ZnNfZmlsZShycXN0cCwgZnAsIGN1cl9maCwgb3Blbik7CiAJaWYgKHN0YXR1cykgewogCQlrbWVtX2NhY2hlX2ZyZWUoc3RhdGVpZF9zbGFiLCBzdHApOwogCQlyZXR1cm4gc3RhdHVzOwpAQCAtMjYxOSwxNCArMjY1NCwxNCBAQAogCiAJbmV3X2FjY2VzcyA9ICF0ZXN0X2JpdChvcF9zaGFyZV9hY2Nlc3MsICZzdHAtPnN0X2FjY2Vzc19ibWFwKTsKIAlpZiAobmV3X2FjY2VzcykgewotCQlzdGF0dXMgPSBuZnM0X2dldF92ZnNfZmlsZShycXN0cCwgZnAsIGN1cl9maCwgb3Bfc2hhcmVfYWNjZXNzKTsKKwkJc3RhdHVzID0gbmZzNF9nZXRfdmZzX2ZpbGUocnFzdHAsIGZwLCBjdXJfZmgsIG9wZW4pOwogCQlpZiAoc3RhdHVzKQogCQkJcmV0dXJuIHN0YXR1czsKIAl9CiAJc3RhdHVzID0gbmZzZDRfdHJ1bmNhdGUocnFzdHAsIGN1cl9maCwgb3Blbik7CiAJaWYgKHN0YXR1cykgewogCQlpZiAobmV3X2FjY2VzcykgewotCQkJaW50IG9mbGFnID0gbmZzNF9hY2Nlc3NfdG9fb21vZGUobmV3X2FjY2Vzcyk7CisJCQlpbnQgb2ZsYWcgPSBuZnM0X2FjY2Vzc190b19vbW9kZShvcF9zaGFyZV9hY2Nlc3MpOwogCQkJbmZzNF9maWxlX3B1dF9hY2Nlc3MoZnAsIG9mbGFnKTsKIAkJfQogCQlyZXR1cm4gc3RhdHVzOwpAQCAtMzEzNyw2ICszMTcyLDM3IEBACiAJcmV0dXJuIHN0YXRlaWQtPnNpX2ZpbGVpZCA9PSAwOwogfQogCitzdGF0aWMgaW50IGlzX29wZW5fc3RhdGVpZChzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKQoreworCXJldHVybiBzdGF0ZWlkLT5zdF9vcGVuc3RwID09IE5VTEw7Cit9CisKK19fYmUzMiBuZnM0X3ZhbGlkYXRlX3N0YXRlaWQoc3RhdGVpZF90ICpzdGF0ZWlkLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwID0gTlVMTDsKKwlfX2JlMzIgc3RhdHVzID0gbmZzZXJyX3N0YWxlX3N0YXRlaWQ7CisKKwlpZiAoU1RBTEVfU1RBVEVJRChzdGF0ZWlkKSkKKwkJZ290byBvdXQ7CisKKwlzdGF0dXMgPSBuZnNlcnJfZXhwaXJlZDsKKwlzdHAgPSBzZWFyY2hfZm9yX3N0YXRlaWQoc3RhdGVpZCk7CisJaWYgKCFzdHApCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IG5mc2Vycl9iYWRfc3RhdGVpZDsKKworCWlmICghc3RwLT5zdF9zdGF0ZW93bmVyLT5zb19jb25maXJtZWQpCisJCWdvdG8gb3V0OworCisJc3RhdHVzID0gY2hlY2tfc3RhdGVpZF9nZW5lcmF0aW9uKHN0YXRlaWQsICZzdHAtPnN0X3N0YXRlaWQsIGZsYWdzKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKworCXN0YXR1cyA9IG5mc19vazsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCiAvKgogKiBDaGVja3MgZm9yIHN0YXRlaWQgb3BlcmF0aW9ucwogKi8KQEAgLTMyMTYsNiArMzI4Miw4MSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBfX2JlMzIKK25mc2Q0X2ZyZWVfZGVsZWdhdGlvbl9zdGF0ZWlkKHN0YXRlaWRfdCAqc3RhdGVpZCkKK3sKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCA9IHNlYXJjaF9mb3JfZGVsZWdhdGlvbihzdGF0ZWlkKTsKKwlpZiAoZHApCisJCXJldHVybiBuZnNlcnJfbG9ja3NfaGVsZDsKKwlyZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOworfQorCitzdGF0aWMgX19iZTMyCituZnNkNF9mcmVlX2xvY2tfc3RhdGVpZChzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHApCit7CisJaWYgKGNoZWNrX2Zvcl9sb2NrcyhzdHAtPnN0X2ZpbGUsIHN0cC0+c3Rfc3RhdGVvd25lcikpCisJCXJldHVybiBuZnNlcnJfbG9ja3NfaGVsZDsKKwlyZWxlYXNlX2xvY2tfc3RhdGVpZChzdHApOworCXJldHVybiBuZnNfb2s7Cit9CisKKy8qCisgKiBUZXN0IGlmIHRoZSBzdGF0ZWlkIGlzIHZhbGlkCisgKi8KK19fYmUzMgorbmZzZDRfdGVzdF9zdGF0ZWlkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCQkgICBzdHJ1Y3QgbmZzZDRfdGVzdF9zdGF0ZWlkICp0ZXN0X3N0YXRlaWQpCit7CisJdGVzdF9zdGF0ZWlkLT50c19oYXNfc2Vzc2lvbiA9IG5mc2Q0X2hhc19zZXNzaW9uKGNzdGF0ZSk7CisJcmV0dXJuIG5mc19vazsKK30KKworLyoKKyAqIEZyZWUgYSBzdGF0ZSBpZAorICovCitfX2JlMzIKK25mc2Q0X2ZyZWVfc3RhdGVpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkJICAgc3RydWN0IG5mc2Q0X2ZyZWVfc3RhdGVpZCAqZnJlZV9zdGF0ZWlkKQoreworCXN0YXRlaWRfdCAqc3RhdGVpZCA9ICZmcmVlX3N0YXRlaWQtPmZyX3N0YXRlaWQ7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOworCV9fYmUzMiByZXQ7CisKKwluZnM0X2xvY2tfc3RhdGUoKTsKKwlpZiAoaXNfZGVsZWdhdGlvbl9zdGF0ZWlkKHN0YXRlaWQpKSB7CisJCXJldCA9IG5mc2Q0X2ZyZWVfZGVsZWdhdGlvbl9zdGF0ZWlkKHN0YXRlaWQpOworCQlnb3RvIG91dDsKKwl9CisKKwlzdHAgPSBzZWFyY2hfZm9yX3N0YXRlaWQoc3RhdGVpZCk7CisJaWYgKCFzdHApIHsKKwkJcmV0ID0gbmZzZXJyX2JhZF9zdGF0ZWlkOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHN0YXRlaWQtPnNpX2dlbmVyYXRpb24gIT0gMCkgeworCQlpZiAoc3RhdGVpZC0+c2lfZ2VuZXJhdGlvbiA8IHN0cC0+c3Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKSB7CisJCQlyZXQgPSBuZnNlcnJfb2xkX3N0YXRlaWQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoc3RhdGVpZC0+c2lfZ2VuZXJhdGlvbiA+IHN0cC0+c3Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKSB7CisJCQlyZXQgPSBuZnNlcnJfYmFkX3N0YXRlaWQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChpc19vcGVuX3N0YXRlaWQoc3RwKSkgeworCQlyZXQgPSBuZnNlcnJfbG9ja3NfaGVsZDsKKwkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gbmZzZDRfZnJlZV9sb2NrX3N0YXRlaWQoc3RwKTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW5saW5lIGludAogc2V0bGtmbGcgKGludCB0eXBlKQogewpAQCAtMzM4NCwxOCArMzUyNSwxNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLQotLyoKLSAqIHVuc2V0IGFsbCBiaXRzIGluIHVuaW9uIGJpdG1hcCAoYm1hcCkgdGhhdAotICogZG8gbm90IGV4aXN0IGluIHNoYXJlIChmcm9tIHN1Y2Nlc3NmdWwgT1BFTl9ET1dOR1JBREUpCi0gKi8KLXN0YXRpYyB2b2lkCi1yZXNldF91bmlvbl9ibWFwX2FjY2Vzcyh1bnNpZ25lZCBsb25nIGFjY2VzcywgdW5zaWduZWQgbG9uZyAqYm1hcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnM0X2ZpbGVfZG93bmdyYWRlKHN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCwgdW5zaWduZWQgaW50IHRvX2FjY2VzcykKIHsKIAlpbnQgaTsKKwogCWZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKLQkJaWYgKChpICYgYWNjZXNzKSAhPSBpKQotCQkJX19jbGVhcl9iaXQoaSwgYm1hcCk7CisJCWlmICh0ZXN0X2JpdChpLCAmc3RwLT5zdF9hY2Nlc3NfYm1hcCkgJiYgIShpICYgdG9fYWNjZXNzKSkgeworCQkJbmZzNF9maWxlX3B1dF9hY2Nlc3Moc3RwLT5zdF9maWxlLCBpKTsKKwkJCV9fY2xlYXJfYml0KGksICZzdHAtPnN0X2FjY2Vzc19ibWFwKTsKKwkJfQogCX0KIH0KIApAQCAtMzQxNiw3ICszNTU0LDYgQEAKIHsKIAlfX2JlMzIgc3RhdHVzOwogCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKLQl1bnNpZ25lZCBpbnQgc2hhcmVfYWNjZXNzOwogCiAJZHByaW50aygiTkZTRDogbmZzZDRfb3Blbl9kb3duZ3JhZGUgb24gZmlsZSAlLipzXG4iLCAKIAkJCShpbnQpY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeS0+ZF9uYW1lLmxlbiwKQEAgLTM0NDUsMTAgKzM1ODIsOCBAQAogCQkJc3RwLT5zdF9kZW55X2JtYXAsIG9kLT5vZF9zaGFyZV9kZW55KTsKIAkJZ290byBvdXQ7CiAJfQotCXNldF9hY2Nlc3MoJnNoYXJlX2FjY2Vzcywgc3RwLT5zdF9hY2Nlc3NfYm1hcCk7Ci0JbmZzNF9maWxlX2Rvd25ncmFkZShzdHAtPnN0X2ZpbGUsIHNoYXJlX2FjY2VzcyAmIH5vZC0+b2Rfc2hhcmVfYWNjZXNzKTsKKwluZnM0X2ZpbGVfZG93bmdyYWRlKHN0cCwgb2QtPm9kX3NoYXJlX2FjY2Vzcyk7CiAKLQlyZXNldF91bmlvbl9ibWFwX2FjY2VzcyhvZC0+b2Rfc2hhcmVfYWNjZXNzLCAmc3RwLT5zdF9hY2Nlc3NfYm1hcCk7CiAJcmVzZXRfdW5pb25fYm1hcF9kZW55KG9kLT5vZF9zaGFyZV9kZW55LCAmc3RwLT5zdF9kZW55X2JtYXApOwogCiAJdXBkYXRlX3N0YXRlaWQoJnN0cC0+c3Rfc3RhdGVpZCk7CkBAIC0zNTk0LDYgKzM3MjksMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkCWxvY2tfb3duZXJzdHJfaGFzaHRibFtMT0NLX0hBU0hfU0laRV07CiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBsb2Nrc3RhdGVpZF9oYXNodGJsW1NUQVRFSURfSEFTSF9TSVpFXTsKIAorc3RhdGljIGludAorc2FtZV9zdGF0ZWlkKHN0YXRlaWRfdCAqaWRfb25lLCBzdGF0ZWlkX3QgKmlkX3R3bykKK3sKKwlpZiAoaWRfb25lLT5zaV9zdGF0ZW93bmVyaWQgIT0gaWRfdHdvLT5zaV9zdGF0ZW93bmVyaWQpCisJCXJldHVybiAwOworCXJldHVybiBpZF9vbmUtPnNpX2ZpbGVpZCA9PSBpZF90d28tPnNpX2ZpbGVpZDsKK30KKwogc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlaWQgKgogZmluZF9zdGF0ZWlkKHN0YXRlaWRfdCAqc3RpZCwgaW50IGZsYWdzKQogewpAQCAtMzYyMyw2ICszNzY2LDQ0IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICoKK3NlYXJjaF9mb3Jfc3RhdGVpZChzdGF0ZWlkX3QgKnN0aWQpCit7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqbG9jYWw7CisJdW5zaWduZWQgaW50IGhhc2h2YWwgPSBzdGF0ZWlkX2hhc2h2YWwoc3RpZC0+c2lfc3RhdGVvd25lcmlkLCBzdGlkLT5zaV9maWxlaWQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJmxvY2tzdGF0ZWlkX2hhc2h0YmxbaGFzaHZhbF0sIHN0X2hhc2gpIHsKKwkJaWYgKHNhbWVfc3RhdGVpZCgmbG9jYWwtPnN0X3N0YXRlaWQsIHN0aWQpKQorCQkJcmV0dXJuIGxvY2FsOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jYWwsICZzdGF0ZWlkX2hhc2h0YmxbaGFzaHZhbF0sIHN0X2hhc2gpIHsKKwkJaWYgKHNhbWVfc3RhdGVpZCgmbG9jYWwtPnN0X3N0YXRlaWQsIHN0aWQpKQorCQkJcmV0dXJuIGxvY2FsOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKgorc2VhcmNoX2Zvcl9kZWxlZ2F0aW9uKHN0YXRlaWRfdCAqc3RpZCkKK3sKKwlzdHJ1Y3QgbmZzNF9maWxlICpmcDsKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRklMRV9IQVNIX1NJWkU7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZwLCAmZmlsZV9oYXNodGJsW2ldLCBmaV9oYXNoKSB7CisJCQlsaXN0X2Zvcl9lYWNoKHBvcywgJmZwLT5maV9kZWxlZ2F0aW9ucykgeworCQkJCWRwID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24sIGRsX3BlcmZpbGUpOworCQkJCWlmIChzYW1lX3N0YXRlaWQoJmRwLT5kbF9zdGF0ZWlkLCBzdGlkKSkKKwkJCQkJcmV0dXJuIGRwOworCQkJfQorCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqCiBmaW5kX2RlbGVnYXRpb25fc3RhdGVpZChzdHJ1Y3QgaW5vZGUgKmlubywgc3RhdGVpZF90ICpzdGlkKQogewpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwppbmRleCA5OTAxODExLi5jOGJmNDA1IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczR4ZHIuYworKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtNDQsMTMgKzQ0LDE1IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oPgogCiAjaW5jbHVkZSAiaWRtYXAuaCIKICNpbmNsdWRlICJhY2wuaCIKICNpbmNsdWRlICJ4ZHI0LmgiCiAjaW5jbHVkZSAidmZzLmgiCi0KKyNpbmNsdWRlICJzdGF0ZS5oIgorI2luY2x1ZGUgImNhY2hlLmgiCiAKICNkZWZpbmUgTkZTRERCR19GQUNJTElUWQkJTkZTRERCR19YRFIKIApAQCAtMTMxLDYgKzEzMywyMiBAQAogCX0JCQkJCVwKIH0gd2hpbGUgKDApCiAKK3N0YXRpYyB2b2lkIHNhdmVfYnVmKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9zYXZlZF9jb21wb3VuZGFyZ3MgKnNhdmVwKQoreworCXNhdmVwLT5wICAgICAgICA9IGFyZ3AtPnA7CisJc2F2ZXAtPmVuZCAgICAgID0gYXJncC0+ZW5kOworCXNhdmVwLT5wYWdlbGVuICA9IGFyZ3AtPnBhZ2VsZW47CisJc2F2ZXAtPnBhZ2VsaXN0ID0gYXJncC0+cGFnZWxpc3Q7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfYnVmKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9zYXZlZF9jb21wb3VuZGFyZ3MgKnNhdmVwKQoreworCWFyZ3AtPnAgICAgICAgID0gc2F2ZXAtPnA7CisJYXJncC0+ZW5kICAgICAgPSBzYXZlcC0+ZW5kOworCWFyZ3AtPnBhZ2VsZW4gID0gc2F2ZXAtPnBhZ2VsZW47CisJYXJncC0+cGFnZWxpc3QgPSBzYXZlcC0+cGFnZWxpc3Q7Cit9CisKIHN0YXRpYyBfX2JlMzIgKnJlYWRfYnVmKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHUzMiBuYnl0ZXMpCiB7CiAJLyogV2Ugd2FudCBtb3JlIGJ5dGVzIHRoYW4gc2VlbSB0byBiZSBhdmFpbGFibGUuCkBAIC0xMjQ2LDYgKzEyNjQsMTkgQEAKIH0KIAogc3RhdGljIF9fYmUzMgorbmZzZDRfZGVjb2RlX2ZyZWVfc3RhdGVpZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLAorCQkJICBzdHJ1Y3QgbmZzZDRfZnJlZV9zdGF0ZWlkICpmcmVlX3N0YXRlaWQpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRihzaXplb2Yoc3RhdGVpZF90KSk7CisJUkVBRDMyKGZyZWVfc3RhdGVpZC0+ZnJfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwlDT1BZTUVNKCZmcmVlX3N0YXRlaWQtPmZyX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9zZXF1ZW5jZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLAogCQkgICAgICBzdHJ1Y3QgbmZzZDRfc2VxdWVuY2UgKnNlcSkKIHsKQEAgLTEyNjEsNiArMTI5Miw0MCBAQAogCURFQ09ERV9UQUlMOwogfQogCitzdGF0aWMgX19iZTMyCituZnNkNF9kZWNvZGVfdGVzdF9zdGF0ZWlkKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF90ZXN0X3N0YXRlaWQgKnRlc3Rfc3RhdGVpZCkKK3sKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzOworCXN0YXRlaWRfdCBzaTsKKwlpbnQgaTsKKwlfX2JlMzIgKnA7CisJX19iZTMyIHN0YXR1czsKKworCVJFQURfQlVGKDQpOworCXRlc3Rfc3RhdGVpZC0+dHNfbnVtX2lkcyA9IG50b2hsKCpwKyspOworCisJbmJ5dGVzID0gdGVzdF9zdGF0ZWlkLT50c19udW1faWRzICogc2l6ZW9mKHN0YXRlaWRfdCk7CisJaWYgKG5ieXRlcyA+ICh1MzIpKChjaGFyICopYXJncC0+ZW5kIC0gKGNoYXIgKilhcmdwLT5wKSkKKwkJZ290byB4ZHJfZXJyb3I7CisKKwl0ZXN0X3N0YXRlaWQtPnRzX3NhdmVkX2FyZ3MgPSBhcmdwOworCXNhdmVfYnVmKGFyZ3AsICZ0ZXN0X3N0YXRlaWQtPnRzX3NhdmVkcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGVzdF9zdGF0ZWlkLT50c19udW1faWRzOyBpKyspIHsKKwkJc3RhdHVzID0gbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJnNpKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gMDsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworeGRyX2Vycm9yOgorCWRwcmludGsoIk5GU0Q6IHhkciBlcnJvciAoJXM6JWQpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCXN0YXR1cyA9IG5mc2Vycl9iYWRfeGRyOworCWdvdG8gb3V0OworfQorCiBzdGF0aWMgX19iZTMyIG5mc2Q0X2RlY29kZV9yZWNsYWltX2NvbXBsZXRlKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9yZWNsYWltX2NvbXBsZXRlICpyYykKIHsKIAlERUNPREVfSEVBRDsKQEAgLTEzNzAsNyArMTQzNSw3IEBACiAJW09QX0VYQ0hBTkdFX0lEXQk9IChuZnNkNF9kZWMpbmZzZDRfZGVjb2RlX2V4Y2hhbmdlX2lkLAogCVtPUF9DUkVBVEVfU0VTU0lPTl0JPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9jcmVhdGVfc2Vzc2lvbiwKIAlbT1BfREVTVFJPWV9TRVNTSU9OXQk9IChuZnNkNF9kZWMpbmZzZDRfZGVjb2RlX2Rlc3Ryb3lfc2Vzc2lvbiwKLQlbT1BfRlJFRV9TVEFURUlEXQk9IChuZnNkNF9kZWMpbmZzZDRfZGVjb2RlX25vdHN1cHAsCisJW09QX0ZSRUVfU1RBVEVJRF0JPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9mcmVlX3N0YXRlaWQsCiAJW09QX0dFVF9ESVJfREVMRUdBVElPTl0JPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9ub3RzdXBwLAogCVtPUF9HRVRERVZJQ0VJTkZPXQk9IChuZnNkNF9kZWMpbmZzZDRfZGVjb2RlX25vdHN1cHAsCiAJW09QX0dFVERFVklDRUxJU1RdCT0gKG5mc2Q0X2RlYyluZnNkNF9kZWNvZGVfbm90c3VwcCwKQEAgLTEzODAsNyArMTQ0NSw3IEBACiAJW09QX1NFQ0lORk9fTk9fTkFNRV0JPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9zZWNpbmZvX25vX25hbWUsCiAJW09QX1NFUVVFTkNFXQkJPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9zZXF1ZW5jZSwKIAlbT1BfU0VUX1NTVl0JCT0gKG5mc2Q0X2RlYyluZnNkNF9kZWNvZGVfbm90c3VwcCwKLQlbT1BfVEVTVF9TVEFURUlEXQk9IChuZnNkNF9kZWMpbmZzZDRfZGVjb2RlX25vdHN1cHAsCisJW09QX1RFU1RfU1RBVEVJRF0JPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV90ZXN0X3N0YXRlaWQsCiAJW09QX1dBTlRfREVMRUdBVElPTl0JPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9ub3RzdXBwLAogCVtPUF9ERVNUUk9ZX0NMSUVOVElEXQk9IChuZnNkNF9kZWMpbmZzZDRfZGVjb2RlX25vdHN1cHAsCiAJW09QX1JFQ0xBSU1fQ09NUExFVEVdCT0gKG5mc2Q0X2RlYyluZnNkNF9kZWNvZGVfcmVjbGFpbV9jb21wbGV0ZSwKQEAgLTE0MDIsNiArMTQ2Nyw3IEBACiAJREVDT0RFX0hFQUQ7CiAJc3RydWN0IG5mc2Q0X29wICpvcDsKIAlzdHJ1Y3QgbmZzZDRfbWlub3J2ZXJzaW9uX29wcyAqb3BzOworCWJvb2wgY2FjaGV0aGlzID0gZmFsc2U7CiAJaW50IGk7CiAKIAkvKgpAQCAtMTQ4Myw3ICsxNTQ5LDE2IEBACiAJCQlhcmdwLT5vcGNudCA9IGkrMTsKIAkJCWJyZWFrOwogCQl9CisJCS8qCisJCSAqIFdlJ2xsIHRyeSB0byBjYWNoZSB0aGUgcmVzdWx0IGluIHRoZSBEUkMgaWYgYW55IG9uZQorCQkgKiBvcCBpbiB0aGUgY29tcG91bmQgd2FudHMgdG8gYmUgY2FjaGVkOgorCQkgKi8KKwkJY2FjaGV0aGlzIHw9IG5mc2Q0X2NhY2hlX3RoaXNfb3Aob3ApOwogCX0KKwkvKiBTZXNzaW9ucyBtYWtlIHRoZSBEUkMgdW5uZWNlc3Nhcnk6ICovCisJaWYgKGFyZ3AtPm1pbm9ydmVyc2lvbikKKwkJY2FjaGV0aGlzID0gZmFsc2U7CisJYXJncC0+cnFzdHAtPnJxX2NhY2hldHlwZSA9IGNhY2hldGhpcyA/IFJDX1JFUExCVUZGIDogUkNfTk9DQUNIRTsKIAogCURFQ09ERV9UQUlMOwogfQpAQCAtMzExNiw2ICszMTkxLDIxIEBACiB9CiAKIHN0YXRpYyBfX2JlMzIKK25mc2Q0X2VuY29kZV9mcmVlX3N0YXRlaWQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLAorCQkJICBzdHJ1Y3QgbmZzZDRfZnJlZV9zdGF0ZWlkICpmcmVlX3N0YXRlaWQpCit7CisJX19iZTMyICpwOworCisJaWYgKG5mc2VycikKKwkJcmV0dXJuIG5mc2VycjsKKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJV1JJVEUzMihuZnNlcnIpOworCUFESlVTVF9BUkdTKCk7CisJcmV0dXJuIG5mc2VycjsKK30KKworc3RhdGljIF9fYmUzMgogbmZzZDRfZW5jb2RlX3NlcXVlbmNlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2VyciwKIAkJICAgICAgc3RydWN0IG5mc2Q0X3NlcXVlbmNlICpzZXEpCiB7CkBAIC0zMTM4LDYgKzMyMjgsMzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorX19iZTMyCituZnNkNF9lbmNvZGVfdGVzdF9zdGF0ZWlkKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2VyciwKKwkJCSAgc3RydWN0IG5mc2Q0X3Rlc3Rfc3RhdGVpZCAqdGVzdF9zdGF0ZWlkKQoreworCXN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3A7CisJc3RhdGVpZF90IHNpOworCV9fYmUzMiAqcDsKKwlpbnQgaTsKKwlpbnQgdmFsaWQ7CisKKwlyZXN0b3JlX2J1Zih0ZXN0X3N0YXRlaWQtPnRzX3NhdmVkX2FyZ3MsICZ0ZXN0X3N0YXRlaWQtPnRzX3NhdmVkcCk7CisJYXJncCA9IHRlc3Rfc3RhdGVpZC0+dHNfc2F2ZWRfYXJnczsKKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJKnArKyA9IGh0b25sKHRlc3Rfc3RhdGVpZC0+dHNfbnVtX2lkcyk7CisJcmVzcC0+cCA9IHA7CisKKwluZnM0X2xvY2tfc3RhdGUoKTsKKwlmb3IgKGkgPSAwOyBpIDwgdGVzdF9zdGF0ZWlkLT50c19udW1faWRzOyBpKyspIHsKKwkJbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJnNpKTsKKwkJdmFsaWQgPSBuZnM0X3ZhbGlkYXRlX3N0YXRlaWQoJnNpLCB0ZXN0X3N0YXRlaWQtPnRzX2hhc19zZXNzaW9uKTsKKwkJUkVTRVJWRV9TUEFDRSg0KTsKKwkJKnArKyA9IGh0b25sKHZhbGlkKTsKKwkJcmVzcC0+cCA9IHA7CisJfQorCW5mczRfdW5sb2NrX3N0YXRlKCk7CisKKwlyZXR1cm4gbmZzZXJyOworfQorCiBzdGF0aWMgX19iZTMyCiBuZnNkNF9lbmNvZGVfbm9vcChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHZvaWQgKnApCiB7CkBAIC0zMTk2LDcgKzMzMTYsNyBAQAogCVtPUF9FWENIQU5HRV9JRF0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9leGNoYW5nZV9pZCwKIAlbT1BfQ1JFQVRFX1NFU1NJT05dCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfY3JlYXRlX3Nlc3Npb24sCiAJW09QX0RFU1RST1lfU0VTU0lPTl0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9kZXN0cm95X3Nlc3Npb24sCi0JW09QX0ZSRUVfU1RBVEVJRF0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9ub29wLAorCVtPUF9GUkVFX1NUQVRFSURdCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfZnJlZV9zdGF0ZWlkLAogCVtPUF9HRVRfRElSX0RFTEVHQVRJT05dCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfbm9vcCwKIAlbT1BfR0VUREVWSUNFSU5GT10JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9ub29wLAogCVtPUF9HRVRERVZJQ0VMSVNUXQk9IChuZnNkNF9lbmMpbmZzZDRfZW5jb2RlX25vb3AsCkBAIC0zMjA2LDcgKzMzMjYsNyBAQAogCVtPUF9TRUNJTkZPX05PX05BTUVdCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfc2VjaW5mb19ub19uYW1lLAogCVtPUF9TRVFVRU5DRV0JCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfc2VxdWVuY2UsCiAJW09QX1NFVF9TU1ZdCQk9IChuZnNkNF9lbmMpbmZzZDRfZW5jb2RlX25vb3AsCi0JW09QX1RFU1RfU1RBVEVJRF0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9ub29wLAorCVtPUF9URVNUX1NUQVRFSURdCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfdGVzdF9zdGF0ZWlkLAogCVtPUF9XQU5UX0RFTEVHQVRJT05dCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfbm9vcCwKIAlbT1BfREVTVFJPWV9DTElFTlRJRF0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9ub29wLAogCVtPUF9SRUNMQUlNX0NPTVBMRVRFXQk9IChuZnNkNF9lbmMpbmZzZDRfZW5jb2RlX25vb3AsCkBAIC0zMzE5LDggKzM0MzksMTEgQEAKICAgICAgICAgcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KIAotdm9pZCBuZnNkNF9yZWxlYXNlX2NvbXBvdW5kYXJncyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdzKQoraW50IG5mc2Q0X3JlbGVhc2VfY29tcG91bmRhcmdzKHZvaWQgKnJxLCBfX2JlMzIgKnAsIHZvaWQgKnJlc3ApCiB7CisJc3RydWN0IHN2Y19ycXN0ICpycXN0cCA9IHJxOworCXN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3MgPSBycXN0cC0+cnFfYXJncDsKKwogCWlmIChhcmdzLT5vcHMgIT0gYXJncy0+aW9wcykgewogCQlrZnJlZShhcmdzLT5vcHMpOwogCQlhcmdzLT5vcHMgPSBhcmdzLT5pb3BzOwpAQCAtMzMzMywxMyArMzQ1NiwxMiBAQAogCQl0Yi0+cmVsZWFzZSh0Yi0+YnVmKTsKIAkJa2ZyZWUodGIpOwogCX0KKwlyZXR1cm4gMTsKIH0KIAogaW50CiBuZnM0c3ZjX2RlY29kZV9jb21wb3VuZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdzKQogewotCV9fYmUzMiBzdGF0dXM7Ci0KIAlhcmdzLT5wID0gcDsKIAlhcmdzLT5lbmQgPSBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2Jhc2UgKyBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2xlbjsKIAlhcmdzLT5wYWdlbGlzdCA9IHJxc3RwLT5ycV9hcmcucGFnZXM7CkBAIC0zMzQ5LDExICszNDcxLDcgQEAKIAlhcmdzLT5vcHMgPSBhcmdzLT5pb3BzOwogCWFyZ3MtPnJxc3RwID0gcnFzdHA7CiAKLQlzdGF0dXMgPSBuZnNkNF9kZWNvZGVfY29tcG91bmQoYXJncyk7Ci0JaWYgKHN0YXR1cykgewotCQluZnNkNF9yZWxlYXNlX2NvbXBvdW5kYXJncyhhcmdzKTsKLQl9Ci0JcmV0dXJuICFzdGF0dXM7CisJcmV0dXJuICFuZnNkNF9kZWNvZGVfY29tcG91bmQoYXJncyk7CiB9CiAKIGludApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjYWNoZS5jIGIvZnMvbmZzZC9uZnNjYWNoZS5jCmluZGV4IDQ2NjZhMjAuLjJjYmFjMzQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY2FjaGUuYworKysgYi9mcy9uZnNkL25mc2NhY2hlLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogICogTm90ZSB0aGF0IG5vIG9wZXJhdGlvbiB3aXRoaW4gdGhlIGxvb3AgbWF5IHNsZWVwLgogICovCiBpbnQKLW5mc2RfY2FjaGVfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCB0eXBlKQorbmZzZF9jYWNoZV9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQkqaG47CiAJc3RydWN0IGhsaXN0X2hlYWQgCSpyaDsKQEAgLTEyOCw2ICsxMjgsNyBAQAogCQkJCXZlcnMgPSBycXN0cC0+cnFfdmVycywKIAkJCQlwcm9jID0gcnFzdHAtPnJxX3Byb2M7CiAJdW5zaWduZWQgbG9uZwkJYWdlOworCWludCB0eXBlID0gcnFzdHAtPnJxX2NhY2hldHlwZTsKIAlpbnQgcnRuOwogCiAJcnFzdHAtPnJxX2NhY2hlcmVwID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IDFmNWVhZTQuLmM3NzE2MTQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKKysrIGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3Nfa3JiNV9lbmN0eXBlcy5oPgogCiAjaW5jbHVkZSAiaWRtYXAuaCIKICNpbmNsdWRlICJuZnNkLmgiCkBAIC0yMywxNSArMjQsNiBAQAogICovCiBlbnVtIHsKIAlORlNEX1Jvb3QgPSAxLAotI2lmZGVmIENPTkZJR19ORlNEX0RFUFJFQ0FURUQKLQlORlNEX1N2YywKLQlORlNEX0FkZCwKLQlORlNEX0RlbCwKLQlORlNEX0V4cG9ydCwKLQlORlNEX1VuZXhwb3J0LAotCU5GU0RfR2V0ZmQsCi0JTkZTRF9HZXRmcywKLSNlbmRpZgogCU5GU0RfTGlzdCwKIAlORlNEX0V4cG9ydF9mZWF0dXJlcywKIAlORlNEX0ZoLApAQCAtNTgsMTUgKzUwLDYgQEAKIC8qCiAgKiB3cml0ZSgpIGZvciB0aGVzZSBub2Rlcy4KICAqLwotI2lmZGVmIENPTkZJR19ORlNEX0RFUFJFQ0FURUQKLXN0YXRpYyBzc2l6ZV90IHdyaXRlX3N2YyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci1zdGF0aWMgc3NpemVfdCB3cml0ZV9hZGQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwotc3RhdGljIHNzaXplX3Qgd3JpdGVfZGVsKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKLXN0YXRpYyBzc2l6ZV90IHdyaXRlX2V4cG9ydChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci1zdGF0aWMgc3NpemVfdCB3cml0ZV91bmV4cG9ydChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci1zdGF0aWMgc3NpemVfdCB3cml0ZV9nZXRmZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci1zdGF0aWMgc3NpemVfdCB3cml0ZV9nZXRmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci0jZW5kaWYKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2ZpbGVoYW5kbGUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwogc3RhdGljIHNzaXplX3Qgd3JpdGVfdW5sb2NrX2lwKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3VubG9ja19mcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CkBAIC04MiwxNSArNjUsNiBAQAogI2VuZGlmCiAKIHN0YXRpYyBzc2l6ZV90ICgqd3JpdGVfb3BbXSkoc3RydWN0IGZpbGUgKiwgY2hhciAqLCBzaXplX3QpID0gewotI2lmZGVmIENPTkZJR19ORlNEX0RFUFJFQ0FURUQKLQlbTkZTRF9TdmNdID0gd3JpdGVfc3ZjLAotCVtORlNEX0FkZF0gPSB3cml0ZV9hZGQsCi0JW05GU0RfRGVsXSA9IHdyaXRlX2RlbCwKLQlbTkZTRF9FeHBvcnRdID0gd3JpdGVfZXhwb3J0LAotCVtORlNEX1VuZXhwb3J0XSA9IHdyaXRlX3VuZXhwb3J0LAotCVtORlNEX0dldGZkXSA9IHdyaXRlX2dldGZkLAotCVtORlNEX0dldGZzXSA9IHdyaXRlX2dldGZzLAotI2VuZGlmCiAJW05GU0RfRmhdID0gd3JpdGVfZmlsZWhhbmRsZSwKIAlbTkZTRF9GT19VbmxvY2tJUF0gPSB3cml0ZV91bmxvY2tfaXAsCiAJW05GU0RfRk9fVW5sb2NrRlNdID0gd3JpdGVfdW5sb2NrX2ZzLApAQCAtMTI5LDE2ICsxMDMsNiBAQAogCiBzdGF0aWMgc3NpemVfdCBuZnNjdGxfdHJhbnNhY3Rpb25fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGxvZmZfdCAqcG9zKQogewotI2lmZGVmIENPTkZJR19ORlNEX0RFUFJFQ0FURUQKLQlzdGF0aWMgaW50IHdhcm5lZDsKLQlpZiAoZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lWzBdID09ICcuJyAmJiAhd2FybmVkKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJXYXJuaW5nOiBcIiVzXCIgdXNlcyBkZXByZWNhdGVkIE5GU0QgaW50ZXJmYWNlOiAlcy4iCi0JCSAgICAgICAiICBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjYuNDBcbiIsCi0JCSAgICAgICBjdXJyZW50LT5jb21tLCBmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCQl3YXJuZWQgPSAxOwotCX0KLSNlbmRpZgogCWlmICghIGZpbGUtPnByaXZhdGVfZGF0YSkgewogCQkvKiBBbiBhdHRlbXB0IHRvIHJlYWQgYSB0cmFuc2FjdGlvbiBmaWxlIHdpdGhvdXQgd3JpdGluZwogCQkgKiBjYXVzZXMgYSAwLWJ5dGUgd3JpdGUgc28gdGhhdCB0aGUgZmlsZSBjYW4gcmV0dXJuCkBAIC0xODksMTggKzE1MywxMCBAQAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi0jaWZkZWYgQ09ORklHX1NVTlJQQ19HU1MKKyNpZiBkZWZpbmVkKENPTkZJR19TVU5SUENfR1NTKSB8fCBkZWZpbmVkKENPTkZJR19TVU5SUENfR1NTX01PRFVMRSkKIHN0YXRpYyBpbnQgc3VwcG9ydGVkX2VuY3R5cGVzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXN0cnVjdCBnc3NfYXBpX21lY2ggKms1bWVjaDsKLQotCWs1bWVjaCA9IGdzc19tZWNoX2dldF9ieV9uYW1lKCJrcmI1Iik7Ci0JaWYgKGs1bWVjaCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQlpZiAoazVtZWNoLT5nbV91cGNhbGxfZW5jdHlwZXMgIT0gTlVMTCkKLQkJc2VxX3ByaW50ZihtLCBrNW1lY2gtPmdtX3VwY2FsbF9lbmN0eXBlcyk7Ci0JZ3NzX21lY2hfcHV0KGs1bWVjaCk7Ci1vdXQ6CisJc2VxX3ByaW50ZihtLCBLUkI1X1NVUFBPUlRFRF9FTkNUWVBFUyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNSw3ICsxNzEsNyBAQAogCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OwotI2VuZGlmIC8qIENPTkZJR19TVU5SUENfR1NTICovCisjZW5kaWYgLyogQ09ORklHX1NVTlJQQ19HU1Mgb3IgQ09ORklHX1NVTlJQQ19HU1NfTU9EVUxFICovCiAKIGV4dGVybiBpbnQgbmZzZF9wb29sX3N0YXRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogZXh0ZXJuIGludCBuZnNkX3Bvb2xfc3RhdHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CkBAIC0yMzMsMzAzICsxODksNiBAQAogICogcGF5bG9hZCAtIHdyaXRlIG1ldGhvZHMKICAqLwogCi0jaWZkZWYgQ09ORklHX05GU0RfREVQUkVDQVRFRAotLyoqCi0gKiB3cml0ZV9zdmMgLSBTdGFydCBrZXJuZWwncyBORlNEIHNlcnZlcgotICoKLSAqIERlcHJlY2F0ZWQuICAvcHJvYy9mcy9uZnNkL3RocmVhZHMgaXMgcHJlZmVycmVkLgotICogRnVuY3Rpb24gcmVtYWlucyB0byBzdXBwb3J0IG9sZCB2ZXJzaW9ucyBvZiBuZnMtdXRpbHMuCi0gKgotICogSW5wdXQ6Ci0gKgkJCWJ1ZjoJc3RydWN0IG5mc2N0bF9zdmMKLSAqCQkJCXN2Y19wb3J0Oglwb3J0IG51bWJlciBvZiB0aGlzCi0gKgkJCQkJCXNlcnZlcidzIGxpc3RlbmVyCi0gKgkJCQlzdmNfbnRocmVhZHM6CW51bWJlciBvZiB0aHJlYWRzIHRvIHN0YXJ0Ci0gKgkJCXNpemU6CXNpemUgaW4gYnl0ZXMgb2YgcGFzc2VkIGluIG5mc2N0bF9zdmMKLSAqIE91dHB1dDoKLSAqCU9uIHN1Y2Nlc3M6CXJldHVybnMgemVybwotICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCi0gKi8KLXN0YXRpYyBzc2l6ZV90IHdyaXRlX3N2YyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgbmZzY3RsX3N2YyAqZGF0YTsKLQlpbnQgZXJyOwotCWlmIChzaXplIDwgc2l6ZW9mKCpkYXRhKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZGF0YSA9IChzdHJ1Y3QgbmZzY3RsX3N2YyopIGJ1ZjsKLQllcnIgPSBuZnNkX3N2YyhkYXRhLT5zdmNfcG9ydCwgZGF0YS0+c3ZjX250aHJlYWRzKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB3cml0ZV9hZGQgLSBBZGQgb3IgbW9kaWZ5IGNsaWVudCBlbnRyeSBpbiBhdXRoIHVuaXggY2FjaGUKLSAqCi0gKiBEZXByZWNhdGVkLiAgL3Byb2MvbmV0L3JwYy9hdXRoLnVuaXguaXAgaXMgcHJlZmVycmVkLgotICogRnVuY3Rpb24gcmVtYWlucyB0byBzdXBwb3J0IG9sZCB2ZXJzaW9ucyBvZiBuZnMtdXRpbHMuCi0gKgotICogSW5wdXQ6Ci0gKgkJCWJ1ZjoJc3RydWN0IG5mc2N0bF9jbGllbnQKLSAqCQkJCWNsX2lkZW50OgknXDAnLXRlcm1pbmF0ZWQgQyBzdHJpbmcKLSAqCQkJCQkJY29udGFpbmluZyBkb21haW4gbmFtZQotICoJCQkJCQlvZiBjbGllbnQKLSAqCQkJCWNsX25hZGRyOgluby4gb2YgaXRlbXMgaW4gY2xfYWRkcmxpc3QKLSAqCQkJCWNsX2FkZHJsaXN0OglhcnJheSBvZiBjbGllbnQgYWRkcmVzc2VzCi0gKgkJCQljbF9maGtleXR5cGU6CWlnbm9yZWQKLSAqCQkJCWNsX2Zoa2V5bGVuOglpZ25vcmVkCi0gKgkJCQljbF9maGtleToJaWdub3JlZAotICoJCQlzaXplOglzaXplIGluIGJ5dGVzIG9mIHBhc3NlZCBpbiBuZnNjdGxfY2xpZW50Ci0gKiBPdXRwdXQ6Ci0gKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm8KLSAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQotICoKLSAqIE5vdGU6IE9ubHkgQUZfSU5FVCBjbGllbnQgYWRkcmVzc2VzIGFyZSBwYXNzZWQgaW4sIHNpbmNlCi0gKiBuZnNjdGxfY2xpZW50LmNsX2FkZHJsaXN0IGNvbnRhaW5zIG9ubHkgaW5fYWRkciBmaWVsZHMgZm9yIGFkZHJlc3Nlcy4KLSAqLwotc3RhdGljIHNzaXplX3Qgd3JpdGVfYWRkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQotewotCXN0cnVjdCBuZnNjdGxfY2xpZW50ICpkYXRhOwotCWlmIChzaXplIDwgc2l6ZW9mKCpkYXRhKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZGF0YSA9IChzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqKWJ1ZjsKLQlyZXR1cm4gZXhwX2FkZGNsaWVudChkYXRhKTsKLX0KLQotLyoqCi0gKiB3cml0ZV9kZWwgLSBSZW1vdmUgY2xpZW50IGZyb20gYXV0aCB1bml4IGNhY2hlCi0gKgotICogRGVwcmVjYXRlZC4gIC9wcm9jL25ldC9ycGMvYXV0aC51bml4LmlwIGlzIHByZWZlcnJlZC4KLSAqIEZ1bmN0aW9uIHJlbWFpbnMgdG8gc3VwcG9ydCBvbGQgdmVyc2lvbnMgb2YgbmZzLXV0aWxzLgotICoKLSAqIElucHV0OgotICoJCQlidWY6CXN0cnVjdCBuZnNjdGxfY2xpZW50Ci0gKgkJCQljbF9pZGVudDoJJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nCi0gKgkJCQkJCWNvbnRhaW5pbmcgZG9tYWluIG5hbWUKLSAqCQkJCQkJb2YgY2xpZW50Ci0gKgkJCQljbF9uYWRkcjoJaWdub3JlZAotICoJCQkJY2xfYWRkcmxpc3Q6CWlnbm9yZWQKLSAqCQkJCWNsX2Zoa2V5dHlwZToJaWdub3JlZAotICoJCQkJY2xfZmhrZXlsZW46CWlnbm9yZWQKLSAqCQkJCWNsX2Zoa2V5OglpZ25vcmVkCi0gKgkJCXNpemU6CXNpemUgaW4gYnl0ZXMgb2YgcGFzc2VkIGluIG5mc2N0bF9jbGllbnQKLSAqIE91dHB1dDoKLSAqCU9uIHN1Y2Nlc3M6CXJldHVybnMgemVybwotICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCi0gKgotICogTm90ZTogT25seSBBRl9JTkVUIGNsaWVudCBhZGRyZXNzZXMgYXJlIHBhc3NlZCBpbiwgc2luY2UKLSAqIG5mc2N0bF9jbGllbnQuY2xfYWRkcmxpc3QgY29udGFpbnMgb25seSBpbl9hZGRyIGZpZWxkcyBmb3IgYWRkcmVzc2VzLgotICovCi1zdGF0aWMgc3NpemVfdCB3cml0ZV9kZWwoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IG5mc2N0bF9jbGllbnQgKmRhdGE7Ci0JaWYgKHNpemUgPCBzaXplb2YoKmRhdGEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlkYXRhID0gKHN0cnVjdCBuZnNjdGxfY2xpZW50ICopYnVmOwotCXJldHVybiBleHBfZGVsY2xpZW50KGRhdGEpOwotfQotCi0vKioKLSAqIHdyaXRlX2V4cG9ydCAtIEV4cG9ydCBwYXJ0IG9yIGFsbCBvZiBhIGxvY2FsIGZpbGUgc3lzdGVtCi0gKgotICogRGVwcmVjYXRlZC4gIC9wcm9jL25ldC9ycGMve25mc2QuZXhwb3J0LG5mc2QuZmh9IGFyZSBwcmVmZXJyZWQuCi0gKiBGdW5jdGlvbiByZW1haW5zIHRvIHN1cHBvcnQgb2xkIHZlcnNpb25zIG9mIG5mcy11dGlscy4KLSAqCi0gKiBJbnB1dDoKLSAqCQkJYnVmOglzdHJ1Y3QgbmZzY3RsX2V4cG9ydAotICoJCQkJZXhfY2xpZW50OgknXDAnLXRlcm1pbmF0ZWQgQyBzdHJpbmcKLSAqCQkJCQkJY29udGFpbmluZyBkb21haW4gbmFtZQotICoJCQkJCQlvZiBjbGllbnQgYWxsb3dlZCB0byBhY2Nlc3MKLSAqCQkJCQkJdGhpcyBleHBvcnQKLSAqCQkJCWV4X3BhdGg6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZwotICoJCQkJCQljb250YWluaW5nIHBhdGhuYW1lIG9mCi0gKgkJCQkJCWRpcmVjdG9yeSBpbiBsb2NhbCBmaWxlIHN5c3RlbQotICoJCQkJZXhfZGV2OgkJZnNpZCB0byB1c2UgZm9yIHRoaXMgZXhwb3J0Ci0gKgkJCQlleF9pbm86CQlpZ25vcmVkCi0gKgkJCQlleF9mbGFnczoJZXhwb3J0IGZsYWdzIGZvciB0aGlzIGV4cG9ydAotICoJCQkJZXhfYW5vbl91aWQ6CVVJRCB0byB1c2UgZm9yIGFub255bW91cwotICoJCQkJCQlyZXF1ZXN0cwotICoJCQkJZXhfYW5vbl9naWQ6CUdJRCB0byB1c2UgZm9yIGFub255bW91cwotICoJCQkJCQlyZXF1ZXN0cwotICoJCQlzaXplOglzaXplIGluIGJ5dGVzIG9mIHBhc3NlZCBpbiBuZnNjdGxfZXhwb3J0Ci0gKiBPdXRwdXQ6Ci0gKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm8KLSAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQotICovCi1zdGF0aWMgc3NpemVfdCB3cml0ZV9leHBvcnQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IG5mc2N0bF9leHBvcnQgKmRhdGE7Ci0JaWYgKHNpemUgPCBzaXplb2YoKmRhdGEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlkYXRhID0gKHN0cnVjdCBuZnNjdGxfZXhwb3J0KilidWY7Ci0JcmV0dXJuIGV4cF9leHBvcnQoZGF0YSk7Ci19Ci0KLS8qKgotICogd3JpdGVfdW5leHBvcnQgLSBVbmV4cG9ydCBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgZmlsZSBzeXN0ZW0KLSAqCi0gKiBEZXByZWNhdGVkLiAgL3Byb2MvbmV0L3JwYy97bmZzZC5leHBvcnQsbmZzZC5maH0gYXJlIHByZWZlcnJlZC4KLSAqIEZ1bmN0aW9uIHJlbWFpbnMgdG8gc3VwcG9ydCBvbGQgdmVyc2lvbnMgb2YgbmZzLXV0aWxzLgotICoKLSAqIElucHV0OgotICoJCQlidWY6CXN0cnVjdCBuZnNjdGxfZXhwb3J0Ci0gKgkJCQlleF9jbGllbnQ6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZwotICoJCQkJCQljb250YWluaW5nIGRvbWFpbiBuYW1lCi0gKgkJCQkJCW9mIGNsaWVudCBubyBsb25nZXIgYWxsb3dlZAotICoJCQkJCQl0byBhY2Nlc3MgdGhpcyBleHBvcnQKLSAqCQkJCWV4X3BhdGg6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZwotICoJCQkJCQljb250YWluaW5nIHBhdGhuYW1lIG9mCi0gKgkJCQkJCWRpcmVjdG9yeSBpbiBsb2NhbCBmaWxlIHN5c3RlbQotICoJCQkJZXhfZGV2OgkJaWdub3JlZAotICoJCQkJZXhfaW5vOgkJaWdub3JlZAotICoJCQkJZXhfZmxhZ3M6CWlnbm9yZWQKLSAqCQkJCWV4X2Fub25fdWlkOglpZ25vcmVkCi0gKgkJCQlleF9hbm9uX2dpZDoJaWdub3JlZAotICoJCQlzaXplOglzaXplIGluIGJ5dGVzIG9mIHBhc3NlZCBpbiBuZnNjdGxfZXhwb3J0Ci0gKiBPdXRwdXQ6Ci0gKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm8KLSAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQotICovCi1zdGF0aWMgc3NpemVfdCB3cml0ZV91bmV4cG9ydChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgbmZzY3RsX2V4cG9ydCAqZGF0YTsKLQotCWlmIChzaXplIDwgc2l6ZW9mKCpkYXRhKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZGF0YSA9IChzdHJ1Y3QgbmZzY3RsX2V4cG9ydCopYnVmOwotCXJldHVybiBleHBfdW5leHBvcnQoZGF0YSk7Ci19Ci0KLS8qKgotICogd3JpdGVfZ2V0ZnMgLSBHZXQgYSB2YXJpYWJsZS1sZW5ndGggTkZTIGZpbGUgaGFuZGxlIGJ5IHBhdGgKLSAqCi0gKiBEZXByZWNhdGVkLiAgL3Byb2MvZnMvbmZzZC9maWxlaGFuZGxlIGlzIHByZWZlcnJlZC4KLSAqIEZ1bmN0aW9uIHJlbWFpbnMgdG8gc3VwcG9ydCBvbGQgdmVyc2lvbnMgb2YgbmZzLXV0aWxzLgotICoKLSAqIElucHV0OgotICoJCQlidWY6CXN0cnVjdCBuZnNjdGxfZnNwYXJtCi0gKgkJCQlnZF9hZGRyOglzb2NrZXQgYWRkcmVzcyBvZiBjbGllbnQKLSAqCQkJCWdkX3BhdGg6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZwotICoJCQkJCQljb250YWluaW5nIHBhdGhuYW1lIG9mCi0gKgkJCQkJCWRpcmVjdG9yeSBpbiBsb2NhbCBmaWxlIHN5c3RlbQotICoJCQkJZ2RfbWF4bGVuOgltYXhpbXVtIHNpemUgb2YgcmV0dXJuZWQgZmlsZQotICoJCQkJCQloYW5kbGUKLSAqCQkJc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBwYXNzZWQgaW4gbmZzY3RsX2ZzcGFybQotICogT3V0cHV0OgotICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCBhIGtuZnNkX2ZoIHN0cnVjdHVyZQotICoJCQkoYSB2YXJpYWJsZS1sZW5ndGggcmF3IE5GUyBmaWxlIGhhbmRsZSk7Ci0gKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBmaWxlIGhhbmRsZQotICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCi0gKgotICogTm90ZTogT25seSBBRl9JTkVUIGNsaWVudCBhZGRyZXNzZXMgYXJlIHBhc3NlZCBpbiwgc2luY2UgZ2RfYWRkcgotICogaXMgdGhlIHNhbWUgc2l6ZSBhcyBhIHN0cnVjdCBzb2NrYWRkcl9pbi4KLSAqLwotc3RhdGljIHNzaXplX3Qgd3JpdGVfZ2V0ZnMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IG5mc2N0bF9mc3Bhcm0gKmRhdGE7Ci0Jc3RydWN0IHNvY2thZGRyX2luICpzaW47Ci0Jc3RydWN0IGF1dGhfZG9tYWluICpjbHA7Ci0JaW50IGVyciA9IDA7Ci0Jc3RydWN0IGtuZnNkX2ZoICpyZXM7Ci0Jc3RydWN0IGluNl9hZGRyIGluNjsKLQotCWlmIChzaXplIDwgc2l6ZW9mKCpkYXRhKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZGF0YSA9IChzdHJ1Y3QgbmZzY3RsX2ZzcGFybSopYnVmOwotCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7Ci0JaWYgKGRhdGEtPmdkX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpCi0JCWdvdG8gb3V0OwotCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZGF0YS0+Z2RfYWRkcjsKLQlpZiAoZGF0YS0+Z2RfbWF4bGVuID4gTkZTM19GSFNJWkUpCi0JCWRhdGEtPmdkX21heGxlbiA9IE5GUzNfRkhTSVpFOwotCi0JcmVzID0gKHN0cnVjdCBrbmZzZF9maCopYnVmOwotCi0JZXhwX3JlYWRsb2NrKCk7Ci0KLQlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKHNpbi0+c2luX2FkZHIuc19hZGRyLCAmaW42KTsKLQotCWNscCA9IGF1dGhfdW5peF9sb29rdXAoJmluaXRfbmV0LCAmaW42KTsKLQlpZiAoIWNscCkKLQkJZXJyID0gLUVQRVJNOwotCWVsc2UgewotCQllcnIgPSBleHBfcm9vdGZoKGNscCwgZGF0YS0+Z2RfcGF0aCwgcmVzLCBkYXRhLT5nZF9tYXhsZW4pOwotCQlhdXRoX2RvbWFpbl9wdXQoY2xwKTsKLQl9Ci0JZXhwX3JlYWR1bmxvY2soKTsKLQlpZiAoZXJyID09IDApCi0JCWVyciA9IHJlcy0+Zmhfc2l6ZSArIG9mZnNldG9mKHN0cnVjdCBrbmZzZF9maCwgZmhfYmFzZSk7Ci0gb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgotICogd3JpdGVfZ2V0ZmQgLSBHZXQgYSBmaXhlZC1sZW5ndGggTkZTIGZpbGUgaGFuZGxlIGJ5IHBhdGggKHVzZWQgYnkgbW91bnRkKQotICoKLSAqIERlcHJlY2F0ZWQuICAvcHJvYy9mcy9uZnNkL2ZpbGVoYW5kbGUgaXMgcHJlZmVycmVkLgotICogRnVuY3Rpb24gcmVtYWlucyB0byBzdXBwb3J0IG9sZCB2ZXJzaW9ucyBvZiBuZnMtdXRpbHMuCi0gKgotICogSW5wdXQ6Ci0gKgkJCWJ1ZjoJc3RydWN0IG5mc2N0bF9mZHBhcm0KLSAqCQkJCWdkX2FkZHI6CXNvY2tldCBhZGRyZXNzIG9mIGNsaWVudAotICoJCQkJZ2RfcGF0aDoJJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nCi0gKgkJCQkJCWNvbnRhaW5pbmcgcGF0aG5hbWUgb2YKLSAqCQkJCQkJZGlyZWN0b3J5IGluIGxvY2FsIGZpbGUgc3lzdGVtCi0gKgkJCQlnZF92ZXJzaW9uOglmZHBhcm0gc3RydWN0dXJlIHZlcnNpb24KLSAqCQkJc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBwYXNzZWQgaW4gbmZzY3RsX2ZkcGFybQotICogT3V0cHV0OgotICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCBuZnNjdGxfcmVzCi0gKgkJCShhIGZpeGVkLWxlbmd0aCByYXcgTkZTIGZpbGUgaGFuZGxlKTsKLSAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgaGFuZGxlCi0gKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgbmVnYXRpdmUgZXJybm8gdmFsdWUKLSAqCi0gKiBOb3RlOiBPbmx5IEFGX0lORVQgY2xpZW50IGFkZHJlc3NlcyBhcmUgcGFzc2VkIGluLCBzaW5jZSBnZF9hZGRyCi0gKiBpcyB0aGUgc2FtZSBzaXplIGFzIGEgc3RydWN0IHNvY2thZGRyX2luLgotICovCi1zdGF0aWMgc3NpemVfdCB3cml0ZV9nZXRmZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgbmZzY3RsX2ZkcGFybSAqZGF0YTsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKLQlzdHJ1Y3QgYXV0aF9kb21haW4gKmNscDsKLQlpbnQgZXJyID0gMDsKLQlzdHJ1Y3Qga25mc2RfZmggZmg7Ci0JY2hhciAqcmVzOwotCXN0cnVjdCBpbjZfYWRkciBpbjY7Ci0KLQlpZiAoc2l6ZSA8IHNpemVvZigqZGF0YSkpCi0JCXJldHVybiAtRUlOVkFMOwotCWRhdGEgPSAoc3RydWN0IG5mc2N0bF9mZHBhcm0qKWJ1ZjsKLQllcnIgPSAtRVBST1RPTk9TVVBQT1JUOwotCWlmIChkYXRhLT5nZF9hZGRyLnNhX2ZhbWlseSAhPSBBRl9JTkVUKQotCQlnb3RvIG91dDsKLQllcnIgPSAtRUlOVkFMOwotCWlmIChkYXRhLT5nZF92ZXJzaW9uIDwgMiB8fCBkYXRhLT5nZF92ZXJzaW9uID4gTkZTU1ZDX01BWFZFUlMpCi0JCWdvdG8gb3V0OwotCi0JcmVzID0gYnVmOwotCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZGF0YS0+Z2RfYWRkcjsKLQlleHBfcmVhZGxvY2soKTsKLQotCWlwdjZfYWRkcl9zZXRfdjRtYXBwZWQoc2luLT5zaW5fYWRkci5zX2FkZHIsICZpbjYpOwotCi0JY2xwID0gYXV0aF91bml4X2xvb2t1cCgmaW5pdF9uZXQsICZpbjYpOwotCWlmICghY2xwKQotCQllcnIgPSAtRVBFUk07Ci0JZWxzZSB7Ci0JCWVyciA9IGV4cF9yb290ZmgoY2xwLCBkYXRhLT5nZF9wYXRoLCAmZmgsIE5GU19GSFNJWkUpOwotCQlhdXRoX2RvbWFpbl9wdXQoY2xwKTsKLQl9Ci0JZXhwX3JlYWR1bmxvY2soKTsKLQotCWlmIChlcnIgPT0gMCkgewotCQltZW1zZXQocmVzLDAsIE5GU19GSFNJWkUpOwotCQltZW1jcHkocmVzLCAmZmguZmhfYmFzZSwgZmguZmhfc2l6ZSk7Ci0JCWVyciA9IE5GU19GSFNJWkU7Ci0JfQotIG91dDoKLQlyZXR1cm4gZXJyOwotfQotI2VuZGlmIC8qIENPTkZJR19ORlNEX0RFUFJFQ0FURUQgKi8KIAogLyoqCiAgKiB3cml0ZV91bmxvY2tfaXAgLSBSZWxlYXNlIGFsbCBsb2NrcyB1c2VkIGJ5IGEgY2xpZW50CkBAIC0xNDA0LDE1ICsxMDYzLDYgQEAKIHN0YXRpYyBpbnQgbmZzZF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB2b2lkICogZGF0YSwgaW50IHNpbGVudCkKIHsKIAlzdGF0aWMgc3RydWN0IHRyZWVfZGVzY3IgbmZzZF9maWxlc1tdID0gewotI2lmZGVmIENPTkZJR19ORlNEX0RFUFJFQ0FURUQKLQkJW05GU0RfU3ZjXSA9IHsiLnN2YyIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J9LAotCQlbTkZTRF9BZGRdID0geyIuYWRkIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUn0sCi0JCVtORlNEX0RlbF0gPSB7Ii5kZWwiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfSwKLQkJW05GU0RfRXhwb3J0XSA9IHsiLmV4cG9ydCIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J9LAotCQlbTkZTRF9VbmV4cG9ydF0gPSB7Ii51bmV4cG9ydCIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J9LAotCQlbTkZTRF9HZXRmZF0gPSB7Ii5nZXRmZCIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVTUn0sCi0JCVtORlNEX0dldGZzXSA9IHsiLmdldGZzIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVVNSfSwKLSNlbmRpZgogCQlbTkZTRF9MaXN0XSA9IHsiZXhwb3J0cyIsICZleHBvcnRzX29wZXJhdGlvbnMsIFNfSVJVR099LAogCQlbTkZTRF9FeHBvcnRfZmVhdHVyZXNdID0geyJleHBvcnRfZmVhdHVyZXMiLAogCQkJCQkmZXhwb3J0X2ZlYXR1cmVzX29wZXJhdGlvbnMsIFNfSVJVR099LApAQCAtMTQyNyw5ICsxMDc3LDkgQEAKIAkJW05GU0RfVmVyc2lvbnNdID0geyJ2ZXJzaW9ucyIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVTUn0sCiAJCVtORlNEX1BvcnRzXSA9IHsicG9ydGxpc3QiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVR099LAogCQlbTkZTRF9NYXhCbGtTaXplXSA9IHsibWF4X2Jsb2NrX3NpemUiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVR099LAotI2lmZGVmIENPTkZJR19TVU5SUENfR1NTCisjaWYgZGVmaW5lZChDT05GSUdfU1VOUlBDX0dTUykgfHwgZGVmaW5lZChDT05GSUdfU1VOUlBDX0dTU19NT0RVTEUpCiAJCVtORlNEX1N1cHBvcnRlZEVuY3R5cGVzXSA9IHsic3VwcG9ydGVkX2tyYjVfZW5jdHlwZXMiLCAmc3VwcG9ydGVkX2VuY3R5cGVzX29wcywgU19JUlVHT30sCi0jZW5kaWYgLyogQ09ORklHX1NVTlJQQ19HU1MgKi8KKyNlbmRpZiAvKiBDT05GSUdfU1VOUlBDX0dTUyBvciBDT05GSUdfU1VOUlBDX0dTU19NT0RVTEUgKi8KICNpZmRlZiBDT05GSUdfTkZTRF9WNAogCQlbTkZTRF9MZWFzZXRpbWVdID0geyJuZnN2NGxlYXNldGltZSIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVTUn0sCiAJCVtORlNEX0dyYWNldGltZV0gPSB7Im5mc3Y0Z3JhY2V0aW1lIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVVNSfSwKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzc3ZjLmMgYi9mcy9uZnNkL25mc3N2Yy5jCmluZGV4IDE4NzQzYzQuLmRjNWExYmYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzc3ZjLmMKKysrIGIvZnMvbmZzZC9uZnNzdmMuYwpAQCAtNTI4LDE2ICs1MjgsOSBAQAogCQkJY29udGludWU7CiAJCX0KIAotCi0JCS8qIExvY2sgdGhlIGV4cG9ydCBoYXNoIHRhYmxlcyBmb3IgcmVhZGluZy4gKi8KLQkJZXhwX3JlYWRsb2NrKCk7Ci0KIAkJdmFsaWRhdGVfcHJvY2Vzc19jcmVkcygpOwogCQlzdmNfcHJvY2VzcyhycXN0cCk7CiAJCXZhbGlkYXRlX3Byb2Nlc3NfY3JlZHMoKTsKLQotCQkvKiBVbmxvY2sgZXhwb3J0IGhhc2ggdGFibGVzICovCi0JCWV4cF9yZWFkdW5sb2NrKCk7CiAJfQogCiAJLyogQ2xlYXIgc2lnbmFscyBiZWZvcmUgY2FsbGluZyBzdmNfZXhpdF90aHJlYWQoKSAqLwpAQCAtNTc3LDggKzU3MCwyMiBAQAogCQkJCXJxc3RwLT5ycV92ZXJzLCBycXN0cC0+cnFfcHJvYyk7CiAJcHJvYyA9IHJxc3RwLT5ycV9wcm9jaW5mbzsKIAorCS8qCisJICogR2l2ZSB0aGUgeGRyIGRlY29kZXIgYSBjaGFuY2UgdG8gY2hhbmdlIHRoaXMgaWYgaXQgd2FudHMKKwkgKiAobmVjZXNzYXJ5IGluIHRoZSBORlN2NC4wIGNvbXBvdW5kIGNhc2UpCisJICovCisJcnFzdHAtPnJxX2NhY2hldHlwZSA9IHByb2MtPnBjX2NhY2hldHlwZTsKKwkvKiBEZWNvZGUgYXJndW1lbnRzICovCisJeGRyID0gcHJvYy0+cGNfZGVjb2RlOworCWlmICh4ZHIgJiYgIXhkcihycXN0cCwgKF9fYmUzMiopcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9iYXNlLAorCQkJcnFzdHAtPnJxX2FyZ3ApKSB7CisJCWRwcmludGsoIm5mc2Q6IGZhaWxlZCB0byBkZWNvZGUgYXJndW1lbnRzIVxuIik7CisJCSpzdGF0cCA9IHJwY19nYXJiYWdlX2FyZ3M7CisJCXJldHVybiAxOworCX0KKwogCS8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0aGlzIGNhbGwgaW4gdGhlIGNhY2hlLiAqLwotCXN3aXRjaCAobmZzZF9jYWNoZV9sb29rdXAocnFzdHAsIHByb2MtPnBjX2NhY2hldHlwZSkpIHsKKwlzd2l0Y2ggKG5mc2RfY2FjaGVfbG9va3VwKHJxc3RwKSkgewogCWNhc2UgUkNfSU5UUjoKIAljYXNlIFJDX0RST1BJVDoKIAkJcmV0dXJuIDA7CkBAIC01ODgsMTYgKzU5NSw2IEBACiAJCS8qIGRvIGl0ICovCiAJfQogCi0JLyogRGVjb2RlIGFyZ3VtZW50cyAqLwotCXhkciA9IHByb2MtPnBjX2RlY29kZTsKLQlpZiAoeGRyICYmICF4ZHIocnFzdHAsIChfX2JlMzIqKXJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfYmFzZSwKLQkJCXJxc3RwLT5ycV9hcmdwKSkgewotCQlkcHJpbnRrKCJuZnNkOiBmYWlsZWQgdG8gZGVjb2RlIGFyZ3VtZW50cyFcbiIpOwotCQluZnNkX2NhY2hlX3VwZGF0ZShycXN0cCwgUkNfTk9DQUNIRSwgTlVMTCk7Ci0JCSpzdGF0cCA9IHJwY19nYXJiYWdlX2FyZ3M7Ci0JCXJldHVybiAxOwotCX0KLQogCS8qIG5lZWQgdG8gZ3JhYiB0aGUgbG9jYXRpb24gdG8gc3RvcmUgdGhlIHN0YXR1cywgYXMKIAkgKiBuZnN2NCBkb2VzIHNvbWUgZW5jb2Rpbmcgd2hpbGUgcHJvY2Vzc2luZyAKIAkgKi8KZGlmZiAtLWdpdCBhL2ZzL25mc2Qvc3RhdGUuaCBiL2ZzL25mc2Qvc3RhdGUuaAppbmRleCA2YmQyZjNjLi40ZWVmYWYxIDEwMDY0NAotLS0gYS9mcy9uZnNkL3N0YXRlLmgKKysrIGIvZnMvbmZzZC9zdGF0ZS5oCkBAIC00ODIsNiArNDgyLDcgQEAKIGV4dGVybiBpbnQgbmZzZDRfY3JlYXRlX2NsaWRfZGlyKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKTsKIGV4dGVybiB2b2lkIG5mc2Q0X3JlbW92ZV9jbGlkX2RpcihzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCk7CiBleHRlcm4gdm9pZCByZWxlYXNlX3Nlc3Npb25fY2xpZW50KHN0cnVjdCBuZnNkNF9zZXNzaW9uICopOworZXh0ZXJuIF9fYmUzMiBuZnM0X3ZhbGlkYXRlX3N0YXRlaWQoc3RhdGVpZF90ICosIGludCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogbmZzNF9wdXRfc3RhdGVvd25lcihzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzbykKZGlmZiAtLWdpdCBhL2ZzL25mc2QvdmZzLmMgYi9mcy9uZnNkL3Zmcy5jCmluZGV4IGQ1NzE4MjcuLmZkMGFjY2EgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvdmZzLmMKKysrIGIvZnMvbmZzZC92ZnMuYwpAQCAtNjk2LDcgKzY5NiwxNSBAQAogfQogI2VuZGlmIC8qIENPTkZJR19ORlNEX1YzICovCiAKK3N0YXRpYyBpbnQgbmZzZF9vcGVuX2JyZWFrX2xlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBhY2Nlc3MpCit7CisJdW5zaWduZWQgaW50IG1vZGU7CiAKKwlpZiAoYWNjZXNzICYgTkZTRF9NQVlfTk9UX0JSRUFLX0xFQVNFKQorCQlyZXR1cm4gMDsKKwltb2RlID0gKGFjY2VzcyAmIE5GU0RfTUFZX1dSSVRFKSA/IE9fV1JPTkxZIDogT19SRE9OTFk7CisJcmV0dXJuIGJyZWFrX2xlYXNlKGlub2RlLCBtb2RlIHwgT19OT05CTE9DSyk7Cit9CiAKIC8qCiAgKiBPcGVuIGFuIGV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5LgpAQCAtNzQ0LDEyICs3NTIsNyBAQAogCWlmICghaW5vZGUtPmlfZm9wKQogCQlnb3RvIG91dDsKIAotCS8qCi0JICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgbGVhc2VzIG9uIHRoaXMgZmlsZS4KLQkgKiBUaGlzIG1heSBibG9jayB3aGlsZSBsZWFzZXMgYXJlIGJyb2tlbi4KLQkgKi8KLQlpZiAoIShhY2Nlc3MgJiBORlNEX01BWV9OT1RfQlJFQUtfTEVBU0UpKQotCQlob3N0X2VyciA9IGJyZWFrX2xlYXNlKGlub2RlLCBPX05PTkJMT0NLIHwgKChhY2Nlc3MgJiBORlNEX01BWV9XUklURSkgPyBPX1dST05MWSA6IDApKTsKKwlob3N0X2VyciA9IG5mc2Rfb3Blbl9icmVha19sZWFzZShpbm9kZSwgYWNjZXNzKTsKIAlpZiAoaG9zdF9lcnIpIC8qIE5PTUVNIG9yIFdPVUxEQkxPQ0sgKi8KIAkJZ290byBvdXRfbmZzZXJyOwogCkBAIC0xNjYwLDggKzE2NjMsMTAgQEAKIAlpZiAoIWRvbGQtPmRfaW5vZGUpCiAJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7CiAJaG9zdF9lcnIgPSBuZnNkX2JyZWFrX2xlYXNlKGRvbGQtPmRfaW5vZGUpOwotCWlmIChob3N0X2VycikKKwlpZiAoaG9zdF9lcnIpIHsKKwkJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCQlnb3RvIG91dF9kcm9wX3dyaXRlOworCX0KIAlob3N0X2VyciA9IHZmc19saW5rKGRvbGQsIGRpcnAsIGRuZXcpOwogCWlmICghaG9zdF9lcnIpIHsKIAkJZXJyID0gbmZzZXJybm8oY29tbWl0X21ldGFkYXRhKGZmaHApKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QveGRyNC5oIGIvZnMvbmZzZC94ZHI0LmgKaW5kZXggMzY2NDAxZS4uZDJhOGQwNDQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QveGRyNC5oCisrKyBiL2ZzL25mc2QveGRyNC5oCkBAIC0zNDIsNiArMzQyLDI1IEBACiAJbmZzNF92ZXJpZmllcglzY19jb25maXJtOwogfTsKIAorc3RydWN0IG5mc2Q0X3NhdmVkX2NvbXBvdW5kYXJncyB7CisJX19iZTMyICpwOworCV9fYmUzMiAqZW5kOworCWludCBwYWdlbGVuOworCXN0cnVjdCBwYWdlICoqcGFnZWxpc3Q7Cit9OworCitzdHJ1Y3QgbmZzZDRfdGVzdF9zdGF0ZWlkIHsKKwlfX2JlMzIJCXRzX251bV9pZHM7CisJX19iZTMyCQl0c19oYXNfc2Vzc2lvbjsKKwlzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICp0c19zYXZlZF9hcmdzOworCXN0cnVjdCBuZnNkNF9zYXZlZF9jb21wb3VuZGFyZ3MgdHNfc2F2ZWRwOworfTsKKworc3RydWN0IG5mc2Q0X2ZyZWVfc3RhdGVpZCB7CisJc3RhdGVpZF90CWZyX3N0YXRlaWQ7ICAgICAgICAgLyogcmVxdWVzdCAqLworCV9fYmUzMgkJZnJfc3RhdHVzOyAgICAgICAgICAvKiByZXNwb25zZSAqLworfTsKKwogLyogYWxzbyB1c2VkIGZvciBOVkVSSUZZICovCiBzdHJ1Y3QgbmZzZDRfdmVyaWZ5IHsKIAl1MzIJCXZlX2JtdmFsWzNdOyAgICAgICAgLyogcmVxdWVzdCAqLwpAQCAtNDMyLDEwICs0NTEsMTQgQEAKIAkJc3RydWN0IG5mc2Q0X2Rlc3Ryb3lfc2Vzc2lvbglkZXN0cm95X3Nlc3Npb247CiAJCXN0cnVjdCBuZnNkNF9zZXF1ZW5jZQkJc2VxdWVuY2U7CiAJCXN0cnVjdCBuZnNkNF9yZWNsYWltX2NvbXBsZXRlCXJlY2xhaW1fY29tcGxldGU7CisJCXN0cnVjdCBuZnNkNF90ZXN0X3N0YXRlaWQJdGVzdF9zdGF0ZWlkOworCQlzdHJ1Y3QgbmZzZDRfZnJlZV9zdGF0ZWlkCWZyZWVfc3RhdGVpZDsKIAl9IHU7CiAJc3RydWN0IG5mczRfcmVwbGF5ICoJCQlyZXBsYXk7CiB9OwogCitib29sIG5mc2Q0X2NhY2hlX3RoaXNfb3Aoc3RydWN0IG5mc2Q0X29wICopOworCiBzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzIHsKIAkvKiBzY3JhdGNoIHZhcmlhYmxlcyBmb3IgWERSIGRlY29kZSAqLwogCV9fYmUzMiAqCQkJcDsKQEAgLTQ1OCw2ICs0ODEsNyBAQAogCXUzMgkJCQlvcGNudDsKIAlzdHJ1Y3QgbmZzZDRfb3AJCQkqb3BzOwogCXN0cnVjdCBuZnNkNF9vcAkJCWlvcHNbOF07CisJaW50CQkJCWNhY2hldHlwZTsKIH07CiAKIHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyB7CkBAIC01NTksMTEgKzU4MywxNSBAQAogbmZzZDRfcmVsZWFzZV9sb2Nrb3duZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKIAkJc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICosCiAJCXN0cnVjdCBuZnNkNF9yZWxlYXNlX2xvY2tvd25lciAqcmxvY2tvd25lcik7Ci1leHRlcm4gdm9pZCBuZnNkNF9yZWxlYXNlX2NvbXBvdW5kYXJncyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICopOworZXh0ZXJuIGludCBuZnNkNF9yZWxlYXNlX2NvbXBvdW5kYXJncyh2b2lkICpycSwgX19iZTMyICpwLCB2b2lkICpyZXNwKTsKIGV4dGVybiBfX2JlMzIgbmZzZDRfZGVsZWdyZXR1cm4oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKIAkJc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICosIHN0cnVjdCBuZnNkNF9kZWxlZ3JldHVybiAqZHIpOwogZXh0ZXJuIF9fYmUzMiBuZnNkNF9yZW5ldyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAogCQkJICBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKiwgY2xpZW50aWRfdCAqY2xpZCk7CitleHRlcm4gX19iZTMyIG5mc2Q0X3Rlc3Rfc3RhdGVpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAorCQlzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKiwgc3RydWN0IG5mc2Q0X3Rlc3Rfc3RhdGVpZCAqdGVzdF9zdGF0ZWlkKTsKK2V4dGVybiBfX2JlMzIgbmZzZDRfZnJlZV9zdGF0ZWlkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCXN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqLCBzdHJ1Y3QgbmZzZDRfZnJlZV9zdGF0ZWlkICpmcmVlX3N0YXRlaWQpOwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvYnRyZWUuYyBiL2ZzL25pbGZzMi9idHJlZS5jCmluZGV4IDdlYWZlNDYuLmIyZTNmZjMgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9idHJlZS5jCisrKyBiL2ZzL25pbGZzMi9idHJlZS5jCkBAIC0xMzQ2LDYgKzEzNDYsMTEgQEAKIAlwYXRoW2xldmVsXS5icF9iaCA9IE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIG5pbGZzX2J0cmVlX25vcChzdHJ1Y3QgbmlsZnNfYm1hcCAqYnRyZWUsCisJCQkgICAgc3RydWN0IG5pbGZzX2J0cmVlX3BhdGggKnBhdGgsCisJCQkgICAgaW50IGxldmVsLCBfX3U2NCAqa2V5cCwgX191NjQgKnB0cnApCit7Cit9CiAKIHN0YXRpYyBpbnQgbmlsZnNfYnRyZWVfcHJlcGFyZV9kZWxldGUoc3RydWN0IG5pbGZzX2JtYXAgKmJ0cmVlLAogCQkJCSAgICAgIHN0cnVjdCBuaWxmc19idHJlZV9wYXRoICpwYXRoLApAQCAtMTM1NiwyMCArMTM2MSwxOSBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IG5pbGZzX2J0cmVlX25vZGUgKm5vZGUsICpwYXJlbnQsICpzaWI7CiAJX191NjQgc2licHRyOwotCWludCBwaW5kZXgsIGxldmVsLCBuY21pbiwgbmNtYXgsIG5jYmxrLCByZXQ7CisJaW50IHBpbmRleCwgZGluZGV4LCBsZXZlbCwgbmNtaW4sIG5jbWF4LCBuY2JsaywgcmV0OwogCiAJcmV0ID0gMDsKIAlzdGF0cy0+YnNfbmJsb2NrcyA9IDA7CiAJbmNtaW4gPSBOSUxGU19CVFJFRV9OT0RFX05DSElMRFJFTl9NSU4obmlsZnNfYnRyZWVfbm9kZV9zaXplKGJ0cmVlKSk7CiAJbmNibGsgPSBuaWxmc19idHJlZV9uY2hpbGRyZW5fcGVyX2Jsb2NrKGJ0cmVlKTsKIAotCWZvciAobGV2ZWwgPSBOSUxGU19CVFJFRV9MRVZFTF9OT0RFX01JTjsKKwlmb3IgKGxldmVsID0gTklMRlNfQlRSRUVfTEVWRUxfTk9ERV9NSU4sIGRpbmRleCA9IHBhdGhbbGV2ZWxdLmJwX2luZGV4OwogCSAgICAgbGV2ZWwgPCBuaWxmc19idHJlZV9oZWlnaHQoYnRyZWUpIC0gMTsKIAkgICAgIGxldmVsKyspIHsKIAkJbm9kZSA9IG5pbGZzX2J0cmVlX2dldF9ub25yb290X25vZGUocGF0aCwgbGV2ZWwpOwogCQlwYXRoW2xldmVsXS5icF9vbGRyZXEuYnByX3B0ciA9Ci0JCQluaWxmc19idHJlZV9ub2RlX2dldF9wdHIobm9kZSwgcGF0aFtsZXZlbF0uYnBfaW5kZXgsCi0JCQkJCQkgbmNibGspOworCQkJbmlsZnNfYnRyZWVfbm9kZV9nZXRfcHRyKG5vZGUsIGRpbmRleCwgbmNibGspOwogCQlyZXQgPSBuaWxmc19ibWFwX3ByZXBhcmVfZW5kX3B0cihidHJlZSwKIAkJCQkJCSAmcGF0aFtsZXZlbF0uYnBfb2xkcmVxLCBkYXQpOwogCQlpZiAocmV0IDwgMCkKQEAgLTEzODMsNiArMTM4Nyw3IEBACiAKIAkJcGFyZW50ID0gbmlsZnNfYnRyZWVfZ2V0X25vZGUoYnRyZWUsIHBhdGgsIGxldmVsICsgMSwgJm5jbWF4KTsKIAkJcGluZGV4ID0gcGF0aFtsZXZlbCArIDFdLmJwX2luZGV4OworCQlkaW5kZXggPSBwaW5kZXg7CiAKIAkJaWYgKHBpbmRleCA+IDApIHsKIAkJCS8qIGxlZnQgc2libGluZyAqLwpAQCAtMTQyMSw2ICsxNDI2LDE0IEBACiAJCQkJcGF0aFtsZXZlbF0uYnBfc2liX2JoID0gYmg7CiAJCQkJcGF0aFtsZXZlbF0uYnBfb3AgPSBuaWxmc19idHJlZV9jb25jYXRfcmlnaHQ7CiAJCQkJc3RhdHMtPmJzX25ibG9ja3MrKzsKKwkJCQkvKgorCQkJCSAqIFdoZW4gbWVyZ2luZyByaWdodCBzaWJsaW5nIG5vZGUKKwkJCQkgKiBpbnRvIHRoZSBjdXJyZW50IG5vZGUsIHBvaW50ZXIgdG8KKwkJCQkgKiB0aGUgcmlnaHQgc2libGluZyBub2RlIG11c3QgYmUKKwkJCQkgKiB0ZXJtaW5hdGVkIGluc3RlYWQuICBUaGUgYWRqdXN0bWVudAorCQkJCSAqIGJlbG93IGlzIHJlcXVpcmVkIGZvciB0aGF0LgorCQkJCSAqLworCQkJCWRpbmRleCA9IHBpbmRleCArIDE7CiAJCQkJLyogY29udGludWU7ICovCiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0xNDMxLDI5ICsxNDQ0LDMxIEBACiAJCQkgICAgTklMRlNfQlRSRUVfUk9PVF9OQ0hJTERSRU5fTUFYKSB7CiAJCQkJcGF0aFtsZXZlbF0uYnBfb3AgPSBuaWxmc19idHJlZV9zaHJpbms7CiAJCQkJc3RhdHMtPmJzX25ibG9ja3MgKz0gMjsKKwkJCQlsZXZlbCsrOworCQkJCXBhdGhbbGV2ZWxdLmJwX29wID0gbmlsZnNfYnRyZWVfbm9wOworCQkJCWdvdG8gc2hyaW5rX3Jvb3RfY2hpbGQ7CiAJCQl9IGVsc2UgewogCQkJCXBhdGhbbGV2ZWxdLmJwX29wID0gbmlsZnNfYnRyZWVfZG9fZGVsZXRlOwogCQkJCXN0YXRzLT5ic19uYmxvY2tzKys7CisJCQkJZ290byBvdXQ7CiAJCQl9Ci0KLQkJCWdvdG8gb3V0OwotCiAJCX0KIAl9CiAKKwkvKiBjaGlsZCBvZiB0aGUgcm9vdCBub2RlIGlzIGRlbGV0ZWQgKi8KKwlwYXRoW2xldmVsXS5icF9vcCA9IG5pbGZzX2J0cmVlX2RvX2RlbGV0ZTsKKwlzdGF0cy0+YnNfbmJsb2NrcysrOworCitzaHJpbmtfcm9vdF9jaGlsZDoKIAlub2RlID0gbmlsZnNfYnRyZWVfZ2V0X3Jvb3QoYnRyZWUpOwogCXBhdGhbbGV2ZWxdLmJwX29sZHJlcS5icHJfcHRyID0KLQkJbmlsZnNfYnRyZWVfbm9kZV9nZXRfcHRyKG5vZGUsIHBhdGhbbGV2ZWxdLmJwX2luZGV4LAorCQluaWxmc19idHJlZV9ub2RlX2dldF9wdHIobm9kZSwgZGluZGV4LAogCQkJCQkgTklMRlNfQlRSRUVfUk9PVF9OQ0hJTERSRU5fTUFYKTsKIAogCXJldCA9IG5pbGZzX2JtYXBfcHJlcGFyZV9lbmRfcHRyKGJ0cmVlLCAmcGF0aFtsZXZlbF0uYnBfb2xkcmVxLCBkYXQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9vdXRfY2hpbGRfbm9kZTsKIAotCS8qIGNoaWxkIG9mIHRoZSByb290IG5vZGUgaXMgZGVsZXRlZCAqLwotCXBhdGhbbGV2ZWxdLmJwX29wID0gbmlsZnNfYnRyZWVfZG9fZGVsZXRlOwotCXN0YXRzLT5ic19uYmxvY2tzKys7Ci0KIAkvKiBzdWNjZXNzICovCiAgb3V0OgogCSpsZXZlbHAgPSBsZXZlbDsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9maWxlLmMgYi9mcy9uaWxmczIvZmlsZS5jCmluZGV4IGQ3ZWVjYTYuLjI2NjAxNTIgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9maWxlLmMKKysrIGIvZnMvbmlsZnMyL2ZpbGUuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgIm5pbGZzLmgiCiAjaW5jbHVkZSAic2VnbWVudC5oIgogCi1pbnQgbmlsZnNfc3luY19maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpCitpbnQgbmlsZnNfc3luY19maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhc3luYykKIHsKIAkvKgogCSAqIENhbGxlZCBmcm9tIGZzeW5jKCkgc3lzdGVtIGNhbGwKQEAgLTQwLDggKzQwLDE1IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlpbnQgZXJyOwogCi0JaWYgKCFuaWxmc19pbm9kZV9kaXJ0eShpbm9kZSkpCisJZXJyID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKworCWlmICghbmlsZnNfaW5vZGVfZGlydHkoaW5vZGUpKSB7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAoZGF0YXN5bmMpCiAJCWVyciA9IG5pbGZzX2NvbnN0cnVjdF9kc3luY19zZWdtZW50KGlub2RlLT5pX3NiLCBpbm9kZSwgMCwKQEAgLTQ5LDYgKzU2LDcgQEAKIAllbHNlCiAJCWVyciA9IG5pbGZzX2NvbnN0cnVjdF9zZWdtZW50KGlub2RlLT5pX3NiKTsKIAorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9pbm9kZS5jIGIvZnMvbmlsZnMyL2lub2RlLmMKaW5kZXggYjk1NDg3OC4uNjY2NjI4YiAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2lub2RlLmMKKysrIGIvZnMvbmlsZnMyL2lub2RlLmMKQEAgLTI1OSw4ICsyNTksOCBAQAogCQlyZXR1cm4gMDsKIAogCS8qIE5lZWRzIHN5bmNocm9uaXphdGlvbiB3aXRoIHRoZSBjbGVhbmVyICovCi0Jc2l6ZSA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKLQkJCQkgIG9mZnNldCwgbnJfc2VncywgbmlsZnNfZ2V0X2Jsb2NrLCBOVUxMKTsKKwlzaXplID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW92LCBvZmZzZXQsIG5yX3NlZ3MsCisJCQkJICBuaWxmc19nZXRfYmxvY2spOwogCiAJLyoKIAkgKiBJbiBjYXNlIG9mIGVycm9yIGV4dGVuZGluZyB3cml0ZSBtYXkgaGF2ZSBpbnN0YW50aWF0ZWQgYSBmZXcKQEAgLTc3OCw2ICs3NzgsOCBAQAogCiAJaWYgKChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpICYmCiAJICAgIGlhdHRyLT5pYV9zaXplICE9IGlfc2l6ZV9yZWFkKGlub2RlKSkgeworCQlpbm9kZV9kaW9fd2FpdChpbm9kZSk7CisKIAkJZXJyID0gdm10cnVuY2F0ZShpbm9kZSwgaWF0dHItPmlhX3NpemUpOwogCQlpZiAodW5saWtlbHkoZXJyKSkKIAkJCWdvdG8gb3V0X2VycjsKQEAgLTc5OSwxOSArODAxLDE0IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG5pbGZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncykKK2ludCBuaWxmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewotCXN0cnVjdCBuaWxmc19yb290ICpyb290OwotCi0JaWYgKGZsYWdzICYgSVBFUk1fRkxBR19SQ1UpCi0JCXJldHVybiAtRUNISUxEOwotCi0Jcm9vdCA9IE5JTEZTX0koaW5vZGUpLT5pX3Jvb3Q7CisJc3RydWN0IG5pbGZzX3Jvb3QgKnJvb3QgPSBOSUxGU19JKGlub2RlKS0+aV9yb290OwogCWlmICgobWFzayAmIE1BWV9XUklURSkgJiYgcm9vdCAmJgogCSAgICByb290LT5jbm8gIT0gTklMRlNfQ1BUUkVFX0NVUlJFTlRfQ05PKQogCQlyZXR1cm4gLUVST0ZTOyAvKiBzbmFwc2hvdCBpcyBub3Qgd3JpdGFibGUgKi8KIAotCXJldHVybiBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIGZsYWdzLCBOVUxMKTsKKwlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrKTsKIH0KIAogaW50IG5pbGZzX2xvYWRfaW5vZGVfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcGJoKQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL25hbWVpLmMgYi9mcy9uaWxmczIvbmFtZWkuYwppbmRleCA1NDY4NDliLi5hMzE0MTk5IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvbmFtZWkuYworKysgYi9mcy9uaWxmczIvbmFtZWkuYwpAQCAtNzIsMTIgKzcyLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CiAKIAlpbm8gPSBuaWxmc19pbm9kZV9ieV9uYW1lKGRpciwgJmRlbnRyeS0+ZF9uYW1lKTsKLQlpbm9kZSA9IE5VTEw7Ci0JaWYgKGlubykgewotCQlpbm9kZSA9IG5pbGZzX2lnZXQoZGlyLT5pX3NiLCBOSUxGU19JKGRpciktPmlfcm9vdCwgaW5vKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpCi0JCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwotCX0KKwlpbm9kZSA9IGlubyA/IG5pbGZzX2lnZXQoZGlyLT5pX3NiLCBOSUxGU19JKGRpciktPmlfcm9vdCwgaW5vKSA6IE5VTEw7CiAJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwogfQogCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvbmlsZnMuaCBiL2ZzL25pbGZzMi9uaWxmcy5oCmluZGV4IGYwMmI5YWQuLjI1NWQ1ZTEgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9uaWxmcy5oCisrKyBiL2ZzL25pbGZzMi9uaWxmcy5oCkBAIC0yMzUsNyArMjM1LDcgQEAKIAkJCSAgIHN0cnVjdCBwYWdlICosIHN0cnVjdCBpbm9kZSAqKTsKIAogLyogZmlsZS5jICovCi1leHRlcm4gaW50IG5pbGZzX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqLCBpbnQpOworZXh0ZXJuIGludCBuaWxmc19zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBsb2ZmX3QsIGludCk7CiAKIC8qIGlvY3RsLmMgKi8KIGxvbmcgbmlsZnNfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKQEAgLTI2NCw3ICsyNjQsNyBAQAogZXh0ZXJuIHZvaWQgbmlsZnNfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgbmlsZnNfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBuaWxmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwotaW50IG5pbGZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncyk7CitpbnQgbmlsZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiBpbnQgbmlsZnNfbG9hZF9pbm9kZV9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwYmgpOwogZXh0ZXJuIGludCBuaWxmc19pbm9kZV9kaXJ0eShzdHJ1Y3QgaW5vZGUgKik7CiBpbnQgbmlsZnNfc2V0X2ZpbGVfZGlydHkoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbnJfZGlydHkpOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3NlZ21lbnQuYyBiL2ZzL25pbGZzMi9zZWdtZW50LmMKaW5kZXggMTQxNjQ2ZS4uYmIyNGFiNiAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3NlZ21lbnQuYworKysgYi9mcy9uaWxmczIvc2VnbWVudC5jCkBAIC0yNTczLDcgKzI1NzMsNyBAQAogCXNjaS0+c2Nfd2F0ZXJtYXJrID0gTklMRlNfU0NfREVGQVVMVF9XQVRFUk1BUks7CiAKIAlpZiAobmlsZnMtPm5zX2ludGVydmFsKQotCQlzY2ktPnNjX2ludGVydmFsID0gbmlsZnMtPm5zX2ludGVydmFsOworCQlzY2ktPnNjX2ludGVydmFsID0gSFogKiBuaWxmcy0+bnNfaW50ZXJ2YWw7CiAJaWYgKG5pbGZzLT5uc193YXRlcm1hcmspCiAJCXNjaS0+c2Nfd2F0ZXJtYXJrID0gbmlsZnMtPm5zX3dhdGVybWFyazsKIAlyZXR1cm4gc2NpOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9kaXIuYyBiL2ZzL250ZnMvZGlyLmMKaW5kZXggMGY0OGU3Yy4uOTllMzYxMCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9kaXIuYworKysgYi9mcy9udGZzL2Rpci5jCkBAIC0xNTI3LDEzICsxNTI3LDIwIEBACiAgKiB0aGlzIHByb2JsZW0gZm9yIG5vdy4gIFdlIGRvIHdyaXRlIHRoZSAkQklUTUFQIGF0dHJpYnV0ZSBpZiBpdCBpcyBwcmVzZW50CiAgKiB3aGljaCBpcyB0aGUgaW1wb3J0YW50IG9uZSBmb3IgYSBkaXJlY3Rvcnkgc28gdGhpbmdzIGFyZSBub3QgdG9vIGJhZC4KICAqLwotc3RhdGljIGludCBudGZzX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGRhdGFzeW5jKQorc3RhdGljIGludCBudGZzX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkJICBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IGlub2RlICpibXBfdmksICp2aSA9IGZpbHAtPmZfbWFwcGluZy0+aG9zdDsKIAlpbnQgZXJyLCByZXQ7CiAJbnRmc19hdHRyIG5hOwogCiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIHZpLT5pX2lubyk7CisKKwllcnIgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKHZpLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJbXV0ZXhfbG9jaygmdmktPmlfbXV0ZXgpOworCiAJQlVHX09OKCFTX0lTRElSKHZpLT5pX21vZGUpKTsKIAkvKiBJZiB0aGUgYml0bWFwIGF0dHJpYnV0ZSBpbm9kZSBpcyBpbiBtZW1vcnkgc3luYyBpdCwgdG9vLiAqLwogCW5hLm1mdF9ubyA9IHZpLT5pX2lubzsKQEAgLTE1NTUsNiArMTU2Miw3IEBACiAJZWxzZQogCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJGYWlsZWQgdG8gZiVzc3luYyBpbm9kZSAweCVseC4gIEVycm9yICIKIAkJCQkiJXUuIiwgZGF0YXN5bmMgPyAiZGF0YSIgOiAiIiwgdmktPmlfaW5vLCAtcmV0KTsKKwltdXRleF91bmxvY2soJnZpLT5pX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9udGZzL2ZpbGUuYyBiL2ZzL250ZnMvZmlsZS5jCmluZGV4IGY0YjEwNTcuLmM1ODdlMmQgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvZmlsZS5jCisrKyBiL2ZzL250ZnMvZmlsZS5jCkBAIC0xODMyLDkgKzE4MzIsOCBAQAogCSAqIGZhaWxzIGFnYWluLgogCSAqLwogCWlmICh1bmxpa2VseShOSW5vVHJ1bmNhdGVGYWlsZWQobmkpKSkgewotCQlkb3duX3dyaXRlKCZ2aS0+aV9hbGxvY19zZW0pOworCQlpbm9kZV9kaW9fd2FpdCh2aSk7CiAJCWVyciA9IG50ZnNfdHJ1bmNhdGUodmkpOwotCQl1cF93cml0ZSgmdmktPmlfYWxsb2Nfc2VtKTsKIAkJaWYgKGVyciB8fCBOSW5vVHJ1bmNhdGVGYWlsZWQobmkpKSB7CiAJCQlpZiAoIWVycikKIAkJCQllcnIgPSAtRUlPOwpAQCAtMjE1MywxMiArMjE1MiwxOSBAQAogICogd2l0aCB0aGlzIGlub2RlIGJ1dCBzaW5jZSB3ZSBoYXZlIG5vIHNpbXBsZSB3YXkgb2YgZ2V0dGluZyB0byB0aGVtIHdlIGlnbm9yZQogICogdGhpcyBwcm9ibGVtIGZvciBub3cuCiAgKi8KLXN0YXRpYyBpbnQgbnRmc19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgZGF0YXN5bmMpCitzdGF0aWMgaW50IG50ZnNfZmlsZV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkJICAgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBpbm9kZSAqdmkgPSBmaWxwLT5mX21hcHBpbmctPmhvc3Q7CiAJaW50IGVyciwgcmV0ID0gMDsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseC4iLCB2aS0+aV9pbm8pOworCisJZXJyID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZSh2aS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCW11dGV4X2xvY2soJnZpLT5pX211dGV4KTsKKwogCUJVR19PTihTX0lTRElSKHZpLT5pX21vZGUpKTsKIAlpZiAoIWRhdGFzeW5jIHx8ICFOSW5vTm9uUmVzaWRlbnQoTlRGU19JKHZpKSkpCiAJCXJldCA9IF9fbnRmc193cml0ZV9pbm9kZSh2aSwgMSk7CkBAIC0yMTc2LDYgKzIxODIsNyBAQAogCWVsc2UKIAkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGYlc3N5bmMgaW5vZGUgMHglbHguICBFcnJvciAiCiAJCQkJIiV1LiIsIGRhdGFzeW5jID8gImRhdGEiIDogIiIsIHZpLT5pX2lubywgLXJldCk7CisJbXV0ZXhfdW5sb2NrKCZ2aS0+aV9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbnRmcy9pbm9kZS5jIGIvZnMvbnRmcy9pbm9kZS5jCmluZGV4IGMwNWQ2ZGMuLjEzNzE0ODcgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvaW5vZGUuYworKysgYi9mcy9udGZzL2lub2RlLmMKQEAgLTIzNTcsMTIgKzIzNTcsNyBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KICAqCi0gKiBDYWxsZWQgd2l0aCAtPmlfbXV0ZXggaGVsZC4gIEluIGFsbCBidXQgb25lIGNhc2UgLT5pX2FsbG9jX3NlbSBpcyBoZWxkIGZvcgotICogd3JpdGluZy4gIFRoZSBvbmx5IGNhc2UgaW4gdGhlIGtlcm5lbCB3aGVyZSAtPmlfYWxsb2Nfc2VtIGlzIG5vdCBoZWxkIGlzCi0gKiBtbS9maWxlbWFwLmM6OmdlbmVyaWNfZmlsZV9idWZmZXJlZF93cml0ZSgpIHdoZXJlIHZtdHJ1bmNhdGUoKSBpcyBjYWxsZWQKLSAqIHdpdGggdGhlIGN1cnJlbnQgaV9zaXplIGFzIHRoZSBvZmZzZXQuICBUaGUgYW5hbG9nb3VzIHBsYWNlIGluIE5URlMgaXMgaW4KLSAqIGZzL250ZnMvZmlsZS5jOjpudGZzX2ZpbGVfYnVmZmVyZWRfd3JpdGUoKSB3aGVyZSB3ZSBjYWxsIHZtdHJ1bmNhdGUoKSBhZ2FpbgotICogd2l0aG91dCBob2xkaW5nIC0+aV9hbGxvY19zZW0uCisgKiBDYWxsZWQgd2l0aCAtPmlfbXV0ZXggaGVsZC4KICAqLwogaW50IG50ZnNfdHJ1bmNhdGUoc3RydWN0IGlub2RlICp2aSkKIHsKQEAgLTI4ODcsOCArMjg4Miw3IEBACiAgKiBXZSBhbHNvIGFib3J0IGFsbCBjaGFuZ2VzIG9mIHVzZXIsIGdyb3VwLCBhbmQgbW9kZSBhcyB3ZSBkbyBub3QgaW1wbGVtZW50CiAgKiB0aGUgTlRGUyBBQ0xzIHlldC4KICAqCi0gKiBDYWxsZWQgd2l0aCAtPmlfbXV0ZXggaGVsZC4gIEZvciB0aGUgQVRUUl9TSVpFIChpLmUuIC0+dHJ1bmNhdGUpIGNhc2UsIGFsc28KLSAqIGNhbGxlZCB3aXRoIC0+aV9hbGxvY19zZW0gaGVsZCBmb3Igd3JpdGluZy4KKyAqIENhbGxlZCB3aXRoIC0+aV9tdXRleCBoZWxkLgogICovCiBpbnQgbnRmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQogewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWNsLmMgYi9mcy9vY2ZzMi9hY2wuYwppbmRleCBlOTEzYWQxLi43ODNjNThkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hY2wuYworKysgYi9mcy9vY2ZzMi9hY2wuYwpAQCAtMjkwLDQ3ICsyOTAsMzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgb2NmczJfY2hlY2tfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitzdHJ1Y3QgcG9zaXhfYWNsICpvY2ZzMl9pb3BfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYjsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJaW50IHJldCA9IC1FQUdBSU47CiAKLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKLQkJcmV0dXJuIC1FQ0hJTEQ7Ci0KIAlvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJaWYgKCEob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX1BPU0lYX0FDTCkpCi0JCXJldHVybiByZXQ7CisJCXJldHVybiBOVUxMOwogCiAJcmV0ID0gb2NmczJfcmVhZF9pbm9kZV9ibG9jayhpbm9kZSwgJmRpX2JoKTsKLQlpZiAocmV0IDwgMCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCi0JYWNsID0gb2NmczJfZ2V0X2FjbF9ub2xvY2soaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgZGlfYmgpOworCWFjbCA9IG9jZnMyX2dldF9hY2xfbm9sb2NrKGlub2RlLCB0eXBlLCBkaV9iaCk7CiAKIAlicmVsc2UoZGlfYmgpOwogCi0JaWYgKElTX0VSUihhY2wpKSB7Ci0JCW1sb2dfZXJybm8oUFRSX0VSUihhY2wpKTsKLQkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKLQl9Ci0JaWYgKGFjbCkgewotCQlyZXQgPSBwb3NpeF9hY2xfcGVybWlzc2lvbihpbm9kZSwgYWNsLCBtYXNrKTsKLQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gLUVBR0FJTjsKKwlyZXR1cm4gYWNsOwogfQogCiBpbnQgb2NmczJfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqY2xvbmU7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCWludCByZXQ7CiAKIAlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKQEAgLTM0MiwxNSArMzI3LDEyIEBACiAJYWNsID0gb2NmczJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKIAlpZiAoSVNfRVJSKGFjbCkgfHwgIWFjbCkKIAkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKLQljbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9LRVJORUwpOworCXJldCA9IHBvc2l4X2FjbF9jaG1vZCgmYWNsLCBHRlBfS0VSTkVMLCBpbm9kZS0+aV9tb2RlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IG9jZnMyX3NldF9hY2woTlVMTCwgaW5vZGUsIE5VTEwsIEFDTF9UWVBFX0FDQ0VTUywKKwkJCSAgICBhY2wsIE5VTEwsIE5VTEwpOwogCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7Ci0JaWYgKCFjbG9uZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmV0ID0gcG9zaXhfYWNsX2NobW9kX21hc3EoY2xvbmUsIGlub2RlLT5pX21vZGUpOwotCWlmICghcmV0KQotCQlyZXQgPSBvY2ZzMl9zZXRfYWNsKE5VTEwsIGlub2RlLCBOVUxMLCBBQ0xfVFlQRV9BQ0NFU1MsCi0JCQkJICAgIGNsb25lLCBOVUxMLCBOVUxMKTsKLQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzg4LDggKzM3MCw2IEBACiAJCX0KIAl9CiAJaWYgKChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSAmJiBhY2wpIHsKLQkJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmU7Ci0KIAkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKIAkJCXJldCA9IG9jZnMyX3NldF9hY2woaGFuZGxlLCBpbm9kZSwgZGlfYmgsCiAJCQkJCSAgICBBQ0xfVFlQRV9ERUZBVUxULCBhY2wsCkBAIC0zOTcsMjcgKzM3NywyMiBAQAogCQkJaWYgKHJldCkKIAkJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQkJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfTk9GUyk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWlmICghY2xvbmUpCi0JCQlnb3RvIGNsZWFudXA7Ci0KIAkJbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JCXJldCA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShjbG9uZSwgJm1vZGUpOwotCQlpZiAocmV0ID49IDApIHsKLQkJCXJldDIgPSBvY2ZzMl9hY2xfc2V0X21vZGUoaW5vZGUsIGRpX2JoLCBoYW5kbGUsIG1vZGUpOwotCQkJaWYgKHJldDIpIHsKLQkJCQltbG9nX2Vycm5vKHJldDIpOwotCQkJCXJldCA9IHJldDI7Ci0JCQkJZ290byBjbGVhbnVwOwotCQkJfQotCQkJaWYgKHJldCA+IDApIHsKLQkJCQlyZXQgPSBvY2ZzMl9zZXRfYWNsKGhhbmRsZSwgaW5vZGUsCi0JCQkJCQkgICAgZGlfYmgsIEFDTF9UWVBFX0FDQ0VTUywKLQkJCQkJCSAgICBjbG9uZSwgbWV0YV9hYywgZGF0YV9hYyk7Ci0JCQl9CisJCXJldCA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZtb2RlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldDIgPSBvY2ZzMl9hY2xfc2V0X21vZGUoaW5vZGUsIGRpX2JoLCBoYW5kbGUsIG1vZGUpOworCQlpZiAocmV0MikgeworCQkJbWxvZ19lcnJubyhyZXQyKTsKKwkJCXJldCA9IHJldDI7CisJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQkJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworCQlpZiAocmV0ID4gMCkgeworCQkJcmV0ID0gb2NmczJfc2V0X2FjbChoYW5kbGUsIGlub2RlLAorCQkJCQkgICAgZGlfYmgsIEFDTF9UWVBFX0FDQ0VTUywKKwkJCQkJICAgIGFjbCwgbWV0YV9hYywgZGF0YV9hYyk7CisJCX0KIAl9CiBjbGVhbnVwOgogCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hY2wuaCBiL2ZzL29jZnMyL2FjbC5oCmluZGV4IDRmZTdjOWMuLjA3MWZiZDM4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hY2wuaAorKysgYi9mcy9vY2ZzMi9hY2wuaApAQCAtMjYsNyArMjYsNyBAQAogCV9fbGUzMiBlX2lkOwogfTsKIAotZXh0ZXJuIGludCBvY2ZzMl9jaGVja19hY2woc3RydWN0IGlub2RlICosIGludCwgdW5zaWduZWQgaW50KTsKK3N0cnVjdCBwb3NpeF9hY2wgKm9jZnMyX2lvcF9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgb2NmczJfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbnQgb2NmczJfaW5pdF9hY2woaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqLAogCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hb3BzLmMgYi9mcy9vY2ZzMi9hb3BzLmMKaW5kZXggYWM5N2JjYS4uYzFlZmU5MyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYW9wcy5jCisrKyBiL2ZzL29jZnMyL2FvcHMuYwpAQCAtNTUxLDkgKzU1MSw4IEBACiAKIC8qCiAgKiBvY2ZzMl9kaW9fZW5kX2lvIGlzIGNhbGxlZCBieSB0aGUgZGlvIGNvcmUgd2hlbiBhIGRpbyBpcyBmaW5pc2hlZC4gIFdlJ3JlCi0gKiBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiB0aGUgYWlvL2RpbyBjYXNlLiAgTGlrZSB0aGUgY29yZSB1c2VzCi0gKiBpX2FsbG9jX3NlbSwgd2UgdXNlIHRoZSByd19sb2NrIERMTSBsb2NrIHRvIHByb3RlY3QgaW8gb24gb25lIG5vZGUgZnJvbQotICogdHJ1bmNhdGlvbiBvbiBhbm90aGVyLgorICogcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gdGhlIGFpby9kaW8gY2FzZS4gIFdlIHVzZSB0aGUgcndfbG9jayBETE0gbG9jaworICogdG8gcHJvdGVjdCBpbyBvbiBvbmUgbm9kZSBmcm9tIHRydW5jYXRpb24gb24gYW5vdGhlci4KICAqLwogc3RhdGljIHZvaWQgb2NmczJfZGlvX2VuZF9pbyhzdHJ1Y3Qga2lvY2IgKmlvY2IsCiAJCQkgICAgIGxvZmZfdCBvZmZzZXQsCkBAIC01NjgsMTAgKzU2Nyw4IEBACiAJLyogdGhpcyBpbydzIHN1Ym1pdHRlciBzaG91bGQgbm90IGhhdmUgdW5sb2NrZWQgdGhpcyBiZWZvcmUgd2UgY291bGQgKi8KIAlCVUdfT04oIW9jZnMyX2lvY2JfaXNfcndfbG9ja2VkKGlvY2IpKTsKIAotCWlmIChvY2ZzMl9pb2NiX2lzX3NlbV9sb2NrZWQoaW9jYikpIHsKLQkJdXBfcmVhZCgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKKwlpZiAob2NmczJfaW9jYl9pc19zZW1fbG9ja2VkKGlvY2IpKQogCQlvY2ZzMl9pb2NiX2NsZWFyX3NlbV9sb2NrZWQoaW9jYik7Ci0JfQogCiAJb2NmczJfaW9jYl9jbGVhcl9yd19sb2NrZWQoaW9jYik7CiAKQEAgLTU4MCw2ICs1NzcsNyBAQAogCiAJaWYgKGlzX2FzeW5jKQogCQlhaW9fY29tcGxldGUoaW9jYiwgcmV0LCAwKTsKKwlpbm9kZV9kaW9fZG9uZShpbm9kZSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmMgYi9mcy9vY2ZzMi9maWxlLmMKaW5kZXggYjFlMzVhMy4uZGU0ZWExYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5jCisrKyBiL2ZzL29jZnMyL2ZpbGUuYwpAQCAtMTcxLDcgKzE3MSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfc3luY19maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpCitzdGF0aWMgaW50IG9jZnMyX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkJICAgaW50IGRhdGFzeW5jKQogewogCWludCBlcnIgPSAwOwogCWpvdXJuYWxfdCAqam91cm5hbDsKQEAgLTE4NCw2ICsxODUsMTYgQEAKIAkJCSAgICAgIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLAogCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkYXRhc3luYyk7CiAKKwllcnIgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIFByb2JhYmx5IGRvbid0IG5lZWQgdGhlIGlfbXV0ZXggYXQgYWxsIGluIGhlcmUsIGp1c3QgcHV0dGluZyBpdCBoZXJlCisJICogdG8gYmUgY29uc2lzdGVudCB3aXRoIGhvdyBmc3luYyB1c2VkIHRvIGJlIGNhbGxlZCwgc29tZW9uZSBtb3JlCisJICogZmFtaWxpYXIgd2l0aCB0aGUgZnMgY291bGQgcG9zc2libHkgcmVtb3ZlIGl0LgorCSAqLworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlpZiAoZGF0YXN5bmMgJiYgIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFlfREFUQVNZTkMpKSB7CiAJCS8qCiAJCSAqIFdlIHN0aWxsIGhhdmUgdG8gZmx1c2ggZHJpdmUncyBjYWNoZXMgdG8gZ2V0IGRhdGEgdG8gdGhlCkBAIC0yMDAsNiArMjExLDcgQEAKIGJhaWw6CiAJaWYgKGVycikKIAkJbWxvZ19lcnJubyhlcnIpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmV0dXJuIChlcnIgPCAwKSA/IC1FSU8gOiAwOwogfQpAQCAtMTE0Miw2ICsxMTU0LDggQEAKIAkJaWYgKHN0YXR1cykKIAkJCWdvdG8gYmFpbF91bmxvY2s7CiAKKwkJaW5vZGVfZGlvX3dhaXQoaW5vZGUpOworCiAJCWlmIChpX3NpemVfcmVhZChpbm9kZSkgPiBhdHRyLT5pYV9zaXplKSB7CiAJCQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKSB7CiAJCQkJc3RhdHVzID0gb2NmczJfYmVnaW5fb3JkZXJlZF90cnVuY2F0ZShpbm9kZSwKQEAgLTEyNzksMTEgKzEyOTMsMTEgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgb2NmczJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQoraW50IG9jZnMyX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCiB7CiAJaW50IHJldDsKIAotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQorCWlmIChtYXNrICYgTUFZX05PVF9CTE9DSykKIAkJcmV0dXJuIC1FQ0hJTEQ7CiAKIAlyZXQgPSBvY2ZzMl9pbm9kZV9sb2NrKGlub2RlLCBOVUxMLCAwKTsKQEAgLTEyOTMsNyArMTMwNyw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgZmxhZ3MsIG9jZnMyX2NoZWNrX2FjbCk7CisJcmV0ID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrKTsKIAogCW9jZnMyX2lub2RlX3VubG9jayhpbm9kZSwgMCk7CiBvdXQ6CkBAIC0yMjM2LDkgKzIyNTAsOCBAQAogCW9jZnMyX2lvY2JfY2xlYXJfc2VtX2xvY2tlZChpb2NiKTsKIAogcmVsb2NrOgotCS8qIHRvIG1hdGNoIHNldGF0dHIncyBpX211dGV4IC0+IGlfYWxsb2Nfc2VtIC0+IHJ3X2xvY2sgb3JkZXJpbmcgKi8KKwkvKiB0byBtYXRjaCBzZXRhdHRyJ3MgaV9tdXRleCAtPiByd19sb2NrIG9yZGVyaW5nICovCiAJaWYgKGRpcmVjdF9pbykgewotCQlkb3duX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7CiAJCWhhdmVfYWxsb2Nfc2VtID0gMTsKIAkJLyogY29tbXVuaWNhdGUgd2l0aCBvY2ZzMl9kaW9fZW5kX2lvICovCiAJCW9jZnMyX2lvY2Jfc2V0X3NlbV9sb2NrZWQoaW9jYik7CkBAIC0yMjkwLDcgKzIzMDMsNiBAQAogCSAqLwogCWlmIChkaXJlY3RfaW8gJiYgIWNhbl9kb19kaXJlY3QpIHsKIAkJb2NmczJfcndfdW5sb2NrKGlub2RlLCByd19sZXZlbCk7Ci0JCXVwX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7CiAKIAkJaGF2ZV9hbGxvY19zZW0gPSAwOwogCQlyd19sZXZlbCA9IC0xOwpAQCAtMjM2MSw4ICsyMzczLDcgQEAKIAkvKgogCSAqIGRlZXAgaW4gZ19mX2Ffd19uKCktPm9jZnMyX2RpcmVjdF9JTyB3ZSBwYXNzIGluIGEgb2NmczJfZGlvX2VuZF9pbwogCSAqIGZ1bmN0aW9uIHBvaW50ZXIgd2hpY2ggaXMgY2FsbGVkIHdoZW4gb19kaXJlY3QgaW8gY29tcGxldGVzIHNvIHRoYXQKLQkgKiBpdCBjYW4gdW5sb2NrIG91ciBydyBsb2NrLiAgKGl0J3MgdGhlIGNsdXN0ZXJlZCBlcXVpdmFsZW50IG9mCi0JICogaV9hbGxvY19zZW07IHByb3RlY3RzIHRydW5jYXRlIGZyb20gcmFjaW5nIHdpdGggcGVuZGluZyBpb3MpLgorCSAqIGl0IGNhbiB1bmxvY2sgb3VyIHJ3IGxvY2suCiAJICogVW5mb3J0dW5hdGVseSB0aGVyZSBhcmUgZXJyb3IgY2FzZXMgd2hpY2ggY2FsbCBlbmRfaW8gYW5kIG90aGVycwogCSAqIHRoYXQgZG9uJ3QuICBzbyB3ZSBkb24ndCBoYXZlIHRvIHVubG9jayB0aGUgcndfbG9jayBpZiBlaXRoZXIgYW4KIAkgKiBhc3luYyBkaW8gaXMgZ29pbmcgdG8gZG8gaXQgaW4gdGhlIGZ1dHVyZSBvciBhbiBlbmRfaW8gYWZ0ZXIgYW4KQEAgLTIzNzgsMTAgKzIzODksOCBAQAogCQlvY2ZzMl9yd191bmxvY2soaW5vZGUsIHJ3X2xldmVsKTsKIAogb3V0X3NlbXM6Ci0JaWYgKGhhdmVfYWxsb2Nfc2VtKSB7Ci0JCXVwX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7CisJaWYgKGhhdmVfYWxsb2Nfc2VtKQogCQlvY2ZzMl9pb2NiX2NsZWFyX3NlbV9sb2NrZWQoaW9jYik7Ci0JfQogCiAJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKQEAgLTI1MzEsNyArMjU0MCw2IEBACiAJICogbmVlZCBsb2NrcyB0byBwcm90ZWN0IHBlbmRpbmcgcmVhZHMgZnJvbSByYWNpbmcgd2l0aCB0cnVuY2F0ZS4KIAkgKi8KIAlpZiAoZmlscC0+Zl9mbGFncyAmIE9fRElSRUNUKSB7Ci0JCWRvd25fcmVhZCgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKIAkJaGF2ZV9hbGxvY19zZW0gPSAxOwogCQlvY2ZzMl9pb2NiX3NldF9zZW1fbG9ja2VkKGlvY2IpOwogCkBAIC0yNTc0LDEwICsyNTgyLDkgQEAKIAl9CiAKIGJhaWw6Ci0JaWYgKGhhdmVfYWxsb2Nfc2VtKSB7Ci0JCXVwX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7CisJaWYgKGhhdmVfYWxsb2Nfc2VtKQogCQlvY2ZzMl9pb2NiX2NsZWFyX3NlbV9sb2NrZWQoaW9jYik7Ci0JfQorCiAJaWYgKHJ3X2xldmVsICE9IC0xKQogCQlvY2ZzMl9yd191bmxvY2soaW5vZGUsIHJ3X2xldmVsKTsKIApAQCAtMjU5MywxMiArMjYwMCwxNCBAQAogCS5saXN0eGF0dHIJPSBvY2ZzMl9saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIAkuZmllbWFwCQk9IG9jZnMyX2ZpZW1hcCwKKwkuZ2V0X2FjbAk9IG9jZnMyX2lvcF9nZXRfYWNsLAogfTsKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgb2NmczJfc3BlY2lhbF9maWxlX2lvcHMgPSB7CiAJLnNldGF0dHIJPSBvY2ZzMl9zZXRhdHRyLAogCS5nZXRhdHRyCT0gb2NmczJfZ2V0YXR0ciwKIAkucGVybWlzc2lvbgk9IG9jZnMyX3Blcm1pc3Npb24sCisJLmdldF9hY2wJPSBvY2ZzMl9pb3BfZ2V0X2FjbCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmggYi9mcy9vY2ZzMi9maWxlLmgKaW5kZXggZjVhZmJiZS4uOTdiZjc2MSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5oCisrKyBiL2ZzL29jZnMyL2ZpbGUuaApAQCAtNjEsNyArNjEsNyBAQAogaW50IG9jZnMyX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwogaW50IG9jZnMyX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJICBzdHJ1Y3Qga3N0YXQgKnN0YXQpOwotaW50IG9jZnMyX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncyk7CitpbnQgb2NmczJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiAKIGludCBvY2ZzMl9zaG91bGRfdXBkYXRlX2F0aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICBzdHJ1Y3QgdmZzbW91bnQgKnZmc21udCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9tb3ZlX2V4dGVudHMuYyBiL2ZzL29jZnMyL21vdmVfZXh0ZW50cy5jCmluZGV4IGNkOTQyNzAuLmQ1M2NiNzAgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL21vdmVfZXh0ZW50cy5jCisrKyBiL2ZzL29jZnMyL21vdmVfZXh0ZW50cy5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSAiZGlyLmgiCiAjaW5jbHVkZSAiYnVmZmVyX2hlYWRfaW8uaCIKICNpbmNsdWRlICJzeXNmaWxlLmgiCi0jaW5jbHVkZSAic3ViYWxsb2MuaCIKICNpbmNsdWRlICJyZWZjb3VudHRyZWUuaCIKICNpbmNsdWRlICJtb3ZlX2V4dGVudHMuaCIKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbmFtZWkuYyBiL2ZzL29jZnMyL25hbWVpLmMKaW5kZXggZTVkNzM4Yy4uNTNhYTQxZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbmFtZWkuYworKysgYi9mcy9vY2ZzMi9uYW1laS5jCkBAIC0yNDk4LDQgKzI0OTgsNSBAQAogCS5saXN0eGF0dHIJPSBvY2ZzMl9saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIAkuZmllbWFwICAgICAgICAgPSBvY2ZzMl9maWVtYXAsCisJLmdldF9hY2wJPSBvY2ZzMl9pb3BfZ2V0X2FjbCwKIH07CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9yZWZjb3VudHRyZWUuYyBiL2ZzL29jZnMyL3JlZmNvdW50dHJlZS5jCmluZGV4IGViZmQzODIuLmNmNzgyMzMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3JlZmNvdW50dHJlZS5jCisrKyBiL2ZzL29jZnMyL3JlZmNvdW50dHJlZS5jCkBAIC00MzY4LDI1ICs0MzY4LDYgQEAKIAlyZXR1cm4gaW5vZGVfcGVybWlzc2lvbihkaXIsIE1BWV9XUklURSB8IE1BWV9FWEVDKTsKIH0KIAotLyogY29waWVkIGZyb20gdXNlcl9wYXRoX3BhcmVudC4gKi8KLXN0YXRpYyBpbnQgb2NmczJfdXNlcl9wYXRoX3BhcmVudChjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwKLQkJCQkgIHN0cnVjdCBuYW1laWRhdGEgKm5kLCBjaGFyICoqbmFtZSkKLXsKLQljaGFyICpzID0gZ2V0bmFtZShwYXRoKTsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAoSVNfRVJSKHMpKQotCQlyZXR1cm4gUFRSX0VSUihzKTsKLQotCWVycm9yID0ga2Vybl9wYXRoX3BhcmVudChzLCBuZCk7Ci0JaWYgKGVycm9yKQotCQlwdXRuYW1lKHMpOwotCWVsc2UKLQkJKm5hbWUgPSBzOwotCi0JcmV0dXJuIGVycm9yOwotfQotCiAvKioKICAqIG9jZnMyX3Zmc19yZWZsaW5rIC0gQ3JlYXRlIGEgcmVmZXJlbmNlLWNvdW50ZWQgbGluawogICoKQEAgLTQ0NjAsMTAgKzQ0NDEsOCBAQAogCQkJYm9vbCBwcmVzZXJ2ZSkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5OwotCXN0cnVjdCBuYW1laWRhdGEgbmQ7Ci0Jc3RydWN0IHBhdGggb2xkX3BhdGg7CisJc3RydWN0IHBhdGggb2xkX3BhdGgsIG5ld19wYXRoOwogCWludCBlcnJvcjsKLQljaGFyICp0byA9IE5VTEw7CiAKIAlpZiAoIW9jZnMyX3JlZmNvdW50X3RyZWUoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtNDQ3NCwzOSArNDQ1MywzMyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JZXJyb3IgPSBvY2ZzMl91c2VyX3BhdGhfcGFyZW50KG5ld25hbWUsICZuZCwgJnRvKTsKLQlpZiAoZXJyb3IpIHsKKwluZXdfZGVudHJ5ID0gdXNlcl9wYXRoX2NyZWF0ZShBVF9GRENXRCwgbmV3bmFtZSwgJm5ld19wYXRoLCAwKTsKKwllcnJvciA9IFBUUl9FUlIobmV3X2RlbnRyeSk7CisJaWYgKElTX0VSUihuZXdfZGVudHJ5KSkgewogCQltbG9nX2Vycm5vKGVycm9yKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJZXJyb3IgPSAtRVhERVY7Ci0JaWYgKG9sZF9wYXRoLm1udCAhPSBuZC5wYXRoLm1udCkKLQkJZ290byBvdXRfcmVsZWFzZTsKLQluZXdfZGVudHJ5ID0gbG9va3VwX2NyZWF0ZSgmbmQsIDApOwotCWVycm9yID0gUFRSX0VSUihuZXdfZGVudHJ5KTsKLQlpZiAoSVNfRVJSKG5ld19kZW50cnkpKSB7CisJaWYgKG9sZF9wYXRoLm1udCAhPSBuZXdfcGF0aC5tbnQpIHsKIAkJbWxvZ19lcnJubyhlcnJvcik7Ci0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfZHB1dDsKIAl9CiAKLQllcnJvciA9IG1udF93YW50X3dyaXRlKG5kLnBhdGgubW50KTsKKwllcnJvciA9IG1udF93YW50X3dyaXRlKG5ld19wYXRoLm1udCk7CiAJaWYgKGVycm9yKSB7CiAJCW1sb2dfZXJybm8oZXJyb3IpOwogCQlnb3RvIG91dF9kcHV0OwogCX0KIAogCWVycm9yID0gb2NmczJfdmZzX3JlZmxpbmsob2xkX3BhdGguZGVudHJ5LAotCQkJCSAgbmQucGF0aC5kZW50cnktPmRfaW5vZGUsCisJCQkJICBuZXdfcGF0aC5kZW50cnktPmRfaW5vZGUsCiAJCQkJICBuZXdfZGVudHJ5LCBwcmVzZXJ2ZSk7Ci0JbW50X2Ryb3Bfd3JpdGUobmQucGF0aC5tbnQpOworCW1udF9kcm9wX3dyaXRlKG5ld19wYXRoLm1udCk7CiBvdXRfZHB1dDoKIAlkcHV0KG5ld19kZW50cnkpOwotb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJm5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKLW91dF9yZWxlYXNlOgotCXBhdGhfcHV0KCZuZC5wYXRoKTsKLQlwdXRuYW1lKHRvKTsKKwltdXRleF91bmxvY2soJm5ld19wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJcGF0aF9wdXQoJm5ld19wYXRoKTsKIG91dDoKIAlwYXRoX3B1dCgmb2xkX3BhdGgpOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdXBlci5jIGIvZnMvb2NmczIvc3VwZXIuYwppbmRleCBjZGJhZjVlLi41NmY2MTAyIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5jCisrKyBiL2ZzL29jZnMyL3N1cGVyLmMKQEAgLTEwNzIsNyArMTA3Miw3IEBACiAKIAlzYi0+c19tYWdpYyA9IE9DRlMyX1NVUEVSX01BR0lDOwogCi0Jc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUE9TSVhBQ0wpIHwKKwlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH4oTVNfUE9TSVhBQ0wgfCBNU19OT1NFQykpIHwKIAkJKChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSA/IE1TX1BPU0lYQUNMIDogMCk7CiAKIAkvKiBIYXJkIHJlYWRvbmx5IG1vZGUgb25seSBpZjogYmRldl9yZWFkX29ubHksIE1TX1JET05MWSwKZGlmZiAtLWdpdCBhL2ZzL29tZnMvZmlsZS5jIGIvZnMvb21mcy9maWxlLmMKaW5kZXggZDczOGE3ZS4uMmM2ZDk1MiAxMDA2NDQKLS0tIGEvZnMvb21mcy9maWxlLmMKKysrIGIvZnMvb21mcy9maWxlLmMKQEAgLTQsNyArNCw2IEBACiAgKiBSZWxlYXNlZCB1bmRlciBHUEwgdjIuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmMKaW5kZXggYjUyY2YwMS4uNzM5Yjc1MSAxMDA2NDQKLS0tIGEvZnMvb3Blbi5jCisrKyBiL2ZzL29wZW4uYwpAQCAtNzkzLDcgKzc5Myw3IEBACiAJcmV0dXJuIG5kLT5pbnRlbnQub3Blbi5maWxlOwogb3V0X2VycjoKIAlyZWxlYXNlX29wZW5faW50ZW50KG5kKTsKLQluZC0+aW50ZW50Lm9wZW4uZmlsZSA9IChzdHJ1Y3QgZmlsZSAqKWRlbnRyeTsKKwluZC0+aW50ZW50Lm9wZW4uZmlsZSA9IEVSUl9DQVNUKGRlbnRyeSk7CiAJZ290byBvdXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsb29rdXBfaW5zdGFudGlhdGVfZmlscCk7CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKaW5kZXggZDU0NWU5Ny4uZTNjNjNkMSAxMDA2NDQKLS0tIGEvZnMvcGFydGl0aW9ucy9jaGVjay5jCisrKyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwpAQCAtMjM3LDIyICsyMzcsMjIgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1XG4iLCh1bnNpZ25lZCBsb25nIGxvbmcpcC0+bnJfc2VjdHMpOwogfQogCi1zc2l6ZV90IHBhcnRfcm9fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcGFydF9yb19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBoZF9zdHJ1Y3QgKnAgPSBkZXZfdG9fcGFydChkZXYpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwLT5wb2xpY3kgPyAxIDogMCk7CiB9CiAKLXNzaXplX3QgcGFydF9hbGlnbm1lbnRfb2Zmc2V0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwYXJ0X2FsaWdubWVudF9vZmZzZXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaGRfc3RydWN0ICpwID0gZGV2X3RvX3BhcnQoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXAtPmFsaWdubWVudF9vZmZzZXQpOwogfQogCi1zc2l6ZV90IHBhcnRfZGlzY2FyZF9hbGlnbm1lbnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBhcnRfZGlzY2FyZF9hbGlnbm1lbnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGhkX3N0cnVjdCAqcCA9IGRldl90b19wYXJ0KGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHAtPmRpc2NhcmRfYWxpZ25tZW50KTsKZGlmZiAtLWdpdCBhL2ZzL3BpcGUuYyBiL2ZzL3BpcGUuYwppbmRleCBkYTQyZjdkLi4xYjdmOWFmIDEwMDY0NAotLS0gYS9mcy9waXBlLmMKKysrIGIvZnMvcGlwZS5jCkBAIC0xMjkxLDggKzEyOTEsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9waXBlX2ZzKHZvaWQpCiB7CisJa2Vybl91bm1vdW50KHBpcGVfbW50KTsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnBpcGVfZnNfdHlwZSk7Ci0JbW50cHV0KHBpcGVfbW50KTsKIH0KIAogZnNfaW5pdGNhbGwoaW5pdF9waXBlX2ZzKTsKZGlmZiAtLWdpdCBhL2ZzL3Bvc2l4X2FjbC5jIGIvZnMvcG9zaXhfYWNsLmMKaW5kZXggYjFjZjZiZi4uYTYyMjdkMiAxMDA2NDQKLS0tIGEvZnMvcG9zaXhfYWNsLmMKKysrIGIvZnMvcG9zaXhfYWNsLmMKQEAgLTI0LDEzICsyNCw5IEBACiAKIEVYUE9SVF9TWU1CT0wocG9zaXhfYWNsX2luaXQpOwogRVhQT1JUX1NZTUJPTChwb3NpeF9hY2xfYWxsb2MpOwotRVhQT1JUX1NZTUJPTChwb3NpeF9hY2xfY2xvbmUpOwogRVhQT1JUX1NZTUJPTChwb3NpeF9hY2xfdmFsaWQpOwogRVhQT1JUX1NZTUJPTChwb3NpeF9hY2xfZXF1aXZfbW9kZSk7CiBFWFBPUlRfU1lNQk9MKHBvc2l4X2FjbF9mcm9tX21vZGUpOwotRVhQT1JUX1NZTUJPTChwb3NpeF9hY2xfY3JlYXRlX21hc3EpOwotRVhQT1JUX1NZTUJPTChwb3NpeF9hY2xfY2htb2RfbWFzcSk7Ci1FWFBPUlRfU1lNQk9MKHBvc2l4X2FjbF9wZXJtaXNzaW9uKTsKIAogLyoKICAqIEluaXQgYSBmcmVzaCBwb3NpeF9hY2wKQEAgLTU5LDcgKzU1LDcgQEAKIC8qCiAgKiBDbG9uZSBhbiBBQ0wuCiAgKi8KLXN0cnVjdCBwb3NpeF9hY2wgKgorc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKgogcG9zaXhfYWNsX2Nsb25lKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgZ2ZwX3QgZmxhZ3MpCiB7CiAJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmUgPSBOVUxMOwpAQCAtMjgzLDggKzI3OSw3IEBACiAgKiBzeXN0ZW0gY2FsbHMuIEFsbCBwZXJtaXNzaW9ucyB0aGF0IGFyZSBub3QgZ3JhbnRlZCBieSB0aGUgYWNsIGFyZSByZW1vdmVkLgogICogVGhlIHBlcm1pc3Npb25zIGluIHRoZSBhY2wgYXJlIGNoYW5nZWQgdG8gcmVmbGVjdCB0aGUgbW9kZV9wIHBhcmFtZXRlci4KICAqLwotaW50Ci1wb3NpeF9hY2xfY3JlYXRlX21hc3Eoc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBtb2RlX3QgKm1vZGVfcCkKK3N0YXRpYyBpbnQgcG9zaXhfYWNsX2NyZWF0ZV9tYXNxKHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgbW9kZV90ICptb2RlX3ApCiB7CiAJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZTsKIAlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpncm91cF9vYmogPSBOVUxMLCAqbWFza19vYmogPSBOVUxMOwpAQCAtMzQxLDggKzMzNiw3IEBACiAvKgogICogTW9kaWZ5IHRoZSBBQ0wgZm9yIHRoZSBjaG1vZCBzeXNjYWxsLgogICovCi1pbnQKLXBvc2l4X2FjbF9jaG1vZF9tYXNxKHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgbW9kZV90IG1vZGUpCitzdGF0aWMgaW50IHBvc2l4X2FjbF9jaG1vZF9tYXNxKHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgbW9kZV90IG1vZGUpCiB7CiAJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqZ3JvdXBfb2JqID0gTlVMTCwgKm1hc2tfb2JqID0gTlVMTDsKIAlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlOwpAQCAtMzg2LDMgKzM4MCwzOSBAQAogCiAJcmV0dXJuIDA7CiB9CisKK2ludAorcG9zaXhfYWNsX2NyZWF0ZShzdHJ1Y3QgcG9zaXhfYWNsICoqYWNsLCBnZnBfdCBnZnAsIG1vZGVfdCAqbW9kZV9wKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmNsb25lID0gcG9zaXhfYWNsX2Nsb25lKCphY2wsIGdmcCk7CisJaW50IGVyciA9IC1FTk9NRU07CisJaWYgKGNsb25lKSB7CisJCWVyciA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShjbG9uZSwgbW9kZV9wKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKKwkJCWNsb25lID0gTlVMTDsKKwkJfQorCX0KKwlwb3NpeF9hY2xfcmVsZWFzZSgqYWNsKTsKKwkqYWNsID0gY2xvbmU7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wocG9zaXhfYWNsX2NyZWF0ZSk7CisKK2ludAorcG9zaXhfYWNsX2NobW9kKHN0cnVjdCBwb3NpeF9hY2wgKiphY2wsIGdmcF90IGdmcCwgbW9kZV90IG1vZGUpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoKmFjbCwgZ2ZwKTsKKwlpbnQgZXJyID0gLUVOT01FTTsKKwlpZiAoY2xvbmUpIHsKKwkJZXJyID0gcG9zaXhfYWNsX2NobW9kX21hc3EoY2xvbmUsIG1vZGUpOworCQlpZiAoZXJyKSB7CisJCQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisJCQljbG9uZSA9IE5VTEw7CisJCX0KKwl9CisJcG9zaXhfYWNsX3JlbGVhc2UoKmFjbCk7CisJKmFjbCA9IGNsb25lOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHBvc2l4X2FjbF9jaG1vZCk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2FycmF5LmMgYi9mcy9wcm9jL2FycmF5LmMKaW5kZXggOWI0NWVlOC4uM2ExZGFmZCAxMDA2NDQKLS0tIGEvZnMvcHJvYy9hcnJheS5jCisrKyBiL2ZzL3Byb2MvYXJyYXkuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJCXRhc2tfdGdpZF9ucl9ucyhyY3VfZGVyZWZlcmVuY2UocC0+cmVhbF9wYXJlbnQpLCBucykgOiAwOwogCXRwaWQgPSAwOwogCWlmIChwaWRfYWxpdmUocCkpIHsKLQkJc3RydWN0IHRhc2tfc3RydWN0ICp0cmFjZXIgPSB0cmFjZWhvb2tfdHJhY2VyX3Rhc2socCk7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHJhY2VyID0gcHRyYWNlX3BhcmVudChwKTsKIAkJaWYgKHRyYWNlcikKIAkJCXRwaWQgPSB0YXNrX3BpZF9ucl9ucyh0cmFjZXIsIG5zKTsKIAl9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IDE0ZGVmOTkuLmM5ZTNmNjUgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYmFzZS5jCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC0yMTYsNyArMjE2LDcgQEAKIAlpZiAodGFza19pc19zdG9wcGVkX29yX3RyYWNlZCh0YXNrKSkgewogCQlpbnQgbWF0Y2g7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbWF0Y2ggPSAodHJhY2Vob29rX3RyYWNlcl90YXNrKHRhc2spID09IGN1cnJlbnQpOworCQltYXRjaCA9IChwdHJhY2VfcGFyZW50KHRhc2spID09IGN1cnJlbnQpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJaWYgKG1hdGNoICYmIHB0cmFjZV9tYXlfYWNjZXNzKHRhc2ssIFBUUkFDRV9NT0RFX0FUVEFDSCkpCiAJCQlyZXR1cm4gbW07CkBAIC02NzMsNyArNjczLDcgQEAKIAlwLT5tLnByaXZhdGUgPSBwOwogCXAtPm5zID0gbnM7CiAJcC0+cm9vdCA9IHJvb3Q7Ci0JcC0+ZXZlbnQgPSBucy0+ZXZlbnQ7CisJcC0+bS5wb2xsX2V2ZW50ID0gbnMtPmV2ZW50OwogCiAJcmV0dXJuIDA7CiAKQEAgLTExMTgsMTAgKzExMTgsOSBAQAogCSAqIFdhcm4gdGhhdCAvcHJvYy9waWQvb29tX2FkaiBpcyBkZXByZWNhdGVkLCBzZWUKIAkgKiBEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQuCiAJICovCi0JcHJpbnRrX29uY2UoS0VSTl9XQVJOSU5HICIlcyAoJWQpOiAvcHJvYy8lZC9vb21fYWRqIGlzIGRlcHJlY2F0ZWQsICIKLQkJCSJwbGVhc2UgdXNlIC9wcm9jLyVkL29vbV9zY29yZV9hZGogaW5zdGVhZC5cbiIsCi0JCQljdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSwKLQkJCXRhc2tfcGlkX25yKHRhc2spLCB0YXNrX3BpZF9ucih0YXNrKSk7CisJV0FSTl9PTkNFKDEsICIlcyAoJWQpOiAvcHJvYy8lZC9vb21fYWRqIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgL3Byb2MvJWQvb29tX3Njb3JlX2FkaiBpbnN0ZWFkLlxuIiwKKwkJICBjdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSwgdGFza19waWRfbnIodGFzayksCisJCSAgdGFza19waWRfbnIodGFzaykpOwogCXRhc2stPnNpZ25hbC0+b29tX2FkaiA9IG9vbV9hZGp1c3Q7CiAJLyoKIAkgKiBTY2FsZSAvcHJvYy9waWQvb29tX3Njb3JlX2FkaiBhcHByb3ByaWF0ZWx5IGVuc3VyaW5nIHRoYXQgYSBtYXhpbXVtCkBAIC0yMTY3LDEzICsyMTY2LDkgQEAKICAqIC9wcm9jL3BpZC9mZCBuZWVkcyBhIHNwZWNpYWwgcGVybWlzc2lvbiBoYW5kbGVyIHNvIHRoYXQgYSBwcm9jZXNzIGNhbiBzdGlsbAogICogYWNjZXNzIC9wcm9jL3NlbGYvZmQgYWZ0ZXIgaXQgaGFzIGV4ZWN1dGVkIGEgc2V0dWlkKCkuCiAgKi8KLXN0YXRpYyBpbnQgcHJvY19mZF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IHByb2NfZmRfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKLQlpbnQgcnY7Ci0KLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKLQkJcmV0dXJuIC1FQ0hJTEQ7Ci0JcnYgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIGZsYWdzLCBOVUxMKTsKKwlpbnQgcnYgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2spOwogCWlmIChydiA9PSAwKQogCQlyZXR1cm4gMDsKIAlpZiAodGFza19waWQoY3VycmVudCkgPT0gcHJvY19waWQoaW5vZGUpKQpAQCAtMjcxMiw2ICsyNzA3LDkgQEAKIAlzdHJ1Y3QgdGFza19pb19hY2NvdW50aW5nIGFjY3QgPSB0YXNrLT5pb2FjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlpZiAoIXB0cmFjZV9tYXlfYWNjZXNzKHRhc2ssIFBUUkFDRV9NT0RFX1JFQUQpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwogCWlmICh3aG9sZSAmJiBsb2NrX3Rhc2tfc2lnaGFuZCh0YXNrLCAmZmxhZ3MpKSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdCA9IHRhc2s7CiAKQEAgLTI4NDMsNyArMjg0MSw3IEBACiAJUkVHKCJjb3JlZHVtcF9maWx0ZXIiLCBTX0lSVUdPfFNfSVdVU1IsIHByb2NfY29yZWR1bXBfZmlsdGVyX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORwotCUlORigiaW8iLAlTX0lSVUdPLCBwcm9jX3RnaWRfaW9fYWNjb3VudGluZyksCisJSU5GKCJpbyIsCVNfSVJVU1IsIHByb2NfdGdpZF9pb19hY2NvdW50aW5nKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19IQVJEV0FMTAogCUlORigiaGFyZHdhbGwiLCAgIFNfSVJVR08sIHByb2NfcGlkX2hhcmR3YWxsKSwKQEAgLTMxODUsNyArMzE4Myw3IEBACiAJUkVHKCJtYWtlLWl0LWZhaWwiLCBTX0lSVUdPfFNfSVdVU1IsIHByb2NfZmF1bHRfaW5qZWN0X29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORwotCUlORigiaW8iLAlTX0lSVUdPLCBwcm9jX3RpZF9pb19hY2NvdW50aW5nKSwKKwlJTkYoImlvIiwJU19JUlVTUiwgcHJvY190aWRfaW9fYWNjb3VudGluZyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSEFSRFdBTEwKIAlJTkYoImhhcmR3YWxsIiwgICBTX0lSVUdPLCBwcm9jX3BpZF9oYXJkd2FsbCksCmRpZmYgLS1naXQgYS9mcy9wcm9jL25hbWVzcGFjZXMuYyBiL2ZzL3Byb2MvbmFtZXNwYWNlcy5jCmluZGV4IDc4MWRlYzUuLmJlMTc3ZjcgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvbmFtZXNwYWNlcy5jCisrKyBiL2ZzL3Byb2MvbmFtZXNwYWNlcy5jCkBAIC0zOCwxOCArMzgsMjEgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBwcm9jX2lub2RlICplaTsKIAlzdHJ1Y3QgZGVudHJ5ICplcnJvciA9IEVSUl9QVFIoLUVOT0VOVCk7CisJdm9pZCAqbnM7CiAKIAlpbm9kZSA9IHByb2NfcGlkX21ha2VfaW5vZGUoZGlyLT5pX3NiLCB0YXNrKTsKIAlpZiAoIWlub2RlKQogCQlnb3RvIG91dDsKIAorCW5zID0gbnNfb3BzLT5nZXQodGFzayk7CisJaWYgKCFucykKKwkJZ290byBvdXRfaXB1dDsKKwogCWVpID0gUFJPQ19JKGlub2RlKTsKIAlpbm9kZS0+aV9tb2RlID0gU19JRlJFR3xTX0lSVVNSOwogCWlub2RlLT5pX2ZvcCAgPSAmbnNfZmlsZV9vcGVyYXRpb25zOwogCWVpLT5uc19vcHMgICAgPSBuc19vcHM7Ci0JZWktPm5zCSAgICAgID0gbnNfb3BzLT5nZXQodGFzayk7Ci0JaWYgKCFlaS0+bnMpCi0JCWdvdG8gb3V0X2lwdXQ7CisJZWktPm5zCSAgICAgID0gbnM7CiAKIAlkZW50cnktPmRfb3AgPSAmcGlkX2RlbnRyeV9vcGVyYXRpb25zOwogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX3N5c2N0bC5jIGIvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCmluZGV4IGY1MDEzM2MuLjFhNzdkYmUgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19zeXNjdGwuYworKysgYi9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKQEAgLTI5NCw3ICsyOTQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY19zeXNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayx1bnNpZ25lZCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IHByb2Nfc3lzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCiB7CiAJLyoKIAkgKiBzeXNjdGwgZW50cmllcyB0aGF0IGFyZSBub3Qgd3JpdGVhYmxlLApAQCAtMzA0LDkgKzMwNCw2IEBACiAJc3RydWN0IGN0bF90YWJsZSAqdGFibGU7CiAJaW50IGVycm9yOwogCi0JaWYgKGZsYWdzICYgSVBFUk1fRkxBR19SQ1UpCi0JCXJldHVybiAtRUNISUxEOwotCiAJLyogRXhlY3V0YWJsZSBmaWxlcyBhcmUgbm90IGFsbG93ZWQgdW5kZXIgL3Byb2Mvc3lzLyAqLwogCWlmICgobWFzayAmIE1BWV9FWEVDKSAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gLUVBQ0NFUzsKQEAgLTMxOSw3ICszMTYsNyBAQAogCWlmICghdGFibGUpIC8qIGdsb2JhbCByb290IC0gci14ci14ci14ICovCiAJCWVycm9yID0gbWFzayAmIE1BWV9XUklURSA/IC1FQUNDRVMgOiAwOwogCWVsc2UgLyogVXNlIHRoZSBwZXJtaXNzaW9ucyBvbiB0aGUgc3lzY3RsIHRhYmxlIGVudHJ5ICovCi0JCWVycm9yID0gc3lzY3RsX3Blcm0oaGVhZC0+cm9vdCwgdGFibGUsIG1hc2spOworCQllcnJvciA9IHN5c2N0bF9wZXJtKGhlYWQtPnJvb3QsIHRhYmxlLCBtYXNrICYgfk1BWV9OT1RfQkxPQ0spOwogCiAJc3lzY3RsX2hlYWRfZmluaXNoKGhlYWQpOwogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvcm9vdC5jIGIvZnMvcHJvYy9yb290LmMKaW5kZXggYTkwMDBlOS4uZDZjM2I0MSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9yb290LmMKKysrIGIvZnMvcHJvYy9yb290LmMKQEAgLTI4LDExICsyOCwxMiBAQAogCiBzdGF0aWMgaW50IHByb2Nfc2V0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zOwotCi0JbnMgPSAoc3RydWN0IHBpZF9uYW1lc3BhY2UgKilkYXRhOwotCXNiLT5zX2ZzX2luZm8gPSBnZXRfcGlkX25zKG5zKTsKLQlyZXR1cm4gc2V0X2Fub25fc3VwZXIoc2IsIE5VTEwpOworCWludCBlcnIgPSBzZXRfYW5vbl9zdXBlcihzYiwgTlVMTCk7CisJaWYgKCFlcnIpIHsKKwkJc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zID0gKHN0cnVjdCBwaWRfbmFtZXNwYWNlICopZGF0YTsKKwkJc2ItPnNfZnNfaW5mbyA9IGdldF9waWRfbnMobnMpOworCX0KKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKZGlmZiAtLWdpdCBhL2ZzL3JlYWRfd3JpdGUuYyBiL2ZzL3JlYWRfd3JpdGUuYwppbmRleCA1NTIwZjhhLi41OTA3YjQ5IDEwMDY0NAotLS0gYS9mcy9yZWFkX3dyaXRlLmMKKysrIGIvZnMvcmVhZF93cml0ZS5jCkBAIC02NCw2ICs2NCwyMyBAQAogCQkJcmV0dXJuIGZpbGUtPmZfcG9zOwogCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CiAJCWJyZWFrOworCWNhc2UgU0VFS19EQVRBOgorCQkvKgorCQkgKiBJbiB0aGUgZ2VuZXJpYyBjYXNlIHRoZSBlbnRpcmUgZmlsZSBpcyBkYXRhLCBzbyBhcyBsb25nIGFzCisJCSAqIG9mZnNldCBpc24ndCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRoZW4gdGhlIG9mZnNldCBpcyBkYXRhLgorCQkgKi8KKwkJaWYgKG9mZnNldCA+PSBpbm9kZS0+aV9zaXplKQorCQkJcmV0dXJuIC1FTlhJTzsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0hPTEU6CisJCS8qCisJCSAqIFRoZXJlIGlzIGEgdmlydHVhbCBob2xlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHNvIGFzIGxvbmcgYXMKKwkJICogb2Zmc2V0IGlzbid0IGlfc2l6ZSBvciBsYXJnZXIsIHJldHVybiBpX3NpemUuCisJCSAqLworCQlpZiAob2Zmc2V0ID49IGlub2RlLT5pX3NpemUpCisJCQlyZXR1cm4gLUVOWElPOworCQlvZmZzZXQgPSBpbm9kZS0+aV9zaXplOworCQlicmVhazsKIAl9CiAKIAlpZiAob2Zmc2V0IDwgMCAmJiAhdW5zaWduZWRfb2Zmc2V0cyhmaWxlKSkKQEAgLTEyOCwxMiArMTQ1LDEzIEBACiAKIGxvZmZfdCBkZWZhdWx0X2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKIHsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlsb2ZmX3QgcmV0dmFsOwogCi0JbXV0ZXhfbG9jaygmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlzd2l0Y2ggKG9yaWdpbikgewogCQljYXNlIFNFRUtfRU5EOgotCQkJb2Zmc2V0ICs9IGlfc2l6ZV9yZWFkKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCQkJb2Zmc2V0ICs9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAkJCWJyZWFrOwogCQljYXNlIFNFRUtfQ1VSOgogCQkJaWYgKG9mZnNldCA9PSAwKSB7CkBAIC0xNDEsNiArMTU5LDI2IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CisJCQlicmVhazsKKwkJY2FzZSBTRUVLX0RBVEE6CisJCQkvKgorCQkJICogSW4gdGhlIGdlbmVyaWMgY2FzZSB0aGUgZW50aXJlIGZpbGUgaXMgZGF0YSwgc28gYXMKKwkJCSAqIGxvbmcgYXMgb2Zmc2V0IGlzbid0IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgdGhlbiB0aGUKKwkJCSAqIG9mZnNldCBpcyBkYXRhLgorCQkJICovCisJCQlpZiAob2Zmc2V0ID49IGlub2RlLT5pX3NpemUpCisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCWJyZWFrOworCQljYXNlIFNFRUtfSE9MRToKKwkJCS8qCisJCQkgKiBUaGVyZSBpcyBhIHZpcnR1YWwgaG9sZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBzbworCQkJICogYXMgbG9uZyBhcyBvZmZzZXQgaXNuJ3QgaV9zaXplIG9yIGxhcmdlciwgcmV0dXJuCisJCQkgKiBpX3NpemUuCisJCQkgKi8KKwkJCWlmIChvZmZzZXQgPj0gaW5vZGUtPmlfc2l6ZSkKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJb2Zmc2V0ID0gaW5vZGUtPmlfc2l6ZTsKKwkJCWJyZWFrOwogCX0KIAlyZXR2YWwgPSAtRUlOVkFMOwogCWlmIChvZmZzZXQgPj0gMCB8fCB1bnNpZ25lZF9vZmZzZXRzKGZpbGUpKSB7CkBAIC0xNTEsNyArMTg5LDcgQEAKIAkJcmV0dmFsID0gb2Zmc2V0OwogCX0KIG91dDoKLQltdXRleF91bmxvY2soJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogRVhQT1JUX1NZTUJPTChkZWZhdWx0X2xsc2Vlayk7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9iaXRtYXAuYyBiL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCmluZGV4IDQ4MzQ0MmUuLmQxYWNhMWQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCisrKyBiL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCkBAIC0yMTQsNyArMjE0LDcgQEAKIAkJCQkJfQogCQkJCQkvKiBvdGhlcndpc2Ugd2UgY2xlYXIgYWxsIGJpdCB3ZXJlIHNldCAuLi4gKi8KIAkJCQkJd2hpbGUgKC0taSA+PSAqYmVnKQotCQkJCQkJcmVpc2VyZnNfdGVzdF9hbmRfY2xlYXJfbGVfYml0CisJCQkJCQlyZWlzZXJmc19jbGVhcl9sZV9iaXQKIAkJCQkJCSAgICAoaSwgYmgtPmJfZGF0YSk7CiAJCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHMsIGJoKTsKIAkJCQkJKmJlZyA9IG9yZzsKQEAgLTEyMjIsMTUgKzEyMjIsMTEgQEAKIAlpbmZvLT5mcmVlX2NvdW50ID0gMDsKIAogCXdoaWxlICgtLWN1ciA+PSAodW5zaWduZWQgbG9uZyAqKWJoLT5iX2RhdGEpIHsKLQkJaW50IGk7Ci0KIAkJLyogMCBhbmQgfjAgYXJlIHNwZWNpYWwsIHdlIGNhbiBvcHRpbWl6ZSBmb3IgdGhlbSAqLwogCQlpZiAoKmN1ciA9PSAwKQogCQkJaW5mby0+ZnJlZV9jb3VudCArPSBCSVRTX1BFUl9MT05HOwogCQllbHNlIGlmICgqY3VyICE9IH4wTCkJLyogQSBtaXgsIGludmVzdGlnYXRlICovCi0JCQlmb3IgKGkgPSBCSVRTX1BFUl9MT05HIC0gMTsgaSA+PSAwOyBpLS0pCi0JCQkJaWYgKCFyZWlzZXJmc190ZXN0X2xlX2JpdChpLCBjdXIpKQotCQkJCQlpbmZvLT5mcmVlX2NvdW50Kys7CisJCQlpbmZvLT5mcmVlX2NvdW50ICs9IEJJVFNfUEVSX0xPTkcgLSBod2VpZ2h0X2xvbmcoKmN1cik7CiAJfQogfQogCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9kaXIuYyBiL2ZzL3JlaXNlcmZzL2Rpci5jCmluZGV4IDE5OGRhYmYuLjEzM2U5MzUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2Rpci5jCisrKyBiL2ZzL3JlaXNlcmZzL2Rpci5jCkBAIC0xNCw3ICsxNCw4IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSBNSU5fS0VZOwogCiBzdGF0aWMgaW50IHJlaXNlcmZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOwotc3RhdGljIGludCByZWlzZXJmc19kaXJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGludCBkYXRhc3luYyk7CitzdGF0aWMgaW50IHJlaXNlcmZzX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkJICAgICAgaW50IGRhdGFzeW5jKTsKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWlzZXJmc19kaXJfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKQEAgLTI3LDEzICsyOCwyMSBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgaW50IHJlaXNlcmZzX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGRhdGFzeW5jKQorc3RhdGljIGludCByZWlzZXJmc19kaXJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwKKwkJCSAgICAgIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OwogCWludCBlcnI7CisKKwllcnIgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CiAJZXJyID0gcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShpbm9kZSk7CiAJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2ZpbGUuYyBiL2ZzL3JlaXNlcmZzL2ZpbGUuYwppbmRleCA5MWYwODBjLi5hY2U2MzUwIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9maWxlLmMKKysrIGIvZnMvcmVpc2VyZnMvZmlsZS5jCkBAIC0xNDAsMTIgKzE0MCwxOCBAQAogICogYmUgcmVtb3ZlZC4uLgogICovCiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfc3luY19maWxlKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgZGF0YXN5bmMpCitzdGF0aWMgaW50IHJlaXNlcmZzX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkJICAgICAgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX21hcHBpbmctPmhvc3Q7CiAJaW50IGVycjsKIAlpbnQgYmFycmllcl9kb25lOwogCisJZXJyID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCUJVR19PTighU19JU1JFRyhpbm9kZS0+aV9tb2RlKSk7CiAJZXJyID0gc3luY19tYXBwaW5nX2J1ZmZlcnMoaW5vZGUtPmlfbWFwcGluZyk7CiAJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CkBAIC0xNTMsNiArMTU5LDcgQEAKIAlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCWlmIChiYXJyaWVyX2RvbmUgIT0gMSAmJiByZWlzZXJmc19iYXJyaWVyX2ZsdXNoKGlub2RlLT5pX3NiKSkKIAkJYmxrZGV2X2lzc3VlX2ZsdXNoKGlub2RlLT5pX3NiLT5zX2JkZXYsIEdGUF9LRVJORUwsIE5VTEwpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChiYXJyaWVyX2RvbmUgPCAwKQogCQlyZXR1cm4gYmFycmllcl9kb25lOwogCXJldHVybiAoZXJyIDwgMCkgPyAtRUlPIDogMDsKQEAgLTMxMiw0ICszMTksNSBAQAogCS5saXN0eGF0dHIgPSByZWlzZXJmc19saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCiAJLnBlcm1pc3Npb24gPSByZWlzZXJmc19wZXJtaXNzaW9uLAorCS5nZXRfYWNsID0gcmVpc2VyZnNfZ2V0X2FjbCwKIH07CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwppbmRleCA0ZmQ1YmIzLi45YjBkNGI3IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKQEAgLTE0NzUsNiArMTQ3NSwxMSBAQAogCiAJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19zZCk7CS8qIGluaXQgaW5vZGUgc2hvdWxkIGJlIHJlbHNpbmcgKi8KIAorCS8qCisJICogU3RhdCBkYXRhIHYxIGRvZXNuJ3Qgc3VwcG9ydCBBQ0xzLgorCSAqLworCWlmIChnZXRfaW5vZGVfc2RfdmVyc2lvbihpbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQorCQljYWNoZV9ub19hY2woaW5vZGUpOwogfQogCiAvKioKQEAgLTMwNjgsOSArMzA3Myw4IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlzc2l6ZV90IHJldDsKIAotCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKLQkJCQkgIG9mZnNldCwgbnJfc2VncywKLQkJCQkgIHJlaXNlcmZzX2dldF9ibG9ja3NfZGlyZWN0X2lvLCBOVUxMKTsKKwlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpb3YsIG9mZnNldCwgbnJfc2VncywKKwkJCQkgIHJlaXNlcmZzX2dldF9ibG9ja3NfZGlyZWN0X2lvKTsKIAogCS8qCiAJICogSW4gY2FzZSBvZiBlcnJvciBleHRlbmRpbmcgd3JpdGUgbWF5IGhhdmUgaW5zdGFudGlhdGVkIGEgZmV3CkBAIC0zMTE0LDYgKzMxMTgsOSBAQAogCQkJZXJyb3IgPSAtRUZCSUc7CiAJCQlnb3RvIG91dDsKIAkJfQorCisJCWlub2RlX2Rpb193YWl0KGlub2RlKTsKKwogCQkvKiBmaWxsIGluIGhvbGUgcG9pbnRlcnMgaW4gdGhlIGV4cGFuZGluZyB0cnVuY2F0ZSBjYXNlLiAqLwogCQlpZiAoYXR0ci0+aWFfc2l6ZSA+IGlub2RlLT5pX3NpemUpIHsKIAkJCWVycm9yID0gZ2VuZXJpY19jb250X2V4cGFuZF9zaW1wbGUoaW5vZGUsIGF0dHItPmlhX3NpemUpOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvam91cm5hbC5jIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCmluZGV4IGM1ZTgyZWMuLmExNTliYTUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYworKysgYi9mcy9yZWlzZXJmcy9qb3VybmFsLmMKQEAgLTY3OCwyMyArNjc4LDE5IEBACiBzdGF0aWMgdm9pZCB3cml0ZV9jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaykKIHsKIAlpbnQgaTsKLQlnZXRfZnNfZXhjbCgpOwogCWZvciAoaSA9IDA7IGkgPCBjaHVuay0+bnI7IGkrKykgewogCQlzdWJtaXRfbG9nZ2VkX2J1ZmZlcihjaHVuay0+YmhbaV0pOwogCX0KIAljaHVuay0+bnIgPSAwOwotCXB1dF9mc19leGNsKCk7CiB9CiAKIHN0YXRpYyB2b2lkIHdyaXRlX29yZGVyZWRfY2h1bmsoc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmspCiB7CiAJaW50IGk7Ci0JZ2V0X2ZzX2V4Y2woKTsKIAlmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5yOyBpKyspIHsKIAkJc3VibWl0X29yZGVyZWRfYnVmZmVyKGNodW5rLT5iaFtpXSk7CiAJfQogCWNodW5rLT5uciA9IDA7Ci0JcHV0X2ZzX2V4Y2woKTsKIH0KIAogc3RhdGljIGludCBhZGRfdG9fY2h1bmsoc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmssIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCkBAIC05ODYsOCArOTgyLDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JZ2V0X2ZzX2V4Y2woKTsKLQogCS8qIGJlZm9yZSB3ZSBjYW4gcHV0IG91ciBjb21taXQgYmxvY2tzIG9uIGRpc2ssIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIG9sZGVyIHRoYW4KIAkgKiogdXMgaXMgb24gZGlzayB0b28KIAkgKi8KQEAgLTExNDUsNyArMTEzOSw2IEBACiAJaWYgKHJldHZhbCkKIAkJcmVpc2VyZnNfYWJvcnQocywgcmV0dmFsLCAiSm91cm5hbCB3cml0ZSBlcnJvciBpbiAlcyIsCiAJCQkgICAgICAgX19mdW5jX18pOwotCXB1dF9mc19leGNsKCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTM3NCw4ICsxMzY3LDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JZ2V0X2ZzX2V4Y2woKTsKLQogCS8qIGlmIGFsbCB0aGUgd29yayBpcyBhbHJlYWR5IGRvbmUsIGdldCBvdXQgb2YgaGVyZSAqLwogCWlmIChhdG9taWNfcmVhZCgmKGpsLT5qX25vbnplcm9sZW4pKSA8PSAwICYmCiAJICAgIGF0b21pY19yZWFkKCYoamwtPmpfY29tbWl0X2xlZnQpKSA8PSAwKSB7CkBAIC0xNTk3LDcgKzE1ODgsNiBAQAogCXB1dF9qb3VybmFsX2xpc3QocywgamwpOwogCWlmIChmbHVzaGFsbCkKIAkJbXV0ZXhfdW5sb2NrKCZqb3VybmFsLT5qX2ZsdXNoX211dGV4KTsKLQlwdXRfZnNfZXhjbCgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTMxMDgsNyArMzA5OCw2IEBACiAJdGgtPnRfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkOwogCXVubG9ja19qb3VybmFsKHNiKTsKIAlJTklUX0xJU1RfSEVBRCgmdGgtPnRfbGlzdCk7Ci0JZ2V0X2ZzX2V4Y2woKTsKIAlyZXR1cm4gMDsKIAogICAgICAgb3V0X2ZhaWw6CkBAIC0zOTY0LDcgKzM5NTMsNiBAQAogCWZsdXNoID0gZmxhZ3MgJiBGTFVTSF9BTEw7CiAJd2FpdF9vbl9jb21taXQgPSBmbGFncyAmIFdBSVQ7CiAKLQlwdXRfZnNfZXhjbCgpOwogCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOwogCXJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgoc2IsICJqb3VybmFsIGVuZCIpOwogCWlmIChqb3VybmFsLT5qX2xlbiA9PSAwKSB7CkBAIC00MzE2LDQgKzQzMDQsMyBAQAogCWR1bXBfc3RhY2soKTsKICNlbmRpZgogfQotCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9uYW1laS5jIGIvZnMvcmVpc2VyZnMvbmFtZWkuYwppbmRleCAxMTg2NjI2Li5lZjM5MjMyIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9uYW1laS5jCisrKyBiL2ZzL3JlaXNlcmZzL25hbWVpLmMKQEAgLTE1MjksNiArMTUyOSw3IEBACiAJLmxpc3R4YXR0ciA9IHJlaXNlcmZzX2xpc3R4YXR0ciwKIAkucmVtb3ZleGF0dHIgPSByZWlzZXJmc19yZW1vdmV4YXR0ciwKIAkucGVybWlzc2lvbiA9IHJlaXNlcmZzX3Blcm1pc3Npb24sCisJLmdldF9hY2wgPSByZWlzZXJmc19nZXRfYWNsLAogfTsKIAogLyoKQEAgLTE1NDUsNiArMTU0Niw3IEBACiAJLmxpc3R4YXR0ciA9IHJlaXNlcmZzX2xpc3R4YXR0ciwKIAkucmVtb3ZleGF0dHIgPSByZWlzZXJmc19yZW1vdmV4YXR0ciwKIAkucGVybWlzc2lvbiA9IHJlaXNlcmZzX3Blcm1pc3Npb24sCisJLmdldF9hY2wgPSByZWlzZXJmc19nZXRfYWNsLAogCiB9OwogCkBAIC0xNTU4LDUgKzE1NjAsNSBAQAogCS5saXN0eGF0dHIgPSByZWlzZXJmc19saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCiAJLnBlcm1pc3Npb24gPSByZWlzZXJmc19wZXJtaXNzaW9uLAotCisJLmdldF9hY2wgPSByZWlzZXJmc19nZXRfYWNsLAogfTsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3Jlc2l6ZS5jIGIvZnMvcmVpc2VyZnMvcmVzaXplLmMKaW5kZXggYjNhOTRkMi4uYjZiOWIxZiAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvcmVzaXplLmMKKysrIGIvZnMvcmVpc2VyZnMvcmVzaXplLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIHNiX2Jsb2Nrc2l6ZShzYikpOwotCQkJcmVpc2VyZnNfdGVzdF9hbmRfc2V0X2xlX2JpdCgwLCBiaC0+Yl9kYXRhKTsKKwkJCXJlaXNlcmZzX3NldF9sZV9iaXQoMCwgYmgtPmJfZGF0YSk7CiAJCQlyZWlzZXJmc19jYWNoZV9iaXRtYXBfbWV0YWRhdGEocywgYmgsIGJpdG1hcCArIGkpOwogCiAJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogCiAJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBiaCwgMSk7CiAJZm9yIChpID0gYmxvY2tfcjsgaSA8IHMtPnNfYmxvY2tzaXplICogODsgaSsrKQotCQlyZWlzZXJmc190ZXN0X2FuZF9jbGVhcl9sZV9iaXQoaSwgYmgtPmJfZGF0YSk7CisJCXJlaXNlcmZzX2NsZWFyX2xlX2JpdChpLCBiaC0+Yl9kYXRhKTsKIAlpbmZvLT5mcmVlX2NvdW50ICs9IHMtPnNfYmxvY2tzaXplICogOCAtIGJsb2NrX3I7CiAKIAlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBiaCk7CkBAIC0xOTAsNyArMTkwLDcgQEAKIAogCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYmgsIDEpOwogCWZvciAoaSA9IGJsb2NrX3JfbmV3OyBpIDwgcy0+c19ibG9ja3NpemUgKiA4OyBpKyspCi0JCXJlaXNlcmZzX3Rlc3RfYW5kX3NldF9sZV9iaXQoaSwgYmgtPmJfZGF0YSk7CisJCXJlaXNlcmZzX3NldF9sZV9iaXQoaSwgYmgtPmJfZGF0YSk7CiAJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgYmgpOwogCWJyZWxzZShiaCk7CiAKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMgYi9mcy9yZWlzZXJmcy9zdXBlci5jCmluZGV4IGFhOTEwODkuLjE0MzYzYjkgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMKKysrIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwpAQCAtMTY0Myw2ICsxNjQzLDcgQEAKIAkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbnM6IG5vbi1hZ2dyZXNzaXZlIHRhaWxzLCBSTyBvbiBlcnJvcnMgKi8KIAlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfU01BTExUQUlMKTsKIAlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfRVJST1JfUk8pOworCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBSRUlTRVJGU19CQVJSSUVSX0ZMVVNIKTsKIAkvKiBubyBwcmVhbGxvY2F0aW9uIG1pbmltdW0sIGJlIHNtYXJ0IGluCiAJICAgcmVpc2VyZnNfZmlsZV93cml0ZSBpbnN0ZWFkICovCiAJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY21pbiA9IDA7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0ci5jIGIvZnMvcmVpc2VyZnMveGF0dHIuYwppbmRleCBlOGE2MmY0Li42YmMzNDZjIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy94YXR0ci5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyLmMKQEAgLTU1NSwxMSArNTU1LDEwIEBACiAKIAkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKIAkJbXV0ZXhfbG9ja19uZXN0ZWQoJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCwgSV9NVVRFWF9YQVRUUik7Ci0JCWRvd25fd3JpdGUoJmRlbnRyeS0+ZF9pbm9kZS0+aV9hbGxvY19zZW0pOworCQlpbm9kZV9kaW9fd2FpdChkZW50cnktPmRfaW5vZGUpOwogCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKIAogCQllcnIgPSByZWlzZXJmc19zZXRhdHRyKGRlbnRyeSwgJm5ld2F0dHJzKTsKLQkJdXBfd3JpdGUoJmRlbnRyeS0+ZF9pbm9kZS0+aV9hbGxvY19zZW0pOwogCQltdXRleF91bmxvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJfSBlbHNlCiAJCXVwZGF0ZV9jdGltZShpbm9kZSk7CkBAIC04NjgsMjcgKzg2Nyw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZWlzZXJmc19jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7Ci0JaW50IGVycm9yID0gLUVBR0FJTjsgLyogZG8gcmVndWxhciB1bml4IHBlcm1pc3Npb24gY2hlY2tzIGJ5IGRlZmF1bHQgKi8KLQotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQotCQlyZXR1cm4gLUVDSElMRDsKLQotCWFjbCA9IHJlaXNlcmZzX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0KLQlpZiAoYWNsKSB7Ci0JCWlmICghSVNfRVJSKGFjbCkpIHsKLQkJCWVycm9yID0gcG9zaXhfYWNsX3Blcm1pc3Npb24oaW5vZGUsIGFjbCwgbWFzayk7Ci0JCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCQl9IGVsc2UgaWYgKFBUUl9FUlIoYWNsKSAhPSAtRU5PREFUQSkKLQkJCWVycm9yID0gUFRSX0VSUihhY2wpOwotCX0KLQotCXJldHVybiBlcnJvcjsKLX0KLQogc3RhdGljIGludCBjcmVhdGVfcHJpdnJvb3Qoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCWludCBlcnI7CkBAIC05NTIsMTAgKzkzMCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCByZWlzZXJmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitpbnQgcmVpc2VyZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKLQkJcmV0dXJuIC1FQ0hJTEQ7CiAJLyoKIAkgKiBXZSBkb24ndCBkbyBwZXJtaXNzaW9uIGNoZWNrcyBvbiB0aGUgaW50ZXJuYWwgb2JqZWN0cy4KIAkgKiBQZXJtaXNzaW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgIm93bmluZyIgb2JqZWN0LgpAQCAtOTYzLDE1ICs5MzksNyBAQAogCWlmIChJU19QUklWQVRFKGlub2RlKSkKIAkJcmV0dXJuIDA7CiAKLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFIKLQkvKgotCSAqIFN0YXQgZGF0YSB2MSBkb2Vzbid0IHN1cHBvcnQgQUNMcy4KLQkgKi8KLQlpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUpICE9IFNUQVRfREFUQV9WMSkKLQkJcmV0dXJuIGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgZmxhZ3MsCi0JCQkJCXJlaXNlcmZzX2NoZWNrX2FjbCk7Ci0jZW5kaWYKLQlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBmbGFncywgTlVMTCk7CisJcmV0dXJuIGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzayk7CiB9CiAKIHN0YXRpYyBpbnQgeGF0dHJfaGlkZV9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0cl9hY2wuYyBiL2ZzL3JlaXNlcmZzL3hhdHRyX2FjbC5jCmluZGV4IDNkYzM4ZjEuLjczNjJjZjQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3hhdHRyX2FjbC5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX2FjbC5jCkBAIC0zNTQsOSArMzU0LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKIAogCWlmIChhY2wpIHsKLQkJc3RydWN0IHBvc2l4X2FjbCAqYWNsX2NvcHk7CiAJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLQkJaW50IG5lZWRfYWNsOwogCiAJCS8qIENvcHkgdGhlIGRlZmF1bHQgQUNMIHRvIHRoZSBkZWZhdWx0IEFDTCBvZiBhIG5ldyBkaXJlY3RvcnkgKi8KIAkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKQEAgLTM2OCwyOSArMzY2LDE1IEBACiAKIAkJLyogTm93IHdlIHJlY29uY2lsZSB0aGUgbmV3IEFDTCBhbmQgdGhlIG1vZGUsCiAJCSAgIHBvdGVudGlhbGx5IG1vZGlmeWluZyBib3RoICovCi0JCWFjbF9jb3B5ID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX05PRlMpOwotCQlpZiAoIWFjbF9jb3B5KSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBjbGVhbnVwOwotCQl9CisJCWVyciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZtb2RlKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOwogCi0JCW5lZWRfYWNsID0gcG9zaXhfYWNsX2NyZWF0ZV9tYXNxKGFjbF9jb3B5LCAmbW9kZSk7Ci0JCWlmIChuZWVkX2FjbCA+PSAwKSB7Ci0JCQlpZiAobW9kZSAhPSBpbm9kZS0+aV9tb2RlKSB7Ci0JCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7Ci0JCQl9CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCi0JCQkvKiBJZiB3ZSBuZWVkIGFuIEFDTC4uICovCi0JCQlpZiAobmVlZF9hY2wgPiAwKSB7Ci0JCQkJZXJyID0gcmVpc2VyZnNfc2V0X2FjbCh0aCwgaW5vZGUsCi0JCQkJCQkgICAgICAgQUNMX1RZUEVfQUNDRVNTLAotCQkJCQkJICAgICAgIGFjbF9jb3B5KTsKLQkJCQlpZiAoZXJyKQotCQkJCQlnb3RvIGNsZWFudXBfY29weTsKLQkJCX0KLQkJfQotCSAgICAgIGNsZWFudXBfY29weToKLQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsX2NvcHkpOworCQkvKiBJZiB3ZSBuZWVkIGFuIEFDTC4uICovCisJCWlmIChlcnIgPiAwKQorCQkJZXJyID0gcmVpc2VyZnNfc2V0X2FjbCh0aCwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKIAkgICAgICBjbGVhbnVwOgogCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwogCX0gZWxzZSB7CkBAIC00NDUsNyArNDI5LDEwIEBACiAKIGludCByZWlzZXJmc19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpjbG9uZTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgZGVwdGg7CiAJaW50IGVycm9yOwogCiAJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCkBAIC00NjMsMzAgKzQ1MCwyMiBAQAogCQlyZXR1cm4gMDsKIAlpZiAoSVNfRVJSKGFjbCkpCiAJCXJldHVybiBQVFJfRVJSKGFjbCk7Ci0JY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfTk9GUyk7Ci0JcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKLQlpZiAoIWNsb25lKQotCQlyZXR1cm4gLUVOT01FTTsKLQllcnJvciA9IHBvc2l4X2FjbF9jaG1vZF9tYXNxKGNsb25lLCBpbm9kZS0+aV9tb2RlKTsKLQlpZiAoIWVycm9yKSB7Ci0JCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0JCXNpemVfdCBzaXplID0gcmVpc2VyZnNfeGF0dHJfbmJsb2Nrcyhpbm9kZSwKLQkJCQkJICAgICByZWlzZXJmc19hY2xfc2l6ZShjbG9uZS0+YV9jb3VudCkpOwotCQlpbnQgZGVwdGg7CisJZXJyb3IgPSBwb3NpeF9hY2xfY2htb2QoJmFjbCwgR0ZQX05PRlMsIGlub2RlLT5pX21vZGUpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCi0JCWRlcHRoID0gcmVpc2VyZnNfd3JpdGVfbG9ja19vbmNlKGlub2RlLT5pX3NiKTsKLQkJZXJyb3IgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIHNpemUgKiAyKTsKLQkJaWYgKCFlcnJvcikgewotCQkJaW50IGVycm9yMjsKLQkJCWVycm9yID0gcmVpc2VyZnNfc2V0X2FjbCgmdGgsIGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsCi0JCQkJCQkgY2xvbmUpOwotCQkJZXJyb3IyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgc2l6ZSAqIDIpOwotCQkJaWYgKGVycm9yMikKLQkJCQllcnJvciA9IGVycm9yMjsKLQkJfQotCQlyZWlzZXJmc193cml0ZV91bmxvY2tfb25jZShpbm9kZS0+aV9zYiwgZGVwdGgpOworCXNpemUgPSByZWlzZXJmc194YXR0cl9uYmxvY2tzKGlub2RlLCByZWlzZXJmc19hY2xfc2l6ZShhY2wtPmFfY291bnQpKTsKKwlkZXB0aCA9IHJlaXNlcmZzX3dyaXRlX2xvY2tfb25jZShpbm9kZS0+aV9zYik7CisJZXJyb3IgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIHNpemUgKiAyKTsKKwlpZiAoIWVycm9yKSB7CisJCWludCBlcnJvcjI7CisJCWVycm9yID0gcmVpc2VyZnNfc2V0X2FjbCgmdGgsIGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGFjbCk7CisJCWVycm9yMiA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIHNpemUgKiAyKTsKKwkJaWYgKGVycm9yMikKKwkJCWVycm9yID0gZXJyb3IyOwogCX0KLQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX29uY2UoaW5vZGUtPmlfc2IsIGRlcHRoKTsKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwogCXJldHVybiBlcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvcm9tZnMvbW1hcC1ub21tdS5jIGIvZnMvcm9tZnMvbW1hcC1ub21tdS5jCmluZGV4IGYwNTExZTguLmVlZDk5NDIgMTAwNjQ0Ci0tLSBhL2ZzL3JvbWZzL21tYXAtbm9tbXUuYworKysgYi9mcy9yb21mcy9tbWFwLW5vbW11LmMKQEAgLTI3LDE0ICsyNywxOCBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CiAJc3RydWN0IG10ZF9pbmZvICptdGQgPSBpbm9kZS0+aV9zYi0+c19tdGQ7Ci0JdW5zaWduZWQgbG9uZyBpc2l6ZSwgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgaXNpemUsIG9mZnNldCwgbWF4cGFnZXMsIGxwYWdlczsKIAogCWlmICghbXRkKQogCQlnb3RvIGNhbnRfbWFwX2RpcmVjdGx5OwogCisJLyogdGhlIG1hcHBpbmcgbXVzdG4ndCBleHRlbmQgYmV5b25kIHRoZSBFT0YgKi8KKwlscGFnZXMgPSAobGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKIAlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAlvZmZzZXQgPSBwZ29mZiA8PCBQQUdFX1NISUZUOwotCWlmIChvZmZzZXQgPiBpc2l6ZSB8fCBsZW4gPiBpc2l6ZSB8fCBvZmZzZXQgPiBpc2l6ZSAtIGxlbikKKworCW1heHBhZ2VzID0gKGlzaXplICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwlpZiAoKHBnb2ZmID49IG1heHBhZ2VzKSB8fCAobWF4cGFnZXMgLSBwZ29mZiA8IGxwYWdlcykpCiAJCXJldHVybiAodW5zaWduZWQgbG9uZykgLUVJTlZBTDsKIAogCS8qIHdlIG5lZWQgdG8gY2FsbCBkb3duIHRvIHRoZSBNVEQgbGF5ZXIgdG8gZG8gdGhlIGFjdHVhbCBtYXBwaW5nICovCmRpZmYgLS1naXQgYS9mcy9zcGxpY2UuYyBiL2ZzL3NwbGljZS5jCmluZGV4IGFhODY2ZDMuLmZhMmRlZmEgMTAwNjQ0Ci0tLSBhL2ZzL3NwbGljZS5jCisrKyBiL2ZzL3NwbGljZS5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgcGFnZV9jYWNoZV9waXBlX2J1Zl9vcHMgPSB7Citjb25zdCBzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyBwYWdlX2NhY2hlX3BpcGVfYnVmX29wcyA9IHsKIAkuY2FuX21lcmdlID0gMCwKIAkubWFwID0gZ2VuZXJpY19waXBlX2J1Zl9tYXAsCiAJLnVubWFwID0gZ2VuZXJpY19waXBlX2J1Zl91bm1hcCwKQEAgLTI2NCw3ICsyNjQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHNwZF9yZWxlYXNlX3BhZ2Uoc3RydWN0IHNwbGljZV9waXBlX2Rlc2MgKnNwZCwgdW5zaWduZWQgaW50IGkpCit2b2lkIHNwZF9yZWxlYXNlX3BhZ2Uoc3RydWN0IHNwbGljZV9waXBlX2Rlc2MgKnNwZCwgdW5zaWduZWQgaW50IGkpCiB7CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHNwZC0+cGFnZXNbaV0pOwogfQpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvS2NvbmZpZyBiL2ZzL3NxdWFzaGZzL0tjb25maWcKaW5kZXggNzc5NzIxOC4uMTM2MGQ0ZiAxMDA2NDQKLS0tIGEvZnMvc3F1YXNoZnMvS2NvbmZpZworKysgYi9mcy9zcXVhc2hmcy9LY29uZmlnCkBAIC0xLDcgKzEsNiBAQAogY29uZmlnIFNRVUFTSEZTCiAJdHJpc3RhdGUgIlNxdWFzaEZTIDQuMCAtIFNxdWFzaGVkIGZpbGUgc3lzdGVtIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBCTE9DSwotCXNlbGVjdCBaTElCX0lORkxBVEUKIAloZWxwCiAJICBTYXlpbmcgWSBoZXJlIGluY2x1ZGVzIHN1cHBvcnQgZm9yIFNxdWFzaEZTIDQuMCAoYSBDb21wcmVzc2VkCiAJICBSZWFkLU9ubHkgRmlsZSBTeXN0ZW0pLiAgU3F1YXNoZnMgaXMgYSBoaWdobHkgY29tcHJlc3NlZCByZWFkLW9ubHkKQEAgLTM2LDYgKzM1LDE5IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBTUVVBU0hGU19aTElCCisJYm9vbCAiSW5jbHVkZSBzdXBwb3J0IGZvciBaTElCIGNvbXByZXNzZWQgZmlsZSBzeXN0ZW1zIgorCWRlcGVuZHMgb24gU1FVQVNIRlMKKwlzZWxlY3QgWkxJQl9JTkZMQVRFCisJZGVmYXVsdCB5CisJaGVscAorCSAgWkxJQiBjb21wcmVzc2lvbiBpcyB0aGUgc3RhbmRhcmQgY29tcHJlc3Npb24gdXNlZCBieSBTcXVhc2hmcworCSAgZmlsZSBzeXN0ZW1zLiAgSXQgb2ZmZXJzIGEgZ29vZCB0cmFkZS1vZmYgYmV0d2VlbiBjb21wcmVzc2lvbgorCSAgYWNoaWV2ZWQgYW5kIHRoZSBhbW91bnQgb2YgQ1BVIHRpbWUgYW5kIG1lbW9yeSBuZWNlc3NhcnkgdG8KKwkgIGNvbXByZXNzIGFuZCBkZWNvbXByZXNzLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCiBjb25maWcgU1FVQVNIRlNfTFpPCiAJYm9vbCAiSW5jbHVkZSBzdXBwb3J0IGZvciBMWk8gY29tcHJlc3NlZCBmaWxlIHN5c3RlbXMiCiAJZGVwZW5kcyBvbiBTUVVBU0hGUwpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvTWFrZWZpbGUgYi9mcy9zcXVhc2hmcy9NYWtlZmlsZQppbmRleCBjZWNmMmJlLi4xMTBiMDQ3IDEwMDY0NAotLS0gYS9mcy9zcXVhc2hmcy9NYWtlZmlsZQorKysgYi9mcy9zcXVhc2hmcy9NYWtlZmlsZQpAQCAtNCw3ICs0LDggQEAKIAogb2JqLSQoQ09ORklHX1NRVUFTSEZTKSArPSBzcXVhc2hmcy5vCiBzcXVhc2hmcy15ICs9IGJsb2NrLm8gY2FjaGUubyBkaXIubyBleHBvcnQubyBmaWxlLm8gZnJhZ21lbnQubyBpZC5vIGlub2RlLm8KLXNxdWFzaGZzLXkgKz0gbmFtZWkubyBzdXBlci5vIHN5bWxpbmsubyB6bGliX3dyYXBwZXIubyBkZWNvbXByZXNzb3Iubworc3F1YXNoZnMteSArPSBuYW1laS5vIHN1cGVyLm8gc3ltbGluay5vIGRlY29tcHJlc3Nvci5vCiBzcXVhc2hmcy0kKENPTkZJR19TUVVBU0hGU19YQVRUUikgKz0geGF0dHIubyB4YXR0cl9pZC5vCiBzcXVhc2hmcy0kKENPTkZJR19TUVVBU0hGU19MWk8pICs9IGx6b193cmFwcGVyLm8KIHNxdWFzaGZzLSQoQ09ORklHX1NRVUFTSEZTX1haKSArPSB4el93cmFwcGVyLm8KK3NxdWFzaGZzLSQoQ09ORklHX1NRVUFTSEZTX1pMSUIpICs9IHpsaWJfd3JhcHBlci5vCmRpZmYgLS1naXQgYS9mcy9zcXVhc2hmcy9kZWNvbXByZXNzb3IuYyBiL2ZzL3NxdWFzaGZzL2RlY29tcHJlc3Nvci5jCmluZGV4IDlmMWIwYmIuLjNmNjI3MWQgMTAwNjQ0Ci0tLSBhL2ZzL3NxdWFzaGZzL2RlY29tcHJlc3Nvci5jCisrKyBiL2ZzL3NxdWFzaGZzL2RlY29tcHJlc3Nvci5jCkBAIC01Miw2ICs1MiwxMiBAQAogfTsKICNlbmRpZgogCisjaWZuZGVmIENPTkZJR19TUVVBU0hGU19aTElCCitzdGF0aWMgY29uc3Qgc3RydWN0IHNxdWFzaGZzX2RlY29tcHJlc3NvciBzcXVhc2hmc196bGliX2NvbXBfb3BzID0geworCU5VTEwsIE5VTEwsIE5VTEwsIFpMSUJfQ09NUFJFU1NJT04sICJ6bGliIiwgMAorfTsKKyNlbmRpZgorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNxdWFzaGZzX2RlY29tcHJlc3NvciBzcXVhc2hmc191bmtub3duX2NvbXBfb3BzID0gewogCU5VTEwsIE5VTEwsIE5VTEwsIDAsICJ1bmtub3duIiwgMAogfTsKZGlmZiAtLWdpdCBhL2ZzL3NxdWFzaGZzL2RlY29tcHJlc3Nvci5oIGIvZnMvc3F1YXNoZnMvZGVjb21wcmVzc29yLmgKaW5kZXggOGJhNzBjZi4uMzMwMDczZSAxMDA2NDQKLS0tIGEvZnMvc3F1YXNoZnMvZGVjb21wcmVzc29yLmgKKysrIGIvZnMvc3F1YXNoZnMvZGVjb21wcmVzc29yLmgKQEAgLTU2LDQgKzU2LDggQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc3F1YXNoZnNfZGVjb21wcmVzc29yIHNxdWFzaGZzX2x6b19jb21wX29wczsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1NRVUFTSEZTX1pMSUIKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc3F1YXNoZnNfZGVjb21wcmVzc29yIHNxdWFzaGZzX3psaWJfY29tcF9vcHM7CisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9zcXVhc2hmcy9uYW1laS5jIGIvZnMvc3F1YXNoZnMvbmFtZWkuYwppbmRleCA0YmM2M2FjLi4wNjgyYjM4IDEwMDY0NAotLS0gYS9mcy9zcXVhc2hmcy9uYW1laS5jCisrKyBiL2ZzL3NxdWFzaGZzL25hbWVpLmMKQEAgLTIyMCwxMSArMjIwLDYgQEAKIAkJCQkJYmxrLCBvZmYsIGlub19udW0pOwogCiAJCQkJaW5vZGUgPSBzcXVhc2hmc19pZ2V0KGRpci0+aV9zYiwgaW5vLCBpbm9fbnVtKTsKLQkJCQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQkJCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKLQkJCQkJZ290byBmYWlsZWQ7Ci0JCQkJfQotCiAJCQkJZ290byBleGl0X2xvb2t1cDsKIAkJCX0KIAkJfQpAQCAtMjMyLDEwICsyMjcsNyBAQAogCiBleGl0X2xvb2t1cDoKIAlrZnJlZShkaXJlKTsKLQlpZiAoaW5vZGUpCi0JCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKLQlkX2FkZChkZW50cnksIGlub2RlKTsKLQlyZXR1cm4gRVJSX1BUUigwKTsKKwlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiAKIGRhdGFfZXJyb3I6CiAJZXJyID0gLUVJTzsKZGlmZiAtLWdpdCBhL2ZzL3NxdWFzaGZzL3NxdWFzaGZzLmggYi9mcy9zcXVhc2hmcy9zcXVhc2hmcy5oCmluZGV4IGUzYmU2YTcuLmQxMjY2NTEgMTAwNjQ0Ci0tLSBhL2ZzL3NxdWFzaGZzL3NxdWFzaGZzLmgKKysrIGIvZnMvc3F1YXNoZnMvc3F1YXNoZnMuaApAQCAtOTcsNiArOTcsMyBAQAogCiAvKiB4YXR0ci5jICovCiBleHRlcm4gY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKnNxdWFzaGZzX3hhdHRyX2hhbmRsZXJzW107Ci0KLS8qIHpsaWJfd3JhcHBlci5jICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHNxdWFzaGZzX2RlY29tcHJlc3NvciBzcXVhc2hmc196bGliX2NvbXBfb3BzOwpkaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmMKaW5kZXggYzc1NTkzOS4uM2Y1NmEyNiAxMDA2NDQKLS0tIGEvZnMvc3VwZXIuYworKysgYi9mcy9zdXBlci5jCkBAIC0zOCw2ICszOCw2OSBAQAogTElTVF9IRUFEKHN1cGVyX2Jsb2Nrcyk7CiBERUZJTkVfU1BJTkxPQ0soc2JfbG9jayk7CiAKKy8qCisgKiBPbmUgdGhpbmcgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIG9mIHdpdGggYSBwZXItc2Igc2hyaW5rZXIgaXMgdGhhdCB3ZSBkb24ndAorICogZHJvcCB0aGUgbGFzdCBhY3RpdmUgcmVmZXJlbmNlIHRvIHRoZSBzdXBlcmJsb2NrIGZyb20gd2l0aGluIHRoZSBzaHJpbmtlci4KKyAqIElmIHRoYXQgaGFwcGVucyB3ZSBjb3VsZCB0cmlnZ2VyIHVucmVnaXN0ZXJpbmcgdGhlIHNocmlua2VyIGZyb20gd2l0aGluIHRoZQorICogc2hyaW5rZXIgcGF0aCBhbmQgdGhhdCBsZWFkcyB0byBkZWFkbG9jayBvbiB0aGUgc2hyaW5rZXJfcndzZW0uIEhlbmNlIHdlCisgKiB0YWtlIGEgcGFzc2l2ZSByZWZlcmVuY2UgdG8gdGhlIHN1cGVyYmxvY2sgdG8gYXZvaWQgdGhpcyBmcm9tIG9jY3VycmluZy4KKyAqLworc3RhdGljIGludCBwcnVuZV9zdXBlcihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmluaywgc3RydWN0IHNocmlua19jb250cm9sICpzYykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWludAlmc19vYmplY3RzID0gMDsKKwlpbnQJdG90YWxfb2JqZWN0czsKKworCXNiID0gY29udGFpbmVyX29mKHNocmluaywgc3RydWN0IHN1cGVyX2Jsb2NrLCBzX3Nocmluayk7CisKKwkvKgorCSAqIERlYWRsb2NrIGF2b2lkYW5jZS4gIFdlIG1heSBob2xkIHZhcmlvdXMgRlMgbG9ja3MsIGFuZCB3ZSBkb24ndCB3YW50CisJICogdG8gcmVjdXJzZSBpbnRvIHRoZSBGUyB0aGF0IGNhbGxlZCB1cyBpbiBjbGVhcl9pbm9kZSgpIGFuZCBmcmllbmRzLi4KKwkgKi8KKwlpZiAoc2MtPm5yX3RvX3NjYW4gJiYgIShzYy0+Z2ZwX21hc2sgJiBfX0dGUF9GUykpCisJCXJldHVybiAtMTsKKworCWlmICghZ3JhYl9zdXBlcl9wYXNzaXZlKHNiKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNiLT5zX29wICYmIHNiLT5zX29wLT5ucl9jYWNoZWRfb2JqZWN0cykKKwkJZnNfb2JqZWN0cyA9IHNiLT5zX29wLT5ucl9jYWNoZWRfb2JqZWN0cyhzYik7CisKKwl0b3RhbF9vYmplY3RzID0gc2ItPnNfbnJfZGVudHJ5X3VudXNlZCArCisJCQlzYi0+c19ucl9pbm9kZXNfdW51c2VkICsgZnNfb2JqZWN0cyArIDE7CisKKwlpZiAoc2MtPm5yX3RvX3NjYW4pIHsKKwkJaW50CWRlbnRyaWVzOworCQlpbnQJaW5vZGVzOworCisJCS8qIHByb3BvcnRpb24gdGhlIHNjYW4gYmV0d2VlbiB0aGUgY2FjaGVzICovCisJCWRlbnRyaWVzID0gKHNjLT5ucl90b19zY2FuICogc2ItPnNfbnJfZGVudHJ5X3VudXNlZCkgLworCQkJCQkJCXRvdGFsX29iamVjdHM7CisJCWlub2RlcyA9IChzYy0+bnJfdG9fc2NhbiAqIHNiLT5zX25yX2lub2Rlc191bnVzZWQpIC8KKwkJCQkJCQl0b3RhbF9vYmplY3RzOworCQlpZiAoZnNfb2JqZWN0cykKKwkJCWZzX29iamVjdHMgPSAoc2MtPm5yX3RvX3NjYW4gKiBmc19vYmplY3RzKSAvCisJCQkJCQkJdG90YWxfb2JqZWN0czsKKwkJLyoKKwkJICogcHJ1bmUgdGhlIGRjYWNoZSBmaXJzdCBhcyB0aGUgaWNhY2hlIGlzIHBpbm5lZCBieSBpdCwgdGhlbgorCQkgKiBwcnVuZSB0aGUgaWNhY2hlLCBmb2xsb3dlZCBieSB0aGUgZmlsZXN5c3RlbSBzcGVjaWZpYyBjYWNoZXMKKwkJICovCisJCXBydW5lX2RjYWNoZV9zYihzYiwgZGVudHJpZXMpOworCQlwcnVuZV9pY2FjaGVfc2Ioc2IsIGlub2Rlcyk7CisKKwkJaWYgKGZzX29iamVjdHMgJiYgc2ItPnNfb3AtPmZyZWVfY2FjaGVkX29iamVjdHMpIHsKKwkJCXNiLT5zX29wLT5mcmVlX2NhY2hlZF9vYmplY3RzKHNiLCBmc19vYmplY3RzKTsKKwkJCWZzX29iamVjdHMgPSBzYi0+c19vcC0+bnJfY2FjaGVkX29iamVjdHMoc2IpOworCQl9CisJCXRvdGFsX29iamVjdHMgPSBzYi0+c19ucl9kZW50cnlfdW51c2VkICsKKwkJCQlzYi0+c19ucl9pbm9kZXNfdW51c2VkICsgZnNfb2JqZWN0czsKKwl9CisKKwl0b3RhbF9vYmplY3RzID0gKHRvdGFsX29iamVjdHMgLyAxMDApICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKKwlkcm9wX3N1cGVyKHNiKTsKKwlyZXR1cm4gdG90YWxfb2JqZWN0czsKK30KKwogLyoqCiAgKglhbGxvY19zdXBlcgktCWNyZWF0ZSBuZXcgc3VwZXJibG9jawogICoJQHR5cGU6CWZpbGVzeXN0ZW0gdHlwZSBzdXBlcmJsb2NrIHNob3VsZCBiZWxvbmcgdG8KQEAgLTc3LDYgKzE0MCw4IEBACiAJCUlOSVRfSExJU1RfQkxfSEVBRCgmcy0+c19hbm9uKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnMtPnNfaW5vZGVzKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnMtPnNfZGVudHJ5X2xydSk7CisJCUlOSVRfTElTVF9IRUFEKCZzLT5zX2lub2RlX2xydSk7CisJCXNwaW5fbG9ja19pbml0KCZzLT5zX2lub2RlX2xydV9sb2NrKTsKIAkJaW5pdF9yd3NlbSgmcy0+c191bW91bnQpOwogCQltdXRleF9pbml0KCZzLT5zX2xvY2spOwogCQlsb2NrZGVwX3NldF9jbGFzcygmcy0+c191bW91bnQsICZ0eXBlLT5zX3Vtb3VudF9rZXkpOwpAQCAtMTE0LDYgKzE3OSwxMCBAQAogCQlzLT5zX29wID0gJmRlZmF1bHRfb3A7CiAJCXMtPnNfdGltZV9ncmFuID0gMTAwMDAwMDAwMDsKIAkJcy0+Y2xlYW5jYWNoZV9wb29saWQgPSAtMTsKKworCQlzLT5zX3Nocmluay5zZWVrcyA9IERFRkFVTFRfU0VFS1M7CisJCXMtPnNfc2hyaW5rLnNocmluayA9IHBydW5lX3N1cGVyOworCQlzLT5zX3Nocmluay5iYXRjaCA9IDEwMjQ7CiAJfQogb3V0OgogCXJldHVybiBzOwpAQCAtMTgxLDYgKzI1MCwxMCBAQAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzLT5zX2FjdGl2ZSkpIHsKIAkJY2xlYW5jYWNoZV9mbHVzaF9mcyhzKTsKIAkJZnMtPmtpbGxfc2Iocyk7CisKKwkJLyogY2FjaGVzIGFyZSBub3cgZ29uZSwgd2UgY2FuIHNhZmVseSBraWxsIHRoZSBzaHJpbmtlciBub3cgKi8KKwkJdW5yZWdpc3Rlcl9zaHJpbmtlcigmcy0+c19zaHJpbmspOworCiAJCS8qCiAJCSAqIFdlIG5lZWQgdG8gY2FsbCByY3VfYmFycmllciBzbyBhbGwgdGhlIGRlbGF5ZWQgcmN1IGZyZWUKIAkJICogaW5vZGVzIGFyZSBmbHVzaGVkIGJlZm9yZSB3ZSByZWxlYXNlIHRoZSBmcyBtb2R1bGUuCkBAIC0yNDEsMTcgKzMxNCw0OCBAQAogfQogCiAvKgorICoJZ3JhYl9zdXBlcl9wYXNzaXZlIC0gYWNxdWlyZSBhIHBhc3NpdmUgcmVmZXJlbmNlCisgKglAczogcmVmZXJlbmNlIHdlIGFyZSB0cnlpbmcgdG8gZ3JhYgorICoKKyAqCVRyaWVzIHRvIGFjcXVpcmUgYSBwYXNzaXZlIHJlZmVyZW5jZS4gVGhpcyBpcyB1c2VkIGluIHBsYWNlcyB3aGVyZSB3ZQorICoJY2Fubm90IHRha2UgYW4gYWN0aXZlIHJlZmVyZW5jZSBidXQgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUKKyAqCXN1cGVyYmxvY2sgZG9lcyBub3QgZ28gYXdheSB3aGlsZSB3ZSBhcmUgd29ya2luZyBvbiBpdC4gSXQgcmV0dXJucworICoJZmFsc2UgaWYgYSByZWZlcmVuY2Ugd2FzIG5vdCBnYWluZWQsIGFuZCByZXR1cm5zIHRydWUgd2l0aCB0aGUgc191bW91bnQKKyAqCWxvY2sgaGVsZCBpbiByZWFkIG1vZGUgaWYgYSByZWZlcmVuY2UgaXMgZ2FpbmVkLiBPbiBzdWNjZXNzZnVsIHJldHVybiwKKyAqCXRoZSBjYWxsZXIgbXVzdCBkcm9wIHRoZSBzX3Vtb3VudCBsb2NrIGFuZCB0aGUgcGFzc2l2ZSByZWZlcmVuY2Ugd2hlbgorICoJZG9uZS4KKyAqLworYm9vbCBncmFiX3N1cGVyX3Bhc3NpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzcGluX2xvY2soJnNiX2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZzYi0+c19pbnN0YW5jZXMpKSB7CisJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXNiLT5zX2NvdW50Kys7CisJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCisJaWYgKGRvd25fcmVhZF90cnlsb2NrKCZzYi0+c191bW91bnQpKSB7CisJCWlmIChzYi0+c19yb290KQorCQkJcmV0dXJuIHRydWU7CisJCXVwX3JlYWQoJnNiLT5zX3Vtb3VudCk7CisJfQorCisJcHV0X3N1cGVyKHNiKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCiAgKiBTdXBlcmJsb2NrIGxvY2tpbmcuICBXZSByZWFsbHkgb3VnaHQgdG8gZ2V0IHJpZCBvZiB0aGVzZSB0d28uCiAgKi8KIHZvaWQgbG9ja19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKIHsKLQlnZXRfZnNfZXhjbCgpOwogCW11dGV4X2xvY2soJnNiLT5zX2xvY2spOwogfQogCiB2b2lkIHVubG9ja19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKIHsKLQlwdXRfZnNfZXhjbCgpOwogCW11dGV4X3VubG9jaygmc2ItPnNfbG9jayk7CiB9CiAKQEAgLTI3NiwxMSArMzgwLDkgQEAKIHsKIAljb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqc29wID0gc2ItPnNfb3A7CiAKLQogCWlmIChzYi0+c19yb290KSB7CiAJCXNocmlua19kY2FjaGVfZm9yX3Vtb3VudChzYik7CiAJCXN5bmNfZmlsZXN5c3RlbShzYik7Ci0JCWdldF9mc19leGNsKCk7CiAJCXNiLT5zX2ZsYWdzICY9IH5NU19BQ1RJVkU7CiAKIAkJZnNub3RpZnlfdW5tb3VudF9pbm9kZXMoJnNiLT5zX2lub2Rlcyk7CkBAIC0yOTUsNyArMzk3LDYgQEAKIAkJCSAgICJTZWxmLWRlc3RydWN0IGluIDUgc2Vjb25kcy4gIEhhdmUgYSBuaWNlIGRheS4uLlxuIiwKIAkJCSAgIHNiLT5zX2lkKTsKIAkJfQotCQlwdXRfZnNfZXhjbCgpOwogCX0KIAlzcGluX2xvY2soJnNiX2xvY2spOwogCS8qIHNob3VsZCBiZSBpbml0aWFsaXplZCBmb3IgX19wdXRfc3VwZXJfYW5kX25lZWRfcmVzdGFydCgpICovCkBAIC0zNjQsNiArNDY1LDcgQEAKIAlsaXN0X2FkZCgmcy0+c19pbnN0YW5jZXMsICZ0eXBlLT5mc19zdXBlcnMpOwogCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKIAlnZXRfZmlsZXN5c3RlbSh0eXBlKTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmcy0+c19zaHJpbmspOwogCXJldHVybiBzOwogfQogCkBAIC00NTIsNiArNTU0LDQyIEBACiB9CiAKIC8qKgorICoJaXRlcmF0ZV9zdXBlcnNfdHlwZSAtIGNhbGwgZnVuY3Rpb24gZm9yIHN1cGVyYmxvY2tzIG9mIGdpdmVuIHR5cGUKKyAqCUB0eXBlOiBmcyB0eXBlCisgKglAZjogZnVuY3Rpb24gdG8gY2FsbAorICoJQGFyZzogYXJndW1lbnQgdG8gcGFzcyB0byBpdAorICoKKyAqCVNjYW5zIHRoZSBzdXBlcmJsb2NrIGxpc3QgYW5kIGNhbGxzIGdpdmVuIGZ1bmN0aW9uLCBwYXNzaW5nIGl0CisgKglsb2NrZWQgc3VwZXJibG9jayBhbmQgZ2l2ZW4gYXJndW1lbnQuCisgKi8KK3ZvaWQgaXRlcmF0ZV9zdXBlcnNfdHlwZShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqdHlwZSwKKwl2b2lkICgqZikoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCAqcCA9IE5VTEw7CisKKwlzcGluX2xvY2soJnNiX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2IsICZ0eXBlLT5mc19zdXBlcnMsIHNfaW5zdGFuY2VzKSB7CisJCXNiLT5zX2NvdW50Kys7CisJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKKworCQlkb3duX3JlYWQoJnNiLT5zX3Vtb3VudCk7CisJCWlmIChzYi0+c19yb290KQorCQkJZihzYiwgYXJnKTsKKwkJdXBfcmVhZCgmc2ItPnNfdW1vdW50KTsKKworCQlzcGluX2xvY2soJnNiX2xvY2spOworCQlpZiAocCkKKwkJCV9fcHV0X3N1cGVyKHApOworCQlwID0gc2I7CisJfQorCWlmIChwKQorCQlfX3B1dF9zdXBlcihwKTsKKwlzcGluX3VubG9jaygmc2JfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woaXRlcmF0ZV9zdXBlcnNfdHlwZSk7CisKKy8qKgogICoJZ2V0X3N1cGVyIC0gZ2V0IHRoZSBzdXBlcmJsb2NrIG9mIGEgZGV2aWNlCiAgKglAYmRldjogZGV2aWNlIHRvIGdldCB0aGUgc3VwZXJibG9jayBmb3IKICAqCQpAQCAtNjU3LDcgKzc5NSw3IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVubmFtZWRfZGV2X2xvY2spOy8qIHByb3RlY3RzIHRoZSBhYm92ZSAqLwogc3RhdGljIGludCB1bm5hbWVkX2Rldl9zdGFydCA9IDA7IC8qIGRvbid0IGJvdGhlciB0cnlpbmcgYmVsb3cgaXQgKi8KIAotaW50IHNldF9hbm9uX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKK2ludCBnZXRfYW5vbl9iZGV2KGRldl90ICpwKQogewogCWludCBkZXY7CiAJaW50IGVycm9yOwpAQCAtNjg0LDIzICs4MjIsMzcgQEAKIAkJc3Bpbl91bmxvY2soJnVubmFtZWRfZGV2X2xvY2spOwogCQlyZXR1cm4gLUVNRklMRTsKIAl9Ci0Jcy0+c19kZXYgPSBNS0RFVigwLCBkZXYgJiBNSU5PUk1BU0spOwotCXMtPnNfYmRpID0gJm5vb3BfYmFja2luZ19kZXZfaW5mbzsKKwkqcCA9IE1LREVWKDAsIGRldiAmIE1JTk9STUFTSyk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGdldF9hbm9uX2JkZXYpOworCit2b2lkIGZyZWVfYW5vbl9iZGV2KGRldl90IGRldikKK3sKKwlpbnQgc2xvdCA9IE1JTk9SKGRldik7CisJc3Bpbl9sb2NrKCZ1bm5hbWVkX2Rldl9sb2NrKTsKKwlpZGFfcmVtb3ZlKCZ1bm5hbWVkX2Rldl9pZGEsIHNsb3QpOworCWlmIChzbG90IDwgdW5uYW1lZF9kZXZfc3RhcnQpCisJCXVubmFtZWRfZGV2X3N0YXJ0ID0gc2xvdDsKKwlzcGluX3VubG9jaygmdW5uYW1lZF9kZXZfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKGZyZWVfYW5vbl9iZGV2KTsKKworaW50IHNldF9hbm9uX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZXJyb3IgPSBnZXRfYW5vbl9iZGV2KCZzLT5zX2Rldik7CisJaWYgKCFlcnJvcikKKwkJcy0+c19iZGkgPSAmbm9vcF9iYWNraW5nX2Rldl9pbmZvOworCXJldHVybiBlcnJvcjsKK30KIAogRVhQT1JUX1NZTUJPTChzZXRfYW5vbl9zdXBlcik7CiAKIHZvaWQga2lsbF9hbm9uX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0JaW50IHNsb3QgPSBNSU5PUihzYi0+c19kZXYpOwotCisJZGV2X3QgZGV2ID0gc2ItPnNfZGV2OwogCWdlbmVyaWNfc2h1dGRvd25fc3VwZXIoc2IpOwotCXNwaW5fbG9jaygmdW5uYW1lZF9kZXZfbG9jayk7Ci0JaWRhX3JlbW92ZSgmdW5uYW1lZF9kZXZfaWRhLCBzbG90KTsKLQlpZiAoc2xvdCA8IHVubmFtZWRfZGV2X3N0YXJ0KQotCQl1bm5hbWVkX2Rldl9zdGFydCA9IHNsb3Q7Ci0Jc3Bpbl91bmxvY2soJnVubmFtZWRfZGV2X2xvY2spOworCWZyZWVfYW5vbl9iZGV2KGRldik7CiB9CiAKIEVYUE9SVF9TWU1CT0woa2lsbF9hbm9uX3N1cGVyKTsKQEAgLTgyMiw3ICs5NzQsNyBAQAogCX0gZWxzZSB7CiAJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAotCQlzLT5zX2ZsYWdzID0gZmxhZ3M7CisJCXMtPnNfZmxhZ3MgPSBmbGFncyB8IE1TX05PU0VDOwogCQlzLT5zX21vZGUgPSBtb2RlOwogCQlzdHJsY3B5KHMtPnNfaWQsIGJkZXZuYW1lKGJkZXYsIGIpLCBzaXplb2Yocy0+c19pZCkpOwogCQlzYl9zZXRfYmxvY2tzaXplKHMsIGJsb2NrX3NpemUoYmRldikpOwpkaWZmIC0tZ2l0IGEvZnMvc3luYy5jIGIvZnMvc3luYy5jCmluZGV4IGMzOGVjMTYuLmM5OGE3NDcgMTAwNjQ0Ci0tLSBhL2ZzL3N5bmMuYworKysgYi9mcy9zeW5jLmMKQEAgLTE2NSwyOCArMTY1LDkgQEAKICAqLwogaW50IHZmc19mc3luY19yYW5nZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCiB7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7Ci0JaW50IGVyciwgcmV0OwotCi0JaWYgKCFmaWxlLT5mX29wIHx8ICFmaWxlLT5mX29wLT5mc3luYykgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKG1hcHBpbmcsIHN0YXJ0LCBlbmQpOwotCi0JLyoKLQkgKiBXZSBuZWVkIHRvIHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHdyaXRlcnMsIHdoaWNoIGNvdWxkIGNhdXNlCi0JICogbGl2ZWxvY2tzIGluIGZzeW5jX2J1ZmZlcnNfbGlzdCgpLgotCSAqLwotCW11dGV4X2xvY2soJm1hcHBpbmctPmhvc3QtPmlfbXV0ZXgpOwotCWVyciA9IGZpbGUtPmZfb3AtPmZzeW5jKGZpbGUsIGRhdGFzeW5jKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gZXJyOwotCW11dGV4X3VubG9jaygmbWFwcGluZy0+aG9zdC0+aV9tdXRleCk7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OworCWlmICghZmlsZS0+Zl9vcCB8fCAhZmlsZS0+Zl9vcC0+ZnN5bmMpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBmaWxlLT5mX29wLT5mc3luYyhmaWxlLCBzdGFydCwgZW5kLCBkYXRhc3luYyk7CiB9CiBFWFBPUlRfU1lNQk9MKHZmc19mc3luY19yYW5nZSk7CiAKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2lub2RlLmMgYi9mcy9zeXNmcy9pbm9kZS5jCmluZGV4IDBhMTJlYjguLmUzZjA5MWEgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2lub2RlLmMKKysrIGIvZnMvc3lzZnMvaW5vZGUuYwpAQCAtMzQ5LDExICszNDksMTEgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLWludCBzeXNmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitpbnQgc3lzZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZDsKIAotCWlmIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKQorCWlmIChtYXNrICYgTUFZX05PVF9CTE9DSykKIAkJcmV0dXJuIC1FQ0hJTEQ7CiAKIAlzZCA9IGlub2RlLT5pX3ByaXZhdGU7CkBAIC0zNjIsNSArMzYyLDUgQEAKIAlzeXNmc19yZWZyZXNoX2lub2RlKHNkLCBpbm9kZSk7CiAJbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7CiAKLQlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBmbGFncywgTlVMTCk7CisJcmV0dXJuIGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzayk7CiB9CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9tb3VudC5jIGIvZnMvc3lzZnMvbW91bnQuYwppbmRleCAyNjY4OTU3Li5lMzRmMGQ5IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9tb3VudC5jCisrKyBiL2ZzL3N5c2ZzL21vdW50LmMKQEAgLTk1LDYgKzk1LDE0IEBACiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgdm9pZCBmcmVlX3N5c2ZzX3N1cGVyX2luZm8oc3RydWN0IHN5c2ZzX3N1cGVyX2luZm8gKmluZm8pCit7CisJaW50IHR5cGU7CisJZm9yICh0eXBlID0gS09CSl9OU19UWVBFX05PTkU7IHR5cGUgPCBLT0JKX05TX1RZUEVTOyB0eXBlKyspCisJCWtvYmpfbnNfZHJvcCh0eXBlLCBpbmZvLT5uc1t0eXBlXSk7CisJa2ZyZWUoaW5mbyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzeXNmc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQogewpAQCAtMTA4LDExICsxMTYsMTEgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlmb3IgKHR5cGUgPSBLT0JKX05TX1RZUEVfTk9ORTsgdHlwZSA8IEtPQkpfTlNfVFlQRVM7IHR5cGUrKykKLQkJaW5mby0+bnNbdHlwZV0gPSBrb2JqX25zX2N1cnJlbnQodHlwZSk7CisJCWluZm8tPm5zW3R5cGVdID0ga29ial9uc19ncmFiX2N1cnJlbnQodHlwZSk7CiAKIAlzYiA9IHNnZXQoZnNfdHlwZSwgc3lzZnNfdGVzdF9zdXBlciwgc3lzZnNfc2V0X3N1cGVyLCBpbmZvKTsKIAlpZiAoSVNfRVJSKHNiKSB8fCBzYi0+c19mc19pbmZvICE9IGluZm8pCi0JCWtmcmVlKGluZm8pOworCQlmcmVlX3N5c2ZzX3N1cGVyX2luZm8oaW5mbyk7CiAJaWYgKElTX0VSUihzYikpCiAJCXJldHVybiBFUlJfQ0FTVChzYik7CiAJaWYgKCFzYi0+c19yb290KSB7CkBAIC0xMzEsMTIgKzEzOSwxMSBAQAogc3RhdGljIHZvaWQgc3lzZnNfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBzeXNmc19zdXBlcl9pbmZvICppbmZvID0gc3lzZnNfaW5mbyhzYik7Ci0KIAkvKiBSZW1vdmUgdGhlIHN1cGVyYmxvY2sgZnJvbSBmc19zdXBlcnMvc19pbnN0YW5jZXMKIAkgKiBzbyB3ZSBjYW4ndCBmaW5kIGl0LCBiZWZvcmUgZnJlZWluZyBzeXNmc19zdXBlcl9pbmZvLgogCSAqLwogCWtpbGxfYW5vbl9zdXBlcihzYik7Ci0Ja2ZyZWUoaW5mbyk7CisJZnJlZV9zeXNmc19zdXBlcl9pbmZvKGluZm8pOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc3lzZnNfZnNfdHlwZSA9IHsKQEAgLTE0NSwyOCArMTUyLDYgQEAKIAkua2lsbF9zYgk9IHN5c2ZzX2tpbGxfc2IsCiB9OwogCi12b2lkIHN5c2ZzX2V4aXRfbnMoZW51bSBrb2JqX25zX3R5cGUgdHlwZSwgY29uc3Qgdm9pZCAqbnMpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKLQotCW11dGV4X2xvY2soJnN5c2ZzX211dGV4KTsKLQlzcGluX2xvY2soJnNiX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2IsICZzeXNmc19mc190eXBlLmZzX3N1cGVycywgc19pbnN0YW5jZXMpIHsKLQkJc3RydWN0IHN5c2ZzX3N1cGVyX2luZm8gKmluZm8gPSBzeXNmc19pbmZvKHNiKTsKLQkJLyoKLQkJICogSWYgd2Ugc2VlIGEgc3VwZXJibG9jayBvbiB0aGUgZnNfc3VwZXJzL3NfaW5zdGFuY2VzCi0JCSAqIGxpc3QgdGhlIHVubW91bnQgaGFzIG5vdCBjb21wbGV0ZWQgYW5kIHNiLT5zX2ZzX2luZm8KLQkJICogcG9pbnRzIHRvIGEgdmFsaWQgc3RydWN0IHN5c2ZzX3N1cGVyX2luZm8uCi0JCSAqLwotCQkvKiBJZ25vcmUgc3VwZXJibG9ja3Mgd2l0aCB0aGUgd3JvbmcgbnMgKi8KLQkJaWYgKGluZm8tPm5zW3R5cGVdICE9IG5zKQotCQkJY29udGludWU7Ci0JCWluZm8tPm5zW3R5cGVdID0gTlVMTDsKLQl9Ci0Jc3Bpbl91bmxvY2soJnNiX2xvY2spOwotCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOwotfQotCiBpbnQgX19pbml0IHN5c2ZzX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL3N5c2ZzLmggYi9mcy9zeXNmcy9zeXNmcy5oCmluZGV4IDNkMjhhZjMuLjg0NWFiM2EgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL3N5c2ZzLmgKKysrIGIvZnMvc3lzZnMvc3lzZnMuaApAQCAtMTM2LDcgKzEzNiw3IEBACiAgKiBpbnN0YW5jZSkuCiAgKi8KIHN0cnVjdCBzeXNmc19zdXBlcl9pbmZvIHsKLQljb25zdCB2b2lkICpuc1tLT0JKX05TX1RZUEVTXTsKKwl2b2lkICpuc1tLT0JKX05TX1RZUEVTXTsKIH07CiAjZGVmaW5lIHN5c2ZzX2luZm8oU0IpICgoc3RydWN0IHN5c2ZzX3N1cGVyX2luZm8gKikoU0ItPnNfZnNfaW5mbykpCiBleHRlcm4gc3RydWN0IHN5c2ZzX2RpcmVudCBzeXNmc19yb290OwpAQCAtMjAxLDcgKzIwMSw3IEBACiBzdHJ1Y3QgaW5vZGUgKnN5c2ZzX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCk7CiB2b2lkIHN5c2ZzX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogaW50IHN5c2ZzX3NkX3NldGF0dHIoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QsIHN0cnVjdCBpYXR0ciAqaWF0dHIpOwotaW50IHN5c2ZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncyk7CitpbnQgc3lzZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiBpbnQgc3lzZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqaWF0dHIpOwogaW50IHN5c2ZzX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdGF0KTsKIGludCBzeXNmc19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLApkaWZmIC0tZ2l0IGEvZnMvdGltZXJmZC5jIGIvZnMvdGltZXJmZC5jCmluZGV4IGY2N2FjYmQuLmRmZmViMzcgMTAwNjQ0Ci0tLSBhL2ZzL3RpbWVyZmQuYworKysgYi9mcy90aW1lcmZkLmMKQEAgLTYxLDcgKzYxLDkgQEAKIAogLyoKICAqIENhbGxlZCB3aGVuIHRoZSBjbG9jayB3YXMgc2V0IHRvIGNhbmNlbCB0aGUgdGltZXJzIGluIHRoZSBjYW5jZWwKLSAqIGxpc3QuCisgKiBsaXN0LiBUaGlzIHdpbGwgd2FrZSB1cCBwcm9jZXNzZXMgd2FpdGluZyBvbiB0aGVzZSB0aW1lcnMuIFRoZQorICogd2FrZS11cCByZXF1aXJlcyBjdHgtPnRpY2tzIHRvIGJlIG5vbiB6ZXJvLCB0aGVyZWZvcmUgd2UgaW5jcmVtZW50CisgKiBpdCBiZWZvcmUgY2FsbGluZyB3YWtlX3VwX2xvY2tlZCgpLgogICovCiB2b2lkIHRpbWVyZmRfY2xvY2tfd2FzX3NldCh2b2lkKQogewpAQCAtNzYsNiArNzgsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT53cWgubG9jaywgZmxhZ3MpOwogCQlpZiAoY3R4LT5tb2Zmcy50djY0ICE9IG1vZmZzLnR2NjQpIHsKIAkJCWN0eC0+bW9mZnMudHY2NCA9IEtUSU1FX01BWDsKKwkJCWN0eC0+dGlja3MrKzsKIAkJCXdha2VfdXBfbG9ja2VkKCZjdHgtPndxaCk7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT53cWgubG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvY29tbWl0LmMgYi9mcy91Ymlmcy9jb21taXQuYwppbmRleCA4N2NkMGVhLi5mYjNiNWM4IDEwMDY0NAotLS0gYS9mcy91Ymlmcy9jb21taXQuYworKysgYi9mcy91Ymlmcy9jb21taXQuYwpAQCAtNzgsNyArNzgsNyBAQAogCSAqIElmIHRoZSByb290IFROQyBub2RlIGlzIGRpcnR5LCB3ZSBkZWZpbml0ZWx5IGhhdmUgc29tZXRoaW5nIHRvCiAJICogY29tbWl0LgogCSAqLwotCWlmIChjLT56cm9vdC56bm9kZSAmJiB0ZXN0X2JpdChESVJUWV9aTk9ERSwgJmMtPnpyb290Lnpub2RlLT5mbGFncykpCisJaWYgKGMtPnpyb290Lnpub2RlICYmIHViaWZzX3puX2RpcnR5KGMtPnpyb290Lnpub2RlKSkKIAkJcmV0dXJuIDA7CiAKIAkvKgpAQCAtNDE4LDcgKzQxOCw3IEBACiAKIAlzcGluX2xvY2soJmMtPmNzX2xvY2spOwogCWlmIChjLT5jbXRfc3RhdGUgPT0gQ09NTUlUX0JST0tFTikgewotCQllcnIgPSAtRUlOVkFMOworCQllcnIgPSAtRVJPRlM7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtNDQ0LDcgKzQ0NCw3IEBACiAJICogcmUtY2hlY2sgaXQuCiAJICovCiAJaWYgKGMtPmNtdF9zdGF0ZSA9PSBDT01NSVRfQlJPS0VOKSB7Ci0JCWVyciA9IC1FSU5WQUw7CisJCWVyciA9IC1FUk9GUzsKIAkJZ290byBvdXRfY210X3VubG9jazsKIAl9CiAKQEAgLTU3Niw3ICs1NzYsNyBAQAogCXN0cnVjdCBpZHhfbm9kZSAqaTsKIAlzaXplX3Qgc3o7CiAKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfT0xEX0lEWCkpCisJaWYgKCFkYmdfaXNfY2hrX2luZGV4KGMpKQogCQlyZXR1cm4gMDsKIAogCUlOSVRfTElTVF9IRUFEKCZsaXN0KTsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2RlYnVnLmMgYi9mcy91Ymlmcy9kZWJ1Zy5jCmluZGV4IDBiYjJiY2UuLmVlZjEwOWEgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2RlYnVnLmMKKysrIGIvZnMvdWJpZnMvZGVidWcuYwpAQCAtMjcsMTMgKzI3LDEyIEBACiAgKiB2YXJpb3VzIGxvY2FsIGZ1bmN0aW9ucyBvZiB0aG9zZSBzdWJzeXN0ZW1zLgogICovCiAKLSNkZWZpbmUgVUJJRlNfREJHX1BSRVNFUlZFX1VCSQotCi0jaW5jbHVkZSAidWJpZnMuaCIKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSAidWJpZnMuaCIKIAogI2lmZGVmIENPTkZJR19VQklGU19GU19ERUJVRwogCkBAIC00MiwxNSArNDEsNiBAQAogc3RhdGljIGNoYXIgZGJnX2tleV9idWYwWzEyOF07CiBzdGF0aWMgY2hhciBkYmdfa2V5X2J1ZjFbMTI4XTsKIAotdW5zaWduZWQgaW50IHViaWZzX2Noa19mbGFnczsKLXVuc2lnbmVkIGludCB1Ymlmc190c3RfZmxhZ3M7Ci0KLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19jaGtzLCB1Ymlmc19jaGtfZmxhZ3MsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z190c3RzLCB1Ymlmc190c3RfZmxhZ3MsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLQotTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19jaGtzLCAiRGVidWcgY2hlY2sgZmxhZ3MiKTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWdfdHN0cywgIkRlYnVnIHNwZWNpYWwgdGVzdCBmbGFncyIpOwotCiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2tleV9mbXQoaW50IGZtdCkKIHsKIAlzd2l0Y2ggKGZtdCkgewpAQCAtOTEsNiArODEsMjggQEAKIAl9CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfZGVudF90eXBlKGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgVUJJRlNfSVRZUEVfUkVHOgorCQlyZXR1cm4gImZpbGUiOworCWNhc2UgVUJJRlNfSVRZUEVfRElSOgorCQlyZXR1cm4gImRpciI7CisJY2FzZSBVQklGU19JVFlQRV9MTks6CisJCXJldHVybiAic3ltbGluayI7CisJY2FzZSBVQklGU19JVFlQRV9CTEs6CisJCXJldHVybiAiYmxrZGV2IjsKKwljYXNlIFVCSUZTX0lUWVBFX0NIUjoKKwkJcmV0dXJuICJjaGFyIGRldiI7CisJY2FzZSBVQklGU19JVFlQRV9GSUZPOgorCQlyZXR1cm4gImZpZm8iOworCWNhc2UgVUJJRlNfSVRZUEVfU09DSzoKKwkJcmV0dXJuICJzb2NrZXQiOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93bi9pbnZhbGlkIHR5cGUiOworCX0KK30KKwogc3RhdGljIHZvaWQgc3ByaW50Zl9rZXkoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIGNvbnN0IHVuaW9uIHViaWZzX2tleSAqa2V5LAogCQkJY2hhciAqYnVmZmVyKQogewpAQCAtMjM0LDkgKzI0NiwxMyBAQAogCXByaW50ayhLRVJOX0RFQlVHICJcdGxlbiAgICAgICAgICAgICV1XG4iLCBsZTMyX3RvX2NwdShjaC0+bGVuKSk7CiB9CiAKLXZvaWQgZGJnX2R1bXBfaW5vZGUoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUpCit2b2lkIGRiZ19kdW1wX2lub2RlKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWNvbnN0IHN0cnVjdCB1Ymlmc19pbm9kZSAqdWkgPSB1Ymlmc19pbm9kZShpbm9kZSk7CisJc3RydWN0IHFzdHIgbm0gPSB7IC5uYW1lID0gTlVMTCB9OworCXVuaW9uIHViaWZzX2tleSBrZXk7CisJc3RydWN0IHViaWZzX2RlbnRfbm9kZSAqZGVudCwgKnBkZW50ID0gTlVMTDsKKwlpbnQgY291bnQgPSAyOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIkR1bXAgaW4tbWVtb3J5IGlub2RlOiIpOwogCXByaW50ayhLRVJOX0RFQlVHICJcdGlub2RlICAgICAgICAgICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKQEAgLTI3MCw2ICsyODYsMzIgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiXHRsYXN0X3BhZ2VfcmVhZCAlbHVcbiIsIHVpLT5sYXN0X3BhZ2VfcmVhZCk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIlx0cmVhZF9pbl9hX3JvdyAgJWx1XG4iLCB1aS0+cmVhZF9pbl9hX3Jvdyk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIlx0ZGF0YV9sZW4gICAgICAgJWRcbiIsIHVpLT5kYXRhX2xlbik7CisKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0RFQlVHICJMaXN0IG9mIGRpcmVjdG9yeSBlbnRyaWVzOlxuIik7CisJdWJpZnNfYXNzZXJ0KCFtdXRleF9pc19sb2NrZWQoJmMtPnRuY19tdXRleCkpOworCisJbG93ZXN0X2RlbnRfa2V5KGMsICZrZXksIGlub2RlLT5pX2lubyk7CisJd2hpbGUgKDEpIHsKKwkJZGVudCA9IHViaWZzX3RuY19uZXh0X2VudChjLCAma2V5LCAmbm0pOworCQlpZiAoSVNfRVJSKGRlbnQpKSB7CisJCQlpZiAoUFRSX0VSUihkZW50KSAhPSAtRU5PRU5UKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJlcnJvciAlbGRcbiIsIFBUUl9FUlIoZGVudCkpOworCQkJYnJlYWs7CisJCX0KKworCQlwcmludGsoS0VSTl9ERUJVRyAiXHQlZDogJXMgKCVzKVxuIiwKKwkJICAgICAgIGNvdW50KyssIGRlbnQtPm5hbWUsIGdldF9kZW50X3R5cGUoZGVudC0+dHlwZSkpOworCisJCW5tLm5hbWUgPSBkZW50LT5uYW1lOworCQlubS5sZW4gPSBsZTE2X3RvX2NwdShkZW50LT5ubGVuKTsKKwkJa2ZyZWUocGRlbnQpOworCQlwZGVudCA9IGRlbnQ7CisJCWtleV9yZWFkKGMsICZkZW50LT5rZXksICZrZXkpOworCX0KKwlrZnJlZShwZGVudCk7CiB9CiAKIHZvaWQgZGJnX2R1bXBfbm9kZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgY29uc3Qgdm9pZCAqbm9kZSkKQEAgLTI3OCw3ICszMjAsNyBAQAogCXVuaW9uIHViaWZzX2tleSBrZXk7CiAJY29uc3Qgc3RydWN0IHViaWZzX2NoICpjaCA9IG5vZGU7CiAKLQlpZiAoZGJnX2ZhaWx1cmVfbW9kZSkKKwlpZiAoZGJnX2lzX3RzdF9yY3ZyeShjKSkKIAkJcmV0dXJuOwogCiAJLyogSWYgdGhlIG1hZ2ljIGlzIGluY29ycmVjdCwganVzdCBoZXhkdW1wIHRoZSBmaXJzdCBieXRlcyAqLwpAQCAtODM0LDcgKzg3Niw3IEBACiAJc3RydWN0IHViaWZzX3NjYW5fbm9kZSAqc25vZDsKIAl2b2lkICpidWY7CiAKLQlpZiAoZGJnX2ZhaWx1cmVfbW9kZSkKKwlpZiAoZGJnX2lzX3RzdF9yY3ZyeShjKSkKIAkJcmV0dXJuOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIihwaWQgJWQpIHN0YXJ0IGR1bXBpbmcgTEVCICVkXG4iLApAQCAtMTA4MCw2ICsxMTIyLDcgQEAKIAogLyoqCiAgKiBkYmdfY2hlY2tfc3luY2VkX2lfc2l6ZSAtIGNoZWNrIHN5bmNocm9uaXplZCBpbm9kZSBzaXplLgorICogQGM6IFVCSUZTIGZpbGUtc3lzdGVtIGRlc2NyaXB0aW9uIG9iamVjdAogICogQGlub2RlOiBpbm9kZSB0byBjaGVjawogICoKICAqIElmIGlub2RlIGlzIGNsZWFuLCBzeW5jaHJvbml6ZWQgaW5vZGUgc2l6ZSBoYXMgdG8gYmUgZXF1aXZhbGVudCB0byBjdXJyZW50CkBAIC0xMDg3LDEyICsxMTMwLDEyIEBACiAgKiBoYXMgdG8gYmUgbG9ja2VkKS4gUmV0dXJucyAlMCBpZiBzeW5jaHJvbml6ZWQgaW5vZGUgc2l6ZSBpZiBjb3JyZWN0LCBhbmQKICAqICUtRUlOVkFMIGlmIG5vdC4KICAqLwotaW50IGRiZ19jaGVja19zeW5jZWRfaV9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitpbnQgZGJnX2NoZWNrX3N5bmNlZF9pX3NpemUoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IHViaWZzX2lub2RlICp1aSA9IHViaWZzX2lub2RlKGlub2RlKTsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19HRU4pKQorCWlmICghZGJnX2lzX2Noa19nZW4oYykpCiAJCXJldHVybiAwOwogCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKIAkJcmV0dXJuIDA7CkBAIC0xMTI1LDcgKzExNjgsNyBAQAogICogTm90ZSwgaXQgaXMgZ29vZCBpZGVhIHRvIG1ha2Ugc3VyZSB0aGUgQGRpci0+aV9tdXRleCBpcyBsb2NrZWQgYmVmb3JlCiAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAgKi8KLWludCBkYmdfY2hlY2tfZGlyX3NpemUoc3RydWN0IHViaWZzX2luZm8gKmMsIGNvbnN0IHN0cnVjdCBpbm9kZSAqZGlyKQoraW50IGRiZ19jaGVja19kaXIoc3RydWN0IHViaWZzX2luZm8gKmMsIGNvbnN0IHN0cnVjdCBpbm9kZSAqZGlyKQogewogCXVuc2lnbmVkIGludCBubGluayA9IDI7CiAJdW5pb24gdWJpZnNfa2V5IGtleTsKQEAgLTExMzMsNyArMTE3Niw3IEBACiAJc3RydWN0IHFzdHIgbm0gPSB7IC5uYW1lID0gTlVMTCB9OwogCWxvZmZfdCBzaXplID0gVUJJRlNfSU5PX05PREVfU1o7CiAKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfR0VOKSkKKwlpZiAoIWRiZ19pc19jaGtfZ2VuKGMpKQogCQlyZXR1cm4gMDsKIAogCWlmICghU19JU0RJUihkaXItPmlfbW9kZSkpCkBAIC0xMTY3LDEyICsxMjEwLDE0IEBACiAJCQkgICJidXQgY2FsY3VsYXRlZCBzaXplIGlzICVsbHUiLCBkaXItPmlfaW5vLAogCQkJICAodW5zaWduZWQgbG9uZyBsb25nKWlfc2l6ZV9yZWFkKGRpciksCiAJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpc2l6ZSk7CisJCWRiZ19kdW1wX2lub2RlKGMsIGRpcik7CiAJCWR1bXBfc3RhY2soKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChkaXItPmlfbmxpbmsgIT0gbmxpbmspIHsKIAkJdWJpZnNfZXJyKCJkaXJlY3RvcnkgaW5vZGUgJWx1IGhhcyBubGluayAldSwgYnV0IGNhbGN1bGF0ZWQgIgogCQkJICAibmxpbmsgaXMgJXUiLCBkaXItPmlfaW5vLCBkaXItPmlfbmxpbmssIG5saW5rKTsKKwkJZGJnX2R1bXBfaW5vZGUoYywgZGlyKTsKIAkJZHVtcF9zdGFjaygpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNDg5LDcgKzE1MzQsNyBAQAogCWxvbmcgY2xlYW5fY250ID0gMCwgZGlydHlfY250ID0gMDsKIAlpbnQgZXJyLCBsYXN0OwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX1ROQykpCisJaWYgKCFkYmdfaXNfY2hrX2luZGV4KGMpKQogCQlyZXR1cm4gMDsKIAogCXViaWZzX2Fzc2VydChtdXRleF9pc19sb2NrZWQoJmMtPnRuY19tdXRleCkpOwpAQCAtMTczNiw3ICsxNzgxLDcgQEAKIAlpbnQgZXJyOwogCWxvbmcgbG9uZyBjYWxjID0gMDsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19JRFhfU1opKQorCWlmICghZGJnX2lzX2Noa19pbmRleChjKSkKIAkJcmV0dXJuIDA7CiAKIAllcnIgPSBkYmdfd2Fsa19pbmRleChjLCBOVUxMLCBhZGRfc2l6ZSwgJmNhbGMpOwpAQCAtMjMxMiw3ICsyMzU3LDcgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBmc2NrX2RhdGEgZnNja2Q7CiAKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfRlMpKQorCWlmICghZGJnX2lzX2Noa19mcyhjKSkKIAkJcmV0dXJuIDA7CiAKIAlmc2NrZC5pbm9kZXMgPSBSQl9ST09UOwpAQCAtMjM0Nyw3ICsyMzkyLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CiAJc3RydWN0IHViaWZzX3NjYW5fbm9kZSAqc2EsICpzYjsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19HRU4pKQorCWlmICghZGJnX2lzX2Noa19nZW4oYykpCiAJCXJldHVybiAwOwogCiAJZm9yIChjdXIgPSBoZWFkLT5uZXh0OyBjdXItPm5leHQgIT0gaGVhZDsgY3VyID0gY3VyLT5uZXh0KSB7CkBAIC0yNDE0LDcgKzI0NTksNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmN1cjsKIAlzdHJ1Y3QgdWJpZnNfc2Nhbl9ub2RlICpzYSwgKnNiOwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX0dFTikpCisJaWYgKCFkYmdfaXNfY2hrX2dlbihjKSkKIAkJcmV0dXJuIDA7CiAKIAlmb3IgKGN1ciA9IGhlYWQtPm5leHQ7IGN1ci0+bmV4dCAhPSBoZWFkOyBjdXIgPSBjdXItPm5leHQpIHsKQEAgLTI0OTEsMjE0ICsyNTM2LDE0MSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZGJnX2ZvcmNlX2luX3RoZV9nYXBzKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBjaGFuY2UodW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCBvdXRfb2YpCiB7Ci0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX0dFTikpCi0JCXJldHVybiAwOworCXJldHVybiAhISgocmFuZG9tMzIoKSAlIG91dF9vZikgKyAxIDw9IG4pOwogCi0JcmV0dXJuICEocmFuZG9tMzIoKSAmIDcpOwogfQogCi0vKiBGYWlsdXJlIG1vZGUgZm9yIHJlY292ZXJ5IHRlc3RpbmcgKi8KLQotI2RlZmluZSBjaGFuY2UobiwgZCkgKHNpbXBsZV9yYW5kKCkgPD0gKG4pICogMzI3NjhMTCAvIChkKSkKLQotc3RydWN0IGZhaWx1cmVfbW9kZV9pbmZvIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IHViaWZzX2luZm8gKmM7Ci19OwotCi1zdGF0aWMgTElTVF9IRUFEKGZtaV9saXN0KTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZm1pX2xvY2spOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IG5leHQ7Ci0KLXN0YXRpYyBpbnQgc2ltcGxlX3JhbmQodm9pZCkKK3N0YXRpYyBpbnQgcG93ZXJfY3V0X2VtdWxhdGVkKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwgaW50IHdyaXRlKQogewotCWlmIChuZXh0ID09IDApCi0JCW5leHQgPSBjdXJyZW50LT5waWQ7Ci0JbmV4dCA9IG5leHQgKiAxMTAzNTE1MjQ1ICsgMTIzNDU7Ci0JcmV0dXJuIChuZXh0ID4+IDE2KSAmIDMyNzY3OwotfQorCXN0cnVjdCB1Ymlmc19kZWJ1Z19pbmZvICpkID0gYy0+ZGJnOwogCi1zdGF0aWMgdm9pZCBmYWlsdXJlX21vZGVfaW5pdChzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKLXsKLQlzdHJ1Y3QgZmFpbHVyZV9tb2RlX2luZm8gKmZtaTsKKwl1Ymlmc19hc3NlcnQoZGJnX2lzX3RzdF9yY3ZyeShjKSk7CiAKLQlmbWkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmFpbHVyZV9tb2RlX2luZm8pLCBHRlBfTk9GUyk7Ci0JaWYgKCFmbWkpIHsKLQkJdWJpZnNfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZmFpbHVyZSBtb2RlIC0gbm8gbWVtb3J5Iik7Ci0JCXJldHVybjsKLQl9Ci0JZm1pLT5jID0gYzsKLQlzcGluX2xvY2soJmZtaV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZmbWktPmxpc3QsICZmbWlfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmZtaV9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgZmFpbHVyZV9tb2RlX2V4aXQoc3RydWN0IHViaWZzX2luZm8gKmMpCi17Ci0Jc3RydWN0IGZhaWx1cmVfbW9kZV9pbmZvICpmbWksICp0bXA7Ci0KLQlzcGluX2xvY2soJmZtaV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZm1pLCB0bXAsICZmbWlfbGlzdCwgbGlzdCkKLQkJaWYgKGZtaS0+YyA9PSBjKSB7Ci0JCQlsaXN0X2RlbCgmZm1pLT5saXN0KTsKLQkJCWtmcmVlKGZtaSk7Ci0JCX0KLQlzcGluX3VubG9jaygmZm1pX2xvY2spOwotfQotCi1zdGF0aWMgc3RydWN0IHViaWZzX2luZm8gKmRiZ19maW5kX2luZm8oc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3QgZmFpbHVyZV9tb2RlX2luZm8gKmZtaTsKLQotCXNwaW5fbG9jaygmZm1pX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZm1pLCAmZm1pX2xpc3QsIGxpc3QpCi0JCWlmIChmbWktPmMtPnViaSA9PSBkZXNjKSB7Ci0JCQlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IGZtaS0+YzsKLQotCQkJc3Bpbl91bmxvY2soJmZtaV9sb2NrKTsKLQkJCXJldHVybiBjOwotCQl9Ci0Jc3Bpbl91bmxvY2soJmZtaV9sb2NrKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBpbl9mYWlsdXJlX21vZGUoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IGRiZ19maW5kX2luZm8oZGVzYyk7Ci0KLQlpZiAoYyAmJiBkYmdfZmFpbHVyZV9tb2RlKQotCQlyZXR1cm4gYy0+ZGJnLT5mYWlsdXJlX21vZGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZG9fZmFpbChzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgaW50IHdyaXRlKQotewotCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gZGJnX2ZpbmRfaW5mbyhkZXNjKTsKLQlzdHJ1Y3QgdWJpZnNfZGVidWdfaW5mbyAqZDsKLQotCWlmICghYyB8fCAhZGJnX2ZhaWx1cmVfbW9kZSkKLQkJcmV0dXJuIDA7Ci0JZCA9IGMtPmRiZzsKLQlpZiAoZC0+ZmFpbHVyZV9tb2RlKQotCQlyZXR1cm4gMTsKLQlpZiAoIWQtPmZhaWxfY250KSB7Ci0JCS8qIEZpcnN0IGNhbGwgLSBkZWNpZGUgZGVsYXkgdG8gZmFpbHVyZSAqLworCWlmICghZC0+cGNfY250KSB7CisJCS8qIEZpcnN0IGNhbGwgLSBkZWNpZGUgZGVsYXkgdG8gdGhlIHBvd2VyIGN1dCAqLwogCQlpZiAoY2hhbmNlKDEsIDIpKSB7Ci0JCQl1bnNpZ25lZCBpbnQgZGVsYXkgPSAxIDw8IChzaW1wbGVfcmFuZCgpID4+IDExKTsKKwkJCXVuc2lnbmVkIGxvbmcgZGVsYXk7CiAKIAkJCWlmIChjaGFuY2UoMSwgMikpIHsKLQkJCQlkLT5mYWlsX2RlbGF5ID0gMTsKLQkJCQlkLT5mYWlsX3RpbWVvdXQgPSBqaWZmaWVzICsKLQkJCQkJCSAgbXNlY3NfdG9famlmZmllcyhkZWxheSk7Ci0JCQkJZGJnX3JjdnJ5KCJmYWlsaW5nIGFmdGVyICV1bXMiLCBkZWxheSk7CisJCQkJZC0+cGNfZGVsYXkgPSAxOworCQkJCS8qIEZhaWwgd2l0aGluZyAxIG1pbnV0ZSAqLworCQkJCWRlbGF5ID0gcmFuZG9tMzIoKSAlIDYwMDAwOworCQkJCWQtPnBjX3RpbWVvdXQgPSBqaWZmaWVzOworCQkJCWQtPnBjX3RpbWVvdXQgKz0gbXNlY3NfdG9famlmZmllcyhkZWxheSk7CisJCQkJdWJpZnNfd2FybigiZmFpbGluZyBhZnRlciAlbHVtcyIsIGRlbGF5KTsKIAkJCX0gZWxzZSB7Ci0JCQkJZC0+ZmFpbF9kZWxheSA9IDI7Ci0JCQkJZC0+ZmFpbF9jbnRfbWF4ID0gZGVsYXk7Ci0JCQkJZGJnX3JjdnJ5KCJmYWlsaW5nIGFmdGVyICV1IGNhbGxzIiwgZGVsYXkpOworCQkJCWQtPnBjX2RlbGF5ID0gMjsKKwkJCQlkZWxheSA9IHJhbmRvbTMyKCkgJSAxMDAwMDsKKwkJCQkvKiBGYWlsIHdpdGhpbiAxMDAwMCBvcGVyYXRpb25zICovCisJCQkJZC0+cGNfY250X21heCA9IGRlbGF5OworCQkJCXViaWZzX3dhcm4oImZhaWxpbmcgYWZ0ZXIgJWx1IGNhbGxzIiwgZGVsYXkpOwogCQkJfQogCQl9Ci0JCWQtPmZhaWxfY250ICs9IDE7CisKKwkJZC0+cGNfY250ICs9IDE7CiAJfQorCiAJLyogRGV0ZXJtaW5lIGlmIGZhaWx1cmUgZGVsYXkgaGFzIGV4cGlyZWQgKi8KLQlpZiAoZC0+ZmFpbF9kZWxheSA9PSAxKSB7Ci0JCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBkLT5mYWlsX3RpbWVvdXQpKQorCWlmIChkLT5wY19kZWxheSA9PSAxICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIGQtPnBjX3RpbWVvdXQpKQogCQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmIChkLT5mYWlsX2RlbGF5ID09IDIpCi0JCWlmIChkLT5mYWlsX2NudCsrIDwgZC0+ZmFpbF9jbnRfbWF4KQorCWlmIChkLT5wY19kZWxheSA9PSAyICYmIGQtPnBjX2NudCsrIDwgZC0+cGNfY250X21heCkKIAkJCXJldHVybiAwOworCiAJaWYgKGxudW0gPT0gVUJJRlNfU0JfTE5VTSkgewotCQlpZiAod3JpdGUpIHsKLQkJCWlmIChjaGFuY2UoMSwgMikpCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoY2hhbmNlKDE5LCAyMCkpCisJCWlmICh3cml0ZSAmJiBjaGFuY2UoMSwgMikpCiAJCQlyZXR1cm4gMDsKLQkJZGJnX3JjdnJ5KCJmYWlsaW5nIGluIHN1cGVyIGJsb2NrIExFQiAlZCIsIGxudW0pOworCQlpZiAoY2hhbmNlKDE5LCAyMCkpCisJCQlyZXR1cm4gMDsKKwkJdWJpZnNfd2FybigiZmFpbGluZyBpbiBzdXBlciBibG9jayBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKGxudW0gPT0gVUJJRlNfTVNUX0xOVU0gfHwgbG51bSA9PSBVQklGU19NU1RfTE5VTSArIDEpIHsKIAkJaWYgKGNoYW5jZSgxOSwgMjApKQogCQkJcmV0dXJuIDA7Ci0JCWRiZ19yY3ZyeSgiZmFpbGluZyBpbiBtYXN0ZXIgTEVCICVkIiwgbG51bSk7CisJCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gbWFzdGVyIExFQiAlZCIsIGxudW0pOwogCX0gZWxzZSBpZiAobG51bSA+PSBVQklGU19MT0dfTE5VTSAmJiBsbnVtIDw9IGMtPmxvZ19sYXN0KSB7Ci0JCWlmICh3cml0ZSkgewotCQkJaWYgKGNoYW5jZSg5OSwgMTAwKSkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChjaGFuY2UoMzk5LCA0MDApKQorCQlpZiAod3JpdGUgJiYgY2hhbmNlKDk5LCAxMDApKQogCQkJcmV0dXJuIDA7Ci0JCWRiZ19yY3ZyeSgiZmFpbGluZyBpbiBsb2cgTEVCICVkIiwgbG51bSk7CisJCWlmIChjaGFuY2UoMzk5LCA0MDApKQorCQkJcmV0dXJuIDA7CisJCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gbG9nIExFQiAlZCIsIGxudW0pOwogCX0gZWxzZSBpZiAobG51bSA+PSBjLT5scHRfZmlyc3QgJiYgbG51bSA8PSBjLT5scHRfbGFzdCkgewotCQlpZiAod3JpdGUpIHsKLQkJCWlmIChjaGFuY2UoNywgOCkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoY2hhbmNlKDE5LCAyMCkpCisJCWlmICh3cml0ZSAmJiBjaGFuY2UoNywgOCkpCiAJCQlyZXR1cm4gMDsKLQkJZGJnX3JjdnJ5KCJmYWlsaW5nIGluIExQVCBMRUIgJWQiLCBsbnVtKTsKKwkJaWYgKGNoYW5jZSgxOSwgMjApKQorCQkJcmV0dXJuIDA7CisJCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gTFBUIExFQiAlZCIsIGxudW0pOwogCX0gZWxzZSBpZiAobG51bSA+PSBjLT5vcnBoX2ZpcnN0ICYmIGxudW0gPD0gYy0+b3JwaF9sYXN0KSB7Ci0JCWlmICh3cml0ZSkgewotCQkJaWYgKGNoYW5jZSgxLCAyKSkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChjaGFuY2UoOSwgMTApKQorCQlpZiAod3JpdGUgJiYgY2hhbmNlKDEsIDIpKQogCQkJcmV0dXJuIDA7Ci0JCWRiZ19yY3ZyeSgiZmFpbGluZyBpbiBvcnBoYW4gTEVCICVkIiwgbG51bSk7CisJCWlmIChjaGFuY2UoOSwgMTApKQorCQkJcmV0dXJuIDA7CisJCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gb3JwaGFuIExFQiAlZCIsIGxudW0pOwogCX0gZWxzZSBpZiAobG51bSA9PSBjLT5paGVhZF9sbnVtKSB7CiAJCWlmIChjaGFuY2UoOTksIDEwMCkpCiAJCQlyZXR1cm4gMDsKLQkJZGJnX3JjdnJ5KCJmYWlsaW5nIGluIGluZGV4IGhlYWQgTEVCICVkIiwgbG51bSk7CisJCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gaW5kZXggaGVhZCBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKGMtPmpoZWFkcyAmJiBsbnVtID09IGMtPmpoZWFkc1tHQ0hEXS53YnVmLmxudW0pIHsKIAkJaWYgKGNoYW5jZSg5LCAxMCkpCiAJCQlyZXR1cm4gMDsKLQkJZGJnX3JjdnJ5KCJmYWlsaW5nIGluIEdDIGhlYWQgTEVCICVkIiwgbG51bSk7CisJCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gR0MgaGVhZCBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKHdyaXRlICYmICFSQl9FTVBUWV9ST09UKCZjLT5idWRzKSAmJgogCQkgICAhdWJpZnNfc2VhcmNoX2J1ZChjLCBsbnVtKSkgewogCQlpZiAoY2hhbmNlKDE5LCAyMCkpCiAJCQlyZXR1cm4gMDsKLQkJZGJnX3JjdnJ5KCJmYWlsaW5nIGluIG5vbi1idWQgTEVCICVkIiwgbG51bSk7CisJCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gbm9uLWJ1ZCBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKGMtPmNtdF9zdGF0ZSA9PSBDT01NSVRfUlVOTklOR19CQUNLR1JPVU5EIHx8CiAJCSAgIGMtPmNtdF9zdGF0ZSA9PSBDT01NSVRfUlVOTklOR19SRVFVSVJFRCkgewogCQlpZiAoY2hhbmNlKDk5OSwgMTAwMCkpCiAJCQlyZXR1cm4gMDsKLQkJZGJnX3JjdnJ5KCJmYWlsaW5nIGluIGJ1ZCBMRUIgJWQgY29tbWl0IHJ1bm5pbmciLCBsbnVtKTsKKwkJdWJpZnNfd2FybigiZmFpbGluZyBpbiBidWQgTEVCICVkIGNvbW1pdCBydW5uaW5nIiwgbG51bSk7CiAJfSBlbHNlIHsKIAkJaWYgKGNoYW5jZSg5OTk5LCAxMDAwMCkpCiAJCQlyZXR1cm4gMDsKLQkJZGJnX3JjdnJ5KCJmYWlsaW5nIGluIGJ1ZCBMRUIgJWQgY29tbWl0IG5vdCBydW5uaW5nIiwgbG51bSk7CisJCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gYnVkIExFQiAlZCBjb21taXQgbm90IHJ1bm5pbmciLCBsbnVtKTsKIAl9Ci0JdWJpZnNfZXJyKCIqKiogU0VUVElORyBGQUlMVVJFIE1PREUgT04gKExFQiAlZCkgKioqIiwgbG51bSk7Ci0JZC0+ZmFpbHVyZV9tb2RlID0gMTsKKworCWQtPnBjX2hhcHBlbmVkID0gMTsKKwl1Ymlmc193YXJuKCI9PT09PT09PT09IFBvd2VyIGN1dCBlbXVsYXRlZCA9PT09PT09PT09Iik7CiAJZHVtcF9zdGFjaygpOwogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBjdXRfZGF0YShjb25zdCB2b2lkICpidWYsIGludCBsZW4pCitzdGF0aWMgdm9pZCBjdXRfZGF0YShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaW50IGZsZW4sIGk7CisJdW5zaWduZWQgaW50IGZyb20sIHRvLCBpLCBmZnMgPSBjaGFuY2UoMSwgMik7CiAJdW5zaWduZWQgY2hhciAqcCA9ICh2b2lkICopYnVmOwogCi0JZmxlbiA9IChsZW4gKiAobG9uZyBsb25nKXNpbXBsZV9yYW5kKCkpID4+IDE1OwotCWZvciAoaSA9IGZsZW47IGkgPCBsZW47IGkrKykKLQkJcFtpXSA9IDB4ZmY7CisJZnJvbSA9IHJhbmRvbTMyKCkgJSAobGVuICsgMSk7CisJaWYgKGNoYW5jZSgxLCAyKSkKKwkJdG8gPSByYW5kb20zMigpICUgKGxlbiAtIGZyb20gKyAxKTsKKwllbHNlCisJCXRvID0gbGVuOworCisJaWYgKGZyb20gPCB0bykKKwkJdWJpZnNfd2FybigiZmlsbGVkIGJ5dGVzICV1LSV1IHdpdGggJXMiLCBmcm9tLCB0byAtIDEsCisJCQkgICBmZnMgPyAiMHhGRnMiIDogInJhbmRvbSBkYXRhIik7CisKKwlpZiAoZmZzKQorCQlmb3IgKGkgPSBmcm9tOyBpIDwgdG87IGkrKykKKwkJCXBbaV0gPSAweEZGOworCWVsc2UKKwkJZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyspCisJCQlwW2ldID0gcmFuZG9tMzIoKSAlIDB4MTAwOwogfQogCi1pbnQgZGJnX2xlYl9yZWFkKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtLCBjaGFyICpidWYsIGludCBvZmZzZXQsCi0JCSBpbnQgbGVuLCBpbnQgY2hlY2spCi17Ci0JaWYgKGluX2ZhaWx1cmVfbW9kZShkZXNjKSkKLQkJcmV0dXJuIC1FUk9GUzsKLQlyZXR1cm4gdWJpX2xlYl9yZWFkKGRlc2MsIGxudW0sIGJ1Ziwgb2Zmc2V0LCBsZW4sIGNoZWNrKTsKLX0KLQotaW50IGRiZ19sZWJfd3JpdGUoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJICBpbnQgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgZHR5cGUpCitpbnQgZGJnX2xlYl93cml0ZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJICBpbnQgb2ZmcywgaW50IGxlbiwgaW50IGR0eXBlKQogewogCWludCBlcnIsIGZhaWxpbmc7CiAKLQlpZiAoaW5fZmFpbHVyZV9tb2RlKGRlc2MpKQorCWlmIChjLT5kYmctPnBjX2hhcHBlbmVkKQogCQlyZXR1cm4gLUVST0ZTOwotCWZhaWxpbmcgPSBkb19mYWlsKGRlc2MsIGxudW0sIDEpOworCisJZmFpbGluZyA9IHBvd2VyX2N1dF9lbXVsYXRlZChjLCBsbnVtLCAxKTsKIAlpZiAoZmFpbGluZykKIAkJY3V0X2RhdGEoYnVmLCBsZW4pOwotCWVyciA9IHViaV9sZWJfd3JpdGUoZGVzYywgbG51bSwgYnVmLCBvZmZzZXQsIGxlbiwgZHR5cGUpOworCWVyciA9IHViaV9sZWJfd3JpdGUoYy0+dWJpLCBsbnVtLCBidWYsIG9mZnMsIGxlbiwgZHR5cGUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJaWYgKGZhaWxpbmcpCkBAIC0yNzA2LDE2MiArMjY3OCwyMDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRiZ19sZWJfY2hhbmdlKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsCitpbnQgZGJnX2xlYl9jaGFuZ2Uoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsCiAJCSAgIGludCBsZW4sIGludCBkdHlwZSkKIHsKIAlpbnQgZXJyOwogCi0JaWYgKGRvX2ZhaWwoZGVzYywgbG51bSwgMSkpCisJaWYgKGMtPmRiZy0+cGNfaGFwcGVuZWQpCiAJCXJldHVybiAtRVJPRlM7Ci0JZXJyID0gdWJpX2xlYl9jaGFuZ2UoZGVzYywgbG51bSwgYnVmLCBsZW4sIGR0eXBlKTsKKwlpZiAocG93ZXJfY3V0X2VtdWxhdGVkKGMsIGxudW0sIDEpKQorCQlyZXR1cm4gLUVST0ZTOworCWVyciA9IHViaV9sZWJfY2hhbmdlKGMtPnViaSwgbG51bSwgYnVmLCBsZW4sIGR0eXBlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWlmIChkb19mYWlsKGRlc2MsIGxudW0sIDEpKQorCWlmIChwb3dlcl9jdXRfZW11bGF0ZWQoYywgbG51bSwgMSkpCiAJCXJldHVybiAtRVJPRlM7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBkYmdfbGViX2VyYXNlKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKQoraW50IGRiZ19sZWJfdW5tYXAoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtKQogewogCWludCBlcnI7CiAKLQlpZiAoZG9fZmFpbChkZXNjLCBsbnVtLCAwKSkKKwlpZiAoYy0+ZGJnLT5wY19oYXBwZW5lZCkKIAkJcmV0dXJuIC1FUk9GUzsKLQllcnIgPSB1YmlfbGViX2VyYXNlKGRlc2MsIGxudW0pOworCWlmIChwb3dlcl9jdXRfZW11bGF0ZWQoYywgbG51bSwgMCkpCisJCXJldHVybiAtRVJPRlM7CisJZXJyID0gdWJpX2xlYl91bm1hcChjLT51YmksIGxudW0pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JaWYgKGRvX2ZhaWwoZGVzYywgbG51bSwgMCkpCisJaWYgKHBvd2VyX2N1dF9lbXVsYXRlZChjLCBsbnVtLCAwKSkKIAkJcmV0dXJuIC1FUk9GUzsKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRiZ19sZWJfdW5tYXAoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0pCitpbnQgZGJnX2xlYl9tYXAoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBpbnQgZHR5cGUpCiB7CiAJaW50IGVycjsKIAotCWlmIChkb19mYWlsKGRlc2MsIGxudW0sIDApKQorCWlmIChjLT5kYmctPnBjX2hhcHBlbmVkKQogCQlyZXR1cm4gLUVST0ZTOwotCWVyciA9IHViaV9sZWJfdW5tYXAoZGVzYywgbG51bSk7CisJaWYgKHBvd2VyX2N1dF9lbXVsYXRlZChjLCBsbnVtLCAwKSkKKwkJcmV0dXJuIC1FUk9GUzsKKwllcnIgPSB1YmlfbGViX21hcChjLT51YmksIGxudW0sIGR0eXBlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWlmIChkb19mYWlsKGRlc2MsIGxudW0sIDApKQorCWlmIChwb3dlcl9jdXRfZW11bGF0ZWQoYywgbG51bSwgMCkpCiAJCXJldHVybiAtRVJPRlM7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBkYmdfaXNfbWFwcGVkKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKQotewotCWlmIChpbl9mYWlsdXJlX21vZGUoZGVzYykpCi0JCXJldHVybiAtRVJPRlM7Ci0JcmV0dXJuIHViaV9pc19tYXBwZWQoZGVzYywgbG51bSk7Ci19Ci0KLWludCBkYmdfbGViX21hcChzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgaW50IGR0eXBlKQotewotCWludCBlcnI7Ci0KLQlpZiAoZG9fZmFpbChkZXNjLCBsbnVtLCAwKSkKLQkJcmV0dXJuIC1FUk9GUzsKLQllcnIgPSB1YmlfbGViX21hcChkZXNjLCBsbnVtLCBkdHlwZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQlpZiAoZG9fZmFpbChkZXNjLCBsbnVtLCAwKSkKLQkJcmV0dXJuIC1FUk9GUzsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB1Ymlmc19kZWJ1Z2dpbmdfaW5pdCAtIGluaXRpYWxpemUgVUJJRlMgZGVidWdnaW5nLgotICogQGM6IFVCSUZTIGZpbGUtc3lzdGVtIGRlc2NyaXB0aW9uIG9iamVjdAotICoKLSAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgZGVidWdnaW5nLXJlbGF0ZWQgZGF0YSBmb3IgdGhlIGZpbGUgc3lzdGVtLgotICogUmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YKLSAqIGZhaWx1cmUuCi0gKi8KLWludCB1Ymlmc19kZWJ1Z2dpbmdfaW5pdChzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKLXsKLQljLT5kYmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpZnNfZGVidWdfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghYy0+ZGJnKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZhaWx1cmVfbW9kZV9pbml0KGMpOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHViaWZzX2RlYnVnZ2luZ19leGl0IC0gZnJlZSBkZWJ1Z2dpbmcgZGF0YS4KLSAqIEBjOiBVQklGUyBmaWxlLXN5c3RlbSBkZXNjcmlwdGlvbiBvYmplY3QKLSAqLwotdm9pZCB1Ymlmc19kZWJ1Z2dpbmdfZXhpdChzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKLXsKLQlmYWlsdXJlX21vZGVfZXhpdChjKTsKLQlrZnJlZShjLT5kYmcpOwotfQotCiAvKgogICogUm9vdCBkaXJlY3RvcnkgZm9yIFVCSUZTIHN0dWZmIGluIGRlYnVnZnMuIENvbnRhaW5zIHN1Yi1kaXJlY3RvcmllcyB3aGljaAogICogY29udGFpbiB0aGUgc3R1ZmYgc3BlY2lmaWMgdG8gcGFydGljdWxhciBmaWxlLXN5c3RlbSBtb3VudHMuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZnNfcm9vdGRpcjsKIAotLyoqCi0gKiBkYmdfZGVidWdmc19pbml0IC0gaW5pdGlhbGl6ZSBkZWJ1Z2ZzIGZpbGUtc3lzdGVtLgotICoKLSAqIFVCSUZTIHVzZXMgZGVidWdmcyBmaWxlLXN5c3RlbSB0byBleHBvc2UgdmFyaW91cyBkZWJ1Z2dpbmcga25vYnMgdG8KLSAqIHVzZXItc3BhY2UuIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyAidWJpZnMiIGRpcmVjdG9yeSBpbiB0aGUgZGVidWdmcwotICogZmlsZS1zeXN0ZW0uIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgotICogY2FzZSBvZiBmYWlsdXJlLgotICovCi1pbnQgZGJnX2RlYnVnZnNfaW5pdCh2b2lkKQotewotCWRmc19yb290ZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ1YmlmcyIsIE5VTEwpOwotCWlmIChJU19FUlIoZGZzX3Jvb3RkaXIpKSB7Ci0JCWludCBlcnIgPSBQVFJfRVJSKGRmc19yb290ZGlyKTsKLQkJdWJpZnNfZXJyKCJjYW5ub3QgY3JlYXRlIFwidWJpZnNcIiBkZWJ1Z2ZzIGRpcmVjdG9yeSwgIgotCQkJICAiZXJyb3IgJWRcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZGJnX2RlYnVnZnNfZXhpdCAtIHJlbW92ZSB0aGUgInViaWZzIiBkaXJlY3RvcnkgZnJvbSBkZWJ1Z2ZzIGZpbGUtc3lzdGVtLgotICovCi12b2lkIGRiZ19kZWJ1Z2ZzX2V4aXQodm9pZCkKLXsKLQlkZWJ1Z2ZzX3JlbW92ZShkZnNfcm9vdGRpcik7Ci19Ci0KLXN0YXRpYyBpbnQgb3Blbl9kZWJ1Z2ZzX2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGRmc19maWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKIAlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHdyaXRlX2RlYnVnZnNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorLyoqCisgKiBwcm92aWRlX3VzZXJfb3V0cHV0IC0gcHJvdmlkZSBvdXRwdXQgdG8gdGhlIHVzZXIgcmVhZGluZyBhIGRlYnVnZnMgZmlsZS4KKyAqIEB2YWw6IGJvb2xlYW4gdmFsdWUgZm9yIHRoZSBhbnN3ZXIKKyAqIEB1OiB0aGUgYnVmZmVyIHRvIHN0b3JlIHRoZSBhbnN3ZXIgYXQKKyAqIEBjb3VudDogc2l6ZSBvZiB0aGUgYnVmZmVyCisgKiBAcHBvczogcG9zaXRpb24gaW4gdGhlIEB1IG91dHB1dCBidWZmZXIKKyAqCisgKiBUaGlzIGlzIGEgc2ltcGxlIGhlbHBlciBmdW5jdGlvbiB3aGljaCBzdG9yZXMgQHZhbCBib29sZWFuIHZhbHVlIGluIHRoZSB1c2VyCisgKiBidWZmZXIgd2hlbiB0aGUgdXNlciByZWFkcyBvbmUgb2YgVUJJRlMgZGVidWdmcyBmaWxlcy4gUmV0dXJucyBhbW91bnQgb2YKKyAqIGJ5dGVzIHdyaXR0ZW4gdG8gQHUgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZgorICogZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBwcm92aWRlX3VzZXJfb3V0cHV0KGludCB2YWwsIGNoYXIgX191c2VyICp1LCBzaXplX3QgY291bnQsCisJCQkgICAgICAgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzNdOworCisJaWYgKHZhbCkKKwkJYnVmWzBdID0gJzEnOworCWVsc2UKKwkJYnVmWzBdID0gJzAnOworCWJ1ZlsxXSA9ICdcbic7CisJYnVmWzJdID0gMHgwMDsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1LCBjb3VudCwgcHBvcywgYnVmLCAyKTsKK30KKworc3RhdGljIHNzaXplX3QgZGZzX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnUsIHNpemVfdCBjb3VudCwKKwkJCSAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnQgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1Ymlmc19kZWJ1Z19pbmZvICpkID0gYy0+ZGJnOworCWludCB2YWw7CisKKwlpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2dlbikKKwkJdmFsID0gZC0+Y2hrX2dlbjsKKwllbHNlIGlmIChkZW50ID09IGQtPmRmc19jaGtfaW5kZXgpCisJCXZhbCA9IGQtPmNoa19pbmRleDsKKwllbHNlIGlmIChkZW50ID09IGQtPmRmc19jaGtfb3JwaCkKKwkJdmFsID0gZC0+Y2hrX29ycGg7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2xwcm9wcykKKwkJdmFsID0gZC0+Y2hrX2xwcm9wczsKKwllbHNlIGlmIChkZW50ID09IGQtPmRmc19jaGtfZnMpCisJCXZhbCA9IGQtPmNoa19mczsKKwllbHNlIGlmIChkZW50ID09IGQtPmRmc190c3RfcmN2cnkpCisJCXZhbCA9IGQtPnRzdF9yY3ZyeTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHByb3ZpZGVfdXNlcl9vdXRwdXQodmFsLCB1LCBjb3VudCwgcHBvcyk7Cit9CisKKy8qKgorICogaW50ZXJwcmV0X3VzZXJfaW5wdXQgLSBpbnRlcnByZXQgdXNlciBkZWJ1Z2ZzIGZpbGUgaW5wdXQuCisgKiBAdTogdXNlci1wcm92aWRlZCBidWZmZXIgd2l0aCB0aGUgaW5wdXQKKyAqIEBjb3VudDogYnVmZmVyIHNpemUKKyAqCisgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIGludGVycHJldCB1c2VyIGlucHV0IHRvIGEgYm9vbGVhbiBVQklGUworICogZGVidWdmcyBmaWxlLiBSZXR1cm5zICUwIG9yICUxIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKiBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaW50ZXJwcmV0X3VzZXJfaW5wdXQoY29uc3QgY2hhciBfX3VzZXIgKnUsIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgYnVmX3NpemU7CisJY2hhciBidWZbOF07CisKKwlidWZfc2l6ZSA9IG1pbl90KHNpemVfdCwgY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1LCBidWZfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGJ1ZlswXSA9PSAnMScpCisJCXJldHVybiAxOworCWVsc2UgaWYgKGJ1ZlswXSA9PSAnMCcpCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRmc19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdSwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB1Ymlmc19kZWJ1Z19pbmZvICpkID0gYy0+ZGJnOworCXN0cnVjdCBkZW50cnkgKmRlbnQgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCWludCB2YWw7CiAKLQlpZiAoZmlsZS0+Zl9wYXRoLmRlbnRyeSA9PSBkLT5kZnNfZHVtcF9scHJvcHMpCisJLyoKKwkgKiBUT0RPOiB0aGlzIGlzIHJhY3kgLSB0aGUgZmlsZS1zeXN0ZW0gbWlnaHQgaGF2ZSBhbHJlYWR5IGJlZW4KKwkgKiB1bm1vdW50ZWQgYW5kIHdlJ2Qgb29wcyBpbiB0aGlzIGNhc2UuIFRoZSBwbGFuIGlzIHRvIGZpeCBpdCB3aXRoCisJICogaGVscCBvZiAnaXRlcmF0ZV9zdXBlcnNfdHlwZSgpJyB3aGljaCB3ZSBzaG91bGQgaGF2ZSBpbiB2My4wOiB3aGVuCisJICogYSBkZWJ1Z2ZzIG9wZW5lZCwgd2UgcmVtYmVyIEZTJ3MgVVVJRCBpbiBmaWxlLT5wcml2YXRlX2RhdGEuIFRoZW4KKwkgKiB3aGVuZXZlciB3ZSBhY2Nlc3MgdGhlIEZTIHZpYSBhIGRlYnVnZnMgZmlsZSwgd2UgaXRlcmF0ZSBhbGwgVUJJRlMKKwkgKiBzdXBlcmJsb2NrcyBhbmQgZmluZSB0aGUgb25lIHdpdGggdGhlIHNhbWUgVVVJRCwgYW5kIHRha2UgdGhlCisJICogbG9ja2luZyByaWdodC4KKwkgKgorCSAqIFRoZSBvdGhlciB3YXkgdG8gZ28gc3VnZ2VzdGVkIGJ5IEFsIFZpcm8gaXMgdG8gY3JlYXRlIGEgc2VwYXJhdGUKKwkgKiAndWJpZnMtZGVidWcnIGZpbGUtc3lzdGVtIGluc3RlYWQuCisJICovCisJaWYgKGZpbGUtPmZfcGF0aC5kZW50cnkgPT0gZC0+ZGZzX2R1bXBfbHByb3BzKSB7CiAJCWRiZ19kdW1wX2xwcm9wcyhjKTsKLQllbHNlIGlmIChmaWxlLT5mX3BhdGguZGVudHJ5ID09IGQtPmRmc19kdW1wX2J1ZGcpCisJCXJldHVybiBjb3VudDsKKwl9CisJaWYgKGZpbGUtPmZfcGF0aC5kZW50cnkgPT0gZC0+ZGZzX2R1bXBfYnVkZykgewogCQlkYmdfZHVtcF9idWRnKGMsICZjLT5iaSk7Ci0JZWxzZSBpZiAoZmlsZS0+Zl9wYXRoLmRlbnRyeSA9PSBkLT5kZnNfZHVtcF90bmMpIHsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlpZiAoZmlsZS0+Zl9wYXRoLmRlbnRyeSA9PSBkLT5kZnNfZHVtcF90bmMpIHsKIAkJbXV0ZXhfbG9jaygmYy0+dG5jX211dGV4KTsKIAkJZGJnX2R1bXBfdG5jKGMpOwogCQltdXRleF91bmxvY2soJmMtPnRuY19tdXRleCk7Ci0JfSBlbHNlCisJCXJldHVybiBjb3VudDsKKwl9CisKKwl2YWwgPSBpbnRlcnByZXRfdXNlcl9pbnB1dCh1LCBjb3VudCk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiB2YWw7CisKKwlpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2dlbikKKwkJZC0+Y2hrX2dlbiA9IHZhbDsKKwllbHNlIGlmIChkZW50ID09IGQtPmRmc19jaGtfaW5kZXgpCisJCWQtPmNoa19pbmRleCA9IHZhbDsKKwllbHNlIGlmIChkZW50ID09IGQtPmRmc19jaGtfb3JwaCkKKwkJZC0+Y2hrX29ycGggPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2xwcm9wcykKKwkJZC0+Y2hrX2xwcm9wcyA9IHZhbDsKKwllbHNlIGlmIChkZW50ID09IGQtPmRmc19jaGtfZnMpCisJCWQtPmNoa19mcyA9IHZhbDsKKwllbHNlIGlmIChkZW50ID09IGQtPmRmc190c3RfcmN2cnkpCisJCWQtPnRzdF9yY3ZyeSA9IHZhbDsKKwllbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZnNfZm9wcyA9IHsKLQkub3BlbiA9IG9wZW5fZGVidWdmc19maWxlLAotCS53cml0ZSA9IHdyaXRlX2RlYnVnZnNfZmlsZSwKKwkub3BlbiA9IGRmc19maWxlX29wZW4sCisJLnJlYWQgPSBkZnNfZmlsZV9yZWFkLAorCS53cml0ZSA9IGRmc19maWxlX3dyaXRlLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5sbHNlZWsgPSBub19sbHNlZWssCiB9OwpAQCAtMjg4MCwxMiArMjg5NywyMCBAQAogICovCiBpbnQgZGJnX2RlYnVnZnNfaW5pdF9mcyhzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKIHsKLQlpbnQgZXJyOworCWludCBlcnIsIG47CiAJY29uc3QgY2hhciAqZm5hbWU7CiAJc3RydWN0IGRlbnRyeSAqZGVudDsKIAlzdHJ1Y3QgdWJpZnNfZGVidWdfaW5mbyAqZCA9IGMtPmRiZzsKIAotCXNwcmludGYoZC0+ZGZzX2Rpcl9uYW1lLCAidWJpJWRfJWQiLCBjLT52aS51YmlfbnVtLCBjLT52aS52b2xfaWQpOworCW4gPSBzbnByaW50ZihkLT5kZnNfZGlyX25hbWUsIFVCSUZTX0RGU19ESVJfTEVOICsgMSwgVUJJRlNfREZTX0RJUl9OQU1FLAorCQkgICAgIGMtPnZpLnViaV9udW0sIGMtPnZpLnZvbF9pZCk7CisJaWYgKG4gPT0gVUJJRlNfREZTX0RJUl9MRU4pIHsKKwkJLyogVGhlIGFycmF5IHNpemUgaXMgdG9vIHNtYWxsICovCisJCWZuYW1lID0gVUJJRlNfREZTX0RJUl9OQU1FOworCQlkZW50ID0gRVJSX1BUUigtRUlOVkFMKTsKKwkJZ290byBvdXQ7CisJfQorCiAJZm5hbWUgPSBkLT5kZnNfZGlyX25hbWU7CiAJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2RpcihmbmFtZSwgZGZzX3Jvb3RkaXIpOwogCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKQEAgLTI5MTAsMTMgKzI5MzUsNTUgQEAKIAkJZ290byBvdXRfcmVtb3ZlOwogCWQtPmRmc19kdW1wX3RuYyA9IGRlbnQ7CiAKKwlmbmFtZSA9ICJjaGtfZ2VuZXJhbCI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkLT5kZnNfZGlyLCBjLAorCQkJCSAgICZkZnNfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZC0+ZGZzX2Noa19nZW4gPSBkZW50OworCisJZm5hbWUgPSAiY2hrX2luZGV4IjsKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShmbmFtZSwgU19JUlVTUiB8IFNfSVdVU1IsIGQtPmRmc19kaXIsIGMsCisJCQkJICAgJmRmc19mb3BzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0X3JlbW92ZTsKKwlkLT5kZnNfY2hrX2luZGV4ID0gZGVudDsKKworCWZuYW1lID0gImNoa19vcnBoYW5zIjsKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShmbmFtZSwgU19JUlVTUiB8IFNfSVdVU1IsIGQtPmRmc19kaXIsIGMsCisJCQkJICAgJmRmc19mb3BzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0X3JlbW92ZTsKKwlkLT5kZnNfY2hrX29ycGggPSBkZW50OworCisJZm5hbWUgPSAiY2hrX2xwcm9wcyI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkLT5kZnNfZGlyLCBjLAorCQkJCSAgICZkZnNfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZC0+ZGZzX2Noa19scHJvcHMgPSBkZW50OworCisJZm5hbWUgPSAiY2hrX2ZzIjsKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShmbmFtZSwgU19JUlVTUiB8IFNfSVdVU1IsIGQtPmRmc19kaXIsIGMsCisJCQkJICAgJmRmc19mb3BzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0X3JlbW92ZTsKKwlkLT5kZnNfY2hrX2ZzID0gZGVudDsKKworCWZuYW1lID0gInRzdF9yZWNvdmVyeSI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkLT5kZnNfZGlyLCBjLAorCQkJCSAgICZkZnNfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZC0+ZGZzX3RzdF9yY3ZyeSA9IGRlbnQ7CisKIAlyZXR1cm4gMDsKIAogb3V0X3JlbW92ZToKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZC0+ZGZzX2Rpcik7CiBvdXQ6CiAJZXJyID0gZGVudCA/IFBUUl9FUlIoZGVudCkgOiAtRU5PREVWOwotCXViaWZzX2VycigiY2Fubm90IGNyZWF0ZSBcIiVzXCIgZGVidWdmcyBkaXJlY3RvcnksIGVycm9yICVkXG4iLAorCXViaWZzX2VycigiY2Fubm90IGNyZWF0ZSBcIiVzXCIgZGVidWdmcyBmaWxlIG9yIGRpcmVjdG9yeSwgZXJyb3IgJWRcbiIsCiAJCSAgZm5hbWUsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTI5MzAsNCArMjk5NywxNzkgQEAKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYy0+ZGJnLT5kZnNfZGlyKTsKIH0KIAorc3RydWN0IHViaWZzX2dsb2JhbF9kZWJ1Z19pbmZvIHViaWZzX2RiZzsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRmc19jaGtfZ2VuOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRmc19jaGtfaW5kZXg7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGZzX2Noa19vcnBoOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRmc19jaGtfbHByb3BzOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRmc19jaGtfZnM7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGZzX3RzdF9yY3ZyeTsKKworc3RhdGljIHNzaXplX3QgZGZzX2dsb2JhbF9maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1LAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKKwlpbnQgdmFsOworCisJaWYgKGRlbnQgPT0gZGZzX2Noa19nZW4pCisJCXZhbCA9IHViaWZzX2RiZy5jaGtfZ2VuOworCWVsc2UgaWYgKGRlbnQgPT0gZGZzX2Noa19pbmRleCkKKwkJdmFsID0gdWJpZnNfZGJnLmNoa19pbmRleDsKKwllbHNlIGlmIChkZW50ID09IGRmc19jaGtfb3JwaCkKKwkJdmFsID0gdWJpZnNfZGJnLmNoa19vcnBoOworCWVsc2UgaWYgKGRlbnQgPT0gZGZzX2Noa19scHJvcHMpCisJCXZhbCA9IHViaWZzX2RiZy5jaGtfbHByb3BzOworCWVsc2UgaWYgKGRlbnQgPT0gZGZzX2Noa19mcykKKwkJdmFsID0gdWJpZnNfZGJnLmNoa19mczsKKwllbHNlIGlmIChkZW50ID09IGRmc190c3RfcmN2cnkpCisJCXZhbCA9IHViaWZzX2RiZy50c3RfcmN2cnk7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBwcm92aWRlX3VzZXJfb3V0cHV0KHZhbCwgdSwgY291bnQsIHBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdCBkZnNfZ2xvYmFsX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1LAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudCA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CisJaW50IHZhbDsKKworCXZhbCA9IGludGVycHJldF91c2VyX2lucHV0KHUsIGNvdW50KTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIHZhbDsKKworCWlmIChkZW50ID09IGRmc19jaGtfZ2VuKQorCQl1Ymlmc19kYmcuY2hrX2dlbiA9IHZhbDsKKwllbHNlIGlmIChkZW50ID09IGRmc19jaGtfaW5kZXgpCisJCXViaWZzX2RiZy5jaGtfaW5kZXggPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkZnNfY2hrX29ycGgpCisJCXViaWZzX2RiZy5jaGtfb3JwaCA9IHZhbDsKKwllbHNlIGlmIChkZW50ID09IGRmc19jaGtfbHByb3BzKQorCQl1Ymlmc19kYmcuY2hrX2xwcm9wcyA9IHZhbDsKKwllbHNlIGlmIChkZW50ID09IGRmc19jaGtfZnMpCisJCXViaWZzX2RiZy5jaGtfZnMgPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkZnNfdHN0X3JjdnJ5KQorCQl1Ymlmc19kYmcudHN0X3JjdnJ5ID0gdmFsOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRmc19nbG9iYWxfZm9wcyA9IHsKKwkucmVhZCA9IGRmc19nbG9iYWxfZmlsZV9yZWFkLAorCS53cml0ZSA9IGRmc19nbG9iYWxfZmlsZV93cml0ZSwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorfTsKKworLyoqCisgKiBkYmdfZGVidWdmc19pbml0IC0gaW5pdGlhbGl6ZSBkZWJ1Z2ZzIGZpbGUtc3lzdGVtLgorICoKKyAqIFVCSUZTIHVzZXMgZGVidWdmcyBmaWxlLXN5c3RlbSB0byBleHBvc2UgdmFyaW91cyBkZWJ1Z2dpbmcga25vYnMgdG8KKyAqIHVzZXItc3BhY2UuIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyAidWJpZnMiIGRpcmVjdG9yeSBpbiB0aGUgZGVidWdmcworICogZmlsZS1zeXN0ZW0uIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgorICogY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgZGJnX2RlYnVnZnNfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisJY29uc3QgY2hhciAqZm5hbWU7CisJc3RydWN0IGRlbnRyeSAqZGVudDsKKworCWZuYW1lID0gInViaWZzIjsKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZGlyKGZuYW1lLCBOVUxMKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0OworCWRmc19yb290ZGlyID0gZGVudDsKKworCWZuYW1lID0gImNoa19nZW5lcmFsIjsKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShmbmFtZSwgU19JUlVTUiB8IFNfSVdVU1IsIGRmc19yb290ZGlyLCBOVUxMLAorCQkJCSAgICZkZnNfZ2xvYmFsX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBvdXRfcmVtb3ZlOworCWRmc19jaGtfZ2VuID0gZGVudDsKKworCWZuYW1lID0gImNoa19pbmRleCI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkZnNfcm9vdGRpciwgTlVMTCwKKwkJCQkgICAmZGZzX2dsb2JhbF9mb3BzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0X3JlbW92ZTsKKwlkZnNfY2hrX2luZGV4ID0gZGVudDsKKworCWZuYW1lID0gImNoa19vcnBoYW5zIjsKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShmbmFtZSwgU19JUlVTUiB8IFNfSVdVU1IsIGRmc19yb290ZGlyLCBOVUxMLAorCQkJCSAgICZkZnNfZ2xvYmFsX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBvdXRfcmVtb3ZlOworCWRmc19jaGtfb3JwaCA9IGRlbnQ7CisKKwlmbmFtZSA9ICJjaGtfbHByb3BzIjsKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShmbmFtZSwgU19JUlVTUiB8IFNfSVdVU1IsIGRmc19yb290ZGlyLCBOVUxMLAorCQkJCSAgICZkZnNfZ2xvYmFsX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBvdXRfcmVtb3ZlOworCWRmc19jaGtfbHByb3BzID0gZGVudDsKKworCWZuYW1lID0gImNoa19mcyI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkZnNfcm9vdGRpciwgTlVMTCwKKwkJCQkgICAmZGZzX2dsb2JhbF9mb3BzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0X3JlbW92ZTsKKwlkZnNfY2hrX2ZzID0gZGVudDsKKworCWZuYW1lID0gInRzdF9yZWNvdmVyeSI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVJVU1IgfCBTX0lXVVNSLCBkZnNfcm9vdGRpciwgTlVMTCwKKwkJCQkgICAmZGZzX2dsb2JhbF9mb3BzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gb3V0X3JlbW92ZTsKKwlkZnNfdHN0X3JjdnJ5ID0gZGVudDsKKworCXJldHVybiAwOworCitvdXRfcmVtb3ZlOgorCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkZnNfcm9vdGRpcik7CitvdXQ6CisJZXJyID0gZGVudCA/IFBUUl9FUlIoZGVudCkgOiAtRU5PREVWOworCXViaWZzX2VycigiY2Fubm90IGNyZWF0ZSBcIiVzXCIgZGVidWdmcyBmaWxlIG9yIGRpcmVjdG9yeSwgZXJyb3IgJWRcbiIsCisJCSAgZm5hbWUsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBkYmdfZGVidWdmc19leGl0IC0gcmVtb3ZlIHRoZSAidWJpZnMiIGRpcmVjdG9yeSBmcm9tIGRlYnVnZnMgZmlsZS1zeXN0ZW0uCisgKi8KK3ZvaWQgZGJnX2RlYnVnZnNfZXhpdCh2b2lkKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkZnNfcm9vdGRpcik7Cit9CisKKy8qKgorICogdWJpZnNfZGVidWdnaW5nX2luaXQgLSBpbml0aWFsaXplIFVCSUZTIGRlYnVnZ2luZy4KKyAqIEBjOiBVQklGUyBmaWxlLXN5c3RlbSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGRlYnVnZ2luZy1yZWxhdGVkIGRhdGEgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKyAqIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mCisgKiBmYWlsdXJlLgorICovCitpbnQgdWJpZnNfZGVidWdnaW5nX2luaXQoc3RydWN0IHViaWZzX2luZm8gKmMpCit7CisJYy0+ZGJnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHViaWZzX2RlYnVnX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWMtPmRiZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB1Ymlmc19kZWJ1Z2dpbmdfZXhpdCAtIGZyZWUgZGVidWdnaW5nIGRhdGEuCisgKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0CisgKi8KK3ZvaWQgdWJpZnNfZGVidWdnaW5nX2V4aXQoc3RydWN0IHViaWZzX2luZm8gKmMpCit7CisJa2ZyZWUoYy0+ZGJnKTsKK30KKwogI2VuZGlmIC8qIENPTkZJR19VQklGU19GU19ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvZGVidWcuaCBiL2ZzL3ViaWZzL2RlYnVnLmgKaW5kZXggYTgxMWFjNC4uNDUxNzRiNSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvZGVidWcuaAorKysgYi9mcy91Ymlmcy9kZWJ1Zy5oCkBAIC0zMSwxOCArMzEsMjUgQEAKIAogI2lmZGVmIENPTkZJR19VQklGU19GU19ERUJVRwogCi0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisvKgorICogVGhlIFVCSUZTIGRlYnVnZnMgZGlyZWN0b3J5IG5hbWUgcGF0dGVybiBhbmQgbWF4aW11bSBuYW1lIGxlbmd0aCAoMyBmb3IgInViaSIKKyAqICsgMSBmb3IgIl8iIGFuZCBwbHVzIDJ4MiBmb3IgMiBVQkkgbnVtYmVycyBhbmQgMSBmb3IgdGhlIHRyYWlsaW5nIHplcm8gYnl0ZS4KKyAqLworI2RlZmluZSBVQklGU19ERlNfRElSX05BTUUgInViaSVkXyVkIgorI2RlZmluZSBVQklGU19ERlNfRElSX0xFTiAgKDMgKyAxICsgMioyICsgMSkKIAogLyoqCiAgKiB1Ymlmc19kZWJ1Z19pbmZvIC0gcGVyLUZTIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KICAqIEBvbGRfenJvb3Q6IG9sZCBpbmRleCByb290IC0gdXNlZCBieSAnZGJnX2NoZWNrX29sZF9pbmRleCgpJwogICogQG9sZF96cm9vdF9sZXZlbDogb2xkIGluZGV4IHJvb3QgbGV2ZWwgLSB1c2VkIGJ5ICdkYmdfY2hlY2tfb2xkX2luZGV4KCknCiAgKiBAb2xkX3pyb290X3NxbnVtOiBvbGQgaW5kZXggcm9vdCBzcW51bSAtIHVzZWQgYnkgJ2RiZ19jaGVja19vbGRfaW5kZXgoKScKLSAqIEBmYWlsdXJlX21vZGU6IGZhaWx1cmUgbW9kZSBmb3IgcmVjb3ZlcnkgdGVzdGluZwotICogQGZhaWxfZGVsYXk6IDA9PmRvbid0IGRlbGF5LCAxPT5kZWxheSBhIHRpbWUsIDI9PmRlbGF5IGEgbnVtYmVyIG9mIGNhbGxzCi0gKiBAZmFpbF90aW1lb3V0OiB0aW1lIGluIGppZmZpZXMgd2hlbiBkZWxheSBvZiBmYWlsdXJlIG1vZGUgZXhwaXJlcwotICogQGZhaWxfY250OiBjdXJyZW50IG51bWJlciBvZiBjYWxscyB0byBmYWlsdXJlIG1vZGUgSS9PIGZ1bmN0aW9ucwotICogQGZhaWxfY250X21heDogbnVtYmVyIG9mIGNhbGxzIGJ5IHdoaWNoIHRvIGRlbGF5IGZhaWx1cmUgbW9kZQorICoKKyAqIEBwY19oYXBwZW5lZDogbm9uLXplcm8gaWYgYW4gZW11bGF0ZWQgcG93ZXIgY3V0IGhhcHBlbmVkCisgKiBAcGNfZGVsYXk6IDA9PmRvbid0IGRlbGF5LCAxPT5kZWxheSBhIHRpbWUsIDI9PmRlbGF5IGEgbnVtYmVyIG9mIGNhbGxzCisgKiBAcGNfdGltZW91dDogdGltZSBpbiBqaWZmaWVzIHdoZW4gZGVsYXkgb2YgZmFpbHVyZSBtb2RlIGV4cGlyZXMKKyAqIEBwY19jbnQ6IGN1cnJlbnQgbnVtYmVyIG9mIGNhbGxzIHRvIGZhaWx1cmUgbW9kZSBJL08gZnVuY3Rpb25zCisgKiBAcGNfY250X21heDogbnVtYmVyIG9mIGNhbGxzIGJ5IHdoaWNoIHRvIGRlbGF5IGZhaWx1cmUgbW9kZQorICoKICAqIEBjaGtfbHB0X3N6OiB1c2VkIGJ5IExQVCB0cmVlIHNpemUgY2hlY2tlcgogICogQGNoa19scHRfc3oyOiB1c2VkIGJ5IExQVCB0cmVlIHNpemUgY2hlY2tlcgogICogQGNoa19scHRfd2FzdGFnZTogdXNlZCBieSBMUFQgdHJlZSBzaXplIGNoZWNrZXIKQEAgLTU2LDIxICs2MywzNiBAQAogICogQHNhdmVkX2ZyZWU6IHNhdmVkIGFtb3VudCBvZiBmcmVlIHNwYWNlCiAgKiBAc2F2ZWRfaWR4X2djX2NudDogc2F2ZWQgdmFsdWUgb2YgQGMtPmlkeF9nY19jbnQKICAqCisgKiBAY2hrX2dlbjogaWYgZ2VuZXJhbCBleHRyYSBjaGVja3MgYXJlIGVuYWJsZWQKKyAqIEBjaGtfaW5kZXg6IGlmIGluZGV4IHh0cmEgY2hlY2tzIGFyZSBlbmFibGVkCisgKiBAY2hrX29ycGg6IGlmIG9ycGhhbnMgZXh0cmEgY2hlY2tzIGFyZSBlbmFibGVkCisgKiBAY2hrX2xwcm9wczogaWYgbHByb3BzIGV4dHJhIGNoZWNrcyBhcmUgZW5hYmxlZAorICogQGNoa19mczogaWYgVUJJRlMgY29udGVudHMgZXh0cmEgY2hlY2tzIGFyZSBlbmFibGVkCisgKiBAdHN0X3JjdnJ5OiBpZiBVQklGUyByZWNvdmVyeSB0ZXN0aW5nIG1vZGUgZW5hYmxlZAorICoKICAqIEBkZnNfZGlyX25hbWU6IG5hbWUgb2YgZGVidWdmcyBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIGZpbGUtc3lzdGVtJ3MgZmlsZXMKICAqIEBkZnNfZGlyOiBkaXJlbnRyeSBvYmplY3Qgb2YgdGhlIGZpbGUtc3lzdGVtIGRlYnVnZnMgZGlyZWN0b3J5CiAgKiBAZGZzX2R1bXBfbHByb3BzOiAiZHVtcCBscHJvcHMiIGRlYnVnZnMga25vYgogICogQGRmc19kdW1wX2J1ZGc6ICJkdW1wIGJ1ZGdldGluZyBpbmZvcm1hdGlvbiIgZGVidWdmcyBrbm9iCiAgKiBAZGZzX2R1bXBfdG5jOiAiZHVtcCBUTkMiIGRlYnVnZnMga25vYgorICogQGRmc19jaGtfZ2VuOiBkZWJ1Z2ZzIGtub2IgdG8gZW5hYmxlIFVCSUZTIGdlbmVyYWwgZXh0cmEgY2hlY2tzCisgKiBAZGZzX2Noa19pbmRleDogZGVidWdmcyBrbm9iIHRvIGVuYWJsZSBVQklGUyBpbmRleCBleHRyYSBjaGVja3MKKyAqIEBkZnNfY2hrX29ycGg6IGRlYnVnZnMga25vYiB0byBlbmFibGUgVUJJRlMgb3JwaGFucyBleHRyYSBjaGVja3MKKyAqIEBkZnNfY2hrX2xwcm9wczogZGVidWdmcyBrbm9iIHRvIGVuYWJsZSBVQklGUyBMRVAgcHJvcGVydGllcyBleHRyYSBjaGVja3MKKyAqIEBkZnNfY2hrX2ZzOiBkZWJ1Z2ZzIGtub2IgdG8gZW5hYmxlIFVCSUZTIGNvbnRlbnRzIGV4dHJhIGNoZWNrcworICogQGRmc190c3RfcmN2cnk6IGRlYnVnZnMga25vYiB0byBlbmFibGUgVUJJRlMgcmVjb3ZlcnkgdGVzdGluZwogICovCiBzdHJ1Y3QgdWJpZnNfZGVidWdfaW5mbyB7CiAJc3RydWN0IHViaWZzX3picmFuY2ggb2xkX3pyb290OwogCWludCBvbGRfenJvb3RfbGV2ZWw7CiAJdW5zaWduZWQgbG9uZyBsb25nIG9sZF96cm9vdF9zcW51bTsKLQlpbnQgZmFpbHVyZV9tb2RlOwotCWludCBmYWlsX2RlbGF5OwotCXVuc2lnbmVkIGxvbmcgZmFpbF90aW1lb3V0OwotCXVuc2lnbmVkIGludCBmYWlsX2NudDsKLQl1bnNpZ25lZCBpbnQgZmFpbF9jbnRfbWF4OworCisJaW50IHBjX2hhcHBlbmVkOworCWludCBwY19kZWxheTsKKwl1bnNpZ25lZCBsb25nIHBjX3RpbWVvdXQ7CisJdW5zaWduZWQgaW50IHBjX2NudDsKKwl1bnNpZ25lZCBpbnQgcGNfY250X21heDsKKwogCWxvbmcgbG9uZyBjaGtfbHB0X3N6OwogCWxvbmcgbG9uZyBjaGtfbHB0X3N6MjsKIAlsb25nIGxvbmcgY2hrX2xwdF93YXN0YWdlOwpAQCAtODQsMTEgKzEwNiw0MyBAQAogCWxvbmcgbG9uZyBzYXZlZF9mcmVlOwogCWludCBzYXZlZF9pZHhfZ2NfY250OwogCi0JY2hhciBkZnNfZGlyX25hbWVbMTAwXTsKKwl1bnNpZ25lZCBpbnQgY2hrX2dlbjoxOworCXVuc2lnbmVkIGludCBjaGtfaW5kZXg6MTsKKwl1bnNpZ25lZCBpbnQgY2hrX29ycGg6MTsKKwl1bnNpZ25lZCBpbnQgY2hrX2xwcm9wczoxOworCXVuc2lnbmVkIGludCBjaGtfZnM6MTsKKwl1bnNpZ25lZCBpbnQgdHN0X3JjdnJ5OjE7CisKKwljaGFyIGRmc19kaXJfbmFtZVtVQklGU19ERlNfRElSX0xFTiArIDFdOwogCXN0cnVjdCBkZW50cnkgKmRmc19kaXI7CiAJc3RydWN0IGRlbnRyeSAqZGZzX2R1bXBfbHByb3BzOwogCXN0cnVjdCBkZW50cnkgKmRmc19kdW1wX2J1ZGc7CiAJc3RydWN0IGRlbnRyeSAqZGZzX2R1bXBfdG5jOworCXN0cnVjdCBkZW50cnkgKmRmc19jaGtfZ2VuOworCXN0cnVjdCBkZW50cnkgKmRmc19jaGtfaW5kZXg7CisJc3RydWN0IGRlbnRyeSAqZGZzX2Noa19vcnBoOworCXN0cnVjdCBkZW50cnkgKmRmc19jaGtfbHByb3BzOworCXN0cnVjdCBkZW50cnkgKmRmc19jaGtfZnM7CisJc3RydWN0IGRlbnRyeSAqZGZzX3RzdF9yY3ZyeTsKK307CisKKy8qKgorICogdWJpZnNfZ2xvYmFsX2RlYnVnX2luZm8gLSBnbG9iYWwgKG5vdCBwZXItRlMpIFVCSUZTIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBAY2hrX2dlbjogaWYgZ2VuZXJhbCBleHRyYSBjaGVja3MgYXJlIGVuYWJsZWQKKyAqIEBjaGtfaW5kZXg6IGlmIGluZGV4IHh0cmEgY2hlY2tzIGFyZSBlbmFibGVkCisgKiBAY2hrX29ycGg6IGlmIG9ycGhhbnMgZXh0cmEgY2hlY2tzIGFyZSBlbmFibGVkCisgKiBAY2hrX2xwcm9wczogaWYgbHByb3BzIGV4dHJhIGNoZWNrcyBhcmUgZW5hYmxlZAorICogQGNoa19mczogaWYgVUJJRlMgY29udGVudHMgZXh0cmEgY2hlY2tzIGFyZSBlbmFibGVkCisgKiBAdHN0X3JjdnJ5OiBpZiBVQklGUyByZWNvdmVyeSB0ZXN0aW5nIG1vZGUgZW5hYmxlZAorICovCitzdHJ1Y3QgdWJpZnNfZ2xvYmFsX2RlYnVnX2luZm8geworCXVuc2lnbmVkIGludCBjaGtfZ2VuOjE7CisJdW5zaWduZWQgaW50IGNoa19pbmRleDoxOworCXVuc2lnbmVkIGludCBjaGtfb3JwaDoxOworCXVuc2lnbmVkIGludCBjaGtfbHByb3BzOjE7CisJdW5zaWduZWQgaW50IGNoa19mczoxOworCXVuc2lnbmVkIGludCB0c3RfcmN2cnk6MTsKIH07CiAKICNkZWZpbmUgdWJpZnNfYXNzZXJ0KGV4cHIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMjcsNiArMTgxLDggQEAKICNkZWZpbmUgREJHS0VZKGtleSkgZGJnX2tleV9zdHIwKGMsIChrZXkpKQogI2RlZmluZSBEQkdLRVkxKGtleSkgZGJnX2tleV9zdHIxKGMsIChrZXkpKQogCitleHRlcm4gc3BpbmxvY2tfdCBkYmdfbG9jazsKKwogI2RlZmluZSB1Ymlmc19kYmdfbXNnKHR5cGUsIGZtdCwgLi4uKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogCXNwaW5fbG9jaygmZGJnX2xvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJcHJfZGVidWcoIlVCSUZTIERCRyAiIHR5cGUgIjogIiBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXyk7IFwKQEAgLTE2Miw0MSArMjE4LDM2IEBACiAvKiBBZGRpdGlvbmFsIHJlY292ZXJ5IG1lc3NhZ2VzICovCiAjZGVmaW5lIGRiZ19yY3ZyeShmbXQsIC4uLikgdWJpZnNfZGJnX21zZygicmN2cnkiLCBmbXQsICMjX19WQV9BUkdTX18pCiAKLS8qCi0gKiBEZWJ1Z2dpbmcgY2hlY2sgZmxhZ3MuCi0gKgotICogVUJJRlNfQ0hLX0dFTjogZ2VuZXJhbCBjaGVja3MKLSAqIFVCSUZTX0NIS19UTkM6IGNoZWNrIFROQwotICogVUJJRlNfQ0hLX0lEWF9TWjogY2hlY2sgaW5kZXggc2l6ZQotICogVUJJRlNfQ0hLX09SUEg6IGNoZWNrIG9ycGhhbnMKLSAqIFVCSUZTX0NIS19PTERfSURYOiBjaGVjayB0aGUgb2xkIGluZGV4Ci0gKiBVQklGU19DSEtfTFBST1BTOiBjaGVjayBscHJvcHMKLSAqIFVCSUZTX0NIS19GUzogY2hlY2sgdGhlIGZpbGUtc3lzdGVtCi0gKi8KLWVudW0gewotCVVCSUZTX0NIS19HRU4gICAgID0gMHgxLAotCVVCSUZTX0NIS19UTkMgICAgID0gMHgyLAotCVVCSUZTX0NIS19JRFhfU1ogID0gMHg0LAotCVVCSUZTX0NIS19PUlBIICAgID0gMHg4LAotCVVCSUZTX0NIS19PTERfSURYID0gMHgxMCwKLQlVQklGU19DSEtfTFBST1BTICA9IDB4MjAsCi0JVUJJRlNfQ0hLX0ZTICAgICAgPSAweDQwLAotfTsKK2V4dGVybiBzdHJ1Y3QgdWJpZnNfZ2xvYmFsX2RlYnVnX2luZm8gdWJpZnNfZGJnOwogCi0vKgotICogU3BlY2lhbCB0ZXN0aW5nIGZsYWdzLgotICoKLSAqIFVCSUZTX1RTVF9SQ1ZSWTogZmFpbHVyZSBtb2RlIGZvciByZWNvdmVyeSB0ZXN0aW5nCi0gKi8KLWVudW0gewotCVVCSUZTX1RTVF9SQ1ZSWSAgICAgICAgICAgICA9IDB4NCwKLX07Ci0KLWV4dGVybiBzcGlubG9ja190IGRiZ19sb2NrOwotCi1leHRlcm4gdW5zaWduZWQgaW50IHViaWZzX21zZ19mbGFnczsKLWV4dGVybiB1bnNpZ25lZCBpbnQgdWJpZnNfY2hrX2ZsYWdzOwotZXh0ZXJuIHVuc2lnbmVkIGludCB1Ymlmc190c3RfZmxhZ3M7CitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfY2hrX2dlbihjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKK3sKKwlyZXR1cm4gISEodWJpZnNfZGJnLmNoa19nZW4gfHwgYy0+ZGJnLT5jaGtfZ2VuKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGRiZ19pc19jaGtfaW5kZXgoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMpCit7CisJcmV0dXJuICEhKHViaWZzX2RiZy5jaGtfaW5kZXggfHwgYy0+ZGJnLT5jaGtfaW5kZXgpOworfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX2Noa19vcnBoKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjKQoreworCXJldHVybiAhISh1Ymlmc19kYmcuY2hrX29ycGggfHwgYy0+ZGJnLT5jaGtfb3JwaCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfY2hrX2xwcm9wcyhjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKK3sKKwlyZXR1cm4gISEodWJpZnNfZGJnLmNoa19scHJvcHMgfHwgYy0+ZGJnLT5jaGtfbHByb3BzKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGRiZ19pc19jaGtfZnMoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMpCit7CisJcmV0dXJuICEhKHViaWZzX2RiZy5jaGtfZnMgfHwgYy0+ZGJnLT5jaGtfZnMpOworfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2lzX3RzdF9yY3ZyeShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKK3sKKwlyZXR1cm4gISEodWJpZnNfZGJnLnRzdF9yY3ZyeSB8fCBjLT5kYmctPnRzdF9yY3ZyeSk7Cit9CitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfcG93ZXJfY3V0KGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjKQoreworCXJldHVybiAhIWMtPmRiZy0+cGNfaGFwcGVuZWQ7Cit9CiAKIGludCB1Ymlmc19kZWJ1Z2dpbmdfaW5pdChzdHJ1Y3QgdWJpZnNfaW5mbyAqYyk7CiB2b2lkIHViaWZzX2RlYnVnZ2luZ19leGl0KHN0cnVjdCB1Ymlmc19pbmZvICpjKTsKQEAgLTIwNyw3ICsyNTgsNyBAQAogY29uc3QgY2hhciAqZGJnX2poZWFkKGludCBqaGVhZCk7CiBjb25zdCBjaGFyICpkYmdfZ2V0X2tleV9kdW1wKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLAogCQkJICAgICBjb25zdCB1bmlvbiB1Ymlmc19rZXkgKmtleSk7Ci12b2lkIGRiZ19kdW1wX2lub2RlKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgZGJnX2R1bXBfaW5vZGUoc3RydWN0IHViaWZzX2luZm8gKmMsIGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogdm9pZCBkYmdfZHVtcF9ub2RlKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCB2b2lkICpub2RlKTsKIHZvaWQgZGJnX2R1bXBfbHB0X25vZGUoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIHZvaWQgKm5vZGUsIGludCBsbnVtLAogCQkgICAgICAgaW50IG9mZnMpOwpAQCAtMjQwLDggKzI5MSw4IEBACiBpbnQgZGJnX2NoZWNrX2x0YWIoc3RydWN0IHViaWZzX2luZm8gKmMpOwogaW50IGRiZ19jaGtfbHB0X2ZyZWVfc3BjKHN0cnVjdCB1Ymlmc19pbmZvICpjKTsKIGludCBkYmdfY2hrX2xwdF9zeihzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGFjdGlvbiwgaW50IGxlbik7Ci1pbnQgZGJnX2NoZWNrX3N5bmNlZF9pX3NpemUoc3RydWN0IGlub2RlICppbm9kZSk7Ci1pbnQgZGJnX2NoZWNrX2Rpcl9zaXplKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCBzdHJ1Y3QgaW5vZGUgKmRpcik7CitpbnQgZGJnX2NoZWNrX3N5bmNlZF9pX3NpemUoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOworaW50IGRiZ19jaGVja19kaXIoc3RydWN0IHViaWZzX2luZm8gKmMsIGNvbnN0IHN0cnVjdCBpbm9kZSAqZGlyKTsKIGludCBkYmdfY2hlY2tfdG5jKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgZXh0cmEpOwogaW50IGRiZ19jaGVja19pZHhfc2l6ZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgbG9uZyBsb25nIGlkeF9zaXplKTsKIGludCBkYmdfY2hlY2tfZmlsZXN5c3RlbShzdHJ1Y3QgdWJpZnNfaW5mbyAqYyk7CkBAIC0yNTQsNTQgKzMwNSwxMiBAQAogaW50IGRiZ19jaGVja19kYXRhX25vZGVzX29yZGVyKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKIGludCBkYmdfY2hlY2tfbm9uZGF0YV9ub2Rlc19vcmRlcihzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CiAKLS8qIEZvcmNlIHRoZSB1c2Ugb2YgaW4tdGhlLWdhcHMgbWV0aG9kIGZvciB0ZXN0aW5nICovCi1zdGF0aWMgaW5saW5lIGludCBkYmdfZm9yY2VfaW5fdGhlX2dhcHNfZW5hYmxlZCh2b2lkKQotewotCXJldHVybiB1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfR0VOOwotfQotaW50IGRiZ19mb3JjZV9pbl90aGVfZ2Fwcyh2b2lkKTsKLQotLyogRmFpbHVyZSBtb2RlIGZvciByZWNvdmVyeSB0ZXN0aW5nICovCi0jZGVmaW5lIGRiZ19mYWlsdXJlX21vZGUgKHViaWZzX3RzdF9mbGFncyAmIFVCSUZTX1RTVF9SQ1ZSWSkKLQotI2lmbmRlZiBVQklGU19EQkdfUFJFU0VSVkVfVUJJCi0jZGVmaW5lIHViaV9sZWJfcmVhZCAgIGRiZ19sZWJfcmVhZAotI2RlZmluZSB1YmlfbGViX3dyaXRlICBkYmdfbGViX3dyaXRlCi0jZGVmaW5lIHViaV9sZWJfY2hhbmdlIGRiZ19sZWJfY2hhbmdlCi0jZGVmaW5lIHViaV9sZWJfZXJhc2UgIGRiZ19sZWJfZXJhc2UKLSNkZWZpbmUgdWJpX2xlYl91bm1hcCAgZGJnX2xlYl91bm1hcAotI2RlZmluZSB1YmlfaXNfbWFwcGVkICBkYmdfaXNfbWFwcGVkCi0jZGVmaW5lIHViaV9sZWJfbWFwICAgIGRiZ19sZWJfbWFwCi0jZW5kaWYKLQotaW50IGRiZ19sZWJfcmVhZChzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgY2hhciAqYnVmLCBpbnQgb2Zmc2V0LAotCQkgaW50IGxlbiwgaW50IGNoZWNrKTsKLWludCBkYmdfbGViX3dyaXRlKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsCi0JCSAgaW50IG9mZnNldCwgaW50IGxlbiwgaW50IGR0eXBlKTsKLWludCBkYmdfbGViX2NoYW5nZShzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgY29uc3Qgdm9pZCAqYnVmLAotCQkgICBpbnQgbGVuLCBpbnQgZHR5cGUpOwotaW50IGRiZ19sZWJfZXJhc2Uoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0pOwotaW50IGRiZ19sZWJfdW5tYXAoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0pOwotaW50IGRiZ19pc19tYXBwZWQoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0pOwotaW50IGRiZ19sZWJfbWFwKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtLCBpbnQgZHR5cGUpOwotCi1zdGF0aWMgaW5saW5lIGludCBkYmdfcmVhZChzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgY2hhciAqYnVmLAotCQkJICAgaW50IG9mZnNldCwgaW50IGxlbikKLXsKLQlyZXR1cm4gZGJnX2xlYl9yZWFkKGRlc2MsIGxudW0sIGJ1Ziwgb2Zmc2V0LCBsZW4sIDApOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkYmdfd3JpdGUoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sCi0JCQkgICAgY29uc3Qgdm9pZCAqYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQotewotCXJldHVybiBkYmdfbGViX3dyaXRlKGRlc2MsIGxudW0sIGJ1Ziwgb2Zmc2V0LCBsZW4sIFVCSV9VTktOT1dOKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZGJnX2NoYW5nZShzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwKLQkJCQkgICAgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQotewotCXJldHVybiBkYmdfbGViX2NoYW5nZShkZXNjLCBsbnVtLCBidWYsIGxlbiwgVUJJX1VOS05PV04pOwotfQoraW50IGRiZ19sZWJfd3JpdGUoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsIGludCBvZmZzLAorCQkgIGludCBsZW4sIGludCBkdHlwZSk7CitpbnQgZGJnX2xlYl9jaGFuZ2Uoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4sCisJCSAgIGludCBkdHlwZSk7CitpbnQgZGJnX2xlYl91bm1hcChzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0pOworaW50IGRiZ19sZWJfbWFwKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwgaW50IGR0eXBlKTsKIAogLyogRGVidWdmcy1yZWxhdGVkIHN0dWZmICovCiBpbnQgZGJnX2RlYnVnZnNfaW5pdCh2b2lkKTsKQEAgLTMxMyw3ICszMjIsNyBAQAogCiAvKiBVc2UgImlmICgwKSIgdG8gbWFrZSBjb21waWxlciBjaGVjayBhcmd1bWVudHMgZXZlbiBpZiBkZWJ1Z2dpbmcgaXMgb2ZmICovCiAjZGVmaW5lIHViaWZzX2Fzc2VydChleHByKSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmICgwICYmIChleHByKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQlwcmludGsoS0VSTl9DUklUICJVQklGUyBhc3NlcnQgZmFpbGVkIGluICVzIGF0ICV1IChwaWQgJWQpXG4iLCBcCiAJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIGN1cnJlbnQtPnBpZCk7ICAgICAgICAgICAgICAgICAgICAgIFwKIH0gd2hpbGUgKDApCkBAIC0zMjMsNiArMzMyLDkgQEAKIAkJdWJpZnNfZXJyKGZtdCwgIyNfX1ZBX0FSR1NfXyk7ICAgICBcCiB9IHdoaWxlICgwKQogCisjZGVmaW5lIERCR0tFWShrZXkpICAoKGNoYXIgKikoa2V5KSkKKyNkZWZpbmUgREJHS0VZMShrZXkpICgoY2hhciAqKShrZXkpKQorCiAjZGVmaW5lIHViaWZzX2RiZ19tc2coZm10LCAuLi4pIGRvIHsgICAgICAgICAgICAgICBcCiAJaWYgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJcHJfZGVidWcoZm10ICJcbiIsICMjX19WQV9BUkdTX18pOyBcCkBAIC0zNDYsOSArMzU4LDYgQEAKICNkZWZpbmUgZGJnX3NjYW4oZm10LCAuLi4pICB1Ymlmc19kYmdfbXNnKGZtdCwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgZGJnX3JjdnJ5KGZtdCwgLi4uKSB1Ymlmc19kYmdfbXNnKGZtdCwgIyNfX1ZBX0FSR1NfXykKIAotI2RlZmluZSBEQkdLRVkoa2V5KSAgKChjaGFyICopKGtleSkpCi0jZGVmaW5lIERCR0tFWTEoa2V5KSAoKGNoYXIgKikoa2V5KSkKLQogc3RhdGljIGlubGluZSBpbnQgdWJpZnNfZGVidWdnaW5nX2luaXQoc3RydWN0IHViaWZzX2luZm8gKmMpICAgICAgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHViaWZzX2RlYnVnZ2luZ19leGl0KHN0cnVjdCB1Ymlmc19pbmZvICpjKSAgICAgeyByZXR1cm47IH0KIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZGJnX250eXBlKGludCB0eXBlKSAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICIiOyB9CkBAIC0zNTcsNyArMzY2LDcgQEAKIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqCiBkYmdfZ2V0X2tleV9kdW1wKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLAogCQkgY29uc3QgdW5pb24gdWJpZnNfa2V5ICprZXkpICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICIiOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZGJnX2R1bXBfaW5vZGUoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsCitzdGF0aWMgaW5saW5lIHZvaWQgZGJnX2R1bXBfaW5vZGUoc3RydWN0IHViaWZzX2luZm8gKmMsCiAJCQkJICBjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlKSAgICAgIHsgcmV0dXJuOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZGJnX2R1bXBfbm9kZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKIAkJCQkgY29uc3Qgdm9pZCAqbm9kZSkgICAgICAgICAgICAgICAgeyByZXR1cm47IH0KQEAgLTQwOSw5ICs0MTgsMTEgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGRiZ19jaGtfbHB0X2ZyZWVfc3BjKHN0cnVjdCB1Ymlmc19pbmZvICpjKSAgICAgIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGRiZ19jaGtfbHB0X3N6KHN0cnVjdCB1Ymlmc19pbmZvICpjLAogCQkJCSBpbnQgYWN0aW9uLCBpbnQgbGVuKSAgICAgICAgICAgICB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBkYmdfY2hlY2tfc3luY2VkX2lfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKSAgICB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBkYmdfY2hlY2tfZGlyX3NpemUoc3RydWN0IHViaWZzX2luZm8gKmMsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgaW5vZGUgKmRpcikgICAgIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50CitkYmdfY2hlY2tfc3luY2VkX2lfc2l6ZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKKwkJCXN0cnVjdCBpbm9kZSAqaW5vZGUpICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGRiZ19jaGVja19kaXIoc3RydWN0IHViaWZzX2luZm8gKmMsCisJCQkJY29uc3Qgc3RydWN0IGlub2RlICpkaXIpICAgICAgICAgIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGRiZ19jaGVja190bmMoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBleHRyYSkgIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGRiZ19jaGVja19pZHhfc2l6ZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKIAkJCQkgICAgIGxvbmcgbG9uZyBpZHhfc2l6ZSkgICAgICAgICAgeyByZXR1cm4gMDsgfQpAQCAtNDMxLDkgKzQ0MiwyMyBAQAogZGJnX2NoZWNrX25vbmRhdGFfbm9kZXNfb3JkZXIoc3RydWN0IHViaWZzX2luZm8gKmMsCiAJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKSAgICAgICAgICAgICB7IHJldHVybiAwOyB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRiZ19mb3JjZV9pbl90aGVfZ2Fwcyh2b2lkKSAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDA7IH0KLSNkZWZpbmUgZGJnX2ZvcmNlX2luX3RoZV9nYXBzX2VuYWJsZWQoKSAwCi0jZGVmaW5lIGRiZ19mYWlsdXJlX21vZGUgICAgICAgICAgICAgICAgMAorc3RhdGljIGlubGluZSBpbnQgZGJnX2xlYl93cml0ZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sCisJCQkJY29uc3Qgdm9pZCAqYnVmLCBpbnQgb2Zmc2V0LAorCQkJCWludCBsZW4sIGludCBkdHlwZSkgICAgICAgICAgICAgICB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBkYmdfbGViX2NoYW5nZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sCisJCQkJIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbiwKKwkJCQkgaW50IGR0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2xlYl91bm1hcChzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0pICAgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZGJnX2xlYl9tYXAoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLAorCQkJICAgICAgaW50IGR0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfY2hrX2dlbihjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYykgICAgICB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfY2hrX2luZGV4KGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjKSAgICB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfY2hrX29ycGgoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMpICAgICB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfY2hrX2xwcm9wcyhjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYykgICB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfY2hrX2ZzKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjKSAgICAgICB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfdHN0X3JjdnJ5KGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjKSAgICB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBkYmdfaXNfcG93ZXJfY3V0KGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjKSAgICB7IHJldHVybiAwOyB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRiZ19kZWJ1Z2ZzX2luaXQodm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkYmdfZGVidWdmc19leGl0KHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuOyB9CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9kaXIuYyBiL2ZzL3ViaWZzL2Rpci5jCmluZGV4IGVmNWFiZDMuLjY4MzQ5MjAgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2Rpci5jCisrKyBiL2ZzL3ViaWZzL2Rpci5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkgKiBVQklGUyBoYXMgdG8gZnVsbHkgY29udHJvbCAiY2xlYW4gPC0+IGRpcnR5IiB0cmFuc2l0aW9ucyBvZiBpbm9kZXMKIAkgKiB0byBtYWtlIGJ1ZGdldGluZyB3b3JrLgogCSAqLwotCWlub2RlLT5pX2ZsYWdzIHw9IChTX05PQ01USU1FKTsKKwlpbm9kZS0+aV9mbGFncyB8PSBTX05PQ01USU1FOwogCiAJaW5vZGVfaW5pdF9vd25lcihpbm9kZSwgZGlyLCBtb2RlKTsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPQpAQCAtMTcyLDkgKzE3MiwxMSBAQAogCiAjaWZkZWYgQ09ORklHX1VCSUZTX0ZTX0RFQlVHCiAKLXN0YXRpYyBpbnQgZGJnX2NoZWNrX25hbWUoc3RydWN0IHViaWZzX2RlbnRfbm9kZSAqZGVudCwgc3RydWN0IHFzdHIgKm5tKQorc3RhdGljIGludCBkYmdfY2hlY2tfbmFtZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKKwkJCSAgY29uc3Qgc3RydWN0IHViaWZzX2RlbnRfbm9kZSAqZGVudCwKKwkJCSAgY29uc3Qgc3RydWN0IHFzdHIgKm5tKQogewotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19HRU4pKQorCWlmICghZGJnX2lzX2Noa19nZW4oYykpCiAJCXJldHVybiAwOwogCWlmIChsZTE2X3RvX2NwdShkZW50LT5ubGVuKSAhPSBubS0+bGVuKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE4NSw3ICsxODcsNyBAQAogCiAjZWxzZQogCi0jZGVmaW5lIGRiZ19jaGVja19uYW1lKGRlbnQsIG5tKSAwCisjZGVmaW5lIGRiZ19jaGVja19uYW1lKGMsIGRlbnQsIG5tKSAwCiAKICNlbmRpZgogCkBAIC0yMTksNyArMjIxLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGRiZ19jaGVja19uYW1lKGRlbnQsICZkZW50cnktPmRfbmFtZSkpIHsKKwlpZiAoZGJnX2NoZWNrX25hbWUoYywgZGVudCwgJmRlbnRyeS0+ZF9uYW1lKSkgewogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC01MjIsNyArNTI0LDcgQEAKIAl1Ymlmc19hc3NlcnQobXV0ZXhfaXNfbG9ja2VkKCZkaXItPmlfbXV0ZXgpKTsKIAl1Ymlmc19hc3NlcnQobXV0ZXhfaXNfbG9ja2VkKCZpbm9kZS0+aV9tdXRleCkpOwogCi0JZXJyID0gZGJnX2NoZWNrX3N5bmNlZF9pX3NpemUoaW5vZGUpOworCWVyciA9IGRiZ19jaGVja19zeW5jZWRfaV9zaXplKGMsIGlub2RlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC01NzcsNyArNTc5LDcgQEAKIAkJaW5vZGUtPmlfbmxpbmssIGRpci0+aV9pbm8pOwogCXViaWZzX2Fzc2VydChtdXRleF9pc19sb2NrZWQoJmRpci0+aV9tdXRleCkpOwogCXViaWZzX2Fzc2VydChtdXRleF9pc19sb2NrZWQoJmlub2RlLT5pX211dGV4KSk7Ci0JZXJyID0gZGJnX2NoZWNrX3N5bmNlZF9pX3NpemUoaW5vZGUpOworCWVyciA9IGRiZ19jaGVja19zeW5jZWRfaV9zaXplKGMsIGlub2RlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9maWxlLmMgYi9mcy91Ymlmcy9maWxlLmMKaW5kZXggNWU3ZmNjZi4uZjljMjM0YiAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvZmlsZS5jCisrKyBiL2ZzL3ViaWZzL2ZpbGUuYwpAQCAtMTI2Myw3ICsxMjYzLDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gZGJnX2NoZWNrX3N5bmNlZF9pX3NpemUoaW5vZGUpOworCWVyciA9IGRiZ19jaGVja19zeW5jZWRfaV9zaXplKGMsIGlub2RlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMzA0LDcgKzEzMDQsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgdWJpZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykKK2ludCB1Ymlmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm87CkBAIC0xMzE5LDE0ICsxMzE5LDE2IEBACiAJCSAqLwogCQlyZXR1cm4gMDsKIAotCS8qCi0JICogVkZTIGhhcyBhbHJlYWR5IHN5bmNocm9uaXplZCBkaXJ0eSBwYWdlcyBmb3IgdGhpcyBpbm9kZS4gU3luY2hyb25pemUKLQkgKiB0aGUgaW5vZGUgdW5sZXNzIHRoaXMgaXMgYSAnZGF0YXN5bmMoKScgY2FsbC4KLQkgKi8KKwllcnIgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJLyogU3luY2hyb25pemUgdGhlIGlub2RlIHVubGVzcyB0aGlzIGlzIGEgJ2RhdGFzeW5jKCknIGNhbGwuICovCiAJaWYgKCFkYXRhc3luYyB8fCAoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZX0RBVEFTWU5DKSkgewogCQllcnIgPSBpbm9kZS0+aV9zYi0+c19vcC0+d3JpdGVfaW5vZGUoaW5vZGUsIE5VTEwpOwogCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKKwkJCWdvdG8gb3V0OwogCX0KIAogCS8qCkBAIC0xMzM0LDEwICsxMzM2LDkgQEAKIAkgKiB0aGVtLgogCSAqLwogCWVyciA9IHViaWZzX3N5bmNfd2J1ZnNfYnlfaW5vZGUoYywgaW5vZGUpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gMDsKK291dDoKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2lvLmMgYi9mcy91Ymlmcy9pby5jCmluZGV4IDNiZTY0NWUuLjkyMjg5NTAgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2lvLmMKKysrIGIvZnMvdWJpZnMvaW8uYwpAQCAtODYsOCArODYsMTI1IEBACiAJCWMtPm5vX2Noa19kYXRhX2NyYyA9IDA7CiAJCWMtPnZmc19zYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJCXViaWZzX3dhcm4oInN3aXRjaGVkIHRvIHJlYWQtb25seSBtb2RlLCBlcnJvciAlZCIsIGVycik7CisJCWR1bXBfc3RhY2soKTsKKwl9Cit9CisKKy8qCisgKiBCZWxvdyBhcmUgc2ltcGxlIHdyYXBwZXJzIG92ZXIgVUJJIEkvTyBmdW5jdGlvbnMgd2hpY2ggaW5jbHVkZSBzb21lCisgKiBhZGRpdGlvbmFsIGNoZWNrcyBhbmQgVUJJRlMgZGVidWdnaW5nIHN0dWZmLiBTZWUgY29ycmVzcG9uZGluZyBVQkkgZnVuY3Rpb24KKyAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisKK2ludCB1Ymlmc19sZWJfcmVhZChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIHZvaWQgKmJ1ZiwgaW50IG9mZnMsCisJCSAgIGludCBsZW4sIGludCBldmVuX2ViYWRtc2cpCit7CisJaW50IGVycjsKKworCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBsZW4pOworCS8qCisJICogSW4gY2FzZSBvZiAlLUVCQURNU0cgcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2Ugb25seSBpZiB0aGUKKwkgKiBAZXZlbl9lYmFkbXNnIGlzIHRydWUuCisJICovCisJaWYgKGVyciAmJiAoZXJyICE9IC1FQkFETVNHIHx8IGV2ZW5fZWJhZG1zZykpIHsKKwkJdWJpZnNfZXJyKCJyZWFkaW5nICVkIGJ5dGVzIGZyb20gTEVCICVkOiVkIGZhaWxlZCwgZXJyb3IgJWQiLAorCQkJICBsZW4sIGxudW0sIG9mZnMsIGVycik7CiAJCWRiZ19kdW1wX3N0YWNrKCk7CiAJfQorCXJldHVybiBlcnI7Cit9CisKK2ludCB1Ymlmc19sZWJfd3JpdGUoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsIGludCBvZmZzLAorCQkgICAgaW50IGxlbiwgaW50IGR0eXBlKQoreworCWludCBlcnI7CisKKwl1Ymlmc19hc3NlcnQoIWMtPnJvX21lZGlhICYmICFjLT5yb19tb3VudCk7CisJaWYgKGMtPnJvX2Vycm9yKQorCQlyZXR1cm4gLUVST0ZTOworCWlmICghZGJnX2lzX3RzdF9yY3ZyeShjKSkKKwkJZXJyID0gdWJpX2xlYl93cml0ZShjLT51YmksIGxudW0sIGJ1Ziwgb2ZmcywgbGVuLCBkdHlwZSk7CisJZWxzZQorCQllcnIgPSBkYmdfbGViX3dyaXRlKGMsIGxudW0sIGJ1Ziwgb2ZmcywgbGVuLCBkdHlwZSk7CisJaWYgKGVycikgeworCQl1Ymlmc19lcnIoIndyaXRpbmcgJWQgYnl0ZXMgdG8gTEVCICVkOiVkIGZhaWxlZCwgZXJyb3IgJWQiLAorCQkJICBsZW4sIGxudW0sIG9mZnMsIGVycik7CisJCXViaWZzX3JvX21vZGUoYywgZXJyKTsKKwkJZGJnX2R1bXBfc3RhY2soKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworaW50IHViaWZzX2xlYl9jaGFuZ2Uoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4sCisJCSAgICAgaW50IGR0eXBlKQoreworCWludCBlcnI7CisKKwl1Ymlmc19hc3NlcnQoIWMtPnJvX21lZGlhICYmICFjLT5yb19tb3VudCk7CisJaWYgKGMtPnJvX2Vycm9yKQorCQlyZXR1cm4gLUVST0ZTOworCWlmICghZGJnX2lzX3RzdF9yY3ZyeShjKSkKKwkJZXJyID0gdWJpX2xlYl9jaGFuZ2UoYy0+dWJpLCBsbnVtLCBidWYsIGxlbiwgZHR5cGUpOworCWVsc2UKKwkJZXJyID0gZGJnX2xlYl9jaGFuZ2UoYywgbG51bSwgYnVmLCBsZW4sIGR0eXBlKTsKKwlpZiAoZXJyKSB7CisJCXViaWZzX2VycigiY2hhbmdpbmcgJWQgYnl0ZXMgaW4gTEVCICVkIGZhaWxlZCwgZXJyb3IgJWQiLAorCQkJICBsZW4sIGxudW0sIGVycik7CisJCXViaWZzX3JvX21vZGUoYywgZXJyKTsKKwkJZGJnX2R1bXBfc3RhY2soKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworaW50IHViaWZzX2xlYl91bm1hcChzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0pCit7CisJaW50IGVycjsKKworCXViaWZzX2Fzc2VydCghYy0+cm9fbWVkaWEgJiYgIWMtPnJvX21vdW50KTsKKwlpZiAoYy0+cm9fZXJyb3IpCisJCXJldHVybiAtRVJPRlM7CisJaWYgKCFkYmdfaXNfdHN0X3JjdnJ5KGMpKQorCQllcnIgPSB1YmlfbGViX3VubWFwKGMtPnViaSwgbG51bSk7CisJZWxzZQorCQllcnIgPSBkYmdfbGViX3VubWFwKGMsIGxudW0pOworCWlmIChlcnIpIHsKKwkJdWJpZnNfZXJyKCJ1bm1hcCBMRUIgJWQgZmFpbGVkLCBlcnJvciAlZCIsIGxudW0sIGVycik7CisJCXViaWZzX3JvX21vZGUoYywgZXJyKTsKKwkJZGJnX2R1bXBfc3RhY2soKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworaW50IHViaWZzX2xlYl9tYXAoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBpbnQgZHR5cGUpCit7CisJaW50IGVycjsKKworCXViaWZzX2Fzc2VydCghYy0+cm9fbWVkaWEgJiYgIWMtPnJvX21vdW50KTsKKwlpZiAoYy0+cm9fZXJyb3IpCisJCXJldHVybiAtRVJPRlM7CisJaWYgKCFkYmdfaXNfdHN0X3JjdnJ5KGMpKQorCQllcnIgPSB1YmlfbGViX21hcChjLT51YmksIGxudW0sIGR0eXBlKTsKKwllbHNlCisJCWVyciA9IGRiZ19sZWJfbWFwKGMsIGxudW0sIGR0eXBlKTsKKwlpZiAoZXJyKSB7CisJCXViaWZzX2VycigibWFwcGluZyBMRUIgJWQgZmFpbGVkLCBlcnJvciAlZCIsIGxudW0sIGVycik7CisJCXViaWZzX3JvX21vZGUoYywgZXJyKTsKKwkJZGJnX2R1bXBfc3RhY2soKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworaW50IHViaWZzX2lzX21hcHBlZChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0pCit7CisJaW50IGVycjsKKworCWVyciA9IHViaV9pc19tYXBwZWQoYy0+dWJpLCBsbnVtKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1Ymlmc19lcnIoInViaV9pc19tYXBwZWQgZmFpbGVkIGZvciBMRUIgJWQsIGVycm9yICVkIiwKKwkJCSAgbG51bSwgZXJyKTsKKwkJZGJnX2R1bXBfc3RhY2soKTsKKwl9CisJcmV0dXJuIGVycjsKIH0KIAogLyoqCkBAIC00MDYsMTQgKzUyMywxMCBAQAogCWRpcnQgPSBzeW5jX2xlbiAtIHdidWYtPnVzZWQ7CiAJaWYgKGRpcnQpCiAJCXViaWZzX3BhZChjLCB3YnVmLT5idWYgKyB3YnVmLT51c2VkLCBkaXJ0KTsKLQllcnIgPSB1YmlfbGViX3dyaXRlKGMtPnViaSwgd2J1Zi0+bG51bSwgd2J1Zi0+YnVmLCB3YnVmLT5vZmZzLAotCQkJICAgIHN5bmNfbGVuLCB3YnVmLT5kdHlwZSk7Ci0JaWYgKGVycikgewotCQl1Ymlmc19lcnIoImNhbm5vdCB3cml0ZSAlZCBieXRlcyB0byBMRUIgJWQ6JWQiLAotCQkJICBzeW5jX2xlbiwgd2J1Zi0+bG51bSwgd2J1Zi0+b2Zmcyk7Ci0JCWRiZ19kdW1wX3N0YWNrKCk7CisJZXJyID0gdWJpZnNfbGViX3dyaXRlKGMsIHdidWYtPmxudW0sIHdidWYtPmJ1Ziwgd2J1Zi0+b2Zmcywgc3luY19sZW4sCisJCQkgICAgICB3YnVmLT5kdHlwZSk7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQl9CiAKIAlzcGluX2xvY2soJndidWYtPmxvY2spOwogCXdidWYtPm9mZnMgKz0gc3luY19sZW47CkBAIC02MDUsOSArNzE4LDkgQEAKIAkJaWYgKGFsaWduZWRfbGVuID09IHdidWYtPmF2YWlsKSB7CiAJCQlkYmdfaW8oImZsdXNoIGpoZWFkICVzIHdidWYgdG8gTEVCICVkOiVkIiwKIAkJCSAgICAgICBkYmdfamhlYWQod2J1Zi0+amhlYWQpLCB3YnVmLT5sbnVtLCB3YnVmLT5vZmZzKTsKLQkJCWVyciA9IHViaV9sZWJfd3JpdGUoYy0+dWJpLCB3YnVmLT5sbnVtLCB3YnVmLT5idWYsCi0JCQkJCSAgICB3YnVmLT5vZmZzLCB3YnVmLT5zaXplLAotCQkJCQkgICAgd2J1Zi0+ZHR5cGUpOworCQkJZXJyID0gdWJpZnNfbGViX3dyaXRlKGMsIHdidWYtPmxudW0sIHdidWYtPmJ1ZiwKKwkJCQkJICAgICAgd2J1Zi0+b2Zmcywgd2J1Zi0+c2l6ZSwKKwkJCQkJICAgICAgd2J1Zi0+ZHR5cGUpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIG91dDsKIApAQCAtNjQyLDggKzc1NSw4IEBACiAJCWRiZ19pbygiZmx1c2ggamhlYWQgJXMgd2J1ZiB0byBMRUIgJWQ6JWQiLAogCQkgICAgICAgZGJnX2poZWFkKHdidWYtPmpoZWFkKSwgd2J1Zi0+bG51bSwgd2J1Zi0+b2Zmcyk7CiAJCW1lbWNweSh3YnVmLT5idWYgKyB3YnVmLT51c2VkLCBidWYsIHdidWYtPmF2YWlsKTsKLQkJZXJyID0gdWJpX2xlYl93cml0ZShjLT51YmksIHdidWYtPmxudW0sIHdidWYtPmJ1Ziwgd2J1Zi0+b2ZmcywKLQkJCQkgICAgd2J1Zi0+c2l6ZSwgd2J1Zi0+ZHR5cGUpOworCQllcnIgPSB1Ymlmc19sZWJfd3JpdGUoYywgd2J1Zi0+bG51bSwgd2J1Zi0+YnVmLCB3YnVmLT5vZmZzLAorCQkJCSAgICAgIHdidWYtPnNpemUsIHdidWYtPmR0eXBlKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCkBAIC02NjEsOCArNzc0LDggQEAKIAkJICovCiAJCWRiZ19pbygid3JpdGUgJWQgYnl0ZXMgdG8gTEVCICVkOiVkIiwKIAkJICAgICAgIHdidWYtPnNpemUsIHdidWYtPmxudW0sIHdidWYtPm9mZnMpOwotCQllcnIgPSB1YmlfbGViX3dyaXRlKGMtPnViaSwgd2J1Zi0+bG51bSwgYnVmLCB3YnVmLT5vZmZzLAotCQkJCSAgICB3YnVmLT5zaXplLCB3YnVmLT5kdHlwZSk7CisJCWVyciA9IHViaWZzX2xlYl93cml0ZShjLCB3YnVmLT5sbnVtLCBidWYsIHdidWYtPm9mZnMsCisJCQkJICAgICAgd2J1Zi0+c2l6ZSwgd2J1Zi0+ZHR5cGUpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAKQEAgLTY4Myw4ICs3OTYsOCBAQAogCQluIDw8PSBjLT5tYXhfd3JpdGVfc2hpZnQ7CiAJCWRiZ19pbygid3JpdGUgJWQgYnl0ZXMgdG8gTEVCICVkOiVkIiwgbiwgd2J1Zi0+bG51bSwKIAkJICAgICAgIHdidWYtPm9mZnMpOwotCQllcnIgPSB1YmlfbGViX3dyaXRlKGMtPnViaSwgd2J1Zi0+bG51bSwgYnVmICsgd3JpdHRlbiwKLQkJCQkgICAgd2J1Zi0+b2Zmcywgbiwgd2J1Zi0+ZHR5cGUpOworCQllcnIgPSB1Ymlmc19sZWJfd3JpdGUoYywgd2J1Zi0+bG51bSwgYnVmICsgd3JpdHRlbiwKKwkJCQkgICAgICB3YnVmLT5vZmZzLCBuLCB3YnVmLT5kdHlwZSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJd2J1Zi0+b2ZmcyArPSBuOwpAQCAtNzY2LDEzICs4NzksOSBAQAogCQlyZXR1cm4gLUVST0ZTOwogCiAJdWJpZnNfcHJlcGFyZV9ub2RlKGMsIGJ1ZiwgbGVuLCAxKTsKLQllcnIgPSB1YmlfbGViX3dyaXRlKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBidWZfbGVuLCBkdHlwZSk7Ci0JaWYgKGVycikgewotCQl1Ymlmc19lcnIoImNhbm5vdCB3cml0ZSAlZCBieXRlcyB0byBMRUIgJWQ6JWQsIGVycm9yICVkIiwKLQkJCSAgYnVmX2xlbiwgbG51bSwgb2ZmcywgZXJyKTsKKwllcnIgPSB1Ymlmc19sZWJfd3JpdGUoYywgbG51bSwgYnVmLCBvZmZzLCBidWZfbGVuLCBkdHlwZSk7CisJaWYgKGVycikKIAkJZGJnX2R1bXBfbm9kZShjLCBidWYpOwotCQlkYmdfZHVtcF9zdGFjaygpOwotCX0KIAogCXJldHVybiBlcnI7CiB9CkBAIC04MjQsMTMgKzkzMyw5IEBACiAKIAlpZiAocmxlbiA+IDApIHsKIAkJLyogUmVhZCBldmVyeXRoaW5nIHRoYXQgZ29lcyBiZWZvcmUgd3JpdGUtYnVmZmVyICovCi0JCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBybGVuKTsKLQkJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpIHsKLQkJCXViaWZzX2VycigiZmFpbGVkIHRvIHJlYWQgbm9kZSAlZCBmcm9tIExFQiAlZDolZCwgIgotCQkJCSAgImVycm9yICVkIiwgdHlwZSwgbG51bSwgb2ZmcywgZXJyKTsKLQkJCWRiZ19kdW1wX3N0YWNrKCk7CisJCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGxudW0sIGJ1Ziwgb2ZmcywgcmxlbiwgMCk7CisJCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKQogCQkJcmV0dXJuIGVycjsKLQkJfQogCX0KIAogCWlmICh0eXBlICE9IGNoLT5ub2RlX3R5cGUpIHsKQEAgLTg4NSwxMiArOTkwLDkgQEAKIAl1Ymlmc19hc3NlcnQoIShvZmZzICYgNykgJiYgb2ZmcyA8IGMtPmxlYl9zaXplKTsKIAl1Ymlmc19hc3NlcnQodHlwZSA+PSAwICYmIHR5cGUgPCBVQklGU19OT0RFX1RZUEVTX0NOVCk7CiAKLQllcnIgPSB1YmlfcmVhZChjLT51YmksIGxudW0sIGJ1Ziwgb2ZmcywgbGVuKTsKLQlpZiAoZXJyICYmIGVyciAhPSAtRUJBRE1TRykgewotCQl1Ymlmc19lcnIoImNhbm5vdCByZWFkIG5vZGUgJWQgZnJvbSBMRUIgJWQ6JWQsIGVycm9yICVkIiwKLQkJCSAgdHlwZSwgbG51bSwgb2ZmcywgZXJyKTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBidWYsIG9mZnMsIGxlbiwgMCk7CisJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpCiAJCXJldHVybiBlcnI7Ci0JfQogCiAJaWYgKHR5cGUgIT0gY2gtPm5vZGVfdHlwZSkgewogCQl1Ymlmc19lcnIoImJhZCBub2RlIHR5cGUgKCVkIGJ1dCBleHBlY3RlZCAlZCkiLApkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvbG9nLmMgYi9mcy91Ymlmcy9sb2cuYwppbmRleCBhZmZlYTk0Li5mOWZkMDY4IDEwMDY0NAotLS0gYS9mcy91Ymlmcy9sb2cuYworKysgYi9mcy91Ymlmcy9sb2cuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJCSAqIGFuIHVuY2xlYW4gcmVib290LCBiZWNhdXNlIHRoZSB0YXJnZXQgTEVCIG1pZ2h0IGhhdmUgYmVlbgogCQkgKiB1bm1hcHBlZCwgYnV0IG5vdCB5ZXQgcGh5c2ljYWxseSBlcmFzZWQuCiAJCSAqLwotCQllcnIgPSB1YmlfbGViX21hcChjLT51YmksIGJ1ZC0+bG51bSwgVUJJX1NIT1JUVEVSTSk7CisJCWVyciA9IHViaWZzX2xlYl9tYXAoYywgYnVkLT5sbnVtLCBVQklfU0hPUlRURVJNKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0X3VubG9jazsKIAl9CkBAIC0yODMsOCArMjgzLDYgQEAKIAlyZXR1cm4gMDsKIAogb3V0X3VubG9jazoKLQlpZiAoZXJyICE9IC1FQUdBSU4pCi0JCXViaWZzX3JvX21vZGUoYywgZXJyKTsKIAltdXRleF91bmxvY2soJmMtPmxvZ19tdXRleCk7CiAJa2ZyZWUocmVmKTsKIAlrZnJlZShidWQpOwpAQCAtNzUyLDcgKzc1MCw3IEBACiAJc3RydWN0IHViaWZzX2J1ZCAqYnVkOwogCWxvbmcgbG9uZyBidWRfYnl0ZXMgPSAwOwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX0dFTikpCisJaWYgKCFkYmdfaXNfY2hrX2dlbihjKSkKIAkJcmV0dXJuIDA7CiAKIAlzcGluX2xvY2soJmMtPmJ1ZHNfbG9jayk7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9scHJvcHMuYyBiL2ZzL3ViaWZzL2xwcm9wcy5jCmluZGV4IDY2Nzg4NGYuLmY4YTE4MWUgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2xwcm9wcy5jCisrKyBiL2ZzL3ViaWZzL2xwcm9wcy5jCkBAIC01MDQsNyArNTA0LDcgQEAKIAlwbm9kZSA9IChzdHJ1Y3QgdWJpZnNfcG5vZGUgKiljb250YWluZXJfb2YobHByb3BzIC0gcG9zLAogCQkJCQkJICAgc3RydWN0IHViaWZzX3Bub2RlLAogCQkJCQkJICAgbHByb3BzWzBdKTsKLQlyZXR1cm4gIXRlc3RfYml0KENPV19aTk9ERSwgJnBub2RlLT5mbGFncykgJiYKKwlyZXR1cm4gIXRlc3RfYml0KENPV19DTk9ERSwgJnBub2RlLT5mbGFncykgJiYKIAkgICAgICAgdGVzdF9iaXQoRElSVFlfQ05PREUsICZwbm9kZS0+ZmxhZ3MpOwogfQogCkBAIC04NjAsNyArODYwLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJaW50IGksIGNhdDsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIChVQklGU19DSEtfR0VOIHwgVUJJRlNfQ0hLX0xQUk9QUykpKQorCWlmICghZGJnX2lzX2Noa19nZW4oYykgJiYgIWRiZ19pc19jaGtfbHByb3BzKGMpKQogCQlyZXR1cm4gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobHByb3BzLCAmYy0+ZW1wdHlfbGlzdCwgbGlzdCkgewpAQCAtOTU4LDcgKzk1OCw3IEBACiB7CiAJaW50IGkgPSAwLCBqLCBlcnIgPSAwOwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgKFVCSUZTX0NIS19HRU4gfCBVQklGU19DSEtfTFBST1BTKSkpCisJaWYgKCFkYmdfaXNfY2hrX2dlbihjKSAmJiAhZGJnX2lzX2Noa19scHJvcHMoYykpCiAJCXJldHVybjsKIAogCWZvciAoaSA9IDA7IGkgPCBoZWFwLT5jbnQ7IGkrKykgewpAQCAtMTI2Miw3ICsxMjYyLDcgQEAKIAlpbnQgaSwgZXJyOwogCXN0cnVjdCB1Ymlmc19scF9zdGF0cyBsc3Q7CiAKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfTFBST1BTKSkKKwlpZiAoIWRiZ19pc19jaGtfbHByb3BzKGMpKQogCQlyZXR1cm4gMDsKIAogCS8qCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9scHQuYyBiL2ZzL3ViaWZzL2xwdC5jCmluZGV4IGVmNTE1NWUuLjYxODljNzQgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2xwdC5jCisrKyBiL2ZzL3ViaWZzL2xwdC5jCkBAIC03MDEsOCArNzAxLDggQEAKIAkJCWFsZW4gPSBBTElHTihsZW4sIGMtPm1pbl9pb19zaXplKTsKIAkJCXNldF9sdGFiKGMsIGxudW0sIGMtPmxlYl9zaXplIC0gYWxlbiwgYWxlbiAtIGxlbik7CiAJCQltZW1zZXQocCwgMHhmZiwgYWxlbiAtIGxlbik7Ci0JCQllcnIgPSB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0rKywgYnVmLCBhbGVuLAotCQkJCQkgICAgIFVCSV9TSE9SVFRFUk0pOworCQkJZXJyID0gdWJpZnNfbGViX2NoYW5nZShjLCBsbnVtKyssIGJ1ZiwgYWxlbiwKKwkJCQkJICAgICAgIFVCSV9TSE9SVFRFUk0pOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIG91dDsKIAkJCXAgPSBidWY7CkBAIC03MzIsOCArNzMyLDggQEAKIAkJCQlzZXRfbHRhYihjLCBsbnVtLCBjLT5sZWJfc2l6ZSAtIGFsZW4sCiAJCQkJCSAgICBhbGVuIC0gbGVuKTsKIAkJCQltZW1zZXQocCwgMHhmZiwgYWxlbiAtIGxlbik7Ci0JCQkJZXJyID0gdWJpX2xlYl9jaGFuZ2UoYy0+dWJpLCBsbnVtKyssIGJ1ZiwgYWxlbiwKLQkJCQkJCSAgICAgVUJJX1NIT1JUVEVSTSk7CisJCQkJZXJyID0gdWJpZnNfbGViX2NoYW5nZShjLCBsbnVtKyssIGJ1ZiwgYWxlbiwKKwkJCQkJCSAgICAgICBVQklfU0hPUlRURVJNKTsKIAkJCQlpZiAoZXJyKQogCQkJCQlnb3RvIG91dDsKIAkJCQlwID0gYnVmOwpAQCAtNzgwLDggKzc4MCw4IEBACiAJCQlhbGVuID0gQUxJR04obGVuLCBjLT5taW5faW9fc2l6ZSk7CiAJCQlzZXRfbHRhYihjLCBsbnVtLCBjLT5sZWJfc2l6ZSAtIGFsZW4sIGFsZW4gLSBsZW4pOwogCQkJbWVtc2V0KHAsIDB4ZmYsIGFsZW4gLSBsZW4pOwotCQkJZXJyID0gdWJpX2xlYl9jaGFuZ2UoYy0+dWJpLCBsbnVtKyssIGJ1ZiwgYWxlbiwKLQkJCQkJICAgICBVQklfU0hPUlRURVJNKTsKKwkJCWVyciA9IHViaWZzX2xlYl9jaGFuZ2UoYywgbG51bSsrLCBidWYsIGFsZW4sCisJCQkJCSAgICAgICBVQklfU0hPUlRURVJNKTsKIAkJCWlmIChlcnIpCiAJCQkJZ290byBvdXQ7CiAJCQlwID0gYnVmOwpAQCAtODA2LDcgKzgwNiw3IEBACiAJCWFsZW4gPSBBTElHTihsZW4sIGMtPm1pbl9pb19zaXplKTsKIAkJc2V0X2x0YWIoYywgbG51bSwgYy0+bGViX3NpemUgLSBhbGVuLCBhbGVuIC0gbGVuKTsKIAkJbWVtc2V0KHAsIDB4ZmYsIGFsZW4gLSBsZW4pOwotCQllcnIgPSB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0rKywgYnVmLCBhbGVuLCBVQklfU0hPUlRURVJNKTsKKwkJZXJyID0gdWJpZnNfbGViX2NoYW5nZShjLCBsbnVtKyssIGJ1ZiwgYWxlbiwgVUJJX1NIT1JUVEVSTSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJcCA9IGJ1ZjsKQEAgLTgyNiw3ICs4MjYsNyBAQAogCiAJLyogV3JpdGUgcmVtYWluaW5nIGJ1ZmZlciAqLwogCW1lbXNldChwLCAweGZmLCBhbGVuIC0gbGVuKTsKLQllcnIgPSB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0sIGJ1ZiwgYWxlbiwgVUJJX1NIT1JUVEVSTSk7CisJZXJyID0gdWJpZnNfbGViX2NoYW5nZShjLCBsbnVtLCBidWYsIGFsZW4sIFVCSV9TSE9SVFRFUk0pOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC0xMjIyLDcgKzEyMjIsNyBAQAogCQlpZiAoYy0+YmlnX2xwdCkKIAkJCW5ub2RlLT5udW0gPSBjYWxjX25ub2RlX251bV9mcm9tX3BhcmVudChjLCBwYXJlbnQsIGlpcCk7CiAJfSBlbHNlIHsKLQkJZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBidWYsIG9mZnMsIGMtPm5ub2RlX3N6KTsKKwkJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgYnVmLCBvZmZzLCBjLT5ubm9kZV9zeiwgMSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJZXJyID0gdWJpZnNfdW5wYWNrX25ub2RlKGMsIGJ1Ziwgbm5vZGUpOwpAQCAtMTI0Nyw2ICsxMjQ3LDcgQEAKIAogb3V0OgogCXViaWZzX2VycigiZXJyb3IgJWQgcmVhZGluZyBubm9kZSBhdCAlZDolZCIsIGVyciwgbG51bSwgb2Zmcyk7CisJZGJnX2R1bXBfc3RhY2soKTsKIAlrZnJlZShubm9kZSk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTEyOTAsNyArMTI5MSw3IEBACiAJCQlscHJvcHMtPmZsYWdzID0gdWJpZnNfY2F0ZWdvcml6ZV9scHJvcHMoYywgbHByb3BzKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBjLT5wbm9kZV9zeik7CisJCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGxudW0sIGJ1Ziwgb2ZmcywgYy0+cG5vZGVfc3osIDEpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJCWVyciA9IHVucGFja19wbm9kZShjLCBidWYsIHBub2RlKTsKQEAgLTEzMTIsNiArMTMxMyw3IEBACiBvdXQ6CiAJdWJpZnNfZXJyKCJlcnJvciAlZCByZWFkaW5nIHBub2RlIGF0ICVkOiVkIiwgZXJyLCBsbnVtLCBvZmZzKTsKIAlkYmdfZHVtcF9wbm9kZShjLCBwbm9kZSwgcGFyZW50LCBpaXApOworCWRiZ19kdW1wX3N0YWNrKCk7CiAJZGJnX21zZygiY2FsYyBudW06ICVkIiwgY2FsY19wbm9kZV9udW1fZnJvbV9wYXJlbnQoYywgcGFyZW50LCBpaXApKTsKIAlrZnJlZShwbm9kZSk7CiAJcmV0dXJuIGVycjsKQEAgLTEzMzEsNyArMTMzMyw3IEBACiAJYnVmID0gdm1hbGxvYyhjLT5sdGFiX3N6KTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBjLT5sdGFiX2xudW0sIGJ1ZiwgYy0+bHRhYl9vZmZzLCBjLT5sdGFiX3N6KTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBjLT5sdGFiX2xudW0sIGJ1ZiwgYy0+bHRhYl9vZmZzLCBjLT5sdGFiX3N6LCAxKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAllcnIgPSB1bnBhY2tfbHRhYihjLCBidWYpOwpAQCAtMTM1NCw3ICsxMzU2LDggQEAKIAlidWYgPSB2bWFsbG9jKGMtPmxzYXZlX3N6KTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBjLT5sc2F2ZV9sbnVtLCBidWYsIGMtPmxzYXZlX29mZnMsIGMtPmxzYXZlX3N6KTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBjLT5sc2F2ZV9sbnVtLCBidWYsIGMtPmxzYXZlX29mZnMsCisJCQkgICAgIGMtPmxzYXZlX3N6LCAxKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAllcnIgPSB1bnBhY2tfbHNhdmUoYywgYnVmKTsKQEAgLTE4MTQsOCArMTgxNyw4IEBACiAJCWlmIChjLT5iaWdfbHB0KQogCQkJbm5vZGUtPm51bSA9IGNhbGNfbm5vZGVfbnVtX2Zyb21fcGFyZW50KGMsIHBhcmVudCwgaWlwKTsKIAl9IGVsc2UgewotCQllcnIgPSB1YmlfcmVhZChjLT51YmksIGJyYW5jaC0+bG51bSwgYnVmLCBicmFuY2gtPm9mZnMsCi0JCQkgICAgICAgYy0+bm5vZGVfc3opOworCQllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBicmFuY2gtPmxudW0sIGJ1ZiwgYnJhbmNoLT5vZmZzLAorCQkJCSAgICAgYy0+bm5vZGVfc3osIDEpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAkJZXJyID0gdWJpZnNfdW5wYWNrX25ub2RlKGMsIGJ1Ziwgbm5vZGUpOwpAQCAtMTg4Myw4ICsxODg2LDggQEAKIAkJdWJpZnNfYXNzZXJ0KGJyYW5jaC0+bG51bSA+PSBjLT5scHRfZmlyc3QgJiYKIAkJCSAgICAgYnJhbmNoLT5sbnVtIDw9IGMtPmxwdF9sYXN0KTsKIAkJdWJpZnNfYXNzZXJ0KGJyYW5jaC0+b2ZmcyA+PSAwICYmIGJyYW5jaC0+b2ZmcyA8IGMtPmxlYl9zaXplKTsKLQkJZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBicmFuY2gtPmxudW0sIGJ1ZiwgYnJhbmNoLT5vZmZzLAotCQkJICAgICAgIGMtPnBub2RlX3N6KTsKKwkJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgYnJhbmNoLT5sbnVtLCBidWYsIGJyYW5jaC0+b2ZmcywKKwkJCQkgICAgIGMtPnBub2RlX3N6LCAxKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBFUlJfUFRSKGVycik7CiAJCWVyciA9IHVucGFja19wbm9kZShjLCBidWYsIHBub2RlKTsKQEAgLTIyMjQsNyArMjIyNyw3IEBACiAJc3RydWN0IHViaWZzX2Nub2RlICpjbjsKIAlpbnQgbnVtLCBpaXAgPSAwLCBlcnI7CiAKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfTFBST1BTKSkKKwlpZiAoIWRiZ19pc19jaGtfbHByb3BzKGMpKQogCQlyZXR1cm4gMDsKIAogCXdoaWxlIChjbm9kZSkgewpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvbHB0X2NvbW1pdC5jIGIvZnMvdWJpZnMvbHB0X2NvbW1pdC5jCmluZGV4IGRmY2I1NzQuLmNkZGQ2YmQgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2xwdF9jb21taXQuYworKysgYi9mcy91Ymlmcy9scHRfY29tbWl0LmMKQEAgLTI3LDYgKzI3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NyYzE2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgInViaWZzLmgiCiAKICNpZmRlZiBDT05GSUdfVUJJRlNfRlNfREVCVUcKQEAgLTExNiw4ICsxMTcsOCBAQAogCQlyZXR1cm4gMDsKIAljbnQgKz0gMTsKIAl3aGlsZSAoMSkgewotCQl1Ymlmc19hc3NlcnQoIXRlc3RfYml0KENPV19aTk9ERSwgJmNub2RlLT5mbGFncykpOwotCQlfX3NldF9iaXQoQ09XX1pOT0RFLCAmY25vZGUtPmZsYWdzKTsKKwkJdWJpZnNfYXNzZXJ0KCF0ZXN0X2JpdChDT1dfQ05PREUsICZjbm9kZS0+ZmxhZ3MpKTsKKwkJX19zZXRfYml0KENPV19DTk9ERSwgJmNub2RlLT5mbGFncyk7CiAJCWNuZXh0ID0gbmV4dF9kaXJ0eV9jbm9kZShjbm9kZSk7CiAJCWlmICghY25leHQpIHsKIAkJCWNub2RlLT5jbmV4dCA9IGMtPmxwdF9jbmV4dDsKQEAgLTQ2NSw3ICs0NjYsNyBAQAogCQkgKi8KIAkJY2xlYXJfYml0KERJUlRZX0NOT0RFLCAmY25vZGUtPmZsYWdzKTsKIAkJc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCk7Ci0JCWNsZWFyX2JpdChDT1dfWk5PREUsICZjbm9kZS0+ZmxhZ3MpOworCQljbGVhcl9iaXQoQ09XX0NOT0RFLCAmY25vZGUtPmZsYWdzKTsKIAkJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKIAkJb2ZmcyArPSBsZW47CiAJCWRiZ19jaGtfbHB0X3N6KGMsIDEsIGxlbik7CkBAIC0xMTYwLDExICsxMTYxLDExIEBACiAJdm9pZCAqYnVmID0gYy0+bHB0X2J1ZjsKIAogCWRiZ19scCgiTEVCICVkIiwgbG51bSk7Ci0JZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBidWYsIDAsIGMtPmxlYl9zaXplKTsKLQlpZiAoZXJyKSB7Ci0JCXViaWZzX2VycigiY2Fubm90IHJlYWQgTEVCICVkLCBlcnJvciAlZCIsIGxudW0sIGVycik7CisKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBidWYsIDAsIGMtPmxlYl9zaXplLCAxKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCX0KKwogCXdoaWxlICgxKSB7CiAJCWlmICghaXNfYV9ub2RlKGMsIGJ1ZiwgbGVuKSkgewogCQkJaW50IHBhZF9sZW47CkBAIC0xNjQwLDcgKzE2NDEsNyBAQAogCWludCByZXQ7CiAJdm9pZCAqYnVmLCAqcDsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19MUFJPUFMpKQorCWlmICghZGJnX2lzX2Noa19scHJvcHMoYykpCiAJCXJldHVybiAwOwogCiAJYnVmID0gcCA9IF9fdm1hbGxvYyhjLT5sZWJfc2l6ZSwgR0ZQX05PRlMsIFBBR0VfS0VSTkVMKTsKQEAgLTE2NTAsMTEgKzE2NTEsMTEgQEAKIAl9CiAKIAlkYmdfbHAoIkxFQiAlZCIsIGxudW0pOwotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnVmLCAwLCBjLT5sZWJfc2l6ZSk7Ci0JaWYgKGVycikgewotCQlkYmdfbXNnKCJ1YmlfcmVhZCBmYWlsZWQsIExFQiAlZCwgZXJyb3IgJWQiLCBsbnVtLCBlcnIpOworCisJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgYnVmLCAwLCBjLT5sZWJfc2l6ZSwgMSk7CisJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JfQorCiAJd2hpbGUgKDEpIHsKIAkJaWYgKCFpc19hX25vZGUoYywgcCwgbGVuKSkgewogCQkJaW50IGksIHBhZF9sZW47CkBAIC0xNzExLDcgKzE3MTIsNyBAQAogewogCWludCBsbnVtLCBlcnIsIGksIGNudDsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19MUFJPUFMpKQorCWlmICghZGJnX2lzX2Noa19scHJvcHMoYykpCiAJCXJldHVybiAwOwogCiAJLyogQnJpbmcgdGhlIGVudGlyZSB0cmVlIGludG8gbWVtb3J5ICovCkBAIC0xNzU0LDcgKzE3NTUsNyBAQAogCWxvbmcgbG9uZyBmcmVlID0gMDsKIAlpbnQgaTsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19MUFJPUFMpKQorCWlmICghZGJnX2lzX2Noa19scHJvcHMoYykpCiAJCXJldHVybiAwOwogCiAJZm9yIChpID0gMDsgaSA8IGMtPmxwdF9sZWJzOyBpKyspIHsKQEAgLTE3OTYsNyArMTc5Nyw3IEBACiAJbG9uZyBsb25nIGNoa19scHRfc3osIGxwdF9zejsKIAlpbnQgZXJyID0gMDsKIAotCWlmICghKHViaWZzX2Noa19mbGFncyAmIFVCSUZTX0NIS19MUFJPUFMpKQorCWlmICghZGJnX2lzX2Noa19scHJvcHMoYykpCiAJCXJldHVybiAwOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKQEAgLTE5MDEsMTEgKzE5MDIsMTAgQEAKIAkJcmV0dXJuOwogCX0KIAotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnVmLCAwLCBjLT5sZWJfc2l6ZSk7Ci0JaWYgKGVycikgewotCQl1Ymlmc19lcnIoImNhbm5vdCByZWFkIExFQiAlZCwgZXJyb3IgJWQiLCBsbnVtLCBlcnIpOworCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGxudW0sIGJ1ZiwgMCwgYy0+bGViX3NpemUsIDEpOworCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCX0KKwogCXdoaWxlICgxKSB7CiAJCW9mZnMgPSBjLT5sZWJfc2l6ZSAtIGxlbjsKIAkJaWYgKCFpc19hX25vZGUoYywgcCwgbGVuKSkgewpAQCAtMjAxOSw3ICsyMDE5LDcgQEAKIAlzdHJ1Y3QgdWJpZnNfbHB0X2hlYXAgKmhlYXA7CiAJaW50IGk7CiAKLQlpZiAoISh1Ymlmc19jaGtfZmxhZ3MgJiBVQklGU19DSEtfR0VOKSkKKwlpZiAoIWRiZ19pc19jaGtfZ2VuKGMpKQogCQlyZXR1cm4gMDsKIAlpZiAocmFuZG9tMzIoKSAmIDMpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvbWlzYy5oIGIvZnMvdWJpZnMvbWlzYy5oCmluZGV4IDBiNTI5NmEuLmVlN2NiNWUgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL21pc2MuaAorKysgYi9mcy91Ymlmcy9taXNjLmgKQEAgLTM5LDYgKzM5LDI5IEBACiB9CiAKIC8qKgorICogdWJpZnNfem5fb2Jzb2xldGUgLSBjaGVjayBpZiB6bm9kZSBpcyBvYnNvbGV0ZS4KKyAqIEB6bm9kZTogem5vZGUgdG8gY2hlY2sKKyAqCisgKiBUaGlzIGhlbHBlciBmdW5jdGlvbiByZXR1cm5zICUxIGlmIEB6bm9kZSBpcyBvYnNvbGV0ZSBhbmQgJTAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1Ymlmc196bl9vYnNvbGV0ZShjb25zdCBzdHJ1Y3QgdWJpZnNfem5vZGUgKnpub2RlKQoreworCXJldHVybiAhIXRlc3RfYml0KE9CU09MRVRFX1pOT0RFLCAmem5vZGUtPmZsYWdzKTsKK30KKworLyoqCisgKiB1Ymlmc196bl9jb3cgLSBjaGVjayBpZiB6bm9kZSBoYXMgdG8gYmUgY29waWVkIG9uIHdyaXRlLgorICogQHpub2RlOiB6bm9kZSB0byBjaGVjaworICoKKyAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJldHVybnMgJTEgaWYgQHpub2RlIGlzIGhhcyBDT1cgZmxhZyBzZXQgYW5kICUwCisgKiBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHViaWZzX3puX2Nvdyhjb25zdCBzdHJ1Y3QgdWJpZnNfem5vZGUgKnpub2RlKQoreworCXJldHVybiAhIXRlc3RfYml0KENPV19aTk9ERSwgJnpub2RlLT5mbGFncyk7Cit9CisKKy8qKgogICogdWJpZnNfd2FrZV91cF9iZ3QgLSB3YWtlIHVwIGJhY2tncm91bmQgdGhyZWFkLgogICogQGM6IFVCSUZTIGZpbGUtc3lzdGVtIGRlc2NyaXB0aW9uIG9iamVjdAogICovCkBAIC0xMjIsODYgKzE0NSw2IEBACiB9CiAKIC8qKgotICogdWJpZnNfbGViX3VubWFwIC0gdW5tYXAgYW4gTEVCLgotICogQGM6IFVCSUZTIGZpbGUtc3lzdGVtIGRlc2NyaXB0aW9uIG9iamVjdAotICogQGxudW06IExFQiBudW1iZXIgdG8gdW5tYXAKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJTAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHViaWZzX2xlYl91bm1hcChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0pCi17Ci0JaW50IGVycjsKLQotCXViaWZzX2Fzc2VydCghYy0+cm9fbWVkaWEgJiYgIWMtPnJvX21vdW50KTsKLQlpZiAoYy0+cm9fZXJyb3IpCi0JCXJldHVybiAtRVJPRlM7Ci0JZXJyID0gdWJpX2xlYl91bm1hcChjLT51YmksIGxudW0pOwotCWlmIChlcnIpIHsKLQkJdWJpZnNfZXJyKCJ1bm1hcCBMRUIgJWQgZmFpbGVkLCBlcnJvciAlZCIsIGxudW0sIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogdWJpZnNfbGViX3dyaXRlIC0gd3JpdGUgdG8gYSBMRUIuCi0gKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0Ci0gKiBAbG51bTogTEVCIG51bWJlciB0byB3cml0ZQotICogQGJ1ZjogYnVmZmVyIHRvIHdyaXRlIGZyb20KLSAqIEBvZmZzOiBvZmZzZXQgd2l0aGluIExFQiB0byB3cml0ZSB0bwotICogQGxlbjogbGVuZ3RoIHRvIHdyaXRlCi0gKiBAZHR5cGU6IGRhdGEgdHlwZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAlMCBvbiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgdWJpZnNfbGViX3dyaXRlKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwKLQkJCQkgIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG9mZnMsIGludCBsZW4sIGludCBkdHlwZSkKLXsKLQlpbnQgZXJyOwotCi0JdWJpZnNfYXNzZXJ0KCFjLT5yb19tZWRpYSAmJiAhYy0+cm9fbW91bnQpOwotCWlmIChjLT5yb19lcnJvcikKLQkJcmV0dXJuIC1FUk9GUzsKLQllcnIgPSB1YmlfbGViX3dyaXRlKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBsZW4sIGR0eXBlKTsKLQlpZiAoZXJyKSB7Ci0JCXViaWZzX2Vycigid3JpdGluZyAlZCBieXRlcyBhdCAlZDolZCwgZXJyb3IgJWQiLAotCQkJICBsZW4sIGxudW0sIG9mZnMsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogdWJpZnNfbGViX2NoYW5nZSAtIGF0b21pYyBMRUIgY2hhbmdlLgotICogQGM6IFVCSUZTIGZpbGUtc3lzdGVtIGRlc2NyaXB0aW9uIG9iamVjdAotICogQGxudW06IExFQiBudW1iZXIgdG8gd3JpdGUKLSAqIEBidWY6IGJ1ZmZlciB0byB3cml0ZSBmcm9tCi0gKiBAbGVuOiBsZW5ndGggdG8gd3JpdGUKLSAqIEBkdHlwZTogZGF0YSB0eXBlCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW5saW5lIGludCB1Ymlmc19sZWJfY2hhbmdlKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwKLQkJCQkgICBjb25zdCB2b2lkICpidWYsIGludCBsZW4sIGludCBkdHlwZSkKLXsKLQlpbnQgZXJyOwotCi0JdWJpZnNfYXNzZXJ0KCFjLT5yb19tZWRpYSAmJiAhYy0+cm9fbW91bnQpOwotCWlmIChjLT5yb19lcnJvcikKLQkJcmV0dXJuIC1FUk9GUzsKLQllcnIgPSB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0sIGJ1ZiwgbGVuLCBkdHlwZSk7Ci0JaWYgKGVycikgewotCQl1Ymlmc19lcnIoImNoYW5naW5nICVkIGJ5dGVzIGluIExFQiAlZCwgZXJyb3IgJWQiLAotCQkJICBsZW4sIGxudW0sIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgogICogdWJpZnNfZW5jb2RlX2RldiAtIGVuY29kZSBkZXZpY2Ugbm9kZSBJRHMuCiAgKiBAZGV2OiBVQklGUyBkZXZpY2Ugbm9kZSBpbmZvcm1hdGlvbgogICogQHJkZXY6IGRldmljZSBJRHMgdG8gZW5jb2RlCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9vcnBoYW4uYyBiL2ZzL3ViaWZzL29ycGhhbi5jCmluZGV4IGE1NDIyZmYuLmM1NDJjNzMgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL29ycGhhbi5jCisrKyBiL2ZzL3ViaWZzL29ycGhhbi5jCkBAIC05MjksNyArOTI5LDcgQEAKIAlzdHJ1Y3QgY2hlY2tfaW5mbyBjaTsKIAlpbnQgZXJyOwogCi0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX09SUEgpKQorCWlmICghZGJnX2lzX2Noa19vcnBoKGMpKQogCQlyZXR1cm4gMDsKIAogCWNpLmxhc3RfaW5vID0gMDsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3JlY292ZXJ5LmMgYi9mcy91Ymlmcy9yZWNvdmVyeS5jCmluZGV4IDc4M2Q4ZTAuLmFmMDI3OTAgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3JlY292ZXJ5LmMKKysrIGIvZnMvdWJpZnMvcmVjb3ZlcnkuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAJaWYgKCFzYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgc2J1ZiwgMCwgYy0+bGViX3NpemUpOworCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGxudW0sIHNidWYsIDAsIGMtPmxlYl9zaXplLCAwKTsKIAlpZiAoZXJyICYmIGVyciAhPSAtRUJBRE1TRykKIAkJZ290byBvdXRfZnJlZTsKIApAQCAtMjEzLDEwICsyMTMsMTAgQEAKIAltc3QtPmZsYWdzIHw9IGNwdV90b19sZTMyKFVCSUZTX01TVF9SQ1ZSWSk7CiAKIAl1Ymlmc19wcmVwYXJlX25vZGUoYywgbXN0LCBVQklGU19NU1RfTk9ERV9TWiwgMSk7Ci0JZXJyID0gdWJpX2xlYl9jaGFuZ2UoYy0+dWJpLCBsbnVtLCBtc3QsIHN6LCBVQklfU0hPUlRURVJNKTsKKwllcnIgPSB1Ymlmc19sZWJfY2hhbmdlKGMsIGxudW0sIG1zdCwgc3osIFVCSV9TSE9SVFRFUk0pOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHViaV9sZWJfY2hhbmdlKGMtPnViaSwgbG51bSArIDEsIG1zdCwgc3osIFVCSV9TSE9SVFRFUk0pOworCWVyciA9IHViaWZzX2xlYl9jaGFuZ2UoYywgbG51bSArIDEsIG1zdCwgc3osIFVCSV9TSE9SVFRFUk0pOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0Owogb3V0OgpAQCAtMjc0LDcgKzI3NCw4IEBACiAJCQkJaWYgKGNvcjEpCiAJCQkJCWdvdG8gb3V0X2VycjsKIAkJCQltc3QgPSBtc3QxOwotCQkJfSBlbHNlIGlmIChvZmZzMSA9PSAwICYmIG9mZnMyICsgc3ogPj0gYy0+bGViX3NpemUpIHsKKwkJCX0gZWxzZSBpZiAob2ZmczEgPT0gMCAmJgorCQkJCSAgIGMtPmxlYl9zaXplIC0gb2ZmczIgLSBzeiA8IHN6KSB7CiAJCQkJLyogMXN0IExFQiB3YXMgdW5tYXBwZWQgYW5kIHdyaXR0ZW4sIDJuZCBub3QgKi8KIAkJCQlpZiAoY29yMSkKIAkJCQkJZ290byBvdXRfZXJyOwpAQCAtNTM5LDggKzU0MCw4IEBACiAJCQlpbnQgbGVuID0gQUxJR04oZW5kcHQsIGMtPm1pbl9pb19zaXplKTsKIAogCQkJaWYgKHN0YXJ0KSB7Ci0JCQkJZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBzbGViLT5idWYsIDAsCi0JCQkJCSAgICAgICBzdGFydCk7CisJCQkJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgc2xlYi0+YnVmLCAwLAorCQkJCQkJICAgICBzdGFydCwgMSk7CiAJCQkJaWYgKGVycikKIAkJCQkJcmV0dXJuIGVycjsKIAkJCX0KQEAgLTU1NCw4ICs1NTUsOCBAQAogCQkJCQl1Ymlmc19wYWQoYywgYnVmLCBwYWRfbGVuKTsKIAkJCQl9CiAJCQl9Ci0JCQllcnIgPSB1YmlfbGViX2NoYW5nZShjLT51YmksIGxudW0sIHNsZWItPmJ1ZiwgbGVuLAotCQkJCQkgICAgIFVCSV9VTktOT1dOKTsKKwkJCWVyciA9IHViaWZzX2xlYl9jaGFuZ2UoYywgbG51bSwgc2xlYi0+YnVmLCBsZW4sCisJCQkJCSAgICAgICBVQklfVU5LTk9XTik7CiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTgxOSw3ICs4MjAsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlpZiAoYy0+bGViX3NpemUgLSBvZmZzIDwgVUJJRlNfQ1NfTk9ERV9TWikKIAkJZ290byBvdXRfZXJyOwotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgKHZvaWQgKiljc19ub2RlLCBvZmZzLCBVQklGU19DU19OT0RFX1NaKTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCAodm9pZCAqKWNzX25vZGUsIG9mZnMsCisJCQkgICAgIFVCSUZTX0NTX05PREVfU1osIDApOwogCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKQogCQlnb3RvIG91dF9mcmVlOwogCXJldCA9IHViaWZzX3NjYW5fYV9ub2RlKGMsIGNzX25vZGUsIFVCSUZTX0NTX05PREVfU1osIGxudW0sIG9mZnMsIDApOwpAQCAtOTE5LDggKzkyMSw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgaW50IHJlY292ZXJfaGVhZChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIGludCBvZmZzLAotCQkJdm9pZCAqc2J1ZikKK3N0YXRpYyBpbnQgcmVjb3Zlcl9oZWFkKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwgaW50IG9mZnMsIHZvaWQgKnNidWYpCiB7CiAJaW50IGxlbiA9IGMtPm1heF93cml0ZV9zaXplLCBlcnI7CiAKQEAgLTkzMSwxNSArOTMyLDE1IEBACiAJCXJldHVybiAwOwogCiAJLyogUmVhZCBhdCB0aGUgaGVhZCBsb2NhdGlvbiBhbmQgY2hlY2sgaXQgaXMgZW1wdHkgZmxhc2ggKi8KLQllcnIgPSB1YmlfcmVhZChjLT51YmksIGxudW0sIHNidWYsIG9mZnMsIGxlbik7CisJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgc2J1Ziwgb2ZmcywgbGVuLCAxKTsKIAlpZiAoZXJyIHx8ICFpc19lbXB0eShzYnVmLCBsZW4pKSB7CiAJCWRiZ19yY3ZyeSgiY2xlYW5pbmcgaGVhZCBhdCAlZDolZCIsIGxudW0sIG9mZnMpOwogCQlpZiAob2ZmcyA9PSAwKQogCQkJcmV0dXJuIHViaWZzX2xlYl91bm1hcChjLCBsbnVtKTsKLQkJZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBzYnVmLCAwLCBvZmZzKTsKKwkJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgc2J1ZiwgMCwgb2ZmcywgMSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwotCQlyZXR1cm4gdWJpX2xlYl9jaGFuZ2UoYy0+dWJpLCBsbnVtLCBzYnVmLCBvZmZzLCBVQklfVU5LTk9XTik7CisJCXJldHVybiB1Ymlmc19sZWJfY2hhbmdlKGMsIGxudW0sIHNidWYsIG9mZnMsIFVCSV9VTktOT1dOKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTk2Miw3ICs5NjMsNyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAlMCBvbiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwotaW50IHViaWZzX3JlY292ZXJfaW5sX2hlYWRzKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCB2b2lkICpzYnVmKQoraW50IHViaWZzX3JlY292ZXJfaW5sX2hlYWRzKHN0cnVjdCB1Ymlmc19pbmZvICpjLCB2b2lkICpzYnVmKQogewogCWludCBlcnI7CiAKQEAgLTk5Myw3ICs5OTQsNyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAlMCBvbiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIGludCBjbGVhbl9hbl91bmNsZWFuX2xlYihjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKK3N0YXRpYyBpbnQgY2xlYW5fYW5fdW5jbGVhbl9sZWIoc3RydWN0IHViaWZzX2luZm8gKmMsCiAJCQkJc3RydWN0IHViaWZzX3VuY2xlYW5fbGViICp1Y2xlYiwgdm9pZCAqc2J1ZikKIHsKIAlpbnQgZXJyLCBsbnVtID0gdWNsZWItPmxudW0sIG9mZnMgPSAwLCBsZW4gPSB1Y2xlYi0+ZW5kcHQsIHF1aWV0ID0gMTsKQEAgLTEwMDksNyArMTAxMCw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBsZW4pOworCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGxudW0sIGJ1Ziwgb2ZmcywgbGVuLCAwKTsKIAlpZiAoZXJyICYmIGVyciAhPSAtRUJBRE1TRykKIAkJcmV0dXJuIGVycjsKIApAQCAtMTA2OSw3ICsxMDcwLDcgQEAKIAl9CiAKIAkvKiBXcml0ZSBiYWNrIHRoZSBMRUIgYXRvbWljYWxseSAqLwotCWVyciA9IHViaV9sZWJfY2hhbmdlKGMtPnViaSwgbG51bSwgc2J1ZiwgbGVuLCBVQklfVU5LTk9XTik7CisJZXJyID0gdWJpZnNfbGViX2NoYW5nZShjLCBsbnVtLCBzYnVmLCBsZW4sIFVCSV9VTktOT1dOKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMDg5LDcgKzEwOTAsNyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAlMCBvbiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwotaW50IHViaWZzX2NsZWFuX2xlYnMoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIHZvaWQgKnNidWYpCitpbnQgdWJpZnNfY2xlYW5fbGVicyhzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgdm9pZCAqc2J1ZikKIHsKIAlkYmdfcmN2cnkoInJlY292ZXJ5Iik7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZjLT51bmNsZWFuX2xlYl9saXN0KSkgewpAQCAtMTQ1NCw3ICsxNDU1LDcgQEAKIAlpZiAoaV9zaXplID49IGUtPmRfc2l6ZSkKIAkJcmV0dXJuIDA7CiAJLyogUmVhZCB0aGUgTEVCICovCi0JZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBjLT5zYnVmLCAwLCBjLT5sZWJfc2l6ZSk7CisJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgYy0+c2J1ZiwgMCwgYy0+bGViX3NpemUsIDEpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCS8qIENoYW5nZSB0aGUgc2l6ZSBmaWVsZCBhbmQgcmVjYWxjdWxhdGUgdGhlIENSQyAqLwpAQCAtMTQ3MCw3ICsxNDcxLDcgQEAKIAkJbGVuIC09IDE7CiAJbGVuID0gQUxJR04obGVuICsgMSwgYy0+bWluX2lvX3NpemUpOwogCS8qIEF0b21pY2FsbHkgd3JpdGUgdGhlIGZpeGVkIExFQiBiYWNrIGFnYWluICovCi0JZXJyID0gdWJpX2xlYl9jaGFuZ2UoYy0+dWJpLCBsbnVtLCBjLT5zYnVmLCBsZW4sIFVCSV9VTktOT1dOKTsKKwllcnIgPSB1Ymlmc19sZWJfY2hhbmdlKGMsIGxudW0sIGMtPnNidWYsIGxlbiwgVUJJX1VOS05PV04pOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCWRiZ19yY3ZyeSgiaW5vZGUgJWx1IGF0ICVkOiVkIHNpemUgJWxsZCAtPiAlbGxkIiwKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3JlcGxheS5jIGIvZnMvdWJpZnMvcmVwbGF5LmMKaW5kZXggNWU5NzE2MS4uY2NhYmFmMSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvcmVwbGF5LmMKKysrIGIvZnMvdWJpZnMvcmVwbGF5LmMKQEAgLTUyMyw4ICs1MjMsNyBAQAogCWlmICghbGlzdF9pc19sYXN0KCZuZXh0LT5saXN0LCAmamgtPmJ1ZHNfbGlzdCkpCiAJCXJldHVybiAwOwogCi0JZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBuZXh0LT5sbnVtLCAoY2hhciAqKSZkYXRhLAotCQkgICAgICAgbmV4dC0+c3RhcnQsIDQpOworCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIG5leHQtPmxudW0sIChjaGFyICopJmRhdGEsIG5leHQtPnN0YXJ0LCA0LCAxKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvc2IuYyBiL2ZzL3ViaWZzL3NiLmMKaW5kZXggYzYwNmYwMS4uOTNkOTM4YSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvc2IuYworKysgYi9mcy91Ymlmcy9zYi5jCkBAIC02NzQsMTUgKzY3NCwxNSBAQAogCiAJaWYgKGxlbiA9PSAwKSB7CiAJCWRiZ19tbnQoInVubWFwIGVtcHR5IExFQiAlZCIsIGxudW0pOwotCQlyZXR1cm4gdWJpX2xlYl91bm1hcChjLT51YmksIGxudW0pOworCQlyZXR1cm4gdWJpZnNfbGViX3VubWFwKGMsIGxudW0pOwogCX0KIAogCWRiZ19tbnQoImZpeHVwIExFQiAlZCwgZGF0YSBsZW4gJWQiLCBsbnVtLCBsZW4pOwotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYy0+c2J1ZiwgMCwgbGVuKTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBjLT5zYnVmLCAwLCBsZW4sIDEpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlyZXR1cm4gdWJpX2xlYl9jaGFuZ2UoYy0+dWJpLCBsbnVtLCBjLT5zYnVmLCBsZW4sIFVCSV9VTktOT1dOKTsKKwlyZXR1cm4gdWJpZnNfbGViX2NoYW5nZShjLCBsbnVtLCBjLT5zYnVmLCBsZW4sIFVCSV9VTktOT1dOKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9zY2FuLmMgYi9mcy91Ymlmcy9zY2FuLmMKaW5kZXggMzYyMTZiNC4uMzczODNlOCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvc2Nhbi5jCisrKyBiL2ZzL3ViaWZzL3NjYW4uYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnNsZWItPm5vZGVzKTsKIAlzbGViLT5idWYgPSBzYnVmOwogCi0JZXJyID0gdWJpX3JlYWQoYy0+dWJpLCBsbnVtLCBzYnVmICsgb2Zmcywgb2ZmcywgYy0+bGViX3NpemUgLSBvZmZzKTsKKwllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBzYnVmICsgb2Zmcywgb2ZmcywgYy0+bGViX3NpemUgLSBvZmZzLCAwKTsKIAlpZiAoZXJyICYmIGVyciAhPSAtRUJBRE1TRykgewogCQl1Ymlmc19lcnIoImNhbm5vdCByZWFkICVkIGJ5dGVzIGZyb20gTEVCICVkOiVkLCIKIAkJCSAgIiBlcnJvciAlZCIsIGMtPmxlYl9zaXplIC0gb2ZmcywgbG51bSwgb2ZmcywgZXJyKTsKQEAgLTI0MCw3ICsyNDAsNyBAQAogCWludCBsZW47CiAKIAl1Ymlmc19lcnIoImNvcnJ1cHRpb24gYXQgTEVCICVkOiVkIiwgbG51bSwgb2Zmcyk7Ci0JaWYgKGRiZ19mYWlsdXJlX21vZGUpCisJaWYgKGRiZ19pc190c3RfcmN2cnkoYykpCiAJCXJldHVybjsKIAlsZW4gPSBjLT5sZWJfc2l6ZSAtIG9mZnM7CiAJaWYgKGxlbiA+IDgxOTIpCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9zdXBlci5jIGIvZnMvdWJpZnMvc3VwZXIuYwppbmRleCBiNWFlYjVhLi5iMjgxMjEyIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9zdXBlci5jCisrKyBiL2ZzL3ViaWZzL3N1cGVyLmMKQEAgLTg1LDcgKzg1LDcgQEAKIAlpZiAodWktPmRhdGFfbGVuIDwgMCB8fCB1aS0+ZGF0YV9sZW4gPiBVQklGU19NQVhfSU5PX0RBVEEpCiAJCXJldHVybiA0OwogCi0JaWYgKHVpLT54YXR0ciAmJiAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgIT0gU19JRlJFRykKKwlpZiAodWktPnhhdHRyICYmICFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gNTsKIAogCWlmICghdWJpZnNfY29tcHJfcHJlc2VudCh1aS0+Y29tcHJfdHlwZSkpIHsKQEAgLTk0LDcgKzk0LDcgQEAKIAkJCSAgIHViaWZzX2NvbXByX25hbWUodWktPmNvbXByX3R5cGUpKTsKIAl9CiAKLQllcnIgPSBkYmdfY2hlY2tfZGlyX3NpemUoYywgaW5vZGUpOworCWVyciA9IGRiZ19jaGVja19kaXIoYywgaW5vZGUpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTkxNCw3ICs5MTQsNyBAQAogCiAJYy0+ZW1wdHkgPSAxOwogCWZvciAobG51bSA9IDA7IGxudW0gPCBjLT5sZWJfY250OyBsbnVtKyspIHsKLQkJZXJyID0gdWJpX2lzX21hcHBlZChjLT51YmksIGxudW0pOworCQllcnIgPSB1Ymlmc19pc19tYXBwZWQoYywgbG51bSk7CiAJCWlmICh1bmxpa2VseShlcnIgPCAwKSkKIAkJCXJldHVybiBlcnI7CiAJCWlmIChlcnIgPT0gMSkgewpAQCAtMTg0OCw3ICsxODQ4LDYgQEAKIAliZGlfZGVzdHJveSgmYy0+YmRpKTsKIAl1YmlfY2xvc2Vfdm9sdW1lKGMtPnViaSk7CiAJbXV0ZXhfdW5sb2NrKCZjLT51bW91bnRfbXV0ZXgpOwotCWtmcmVlKGMpOwogfQogCiBzdGF0aWMgaW50IHViaWZzX3JlbW91bnRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKQEAgLTE5NzEsNjEgKzE5NzAsNjUgQEAKIAlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIH0KIAorc3RhdGljIHN0cnVjdCB1Ymlmc19pbmZvICphbGxvY191Ymlmc19pbmZvKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKnViaSkKK3sKKwlzdHJ1Y3QgdWJpZnNfaW5mbyAqYzsKKworCWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpZnNfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChjKSB7CisJCXNwaW5fbG9ja19pbml0KCZjLT5jbnRfbG9jayk7CisJCXNwaW5fbG9ja19pbml0KCZjLT5jc19sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmMtPmJ1ZHNfbG9jayk7CisJCXNwaW5fbG9ja19pbml0KCZjLT5zcGFjZV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmMtPm9ycGhhbl9sb2NrKTsKKwkJaW5pdF9yd3NlbSgmYy0+Y29tbWl0X3NlbSk7CisJCW11dGV4X2luaXQoJmMtPmxwX211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+dG5jX211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+bG9nX211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+bXN0X211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+dW1vdW50X211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+YnVfbXV0ZXgpOworCQltdXRleF9pbml0KCZjLT53cml0ZV9yZXNlcnZlX211dGV4KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+Y210X3dxKTsKKwkJYy0+YnVkcyA9IFJCX1JPT1Q7CisJCWMtPm9sZF9pZHggPSBSQl9ST09UOworCQljLT5zaXplX3RyZWUgPSBSQl9ST09UOworCQljLT5vcnBoX3RyZWUgPSBSQl9ST09UOworCQlJTklUX0xJU1RfSEVBRCgmYy0+aW5mb3NfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5pZHhfZ2MpOworCQlJTklUX0xJU1RfSEVBRCgmYy0+cmVwbGF5X2xpc3QpOworCQlJTklUX0xJU1RfSEVBRCgmYy0+cmVwbGF5X2J1ZHMpOworCQlJTklUX0xJU1RfSEVBRCgmYy0+dW5jYXRfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5lbXB0eV9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPmZyZWVhYmxlX2xpc3QpOworCQlJTklUX0xJU1RfSEVBRCgmYy0+ZnJkaV9pZHhfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT51bmNsZWFuX2xlYl9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPm9sZF9idWRzKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPm9ycGhfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5vcnBoX25ldyk7CisJCWMtPm5vX2Noa19kYXRhX2NyYyA9IDE7CisKKwkJYy0+aGlnaGVzdF9pbnVtID0gVUJJRlNfRklSU1RfSU5POworCQljLT5saGVhZF9sbnVtID0gYy0+bHRhaWxfbG51bSA9IFVCSUZTX0xPR19MTlVNOworCisJCXViaV9nZXRfdm9sdW1lX2luZm8odWJpLCAmYy0+dmkpOworCQl1YmlfZ2V0X2RldmljZV9pbmZvKGMtPnZpLnViaV9udW0sICZjLT5kaSk7CisJfQorCXJldHVybiBjOworfQorCiBzdGF0aWMgaW50IHViaWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKLQlzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICp1YmkgPSBzYi0+c19mc19pbmZvOwotCXN0cnVjdCB1Ymlmc19pbmZvICpjOworCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gc2ItPnNfZnNfaW5mbzsKIAlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CiAJaW50IGVycjsKIAotCWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpZnNfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2tfaW5pdCgmYy0+Y250X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZjLT5jc19sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYy0+YnVkc19sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYy0+c3BhY2VfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmMtPm9ycGhhbl9sb2NrKTsKLQlpbml0X3J3c2VtKCZjLT5jb21taXRfc2VtKTsKLQltdXRleF9pbml0KCZjLT5scF9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmYy0+dG5jX211dGV4KTsKLQltdXRleF9pbml0KCZjLT5sb2dfbXV0ZXgpOwotCW11dGV4X2luaXQoJmMtPm1zdF9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmYy0+dW1vdW50X211dGV4KTsKLQltdXRleF9pbml0KCZjLT5idV9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmYy0+d3JpdGVfcmVzZXJ2ZV9tdXRleCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+Y210X3dxKTsKLQljLT5idWRzID0gUkJfUk9PVDsKLQljLT5vbGRfaWR4ID0gUkJfUk9PVDsKLQljLT5zaXplX3RyZWUgPSBSQl9ST09UOwotCWMtPm9ycGhfdHJlZSA9IFJCX1JPT1Q7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPmluZm9zX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjLT5pZHhfZ2MpOwotCUlOSVRfTElTVF9IRUFEKCZjLT5yZXBsYXlfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPnJlcGxheV9idWRzKTsKLQlJTklUX0xJU1RfSEVBRCgmYy0+dW5jYXRfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPmVtcHR5X2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjLT5mcmVlYWJsZV9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmYy0+ZnJkaV9pZHhfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPnVuY2xlYW5fbGViX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjLT5vbGRfYnVkcyk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPm9ycGhfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmMtPm9ycGhfbmV3KTsKLQljLT5ub19jaGtfZGF0YV9jcmMgPSAxOwotCiAJYy0+dmZzX3NiID0gc2I7Ci0JYy0+aGlnaGVzdF9pbnVtID0gVUJJRlNfRklSU1RfSU5POwotCWMtPmxoZWFkX2xudW0gPSBjLT5sdGFpbF9sbnVtID0gVUJJRlNfTE9HX0xOVU07Ci0KLQl1YmlfZ2V0X3ZvbHVtZV9pbmZvKHViaSwgJmMtPnZpKTsKLQl1YmlfZ2V0X2RldmljZV9pbmZvKGMtPnZpLnViaV9udW0sICZjLT5kaSk7Ci0KIAkvKiBSZS1vcGVuIHRoZSBVQkkgZGV2aWNlIGluIHJlYWQtd3JpdGUgbW9kZSAqLwogCWMtPnViaSA9IHViaV9vcGVuX3ZvbHVtZShjLT52aS51YmlfbnVtLCBjLT52aS52b2xfaWQsIFVCSV9SRUFEV1JJVEUpOwogCWlmIChJU19FUlIoYy0+dWJpKSkgewogCQllcnIgPSBQVFJfRVJSKGMtPnViaSk7Ci0JCWdvdG8gb3V0X2ZyZWU7CisJCWdvdG8gb3V0OwogCX0KIAogCS8qCkBAIC0yMDkxLDI0ICsyMDk0LDI5IEBACiAJYmRpX2Rlc3Ryb3koJmMtPmJkaSk7CiBvdXRfY2xvc2U6CiAJdWJpX2Nsb3NlX3ZvbHVtZShjLT51YmkpOwotb3V0X2ZyZWU6Ci0Ja2ZyZWUoYyk7CitvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBzYl90ZXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCiB7Ci0JZGV2X3QgKmRldiA9IGRhdGE7CisJc3RydWN0IHViaWZzX2luZm8gKmMxID0gZGF0YTsKIAlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IHNiLT5zX2ZzX2luZm87CiAKLQlyZXR1cm4gYy0+dmkuY2RldiA9PSAqZGV2OworCXJldHVybiBjLT52aS5jZGV2ID09IGMxLT52aS5jZGV2OworfQorCitzdGF0aWMgaW50IHNiX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQoreworCXNiLT5zX2ZzX2luZm8gPSBkYXRhOworCXJldHVybiBzZXRfYW5vbl9zdXBlcihzYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp1Ymlmc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAogCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICp1Ymk7Ci0Jc3RydWN0IHViaV92b2x1bWVfaW5mbyB2aTsKKwlzdHJ1Y3QgdWJpZnNfaW5mbyAqYzsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwogCWludCBlcnI7CiAKQEAgLTIxMjUsMTkgKzIxMzMsMjUgQEAKIAkJCW5hbWUsIChpbnQpUFRSX0VSUih1YmkpKTsKIAkJcmV0dXJuIEVSUl9DQVNUKHViaSk7CiAJfQotCXViaV9nZXRfdm9sdW1lX2luZm8odWJpLCAmdmkpOwogCi0JZGJnX2dlbigib3BlbmVkIHViaSVkXyVkIiwgdmkudWJpX251bSwgdmkudm9sX2lkKTsKKwljID0gYWxsb2NfdWJpZnNfaW5mbyh1YmkpOworCWlmICghYykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CiAKLQlzYiA9IHNnZXQoZnNfdHlwZSwgJnNiX3Rlc3QsICZzZXRfYW5vbl9zdXBlciwgJnZpLmNkZXYpOworCWRiZ19nZW4oIm9wZW5lZCB1YmklZF8lZCIsIGMtPnZpLnViaV9udW0sIGMtPnZpLnZvbF9pZCk7CisKKwlzYiA9IHNnZXQoZnNfdHlwZSwgc2JfdGVzdCwgc2Jfc2V0LCBjKTsKIAlpZiAoSVNfRVJSKHNiKSkgewogCQllcnIgPSBQVFJfRVJSKHNiKTsKKwkJa2ZyZWUoYyk7CiAJCWdvdG8gb3V0X2Nsb3NlOwogCX0KIAogCWlmIChzYi0+c19yb290KSB7CiAJCXN0cnVjdCB1Ymlmc19pbmZvICpjMSA9IHNiLT5zX2ZzX2luZm87Ci0KKwkJa2ZyZWUoYyk7CiAJCS8qIEEgbmV3IG1vdW50IHBvaW50IGZvciBhbHJlYWR5IG1vdW50ZWQgVUJJRlMgKi8KIAkJZGJnX2dlbigidGhpcyB1Ymkgdm9sdW1lIGlzIGFscmVhZHkgbW91bnRlZCIpOwogCQlpZiAoISEoZmxhZ3MgJiBNU19SRE9OTFkpICE9IGMxLT5yb19tb3VudCkgewpAQCAtMjE0NiwxMSArMjE2MCw2IEBACiAJCX0KIAl9IGVsc2UgewogCQlzYi0+c19mbGFncyA9IGZsYWdzOwotCQkvKgotCQkgKiBQYXNzICd1YmknIHRvICdmaWxsX3N1cGVyKCknIGluIHNiLT5zX2ZzX2luZm8gd2hlcmUgaXQgaXMKLQkJICogcmVwbGFjZWQgYnkgJ2MnLgotCQkgKi8KLQkJc2ItPnNfZnNfaW5mbyA9IHViaTsKIAkJZXJyID0gdWJpZnNfZmlsbF9zdXBlcihzYiwgZGF0YSwgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9kZWFjdDsKQEAgLTIxNzAsMTEgKzIxNzksMTggQEAKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCitzdGF0aWMgdm9pZCBraWxsX3ViaWZzX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IHMtPnNfZnNfaW5mbzsKKwlraWxsX2Fub25fc3VwZXIocyk7CisJa2ZyZWUoYyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB1Ymlmc19mc190eXBlID0gewogCS5uYW1lICAgID0gInViaWZzIiwKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAogCS5tb3VudCAgID0gdWJpZnNfbW91bnQsCi0JLmtpbGxfc2IgPSBraWxsX2Fub25fc3VwZXIsCisJLmtpbGxfc2IgPSBraWxsX3ViaWZzX3N1cGVyLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3RuYy5jIGIvZnMvdWJpZnMvdG5jLmMKaW5kZXggOTFiNDIxMy4uMDY2NzM4NiAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvdG5jLmMKKysrIGIvZnMvdWJpZnMvdG5jLmMKQEAgLTIyMyw3ICsyMjMsNyBAQAogCV9fc2V0X2JpdChESVJUWV9aTk9ERSwgJnpuLT5mbGFncyk7CiAJX19jbGVhcl9iaXQoQ09XX1pOT0RFLCAmem4tPmZsYWdzKTsKIAotCXViaWZzX2Fzc2VydCghdGVzdF9iaXQoT0JTT0xFVEVfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpKTsKKwl1Ymlmc19hc3NlcnQoIXViaWZzX3puX29ic29sZXRlKHpub2RlKSk7CiAJX19zZXRfYml0KE9CU09MRVRFX1pOT0RFLCAmem5vZGUtPmZsYWdzKTsKIAogCWlmICh6bm9kZS0+bGV2ZWwgIT0gMCkgewpAQCAtMjcxLDcgKzI3MSw3IEBACiAJc3RydWN0IHViaWZzX3pub2RlICp6bjsKIAlpbnQgZXJyOwogCi0JaWYgKCF0ZXN0X2JpdChDT1dfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpKSB7CisJaWYgKCF1Ymlmc196bl9jb3coem5vZGUpKSB7CiAJCS8qIHpub2RlIGlzIG5vdCBiZWluZyBjb21taXR0ZWQgKi8KIAkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KERJUlRZX1pOT0RFLCAmem5vZGUtPmZsYWdzKSkgewogCQkJYXRvbWljX2xvbmdfaW5jKCZjLT5kaXJ0eV96bl9jbnQpOwpAQCAtNDYyLDcgKzQ2Miw3IEBACiAKIAlkYmdfaW8oIkxFQiAlZDolZCwgJXMsIGxlbmd0aCAlZCIsIGxudW0sIG9mZnMsIGRiZ19udHlwZSh0eXBlKSwgbGVuKTsKIAotCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBsZW4pOworCWVyciA9IHViaWZzX2xlYl9yZWFkKGMsIGxudW0sIGJ1Ziwgb2ZmcywgbGVuLCAxKTsKIAlpZiAoZXJyKSB7CiAJCXViaWZzX2VycigiY2Fubm90IHJlYWQgbm9kZSB0eXBlICVkIGZyb20gTEVCICVkOiVkLCBlcnJvciAlZCIsCiAJCQkgIHR5cGUsIGxudW0sIG9mZnMsIGVycik7CkBAIC0xNjY2LDcgKzE2NjYsNyBAQAogCWlmICghb3ZlcmxhcCkgewogCQkvKiBXZSBtYXkgc2FmZWx5IHVubG9jayB0aGUgd3JpdGUtYnVmZmVyIGFuZCByZWFkIHRoZSBkYXRhICovCiAJCXNwaW5fdW5sb2NrKCZ3YnVmLT5sb2NrKTsKLQkJcmV0dXJuIHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnVmLCBvZmZzLCBsZW4pOworCQlyZXR1cm4gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgYnVmLCBvZmZzLCBsZW4sIDApOwogCX0KIAogCS8qIERvbid0IHJlYWQgdW5kZXIgd2J1ZiAqLwpAQCAtMTY4MCw3ICsxNjgwLDcgQEAKIAogCWlmIChybGVuID4gMCkKIAkJLyogUmVhZCBldmVyeXRoaW5nIHRoYXQgZ29lcyBiZWZvcmUgd3JpdGUtYnVmZmVyICovCi0JCXJldHVybiB1YmlfcmVhZChjLT51YmksIGxudW0sIGJ1Ziwgb2Zmcywgcmxlbik7CisJCXJldHVybiB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBidWYsIG9mZnMsIHJsZW4sIDApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzY3LDcgKzE3NjcsNyBAQAogCWlmICh3YnVmKQogCQllcnIgPSByZWFkX3didWYod2J1ZiwgYnUtPmJ1ZiwgbGVuLCBsbnVtLCBvZmZzKTsKIAllbHNlCi0JCWVyciA9IHViaV9yZWFkKGMtPnViaSwgbG51bSwgYnUtPmJ1Ziwgb2ZmcywgbGVuKTsKKwkJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgYnUtPmJ1Ziwgb2ZmcywgbGVuLCAwKTsKIAogCS8qIENoZWNrIGZvciBhIHJhY2Ugd2l0aCBHQyAqLwogCWlmIChtYXliZV9sZWJfZ2NlZChjLCBsbnVtLCBidS0+Z2Nfc2VxKSkKQEAgLTI0MjMsNyArMjQyMyw3IEBACiAJICovCiAKIAlkbyB7Ci0JCXViaWZzX2Fzc2VydCghdGVzdF9iaXQoT0JTT0xFVEVfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpKTsKKwkJdWJpZnNfYXNzZXJ0KCF1Ymlmc196bl9vYnNvbGV0ZSh6bm9kZSkpOwogCQl1Ymlmc19hc3NlcnQodWJpZnNfem5fZGlydHkoem5vZGUpKTsKIAogCQl6cCA9IHpub2RlLT5wYXJlbnQ7CkBAIC0yNDc5LDkgKzI0NzksOCBAQAogCQkJYy0+enJvb3Qub2ZmcyA9IHpici0+b2ZmczsKIAkJCWMtPnpyb290LmxlbiA9IHpici0+bGVuOwogCQkJYy0+enJvb3Quem5vZGUgPSB6bm9kZTsKLQkJCXViaWZzX2Fzc2VydCghdGVzdF9iaXQoT0JTT0xFVEVfWk5PREUsCi0JCQkJICAgICAmenAtPmZsYWdzKSk7Ci0JCQl1Ymlmc19hc3NlcnQodGVzdF9iaXQoRElSVFlfWk5PREUsICZ6cC0+ZmxhZ3MpKTsKKwkJCXViaWZzX2Fzc2VydCghdWJpZnNfem5fb2Jzb2xldGUoenApKTsKKwkJCXViaWZzX2Fzc2VydCh1Ymlmc196bl9kaXJ0eSh6cCkpOwogCQkJYXRvbWljX2xvbmdfZGVjKCZjLT5kaXJ0eV96bl9jbnQpOwogCiAJCQlpZiAoenAtPmNuZXh0KSB7CkBAIC0yODY1LDcgKzI4NjQsNyBAQAogCQlzdHJ1Y3QgdWJpZnNfem5vZGUgKnpub2RlID0gY25leHQ7CiAKIAkJY25leHQgPSBjbmV4dC0+Y25leHQ7Ci0JCWlmICh0ZXN0X2JpdChPQlNPTEVURV9aTk9ERSwgJnpub2RlLT5mbGFncykpCisJCWlmICh1Ymlmc196bl9vYnNvbGV0ZSh6bm9kZSkpCiAJCQlrZnJlZSh6bm9kZSk7CiAJfSB3aGlsZSAoY25leHQgJiYgY25leHQgIT0gYy0+Y25leHQpOwogfQpAQCAtMzMwMSw3ICszMzAwLDcgQEAKIAogCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKIAkJcmV0dXJuIDA7Ci0JaWYgKCEodWJpZnNfY2hrX2ZsYWdzICYgVUJJRlNfQ0hLX0dFTikpCisJaWYgKCFkYmdfaXNfY2hrX2dlbihjKSkKIAkJcmV0dXJuIDA7CiAKIAlibG9jayA9IChzaXplICsgVUJJRlNfQkxPQ0tfU0laRSAtIDEpID4+IFVCSUZTX0JMT0NLX1NISUZUOwpAQCAtMzMzNyw5ICszMzM2LDEwIEBACiAJdWJpZnNfZXJyKCJpbm9kZSAlbHUgaGFzIHNpemUgJWxsZCwgYnV0IHRoZXJlIGFyZSBkYXRhIGF0IG9mZnNldCAlbGxkICIKIAkJICAiKGRhdGEga2V5ICVzKSIsICh1bnNpZ25lZCBsb25nKWlub2RlLT5pX2lubywgc2l6ZSwKIAkJICAoKGxvZmZfdClibG9jaykgPDwgVUJJRlNfQkxPQ0tfU0hJRlQsIERCR0tFWShrZXkpKTsKKwltdXRleF91bmxvY2soJmMtPnRuY19tdXRleCk7CiAJZGJnX2R1bXBfaW5vZGUoYywgaW5vZGUpOwogCWRiZ19kdW1wX3N0YWNrKCk7Ci0JZXJyID0gLUVJTlZBTDsKKwlyZXR1cm4gLUVJTlZBTDsKIAogb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJmMtPnRuY19tdXRleCk7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy90bmNfY29tbWl0LmMgYi9mcy91Ymlmcy90bmNfY29tbWl0LmMKaW5kZXggNDE5MjBmMy4uNGMxNWYwNyAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvdG5jX2NvbW1pdC5jCisrKyBiL2ZzL3ViaWZzL3RuY19jb21taXQuYwpAQCAtMjIsNiArMjIsNyBAQAogCiAvKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBUTkMgZnVuY3Rpb25zIGZvciBjb21taXR0aW5nICovCiAKKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlICJ1Ymlmcy5oIgogCiAvKioKQEAgLTg3LDggKzg4LDEyIEBACiAJYXRvbWljX2xvbmdfZGVjKCZjLT5kaXJ0eV96bl9jbnQpOwogCiAJdWJpZnNfYXNzZXJ0KHViaWZzX3puX2RpcnR5KHpub2RlKSk7Ci0JdWJpZnNfYXNzZXJ0KHRlc3RfYml0KENPV19aTk9ERSwgJnpub2RlLT5mbGFncykpOworCXViaWZzX2Fzc2VydCh1Ymlmc196bl9jb3coem5vZGUpKTsKIAorCS8qCisJICogTm90ZSwgdW5saWtlICd3cml0ZV9pbmRleCgpJyB3ZSBkbyBub3QgYWRkIG1lbW9yeSBiYXJyaWVycyBoZXJlCisJICogYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIEBjLT50bmNfbXV0ZXggbG9ja2VkLgorCSAqLwogCV9fY2xlYXJfYml0KERJUlRZX1pOT0RFLCAmem5vZGUtPmZsYWdzKTsKIAlfX2NsZWFyX2JpdChDT1dfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpOwogCkBAIC0zNzcsNyArMzgyLDcgQEAKIAkJCQljLT5nYXBfbGVicyA9IE5VTEw7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KLQkJCWlmIChkYmdfZm9yY2VfaW5fdGhlX2dhcHNfZW5hYmxlZCgpKSB7CisJCQlpZiAoIWRiZ19pc19jaGtfaW5kZXgoYykpIHsKIAkJCQkvKgogCQkJCSAqIERvIG5vdCBwcmludCBzY2FyeSB3YXJuaW5ncyBpZiB0aGUgZGVidWdnaW5nCiAJCQkJICogb3B0aW9uIHdoaWNoIGZvcmNlcyBpbi10aGUtZ2FwcyBpcyBlbmFibGVkLgpAQCAtNDkxLDI1ICs0OTYsNiBAQAogCQllbHNlCiAJCQluZXh0X2xlbiA9IHViaWZzX2lkeF9ub2RlX3N6KGMsIGNuZXh0LT5jaGlsZF9jbnQpOwogCi0JCWlmIChjLT5taW5faW9fc2l6ZSA9PSAxKSB7Ci0JCQlidWZfb2ZmcyArPSBBTElHTihsZW4sIDgpOwotCQkJaWYgKG5leHRfbGVuKSB7Ci0JCQkJaWYgKGJ1Zl9vZmZzICsgbmV4dF9sZW4gPD0gYy0+bGViX3NpemUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWVyciA9IHViaWZzX3VwZGF0ZV9vbmVfbHAoYywgbG51bSwgMCwKLQkJCQkJCWMtPmxlYl9zaXplIC0gYnVmX29mZnMsIDAsIDApOwotCQkJCWlmIChlcnIpCi0JCQkJCXJldHVybiBlcnI7Ci0JCQkJbG51bSA9IC0xOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZXJyID0gdWJpZnNfdXBkYXRlX29uZV9scChjLCBsbnVtLAotCQkJCQljLT5sZWJfc2l6ZSAtIGJ1Zl9vZmZzLCAwLCAwLCAwKTsKLQkJCWlmIChlcnIpCi0JCQkJcmV0dXJuIGVycjsKLQkJCWJyZWFrOwotCQl9Ci0KIAkJLyogVXBkYXRlIGJ1ZmZlciBwb3NpdGlvbnMgKi8KIAkJd2xlbiA9IHVzZWQgKyBsZW47CiAJCXVzZWQgKz0gQUxJR04obGVuLCA4KTsKQEAgLTY1OCw3ICs2NDQsNyBAQAogCX0KIAljbnQgKz0gMTsKIAl3aGlsZSAoMSkgewotCQl1Ymlmc19hc3NlcnQoIXRlc3RfYml0KENPV19aTk9ERSwgJnpub2RlLT5mbGFncykpOworCQl1Ymlmc19hc3NlcnQoIXViaWZzX3puX2Nvdyh6bm9kZSkpOwogCQlfX3NldF9iaXQoQ09XX1pOT0RFLCAmem5vZGUtPmZsYWdzKTsKIAkJem5vZGUtPmFsdCA9IDA7CiAJCWNuZXh0ID0gZmluZF9uZXh0X2RpcnR5KHpub2RlKTsKQEAgLTcwNCw3ICs2OTAsNyBAQAogCQljLT5pbGVic1tjLT5pbGViX2NudCsrXSA9IGxudW07CiAJCWRiZ19jbXQoIkxFQiAlZCIsIGxudW0pOwogCX0KLQlpZiAoZGJnX2ZvcmNlX2luX3RoZV9nYXBzKCkpCisJaWYgKGRiZ19pc19jaGtfaW5kZXgoYykgJiYgIShyYW5kb20zMigpICYgNykpCiAJCXJldHVybiAtRU5PU1BDOwogCXJldHVybiAwOwogfQpAQCAtODMwLDcgKzgxNiw3IEBACiAJc3RydWN0IHViaWZzX2lkeF9ub2RlICppZHg7CiAJc3RydWN0IHViaWZzX3pub2RlICp6bm9kZSwgKmNuZXh0OwogCWludCBpLCBsbnVtLCBvZmZzLCBsZW4sIG5leHRfbGVuLCBidWZfbGVuLCBidWZfb2ZmcywgdXNlZDsKLQlpbnQgYXZhaWwsIHdsZW4sIGVyciwgbG51bV9wb3MgPSAwOworCWludCBhdmFpbCwgd2xlbiwgZXJyLCBsbnVtX3BvcyA9IDAsIGJsZW4sIG54dF9vZmZzOwogCiAJY25leHQgPSBjLT5lbmV4dDsKIAlpZiAoIWNuZXh0KQpAQCAtOTA3LDcgKzg5Myw3IEBACiAJCWNuZXh0ID0gem5vZGUtPmNuZXh0OwogCiAJCXViaWZzX2Fzc2VydCh1Ymlmc196bl9kaXJ0eSh6bm9kZSkpOwotCQl1Ymlmc19hc3NlcnQodGVzdF9iaXQoQ09XX1pOT0RFLCAmem5vZGUtPmZsYWdzKSk7CisJCXViaWZzX2Fzc2VydCh1Ymlmc196bl9jb3coem5vZGUpKTsKIAogCQkvKgogCQkgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCBvdGhlciB0aHJlYWRzIHNob3VsZCBzZWUgJURJUlRZX1pOT0RFCkBAIC05MjIsNiArOTA4LDI4IEBACiAJCWNsZWFyX2JpdChDT1dfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpOwogCQlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOwogCisJCS8qCisJCSAqIFdlIGhhdmUgbWFya2VkIHRoZSB6bm9kZSBhcyBjbGVhbiBidXQgaGF2ZSBub3QgdXBkYXRlZCB0aGUKKwkJICogQGMtPmNsZWFuX3puX2NudCBjb3VudGVyLiBJZiB0aGlzIHpub2RlIGJlY29tZXMgZGlydHkgYWdhaW4KKwkJICogYmVmb3JlICdmcmVlX29ic29sZXRlX3pub2RlcygpJyBpcyBjYWxsZWQsIHRoZW4KKwkJICogQGMtPmNsZWFuX3puX2NudCB3aWxsIGJlIGRlY3JlbWVudGVkIGJlZm9yZSBpdCBnZXRzCisJCSAqIGluY3JlbWVudGVkIChyZXN1bHRpbmcgaW4gMiBkZWNyZW1lbnRzIGZvciB0aGUgc2FtZSB6bm9kZSkuCisJCSAqIFRoaXMgbWVhbnMgdGhhdCBAYy0+Y2xlYW5fem5fY250IG1heSBiZWNvbWUgbmVnYXRpdmUgZm9yIGEKKwkJICogd2hpbGUuCisJCSAqCisJCSAqIFE6IHdoeSB3ZSBjYW5ub3QgaW5jcmVtZW50IEBjLT5jbGVhbl96bl9jbnQ/CisJCSAqIEE6IGJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgdGhlIEBjLT50bmNfbXV0ZXggbG9ja2VkLCBhbmQgdGhlCisJCSAqICAgIGZvbGxvd2luZyBjb2RlIHdvdWxkIGJlIHJhY3kgYW5kIGJ1Z2d5OgorCQkgKgorCQkgKiAgICBpZiAoIXViaWZzX3puX29ic29sZXRlKHpub2RlKSkgeworCQkgKiAgICAgICAgICAgIGF0b21pY19sb25nX2luYygmYy0+Y2xlYW5fem5fY250KTsKKwkJICogICAgICAgICAgICBhdG9taWNfbG9uZ19pbmMoJnViaWZzX2NsZWFuX3puX2NudCk7CisJCSAqICAgIH0KKwkJICoKKwkJICogICAgVGh1cywgd2UganVzdCBkZWxheSB0aGUgQGMtPmNsZWFuX3puX2NudCB1cGRhdGUgdW50aWwgd2UKKwkJICogICAgaGF2ZSB0aGUgbXV0ZXggbG9ja2VkLgorCQkgKi8KKwogCQkvKiBEbyBub3QgYWNjZXNzIHpub2RlIGZyb20gdGhpcyBwb2ludCBvbiAqLwogCiAJCS8qIFVwZGF0ZSBidWZmZXIgcG9zaXRpb25zICovCkBAIC05MzgsNjUgKzk0NiwzOCBAQAogCQllbHNlCiAJCQluZXh0X2xlbiA9IHViaWZzX2lkeF9ub2RlX3N6KGMsIGNuZXh0LT5jaGlsZF9jbnQpOwogCi0JCWlmIChjLT5taW5faW9fc2l6ZSA9PSAxKSB7Ci0JCQkvKgotCQkJICogV3JpdGUgdGhlIHByZXBhcmVkIGluZGV4IG5vZGUgaW1tZWRpYXRlbHkgaWYgdGhlcmUgaXMKLQkJCSAqIG5vIG1pbmltdW0gSU8gc2l6ZQotCQkJICovCi0JCQllcnIgPSB1Ymlmc19sZWJfd3JpdGUoYywgbG51bSwgYy0+Y2J1ZiwgYnVmX29mZnMsCi0JCQkJCSAgICAgIHdsZW4sIFVCSV9TSE9SVFRFUk0pOwotCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gZXJyOwotCQkJYnVmX29mZnMgKz0gQUxJR04od2xlbiwgOCk7Ci0JCQlpZiAobmV4dF9sZW4pIHsKLQkJCQl1c2VkID0gMDsKLQkJCQlhdmFpbCA9IGJ1Zl9sZW47Ci0JCQkJaWYgKGJ1Zl9vZmZzICsgbmV4dF9sZW4gPiBjLT5sZWJfc2l6ZSkgewotCQkJCQllcnIgPSB1Ymlmc191cGRhdGVfb25lX2xwKGMsIGxudW0sCi0JCQkJCQlMUFJPUFNfTkMsIDAsIDAsIExQUk9QU19UQUtFTik7Ci0JCQkJCWlmIChlcnIpCi0JCQkJCQlyZXR1cm4gZXJyOwotCQkJCQlsbnVtID0gLTE7Ci0JCQkJfQorCQlueHRfb2ZmcyA9IGJ1Zl9vZmZzICsgdXNlZCArIG5leHRfbGVuOworCQlpZiAobmV4dF9sZW4gJiYgbnh0X29mZnMgPD0gYy0+bGViX3NpemUpIHsKKwkJCWlmIChhdmFpbCA+IDApCiAJCQkJY29udGludWU7Ci0JCQl9CisJCQllbHNlCisJCQkJYmxlbiA9IGJ1Zl9sZW47CiAJCX0gZWxzZSB7Ci0JCQlpbnQgYmxlbiwgbnh0X29mZnMgPSBidWZfb2ZmcyArIHVzZWQgKyBuZXh0X2xlbjsKKwkJCXdsZW4gPSBBTElHTih3bGVuLCA4KTsKKwkJCWJsZW4gPSBBTElHTih3bGVuLCBjLT5taW5faW9fc2l6ZSk7CisJCQl1Ymlmc19wYWQoYywgYy0+Y2J1ZiArIHdsZW4sIGJsZW4gLSB3bGVuKTsKKwkJfQogCi0JCQlpZiAobmV4dF9sZW4gJiYgbnh0X29mZnMgPD0gYy0+bGViX3NpemUpIHsKLQkJCQlpZiAoYXZhaWwgPiAwKQotCQkJCQljb250aW51ZTsKLQkJCQllbHNlCi0JCQkJCWJsZW4gPSBidWZfbGVuOwotCQkJfSBlbHNlIHsKLQkJCQl3bGVuID0gQUxJR04od2xlbiwgOCk7Ci0JCQkJYmxlbiA9IEFMSUdOKHdsZW4sIGMtPm1pbl9pb19zaXplKTsKLQkJCQl1Ymlmc19wYWQoYywgYy0+Y2J1ZiArIHdsZW4sIGJsZW4gLSB3bGVuKTsKKwkJLyogVGhlIGJ1ZmZlciBpcyBmdWxsIG9yIHRoZXJlIGFyZSBubyBtb3JlIHpub2RlcyB0byBkbyAqLworCQllcnIgPSB1Ymlmc19sZWJfd3JpdGUoYywgbG51bSwgYy0+Y2J1ZiwgYnVmX29mZnMsIGJsZW4sCisJCQkJICAgICAgVUJJX1NIT1JUVEVSTSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlidWZfb2ZmcyArPSBibGVuOworCQlpZiAobmV4dF9sZW4pIHsKKwkJCWlmIChueHRfb2ZmcyA+IGMtPmxlYl9zaXplKSB7CisJCQkJZXJyID0gdWJpZnNfdXBkYXRlX29uZV9scChjLCBsbnVtLCBMUFJPUFNfTkMsIDAsCisJCQkJCQkJICAwLCBMUFJPUFNfVEFLRU4pOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQkJbG51bSA9IC0xOwogCQkJfQotCQkJLyoKLQkJCSAqIFRoZSBidWZmZXIgaXMgZnVsbCBvciB0aGVyZSBhcmUgbm8gbW9yZSB6bm9kZXMKLQkJCSAqIHRvIGRvCi0JCQkgKi8KLQkJCWVyciA9IHViaWZzX2xlYl93cml0ZShjLCBsbnVtLCBjLT5jYnVmLCBidWZfb2ZmcywKLQkJCQkJICAgICAgYmxlbiwgVUJJX1NIT1JUVEVSTSk7Ci0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7Ci0JCQlidWZfb2ZmcyArPSBibGVuOwotCQkJaWYgKG5leHRfbGVuKSB7Ci0JCQkJaWYgKG54dF9vZmZzID4gYy0+bGViX3NpemUpIHsKLQkJCQkJZXJyID0gdWJpZnNfdXBkYXRlX29uZV9scChjLCBsbnVtLAotCQkJCQkJTFBST1BTX05DLCAwLCAwLCBMUFJPUFNfVEFLRU4pOwotCQkJCQlpZiAoZXJyKQotCQkJCQkJcmV0dXJuIGVycjsKLQkJCQkJbG51bSA9IC0xOwotCQkJCX0KLQkJCQl1c2VkIC09IGJsZW47Ci0JCQkJaWYgKHVzZWQgPCAwKQotCQkJCQl1c2VkID0gMDsKLQkJCQlhdmFpbCA9IGJ1Zl9sZW4gLSB1c2VkOwotCQkJCW1lbW1vdmUoYy0+Y2J1ZiwgYy0+Y2J1ZiArIGJsZW4sIHVzZWQpOwotCQkJCWNvbnRpbnVlOwotCQkJfQorCQkJdXNlZCAtPSBibGVuOworCQkJaWYgKHVzZWQgPCAwKQorCQkJCXVzZWQgPSAwOworCQkJYXZhaWwgPSBidWZfbGVuIC0gdXNlZDsKKwkJCW1lbW1vdmUoYy0+Y2J1ZiwgYy0+Y2J1ZiArIGJsZW4sIHVzZWQpOworCQkJY29udGludWU7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtMTAyOSw3ICsxMDEwLDcgQEAKIAlkbyB7CiAJCXpub2RlID0gY25leHQ7CiAJCWNuZXh0ID0gem5vZGUtPmNuZXh0OwotCQlpZiAodGVzdF9iaXQoT0JTT0xFVEVfWk5PREUsICZ6bm9kZS0+ZmxhZ3MpKQorCQlpZiAodWJpZnNfem5fb2Jzb2xldGUoem5vZGUpKQogCQkJa2ZyZWUoem5vZGUpOwogCQllbHNlIHsKIAkJCXpub2RlLT5jbmV4dCA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy91Ymlmcy5oIGIvZnMvdWJpZnMvdWJpZnMuaAppbmRleCBmNzk5ODNkLi4yN2YyMjU1IDEwMDY0NAotLS0gYS9mcy91Ymlmcy91Ymlmcy5oCisrKyBiL2ZzL3ViaWZzL3ViaWZzLmgKQEAgLTIzMCwxNCArMjMwLDE0IEBACiAgKiBMUFQgY25vZGUgZmxhZyBiaXRzLgogICoKICAqIERJUlRZX0NOT0RFOiBjbm9kZSBpcyBkaXJ0eQotICogQ09XX0NOT0RFOiBjbm9kZSBpcyBiZWluZyBjb21taXR0ZWQgYW5kIG11c3QgYmUgY29waWVkIGJlZm9yZSB3cml0aW5nCiAgKiBPQlNPTEVURV9DTk9ERTogY25vZGUgaXMgYmVpbmcgY29tbWl0dGVkIGFuZCBoYXMgYmVlbiBjb3BpZWQgKG9yIGRlbGV0ZWQpLAotICogc28gaXQgY2FuIChhbmQgbXVzdCkgYmUgZnJlZWQgd2hlbiB0aGUgY29tbWl0IGlzIGZpbmlzaGVkCisgKiAgICAgICAgICAgICAgICAgc28gaXQgY2FuIChhbmQgbXVzdCkgYmUgZnJlZWQgd2hlbiB0aGUgY29tbWl0IGlzIGZpbmlzaGVkCisgKiBDT1dfQ05PREU6IGNub2RlIGlzIGJlaW5nIGNvbW1pdHRlZCBhbmQgbXVzdCBiZSBjb3BpZWQgYmVmb3JlIHdyaXRpbmcKICAqLwogZW51bSB7CiAJRElSVFlfQ05PREUgICAgPSAwLAotCUNPV19DTk9ERSAgICAgID0gMSwKLQlPQlNPTEVURV9DTk9ERSA9IDIsCisJT0JTT0xFVEVfQ05PREUgPSAxLAorCUNPV19DTk9ERSAgICAgID0gMiwKIH07CiAKIC8qCkBAIC0xNDY4LDYgKzE0NjgsMTUgQEAKIAogLyogaW8uYyAqLwogdm9pZCB1Ymlmc19yb19tb2RlKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgZXJyKTsKK2ludCB1Ymlmc19sZWJfcmVhZChjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIHZvaWQgKmJ1ZiwgaW50IG9mZnMsCisJCSAgIGludCBsZW4sIGludCBldmVuX2ViYWRtc2cpOworaW50IHViaWZzX2xlYl93cml0ZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgaW50IGxudW0sIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG9mZnMsCisJCSAgICBpbnQgbGVuLCBpbnQgZHR5cGUpOworaW50IHViaWZzX2xlYl9jaGFuZ2Uoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4sCisJCSAgICAgaW50IGR0eXBlKTsKK2ludCB1Ymlmc19sZWJfdW5tYXAoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtKTsKK2ludCB1Ymlmc19sZWJfbWFwKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSwgaW50IGR0eXBlKTsKK2ludCB1Ymlmc19pc19tYXBwZWQoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtKTsKIGludCB1Ymlmc193YnVmX3dyaXRlX25vbG9jayhzdHJ1Y3QgdWJpZnNfd2J1ZiAqd2J1Ziwgdm9pZCAqYnVmLCBpbnQgbGVuKTsKIGludCB1Ymlmc193YnVmX3NlZWtfbm9sb2NrKHN0cnVjdCB1Ymlmc193YnVmICp3YnVmLCBpbnQgbG51bSwgaW50IG9mZnMsCiAJCQkgICBpbnQgZHR5cGUpOwpAQCAtMTcyMCw3ICsxNzI5LDcgQEAKIGludCB1Ymlmc19jYWxjX2RhcmsoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBzcGMpOwogCiAvKiBmaWxlLmMgKi8KLWludCB1Ymlmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKTsKK2ludCB1Ymlmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpOwogaW50IHViaWZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwogCiAvKiBkaXIuYyAqLwpAQCAtMTc0Nyw4ICsxNzU2LDggQEAKIAkJCQkJIGludCBvZmZzLCB2b2lkICpzYnVmLCBpbnQgamhlYWQpOwogc3RydWN0IHViaWZzX3NjYW5fbGViICp1Ymlmc19yZWNvdmVyX2xvZ19sZWIoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLAogCQkJCQkgICAgIGludCBvZmZzLCB2b2lkICpzYnVmKTsKLWludCB1Ymlmc19yZWNvdmVyX2lubF9oZWFkcyhjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgdm9pZCAqc2J1Zik7Ci1pbnQgdWJpZnNfY2xlYW5fbGVicyhjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgdm9pZCAqc2J1Zik7CitpbnQgdWJpZnNfcmVjb3Zlcl9pbmxfaGVhZHMoc3RydWN0IHViaWZzX2luZm8gKmMsIHZvaWQgKnNidWYpOworaW50IHViaWZzX2NsZWFuX2xlYnMoc3RydWN0IHViaWZzX2luZm8gKmMsIHZvaWQgKnNidWYpOwogaW50IHViaWZzX3JjdnJ5X2djX2NvbW1pdChzdHJ1Y3QgdWJpZnNfaW5mbyAqYyk7CiBpbnQgdWJpZnNfcmVjb3Zlcl9zaXplX2FjY3VtKHN0cnVjdCB1Ymlmc19pbmZvICpjLCB1bmlvbiB1Ymlmc19rZXkgKmtleSwKIAkJCSAgICAgaW50IGRlbGV0aW9uLCBsb2ZmX3QgbmV3X3NpemUpOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2ZpbGUuYyBiL2ZzL3VkZi9maWxlLmMKaW5kZXggMmEzNDZiYi4uZDhmZmE3YyAxMDA2NDQKLS0tIGEvZnMvdWRmL2ZpbGUuYworKysgYi9mcy91ZGYvZmlsZS5jCkBAIC0xNTAsNyArMTUwLDcgQEAKIAlsb25nIG9sZF9ibG9jaywgbmV3X2Jsb2NrOwogCWludCByZXN1bHQgPSAtRUlOVkFMOwogCi0JaWYgKGZpbGVfcGVybWlzc2lvbihmaWxwLCBNQVlfUkVBRCkgIT0gMCkgeworCWlmIChpbm9kZV9wZXJtaXNzaW9uKGlub2RlLCBNQVlfUkVBRCkgIT0gMCkgewogCQl1ZGZfZGVidWcoIm5vIHBlcm1pc3Npb24gdG8gYWNjZXNzIGlub2RlICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKIAkJcmVzdWx0ID0gLUVQRVJNOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9uYW1laS5jIGIvZnMvdWZzL25hbWVpLmMKaW5kZXggMjkzMDllMi4uNjM5ZDQ5MSAxMDA2NDQKLS0tIGEvZnMvdWZzL25hbWVpLmMKKysrIGIvZnMvdWZzL25hbWVpLmMKQEAgLTU2LDE2ICs1NiwxMCBAQAogCiAJbG9ja191ZnMoZGlyLT5pX3NiKTsKIAlpbm8gPSB1ZnNfaW5vZGVfYnlfbmFtZShkaXIsICZkZW50cnktPmRfbmFtZSk7Ci0JaWYgKGlubykgeworCWlmIChpbm8pCiAJCWlub2RlID0gdWZzX2lnZXQoZGlyLT5pX3NiLCBpbm8pOwotCQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQkJdW5sb2NrX3VmcyhkaXItPmlfc2IpOwotCQkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKLQkJfQotCX0KIAl1bmxvY2tfdWZzKGRpci0+aV9zYik7Ci0JZF9hZGQoZGVudHJ5LCBpbm9kZSk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL01ha2VmaWxlIGIvZnMveGZzL01ha2VmaWxlCmluZGV4IDI4NGE3YzguLjc1YmIzMTYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9NYWtlZmlsZQorKysgYi9mcy94ZnMvTWFrZWZpbGUKQEAgLTg4LDggKzg4LDYgQEAKIAkJCQkgICB4ZnNfdm5vZGVvcHMubyBcCiAJCQkJICAgeGZzX3J3Lm8KIAoteGZzLSQoQ09ORklHX1hGU19UUkFDRSkJCSs9IHhmc19idHJlZV90cmFjZS5vCi0KICMgT2JqZWN0cyBpbiBsaW51eC8KIHhmcy15CQkJCSs9ICQoYWRkcHJlZml4ICQoWEZTX0xJTlVYKS8sIFwKIAkJCQkgICBrbWVtLm8gXApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYWNsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19hY2wuYwppbmRleCAzOWY0ZjgwLi40NGNlNTE2IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19hY2wuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hY2wuYwpAQCAtMTE0LDYgKzExNCw4IEBACiAJaWYgKGFjbCAhPSBBQ0xfTk9UX0NBQ0hFRCkKIAkJcmV0dXJuIGFjbDsKIAorCXRyYWNlX3hmc19nZXRfYWNsKGlwKTsKKwogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgogCQllYV9uYW1lID0gU0dJX0FDTF9GSUxFOwpAQCAtMjE4LDQwICsyMjAsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotaW50Ci14ZnNfY2hlY2tfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IHhmc19pbm9kZSAqaXA7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqYWNsOwotCWludCBlcnJvciA9IC1FQUdBSU47Ci0KLQlpcCA9IFhGU19JKGlub2RlKTsKLQl0cmFjZV94ZnNfY2hlY2tfYWNsKGlwKTsKLQotCS8qCi0JICogSWYgdGhlcmUgaXMgbm8gYXR0cmlidXRlIGZvcmsgbm8gQUNMIGV4aXN0cyBvbiB0aGlzIGlub2RlIGFuZAotCSAqIHdlIGNhbiBza2lwIHRoZSB3aG9sZSBleGVyY2lzZS4KLQkgKi8KLQlpZiAoIVhGU19JRk9SS19RKGlwKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkgewotCQlpZiAoIW5lZ2F0aXZlX2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUykpCi0JCQlyZXR1cm4gLUVDSElMRDsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0JYWNsID0geGZzX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0JaWYgKElTX0VSUihhY2wpKQotCQlyZXR1cm4gUFRSX0VSUihhY2wpOwotCWlmIChhY2wpIHsKLQkJZXJyb3IgPSBwb3NpeF9hY2xfcGVybWlzc2lvbihpbm9kZSwgYWNsLCBtYXNrKTsKLQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKLQl9Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIHN0YXRpYyBpbnQKIHhmc19zZXRfbW9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBtb2RlX3QgbW9kZSkKIHsKQEAgLTI2NCw3ICsyMzIsNyBAQAogCQlpYXR0ci5pYV9tb2RlID0gbW9kZTsKIAkJaWF0dHIuaWFfY3RpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwogCi0JCWVycm9yID0gLXhmc19zZXRhdHRyKFhGU19JKGlub2RlKSwgJmlhdHRyLCBYRlNfQVRUUl9OT0FDTCk7CisJCWVycm9yID0gLXhmc19zZXRhdHRyX25vbnNpemUoWEZTX0koaW5vZGUpLCAmaWF0dHIsIFhGU19BVFRSX05PQUNMKTsKIAl9CiAKIAlyZXR1cm4gZXJyb3I7CkBAIC0yOTcsMjkgKzI2NSwyMyBAQAogICogTm8gbmVlZCBmb3IgaV9tdXRleCBiZWNhdXNlIHRoZSBpbm9kZSBpcyBub3QgeWV0IGV4cG9zZWQgdG8gdGhlIFZGUy4KICAqLwogaW50Ci14ZnNfaW5oZXJpdF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqZGVmYXVsdF9hY2wpCit4ZnNfaW5oZXJpdF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqYWNsKQogewotCXN0cnVjdCBwb3NpeF9hY2wgKmNsb25lOwotCW1vZGVfdCBtb2RlOworCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAlpbnQgZXJyb3IgPSAwLCBpbmhlcml0ID0gMDsKIAogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCWVycm9yID0geGZzX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGRlZmF1bHRfYWNsKTsKKwkJZXJyb3IgPSB4ZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKIAkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOworCQkJZ290byBvdXQ7CiAJfQogCi0JY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoZGVmYXVsdF9hY2wsIEdGUF9LRVJORUwpOwotCWlmICghY2xvbmUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlX21hc3EoY2xvbmUsICZtb2RlKTsKKwllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX0tFUk5FTCwgJm1vZGUpOwogCWlmIChlcnJvciA8IDApCi0JCWdvdG8gb3V0X3JlbGVhc2VfY2xvbmU7CisJCXJldHVybiBlcnJvcjsKIAogCS8qCi0JICogSWYgcG9zaXhfYWNsX2NyZWF0ZV9tYXNxIHJldHVybnMgYSBwb3NpdGl2ZSB2YWx1ZSB3ZSBuZWVkIHRvCisJICogSWYgcG9zaXhfYWNsX2NyZWF0ZSByZXR1cm5zIGEgcG9zaXRpdmUgdmFsdWUgd2UgbmVlZCB0bwogCSAqIGluaGVyaXQgYSBwZXJtaXNzaW9uIHRoYXQgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgdXNpbmcgdGhlIFVuaXgKIAkgKiBtb2RlIGJpdHMgYW5kIHdlIGFjdHVhbGx5IG5lZWQgdG8gc2V0IGFuIEFDTC4KIAkgKi8KQEAgLTMyOCwyMCArMjkwLDIwIEBACiAKIAllcnJvciA9IHhmc19zZXRfbW9kZShpbm9kZSwgbW9kZSk7CiAJaWYgKGVycm9yKQotCQlnb3RvIG91dF9yZWxlYXNlX2Nsb25lOworCQlnb3RvIG91dDsKIAogCWlmIChpbmhlcml0KQotCQllcnJvciA9IHhmc19zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKKwkJZXJyb3IgPSB4ZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBhY2wpOwogCi0gb3V0X3JlbGVhc2VfY2xvbmU6Ci0JcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworb3V0OgorCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CiAJcmV0dXJuIGVycm9yOwogfQogCiBpbnQKIHhmc19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpjbG9uZTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJaW50IGVycm9yOwogCiAJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCkBAIC0zNTEsMTYgKzMxMywxMiBAQAogCWlmIChJU19FUlIoYWNsKSB8fCAhYWNsKQogCQlyZXR1cm4gUFRSX0VSUihhY2wpOwogCi0JY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKKwllcnJvciA9IHBvc2l4X2FjbF9jaG1vZCgmYWNsLCBHRlBfS0VSTkVMLCBpbm9kZS0+aV9tb2RlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0geGZzX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCWlmICghY2xvbmUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyb3IgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7Ci0JaWYgKCFlcnJvcikKLQkJZXJyb3IgPSB4ZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7Ci0KLQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKaW5kZXggNzljZTM4Yi4uNjNlOTcxZSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwpAQCAtMTgxLDYgKzE4MSw3IEBACiAKIAlpc2l6ZSA9IHhmc19pb2VuZF9uZXdfZW9mKGlvZW5kKTsKIAlpZiAoaXNpemUpIHsKKwkJdHJhY2VfeGZzX3NldGZpbGVzaXplKGlwLCBpb2VuZC0+aW9fb2Zmc2V0LCBpb2VuZC0+aW9fc2l6ZSk7CiAJCWlwLT5pX2QuZGlfc2l6ZSA9IGlzaXplOwogCQl4ZnNfbWFya19pbm9kZV9kaXJ0eShpcCk7CiAJfQpAQCAtODk0LDExICs4OTUsNiBAQAogICogRm9yIHVud3JpdHRlbiBzcGFjZSBvbiB0aGUgcGFnZSB3ZSBuZWVkIHRvIHN0YXJ0IHRoZSBjb252ZXJzaW9uIHRvCiAgKiByZWd1bGFyIGFsbG9jYXRlZCBzcGFjZS4KICAqIEZvciBhbnkgb3RoZXIgZGlydHkgYnVmZmVyIGhlYWRzIG9uIHRoZSBwYWdlIHdlIHNob3VsZCBmbHVzaCB0aGVtLgotICoKLSAqIElmIHdlIGRldGVjdCB0aGF0IGEgdHJhbnNhY3Rpb24gd291bGQgYmUgcmVxdWlyZWQgdG8gZmx1c2ggdGhlIHBhZ2UsIHdlCi0gKiBoYXZlIHRvIGNoZWNrIHRoZSBwcm9jZXNzIGZsYWdzIGZpcnN0LCBpZiB3ZSBhcmUgYWxyZWFkeSBpbiBhIHRyYW5zYWN0aW9uCi0gKiBvciBkaXNrIEkvTyBkdXJpbmcgYWxsb2NhdGlvbnMgaXMgb2ZmLCB3ZSBuZWVkIHRvIGZhaWwgdGhlIHdyaXRlcGFnZSBhbmQKLSAqIHJlZGlydHkgdGhlIHBhZ2UuCiAgKi8KIFNUQVRJQyBpbnQKIHhmc192bV93cml0ZXBhZ2UoCkBAIC05MDYsNyArOTAyLDYgQEAKIAlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKIHsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0JaW50CQkJZGVsYWxsb2MsIHVud3JpdHRlbjsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqaGVhZDsKIAlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwlpbWFwOwogCXhmc19pb2VuZF90CQkqaW9lbmQgPSBOVUxMLCAqaW9oZWFkID0gTlVMTDsKQEAgLTkzOCwxNSArOTMzLDEwIEBACiAJCWdvdG8gcmVkaXJ0eTsKIAogCS8qCi0JICogV2UgbmVlZCBhIHRyYW5zYWN0aW9uIGlmIHRoZXJlIGFyZSBkZWxhbGxvYyBvciB1bndyaXR0ZW4gYnVmZmVycwotCSAqIG9uIHRoZSBwYWdlLgotCSAqCi0JICogSWYgd2UgbmVlZCBhIHRyYW5zYWN0aW9uIGFuZCB0aGUgcHJvY2VzcyBmbGFncyBzYXkgd2UgYXJlIGFscmVhZHkKLQkgKiBpbiBhIHRyYW5zYWN0aW9uLCBvciBubyBJTyBpcyBhbGxvd2VkIHRoZW4gbWFyayB0aGUgcGFnZSBkaXJ0eQotCSAqIGFnYWluIGFuZCBsZWF2ZSB0aGUgcGFnZSBhcyBpcy4KKwkgKiBHaXZlbiB0aGF0IHdlIGRvIG5vdCBhbGxvdyBkaXJlY3QgcmVjbGFpbSB0byBjYWxsIHVzLCB3ZSBzaG91bGQKKwkgKiBuZXZlciBiZSBjYWxsZWQgd2hpbGUgaW4gYSBmaWxlc3lzdGVtIHRyYW5zYWN0aW9uLgogCSAqLwotCXhmc19jb3VudF9wYWdlX3N0YXRlKHBhZ2UsICZkZWxhbGxvYywgJnVud3JpdHRlbik7Ci0JaWYgKChjdXJyZW50LT5mbGFncyAmIFBGX0ZTVFJBTlMpICYmIChkZWxhbGxvYyB8fCB1bndyaXR0ZW4pKQorCWlmIChXQVJOX09OKGN1cnJlbnQtPmZsYWdzICYgUEZfRlNUUkFOUykpCiAJCWdvdG8gcmVkaXJ0eTsKIAogCS8qIElzIHRoaXMgcGFnZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZT8gKi8KQEAgLTk3MCw3ICs5NjAsNyBAQAogCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOwogCXR5cGUgPSBJT19PVkVSV1JJVEU7CiAKLQlpZiAod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19OT05FICYmIHdiYy0+bm9uYmxvY2tpbmcpCisJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSkKIAkJbm9uYmxvY2tpbmcgPSAxOwogCiAJZG8gewpAQCAtMTMzOSw2ICsxMzI5LDkgQEAKIAl9IGVsc2UgewogCQl4ZnNfZmluaXNoX2lvZW5kX3N5bmMoaW9lbmQpOwogCX0KKworCS8qIFhYWDogcHJvYmFibHkgc2hvdWxkIG1vdmUgaW50byB0aGUgcmVhbCBJL08gY29tcGxldGlvbiBoYW5kbGVyICovCisJaW5vZGVfZGlvX2RvbmUoaW9lbmQtPmlvX2lub2RlKTsKIH0KIAogU1RBVElDIHNzaXplX3QKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKaW5kZXggNWU2ODA5OS4uYjJiNDExOSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKQEAgLTQ5OSwxNiArNDk5LDE0IEBACiAJc3Bpbl91bmxvY2soJnBhZy0+cGFnX2J1Zl9sb2NrKTsKIAl4ZnNfcGVyYWdfcHV0KHBhZyk7CiAKLQlpZiAoeGZzX2J1Zl9jb25kX2xvY2soYnApKSB7Ci0JCS8qIGZhaWxlZCwgc28gd2FpdCBmb3IgdGhlIGxvY2sgaWYgcmVxdWVzdGVkLiAqLwotCQlpZiAoIShmbGFncyAmIFhCRl9UUllMT0NLKSkgewotCQkJeGZzX2J1Zl9sb2NrKGJwKTsKLQkJCVhGU19TVEFUU19JTkMoeGJfZ2V0X2xvY2tlZF93YWl0ZWQpOwotCQl9IGVsc2UgeworCWlmICgheGZzX2J1Zl90cnlsb2NrKGJwKSkgeworCQlpZiAoZmxhZ3MgJiBYQkZfVFJZTE9DSykgewogCQkJeGZzX2J1Zl9yZWxlKGJwKTsKIAkJCVhGU19TVEFUU19JTkMoeGJfYnVzeV9sb2NrZWQpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KKwkJeGZzX2J1Zl9sb2NrKGJwKTsKKwkJWEZTX1NUQVRTX0lOQyh4Yl9nZXRfbG9ja2VkX3dhaXRlZCk7CiAJfQogCiAJLyoKQEAgLTU5NCwxMCArNTkyLDggQEAKIAlBU1NFUlQoIShmbGFncyAmIChYQkZfREVMV1JJfFhCRl9XUklURSkpKTsKIAlBU1NFUlQoYnAtPmJfYm4gIT0gWEZTX0JVRl9EQUREUl9OVUxMKTsKIAotCWJwLT5iX2ZsYWdzICY9IH4oWEJGX1dSSVRFIHwgWEJGX0FTWU5DIHwgWEJGX0RFTFdSSSB8IFwKLQkJCVhCRl9SRUFEX0FIRUFEIHwgX1hCRl9SVU5fUVVFVUVTKTsKLQlicC0+Yl9mbGFncyB8PSBmbGFncyAmIChYQkZfUkVBRCB8IFhCRl9BU1lOQyB8IFwKLQkJCVhCRl9SRUFEX0FIRUFEIHwgX1hCRl9SVU5fUVVFVUVTKTsKKwlicC0+Yl9mbGFncyAmPSB+KFhCRl9XUklURSB8IFhCRl9BU1lOQyB8IFhCRl9ERUxXUkkgfCBYQkZfUkVBRF9BSEVBRCk7CisJYnAtPmJfZmxhZ3MgfD0gZmxhZ3MgJiAoWEJGX1JFQUQgfCBYQkZfQVNZTkMgfCBYQkZfUkVBRF9BSEVBRCk7CiAKIAlzdGF0dXMgPSB4ZnNfYnVmX2lvcmVxdWVzdChicCk7CiAJaWYgKHN0YXR1cyB8fCBYRlNfQlVGX0lTRVJST1IoYnApIHx8IChmbGFncyAmIFhCRl9BU1lOQykpCkBAIC02ODEsNyArNjc3LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKiBzZXQgdXAgdGhlIGJ1ZmZlciBmb3IgYSByZWFkIElPICovCi0JeGZzX2J1Zl9sb2NrKGJwKTsKIAlYRlNfQlVGX1NFVF9BRERSKGJwLCBkYWRkcik7CiAJWEZTX0JVRl9SRUFEKGJwKTsKIAlYRlNfQlVGX0JVU1koYnApOwpAQCAtODE2LDggKzgxMSw2IEBACiAJCWdvdG8gZmFpbF9mcmVlX21lbTsKIAl9CiAKLQl4ZnNfYnVmX3VubG9jayhicCk7Ci0KIAl0cmFjZV94ZnNfYnVmX2dldF91bmNhY2hlZChicCwgX1JFVF9JUF8pOwogCXJldHVybiBicDsKIApAQCAtODk2LDggKzg4OSw4IEBACiAgKgl0byBwdXNoIG9uIHN0YWxlIGlub2RlIGJ1ZmZlcnMuCiAgKi8KIGludAoteGZzX2J1Zl9jb25kX2xvY2soCi0JeGZzX2J1Zl90CQkqYnApCit4ZnNfYnVmX3RyeWxvY2soCisJc3RydWN0IHhmc19idWYJCSpicCkKIHsKIAlpbnQJCQlsb2NrZWQ7CiAKQEAgLTkwNywxNSArOTAwLDggQEAKIAllbHNlIGlmIChhdG9taWNfcmVhZCgmYnAtPmJfcGluX2NvdW50KSAmJiAoYnAtPmJfZmxhZ3MgJiBYQkZfU1RBTEUpKQogCQl4ZnNfbG9nX2ZvcmNlKGJwLT5iX3RhcmdldC0+YnRfbW91bnQsIDApOwogCi0JdHJhY2VfeGZzX2J1Zl9jb25kX2xvY2soYnAsIF9SRVRfSVBfKTsKLQlyZXR1cm4gbG9ja2VkID8gMCA6IC1FQlVTWTsKLX0KLQotaW50Ci14ZnNfYnVmX2xvY2tfdmFsdWUoCi0JeGZzX2J1Zl90CQkqYnApCi17Ci0JcmV0dXJuIGJwLT5iX3NlbWEuY291bnQ7CisJdHJhY2VfeGZzX2J1Zl90cnlsb2NrKGJwLCBfUkVUX0lQXyk7CisJcmV0dXJuIGxvY2tlZDsKIH0KIAogLyoKQEAgLTkyOSw3ICs5MTUsNyBAQAogICovCiB2b2lkCiB4ZnNfYnVmX2xvY2soCi0JeGZzX2J1Zl90CQkqYnApCisJc3RydWN0IHhmc19idWYJCSpicCkKIHsKIAl0cmFjZV94ZnNfYnVmX2xvY2soYnAsIF9SRVRfSVBfKTsKIApAQCAtOTUwLDcgKzkzNiw3IEBACiAgKi8KIHZvaWQKIHhmc19idWZfdW5sb2NrKAotCXhmc19idWZfdAkJKmJwKQorCXN0cnVjdCB4ZnNfYnVmCQkqYnApCiB7CiAJaWYgKChicC0+Yl9mbGFncyAmIChYQkZfREVMV1JJfF9YQkZfREVMV1JJX1EpKSA9PSBYQkZfREVMV1JJKSB7CiAJCWF0b21pY19pbmMoJmJwLT5iX2hvbGQpOwpAQCAtMTEyMSw3ICsxMTA3LDcgQEAKIAlYRlNfQlVGX1VOREVMQVlXUklURShicCk7CiAJWEZTX0JVRl9ET05FKGJwKTsKIAlYRlNfQlVGX1NUQUxFKGJwKTsKLQlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CisJYnAtPmJfaW9kb25lID0gTlVMTDsKIAlpZiAoIShmbCAmIFhCRl9BU1lOQykpIHsKIAkJLyoKIAkJICogTWFyayBiX2Vycm9yIGFuZCBCX0VSUk9SIF9ib3RoXy4KQEAgLTEyMjMsMjMgKzEyMDksMjEgQEAKIAl0b3RhbF9ucl9wYWdlcyA9IGJwLT5iX3BhZ2VfY291bnQ7CiAJbWFwX2kgPSAwOwogCi0JaWYgKGJwLT5iX2ZsYWdzICYgWEJGX09SREVSRUQpIHsKLQkJQVNTRVJUKCEoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkpOwotCQlydyA9IFdSSVRFX0ZMVVNIX0ZVQTsKLQl9IGVsc2UgaWYgKGJwLT5iX2ZsYWdzICYgWEJGX0xPR19CVUZGRVIpIHsKLQkJQVNTRVJUKCEoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRF9BSEVBRCkpOwotCQlicC0+Yl9mbGFncyAmPSB+X1hCRl9SVU5fUVVFVUVTOwotCQlydyA9IChicC0+Yl9mbGFncyAmIFhCRl9XUklURSkgPyBXUklURV9TWU5DIDogUkVBRF9TWU5DOwotCX0gZWxzZSBpZiAoYnAtPmJfZmxhZ3MgJiBfWEJGX1JVTl9RVUVVRVMpIHsKLQkJQVNTRVJUKCEoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRF9BSEVBRCkpOwotCQlicC0+Yl9mbGFncyAmPSB+X1hCRl9SVU5fUVVFVUVTOwotCQlydyA9IChicC0+Yl9mbGFncyAmIFhCRl9XUklURSkgPyBXUklURV9NRVRBIDogUkVBRF9NRVRBOworCWlmIChicC0+Yl9mbGFncyAmIFhCRl9XUklURSkgeworCQlpZiAoYnAtPmJfZmxhZ3MgJiBYQkZfU1lOQ0lPKQorCQkJcncgPSBXUklURV9TWU5DOworCQllbHNlCisJCQlydyA9IFdSSVRFOworCQlpZiAoYnAtPmJfZmxhZ3MgJiBYQkZfRlVBKQorCQkJcncgfD0gUkVRX0ZVQTsKKwkJaWYgKGJwLT5iX2ZsYWdzICYgWEJGX0ZMVVNIKQorCQkJcncgfD0gUkVRX0ZMVVNIOworCX0gZWxzZSBpZiAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRF9BSEVBRCkgeworCQlydyA9IFJFQURBOwogCX0gZWxzZSB7Ci0JCXJ3ID0gKGJwLT5iX2ZsYWdzICYgWEJGX1dSSVRFKSA/IFdSSVRFIDoKLQkJICAgICAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRF9BSEVBRCkgPyBSRUFEQSA6IFJFQUQ7CisJCXJ3ID0gUkVBRDsKIAl9CiAKLQogbmV4dF9jaHVuazoKIAlhdG9taWNfaW5jKCZicC0+Yl9pb19yZW1haW5pbmcpOwogCW5yX3BhZ2VzID0gQklPX01BWF9TRUNUT1JTID4+IChQQUdFX1NISUZUIC0gQkJTSElGVCk7CkBAIC0xNjk0LDE1ICsxNjc4LDE0IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJwLCBuLCBkd3EsIGJfbGlzdCkgewogCQlBU1NFUlQoYnAtPmJfZmxhZ3MgJiBYQkZfREVMV1JJKTsKIAotCQlpZiAoIVhGU19CVUZfSVNQSU5ORUQoYnApICYmICF4ZnNfYnVmX2NvbmRfbG9jayhicCkpIHsKKwkJaWYgKCFYRlNfQlVGX0lTUElOTkVEKGJwKSAmJiB4ZnNfYnVmX3RyeWxvY2soYnApKSB7CiAJCQlpZiAoIWZvcmNlICYmCiAJCQkgICAgdGltZV9iZWZvcmUoamlmZmllcywgYnAtPmJfcXVldWV0aW1lICsgYWdlKSkgewogCQkJCXhmc19idWZfdW5sb2NrKGJwKTsKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJYnAtPmJfZmxhZ3MgJj0gfihYQkZfREVMV1JJfF9YQkZfREVMV1JJX1F8Ci0JCQkJCSBfWEJGX1JVTl9RVUVVRVMpOworCQkJYnAtPmJfZmxhZ3MgJj0gfihYQkZfREVMV1JJIHwgX1hCRl9ERUxXUklfUSk7CiAJCQlicC0+Yl9mbGFncyB8PSBYQkZfV1JJVEU7CiAJCQlsaXN0X21vdmVfdGFpbCgmYnAtPmJfbGlzdCwgbGlzdCk7CiAJCQl0cmFjZV94ZnNfYnVmX2RlbHdyaV9zcGxpdChicCwgX1JFVF9JUF8pOwpAQCAtMTczOCwxNCArMTcyMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKLXhmc19idWZfZGVsd3JpX3NvcnQoCi0JeGZzX2J1ZnRhcmdfdAkqdGFyZ2V0LAotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCi17Ci0JbGlzdF9zb3J0KE5VTEwsIGxpc3QsIHhmc19idWZfY21wKTsKLX0KLQogU1RBVElDIGludAogeGZzYnVmZCgKIAl2b2lkCQkqZGF0YSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKaW5kZXggNTBhN2Q1Zi4uNmE4M2I0NiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKQEAgLTQ2LDQzICs0Niw0NiBAQAogCiAjZGVmaW5lIFhCRl9SRUFECSgxIDw8IDApIC8qIGJ1ZmZlciBpbnRlbmRlZCBmb3IgcmVhZGluZyBmcm9tIGRldmljZSAqLwogI2RlZmluZSBYQkZfV1JJVEUJKDEgPDwgMSkgLyogYnVmZmVyIGludGVuZGVkIGZvciB3cml0aW5nIHRvIGRldmljZSAqLwotI2RlZmluZSBYQkZfTUFQUEVECSgxIDw8IDIpIC8qIGJ1ZmZlciBtYXBwZWQgKGJfYWRkciB2YWxpZCkgKi8KKyNkZWZpbmUgWEJGX1JFQURfQUhFQUQJKDEgPDwgMikgLyogYXN5bmNocm9ub3VzIHJlYWQtYWhlYWQgKi8KKyNkZWZpbmUgWEJGX01BUFBFRAkoMSA8PCAzKSAvKiBidWZmZXIgbWFwcGVkIChiX2FkZHIgdmFsaWQpICovCiAjZGVmaW5lIFhCRl9BU1lOQwkoMSA8PCA0KSAvKiBpbml0aWF0b3Igd2lsbCBub3Qgd2FpdCBmb3IgY29tcGxldGlvbiAqLwogI2RlZmluZSBYQkZfRE9ORQkoMSA8PCA1KSAvKiBhbGwgcGFnZXMgaW4gdGhlIGJ1ZmZlciB1cHRvZGF0ZSAqLwogI2RlZmluZSBYQkZfREVMV1JJCSgxIDw8IDYpIC8qIGJ1ZmZlciBoYXMgZGlydHkgcGFnZXMgKi8KICNkZWZpbmUgWEJGX1NUQUxFCSgxIDw8IDcpIC8qIGJ1ZmZlciBoYXMgYmVlbiBzdGFsZWQsIGRvIG5vdCBmaW5kIGl0ICovCi0jZGVmaW5lIFhCRl9PUkRFUkVECSgxIDw8IDExKS8qIHVzZSBvcmRlcmVkIHdyaXRlcyAqLwotI2RlZmluZSBYQkZfUkVBRF9BSEVBRAkoMSA8PCAxMikvKiBhc3luY2hyb25vdXMgcmVhZC1haGVhZCAqLwotI2RlZmluZSBYQkZfTE9HX0JVRkZFUgkoMSA8PCAxMykvKiB0aGlzIGlzIGEgYnVmZmVyIHVzZWQgZm9yIHRoZSBsb2cgKi8KKworLyogSS9PIGhpbnRzIGZvciB0aGUgQklPIGxheWVyICovCisjZGVmaW5lIFhCRl9TWU5DSU8JKDEgPDwgMTApLyogdHJlYXQgdGhpcyBidWZmZXIgYXMgc3luY2hyb25vdXMgSS9PICovCisjZGVmaW5lIFhCRl9GVUEJCSgxIDw8IDExKS8qIGZvcmNlIGNhY2hlIHdyaXRlIHRocm91Z2ggbW9kZSAqLworI2RlZmluZSBYQkZfRkxVU0gJKDEgPDwgMTIpLyogZmx1c2ggdGhlIGRpc2sgY2FjaGUgYmVmb3JlIGEgd3JpdGUgKi8KIAogLyogZmxhZ3MgdXNlZCBvbmx5IGFzIGFyZ3VtZW50cyB0byBhY2Nlc3Mgcm91dGluZXMgKi8KLSNkZWZpbmUgWEJGX0xPQ0sJKDEgPDwgMTQpLyogbG9jayByZXF1ZXN0ZWQgKi8KLSNkZWZpbmUgWEJGX1RSWUxPQ0sJKDEgPDwgMTUpLyogbG9jayByZXF1ZXN0ZWQsIGJ1dCBkbyBub3Qgd2FpdCAqLwotI2RlZmluZSBYQkZfRE9OVF9CTE9DSwkoMSA8PCAxNikvKiBkbyBub3QgYmxvY2sgaW4gY3VycmVudCB0aHJlYWQgKi8KKyNkZWZpbmUgWEJGX0xPQ0sJKDEgPDwgMTUpLyogbG9jayByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgWEJGX1RSWUxPQ0sJKDEgPDwgMTYpLyogbG9jayByZXF1ZXN0ZWQsIGJ1dCBkbyBub3Qgd2FpdCAqLworI2RlZmluZSBYQkZfRE9OVF9CTE9DSwkoMSA8PCAxNykvKiBkbyBub3QgYmxvY2sgaW4gY3VycmVudCB0aHJlYWQgKi8KIAogLyogZmxhZ3MgdXNlZCBvbmx5IGludGVybmFsbHkgKi8KLSNkZWZpbmUgX1hCRl9QQUdFUwkoMSA8PCAxOCkvKiBiYWNrZWQgYnkgcmVmY291bnRlZCBwYWdlcyAqLwotI2RlZmluZQlfWEJGX1JVTl9RVUVVRVMJKDEgPDwgMTkpLyogcnVuIGJsb2NrIGRldmljZSB0YXNrIHF1ZXVlCSovCi0jZGVmaW5lCV9YQkZfS01FTQkoMSA8PCAyMCkvKiBiYWNrZWQgYnkgaGVhcCBtZW1vcnkgKi8KLSNkZWZpbmUgX1hCRl9ERUxXUklfUQkoMSA8PCAyMSkvKiBidWZmZXIgb24gZGVsd3JpIHF1ZXVlICovCisjZGVmaW5lIF9YQkZfUEFHRVMJKDEgPDwgMjApLyogYmFja2VkIGJ5IHJlZmNvdW50ZWQgcGFnZXMgKi8KKyNkZWZpbmUgX1hCRl9LTUVNCSgxIDw8IDIxKS8qIGJhY2tlZCBieSBoZWFwIG1lbW9yeSAqLworI2RlZmluZSBfWEJGX0RFTFdSSV9RCSgxIDw8IDIyKS8qIGJ1ZmZlciBvbiBkZWx3cmkgcXVldWUgKi8KIAogdHlwZWRlZiB1bnNpZ25lZCBpbnQgeGZzX2J1Zl9mbGFnc190OwogCiAjZGVmaW5lIFhGU19CVUZfRkxBR1MgXAogCXsgWEJGX1JFQUQsCQkiUkVBRCIgfSwgXAogCXsgWEJGX1dSSVRFLAkJIldSSVRFIiB9LCBcCisJeyBYQkZfUkVBRF9BSEVBRCwJIlJFQURfQUhFQUQiIH0sIFwKIAl7IFhCRl9NQVBQRUQsCQkiTUFQUEVEIiB9LCBcCiAJeyBYQkZfQVNZTkMsCQkiQVNZTkMiIH0sIFwKIAl7IFhCRl9ET05FLAkJIkRPTkUiIH0sIFwKIAl7IFhCRl9ERUxXUkksCQkiREVMV1JJIiB9LCBcCiAJeyBYQkZfU1RBTEUsCQkiU1RBTEUiIH0sIFwKLQl7IFhCRl9PUkRFUkVELAkJIk9SREVSRUQiIH0sIFwKLQl7IFhCRl9SRUFEX0FIRUFELAkiUkVBRF9BSEVBRCIgfSwgXAorCXsgWEJGX1NZTkNJTywJCSJTWU5DSU8iIH0sIFwKKwl7IFhCRl9GVUEsCQkiRlVBIiB9LCBcCisJeyBYQkZfRkxVU0gsCQkiRkxVU0giIH0sIFwKIAl7IFhCRl9MT0NLLAkJIkxPQ0siIH0sICAJLyogc2hvdWxkIG5ldmVyIGJlIHNldCAqL1wKIAl7IFhCRl9UUllMT0NLLAkJIlRSWUxPQ0siIH0sIAkvKiBkaXR0byAqL1wKIAl7IFhCRl9ET05UX0JMT0NLLAkiRE9OVF9CTE9DSyIgfSwJLyogZGl0dG8gKi9cCiAJeyBfWEJGX1BBR0VTLAkJIlBBR0VTIiB9LCBcCi0JeyBfWEJGX1JVTl9RVUVVRVMsCSJSVU5fUVVFVUVTIiB9LCBcCiAJeyBfWEJGX0tNRU0sCQkiS01FTSIgfSwgXAogCXsgX1hCRl9ERUxXUklfUSwJIkRFTFdSSV9RIiB9CiAKQEAgLTkxLDExICs5NCw2IEBACiAJWEJUX0ZPUkNFX0ZMVVNIID0gMSwKIH0geGZzX2J1ZnRhcmdfZmxhZ3NfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgeGZzX2J1Zmhhc2ggewotCXN0cnVjdCBsaXN0X2hlYWQJYmhfbGlzdDsKLQlzcGlubG9ja190CQliaF9sb2NrOwotfSB4ZnNfYnVmaGFzaF90OwotCiB0eXBlZGVmIHN0cnVjdCB4ZnNfYnVmdGFyZyB7CiAJZGV2X3QJCQlidF9kZXY7CiAJc3RydWN0IGJsb2NrX2RldmljZQkqYnRfYmRldjsKQEAgLTE1MSw3ICsxNDksNyBAQAogCXhmc19idWZfaW9kb25lX3QJYl9pb2RvbmU7CS8qIEkvTyBjb21wbGV0aW9uIGZ1bmN0aW9uICovCiAJc3RydWN0IGNvbXBsZXRpb24JYl9pb3dhaXQ7CS8qIHF1ZXVlIGZvciBJL08gd2FpdGVycyAqLwogCXZvaWQJCQkqYl9mc3ByaXY7Ci0Jdm9pZAkJCSpiX2ZzcHJpdjI7CisJc3RydWN0IHhmc190cmFucwkqYl90cmFuc3A7CiAJc3RydWN0IHBhZ2UJCSoqYl9wYWdlczsJLyogYXJyYXkgb2YgcGFnZSBwb2ludGVycyAqLwogCXN0cnVjdCBwYWdlCQkqYl9wYWdlX2FycmF5W1hCX1BBR0VTXTsgLyogaW5saW5lIHBhZ2VzICovCiAJdW5zaWduZWQgbG9uZwkJYl9xdWV1ZXRpbWU7CS8qIHRpbWUgYnVmZmVyIHdhcyBxdWV1ZWQgKi8KQEAgLTE5MiwxMCArMTkwLDExIEBACiBleHRlcm4gdm9pZCB4ZnNfYnVmX3JlbGUoeGZzX2J1Zl90ICopOwogCiAvKiBMb2NraW5nIGFuZCBVbmxvY2tpbmcgQnVmZmVycyAqLwotZXh0ZXJuIGludCB4ZnNfYnVmX2NvbmRfbG9jayh4ZnNfYnVmX3QgKik7Ci1leHRlcm4gaW50IHhmc19idWZfbG9ja192YWx1ZSh4ZnNfYnVmX3QgKik7CitleHRlcm4gaW50IHhmc19idWZfdHJ5bG9jayh4ZnNfYnVmX3QgKik7CiBleHRlcm4gdm9pZCB4ZnNfYnVmX2xvY2soeGZzX2J1Zl90ICopOwogZXh0ZXJuIHZvaWQgeGZzX2J1Zl91bmxvY2soeGZzX2J1Zl90ICopOworI2RlZmluZSB4ZnNfYnVmX2lzbG9ja2VkKGJwKSBcCisJKChicCktPmJfc2VtYS5jb3VudCA8PSAwKQogCiAvKiBCdWZmZXIgUmVhZCBhbmQgV3JpdGUgUm91dGluZXMgKi8KIGV4dGVybiBpbnQgeGZzX2J3cml0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwgc3RydWN0IHhmc19idWYgKmJwKTsKQEAgLTIzNCw4ICsyMzMsOSBAQAogCiAKICNkZWZpbmUgWEZTX0JVRl9CRkxBR1MoYnApCSgoYnApLT5iX2ZsYWdzKQotI2RlZmluZSBYRlNfQlVGX1pFUk9GTEFHUyhicCkJKChicCktPmJfZmxhZ3MgJj0gXAotCQl+KFhCRl9SRUFEfFhCRl9XUklURXxYQkZfQVNZTkN8WEJGX0RFTFdSSXxYQkZfT1JERVJFRCkpCisjZGVmaW5lIFhGU19CVUZfWkVST0ZMQUdTKGJwKSBcCisJKChicCktPmJfZmxhZ3MgJj0gfihYQkZfUkVBRHxYQkZfV1JJVEV8WEJGX0FTWU5DfFhCRl9ERUxXUkl8IFwKKwkJCSAgICBYQkZfU1lOQ0lPfFhCRl9GVUF8WEJGX0ZMVVNIKSkKIAogdm9pZCB4ZnNfYnVmX3N0YWxlKHN0cnVjdCB4ZnNfYnVmICpicCk7CiAjZGVmaW5lIFhGU19CVUZfU1RBTEUoYnApCXhmc19idWZfc3RhbGUoYnApOwpAQCAtMjY3LDEwICsyNjcsNiBAQAogI2RlZmluZSBYRlNfQlVGX1VOQVNZTkMoYnApCSgoYnApLT5iX2ZsYWdzICY9IH5YQkZfQVNZTkMpCiAjZGVmaW5lIFhGU19CVUZfSVNBU1lOQyhicCkJKChicCktPmJfZmxhZ3MgJiBYQkZfQVNZTkMpCiAKLSNkZWZpbmUgWEZTX0JVRl9PUkRFUkVEKGJwKQkoKGJwKS0+Yl9mbGFncyB8PSBYQkZfT1JERVJFRCkKLSNkZWZpbmUgWEZTX0JVRl9VTk9SREVSRUQoYnApCSgoYnApLT5iX2ZsYWdzICY9IH5YQkZfT1JERVJFRCkKLSNkZWZpbmUgWEZTX0JVRl9JU09SREVSRUQoYnApCSgoYnApLT5iX2ZsYWdzICYgWEJGX09SREVSRUQpCi0KICNkZWZpbmUgWEZTX0JVRl9IT0xEKGJwKQl4ZnNfYnVmX2hvbGQoYnApCiAjZGVmaW5lIFhGU19CVUZfUkVBRChicCkJKChicCktPmJfZmxhZ3MgfD0gWEJGX1JFQUQpCiAjZGVmaW5lIFhGU19CVUZfVU5SRUFEKGJwKQkoKGJwKS0+Yl9mbGFncyAmPSB+WEJGX1JFQUQpCkBAIC0yODAsMTQgKzI3Niw2IEBACiAjZGVmaW5lIFhGU19CVUZfVU5XUklURShicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9XUklURSkKICNkZWZpbmUgWEZTX0JVRl9JU1dSSVRFKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9XUklURSkKIAotI2RlZmluZSBYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKQkJCSgoYnApLT5iX2lvZG9uZSkKLSNkZWZpbmUgWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMoYnAsIGZ1bmMpCSgoYnApLT5iX2lvZG9uZSA9IChmdW5jKSkKLSNkZWZpbmUgWEZTX0JVRl9DTFJfSU9ET05FX0ZVTkMoYnApCQkoKGJwKS0+Yl9pb2RvbmUgPSBOVUxMKQotCi0jZGVmaW5lIFhGU19CVUZfRlNQUklWQVRFKGJwLCB0eXBlKQkJKCh0eXBlKShicCktPmJfZnNwcml2KQotI2RlZmluZSBYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIHZhbCkJCSgoYnApLT5iX2ZzcHJpdiA9ICh2b2lkKikodmFsKSkKLSNkZWZpbmUgWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB0eXBlKQkJKCh0eXBlKShicCktPmJfZnNwcml2MikKLSNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgdmFsKQkJKChicCktPmJfZnNwcml2MiA9ICh2b2lkKikodmFsKSkKICNkZWZpbmUgWEZTX0JVRl9TRVRfU1RBUlQoYnApCQkJZG8geyB9IHdoaWxlICgwKQogCiAjZGVmaW5lIFhGU19CVUZfUFRSKGJwKQkJCSh4ZnNfY2FkZHJfdCkoKGJwKS0+Yl9hZGRyKQpAQCAtMzEzLDEwICszMDEsNiBAQAogCiAjZGVmaW5lIFhGU19CVUZfSVNQSU5ORUQoYnApCWF0b21pY19yZWFkKCYoKGJwKS0+Yl9waW5fY291bnQpKQogCi0jZGVmaW5lIFhGU19CVUZfVkFMVVNFTUEoYnApCXhmc19idWZfbG9ja192YWx1ZShicCkKLSNkZWZpbmUgWEZTX0JVRl9DUFNFTUEoYnApCSh4ZnNfYnVmX2NvbmRfbG9jayhicCkgPT0gMCkKLSNkZWZpbmUgWEZTX0JVRl9WU0VNQShicCkJeGZzX2J1Zl91bmxvY2soYnApCi0jZGVmaW5lIFhGU19CVUZfUFNFTUEoYnAseCkJeGZzX2J1Zl9sb2NrKGJwKQogI2RlZmluZSBYRlNfQlVGX0ZJTklTSF9JT1dBSVQoYnApCWNvbXBsZXRlKCZicC0+Yl9pb3dhaXQpOwogCiAjZGVmaW5lIFhGU19CVUZfU0VUX1RBUkdFVChicCwgdGFyZ2V0KQkoKGJwKS0+Yl90YXJnZXQgPSAodGFyZ2V0KSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKaW5kZXggZjRmODc4Zi4uNzVlNWQzMiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKQEAgLTE1MSwxNCArMTUxLDE0IEBACiAJCSAqIFdlIGRvbid0IHVzZSBFU1RBTEUgZGlyZWN0bHkgZG93biB0aGUgY2hhaW4gdG8gbm90CiAJCSAqIGNvbmZ1c2UgYXBwbGljYXRpb25zIHVzaW5nIGJ1bGtzdGF0IHRoYXQgZXhwZWN0IEVJTlZBTC4KIAkJICovCi0JCWlmIChlcnJvciA9PSBFSU5WQUwpCisJCWlmIChlcnJvciA9PSBFSU5WQUwgfHwgZXJyb3IgPT0gRU5PRU5UKQogCQkJZXJyb3IgPSBFU1RBTEU7CiAJCXJldHVybiBFUlJfUFRSKC1lcnJvcik7CiAJfQogCiAJaWYgKGlwLT5pX2QuZGlfZ2VuICE9IGdlbmVyYXRpb24pIHsKIAkJSVJFTEUoaXApOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CiAJfQogCiAJcmV0dXJuIFZGU19JKGlwKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwppbmRleCBmNDIxM2JhLi44MjUzOTBlIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCkBAIC0xMjcsMjMgKzEyNyw0NCBAQAogU1RBVElDIGludAogeGZzX2ZpbGVfZnN5bmMoCiAJc3RydWN0IGZpbGUJCSpmaWxlLAorCWxvZmZfdAkJCXN0YXJ0LAorCWxvZmZfdAkJCWVuZCwKIAlpbnQJCQlkYXRhc3luYykKIHsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OwogCXN0cnVjdCB4ZnNfdHJhbnMJKnRwOwogCWludAkJCWVycm9yID0gMDsKIAlpbnQJCQlsb2dfZmx1c2hlZCA9IDA7CiAKIAl0cmFjZV94ZnNfZmlsZV9mc3luYyhpcCk7CiAKLQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpCisJZXJyb3IgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQlyZXR1cm4gLVhGU19FUlJPUihFSU8pOwogCiAJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lUUlVOQ0FURUQpOwogCiAJeGZzX2lvZW5kX3dhaXQoaXApOwogCisJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0JBUlJJRVIpIHsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBhbiBSVCBhbmQvb3IgbG9nIHN1YnZvbHVtZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorCQkgKiB0byBmbHVzaCB0aGUgd3JpdGUgY2FjaGUgdGhlIGRldmljZSB1c2VkIGZvciBmaWxlIGRhdGEKKwkJICogZmlyc3QuICBUaGlzIGlzIHRvIGVuc3VyZSBuZXdseSB3cml0dGVuIGZpbGUgZGF0YSBtYWtlCisJCSAqIGl0IHRvIGRpc2sgYmVmb3JlIGxvZ2dpbmcgdGhlIG5ldyBpbm9kZSBzaXplIGluIGNhc2Ugb2YKKwkJICogYW4gZXh0ZW5kaW5nIHdyaXRlLgorCQkgKi8KKwkJaWYgKFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpCisJCQl4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKG1wLT5tX3J0ZGV2X3RhcmdwKTsKKwkJZWxzZSBpZiAobXAtPm1fbG9nZGV2X3RhcmdwICE9IG1wLT5tX2RkZXZfdGFyZ3ApCisJCQl4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOworCX0KKwogCS8qCiAJICogV2UgYWx3YXlzIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVpcmVkIGlub2RlIHN0YXRlIGlzIHNhZmUgb24KIAkgKiBkaXNrLiAgVGhlIGlub2RlIG1pZ2h0IGJlIGNsZWFuIGJ1dCB3ZSBzdGlsbCBtaWdodCBuZWVkIHRvIGZvcmNlIHRoZQpAQCAtMTc1LDkgKzE5Niw5IEBACiAJCSAqIHVwZGF0ZXMuICBUaGUgc3luYyB0cmFuc2FjdGlvbiB3aWxsIGFsc28gZm9yY2UgdGhlIGxvZy4KIAkJICovCiAJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MoaXAtPmlfbW91bnQsIFhGU19UUkFOU19GU1lOQ19UUyk7CisJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfRlNZTkNfVFMpOwogCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAotCQkJCVhGU19GU1lOQ19UU19MT0dfUkVTKGlwLT5pX21vdW50KSwgMCwgMCwgMCk7CisJCQkJWEZTX0ZTWU5DX1RTX0xPR19SRVMobXApLCAwLCAwLCAwKTsKIAkJaWYgKGVycm9yKSB7CiAJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKIAkJCXJldHVybiAtZXJyb3I7CkBAIC0yMDksMjggKzIzMCwyNSBAQAogCQkgKiBmb3JjZSB0aGUgbG9nLgogCQkgKi8KIAkJaWYgKHhmc19pcGluY291bnQoaXApKSB7Ci0JCQllcnJvciA9IF94ZnNfbG9nX2ZvcmNlX2xzbihpcC0+aV9tb3VudCwKKwkJCWVycm9yID0gX3hmc19sb2dfZm9yY2VfbHNuKG1wLAogCQkJCQlpcC0+aV9pdGVtcC0+aWxpX2xhc3RfbHNuLAogCQkJCQlYRlNfTE9HX1NZTkMsICZsb2dfZmx1c2hlZCk7CiAJCX0KIAkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCX0KIAotCWlmIChpcC0+aV9tb3VudC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBsb2cgd3JpdGUgZGlkbid0IGlzc3VlIGFuIG9yZGVyZWQgdGFnIHdlIG5lZWQKLQkJICogdG8gZmx1c2ggdGhlIGRpc2sgY2FjaGUgZm9yIHRoZSBkYXRhIGRldmljZSBub3cuCi0JCSAqLwotCQlpZiAoIWxvZ19mbHVzaGVkKQotCQkJeGZzX2Jsa2Rldl9pc3N1ZV9mbHVzaChpcC0+aV9tb3VudC0+bV9kZGV2X3RhcmdwKTsKLQotCQkvKgotCQkgKiBJZiB0aGlzIGlub2RlIGlzIG9uIHRoZSBSVCBkZXYgd2UgbmVlZCB0byBmbHVzaCB0aGF0Ci0JCSAqIGNhY2hlIGFzIHdlbGwuCi0JCSAqLwotCQlpZiAoWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkKLQkJCXhmc19ibGtkZXZfaXNzdWVfZmx1c2goaXAtPmlfbW91bnQtPm1fcnRkZXZfdGFyZ3ApOwotCX0KKwkvKgorCSAqIElmIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBkZXZpY2UsIGFuZCB0aGUgbG9nIGZvcmNlIGFib3V0IHdhcworCSAqIGEgbm8tb3Agd2UgbWlnaHQgaGF2ZSB0byBmbHVzaCB0aGUgZGF0YSBkZXZpY2UgY2FjaGUgaGVyZS4KKwkgKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiBmb3IgZmRhdGFzeW5jL09fRFNZTkMgaWYgd2Ugd2VyZSBvdmVyd3JpdGluZworCSAqIGFuIGFscmVhZHkgYWxsb2NhdGVkIGZpbGUgYW5kIHRodXMgZG8gbm90IGhhdmUgYW55IG1ldGFkYXRhIHRvCisJICogY29tbWl0LgorCSAqLworCWlmICgobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikgJiYKKwkgICAgbXAtPm1fbG9nZGV2X3RhcmdwID09IG1wLT5tX2RkZXZfdGFyZ3AgJiYKKwkgICAgIVhGU19JU19SRUFMVElNRV9JTk9ERShpcCkgJiYKKwkgICAgIWxvZ19mbHVzaGVkKQorCQl4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOwogCiAJcmV0dXJuIC1lcnJvcjsKIH0KQEAgLTg2MywxOCArODgxLDE0IEBACiAJLyogSGFuZGxlIHZhcmlvdXMgU1lOQy10eXBlIHdyaXRlcyAqLwogCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fRFNZTkMpIHx8IElTX1NZTkMoaW5vZGUpKSB7CiAJCWxvZmZfdCBlbmQgPSBwb3MgKyByZXQgLSAxOwotCQlpbnQgZXJyb3IsIGVycm9yMjsKKwkJaW50IGVycm9yOwogCiAJCXhmc19yd19pdW5sb2NrKGlwLCBpb2xvY2spOwotCQllcnJvciA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UobWFwcGluZywgcG9zLCBlbmQpOworCQllcnJvciA9IHhmc19maWxlX2ZzeW5jKGZpbGUsIHBvcywgZW5kLAorCQkJCSAgICAgIChmaWxlLT5mX2ZsYWdzICYgX19PX1NZTkMpID8gMCA6IDEpOwogCQl4ZnNfcndfaWxvY2soaXAsIGlvbG9jayk7Ci0KLQkJZXJyb3IyID0gLXhmc19maWxlX2ZzeW5jKGZpbGUsCi0JCQkJCSAoZmlsZS0+Zl9mbGFncyAmIF9fT19TWU5DKSA/IDAgOiAxKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0ID0gZXJyb3I7Ci0JCWVsc2UgaWYgKGVycm9yMikKLQkJCXJldCA9IGVycm9yMjsKIAl9CiAKIG91dF91bmxvY2s6CkBAIC05MzIsNyArOTQ2LDcgQEAKIAogCQlpYXR0ci5pYV92YWxpZCA9IEFUVFJfU0laRTsKIAkJaWF0dHIuaWFfc2l6ZSA9IG5ld19zaXplOwotCQllcnJvciA9IC14ZnNfc2V0YXR0cihpcCwgJmlhdHRyLCBYRlNfQVRUUl9OT0xPQ0spOworCQllcnJvciA9IC14ZnNfc2V0YXR0cl9zaXplKGlwLCAmaWF0dHIsIFhGU19BVFRSX05PTE9DSyk7CiAJfQogCiBvdXRfdW5sb2NrOgpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCmluZGV4IGRkMjE3ODQuLjY1NDRjMzIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKICNpbmNsdWRlICJ4ZnNfdm5vZGVvcHMuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc190cmFjZS5oIgogCiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgpAQCAtMTgyLDcgKzE4Myw3IEBACiAJaWYgKElTX1BPU0lYQUNMKGRpcikpIHsKIAkJZGVmYXVsdF9hY2wgPSB4ZnNfZ2V0X2FjbChkaXIsIEFDTF9UWVBFX0RFRkFVTFQpOwogCQlpZiAoSVNfRVJSKGRlZmF1bHRfYWNsKSkKLQkJCXJldHVybiAtUFRSX0VSUihkZWZhdWx0X2FjbCk7CisJCQlyZXR1cm4gUFRSX0VSUihkZWZhdWx0X2FjbCk7CiAKIAkJaWYgKCFkZWZhdWx0X2FjbCkKIAkJCW1vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKQEAgLTIwMSw5ICsyMDIsOSBAQAogCiAJaWYgKGRlZmF1bHRfYWNsKSB7CiAJCWVycm9yID0gLXhmc19pbmhlcml0X2FjbChpbm9kZSwgZGVmYXVsdF9hY2wpOworCQlkZWZhdWx0X2FjbCA9IE5VTEw7CiAJCWlmICh1bmxpa2VseShlcnJvcikpCiAJCQlnb3RvIG91dF9jbGVhbnVwX2lub2RlOwotCQlwb3NpeF9hY2xfcmVsZWFzZShkZWZhdWx0X2FjbCk7CiAJfQogCiAKQEAgLTQ5NywxMiArNDk4LDQ0MiBAQAogCXJldHVybiAwOwogfQogCitpbnQKK3hmc19zZXRhdHRyX25vbnNpemUoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJc3RydWN0IGlhdHRyCQkqaWF0dHIsCisJaW50CQkJZmxhZ3MpCit7CisJeGZzX21vdW50X3QJCSptcCA9IGlwLT5pX21vdW50OworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gVkZTX0koaXApOworCWludAkJCW1hc2sgPSBpYXR0ci0+aWFfdmFsaWQ7CisJeGZzX3RyYW5zX3QJCSp0cDsKKwlpbnQJCQllcnJvcjsKKwl1aWRfdAkJCXVpZCA9IDAsIGl1aWQgPSAwOworCWdpZF90CQkJZ2lkID0gMCwgaWdpZCA9IDA7CisJc3RydWN0IHhmc19kcXVvdAkqdWRxcCA9IE5VTEwsICpnZHFwID0gTlVMTDsKKwlzdHJ1Y3QgeGZzX2RxdW90CSpvbGRkcXVvdDEgPSBOVUxMLCAqb2xkZHF1b3QyID0gTlVMTDsKKworCXRyYWNlX3hmc19zZXRhdHRyKGlwKTsKKworCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRE9OTFkpCisJCXJldHVybiBYRlNfRVJST1IoRVJPRlMpOworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwllcnJvciA9IC1pbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGlhdHRyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCisJQVNTRVJUKChtYXNrICYgQVRUUl9TSVpFKSA9PSAwKTsKKworCS8qCisJICogSWYgZGlzayBxdW90YXMgaXMgb24sIHdlIG1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgZG8gZXhpc3Qgb24gZGlzaywKKwkgKiBiZWZvcmUgd2Ugc3RhcnQgYW55IG90aGVyIHRyYW5zYWN0aW9ucy4gVHJ5aW5nIHRvIGRvIHRoaXMgbGF0ZXIKKwkgKiBpcyBtZXNzeS4gV2UgZG9uJ3QgY2FyZSB0byB0YWtlIGEgcmVhZGxvY2sgdG8gbG9vayBhdCB0aGUgaWRzCisJICogaW4gaW5vZGUgaGVyZSwgYmVjYXVzZSB3ZSBjYW4ndCBob2xkIGl0IGFjcm9zcyB0aGUgdHJhbnNfcmVzZXJ2ZS4KKwkgKiBJZiB0aGUgSURzIGRvIGNoYW5nZSBiZWZvcmUgd2UgdGFrZSB0aGUgaWxvY2ssIHdlJ3JlIGNvdmVyZWQKKwkgKiBiZWNhdXNlIHRoZSBpXypkcXVvdCBmaWVsZHMgd2lsbCBnZXQgdXBkYXRlZCBhbnl3YXkuCisJICovCisJaWYgKFhGU19JU19RVU9UQV9PTihtcCkgJiYgKG1hc2sgJiAoQVRUUl9VSUR8QVRUUl9HSUQpKSkgeworCQl1aW50CXFmbGFncyA9IDA7CisKKwkJaWYgKChtYXNrICYgQVRUUl9VSUQpICYmIFhGU19JU19VUVVPVEFfT04obXApKSB7CisJCQl1aWQgPSBpYXR0ci0+aWFfdWlkOworCQkJcWZsYWdzIHw9IFhGU19RTU9QVF9VUVVPVEE7CisJCX0gZWxzZSB7CisJCQl1aWQgPSBpcC0+aV9kLmRpX3VpZDsKKwkJfQorCQlpZiAoKG1hc2sgJiBBVFRSX0dJRCkgJiYgWEZTX0lTX0dRVU9UQV9PTihtcCkpIHsKKwkJCWdpZCA9IGlhdHRyLT5pYV9naWQ7CisJCQlxZmxhZ3MgfD0gWEZTX1FNT1BUX0dRVU9UQTsKKwkJfSAgZWxzZSB7CisJCQlnaWQgPSBpcC0+aV9kLmRpX2dpZDsKKwkJfQorCisJCS8qCisJCSAqIFdlIHRha2UgYSByZWZlcmVuY2Ugd2hlbiB3ZSBpbml0aWFsaXplIHVkcXAgYW5kIGdkcXAsCisJCSAqIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0IHdlIG5ldmVyIGJsaW5kbHkgZG91YmxlIHRyaXAgb24KKwkJICogdGhlIHNhbWUgdmFyaWFibGUuIFNlZSB4ZnNfY3JlYXRlKCkgZm9yIGFuIGV4YW1wbGUuCisJCSAqLworCQlBU1NFUlQodWRxcCA9PSBOVUxMKTsKKwkJQVNTRVJUKGdkcXAgPT0gTlVMTCk7CisJCWVycm9yID0geGZzX3FtX3ZvcF9kcWFsbG9jKGlwLCB1aWQsIGdpZCwgeGZzX2dldF9wcm9qaWQoaXApLAorCQkJCQkgcWZsYWdzLCAmdWRxcCwgJmdkcXApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19TRVRBVFRSX05PVF9TSVpFKTsKKwllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfSUNIQU5HRV9MT0dfUkVTKG1wKSwgMCwgMCwgMCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9kcXJlbGU7CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKworCS8qCisJICogQ2hhbmdlIGZpbGUgb3duZXJzaGlwLiAgTXVzdCBiZSB0aGUgb3duZXIgb3IgcHJpdmlsZWdlZC4KKwkgKi8KKwlpZiAobWFzayAmIChBVFRSX1VJRHxBVFRSX0dJRCkpIHsKKwkJLyoKKwkJICogVGhlc2UgSURzIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB3ZSBsYXN0IGxvb2tlZCBhdCB0aGVtLgorCQkgKiBCdXQsIHdlJ3JlIGFzc3VyZWQgdGhhdCBpZiB0aGUgb3duZXJzaGlwIGRpZCBjaGFuZ2UKKwkJICogd2hpbGUgd2UgZGlkbid0IGhhdmUgdGhlIGlub2RlIGxvY2tlZCwgaW5vZGUncyBkcXVvdChzKQorCQkgKiB3b3VsZCBoYXZlIGNoYW5nZWQgYWxzby4KKwkJICovCisJCWl1aWQgPSBpcC0+aV9kLmRpX3VpZDsKKwkJaWdpZCA9IGlwLT5pX2QuZGlfZ2lkOworCQlnaWQgPSAobWFzayAmIEFUVFJfR0lEKSA/IGlhdHRyLT5pYV9naWQgOiBpZ2lkOworCQl1aWQgPSAobWFzayAmIEFUVFJfVUlEKSA/IGlhdHRyLT5pYV91aWQgOiBpdWlkOworCisJCS8qCisJCSAqIERvIGEgcXVvdGEgcmVzZXJ2YXRpb24gb25seSBpZiB1aWQvZ2lkIGlzIGFjdHVhbGx5CisJCSAqIGdvaW5nIHRvIGNoYW5nZS4KKwkJICovCisJCWlmIChYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkgJiYKKwkJICAgICgoWEZTX0lTX1VRVU9UQV9PTihtcCkgJiYgaXVpZCAhPSB1aWQpIHx8CisJCSAgICAgKFhGU19JU19HUVVPVEFfT04obXApICYmIGlnaWQgIT0gZ2lkKSkpIHsKKwkJCUFTU0VSVCh0cCk7CisJCQllcnJvciA9IHhmc19xbV92b3BfY2hvd25fcmVzZXJ2ZSh0cCwgaXAsIHVkcXAsIGdkcXAsCisJCQkJCQljYXBhYmxlKENBUF9GT1dORVIpID8KKwkJCQkJCVhGU19RTU9QVF9GT1JDRV9SRVMgOiAwKTsKKwkJCWlmIChlcnJvcikJLyogb3V0IG9mIHF1b3RhICovCisJCQkJZ290byBvdXRfdHJhbnNfY2FuY2VsOworCQl9CisJfQorCisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisKKwkvKgorCSAqIENoYW5nZSBmaWxlIG93bmVyc2hpcC4gIE11c3QgYmUgdGhlIG93bmVyIG9yIHByaXZpbGVnZWQuCisJICovCisJaWYgKG1hc2sgJiAoQVRUUl9VSUR8QVRUUl9HSUQpKSB7CisJCS8qCisJCSAqIENBUF9GU0VUSUQgb3ZlcnJpZGVzIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCQkgKgorCQkgKiBUaGUgc2V0LXVzZXItSUQgYW5kIHNldC1ncm91cC1JRCBiaXRzIG9mIGEgZmlsZSB3aWxsIGJlCisJCSAqIGNsZWFyZWQgdXBvbiBzdWNjZXNzZnVsIHJldHVybiBmcm9tIGNob3duKCkKKwkJICovCisJCWlmICgoaXAtPmlfZC5kaV9tb2RlICYgKFNfSVNVSUR8U19JU0dJRCkpICYmCisJCSAgICAhY2FwYWJsZShDQVBfRlNFVElEKSkKKwkJCWlwLT5pX2QuZGlfbW9kZSAmPSB+KFNfSVNVSUR8U19JU0dJRCk7CisKKwkJLyoKKwkJICogQ2hhbmdlIHRoZSBvd25lcnNoaXBzIGFuZCByZWdpc3RlciBxdW90YSBtb2RpZmljYXRpb25zCisJCSAqIGluIHRoZSB0cmFuc2FjdGlvbi4KKwkJICovCisJCWlmIChpdWlkICE9IHVpZCkgeworCQkJaWYgKFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSAmJiBYRlNfSVNfVVFVT1RBX09OKG1wKSkgeworCQkJCUFTU0VSVChtYXNrICYgQVRUUl9VSUQpOworCQkJCUFTU0VSVCh1ZHFwKTsKKwkJCQlvbGRkcXVvdDEgPSB4ZnNfcW1fdm9wX2Nob3duKHRwLCBpcCwKKwkJCQkJCQkmaXAtPmlfdWRxdW90LCB1ZHFwKTsKKwkJCX0KKwkJCWlwLT5pX2QuZGlfdWlkID0gdWlkOworCQkJaW5vZGUtPmlfdWlkID0gdWlkOworCQl9CisJCWlmIChpZ2lkICE9IGdpZCkgeworCQkJaWYgKFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSAmJiBYRlNfSVNfR1FVT1RBX09OKG1wKSkgeworCQkJCUFTU0VSVCghWEZTX0lTX1BRVU9UQV9PTihtcCkpOworCQkJCUFTU0VSVChtYXNrICYgQVRUUl9HSUQpOworCQkJCUFTU0VSVChnZHFwKTsKKwkJCQlvbGRkcXVvdDIgPSB4ZnNfcW1fdm9wX2Nob3duKHRwLCBpcCwKKwkJCQkJCQkmaXAtPmlfZ2RxdW90LCBnZHFwKTsKKwkJCX0KKwkJCWlwLT5pX2QuZGlfZ2lkID0gZ2lkOworCQkJaW5vZGUtPmlfZ2lkID0gZ2lkOworCQl9CisJfQorCisJLyoKKwkgKiBDaGFuZ2UgZmlsZSBhY2Nlc3MgbW9kZXMuCisJICovCisJaWYgKG1hc2sgJiBBVFRSX01PREUpIHsKKwkJdW1vZGVfdCBtb2RlID0gaWF0dHItPmlhX21vZGU7CisKKwkJaWYgKCFpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkgJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpCisJCQltb2RlICY9IH5TX0lTR0lEOworCisJCWlwLT5pX2QuZGlfbW9kZSAmPSBTX0lGTVQ7CisJCWlwLT5pX2QuZGlfbW9kZSB8PSBtb2RlICYgflNfSUZNVDsKKworCQlpbm9kZS0+aV9tb2RlICY9IFNfSUZNVDsKKwkJaW5vZGUtPmlfbW9kZSB8PSBtb2RlICYgflNfSUZNVDsKKwl9CisKKwkvKgorCSAqIENoYW5nZSBmaWxlIGFjY2VzcyBvciBtb2RpZmllZCB0aW1lcy4KKwkgKi8KKwlpZiAobWFzayAmIEFUVFJfQVRJTUUpIHsKKwkJaW5vZGUtPmlfYXRpbWUgPSBpYXR0ci0+aWFfYXRpbWU7CisJCWlwLT5pX2QuZGlfYXRpbWUudF9zZWMgPSBpYXR0ci0+aWFfYXRpbWUudHZfc2VjOworCQlpcC0+aV9kLmRpX2F0aW1lLnRfbnNlYyA9IGlhdHRyLT5pYV9hdGltZS50dl9uc2VjOworCQlpcC0+aV91cGRhdGVfY29yZSA9IDE7CisJfQorCWlmIChtYXNrICYgQVRUUl9DVElNRSkgeworCQlpbm9kZS0+aV9jdGltZSA9IGlhdHRyLT5pYV9jdGltZTsKKwkJaXAtPmlfZC5kaV9jdGltZS50X3NlYyA9IGlhdHRyLT5pYV9jdGltZS50dl9zZWM7CisJCWlwLT5pX2QuZGlfY3RpbWUudF9uc2VjID0gaWF0dHItPmlhX2N0aW1lLnR2X25zZWM7CisJCWlwLT5pX3VwZGF0ZV9jb3JlID0gMTsKKwl9CisJaWYgKG1hc2sgJiBBVFRSX01USU1FKSB7CisJCWlub2RlLT5pX210aW1lID0gaWF0dHItPmlhX210aW1lOworCQlpcC0+aV9kLmRpX210aW1lLnRfc2VjID0gaWF0dHItPmlhX210aW1lLnR2X3NlYzsKKwkJaXAtPmlfZC5kaV9tdGltZS50X25zZWMgPSBpYXR0ci0+aWFfbXRpbWUudHZfbnNlYzsKKwkJaXAtPmlfdXBkYXRlX2NvcmUgPSAxOworCX0KKworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKworCVhGU19TVEFUU19JTkMoeHNfaWdfYXR0cmNoZyk7CisKKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpCisJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKKworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkvKgorCSAqIFJlbGVhc2UgYW55IGRxdW90KHMpIHRoZSBpbm9kZSBoYWQga2VwdCBiZWZvcmUgY2hvd24uCisJICovCisJeGZzX3FtX2RxcmVsZShvbGRkcXVvdDEpOworCXhmc19xbV9kcXJlbGUob2xkZHF1b3QyKTsKKwl4ZnNfcW1fZHFyZWxlKHVkcXApOworCXhmc19xbV9kcXJlbGUoZ2RxcCk7CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCisJLyoKKwkgKiBYWFgoaGNoKTogVXBkYXRpbmcgdGhlIEFDTCBlbnRyaWVzIGlzIG5vdCBhdG9taWMgdnMgdGhlIGlfbW9kZQorCSAqIAkgICAgIHVwZGF0ZS4gIFdlIGNvdWxkIGF2b2lkIHRoaXMgd2l0aCBsaW5rZWQgdHJhbnNhY3Rpb25zCisJICogCSAgICAgYW5kIHBhc3NpbmcgZG93biB0aGUgdHJhbnNhY3Rpb24gcG9pbnRlciBhbGwgdGhlIHdheQorCSAqCSAgICAgdG8gYXR0cl9zZXQuICBObyBwcmV2aW91cyB1c2VyIG9mIHRoZSBnZW5lcmljCisJICogCSAgICAgUG9zaXggQUNMIGNvZGUgc2VlbXMgdG8gY2FyZSBhYm91dCB0aGlzIGlzc3VlIGVpdGhlci4KKwkgKi8KKwlpZiAoKG1hc2sgJiBBVFRSX01PREUpICYmICEoZmxhZ3MgJiBYRlNfQVRUUl9OT0FDTCkpIHsKKwkJZXJyb3IgPSAteGZzX2FjbF9jaG1vZChpbm9kZSk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCX0KKworCXJldHVybiAwOworCitvdXRfdHJhbnNfY2FuY2VsOgorCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CitvdXRfZHFyZWxlOgorCXhmc19xbV9kcXJlbGUodWRxcCk7CisJeGZzX3FtX2RxcmVsZShnZHFwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUcnVuY2F0ZSBmaWxlLiAgTXVzdCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gYW5kIG5vdCBiZSBhIGRpcmVjdG9yeS4KKyAqLworaW50Cit4ZnNfc2V0YXR0cl9zaXplKAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXN0cnVjdCBpYXR0cgkJKmlhdHRyLAorCWludAkJCWZsYWdzKQoreworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBWRlNfSShpcCk7CisJaW50CQkJbWFzayA9IGlhdHRyLT5pYV92YWxpZDsKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cDsKKwlpbnQJCQllcnJvcjsKKwl1aW50CQkJbG9ja19mbGFnczsKKwl1aW50CQkJY29tbWl0X2ZsYWdzID0gMDsKKworCXRyYWNlX3hmc19zZXRhdHRyKGlwKTsKKworCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRE9OTFkpCisJCXJldHVybiBYRlNfRVJST1IoRVJPRlMpOworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwllcnJvciA9IC1pbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGlhdHRyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCisJQVNTRVJUKFNfSVNSRUcoaXAtPmlfZC5kaV9tb2RlKSk7CisJQVNTRVJUKChtYXNrICYgKEFUVFJfTU9ERXxBVFRSX1VJRHxBVFRSX0dJRHxBVFRSX0FUSU1FfEFUVFJfQVRJTUVfU0VUfAorCQkJQVRUUl9NVElNRV9TRVR8QVRUUl9LSUxMX1NVSUR8QVRUUl9LSUxMX1NHSUR8CisJCQlBVFRSX0tJTExfUFJJVnxBVFRSX1RJTUVTX1NFVCkpID09IDApOworCisJbG9ja19mbGFncyA9IFhGU19JTE9DS19FWENMOworCWlmICghKGZsYWdzICYgWEZTX0FUVFJfTk9MT0NLKSkKKwkJbG9ja19mbGFncyB8PSBYRlNfSU9MT0NLX0VYQ0w7CisJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKworCS8qCisJICogU2hvcnQgY2lyY3VpdCB0aGUgdHJ1bmNhdGUgY2FzZSBmb3IgemVybyBsZW5ndGggZmlsZXMuCisJICovCisJaWYgKGlhdHRyLT5pYV9zaXplID09IDAgJiYKKwkgICAgaXAtPmlfc2l6ZSA9PSAwICYmIGlwLT5pX2QuZGlfbmV4dGVudHMgPT0gMCkgeworCQlpZiAoIShtYXNrICYgKEFUVFJfQ1RJTUV8QVRUUl9NVElNRSkpKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCS8qCisJCSAqIFVzZSB0aGUgcmVndWxhciBzZXRhdHRyIHBhdGggdG8gdXBkYXRlIHRoZSB0aW1lc3RhbXBzLgorCQkgKi8KKwkJeGZzX2l1bmxvY2soaXAsIGxvY2tfZmxhZ3MpOworCQlpYXR0ci0+aWFfdmFsaWQgJj0gfkFUVFJfU0laRTsKKwkJcmV0dXJuIHhmc19zZXRhdHRyX25vbnNpemUoaXAsIGlhdHRyLCAwKTsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgYXJlIGF0dGFjaGVkIHRvIHRoZSBpbm9kZS4KKwkgKi8KKwllcnJvciA9IHhmc19xbV9kcWF0dGFjaF9sb2NrZWQoaXAsIDApOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyoKKwkgKiBOb3cgd2UgY2FuIG1ha2UgdGhlIGNoYW5nZXMuICBCZWZvcmUgd2Ugam9pbiB0aGUgaW5vZGUgdG8gdGhlCisJICogdHJhbnNhY3Rpb24sIHRha2UgY2FyZSBvZiB0aGUgcGFydCBvZiB0aGUgdHJ1bmNhdGlvbiB0aGF0IG11c3QgYmUKKwkgKiBkb25lIHdpdGhvdXQgdGhlIGlub2RlIGxvY2suICBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIGpvaW5pbmcKKwkgKiB0aGUgaW5vZGUgdG8gdGhlIHRyYW5zYWN0aW9uLCBiZWNhdXNlIHRoZSBpbm9kZSBjYW5ub3QgYmUgdW5sb2NrZWQKKwkgKiBvbmNlIGl0IGlzIGEgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCisJICovCisJaWYgKGlhdHRyLT5pYV9zaXplID4gaXAtPmlfc2l6ZSkgeworCQkvKgorCQkgKiBEbyB0aGUgZmlyc3QgcGFydCBvZiBncm93aW5nIGEgZmlsZTogemVybyBhbnkgZGF0YSBpbiB0aGUKKwkJICogbGFzdCBibG9jayB0aGF0IGlzIGJleW9uZCB0aGUgb2xkIEVPRi4gIFdlIG5lZWQgdG8gZG8gdGhpcworCQkgKiBiZWZvcmUgdGhlIGlub2RlIGlzIGpvaW5lZCB0byB0aGUgdHJhbnNhY3Rpb24gdG8gbW9kaWZ5CisJCSAqIGlfc2l6ZS4KKwkJICovCisJCWVycm9yID0geGZzX3plcm9fZW9mKGlwLCBpYXR0ci0+aWFfc2l6ZSwgaXAtPmlfc2l6ZSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwlsb2NrX2ZsYWdzICY9IH5YRlNfSUxPQ0tfRVhDTDsKKworCS8qCisJICogV2UgYXJlIGdvaW5nIHRvIGxvZyB0aGUgaW5vZGUgc2l6ZSBjaGFuZ2UgaW4gdGhpcyB0cmFuc2FjdGlvbiBzbworCSAqIGFueSBwcmV2aW91cyB3cml0ZXMgdGhhdCBhcmUgYmV5b25kIHRoZSBvbiBkaXNrIEVPRiBhbmQgdGhlIG5ldworCSAqIEVPRiB0aGF0IGhhdmUgbm90IGJlZW4gd3JpdHRlbiBvdXQgbmVlZCB0byBiZSB3cml0dGVuIGhlcmUuICBJZiB3ZQorCSAqIGRvIG5vdCB3cml0ZSB0aGUgZGF0YSBvdXQsIHdlIGV4cG9zZSBvdXJzZWx2ZXMgdG8gdGhlIG51bGwgZmlsZXMKKwkgKiBwcm9ibGVtLgorCSAqCisJICogT25seSBmbHVzaCBmcm9tIHRoZSBvbiBkaXNrIHNpemUgdG8gdGhlIHNtYWxsZXIgb2YgdGhlIGluIG1lbW9yeQorCSAqIGZpbGUgc2l6ZSBvciB0aGUgbmV3IHNpemUgYXMgdGhhdCdzIHRoZSByYW5nZSB3ZSByZWFsbHkgY2FyZSBhYm91dAorCSAqIGhlcmUgYW5kIHByZXZlbnRzIHdhaXRpbmcgZm9yIG90aGVyIGRhdGEgbm90IHdpdGhpbiB0aGUgcmFuZ2Ugd2UKKwkgKiBjYXJlIGFib3V0IGhlcmUuCisJICovCisJaWYgKGlwLT5pX3NpemUgIT0gaXAtPmlfZC5kaV9zaXplICYmIGlhdHRyLT5pYV9zaXplID4gaXAtPmlfZC5kaV9zaXplKSB7CisJCWVycm9yID0geGZzX2ZsdXNoX3BhZ2VzKGlwLCBpcC0+aV9kLmRpX3NpemUsIGlhdHRyLT5pYV9zaXplLAorCQkJCQlYQkZfQVNZTkMsIEZJX05PTkUpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyoKKwkgKiBXYWl0IGZvciBhbGwgSS9PIHRvIGNvbXBsZXRlLgorCSAqLworCXhmc19pb2VuZF93YWl0KGlwKTsKKworCWVycm9yID0gLWJsb2NrX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaWF0dHItPmlhX3NpemUsCisJCQkJICAgICB4ZnNfZ2V0X2Jsb2Nrcyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1NFVEFUVFJfU0laRSk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX0lUUlVOQ0FURV9MT0dfUkVTKG1wKSwgMCwKKwkJCQkgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkgWEZTX0lUUlVOQ0FURV9MT0dfQ09VTlQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfdHJhbnNfY2FuY2VsOworCisJdHJ1bmNhdGVfc2V0c2l6ZShpbm9kZSwgaWF0dHItPmlhX3NpemUpOworCisJY29tbWl0X2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKKwlsb2NrX2ZsYWdzIHw9IFhGU19JTE9DS19FWENMOworCisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKworCS8qCisJICogT25seSBjaGFuZ2UgdGhlIGMvbXRpbWUgaWYgd2UgYXJlIGNoYW5naW5nIHRoZSBzaXplIG9yIHdlIGFyZQorCSAqIGV4cGxpY2l0bHkgYXNrZWQgdG8gY2hhbmdlIGl0LiAgVGhpcyBoYW5kbGVzIHRoZSBzZW1hbnRpYyBkaWZmZXJlbmNlCisJICogYmV0d2VlbiB0cnVuY2F0ZSgpIGFuZCBmdHJ1bmNhdGUoKSBhcyBpbXBsZW1lbnRlZCBpbiB0aGUgVkZTLgorCSAqCisJICogVGhlIHJlZ3VsYXIgdHJ1bmNhdGUoKSBjYXNlIHdpdGhvdXQgQVRUUl9DVElNRSBhbmQgQVRUUl9NVElNRSBpcyBhCisJICogc3BlY2lhbCBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSB0aW1lcyBkZXNwaXRlIG5vdCBoYXZpbmcKKwkgKiB0aGVzZSBmbGFncyBzZXQuICBGb3IgYWxsIG90aGVyIG9wZXJhdGlvbnMgdGhlIFZGUyBzZXQgdGhlc2UgZmxhZ3MKKwkgKiBleHBsaWNpdGx5IGlmIGl0IHdhbnRzIGEgdGltZXN0YW1wIHVwZGF0ZS4KKwkgKi8KKwlpZiAoaWF0dHItPmlhX3NpemUgIT0gaXAtPmlfc2l6ZSAmJgorCSAgICAoIShtYXNrICYgKEFUVFJfQ1RJTUUgfCBBVFRSX01USU1FKSkpKSB7CisJCWlhdHRyLT5pYV9jdGltZSA9IGlhdHRyLT5pYV9tdGltZSA9CisJCQljdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCQltYXNrIHw9IEFUVFJfQ1RJTUUgfCBBVFRSX01USU1FOworCX0KKworCWlmIChpYXR0ci0+aWFfc2l6ZSA+IGlwLT5pX3NpemUpIHsKKwkJaXAtPmlfZC5kaV9zaXplID0gaWF0dHItPmlhX3NpemU7CisJCWlwLT5pX3NpemUgPSBpYXR0ci0+aWFfc2l6ZTsKKwl9IGVsc2UgaWYgKGlhdHRyLT5pYV9zaXplIDw9IGlwLT5pX3NpemUgfHwKKwkJICAgKGlhdHRyLT5pYV9zaXplID09IDAgJiYgaXAtPmlfZC5kaV9uZXh0ZW50cykpIHsKKwkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2RhdGEoJnRwLCBpcCwgaWF0dHItPmlhX3NpemUpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF90cmFuc19hYm9ydDsKKworCQkvKgorCQkgKiBUcnVuY2F0ZWQgImRvd24iLCBzbyB3ZSdyZSByZW1vdmluZyByZWZlcmVuY2VzIHRvIG9sZCBkYXRhCisJCSAqIGhlcmUgLSBpZiB3ZSBkZWxheSBmbHVzaGluZyBmb3IgYSBsb25nIHRpbWUsIHdlIGV4cG9zZQorCQkgKiBvdXJzZWx2ZXMgdW5kdWx5IHRvIHRoZSBub3RvcmlvdXMgTlVMTCBmaWxlcyBwcm9ibGVtLiAgU28sCisJCSAqIHdlIG1hcmsgdGhpcyBpbm9kZSBhbmQgZmx1c2ggaXQgd2hlbiB0aGUgZmlsZSBpcyBjbG9zZWQsCisJCSAqIGFuZCBkbyBub3Qgd2FpdCB0aGUgdXN1YWwgKGxvbmcpIHRpbWUgZm9yIHdyaXRlb3V0LgorCQkgKi8KKwkJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JVFJVTkNBVEVEKTsKKwl9CisKKwlpZiAobWFzayAmIEFUVFJfQ1RJTUUpIHsKKwkJaW5vZGUtPmlfY3RpbWUgPSBpYXR0ci0+aWFfY3RpbWU7CisJCWlwLT5pX2QuZGlfY3RpbWUudF9zZWMgPSBpYXR0ci0+aWFfY3RpbWUudHZfc2VjOworCQlpcC0+aV9kLmRpX2N0aW1lLnRfbnNlYyA9IGlhdHRyLT5pYV9jdGltZS50dl9uc2VjOworCQlpcC0+aV91cGRhdGVfY29yZSA9IDE7CisJfQorCWlmIChtYXNrICYgQVRUUl9NVElNRSkgeworCQlpbm9kZS0+aV9tdGltZSA9IGlhdHRyLT5pYV9tdGltZTsKKwkJaXAtPmlfZC5kaV9tdGltZS50X3NlYyA9IGlhdHRyLT5pYV9tdGltZS50dl9zZWM7CisJCWlwLT5pX2QuZGlfbXRpbWUudF9uc2VjID0gaWF0dHItPmlhX210aW1lLnR2X25zZWM7CisJCWlwLT5pX3VwZGF0ZV9jb3JlID0gMTsKKwl9CisKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisKKwlYRlNfU1RBVFNfSU5DKHhzX2lnX2F0dHJjaGcpOworCisJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKQorCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTKTsKK291dF91bmxvY2s6CisJaWYgKGxvY2tfZmxhZ3MpCisJCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm4gZXJyb3I7CisKK291dF90cmFuc19hYm9ydDoKKwljb21taXRfZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOworb3V0X3RyYW5zX2NhbmNlbDoKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjb21taXRfZmxhZ3MpOworCWdvdG8gb3V0X3VubG9jazsKK30KKwogU1RBVElDIGludAogeGZzX3ZuX3NldGF0dHIoCiAJc3RydWN0IGRlbnRyeQkqZGVudHJ5LAogCXN0cnVjdCBpYXR0cgkqaWF0dHIpCiB7Ci0JcmV0dXJuIC14ZnNfc2V0YXR0cihYRlNfSShkZW50cnktPmRfaW5vZGUpLCBpYXR0ciwgMCk7CisJaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkKKwkJcmV0dXJuIC14ZnNfc2V0YXR0cl9zaXplKFhGU19JKGRlbnRyeS0+ZF9pbm9kZSksIGlhdHRyLCAwKTsKKwlyZXR1cm4gLXhmc19zZXRhdHRyX25vbnNpemUoWEZTX0koZGVudHJ5LT5kX2lub2RlKSwgaWF0dHIsIDApOwogfQogCiAjZGVmaW5lIFhGU19GSUVNQVBfRkxBR1MJKEZJRU1BUF9GTEFHX1NZTkN8RklFTUFQX0ZMQUdfWEFUVFIpCkBAIC01OTEsNyArMTAyMiw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB4ZnNfaW5vZGVfb3BlcmF0aW9ucyA9IHsKLQkuY2hlY2tfYWNsCQk9IHhmc19jaGVja19hY2wsCisJLmdldF9hY2wJCT0geGZzX2dldF9hY2wsCiAJLmdldGF0dHIJCT0geGZzX3ZuX2dldGF0dHIsCiAJLnNldGF0dHIJCT0geGZzX3ZuX3NldGF0dHIsCiAJLnNldHhhdHRyCQk9IGdlbmVyaWNfc2V0eGF0dHIsCkBAIC02MTcsNyArMTA0OCw3IEBACiAJLnJtZGlyCQkJPSB4ZnNfdm5fdW5saW5rLAogCS5ta25vZAkJCT0geGZzX3ZuX21rbm9kLAogCS5yZW5hbWUJCQk9IHhmc192bl9yZW5hbWUsCi0JLmNoZWNrX2FjbAkJPSB4ZnNfY2hlY2tfYWNsLAorCS5nZXRfYWNsCQk9IHhmc19nZXRfYWNsLAogCS5nZXRhdHRyCQk9IHhmc192bl9nZXRhdHRyLAogCS5zZXRhdHRyCQk9IHhmc192bl9zZXRhdHRyLAogCS5zZXR4YXR0cgkJPSBnZW5lcmljX3NldHhhdHRyLApAQCAtNjQyLDcgKzEwNzMsNyBAQAogCS5ybWRpcgkJCT0geGZzX3ZuX3VubGluaywKIAkubWtub2QJCQk9IHhmc192bl9ta25vZCwKIAkucmVuYW1lCQkJPSB4ZnNfdm5fcmVuYW1lLAotCS5jaGVja19hY2wJCT0geGZzX2NoZWNrX2FjbCwKKwkuZ2V0X2FjbAkJPSB4ZnNfZ2V0X2FjbCwKIAkuZ2V0YXR0cgkJPSB4ZnNfdm5fZ2V0YXR0ciwKIAkuc2V0YXR0cgkJPSB4ZnNfdm5fc2V0YXR0ciwKIAkuc2V0eGF0dHIJCT0gZ2VuZXJpY19zZXR4YXR0ciwKQEAgLTY1NSw3ICsxMDg2LDcgQEAKIAkucmVhZGxpbmsJCT0gZ2VuZXJpY19yZWFkbGluaywKIAkuZm9sbG93X2xpbmsJCT0geGZzX3ZuX2ZvbGxvd19saW5rLAogCS5wdXRfbGluawkJPSB4ZnNfdm5fcHV0X2xpbmssCi0JLmNoZWNrX2FjbAkJPSB4ZnNfY2hlY2tfYWNsLAorCS5nZXRfYWNsCQk9IHhmc19nZXRfYWNsLAogCS5nZXRhdHRyCQk9IHhmc192bl9nZXRhdHRyLAogCS5zZXRhdHRyCQk9IHhmc192bl9zZXRhdHRyLAogCS5zZXR4YXR0cgkJPSBnZW5lcmljX3NldHhhdHRyLApAQCAtNzYzLDYgKzExOTQsMTAgQEAKIAkJYnJlYWs7CiAJfQogCisJLyogaWYgdGhlcmUgaXMgbm8gYXR0cmlidXRlIGZvcmsgbm8gQUNMIGNhbiBleGlzdCBvbiB0aGlzIGlub2RlICovCisJaWYgKCFYRlNfSUZPUktfUShpcCkpCisJCWNhY2hlX25vX2FjbChpbm9kZSk7CisKIAl4ZnNfaWZsYWdzX2NsZWFyKGlwLCBYRlNfSU5FVyk7CiAJYmFycmllcigpOwogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaAppbmRleCA4NjMzNTIxLi5kNDJmODE0IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKQEAgLTMzLDcgKzMzLDYgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8eGZzX3R5cGVzLmg+Ci0jaW5jbHVkZSA8eGZzX2FyY2guaD4KIAogI2luY2x1ZGUgPGttZW0uaD4KICNpbmNsdWRlIDxtcmxvY2suaD4KQEAgLTg4LDYgKzg3LDEyIEBACiAjaW5jbHVkZSA8eGZzX2J1Zi5oPgogI2luY2x1ZGUgPHhmc19tZXNzYWdlLmg+CiAKKyNpZmRlZiBfX0JJR19FTkRJQU4KKyNkZWZpbmUgWEZTX05BVElWRV9IT1NUIDEKKyNlbHNlCisjdW5kZWYgWEZTX05BVElWRV9IT1NUCisjZW5kaWYKKwogLyoKICAqIEZlYXR1cmUgbWFjcm9zIChkaXNhYmxlL2VuYWJsZSkKICAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKaW5kZXggMWUzYTdjZS4uOWE3MmRkYSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZV90cmFjZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgogI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCkBAIC02MjcsNjggKzYyNiw2IEBACiAJCWJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURXxGTU9ERV9FWENMKTsKIH0KIAotLyoKLSAqIFRyeSB0byB3cml0ZSBvdXQgdGhlIHN1cGVyYmxvY2sgdXNpbmcgYmFycmllcnMuCi0gKi8KLVNUQVRJQyBpbnQKLXhmc19iYXJyaWVyX3Rlc3QoCi0JeGZzX21vdW50X3QJKm1wKQotewotCXhmc19idWZfdAkqc2JwID0geGZzX2dldHNiKG1wLCAwKTsKLQlpbnQJCWVycm9yOwotCi0JWEZTX0JVRl9VTkRPTkUoc2JwKTsKLQlYRlNfQlVGX1VOUkVBRChzYnApOwotCVhGU19CVUZfVU5ERUxBWVdSSVRFKHNicCk7Ci0JWEZTX0JVRl9XUklURShzYnApOwotCVhGU19CVUZfVU5BU1lOQyhzYnApOwotCVhGU19CVUZfT1JERVJFRChzYnApOwotCi0JeGZzYmRzdHJhdChtcCwgc2JwKTsKLQllcnJvciA9IHhmc19idWZfaW93YWl0KHNicCk7Ci0KLQkvKgotCSAqIENsZWFyIGFsbCB0aGUgZmxhZ3Mgd2Ugc2V0IGFuZCBwb3NzaWJsZSBlcnJvciBzdGF0ZSBpbiB0aGUKLQkgKiBidWZmZXIuICBXZSBvbmx5IGRpZCB0aGUgd3JpdGUgdG8gdHJ5IG91dCB3aGV0aGVyIGJhcnJpZXJzCi0JICogd29ya2VkIGFuZCBzaG91bGRuJ3QgbGVhdmUgYW55IHRyYWNlcyBpbiB0aGUgc3VwZXJibG9jawotCSAqIGJ1ZmZlci4KLQkgKi8KLQlYRlNfQlVGX0RPTkUoc2JwKTsKLQlYRlNfQlVGX0VSUk9SKHNicCwgMCk7Ci0JWEZTX0JVRl9VTk9SREVSRUQoc2JwKTsKLQotCXhmc19idWZfcmVsc2Uoc2JwKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLVNUQVRJQyB2b2lkCi14ZnNfbW91bnRmc19jaGVja19iYXJyaWVycyh4ZnNfbW91bnRfdCAqbXApCi17Ci0JaW50IGVycm9yOwotCi0JaWYgKG1wLT5tX2xvZ2Rldl90YXJncCAhPSBtcC0+bV9kZGV2X3RhcmdwKSB7Ci0JCXhmc19ub3RpY2UobXAsCi0JCSAgIkRpc2FibGluZyBiYXJyaWVycywgbm90IHN1cHBvcnRlZCB3aXRoIGV4dGVybmFsIGxvZyBkZXZpY2UiKTsKLQkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHhmc19yZWFkb25seV9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3ApKSB7Ci0JCXhmc19ub3RpY2UobXAsCi0JCQkiRGlzYWJsaW5nIGJhcnJpZXJzLCB1bmRlcmx5aW5nIGRldmljZSBpcyByZWFkb25seSIpOwotCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0JBUlJJRVI7Ci0JCXJldHVybjsKLQl9Ci0KLQllcnJvciA9IHhmc19iYXJyaWVyX3Rlc3QobXApOwotCWlmIChlcnJvcikgewotCQl4ZnNfbm90aWNlKG1wLAotCQkJIkRpc2FibGluZyBiYXJyaWVycywgdHJpYWwgYmFycmllciB3cml0ZSBmYWlsZWQiKTsKLQkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOwotCQlyZXR1cm47Ci0JfQotfQotCiB2b2lkCiB4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKAogCXhmc19idWZ0YXJnX3QJCSpidWZ0YXJnKQpAQCAtMTA4NywxMSArMTAyNCw2IEBACiB7CiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSBYRlNfTShzYik7CiAKLQkvKgotCSAqIFVucmVnaXN0ZXIgdGhlIG1lbW9yeSBzaHJpbmtlciBiZWZvcmUgd2UgdGVhciBkb3duIHRoZSBtb3VudAotCSAqIHN0cnVjdHVyZSBzbyB3ZSBkb24ndCBoYXZlIG1lbW9yeSByZWNsYWltIHJhY2luZyB3aXRoIHVzIGhlcmUuCi0JICovCi0JeGZzX2lub2RlX3Nocmlua2VyX3VucmVnaXN0ZXIobXApOwogCXhmc19zeW5jZF9zdG9wKG1wKTsKIAogCS8qCkBAIC0xMjQwLDE0ICsxMTcyLDYgQEAKIAkJc3dpdGNoICh0b2tlbikgewogCQljYXNlIE9wdF9iYXJyaWVyOgogCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0JBUlJJRVI7Ci0KLQkJCS8qCi0JCQkgKiBUZXN0IGlmIGJhcnJpZXJzIGFyZSBhY3R1YWxseSB3b3JraW5nIGlmIHdlIGNhbiwKLQkJCSAqIGVsc2UgZGVsYXkgdGhpcyBjaGVjayB1bnRpbCB0aGUgZmlsZXN5c3RlbSBpcwotCQkJICogbWFya2VkIHdyaXRlYWJsZS4KLQkJCSAqLwotCQkJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKSkKLQkJCQl4ZnNfbW91bnRmc19jaGVja19iYXJyaWVycyhtcCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9iYXJyaWVyOgogCQkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9CQVJSSUVSOwpAQCAtMTI4Miw4ICsxMjA2LDYgQEAKIAkvKiBybyAtPiBydyAqLwogCWlmICgobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKSAmJiAhKCpmbGFncyAmIE1TX1JET05MWSkpIHsKIAkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9SRE9OTFk7Ci0JCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKQotCQkJeGZzX21vdW50ZnNfY2hlY2tfYmFycmllcnMobXApOwogCiAJCS8qCiAJCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IHJlbW91bnQgdG8gd3JpdGVhYmxlIHN0YXRlIHdlCkBAIC0xNDY1LDkgKzEzODcsNiBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZnJlZV9zYjsKIAotCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKQotCQl4ZnNfbW91bnRmc19jaGVja19iYXJyaWVycyhtcCk7Ci0KIAllcnJvciA9IHhmc19maWxlc3RyZWFtX21vdW50KG1wKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2ZyZWVfc2I7CkBAIC0xNDg3LDM2ICsxNDA2LDMxIEBACiAJc2ItPnNfdGltZV9ncmFuID0gMTsKIAlzZXRfcG9zaXhfYWNsX2ZsYWcoc2IpOwogCi0JZXJyb3IgPSB4ZnNfc3luY2RfaW5pdChtcCk7CisJZXJyb3IgPSB4ZnNfbW91bnRmcyhtcCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9maWxlc3RyZWFtX3VubW91bnQ7CiAKLQl4ZnNfaW5vZGVfc2hyaW5rZXJfcmVnaXN0ZXIobXApOwotCi0JZXJyb3IgPSB4ZnNfbW91bnRmcyhtcCk7CisJZXJyb3IgPSB4ZnNfc3luY2RfaW5pdChtcCk7CiAJaWYgKGVycm9yKQotCQlnb3RvIG91dF9zeW5jZF9zdG9wOworCQlnb3RvIG91dF91bm1vdW50OwogCiAJcm9vdCA9IGlncmFiKFZGU19JKG1wLT5tX3Jvb3RpcCkpOwogCWlmICghcm9vdCkgewogCQllcnJvciA9IEVOT0VOVDsKLQkJZ290byBmYWlsX3VubW91bnQ7CisJCWdvdG8gb3V0X3N5bmNkX3N0b3A7CiAJfQogCWlmIChpc19iYWRfaW5vZGUocm9vdCkpIHsKIAkJZXJyb3IgPSBFSU5WQUw7Ci0JCWdvdG8gZmFpbF92bnJlbGU7CisJCWdvdG8gb3V0X3N5bmNkX3N0b3A7CiAJfQogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CiAJaWYgKCFzYi0+c19yb290KSB7CiAJCWVycm9yID0gRU5PTUVNOwotCQlnb3RvIGZhaWxfdm5yZWxlOworCQlnb3RvIG91dF9pcHV0OwogCX0KIAogCXJldHVybiAwOwogCi0gb3V0X3N5bmNkX3N0b3A6Ci0JeGZzX2lub2RlX3Nocmlua2VyX3VucmVnaXN0ZXIobXApOwotCXhmc19zeW5jZF9zdG9wKG1wKTsKICBvdXRfZmlsZXN0cmVhbV91bm1vdW50OgogCXhmc19maWxlc3RyZWFtX3VubW91bnQobXApOwogIG91dF9mcmVlX3NiOgpAQCAtMTUzMSwxOCArMTQ0NSwxMSBAQAogIG91dDoKIAlyZXR1cm4gLWVycm9yOwogCi0gZmFpbF92bnJlbGU6Ci0JaWYgKHNiLT5zX3Jvb3QpIHsKLQkJZHB1dChzYi0+c19yb290KTsKLQkJc2ItPnNfcm9vdCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJaXB1dChyb290KTsKLQl9Ci0KLSBmYWlsX3VubW91bnQ6Ci0JeGZzX2lub2RlX3Nocmlua2VyX3VucmVnaXN0ZXIobXApOworIG91dF9pcHV0OgorCWlwdXQocm9vdCk7Cisgb3V0X3N5bmNkX3N0b3A6CiAJeGZzX3N5bmNkX3N0b3AobXApOwotCisgb3V0X3VubW91bnQ6CiAJLyoKIAkgKiBCbG93IGF3YXkgYW55IHJlZmVyZW5jZWQgaW5vZGUgaW4gdGhlIGZpbGVzdHJlYW1zIGNhY2hlLgogCSAqIFRoaXMgY2FuIGFuZCB3aWxsIGNhdXNlIGxvZyB0cmFmZmljIGFzIGlub2RlcyBnbyBpbmFjdGl2ZQpAQCAtMTU2Niw2ICsxNDczLDIxIEBACiAJcmV0dXJuIG1vdW50X2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCB4ZnNfZnNfZmlsbF9zdXBlcik7CiB9CiAKK3N0YXRpYyBpbnQKK3hmc19mc19ucl9jYWNoZWRfb2JqZWN0cygKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiKQoreworCXJldHVybiB4ZnNfcmVjbGFpbV9pbm9kZXNfY291bnQoWEZTX00oc2IpKTsKK30KKworc3RhdGljIHZvaWQKK3hmc19mc19mcmVlX2NhY2hlZF9vYmplY3RzKAorCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IsCisJaW50CQkJbnJfdG9fc2NhbikKK3sKKwl4ZnNfcmVjbGFpbV9pbm9kZXNfbnIoWEZTX00oc2IpLCBucl90b19zY2FuKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHhmc19zdXBlcl9vcGVyYXRpb25zID0gewogCS5hbGxvY19pbm9kZQkJPSB4ZnNfZnNfYWxsb2NfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUJCT0geGZzX2ZzX2Rlc3Ryb3lfaW5vZGUsCkBAIC0xNTc5LDYgKzE1MDEsOCBAQAogCS5zdGF0ZnMJCQk9IHhmc19mc19zdGF0ZnMsCiAJLnJlbW91bnRfZnMJCT0geGZzX2ZzX3JlbW91bnQsCiAJLnNob3dfb3B0aW9ucwkJPSB4ZnNfZnNfc2hvd19vcHRpb25zLAorCS5ucl9jYWNoZWRfb2JqZWN0cwk9IHhmc19mc19ucl9jYWNoZWRfb2JqZWN0cywKKwkuZnJlZV9jYWNoZWRfb2JqZWN0cwk9IHhmc19mc19mcmVlX2NhY2hlZF9vYmplY3RzLAogfTsKIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHhmc19mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5jCmluZGV4IDhlY2FkNWYuLmU0YzkzOGEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmMKQEAgLTE3OSw2ICsxNzksOCBAQAogCQlpZiAoZXJyb3IgPT0gRUZTQ09SUlVQVEVEKQogCQkJYnJlYWs7CiAKKwkJY29uZF9yZXNjaGVkKCk7CisKIAl9IHdoaWxlIChucl9mb3VuZCAmJiAhZG9uZSk7CiAKIAlpZiAoc2tpcHBlZCkgewpAQCAtMzU5LDE0ICszNjEsMTIgQEAKIHsKIAlpbnQJCQllcnJvciwgZXJyb3IyID0gMDsKIAotCS8qIHB1c2ggbm9uLWJsb2NraW5nICovCi0JeGZzX3N5bmNfZGF0YShtcCwgMCk7CiAJeGZzX3FtX3N5bmMobXAsIFNZTkNfVFJZTE9DSyk7Ci0KLQkvKiBwdXNoIGFuZCBibG9jayB0aWxsIGNvbXBsZXRlICovCi0JeGZzX3N5bmNfZGF0YShtcCwgU1lOQ19XQUlUKTsKIAl4ZnNfcW1fc3luYyhtcCwgU1lOQ19XQUlUKTsKIAorCS8qIGZvcmNlIG91dCB0aGUgbmV3bHkgZGlydGllZCBsb2cgYnVmZmVycyAqLworCXhmc19sb2dfZm9yY2UobXAsIFhGU19MT0dfU1lOQyk7CisKIAkvKiB3cml0ZSBzdXBlcmJsb2NrIGFuZCBob292ZXIgdXAgc2h1dGRvd24gZXJyb3JzICovCiAJZXJyb3IgPSB4ZnNfc3luY19mc2RhdGEobXApOwogCkBAIC00MzYsNyArNDM2LDcgQEAKIAlXQVJOX09OKGF0b21pY19yZWFkKCZtcC0+bV9hY3RpdmVfdHJhbnMpICE9IDApOwogCiAJLyogUHVzaCB0aGUgc3VwZXJibG9jayBhbmQgd3JpdGUgYW4gdW5tb3VudCByZWNvcmQgKi8KLQllcnJvciA9IHhmc19sb2dfc2Jjb3VudChtcCwgMSk7CisJZXJyb3IgPSB4ZnNfbG9nX3NiY291bnQobXApOwogCWlmIChlcnJvcikKIAkJeGZzX3dhcm4obXAsICJ4ZnNfYXR0cl9xdWllc2NlOiBmYWlsZWQgdG8gbG9nIHNiIGNoYW5nZXMuICIKIAkJCQkiRnJvemVuIGltYWdlIG1heSBub3QgYmUgY29uc2lzdGVudC4iKTsKQEAgLTk4Niw2ICs5ODYsOCBAQAogCiAJCQkqbnJfdG9fc2NhbiAtPSBYRlNfTE9PS1VQX0JBVENIOwogCisJCQljb25kX3Jlc2NoZWQoKTsKKwogCQl9IHdoaWxlIChucl9mb3VuZCAmJiAhZG9uZSAmJiAqbnJfdG9fc2NhbiA+IDApOwogCiAJCWlmICh0cnlsb2NrICYmICFkb25lKQpAQCAtMTAwMyw3ICsxMDA1LDcgQEAKIAkgKiBlbnN1cmUgdGhhdCB3aGVuIHdlIGdldCBtb3JlIHJlY2xhaW1lcnMgdGhhbiBBR3Mgd2UgYmxvY2sgcmF0aGVyCiAJICogdGhhbiBzcGluIHRyeWluZyB0byBleGVjdXRlIHJlY2xhaW0uCiAJICovCi0JaWYgKHRyeWxvY2sgJiYgc2tpcHBlZCAmJiAqbnJfdG9fc2NhbiA+IDApIHsKKwlpZiAoc2tpcHBlZCAmJiAoZmxhZ3MgJiBTWU5DX1dBSVQpICYmICpucl90b19zY2FuID4gMCkgewogCQl0cnlsb2NrID0gMDsKIAkJZ290byByZXN0YXJ0OwogCX0KQEAgLTEwMjEsNDQgKzEwMjMsMzggQEAKIH0KIAogLyoKLSAqIElub2RlIGNhY2hlIHNocmlua2VyLgorICogU2NhbiBhIGNlcnRhaW4gbnVtYmVyIG9mIGlub2RlcyBmb3IgcmVjbGFpbS4KICAqCiAgKiBXaGVuIGNhbGxlZCB3ZSBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBhIGJhY2tncm91bmQgKGZhc3QpIGlub2RlIHJlY2xhaW0gaW4KLSAqIHByb2dyZXNzLCB3aGlsZSB3ZSB3aWxsIHRocm90dGxlIHRoZSBzcGVlZCBvZiByZWNsYWltIHZpYSBkb2lpbmcgc3luY2hyb25vdXMKKyAqIHByb2dyZXNzLCB3aGlsZSB3ZSB3aWxsIHRocm90dGxlIHRoZSBzcGVlZCBvZiByZWNsYWltIHZpYSBkb2luZyBzeW5jaHJvbm91cwogICogcmVjbGFpbSBvZiBpbm9kZXMuIFRoYXQgbWVhbnMgaWYgd2UgY29tZSBhY3Jvc3MgZGlydHkgaW5vZGVzLCB3ZSB3YWl0IGZvcgogICogdGhlbSB0byBiZSBjbGVhbmVkLCB3aGljaCB3ZSBob3BlIHdpbGwgbm90IGJlIHZlcnkgbG9uZyBkdWUgdG8gdGhlCiAgKiBiYWNrZ3JvdW5kIHdhbGtlciBoYXZpbmcgYWxyZWFkeSBraWNrZWQgdGhlIElPIG9mZiBvbiB0aG9zZSBkaXJ0eSBpbm9kZXMuCiAgKi8KLXN0YXRpYyBpbnQKLXhmc19yZWNsYWltX2lub2RlX3NocmluaygKLQlzdHJ1Y3Qgc2hyaW5rZXIJKnNocmluaywKLQlzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQordm9pZAoreGZzX3JlY2xhaW1faW5vZGVzX25yKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCWludAkJCW5yX3RvX3NjYW4pCiB7Ci0Jc3RydWN0IHhmc19tb3VudCAqbXA7Ci0Jc3RydWN0IHhmc19wZXJhZyAqcGFnOwotCXhmc19hZ251bWJlcl90CWFnOwotCWludAkJcmVjbGFpbWFibGU7Ci0JaW50IG5yX3RvX3NjYW4gPSBzYy0+bnJfdG9fc2NhbjsKLQlnZnBfdCBnZnBfbWFzayA9IHNjLT5nZnBfbWFzazsKKwkvKiBraWNrIGJhY2tncm91bmQgcmVjbGFpbWVyIGFuZCBwdXNoIHRoZSBBSUwgKi8KKwl4ZnNfc3luY2RfcXVldWVfcmVjbGFpbShtcCk7CisJeGZzX2FpbF9wdXNoX2FsbChtcC0+bV9haWwpOwogCi0JbXAgPSBjb250YWluZXJfb2Yoc2hyaW5rLCBzdHJ1Y3QgeGZzX21vdW50LCBtX2lub2RlX3Nocmluayk7Ci0JaWYgKG5yX3RvX3NjYW4pIHsKLQkJLyoga2ljayBiYWNrZ3JvdW5kIHJlY2xhaW1lciBhbmQgcHVzaCB0aGUgQUlMICovCi0JCXhmc19zeW5jZF9xdWV1ZV9yZWNsYWltKG1wKTsKLQkJeGZzX2FpbF9wdXNoX2FsbChtcC0+bV9haWwpOworCXhmc19yZWNsYWltX2lub2Rlc19hZyhtcCwgU1lOQ19UUllMT0NLIHwgU1lOQ19XQUlULCAmbnJfdG9fc2Nhbik7Cit9CiAKLQkJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9GUykpCi0JCQlyZXR1cm4gLTE7CisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVjbGFpbWFibGUgaW5vZGVzIGluIHRoZSBmaWxlc3lzdGVtIGZvcgorICogdGhlIHNocmlua2VyIHRvIGRldGVybWluZSBob3cgbXVjaCB0byByZWNsYWltLgorICovCitpbnQKK3hmc19yZWNsYWltX2lub2Rlc19jb3VudCgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCkKK3sKKwlzdHJ1Y3QgeGZzX3BlcmFnCSpwYWc7CisJeGZzX2FnbnVtYmVyX3QJCWFnID0gMDsKKwlpbnQJCQlyZWNsYWltYWJsZSA9IDA7CiAKLQkJeGZzX3JlY2xhaW1faW5vZGVzX2FnKG1wLCBTWU5DX1RSWUxPQ0sgfCBTWU5DX1dBSVQsCi0JCQkJCSZucl90b19zY2FuKTsKLQkJLyogdGVybWluYXRlIGlmIHdlIGRvbid0IGV4aGF1c3QgdGhlIHNjYW4gKi8KLQkJaWYgKG5yX3RvX3NjYW4gPiAwKQotCQkJcmV0dXJuIC0xOwotICAgICAgIH0KLQotCXJlY2xhaW1hYmxlID0gMDsKLQlhZyA9IDA7CiAJd2hpbGUgKChwYWcgPSB4ZnNfcGVyYWdfZ2V0X3RhZyhtcCwgYWcsIFhGU19JQ0lfUkVDTEFJTV9UQUcpKSkgewogCQlhZyA9IHBhZy0+cGFnX2Fnbm8gKyAxOwogCQlyZWNsYWltYWJsZSArPSBwYWctPnBhZ19pY2lfcmVjbGFpbWFibGU7CkBAIC0xMDY3LDE4ICsxMDYzLDMgQEAKIAlyZXR1cm4gcmVjbGFpbWFibGU7CiB9CiAKLXZvaWQKLXhmc19pbm9kZV9zaHJpbmtlcl9yZWdpc3RlcigKLQlzdHJ1Y3QgeGZzX21vdW50CSptcCkKLXsKLQltcC0+bV9pbm9kZV9zaHJpbmsuc2hyaW5rID0geGZzX3JlY2xhaW1faW5vZGVfc2hyaW5rOwotCW1wLT5tX2lub2RlX3Nocmluay5zZWVrcyA9IERFRkFVTFRfU0VFS1M7Ci0JcmVnaXN0ZXJfc2hyaW5rZXIoJm1wLT5tX2lub2RlX3Nocmluayk7Ci19Ci0KLXZvaWQKLXhmc19pbm9kZV9zaHJpbmtlcl91bnJlZ2lzdGVyKAotCXN0cnVjdCB4ZnNfbW91bnQJKm1wKQotewotCXVucmVnaXN0ZXJfc2hyaW5rZXIoJm1wLT5tX2lub2RlX3Nocmluayk7Ci19CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmgKaW5kZXggZTNhNmFkMi4uOTQxMjAyZSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuaApAQCAtMjEsMTQgKzIxLDYgQEAKIHN0cnVjdCB4ZnNfbW91bnQ7CiBzdHJ1Y3QgeGZzX3BlcmFnOwogCi10eXBlZGVmIHN0cnVjdCB4ZnNfc3luY193b3JrIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXdfbGlzdDsKLQlzdHJ1Y3QgeGZzX21vdW50CSp3X21vdW50OwotCXZvaWQJCQkqd19kYXRhOwkvKiBzeW5jZXIgcm91dGluZSBhcmd1bWVudCAqLwotCXZvaWQJCQkoKndfc3luY2VyKShzdHJ1Y3QgeGZzX21vdW50ICosIHZvaWQgKik7Ci0Jc3RydWN0IGNvbXBsZXRpb24JKndfY29tcGxldGlvbjsKLX0geGZzX3N5bmNfd29ya190OwotCiAjZGVmaW5lIFNZTkNfV0FJVAkJMHgwMDAxCS8qIHdhaXQgZm9yIGkvbyB0byBjb21wbGV0ZSAqLwogI2RlZmluZSBTWU5DX1RSWUxPQ0sJCTB4MDAwMiAgLyogb25seSB0cnkgdG8gbG9jayBpbm9kZXMgKi8KIApAQCAtNDMsNiArMzUsOCBAQAogdm9pZCB4ZnNfZmx1c2hfaW5vZGVzKHN0cnVjdCB4ZnNfaW5vZGUgKmlwKTsKIAogaW50IHhmc19yZWNsYWltX2lub2RlcyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IG1vZGUpOworaW50IHhmc19yZWNsYWltX2lub2Rlc19jb3VudChzdHJ1Y3QgeGZzX21vdW50ICptcCk7Cit2b2lkIHhmc19yZWNsYWltX2lub2Rlc19ucihzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IG5yX3RvX3NjYW4pOwogCiB2b2lkIHhmc19pbm9kZV9zZXRfcmVjbGFpbV90YWcoc3RydWN0IHhmc19pbm9kZSAqaXApOwogdm9pZCBfX3hmc19pbm9kZV9zZXRfcmVjbGFpbV90YWcoc3RydWN0IHhmc19wZXJhZyAqcGFnLCBzdHJ1Y3QgeGZzX2lub2RlICppcCk7CkBAIC01NCw3ICs0OCw0IEBACiAJaW50ICgqZXhlY3V0ZSkoc3RydWN0IHhmc19pbm9kZSAqaXAsIHN0cnVjdCB4ZnNfcGVyYWcgKnBhZywgaW50IGZsYWdzKSwKIAlpbnQgZmxhZ3MpOwogCi12b2lkIHhmc19pbm9kZV9zaHJpbmtlcl9yZWdpc3RlcihzdHJ1Y3QgeGZzX21vdW50ICptcCk7Ci12b2lkIHhmc19pbm9kZV9zaHJpbmtlcl91bnJlZ2lzdGVyKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc190cmFjZS5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdHJhY2UuaAppbmRleCBkNDhiN2E1Li42OTBmYzdhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc190cmFjZS5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3RyYWNlLmgKQEAgLTI5Myw3ICsyOTMsNyBAQAogCQlfX2VudHJ5LT5idWZmZXJfbGVuZ3RoID0gYnAtPmJfYnVmZmVyX2xlbmd0aDsKIAkJX19lbnRyeS0+aG9sZCA9IGF0b21pY19yZWFkKCZicC0+Yl9ob2xkKTsKIAkJX19lbnRyeS0+cGluY291bnQgPSBhdG9taWNfcmVhZCgmYnAtPmJfcGluX2NvdW50KTsKLQkJX19lbnRyeS0+bG9ja3ZhbCA9IHhmc19idWZfbG9ja192YWx1ZShicCk7CisJCV9fZW50cnktPmxvY2t2YWwgPSBicC0+Yl9zZW1hLmNvdW50OwogCQlfX2VudHJ5LT5mbGFncyA9IGJwLT5iX2ZsYWdzOwogCQlfX2VudHJ5LT5jYWxsZXJfaXAgPSBjYWxsZXJfaXA7CiAJKSwKQEAgLTMyMyw3ICszMjMsNyBAQAogREVGSU5FX0JVRl9FVkVOVCh4ZnNfYnVmX2Jkd3JpdGUpOwogREVGSU5FX0JVRl9FVkVOVCh4ZnNfYnVmX2xvY2spOwogREVGSU5FX0JVRl9FVkVOVCh4ZnNfYnVmX2xvY2tfZG9uZSk7Ci1ERUZJTkVfQlVGX0VWRU5UKHhmc19idWZfY29uZF9sb2NrKTsKK0RFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl90cnlsb2NrKTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl91bmxvY2spOwogREVGSU5FX0JVRl9FVkVOVCh4ZnNfYnVmX2lvd2FpdCk7CiBERUZJTkVfQlVGX0VWRU5UKHhmc19idWZfaW93YWl0X2RvbmUpOwpAQCAtMzY2LDcgKzM2Niw3IEBACiAJCV9fZW50cnktPmZsYWdzID0gZmxhZ3M7CiAJCV9fZW50cnktPmhvbGQgPSBhdG9taWNfcmVhZCgmYnAtPmJfaG9sZCk7CiAJCV9fZW50cnktPnBpbmNvdW50ID0gYXRvbWljX3JlYWQoJmJwLT5iX3Bpbl9jb3VudCk7Ci0JCV9fZW50cnktPmxvY2t2YWwgPSB4ZnNfYnVmX2xvY2tfdmFsdWUoYnApOworCQlfX2VudHJ5LT5sb2NrdmFsID0gYnAtPmJfc2VtYS5jb3VudDsKIAkJX19lbnRyeS0+Y2FsbGVyX2lwID0gY2FsbGVyX2lwOwogCSksCiAJVFBfcHJpbnRrKCJkZXYgJWQ6JWQgYm5vIDB4JWxseCBsZW4gMHglenggaG9sZCAlZCBwaW5jb3VudCAlZCAiCkBAIC00MDksNyArNDA5LDcgQEAKIAkJX19lbnRyeS0+YnVmZmVyX2xlbmd0aCA9IGJwLT5iX2J1ZmZlcl9sZW5ndGg7CiAJCV9fZW50cnktPmhvbGQgPSBhdG9taWNfcmVhZCgmYnAtPmJfaG9sZCk7CiAJCV9fZW50cnktPnBpbmNvdW50ID0gYXRvbWljX3JlYWQoJmJwLT5iX3Bpbl9jb3VudCk7Ci0JCV9fZW50cnktPmxvY2t2YWwgPSB4ZnNfYnVmX2xvY2tfdmFsdWUoYnApOworCQlfX2VudHJ5LT5sb2NrdmFsID0gYnAtPmJfc2VtYS5jb3VudDsKIAkJX19lbnRyeS0+ZXJyb3IgPSBlcnJvcjsKIAkJX19lbnRyeS0+ZmxhZ3MgPSBicC0+Yl9mbGFnczsKIAkJX19lbnRyeS0+Y2FsbGVyX2lwID0gY2FsbGVyX2lwOwpAQCAtNDU0LDcgKzQ1NCw3IEBACiAJCV9fZW50cnktPmJ1Zl9mbGFncyA9IGJpcC0+YmxpX2J1Zi0+Yl9mbGFnczsKIAkJX19lbnRyeS0+YnVmX2hvbGQgPSBhdG9taWNfcmVhZCgmYmlwLT5ibGlfYnVmLT5iX2hvbGQpOwogCQlfX2VudHJ5LT5idWZfcGluY291bnQgPSBhdG9taWNfcmVhZCgmYmlwLT5ibGlfYnVmLT5iX3Bpbl9jb3VudCk7Ci0JCV9fZW50cnktPmJ1Zl9sb2NrdmFsID0geGZzX2J1Zl9sb2NrX3ZhbHVlKGJpcC0+YmxpX2J1Zik7CisJCV9fZW50cnktPmJ1Zl9sb2NrdmFsID0gYmlwLT5ibGlfYnVmLT5iX3NlbWEuY291bnQ7CiAJCV9fZW50cnktPmxpX2Rlc2MgPSBiaXAtPmJsaV9pdGVtLmxpX2Rlc2M7CiAJCV9fZW50cnktPmxpX2ZsYWdzID0gYmlwLT5ibGlfaXRlbS5saV9mbGFnczsKIAkpLApAQCAtNTcxLDcgKzU3MSw3IEBACiBERUZJTkVfSU5PREVfRVZFTlQoeGZzX2ZyZWVfZmlsZV9zcGFjZSk7CiBERUZJTkVfSU5PREVfRVZFTlQoeGZzX3JlYWRkaXIpOwogI2lmZGVmIENPTkZJR19YRlNfUE9TSVhfQUNMCi1ERUZJTkVfSU5PREVfRVZFTlQoeGZzX2NoZWNrX2FjbCk7CitERUZJTkVfSU5PREVfRVZFTlQoeGZzX2dldF9hY2wpOwogI2VuZGlmCiBERUZJTkVfSU5PREVfRVZFTlQoeGZzX3ZtX2JtYXApOwogREVGSU5FX0lOT0RFX0VWRU5UKHhmc19maWxlX2lvY3RsKTsKQEAgLTk5OCw3ICs5OTgsOCBAQAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoZGV2X3QsIGRldikKIAkJX19maWVsZCh4ZnNfaW5vX3QsIGlubykKLQkJX19maWVsZChsb2ZmX3QsIHNpemUpCisJCV9fZmllbGQobG9mZl90LCBpc2l6ZSkKKwkJX19maWVsZChsb2ZmX3QsIGRpc2l6ZSkKIAkJX19maWVsZChsb2ZmX3QsIG5ld19zaXplKQogCQlfX2ZpZWxkKGxvZmZfdCwgb2Zmc2V0KQogCQlfX2ZpZWxkKHNpemVfdCwgY291bnQpCkBAIC0xMDA2LDE2ICsxMDA3LDE4IEBACiAJVFBfZmFzdF9hc3NpZ24oCiAJCV9fZW50cnktPmRldiA9IFZGU19JKGlwKS0+aV9zYi0+c19kZXY7CiAJCV9fZW50cnktPmlubyA9IGlwLT5pX2lubzsKLQkJX19lbnRyeS0+c2l6ZSA9IGlwLT5pX2QuZGlfc2l6ZTsKKwkJX19lbnRyeS0+aXNpemUgPSBpcC0+aV9zaXplOworCQlfX2VudHJ5LT5kaXNpemUgPSBpcC0+aV9kLmRpX3NpemU7CiAJCV9fZW50cnktPm5ld19zaXplID0gaXAtPmlfbmV3X3NpemU7CiAJCV9fZW50cnktPm9mZnNldCA9IG9mZnNldDsKIAkJX19lbnRyeS0+Y291bnQgPSBjb3VudDsKIAkpLAotCVRQX3ByaW50aygiZGV2ICVkOiVkIGlubyAweCVsbHggc2l6ZSAweCVsbHggbmV3X3NpemUgMHglbGx4ICIKKwlUUF9wcmludGsoImRldiAlZDolZCBpbm8gMHglbGx4IGlzaXplIDB4JWxseCBkaXNpemUgMHglbGx4IG5ld19zaXplIDB4JWxseCAiCiAJCSAgIm9mZnNldCAweCVsbHggY291bnQgJXpkIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgIF9fZW50cnktPmlubywKLQkJICBfX2VudHJ5LT5zaXplLAorCQkgIF9fZW50cnktPmlzaXplLAorCQkgIF9fZW50cnktPmRpc2l6ZSwKIAkJICBfX2VudHJ5LT5uZXdfc2l6ZSwKIAkJICBfX2VudHJ5LT5vZmZzZXQsCiAJCSAgX19lbnRyeS0+Y291bnQpCkBAIC0xMDI4LDQwICsxMDMxLDcgQEAKIERFRklORV9TSU1QTEVfSU9fRVZFTlQoeGZzX2RlbGFsbG9jX2Vub3NwYyk7CiBERUZJTkVfU0lNUExFX0lPX0VWRU5UKHhmc191bndyaXR0ZW5fY29udmVydCk7CiBERUZJTkVfU0lNUExFX0lPX0VWRU5UKHhmc19nZXRfYmxvY2tzX25vdGZvdW5kKTsKLQotCi1UUkFDRV9FVkVOVCh4ZnNfaXRydW5jYXRlX3N0YXJ0LAotCVRQX1BST1RPKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfZnNpemVfdCBuZXdfc2l6ZSwgaW50IGZsYWcsCi0JCSB4ZnNfb2ZmX3QgdG9zc19zdGFydCwgeGZzX29mZl90IHRvc3NfZmluaXNoKSwKLQlUUF9BUkdTKGlwLCBuZXdfc2l6ZSwgZmxhZywgdG9zc19zdGFydCwgdG9zc19maW5pc2gpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCV9fZmllbGQoZGV2X3QsIGRldikKLQkJX19maWVsZCh4ZnNfaW5vX3QsIGlubykKLQkJX19maWVsZCh4ZnNfZnNpemVfdCwgc2l6ZSkKLQkJX19maWVsZCh4ZnNfZnNpemVfdCwgbmV3X3NpemUpCi0JCV9fZmllbGQoeGZzX29mZl90LCB0b3NzX3N0YXJ0KQotCQlfX2ZpZWxkKHhmc19vZmZfdCwgdG9zc19maW5pc2gpCi0JCV9fZmllbGQoaW50LCBmbGFnKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmRldiA9IFZGU19JKGlwKS0+aV9zYi0+c19kZXY7Ci0JCV9fZW50cnktPmlubyA9IGlwLT5pX2lubzsKLQkJX19lbnRyeS0+c2l6ZSA9IGlwLT5pX2QuZGlfc2l6ZTsKLQkJX19lbnRyeS0+bmV3X3NpemUgPSBuZXdfc2l6ZTsKLQkJX19lbnRyeS0+dG9zc19zdGFydCA9IHRvc3Nfc3RhcnQ7Ci0JCV9fZW50cnktPnRvc3NfZmluaXNoID0gdG9zc19maW5pc2g7Ci0JCV9fZW50cnktPmZsYWcgPSBmbGFnOwotCSksCi0JVFBfcHJpbnRrKCJkZXYgJWQ6JWQgaW5vIDB4JWxseCAlcyBzaXplIDB4JWxseCBuZXdfc2l6ZSAweCVsbHggIgotCQkgICJ0b3NzIHN0YXJ0IDB4JWxseCB0b3NzIGZpbmlzaCAweCVsbHgiLAotCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCi0JCSAgX19lbnRyeS0+aW5vLAotCQkgIF9fcHJpbnRfZmxhZ3MoX19lbnRyeS0+ZmxhZywgInwiLCBYRlNfSVRSVU5DX0ZMQUdTKSwKLQkJICBfX2VudHJ5LT5zaXplLAotCQkgIF9fZW50cnktPm5ld19zaXplLAotCQkgIF9fZW50cnktPnRvc3Nfc3RhcnQsCi0JCSAgX19lbnRyeS0+dG9zc19maW5pc2gpCi0pOworREVGSU5FX1NJTVBMRV9JT19FVkVOVCh4ZnNfc2V0ZmlsZXNpemUpOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19pdHJ1bmNfY2xhc3MsCiAJVFBfUFJPVE8oc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19mc2l6ZV90IG5ld19zaXplKSwKQEAgLTEwODksOCArMTA1OSw4IEBACiBERUZJTkVfRVZFTlQoeGZzX2l0cnVuY19jbGFzcywgbmFtZSwgXAogCVRQX1BST1RPKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfZnNpemVfdCBuZXdfc2l6ZSksIFwKIAlUUF9BUkdTKGlwLCBuZXdfc2l6ZSkpCi1ERUZJTkVfSVRSVU5DX0VWRU5UKHhmc19pdHJ1bmNhdGVfZmluaXNoX3N0YXJ0KTsKLURFRklORV9JVFJVTkNfRVZFTlQoeGZzX2l0cnVuY2F0ZV9maW5pc2hfZW5kKTsKK0RFRklORV9JVFJVTkNfRVZFTlQoeGZzX2l0cnVuY2F0ZV9kYXRhX3N0YXJ0KTsKK0RFRklORV9JVFJVTkNfRVZFTlQoeGZzX2l0cnVuY2F0ZV9kYXRhX2VuZCk7CiAKIFRSQUNFX0VWRU5UKHhmc19wYWdlY2FjaGVfaW52YWwsCiAJVFBfUFJPVE8oc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19vZmZfdCBzdGFydCwgeGZzX29mZl90IGZpbmlzaCksCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKaW5kZXggNmZhMjE0Ni4uODM3ZjMxMSAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYwpAQCAtMjIwLDcgKzIyMCw3IEBACiB7CiAJQVNTRVJUKGQtPmRfaWQpOwogCi0jaWZkZWYgUVVPVEFERUJVRworI2lmZGVmIERFQlVHCiAJaWYgKGQtPmRfYmxrX2hhcmRsaW1pdCkKIAkJQVNTRVJUKGJlNjRfdG9fY3B1KGQtPmRfYmxrX3NvZnRsaW1pdCkgPD0KIAkJICAgICAgIGJlNjRfdG9fY3B1KGQtPmRfYmxrX2hhcmRsaW1pdCkpOwpAQCAtMjMxLDYgKzIzMSw3IEBACiAJCUFTU0VSVChiZTY0X3RvX2NwdShkLT5kX3J0Yl9zb2Z0bGltaXQpIDw9CiAJCSAgICAgICBiZTY0X3RvX2NwdShkLT5kX3J0Yl9oYXJkbGltaXQpKTsKICNlbmRpZgorCiAJaWYgKCFkLT5kX2J0aW1lcikgewogCQlpZiAoKGQtPmRfYmxrX3NvZnRsaW1pdCAmJgogCQkgICAgIChiZTY0X3RvX2NwdShkLT5kX2Jjb3VudCkgPj0KQEAgLTMxOCw3ICszMTksNyBAQAogCiAJQVNTRVJUKHRwKTsKIAlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKLQlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisJQVNTRVJUKHhmc19idWZfaXNsb2NrZWQoYnApKTsKIAogCWQgPSAoeGZzX2RxYmxrX3QgKilYRlNfQlVGX1BUUihicCk7CiAKQEAgLTUzNCw3ICs1MzUsNyBAQAogCX0KIAogCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOwotCUFTU0VSVChYRlNfQlVGX1ZBTFVTRU1BKGJwKSA8PSAwKTsKKwlBU1NFUlQoeGZzX2J1Zl9pc2xvY2tlZChicCkpOwogCiAJLyoKIAkgKiBjYWxjdWxhdGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBkcXVvdCBpbnNpZGUgdGhlIGJ1ZmZlci4KQEAgLTYyMiw3ICs2MjMsNyBAQAogCSAqIGJyZWxzZSBpdCBiZWNhdXNlIHdlIGhhdmUgdGhlIGNoYW5nZXMgaW5jb3JlLgogCSAqLwogCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOwotCUFTU0VSVChYRlNfQlVGX1ZBTFVTRU1BKGJwKSA8PSAwKTsKKwlBU1NFUlQoeGZzX2J1Zl9pc2xvY2tlZChicCkpOwogCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKIAogCXJldHVybiAoZXJyb3IpOwpAQCAtMTQyMyw0NSArMTQyNCw2IEBACiB9CiAKIAotI2lmZGVmIFFVT1RBREVCVUcKLXZvaWQKLXhmc19xbV9kcXByaW50KHhmc19kcXVvdF90ICpkcXApCi17Ci0Jc3RydWN0IHhmc19tb3VudAkqbXAgPSBkcXAtPnFfbW91bnQ7Ci0KLQl4ZnNfZGVidWcobXAsICItLS0tLS0tLS0tLUtFUk5FTCBEUVVPVC0tLS0tLS0tLS0tLS0tLS0iKTsKLQl4ZnNfZGVidWcobXAsICItLS0tIGRxdW90SUQgPSAgJWQiLAotCQkoaW50KWJlMzJfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaWQpKTsKLQl4ZnNfZGVidWcobXAsICItLS0tIHR5cGUgICAgPSAgJXMiLCBEUUZMQUdUT19UWVBFU1RSKGRxcCkpOwotCXhmc19kZWJ1ZyhtcCwgIi0tLS0gZnMgICAgICA9ICAweCVwIiwgZHFwLT5xX21vdW50KTsKLQl4ZnNfZGVidWcobXAsICItLS0tIGJsa25vICAgPSAgMHgleCIsIChpbnQpIGRxcC0+cV9ibGtubyk7Ci0JeGZzX2RlYnVnKG1wLCAiLS0tLSBib2Zmc2V0ID0gIDB4JXgiLCAoaW50KSBkcXAtPnFfYnVmb2Zmc2V0KTsKLQl4ZnNfZGVidWcobXAsICItLS0tIGJsa2hsaW1pdCA9ICAlTHUgKDB4JXgpIiwKLQkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9ibGtfaGFyZGxpbWl0KSwKLQkJKGludCliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jsa19oYXJkbGltaXQpKTsKLQl4ZnNfZGVidWcobXAsICItLS0tIGJsa3NsaW1pdCA9ICAlTHUgKDB4JXgpIiwKLQkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0KSwKLQkJKGludCliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jsa19zb2Z0bGltaXQpKTsKLQl4ZnNfZGVidWcobXAsICItLS0tIGlub2hsaW1pdCA9ICAlTHUgKDB4JXgpIiwKLQkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pbm9faGFyZGxpbWl0KSwKLQkJKGludCliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2lub19oYXJkbGltaXQpKTsKLQl4ZnNfZGVidWcobXAsICItLS0tIGlub3NsaW1pdCA9ICAlTHUgKDB4JXgpIiwKLQkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pbm9fc29mdGxpbWl0KSwKLQkJKGludCliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2lub19zb2Z0bGltaXQpKTsKLQl4ZnNfZGVidWcobXAsICItLS0tIGJjb3VudCAgPSAgJUx1ICgweCV4KSIsCi0JCWJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfYmNvdW50KSwKLQkJKGludCliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jjb3VudCkpOwotCXhmc19kZWJ1ZyhtcCwgIi0tLS0gaWNvdW50ICA9ICAlTHUgKDB4JXgpIiwKLQkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pY291bnQpLAotCQkoaW50KWJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaWNvdW50KSk7Ci0JeGZzX2RlYnVnKG1wLCAiLS0tLSBidGltZXIgID0gICVkIiwKLQkJKGludCliZTMyX3RvX2NwdShkcXAtPnFfY29yZS5kX2J0aW1lcikpOwotCXhmc19kZWJ1ZyhtcCwgIi0tLS0gaXRpbWVyICA9ICAlZCIsCi0JCShpbnQpYmUzMl90b19jcHUoZHFwLT5xX2NvcmUuZF9pdGltZXIpKTsKLQl4ZnNfZGVidWcobXAsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLX0KLSNlbmRpZgotCiAvKgogICogR2l2ZSB0aGUgYnVmZmVyIGEgbGl0dGxlIHB1c2ggaWYgaXQgaXMgaW5jb3JlIGFuZAogICogd2FpdCBvbiB0aGUgZmx1c2ggbG9jay4KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaCBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaAppbmRleCA1ZGEzYTIzLi4zNGI3ZTk0IDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmgKKysrIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5oCkBAIC0xMTYsMTIgKzExNiw2IEBACiAJCQkJICAgICAoWEZTX0lTX1VRVU9UQV9PTigoZCktPnFfbW91bnQpKSA6IFwKIAkJCQkgICAgIChYRlNfSVNfT1FVT1RBX09OKChkKS0+cV9tb3VudCkpKSkKIAotI2lmZGVmIFFVT1RBREVCVUcKLWV4dGVybiB2b2lkCQl4ZnNfcW1fZHFwcmludCh4ZnNfZHF1b3RfdCAqKTsKLSNlbHNlCi0jZGVmaW5lIHhmc19xbV9kcXByaW50KGEpCi0jZW5kaWYKLQogZXh0ZXJuIHZvaWQJCXhmc19xbV9kcWRlc3Ryb3koeGZzX2RxdW90X3QgKik7CiBleHRlcm4gaW50CQl4ZnNfcW1fZHFmbHVzaCh4ZnNfZHF1b3RfdCAqLCB1aW50KTsKIGV4dGVybiBpbnQJCXhmc19xbV9kcXB1cmdlKHhmc19kcXVvdF90ICopOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbS5jIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCmluZGV4IGI5NGRhY2UuLjQ2ZTU0YWQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtLmMKQEAgLTY3LDMyICs2Nyw2IEBACiAJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKIH07CiAKLSNpZmRlZiBERUJVRwotZXh0ZXJuIHN0cnVjdCBtdXRleAlxY2hlY2tfbG9jazsKLSNlbmRpZgotCi0jaWZkZWYgUVVPVEFERUJVRwotc3RhdGljIHZvaWQKLXhmc19xbV9kcXVvdF9saXN0X3ByaW50KAotCXN0cnVjdCB4ZnNfbW91bnQgKm1wKQotewotCXhmc19kcXVvdF90CSpkcXA7Ci0JaW50CQlpID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZHFwLCAmbXAtPm1fcXVvdGFpbmZvLT5xaV9kcWxpc3RfbG9jaywgcWlfbXBsaXN0KSB7Ci0JCXhmc19kZWJ1ZyhtcCwgIiAgICVkLiBcIiVkICglcylcIiAgICIKLQkJCQkgICJiY250ID0gJWxsZCwgaWNudCA9ICVsbGQsIHJlZnMgPSAlZCIsCi0JCQlpKyssIGJlMzJfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaWQpLAotCQkJRFFGTEFHVE9fVFlQRVNUUihkcXApLAotCQkJKGxvbmcgbG9uZyliZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jjb3VudCksCi0JCQkobG9uZyBsb25nKWJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaWNvdW50KSwKLQkJCWRxcC0+cV9ucmVmcyk7Ci0JfQotfQotI2Vsc2UKLXN0YXRpYyB2b2lkIHhmc19xbV9kcXVvdF9saXN0X3ByaW50KHN0cnVjdCB4ZnNfbW91bnQgKm1wKSB7IH0KLSNlbmRpZgotCiAvKgogICogSW5pdGlhbGl6ZSB0aGUgWFFNIHN0cnVjdHVyZS4KICAqIE5vdGUgdGhhdCB0aGVyZSBpcyBub3Qgb25lIHF1b3RhIG1hbmFnZXIgcGVyIGZpbGUgc3lzdGVtLgpAQCAtMTY1LDkgKzEzOSw2IEBACiAJYXRvbWljX3NldCgmeHFtLT5xbV90b3RhbGRxdW90cywgMCk7CiAJeHFtLT5xbV9kcWZyZWVfcmF0aW8gPSBYRlNfUU1fRFFGUkVFX1JBVElPOwogCXhxbS0+cW1fbnJlZnMgPSAwOwotI2lmZGVmIERFQlVHCi0JbXV0ZXhfaW5pdCgmcWNoZWNrX2xvY2spOwotI2VuZGlmCiAJcmV0dXJuIHhxbTsKIAogIG91dF9mcmVlX3VkcWhhc2g6CkBAIC0yMDQsOSArMTc1LDYgQEAKIAltdXRleF9sb2NrKCZ4cW0tPnFtX2RxZnJsaXN0X2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkcXAsIG4sICZ4cW0tPnFtX2RxZnJsaXN0LCBxX2ZyZWVsaXN0KSB7CiAJCXhmc19kcWxvY2soZHFwKTsKLSNpZmRlZiBRVU9UQURFQlVHCi0JCXhmc19kZWJ1ZyhkcXAtPnFfbW91bnQsICJGUkVFTElTVCBkZXN0cm95IDB4JXAiLCBkcXApOwotI2VuZGlmCiAJCWxpc3RfZGVsX2luaXQoJmRxcC0+cV9mcmVlbGlzdCk7CiAJCXhmc19HcW0tPnFtX2RxZnJsaXN0X2NudC0tOwogCQl4ZnNfZHF1bmxvY2soZHFwKTsKQEAgLTIxNCw5ICsxODIsNiBAQAogCX0KIAltdXRleF91bmxvY2soJnhxbS0+cW1fZHFmcmxpc3RfbG9jayk7CiAJbXV0ZXhfZGVzdHJveSgmeHFtLT5xbV9kcWZybGlzdF9sb2NrKTsKLSNpZmRlZiBERUJVRwotCW11dGV4X2Rlc3Ryb3koJnFjaGVja19sb2NrKTsKLSNlbmRpZgogCWttZW1fZnJlZSh4cW0pOwogfQogCkBAIC00MDksMTEgKzM3NCw2IEBACiAJCXhmc193YXJuKG1wLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZGlzayBxdW90YXMuIik7CiAJCXJldHVybjsKIAl9Ci0KLSNpZmRlZiBRVU9UQURFQlVHCi0JaWYgKFhGU19JU19RVU9UQV9PTihtcCkpCi0JCXhmc19xbV9pbnRlcm5hbHFjaGVjayhtcCk7Ci0jZW5kaWYKIH0KIAogLyoKQEAgLTg2Niw4ICs4MjYsOCBAQAogCX0KIAogIGRvbmU6Ci0jaWZkZWYgUVVPVEFERUJVRwotCWlmICghIGVycm9yKSB7CisjaWZkZWYgREVCVUcKKwlpZiAoIWVycm9yKSB7CiAJCWlmIChYRlNfSVNfVVFVT1RBX09OKG1wKSkKIAkJCUFTU0VSVChpcC0+aV91ZHF1b3QpOwogCQlpZiAoWEZTX0lTX09RVU9UQV9PTihtcCkpCkBAIC0xNzMzLDggKzE2OTMsNiBAQAogCW1wLT5tX3FmbGFncyAmPSB+KFhGU19PUVVPVEFfQ0hLRCB8IFhGU19VUVVPVEFfQ0hLRCk7CiAJbXAtPm1fcWZsYWdzIHw9IGZsYWdzOwogCi0JeGZzX3FtX2RxdW90X2xpc3RfcHJpbnQobXApOwotCiAgZXJyb3JfcmV0dXJuOgogCWlmIChlcnJvcikgewogCQl4ZnNfd2FybihtcCwKQEAgLTIwOTYsOSArMjA1NCw2IEBACiAJeGZzX3RyYW5zX3QJKnRwOwogCWludAkJZXJyb3I7CiAKLSNpZmRlZiBRVU9UQURFQlVHCi0JeGZzX25vdGljZShtcCwgIldyaXRpbmcgc3VwZXJibG9jayBxdW90YSBjaGFuZ2VzIik7Ci0jZW5kaWYKIAl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1FNX1NCQ0hBTkdFKTsKIAlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCiAJCQkJICAgICAgbXAtPm1fc2Iuc2Jfc2VjdHNpemUgKyAxMjgsIDAsCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtLmggYi9mcy94ZnMvcXVvdGEveGZzX3FtLmgKaW5kZXggNTY3YjI5Yi4uNDNiOWFiZSAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbS5oCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uaApAQCAtMTYzLDEwICsxNjMsNCBAQAogZXh0ZXJuIGludAkJeGZzX3FtX3NjYWxsX3F1b3Rhb24oeGZzX21vdW50X3QgKiwgdWludCk7CiBleHRlcm4gaW50CQl4ZnNfcW1fc2NhbGxfcXVvdGFvZmYoeGZzX21vdW50X3QgKiwgdWludCk7CiAKLSNpZmRlZiBERUJVRwotZXh0ZXJuIGludAkJeGZzX3FtX2ludGVybmFscWNoZWNrKHhmc19tb3VudF90ICopOwotI2Vsc2UKLSNkZWZpbmUgeGZzX3FtX2ludGVybmFscWNoZWNrKG1wKQkoMCkKLSNlbmRpZgotCiAjZW5kaWYgLyogX19YRlNfUU1fSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMKaW5kZXggMmRhZGIxNS4uNjA5MjQ2ZiAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CiAKLQllcnJvciA9IHhmc19pdHJ1bmNhdGVfZmluaXNoKCZ0cCwgaXAsIDAsIFhGU19EQVRBX0ZPUkssIDEpOworCWVycm9yID0geGZzX2l0cnVuY2F0ZV9kYXRhKCZ0cCwgaXAsIDApOwogCWlmIChlcnJvcikgewogCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwKIAkJCQkgICAgIFhGU19UUkFOU19BQk9SVCk7CkBAIC02MjIsNyArNjIyLDYgQEAKIAl4ZnNfdHJhbnNfbG9nX2RxdW90KHRwLCBkcXApOwogCiAJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKLQl4ZnNfcW1fZHFwcmludChkcXApOwogCXhmc19xbV9kcXJlbGUoZHFwKTsKIAogIG91dF91bmxvY2s6CkBAIC02NTcsNyArNjU2LDYgQEAKIAkJeGZzX3FtX2RxcHV0KGRxcCk7CiAJCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKIAl9Ci0JLyogeGZzX3FtX2RxcHJpbnQoZHFwKTsgKi8KIAkvKgogCSAqIENvbnZlcnQgdGhlIGRpc2sgZHF1b3QgdG8gdGhlIGV4cG9ydGFibGUgZm9ybWF0CiAJICovCkBAIC05MDYsMzU0ICs5MDQsMyBAQAogCUFTU0VSVChtcC0+bV9xdW90YWluZm8pOwogCXhmc19pbm9kZV9hZ19pdGVyYXRvcihtcCwgeGZzX2RxcmVsZV9pbm9kZSwgZmxhZ3MpOwogfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgREVCVUcKLS8qCi0gKiBUaGlzIGNvbnRhaW5zIGFsbCB0aGUgdGVzdCBmdW5jdGlvbnMgZm9yIFhGUyBkaXNrIHF1b3Rhcy4KLSAqIEN1cnJlbnRseSBpdCBkb2VzIGEgcXVvdGEgYWNjb3VudGluZyBjaGVjay4gaWUuIGl0IHdhbGtzIHRocm91Z2gKLSAqIGFsbCBpbm9kZXMgaW4gdGhlIGZpbGUgc3lzdGVtLCBjYWxjdWxhdGluZyB0aGUgZHF1b3QgYWNjb3VudGluZyBmaWVsZHMsCi0gKiBhbmQgcHJpbnRzIG91dCBhbnkgaW5jb25zaXN0ZW5jaWVzLgotICovCi14ZnNfZHFoYXNoX3QgKnFtdGVzdF91ZHF0YWI7Ci14ZnNfZHFoYXNoX3QgKnFtdGVzdF9nZHF0YWI7Ci1pbnQJICAgICAgcW10ZXN0X2hhc2htYXNrOwotaW50CSAgICAgIHFtdGVzdF9uZmFpbHM7Ci1zdHJ1Y3QgbXV0ZXggIHFjaGVja19sb2NrOwotCi0jZGVmaW5lIERRVEVTVF9IQVNIVkFMKG1wLCBpZCkgKCgoX19wc3Vuc2lnbmVkX3QpKG1wKSArIFwKLQkJCQkgKF9fcHN1bnNpZ25lZF90KShpZCkpICYgXAotCQkJCShxbXRlc3RfaGFzaG1hc2sgLSAxKSkKLQotI2RlZmluZSBEUVRFU1RfSEFTSChtcCwgaWQsIHR5cGUpICAgKCh0eXBlICYgWEZTX0RRX1VTRVIpID8gXAotCQkJCSAgICAgKHFtdGVzdF91ZHF0YWIgKyBcCi0JCQkJICAgICAgRFFURVNUX0hBU0hWQUwobXAsIGlkKSkgOiBcCi0JCQkJICAgICAocW10ZXN0X2dkcXRhYiArIFwKLQkJCQkgICAgICBEUVRFU1RfSEFTSFZBTChtcCwgaWQpKSkKLQotI2RlZmluZSBEUVRFU1RfTElTVF9QUklOVChsLCBOWFQsIHRpdGxlKSBcCi17IFwKLQkgIHhmc19kcXRlc3RfdAkqZHFwOyBpbnQgaSA9IDA7XAotCSAgeGZzX2RlYnVnKE5VTEwsICIlcyAoIyVkKSIsIHRpdGxlLCAoaW50KSAobCktPnFoX25lbGVtcyk7IFwKLQkgIGZvciAoZHFwID0gKHhmc19kcXRlc3RfdCAqKShsKS0+cWhfbmV4dDsgZHFwICE9IE5VTEw7IFwKLQkgICAgICAgZHFwID0gKHhmc19kcXRlc3RfdCAqKWRxcC0+TlhUKSB7IFwKLQkJeGZzX2RlYnVnKGRxcC0+cV9tb3VudCwJCVwKLQkJCSIgICVkLiBcIiVkICglcylcIiAgYmNudCA9ICVkLCBpY250ID0gJWQiLCBcCi0JCQkgKytpLCBkcXAtPmRfaWQsIERRRkxBR1RPX1RZUEVTVFIoZHFwKSwJICAgICBcCi0JCQkgZHFwLT5kX2Jjb3VudCwgZHFwLT5kX2ljb3VudCk7IH0gXAotfQotCi10eXBlZGVmIHN0cnVjdCBkcXRlc3QgewotCXVpbnQJCSBkcV9mbGFnczsJLyogdmFyaW91cyBmbGFncyAoWEZTX0RRXyopICovCi0Jc3RydWN0IGxpc3RfaGVhZCBxX2hhc2hsaXN0OwotCXhmc19kcWhhc2hfdAkqcV9oYXNoOwkvKiB0aGUgaGFzaGNoYWluIGhlYWRlciAqLwotCXhmc19tb3VudF90CSpxX21vdW50OwkvKiBmaWxlc3lzdGVtIHRoaXMgcmVsYXRlcyB0byAqLwotCXhmc19kcWlkX3QJZF9pZDsJCS8qIHVzZXIgaWQgb3IgZ3JvdXAgaWQgKi8KLQl4ZnNfcWNudF90CWRfYmNvdW50OwkvKiAjIGRpc2sgYmxvY2tzIG93bmVkIGJ5IHRoZSB1c2VyICovCi0JeGZzX3FjbnRfdAlkX2ljb3VudDsJLyogIyBpbm9kZXMgb3duZWQgYnkgdGhlIHVzZXIgKi8KLX0geGZzX2RxdGVzdF90OwotCi1TVEFUSUMgdm9pZAoteGZzX3FtX2hhc2hpbnNlcnQoeGZzX2RxaGFzaF90ICpoLCB4ZnNfZHF0ZXN0X3QgKmRxcCkKLXsKLQlsaXN0X2FkZCgmZHFwLT5xX2hhc2hsaXN0LCAmaC0+cWhfbGlzdCk7Ci0JaC0+cWhfdmVyc2lvbisrOwotCWgtPnFoX25lbGVtcysrOwotfQotU1RBVElDIHZvaWQKLXhmc19xbV9kcXRlc3RfcHJpbnQoCi0Jc3RydWN0IHhmc19tb3VudAkqbXAsCi0Jc3RydWN0IGRxdGVzdAkJKmQpCi17Ci0JeGZzX2RlYnVnKG1wLCAiLS0tLS0tLS0tLS1EUVRFU1QgRFFVT1QtLS0tLS0tLS0tLS0tLS0tIik7Ci0JeGZzX2RlYnVnKG1wLCAiLS0tLSBkcXVvdCBJRCA9ICVkIiwgZC0+ZF9pZCk7Ci0JeGZzX2RlYnVnKG1wLCAiLS0tLSBmcyAgICAgICA9IDB4JXAiLCBkLT5xX21vdW50KTsKLQl4ZnNfZGVidWcobXAsICItLS0tIGJjb3VudCAgID0gJUx1ICgweCV4KSIsCi0JCWQtPmRfYmNvdW50LCAoaW50KWQtPmRfYmNvdW50KTsKLQl4ZnNfZGVidWcobXAsICItLS0tIGljb3VudCAgID0gJUx1ICgweCV4KSIsCi0JCWQtPmRfaWNvdW50LCAoaW50KWQtPmRfaWNvdW50KTsKLQl4ZnNfZGVidWcobXAsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLX0KLQotU1RBVElDIHZvaWQKLXhmc19xbV9kcXRlc3RfZmFpbGVkKAotCXhmc19kcXRlc3RfdAkqZCwKLQl4ZnNfZHF1b3RfdAkqZHFwLAotCWNoYXIJCSpyZWFzb24sCi0JeGZzX3FjbnRfdAlhLAotCXhmc19xY250X3QJYiwKLQlpbnQJCWVycm9yKQotewotCXFtdGVzdF9uZmFpbHMrKzsKLQlpZiAoZXJyb3IpCi0JCXhmc19kZWJ1ZyhkcXAtPnFfbW91bnQsCi0JCQkicXVvdGFjaGVjayBmYWlsZWQgaWQ9JWQsIGVycj0lZFxucmVhc29uOiAlcyIsCi0JCQlkLT5kX2lkLCBlcnJvciwgcmVhc29uKTsKLQllbHNlCi0JCXhmc19kZWJ1ZyhkcXAtPnFfbW91bnQsCi0JCQkicXVvdGFjaGVjayBmYWlsZWQgaWQ9JWQgKCVzKSBbJWQgIT0gJWRdIiwKLQkJCWQtPmRfaWQsIHJlYXNvbiwgKGludClhLCAoaW50KWIpOwotCXhmc19xbV9kcXRlc3RfcHJpbnQoZHFwLT5xX21vdW50LCBkKTsKLQlpZiAoZHFwKQotCQl4ZnNfcW1fZHFwcmludChkcXApOwotfQotCi1TVEFUSUMgaW50Ci14ZnNfZHF0ZXN0X2NtcDIoCi0JeGZzX2RxdGVzdF90CSpkLAotCXhmc19kcXVvdF90CSpkcXApCi17Ci0JaW50IGVyciA9IDA7Ci0JaWYgKGJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaWNvdW50KSAhPSBkLT5kX2ljb3VudCkgewotCQl4ZnNfcW1fZHF0ZXN0X2ZhaWxlZChkLCBkcXAsICJpY291bnQgbWlzbWF0Y2giLAotCQkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pY291bnQpLAotCQkJZC0+ZF9pY291bnQsIDApOwotCQllcnIrKzsKLQl9Ci0JaWYgKGJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfYmNvdW50KSAhPSBkLT5kX2Jjb3VudCkgewotCQl4ZnNfcW1fZHF0ZXN0X2ZhaWxlZChkLCBkcXAsICJiY291bnQgbWlzbWF0Y2giLAotCQkJYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9iY291bnQpLAotCQkJZC0+ZF9iY291bnQsIDApOwotCQllcnIrKzsKLQl9Ci0JaWYgKGRxcC0+cV9jb3JlLmRfYmxrX3NvZnRsaW1pdCAmJgotCSAgICBiZTY0X3RvX2NwdShkcXAtPnFfY29yZS5kX2Jjb3VudCkgPj0KLQkgICAgYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0KSkgewotCQlpZiAoIWRxcC0+cV9jb3JlLmRfYnRpbWVyICYmIGRxcC0+cV9jb3JlLmRfaWQpIHsKLQkJCXhmc19kZWJ1ZyhkcXAtPnFfbW91bnQsCi0JCQkJIiVkIFslc10gQkxLIFRJTUVSIE5PVCBTVEFSVEVEIiwKLQkJCQlkLT5kX2lkLCBEUUZMQUdUT19UWVBFU1RSKGQpKTsKLQkJCWVycisrOwotCQl9Ci0JfQotCWlmIChkcXAtPnFfY29yZS5kX2lub19zb2Z0bGltaXQgJiYKLQkgICAgYmU2NF90b19jcHUoZHFwLT5xX2NvcmUuZF9pY291bnQpID49Ci0JICAgIGJlNjRfdG9fY3B1KGRxcC0+cV9jb3JlLmRfaW5vX3NvZnRsaW1pdCkpIHsKLQkJaWYgKCFkcXAtPnFfY29yZS5kX2l0aW1lciAmJiBkcXAtPnFfY29yZS5kX2lkKSB7Ci0JCQl4ZnNfZGVidWcoZHFwLT5xX21vdW50LAotCQkJCSIlZCBbJXNdIElOTyBUSU1FUiBOT1QgU1RBUlRFRCIsCi0JCQkJZC0+ZF9pZCwgRFFGTEFHVE9fVFlQRVNUUihkKSk7Ci0JCQllcnIrKzsKLQkJfQotCX0KLSNpZmRlZiBRVU9UQURFQlVHCi0JaWYgKCFlcnIpIHsKLQkJeGZzX2RlYnVnKGRxcC0+cV9tb3VudCwgIiVkIFslc10gcWNoZWNrZWQiLAotCQkJZC0+ZF9pZCwgRFFGTEFHVE9fVFlQRVNUUihkKSk7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIChlcnIpOwotfQotCi1TVEFUSUMgdm9pZAoteGZzX2RxdGVzdF9jbXAoCi0JeGZzX2RxdGVzdF90CSpkKQotewotCXhmc19kcXVvdF90CSpkcXA7Ci0JaW50CQllcnJvcjsKLQotCS8qIHhmc19xbV9kcXRlc3RfcHJpbnQoZCk7ICovCi0JaWYgKChlcnJvciA9IHhmc19xbV9kcWdldChkLT5xX21vdW50LCBOVUxMLCBkLT5kX2lkLCBkLT5kcV9mbGFncywgMCwKLQkJCQkgJmRxcCkpKSB7Ci0JCXhmc19xbV9kcXRlc3RfZmFpbGVkKGQsIE5VTEwsICJkcWdldCBmYWlsZWQiLCAwLCAwLCBlcnJvcik7Ci0JCXJldHVybjsKLQl9Ci0JeGZzX2RxdGVzdF9jbXAyKGQsIGRxcCk7Ci0JeGZzX3FtX2RxcHV0KGRxcCk7Ci19Ci0KLVNUQVRJQyBpbnQKLXhmc19xbV9pbnRlcm5hbHFjaGVja19kcWdldCgKLQl4ZnNfbW91bnRfdAkqbXAsCi0JeGZzX2RxaWRfdAlpZCwKLQl1aW50CQl0eXBlLAotCXhmc19kcXRlc3RfdAkqKk9fZHEpCi17Ci0JeGZzX2RxdGVzdF90CSpkOwotCXhmc19kcWhhc2hfdAkqaDsKLQotCWggPSBEUVRFU1RfSEFTSChtcCwgaWQsIHR5cGUpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmgtPnFoX2xpc3QsIHFfaGFzaGxpc3QpIHsKLQkJaWYgKGQtPmRfaWQgPT0gaWQgJiYgbXAgPT0gZC0+cV9tb3VudCkgewotCQkJKk9fZHEgPSBkOwotCQkJcmV0dXJuICgwKTsKLQkJfQotCX0KLQlkID0ga21lbV96YWxsb2Moc2l6ZW9mKHhmc19kcXRlc3RfdCksIEtNX1NMRUVQKTsKLQlkLT5kcV9mbGFncyA9IHR5cGU7Ci0JZC0+ZF9pZCA9IGlkOwotCWQtPnFfbW91bnQgPSBtcDsKLQlkLT5xX2hhc2ggPSBoOwotCUlOSVRfTElTVF9IRUFEKCZkLT5xX2hhc2hsaXN0KTsKLQl4ZnNfcW1faGFzaGluc2VydChoLCBkKTsKLQkqT19kcSA9IGQ7Ci0JcmV0dXJuICgwKTsKLX0KLQotU1RBVElDIHZvaWQKLXhmc19xbV9pbnRlcm5hbHFjaGVja19nZXRfZHF1b3RzKAotCXhmc19tb3VudF90CSptcCwKLQl4ZnNfZHFpZF90CXVpZCwKLQl4ZnNfZHFpZF90CXByb2ppZCwKLQl4ZnNfZHFpZF90CWdpZCwKLQl4ZnNfZHF0ZXN0X3QJKip1ZCwKLQl4ZnNfZHF0ZXN0X3QJKipnZCkKLXsKLQlpZiAoWEZTX0lTX1VRVU9UQV9PTihtcCkpCi0JCXhmc19xbV9pbnRlcm5hbHFjaGVja19kcWdldChtcCwgdWlkLCBYRlNfRFFfVVNFUiwgdWQpOwotCWlmIChYRlNfSVNfR1FVT1RBX09OKG1wKSkKLQkJeGZzX3FtX2ludGVybmFscWNoZWNrX2RxZ2V0KG1wLCBnaWQsIFhGU19EUV9HUk9VUCwgZ2QpOwotCWVsc2UgaWYgKFhGU19JU19QUVVPVEFfT04obXApKQotCQl4ZnNfcW1faW50ZXJuYWxxY2hlY2tfZHFnZXQobXAsIHByb2ppZCwgWEZTX0RRX1BST0osIGdkKTsKLX0KLQotCi1TVEFUSUMgdm9pZAoteGZzX3FtX2ludGVybmFscWNoZWNrX2RxYWRqdXN0KAotCXhmc19pbm9kZV90CQkqaXAsCi0JeGZzX2RxdGVzdF90CQkqZCkKLXsKLQlkLT5kX2ljb3VudCsrOwotCWQtPmRfYmNvdW50ICs9ICh4ZnNfcWNudF90KWlwLT5pX2QuZGlfbmJsb2NrczsKLX0KLQotU1RBVElDIGludAoteGZzX3FtX2ludGVybmFscWNoZWNrX2FkanVzdCgKLQl4ZnNfbW91bnRfdAkqbXAsCQkvKiBtb3VudCBwb2ludCBmb3IgZmlsZXN5c3RlbSAqLwotCXhmc19pbm9fdAlpbm8sCQkvKiBpbm9kZSBudW1iZXIgdG8gZ2V0IGRhdGEgZm9yICovCi0Jdm9pZAkJX191c2VyICpidWZmZXIsCS8qIG5vdCB1c2VkICovCi0JaW50CQl1YnNpemUsCQkvKiBub3QgdXNlZCAqLwotCWludAkJKnVidXNlZCwJLyogbm90IHVzZWQgKi8KLQlpbnQJCSpyZXMpCQkvKiBidWxrc3RhdCByZXN1bHQgY29kZSAqLwotewotCXhmc19pbm9kZV90CQkqaXA7Ci0JeGZzX2RxdGVzdF90CQkqdWQsICpnZDsKLQl1aW50CQkJbG9ja19mbGFnczsKLQlib29sZWFuX3QJCWlwcmVsZWFzZWQ7Ci0JaW50CQkJZXJyb3I7Ci0KLQlBU1NFUlQoWEZTX0lTX1FVT1RBX1JVTk5JTkcobXApKTsKLQotCWlmIChpbm8gPT0gbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gfHwgaW5vID09IG1wLT5tX3NiLnNiX2dxdW90aW5vKSB7Ci0JCSpyZXMgPSBCVUxLU1RBVF9SVl9OT1RISU5HOwotCQl4ZnNfZGVidWcobXAsICIlczogaW5vPSVsbHUsIHVxaW5vPSVsbHUsIGdxaW5vPSVsbHVcbiIsCi0JCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcgbG9uZykgaW5vLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbXAtPm1fc2Iuc2JfdXF1b3Rpbm8sCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKSBtcC0+bV9zYi5zYl9ncXVvdGlubyk7Ci0JCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKLQl9Ci0JaXByZWxlYXNlZCA9IEJfRkFMU0U7Ci0gYWdhaW46Ci0JbG9ja19mbGFncyA9IFhGU19JTE9DS19TSEFSRUQ7Ci0JaWYgKChlcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBpbm8sIDAsIGxvY2tfZmxhZ3MsICZpcCkpKSB7Ci0JCSpyZXMgPSBCVUxLU1RBVF9SVl9OT1RISU5HOwotCQlyZXR1cm4gKGVycm9yKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgaW5vZGUgY2FuIGhhdmUgYmxvY2tzIGFmdGVyIGVvZiB3aGljaCBjYW4gZ2V0IHJlbGVhc2VkCi0JICogd2hlbiB3ZSBzZW5kIGl0IHRvIGluYWN0aXZlLiBTaW5jZSB3ZSBkb24ndCBjaGVjayB0aGUgZHF1b3QKLQkgKiB1bnRpbCB0aGUgYWZ0ZXIgYWxsIG91ciBjYWxjdWxhdGlvbnMgYXJlIGRvbmUsIHdlIG11c3QgZ2V0IHJpZAotCSAqIG9mIHRob3NlIG5vdy4KLQkgKi8KLQlpZiAoISBpcHJlbGVhc2VkKSB7Ci0JCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKLQkJSVJFTEUoaXApOwotCQlpcHJlbGVhc2VkID0gQl9UUlVFOwotCQlnb3RvIGFnYWluOwotCX0KLQl4ZnNfcW1faW50ZXJuYWxxY2hlY2tfZ2V0X2RxdW90cyhtcCwKLQkJCQkJKHhmc19kcWlkX3QpIGlwLT5pX2QuZGlfdWlkLAotCQkJCQkoeGZzX2RxaWRfdCkgeGZzX2dldF9wcm9qaWQoaXApLAotCQkJCQkoeGZzX2RxaWRfdCkgaXAtPmlfZC5kaV9naWQsCi0JCQkJCSZ1ZCwgJmdkKTsKLQlpZiAoWEZTX0lTX1VRVU9UQV9PTihtcCkpIHsKLQkJQVNTRVJUKHVkKTsKLQkJeGZzX3FtX2ludGVybmFscWNoZWNrX2RxYWRqdXN0KGlwLCB1ZCk7Ci0JfQotCWlmIChYRlNfSVNfT1FVT1RBX09OKG1wKSkgewotCQlBU1NFUlQoZ2QpOwotCQl4ZnNfcW1faW50ZXJuYWxxY2hlY2tfZHFhZGp1c3QoaXAsIGdkKTsKLQl9Ci0JeGZzX2l1bmxvY2soaXAsIGxvY2tfZmxhZ3MpOwotCUlSRUxFKGlwKTsKLQkqcmVzID0gQlVMS1NUQVRfUlZfRElET05FOwotCXJldHVybiAoMCk7Ci19Ci0KLQotLyogUFJJVkFURSwgZGVidWdnaW5nICovCi1pbnQKLXhmc19xbV9pbnRlcm5hbHFjaGVjaygKLQl4ZnNfbW91bnRfdAkqbXApCi17Ci0JeGZzX2lub190CWxhc3Rpbm87Ci0JaW50CQlkb25lLCBjb3VudDsKLQlpbnQJCWk7Ci0JaW50CQllcnJvcjsKLQotCWxhc3Rpbm8gPSAwOwotCXFtdGVzdF9oYXNobWFzayA9IDMyOwotCWNvdW50ID0gNTsKLQlkb25lID0gMDsKLQlxbXRlc3RfbmZhaWxzID0gMDsKLQotCWlmICghIFhGU19JU19RVU9UQV9PTihtcCkpCi0JCXJldHVybiBYRlNfRVJST1IoRVNSQ0gpOwotCi0JeGZzX2xvZ19mb3JjZShtcCwgWEZTX0xPR19TWU5DKTsKLQlYRlNfYmZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOwotCXhmc19sb2dfZm9yY2UobXAsIFhGU19MT0dfU1lOQyk7Ci0JWEZTX2JmbHVzaChtcC0+bV9kZGV2X3RhcmdwKTsKLQotCW11dGV4X2xvY2soJnFjaGVja19sb2NrKTsKLQkvKiBUaGVyZSBzaG91bGQgYmUgYWJzb2x1dGVseSBubyBxdW90YSBhY3Rpdml0eSB3aGlsZSB0aGlzCi0JICAgaXMgZ29pbmcgb24uICovCi0JcW10ZXN0X3VkcXRhYiA9IGttZW1femFsbG9jKHFtdGVzdF9oYXNobWFzayAqCi0JCQkJICAgIHNpemVvZih4ZnNfZHFoYXNoX3QpLCBLTV9TTEVFUCk7Ci0JcW10ZXN0X2dkcXRhYiA9IGttZW1femFsbG9jKHFtdGVzdF9oYXNobWFzayAqCi0JCQkJICAgIHNpemVvZih4ZnNfZHFoYXNoX3QpLCBLTV9TTEVFUCk7Ci0JZG8gewotCQkvKgotCQkgKiBJdGVyYXRlIHRocnUgYWxsIHRoZSBpbm9kZXMgaW4gdGhlIGZpbGUgc3lzdGVtLAotCQkgKiBhZGp1c3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZHF1b3QgY291bnRlcnMKLQkJICovCi0JCWVycm9yID0geGZzX2J1bGtzdGF0KG1wLCAmbGFzdGlubywgJmNvdW50LAotCQkJCSB4ZnNfcW1faW50ZXJuYWxxY2hlY2tfYWRqdXN0LAotCQkJCSAwLCBOVUxMLCAmZG9uZSk7Ci0JCWlmIChlcnJvcikgewotCQkJeGZzX2RlYnVnKG1wLCAiQnVsa3N0YXQgcmV0dXJuZWQgZXJyb3IgMHgleCIsIGVycm9yKTsKLQkJCWJyZWFrOwotCQl9Ci0JfSB3aGlsZSAoIWRvbmUpOwotCi0JeGZzX2RlYnVnKG1wLCAiQ2hlY2tpbmcgcmVzdWx0cyBhZ2FpbnN0IHN5c3RlbSBkcXVvdHMiKTsKLQlmb3IgKGkgPSAwOyBpIDwgcW10ZXN0X2hhc2htYXNrOyBpKyspIHsKLQkJeGZzX2RxdGVzdF90CSpkLCAqbjsKLQkJeGZzX2RxaGFzaF90CSpoOwotCi0JCWggPSAmcW10ZXN0X3VkcXRhYltpXTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGQsIG4sICZoLT5xaF9saXN0LCBxX2hhc2hsaXN0KSB7Ci0JCQl4ZnNfZHF0ZXN0X2NtcChkKTsKLQkJCWttZW1fZnJlZShkKTsKLQkJfQotCQloID0gJnFtdGVzdF9nZHF0YWJbaV07Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkLCBuLCAmaC0+cWhfbGlzdCwgcV9oYXNobGlzdCkgewotCQkJeGZzX2RxdGVzdF9jbXAoZCk7Ci0JCQlrbWVtX2ZyZWUoZCk7Ci0JCX0KLQl9Ci0KLQlpZiAocW10ZXN0X25mYWlscykgewotCQl4ZnNfZGVidWcobXAsICIqKioqKioqKiBxdW90YWNoZWNrIGZhaWxlZCAgKioqKioqKioiKTsKLQkJeGZzX2RlYnVnKG1wLCAiZmFpbHVyZXMgPSAlZCIsIHFtdGVzdF9uZmFpbHMpOwotCX0gZWxzZSB7Ci0JCXhmc19kZWJ1ZyhtcCwgIioqKioqKioqIHF1b3RhY2hlY2sgc3VjY2Vzc2Z1bCEgKioqKioqKioiKTsKLQl9Ci0Ja21lbV9mcmVlKHFtdGVzdF91ZHF0YWIpOwotCWttZW1fZnJlZShxbXRlc3RfZ2RxdGFiKTsKLQltdXRleF91bmxvY2soJnFjaGVja19sb2NrKTsKLQlyZXR1cm4gKHFtdGVzdF9uZmFpbHMpOwotfQotCi0jZW5kaWYgLyogREVCVUcgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfdHJhbnNfZHF1b3QuYyBiL2ZzL3hmcy9xdW90YS94ZnNfdHJhbnNfZHF1b3QuYwppbmRleCAyYTM2NDg3Li40ZDAwZWU2IDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3RyYW5zX2RxdW90LmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc190cmFuc19kcXVvdC5jCkBAIC01OSw3ICs1OSw3IEBACiAJeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAmZHFwLT5xX2xvZ2l0ZW0ucWxpX2l0ZW0pOwogCiAJLyoKLQkgKiBJbml0aWFsaXplIGlfdHJhbnNwIHNvIHdlIGNhbiBsYXRlciBkZXRlcm1pbmUgaWYgdGhpcyBkcXVvdCBpcworCSAqIEluaXRpYWxpemUgZF90cmFuc3Agc28gd2UgY2FuIGxhdGVyIGRldGVybWluZSBpZiB0aGlzIGRxdW90IGlzCiAJICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uCiAJICovCiAJZHFwLT5xX3RyYW5zcCA9IHRwOwpAQCAtMzg3LDE4ICszODcsMTggQEAKIAkJCQlxdHJ4LT5xdF9kZWxiY250X2RlbHRhOwogCQkJdG90YWxydGJkZWx0YSA9IHF0cngtPnF0X3J0YmNvdW50X2RlbHRhICsKIAkJCQlxdHJ4LT5xdF9kZWxydGJfZGVsdGE7Ci0jaWZkZWYgUVVPVEFERUJVRworI2lmZGVmIERFQlVHCiAJCQlpZiAodG90YWxiZGVsdGEgPCAwKQogCQkJCUFTU0VSVChiZTY0X3RvX2NwdShkLT5kX2Jjb3VudCkgPj0KLQkJCQkgICAgICAgKHhmc19xY250X3QpIC10b3RhbGJkZWx0YSk7CisJCQkJICAgICAgIC10b3RhbGJkZWx0YSk7CiAKIAkJCWlmICh0b3RhbHJ0YmRlbHRhIDwgMCkKIAkJCQlBU1NFUlQoYmU2NF90b19jcHUoZC0+ZF9ydGJjb3VudCkgPj0KLQkJCQkgICAgICAgKHhmc19xY250X3QpIC10b3RhbHJ0YmRlbHRhKTsKKwkJCQkgICAgICAgLXRvdGFscnRiZGVsdGEpOwogCiAJCQlpZiAocXRyeC0+cXRfaWNvdW50X2RlbHRhIDwgMCkKIAkJCQlBU1NFUlQoYmU2NF90b19jcHUoZC0+ZF9pY291bnQpID49Ci0JCQkJICAgICAgICh4ZnNfcWNudF90KSAtcXRyeC0+cXRfaWNvdW50X2RlbHRhKTsKKwkJCQkgICAgICAgLXF0cngtPnF0X2ljb3VudF9kZWx0YSk7CiAjZW5kaWYKIAkJCWlmICh0b3RhbGJkZWx0YSkKIAkJCQliZTY0X2FkZF9jcHUoJmQtPmRfYmNvdW50LCAoeGZzX3FjbnRfdCl0b3RhbGJkZWx0YSk7CkBAIC02NDIsMTEgKzY0Miw2IEBACiAJICAgICgoWEZTX0lTX1VRVU9UQV9FTkZPUkNFRChkcXAtPnFfbW91bnQpICYmIFhGU19RTV9JU1VEUShkcXApKSB8fAogCSAgICAgKFhGU19JU19PUVVPVEFfRU5GT1JDRUQoZHFwLT5xX21vdW50KSAmJgogCSAgICAgIChYRlNfUU1fSVNQRFEoZHFwKSB8fCBYRlNfUU1fSVNHRFEoZHFwKSkpKSkgewotI2lmZGVmIFFVT1RBREVCVUcKLQkJeGZzX2RlYnVnKG1wLAotCQkJIkJMSyBSZXM6IG5ibGtzPSVsZCArIHJlc2Jjb3VudD0lTGQgPiBoYXJkbGltaXQ9JUxkPyIsCi0JCQluYmxrcywgKnJlc2Jjb3VudHAsIGhhcmRsaW1pdCk7Ci0jZW5kaWYKIAkJaWYgKG5ibGtzID4gMCkgewogCQkJLyoKIAkJCSAqIGRxdW90IGlzIGxvY2tlZCBhbHJlYWR5LiBTZWUgaWYgd2UnZCBnbyBvdmVyIHRoZQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmcy5oIGIvZnMveGZzL3hmcy5oCmluZGV4IDVhZDhhZDMuLjUzZWMzZWEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnMuaAorKysgYi9mcy94ZnMveGZzLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgU1RBVElDCiAjZGVmaW5lIERFQlVHIDEKICNkZWZpbmUgWEZTX0JVRl9MT0NLX1RSQUNLSU5HIDEKLS8qICNkZWZpbmUgUVVPVEFERUJVRyAxICovCiAjZW5kaWYKIAogI2luY2x1ZGUgPGxpbnV4LTIuNi94ZnNfbGludXguaD4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWNsLmggYi9mcy94ZnMveGZzX2FjbC5oCmluZGV4IDExZGQ3MjAuLjJjNjU2ZWYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYWNsLmgKKysrIGIvZnMveGZzL3hmc19hY2wuaApAQCAtNDIsNyArNDIsNiBAQAogI2RlZmluZSBTR0lfQUNMX0RFRkFVTFRfU0laRQkoc2l6ZW9mKFNHSV9BQ0xfREVGQVVMVCktMSkKIAogI2lmZGVmIENPTkZJR19YRlNfUE9TSVhfQUNMCi1leHRlcm4gaW50IHhmc19jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncyk7CiBleHRlcm4gc3RydWN0IHBvc2l4X2FjbCAqeGZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpOwogZXh0ZXJuIGludCB4ZnNfaW5oZXJpdF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqZGVmYXVsdF9hY2wpOwogZXh0ZXJuIGludCB4ZnNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwpAQCAtNTIsNyArNTEsNiBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIHhmc194YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXI7CiBleHRlcm4gY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgeGZzX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXI7CiAjZWxzZQotIyBkZWZpbmUgeGZzX2NoZWNrX2FjbAkJCQkJTlVMTAogIyBkZWZpbmUgeGZzX2dldF9hY2woaW5vZGUsIHR5cGUpCQkJTlVMTAogIyBkZWZpbmUgeGZzX2luaGVyaXRfYWNsKGlub2RlLCBkZWZhdWx0X2FjbCkJCTAKICMgZGVmaW5lIHhmc19hY2xfY2htb2QoaW5vZGUpCQkJCTAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWxsb2MuYyBiL2ZzL3hmcy94ZnNfYWxsb2MuYwppbmRleCA5NTg2MmJiLi4xZTAwYjNlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FsbG9jLmMKKysrIGIvZnMveGZzL3hmc19hbGxvYy5jCkBAIC01NzAsOSArNTcwLDcgQEAKIAl4ZnNfYWdibG9ja190CXRibm87CS8qIHN0YXJ0IGJsb2NrIG9mIHRyaW1tZWQgZXh0ZW50ICovCiAJeGZzX2V4dGxlbl90CXRsZW47CS8qIGxlbmd0aCBvZiB0cmltbWVkIGV4dGVudCAqLwogCXhmc19hZ2Jsb2NrX3QJdGVuZDsJLyogZW5kIGJsb2NrIG9mIHRyaW1tZWQgZXh0ZW50ICovCi0JeGZzX2FnYmxvY2tfdAllbmQ7CS8qIGVuZCBvZiBhbGxvY2F0ZWQgZXh0ZW50ICovCiAJaW50CQlpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgb2Ygb3BlcmF0aW9uICovCi0JeGZzX2V4dGxlbl90CXJsZW47CS8qIGxlbmd0aCBvZiByZXR1cm5lZCBleHRlbnQgKi8KIAogCUFTU0VSVChhcmdzLT5hbGlnbm1lbnQgPT0gMSk7CiAKQEAgLTYyNSwxOCArNjIzLDE2IEBACiAJICoKIAkgKiBGaXggdGhlIGxlbmd0aCBhY2NvcmRpbmcgdG8gbW9kIGFuZCBwcm9kIGlmIGdpdmVuLgogCSAqLwotCWVuZCA9IFhGU19BR0JMT0NLX01JTih0ZW5kLCBhcmdzLT5hZ2JubyArIGFyZ3MtPm1heGxlbik7Ci0JYXJncy0+bGVuID0gZW5kIC0gYXJncy0+YWdibm87CisJYXJncy0+bGVuID0gWEZTX0FHQkxPQ0tfTUlOKHRlbmQsIGFyZ3MtPmFnYm5vICsgYXJncy0+bWF4bGVuKQorCQkJCQkJLSBhcmdzLT5hZ2JubzsKIAl4ZnNfYWxsb2NfZml4X2xlbihhcmdzKTsKIAlpZiAoIXhmc19hbGxvY19maXhfbWlubGVmdChhcmdzKSkKIAkJZ290byBub3RfZm91bmQ7CiAKLQlybGVuID0gYXJncy0+bGVuOwotCUFTU0VSVChhcmdzLT5hZ2JubyArIHJsZW4gPD0gdGVuZCk7Ci0JZW5kID0gYXJncy0+YWdibm8gKyBybGVuOworCUFTU0VSVChhcmdzLT5hZ2JubyArIGFyZ3MtPmxlbiA8PSB0ZW5kKTsKIAogCS8qCi0JICogV2UgYXJlIGFsbG9jYXRpbmcgYWdibm8gZm9yIHJsZW4gW2FnYm5vIC4uIGVuZF0KKwkgKiBXZSBhcmUgYWxsb2NhdGluZyBhZ2JubyBmb3IgYXJncy0+bGVuCiAJICogQWxsb2NhdGUvaW5pdGlhbGl6ZSBhIGN1cnNvciBmb3IgdGhlIGJ5LXNpemUgYnRyZWUuCiAJICovCiAJY250X2N1ciA9IHhmc19hbGxvY2J0X2luaXRfY3Vyc29yKGFyZ3MtPm1wLCBhcmdzLT50cCwgYXJncy0+YWdicCwKQEAgLTIxMjcsNyArMjEyMyw3IEBACiAJICogVmFsaWRhdGUgdGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgYWdmIGJsb2NrLgogCSAqLwogCWFnZl9vayA9Ci0JCWJlMzJfdG9fY3B1KGFnZi0+YWdmX21hZ2ljbnVtKSA9PSBYRlNfQUdGX01BR0lDICYmCisJCWFnZi0+YWdmX21hZ2ljbnVtID09IGNwdV90b19iZTMyKFhGU19BR0ZfTUFHSUMpICYmCiAJCVhGU19BR0ZfR09PRF9WRVJTSU9OKGJlMzJfdG9fY3B1KGFnZi0+YWdmX3ZlcnNpb25udW0pKSAmJgogCQliZTMyX3RvX2NwdShhZ2YtPmFnZl9mcmVlYmxrcykgPD0gYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGVuZ3RoKSAmJgogCQliZTMyX3RvX2NwdShhZ2YtPmFnZl9mbGZpcnN0KSA8IFhGU19BR0ZMX1NJWkUobXApICYmCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FsbG9jX2J0cmVlLmMgYi9mcy94ZnMveGZzX2FsbG9jX2J0cmVlLmMKaW5kZXggMmIzNTE4OC4uZmZiMzM4NiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hbGxvY19idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWVfdHJhY2UuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKQEAgLTMxMSw3MiArMzEwLDYgQEAKIH0KICNlbmRpZgkvKiBERUJVRyAqLwogCi0jaWZkZWYgWEZTX0JUUkVFX1RSQUNFCi1rdHJhY2VfdAkqeGZzX2FsbG9jYnRfdHJhY2VfYnVmOwotCi1TVEFUSUMgdm9pZAoteGZzX2FsbG9jYnRfdHJhY2VfZW50ZXIoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKLQljb25zdCBjaGFyCQkqZnVuYywKLQljaGFyCQkJKnMsCi0JaW50CQkJdHlwZSwKLQlpbnQJCQlsaW5lLAotCV9fcHN1bnNpZ25lZF90CQlhMCwKLQlfX3BzdW5zaWduZWRfdAkJYTEsCi0JX19wc3Vuc2lnbmVkX3QJCWEyLAotCV9fcHN1bnNpZ25lZF90CQlhMywKLQlfX3BzdW5zaWduZWRfdAkJYTQsCi0JX19wc3Vuc2lnbmVkX3QJCWE1LAotCV9fcHN1bnNpZ25lZF90CQlhNiwKLQlfX3BzdW5zaWduZWRfdAkJYTcsCi0JX19wc3Vuc2lnbmVkX3QJCWE4LAotCV9fcHN1bnNpZ25lZF90CQlhOSwKLQlfX3BzdW5zaWduZWRfdAkJYTEwKQotewotCWt0cmFjZV9lbnRlcih4ZnNfYWxsb2NidF90cmFjZV9idWYsICh2b2lkICopKF9fcHNpbnRfdCl0eXBlLAotCQkodm9pZCAqKWZ1bmMsICh2b2lkICopcywgTlVMTCwgKHZvaWQgKiljdXIsCi0JCSh2b2lkICopYTAsICh2b2lkICopYTEsICh2b2lkICopYTIsICh2b2lkICopYTMsCi0JCSh2b2lkICopYTQsICh2b2lkICopYTUsICh2b2lkICopYTYsICh2b2lkICopYTcsCi0JCSh2b2lkICopYTgsICh2b2lkICopYTksICh2b2lkICopYTEwKTsKLX0KLQotU1RBVElDIHZvaWQKLXhmc19hbGxvY2J0X3RyYWNlX2N1cnNvcigKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAotCV9fdWludDMyX3QJCSpzMCwKLQlfX3VpbnQ2NF90CQkqbDAsCi0JX191aW50NjRfdAkJKmwxKQotewotCSpzMCA9IGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm87Ci0JKmwwID0gY3VyLT5iY19yZWMuYS5hcl9zdGFydGJsb2NrOwotCSpsMSA9IGN1ci0+YmNfcmVjLmEuYXJfYmxvY2tjb3VudDsKLX0KLQotU1RBVElDIHZvaWQKLXhmc19hbGxvY2J0X3RyYWNlX2tleSgKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAotCXVuaW9uIHhmc19idHJlZV9rZXkJKmtleSwKLQlfX3VpbnQ2NF90CQkqbDAsCi0JX191aW50NjRfdAkJKmwxKQotewotCSpsMCA9IGJlMzJfdG9fY3B1KGtleS0+YWxsb2MuYXJfc3RhcnRibG9jayk7Ci0JKmwxID0gYmUzMl90b19jcHUoa2V5LT5hbGxvYy5hcl9ibG9ja2NvdW50KTsKLX0KLQotU1RBVElDIHZvaWQKLXhmc19hbGxvY2J0X3RyYWNlX3JlY29yZCgKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAotCXVuaW9uIHhmc19idHJlZV9yZWMJKnJlYywKLQlfX3VpbnQ2NF90CQkqbDAsCi0JX191aW50NjRfdAkJKmwxLAotCV9fdWludDY0X3QJCSpsMikKLXsKLQkqbDAgPSBiZTMyX3RvX2NwdShyZWMtPmFsbG9jLmFyX3N0YXJ0YmxvY2spOwotCSpsMSA9IGJlMzJfdG9fY3B1KHJlYy0+YWxsb2MuYXJfYmxvY2tjb3VudCk7Ci0JKmwyID0gMDsKLX0KLSNlbmRpZiAvKiBYRlNfQlRSRUVfVFJBQ0UgKi8KLQogc3RhdGljIGNvbnN0IHN0cnVjdCB4ZnNfYnRyZWVfb3BzIHhmc19hbGxvY2J0X29wcyA9IHsKIAkucmVjX2xlbgkJPSBzaXplb2YoeGZzX2FsbG9jX3JlY190KSwKIAkua2V5X2xlbgkJPSBzaXplb2YoeGZzX2FsbG9jX2tleV90KSwKQEAgLTM5MywxOCArMzI2LDEwIEBACiAJLmluaXRfcmVjX2Zyb21fY3VyCT0geGZzX2FsbG9jYnRfaW5pdF9yZWNfZnJvbV9jdXIsCiAJLmluaXRfcHRyX2Zyb21fY3VyCT0geGZzX2FsbG9jYnRfaW5pdF9wdHJfZnJvbV9jdXIsCiAJLmtleV9kaWZmCQk9IHhmc19hbGxvY2J0X2tleV9kaWZmLAotCiAjaWZkZWYgREVCVUcKIAkua2V5c19pbm9yZGVyCQk9IHhmc19hbGxvY2J0X2tleXNfaW5vcmRlciwKIAkucmVjc19pbm9yZGVyCQk9IHhmc19hbGxvY2J0X3JlY3NfaW5vcmRlciwKICNlbmRpZgotCi0jaWZkZWYgWEZTX0JUUkVFX1RSQUNFCi0JLnRyYWNlX2VudGVyCQk9IHhmc19hbGxvY2J0X3RyYWNlX2VudGVyLAotCS50cmFjZV9jdXJzb3IJCT0geGZzX2FsbG9jYnRfdHJhY2VfY3Vyc29yLAotCS50cmFjZV9rZXkJCT0geGZzX2FsbG9jYnRfdHJhY2Vfa2V5LAotCS50cmFjZV9yZWNvcmQJCT0geGZzX2FsbG9jYnRfdHJhY2VfcmVjb3JkLAotI2VuZGlmCiB9OwogCiAvKgpAQCAtNDI3LDEzICszNTIsMTYgQEAKIAogCWN1ci0+YmNfdHAgPSB0cDsKIAljdXItPmJjX21wID0gbXA7Ci0JY3VyLT5iY19ubGV2ZWxzID0gYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGV2ZWxzW2J0bnVtXSk7CiAJY3VyLT5iY19idG51bSA9IGJ0bnVtOwogCWN1ci0+YmNfYmxvY2tsb2cgPSBtcC0+bV9zYi5zYl9ibG9ja2xvZzsKLQogCWN1ci0+YmNfb3BzID0gJnhmc19hbGxvY2J0X29wczsKLQlpZiAoYnRudW0gPT0gWEZTX0JUTlVNX0NOVCkKKworCWlmIChidG51bSA9PSBYRlNfQlROVU1fQ05UKSB7CisJCWN1ci0+YmNfbmxldmVscyA9IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2xldmVsc1tYRlNfQlROVU1fQ05UXSk7CiAJCWN1ci0+YmNfZmxhZ3MgPSBYRlNfQlRSRUVfTEFTVFJFQ19VUERBVEU7CisJfSBlbHNlIHsKKwkJY3VyLT5iY19ubGV2ZWxzID0gYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9dKTsKKwl9CiAKIAljdXItPmJjX3ByaXZhdGUuYS5hZ2JwID0gYWdicDsKIAljdXItPmJjX3ByaXZhdGUuYS5hZ25vID0gYWdubzsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXJjaC5oIGIvZnMveGZzL3hmc19hcmNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MDIyNDkuLjAwMDAwMDAKLS0tIGEvZnMveGZzL3hmc19hcmNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotI2lmbmRlZiBfX1hGU19BUkNIX0hfXwotI2RlZmluZSBfX1hGU19BUkNIX0hfXwotCi0jaWZuZGVmIFhGU19CSUdfSU5VTVMKLSMgZXJyb3IgWEZTX0JJR19JTlVNUyBtdXN0IGJlIGRlZmluZWQgdHJ1ZSBvciBmYWxzZQotI2VuZGlmCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0KLSNpZmRlZiBfX0JJR19FTkRJQU4KLSNkZWZpbmUJWEZTX05BVElWRV9IT1NUCTEKLSNlbHNlCi0jdW5kZWYgWEZTX05BVElWRV9IT1NUCi0jZW5kaWYKLQotI2Vsc2UgLyogX19LRVJORUxfXyAqLwotCi0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgotI2RlZmluZQlYRlNfTkFUSVZFX0hPU1QJMQotI2Vsc2UKLSN1bmRlZiBYRlNfTkFUSVZFX0hPU1QKLSNlbmRpZgotCi0jaWZkZWYgWEZTX05BVElWRV9IT1NUCi0jZGVmaW5lIGNwdV90b19iZTE2KHZhbCkJKChfX2ZvcmNlIF9fYmUxNikoX191MTYpKHZhbCkpCi0jZGVmaW5lIGNwdV90b19iZTMyKHZhbCkJKChfX2ZvcmNlIF9fYmUzMikoX191MzIpKHZhbCkpCi0jZGVmaW5lIGNwdV90b19iZTY0KHZhbCkJKChfX2ZvcmNlIF9fYmU2NCkoX191NjQpKHZhbCkpCi0jZGVmaW5lIGJlMTZfdG9fY3B1KHZhbCkJKChfX2ZvcmNlIF9fdTE2KShfX2JlMTYpKHZhbCkpCi0jZGVmaW5lIGJlMzJfdG9fY3B1KHZhbCkJKChfX2ZvcmNlIF9fdTMyKShfX2JlMzIpKHZhbCkpCi0jZGVmaW5lIGJlNjRfdG9fY3B1KHZhbCkJKChfX2ZvcmNlIF9fdTY0KShfX2JlNjQpKHZhbCkpCi0jZWxzZQotI2RlZmluZSBjcHVfdG9fYmUxNih2YWwpCSgoX19mb3JjZSBfX2JlMTYpX19zd2FiMTYoKF9fdTE2KSh2YWwpKSkKLSNkZWZpbmUgY3B1X3RvX2JlMzIodmFsKQkoKF9fZm9yY2UgX19iZTMyKV9fc3dhYjMyKChfX3UzMikodmFsKSkpCi0jZGVmaW5lIGNwdV90b19iZTY0KHZhbCkJKChfX2ZvcmNlIF9fYmU2NClfX3N3YWI2NCgoX191NjQpKHZhbCkpKQotI2RlZmluZSBiZTE2X3RvX2NwdSh2YWwpCShfX3N3YWIxNigoX19mb3JjZSBfX3UxNikoX19iZTE2KSh2YWwpKSkKLSNkZWZpbmUgYmUzMl90b19jcHUodmFsKQkoX19zd2FiMzIoKF9fZm9yY2UgX191MzIpKF9fYmUzMikodmFsKSkpCi0jZGVmaW5lIGJlNjRfdG9fY3B1KHZhbCkJKF9fc3dhYjY0KChfX2ZvcmNlIF9fdTY0KShfX2JlNjQpKHZhbCkpKQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiZTE2X2FkZF9jcHUoX19iZTE2ICphLCBfX3MxNiBiKQotewotCSphID0gY3B1X3RvX2JlMTYoYmUxNl90b19jcHUoKmEpICsgYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiZTMyX2FkZF9jcHUoX19iZTMyICphLCBfX3MzMiBiKQotewotCSphID0gY3B1X3RvX2JlMzIoYmUzMl90b19jcHUoKmEpICsgYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiZTY0X2FkZF9jcHUoX19iZTY0ICphLCBfX3M2NCBiKQotewotCSphID0gY3B1X3RvX2JlNjQoYmU2NF90b19jcHUoKmEpICsgYik7Ci19Ci0KLSNlbmRpZgkvKiBfX0tFUk5FTF9fICovCi0KLS8qCi0gKiBnZXQgYW5kIHNldCBpbnRlZ2VycyBmcm9tIHBvdGVudGlhbGx5IHVuYWxpZ25lZCBsb2NhdGlvbnMKLSAqLwotCi0jZGVmaW5lIElOVF9HRVRfVU5BTElHTkVEXzE2X0JFKHBvaW50ZXIpIFwKLSAgICgoX191MTYpKCgoKF9fdTgqKShwb2ludGVyKSlbMF0gPDwgOCkgfCAoKChfX3U4KikocG9pbnRlcikpWzFdKSkpCi0jZGVmaW5lIElOVF9TRVRfVU5BTElHTkVEXzE2X0JFKHBvaW50ZXIsdmFsdWUpIFwKLSAgICB7IFwKLQkoKF9fdTgqKShwb2ludGVyKSlbMF0gPSAoKCh2YWx1ZSkgPj4gOCkgJiAweGZmKTsgXAotCSgoX191OCopKHBvaW50ZXIpKVsxXSA9ICgoKHZhbHVlKSAgICAgKSAmIDB4ZmYpOyBcCi0gICAgfQotCi0vKgotICogSW4gZGlyZWN0b3JpZXMgaW5vZGUgbnVtYmVycyBhcmUgc3RvcmVkIGFzIHVuYWxpZ25lZCBhcnJheXMgb2YgdW5zaWduZWQKLSAqIDhiaXQgaW50ZWdlcnMgb24gZGlzay4KLSAqCi0gKiBGb3IgdjEgZGlyZWN0b3JpZXMgb3IgdjIgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGlub2RlIG51bWJlcnMgdGhhdAotICogZG8gbm90IGZpdCBpbnRvIDMyYml0IHRoZSBhcnJheSBoYXMgZWlnaHQgbWVtYmVycywgYnV0IHRoZSBmaXJzdCBtZW1iZXIKLSAqIGlzIGFsd2F5cyB6ZXJvOgotICoKLSAqICB8dW51c2VkfDQ4LTU1fDQwLTQ3fDMyLTM5fDI0LTMxfDE2LTIzfCA4LTE1fCAwLSA3fAotICoKLSAqIEZvciB2MiBkaXJlY3RvcmllcyB0aGF0IG9ubHkgY29udGFpbiBlbnRyaWVzIHdpdGggaW5vZGUgbnVtYmVycyB0aGF0IGZpdAotICogaW50byAzMmJpdHMgYSBmb3VyLW1lbWJlciBhcnJheSBpcyB1c2VkOgotICoKLSAqICB8MjQtMzF8MTYtMjN8IDgtMTV8IDAtIDd8Ci0gKi8gCi0KLSNkZWZpbmUgWEZTX0dFVF9ESVJfSU5PNChkaSkgXAotCSgoKF9fdTMyKShkaSkuaVswXSA8PCAyNCkgfCAoKGRpKS5pWzFdIDw8IDE2KSB8ICgoZGkpLmlbMl0gPDwgOCkgfCAoKGRpKS5pWzNdKSkKLQotI2RlZmluZSBYRlNfUFVUX0RJUl9JTk80KGZyb20sIGRpKSBcCi1kbyB7IFwKLQkoZGkpLmlbMF0gPSAoKChmcm9tKSAmIDB4ZmYwMDAwMDBVTEwpID4+IDI0KTsgXAotCShkaSkuaVsxXSA9ICgoKGZyb20pICYgMHgwMGZmMDAwMFVMTCkgPj4gMTYpOyBcCi0JKGRpKS5pWzJdID0gKCgoZnJvbSkgJiAweDAwMDBmZjAwVUxMKSA+PiA4KTsgXAotCShkaSkuaVszXSA9ICgoZnJvbSkgJiAweDAwMDAwMGZmVUxMKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBYRlNfRElfSEkoZGkpIFwKLQkoKChfX3UzMikoZGkpLmlbMV0gPDwgMTYpIHwgKChkaSkuaVsyXSA8PCA4KSB8ICgoZGkpLmlbM10pKQotI2RlZmluZSBYRlNfRElfTE8oZGkpIFwKLQkoKChfX3UzMikoZGkpLmlbNF0gPDwgMjQpIHwgKChkaSkuaVs1XSA8PCAxNikgfCAoKGRpKS5pWzZdIDw8IDgpIHwgKChkaSkuaVs3XSkpCi0KLSNkZWZpbmUgWEZTX0dFVF9ESVJfSU5POChkaSkgICAgICAgIFwKLQkoKCh4ZnNfaW5vX3QpWEZTX0RJX0xPKGRpKSAmIDB4ZmZmZmZmZmZVTEwpIHwgXAotCSAoKHhmc19pbm9fdClYRlNfRElfSEkoZGkpIDw8IDMyKSkKLQotI2RlZmluZSBYRlNfUFVUX0RJUl9JTk84KGZyb20sIGRpKSBcCi1kbyB7IFwKLQkoZGkpLmlbMF0gPSAwOyBcCi0JKGRpKS5pWzFdID0gKCgoZnJvbSkgJiAweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQ4KTsgXAotCShkaSkuaVsyXSA9ICgoKGZyb20pICYgMHgwMDAwZmYwMDAwMDAwMDAwVUxMKSA+PiA0MCk7IFwKLQkoZGkpLmlbM10gPSAoKChmcm9tKSAmIDB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gMzIpOyBcCi0JKGRpKS5pWzRdID0gKCgoZnJvbSkgJiAweDAwMDAwMDAwZmYwMDAwMDBVTEwpID4+IDI0KTsgXAotCShkaSkuaVs1XSA9ICgoKGZyb20pICYgMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA+PiAxNik7IFwKLQkoZGkpLmlbNl0gPSAoKChmcm9tKSAmIDB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPj4gOCk7IFwKLQkoZGkpLmlbN10gPSAoKGZyb20pICYgMHgwMDAwMDAwMDAwMDAwMGZmVUxMKTsgXAotfSB3aGlsZSAoMCkKLQkKLSNlbmRpZgkvKiBfX1hGU19BUkNIX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyLmMgYi9mcy94ZnMveGZzX2F0dHIuYwppbmRleCBjODYzNzUzLi5jYmFlNDI0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2F0dHIuYworKysgYi9mcy94ZnMveGZzX2F0dHIuYwpAQCAtNDkwLDYgKzQ5MCwxMyBAQAogCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0FUVFJfRk9SSzsKIAogCS8qCisJICogd2UgaGF2ZSBubyBjb250cm9sIG92ZXIgdGhlIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IHVzZXJzcGFjZSBwYXNzZXMgdXMKKwkgKiB0byByZW1vdmUsIHNvIHdlIGhhdmUgdG8gYWxsb3cgdGhlIG5hbWUgbG9va3VwIHByaW9yIHRvIGF0dHJpYnV0ZQorCSAqIHJlbW92YWwgdG8gZmFpbC4KKwkgKi8KKwlhcmdzLm9wX2ZsYWdzID0gWEZTX0RBX09QX09LTk9FTlQ7CisKKwkvKgogCSAqIEF0dGFjaCB0aGUgZHF1b3RzIHRvIHRoZSBpbm9kZS4KIAkgKi8KIAllcnJvciA9IHhmc19xbV9kcWF0dGFjaChkcCwgMCk7CkBAIC04MTUsMTcgKzgyMiwyMSBAQAogCWVycm9yID0geGZzX2F0dHJfcm9vdF9pbmFjdGl2ZSgmdHJhbnMsIGRwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OworCiAJLyoKLQkgKiBzaWduYWwgc3luY2hyb25vdXMgaW5hY3RpdmUgdHJhbnNhY3Rpb25zIHVubGVzcyB0aGlzCi0JICogaXMgYSBzeW5jaHJvbm91cyBtb3VudCBmaWxlc3lzdGVtIGluIHdoaWNoIGNhc2Ugd2UKLQkgKiBrbm93IHRoYXQgd2UncmUgaGVyZSBiZWNhdXNlIHdlJ3ZlIGJlZW4gY2FsbGVkIG91dCBvZgotCSAqIHhmc19pbmFjdGl2ZSB3aGljaCBtZWFucyB0aGF0IHRoZSBsYXN0IHJlZmVyZW5jZSBpcyBnb25lCi0JICogYW5kIHRoZSB1bmxpbmsgdHJhbnNhY3Rpb24gaGFzIGFscmVhZHkgaGl0IHRoZSBkaXNrIHNvCi0JICogYXN5bmMgaW5hY3RpdmUgdHJhbnNhY3Rpb25zIGFyZSBzYWZlLgorCSAqIFNpZ25hbCBzeW5jaHJvbm91cyBpbmFjdGl2ZSB0cmFuc2FjdGlvbnMgdW5sZXNzIHRoaXMgaXMgYQorCSAqIHN5bmNocm9ub3VzIG1vdW50IGZpbGVzeXN0ZW0gaW4gd2hpY2ggY2FzZSB3ZSBrbm93IHRoYXQgd2UncmUgaGVyZQorCSAqIGJlY2F1c2Ugd2UndmUgYmVlbiBjYWxsZWQgb3V0IG9mIHhmc19pbmFjdGl2ZSB3aGljaCBtZWFucyB0aGF0IHRoZQorCSAqIGxhc3QgcmVmZXJlbmNlIGlzIGdvbmUgYW5kIHRoZSB1bmxpbmsgdHJhbnNhY3Rpb24gaGFzIGFscmVhZHkgaGl0CisJICogdGhlIGRpc2sgc28gYXN5bmMgaW5hY3RpdmUgdHJhbnNhY3Rpb25zIGFyZSBzYWZlLgogCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgmdHJhbnMsIGRwLCAwTEwsIFhGU19BVFRSX0ZPUkssCi0JCQkJKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpCi0JCQkJID8gMSA6IDApKSkpCisJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpKSB7CisJCWlmIChkcC0+aV9kLmRpX2FuZXh0ZW50cyA+IDApCisJCQl4ZnNfdHJhbnNfc2V0X3N5bmModHJhbnMpOworCX0KKworCWVycm9yID0geGZzX2l0cnVuY2F0ZV9leHRlbnRzKCZ0cmFucywgZHAsIFhGU19BVFRSX0ZPUkssIDApOworCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAKIAkvKgpAQCAtMTE5Miw3ICsxMjAzLDcgQEAKIAkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CiAJQVNTRVJUKGJwICE9IE5VTEwpOwogCWxlYWYgPSBicC0+ZGF0YTsKLQlpZiAodW5saWtlbHkoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpICE9IFhGU19BVFRSX0xFQUZfTUFHSUMpKSB7CisJaWYgKHVubGlrZWx5KGxlYWYtPmhkci5pbmZvLm1hZ2ljICE9IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKSkgewogCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2F0dHJfbGVhZl9saXN0IiwgWEZTX0VSUkxFVkVMX0xPVywKIAkJCQkgICAgIGNvbnRleHQtPmRwLT5pX21vdW50LCBsZWFmKTsKIAkJeGZzX2RhX2JyZWxzZShOVUxMLCBicCk7CkBAIC0xNTk5LDkgKzE2MTAsOCBAQAogCQkJCQkJICAgICBYRlNfQVRUUl9GT1JLKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXQ7Ci0JCUFTU0VSVChiZTE2X3RvX2NwdSgoKHhmc19hdHRyX2xlYWZibG9ja190ICopCi0JCQkJICAgICAgYnAtPmRhdGEpLT5oZHIuaW5mby5tYWdpYykKLQkJCQkJCSAgICAgICA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwkJQVNTRVJUKCgoKHhmc19hdHRyX2xlYWZibG9ja190ICopYnAtPmRhdGEpLT5oZHIuaW5mby5tYWdpYykgPT0KKwkJICAgICAgIGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAogCQlpZiAoKGZvcmtvZmYgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fYWxsZml0KGJwLCBkcCkpKSB7CiAJCQl4ZnNfYm1hcF9pbml0KGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKQEAgLTE4NjYsMTEgKzE4NzYsMTEgQEAKIAkJCQlyZXR1cm4oWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCkpOwogCQkJfQogCQkJbm9kZSA9IGJwLT5kYXRhOwotCQkJaWYgKGJlMTZfdG9fY3B1KG5vZGUtPmhkci5pbmZvLm1hZ2ljKQotCQkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpCisJCQlpZiAobm9kZS0+aGRyLmluZm8ubWFnaWMgPT0KKwkJCSAgICBjcHVfdG9fYmUxNihYRlNfQVRUUl9MRUFGX01BR0lDKSkKIAkJCQlicmVhazsKLQkJCWlmICh1bmxpa2VseShiZTE2X3RvX2NwdShub2RlLT5oZHIuaW5mby5tYWdpYykKLQkJCQkJCQkhPSBYRlNfREFfTk9ERV9NQUdJQykpIHsKKwkJCWlmICh1bmxpa2VseShub2RlLT5oZHIuaW5mby5tYWdpYyAhPQorCQkJCSAgICAgY3B1X3RvX2JlMTYoWEZTX0RBX05PREVfTUFHSUMpKSkgewogCQkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfYXR0cl9ub2RlX2xpc3QoMykiLAogCQkJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLAogCQkJCQkJICAgICBjb250ZXh0LT5kcC0+aV9tb3VudCwKQEAgLTE5MDUsOCArMTkxNSw4IEBACiAJICovCiAJZm9yICg7OykgewogCQlsZWFmID0gYnAtPmRhdGE7Ci0JCWlmICh1bmxpa2VseShiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykKLQkJCQkJCSE9IFhGU19BVFRSX0xFQUZfTUFHSUMpKSB7CisJCWlmICh1bmxpa2VseShsZWFmLT5oZHIuaW5mby5tYWdpYyAhPQorCQkJICAgICBjcHVfdG9fYmUxNihYRlNfQVRUUl9MRUFGX01BR0lDKSkpIHsKIAkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfYXR0cl9ub2RlX2xpc3QoNCkiLAogCQkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csCiAJCQkJCSAgICAgY29udGV4dC0+ZHAtPmlfbW91bnQsIGxlYWYpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKaW5kZXggNzFlOTBkYzIuLjhmYWQ5NjAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKKysrIGIvZnMveGZzL3hmc19hdHRyX2xlYWYuYwpAQCAtNzMxLDcgKzczMSw3IEBACiAJaW50IGJ5dGVzLCBpOwogCiAJbGVhZiA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGxlYWYtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAogCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbMF07CiAJYnl0ZXMgPSBzaXplb2Yoc3RydWN0IHhmc19hdHRyX3NmX2hkcik7CkBAIC03NzcsNyArNzc3LDcgQEAKIAlBU1NFUlQoYnAgIT0gTlVMTCk7CiAJbWVtY3B5KHRtcGJ1ZmZlciwgYnAtPmRhdGEsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpKTsKIAlsZWFmID0gKHhmc19hdHRyX2xlYWZibG9ja190ICopdG1wYnVmZmVyOwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGxlYWYtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAltZW1zZXQoYnAtPmRhdGEsIDAsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpKTsKIAogCS8qCkBAIC04NzIsNyArODcyLDcgQEAKIAkJZ290byBvdXQ7CiAJbm9kZSA9IGJwMS0+ZGF0YTsKIAlsZWFmID0gYnAyLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGxlYWYtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAkvKiBib3RoIG9uLWRpc2ssIGRvbid0IGVuZGlhbi1mbGlwIHR3aWNlICovCiAJbm9kZS0+YnRyZWVbMF0uaGFzaHZhbCA9CiAJCWxlYWYtPmVudHJpZXNbYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KS0xIF0uaGFzaHZhbDsKQEAgLTk5Nyw3ICs5OTcsNyBAQAogCWludCB0YWJsZXNpemUsIGVudHNpemUsIHN1bSwgdG1wLCBpOwogCiAJbGVhZiA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGxlYWYtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAlBU1NFUlQoKGFyZ3MtPmluZGV4ID49IDApCiAJCSYmIChhcmdzLT5pbmRleCA8PSBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpKSk7CiAJaGRyID0gJmxlYWYtPmhkcjsKQEAgLTEwNzAsNyArMTA3MCw3IEBACiAJaW50IHRtcCwgaTsKIAogCWxlYWYgPSBicC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChsZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfQVRUUl9MRUFGX01BR0lDKSk7CiAJaGRyID0gJmxlYWYtPmhkcjsKIAlBU1NFUlQoKG1hcGluZGV4ID49IDApICYmIChtYXBpbmRleCA8IFhGU19BVFRSX0xFQUZfTUFQU0laRSkpOwogCUFTU0VSVCgoYXJncy0+aW5kZXggPj0gMCkgJiYgKGFyZ3MtPmluZGV4IDw9IGJlMTZfdG9fY3B1KGhkci0+Y291bnQpKSk7CkBAIC0xMjU2LDggKzEyNTYsOCBAQAogCUFTU0VSVChibGsyLT5tYWdpYyA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKIAlsZWFmMSA9IGJsazEtPmJwLT5kYXRhOwogCWxlYWYyID0gYmxrMi0+YnAtPmRhdGE7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KGxlYWYxLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KGxlYWYyLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGxlYWYxLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfQVRUUl9MRUFGX01BR0lDKSk7CisJQVNTRVJUKGxlYWYyLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfQVRUUl9MRUFGX01BR0lDKSk7CiAJYXJncyA9IHN0YXRlLT5hcmdzOwogCiAJLyoKQEAgLTE1MzMsNyArMTUzMyw3IEBACiAJICovCiAJYmxrID0gJnN0YXRlLT5wYXRoLmJsa1sgc3RhdGUtPnBhdGguYWN0aXZlLTEgXTsKIAlpbmZvID0gYmxrLT5icC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUoaW5mby0+bWFnaWMpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChpbmZvLT5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfQVRUUl9MRUFGX01BR0lDKSk7CiAJbGVhZiA9ICh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqKWluZm87CiAJY291bnQgPSBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpOwogCWJ5dGVzID0gc2l6ZW9mKHhmc19hdHRyX2xlYWZfaGRyX3QpICsKQEAgLTE1OTYsNyArMTU5Niw3IEBACiAJCWJ5dGVzICA9IHN0YXRlLT5ibG9ja3NpemUgLSAoc3RhdGUtPmJsb2Nrc2l6ZT4+Mik7CiAJCWJ5dGVzIC09IGJlMTZfdG9fY3B1KGxlYWYtPmhkci51c2VkYnl0ZXMpOwogCQlsZWFmID0gYnAtPmRhdGE7Ci0JCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJCUFTU0VSVChsZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfQVRUUl9MRUFGX01BR0lDKSk7CiAJCWNvdW50ICs9IGJlMTZfdG9fY3B1KGxlYWYtPmhkci5jb3VudCk7CiAJCWJ5dGVzIC09IGJlMTZfdG9fY3B1KGxlYWYtPmhkci51c2VkYnl0ZXMpOwogCQlieXRlcyAtPSBjb3VudCAqIHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpOwpAQCAtMTY1MCw3ICsxNjUwLDcgQEAKIAl4ZnNfbW91bnRfdCAqbXA7CiAKIAlsZWFmID0gYnAtPmRhdGE7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KGxlYWYtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQobGVhZi0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0FUVFJfTEVBRl9NQUdJQykpOwogCWhkciA9ICZsZWFmLT5oZHI7CiAJbXAgPSBhcmdzLT50cmFucy0+dF9tb3VudHA7CiAJQVNTRVJUKChiZTE2X3RvX2NwdShoZHItPmNvdW50KSA+IDApCkBAIC0xODEzLDggKzE4MTMsOCBAQAogCUFTU0VSVChzYXZlX2Jsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CiAJZHJvcF9sZWFmID0gZHJvcF9ibGstPmJwLT5kYXRhOwogCXNhdmVfbGVhZiA9IHNhdmVfYmxrLT5icC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUoZHJvcF9sZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KHNhdmVfbGVhZi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChkcm9wX2xlYWYtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKKwlBU1NFUlQoc2F2ZV9sZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfQVRUUl9MRUFGX01BR0lDKSk7CiAJZHJvcF9oZHIgPSAmZHJvcF9sZWFmLT5oZHI7CiAJc2F2ZV9oZHIgPSAmc2F2ZV9sZWFmLT5oZHI7CiAKQEAgLTE5MTUsNyArMTkxNSw3IEBACiAJeGZzX2RhaGFzaF90IGhhc2h2YWw7CiAKIAlsZWFmID0gYnAtPmRhdGE7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KGxlYWYtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQobGVhZi0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0FUVFJfTEVBRl9NQUdJQykpOwogCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpCiAJCQkJCTwgKFhGU19MQlNJWkUoYXJncy0+ZHAtPmlfbW91bnQpLzgpKTsKIApAQCAtMjAxOSw3ICsyMDE5LDcgQEAKIAl4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKm5hbWVfcm10OwogCiAJbGVhZiA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGxlYWYtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KQogCQkJCQk8IChYRlNfTEJTSVpFKGFyZ3MtPmRwLT5pX21vdW50KS84KSk7CiAJQVNTRVJUKGFyZ3MtPmluZGV4IDwgYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSk7CkBAIC0yMDg3LDggKzIwODcsOCBAQAogCS8qCiAJICogU2V0IHVwIGVudmlyb25tZW50LgogCSAqLwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmX3MtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKLQlBU1NFUlQoYmUxNl90b19jcHUobGVhZl9kLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGxlYWZfcy0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0FUVFJfTEVBRl9NQUdJQykpOworCUFTU0VSVChsZWFmX2QtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAloZHJfcyA9ICZsZWFmX3MtPmhkcjsKIAloZHJfZCA9ICZsZWFmX2QtPmhkcjsKIAlBU1NFUlQoKGJlMTZfdG9fY3B1KGhkcl9zLT5jb3VudCkgPiAwKSAmJgpAQCAtMjIyMiw4ICsyMjIyLDggQEAKIAogCWxlYWYxID0gbGVhZjFfYnAtPmRhdGE7CiAJbGVhZjIgPSBsZWFmMl9icC0+ZGF0YTsKLQlBU1NFUlQoKGJlMTZfdG9fY3B1KGxlYWYxLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQykgJiYKLQkgICAgICAgKGJlMTZfdG9fY3B1KGxlYWYyLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQykpOworCUFTU0VSVCgobGVhZjEtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKSAmJgorCSAgICAgICAobGVhZjItPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKSk7CiAJaWYgKChiZTE2X3RvX2NwdShsZWFmMS0+aGRyLmNvdW50KSA+IDApICYmCiAJICAgIChiZTE2X3RvX2NwdShsZWFmMi0+aGRyLmNvdW50KSA+IDApICYmCiAJICAgICgoYmUzMl90b19jcHUobGVhZjItPmVudHJpZXNbMF0uaGFzaHZhbCkgPApAQCAtMjI0Niw3ICsyMjQ2LDcgQEAKIAl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZjsKIAogCWxlYWYgPSBicC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChsZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfQVRUUl9MRUFGX01BR0lDKSk7CiAJaWYgKGNvdW50KQogCQkqY291bnQgPSBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpOwogCWlmICghbGVhZi0+aGRyLmNvdW50KQpAQCAtMjI2NSw3ICsyMjY1LDcgQEAKIAl4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKm5hbWVfcm10OwogCWludCBzaXplOwogCi0JQVNTRVJUKGJlMTZfdG9fY3B1KGxlYWYtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQobGVhZi0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0FUVFJfTEVBRl9NQUdJQykpOwogCWlmIChsZWFmLT5lbnRyaWVzW2luZGV4XS5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7CiAJCW5hbWVfbG9jID0geGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsKGxlYWYsIGluZGV4KTsKIAkJc2l6ZSA9IHhmc19hdHRyX2xlYWZfZW50c2l6ZV9sb2NhbChuYW1lX2xvYy0+bmFtZWxlbiwKQEAgLTI0NTEsNyArMjQ1MSw3IEBACiAJQVNTRVJUKGJwICE9IE5VTEwpOwogCiAJbGVhZiA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGxlYWYtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAlBU1NFUlQoYXJncy0+aW5kZXggPCBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpKTsKIAlBU1NFUlQoYXJncy0+aW5kZXggPj0gMCk7CiAJZW50cnkgPSAmbGVhZi0+ZW50cmllc1sgYXJncy0+aW5kZXggXTsKQEAgLTI1MTUsNyArMjUxNSw3IEBACiAJQVNTRVJUKGJwICE9IE5VTEwpOwogCiAJbGVhZiA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGxlYWYtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAlBU1NFUlQoYXJncy0+aW5kZXggPCBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpKTsKIAlBU1NFUlQoYXJncy0+aW5kZXggPj0gMCk7CiAJZW50cnkgPSAmbGVhZi0+ZW50cmllc1sgYXJncy0+aW5kZXggXTsKQEAgLTI1ODUsMTMgKzI1ODUsMTMgQEAKIAl9CiAKIAlsZWFmMSA9IGJwMS0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobGVhZjEtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQobGVhZjEtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAlBU1NFUlQoYXJncy0+aW5kZXggPCBiZTE2X3RvX2NwdShsZWFmMS0+aGRyLmNvdW50KSk7CiAJQVNTRVJUKGFyZ3MtPmluZGV4ID49IDApOwogCWVudHJ5MSA9ICZsZWFmMS0+ZW50cmllc1sgYXJncy0+aW5kZXggXTsKIAogCWxlYWYyID0gYnAyLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmMi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChsZWFmMi0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0FUVFJfTEVBRl9NQUdJQykpOwogCUFTU0VSVChhcmdzLT5pbmRleDIgPCBiZTE2X3RvX2NwdShsZWFmMi0+aGRyLmNvdW50KSk7CiAJQVNTRVJUKGFyZ3MtPmluZGV4MiA+PSAwKTsKIAllbnRyeTIgPSAmbGVhZjItPmVudHJpZXNbIGFyZ3MtPmluZGV4MiBdOwpAQCAtMjY4OSw5ICsyNjg5LDkgQEAKIAkgKiBUaGlzIGlzIGEgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIQogCSAqLwogCWluZm8gPSBicC0+ZGF0YTsKLQlpZiAoYmUxNl90b19jcHUoaW5mby0+bWFnaWMpID09IFhGU19EQV9OT0RFX01BR0lDKSB7CisJaWYgKGluZm8tPm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19EQV9OT0RFX01BR0lDKSkgewogCQllcnJvciA9IHhmc19hdHRyX25vZGVfaW5hY3RpdmUodHJhbnMsIGRwLCBicCwgMSk7Ci0JfSBlbHNlIGlmIChiZTE2X3RvX2NwdShpbmZvLT5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQykgeworCX0gZWxzZSBpZiAoaW5mby0+bWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0FUVFJfTEVBRl9NQUdJQykpIHsKIAkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2luYWN0aXZlKHRyYW5zLCBkcCwgYnApOwogCX0gZWxzZSB7CiAJCWVycm9yID0gWEZTX0VSUk9SKEVJTyk7CkBAIC0yNzM5LDcgKzI3MzksNyBAQAogCX0KIAogCW5vZGUgPSBicC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobm9kZS0+aGRyLmluZm8ubWFnaWMpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwlBU1NFUlQobm9kZS0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RBX05PREVfTUFHSUMpKTsKIAlwYXJlbnRfYmxrbm8gPSB4ZnNfZGFfYmxrbm8oYnApOwkvKiBzYXZlIGZvciByZS1yZWFkIGxhdGVyICovCiAJY291bnQgPSBiZTE2X3RvX2NwdShub2RlLT5oZHIuY291bnQpOwogCWlmICghY291bnQpIHsKQEAgLTI3NzMsMTAgKzI3NzMsMTAgQEAKIAkJCSAqIEludmFsaWRhdGUgdGhlIHN1YnRyZWUsIGhvd2V2ZXIgd2UgaGF2ZSB0by4KIAkJCSAqLwogCQkJaW5mbyA9IGNoaWxkX2JwLT5kYXRhOwotCQkJaWYgKGJlMTZfdG9fY3B1KGluZm8tPm1hZ2ljKSA9PSBYRlNfREFfTk9ERV9NQUdJQykgeworCQkJaWYgKGluZm8tPm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19EQV9OT0RFX01BR0lDKSkgewogCQkJCWVycm9yID0geGZzX2F0dHJfbm9kZV9pbmFjdGl2ZSh0cmFucywgZHAsCiAJCQkJCQljaGlsZF9icCwgbGV2ZWwrMSk7Ci0JCQl9IGVsc2UgaWYgKGJlMTZfdG9fY3B1KGluZm8tPm1hZ2ljKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKSB7CisJCQl9IGVsc2UgaWYgKGluZm8tPm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKSB7CiAJCQkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2luYWN0aXZlKHRyYW5zLCBkcCwKIAkJCQkJCWNoaWxkX2JwKTsKIAkJCX0gZWxzZSB7CkBAIC0yODM2LDcgKzI4MzYsNyBAQAogCWludCBlcnJvciwgY291bnQsIHNpemUsIHRtcCwgaTsKIAogCWxlYWYgPSBicC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChsZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfQVRUUl9MRUFGX01BR0lDKSk7CiAKIAkvKgogCSAqIENvdW50IHRoZSBudW1iZXIgb2YgInJlbW90ZSIgdmFsdWUgZXh0ZW50cy4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcC5jIGIvZnMveGZzL3hmc19ibWFwLmMKaW5kZXggZTU0NmEzMy4uYzUxYTNmOSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwLmMKKysrIGIvZnMveGZzL3hmc19ibWFwLmMKQEAgLTI5LDE1ICsyOSwxMSBAQAogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19idHJlZS5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfbGVhZi5oIgotI2luY2x1ZGUgInhmc19kaXIyX2Jsb2NrLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfZXh0ZnJlZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCkBAIC05NCw2ICs5MCw3IEBACiAgKi8KIFNUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KIHhmc19ibWFwX2FkZF9leHRlbnRfZGVsYXlfcmVhbCgKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwogCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCiAJeGZzX2V4dG51bV90CQkqaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KIAl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJLyogaWYgKmN1cnAgaXMgbnVsbCwgbm90IGEgYnRyZWUgKi8KQEAgLTQzOSw2ICs0MzYsNyBAQAogICovCiBTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCiB4ZnNfYm1hcF9hZGRfZXh0ZW50KAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCiAJeGZzX2lub2RlX3QJCSppcCwJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KIAl4ZnNfZXh0bnVtX3QJCSppZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLwogCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBpZiAqY3VycCBpcyBudWxsLCBub3QgYSBidHJlZSAqLwpAQCAtNTI0LDcgKzUyMiw3IEBACiAJCQkJaWYgKGN1cikKIAkJCQkJQVNTRVJUKGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYKIAkJCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCk7Ci0JCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X2RlbGF5X3JlYWwoaXAsCisJCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X2RlbGF5X3JlYWwodHAsIGlwLAogCQkJCQkJaWR4LCAmY3VyLCBuZXcsICZkYV9uZXcsCiAJCQkJCQlmaXJzdCwgZmxpc3QsICZsb2dmbGFncyk7CiAJCQl9IGVsc2UgewpAQCAtNTYxLDcgKzU1OSw3IEBACiAJCWludAl0bXBfbG9nZmxhZ3M7CS8qIHBhcnRpYWwgbG9nIGZsYWcgcmV0dXJuIHZhbCAqLwogCiAJCUFTU0VSVChjdXIgPT0gTlVMTCk7Ci0JCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShpcC0+aV90cmFuc3AsIGlwLCBmaXJzdCwKKwkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKHRwLCBpcCwgZmlyc3QsCiAJCQlmbGlzdCwgJmN1ciwgZGFfb2xkID4gMCwgJnRtcF9sb2dmbGFncywgd2hpY2hmb3JrKTsKIAkJbG9nZmxhZ3MgfD0gdG1wX2xvZ2ZsYWdzOwogCQlpZiAoZXJyb3IpCkBAIC02MDQsNiArNjAyLDcgQEAKICAqLwogU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwogeGZzX2JtYXBfYWRkX2V4dGVudF9kZWxheV9yZWFsKAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCiAJeGZzX2lub2RlX3QJCSppcCwJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KIAl4ZnNfZXh0bnVtX3QJCSppZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLwogCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBpZiAqY3VycCBpcyBudWxsLCBub3QgYSBidHJlZSAqLwpAQCAtOTAxLDcgKzkwMCw3IEBACiAJCX0KIAkJaWYgKGlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKIAkJICAgIGlwLT5pX2QuZGlfbmV4dGVudHMgPiBpcC0+aV9kZi5pZl9leHRfbWF4KSB7Ci0JCQllcnJvciA9IHhmc19ibWFwX2V4dGVudHNfdG9fYnRyZWUoaXAtPmlfdHJhbnNwLCBpcCwKKwkJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZSh0cCwgaXAsCiAJCQkJCWZpcnN0LCBmbGlzdCwgJmN1ciwgMSwgJnRtcF9ydmFsLAogCQkJCQlYRlNfREFUQV9GT1JLKTsKIAkJCXJ2YWwgfD0gdG1wX3J2YWw7CkBAIC05ODQsNyArOTgzLDcgQEAKIAkJfQogCQlpZiAoaXAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgogCQkgICAgaXAtPmlfZC5kaV9uZXh0ZW50cyA+IGlwLT5pX2RmLmlmX2V4dF9tYXgpIHsKLQkJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShpcC0+aV90cmFuc3AsIGlwLAorCQkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKHRwLCBpcCwKIAkJCQlmaXJzdCwgZmxpc3QsICZjdXIsIDEsICZ0bXBfcnZhbCwKIAkJCQlYRlNfREFUQV9GT1JLKTsKIAkJCXJ2YWwgfD0gdG1wX3J2YWw7CkBAIC0xMDUyLDcgKzEwNTEsNyBAQAogCQl9CiAJCWlmIChpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCiAJCSAgICBpcC0+aV9kLmRpX25leHRlbnRzID4gaXAtPmlfZGYuaWZfZXh0X21heCkgewotCQkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKGlwLT5pX3RyYW5zcCwgaXAsCisJCQllcnJvciA9IHhmc19ibWFwX2V4dGVudHNfdG9fYnRyZWUodHAsIGlwLAogCQkJCQlmaXJzdCwgZmxpc3QsICZjdXIsIDEsICZ0bXBfcnZhbCwKIAkJCQkJWEZTX0RBVEFfRk9SSyk7CiAJCQlydmFsIHw9IHRtcF9ydmFsOwpAQCAtMjg3MSw4ICsyODcwLDggQEAKIAkJCWxlbiA9IGRlbC0+YnJfYmxvY2tjb3VudDsKIAkJCWRvX2Rpdihibm8sIG1wLT5tX3NiLnNiX3JleHRzaXplKTsKIAkJCWRvX2RpdihsZW4sIG1wLT5tX3NiLnNiX3JleHRzaXplKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfcnRmcmVlX2V4dGVudChpcC0+aV90cmFuc3AsIGJubywKLQkJCQkJKHhmc19leHRsZW5fdClsZW4pKSkKKwkJCWVycm9yID0geGZzX3J0ZnJlZV9leHRlbnQodHAsIGJubywgKHhmc19leHRsZW5fdClsZW4pOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCWRvX2Z4ID0gMDsKIAkJCW5ibGtzID0gbGVuICogbXAtPm1fc2Iuc2JfcmV4dHNpemU7CkBAIC00MDgwLDcgKzQwNzksNyBAQAogewogCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sgICpibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soYnApOwogCi0JaWYgKGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9tYWdpYykgIT0gWEZTX0JNQVBfTUFHSUMgfHwKKwlpZiAoYmxvY2stPmJiX21hZ2ljICE9IGNwdV90b19iZTMyKFhGU19CTUFQX01BR0lDKSB8fAogCSAgICBiZTE2X3RvX2NwdShibG9jay0+YmJfbGV2ZWwpICE9IGxldmVsIHx8CiAJICAgIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA9PSAwIHx8CiAJICAgIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA+IG1wLT5tX2JtYXBfZG14cltsZXZlbCAhPSAwXSkKQEAgLTQ2NjIsNyArNDY2MSw3IEBACiAJCQkJaWYgKCF3YXNkZWxheSAmJiAoZmxhZ3MgJiBYRlNfQk1BUElfUFJFQUxMT0MpKQogCQkJCQlnb3QuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKIAkJCX0KLQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudChpcCwgJmxhc3R4LCAmY3VyLCAmZ290LAorCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50KHRwLCBpcCwgJmxhc3R4LCAmY3VyLCAmZ290LAogCQkJCWZpcnN0YmxvY2ssIGZsaXN0LCAmdG1wX2xvZ2ZsYWdzLAogCQkJCXdoaWNoZm9yayk7CiAJCQlsb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CkBAIC00NzYzLDcgKzQ3NjIsNyBAQAogCQkJbXZhbC0+YnJfc3RhdGUgPSAobXZhbC0+YnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4pCiAJCQkJCQk/IFhGU19FWFRfTk9STQogCQkJCQkJOiBYRlNfRVhUX1VOV1JJVFRFTjsKLQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudChpcCwgJmxhc3R4LCAmY3VyLCBtdmFsLAorCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50KHRwLCBpcCwgJmxhc3R4LCAmY3VyLCBtdmFsLAogCQkJCWZpcnN0YmxvY2ssIGZsaXN0LCAmdG1wX2xvZ2ZsYWdzLAogCQkJCXdoaWNoZm9yayk7CiAJCQlsb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CkBAIC01MTE3LDcgKzUxMTYsNyBAQAogCQkJCWRlbC5icl9ibG9ja2NvdW50ID0gbW9kOwogCQkJfQogCQkJZGVsLmJyX3N0YXRlID0gWEZTX0VYVF9VTldSSVRURU47Ci0JCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQoaXAsICZsYXN0eCwgJmN1ciwgJmRlbCwKKwkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudCh0cCwgaXAsICZsYXN0eCwgJmN1ciwgJmRlbCwKIAkJCQlmaXJzdGJsb2NrLCBmbGlzdCwgJmxvZ2ZsYWdzLAogCQkJCVhGU19EQVRBX0ZPUkspOwogCQkJaWYgKGVycm9yKQpAQCAtNTE3NSwxOCArNTE3NCwxOCBAQAogCQkJCX0KIAkJCQlwcmV2LmJyX3N0YXRlID0gWEZTX0VYVF9VTldSSVRURU47CiAJCQkJbGFzdHgtLTsKLQkJCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQoaXAsICZsYXN0eCwgJmN1ciwKLQkJCQkJJnByZXYsIGZpcnN0YmxvY2ssIGZsaXN0LCAmbG9nZmxhZ3MsCi0JCQkJCVhGU19EQVRBX0ZPUkspOworCQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudCh0cCwgaXAsICZsYXN0eCwKKwkJCQkJCSZjdXIsICZwcmV2LCBmaXJzdGJsb2NrLCBmbGlzdCwKKwkJCQkJCSZsb2dmbGFncywgWEZTX0RBVEFfRk9SSyk7CiAJCQkJaWYgKGVycm9yKQogCQkJCQlnb3RvIGVycm9yMDsKIAkJCQlnb3RvIG5vZGVsZXRlOwogCQkJfSBlbHNlIHsKIAkJCQlBU1NFUlQoZGVsLmJyX3N0YXRlID09IFhGU19FWFRfTk9STSk7CiAJCQkJZGVsLmJyX3N0YXRlID0gWEZTX0VYVF9VTldSSVRURU47Ci0JCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50KGlwLCAmbGFzdHgsICZjdXIsCi0JCQkJCSZkZWwsIGZpcnN0YmxvY2ssIGZsaXN0LCAmbG9nZmxhZ3MsCi0JCQkJCVhGU19EQVRBX0ZPUkspOworCQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudCh0cCwgaXAsICZsYXN0eCwKKwkJCQkJCSZjdXIsICZkZWwsIGZpcnN0YmxvY2ssIGZsaXN0LAorCQkJCQkJJmxvZ2ZsYWdzLCBYRlNfREFUQV9GT1JLKTsKIAkJCQlpZiAoZXJyb3IpCiAJCQkJCWdvdG8gZXJyb3IwOwogCQkJCWdvdG8gbm9kZWxldGU7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JtYXBfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jCmluZGV4IDg3ZDNjMTAuLmUyZjVkNTkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWVfdHJhY2UuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKQEAgLTQyNSwxMCArNDI0LDEwIEBACiAJeGZzX2JtYnRfa2V5X3QJCSp0a3A7CiAJX19iZTY0CQkJKnRwcDsKIAotCUFTU0VSVChiZTMyX3RvX2NwdShyYmxvY2stPmJiX21hZ2ljKSA9PSBYRlNfQk1BUF9NQUdJQyk7Ci0JQVNTRVJUKGJlNjRfdG9fY3B1KHJibG9jay0+YmJfdS5sLmJiX2xlZnRzaWIpID09IE5VTExERlNCTk8pOwotCUFTU0VSVChiZTY0X3RvX2NwdShyYmxvY2stPmJiX3UubC5iYl9yaWdodHNpYikgPT0gTlVMTERGU0JOTyk7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KHJibG9jay0+YmJfbGV2ZWwpID4gMCk7CisJQVNTRVJUKHJibG9jay0+YmJfbWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0JNQVBfTUFHSUMpKTsKKwlBU1NFUlQocmJsb2NrLT5iYl91LmwuYmJfbGVmdHNpYiA9PSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKSk7CisJQVNTRVJUKHJibG9jay0+YmJfdS5sLmJiX3JpZ2h0c2liID09IGNwdV90b19iZTY0KE5VTExERlNCTk8pKTsKKwlBU1NFUlQocmJsb2NrLT5iYl9sZXZlbCAhPSAwKTsKIAlkYmxvY2stPmJiX2xldmVsID0gcmJsb2NrLT5iYl9sZXZlbDsKIAlkYmxvY2stPmJiX251bXJlY3MgPSByYmxvY2stPmJiX251bXJlY3M7CiAJZG14ciA9IHhmc19ibWRyX21heHJlY3MobXAsIGRibG9ja2xlbiwgMCk7CkBAIC03MzIsOTUgKzczMSw2IEBACiB9CiAjZW5kaWYJLyogREVCVUcgKi8KIAotI2lmZGVmIFhGU19CVFJFRV9UUkFDRQota3RyYWNlX3QJKnhmc19ibWJ0X3RyYWNlX2J1ZjsKLQotU1RBVElDIHZvaWQKLXhmc19ibWJ0X3RyYWNlX2VudGVyKAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCi0JY29uc3QgY2hhcgkJKmZ1bmMsCi0JY2hhcgkJCSpzLAotCWludAkJCXR5cGUsCi0JaW50CQkJbGluZSwKLQlfX3BzdW5zaWduZWRfdAkJYTAsCi0JX19wc3Vuc2lnbmVkX3QJCWExLAotCV9fcHN1bnNpZ25lZF90CQlhMiwKLQlfX3BzdW5zaWduZWRfdAkJYTMsCi0JX19wc3Vuc2lnbmVkX3QJCWE0LAotCV9fcHN1bnNpZ25lZF90CQlhNSwKLQlfX3BzdW5zaWduZWRfdAkJYTYsCi0JX19wc3Vuc2lnbmVkX3QJCWE3LAotCV9fcHN1bnNpZ25lZF90CQlhOCwKLQlfX3BzdW5zaWduZWRfdAkJYTksCi0JX19wc3Vuc2lnbmVkX3QJCWExMCkKLXsKLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmlwOwotCWludAkJCXdoaWNoZm9yayA9IGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yazsKLQotCWt0cmFjZV9lbnRlcih4ZnNfYm1idF90cmFjZV9idWYsCi0JCSh2b2lkICopKChfX3BzaW50X3QpdHlwZSB8ICh3aGljaGZvcmsgPDwgOCkgfCAobGluZSA8PCAxNikpLAotCQkodm9pZCAqKWZ1bmMsICh2b2lkICopcywgKHZvaWQgKilpcCwgKHZvaWQgKiljdXIsCi0JCSh2b2lkICopYTAsICh2b2lkICopYTEsICh2b2lkICopYTIsICh2b2lkICopYTMsCi0JCSh2b2lkICopYTQsICh2b2lkICopYTUsICh2b2lkICopYTYsICh2b2lkICopYTcsCi0JCSh2b2lkICopYTgsICh2b2lkICopYTksICh2b2lkICopYTEwKTsKLX0KLQotU1RBVElDIHZvaWQKLXhmc19ibWJ0X3RyYWNlX2N1cnNvcigKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAotCV9fdWludDMyX3QJCSpzMCwKLQlfX3VpbnQ2NF90CQkqbDAsCi0JX191aW50NjRfdAkJKmwxKQotewotCXN0cnVjdCB4ZnNfYm1idF9yZWNfaG9zdCByOwotCi0JeGZzX2JtYnRfc2V0X2FsbCgmciwgJmN1ci0+YmNfcmVjLmIpOwotCi0JKnMwID0gKGN1ci0+YmNfbmxldmVscyA8PCAyNCkgfAotCSAgICAgIChjdXItPmJjX3ByaXZhdGUuYi5mbGFncyA8PCAxNikgfAotCSAgICAgICBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQ7Ci0JKmwwID0gci5sMDsKLQkqbDEgPSByLmwxOwotfQotCi1TVEFUSUMgdm9pZAoteGZzX2JtYnRfdHJhY2Vfa2V5KAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCi0JdW5pb24geGZzX2J0cmVlX2tleQkqa2V5LAotCV9fdWludDY0X3QJCSpsMCwKLQlfX3VpbnQ2NF90CQkqbDEpCi17Ci0JKmwwID0gYmU2NF90b19jcHUoa2V5LT5ibWJ0LmJyX3N0YXJ0b2ZmKTsKLQkqbDEgPSAwOwotfQotCi0vKiBFbmRpYW4gZmxpcHBpbmcgdmVyc2lvbnMgb2YgdGhlIGJtYnQgZXh0cmFjdGlvbiBmdW5jdGlvbnMgKi8KLVNUQVRJQyB2b2lkCi14ZnNfYm1idF9kaXNrX2dldF9hbGwoCi0JeGZzX2JtYnRfcmVjX3QJKnIsCi0JeGZzX2JtYnRfaXJlY190ICpzKQotewotCV9feGZzX2JtYnRfZ2V0X2FsbChnZXRfdW5hbGlnbmVkX2JlNjQoJnItPmwwKSwKLQkJCQlnZXRfdW5hbGlnbmVkX2JlNjQoJnItPmwxKSwgcyk7Ci19Ci0KLVNUQVRJQyB2b2lkCi14ZnNfYm1idF90cmFjZV9yZWNvcmQoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKLQl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpyZWMsCi0JX191aW50NjRfdAkJKmwwLAotCV9fdWludDY0X3QJCSpsMSwKLQlfX3VpbnQ2NF90CQkqbDIpCi17Ci0Jc3RydWN0IHhmc19ibWJ0X2lyZWMJaXJlYzsKLQotCXhmc19ibWJ0X2Rpc2tfZ2V0X2FsbCgmcmVjLT5ibWJ0LCAmaXJlYyk7Ci0JKmwwID0gaXJlYy5icl9zdGFydG9mZjsKLQkqbDEgPSBpcmVjLmJyX3N0YXJ0YmxvY2s7Ci0JKmwyID0gaXJlYy5icl9ibG9ja2NvdW50OwotfQotI2VuZGlmIC8qIFhGU19CVFJFRV9UUkFDRSAqLwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHhmc19idHJlZV9vcHMgeGZzX2JtYnRfb3BzID0gewogCS5yZWNfbGVuCQk9IHNpemVvZih4ZnNfYm1idF9yZWNfdCksCiAJLmtleV9sZW4JCT0gc2l6ZW9mKHhmc19ibWJ0X2tleV90KSwKQEAgLTgzNywxOCArNzQ3LDEwIEBACiAJLmluaXRfcmVjX2Zyb21fY3VyCT0geGZzX2JtYnRfaW5pdF9yZWNfZnJvbV9jdXIsCiAJLmluaXRfcHRyX2Zyb21fY3VyCT0geGZzX2JtYnRfaW5pdF9wdHJfZnJvbV9jdXIsCiAJLmtleV9kaWZmCQk9IHhmc19ibWJ0X2tleV9kaWZmLAotCiAjaWZkZWYgREVCVUcKIAkua2V5c19pbm9yZGVyCQk9IHhmc19ibWJ0X2tleXNfaW5vcmRlciwKIAkucmVjc19pbm9yZGVyCQk9IHhmc19ibWJ0X3JlY3NfaW5vcmRlciwKICNlbmRpZgotCi0jaWZkZWYgWEZTX0JUUkVFX1RSQUNFCi0JLnRyYWNlX2VudGVyCQk9IHhmc19ibWJ0X3RyYWNlX2VudGVyLAotCS50cmFjZV9jdXJzb3IJCT0geGZzX2JtYnRfdHJhY2VfY3Vyc29yLAotCS50cmFjZV9rZXkJCT0geGZzX2JtYnRfdHJhY2Vfa2V5LAotCS50cmFjZV9yZWNvcmQJCT0geGZzX2JtYnRfdHJhY2VfcmVjb3JkLAotI2VuZGlmCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idHJlZS5jIGIvZnMveGZzL3hmc19idHJlZS5jCmluZGV4IDJmOWU5N2MuLmNhYmY0YjUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnRyZWUuYworKysgYi9mcy94ZnMveGZzX2J0cmVlLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZV90cmFjZS5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc190cmFjZS5oIgogCkBAIC02NiwxMSArNjUsMTEgQEAKIAkJYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpIDw9CiAJCQljdXItPmJjX29wcy0+Z2V0X21heHJlY3MoY3VyLCBsZXZlbCkgJiYKIAkJYmxvY2stPmJiX3UubC5iYl9sZWZ0c2liICYmCi0JCShiZTY0X3RvX2NwdShibG9jay0+YmJfdS5sLmJiX2xlZnRzaWIpID09IE5VTExERlNCTk8gfHwKKwkJKGJsb2NrLT5iYl91LmwuYmJfbGVmdHNpYiA9PSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKSB8fAogCQkgWEZTX0ZTQl9TQU5JVFlfQ0hFQ0sobXAsCiAJCSAJYmU2NF90b19jcHUoYmxvY2stPmJiX3UubC5iYl9sZWZ0c2liKSkpICYmCiAJCWJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIgJiYKLQkJKGJlNjRfdG9fY3B1KGJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIpID09IE5VTExERlNCTk8gfHwKKwkJKGJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIgPT0gY3B1X3RvX2JlNjQoTlVMTERGU0JOTykgfHwKIAkJIFhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLAogCQkgCWJlNjRfdG9fY3B1KGJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIpKSk7CiAJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFsYmxvY2tfb2ssIG1wLApAQCAtMTA1LDEwICsxMDQsMTAgQEAKIAkJYmUxNl90b19jcHUoYmxvY2stPmJiX2xldmVsKSA9PSBsZXZlbCAmJgogCQliZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgPD0KIAkJCWN1ci0+YmNfb3BzLT5nZXRfbWF4cmVjcyhjdXIsIGxldmVsKSAmJgotCQkoYmUzMl90b19jcHUoYmxvY2stPmJiX3Uucy5iYl9sZWZ0c2liKSA9PSBOVUxMQUdCTE9DSyB8fAorCQkoYmxvY2stPmJiX3Uucy5iYl9sZWZ0c2liID09IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKSB8fAogCQkgYmUzMl90b19jcHUoYmxvY2stPmJiX3Uucy5iYl9sZWZ0c2liKSA8IGFnZmxlbikgJiYKIAkJYmxvY2stPmJiX3Uucy5iYl9sZWZ0c2liICYmCi0JCShiZTMyX3RvX2NwdShibG9jay0+YmJfdS5zLmJiX3JpZ2h0c2liKSA9PSBOVUxMQUdCTE9DSyB8fAorCQkoYmxvY2stPmJiX3Uucy5iYl9yaWdodHNpYiA9PSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSykgfHwKIAkJIGJlMzJfdG9fY3B1KGJsb2NrLT5iYl91LnMuYmJfcmlnaHRzaWIpIDwgYWdmbGVuKSAmJgogCQlibG9jay0+YmJfdS5zLmJiX3JpZ2h0c2liOwogCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighc2Jsb2NrX29rLCBjdXItPmJjX21wLApAQCAtNTExLDkgKzUxMCw5IEBACiAJYmxvY2sgPSB4ZnNfYnRyZWVfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7CiAJeGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCk7CiAJaWYgKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfTE9OR19QVFJTKQotCQlyZXR1cm4gYmU2NF90b19jcHUoYmxvY2stPmJiX3UubC5iYl9yaWdodHNpYikgPT0gTlVMTERGU0JOTzsKKwkJcmV0dXJuIGJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIgPT0gY3B1X3RvX2JlNjQoTlVMTERGU0JOTyk7CiAJZWxzZQotCQlyZXR1cm4gYmUzMl90b19jcHUoYmxvY2stPmJiX3Uucy5iYl9yaWdodHNpYikgPT0gTlVMTEFHQkxPQ0s7CisJCXJldHVybiBibG9jay0+YmJfdS5zLmJiX3JpZ2h0c2liID09IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKIH0KIAogLyoKQEAgLTc3NywxNCArNzc2LDE0IEBACiAKIAliID0gWEZTX0JVRl9UT19CTE9DSyhicCk7CiAJaWYgKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfTE9OR19QVFJTKSB7Ci0JCWlmIChiZTY0X3RvX2NwdShiLT5iYl91LmwuYmJfbGVmdHNpYikgPT0gTlVMTERGU0JOTykKKwkJaWYgKGItPmJiX3UubC5iYl9sZWZ0c2liID09IGNwdV90b19iZTY0KE5VTExERlNCTk8pKQogCQkJY3VyLT5iY19yYVtsZXZdIHw9IFhGU19CVENVUl9MRUZUUkE7Ci0JCWlmIChiZTY0X3RvX2NwdShiLT5iYl91LmwuYmJfcmlnaHRzaWIpID09IE5VTExERlNCTk8pCisJCWlmIChiLT5iYl91LmwuYmJfcmlnaHRzaWIgPT0gY3B1X3RvX2JlNjQoTlVMTERGU0JOTykpCiAJCQljdXItPmJjX3JhW2xldl0gfD0gWEZTX0JUQ1VSX1JJR0hUUkE7CiAJfSBlbHNlIHsKLQkJaWYgKGJlMzJfdG9fY3B1KGItPmJiX3Uucy5iYl9sZWZ0c2liKSA9PSBOVUxMQUdCTE9DSykKKwkJaWYgKGItPmJiX3Uucy5iYl9sZWZ0c2liID09IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKSkKIAkJCWN1ci0+YmNfcmFbbGV2XSB8PSBYRlNfQlRDVVJfTEVGVFJBOwotCQlpZiAoYmUzMl90b19jcHUoYi0+YmJfdS5zLmJiX3JpZ2h0c2liKSA9PSBOVUxMQUdCTE9DSykKKwkJaWYgKGItPmJiX3Uucy5iYl9yaWdodHNpYiA9PSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSykpCiAJCQljdXItPmJjX3JhW2xldl0gfD0gWEZTX0JUQ1VSX1JJR0hUUkE7CiAJfQogfQpAQCAtNzk1LDkgKzc5NCw5IEBACiAJdW5pb24geGZzX2J0cmVlX3B0cgkqcHRyKQogewogCWlmIChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX0xPTkdfUFRSUykKLQkJcmV0dXJuIGJlNjRfdG9fY3B1KHB0ci0+bCkgPT0gTlVMTERGU0JOTzsKKwkJcmV0dXJuIHB0ci0+bCA9PSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKTsKIAllbHNlCi0JCXJldHVybiBiZTMyX3RvX2NwdShwdHItPnMpID09IE5VTExBR0JMT0NLOworCQlyZXR1cm4gcHRyLT5zID09IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKIH0KIAogU1RBVElDIHZvaWQKQEAgLTkyMywxMiArOTIyLDEyIEBACiAJdW5pb24geGZzX2J0cmVlX3B0cgkqcHRyKQogewogCWlmIChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX0xPTkdfUFRSUykgewotCQlBU1NFUlQoYmU2NF90b19jcHUocHRyLT5sKSAhPSBOVUxMREZTQk5PKTsKKwkJQVNTRVJUKHB0ci0+bCAhPSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKSk7CiAKIAkJcmV0dXJuIFhGU19GU0JfVE9fREFERFIoY3VyLT5iY19tcCwgYmU2NF90b19jcHUocHRyLT5sKSk7CiAJfSBlbHNlIHsKIAkJQVNTRVJUKGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8gIT0gTlVMTEFHTlVNQkVSKTsKLQkJQVNTRVJUKGJlMzJfdG9fY3B1KHB0ci0+cykgIT0gTlVMTEFHQkxPQ0spOworCQlBU1NFUlQocHRyLT5zICE9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKSk7CiAKIAkJcmV0dXJuIFhGU19BR0JfVE9fREFERFIoY3VyLT5iY19tcCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywKIAkJCQkJYmUzMl90b19jcHUocHRyLT5zKSk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J0cmVlLmggYi9mcy94ZnMveGZzX2J0cmVlLmgKaW5kZXggODJmYWZjNi4uOGQwNWE2YSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idHJlZS5oCisrKyBiL2ZzL3hmcy94ZnNfYnRyZWUuaApAQCAtMTk5LDI1ICsxOTksNiBAQAogCQkJCXVuaW9uIHhmc19idHJlZV9yZWMgKnIxLAogCQkJCXVuaW9uIHhmc19idHJlZV9yZWMgKnIyKTsKICNlbmRpZgotCi0JLyogYnRyZWUgdHJhY2luZyAqLwotI2lmZGVmIFhGU19CVFJFRV9UUkFDRQotCXZvaWQJCSgqdHJhY2VfZW50ZXIpKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosIGNvbnN0IGNoYXIgKiwKLQkJCQkgICAgICAgY2hhciAqLCBpbnQsIGludCwgX19wc3Vuc2lnbmVkX3QsCi0JCQkJICAgICAgIF9fcHN1bnNpZ25lZF90LCBfX3BzdW5zaWduZWRfdCwKLQkJCQkgICAgICAgX19wc3Vuc2lnbmVkX3QsIF9fcHN1bnNpZ25lZF90LAotCQkJCSAgICAgICBfX3BzdW5zaWduZWRfdCwgX19wc3Vuc2lnbmVkX3QsCi0JCQkJICAgICAgIF9fcHN1bnNpZ25lZF90LCBfX3BzdW5zaWduZWRfdCwKLQkJCQkgICAgICAgX19wc3Vuc2lnbmVkX3QsIF9fcHN1bnNpZ25lZF90KTsKLQl2b2lkCQkoKnRyYWNlX2N1cnNvcikoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgX191aW50MzJfdCAqLAotCQkJCQlfX3VpbnQ2NF90ICosIF9fdWludDY0X3QgKik7Ci0Jdm9pZAkJKCp0cmFjZV9rZXkpKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCi0JCQkJICAgICB1bmlvbiB4ZnNfYnRyZWVfa2V5ICosIF9fdWludDY0X3QgKiwKLQkJCQkgICAgIF9fdWludDY0X3QgKik7Ci0Jdm9pZAkJKCp0cmFjZV9yZWNvcmQpKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCi0JCQkJCXVuaW9uIHhmc19idHJlZV9yZWMgKiwgX191aW50NjRfdCAqLAotCQkJCQlfX3VpbnQ2NF90ICosIF9fdWludDY0X3QgKik7Ci0jZW5kaWYKIH07CiAKIC8qCkBAIC00NTIsNCArNDMzLDIzIEBACiAJKFhGU19GU0JfVE9fQUdOTyhtcCwgZnNiKSA8IG1wLT5tX3NiLnNiX2FnY291bnQgJiYgXAogCQlYRlNfRlNCX1RPX0FHQk5PKG1wLCBmc2IpIDwgbXAtPm1fc2Iuc2JfYWdibG9ja3MpCiAKKy8qCisgKiBUcmFjZSBob29rcy4gIEN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQgYXMgdGhleSBuZWVkIHRvIGJlIHBvcnRlZAorICogb3ZlciB0byB0aGUgZ2VuZXJpYyB0cmFjaW5nIGZ1bmN0aW9uYWxpdHksIHdoaWNoIGlzIHNvbWUgZWZmb3J0LgorICoKKyAqIGksaiA9IGludGVnZXIgKDMyIGJpdCkKKyAqIGIgPSBidHJlZSBibG9jayBidWZmZXIgKHhmc19idWZfdCkKKyAqIHAgPSBidHJlZSBwdHIKKyAqIHIgPSBidHJlZSByZWNvcmQKKyAqIGsgPSBidHJlZSBrZXkKKyAqLworI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHQkkoYywgYiwgaSkKKyNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0FSR0JJSShjLCBiLCBpLCBqKQorI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHSShjLCBpKQorI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHSVBLKGMsIGksIHAsIHMpCisjZGVmaW5lCVhGU19CVFJFRV9UUkFDRV9BUkdJUFIoYywgaSwgcCwgcikKKyNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0FSR0lLKGMsIGksIGspCisjZGVmaW5lIFhGU19CVFJFRV9UUkFDRV9BUkdSKGMsIHIpCisjZGVmaW5lCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoYywgdCkKKwogI2VuZGlmCS8qIF9fWEZTX0JUUkVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idHJlZV90cmFjZS5jIGIvZnMveGZzL3hmc19idHJlZV90cmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGZmOTQyLi4wMDAwMDAwCi0tLSBhL2ZzL3hmcy94ZnNfYnRyZWVfdHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLSNpbmNsdWRlICJ4ZnMuaCIKLSNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgotI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgotI2luY2x1ZGUgInhmc19pbm9kZS5oIgotI2luY2x1ZGUgInhmc19idHJlZS5oIgotI2luY2x1ZGUgInhmc19idHJlZV90cmFjZS5oIgotCi1TVEFUSUMgdm9pZAoteGZzX2J0cmVlX3RyYWNlX3B0cigKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAotCXVuaW9uIHhmc19idHJlZV9wdHIJcHRyLAotCV9fcHN1bnNpZ25lZF90CQkqaGlnaCwKLQlfX3BzdW5zaWduZWRfdAkJKmxvdykKLXsKLQlpZiAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9MT05HX1BUUlMpIHsKLQkJX191NjQgdmFsID0gYmU2NF90b19jcHUocHRyLmwpOwotCQkqaGlnaCA9IHZhbCA+PiAzMjsKLQkJKmxvdyA9IChpbnQpdmFsOwotCX0gZWxzZSB7Ci0JCSpoaWdoID0gMDsKLQkJKmxvdyA9IGJlMzJfdG9fY3B1KHB0ci5zKTsKLQl9Ci19Ci0KLS8qCi0gKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGFyZ3VtZW50cywgZm9yIGEgYnVmZmVyICYgMSBpbnRlZ2VyIGFyZy4KLSAqLwotdm9pZAoteGZzX2J0cmVlX3RyYWNlX2FyZ2JpKAotCWNvbnN0IGNoYXIJCSpmdW5jLAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCi0Jc3RydWN0IHhmc19idWYJCSpiLAotCWludAkJCWksCi0JaW50CQkJbGluZSkKLXsKLQljdXItPmJjX29wcy0+dHJhY2VfZW50ZXIoY3VyLCBmdW5jLCBYQlRfQVJHUywgWEZTX0JUUkVFX0tUUkFDRV9BUkdCSSwKLQkJCQkgbGluZSwgKF9fcHN1bnNpZ25lZF90KWIsIGksIDAsIDAsIDAsIDAsIDAsCi0JCQkJIDAsIDAsIDAsIDApOwotfQotCi0vKgotICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBhIGJ1ZmZlciAmIDIgaW50ZWdlciBhcmdzLgotICovCi12b2lkCi14ZnNfYnRyZWVfdHJhY2VfYXJnYmlpKAotCWNvbnN0IGNoYXIJCSpmdW5jLAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCi0Jc3RydWN0IHhmc19idWYJCSpiLAotCWludAkJCWkwLAotCWludAkJCWkxLAotCWludAkJCWxpbmUpCi17Ci0JY3VyLT5iY19vcHMtPnRyYWNlX2VudGVyKGN1ciwgZnVuYywgWEJUX0FSR1MsIFhGU19CVFJFRV9LVFJBQ0VfQVJHQklJLAotCQkJCSBsaW5lLCAoX19wc3Vuc2lnbmVkX3QpYiwgaTAsIGkxLCAwLCAwLCAwLCAwLAotCQkJCSAwLCAwLCAwLCAwKTsKLX0KLQotLyoKLSAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgMyBibG9jay1sZW5ndGggYXJncwotICogYW5kIGFuIGludGVnZXIgYXJnLgotICovCi12b2lkCi14ZnNfYnRyZWVfdHJhY2VfYXJnZmZmaSgKLQljb25zdCBjaGFyCQkqZnVuYywKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAotCXhmc19kZmlsb2ZmX3QJCW8sCi0JeGZzX2Rmc2Jub190CQliLAotCXhmc19kZmlsYmxrc190CQlpLAotCWludAkJCWosCi0JaW50CQkJbGluZSkKLXsKLQljdXItPmJjX29wcy0+dHJhY2VfZW50ZXIoY3VyLCBmdW5jLCBYQlRfQVJHUywgWEZTX0JUUkVFX0tUUkFDRV9BUkdGRkZJLAotCQkJCSBsaW5lLAotCQkJCSBvID4+IDMyLCAoaW50KW8sCi0JCQkJIGIgPj4gMzIsIChpbnQpYiwKLQkJCQkgaSA+PiAzMiwgKGludClpLAotCQkJCSAoaW50KWosIDAsIDAsIDAsIDApOwotfQotCi0vKgotICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBvbmUgaW50ZWdlciBhcmcuCi0gKi8KLXZvaWQKLXhmc19idHJlZV90cmFjZV9hcmdpKAotCWNvbnN0IGNoYXIJCSpmdW5jLAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCi0JaW50CQkJaSwKLQlpbnQJCQlsaW5lKQotewotCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIFhCVF9BUkdTLCBYRlNfQlRSRUVfS1RSQUNFX0FSR0ksCi0JCQkJIGxpbmUsIGksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApOwotfQotCi0vKgotICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBpbnQsIGZzYmxvY2ssIGtleS4KLSAqLwotdm9pZAoteGZzX2J0cmVlX3RyYWNlX2FyZ2lwaygKLQljb25zdCBjaGFyCQkqZnVuYywKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAotCWludAkJCWksCi0JdW5pb24geGZzX2J0cmVlX3B0cglwdHIsCi0JdW5pb24geGZzX2J0cmVlX2tleQkqa2V5LAotCWludAkJCWxpbmUpCi17Ci0JX19wc3Vuc2lnbmVkX3QJCWhpZ2gsIGxvdzsKLQlfX3VpbnQ2NF90CQlsMCwgbDE7Ci0KLQl4ZnNfYnRyZWVfdHJhY2VfcHRyKGN1ciwgcHRyLCAmaGlnaCwgJmxvdyk7Ci0JY3VyLT5iY19vcHMtPnRyYWNlX2tleShjdXIsIGtleSwgJmwwLCAmbDEpOwotCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIFhCVF9BUkdTLCBYRlNfQlRSRUVfS1RSQUNFX0FSR0lQSywKLQkJCQkgbGluZSwgaSwgaGlnaCwgbG93LAotCQkJCSBsMCA+PiAzMiwgKGludClsMCwKLQkJCQkgbDEgPj4gMzIsIChpbnQpbDEsCi0JCQkJIDAsIDAsIDAsIDApOwotfQotCi0vKgotICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBpbnQsIGZzYmxvY2ssIHJlYy4KLSAqLwotdm9pZAoteGZzX2J0cmVlX3RyYWNlX2FyZ2lwcigKLQljb25zdCBjaGFyCQkqZnVuYywKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAotCWludAkJCWksCi0JdW5pb24geGZzX2J0cmVlX3B0cglwdHIsCi0JdW5pb24geGZzX2J0cmVlX3JlYwkqcmVjLAotCWludAkJCWxpbmUpCi17Ci0JX19wc3Vuc2lnbmVkX3QJCWhpZ2gsIGxvdzsKLQlfX3VpbnQ2NF90CQlsMCwgbDEsIGwyOwotCi0JeGZzX2J0cmVlX3RyYWNlX3B0cihjdXIsIHB0ciwgJmhpZ2gsICZsb3cpOwotCWN1ci0+YmNfb3BzLT50cmFjZV9yZWNvcmQoY3VyLCByZWMsICZsMCwgJmwxLCAmbDIpOwotCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIFhCVF9BUkdTLCBYRlNfQlRSRUVfS1RSQUNFX0FSR0lQUiwKLQkJCSAgICAgIGxpbmUsIGksCi0JCQkgICAgICBoaWdoLCBsb3csCi0JCQkgICAgICBsMCA+PiAzMiwgKGludClsMCwKLQkJCSAgICAgIGwxID4+IDMyLCAoaW50KWwxLAotCQkJICAgICAgbDIgPj4gMzIsIChpbnQpbDIsCi0JCQkgICAgICAwLCAwKTsKLX0KLQotLyoKLSAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgaW50LCBrZXkuCi0gKi8KLXZvaWQKLXhmc19idHJlZV90cmFjZV9hcmdpaygKLQljb25zdCBjaGFyCQkqZnVuYywKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAotCWludAkJCWksCi0JdW5pb24geGZzX2J0cmVlX2tleQkqa2V5LAotCWludAkJCWxpbmUpCi17Ci0JX191aW50NjRfdAkJbDAsIGwxOwotCi0JY3VyLT5iY19vcHMtPnRyYWNlX2tleShjdXIsIGtleSwgJmwwLCAmbDEpOwotCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIFhCVF9BUkdTLCBYRlNfQlRSRUVfS1RSQUNFX0FSR0lLLAotCQkJCSBsaW5lLCBpLAotCQkJCSBsMCA+PiAzMiwgKGludClsMCwKLQkJCQkgbDEgPj4gMzIsIChpbnQpbDEsCi0JCQkJIDAsIDAsIDAsIDAsIDAsIDApOwotfQotCi0vKgotICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciByZWNvcmQuCi0gKi8KLXZvaWQKLXhmc19idHJlZV90cmFjZV9hcmdyKAotCWNvbnN0IGNoYXIJCSpmdW5jLAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCi0JdW5pb24geGZzX2J0cmVlX3JlYwkqcmVjLAotCWludAkJCWxpbmUpCi17Ci0JX191aW50NjRfdAkJbDAsIGwxLCBsMjsKLQotCWN1ci0+YmNfb3BzLT50cmFjZV9yZWNvcmQoY3VyLCByZWMsICZsMCwgJmwxLCAmbDIpOwotCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIFhCVF9BUkdTLCBYRlNfQlRSRUVfS1RSQUNFX0FSR1IsCi0JCQkgICAgICBsaW5lLAotCQkJICAgICAgbDAgPj4gMzIsIChpbnQpbDAsCi0JCQkgICAgICBsMSA+PiAzMiwgKGludClsMSwKLQkJCSAgICAgIGwyID4+IDMyLCAoaW50KWwyLAotCQkJICAgICAgMCwgMCwgMCwgMCwgMCk7Ci19Ci0KLS8qCi0gKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIHRoZSBjdXJzb3Ivb3BlcmF0aW9uLgotICovCi12b2lkCi14ZnNfYnRyZWVfdHJhY2VfY3Vyc29yKAotCWNvbnN0IGNoYXIJCSpmdW5jLAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCi0JaW50CQkJdHlwZSwKLQlpbnQJCQlsaW5lKQotewotCV9fdWludDMyX3QJCXMwOwotCV9fdWludDY0X3QJCWwwLCBsMTsKLQljaGFyCQkJKnM7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFhCVF9BUkdTOgotCQlzID0gImFyZ3MiOwotCQlicmVhazsKLQljYXNlIFhCVF9FTlRSWToKLQkJcyA9ICJlbnRyeSI7Ci0JCWJyZWFrOwotCWNhc2UgWEJUX0VSUk9SOgotCQlzID0gImVycm9yIjsKLQkJYnJlYWs7Ci0JY2FzZSBYQlRfRVhJVDoKLQkJcyA9ICJleGl0IjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcyA9ICJ1bmtub3duIjsKLQkJYnJlYWs7Ci0JfQotCi0JY3VyLT5iY19vcHMtPnRyYWNlX2N1cnNvcihjdXIsICZzMCwgJmwwLCAmbDEpOwotCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIHMsIFhGU19CVFJFRV9LVFJBQ0VfQ1VSLCBsaW5lLAotCQkJCSBzMCwKLQkJCQkgbDAgPj4gMzIsIChpbnQpbDAsCi0JCQkJIGwxID4+IDMyLCAoaW50KWwxLAotCQkJCSAoX19wc3Vuc2lnbmVkX3QpY3VyLT5iY19idWZzWzBdLAotCQkJCSAoX19wc3Vuc2lnbmVkX3QpY3VyLT5iY19idWZzWzFdLAotCQkJCSAoX19wc3Vuc2lnbmVkX3QpY3VyLT5iY19idWZzWzJdLAotCQkJCSAoX19wc3Vuc2lnbmVkX3QpY3VyLT5iY19idWZzWzNdLAotCQkJCSAoY3VyLT5iY19wdHJzWzBdIDw8IDE2KSB8IGN1ci0+YmNfcHRyc1sxXSwKLQkJCQkgKGN1ci0+YmNfcHRyc1syXSA8PCAxNikgfCBjdXItPmJjX3B0cnNbM10pOwotfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idHJlZV90cmFjZS5oIGIvZnMveGZzL3hmc19idHJlZV90cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDhhMzA5Li4wMDAwMDAwCi0tLSBhL2ZzL3hmcy94ZnNfYnRyZWVfdHJhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotI2lmbmRlZiBfX1hGU19CVFJFRV9UUkFDRV9IX18KLSNkZWZpbmUJX19YRlNfQlRSRUVfVFJBQ0VfSF9fCi0KLXN0cnVjdCB4ZnNfYnRyZWVfY3VyOwotc3RydWN0IHhmc19idWY7Ci0KLQotLyoKLSAqIFRyYWNlIGhvb2tzLgotICogaSxqID0gaW50ZWdlciAoMzIgYml0KQotICogYiA9IGJ0cmVlIGJsb2NrIGJ1ZmZlciAoeGZzX2J1Zl90KQotICogcCA9IGJ0cmVlIHB0cgotICogciA9IGJ0cmVlIHJlY29yZAotICogayA9IGJ0cmVlIGtleQotICovCi0KLSNpZmRlZiBYRlNfQlRSRUVfVFJBQ0UKLQotLyoKLSAqIFRyYWNlIGJ1ZmZlciBlbnRyeSB0eXBlcy4KLSAqLwotI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0JJICAgMQotI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0JJSSAgMgotI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0ZGRkkgMwotI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0kgICAgNAotI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0lQSyAgNQotI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0lQUiAgNgotI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0lLICAgNwotI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR1IJIDgKLSNkZWZpbmUgWEZTX0JUUkVFX0tUUkFDRV9DVVIgICAgIDkKLQotLyoKLSAqIFN1Yi10eXBlcyBmb3IgY3Vyc29yIHRyYWNlcy4KLSAqLwotI2RlZmluZSBYQlRfQVJHUwkwCi0jZGVmaW5lIFhCVF9FTlRSWQkxCi0jZGVmaW5lIFhCVF9FUlJPUgkyCi0jZGVmaW5lIFhCVF9FWElUCTMKLQotdm9pZCB4ZnNfYnRyZWVfdHJhY2VfYXJnYmkoY29uc3QgY2hhciAqLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAotCQlzdHJ1Y3QgeGZzX2J1ZiAqLCBpbnQsIGludCk7Ci12b2lkIHhmc19idHJlZV90cmFjZV9hcmdiaWkoY29uc3QgY2hhciAqLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAotCQlzdHJ1Y3QgeGZzX2J1ZiAqLCBpbnQsIGludCwgaW50KTsKLXZvaWQgeGZzX2J0cmVlX3RyYWNlX2FyZ2koY29uc3QgY2hhciAqLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQsIGludCk7Ci12b2lkIHhmc19idHJlZV90cmFjZV9hcmdpcGsoY29uc3QgY2hhciAqLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQsCi0JCXVuaW9uIHhmc19idHJlZV9wdHIsIHVuaW9uIHhmc19idHJlZV9rZXkgKiwgaW50KTsKLXZvaWQgeGZzX2J0cmVlX3RyYWNlX2FyZ2lwcihjb25zdCBjaGFyICosIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosIGludCwKLQkJdW5pb24geGZzX2J0cmVlX3B0ciwgdW5pb24geGZzX2J0cmVlX3JlYyAqLCBpbnQpOwotdm9pZCB4ZnNfYnRyZWVfdHJhY2VfYXJnaWsoY29uc3QgY2hhciAqLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQsCi0JCXVuaW9uIHhmc19idHJlZV9rZXkgKiwgaW50KTsKLXZvaWQgeGZzX2J0cmVlX3RyYWNlX2FyZ3IoY29uc3QgY2hhciAqLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAotCQl1bmlvbiB4ZnNfYnRyZWVfcmVjICosIGludCk7Ci12b2lkIHhmc19idHJlZV90cmFjZV9jdXJzb3IoY29uc3QgY2hhciAqLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQsIGludCk7Ci0KLSNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0FSR0JJKGMsIGIsIGkpCVwKLQl4ZnNfYnRyZWVfdHJhY2VfYXJnYmkoX19mdW5jX18sIGMsIGIsIGksIF9fTElORV9fKQotI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHQklJKGMsIGIsIGksIGopCVwKLQl4ZnNfYnRyZWVfdHJhY2VfYXJnYmlpKF9fZnVuY19fLCBjLCBiLCBpLCBqLCBfX0xJTkVfXykKLSNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0FSR0koYywgaSkJXAotCXhmc19idHJlZV90cmFjZV9hcmdpKF9fZnVuY19fLCBjLCBpLCBfX0xJTkVfXykKLSNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0FSR0lQSyhjLCBpLCBwLCBrKQlcCi0JeGZzX2J0cmVlX3RyYWNlX2FyZ2lwayhfX2Z1bmNfXywgYywgaSwgcCwgaywgX19MSU5FX18pCi0jZGVmaW5lCVhGU19CVFJFRV9UUkFDRV9BUkdJUFIoYywgaSwgcCwgcikJXAotCXhmc19idHJlZV90cmFjZV9hcmdpcHIoX19mdW5jX18sIGMsIGksIHAsIHIsIF9fTElORV9fKQotI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHSUsoYywgaSwgaykJXAotCXhmc19idHJlZV90cmFjZV9hcmdpayhfX2Z1bmNfXywgYywgaSwgaywgX19MSU5FX18pCi0jZGVmaW5lIFhGU19CVFJFRV9UUkFDRV9BUkdSKGMsIHIpCVwKLQl4ZnNfYnRyZWVfdHJhY2VfYXJncihfX2Z1bmNfXywgYywgciwgX19MSU5FX18pCi0jZGVmaW5lCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoYywgdCkJXAotCXhmc19idHJlZV90cmFjZV9jdXJzb3IoX19mdW5jX18sIGMsIHQsIF9fTElORV9fKQotI2Vsc2UKLSNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0FSR0JJKGMsIGIsIGkpCi0jZGVmaW5lCVhGU19CVFJFRV9UUkFDRV9BUkdCSUkoYywgYiwgaSwgaikKLSNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0FSR0koYywgaSkKLSNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0FSR0lQSyhjLCBpLCBwLCBzKQotI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHSVBSKGMsIGksIHAsIHIpCi0jZGVmaW5lCVhGU19CVFJFRV9UUkFDRV9BUkdJSyhjLCBpLCBrKQotI2RlZmluZSBYRlNfQlRSRUVfVFJBQ0VfQVJHUihjLCByKQotI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGMsIHQpCi0jZW5kaWYJLyogWEZTX0JUUkVFX1RSQUNFICovCi0KLSNlbmRpZiAvKiBfX1hGU19CVFJFRV9UUkFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYwppbmRleCA3YjdlMDA1Li44ODQ5MjkxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCkBAIC05MCwxMyArOTAsMTEgQEAKIAl1aW50CQlmaXJzdCwKIAl1aW50CQlsYXN0KQogewotCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwID0gYnAtPmJfZnNwcml2OwogCXVpbnQJCQluYnl0ZXM7CiAKLQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90Kik7Ci0JaWYgKChiaXAgPT0gTlVMTCkgfHwgKGJpcC0+YmxpX2l0ZW0ubGlfdHlwZSAhPSBYRlNfTElfQlVGKSkgeworCWlmIChiaXAgPT0gTlVMTCB8fCAoYmlwLT5ibGlfaXRlbS5saV90eXBlICE9IFhGU19MSV9CVUYpKQogCQlyZXR1cm47Ci0JfQogCiAJQVNTRVJUKGJpcC0+YmxpX2xvZ2dlZCAhPSBOVUxMKTsKIAluYnl0ZXMgPSBsYXN0IC0gZmlyc3QgKyAxOwpAQCAtNDA4LDcgKzQwNiw3IEBACiAJaW50CQlzdGFsZSA9IGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRTsKIAlpbnQJCWZyZWVkOwogCi0JQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKikgPT0gYmlwKTsKKwlBU1NFUlQoYnAtPmJfZnNwcml2ID09IGJpcCk7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKIAogCXRyYWNlX3hmc19idWZfaXRlbV91bnBpbihiaXApOwpAQCAtNDIwLDcgKzQxOCw3IEBACiAKIAlpZiAoZnJlZWQgJiYgc3RhbGUpIHsKIAkJQVNTRVJUKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSk7Ci0JCUFTU0VSVChYRlNfQlVGX1ZBTFVTRU1BKGJwKSA8PSAwKTsKKwkJQVNTRVJUKHhmc19idWZfaXNsb2NrZWQoYnApKTsKIAkJQVNTRVJUKCEoWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKSk7CiAJCUFTU0VSVChYRlNfQlVGX0lTU1RBTEUoYnApKTsKIAkJQVNTRVJUKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxGX0NBTkNFTCk7CkBAIC00NDMsNyArNDQxLDcgQEAKIAkJCSAqIFNpbmNlIHRoZSB0cmFuc2FjdGlvbiBubyBsb25nZXIgcmVmZXJzIHRvIHRoZSBidWZmZXIsCiAJCQkgKiB0aGUgYnVmZmVyIHNob3VsZCBubyBsb25nZXIgcmVmZXIgdG8gdGhlIHRyYW5zYWN0aW9uLgogCQkJICovCi0JCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCBOVUxMKTsKKwkJCWJwLT5iX3RyYW5zcCA9IE5VTEw7CiAJCX0KIAogCQkvKgpAQCAtNDU0LDEzICs0NTIsMTMgQEAKIAkJICovCiAJCWlmIChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEVfSU5PREUpIHsKIAkJCXhmc19idWZfZG9fY2FsbGJhY2tzKGJwKTsKLQkJCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgTlVMTCk7Ci0JCQlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CisJCQlicC0+Yl9mc3ByaXYgPSBOVUxMOworCQkJYnAtPmJfaW9kb25lID0gTlVMTDsKIAkJfSBlbHNlIHsKIAkJCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CiAJCQl4ZnNfdHJhbnNfYWlsX2RlbGV0ZShhaWxwLCAoeGZzX2xvZ19pdGVtX3QgKiliaXApOwogCQkJeGZzX2J1Zl9pdGVtX3JlbHNlKGJwKTsKLQkJCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSA9PSBOVUxMKTsKKwkJCUFTU0VSVChicC0+Yl9mc3ByaXYgPT0gTlVMTCk7CiAJCX0KIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJfQpAQCAtNDgzLDcgKzQ4MSw3IEBACiAKIAlpZiAoWEZTX0JVRl9JU1BJTk5FRChicCkpCiAJCXJldHVybiBYRlNfSVRFTV9QSU5ORUQ7Ci0JaWYgKCFYRlNfQlVGX0NQU0VNQShicCkpCisJaWYgKCF4ZnNfYnVmX3RyeWxvY2soYnApKQogCQlyZXR1cm4gWEZTX0lURU1fTE9DS0VEOwogCiAJLyogdGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyLiAgKi8KQEAgLTUyNSw3ICs1MjMsNyBAQAogCXVpbnQJCQlob2xkOwogCiAJLyogQ2xlYXIgdGhlIGJ1ZmZlcidzIGFzc29jaWF0aW9uIHdpdGggdGhpcyB0cmFuc2FjdGlvbi4gKi8KLQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCBOVUxMKTsKKwlicC0+Yl90cmFuc3AgPSBOVUxMOwogCiAJLyoKIAkgKiBJZiB0aGlzIGlzIGEgdHJhbnNhY3Rpb24gYWJvcnQsIGRvbid0IHJldHVybiBlYXJseS4gIEluc3RlYWQsIGFsbG93CkBAIC02ODQsNyArNjgyLDcgQEAKIAl4ZnNfYnVmX3QJKmJwLAogCXhmc19tb3VudF90CSptcCkKIHsKLQl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKKwl4ZnNfbG9nX2l0ZW1fdAkJKmxpcCA9IGJwLT5iX2ZzcHJpdjsKIAl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKIAlpbnQJCQljaHVua3M7CiAJaW50CQkJbWFwX3NpemU7CkBAIC02OTYsMTIgKzY5NCw4IEBACiAJICogbm90aGluZyB0byBkbyBoZXJlIHNvIHJldHVybi4KIAkgKi8KIAlBU1NFUlQoYnAtPmJfdGFyZ2V0LT5idF9tb3VudCA9PSBtcCk7Ci0JaWYgKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpIHsKLQkJbGlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19sb2dfaXRlbV90ICopOwotCQlpZiAobGlwLT5saV90eXBlID09IFhGU19MSV9CVUYpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KKwlpZiAobGlwICE9IE5VTEwgJiYgbGlwLT5saV90eXBlID09IFhGU19MSV9CVUYpCisJCXJldHVybjsKIAogCS8qCiAJICogY2h1bmtzIGlzIHRoZSBudW1iZXIgb2YgWEZTX0JMRl9DSFVOSyBzaXplIHBpZWNlcwpAQCAtNzQwLDExICs3MzQsOSBAQAogCSAqIFB1dCB0aGUgYnVmIGl0ZW0gaW50byB0aGUgbGlzdCBvZiBpdGVtcyBhdHRhY2hlZCB0byB0aGUKIAkgKiBidWZmZXIgYXQgdGhlIGZyb250LgogCSAqLwotCWlmIChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKSB7Ci0JCWJpcC0+YmxpX2l0ZW0ubGlfYmlvX2xpc3QgPQotCQkJCVhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKLQl9Ci0JWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBiaXApOworCWlmIChicC0+Yl9mc3ByaXYpCisJCWJpcC0+YmxpX2l0ZW0ubGlfYmlvX2xpc3QgPSBicC0+Yl9mc3ByaXY7CisJYnAtPmJfZnNwcml2ID0gYmlwOwogfQogCiAKQEAgLTg3NiwxMiArODY4LDExIEBACiAKIAl0cmFjZV94ZnNfYnVmX2l0ZW1fcmVsc2UoYnAsIF9SRVRfSVBfKTsKIAotCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QqKTsKLQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIGJpcC0+YmxpX2l0ZW0ubGlfYmlvX2xpc3QpOwotCWlmICgoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgPT0gTlVMTCkgJiYKLQkgICAgKFhGU19CVUZfSU9ET05FX0ZVTkMoYnApICE9IE5VTEwpKSB7Ci0JCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKLQl9CisJYmlwID0gYnAtPmJfZnNwcml2OworCWJwLT5iX2ZzcHJpdiA9IGJpcC0+YmxpX2l0ZW0ubGlfYmlvX2xpc3Q7CisJaWYgKGJwLT5iX2ZzcHJpdiA9PSBOVUxMKQorCQlicC0+Yl9pb2RvbmUgPSBOVUxMOworCiAJeGZzX2J1Zl9yZWxlKGJwKTsKIAl4ZnNfYnVmX2l0ZW1fZnJlZShiaXApOwogfQpAQCAtOTA1LDIwICs4OTYsMjAgQEAKIAl4ZnNfbG9nX2l0ZW1fdAkqaGVhZF9saXA7CiAKIAlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKLQlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisJQVNTRVJUKHhmc19idWZfaXNsb2NrZWQoYnApKTsKIAogCWxpcC0+bGlfY2IgPSBjYjsKLQlpZiAoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCkgewotCQloZWFkX2xpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKKwloZWFkX2xpcCA9IGJwLT5iX2ZzcHJpdjsKKwlpZiAoaGVhZF9saXApIHsKIAkJbGlwLT5saV9iaW9fbGlzdCA9IGhlYWRfbGlwLT5saV9iaW9fbGlzdDsKIAkJaGVhZF9saXAtPmxpX2Jpb19saXN0ID0gbGlwOwogCX0gZWxzZSB7Ci0JCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgbGlwKTsKKwkJYnAtPmJfZnNwcml2ID0gbGlwOwogCX0KIAotCUFTU0VSVCgoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkgPT0geGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKSB8fAotCSAgICAgICAoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkgPT0gTlVMTCkpOwotCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MpOworCUFTU0VSVChicC0+Yl9pb2RvbmUgPT0gTlVMTCB8fAorCSAgICAgICBicC0+Yl9pb2RvbmUgPT0geGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKTsKKwlicC0+Yl9pb2RvbmUgPSB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3M7CiB9CiAKIC8qCkBAIC05MzksOCArOTMwLDggQEAKIHsKIAlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXA7CiAKLQl3aGlsZSAoKGxpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbG9nX2l0ZW1fdCAqKSkgIT0gTlVMTCkgewotCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIGxpcC0+bGlfYmlvX2xpc3QpOworCXdoaWxlICgobGlwID0gYnAtPmJfZnNwcml2KSAhPSBOVUxMKSB7CisJCWJwLT5iX2ZzcHJpdiA9IGxpcC0+bGlfYmlvX2xpc3Q7CiAJCUFTU0VSVChsaXAtPmxpX2NiICE9IE5VTEwpOwogCQkvKgogCQkgKiBDbGVhciB0aGUgbmV4dCBwb2ludGVyIHNvIHdlIGRvbid0IGhhdmUgYW55CkBAIC0xMDA3LDcgKzk5OCw3IEBACiAJCQlYRlNfQlVGX0RPTkUoYnApOwogCQkJWEZTX0JVRl9TRVRfU1RBUlQoYnApOwogCQl9Ci0JCUFTU0VSVChYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKSk7CisJCUFTU0VSVChicC0+Yl9pb2RvbmUgIT0gTlVMTCk7CiAJCXRyYWNlX3hmc19idWZfaXRlbV9pb2RvbmVfYXN5bmMoYnAsIF9SRVRfSVBfKTsKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCXJldHVybjsKQEAgLTEwMjYsOCArMTAxNyw4IEBACiAKIGRvX2NhbGxiYWNrczoKIAl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCk7Ci0JWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBOVUxMKTsKLQlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CisJYnAtPmJfZnNwcml2ID0gTlVMTDsKKwlicC0+Yl9pb2RvbmUgPSBOVUxMOwogCXhmc19idWZfaW9lbmQoYnAsIDApOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RhX2J0cmVlLmMgYi9mcy94ZnMveGZzX2RhX2J0cmVlLmMKaW5kZXggNjEwMmFjNi4uMjkyNTcyNiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kYV9idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfZGFfYnRyZWUuYwpAQCAtMjQsMTEgKzI0LDEyIEBACiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9mb3JtYXQuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9wcml2LmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCkBAIC0zNiwxMCArMzcsNiBAQAogI2luY2x1ZGUgInhmc19ibWFwLmgiCiAjaW5jbHVkZSAieGZzX2F0dHIuaCIKICNpbmNsdWRlICJ4ZnNfYXR0cl9sZWFmLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfZGF0YS5oIgotI2luY2x1ZGUgInhmc19kaXIyX2xlYWYuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9ibG9jay5oIgotI2luY2x1ZGUgInhmc19kaXIyX25vZGUuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKIApAQCAtODksNyArODYsNyBAQAogICovCiBTVEFUSUMgdWludAl4ZnNfZGFfbm9kZV9sYXN0aGFzaCh4ZnNfZGFidWZfdCAqYnAsIGludCAqY291bnQpOwogU1RBVElDIGludAl4ZnNfZGFfbm9kZV9vcmRlcih4ZnNfZGFidWZfdCAqbm9kZTFfYnAsIHhmc19kYWJ1Zl90ICpub2RlMl9icCk7Ci1TVEFUSUMgeGZzX2RhYnVmX3QgKnhmc19kYV9idWZfbWFrZShpbnQgbmJ1ZiwgeGZzX2J1Zl90ICoqYnBzLCBpbnN0X3QgKnJhKTsKK1NUQVRJQyB4ZnNfZGFidWZfdCAqeGZzX2RhX2J1Zl9tYWtlKGludCBuYnVmLCB4ZnNfYnVmX3QgKipicHMpOwogU1RBVElDIGludAl4ZnNfZGFfYmxrX3VubGluayh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCiAJCQkJICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmRyb3BfYmxrLAogCQkJCSAgeGZzX2RhX3N0YXRlX2Jsa190ICpzYXZlX2Jsayk7CkBAIC0zMjEsMTEgKzMxOCwxMSBAQAogCUFTU0VSVChicCAhPSBOVUxMKTsKIAlub2RlID0gYnAtPmRhdGE7CiAJb2xkcm9vdCA9IGJsazEtPmJwLT5kYXRhOwotCWlmIChiZTE2X3RvX2NwdShvbGRyb290LT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RBX05PREVfTUFHSUMpIHsKKwlpZiAob2xkcm9vdC0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RBX05PREVfTUFHSUMpKSB7CiAJCXNpemUgPSAoaW50KSgoY2hhciAqKSZvbGRyb290LT5idHJlZVtiZTE2X3RvX2NwdShvbGRyb290LT5oZHIuY291bnQpXSAtCiAJCQkgICAgIChjaGFyICopb2xkcm9vdCk7CiAJfSBlbHNlIHsKLQkJQVNTRVJUKGJlMTZfdG9fY3B1KG9sZHJvb3QtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJCUFTU0VSVChvbGRyb290LT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfRElSMl9MRUFGTl9NQUdJQykpOwogCQlsZWFmID0gKHhmc19kaXIyX2xlYWZfdCAqKW9sZHJvb3Q7CiAJCXNpemUgPSAoaW50KSgoY2hhciAqKSZsZWFmLT5lbnRzW2JlMTZfdG9fY3B1KGxlYWYtPmhkci5jb3VudCldIC0KIAkJCSAgICAgKGNoYXIgKilsZWFmKTsKQEAgLTM1Miw3ICszNDksNyBAQAogCW5vZGUtPmhkci5jb3VudCA9IGNwdV90b19iZTE2KDIpOwogCiAjaWZkZWYgREVCVUcKLQlpZiAoYmUxNl90b19jcHUob2xkcm9vdC0+aGRyLmluZm8ubWFnaWMpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKSB7CisJaWYgKG9sZHJvb3QtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19ESVIyX0xFQUZOX01BR0lDKSkgewogCQlBU1NFUlQoYmxrMS0+Ymxrbm8gPj0gbXAtPm1fZGlybGVhZmJsayAmJgogCQkgICAgICAgYmxrMS0+Ymxrbm8gPCBtcC0+bV9kaXJmcmVlYmxrKTsKIAkJQVNTRVJUKGJsazItPmJsa25vID49IG1wLT5tX2RpcmxlYWZibGsgJiYKQEAgLTM4NCw3ICszODEsNyBAQAogCWludCB1c2VleHRyYTsKIAogCW5vZGUgPSBvbGRibGstPmJwLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShub2RlLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCUFTU0VSVChub2RlLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfREFfTk9ERV9NQUdJQykpOwogCiAJLyoKIAkgKiBXaXRoIFYyIGRpcnMgdGhlIGV4dHJhIGJsb2NrIGlzIGRhdGEgb3IgZnJlZXNwYWNlLgpAQCAtNDgzLDggKzQ4MCw4IEBACiAJCW5vZGUxID0gbm9kZTI7CiAJCW5vZGUyID0gdG1wbm9kZTsKIAl9Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KG5vZGUxLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RBX05PREVfTUFHSUMpOwotCUFTU0VSVChiZTE2X3RvX2NwdShub2RlMi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwlBU1NFUlQobm9kZTEtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19EQV9OT0RFX01BR0lDKSk7CisJQVNTRVJUKG5vZGUyLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfREFfTk9ERV9NQUdJQykpOwogCWNvdW50ID0gKGJlMTZfdG9fY3B1KG5vZGUxLT5oZHIuY291bnQpIC0gYmUxNl90b19jcHUobm9kZTItPmhkci5jb3VudCkpIC8gMjsKIAlpZiAoY291bnQgPT0gMCkKIAkJcmV0dXJuOwpAQCAtNTc4LDcgKzU3NSw3IEBACiAJaW50IHRtcDsKIAogCW5vZGUgPSBvbGRibGstPmJwLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShub2RlLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCUFTU0VSVChub2RlLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfREFfTk9ERV9NQUdJQykpOwogCUFTU0VSVCgob2xkYmxrLT5pbmRleCA+PSAwKSAmJiAob2xkYmxrLT5pbmRleCA8PSBiZTE2X3RvX2NwdShub2RlLT5oZHIuY291bnQpKSk7CiAJQVNTRVJUKG5ld2Jsay0+Ymxrbm8gIT0gMCk7CiAJaWYgKHN0YXRlLT5hcmdzLT53aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykKQEAgLTcxNCw3ICs3MTEsNyBAQAogCUFTU0VSVChhcmdzICE9IE5VTEwpOwogCUFTU0VSVChyb290X2Jsay0+bWFnaWMgPT0gWEZTX0RBX05PREVfTUFHSUMpOwogCW9sZHJvb3QgPSByb290X2Jsay0+YnAtPmRhdGE7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KG9sZHJvb3QtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJQVNTRVJUKG9sZHJvb3QtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19EQV9OT0RFX01BR0lDKSk7CiAJQVNTRVJUKCFvbGRyb290LT5oZHIuaW5mby5mb3J3KTsKIAlBU1NFUlQoIW9sZHJvb3QtPmhkci5pbmZvLmJhY2spOwogCkBAIC03MzcsMTAgKzczNCwxMCBAQAogCUFTU0VSVChicCAhPSBOVUxMKTsKIAlibGtpbmZvID0gYnAtPmRhdGE7CiAJaWYgKGJlMTZfdG9fY3B1KG9sZHJvb3QtPmhkci5sZXZlbCkgPT0gMSkgewotCQlBU1NFUlQoYmUxNl90b19jcHUoYmxraW5mby0+bWFnaWMpID09IFhGU19ESVIyX0xFQUZOX01BR0lDIHx8Ci0JCSAgICAgICBiZTE2X3RvX2NwdShibGtpbmZvLT5tYWdpYykgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJCUFTU0VSVChibGtpbmZvLT5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfRElSMl9MRUFGTl9NQUdJQykgfHwKKwkJICAgICAgIGJsa2luZm8tPm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAl9IGVsc2UgewotCQlBU1NFUlQoYmUxNl90b19jcHUoYmxraW5mby0+bWFnaWMpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwkJQVNTRVJUKGJsa2luZm8tPm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19EQV9OT0RFX01BR0lDKSk7CiAJfQogCUFTU0VSVCghYmxraW5mby0+Zm9ydyk7CiAJQVNTRVJUKCFibGtpbmZvLT5iYWNrKTsKQEAgLTc3Niw3ICs3NzMsNyBAQAogCSAqLwogCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbIHN0YXRlLT5wYXRoLmFjdGl2ZS0xIF07CiAJaW5mbyA9IGJsay0+YnAtPmRhdGE7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KGluZm8tPm1hZ2ljKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJQVNTRVJUKGluZm8tPm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19EQV9OT0RFX01BR0lDKSk7CiAJbm9kZSA9ICh4ZnNfZGFfaW50bm9kZV90ICopaW5mbzsKIAljb3VudCA9IGJlMTZfdG9fY3B1KG5vZGUtPmhkci5jb3VudCk7CiAJaWYgKGNvdW50ID4gKHN0YXRlLT5ub2RlX2VudHMgPj4gMSkpIHsKQEAgLTgzNiw3ICs4MzMsNyBAQAogCQljb3VudCAtPSBzdGF0ZS0+bm9kZV9lbnRzID4+IDI7CiAJCWNvdW50IC09IGJlMTZfdG9fY3B1KG5vZGUtPmhkci5jb3VudCk7CiAJCW5vZGUgPSBicC0+ZGF0YTsKLQkJQVNTRVJUKGJlMTZfdG9fY3B1KG5vZGUtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJCUFTU0VSVChub2RlLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfREFfTk9ERV9NQUdJQykpOwogCQljb3VudCAtPSBiZTE2X3RvX2NwdShub2RlLT5oZHIuY291bnQpOwogCQl4ZnNfZGFfYnJlbHNlKHN0YXRlLT5hcmdzLT50cmFucywgYnApOwogCQlpZiAoY291bnQgPj0gMCkKQEAgLTkxMSw3ICs5MDgsNyBAQAogCX0KIAlmb3IgKGJsay0tLCBsZXZlbC0tOyBsZXZlbCA+PSAwOyBibGstLSwgbGV2ZWwtLSkgewogCQlub2RlID0gYmxrLT5icC0+ZGF0YTsKLQkJQVNTRVJUKGJlMTZfdG9fY3B1KG5vZGUtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJCUFTU0VSVChub2RlLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfREFfTk9ERV9NQUdJQykpOwogCQlidHJlZSA9ICZub2RlLT5idHJlZVsgYmxrLT5pbmRleCBdOwogCQlpZiAoYmUzMl90b19jcHUoYnRyZWUtPmhhc2h2YWwpID09IGxhc3RoYXNoKQogCQkJYnJlYWs7CkBAIC05NzksOCArOTc2LDggQEAKIAogCWRyb3Bfbm9kZSA9IGRyb3BfYmxrLT5icC0+ZGF0YTsKIAlzYXZlX25vZGUgPSBzYXZlX2Jsay0+YnAtPmRhdGE7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KGRyb3Bfbm9kZS0+aGRyLmluZm8ubWFnaWMpID09IFhGU19EQV9OT0RFX01BR0lDKTsKLQlBU1NFUlQoYmUxNl90b19jcHUoc2F2ZV9ub2RlLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCUFTU0VSVChkcm9wX25vZGUtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19EQV9OT0RFX01BR0lDKSk7CisJQVNTRVJUKHNhdmVfbm9kZS0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RBX05PREVfTUFHSUMpKTsKIAl0cCA9IHN0YXRlLT5hcmdzLT50cmFuczsKIAogCS8qCkBAIC0xMjc4LDggKzEyNzUsOCBAQAogCiAJbm9kZTEgPSBub2RlMV9icC0+ZGF0YTsKIAlub2RlMiA9IG5vZGUyX2JwLT5kYXRhOwotCUFTU0VSVCgoYmUxNl90b19jcHUobm9kZTEtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfREFfTk9ERV9NQUdJQykgJiYKLQkgICAgICAgKGJlMTZfdG9fY3B1KG5vZGUyLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RBX05PREVfTUFHSUMpKTsKKwlBU1NFUlQobm9kZTEtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19EQV9OT0RFX01BR0lDKSAmJgorCSAgICAgICBub2RlMi0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RBX05PREVfTUFHSUMpKTsKIAlpZiAoKGJlMTZfdG9fY3B1KG5vZGUxLT5oZHIuY291bnQpID4gMCkgJiYgKGJlMTZfdG9fY3B1KG5vZGUyLT5oZHIuY291bnQpID4gMCkgJiYKIAkgICAgKChiZTMyX3RvX2NwdShub2RlMi0+YnRyZWVbMF0uaGFzaHZhbCkgPAogCSAgICAgIGJlMzJfdG9fY3B1KG5vZGUxLT5idHJlZVswXS5oYXNodmFsKSkgfHwKQEAgLTEyOTksNyArMTI5Niw3IEBACiAJeGZzX2RhX2ludG5vZGVfdCAqbm9kZTsKIAogCW5vZGUgPSBicC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobm9kZS0+aGRyLmluZm8ubWFnaWMpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwlBU1NFUlQobm9kZS0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RBX05PREVfTUFHSUMpKTsKIAlpZiAoY291bnQpCiAJCSpjb3VudCA9IGJlMTZfdG9fY3B1KG5vZGUtPmhkci5jb3VudCk7CiAJaWYgKCFub2RlLT5oZHIuY291bnQpCkBAIC0xNDEyLDcgKzE0MDksNyBAQAogCWZvciAoYmxrID0gJnBhdGgtPmJsa1tsZXZlbF07IGxldmVsID49IDA7IGJsay0tLCBsZXZlbC0tKSB7CiAJCUFTU0VSVChibGstPmJwICE9IE5VTEwpOwogCQlub2RlID0gYmxrLT5icC0+ZGF0YTsKLQkJQVNTRVJUKGJlMTZfdG9fY3B1KG5vZGUtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJCUFTU0VSVChub2RlLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfREFfTk9ERV9NQUdJQykpOwogCQlpZiAoZm9yd2FyZCAmJiAoYmxrLT5pbmRleCA8IGJlMTZfdG9fY3B1KG5vZGUtPmhkci5jb3VudCktMSkpIHsKIAkJCWJsay0+aW5kZXgrKzsKIAkJCWJsa25vID0gYmUzMl90b19jcHUobm9kZS0+YnRyZWVbYmxrLT5pbmRleF0uYmVmb3JlKTsKQEAgLTE0NTEsOSArMTQ0OCw5IEBACiAJCQlyZXR1cm4oZXJyb3IpOwogCQlBU1NFUlQoYmxrLT5icCAhPSBOVUxMKTsKIAkJaW5mbyA9IGJsay0+YnAtPmRhdGE7Ci0JCUFTU0VSVChiZTE2X3RvX2NwdShpbmZvLT5tYWdpYykgPT0gWEZTX0RBX05PREVfTUFHSUMgfHwKLQkJICAgICAgIGJlMTZfdG9fY3B1KGluZm8tPm1hZ2ljKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyB8fAotCQkgICAgICAgYmUxNl90b19jcHUoaW5mby0+bWFnaWMpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCQlBU1NFUlQoaW5mby0+bWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RBX05PREVfTUFHSUMpIHx8CisJCSAgICAgICBpbmZvLT5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfRElSMl9MRUFGTl9NQUdJQykgfHwKKwkJICAgICAgIGluZm8tPm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19BVFRSX0xFQUZfTUFHSUMpKTsKIAkJYmxrLT5tYWdpYyA9IGJlMTZfdG9fY3B1KGluZm8tPm1hZ2ljKTsKIAkJaWYgKGJsay0+bWFnaWMgPT0gWEZTX0RBX05PREVfTUFHSUMpIHsKIAkJCW5vZGUgPSAoeGZzX2RhX2ludG5vZGVfdCAqKWluZm87CkBAIC0xNTQ2LDc5ICsxNTQzLDYyIEBACiAJLmNvbXBuYW1lCT0geGZzX2RhX2NvbXBuYW1lCiB9OwogCi0vKgotICogQWRkIGEgYmxvY2sgdG8gdGhlIGJ0cmVlIGFoZWFkIG9mIHRoZSBmaWxlLgotICogUmV0dXJuIHRoZSBuZXcgYmxvY2sgbnVtYmVyIHRvIHRoZSBjYWxsZXIuCi0gKi8KIGludAoteGZzX2RhX2dyb3dfaW5vZGUoeGZzX2RhX2FyZ3NfdCAqYXJncywgeGZzX2RhYmxrX3QgKm5ld19ibGtubykKK3hmc19kYV9ncm93X2lub2RlX2ludCgKKwlzdHJ1Y3QgeGZzX2RhX2FyZ3MJKmFyZ3MsCisJeGZzX2ZpbGVvZmZfdAkJKmJubywKKwlpbnQJCQljb3VudCkKIHsKLQl4ZnNfZmlsZW9mZl90IGJubywgYjsKLQl4ZnNfYm1idF9pcmVjX3QgbWFwOwotCXhmc19ibWJ0X2lyZWNfdAkqbWFwcDsKLQl4ZnNfaW5vZGVfdCAqZHA7Ci0JaW50IG5tYXAsIGVycm9yLCB3LCBjb3VudCwgYywgZ290LCBpLCBtYXBpOwotCXhmc190cmFuc190ICp0cDsKLQl4ZnNfbW91bnRfdCAqbXA7Ci0JeGZzX2RyZnNibm9fdAluYmxrczsKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCA9IGFyZ3MtPnRyYW5zOworCXN0cnVjdCB4ZnNfaW5vZGUJKmRwID0gYXJncy0+ZHA7CisJaW50CQkJdyA9IGFyZ3MtPndoaWNoZm9yazsKKwl4ZnNfZHJmc2Jub190CQluYmxrcyA9IGRwLT5pX2QuZGlfbmJsb2NrczsKKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwltYXAsICptYXBwOworCWludAkJCW5tYXAsIGVycm9yLCBnb3QsIGksIG1hcGk7CiAKLQlkcCA9IGFyZ3MtPmRwOwotCW1wID0gZHAtPmlfbW91bnQ7Ci0JdyA9IGFyZ3MtPndoaWNoZm9yazsKLQl0cCA9IGFyZ3MtPnRyYW5zOwotCW5ibGtzID0gZHAtPmlfZC5kaV9uYmxvY2tzOwotCi0JLyoKLQkgKiBGb3IgbmV3IGRpcmVjdG9yaWVzIGFkanVzdCB0aGUgZmlsZSBvZmZzZXQgYW5kIGJsb2NrIGNvdW50LgotCSAqLwotCWlmICh3ID09IFhGU19EQVRBX0ZPUkspIHsKLQkJYm5vID0gbXAtPm1fZGlybGVhZmJsazsKLQkJY291bnQgPSBtcC0+bV9kaXJibGtmc2JzOwotCX0gZWxzZSB7Ci0JCWJubyA9IDA7Ci0JCWNvdW50ID0gMTsKLQl9CiAJLyoKIAkgKiBGaW5kIGEgc3BvdCBpbiB0aGUgZmlsZSBzcGFjZSB0byBwdXQgdGhlIG5ldyBibG9jay4KIAkgKi8KLQlpZiAoKGVycm9yID0geGZzX2JtYXBfZmlyc3RfdW51c2VkKHRwLCBkcCwgY291bnQsICZibm8sIHcpKSkKKwllcnJvciA9IHhmc19ibWFwX2ZpcnN0X3VudXNlZCh0cCwgZHAsIGNvdW50LCBibm8sIHcpOworCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwotCWlmICh3ID09IFhGU19EQVRBX0ZPUkspCi0JCUFTU0VSVChibm8gPj0gbXAtPm1fZGlybGVhZmJsayAmJiBibm8gPCBtcC0+bV9kaXJmcmVlYmxrKTsKKwogCS8qCiAJICogVHJ5IG1hcHBpbmcgaXQgaW4gb25lIGZpbGVzeXN0ZW0gYmxvY2suCiAJICovCiAJbm1hcCA9IDE7CiAJQVNTRVJUKGFyZ3MtPmZpcnN0YmxvY2sgIT0gTlVMTCk7Ci0JaWYgKChlcnJvciA9IHhmc19ibWFwaSh0cCwgZHAsIGJubywgY291bnQsCisJZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGRwLCAqYm5vLCBjb3VudCwKIAkJCXhmc19ibWFwaV9hZmxhZyh3KXxYRlNfQk1BUElfV1JJVEV8WEZTX0JNQVBJX01FVEFEQVRBfAogCQkJWEZTX0JNQVBJX0NPTlRJRywKIAkJCWFyZ3MtPmZpcnN0YmxvY2ssIGFyZ3MtPnRvdGFsLCAmbWFwLCAmbm1hcCwKLQkJCWFyZ3MtPmZsaXN0KSkpIHsKKwkJCWFyZ3MtPmZsaXN0KTsKKwlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKLQl9CisKIAlBU1NFUlQobm1hcCA8PSAxKTsKIAlpZiAobm1hcCA9PSAxKSB7CiAJCW1hcHAgPSAmbWFwOwogCQltYXBpID0gMTsKLQl9Ci0JLyoKLQkgKiBJZiB3ZSBkaWRuJ3QgZ2V0IGl0IGFuZCB0aGUgYmxvY2sgbWlnaHQgd29yayBpZiBmcmFnbWVudGVkLAotCSAqIHRyeSB3aXRob3V0IHRoZSBDT05USUcgZmxhZy4gIExvb3AgdW50aWwgd2UgZ2V0IGl0IGFsbC4KLQkgKi8KLQllbHNlIGlmIChubWFwID09IDAgJiYgY291bnQgPiAxKSB7CisJfSBlbHNlIGlmIChubWFwID09IDAgJiYgY291bnQgPiAxKSB7CisJCXhmc19maWxlb2ZmX3QJCWI7CisJCWludAkJCWM7CisKKwkJLyoKKwkJICogSWYgd2UgZGlkbid0IGdldCBpdCBhbmQgdGhlIGJsb2NrIG1pZ2h0IHdvcmsgaWYgZnJhZ21lbnRlZCwKKwkJICogdHJ5IHdpdGhvdXQgdGhlIENPTlRJRyBmbGFnLiAgTG9vcCB1bnRpbCB3ZSBnZXQgaXQgYWxsLgorCQkgKi8KIAkJbWFwcCA9IGttZW1fYWxsb2Moc2l6ZW9mKCptYXBwKSAqIGNvdW50LCBLTV9TTEVFUCk7Ci0JCWZvciAoYiA9IGJubywgbWFwaSA9IDA7IGIgPCBibm8gKyBjb3VudDsgKSB7CisJCWZvciAoYiA9ICpibm8sIG1hcGkgPSAwOyBiIDwgKmJubyArIGNvdW50OyApIHsKIAkJCW5tYXAgPSBNSU4oWEZTX0JNQVBfTUFYX05NQVAsIGNvdW50KTsKLQkJCWMgPSAoaW50KShibm8gKyBjb3VudCAtIGIpOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWFwaSh0cCwgZHAsIGIsIGMsCisJCQljID0gKGludCkoKmJubyArIGNvdW50IC0gYik7CisJCQllcnJvciA9IHhmc19ibWFwaSh0cCwgZHAsIGIsIGMsCiAJCQkJCXhmc19ibWFwaV9hZmxhZyh3KXxYRlNfQk1BUElfV1JJVEV8CiAJCQkJCVhGU19CTUFQSV9NRVRBREFUQSwKIAkJCQkJYXJncy0+Zmlyc3RibG9jaywgYXJncy0+dG90YWwsCi0JCQkJCSZtYXBwW21hcGldLCAmbm1hcCwgYXJncy0+Zmxpc3QpKSkgewotCQkJCWttZW1fZnJlZShtYXBwKTsKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQl9CisJCQkJCSZtYXBwW21hcGldLCAmbm1hcCwgYXJncy0+Zmxpc3QpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gb3V0X2ZyZWVfbWFwOwogCQkJaWYgKG5tYXAgPCAxKQogCQkJCWJyZWFrOwogCQkJbWFwaSArPSBubWFwOwpAQCAtMTYyOSwyNCArMTYwOSw1MyBAQAogCQltYXBpID0gMDsKIAkJbWFwcCA9IE5VTEw7CiAJfQorCiAJLyoKIAkgKiBDb3VudCB0aGUgYmxvY2tzIHdlIGdvdCwgbWFrZSBzdXJlIGl0IG1hdGNoZXMgdGhlIHRvdGFsLgogCSAqLwogCWZvciAoaSA9IDAsIGdvdCA9IDA7IGkgPCBtYXBpOyBpKyspCiAJCWdvdCArPSBtYXBwW2ldLmJyX2Jsb2NrY291bnQ7Ci0JaWYgKGdvdCAhPSBjb3VudCB8fCBtYXBwWzBdLmJyX3N0YXJ0b2ZmICE9IGJubyB8fAorCWlmIChnb3QgIT0gY291bnQgfHwgbWFwcFswXS5icl9zdGFydG9mZiAhPSAqYm5vIHx8CiAJICAgIG1hcHBbbWFwaSAtIDFdLmJyX3N0YXJ0b2ZmICsgbWFwcFttYXBpIC0gMV0uYnJfYmxvY2tjb3VudCAhPQotCSAgICBibm8gKyBjb3VudCkgewotCQlpZiAobWFwcCAhPSAmbWFwKQotCQkJa21lbV9mcmVlKG1hcHApOwotCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CisJICAgICpibm8gKyBjb3VudCkgeworCQllcnJvciA9IFhGU19FUlJPUihFTk9TUEMpOworCQlnb3RvIG91dF9mcmVlX21hcDsKIAl9Ci0JaWYgKG1hcHAgIT0gJm1hcCkKLQkJa21lbV9mcmVlKG1hcHApOworCiAJLyogYWNjb3VudCBmb3IgbmV3bHkgYWxsb2NhdGVkIGJsb2NrcyBpbiByZXNlcnZlZCBibG9ja3MgdG90YWwgKi8KIAlhcmdzLT50b3RhbCAtPSBkcC0+aV9kLmRpX25ibG9ja3MgLSBuYmxrczsKLQkqbmV3X2Jsa25vID0gKHhmc19kYWJsa190KWJubzsKLQlyZXR1cm4gMDsKKworb3V0X2ZyZWVfbWFwOgorCWlmIChtYXBwICE9ICZtYXApCisJCWttZW1fZnJlZShtYXBwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBBZGQgYSBibG9jayB0byB0aGUgYnRyZWUgYWhlYWQgb2YgdGhlIGZpbGUuCisgKiBSZXR1cm4gdGhlIG5ldyBibG9jayBudW1iZXIgdG8gdGhlIGNhbGxlci4KKyAqLworaW50Cit4ZnNfZGFfZ3Jvd19pbm9kZSgKKwlzdHJ1Y3QgeGZzX2RhX2FyZ3MJKmFyZ3MsCisJeGZzX2RhYmxrX3QJCSpuZXdfYmxrbm8pCit7CisJeGZzX2ZpbGVvZmZfdAkJYm5vOworCWludAkJCWNvdW50OworCWludAkJCWVycm9yOworCisJaWYgKGFyZ3MtPndoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSB7CisJCWJubyA9IGFyZ3MtPmRwLT5pX21vdW50LT5tX2RpcmxlYWZibGs7CisJCWNvdW50ID0gYXJncy0+ZHAtPmlfbW91bnQtPm1fZGlyYmxrZnNiczsKKwl9IGVsc2UgeworCQlibm8gPSAwOworCQljb3VudCA9IDE7CisJfQorCisJZXJyb3IgPSB4ZnNfZGFfZ3Jvd19pbm9kZV9pbnQoYXJncywgJmJubywgY291bnQpOworCWlmICghZXJyb3IpCisJCSpuZXdfYmxrbm8gPSAoeGZzX2RhYmxrX3QpYm5vOworCXJldHVybiBlcnJvcjsKIH0KIAogLyoKQEAgLTE3MDQsMTIgKzE3MTMsMTIgQEAKIAkvKgogCSAqIEdldCB2YWx1ZXMgZnJvbSB0aGUgbW92ZWQgYmxvY2suCiAJICovCi0JaWYgKGJlMTZfdG9fY3B1KGRlYWRfaW5mby0+bWFnaWMpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKSB7CisJaWYgKGRlYWRfaW5mby0+bWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RJUjJfTEVBRk5fTUFHSUMpKSB7CiAJCWRlYWRfbGVhZjIgPSAoeGZzX2RpcjJfbGVhZl90ICopZGVhZF9pbmZvOwogCQlkZWFkX2xldmVsID0gMDsKIAkJZGVhZF9oYXNoID0gYmUzMl90b19jcHUoZGVhZF9sZWFmMi0+ZW50c1tiZTE2X3RvX2NwdShkZWFkX2xlYWYyLT5oZHIuY291bnQpIC0gMV0uaGFzaHZhbCk7CiAJfSBlbHNlIHsKLQkJQVNTRVJUKGJlMTZfdG9fY3B1KGRlYWRfaW5mby0+bWFnaWMpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwkJQVNTRVJUKGRlYWRfaW5mby0+bWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RBX05PREVfTUFHSUMpKTsKIAkJZGVhZF9ub2RlID0gKHhmc19kYV9pbnRub2RlX3QgKilkZWFkX2luZm87CiAJCWRlYWRfbGV2ZWwgPSBiZTE2X3RvX2NwdShkZWFkX25vZGUtPmhkci5sZXZlbCk7CiAJCWRlYWRfaGFzaCA9IGJlMzJfdG9fY3B1KGRlYWRfbm9kZS0+YnRyZWVbYmUxNl90b19jcHUoZGVhZF9ub2RlLT5oZHIuY291bnQpIC0gMV0uaGFzaHZhbCk7CkBAIC0xNzY4LDggKzE3NzcsOCBAQAogCQlpZiAoKGVycm9yID0geGZzX2RhX3JlYWRfYnVmKHRwLCBpcCwgcGFyX2Jsa25vLCAtMSwgJnBhcl9idWYsIHcpKSkKIAkJCWdvdG8gZG9uZTsKIAkJcGFyX25vZGUgPSBwYXJfYnVmLT5kYXRhOwotCQlpZiAodW5saWtlbHkoCi0JCSAgICBiZTE2X3RvX2NwdShwYXJfbm9kZS0+aGRyLmluZm8ubWFnaWMpICE9IFhGU19EQV9OT0RFX01BR0lDIHx8CisJCWlmICh1bmxpa2VseShwYXJfbm9kZS0+aGRyLmluZm8ubWFnaWMgIT0KKwkJICAgIGNwdV90b19iZTE2KFhGU19EQV9OT0RFX01BR0lDKSB8fAogCQkgICAgKGxldmVsID49IDAgJiYgbGV2ZWwgIT0gYmUxNl90b19jcHUocGFyX25vZGUtPmhkci5sZXZlbCkgKyAxKSkpIHsKIAkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19kYV9zd2FwX2xhc3RibG9jayg0KSIsCiAJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CkBAIC0xODIwLDcgKzE4MjksNyBAQAogCQlwYXJfbm9kZSA9IHBhcl9idWYtPmRhdGE7CiAJCWlmICh1bmxpa2VseSgKIAkJICAgIGJlMTZfdG9fY3B1KHBhcl9ub2RlLT5oZHIubGV2ZWwpICE9IGxldmVsIHx8Ci0JCSAgICBiZTE2X3RvX2NwdShwYXJfbm9kZS0+aGRyLmluZm8ubWFnaWMpICE9IFhGU19EQV9OT0RFX01BR0lDKSkgeworCQkgICAgcGFyX25vZGUtPmhkci5pbmZvLm1hZ2ljICE9IGNwdV90b19iZTE2KFhGU19EQV9OT0RFX01BR0lDKSkpIHsKIAkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19kYV9zd2FwX2xhc3RibG9jayg3KSIsCiAJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CiAJCQllcnJvciA9IFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwpAQCAtMTkzMCw4ICsxOTM5LDcgQEAKIAl4ZnNfZGFkZHJfdAkqbWFwcGVkYm5vcCwKIAl4ZnNfZGFidWZfdAkqKmJwcCwKIAlpbnQJCXdoaWNoZm9yaywKLQlpbnQJCWNhbGxlciwKLQlpbnN0X3QJCSpyYSkKKwlpbnQJCWNhbGxlcikKIHsKIAl4ZnNfYnVmX3QJKmJwID0gTlVMTDsKIAl4ZnNfYnVmX3QJKipicGxpc3Q7CkBAIC0yMDcwLDI1ICsyMDc4LDIyIEBACiAJICogQnVpbGQgYSBkYWJ1ZiBzdHJ1Y3R1cmUuCiAJICovCiAJaWYgKGJwbGlzdCkgewotCQlyYnAgPSB4ZnNfZGFfYnVmX21ha2UobmJwbGlzdCwgYnBsaXN0LCByYSk7CisJCXJicCA9IHhmc19kYV9idWZfbWFrZShuYnBsaXN0LCBicGxpc3QpOwogCX0gZWxzZSBpZiAoYnApCi0JCXJicCA9IHhmc19kYV9idWZfbWFrZSgxLCAmYnAsIHJhKTsKKwkJcmJwID0geGZzX2RhX2J1Zl9tYWtlKDEsICZicCk7CiAJZWxzZQogCQlyYnAgPSBOVUxMOwogCS8qCiAJICogRm9yIHJlYWRfYnVmLCBjaGVjayB0aGUgbWFnaWMgbnVtYmVyLgogCSAqLwogCWlmIChjYWxsZXIgPT0gMSkgewotCQl4ZnNfZGlyMl9kYXRhX3QJCSpkYXRhOwotCQl4ZnNfZGlyMl9mcmVlX3QJCSpmcmVlOwotCQl4ZnNfZGFfYmxraW5mb190CSppbmZvOworCQl4ZnNfZGlyMl9kYXRhX2hkcl90CSpoZHIgPSByYnAtPmRhdGE7CisJCXhmc19kaXIyX2ZyZWVfdAkJKmZyZWUgPSByYnAtPmRhdGE7CisJCXhmc19kYV9ibGtpbmZvX3QJKmluZm8gPSByYnAtPmRhdGE7CiAJCXVpbnQJCQltYWdpYywgbWFnaWMxOwogCi0JCWluZm8gPSByYnAtPmRhdGE7Ci0JCWRhdGEgPSByYnAtPmRhdGE7Ci0JCWZyZWUgPSByYnAtPmRhdGE7CiAJCW1hZ2ljID0gYmUxNl90b19jcHUoaW5mby0+bWFnaWMpOwotCQltYWdpYzEgPSBiZTMyX3RvX2NwdShkYXRhLT5oZHIubWFnaWMpOworCQltYWdpYzEgPSBiZTMyX3RvX2NwdShoZHItPm1hZ2ljKTsKIAkJaWYgKHVubGlrZWx5KAogCQkgICAgWEZTX1RFU1RfRVJST1IoKG1hZ2ljICE9IFhGU19EQV9OT0RFX01BR0lDKSAmJgogCQkJCSAgIChtYWdpYyAhPSBYRlNfQVRUUl9MRUFGX01BR0lDKSAmJgpAQCAtMjA5Niw3ICsyMTAxLDcgQEAKIAkJCQkgICAobWFnaWMgIT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpICYmCiAJCQkJICAgKG1hZ2ljMSAhPSBYRlNfRElSMl9CTE9DS19NQUdJQykgJiYKIAkJCQkgICAobWFnaWMxICE9IFhGU19ESVIyX0RBVEFfTUFHSUMpICYmCi0JCQkJICAgKGJlMzJfdG9fY3B1KGZyZWUtPmhkci5tYWdpYykgIT0gWEZTX0RJUjJfRlJFRV9NQUdJQyksCisJCQkJICAgKGZyZWUtPmhkci5tYWdpYyAhPSBjcHVfdG9fYmUzMihYRlNfRElSMl9GUkVFX01BR0lDKSksCiAJCQkJbXAsIFhGU19FUlJUQUdfREFfUkVBRF9CVUYsCiAJCQkJWEZTX1JBTkRPTV9EQV9SRUFEX0JVRikpKSB7CiAJCQl0cmFjZV94ZnNfZGFfYnRyZWVfY29ycnVwdChyYnAtPmJwc1swXSwgX1JFVF9JUF8pOwpAQCAtMjE0Myw4ICsyMTQ4LDcgQEAKIAl4ZnNfZGFidWZfdAkqKmJwcCwKIAlpbnQJCXdoaWNoZm9yaykKIHsKLQlyZXR1cm4geGZzX2RhX2RvX2J1Zih0cmFucywgZHAsIGJubywgJm1hcHBlZGJubywgYnBwLCB3aGljaGZvcmssIDAsCi0JCQkJCQkgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXJldHVybiB4ZnNfZGFfZG9fYnVmKHRyYW5zLCBkcCwgYm5vLCAmbWFwcGVkYm5vLCBicHAsIHdoaWNoZm9yaywgMCk7CiB9CiAKIC8qCkBAIC0yMTU5LDggKzIxNjMsNyBAQAogCXhmc19kYWJ1Zl90CSoqYnBwLAogCWludAkJd2hpY2hmb3JrKQogewotCXJldHVybiB4ZnNfZGFfZG9fYnVmKHRyYW5zLCBkcCwgYm5vLCAmbWFwcGVkYm5vLCBicHAsIHdoaWNoZm9yaywgMSwKLQkJKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXJldHVybiB4ZnNfZGFfZG9fYnVmKHRyYW5zLCBkcCwgYm5vLCAmbWFwcGVkYm5vLCBicHAsIHdoaWNoZm9yaywgMSk7CiB9CiAKIC8qCkBAIC0yMTc2LDggKzIxNzksNyBAQAogCXhmc19kYWRkcl90CQlydmFsOwogCiAJcnZhbCA9IC0xOwotCWlmICh4ZnNfZGFfZG9fYnVmKHRyYW5zLCBkcCwgYm5vLCAmcnZhbCwgTlVMTCwgd2hpY2hmb3JrLCAzLAotCQkJKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpKQorCWlmICh4ZnNfZGFfZG9fYnVmKHRyYW5zLCBkcCwgYm5vLCAmcnZhbCwgTlVMTCwgd2hpY2hmb3JrLCAzKSkKIAkJcmV0dXJuIC0xOwogCWVsc2UKIAkJcmV0dXJuIHJ2YWw7CkBAIC0yMjM1LDE3ICsyMjM3LDEyIEBACiAJa21lbV96b25lX2ZyZWUoeGZzX2RhX3N0YXRlX3pvbmUsIHN0YXRlKTsKIH0KIAotI2lmZGVmIFhGU19EQUJVRl9ERUJVRwoteGZzX2RhYnVmX3QJKnhmc19kYWJ1Zl9nbG9iYWxfbGlzdDsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soeGZzX2RhYnVmX2dsb2JhbF9sb2NrKTsKLSNlbmRpZgotCiAvKgogICogQ3JlYXRlIGEgZGFidWYuCiAgKi8KIC8qIEFSR1NVU0VEICovCiBTVEFUSUMgeGZzX2RhYnVmX3QgKgoteGZzX2RhX2J1Zl9tYWtlKGludCBuYnVmLCB4ZnNfYnVmX3QgKipicHMsIGluc3RfdCAqcmEpCit4ZnNfZGFfYnVmX21ha2UoaW50IG5idWYsIHhmc19idWZfdCAqKmJwcykKIHsKIAl4ZnNfYnVmX3QJKmJwOwogCXhmc19kYWJ1Zl90CSpkYWJ1ZjsKQEAgLTIyNTcsMTEgKzIyNTQsNiBAQAogCWVsc2UKIAkJZGFidWYgPSBrbWVtX2FsbG9jKFhGU19EQV9CVUZfU0laRShuYnVmKSwgS01fTk9GUyk7CiAJZGFidWYtPmRpcnR5ID0gMDsKLSNpZmRlZiBYRlNfREFCVUZfREVCVUcKLQlkYWJ1Zi0+cmEgPSByYTsKLQlkYWJ1Zi0+dGFyZ2V0ID0gWEZTX0JVRl9UQVJHRVQoYnBzWzBdKTsKLQlkYWJ1Zi0+Ymxrbm8gPSBYRlNfQlVGX0FERFIoYnBzWzBdKTsKLSNlbmRpZgogCWlmIChuYnVmID09IDEpIHsKIAkJZGFidWYtPm5idWYgPSAxOwogCQlicCA9IGJwc1swXTsKQEAgLTIyODEsMjMgKzIyNzMsNiBAQAogCQkJCVhGU19CVUZfQ09VTlQoYnApKTsKIAkJfQogCX0KLSNpZmRlZiBYRlNfREFCVUZfREVCVUcKLQl7Ci0JCXhmc19kYWJ1Zl90CSpwOwotCi0JCXNwaW5fbG9jaygmeGZzX2RhYnVmX2dsb2JhbF9sb2NrKTsKLQkJZm9yIChwID0geGZzX2RhYnVmX2dsb2JhbF9saXN0OyBwOyBwID0gcC0+bmV4dCkgewotCQkJQVNTRVJUKHAtPmJsa25vICE9IGRhYnVmLT5ibGtubyB8fAotCQkJICAgICAgIHAtPnRhcmdldCAhPSBkYWJ1Zi0+dGFyZ2V0KTsKLQkJfQotCQlkYWJ1Zi0+cHJldiA9IE5VTEw7Ci0JCWlmICh4ZnNfZGFidWZfZ2xvYmFsX2xpc3QpCi0JCQl4ZnNfZGFidWZfZ2xvYmFsX2xpc3QtPnByZXYgPSBkYWJ1ZjsKLQkJZGFidWYtPm5leHQgPSB4ZnNfZGFidWZfZ2xvYmFsX2xpc3Q7Ci0JCXhmc19kYWJ1Zl9nbG9iYWxfbGlzdCA9IGRhYnVmOwotCQlzcGluX3VubG9jaygmeGZzX2RhYnVmX2dsb2JhbF9sb2NrKTsKLQl9Ci0jZW5kaWYKIAlyZXR1cm4gZGFidWY7CiB9CiAKQEAgLTIzMzMsMjUgKzIzMDgsMTIgQEAKIAlBU1NFUlQoZGFidWYtPm5idWYgJiYgZGFidWYtPmRhdGEgJiYgZGFidWYtPmJiY291bnQgJiYgZGFidWYtPmJwc1swXSk7CiAJaWYgKGRhYnVmLT5kaXJ0eSkKIAkJeGZzX2RhX2J1Zl9jbGVhbihkYWJ1Zik7Ci0JaWYgKGRhYnVmLT5uYnVmID4gMSkKKwlpZiAoZGFidWYtPm5idWYgPiAxKSB7CiAJCWttZW1fZnJlZShkYWJ1Zi0+ZGF0YSk7Ci0jaWZkZWYgWEZTX0RBQlVGX0RFQlVHCi0JewotCQlzcGluX2xvY2soJnhmc19kYWJ1Zl9nbG9iYWxfbG9jayk7Ci0JCWlmIChkYWJ1Zi0+cHJldikKLQkJCWRhYnVmLT5wcmV2LT5uZXh0ID0gZGFidWYtPm5leHQ7Ci0JCWVsc2UKLQkJCXhmc19kYWJ1Zl9nbG9iYWxfbGlzdCA9IGRhYnVmLT5uZXh0OwotCQlpZiAoZGFidWYtPm5leHQpCi0JCQlkYWJ1Zi0+bmV4dC0+cHJldiA9IGRhYnVmLT5wcmV2OwotCQlzcGluX3VubG9jaygmeGZzX2RhYnVmX2dsb2JhbF9sb2NrKTsKLQl9Ci0JbWVtc2V0KGRhYnVmLCAwLCBYRlNfREFfQlVGX1NJWkUoZGFidWYtPm5idWYpKTsKLSNlbmRpZgotCWlmIChkYWJ1Zi0+bmJ1ZiA9PSAxKQotCQlrbWVtX3pvbmVfZnJlZSh4ZnNfZGFidWZfem9uZSwgZGFidWYpOwotCWVsc2UKIAkJa21lbV9mcmVlKGRhYnVmKTsKKwl9IGVsc2UgeworCQlrbWVtX3pvbmVfZnJlZSh4ZnNfZGFidWZfem9uZSwgZGFidWYpOworCX0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGFfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfZGFfYnRyZWUuaAppbmRleCBmZTlmNWE4Li5kYmY3YzA3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RhX2J0cmVlLmgKKysrIGIvZnMveGZzL3hmc19kYV9idHJlZS5oCkBAIC0xNDUsMjIgKzE0NSwxMSBAQAogCXNob3J0CQlkaXJ0eTsJCS8qIGRhdGEgbmVlZHMgdG8gYmUgY29waWVkIGJhY2sgKi8KIAlzaG9ydAkJYmJjb3VudDsJLyogaG93IGxhcmdlIGlzIGRhdGEgaW4gYmJzICovCiAJdm9pZAkJKmRhdGE7CQkvKiBwb2ludGVyIGZvciBidWZmZXJzJyBkYXRhICovCi0jaWZkZWYgWEZTX0RBQlVGX0RFQlVHCi0JaW5zdF90CQkqcmE7CQkvKiByZXR1cm4gYWRkcmVzcyBvZiBjYWxsZXIgdG8gbWFrZSAqLwotCXN0cnVjdCB4ZnNfZGFidWYgKm5leHQ7CQkvKiBuZXh0IGluIGdsb2JhbCBjaGFpbiAqLwotCXN0cnVjdCB4ZnNfZGFidWYgKnByZXY7CQkvKiBwcmV2aW91cyBpbiBnbG9iYWwgY2hhaW4gKi8KLQlzdHJ1Y3QgeGZzX2J1ZnRhcmcgKnRhcmdldDsJLyogZGV2aWNlIGZvciBidWZmZXIgKi8KLQl4ZnNfZGFkZHJfdAlibGtubzsJCS8qIGRhZGRyIGZpcnN0IGluIGJwc1swXSAqLwotI2VuZGlmCiAJc3RydWN0IHhmc19idWYJKmJwc1sxXTsJLyogYWN0dWFsbHkgbmJ1ZiBvZiB0aGVzZSAqLwogfSB4ZnNfZGFidWZfdDsKICNkZWZpbmUJWEZTX0RBX0JVRl9TSVpFKG4pCVwKIAkoc2l6ZW9mKHhmc19kYWJ1Zl90KSArIHNpemVvZihzdHJ1Y3QgeGZzX2J1ZiAqKSAqICgobikgLSAxKSkKIAotI2lmZGVmIFhGU19EQUJVRl9ERUJVRwotZXh0ZXJuIHhmc19kYWJ1Zl90CSp4ZnNfZGFidWZfZ2xvYmFsX2xpc3Q7Ci0jZW5kaWYKLQogLyoKICAqIFN0b3JhZ2UgZm9yIGhvbGRpbmcgc3RhdGUgZHVyaW5nIEJ0cmVlIHNlYXJjaGVzIGFuZCBzcGxpdC9qb2luIG9wcy4KICAqCkBAIC0yNDgsNiArMjM3LDggQEAKICAqIFV0aWxpdHkgcm91dGluZXMuCiAgKi8KIGludAl4ZnNfZGFfZ3Jvd19pbm9kZSh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFibGtfdCAqbmV3X2Jsa25vKTsKK2ludAl4ZnNfZGFfZ3Jvd19pbm9kZV9pbnQoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfZmlsZW9mZl90ICpibm8sCisJCQkgICAgICBpbnQgY291bnQpOwogaW50CXhmc19kYV9nZXRfYnVmKHN0cnVjdCB4ZnNfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKIAkJCSAgICAgIHhmc19kYWJsa190IGJubywgeGZzX2RhZGRyX3QgbWFwcGVkYm5vLAogCQkJICAgICAgeGZzX2RhYnVmX3QgKipicCwgaW50IHdoaWNoZm9yayk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjIuYyBiL2ZzL3hmcy94ZnNfZGlyMi5jCmluZGV4IGRiYTdhNzEuLjQ1ODBjZTAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyMi5jCisrKyBiL2ZzL3hmcy94ZnNfZGlyMi5jCkBAIC0yNCwyMCArMjQsMTcgQEAKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfc2IuaCIKICNpbmNsdWRlICJ4ZnNfYWcuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19tb3VudC5oIgogI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgogI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKICNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19kaXIyX2RhdGEuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9sZWFmLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfYmxvY2suaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9ub2RlLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9mb3JtYXQuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9wcml2LmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX3Zub2Rlb3BzLmgiCiAjaW5jbHVkZSAieGZzX3RyYWNlLmgiCkBAIC0xMjIsMTUgKzExOSwxNSBAQAogeGZzX2Rpcl9pc2VtcHR5KAogCXhmc19pbm9kZV90CSpkcCkKIHsKLQl4ZnNfZGlyMl9zZl90CSpzZnA7CisJeGZzX2RpcjJfc2ZfaGRyX3QJKnNmcDsKIAogCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKIAlpZiAoZHAtPmlfZC5kaV9zaXplID09IDApCS8qIG1pZ2h0IGhhcHBlbiBkdXJpbmcgc2h1dGRvd24uICovCiAJCXJldHVybiAxOwogCWlmIChkcC0+aV9kLmRpX3NpemUgPiBYRlNfSUZPUktfRFNJWkUoZHApKQogCQlyZXR1cm4gMDsKLQlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7Ci0JcmV0dXJuICFzZnAtPmhkci5jb3VudDsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCXJldHVybiAhc2ZwLT5jb3VudDsKIH0KIAogLyoKQEAgLTUwMCwxMjkgKzQ5NywzNCBAQAogCiAvKgogICogQWRkIGEgYmxvY2sgdG8gdGhlIGRpcmVjdG9yeS4KLSAqIFRoaXMgcm91dGluZSBpcyBmb3IgZGF0YSBhbmQgZnJlZSBibG9ja3MsIG5vdCBsZWFmL25vZGUgYmxvY2tzCi0gKiB3aGljaCBhcmUgaGFuZGxlZCBieSB4ZnNfZGFfZ3Jvd19pbm9kZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgZm9yIGRhdGEgYW5kIGZyZWUgYmxvY2tzLCBub3QgbGVhZi9ub2RlIGJsb2NrcyB3aGljaCBhcmUKKyAqIGhhbmRsZWQgYnkgeGZzX2RhX2dyb3dfaW5vZGUuCiAgKi8KIGludAogeGZzX2RpcjJfZ3Jvd19pbm9kZSgKLQl4ZnNfZGFfYXJnc190CSphcmdzLAotCWludAkJc3BhY2UsCQkvKiB2MiBkaXIncyBzcGFjZSBYRlNfRElSMl94eHhfU1BBQ0UgKi8KLQl4ZnNfZGlyMl9kYl90CSpkYnApCQkvKiBvdXQ6IGJsb2NrIG51bWJlciBhZGRlZCAqLworCXN0cnVjdCB4ZnNfZGFfYXJncwkqYXJncywKKwlpbnQJCQlzcGFjZSwJLyogdjIgZGlyJ3Mgc3BhY2UgWEZTX0RJUjJfeHh4X1NQQUNFICovCisJeGZzX2RpcjJfZGJfdAkJKmRicCkJLyogb3V0OiBibG9jayBudW1iZXIgYWRkZWQgKi8KIHsKLQl4ZnNfZmlsZW9mZl90CWJubzsJCS8qIGRpcmVjdG9yeSBvZmZzZXQgb2YgbmV3IGJsb2NrICovCi0JaW50CQljb3VudDsJCS8qIGNvdW50IG9mIGZpbGVzeXN0ZW0gYmxvY2tzICovCi0JeGZzX2lub2RlX3QJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLwotCWludAkJZXJyb3I7Ci0JaW50CQlnb3Q7CQkvKiBibG9ja3MgYWN0dWFsbHkgbWFwcGVkICovCi0JaW50CQlpOwotCXhmc19ibWJ0X2lyZWNfdAltYXA7CQkvKiBzaW5nbGUgc3RydWN0dXJlIGZvciBibWFwICovCi0JaW50CQltYXBpOwkJLyogbWFwcGluZyBpbmRleCAqLwotCXhmc19ibWJ0X2lyZWNfdAkqbWFwcDsJCS8qIGJtYXAgbWFwcGluZyBzdHJ1Y3R1cmUocykgKi8KLQl4ZnNfbW91bnRfdAkqbXA7Ci0JaW50CQlubWFwOwkJLyogbnVtYmVyIG9mIGJtYXAgZW50cmllcyAqLwotCXhmc190cmFuc190CSp0cDsKLQl4ZnNfZHJmc2Jub190CW5ibGtzOworCXN0cnVjdCB4ZnNfaW5vZGUJKmRwID0gYXJncy0+ZHA7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBkcC0+aV9tb3VudDsKKwl4ZnNfZmlsZW9mZl90CQlibm87CS8qIGRpcmVjdG9yeSBvZmZzZXQgb2YgbmV3IGJsb2NrICovCisJaW50CQkJY291bnQ7CS8qIGNvdW50IG9mIGZpbGVzeXN0ZW0gYmxvY2tzICovCisJaW50CQkJZXJyb3I7CiAKIAl0cmFjZV94ZnNfZGlyMl9ncm93X2lub2RlKGFyZ3MsIHNwYWNlKTsKIAotCWRwID0gYXJncy0+ZHA7Ci0JdHAgPSBhcmdzLT50cmFuczsKLQltcCA9IGRwLT5pX21vdW50OwotCW5ibGtzID0gZHAtPmlfZC5kaV9uYmxvY2tzOwogCS8qCiAJICogU2V0IGxvd2VzdCBwb3NzaWJsZSBibG9jayBpbiB0aGUgc3BhY2UgcmVxdWVzdGVkLgogCSAqLwogCWJubyA9IFhGU19CX1RPX0ZTQlQobXAsIHNwYWNlICogWEZTX0RJUjJfU1BBQ0VfU0laRSk7CiAJY291bnQgPSBtcC0+bV9kaXJibGtmc2JzOwotCS8qCi0JICogRmluZCB0aGUgZmlyc3QgaG9sZSBmb3Igb3VyIGJsb2NrLgotCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9maXJzdF91bnVzZWQodHAsIGRwLCBjb3VudCwgJmJubywgWEZTX0RBVEFfRk9SSykpKQorCisJZXJyb3IgPSB4ZnNfZGFfZ3Jvd19pbm9kZV9pbnQoYXJncywgJmJubywgY291bnQpOworCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwotCW5tYXAgPSAxOwotCUFTU0VSVChhcmdzLT5maXJzdGJsb2NrICE9IE5VTEwpOwotCS8qCi0JICogVHJ5IG1hcHBpbmcgdGhlIG5ldyBibG9jayBjb250aWd1b3VzbHkgKG9uZSBleHRlbnQpLgotCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGRwLCBibm8sIGNvdW50LAotCQkJWEZTX0JNQVBJX1dSSVRFfFhGU19CTUFQSV9NRVRBREFUQXxYRlNfQk1BUElfQ09OVElHLAotCQkJYXJncy0+Zmlyc3RibG9jaywgYXJncy0+dG90YWwsICZtYXAsICZubWFwLAotCQkJYXJncy0+Zmxpc3QpKSkKLQkJcmV0dXJuIGVycm9yOwotCUFTU0VSVChubWFwIDw9IDEpOwotCWlmIChubWFwID09IDEpIHsKLQkJbWFwcCA9ICZtYXA7Ci0JCW1hcGkgPSAxOwotCX0KLQkvKgotCSAqIERpZG4ndCB3b3JrIGFuZCB0aGlzIGlzIGEgbXVsdGlwbGUtZnNiIGRpcmVjdG9yeSBibG9jay4KLQkgKiBUcnkgYWdhaW4gd2l0aCBjb250aWd1b3VzIGZsYWcgdHVybmVkIG9uLgotCSAqLwotCWVsc2UgaWYgKG5tYXAgPT0gMCAmJiBjb3VudCA+IDEpIHsKLQkJeGZzX2ZpbGVvZmZfdAliOwkvKiBjdXJyZW50IGZpbGUgb2Zmc2V0ICovCiAKLQkJLyoKLQkJICogU3BhY2UgZm9yIG1heGltdW0gbnVtYmVyIG9mIG1hcHBpbmdzLgotCQkgKi8KLQkJbWFwcCA9IGttZW1fYWxsb2Moc2l6ZW9mKCptYXBwKSAqIGNvdW50LCBLTV9TTEVFUCk7Ci0JCS8qCi0JCSAqIEl0ZXJhdGUgdW50aWwgd2UgZ2V0IHRvIHRoZSBlbmQgb2Ygb3VyIGJsb2NrLgotCQkgKi8KLQkJZm9yIChiID0gYm5vLCBtYXBpID0gMDsgYiA8IGJubyArIGNvdW50OyApIHsKLQkJCWludAljOwkvKiBjdXJyZW50IGZzYiBjb3VudCAqLwotCi0JCQkvKgotCQkJICogQ2FuJ3QgbWFwIG1vcmUgdGhhbiBNQVhfTk1BUCBhdCBvbmNlLgotCQkJICovCi0JCQlubWFwID0gTUlOKFhGU19CTUFQX01BWF9OTUFQLCBjb3VudCk7Ci0JCQljID0gKGludCkoYm5vICsgY291bnQgLSBiKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGRwLCBiLCBjLAotCQkJCQlYRlNfQk1BUElfV1JJVEV8WEZTX0JNQVBJX01FVEFEQVRBLAotCQkJCQlhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT50b3RhbCwKLQkJCQkJJm1hcHBbbWFwaV0sICZubWFwLCBhcmdzLT5mbGlzdCkpKSB7Ci0JCQkJa21lbV9mcmVlKG1hcHApOwotCQkJCXJldHVybiBlcnJvcjsKLQkJCX0KLQkJCWlmIChubWFwIDwgMSkKLQkJCQlicmVhazsKLQkJCS8qCi0JCQkgKiBBZGQgdGhpcyBidW5jaCBpbnRvIG91ciB0YWJsZSwgZ28gdG8gdGhlIG5leHQgb2Zmc2V0LgotCQkJICovCi0JCQltYXBpICs9IG5tYXA7Ci0JCQliID0gbWFwcFttYXBpIC0gMV0uYnJfc3RhcnRvZmYgKwotCQkJICAgIG1hcHBbbWFwaSAtIDFdLmJyX2Jsb2NrY291bnQ7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBEaWRuJ3Qgd29yay4KLQkgKi8KLQllbHNlIHsKLQkJbWFwaSA9IDA7Ci0JCW1hcHAgPSBOVUxMOwotCX0KLQkvKgotCSAqIFNlZSBob3cgbWFueSBmc2IncyB3ZSBnb3QuCi0JICovCi0JZm9yIChpID0gMCwgZ290ID0gMDsgaSA8IG1hcGk7IGkrKykKLQkJZ290ICs9IG1hcHBbaV0uYnJfYmxvY2tjb3VudDsKLQkvKgotCSAqIERpZG4ndCBnZXQgZW5vdWdoIGZzYidzLCBvciB0aGUgZmlyc3QvbGFzdCBibG9jaydzIGFyZSB3cm9uZy4KLQkgKi8KLQlpZiAoZ290ICE9IGNvdW50IHx8IG1hcHBbMF0uYnJfc3RhcnRvZmYgIT0gYm5vIHx8Ci0JICAgIG1hcHBbbWFwaSAtIDFdLmJyX3N0YXJ0b2ZmICsgbWFwcFttYXBpIC0gMV0uYnJfYmxvY2tjb3VudCAhPQotCSAgICBibm8gKyBjb3VudCkgewotCQlpZiAobWFwcCAhPSAmbWFwKQotCQkJa21lbV9mcmVlKG1hcHApOwotCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7Ci0JfQotCS8qCi0JICogRG9uZSB3aXRoIHRoZSB0ZW1wb3JhcnkgbWFwcGluZyB0YWJsZS4KLQkgKi8KLQlpZiAobWFwcCAhPSAmbWFwKQotCQlrbWVtX2ZyZWUobWFwcCk7Ci0KLQkvKiBhY2NvdW50IGZvciBuZXdseSBhbGxvY2F0ZWQgYmxvY2tzIGluIHJlc2VydmVkIGJsb2NrcyB0b3RhbCAqLwotCWFyZ3MtPnRvdGFsIC09IGRwLT5pX2QuZGlfbmJsb2NrcyAtIG5ibGtzOwogCSpkYnAgPSB4ZnNfZGlyMl9kYV90b19kYihtcCwgKHhmc19kYWJsa190KWJubyk7CiAKIAkvKgpAQCAtNjM0LDcgKzUzNiw3IEBACiAJCXNpemUgPSBYRlNfRlNCX1RPX0IobXAsIGJubyArIGNvdW50KTsKIAkJaWYgKHNpemUgPiBkcC0+aV9kLmRpX3NpemUpIHsKIAkJCWRwLT5pX2QuZGlfc2l6ZSA9IHNpemU7Ci0JCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisJCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSk7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjIuaCBiL2ZzL3hmcy94ZnNfZGlyMi5oCmluZGV4IDc0YTNiMTAuLmU5MzdkOTkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyMi5oCisrKyBiL2ZzL3hmcy94ZnNfZGlyMi5oCkBAIC0xNiw0OSArMTYsMTQgQEAKICAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaWZuZGVmIF9fWEZTX0RJUjJfSF9fCi0jZGVmaW5lCV9fWEZTX0RJUjJfSF9fCisjZGVmaW5lIF9fWEZTX0RJUjJfSF9fCiAKLXN0cnVjdCB1aW87Ci1zdHJ1Y3QgeGZzX2RhYnVmOwotc3RydWN0IHhmc19kYV9hcmdzOwotc3RydWN0IHhmc19kaXIyX3B1dF9hcmdzOwogc3RydWN0IHhmc19ibWFwX2ZyZWU7CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CiBzdHJ1Y3QgeGZzX2lub2RlOwogc3RydWN0IHhmc19tb3VudDsKIHN0cnVjdCB4ZnNfdHJhbnM7CiAKLS8qCi0gKiBEaXJlY3RvcnkgdmVyc2lvbiAyLgotICogVGhlcmUgYXJlIDQgcG9zc2libGUgZm9ybWF0czoKLSAqCXNob3J0Zm9ybQotICoJc2luZ2xlIGJsb2NrIC0gZGF0YSB3aXRoIGVtYmVkZGVkIGxlYWYgYXQgdGhlIGVuZAotICoJbXVsdGlwbGUgZGF0YSBibG9ja3MsIHNpbmdsZSBsZWFmK2ZyZWVpbmRleCBibG9jawotICoJZGF0YSBibG9ja3MsIG5vZGUmbGVhZiBibG9ja3MgKGJ0cmVlKSwgZnJlZWluZGV4IGJsb2NrcwotICoKLSAqCVRoZSBzaG9ydGZvcm0gZm9ybWF0IGlzIGluIHhmc19kaXIyX3NmLmguCi0gKglUaGUgc2luZ2xlIGJsb2NrIGZvcm1hdCBpcyBpbiB4ZnNfZGlyMl9ibG9jay5oLgotICoJVGhlIGRhdGEgYmxvY2sgZm9ybWF0IGlzIGluIHhmc19kaXIyX2RhdGEuaC4KLSAqCVRoZSBsZWFmIGFuZCBmcmVlaW5kZXggYmxvY2sgZm9ybWF0cyBhcmUgaW4geGZzX2RpcjJfbGVhZi5oLgotICoJTm9kZSBibG9ja3MgYXJlIHRoZSBzYW1lIGFzIHRoZSBvdGhlciB2ZXJzaW9uLCBpbiB4ZnNfZGFfYnRyZWUuaC4KLSAqLwotCi0vKgotICogQnl0ZSBvZmZzZXQgaW4gZGF0YSBibG9jayBhbmQgc2hvcnRmb3JtIGVudHJ5LgotICovCi10eXBlZGVmCV9fdWludDE2X3QJeGZzX2RpcjJfZGF0YV9vZmZfdDsKLSNkZWZpbmUJTlVMTERBVEFPRkYJMHhmZmZmVQotdHlwZWRlZiB1aW50CQl4ZnNfZGlyMl9kYXRhX2FvZmZfdDsJLyogYXJndW1lbnQgZm9ybSAqLwotCi0vKgotICogRGlyZWN0b3J5IGJsb2NrIG51bWJlciAobG9naWNhbCBkaXJibGsgaW4gZmlsZSkKLSAqLwotdHlwZWRlZglfX3VpbnQzMl90CXhmc19kaXIyX2RiX3Q7Ci0KLS8qCi0gKiBCeXRlIG9mZnNldCBpbiBhIGRpcmVjdG9yeS4KLSAqLwotdHlwZWRlZgl4ZnNfb2ZmX3QJeGZzX2RpcjJfb2ZmX3Q7Ci0KIGV4dGVybiBzdHJ1Y3QgeGZzX25hbWUJeGZzX25hbWVfZG90ZG90OwogCiAvKgpAQCAtODYsMjEgKzUxLDEwIEBACiAJCQkJc3RydWN0IHhmc19ibWFwX2ZyZWUgKmZsaXN0LCB4ZnNfZXh0bGVuX3QgdG90KTsKIGV4dGVybiBpbnQgeGZzX2Rpcl9jYW5lbnRlcihzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19pbm9kZSAqZHAsCiAJCQkJc3RydWN0IHhmc19uYW1lICpuYW1lLCB1aW50IHJlc2Jsa3MpOwotZXh0ZXJuIGludCB4ZnNfZGlyX2lub192YWxpZGF0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2lub190IGlubyk7CiAKIC8qCi0gKiBVdGlsaXR5IHJvdXRpbmVzIGZvciB2MiBkaXJlY3Rvcmllcy4KKyAqIERpcmVjdCBjYWxsIGZyb20gdGhlIGJtYXAgY29kZSwgYnlwYXNzaW5nIHRoZSBnZW5lcmljIGRpcmVjdG9yeSBsYXllci4KICAqLwotZXh0ZXJuIGludCB4ZnNfZGlyMl9ncm93X2lub2RlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgaW50IHNwYWNlLAotCQkJCXhmc19kaXIyX2RiX3QgKmRicCk7Ci1leHRlcm4gaW50IHhmc19kaXIyX2lzYmxvY2soc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAotCQkJCWludCAqdnApOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9pc2xlYWYoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAotCQkJCWludCAqdnApOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9zaHJpbmtfaW5vZGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfZGlyMl9kYl90IGRiLAotCQkJCXN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKLQotZXh0ZXJuIGludCB4ZnNfZGlyX2NpbG9va3VwX3Jlc3VsdChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCi0JCQkJY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwgaW50IGxlbik7CitleHRlcm4gaW50IHhmc19kaXIyX3NmX3RvX2Jsb2NrKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CiAKICNlbmRpZgkvKiBfX1hGU19ESVIyX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmMgYi9mcy94ZnMveGZzX2RpcjJfYmxvY2suYwppbmRleCA1ODBkOTljLi45MjQ1ZTAyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjJfYmxvY2suYworKysgYi9mcy94ZnMveGZzX2RpcjJfYmxvY2suYwpAQCAtMjMsMTcgKzIzLDE0IEBACiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfZGF0YS5oIgotI2luY2x1ZGUgInhmc19kaXIyX2xlYWYuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9ibG9jay5oIgorI2luY2x1ZGUgInhmc19kaXIyX2Zvcm1hdC5oIgorI2luY2x1ZGUgInhmc19kaXIyX3ByaXYuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKIApAQCAtNjcsNyArNjQsNyBAQAogCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogZGlyZWN0b3J5IG9wIGFyZ3VtZW50cyAqLwogewogCXhmc19kaXIyX2RhdGFfZnJlZV90CSpiZjsJCS8qIGJlc3RmcmVlIHRhYmxlIGluIGJsb2NrICovCi0JeGZzX2RpcjJfYmxvY2tfdAkqYmxvY2s7CQkvKiBkaXJlY3RvcnkgYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyOwkJLyogYmxvY2sgaGVhZGVyICovCiAJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpibHA7CQkvKiBibG9jayBsZWFmIGVudHJpZXMgKi8KIAl4ZnNfZGFidWZfdAkJKmJwOwkJLyogYnVmZmVyIGZvciBibG9jayAqLwogCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCAqLwpAQCAtMTA1LDEzICsxMDIsMTMgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAlBU1NFUlQoYnAgIT0gTlVMTCk7Ci0JYmxvY2sgPSBicC0+ZGF0YTsKKwloZHIgPSBicC0+ZGF0YTsKIAkvKgogCSAqIENoZWNrIHRoZSBtYWdpYyBudW1iZXIsIGNvcnJ1cHRlZCBpZiB3cm9uZy4KIAkgKi8KLQlpZiAodW5saWtlbHkoYmUzMl90b19jcHUoYmxvY2stPmhkci5tYWdpYykgIT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpKSB7CisJaWYgKHVubGlrZWx5KGhkci0+bWFnaWMgIT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfQkxPQ0tfTUFHSUMpKSkgewogCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2RpcjJfYmxvY2tfYWRkbmFtZSIsCi0JCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgYmxvY2spOworCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGhkcik7CiAJCXhmc19kYV9icmVsc2UodHAsIGJwKTsKIAkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwogCX0KQEAgLTExOSw4ICsxMTYsOCBAQAogCS8qCiAJICogU2V0IHVwIHBvaW50ZXJzIHRvIHBhcnRzIG9mIHRoZSBibG9jay4KIAkgKi8KLQliZiA9IGJsb2NrLT5oZHIuYmVzdGZyZWU7Ci0JYnRwID0geGZzX2RpcjJfYmxvY2tfdGFpbF9wKG1wLCBibG9jayk7CisJYmYgPSBoZHItPmJlc3RmcmVlOworCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgaGRyKTsKIAlibHAgPSB4ZnNfZGlyMl9ibG9ja19sZWFmX3AoYnRwKTsKIAkvKgogCSAqIE5vIHN0YWxlIGVudHJpZXM/ICBOZWVkIHNwYWNlIGZvciBlbnRyeSBhbmQgbmV3IGxlYWYuCkBAIC0xMzMsNyArMTMwLDcgQEAKIAkJLyoKIAkJICogRGF0YSBvYmplY3QganVzdCBiZWZvcmUgdGhlIGZpcnN0IGxlYWYgZW50cnkuCiAJCSAqLwotCQllbmRkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWJsb2NrICsgYmUxNl90b19jcHUoKnRhZ3ApKTsKKwkJZW5kZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKiloZHIgKyBiZTE2X3RvX2NwdSgqdGFncCkpOwogCQkvKgogCQkgKiBJZiBpdCdzIG5vdCBmcmVlIHRoZW4gY2FuJ3QgZG8gdGhpcyBhZGQgd2l0aG91dCBjbGVhbmluZyB1cDoKIAkJICogdGhlIHNwYWNlIGJlZm9yZSB0aGUgZmlyc3QgbGVhZiBlbnRyeSBuZWVkcyB0byBiZSBmcmVlIHNvIGl0CkBAIC0xNDYsNyArMTQzLDcgQEAKIAkJICovCiAJCWVsc2UgewogCQkJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikKLQkJCSAgICAgICgoY2hhciAqKWJsb2NrICsgYmUxNl90b19jcHUoYmZbMF0ub2Zmc2V0KSk7CisJCQkgICAgICAoKGNoYXIgKiloZHIgKyBiZTE2X3RvX2NwdShiZlswXS5vZmZzZXQpKTsKIAkJCWlmIChkdXAgPT0gZW5kZHVwKSB7CiAJCQkJLyoKIAkJCQkgKiBJdCBpcyB0aGUgYmlnZ2VzdCBmcmVlc3BhY2UsIGlzIGl0IHRvbyBzbWFsbApAQCAtMTU5LDcgKzE1Niw3IEBACiAJCQkJCSAqLwogCQkJCQlpZiAoYmUxNl90b19jcHUoYmZbMV0ubGVuZ3RoKSA+PSBsZW4pCiAJCQkJCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKQotCQkJCQkJICAgICAgKChjaGFyICopYmxvY2sgKworCQkJCQkJICAgICAgKChjaGFyICopaGRyICsKIAkJCQkJCSAgICAgICBiZTE2X3RvX2NwdShiZlsxXS5vZmZzZXQpKTsKIAkJCQkJZWxzZQogCQkJCQkJZHVwID0gTlVMTDsKQEAgLTE4Miw3ICsxNzksNyBAQAogCSAqLwogCWVsc2UgaWYgKGJlMTZfdG9fY3B1KGJmWzBdLmxlbmd0aCkgPj0gbGVuKSB7CiAJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopCi0JCSAgICAgICgoY2hhciAqKWJsb2NrICsgYmUxNl90b19jcHUoYmZbMF0ub2Zmc2V0KSk7CisJCSAgICAgICgoY2hhciAqKWhkciArIGJlMTZfdG9fY3B1KGJmWzBdLm9mZnNldCkpOwogCQljb21wYWN0ID0gMDsKIAl9CiAJLyoKQEAgLTE5Niw3ICsxOTMsNyBAQAogCQkvKgogCQkgKiBEYXRhIG9iamVjdCBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgbGVhZiBlbnRyeS4KIAkJICovCi0JCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopKChjaGFyICopYmxvY2sgKyBiZTE2X3RvX2NwdSgqdGFncCkpOworCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWhkciArIGJlMTZfdG9fY3B1KCp0YWdwKSk7CiAJCS8qCiAJCSAqIElmIGl0J3Mgbm90IGZyZWUgdGhlbiB0aGUgZGF0YSB3aWxsIGdvIHdoZXJlIHRoZQogCQkgKiBsZWFmIGRhdGEgc3RhcnRzIG5vdywgaWYgaXQgd29ya3MgYXQgYWxsLgpAQCAtMjU1LDcgKzI1Miw4IEBACiAJCQloaWdoc3RhbGUgPSBsZmxvZ2hpZ2ggPSAtMTsKIAkJICAgICBmcm9taWR4ID49IDA7CiAJCSAgICAgZnJvbWlkeC0tKSB7Ci0JCQlpZiAoYmUzMl90b19jcHUoYmxwW2Zyb21pZHhdLmFkZHJlc3MpID09IFhGU19ESVIyX05VTExfREFUQVBUUikgeworCQkJaWYgKGJscFtmcm9taWR4XS5hZGRyZXNzID09CisJCQkgICAgY3B1X3RvX2JlMzIoWEZTX0RJUjJfTlVMTF9EQVRBUFRSKSkgewogCQkJCWlmIChoaWdoc3RhbGUgPT0gLTEpCiAJCQkJCWhpZ2hzdGFsZSA9IHRvaWR4OwogCQkJCWVsc2UgewpAQCAtMjcyLDcgKzI3MCw3IEBACiAJCWxmbG9naGlnaCAtPSBiZTMyX3RvX2NwdShidHAtPnN0YWxlKSAtIDE7CiAJCWJlMzJfYWRkX2NwdSgmYnRwLT5jb3VudCwgLShiZTMyX3RvX2NwdShidHAtPnN0YWxlKSAtIDEpKTsKIAkJeGZzX2RpcjJfZGF0YV9tYWtlX2ZyZWUodHAsIGJwLAotCQkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWJscCAtIChjaGFyICopYmxvY2spLAorCQkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWJscCAtIChjaGFyICopaGRyKSwKIAkJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGJlMzJfdG9fY3B1KGJ0cC0+c3RhbGUpIC0gMSkgKiBzaXplb2YoKmJscCkpLAogCQkJJm5lZWRsb2csICZuZWVkc2Nhbik7CiAJCWJscCArPSBiZTMyX3RvX2NwdShidHAtPnN0YWxlKSAtIDE7CkBAIC0yODIsNyArMjgwLDcgQEAKIAkJICogVGhpcyBuZWVkcyB0byBoYXBwZW4gYmVmb3JlIHRoZSBuZXh0IGNhbGwgdG8gdXNlX2ZyZWUuCiAJCSAqLwogCQlpZiAobmVlZHNjYW4pIHsKLQkJCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsICh4ZnNfZGlyMl9kYXRhX3QgKilibG9jaywgJm5lZWRsb2cpOworCQkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgaGRyLCAmbmVlZGxvZyk7CiAJCQluZWVkc2NhbiA9IDA7CiAJCX0KIAl9CkBAIC0zMTgsNyArMzE2LDcgQEAKIAkJICovCiAJCXhmc19kaXIyX2RhdGFfdXNlX2ZyZWUodHAsIGJwLCBlbmRkdXAsCiAJCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpCi0JCQkoKGNoYXIgKillbmRkdXAgLSAoY2hhciAqKWJsb2NrICsgYmUxNl90b19jcHUoZW5kZHVwLT5sZW5ndGgpIC0KKwkJCSgoY2hhciAqKWVuZGR1cCAtIChjaGFyICopaGRyICsgYmUxNl90b19jcHUoZW5kZHVwLT5sZW5ndGgpIC0KIAkJCSBzaXplb2YoKmJscCkpLAogCQkJKHhmc19kaXIyX2RhdGFfYW9mZl90KXNpemVvZigqYmxwKSwKIAkJCSZuZWVkbG9nLCAmbmVlZHNjYW4pOwpAQCAtMzMxLDggKzMyOSw3IEBACiAJCSAqIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGJlZm9yZSB0aGUgbmV4dCBjYWxsIHRvIHVzZV9mcmVlLgogCQkgKi8KIAkJaWYgKG5lZWRzY2FuKSB7Ci0JCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCAoeGZzX2RpcjJfZGF0YV90ICopYmxvY2ssCi0JCQkJJm5lZWRsb2cpOworCQkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgaGRyLCAmbmVlZGxvZyk7CiAJCQluZWVkc2NhbiA9IDA7CiAJCX0KIAkJLyoKQEAgLTM1MywxMiArMzUwLDE0IEBACiAJZWxzZSB7CiAJCWZvciAobG93c3RhbGUgPSBtaWQ7CiAJCSAgICAgbG93c3RhbGUgPj0gMCAmJgotCQkJYmUzMl90b19jcHUoYmxwW2xvd3N0YWxlXS5hZGRyZXNzKSAhPSBYRlNfRElSMl9OVUxMX0RBVEFQVFI7CisJCQlibHBbbG93c3RhbGVdLmFkZHJlc3MgIT0KKwkJCWNwdV90b19iZTMyKFhGU19ESVIyX05VTExfREFUQVBUUik7CiAJCSAgICAgbG93c3RhbGUtLSkKIAkJCWNvbnRpbnVlOwogCQlmb3IgKGhpZ2hzdGFsZSA9IG1pZCArIDE7CiAJCSAgICAgaGlnaHN0YWxlIDwgYmUzMl90b19jcHUoYnRwLT5jb3VudCkgJiYKLQkJCWJlMzJfdG9fY3B1KGJscFtoaWdoc3RhbGVdLmFkZHJlc3MpICE9IFhGU19ESVIyX05VTExfREFUQVBUUiAmJgorCQkJYmxwW2hpZ2hzdGFsZV0uYWRkcmVzcyAhPQorCQkJY3B1X3RvX2JlMzIoWEZTX0RJUjJfTlVMTF9EQVRBUFRSKSAmJgogCQkJKGxvd3N0YWxlIDwgMCB8fCBtaWQgLSBsb3dzdGFsZSA+IGhpZ2hzdGFsZSAtIG1pZCk7CiAJCSAgICAgaGlnaHN0YWxlKyspCiAJCQljb250aW51ZTsKQEAgLTM5NywxMyArMzk2LDEzIEBACiAJICovCiAJYmxwW21pZF0uaGFzaHZhbCA9IGNwdV90b19iZTMyKGFyZ3MtPmhhc2h2YWwpOwogCWJscFttaWRdLmFkZHJlc3MgPSBjcHVfdG9fYmUzMih4ZnNfZGlyMl9ieXRlX3RvX2RhdGFwdHIobXAsCi0JCQkJKGNoYXIgKilkZXAgLSAoY2hhciAqKWJsb2NrKSk7CisJCQkJKGNoYXIgKilkZXAgLSAoY2hhciAqKWhkcikpOwogCXhmc19kaXIyX2Jsb2NrX2xvZ19sZWFmKHRwLCBicCwgbGZsb2dsb3csIGxmbG9naGlnaCk7CiAJLyoKIAkgKiBNYXJrIHNwYWNlIGZvciB0aGUgZGF0YSBlbnRyeSB1c2VkLgogCSAqLwogCXhmc19kaXIyX2RhdGFfdXNlX2ZyZWUodHAsIGJwLCBkdXAsCi0JCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWJsb2NrKSwKKwkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWR1cCAtIChjaGFyICopaGRyKSwKIAkJKHhmc19kaXIyX2RhdGFfYW9mZl90KWxlbiwgJm5lZWRsb2csICZuZWVkc2Nhbik7CiAJLyoKIAkgKiBDcmVhdGUgdGhlIG5ldyBkYXRhIGVudHJ5LgpAQCAtNDEyLDEyICs0MTEsMTIgQEAKIAlkZXAtPm5hbWVsZW4gPSBhcmdzLT5uYW1lbGVuOwogCW1lbWNweShkZXAtPm5hbWUsIGFyZ3MtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pOwogCXRhZ3AgPSB4ZnNfZGlyMl9kYXRhX2VudHJ5X3RhZ19wKGRlcCk7Ci0JKnRhZ3AgPSBjcHVfdG9fYmUxNigoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spOworCSp0YWdwID0gY3B1X3RvX2JlMTYoKGNoYXIgKilkZXAgLSAoY2hhciAqKWhkcik7CiAJLyoKIAkgKiBDbGVhbiB1cCB0aGUgYmVzdGZyZWUgYXJyYXkgYW5kIGxvZyB0aGUgaGVhZGVyLCB0YWlsLCBhbmQgZW50cnkuCiAJICovCiAJaWYgKG5lZWRzY2FuKQotCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCAoeGZzX2RpcjJfZGF0YV90ICopYmxvY2ssICZuZWVkbG9nKTsKKwkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgaGRyLCAmbmVlZGxvZyk7CiAJaWYgKG5lZWRsb2cpCiAJCXhmc19kaXIyX2RhdGFfbG9nX2hlYWRlcih0cCwgYnApOwogCXhmc19kaXIyX2Jsb2NrX2xvZ190YWlsKHRwLCBicCk7CkBAIC00MzcsNyArNDM2LDcgQEAKIAl4ZnNfb2ZmX3QJCSpvZmZzZXQsCiAJZmlsbGRpcl90CQlmaWxsZGlyKQogewotCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogZGlyZWN0b3J5IGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2RhdGFfaGRyX3QJKmhkcjsJCS8qIGJsb2NrIGhlYWRlciAqLwogCXhmc19kYWJ1Zl90CQkqYnA7CQkvKiBidWZmZXIgZm9yIGJsb2NrICovCiAJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsICovCiAJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBibG9jayBkYXRhIGVudHJ5ICovCkBAIC00NzAsMTMgKzQ2OSwxMyBAQAogCSAqIFdlJ2xsIHNraXAgZW50cmllcyBiZWZvcmUgdGhpcy4KIAkgKi8KIAl3YW50b2ZmID0geGZzX2RpcjJfZGF0YXB0cl90b19vZmYobXAsICpvZmZzZXQpOwotCWJsb2NrID0gYnAtPmRhdGE7CisJaGRyID0gYnAtPmRhdGE7CiAJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgYnApOwogCS8qCiAJICogU2V0IHVwIHZhbHVlcyBmb3IgdGhlIGxvb3AuCiAJICovCi0JYnRwID0geGZzX2RpcjJfYmxvY2tfdGFpbF9wKG1wLCBibG9jayk7Ci0JcHRyID0gKGNoYXIgKilibG9jay0+dTsKKwlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsIGhkcik7CisJcHRyID0gKGNoYXIgKikoaGRyICsgMSk7CiAJZW5kcHRyID0gKGNoYXIgKil4ZnNfZGlyMl9ibG9ja19sZWFmX3AoYnRwKTsKIAogCS8qCkBAIC01MDIsMTEgKzUwMSwxMSBAQAogCQkvKgogCQkgKiBUaGUgZW50cnkgaXMgYmVmb3JlIHRoZSBkZXNpcmVkIHN0YXJ0aW5nIHBvaW50LCBza2lwIGl0LgogCQkgKi8KLQkJaWYgKChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jayA8IHdhbnRvZmYpCisJCWlmICgoY2hhciAqKWRlcCAtIChjaGFyICopaGRyIDwgd2FudG9mZikKIAkJCWNvbnRpbnVlOwogCiAJCWNvb2sgPSB4ZnNfZGlyMl9kYl9vZmZfdG9fZGF0YXB0cihtcCwgbXAtPm1fZGlyZGF0YWJsaywKLQkJCQkJICAgIChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jayk7CisJCQkJCSAgICAoY2hhciAqKWRlcCAtIChjaGFyICopaGRyKTsKIAogCQkvKgogCQkgKiBJZiBpdCBkaWRuJ3QgZml0LCBzZXQgdGhlIGZpbmFsIG9mZnNldCB0byBoZXJlICYgcmV0dXJuLgpAQCAtNTQwLDE3ICs1MzksMTQgQEAKIAlpbnQJCQlmaXJzdCwJCS8qIGluZGV4IG9mIGZpcnN0IGxvZ2dlZCBsZWFmICovCiAJaW50CQkJbGFzdCkJCS8qIGluZGV4IG9mIGxhc3QgbG9nZ2VkIGxlYWYgKi8KIHsKLQl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGRpcmVjdG9yeSBibG9jayBzdHJ1Y3R1cmUgKi8KLQl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmJscDsJCS8qIGJsb2NrIGxlYWYgZW50cmllcyAqLwotCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCAqLwotCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyID0gYnAtPmRhdGE7CisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpibHA7CisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CiAKLQltcCA9IHRwLT50X21vdW50cDsKLQlibG9jayA9IGJwLT5kYXRhOwotCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgYmxvY2spOworCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcCh0cC0+dF9tb3VudHAsIGhkcik7CiAJYmxwID0geGZzX2RpcjJfYmxvY2tfbGVhZl9wKGJ0cCk7Ci0JeGZzX2RhX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKikmYmxwW2ZpcnN0XSAtIChjaGFyICopYmxvY2spLAotCQkodWludCkoKGNoYXIgKikmYmxwW2xhc3QgKyAxXSAtIChjaGFyICopYmxvY2sgLSAxKSk7CisJeGZzX2RhX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKikmYmxwW2ZpcnN0XSAtIChjaGFyICopaGRyKSwKKwkJKHVpbnQpKChjaGFyICopJmJscFtsYXN0ICsgMV0gLSAoY2hhciAqKWhkciAtIDEpKTsKIH0KIAogLyoKQEAgLTU2MSwxNSArNTU3LDEyIEBACiAJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSAqLwogCXhmc19kYWJ1Zl90CQkqYnApCQkvKiBibG9jayBidWZmZXIgKi8KIHsKLQl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGRpcmVjdG9yeSBibG9jayBzdHJ1Y3R1cmUgKi8KLQl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIGJsb2NrIHRhaWwgKi8KLQl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19kaXIyX2RhdGFfaGRyX3QJKmhkciA9IGJwLT5kYXRhOworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwogCi0JbXAgPSB0cC0+dF9tb3VudHA7Ci0JYmxvY2sgPSBicC0+ZGF0YTsKLQlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsIGJsb2NrKTsKLQl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWJ0cCAtIChjaGFyICopYmxvY2spLAotCQkodWludCkoKGNoYXIgKikoYnRwICsgMSkgLSAoY2hhciAqKWJsb2NrIC0gMSkpOworCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcCh0cC0+dF9tb3VudHAsIGhkcik7CisJeGZzX2RhX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKilidHAgLSAoY2hhciAqKWhkciksCisJCSh1aW50KSgoY2hhciAqKShidHAgKyAxKSAtIChjaGFyICopaGRyIC0gMSkpOwogfQogCiAvKgpAQCAtNTgwLDcgKzU3Myw3IEBACiB4ZnNfZGlyMl9ibG9ja19sb29rdXAoCiAJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBkaXIgbG9va3VwIGFyZ3VtZW50cyAqLwogewotCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyOwkJLyogYmxvY2sgaGVhZGVyICovCiAJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpibHA7CQkvKiBibG9jayBsZWFmIGVudHJpZXMgKi8KIAl4ZnNfZGFidWZfdAkJKmJwOwkJLyogYmxvY2sgYnVmZmVyICovCiAJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsICovCkBAIC02MDAsMTQgKzU5MywxNCBAQAogCQlyZXR1cm4gZXJyb3I7CiAJZHAgPSBhcmdzLT5kcDsKIAltcCA9IGRwLT5pX21vdW50OwotCWJsb2NrID0gYnAtPmRhdGE7CisJaGRyID0gYnAtPmRhdGE7CiAJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgYnApOwotCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgYmxvY2spOworCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgaGRyKTsKIAlibHAgPSB4ZnNfZGlyMl9ibG9ja19sZWFmX3AoYnRwKTsKIAkvKgogCSAqIEdldCB0aGUgb2Zmc2V0IGZyb20gdGhlIGxlYWYgZW50cnksIHRvIHBvaW50IHRvIHRoZSBkYXRhLgogCSAqLwotCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikoKGNoYXIgKilibG9jayArCisJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKSgoY2hhciAqKWhkciArCiAJCXhmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKG1wLCBiZTMyX3RvX2NwdShibHBbZW50XS5hZGRyZXNzKSkpOwogCS8qCiAJICogRmlsbCBpbiBpbm9kZSBudW1iZXIsIENJIG5hbWUgaWYgYXBwcm9wcmlhdGUsIHJlbGVhc2UgdGhlIGJsb2NrLgpAQCAtNjI4LDcgKzYyMSw3IEBACiAJaW50CQkJKmVudG5vKQkJLyogcmV0dXJuZWQgZW50cnkgbnVtYmVyICovCiB7CiAJeGZzX2RpcjJfZGF0YXB0cl90CWFkZHI7CQkvKiBkYXRhIGVudHJ5IGFkZHJlc3MgKi8KLQl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2RhdGFfaGRyX3QJKmhkcjsJCS8qIGJsb2NrIGhlYWRlciAqLwogCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqYmxwOwkJLyogYmxvY2sgbGVhZiBlbnRyaWVzICovCiAJeGZzX2RhYnVmX3QJCSpicDsJCS8qIGJsb2NrIGJ1ZmZlciAqLwogCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCAqLwpAQCAtNjU0LDkgKzY0Nyw5IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAJQVNTRVJUKGJwICE9IE5VTEwpOwotCWJsb2NrID0gYnAtPmRhdGE7CisJaGRyID0gYnAtPmRhdGE7CiAJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgYnApOwotCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgYmxvY2spOworCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgaGRyKTsKIAlibHAgPSB4ZnNfZGlyMl9ibG9ja19sZWFmX3AoYnRwKTsKIAkvKgogCSAqIExvb3AgZG9pbmcgYSBiaW5hcnkgc2VhcmNoIGZvciBvdXIgaGFzaCB2YWx1ZS4KQEAgLTY5NCw3ICs2ODcsNyBAQAogCQkgKiBHZXQgcG9pbnRlciB0byB0aGUgZW50cnkgZnJvbSB0aGUgbGVhZi4KIAkJICovCiAJCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKLQkJCSgoY2hhciAqKWJsb2NrICsgeGZzX2RpcjJfZGF0YXB0cl90b19vZmYobXAsIGFkZHIpKTsKKwkJCSgoY2hhciAqKWhkciArIHhmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKG1wLCBhZGRyKSk7CiAJCS8qCiAJCSAqIENvbXBhcmUgbmFtZSBhbmQgaWYgaXQncyBhbiBleGFjdCBtYXRjaCwgcmV0dXJuIHRoZSBpbmRleAogCQkgKiBhbmQgYnVmZmVyLiBJZiBpdCdzIHRoZSBmaXJzdCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoLCBzdG9yZQpAQCAtNzMzLDcgKzcyNiw3IEBACiB4ZnNfZGlyMl9ibG9ja19yZW1vdmVuYW1lKAogCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogZGlyZWN0b3J5IG9wZXJhdGlvbiBhcmdzICovCiB7Ci0JeGZzX2RpcjJfYmxvY2tfdAkqYmxvY2s7CQkvKiBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9kYXRhX2hkcl90CSpoZHI7CQkvKiBibG9jayBoZWFkZXIgKi8KIAl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmJscDsJCS8qIGJsb2NrIGxlYWYgcG9pbnRlciAqLwogCXhmc19kYWJ1Zl90CQkqYnA7CQkvKiBibG9jayBidWZmZXIgKi8KIAl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIGJsb2NrIHRhaWwgKi8KQEAgLTc2MCwyMCArNzUzLDIwIEBACiAJZHAgPSBhcmdzLT5kcDsKIAl0cCA9IGFyZ3MtPnRyYW5zOwogCW1wID0gZHAtPmlfbW91bnQ7Ci0JYmxvY2sgPSBicC0+ZGF0YTsKLQlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsIGJsb2NrKTsKKwloZHIgPSBicC0+ZGF0YTsKKwlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsIGhkcik7CiAJYmxwID0geGZzX2RpcjJfYmxvY2tfbGVhZl9wKGJ0cCk7CiAJLyoKIAkgKiBQb2ludCB0byB0aGUgZGF0YSBlbnRyeSB1c2luZyB0aGUgbGVhZiBlbnRyeS4KIAkgKi8KIAlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopCi0JICAgICAgKChjaGFyICopYmxvY2sgKyB4ZnNfZGlyMl9kYXRhcHRyX3RvX29mZihtcCwgYmUzMl90b19jcHUoYmxwW2VudF0uYWRkcmVzcykpKTsKKwkgICAgICAoKGNoYXIgKiloZHIgKyB4ZnNfZGlyMl9kYXRhcHRyX3RvX29mZihtcCwgYmUzMl90b19jcHUoYmxwW2VudF0uYWRkcmVzcykpKTsKIAkvKgogCSAqIE1hcmsgdGhlIGRhdGEgZW50cnkncyBzcGFjZSBmcmVlLgogCSAqLwogCW5lZWRsb2cgPSBuZWVkc2NhbiA9IDA7CiAJeGZzX2RpcjJfZGF0YV9tYWtlX2ZyZWUodHAsIGJwLAotCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jayksCisJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilkZXAgLSAoY2hhciAqKWhkciksCiAJCXhmc19kaXIyX2RhdGFfZW50c2l6ZShkZXAtPm5hbWVsZW4pLCAmbmVlZGxvZywgJm5lZWRzY2FuKTsKIAkvKgogCSAqIEZpeCB1cCB0aGUgYmxvY2sgdGFpbC4KQEAgLTc4OSwxNSArNzgyLDE1IEBACiAJICogRml4IHVwIGJlc3RmcmVlLCBsb2cgdGhlIGhlYWRlciBpZiBuZWNlc3NhcnkuCiAJICovCiAJaWYgKG5lZWRzY2FuKQotCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCAoeGZzX2RpcjJfZGF0YV90ICopYmxvY2ssICZuZWVkbG9nKTsKKwkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgaGRyLCAmbmVlZGxvZyk7CiAJaWYgKG5lZWRsb2cpCiAJCXhmc19kaXIyX2RhdGFfbG9nX2hlYWRlcih0cCwgYnApOwogCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGJwKTsKIAkvKgogCSAqIFNlZSBpZiB0aGUgc2l6ZSBhcyBhIHNob3J0Zm9ybSBpcyBnb29kIGVub3VnaC4KIAkgKi8KLQlpZiAoKHNpemUgPSB4ZnNfZGlyMl9ibG9ja19zZnNpemUoZHAsIGJsb2NrLCAmc2ZoKSkgPgotCSAgICBYRlNfSUZPUktfRFNJWkUoZHApKSB7CisJc2l6ZSA9IHhmc19kaXIyX2Jsb2NrX3Nmc2l6ZShkcCwgaGRyLCAmc2ZoKTsKKwlpZiAoc2l6ZSA+IFhGU19JRk9SS19EU0laRShkcCkpIHsKIAkJeGZzX2RhX2J1Zl9kb25lKGJwKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtODE1LDcgKzgwOCw3IEBACiB4ZnNfZGlyMl9ibG9ja19yZXBsYWNlKAogCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogZGlyZWN0b3J5IG9wZXJhdGlvbiBhcmdzICovCiB7Ci0JeGZzX2RpcjJfYmxvY2tfdAkqYmxvY2s7CQkvKiBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9kYXRhX2hkcl90CSpoZHI7CQkvKiBibG9jayBoZWFkZXIgKi8KIAl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmJscDsJCS8qIGJsb2NrIGxlYWYgZW50cmllcyAqLwogCXhmc19kYWJ1Zl90CQkqYnA7CQkvKiBibG9jayBidWZmZXIgKi8KIAl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIGJsb2NrIHRhaWwgKi8KQEAgLTgzNiwxNCArODI5LDE0IEBACiAJfQogCWRwID0gYXJncy0+ZHA7CiAJbXAgPSBkcC0+aV9tb3VudDsKLQlibG9jayA9IGJwLT5kYXRhOwotCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgYmxvY2spOworCWhkciA9IGJwLT5kYXRhOworCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgaGRyKTsKIAlibHAgPSB4ZnNfZGlyMl9ibG9ja19sZWFmX3AoYnRwKTsKIAkvKgogCSAqIFBvaW50IHRvIHRoZSBkYXRhIGVudHJ5IHdlIG5lZWQgdG8gY2hhbmdlLgogCSAqLwogCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKLQkgICAgICAoKGNoYXIgKilibG9jayArIHhmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKG1wLCBiZTMyX3RvX2NwdShibHBbZW50XS5hZGRyZXNzKSkpOworCSAgICAgICgoY2hhciAqKWhkciArIHhmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKG1wLCBiZTMyX3RvX2NwdShibHBbZW50XS5hZGRyZXNzKSkpOwogCUFTU0VSVChiZTY0X3RvX2NwdShkZXAtPmludW1iZXIpICE9IGFyZ3MtPmludW1iZXIpOwogCS8qCiAJICogQ2hhbmdlIHRoZSBpbm9kZSBudW1iZXIgdG8gdGhlIG5ldyB2YWx1ZS4KQEAgLTg4Miw3ICs4NzUsNyBAQAogCXhmc19kYWJ1Zl90CQkqZGJwKQkJLyogZGF0YSBidWZmZXIgKi8KIHsKIAlfX2JlMTYJCQkqYmVzdHNwOwkvKiBsZWFmIGJlc3RzIHRhYmxlICovCi0JeGZzX2RpcjJfYmxvY2tfdAkqYmxvY2s7CQkvKiBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9kYXRhX2hkcl90CSpoZHI7CQkvKiBibG9jayBoZWFkZXIgKi8KIAl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIGJsb2NrIHRhaWwgKi8KIAl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLwogCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cDsJCS8qIHVudXNlZCBkYXRhIGVudHJ5ICovCkBAIC05MDYsNyArODk5LDcgQEAKIAl0cCA9IGFyZ3MtPnRyYW5zOwogCW1wID0gZHAtPmlfbW91bnQ7CiAJbGVhZiA9IGxicC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19ESVIyX0xFQUYxX01BR0lDKTsKKwlBU1NFUlQobGVhZi0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RJUjJfTEVBRjFfTUFHSUMpKTsKIAlsdHAgPSB4ZnNfZGlyMl9sZWFmX3RhaWxfcChtcCwgbGVhZik7CiAJLyoKIAkgKiBJZiB0aGVyZSBhcmUgZGF0YSBibG9ja3Mgb3RoZXIgdGhhbiB0aGUgZmlyc3Qgb25lLCB0YWtlIHRoaXMKQEAgLTkxNyw3ICs5MTAsNyBAQAogCXdoaWxlIChkcC0+aV9kLmRpX3NpemUgPiBtcC0+bV9kaXJibGtzaXplKSB7CiAJCWJlc3RzcCA9IHhmc19kaXIyX2xlYWZfYmVzdHNfcChsdHApOwogCQlpZiAoYmUxNl90b19jcHUoYmVzdHNwW2JlMzJfdG9fY3B1KGx0cC0+YmVzdGNvdW50KSAtIDFdKSA9PQotCQkgICAgbXAtPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZihibG9jay0+aGRyKSkgeworCQkgICAgbXAtPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZigqaGRyKSkgewogCQkJaWYgKChlcnJvciA9CiAJCQkgICAgeGZzX2RpcjJfbGVhZl90cmltX2RhdGEoYXJncywgbGJwLAogCQkJCSAgICAoeGZzX2RpcjJfZGJfdCkoYmUzMl90b19jcHUobHRwLT5iZXN0Y291bnQpIC0gMSkpKSkKQEAgLTkzNSwxOCArOTI4LDE4IEBACiAJCSAgICBYRlNfREFUQV9GT1JLKSkpIHsKIAkJZ290byBvdXQ7CiAJfQotCWJsb2NrID0gZGJwLT5kYXRhOwotCUFTU0VSVChiZTMyX3RvX2NwdShibG9jay0+aGRyLm1hZ2ljKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDKTsKKwloZHIgPSBkYnAtPmRhdGE7CisJQVNTRVJUKGhkci0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfREFUQV9NQUdJQykpOwogCS8qCiAJICogU2l6ZSBvZiB0aGUgImxlYWYiIGFyZWEgaW4gdGhlIGJsb2NrLgogCSAqLwotCXNpemUgPSAodWludClzaXplb2YoYmxvY2stPnRhaWwpICsKKwlzaXplID0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2Jsb2NrX3RhaWxfdCkgKwogCSAgICAgICAodWludClzaXplb2YoKmxlcCkgKiAoYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSAtIGJlMTZfdG9fY3B1KGxlYWYtPmhkci5zdGFsZSkpOwogCS8qCiAJICogTG9vayBhdCB0aGUgbGFzdCBkYXRhIGVudHJ5LgogCSAqLwotCXRhZ3AgPSAoX19iZTE2ICopKChjaGFyICopYmxvY2sgKyBtcC0+bV9kaXJibGtzaXplKSAtIDE7Ci0JZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKilibG9jayArIGJlMTZfdG9fY3B1KCp0YWdwKSk7CisJdGFncCA9IChfX2JlMTYgKikoKGNoYXIgKiloZHIgKyBtcC0+bV9kaXJibGtzaXplKSAtIDE7CisJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKiloZHIgKyBiZTE2X3RvX2NwdSgqdGFncCkpOwogCS8qCiAJICogSWYgaXQncyBub3QgZnJlZSBvciBpcyB0b28gc2hvcnQgd2UgY2FuJ3QgZG8gaXQuCiAJICovCkBAIC05NTgsNyArOTUxLDcgQEAKIAkvKgogCSAqIFN0YXJ0IGNvbnZlcnRpbmcgaXQgdG8gYmxvY2sgZm9ybS4KIAkgKi8KLQlibG9jay0+aGRyLm1hZ2ljID0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfQkxPQ0tfTUFHSUMpOworCWhkci0+bWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfRElSMl9CTE9DS19NQUdJQyk7CiAJbmVlZGxvZyA9IDE7CiAJbmVlZHNjYW4gPSAwOwogCS8qCkBAIC05NjksNyArOTYyLDcgQEAKIAkvKgogCSAqIEluaXRpYWxpemUgdGhlIGJsb2NrIHRhaWwuCiAJICovCi0JYnRwID0geGZzX2RpcjJfYmxvY2tfdGFpbF9wKG1wLCBibG9jayk7CisJYnRwID0geGZzX2RpcjJfYmxvY2tfdGFpbF9wKG1wLCBoZHIpOwogCWJ0cC0+Y291bnQgPSBjcHVfdG9fYmUzMihiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpIC0gYmUxNl90b19jcHUobGVhZi0+aGRyLnN0YWxlKSk7CiAJYnRwLT5zdGFsZSA9IDA7CiAJeGZzX2RpcjJfYmxvY2tfbG9nX3RhaWwodHAsIGRicCk7CkBAIC05NzgsNyArOTcxLDggQEAKIAkgKi8KIAlsZXAgPSB4ZnNfZGlyMl9ibG9ja19sZWFmX3AoYnRwKTsKIAlmb3IgKGZyb20gPSB0byA9IDA7IGZyb20gPCBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpOyBmcm9tKyspIHsKLQkJaWYgKGJlMzJfdG9fY3B1KGxlYWYtPmVudHNbZnJvbV0uYWRkcmVzcykgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKQorCQlpZiAobGVhZi0+ZW50c1tmcm9tXS5hZGRyZXNzID09CisJCSAgICBjcHVfdG9fYmUzMihYRlNfRElSMl9OVUxMX0RBVEFQVFIpKQogCQkJY29udGludWU7CiAJCWxlcFt0bysrXSA9IGxlYWYtPmVudHNbZnJvbV07CiAJfQpAQCAtOTg4LDcgKzk4Miw3IEBACiAJICogU2NhbiB0aGUgYmVzdGZyZWUgaWYgd2UgbmVlZCBpdCBhbmQgbG9nIHRoZSBkYXRhIGJsb2NrIGhlYWRlci4KIAkgKi8KIAlpZiAobmVlZHNjYW4pCi0JCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsICh4ZnNfZGlyMl9kYXRhX3QgKilibG9jaywgJm5lZWRsb2cpOworCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCBoZHIsICZuZWVkbG9nKTsKIAlpZiAobmVlZGxvZykKIAkJeGZzX2RpcjJfZGF0YV9sb2dfaGVhZGVyKHRwLCBkYnApOwogCS8qCkBAIC0xMDAyLDggKzk5Niw4IEBACiAJLyoKIAkgKiBOb3cgc2VlIGlmIHRoZSByZXN1bHRpbmcgYmxvY2sgY2FuIGJlIHNocnVua2VuIHRvIHNob3J0Zm9ybS4KIAkgKi8KLQlpZiAoKHNpemUgPSB4ZnNfZGlyMl9ibG9ja19zZnNpemUoZHAsIGJsb2NrLCAmc2ZoKSkgPgotCSAgICBYRlNfSUZPUktfRFNJWkUoZHApKSB7CisJc2l6ZSA9IHhmc19kaXIyX2Jsb2NrX3Nmc2l6ZShkcCwgaGRyLCAmc2ZoKTsKKwlpZiAoc2l6ZSA+IFhGU19JRk9SS19EU0laRShkcCkpIHsKIAkJZXJyb3IgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMDI0LDEyICsxMDE4LDEwIEBACiAJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCiB7CiAJeGZzX2RpcjJfZGJfdAkJYmxrbm87CQkvKiBkaXItcmVsYXRpdmUgYmxvY2sgIyAoMCkgKi8KLQl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2RhdGFfaGRyX3QJKmhkcjsJCS8qIGJsb2NrIGhlYWRlciAqLwogCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqYmxwOwkJLyogYmxvY2sgbGVhZiBlbnRyaWVzICovCiAJeGZzX2RhYnVmX3QJCSpicDsJCS8qIGJsb2NrIGJ1ZmZlciAqLwogCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCBwb2ludGVyICovCi0JY2hhcgkJCSpidWY7CQkvKiBzZiBidWZmZXIgKi8KLQlpbnQJCQlidWZfbGVuOwogCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBlbnRyeSBwb2ludGVyICovCiAJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KIAlpbnQJCQlkdW1teTsJCS8qIHRyYXNoICovCkBAIC0xMDQzLDcgKzEwMzUsOCBAQAogCWludAkJCW5ld29mZnNldDsJLyogb2Zmc2V0IGZyb20gY3VycmVudCBlbnRyeSAqLwogCWludAkJCW9mZnNldDsJCS8qIHRhcmdldCBibG9jayBvZmZzZXQgKi8KIAl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2YgZW50cnkgcG9pbnRlciAqLwotCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisJeGZzX2RpcjJfc2ZfaGRyX3QJKm9sZHNmcDsJLyogb2xkIHNob3J0Zm9ybSBoZWFkZXIgICovCisJeGZzX2RpcjJfc2ZfaGRyX3QJKnNmcDsJCS8qIHNob3J0Zm9ybSBoZWFkZXIgICovCiAJX19iZTE2CQkJKnRhZ3A7CQkvKiBlbmQgb2YgZGF0YSBlbnRyeSAqLwogCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCiAJc3RydWN0IHhmc19uYW1lCQluYW1lOwpAQCAtMTA2MSwzMiArMTA1NCwzMCBAQAogCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOwogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CiAJfQorCisJb2xkc2ZwID0gKHhmc19kaXIyX3NmX2hkcl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwogCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOwogCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOwotCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKLQlBU1NFUlQoZHAtPmlfZC5kaV9zaXplID49IHhmc19kaXIyX3NmX2hkcl9zaXplKHNmcC0+aGRyLmk4Y291bnQpKTsKKwlBU1NFUlQoZHAtPmlfZC5kaV9zaXplID49IHhmc19kaXIyX3NmX2hkcl9zaXplKG9sZHNmcC0+aThjb3VudCkpOworCiAJLyoKLQkgKiBDb3B5IHRoZSBkaXJlY3RvcnkgaW50byB0aGUgc3RhY2sgYnVmZmVyLgorCSAqIENvcHkgdGhlIGRpcmVjdG9yeSBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlci4KIAkgKiBUaGVuIHBpdGNoIHRoZSBpbmNvcmUgaW5vZGUgZGF0YSBzbyB3ZSBjYW4gbWFrZSBleHRlbnRzLgogCSAqLworCXNmcCA9IGttZW1fYWxsb2MoZHAtPmlfZGYuaWZfYnl0ZXMsIEtNX1NMRUVQKTsKKwltZW1jcHkoc2ZwLCBvbGRzZnAsIGRwLT5pX2RmLmlmX2J5dGVzKTsKIAotCWJ1Zl9sZW4gPSBkcC0+aV9kZi5pZl9ieXRlczsKLQlidWYgPSBrbWVtX2FsbG9jKGJ1Zl9sZW4sIEtNX1NMRUVQKTsKLQotCW1lbWNweShidWYsIHNmcCwgYnVmX2xlbik7Ci0JeGZzX2lkYXRhX3JlYWxsb2MoZHAsIC1idWZfbGVuLCBYRlNfREFUQV9GT1JLKTsKKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgLWRwLT5pX2RmLmlmX2J5dGVzLCBYRlNfREFUQV9GT1JLKTsKIAlkcC0+aV9kLmRpX3NpemUgPSAwOwogCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGRwLCBYRlNfSUxPR19DT1JFKTsKLQkvKgotCSAqIFJlc2V0IHBvaW50ZXIgLSBvbGQgc2ZwIGlzIGdvbmUuCi0JICovCi0Jc2ZwID0gKHhmc19kaXIyX3NmX3QgKilidWY7CisKIAkvKgogCSAqIEFkZCBibG9jayAwIHRvIHRoZSBpbm9kZS4KIAkgKi8KIAllcnJvciA9IHhmc19kaXIyX2dyb3dfaW5vZGUoYXJncywgWEZTX0RJUjJfREFUQV9TUEFDRSwgJmJsa25vKTsKIAlpZiAoZXJyb3IpIHsKLQkJa21lbV9mcmVlKGJ1Zik7CisJCWttZW1fZnJlZShzZnApOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCS8qCkBAIC0xMDk0LDIxICsxMDg1LDIxIEBACiAJICovCiAJZXJyb3IgPSB4ZnNfZGlyMl9kYXRhX2luaXQoYXJncywgYmxrbm8sICZicCk7CiAJaWYgKGVycm9yKSB7Ci0JCWttZW1fZnJlZShidWYpOworCQlrbWVtX2ZyZWUoc2ZwKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KLQlibG9jayA9IGJwLT5kYXRhOwotCWJsb2NrLT5oZHIubWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfRElSMl9CTE9DS19NQUdJQyk7CisJaGRyID0gYnAtPmRhdGE7CisJaGRyLT5tYWdpYyA9IGNwdV90b19iZTMyKFhGU19ESVIyX0JMT0NLX01BR0lDKTsKIAkvKgogCSAqIENvbXB1dGUgc2l6ZSBvZiBibG9jayAidGFpbCIgYXJlYS4KIAkgKi8KIAlpID0gKHVpbnQpc2l6ZW9mKCpidHApICsKLQkgICAgKHNmcC0+aGRyLmNvdW50ICsgMikgKiAodWludClzaXplb2YoeGZzX2RpcjJfbGVhZl9lbnRyeV90KTsKKwkgICAgKHNmcC0+Y291bnQgKyAyKSAqICh1aW50KXNpemVvZih4ZnNfZGlyMl9sZWFmX2VudHJ5X3QpOwogCS8qCiAJICogVGhlIHdob2xlIHRoaW5nIGlzIGluaXRpYWxpemVkIHRvIGZyZWUgYnkgdGhlIGluaXQgcm91dGluZS4KIAkgKiBTYXkgd2UncmUgdXNpbmcgdGhlIGxlYWYgYW5kIHRhaWwgYXJlYS4KIAkgKi8KLQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKWJsb2NrLT51OworCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopKGhkciArIDEpOwogCW5lZWRsb2cgPSBuZWVkc2NhbiA9IDA7CiAJeGZzX2RpcjJfZGF0YV91c2VfZnJlZSh0cCwgYnAsIGR1cCwgbXAtPm1fZGlyYmxrc2l6ZSAtIGksIGksICZuZWVkbG9nLAogCQkmbmVlZHNjYW4pOwpAQCAtMTExNiw1MCArMTEwNyw1MSBAQAogCS8qCiAJICogRmlsbCBpbiB0aGUgdGFpbC4KIAkgKi8KLQlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsIGJsb2NrKTsKLQlidHAtPmNvdW50ID0gY3B1X3RvX2JlMzIoc2ZwLT5oZHIuY291bnQgKyAyKTsJLyogLiwgLi4gKi8KKwlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsIGhkcik7CisJYnRwLT5jb3VudCA9IGNwdV90b19iZTMyKHNmcC0+Y291bnQgKyAyKTsJLyogLiwgLi4gKi8KIAlidHAtPnN0YWxlID0gMDsKIAlibHAgPSB4ZnNfZGlyMl9ibG9ja19sZWFmX3AoYnRwKTsKLQllbmRvZmZzZXQgPSAodWludCkoKGNoYXIgKilibHAgLSAoY2hhciAqKWJsb2NrKTsKKwllbmRvZmZzZXQgPSAodWludCkoKGNoYXIgKilibHAgLSAoY2hhciAqKWhkcik7CiAJLyoKIAkgKiBSZW1vdmUgdGhlIGZyZWVzcGFjZSwgd2UnbGwgbWFuYWdlIGl0LgogCSAqLwogCXhmc19kaXIyX2RhdGFfdXNlX2ZyZWUodHAsIGJwLCBkdXAsCi0JCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWJsb2NrKSwKKwkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWR1cCAtIChjaGFyICopaGRyKSwKIAkJYmUxNl90b19jcHUoZHVwLT5sZW5ndGgpLCAmbmVlZGxvZywgJm5lZWRzY2FuKTsKIAkvKgogCSAqIENyZWF0ZSBlbnRyeSBmb3IgLgogCSAqLwogCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKLQkgICAgICAoKGNoYXIgKilibG9jayArIFhGU19ESVIyX0RBVEFfRE9UX09GRlNFVCk7CisJICAgICAgKChjaGFyICopaGRyICsgWEZTX0RJUjJfREFUQV9ET1RfT0ZGU0VUKTsKIAlkZXAtPmludW1iZXIgPSBjcHVfdG9fYmU2NChkcC0+aV9pbm8pOwogCWRlcC0+bmFtZWxlbiA9IDE7CiAJZGVwLT5uYW1lWzBdID0gJy4nOwogCXRhZ3AgPSB4ZnNfZGlyMl9kYXRhX2VudHJ5X3RhZ19wKGRlcCk7Ci0JKnRhZ3AgPSBjcHVfdG9fYmUxNigoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spOworCSp0YWdwID0gY3B1X3RvX2JlMTYoKGNoYXIgKilkZXAgLSAoY2hhciAqKWhkcik7CiAJeGZzX2RpcjJfZGF0YV9sb2dfZW50cnkodHAsIGJwLCBkZXApOwogCWJscFswXS5oYXNodmFsID0gY3B1X3RvX2JlMzIoeGZzX2Rpcl9oYXNoX2RvdCk7CiAJYmxwWzBdLmFkZHJlc3MgPSBjcHVfdG9fYmUzMih4ZnNfZGlyMl9ieXRlX3RvX2RhdGFwdHIobXAsCi0JCQkJKGNoYXIgKilkZXAgLSAoY2hhciAqKWJsb2NrKSk7CisJCQkJKGNoYXIgKilkZXAgLSAoY2hhciAqKWhkcikpOwogCS8qCiAJICogQ3JlYXRlIGVudHJ5IGZvciAuLgogCSAqLwogCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKLQkJKChjaGFyICopYmxvY2sgKyBYRlNfRElSMl9EQVRBX0RPVERPVF9PRkZTRVQpOwotCWRlcC0+aW51bWJlciA9IGNwdV90b19iZTY0KHhmc19kaXIyX3NmX2dldF9pbnVtYmVyKHNmcCwgJnNmcC0+aGRyLnBhcmVudCkpOworCQkoKGNoYXIgKiloZHIgKyBYRlNfRElSMl9EQVRBX0RPVERPVF9PRkZTRVQpOworCWRlcC0+aW51bWJlciA9IGNwdV90b19iZTY0KHhmc19kaXIyX3NmX2dldF9wYXJlbnRfaW5vKHNmcCkpOwogCWRlcC0+bmFtZWxlbiA9IDI7CiAJZGVwLT5uYW1lWzBdID0gZGVwLT5uYW1lWzFdID0gJy4nOwogCXRhZ3AgPSB4ZnNfZGlyMl9kYXRhX2VudHJ5X3RhZ19wKGRlcCk7Ci0JKnRhZ3AgPSBjcHVfdG9fYmUxNigoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spOworCSp0YWdwID0gY3B1X3RvX2JlMTYoKGNoYXIgKilkZXAgLSAoY2hhciAqKWhkcik7CiAJeGZzX2RpcjJfZGF0YV9sb2dfZW50cnkodHAsIGJwLCBkZXApOwogCWJscFsxXS5oYXNodmFsID0gY3B1X3RvX2JlMzIoeGZzX2Rpcl9oYXNoX2RvdGRvdCk7CiAJYmxwWzFdLmFkZHJlc3MgPSBjcHVfdG9fYmUzMih4ZnNfZGlyMl9ieXRlX3RvX2RhdGFwdHIobXAsCi0JCQkJKGNoYXIgKilkZXAgLSAoY2hhciAqKWJsb2NrKSk7CisJCQkJKGNoYXIgKilkZXAgLSAoY2hhciAqKWhkcikpOwogCW9mZnNldCA9IFhGU19ESVIyX0RBVEFfRklSU1RfT0ZGU0VUOwogCS8qCiAJICogTG9vcCBvdmVyIGV4aXN0aW5nIGVudHJpZXMsIHN0dWZmIHRoZW0gaW4uCiAJICovCi0JaWYgKChpID0gMCkgPT0gc2ZwLT5oZHIuY291bnQpCisJaSA9IDA7CisJaWYgKCFzZnAtPmNvdW50KQogCQlzZmVwID0gTlVMTDsKIAllbHNlCiAJCXNmZXAgPSB4ZnNfZGlyMl9zZl9maXJzdGVudHJ5KHNmcCk7CkBAIC0xMTc5LDQzICsxMTcxLDQwIEBACiAJCSAqIFRoZXJlIHNob3VsZCBiZSBhIGhvbGUgaGVyZSwgbWFrZSBvbmUuCiAJCSAqLwogCQlpZiAob2Zmc2V0IDwgbmV3b2Zmc2V0KSB7Ci0JCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKQotCQkJICAgICAgKChjaGFyICopYmxvY2sgKyBvZmZzZXQpOworCQkJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKiloZHIgKyBvZmZzZXQpOwogCQkJZHVwLT5mcmVldGFnID0gY3B1X3RvX2JlMTYoWEZTX0RJUjJfREFUQV9GUkVFX1RBRyk7CiAJCQlkdXAtPmxlbmd0aCA9IGNwdV90b19iZTE2KG5ld29mZnNldCAtIG9mZnNldCk7CiAJCQkqeGZzX2RpcjJfZGF0YV91bnVzZWRfdGFnX3AoZHVwKSA9IGNwdV90b19iZTE2KAotCQkJCSgoY2hhciAqKWR1cCAtIChjaGFyICopYmxvY2spKTsKKwkJCQkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWhkcikpOwogCQkJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHRwLCBicCwgZHVwKTsKLQkJCSh2b2lkKXhmc19kaXIyX2RhdGFfZnJlZWluc2VydCgoeGZzX2RpcjJfZGF0YV90ICopYmxvY2ssCi0JCQkJZHVwLCAmZHVtbXkpOworCQkJeGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGhkciwgZHVwLCAmZHVtbXkpOwogCQkJb2Zmc2V0ICs9IGJlMTZfdG9fY3B1KGR1cC0+bGVuZ3RoKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCS8qCiAJCSAqIENvcHkgYSByZWFsIGVudHJ5LgogCQkgKi8KLQkJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKSgoY2hhciAqKWJsb2NrICsgbmV3b2Zmc2V0KTsKLQkJZGVwLT5pbnVtYmVyID0gY3B1X3RvX2JlNjQoeGZzX2RpcjJfc2ZfZ2V0X2ludW1iZXIoc2ZwLAotCQkJCXhmc19kaXIyX3NmX2ludW1iZXJwKHNmZXApKSk7CisJCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikoKGNoYXIgKiloZHIgKyBuZXdvZmZzZXQpOworCQlkZXAtPmludW1iZXIgPSBjcHVfdG9fYmU2NCh4ZnNfZGlyMl9zZmVfZ2V0X2lubyhzZnAsIHNmZXApKTsKIAkJZGVwLT5uYW1lbGVuID0gc2ZlcC0+bmFtZWxlbjsKIAkJbWVtY3B5KGRlcC0+bmFtZSwgc2ZlcC0+bmFtZSwgZGVwLT5uYW1lbGVuKTsKIAkJdGFncCA9IHhmc19kaXIyX2RhdGFfZW50cnlfdGFnX3AoZGVwKTsKLQkJKnRhZ3AgPSBjcHVfdG9fYmUxNigoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spOworCQkqdGFncCA9IGNwdV90b19iZTE2KChjaGFyICopZGVwIC0gKGNoYXIgKiloZHIpOwogCQl4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeSh0cCwgYnAsIGRlcCk7CiAJCW5hbWUubmFtZSA9IHNmZXAtPm5hbWU7CiAJCW5hbWUubGVuID0gc2ZlcC0+bmFtZWxlbjsKIAkJYmxwWzIgKyBpXS5oYXNodmFsID0gY3B1X3RvX2JlMzIobXAtPm1fZGlybmFtZW9wcy0+CiAJCQkJCQkJaGFzaG5hbWUoJm5hbWUpKTsKIAkJYmxwWzIgKyBpXS5hZGRyZXNzID0gY3B1X3RvX2JlMzIoeGZzX2RpcjJfYnl0ZV90b19kYXRhcHRyKG1wLAotCQkJCQkJIChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jaykpOwotCQlvZmZzZXQgPSAoaW50KSgoY2hhciAqKSh0YWdwICsgMSkgLSAoY2hhciAqKWJsb2NrKTsKLQkJaWYgKCsraSA9PSBzZnAtPmhkci5jb3VudCkKKwkJCQkJCSAoY2hhciAqKWRlcCAtIChjaGFyICopaGRyKSk7CisJCW9mZnNldCA9IChpbnQpKChjaGFyICopKHRhZ3AgKyAxKSAtIChjaGFyICopaGRyKTsKKwkJaWYgKCsraSA9PSBzZnAtPmNvdW50KQogCQkJc2ZlcCA9IE5VTEw7CiAJCWVsc2UKIAkJCXNmZXAgPSB4ZnNfZGlyMl9zZl9uZXh0ZW50cnkoc2ZwLCBzZmVwKTsKIAl9CiAJLyogRG9uZSB3aXRoIHRoZSB0ZW1wb3JhcnkgYnVmZmVyICovCi0Ja21lbV9mcmVlKGJ1Zik7CisJa21lbV9mcmVlKHNmcCk7CiAJLyoKIAkgKiBTb3J0IHRoZSBsZWFmIGVudHJpZXMgYnkgaGFzaCB2YWx1ZS4KIAkgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9ibG9jay5oIGIvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZTY4OTYuLjAwMDAwMDAKLS0tIGEvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaWZuZGVmIF9fWEZTX0RJUjJfQkxPQ0tfSF9fCi0jZGVmaW5lCV9fWEZTX0RJUjJfQkxPQ0tfSF9fCi0KLS8qCi0gKiB4ZnNfZGlyMl9ibG9jay5oCi0gKiBEaXJlY3RvcnkgdmVyc2lvbiAyLCBzaW5nbGUgYmxvY2sgZm9ybWF0IHN0cnVjdHVyZXMKLSAqLwotCi1zdHJ1Y3QgdWlvOwotc3RydWN0IHhmc19kYWJ1ZjsKLXN0cnVjdCB4ZnNfZGFfYXJnczsKLXN0cnVjdCB4ZnNfZGlyMl9kYXRhX2hkcjsKLXN0cnVjdCB4ZnNfZGlyMl9sZWFmX2VudHJ5Owotc3RydWN0IHhmc19pbm9kZTsKLXN0cnVjdCB4ZnNfbW91bnQ7Ci1zdHJ1Y3QgeGZzX3RyYW5zOwotCi0vKgotICogVGhlIHNpbmdsZSBibG9jayBmb3JtYXQgaXMgYXMgZm9sbG93czoKLSAqIHhmc19kaXIyX2RhdGFfaGRyX3Qgc3RydWN0dXJlCi0gKiB4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgYW5kIHhmc19kaXIyX2RhdGFfdW51c2VkX3Qgc3RydWN0dXJlcwotICogeGZzX2RpcjJfbGVhZl9lbnRyeV90IHN0cnVjdHVyZXMKLSAqIHhmc19kaXIyX2Jsb2NrX3RhaWxfdCBzdHJ1Y3R1cmUKLSAqLwotCi0jZGVmaW5lCVhGU19ESVIyX0JMT0NLX01BR0lDCTB4NTg0NDMyNDIJLyogWEQyQjogZm9yIG9uZSBibG9jayBkaXJzICovCi0KLXR5cGVkZWYgc3RydWN0IHhmc19kaXIyX2Jsb2NrX3RhaWwgewotCV9fYmUzMgkJY291bnQ7CQkJLyogY291bnQgb2YgbGVhZiBlbnRyaWVzICovCi0JX19iZTMyCQlzdGFsZTsJCQkvKiBjb3VudCBvZiBzdGFsZSBsZiBlbnRyaWVzICovCi19IHhmc19kaXIyX2Jsb2NrX3RhaWxfdDsKLQotLyoKLSAqIEdlbmVyaWMgc2luZ2xlLWJsb2NrIHN0cnVjdHVyZSwgZm9yIHhmc19kYi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfYmxvY2sgewotCXhmc19kaXIyX2RhdGFfaGRyX3QJaGRyOwkJLyogbWFnaWMgWEZTX0RJUjJfQkxPQ0tfTUFHSUMgKi8KLQl4ZnNfZGlyMl9kYXRhX3VuaW9uX3QJdVsxXTsKLQl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJbGVhZlsxXTsKLQl4ZnNfZGlyMl9ibG9ja190YWlsX3QJdGFpbDsKLX0geGZzX2RpcjJfYmxvY2tfdDsKLQotLyoKLSAqIFBvaW50ZXIgdG8gdGhlIGxlYWYgaGVhZGVyIGVtYmVkZGVkIGluIGEgZGF0YSBibG9jayAoMS1ibG9jayBmb3JtYXQpCi0gKi8KLXN0YXRpYyBpbmxpbmUgeGZzX2RpcjJfYmxvY2tfdGFpbF90ICoKLXhmc19kaXIyX2Jsb2NrX3RhaWxfcChzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfYmxvY2tfdCAqYmxvY2spCi17Ci0JcmV0dXJuICgoKHhmc19kaXIyX2Jsb2NrX3RhaWxfdCAqKQotCQkoKGNoYXIgKikoYmxvY2spICsgKG1wKS0+bV9kaXJibGtzaXplKSkgLSAxKTsKLX0KLQotLyoKLSAqIFBvaW50ZXIgdG8gdGhlIGxlYWYgZW50cmllcyBlbWJlZGRlZCBpbiBhIGRhdGEgYmxvY2sgKDEtYmxvY2sgZm9ybWF0KQotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB4ZnNfZGlyMl9sZWFmX2VudHJ5ICoKLXhmc19kaXIyX2Jsb2NrX2xlYWZfcCh4ZnNfZGlyMl9ibG9ja190YWlsX3QgKmJ0cCkKLXsKLQlyZXR1cm4gKChzdHJ1Y3QgeGZzX2RpcjJfbGVhZl9lbnRyeSAqKWJ0cCkgLSBiZTMyX3RvX2NwdShidHAtPmNvdW50KTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLSAqLwotZXh0ZXJuIGludCB4ZnNfZGlyMl9ibG9ja19hZGRuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci1leHRlcm4gaW50IHhmc19kaXIyX2Jsb2NrX2dldGRlbnRzKHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCB2b2lkICpkaXJlbnQsCi0JCQkJICAgeGZzX29mZl90ICpvZmZzZXQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKLWV4dGVybiBpbnQgeGZzX2RpcjJfYmxvY2tfbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci1leHRlcm4gaW50IHhmc19kaXIyX2Jsb2NrX3JlbW92ZW5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLWV4dGVybiBpbnQgeGZzX2RpcjJfYmxvY2tfcmVwbGFjZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmX3RvX2Jsb2NrKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKLQkJCQkgIHN0cnVjdCB4ZnNfZGFidWYgKmxicCwgc3RydWN0IHhmc19kYWJ1ZiAqZGJwKTsKLWV4dGVybiBpbnQgeGZzX2RpcjJfc2ZfdG9fYmxvY2soc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLQotI2VuZGlmCS8qIF9fWEZTX0RJUjJfQkxPQ0tfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfZGF0YS5jIGIvZnMveGZzL3hmc19kaXIyX2RhdGEuYwppbmRleCA5MjE1OTViLi41YmJlMmE4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjJfZGF0YS5jCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9kYXRhLmMKQEAgLTIzLDE4ICsyMywxOCBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfbGVhZi5oIgotI2luY2x1ZGUgInhmc19kaXIyX2Jsb2NrLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfZm9ybWF0LmgiCisjaW5jbHVkZSAieGZzX2RpcjJfcHJpdi5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogCitTVEFUSUMgeGZzX2RpcjJfZGF0YV9mcmVlX3QgKgoreGZzX2RpcjJfZGF0YV9mcmVlZmluZCh4ZnNfZGlyMl9kYXRhX2hkcl90ICpoZHIsIHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKmR1cCk7CisKICNpZmRlZiBERUJVRwogLyoKICAqIENoZWNrIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgZGF0YSBibG9jay4KQEAgLTUwLDcgKzUwLDcgQEAKIAl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAkqYmY7CQkvKiBiZXN0ZnJlZSB0YWJsZSAqLwogCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwPU5VTEw7CS8qIGJsb2NrIHRhaWwgKi8KIAlpbnQJCQljb3VudDsJCS8qIGNvdW50IG9mIGVudHJpZXMgZm91bmQgKi8KLQl4ZnNfZGlyMl9kYXRhX3QJCSpkOwkJLyogZGF0YSBibG9jayBwb2ludGVyICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyOwkJLyogZGF0YSBibG9jayBoZWFkZXIgKi8KIAl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgZW50cnkgKi8KIAl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAkqZGZwOwkJLyogYmVzdGZyZWUgZW50cnkgKi8KIAl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpkdXA7CQkvKiB1bnVzZWQgZW50cnkgKi8KQEAgLTY2LDE3ICs2NiwxOSBAQAogCXN0cnVjdCB4ZnNfbmFtZQkJbmFtZTsKIAogCW1wID0gZHAtPmlfbW91bnQ7Ci0JZCA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTMyX3RvX2NwdShkLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0RBVEFfTUFHSUMgfHwKLQkgICAgICAgYmUzMl90b19jcHUoZC0+aGRyLm1hZ2ljKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7Ci0JYmYgPSBkLT5oZHIuYmVzdGZyZWU7Ci0JcCA9IChjaGFyICopZC0+dTsKLQlpZiAoYmUzMl90b19jcHUoZC0+aGRyLm1hZ2ljKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQykgewotCQlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsICh4ZnNfZGlyMl9ibG9ja190ICopZCk7CisJaGRyID0gYnAtPmRhdGE7CisJYmYgPSBoZHItPmJlc3RmcmVlOworCXAgPSAoY2hhciAqKShoZHIgKyAxKTsKKworCWlmIChoZHItPm1hZ2ljID09IGNwdV90b19iZTMyKFhGU19ESVIyX0JMT0NLX01BR0lDKSkgeworCQlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsIGhkcik7CiAJCWxlcCA9IHhmc19kaXIyX2Jsb2NrX2xlYWZfcChidHApOwogCQllbmRwID0gKGNoYXIgKilsZXA7Ci0JfSBlbHNlCi0JCWVuZHAgPSAoY2hhciAqKWQgKyBtcC0+bV9kaXJibGtzaXplOworCX0gZWxzZSB7CisJCUFTU0VSVChoZHItPm1hZ2ljID09IGNwdV90b19iZTMyKFhGU19ESVIyX0RBVEFfTUFHSUMpKTsKKwkJZW5kcCA9IChjaGFyICopaGRyICsgbXAtPm1fZGlyYmxrc2l6ZTsKKwl9CisKIAljb3VudCA9IGxhc3RmcmVlID0gZnJlZXNlZW4gPSAwOwogCS8qCiAJICogQWNjb3VudCBmb3IgemVybyBiZXN0ZnJlZSBlbnRyaWVzLgpAQCAtMTA4LDggKzExMCw4IEBACiAJCWlmIChiZTE2X3RvX2NwdShkdXAtPmZyZWV0YWcpID09IFhGU19ESVIyX0RBVEFfRlJFRV9UQUcpIHsKIAkJCUFTU0VSVChsYXN0ZnJlZSA9PSAwKTsKIAkJCUFTU0VSVChiZTE2X3RvX2NwdSgqeGZzX2RpcjJfZGF0YV91bnVzZWRfdGFnX3AoZHVwKSkgPT0KLQkJCSAgICAgICAoY2hhciAqKWR1cCAtIChjaGFyICopZCk7Ci0JCQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVmaW5kKGQsIGR1cCk7CisJCQkgICAgICAgKGNoYXIgKilkdXAgLSAoY2hhciAqKWhkcik7CisJCQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVmaW5kKGhkciwgZHVwKTsKIAkJCWlmIChkZnApIHsKIAkJCQlpID0gKGludCkoZGZwIC0gYmYpOwogCQkJCUFTU0VSVCgoZnJlZXNlZW4gJiAoMSA8PCBpKSkgPT0gMCk7CkBAIC0xMzIsMTMgKzEzNCwxMyBAQAogCQlBU1NFUlQoZGVwLT5uYW1lbGVuICE9IDApOwogCQlBU1NFUlQoeGZzX2Rpcl9pbm9fdmFsaWRhdGUobXAsIGJlNjRfdG9fY3B1KGRlcC0+aW51bWJlcikpID09IDApOwogCQlBU1NFUlQoYmUxNl90b19jcHUoKnhmc19kaXIyX2RhdGFfZW50cnlfdGFnX3AoZGVwKSkgPT0KLQkJICAgICAgIChjaGFyICopZGVwIC0gKGNoYXIgKilkKTsKKwkJICAgICAgIChjaGFyICopZGVwIC0gKGNoYXIgKiloZHIpOwogCQljb3VudCsrOwogCQlsYXN0ZnJlZSA9IDA7Ci0JCWlmIChiZTMyX3RvX2NwdShkLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKSB7CisJCWlmIChoZHItPm1hZ2ljID09IGNwdV90b19iZTMyKFhGU19ESVIyX0JMT0NLX01BR0lDKSkgewogCQkJYWRkciA9IHhmc19kaXIyX2RiX29mZl90b19kYXRhcHRyKG1wLCBtcC0+bV9kaXJkYXRhYmxrLAogCQkJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkKLQkJCQkoKGNoYXIgKilkZXAgLSAoY2hhciAqKWQpKTsKKwkJCQkoKGNoYXIgKilkZXAgLSAoY2hhciAqKWhkcikpOwogCQkJbmFtZS5uYW1lID0gZGVwLT5uYW1lOwogCQkJbmFtZS5sZW4gPSBkZXAtPm5hbWVsZW47CiAJCQloYXNoID0gbXAtPm1fZGlybmFtZW9wcy0+aGFzaG5hbWUoJm5hbWUpOwpAQCAtMTU1LDkgKzE1NywxMCBAQAogCSAqIE5lZWQgdG8gaGF2ZSBzZWVuIGFsbCB0aGUgZW50cmllcyBhbmQgYWxsIHRoZSBiZXN0ZnJlZSBzbG90cy4KIAkgKi8KIAlBU1NFUlQoZnJlZXNlZW4gPT0gNyk7Ci0JaWYgKGJlMzJfdG9fY3B1KGQtPmhkci5tYWdpYykgPT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpIHsKKwlpZiAoaGRyLT5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9CTE9DS19NQUdJQykpIHsKIAkJZm9yIChpID0gc3RhbGUgPSAwOyBpIDwgYmUzMl90b19jcHUoYnRwLT5jb3VudCk7IGkrKykgewotCQkJaWYgKGJlMzJfdG9fY3B1KGxlcFtpXS5hZGRyZXNzKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpCisJCQlpZiAobGVwW2ldLmFkZHJlc3MgPT0KKwkJCSAgICBjcHVfdG9fYmUzMihYRlNfRElSMl9OVUxMX0RBVEFQVFIpKQogCQkJCXN0YWxlKys7CiAJCQlpZiAoaSA+IDApCiAJCQkJQVNTRVJUKGJlMzJfdG9fY3B1KGxlcFtpXS5oYXNodmFsKSA+PSBiZTMyX3RvX2NwdShsZXBbaSAtIDFdLmhhc2h2YWwpKTsKQEAgLTE3Miw5ICsxNzUsOSBAQAogICogR2l2ZW4gYSBkYXRhIGJsb2NrIGFuZCBhbiB1bnVzZWQgZW50cnkgZnJvbSB0aGF0IGJsb2NrLAogICogcmV0dXJuIHRoZSBiZXN0ZnJlZSBlbnRyeSBpZiBhbnkgdGhhdCBjb3JyZXNwb25kcyB0byBpdC4KICAqLwoteGZzX2RpcjJfZGF0YV9mcmVlX3QgKgorU1RBVElDIHhmc19kaXIyX2RhdGFfZnJlZV90ICoKIHhmc19kaXIyX2RhdGFfZnJlZWZpbmQoCi0JeGZzX2RpcjJfZGF0YV90CQkqZCwJCS8qIGRhdGEgYmxvY2sgKi8KKwl4ZnNfZGlyMl9kYXRhX2hkcl90CSpoZHIsCQkvKiBkYXRhIGJsb2NrICovCiAJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwKQkJLyogZGF0YSB1bnVzZWQgZW50cnkgKi8KIHsKIAl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAkqZGZwOwkJLyogYmVzdGZyZWUgZW50cnkgKi8KQEAgLTE4NCwxNyArMTg3LDE3IEBACiAJaW50CQkJc2Vlbnplcm87CS8qIHNhdyBhIDAgYmVzdGZyZWUgZW50cnkgKi8KICNlbmRpZgogCi0Jb2ZmID0gKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWR1cCAtIChjaGFyICopZCk7CisJb2ZmID0gKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWR1cCAtIChjaGFyICopaGRyKTsKICNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCiAJLyoKIAkgKiBWYWxpZGF0ZSBzb21lIGNvbnNpc3RlbmN5IGluIHRoZSBiZXN0ZnJlZSB0YWJsZS4KIAkgKiBDaGVjayBvcmRlciwgbm9uLW92ZXJsYXBwaW5nIGVudHJpZXMsIGFuZCBpZiB3ZSBmaW5kIHRoZQogCSAqIG9uZSB3ZSdyZSBsb29raW5nIGZvciBpdCBoYXMgdG8gYmUgZXhhY3QuCiAJICovCi0JQVNTRVJUKGJlMzJfdG9fY3B1KGQtPmhkci5tYWdpYykgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyB8fAotCSAgICAgICBiZTMyX3RvX2NwdShkLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKLQlmb3IgKGRmcCA9ICZkLT5oZHIuYmVzdGZyZWVbMF0sIHNlZW56ZXJvID0gbWF0Y2hlZCA9IDA7Ci0JICAgICBkZnAgPCAmZC0+aGRyLmJlc3RmcmVlW1hGU19ESVIyX0RBVEFfRkRfQ09VTlRdOworCUFTU0VSVChoZHItPm1hZ2ljID09IGNwdV90b19iZTMyKFhGU19ESVIyX0RBVEFfTUFHSUMpIHx8CisJICAgICAgIGhkci0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfQkxPQ0tfTUFHSUMpKTsKKwlmb3IgKGRmcCA9ICZoZHItPmJlc3RmcmVlWzBdLCBzZWVuemVybyA9IG1hdGNoZWQgPSAwOworCSAgICAgZGZwIDwgJmhkci0+YmVzdGZyZWVbWEZTX0RJUjJfREFUQV9GRF9DT1VOVF07CiAJICAgICBkZnArKykgewogCQlpZiAoIWRmcC0+b2Zmc2V0KSB7CiAJCQlBU1NFUlQoIWRmcC0+bGVuZ3RoKTsKQEAgLTIxMCw3ICsyMTMsNyBAQAogCQllbHNlCiAJCQlBU1NFUlQoYmUxNl90b19jcHUoZGZwLT5vZmZzZXQpICsgYmUxNl90b19jcHUoZGZwLT5sZW5ndGgpIDw9IG9mZik7CiAJCUFTU0VSVChtYXRjaGVkIHx8IGJlMTZfdG9fY3B1KGRmcC0+bGVuZ3RoKSA+PSBiZTE2X3RvX2NwdShkdXAtPmxlbmd0aCkpOwotCQlpZiAoZGZwID4gJmQtPmhkci5iZXN0ZnJlZVswXSkKKwkJaWYgKGRmcCA+ICZoZHItPmJlc3RmcmVlWzBdKQogCQkJQVNTRVJUKGJlMTZfdG9fY3B1KGRmcFstMV0ubGVuZ3RoKSA+PSBiZTE2X3RvX2NwdShkZnBbMF0ubGVuZ3RoKSk7CiAJfQogI2VuZGlmCkBAIC0yMTksMTMgKzIyMiwxMyBAQAogCSAqIGl0IGNhbid0IGJlIHRoZXJlIHNpbmNlIHRoZXkncmUgc29ydGVkLgogCSAqLwogCWlmIChiZTE2X3RvX2NwdShkdXAtPmxlbmd0aCkgPAotCSAgICBiZTE2X3RvX2NwdShkLT5oZHIuYmVzdGZyZWVbWEZTX0RJUjJfREFUQV9GRF9DT1VOVCAtIDFdLmxlbmd0aCkpCisJICAgIGJlMTZfdG9fY3B1KGhkci0+YmVzdGZyZWVbWEZTX0RJUjJfREFUQV9GRF9DT1VOVCAtIDFdLmxlbmd0aCkpCiAJCXJldHVybiBOVUxMOwogCS8qCiAJICogTG9vayBhdCB0aGUgdGhyZWUgYmVzdGZyZWUgZW50cmllcyBmb3Igb3VyIGd1eS4KIAkgKi8KLQlmb3IgKGRmcCA9ICZkLT5oZHIuYmVzdGZyZWVbMF07Ci0JICAgICBkZnAgPCAmZC0+aGRyLmJlc3RmcmVlW1hGU19ESVIyX0RBVEFfRkRfQ09VTlRdOworCWZvciAoZGZwID0gJmhkci0+YmVzdGZyZWVbMF07CisJICAgICBkZnAgPCAmaGRyLT5iZXN0ZnJlZVtYRlNfRElSMl9EQVRBX0ZEX0NPVU5UXTsKIAkgICAgIGRmcCsrKSB7CiAJCWlmICghZGZwLT5vZmZzZXQpCiAJCQlyZXR1cm4gTlVMTDsKQEAgLTI0Myw3ICsyNDYsNyBAQAogICovCiB4ZnNfZGlyMl9kYXRhX2ZyZWVfdCAqCQkJCS8qIGVudHJ5IGluc2VydGVkICovCiB4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoCi0JeGZzX2RpcjJfZGF0YV90CQkqZCwJCS8qIGRhdGEgYmxvY2sgcG9pbnRlciAqLworCXhmc19kaXIyX2RhdGFfaGRyX3QJKmhkciwJCS8qIGRhdGEgYmxvY2sgcG9pbnRlciAqLwogCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cCwJCS8qIHVudXNlZCBzcGFjZSAqLwogCWludAkJCSpsb2doZWFkKQkvKiBsb2cgdGhlIGRhdGEgaGVhZGVyIChvdXQpICovCiB7CkBAIC0yNTEsMTIgKzI1NCwxMyBAQAogCXhmc19kaXIyX2RhdGFfZnJlZV90CW5ldzsJCS8qIG5ldyBiZXN0ZnJlZSBlbnRyeSAqLwogCiAjaWZkZWYgX19LRVJORUxfXwotCUFTU0VSVChiZTMyX3RvX2NwdShkLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0RBVEFfTUFHSUMgfHwKLQkgICAgICAgYmUzMl90b19jcHUoZC0+aGRyLm1hZ2ljKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7CisJQVNTRVJUKGhkci0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfREFUQV9NQUdJQykgfHwKKwkgICAgICAgaGRyLT5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9CTE9DS19NQUdJQykpOwogI2VuZGlmCi0JZGZwID0gZC0+aGRyLmJlc3RmcmVlOworCWRmcCA9IGhkci0+YmVzdGZyZWU7CiAJbmV3Lmxlbmd0aCA9IGR1cC0+bGVuZ3RoOwotCW5ldy5vZmZzZXQgPSBjcHVfdG9fYmUxNigoY2hhciAqKWR1cCAtIChjaGFyICopZCk7CisJbmV3Lm9mZnNldCA9IGNwdV90b19iZTE2KChjaGFyICopZHVwIC0gKGNoYXIgKiloZHIpOworCiAJLyoKIAkgKiBJbnNlcnQgYXQgcG9zaXRpb24gMCwgMSwgb3IgMjsgb3Igbm90IGF0IGFsbC4KIAkgKi8KQEAgLTI4NiwzNiArMjkwLDM2IEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoCi0JeGZzX2RpcjJfZGF0YV90CQkqZCwJCS8qIGRhdGEgYmxvY2sgcG9pbnRlciAqLworCXhmc19kaXIyX2RhdGFfaGRyX3QJKmhkciwJCS8qIGRhdGEgYmxvY2sgaGVhZGVyICovCiAJeGZzX2RpcjJfZGF0YV9mcmVlX3QJKmRmcCwJCS8qIGJlc3RmcmVlIGVudHJ5IHBvaW50ZXIgKi8KIAlpbnQJCQkqbG9naGVhZCkJLyogb3V0OiBsb2cgZGF0YSBoZWFkZXIgKi8KIHsKICNpZmRlZiBfX0tFUk5FTF9fCi0JQVNTRVJUKGJlMzJfdG9fY3B1KGQtPmhkci5tYWdpYykgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyB8fAotCSAgICAgICBiZTMyX3RvX2NwdShkLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKKwlBU1NFUlQoaGRyLT5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9EQVRBX01BR0lDKSB8fAorCSAgICAgICBoZHItPm1hZ2ljID09IGNwdV90b19iZTMyKFhGU19ESVIyX0JMT0NLX01BR0lDKSk7CiAjZW5kaWYKIAkvKgogCSAqIEl0J3MgdGhlIGZpcnN0IGVudHJ5LCBzbGlkZSB0aGUgbmV4dCAyIHVwLgogCSAqLwotCWlmIChkZnAgPT0gJmQtPmhkci5iZXN0ZnJlZVswXSkgewotCQlkLT5oZHIuYmVzdGZyZWVbMF0gPSBkLT5oZHIuYmVzdGZyZWVbMV07Ci0JCWQtPmhkci5iZXN0ZnJlZVsxXSA9IGQtPmhkci5iZXN0ZnJlZVsyXTsKKwlpZiAoZGZwID09ICZoZHItPmJlc3RmcmVlWzBdKSB7CisJCWhkci0+YmVzdGZyZWVbMF0gPSBoZHItPmJlc3RmcmVlWzFdOworCQloZHItPmJlc3RmcmVlWzFdID0gaGRyLT5iZXN0ZnJlZVsyXTsKIAl9CiAJLyoKIAkgKiBJdCdzIHRoZSBzZWNvbmQgZW50cnksIHNsaWRlIHRoZSAzcmQgZW50cnkgdXAuCiAJICovCi0JZWxzZSBpZiAoZGZwID09ICZkLT5oZHIuYmVzdGZyZWVbMV0pCi0JCWQtPmhkci5iZXN0ZnJlZVsxXSA9IGQtPmhkci5iZXN0ZnJlZVsyXTsKKwllbHNlIGlmIChkZnAgPT0gJmhkci0+YmVzdGZyZWVbMV0pCisJCWhkci0+YmVzdGZyZWVbMV0gPSBoZHItPmJlc3RmcmVlWzJdOwogCS8qCiAJICogTXVzdCBiZSB0aGUgbGFzdCBlbnRyeS4KIAkgKi8KIAllbHNlCi0JCUFTU0VSVChkZnAgPT0gJmQtPmhkci5iZXN0ZnJlZVsyXSk7CisJCUFTU0VSVChkZnAgPT0gJmhkci0+YmVzdGZyZWVbMl0pOwogCS8qCiAJICogQ2xlYXIgdGhlIDNyZCBlbnRyeSwgbXVzdCBiZSB6ZXJvIG5vdy4KIAkgKi8KLQlkLT5oZHIuYmVzdGZyZWVbMl0ubGVuZ3RoID0gMDsKLQlkLT5oZHIuYmVzdGZyZWVbMl0ub2Zmc2V0ID0gMDsKKwloZHItPmJlc3RmcmVlWzJdLmxlbmd0aCA9IDA7CisJaGRyLT5iZXN0ZnJlZVsyXS5vZmZzZXQgPSAwOwogCSpsb2doZWFkID0gMTsKIH0KIApAQCAtMzI1LDcgKzMyOSw3IEBACiB2b2lkCiB4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKAogCXhmc19tb3VudF90CQkqbXAsCQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCi0JeGZzX2RpcjJfZGF0YV90CQkqZCwJCS8qIGRhdGEgYmxvY2sgcG9pbnRlciAqLworCXhmc19kaXIyX2RhdGFfaGRyX3QJKmhkciwJCS8qIGRhdGEgYmxvY2sgaGVhZGVyICovCiAJaW50CQkJKmxvZ2hlYWQpCS8qIG91dDogbG9nIGRhdGEgaGVhZGVyICovCiB7CiAJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsICovCkBAIC0zMzUsMjMgKzMzOSwyMyBAQAogCWNoYXIJCQkqcDsJCS8qIGN1cnJlbnQgZW50cnkgcG9pbnRlciAqLwogCiAjaWZkZWYgX19LRVJORUxfXwotCUFTU0VSVChiZTMyX3RvX2NwdShkLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0RBVEFfTUFHSUMgfHwKLQkgICAgICAgYmUzMl90b19jcHUoZC0+aGRyLm1hZ2ljKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7CisJQVNTRVJUKGhkci0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfREFUQV9NQUdJQykgfHwKKwkgICAgICAgaGRyLT5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9CTE9DS19NQUdJQykpOwogI2VuZGlmCiAJLyoKIAkgKiBTdGFydCBieSBjbGVhcmluZyB0aGUgdGFibGUuCiAJICovCi0JbWVtc2V0KGQtPmhkci5iZXN0ZnJlZSwgMCwgc2l6ZW9mKGQtPmhkci5iZXN0ZnJlZSkpOworCW1lbXNldChoZHItPmJlc3RmcmVlLCAwLCBzaXplb2YoaGRyLT5iZXN0ZnJlZSkpOwogCSpsb2doZWFkID0gMTsKIAkvKgogCSAqIFNldCB1cCBwb2ludGVycy4KIAkgKi8KLQlwID0gKGNoYXIgKilkLT51OwotCWlmIChiZTMyX3RvX2NwdShkLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKSB7Ci0JCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgKHhmc19kaXIyX2Jsb2NrX3QgKilkKTsKKwlwID0gKGNoYXIgKikoaGRyICsgMSk7CisJaWYgKGhkci0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfQkxPQ0tfTUFHSUMpKSB7CisJCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgaGRyKTsKIAkJZW5kcCA9IChjaGFyICopeGZzX2RpcjJfYmxvY2tfbGVhZl9wKGJ0cCk7CiAJfSBlbHNlCi0JCWVuZHAgPSAoY2hhciAqKWQgKyBtcC0+bV9kaXJibGtzaXplOworCQllbmRwID0gKGNoYXIgKiloZHIgKyBtcC0+bV9kaXJibGtzaXplOwogCS8qCiAJICogTG9vcCBvdmVyIHRoZSBibG9jaydzIGVudHJpZXMuCiAJICovCkBAIC0zNjEsOSArMzY1LDkgQEAKIAkJICogSWYgaXQncyBhIGZyZWUgZW50cnksIGluc2VydCBpdC4KIAkJICovCiAJCWlmIChiZTE2X3RvX2NwdShkdXAtPmZyZWV0YWcpID09IFhGU19ESVIyX0RBVEFfRlJFRV9UQUcpIHsKLQkJCUFTU0VSVCgoY2hhciAqKWR1cCAtIChjaGFyICopZCA9PQorCQkJQVNTRVJUKChjaGFyICopZHVwIC0gKGNoYXIgKiloZHIgPT0KIAkJCSAgICAgICBiZTE2X3RvX2NwdSgqeGZzX2RpcjJfZGF0YV91bnVzZWRfdGFnX3AoZHVwKSkpOwotCQkJeGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGQsIGR1cCwgbG9naGVhZCk7CisJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoaGRyLCBkdXAsIGxvZ2hlYWQpOwogCQkJcCArPSBiZTE2X3RvX2NwdShkdXAtPmxlbmd0aCk7CiAJCX0KIAkJLyoKQEAgLTM3MSw3ICszNzUsNyBAQAogCQkgKi8KIAkJZWxzZSB7CiAJCQlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopcDsKLQkJCUFTU0VSVCgoY2hhciAqKWRlcCAtIChjaGFyICopZCA9PQorCQkJQVNTRVJUKChjaGFyICopZGVwIC0gKGNoYXIgKiloZHIgPT0KIAkJCSAgICAgICBiZTE2X3RvX2NwdSgqeGZzX2RpcjJfZGF0YV9lbnRyeV90YWdfcChkZXApKSk7CiAJCQlwICs9IHhmc19kaXIyX2RhdGFfZW50c2l6ZShkZXAtPm5hbWVsZW4pOwogCQl9CkBAIC0zODksNyArMzkzLDcgQEAKIAl4ZnNfZGFidWZfdAkJKipicHApCQkvKiBvdXRwdXQgYmxvY2sgYnVmZmVyICovCiB7CiAJeGZzX2RhYnVmX3QJCSpicDsJCS8qIGJsb2NrIGJ1ZmZlciAqLwotCXhmc19kaXIyX2RhdGFfdAkJKmQ7CQkvKiBwb2ludGVyIHRvIGJsb2NrICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyOwkJLyogZGF0YSBibG9jayBoZWFkZXIgKi8KIAl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLwogCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cDsJCS8qIHVudXNlZCBlbnRyeSBwb2ludGVyICovCiAJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KQEAgLTQxMCwyNiArNDE0LDI4IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAJQVNTRVJUKGJwICE9IE5VTEwpOworCiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBoZWFkZXIuCiAJICovCi0JZCA9IGJwLT5kYXRhOwotCWQtPmhkci5tYWdpYyA9IGNwdV90b19iZTMyKFhGU19ESVIyX0RBVEFfTUFHSUMpOwotCWQtPmhkci5iZXN0ZnJlZVswXS5vZmZzZXQgPSBjcHVfdG9fYmUxNihzaXplb2YoZC0+aGRyKSk7CisJaGRyID0gYnAtPmRhdGE7CisJaGRyLT5tYWdpYyA9IGNwdV90b19iZTMyKFhGU19ESVIyX0RBVEFfTUFHSUMpOworCWhkci0+YmVzdGZyZWVbMF0ub2Zmc2V0ID0gY3B1X3RvX2JlMTYoc2l6ZW9mKCpoZHIpKTsKIAlmb3IgKGkgPSAxOyBpIDwgWEZTX0RJUjJfREFUQV9GRF9DT1VOVDsgaSsrKSB7Ci0JCWQtPmhkci5iZXN0ZnJlZVtpXS5sZW5ndGggPSAwOwotCQlkLT5oZHIuYmVzdGZyZWVbaV0ub2Zmc2V0ID0gMDsKKwkJaGRyLT5iZXN0ZnJlZVtpXS5sZW5ndGggPSAwOworCQloZHItPmJlc3RmcmVlW2ldLm9mZnNldCA9IDA7CiAJfQorCiAJLyoKIAkgKiBTZXQgdXAgYW4gdW51c2VkIGVudHJ5IGZvciB0aGUgYmxvY2sncyBib2R5LgogCSAqLwotCWR1cCA9ICZkLT51WzBdLnVudXNlZDsKKwlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKShoZHIgKyAxKTsKIAlkdXAtPmZyZWV0YWcgPSBjcHVfdG9fYmUxNihYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKTsKIAotCXQ9bXAtPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZihkLT5oZHIpOwotCWQtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGggPSBjcHVfdG9fYmUxNih0KTsKKwl0ID0gbXAtPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZigqaGRyKTsKKwloZHItPmJlc3RmcmVlWzBdLmxlbmd0aCA9IGNwdV90b19iZTE2KHQpOwogCWR1cC0+bGVuZ3RoID0gY3B1X3RvX2JlMTYodCk7Ci0JKnhmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKGR1cCkgPSBjcHVfdG9fYmUxNigoY2hhciAqKWR1cCAtIChjaGFyICopZCk7CisJKnhmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKGR1cCkgPSBjcHVfdG9fYmUxNigoY2hhciAqKWR1cCAtIChjaGFyICopaGRyKTsKIAkvKgogCSAqIExvZyBpdCBhbmQgcmV0dXJuIGl0LgogCSAqLwpAQCAtNDQ4LDE0ICs0NTQsMTQgQEAKIAl4ZnNfZGFidWZfdAkJKmJwLAkJLyogYmxvY2sgYnVmZmVyICovCiAJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXApCQkvKiBkYXRhIGVudHJ5IHBvaW50ZXIgKi8KIHsKLQl4ZnNfZGlyMl9kYXRhX3QJCSpkOwkJLyogZGF0YSBibG9jayBwb2ludGVyICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyID0gYnAtPmRhdGE7CiAKLQlkID0gYnAtPmRhdGE7Ci0JQVNTRVJUKGJlMzJfdG9fY3B1KGQtPmhkci5tYWdpYykgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyB8fAotCSAgICAgICBiZTMyX3RvX2NwdShkLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKLQl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWRlcCAtIChjaGFyICopZCksCisJQVNTRVJUKGhkci0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfREFUQV9NQUdJQykgfHwKKwkgICAgICAgaGRyLT5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9CTE9DS19NQUdJQykpOworCisJeGZzX2RhX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKilkZXAgLSAoY2hhciAqKWhkciksCiAJCSh1aW50KSgoY2hhciAqKSh4ZnNfZGlyMl9kYXRhX2VudHJ5X3RhZ19wKGRlcCkgKyAxKSAtCi0JCSAgICAgICAoY2hhciAqKWQgLSAxKSk7CisJCSAgICAgICAoY2hhciAqKWhkciAtIDEpKTsKIH0KIAogLyoKQEAgLTQ2NiwxMyArNDcyLDEyIEBACiAJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KIAl4ZnNfZGFidWZfdAkJKmJwKQkJLyogYmxvY2sgYnVmZmVyICovCiB7Ci0JeGZzX2RpcjJfZGF0YV90CQkqZDsJCS8qIGRhdGEgYmxvY2sgcG9pbnRlciAqLworCXhmc19kaXIyX2RhdGFfaGRyX3QJKmhkciA9IGJwLT5kYXRhOwogCi0JZCA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTMyX3RvX2NwdShkLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0RBVEFfTUFHSUMgfHwKLQkgICAgICAgYmUzMl90b19jcHUoZC0+aGRyLm1hZ2ljKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7Ci0JeGZzX2RhX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKikmZC0+aGRyIC0gKGNoYXIgKilkKSwKLQkJKHVpbnQpKHNpemVvZihkLT5oZHIpIC0gMSkpOworCUFTU0VSVChoZHItPm1hZ2ljID09IGNwdV90b19iZTMyKFhGU19ESVIyX0RBVEFfTUFHSUMpIHx8CisJICAgICAgIGhkci0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfQkxPQ0tfTUFHSUMpKTsKKworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwgMCwgc2l6ZW9mKCpoZHIpIC0gMSk7CiB9CiAKIC8qCkBAIC00ODQsMjMgKzQ4OSwyMyBAQAogCXhmc19kYWJ1Zl90CQkqYnAsCQkvKiBibG9jayBidWZmZXIgKi8KIAl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpkdXApCQkvKiBkYXRhIHVudXNlZCBwb2ludGVyICovCiB7Ci0JeGZzX2RpcjJfZGF0YV90CQkqZDsJCS8qIGRhdGEgYmxvY2sgcG9pbnRlciAqLworCXhmc19kaXIyX2RhdGFfaGRyX3QJKmhkciA9IGJwLT5kYXRhOwogCi0JZCA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTMyX3RvX2NwdShkLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0RBVEFfTUFHSUMgfHwKLQkgICAgICAgYmUzMl90b19jcHUoZC0+aGRyLm1hZ2ljKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7CisJQVNTRVJUKGhkci0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfREFUQV9NQUdJQykgfHwKKwkgICAgICAgaGRyLT5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9CTE9DS19NQUdJQykpOworCiAJLyoKIAkgKiBMb2cgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHVudXNlZCBlbnRyeS4KIAkgKi8KLQl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWR1cCAtIChjaGFyICopZCksCisJeGZzX2RhX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWhkciksCiAJCSh1aW50KSgoY2hhciAqKSZkdXAtPmxlbmd0aCArIHNpemVvZihkdXAtPmxlbmd0aCkgLQotCQkgICAgICAgMSAtIChjaGFyICopZCkpOworCQkgICAgICAgMSAtIChjaGFyICopaGRyKSk7CiAJLyoKIAkgKiBMb2cgdGhlIGVuZCAodGFnKSBvZiB0aGUgdW51c2VkIGVudHJ5LgogCSAqLwogCXhmc19kYV9sb2dfYnVmKHRwLCBicCwKLQkJKHVpbnQpKChjaGFyICopeGZzX2RpcjJfZGF0YV91bnVzZWRfdGFnX3AoZHVwKSAtIChjaGFyICopZCksCi0JCSh1aW50KSgoY2hhciAqKXhmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKGR1cCkgLSAoY2hhciAqKWQgKworCQkodWludCkoKGNoYXIgKil4ZnNfZGlyMl9kYXRhX3VudXNlZF90YWdfcChkdXApIC0gKGNoYXIgKiloZHIpLAorCQkodWludCkoKGNoYXIgKil4ZnNfZGlyMl9kYXRhX3VudXNlZF90YWdfcChkdXApIC0gKGNoYXIgKiloZHIgKwogCQkgICAgICAgc2l6ZW9mKHhmc19kaXIyX2RhdGFfb2ZmX3QpIC0gMSkpOwogfQogCkBAIC01MTcsNyArNTIyLDcgQEAKIAlpbnQJCQkqbmVlZGxvZ3AsCS8qIG91dDogbG9nIGhlYWRlciAqLwogCWludAkJCSpuZWVkc2NhbnApCS8qIG91dDogcmVnZW4gYmVzdGZyZWUgKi8KIHsKLQl4ZnNfZGlyMl9kYXRhX3QJCSpkOwkJLyogZGF0YSBibG9jayBwb2ludGVyICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyOwkJLyogZGF0YSBibG9jayBwb2ludGVyICovCiAJeGZzX2RpcjJfZGF0YV9mcmVlX3QJKmRmcDsJCS8qIGJlc3RmcmVlIHBvaW50ZXIgKi8KIAljaGFyCQkJKmVuZHB0cjsJLyogZW5kIG9mIGRhdGEgYXJlYSAqLwogCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCkBAIC01MjcsMjggKzUzMiwyOSBAQAogCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKnByZXZkdXA7CS8qIHVudXNlZCBlbnRyeSBiZWZvcmUgdXMgKi8KIAogCW1wID0gdHAtPnRfbW91bnRwOwotCWQgPSBicC0+ZGF0YTsKKwloZHIgPSBicC0+ZGF0YTsKKwogCS8qCiAJICogRmlndXJlIG91dCB3aGVyZSB0aGUgZW5kIG9mIHRoZSBkYXRhIGFyZWEgaXMuCiAJICovCi0JaWYgKGJlMzJfdG9fY3B1KGQtPmhkci5tYWdpYykgPT0gWEZTX0RJUjJfREFUQV9NQUdJQykKLQkJZW5kcHRyID0gKGNoYXIgKilkICsgbXAtPm1fZGlyYmxrc2l6ZTsKKwlpZiAoaGRyLT5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9EQVRBX01BR0lDKSkKKwkJZW5kcHRyID0gKGNoYXIgKiloZHIgKyBtcC0+bV9kaXJibGtzaXplOwogCWVsc2UgewogCQl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJLyogYmxvY2sgdGFpbCAqLwogCi0JCUFTU0VSVChiZTMyX3RvX2NwdShkLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKLQkJYnRwID0geGZzX2RpcjJfYmxvY2tfdGFpbF9wKG1wLCAoeGZzX2RpcjJfYmxvY2tfdCAqKWQpOworCQlBU1NFUlQoaGRyLT5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9CTE9DS19NQUdJQykpOworCQlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsIGhkcik7CiAJCWVuZHB0ciA9IChjaGFyICopeGZzX2RpcjJfYmxvY2tfbGVhZl9wKGJ0cCk7CiAJfQogCS8qCiAJICogSWYgdGhpcyBpc24ndCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrLCB0aGVuIGJhY2sgdXAgdG8KIAkgKiB0aGUgcHJldmlvdXMgZW50cnkgYW5kIHNlZSBpZiBpdCdzIGZyZWUuCiAJICovCi0JaWYgKG9mZnNldCA+IHNpemVvZihkLT5oZHIpKSB7CisJaWYgKG9mZnNldCA+IHNpemVvZigqaGRyKSkgewogCQlfX2JlMTYJCQkqdGFncDsJLyogdGFnIGp1c3QgYmVmb3JlIHVzICovCiAKLQkJdGFncCA9IChfX2JlMTYgKikoKGNoYXIgKilkICsgb2Zmc2V0KSAtIDE7Ci0JCXByZXZkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWQgKyBiZTE2X3RvX2NwdSgqdGFncCkpOworCQl0YWdwID0gKF9fYmUxNiAqKSgoY2hhciAqKWhkciArIG9mZnNldCkgLSAxOworCQlwcmV2ZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKiloZHIgKyBiZTE2X3RvX2NwdSgqdGFncCkpOwogCQlpZiAoYmUxNl90b19jcHUocHJldmR1cC0+ZnJlZXRhZykgIT0gWEZTX0RJUjJfREFUQV9GUkVFX1RBRykKIAkJCXByZXZkdXAgPSBOVUxMOwogCX0gZWxzZQpAQCAtNTU3LDkgKzU2Myw5IEBACiAJICogSWYgdGhpcyBpc24ndCB0aGUgZW5kIG9mIHRoZSBibG9jaywgc2VlIGlmIHRoZSBlbnRyeSBhZnRlcgogCSAqIHVzIGlzIGZyZWUuCiAJICovCi0JaWYgKChjaGFyICopZCArIG9mZnNldCArIGxlbiA8IGVuZHB0cikgeworCWlmICgoY2hhciAqKWhkciArIG9mZnNldCArIGxlbiA8IGVuZHB0cikgewogCQlwb3N0ZHVwID0KLQkJCSh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopKChjaGFyICopZCArIG9mZnNldCArIGxlbik7CisJCQkoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWhkciArIG9mZnNldCArIGxlbik7CiAJCWlmIChiZTE2X3RvX2NwdShwb3N0ZHVwLT5mcmVldGFnKSAhPSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKQogCQkJcG9zdGR1cCA9IE5VTEw7CiAJfSBlbHNlCkBAIC01NzYsMjEgKzU4MiwyMSBAQAogCQkvKgogCQkgKiBTZWUgaWYgcHJldmR1cCBhbmQvb3IgcG9zdGR1cCBhcmUgaW4gYmVzdGZyZWUgdGFibGUuCiAJCSAqLwotCQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVmaW5kKGQsIHByZXZkdXApOwotCQlkZnAyID0geGZzX2RpcjJfZGF0YV9mcmVlZmluZChkLCBwb3N0ZHVwKTsKKwkJZGZwID0geGZzX2RpcjJfZGF0YV9mcmVlZmluZChoZHIsIHByZXZkdXApOworCQlkZnAyID0geGZzX2RpcjJfZGF0YV9mcmVlZmluZChoZHIsIHBvc3RkdXApOwogCQkvKgogCQkgKiBXZSBuZWVkIGEgcmVzY2FuIHVubGVzcyB0aGVyZSBhcmUgZXhhY3RseSAyIGZyZWUgZW50cmllcwogCQkgKiBuYW1lbHkgb3VyIHR3by4gIFRoZW4gd2Uga25vdyB3aGF0J3MgaGFwcGVuaW5nLCBvdGhlcndpc2UKIAkJICogc2luY2UgdGhlIHRoaXJkIGJlc3RmcmVlIGlzIHRoZXJlLCB0aGVyZSBtaWdodCBiZSBtb3JlCiAJCSAqIGVudHJpZXMuCiAJCSAqLwotCQluZWVkc2NhbiA9IChkLT5oZHIuYmVzdGZyZWVbMl0ubGVuZ3RoICE9IDApOworCQluZWVkc2NhbiA9IChoZHItPmJlc3RmcmVlWzJdLmxlbmd0aCAhPSAwKTsKIAkJLyoKIAkJICogRml4IHVwIHRoZSBuZXcgYmlnIGZyZWVzcGFjZS4KIAkJICovCiAJCWJlMTZfYWRkX2NwdSgmcHJldmR1cC0+bGVuZ3RoLCBsZW4gKyBiZTE2X3RvX2NwdShwb3N0ZHVwLT5sZW5ndGgpKTsKIAkJKnhmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKHByZXZkdXApID0KLQkJCWNwdV90b19iZTE2KChjaGFyICopcHJldmR1cCAtIChjaGFyICopZCk7CisJCQljcHVfdG9fYmUxNigoY2hhciAqKXByZXZkdXAgLSAoY2hhciAqKWhkcik7CiAJCXhmc19kaXIyX2RhdGFfbG9nX3VudXNlZCh0cCwgYnAsIHByZXZkdXApOwogCQlpZiAoIW5lZWRzY2FuKSB7CiAJCQkvKgpAQCAtNjAwLDE4ICs2MDYsMTggQEAKIAkJCSAqIFJlbW92ZSBlbnRyeSAxIGZpcnN0IHRoZW4gZW50cnkgMC4KIAkJCSAqLwogCQkJQVNTRVJUKGRmcCAmJiBkZnAyKTsKLQkJCWlmIChkZnAgPT0gJmQtPmhkci5iZXN0ZnJlZVsxXSkgewotCQkJCWRmcCA9ICZkLT5oZHIuYmVzdGZyZWVbMF07CisJCQlpZiAoZGZwID09ICZoZHItPmJlc3RmcmVlWzFdKSB7CisJCQkJZGZwID0gJmhkci0+YmVzdGZyZWVbMF07CiAJCQkJQVNTRVJUKGRmcDIgPT0gZGZwKTsKLQkJCQlkZnAyID0gJmQtPmhkci5iZXN0ZnJlZVsxXTsKKwkJCQlkZnAyID0gJmhkci0+YmVzdGZyZWVbMV07CiAJCQl9Ci0JCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoZCwgZGZwMiwgbmVlZGxvZ3ApOwotCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGQsIGRmcCwgbmVlZGxvZ3ApOworCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGhkciwgZGZwMiwgbmVlZGxvZ3ApOworCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGhkciwgZGZwLCBuZWVkbG9ncCk7CiAJCQkvKgogCQkJICogTm93IGluc2VydCB0aGUgbmV3IGVudHJ5LgogCQkJICovCi0JCQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoZCwgcHJldmR1cCwgbmVlZGxvZ3ApOwotCQkJQVNTRVJUKGRmcCA9PSAmZC0+aGRyLmJlc3RmcmVlWzBdKTsKKwkJCWRmcCA9IHhmc19kaXIyX2RhdGFfZnJlZWluc2VydChoZHIsIHByZXZkdXAsIG5lZWRsb2dwKTsKKwkJCUFTU0VSVChkZnAgPT0gJmhkci0+YmVzdGZyZWVbMF0pOwogCQkJQVNTRVJUKGRmcC0+bGVuZ3RoID09IHByZXZkdXAtPmxlbmd0aCk7CiAJCQlBU1NFUlQoIWRmcFsxXS5sZW5ndGgpOwogCQkJQVNTRVJUKCFkZnBbMl0ubGVuZ3RoKTsKQEAgLTYyMSwxMCArNjI3LDEwIEBACiAJICogVGhlIGVudHJ5IGJlZm9yZSB1cyBpcyBmcmVlLCBtZXJnZSB3aXRoIGl0LgogCSAqLwogCWVsc2UgaWYgKHByZXZkdXApIHsKLQkJZGZwID0geGZzX2RpcjJfZGF0YV9mcmVlZmluZChkLCBwcmV2ZHVwKTsKKwkJZGZwID0geGZzX2RpcjJfZGF0YV9mcmVlZmluZChoZHIsIHByZXZkdXApOwogCQliZTE2X2FkZF9jcHUoJnByZXZkdXAtPmxlbmd0aCwgbGVuKTsKIAkJKnhmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKHByZXZkdXApID0KLQkJCWNwdV90b19iZTE2KChjaGFyICopcHJldmR1cCAtIChjaGFyICopZCk7CisJCQljcHVfdG9fYmUxNigoY2hhciAqKXByZXZkdXAgLSAoY2hhciAqKWhkcik7CiAJCXhmc19kaXIyX2RhdGFfbG9nX3VudXNlZCh0cCwgYnAsIHByZXZkdXApOwogCQkvKgogCQkgKiBJZiB0aGUgcHJldmlvdXMgZW50cnkgd2FzIGluIHRoZSB0YWJsZSwgdGhlIG5ldyBlbnRyeQpAQCAtNjMyLDI3ICs2MzgsMjcgQEAKIAkJICogdGhlIG9sZCBvbmUgYW5kIGFkZCB0aGUgbmV3IG9uZS4KIAkJICovCiAJCWlmIChkZnApIHsKLQkJCXhmc19kaXIyX2RhdGFfZnJlZXJlbW92ZShkLCBkZnAsIG5lZWRsb2dwKTsKLQkJCSh2b2lkKXhmc19kaXIyX2RhdGFfZnJlZWluc2VydChkLCBwcmV2ZHVwLCBuZWVkbG9ncCk7CisJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoaGRyLCBkZnAsIG5lZWRsb2dwKTsKKwkJCXhmc19kaXIyX2RhdGFfZnJlZWluc2VydChoZHIsIHByZXZkdXAsIG5lZWRsb2dwKTsKIAkJfQogCQkvKgogCQkgKiBPdGhlcndpc2Ugd2UgbmVlZCBhIHNjYW4gaWYgdGhlIG5ldyBlbnRyeSBpcyBiaWcgZW5vdWdoLgogCQkgKi8KIAkJZWxzZSB7CiAJCQluZWVkc2NhbiA9IGJlMTZfdG9fY3B1KHByZXZkdXAtPmxlbmd0aCkgPgotCQkJCSAgIGJlMTZfdG9fY3B1KGQtPmhkci5iZXN0ZnJlZVsyXS5sZW5ndGgpOworCQkJCSAgIGJlMTZfdG9fY3B1KGhkci0+YmVzdGZyZWVbMl0ubGVuZ3RoKTsKIAkJfQogCX0KIAkvKgogCSAqIFRoZSBmb2xsb3dpbmcgZW50cnkgaXMgZnJlZSwgbWVyZ2Ugd2l0aCBpdC4KIAkgKi8KIAllbHNlIGlmIChwb3N0ZHVwKSB7Ci0JCWRmcCA9IHhmc19kaXIyX2RhdGFfZnJlZWZpbmQoZCwgcG9zdGR1cCk7Ci0JCW5ld2R1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopKChjaGFyICopZCArIG9mZnNldCk7CisJCWRmcCA9IHhmc19kaXIyX2RhdGFfZnJlZWZpbmQoaGRyLCBwb3N0ZHVwKTsKKwkJbmV3ZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKiloZHIgKyBvZmZzZXQpOwogCQluZXdkdXAtPmZyZWV0YWcgPSBjcHVfdG9fYmUxNihYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKTsKIAkJbmV3ZHVwLT5sZW5ndGggPSBjcHVfdG9fYmUxNihsZW4gKyBiZTE2X3RvX2NwdShwb3N0ZHVwLT5sZW5ndGgpKTsKIAkJKnhmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKG5ld2R1cCkgPQotCQkJY3B1X3RvX2JlMTYoKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWQpOworCQkJY3B1X3RvX2JlMTYoKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWhkcik7CiAJCXhmc19kaXIyX2RhdGFfbG9nX3VudXNlZCh0cCwgYnAsIG5ld2R1cCk7CiAJCS8qCiAJCSAqIElmIHRoZSBmb2xsb3dpbmcgZW50cnkgd2FzIGluIHRoZSB0YWJsZSwgdGhlIG5ldyBlbnRyeQpAQCAtNjYwLDI4ICs2NjYsMjggQEAKIAkJICogdGhlIG9sZCBvbmUgYW5kIGFkZCB0aGUgbmV3IG9uZS4KIAkJICovCiAJCWlmIChkZnApIHsKLQkJCXhmc19kaXIyX2RhdGFfZnJlZXJlbW92ZShkLCBkZnAsIG5lZWRsb2dwKTsKLQkJCSh2b2lkKXhmc19kaXIyX2RhdGFfZnJlZWluc2VydChkLCBuZXdkdXAsIG5lZWRsb2dwKTsKKwkJCXhmc19kaXIyX2RhdGFfZnJlZXJlbW92ZShoZHIsIGRmcCwgbmVlZGxvZ3ApOworCQkJeGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGhkciwgbmV3ZHVwLCBuZWVkbG9ncCk7CiAJCX0KIAkJLyoKIAkJICogT3RoZXJ3aXNlIHdlIG5lZWQgYSBzY2FuIGlmIHRoZSBuZXcgZW50cnkgaXMgYmlnIGVub3VnaC4KIAkJICovCiAJCWVsc2UgewogCQkJbmVlZHNjYW4gPSBiZTE2X3RvX2NwdShuZXdkdXAtPmxlbmd0aCkgPgotCQkJCSAgIGJlMTZfdG9fY3B1KGQtPmhkci5iZXN0ZnJlZVsyXS5sZW5ndGgpOworCQkJCSAgIGJlMTZfdG9fY3B1KGhkci0+YmVzdGZyZWVbMl0ubGVuZ3RoKTsKIAkJfQogCX0KIAkvKgogCSAqIE5laXRoZXIgbmVpZ2hib3IgaXMgZnJlZS4gIE1ha2UgYSBuZXcgZW50cnkuCiAJICovCiAJZWxzZSB7Ci0JCW5ld2R1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopKChjaGFyICopZCArIG9mZnNldCk7CisJCW5ld2R1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopKChjaGFyICopaGRyICsgb2Zmc2V0KTsKIAkJbmV3ZHVwLT5mcmVldGFnID0gY3B1X3RvX2JlMTYoWEZTX0RJUjJfREFUQV9GUkVFX1RBRyk7CiAJCW5ld2R1cC0+bGVuZ3RoID0gY3B1X3RvX2JlMTYobGVuKTsKIAkJKnhmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKG5ld2R1cCkgPQotCQkJY3B1X3RvX2JlMTYoKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWQpOworCQkJY3B1X3RvX2JlMTYoKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWhkcik7CiAJCXhmc19kaXIyX2RhdGFfbG9nX3VudXNlZCh0cCwgYnAsIG5ld2R1cCk7Ci0JCSh2b2lkKXhmc19kaXIyX2RhdGFfZnJlZWluc2VydChkLCBuZXdkdXAsIG5lZWRsb2dwKTsKKwkJeGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGhkciwgbmV3ZHVwLCBuZWVkbG9ncCk7CiAJfQogCSpuZWVkc2NhbnAgPSBuZWVkc2NhbjsKIH0KQEAgLTY5OSw3ICs3MDUsNyBAQAogCWludAkJCSpuZWVkbG9ncCwJLyogb3V0OiBuZWVkIHRvIGxvZyBoZWFkZXIgKi8KIAlpbnQJCQkqbmVlZHNjYW5wKQkvKiBvdXQ6IG5lZWQgcmVnZW4gYmVzdGZyZWUgKi8KIHsKLQl4ZnNfZGlyMl9kYXRhX3QJCSpkOwkJLyogZGF0YSBibG9jayAqLworCXhmc19kaXIyX2RhdGFfaGRyX3QJKmhkcjsJCS8qIGRhdGEgYmxvY2sgaGVhZGVyICovCiAJeGZzX2RpcjJfZGF0YV9mcmVlX3QJKmRmcDsJCS8qIGJlc3RmcmVlIHBvaW50ZXIgKi8KIAlpbnQJCQltYXRjaGJhY2s7CS8qIG1hdGNoZXMgZW5kIG9mIGZyZWVzcGFjZSAqLwogCWludAkJCW1hdGNoZnJvbnQ7CS8qIG1hdGNoZXMgc3RhcnQgb2YgZnJlZXNwYWNlICovCkBAIC03MDgsMjQgKzcxNCwyNCBAQAogCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKm5ld2R1cDI7CS8qIGFub3RoZXIgbmV3IHVudXNlZCBlbnRyeSAqLwogCWludAkJCW9sZGxlbjsJCS8qIG9sZCB1bnVzZWQgZW50cnkncyBsZW5ndGggKi8KIAotCWQgPSBicC0+ZGF0YTsKLQlBU1NFUlQoYmUzMl90b19jcHUoZC0+aGRyLm1hZ2ljKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDIHx8Ci0JICAgICAgIGJlMzJfdG9fY3B1KGQtPmhkci5tYWdpYykgPT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpOworCWhkciA9IGJwLT5kYXRhOworCUFTU0VSVChoZHItPm1hZ2ljID09IGNwdV90b19iZTMyKFhGU19ESVIyX0RBVEFfTUFHSUMpIHx8CisJICAgICAgIGhkci0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfQkxPQ0tfTUFHSUMpKTsKIAlBU1NFUlQoYmUxNl90b19jcHUoZHVwLT5mcmVldGFnKSA9PSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKTsKLQlBU1NFUlQob2Zmc2V0ID49IChjaGFyICopZHVwIC0gKGNoYXIgKilkKTsKLQlBU1NFUlQob2Zmc2V0ICsgbGVuIDw9IChjaGFyICopZHVwICsgYmUxNl90b19jcHUoZHVwLT5sZW5ndGgpIC0gKGNoYXIgKilkKTsKLQlBU1NFUlQoKGNoYXIgKilkdXAgLSAoY2hhciAqKWQgPT0gYmUxNl90b19jcHUoKnhmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKGR1cCkpKTsKKwlBU1NFUlQob2Zmc2V0ID49IChjaGFyICopZHVwIC0gKGNoYXIgKiloZHIpOworCUFTU0VSVChvZmZzZXQgKyBsZW4gPD0gKGNoYXIgKilkdXAgKyBiZTE2X3RvX2NwdShkdXAtPmxlbmd0aCkgLSAoY2hhciAqKWhkcik7CisJQVNTRVJUKChjaGFyICopZHVwIC0gKGNoYXIgKiloZHIgPT0gYmUxNl90b19jcHUoKnhmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKGR1cCkpKTsKIAkvKgogCSAqIExvb2sgdXAgdGhlIGVudHJ5IGluIHRoZSBiZXN0ZnJlZSB0YWJsZS4KIAkgKi8KLQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVmaW5kKGQsIGR1cCk7CisJZGZwID0geGZzX2RpcjJfZGF0YV9mcmVlZmluZChoZHIsIGR1cCk7CiAJb2xkbGVuID0gYmUxNl90b19jcHUoZHVwLT5sZW5ndGgpOwotCUFTU0VSVChkZnAgfHwgb2xkbGVuIDw9IGJlMTZfdG9fY3B1KGQtPmhkci5iZXN0ZnJlZVsyXS5sZW5ndGgpKTsKKwlBU1NFUlQoZGZwIHx8IG9sZGxlbiA8PSBiZTE2X3RvX2NwdShoZHItPmJlc3RmcmVlWzJdLmxlbmd0aCkpOwogCS8qCiAJICogQ2hlY2sgZm9yIGFsaWdubWVudCB3aXRoIGZyb250IGFuZCBiYWNrIG9mIHRoZSBlbnRyeS4KIAkgKi8KLQltYXRjaGZyb250ID0gKGNoYXIgKilkdXAgLSAoY2hhciAqKWQgPT0gb2Zmc2V0OwotCW1hdGNoYmFjayA9IChjaGFyICopZHVwICsgb2xkbGVuIC0gKGNoYXIgKilkID09IG9mZnNldCArIGxlbjsKKwltYXRjaGZyb250ID0gKGNoYXIgKilkdXAgLSAoY2hhciAqKWhkciA9PSBvZmZzZXQ7CisJbWF0Y2hiYWNrID0gKGNoYXIgKilkdXAgKyBvbGRsZW4gLSAoY2hhciAqKWhkciA9PSBvZmZzZXQgKyBsZW47CiAJQVNTRVJUKCpuZWVkc2NhbnAgPT0gMCk7CiAJbmVlZHNjYW4gPSAwOwogCS8qCkBAIC03MzQsOSArNzQwLDkgQEAKIAkgKi8KIAlpZiAobWF0Y2hmcm9udCAmJiBtYXRjaGJhY2spIHsKIAkJaWYgKGRmcCkgewotCQkJbmVlZHNjYW4gPSAoZC0+aGRyLmJlc3RmcmVlWzJdLm9mZnNldCAhPSAwKTsKKwkJCW5lZWRzY2FuID0gKGhkci0+YmVzdGZyZWVbMl0ub2Zmc2V0ICE9IDApOwogCQkJaWYgKCFuZWVkc2NhbikKLQkJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoZCwgZGZwLCBuZWVkbG9ncCk7CisJCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGhkciwgZGZwLCBuZWVkbG9ncCk7CiAJCX0KIAl9CiAJLyoKQEAgLTc0NCwyNyArNzUwLDI3IEBACiAJICogTWFrZSBhIG5ldyBlbnRyeSB3aXRoIHRoZSByZW1haW5pbmcgZnJlZXNwYWNlLgogCSAqLwogCWVsc2UgaWYgKG1hdGNoZnJvbnQpIHsKLQkJbmV3ZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKilkICsgb2Zmc2V0ICsgbGVuKTsKKwkJbmV3ZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKiloZHIgKyBvZmZzZXQgKyBsZW4pOwogCQluZXdkdXAtPmZyZWV0YWcgPSBjcHVfdG9fYmUxNihYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKTsKIAkJbmV3ZHVwLT5sZW5ndGggPSBjcHVfdG9fYmUxNihvbGRsZW4gLSBsZW4pOwogCQkqeGZzX2RpcjJfZGF0YV91bnVzZWRfdGFnX3AobmV3ZHVwKSA9Ci0JCQljcHVfdG9fYmUxNigoY2hhciAqKW5ld2R1cCAtIChjaGFyICopZCk7CisJCQljcHVfdG9fYmUxNigoY2hhciAqKW5ld2R1cCAtIChjaGFyICopaGRyKTsKIAkJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHRwLCBicCwgbmV3ZHVwKTsKIAkJLyoKIAkJICogSWYgaXQgd2FzIGluIHRoZSB0YWJsZSwgcmVtb3ZlIGl0IGFuZCBhZGQgdGhlIG5ldyBvbmUuCiAJCSAqLwogCQlpZiAoZGZwKSB7Ci0JCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoZCwgZGZwLCBuZWVkbG9ncCk7Ci0JCQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoZCwgbmV3ZHVwLCBuZWVkbG9ncCk7CisJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoaGRyLCBkZnAsIG5lZWRsb2dwKTsKKwkJCWRmcCA9IHhmc19kaXIyX2RhdGFfZnJlZWluc2VydChoZHIsIG5ld2R1cCwgbmVlZGxvZ3ApOwogCQkJQVNTRVJUKGRmcCAhPSBOVUxMKTsKIAkJCUFTU0VSVChkZnAtPmxlbmd0aCA9PSBuZXdkdXAtPmxlbmd0aCk7Ci0JCQlBU1NFUlQoYmUxNl90b19jcHUoZGZwLT5vZmZzZXQpID09IChjaGFyICopbmV3ZHVwIC0gKGNoYXIgKilkKTsKKwkJCUFTU0VSVChiZTE2X3RvX2NwdShkZnAtPm9mZnNldCkgPT0gKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWhkcik7CiAJCQkvKgogCQkJICogSWYgd2UgZ290IGluc2VydGVkIGF0IHRoZSBsYXN0IHNsb3QsCiAJCQkgKiB0aGF0IG1lYW5zIHdlIGRvbid0IGtub3cgaWYgdGhlcmUgd2FzIGEgYmV0dGVyCiAJCQkgKiBjaG9pY2UgZm9yIHRoZSBsYXN0IHNsb3QsIG9yIG5vdC4gIFJlc2Nhbi4KIAkJCSAqLwotCQkJbmVlZHNjYW4gPSBkZnAgPT0gJmQtPmhkci5iZXN0ZnJlZVsyXTsKKwkJCW5lZWRzY2FuID0gZGZwID09ICZoZHItPmJlc3RmcmVlWzJdOwogCQl9CiAJfQogCS8qCkBAIC03NzMsMjUgKzc3OSwyNSBAQAogCSAqLwogCWVsc2UgaWYgKG1hdGNoYmFjaykgewogCQluZXdkdXAgPSBkdXA7Ci0JCW5ld2R1cC0+bGVuZ3RoID0gY3B1X3RvX2JlMTYoKChjaGFyICopZCArIG9mZnNldCkgLSAoY2hhciAqKW5ld2R1cCk7CisJCW5ld2R1cC0+bGVuZ3RoID0gY3B1X3RvX2JlMTYoKChjaGFyICopaGRyICsgb2Zmc2V0KSAtIChjaGFyICopbmV3ZHVwKTsKIAkJKnhmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKG5ld2R1cCkgPQotCQkJY3B1X3RvX2JlMTYoKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWQpOworCQkJY3B1X3RvX2JlMTYoKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWhkcik7CiAJCXhmc19kaXIyX2RhdGFfbG9nX3VudXNlZCh0cCwgYnAsIG5ld2R1cCk7CiAJCS8qCiAJCSAqIElmIGl0IHdhcyBpbiB0aGUgdGFibGUsIHJlbW92ZSBpdCBhbmQgYWRkIHRoZSBuZXcgb25lLgogCQkgKi8KIAkJaWYgKGRmcCkgewotCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGQsIGRmcCwgbmVlZGxvZ3ApOwotCQkJZGZwID0geGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGQsIG5ld2R1cCwgbmVlZGxvZ3ApOworCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGhkciwgZGZwLCBuZWVkbG9ncCk7CisJCQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoaGRyLCBuZXdkdXAsIG5lZWRsb2dwKTsKIAkJCUFTU0VSVChkZnAgIT0gTlVMTCk7CiAJCQlBU1NFUlQoZGZwLT5sZW5ndGggPT0gbmV3ZHVwLT5sZW5ndGgpOwotCQkJQVNTRVJUKGJlMTZfdG9fY3B1KGRmcC0+b2Zmc2V0KSA9PSAoY2hhciAqKW5ld2R1cCAtIChjaGFyICopZCk7CisJCQlBU1NFUlQoYmUxNl90b19jcHUoZGZwLT5vZmZzZXQpID09IChjaGFyICopbmV3ZHVwIC0gKGNoYXIgKiloZHIpOwogCQkJLyoKIAkJCSAqIElmIHdlIGdvdCBpbnNlcnRlZCBhdCB0aGUgbGFzdCBzbG90LAogCQkJICogdGhhdCBtZWFucyB3ZSBkb24ndCBrbm93IGlmIHRoZXJlIHdhcyBhIGJldHRlcgogCQkJICogY2hvaWNlIGZvciB0aGUgbGFzdCBzbG90LCBvciBub3QuICBSZXNjYW4uCiAJCQkgKi8KLQkJCW5lZWRzY2FuID0gZGZwID09ICZkLT5oZHIuYmVzdGZyZWVbMl07CisJCQluZWVkc2NhbiA9IGRmcCA9PSAmaGRyLT5iZXN0ZnJlZVsyXTsKIAkJfQogCX0KIAkvKgpAQCAtODAwLDE1ICs4MDYsMTUgQEAKIAkgKi8KIAllbHNlIHsKIAkJbmV3ZHVwID0gZHVwOwotCQluZXdkdXAtPmxlbmd0aCA9IGNwdV90b19iZTE2KCgoY2hhciAqKWQgKyBvZmZzZXQpIC0gKGNoYXIgKiluZXdkdXApOworCQluZXdkdXAtPmxlbmd0aCA9IGNwdV90b19iZTE2KCgoY2hhciAqKWhkciArIG9mZnNldCkgLSAoY2hhciAqKW5ld2R1cCk7CiAJCSp4ZnNfZGlyMl9kYXRhX3VudXNlZF90YWdfcChuZXdkdXApID0KLQkJCWNwdV90b19iZTE2KChjaGFyICopbmV3ZHVwIC0gKGNoYXIgKilkKTsKKwkJCWNwdV90b19iZTE2KChjaGFyICopbmV3ZHVwIC0gKGNoYXIgKiloZHIpOwogCQl4ZnNfZGlyMl9kYXRhX2xvZ191bnVzZWQodHAsIGJwLCBuZXdkdXApOwotCQluZXdkdXAyID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKilkICsgb2Zmc2V0ICsgbGVuKTsKKwkJbmV3ZHVwMiA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopKChjaGFyICopaGRyICsgb2Zmc2V0ICsgbGVuKTsKIAkJbmV3ZHVwMi0+ZnJlZXRhZyA9IGNwdV90b19iZTE2KFhGU19ESVIyX0RBVEFfRlJFRV9UQUcpOwogCQluZXdkdXAyLT5sZW5ndGggPSBjcHVfdG9fYmUxNihvbGRsZW4gLSBsZW4gLSBiZTE2X3RvX2NwdShuZXdkdXAtPmxlbmd0aCkpOwogCQkqeGZzX2RpcjJfZGF0YV91bnVzZWRfdGFnX3AobmV3ZHVwMikgPQotCQkJY3B1X3RvX2JlMTYoKGNoYXIgKiluZXdkdXAyIC0gKGNoYXIgKilkKTsKKwkJCWNwdV90b19iZTE2KChjaGFyICopbmV3ZHVwMiAtIChjaGFyICopaGRyKTsKIAkJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHRwLCBicCwgbmV3ZHVwMik7CiAJCS8qCiAJCSAqIElmIHRoZSBvbGQgZW50cnkgd2FzIGluIHRoZSB0YWJsZSwgd2UgbmVlZCB0byBzY2FuCkBAIC04MTksMTMgKzgyNSwxMiBAQAogCQkgKiB0aGUgMiBuZXcgd2lsbCB3b3JrLgogCQkgKi8KIAkJaWYgKGRmcCkgewotCQkJbmVlZHNjYW4gPSAoZC0+aGRyLmJlc3RmcmVlWzJdLmxlbmd0aCAhPSAwKTsKKwkJCW5lZWRzY2FuID0gKGhkci0+YmVzdGZyZWVbMl0ubGVuZ3RoICE9IDApOwogCQkJaWYgKCFuZWVkc2NhbikgewotCQkJCXhmc19kaXIyX2RhdGFfZnJlZXJlbW92ZShkLCBkZnAsIG5lZWRsb2dwKTsKLQkJCQkodm9pZCl4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoZCwgbmV3ZHVwLAotCQkJCQluZWVkbG9ncCk7Ci0JCQkJKHZvaWQpeGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGQsIG5ld2R1cDIsCi0JCQkJCW5lZWRsb2dwKTsKKwkJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoaGRyLCBkZnAsIG5lZWRsb2dwKTsKKwkJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoaGRyLCBuZXdkdXAsIG5lZWRsb2dwKTsKKwkJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoaGRyLCBuZXdkdXAyLAorCQkJCQkJCSBuZWVkbG9ncCk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfZGF0YS5oIGIvZnMveGZzL3hmc19kaXIyX2RhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiYzI5MC4uMDAwMDAwMAotLS0gYS9mcy94ZnMveGZzX2RpcjJfZGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaWZuZGVmIF9fWEZTX0RJUjJfREFUQV9IX18KLSNkZWZpbmUJX19YRlNfRElSMl9EQVRBX0hfXwotCi0vKgotICogRGlyZWN0b3J5IGZvcm1hdCAyLCBkYXRhIGJsb2NrIHN0cnVjdHVyZXMuCi0gKi8KLQotc3RydWN0IHhmc19kYWJ1ZjsKLXN0cnVjdCB4ZnNfZGFfYXJnczsKLXN0cnVjdCB4ZnNfaW5vZGU7Ci1zdHJ1Y3QgeGZzX3RyYW5zOwotCi0vKgotICogQ29uc3RhbnRzLgotICovCi0jZGVmaW5lCVhGU19ESVIyX0RBVEFfTUFHSUMJMHg1ODQ0MzI0NAkvKiBYRDJEOiBmb3IgbXVsdGlibG9jayBkaXJzICovCi0jZGVmaW5lCVhGU19ESVIyX0RBVEFfQUxJR05fTE9HCTMJCS8qIGkuZS4sIDggYnl0ZXMgKi8KLSNkZWZpbmUJWEZTX0RJUjJfREFUQV9BTElHTgkoMSA8PCBYRlNfRElSMl9EQVRBX0FMSUdOX0xPRykKLSNkZWZpbmUJWEZTX0RJUjJfREFUQV9GUkVFX1RBRwkweGZmZmYKLSNkZWZpbmUJWEZTX0RJUjJfREFUQV9GRF9DT1VOVAkzCi0KLS8qCi0gKiBEaXJlY3RvcnkgYWRkcmVzcyBzcGFjZSBkaXZpZGVkIGludG8gc2VjdGlvbnMsCi0gKiBzcGFjZXMgc2VwYXJhdGVkIGJ5IDMyR0IuCi0gKi8KLSNkZWZpbmUJWEZTX0RJUjJfU1BBQ0VfU0laRQkoMVVMTCA8PCAoMzIgKyBYRlNfRElSMl9EQVRBX0FMSUdOX0xPRykpCi0jZGVmaW5lCVhGU19ESVIyX0RBVEFfU1BBQ0UJMAotI2RlZmluZQlYRlNfRElSMl9EQVRBX09GRlNFVAkoWEZTX0RJUjJfREFUQV9TUEFDRSAqIFhGU19ESVIyX1NQQUNFX1NJWkUpCi0jZGVmaW5lCVhGU19ESVIyX0RBVEFfRklSU1REQihtcCkJXAotCXhmc19kaXIyX2J5dGVfdG9fZGIobXAsIFhGU19ESVIyX0RBVEFfT0ZGU0VUKQotCi0vKgotICogT2Zmc2V0cyBvZiAuIGFuZCAuLiBpbiBkYXRhIHNwYWNlIChhbHdheXMgYmxvY2sgMCkKLSAqLwotI2RlZmluZQlYRlNfRElSMl9EQVRBX0RPVF9PRkZTRVQJXAotCSgoeGZzX2RpcjJfZGF0YV9hb2ZmX3Qpc2l6ZW9mKHhmc19kaXIyX2RhdGFfaGRyX3QpKQotI2RlZmluZQlYRlNfRElSMl9EQVRBX0RPVERPVF9PRkZTRVQJXAotCShYRlNfRElSMl9EQVRBX0RPVF9PRkZTRVQgKyB4ZnNfZGlyMl9kYXRhX2VudHNpemUoMSkpCi0jZGVmaW5lCVhGU19ESVIyX0RBVEFfRklSU1RfT0ZGU0VUCQlcCi0JKFhGU19ESVIyX0RBVEFfRE9URE9UX09GRlNFVCArIHhmc19kaXIyX2RhdGFfZW50c2l6ZSgyKSkKLQotLyoKLSAqIFN0cnVjdHVyZXMuCi0gKi8KLQotLyoKLSAqIERlc2NyaWJlIGEgZnJlZSBhcmVhIGluIHRoZSBkYXRhIGJsb2NrLgotICogVGhlIGZyZWVzcGFjZSB3aWxsIGJlIGZvcm1hdHRlZCBhcyBhIHhmc19kaXIyX2RhdGFfdW51c2VkX3QuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHhmc19kaXIyX2RhdGFfZnJlZSB7Ci0JX19iZTE2CQkJb2Zmc2V0OwkJLyogc3RhcnQgb2YgZnJlZXNwYWNlICovCi0JX19iZTE2CQkJbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIGZyZWVzcGFjZSAqLwotfSB4ZnNfZGlyMl9kYXRhX2ZyZWVfdDsKLQotLyoKLSAqIEhlYWRlciBmb3IgdGhlIGRhdGEgYmxvY2tzLgotICogQWx3YXlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBkaXJlY3Rvcnktc2l6ZWQgYmxvY2suCi0gKiBUaGUgY29kZSBrbm93cyB0aGF0IFhGU19ESVIyX0RBVEFfRkRfQ09VTlQgaXMgMy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfZGF0YV9oZHIgewotCV9fYmUzMgkJCW1hZ2ljOwkJLyogWEZTX0RJUjJfREFUQV9NQUdJQyAqLwotCQkJCQkJLyogb3IgWEZTX0RJUjJfQkxPQ0tfTUFHSUMgKi8KLQl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAliZXN0ZnJlZVtYRlNfRElSMl9EQVRBX0ZEX0NPVU5UXTsKLX0geGZzX2RpcjJfZGF0YV9oZHJfdDsKLQotLyoKLSAqIEFjdGl2ZSBlbnRyeSBpbiBhIGRhdGEgYmxvY2suICBBbGlnbmVkIHRvIDggYnl0ZXMuCi0gKiBUYWcgYXBwZWFycyBhcyB0aGUgbGFzdCAyIGJ5dGVzLgotICovCi10eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9kYXRhX2VudHJ5IHsKLQlfX2JlNjQJCQlpbnVtYmVyOwkvKiBpbm9kZSBudW1iZXIgKi8KLQlfX3U4CQkJbmFtZWxlbjsJLyogbmFtZSBsZW5ndGggKi8KLQlfX3U4CQkJbmFtZVsxXTsJLyogbmFtZSBieXRlcywgbm8gbnVsbCAqLwotCQkJCQkJLyogdmFyaWFibGUgb2Zmc2V0ICovCi0JX19iZTE2CQkJdGFnOwkJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHVzICovCi19IHhmc19kaXIyX2RhdGFfZW50cnlfdDsKLQotLyoKLSAqIFVudXNlZCBlbnRyeSBpbiBhIGRhdGEgYmxvY2suICBBbGlnbmVkIHRvIDggYnl0ZXMuCi0gKiBUYWcgYXBwZWFycyBhcyB0aGUgbGFzdCAyIGJ5dGVzLgotICovCi10eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9kYXRhX3VudXNlZCB7Ci0JX19iZTE2CQkJZnJlZXRhZzsJLyogWEZTX0RJUjJfREFUQV9GUkVFX1RBRyAqLwotCV9fYmUxNgkJCWxlbmd0aDsJCS8qIHRvdGFsIGZyZWUgbGVuZ3RoICovCi0JCQkJCQkvKiB2YXJpYWJsZSBvZmZzZXQgKi8KLQlfX2JlMTYJCQl0YWc7CQkvKiBzdGFydGluZyBvZmZzZXQgb2YgdXMgKi8KLX0geGZzX2RpcjJfZGF0YV91bnVzZWRfdDsKLQotdHlwZWRlZiB1bmlvbiB7Ci0JeGZzX2RpcjJfZGF0YV9lbnRyeV90CWVudHJ5OwotCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJdW51c2VkOwotfSB4ZnNfZGlyMl9kYXRhX3VuaW9uX3Q7Ci0KLS8qCi0gKiBHZW5lcmljIGRhdGEgYmxvY2sgc3RydWN0dXJlLCBmb3IgeGZzX2RiLgotICovCi10eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9kYXRhIHsKLQl4ZnNfZGlyMl9kYXRhX2hkcl90CWhkcjsJCS8qIG1hZ2ljIFhGU19ESVIyX0RBVEFfTUFHSUMgKi8KLQl4ZnNfZGlyMl9kYXRhX3VuaW9uX3QJdVsxXTsKLX0geGZzX2RpcjJfZGF0YV90OwotCi0vKgotICogTWFjcm9zLgotICovCi0KLS8qCi0gKiBTaXplIG9mIGEgZGF0YSBlbnRyeS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgeGZzX2RpcjJfZGF0YV9lbnRzaXplKGludCBuKQotewotCXJldHVybiAoaW50KXJvdW5kdXAob2Zmc2V0b2YoeGZzX2RpcjJfZGF0YV9lbnRyeV90LCBuYW1lWzBdKSArIChuKSArIFwKLQkJICh1aW50KXNpemVvZih4ZnNfZGlyMl9kYXRhX29mZl90KSwgWEZTX0RJUjJfREFUQV9BTElHTik7Ci19Ci0KLS8qCi0gKiBQb2ludGVyIHRvIGFuIGVudHJ5J3MgdGFnIHdvcmQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgX19iZTE2ICoKLXhmc19kaXIyX2RhdGFfZW50cnlfdGFnX3AoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICpkZXApCi17Ci0JcmV0dXJuIChfX2JlMTYgKikoKGNoYXIgKilkZXAgKwotCQl4ZnNfZGlyMl9kYXRhX2VudHNpemUoZGVwLT5uYW1lbGVuKSAtIHNpemVvZihfX2JlMTYpKTsKLX0KLQotLyoKLSAqIFBvaW50ZXIgdG8gYSBmcmVlc3BhY2UncyB0YWcgd29yZC4KLSAqLwotc3RhdGljIGlubGluZSBfX2JlMTYgKgoteGZzX2RpcjJfZGF0YV91bnVzZWRfdGFnX3AoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwKQotewotCXJldHVybiAoX19iZTE2ICopKChjaGFyICopZHVwICsKLQkJCWJlMTZfdG9fY3B1KGR1cC0+bGVuZ3RoKSAtIHNpemVvZihfX2JlMTYpKTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLSAqLwotI2lmZGVmIERFQlVHCi1leHRlcm4gdm9pZCB4ZnNfZGlyMl9kYXRhX2NoZWNrKHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7Ci0jZWxzZQotI2RlZmluZQl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLGJwKQotI2VuZGlmCi1leHRlcm4geGZzX2RpcjJfZGF0YV9mcmVlX3QgKnhmc19kaXIyX2RhdGFfZnJlZWZpbmQoeGZzX2RpcjJfZGF0YV90ICpkLAotCQkJCXhmc19kaXIyX2RhdGFfdW51c2VkX3QgKmR1cCk7Ci1leHRlcm4geGZzX2RpcjJfZGF0YV9mcmVlX3QgKnhmc19kaXIyX2RhdGFfZnJlZWluc2VydCh4ZnNfZGlyMl9kYXRhX3QgKmQsCi0JCQkJeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwLCBpbnQgKmxvZ2hlYWQpOwotZXh0ZXJuIHZvaWQgeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YV90ICpkLAotCQkJCWludCAqbG9naGVhZCk7Ci1leHRlcm4gaW50IHhmc19kaXIyX2RhdGFfaW5pdChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHhmc19kaXIyX2RiX3QgYmxrbm8sCi0JCQkJc3RydWN0IHhmc19kYWJ1ZiAqKmJwcCk7Ci1leHRlcm4gdm9pZCB4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeShzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCi0JCQkJeGZzX2RpcjJfZGF0YV9lbnRyeV90ICpkZXApOwotZXh0ZXJuIHZvaWQgeGZzX2RpcjJfZGF0YV9sb2dfaGVhZGVyKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLAotCQkJCXN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKLWV4dGVybiB2b2lkIHhmc19kaXIyX2RhdGFfbG9nX3VudXNlZChzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCi0JCQkJeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwKTsKLWV4dGVybiB2b2lkIHhmc19kaXIyX2RhdGFfbWFrZV9mcmVlKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKLQkJCQl4ZnNfZGlyMl9kYXRhX2FvZmZfdCBvZmZzZXQsCi0JCQkJeGZzX2RpcjJfZGF0YV9hb2ZmX3QgbGVuLCBpbnQgKm5lZWRsb2dwLAotCQkJCWludCAqbmVlZHNjYW5wKTsKLWV4dGVybiB2b2lkIHhmc19kaXIyX2RhdGFfdXNlX2ZyZWUoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAotCQkJICAgICAgIHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKmR1cCwKLQkJCSAgICAgICB4ZnNfZGlyMl9kYXRhX2FvZmZfdCBvZmZzZXQsCi0JCQkgICAgICAgeGZzX2RpcjJfZGF0YV9hb2ZmX3QgbGVuLCBpbnQgKm5lZWRsb2dwLAotCQkJICAgICAgIGludCAqbmVlZHNjYW5wKTsKLQotI2VuZGlmCS8qIF9fWEZTX0RJUjJfREFUQV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9mb3JtYXQuaCBiL2ZzL3hmcy94ZnNfZGlyMl9mb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzI3MDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXIyX2Zvcm1hdC5oCkBAIC0wLDAgKzEsNTk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisjaWZuZGVmIF9fWEZTX0RJUjJfRk9STUFUX0hfXworI2RlZmluZSBfX1hGU19ESVIyX0ZPUk1BVF9IX18KKworLyoKKyAqIERpcmVjdG9yeSB2ZXJzaW9uIDIuCisgKgorICogVGhlcmUgYXJlIDQgcG9zc2libGUgZm9ybWF0czoKKyAqICAtIHNob3J0Zm9ybSAtIGVtYmVkZGVkIGludG8gdGhlIGlub2RlCisgKiAgLSBzaW5nbGUgYmxvY2sgLSBkYXRhIHdpdGggZW1iZWRkZWQgbGVhZiBhdCB0aGUgZW5kCisgKiAgLSBtdWx0aXBsZSBkYXRhIGJsb2Nrcywgc2luZ2xlIGxlYWYrZnJlZWluZGV4IGJsb2NrCisgKiAgLSBkYXRhIGJsb2Nrcywgbm9kZSBhbmQgbGVhZiBibG9ja3MgKGJ0cmVlKSwgZnJlZWluZGV4IGJsb2NrcworICoKKyAqIE5vdGU6IG1hbnkgbm9kZSBibG9ja3Mgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzIGFyZSBzaGFyZWQgd2l0aCB0aGUgYXR0cgorICogY29kZSBhbmQgZGVmaW5lZCBpbiB4ZnNfZGFfYnRyZWUuaC4KKyAqLworCisjZGVmaW5lCVhGU19ESVIyX0JMT0NLX01BR0lDCTB4NTg0NDMyNDIJLyogWEQyQjogc2luZ2xlIGJsb2NrIGRpcnMgKi8KKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9NQUdJQwkweDU4NDQzMjQ0CS8qIFhEMkQ6IG11bHRpYmxvY2sgZGlycyAqLworI2RlZmluZQlYRlNfRElSMl9GUkVFX01BR0lDCTB4NTg0NDMyNDYJLyogWEQyRjogZnJlZSBpbmRleCBibG9ja3MgKi8KKworLyoKKyAqIEJ5dGUgb2Zmc2V0IGluIGRhdGEgYmxvY2sgYW5kIHNob3J0Zm9ybSBlbnRyeS4KKyAqLwordHlwZWRlZglfX3VpbnQxNl90CXhmc19kaXIyX2RhdGFfb2ZmX3Q7CisjZGVmaW5lCU5VTExEQVRBT0ZGCTB4ZmZmZlUKK3R5cGVkZWYgdWludAkJeGZzX2RpcjJfZGF0YV9hb2ZmX3Q7CS8qIGFyZ3VtZW50IGZvcm0gKi8KKworLyoKKyAqIE5vcm1hbGl6ZWQgb2Zmc2V0IChpbiBhIGRhdGEgYmxvY2spIG9mIHRoZSBlbnRyeSwgcmVhbGx5IHhmc19kaXIyX2RhdGFfb2ZmX3QuCisgKiBPbmx5IG5lZWQgMTYgYml0cywgdGhpcyBpcyB0aGUgYnl0ZSBvZmZzZXQgaW50byB0aGUgc2luZ2xlIGJsb2NrIGZvcm0uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgX191aW50OF90IGlbMl07IH0gX19hcmNoX3BhY2sgeGZzX2RpcjJfc2Zfb2ZmX3Q7CisKKy8qCisgKiBPZmZzZXQgaW4gZGF0YSBzcGFjZSBvZiBhIGRhdGEgZW50cnkuCisgKi8KK3R5cGVkZWYJX191aW50MzJfdAl4ZnNfZGlyMl9kYXRhcHRyX3Q7CisjZGVmaW5lCVhGU19ESVIyX01BWF9EQVRBUFRSCSgoeGZzX2RpcjJfZGF0YXB0cl90KTB4ZmZmZmZmZmYpCisjZGVmaW5lCVhGU19ESVIyX05VTExfREFUQVBUUgkoKHhmc19kaXIyX2RhdGFwdHJfdCkwKQorCisvKgorICogQnl0ZSBvZmZzZXQgaW4gYSBkaXJlY3RvcnkuCisgKi8KK3R5cGVkZWYJeGZzX29mZl90CXhmc19kaXIyX29mZl90OworCisvKgorICogRGlyZWN0b3J5IGJsb2NrIG51bWJlciAobG9naWNhbCBkaXJibGsgaW4gZmlsZSkKKyAqLwordHlwZWRlZglfX3VpbnQzMl90CXhmc19kaXIyX2RiX3Q7CisKKy8qCisgKiBJbm9kZSBudW1iZXIgc3RvcmVkIGFzIDggOC1iaXQgdmFsdWVzLgorICovCit0eXBlZGVmCXN0cnVjdCB7IF9fdWludDhfdCBpWzhdOyB9IHhmc19kaXIyX2lubzhfdDsKKworLyoKKyAqIElub2RlIG51bWJlciBzdG9yZWQgYXMgNCA4LWJpdCB2YWx1ZXMuCisgKiBXb3JrcyBhIGxvdCBvZiB0aGUgdGltZSwgd2hlbiBhbGwgdGhlIGlub2RlIG51bWJlcnMgaW4gYSBkaXJlY3RvcnkKKyAqIGZpdCBpbiAzMiBiaXRzLgorICovCit0eXBlZGVmIHN0cnVjdCB7IF9fdWludDhfdCBpWzRdOyB9IHhmc19kaXIyX2lubzRfdDsKKwordHlwZWRlZiB1bmlvbiB7CisJeGZzX2RpcjJfaW5vOF90CWk4OworCXhmc19kaXIyX2lubzRfdAlpNDsKK30geGZzX2RpcjJfaW5vdV90OworI2RlZmluZQlYRlNfRElSMl9NQVhfU0hPUlRfSU5VTQkoKHhmc19pbm9fdCkweGZmZmZmZmZmVUxMKQorCisvKgorICogRGlyZWN0b3J5IGxheW91dCB3aGVuIHN0b3JlZCBpbnRlcm5hbCB0byBhbiBpbm9kZS4KKyAqCisgKiBTbWFsbCBkaXJlY3RvcmllcyBhcmUgcGFja2VkIGFzIHRpZ2h0bHkgYXMgcG9zc2libGUgc28gYXMgdG8gZml0IGludG8gdGhlCisgKiBsaXRlcmFsIGFyZWEgb2YgdGhlIGlub2RlLiAgVGhlc2UgInNob3J0Zm9ybSIgZGlyZWN0b3JpZXMgY29uc2lzdCBvZiBhCisgKiBzaW5nbGUgeGZzX2RpcjJfc2ZfaGRyIGhlYWRlciBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgeGZzX2RpcjJfc2ZfZW50cnkKKyAqIHN0cnVjdHVyZXMuICBEdWUgdGhlIGRpZmZlcmVudCBpbm9kZSBudW1iZXIgc3RvcmFnZSBzaXplIGFuZCB0aGUgdmFyaWFibGUKKyAqIGxlbmd0aCBuYW1lIGZpZWxkIGluIHRoZSB4ZnNfZGlyMl9zZl9lbnRyeSBhbGwgdGhlc2Ugc3RydWN0dXJlIGFyZQorICogdmFyaWFibGUgbGVuZ3RoLCBhbmQgdGhlIGFjY2Vzc29ycyBpbiB0aGlzIGZpbGUgc2hvdWxkIGJlIHVzZWQgdG8gaXRlcmF0ZQorICogb3ZlciB0aGVtLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9zZl9oZHIgeworCV9fdWludDhfdAkJY291bnQ7CQkvKiBjb3VudCBvZiBlbnRyaWVzICovCisJX191aW50OF90CQlpOGNvdW50OwkvKiBjb3VudCBvZiA4LWJ5dGUgaW5vZGUgI3MgKi8KKwl4ZnNfZGlyMl9pbm91X3QJCXBhcmVudDsJCS8qIHBhcmVudCBkaXIgaW5vZGUgbnVtYmVyICovCit9IF9fYXJjaF9wYWNrIHhmc19kaXIyX3NmX2hkcl90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9zZl9lbnRyeSB7CisJX191OAkJCW5hbWVsZW47CS8qIGFjdHVhbCBuYW1lIGxlbmd0aCAqLworCXhmc19kaXIyX3NmX29mZl90CW9mZnNldDsJCS8qIHNhdmVkIG9mZnNldCAqLworCV9fdTgJCQluYW1lW107CQkvKiBuYW1lLCB2YXJpYWJsZSBzaXplICovCisJLyoKKwkgKiBBIHhmc19kaXIyX2lubzhfdCBvciB4ZnNfZGlyMl9pbm80X3QgZm9sbG93cyBoZXJlLCBhdCBhCisJICogdmFyaWFibGUgb2Zmc2V0IGFmdGVyIHRoZSBuYW1lLgorCSAqLworfSBfX2FyY2hfcGFjayB4ZnNfZGlyMl9zZl9lbnRyeV90OworCitzdGF0aWMgaW5saW5lIGludCB4ZnNfZGlyMl9zZl9oZHJfc2l6ZShpbnQgaThjb3VudCkKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCB4ZnNfZGlyMl9zZl9oZHIpIC0KKwkJKGk4Y291bnQgPT0gMCkgKgorCQkoc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLSBzaXplb2YoeGZzX2RpcjJfaW5vNF90KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGF0YV9hb2ZmX3QKK3hmc19kaXIyX3NmX2dldF9vZmZzZXQoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCkKK3sKKwlyZXR1cm4gZ2V0X3VuYWxpZ25lZF9iZTE2KCZzZmVwLT5vZmZzZXQuaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGZzX2RpcjJfc2ZfcHV0X29mZnNldCh4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwLCB4ZnNfZGlyMl9kYXRhX2FvZmZfdCBvZmYpCit7CisJcHV0X3VuYWxpZ25lZF9iZTE2KG9mZiwgJnNmZXAtPm9mZnNldC5pKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3hmc19kaXIyX3NmX2VudHNpemUoc3RydWN0IHhmc19kaXIyX3NmX2hkciAqaGRyLCBpbnQgbGVuKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IHhmc19kaXIyX3NmX2VudHJ5KSArCS8qIG5hbWVsZW4gKyBvZmZzZXQgKi8KKwkJbGVuICsJCQkJCS8qIG5hbWUgKi8KKwkJKGhkci0+aThjb3VudCA/CQkJCS8qIGlubyAqLworCQkgc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgOgorCQkgc2l6ZW9mKHhmc19kaXIyX2lubzRfdCkpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4ZnNfZGlyMl9zZl9lbnRyeSAqCit4ZnNfZGlyMl9zZl9maXJzdGVudHJ5KHN0cnVjdCB4ZnNfZGlyMl9zZl9oZHIgKmhkcikKK3sKKwlyZXR1cm4gKHN0cnVjdCB4ZnNfZGlyMl9zZl9lbnRyeSAqKQorCQkoKGNoYXIgKiloZHIgKyB4ZnNfZGlyMl9zZl9oZHJfc2l6ZShoZHItPmk4Y291bnQpKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgeGZzX2RpcjJfc2ZfZW50cnkgKgoreGZzX2RpcjJfc2ZfbmV4dGVudHJ5KHN0cnVjdCB4ZnNfZGlyMl9zZl9oZHIgKmhkciwKKwkJc3RydWN0IHhmc19kaXIyX3NmX2VudHJ5ICpzZmVwKQoreworCXJldHVybiAoc3RydWN0IHhmc19kaXIyX3NmX2VudHJ5ICopCisJCSgoY2hhciAqKXNmZXAgKyB4ZnNfZGlyMl9zZl9lbnRzaXplKGhkciwgc2ZlcC0+bmFtZWxlbikpOworfQorCisKKy8qCisgKiBEYXRhIGJsb2NrIHN0cnVjdHVyZXMuCisgKgorICogQSBwdXJlIGRhdGEgYmxvY2sgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nIGRyYXdpbmcgb24gZGlzazoKKyAqCisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgIHwgeGZzX2RpcjJfZGF0YV9oZHJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICB8IHhmc19kaXIyX2RhdGFfZW50cnlfdCBPUiB4ZnNfZGlyMl9kYXRhX3VudXNlZF90IHwKKyAqICAgIHwgeGZzX2RpcjJfZGF0YV9lbnRyeV90IE9SIHhmc19kaXIyX2RhdGFfdW51c2VkX3QgfAorICogICAgfCB4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgT1IgeGZzX2RpcjJfZGF0YV91bnVzZWRfdCB8CisgKiAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfCB1bnVzZWQgc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBBcyBhbGwgdGhlIGVudHJpZXMgYXJlIHZhcmlhYmxlIHNpemUgc3RydWN0dXJlcyB0aGUgYWNjZXNzb3JzIGJlbG93IHNob3VsZAorICogYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlbS4KKyAqCisgKiBJbiBhZGRpdGlvbiB0byB0aGUgcHVyZSBkYXRhIGJsb2NrcyBmb3IgdGhlIGRhdGEgYW5kIG5vZGUgZm9ybWF0cywKKyAqIG1vc3Qgc3RydWN0dXJlcyBhcmUgYWxzbyB1c2VkIGZvciB0aGUgY29tYmluZWQgZGF0YS9mcmVlc3BhY2UgImJsb2NrIgorICogZm9ybWF0IGJlbG93LgorICovCisKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9BTElHTl9MT0cJMwkJLyogaS5lLiwgOCBieXRlcyAqLworI2RlZmluZQlYRlNfRElSMl9EQVRBX0FMSUdOCSgxIDw8IFhGU19ESVIyX0RBVEFfQUxJR05fTE9HKQorI2RlZmluZQlYRlNfRElSMl9EQVRBX0ZSRUVfVEFHCTB4ZmZmZgorI2RlZmluZQlYRlNfRElSMl9EQVRBX0ZEX0NPVU5UCTMKKworLyoKKyAqIERpcmVjdG9yeSBhZGRyZXNzIHNwYWNlIGRpdmlkZWQgaW50byBzZWN0aW9ucywKKyAqIHNwYWNlcyBzZXBhcmF0ZWQgYnkgMzJHQi4KKyAqLworI2RlZmluZQlYRlNfRElSMl9TUEFDRV9TSVpFCSgxVUxMIDw8ICgzMiArIFhGU19ESVIyX0RBVEFfQUxJR05fTE9HKSkKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9TUEFDRQkwCisjZGVmaW5lCVhGU19ESVIyX0RBVEFfT0ZGU0VUCShYRlNfRElSMl9EQVRBX1NQQUNFICogWEZTX0RJUjJfU1BBQ0VfU0laRSkKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9GSVJTVERCKG1wKQlcCisJeGZzX2RpcjJfYnl0ZV90b19kYihtcCwgWEZTX0RJUjJfREFUQV9PRkZTRVQpCisKKy8qCisgKiBPZmZzZXRzIG9mIC4gYW5kIC4uIGluIGRhdGEgc3BhY2UgKGFsd2F5cyBibG9jayAwKQorICovCisjZGVmaW5lCVhGU19ESVIyX0RBVEFfRE9UX09GRlNFVAlcCisJKCh4ZnNfZGlyMl9kYXRhX2FvZmZfdClzaXplb2Yoc3RydWN0IHhmc19kaXIyX2RhdGFfaGRyKSkKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9ET1RET1RfT0ZGU0VUCVwKKwkoWEZTX0RJUjJfREFUQV9ET1RfT0ZGU0VUICsgeGZzX2RpcjJfZGF0YV9lbnRzaXplKDEpKQorI2RlZmluZQlYRlNfRElSMl9EQVRBX0ZJUlNUX09GRlNFVAkJXAorCShYRlNfRElSMl9EQVRBX0RPVERPVF9PRkZTRVQgKyB4ZnNfZGlyMl9kYXRhX2VudHNpemUoMikpCisKKy8qCisgKiBEZXNjcmliZSBhIGZyZWUgYXJlYSBpbiB0aGUgZGF0YSBibG9jay4KKyAqCisgKiBUaGUgZnJlZXNwYWNlIHdpbGwgYmUgZm9ybWF0dGVkIGFzIGEgeGZzX2RpcjJfZGF0YV91bnVzZWRfdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfZGF0YV9mcmVlIHsKKwlfX2JlMTYJCQlvZmZzZXQ7CQkvKiBzdGFydCBvZiBmcmVlc3BhY2UgKi8KKwlfX2JlMTYJCQlsZW5ndGg7CQkvKiBsZW5ndGggb2YgZnJlZXNwYWNlICovCit9IHhmc19kaXIyX2RhdGFfZnJlZV90OworCisvKgorICogSGVhZGVyIGZvciB0aGUgZGF0YSBibG9ja3MuCisgKgorICogVGhlIGNvZGUga25vd3MgdGhhdCBYRlNfRElSMl9EQVRBX0ZEX0NPVU5UIGlzIDMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2RhdGFfaGRyIHsKKwlfX2JlMzIJCQltYWdpYzsJCS8qIFhGU19ESVIyX0RBVEFfTUFHSUMgb3IgKi8KKwkJCQkJCS8qIFhGU19ESVIyX0JMT0NLX01BR0lDICovCisJeGZzX2RpcjJfZGF0YV9mcmVlX3QJYmVzdGZyZWVbWEZTX0RJUjJfREFUQV9GRF9DT1VOVF07Cit9IHhmc19kaXIyX2RhdGFfaGRyX3Q7CisKKy8qCisgKiBBY3RpdmUgZW50cnkgaW4gYSBkYXRhIGJsb2NrLgorICoKKyAqIEFsaWduZWQgdG8gOCBieXRlcy4gIEFmdGVyIHRoZSB2YXJpYWJsZSBsZW5ndGggbmFtZSBmaWVsZCB0aGVyZSBpcyBhCisgKiAyIGJ5dGUgdGFnIGZpZWxkLCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgeGZzX2RpcjJfZGF0YV9lbnRyeV90YWdfcC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfZGF0YV9lbnRyeSB7CisJX19iZTY0CQkJaW51bWJlcjsJLyogaW5vZGUgbnVtYmVyICovCisJX191OAkJCW5hbWVsZW47CS8qIG5hbWUgbGVuZ3RoICovCisJX191OAkJCW5hbWVbXTsJCS8qIG5hbWUgYnl0ZXMsIG5vIG51bGwgKi8KKyAgICAgLyoJX19iZTE2ICAgICAgICAgICAgICAgICAgdGFnOyAqLwkJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHVzICovCit9IHhmc19kaXIyX2RhdGFfZW50cnlfdDsKKworLyoKKyAqIFVudXNlZCBlbnRyeSBpbiBhIGRhdGEgYmxvY2suCisgKgorICogQWxpZ25lZCB0byA4IGJ5dGVzLiAgVGFnIGFwcGVhcnMgYXMgdGhlIGxhc3QgMiBieXRlcyBhbmQgbXVzdCBiZSBhY2Nlc3NlZAorICogdXNpbmcgeGZzX2RpcjJfZGF0YV91bnVzZWRfdGFnX3AuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2RhdGFfdW51c2VkIHsKKwlfX2JlMTYJCQlmcmVldGFnOwkvKiBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHICovCisJX19iZTE2CQkJbGVuZ3RoOwkJLyogdG90YWwgZnJlZSBsZW5ndGggKi8KKwkJCQkJCS8qIHZhcmlhYmxlIG9mZnNldCAqLworCV9fYmUxNgkJCXRhZzsJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiB1cyAqLworfSB4ZnNfZGlyMl9kYXRhX3VudXNlZF90OworCisvKgorICogU2l6ZSBvZiBhIGRhdGEgZW50cnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHhmc19kaXIyX2RhdGFfZW50c2l6ZShpbnQgbikKK3sKKwlyZXR1cm4gKGludClyb3VuZHVwKG9mZnNldG9mKHN0cnVjdCB4ZnNfZGlyMl9kYXRhX2VudHJ5LCBuYW1lWzBdKSArIG4gKworCQkgKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2RhdGFfb2ZmX3QpLCBYRlNfRElSMl9EQVRBX0FMSUdOKTsKK30KKworLyoKKyAqIFBvaW50ZXIgdG8gYW4gZW50cnkncyB0YWcgd29yZC4KKyAqLworc3RhdGljIGlubGluZSBfX2JlMTYgKgoreGZzX2RpcjJfZGF0YV9lbnRyeV90YWdfcChzdHJ1Y3QgeGZzX2RpcjJfZGF0YV9lbnRyeSAqZGVwKQoreworCXJldHVybiAoX19iZTE2ICopKChjaGFyICopZGVwICsKKwkJeGZzX2RpcjJfZGF0YV9lbnRzaXplKGRlcC0+bmFtZWxlbikgLSBzaXplb2YoX19iZTE2KSk7Cit9CisKKy8qCisgKiBQb2ludGVyIHRvIGEgZnJlZXNwYWNlJ3MgdGFnIHdvcmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgX19iZTE2ICoKK3hmc19kaXIyX2RhdGFfdW51c2VkX3RhZ19wKHN0cnVjdCB4ZnNfZGlyMl9kYXRhX3VudXNlZCAqZHVwKQoreworCXJldHVybiAoX19iZTE2ICopKChjaGFyICopZHVwICsKKwkJCWJlMTZfdG9fY3B1KGR1cC0+bGVuZ3RoKSAtIHNpemVvZihfX2JlMTYpKTsKK30KKworLyoKKyAqIExlYWYgYmxvY2sgc3RydWN0dXJlcy4KKyAqCisgKiBBIHB1cmUgbGVhZiBibG9jayBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcgZHJhd2luZyBvbiBkaXNrOgorICoKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICB8IHhmc19kaXIyX2xlYWZfaGRyX3QgICAgICAgfAorICogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgIHwgeGZzX2RpcjJfbGVhZl9lbnRyeV90ICAgICB8CisgKiAgICB8IHhmc19kaXIyX2xlYWZfZW50cnlfdCAgICAgfAorICogICAgfCB4ZnNfZGlyMl9sZWFmX2VudHJ5X3QgICAgIHwKKyAqICAgIHwgeGZzX2RpcjJfbGVhZl9lbnRyeV90ICAgICB8CisgKiAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgIHwgeGZzX2RpcjJfZGF0YV9vZmZfdCAgICAgICB8CisgKiAgICB8IHhmc19kaXIyX2RhdGFfb2ZmX3QgICAgICAgfAorICogICAgfCB4ZnNfZGlyMl9kYXRhX29mZl90ICAgICAgIHwKKyAqICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfCB4ZnNfZGlyMl9sZWFmX3RhaWxfdCAgICAgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogVGhlIHhmc19kaXIyX2RhdGFfb2ZmX3QgbWVtYmVycyAoYmVzdHMpIGFuZCB0YWlsIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBibG9jaworICogZm9yIHNpbmdsZS1sZWFmIChtYWdpYyA9IFhGU19ESVIyX0xFQUYxX01BR0lDKSBibG9ja3Mgb25seSwgYnV0IG5vdCBwcmVzZW50CisgKiBmb3IgZGlyZWN0b3JpZXMgd2l0aCBzZXBhcmF0ZSBsZWFmIG5vZGVzIGFuZCBmcmVlIHNwYWNlIGJsb2NrcworICogKG1hZ2ljID0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpLgorICoKKyAqIEFzIGFsbCB0aGUgZW50cmllcyBhcmUgdmFyaWFibGUgc2l6ZSBzdHJ1Y3R1cmVzIHRoZSBhY2Nlc3NvcnMgYmVsb3cgc2hvdWxkCisgKiBiZSB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGVtLgorICovCisKKy8qCisgKiBPZmZzZXQgb2YgdGhlIGxlYWYvbm9kZSBzcGFjZS4gIEZpcnN0IGJsb2NrIGluIHRoaXMgc3BhY2UKKyAqIGlzIHRoZSBidHJlZSByb290LgorICovCisjZGVmaW5lCVhGU19ESVIyX0xFQUZfU1BBQ0UJMQorI2RlZmluZQlYRlNfRElSMl9MRUFGX09GRlNFVAkoWEZTX0RJUjJfTEVBRl9TUEFDRSAqIFhGU19ESVIyX1NQQUNFX1NJWkUpCisjZGVmaW5lCVhGU19ESVIyX0xFQUZfRklSU1REQihtcCkJXAorCXhmc19kaXIyX2J5dGVfdG9fZGIobXAsIFhGU19ESVIyX0xFQUZfT0ZGU0VUKQorCisvKgorICogTGVhZiBibG9jayBoZWFkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2xlYWZfaGRyIHsKKwl4ZnNfZGFfYmxraW5mb190CWluZm87CQkvKiBoZWFkZXIgZm9yIGRhIHJvdXRpbmVzICovCisJX19iZTE2CQkJY291bnQ7CQkvKiBjb3VudCBvZiBlbnRyaWVzICovCisJX19iZTE2CQkJc3RhbGU7CQkvKiBjb3VudCBvZiBzdGFsZSBlbnRyaWVzICovCit9IHhmc19kaXIyX2xlYWZfaGRyX3Q7CisKKy8qCisgKiBMZWFmIGJsb2NrIGVudHJ5LgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9sZWFmX2VudHJ5IHsKKwlfX2JlMzIJCQloYXNodmFsOwkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgKi8KKwlfX2JlMzIJCQlhZGRyZXNzOwkvKiBhZGRyZXNzIG9mIGRhdGEgZW50cnkgKi8KK30geGZzX2RpcjJfbGVhZl9lbnRyeV90OworCisvKgorICogTGVhZiBibG9jayB0YWlsLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9sZWFmX3RhaWwgeworCV9fYmUzMgkJCWJlc3Rjb3VudDsKK30geGZzX2RpcjJfbGVhZl90YWlsX3Q7CisKKy8qCisgKiBMZWFmIGJsb2NrLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9sZWFmIHsKKwl4ZnNfZGlyMl9sZWFmX2hkcl90CWhkcjsJCS8qIGxlYWYgaGVhZGVyICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CWVudHNbXTsJCS8qIGVudHJpZXMgKi8KK30geGZzX2RpcjJfbGVhZl90OworCisvKgorICogREIgYmxvY2tzIGhlcmUgYXJlIGxvZ2ljYWwgZGlyZWN0b3J5IGJsb2NrIG51bWJlcnMsIG5vdCBmaWxlc3lzdGVtIGJsb2Nrcy4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCB4ZnNfZGlyMl9tYXhfbGVhZl9lbnRzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKQoreworCXJldHVybiAobXAtPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZihzdHJ1Y3QgeGZzX2RpcjJfbGVhZl9oZHIpKSAvCisJCSh1aW50KXNpemVvZihzdHJ1Y3QgeGZzX2RpcjJfbGVhZl9lbnRyeSk7Cit9CisKKy8qCisgKiBHZXQgYWRkcmVzcyBvZiB0aGUgYmVzdGNvdW50IGZpZWxkIGluIHRoZSBzaW5nbGUtbGVhZiBibG9jay4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgeGZzX2RpcjJfbGVhZl90YWlsICoKK3hmc19kaXIyX2xlYWZfdGFpbF9wKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBzdHJ1Y3QgeGZzX2RpcjJfbGVhZiAqbHApCit7CisJcmV0dXJuIChzdHJ1Y3QgeGZzX2RpcjJfbGVhZl90YWlsICopCisJCSgoY2hhciAqKWxwICsgbXAtPm1fZGlyYmxrc2l6ZSAtCisJCSAgc2l6ZW9mKHN0cnVjdCB4ZnNfZGlyMl9sZWFmX3RhaWwpKTsKK30KKworLyoKKyAqIEdldCBhZGRyZXNzIG9mIHRoZSBiZXN0cyBhcnJheSBpbiB0aGUgc2luZ2xlLWxlYWYgYmxvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgX19iZTE2ICoKK3hmc19kaXIyX2xlYWZfYmVzdHNfcChzdHJ1Y3QgeGZzX2RpcjJfbGVhZl90YWlsICpsdHApCit7CisJcmV0dXJuIChfX2JlMTYgKilsdHAgLSBiZTMyX3RvX2NwdShsdHAtPmJlc3Rjb3VudCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGRhdGFwdHIgdG8gYnl0ZSBpbiBmaWxlIHNwYWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfb2ZmX3QKK3hmc19kaXIyX2RhdGFwdHJfdG9fYnl0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKQoreworCXJldHVybiAoeGZzX2RpcjJfb2ZmX3QpZHAgPDwgWEZTX0RJUjJfREFUQV9BTElHTl9MT0c7Cit9CisKKy8qCisgKiBDb252ZXJ0IGJ5dGUgaW4gZmlsZSBzcGFjZSB0byBkYXRhcHRyLiAgSXQgaGFkIGJldHRlciBiZSBhbGlnbmVkLgorICovCitzdGF0aWMgaW5saW5lIHhmc19kaXIyX2RhdGFwdHJfdAoreGZzX2RpcjJfYnl0ZV90b19kYXRhcHRyKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSkKK3sKKwlyZXR1cm4gKHhmc19kaXIyX2RhdGFwdHJfdCkoYnkgPj4gWEZTX0RJUjJfREFUQV9BTElHTl9MT0cpOworfQorCisvKgorICogQ29udmVydCBieXRlIGluIHNwYWNlIHRvIChEQikgYmxvY2sKKyAqLworc3RhdGljIGlubGluZSB4ZnNfZGlyMl9kYl90Cit4ZnNfZGlyMl9ieXRlX3RvX2RiKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSkKK3sKKwlyZXR1cm4gKHhmc19kaXIyX2RiX3QpCisJCShieSA+PiAobXAtPm1fc2Iuc2JfYmxvY2tsb2cgKyBtcC0+bV9zYi5zYl9kaXJibGtsb2cpKTsKK30KKworLyoKKyAqIENvbnZlcnQgZGF0YXB0ciB0byBhIGJsb2NrIG51bWJlcgorICovCitzdGF0aWMgaW5saW5lIHhmc19kaXIyX2RiX3QKK3hmc19kaXIyX2RhdGFwdHJfdG9fZGIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RhdGFwdHJfdCBkcCkKK3sKKwlyZXR1cm4geGZzX2RpcjJfYnl0ZV90b19kYihtcCwgeGZzX2RpcjJfZGF0YXB0cl90b19ieXRlKG1wLCBkcCkpOworfQorCisvKgorICogQ29udmVydCBieXRlIGluIHNwYWNlIHRvIG9mZnNldCBpbiBhIGJsb2NrCisgKi8KK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGF0YV9hb2ZmX3QKK3hmc19kaXIyX2J5dGVfdG9fb2ZmKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSkKK3sKKwlyZXR1cm4gKHhmc19kaXIyX2RhdGFfYW9mZl90KShieSAmCisJCSgoMSA8PCAobXAtPm1fc2Iuc2JfYmxvY2tsb2cgKyBtcC0+bV9zYi5zYl9kaXJibGtsb2cpKSAtIDEpKTsKK30KKworLyoKKyAqIENvbnZlcnQgZGF0YXB0ciB0byBhIGJ5dGUgb2Zmc2V0IGluIGEgYmxvY2sKKyAqLworc3RhdGljIGlubGluZSB4ZnNfZGlyMl9kYXRhX2FvZmZfdAoreGZzX2RpcjJfZGF0YXB0cl90b19vZmYoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RhdGFwdHJfdCBkcCkKK3sKKwlyZXR1cm4geGZzX2RpcjJfYnl0ZV90b19vZmYobXAsIHhmc19kaXIyX2RhdGFwdHJfdG9fYnl0ZShtcCwgZHApKTsKK30KKworLyoKKyAqIENvbnZlcnQgYmxvY2sgYW5kIG9mZnNldCB0byBieXRlIGluIHNwYWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfb2ZmX3QKK3hmc19kaXIyX2RiX29mZl90b19ieXRlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiLAorCQkJeGZzX2RpcjJfZGF0YV9hb2ZmX3QgbykKK3sKKwlyZXR1cm4gKCh4ZnNfZGlyMl9vZmZfdClkYiA8PAorCQkobXAtPm1fc2Iuc2JfYmxvY2tsb2cgKyBtcC0+bV9zYi5zYl9kaXJibGtsb2cpKSArIG87Cit9CisKKy8qCisgKiBDb252ZXJ0IGJsb2NrIChEQikgdG8gYmxvY2sgKGRhYmxrKQorICovCitzdGF0aWMgaW5saW5lIHhmc19kYWJsa190Cit4ZnNfZGlyMl9kYl90b19kYShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGJfdCBkYikKK3sKKwlyZXR1cm4gKHhmc19kYWJsa190KShkYiA8PCBtcC0+bV9zYi5zYl9kaXJibGtsb2cpOworfQorCisvKgorICogQ29udmVydCBieXRlIGluIHNwYWNlIHRvIChEQSkgYmxvY2sKKyAqLworc3RhdGljIGlubGluZSB4ZnNfZGFibGtfdAoreGZzX2RpcjJfYnl0ZV90b19kYShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpCit7CisJcmV0dXJuIHhmc19kaXIyX2RiX3RvX2RhKG1wLCB4ZnNfZGlyMl9ieXRlX3RvX2RiKG1wLCBieSkpOworfQorCisvKgorICogQ29udmVydCBibG9jayBhbmQgb2Zmc2V0IHRvIGRhdGFwdHIKKyAqLworc3RhdGljIGlubGluZSB4ZnNfZGlyMl9kYXRhcHRyX3QKK3hmc19kaXIyX2RiX29mZl90b19kYXRhcHRyKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiLAorCQkJICAgeGZzX2RpcjJfZGF0YV9hb2ZmX3QgbykKK3sKKwlyZXR1cm4geGZzX2RpcjJfYnl0ZV90b19kYXRhcHRyKG1wLCB4ZnNfZGlyMl9kYl9vZmZfdG9fYnl0ZShtcCwgZGIsIG8pKTsKK30KKworLyoKKyAqIENvbnZlcnQgYmxvY2sgKGRhYmxrKSB0byBibG9jayAoREIpCisgKi8KK3N0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGJfdAoreGZzX2RpcjJfZGFfdG9fZGIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kYWJsa190IGRhKQoreworCXJldHVybiAoeGZzX2RpcjJfZGJfdCkoZGEgPj4gbXAtPm1fc2Iuc2JfZGlyYmxrbG9nKTsKK30KKworLyoKKyAqIENvbnZlcnQgYmxvY2sgKGRhYmxrKSB0byBieXRlIG9mZnNldCBpbiBzcGFjZQorICovCitzdGF0aWMgaW5saW5lIHhmc19kaXIyX29mZl90Cit4ZnNfZGlyMl9kYV90b19ieXRlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFibGtfdCBkYSkKK3sKKwlyZXR1cm4geGZzX2RpcjJfZGJfb2ZmX3RvX2J5dGUobXAsIHhmc19kaXIyX2RhX3RvX2RiKG1wLCBkYSksIDApOworfQorCisvKgorICogRnJlZSBzcGFjZSBibG9jayBkZWZpbnRpb25zIGZvciB0aGUgbm9kZSBmb3JtYXQuCisgKi8KKworLyoKKyAqIE9mZnNldCBvZiB0aGUgZnJlZXNwYWNlIGluZGV4LgorICovCisjZGVmaW5lCVhGU19ESVIyX0ZSRUVfU1BBQ0UJMgorI2RlZmluZQlYRlNfRElSMl9GUkVFX09GRlNFVAkoWEZTX0RJUjJfRlJFRV9TUEFDRSAqIFhGU19ESVIyX1NQQUNFX1NJWkUpCisjZGVmaW5lCVhGU19ESVIyX0ZSRUVfRklSU1REQihtcCkJXAorCXhmc19kaXIyX2J5dGVfdG9fZGIobXAsIFhGU19ESVIyX0ZSRUVfT0ZGU0VUKQorCit0eXBlZGVmCXN0cnVjdCB4ZnNfZGlyMl9mcmVlX2hkciB7CisJX19iZTMyCQkJbWFnaWM7CQkvKiBYRlNfRElSMl9GUkVFX01BR0lDICovCisJX19iZTMyCQkJZmlyc3RkYjsJLyogZGIgb2YgZmlyc3QgZW50cnkgKi8KKwlfX2JlMzIJCQludmFsaWQ7CQkvKiBjb3VudCBvZiB2YWxpZCBlbnRyaWVzICovCisJX19iZTMyCQkJbnVzZWQ7CQkvKiBjb3VudCBvZiB1c2VkIGVudHJpZXMgKi8KK30geGZzX2RpcjJfZnJlZV9oZHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfZnJlZSB7CisJeGZzX2RpcjJfZnJlZV9oZHJfdAloZHI7CQkvKiBibG9jayBoZWFkZXIgKi8KKwlfX2JlMTYJCQliZXN0c1tdOwkvKiBiZXN0IGZyZWUgY291bnRzICovCisJCQkJCQkvKiB1bnVzZWQgZW50cmllcyBhcmUgLTEgKi8KK30geGZzX2RpcjJfZnJlZV90OworCitzdGF0aWMgaW5saW5lIGludCB4ZnNfZGlyMl9mcmVlX21heF9iZXN0cyhzdHJ1Y3QgeGZzX21vdW50ICptcCkKK3sKKwlyZXR1cm4gKG1wLT5tX2RpcmJsa3NpemUgLSBzaXplb2Yoc3RydWN0IHhmc19kaXIyX2ZyZWVfaGRyKSkgLworCQlzaXplb2YoeGZzX2RpcjJfZGF0YV9vZmZfdCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGRhdGEgc3BhY2UgZGIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZnJlZSBkYi4KKyAqLworc3RhdGljIGlubGluZSB4ZnNfZGlyMl9kYl90Cit4ZnNfZGlyMl9kYl90b19mZGIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RiX3QgZGIpCit7CisJcmV0dXJuIFhGU19ESVIyX0ZSRUVfRklSU1REQihtcCkgKyBkYiAvIHhmc19kaXIyX2ZyZWVfbWF4X2Jlc3RzKG1wKTsKK30KKworLyoKKyAqIENvbnZlcnQgZGF0YSBzcGFjZSBkYiB0byB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBpbiBhIGZyZWUgZGIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit4ZnNfZGlyMl9kYl90b19mZGluZGV4KHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiKQoreworCXJldHVybiBkYiAlIHhmc19kaXIyX2ZyZWVfbWF4X2Jlc3RzKG1wKTsKK30KKworLyoKKyAqIFNpbmdsZSBibG9jayBmb3JtYXQuCisgKgorICogVGhlIHNpbmdsZSBibG9jayBmb3JtYXQgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nIGRyYXdpbmcgb24gZGlzazoKKyAqCisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgIHwgeGZzX2RpcjJfZGF0YV9oZHJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICB8IHhmc19kaXIyX2RhdGFfZW50cnlfdCBPUiB4ZnNfZGlyMl9kYXRhX3VudXNlZF90IHwKKyAqICAgIHwgeGZzX2RpcjJfZGF0YV9lbnRyeV90IE9SIHhmc19kaXIyX2RhdGFfdW51c2VkX3QgfAorICogICAgfCB4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgT1IgeGZzX2RpcjJfZGF0YV91bnVzZWRfdCA6CisgKiAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfCB1bnVzZWQgc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCB4ZnNfZGlyMl9sZWFmX2VudHJ5X3QgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8IHhmc19kaXIyX2xlYWZfZW50cnlfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfCB4ZnNfZGlyMl9ibG9ja190YWlsX3QgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBBcyBhbGwgdGhlIGVudHJpZXMgYXJlIHZhcmlhYmxlIHNpemUgc3RydWN0dXJlcyB0aGUgYWNjZXNzb3JzIGJlbG93IHNob3VsZAorICogYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlbS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9ibG9ja190YWlsIHsKKwlfX2JlMzIJCWNvdW50OwkJCS8qIGNvdW50IG9mIGxlYWYgZW50cmllcyAqLworCV9fYmUzMgkJc3RhbGU7CQkJLyogY291bnQgb2Ygc3RhbGUgbGYgZW50cmllcyAqLworfSB4ZnNfZGlyMl9ibG9ja190YWlsX3Q7CisKKy8qCisgKiBQb2ludGVyIHRvIHRoZSBsZWFmIGhlYWRlciBlbWJlZGRlZCBpbiBhIGRhdGEgYmxvY2sgKDEtYmxvY2sgZm9ybWF0KQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4ZnNfZGlyMl9ibG9ja190YWlsICoKK3hmc19kaXIyX2Jsb2NrX3RhaWxfcChzdHJ1Y3QgeGZzX21vdW50ICptcCwgc3RydWN0IHhmc19kaXIyX2RhdGFfaGRyICpoZHIpCit7CisJcmV0dXJuICgoc3RydWN0IHhmc19kaXIyX2Jsb2NrX3RhaWwgKikKKwkJKChjaGFyICopaGRyICsgbXAtPm1fZGlyYmxrc2l6ZSkpIC0gMTsKK30KKworLyoKKyAqIFBvaW50ZXIgdG8gdGhlIGxlYWYgZW50cmllcyBlbWJlZGRlZCBpbiBhIGRhdGEgYmxvY2sgKDEtYmxvY2sgZm9ybWF0KQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4ZnNfZGlyMl9sZWFmX2VudHJ5ICoKK3hmc19kaXIyX2Jsb2NrX2xlYWZfcChzdHJ1Y3QgeGZzX2RpcjJfYmxvY2tfdGFpbCAqYnRwKQoreworCXJldHVybiAoKHN0cnVjdCB4ZnNfZGlyMl9sZWFmX2VudHJ5ICopYnRwKSAtIGJlMzJfdG9fY3B1KGJ0cC0+Y291bnQpOworfQorCisjZW5kaWYgLyogX19YRlNfRElSMl9GT1JNQVRfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfbGVhZi5jIGIvZnMveGZzL3hmc19kaXIyX2xlYWYuYwppbmRleCBhZTg5MTIyLi5jYTIzODZkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjJfbGVhZi5jCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmMKQEAgLTI0LDE4ICsyNCwxNCBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgotI2luY2x1ZGUgInhmc19kaXIyX2RhdGEuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9sZWFmLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfYmxvY2suaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9ub2RlLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfZm9ybWF0LmgiCisjaW5jbHVkZSAieGZzX2RpcjJfcHJpdi5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc190cmFjZS5oIgogCkBAIC02NCw3ICs2MCw3IEBACiB7CiAJX19iZTE2CQkJKmJlc3RzcDsJLyogbGVhZidzIGJlc3RzcCBlbnRyaWVzICovCiAJeGZzX2RhYmxrX3QJCWJsa25vOwkJLyogbGVhZiBibG9jaydzIGJubyAqLwotCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyOwkJLyogYmxvY2sgaGVhZGVyICovCiAJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpibHA7CQkvKiBibG9jaydzIGxlYWYgZW50cmllcyAqLwogCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sncyB0YWlsICovCiAJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KQEAgLTEwMSw5ICs5Nyw5IEBACiAJfQogCUFTU0VSVChsYnAgIT0gTlVMTCk7CiAJbGVhZiA9IGxicC0+ZGF0YTsKLQlibG9jayA9IGRicC0+ZGF0YTsKKwloZHIgPSBkYnAtPmRhdGE7CiAJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgZGJwKTsKLQlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsIGJsb2NrKTsKKwlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsIGhkcik7CiAJYmxwID0geGZzX2RpcjJfYmxvY2tfbGVhZl9wKGJ0cCk7CiAJLyoKIAkgKiBTZXQgdGhlIGNvdW50cyBpbiB0aGUgbGVhZiBoZWFkZXIuCkBAIC0xMjMsMjMgKzExOSwyMyBAQAogCSAqIHRhaWwgYmUgZnJlZS4KIAkgKi8KIAl4ZnNfZGlyMl9kYXRhX21ha2VfZnJlZSh0cCwgZGJwLAotCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChjaGFyICopYmxwIC0gKGNoYXIgKilibG9jayksCi0JCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilibG9jayArIG1wLT5tX2RpcmJsa3NpemUgLQorCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChjaGFyICopYmxwIC0gKGNoYXIgKiloZHIpLAorCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChjaGFyICopaGRyICsgbXAtPm1fZGlyYmxrc2l6ZSAtCiAJCQkJICAgICAgIChjaGFyICopYmxwKSwKIAkJJm5lZWRsb2csICZuZWVkc2Nhbik7CiAJLyoKIAkgKiBGaXggdXAgdGhlIGJsb2NrIGhlYWRlciwgbWFrZSBpdCBhIGRhdGEgYmxvY2suCiAJICovCi0JYmxvY2stPmhkci5tYWdpYyA9IGNwdV90b19iZTMyKFhGU19ESVIyX0RBVEFfTUFHSUMpOworCWhkci0+bWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfRElSMl9EQVRBX01BR0lDKTsKIAlpZiAobmVlZHNjYW4pCi0JCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsICh4ZnNfZGlyMl9kYXRhX3QgKilibG9jaywgJm5lZWRsb2cpOworCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCBoZHIsICZuZWVkbG9nKTsKIAkvKgogCSAqIFNldCB1cCBsZWFmIHRhaWwgYW5kIGJlc3RzIHRhYmxlLgogCSAqLwogCWx0cCA9IHhmc19kaXIyX2xlYWZfdGFpbF9wKG1wLCBsZWFmKTsKIAlsdHAtPmJlc3Rjb3VudCA9IGNwdV90b19iZTMyKDEpOwogCWJlc3RzcCA9IHhmc19kaXIyX2xlYWZfYmVzdHNfcChsdHApOwotCWJlc3RzcFswXSA9ICBibG9jay0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aDsKKwliZXN0c3BbMF0gPSAgaGRyLT5iZXN0ZnJlZVswXS5sZW5ndGg7CiAJLyoKIAkgKiBMb2cgdGhlIGRhdGEgaGVhZGVyIGFuZCBsZWFmIGJlc3RzIHRhYmxlLgogCSAqLwpAQCAtMTUyLDYgKzE0OCwxMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorU1RBVElDIHZvaWQKK3hmc19kaXIyX2xlYWZfZmluZF9zdGFsZSgKKwlzdHJ1Y3QgeGZzX2RpcjJfbGVhZgkqbGVhZiwKKwlpbnQJCQlpbmRleCwKKwlpbnQJCQkqbG93c3RhbGUsCisJaW50CQkJKmhpZ2hzdGFsZSkKK3sKKwkvKgorCSAqIEZpbmQgdGhlIGZpcnN0IHN0YWxlIGVudHJ5IGJlZm9yZSBvdXIgaW5kZXgsIGlmIGFueS4KKwkgKi8KKwlmb3IgKCpsb3dzdGFsZSA9IGluZGV4IC0gMTsgKmxvd3N0YWxlID49IDA7IC0tKmxvd3N0YWxlKSB7CisJCWlmIChsZWFmLT5lbnRzWypsb3dzdGFsZV0uYWRkcmVzcyA9PQorCQkgICAgY3B1X3RvX2JlMzIoWEZTX0RJUjJfTlVMTF9EQVRBUFRSKSkKKwkJCWJyZWFrOworCX0KKworCS8qCisJICogRmluZCB0aGUgZmlyc3Qgc3RhbGUgZW50cnkgYXQgb3IgYWZ0ZXIgb3VyIGluZGV4LCBpZiBhbnkuCisJICogU3RvcCBpZiB0aGUgcmVzdWx0IHdvdWxkIHJlcXVpcmUgbW92aW5nIG1vcmUgZW50cmllcyB0aGFuIHVzaW5nCisJICogbG93c3RhbGUuCisJICovCisJZm9yICgqaGlnaHN0YWxlID0gaW5kZXg7CisJICAgICAqaGlnaHN0YWxlIDwgYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KTsKKwkgICAgICsrKmhpZ2hzdGFsZSkgeworCQlpZiAobGVhZi0+ZW50c1sqaGlnaHN0YWxlXS5hZGRyZXNzID09CisJCSAgICBjcHVfdG9fYmUzMihYRlNfRElSMl9OVUxMX0RBVEFQVFIpKQorCQkJYnJlYWs7CisJCWlmICgqbG93c3RhbGUgPj0gMCAmJiBpbmRleCAtICpsb3dzdGFsZSA8PSAqaGlnaHN0YWxlIC0gaW5kZXgpCisJCQlicmVhazsKKwl9Cit9CisKK3N0cnVjdCB4ZnNfZGlyMl9sZWFmX2VudHJ5ICoKK3hmc19kaXIyX2xlYWZfZmluZF9lbnRyeSgKKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmLAkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwlpbnQJCQlpbmRleCwJCS8qIGxlYWYgdGFibGUgcG9zaXRpb24gKi8KKwlpbnQJCQljb21wYWN0LAkvKiBuZWVkIHRvIGNvbXBhY3QgbGVhdmVzICovCisJaW50CQkJbG93c3RhbGUsCS8qIGluZGV4IG9mIHByZXYgc3RhbGUgbGVhZiAqLworCWludAkJCWhpZ2hzdGFsZSwJLyogaW5kZXggb2YgbmV4dCBzdGFsZSBsZWFmICovCisJaW50CQkJKmxmbG9nbG93LAkvKiBsb3cgbGVhZiBsb2dnaW5nIGluZGV4ICovCisJaW50CQkJKmxmbG9naGlnaCkJLyogaGlnaCBsZWFmIGxvZ2dpbmcgaW5kZXggKi8KK3sKKwlpZiAoIWxlYWYtPmhkci5zdGFsZSkgeworCQl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxlcDsJLyogbGVhZiBlbnRyeSB0YWJsZSBwb2ludGVyICovCisKKwkJLyoKKwkJICogTm93IHdlIG5lZWQgdG8gbWFrZSByb29tIHRvIGluc2VydCB0aGUgbGVhZiBlbnRyeS4KKwkJICoKKwkJICogSWYgdGhlcmUgYXJlIG5vIHN0YWxlIGVudHJpZXMsIGp1c3QgaW5zZXJ0IGEgaG9sZSBhdCBpbmRleC4KKwkJICovCisJCWxlcCA9ICZsZWFmLT5lbnRzW2luZGV4XTsKKwkJaWYgKGluZGV4IDwgYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSkKKwkJCW1lbW1vdmUobGVwICsgMSwgbGVwLAorCQkJCShiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpIC0gaW5kZXgpICoKKwkJCQkgc2l6ZW9mKCpsZXApKTsKKworCQkvKgorCQkgKiBSZWNvcmQgbG93IGFuZCBoaWdoIGxvZ2dpbmcgaW5kaWNlcyBmb3IgdGhlIGxlYWYuCisJCSAqLworCQkqbGZsb2dsb3cgPSBpbmRleDsKKwkJKmxmbG9naGlnaCA9IGJlMTZfdG9fY3B1KGxlYWYtPmhkci5jb3VudCk7CisJCWJlMTZfYWRkX2NwdSgmbGVhZi0+aGRyLmNvdW50LCAxKTsKKwkJcmV0dXJuIGxlcDsKKwl9CisKKwkvKgorCSAqIFRoZXJlIGFyZSBzdGFsZSBlbnRyaWVzLgorCSAqCisJICogV2Ugd2lsbCB1c2Ugb25lIG9mIHRoZW0gZm9yIHRoZSBuZXcgZW50cnkuICBJdCdzIHByb2JhYmx5IG5vdCBhdAorCSAqIHRoZSByaWdodCBsb2NhdGlvbiwgc28gd2UnbGwgaGF2ZSB0byBzaGlmdCBzb21lIHVwIG9yIGRvd24gZmlyc3QuCisJICoKKwkgKiBJZiB3ZSBkaWRuJ3QgY29tcGFjdCBiZWZvcmUsIHdlIG5lZWQgdG8gZmluZCB0aGUgbmVhcmVzdCBzdGFsZQorCSAqIGVudHJpZXMgYmVmb3JlIGFuZCBhZnRlciBvdXIgaW5zZXJ0aW9uIHBvaW50LgorCSAqLworCWlmIChjb21wYWN0ID09IDApCisJCXhmc19kaXIyX2xlYWZfZmluZF9zdGFsZShsZWFmLCBpbmRleCwgJmxvd3N0YWxlLCAmaGlnaHN0YWxlKTsKKworCS8qCisJICogSWYgdGhlIGxvdyBvbmUgaXMgYmV0dGVyLCB1c2UgaXQuCisJICovCisJaWYgKGxvd3N0YWxlID49IDAgJiYKKwkgICAgKGhpZ2hzdGFsZSA9PSBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpIHx8CisJICAgICBpbmRleCAtIGxvd3N0YWxlIC0gMSA8IGhpZ2hzdGFsZSAtIGluZGV4KSkgeworCQlBU1NFUlQoaW5kZXggLSBsb3dzdGFsZSAtIDEgPj0gMCk7CisJCUFTU0VSVChsZWFmLT5lbnRzW2xvd3N0YWxlXS5hZGRyZXNzID09CisJCSAgICAgICBjcHVfdG9fYmUzMihYRlNfRElSMl9OVUxMX0RBVEFQVFIpKTsKKworCQkvKgorCQkgKiBDb3B5IGVudHJpZXMgdXAgdG8gY292ZXIgdGhlIHN0YWxlIGVudHJ5IGFuZCBtYWtlIHJvb20KKwkJICogZm9yIHRoZSBuZXcgZW50cnkuCisJCSAqLworCQlpZiAoaW5kZXggLSBsb3dzdGFsZSAtIDEgPiAwKSB7CisJCQltZW1tb3ZlKCZsZWFmLT5lbnRzW2xvd3N0YWxlXSwKKwkJCQkmbGVhZi0+ZW50c1tsb3dzdGFsZSArIDFdLAorCQkJCShpbmRleCAtIGxvd3N0YWxlIC0gMSkgKgorCQkJCXNpemVvZih4ZnNfZGlyMl9sZWFmX2VudHJ5X3QpKTsKKwkJfQorCQkqbGZsb2dsb3cgPSBNSU4obG93c3RhbGUsICpsZmxvZ2xvdyk7CisJCSpsZmxvZ2hpZ2ggPSBNQVgoaW5kZXggLSAxLCAqbGZsb2doaWdoKTsKKwkJYmUxNl9hZGRfY3B1KCZsZWFmLT5oZHIuc3RhbGUsIC0xKTsKKwkJcmV0dXJuICZsZWFmLT5lbnRzW2luZGV4IC0gMV07CisJfQorCisJLyoKKwkgKiBUaGUgaGlnaCBvbmUgaXMgYmV0dGVyLCBzbyB1c2UgdGhhdCBvbmUuCisJICovCisJQVNTRVJUKGhpZ2hzdGFsZSAtIGluZGV4ID49IDApOworCUFTU0VSVChsZWFmLT5lbnRzW2hpZ2hzdGFsZV0uYWRkcmVzcyA9PQorCSAgICAgICBjcHVfdG9fYmUzMihYRlNfRElSMl9OVUxMX0RBVEFQVFIpKTsKKworCS8qCisJICogQ29weSBlbnRyaWVzIGRvd24gdG8gY292ZXIgdGhlIHN0YWxlIGVudHJ5IGFuZCBtYWtlIHJvb20gZm9yIHRoZQorCSAqIG5ldyBlbnRyeS4KKwkgKi8KKwlpZiAoaGlnaHN0YWxlIC0gaW5kZXggPiAwKSB7CisJCW1lbW1vdmUoJmxlYWYtPmVudHNbaW5kZXggKyAxXSwKKwkJCSZsZWFmLT5lbnRzW2luZGV4XSwKKwkJCShoaWdoc3RhbGUgLSBpbmRleCkgKiBzaXplb2YoeGZzX2RpcjJfbGVhZl9lbnRyeV90KSk7CisJfQorCSpsZmxvZ2xvdyA9IE1JTihpbmRleCwgKmxmbG9nbG93KTsKKwkqbGZsb2doaWdoID0gTUFYKGhpZ2hzdGFsZSwgKmxmbG9naGlnaCk7CisJYmUxNl9hZGRfY3B1KCZsZWFmLT5oZHIuc3RhbGUsIC0xKTsKKwlyZXR1cm4gJmxlYWYtPmVudHNbaW5kZXhdOworfQorCiAvKgogICogQWRkIGFuIGVudHJ5IHRvIGEgbGVhZiBmb3JtIGRpcmVjdG9yeS4KICAqLwpAQCAtMTYxLDcgKzI4Miw3IEBACiB7CiAJX19iZTE2CQkJKmJlc3RzcDsJLyogZnJlZXNwYWNlIHRhYmxlIGluIGxlYWYgKi8KIAlpbnQJCQljb21wYWN0OwkvKiBuZWVkIHRvIGNvbXBhY3QgbGVhdmVzICovCi0JeGZzX2RpcjJfZGF0YV90CQkqZGF0YTsJCS8qIGRhdGEgYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyOwkJLyogZGF0YSBibG9jayBoZWFkZXIgKi8KIAl4ZnNfZGFidWZfdAkJKmRicDsJCS8qIGRhdGEgYmxvY2sgYnVmZmVyICovCiAJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBkYXRhIGJsb2NrIGVudHJ5ICovCiAJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KQEAgLTIyNSw3ICszNDYsNyBAQAogCQkJY29udGludWU7CiAJCWkgPSB4ZnNfZGlyMl9kYXRhcHRyX3RvX2RiKG1wLCBiZTMyX3RvX2NwdShsZXAtPmFkZHJlc3MpKTsKIAkJQVNTRVJUKGkgPCBiZTMyX3RvX2NwdShsdHAtPmJlc3Rjb3VudCkpOwotCQlBU1NFUlQoYmUxNl90b19jcHUoYmVzdHNwW2ldKSAhPSBOVUxMREFUQU9GRik7CisJCUFTU0VSVChiZXN0c3BbaV0gIT0gY3B1X3RvX2JlMTYoTlVMTERBVEFPRkYpKTsKIAkJaWYgKGJlMTZfdG9fY3B1KGJlc3RzcFtpXSkgPj0gbGVuZ3RoKSB7CiAJCQl1c2VfYmxvY2sgPSBpOwogCQkJYnJlYWs7CkBAIC0yMzksNyArMzYwLDggQEAKIAkJCS8qCiAJCQkgKiBSZW1lbWJlciBhIGJsb2NrIHdlIHNlZSB0aGF0J3MgbWlzc2luZy4KIAkJCSAqLwotCQkJaWYgKGJlMTZfdG9fY3B1KGJlc3RzcFtpXSkgPT0gTlVMTERBVEFPRkYgJiYgdXNlX2Jsb2NrID09IC0xKQorCQkJaWYgKGJlc3RzcFtpXSA9PSBjcHVfdG9fYmUxNihOVUxMREFUQU9GRikgJiYKKwkJCSAgICB1c2VfYmxvY2sgPT0gLTEpCiAJCQkJdXNlX2Jsb2NrID0gaTsKIAkJCWVsc2UgaWYgKGJlMTZfdG9fY3B1KGJlc3RzcFtpXSkgPj0gbGVuZ3RoKSB7CiAJCQkJdXNlX2Jsb2NrID0gaTsKQEAgLTI1MCwxNCArMzcyLDE3IEBACiAJLyoKIAkgKiBIb3cgbWFueSBieXRlcyBkbyB3ZSBuZWVkIGluIHRoZSBsZWFmIGJsb2NrPwogCSAqLwotCW5lZWRieXRlcyA9Ci0JCShsZWFmLT5oZHIuc3RhbGUgPyAwIDogKHVpbnQpc2l6ZW9mKGxlYWYtPmVudHNbMF0pKSArCi0JCSh1c2VfYmxvY2sgIT0gLTEgPyAwIDogKHVpbnQpc2l6ZW9mKGxlYWYtPmJlc3RzWzBdKSk7CisJbmVlZGJ5dGVzID0gMDsKKwlpZiAoIWxlYWYtPmhkci5zdGFsZSkKKwkJbmVlZGJ5dGVzICs9IHNpemVvZih4ZnNfZGlyMl9sZWFmX2VudHJ5X3QpOworCWlmICh1c2VfYmxvY2sgPT0gLTEpCisJCW5lZWRieXRlcyArPSBzaXplb2YoeGZzX2RpcjJfZGF0YV9vZmZfdCk7CisKIAkvKgogCSAqIE5vdyBraWxsIHVzZV9ibG9jayBpZiBpdCByZWZlcnMgdG8gYSBtaXNzaW5nIGJsb2NrLCBzbyB3ZQogCSAqIGNhbiB1c2UgaXQgYXMgYW4gaW5kaWNhdGlvbiBvZiBhbGxvY2F0aW9uIG5lZWRlZC4KIAkgKi8KLQlpZiAodXNlX2Jsb2NrICE9IC0xICYmIGJlMTZfdG9fY3B1KGJlc3RzcFt1c2VfYmxvY2tdKSA9PSBOVUxMREFUQU9GRikKKwlpZiAodXNlX2Jsb2NrICE9IC0xICYmIGJlc3RzcFt1c2VfYmxvY2tdID09IGNwdV90b19iZTE2KE5VTExEQVRBT0ZGKSkKIAkJdXNlX2Jsb2NrID0gLTE7CiAJLyoKIAkgKiBJZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBmcmVlIGJ5dGVzIGJ1dCB3ZSBjYW4gbWFrZSBlbm91Z2gKQEAgLTM2OSw4ICs0OTQsOCBAQAogCQkgKi8KIAkJZWxzZQogCQkJeGZzX2RpcjJfbGVhZl9sb2dfYmVzdHModHAsIGxicCwgdXNlX2Jsb2NrLCB1c2VfYmxvY2spOwotCQlkYXRhID0gZGJwLT5kYXRhOwotCQliZXN0c3BbdXNlX2Jsb2NrXSA9IGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGg7CisJCWhkciA9IGRicC0+ZGF0YTsKKwkJYmVzdHNwW3VzZV9ibG9ja10gPSBoZHItPmJlc3RmcmVlWzBdLmxlbmd0aDsKIAkJZ3Jvd24gPSAxOwogCX0KIAkvKgpAQCAtMzg0LDcgKzUwOSw3IEBACiAJCQl4ZnNfZGFfYnJlbHNlKHRwLCBsYnApOwogCQkJcmV0dXJuIGVycm9yOwogCQl9Ci0JCWRhdGEgPSBkYnAtPmRhdGE7CisJCWhkciA9IGRicC0+ZGF0YTsKIAkJZ3Jvd24gPSAwOwogCX0KIAl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBkYnApOwpAQCAtMzkyLDE0ICs1MTcsMTQgQEAKIAkgKiBQb2ludCB0byB0aGUgYmlnZ2VzdCBmcmVlc3BhY2UgaW4gb3VyIGRhdGEgYmxvY2suCiAJICovCiAJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikKLQkgICAgICAoKGNoYXIgKilkYXRhICsgYmUxNl90b19jcHUoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLm9mZnNldCkpOworCSAgICAgICgoY2hhciAqKWhkciArIGJlMTZfdG9fY3B1KGhkci0+YmVzdGZyZWVbMF0ub2Zmc2V0KSk7CiAJQVNTRVJUKGJlMTZfdG9fY3B1KGR1cC0+bGVuZ3RoKSA+PSBsZW5ndGgpOwogCW5lZWRzY2FuID0gbmVlZGxvZyA9IDA7CiAJLyoKIAkgKiBNYXJrIHRoZSBpbml0aWFsIHBhcnQgb2Ygb3VyIGZyZWVzcGFjZSBpbiB1c2UgZm9yIHRoZSBuZXcgZW50cnkuCiAJICovCiAJeGZzX2RpcjJfZGF0YV91c2VfZnJlZSh0cCwgZGJwLCBkdXAsCi0JCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWRhdGEpLCBsZW5ndGgsCisJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWhkciksIGxlbmd0aCwKIAkJJm5lZWRsb2csICZuZWVkc2Nhbik7CiAJLyoKIAkgKiBJbml0aWFsaXplIG91ciBuZXcgZW50cnkgKGF0IGxhc3QpLgpAQCAtNDA5LDEyICs1MzQsMTIgQEAKIAlkZXAtPm5hbWVsZW4gPSBhcmdzLT5uYW1lbGVuOwogCW1lbWNweShkZXAtPm5hbWUsIGFyZ3MtPm5hbWUsIGRlcC0+bmFtZWxlbik7CiAJdGFncCA9IHhmc19kaXIyX2RhdGFfZW50cnlfdGFnX3AoZGVwKTsKLQkqdGFncCA9IGNwdV90b19iZTE2KChjaGFyICopZGVwIC0gKGNoYXIgKilkYXRhKTsKKwkqdGFncCA9IGNwdV90b19iZTE2KChjaGFyICopZGVwIC0gKGNoYXIgKiloZHIpOwogCS8qCiAJICogTmVlZCB0byBzY2FuIGZpeCB1cCB0aGUgYmVzdGZyZWUgdGFibGUuCiAJICovCiAJaWYgKG5lZWRzY2FuKQotCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCBkYXRhLCAmbmVlZGxvZyk7CisJCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsIGhkciwgJm5lZWRsb2cpOwogCS8qCiAJICogTmVlZCB0byBsb2cgdGhlIGRhdGEgYmxvY2sncyBoZWFkZXIuCiAJICovCkBAIC00MjUsMTA3ICs1NTAsMTUgQEAKIAkgKiBJZiB0aGUgYmVzdHMgdGFibGUgbmVlZHMgdG8gYmUgY2hhbmdlZCwgZG8gaXQuCiAJICogTG9nIHRoZSBjaGFuZ2UgdW5sZXNzIHdlJ3ZlIGFscmVhZHkgZG9uZSB0aGF0LgogCSAqLwotCWlmIChiZTE2X3RvX2NwdShiZXN0c3BbdXNlX2Jsb2NrXSkgIT0gYmUxNl90b19jcHUoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCkpIHsKLQkJYmVzdHNwW3VzZV9ibG9ja10gPSBkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoOworCWlmIChiZTE2X3RvX2NwdShiZXN0c3BbdXNlX2Jsb2NrXSkgIT0gYmUxNl90b19jcHUoaGRyLT5iZXN0ZnJlZVswXS5sZW5ndGgpKSB7CisJCWJlc3RzcFt1c2VfYmxvY2tdID0gaGRyLT5iZXN0ZnJlZVswXS5sZW5ndGg7CiAJCWlmICghZ3Jvd24pCiAJCQl4ZnNfZGlyMl9sZWFmX2xvZ19iZXN0cyh0cCwgbGJwLCB1c2VfYmxvY2ssIHVzZV9ibG9jayk7CiAJfQotCS8qCi0JICogTm93IHdlIG5lZWQgdG8gbWFrZSByb29tIHRvIGluc2VydCB0aGUgbGVhZiBlbnRyeS4KLQkgKiBJZiB0aGVyZSBhcmUgbm8gc3RhbGUgZW50cmllcywgd2UganVzdCBpbnNlcnQgYSBob2xlIGF0IGluZGV4LgotCSAqLwotCWlmICghbGVhZi0+aGRyLnN0YWxlKSB7Ci0JCS8qCi0JCSAqIGxlcCBpcyBzdGlsbCBnb29kIGFzIHRoZSBpbmRleCBsZWFmIGVudHJ5LgotCQkgKi8KLQkJaWYgKGluZGV4IDwgYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSkKLQkJCW1lbW1vdmUobGVwICsgMSwgbGVwLAotCQkJCShiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpIC0gaW5kZXgpICogc2l6ZW9mKCpsZXApKTsKLQkJLyoKLQkJICogUmVjb3JkIGxvdyBhbmQgaGlnaCBsb2dnaW5nIGluZGljZXMgZm9yIHRoZSBsZWFmLgotCQkgKi8KLQkJbGZsb2dsb3cgPSBpbmRleDsKLQkJbGZsb2doaWdoID0gYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KTsKLQkJYmUxNl9hZGRfY3B1KCZsZWFmLT5oZHIuY291bnQsIDEpOwotCX0KLQkvKgotCSAqIFRoZXJlIGFyZSBzdGFsZSBlbnRyaWVzLgotCSAqIFdlIHdpbGwgdXNlIG9uZSBvZiB0aGVtIGZvciB0aGUgbmV3IGVudHJ5LgotCSAqIEl0J3MgcHJvYmFibHkgbm90IGF0IHRoZSByaWdodCBsb2NhdGlvbiwgc28gd2UnbGwgaGF2ZSB0bwotCSAqIHNoaWZ0IHNvbWUgdXAgb3IgZG93biBmaXJzdC4KLQkgKi8KLQllbHNlIHsKLQkJLyoKLQkJICogSWYgd2UgZGlkbid0IGNvbXBhY3QgYmVmb3JlLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIG5lYXJlc3QKLQkJICogc3RhbGUgZW50cmllcyBiZWZvcmUgYW5kIGFmdGVyIG91ciBpbnNlcnRpb24gcG9pbnQuCi0JCSAqLwotCQlpZiAoY29tcGFjdCA9PSAwKSB7Ci0JCQkvKgotCQkJICogRmluZCB0aGUgZmlyc3Qgc3RhbGUgZW50cnkgYmVmb3JlIHRoZSBpbnNlcnRpb24KLQkJCSAqIHBvaW50LCBpZiBhbnkuCi0JCQkgKi8KLQkJCWZvciAobG93c3RhbGUgPSBpbmRleCAtIDE7Ci0JCQkgICAgIGxvd3N0YWxlID49IDAgJiYKLQkJCQliZTMyX3RvX2NwdShsZWFmLT5lbnRzW2xvd3N0YWxlXS5hZGRyZXNzKSAhPQotCQkJCVhGU19ESVIyX05VTExfREFUQVBUUjsKLQkJCSAgICAgbG93c3RhbGUtLSkKLQkJCQljb250aW51ZTsKLQkJCS8qCi0JCQkgKiBGaW5kIHRoZSBuZXh0IHN0YWxlIGVudHJ5IGF0IG9yIGFmdGVyIHRoZSBpbnNlcnRpb24KLQkJCSAqIHBvaW50LCBpZiBhbnkuICAgU3RvcCBpZiB3ZSBnbyBzbyBmYXIgdGhhdCB0aGUKLQkJCSAqIGxvd3N0YWxlIGVudHJ5IHdvdWxkIGJlIGJldHRlci4KLQkJCSAqLwotCQkJZm9yIChoaWdoc3RhbGUgPSBpbmRleDsKLQkJCSAgICAgaGlnaHN0YWxlIDwgYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSAmJgotCQkJCWJlMzJfdG9fY3B1KGxlYWYtPmVudHNbaGlnaHN0YWxlXS5hZGRyZXNzKSAhPQotCQkJCVhGU19ESVIyX05VTExfREFUQVBUUiAmJgotCQkJCShsb3dzdGFsZSA8IDAgfHwKLQkJCQkgaW5kZXggLSBsb3dzdGFsZSAtIDEgPj0gaGlnaHN0YWxlIC0gaW5kZXgpOwotCQkJICAgICBoaWdoc3RhbGUrKykKLQkJCQljb250aW51ZTsKLQkJfQotCQkvKgotCQkgKiBJZiB0aGUgbG93IG9uZSBpcyBiZXR0ZXIsIHVzZSBpdC4KLQkJICovCi0JCWlmIChsb3dzdGFsZSA+PSAwICYmCi0JCSAgICAoaGlnaHN0YWxlID09IGJlMTZfdG9fY3B1KGxlYWYtPmhkci5jb3VudCkgfHwKLQkJICAgICBpbmRleCAtIGxvd3N0YWxlIC0gMSA8IGhpZ2hzdGFsZSAtIGluZGV4KSkgewotCQkJQVNTRVJUKGluZGV4IC0gbG93c3RhbGUgLSAxID49IDApOwotCQkJQVNTRVJUKGJlMzJfdG9fY3B1KGxlYWYtPmVudHNbbG93c3RhbGVdLmFkZHJlc3MpID09Ci0JCQkgICAgICAgWEZTX0RJUjJfTlVMTF9EQVRBUFRSKTsKLQkJCS8qCi0JCQkgKiBDb3B5IGVudHJpZXMgdXAgdG8gY292ZXIgdGhlIHN0YWxlIGVudHJ5Ci0JCQkgKiBhbmQgbWFrZSByb29tIGZvciB0aGUgbmV3IGVudHJ5LgotCQkJICovCi0JCQlpZiAoaW5kZXggLSBsb3dzdGFsZSAtIDEgPiAwKQotCQkJCW1lbW1vdmUoJmxlYWYtPmVudHNbbG93c3RhbGVdLAotCQkJCQkmbGVhZi0+ZW50c1tsb3dzdGFsZSArIDFdLAotCQkJCQkoaW5kZXggLSBsb3dzdGFsZSAtIDEpICogc2l6ZW9mKCpsZXApKTsKLQkJCWxlcCA9ICZsZWFmLT5lbnRzW2luZGV4IC0gMV07Ci0JCQlsZmxvZ2xvdyA9IE1JTihsb3dzdGFsZSwgbGZsb2dsb3cpOwotCQkJbGZsb2doaWdoID0gTUFYKGluZGV4IC0gMSwgbGZsb2doaWdoKTsKLQkJfQotCQkvKgotCQkgKiBUaGUgaGlnaCBvbmUgaXMgYmV0dGVyLCBzbyB1c2UgdGhhdCBvbmUuCi0JCSAqLwotCQllbHNlIHsKLQkJCUFTU0VSVChoaWdoc3RhbGUgLSBpbmRleCA+PSAwKTsKLQkJCUFTU0VSVChiZTMyX3RvX2NwdShsZWFmLT5lbnRzW2hpZ2hzdGFsZV0uYWRkcmVzcykgPT0KLQkJCSAgICAgICBYRlNfRElSMl9OVUxMX0RBVEFQVFIpOwotCQkJLyoKLQkJCSAqIENvcHkgZW50cmllcyBkb3duIHRvIGNvdmVyIHRoZSBzdGFsZSBlbnRyeQotCQkJICogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBlbnRyeS4KLQkJCSAqLwotCQkJaWYgKGhpZ2hzdGFsZSAtIGluZGV4ID4gMCkKLQkJCQltZW1tb3ZlKCZsZWFmLT5lbnRzW2luZGV4ICsgMV0sCi0JCQkJCSZsZWFmLT5lbnRzW2luZGV4XSwKLQkJCQkJKGhpZ2hzdGFsZSAtIGluZGV4KSAqIHNpemVvZigqbGVwKSk7Ci0JCQlsZXAgPSAmbGVhZi0+ZW50c1tpbmRleF07Ci0JCQlsZmxvZ2xvdyA9IE1JTihpbmRleCwgbGZsb2dsb3cpOwotCQkJbGZsb2doaWdoID0gTUFYKGhpZ2hzdGFsZSwgbGZsb2doaWdoKTsKLQkJfQotCQliZTE2X2FkZF9jcHUoJmxlYWYtPmhkci5zdGFsZSwgLTEpOwotCX0KKworCWxlcCA9IHhmc19kaXIyX2xlYWZfZmluZF9lbnRyeShsZWFmLCBpbmRleCwgY29tcGFjdCwgbG93c3RhbGUsCisJCQkJICAgICAgIGhpZ2hzdGFsZSwgJmxmbG9nbG93LCAmbGZsb2doaWdoKTsKKwogCS8qCiAJICogRmlsbCBpbiB0aGUgbmV3IGxlYWYgZW50cnkuCiAJICovCkBAIC01NjIsNyArNTk1LDcgQEAKIAogCWxlYWYgPSBicC0+ZGF0YTsKIAltcCA9IGRwLT5pX21vdW50OwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RJUjJfTEVBRjFfTUFHSUMpOworCUFTU0VSVChsZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfRElSMl9MRUFGMV9NQUdJQykpOwogCS8qCiAJICogVGhpcyB2YWx1ZSBpcyBub3QgcmVzdHJpY3RpdmUgZW5vdWdoLgogCSAqIFNob3VsZCBmYWN0b3IgaW4gdGhlIHNpemUgb2YgdGhlIGJlc3RzIHRhYmxlIGFzIHdlbGwuCkBAIC01ODIsNyArNjE1LDcgQEAKIAkJaWYgKGkgKyAxIDwgYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSkKIAkJCUFTU0VSVChiZTMyX3RvX2NwdShsZWFmLT5lbnRzW2ldLmhhc2h2YWwpIDw9CiAJCQkgICAgICAgYmUzMl90b19jcHUobGVhZi0+ZW50c1tpICsgMV0uaGFzaHZhbCkpOwotCQlpZiAoYmUzMl90b19jcHUobGVhZi0+ZW50c1tpXS5hZGRyZXNzKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpCisJCWlmIChsZWFmLT5lbnRzW2ldLmFkZHJlc3MgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfTlVMTF9EQVRBUFRSKSkKIAkJCXN0YWxlKys7CiAJfQogCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuc3RhbGUpID09IHN0YWxlKTsKQEAgLTYxMSw3ICs2NDQsOCBAQAogCSAqIENvbXByZXNzIG91dCB0aGUgc3RhbGUgZW50cmllcyBpbiBwbGFjZS4KIAkgKi8KIAlmb3IgKGZyb20gPSB0byA9IDAsIGxvZ2xvdyA9IC0xOyBmcm9tIDwgYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KTsgZnJvbSsrKSB7Ci0JCWlmIChiZTMyX3RvX2NwdShsZWFmLT5lbnRzW2Zyb21dLmFkZHJlc3MpID09IFhGU19ESVIyX05VTExfREFUQVBUUikKKwkJaWYgKGxlYWYtPmVudHNbZnJvbV0uYWRkcmVzcyA9PQorCQkgICAgY3B1X3RvX2JlMzIoWEZTX0RJUjJfTlVMTF9EQVRBUFRSKSkKIAkJCWNvbnRpbnVlOwogCQkvKgogCQkgKiBPbmx5IGFjdHVhbGx5IGNvcHkgdGhlIGVudHJpZXMgdGhhdCBhcmUgZGlmZmVyZW50LgpAQCAtNjYzLDI0ICs2OTcsOSBAQAogCWxlYWYgPSBicC0+ZGF0YTsKIAlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLnN0YWxlKSA+IDEpOwogCWluZGV4ID0gKmluZGV4cDsKLQkvKgotCSAqIEZpbmQgdGhlIGZpcnN0IHN0YWxlIGVudHJ5IGJlZm9yZSBvdXIgaW5kZXgsIGlmIGFueS4KLQkgKi8KLQlmb3IgKGxvd3N0YWxlID0gaW5kZXggLSAxOwotCSAgICAgbG93c3RhbGUgPj0gMCAmJgotCQliZTMyX3RvX2NwdShsZWFmLT5lbnRzW2xvd3N0YWxlXS5hZGRyZXNzKSAhPSBYRlNfRElSMl9OVUxMX0RBVEFQVFI7Ci0JICAgICBsb3dzdGFsZS0tKQotCQljb250aW51ZTsKLQkvKgotCSAqIEZpbmQgdGhlIGZpcnN0IHN0YWxlIGVudHJ5IGF0IG9yIGFmdGVyIG91ciBpbmRleCwgaWYgYW55LgotCSAqIFN0b3AgaWYgdGhlIGFuc3dlciB3b3VsZCBiZSB3b3JzZSB0aGFuIGxvd3N0YWxlLgotCSAqLwotCWZvciAoaGlnaHN0YWxlID0gaW5kZXg7Ci0JICAgICBoaWdoc3RhbGUgPCBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpICYmCi0JCWJlMzJfdG9fY3B1KGxlYWYtPmVudHNbaGlnaHN0YWxlXS5hZGRyZXNzKSAhPSBYRlNfRElSMl9OVUxMX0RBVEFQVFIgJiYKLQkJKGxvd3N0YWxlIDwgMCB8fCBpbmRleCAtIGxvd3N0YWxlID4gaGlnaHN0YWxlIC0gaW5kZXgpOwotCSAgICAgaGlnaHN0YWxlKyspCi0JCWNvbnRpbnVlOworCisJeGZzX2RpcjJfbGVhZl9maW5kX3N0YWxlKGxlYWYsIGluZGV4LCAmbG93c3RhbGUsICZoaWdoc3RhbGUpOworCiAJLyoKIAkgKiBQaWNrIHRoZSBiZXR0ZXIgb2YgbG93c3RhbGUgYW5kIGhpZ2hzdGFsZS4KIAkgKi8KQEAgLTcwMSw3ICs3MjAsOCBAQAogCQlpZiAoaW5kZXggPT0gZnJvbSkKIAkJCW5ld2luZGV4ID0gdG87CiAJCWlmIChmcm9tICE9IGtlZXBzdGFsZSAmJgotCQkgICAgYmUzMl90b19jcHUobGVhZi0+ZW50c1tmcm9tXS5hZGRyZXNzKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpIHsKKwkJICAgIGxlYWYtPmVudHNbZnJvbV0uYWRkcmVzcyA9PQorCQkgICAgY3B1X3RvX2JlMzIoWEZTX0RJUjJfTlVMTF9EQVRBUFRSKSkgewogCQkJaWYgKGZyb20gPT0gdG8pCiAJCQkJKmxvd2xvZ3AgPSB0bzsKIAkJCWNvbnRpbnVlOwpAQCAtNzYwLDcgKzc4MCw3IEBACiAJaW50CQkJYnl0ZW9mZjsJLyogb2Zmc2V0IGluIGN1cnJlbnQgYmxvY2sgKi8KIAl4ZnNfZGlyMl9kYl90CQljdXJkYjsJCS8qIGRiIGZvciBjdXJyZW50IGJsb2NrICovCiAJeGZzX2RpcjJfb2ZmX3QJCWN1cm9mZjsJCS8qIGN1cnJlbnQgb3ZlcmFsbCBvZmZzZXQgKi8KLQl4ZnNfZGlyMl9kYXRhX3QJCSpkYXRhOwkJLyogZGF0YSBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9kYXRhX2hkcl90CSpoZHI7CQkvKiBkYXRhIGJsb2NrIGhlYWRlciAqLwogCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBlbnRyeSAqLwogCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cDsJCS8qIHVudXNlZCBlbnRyeSAqLwogCWludAkJCWVycm9yID0gMDsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCkBAIC0xMDE4LDIzICsxMDM4LDIzIEBACiAJCQllbHNlIGlmIChjdXJvZmYgPiBuZXdvZmYpCiAJCQkJQVNTRVJUKHhmc19kaXIyX2J5dGVfdG9fZGIobXAsIGN1cm9mZikgPT0KIAkJCQkgICAgICAgY3VyZGIpOwotCQkJZGF0YSA9IGJwLT5kYXRhOworCQkJaGRyID0gYnAtPmRhdGE7CiAJCQl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBicCk7CiAJCQkvKgogCQkJICogRmluZCBvdXIgcG9zaXRpb24gaW4gdGhlIGJsb2NrLgogCQkJICovCi0JCQlwdHIgPSAoY2hhciAqKSZkYXRhLT51OworCQkJcHRyID0gKGNoYXIgKikoaGRyICsgMSk7CiAJCQlieXRlb2ZmID0geGZzX2RpcjJfYnl0ZV90b19vZmYobXAsIGN1cm9mZik7CiAJCQkvKgogCQkJICogU2tpcCBwYXN0IHRoZSBoZWFkZXIuCiAJCQkgKi8KIAkJCWlmIChieXRlb2ZmID09IDApCi0JCQkJY3Vyb2ZmICs9ICh1aW50KXNpemVvZihkYXRhLT5oZHIpOworCQkJCWN1cm9mZiArPSAodWludClzaXplb2YoKmhkcik7CiAJCQkvKgogCQkJICogU2tpcCBwYXN0IGVudHJpZXMgdW50aWwgd2UgcmVhY2ggb3VyIG9mZnNldC4KIAkJCSAqLwogCQkJZWxzZSB7Ci0JCQkJd2hpbGUgKChjaGFyICopcHRyIC0gKGNoYXIgKilkYXRhIDwgYnl0ZW9mZikgeworCQkJCXdoaWxlICgoY2hhciAqKXB0ciAtIChjaGFyICopaGRyIDwgYnl0ZW9mZikgewogCQkJCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKXB0cjsKIAogCQkJCQlpZiAoYmUxNl90b19jcHUoZHVwLT5mcmVldGFnKQpAQCAtMTA1NSw4ICsxMDc1LDggQEAKIAkJCQljdXJvZmYgPQogCQkJCQl4ZnNfZGlyMl9kYl9vZmZfdG9fYnl0ZShtcCwKIAkJCQkJICAgIHhmc19kaXIyX2J5dGVfdG9fZGIobXAsIGN1cm9mZiksCi0JCQkJCSAgICAoY2hhciAqKXB0ciAtIChjaGFyICopZGF0YSk7Ci0JCQkJaWYgKHB0ciA+PSAoY2hhciAqKWRhdGEgKyBtcC0+bV9kaXJibGtzaXplKSB7CisJCQkJCSAgICAoY2hhciAqKXB0ciAtIChjaGFyICopaGRyKTsKKwkJCQlpZiAocHRyID49IChjaGFyICopaGRyICsgbXAtPm1fZGlyYmxrc2l6ZSkgewogCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQl9CkBAIC0xMTc5LDcgKzExOTksNyBAQAogCXhmc19kaXIyX2xlYWZfdGFpbF90CSpsdHA7CQkvKiBsZWFmIHRhaWwgc3RydWN0dXJlICovCiAKIAlsZWFmID0gYnAtPmRhdGE7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KGxlYWYtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfRElSMl9MRUFGMV9NQUdJQyk7CisJQVNTRVJUKGxlYWYtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19ESVIyX0xFQUYxX01BR0lDKSk7CiAJbHRwID0geGZzX2RpcjJfbGVhZl90YWlsX3AodHAtPnRfbW91bnRwLCBsZWFmKTsKIAlmaXJzdGIgPSB4ZnNfZGlyMl9sZWFmX2Jlc3RzX3AobHRwKSArIGZpcnN0OwogCWxhc3RiID0geGZzX2RpcjJfbGVhZl9iZXN0c19wKGx0cCkgKyBsYXN0OwpAQCAtMTIwMiw4ICsxMjIyLDggQEAKIAl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KIAogCWxlYWYgPSBicC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19ESVIyX0xFQUYxX01BR0lDIHx8Ci0JICAgICAgIGJlMTZfdG9fY3B1KGxlYWYtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJQVNTRVJUKGxlYWYtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19ESVIyX0xFQUYxX01BR0lDKSB8fAorCSAgICAgICBsZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfRElSMl9MRUFGTl9NQUdJQykpOwogCWZpcnN0bGVwID0gJmxlYWYtPmVudHNbZmlyc3RdOwogCWxhc3RsZXAgPSAmbGVhZi0+ZW50c1tsYXN0XTsKIAl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWZpcnN0bGVwIC0gKGNoYXIgKilsZWFmKSwKQEAgLTEyMjEsOCArMTI0MSw4IEBACiAJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCiAKIAlsZWFmID0gYnAtPmRhdGE7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KGxlYWYtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfRElSMl9MRUFGMV9NQUdJQyB8fAotCSAgICAgICBiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCUFTU0VSVChsZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfRElSMl9MRUFGMV9NQUdJQykgfHwKKwkgICAgICAgbGVhZi0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RJUjJfTEVBRk5fTUFHSUMpKTsKIAl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKSZsZWFmLT5oZHIgLSAoY2hhciAqKWxlYWYpLAogCQkodWludCkoc2l6ZW9mKGxlYWYtPmhkcikgLSAxKSk7CiB9CkBAIC0xMjQxLDcgKzEyNjEsNyBAQAogCiAJbXAgPSB0cC0+dF9tb3VudHA7CiAJbGVhZiA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RJUjJfTEVBRjFfTUFHSUMpOworCUFTU0VSVChsZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfRElSMl9MRUFGMV9NQUdJQykpOwogCWx0cCA9IHhmc19kaXIyX2xlYWZfdGFpbF9wKG1wLCBsZWFmKTsKIAl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWx0cCAtIChjaGFyICopbGVhZiksCiAJCSh1aW50KShtcC0+bV9kaXJibGtzaXplIC0gMSkpOwpAQCAtMTQzNyw3ICsxNDU3LDcgQEAKIAl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KIHsKIAlfX2JlMTYJCQkqYmVzdHNwOwkvKiBsZWFmIGJsb2NrIGJlc3QgZnJlZXNwYWNlICovCi0JeGZzX2RpcjJfZGF0YV90CQkqZGF0YTsJCS8qIGRhdGEgYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyOwkJLyogZGF0YSBibG9jayBoZWFkZXIgKi8KIAl4ZnNfZGlyMl9kYl90CQlkYjsJCS8qIGRhdGEgYmxvY2sgbnVtYmVyICovCiAJeGZzX2RhYnVmX3QJCSpkYnA7CQkvKiBkYXRhIGJsb2NrIGJ1ZmZlciAqLwogCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBlbnRyeSBzdHJ1Y3R1cmUgKi8KQEAgLTE0NjcsNyArMTQ4Nyw3IEBACiAJdHAgPSBhcmdzLT50cmFuczsKIAltcCA9IGRwLT5pX21vdW50OwogCWxlYWYgPSBsYnAtPmRhdGE7Ci0JZGF0YSA9IGRicC0+ZGF0YTsKKwloZHIgPSBkYnAtPmRhdGE7CiAJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgZGJwKTsKIAkvKgogCSAqIFBvaW50IHRvIHRoZSBsZWFmIGVudHJ5LCB1c2UgdGhhdCB0byBwb2ludCB0byB0aGUgZGF0YSBlbnRyeS4KQEAgLTE0NzUsOSArMTQ5NSw5IEBACiAJbGVwID0gJmxlYWYtPmVudHNbaW5kZXhdOwogCWRiID0geGZzX2RpcjJfZGF0YXB0cl90b19kYihtcCwgYmUzMl90b19jcHUobGVwLT5hZGRyZXNzKSk7CiAJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQotCSAgICAgICgoY2hhciAqKWRhdGEgKyB4ZnNfZGlyMl9kYXRhcHRyX3RvX29mZihtcCwgYmUzMl90b19jcHUobGVwLT5hZGRyZXNzKSkpOworCSAgICAgICgoY2hhciAqKWhkciArIHhmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKG1wLCBiZTMyX3RvX2NwdShsZXAtPmFkZHJlc3MpKSk7CiAJbmVlZHNjYW4gPSBuZWVkbG9nID0gMDsKLQlvbGRiZXN0ID0gYmUxNl90b19jcHUoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCk7CisJb2xkYmVzdCA9IGJlMTZfdG9fY3B1KGhkci0+YmVzdGZyZWVbMF0ubGVuZ3RoKTsKIAlsdHAgPSB4ZnNfZGlyMl9sZWFmX3RhaWxfcChtcCwgbGVhZik7CiAJYmVzdHNwID0geGZzX2RpcjJfbGVhZl9iZXN0c19wKGx0cCk7CiAJQVNTRVJUKGJlMTZfdG9fY3B1KGJlc3RzcFtkYl0pID09IG9sZGJlc3QpOwpAQCAtMTQ4NSw3ICsxNTA1LDcgQEAKIAkgKiBNYXJrIHRoZSBmb3JtZXIgZGF0YSBlbnRyeSB1bnVzZWQuCiAJICovCiAJeGZzX2RpcjJfZGF0YV9tYWtlX2ZyZWUodHAsIGRicCwKLQkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWRlcCAtIChjaGFyICopZGF0YSksCisJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilkZXAgLSAoY2hhciAqKWhkciksCiAJCXhmc19kaXIyX2RhdGFfZW50c2l6ZShkZXAtPm5hbWVsZW4pLCAmbmVlZGxvZywgJm5lZWRzY2FuKTsKIAkvKgogCSAqIFdlIGp1c3QgbWFyayB0aGUgbGVhZiBlbnRyeSBzdGFsZSBieSBwdXR0aW5nIGEgbnVsbCBpbiBpdC4KQEAgLTE0OTksMjMgKzE1MTksMjMgQEAKIAkgKiBsb2cgdGhlIGRhdGEgYmxvY2sgaGVhZGVyIGlmIG5lY2Vzc2FyeS4KIAkgKi8KIAlpZiAobmVlZHNjYW4pCi0JCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsIGRhdGEsICZuZWVkbG9nKTsKKwkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgaGRyLCAmbmVlZGxvZyk7CiAJaWYgKG5lZWRsb2cpCiAJCXhmc19kaXIyX2RhdGFfbG9nX2hlYWRlcih0cCwgZGJwKTsKIAkvKgogCSAqIElmIHRoZSBsb25nZXN0IGZyZWVzcGFjZSBpbiB0aGUgZGF0YSBibG9jayBoYXMgY2hhbmdlZCwKIAkgKiBwdXQgdGhlIG5ldyB2YWx1ZSBpbiB0aGUgYmVzdHMgdGFibGUgYW5kIGxvZyB0aGF0LgogCSAqLwotCWlmIChiZTE2X3RvX2NwdShkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoKSAhPSBvbGRiZXN0KSB7Ci0JCWJlc3RzcFtkYl0gPSBkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoOworCWlmIChiZTE2X3RvX2NwdShoZHItPmJlc3RmcmVlWzBdLmxlbmd0aCkgIT0gb2xkYmVzdCkgeworCQliZXN0c3BbZGJdID0gaGRyLT5iZXN0ZnJlZVswXS5sZW5ndGg7CiAJCXhmc19kaXIyX2xlYWZfbG9nX2Jlc3RzKHRwLCBsYnAsIGRiLCBkYik7CiAJfQogCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGRicCk7CiAJLyoKIAkgKiBJZiB0aGUgZGF0YSBibG9jayBpcyBub3cgZW1wdHkgdGhlbiBnZXQgcmlkIG9mIHRoZSBkYXRhIGJsb2NrLgogCSAqLwotCWlmIChiZTE2X3RvX2NwdShkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoKSA9PQotCSAgICBtcC0+bV9kaXJibGtzaXplIC0gKHVpbnQpc2l6ZW9mKGRhdGEtPmhkcikpIHsKKwlpZiAoYmUxNl90b19jcHUoaGRyLT5iZXN0ZnJlZVswXS5sZW5ndGgpID09CisJICAgIG1wLT5tX2RpcmJsa3NpemUgLSAodWludClzaXplb2YoKmhkcikpIHsKIAkJQVNTRVJUKGRiICE9IG1wLT5tX2RpcmRhdGFibGspOwogCQlpZiAoKGVycm9yID0geGZzX2RpcjJfc2hyaW5rX2lub2RlKGFyZ3MsIGRiLCBkYnApKSkgewogCQkJLyoKQEAgLTE1NDIsNyArMTU2Miw3IEBACiAJCQkgKiBMb29rIGZvciB0aGUgbGFzdCBhY3RpdmUgZW50cnkgKGkpLgogCQkJICovCiAJCQlmb3IgKGkgPSBkYiAtIDE7IGkgPiAwOyBpLS0pIHsKLQkJCQlpZiAoYmUxNl90b19jcHUoYmVzdHNwW2ldKSAhPSBOVUxMREFUQU9GRikKKwkJCQlpZiAoYmVzdHNwW2ldICE9IGNwdV90b19iZTE2KE5VTExEQVRBT0ZGKSkKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCQkvKgpAQCAtMTY4Niw5ICsxNzA2LDYgQEAKIAl4ZnNfZGlyMl9kYl90CQlkYikJCS8qIGRhdGEgYmxvY2sgbnVtYmVyICovCiB7CiAJX19iZTE2CQkJKmJlc3RzcDsJLyogbGVhZiBiZXN0cyB0YWJsZSAqLwotI2lmZGVmIERFQlVHCi0JeGZzX2RpcjJfZGF0YV90CQkqZGF0YTsJCS8qIGRhdGEgYmxvY2sgc3RydWN0dXJlICovCi0jZW5kaWYKIAl4ZnNfZGFidWZfdAkJKmRicDsJCS8qIGRhdGEgYmxvY2sgYnVmZmVyICovCiAJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KIAlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwpAQCAtMTcwNywyMCArMTcyNCwyMSBAQAogCQkJWEZTX0RBVEFfRk9SSykpKSB7CiAJCXJldHVybiBlcnJvcjsKIAl9Ci0jaWZkZWYgREVCVUcKLQlkYXRhID0gZGJwLT5kYXRhOwotCUFTU0VSVChiZTMyX3RvX2NwdShkYXRhLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0RBVEFfTUFHSUMpOwotI2VuZGlmCi0JLyogdGhpcyBzZWVtcyB0byBiZSBhbiBlcnJvcgotCSAqIGRhdGEgaXMgb25seSB2YWxpZCBpZiBERUJVRyBpcyBkZWZpbmVkPwotCSAqIFJNQyAwOS8wOC8xOTk5Ci0JICovCiAKIAlsZWFmID0gbGJwLT5kYXRhOwogCWx0cCA9IHhmc19kaXIyX2xlYWZfdGFpbF9wKG1wLCBsZWFmKTsKLQlBU1NFUlQoYmUxNl90b19jcHUoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCkgPT0KLQkgICAgICAgbXAtPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZihkYXRhLT5oZHIpKTsKKworI2lmZGVmIERFQlVHCit7CisJc3RydWN0IHhmc19kaXIyX2RhdGFfaGRyICpoZHIgPSBkYnAtPmRhdGE7CisKKwlBU1NFUlQoaGRyLT5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9EQVRBX01BR0lDKSk7CisJQVNTRVJUKGJlMTZfdG9fY3B1KGhkci0+YmVzdGZyZWVbMF0ubGVuZ3RoKSA9PQorCSAgICAgICBtcC0+bV9kaXJibGtzaXplIC0gKHVpbnQpc2l6ZW9mKCpoZHIpKTsKIAlBU1NFUlQoZGIgPT0gYmUzMl90b19jcHUobHRwLT5iZXN0Y291bnQpIC0gMSk7Cit9CisjZW5kaWYKKwogCS8qCiAJICogR2V0IHJpZCBvZiB0aGUgZGF0YSBibG9jay4KIAkgKi8KQEAgLTE3NDAsNiArMTc1OCwyMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHNpemVfdAoreGZzX2RpcjJfbGVhZl9zaXplKAorCXN0cnVjdCB4ZnNfZGlyMl9sZWFmX2hkcgkqaGRyLAorCWludAkJCQljb3VudHMpCit7CisJaW50CQkJZW50cmllczsKKworCWVudHJpZXMgPSBiZTE2X3RvX2NwdShoZHItPmNvdW50KSAtIGJlMTZfdG9fY3B1KGhkci0+c3RhbGUpOworCXJldHVybiBzaXplb2YoeGZzX2RpcjJfbGVhZl9oZHJfdCkgKworCSAgICBlbnRyaWVzICogc2l6ZW9mKHhmc19kaXIyX2xlYWZfZW50cnlfdCkgKworCSAgICBjb3VudHMgKiBzaXplb2YoeGZzX2RpcjJfZGF0YV9vZmZfdCkgKworCSAgICBzaXplb2YoeGZzX2RpcjJfbGVhZl90YWlsX3QpOworfQorCiAvKgogICogQ29udmVydCBub2RlIGZvcm0gZGlyZWN0b3J5IHRvIGxlYWYgZm9ybSBkaXJlY3RvcnkuCiAgKiBUaGUgcm9vdCBvZiB0aGUgbm9kZSBmb3JtIGRpciBuZWVkcyB0byBhbHJlYWR5IGJlIGEgTEVBRk4gYmxvY2suCkBAIC0xODEwLDcgKzE4NDIsNyBAQAogCQlyZXR1cm4gMDsKIAlsYnAgPSBzdGF0ZS0+cGF0aC5ibGtbMF0uYnA7CiAJbGVhZiA9IGxicC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwlBU1NFUlQobGVhZi0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RJUjJfTEVBRk5fTUFHSUMpKTsKIAkvKgogCSAqIFJlYWQgdGhlIGZyZWVzcGFjZSBibG9jay4KIAkgKi8KQEAgLTE4MTksMjAgKzE4NTEsMTkgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAlmcmVlID0gZmJwLT5kYXRhOwotCUFTU0VSVChiZTMyX3RvX2NwdShmcmVlLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCUFTU0VSVChmcmVlLT5oZHIubWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfRlJFRV9NQUdJQykpOwogCUFTU0VSVCghZnJlZS0+aGRyLmZpcnN0ZGIpOworCiAJLyoKIAkgKiBOb3cgc2VlIGlmIHRoZSBsZWFmbiBhbmQgZnJlZSBkYXRhIHdpbGwgZml0IGluIGEgbGVhZjEuCiAJICogSWYgbm90LCByZWxlYXNlIHRoZSBidWZmZXIgYW5kIGdpdmUgdXAuCiAJICovCi0JaWYgKCh1aW50KXNpemVvZihsZWFmLT5oZHIpICsKLQkgICAgKGJlMTZfdG9fY3B1KGxlYWYtPmhkci5jb3VudCkgLSBiZTE2X3RvX2NwdShsZWFmLT5oZHIuc3RhbGUpKSAqICh1aW50KXNpemVvZihsZWFmLT5lbnRzWzBdKSArCi0JICAgIGJlMzJfdG9fY3B1KGZyZWUtPmhkci5udmFsaWQpICogKHVpbnQpc2l6ZW9mKGxlYWYtPmJlc3RzWzBdKSArCi0JICAgICh1aW50KXNpemVvZihsZWFmLT50YWlsKSA+Ci0JICAgIG1wLT5tX2RpcmJsa3NpemUpIHsKKwlpZiAoeGZzX2RpcjJfbGVhZl9zaXplKCZsZWFmLT5oZHIsIGJlMzJfdG9fY3B1KGZyZWUtPmhkci5udmFsaWQpKSA+CisJCQltcC0+bV9kaXJibGtzaXplKSB7CiAJCXhmc19kYV9icmVsc2UodHAsIGZicCk7CiAJCXJldHVybiAwOwogCX0KKwogCS8qCiAJICogSWYgdGhlIGxlYWYgaGFzIGFueSBzdGFsZSBlbnRyaWVzIGluIGl0LCBjb21wcmVzcyB0aGVtIG91dC4KIAkgKiBUaGUgY29tcGFjdCByb3V0aW5lIHdpbGwgbG9nIHRoZSBoZWFkZXIuCkBAIC0xODUxLDcgKzE4ODIsNyBAQAogCSAqIFNldCB1cCB0aGUgbGVhZiBiZXN0cyB0YWJsZS4KIAkgKi8KIAltZW1jcHkoeGZzX2RpcjJfbGVhZl9iZXN0c19wKGx0cCksIGZyZWUtPmJlc3RzLAotCQliZTMyX3RvX2NwdShsdHAtPmJlc3Rjb3VudCkgKiBzaXplb2YobGVhZi0+YmVzdHNbMF0pKTsKKwkJYmUzMl90b19jcHUobHRwLT5iZXN0Y291bnQpICogc2l6ZW9mKHhmc19kaXIyX2RhdGFfb2ZmX3QpKTsKIAl4ZnNfZGlyMl9sZWFmX2xvZ19iZXN0cyh0cCwgbGJwLCAwLCBiZTMyX3RvX2NwdShsdHAtPmJlc3Rjb3VudCkgLSAxKTsKIAl4ZnNfZGlyMl9sZWFmX2xvZ190YWlsKHRwLCBsYnApOwogCXhmc19kaXIyX2xlYWZfY2hlY2soZHAsIGxicCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfbGVhZi5oIGIvZnMveGZzL3hmc19kaXIyX2xlYWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5NTM5Zi4uMDAwMDAwMAotLS0gYS9mcy94ZnMveGZzX2RpcjJfbGVhZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLSNpZm5kZWYgX19YRlNfRElSMl9MRUFGX0hfXwotI2RlZmluZQlfX1hGU19ESVIyX0xFQUZfSF9fCi0KLXN0cnVjdCB1aW87Ci1zdHJ1Y3QgeGZzX2RhYnVmOwotc3RydWN0IHhmc19kYV9hcmdzOwotc3RydWN0IHhmc19pbm9kZTsKLXN0cnVjdCB4ZnNfbW91bnQ7Ci1zdHJ1Y3QgeGZzX3RyYW5zOwotCi0vKgotICogT2Zmc2V0IG9mIHRoZSBsZWFmL25vZGUgc3BhY2UuICBGaXJzdCBibG9jayBpbiB0aGlzIHNwYWNlCi0gKiBpcyB0aGUgYnRyZWUgcm9vdC4KLSAqLwotI2RlZmluZQlYRlNfRElSMl9MRUFGX1NQQUNFCTEKLSNkZWZpbmUJWEZTX0RJUjJfTEVBRl9PRkZTRVQJKFhGU19ESVIyX0xFQUZfU1BBQ0UgKiBYRlNfRElSMl9TUEFDRV9TSVpFKQotI2RlZmluZQlYRlNfRElSMl9MRUFGX0ZJUlNUREIobXApCVwKLQl4ZnNfZGlyMl9ieXRlX3RvX2RiKG1wLCBYRlNfRElSMl9MRUFGX09GRlNFVCkKLQotLyoKLSAqIE9mZnNldCBpbiBkYXRhIHNwYWNlIG9mIGEgZGF0YSBlbnRyeS4KLSAqLwotdHlwZWRlZglfX3VpbnQzMl90CXhmc19kaXIyX2RhdGFwdHJfdDsKLSNkZWZpbmUJWEZTX0RJUjJfTUFYX0RBVEFQVFIJKCh4ZnNfZGlyMl9kYXRhcHRyX3QpMHhmZmZmZmZmZikKLSNkZWZpbmUJWEZTX0RJUjJfTlVMTF9EQVRBUFRSCSgoeGZzX2RpcjJfZGF0YXB0cl90KTApCi0KLS8qCi0gKiBMZWFmIGJsb2NrIGhlYWRlci4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfbGVhZl9oZHIgewotCXhmc19kYV9ibGtpbmZvX3QJaW5mbzsJCS8qIGhlYWRlciBmb3IgZGEgcm91dGluZXMgKi8KLQlfX2JlMTYJCQljb3VudDsJCS8qIGNvdW50IG9mIGVudHJpZXMgKi8KLQlfX2JlMTYJCQlzdGFsZTsJCS8qIGNvdW50IG9mIHN0YWxlIGVudHJpZXMgKi8KLX0geGZzX2RpcjJfbGVhZl9oZHJfdDsKLQotLyoKLSAqIExlYWYgYmxvY2sgZW50cnkuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHhmc19kaXIyX2xlYWZfZW50cnkgewotCV9fYmUzMgkJCWhhc2h2YWw7CS8qIGhhc2ggdmFsdWUgb2YgbmFtZSAqLwotCV9fYmUzMgkJCWFkZHJlc3M7CS8qIGFkZHJlc3Mgb2YgZGF0YSBlbnRyeSAqLwotfSB4ZnNfZGlyMl9sZWFmX2VudHJ5X3Q7Ci0KLS8qCi0gKiBMZWFmIGJsb2NrIHRhaWwuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHhmc19kaXIyX2xlYWZfdGFpbCB7Ci0JX19iZTMyCQkJYmVzdGNvdW50OwotfSB4ZnNfZGlyMl9sZWFmX3RhaWxfdDsKLQotLyoKLSAqIExlYWYgYmxvY2suCi0gKiBiZXN0cyBhbmQgdGFpbCBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2sgZm9yIHNpbmdsZS1sZWFmIG9ubHkKLSAqIChtYWdpYyA9IFhGU19ESVIyX0xFQUYxX01BR0lDIG5vdCBYRlNfRElSMl9MRUFGTl9NQUdJQykuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHhmc19kaXIyX2xlYWYgewotCXhmc19kaXIyX2xlYWZfaGRyX3QJaGRyOwkJLyogbGVhZiBoZWFkZXIgKi8KLQl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJZW50c1sxXTsJLyogZW50cmllcyAqLwotCQkJCQkJLyogLi4uICovCi0JeGZzX2RpcjJfZGF0YV9vZmZfdAliZXN0c1sxXTsJLyogYmVzdCBmcmVlIGNvdW50cyAqLwotCXhmc19kaXIyX2xlYWZfdGFpbF90CXRhaWw7CQkvKiBsZWFmIHRhaWwgKi8KLX0geGZzX2RpcjJfbGVhZl90OwotCi0vKgotICogREIgYmxvY2tzIGhlcmUgYXJlIGxvZ2ljYWwgZGlyZWN0b3J5IGJsb2NrIG51bWJlcnMsIG5vdCBmaWxlc3lzdGVtIGJsb2Nrcy4KLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCB4ZnNfZGlyMl9tYXhfbGVhZl9lbnRzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKQotewotCXJldHVybiAoaW50KSgoKG1wKS0+bV9kaXJibGtzaXplIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2xlYWZfaGRyX3QpKSAvCi0JICAgICAgICh1aW50KXNpemVvZih4ZnNfZGlyMl9sZWFmX2VudHJ5X3QpKTsKLX0KLQotLyoKLSAqIEdldCBhZGRyZXNzIG9mIHRoZSBiZXN0Y291bnQgZmllbGQgaW4gdGhlIHNpbmdsZS1sZWFmIGJsb2NrLgotICovCi1zdGF0aWMgaW5saW5lIHhmc19kaXIyX2xlYWZfdGFpbF90ICoKLXhmc19kaXIyX2xlYWZfdGFpbF9wKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9sZWFmX3QgKmxwKQotewotCXJldHVybiAoeGZzX2RpcjJfbGVhZl90YWlsX3QgKikKLQkJKChjaGFyICopKGxwKSArIChtcCktPm1fZGlyYmxrc2l6ZSAtIAotCQkgICh1aW50KXNpemVvZih4ZnNfZGlyMl9sZWFmX3RhaWxfdCkpOwotfQotCi0vKgotICogR2V0IGFkZHJlc3Mgb2YgdGhlIGJlc3RzIGFycmF5IGluIHRoZSBzaW5nbGUtbGVhZiBibG9jay4KLSAqLwotc3RhdGljIGlubGluZSBfX2JlMTYgKgoteGZzX2RpcjJfbGVhZl9iZXN0c19wKHhmc19kaXIyX2xlYWZfdGFpbF90ICpsdHApCi17Ci0JcmV0dXJuIChfX2JlMTYgKilsdHAgLSBiZTMyX3RvX2NwdShsdHAtPmJlc3Rjb3VudCk7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGRhdGFwdHIgdG8gYnl0ZSBpbiBmaWxlIHNwYWNlCi0gKi8KLXN0YXRpYyBpbmxpbmUgeGZzX2RpcjJfb2ZmX3QKLXhmc19kaXIyX2RhdGFwdHJfdG9fYnl0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKQotewotCXJldHVybiAoeGZzX2RpcjJfb2ZmX3QpKGRwKSA8PCBYRlNfRElSMl9EQVRBX0FMSUdOX0xPRzsKLX0KLQotLyoKLSAqIENvbnZlcnQgYnl0ZSBpbiBmaWxlIHNwYWNlIHRvIGRhdGFwdHIuICBJdCBoYWQgYmV0dGVyIGJlIGFsaWduZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGF0YXB0cl90Ci14ZnNfZGlyMl9ieXRlX3RvX2RhdGFwdHIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KQotewotCXJldHVybiAoeGZzX2RpcjJfZGF0YXB0cl90KSgoYnkpID4+IFhGU19ESVIyX0RBVEFfQUxJR05fTE9HKTsKLX0KLQotLyoKLSAqIENvbnZlcnQgYnl0ZSBpbiBzcGFjZSB0byAoREIpIGJsb2NrCi0gKi8KLXN0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGJfdAoteGZzX2RpcjJfYnl0ZV90b19kYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpCi17Ci0JcmV0dXJuICh4ZnNfZGlyMl9kYl90KSgoYnkpID4+IFwKLQkJICgobXApLT5tX3NiLnNiX2Jsb2NrbG9nICsgKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpKTsKLX0KLQotLyoKLSAqIENvbnZlcnQgZGF0YXB0ciB0byBhIGJsb2NrIG51bWJlcgotICovCi1zdGF0aWMgaW5saW5lIHhmc19kaXIyX2RiX3QKLXhmc19kaXIyX2RhdGFwdHJfdG9fZGIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RhdGFwdHJfdCBkcCkKLXsKLQlyZXR1cm4geGZzX2RpcjJfYnl0ZV90b19kYihtcCwgeGZzX2RpcjJfZGF0YXB0cl90b19ieXRlKG1wLCBkcCkpOwotfQotCi0vKgotICogQ29udmVydCBieXRlIGluIHNwYWNlIHRvIG9mZnNldCBpbiBhIGJsb2NrCi0gKi8KLXN0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGF0YV9hb2ZmX3QKLXhmc19kaXIyX2J5dGVfdG9fb2ZmKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSkKLXsKLQlyZXR1cm4gKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoYnkpICYgXAotCQkoKDEgPDwgKChtcCktPm1fc2Iuc2JfYmxvY2tsb2cgKyAobXApLT5tX3NiLnNiX2RpcmJsa2xvZykpIC0gMSkpOwotfQotCi0vKgotICogQ29udmVydCBkYXRhcHRyIHRvIGEgYnl0ZSBvZmZzZXQgaW4gYSBibG9jawotICovCi1zdGF0aWMgaW5saW5lIHhmc19kaXIyX2RhdGFfYW9mZl90Ci14ZnNfZGlyMl9kYXRhcHRyX3RvX29mZihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKQotewotCXJldHVybiB4ZnNfZGlyMl9ieXRlX3RvX29mZihtcCwgeGZzX2RpcjJfZGF0YXB0cl90b19ieXRlKG1wLCBkcCkpOwotfQotCi0vKgotICogQ29udmVydCBibG9jayBhbmQgb2Zmc2V0IHRvIGJ5dGUgaW4gc3BhY2UKLSAqLwotc3RhdGljIGlubGluZSB4ZnNfZGlyMl9vZmZfdAoteGZzX2RpcjJfZGJfb2ZmX3RvX2J5dGUoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RiX3QgZGIsCi0JCQl4ZnNfZGlyMl9kYXRhX2FvZmZfdCBvKQotewotCXJldHVybiAoKHhmc19kaXIyX29mZl90KShkYikgPDwgXAotCQkoKG1wKS0+bV9zYi5zYl9ibG9ja2xvZyArIChtcCktPm1fc2Iuc2JfZGlyYmxrbG9nKSkgKyAobyk7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGJsb2NrIChEQikgdG8gYmxvY2sgKGRhYmxrKQotICovCi1zdGF0aWMgaW5saW5lIHhmc19kYWJsa190Ci14ZnNfZGlyMl9kYl90b19kYShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGJfdCBkYikKLXsKLQlyZXR1cm4gKHhmc19kYWJsa190KSgoZGIpIDw8IChtcCktPm1fc2Iuc2JfZGlyYmxrbG9nKTsKLX0KLQotLyoKLSAqIENvbnZlcnQgYnl0ZSBpbiBzcGFjZSB0byAoREEpIGJsb2NrCi0gKi8KLXN0YXRpYyBpbmxpbmUgeGZzX2RhYmxrX3QKLXhmc19kaXIyX2J5dGVfdG9fZGEoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KQotewotCXJldHVybiB4ZnNfZGlyMl9kYl90b19kYShtcCwgeGZzX2RpcjJfYnl0ZV90b19kYihtcCwgYnkpKTsKLX0KLQotLyoKLSAqIENvbnZlcnQgYmxvY2sgYW5kIG9mZnNldCB0byBkYXRhcHRyCi0gKi8KLXN0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGF0YXB0cl90Ci14ZnNfZGlyMl9kYl9vZmZfdG9fZGF0YXB0cihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGJfdCBkYiwKLQkJCSAgIHhmc19kaXIyX2RhdGFfYW9mZl90IG8pCi17Ci0JcmV0dXJuIHhmc19kaXIyX2J5dGVfdG9fZGF0YXB0cihtcCwgeGZzX2RpcjJfZGJfb2ZmX3RvX2J5dGUobXAsIGRiLCBvKSk7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGJsb2NrIChkYWJsaykgdG8gYmxvY2sgKERCKQotICovCi1zdGF0aWMgaW5saW5lIHhmc19kaXIyX2RiX3QKLXhmc19kaXIyX2RhX3RvX2RiKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFibGtfdCBkYSkKLXsKLQlyZXR1cm4gKHhmc19kaXIyX2RiX3QpKChkYSkgPj4gKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpOwotfQotCi0vKgotICogQ29udmVydCBibG9jayAoZGFibGspIHRvIGJ5dGUgb2Zmc2V0IGluIHNwYWNlCi0gKi8KLXN0YXRpYyBpbmxpbmUgeGZzX2RpcjJfb2ZmX3QKLXhmc19kaXIyX2RhX3RvX2J5dGUoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kYWJsa190IGRhKQotewotCXJldHVybiB4ZnNfZGlyMl9kYl9vZmZfdG9fYnl0ZShtcCwgeGZzX2RpcjJfZGFfdG9fZGIobXAsIGRhKSwgMCk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0gKi8KLWV4dGVybiBpbnQgeGZzX2RpcjJfYmxvY2tfdG9fbGVhZihzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCi0JCQkJICBzdHJ1Y3QgeGZzX2RhYnVmICpkYnApOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmX2FkZG5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLWV4dGVybiB2b2lkIHhmc19kaXIyX2xlYWZfY29tcGFjdChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCi0JCQkJICBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7Ci1leHRlcm4gdm9pZCB4ZnNfZGlyMl9sZWFmX2NvbXBhY3RfeDEoc3RydWN0IHhmc19kYWJ1ZiAqYnAsIGludCAqaW5kZXhwLAotCQkJCSAgICAgaW50ICpsb3dzdGFsZXAsIGludCAqaGlnaHN0YWxlcCwKLQkJCQkgICAgIGludCAqbG93bG9ncCwgaW50ICpoaWdobG9ncCk7Ci1leHRlcm4gaW50IHhmc19kaXIyX2xlYWZfZ2V0ZGVudHMoc3RydWN0IHhmc19pbm9kZSAqZHAsIHZvaWQgKmRpcmVudCwKLQkJCQkgIHNpemVfdCBidWZzaXplLCB4ZnNfb2ZmX3QgKm9mZnNldCwKLQkJCQkgIGZpbGxkaXJfdCBmaWxsZGlyKTsKLWV4dGVybiBpbnQgeGZzX2RpcjJfbGVhZl9pbml0KHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2RpcjJfZGJfdCBibm8sCi0JCQkgICAgICBzdHJ1Y3QgeGZzX2RhYnVmICoqYnBwLCBpbnQgbWFnaWMpOwotZXh0ZXJuIHZvaWQgeGZzX2RpcjJfbGVhZl9sb2dfZW50cyhzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCi0JCQkJICAgaW50IGZpcnN0LCBpbnQgbGFzdCk7Ci1leHRlcm4gdm9pZCB4ZnNfZGlyMl9sZWFmX2xvZ19oZWFkZXIoc3RydWN0IHhmc190cmFucyAqdHAsCi0JCQkJICAgICBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7Ci1leHRlcm4gaW50IHhmc19kaXIyX2xlYWZfbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci1leHRlcm4gaW50IHhmc19kaXIyX2xlYWZfcmVtb3ZlbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmX3JlcGxhY2Uoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLWV4dGVybiBpbnQgeGZzX2RpcjJfbGVhZl9zZWFyY2hfaGFzaChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCi0JCQkJICAgICBzdHJ1Y3QgeGZzX2RhYnVmICpsYnApOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmX3RyaW1fZGF0YShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCi0JCQkJICAgc3RydWN0IHhmc19kYWJ1ZiAqbGJwLCB4ZnNfZGlyMl9kYl90IGRiKTsKLWV4dGVybiBpbnQgeGZzX2RpcjJfbm9kZV90b19sZWFmKHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlKTsKLQotI2VuZGlmCS8qIF9fWEZTX0RJUjJfTEVBRl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmMgYi9mcy94ZnMveGZzX2RpcjJfbm9kZS5jCmluZGV4IGEwYWFiN2QuLjAxNzlhNDEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmMKKysrIGIvZnMveGZzL3hmc19kaXIyX25vZGUuYwpAQCAtMjMsMTggKzIzLDE0IEBACiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfZGF0YS5oIgotI2luY2x1ZGUgInhmc19kaXIyX2xlYWYuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9ibG9jay5oIgotI2luY2x1ZGUgInhmc19kaXIyX25vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9mb3JtYXQuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9wcml2LmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX3RyYWNlLmgiCiAKQEAgLTczLDcgKzY5LDcgQEAKIAl4ZnNfZGlyMl9mcmVlX3QJCSpmcmVlOwkJLyogZnJlZXNwYWNlIHN0cnVjdHVyZSAqLwogCiAJZnJlZSA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTMyX3RvX2NwdShmcmVlLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCUFTU0VSVChmcmVlLT5oZHIubWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfRlJFRV9NQUdJQykpOwogCXhmc19kYV9sb2dfYnVmKHRwLCBicCwKIAkJKHVpbnQpKChjaGFyICopJmZyZWUtPmJlc3RzW2ZpcnN0XSAtIChjaGFyICopZnJlZSksCiAJCSh1aW50KSgoY2hhciAqKSZmcmVlLT5iZXN0c1tsYXN0XSAtIChjaGFyICopZnJlZSArCkBAIC05MSw3ICs4Nyw3IEBACiAJeGZzX2RpcjJfZnJlZV90CQkqZnJlZTsJCS8qIGZyZWVzcGFjZSBzdHJ1Y3R1cmUgKi8KIAogCWZyZWUgPSBicC0+ZGF0YTsKLQlBU1NFUlQoYmUzMl90b19jcHUoZnJlZS0+aGRyLm1hZ2ljKSA9PSBYRlNfRElSMl9GUkVFX01BR0lDKTsKKwlBU1NFUlQoZnJlZS0+aGRyLm1hZ2ljID09IGNwdV90b19iZTMyKFhGU19ESVIyX0ZSRUVfTUFHSUMpKTsKIAl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKSZmcmVlLT5oZHIgLSAoY2hhciAqKWZyZWUpLAogCQkodWludCkoc2l6ZW9mKHhmc19kaXIyX2ZyZWVfaGRyX3QpIC0gMSkpOwogfQpAQCAtMjQ0LDg5ICsyNDAsMTMgQEAKIAkJbGZsb2dsb3cgPSBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpOwogCQlsZmxvZ2hpZ2ggPSAtMTsKIAl9Ci0JLyoKLQkgKiBObyBzdGFsZSBlbnRyaWVzLCBqdXN0IGluc2VydCBhIHNwYWNlIGZvciB0aGUgbmV3IGVudHJ5LgotCSAqLwotCWlmICghbGVhZi0+aGRyLnN0YWxlKSB7Ci0JCWxlcCA9ICZsZWFmLT5lbnRzW2luZGV4XTsKLQkJaWYgKGluZGV4IDwgYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSkKLQkJCW1lbW1vdmUobGVwICsgMSwgbGVwLAotCQkJCShiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpIC0gaW5kZXgpICogc2l6ZW9mKCpsZXApKTsKLQkJbGZsb2dsb3cgPSBpbmRleDsKLQkJbGZsb2doaWdoID0gYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KTsKLQkJYmUxNl9hZGRfY3B1KCZsZWFmLT5oZHIuY291bnQsIDEpOwotCX0KLQkvKgotCSAqIFRoZXJlIGFyZSBzdGFsZSBlbnRyaWVzLiAgV2UnbGwgdXNlIG9uZSBmb3IgdGhlIG5ldyBlbnRyeS4KLQkgKi8KLQllbHNlIHsKLQkJLyoKLQkJICogSWYgd2UgZGlkbid0IGRvIGEgY29tcGFjdCB0aGVuIHdlIG5lZWQgdG8gZmlndXJlIG91dAotCQkgKiB3aGljaCBzdGFsZSBlbnRyeSB3aWxsIGJlIHVzZWQuCi0JCSAqLwotCQlpZiAoY29tcGFjdCA9PSAwKSB7Ci0JCQkvKgotCQkJICogRmluZCBmaXJzdCBzdGFsZSBlbnRyeSBiZWZvcmUgb3VyIGluc2VydGlvbiBwb2ludC4KLQkJCSAqLwotCQkJZm9yIChsb3dzdGFsZSA9IGluZGV4IC0gMTsKLQkJCSAgICAgbG93c3RhbGUgPj0gMCAmJgotCQkJCWJlMzJfdG9fY3B1KGxlYWYtPmVudHNbbG93c3RhbGVdLmFkZHJlc3MpICE9Ci0JCQkJWEZTX0RJUjJfTlVMTF9EQVRBUFRSOwotCQkJICAgICBsb3dzdGFsZS0tKQotCQkJCWNvbnRpbnVlOwotCQkJLyoKLQkJCSAqIEZpbmQgbmV4dCBzdGFsZSBlbnRyeSBhZnRlciBpbnNlcnRpb24gcG9pbnQuCi0JCQkgKiBTdG9wIGxvb2tpbmcgaWYgdGhlIGFuc3dlciB3b3VsZCBiZSB3b3JzZSB0aGFuCi0JCQkgKiBsb3dzdGFsZSBhbHJlYWR5IGZvdW5kLgotCQkJICovCi0JCQlmb3IgKGhpZ2hzdGFsZSA9IGluZGV4OwotCQkJICAgICBoaWdoc3RhbGUgPCBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpICYmCi0JCQkJYmUzMl90b19jcHUobGVhZi0+ZW50c1toaWdoc3RhbGVdLmFkZHJlc3MpICE9Ci0JCQkJWEZTX0RJUjJfTlVMTF9EQVRBUFRSICYmCi0JCQkJKGxvd3N0YWxlIDwgMCB8fAotCQkJCSBpbmRleCAtIGxvd3N0YWxlIC0gMSA+PSBoaWdoc3RhbGUgLSBpbmRleCk7Ci0JCQkgICAgIGhpZ2hzdGFsZSsrKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qCi0JCSAqIFVzaW5nIHRoZSBsb3cgc3RhbGUgZW50cnkuCi0JCSAqIFNoaWZ0IGVudHJpZXMgdXAgdG93YXJkIHRoZSBzdGFsZSBzbG90LgotCQkgKi8KLQkJaWYgKGxvd3N0YWxlID49IDAgJiYKLQkJICAgIChoaWdoc3RhbGUgPT0gYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSB8fAotCQkgICAgIGluZGV4IC0gbG93c3RhbGUgLSAxIDwgaGlnaHN0YWxlIC0gaW5kZXgpKSB7Ci0JCQlBU1NFUlQoYmUzMl90b19jcHUobGVhZi0+ZW50c1tsb3dzdGFsZV0uYWRkcmVzcykgPT0KLQkJCSAgICAgICBYRlNfRElSMl9OVUxMX0RBVEFQVFIpOwotCQkJQVNTRVJUKGluZGV4IC0gbG93c3RhbGUgLSAxID49IDApOwotCQkJaWYgKGluZGV4IC0gbG93c3RhbGUgLSAxID4gMCkKLQkJCQltZW1tb3ZlKCZsZWFmLT5lbnRzW2xvd3N0YWxlXSwKLQkJCQkJJmxlYWYtPmVudHNbbG93c3RhbGUgKyAxXSwKLQkJCQkJKGluZGV4IC0gbG93c3RhbGUgLSAxKSAqIHNpemVvZigqbGVwKSk7Ci0JCQlsZXAgPSAmbGVhZi0+ZW50c1tpbmRleCAtIDFdOwotCQkJbGZsb2dsb3cgPSBNSU4obG93c3RhbGUsIGxmbG9nbG93KTsKLQkJCWxmbG9naGlnaCA9IE1BWChpbmRleCAtIDEsIGxmbG9naGlnaCk7Ci0JCX0KLQkJLyoKLQkJICogVXNpbmcgdGhlIGhpZ2ggc3RhbGUgZW50cnkuCi0JCSAqIFNoaWZ0IGVudHJpZXMgZG93biB0b3dhcmQgdGhlIHN0YWxlIHNsb3QuCi0JCSAqLwotCQllbHNlIHsKLQkJCUFTU0VSVChiZTMyX3RvX2NwdShsZWFmLT5lbnRzW2hpZ2hzdGFsZV0uYWRkcmVzcykgPT0KLQkJCSAgICAgICBYRlNfRElSMl9OVUxMX0RBVEFQVFIpOwotCQkJQVNTRVJUKGhpZ2hzdGFsZSAtIGluZGV4ID49IDApOwotCQkJaWYgKGhpZ2hzdGFsZSAtIGluZGV4ID4gMCkKLQkJCQltZW1tb3ZlKCZsZWFmLT5lbnRzW2luZGV4ICsgMV0sCi0JCQkJCSZsZWFmLT5lbnRzW2luZGV4XSwKLQkJCQkJKGhpZ2hzdGFsZSAtIGluZGV4KSAqIHNpemVvZigqbGVwKSk7Ci0JCQlsZXAgPSAmbGVhZi0+ZW50c1tpbmRleF07Ci0JCQlsZmxvZ2xvdyA9IE1JTihpbmRleCwgbGZsb2dsb3cpOwotCQkJbGZsb2doaWdoID0gTUFYKGhpZ2hzdGFsZSwgbGZsb2doaWdoKTsKLQkJfQotCQliZTE2X2FkZF9jcHUoJmxlYWYtPmhkci5zdGFsZSwgLTEpOwotCX0KKwogCS8qCiAJICogSW5zZXJ0IHRoZSBuZXcgZW50cnksIGxvZyBldmVyeXRoaW5nLgogCSAqLworCWxlcCA9IHhmc19kaXIyX2xlYWZfZmluZF9lbnRyeShsZWFmLCBpbmRleCwgY29tcGFjdCwgbG93c3RhbGUsCisJCQkJICAgICAgIGhpZ2hzdGFsZSwgJmxmbG9nbG93LCAmbGZsb2doaWdoKTsKKwogCWxlcC0+aGFzaHZhbCA9IGNwdV90b19iZTMyKGFyZ3MtPmhhc2h2YWwpOwogCWxlcC0+YWRkcmVzcyA9IGNwdV90b19iZTMyKHhmc19kaXIyX2RiX29mZl90b19kYXRhcHRyKG1wLAogCQkJCWFyZ3MtPmJsa25vLCBhcmdzLT5pbmRleCkpOwpAQCAtMzUyLDE0ICsyNzIsMTQgQEAKIAogCWxlYWYgPSBicC0+ZGF0YTsKIAltcCA9IGRwLT5pX21vdW50OwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCUFTU0VSVChsZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfRElSMl9MRUFGTl9NQUdJQykpOwogCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpIDw9IHhmc19kaXIyX21heF9sZWFmX2VudHMobXApKTsKIAlmb3IgKGkgPSBzdGFsZSA9IDA7IGkgPCBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpOyBpKyspIHsKIAkJaWYgKGkgKyAxIDwgYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSkgewogCQkJQVNTRVJUKGJlMzJfdG9fY3B1KGxlYWYtPmVudHNbaV0uaGFzaHZhbCkgPD0KIAkJCSAgICAgICBiZTMyX3RvX2NwdShsZWFmLT5lbnRzW2kgKyAxXS5oYXNodmFsKSk7CiAJCX0KLQkJaWYgKGJlMzJfdG9fY3B1KGxlYWYtPmVudHNbaV0uYWRkcmVzcykgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKQorCQlpZiAobGVhZi0+ZW50c1tpXS5hZGRyZXNzID09IGNwdV90b19iZTMyKFhGU19ESVIyX05VTExfREFUQVBUUikpCiAJCQlzdGFsZSsrOwogCX0KIAlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLnN0YWxlKSA9PSBzdGFsZSk7CkBAIC0zNzgsNyArMjk4LDcgQEAKIAl4ZnNfZGlyMl9sZWFmX3QJKmxlYWY7CQkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KIAogCWxlYWYgPSBicC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwlBU1NFUlQobGVhZi0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RJUjJfTEVBRk5fTUFHSUMpKTsKIAlpZiAoY291bnQpCiAJCSpjb3VudCA9IGJlMTZfdG9fY3B1KGxlYWYtPmhkci5jb3VudCk7CiAJaWYgKCFsZWFmLT5oZHIuY291bnQpCkBAIC00MTcsNyArMzM3LDcgQEAKIAl0cCA9IGFyZ3MtPnRyYW5zOwogCW1wID0gZHAtPmlfbW91bnQ7CiAJbGVhZiA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCUFTU0VSVChsZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfRElSMl9MRUFGTl9NQUdJQykpOwogI2lmZGVmIF9fS0VSTkVMX18KIAlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSA+IDApOwogI2VuZGlmCkBAIC00MzQsNyArMzU0LDcgQEAKIAkJY3VyYnAgPSBzdGF0ZS0+ZXh0cmFibGsuYnA7CiAJCWN1cmZkYiA9IHN0YXRlLT5leHRyYWJsay5ibGtubzsKIAkJZnJlZSA9IGN1cmJwLT5kYXRhOwotCQlBU1NFUlQoYmUzMl90b19jcHUoZnJlZS0+aGRyLm1hZ2ljKSA9PSBYRlNfRElSMl9GUkVFX01BR0lDKTsKKwkJQVNTRVJUKGZyZWUtPmhkci5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9GUkVFX01BR0lDKSk7CiAJfQogCWxlbmd0aCA9IHhmc19kaXIyX2RhdGFfZW50c2l6ZShhcmdzLT5uYW1lbGVuKTsKIAkvKgpAQCAtNDg4LDcgKzQwOCw3IEBACiAJCQkJQVNTRVJUKGJlMzJfdG9fY3B1KGZyZWUtPmhkci5tYWdpYykgPT0KIAkJCQkJWEZTX0RJUjJfRlJFRV9NQUdJQyk7CiAJCQkJQVNTRVJUKChiZTMyX3RvX2NwdShmcmVlLT5oZHIuZmlyc3RkYikgJQotCQkJCQlYRlNfRElSMl9NQVhfRlJFRV9CRVNUUyhtcCkpID09IDApOworCQkJCQl4ZnNfZGlyMl9mcmVlX21heF9iZXN0cyhtcCkpID09IDApOwogCQkJCUFTU0VSVChiZTMyX3RvX2NwdShmcmVlLT5oZHIuZmlyc3RkYikgPD0gY3VyZGIpOwogCQkJCUFTU0VSVChjdXJkYiA8IGJlMzJfdG9fY3B1KGZyZWUtPmhkci5maXJzdGRiKSArCiAJCQkJCWJlMzJfdG9fY3B1KGZyZWUtPmhkci5udmFsaWQpKTsKQEAgLTUwMCw3ICs0MjAsOCBAQAogCQkJLyoKIAkJCSAqIElmIGl0IGhhcyByb29tLCByZXR1cm4gaXQuCiAJCQkgKi8KLQkJCWlmICh1bmxpa2VseShiZTE2X3RvX2NwdShmcmVlLT5iZXN0c1tmaV0pID09IE5VTExEQVRBT0ZGKSkgeworCQkJaWYgKHVubGlrZWx5KGZyZWUtPmJlc3RzW2ZpXSA9PQorCQkJICAgIGNwdV90b19iZTE2KE5VTExEQVRBT0ZGKSkpIHsKIAkJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfZGlyMl9sZWFmbl9sb29rdXBfaW50IiwKIAkJCQkJCQlYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CiAJCQkJaWYgKGN1cmZkYiAhPSBuZXdmZGIpCkBAIC01NjEsNyArNDgyLDcgQEAKIAl0cCA9IGFyZ3MtPnRyYW5zOwogCW1wID0gZHAtPmlfbW91bnQ7CiAJbGVhZiA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTE2X3RvX2NwdShsZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCUFTU0VSVChsZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfRElSMl9MRUFGTl9NQUdJQykpOwogI2lmZGVmIF9fS0VSTkVMX18KIAlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KSA+IDApOwogI2VuZGlmCkBAIC03NDIsNyArNjYzLDggQEAKIAkJaW50CWk7CQkJLyogdGVtcCBsZWFmIGluZGV4ICovCiAKIAkJZm9yIChpID0gc3RhcnRfcywgc3RhbGUgPSAwOyBpIDwgc3RhcnRfcyArIGNvdW50OyBpKyspIHsKLQkJCWlmIChiZTMyX3RvX2NwdShsZWFmX3MtPmVudHNbaV0uYWRkcmVzcykgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKQorCQkJaWYgKGxlYWZfcy0+ZW50c1tpXS5hZGRyZXNzID09CisJCQkgICAgY3B1X3RvX2JlMzIoWEZTX0RJUjJfTlVMTF9EQVRBUFRSKSkKIAkJCQlzdGFsZSsrOwogCQl9CiAJfSBlbHNlCkBAIC03ODksOCArNzExLDggQEAKIAogCWxlYWYxID0gbGVhZjFfYnAtPmRhdGE7CiAJbGVhZjIgPSBsZWFmMl9icC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobGVhZjEtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KGxlYWYyLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCUFTU0VSVChsZWFmMS0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RJUjJfTEVBRk5fTUFHSUMpKTsKKwlBU1NFUlQobGVhZjItPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19ESVIyX0xFQUZOX01BR0lDKSk7CiAJaWYgKGJlMTZfdG9fY3B1KGxlYWYxLT5oZHIuY291bnQpID4gMCAmJgogCSAgICBiZTE2X3RvX2NwdShsZWFmMi0+aGRyLmNvdW50KSA+IDAgJiYKIAkgICAgKGJlMzJfdG9fY3B1KGxlYWYyLT5lbnRzWzBdLmhhc2h2YWwpIDwgYmUzMl90b19jcHUobGVhZjEtPmVudHNbMF0uaGFzaHZhbCkgfHwKQEAgLTkxOCw3ICs4NDAsNyBAQAogCXhmc19kYV9zdGF0ZV9ibGtfdAkqZGJsaywJCS8qIGRhdGEgYmxvY2sgKi8KIAlpbnQJCQkqcnZhbCkJCS8qIHJlc3VsdGluZyBibG9jayBuZWVkcyBqb2luICovCiB7Ci0JeGZzX2RpcjJfZGF0YV90CQkqZGF0YTsJCS8qIGRhdGEgYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyOwkJLyogZGF0YSBibG9jayBoZWFkZXIgKi8KIAl4ZnNfZGlyMl9kYl90CQlkYjsJCS8qIGRhdGEgYmxvY2sgbnVtYmVyICovCiAJeGZzX2RhYnVmX3QJCSpkYnA7CQkvKiBkYXRhIGJsb2NrIGJ1ZmZlciAqLwogCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBibG9jayBlbnRyeSAqLwpAQCAtOTM4LDcgKzg2MCw3IEBACiAJdHAgPSBhcmdzLT50cmFuczsKIAltcCA9IGRwLT5pX21vdW50OwogCWxlYWYgPSBicC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwlBU1NFUlQobGVhZi0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RJUjJfTEVBRk5fTUFHSUMpKTsKIAkvKgogCSAqIFBvaW50IHRvIHRoZSBlbnRyeSB3ZSdyZSByZW1vdmluZy4KIAkgKi8KQEAgLTk2Myw5ICs4ODUsOSBAQAogCSAqIGluIHRoZSBkYXRhIGJsb2NrIGluIGNhc2UgaXQgY2hhbmdlcy4KIAkgKi8KIAlkYnAgPSBkYmxrLT5icDsKLQlkYXRhID0gZGJwLT5kYXRhOwotCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikoKGNoYXIgKilkYXRhICsgb2ZmKTsKLQlsb25nZXN0ID0gYmUxNl90b19jcHUoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCk7CisJaGRyID0gZGJwLT5kYXRhOworCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikoKGNoYXIgKiloZHIgKyBvZmYpOworCWxvbmdlc3QgPSBiZTE2X3RvX2NwdShoZHItPmJlc3RmcmVlWzBdLmxlbmd0aCk7CiAJbmVlZGxvZyA9IG5lZWRzY2FuID0gMDsKIAl4ZnNfZGlyMl9kYXRhX21ha2VfZnJlZSh0cCwgZGJwLCBvZmYsCiAJCXhmc19kaXIyX2RhdGFfZW50c2l6ZShkZXAtPm5hbWVsZW4pLCAmbmVlZGxvZywgJm5lZWRzY2FuKTsKQEAgLTk3NCw3ICs4OTYsNyBAQAogCSAqIExvZyB0aGUgZGF0YSBibG9jayBoZWFkZXIgaWYgbmVlZGVkLgogCSAqLwogCWlmIChuZWVkc2NhbikKLQkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgZGF0YSwgJm5lZWRsb2cpOworCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCBoZHIsICZuZWVkbG9nKTsKIAlpZiAobmVlZGxvZykKIAkJeGZzX2RpcjJfZGF0YV9sb2dfaGVhZGVyKHRwLCBkYnApOwogCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGRicCk7CkBAIC05ODIsNyArOTA0LDcgQEAKIAkgKiBJZiB0aGUgbG9uZ2VzdCBkYXRhIGJsb2NrIGZyZWVzcGFjZSBjaGFuZ2VzLCBuZWVkIHRvIHVwZGF0ZQogCSAqIHRoZSBjb3JyZXNwb25kaW5nIGZyZWVibG9jayBlbnRyeS4KIAkgKi8KLQlpZiAobG9uZ2VzdCA8IGJlMTZfdG9fY3B1KGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgpKSB7CisJaWYgKGxvbmdlc3QgPCBiZTE2X3RvX2NwdShoZHItPmJlc3RmcmVlWzBdLmxlbmd0aCkpIHsKIAkJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwogCQl4ZnNfZGFidWZfdAkqZmJwOwkJLyogZnJlZWJsb2NrIGJ1ZmZlciAqLwogCQl4ZnNfZGlyMl9kYl90CWZkYjsJCS8qIGZyZWVibG9jayBibG9jayBudW1iZXIgKi8KQEAgLTEwMDAsMjcgKzkyMiwyNyBAQAogCQkJcmV0dXJuIGVycm9yOwogCQl9CiAJCWZyZWUgPSBmYnAtPmRhdGE7Ci0JCUFTU0VSVChiZTMyX3RvX2NwdShmcmVlLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCQlBU1NFUlQoZnJlZS0+aGRyLm1hZ2ljID09IGNwdV90b19iZTMyKFhGU19ESVIyX0ZSRUVfTUFHSUMpKTsKIAkJQVNTRVJUKGJlMzJfdG9fY3B1KGZyZWUtPmhkci5maXJzdGRiKSA9PQotCQkgICAgICAgWEZTX0RJUjJfTUFYX0ZSRUVfQkVTVFMobXApICoKKwkJICAgICAgIHhmc19kaXIyX2ZyZWVfbWF4X2Jlc3RzKG1wKSAqCiAJCSAgICAgICAoZmRiIC0gWEZTX0RJUjJfRlJFRV9GSVJTVERCKG1wKSkpOwogCQkvKgogCQkgKiBDYWxjdWxhdGUgd2hpY2ggZW50cnkgd2UgbmVlZCB0byBmaXguCiAJCSAqLwogCQlmaW5kZXggPSB4ZnNfZGlyMl9kYl90b19mZGluZGV4KG1wLCBkYik7Ci0JCWxvbmdlc3QgPSBiZTE2X3RvX2NwdShkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoKTsKKwkJbG9uZ2VzdCA9IGJlMTZfdG9fY3B1KGhkci0+YmVzdGZyZWVbMF0ubGVuZ3RoKTsKIAkJLyoKIAkJICogSWYgdGhlIGRhdGEgYmxvY2sgaXMgbm93IGVtcHR5IHdlIGNhbiBnZXQgcmlkIG9mIGl0CiAJCSAqICh1c3VhbGx5KS4KIAkJICovCi0JCWlmIChsb25nZXN0ID09IG1wLT5tX2RpcmJsa3NpemUgLSAodWludClzaXplb2YoZGF0YS0+aGRyKSkgeworCQlpZiAobG9uZ2VzdCA9PSBtcC0+bV9kaXJibGtzaXplIC0gKHVpbnQpc2l6ZW9mKCpoZHIpKSB7CiAJCQkvKgogCQkJICogVHJ5IHRvIHB1bmNoIG91dCB0aGUgZGF0YSBibG9jay4KIAkJCSAqLwogCQkJZXJyb3IgPSB4ZnNfZGlyMl9zaHJpbmtfaW5vZGUoYXJncywgZGIsIGRicCk7CiAJCQlpZiAoZXJyb3IgPT0gMCkgewogCQkJCWRibGstPmJwID0gTlVMTDsKLQkJCQlkYXRhID0gTlVMTDsKKwkJCQloZHIgPSBOVUxMOwogCQkJfQogCQkJLyoKIAkJCSAqIFdlIGNhbiBnZXQgRU5PU1BDIGlmIHRoZXJlJ3Mgbm8gc3BhY2UgcmVzZXJ2YXRpb24uCkBAIC0xMDM2LDcgKzk1OCw3IEBACiAJCSAqIElmIHdlIGdvdCByaWQgb2YgdGhlIGRhdGEgYmxvY2ssIHdlIGNhbiBlbGltaW5hdGUgdGhhdCBlbnRyeQogCQkgKiBpbiB0aGUgZnJlZSBibG9jay4KIAkJICovCi0JCWlmIChkYXRhID09IE5VTEwpIHsKKwkJaWYgKGhkciA9PSBOVUxMKSB7CiAJCQkvKgogCQkJICogT25lIGxlc3MgdXNlZCBlbnRyeSBpbiB0aGUgZnJlZSB0YWJsZS4KIAkJCSAqLwpAQCAtMTA1Miw3ICs5NzQsOCBAQAogCQkJCWludAlpOwkJLyogZnJlZSBlbnRyeSBpbmRleCAqLwogCiAJCQkJZm9yIChpID0gZmluZGV4IC0gMTsKLQkJCQkgICAgIGkgPj0gMCAmJiBiZTE2X3RvX2NwdShmcmVlLT5iZXN0c1tpXSkgPT0gTlVMTERBVEFPRkY7CisJCQkJICAgICBpID49IDAgJiYKKwkJCQkgICAgIGZyZWUtPmJlc3RzW2ldID09IGNwdV90b19iZTE2KE5VTExEQVRBT0ZGKTsKIAkJCQkgICAgIGktLSkKIAkJCQkJY29udGludWU7CiAJCQkJZnJlZS0+aGRyLm52YWxpZCA9IGNwdV90b19iZTMyKGkgKyAxKTsKQEAgLTEyMDksNyArMTEzMiw3IEBACiAJICovCiAJYmxrID0gJnN0YXRlLT5wYXRoLmJsa1tzdGF0ZS0+cGF0aC5hY3RpdmUgLSAxXTsKIAlpbmZvID0gYmxrLT5icC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUoaW5mby0+bWFnaWMpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwlBU1NFUlQoaW5mby0+bWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RJUjJfTEVBRk5fTUFHSUMpKTsKIAlsZWFmID0gKHhmc19kaXIyX2xlYWZfdCAqKWluZm87CiAJY291bnQgPSBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpIC0gYmUxNl90b19jcHUobGVhZi0+aGRyLnN0YWxlKTsKIAlieXRlcyA9ICh1aW50KXNpemVvZihsZWFmLT5oZHIpICsgY291bnQgKiAodWludClzaXplb2YobGVhZi0+ZW50c1swXSk7CkBAIC0xMjY4LDcgKzExOTEsNyBAQAogCQljb3VudCA9IGJlMTZfdG9fY3B1KGxlYWYtPmhkci5jb3VudCkgLSBiZTE2X3RvX2NwdShsZWFmLT5oZHIuc3RhbGUpOwogCQlieXRlcyA9IHN0YXRlLT5ibG9ja3NpemUgLSAoc3RhdGUtPmJsb2Nrc2l6ZSA+PiAyKTsKIAkJbGVhZiA9IGJwLT5kYXRhOwotCQlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwkJQVNTRVJUKGxlYWYtPmhkci5pbmZvLm1hZ2ljID09IGNwdV90b19iZTE2KFhGU19ESVIyX0xFQUZOX01BR0lDKSk7CiAJCWNvdW50ICs9IGJlMTZfdG9fY3B1KGxlYWYtPmhkci5jb3VudCkgLSBiZTE2X3RvX2NwdShsZWFmLT5oZHIuc3RhbGUpOwogCQlieXRlcyAtPSBjb3VudCAqICh1aW50KXNpemVvZihsZWFmLT5lbnRzWzBdKTsKIAkJLyoKQEAgLTEzMjcsOCArMTI1MCw4IEBACiAJQVNTRVJUKHNhdmVfYmxrLT5tYWdpYyA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CiAJZHJvcF9sZWFmID0gZHJvcF9ibGstPmJwLT5kYXRhOwogCXNhdmVfbGVhZiA9IHNhdmVfYmxrLT5icC0+ZGF0YTsKLQlBU1NFUlQoYmUxNl90b19jcHUoZHJvcF9sZWFmLT5oZHIuaW5mby5tYWdpYykgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOwotCUFTU0VSVChiZTE2X3RvX2NwdShzYXZlX2xlYWYtPmhkci5pbmZvLm1hZ2ljKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJQVNTRVJUKGRyb3BfbGVhZi0+aGRyLmluZm8ubWFnaWMgPT0gY3B1X3RvX2JlMTYoWEZTX0RJUjJfTEVBRk5fTUFHSUMpKTsKKwlBU1NFUlQoc2F2ZV9sZWFmLT5oZHIuaW5mby5tYWdpYyA9PSBjcHVfdG9fYmUxNihYRlNfRElSMl9MRUFGTl9NQUdJQykpOwogCS8qCiAJICogSWYgdGhlcmUgYXJlIGFueSBzdGFsZSBsZWFmIGVudHJpZXMsIHRha2UgdGhpcyBvcHBvcnR1bml0eQogCSAqIHRvIHB1cmdlIHRoZW0uCkBAIC0xNDMyLDcgKzEzNTUsNyBAQAogCXhmc19kYV9hcmdzX3QJCSphcmdzLAkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLwogCXhmc19kYV9zdGF0ZV9ibGtfdAkqZmJsaykJCS8qIG9wdGlvbmFsIGZyZWVzcGFjZSBibG9jayAqLwogewotCXhmc19kaXIyX2RhdGFfdAkJKmRhdGE7CQkvKiBkYXRhIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2RhdGFfaGRyX3QJKmhkcjsJCS8qIGRhdGEgYmxvY2sgaGVhZGVyICovCiAJeGZzX2RpcjJfZGJfdAkJZGJubzsJCS8qIGRhdGEgYmxvY2sgbnVtYmVyICovCiAJeGZzX2RhYnVmX3QJCSpkYnA7CQkvKiBkYXRhIGJsb2NrIGJ1ZmZlciAqLwogCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBlbnRyeSBwb2ludGVyICovCkBAIC0xNDY5LDcgKzEzOTIsNyBAQAogCQkgKi8KIAkJaWZibm8gPSBmYmxrLT5ibGtubzsKIAkJZnJlZSA9IGZicC0+ZGF0YTsKLQkJQVNTRVJUKGJlMzJfdG9fY3B1KGZyZWUtPmhkci5tYWdpYykgPT0gWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJCUFTU0VSVChmcmVlLT5oZHIubWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfRlJFRV9NQUdJQykpOwogCQlmaW5kZXggPSBmYmxrLT5pbmRleDsKIAkJLyoKIAkJICogVGhpcyBtZWFucyB0aGUgZnJlZSBlbnRyeSBzaG93ZWQgdGhhdCB0aGUgZGF0YSBibG9jayBoYWQKQEAgLTE1NTMsNyArMTQ3Niw3IEBACiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlmcmVlID0gZmJwLT5kYXRhOwotCQkJQVNTRVJUKGJlMzJfdG9fY3B1KGZyZWUtPmhkci5tYWdpYykgPT0gWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJCQlBU1NFUlQoZnJlZS0+aGRyLm1hZ2ljID09IGNwdV90b19iZTMyKFhGU19ESVIyX0ZSRUVfTUFHSUMpKTsKIAkJCWZpbmRleCA9IDA7CiAJCX0KIAkJLyoKQEAgLTE2NDEsNyArMTU2NCw3IEBACiAKIAkJCWlmICh1bmxpa2VseSh4ZnNfZGlyMl9kYl90b19mZGIobXAsIGRibm8pICE9IGZibm8pKSB7CiAJCQkJeGZzX2FsZXJ0KG1wLAotCQkJIiVzOiBkaXIgaW5vICIgIiVsbHUgbmVlZGVkIGZyZWVzcCBibG9jayAlbGxkIGZvclxuIgorCQkJIiVzOiBkaXIgaW5vICVsbHUgbmVlZGVkIGZyZWVzcCBibG9jayAlbGxkIGZvclxuIgogCQkJIiAgZGF0YSBibG9jayAlbGxkLCBnb3QgJWxsZCBpZmJubyAlbGx1IGxhc3RmYm5vICVkIiwKIAkJCQkJX19mdW5jX18sICh1bnNpZ25lZCBsb25nIGxvbmcpZHAtPmlfaW5vLAogCQkJCQkobG9uZyBsb25nKXhmc19kaXIyX2RiX3RvX2ZkYihtcCwgZGJubyksCkBAIC0xNjgwLDEyICsxNjAzLDEyIEBACiAJCQlmcmVlLT5oZHIubWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfRElSMl9GUkVFX01BR0lDKTsKIAkJCWZyZWUtPmhkci5maXJzdGRiID0gY3B1X3RvX2JlMzIoCiAJCQkJKGZibm8gLSBYRlNfRElSMl9GUkVFX0ZJUlNUREIobXApKSAqCi0JCQkJWEZTX0RJUjJfTUFYX0ZSRUVfQkVTVFMobXApKTsKKwkJCQl4ZnNfZGlyMl9mcmVlX21heF9iZXN0cyhtcCkpOwogCQkJZnJlZS0+aGRyLm52YWxpZCA9IDA7CiAJCQlmcmVlLT5oZHIubnVzZWQgPSAwOwogCQl9IGVsc2UgewogCQkJZnJlZSA9IGZicC0+ZGF0YTsKLQkJCUFTU0VSVChiZTMyX3RvX2NwdShmcmVlLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCQkJQVNTRVJUKGZyZWUtPmhkci5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9GUkVFX01BR0lDKSk7CiAJCX0KIAogCQkvKgpAQCAtMTY5Nyw3ICsxNjIwLDcgQEAKIAkJICogZnJlZXNwYWNlIGJsb2NrLCBleHRlbmQgdGhhdCB0YWJsZS4KIAkJICovCiAJCWlmIChmaW5kZXggPj0gYmUzMl90b19jcHUoZnJlZS0+aGRyLm52YWxpZCkpIHsKLQkJCUFTU0VSVChmaW5kZXggPCBYRlNfRElSMl9NQVhfRlJFRV9CRVNUUyhtcCkpOworCQkJQVNTRVJUKGZpbmRleCA8IHhmc19kaXIyX2ZyZWVfbWF4X2Jlc3RzKG1wKSk7CiAJCQlmcmVlLT5oZHIubnZhbGlkID0gY3B1X3RvX2JlMzIoZmluZGV4ICsgMSk7CiAJCQkvKgogCQkJICogVGFnIG5ldyBlbnRyeSBzbyBudXNlZCB3aWxsIGdvIHVwLgpAQCAtMTcwOCw3ICsxNjMxLDcgQEAKIAkJICogSWYgdGhpcyBlbnRyeSB3YXMgZm9yIGFuIGVtcHR5IGRhdGEgYmxvY2sKIAkJICogKHRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0cnVlKSB0aGVuIHVwZGF0ZSB0aGUgaGVhZGVyLgogCQkgKi8KLQkJaWYgKGJlMTZfdG9fY3B1KGZyZWUtPmJlc3RzW2ZpbmRleF0pID09IE5VTExEQVRBT0ZGKSB7CisJCWlmIChmcmVlLT5iZXN0c1tmaW5kZXhdID09IGNwdV90b19iZTE2KE5VTExEQVRBT0ZGKSkgewogCQkJYmUzMl9hZGRfY3B1KCZmcmVlLT5oZHIubnVzZWQsIDEpOwogCQkJeGZzX2RpcjJfZnJlZV9sb2dfaGVhZGVyKHRwLCBmYnApOwogCQl9CkBAIC0xNzE3LDggKzE2NDAsOCBAQAogCQkgKiBXZSBoYXZlbid0IGFsbG9jYXRlZCB0aGUgZGF0YSBlbnRyeSB5ZXQgc28gdGhpcyB3aWxsCiAJCSAqIGNoYW5nZSBhZ2Fpbi4KIAkJICovCi0JCWRhdGEgPSBkYnAtPmRhdGE7Ci0JCWZyZWUtPmJlc3RzW2ZpbmRleF0gPSBkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoOworCQloZHIgPSBkYnAtPmRhdGE7CisJCWZyZWUtPmJlc3RzW2ZpbmRleF0gPSBoZHItPmJlc3RmcmVlWzBdLmxlbmd0aDsKIAkJbG9nZnJlZSA9IDE7CiAJfQogCS8qCkBAIC0xNzQzLDIxICsxNjY2LDIxIEBACiAJCQkJeGZzX2RhX2J1Zl9kb25lKGZicCk7CiAJCQlyZXR1cm4gZXJyb3I7CiAJCX0KLQkJZGF0YSA9IGRicC0+ZGF0YTsKKwkJaGRyID0gZGJwLT5kYXRhOwogCQlsb2dmcmVlID0gMDsKIAl9Ci0JQVNTRVJUKGJlMTZfdG9fY3B1KGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgpID49IGxlbmd0aCk7CisJQVNTRVJUKGJlMTZfdG9fY3B1KGhkci0+YmVzdGZyZWVbMF0ubGVuZ3RoKSA+PSBsZW5ndGgpOwogCS8qCiAJICogUG9pbnQgdG8gdGhlIGV4aXN0aW5nIHVudXNlZCBzcGFjZS4KIAkgKi8KIAlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKQotCSAgICAgICgoY2hhciAqKWRhdGEgKyBiZTE2X3RvX2NwdShkYXRhLT5oZHIuYmVzdGZyZWVbMF0ub2Zmc2V0KSk7CisJICAgICAgKChjaGFyICopaGRyICsgYmUxNl90b19jcHUoaGRyLT5iZXN0ZnJlZVswXS5vZmZzZXQpKTsKIAluZWVkc2NhbiA9IG5lZWRsb2cgPSAwOwogCS8qCiAJICogTWFyayB0aGUgZmlyc3QgcGFydCBvZiB0aGUgdW51c2VkIHNwYWNlLCBpbnVzZSBmb3IgdXMuCiAJICovCiAJeGZzX2RpcjJfZGF0YV91c2VfZnJlZSh0cCwgZGJwLCBkdXAsCi0JCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWRhdGEpLCBsZW5ndGgsCisJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWhkciksIGxlbmd0aCwKIAkJJm5lZWRsb2csICZuZWVkc2Nhbik7CiAJLyoKIAkgKiBGaWxsIGluIHRoZSBuZXcgZW50cnkgYW5kIGxvZyBpdC4KQEAgLTE3NjcsMTMgKzE2OTAsMTMgQEAKIAlkZXAtPm5hbWVsZW4gPSBhcmdzLT5uYW1lbGVuOwogCW1lbWNweShkZXAtPm5hbWUsIGFyZ3MtPm5hbWUsIGRlcC0+bmFtZWxlbik7CiAJdGFncCA9IHhmc19kaXIyX2RhdGFfZW50cnlfdGFnX3AoZGVwKTsKLQkqdGFncCA9IGNwdV90b19iZTE2KChjaGFyICopZGVwIC0gKGNoYXIgKilkYXRhKTsKKwkqdGFncCA9IGNwdV90b19iZTE2KChjaGFyICopZGVwIC0gKGNoYXIgKiloZHIpOwogCXhmc19kaXIyX2RhdGFfbG9nX2VudHJ5KHRwLCBkYnAsIGRlcCk7CiAJLyoKIAkgKiBSZXNjYW4gdGhlIGJsb2NrIGZvciBiZXN0ZnJlZSBpZiBuZWVkZWQuCiAJICovCiAJaWYgKG5lZWRzY2FuKQotCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCBkYXRhLCAmbmVlZGxvZyk7CisJCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsIGhkciwgJm5lZWRsb2cpOwogCS8qCiAJICogTG9nIHRoZSBkYXRhIGJsb2NrIGhlYWRlciBpZiBuZWVkZWQuCiAJICovCkBAIC0xNzgyLDggKzE3MDUsOCBAQAogCS8qCiAJICogSWYgdGhlIGZyZWVzcGFjZSBlbnRyeSBpcyBub3cgd3JvbmcsIHVwZGF0ZSBpdC4KIAkgKi8KLQlpZiAoYmUxNl90b19jcHUoZnJlZS0+YmVzdHNbZmluZGV4XSkgIT0gYmUxNl90b19jcHUoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCkpIHsKLQkJZnJlZS0+YmVzdHNbZmluZGV4XSA9IGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGg7CisJaWYgKGJlMTZfdG9fY3B1KGZyZWUtPmJlc3RzW2ZpbmRleF0pICE9IGJlMTZfdG9fY3B1KGhkci0+YmVzdGZyZWVbMF0ubGVuZ3RoKSkgeworCQlmcmVlLT5iZXN0c1tmaW5kZXhdID0gaGRyLT5iZXN0ZnJlZVswXS5sZW5ndGg7CiAJCWxvZ2ZyZWUgPSAxOwogCX0KIAkvKgpAQCAtMTkzMyw3ICsxODU2LDcgQEAKIAl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KIHsKIAl4ZnNfZGFfc3RhdGVfYmxrX3QJKmJsazsJCS8qIGxlYWYgYmxvY2sgKi8KLQl4ZnNfZGlyMl9kYXRhX3QJCSpkYXRhOwkJLyogZGF0YSBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9kYXRhX2hkcl90CSpoZHI7CQkvKiBkYXRhIGJsb2NrIGhlYWRlciAqLwogCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBlbnRyeSBjaGFuZ2VkICovCiAJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KIAlpbnQJCQlpOwkJLyogYnRyZWUgbGV2ZWwgKi8KQEAgLTE5NzcsMTAgKzE5MDAsMTAgQEAKIAkJLyoKIAkJICogUG9pbnQgdG8gdGhlIGRhdGEgZW50cnkuCiAJCSAqLwotCQlkYXRhID0gc3RhdGUtPmV4dHJhYmxrLmJwLT5kYXRhOwotCQlBU1NFUlQoYmUzMl90b19jcHUoZGF0YS0+aGRyLm1hZ2ljKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDKTsKKwkJaGRyID0gc3RhdGUtPmV4dHJhYmxrLmJwLT5kYXRhOworCQlBU1NFUlQoaGRyLT5tYWdpYyA9PSBjcHVfdG9fYmUzMihYRlNfRElSMl9EQVRBX01BR0lDKSk7CiAJCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKLQkJICAgICAgKChjaGFyICopZGF0YSArCisJCSAgICAgICgoY2hhciAqKWhkciArCiAJCSAgICAgICB4ZnNfZGlyMl9kYXRhcHRyX3RvX29mZihzdGF0ZS0+bXAsIGJlMzJfdG9fY3B1KGxlcC0+YWRkcmVzcykpKTsKIAkJQVNTRVJUKGludW0gIT0gYmU2NF90b19jcHUoZGVwLT5pbnVtYmVyKSk7CiAJCS8qCkBAIC0yMDQ0LDcgKzE5NjcsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAJZnJlZSA9IGJwLT5kYXRhOwotCUFTU0VSVChiZTMyX3RvX2NwdShmcmVlLT5oZHIubWFnaWMpID09IFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCUFTU0VSVChmcmVlLT5oZHIubWFnaWMgPT0gY3B1X3RvX2JlMzIoWEZTX0RJUjJfRlJFRV9NQUdJQykpOwogCS8qCiAJICogSWYgdGhlcmUgYXJlIHVzZWQgZW50cmllcywgdGhlcmUncyBub3RoaW5nIHRvIGRvLgogCSAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX25vZGUuaCBiL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZGZlNzEuLjAwMDAwMDAKLS0tIGEvZnMveGZzL3hmc19kaXIyX25vZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotI2lmbmRlZiBfX1hGU19ESVIyX05PREVfSF9fCi0jZGVmaW5lCV9fWEZTX0RJUjJfTk9ERV9IX18KLQotLyoKLSAqIERpcmVjdG9yeSB2ZXJzaW9uIDIsIGJ0cmVlIG5vZGUgZm9ybWF0IHN0cnVjdHVyZXMKLSAqLwotCi1zdHJ1Y3QgdWlvOwotc3RydWN0IHhmc19kYWJ1ZjsKLXN0cnVjdCB4ZnNfZGFfYXJnczsKLXN0cnVjdCB4ZnNfZGFfc3RhdGU7Ci1zdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsazsKLXN0cnVjdCB4ZnNfaW5vZGU7Ci1zdHJ1Y3QgeGZzX3RyYW5zOwotCi0vKgotICogT2Zmc2V0IG9mIHRoZSBmcmVlc3BhY2UgaW5kZXguCi0gKi8KLSNkZWZpbmUJWEZTX0RJUjJfRlJFRV9TUEFDRQkyCi0jZGVmaW5lCVhGU19ESVIyX0ZSRUVfT0ZGU0VUCShYRlNfRElSMl9GUkVFX1NQQUNFICogWEZTX0RJUjJfU1BBQ0VfU0laRSkKLSNkZWZpbmUJWEZTX0RJUjJfRlJFRV9GSVJTVERCKG1wKQlcCi0JeGZzX2RpcjJfYnl0ZV90b19kYihtcCwgWEZTX0RJUjJfRlJFRV9PRkZTRVQpCi0KLSNkZWZpbmUJWEZTX0RJUjJfRlJFRV9NQUdJQwkweDU4NDQzMjQ2CS8qIFhEMkYgKi8KLQotdHlwZWRlZglzdHJ1Y3QgeGZzX2RpcjJfZnJlZV9oZHIgewotCV9fYmUzMgkJCW1hZ2ljOwkJLyogWEZTX0RJUjJfRlJFRV9NQUdJQyAqLwotCV9fYmUzMgkJCWZpcnN0ZGI7CS8qIGRiIG9mIGZpcnN0IGVudHJ5ICovCi0JX19iZTMyCQkJbnZhbGlkOwkJLyogY291bnQgb2YgdmFsaWQgZW50cmllcyAqLwotCV9fYmUzMgkJCW51c2VkOwkJLyogY291bnQgb2YgdXNlZCBlbnRyaWVzICovCi19IHhmc19kaXIyX2ZyZWVfaGRyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhmc19kaXIyX2ZyZWUgewotCXhmc19kaXIyX2ZyZWVfaGRyX3QJaGRyOwkJLyogYmxvY2sgaGVhZGVyICovCi0JX19iZTE2CQkJYmVzdHNbMV07CS8qIGJlc3QgZnJlZSBjb3VudHMgKi8KLQkJCQkJCS8qIHVudXNlZCBlbnRyaWVzIGFyZSAtMSAqLwotfSB4ZnNfZGlyMl9mcmVlX3Q7Ci0KLSNkZWZpbmUJWEZTX0RJUjJfTUFYX0ZSRUVfQkVTVFMobXApCVwKLQkoKChtcCktPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZih4ZnNfZGlyMl9mcmVlX2hkcl90KSkgLyBcCi0JICh1aW50KXNpemVvZih4ZnNfZGlyMl9kYXRhX29mZl90KSkKLQotLyoKLSAqIENvbnZlcnQgZGF0YSBzcGFjZSBkYiB0byB0aGUgY29ycmVzcG9uZGluZyBmcmVlIGRiLgotICovCi1zdGF0aWMgaW5saW5lIHhmc19kaXIyX2RiX3QKLXhmc19kaXIyX2RiX3RvX2ZkYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGJfdCBkYikKLXsKLQlyZXR1cm4gKFhGU19ESVIyX0ZSRUVfRklSU1REQihtcCkgKyAoZGIpIC8gWEZTX0RJUjJfTUFYX0ZSRUVfQkVTVFMobXApKTsKLX0KLQotLyoKLSAqIENvbnZlcnQgZGF0YSBzcGFjZSBkYiB0byB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBpbiBhIGZyZWUgZGIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci14ZnNfZGlyMl9kYl90b19mZGluZGV4KHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiKQotewotCXJldHVybiAoKGRiKSAlIFhGU19ESVIyX01BWF9GUkVFX0JFU1RTKG1wKSk7Ci19Ci0KLWV4dGVybiBpbnQgeGZzX2RpcjJfbGVhZl90b19ub2RlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKLQkJCQkgc3RydWN0IHhmc19kYWJ1ZiAqbGJwKTsKLWV4dGVybiB4ZnNfZGFoYXNoX3QgeGZzX2RpcjJfbGVhZm5fbGFzdGhhc2goc3RydWN0IHhmc19kYWJ1ZiAqYnAsIGludCAqY291bnQpOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmbl9sb29rdXBfaW50KHN0cnVjdCB4ZnNfZGFidWYgKmJwLAotCQkJCSAgICAgc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBpbnQgKmluZGV4cCwKLQkJCQkgICAgIHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlKTsKLWV4dGVybiBpbnQgeGZzX2RpcjJfbGVhZm5fb3JkZXIoc3RydWN0IHhmc19kYWJ1ZiAqbGVhZjFfYnAsCi0JCQkJc3RydWN0IHhmc19kYWJ1ZiAqbGVhZjJfYnApOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmbl9zcGxpdChzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSwKLQkJCQlzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayAqb2xkYmxrLAotCQkJCXN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpuZXdibGspOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmbl90b29zbWFsbChzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSwgaW50ICphY3Rpb24pOwotZXh0ZXJuIHZvaWQgeGZzX2RpcjJfbGVhZm5fdW5iYWxhbmNlKHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlLAotCQkJCSAgICAgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKmRyb3BfYmxrLAotCQkJCSAgICAgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKnNhdmVfYmxrKTsKLWV4dGVybiBpbnQgeGZzX2RpcjJfbm9kZV9hZGRuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci1leHRlcm4gaW50IHhmc19kaXIyX25vZGVfbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci1leHRlcm4gaW50IHhmc19kaXIyX25vZGVfcmVtb3ZlbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9ub2RlX3JlcGxhY2Uoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLWV4dGVybiBpbnQgeGZzX2RpcjJfbm9kZV90cmltX2ZyZWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfZmlsZW9mZl90IGZvLAotCQkJCSAgIGludCAqcnZhbHApOwotCi0jZW5kaWYJLyogX19YRlNfRElSMl9OT0RFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX3ByaXYuaCBiL2ZzL3hmcy94ZnNfZGlyMl9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3ZjQwMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9wcml2LmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKyNpZm5kZWYgX19YRlNfRElSMl9QUklWX0hfXworI2RlZmluZSBfX1hGU19ESVIyX1BSSVZfSF9fCisKKy8qIHhmc19kaXIyLmMgKi8KK2V4dGVybiBpbnQgeGZzX2Rpcl9pbm9fdmFsaWRhdGUoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19pbm9fdCBpbm8pOworZXh0ZXJuIGludCB4ZnNfZGlyMl9pc2Jsb2NrKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwgaW50ICpyKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfaXNsZWFmKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwgaW50ICpyKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfZ3Jvd19pbm9kZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIGludCBzcGFjZSwKKwkJCQl4ZnNfZGlyMl9kYl90ICpkYnApOworZXh0ZXJuIGludCB4ZnNfZGlyMl9zaHJpbmtfaW5vZGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfZGlyMl9kYl90IGRiLAorCQkJCXN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKK2V4dGVybiBpbnQgeGZzX2Rpcl9jaWxvb2t1cF9yZXN1bHQoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIGludCBsZW4pOworCisvKiB4ZnNfZGlyMl9ibG9jay5jICovCitleHRlcm4gaW50IHhmc19kaXIyX2Jsb2NrX2FkZG5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfYmxvY2tfZ2V0ZGVudHMoc3RydWN0IHhmc19pbm9kZSAqZHAsIHZvaWQgKmRpcmVudCwKKwkJeGZzX29mZl90ICpvZmZzZXQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfYmxvY2tfbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitleHRlcm4gaW50IHhmc19kaXIyX2Jsb2NrX3JlbW92ZW5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfYmxvY2tfcmVwbGFjZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmX3RvX2Jsb2NrKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKKwkJc3RydWN0IHhmc19kYWJ1ZiAqbGJwLCBzdHJ1Y3QgeGZzX2RhYnVmICpkYnApOworCisvKiB4ZnNfZGlyMl9kYXRhLmMgKi8KKyNpZmRlZiBERUJVRworZXh0ZXJuIHZvaWQgeGZzX2RpcjJfZGF0YV9jaGVjayhzdHJ1Y3QgeGZzX2lub2RlICpkcCwgc3RydWN0IHhmc19kYWJ1ZiAqYnApOworI2Vsc2UKKyNkZWZpbmUJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCxicCkKKyNlbmRpZgorZXh0ZXJuIHN0cnVjdCB4ZnNfZGlyMl9kYXRhX2ZyZWUgKgoreGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KHN0cnVjdCB4ZnNfZGlyMl9kYXRhX2hkciAqaGRyLAorCQlzdHJ1Y3QgeGZzX2RpcjJfZGF0YV91bnVzZWQgKmR1cCwgaW50ICpsb2doZWFkKTsKK2V4dGVybiB2b2lkIHhmc19kaXIyX2RhdGFfZnJlZXNjYW4oc3RydWN0IHhmc19tb3VudCAqbXAsCisJCXN0cnVjdCB4ZnNfZGlyMl9kYXRhX2hkciAqaGRyLCBpbnQgKmxvZ2hlYWQpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9kYXRhX2luaXQoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfZGlyMl9kYl90IGJsa25vLAorCQlzdHJ1Y3QgeGZzX2RhYnVmICoqYnBwKTsKK2V4dGVybiB2b2lkIHhmc19kaXIyX2RhdGFfbG9nX2VudHJ5KHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJc3RydWN0IHhmc19kaXIyX2RhdGFfZW50cnkgKmRlcCk7CitleHRlcm4gdm9pZCB4ZnNfZGlyMl9kYXRhX2xvZ19oZWFkZXIoc3RydWN0IHhmc190cmFucyAqdHAsCisJCXN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKK2V4dGVybiB2b2lkIHhmc19kaXIyX2RhdGFfbG9nX3VudXNlZChzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCisJCXN0cnVjdCB4ZnNfZGlyMl9kYXRhX3VudXNlZCAqZHVwKTsKK2V4dGVybiB2b2lkIHhmc19kaXIyX2RhdGFfbWFrZV9mcmVlKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2Zmc2V0LCB4ZnNfZGlyMl9kYXRhX2FvZmZfdCBsZW4sCisJCWludCAqbmVlZGxvZ3AsIGludCAqbmVlZHNjYW5wKTsKK2V4dGVybiB2b2lkIHhmc19kaXIyX2RhdGFfdXNlX2ZyZWUoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAorCQlzdHJ1Y3QgeGZzX2RpcjJfZGF0YV91bnVzZWQgKmR1cCwgeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2Zmc2V0LAorCQl4ZnNfZGlyMl9kYXRhX2FvZmZfdCBsZW4sIGludCAqbmVlZGxvZ3AsIGludCAqbmVlZHNjYW5wKTsKKworLyogeGZzX2RpcjJfbGVhZi5jICovCitleHRlcm4gaW50IHhmc19kaXIyX2Jsb2NrX3RvX2xlYWYoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLAorCQlzdHJ1Y3QgeGZzX2RhYnVmICpkYnApOworZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmX2FkZG5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2V4dGVybiB2b2lkIHhmc19kaXIyX2xlYWZfY29tcGFjdChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCisJCXN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKK2V4dGVybiB2b2lkIHhmc19kaXIyX2xlYWZfY29tcGFjdF94MShzdHJ1Y3QgeGZzX2RhYnVmICpicCwgaW50ICppbmRleHAsCisJCWludCAqbG93c3RhbGVwLCBpbnQgKmhpZ2hzdGFsZXAsIGludCAqbG93bG9ncCwgaW50ICpoaWdobG9ncCk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZfZ2V0ZGVudHMoc3RydWN0IHhmc19pbm9kZSAqZHAsIHZvaWQgKmRpcmVudCwKKwkJc2l6ZV90IGJ1ZnNpemUsIHhmc19vZmZfdCAqb2Zmc2V0LCBmaWxsZGlyX3QgZmlsbGRpcik7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZfaW5pdChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHhmc19kaXIyX2RiX3QgYm5vLAorCQlzdHJ1Y3QgeGZzX2RhYnVmICoqYnBwLCBpbnQgbWFnaWMpOworZXh0ZXJuIHZvaWQgeGZzX2RpcjJfbGVhZl9sb2dfZW50cyhzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCisJCWludCBmaXJzdCwgaW50IGxhc3QpOworZXh0ZXJuIHZvaWQgeGZzX2RpcjJfbGVhZl9sb2dfaGVhZGVyKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLAorCQlzdHJ1Y3QgeGZzX2RhYnVmICpicCk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZfbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZfcmVtb3ZlbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmX3JlcGxhY2Uoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfbGVhZl9zZWFyY2hfaGFzaChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCisJCXN0cnVjdCB4ZnNfZGFidWYgKmxicCk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZfdHJpbV9kYXRhKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKKwkJc3RydWN0IHhmc19kYWJ1ZiAqbGJwLCB4ZnNfZGlyMl9kYl90IGRiKTsKK2V4dGVybiBzdHJ1Y3QgeGZzX2RpcjJfbGVhZl9lbnRyeSAqCit4ZnNfZGlyMl9sZWFmX2ZpbmRfZW50cnkoc3RydWN0IHhmc19kaXIyX2xlYWYgKmxlYWYsIGludCBpbmRleCwgaW50IGNvbXBhY3QsCisJCWludCBsb3dzdGFsZSwgaW50IGhpZ2hzdGFsZSwKKwkJaW50ICpsZmxvZ2xvdywgaW50ICpsZmxvZ2hpZ2gpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9ub2RlX3RvX2xlYWYoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUpOworCisvKiB4ZnNfZGlyMl9ub2RlLmMgKi8KK2V4dGVybiBpbnQgeGZzX2RpcjJfbGVhZl90b19ub2RlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKKwkJc3RydWN0IHhmc19kYWJ1ZiAqbGJwKTsKK2V4dGVybiB4ZnNfZGFoYXNoX3QgeGZzX2RpcjJfbGVhZm5fbGFzdGhhc2goc3RydWN0IHhmc19kYWJ1ZiAqYnAsIGludCAqY291bnQpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmbl9sb29rdXBfaW50KHN0cnVjdCB4ZnNfZGFidWYgKmJwLAorCQlzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIGludCAqaW5kZXhwLAorCQlzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZuX29yZGVyKHN0cnVjdCB4ZnNfZGFidWYgKmxlYWYxX2JwLAorCQlzdHJ1Y3QgeGZzX2RhYnVmICpsZWFmMl9icCk7CitleHRlcm4gaW50IHhmc19kaXIyX2xlYWZuX3NwbGl0KHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlLAorCXN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpvbGRibGssIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpuZXdibGspOworZXh0ZXJuIGludCB4ZnNfZGlyMl9sZWFmbl90b29zbWFsbChzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSwgaW50ICphY3Rpb24pOworZXh0ZXJuIHZvaWQgeGZzX2RpcjJfbGVhZm5fdW5iYWxhbmNlKHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlLAorCQlzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayAqZHJvcF9ibGssCisJCXN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpzYXZlX2Jsayk7CitleHRlcm4gaW50IHhmc19kaXIyX25vZGVfYWRkbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9ub2RlX2xvb2t1cChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworZXh0ZXJuIGludCB4ZnNfZGlyMl9ub2RlX3JlbW92ZW5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfbm9kZV9yZXBsYWNlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitleHRlcm4gaW50IHhmc19kaXIyX25vZGVfdHJpbV9mcmVlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2ZpbGVvZmZfdCBmbywKKwkJaW50ICpydmFscCk7CisKKy8qIHhmc19kaXIyX3NmLmMgKi8KK2V4dGVybiB4ZnNfaW5vX3QgeGZzX2RpcjJfc2ZfZ2V0X3BhcmVudF9pbm8oc3RydWN0IHhmc19kaXIyX3NmX2hkciAqc2ZwKTsKK2V4dGVybiB4ZnNfaW5vX3QgeGZzX2RpcjJfc2ZlX2dldF9pbm8oc3RydWN0IHhmc19kaXIyX3NmX2hkciAqc2ZwLAorCQlzdHJ1Y3QgeGZzX2RpcjJfc2ZfZW50cnkgKnNmZXApOworZXh0ZXJuIGludCB4ZnNfZGlyMl9ibG9ja19zZnNpemUoc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCXN0cnVjdCB4ZnNfZGlyMl9kYXRhX2hkciAqYmxvY2ssIHN0cnVjdCB4ZnNfZGlyMl9zZl9oZHIgKnNmaHApOworZXh0ZXJuIGludCB4ZnNfZGlyMl9ibG9ja190b19zZihzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAorCQlpbnQgc2l6ZSwgeGZzX2RpcjJfc2ZfaGRyX3QgKnNmaHApOworZXh0ZXJuIGludCB4ZnNfZGlyMl9zZl9hZGRuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitleHRlcm4gaW50IHhmc19kaXIyX3NmX2NyZWF0ZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHhmc19pbm9fdCBwaW5vKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfc2ZfZ2V0ZGVudHMoc3RydWN0IHhmc19pbm9kZSAqZHAsIHZvaWQgKmRpcmVudCwKKwkJeGZzX29mZl90ICpvZmZzZXQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfc2ZfbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitleHRlcm4gaW50IHhmc19kaXIyX3NmX3JlbW92ZW5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2V4dGVybiBpbnQgeGZzX2RpcjJfc2ZfcmVwbGFjZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCisjZW5kaWYgLyogX19YRlNfRElSMl9QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX3NmLmMgYi9mcy94ZnMveGZzX2RpcjJfc2YuYwppbmRleCBiMWJhZTZiLi43OWQwNWU4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjJfc2YuYworKysgYi9mcy94ZnMveGZzX2RpcjJfc2YuYwpAQCAtMjMsMTggKzIzLDE2IEBACiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKICNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfZGF0YS5oIgotI2luY2x1ZGUgInhmc19kaXIyX2xlYWYuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9ibG9jay5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfZm9ybWF0LmgiCisjaW5jbHVkZSAieGZzX2RpcjJfcHJpdi5oIgogI2luY2x1ZGUgInhmc190cmFjZS5oIgogCiAvKgpAQCAtNjAsNiArNTgsODIgQEAKICNlbmRpZiAvKiBYRlNfQklHX0lOVU1TICovCiAKIC8qCisgKiBJbm9kZSBudW1iZXJzIGluIHNob3J0LWZvcm0gZGlyZWN0b3JpZXMgY2FuIGNvbWUgaW4gdHdvIHZlcnNpb25zLAorICogZWl0aGVyIDQgYnl0ZXMgb3IgOCBieXRlcyB3aWRlLiAgVGhlc2UgaGVscGVycyBkZWFsIHdpdGggdGhlCisgKiB0d28gZm9ybXMgdHJhbnNwYXJlbnRseSBieSBsb29raW5nIGF0IHRoZSBoZWFkZXJzIGk4Y291bnQgZmllbGQuCisgKgorICogRm9yIDY0LWJpdCBpbm9kZSBudW1iZXIgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBtdXN0IGJlIHplcm8uCisgKi8KK3N0YXRpYyB4ZnNfaW5vX3QKK3hmc19kaXIyX3NmX2dldF9pbm8oCisJc3RydWN0IHhmc19kaXIyX3NmX2hkcgkqaGRyLAorCXhmc19kaXIyX2lub3VfdAkJKmZyb20pCit7CisJaWYgKGhkci0+aThjb3VudCkKKwkJcmV0dXJuIGdldF91bmFsaWduZWRfYmU2NCgmZnJvbS0+aTguaSkgJiAweDAwZmZmZmZmZmZmZmZmZmZVTEw7CisJZWxzZQorCQlyZXR1cm4gZ2V0X3VuYWxpZ25lZF9iZTMyKCZmcm9tLT5pNC5pKTsKK30KKworc3RhdGljIHZvaWQKK3hmc19kaXIyX3NmX3B1dF9pbm8oCisJc3RydWN0IHhmc19kaXIyX3NmX2hkcgkqaGRyLAorCXhmc19kaXIyX2lub3VfdAkJKnRvLAorCXhmc19pbm9fdAkJaW5vKQoreworCUFTU0VSVCgoaW5vICYgMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSA9PSAwKTsKKworCWlmIChoZHItPmk4Y291bnQpCisJCXB1dF91bmFsaWduZWRfYmU2NChpbm8sICZ0by0+aTguaSk7CisJZWxzZQorCQlwdXRfdW5hbGlnbmVkX2JlMzIoaW5vLCAmdG8tPmk0LmkpOworfQorCit4ZnNfaW5vX3QKK3hmc19kaXIyX3NmX2dldF9wYXJlbnRfaW5vKAorCXN0cnVjdCB4ZnNfZGlyMl9zZl9oZHIJKmhkcikKK3sKKwlyZXR1cm4geGZzX2RpcjJfc2ZfZ2V0X2lubyhoZHIsICZoZHItPnBhcmVudCk7Cit9CisKK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl9zZl9wdXRfcGFyZW50X2lubygKKwlzdHJ1Y3QgeGZzX2RpcjJfc2ZfaGRyCSpoZHIsCisJeGZzX2lub190CQlpbm8pCit7CisJeGZzX2RpcjJfc2ZfcHV0X2lubyhoZHIsICZoZHItPnBhcmVudCwgaW5vKTsKK30KKworLyoKKyAqIEluIHNob3J0LWZvcm0gZGlyZWN0b3J5IGVudHJpZXMgdGhlIGlub2RlIG51bWJlcnMgYXJlIHN0b3JlZCBhdCB2YXJpYWJsZQorICogb2Zmc2V0IGJlaGluZCB0aGUgZW50cnkgbmFtZS4gIFRoZSBpbm9kZSBudW1iZXJzIG1heSBvbmx5IGJlIGFjY2Vzc2VkCisgKiB0aHJvdWdoIHRoZSBoZWxwZXJzIGJlbG93LgorICovCitzdGF0aWMgeGZzX2RpcjJfaW5vdV90ICoKK3hmc19kaXIyX3NmZV9pbm9wKAorCXN0cnVjdCB4ZnNfZGlyMl9zZl9lbnRyeSAqc2ZlcCkKK3sKKwlyZXR1cm4gKHhmc19kaXIyX2lub3VfdCAqKSZzZmVwLT5uYW1lW3NmZXAtPm5hbWVsZW5dOworfQorCit4ZnNfaW5vX3QKK3hmc19kaXIyX3NmZV9nZXRfaW5vKAorCXN0cnVjdCB4ZnNfZGlyMl9zZl9oZHIJKmhkciwKKwlzdHJ1Y3QgeGZzX2RpcjJfc2ZfZW50cnkgKnNmZXApCit7CisJcmV0dXJuIHhmc19kaXIyX3NmX2dldF9pbm8oaGRyLCB4ZnNfZGlyMl9zZmVfaW5vcChzZmVwKSk7Cit9CisKK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl9zZmVfcHV0X2lubygKKwlzdHJ1Y3QgeGZzX2RpcjJfc2ZfaGRyCSpoZHIsCisJc3RydWN0IHhmc19kaXIyX3NmX2VudHJ5ICpzZmVwLAorCXhmc19pbm9fdAkJaW5vKQoreworCXhmc19kaXIyX3NmX3B1dF9pbm8oaGRyLCB4ZnNfZGlyMl9zZmVfaW5vcChzZmVwKSwgaW5vKTsKK30KKworLyoKICAqIEdpdmVuIGEgYmxvY2sgZGlyZWN0b3J5IChkcC9ibG9jayksIGNhbGN1bGF0ZSBpdHMgc2l6ZSBhcyBhIHNob3J0Zm9ybSAoc2YpCiAgKiBkaXJlY3RvcnkgYW5kIGEgaGVhZGVyIGZvciB0aGUgc2YgZGlyZWN0b3J5LCBpZiBpdCB3aWxsIGZpdCBpdCB0aGUKICAqIHNwYWNlIGN1cnJlbnRseSBwcmVzZW50IGluIHRoZSBpbm9kZS4gIElmIGl0IHdvbid0IGZpdCwgdGhlIG91dHB1dApAQCAtNjgsNyArMTQyLDcgQEAKIGludAkJCQkJCS8qIHNpemUgZm9yIHNmIGZvcm0gKi8KIHhmc19kaXIyX2Jsb2NrX3Nmc2l6ZSgKIAl4ZnNfaW5vZGVfdAkJKmRwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KLQl4ZnNfZGlyMl9ibG9ja190CSpibG9jaywJCS8qIGJsb2NrIGRpcmVjdG9yeSBkYXRhICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyLAkJLyogYmxvY2sgZGlyZWN0b3J5IGRhdGEgKi8KIAl4ZnNfZGlyMl9zZl9oZHJfdAkqc2ZocCkJCS8qIG91dHB1dDogaGVhZGVyIGZvciBzZiBmb3JtICovCiB7CiAJeGZzX2RpcjJfZGF0YXB0cl90CWFkZHI7CQkvKiBkYXRhIGVudHJ5IGFkZHJlc3MgKi8KQEAgLTg4LDcgKzE2Miw3IEBACiAJbXAgPSBkcC0+aV9tb3VudDsKIAogCWNvdW50ID0gaThjb3VudCA9IG5hbWVsZW4gPSAwOwotCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgYmxvY2spOworCWJ0cCA9IHhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCwgaGRyKTsKIAlibHAgPSB4ZnNfZGlyMl9ibG9ja19sZWFmX3AoYnRwKTsKIAogCS8qCkBAIC0xMDEsNyArMTc1LDcgQEAKIAkJICogQ2FsY3VsYXRlIHRoZSBwb2ludGVyIHRvIHRoZSBlbnRyeSBhdCBoYW5kLgogCQkgKi8KIAkJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQotCQkgICAgICAoKGNoYXIgKilibG9jayArIHhmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKG1wLCBhZGRyKSk7CisJCSAgICAgICgoY2hhciAqKWhkciArIHhmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKG1wLCBhZGRyKSk7CiAJCS8qCiAJCSAqIERldGVjdCAuIGFuZCAuLiwgc28gd2UgY2FuIHNwZWNpYWwtY2FzZSB0aGVtLgogCQkgKiAuIGlzIG5vdCBpbmNsdWRlZCBpbiBzZiBkaXJlY3Rvcmllcy4KQEAgLTEzOCw3ICsyMTIsNyBAQAogCSAqLwogCXNmaHAtPmNvdW50ID0gY291bnQ7CiAJc2ZocC0+aThjb3VudCA9IGk4Y291bnQ7Ci0JeGZzX2RpcjJfc2ZfcHV0X2ludW1iZXIoKHhmc19kaXIyX3NmX3QgKilzZmhwLCAmcGFyZW50LCAmc2ZocC0+cGFyZW50KTsKKwl4ZnNfZGlyMl9zZl9wdXRfcGFyZW50X2lubyhzZmhwLCBwYXJlbnQpOwogCXJldHVybiBzaXplOwogfQogCkBAIC0xNTMsNyArMjI3LDcgQEAKIAlpbnQJCQlzaXplLAkJLyogc2hvcnRmb3JtIGRpcmVjdG9yeSBzaXplICovCiAJeGZzX2RpcjJfc2ZfaGRyX3QJKnNmaHApCQkvKiBzaG9ydGZvcm0gZGlyZWN0b3J5IGhkciAqLwogewotCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGF0YV9oZHJfdAkqaGRyOwkJLyogYmxvY2sgaGVhZGVyICovCiAJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsIHBvaW50ZXIgKi8KIAl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgZW50cnkgcG9pbnRlciAqLwogCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCkBAIC0xNjQsOCArMjM4LDcgQEAKIAl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLwogCWNoYXIJCQkqcHRyOwkJLyogY3VycmVudCBkYXRhIHBvaW50ZXIgKi8KIAl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2hvcnRmb3JtIGVudHJ5ICovCi0JeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KLQl4ZnNfaW5vX3QgICAgICAgICAgICAgICB0ZW1wOworCXhmc19kaXIyX3NmX2hkcl90CSpzZnA7CQkvKiBzaG9ydGZvcm0gZGlyZWN0b3J5IGhlYWRlciAqLwogCiAJdHJhY2VfeGZzX2RpcjJfYmxvY2tfdG9fc2YoYXJncyk7CiAKQEAgLTE3NiwxMyArMjQ5LDE0IEBACiAJICogTWFrZSBhIGNvcHkgb2YgdGhlIGJsb2NrIGRhdGEsIHNvIHdlIGNhbiBzaHJpbmsgdGhlIGlub2RlCiAJICogYW5kIGFkZCBsb2NhbCBkYXRhLgogCSAqLwotCWJsb2NrID0ga21lbV9hbGxvYyhtcC0+bV9kaXJibGtzaXplLCBLTV9TTEVFUCk7Ci0JbWVtY3B5KGJsb2NrLCBicC0+ZGF0YSwgbXAtPm1fZGlyYmxrc2l6ZSk7CisJaGRyID0ga21lbV9hbGxvYyhtcC0+bV9kaXJibGtzaXplLCBLTV9TTEVFUCk7CisJbWVtY3B5KGhkciwgYnAtPmRhdGEsIG1wLT5tX2RpcmJsa3NpemUpOwogCWxvZ2ZsYWdzID0gWEZTX0lMT0dfQ09SRTsKIAlpZiAoKGVycm9yID0geGZzX2RpcjJfc2hyaW5rX2lub2RlKGFyZ3MsIG1wLT5tX2RpcmRhdGFibGssIGJwKSkpIHsKIAkJQVNTRVJUKGVycm9yICE9IEVOT1NQQyk7CiAJCWdvdG8gb3V0OwogCX0KKwogCS8qCiAJICogVGhlIGJ1ZmZlciBpcyBub3cgdW5jb25kaXRpb25hbGx5IGdvbmUsIHdoZXRoZXIKIAkgKiB4ZnNfZGlyMl9zaHJpbmtfaW5vZGUgd29ya2VkIG9yIG5vdC4KQEAgLTE5OCwxNCArMjcyLDE0IEBACiAJLyoKIAkgKiBDb3B5IHRoZSBoZWFkZXIgaW50byB0aGUgbmV3bHkgYWxsb2NhdGUgbG9jYWwgc3BhY2UuCiAJICovCi0Jc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCXNmcCA9ICh4ZnNfZGlyMl9zZl9oZHJfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CiAJbWVtY3B5KHNmcCwgc2ZocCwgeGZzX2RpcjJfc2ZfaGRyX3NpemUoc2ZocC0+aThjb3VudCkpOwogCWRwLT5pX2QuZGlfc2l6ZSA9IHNpemU7CiAJLyoKIAkgKiBTZXQgdXAgdG8gbG9vcCBvdmVyIHRoZSBibG9jaydzIGVudHJpZXMuCiAJICovCi0JYnRwID0geGZzX2RpcjJfYmxvY2tfdGFpbF9wKG1wLCBibG9jayk7Ci0JcHRyID0gKGNoYXIgKilibG9jay0+dTsKKwlidHAgPSB4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsIGhkcik7CisJcHRyID0gKGNoYXIgKikoaGRyICsgMSk7CiAJZW5kcHRyID0gKGNoYXIgKil4ZnNfZGlyMl9ibG9ja19sZWFmX3AoYnRwKTsKIAlzZmVwID0geGZzX2RpcjJfc2ZfZmlyc3RlbnRyeShzZnApOwogCS8qCkBAIC0yMzMsNyArMzA3LDcgQEAKIAkJZWxzZSBpZiAoZGVwLT5uYW1lbGVuID09IDIgJiYKIAkJCSBkZXAtPm5hbWVbMF0gPT0gJy4nICYmIGRlcC0+bmFtZVsxXSA9PSAnLicpCiAJCQlBU1NFUlQoYmU2NF90b19jcHUoZGVwLT5pbnVtYmVyKSA9PQotCQkJICAgICAgIHhmc19kaXIyX3NmX2dldF9pbnVtYmVyKHNmcCwgJnNmcC0+aGRyLnBhcmVudCkpOworCQkJICAgICAgIHhmc19kaXIyX3NmX2dldF9wYXJlbnRfaW5vKHNmcCkpOwogCQkvKgogCQkgKiBOb3JtYWwgZW50cnksIGNvcHkgaXQgaW50byBzaG9ydGZvcm0uCiAJCSAqLwpAQCAtMjQxLDExICszMTUsMTEgQEAKIAkJCXNmZXAtPm5hbWVsZW4gPSBkZXAtPm5hbWVsZW47CiAJCQl4ZnNfZGlyMl9zZl9wdXRfb2Zmc2V0KHNmZXAsCiAJCQkJKHhmc19kaXIyX2RhdGFfYW9mZl90KQotCQkJCSgoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spKTsKKwkJCQkoKGNoYXIgKilkZXAgLSAoY2hhciAqKWhkcikpOwogCQkJbWVtY3B5KHNmZXAtPm5hbWUsIGRlcC0+bmFtZSwgZGVwLT5uYW1lbGVuKTsKLQkJCXRlbXAgPSBiZTY0X3RvX2NwdShkZXAtPmludW1iZXIpOwotCQkJeGZzX2RpcjJfc2ZfcHV0X2ludW1iZXIoc2ZwLCAmdGVtcCwKLQkJCQl4ZnNfZGlyMl9zZl9pbnVtYmVycChzZmVwKSk7CisJCQl4ZnNfZGlyMl9zZmVfcHV0X2lubyhzZnAsIHNmZXAsCisJCQkJCSAgICAgYmU2NF90b19jcHUoZGVwLT5pbnVtYmVyKSk7CisKIAkJCXNmZXAgPSB4ZnNfZGlyMl9zZl9uZXh0ZW50cnkoc2ZwLCBzZmVwKTsKIAkJfQogCQlwdHIgKz0geGZzX2RpcjJfZGF0YV9lbnRzaXplKGRlcC0+bmFtZWxlbik7CkBAIC0yNTQsNyArMzI4LDcgQEAKIAl4ZnNfZGlyMl9zZl9jaGVjayhhcmdzKTsKIG91dDoKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgbG9nZmxhZ3MpOwotCWttZW1fZnJlZShibG9jayk7CisJa21lbV9mcmVlKGhkcik7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0yNzcsNyArMzUxLDcgQEAKIAl4ZnNfZGlyMl9kYXRhX2FvZmZfdAlvZmZzZXQgPSAwOwkvKiBvZmZzZXQgZm9yIG5ldyBlbnRyeSAqLwogCWludAkJCW9sZF9pc2l6ZTsJLyogZGlfc2l6ZSBiZWZvcmUgYWRkaW5nIG5hbWUgKi8KIAlpbnQJCQlwaWNrOwkJLyogd2hpY2ggYWxnb3JpdGhtIHRvIHVzZSAqLwotCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisJeGZzX2RpcjJfc2ZfaGRyX3QJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KIAl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwID0gTlVMTDsJLyogc2hvcnRmb3JtIGVudHJ5ICovCiAKIAl0cmFjZV94ZnNfZGlyMl9zZl9hZGRuYW1lKGFyZ3MpOwpAQCAtMjk0LDE5ICszNjgsMTkgQEAKIAl9CiAJQVNTRVJUKGRwLT5pX2RmLmlmX2J5dGVzID09IGRwLT5pX2QuZGlfc2l6ZSk7CiAJQVNTRVJUKGRwLT5pX2RmLmlmX3UxLmlmX2RhdGEgIT0gTlVMTCk7Ci0Jc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOwotCUFTU0VSVChkcC0+aV9kLmRpX3NpemUgPj0geGZzX2RpcjJfc2ZfaGRyX3NpemUoc2ZwLT5oZHIuaThjb3VudCkpOworCXNmcCA9ICh4ZnNfZGlyMl9zZl9oZHJfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJQVNTRVJUKGRwLT5pX2QuZGlfc2l6ZSA+PSB4ZnNfZGlyMl9zZl9oZHJfc2l6ZShzZnAtPmk4Y291bnQpKTsKIAkvKgogCSAqIENvbXB1dGUgZW50cnkgKGFuZCBjaGFuZ2UgaW4pIHNpemUuCiAJICovCi0JYWRkX2VudHNpemUgPSB4ZnNfZGlyMl9zZl9lbnRzaXplX2J5bmFtZShzZnAsIGFyZ3MtPm5hbWVsZW4pOworCWFkZF9lbnRzaXplID0geGZzX2RpcjJfc2ZfZW50c2l6ZShzZnAsIGFyZ3MtPm5hbWVsZW4pOwogCWluY3JfaXNpemUgPSBhZGRfZW50c2l6ZTsKIAlvYmpjaGFuZ2UgPSAwOwogI2lmIFhGU19CSUdfSU5VTVMKIAkvKgogCSAqIERvIHdlIGhhdmUgdG8gY2hhbmdlIHRvIDggYnl0ZSBpbm9kZXM/CiAJICovCi0JaWYgKGFyZ3MtPmludW1iZXIgPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSAmJiBzZnAtPmhkci5pOGNvdW50ID09IDApIHsKKwlpZiAoYXJncy0+aW51bWJlciA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNICYmIHNmcC0+aThjb3VudCA9PSAwKSB7CiAJCS8qCiAJCSAqIFllcywgYWRqdXN0IHRoZSBlbnRyeSBzaXplIGFuZCB0aGUgdG90YWwgc2l6ZS4KIAkJICovCkBAIC0zMTQsNyArMzg4LDcgQEAKIAkJCSh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm84X3QpIC0KIAkJCSh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpOwogCQlpbmNyX2lzaXplICs9Ci0JCQkoc2ZwLT5oZHIuY291bnQgKyAyKSAqCisJCQkoc2ZwLT5jb3VudCArIDIpICoKIAkJCSgodWludClzaXplb2YoeGZzX2RpcjJfaW5vOF90KSAtCiAJCQkgKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzRfdCkpOwogCQlvYmpjaGFuZ2UgPSAxOwpAQCAtMzg0LDIxICs0NTgsMjEgQEAKIHsKIAlpbnQJCQlieXRlb2ZmOwkvKiBieXRlIG9mZnNldCBpbiBzZiBkaXIgKi8KIAl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLwotCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisJeGZzX2RpcjJfc2ZfaGRyX3QJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KIAogCWRwID0gYXJncy0+ZHA7CiAKLQlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJc2ZwID0gKHhmc19kaXIyX3NmX2hkcl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKIAlieXRlb2ZmID0gKGludCkoKGNoYXIgKilzZmVwIC0gKGNoYXIgKilzZnApOwogCS8qCiAJICogR3JvdyB0aGUgaW4taW5vZGUgc3BhY2UuCiAJICovCi0JeGZzX2lkYXRhX3JlYWxsb2MoZHAsIHhmc19kaXIyX3NmX2VudHNpemVfYnluYW1lKHNmcCwgYXJncy0+bmFtZWxlbiksCisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIHhmc19kaXIyX3NmX2VudHNpemUoc2ZwLCBhcmdzLT5uYW1lbGVuKSwKIAkJWEZTX0RBVEFfRk9SSyk7CiAJLyoKIAkgKiBOZWVkIHRvIHNldCB1cCBhZ2FpbiBkdWUgdG8gcmVhbGxvYyBvZiB0aGUgaW5vZGUgZGF0YS4KIAkgKi8KLQlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJc2ZwID0gKHhmc19kaXIyX3NmX2hkcl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKIAlzZmVwID0gKHhmc19kaXIyX3NmX2VudHJ5X3QgKikoKGNoYXIgKilzZnAgKyBieXRlb2ZmKTsKIAkvKgogCSAqIEZpbGwgaW4gdGhlIG5ldyBlbnRyeS4KQEAgLTQwNiwxNSArNDgwLDE0IEBACiAJc2ZlcC0+bmFtZWxlbiA9IGFyZ3MtPm5hbWVsZW47CiAJeGZzX2RpcjJfc2ZfcHV0X29mZnNldChzZmVwLCBvZmZzZXQpOwogCW1lbWNweShzZmVwLT5uYW1lLCBhcmdzLT5uYW1lLCBzZmVwLT5uYW1lbGVuKTsKLQl4ZnNfZGlyMl9zZl9wdXRfaW51bWJlcihzZnAsICZhcmdzLT5pbnVtYmVyLAotCQl4ZnNfZGlyMl9zZl9pbnVtYmVycChzZmVwKSk7CisJeGZzX2RpcjJfc2ZlX3B1dF9pbm8oc2ZwLCBzZmVwLCBhcmdzLT5pbnVtYmVyKTsKIAkvKgogCSAqIFVwZGF0ZSB0aGUgaGVhZGVyIGFuZCBpbm9kZS4KIAkgKi8KLQlzZnAtPmhkci5jb3VudCsrOworCXNmcC0+Y291bnQrKzsKICNpZiBYRlNfQklHX0lOVU1TCiAJaWYgKGFyZ3MtPmludW1iZXIgPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSkKLQkJc2ZwLT5oZHIuaThjb3VudCsrOworCQlzZnAtPmk4Y291bnQrKzsKICNlbmRpZgogCWRwLT5pX2QuZGlfc2l6ZSA9IG5ld19pc2l6ZTsKIAl4ZnNfZGlyMl9zZl9jaGVjayhhcmdzKTsKQEAgLTQ0NCwxOSArNTE3LDE5IEBACiAJeGZzX2RpcjJfZGF0YV9hb2ZmX3QJb2Zmc2V0OwkJLyogY3VycmVudCBvZmZzZXQgdmFsdWUgKi8KIAlpbnQJCQlvbGRfaXNpemU7CS8qIHByZXZpb3VzIGRpX3NpemUgKi8KIAl4ZnNfZGlyMl9zZl9lbnRyeV90CSpvbGRzZmVwOwkvKiBlbnRyeSBpbiBvcmlnaW5hbCBkaXIgKi8KLQl4ZnNfZGlyMl9zZl90CQkqb2xkc2ZwOwkvKiBvcmlnaW5hbCBzaG9ydGZvcm0gZGlyICovCisJeGZzX2RpcjJfc2ZfaGRyX3QJKm9sZHNmcDsJLyogb3JpZ2luYWwgc2hvcnRmb3JtIGRpciAqLwogCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXA7CQkvKiBlbnRyeSBpbiBuZXcgZGlyICovCi0JeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIG5ldyBzaG9ydGZvcm0gZGlyICovCisJeGZzX2RpcjJfc2ZfaGRyX3QJKnNmcDsJCS8qIG5ldyBzaG9ydGZvcm0gZGlyICovCiAKIAkvKgogCSAqIENvcHkgdGhlIG9sZCBkaXJlY3RvcnkgdG8gdGhlIHN0YWNrIGJ1ZmZlci4KIAkgKi8KIAlkcCA9IGFyZ3MtPmRwOwogCi0Jc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCXNmcCA9ICh4ZnNfZGlyMl9zZl9oZHJfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CiAJb2xkX2lzaXplID0gKGludClkcC0+aV9kLmRpX3NpemU7CiAJYnVmID0ga21lbV9hbGxvYyhvbGRfaXNpemUsIEtNX1NMRUVQKTsKLQlvbGRzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWJ1ZjsKKwlvbGRzZnAgPSAoeGZzX2RpcjJfc2ZfaGRyX3QgKilidWY7CiAJbWVtY3B5KG9sZHNmcCwgc2ZwLCBvbGRfaXNpemUpOwogCS8qCiAJICogTG9vcCBvdmVyIHRoZSBvbGQgZGlyZWN0b3J5IGZpbmRpbmcgdGhlIHBsYWNlIHdlJ3JlIGdvaW5nCkBAIC00ODUsNyArNTU4LDcgQEAKIAkvKgogCSAqIFJlc2V0IHRoZSBwb2ludGVyIHNpbmNlIHRoZSBidWZmZXIgd2FzIHJlYWxsb2NhdGVkLgogCSAqLwotCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOwogCS8qCiAJICogQ29weSB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGlyZWN0b3J5LCBpbmNsdWRpbmcgdGhlIGhlYWRlci4KIAkgKi8KQEAgLTQ5OCwxMiArNTcxLDExIEBACiAJc2ZlcC0+bmFtZWxlbiA9IGFyZ3MtPm5hbWVsZW47CiAJeGZzX2RpcjJfc2ZfcHV0X29mZnNldChzZmVwLCBvZmZzZXQpOwogCW1lbWNweShzZmVwLT5uYW1lLCBhcmdzLT5uYW1lLCBzZmVwLT5uYW1lbGVuKTsKLQl4ZnNfZGlyMl9zZl9wdXRfaW51bWJlcihzZnAsICZhcmdzLT5pbnVtYmVyLAotCQl4ZnNfZGlyMl9zZl9pbnVtYmVycChzZmVwKSk7Ci0Jc2ZwLT5oZHIuY291bnQrKzsKKwl4ZnNfZGlyMl9zZmVfcHV0X2lubyhzZnAsIHNmZXAsIGFyZ3MtPmludW1iZXIpOworCXNmcC0+Y291bnQrKzsKICNpZiBYRlNfQklHX0lOVU1TCiAJaWYgKGFyZ3MtPmludW1iZXIgPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSAmJiAhb2JqY2hhbmdlKQotCQlzZnAtPmhkci5pOGNvdW50Kys7CisJCXNmcC0+aThjb3VudCsrOwogI2VuZGlmCiAJLyoKIAkgKiBJZiB0aGVyZSdzIG1vcmUgbGVmdCB0byBjb3B5LCBkbyB0aGF0LgpAQCAtNTM3LDE0ICs2MDksMTQgQEAKIAl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLwogCXhmc19kaXIyX2RhdGFfYW9mZl90CW9mZnNldDsJCS8qIGRhdGEgYmxvY2sgb2Zmc2V0ICovCiAJeGZzX2RpcjJfc2ZfZW50cnlfdAkqc2ZlcDsJCS8qIHNob3J0Zm9ybSBlbnRyeSAqLwotCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisJeGZzX2RpcjJfc2ZfaGRyX3QJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KIAlpbnQJCQlzaXplOwkJLyogZW50cnkncyBkYXRhIHNpemUgKi8KIAlpbnQJCQl1c2VkOwkJLyogZGF0YSBieXRlcyB1c2VkICovCiAKIAlkcCA9IGFyZ3MtPmRwOwogCW1wID0gZHAtPmlfbW91bnQ7CiAKLQlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJc2ZwID0gKHhmc19kaXIyX3NmX2hkcl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKIAlzaXplID0geGZzX2RpcjJfZGF0YV9lbnRzaXplKGFyZ3MtPm5hbWVsZW4pOwogCW9mZnNldCA9IFhGU19ESVIyX0RBVEFfRklSU1RfT0ZGU0VUOwogCXNmZXAgPSB4ZnNfZGlyMl9zZl9maXJzdGVudHJ5KHNmcCk7CkBAIC01NTQsNyArNjI2LDcgQEAKIAkgKiBLZWVwIHRyYWNrIG9mIGRhdGEgb2Zmc2V0IGFuZCB3aGV0aGVyIHdlJ3ZlIHNlZW4gYSBwbGFjZQogCSAqIHRvIGluc2VydCB0aGUgbmV3IGVudHJ5LgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBzZnAtPmhkci5jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHNmcC0+Y291bnQ7IGkrKykgewogCQlpZiAoIWhvbGVmaXQpCiAJCQlob2xlZml0ID0gb2Zmc2V0ICsgc2l6ZSA8PSB4ZnNfZGlyMl9zZl9nZXRfb2Zmc2V0KHNmZXApOwogCQlvZmZzZXQgPSB4ZnNfZGlyMl9zZl9nZXRfb2Zmc2V0KHNmZXApICsKQEAgLTU2Niw3ICs2MzgsNyBAQAogCSAqIHdhcyBhIGRhdGEgYmxvY2sgKGJsb2NrIGZvcm0gZGlyZWN0b3J5KS4KIAkgKi8KIAl1c2VkID0gb2Zmc2V0ICsKLQkgICAgICAgKHNmcC0+aGRyLmNvdW50ICsgMykgKiAodWludClzaXplb2YoeGZzX2RpcjJfbGVhZl9lbnRyeV90KSArCisJICAgICAgIChzZnAtPmNvdW50ICsgMykgKiAodWludClzaXplb2YoeGZzX2RpcjJfbGVhZl9lbnRyeV90KSArCiAJICAgICAgICh1aW50KXNpemVvZih4ZnNfZGlyMl9ibG9ja190YWlsX3QpOwogCS8qCiAJICogSWYgaXQgd29uJ3QgZml0IGluIGEgYmxvY2sgZm9ybSB0aGVuIHdlIGNhbid0IGluc2VydCBpdCwKQEAgLTYxMiwzMCArNjg0LDMwIEBACiAJeGZzX2lub190CQlpbm87CQkvKiBlbnRyeSBpbm9kZSBudW1iZXIgKi8KIAlpbnQJCQlvZmZzZXQ7CQkvKiBkYXRhIG9mZnNldCAqLwogCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXA7CQkvKiBzaG9ydGZvcm0gZGlyIGVudHJ5ICovCi0JeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9zZl9oZHJfdAkqc2ZwOwkJLyogc2hvcnRmb3JtIHN0cnVjdHVyZSAqLwogCiAJZHAgPSBhcmdzLT5kcDsKIAotCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOwogCW9mZnNldCA9IFhGU19ESVIyX0RBVEFfRklSU1RfT0ZGU0VUOwotCWlubyA9IHhmc19kaXIyX3NmX2dldF9pbnVtYmVyKHNmcCwgJnNmcC0+aGRyLnBhcmVudCk7CisJaW5vID0geGZzX2RpcjJfc2ZfZ2V0X3BhcmVudF9pbm8oc2ZwKTsKIAlpOGNvdW50ID0gaW5vID4gWEZTX0RJUjJfTUFYX1NIT1JUX0lOVU07CiAKIAlmb3IgKGkgPSAwLCBzZmVwID0geGZzX2RpcjJfc2ZfZmlyc3RlbnRyeShzZnApOwotCSAgICAgaSA8IHNmcC0+aGRyLmNvdW50OworCSAgICAgaSA8IHNmcC0+Y291bnQ7CiAJICAgICBpKyssIHNmZXAgPSB4ZnNfZGlyMl9zZl9uZXh0ZW50cnkoc2ZwLCBzZmVwKSkgewogCQlBU1NFUlQoeGZzX2RpcjJfc2ZfZ2V0X29mZnNldChzZmVwKSA+PSBvZmZzZXQpOwotCQlpbm8gPSB4ZnNfZGlyMl9zZl9nZXRfaW51bWJlcihzZnAsIHhmc19kaXIyX3NmX2ludW1iZXJwKHNmZXApKTsKKwkJaW5vID0geGZzX2RpcjJfc2ZlX2dldF9pbm8oc2ZwLCBzZmVwKTsKIAkJaThjb3VudCArPSBpbm8gPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTTsKIAkJb2Zmc2V0ID0KIAkJCXhmc19kaXIyX3NmX2dldF9vZmZzZXQoc2ZlcCkgKwogCQkJeGZzX2RpcjJfZGF0YV9lbnRzaXplKHNmZXAtPm5hbWVsZW4pOwogCX0KLQlBU1NFUlQoaThjb3VudCA9PSBzZnAtPmhkci5pOGNvdW50KTsKKwlBU1NFUlQoaThjb3VudCA9PSBzZnAtPmk4Y291bnQpOwogCUFTU0VSVChYRlNfQklHX0lOVU1TIHx8IGk4Y291bnQgPT0gMCk7CiAJQVNTRVJUKChjaGFyICopc2ZlcCAtIChjaGFyICopc2ZwID09IGRwLT5pX2QuZGlfc2l6ZSk7CiAJQVNTRVJUKG9mZnNldCArCi0JICAgICAgIChzZnAtPmhkci5jb3VudCArIDIpICogKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2xlYWZfZW50cnlfdCkgKworCSAgICAgICAoc2ZwLT5jb3VudCArIDIpICogKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2xlYWZfZW50cnlfdCkgKwogCSAgICAgICAodWludClzaXplb2YoeGZzX2RpcjJfYmxvY2tfdGFpbF90KSA8PQogCSAgICAgICBkcC0+aV9tb3VudC0+bV9kaXJibGtzaXplKTsKIH0KQEAgLTY1MSw3ICs3MjMsNyBAQAogewogCXhmc19pbm9kZV90CSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KIAlpbnQJCWk4Y291bnQ7CS8qIHBhcmVudCBpbm9kZSBpcyBhbiA4LWJ5dGUgbnVtYmVyICovCi0JeGZzX2RpcjJfc2ZfdAkqc2ZwOwkJLyogc2hvcnRmb3JtIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX3NmX2hkcl90ICpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCiAJaW50CQlzaXplOwkJLyogZGlyZWN0b3J5IHNpemUgKi8KIAogCXRyYWNlX3hmc19kaXIyX3NmX2NyZWF0ZShhcmdzKTsKQEAgLTY4MSwxMyArNzUzLDEzIEBACiAJLyoKIAkgKiBGaWxsIGluIHRoZSBoZWFkZXIsCiAJICovCi0Jc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOwotCXNmcC0+aGRyLmk4Y291bnQgPSBpOGNvdW50OworCXNmcCA9ICh4ZnNfZGlyMl9zZl9oZHJfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJc2ZwLT5pOGNvdW50ID0gaThjb3VudDsKIAkvKgogCSAqIE5vdyBjYW4gcHV0IGluIHRoZSBpbm9kZSBudW1iZXIsIHNpbmNlIGk4Y291bnQgaXMgc2V0LgogCSAqLwotCXhmc19kaXIyX3NmX3B1dF9pbnVtYmVyKHNmcCwgJnBpbm8sICZzZnAtPmhkci5wYXJlbnQpOwotCXNmcC0+aGRyLmNvdW50ID0gMDsKKwl4ZnNfZGlyMl9zZl9wdXRfcGFyZW50X2lubyhzZnAsIHBpbm8pOworCXNmcC0+Y291bnQgPSAwOwogCWRwLT5pX2QuZGlfc2l6ZSA9IHNpemU7CiAJeGZzX2RpcjJfc2ZfY2hlY2soYXJncyk7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19EREFUQSk7CkBAIC03MDUsNyArNzc3LDcgQEAKIAl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLwogCXhmc19kaXIyX2RhdGFwdHJfdAlvZmY7CQkvKiBjdXJyZW50IGVudHJ5J3Mgb2Zmc2V0ICovCiAJeGZzX2RpcjJfc2ZfZW50cnlfdAkqc2ZlcDsJCS8qIHNob3J0Zm9ybSBkaXJlY3RvcnkgZW50cnkgKi8KLQl4ZnNfZGlyMl9zZl90CQkqc2ZwOwkJLyogc2hvcnRmb3JtIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX3NmX2hkcl90CSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCiAJeGZzX2RpcjJfZGF0YXB0cl90CWRvdF9vZmZzZXQ7CiAJeGZzX2RpcjJfZGF0YXB0cl90CWRvdGRvdF9vZmZzZXQ7CiAJeGZzX2lub190CQlpbm87CkBAIC03MjQsOSArNzk2LDkgQEAKIAlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gZHAtPmlfZC5kaV9zaXplKTsKIAlBU1NFUlQoZHAtPmlfZGYuaWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKIAotCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOwogCi0JQVNTRVJUKGRwLT5pX2QuZGlfc2l6ZSA+PSB4ZnNfZGlyMl9zZl9oZHJfc2l6ZShzZnAtPmhkci5pOGNvdW50KSk7CisJQVNTRVJUKGRwLT5pX2QuZGlfc2l6ZSA+PSB4ZnNfZGlyMl9zZl9oZHJfc2l6ZShzZnAtPmk4Y291bnQpKTsKIAogCS8qCiAJICogSWYgdGhlIGJsb2NrIG51bWJlciBpbiB0aGUgb2Zmc2V0IGlzIG91dCBvZiByYW5nZSwgd2UncmUgZG9uZS4KQEAgLTc1OSw3ICs4MzEsNyBAQAogCSAqIFB1dCAuLiBlbnRyeSB1bmxlc3Mgd2UncmUgc3RhcnRpbmcgcGFzdCBpdC4KIAkgKi8KIAlpZiAoKm9mZnNldCA8PSBkb3Rkb3Rfb2Zmc2V0KSB7Ci0JCWlubyA9IHhmc19kaXIyX3NmX2dldF9pbnVtYmVyKHNmcCwgJnNmcC0+aGRyLnBhcmVudCk7CisJCWlubyA9IHhmc19kaXIyX3NmX2dldF9wYXJlbnRfaW5vKHNmcCk7CiAJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZG90ZG90X29mZnNldCAmIDB4N2ZmZmZmZmYsIGlubywgRFRfRElSKSkgewogCQkJKm9mZnNldCA9IGRvdGRvdF9vZmZzZXQgJiAweDdmZmZmZmZmOwogCQkJcmV0dXJuIDA7CkBAIC03NzAsNyArODQyLDcgQEAKIAkgKiBMb29wIHdoaWxlIHRoZXJlIGFyZSBtb3JlIGVudHJpZXMgYW5kIHB1dCdpbmcgd29ya3MuCiAJICovCiAJc2ZlcCA9IHhmc19kaXIyX3NmX2ZpcnN0ZW50cnkoc2ZwKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2ZwLT5oZHIuY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBzZnAtPmNvdW50OyBpKyspIHsKIAkJb2ZmID0geGZzX2RpcjJfZGJfb2ZmX3RvX2RhdGFwdHIobXAsIG1wLT5tX2RpcmRhdGFibGssCiAJCQkJeGZzX2RpcjJfc2ZfZ2V0X29mZnNldChzZmVwKSk7CiAKQEAgLTc3OSw3ICs4NTEsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlpbm8gPSB4ZnNfZGlyMl9zZl9nZXRfaW51bWJlcihzZnAsIHhmc19kaXIyX3NmX2ludW1iZXJwKHNmZXApKTsKKwkJaW5vID0geGZzX2RpcjJfc2ZlX2dldF9pbm8oc2ZwLCBzZmVwKTsKIAkJaWYgKGZpbGxkaXIoZGlyZW50LCAoY2hhciAqKXNmZXAtPm5hbWUsIHNmZXAtPm5hbWVsZW4sCiAJCQkgICAgb2ZmICYgMHg3ZmZmZmZmZiwgaW5vLCBEVF9VTktOT1dOKSkgewogCQkJKm9mZnNldCA9IG9mZiAmIDB4N2ZmZmZmZmY7CkBAIC04MDUsNyArODc3LDcgQEAKIAlpbnQJCQlpOwkJLyogZW50cnkgaW5kZXggKi8KIAlpbnQJCQllcnJvcjsKIAl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2hvcnRmb3JtIGRpcmVjdG9yeSBlbnRyeSAqLwotCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisJeGZzX2RpcjJfc2ZfaGRyX3QJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KIAllbnVtIHhmc19kYWNtcAkJY21wOwkJLyogY29tcGFyaXNvbiByZXN1bHQgKi8KIAl4ZnNfZGlyMl9zZl9lbnRyeV90CSpjaV9zZmVwOwkvKiBjYXNlLWluc2Vucy4gZW50cnkgKi8KIApAQCAtODI0LDggKzg5Niw4IEBACiAJfQogCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOwogCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOwotCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKLQlBU1NFUlQoZHAtPmlfZC5kaV9zaXplID49IHhmc19kaXIyX3NmX2hkcl9zaXplKHNmcC0+aGRyLmk4Y291bnQpKTsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCUFTU0VSVChkcC0+aV9kLmRpX3NpemUgPj0geGZzX2RpcjJfc2ZfaGRyX3NpemUoc2ZwLT5pOGNvdW50KSk7CiAJLyoKIAkgKiBTcGVjaWFsIGNhc2UgZm9yIC4KIAkgKi8KQEAgLTgzOSw3ICs5MTEsNyBAQAogCSAqLwogCWlmIChhcmdzLT5uYW1lbGVuID09IDIgJiYKIAkgICAgYXJncy0+bmFtZVswXSA9PSAnLicgJiYgYXJncy0+bmFtZVsxXSA9PSAnLicpIHsKLQkJYXJncy0+aW51bWJlciA9IHhmc19kaXIyX3NmX2dldF9pbnVtYmVyKHNmcCwgJnNmcC0+aGRyLnBhcmVudCk7CisJCWFyZ3MtPmludW1iZXIgPSB4ZnNfZGlyMl9zZl9nZXRfcGFyZW50X2lubyhzZnApOwogCQlhcmdzLT5jbXByZXN1bHQgPSBYRlNfQ01QX0VYQUNUOwogCQlyZXR1cm4gWEZTX0VSUk9SKEVFWElTVCk7CiAJfQpAQCAtODQ3LDcgKzkxOSw3IEBACiAJICogTG9vcCBvdmVyIGFsbCB0aGUgZW50cmllcyB0cnlpbmcgdG8gbWF0Y2ggb3Vycy4KIAkgKi8KIAljaV9zZmVwID0gTlVMTDsKLQlmb3IgKGkgPSAwLCBzZmVwID0geGZzX2RpcjJfc2ZfZmlyc3RlbnRyeShzZnApOyBpIDwgc2ZwLT5oZHIuY291bnQ7CisJZm9yIChpID0gMCwgc2ZlcCA9IHhmc19kaXIyX3NmX2ZpcnN0ZW50cnkoc2ZwKTsgaSA8IHNmcC0+Y291bnQ7CiAJCQkJaSsrLCBzZmVwID0geGZzX2RpcjJfc2ZfbmV4dGVudHJ5KHNmcCwgc2ZlcCkpIHsKIAkJLyoKIAkJICogQ29tcGFyZSBuYW1lIGFuZCBpZiBpdCdzIGFuIGV4YWN0IG1hdGNoLCByZXR1cm4gdGhlIGlub2RlCkBAIC04NTgsOCArOTMwLDcgQEAKIAkJCQkJCQkJc2ZlcC0+bmFtZWxlbik7CiAJCWlmIChjbXAgIT0gWEZTX0NNUF9ESUZGRVJFTlQgJiYgY21wICE9IGFyZ3MtPmNtcHJlc3VsdCkgewogCQkJYXJncy0+Y21wcmVzdWx0ID0gY21wOwotCQkJYXJncy0+aW51bWJlciA9IHhmc19kaXIyX3NmX2dldF9pbnVtYmVyKHNmcCwKLQkJCQkJCXhmc19kaXIyX3NmX2ludW1iZXJwKHNmZXApKTsKKwkJCWFyZ3MtPmludW1iZXIgPSB4ZnNfZGlyMl9zZmVfZ2V0X2lubyhzZnAsIHNmZXApOwogCQkJaWYgKGNtcCA9PSBYRlNfQ01QX0VYQUNUKQogCQkJCXJldHVybiBYRlNfRVJST1IoRUVYSVNUKTsKIAkJCWNpX3NmZXAgPSBzZmVwOwpAQCAtODkxLDcgKzk2Miw3IEBACiAJaW50CQkJbmV3c2l6ZTsJLyogbmV3IGlub2RlIHNpemUgKi8KIAlpbnQJCQlvbGRzaXplOwkvKiBvbGQgaW5vZGUgc2l6ZSAqLwogCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXA7CQkvKiBzaG9ydGZvcm0gZGlyZWN0b3J5IGVudHJ5ICovCi0JeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9zZl9oZHJfdAkqc2ZwOwkJLyogc2hvcnRmb3JtIHN0cnVjdHVyZSAqLwogCiAJdHJhY2VfeGZzX2RpcjJfc2ZfcmVtb3ZlbmFtZShhcmdzKTsKIApAQCAtOTA4LDMyICs5NzksMzEgQEAKIAl9CiAJQVNTRVJUKGRwLT5pX2RmLmlmX2J5dGVzID09IG9sZHNpemUpOwogCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOwotCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKLQlBU1NFUlQob2xkc2l6ZSA+PSB4ZnNfZGlyMl9zZl9oZHJfc2l6ZShzZnAtPmhkci5pOGNvdW50KSk7CisJc2ZwID0gKHhmc19kaXIyX3NmX2hkcl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlBU1NFUlQob2xkc2l6ZSA+PSB4ZnNfZGlyMl9zZl9oZHJfc2l6ZShzZnAtPmk4Y291bnQpKTsKIAkvKgogCSAqIExvb3Agb3ZlciB0aGUgb2xkIGRpcmVjdG9yeSBlbnRyaWVzLgogCSAqIEZpbmQgdGhlIG9uZSB3ZSdyZSBkZWxldGluZy4KIAkgKi8KLQlmb3IgKGkgPSAwLCBzZmVwID0geGZzX2RpcjJfc2ZfZmlyc3RlbnRyeShzZnApOyBpIDwgc2ZwLT5oZHIuY291bnQ7CisJZm9yIChpID0gMCwgc2ZlcCA9IHhmc19kaXIyX3NmX2ZpcnN0ZW50cnkoc2ZwKTsgaSA8IHNmcC0+Y291bnQ7CiAJCQkJaSsrLCBzZmVwID0geGZzX2RpcjJfc2ZfbmV4dGVudHJ5KHNmcCwgc2ZlcCkpIHsKIAkJaWYgKHhmc19kYV9jb21wbmFtZShhcmdzLCBzZmVwLT5uYW1lLCBzZmVwLT5uYW1lbGVuKSA9PQogCQkJCQkJCQlYRlNfQ01QX0VYQUNUKSB7Ci0JCQlBU1NFUlQoeGZzX2RpcjJfc2ZfZ2V0X2ludW1iZXIoc2ZwLAotCQkJCQkJeGZzX2RpcjJfc2ZfaW51bWJlcnAoc2ZlcCkpID09Ci0JCQkJCQkJCWFyZ3MtPmludW1iZXIpOworCQkJQVNTRVJUKHhmc19kaXIyX3NmZV9nZXRfaW5vKHNmcCwgc2ZlcCkgPT0KKwkJCSAgICAgICBhcmdzLT5pbnVtYmVyKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCS8qCiAJICogRGlkbid0IGZpbmQgaXQuCiAJICovCi0JaWYgKGkgPT0gc2ZwLT5oZHIuY291bnQpCisJaWYgKGkgPT0gc2ZwLT5jb3VudCkKIAkJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOwogCS8qCiAJICogQ2FsY3VsYXRlIHNpemVzLgogCSAqLwogCWJ5dGVvZmYgPSAoaW50KSgoY2hhciAqKXNmZXAgLSAoY2hhciAqKXNmcCk7Ci0JZW50c2l6ZSA9IHhmc19kaXIyX3NmX2VudHNpemVfYnluYW1lKHNmcCwgYXJncy0+bmFtZWxlbik7CisJZW50c2l6ZSA9IHhmc19kaXIyX3NmX2VudHNpemUoc2ZwLCBhcmdzLT5uYW1lbGVuKTsKIAluZXdzaXplID0gb2xkc2l6ZSAtIGVudHNpemU7CiAJLyoKIAkgKiBDb3B5IHRoZSBwYXJ0IGlmIGFueSBhZnRlciB0aGUgcmVtb3ZlZCBlbnRyeSwgc2xpZGluZyBpdCBkb3duLgpAQCAtOTQ0LDIyICsxMDE0LDIyIEBACiAJLyoKIAkgKiBGaXggdXAgdGhlIGhlYWRlciBhbmQgZmlsZSBzaXplLgogCSAqLwotCXNmcC0+aGRyLmNvdW50LS07CisJc2ZwLT5jb3VudC0tOwogCWRwLT5pX2QuZGlfc2l6ZSA9IG5ld3NpemU7CiAJLyoKIAkgKiBSZWFsbG9jYXRlLCBtYWtpbmcgaXQgc21hbGxlci4KIAkgKi8KIAl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgbmV3c2l6ZSAtIG9sZHNpemUsIFhGU19EQVRBX0ZPUkspOwotCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOwogI2lmIFhGU19CSUdfSU5VTVMKIAkvKgogCSAqIEFyZSB3ZSBjaGFuZ2luZyBpbm9kZSBudW1iZXIgc2l6ZT8KIAkgKi8KIAlpZiAoYXJncy0+aW51bWJlciA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNKSB7Ci0JCWlmIChzZnAtPmhkci5pOGNvdW50ID09IDEpCisJCWlmIChzZnAtPmk4Y291bnQgPT0gMSkKIAkJCXhmc19kaXIyX3NmX3RvaW5vNChhcmdzKTsKIAkJZWxzZQotCQkJc2ZwLT5oZHIuaThjb3VudC0tOworCQkJc2ZwLT5pOGNvdW50LS07CiAJfQogI2VuZGlmCiAJeGZzX2RpcjJfc2ZfY2hlY2soYXJncyk7CkBAIC05ODMsNyArMTA1Myw3IEBACiAJaW50CQkJaThlbGV2YXRlZDsJLyogc2ZfdG9pbm84IHNldCBpOGNvdW50PTEgKi8KICNlbmRpZgogCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXA7CQkvKiBzaG9ydGZvcm0gZGlyZWN0b3J5IGVudHJ5ICovCi0JeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9zZl9oZHJfdAkqc2ZwOwkJLyogc2hvcnRmb3JtIHN0cnVjdHVyZSAqLwogCiAJdHJhY2VfeGZzX2RpcjJfc2ZfcmVwbGFjZShhcmdzKTsKIApAQCAtOTk5LDE5ICsxMDY5LDE5IEBACiAJfQogCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOwogCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOwotCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKLQlBU1NFUlQoZHAtPmlfZC5kaV9zaXplID49IHhmc19kaXIyX3NmX2hkcl9zaXplKHNmcC0+aGRyLmk4Y291bnQpKTsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCUFTU0VSVChkcC0+aV9kLmRpX3NpemUgPj0geGZzX2RpcjJfc2ZfaGRyX3NpemUoc2ZwLT5pOGNvdW50KSk7CiAjaWYgWEZTX0JJR19JTlVNUwogCS8qCiAJICogTmV3IGlub2RlIG51bWJlciBpcyBsYXJnZSwgYW5kIG5lZWQgdG8gY29udmVydCB0byA4LWJ5dGUgaW5vZGVzLgogCSAqLwotCWlmIChhcmdzLT5pbnVtYmVyID4gWEZTX0RJUjJfTUFYX1NIT1JUX0lOVU0gJiYgc2ZwLT5oZHIuaThjb3VudCA9PSAwKSB7CisJaWYgKGFyZ3MtPmludW1iZXIgPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSAmJiBzZnAtPmk4Y291bnQgPT0gMCkgewogCQlpbnQJZXJyb3I7CQkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCiAJCWludAluZXdzaXplOwkJLyogbmV3IGlub2RlIHNpemUgKi8KIAogCQluZXdzaXplID0KIAkJCWRwLT5pX2RmLmlmX2J5dGVzICsKLQkJCShzZnAtPmhkci5jb3VudCArIDEpICoKKwkJCShzZnAtPmNvdW50ICsgMSkgKgogCQkJKCh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm84X3QpIC0KIAkJCSAodWludClzaXplb2YoeGZzX2RpcjJfaW5vNF90KSk7CiAJCS8qCkBAIC0xMDI5LDcgKzEwOTksNyBAQAogCQkgKi8KIAkJeGZzX2RpcjJfc2ZfdG9pbm84KGFyZ3MpOwogCQlpOGVsZXZhdGVkID0gMTsKLQkJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCQlzZnAgPSAoeGZzX2RpcjJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOwogCX0gZWxzZQogCQlpOGVsZXZhdGVkID0gMDsKICNlbmRpZgpAQCAtMTA0MCwzNCArMTExMCwzMiBAQAogCWlmIChhcmdzLT5uYW1lbGVuID09IDIgJiYKIAkgICAgYXJncy0+bmFtZVswXSA9PSAnLicgJiYgYXJncy0+bmFtZVsxXSA9PSAnLicpIHsKICNpZiBYRlNfQklHX0lOVU1TIHx8IGRlZmluZWQoREVCVUcpCi0JCWlubyA9IHhmc19kaXIyX3NmX2dldF9pbnVtYmVyKHNmcCwgJnNmcC0+aGRyLnBhcmVudCk7CisJCWlubyA9IHhmc19kaXIyX3NmX2dldF9wYXJlbnRfaW5vKHNmcCk7CiAJCUFTU0VSVChhcmdzLT5pbnVtYmVyICE9IGlubyk7CiAjZW5kaWYKLQkJeGZzX2RpcjJfc2ZfcHV0X2ludW1iZXIoc2ZwLCAmYXJncy0+aW51bWJlciwgJnNmcC0+aGRyLnBhcmVudCk7CisJCXhmc19kaXIyX3NmX3B1dF9wYXJlbnRfaW5vKHNmcCwgYXJncy0+aW51bWJlcik7CiAJfQogCS8qCiAJICogTm9ybWFsIGVudHJ5LCBsb29rIGZvciB0aGUgbmFtZS4KIAkgKi8KIAllbHNlIHsKIAkJZm9yIChpID0gMCwgc2ZlcCA9IHhmc19kaXIyX3NmX2ZpcnN0ZW50cnkoc2ZwKTsKLQkJCQlpIDwgc2ZwLT5oZHIuY291bnQ7CisJCQkJaSA8IHNmcC0+Y291bnQ7CiAJCQkJaSsrLCBzZmVwID0geGZzX2RpcjJfc2ZfbmV4dGVudHJ5KHNmcCwgc2ZlcCkpIHsKIAkJCWlmICh4ZnNfZGFfY29tcG5hbWUoYXJncywgc2ZlcC0+bmFtZSwgc2ZlcC0+bmFtZWxlbikgPT0KIAkJCQkJCQkJWEZTX0NNUF9FWEFDVCkgewogI2lmIFhGU19CSUdfSU5VTVMgfHwgZGVmaW5lZChERUJVRykKLQkJCQlpbm8gPSB4ZnNfZGlyMl9zZl9nZXRfaW51bWJlcihzZnAsCi0JCQkJCXhmc19kaXIyX3NmX2ludW1iZXJwKHNmZXApKTsKKwkJCQlpbm8gPSB4ZnNfZGlyMl9zZmVfZ2V0X2lubyhzZnAsIHNmZXApOwogCQkJCUFTU0VSVChhcmdzLT5pbnVtYmVyICE9IGlubyk7CiAjZW5kaWYKLQkJCQl4ZnNfZGlyMl9zZl9wdXRfaW51bWJlcihzZnAsICZhcmdzLT5pbnVtYmVyLAotCQkJCQl4ZnNfZGlyMl9zZl9pbnVtYmVycChzZmVwKSk7CisJCQkJeGZzX2RpcjJfc2ZlX3B1dF9pbm8oc2ZwLCBzZmVwLCBhcmdzLT5pbnVtYmVyKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCQkvKgogCQkgKiBEaWRuJ3QgZmluZCBpdC4KIAkJICovCi0JCWlmIChpID09IHNmcC0+aGRyLmNvdW50KSB7CisJCWlmIChpID09IHNmcC0+Y291bnQpIHsKIAkJCUFTU0VSVChhcmdzLT5vcF9mbGFncyAmIFhGU19EQV9PUF9PS05PRU5UKTsKICNpZiBYRlNfQklHX0lOVU1TCiAJCQlpZiAoaThlbGV2YXRlZCkKQEAgLTEwODUsMTAgKzExNTMsMTAgQEAKIAkJLyoKIAkJICogQW5kIHRoZSBvbGQgY291bnQgd2FzIG9uZSwgc28gbmVlZCB0byBjb252ZXJ0IHRvIHNtYWxsLgogCQkgKi8KLQkJaWYgKHNmcC0+aGRyLmk4Y291bnQgPT0gMSkKKwkJaWYgKHNmcC0+aThjb3VudCA9PSAxKQogCQkJeGZzX2RpcjJfc2ZfdG9pbm80KGFyZ3MpOwogCQllbHNlCi0JCQlzZnAtPmhkci5pOGNvdW50LS07CisJCQlzZnAtPmk4Y291bnQtLTsKIAl9CiAJLyoKIAkgKiBTZWUgaWYgdGhlIG9sZCBudW1iZXIgd2FzIHNtYWxsLCB0aGUgbmV3IG51bWJlciBpcyBsYXJnZS4KQEAgLTEwOTksOSArMTE2Nyw5IEBACiAJCSAqIGFkZCB0byB0aGUgaThjb3VudCB1bmxlc3Mgd2UganVzdCBjb252ZXJ0ZWQgdG8gOC1ieXRlCiAJCSAqIGlub2RlcyAod2hpY2ggZG9lcyBhbiBpbXBsaWVkIGk4Y291bnQgPSAxKQogCQkgKi8KLQkJQVNTRVJUKHNmcC0+aGRyLmk4Y291bnQgIT0gMCk7CisJCUFTU0VSVChzZnAtPmk4Y291bnQgIT0gMCk7CiAJCWlmICghaThlbGV2YXRlZCkKLQkJCXNmcC0+aGRyLmk4Y291bnQrKzsKKwkJCXNmcC0+aThjb3VudCsrOwogCX0KICNlbmRpZgogCXhmc19kaXIyX3NmX2NoZWNrKGFyZ3MpOwpAQCAtMTEyMSwxMyArMTE4OSwxMiBAQAogCWNoYXIJCQkqYnVmOwkJLyogb2xkIGRpcidzIGJ1ZmZlciAqLwogCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCiAJaW50CQkJaTsJCS8qIGVudHJ5IGluZGV4ICovCi0JeGZzX2lub190CQlpbm87CQkvKiBlbnRyeSBpbm9kZSBudW1iZXIgKi8KIAlpbnQJCQluZXdzaXplOwkvKiBuZXcgaW5vZGUgc2l6ZSAqLwogCXhmc19kaXIyX3NmX2VudHJ5X3QJKm9sZHNmZXA7CS8qIG9sZCBzZiBlbnRyeSAqLwotCXhmc19kaXIyX3NmX3QJCSpvbGRzZnA7CS8qIG9sZCBzZiBkaXJlY3RvcnkgKi8KKwl4ZnNfZGlyMl9zZl9oZHJfdAkqb2xkc2ZwOwkvKiBvbGQgc2YgZGlyZWN0b3J5ICovCiAJaW50CQkJb2xkc2l6ZTsJLyogb2xkIGlub2RlIHNpemUgKi8KIAl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogbmV3IHNmIGVudHJ5ICovCi0JeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIG5ldyBzZiBkaXJlY3RvcnkgKi8KKwl4ZnNfZGlyMl9zZl9oZHJfdAkqc2ZwOwkJLyogbmV3IHNmIGRpcmVjdG9yeSAqLwogCiAJdHJhY2VfeGZzX2RpcjJfc2ZfdG9pbm80KGFyZ3MpOwogCkBAIC0xMTQwLDQ0ICsxMjA3LDQyIEBACiAJICovCiAJb2xkc2l6ZSA9IGRwLT5pX2RmLmlmX2J5dGVzOwogCWJ1ZiA9IGttZW1fYWxsb2Mob2xkc2l6ZSwgS01fU0xFRVApOwotCW9sZHNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKLQlBU1NFUlQob2xkc2ZwLT5oZHIuaThjb3VudCA9PSAxKTsKKwlvbGRzZnAgPSAoeGZzX2RpcjJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCUFTU0VSVChvbGRzZnAtPmk4Y291bnQgPT0gMSk7CiAJbWVtY3B5KGJ1Ziwgb2xkc2ZwLCBvbGRzaXplKTsKIAkvKgogCSAqIENvbXB1dGUgdGhlIG5ldyBpbm9kZSBzaXplLgogCSAqLwogCW5ld3NpemUgPQogCQlvbGRzaXplIC0KLQkJKG9sZHNmcC0+aGRyLmNvdW50ICsgMSkgKgorCQkob2xkc2ZwLT5jb3VudCArIDEpICoKIAkJKCh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm84X3QpIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzRfdCkpOwogCXhmc19pZGF0YV9yZWFsbG9jKGRwLCAtb2xkc2l6ZSwgWEZTX0RBVEFfRk9SSyk7CiAJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIG5ld3NpemUsIFhGU19EQVRBX0ZPUkspOwogCS8qCiAJICogUmVzZXQgb3VyIHBvaW50ZXJzLCB0aGUgZGF0YSBoYXMgbW92ZWQuCiAJICovCi0Jb2xkc2ZwID0gKHhmc19kaXIyX3NmX3QgKilidWY7Ci0Jc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCW9sZHNmcCA9ICh4ZnNfZGlyMl9zZl9oZHJfdCAqKWJ1ZjsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOwogCS8qCiAJICogRmlsbCBpbiB0aGUgbmV3IGhlYWRlci4KIAkgKi8KLQlzZnAtPmhkci5jb3VudCA9IG9sZHNmcC0+aGRyLmNvdW50OwotCXNmcC0+aGRyLmk4Y291bnQgPSAwOwotCWlubyA9IHhmc19kaXIyX3NmX2dldF9pbnVtYmVyKG9sZHNmcCwgJm9sZHNmcC0+aGRyLnBhcmVudCk7Ci0JeGZzX2RpcjJfc2ZfcHV0X2ludW1iZXIoc2ZwLCAmaW5vLCAmc2ZwLT5oZHIucGFyZW50KTsKKwlzZnAtPmNvdW50ID0gb2xkc2ZwLT5jb3VudDsKKwlzZnAtPmk4Y291bnQgPSAwOworCXhmc19kaXIyX3NmX3B1dF9wYXJlbnRfaW5vKHNmcCwgeGZzX2RpcjJfc2ZfZ2V0X3BhcmVudF9pbm8ob2xkc2ZwKSk7CiAJLyoKIAkgKiBDb3B5IHRoZSBlbnRyaWVzIGZpZWxkIGJ5IGZpZWxkLgogCSAqLwogCWZvciAoaSA9IDAsIHNmZXAgPSB4ZnNfZGlyMl9zZl9maXJzdGVudHJ5KHNmcCksCiAJCSAgICBvbGRzZmVwID0geGZzX2RpcjJfc2ZfZmlyc3RlbnRyeShvbGRzZnApOwotCSAgICAgaSA8IHNmcC0+aGRyLmNvdW50OworCSAgICAgaSA8IHNmcC0+Y291bnQ7CiAJICAgICBpKyssIHNmZXAgPSB4ZnNfZGlyMl9zZl9uZXh0ZW50cnkoc2ZwLCBzZmVwKSwKIAkJICBvbGRzZmVwID0geGZzX2RpcjJfc2ZfbmV4dGVudHJ5KG9sZHNmcCwgb2xkc2ZlcCkpIHsKIAkJc2ZlcC0+bmFtZWxlbiA9IG9sZHNmZXAtPm5hbWVsZW47CiAJCXNmZXAtPm9mZnNldCA9IG9sZHNmZXAtPm9mZnNldDsKIAkJbWVtY3B5KHNmZXAtPm5hbWUsIG9sZHNmZXAtPm5hbWUsIHNmZXAtPm5hbWVsZW4pOwotCQlpbm8gPSB4ZnNfZGlyMl9zZl9nZXRfaW51bWJlcihvbGRzZnAsCi0JCQl4ZnNfZGlyMl9zZl9pbnVtYmVycChvbGRzZmVwKSk7Ci0JCXhmc19kaXIyX3NmX3B1dF9pbnVtYmVyKHNmcCwgJmlubywgeGZzX2RpcjJfc2ZfaW51bWJlcnAoc2ZlcCkpOworCQl4ZnNfZGlyMl9zZmVfcHV0X2lubyhzZnAsIHNmZXAsCisJCQl4ZnNfZGlyMl9zZmVfZ2V0X2lubyhvbGRzZnAsIG9sZHNmZXApKTsKIAl9CiAJLyoKIAkgKiBDbGVhbiB1cCB0aGUgaW5vZGUuCkBAIC0xMTk5LDEzICsxMjY0LDEyIEBACiAJY2hhcgkJCSpidWY7CQkvKiBvbGQgZGlyJ3MgYnVmZmVyICovCiAJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KIAlpbnQJCQlpOwkJLyogZW50cnkgaW5kZXggKi8KLQl4ZnNfaW5vX3QJCWlubzsJCS8qIGVudHJ5IGlub2RlIG51bWJlciAqLwogCWludAkJCW5ld3NpemU7CS8qIG5ldyBpbm9kZSBzaXplICovCiAJeGZzX2RpcjJfc2ZfZW50cnlfdAkqb2xkc2ZlcDsJLyogb2xkIHNmIGVudHJ5ICovCi0JeGZzX2RpcjJfc2ZfdAkJKm9sZHNmcDsJLyogb2xkIHNmIGRpcmVjdG9yeSAqLworCXhmc19kaXIyX3NmX2hkcl90CSpvbGRzZnA7CS8qIG9sZCBzZiBkaXJlY3RvcnkgKi8KIAlpbnQJCQlvbGRzaXplOwkvKiBvbGQgaW5vZGUgc2l6ZSAqLwogCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXA7CQkvKiBuZXcgc2YgZW50cnkgKi8KLQl4ZnNfZGlyMl9zZl90CQkqc2ZwOwkJLyogbmV3IHNmIGRpcmVjdG9yeSAqLworCXhmc19kaXIyX3NmX2hkcl90CSpzZnA7CQkvKiBuZXcgc2YgZGlyZWN0b3J5ICovCiAKIAl0cmFjZV94ZnNfZGlyMl9zZl90b2lubzgoYXJncyk7CiAKQEAgLTEyMTgsNDQgKzEyODIsNDIgQEAKIAkgKi8KIAlvbGRzaXplID0gZHAtPmlfZGYuaWZfYnl0ZXM7CiAJYnVmID0ga21lbV9hbGxvYyhvbGRzaXplLCBLTV9TTEVFUCk7Ci0Jb2xkc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOwotCUFTU0VSVChvbGRzZnAtPmhkci5pOGNvdW50ID09IDApOworCW9sZHNmcCA9ICh4ZnNfZGlyMl9zZl9oZHJfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJQVNTRVJUKG9sZHNmcC0+aThjb3VudCA9PSAwKTsKIAltZW1jcHkoYnVmLCBvbGRzZnAsIG9sZHNpemUpOwogCS8qCiAJICogQ29tcHV0ZSB0aGUgbmV3IGlub2RlIHNpemUuCiAJICovCiAJbmV3c2l6ZSA9CiAJCW9sZHNpemUgKwotCQkob2xkc2ZwLT5oZHIuY291bnQgKyAxKSAqCisJCShvbGRzZnAtPmNvdW50ICsgMSkgKgogCQkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLSAodWludClzaXplb2YoeGZzX2RpcjJfaW5vNF90KSk7CiAJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIC1vbGRzaXplLCBYRlNfREFUQV9GT1JLKTsKIAl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgbmV3c2l6ZSwgWEZTX0RBVEFfRk9SSyk7CiAJLyoKIAkgKiBSZXNldCBvdXIgcG9pbnRlcnMsIHRoZSBkYXRhIGhhcyBtb3ZlZC4KIAkgKi8KLQlvbGRzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWJ1ZjsKLQlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJb2xkc2ZwID0gKHhmc19kaXIyX3NmX2hkcl90ICopYnVmOworCXNmcCA9ICh4ZnNfZGlyMl9zZl9oZHJfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CiAJLyoKIAkgKiBGaWxsIGluIHRoZSBuZXcgaGVhZGVyLgogCSAqLwotCXNmcC0+aGRyLmNvdW50ID0gb2xkc2ZwLT5oZHIuY291bnQ7Ci0Jc2ZwLT5oZHIuaThjb3VudCA9IDE7Ci0JaW5vID0geGZzX2RpcjJfc2ZfZ2V0X2ludW1iZXIob2xkc2ZwLCAmb2xkc2ZwLT5oZHIucGFyZW50KTsKLQl4ZnNfZGlyMl9zZl9wdXRfaW51bWJlcihzZnAsICZpbm8sICZzZnAtPmhkci5wYXJlbnQpOworCXNmcC0+Y291bnQgPSBvbGRzZnAtPmNvdW50OworCXNmcC0+aThjb3VudCA9IDE7CisJeGZzX2RpcjJfc2ZfcHV0X3BhcmVudF9pbm8oc2ZwLCB4ZnNfZGlyMl9zZl9nZXRfcGFyZW50X2lubyhvbGRzZnApKTsKIAkvKgogCSAqIENvcHkgdGhlIGVudHJpZXMgZmllbGQgYnkgZmllbGQuCiAJICovCiAJZm9yIChpID0gMCwgc2ZlcCA9IHhmc19kaXIyX3NmX2ZpcnN0ZW50cnkoc2ZwKSwKIAkJICAgIG9sZHNmZXAgPSB4ZnNfZGlyMl9zZl9maXJzdGVudHJ5KG9sZHNmcCk7Ci0JICAgICBpIDwgc2ZwLT5oZHIuY291bnQ7CisJICAgICBpIDwgc2ZwLT5jb3VudDsKIAkgICAgIGkrKywgc2ZlcCA9IHhmc19kaXIyX3NmX25leHRlbnRyeShzZnAsIHNmZXApLAogCQkgIG9sZHNmZXAgPSB4ZnNfZGlyMl9zZl9uZXh0ZW50cnkob2xkc2ZwLCBvbGRzZmVwKSkgewogCQlzZmVwLT5uYW1lbGVuID0gb2xkc2ZlcC0+bmFtZWxlbjsKIAkJc2ZlcC0+b2Zmc2V0ID0gb2xkc2ZlcC0+b2Zmc2V0OwogCQltZW1jcHkoc2ZlcC0+bmFtZSwgb2xkc2ZlcC0+bmFtZSwgc2ZlcC0+bmFtZWxlbik7Ci0JCWlubyA9IHhmc19kaXIyX3NmX2dldF9pbnVtYmVyKG9sZHNmcCwKLQkJCXhmc19kaXIyX3NmX2ludW1iZXJwKG9sZHNmZXApKTsKLQkJeGZzX2RpcjJfc2ZfcHV0X2ludW1iZXIoc2ZwLCAmaW5vLCB4ZnNfZGlyMl9zZl9pbnVtYmVycChzZmVwKSk7CisJCXhmc19kaXIyX3NmZV9wdXRfaW5vKHNmcCwgc2ZlcCwKKwkJCXhmc19kaXIyX3NmZV9nZXRfaW5vKG9sZHNmcCwgb2xkc2ZlcCkpOwogCX0KIAkvKgogCSAqIENsZWFuIHVwIHRoZSBpbm9kZS4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9zZi5oIGIvZnMveGZzL3hmc19kaXIyX3NmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzQ0YjUuLjAwMDAwMDAKLS0tIGEvZnMveGZzL3hmc19kaXIyX3NmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotI2lmbmRlZiBfX1hGU19ESVIyX1NGX0hfXwotI2RlZmluZQlfX1hGU19ESVIyX1NGX0hfXwotCi0vKgotICogRGlyZWN0b3J5IGxheW91dCB3aGVuIHN0b3JlZCBpbnRlcm5hbCB0byBhbiBpbm9kZS4KLSAqCi0gKiBTbWFsbCBkaXJlY3RvcmllcyBhcmUgcGFja2VkIGFzIHRpZ2h0bHkgYXMgcG9zc2libGUgc28gYXMgdG8KLSAqIGZpdCBpbnRvIHRoZSBsaXRlcmFsIGFyZWEgb2YgdGhlIGlub2RlLgotICovCi0KLXN0cnVjdCB1aW87Ci1zdHJ1Y3QgeGZzX2RhYnVmOwotc3RydWN0IHhmc19kYV9hcmdzOwotc3RydWN0IHhmc19kaXIyX2Jsb2NrOwotc3RydWN0IHhmc19pbm9kZTsKLXN0cnVjdCB4ZnNfbW91bnQ7Ci1zdHJ1Y3QgeGZzX3RyYW5zOwotCi0vKgotICogSW5vZGUgbnVtYmVyIHN0b3JlZCBhcyA4IDgtYml0IHZhbHVlcy4KLSAqLwotdHlwZWRlZglzdHJ1Y3QgeyBfX3VpbnQ4X3QgaVs4XTsgfSB4ZnNfZGlyMl9pbm84X3Q7Ci0KLS8qCi0gKiBJbm9kZSBudW1iZXIgc3RvcmVkIGFzIDQgOC1iaXQgdmFsdWVzLgotICogV29ya3MgYSBsb3Qgb2YgdGhlIHRpbWUsIHdoZW4gYWxsIHRoZSBpbm9kZSBudW1iZXJzIGluIGEgZGlyZWN0b3J5Ci0gKiBmaXQgaW4gMzIgYml0cy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeyBfX3VpbnQ4X3QgaVs0XTsgfSB4ZnNfZGlyMl9pbm80X3Q7Ci0KLXR5cGVkZWYgdW5pb24gewotCXhmc19kaXIyX2lubzhfdAlpODsKLQl4ZnNfZGlyMl9pbm80X3QJaTQ7Ci19IHhmc19kaXIyX2lub3VfdDsKLSNkZWZpbmUJWEZTX0RJUjJfTUFYX1NIT1JUX0lOVU0JKCh4ZnNfaW5vX3QpMHhmZmZmZmZmZlVMTCkKLQotLyoKLSAqIE5vcm1hbGl6ZWQgb2Zmc2V0IChpbiBhIGRhdGEgYmxvY2spIG9mIHRoZSBlbnRyeSwgcmVhbGx5IHhmc19kaXIyX2RhdGFfb2ZmX3QuCi0gKiBPbmx5IG5lZWQgMTYgYml0cywgdGhpcyBpcyB0aGUgYnl0ZSBvZmZzZXQgaW50byB0aGUgc2luZ2xlIGJsb2NrIGZvcm0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsgX191aW50OF90IGlbMl07IH0gX19hcmNoX3BhY2sgeGZzX2RpcjJfc2Zfb2ZmX3Q7Ci0KLS8qCi0gKiBUaGUgcGFyZW50IGRpcmVjdG9yeSBoYXMgYSBkZWRpY2F0ZWQgZmllbGQsIGFuZCB0aGUgc2VsZi1wb2ludGVyIG11c3QKLSAqIGJlIGNhbGN1bGF0ZWQgb24gdGhlIGZseS4KLSAqCi0gKiBFbnRyaWVzIGFyZSBwYWNrZWQgdG93YXJkIHRoZSB0b3AgYXMgdGlnaHRseSBhcyBwb3NzaWJsZS4gIFRoZSBoZWFkZXIKLSAqIGFuZCB0aGUgZWxlbWVudHMgbXVzdCBiZSBtZW1jcHknZCBvdXQgaW50byBhIHdvcmsgYXJlYSB0byBnZXQgY29ycmVjdAotICogYWxpZ25tZW50IGZvciB0aGUgaW5vZGUgbnVtYmVyIGZpZWxkcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfc2ZfaGRyIHsKLQlfX3VpbnQ4X3QJCWNvdW50OwkJLyogY291bnQgb2YgZW50cmllcyAqLwotCV9fdWludDhfdAkJaThjb3VudDsJLyogY291bnQgb2YgOC1ieXRlIGlub2RlICNzICovCi0JeGZzX2RpcjJfaW5vdV90CQlwYXJlbnQ7CQkvKiBwYXJlbnQgZGlyIGlub2RlIG51bWJlciAqLwotfSBfX2FyY2hfcGFjayB4ZnNfZGlyMl9zZl9oZHJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfc2ZfZW50cnkgewotCV9fdWludDhfdAkJbmFtZWxlbjsJLyogYWN0dWFsIG5hbWUgbGVuZ3RoICovCi0JeGZzX2RpcjJfc2Zfb2ZmX3QJb2Zmc2V0OwkJLyogc2F2ZWQgb2Zmc2V0ICovCi0JX191aW50OF90CQluYW1lWzFdOwkvKiBuYW1lLCB2YXJpYWJsZSBzaXplICovCi0JeGZzX2RpcjJfaW5vdV90CQlpbnVtYmVyOwkvKiBpbm9kZSBudW1iZXIsIHZhci4gb2Zmc2V0ICovCi19IF9fYXJjaF9wYWNrIHhmc19kaXIyX3NmX2VudHJ5X3Q7IAotCi10eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9zZiB7Ci0JeGZzX2RpcjJfc2ZfaGRyX3QJaGRyOwkJLyogc2hvcnRmb3JtIGhlYWRlciAqLwotCXhmc19kaXIyX3NmX2VudHJ5X3QJbGlzdFsxXTsJLyogc2hvcnRmb3JtIGVudHJpZXMgKi8KLX0geGZzX2RpcjJfc2ZfdDsKLQotc3RhdGljIGlubGluZSBpbnQgeGZzX2RpcjJfc2ZfaGRyX3NpemUoaW50IGk4Y291bnQpCi17Ci0JcmV0dXJuICgodWludClzaXplb2YoeGZzX2RpcjJfc2ZfaGRyX3QpIC0gXAotCQkoKGk4Y291bnQpID09IDApICogXAotCQkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLSAodWludClzaXplb2YoeGZzX2RpcjJfaW5vNF90KSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHhmc19kaXIyX2lub3VfdCAqeGZzX2RpcjJfc2ZfaW51bWJlcnAoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCkKLXsKLQlyZXR1cm4gKHhmc19kaXIyX2lub3VfdCAqKSYoc2ZlcCktPm5hbWVbKHNmZXApLT5uYW1lbGVuXTsKLX0KLQotc3RhdGljIGlubGluZSB4ZnNfaW50aW5vX3QKLXhmc19kaXIyX3NmX2dldF9pbnVtYmVyKHhmc19kaXIyX3NmX3QgKnNmcCwgeGZzX2RpcjJfaW5vdV90ICpmcm9tKQotewotCXJldHVybiAoKHNmcCktPmhkci5pOGNvdW50ID09IDAgPyBcCi0JCSh4ZnNfaW50aW5vX3QpWEZTX0dFVF9ESVJfSU5PNCgoZnJvbSktPmk0KSA6IFwKLQkJKHhmc19pbnRpbm9fdClYRlNfR0VUX0RJUl9JTk84KChmcm9tKS0+aTgpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHhmc19kaXIyX3NmX3B1dF9pbnVtYmVyKHhmc19kaXIyX3NmX3QgKnNmcCwgeGZzX2lub190ICpmcm9tLAotCQkJCQkJeGZzX2RpcjJfaW5vdV90ICp0bykKLXsKLQlpZiAoKHNmcCktPmhkci5pOGNvdW50ID09IDApCi0JCVhGU19QVVRfRElSX0lOTzQoKihmcm9tKSwgKHRvKS0+aTQpOwotCWVsc2UKLQkJWEZTX1BVVF9ESVJfSU5POCgqKGZyb20pLCAodG8pLT5pOCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgeGZzX2RpcjJfZGF0YV9hb2ZmX3QKLXhmc19kaXIyX3NmX2dldF9vZmZzZXQoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCkKLXsKLQlyZXR1cm4gSU5UX0dFVF9VTkFMSUdORURfMTZfQkUoJihzZmVwKS0+b2Zmc2V0LmkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhmc19kaXIyX3NmX3B1dF9vZmZzZXQoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCwgeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2ZmKQotewotCUlOVF9TRVRfVU5BTElHTkVEXzE2X0JFKCYoc2ZlcCktPm9mZnNldC5pLCBvZmYpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB4ZnNfZGlyMl9zZl9lbnRzaXplX2J5bmFtZSh4ZnNfZGlyMl9zZl90ICpzZnAsIGludCBsZW4pCi17Ci0JcmV0dXJuICgodWludClzaXplb2YoeGZzX2RpcjJfc2ZfZW50cnlfdCkgLSAxICsgKGxlbikgLSBcCi0JCSgoc2ZwKS0+aGRyLmk4Y291bnQgPT0gMCkgKiBcCi0JCSgodWludClzaXplb2YoeGZzX2RpcjJfaW5vOF90KSAtICh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci14ZnNfZGlyMl9zZl9lbnRzaXplX2J5ZW50cnkoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKQotewotCXJldHVybiAoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX3NmX2VudHJ5X3QpIC0gMSArIChzZmVwKS0+bmFtZWxlbiAtIFwKLQkJKChzZnApLT5oZHIuaThjb3VudCA9PSAwKSAqIFwKLQkJKCh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm84X3QpIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzRfdCkpKTsKLX0KLQotc3RhdGljIGlubGluZSB4ZnNfZGlyMl9zZl9lbnRyeV90ICp4ZnNfZGlyMl9zZl9maXJzdGVudHJ5KHhmc19kaXIyX3NmX3QgKnNmcCkKLXsKLQlyZXR1cm4gKCh4ZnNfZGlyMl9zZl9lbnRyeV90ICopIFwKLQkJKChjaGFyICopKHNmcCkgKyB4ZnNfZGlyMl9zZl9oZHJfc2l6ZShzZnAtPmhkci5pOGNvdW50KSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHhmc19kaXIyX3NmX2VudHJ5X3QgKgoteGZzX2RpcjJfc2ZfbmV4dGVudHJ5KHhmc19kaXIyX3NmX3QgKnNmcCwgeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCkKLXsKLQlyZXR1cm4gKCh4ZnNfZGlyMl9zZl9lbnRyeV90ICopIFwKLQkJKChjaGFyICopKHNmZXApICsgeGZzX2RpcjJfc2ZfZW50c2l6ZV9ieWVudHJ5KHNmcCxzZmVwKSkpOwotfQotCi0vKgotICogRnVuY3Rpb25zLgotICovCi1leHRlcm4gaW50IHhmc19kaXIyX2Jsb2NrX3Nmc2l6ZShzdHJ1Y3QgeGZzX2lub2RlICpkcCwKLQkJCQkgc3RydWN0IHhmc19kaXIyX2Jsb2NrICpibG9jaywKLQkJCQkgeGZzX2RpcjJfc2ZfaGRyX3QgKnNmaHApOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9ibG9ja190b19zZihzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAotCQkJCWludCBzaXplLCB4ZnNfZGlyMl9zZl9oZHJfdCAqc2ZocCk7Ci1leHRlcm4gaW50IHhmc19kaXIyX3NmX2FkZG5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLWV4dGVybiBpbnQgeGZzX2RpcjJfc2ZfY3JlYXRlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2lub190IHBpbm8pOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9zZl9nZXRkZW50cyhzdHJ1Y3QgeGZzX2lub2RlICpkcCwgdm9pZCAqZGlyZW50LAotCQkJCXhmc19vZmZfdCAqb2Zmc2V0LCBmaWxsZGlyX3QgZmlsbGRpcik7Ci1leHRlcm4gaW50IHhmc19kaXIyX3NmX2xvb2t1cChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOwotZXh0ZXJuIGludCB4ZnNfZGlyMl9zZl9yZW1vdmVuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Ci1leHRlcm4gaW50IHhmc19kaXIyX3NmX3JlcGxhY2Uoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKLQotI2VuZGlmCS8qIF9fWEZTX0RJUjJfU0ZfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ZzLmggYi9mcy94ZnMveGZzX2ZzLmgKaW5kZXggOGY2ZmMxYS4uYzEzZmVkOCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19mcy5oCisrKyBiL2ZzL3hmcy94ZnNfZnMuaApAQCAtMjQ5LDYgKzI0OSwxMSBAQAogI2RlZmluZSBYRlNfTUFYX0xPR19CWVRFUyBcCiAJKCgyICogMTAyNCAqIDEwMjQgKiAxMDI0VUxMKSAtIFhGU19NSU5fTE9HX0JZVEVTKQogCisvKiBVc2VkIGZvciBzYW5pdHkgY2hlY2tzIG9uIHN1cGVyYmxvY2sgKi8KKyNkZWZpbmUgWEZTX01BWF9EQkxPQ0tTKHMpICgoeGZzX2RyZnNibm9fdCkocyktPnNiX2FnY291bnQgKiAocyktPnNiX2FnYmxvY2tzKQorI2RlZmluZSBYRlNfTUlOX0RCTE9DS1MocykgKCh4ZnNfZHJmc2Jub190KSgocyktPnNiX2FnY291bnQgLSAxKSAqCVwKKwkJCSAocyktPnNiX2FnYmxvY2tzICsgWEZTX01JTl9BR19CTE9DS1MpCisKIC8qCiAgKiBTdHJ1Y3R1cmVzIGZvciBYRlNfSU9DX0ZTR1JPV0ZTREFUQSwgWEZTX0lPQ19GU0dST1dGU0xPRyAmIFhGU19JT0NfRlNHUk9XRlNSVAogICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvYy5jIGIvZnMveGZzL3hmc19pYWxsb2MuYwppbmRleCA4NGViZWVjLi5kZDU2MjhiIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lhbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jLmMKQEAgLTY4Myw3ICs2ODMsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7Ci0JCUFTU0VSVChiZTMyX3RvX2NwdShhZ2ktPmFnaV9tYWdpY251bSkgPT0gWEZTX0FHSV9NQUdJQyk7CisJCUFTU0VSVChhZ2ktPmFnaV9tYWdpY251bSA9PSBjcHVfdG9fYmUzMihYRlNfQUdJX01BR0lDKSk7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogQ29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYgYmVmb3JlLiAgSW4gdGhpcyBjYXNlLCB3ZQpAQCAtNjkxLDcgKzY5MSw3IEBACiAJCSAqLwogCQlhZ2JwID0gKklPX2FnYnA7CiAJCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnYnApOwotCQlBU1NFUlQoYmUzMl90b19jcHUoYWdpLT5hZ2lfbWFnaWNudW0pID09IFhGU19BR0lfTUFHSUMpOworCQlBU1NFUlQoYWdpLT5hZ2lfbWFnaWNudW0gPT0gY3B1X3RvX2JlMzIoWEZTX0FHSV9NQUdJQykpOwogCQlBU1NFUlQoYmUzMl90b19jcHUoYWdpLT5hZ2lfZnJlZWNvdW50KSA+IDApOwogCX0KIAltcCA9IHRwLT50X21vdW50cDsKQEAgLTc3NSw3ICs3NzUsNyBAQAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG5leHRhZzsKIAkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7Ci0JCUFTU0VSVChiZTMyX3RvX2NwdShhZ2ktPmFnaV9tYWdpY251bSkgPT0gWEZTX0FHSV9NQUdJQyk7CisJCUFTU0VSVChhZ2ktPmFnaV9tYWdpY251bSA9PSBjcHVfdG9fYmUzMihYRlNfQUdJX01BR0lDKSk7CiAJfQogCS8qCiAJICogSGVyZSB3aXRoIGFuIGFsbG9jYXRpb24gZ3JvdXAgdGhhdCBoYXMgYSBmcmVlIGlub2RlLgpAQCAtOTQ0LDcgKzk0NCw3IEBACiAJICogU2VlIGlmIHRoZSBtb3N0IHJlY2VudGx5IGFsbG9jYXRlZCBibG9jayBoYXMgYW55IGZyZWUuCiAJICovCiBuZXdpbm86Ci0JaWYgKGJlMzJfdG9fY3B1KGFnaS0+YWdpX25ld2lubykgIT0gTlVMTEFHSU5PKSB7CisJaWYgKGFnaS0+YWdpX25ld2lubyAhPSBjcHVfdG9fYmUzMihOVUxMQUdJTk8pKSB7CiAJCWVycm9yID0geGZzX2lub2J0X2xvb2t1cChjdXIsIGJlMzJfdG9fY3B1KGFnaS0+YWdpX25ld2lubyksCiAJCQkJCSBYRlNfTE9PS1VQX0VRLCAmaSk7CiAJCWlmIChlcnJvcikKQEAgLTEwODUsNyArMTA4NSw3IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7Ci0JQVNTRVJUKGJlMzJfdG9fY3B1KGFnaS0+YWdpX21hZ2ljbnVtKSA9PSBYRlNfQUdJX01BR0lDKTsKKwlBU1NFUlQoYWdpLT5hZ2lfbWFnaWNudW0gPT0gY3B1X3RvX2JlMzIoWEZTX0FHSV9NQUdJQykpOwogCUFTU0VSVChhZ2JubyA8IGJlMzJfdG9fY3B1KGFnaS0+YWdpX2xlbmd0aCkpOwogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgY3Vyc29yLgpAQCAtMTQzOCw3ICsxNDM4LDcgQEAKIAl4ZnNfYWdpX3QJCSphZ2k7CS8qIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyICovCiAKIAlhZ2kgPSBYRlNfQlVGX1RPX0FHSShicCk7Ci0JQVNTRVJUKGJlMzJfdG9fY3B1KGFnaS0+YWdpX21hZ2ljbnVtKSA9PSBYRlNfQUdJX01BR0lDKTsKKwlBU1NFUlQoYWdpLT5hZ2lfbWFnaWNudW0gPT0gY3B1X3RvX2JlMzIoWEZTX0FHSV9NQUdJQykpOwogI2VuZGlmCiAJLyoKIAkgKiBDb21wdXRlIGJ5dGUgb2Zmc2V0cyBmb3IgdGhlIGZpcnN0IGFuZCBsYXN0IGZpZWxkcy4KQEAgLTE0OTIsNyArMTQ5Miw3IEBACiAJLyoKIAkgKiBWYWxpZGF0ZSB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBhZ2kgYmxvY2suCiAJICovCi0JYWdpX29rID0gYmUzMl90b19jcHUoYWdpLT5hZ2lfbWFnaWNudW0pID09IFhGU19BR0lfTUFHSUMgJiYKKwlhZ2lfb2sgPSBhZ2ktPmFnaV9tYWdpY251bSA9PSBjcHVfdG9fYmUzMihYRlNfQUdJX01BR0lDKSAmJgogCQlYRlNfQUdJX0dPT0RfVkVSU0lPTihiZTMyX3RvX2NwdShhZ2ktPmFnaV92ZXJzaW9ubnVtKSkgJiYKIAkJYmUzMl90b19jcHUoYWdpLT5hZ2lfc2Vxbm8pID09IGFnbm87CiAJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFhZ2lfb2ssIG1wLCBYRlNfRVJSVEFHX0lBTExPQ19SRUFEX0FHSSwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaWFsbG9jX2J0cmVlLmMgYi9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5jCmluZGV4IDE2OTIxZjUuLmM2YTc1ODEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaWFsbG9jX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWVfdHJhY2UuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCkBAIC0yMDUsNzIgKzIwNCw2IEBACiB9CiAjZW5kaWYJLyogREVCVUcgKi8KIAotI2lmZGVmIFhGU19CVFJFRV9UUkFDRQota3RyYWNlX3QJKnhmc19pbm9idF90cmFjZV9idWY7Ci0KLVNUQVRJQyB2b2lkCi14ZnNfaW5vYnRfdHJhY2VfZW50ZXIoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKLQljb25zdCBjaGFyCQkqZnVuYywKLQljaGFyCQkJKnMsCi0JaW50CQkJdHlwZSwKLQlpbnQJCQlsaW5lLAotCV9fcHN1bnNpZ25lZF90CQlhMCwKLQlfX3BzdW5zaWduZWRfdAkJYTEsCi0JX19wc3Vuc2lnbmVkX3QJCWEyLAotCV9fcHN1bnNpZ25lZF90CQlhMywKLQlfX3BzdW5zaWduZWRfdAkJYTQsCi0JX19wc3Vuc2lnbmVkX3QJCWE1LAotCV9fcHN1bnNpZ25lZF90CQlhNiwKLQlfX3BzdW5zaWduZWRfdAkJYTcsCi0JX19wc3Vuc2lnbmVkX3QJCWE4LAotCV9fcHN1bnNpZ25lZF90CQlhOSwKLQlfX3BzdW5zaWduZWRfdAkJYTEwKQotewotCWt0cmFjZV9lbnRlcih4ZnNfaW5vYnRfdHJhY2VfYnVmLCAodm9pZCAqKShfX3BzaW50X3QpdHlwZSwKLQkJKHZvaWQgKilmdW5jLCAodm9pZCAqKXMsIE5VTEwsICh2b2lkICopY3VyLAotCQkodm9pZCAqKWEwLCAodm9pZCAqKWExLCAodm9pZCAqKWEyLCAodm9pZCAqKWEzLAotCQkodm9pZCAqKWE0LCAodm9pZCAqKWE1LCAodm9pZCAqKWE2LCAodm9pZCAqKWE3LAotCQkodm9pZCAqKWE4LCAodm9pZCAqKWE5LCAodm9pZCAqKWExMCk7Ci19Ci0KLVNUQVRJQyB2b2lkCi14ZnNfaW5vYnRfdHJhY2VfY3Vyc29yKAotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCi0JX191aW50MzJfdAkJKnMwLAotCV9fdWludDY0X3QJCSpsMCwKLQlfX3VpbnQ2NF90CQkqbDEpCi17Ci0JKnMwID0gY3VyLT5iY19wcml2YXRlLmEuYWdubzsKLQkqbDAgPSBjdXItPmJjX3JlYy5pLmlyX3N0YXJ0aW5vOwotCSpsMSA9IGN1ci0+YmNfcmVjLmkuaXJfZnJlZTsKLX0KLQotU1RBVElDIHZvaWQKLXhmc19pbm9idF90cmFjZV9rZXkoCi0Jc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKLQl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprZXksCi0JX191aW50NjRfdAkJKmwwLAotCV9fdWludDY0X3QJCSpsMSkKLXsKLQkqbDAgPSBiZTMyX3RvX2NwdShrZXktPmlub2J0LmlyX3N0YXJ0aW5vKTsKLQkqbDEgPSAwOwotfQotCi1TVEFUSUMgdm9pZAoteGZzX2lub2J0X3RyYWNlX3JlY29yZCgKLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAotCXVuaW9uIHhmc19idHJlZV9yZWMJKnJlYywKLQlfX3VpbnQ2NF90CQkqbDAsCi0JX191aW50NjRfdAkJKmwxLAotCV9fdWludDY0X3QJCSpsMikKLXsKLQkqbDAgPSBiZTMyX3RvX2NwdShyZWMtPmlub2J0LmlyX3N0YXJ0aW5vKTsKLQkqbDEgPSBiZTMyX3RvX2NwdShyZWMtPmlub2J0LmlyX2ZyZWVjb3VudCk7Ci0JKmwyID0gYmU2NF90b19jcHUocmVjLT5pbm9idC5pcl9mcmVlKTsKLX0KLSNlbmRpZiAvKiBYRlNfQlRSRUVfVFJBQ0UgKi8KLQogc3RhdGljIGNvbnN0IHN0cnVjdCB4ZnNfYnRyZWVfb3BzIHhmc19pbm9idF9vcHMgPSB7CiAJLnJlY19sZW4JCT0gc2l6ZW9mKHhmc19pbm9idF9yZWNfdCksCiAJLmtleV9sZW4JCT0gc2l6ZW9mKHhmc19pbm9idF9rZXlfdCksCkBAIC0yODYsMTggKzIxOSwxMCBAQAogCS5pbml0X3JlY19mcm9tX2N1cgk9IHhmc19pbm9idF9pbml0X3JlY19mcm9tX2N1ciwKIAkuaW5pdF9wdHJfZnJvbV9jdXIJPSB4ZnNfaW5vYnRfaW5pdF9wdHJfZnJvbV9jdXIsCiAJLmtleV9kaWZmCQk9IHhmc19pbm9idF9rZXlfZGlmZiwKLQogI2lmZGVmIERFQlVHCiAJLmtleXNfaW5vcmRlcgkJPSB4ZnNfaW5vYnRfa2V5c19pbm9yZGVyLAogCS5yZWNzX2lub3JkZXIJCT0geGZzX2lub2J0X3JlY3NfaW5vcmRlciwKICNlbmRpZgotCi0jaWZkZWYgWEZTX0JUUkVFX1RSQUNFCi0JLnRyYWNlX2VudGVyCQk9IHhmc19pbm9idF90cmFjZV9lbnRlciwKLQkudHJhY2VfY3Vyc29yCQk9IHhmc19pbm9idF90cmFjZV9jdXJzb3IsCi0JLnRyYWNlX2tleQkJPSB4ZnNfaW5vYnRfdHJhY2Vfa2V5LAotCS50cmFjZV9yZWNvcmQJCT0geGZzX2lub2J0X3RyYWNlX3JlY29yZCwKLSNlbmRpZgogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaWdldC5jIGIvZnMveGZzL3hmc19pZ2V0LmMKaW5kZXggY2I5YjZkMS4uNzc1OTgxMiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pZ2V0LmMKKysrIGIvZnMveGZzL3hmc19pZ2V0LmMKQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgogI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWVfdHJhY2UuaCIKICNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKIAogCkBAIC0yNTMsMTYgKzI1MiwyMSBAQAogCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKIAotCQkJaXAtPmlfZmxhZ3MgJj0gflhGU19JTkVXOwotCQkJaXAtPmlfZmxhZ3MgfD0gWEZTX0lSRUNMQUlNQUJMRTsKLQkJCV9feGZzX2lub2RlX3NldF9yZWNsYWltX3RhZyhwYWcsIGlwKTsKKwkJCWlwLT5pX2ZsYWdzICY9IH4oWEZTX0lORVcgfCBYRlNfSVJFQ0xBSU0pOworCQkJQVNTRVJUKGlwLT5pX2ZsYWdzICYgWEZTX0lSRUNMQUlNQUJMRSk7CiAJCQl0cmFjZV94ZnNfaWdldF9yZWNsYWltX2ZhaWwoaXApOwogCQkJZ290byBvdXRfZXJyb3I7CiAJCX0KIAogCQlzcGluX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAkJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQkJaXAtPmlfZmxhZ3MgJj0gfihYRlNfSVJFQ0xBSU1BQkxFIHwgWEZTX0lSRUNMQUlNKTsKKworCQkvKgorCQkgKiBDbGVhciB0aGUgcGVyLWxpZmV0aW1lIHN0YXRlIGluIHRoZSBpbm9kZSBhcyB3ZSBhcmUgbm93CisJCSAqIGVmZmVjdGl2ZWx5IGEgbmV3IGlub2RlIGFuZCBuZWVkIHRvIHJldHVybiB0byB0aGUgaW5pdGlhbAorCQkgKiBzdGF0ZSBiZWZvcmUgcmV1c2Ugb2NjdXJzLgorCQkgKi8KKwkJaXAtPmlfZmxhZ3MgJj0gflhGU19JUkVDTEFJTV9SRVNFVF9GTEFHUzsKIAkJaXAtPmlfZmxhZ3MgfD0gWEZTX0lORVc7CiAJCV9feGZzX2lub2RlX2NsZWFyX3JlY2xhaW1fdGFnKG1wLCBwYWcsIGlwKTsKIAkJaW5vZGUtPmlfc3RhdGUgPSBJX05FVzsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuYyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwppbmRleCBhMDk4YTIwLi4zY2MyMWRkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZS5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWVfdHJhY2UuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKQEAgLTUyLDcgKzUxLDcgQEAKIGttZW1fem9uZV90ICp4ZnNfaW5vZGVfem9uZTsKIAogLyoKLSAqIFVzZWQgaW4geGZzX2l0cnVuY2F0ZSgpLiAgVGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXh0ZW50cworICogVXNlZCBpbiB4ZnNfaXRydW5jYXRlX2V4dGVudHMoKS4gIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGV4dGVudHMKICAqIGZyZWVkIGZyb20gYSBmaWxlIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLgogICovCiAjZGVmaW5lCVhGU19JVFJVTkNfTUFYX0VYVEVOVFMJMgpAQCAtMTY3LDcgKzE2Niw3IEBACiAKIAkJZGlwID0gKHhmc19kaW5vZGVfdCAqKXhmc19idWZfb2Zmc2V0KGJwLAogCQkJCQkoaSA8PCBtcC0+bV9zYi5zYl9pbm9kZWxvZykpOwotCQlkaV9vayA9IGJlMTZfdG9fY3B1KGRpcC0+ZGlfbWFnaWMpID09IFhGU19ESU5PREVfTUFHSUMgJiYKKwkJZGlfb2sgPSBkaXAtPmRpX21hZ2ljID09IGNwdV90b19iZTE2KFhGU19ESU5PREVfTUFHSUMpICYmCiAJCQkgICAgWEZTX0RJTk9ERV9HT09EX1ZFUlNJT04oZGlwLT5kaV92ZXJzaW9uKTsKIAkJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFkaV9vaywgbXAsCiAJCQkJCQlYRlNfRVJSVEFHX0lUT0JQX0lOT1RPQlAsCkBAIC04MDIsNyArODAxLDcgQEAKIAkgKiBJZiB3ZSBnb3Qgc29tZXRoaW5nIHRoYXQgaXNuJ3QgYW4gaW5vZGUgaXQgbWVhbnMgc29tZW9uZQogCSAqIChuZnMgb3IgZG1pKSBoYXMgYSBzdGFsZSBoYW5kbGUuCiAJICovCi0JaWYgKGJlMTZfdG9fY3B1KGRpcC0+ZGlfbWFnaWMpICE9IFhGU19ESU5PREVfTUFHSUMpIHsKKwlpZiAoZGlwLT5kaV9tYWdpYyAhPSBjcHVfdG9fYmUxNihYRlNfRElOT0RFX01BR0lDKSkgewogI2lmZGVmIERFQlVHCiAJCXhmc19hbGVydChtcCwKIAkJCSIlczogZGlwLT5kaV9tYWdpYyAoMHgleCkgIT0gWEZTX0RJTk9ERV9NQUdJQyAoMHgleCkiLApAQCAtMTE3OSwxNSArMTE3OCwxNSBAQAogICogYXQgbGVhc3QgZG8gaXQgZm9yIHJlZ3VsYXIgZmlsZXMuCiAgKi8KICNpZmRlZiBERUJVRwotdm9pZAorU1RBVElDIHZvaWQKIHhmc19pc2l6ZV9jaGVjaygKLQl4ZnNfbW91bnRfdAkqbXAsCi0JeGZzX2lub2RlX3QJKmlwLAotCXhmc19mc2l6ZV90CWlzaXplKQorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXhmc19mc2l6ZV90CQlpc2l6ZSkKIHsKLQl4ZnNfZmlsZW9mZl90CW1hcF9maXJzdDsKLQlpbnQJCW5pbWFwczsKLQl4ZnNfYm1idF9pcmVjX3QJaW1hcHNbMl07CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKKwl4ZnNfZmlsZW9mZl90CQltYXBfZmlyc3Q7CisJaW50CQkJbmltYXBzOworCXhmc19ibWJ0X2lyZWNfdAkJaW1hcHNbMl07CiAKIAlpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgIT0gU19JRlJFRykKIAkJcmV0dXJuOwpAQCAtMTIxNCwxNjggKzEyMTMsMTQgQEAKIAlBU1NFUlQobmltYXBzID09IDEpOwogCUFTU0VSVChpbWFwc1swXS5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKTsKIH0KKyNlbHNlCS8qIERFQlVHICovCisjZGVmaW5lIHhmc19pc2l6ZV9jaGVjayhpcCwgaXNpemUpCiAjZW5kaWYJLyogREVCVUcgKi8KIAogLyoKLSAqIENhbGN1bGF0ZSB0aGUgbGFzdCBwb3NzaWJsZSBidWZmZXJlZCBieXRlIGluIGEgZmlsZS4gIFRoaXMgbXVzdAotICogaW5jbHVkZSBkYXRhIHRoYXQgd2FzIGJ1ZmZlcmVkIGJleW9uZCB0aGUgRU9GIGJ5IHRoZSB3cml0ZSBjb2RlLgotICogVGhpcyBhbHNvIG5lZWRzIHRvIGRlYWwgd2l0aCBvdmVyZmxvd2luZyB0aGUgeGZzX2ZzaXplX3QgdHlwZQotICogd2hpY2ggY2FuIGhhcHBlbiBmb3Igc2l6ZXMgbmVhciB0aGUgbGltaXQuCi0gKgotICogV2UgYWxzbyBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IGFueSBibG9ja3MgYmV5b25kIHRoZSBFT0YuICBJdAotICogbWF5IGJlIHRoZSBjYXNlIHRoYXQgdGhleSB3ZXJlIGJ1ZmZlcmVkIGJ5IGEgd3JpdGUgd2hpY2ggZmFpbGVkLgotICogSW4gdGhhdCBjYXNlIHRoZSBwYWdlcyB3aWxsIHN0aWxsIGJlIGluIG1lbW9yeSwgYnV0IHRoZSBpbm9kZSBzaXplCi0gKiB3aWxsIG5ldmVyIGhhdmUgYmVlbiB1cGRhdGVkLgotICovCi1TVEFUSUMgeGZzX2ZzaXplX3QKLXhmc19maWxlX2xhc3RfYnl0ZSgKLQl4ZnNfaW5vZGVfdAkqaXApCi17Ci0JeGZzX21vdW50X3QJKm1wOwotCXhmc19mc2l6ZV90CWxhc3RfYnl0ZTsKLQl4ZnNfZmlsZW9mZl90CWxhc3RfYmxvY2s7Ci0JeGZzX2ZpbGVvZmZfdAlzaXplX2xhc3RfYmxvY2s7Ci0JaW50CQllcnJvcjsKLQotCUFTU0VSVCh4ZnNfaXNpbG9ja2VkKGlwLCBYRlNfSU9MT0NLX0VYQ0x8WEZTX0lPTE9DS19TSEFSRUQpKTsKLQotCW1wID0gaXAtPmlfbW91bnQ7Ci0JLyoKLQkgKiBPbmx5IGNoZWNrIGZvciBibG9ja3MgYmV5b25kIHRoZSBFT0YgaWYgdGhlIGV4dGVudHMgaGF2ZQotCSAqIGJlZW4gcmVhZCBpbi4gIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgdGhlIGlub2RlIGxvY2ssCi0JICogYW5kIGl0IGFsc28gc2F2ZXMgdXMgZnJvbSBsb29raW5nIHdoZW4gaXQgcmVhbGx5IGlzbid0Ci0JICogbmVjZXNzYXJ5LgotCSAqLwotCWlmIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpIHsKLQkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQkJZXJyb3IgPSB4ZnNfYm1hcF9sYXN0X29mZnNldChOVUxMLCBpcCwgJmxhc3RfYmxvY2ssCi0JCQlYRlNfREFUQV9GT1JLKTsKLQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwotCQlpZiAoZXJyb3IpIHsKLQkJCWxhc3RfYmxvY2sgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJbGFzdF9ibG9jayA9IDA7Ci0JfQotCXNpemVfbGFzdF9ibG9jayA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdClpcC0+aV9zaXplKTsKLQlsYXN0X2Jsb2NrID0gWEZTX0ZJTEVPRkZfTUFYKGxhc3RfYmxvY2ssIHNpemVfbGFzdF9ibG9jayk7Ci0KLQlsYXN0X2J5dGUgPSBYRlNfRlNCX1RPX0IobXAsIGxhc3RfYmxvY2spOwotCWlmIChsYXN0X2J5dGUgPCAwKSB7Ci0JCXJldHVybiBYRlNfTUFYSU9GRlNFVChtcCk7Ci0JfQotCWxhc3RfYnl0ZSArPSAoMSA8PCBtcC0+bV93cml0ZWlvX2xvZyk7Ci0JaWYgKGxhc3RfYnl0ZSA8IDApIHsKLQkJcmV0dXJuIFhGU19NQVhJT0ZGU0VUKG1wKTsKLQl9Ci0JcmV0dXJuIGxhc3RfYnl0ZTsKLX0KLQotLyoKLSAqIFN0YXJ0IHRoZSB0cnVuY2F0aW9uIG9mIHRoZSBmaWxlIHRvIG5ld19zaXplLiAgVGhlIG5ldyBzaXplCi0gKiBtdXN0IGJlIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBzaXplLiAgVGhpcyByb3V0aW5lIHdpbGwKLSAqIGNsZWFyIHRoZSBidWZmZXIgYW5kIHBhZ2UgY2FjaGVzIG9mIGZpbGUgZGF0YSBpbiB0aGUgcmVtb3ZlZAotICogcmFuZ2UsIGFuZCB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgpIHdpbGwgcmVtb3ZlIHRoZSB1bmRlcmx5aW5nCi0gKiBkaXNrIGJsb2Nrcy4KLSAqCi0gKiBUaGUgaW5vZGUgbXVzdCBoYXZlIGl0cyBJL08gbG9jayBsb2NrZWQgRVhDTFVTSVZFTFksIGFuZCBpdAotICogbXVzdCBOT1QgaGF2ZSB0aGUgaW5vZGUgbG9jayBoZWxkIGF0IGFsbC4gIFRoaXMgaXMgYmVjYXVzZSB3ZSdyZQotICogY2FsbGluZyBpbnRvIHRoZSBidWZmZXIvcGFnZSBjYWNoZSBjb2RlIGFuZCB3ZSBjYW4ndCBob2xkIHRoZQotICogaW5vZGUgbG9jayB3aGVuIHdlIGRvIHNvLgotICoKLSAqIFdlIG5lZWQgdG8gd2FpdCBmb3IgYW55IGRpcmVjdCBJL09zIGluIGZsaWdodCB0byBjb21wbGV0ZSBiZWZvcmUgd2UKLSAqIHByb2NlZWQgd2l0aCB0aGUgdHJ1bmNhdGUuIFRoaXMgaXMgbmVlZGVkIHRvIHByZXZlbnQgdGhlIGV4dGVudHMKLSAqIGJlaW5nIHJlYWQgb3Igd3JpdHRlbiBieSB0aGUgZGlyZWN0IEkvT3MgZnJvbSBiZWluZyByZW1vdmVkIHdoaWxlIHRoZQotICogSS9PIGlzIGluIGZsaWdodCBhcyB0aGVyZSBpcyBubyBvdGhlciBtZXRob2Qgb2Ygc3luY2hyb25pc2luZwotICogZGlyZWN0IEkvTyB3aXRoIHRoZSB0cnVuY2F0ZSBvcGVyYXRpb24uICBBbHNvLCBiZWNhdXNlIHdlIGhvbGQKLSAqIHRoZSBJT0xPQ0sgaW4gZXhjbHVzaXZlIG1vZGUsIHdlIHByZXZlbnQgbmV3IGRpcmVjdCBJL09zIGZyb20gYmVpbmcKLSAqIHN0YXJ0ZWQgdW50aWwgdGhlIHRydW5jYXRlIGNvbXBsZXRlcyBhbmQgZHJvcHMgdGhlIGxvY2suIEVzc2VudGlhbGx5LAotICogdGhlIHhmc19pb2VuZF93YWl0KCkgY2FsbCBmb3JtcyBhbiBJL08gYmFycmllciB0aGF0IHByb3ZpZGVzIHN0cmljdAotICogb3JkZXJpbmcgYmV0d2VlbiBkaXJlY3QgSS9PcyBhbmQgdGhlIHRydW5jYXRlIG9wZXJhdGlvbi4KLSAqCi0gKiBUaGUgZmxhZ3MgcGFyYW1ldGVyIGNhbiBoYXZlIGVpdGhlciB0aGUgdmFsdWUgWEZTX0lUUlVOQ19ERUZJTklURQotICogb3IgWEZTX0lUUlVOQ19NQVlCRS4gIFRoZSBYRlNfSVRSVU5DX01BWUJFIHZhbHVlIHNob3VsZCBiZSB1c2VkCi0gKiBpbiB0aGUgY2FzZSB0aGF0IHRoZSBjYWxsZXIgaXMgbG9ja2luZyB0aGluZ3Mgb3V0IG9mIG9yZGVyIGFuZAotICogbWF5IG5vdCBiZSBhYmxlIHRvIGNhbGwgeGZzX2l0cnVuY2F0ZV9maW5pc2goKSB3aXRoIHRoZSBpbm9kZSBsb2NrCi0gKiBoZWxkIHdpdGhvdXQgZHJvcHBpbmcgdGhlIEkvTyBsb2NrLiAgSWYgdGhlIGNhbGxlciBtdXN0IGRyb3AgdGhlCi0gKiBJL08gbG9jayBiZWZvcmUgY2FsbGluZyB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgpLCB0aGVuIHhmc19pdHJ1bmNhdGVfc3RhcnQoKQotICogbXVzdCBiZSBjYWxsZWQgYWdhaW4gd2l0aCBhbGwgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIGFzIHRoZSBpbml0aWFsCi0gKiBjYWxsLgotICovCi1pbnQKLXhmc19pdHJ1bmNhdGVfc3RhcnQoCi0JeGZzX2lub2RlX3QJKmlwLAotCXVpbnQJCWZsYWdzLAotCXhmc19mc2l6ZV90CW5ld19zaXplKQotewotCXhmc19mc2l6ZV90CWxhc3RfYnl0ZTsKLQl4ZnNfb2ZmX3QJdG9zc19zdGFydDsKLQl4ZnNfbW91bnRfdAkqbXA7Ci0JaW50CQllcnJvciA9IDA7Ci0KLQlBU1NFUlQoeGZzX2lzaWxvY2tlZChpcCwgWEZTX0lPTE9DS19FWENMKSk7Ci0JQVNTRVJUKChuZXdfc2l6ZSA9PSAwKSB8fCAobmV3X3NpemUgPD0gaXAtPmlfc2l6ZSkpOwotCUFTU0VSVCgoZmxhZ3MgPT0gWEZTX0lUUlVOQ19ERUZJTklURSkgfHwKLQkgICAgICAgKGZsYWdzID09IFhGU19JVFJVTkNfTUFZQkUpKTsKLQotCW1wID0gaXAtPmlfbW91bnQ7Ci0KLQkvKiB3YWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiBhbnkgcGVuZGluZyBESU9zICovCi0JaWYgKG5ld19zaXplID09IDAgfHwgbmV3X3NpemUgPCBpcC0+aV9zaXplKQotCQl4ZnNfaW9lbmRfd2FpdChpcCk7Ci0KLQkvKgotCSAqIENhbGwgdG9zc19wYWdlcyBvciBmbHVzaGludmFsX3BhZ2VzIHRvIGdldCByaWQgb2YgcGFnZXMKLQkgKiBvdmVybGFwcGluZyB0aGUgcmVnaW9uIGJlaW5nIHJlbW92ZWQuICBXZSBoYXZlIHRvIHVzZQotCSAqIHRoZSBsZXNzIGVmZmljaWVudCBmbHVzaGludmFsX3BhZ2VzIGluIHRoZSBjYXNlIHRoYXQgdGhlCi0JICogY2FsbGVyIG1heSBub3QgYmUgYWJsZSB0byBmaW5pc2ggdGhlIHRydW5jYXRlIHdpdGhvdXQKLQkgKiBkcm9wcGluZyB0aGUgaW5vZGUncyBJL08gbG9jay4gIE1ha2Ugc3VyZQotCSAqIHRvIGNhdGNoIGFueSBwYWdlcyBicm91Z2h0IGluIGJ5IGJ1ZmZlcnMgb3ZlcmxhcHBpbmcKLQkgKiB0aGUgRU9GIGJ5IHNlYXJjaGluZyBvdXQgYmV5b25kIHRoZSBpc2l6ZSBieSBvdXIKLQkgKiBibG9jayBzaXplLiBXZSByb3VuZCBuZXdfc2l6ZSB1cCB0byBhIGJsb2NrIGJvdW5kYXJ5Ci0JICogc28gdGhhdCB3ZSBkb24ndCB0b3NzIHRoaW5ncyBvbiB0aGUgc2FtZSBibG9jayBhcwotCSAqIG5ld19zaXplIGJ1dCBiZWZvcmUgaXQuCi0JICoKLQkgKiBCZWZvcmUgY2FsbGluZyB0b3NzX3BhZ2Ugb3IgZmx1c2hpbnZhbF9wYWdlcywgbWFrZSBzdXJlIHRvCi0JICogY2FsbCByZW1hcGYoKSBvdmVyIHRoZSBzYW1lIHJlZ2lvbiBpZiB0aGUgZmlsZSBpcyBtYXBwZWQuCi0JICogVGhpcyBmcmVlcyB1cCBtYXBwZWQgZmlsZSByZWZlcmVuY2VzIHRvIHRoZSBwYWdlcyBpbiB0aGUKLQkgKiBnaXZlbiByYW5nZSBhbmQgZm9yIHRoZSBmbHVzaGludmFsX3BhZ2VzIGNhc2UgaXQgZW5zdXJlcwotCSAqIHRoYXQgd2UgZ2V0IHRoZSBsYXRlc3QgbWFwcGVkIGNoYW5nZXMgZmx1c2hlZCBvdXQuCi0JICovCi0JdG9zc19zdGFydCA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdCluZXdfc2l6ZSk7Ci0JdG9zc19zdGFydCA9IFhGU19GU0JfVE9fQihtcCwgdG9zc19zdGFydCk7Ci0JaWYgKHRvc3Nfc3RhcnQgPCAwKSB7Ci0JCS8qCi0JCSAqIFRoZSBwbGFjZSB0byBzdGFydCB0b3NzaW5nIGlzIGJleW9uZCBvdXIgbWF4aW11bQotCQkgKiBmaWxlIHNpemUsIHNvIHRoZXJlIGlzIG5vIHdheSB0aGF0IHRoZSBkYXRhIGV4dGVuZGVkCi0JCSAqIG91dCB0aGVyZS4KLQkJICovCi0JCXJldHVybiAwOwotCX0KLQlsYXN0X2J5dGUgPSB4ZnNfZmlsZV9sYXN0X2J5dGUoaXApOwotCXRyYWNlX3hmc19pdHJ1bmNhdGVfc3RhcnQoaXAsIG5ld19zaXplLCBmbGFncywgdG9zc19zdGFydCwgbGFzdF9ieXRlKTsKLQlpZiAobGFzdF9ieXRlID4gdG9zc19zdGFydCkgewotCQlpZiAoZmxhZ3MgJiBYRlNfSVRSVU5DX0RFRklOSVRFKSB7Ci0JCQl4ZnNfdG9zc3BhZ2VzKGlwLCB0b3NzX3N0YXJ0LAotCQkJCQktMSwgRklfUkVNQVBGX0xPQ0tFRCk7Ci0JCX0gZWxzZSB7Ci0JCQllcnJvciA9IHhmc19mbHVzaGludmFsX3BhZ2VzKGlwLCB0b3NzX3N0YXJ0LAotCQkJCQktMSwgRklfUkVNQVBGX0xPQ0tFRCk7Ci0JCX0KLQl9Ci0KLSNpZmRlZiBERUJVRwotCWlmIChuZXdfc2l6ZSA9PSAwKSB7Ci0JCUFTU0VSVChWTl9DQUNIRUQoVkZTX0koaXApKSA9PSAwKTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBTaHJpbmsgdGhlIGZpbGUgdG8gdGhlIGdpdmVuIG5ld19zaXplLiAgVGhlIG5ldyBzaXplIG11c3QgYmUgc21hbGxlciB0aGFuCi0gKiB0aGUgY3VycmVudCBzaXplLiAgVGhpcyB3aWxsIGZyZWUgdXAgdGhlIHVuZGVybHlpbmcgYmxvY2tzIGluIHRoZSByZW1vdmVkCi0gKiByYW5nZSBhZnRlciBhIGNhbGwgdG8geGZzX2l0cnVuY2F0ZV9zdGFydCgpIG9yIHhmc19hdHJ1bmNhdGVfc3RhcnQoKS4KKyAqIEZyZWUgdXAgdGhlIHVuZGVybHlpbmcgYmxvY2tzIHBhc3QgbmV3X3NpemUuICBUaGUgbmV3IHNpemUgbXVzdCBiZSBzbWFsbGVyCisgKiB0aGFuIHRoZSBjdXJyZW50IHNpemUuICBUaGlzIHJvdXRpbmUgY2FuIGJlIHVzZWQgYm90aCBmb3IgdGhlIGF0dHJpYnV0ZSBhbmQKKyAqIGRhdGEgZm9yaywgYW5kIGRvZXMgbm90IG1vZGlmeSB0aGUgaW5vZGUgc2l6ZSwgd2hpY2ggaXMgbGVmdCB0byB0aGUgY2FsbGVyLgogICoKICAqIFRoZSB0cmFuc2FjdGlvbiBwYXNzZWQgdG8gdGhpcyByb3V0aW5lIG11c3QgaGF2ZSBtYWRlIGEgcGVybWFuZW50IGxvZwogICogcmVzZXJ2YXRpb24gb2YgYXQgbGVhc3QgWEZTX0lUUlVOQ0FURV9MT0dfUkVTLiAgVGhpcyByb3V0aW5lIG1heSBjb21taXQgdGhlCkBAIC0xMzg3LDMxICsxMjMyLDYgQEAKICAqIHdpbGwgYmUgImhlbGQiIHdpdGhpbiB0aGUgcmV0dXJuZWQgdHJhbnNhY3Rpb24uICBUaGlzIHJvdXRpbmUgZG9lcyBOT1QKICAqIHJlcXVpcmUgYW55IGRpc2sgc3BhY2UgdG8gYmUgcmVzZXJ2ZWQgZm9yIGl0IHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24uCiAgKgotICogVGhlIGZvcmsgcGFyYW1ldGVyIG11c3QgYmUgZWl0aGVyIHhmc19hdHRyX2Zvcmsgb3IgeGZzX2RhdGFfZm9yaywgYW5kIGl0Ci0gKiBpbmRpY2F0ZXMgdGhlIGZvcmsgd2hpY2ggaXMgdG8gYmUgdHJ1bmNhdGVkLiAgRm9yIHRoZSBhdHRyaWJ1dGUgZm9yayB3ZSBvbmx5Ci0gKiBzdXBwb3J0IHRydW5jYXRpb24gdG8gc2l6ZSAwLgotICoKLSAqIFdlIHVzZSB0aGUgc3luYyBwYXJhbWV0ZXIgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIGZpcnN0IHRyYW5zYWN0aW9uCi0gKiB3ZSBwZXJmb3JtIG1pZ2h0IGhhdmUgdG8gYmUgc3luY2hyb25vdXMuICBGb3IgdGhlIGF0dHIgZm9yaywgaXQgbmVlZHMgdG8gYmUKLSAqIHNvIGlmIHRoZSB1bmxpbmsgb2YgdGhlIGlub2RlIGlzIG5vdCB5ZXQga25vd24gdG8gYmUgcGVybWFuZW50IGluIHRoZSBsb2cuCi0gKiBUaGlzIGtlZXBzIHVzIGZyb20gZnJlZWluZyBhbmQgcmV1c2luZyB0aGUgYmxvY2tzIG9mIHRoZSBhdHRyaWJ1dGUgZm9yawotICogYmVmb3JlIHRoZSB1bmxpbmsgb2YgdGhlIGlub2RlIGJlY29tZXMgcGVybWFuZW50LgotICoKLSAqIEZvciB0aGUgZGF0YSBmb3JrLCB3ZSBub3JtYWxseSBoYXZlIHRvIHJ1biBzeW5jaHJvbm91c2x5IGlmIHdlJ3JlIGJlaW5nCi0gKiBjYWxsZWQgb3V0IG9mIHRoZSBpbmFjdGl2ZSBwYXRoIG9yIHdlJ3JlIGJlaW5nIGNhbGxlZCBvdXQgb2YgdGhlIGNyZWF0ZSBwYXRoCi0gKiB3aGVyZSB3ZSdyZSB0cnVuY2F0aW5nIGFuIGV4aXN0aW5nIGZpbGUuICBFaXRoZXIgd2F5LCB0aGUgdHJ1bmNhdGUgbmVlZHMgdG8KLSAqIGJlIHN5bmMgc28gYmxvY2tzIGRvbid0IHJlYXBwZWFyIGluIHRoZSBmaWxlIHdpdGggYWx0ZXJlZCBkYXRhIGluIGNhc2Ugb2YgYQotICogY3Jhc2guICB3c3luYyBmaWxlc3lzdGVtcyBjYW4gcnVuIHRoZSBmaXJzdCBjYXNlIGFzeW5jIGJlY2F1c2UgYW55dGhpbmcgdGhhdAotICogc2hyaW5rcyB0aGUgaW5vZGUgaGFzIHRvIHJ1biBzeW5jIHNvIGJ5IHRoZSB0aW1lIHdlJ3JlIGNhbGxlZCBoZXJlIGZyb20KLSAqIGluYWN0aXZlLCB0aGUgaW5vZGUgc2l6ZSBpcyBwZXJtYW5lbnRseSBzZXQgdG8gMC4KLSAqCi0gKiBDYWxscyBmcm9tIHRoZSB0cnVuY2F0ZSBwYXRoIGFsd2F5cyBuZWVkIHRvIGJlIHN5bmMgdW5sZXNzIHdlJ3JlIGluIGEgd3N5bmMKLSAqIGZpbGVzeXN0ZW0gYW5kIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gdW5saW5rZWQuCi0gKgotICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY29ycmVjdGx5IHNldHRpbmcgdGhlIHN5bmMgcGFyYW1ldGVyLiAgSXQgZ2V0cwotICogdG9vIGhhcmQgZm9yIHVzIHRvIGd1ZXNzIGhlcmUgd2hpY2ggcGF0aCB3ZSdyZSBiZWluZyBjYWxsZWQgb3V0IG9mIGp1c3QKLSAqIGJhc2VkIG9uIGlub2RlIHN0YXRlLgotICoKICAqIElmIHdlIGdldCBhbiBlcnJvciwgd2UgbXVzdCByZXR1cm4gd2l0aCB0aGUgaW5vZGUgbG9ja2VkIGFuZCBsaW5rZWQgaW50byB0aGUKICAqIGN1cnJlbnQgdHJhbnNhY3Rpb24uIFRoaXMga2VlcHMgdGhpbmdzIHNpbXBsZSBmb3IgdGhlIGhpZ2hlciBsZXZlbCBjb2RlLAogICogYmVjYXVzZSBpdCBhbHdheXMga25vd3MgdGhhdCB0aGUgaW5vZGUgaXMgbG9ja2VkIGFuZCBoZWxkIGluIHRoZSB0cmFuc2FjdGlvbgpAQCAtMTQxOSwxMjQgKzEyMzksMzAgQEAKICAqIGRpcnR5IG9uIGVycm9yIHNvIHRoYXQgdHJhbnNhY3Rpb25zIGNhbiBiZSBlYXNpbHkgYWJvcnRlZCBpZiBwb3NzaWJsZS4KICAqLwogaW50Ci14ZnNfaXRydW5jYXRlX2ZpbmlzaCgKLQl4ZnNfdHJhbnNfdAkqKnRwLAotCXhmc19pbm9kZV90CSppcCwKLQl4ZnNfZnNpemVfdAluZXdfc2l6ZSwKLQlpbnQJCWZvcmssCi0JaW50CQlzeW5jKQoreGZzX2l0cnVuY2F0ZV9leHRlbnRzKAorCXN0cnVjdCB4ZnNfdHJhbnMJKip0cHAsCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJaW50CQkJd2hpY2hmb3JrLAorCXhmc19mc2l6ZV90CQluZXdfc2l6ZSkKIHsKLQl4ZnNfZnNibG9ja190CWZpcnN0X2Jsb2NrOwotCXhmc19maWxlb2ZmX3QJZmlyc3RfdW5tYXBfYmxvY2s7Ci0JeGZzX2ZpbGVvZmZfdAlsYXN0X2Jsb2NrOwotCXhmc19maWxibGtzX3QJdW5tYXBfbGVuPTA7Ci0JeGZzX21vdW50X3QJKm1wOwotCXhmc190cmFuc190CSpudHA7Ci0JaW50CQlkb25lOwotCWludAkJY29tbWl0dGVkOwotCXhmc19ibWFwX2ZyZWVfdAlmcmVlX2xpc3Q7Ci0JaW50CQllcnJvcjsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXN0cnVjdCB4ZnNfdHJhbnMJKnRwID0gKnRwcDsKKwlzdHJ1Y3QgeGZzX3RyYW5zCSpudHA7CisJeGZzX2JtYXBfZnJlZV90CQlmcmVlX2xpc3Q7CisJeGZzX2ZzYmxvY2tfdAkJZmlyc3RfYmxvY2s7CisJeGZzX2ZpbGVvZmZfdAkJZmlyc3RfdW5tYXBfYmxvY2s7CisJeGZzX2ZpbGVvZmZfdAkJbGFzdF9ibG9jazsKKwl4ZnNfZmlsYmxrc190CQl1bm1hcF9sZW47CisJaW50CQkJY29tbWl0dGVkOworCWludAkJCWVycm9yID0gMDsKKwlpbnQJCQlkb25lID0gMDsKIAogCUFTU0VSVCh4ZnNfaXNpbG9ja2VkKGlwLCBYRlNfSUxPQ0tfRVhDTHxYRlNfSU9MT0NLX0VYQ0wpKTsKLQlBU1NFUlQoKG5ld19zaXplID09IDApIHx8IChuZXdfc2l6ZSA8PSBpcC0+aV9zaXplKSk7Ci0JQVNTRVJUKCp0cCAhPSBOVUxMKTsKLQlBU1NFUlQoKCp0cCktPnRfZmxhZ3MgJiBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTKTsKLQlBU1NFUlQoaXAtPmlfdHJhbnNwID09ICp0cCk7CisJQVNTRVJUKG5ld19zaXplIDw9IGlwLT5pX3NpemUpOworCUFTU0VSVCh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19QRVJNX0xPR19SRVMpOwogCUFTU0VSVChpcC0+aV9pdGVtcCAhPSBOVUxMKTsKIAlBU1NFUlQoaXAtPmlfaXRlbXAtPmlsaV9sb2NrX2ZsYWdzID09IDApOwotCi0KLQludHAgPSAqdHA7Ci0JbXAgPSAobnRwKS0+dF9tb3VudHA7Ci0JQVNTRVJUKCEgWEZTX05PVF9EUUFUVEFDSEVEKG1wLCBpcCkpOwotCi0JLyoKLQkgKiBXZSBvbmx5IHN1cHBvcnQgdHJ1bmNhdGluZyB0aGUgZW50aXJlIGF0dHJpYnV0ZSBmb3JrLgotCSAqLwotCWlmIChmb3JrID09IFhGU19BVFRSX0ZPUkspIHsKLQkJbmV3X3NpemUgPSAwTEw7Ci0JfQotCWZpcnN0X3VubWFwX2Jsb2NrID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW5ld19zaXplKTsKLQl0cmFjZV94ZnNfaXRydW5jYXRlX2ZpbmlzaF9zdGFydChpcCwgbmV3X3NpemUpOwotCi0JLyoKLQkgKiBUaGUgZmlyc3QgdGhpbmcgd2UgZG8gaXMgc2V0IHRoZSBzaXplIHRvIG5ld19zaXplIHBlcm1hbmVudGx5Ci0JICogb24gZGlzay4gIFRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW55b25lIGV2ZXIKLQkgKiBiZWluZyBhYmxlIHRvIGxvb2sgYXQgdGhlIGRhdGEgYmVpbmcgZnJlZWQgZXZlbiBpbiB0aGUgZmFjZQotCSAqIG9mIGEgY3Jhc2guICBXaGF0IHdlJ3JlIGdldHRpbmcgYXJvdW5kIGhlcmUgaXMgdGhlIGNhc2Ugd2hlcmUKLQkgKiB3ZSBmcmVlIGEgYmxvY2ssIGl0IGlzIGFsbG9jYXRlZCB0byBhbm90aGVyIGZpbGUsIGl0IGlzIHdyaXR0ZW4KLQkgKiB0bywgYW5kIHRoZW4gd2UgY3Jhc2guICBJZiB0aGUgbmV3IGRhdGEgZ2V0cyB3cml0dGVuIHRvIHRoZQotCSAqIGZpbGUgYnV0IHRoZSBsb2cgYnVmZmVycyBjb250YWluaW5nIHRoZSBmcmVlIGFuZCByZWFsbG9jYXRpb24KLQkgKiBkb24ndCwgdGhlbiB3ZSdkIGVuZCB1cCB3aXRoIGdhcmJhZ2UgaW4gdGhlIGJsb2NrcyBiZWluZyBmcmVlZC4KLQkgKiBBcyBsb25nIGFzIHdlIG1ha2UgdGhlIG5ld19zaXplIHBlcm1hbmVudCBiZWZvcmUgYWN0dWFsbHkKLQkgKiBmcmVlaW5nIGFueSBibG9ja3MgaXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhleSBnZXQgd3JpdHRlbiB0by4KLQkgKgotCSAqIFRoZSBjYWxsZXJzIG11c3Qgc2lnbmFsIGludG8gdXMgd2hldGhlciBvciBub3QgdGhlIHNpemUKLQkgKiBzZXR0aW5nIGhlcmUgbXVzdCBiZSBzeW5jaHJvbm91cy4gIFRoZXJlIGFyZSBhIGZldyBjYXNlcwotCSAqIHdoZXJlIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBzeW5jaHJvbm91cy4gIFRob3NlIGNhc2VzCi0JICogb2NjdXIgaWYgdGhlIGZpbGUgaXMgdW5saW5rZWQgYW5kIHdlIGtub3cgdGhlIHVubGluayBpcwotCSAqIHBlcm1hbmVudCBvciBpZiB0aGUgYmxvY2tzIGJlaW5nIHRydW5jYXRlZCBhcmUgZ3VhcmFudGVlZAotCSAqIHRvIGJlIGJleW9uZCB0aGUgaW5vZGUgZW9mIChyZWdhcmRsZXNzIG9mIHRoZSBsaW5rIGNvdW50KQotCSAqIGFuZCB0aGUgZW9mIHZhbHVlIGlzIHBlcm1hbmVudC4gIEJvdGggb2YgdGhlc2UgY2FzZXMgb2NjdXIKLQkgKiBvbmx5IG9uIHdzeW5jLW1vdW50ZWQgZmlsZXN5c3RlbXMuICBJbiB0aG9zZSBjYXNlcywgd2UncmUKLQkgKiBndWFyYW50ZWVkIHRoYXQgbm8gdXNlciB3aWxsIGV2ZXIgc2VlIHRoZSBkYXRhIGluIHRoZSBibG9ja3MKLQkgKiB0aGF0IGFyZSBiZWluZyB0cnVuY2F0ZWQgc28gdGhlIHRydW5jYXRlIGNhbiBydW4gYXN5bmMuCi0JICogSW4gdGhlIGZyZWUgYmV5b25kIGVvZiBjYXNlLCB0aGUgZmlsZSBtYXkgd2luZCB1cCB3aXRoCi0JICogbW9yZSBibG9ja3MgYWxsb2NhdGVkIHRvIGl0IHRoYW4gaXQgbmVlZHMgaWYgd2UgY3Jhc2gKLQkgKiBhbmQgdGhhdCB3b24ndCBnZXQgZml4ZWQgdW50aWwgdGhlIG5leHQgdGltZSB0aGUgZmlsZQotCSAqIGlzIHJlLW9wZW5lZCBhbmQgY2xvc2VkIGJ1dCB0aGF0J3Mgb2sgYXMgdGhhdCBzaG91bGRuJ3QKLQkgKiBiZSB0b28gbWFueSBibG9ja3MuCi0JICoKLQkgKiBIb3dldmVyLCB3ZSBjYW4ndCBqdXN0IG1ha2UgYWxsIHdzeW5jIHhhY3Rpb25zIHJ1biBhc3luYwotCSAqIGJlY2F1c2UgdGhlcmUncyBvbmUgY2FsbCBvdXQgb2YgdGhlIGNyZWF0ZSBwYXRoIHRoYXQgbmVlZHMKLQkgKiB0byBydW4gc3luYyB3aGVyZSBpdCdzIHRydW5jYXRpbmcgYW4gZXhpc3RpbmcgZmlsZSB0byBzaXplCi0JICogMCB3aG9zZSBzaXplIGlzID4gMC4KLQkgKgotCSAqIEl0J3MgcHJvYmFibHkgcG9zc2libGUgdG8gY29tZSB1cCB3aXRoIGEgdGVzdCBpbiB0aGlzCi0JICogcm91dGluZSB0aGF0IHdvdWxkIGNvcnJlY3RseSBkaXN0aW5ndWlzaCBhbGwgdGhlIGFib3ZlCi0JICogY2FzZXMgZnJvbSB0aGUgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCB0aGUKLQkgKiBpbm9kZSBzdGF0ZSBidXQgZm9yIHNhbml0eSdzIHNha2UsIEkndmUgZGVjaWRlZCB0byBsZXQgdGhlCi0JICogbGF5ZXJzIGFib3ZlIGp1c3QgdGVsbCB1cy4gIEl0J3Mgc2ltcGxlciB0byBjb3JyZWN0bHkgZmlndXJlCi0JICogb3V0IGluIHRoZSBsYXllciBhYm92ZSBleGFjdGx5IHVuZGVyIHdoYXQgY29uZGl0aW9ucyB3ZQotCSAqIGNhbiBydW4gYXN5bmMgYW5kIEkgdGhpbmsgaXQncyBlYXNpZXIgZm9yIG90aGVycyByZWFkIGFuZAotCSAqIGZvbGxvdyB0aGUgbG9naWMgaW4gY2FzZSBzb21ldGhpbmcgaGFzIHRvIGJlIGNoYW5nZWQuCi0JICogY3Njb3BlIGlzIHlvdXIgZnJpZW5kIC0tIHJjYy4KLQkgKgotCSAqIFRoZSBhdHRyaWJ1dGUgZm9yayBpcyBtdWNoIHNpbXBsZXIuCi0JICoKLQkgKiBGb3IgdGhlIGF0dHJpYnV0ZSBmb3JrIHdlIGFsbG93IHRoZSBjYWxsZXIgdG8gdGVsbCB1cyB3aGV0aGVyCi0JICogdGhlIHVubGluayBvZiB0aGUgaW5vZGUgdGhhdCBsZWQgdG8gdGhpcyBjYWxsIGlzIHlldCBwZXJtYW5lbnQKLQkgKiBpbiB0aGUgb24gZGlzayBsb2cuICBJZiBpdCBpcyBub3QgYW5kIHdlIHdpbGwgYmUgZnJlZWluZyBleHRlbnRzCi0JICogaW4gdGhpcyBpbm9kZSB0aGVuIHdlIG1ha2UgdGhlIGZpcnN0IHRyYW5zYWN0aW9uIHN5bmNocm9ub3VzCi0JICogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHVubGluayBpcyBwZXJtYW5lbnQgYnkgdGhlIHRpbWUgd2UgZnJlZQotCSAqIHRoZSBibG9ja3MuCi0JICovCi0JaWYgKGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgewotCQlpZiAoaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApIHsKLQkJCS8qCi0JCQkgKiBJZiB3ZSBhcmUgbm90IGNoYW5naW5nIHRoZSBmaWxlIHNpemUgdGhlbiBkbwotCQkJICogbm90IHVwZGF0ZSB0aGUgb24tZGlzayBmaWxlIHNpemUgLSB3ZSBtYXkgYmUKLQkJCSAqIGNhbGxlZCBmcm9tIHhmc19pbmFjdGl2ZV9mcmVlX2VvZmJsb2NrcygpLiAgSWYgd2UKLQkJCSAqIHVwZGF0ZSB0aGUgb24tZGlzayBmaWxlIHNpemUgYW5kIHRoZW4gdGhlIHN5c3RlbQotCQkJICogY3Jhc2hlcyBiZWZvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFyZQotCQkJICogZmx1c2hlZCB0byBkaXNrIHRoZW4gdGhlIGZpbGVzIG1heSBiZSBmdWxsIG9mCi0JCQkgKiBob2xlcyAoaWUgTlVMTCBmaWxlcyBidWcpLgotCQkJICovCi0JCQlpZiAoaXAtPmlfc2l6ZSAhPSBuZXdfc2l6ZSkgewotCQkJCWlwLT5pX2QuZGlfc2l6ZSA9IG5ld19zaXplOwotCQkJCWlwLT5pX3NpemUgPSBuZXdfc2l6ZTsKLQkJCQl4ZnNfdHJhbnNfbG9nX2lub2RlKG50cCwgaXAsIFhGU19JTE9HX0NPUkUpOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChzeW5jKSB7Ci0JCUFTU0VSVCghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSk7Ci0JCWlmIChpcC0+aV9kLmRpX2FuZXh0ZW50cyA+IDApCi0JCQl4ZnNfdHJhbnNfc2V0X3N5bmMobnRwKTsKLQl9Ci0JQVNTRVJUKGZvcmsgPT0gWEZTX0RBVEFfRk9SSyB8fAotCQkoZm9yayA9PSBYRlNfQVRUUl9GT1JLICYmCi0JCQkoKHN5bmMgJiYgIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykpIHx8Ci0JCQkgKHN5bmMgPT0gMCAmJiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpKSkpKTsKKwlBU1NFUlQoIVhGU19OT1RfRFFBVFRBQ0hFRChtcCwgaXApKTsKIAogCS8qCiAJICogU2luY2UgaXQgaXMgcG9zc2libGUgZm9yIHNwYWNlIHRvIGJlY29tZSBhbGxvY2F0ZWQgYmV5b25kCkBAIC0xNTQ3LDEyOCArMTI3MywxNDIgQEAKIAkgKiBiZXlvbmQgdGhlIG1heGltdW0gZmlsZSBzaXplIChpZSBpdCBpcyB0aGUgc2FtZSBhcyBsYXN0X2Jsb2NrKSwKIAkgKiB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCiAJICovCisJZmlyc3RfdW5tYXBfYmxvY2sgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3QpbmV3X3NpemUpOwogCWxhc3RfYmxvY2sgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3QpWEZTX01BWElPRkZTRVQobXApKTsKLQlBU1NFUlQoZmlyc3RfdW5tYXBfYmxvY2sgPD0gbGFzdF9ibG9jayk7Ci0JZG9uZSA9IDA7Ci0JaWYgKGxhc3RfYmxvY2sgPT0gZmlyc3RfdW5tYXBfYmxvY2spIHsKLQkJZG9uZSA9IDE7Ci0JfSBlbHNlIHsKLQkJdW5tYXBfbGVuID0gbGFzdF9ibG9jayAtIGZpcnN0X3VubWFwX2Jsb2NrICsgMTsKLQl9CisJaWYgKGZpcnN0X3VubWFwX2Jsb2NrID09IGxhc3RfYmxvY2spCisJCXJldHVybiAwOworCisJQVNTRVJUKGZpcnN0X3VubWFwX2Jsb2NrIDwgbGFzdF9ibG9jayk7CisJdW5tYXBfbGVuID0gbGFzdF9ibG9jayAtIGZpcnN0X3VubWFwX2Jsb2NrICsgMTsKIAl3aGlsZSAoIWRvbmUpIHsKLQkJLyoKLQkJICogRnJlZSB1cCB1cCB0byBYRlNfSVRSVU5DX01BWF9FWFRFTlRTLiAgeGZzX2J1bm1hcGkoKQotCQkgKiB3aWxsIHRlbGwgdXMgd2hldGhlciBpdCBmcmVlZCB0aGUgZW50aXJlIHJhbmdlIG9yCi0JCSAqIG5vdC4gIElmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyBtb3VudCAod3N5bmMpLAotCQkgKiB0aGVuIHdlIGNhbiB0ZWxsIGJ1bm1hcGkgdG8ga2VlcCBhbGwgdGhlCi0JCSAqIHRyYW5zYWN0aW9ucyBhc3luY2hyb25vdXMgc2luY2UgdGhlIHVubGluawotCQkgKiB0cmFuc2FjdGlvbiB0aGF0IG1hZGUgdGhpcyBpbm9kZSBpbmFjdGl2ZSBoYXMKLQkJICogYWxyZWFkeSBoaXQgdGhlIGRpc2suICBUaGVyZSdzIG5vIGRhbmdlciBvZgotCQkgKiB0aGUgZnJlZWQgYmxvY2tzIGJlaW5nIHJldXNlZCwgdGhlcmUgYmVpbmcgYQotCQkgKiBjcmFzaCwgYW5kIHRoZSByZXVzZWQgYmxvY2tzIHN1ZGRlbmx5IHJlYXBwZWFyaW5nCi0JCSAqIGluIHRoaXMgZmlsZSB3aXRoIGdhcmJhZ2UgaW4gdGhlbSBvbmNlIHJlY292ZXJ5Ci0JCSAqIHJ1bnMuCi0JCSAqLwogCQl4ZnNfYm1hcF9pbml0KCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7Ci0JCWVycm9yID0geGZzX2J1bm1hcGkobnRwLCBpcCwKKwkJZXJyb3IgPSB4ZnNfYnVubWFwaSh0cCwgaXAsCiAJCQkJICAgIGZpcnN0X3VubWFwX2Jsb2NrLCB1bm1hcF9sZW4sCi0JCQkJICAgIHhmc19ibWFwaV9hZmxhZyhmb3JrKSwKKwkJCQkgICAgeGZzX2JtYXBpX2FmbGFnKHdoaWNoZm9yayksCiAJCQkJICAgIFhGU19JVFJVTkNfTUFYX0VYVEVOVFMsCiAJCQkJICAgICZmaXJzdF9ibG9jaywgJmZyZWVfbGlzdCwKIAkJCQkgICAgJmRvbmUpOwotCQlpZiAoZXJyb3IpIHsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgYnVubWFwaSBjYWxsIGVuY291bnRlcnMgYW4gZXJyb3IsCi0JCQkgKiByZXR1cm4gdG8gdGhlIGNhbGxlciB3aGVyZSB0aGUgdHJhbnNhY3Rpb24KLQkJCSAqIGNhbiBiZSBwcm9wZXJseSBhYm9ydGVkLiAgV2UganVzdCBuZWVkIHRvCi0JCQkgKiBtYWtlIHN1cmUgd2UncmUgbm90IGhvbGRpbmcgYW55IHJlc291cmNlcwotCQkJICogdGhhdCB3ZSB3ZXJlIG5vdCB3aGVuIHdlIGNhbWUgaW4uCi0JCQkgKi8KLQkJCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQorCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF9ibWFwX2NhbmNlbDsKIAogCQkvKgogCQkgKiBEdXBsaWNhdGUgdGhlIHRyYW5zYWN0aW9uIHRoYXQgaGFzIHRoZSBwZXJtYW5lbnQKIAkJICogcmVzZXJ2YXRpb24gYW5kIGNvbW1pdCB0aGUgb2xkIHRyYW5zYWN0aW9uLgogCQkgKi8KLQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2godHAsICZmcmVlX2xpc3QsICZjb21taXR0ZWQpOwotCQludHAgPSAqdHA7CisJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZyZWVfbGlzdCwgJmNvbW1pdHRlZCk7CiAJCWlmIChjb21taXR0ZWQpCi0JCQl4ZnNfdHJhbnNfaWpvaW4obnRwLCBpcCk7Ci0KLQkJaWYgKGVycm9yKSB7Ci0JCQkvKgotCQkJICogSWYgdGhlIGJtYXAgZmluaXNoIGNhbGwgZW5jb3VudGVycyBhbiBlcnJvciwgcmV0dXJuCi0JCQkgKiB0byB0aGUgY2FsbGVyIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBjYW4gYmUgcHJvcGVybHkKLQkJCSAqIGFib3J0ZWQuICBXZSBqdXN0IG5lZWQgdG8gbWFrZSBzdXJlIHdlJ3JlIG5vdAotCQkJICogaG9sZGluZyBhbnkgcmVzb3VyY2VzIHRoYXQgd2Ugd2VyZSBub3Qgd2hlbiB3ZSBjYW1lCi0JCQkgKiBpbi4KLQkJCSAqCi0JCQkgKiBBYm9ydGluZyBmcm9tIHRoaXMgcG9pbnQgbWlnaHQgbG9zZSBzb21lIGJsb2NrcyBpbgotCQkJICogdGhlIGZpbGUgc3lzdGVtLCBidXQgb2ggd2VsbC4KLQkJCSAqLwotCQkJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9CisJCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXRfYm1hcF9jYW5jZWw7CiAKIAkJaWYgKGNvbW1pdHRlZCkgewogCQkJLyoKIAkJCSAqIE1hcmsgdGhlIGlub2RlIGRpcnR5IHNvIGl0IHdpbGwgYmUgbG9nZ2VkIGFuZAogCQkJICogbW92ZWQgZm9yd2FyZCBpbiB0aGUgbG9nIGFzIHBhcnQgb2YgZXZlcnkgY29tbWl0LgogCQkJICovCi0JCQl4ZnNfdHJhbnNfbG9nX2lub2RlKG50cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCQkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOwogCQl9CiAKLQkJbnRwID0geGZzX3RyYW5zX2R1cChudHApOwotCQllcnJvciA9IHhmc190cmFuc19jb21taXQoKnRwLCAwKTsKLQkJKnRwID0gbnRwOworCQludHAgPSB4ZnNfdHJhbnNfZHVwKHRwKTsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKKwkJdHAgPSBudHA7CiAKLQkJeGZzX3RyYW5zX2lqb2luKG50cCwgaXApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKIAogCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7CisJCQlnb3RvIG91dDsKKwogCQkvKgotCQkgKiB0cmFuc2FjdGlvbiBjb21taXQgd29ya2VkIG9rIHNvIHdlIGNhbiBkcm9wIHRoZSBleHRyYSB0aWNrZXQKKwkJICogVHJhbnNhY3Rpb24gY29tbWl0IHdvcmtlZCBvayBzbyB3ZSBjYW4gZHJvcCB0aGUgZXh0cmEgdGlja2V0CiAJCSAqIHJlZmVyZW5jZSB0aGF0IHdlIGdhaW5lZCBpbiB4ZnNfdHJhbnNfZHVwKCkKIAkJICovCi0JCXhmc19sb2dfdGlja2V0X3B1dChudHAtPnRfdGlja2V0KTsKLQkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZShudHAsIDAsCisJCXhmc19sb2dfdGlja2V0X3B1dCh0cC0+dF90aWNrZXQpOworCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAogCQkJCQlYRlNfSVRSVU5DQVRFX0xPR19SRVMobXApLCAwLAogCQkJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAogCQkJCQlYRlNfSVRSVU5DQVRFX0xPR19DT1VOVCk7CiAJCWlmIChlcnJvcikKLQkJCXJldHVybiBlcnJvcjsKKwkJCWdvdG8gb3V0OwogCX0KKworb3V0OgorCSp0cHAgPSB0cDsKKwlyZXR1cm4gZXJyb3I7CitvdXRfYm1hcF9jYW5jZWw6CiAJLyoKLQkgKiBPbmx5IHVwZGF0ZSB0aGUgc2l6ZSBpbiB0aGUgY2FzZSBvZiB0aGUgZGF0YSBmb3JrLCBidXQKLQkgKiBhbHdheXMgcmUtbG9nIHRoZSBpbm9kZSBzbyB0aGF0IG91ciBwZXJtYW5lbnQgdHJhbnNhY3Rpb24KLQkgKiBjYW4ga2VlcCBvbiByb2xsaW5nIGl0IGZvcndhcmQgaW4gdGhlIGxvZy4KKwkgKiBJZiB0aGUgYnVubWFwaSBjYWxsIGVuY291bnRlcnMgYW4gZXJyb3IsIHJldHVybiB0byB0aGUgY2FsbGVyIHdoZXJlCisJICogdGhlIHRyYW5zYWN0aW9uIGNhbiBiZSBwcm9wZXJseSBhYm9ydGVkLiAgV2UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZQorCSAqIHdlJ3JlIG5vdCBob2xkaW5nIGFueSByZXNvdXJjZXMgdGhhdCB3ZSB3ZXJlIG5vdCB3aGVuIHdlIGNhbWUgaW4uCiAJICovCi0JaWYgKGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgewotCQl4ZnNfaXNpemVfY2hlY2sobXAsIGlwLCBuZXdfc2l6ZSk7CisJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCWdvdG8gb3V0OworfQorCitpbnQKK3hmc19pdHJ1bmNhdGVfZGF0YSgKKwlzdHJ1Y3QgeGZzX3RyYW5zCSoqdHBwLAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXhmc19mc2l6ZV90CQluZXdfc2l6ZSkKK3sKKwlpbnQJCQllcnJvcjsKKworCXRyYWNlX3hmc19pdHJ1bmNhdGVfZGF0YV9zdGFydChpcCwgbmV3X3NpemUpOworCisJLyoKKwkgKiBUaGUgZmlyc3QgdGhpbmcgd2UgZG8gaXMgc2V0IHRoZSBzaXplIHRvIG5ld19zaXplIHBlcm1hbmVudGx5IG9uCisJICogZGlzay4gIFRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW55b25lIGV2ZXIgYmVpbmcgYWJsZQorCSAqIHRvIGxvb2sgYXQgdGhlIGRhdGEgYmVpbmcgZnJlZWQgZXZlbiBpbiB0aGUgZmFjZSBvZiBhIGNyYXNoLgorCSAqIFdoYXQgd2UncmUgZ2V0dGluZyBhcm91bmQgaGVyZSBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBmcmVlIGEgYmxvY2ssIGl0CisJICogaXMgYWxsb2NhdGVkIHRvIGFub3RoZXIgZmlsZSwgaXQgaXMgd3JpdHRlbiB0bywgYW5kIHRoZW4gd2UgY3Jhc2guCisJICogSWYgdGhlIG5ldyBkYXRhIGdldHMgd3JpdHRlbiB0byB0aGUgZmlsZSBidXQgdGhlIGxvZyBidWZmZXJzCisJICogY29udGFpbmluZyB0aGUgZnJlZSBhbmQgcmVhbGxvY2F0aW9uIGRvbid0LCB0aGVuIHdlJ2QgZW5kIHVwIHdpdGgKKwkgKiBnYXJiYWdlIGluIHRoZSBibG9ja3MgYmVpbmcgZnJlZWQuICBBcyBsb25nIGFzIHdlIG1ha2UgdGhlIG5ld19zaXplCisJICogcGVybWFuZW50IGJlZm9yZSBhY3R1YWxseSBmcmVlaW5nIGFueSBibG9ja3MgaXQgZG9lc24ndCBtYXR0ZXIgaWYKKwkgKiB0aGV5IGdldCB3cml0dGVuIHRvLgorCSAqLworCWlmIChpcC0+aV9kLmRpX25leHRlbnRzID4gMCkgewogCQkvKgotCQkgKiBJZiB3ZSBhcmUgbm90IGNoYW5naW5nIHRoZSBmaWxlIHNpemUgdGhlbiBkbwotCQkgKiBub3QgdXBkYXRlIHRoZSBvbi1kaXNrIGZpbGUgc2l6ZSAtIHdlIG1heSBiZQotCQkgKiBjYWxsZWQgZnJvbSB4ZnNfaW5hY3RpdmVfZnJlZV9lb2ZibG9ja3MoKS4gIElmIHdlCi0JCSAqIHVwZGF0ZSB0aGUgb24tZGlzayBmaWxlIHNpemUgYW5kIHRoZW4gdGhlIHN5c3RlbQotCQkgKiBjcmFzaGVzIGJlZm9yZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXJlCi0JCSAqIGZsdXNoZWQgdG8gZGlzayB0aGVuIHRoZSBmaWxlcyBtYXkgYmUgZnVsbCBvZgotCQkgKiBob2xlcyAoaWUgTlVMTCBmaWxlcyBidWcpLgorCQkgKiBJZiB3ZSBhcmUgbm90IGNoYW5naW5nIHRoZSBmaWxlIHNpemUgdGhlbiBkbyBub3QgdXBkYXRlCisJCSAqIHRoZSBvbi1kaXNrIGZpbGUgc2l6ZSAtIHdlIG1heSBiZSBjYWxsZWQgZnJvbQorCQkgKiB4ZnNfaW5hY3RpdmVfZnJlZV9lb2ZibG9ja3MoKS4gIElmIHdlIHVwZGF0ZSB0aGUgb24tZGlzaworCQkgKiBmaWxlIHNpemUgYW5kIHRoZW4gdGhlIHN5c3RlbSBjcmFzaGVzIGJlZm9yZSB0aGUgY29udGVudHMKKwkJICogb2YgdGhlIGZpbGUgYXJlIGZsdXNoZWQgdG8gZGlzayB0aGVuIHRoZSBmaWxlcyBtYXkgYmUKKwkJICogZnVsbCBvZiBob2xlcyAoaWUgTlVMTCBmaWxlcyBidWcpLgogCQkgKi8KIAkJaWYgKGlwLT5pX3NpemUgIT0gbmV3X3NpemUpIHsKIAkJCWlwLT5pX2QuZGlfc2l6ZSA9IG5ld19zaXplOwogCQkJaXAtPmlfc2l6ZSA9IG5ld19zaXplOworCQkJeGZzX3RyYW5zX2xvZ19pbm9kZSgqdHBwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAJCX0KIAl9Ci0JeGZzX3RyYW5zX2xvZ19pbm9kZShudHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKLQlBU1NFUlQoKG5ld19zaXplICE9IDApIHx8Ci0JICAgICAgIChmb3JrID09IFhGU19BVFRSX0ZPUkspIHx8Ci0JICAgICAgIChpcC0+aV9kZWxheWVkX2Jsa3MgPT0gMCkpOwotCUFTU0VSVCgobmV3X3NpemUgIT0gMCkgfHwKLQkgICAgICAgKGZvcmsgPT0gWEZTX0FUVFJfRk9SSykgfHwKLQkgICAgICAgKGlwLT5pX2QuZGlfbmV4dGVudHMgPT0gMCkpOwotCXRyYWNlX3hmc19pdHJ1bmNhdGVfZmluaXNoX2VuZChpcCwgbmV3X3NpemUpOworCisJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2V4dGVudHModHBwLCBpcCwgWEZTX0RBVEFfRk9SSywgbmV3X3NpemUpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgbm90IGNoYW5naW5nIHRoZSBmaWxlIHNpemUgdGhlbiBkbyBub3QgdXBkYXRlIHRoZSBvbi1kaXNrCisJICogZmlsZSBzaXplIC0gd2UgbWF5IGJlIGNhbGxlZCBmcm9tIHhmc19pbmFjdGl2ZV9mcmVlX2VvZmJsb2NrcygpLgorCSAqIElmIHdlIHVwZGF0ZSB0aGUgb24tZGlzayBmaWxlIHNpemUgYW5kIHRoZW4gdGhlIHN5c3RlbSBjcmFzaGVzCisJICogYmVmb3JlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhcmUgZmx1c2hlZCB0byBkaXNrIHRoZW4gdGhlIGZpbGVzCisJICogbWF5IGJlIGZ1bGwgb2YgaG9sZXMgKGllIE5VTEwgZmlsZXMgYnVnKS4KKwkgKi8KKwl4ZnNfaXNpemVfY2hlY2soaXAsIG5ld19zaXplKTsKKwlpZiAoaXAtPmlfc2l6ZSAhPSBuZXdfc2l6ZSkgeworCQlpcC0+aV9kLmRpX3NpemUgPSBuZXdfc2l6ZTsKKwkJaXAtPmlfc2l6ZSA9IG5ld19zaXplOworCX0KKworCUFTU0VSVChuZXdfc2l6ZSAhPSAwIHx8IGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKTsKKwlBU1NFUlQobmV3X3NpemUgIT0gMCB8fCBpcC0+aV9kLmRpX25leHRlbnRzID09IDApOworCisJLyoKKwkgKiBBbHdheXMgcmUtbG9nIHRoZSBpbm9kZSBzbyB0aGF0IG91ciBwZXJtYW5lbnQgdHJhbnNhY3Rpb24gY2FuIGtlZXAKKwkgKiBvbiByb2xsaW5nIGl0IGZvcndhcmQgaW4gdGhlIGxvZy4KKwkgKi8KKwl4ZnNfdHJhbnNfbG9nX2lub2RlKCp0cHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKworCXRyYWNlX3hmc19pdHJ1bmNhdGVfZGF0YV9lbmQoaXAsIG5ld19zaXplKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTY5NCw3ICsxNDM0LDYgQEAKIAogCUFTU0VSVChpcC0+aV9kLmRpX25saW5rID09IDApOwogCUFTU0VSVChpcC0+aV9kLmRpX21vZGUgIT0gMCk7Ci0JQVNTRVJUKGlwLT5pX3RyYW5zcCA9PSB0cCk7CiAKIAltcCA9IHRwLT50X21vdW50cDsKIApAQCAtMTcxNyw3ICsxNDU2LDcgQEAKIAlBU1NFUlQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSk7CiAJQVNTRVJUKGJlMzJfdG9fY3B1KGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0pICE9IGFnaW5vKTsKIAotCWlmIChiZTMyX3RvX2NwdShhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRfaW5kZXhdKSAhPSBOVUxMQUdJTk8pIHsKKwlpZiAoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSAhPSBjcHVfdG9fYmUzMihOVUxMQUdJTk8pKSB7CiAJCS8qCiAJCSAqIFRoZXJlIGlzIGFscmVhZHkgYW5vdGhlciBpbm9kZSBpbiB0aGUgYnVja2V0IHdlIG5lZWQKIAkJICogdG8gYWRkIG91cnNlbHZlcyB0by4gIEFkZCB1cyBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCkBAIC0xNzI4LDggKzE0NjcsNyBAQAogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CiAKLQkJQVNTRVJUKGJlMzJfdG9fY3B1KGRpcC0+ZGlfbmV4dF91bmxpbmtlZCkgPT0gTlVMTEFHSU5PKTsKLQkJLyogYm90aCBvbi1kaXNrLCBkb24ndCBlbmRpYW4gZmxpcCB0d2ljZSAqLworCQlBU1NFUlQoZGlwLT5kaV9uZXh0X3VubGlua2VkID09IGNwdV90b19iZTMyKE5VTExBR0lOTykpOwogCQlkaXAtPmRpX25leHRfdW5saW5rZWQgPSBhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRfaW5kZXhdOwogCQlvZmZzZXQgPSBpcC0+aV9pbWFwLmltX2JvZmZzZXQgKwogCQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV90LCBkaV9uZXh0X3VubGlua2VkKTsKQEAgLTE3OTQsNyArMTUzMiw3IEBACiAJYWdpbm8gPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpcC0+aV9pbm8pOwogCUFTU0VSVChhZ2lubyAhPSAwKTsKIAlidWNrZXRfaW5kZXggPSBhZ2lubyAlIFhGU19BR0lfVU5MSU5LRURfQlVDS0VUUzsKLQlBU1NFUlQoYmUzMl90b19jcHUoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSkgIT0gTlVMTEFHSU5PKTsKKwlBU1NFUlQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSAhPSBjcHVfdG9fYmUzMihOVUxMQUdJTk8pKTsKIAlBU1NFUlQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSk7CiAKIAlpZiAoYmUzMl90b19jcHUoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSkgPT0gYWdpbm8pIHsKQEAgLTE5NTksNyArMTY5Nyw3IEBACiAJCSAqIHN0YWxlIGZpcnN0LCB3ZSB3aWxsIG5vdCBhdHRlbXB0IHRvIGxvY2sgdGhlbSBpbiB0aGUgbG9vcAogCQkgKiBiZWxvdyBhcyB0aGUgWEZTX0lTVEFMRSBmbGFnIHdpbGwgYmUgc2V0LgogCQkgKi8KLQkJbGlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19sb2dfaXRlbV90ICopOworCQlsaXAgPSBicC0+Yl9mc3ByaXY7CiAJCXdoaWxlIChsaXApIHsKIAkJCWlmIChsaXAtPmxpX3R5cGUgPT0gWEZTX0xJX0lOT0RFKSB7CiAJCQkJaWlwID0gKHhmc19pbm9kZV9sb2dfaXRlbV90ICopbGlwOwpAQCAtMjA4Niw3ICsxODI0LDYgQEAKIAl4ZnNfYnVmX3QgICAgICAgCSppYnA7CiAKIAlBU1NFUlQoeGZzX2lzaWxvY2tlZChpcCwgWEZTX0lMT0NLX0VYQ0wpKTsKLQlBU1NFUlQoaXAtPmlfdHJhbnNwID09IHRwKTsKIAlBU1NFUlQoaXAtPmlfZC5kaV9ubGluayA9PSAwKTsKIAlBU1NFUlQoaXAtPmlfZC5kaV9uZXh0ZW50cyA9PSAwKTsKIAlBU1NFUlQoaXAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCk7CkBAIC0yNzMzLDcgKzI0NzAsNyBAQAogCQkgKiBtYXJrIHRoZSBidWZmZXIgYXMgYW4gZXJyb3IgYW5kIGNhbGwgdGhlbS4gIE90aGVyd2lzZQogCQkgKiBtYXJrIGl0IGFzIHN0YWxlIGFuZCBicmVsc2UuCiAJCSAqLwotCQlpZiAoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkpIHsKKwkJaWYgKGJwLT5iX2lvZG9uZSkgewogCQkJWEZTX0JVRl9VTkRPTkUoYnApOwogCQkJWEZTX0JVRl9TVEFMRShicCk7CiAJCQlYRlNfQlVGX0VSUk9SKGJwLEVJTyk7CkBAIC0yOTIwLDcgKzI2NTcsNyBAQAogCSAqLwogCXhmc19zeW5jaHJvbml6ZV90aW1lcyhpcCk7CiAKLQlpZiAoWEZTX1RFU1RfRVJST1IoYmUxNl90b19jcHUoZGlwLT5kaV9tYWdpYykgIT0gWEZTX0RJTk9ERV9NQUdJQywKKwlpZiAoWEZTX1RFU1RfRVJST1IoZGlwLT5kaV9tYWdpYyAhPSBjcHVfdG9fYmUxNihYRlNfRElOT0RFX01BR0lDKSwKIAkJCSAgICAgICBtcCwgWEZTX0VSUlRBR19JRkxVU0hfMSwgWEZTX1JBTkRPTV9JRkxVU0hfMSkpIHsKIAkJeGZzX2FsZXJ0X3RhZyhtcCwgWEZTX1BUQUdfSUZMVVNILAogCQkJIiVzOiBCYWQgaW5vZGUgJUx1IG1hZ2ljIG51bWJlciAweCV4LCBwdHIgMHglcCIsCkBAIC0zMDczLDggKzI4MTAsOCBAQAogCQkgKi8KIAkJeGZzX2J1Zl9hdHRhY2hfaW9kb25lKGJwLCB4ZnNfaWZsdXNoX2RvbmUsICZpaXAtPmlsaV9pdGVtKTsKIAotCQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCk7Ci0JCUFTU0VSVChYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKSAhPSBOVUxMKTsKKwkJQVNTRVJUKGJwLT5iX2ZzcHJpdiAhPSBOVUxMKTsKKwkJQVNTRVJUKGJwLT5iX2lvZG9uZSAhPSBOVUxMKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBXZSdyZSBmbHVzaGluZyBhbiBpbm9kZSB3aGljaCBpcyBub3QgaW4gdGhlIEFJTCBhbmQgaGFzCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmggYi9mcy94ZnMveGZzX2lub2RlLmgKaW5kZXggM2FlNmQ1OC4uYTk3NjQ0YSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuaApAQCAtMjQxLDcgKzI0MSw2IEBACiAJeGZzX2lmb3JrX3QJCWlfZGY7CQkvKiBkYXRhIGZvcmsgKi8KIAogCS8qIFRyYW5zYWN0aW9uIGFuZCBsb2NraW5nIGluZm9ybWF0aW9uLiAqLwotCXN0cnVjdCB4ZnNfdHJhbnMJKmlfdHJhbnNwOwkvKiBwdHIgdG8gb3duaW5nIHRyYW5zYWN0aW9uKi8KIAlzdHJ1Y3QgeGZzX2lub2RlX2xvZ19pdGVtICppX2l0ZW1wOwkvKiBsb2dnaW5nIGluZm9ybWF0aW9uICovCiAJbXJsb2NrX3QJCWlfbG9jazsJCS8qIGlub2RlIGxvY2sgKi8KIAltcmxvY2tfdAkJaV9pb2xvY2s7CS8qIGlub2RlIElPIGxvY2sgKi8KQEAgLTM4NCw2ICszODMsMTYgQEAKICNkZWZpbmUgWEZTX0lESVJUWV9SRUxFQVNFCTB4MDA0MAkvKiBkaXJ0eSByZWxlYXNlIGFscmVhZHkgc2VlbiAqLwogCiAvKgorICogUGVyLWxpZmV0aW1lIGZsYWdzIG5lZWQgdG8gYmUgcmVzZXQgd2hlbiByZS11c2luZyBhIHJlY2xhaW1hYmxlIGlub2RlIGR1cmluZworICogaW5vZGUgbG9va3VwLiBUaGkgcHJldmVudHMgdW5pbnRlbmRlZCBiZWhhdmlvdXIgb24gdGhlIG5ldyBpbm9kZSBmcm9tCisgKiBvY3VycmluZy4KKyAqLworI2RlZmluZSBYRlNfSVJFQ0xBSU1fUkVTRVRfRkxBR1MJXAorCShYRlNfSVJFQ0xBSU1BQkxFIHwgWEZTX0lSRUNMQUlNIHwgXAorCSBYRlNfSURJUlRZX1JFTEVBU0UgfCBYRlNfSVRSVU5DQVRFRCB8IFwKKwkgWEZTX0lGSUxFU1RSRUFNKTsKKworLyoKICAqIEZsYWdzIGZvciBpbm9kZSBsb2NraW5nLgogICogQml0IHJhbmdlczoJMTw8MSAgLSAxPDwxNi0xIC0tIGlvbG9jay9pbG9jayBtb2RlcyAoYml0ZmllbGQpCiAgKgkJMTw8MTYgLSAxPDwzMi0xIC0tIGxvY2tkZXAgYW5ub3RhdGlvbiAoaW50ZWdlcnMpCkBAIC00NDgsMTYgKzQ1Nyw2IEBACiBleHRlcm4gc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHhmc19pb2xvY2tfcmVjbGFpbWFibGU7CiAKIC8qCi0gKiBGbGFncyBmb3IgeGZzX2l0cnVuY2F0ZV9zdGFydCgpLgotICovCi0jZGVmaW5lCVhGU19JVFJVTkNfREVGSU5JVEUJMHgxCi0jZGVmaW5lCVhGU19JVFJVTkNfTUFZQkUJMHgyCi0KLSNkZWZpbmUgWEZTX0lUUlVOQ19GTEFHUyBcCi0JeyBYRlNfSVRSVU5DX0RFRklOSVRFLAkiREVGSU5JVEUiIH0sIFwKLQl7IFhGU19JVFJVTkNfTUFZQkUsCSJNQVlCRSIgfQotCi0vKgogICogRm9yIG11bHRpcGxlIGdyb3VwcyBzdXBwb3J0OiBpZiBTX0lTR0lEIGJpdCBpcyBzZXQgaW4gdGhlIHBhcmVudAogICogZGlyZWN0b3J5LCBncm91cCBvZiBuZXcgZmlsZSBpcyBzZXQgdG8gdGhhdCBvZiB0aGUgcGFyZW50LCBhbmQKICAqIG5ldyBzdWJkaXJlY3RvcnkgZ2V0cyBTX0lTR0lEIGJpdCBmcm9tIHBhcmVudC4KQEAgLTQ5MSw5ICs0OTAsMTAgQEAKIHVpbnQJCXhmc19kaWMyeGZsYWdzKHN0cnVjdCB4ZnNfZGlub2RlICopOwogaW50CQl4ZnNfaWZyZWUoc3RydWN0IHhmc190cmFucyAqLCB4ZnNfaW5vZGVfdCAqLAogCQkJICAgc3RydWN0IHhmc19ibWFwX2ZyZWUgKik7Ci1pbnQJCXhmc19pdHJ1bmNhdGVfc3RhcnQoeGZzX2lub2RlX3QgKiwgdWludCwgeGZzX2ZzaXplX3QpOwotaW50CQl4ZnNfaXRydW5jYXRlX2ZpbmlzaChzdHJ1Y3QgeGZzX3RyYW5zICoqLCB4ZnNfaW5vZGVfdCAqLAotCQkJCSAgICAgeGZzX2ZzaXplX3QsIGludCwgaW50KTsKK2ludAkJeGZzX2l0cnVuY2F0ZV9leHRlbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKiosIHN0cnVjdCB4ZnNfaW5vZGUgKiwKKwkJCQkgICAgICBpbnQsIHhmc19mc2l6ZV90KTsKK2ludAkJeGZzX2l0cnVuY2F0ZV9kYXRhKHN0cnVjdCB4ZnNfdHJhbnMgKiosIHN0cnVjdCB4ZnNfaW5vZGUgKiwKKwkJCQkgICB4ZnNfZnNpemVfdCk7CiBpbnQJCXhmc19pdW5saW5rKHN0cnVjdCB4ZnNfdHJhbnMgKiwgeGZzX2lub2RlX3QgKik7CiAKIHZvaWQJCXhmc19pZXh0X3JlYWxsb2MoeGZzX2lub2RlX3QgKiwgaW50LCBpbnQpOwpAQCAtNTY5LDEzICs1NjksNiBAQAogCiAjZGVmaW5lIHhmc19pcGluY291bnQoaXApCSgodW5zaWduZWQgaW50KSBhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpKQogCi0jaWZkZWYgREVCVUcKLXZvaWQJCXhmc19pc2l6ZV9jaGVjayhzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwKLQkJCQl4ZnNfZnNpemVfdCk7Ci0jZWxzZQkvKiBERUJVRyAqLwotI2RlZmluZSB4ZnNfaXNpemVfY2hlY2sobXAsIGlwLCBpc2l6ZSkKLSNlbmRpZgkvKiBERUJVRyAqLwotCiAjaWYgZGVmaW5lZChERUJVRykKIHZvaWQJCXhmc19pbm9icF9jaGVjayhzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfYnVmICopOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKaW5kZXggMDk5ODNhMy4uNTg4NDA2ZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKQEAgLTYzMiwxMyArNjMyLDggQEAKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IGlpcC0+aWxpX2lub2RlOwogCXVuc2lnbmVkIHNob3J0CQlsb2NrX2ZsYWdzOwogCi0JQVNTRVJUKGlpcC0+aWxpX2lub2RlLT5pX2l0ZW1wICE9IE5VTEwpOwotCUFTU0VSVCh4ZnNfaXNpbG9ja2VkKGlpcC0+aWxpX2lub2RlLCBYRlNfSUxPQ0tfRVhDTCkpOwotCi0JLyoKLQkgKiBDbGVhciB0aGUgdHJhbnNhY3Rpb24gcG9pbnRlciBpbiB0aGUgaW5vZGUuCi0JICovCi0JaXAtPmlfdHJhbnNwID0gTlVMTDsKKwlBU1NFUlQoaXAtPmlfaXRlbXAgIT0gTlVMTCk7CisJQVNTRVJUKHhmc19pc2lsb2NrZWQoaXAsIFhGU19JTE9DS19FWENMKSk7CiAKIAkvKgogCSAqIElmIHRoZSBpbm9kZSBuZWVkZWQgYSBzZXBhcmF0ZSBidWZmZXIgd2l0aCB3aGljaCB0byBsb2cKQEAgLTY2NCw4ICs2NTksOCBAQAogCWxvY2tfZmxhZ3MgPSBpaXAtPmlsaV9sb2NrX2ZsYWdzOwogCWlpcC0+aWxpX2xvY2tfZmxhZ3MgPSAwOwogCWlmIChsb2NrX2ZsYWdzKSB7Ci0JCXhmc19pdW5sb2NrKGlpcC0+aWxpX2lub2RlLCBsb2NrX2ZsYWdzKTsKLQkJSVJFTEUoaWlwLT5pbGlfaW5vZGUpOworCQl4ZnNfaXVubG9jayhpcCwgbG9ja19mbGFncyk7CisJCUlSRUxFKGlwKTsKIAl9CiB9CiAKQEAgLTY4MSwxNSArNjc2LDE1IEBACiAgKiB3aGVyZSB0aGUgY2x1c3RlciBidWZmZXIgbWF5IGJlIHVucGlubmVkIGJlZm9yZSB0aGUgaW5vZGUgaXMgaW5zZXJ0ZWQgaW50bwogICogdGhlIEFJTCBkdXJpbmcgdHJhbnNhY3Rpb24gY29tbWl0dGVkIHByb2Nlc3NpbmcuIElmIHRoZSBidWZmZXIgaXMgdW5waW5uZWQKICAqIGJlZm9yZSB0aGUgaW5vZGUgaXRlbSBoYXMgYmVlbiBjb21taXR0ZWQgYW5kIGluc2VydGVkLCB0aGVuIGl0IGlzIHBvc3NpYmxlCi0gKiBmb3IgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuIGFuZCBJTyBjb21wbGV0aW9ucyBiZWZvcmUgdGhlIGlub2RlIGlzIGluc2VydGVkCisgKiBmb3IgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuIGFuZCBJTyBjb21wbGV0ZXMgYmVmb3JlIHRoZSBpbm9kZSBpcyBpbnNlcnRlZAogICogaW50byB0aGUgQUlMLiBJbiB0aGF0IGNhc2UsIHdlJ2QgYmUgaW5zZXJ0aW5nIGEgY2xlYW4sIHN0YWxlIGlub2RlIGludG8gdGhlCiAgKiBBSUwgd2hpY2ggd2lsbCBuZXZlciBnZXQgcmVtb3ZlZC4gSXQgd2lsbCwgaG93ZXZlciwgZ2V0IHJlY2xhaW1lZCB3aGljaAogICogdHJpZ2dlcnMgYW4gYXNzZXJ0IGluIHhmc19pbm9kZV9mcmVlKCkgY29tcGxhaW5pbmcgYWJvdXQgZnJlZWluIGFuIGlub2RlCiAgKiBzdGlsbCBpbiB0aGUgQUlMLgogICoKLSAqIFRvIGF2b2lkIHRoaXMsIHJldHVybiBhIGxvd2VyIExTTiB0aGFuIHRoZSBvbmUgcGFzc2VkIGluIHNvIHRoYXQgdGhlCi0gKiB0cmFuc2FjdGlvbiBjb21taXR0ZWQgY29kZSB3aWxsIG5vdCBtb3ZlIHRoZSBpbm9kZSBmb3J3YXJkIGluIHRoZSBBSUwgYnV0Ci0gKiB3aWxsIHN0aWxsIHVucGluIGl0IHByb3Blcmx5LgorICogVG8gYXZvaWQgdGhpcywganVzdCB1bnBpbiB0aGUgaW5vZGUgZGlyZWN0bHkgYW5kIHJldHVybiBhIExTTiBvZiAtMSBzbyB0aGUKKyAqIHRyYW5zYWN0aW9uIGNvbW1pdHRlZCBjb2RlIGtub3dzIHRoYXQgaXQgZG9lcyBub3QgbmVlZCB0byBkbyBhbnkgZnVydGhlcgorICogcHJvY2Vzc2luZyBvbiB0aGUgaXRlbS4KICAqLwogU1RBVElDIHhmc19sc25fdAogeGZzX2lub2RlX2l0ZW1fY29tbWl0dGVkKApAQCAtNjk5LDggKzY5NCwxMCBAQAogCXN0cnVjdCB4ZnNfaW5vZGVfbG9nX2l0ZW0gKmlpcCA9IElOT0RFX0lURU0obGlwKTsKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IGlpcC0+aWxpX2lub2RlOwogCi0JaWYgKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lTVEFMRSkpCi0JCXJldHVybiBsc24gLSAxOworCWlmICh4ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JU1RBTEUpKSB7CisJCXhmc19pbm9kZV9pdGVtX3VucGluKGxpcCwgMCk7CisJCXJldHVybiAtMTsKKwl9CiAJcmV0dXJuIGxzbjsKIH0KIApAQCAtODc3LDcgKzg3NCw3IEBACiAJICogU2NhbiB0aGUgYnVmZmVyIElPIGNvbXBsZXRpb25zIGZvciBvdGhlciBpbm9kZXMgYmVpbmcgY29tcGxldGVkIGFuZAogCSAqIGF0dGFjaCB0aGVtIHRvIHRoZSBjdXJyZW50IGlub2RlIGxvZyBpdGVtLgogCSAqLwotCWJsaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2xvZ19pdGVtX3QgKik7CisJYmxpcCA9IGJwLT5iX2ZzcHJpdjsKIAlwcmV2ID0gTlVMTDsKIAl3aGlsZSAoYmxpcCAhPSBOVUxMKSB7CiAJCWlmIChsaXAtPmxpX2NiICE9IHhmc19pZmx1c2hfZG9uZSkgewpAQCAtODg5LDcgKzg4Niw3IEBACiAJCS8qIHJlbW92ZSBmcm9tIGxpc3QgKi8KIAkJbmV4dCA9IGJsaXAtPmxpX2Jpb19saXN0OwogCQlpZiAoIXByZXYpIHsKLQkJCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgbmV4dCk7CisJCQlicC0+Yl9mc3ByaXYgPSBuZXh0OwogCQl9IGVsc2UgewogCQkJcHJldi0+bGlfYmlvX2xpc3QgPSBuZXh0OwogCQl9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ludW0uaCBiL2ZzL3hmcy94ZnNfaW51bS5oCmluZGV4IGI4ZTRlZTQuLmIyNTNjMGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW51bS5oCisrKyBiL2ZzL3hmcy94ZnNfaW51bS5oCkBAIC0yOCwxNyArMjgsNiBAQAogCiB0eXBlZGVmCV9fdWludDMyX3QJeGZzX2FnaW5vX3Q7CS8qIHdpdGhpbiBhbGxvY2F0aW9uIGdycCBpbm9kZSBudW1iZXIgKi8KIAotLyoKLSAqIFVzZWZ1bCBpbm9kZSBiaXRzIGZvciB0aGlzIGtlcm5lbC4KLSAqIFVzZWQgaW4gc29tZSBwbGFjZXMgd2hlcmUgaGF2aW5nIDY0LWJpdHMgaW4gdGhlIDMyLWJpdCBrZXJuZWxzCi0gKiBjb3N0cyB0b28gbXVjaC4KLSAqLwotI2lmIFhGU19CSUdfSU5VTVMKLXR5cGVkZWYJeGZzX2lub190CXhmc19pbnRpbm9fdDsKLSNlbHNlCi10eXBlZGVmCV9fdWludDMyX3QJeGZzX2ludGlub190OwotI2VuZGlmCi0KICNkZWZpbmUJTlVMTEZTSU5PCSgoeGZzX2lub190KS0xKQogI2RlZmluZQlOVUxMQUdJTk8JKCh4ZnNfYWdpbm9fdCktMSkKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2cuYyBiL2ZzL3hmcy94ZnNfbG9nLmMKaW5kZXggMjExOTMwMi4uMDZmZjg0MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2cuYworKysgYi9mcy94ZnMveGZzX2xvZy5jCkBAIC04NzEsMTUgKzg3MSw5IEBACiB2b2lkCiB4bG9nX2lvZG9uZSh4ZnNfYnVmX3QgKmJwKQogewotCXhsb2dfaW5fY29yZV90CSppY2xvZzsKLQl4bG9nX3QJCSpsOwotCWludAkJYWJvcnRlZDsKLQotCWljbG9nID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhsb2dfaW5fY29yZV90ICopOwotCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHVuc2lnbmVkIGxvbmcpID09ICh1bnNpZ25lZCBsb25nKSAyKTsKLQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCAodW5zaWduZWQgbG9uZykxKTsKLQlhYm9ydGVkID0gMDsKLQlsID0gaWNsb2ctPmljX2xvZzsKKwl4bG9nX2luX2NvcmVfdAkqaWNsb2cgPSBicC0+Yl9mc3ByaXY7CisJeGxvZ190CQkqbCA9IGljbG9nLT5pY19sb2c7CisJaW50CQlhYm9ydGVkID0gMDsKIAogCS8qCiAJICogUmFjZSB0byBzaHV0ZG93biB0aGUgZmlsZXN5c3RlbSBpZiB3ZSBzZWUgYW4gZXJyb3IuCkBAIC0xMDU2LDEwICsxMDUwLDkgQEAKIAlicCA9IHhmc19idWZfZ2V0X2VtcHR5KGxvZy0+bF9pY2xvZ19zaXplLCBtcC0+bV9sb2dkZXZfdGFyZ3ApOwogCWlmICghYnApCiAJCWdvdG8gb3V0X2ZyZWVfbG9nOwotCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4bG9nX2lvZG9uZSk7Ci0JWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgKHVuc2lnbmVkIGxvbmcpMSk7CisJYnAtPmJfaW9kb25lID0geGxvZ19pb2RvbmU7CiAJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7Ci0JQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApIDw9IDApOworCUFTU0VSVCh4ZnNfYnVmX2lzbG9ja2VkKGJwKSk7CiAJbG9nLT5sX3hidWYgPSBicDsKIAogCXNwaW5fbG9ja19pbml0KCZsb2ctPmxfaWNsb2dsb2NrKTsKQEAgLTEwOTAsMTAgKzEwODMsOCBAQAogCQkJCQkJbG9nLT5sX2ljbG9nX3NpemUsIDApOwogCQlpZiAoIWJwKQogCQkJZ290byBvdXRfZnJlZV9pY2xvZzsKLQkJaWYgKCFYRlNfQlVGX0NQU0VNQShicCkpCi0JCQlBU1NFUlQoMCk7Ci0JCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4bG9nX2lvZG9uZSk7Ci0JCVhGU19CVUZfU0VUX0ZTUFJJVkFURTIoYnAsICh1bnNpZ25lZCBsb25nKTEpOworCisJCWJwLT5iX2lvZG9uZSA9IHhsb2dfaW9kb25lOwogCQlpY2xvZy0+aWNfYnAgPSBicDsKIAkJaWNsb2ctPmljX2RhdGEgPSBicC0+Yl9hZGRyOwogI2lmZGVmIERFQlVHCkBAIC0xMTE4LDcgKzExMDksNyBAQAogCQlpY2xvZy0+aWNfZGF0YXAgPSAoY2hhciAqKWljbG9nLT5pY19kYXRhICsgbG9nLT5sX2ljbG9nX2hzaXplOwogCiAJCUFTU0VSVChYRlNfQlVGX0lTQlVTWShpY2xvZy0+aWNfYnApKTsKLQkJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoaWNsb2ctPmljX2JwKSA8PSAwKTsKKwkJQVNTRVJUKHhmc19idWZfaXNsb2NrZWQoaWNsb2ctPmljX2JwKSk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmljbG9nLT5pY19mb3JjZV93YWl0KTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmaWNsb2ctPmljX3dyaXRlX3dhaXQpOwogCkBAIC0xMjU0LDkgKzEyNDUsOCBAQAogeGxvZ19iZHN0cmF0KAogCXN0cnVjdCB4ZnNfYnVmCQkqYnApCiB7Ci0Jc3RydWN0IHhsb2dfaW5fY29yZQkqaWNsb2c7CisJc3RydWN0IHhsb2dfaW5fY29yZQkqaWNsb2cgPSBicC0+Yl9mc3ByaXY7CiAKLQlpY2xvZyA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4bG9nX2luX2NvcmVfdCAqKTsKIAlpZiAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSB7CiAJCVhGU19CVUZfRVJST1IoYnAsIEVJTyk7CiAJCVhGU19CVUZfU1RBTEUoYnApOwpAQCAtMTI2OSw3ICsxMjU5LDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JYnAtPmJfZmxhZ3MgfD0gX1hCRl9SVU5fUVVFVUVTOwogCXhmc19idWZfaW9yZXF1ZXN0KGJwKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEzNTEsOCArMTM0MCw2IEBACiAJfQogCiAJYnAgPSBpY2xvZy0+aWNfYnA7Ci0JQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgdW5zaWduZWQgbG9uZykgPT0gKHVuc2lnbmVkIGxvbmcpMSk7Ci0JWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgKHVuc2lnbmVkIGxvbmcpMik7CiAJWEZTX0JVRl9TRVRfQUREUihicCwgQkxPQ0tfTFNOKGJlNjRfdG9fY3B1KGljbG9nLT5pY19oZWFkZXIuaF9sc24pKSk7CiAKIAlYRlNfU1RBVFNfQUREKHhzX2xvZ19ibG9ja3MsIEJUT0JCKGNvdW50KSk7CkBAIC0xMzY2LDE0ICsxMzUzLDI5IEBACiAJCWljbG9nLT5pY19id3JpdGVjbnQgPSAxOwogCX0KIAlYRlNfQlVGX1NFVF9DT1VOVChicCwgY291bnQpOwotCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgaWNsb2cpOwkvKiBzYXZlIGZvciBsYXRlciAqLworCWJwLT5iX2ZzcHJpdiA9IGljbG9nOwogCVhGU19CVUZfWkVST0ZMQUdTKGJwKTsKIAlYRlNfQlVGX0JVU1koYnApOwogCVhGU19CVUZfQVNZTkMoYnApOwotCWJwLT5iX2ZsYWdzIHw9IFhCRl9MT0dfQlVGRkVSOworCWJwLT5iX2ZsYWdzIHw9IFhCRl9TWU5DSU87CiAKLQlpZiAobG9nLT5sX21wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0JBUlJJRVIpCi0JCVhGU19CVUZfT1JERVJFRChicCk7CisJaWYgKGxvZy0+bF9tcC0+bV9mbGFncyAmIFhGU19NT1VOVF9CQVJSSUVSKSB7CisJCWJwLT5iX2ZsYWdzIHw9IFhCRl9GVUE7CisKKwkJLyoKKwkJICogRmx1c2ggdGhlIGRhdGEgZGV2aWNlIGJlZm9yZSBmbHVzaGluZyB0aGUgbG9nIHRvIG1ha2UKKwkJICogc3VyZSBhbGwgbWV0YSBkYXRhIHdyaXR0ZW4gYmFjayBmcm9tIHRoZSBBSUwgYWN0dWFsbHkgbWFkZQorCQkgKiBpdCB0byBkaXNrIGJlZm9yZSBzdGFtcGluZyB0aGUgbmV3IGxvZyB0YWlsIExTTiBpbnRvIHRoZQorCQkgKiBsb2cgYnVmZmVyLiAgRm9yIGFuIGV4dGVybmFsIGxvZyB3ZSBuZWVkIHRvIGlzc3VlIHRoZQorCQkgKiBmbHVzaCBleHBsaWNpdGx5LCBhbmQgdW5mb3J0dW5hdGVseSBzeW5jaHJvbm91c2x5IGhlcmU7CisJCSAqIGZvciBhbiBpbnRlcm5hbCBsb2cgd2UgY2FuIHNpbXBseSB1c2UgdGhlIGJsb2NrIGxheWVyCisJCSAqIHN0YXRlIG1hY2hpbmUgZm9yIHByZWZsdXNoZXMuCisJCSAqLworCQlpZiAobG9nLT5sX21wLT5tX2xvZ2Rldl90YXJncCAhPSBsb2ctPmxfbXAtPm1fZGRldl90YXJncCkKKwkJCXhmc19ibGtkZXZfaXNzdWVfZmx1c2gobG9nLT5sX21wLT5tX2RkZXZfdGFyZ3ApOworCQllbHNlCisJCQlicC0+Yl9mbGFncyB8PSBYQkZfRkxVU0g7CisJfQogCiAJQVNTRVJUKFhGU19CVUZfQUREUihicCkgPD0gbG9nLT5sX2xvZ0JCc2l6ZS0xKTsKIAlBU1NFUlQoWEZTX0JVRl9BRERSKGJwKSArIEJUT0JCKGNvdW50KSA8PSBsb2ctPmxfbG9nQkJzaXplKTsKQEAgLTEzOTUsMTkgKzEzOTcsMTYgQEAKIAl9CiAJaWYgKHNwbGl0KSB7CiAJCWJwID0gaWNsb2ctPmljX2xvZy0+bF94YnVmOwotCQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB1bnNpZ25lZCBsb25nKSA9PQotCQkJCQkJCSh1bnNpZ25lZCBsb25nKTEpOwotCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCAodW5zaWduZWQgbG9uZykyKTsKIAkJWEZTX0JVRl9TRVRfQUREUihicCwgMCk7CSAgICAgLyogbG9naWNhbCAwICovCiAJCVhGU19CVUZfU0VUX1BUUihicCwgKHhmc19jYWRkcl90KSgoX19wc2ludF90KSYoaWNsb2ctPmljX2hlYWRlcikrCiAJCQkJCSAgICAoX19wc2ludF90KWNvdW50KSwgc3BsaXQpOwotCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIGljbG9nKTsKKwkJYnAtPmJfZnNwcml2ID0gaWNsb2c7CiAJCVhGU19CVUZfWkVST0ZMQUdTKGJwKTsKIAkJWEZTX0JVRl9CVVNZKGJwKTsKIAkJWEZTX0JVRl9BU1lOQyhicCk7Ci0JCWJwLT5iX2ZsYWdzIHw9IFhCRl9MT0dfQlVGRkVSOworCQlicC0+Yl9mbGFncyB8PSBYQkZfU1lOQ0lPOwogCQlpZiAobG9nLT5sX21wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0JBUlJJRVIpCi0JCQlYRlNfQlVGX09SREVSRUQoYnApOworCQkJYnAtPmJfZmxhZ3MgfD0gWEJGX0ZVQTsKIAkJZHB0ciA9IFhGU19CVUZfUFRSKGJwKTsKIAkJLyoKIAkJICogQnVtcCB0aGUgY3ljbGUgbnVtYmVycyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBibG9jawpAQCAtMzUxMiwxMyArMzUxMSwxMyBAQAogCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAogCS8qIGNoZWNrIGxvZyBtYWdpYyBudW1iZXJzICovCi0JaWYgKGJlMzJfdG9fY3B1KGljbG9nLT5pY19oZWFkZXIuaF9tYWdpY25vKSAhPSBYTE9HX0hFQURFUl9NQUdJQ19OVU0pCisJaWYgKGljbG9nLT5pY19oZWFkZXIuaF9tYWdpY25vICE9IGNwdV90b19iZTMyKFhMT0dfSEVBREVSX01BR0lDX05VTSkpCiAJCXhmc19lbWVyZyhsb2ctPmxfbXAsICIlczogaW52YWxpZCBtYWdpYyBudW0iLCBfX2Z1bmNfXyk7CiAKIAlwdHIgPSAoeGZzX2NhZGRyX3QpICZpY2xvZy0+aWNfaGVhZGVyOwogCWZvciAocHRyICs9IEJCU0laRTsgcHRyIDwgKCh4ZnNfY2FkZHJfdCkmaWNsb2ctPmljX2hlYWRlcikgKyBjb3VudDsKIAkgICAgIHB0ciArPSBCQlNJWkUpIHsKLQkJaWYgKGJlMzJfdG9fY3B1KCooX19iZTMyICopcHRyKSA9PSBYTE9HX0hFQURFUl9NQUdJQ19OVU0pCisJCWlmICgqKF9fYmUzMiAqKXB0ciA9PSBjcHVfdG9fYmUzMihYTE9HX0hFQURFUl9NQUdJQ19OVU0pKQogCQkJeGZzX2VtZXJnKGxvZy0+bF9tcCwgIiVzOiB1bmV4cGVjdGVkIG1hZ2ljIG51bSIsCiAJCQkJX19mdW5jX18pOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwppbmRleCAwNDE0MmNhLi44ZmU0MjA2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKKysrIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCkBAIC05MSw2ICs5MSw4IEBACiAJeGxvZ190CQkqbG9nLAogCWludAkJbmJibGtzKQogeworCXN0cnVjdCB4ZnNfYnVmCSpicDsKKwogCWlmICgheGxvZ19idWZfYmJjb3VudF92YWxpZChsb2csIG5iYmxrcykpIHsKIAkJeGZzX3dhcm4obG9nLT5sX21wLCAiSW52YWxpZCBibG9jayBsZW5ndGggKDB4JXgpIGZvciBidWZmZXIiLAogCQkJbmJibGtzKTsKQEAgLTExOCw4ICsxMjAsMTAgQEAKIAkJbmJibGtzICs9IGxvZy0+bF9zZWN0QkJzaXplOwogCW5iYmxrcyA9IHJvdW5kX3VwKG5iYmxrcywgbG9nLT5sX3NlY3RCQnNpemUpOwogCi0JcmV0dXJuIHhmc19idWZfZ2V0X3VuY2FjaGVkKGxvZy0+bF9tcC0+bV9sb2dkZXZfdGFyZ3AsCi0JCQkJCUJCVE9CKG5iYmxrcyksIDApOworCWJwID0geGZzX2J1Zl9nZXRfdW5jYWNoZWQobG9nLT5sX21wLT5tX2xvZ2Rldl90YXJncCwgQkJUT0IobmJibGtzKSwgMCk7CisJaWYgKGJwKQorCQl4ZnNfYnVmX3VubG9jayhicCk7CisJcmV0dXJuIGJwOwogfQogCiBTVEFUSUMgdm9pZApAQCAtMjY0LDcgKzI2OCw3IEBACiAJWEZTX0JVRl9aRVJPRkxBR1MoYnApOwogCVhGU19CVUZfQlVTWShicCk7CiAJWEZTX0JVRl9IT0xEKGJwKTsKLQlYRlNfQlVGX1BTRU1BKGJwLCBQUklCSU8pOworCXhmc19idWZfbG9jayhicCk7CiAJWEZTX0JVRl9TRVRfQ09VTlQoYnAsIEJCVE9CKG5iYmxrcykpOwogCVhGU19CVUZfU0VUX1RBUkdFVChicCwgbG9nLT5sX21wLT5tX2xvZ2Rldl90YXJncCk7CiAKQEAgLTMwMCwxNCArMzA0LDE0IEBACiAJeGZzX21vdW50X3QJCSptcCwKIAl4bG9nX3JlY19oZWFkZXJfdAkqaGVhZCkKIHsKLQlBU1NFUlQoYmUzMl90b19jcHUoaGVhZC0+aF9tYWdpY25vKSA9PSBYTE9HX0hFQURFUl9NQUdJQ19OVU0pOworCUFTU0VSVChoZWFkLT5oX21hZ2ljbm8gPT0gY3B1X3RvX2JlMzIoWExPR19IRUFERVJfTUFHSUNfTlVNKSk7CiAKIAkvKgogCSAqIElSSVggZG9lc24ndCB3cml0ZSB0aGUgaF9mbXQgZmllbGQgYW5kIGxlYXZlcyBpdCB6ZXJvZWQKIAkgKiAoWExPR19GTVRfVU5LTk9XTikuIFRoaXMgc3RvcHMgdXMgZnJvbSB0cnlpbmcgdG8gcmVjb3ZlcgogCSAqIGEgZGlydHkgbG9nIGNyZWF0ZWQgaW4gSVJJWC4KIAkgKi8KLQlpZiAodW5saWtlbHkoYmUzMl90b19jcHUoaGVhZC0+aF9mbXQpICE9IFhMT0dfRk1UKSkgeworCWlmICh1bmxpa2VseShoZWFkLT5oX2ZtdCAhPSBjcHVfdG9fYmUzMihYTE9HX0ZNVCkpKSB7CiAJCXhmc193YXJuKG1wLAogCSJkaXJ0eSBsb2cgd3JpdHRlbiBpbiBpbmNvbXBhdGlibGUgZm9ybWF0IC0gY2FuJ3QgcmVjb3ZlciIpOwogCQl4bG9nX2hlYWRlcl9jaGVja19kdW1wKG1wLCBoZWFkKTsKQEAgLTMzMyw3ICszMzcsNyBAQAogCXhmc19tb3VudF90CQkqbXAsCiAJeGxvZ19yZWNfaGVhZGVyX3QJKmhlYWQpCiB7Ci0JQVNTRVJUKGJlMzJfdG9fY3B1KGhlYWQtPmhfbWFnaWNubykgPT0gWExPR19IRUFERVJfTUFHSUNfTlVNKTsKKwlBU1NFUlQoaGVhZC0+aF9tYWdpY25vID09IGNwdV90b19iZTMyKFhMT0dfSEVBREVSX01BR0lDX05VTSkpOwogCiAJaWYgKHV1aWRfaXNfbmlsKCZoZWFkLT5oX2ZzX3V1aWQpKSB7CiAJCS8qCkBAIC0zNjcsNyArMzcxLDcgQEAKIAkJeGZzX2ZvcmNlX3NodXRkb3duKGJwLT5iX3RhcmdldC0+YnRfbW91bnQsCiAJCQkJCVNIVVRET1dOX01FVEFfSU9fRVJST1IpOwogCX0KLQlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CisJYnAtPmJfaW9kb25lID0gTlVMTDsKIAl4ZnNfYnVmX2lvZW5kKGJwLCAwKTsKIH0KIApAQCAtNTM0LDcgKzUzOCw3IEBACiAKIAkJaGVhZCA9ICh4bG9nX3JlY19oZWFkZXJfdCAqKW9mZnNldDsKIAotCQlpZiAoWExPR19IRUFERVJfTUFHSUNfTlVNID09IGJlMzJfdG9fY3B1KGhlYWQtPmhfbWFnaWNubykpCisJCWlmIChoZWFkLT5oX21hZ2ljbm8gPT0gY3B1X3RvX2JlMzIoWExPR19IRUFERVJfTUFHSUNfTlVNKSkKIAkJCWJyZWFrOwogCiAJCWlmICghc21hbGxtZW0pCkBAIC05MTYsNyArOTIwLDcgQEAKIAkJaWYgKGVycm9yKQogCQkJZ290byBkb25lOwogCi0JCWlmIChYTE9HX0hFQURFUl9NQUdJQ19OVU0gPT0gYmUzMl90b19jcHUoKihfX2JlMzIgKilvZmZzZXQpKSB7CisJCWlmICgqKF9fYmUzMiAqKW9mZnNldCA9PSBjcHVfdG9fYmUzMihYTE9HX0hFQURFUl9NQUdJQ19OVU0pKSB7CiAJCQlmb3VuZCA9IDE7CiAJCQlicmVhazsKIAkJfQpAQCAtOTMzLDggKzkzNyw4IEBACiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCi0JCQlpZiAoWExPR19IRUFERVJfTUFHSUNfTlVNID09Ci0JCQkgICAgYmUzMl90b19jcHUoKihfX2JlMzIgKilvZmZzZXQpKSB7CisJCQlpZiAoKihfX2JlMzIgKilvZmZzZXQgPT0KKwkJCSAgICBjcHVfdG9fYmUzMihYTE9HX0hFQURFUl9NQUdJQ19OVU0pKSB7CiAJCQkJZm91bmQgPSAyOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTk0Nyw3ICsxOTUxLDcgQEAKIAkgKiBUaGlzIGlzIGFsbCBmaW5lOyB0aGluZ3MgYXJlIHN0aWxsIGNvbnNpc3RlbnQsIGFuZCB3ZSBoYXZlbid0IGxvc3QKIAkgKiBhbnkgcXVvdGEgaW5mb3JtYXRpb24uIEp1c3QgZG9uJ3QgY29tcGxhaW4gYWJvdXQgYmFkIGRxdW90IGJsa3MuCiAJICovCi0JaWYgKGJlMTZfdG9fY3B1KGRkcS0+ZF9tYWdpYykgIT0gWEZTX0RRVU9UX01BR0lDKSB7CisJaWYgKGRkcS0+ZF9tYWdpYyAhPSBjcHVfdG9fYmUxNihYRlNfRFFVT1RfTUFHSUMpKSB7CiAJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCiAJCQl4ZnNfYWxlcnQobXAsCiAJCQkiJXMgOiBYRlMgZHF1b3QgSUQgMHgleCwgbWFnaWMgMHgleCAhPSAweCV4IiwKQEAgLTIxNzQsNyArMjE3OCw3IEBACiAJCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOwogCX0gZWxzZSB7CiAJCUFTU0VSVChicC0+Yl90YXJnZXQtPmJ0X21vdW50ID09IG1wKTsKLQkJWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMoYnAsIHhsb2dfcmVjb3Zlcl9pb2RvbmUpOworCQlicC0+Yl9pb2RvbmUgPSB4bG9nX3JlY292ZXJfaW9kb25lOwogCQl4ZnNfYmR3cml0ZShtcCwgYnApOwogCX0KIApAQCAtMjIzOCw3ICsyMjQyLDcgQEAKIAkgKiBNYWtlIHN1cmUgdGhlIHBsYWNlIHdlJ3JlIGZsdXNoaW5nIG91dCB0byByZWFsbHkgbG9va3MKIAkgKiBsaWtlIGFuIGlub2RlIQogCSAqLwotCWlmICh1bmxpa2VseShiZTE2X3RvX2NwdShkaXAtPmRpX21hZ2ljKSAhPSBYRlNfRElOT0RFX01BR0lDKSkgeworCWlmICh1bmxpa2VseShkaXAtPmRpX21hZ2ljICE9IGNwdV90b19iZTE2KFhGU19ESU5PREVfTUFHSUMpKSkgewogCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJeGZzX2FsZXJ0KG1wLAogCSIlczogQmFkIGlub2RlIG1hZ2ljIG51bWJlciwgZGlwID0gMHglcCwgZGlubyBicCA9IDB4JXAsIGlubyA9ICVMZCIsCkBAIC0yNDM0LDcgKzI0MzgsNyBAQAogCiB3cml0ZV9pbm9kZV9idWZmZXI6CiAJQVNTRVJUKGJwLT5iX3RhcmdldC0+YnRfbW91bnQgPT0gbXApOwotCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4bG9nX3JlY292ZXJfaW9kb25lKTsKKwlicC0+Yl9pb2RvbmUgPSB4bG9nX3JlY292ZXJfaW9kb25lOwogCXhmc19iZHdyaXRlKG1wLCBicCk7CiBlcnJvcjoKIAlpZiAobmVlZF9mcmVlKQpAQCAtMjU1Niw3ICsyNTYwLDcgQEAKIAogCUFTU0VSVChkcV9mLT5xbGZfc2l6ZSA9PSAyKTsKIAlBU1NFUlQoYnAtPmJfdGFyZ2V0LT5idF9tb3VudCA9PSBtcCk7Ci0JWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMoYnAsIHhsb2dfcmVjb3Zlcl9pb2RvbmUpOworCWJwLT5iX2lvZG9uZSA9IHhsb2dfcmVjb3Zlcl9pb2RvbmU7CiAJeGZzX2Jkd3JpdGUobXAsIGJwKTsKIAogCXJldHVybiAoMCk7CkBAIC0zMjk1LDcgKzMyOTksNyBAQAogewogCWludAkJCWhsZW47CiAKLQlpZiAodW5saWtlbHkoYmUzMl90b19jcHUocmhlYWQtPmhfbWFnaWNubykgIT0gWExPR19IRUFERVJfTUFHSUNfTlVNKSkgeworCWlmICh1bmxpa2VseShyaGVhZC0+aF9tYWdpY25vICE9IGNwdV90b19iZTMyKFhMT0dfSEVBREVSX01BR0lDX05VTSkpKSB7CiAJCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfdmFsaWRfcmVjX2hlYWRlcigxKSIsCiAJCQkJWEZTX0VSUkxFVkVMX0xPVywgbG9nLT5sX21wKTsKIAkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tb3VudC5jIGIvZnMveGZzL3hmc19tb3VudC5jCmluZGV4IGI0OWI4MjMuLjdmMjUyNDUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbW91bnQuYworKysgYi9mcy94ZnMveGZzX21vdW50LmMKQEAgLTM0OCw3ICszNDgsNyBAQAogCX0KIAogCS8qCi0JICogTW9yZSBzYW5pdHkgY2hlY2tpbmcuIFRoZXNlIHdlcmUgc3RvbGVuIGRpcmVjdGx5IGZyb20KKwkgKiBNb3JlIHNhbml0eSBjaGVja2luZy4gIE1vc3Qgb2YgdGhlc2Ugd2VyZSBzdG9sZW4gZGlyZWN0bHkgZnJvbQogCSAqIHhmc19yZXBhaXIuCiAJICovCiAJaWYgKHVubGlrZWx5KApAQCAtMzcxLDIzICszNzEsMTMgQEAKIAkgICAgKHNicC0+c2JfYmxvY2tsb2cgLSBzYnAtPnNiX2lub2RlbG9nICE9IHNicC0+c2JfaW5vcGJsb2cpCXx8CiAJICAgIChzYnAtPnNiX3JleHRzaXplICogc2JwLT5zYl9ibG9ja3NpemUgPiBYRlNfTUFYX1JURVhUU0laRSkJfHwKIAkgICAgKHNicC0+c2JfcmV4dHNpemUgKiBzYnAtPnNiX2Jsb2Nrc2l6ZSA8IFhGU19NSU5fUlRFWFRTSVpFKQl8fAotCSAgICAoc2JwLT5zYl9pbWF4X3BjdCA+IDEwMCAvKiB6ZXJvIHNiX2ltYXhfcGN0IGlzIHZhbGlkICovKSkpIHsKKwkgICAgKHNicC0+c2JfaW1heF9wY3QgPiAxMDAgLyogemVybyBzYl9pbWF4X3BjdCBpcyB2YWxpZCAqLykJfHwKKwkgICAgc2JwLT5zYl9kYmxvY2tzID09IDAJCQkJCXx8CisJICAgIHNicC0+c2JfZGJsb2NrcyA+IFhGU19NQVhfREJMT0NLUyhzYnApCQkJfHwKKwkgICAgc2JwLT5zYl9kYmxvY2tzIDwgWEZTX01JTl9EQkxPQ0tTKHNicCkpKSB7CiAJCWlmIChsb3VkKQotCQkJeGZzX3dhcm4obXAsICJTQiBzYW5pdHkgY2hlY2sgMSBmYWlsZWQiKTsKLQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwotCX0KLQotCS8qCi0JICogU2FuaXR5IGNoZWNrIEFHIGNvdW50LCBzaXplIGZpZWxkcyBhZ2FpbnN0IGRhdGEgc2l6ZSBmaWVsZAotCSAqLwotCWlmICh1bmxpa2VseSgKLQkgICAgc2JwLT5zYl9kYmxvY2tzID09IDAgfHwKLQkgICAgc2JwLT5zYl9kYmxvY2tzID4KLQkgICAgICh4ZnNfZHJmc2Jub190KXNicC0+c2JfYWdjb3VudCAqIHNicC0+c2JfYWdibG9ja3MgfHwKLQkgICAgc2JwLT5zYl9kYmxvY2tzIDwgKHhmc19kcmZzYm5vX3QpKHNicC0+c2JfYWdjb3VudCAtIDEpICoKLQkJCSAgICAgIHNicC0+c2JfYWdibG9ja3MgKyBYRlNfTUlOX0FHX0JMT0NLUykpIHsKLQkJaWYgKGxvdWQpCi0JCQl4ZnNfd2FybihtcCwgIlNCIHNhbml0eSBjaGVjayAyIGZhaWxlZCIpOworCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoIlNCIHNhbml0eSBjaGVjayBmYWlsZWQiLAorCQkJCVhGU19FUlJMRVZFTF9MT1csIG1wLCBzYnApOwogCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CiAJfQogCkBAIC04NjQsNyArODU0LDggQEAKIAkJaWYgKChCQlRPQihtcC0+bV9kYWxpZ24pICYgbXAtPm1fYmxvY2ttYXNrKSB8fAogCQkgICAgKEJCVE9CKG1wLT5tX3N3aWR0aCkgJiBtcC0+bV9ibG9ja21hc2spKSB7CiAJCQlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkVURVJSKSB7Ci0JCQkJeGZzX3dhcm4obXAsICJhbGlnbm1lbnQgY2hlY2sgMSBmYWlsZWQiKTsKKwkJCQl4ZnNfd2FybihtcCwgImFsaWdubWVudCBjaGVjayBmYWlsZWQ6ICIKKwkJCQkJICIoc3VuaXQvc3dpZHRoIHZzLiBibG9ja3NpemUpIik7CiAJCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCQkJfQogCQkJbXAtPm1fZGFsaWduID0gbXAtPm1fc3dpZHRoID0gMDsKQEAgLTg3NSw2ICs4NjYsOCBAQAogCQkJbXAtPm1fZGFsaWduID0gWEZTX0JCX1RPX0ZTQlQobXAsIG1wLT5tX2RhbGlnbik7CiAJCQlpZiAobXAtPm1fZGFsaWduICYmIChzYnAtPnNiX2FnYmxvY2tzICUgbXAtPm1fZGFsaWduKSkgewogCQkJCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRVRFUlIpIHsKKwkJCQkJeGZzX3dhcm4obXAsICJhbGlnbm1lbnQgY2hlY2sgZmFpbGVkOiAiCisJCQkJCQkgIihzdW5pdC9zd2lkdGggdnMuIGFnIHNpemUpIik7CiAJCQkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKIAkJCQl9CiAJCQkJeGZzX3dhcm4obXAsCkBAIC04ODksOCArODgyLDggQEAKIAkJCQltcC0+bV9zd2lkdGggPSBYRlNfQkJfVE9fRlNCVChtcCwgbXAtPm1fc3dpZHRoKTsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JFVEVSUikgewotCQkJCQl4ZnNfd2FybihtcCwKLQkJInN0cmlwZSBhbGlnbm1lbnQgdHVybmVkIG9mZjogc3VuaXQoJWQpIGxlc3MgdGhhbiBic2l6ZSglZCkiLAorCQkJCQl4ZnNfd2FybihtcCwgImFsaWdubWVudCBjaGVjayBmYWlsZWQ6ICIKKwkJCQkJCSJzdW5pdCglZCkgbGVzcyB0aGFuIGJzaXplKCVkKSIsCiAJCQkJCQltcC0+bV9kYWxpZ24sCiAJCQkJCQltcC0+bV9ibG9ja21hc2sgKzEpOwogCQkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CkBAIC0xMDk2LDEwICsxMDg5LDYgQEAKIAlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKQogCQlyZXR1cm4gMDsKIAotI2lmZGVmIFFVT1RBREVCVUcKLQl4ZnNfbm90aWNlKG1wLCAiV3JpdGluZyBzdXBlcmJsb2NrIHF1b3RhIGNoYW5nZXMiKTsKLSNlbmRpZgotCiAJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19RTV9TQkNIQU5HRSk7CiAJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgbXAtPm1fc2Iuc2Jfc2VjdHNpemUgKyAxMjgsIDAsIDAsCiAJCQkJICAgICAgWEZTX0RFRkFVTFRfTE9HX0NPVU5UKTsKQEAgLTE1MzIsNyArMTUyMSw3IEBACiAJCXhmc193YXJuKG1wLCAiVW5hYmxlIHRvIGZyZWUgcmVzZXJ2ZWQgYmxvY2sgcG9vbC4gIgogCQkJCSJGcmVlc3BhY2UgbWF5IG5vdCBiZSBjb3JyZWN0IG9uIG5leHQgbW91bnQuIik7CiAKLQllcnJvciA9IHhmc19sb2dfc2Jjb3VudChtcCwgMSk7CisJZXJyb3IgPSB4ZnNfbG9nX3NiY291bnQobXApOwogCWlmIChlcnJvcikKIAkJeGZzX3dhcm4obXAsICJVbmFibGUgdG8gdXBkYXRlIHN1cGVyYmxvY2sgY291bnRlcnMuICIKIAkJCQkiRnJlZXNwYWNlIG1heSBub3QgYmUgY29ycmVjdCBvbiBuZXh0IG1vdW50LiIpOwpAQCAtMTU2OCwxOCArMTU1NywxNCBAQAogLyoKICAqIHhmc19sb2dfc2Jjb3VudAogICoKLSAqIENhbGxlZCBlaXRoZXIgcGVyaW9kaWNhbGx5IHRvIGtlZXAgdGhlIG9uIGRpc2sgc3VwZXJibG9jayB2YWx1ZXMKLSAqIHJvdWdobHkgdXAgdG8gZGF0ZSBvciBmcm9tIHVubW91bnQgdG8gbWFrZSBzdXJlIHRoZSB2YWx1ZXMgYXJlCi0gKiBjb3JyZWN0IG9uIGEgY2xlYW4gdW5tb3VudC4KKyAqIFN5bmMgdGhlIHN1cGVyYmxvY2sgY291bnRlcnMgdG8gZGlzay4KICAqCiAgKiBOb3RlIHRoaXMgY29kZSBjYW4gYmUgY2FsbGVkIGR1cmluZyB0aGUgcHJvY2VzcyBvZiBmcmVlemluZywgc28KLSAqIHdlIG1heSBuZWVkIHRvIHVzZSB0aGUgdHJhbnNhY3Rpb24gYWxsb2NhdG9yIHdoaWNoIGRvZXMgbm90IG5vdAorICogd2UgbWF5IG5lZWQgdG8gdXNlIHRoZSB0cmFuc2FjdGlvbiBhbGxvY2F0b3Igd2hpY2ggZG9lcyBub3QKICAqIGJsb2NrIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHN1YnN5c3RlbSBpcyBpbiBpdHMgZnJvemVuIHN0YXRlLgogICovCiBpbnQKLXhmc19sb2dfc2Jjb3VudCgKLQl4ZnNfbW91bnRfdAkqbXAsCi0JdWludAkJc3luYykKK3hmc19sb2dfc2Jjb3VudCh4ZnNfbW91bnRfdCAqbXApCiB7CiAJeGZzX3RyYW5zX3QJKnRwOwogCWludAkJZXJyb3I7CkBAIC0xNjA1LDggKzE1OTAsNyBAQAogCX0KIAogCXhmc19tb2Rfc2IodHAsIFhGU19TQl9JRlJFRSB8IFhGU19TQl9JQ09VTlQgfCBYRlNfU0JfRkRCTE9DS1MpOwotCWlmIChzeW5jKQotCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCXhmc190cmFuc19zZXRfc3luYyh0cCk7CiAJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xOTQxLDIyICsxOTI1LDE5IEBACiAgKiB0aGUgc3VwZXJibG9jayBidWZmZXIgaWYgaXQgY2FuIGJlIGxvY2tlZCB3aXRob3V0IHNsZWVwaW5nLgogICogSWYgaXQgY2FuJ3QgdGhlbiB3ZSdsbCByZXR1cm4gTlVMTC4KICAqLwoteGZzX2J1Zl90ICoKK3N0cnVjdCB4ZnNfYnVmICoKIHhmc19nZXRzYigKLQl4ZnNfbW91bnRfdAkqbXAsCi0JaW50CQlmbGFncykKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwlpbnQJCQlmbGFncykKIHsKLQl4ZnNfYnVmX3QJKmJwOworCXN0cnVjdCB4ZnNfYnVmCQkqYnAgPSBtcC0+bV9zYl9icDsKIAotCUFTU0VSVChtcC0+bV9zYl9icCAhPSBOVUxMKTsKLQlicCA9IG1wLT5tX3NiX2JwOwotCWlmIChmbGFncyAmIFhCRl9UUllMT0NLKSB7Ci0JCWlmICghWEZTX0JVRl9DUFNFTUEoYnApKSB7CisJaWYgKCF4ZnNfYnVmX3RyeWxvY2soYnApKSB7CisJCWlmIChmbGFncyAmIFhCRl9UUllMT0NLKQogCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQlYRlNfQlVGX1BTRU1BKGJwLCBQUklCSU8pOworCQl4ZnNfYnVmX2xvY2soYnApOwogCX0KKwogCVhGU19CVUZfSE9MRChicCk7CiAJQVNTRVJUKFhGU19CVUZfSVNET05FKGJwKSk7CiAJcmV0dXJuIGJwOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tb3VudC5oIGIvZnMveGZzL3hmc19tb3VudC5oCmluZGV4IDNkNjhiYjIuLmJiMjRkYWMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbW91bnQuaAorKysgYi9mcy94ZnMveGZzX21vdW50LmgKQEAgLTM3MSw3ICszNzEsNyBAQAogCWludDY0X3QJCW1zYl9kZWx0YTsJLyogQ2hhbmdlIHRvIG1ha2UgdG8gc3BlY2lmaWVkIGZpZWxkICovCiB9IHhmc19tb2Rfc2JfdDsKIAotZXh0ZXJuIGludAl4ZnNfbG9nX3NiY291bnQoeGZzX21vdW50X3QgKiwgdWludCk7CitleHRlcm4gaW50CXhmc19sb2dfc2Jjb3VudCh4ZnNfbW91bnRfdCAqKTsKIGV4dGVybiBfX3VpbnQ2NF90IHhmc19kZWZhdWx0X3Jlc2Jsa3MoeGZzX21vdW50X3QgKm1wKTsKIGV4dGVybiBpbnQJeGZzX21vdW50ZnMoeGZzX21vdW50X3QgKm1wKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFucy5jIGIvZnMveGZzL3hmc190cmFucy5jCmluZGV4IDdjN2JjMmIuLmVmYzE0N2YgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnMuYworKysgYi9mcy94ZnMveGZzX3RyYW5zLmMKQEAgLTEzNjEsNyArMTM2MSw3IEBACiAJCWxpcC0+bGlfZmxhZ3MgfD0gWEZTX0xJX0FCT1JURUQ7CiAJaXRlbV9sc24gPSBJT1BfQ09NTUlUVEVEKGxpcCwgY29tbWl0X2xzbik7CiAKLQkvKiBJZiB0aGUgY29tbWl0dGVkIHJvdXRpbmUgcmV0dXJucyAtMSwgaXRlbSBoYXMgYmVlbiBmcmVlZC4gKi8KKwkvKiBpdGVtX2xzbiBvZiAtMSBtZWFucyB0aGUgaXRlbSBuZWVkcyBubyBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KIAlpZiAoWEZTX0xTTl9DTVAoaXRlbV9sc24sICh4ZnNfbHNuX3QpLTEpID09IDApCiAJCXJldHVybjsKIApAQCAtMTQyNiw2ICsxNDI2LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogeGZzX2xvZ19pdGVtX2JhdGNoX2luc2VydCgKIAlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCisJc3RydWN0IHhmc19haWxfY3Vyc29yCSpjdXIsCiAJc3RydWN0IHhmc19sb2dfaXRlbQkqKmxvZ19pdGVtcywKIAlpbnQJCQlucl9pdGVtcywKIAl4ZnNfbHNuX3QJCWNvbW1pdF9sc24pCkBAIC0xNDM0LDcgKzE0MzUsNyBAQAogCiAJc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKIAkvKiB4ZnNfdHJhbnNfYWlsX3VwZGF0ZV9idWxrIGRyb3BzIGFpbHAtPnhhX2xvY2sgKi8KLQl4ZnNfdHJhbnNfYWlsX3VwZGF0ZV9idWxrKGFpbHAsIGxvZ19pdGVtcywgbnJfaXRlbXMsIGNvbW1pdF9sc24pOworCXhmc190cmFuc19haWxfdXBkYXRlX2J1bGsoYWlscCwgY3VyLCBsb2dfaXRlbXMsIG5yX2l0ZW1zLCBjb21taXRfbHNuKTsKIAogCWZvciAoaSA9IDA7IGkgPCBucl9pdGVtczsgaSsrKQogCQlJT1BfVU5QSU4obG9nX2l0ZW1zW2ldLCAwKTsKQEAgLTE0NTIsNiArMTQ1MywxMyBAQAogICogYXMgYW4gaWNsb2cgd3JpdGUgZXJyb3IgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBzdGFydGVkIGFueSBJTyB5ZXQuIEhlbmNlIGluCiAgKiB0aGlzIGNhc2UgYWxsIHdlIG5lZWQgdG8gZG8gaXMgSU9QX0NPTU1JVFRFRCBwcm9jZXNzaW5nLCBmb2xsb3dlZCBieSBhbgogICogSU9QX1VOUElOKGFib3J0ZWQpIGNhbGwuCisgKgorICogVGhlIEFJTCBjdXJzb3IgaXMgdXNlZCB0byBvcHRpbWlzZSB0aGUgaW5zZXJ0IHByb2Nlc3MuIElmIGNvbW1pdF9sc24gaXMgbm90CisgKiBhdCB0aGUgZW5kIG9mIHRoZSBBSUwsIHRoZSBpbnNlcnQgY3Vyc29yIGF2b2lkcyB0aGUgbmVlZCB0byB3YWxrCisgKiB0aGUgQUlMIHRvIGZpbmQgdGhlIGluc2VydGlvbiBwb2ludCBvbiBldmVyeSB4ZnNfbG9nX2l0ZW1fYmF0Y2hfaW5zZXJ0KCkKKyAqIGNhbGwuIFRoaXMgc2F2ZXMgYSBsb3Qgb2YgbmVlZGxlc3MgbGlzdCB3YWxraW5nIGFuZCBpcyBhIG5ldCB3aW4sIGV2ZW4KKyAqIHRob3VnaCBpdCBzbGlnaHRseSBpbmNyZWFzZXMgdGhhdCBhbW91bnQgb2YgQUlMIGxvY2sgdHJhZmZpYyB0byBzZXQgaXQgdXAKKyAqIGFuZCB0ZWFyIGl0IGRvd24uCiAgKi8KIHZvaWQKIHhmc190cmFuc19jb21taXR0ZWRfYnVsaygKQEAgLTE0NjMsOCArMTQ3MSwxMyBAQAogI2RlZmluZSBMT0dfSVRFTV9CQVRDSF9TSVpFCTMyCiAJc3RydWN0IHhmc19sb2dfaXRlbQkqbG9nX2l0ZW1zW0xPR19JVEVNX0JBVENIX1NJWkVdOwogCXN0cnVjdCB4ZnNfbG9nX3ZlYwkqbHY7CisJc3RydWN0IHhmc19haWxfY3Vyc29yCWN1cjsKIAlpbnQJCQlpID0gMDsKIAorCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CisJeGZzX3RyYW5zX2FpbF9jdXJzb3JfbGFzdChhaWxwLCAmY3VyLCBjb21taXRfbHNuKTsKKwlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CisKIAkvKiB1bnBpbiBhbGwgdGhlIGxvZyBpdGVtcyAqLwogCWZvciAobHYgPSBsb2dfdmVjdG9yOyBsdjsgbHYgPSBsdi0+bHZfbmV4dCApIHsKIAkJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwID0gbHYtPmx2X2l0ZW07CkBAIC0xNDc0LDcgKzE0ODcsNyBAQAogCQkJbGlwLT5saV9mbGFncyB8PSBYRlNfTElfQUJPUlRFRDsKIAkJaXRlbV9sc24gPSBJT1BfQ09NTUlUVEVEKGxpcCwgY29tbWl0X2xzbik7CiAKLQkJLyogaXRlbV9sc24gb2YgLTEgbWVhbnMgdGhlIGl0ZW0gd2FzIGZyZWVkICovCisJCS8qIGl0ZW1fbHNuIG9mIC0xIG1lYW5zIHRoZSBpdGVtIG5lZWRzIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLwogCQlpZiAoWEZTX0xTTl9DTVAoaXRlbV9sc24sICh4ZnNfbHNuX3QpLTEpID09IDApCiAJCQljb250aW51ZTsKIApAQCAtMTQ5Myw3ICsxNTA2LDkgQEAKIAkJCS8qCiAJCQkgKiBOb3QgYSBidWxrIHVwZGF0ZSBvcHRpb24gZHVlIHRvIHVudXN1YWwgaXRlbV9sc24uCiAJCQkgKiBQdXNoIGludG8gQUlMIGltbWVkaWF0ZWx5LCByZWNoZWNraW5nIHRoZSBsc24gb25jZQotCQkJICogd2UgaGF2ZSB0aGUgYWlsIGxvY2suIFRoZW4gdW5waW4gdGhlIGl0ZW0uCisJCQkgKiB3ZSBoYXZlIHRoZSBhaWwgbG9jay4gVGhlbiB1bnBpbiB0aGUgaXRlbS4gVGhpcyBkb2VzCisJCQkgKiBub3QgYWZmZWN0IHRoZSBBSUwgY3Vyc29yIHRoZSBidWxrIGluc2VydCBwYXRoIGlzCisJCQkgKiB1c2luZy4KIAkJCSAqLwogCQkJc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKIAkJCWlmIChYRlNfTFNOX0NNUChpdGVtX2xzbiwgbGlwLT5saV9sc24pID4gMCkKQEAgLTE1MDcsNyArMTUyMiw3IEBACiAJCS8qIEl0ZW0gaXMgYSBjYW5kaWRhdGUgZm9yIGJ1bGsgQUlMIGluc2VydC4gICovCiAJCWxvZ19pdGVtc1tpKytdID0gbHYtPmx2X2l0ZW07CiAJCWlmIChpID49IExPR19JVEVNX0JBVENIX1NJWkUpIHsKLQkJCXhmc19sb2dfaXRlbV9iYXRjaF9pbnNlcnQoYWlscCwgbG9nX2l0ZW1zLAorCQkJeGZzX2xvZ19pdGVtX2JhdGNoX2luc2VydChhaWxwLCAmY3VyLCBsb2dfaXRlbXMsCiAJCQkJCUxPR19JVEVNX0JBVENIX1NJWkUsIGNvbW1pdF9sc24pOwogCQkJaSA9IDA7CiAJCX0KQEAgLTE1MTUsNyArMTUzMCwxMSBAQAogCiAJLyogbWFrZSBzdXJlIHdlIGluc2VydCB0aGUgcmVtYWluZGVyISAqLwogCWlmIChpKQotCQl4ZnNfbG9nX2l0ZW1fYmF0Y2hfaW5zZXJ0KGFpbHAsIGxvZ19pdGVtcywgaSwgY29tbWl0X2xzbik7CisJCXhmc19sb2dfaXRlbV9iYXRjaF9pbnNlcnQoYWlscCwgJmN1ciwgbG9nX2l0ZW1zLCBpLCBjb21taXRfbHNuKTsKKworCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CisJeGZzX3RyYW5zX2FpbF9jdXJzb3JfZG9uZShhaWxwLCAmY3VyKTsKKwlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2FpbC5jIGIvZnMveGZzL3hmc190cmFuc19haWwuYwppbmRleCA1ZmMyMzgwLi40MzIzM2U5IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKQEAgLTE2MywxNyArMTYzLDExIEBACiB9CiAKIC8qCi0gKiBBSUwgdHJhdmVyc2FsIGN1cnNvciBpbml0aWFsaXNhdGlvbi4KLSAqCi0gKiBUaGUgY3Vyc29yIGtlZXBzIHRyYWNrIG9mIHdoZXJlIG91ciBjdXJyZW50IHRyYXZlcnNhbCBpcyB1cAotICogdG8gYnkgdHJhY2tpbmcgdGhlIG5leHQgxqN0ZW0gaW4gdGhlIGxpc3QgZm9yIHVzLiBIb3dldmVyLCBmb3IKLSAqIHRoaXMgdG8gYmUgc2FmZSwgcmVtb3ZpbmcgYW4gb2JqZWN0IGZyb20gdGhlIEFJTCBuZWVkcyB0byBpbnZhbGlkYXRlCi0gKiBhbnkgY3Vyc29yIHRoYXQgcG9pbnRzIHRvIGl0LiBoZW5jZSB0aGUgdHJhdmVyc2FsIGN1cnNvciBuZWVkcyB0bwotICogYmUgbGlua2VkIHRvIHRoZSBzdHJ1Y3QgeGZzX2FpbCBzbyB0aGF0IGRlbGV0aW9uIGNhbiBzZWFyY2ggYWxsIHRoZQotICogYWN0aXZlIGN1cnNvcnMgZm9yIGludmFsaWRhdGlvbi4KLSAqCi0gKiBXZSBkb24ndCBsaW5rIHRoZSBwdXNoIGN1cnNvciBiZWNhdXNlIGl0IGlzIGVtYmVkZGVkIGluIHRoZSBzdHJ1Y3QKLSAqIHhmc19haWwgYW5kIGhlbmNlIGVhc2lseSBmaW5kYWJsZS4KKyAqIFRoZSBjdXJzb3Iga2VlcHMgdHJhY2sgb2Ygd2hlcmUgb3VyIGN1cnJlbnQgdHJhdmVyc2FsIGlzIHVwIHRvIGJ5IHRyYWNraW5nCisgKiB0aGUgbmV4dCBpdGVtIGluIHRoZSBsaXN0IGZvciB1cy4gSG93ZXZlciwgZm9yIHRoaXMgdG8gYmUgc2FmZSwgcmVtb3ZpbmcgYW4KKyAqIG9iamVjdCBmcm9tIHRoZSBBSUwgbmVlZHMgdG8gaW52YWxpZGF0ZSBhbnkgY3Vyc29yIHRoYXQgcG9pbnRzIHRvIGl0LiBoZW5jZQorICogdGhlIHRyYXZlcnNhbCBjdXJzb3IgbmVlZHMgdG8gYmUgbGlua2VkIHRvIHRoZSBzdHJ1Y3QgeGZzX2FpbCBzbyB0aGF0CisgKiBkZWxldGlvbiBjYW4gc2VhcmNoIGFsbCB0aGUgYWN0aXZlIGN1cnNvcnMgZm9yIGludmFsaWRhdGlvbi4KICAqLwogU1RBVElDIHZvaWQKIHhmc190cmFuc19haWxfY3Vyc29yX2luaXQoCkBAIC0xODEsMzEgKzE3NSwxMiBAQAogCXN0cnVjdCB4ZnNfYWlsX2N1cnNvcgkqY3VyKQogewogCWN1ci0+aXRlbSA9IE5VTEw7Ci0JaWYgKGN1ciA9PSAmYWlscC0+eGFfY3Vyc29ycykKLQkJcmV0dXJuOwotCi0JY3VyLT5uZXh0ID0gYWlscC0+eGFfY3Vyc29ycy5uZXh0OwotCWFpbHAtPnhhX2N1cnNvcnMubmV4dCA9IGN1cjsKKwlsaXN0X2FkZF90YWlsKCZjdXItPmxpc3QsICZhaWxwLT54YV9jdXJzb3JzKTsKIH0KIAogLyoKLSAqIFNldCB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IGl0ZW0sIGJlY2F1c2Ugd2hlbiB3ZSBsb29rCi0gKiB1cCB0aGUgY3Vyc29yIHRoZSBjdXJyZW50IGl0ZW0gbWF5IGhhdmUgYmVlbiBmcmVlZC4KLSAqLwotU1RBVElDIHZvaWQKLXhmc190cmFuc19haWxfY3Vyc29yX3NldCgKLQlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCi0Jc3RydWN0IHhmc19haWxfY3Vyc29yCSpjdXIsCi0Jc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQotewotCWlmIChsaXApCi0JCWN1ci0+aXRlbSA9IHhmc19haWxfbmV4dChhaWxwLCBsaXApOwotfQotCi0vKgotICogR2V0IHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHRyYXZlcnNhbCBhbmQgYWR2YW5jZSB0aGUgY3Vyc29yLgotICogSWYgdGhlIGN1cnNvciB3YXMgaW52YWxpZGF0ZWQgKGluaWRpY2F0ZWQgYnkgYSBsaXAgb2YgMSksCi0gKiByZXN0YXJ0IHRoZSB0cmF2ZXJzYWwuCisgKiBHZXQgdGhlIG5leHQgaXRlbSBpbiB0aGUgdHJhdmVyc2FsIGFuZCBhZHZhbmNlIHRoZSBjdXJzb3IuICBJZiB0aGUgY3Vyc29yCisgKiB3YXMgaW52YWxpZGF0ZWQgKGluZGljYXRlZCBieSBhIGxpcCBvZiAxKSwgcmVzdGFydCB0aGUgdHJhdmVyc2FsLgogICovCiBzdHJ1Y3QgeGZzX2xvZ19pdGVtICoKIHhmc190cmFuc19haWxfY3Vyc29yX25leHQoCkBAIC0yMTYsNDUgKzE5MSwzMSBAQAogCiAJaWYgKChfX3BzaW50X3QpbGlwICYgMSkKIAkJbGlwID0geGZzX2FpbF9taW4oYWlscCk7Ci0JeGZzX3RyYW5zX2FpbF9jdXJzb3Jfc2V0KGFpbHAsIGN1ciwgbGlwKTsKKwlpZiAobGlwKQorCQljdXItPml0ZW0gPSB4ZnNfYWlsX25leHQoYWlscCwgbGlwKTsKIAlyZXR1cm4gbGlwOwogfQogCiAvKgotICogTm93IHRoYXQgdGhlIHRyYXZlcnNhbCBpcyBjb21wbGV0ZSwgd2UgbmVlZCB0byByZW1vdmUgdGhlIGN1cnNvcgotICogZnJvbSB0aGUgbGlzdCBvZiB0cmF2ZXJzaW5nIGN1cnNvcnMuIEF2b2lkIHJlbW92aW5nIHRoZSBlbWJlZGRlZAotICogcHVzaCBjdXJzb3IsIGJ1dCB1c2UgdGhlIGZhY3QgaXQgaXMgYWx3YXlzIHByZXNlbnQgdG8gbWFrZSB0aGUKLSAqIGxpc3QgZGVsZXRpb24gc2ltcGxlLgorICogV2hlbiB0aGUgdHJhdmVyc2FsIGlzIGNvbXBsZXRlLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgY3Vyc29yIGZyb20gdGhlIGxpc3QKKyAqIG9mIHRyYXZlcnNpbmcgY3Vyc29ycy4KICAqLwogdm9pZAogeGZzX3RyYW5zX2FpbF9jdXJzb3JfZG9uZSgKIAlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCi0Jc3RydWN0IHhmc19haWxfY3Vyc29yCSpkb25lKQorCXN0cnVjdCB4ZnNfYWlsX2N1cnNvcgkqY3VyKQogewotCXN0cnVjdCB4ZnNfYWlsX2N1cnNvcgkqcHJldiA9IE5VTEw7Ci0Jc3RydWN0IHhmc19haWxfY3Vyc29yCSpjdXI7Ci0KLQlkb25lLT5pdGVtID0gTlVMTDsKLQlpZiAoZG9uZSA9PSAmYWlscC0+eGFfY3Vyc29ycykKLQkJcmV0dXJuOwotCXByZXYgPSAmYWlscC0+eGFfY3Vyc29yczsKLQlmb3IgKGN1ciA9IHByZXYtPm5leHQ7IGN1cjsgcHJldiA9IGN1ciwgY3VyID0gcHJldi0+bmV4dCkgewotCQlpZiAoY3VyID09IGRvbmUpIHsKLQkJCXByZXYtPm5leHQgPSBjdXItPm5leHQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlBU1NFUlQoY3VyKTsKKwljdXItPml0ZW0gPSBOVUxMOworCWxpc3RfZGVsX2luaXQoJmN1ci0+bGlzdCk7CiB9CiAKIC8qCi0gKiBJbnZhbGlkYXRlIGFueSBjdXJzb3IgdGhhdCBpcyBwb2ludGluZyB0byB0aGlzIGl0ZW0uIFRoaXMgaXMKLSAqIGNhbGxlZCB3aGVuIGFuIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBBSUwuIEFueSBjdXJzb3IgcG9pbnRpbmcKLSAqIHRvIHRoaXMgb2JqZWN0IGlzIG5vdyBpbnZhbGlkIGFuZCB0aGUgdHJhdmVyc2FsIG5lZWRzIHRvIGJlCi0gKiB0ZXJtaW5hdGVkIHNvIGl0IGRvZXNuJ3QgcmVmZXJlbmNlIGEgZnJlZWQgb2JqZWN0LiBXZSBzZXQgdGhlCi0gKiBjdXJzb3IgaXRlbSB0byBhIHZhbHVlIG9mIDEgc28gd2UgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4gYW4KLSAqIGludmFsaWRhdGlvbiBhbmQgdGhlIGVuZCBvZiB0aGUgbGlzdCB3aGVuIGdldHRpbmcgdGhlIG5leHQgaXRlbQotICogZnJvbSB0aGUgY3Vyc29yLgorICogSW52YWxpZGF0ZSBhbnkgY3Vyc29yIHRoYXQgaXMgcG9pbnRpbmcgdG8gdGhpcyBpdGVtLiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuCisgKiBpdGVtIGlzIHJlbW92ZWQgZnJvbSB0aGUgQUlMLiBBbnkgY3Vyc29yIHBvaW50aW5nIHRvIHRoaXMgb2JqZWN0IGlzIG5vdworICogaW52YWxpZCBhbmQgdGhlIHRyYXZlcnNhbCBuZWVkcyB0byBiZSB0ZXJtaW5hdGVkIHNvIGl0IGRvZXNuJ3QgcmVmZXJlbmNlIGEKKyAqIGZyZWVkIG9iamVjdC4gV2Ugc2V0IHRoZSBsb3cgYml0IG9mIHRoZSBjdXJzb3IgaXRlbSBwb2ludGVyIHNvIHdlIGNhbgorICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbiBpbnZhbGlkYXRpb24gYW5kIHRoZSBlbmQgb2YgdGhlIGxpc3Qgd2hlbiBnZXR0aW5nIHRoZQorICogbmV4dCBpdGVtIGZyb20gdGhlIGN1cnNvci4KICAqLwogU1RBVElDIHZvaWQKIHhmc190cmFuc19haWxfY3Vyc29yX2NsZWFyKApAQCAtMjYzLDggKzIyNCw3IEBACiB7CiAJc3RydWN0IHhmc19haWxfY3Vyc29yCSpjdXI7CiAKLQkvKiBuZWVkIHRvIHNlYXJjaCBhbGwgY3Vyc29ycyAqLwotCWZvciAoY3VyID0gJmFpbHAtPnhhX2N1cnNvcnM7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXIsICZhaWxwLT54YV9jdXJzb3JzLCBsaXN0KSB7CiAJCWlmIChjdXItPml0ZW0gPT0gbGlwKQogCQkJY3VyLT5pdGVtID0gKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKikKIAkJCQkJKChfX3BzaW50X3QpY3VyLT5pdGVtIHwgMSk7CkBAIC0yNzIsOSArMjMyLDEwIEBACiB9CiAKIC8qCi0gKiBSZXR1cm4gdGhlIGl0ZW0gaW4gdGhlIEFJTCB3aXRoIHRoZSBjdXJyZW50IGxzbi4KLSAqIFJldHVybiB0aGUgY3VycmVudCB0cmVlIGdlbmVyYXRpb24gbnVtYmVyIGZvciB1c2UKLSAqIGluIGNhbGxzIHRvIHhmc190cmFuc19uZXh0X2FpbCgpLgorICogRmluZCB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgQUlMIHdpdGggdGhlIGdpdmVuIEBsc24gYnkgc2VhcmNoaW5nIGluIGFzY2VuZGluZworICogTFNOIG9yZGVyIGFuZCBpbml0aWFsaXNlIHRoZSBjdXJzb3IgdG8gcG9pbnQgdG8gdGhlIG5leHQgaXRlbSBmb3IgYQorICogYXNjZW5kaW5nIHRyYXZlcnNhbC4gIFBhc3MgYSBAbHNuIG9mIHplcm8gdG8gaW5pdGlhbGlzZSB0aGUgY3Vyc29yIHRvIHRoZQorICogZmlyc3QgaXRlbSBpbiB0aGUgQUlMLiBSZXR1cm5zIE5VTEwgaWYgdGhlIGxpc3QgaXMgZW1wdHkuCiAgKi8KIHhmc19sb2dfaXRlbV90ICoKIHhmc190cmFuc19haWxfY3Vyc29yX2ZpcnN0KApAQCAtMjg1LDQ2ICsyNDYsMTEyIEBACiAJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CiAKIAl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9pbml0KGFpbHAsIGN1cik7Ci0JbGlwID0geGZzX2FpbF9taW4oYWlscCk7Ci0JaWYgKGxzbiA9PSAwKQorCisJaWYgKGxzbiA9PSAwKSB7CisJCWxpcCA9IHhmc19haWxfbWluKGFpbHApOwogCQlnb3RvIG91dDsKKwl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpcCwgJmFpbHAtPnhhX2FpbCwgbGlfYWlsKSB7CiAJCWlmIChYRlNfTFNOX0NNUChsaXAtPmxpX2xzbiwgbHNuKSA+PSAwKQogCQkJZ290byBvdXQ7CiAJfQotCWxpcCA9IE5VTEw7CisJcmV0dXJuIE5VTEw7CisKIG91dDoKLQl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9zZXQoYWlscCwgY3VyLCBsaXApOworCWlmIChsaXApCisJCWN1ci0+aXRlbSA9IHhmc19haWxfbmV4dChhaWxwLCBsaXApOwogCXJldHVybiBsaXA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgeGZzX2xvZ19pdGVtICoKK19feGZzX3RyYW5zX2FpbF9jdXJzb3JfbGFzdCgKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCisJeGZzX2xzbl90CQlsc24pCit7CisJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UobGlwLCAmYWlscC0+eGFfYWlsLCBsaV9haWwpIHsKKwkJaWYgKFhGU19MU05fQ01QKGxpcC0+bGlfbHNuLCBsc24pIDw9IDApCisJCQlyZXR1cm4gbGlwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwogLyoKLSAqIHNwbGljZSB0aGUgbG9nIGl0ZW0gbGlzdCBpbnRvIHRoZSBBSUwgYXQgdGhlIGdpdmVuIExTTi4KKyAqIEZpbmQgdGhlIGxhc3QgaXRlbSBpbiB0aGUgQUlMIHdpdGggdGhlIGdpdmVuIEBsc24gYnkgc2VhcmNoaW5nIGluIGRlc2NlbmRpbmcKKyAqIExTTiBvcmRlciBhbmQgaW5pdGlhbGlzZSB0aGUgY3Vyc29yIHRvIHBvaW50IHRvIHRoYXQgaXRlbS4gIElmIHRoZXJlIGlzIG5vCisgKiBpdGVtIHdpdGggdGhlIHZhbHVlIG9mIEBsc24sIHRoZW4gaXQgc2V0cyB0aGUgY3Vyc29yIHRvIHRoZSBsYXN0IGl0ZW0gd2l0aCBhbgorICogTFNOIGxvd2VyIHRoYW4gQGxzbi4gIFJldHVybnMgTlVMTCBpZiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAqLworc3RydWN0IHhmc19sb2dfaXRlbSAqCit4ZnNfdHJhbnNfYWlsX2N1cnNvcl9sYXN0KAorCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCwKKwlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IJKmN1ciwKKwl4ZnNfbHNuX3QJCWxzbikKK3sKKwl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9pbml0KGFpbHAsIGN1cik7CisJY3VyLT5pdGVtID0gX194ZnNfdHJhbnNfYWlsX2N1cnNvcl9sYXN0KGFpbHAsIGxzbik7CisJcmV0dXJuIGN1ci0+aXRlbTsKK30KKworLyoKKyAqIFNwbGljZSB0aGUgbG9nIGl0ZW0gbGlzdCBpbnRvIHRoZSBBSUwgYXQgdGhlIGdpdmVuIExTTi4gV2Ugc3BsaWNlIHRvIHRoZQorICogdGFpbCBvZiB0aGUgZ2l2ZW4gTFNOIHRvIG1haW50YWluIGluc2VydCBvcmRlciBmb3IgcHVzaCB0cmF2ZXJzYWxzLiBUaGUKKyAqIGN1cnNvciBpcyBvcHRpb25hbCwgYWxsb3dpbmcgcmVwZWF0ZWQgdXBkYXRlcyB0byB0aGUgc2FtZSBMU04gdG8gYXZvaWQKKyAqIHJlcGVhdGVkIHRyYXZlcnNhbHMuCiAgKi8KIHN0YXRpYyB2b2lkCiB4ZnNfYWlsX3NwbGljZSgKLQlzdHJ1Y3QgeGZzX2FpbCAgKmFpbHAsCi0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLQl4ZnNfbHNuX3QgICAgICAgbHNuKQorCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCwKKwlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IJKmN1ciwKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpsaXN0LAorCXhmc19sc25fdAkJbHNuKQogewotCXhmc19sb2dfaXRlbV90ICAqbmV4dF9saXA7CisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwID0gY3VyID8gY3VyLT5pdGVtIDogTlVMTDsKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpuZXh0X2xpcDsKIAotCS8qIElmIHRoZSBsaXN0IGlzIGVtcHR5LCBqdXN0IGluc2VydCB0aGUgaXRlbS4gICovCi0JaWYgKGxpc3RfZW1wdHkoJmFpbHAtPnhhX2FpbCkpIHsKLQkJbGlzdF9zcGxpY2UobGlzdCwgJmFpbHAtPnhhX2FpbCk7Ci0JCXJldHVybjsKKwkvKgorCSAqIEdldCBhIG5ldyBjdXJzb3IgaWYgd2UgZG9uJ3QgaGF2ZSBhIHBsYWNlaG9sZGVyIG9yIHRoZSBleGlzdGluZyBvbmUKKwkgKiBoYXMgYmVlbiBpbnZhbGlkYXRlZC4KKwkgKi8KKwlpZiAoIWxpcCB8fCAoX19wc2ludF90KWxpcCAmIDEpIHsKKwkJbGlwID0gX194ZnNfdHJhbnNfYWlsX2N1cnNvcl9sYXN0KGFpbHAsIGxzbik7CisKKwkJaWYgKCFsaXApIHsKKwkJCS8qIFRoZSBsaXN0IGlzIGVtcHR5LCBzbyBqdXN0IHNwbGljZSBhbmQgcmV0dXJuLiAgKi8KKwkJCWlmIChjdXIpCisJCQkJY3VyLT5pdGVtID0gTlVMTDsKKwkJCWxpc3Rfc3BsaWNlKGxpc3QsICZhaWxwLT54YV9haWwpOworCQkJcmV0dXJuOworCQl9CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKG5leHRfbGlwLCAmYWlscC0+eGFfYWlsLCBsaV9haWwpIHsKLQkJaWYgKFhGU19MU05fQ01QKG5leHRfbGlwLT5saV9sc24sIGxzbikgPD0gMCkKLQkJCWJyZWFrOworCS8qCisJICogT3VyIGN1cnNvciBwb2ludHMgdG8gdGhlIGl0ZW0gd2Ugd2FudCB0byBpbnNlcnQgX2FmdGVyXywgc28gd2UgaGF2ZQorCSAqIHRvIHVwZGF0ZSB0aGUgY3Vyc29yIHRvIHBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgd2UgYXJlIHNwbGljaW5nCisJICogaW4gc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24gZm9yIHRoZSBuZXh0IHNwbGljZS4KKwkgKiBpLmUuIGJlZm9yZSB0aGUgc3BsaWNlCisJICoKKwkgKiAgbHNuIC0+IGxzbiAtPiBsc24gKyB4IC0+IGxzbiArIHggLi4uCisJICogICAgICAgICAgXgorCSAqICAgICAgICAgIHwgY3Vyc29yIHBvaW50cyBoZXJlCisJICoKKwkgKiBBZnRlciB0aGUgc3BsaWNlIHdlIGhhdmU6CisJICoKKwkgKiAgbHNuIC0+IGxzbiAtPiBsc24gLT4gbHNuIC0+IC4uLi4gLT4gbHNuIC0+IGxzbiArIHggLT4gbHNuICsgeCAuLi4KKwkgKiAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKwkgKiAgICAgICAgICB8IGN1cnNvciBwb2ludHMgaGVyZSAgICAgICAgIHwgbmVlZHMgdG8gbW92ZSBoZXJlCisJICoKKwkgKiBTbyB3ZSBzZXQgdGhlIGN1cnNvciB0byB0aGUgbGFzdCBpdGVtIGluIHRoZSBsaXN0IHRvIGJlIHNwbGljZWQKKwkgKiBiZWZvcmUgd2UgZXhlY3V0ZSB0aGUgc3BsaWNlLCByZXN1bHRpbmcgaW4gdGhlIGN1cnNvciBwb2ludGluZyB0bworCSAqIHRoZSBjb3JyZWN0IGl0ZW0gYWZ0ZXIgdGhlIHNwbGljZSBvY2N1cnMuCisJICovCisJaWYgKGN1cikgeworCQluZXh0X2xpcCA9IGxpc3RfZW50cnkobGlzdC0+cHJldiwgc3RydWN0IHhmc19sb2dfaXRlbSwgbGlfYWlsKTsKKwkJY3VyLT5pdGVtID0gbmV4dF9saXA7CiAJfQotCi0JQVNTRVJUKCZuZXh0X2xpcC0+bGlfYWlsID09ICZhaWxwLT54YV9haWwgfHwKLQkgICAgICAgWEZTX0xTTl9DTVAobmV4dF9saXAtPmxpX2xzbiwgbHNuKSA8PSAwKTsKLQotCWxpc3Rfc3BsaWNlX2luaXQobGlzdCwgJm5leHRfbGlwLT5saV9haWwpOworCWxpc3Rfc3BsaWNlKGxpc3QsICZsaXAtPmxpX2FpbCk7CiB9CiAKIC8qCkBAIC0zNTEsNyArMzc4LDcgQEAKIAlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAgPSBjb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLAogCQkJCQlzdHJ1Y3QgeGZzX2FpbCwgeGFfd29yayk7CiAJeGZzX21vdW50X3QJCSptcCA9IGFpbHAtPnhhX21vdW50OwotCXN0cnVjdCB4ZnNfYWlsX2N1cnNvcgkqY3VyID0gJmFpbHAtPnhhX2N1cnNvcnM7CisJc3RydWN0IHhmc19haWxfY3Vyc29yCWN1cjsKIAl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKIAl4ZnNfbHNuX3QJCWxzbjsKIAl4ZnNfbHNuX3QJCXRhcmdldDsKQEAgLTM2MywxMyArMzkwLDEyIEBACiAKIAlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOwogCXRhcmdldCA9IGFpbHAtPnhhX3RhcmdldDsKLQl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9pbml0KGFpbHAsIGN1cik7Ci0JbGlwID0geGZzX3RyYW5zX2FpbF9jdXJzb3JfZmlyc3QoYWlscCwgY3VyLCBhaWxwLT54YV9sYXN0X3B1c2hlZF9sc24pOworCWxpcCA9IHhmc190cmFuc19haWxfY3Vyc29yX2ZpcnN0KGFpbHAsICZjdXIsIGFpbHAtPnhhX2xhc3RfcHVzaGVkX2xzbik7CiAJaWYgKCFsaXAgfHwgWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKIAkJLyoKIAkJICogQUlMIGlzIGVtcHR5IG9yIG91ciBwdXNoIGhhcyByZWFjaGVkIHRoZSBlbmQuCiAJCSAqLwotCQl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9kb25lKGFpbHAsIGN1cik7CisJCXhmc190cmFuc19haWxfY3Vyc29yX2RvbmUoYWlscCwgJmN1cik7CiAJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKIAkJZ290byBvdXRfZG9uZTsKIAl9CkBAIC00NTcsMTIgKzQ4MywxMiBAQAogCQlpZiAoc3R1Y2sgPiAxMDApCiAJCQlicmVhazsKIAotCQlsaXAgPSB4ZnNfdHJhbnNfYWlsX2N1cnNvcl9uZXh0KGFpbHAsIGN1cik7CisJCWxpcCA9IHhmc190cmFuc19haWxfY3Vyc29yX25leHQoYWlscCwgJmN1cik7CiAJCWlmIChsaXAgPT0gTlVMTCkKIAkJCWJyZWFrOwogCQlsc24gPSBsaXAtPmxpX2xzbjsKIAl9Ci0JeGZzX3RyYW5zX2FpbF9jdXJzb3JfZG9uZShhaWxwLCBjdXIpOworCXhmc190cmFuc19haWxfY3Vyc29yX2RvbmUoYWlscCwgJmN1cik7CiAJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogCiAJaWYgKGZsdXNoX2xvZykgewpAQCAtNjQ1LDYgKzY3MSw3IEBACiB2b2lkCiB4ZnNfdHJhbnNfYWlsX3VwZGF0ZV9idWxrKAogCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCwKKwlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IJKmN1ciwKIAlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSoqbG9nX2l0ZW1zLAogCWludAkJCW5yX2l0ZW1zLAogCXhmc19sc25fdAkJbHNuKSBfX3JlbGVhc2VzKGFpbHAtPnhhX2xvY2spCkBAIC02NzQsNyArNzAxLDcgQEAKIAkJbGlzdF9hZGQoJmxpcC0+bGlfYWlsLCAmdG1wKTsKIAl9CiAKLQl4ZnNfYWlsX3NwbGljZShhaWxwLCAmdG1wLCBsc24pOworCXhmc19haWxfc3BsaWNlKGFpbHAsIGN1ciwgJnRtcCwgbHNuKTsKIAogCWlmICghbWxpcF9jaGFuZ2VkKSB7CiAJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKQEAgLTc5Myw2ICs4MjAsNyBAQAogCiAJYWlscC0+eGFfbW91bnQgPSBtcDsKIAlJTklUX0xJU1RfSEVBRCgmYWlscC0+eGFfYWlsKTsKKwlJTklUX0xJU1RfSEVBRCgmYWlscC0+eGFfY3Vyc29ycyk7CiAJc3Bpbl9sb2NrX2luaXQoJmFpbHAtPnhhX2xvY2spOwogCUlOSVRfREVMQVlFRF9XT1JLKCZhaWxwLT54YV93b3JrLCB4ZnNfYWlsX3dvcmtlcik7CiAJbXAtPm1fYWlsID0gYWlscDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMgYi9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jCmluZGV4IDAzYjNiN2YuLjE1NTg0ZmMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKKysrIGIvZnMveGZzL3hmc190cmFuc19idWYuYwpAQCAtODEsNyArODEsNyBAQAogCXN0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtCSpiaXA7CiAKIAlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKLQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB2b2lkICopID09IE5VTEwpOworCUFTU0VSVChicC0+Yl90cmFuc3AgPT0gTlVMTCk7CiAKIAkvKgogCSAqIFRoZSB4ZnNfYnVmX2xvZ19pdGVtIHBvaW50ZXIgaXMgc3RvcmVkIGluIGJfZnNwcml2YXRlLiAgSWYKQEAgLTg5LDcgKzg5LDcgQEAKIAkgKiBUaGUgY2hlY2tzIHRvIHNlZSBpZiBvbmUgaXMgdGhlcmUgYXJlIGluIHhmc19idWZfaXRlbV9pbml0KCkuCiAJICovCiAJeGZzX2J1Zl9pdGVtX2luaXQoYnAsIHRwLT50X21vdW50cCk7Ci0JYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKKwliaXAgPSBicC0+Yl9mc3ByaXY7CiAJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7CiAJQVNTRVJUKCEoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTEZfQ0FOQ0VMKSk7CiAJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0xPR0dFRCkpOwpAQCAtMTEwLDcgKzExMCw3IEBACiAJICogSW5pdGlhbGl6ZSBiX2ZzcHJpdmF0ZTIgc28gd2UgY2FuIGZpbmQgaXQgd2l0aCBpbmNvcmVfbWF0Y2goKQogCSAqIGluIHhmc190cmFuc19nZXRfYnVmKCkgYW5kIGZyaWVuZHMgYWJvdmUuCiAJICovCi0JWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgdHApOworCWJwLT5iX3RyYW5zcCA9IHRwOwogCiB9CiAKQEAgLTE2MCw3ICsxNjAsNyBAQAogCSAqLwogCWJwID0geGZzX3RyYW5zX2J1Zl9pdGVtX21hdGNoKHRwLCB0YXJnZXRfZGV2LCBibGtubywgbGVuKTsKIAlpZiAoYnAgIT0gTlVMTCkgewotCQlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisJCUFTU0VSVCh4ZnNfYnVmX2lzbG9ja2VkKGJwKSk7CiAJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKHRwLT50X21vdW50cCkpCiAJCQlYRlNfQlVGX1NVUEVSX1NUQUxFKGJwKTsKIApAQCAtMTcyLDggKzE3Miw4IEBACiAJCWVsc2UgaWYgKFhGU19CVUZfSVNTVEFMRShicCkpCiAJCQlBU1NFUlQoIVhGU19CVUZfSVNERUxBWVdSSVRFKGJwKSk7CiAKLQkJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgeGZzX3RyYW5zX3QgKikgPT0gdHApOwotCQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCQlBU1NFUlQoYnAtPmJfdHJhbnNwID09IHRwKTsKKwkJYmlwID0gYnAtPmJfZnNwcml2OwogCQlBU1NFUlQoYmlwICE9IE5VTEwpOwogCQlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOwogCQliaXAtPmJsaV9yZWN1cisrOwpAQCAtMjMyLDggKzIzMiw4IEBACiAJICogcmVjdXJzaW9uIGNvdW50IGFuZCByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUgY2FsbGVyLgogCSAqLwogCWJwID0gbXAtPm1fc2JfYnA7Ci0JaWYgKFhGU19CVUZfRlNQUklWQVRFMihicCwgeGZzX3RyYW5zX3QgKikgPT0gdHApIHsKLQkJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCopOworCWlmIChicC0+Yl90cmFuc3AgPT0gdHApIHsKKwkJYmlwID0gYnAtPmJfZnNwcml2OwogCQlBU1NFUlQoYmlwICE9IE5VTEwpOwogCQlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOwogCQliaXAtPmJsaV9yZWN1cisrOwpAQCAtMzI3LDkgKzMyNyw5IEBACiAJICovCiAJYnAgPSB4ZnNfdHJhbnNfYnVmX2l0ZW1fbWF0Y2godHAsIHRhcmdldCwgYmxrbm8sIGxlbik7CiAJaWYgKGJwICE9IE5VTEwpIHsKLQkJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApIDw9IDApOwotCQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7Ci0JCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKTsKKwkJQVNTRVJUKHhmc19idWZfaXNsb2NrZWQoYnApKTsKKwkJQVNTRVJUKGJwLT5iX3RyYW5zcCA9PSB0cCk7CisJCUFTU0VSVChicC0+Yl9mc3ByaXYgIT0gTlVMTCk7CiAJCUFTU0VSVCgoWEZTX0JVRl9JU0VSUk9SKGJwKSkgPT0gMCk7CiAJCWlmICghKFhGU19CVUZfSVNET05FKGJwKSkpIHsKIAkJCXRyYWNlX3hmc190cmFuc19yZWFkX2J1Zl9pbyhicCwgX1JFVF9JUF8pOwpAQCAtMzYzLDcgKzM2Myw3IEBACiAJCX0KIAogCi0JCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QqKTsKKwkJYmlwID0gYnAtPmJfZnNwcml2OwogCQliaXAtPmJsaV9yZWN1cisrOwogCiAJCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CkBAIC00NjAsMzIgKzQ2MCwzMCBAQAogCQkgeGZzX2J1Zl90CSpicCkKIHsKIAl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKLQl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKIAogCS8qCiAJICogRGVmYXVsdCB0byBhIG5vcm1hbCBicmVsc2UoKSBjYWxsIGlmIHRoZSB0cCBpcyBOVUxMLgogCSAqLwogCWlmICh0cCA9PSBOVUxMKSB7Ci0JCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHZvaWQgKikgPT0gTlVMTCk7CisJCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCA9IGJwLT5iX2ZzcHJpdjsKKworCQlBU1NFUlQoYnAtPmJfdHJhbnNwID09IE5VTEwpOworCiAJCS8qCiAJCSAqIElmIHRoZXJlJ3MgYSBidWYgbG9nIGl0ZW0gYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlciwKIAkJICogdGhlbiBsZXQgdGhlIEFJTCBrbm93IHRoYXQgdGhlIGJ1ZmZlciBpcyBiZWluZwogCQkgKiB1bmxvY2tlZC4KIAkJICovCi0JCWlmIChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKSB7Ci0JCQlsaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2xvZ19pdGVtX3QgKik7Ci0JCQlpZiAobGlwLT5saV90eXBlID09IFhGU19MSV9CVUYpIHsKLQkJCQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCx4ZnNfYnVmX2xvZ19pdGVtX3QqKTsKLQkJCQl4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbShiaXAtPmJsaV9pdGVtLmxpX2FpbHAsCi0JCQkJCQkJbGlwKTsKLQkJCX0KKwkJaWYgKGxpcCAhPSBOVUxMICYmIGxpcC0+bGlfdHlwZSA9PSBYRlNfTElfQlVGKSB7CisJCQliaXAgPSBicC0+Yl9mc3ByaXY7CisJCQl4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbShiaXAtPmJsaV9pdGVtLmxpX2FpbHAsIGxpcCk7CiAJCX0KIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCXJldHVybjsKIAl9CiAKLQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7Ci0JYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKKwlBU1NFUlQoYnAtPmJfdHJhbnNwID09IHRwKTsKKwliaXAgPSBicC0+Yl9mc3ByaXY7CiAJQVNTRVJUKGJpcC0+YmxpX2l0ZW0ubGlfdHlwZSA9PSBYRlNfTElfQlVGKTsKIAlBU1NFUlQoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpKTsKIAlBU1NFUlQoIShiaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICYgWEZTX0JMRl9DQU5DRUwpKTsKQEAgLTU1Niw3ICs1NTQsNyBAQAogCQl4ZnNfYnVmX2l0ZW1fcmVsc2UoYnApOwogCQliaXAgPSBOVUxMOwogCX0KLQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCBOVUxMKTsKKwlicC0+Yl90cmFuc3AgPSBOVUxMOwogCiAJLyoKIAkgKiBJZiB3ZSd2ZSBzdGlsbCBnb3QgYSBidWYgbG9nIGl0ZW0gb24gdGhlIGJ1ZmZlciwgdGhlbgpAQCAtNTgxLDE2ICs1NzksMTUgQEAKIHhmc190cmFuc19iaG9sZCh4ZnNfdHJhbnNfdAkqdHAsCiAJCXhmc19idWZfdAkqYnApCiB7Ci0JeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXAgPSBicC0+Yl9mc3ByaXY7CiAKIAlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKLQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7Ci0JQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOwotCi0JYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKKwlBU1NFUlQoYnAtPmJfdHJhbnNwID09IHRwKTsKKwlBU1NFUlQoYmlwICE9IE5VTEwpOwogCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpOwogCUFTU0VSVCghKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxGX0NBTkNFTCkpOwogCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CisKIAliaXAtPmJsaV9mbGFncyB8PSBYRlNfQkxJX0hPTEQ7CiAJdHJhY2VfeGZzX3RyYW5zX2Job2xkKGJpcCk7CiB9CkBAIC02MDMsMTkgKzYwMCwxNyBAQAogeGZzX3RyYW5zX2Job2xkX3JlbGVhc2UoeGZzX3RyYW5zX3QJKnRwLAogCQkJeGZzX2J1Zl90CSpicCkKIHsKLQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCA9IGJwLT5iX2ZzcHJpdjsKIAogCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOwotCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKTsKLQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCk7Ci0KLQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCUFTU0VSVChicC0+Yl90cmFuc3AgPT0gdHApOworCUFTU0VSVChiaXAgIT0gTlVMTCk7CiAJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7CiAJQVNTRVJUKCEoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTEZfQ0FOQ0VMKSk7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKIAlBU1NFUlQoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0hPTEQpOwotCWJpcC0+YmxpX2ZsYWdzICY9IH5YRlNfQkxJX0hPTEQ7CiAKKwliaXAtPmJsaV9mbGFncyAmPSB+WEZTX0JMSV9IT0xEOwogCXRyYWNlX3hmc190cmFuc19iaG9sZF9yZWxlYXNlKGJpcCk7CiB9CiAKQEAgLTYzNCwxNCArNjI5LDE0IEBACiAJCSAgdWludAkJZmlyc3QsCiAJCSAgdWludAkJbGFzdCkKIHsKLQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCA9IGJwLT5iX2ZzcHJpdjsKIAogCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOwotCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKTsKLQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCk7CisJQVNTRVJUKGJwLT5iX3RyYW5zcCA9PSB0cCk7CisJQVNTRVJUKGJpcCAhPSBOVUxMKTsKIAlBU1NFUlQoKGZpcnN0IDw9IGxhc3QpICYmIChsYXN0IDwgWEZTX0JVRl9DT1VOVChicCkpKTsKLQlBU1NFUlQoKFhGU19CVUZfSU9ET05FX0ZVTkMoYnApID09IE5VTEwpIHx8Ci0JICAgICAgIChYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKSA9PSB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MpKTsKKwlBU1NFUlQoYnAtPmJfaW9kb25lID09IE5VTEwgfHwKKwkgICAgICAgYnAtPmJfaW9kb25lID09IHhmc19idWZfaW9kb25lX2NhbGxiYWNrcyk7CiAKIAkvKgogCSAqIE1hcmsgdGhlIGJ1ZmZlciBhcyBuZWVkaW5nIHRvIGJlIHdyaXR0ZW4gb3V0IGV2ZW50dWFsbHksCkBAIC02NTYsOSArNjUxLDggQEAKIAlYRlNfQlVGX0RFTEFZV1JJVEUoYnApOwogCVhGU19CVUZfRE9ORShicCk7CiAKLQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOwogCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7Ci0JWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMoYnAsIHhmc19idWZfaW9kb25lX2NhbGxiYWNrcyk7CisJYnAtPmJfaW9kb25lID0geGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzOwogCWJpcC0+YmxpX2l0ZW0ubGlfY2IgPSB4ZnNfYnVmX2lvZG9uZTsKIAogCXRyYWNlX3hmc190cmFuc19sb2dfYnVmKGJpcCk7CkBAIC03MDYsMTMgKzcwMCwxMSBAQAogCXhmc190cmFuc190CSp0cCwKIAl4ZnNfYnVmX3QJKmJwKQogewotCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwID0gYnAtPmJfZnNwcml2OwogCiAJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7Ci0JQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgeGZzX3RyYW5zX3QgKikgPT0gdHApOwotCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKTsKLQotCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisJQVNTRVJUKGJwLT5iX3RyYW5zcCA9PSB0cCk7CisJQVNTRVJUKGJpcCAhPSBOVUxMKTsKIAlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOwogCiAJdHJhY2VfeGZzX3RyYW5zX2JpbnZhbChiaXApOwpAQCAtNzgwLDEzICs3NzIsMTEgQEAKIAl4ZnNfdHJhbnNfdAkqdHAsCiAJeGZzX2J1Zl90CSpicCkKIHsKLQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCA9IGJwLT5iX2ZzcHJpdjsKIAogCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOwotCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKTsKLQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCk7Ci0KLQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCUFTU0VSVChicC0+Yl90cmFuc3AgPT0gdHApOworCUFTU0VSVChiaXAgIT0gTlVMTCk7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKIAogCWJpcC0+YmxpX2ZsYWdzIHw9IFhGU19CTElfSU5PREVfQlVGOwpAQCAtODA2LDEzICs3OTYsMTEgQEAKIAl4ZnNfdHJhbnNfdAkqdHAsCiAJeGZzX2J1Zl90CSpicCkKIHsKLQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCA9IGJwLT5iX2ZzcHJpdjsKIAogCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOwotCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKTsKLQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCk7Ci0KLQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCUFTU0VSVChicC0+Yl90cmFuc3AgPT0gdHApOworCUFTU0VSVChiaXAgIT0gTlVMTCk7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKIAogCWJpcC0+YmxpX2ZsYWdzIHw9IFhGU19CTElfU1RBTEVfSU5PREU7CkBAIC04MzMsMTMgKzgyMSwxMSBAQAogCXhmc190cmFuc190CSp0cCwKIAl4ZnNfYnVmX3QJKmJwKQogewotCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwID0gYnAtPmJfZnNwcml2OwogCiAJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7Ci0JQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgeGZzX3RyYW5zX3QgKikgPT0gdHApOwotCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKTsKLQotCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisJQVNTRVJUKGJwLT5iX3RyYW5zcCA9PSB0cCk7CisJQVNTRVJUKGJpcCAhPSBOVUxMKTsKIAlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOwogCiAJYmlwLT5ibGlfZmxhZ3MgfD0gWEZTX0JMSV9JTk9ERV9BTExPQ19CVUY7CkBAIC04NjMsMTYgKzg0OSwxNCBAQAogCXhmc19idWZfdAkqYnAsCiAJdWludAkJdHlwZSkKIHsKLQl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCA9IGJwLT5iX2ZzcHJpdjsKIAogCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOwotCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKTsKLQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCk7CisJQVNTRVJUKGJwLT5iX3RyYW5zcCA9PSB0cCk7CisJQVNTRVJUKGJpcCAhPSBOVUxMKTsKIAlBU1NFUlQodHlwZSA9PSBYRlNfQkxGX1VEUVVPVF9CVUYgfHwKIAkgICAgICAgdHlwZSA9PSBYRlNfQkxGX1BEUVVPVF9CVUYgfHwKIAkgICAgICAgdHlwZSA9PSBYRlNfQkxGX0dEUVVPVF9CVUYpOwotCi0JYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKIAlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOwogCiAJYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyB8PSB0eXBlOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19pbm9kZS5jIGIvZnMveGZzL3hmc190cmFuc19pbm9kZS5jCmluZGV4IDA0OGIwYzYuLmM4ZGVhMmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfaW5vZGUuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMKQEAgLTU1LDcgKzU1LDYgQEAKIHsKIAl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwOwogCi0JQVNTRVJUKGlwLT5pX3RyYW5zcCA9PSBOVUxMKTsKIAlBU1NFUlQoeGZzX2lzaWxvY2tlZChpcCwgWEZTX0lMT0NLX0VYQ0wpKTsKIAlpZiAoaXAtPmlfaXRlbXAgPT0gTlVMTCkKIAkJeGZzX2lub2RlX2l0ZW1faW5pdChpcCwgaXAtPmlfbW91bnQpOwpAQCAtNjgsMTIgKzY3LDYgQEAKIAl4ZnNfdHJhbnNfYWRkX2l0ZW0odHAsICZpaXAtPmlsaV9pdGVtKTsKIAogCXhmc190cmFuc19pbm9kZV9icm9vdF9kZWJ1ZyhpcCk7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgaV90cmFuc3Agc28gd2UgY2FuIGZpbmQgaXQgd2l0aCB4ZnNfaW5vZGVfaW5jb3JlKCkKLQkgKiBpbiB4ZnNfdHJhbnNfaWdldCgpIGFib3ZlLgotCSAqLwotCWlwLT5pX3RyYW5zcCA9IHRwOwogfQogCiAvKgpAQCAtMTExLDcgKzEwNCw2IEBACiAKIAlBU1NFUlQodHApOwogCUFTU0VSVCh4ZnNfaXNpbG9ja2VkKGlwLCBYRlNfSUxPQ0tfRVhDTCkpOwotCUFTU0VSVChpcC0+aV90cmFuc3AgPT0gdHApOwogCiAJdHYgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwogCkBAIC0xNDAsNyArMTMyLDYgQEAKIAl4ZnNfaW5vZGVfdAkqaXAsCiAJdWludAkJZmxhZ3MpCiB7Ci0JQVNTRVJUKGlwLT5pX3RyYW5zcCA9PSB0cCk7CiAJQVNTRVJUKGlwLT5pX2l0ZW1wICE9IE5VTEwpOwogCUFTU0VSVCh4ZnNfaXNpbG9ja2VkKGlwLCBYRlNfSUxPQ0tfRVhDTCkpOwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaCBiL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oCmluZGV4IDZiMTY0ZTkuLjIxMjk0NmIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oCkBAIC01Myw3ICs1Myw3IEBACiAgKiBvZiB0aGUgbGlzdCB0byB0cmlnZ2VyIHRyYXZlcnNhbCByZXN0YXJ0cy4KICAqLwogc3RydWN0IHhmc19haWxfY3Vyc29yIHsKLQlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IJKm5leHQ7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKml0ZW07CiB9OwogCkBAIC02Niw3ICs2Niw3IEBACiAJc3RydWN0IHhmc19tb3VudAkqeGFfbW91bnQ7CiAJc3RydWN0IGxpc3RfaGVhZAl4YV9haWw7CiAJeGZzX2xzbl90CQl4YV90YXJnZXQ7Ci0Jc3RydWN0IHhmc19haWxfY3Vyc29yCXhhX2N1cnNvcnM7CisJc3RydWN0IGxpc3RfaGVhZAl4YV9jdXJzb3JzOwogCXNwaW5sb2NrX3QJCXhhX2xvY2s7CiAJc3RydWN0IGRlbGF5ZWRfd29yawl4YV93b3JrOwogCXhmc19sc25fdAkJeGFfbGFzdF9wdXNoZWRfbHNuOwpAQCAtODIsNiArODIsNyBAQAogZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSp4ZnNfYWlsX3dxOwkvKiBBSUwgd29ya3F1ZXVlICovCiAKIHZvaWQJeGZzX3RyYW5zX2FpbF91cGRhdGVfYnVsayhzdHJ1Y3QgeGZzX2FpbCAqYWlscCwKKwkJCQlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IgKmN1ciwKIAkJCQlzdHJ1Y3QgeGZzX2xvZ19pdGVtICoqbG9nX2l0ZW1zLCBpbnQgbnJfaXRlbXMsCiAJCQkJeGZzX2xzbl90IGxzbikgX19yZWxlYXNlcyhhaWxwLT54YV9sb2NrKTsKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtOTAsNyArOTEsNyBAQAogCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKIAl4ZnNfbHNuX3QJCWxzbikgX19yZWxlYXNlcyhhaWxwLT54YV9sb2NrKQogewotCXhmc190cmFuc19haWxfdXBkYXRlX2J1bGsoYWlscCwgJmxpcCwgMSwgbHNuKTsKKwl4ZnNfdHJhbnNfYWlsX3VwZGF0ZV9idWxrKGFpbHAsIE5VTEwsICZsaXAsIDEsIGxzbik7CiB9CiAKIHZvaWQJeGZzX3RyYW5zX2FpbF9kZWxldGVfYnVsayhzdHJ1Y3QgeGZzX2FpbCAqYWlscCwKQEAgLTExMSwxMCArMTEyLDEzIEBACiB2b2lkCQkJeGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0oc3RydWN0IHhmc19haWwgKiwKIAkJCQkJeGZzX2xvZ19pdGVtX3QgKik7CiAKLXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKnhmc190cmFuc19haWxfY3Vyc29yX2ZpcnN0KHN0cnVjdCB4ZnNfYWlsICphaWxwLAorc3RydWN0IHhmc19sb2dfaXRlbSAqCXhmc190cmFuc19haWxfY3Vyc29yX2ZpcnN0KHN0cnVjdCB4ZnNfYWlsICphaWxwLAogCQkJCQlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IgKmN1ciwKIAkJCQkJeGZzX2xzbl90IGxzbik7Ci1zdHJ1Y3QgeGZzX2xvZ19pdGVtCSp4ZnNfdHJhbnNfYWlsX2N1cnNvcl9uZXh0KHN0cnVjdCB4ZnNfYWlsICphaWxwLAorc3RydWN0IHhmc19sb2dfaXRlbSAqCXhmc190cmFuc19haWxfY3Vyc29yX2xhc3Qoc3RydWN0IHhmc19haWwgKmFpbHAsCisJCQkJCXN0cnVjdCB4ZnNfYWlsX2N1cnNvciAqY3VyLAorCQkJCQl4ZnNfbHNuX3QgbHNuKTsKK3N0cnVjdCB4ZnNfbG9nX2l0ZW0gKgl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9uZXh0KHN0cnVjdCB4ZnNfYWlsICphaWxwLAogCQkJCQlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IgKmN1cik7CiB2b2lkCQkJeGZzX3RyYW5zX2FpbF9jdXJzb3JfZG9uZShzdHJ1Y3QgeGZzX2FpbCAqYWlscCwKIAkJCQkJc3RydWN0IHhmc19haWxfY3Vyc29yICpjdXIpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc192bm9kZW9wcy5jIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCmluZGV4IGI3YTVmZTcuLjg4ZDEyMTQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYworKysgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKQEAgLTUwLDQzMCArNTAsNiBAQAogI2luY2x1ZGUgInhmc192bm9kZW9wcy5oIgogI2luY2x1ZGUgInhmc190cmFjZS5oIgogCi1pbnQKLXhmc19zZXRhdHRyKAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAotCXN0cnVjdCBpYXR0cgkJKmlhdHRyLAotCWludAkJCWZsYWdzKQotewotCXhmc19tb3VudF90CQkqbXAgPSBpcC0+aV9tb3VudDsKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IFZGU19JKGlwKTsKLQlpbnQJCQltYXNrID0gaWF0dHItPmlhX3ZhbGlkOwotCXhmc190cmFuc190CQkqdHA7Ci0JaW50CQkJY29kZTsKLQl1aW50CQkJbG9ja19mbGFnczsKLQl1aW50CQkJY29tbWl0X2ZsYWdzPTA7Ci0JdWlkX3QJCQl1aWQ9MCwgaXVpZD0wOwotCWdpZF90CQkJZ2lkPTAsIGlnaWQ9MDsKLQlzdHJ1Y3QgeGZzX2RxdW90CSp1ZHFwLCAqZ2RxcCwgKm9sZGRxdW90MSwgKm9sZGRxdW90MjsKLQlpbnQJCQluZWVkX2lvbG9jayA9IDE7Ci0KLQl0cmFjZV94ZnNfc2V0YXR0cihpcCk7Ci0KLQlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKQotCQlyZXR1cm4gWEZTX0VSUk9SKEVST0ZTKTsKLQotCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKLQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwotCi0JY29kZSA9IC1pbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGlhdHRyKTsKLQlpZiAoY29kZSkKLQkJcmV0dXJuIGNvZGU7Ci0KLQlvbGRkcXVvdDEgPSBvbGRkcXVvdDIgPSBOVUxMOwotCXVkcXAgPSBnZHFwID0gTlVMTDsKLQotCS8qCi0JICogSWYgZGlzayBxdW90YXMgaXMgb24sIHdlIG1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgZG8gZXhpc3Qgb24gZGlzaywKLQkgKiBiZWZvcmUgd2Ugc3RhcnQgYW55IG90aGVyIHRyYW5zYWN0aW9ucy4gVHJ5aW5nIHRvIGRvIHRoaXMgbGF0ZXIKLQkgKiBpcyBtZXNzeS4gV2UgZG9uJ3QgY2FyZSB0byB0YWtlIGEgcmVhZGxvY2sgdG8gbG9vayBhdCB0aGUgaWRzCi0JICogaW4gaW5vZGUgaGVyZSwgYmVjYXVzZSB3ZSBjYW4ndCBob2xkIGl0IGFjcm9zcyB0aGUgdHJhbnNfcmVzZXJ2ZS4KLQkgKiBJZiB0aGUgSURzIGRvIGNoYW5nZSBiZWZvcmUgd2UgdGFrZSB0aGUgaWxvY2ssIHdlJ3JlIGNvdmVyZWQKLQkgKiBiZWNhdXNlIHRoZSBpXypkcXVvdCBmaWVsZHMgd2lsbCBnZXQgdXBkYXRlZCBhbnl3YXkuCi0JICovCi0JaWYgKFhGU19JU19RVU9UQV9PTihtcCkgJiYgKG1hc2sgJiAoQVRUUl9VSUR8QVRUUl9HSUQpKSkgewotCQl1aW50CXFmbGFncyA9IDA7Ci0KLQkJaWYgKChtYXNrICYgQVRUUl9VSUQpICYmIFhGU19JU19VUVVPVEFfT04obXApKSB7Ci0JCQl1aWQgPSBpYXR0ci0+aWFfdWlkOwotCQkJcWZsYWdzIHw9IFhGU19RTU9QVF9VUVVPVEE7Ci0JCX0gZWxzZSB7Ci0JCQl1aWQgPSBpcC0+aV9kLmRpX3VpZDsKLQkJfQotCQlpZiAoKG1hc2sgJiBBVFRSX0dJRCkgJiYgWEZTX0lTX0dRVU9UQV9PTihtcCkpIHsKLQkJCWdpZCA9IGlhdHRyLT5pYV9naWQ7Ci0JCQlxZmxhZ3MgfD0gWEZTX1FNT1BUX0dRVU9UQTsKLQkJfSAgZWxzZSB7Ci0JCQlnaWQgPSBpcC0+aV9kLmRpX2dpZDsKLQkJfQotCi0JCS8qCi0JCSAqIFdlIHRha2UgYSByZWZlcmVuY2Ugd2hlbiB3ZSBpbml0aWFsaXplIHVkcXAgYW5kIGdkcXAsCi0JCSAqIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0IHdlIG5ldmVyIGJsaW5kbHkgZG91YmxlIHRyaXAgb24KLQkJICogdGhlIHNhbWUgdmFyaWFibGUuIFNlZSB4ZnNfY3JlYXRlKCkgZm9yIGFuIGV4YW1wbGUuCi0JCSAqLwotCQlBU1NFUlQodWRxcCA9PSBOVUxMKTsKLQkJQVNTRVJUKGdkcXAgPT0gTlVMTCk7Ci0JCWNvZGUgPSB4ZnNfcW1fdm9wX2RxYWxsb2MoaXAsIHVpZCwgZ2lkLCB4ZnNfZ2V0X3Byb2ppZChpcCksCi0JCQkJCSBxZmxhZ3MsICZ1ZHFwLCAmZ2RxcCk7Ci0JCWlmIChjb2RlKQotCQkJcmV0dXJuIGNvZGU7Ci0JfQotCi0JLyoKLQkgKiBGb3IgdGhlIG90aGVyIGF0dHJpYnV0ZXMsIHdlIGFjcXVpcmUgdGhlIGlub2RlIGxvY2sgYW5kCi0JICogZmlyc3QgZG8gYW4gZXJyb3IgY2hlY2tpbmcgcGFzcy4KLQkgKi8KLQl0cCA9IE5VTEw7Ci0JbG9ja19mbGFncyA9IFhGU19JTE9DS19FWENMOwotCWlmIChmbGFncyAmIFhGU19BVFRSX05PTE9DSykKLQkJbmVlZF9pb2xvY2sgPSAwOwotCWlmICghKG1hc2sgJiBBVFRSX1NJWkUpKSB7Ci0JCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU0VUQVRUUl9OT1RfU0laRSk7Ci0JCWNvbW1pdF9mbGFncyA9IDA7Ci0JCWNvZGUgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX0lDSEFOR0VfTE9HX1JFUyhtcCksCi0JCQkJCSAwLCAwLCAwKTsKLQkJaWYgKGNvZGUpIHsKLQkJCWxvY2tfZmxhZ3MgPSAwOwotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAobmVlZF9pb2xvY2spCi0JCQlsb2NrX2ZsYWdzIHw9IFhGU19JT0xPQ0tfRVhDTDsKLQl9Ci0KLQl4ZnNfaWxvY2soaXAsIGxvY2tfZmxhZ3MpOwotCi0JLyoKLQkgKiBDaGFuZ2UgZmlsZSBvd25lcnNoaXAuICBNdXN0IGJlIHRoZSBvd25lciBvciBwcml2aWxlZ2VkLgotCSAqLwotCWlmIChtYXNrICYgKEFUVFJfVUlEfEFUVFJfR0lEKSkgewotCQkvKgotCQkgKiBUaGVzZSBJRHMgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHdlIGxhc3QgbG9va2VkIGF0IHRoZW0uCi0JCSAqIEJ1dCwgd2UncmUgYXNzdXJlZCB0aGF0IGlmIHRoZSBvd25lcnNoaXAgZGlkIGNoYW5nZQotCQkgKiB3aGlsZSB3ZSBkaWRuJ3QgaGF2ZSB0aGUgaW5vZGUgbG9ja2VkLCBpbm9kZSdzIGRxdW90KHMpCi0JCSAqIHdvdWxkIGhhdmUgY2hhbmdlZCBhbHNvLgotCQkgKi8KLQkJaXVpZCA9IGlwLT5pX2QuZGlfdWlkOwotCQlpZ2lkID0gaXAtPmlfZC5kaV9naWQ7Ci0JCWdpZCA9IChtYXNrICYgQVRUUl9HSUQpID8gaWF0dHItPmlhX2dpZCA6IGlnaWQ7Ci0JCXVpZCA9IChtYXNrICYgQVRUUl9VSUQpID8gaWF0dHItPmlhX3VpZCA6IGl1aWQ7Ci0KLQkJLyoKLQkJICogRG8gYSBxdW90YSByZXNlcnZhdGlvbiBvbmx5IGlmIHVpZC9naWQgaXMgYWN0dWFsbHkKLQkJICogZ29pbmcgdG8gY2hhbmdlLgotCQkgKi8KLQkJaWYgKFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSAmJgotCQkgICAgKChYRlNfSVNfVVFVT1RBX09OKG1wKSAmJiBpdWlkICE9IHVpZCkgfHwKLQkJICAgICAoWEZTX0lTX0dRVU9UQV9PTihtcCkgJiYgaWdpZCAhPSBnaWQpKSkgewotCQkJQVNTRVJUKHRwKTsKLQkJCWNvZGUgPSB4ZnNfcW1fdm9wX2Nob3duX3Jlc2VydmUodHAsIGlwLCB1ZHFwLCBnZHFwLAotCQkJCQkJY2FwYWJsZShDQVBfRk9XTkVSKSA/Ci0JCQkJCQlYRlNfUU1PUFRfRk9SQ0VfUkVTIDogMCk7Ci0JCQlpZiAoY29kZSkJLyogb3V0IG9mIHF1b3RhICovCi0JCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRydW5jYXRlIGZpbGUuICBNdXN0IGhhdmUgd3JpdGUgcGVybWlzc2lvbiBhbmQgbm90IGJlIGEgZGlyZWN0b3J5LgotCSAqLwotCWlmIChtYXNrICYgQVRUUl9TSVpFKSB7Ci0JCS8qIFNob3J0IGNpcmN1aXQgdGhlIHRydW5jYXRlIGNhc2UgZm9yIHplcm8gbGVuZ3RoIGZpbGVzICovCi0JCWlmIChpYXR0ci0+aWFfc2l6ZSA9PSAwICYmCi0JCSAgICBpcC0+aV9zaXplID09IDAgJiYgaXAtPmlfZC5kaV9uZXh0ZW50cyA9PSAwKSB7Ci0JCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJbG9ja19mbGFncyAmPSB+WEZTX0lMT0NLX0VYQ0w7Ci0JCQlpZiAobWFzayAmIEFUVFJfQ1RJTUUpIHsKLQkJCQlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0KLQkJCQkJCWN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7Ci0JCQkJeGZzX21hcmtfaW5vZGVfZGlydHlfc3luYyhpcCk7Ci0JCQl9Ci0JCQljb2RlID0gMDsKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkJaWYgKFNfSVNESVIoaXAtPmlfZC5kaV9tb2RlKSkgewotCQkJY29kZSA9IFhGU19FUlJPUihFSVNESVIpOwotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCX0gZWxzZSBpZiAoIVNfSVNSRUcoaXAtPmlfZC5kaV9tb2RlKSkgewotCQkJY29kZSA9IFhGU19FUlJPUihFSU5WQUwpOwotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCQkvKgotCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZHF1b3RzIGFyZSBhdHRhY2hlZCB0byB0aGUgaW5vZGUuCi0JCSAqLwotCQljb2RlID0geGZzX3FtX2RxYXR0YWNoX2xvY2tlZChpcCwgMCk7Ci0JCWlmIChjb2RlKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJLyoKLQkJICogTm93IHdlIGNhbiBtYWtlIHRoZSBjaGFuZ2VzLiAgQmVmb3JlIHdlIGpvaW4gdGhlIGlub2RlCi0JCSAqIHRvIHRoZSB0cmFuc2FjdGlvbiwgaWYgQVRUUl9TSVpFIGlzIHNldCB0aGVuIHRha2UgY2FyZSBvZgotCQkgKiB0aGUgcGFydCBvZiB0aGUgdHJ1bmNhdGlvbiB0aGF0IG11c3QgYmUgZG9uZSB3aXRob3V0IHRoZQotCQkgKiBpbm9kZSBsb2NrLiAgVGhpcyBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSBqb2luaW5nIHRoZSBpbm9kZQotCQkgKiB0byB0aGUgdHJhbnNhY3Rpb24sIGJlY2F1c2UgdGhlIGlub2RlIGNhbm5vdCBiZSB1bmxvY2tlZAotCQkgKiBvbmNlIGl0IGlzIGEgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCi0JCSAqLwotCQlpZiAoaWF0dHItPmlhX3NpemUgPiBpcC0+aV9zaXplKSB7Ci0JCQkvKgotCQkJICogRG8gdGhlIGZpcnN0IHBhcnQgb2YgZ3Jvd2luZyBhIGZpbGU6IHplcm8gYW55IGRhdGEKLQkJCSAqIGluIHRoZSBsYXN0IGJsb2NrIHRoYXQgaXMgYmV5b25kIHRoZSBvbGQgRU9GLiAgV2UKLQkJCSAqIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgdGhlIGlub2RlIGlzIGpvaW5lZCB0byB0aGUKLQkJCSAqIHRyYW5zYWN0aW9uIHRvIG1vZGlmeSB0aGUgaV9zaXplLgotCQkJICovCi0JCQljb2RlID0geGZzX3plcm9fZW9mKGlwLCBpYXR0ci0+aWFfc2l6ZSwgaXAtPmlfc2l6ZSk7Ci0JCQlpZiAoY29kZSkKLQkJCQlnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQlsb2NrX2ZsYWdzICY9IH5YRlNfSUxPQ0tfRVhDTDsKLQotCQkvKgotCQkgKiBXZSBhcmUgZ29pbmcgdG8gbG9nIHRoZSBpbm9kZSBzaXplIGNoYW5nZSBpbiB0aGlzCi0JCSAqIHRyYW5zYWN0aW9uIHNvIGFueSBwcmV2aW91cyB3cml0ZXMgdGhhdCBhcmUgYmV5b25kIHRoZSBvbgotCQkgKiBkaXNrIEVPRiBhbmQgdGhlIG5ldyBFT0YgdGhhdCBoYXZlIG5vdCBiZWVuIHdyaXR0ZW4gb3V0IG5lZWQKLQkJICogdG8gYmUgd3JpdHRlbiBoZXJlLiBJZiB3ZSBkbyBub3Qgd3JpdGUgdGhlIGRhdGEgb3V0LCB3ZQotCQkgKiBleHBvc2Ugb3Vyc2VsdmVzIHRvIHRoZSBudWxsIGZpbGVzIHByb2JsZW0uCi0JCSAqCi0JCSAqIE9ubHkgZmx1c2ggZnJvbSB0aGUgb24gZGlzayBzaXplIHRvIHRoZSBzbWFsbGVyIG9mIHRoZSBpbgotCQkgKiBtZW1vcnkgZmlsZSBzaXplIG9yIHRoZSBuZXcgc2l6ZSBhcyB0aGF0J3MgdGhlIHJhbmdlIHdlCi0JCSAqIHJlYWxseSBjYXJlIGFib3V0IGhlcmUgYW5kIHByZXZlbnRzIHdhaXRpbmcgZm9yIG90aGVyIGRhdGEKLQkJICogbm90IHdpdGhpbiB0aGUgcmFuZ2Ugd2UgY2FyZSBhYm91dCBoZXJlLgotCQkgKi8KLQkJaWYgKGlwLT5pX3NpemUgIT0gaXAtPmlfZC5kaV9zaXplICYmCi0JCSAgICBpYXR0ci0+aWFfc2l6ZSA+IGlwLT5pX2QuZGlfc2l6ZSkgewotCQkJY29kZSA9IHhmc19mbHVzaF9wYWdlcyhpcCwKLQkJCQkJaXAtPmlfZC5kaV9zaXplLCBpYXR0ci0+aWFfc2l6ZSwKLQkJCQkJWEJGX0FTWU5DLCBGSV9OT05FKTsKLQkJCWlmIChjb2RlKQotCQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkJLyogd2FpdCBmb3IgYWxsIEkvTyB0byBjb21wbGV0ZSAqLwotCQl4ZnNfaW9lbmRfd2FpdChpcCk7Ci0KLQkJY29kZSA9IC1ibG9ja190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlhdHRyLT5pYV9zaXplLAotCQkJCQkgICAgeGZzX2dldF9ibG9ja3MpOwotCQlpZiAoY29kZSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU0VUQVRUUl9TSVpFKTsKLQkJY29kZSA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfSVRSVU5DQVRFX0xPR19SRVMobXApLCAwLAotCQkJCQkgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKLQkJCQkJIFhGU19JVFJVTkNBVEVfTE9HX0NPVU5UKTsKLQkJaWYgKGNvZGUpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQl0cnVuY2F0ZV9zZXRzaXplKGlub2RlLCBpYXR0ci0+aWFfc2l6ZSk7Ci0KLQkJY29tbWl0X2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKLQkJbG9ja19mbGFncyB8PSBYRlNfSUxPQ0tfRVhDTDsKLQotCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKLQotCQkvKgotCQkgKiBPbmx5IGNoYW5nZSB0aGUgYy9tdGltZSBpZiB3ZSBhcmUgY2hhbmdpbmcgdGhlIHNpemUKLQkJICogb3Igd2UgYXJlIGV4cGxpY2l0bHkgYXNrZWQgdG8gY2hhbmdlIGl0LiBUaGlzIGhhbmRsZXMKLQkJICogdGhlIHNlbWFudGljIGRpZmZlcmVuY2UgYmV0d2VlbiB0cnVuY2F0ZSgpIGFuZCBmdHJ1bmNhdGUoKQotCQkgKiBhcyBpbXBsZW1lbnRlZCBpbiB0aGUgVkZTLgotCQkgKgotCQkgKiBUaGUgcmVndWxhciB0cnVuY2F0ZSgpIGNhc2Ugd2l0aG91dCBBVFRSX0NUSU1FIGFuZCBBVFRSX01USU1FCi0JCSAqIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSB0aW1lcyBkZXNwaXRlCi0JCSAqIG5vdCBoYXZpbmcgdGhlc2UgZmxhZ3Mgc2V0LiAgRm9yIGFsbCBvdGhlciBvcGVyYXRpb25zIHRoZQotCQkgKiBWRlMgc2V0IHRoZXNlIGZsYWdzIGV4cGxpY2l0bHkgaWYgaXQgd2FudHMgYSB0aW1lc3RhbXAKLQkJICogdXBkYXRlLgotCQkgKi8KLQkJaWYgKGlhdHRyLT5pYV9zaXplICE9IGlwLT5pX3NpemUgJiYKLQkJICAgICghKG1hc2sgJiAoQVRUUl9DVElNRSB8IEFUVFJfTVRJTUUpKSkpIHsKLQkJCWlhdHRyLT5pYV9jdGltZSA9IGlhdHRyLT5pYV9tdGltZSA9Ci0JCQkJY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKLQkJCW1hc2sgfD0gQVRUUl9DVElNRSB8IEFUVFJfTVRJTUU7Ci0JCX0KLQotCQlpZiAoaWF0dHItPmlhX3NpemUgPiBpcC0+aV9zaXplKSB7Ci0JCQlpcC0+aV9kLmRpX3NpemUgPSBpYXR0ci0+aWFfc2l6ZTsKLQkJCWlwLT5pX3NpemUgPSBpYXR0ci0+aWFfc2l6ZTsKLQkJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKLQkJfSBlbHNlIGlmIChpYXR0ci0+aWFfc2l6ZSA8PSBpcC0+aV9zaXplIHx8Ci0JCQkgICAoaWF0dHItPmlhX3NpemUgPT0gMCAmJiBpcC0+aV9kLmRpX25leHRlbnRzKSkgewotCQkJLyoKLQkJCSAqIHNpZ25hbCBhIHN5bmMgdHJhbnNhY3Rpb24gdW5sZXNzCi0JCQkgKiB3ZSdyZSB0cnVuY2F0aW5nIGFuIGFscmVhZHkgdW5saW5rZWQKLQkJCSAqIGZpbGUgb24gYSB3c3luYyBmaWxlc3lzdGVtCi0JCQkgKi8KLQkJCWNvZGUgPSB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgmdHAsIGlwLCBpYXR0ci0+aWFfc2l6ZSwKLQkJCQkJICAgIFhGU19EQVRBX0ZPUkssCi0JCQkJCSAgICAoKGlwLT5pX2QuZGlfbmxpbmsgIT0gMCB8fAotCQkJCQkgICAgICAhKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSkKLQkJCQkJICAgICA/IDEgOiAwKSk7Ci0JCQlpZiAoY29kZSkKLQkJCQlnb3RvIGFib3J0X3JldHVybjsKLQkJCS8qCi0JCQkgKiBUcnVuY2F0ZWQgImRvd24iLCBzbyB3ZSdyZSByZW1vdmluZyByZWZlcmVuY2VzCi0JCQkgKiB0byBvbGQgZGF0YSBoZXJlIC0gaWYgd2Ugbm93IGRlbGF5IGZsdXNoaW5nIGZvcgotCQkJICogYSBsb25nIHRpbWUsIHdlIGV4cG9zZSBvdXJzZWx2ZXMgdW5kdWx5IHRvIHRoZQotCQkJICogbm90b3Jpb3VzIE5VTEwgZmlsZXMgcHJvYmxlbS4gIFNvLCB3ZSBtYXJrIHRoaXMKLQkJCSAqIHZub2RlIGFuZCBmbHVzaCBpdCB3aGVuIHRoZSBmaWxlIGlzIGNsb3NlZCwgYW5kCi0JCQkgKiBkbyBub3Qgd2FpdCB0aGUgdXN1YWwgKGxvbmcpIHRpbWUgZm9yIHdyaXRlb3V0LgotCQkJICovCi0JCQl4ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lUUlVOQ0FURUQpOwotCQl9Ci0JfSBlbHNlIGlmICh0cCkgewotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKLQl9Ci0KLQkvKgotCSAqIENoYW5nZSBmaWxlIG93bmVyc2hpcC4gIE11c3QgYmUgdGhlIG93bmVyIG9yIHByaXZpbGVnZWQuCi0JICovCi0JaWYgKG1hc2sgJiAoQVRUUl9VSUR8QVRUUl9HSUQpKSB7Ci0JCS8qCi0JCSAqIENBUF9GU0VUSUQgb3ZlcnJpZGVzIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCQkgKgotCQkgKiBUaGUgc2V0LXVzZXItSUQgYW5kIHNldC1ncm91cC1JRCBiaXRzIG9mIGEgZmlsZSB3aWxsIGJlCi0JCSAqIGNsZWFyZWQgdXBvbiBzdWNjZXNzZnVsIHJldHVybiBmcm9tIGNob3duKCkKLQkJICovCi0JCWlmICgoaXAtPmlfZC5kaV9tb2RlICYgKFNfSVNVSUR8U19JU0dJRCkpICYmCi0JCSAgICAhY2FwYWJsZShDQVBfRlNFVElEKSkgewotCQkJaXAtPmlfZC5kaV9tb2RlICY9IH4oU19JU1VJRHxTX0lTR0lEKTsKLQkJfQotCi0JCS8qCi0JCSAqIENoYW5nZSB0aGUgb3duZXJzaGlwcyBhbmQgcmVnaXN0ZXIgcXVvdGEgbW9kaWZpY2F0aW9ucwotCQkgKiBpbiB0aGUgdHJhbnNhY3Rpb24uCi0JCSAqLwotCQlpZiAoaXVpZCAhPSB1aWQpIHsKLQkJCWlmIChYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkgJiYgWEZTX0lTX1VRVU9UQV9PTihtcCkpIHsKLQkJCQlBU1NFUlQobWFzayAmIEFUVFJfVUlEKTsKLQkJCQlBU1NFUlQodWRxcCk7Ci0JCQkJb2xkZHF1b3QxID0geGZzX3FtX3ZvcF9jaG93bih0cCwgaXAsCi0JCQkJCQkJJmlwLT5pX3VkcXVvdCwgdWRxcCk7Ci0JCQl9Ci0JCQlpcC0+aV9kLmRpX3VpZCA9IHVpZDsKLQkJCWlub2RlLT5pX3VpZCA9IHVpZDsKLQkJfQotCQlpZiAoaWdpZCAhPSBnaWQpIHsKLQkJCWlmIChYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkgJiYgWEZTX0lTX0dRVU9UQV9PTihtcCkpIHsKLQkJCQlBU1NFUlQoIVhGU19JU19QUVVPVEFfT04obXApKTsKLQkJCQlBU1NFUlQobWFzayAmIEFUVFJfR0lEKTsKLQkJCQlBU1NFUlQoZ2RxcCk7Ci0JCQkJb2xkZHF1b3QyID0geGZzX3FtX3ZvcF9jaG93bih0cCwgaXAsCi0JCQkJCQkJJmlwLT5pX2dkcXVvdCwgZ2RxcCk7Ci0JCQl9Ci0JCQlpcC0+aV9kLmRpX2dpZCA9IGdpZDsKLQkJCWlub2RlLT5pX2dpZCA9IGdpZDsKLQkJfQotCX0KLQotCS8qCi0JICogQ2hhbmdlIGZpbGUgYWNjZXNzIG1vZGVzLgotCSAqLwotCWlmIChtYXNrICYgQVRUUl9NT0RFKSB7Ci0JCXVtb2RlX3QgbW9kZSA9IGlhdHRyLT5pYV9tb2RlOwotCi0JCWlmICghaW5fZ3JvdXBfcChpbm9kZS0+aV9naWQpICYmICFjYXBhYmxlKENBUF9GU0VUSUQpKQotCQkJbW9kZSAmPSB+U19JU0dJRDsKLQotCQlpcC0+aV9kLmRpX21vZGUgJj0gU19JRk1UOwotCQlpcC0+aV9kLmRpX21vZGUgfD0gbW9kZSAmIH5TX0lGTVQ7Ci0KLQkJaW5vZGUtPmlfbW9kZSAmPSBTX0lGTVQ7Ci0JCWlub2RlLT5pX21vZGUgfD0gbW9kZSAmIH5TX0lGTVQ7Ci0JfQotCi0JLyoKLQkgKiBDaGFuZ2UgZmlsZSBhY2Nlc3Mgb3IgbW9kaWZpZWQgdGltZXMuCi0JICovCi0JaWYgKG1hc2sgJiBBVFRSX0FUSU1FKSB7Ci0JCWlub2RlLT5pX2F0aW1lID0gaWF0dHItPmlhX2F0aW1lOwotCQlpcC0+aV9kLmRpX2F0aW1lLnRfc2VjID0gaWF0dHItPmlhX2F0aW1lLnR2X3NlYzsKLQkJaXAtPmlfZC5kaV9hdGltZS50X25zZWMgPSBpYXR0ci0+aWFfYXRpbWUudHZfbnNlYzsKLQkJaXAtPmlfdXBkYXRlX2NvcmUgPSAxOwotCX0KLQlpZiAobWFzayAmIEFUVFJfQ1RJTUUpIHsKLQkJaW5vZGUtPmlfY3RpbWUgPSBpYXR0ci0+aWFfY3RpbWU7Ci0JCWlwLT5pX2QuZGlfY3RpbWUudF9zZWMgPSBpYXR0ci0+aWFfY3RpbWUudHZfc2VjOwotCQlpcC0+aV9kLmRpX2N0aW1lLnRfbnNlYyA9IGlhdHRyLT5pYV9jdGltZS50dl9uc2VjOwotCQlpcC0+aV91cGRhdGVfY29yZSA9IDE7Ci0JfQotCWlmIChtYXNrICYgQVRUUl9NVElNRSkgewotCQlpbm9kZS0+aV9tdGltZSA9IGlhdHRyLT5pYV9tdGltZTsKLQkJaXAtPmlfZC5kaV9tdGltZS50X3NlYyA9IGlhdHRyLT5pYV9tdGltZS50dl9zZWM7Ci0JCWlwLT5pX2QuZGlfbXRpbWUudF9uc2VjID0gaWF0dHItPmlhX210aW1lLnR2X25zZWM7Ci0JCWlwLT5pX3VwZGF0ZV9jb3JlID0gMTsKLQl9Ci0KLQkvKgotCSAqIEFuZCBmaW5hbGx5LCBsb2cgdGhlIGlub2RlIGNvcmUgaWYgYW55IGF0dHJpYnV0ZSBpbiBpdAotCSAqIGhhcyBiZWVuIGNoYW5nZWQuCi0JICovCi0JaWYgKG1hc2sgJiAoQVRUUl9VSUR8QVRUUl9HSUR8QVRUUl9NT0RFfAotCQkgICAgQVRUUl9BVElNRXxBVFRSX0NUSU1FfEFUVFJfTVRJTUUpKQotCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7Ci0KLQlYRlNfU1RBVFNfSU5DKHhzX2lnX2F0dHJjaGcpOwotCi0JLyoKLQkgKiBJZiB0aGlzIGlzIGEgc3luY2hyb25vdXMgbW91bnQsIG1ha2Ugc3VyZSB0aGF0IHRoZQotCSAqIHRyYW5zYWN0aW9uIGdvZXMgdG8gZGlzayBiZWZvcmUgcmV0dXJuaW5nIHRvIHRoZSB1c2VyLgotCSAqIFRoaXMgaXMgc2xpZ2h0bHkgc3ViLW9wdGltYWwgaW4gdGhhdCB0cnVuY2F0ZXMgcmVxdWlyZQotCSAqIHR3byBzeW5jIHRyYW5zYWN0aW9ucyBpbnN0ZWFkIG9mIG9uZSBmb3Igd3N5bmMgZmlsZXN5c3RlbXMuCi0JICogT25lIGZvciB0aGUgdHJ1bmNhdGUgYW5kIG9uZSBmb3IgdGhlIHRpbWVzdGFtcHMgc2luY2Ugd2UKLQkgKiBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgdGltZXN0YW1wcyB1bmxlc3Mgd2UncmUgc3VyZSB0aGUKLQkgKiB0cnVuY2F0ZSB3b3JrZWQuICBUcnVuY2F0ZXMgYXJlIGxlc3MgdGhhbiAxJSBvZiB0aGUgbGFkZGlzCi0JICogbWl4IHNvIHRoaXMgcHJvYmFibHkgaXNuJ3Qgd29ydGggdGhlIHRyb3VibGUgdG8gb3B0aW1pemUuCi0JICovCi0JY29kZSA9IDA7Ci0JaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKQotCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOwotCi0JY29kZSA9IHhmc190cmFuc19jb21taXQodHAsIGNvbW1pdF9mbGFncyk7Ci0KLQl4ZnNfaXVubG9jayhpcCwgbG9ja19mbGFncyk7Ci0KLQkvKgotCSAqIFJlbGVhc2UgYW55IGRxdW90KHMpIHRoZSBpbm9kZSBoYWQga2VwdCBiZWZvcmUgY2hvd24uCi0JICovCi0JeGZzX3FtX2RxcmVsZShvbGRkcXVvdDEpOwotCXhmc19xbV9kcXJlbGUob2xkZHF1b3QyKTsKLQl4ZnNfcW1fZHFyZWxlKHVkcXApOwotCXhmc19xbV9kcXJlbGUoZ2RxcCk7Ci0KLQlpZiAoY29kZSkKLQkJcmV0dXJuIGNvZGU7Ci0KLQkvKgotCSAqIFhYWChoY2gpOiBVcGRhdGluZyB0aGUgQUNMIGVudHJpZXMgaXMgbm90IGF0b21pYyB2cyB0aGUgaV9tb2RlCi0JICogCSAgICAgdXBkYXRlLiAgV2UgY291bGQgYXZvaWQgdGhpcyB3aXRoIGxpbmtlZCB0cmFuc2FjdGlvbnMKLQkgKiAJICAgICBhbmQgcGFzc2luZyBkb3duIHRoZSB0cmFuc2FjdGlvbiBwb2ludGVyIGFsbCB0aGUgd2F5Ci0JICoJICAgICB0byBhdHRyX3NldC4gIE5vIHByZXZpb3VzIHVzZXIgb2YgdGhlIGdlbmVyaWMKLQkgKiAJICAgICBQb3NpeCBBQ0wgY29kZSBzZWVtcyB0byBjYXJlIGFib3V0IHRoaXMgaXNzdWUgZWl0aGVyLgotCSAqLwotCWlmICgobWFzayAmIEFUVFJfTU9ERSkgJiYgIShmbGFncyAmIFhGU19BVFRSX05PQUNMKSkgewotCQljb2RlID0gLXhmc19hY2xfY2htb2QoaW5vZGUpOwotCQlpZiAoY29kZSkKLQkJCXJldHVybiBYRlNfRVJST1IoY29kZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLSBhYm9ydF9yZXR1cm46Ci0JY29tbWl0X2ZsYWdzIHw9IFhGU19UUkFOU19BQk9SVDsKLSBlcnJvcl9yZXR1cm46Ci0JeGZzX3FtX2RxcmVsZSh1ZHFwKTsKLQl4ZnNfcW1fZHFyZWxlKGdkcXApOwotCWlmICh0cCkgewotCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjb21taXRfZmxhZ3MpOwotCX0KLQlpZiAobG9ja19mbGFncyAhPSAwKSB7Ci0JCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKLQl9Ci0JcmV0dXJuIGNvZGU7Ci19Ci0KIC8qCiAgKiBUaGUgbWF4aW11bSBwYXRobGVuIGlzIDEwMjQgYnl0ZXMuIFNpbmNlIHRoZSBtaW5pbXVtIGZpbGUgc3lzdGVtCiAgKiBibG9ja3NpemUgaXMgNTEyIGJ5dGVzLCB3ZSBjYW4gZ2V0IGEgbWF4IG9mIDIgZXh0ZW50cyBiYWNrIGZyb20KQEAgLTYyMSwxMyArMTk3LDYgQEAKIAkJICovCiAJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfSU5BQ1RJVkUpOwogCi0JCS8qCi0JCSAqIERvIHRoZSB4ZnNfaXRydW5jYXRlX3N0YXJ0KCkgY2FsbCBiZWZvcmUKLQkJICogcmVzZXJ2aW5nIGFueSBsb2cgc3BhY2UgYmVjYXVzZQotCQkgKiBpdHJ1bmNhdGVfc3RhcnQgd2lsbCBjYWxsIGludG8gdGhlIGJ1ZmZlcgotCQkgKiBjYWNoZSBhbmQgd2UgY2FuJ3QKLQkJICogZG8gdGhhdCB3aXRoaW4gYSB0cmFuc2FjdGlvbi4KLQkJICovCiAJCWlmIChmbGFncyAmIFhGU19GUkVFX0VPRl9UUllMT0NLKSB7CiAJCQlpZiAoIXhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JT0xPQ0tfRVhDTCkpIHsKIAkJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKQEAgLTYzNiwxMyArMjA1LDYgQEAKIAkJfSBlbHNlIHsKIAkJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKIAkJfQotCQllcnJvciA9IHhmc19pdHJ1bmNhdGVfc3RhcnQoaXAsIFhGU19JVFJVTkNfREVGSU5JVEUsCi0JCQkJICAgIGlwLT5pX3NpemUpOwotCQlpZiAoZXJyb3IpIHsKLQkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOwotCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KIAogCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAogCQkJCQkgIFhGU19JVFJVTkNBVEVfTE9HX1JFUyhtcCksCkBAIC02NTgsMTUgKzIyMCwxMiBAQAogCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKIAkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CiAKLQkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgmdHAsIGlwLAotCQkJCQkgICAgIGlwLT5pX3NpemUsCi0JCQkJCSAgICAgWEZTX0RBVEFfRk9SSywKLQkJCQkJICAgICAwKTsKLQkJLyoKLQkJICogSWYgd2UgZ2V0IGFuIGVycm9yIGF0IHRoaXMgcG9pbnQgd2UKLQkJICogc2ltcGx5IGRvbid0IGJvdGhlciB0cnVuY2F0aW5nIHRoZSBmaWxlLgotCQkgKi8KKwkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2RhdGEoJnRwLCBpcCwgaXAtPmlfc2l6ZSk7CiAJCWlmIChlcnJvcikgeworCQkJLyoKKwkJCSAqIElmIHdlIGdldCBhbiBlcnJvciBhdCB0aGlzIHBvaW50IHdlIHNpbXBseSBkb24ndAorCQkJICogYm90aGVyIHRydW5jYXRpbmcgdGhlIGZpbGUuCisJCQkgKi8KIAkJCXhmc190cmFuc19jYW5jZWwodHAsCiAJCQkJCSAoWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8CiAJCQkJCSAgWEZTX1RSQU5TX0FCT1JUKSk7CkBAIC05NjAsOCArNTE5LDExIEBACiAJCSAqIGJlIGV4cG9zZWQgdG8gdGhhdCBwcm9ibGVtLgogCQkgKi8KIAkJdHJ1bmNhdGVkID0geGZzX2lmbGFnc190ZXN0X2FuZF9jbGVhcihpcCwgWEZTX0lUUlVOQ0FURUQpOwotCQlpZiAodHJ1bmNhdGVkICYmIFZOX0RJUlRZKFZGU19JKGlwKSkgJiYgaXAtPmlfZGVsYXllZF9ibGtzID4gMCkKLQkJCXhmc19mbHVzaF9wYWdlcyhpcCwgMCwgLTEsIFhCRl9BU1lOQywgRklfTk9ORSk7CisJCWlmICh0cnVuY2F0ZWQpIHsKKwkJCXhmc19pZmxhZ3NfY2xlYXIoaXAsIFhGU19JRElSVFlfUkVMRUFTRSk7CisJCQlpZiAoVk5fRElSVFkoVkZTX0koaXApKSAmJiBpcC0+aV9kZWxheWVkX2Jsa3MgPiAwKQorCQkJCXhmc19mbHVzaF9wYWdlcyhpcCwgMCwgLTEsIFhCRl9BU1lOQywgRklfTk9ORSk7CisJCX0KIAl9CiAKIAlpZiAoaXAtPmlfZC5kaV9ubGluayA9PSAwKQpAQCAtMTA4MSwyMCArNjQzLDkgQEAKIAogCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfSU5BQ1RJVkUpOwogCWlmICh0cnVuY2F0ZSkgewotCQkvKgotCQkgKiBEbyB0aGUgeGZzX2l0cnVuY2F0ZV9zdGFydCgpIGNhbGwgYmVmb3JlCi0JCSAqIHJlc2VydmluZyBhbnkgbG9nIHNwYWNlIGJlY2F1c2UgaXRydW5jYXRlX3N0YXJ0Ci0JCSAqIHdpbGwgY2FsbCBpbnRvIHRoZSBidWZmZXIgY2FjaGUgYW5kIHdlIGNhbid0Ci0JCSAqIGRvIHRoYXQgd2l0aGluIGEgdHJhbnNhY3Rpb24uCi0JCSAqLwogCQl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CiAKLQkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX3N0YXJ0KGlwLCBYRlNfSVRSVU5DX0RFRklOSVRFLCAwKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKLQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOwotCQkJcmV0dXJuIFZOX0lOQUNUSVZFX0NBQ0hFOwotCQl9CisJCXhmc19pb2VuZF93YWl0KGlwKTsKIAogCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAogCQkJCQkgIFhGU19JVFJVTkNBVEVfTE9HX1JFUyhtcCksCkBAIC0xMTExLDE2ICs2NjIsNyBAQAogCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKIAkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CiAKLQkJLyoKLQkJICogbm9ybWFsbHksIHdlIGhhdmUgdG8gcnVuIHhmc19pdHJ1bmNhdGVfZmluaXNoIHN5bmMuCi0JCSAqIEJ1dCBpZiBmaWxlc3lzdGVtIGlzIHdzeW5jIGFuZCB3ZSdyZSBpbiB0aGUgaW5hY3RpdmUKLQkJICogcGF0aCwgdGhlbiB3ZSBrbm93IHRoYXQgbmxpbmsgPT0gMCwgYW5kIHRoYXQgdGhlCi0JCSAqIHhhY3Rpb24gdGhhdCBtYWRlIG5saW5rID09IDAgaXMgcGVybWFuZW50bHkgY29tbWl0dGVkCi0JCSAqIHNpbmNlIHhmc19yZW1vdmUgcnVucyBhcyBhIHN5bmNocm9ub3VzIHRyYW5zYWN0aW9uLgotCQkgKi8KLQkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgmdHAsIGlwLCAwLCBYRlNfREFUQV9GT1JLLAotCQkJCSghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSA/IDEgOiAwKSk7Ci0KKwkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2RhdGEoJnRwLCBpcCwgMCk7CiAJCWlmIChlcnJvcikgewogCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwKIAkJCQlYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwgWEZTX1RSQU5TX0FCT1JUKTsKQEAgLTI0MjcsNiArMTk2OSw4IEBACiAJaWYgKCFicCkKIAkJcmV0dXJuIFhGU19FUlJPUihFTk9NRU0pOwogCisJeGZzX2J1Zl91bmxvY2soYnApOworCiAJZm9yIChvZmZzZXQgPSBzdGFydG9mZjsgb2Zmc2V0IDw9IGVuZG9mZjsgb2Zmc2V0ID0gbGFzdG9mZnNldCArIDEpIHsKIAkJb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CiAJCW5pbWFwID0gMTsKQEAgLTI3ODEsNyArMjMyNSw3IEBACiAJCWlhdHRyLmlhX3ZhbGlkID0gQVRUUl9TSVpFOwogCQlpYXR0ci5pYV9zaXplID0gc3RhcnRvZmZzZXQ7CiAKLQkJZXJyb3IgPSB4ZnNfc2V0YXR0cihpcCwgJmlhdHRyLCBhdHRyX2ZsYWdzKTsKKwkJZXJyb3IgPSB4ZnNfc2V0YXR0cl9zaXplKGlwLCAmaWF0dHIsIGF0dHJfZmxhZ3MpOwogCiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuaCBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuaAppbmRleCAzYmNkMjMzLi4zNWQzZDUxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmgKKysrIGIvZnMveGZzL3hmc192bm9kZW9wcy5oCkBAIC0xMyw3ICsxMyw4IEBACiBzdHJ1Y3QgeGZzX2lvbWFwOwogCiAKLWludCB4ZnNfc2V0YXR0cihzdHJ1Y3QgeGZzX2lub2RlICppcCwgc3RydWN0IGlhdHRyICp2YXAsIGludCBmbGFncyk7CitpbnQgeGZzX3NldGF0dHJfbm9uc2l6ZShzdHJ1Y3QgeGZzX2lub2RlICppcCwgc3RydWN0IGlhdHRyICp2YXAsIGludCBmbGFncyk7CitpbnQgeGZzX3NldGF0dHJfc2l6ZShzdHJ1Y3QgeGZzX2lub2RlICppcCwgc3RydWN0IGlhdHRyICp2YXAsIGludCBmbGFncyk7CiAjZGVmaW5lCVhGU19BVFRSX0RNSQkJMHgwMQkvKiBpbnZvY2F0aW9uIGZyb20gYSBETUkgZnVuY3Rpb24gKi8KICNkZWZpbmUJWEZTX0FUVFJfTk9OQkxPQ0sJMHgwMgkvKiByZXR1cm4gRUFHQUlOIGlmIG9wZXJhdGlvbiB3b3VsZCBibG9jayAqLwogI2RlZmluZSBYRlNfQVRUUl9OT0xPQ0sJCTB4MDQJLyogRG9uJ3QgZ3JhYiBhbnkgY29uZmxpY3RpbmcgbG9ja3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKaW5kZXggM2ExMGVmNS4uNmNkNWI2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKQEAgLTIxMCw3ICsyMTAsNyBAQAogc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyIHsKIAlpbnQgc3RhdGU7CQkvKiBDdXJyZW50IHN0YXRlICovCiAJc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyX2ZsYWdzIGZsYWdzOwotCXN0cnVjdCBhY3BpX2RldmljZV9wb3dlcl9zdGF0ZSBzdGF0ZXNbNF07CS8qIFBvd2VyIHN0YXRlcyAoRDAtRDMpICovCisJc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyX3N0YXRlIHN0YXRlc1tBQ1BJX0RfU1RBVEVfQ09VTlRdOwkvKiBQb3dlciBzdGF0ZXMgKEQwLUQzQ29sZCkgKi8KIH07CiAKIC8qIFBlcmZvcm1hbmNlIE1hbmFnZW1lbnQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKaW5kZXggYTc1NmJjOC4uNDU0M2I2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKQEAgLTk4LDggKzk4LDExIEBACiAvKgogICogU3BpbmxvY2sgcHJpbWl0aXZlcwogICovCisKKyNpZm5kZWYgYWNwaV9vc19jcmVhdGVfbG9jawogYWNwaV9zdGF0dXMKIGFjcGlfb3NfY3JlYXRlX2xvY2soYWNwaV9zcGlubG9jayAqb3V0X2hhbmRsZSk7CisjZW5kaWYKIAogdm9pZCBhY3BpX29zX2RlbGV0ZV9sb2NrKGFjcGlfc3BpbmxvY2sgaGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKaW5kZXggNWQyYTVlOS4uMmNlMWJlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCkBAIC0xNTksNiArMTU5LDI0IEBACiAJfSB3aGlsZSAoMCkKICNlbmRpZgogCisvKgorICogV2hlbiBsb2NrZGVwIGlzIGVuYWJsZWQsIHRoZSBzcGluX2xvY2tfaW5pdCgpIG1hY3JvIHN0cmluZ2lmaWVzIGl0J3MKKyAqIGFyZ3VtZW50IGFuZCB1c2VzIHRoYXQgYXMgYSBuYW1lIGZvciB0aGUgbG9jayBpbiBkZWJ1Z2dpbmcuCisgKiBCeSBleGVjdXRpbmcgc3Bpbl9sb2NrX2luaXQoKSBpbiBhIG1hY3JvIHRoZSBrZXkgY2hhbmdlcyBmcm9tICJsb2NrIiBmb3IKKyAqIGFsbCBsb2NrcyB0byB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgb2YgYWNwaV9vc19jcmVhdGVfbG9jaygpLCB3aGljaAorICogcHJldmVudHMgbG9ja2RlcCBmcm9tIHJlcG9ydGluZyBmYWxzZSBwb3NpdGl2ZXMgZm9yIEFDUElDQSBsb2Nrcy4KKyAqLworI2RlZmluZSBhY3BpX29zX2NyZWF0ZV9sb2NrKF9faGFuZGxlKQkJCQlcCisoewkJCQkJCQkJXAorCXNwaW5sb2NrX3QgKmxvY2sgPSBBQ1BJX0FMTE9DQVRFKHNpemVvZigqbG9jaykpOwlcCisJCQkJCQkJCVwKKwlpZiAobG9jaykgewkJCQkJCVwKKwkJKihfX2hhbmRsZSkgPSBsb2NrOwkJCQlcCisJCXNwaW5fbG9ja19pbml0KCooX19oYW5kbGUpKTsJCQlcCisJfQkJCQkJCQlcCisJbG9jayA/IEFFX09LIDogQUVfTk9fTUVNT1JZOwkJCQlcCit9KQorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX19BQ0xJTlVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9kZWxheS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9kZWxheS5oCmluZGV4IDQ1ODZmZWMuLjBmNzkwNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZGVsYXkuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2RlbGF5LmgKQEAgLTEsOSArMSw0NCBAQAogI2lmbmRlZiBfX0FTTV9HRU5FUklDX0RFTEFZX0gKICNkZWZpbmUgX19BU01fR0VORVJJQ19ERUxBWV9ICiAKKy8qIFVuZGVmaW5lZCBmdW5jdGlvbnMgdG8gZ2V0IGNvbXBpbGUtdGltZSBlcnJvcnMgKi8KK2V4dGVybiB2b2lkIF9fYmFkX3VkZWxheSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fYmFkX25kZWxheSh2b2lkKTsKKwogZXh0ZXJuIHZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CitleHRlcm4gdm9pZCBfX25kZWxheSh1bnNpZ25lZCBsb25nIG5zZWNzKTsKK2V4dGVybiB2b2lkIF9fY29uc3RfdWRlbGF5KHVuc2lnbmVkIGxvbmcgeGxvb3BzKTsKIGV4dGVybiB2b2lkIF9fZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcyk7CiAKLSNkZWZpbmUgdWRlbGF5KG4pIF9fdWRlbGF5KG4pCisvKgorICogVGhlIHdlaXJkIG4vMjAwMDAgdGhpbmcgc3VwcHJlc3NlcyBhICJjb21wYXJpc29uIGlzIGFsd2F5cyBmYWxzZSBkdWUgdG8KKyAqIGxpbWl0ZWQgcmFuZ2Ugb2YgZGF0YSB0eXBlIiB3YXJuaW5nIHdpdGggbm9uLWNvbnN0IDgtYml0IGFyZ3VtZW50cy4KKyAqLworCisvKiAweDEwYzcgaXMgMioqMzIgLyAxMDAwMDAwIChyb3VuZGVkIHVwKSAqLworI2RlZmluZSB1ZGVsYXkobikJCQkJCQkJXAorCSh7CQkJCQkJCQlcCisJCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkgewkJCQlcCisJCQlpZiAoKG4pIC8gMjAwMDAgPj0gMSkJCQkJXAorCQkJCSBfX2JhZF91ZGVsYXkoKTsJCQlcCisJCQllbHNlCQkJCQkJXAorCQkJCV9fY29uc3RfdWRlbGF5KChuKSAqIDB4MTBjN3VsKTsJCVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlfX3VkZWxheShuKTsJCQkJCVwKKwkJfQkJCQkJCQlcCisJfSkKKworLyogMHg1IGlzIDIqKjMyIC8gMTAwMDAwMDAwMCAocm91bmRlZCB1cCkgKi8KKyNkZWZpbmUgbmRlbGF5KG4pCQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpIHsJCQkJXAorCQkJaWYgKChuKSAvIDIwMDAwID49IDEpCQkJCVwKKwkJCQlfX2JhZF9uZGVsYXkoKTsJCQkJXAorCQkJZWxzZQkJCQkJCVwKKwkJCQlfX2NvbnN0X3VkZWxheSgobikgKiA1dWwpOwkJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCV9fbmRlbGF5KG4pOwkJCQkJXAorCQl9CQkJCQkJCVwKKwl9KQogCiAjZW5kaWYgLyogX19BU01fR0VORVJJQ19ERUxBWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZ3Bpby5oCmluZGV4IGZjZGNiNWQuLmQ0OTQwMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZ3Bpby5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZ3Bpby5oCkBAIC0xNzAsMTYgKzE3MCw2IEBACiAKIGV4dGVybiBpbnQgX19ncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKTsKIAotI2RlZmluZSBHUElPRl9ESVJfT1VUCSgwIDw8IDApCi0jZGVmaW5lIEdQSU9GX0RJUl9JTgkoMSA8PCAwKQotCi0jZGVmaW5lIEdQSU9GX0lOSVRfTE9XCSgwIDw8IDEpCi0jZGVmaW5lIEdQSU9GX0lOSVRfSElHSAkoMSA8PCAxKQotCi0jZGVmaW5lIEdQSU9GX0lOCQkoR1BJT0ZfRElSX0lOKQotI2RlZmluZSBHUElPRl9PVVRfSU5JVF9MT1cJKEdQSU9GX0RJUl9PVVQgfCBHUElPRl9JTklUX0xPVykKLSNkZWZpbmUgR1BJT0ZfT1VUX0lOSVRfSElHSAkoR1BJT0ZfRElSX09VVCB8IEdQSU9GX0lOSVRfSElHSCkKLQogLyoqCiAgKiBzdHJ1Y3QgZ3BpbyAtIGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgYSBHUElPIHdpdGggY29uZmlndXJhdGlvbgogICogQGdwaW86CXRoZSBHUElPIG51bWJlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9pby5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9pby5oCmluZGV4IGUwZmZhM2QuLjkxMjA4ODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2lvLmgKQEAgLTMwNyw3ICszMDcsMTEgQEAKIAogLyoKICAqIENoYW5nZSAic3RydWN0IHBhZ2UiIHRvIHBoeXNpY2FsIGFkZHJlc3MuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBmb3IgdGhlIG5vLU1NVSBjYXNlIG9ubHkuLi4gaWYgeW91IGhhdmUgYW4gTU1VCisgKiB5b3UnbGwgbmVlZCB0byBwcm92aWRlIHlvdXIgb3duIGRlZmluaXRpb25zLgogICovCisjaWZuZGVmIENPTkZJR19NTVUKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICppb3JlbWFwKHBoeXNfYWRkcl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiAodm9pZCBfX2lvbWVtKikgKHVuc2lnbmVkIGxvbmcpb2Zmc2V0OwpAQCAtMzI2LDcgKzMzMCw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaW91bm1hcCh2b2lkICphZGRyKQogewogfQorI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KIAorI2lmZGVmIENPTkZJR19IQVNfSU9QT1JUCiAjaWZuZGVmIENPTkZJR19HRU5FUklDX0lPTUFQCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBucikKIHsKQEAgLTM0MCw5ICszNDYsMTAgQEAKIGV4dGVybiB2b2lkIF9faW9tZW0gKmlvcG9ydF9tYXAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBpbnQgbnIpOwogZXh0ZXJuIHZvaWQgaW9wb3J0X3VubWFwKHZvaWQgX19pb21lbSAqcCk7CiAjZW5kaWYgLyogQ09ORklHX0dFTkVSSUNfSU9NQVAgKi8KKyNlbmRpZiAvKiBDT05GSUdfSEFTX0lPUE9SVCAqLwogCiAjZGVmaW5lIHhsYXRlX2Rldl9rbWVtX3B0cihwKQlwCi0jZGVmaW5lIHhsYXRlX2Rldl9tZW1fcHRyKHApCSgodm9pZCAqKSAocCkpCisjZGVmaW5lIHhsYXRlX2Rldl9tZW1fcHRyKHApCV9fdmEocCkKIAogI2lmbmRlZiB2aXJ0X3RvX2J1cwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZpcnRfdG9fYnVzKHZvbGF0aWxlIHZvaWQgKmFkZHJlc3MpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2lvbWFwLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2lvbWFwLmgKaW5kZXggNzZiMGNjNS4uOThkY2Q3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9pb21hcC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW9tYXAuaApAQCAtNTYsMTcgKzU2LDI5IEBACiBleHRlcm4gdm9pZCBpb3dyaXRlMTZfcmVwKHZvaWQgX19pb21lbSAqcG9ydCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiB2b2lkIGlvd3JpdGUzMl9yZXAodm9pZCBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogCisjaWZkZWYgQ09ORklHX0hBU19JT1BPUlQKIC8qIENyZWF0ZSBhIHZpcnR1YWwgbWFwcGluZyBjb29raWUgZm9yIGFuIElPIHBvcnQgcmFuZ2UgKi8KIGV4dGVybiB2b2lkIF9faW9tZW0gKmlvcG9ydF9tYXAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBpbnQgbnIpOwogZXh0ZXJuIHZvaWQgaW9wb3J0X3VubWFwKHZvaWQgX19pb21lbSAqKTsKKyNlbmRpZgogCiAjaWZuZGVmIEFSQ0hfSEFTX0lPUkVNQVBfV0MKICNkZWZpbmUgaW9yZW1hcF93YyBpb3JlbWFwX25vY2FjaGUKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BDSQogLyogQ3JlYXRlIGEgdmlydHVhbCBtYXBwaW5nIGNvb2tpZSBmb3IgYSBQQ0kgQkFSIChtZW1vcnkgb3IgSU8pICovCiBzdHJ1Y3QgcGNpX2RldjsKIGV4dGVybiB2b2lkIF9faW9tZW0gKnBjaV9pb21hcChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLCB1bnNpZ25lZCBsb25nIG1heCk7CiBleHRlcm4gdm9pZCBwY2lfaW91bm1hcChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkIF9faW9tZW0gKik7CisjZWxzZQorc3RydWN0IHBjaV9kZXY7CitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqcGNpX2lvbWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsIHVuc2lnbmVkIGxvbmcgbWF4KQoreworCXJldHVybiBOVUxMOworfQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9pb3VubWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgX19pb21lbSAqYWRkcikKK3sgfQorI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAppbmRleCBlOWI4ZTU5Li43NmJmZjJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaApAQCAtODgsNyArODgsNyBAQAogCXBtZF90IHBtZCA9ICpwbWRwOwogCXBtZF9jbGVhcihtbSwgYWRkcmVzcywgcG1kcCk7CiAJcmV0dXJuIHBtZDsKLX0pCit9CiAjZW5kaWYgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3lzdGVtLmgKaW5kZXggNGIwYjljYi4uMjE1ZWZhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3N5c3RlbS5oCkBAIC0xNCw3ICsxNCw2IEBACiAjaWZuZGVmIF9fQVNNX0dFTkVSSUNfU1lTVEVNX0gKICNkZWZpbmUgX19BU01fR0VORVJJQ19TWVNURU1fSAogCi0jaWZkZWYgX19LRVJORUxfXwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xMzksNSArMTM4LDQgQEAKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX1NZU1RFTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NyeXB0by9pZl9hbGcuaCBiL2luY2x1ZGUvY3J5cHRvL2lmX2FsZy5oCmluZGV4IGM1ODEzYzguLmQ2MWMxMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY3J5cHRvL2lmX2FsZy5oCisrKyBiL2luY2x1ZGUvY3J5cHRvL2lmX2FsZy5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYWxnLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmggYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCmluZGV4IDk1NzNlMGMuLjMzZDEyZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGMuaApAQCAtNTIwLDYgKzUyMCw4IEBACiAJdWludDMyX3QgZW5jb2Rlcl9pZHNbRFJNX0NPTk5FQ1RPUl9NQVhfRU5DT0RFUl07CiAJdWludDMyX3QgZm9yY2VfZW5jb2Rlcl9pZDsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7IC8qIGN1cnJlbnRseSBhY3RpdmUgZW5jb2RlciAqLworCisJaW50IG51bGxfZWRpZF9jb3VudGVyOyAvKiBuZWVkZWQgdG8gd29ya2Fyb3VuZCBzb21lIEhXIGJ1Z3Mgd2hlcmUgd2UgZ2V0IGFsbCAwcyAqLwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmggYi9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmgKaW5kZXggZjA0YjJhMy4uM2Q1M2VmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX3BjaWlkcy5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaApAQCAtMTgyLDYgKzE4Miw3IEBACiAJezB4MTAwMiwgMHg2NzUwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc1OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzVGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc2MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc2MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCkBAIC0xOTIsNiArMTkzLDcgQEAKIAl7MHgxMDAyLCAweDY3NjcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2NzcwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc3OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODgwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njg4OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DWVBSRVNTfFJBREVPTl9ORVdfTUVNTUFQfSwgXApAQCAtNDY3LDYgKzQ2OSwxNyBAQAogCXsweDEwMDIsIDB4OTYxNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzc4MHxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAogCXsweDEwMDIsIDB4OTYxNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzc4MHxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAogCXsweDEwMDIsIDB4OTYxNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzc4MHxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTY0MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5NjQxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU98UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5NjQyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU8yfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5NjQzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU8yfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTY0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PMnxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTY0NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PMnxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDk2NDcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfU1VNT3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sXAorCXsweDEwMDIsIDB4OTY0OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSxcCisJezB4MTAwMiwgMHg5NjRhLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU98UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDk2NGUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfU1VNT3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sXAorCXsweDEwMDIsIDB4OTY0ZiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSxcCiAJezB4MTAwMiwgMHg5NzEwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTODgwfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCiAJezB4MTAwMiwgMHg5NzExLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTODgwfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCiAJezB4MTAwMiwgMHg5NzEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTODgwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCAwMWY2MzYyLi42MTliNTY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L0tidWlsZApAQCAtMTM1LDYgKzEzNSw3IEBACiBoZWFkZXIteSArPSBmaXJld2lyZS1jb25zdGFudHMuaAogaGVhZGVyLXkgKz0gZmxhdC5oCiBoZWFkZXIteSArPSBmcy5oCitoZWFkZXIteSArPSBmc2xfaHlwZXJ2aXNvci5oCiBoZWFkZXIteSArPSBmdXNlLmgKIGhlYWRlci15ICs9IGZ1dGV4LmgKIGhlYWRlci15ICs9IGdhbWVwb3J0LmgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdS5oIGIvaW5jbHVkZS9saW51eC9hbWQtaW9tbXUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11LmgKcmVuYW1lIHRvIGluY2x1ZGUvbGludXgvYW1kLWlvbW11LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYW5vbl9pbm9kZXMuaCBiL2luY2x1ZGUvbGludXgvYW5vbl9pbm9kZXMuaAppbmRleCA2OWEyMWUwLi44MDEzYTQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Fub25faW5vZGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9hbm9uX2lub2Rlcy5oCkBAIC04LDYgKzgsOCBAQAogI2lmbmRlZiBfTElOVVhfQU5PTl9JTk9ERVNfSAogI2RlZmluZSBfTElOVVhfQU5PTl9JTk9ERVNfSAogCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zOworCiBzdHJ1Y3QgZmlsZSAqYW5vbl9pbm9kZV9nZXRmaWxlKGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywKIAkJCQl2b2lkICpwcml2LCBpbnQgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hcmNkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvYXJjZGV2aWNlLmgKaW5kZXggN2Q2NTBhMC4uNzIxNmIwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hcmNkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FyY2RldmljZS5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJjbmV0Lmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSAgPGxpbnV4L2lycXJldHVybi5oPgogCiAjaWZuZGVmIGJvb2wKICNkZWZpbmUgYm9vbCBpbnQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRoOWtfcGxhdGZvcm0uaCBiL2luY2x1ZGUvbGludXgvYXRoOWtfcGxhdGZvcm0uaAppbmRleCA2MGE3YzQ5Li42ZTNmNTRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0aDlrX3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdGg5a19wbGF0Zm9ybS5oCkBAIC0zMCw2ICszMCw4IEBACiAJdTMyIGdwaW9fdmFsOwogCiAJYm9vbCBpc19jbGtfMjVtaHo7CisJaW50ICgqZ2V0X21hY19yZXZpc2lvbikodm9pZCk7CisJaW50ICgqZXh0ZXJuYWxfcmVzZXQpKHZvaWQpOwogfTsKIAogI2VuZGlmIC8qIF9MSU5VWF9BVEg5S19QTEFURk9STV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0b21pYy5oIGIvaW5jbHVkZS9saW51eC9hdG9taWMuaAppbmRleCBlZTQ1NmM3Li5iYzY2MTVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0b21pYy5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRvbWljLmgKQEAgLTM0LDYgKzM0LDMyIEBACiB9CiAjZW5kaWYKIAorI2lmbmRlZiBhdG9taWNfaW5jX3VubGVzc19uZWdhdGl2ZQorc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2luY191bmxlc3NfbmVnYXRpdmUoYXRvbWljX3QgKnApCit7CisJaW50IHYsIHYxOworCWZvciAodiA9IDA7IHYgPj0gMDsgdiA9IHYxKSB7CisJCXYxID0gYXRvbWljX2NtcHhjaGcocCwgdiwgdiArIDEpOworCQlpZiAobGlrZWx5KHYxID09IHYpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZm5kZWYgYXRvbWljX2RlY191bmxlc3NfcG9zaXRpdmUKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19kZWNfdW5sZXNzX3Bvc2l0aXZlKGF0b21pY190ICpwKQoreworCWludCB2LCB2MTsKKwlmb3IgKHYgPSAwOyB2IDw9IDA7IHYgPSB2MSkgeworCQl2MSA9IGF0b21pY19jbXB4Y2hnKHAsIHYsIHYgLSAxKTsKKwkJaWYgKGxpa2VseSh2MSA9PSB2KSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiAjaWZuZGVmIENPTkZJR19BUkNIX0hBU19BVE9NSUNfT1IKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfb3IoaW50IGksIGF0b21pY190ICp2KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdWRpdC5oIGIvaW5jbHVkZS9saW51eC9hdWRpdC5oCmluZGV4IDlkMzM5ZWIuLjBjODAwNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXVkaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKQEAgLTYxMyw2ICs2MTMsMTIgQEAKIGV4dGVybiB2b2lkCQkgICAgYXVkaXRfbG9nX2tleShzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYiwKIAkJCQkJICBjaGFyICprZXkpOwogZXh0ZXJuIHZvaWQJCSAgICBhdWRpdF9sb2dfbG9zdChjb25zdCBjaGFyICptZXNzYWdlKTsKKyNpZmRlZiBDT05GSUdfU0VDVVJJVFkKK2V4dGVybiB2b2lkIAkJICAgIGF1ZGl0X2xvZ19zZWNjdHgoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIHUzMiBzZWNpZCk7CisjZWxzZQorI2RlZmluZSBhdWRpdF9sb2dfc2VjY3R4KGIscykgZG8geyA7IH0gd2hpbGUgKDApCisjZW5kaWYKKwogZXh0ZXJuIGludAkJICAgIGF1ZGl0X3VwZGF0ZV9sc21fcnVsZXModm9pZCk7CiAKIAkJCQkvKiBQcml2YXRlIEFQSSAoZm9yIGF1ZGl0LmMgb25seSkgKi8KQEAgLTYzNSw2ICs2NDEsNyBAQAogI2RlZmluZSBhdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKGEscykgZG8geyA7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGF1ZGl0X2xvZ19kX3BhdGgoYiwgcCwgZCkgZG8geyA7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGF1ZGl0X2xvZ19rZXkoYiwgaykgZG8geyA7IH0gd2hpbGUgKDApCisjZGVmaW5lIGF1ZGl0X2xvZ19zZWNjdHgoYixzKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRfZW5hYmxlZCAwCiAjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iYXNpY19tbWlvX2dwaW8uaCBiL2luY2x1ZGUvbGludXgvYmFzaWNfbW1pb19ncGlvLmgKaW5kZXggMWFlMTI3MS4uOTg5OTljZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iYXNpY19tbWlvX2dwaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jhc2ljX21taW9fZ3Bpby5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9ja190eXBlcy5oPgogCiBzdHJ1Y3QgYmdwaW9fcGRhdGEgewogCWludCBiYXNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaCBiL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmgKaW5kZXggMDg3NjNlNC4uOGM5NjY1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYS5oCkBAIC02LDYgKzYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hX2RyaXZlcl9jaGlwY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hX2RyaXZlcl9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+IC8qIFNQUk9NIHNoYXJpbmcgKi8KIAogI2luY2x1ZGUgImJjbWFfcmVncy5oIgogCkBAIC0yNCw2ICsyNSwxMSBAQAogCXU4IHBrZzsKIH07CiAKK2VudW0gYmNtYV9jbGttb2RlIHsKKwlCQ01BX0NMS01PREVfRkFTVCwKKwlCQ01BX0NMS01PREVfRFlOQU1JQywKK307CisKIHN0cnVjdCBiY21hX2hvc3Rfb3BzIHsKIAl1OCAoKnJlYWQ4KShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpOwogCXUxNiAoKnJlYWQxNikoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0KTsKQEAgLTMxLDYgKzM3LDEyIEBACiAJdm9pZCAoKndyaXRlOCkoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0LCB1OCB2YWx1ZSk7CiAJdm9pZCAoKndyaXRlMTYpKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCwgdTE2IHZhbHVlKTsKIAl2b2lkICgqd3JpdGUzMikoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0LCB1MzIgdmFsdWUpOworI2lmZGVmIENPTkZJR19CQ01BX0JMT0NLSU8KKwl2b2lkICgqYmxvY2tfcmVhZCkoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB2b2lkICpidWZmZXIsCisJCQkgICBzaXplX3QgY291bnQsIHUxNiBvZmZzZXQsIHU4IHJlZ193aWR0aCk7CisJdm9pZCAoKmJsb2NrX3dyaXRlKShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkJCSAgICBzaXplX3QgY291bnQsIHUxNiBvZmZzZXQsIHU4IHJlZ193aWR0aCk7CisjZW5kaWYKIAkvKiBBZ2VudCBvcHMgKi8KIAl1MzIgKCphcmVhZDMyKShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpOwogCXZvaWQgKCphd3JpdGUzMikoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0LCB1MzIgdmFsdWUpOwpAQCAtMTE3LDYgKzEyOSw4IEBACiAJc3RydWN0IGJjbWFfZGV2aWNlX2lkIGlkOwogCiAJc3RydWN0IGRldmljZSBkZXY7CisJc3RydWN0IGRldmljZSAqZG1hX2RldjsKKwl1bnNpZ25lZCBpbnQgaXJxOwogCWJvb2wgZGV2X3JlZ2lzdGVyZWQ7CiAKIAl1OCBjb3JlX2luZGV4OwpAQCAtMTc5LDYgKzE5MywxMCBAQAogCiAJc3RydWN0IGJjbWFfZHJ2X2NjIGRydl9jYzsKIAlzdHJ1Y3QgYmNtYV9kcnZfcGNpIGRydl9wY2k7CisKKwkvKiBXZSBkZWNpZGVkIHRvIHNoYXJlIFNQUk9NIHN0cnVjdCB3aXRoIFNTQiBhcyBsb25nIGFzIHdlIGRvIG5vdCBuZWVkCisJICogYW55IGhhY2tzIGZvciBCQ01BLiBUaGlzIHNpbXBsaWZpZXMgZHJpdmVycyBjb2RlLiAqLworCXN0cnVjdCBzc2Jfc3Byb20gc3Byb207CiB9OwogCiBleHRlcm4gaW5saW5lIHUzMiBiY21hX3JlYWQ4KHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKQEAgLTIwOCw2ICsyMjYsMTggQEAKIHsKIAljb3JlLT5idXMtPm9wcy0+d3JpdGUzMihjb3JlLCBvZmZzZXQsIHZhbHVlKTsKIH0KKyNpZmRlZiBDT05GSUdfQkNNQV9CTE9DS0lPCitleHRlcm4gaW5saW5lIHZvaWQgYmNtYV9ibG9ja19yZWFkKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdm9pZCAqYnVmZmVyLAorCQkJCSAgIHNpemVfdCBjb3VudCwgdTE2IG9mZnNldCwgdTggcmVnX3dpZHRoKQoreworCWNvcmUtPmJ1cy0+b3BzLT5ibG9ja19yZWFkKGNvcmUsIGJ1ZmZlciwgY291bnQsIG9mZnNldCwgcmVnX3dpZHRoKTsKK30KK2V4dGVybiBpbmxpbmUgdm9pZCBiY21hX2Jsb2NrX3dyaXRlKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAorCQkJCSAgICBzaXplX3QgY291bnQsIHUxNiBvZmZzZXQsIHU4IHJlZ193aWR0aCkKK3sKKwljb3JlLT5idXMtPm9wcy0+YmxvY2tfd3JpdGUoY29yZSwgYnVmZmVyLCBjb3VudCwgb2Zmc2V0LCByZWdfd2lkdGgpOworfQorI2VuZGlmCiBleHRlcm4gaW5saW5lIHUzMiBiY21hX2FyZWFkMzIoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0KQogewogCXJldHVybiBjb3JlLT5idXMtPm9wcy0+YXJlYWQzMihjb3JlLCBvZmZzZXQpOwpAQCAtMjE4LDcgKzI0OCwyNCBAQAogCWNvcmUtPmJ1cy0+b3BzLT5hd3JpdGUzMihjb3JlLCBvZmZzZXQsIHZhbHVlKTsKIH0KIAorI2RlZmluZSBiY21hX21hc2szMihjYywgb2Zmc2V0LCBtYXNrKSBcCisJYmNtYV93cml0ZTMyKGNjLCBvZmZzZXQsIGJjbWFfcmVhZDMyKGNjLCBvZmZzZXQpICYgKG1hc2spKQorI2RlZmluZSBiY21hX3NldDMyKGNjLCBvZmZzZXQsIHNldCkgXAorCWJjbWFfd3JpdGUzMihjYywgb2Zmc2V0LCBiY21hX3JlYWQzMihjYywgb2Zmc2V0KSB8IChzZXQpKQorI2RlZmluZSBiY21hX21hc2tzZXQzMihjYywgb2Zmc2V0LCBtYXNrLCBzZXQpIFwKKwliY21hX3dyaXRlMzIoY2MsIG9mZnNldCwgKGJjbWFfcmVhZDMyKGNjLCBvZmZzZXQpICYgKG1hc2spKSB8IChzZXQpKQorCiBleHRlcm4gYm9vbCBiY21hX2NvcmVfaXNfZW5hYmxlZChzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUpOworZXh0ZXJuIHZvaWQgYmNtYV9jb3JlX2Rpc2FibGUoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MzIgZmxhZ3MpOwogZXh0ZXJuIGludCBiY21hX2NvcmVfZW5hYmxlKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTMyIGZsYWdzKTsKK2V4dGVybiB2b2lkIGJjbWFfY29yZV9zZXRfY2xvY2ttb2RlKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwKKwkJCQkgICAgZW51bSBiY21hX2Nsa21vZGUgY2xrbW9kZSk7CitleHRlcm4gdm9pZCBiY21hX2NvcmVfcGxsX2N0bChzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUzMiByZXEsIHUzMiBzdGF0dXMsCisJCQkgICAgICBib29sIG9uKTsKKyNkZWZpbmUgQkNNQV9ETUFfVFJBTlNMQVRJT05fTUFTSwkweEMwMDAwMDAwCisjZGVmaW5lICBCQ01BX0RNQV9UUkFOU0xBVElPTl9OT05FCTB4MDAwMDAwMDAKKyNkZWZpbmUgIEJDTUFfRE1BX1RSQU5TTEFUSU9OX0RNQTMyX0NNVAkweDQwMDAwMDAwIC8qIENsaWVudCBNb2RlIFRyYW5zbGF0aW9uIGZvciAzMi1iaXQgRE1BICovCisjZGVmaW5lICBCQ01BX0RNQV9UUkFOU0xBVElPTl9ETUE2NF9DTVQJMHg4MDAwMDAwMCAvKiBDbGllbnQgTW9kZSBUcmFuc2xhdGlvbiBmb3IgNjQtYml0IERNQSAqLworZXh0ZXJuIHUzMiBiY21hX2NvcmVfZG1hX3RyYW5zbGF0aW9uKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSk7CiAKICNlbmRpZiAvKiBMSU5VWF9CQ01BX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfY2hpcGNvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX2NoaXBjb21tb24uaAppbmRleCAwODNjM2I2Li5hMGY2ODQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfY2hpcGNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX2RyaXZlcl9jaGlwY29tbW9uLmgKQEAgLTE3OSwxNSArMTc5LDcgQEAKICNkZWZpbmUgQkNNQV9DQ19QUk9HX1dBSVRDTlQJCTB4MDEyNAogI2RlZmluZSBCQ01BX0NDX0ZMQVNIX0NGRwkJMHgwMTI4CiAjZGVmaW5lIEJDTUFfQ0NfRkxBU0hfV0FJVENOVAkJMHgwMTJDCi0jZGVmaW5lIEJDTUFfQ0NfQ0xLQ1RMU1QJCTB4MDFFMCAvKiBDbG9jayBjb250cm9sIGFuZCBzdGF0dXMgKHJldiA+PSAyMCkgKi8KLSNkZWZpbmUgIEJDTUFfQ0NfQ0xLQ1RMU1RfRk9SQ0VBTFAJMHgwMDAwMDAwMSAvKiBGb3JjZSBBTFAgcmVxdWVzdCAqLwotI2RlZmluZSAgQkNNQV9DQ19DTEtDVExTVF9GT1JDRUhUCTB4MDAwMDAwMDIgLyogRm9yY2UgSFQgcmVxdWVzdCAqLwotI2RlZmluZSAgQkNNQV9DQ19DTEtDVExTVF9GT1JDRUlMUAkweDAwMDAwMDA0IC8qIEZvcmNlIElMUCByZXF1ZXN0ICovCi0jZGVmaW5lICBCQ01BX0NDX0NMS0NUTFNUX0hBVkVBTFBSRVEJMHgwMDAwMDAwOCAvKiBBTFAgYXZhaWxhYmxlIHJlcXVlc3QgKi8KLSNkZWZpbmUgIEJDTUFfQ0NfQ0xLQ1RMU1RfSEFWRUhUUkVRCTB4MDAwMDAwMTAgLyogSFQgYXZhaWxhYmxlIHJlcXVlc3QgKi8KLSNkZWZpbmUgIEJDTUFfQ0NfQ0xLQ1RMU1RfSFdDUk9GRgkweDAwMDAwMDIwIC8qIEZvcmNlIEhXIGNsb2NrIHJlcXVlc3Qgb2ZmICovCi0jZGVmaW5lICBCQ01BX0NDX0NMS0NUTFNUX0hBVkVIVAkweDAwMDEwMDAwIC8qIEhUIGF2YWlsYWJsZSAqLwotI2RlZmluZSAgQkNNQV9DQ19DTEtDVExTVF9IQVZFQUxQCTB4MDAwMjAwMDAgLyogQVBMIGF2YWlsYWJsZSAqLworLyogMHgxRTAgaXMgZGVmaW5lZCBhcyBzaGFyZWQgQkNNQV9DTEtDVExTVCAqLwogI2RlZmluZSBCQ01BX0NDX0hXX1dPUktBUk9VTkQJCTB4MDFFNCAvKiBIYXJkd2FyZSB3b3JrYXJvdW5kIChyZXYgPj0gMjApICovCiAjZGVmaW5lIEJDTUFfQ0NfVUFSVDBfREFUQQkJMHgwMzAwCiAjZGVmaW5lIEJDTUFfQ0NfVUFSVDBfSU1SCQkweDAzMDQKQEAgLTI0NCw2ICsyMzYsOCBAQAogI2RlZmluZSBCQ01BX0NDX1JFR0NUTF9EQVRBCQkweDA2NUMKICNkZWZpbmUgQkNNQV9DQ19QTExDVExfQUREUgkJMHgwNjYwCiAjZGVmaW5lIEJDTUFfQ0NfUExMQ1RMX0RBVEEJCTB4MDY2NAorI2RlZmluZSBCQ01BX0NDX1NQUk9NCQkJMHgwODAwIC8qIFNQUk9NIGJlZ2lubmluZyAqLworI2RlZmluZSBCQ01BX0NDX1NQUk9NX1BDSUU2CQkweDA4MzAgLyogU1BST00gYmVnaW5uaW5nIG9uIFBDSWUgcmV2ID49IDYgKi8KIAogLyogRGF0YSBmb3IgdGhlIFBNVSwgaWYgYXZhaWxhYmxlLgogICogQ2hlY2sgYXZhaWxhYmlsaXR5IHdpdGggKChzdHJ1Y3QgYmNtYV9jaGlwY29tbW9uKS0+Y2FwYWJpbGl0aWVzICYgQkNNQV9DQ19DQVBfUE1VKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX3BjaS5oIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX3BjaS5oCmluZGV4IGI3ZTE5MWMuLjM4NzFiNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX2RyaXZlcl9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfcGNpLmgKQEAgLTg1LDUgKzg1LDcgQEAKICNkZWZpbmUgcGNpY29yZV93cml0ZTMyKHBjLCBvZmZzZXQsIHZhbCkJYmNtYV93cml0ZTMyKChwYyktPmNvcmUsIG9mZnNldCwgdmFsKQogCiBleHRlcm4gdm9pZCBiY21hX2NvcmVfcGNpX2luaXQoc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMpOworZXh0ZXJuIGludCBiY21hX2NvcmVfcGNpX2lycV9jdGwoc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMsCisJCQkJIHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgYm9vbCBlbmFibGUpOwogCiAjZW5kaWYgLyogTElOVVhfQkNNQV9EUklWRVJfUENJX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9yZWdzLmggYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9yZWdzLmgKaW5kZXggZjgyZDg4YS4uOWZhYWUyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfcmVncy5oCisrKyBiL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX3JlZ3MuaApAQCAtMSwxMyArMSwzOCBAQAogI2lmbmRlZiBMSU5VWF9CQ01BX1JFR1NfSF8KICNkZWZpbmUgTElOVVhfQkNNQV9SRUdTX0hfCiAKKy8qIFNvbWUgc2luZ2xlIHJlZ2lzdGVycyBhcmUgc2hhcmVkIGJldHdlZW4gbWFueSBjb3JlcyAqLworLyogQkNNQV9DTEtDVExTVDogQ2hpcENvbW1vbiAocmV2ID49IDIwKSwgUENJZSwgODAyMTEgKi8KKyNkZWZpbmUgQkNNQV9DTEtDVExTVAkJCTB4MDFFMCAvKiBDbG9jayBjb250cm9sIGFuZCBzdGF0dXMgKi8KKyNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfRk9SQ0VBTFAJCTB4MDAwMDAwMDEgLyogRm9yY2UgQUxQIHJlcXVlc3QgKi8KKyNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfRk9SQ0VIVAkJMHgwMDAwMDAwMiAvKiBGb3JjZSBIVCByZXF1ZXN0ICovCisjZGVmaW5lICBCQ01BX0NMS0NUTFNUX0ZPUkNFSUxQCQkweDAwMDAwMDA0IC8qIEZvcmNlIElMUCByZXF1ZXN0ICovCisjZGVmaW5lICBCQ01BX0NMS0NUTFNUX0hBVkVBTFBSRVEJMHgwMDAwMDAwOCAvKiBBTFAgYXZhaWxhYmxlIHJlcXVlc3QgKi8KKyNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfSEFWRUhUUkVRCTB4MDAwMDAwMTAgLyogSFQgYXZhaWxhYmxlIHJlcXVlc3QgKi8KKyNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfSFdDUk9GRgkJMHgwMDAwMDAyMCAvKiBGb3JjZSBIVyBjbG9jayByZXF1ZXN0IG9mZiAqLworI2RlZmluZSAgQkNNQV9DTEtDVExTVF9FWFRSRVNSRVEJMHgwMDAwMDcwMCAvKiBNYXNrIG9mIGV4dGVybmFsIHJlc291cmNlIHJlcXVlc3RzICovCisjZGVmaW5lICBCQ01BX0NMS0NUTFNUX0hBVkVBTFAJCTB4MDAwMTAwMDAgLyogQUxQIGF2YWlsYWJsZSAqLworI2RlZmluZSAgQkNNQV9DTEtDVExTVF9IQVZFSFQJCTB4MDAwMjAwMDAgLyogSFQgYXZhaWxhYmxlICovCisjZGVmaW5lICBCQ01BX0NMS0NUTFNUX0JQX09OX0FMUAkweDAwMDQwMDAwIC8qIFJPOiBydW5uaW5nIG9uIEFMUCBjbG9jayAqLworI2RlZmluZSAgQkNNQV9DTEtDVExTVF9CUF9PTl9IVAkJMHgwMDA4MDAwMCAvKiBSTzogcnVubmluZyBvbiBIVCBjbG9jayAqLworI2RlZmluZSAgQkNNQV9DTEtDVExTVF9FWFRSRVNTVAkJMHgwNzAwMDAwMCAvKiBNYXNrIG9mIGV4dGVybmFsIHJlc291cmNlIHN0YXR1cyAqLworLyogSXMgdGhlcmUgYW55IEJDTTQzMjggb24gQkNNQSBidXM/ICovCisjZGVmaW5lICBCQ01BX0NMS0NUTFNUXzQzMjhBMF9IQVZFSFQJMHgwMDAxMDAwMCAvKiA0MzI4YTAgaGFzIHJldmVyc2VkIGJpdHMgKi8KKyNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfNDMyOEEwX0hBVkVBTFAJMHgwMDAyMDAwMCAvKiA0MzI4YTAgaGFzIHJldmVyc2VkIGJpdHMgKi8KKwogLyogQWdlbnQgcmVnaXN0ZXJzIChjb21tb24gZm9yIGV2ZXJ5IGNvcmUpICovCi0jZGVmaW5lIEJDTUFfSU9DVEwJCQkweDA0MDgKKyNkZWZpbmUgQkNNQV9JT0NUTAkJCTB4MDQwOCAvKiBJTyBjb250cm9sICovCiAjZGVmaW5lICBCQ01BX0lPQ1RMX0NMSwkJCTB4MDAwMQogI2RlZmluZSAgQkNNQV9JT0NUTF9GR0MJCQkweDAwMDIKICNkZWZpbmUgIEJDTUFfSU9DVExfQ09SRV9CSVRTCQkweDNGRkMKICNkZWZpbmUgIEJDTUFfSU9DVExfUE1FX0VOCQkweDQwMDAKICNkZWZpbmUgIEJDTUFfSU9DVExfQklTVF9FTgkJMHg4MDAwCisjZGVmaW5lIEJDTUFfSU9TVAkJCTB4MDUwMCAvKiBJTyBzdGF0dXMgKi8KKyNkZWZpbmUgIEJDTUFfSU9TVF9DT1JFX0JJVFMJCTB4MEZGRgorI2RlZmluZSAgQkNNQV9JT1NUX0RNQTY0CQkweDEwMDAKKyNkZWZpbmUgIEJDTUFfSU9TVF9HQVRFRF9DTEsJCTB4MjAwMAorI2RlZmluZSAgQkNNQV9JT1NUX0JJU1RfRVJST1IJCTB4NDAwMAorI2RlZmluZSAgQkNNQV9JT1NUX0JJU1RfRE9ORQkJMHg4MDAwCiAjZGVmaW5lIEJDTUFfUkVTRVRfQ1RMCQkJMHgwODAwCiAjZGVmaW5lICBCQ01BX1JFU0VUX0NUTF9SRVNFVAkJMHgwMDAxCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKaW5kZXggODg0NTYxMy4uZmQ4OGEzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKQEAgLTExMSw2ICsxMTEsNyBAQAogZXh0ZXJuIGludCBzZWFyY2hfYmluYXJ5X2hhbmRsZXIoc3RydWN0IGxpbnV4X2JpbnBybSAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiBpbnQgZmx1c2hfb2xkX2V4ZWMoc3RydWN0IGxpbnV4X2JpbnBybSAqIGJwcm0pOwogZXh0ZXJuIHZvaWQgc2V0dXBfbmV3X2V4ZWMoc3RydWN0IGxpbnV4X2JpbnBybSAqIGJwcm0pOworZXh0ZXJuIHZvaWQgd291bGRfZHVtcChzdHJ1Y3QgbGludXhfYmlucHJtICosIHN0cnVjdCBmaWxlICopOwogCiBleHRlcm4gaW50IHN1aWRfZHVtcGFibGU7CiAjZGVmaW5lIFNVSURfRFVNUF9ESVNBQkxFCTAJLyogTm8gc2V0dWlkIGR1bXBpbmcgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYml0X3NwaW5sb2NrLmggYi9pbmNsdWRlL2xpbnV4L2JpdF9zcGlubG9jay5oCmluZGV4IGI0MzI2YmYuLjU2NGQ5OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYml0X3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaXRfc3BpbmxvY2suaApAQCAtODgsNyArODgsNyBAQAogewogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfU1BJTkxPQ0spCiAJcmV0dXJuIHRlc3RfYml0KGJpdG51bSwgYWRkcik7Ci0jZWxpZiBkZWZpbmVkIENPTkZJR19QUkVFTVBUCisjZWxpZiBkZWZpbmVkIENPTkZJR19QUkVFTVBUX0NPVU5UCiAJcmV0dXJuIHByZWVtcHRfY291bnQoKTsKICNlbHNlCiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oIGIvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaAppbmRleCAyYTdjZWE1Li42Mzk1NjkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCShSRVFfRkFJTEZBU1RfREVWIHwgUkVRX0ZBSUxGQVNUX1RSQU5TUE9SVCB8IFJFUV9GQUlMRkFTVF9EUklWRVIpCiAjZGVmaW5lIFJFUV9DT01NT05fTUFTSyBcCiAJKFJFUV9XUklURSB8IFJFUV9GQUlMRkFTVF9NQVNLIHwgUkVRX1NZTkMgfCBSRVFfTUVUQSB8IFJFUV9ESVNDQVJEIHwgXAotCSBSRVFfTk9JRExFIHwgUkVRX0ZMVVNIIHwgUkVRX0ZVQSkKKwkgUkVRX05PSURMRSB8IFJFUV9GTFVTSCB8IFJFUV9GVUEgfCBSRVFfU0VDVVJFKQogI2RlZmluZSBSRVFfQ0xPTkVfTUFTSwkJUkVRX0NPTU1PTl9NQVNLCiAKICNkZWZpbmUgUkVRX1JBSEVBRAkJKDEgPDwgX19SRVFfUkFIRUFEKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKaW5kZXggMWEyMzcyMi4uMGU2N2M0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCkBAIC03Myw3ICs3Myw3IEBACiAKIC8qCiAgKiB0cnkgdG8gcHV0IHRoZSBmaWVsZHMgdGhhdCBhcmUgcmVmZXJlbmNlZCB0b2dldGhlciBpbiB0aGUgc2FtZSBjYWNoZWxpbmUuCi0gKiBpZiB5b3UgbW9kaWZ5IHRoaXMgc3RydWN0dXJlLCBiZSBzdXJlIHRvIGNoZWNrIGJsb2NrL2Jsay1jb3JlLmM6cnFfaW5pdCgpCisgKiBpZiB5b3UgbW9kaWZ5IHRoaXMgc3RydWN0dXJlLCBiZSBzdXJlIHRvIGNoZWNrIGJsb2NrL2Jsay1jb3JlLmM6YmxrX3JxX2luaXQoKQogICogYXMgd2VsbCEKICAqLwogc3RydWN0IHJlcXVlc3QgewpAQCAtMjYwLDggKzI2MCw3IEBACiAJdW5zaWduZWQgY2hhcgkJZGlzY2FyZF96ZXJvZXNfZGF0YTsKIH07CiAKLXN0cnVjdCByZXF1ZXN0X3F1ZXVlCi17CitzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSB7CiAJLyoKIAkgKiBUb2dldGhlciB3aXRoIHF1ZXVlX2hlYWQgZm9yIGNhY2hlbGluZSBzaGFyaW5nCiAJICovCkBAIC0zMDQsMTYgKzMwMywxNiBAQAogCXZvaWQJCQkqcXVldWVkYXRhOwogCiAJLyoKLQkgKiBxdWV1ZSBuZWVkcyBib3VuY2UgcGFnZXMgZm9yIHBhZ2VzIGFib3ZlIHRoaXMgbGltaXQKLQkgKi8KLQlnZnBfdAkJCWJvdW5jZV9nZnA7Ci0KLQkvKgogCSAqIHZhcmlvdXMgcXVldWUgZmxhZ3MsIHNlZSBRVUVVRV8qIGJlbG93CiAJICovCiAJdW5zaWduZWQgbG9uZwkJcXVldWVfZmxhZ3M7CiAKIAkvKgorCSAqIHF1ZXVlIG5lZWRzIGJvdW5jZSBwYWdlcyBmb3IgcGFnZXMgYWJvdmUgdGhpcyBsaW1pdAorCSAqLworCWdmcF90CQkJYm91bmNlX2dmcDsKKworCS8qCiAJICogcHJvdGVjdHMgcXVldWUgc3RydWN0dXJlcyBmcm9tIHJlZW50cmFuY3kuIC0+X19xdWV1ZV9sb2NrIHNob3VsZAogCSAqIF9uZXZlcl8gYmUgdXNlZCBkaXJlY3RseSwgaXQgaXMgcXVldWUgcHJpdmF0ZS4gYWx3YXlzIHVzZQogCSAqIC0+cXVldWVfbG9jay4KQEAgLTMzNCw4ICszMzMsOCBAQAogCXVuc2lnbmVkIGludAkJbnJfY29uZ2VzdGlvbl9vZmY7CiAJdW5zaWduZWQgaW50CQlucl9iYXRjaGluZzsKIAotCXZvaWQJCQkqZG1hX2RyYWluX2J1ZmZlcjsKIAl1bnNpZ25lZCBpbnQJCWRtYV9kcmFpbl9zaXplOworCXZvaWQJCQkqZG1hX2RyYWluX2J1ZmZlcjsKIAl1bnNpZ25lZCBpbnQJCWRtYV9wYWRfbWFzazsKIAl1bnNpZ25lZCBpbnQJCWRtYV9hbGlnbm1lbnQ7CiAKQEAgLTM5Myw3ICszOTIsNyBAQAogI2RlZmluZSBRVUVVRV9GTEFHX0VMVlNXSVRDSAk2CS8qIGRvbid0IHVzZSBlbGV2YXRvciwganVzdCBkbyBGSUZPICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfQklESQkJNwkvKiBxdWV1ZSBzdXBwb3J0cyBiaWRpIHJlcXVlc3RzICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfTk9NRVJHRVMgICAgIDgJLyogZGlzYWJsZSBtZXJnZSBhdHRlbXB0cyAqLwotI2RlZmluZSBRVUVVRV9GTEFHX1NBTUVfQ09NUAk5CS8qIGZvcmNlIGNvbXBsZXRlIG9uIHNhbWUgQ1BVICovCisjZGVmaW5lIFFVRVVFX0ZMQUdfU0FNRV9DT01QCTkJLyogY29tcGxldGUgb24gc2FtZSBDUFUtZ3JvdXAgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19GQUlMX0lPICAgICAxMAkvKiBmYWtlIHRpbWVvdXQgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19TVEFDS0FCTEUgICAxMQkvKiBzdXBwb3J0cyByZXF1ZXN0IHN0YWNraW5nICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfTk9OUk9UICAgICAgMTIJLyogbm9uLXJvdGF0aW9uYWwgZGV2aWNlIChTU0QpICovCkBAIC00MDMsNiArNDAyLDcgQEAKICNkZWZpbmUgUVVFVUVfRkxBR19OT1hNRVJHRVMgICAxNQkvKiBObyBleHRlbmRlZCBtZXJnZXMgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19BRERfUkFORE9NICAxNgkvKiBDb250cmlidXRlcyB0byByYW5kb20gcG9vbCAqLwogI2RlZmluZSBRVUVVRV9GTEFHX1NFQ0RJU0NBUkQgIDE3CS8qIHN1cHBvcnRzIFNFQ0RJU0NBUkQgKi8KKyNkZWZpbmUgUVVFVUVfRkxBR19TQU1FX0ZPUkNFICAxOAkvKiBmb3JjZSBjb21wbGV0ZSBvbiBzYW1lIENQVSAqLwogCiAjZGVmaW5lIFFVRVVFX0ZMQUdfREVGQVVMVAkoKDEgPDwgUVVFVUVfRkxBR19JT19TVEFUKSB8CQlcCiAJCQkJICgxIDw8IFFVRVVFX0ZMQUdfU1RBQ0tBQkxFKQl8CVwKQEAgLTg1NywxMiArODU3LDIxIEBACiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYmxrX2FsbG9jX3F1ZXVlX25vZGUoZ2ZwX3QsIGludCk7CiBleHRlcm4gdm9pZCBibGtfcHV0X3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOwogCisvKgorICogTm90ZTogQ29kZSBpbiBiZXR3ZWVuIGNoYW5naW5nIHRoZSBibGtfcGx1ZyBsaXN0L2NiX2xpc3Qgb3IgZWxlbWVudCBvZiBzdWNoCisgKiBsaXN0cyBpcyBwcmVlbXB0YWJsZSwgYnV0IHN1Y2ggY29kZSBjYW4ndCBkbyBzbGVlcCAob3IgYmUgdmVyeSBjYXJlZnVsKSwKKyAqIG90aGVyd2lzZSBkYXRhIGlzIGNvcnJ1cHRlZC4gRm9yIGRldGFpbHMsIHBsZWFzZSBjaGVjayBzY2hlZHVsZSgpIHdoZXJlCisgKiBibGtfc2NoZWR1bGVfZmx1c2hfcGx1ZygpIGlzIGNhbGxlZC4KKyAqLwogc3RydWN0IGJsa19wbHVnIHsKIAl1bnNpZ25lZCBsb25nIG1hZ2ljOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNiX2xpc3Q7CiAJdW5zaWduZWQgaW50IHNob3VsZF9zb3J0OworCXVuc2lnbmVkIGludCBjb3VudDsKIH07CisjZGVmaW5lIEJMS19NQVhfUkVRVUVTVF9DT1VOVCAxNgorCiBzdHJ1Y3QgYmxrX3BsdWdfY2IgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBibGtfcGx1Z19jYiAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmggYi9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCmluZGV4IGIyMmZiMGQuLjhjN2MyZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaApAQCAtMTY5LDcgKzE2OSw4IEBACiBleHRlcm4gaW50IGRvX2Jsa190cmFjZV9zZXR1cChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqbmFtZSwKIAkJCSAgICAgIGRldl90IGRldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJCSAgICAgIHN0cnVjdCBibGtfdXNlcl90cmFjZV9zZXR1cCAqYnV0cyk7Ci1leHRlcm4gdm9pZCBfX3RyYWNlX25vdGVfbWVzc2FnZShzdHJ1Y3QgYmxrX3RyYWNlICosIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpCit2b2lkIF9fdHJhY2Vfbm90ZV9tZXNzYWdlKHN0cnVjdCBibGtfdHJhY2UgKiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAvKioKICAqIGJsa19hZGRfdHJhY2VfbXNnIC0gQWRkIGEgKHNpbXBsZSkgbWVzc2FnZSB0byB0aGUgYmxrdHJhY2Ugc3RyZWFtCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NlcGgvbGliY2VwaC5oIGIvaW5jbHVkZS9saW51eC9jZXBoL2xpYmNlcGguaAppbmRleCA2MzY1ZjA0Li41NjM3NTUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NlcGgvbGliY2VwaC5oCisrKyBiL2luY2x1ZGUvbGludXgvY2VwaC9saWJjZXBoLmgKQEAgLTM1LDcgKzM1LDcgQEAKICNkZWZpbmUgQ0VQSF9PUFRfTVlJUCAgICAgICAgICAgICAoMTw8MikgLyogc3BlY2lmaWVkIG15IGlwICovCiAjZGVmaW5lIENFUEhfT1BUX05PQ1JDICAgICAgICAgICAgKDE8PDMpIC8qIG5vIGRhdGEgY3JjIG9uIHdyaXRlcyAqLwogCi0jZGVmaW5lIENFUEhfT1BUX0RFRkFVTFQgICAoMCk7CisjZGVmaW5lIENFUEhfT1BUX0RFRkFVTFQgICAoMCkKIAogI2RlZmluZSBjZXBoX3NldF9vcHQoY2xpZW50LCBvcHQpIFwKIAkoY2xpZW50KS0+b3B0aW9ucy0+ZmxhZ3MgfD0gQ0VQSF9PUFRfIyNvcHQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oIGIvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAppbmRleCBhYjRhYzBjLi5kYTdlNGJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCisrKyBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKQEAgLTUzOSw3ICs1MzksNiBAQAogICovCiAjZGVmaW5lIHRhc2tfc3Vic3lzX3N0YXRlX2NoZWNrKHRhc2ssIHN1YnN5c19pZCwgX19jKQkJCVwKIAlyY3VfZGVyZWZlcmVuY2VfY2hlY2sodGFzay0+Y2dyb3Vwcy0+c3Vic3lzW3N1YnN5c19pZF0sCQlcCi0JCQkgICAgICByY3VfcmVhZF9sb2NrX2hlbGQoKSB8fAkJCVwKIAkJCSAgICAgIGxvY2tkZXBfaXNfaGVsZCgmdGFzay0+YWxsb2NfbG9jaykgfHwJXAogCQkJICAgICAgY2dyb3VwX2xvY2tfaXNfaGVsZCgpIHx8IChfX2MpKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmggYi9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKaW5kZXggZDQ2NDZiNC4uMTM5YzRkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaApAQCAtMjIsNiArMjIsMTAgQEAKIHR5cGVkZWYgdTY0IGN5Y2xlX3Q7CiBzdHJ1Y3QgY2xvY2tzb3VyY2U7CiAKKyNpZmRlZiBDT05GSUdfQVJDSF9DTE9DS1NPVVJDRV9EQVRBCisjaW5jbHVkZSA8YXNtL2Nsb2Nrc291cmNlLmg+CisjZW5kaWYKKwogLyoqCiAgKiBzdHJ1Y3QgY3ljbGVjb3VudGVyIC0gaGFyZHdhcmUgYWJzdHJhY3Rpb24gZm9yIGEgZnJlZSBydW5uaW5nIGNvdW50ZXIKICAqCVByb3ZpZGVzIGNvbXBsZXRlbHkgc3RhdGUtZnJlZSBhY2Nlc3NvcnMgdG8gdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUuCkBAIC0xNTMsNyArMTU3LDcgQEAKICAqIEBzaGlmdDoJCWN5Y2xlIHRvIG5hbm9zZWNvbmQgZGl2aXNvciAocG93ZXIgb2YgdHdvKQogICogQG1heF9pZGxlX25zOgltYXggaWRsZSB0aW1lIHBlcm1pdHRlZCBieSB0aGUgY2xvY2tzb3VyY2UgKG5zZWNzKQogICogQGZsYWdzOgkJZmxhZ3MgZGVzY3JpYmluZyBzcGVjaWFsIHByb3BlcnRpZXMKLSAqIEB2cmVhZDoJCXZzeXNjYWxsIGJhc2VkIHJlYWQKKyAqIEBhcmNoZGF0YToJCWFyY2gtc3BlY2lmaWMgZGF0YQogICogQHN1c3BlbmQ6CQlzdXNwZW5kIGZ1bmN0aW9uIGZvciB0aGUgY2xvY2tzb3VyY2UsIGlmIG5lY2Vzc2FyeQogICogQHJlc3VtZToJCXJlc3VtZSBmdW5jdGlvbiBmb3IgdGhlIGNsb2Nrc291cmNlLCBpZiBuZWNlc3NhcnkKICAqLwpAQCAtMTY5LDE2ICsxNzMsMTMgQEAKIAl1MzIgc2hpZnQ7CiAJdTY0IG1heF9pZGxlX25zOwogCi0jaWZkZWYgQ09ORklHX0lBNjQKLQl2b2lkICpmc3lzX21taW87ICAgICAgICAvKiB1c2VkIGJ5IGZzeXNjYWxsIGFzbSBjb2RlICovCi0jZGVmaW5lIENMS1NSQ19GU1lTX01NSU9fU0VUKG1taW8sIGFkZHIpICAgICAgKChtbWlvKSA9IChhZGRyKSkKLSNlbHNlCi0jZGVmaW5lIENMS1NSQ19GU1lTX01NSU9fU0VUKG1taW8sIGFkZHIpICAgICAgZG8geyB9IHdoaWxlICgwKQorI2lmZGVmIENPTkZJR19BUkNIX0NMT0NLU09VUkNFX0RBVEEKKwlzdHJ1Y3QgYXJjaF9jbG9ja3NvdXJjZV9kYXRhIGFyY2hkYXRhOwogI2VuZGlmCisKIAljb25zdCBjaGFyICpuYW1lOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlpbnQgcmF0aW5nOwotCWN5Y2xlX3QgKCp2cmVhZCkodm9pZCk7CiAJaW50ICgqZW5hYmxlKShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKTsKIAl2b2lkICgqZGlzYWJsZSkoc3RydWN0IGNsb2Nrc291cmNlICpjcyk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE4OCw2ICsxODksNyBAQAogI2lmZGVmIENPTkZJR19DTE9DS1NPVVJDRV9XQVRDSERPRwogCS8qIFdhdGNoZG9nIHJlbGF0ZWQgZGF0YSwgdXNlZCBieSB0aGUgZnJhbWV3b3JrICovCiAJc3RydWN0IGxpc3RfaGVhZCB3ZF9saXN0OworCWN5Y2xlX3QgY3NfbGFzdDsKIAljeWNsZV90IHdkX2xhc3Q7CiAjZW5kaWYKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbl9wcm9jLmggYi9pbmNsdWRlL2xpbnV4L2NuX3Byb2MuaAppbmRleCA0N2RhYzVlLi4xMmM1MTdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NuX3Byb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NuX3Byb2MuaApAQCAtNTMsNiArNTMsNyBAQAogCQlQUk9DX0VWRU5UX1VJRCAgPSAweDAwMDAwMDA0LAogCQlQUk9DX0VWRU5UX0dJRCAgPSAweDAwMDAwMDQwLAogCQlQUk9DX0VWRU5UX1NJRCAgPSAweDAwMDAwMDgwLAorCQlQUk9DX0VWRU5UX1BUUkFDRSA9IDB4MDAwMDAxMDAsCiAJCS8qICJuZXh0IiBzaG91bGQgYmUgMHgwMDAwMDQwMCAqLwogCQkvKiAibGFzdCIgaXMgdGhlIGxhc3QgcHJvY2VzcyBldmVudDogZXhpdCAqLwogCQlQUk9DX0VWRU5UX0VYSVQgPSAweDgwMDAwMDAwCkBAIC05NSw2ICs5NiwxMyBAQAogCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc190Z2lkOwogCQl9IHNpZDsKIAorCQlzdHJ1Y3QgcHRyYWNlX3Byb2NfZXZlbnQgeworCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc19waWQ7CisJCQlfX2tlcm5lbF9waWRfdCBwcm9jZXNzX3RnaWQ7CisJCQlfX2tlcm5lbF9waWRfdCB0cmFjZXJfcGlkOworCQkJX19rZXJuZWxfcGlkX3QgdHJhY2VyX3RnaWQ7CisJCX0gcHRyYWNlOworCiAJCXN0cnVjdCBleGl0X3Byb2NfZXZlbnQgewogCQkJX19rZXJuZWxfcGlkX3QgcHJvY2Vzc19waWQ7CiAJCQlfX2tlcm5lbF9waWRfdCBwcm9jZXNzX3RnaWQ7CkBAIC0xMDksNiArMTE3LDcgQEAKIHZvaWQgcHJvY19leGVjX2Nvbm5lY3RvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogdm9pZCBwcm9jX2lkX2Nvbm5lY3RvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCB3aGljaF9pZCk7CiB2b2lkIHByb2Nfc2lkX2Nvbm5lY3RvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwordm9pZCBwcm9jX3B0cmFjZV9jb25uZWN0b3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgd2hpY2hfaWQpOwogdm9pZCBwcm9jX2V4aXRfY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHByb2NfZm9ya19jb25uZWN0b3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtMTI0LDYgKzEzMywxMCBAQAogc3RhdGljIGlubGluZSB2b2lkIHByb2Nfc2lkX2Nvbm5lY3RvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7fQogCitzdGF0aWMgaW5saW5lIHZvaWQgcHJvY19wdHJhY2VfY29ubmVjdG9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJIGludCBwdHJhY2VfaWQpCit7fQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcHJvY19leGl0X2Nvbm5lY3RvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7fQogI2VuZGlmCS8qIENPTkZJR19QUk9DX0VWRU5UUyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYXQuaCBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKaW5kZXggZGRjYjdkYi4uODc3OTQwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCkBAIC00MzgsMTYgKzQzOCw3IEBACiAJCQkJIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0c3AsCiAJCQkJIGNvbnN0IGNvbXBhdF9zaWdzZXRfdCBfX3VzZXIgKnNpZ21hc2ssCiAJCQkJIGNvbXBhdF9zaXplX3Qgc2lnc2V0c2l6ZSk7Ci0jaWYgKGRlZmluZWQoQ09ORklHX05GU0QpIHx8IGRlZmluZWQoQ09ORklHX05GU0RfTU9EVUxFKSkgJiYgXAotCSFkZWZpbmVkKENPTkZJR19ORlNEX0RFUFJFQ0FURUQpCi11bmlvbiBjb21wYXRfbmZzY3RsX3JlczsKLXN0cnVjdCBjb21wYXRfbmZzY3RsX2FyZzsKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25mc3NlcnZjdGwoaW50IGNtZCwKLQkJCQkgICAgICBzdHJ1Y3QgY29tcGF0X25mc2N0bF9hcmcgX191c2VyICphcmcsCi0JCQkJICAgICAgdW5pb24gY29tcGF0X25mc2N0bF9yZXMgX191c2VyICpyZXMpOwotI2Vsc2UKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25mc3NlcnZjdGwoaW50IGNtZCwgdm9pZCAqbm90dXNlZCwgdm9pZCAqbm90dXNlZDIpOwotI2VuZGlmCiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zaWduYWxmZDQoaW50IHVmZCwKIAkJCQkgICAgIGNvbnN0IGNvbXBhdF9zaWdzZXRfdCBfX3VzZXIgKnNpZ21hc2ssCiAJCQkJICAgICBjb21wYXRfc2l6ZV90IHNpZ3NldHNpemUsIGludCBmbGFncyk7CkBAIC00NjcsNiArNDU4LDggQEAKIAkJCQkgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NlbmRtc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKm1zZywKIAkJCQkgICB1bnNpZ25lZCBmbGFncyk7Cithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZW5kbW1zZyhpbnQgZmQsIHN0cnVjdCBjb21wYXRfbW1zZ2hkciBfX3VzZXIgKm1tc2csCisJCQkJICAgIHVuc2lnbmVkIHZsZW4sIHVuc2lnbmVkIGludCBmbGFncyk7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19yZWN2bXNnKGludCBmZCwgc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICptc2csCiAJCQkJICAgdW5zaWduZWQgaW50IGZsYWdzKTsKIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3YoaW50IGZkLCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaCBiL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmgKaW5kZXggN2M2MGQwOS4uZjY5NmJjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCkBAIC00NCw3ICs0NCw3IEBACiAjZGVmaW5lIENOX1ZBTF9EUkJECQkJMHgxCiAjZGVmaW5lIENOX0tWUF9JRFgJCQkweDkJLyogSHlwZXJWIEtWUCAqLwogCi0jZGVmaW5lIENOX05FVExJTktfVVNFUlMJCTkKKyNkZWZpbmUgQ05fTkVUTElOS19VU0VSUwkJMTAJLyogSGlnaGVzdCBpbmRleCArIDEgKi8KIAogLyoKICAqIE1heGltdW0gY29ubmVjdG9yJ3MgbWVzc2FnZSBzaXplLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb3JkaWMuaCBiL2luY2x1ZGUvbGludXgvY29yZGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzMjA5MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvY29yZGljLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9fQ09SRElDX0hfCisjZGVmaW5lIF9fQ09SRElDX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKioKKyAqIHN0cnVjdCBjb3JkaWNfaXEgLSBpL3EgY29vcmRpbmF0ZS4KKyAqCisgKiBAaTogcmVhbCBwYXJ0IG9mIGNvb3JkaW5hdGUgKGluIHBoYXNlKS4KKyAqIEBxOiBpbWFnaW5hcnkgcGFydCBvZiBjb29yZGluYXRlIChxdWFkcmF0dXJlKS4KKyAqLworc3RydWN0IGNvcmRpY19pcSB7CisJczMyIGk7CisJczMyIHE7Cit9OworCisvKioKKyAqIGNvcmRpY19jYWxjX2lxKCkgLSBjYWxjdWxhdGVzIHRoZSBpL3EgY29vcmRpbmF0ZSBmb3IgZ2l2ZW4gYW5nbGUuCisgKgorICogQHRoZXRhOiBhbmdsZSBpbiBkZWdyZWVzIGZvciB3aGljaCBpL3EgY29vcmRpbmF0ZSBpcyB0byBiZSBjYWxjdWxhdGVkLgorICogQGNvb3JkOiBmdW5jdGlvbiBvdXRwdXQgcGFyYW1ldGVyIGhvbGRpbmcgdGhlIGkvcSBjb29yZGluYXRlLgorICoKKyAqIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBpL3EgY29vcmRpbmF0ZSBmb3IgYSBnaXZlbiBhbmdsZSB1c2luZworICogY29yZGljIGFsZ29yaXRobS4gVGhlIGNvb3JkaW5hdGUgY29uc2lzdHMgb2YgYSByZWFsIChpKSBhbmQgYW4KKyAqIGltYWdpbmFyeSAocSkgcGFydC4gVGhlIHJlYWwgcGFydCBpcyBlc3NlbnRpYWxseSB0aGUgY29zaW5lIG9mIHRoZQorICogYW5nbGUgYW5kIHRoZSBpbWFnaW5hcnkgcGFydCBpcyB0aGUgc2luZSBvZiB0aGUgYW5nbGUuIFRoZSByZXR1cm5lZAorICogdmFsdWVzIGFyZSBzY2FsZWQgYnkgMl4xNiBmb3IgcHJlY2lzaW9uLiBUaGUgcmFuZ2UgZm9yIHRoZXRhIGlzCisgKiBmb3IgLTE4MCBkZWdyZWVzIHRvICsxODAgZGVncmVlcy4gUGFzc2VkIHZhbHVlcyBvdXRzaWRlIHRoaXMgcmFuZ2UgYXJlCisgKiBjb252ZXJ0ZWQgYmVmb3JlIGRvaW5nIHRoZSBhY3R1YWwgY2FsY3VsYXRpb24uCisgKi8KK3N0cnVjdCBjb3JkaWNfaXEgY29yZGljX2NhbGNfaXEoczMyIHRoZXRhKTsKKworI2VuZGlmIC8qIF9fQ09SRElDX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdS5oIGIvaW5jbHVkZS9saW51eC9jcHUuaAppbmRleCA1ZjA5MzIzLi5iMWE2MzVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1LmgKQEAgLTcwLDYgKzcwLDM5IEBACiAJQ1BVX1BSSV9XT1JLUVVFVUUJPSA1LAogfTsKIAorI2RlZmluZSBDUFVfT05MSU5FCQkweDAwMDIgLyogQ1BVICh1bnNpZ25lZCl2IGlzIHVwICovCisjZGVmaW5lIENQVV9VUF9QUkVQQVJFCQkweDAwMDMgLyogQ1BVICh1bnNpZ25lZCl2IGNvbWluZyB1cCAqLworI2RlZmluZSBDUFVfVVBfQ0FOQ0VMRUQJCTB4MDAwNCAvKiBDUFUgKHVuc2lnbmVkKXYgTk9UIGNvbWluZyB1cCAqLworI2RlZmluZSBDUFVfRE9XTl9QUkVQQVJFCTB4MDAwNSAvKiBDUFUgKHVuc2lnbmVkKXYgZ29pbmcgZG93biAqLworI2RlZmluZSBDUFVfRE9XTl9GQUlMRUQJCTB4MDAwNiAvKiBDUFUgKHVuc2lnbmVkKXYgTk9UIGdvaW5nIGRvd24gKi8KKyNkZWZpbmUgQ1BVX0RFQUQJCTB4MDAwNyAvKiBDUFUgKHVuc2lnbmVkKXYgZGVhZCAqLworI2RlZmluZSBDUFVfRFlJTkcJCTB4MDAwOCAvKiBDUFUgKHVuc2lnbmVkKXYgbm90IHJ1bm5pbmcgYW55IHRhc2ssCisJCQkJCSogbm90IGhhbmRsaW5nIGludGVycnVwdHMsIHNvb24gZGVhZC4KKwkJCQkJKiBDYWxsZWQgb24gdGhlIGR5aW5nIGNwdSwgaW50ZXJydXB0cworCQkJCQkqIGFyZSBhbHJlYWR5IGRpc2FibGVkLiBNdXN0IG5vdAorCQkJCQkqIHNsZWVwLCBtdXN0IG5vdCBmYWlsICovCisjZGVmaW5lIENQVV9QT1NUX0RFQUQJCTB4MDAwOSAvKiBDUFUgKHVuc2lnbmVkKXYgZGVhZCwgY3B1X2hvdHBsdWcKKwkJCQkJKiBsb2NrIGlzIGRyb3BwZWQgKi8KKyNkZWZpbmUgQ1BVX1NUQVJUSU5HCQkweDAwMEEgLyogQ1BVICh1bnNpZ25lZCl2IHNvb24gcnVubmluZy4KKwkJCQkJKiBDYWxsZWQgb24gdGhlIG5ldyBjcHUsIGp1c3QgYmVmb3JlCisJCQkJCSogZW5hYmxpbmcgaW50ZXJydXB0cy4gTXVzdCBub3Qgc2xlZXAsCisJCQkJCSogbXVzdCBub3QgZmFpbCAqLworCisvKiBVc2VkIGZvciBDUFUgaG90cGx1ZyBldmVudHMgb2NjdXJyaW5nIHdoaWxlIHRhc2tzIGFyZSBmcm96ZW4gZHVlIHRvIGEgc3VzcGVuZAorICogb3BlcmF0aW9uIGluIHByb2dyZXNzCisgKi8KKyNkZWZpbmUgQ1BVX1RBU0tTX0ZST1pFTgkweDAwMTAKKworI2RlZmluZSBDUFVfT05MSU5FX0ZST1pFTgkoQ1BVX09OTElORSB8IENQVV9UQVNLU19GUk9aRU4pCisjZGVmaW5lIENQVV9VUF9QUkVQQVJFX0ZST1pFTgkoQ1BVX1VQX1BSRVBBUkUgfCBDUFVfVEFTS1NfRlJPWkVOKQorI2RlZmluZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOCShDUFVfVVBfQ0FOQ0VMRUQgfCBDUFVfVEFTS1NfRlJPWkVOKQorI2RlZmluZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTgkoQ1BVX0RPV05fUFJFUEFSRSB8IENQVV9UQVNLU19GUk9aRU4pCisjZGVmaW5lIENQVV9ET1dOX0ZBSUxFRF9GUk9aRU4JKENQVV9ET1dOX0ZBSUxFRCB8IENQVV9UQVNLU19GUk9aRU4pCisjZGVmaW5lIENQVV9ERUFEX0ZST1pFTgkJKENQVV9ERUFEIHwgQ1BVX1RBU0tTX0ZST1pFTikKKyNkZWZpbmUgQ1BVX0RZSU5HX0ZST1pFTgkoQ1BVX0RZSU5HIHwgQ1BVX1RBU0tTX0ZST1pFTikKKyNkZWZpbmUgQ1BVX1NUQVJUSU5HX0ZST1pFTgkoQ1BVX1NUQVJUSU5HIHwgQ1BVX1RBU0tTX0ZST1pFTikKKworCiAjaWZkZWYgQ09ORklHX1NNUAogLyogTmVlZCB0byBrbm93IGFib3V0IENQVXMgZ29pbmcgdXAvZG93bj8gKi8KICNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHX0NQVSkgfHwgIWRlZmluZWQoTU9EVUxFKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcmM4LmggYi9pbmNsdWRlL2xpbnV4L2NyYzguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M4ZGFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jcmM4LmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfX0NSQzhfSF8KKyNkZWZpbmUgX19DUkM4X0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBzZWUgdXNhZ2Ugb2YgdGhpcyB2YWx1ZSBpbiBjcmM4KCkgZGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgQ1JDOF9JTklUX1ZBTFVFCQkweEZGCisKKy8qCisgKiBSZXR1cm4gdmFsdWUgb2YgY3JjOCgpIGluZGljYXRpbmcgdmFsaWQgbWVzc2FnZStjcmMuIFRoaXMgaXMgdHJ1ZQorICogaWYgYSBDUkMgaXMgaW52ZXJ0ZWQgYmVmb3JlIHRyYW5zbWlzc2lvbi4gVGhlIENSQyBjb21wdXRlZCBvdmVyIHRoZQorICogd2hvbGUgcmVjZWl2ZWQgYml0c3RyZWFtIGlzIF90YWJsZVt4XSwgd2hlcmUgeCBpcyB0aGUgYml0IHBhdHRlcm4KKyAqIG9mIHRoZSBtb2RpZmljYXRpb24gKGFsbW9zdCBhbHdheXMgMHhmZikuCisgKi8KKyNkZWZpbmUgQ1JDOF9HT09EX1ZBTFVFKF90YWJsZSkJKF90YWJsZVsweEZGXSkKKworLyogcmVxdWlyZWQgdGFibGUgc2l6ZSBmb3IgY3JjOCBhbGdvcml0aG0gKi8KKyNkZWZpbmUgQ1JDOF9UQUJMRV9TSVpFCQkJMjU2CisKKy8qIGhlbHBlciBtYWNybyBhc3N1cmluZyByaWdodCB0YWJsZSBzaXplIGlzIHVzZWQgKi8KKyNkZWZpbmUgREVDTEFSRV9DUkM4X1RBQkxFKF90YWJsZSkgXAorCXN0YXRpYyB1OCBfdGFibGVbQ1JDOF9UQUJMRV9TSVpFXQorCisvKioKKyAqIGNyYzhfcG9wdWxhdGVfbHNiIC0gZmlsbCBjcmMgdGFibGUgZm9yIGdpdmVuIHBvbHlub21pYWwgaW4gcmVndWxhciBiaXQgb3JkZXIuCisgKgorICogQHRhYmxlOgl0YWJsZSB0byBiZSBmaWxsZWQuCisgKiBAcG9seW5vbWlhbDoJcG9seW5vbWlhbCBmb3Igd2hpY2ggdGFibGUgaXMgdG8gYmUgZmlsbGVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgdGhlIHByb3ZpZGVkIHRhYmxlIGFjY29yZGluZyB0aGUgcG9seW5vbWlhbCBwcm92aWRlZCBmb3IKKyAqIHJlZ3VsYXIgYml0IG9yZGVyIChsc2IgZmlyc3QpLiBQb2x5bm9taWFscyBpbiBDUkMgYWxnb3JpdGhtcyBhcmUgdHlwaWNhbGx5CisgKiByZXByZXNlbnRlZCBhcyBzaG93biBiZWxvdy4KKyAqCisgKglwb2x5ID0geF44ICsgeF43ICsgeF42ICsgeF40ICsgeF4yICsgMQorICoKKyAqIEZvciBsc2IgZmlyc3QgZGlyZWN0aW9uIHheNyBtYXBzIHRvIHRoZSBsc2IuIFNvIHRoZSBwb2x5bm9taWFsIGlzIGFzIGJlbG93LgorICoKKyAqIC0gbHNiIGZpcnN0OiBwb2x5ID0gMTAxMDEwMTEoMSkgPSAweEFCCisgKi8KK3ZvaWQgY3JjOF9wb3B1bGF0ZV9sc2IodTggdGFibGVbQ1JDOF9UQUJMRV9TSVpFXSwgdTggcG9seW5vbWlhbCk7CisKKy8qKgorICogY3JjOF9wb3B1bGF0ZV9tc2IgLSBmaWxsIGNyYyB0YWJsZSBmb3IgZ2l2ZW4gcG9seW5vbWlhbCBpbiByZXZlcnNlIGJpdCBvcmRlci4KKyAqCisgKiBAdGFibGU6CXRhYmxlIHRvIGJlIGZpbGxlZC4KKyAqIEBwb2x5bm9taWFsOglwb2x5bm9taWFsIGZvciB3aGljaCB0YWJsZSBpcyB0byBiZSBmaWxsZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBmaWxscyB0aGUgcHJvdmlkZWQgdGFibGUgYWNjb3JkaW5nIHRoZSBwb2x5bm9taWFsIHByb3ZpZGVkIGZvcgorICogcmV2ZXJzZSBiaXQgb3JkZXIgKG1zYiBmaXJzdCkuIFBvbHlub21pYWxzIGluIENSQyBhbGdvcml0aG1zIGFyZSB0eXBpY2FsbHkKKyAqIHJlcHJlc2VudGVkIGFzIHNob3duIGJlbG93LgorICoKKyAqCXBvbHkgPSB4XjggKyB4XjcgKyB4XjYgKyB4XjQgKyB4XjIgKyAxCisgKgorICogRm9yIG1zYiBmaXJzdCBkaXJlY3Rpb24geF43IG1hcHMgdG8gdGhlIG1zYi4gU28gdGhlIHBvbHlub21pYWwgaXMgYXMgYmVsb3cuCisgKgorICogLSBtc2IgZmlyc3Q6IHBvbHkgPSAoMSkxMTAxMDEwMSA9IDB4RDUKKyAqLwordm9pZCBjcmM4X3BvcHVsYXRlX21zYih1OCB0YWJsZVtDUkM4X1RBQkxFX1NJWkVdLCB1OCBwb2x5bm9taWFsKTsKKworLyoqCisgKiBjcmM4KCkgLSBjYWxjdWxhdGUgYSBjcmM4IG92ZXIgdGhlIGdpdmVuIGlucHV0IGRhdGEuCisgKgorICogQHRhYmxlOgljcmMgdGFibGUgdXNlZCBmb3IgY2FsY3VsYXRpb24uCisgKiBAcGRhdGE6CXBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgKiBAbmJ5dGVzOgludW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBidWZmZXIuCisgKiBAY3JjOglwcmV2aW91cyByZXR1cm5lZCBjcmM4IHZhbHVlLgorICoKKyAqIFRoZSBDUkM4IGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIHBvbHlub21pYWwgZ2l2ZW4gaW4gY3JjOF9wb3B1bGF0ZV9tc2IoKQorICogb3IgY3JjOF9wb3B1bGF0ZV9sc2IoKS4KKyAqCisgKiBUaGUgY2FsbGVyIHByb3ZpZGVzIHRoZSBpbml0aWFsIHZhbHVlIChlaXRoZXIgJUNSQzhfSU5JVF9WQUxVRQorICogb3IgdGhlIHByZXZpb3VzIHJldHVybmVkIHZhbHVlKSB0byBhbGxvdyBmb3IgcHJvY2Vzc2luZyBvZgorICogZGlzY29udGlndW91cyBibG9ja3Mgb2YgZGF0YS4gIFdoZW4gZ2VuZXJhdGluZyB0aGUgQ1JDIHRoZQorICogY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjb21wbGVtZW50aW5nIHRoZSBmaW5hbCByZXR1cm4gdmFsdWUKKyAqIGFuZCBpbnNlcnRpbmcgaXQgaW50byB0aGUgYnl0ZSBzdHJlYW0uICBXaGVuIHZhbGlkYXRpbmcgYSBieXRlCisgKiBzdHJlYW0gKGluY2x1ZGluZyBDUkM4KSwgYSBmaW5hbCByZXR1cm4gdmFsdWUgb2YgJUNSQzhfR09PRF9WQUxVRQorICogaW5kaWNhdGVzIHRoZSBieXRlIHN0cmVhbSBkYXRhIGNhbiBiZSBjb25zaWRlcmVkIHZhbGlkLgorICoKKyAqIFJlZmVyZW5jZToKKyAqICJBIFBhaW5sZXNzIEd1aWRlIHRvIENSQyBFcnJvciBEZXRlY3Rpb24gQWxnb3JpdGhtcyIsIHZlciAzLCBBdWcgMTk5MworICogV2lsbGlhbXMsIFJvc3MgTi4sIHJvc3M8YXQ+cm9zcy5uZXQKKyAqIChzZWUgVVJMIGh0dHA6Ly93d3cucm9zcy5uZXQvY3JjL2Rvd25sb2FkL2NyY192My50eHQpLgorICovCit1OCBjcmM4KGNvbnN0IHU4IHRhYmxlW0NSQzhfVEFCTEVfU0laRV0sIHU4ICpwZGF0YSwgc2l6ZV90IG5ieXRlcywgdTggY3JjKTsKKworI2VuZGlmIC8qIF9fQ1JDOF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcmVkLmggYi9pbmNsdWRlL2xpbnV4L2NyZWQuaAppbmRleCA4MjYwNzk5Li5mMjQwZjJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NyZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NyZWQuaApAQCAtMjg0LDcgKzI4NCw2IEBACiAJKHsJCQkJCQkJCVwKIAkJY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpfX3QgPSAodGFzayk7CQkJXAogCQlyY3VfZGVyZWZlcmVuY2VfY2hlY2soX190LT5yZWFsX2NyZWQsCQkJXAotCQkJCSAgICAgIHJjdV9yZWFkX2xvY2tfaGVsZCgpIHx8CQlcCiAJCQkJICAgICAgdGFza19pc19kZWFkKF9fdCkpOwkJXAogCX0pCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3R5cGUuaCBiL2luY2x1ZGUvbGludXgvY3R5cGUuaAppbmRleCBhM2Q2ZWUwLi44YWNmZTMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2N0eXBlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jdHlwZS5oCkBAIC01Miw0ICs1MiwxMyBAQAogI2RlZmluZSB0b2xvd2VyKGMpIF9fdG9sb3dlcihjKQogI2RlZmluZSB0b3VwcGVyKGMpIF9fdG91cHBlcihjKQogCisvKgorICogRmFzdCBpbXBsZW1lbnRhdGlvbiBvZiB0b2xvd2VyKCkgZm9yIGludGVybmFsIHVzYWdlLiBEbyBub3QgdXNlIGluIHlvdXIKKyAqIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciBfdG9sb3dlcihjb25zdCBjaGFyIGMpCit7CisJcmV0dXJuIGMgfCAweDIwOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGNhY2hlLmggYi9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCmluZGV4IDE5ZDkwYTUuLjNmMjJkOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaApAQCAtMjE2LDYgKzIxNiw3IEBACiAjZGVmaW5lIERDQUNIRV9NT1VOVEVECQkweDEwMDAwCS8qIGlzIGEgbW91bnRwb2ludCAqLwogI2RlZmluZSBEQ0FDSEVfTkVFRF9BVVRPTU9VTlQJMHgyMDAwMAkvKiBoYW5kbGUgYXV0b21vdW50IG9uIHRoaXMgZGlyICovCiAjZGVmaW5lIERDQUNIRV9NQU5BR0VfVFJBTlNJVAkweDQwMDAwCS8qIG1hbmFnZSB0cmFuc2l0IGZyb20gdGhpcyBkaXJlbnQgKi8KKyNkZWZpbmUgRENBQ0hFX05FRURfTE9PS1VQCTB4ODAwMDAgLyogZGVudHJ5IHJlcXVpcmVzIGlfb3AtPmxvb2t1cCAqLwogI2RlZmluZSBEQ0FDSEVfTUFOQUdFRF9ERU5UUlkgXAogCShEQ0FDSEVfTU9VTlRFRHxEQ0FDSEVfTkVFRF9BVVRPTU9VTlR8RENBQ0hFX01BTkFHRV9UUkFOU0lUKQogCkBAIC00MTYsNyArNDE3LDEyIEBACiAJcmV0dXJuIGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9NT1VOVEVEOwogfQogCi1leHRlcm4gc3RydWN0IGRlbnRyeSAqbG9va3VwX2NyZWF0ZShzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgaW50IGlzX2Rpcik7CitzdGF0aWMgaW5saW5lIGJvb2wgZF9uZWVkX2xvb2t1cChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ORUVEX0xPT0tVUDsKK30KKworZXh0ZXJuIHZvaWQgZF9jbGVhcl9uZWVkX2xvb2t1cChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogCiBleHRlcm4gaW50IHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGNibmwuaCBiL2luY2x1ZGUvbGludXgvZGNibmwuaAppbmRleCBjNTIyODAwLi42NWEyNTYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjYm5sLmgKKysrIGIvaW5jbHVkZS9saW51eC9kY2JubC5oCkBAIC0yMDMsNiArMjAzLDcgQEAKICAqIEBEQ0JfQ01EX0dGRUFUQ0ZHOiBnZXQgRENCWCBmZWF0dXJlcyBmbGFncwogICogQERDQl9DTURfU0ZFQVRDRkc6IHNldCBEQ0JYIGZlYXR1cmVzIG5lZ290aWF0aW9uIGZsYWdzCiAgKiBARENCX0NNRF9DRUVfR0VUOiBnZXQgQ0VFIGFnZ3JlZ2F0ZWQgY29uZmlndXJhdGlvbgorICogQERDQl9DTURfSUVFRV9ERUw6IGRlbGV0ZSBJRUVFIDgwMi4xUWF6IGNvbmZpZ3VyYXRpb24KICAqLwogZW51bSBkY2JubF9jb21tYW5kcyB7CiAJRENCX0NNRF9VTkRFRklORUQsCkBAIC0yNDYsNiArMjQ3LDcgQEAKIAlEQ0JfQ01EX1NGRUFUQ0ZHLAogCiAJRENCX0NNRF9DRUVfR0VULAorCURDQl9DTURfSUVFRV9ERUwsCiAKIAlfX0RDQl9DTURfRU5VTV9NQVgsCiAJRENCX0NNRF9NQVggPSBfX0RDQl9DTURfRU5VTV9NQVggLSAxLApAQCAtMzMxLDE4ICszMzMsMzAgQEAKICNkZWZpbmUgRENCX0FUVFJfSUVFRV9BUFBfTUFYIChfX0RDQl9BVFRSX0lFRUVfQVBQX01BWCAtIDEpCiAKIC8qKgotICogZW51bSBjZWVfYXR0cnMgLSBDRUUgRENCWCBnZXQgYXR0cmlidXRlcworICogZW51bSBjZWVfYXR0cnMgLSBDRUUgRENCWCBnZXQgYXR0cmlidXRlcy4KICAqCiAgKiBARENCX0FUVFJfQ0VFX1VOU1BFQzogdW5zcGVjaWZpZWQKICAqIEBEQ0JfQVRUUl9DRUVfUEVFUl9QRzogcGVlciBQRyBjb25maWd1cmF0aW9uIC0gZ2V0IG9ubHkKICAqIEBEQ0JfQVRUUl9DRUVfUEVFUl9QRkM6IHBlZXIgUEZDIGNvbmZpZ3VyYXRpb24gLSBnZXQgb25seQotICogQERDQl9BVFRSX0NFRV9QRUVSX0FQUDogcGVlciBBUFAgdGx2IC0gZ2V0IG9ubHkKKyAqIEBEQ0JfQVRUUl9DRUVfUEVFUl9BUFBfVEFCTEU6IHBlZXIgQVBQIHRsdiAtIGdldCBvbmx5CisgKiBARENCX0FUVFJfQ0VFX1RYX1BHOiBUWCBQRyBjb25maWd1cmF0aW9uIChEQ0JfQ01EX1BHVFhfR0NGRykKKyAqIEBEQ0JfQVRUUl9DRUVfUlhfUEc6IFJYIFBHIGNvbmZpZ3VyYXRpb24gKERDQl9DTURfUEdSWF9HQ0ZHKQorICogQERDQl9BVFRSX0NFRV9QRkM6IFBGQyBjb25maWd1cmF0aW9uIChEQ0JfQ01EX1BGQ19HQ0ZHKQorICogQERDQl9BVFRSX0NFRV9BUFBfVEFCTEU6IEFQUCBjb25maWd1cmF0aW9uIChtdWx0aSBEQ0JfQ01EX0dBUFApCisgKiBARENCX0FUVFJfQ0VFX0ZFQVQ6IERDQlggZmVhdHVyZXMgZmxhZ3MgKERDQl9DTURfR0ZFQVRDRkcpCisgKgorICogQW4gYWdncmVnYXRlZCBjb2xsZWN0aW9uIG9mIHRoZSBjZWUgc3RkIG5lZ290aWF0ZWQgcGFyYW1ldGVycy4KICAqLwogZW51bSBjZWVfYXR0cnMgewogCURDQl9BVFRSX0NFRV9VTlNQRUMsCiAJRENCX0FUVFJfQ0VFX1BFRVJfUEcsCiAJRENCX0FUVFJfQ0VFX1BFRVJfUEZDLAogCURDQl9BVFRSX0NFRV9QRUVSX0FQUF9UQUJMRSwKKwlEQ0JfQVRUUl9DRUVfVFhfUEcsCisJRENCX0FUVFJfQ0VFX1JYX1BHLAorCURDQl9BVFRSX0NFRV9QRkMsCisJRENCX0FUVFJfQ0VFX0FQUF9UQUJMRSwKKwlEQ0JfQVRUUl9DRUVfRkVBVCwKIAlfX0RDQl9BVFRSX0NFRV9NQVgKIH07CiAjZGVmaW5lIERDQl9BVFRSX0NFRV9NQVggKF9fRENCX0FUVFJfQ0VFX01BWCAtIDEpCkBAIC0zNTUsNiArMzY5LDEzIEBACiB9OwogI2RlZmluZSBEQ0JfQVRUUl9DRUVfUEVFUl9BUFBfTUFYIChfX0RDQl9BVFRSX0NFRV9QRUVSX0FQUF9NQVggLSAxKQogCitlbnVtIGNlZV9hdHRyc19hcHAgeworCURDQl9BVFRSX0NFRV9BUFBfVU5TUEVDLAorCURDQl9BVFRSX0NFRV9BUFAsCisJX19EQ0JfQVRUUl9DRUVfQVBQX01BWAorfTsKKyNkZWZpbmUgRENCX0FUVFJfQ0VFX0FQUF9NQVggKF9fRENCX0FUVFJfQ0VFX0FQUF9NQVggLSAxKQorCiAvKioKICAqIGVudW0gZGNibmxfcGZjX2F0dHJzIC0gRENCIFByaW9yaXR5IEZsb3cgQ29udHJvbCB1c2VyIHByaW9yaXR5IG5lc3RlZCBhdHRycwogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGNjcC5oIGIvaW5jbHVkZS9saW51eC9kY2NwLmgKaW5kZXggZDYzOGU4NS4uNzEwYzA0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kY2NwLmgKKysrIGIvaW5jbHVkZS9saW51eC9kY2NwLmgKQEAgLTIzNiw2ICsyMzYsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCBjNjYxMTFhLi4xNjBkNGRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTUxNiw3ICs1MTYsNyBAQAogICogCQltaW5pbWl6ZXMgYm9hcmQtc3BlY2lmaWMgI2lmZGVmcyBpbiBkcml2ZXJzLgogICogQHBvd2VyOglGb3IgZGV2aWNlIHBvd2VyIG1hbmFnZW1lbnQuCiAgKiAJCVNlZSBEb2N1bWVudGF0aW9uL3Bvd2VyL2RldmljZXMudHh0IGZvciBkZXRhaWxzLgotICogQHB3cl9kb21haW46CVByb3ZpZGUgY2FsbGJhY2tzIHRoYXQgYXJlIGV4ZWN1dGVkIGR1cmluZyBzeXN0ZW0gc3VzcGVuZCwKKyAqIEBwbV9kb21haW46CVByb3ZpZGUgY2FsbGJhY2tzIHRoYXQgYXJlIGV4ZWN1dGVkIGR1cmluZyBzeXN0ZW0gc3VzcGVuZCwKICAqIAkJaGliZXJuYXRpb24sIHN5c3RlbSByZXN1bWUgYW5kIGR1cmluZyBydW50aW1lIFBNIHRyYW5zaXRpb25zCiAgKiAJCWFsb25nIHdpdGggc3Vic3lzdGVtLWxldmVsIGFuZCBkcml2ZXItbGV2ZWwgY2FsbGJhY2tzLgogICogQG51bWFfbm9kZToJTlVNQSBub2RlIHRoaXMgZGV2aWNlIGlzIGNsb3NlIHRvLgpAQCAtNTMwLDcgKzUzMCw2IEBACiAgKiBAZG1hX21lbToJSW50ZXJuYWwgZm9yIGNvaGVyZW50IG1lbSBvdmVycmlkZS4KICAqIEBhcmNoZGF0YToJRm9yIGFyY2gtc3BlY2lmaWMgYWRkaXRpb25zLgogICogQG9mX25vZGU6CUFzc29jaWF0ZWQgZGV2aWNlIHRyZWUgbm9kZS4KLSAqIEBvZl9tYXRjaDoJTWF0Y2hpbmcgb2ZfZGV2aWNlX2lkIGZyb20gZHJpdmVyLgogICogQGRldnQ6CUZvciBjcmVhdGluZyB0aGUgc3lzZnMgImRldiIuCiAgKiBAZGV2cmVzX2xvY2s6IFNwaW5sb2NrIHRvIHByb3RlY3QgdGhlIHJlc291cmNlIG9mIHRoZSBkZXZpY2UuCiAgKiBAZGV2cmVzX2hlYWQ6IFRoZSByZXNvdXJjZXMgbGlzdCBvZiB0aGUgZGV2aWNlLgpAQCAtNTY4LDcgKzU2Nyw3IEBACiAJdm9pZAkJKnBsYXRmb3JtX2RhdGE7CS8qIFBsYXRmb3JtIHNwZWNpZmljIGRhdGEsIGRldmljZQogCQkJCQkgICBjb3JlIGRvZXNuJ3QgdG91Y2ggaXQgKi8KIAlzdHJ1Y3QgZGV2X3BtX2luZm8JcG93ZXI7Ci0Jc3RydWN0IGRldl9wb3dlcl9kb21haW4JKnB3cl9kb21haW47CisJc3RydWN0IGRldl9wbV9kb21haW4JKnBtX2RvbWFpbjsKIAogI2lmZGVmIENPTkZJR19OVU1BCiAJaW50CQludW1hX25vZGU7CS8qIE5VTUEgbm9kZSB0aGlzIGRldmljZSBpcyBjbG9zZSB0byAqLwpAQCAtNjU0LDEzICs2NTMsMTMgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGRldmljZV9lbmFibGVfYXN5bmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKCFkZXYtPnBvd2VyLmluX3N1c3BlbmQpCisJaWYgKCFkZXYtPnBvd2VyLmlzX3ByZXBhcmVkKQogCQlkZXYtPnBvd2VyLmFzeW5jX3N1c3BlbmQgPSB0cnVlOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGV2aWNlX2Rpc2FibGVfYXN5bmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKCFkZXYtPnBvd2VyLmluX3N1c3BlbmQpCisJaWYgKCFkZXYtPnBvd2VyLmlzX3ByZXBhcmVkKQogCQlkZXYtPnBvd2VyLmFzeW5jX3N1c3BlbmQgPSBmYWxzZTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2VfY2dyb3VwLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZV9jZ3JvdXAuaAppbmRleCAwYjBkOWMzLi43YWFkMWY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZV9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZV9jZ3JvdXAuaApAQCAtMiw4ICsyLDE2IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KIAogI2lmZGVmIENPTkZJR19DR1JPVVBfREVWSUNFCi1leHRlcm4gaW50IGRldmNncm91cF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKTsKK2V4dGVybiBpbnQgX19kZXZjZ3JvdXBfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiBleHRlcm4gaW50IGRldmNncm91cF9pbm9kZV9ta25vZChpbnQgbW9kZSwgZGV2X3QgZGV2KTsKK3N0YXRpYyBpbmxpbmUgaW50IGRldmNncm91cF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQoreworCWlmIChsaWtlbHkoIWlub2RlLT5pX3JkZXYpKQorCQlyZXR1cm4gMDsKKwlpZiAoIVNfSVNCTEsoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAwOworCXJldHVybiBfX2RldmNncm91cF9pbm9kZV9wZXJtaXNzaW9uKGlub2RlLCBtYXNrKTsKK30KICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBkZXZjZ3JvdXBfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGlvLmggYi9pbmNsdWRlL2xpbnV4L2Rpby5oCmluZGV4IGIyZGQzMWMuLjJjYzBmZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9kaW8uaApAQCAtMjU0LDcgKzI1NCw3IEBACiAKICNkZWZpbmUgZGlvX3Jlc291cmNlX3N0YXJ0KGQpICgoZCktPnJlc291cmNlLnN0YXJ0KQogI2RlZmluZSBkaW9fcmVzb3VyY2VfZW5kKGQpICAgKChkKS0+cmVzb3VyY2UuZW5kKQotI2RlZmluZSBkaW9fcmVzb3VyY2VfbGVuKGQpICAgKChkKS0+cmVzb3VyY2UuZW5kLShkKS0+cmVzb3VyY2Uuc3RhcnQrMSkKKyNkZWZpbmUgZGlvX3Jlc291cmNlX2xlbihkKSAgIChyZXNvdXJjZV9zaXplKCYoZCktPnJlc291cmNlKSkKICNkZWZpbmUgZGlvX3Jlc291cmNlX2ZsYWdzKGQpICgoZCktPnJlc291cmNlLmZsYWdzKQogCiAjZGVmaW5lIGRpb19yZXF1ZXN0X2RldmljZShkLCBuYW1lKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYS1kaXJlY3Rpb24uaCBiL2luY2x1ZGUvbGludXgvZG1hLWRpcmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YjZhODIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYS1kaXJlY3Rpb24uaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9MSU5VWF9ETUFfRElSRUNUSU9OX0gKKyNkZWZpbmUgX0xJTlVYX0RNQV9ESVJFQ1RJT05fSAorLyoKKyAqIFRoZXNlIGRlZmluaXRpb25zIG1pcnJvciB0aG9zZSBpbiBwY2kuaCwgc28gdGhleSBjYW4gYmUgdXNlZAorICogaW50ZXJjaGFuZ2VhYmx5IHdpdGggdGhlaXIgUENJXyBjb3VudGVycGFydHMuCisgKi8KK2VudW0gZG1hX2RhdGFfZGlyZWN0aW9uIHsKKwlETUFfQklESVJFQ1RJT05BTCA9IDAsCisJRE1BX1RPX0RFVklDRSA9IDEsCisJRE1BX0ZST01fREVWSUNFID0gMiwKKwlETUFfTk9ORSA9IDMsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKaW5kZXggYmE4MzE5YS4uMWExNjdjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaApAQCAtNCwxNyArNCw5IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWF0dHJzLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLWRpcmVjdGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAKLS8qIFRoZXNlIGRlZmluaXRpb25zIG1pcnJvciB0aG9zZSBpbiBwY2kuaCwgc28gdGhleSBjYW4gYmUgdXNlZAotICogaW50ZXJjaGFuZ2VhYmx5IHdpdGggdGhlaXIgUENJXyBjb3VudGVycGFydHMgKi8KLWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIHsKLQlETUFfQklESVJFQ1RJT05BTCA9IDAsCi0JRE1BX1RPX0RFVklDRSA9IDEsCi0JRE1BX0ZST01fREVWSUNFID0gMiwKLQlETUFfTk9ORSA9IDMsCi19OwotCiBzdHJ1Y3QgZG1hX21hcF9vcHMgewogCXZvaWQqICgqYWxsb2NfY29oZXJlbnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCiAJCQkJZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZ2ZwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmggYi9pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oCmluZGV4IGVlZTdhZGQuLjhmYmY0MGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaApAQCAtMjMsNyArMjMsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtZGlyZWN0aW9uLmg+CisKK3N0cnVjdCBzY2F0dGVybGlzdDsKIAogLyoqCiAgKiB0eXBlZGVmIGRtYV9jb29raWVfdCAtIGFuIG9wYXF1ZSBETUEgY29va2llCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RyYmRfbGltaXRzLmggYi9pbmNsdWRlL2xpbnV4L2RyYmRfbGltaXRzLmgKaW5kZXggMjQ2ZjU3Ni4uNDQ3YzM2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kcmJkX2xpbWl0cy5oCisrKyBiL2luY2x1ZGUvbGludXgvZHJiZF9saW1pdHMuaApAQCAtMTE3LDEwICsxMTcsMTAgQEAKIC8qIGRyYmRzZXR1cCBYWSByZXNpemUgLWQgWgogICogeW91IGFyZSBmcmVlIHRvIHJlZHVjZSB0aGUgZGV2aWNlIHNpemUgdG8gbm90aGluZywgaWYgeW91IHdhbnQgdG8uCiAgKiB0aGUgdXBwZXIgbGltaXQgd2l0aCA2NGJpdCBrZXJuZWwsIGVub3VnaCByYW0gYW5kIGZsZXhpYmxlIG1ldGEgZGF0YQotICogaXMgMTYgVEIsIGN1cnJlbnRseS4gKi8KKyAqIGlzIDEgUGlCLCBjdXJyZW50bHkuICovCiAvKiBEUkJEX01BWF9TRUNUT1JTICovCiAjZGVmaW5lIERSQkRfRElTS19TSVpFX1NFQ1RfTUlOICAwCi0jZGVmaW5lIERSQkRfRElTS19TSVpFX1NFQ1RfTUFYICAoMTYgKiAoMkxMVSA8PCAzMCkpCisjZGVmaW5lIERSQkRfRElTS19TSVpFX1NFQ1RfTUFYICAoMSAqICgyTExVIDw8IDQwKSkKICNkZWZpbmUgRFJCRF9ESVNLX1NJWkVfU0VDVF9ERUYgIDAgLyogPSBkaXNhYmxlZCA9IG5vIHVzZXIgc2l6ZS4uLiAqLwogCiAjZGVmaW5lIERSQkRfT05fSU9fRVJST1JfREVGIEVQX1BBU1NfT04KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZHdfYXBiX3RpbWVyLmggYi9pbmNsdWRlL2xpbnV4L2R3X2FwYl90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjM4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2R3X2FwYl90aW1lci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSmFjb2IgUGFuIChqYWNvYi5qdW4ucGFuQGludGVsLmNvbSkKKyAqCisgKiBTaGFyZWQgd2l0aCBBUk0gcGxhdGZvcm1zLCBKYW1pZSBJbGVzLCBQaWNvY2hpcCAyMDExCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBTdXBwb3J0IGZvciB0aGUgU3lub3BzeXMgRGVzaWduV2FyZSBBUEIgVGltZXJzLgorICovCisjaWZuZGVmIF9fRFdfQVBCX1RJTUVSX0hfXworI2RlZmluZSBfX0RXX0FQQl9USU1FUl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjZGVmaW5lIEFQQlRNUlNfUkVHX1NJWkUgICAgICAgMHgxNAorCitzdHJ1Y3QgZHdfYXBiX3RpbWVyIHsKKwl2b2lkIF9faW9tZW0JCQkJKmJhc2U7CisJdW5zaWduZWQgbG9uZwkJCQlmcmVxOworCWludAkJCQkJaXJxOworfTsKKworc3RydWN0IGR3X2FwYl9jbG9ja19ldmVudF9kZXZpY2UgeworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UJCWNlZDsKKwlzdHJ1Y3QgZHdfYXBiX3RpbWVyCQkJdGltZXI7CisJc3RydWN0IGlycWFjdGlvbgkJCWlycWFjdGlvbjsKKwl2b2lkCQkJCQkoKmVvaSkoc3RydWN0IGR3X2FwYl90aW1lciAqKTsKK307CisKK3N0cnVjdCBkd19hcGJfY2xvY2tzb3VyY2UgeworCXN0cnVjdCBkd19hcGJfdGltZXIJCQl0aW1lcjsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UJCQljczsKK307CisKK3ZvaWQgZHdfYXBiX2Nsb2NrZXZlbnRfcmVnaXN0ZXIoc3RydWN0IGR3X2FwYl9jbG9ja19ldmVudF9kZXZpY2UgKmR3X2NlZCk7Cit2b2lkIGR3X2FwYl9jbG9ja2V2ZW50X3BhdXNlKHN0cnVjdCBkd19hcGJfY2xvY2tfZXZlbnRfZGV2aWNlICpkd19jZWQpOwordm9pZCBkd19hcGJfY2xvY2tldmVudF9yZXN1bWUoc3RydWN0IGR3X2FwYl9jbG9ja19ldmVudF9kZXZpY2UgKmR3X2NlZCk7Cit2b2lkIGR3X2FwYl9jbG9ja2V2ZW50X3N0b3Aoc3RydWN0IGR3X2FwYl9jbG9ja19ldmVudF9kZXZpY2UgKmR3X2NlZCk7CisKK3N0cnVjdCBkd19hcGJfY2xvY2tfZXZlbnRfZGV2aWNlICoKK2R3X2FwYl9jbG9ja2V2ZW50X2luaXQoaW50IGNwdSwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgcmF0aW5nLAorCQkgICAgICAgdm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgaXJxLCB1bnNpZ25lZCBsb25nIGZyZXEpOworc3RydWN0IGR3X2FwYl9jbG9ja3NvdXJjZSAqCitkd19hcGJfY2xvY2tzb3VyY2VfaW5pdCh1bnNpZ25lZCByYXRpbmcsIGNoYXIgKm5hbWUsIHZvaWQgX19pb21lbSAqYmFzZSwKKwkJCXVuc2lnbmVkIGxvbmcgZnJlcSk7Cit2b2lkIGR3X2FwYl9jbG9ja3NvdXJjZV9yZWdpc3RlcihzdHJ1Y3QgZHdfYXBiX2Nsb2Nrc291cmNlICpkd19jcyk7Cit2b2lkIGR3X2FwYl9jbG9ja3NvdXJjZV9zdGFydChzdHJ1Y3QgZHdfYXBiX2Nsb2Nrc291cmNlICpkd19jcyk7CitjeWNsZV90IGR3X2FwYl9jbG9ja3NvdXJjZV9yZWFkKHN0cnVjdCBkd19hcGJfY2xvY2tzb3VyY2UgKmR3X2NzKTsKK3ZvaWQgZHdfYXBiX2Nsb2Nrc291cmNlX3VucmVnaXN0ZXIoc3RydWN0IGR3X2FwYl9jbG9ja3NvdXJjZSAqZHdfY3MpOworCisjZW5kaWYgLyogX19EV19BUEJfVElNRVJfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VlcHJvbV85M3h4NDYuaCBiL2luY2x1ZGUvbGludXgvZWVwcm9tXzkzeHg0Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzkxODEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2VlcHJvbV85M3h4NDYuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogTW9kdWxlOiBlZXByb21fOTN4eDQ2CisgKiBwbGF0Zm9ybSBkZXNjcmlwdGlvbiBmb3IgOTN4eDQ2IEVFUFJPTXMuCisgKi8KKworc3RydWN0IGVlcHJvbV85M3h4NDZfcGxhdGZvcm1fZGF0YSB7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKyNkZWZpbmUgRUVfQUREUjgJMHgwMQkJLyogIDggYml0IGFkZHIuIGNmZyAqLworI2RlZmluZSBFRV9BRERSMTYJMHgwMgkJLyogMTYgYml0IGFkZHIuIGNmZyAqLworI2RlZmluZSBFRV9SRUFET05MWQkweDA4CQkvKiBmb3JiaWQgd3JpdGluZyAqLworCisJLyoKKwkgKiBvcHRpb25hbCBob29rcyB0byBjb250cm9sIGFkZGl0aW9uYWwgbG9naWMKKwkgKiBiZWZvcmUgYW5kIGFmdGVyIHNwaSB0cmFuc2Zlci4KKwkgKi8KKwl2b2lkICgqcHJlcGFyZSkodm9pZCAqKTsKKwl2b2lkICgqZmluaXNoKSh2b2lkICopOworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWZpLmggYi9pbmNsdWRlL2xpbnV4L2VmaS5oCmluZGV4IGUzNzYyNzAuLmVjMjU3MjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWZpLmgKKysrIGIvaW5jbHVkZS9saW51eC9lZmkuaApAQCAtMTAxLDYgKzEwMSwxMyBAQAogCXU2NCBhdHRyaWJ1dGU7CiB9IGVmaV9tZW1vcnlfZGVzY190OwogCit0eXBlZGVmIHN0cnVjdCB7CisJZWZpX2d1aWRfdCBndWlkOworCXUzMiBoZWFkZXJzaXplOworCXUzMiBmbGFnczsKKwl1MzIgaW1hZ2VzaXplOworfSBlZmlfY2Fwc3VsZV9oZWFkZXJfdDsKKwogdHlwZWRlZiBpbnQgKCplZmlfZnJlZW1lbV9jYWxsYmFja190KSAodTY0IHN0YXJ0LCB1NjQgZW5kLCB2b2lkICphcmcpOwogCiAvKgpAQCAtMTU2LDYgKzE2Myw5IEBACiAJdW5zaWduZWQgbG9uZyBzZXRfdmFyaWFibGU7CiAJdW5zaWduZWQgbG9uZyBnZXRfbmV4dF9oaWdoX21vbm9fY291bnQ7CiAJdW5zaWduZWQgbG9uZyByZXNldF9zeXN0ZW07CisJdW5zaWduZWQgbG9uZyB1cGRhdGVfY2Fwc3VsZTsKKwl1bnNpZ25lZCBsb25nIHF1ZXJ5X2NhcHN1bGVfY2FwczsKKwl1bnNpZ25lZCBsb25nIHF1ZXJ5X3ZhcmlhYmxlX2luZm87CiB9IGVmaV9ydW50aW1lX3NlcnZpY2VzX3Q7CiAKIHR5cGVkZWYgZWZpX3N0YXR1c190IGVmaV9nZXRfdGltZV90IChlZmlfdGltZV90ICp0bSwgZWZpX3RpbWVfY2FwX3QgKnRjKTsKQEAgLTE2OCw3ICsxNzgsNyBAQAogdHlwZWRlZiBlZmlfc3RhdHVzX3QgZWZpX2dldF9uZXh0X3ZhcmlhYmxlX3QgKHVuc2lnbmVkIGxvbmcgKm5hbWVfc2l6ZSwgZWZpX2NoYXIxNl90ICpuYW1lLAogCQkJCQkgICAgICBlZmlfZ3VpZF90ICp2ZW5kb3IpOwogdHlwZWRlZiBlZmlfc3RhdHVzX3QgZWZpX3NldF92YXJpYWJsZV90IChlZmlfY2hhcjE2X3QgKm5hbWUsIGVmaV9ndWlkX3QgKnZlbmRvciwgCi0JCQkJCSB1bnNpZ25lZCBsb25nIGF0dHIsIHVuc2lnbmVkIGxvbmcgZGF0YV9zaXplLCAKKwkJCQkJIHUzMiBhdHRyLCB1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZSwKIAkJCQkJIHZvaWQgKmRhdGEpOwogdHlwZWRlZiBlZmlfc3RhdHVzX3QgZWZpX2dldF9uZXh0X2hpZ2hfbW9ub19jb3VudF90ICh1MzIgKmNvdW50KTsKIHR5cGVkZWYgdm9pZCBlZmlfcmVzZXRfc3lzdGVtX3QgKGludCByZXNldF90eXBlLCBlZmlfc3RhdHVzX3Qgc3RhdHVzLApAQCAtMTc3LDYgKzE4NywxNyBAQAogCQkJCQkJdW5zaWduZWQgbG9uZyBkZXNjcmlwdG9yX3NpemUsCiAJCQkJCQl1MzIgZGVzY3JpcHRvcl92ZXJzaW9uLAogCQkJCQkJZWZpX21lbW9yeV9kZXNjX3QgKnZpcnR1YWxfbWFwKTsKK3R5cGVkZWYgZWZpX3N0YXR1c190IGVmaV9xdWVyeV92YXJpYWJsZV9pbmZvX3QodTMyIGF0dHIsCisJCQkJCSAgICAgICB1NjQgKnN0b3JhZ2Vfc3BhY2UsCisJCQkJCSAgICAgICB1NjQgKnJlbWFpbmluZ19zcGFjZSwKKwkJCQkJICAgICAgIHU2NCAqbWF4X3ZhcmlhYmxlX3NpemUpOwordHlwZWRlZiBlZmlfc3RhdHVzX3QgZWZpX3VwZGF0ZV9jYXBzdWxlX3QoZWZpX2NhcHN1bGVfaGVhZGVyX3QgKipjYXBzdWxlcywKKwkJCQkJICB1bnNpZ25lZCBsb25nIGNvdW50LAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgc2dfbGlzdCk7Cit0eXBlZGVmIGVmaV9zdGF0dXNfdCBlZmlfcXVlcnlfY2Fwc3VsZV9jYXBzX3QoZWZpX2NhcHN1bGVfaGVhZGVyX3QgKipjYXBzdWxlcywKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJCQkJICAgICAgdTY0ICptYXhfc2l6ZSwKKwkJCQkJICAgICAgaW50ICpyZXNldF90eXBlKTsKIAogLyoKICAqICBFRkkgQ29uZmlndXJhdGlvbiBUYWJsZSBhbmQgR1VJRCBkZWZpbml0aW9ucwpAQCAtMjE4LDYgKzIzOSwxMyBAQAogCiAjZGVmaW5lIEVGSV9TWVNURU1fVEFCTEVfU0lHTkFUVVJFICgodTY0KTB4NTQ1MzU5NTMyMDQ5NDI0OVVMTCkKIAorI2RlZmluZSBFRklfMl8zMF9TWVNURU1fVEFCTEVfUkVWSVNJT04gICgoMiA8PCAxNikgfCAoMzApKQorI2RlZmluZSBFRklfMl8yMF9TWVNURU1fVEFCTEVfUkVWSVNJT04gICgoMiA8PCAxNikgfCAoMjApKQorI2RlZmluZSBFRklfMl8xMF9TWVNURU1fVEFCTEVfUkVWSVNJT04gICgoMiA8PCAxNikgfCAoMTApKQorI2RlZmluZSBFRklfMl8wMF9TWVNURU1fVEFCTEVfUkVWSVNJT04gICgoMiA8PCAxNikgfCAoMDApKQorI2RlZmluZSBFRklfMV8xMF9TWVNURU1fVEFCTEVfUkVWSVNJT04gICgoMSA8PCAxNikgfCAoMTApKQorI2RlZmluZSBFRklfMV8wMl9TWVNURU1fVEFCTEVfUkVWSVNJT04gICgoMSA8PCAxNikgfCAoMDIpKQorCiB0eXBlZGVmIHN0cnVjdCB7CiAJZWZpX3RhYmxlX2hkcl90IGhkcjsKIAl1bnNpZ25lZCBsb25nIGZ3X3ZlbmRvcjsJLyogcGh5c2ljYWwgYWRkciBvZiBDSEFSMTYgdmVuZG9yIHN0cmluZyAqLwpAQCAtMjUwLDYgKzI3OCw3IEBACiAgKi8KIGV4dGVybiBzdHJ1Y3QgZWZpIHsKIAllZmlfc3lzdGVtX3RhYmxlX3QgKnN5c3RhYjsJLyogRUZJIHN5c3RlbSB0YWJsZSAqLworCXVuc2lnbmVkIGludCBydW50aW1lX3ZlcnNpb247CS8qIFJ1bnRpbWUgc2VydmljZXMgdmVyc2lvbiAqLwogCXVuc2lnbmVkIGxvbmcgbXBzOwkJLyogTVBTIHRhYmxlICovCiAJdW5zaWduZWQgbG9uZyBhY3BpOwkJLyogQUNQSSB0YWJsZSAgKElBNjQgZXh0IDAuNzEpICovCiAJdW5zaWduZWQgbG9uZyBhY3BpMjA7CQkvKiBBQ1BJIHRhYmxlICAoQUNQSSAyLjApICovCkBAIC0yNjYsNiArMjk1LDkgQEAKIAllZmlfZ2V0X3ZhcmlhYmxlX3QgKmdldF92YXJpYWJsZTsKIAllZmlfZ2V0X25leHRfdmFyaWFibGVfdCAqZ2V0X25leHRfdmFyaWFibGU7CiAJZWZpX3NldF92YXJpYWJsZV90ICpzZXRfdmFyaWFibGU7CisJZWZpX3F1ZXJ5X3ZhcmlhYmxlX2luZm9fdCAqcXVlcnlfdmFyaWFibGVfaW5mbzsKKwllZmlfdXBkYXRlX2NhcHN1bGVfdCAqdXBkYXRlX2NhcHN1bGU7CisJZWZpX3F1ZXJ5X2NhcHN1bGVfY2Fwc190ICpxdWVyeV9jYXBzdWxlX2NhcHM7CiAJZWZpX2dldF9uZXh0X2hpZ2hfbW9ub19jb3VudF90ICpnZXRfbmV4dF9oaWdoX21vbm9fY291bnQ7CiAJZWZpX3Jlc2V0X3N5c3RlbV90ICpyZXNldF9zeXN0ZW07CiAJZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwX3QgKnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oIGIvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCmluZGV4IDIxYThlYmYuLmQ4MDBkNTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKQEAgLTE0Niw3ICsxNDYsNyBAQAogLyoKICAqIHJiIHN1cHBvcnQgZnVuY3Rpb25zLgogICovCi1leHRlcm4gc3RydWN0IHJlcXVlc3QgKmVsdl9yYl9hZGQoc3RydWN0IHJiX3Jvb3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CitleHRlcm4gdm9pZCBlbHZfcmJfYWRkKHN0cnVjdCByYl9yb290ICosIHN0cnVjdCByZXF1ZXN0ICopOwogZXh0ZXJuIHZvaWQgZWx2X3JiX2RlbChzdHJ1Y3QgcmJfcm9vdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIGV4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqZWx2X3JiX2ZpbmQoc3RydWN0IHJiX3Jvb3QgKiwgc2VjdG9yX3QpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgKaW5kZXggYWI2OGY3OC4uMDU5NTVjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaApAQCAtMzgsNyArMzgsNyBAQAogCQkgICAgICBjb25zdCB2b2lkICpkYWRkciwgY29uc3Qgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbik7CiBleHRlcm4gaW50IGV0aF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBpbnQgZXRoX2hlYWRlcl9wYXJzZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyICpoYWRkcik7Ci1leHRlcm4gaW50IGV0aF9oZWFkZXJfY2FjaGUoY29uc3Qgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBoaF9jYWNoZSAqaGgpOworZXh0ZXJuIGludCBldGhfaGVhZGVyX2NhY2hlKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3QgaGhfY2FjaGUgKmhoLCBfX2JlMTYgdHlwZSk7CiBleHRlcm4gdm9pZCBldGhfaGVhZGVyX2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaGhfY2FjaGUgKmhoLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpoYWRkcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaCBiL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCmluZGV4IGM2YTg1MGEuLmM2ZTQyN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCisrKyBiL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCkBAIC0yNjgsNyArMjY4LDcgQEAKIAlfX3UzMgljbWQ7CS8qIEVUSFRPT0xfe0csU31QQVVTRVBBUkFNICovCiAKIAkvKiBJZiB0aGUgbGluayBpcyBiZWluZyBhdXRvLW5lZ290aWF0ZWQgKHZpYSBldGh0b29sX2NtZC5hdXRvbmVnCi0JICogYmVpbmcgdHJ1ZSkgdGhlIHVzZXIgbWF5IHNldCAnYXV0b25ldCcgaGVyZSBub24temVybyB0byBoYXZlIHRoZQorCSAqIGJlaW5nIHRydWUpIHRoZSB1c2VyIG1heSBzZXQgJ2F1dG9uZWcnIGhlcmUgbm9uLXplcm8gdG8gaGF2ZSB0aGUKIAkgKiBwYXVzZSBwYXJhbWV0ZXJzIGJlIGF1dG8tbmVnb3RpYXRlZCB0b28uICBJbiBzdWNoIGEgY2FzZSwgdGhlCiAJICoge3J4LHR4fV9wYXVzZSB2YWx1ZXMgYmVsb3cgZGV0ZXJtaW5lIHdoYXQgY2FwYWJpbGl0aWVzIGFyZQogCSAqIGFkdmVydGlzZWQuCkBAIC0yODcsNyArMjg3LDcgQEAKIAlFVEhfU1NfVEVTVAkJPSAwLAogCUVUSF9TU19TVEFUUywKIAlFVEhfU1NfUFJJVl9GTEFHUywKLQlFVEhfU1NfTlRVUExFX0ZJTFRFUlMsCisJRVRIX1NTX05UVVBMRV9GSUxURVJTLAkvKiBEbyBub3QgdXNlLCBHUlhOVFVQTEUgaXMgbm93IGRlcHJlY2F0ZWQgKi8KIAlFVEhfU1NfRkVBVFVSRVMsCiB9OwogCkBAIC0zMTAsOSArMzEwLDIxIEBACiAJCQkJICAgX191MzIncywgZXRjLiAqLwogfTsKIAorLyoqCisgKiBlbnVtIGV0aHRvb2xfdGVzdF9mbGFncyAtIGZsYWdzIGRlZmluaXRpb24gb2YgZXRodG9vbF90ZXN0CisgKiBARVRIX1RFU1RfRkxfT0ZGTElORTogaWYgc2V0IHBlcmZvcm0gb25saW5lIGFuZCBvZmZsaW5lIHRlc3RzLCBvdGhlcndpc2UKKyAqCW9ubHkgb25saW5lIHRlc3RzLgorICogQEVUSF9URVNUX0ZMX0ZBSUxFRDogRHJpdmVyIHNldCB0aGlzIGZsYWcgaWYgdGVzdCBmYWlscy4KKyAqIEBFVEhfVEVTVF9GTF9FWFRFUk5BTF9MQjogQXBwbGljYXRpb24gcmVxdWVzdCB0byBwZXJmb3JtIGV4dGVybmFsIGxvb3BiYWNrCisgKgl0ZXN0LgorICogQEVUSF9URVNUX0ZMX0VYVEVSTkFMX0xCX0RPTkU6IERyaXZlciBwZXJmb3JtZWQgdGhlIGV4dGVybmFsIGxvb3BiYWNrIHRlc3QKKyAqLworCiBlbnVtIGV0aHRvb2xfdGVzdF9mbGFncyB7Ci0JRVRIX1RFU1RfRkxfT0ZGTElORQk9ICgxIDw8IDApLAkvKiBvbmxpbmUgLyBvZmZsaW5lICovCi0JRVRIX1RFU1RfRkxfRkFJTEVECT0gKDEgPDwgMSksCS8qIHRlc3QgcGFzc2VkIC8gZmFpbGVkICovCisJRVRIX1RFU1RfRkxfT0ZGTElORQk9ICgxIDw8IDApLAorCUVUSF9URVNUX0ZMX0ZBSUxFRAk9ICgxIDw8IDEpLAorCUVUSF9URVNUX0ZMX0VYVEVSTkFMX0xCCT0gKDEgPDwgMiksCisJRVRIX1RFU1RfRkxfRVhURVJOQUxfTEJfRE9ORQk9ICgxIDw8IDMpLAogfTsKIAogLyogZm9yIHJlcXVlc3RpbmcgTklDIHRlc3QgYW5kIGdldHRpbmcgcmVzdWx0cyovCkBAIC03MTQsMTggKzcyNiw2IEBACiAvKiBuZWVkZWQgYnkgZGV2X2Rpc2FibGVfbHJvKCkgKi8KIGV4dGVybiBpbnQgX19ldGh0b29sX3NldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmxhZ3MpOwogCi1zdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGVfZmxvd19zcGVjX2NvbnRhaW5lciB7Ci0Jc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlX2Zsb3dfc3BlYyBmczsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1zdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGVfbGlzdCB7Ci0jZGVmaW5lIEVUSFRPT0xfTUFYX05UVVBMRV9MSVNUX0VOVFJZIDEwMjQKLSNkZWZpbmUgRVRIVE9PTF9NQVhfTlRVUExFX1NUUklOR19QRVJfRU5UUlkgMTQKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0JdW5zaWduZWQgaW50CQljb3VudDsKLX07Ci0KIC8qKgogICogZW51bSBldGh0b29sX3BoeXNfaWRfc3RhdGUgLSBpbmRpY2F0b3Igc3RhdGUgZm9yIHBoeXNpY2FsIGlkZW50aWZpY2F0aW9uCiAgKiBARVRIVE9PTF9JRF9JTkFDVElWRTogUGh5c2ljYWwgSUQgaW5kaWNhdG9yIHNob3VsZCBiZSBkZWFjdGl2YXRlZApAQCAtNzU4LDcgKzc1OCw2IEBACiBpbnQgZXRodG9vbF9vcF9zZXRfdWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKTsKIHUzMiBldGh0b29sX29wX2dldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGludCBldGh0b29sX29wX3NldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSwgdTMyIHN1cHBvcnRlZCk7Ci12b2lkIGV0aHRvb2xfbnR1cGxlX2ZsdXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogYm9vbCBldGh0b29sX2ludmFsaWRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEsIHUzMiBzdXBwb3J0ZWQpOwogCiAvKioKQEAgLTgxMSw3ICs4MTAsNyBAQAogICogQGdldF90eF9jc3VtOiBEZXByZWNhdGVkIGFzIHJlZHVuZGFudC4gUmVwb3J0IHdoZXRoZXIgdHJhbnNtaXQgY2hlY2tzdW1zCiAgKglhcmUgdHVybmVkIG9uIG9yIG9mZi4KICAqIEBzZXRfdHhfY3N1bTogRGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZ2VuZXJpYyBuZXRkZXYgZmVhdHVyZXMuICBUdXJuCi0gKgl0cmFuc21pdCBjaGVja3N1bXMgb24gb3Igb2ZmLiAgUmV0dXJucyBhIGVnYXRpdmUgZXJyb3IgY29kZSBvciB6ZXJvLgorICoJdHJhbnNtaXQgY2hlY2tzdW1zIG9uIG9yIG9mZi4gIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9yIHplcm8uCiAgKiBAZ2V0X3NnOiBEZXByZWNhdGVkIGFzIHJlZHVuZGFudC4gIFJlcG9ydCB3aGV0aGVyIHNjYXR0ZXItZ2F0aGVyIGlzCiAgKgllbmFibGVkLiAgCiAgKiBAc2V0X3NnOiBEZXByZWNhdGVkIGluIGZhdm91ciBvZiBnZW5lcmljIG5ldGRldiBmZWF0dXJlcy4gIFR1cm4KQEAgLTg2NSw3ICs4NjQsNiBAQAogICoJZXJyb3IgY29kZSBvciB6ZXJvLgogICogQHNldF9yeF9udHVwbGU6IFNldCBhbiBSWCBuLXR1cGxlIHJ1bGUuICBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZQogICoJb3IgemVyby4KLSAqIEBnZXRfcnhfbnR1cGxlOiBEZXByZWNhdGVkLgogICogQGdldF9yeGZoX2luZGlyOiBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBSWCBmbG93IGhhc2ggaW5kaXJlY3Rpb24gdGFibGUuCiAgKglSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvciB6ZXJvLgogICogQHNldF9yeGZoX2luZGlyOiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBSWCBmbG93IGhhc2ggaW5kaXJlY3Rpb24gdGFibGUuCkBAIC05NDQsNyArOTQyLDYgQEAKIAlpbnQJKCpyZXNldCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTMyICopOwogCWludAkoKnNldF9yeF9udHVwbGUpKHN0cnVjdCBuZXRfZGV2aWNlICosCiAJCQkJIHN0cnVjdCBldGh0b29sX3J4X250dXBsZSAqKTsKLQlpbnQJKCpnZXRfcnhfbnR1cGxlKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIgc3RyaW5nc2V0LCB2b2lkICopOwogCWludAkoKmdldF9yeGZoX2luZGlyKShzdHJ1Y3QgbmV0X2RldmljZSAqLAogCQkJCSAgc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciAqKTsKIAlpbnQJKCpzZXRfcnhmaF9pbmRpcikoc3RydWN0IG5ldF9kZXZpY2UgKiwKQEAgLTEwMTcsNyArMTAxNCw3IEBACiAjZGVmaW5lIEVUSFRPT0xfRkxBU0hERVYJMHgwMDAwMDAzMyAvKiBGbGFzaCBmaXJtd2FyZSB0byBkZXZpY2UgKi8KICNkZWZpbmUgRVRIVE9PTF9SRVNFVAkJMHgwMDAwMDAzNCAvKiBSZXNldCBoYXJkd2FyZSAqLwogI2RlZmluZSBFVEhUT09MX1NSWE5UVVBMRQkweDAwMDAwMDM1IC8qIEFkZCBhbiBuLXR1cGxlIGZpbHRlciB0byBkZXZpY2UgKi8KLSNkZWZpbmUgRVRIVE9PTF9HUlhOVFVQTEUJMHgwMDAwMDAzNiAvKiBHZXQgbi10dXBsZSBmaWx0ZXJzIGZyb20gZGV2aWNlICovCisjZGVmaW5lIEVUSFRPT0xfR1JYTlRVUExFCTB4MDAwMDAwMzYgLyogZGVwcmVjYXRlZCAqLwogI2RlZmluZSBFVEhUT09MX0dTU0VUX0lORk8JMHgwMDAwMDAzNyAvKiBHZXQgc3RyaW5nIHNldCBpbmZvICovCiAjZGVmaW5lIEVUSFRPT0xfR1JYRkhJTkRJUgkweDAwMDAwMDM4IC8qIEdldCBSWCBmbG93IGhhc2ggaW5kaXInbiB0YWJsZSAqLwogI2RlZmluZSBFVEhUT09MX1NSWEZISU5ESVIJMHgwMDAwMDAzOSAvKiBTZXQgUlggZmxvdyBoYXNoIGluZGlyJ24gdGFibGUgKi8KQEAgLTEwODcsNyArMTA4NCw3IEBACiAvKiBUaGUgZm9sbG93aW5nIGFyZSBhbGwgaW52b2x2ZWQgaW4gZm9yY2luZyBhIHBhcnRpY3VsYXIgbGluawogICogbW9kZSBmb3IgdGhlIGRldmljZSBmb3Igc2V0dGluZyB0aGluZ3MuICBXaGVuIGdldHRpbmcgdGhlCiAgKiBkZXZpY2VzIHNldHRpbmdzLCB0aGVzZSBpbmRpY2F0ZSB0aGUgY3VycmVudCBtb2RlIGFuZCB3aGV0aGVyCi0gKiBpdCB3YXMgZm9jZWQgdXAgaW50byB0aGlzIG1vZGUgb3IgYXV0b25lZ290aWF0ZWQuCisgKiBpdCB3YXMgZm9yY2VkIHVwIGludG8gdGhpcyBtb2RlIG9yIGF1dG9uZWdvdGlhdGVkLgogICovCiAKIC8qIFRoZSBmb3JjZWQgc3BlZWQsIDEwTWIsIDEwME1iLCBnaWdhYml0LCAyLjVHYiwgMTBHYkUuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCmluZGV4IDVlMDZhY2YuLjBjNDczZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCkBAIC04NzcsNyArODc3LDcgQEAKIGV4dGVybiB2b2lkIGV4dDNfaHRyZWVfZnJlZV9kaXJfaW5mbyhzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqcCk7CiAKIC8qIGZzeW5jLmMgKi8KLWV4dGVybiBpbnQgZXh0M19zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKiwgaW50KTsKK2V4dGVybiBpbnQgZXh0M19zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBsb2ZmX3QsIGludCk7CiAKIC8qIGhhc2guYyAqLwogZXh0ZXJuIGludCBleHQzZnNfZGlyaGFzaChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCBzdHJ1Y3QKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmIuaCBiL2luY2x1ZGUvbGludXgvZmIuaAppbmRleCA2YTgyNzQ4Li4xZDY4MzZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZiLmgKKysrIGIvaW5jbHVkZS9saW51eC9mYi5oCkBAIC0xMDQzLDcgKzEwNDMsOCBAQAogCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJc3RydWN0IGZpbGUgKmZpbGUpOwogZXh0ZXJuIHZvaWQgZmJfZGVmZXJyZWRfaW9fY2xlYW51cChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1leHRlcm4gaW50IGZiX2RlZmVycmVkX2lvX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpOworZXh0ZXJuIGludCBmYl9kZWZlcnJlZF9pb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LAorCQkJCWxvZmZfdCBlbmQsIGludCBkYXRhc3luYyk7CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBmYl9iZV9tYXRoKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mZC5oIGIvaW5jbHVkZS9saW51eC9mZC5oCmluZGV4IGY1ZDE5NGEuLjcyMjAyYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZkLmgKQEAgLTM3Nyw0ICszNzcsMjYgQEAKICNkZWZpbmUgRkRFSkVDVCBfSU8oMiwgMHg1YSkKIC8qIGVqZWN0IHRoZSBkaXNrICovCiAKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpZmRlZiBDT05GSUdfQ09NUEFUCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisKK3N0cnVjdCBjb21wYXRfZmxvcHB5X3N0cnVjdCB7CisJY29tcGF0X3VpbnRfdAlzaXplOworCWNvbXBhdF91aW50X3QJc2VjdDsKKwljb21wYXRfdWludF90CWhlYWQ7CisJY29tcGF0X3VpbnRfdAl0cmFjazsKKwljb21wYXRfdWludF90CXN0cmV0Y2g7CisJdW5zaWduZWQgY2hhcglnYXA7CisJdW5zaWduZWQgY2hhcglyYXRlOworCXVuc2lnbmVkIGNoYXIJc3BlYzE7CisJdW5zaWduZWQgY2hhcglmbXRfZ2FwOworCWNvbnN0IGNvbXBhdF9jYWRkcl90IG5hbWU7Cit9OworCisjZGVmaW5lIEZER0VUUFJNMzIgX0lPUigyLCAweDA0LCBzdHJ1Y3QgY29tcGF0X2Zsb3BweV9zdHJ1Y3QpCisjZW5kaWYKKyNlbmRpZgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9mZHRhYmxlLmgKaW5kZXggMTMzYzBiYS4uZGY3ZTNjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mZHRhYmxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mZHRhYmxlLmgKQEAgLTYwLDcgKzYwLDYgQEAKIAogI2RlZmluZSByY3VfZGVyZWZlcmVuY2VfY2hlY2tfZmR0YWJsZShmaWxlcywgZmR0ZmQpIFwKIAkocmN1X2RlcmVmZXJlbmNlX2NoZWNrKChmZHRmZCksIFwKLQkJCSAgICAgICByY3VfcmVhZF9sb2NrX2hlbGQoKSB8fCBcCiAJCQkgICAgICAgbG9ja2RlcF9pc19oZWxkKCYoZmlsZXMpLT5maWxlX2xvY2spIHx8IFwKIAkJCSAgICAgICBhdG9taWNfcmVhZCgmKGZpbGVzKS0+Y291bnQpID09IDEgfHwgXAogCQkJICAgICAgIHJjdV9teV90aHJlYWRfZ3JvdXBfZW1wdHkoKSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNkZXYuaCBiL2luY2x1ZGUvbGludXgvZmlyZXdpcmUtY2Rldi5oCmluZGV4IDRmZjA5ODguLjM1N2RiZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmlyZXdpcmUtY2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvZmlyZXdpcmUtY2Rldi5oCkBAIC0zMCwxMCArMzAsMTMgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLWNvbnN0YW50cy5oPgogCisvKiBhdmFpbGFibGUgc2luY2Uga2VybmVsIHZlcnNpb24gMi42LjIyICovCiAjZGVmaW5lIEZXX0NERVZfRVZFTlRfQlVTX1JFU0VUCQkJCTB4MDAKICNkZWZpbmUgRldfQ0RFVl9FVkVOVF9SRVNQT05TRQkJCQkweDAxCiAjZGVmaW5lIEZXX0NERVZfRVZFTlRfUkVRVUVTVAkJCQkweDAyCiAjZGVmaW5lIEZXX0NERVZfRVZFTlRfSVNPX0lOVEVSUlVQVAkJCTB4MDMKKworLyogYXZhaWxhYmxlIHNpbmNlIGtlcm5lbCB2ZXJzaW9uIDIuNi4zMCAqLwogI2RlZmluZSBGV19DREVWX0VWRU5UX0lTT19SRVNPVVJDRV9BTExPQ0FURUQJCTB4MDQKICNkZWZpbmUgRldfQ0RFVl9FVkVOVF9JU09fUkVTT1VSQ0VfREVBTExPQ0FURUQJCTB4MDUKIApAQCAtMTIwLDI0ICsxMjMsMTEgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgZndfY2Rldl9ldmVudF9yZXF1ZXN0IC0gT2xkIHZlcnNpb24gb2YgJmZ3X2NkZXZfZXZlbnRfcmVxdWVzdDIKLSAqIEBjbG9zdXJlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOyBzZXQgYnkgJUZXX0NERVZfSU9DX0FMTE9DQVRFIGlvY3RsCiAgKiBAdHlwZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsgYWx3YXlzICVGV19DREVWX0VWRU5UX1JFUVVFU1QKLSAqIEB0Y29kZToJU2VlICZmd19jZGV2X2V2ZW50X3JlcXVlc3QyCi0gKiBAb2Zmc2V0OglTZWUgJmZ3X2NkZXZfZXZlbnRfcmVxdWVzdDIKLSAqIEBoYW5kbGU6CVNlZSAmZndfY2Rldl9ldmVudF9yZXF1ZXN0MgotICogQGxlbmd0aDoJU2VlICZmd19jZGV2X2V2ZW50X3JlcXVlc3QyCi0gKiBAZGF0YToJU2VlICZmd19jZGV2X2V2ZW50X3JlcXVlc3QyCiAgKgogICogVGhpcyBldmVudCBpcyBzZW50IGluc3RlYWQgb2YgJmZ3X2NkZXZfZXZlbnRfcmVxdWVzdDIgaWYgdGhlIGtlcm5lbCBvcgotICogdGhlIGNsaWVudCBpbXBsZW1lbnRzIEFCSSB2ZXJzaW9uIDw9IDMuCi0gKgotICogVW5saWtlICZmd19jZGV2X2V2ZW50X3JlcXVlc3QyLCB0aGUgc2VuZGVyIGlkZW50aXR5IGNhbm5vdCBiZSBlc3RhYmxpc2hlZCwKLSAqIGJyb2FkY2FzdCB3cml0ZSByZXF1ZXN0cyBjYW5ub3QgYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHVuaWNhc3Qgd3JpdGVzLCBhbmQKLSAqIEB0Y29kZSBvZiBsb2NrIHJlcXVlc3RzIGlzICVUQ09ERV9MT0NLX1JFUVVFU1QuCi0gKgotICogUmVxdWVzdHMgdG8gdGhlIEZDUF9SRVFVRVNUIG9yIEZDUF9SRVNQT05TRSByZWdpc3RlciBhcmUgcmVzcG9uZGVkIHRvIGFzCi0gKiB3aXRoICZmd19jZGV2X2V2ZW50X3JlcXVlc3QyLCBleGNlcHQgaW4ga2VybmVsIDIuNi4zMiBhbmQgb2xkZXIgd2hpY2ggc2VuZAotICogdGhlIHJlc3BvbnNlIHBhY2tldCBvZiB0aGUgY2xpZW50J3MgJUZXX0NERVZfSU9DX1NFTkRfUkVTUE9OU0UgaW9jdGwuCisgKiB0aGUgY2xpZW50IGltcGxlbWVudHMgQUJJIHZlcnNpb24gPD0gMy4gICZmd19jZGV2X2V2ZW50X3JlcXVlc3QgbGFja3MKKyAqIGVzc2VudGlhbCBpbmZvcm1hdGlvbjsgdXNlICZmd19jZGV2X2V2ZW50X3JlcXVlc3QyIGluc3RlYWQuCiAgKi8KIHN0cnVjdCBmd19jZGV2X2V2ZW50X3JlcXVlc3QgewogCV9fdTY0IGNsb3N1cmU7CkBAIC00NTIsMjkgKzQ0MiwzMSBAQAogICogICAgICAgICAgICAgICAgICVGV19DREVWX0lTT19DT05URVhUX1JFQ0VJVkVfTVVMVElDSEFOTkVMLCBhbmQKICAqICAgICAgICAgICAgICAgICAlRldfQ0RFVl9JT0NfU0VUX0lTT19DSEFOTkVMUwogICovCi0jZGVmaW5lIEZXX0NERVZfVkVSU0lPTiAzIC8qIE1lYW5pbmdsZXNzOyBkb24ndCB1c2UgdGhpcyBtYWNyby4gKi8KIAogLyoqCiAgKiBzdHJ1Y3QgZndfY2Rldl9nZXRfaW5mbyAtIEdlbmVyYWwgcHVycG9zZSBpbmZvcm1hdGlvbiBpb2N0bAogICogQHZlcnNpb246CVRoZSB2ZXJzaW9uIGZpZWxkIGlzIGp1c3QgYSBydW5uaW5nIHNlcmlhbCBudW1iZXIuICBCb3RoIGFuCiAgKgkJaW5wdXQgcGFyYW1ldGVyIChBQkkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGUgY2xpZW50KSBhbmQKICAqCQlvdXRwdXQgcGFyYW1ldGVyIChBQkkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGUga2VybmVsKS4KLSAqCQlBIGNsaWVudCBtdXN0IG5vdCBmaWxsIGluIGFuICVGV19DREVWX1ZFUlNJT04gZGVmaW5lZCBmcm9tIGFuCi0gKgkJaW5jbHVkZWQga2VybmVsIGhlYWRlciBmaWxlIGJ1dCB0aGUgYWN0dWFsIHZlcnNpb24gZm9yIHdoaWNoCi0gKgkJdGhlIGNsaWVudCB3YXMgaW1wbGVtZW50ZWQuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgZm9yd2FyZAotICoJCWNvbXBhdGliaWxpdHkuICBXZSBuZXZlciBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0Ci0gKgkJbWF5IGFkZCBtb3JlIHN0cnVjdHMsIGV2ZW50cywgYW5kIGlvY3RscyBpbiBsYXRlciByZXZpc2lvbnMuCi0gKiBAcm9tX2xlbmd0aDoJSWYgQHJvbSBpcyBub24temVybywgYXQgbW9zdCByb21fbGVuZ3RoIGJ5dGVzIG9mIGNvbmZpZ3VyYXRpb24KKyAqCQlBIGNsaWVudCBzaGFsbCBmaWxsIGluIHRoZSBBQkkgQHZlcnNpb24gZm9yIHdoaWNoIHRoZSBjbGllbnQKKyAqCQl3YXMgaW1wbGVtZW50ZWQuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LgorICogQHJvbV9sZW5ndGg6CUlmIEByb20gaXMgbm9uLXplcm8sIHVwIHRvIEByb21fbGVuZ3RoIGJ5dGVzIG9mIENvbmZpZ3VyYXRpb24KICAqCQlST00gd2lsbCBiZSBjb3BpZWQgaW50byB0aGF0IHVzZXIgc3BhY2UgYWRkcmVzcy4gIEluIGVpdGhlcgogICoJCWNhc2UsIEByb21fbGVuZ3RoIGlzIHVwZGF0ZWQgd2l0aCB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUKLSAqCQljb25maWd1cmF0aW9uIFJPTS4KKyAqCQlDb25maWd1cmF0aW9uIFJPTS4KICAqIEByb206CUlmIG5vbi16ZXJvLCBhZGRyZXNzIG9mIGEgYnVmZmVyIHRvIGJlIGZpbGxlZCBieSBhIGNvcHkgb2YgdGhlCi0gKgkJZGV2aWNlJ3MgY29uZmlndXJhdGlvbiBST00KKyAqCQlkZXZpY2UncyBDb25maWd1cmF0aW9uIFJPTQogICogQGJ1c19yZXNldDoJSWYgbm9uLXplcm8sIGFkZHJlc3Mgb2YgYSBidWZmZXIgdG8gYmUgZmlsbGVkIGJ5IGEKICAqCQkmc3RydWN0IGZ3X2NkZXZfZXZlbnRfYnVzX3Jlc2V0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUKICAqCQlvZiB0aGUgYnVzLiAgVGhpcyBkb2VzIG5vdCBjYXVzZSBhIGJ1cyByZXNldCB0byBoYXBwZW4uCiAgKiBAYnVzX3Jlc2V0X2Nsb3N1cmU6IFZhbHVlIG9mICZjbG9zdXJlIGluIHRoaXMgYW5kIHN1YnNlcXVlbnQgYnVzIHJlc2V0IGV2ZW50cwogICogQGNhcmQ6CVRoZSBpbmRleCBvZiB0aGUgY2FyZCB0aGlzIGRldmljZSBiZWxvbmdzIHRvCisgKgorICogVGhlICVGV19DREVWX0lPQ19HRVRfSU5GTyBpb2N0bCBpcyB1c3VhbGx5IHRoZSB2ZXJ5IGZpcnN0IG9uZSB3aGljaCBhIGNsaWVudAorICogcGVyZm9ybXMgcmlnaHQgYWZ0ZXIgaXQgb3BlbmVkIGEgL2Rldi9mdyogZmlsZS4KKyAqCisgKiBBcyBhIHNpZGUgZWZmZWN0LCByZWNlcHRpb24gb2YgJUZXX0NERVZfRVZFTlRfQlVTX1JFU0VUIGV2ZW50cyB0byBiZSByZWFkKDIpCisgKiBpcyBzdGFydGVkIGJ5IHRoaXMgaW9jdGwuCiAgKi8KIHN0cnVjdCBmd19jZGV2X2dldF9pbmZvIHsKIAlfX3UzMiB2ZXJzaW9uOwpAQCAtNjEyLDcgKzYwNCw3IEBACiAgKiBAaGFuZGxlOglIYW5kbGUgdG8gdGhlIGRlc2NyaXB0b3IsIHdyaXR0ZW4gYnkgdGhlIGtlcm5lbAogICoKICAqIEFkZCBhIGRlc2NyaXB0b3IgYmxvY2sgYW5kIG9wdGlvbmFsbHkgYSBwcmVjZWRpbmcgaW1tZWRpYXRlIGtleSB0byB0aGUgbG9jYWwKLSAqIG5vZGUncyBjb25maWd1cmF0aW9uIFJPTS4KKyAqIG5vZGUncyBDb25maWd1cmF0aW9uIFJPTS4KICAqCiAgKiBUaGUgQGtleSBmaWVsZCBzcGVjaWZpZXMgdGhlIHVwcGVyIDggYml0cyBvZiB0aGUgZGVzY3JpcHRvciByb290IGRpcmVjdG9yeQogICogcG9pbnRlciBhbmQgdGhlIEBkYXRhIGFuZCBAbGVuZ3RoIGZpZWxkcyBzcGVjaWZ5IHRoZSBjb250ZW50cy4gVGhlIEBrZXkKQEAgLTYyNyw5ICs2MTksOSBAQAogICogSWYgc3VjY2Vzc2Z1bCwgdGhlIGtlcm5lbCBhZGRzIHRoZSBkZXNjcmlwdG9yIGFuZCB3cml0ZXMgYmFjayBhIEBoYW5kbGUgdG8KICAqIHRoZSBrZXJuZWwtc2lkZSBvYmplY3QgdG8gYmUgdXNlZCBmb3IgbGF0ZXIgcmVtb3ZhbCBvZiB0aGUgZGVzY3JpcHRvciBibG9jawogICogYW5kIGltbWVkaWF0ZSBrZXkuICBUaGUga2VybmVsIHdpbGwgYWxzbyBnZW5lcmF0ZSBhIGJ1cyByZXNldCB0byBzaWduYWwgdGhlCi0gKiBjaGFuZ2Ugb2YgdGhlIGNvbmZpZ3VyYXRpb24gUk9NIHRvIG90aGVyIG5vZGVzLgorICogY2hhbmdlIG9mIHRoZSBDb25maWd1cmF0aW9uIFJPTSB0byBvdGhlciBub2Rlcy4KICAqCi0gKiBUaGlzIGlvY3RsIGFmZmVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gUk9NcyBvZiBhbGwgbG9jYWwgbm9kZXMuCisgKiBUaGlzIGlvY3RsIGFmZmVjdHMgdGhlIENvbmZpZ3VyYXRpb24gUk9NcyBvZiBhbGwgbG9jYWwgbm9kZXMuCiAgKiBUaGUgaW9jdGwgb25seSBzdWNjZWVkcyBvbiBkZXZpY2UgZmlsZXMgd2hpY2ggcmVwcmVzZW50IGEgbG9jYWwgbm9kZS4KICAqLwogc3RydWN0IGZ3X2NkZXZfYWRkX2Rlc2NyaXB0b3IgewpAQCAtNjQxLDEzICs2MzMsMTMgQEAKIH07CiAKIC8qKgotICogc3RydWN0IGZ3X2NkZXZfcmVtb3ZlX2Rlc2NyaXB0b3IgLSBSZW1vdmUgY29udGVudHMgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBST00KKyAqIHN0cnVjdCBmd19jZGV2X3JlbW92ZV9kZXNjcmlwdG9yIC0gUmVtb3ZlIGNvbnRlbnRzIGZyb20gdGhlIENvbmZpZ3VyYXRpb24gUk9NCiAgKiBAaGFuZGxlOglIYW5kbGUgdG8gdGhlIGRlc2NyaXB0b3IsIGFzIHJldHVybmVkIGJ5IHRoZSBrZXJuZWwgd2hlbiB0aGUKICAqCQlkZXNjcmlwdG9yIHdhcyBhZGRlZAogICoKICAqIFJlbW92ZSBhIGRlc2NyaXB0b3IgYmxvY2sgYW5kIGFjY29tcGFueWluZyBpbW1lZGlhdGUga2V5IGZyb20gdGhlIGxvY2FsCi0gKiBub2RlcycgY29uZmlndXJhdGlvbiBST01zLiAgVGhlIGtlcm5lbCB3aWxsIGFsc28gZ2VuZXJhdGUgYSBidXMgcmVzZXQgdG8KLSAqIHNpZ25hbCB0aGUgY2hhbmdlIG9mIHRoZSBjb25maWd1cmF0aW9uIFJPTSB0byBvdGhlciBub2Rlcy4KKyAqIG5vZGVzJyBDb25maWd1cmF0aW9uIFJPTXMuICBUaGUga2VybmVsIHdpbGwgYWxzbyBnZW5lcmF0ZSBhIGJ1cyByZXNldCB0bworICogc2lnbmFsIHRoZSBjaGFuZ2Ugb2YgdGhlIENvbmZpZ3VyYXRpb24gUk9NIHRvIG90aGVyIG5vZGVzLgogICovCiBzdHJ1Y3QgZndfY2Rldl9yZW1vdmVfZGVzY3JpcHRvciB7CiAJX191MzIgaGFuZGxlOwpAQCAtODYzLDEzICs4NTUsOCBAQAogICogQGxvY2FsX3RpbWU6ICAgc3lzdGVtIHRpbWUsIGluIG1pY3Jvc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2gKICAqIEBjeWNsZV90aW1lcjogIEN5Y2xlIFRpbWUgcmVnaXN0ZXIgY29udGVudHMKICAqCi0gKiBUaGUgJUZXX0NERVZfSU9DX0dFVF9DWUNMRV9USU1FUiBpb2N0bCByZWFkcyB0aGUgaXNvY2hyb25vdXMgY3ljbGUgdGltZXIKLSAqIGFuZCBhbHNvIHRoZSBzeXN0ZW0gY2xvY2sgKCVDTE9DS19SRUFMVElNRSkuICBUaGlzIGFsbG93cyB0byBleHByZXNzIHRoZQotICogcmVjZWl2ZSB0aW1lIG9mIGFuIGlzb2Nocm9ub3VzIHBhY2tldCBhcyBhIHN5c3RlbSB0aW1lLgotICoKLSAqIEBjeWNsZV90aW1lciBjb25zaXN0cyBvZiA3IGJpdHMgY3ljbGVTZWNvbmRzLCAxMyBiaXRzIGN5Y2xlQ291bnQsIGFuZAotICogMTIgYml0cyBjeWNsZU9mZnNldCwgaW4gaG9zdCBieXRlIG9yZGVyLiAgQ2YuIHRoZSBDeWNsZSBUaW1lIHJlZ2lzdGVyCi0gKiBwZXIgSUVFRSAxMzk0IG9yIElzb2Nocm9ub3VzIEN5Y2xlIFRpbWVyIHJlZ2lzdGVyIHBlciBPSENJLTEzOTQuCisgKiBTYW1lIGFzICVGV19DREVWX0lPQ19HRVRfQ1lDTEVfVElNRVIyLCBidXQgZml4ZWQgdG8gdXNlICVDTE9DS19SRUFMVElNRQorICogYW5kIG9ubHkgd2l0aCBtaWNyb3NlY29uZHMgcmVzb2x1dGlvbi4KICAqCiAgKiBJbiB2ZXJzaW9uIDEgYW5kIDIgb2YgdGhlIEFCSSwgdGhpcyBpb2N0bCByZXR1cm5lZCB1bnJlbGlhYmxlIChub24tCiAgKiBtb25vdG9uaWMpIEBjeWNsZV90aW1lciB2YWx1ZXMgb24gY2VydGFpbiBjb250cm9sbGVycy4KQEAgLTg4NiwxMCArODczLDE3IEBACiAgKiBAY2xrX2lkOiAgICAgICBpbnB1dCBwYXJhbWV0ZXIsIGNsb2NrIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBzeXN0ZW0gdGltZQogICogQGN5Y2xlX3RpbWVyOiAgQ3ljbGUgVGltZSByZWdpc3RlciBjb250ZW50cwogICoKLSAqIFRoZSAlRldfQ0RFVl9JT0NfR0VUX0NZQ0xFX1RJTUVSMiB3b3JrcyBsaWtlCi0gKiAlRldfQ0RFVl9JT0NfR0VUX0NZQ0xFX1RJTUVSIGJ1dCBsZXRzIHlvdSBjaG9vc2UgYSBjbG9jayBsaWtlIHdpdGggUE9TSVgnCi0gKiBjbG9ja19nZXR0aW1lIGZ1bmN0aW9uLiAgU3VwcG9ydGVkIEBjbGtfaWQgdmFsdWVzIGFyZSBQT1NJWCcgJUNMT0NLX1JFQUxUSU1FCi0gKiBhbmQgJUNMT0NLX01PTk9UT05JQyBhbmQgTGludXgnICVDTE9DS19NT05PVE9OSUNfUkFXLgorICogVGhlICVGV19DREVWX0lPQ19HRVRfQ1lDTEVfVElNRVIyIGlvY3RsIHJlYWRzIHRoZSBpc29jaHJvbm91cyBjeWNsZSB0aW1lcgorICogYW5kIGFsc28gdGhlIHN5c3RlbSBjbG9jay4gIFRoaXMgYWxsb3dzIHRvIGNvcnJlbGF0ZSByZWNlcHRpb24gdGltZSBvZgorICogaXNvY2hyb25vdXMgcGFja2V0cyB3aXRoIHN5c3RlbSB0aW1lLgorICoKKyAqIEBjbGtfaWQgbGV0cyB5b3UgY2hvb3NlIGEgY2xvY2sgbGlrZSB3aXRoIFBPU0lYJyBjbG9ja19nZXR0aW1lIGZ1bmN0aW9uLgorICogU3VwcG9ydGVkIEBjbGtfaWQgdmFsdWVzIGFyZSBQT1NJWCcgJUNMT0NLX1JFQUxUSU1FIGFuZCAlQ0xPQ0tfTU9OT1RPTklDCisgKiBhbmQgTGludXgnICVDTE9DS19NT05PVE9OSUNfUkFXLgorICoKKyAqIEBjeWNsZV90aW1lciBjb25zaXN0cyBvZiA3IGJpdHMgY3ljbGVTZWNvbmRzLCAxMyBiaXRzIGN5Y2xlQ291bnQsIGFuZAorICogMTIgYml0cyBjeWNsZU9mZnNldCwgaW4gaG9zdCBieXRlIG9yZGVyLiAgQ2YuIHRoZSBDeWNsZSBUaW1lIHJlZ2lzdGVyCisgKiBwZXIgSUVFRSAxMzk0IG9yIElzb2Nocm9ub3VzIEN5Y2xlIFRpbWVyIHJlZ2lzdGVyIHBlciBPSENJLTEzOTQuCiAgKi8KIHN0cnVjdCBmd19jZGV2X2dldF9jeWNsZV90aW1lcjIgewogCV9fczY0IHR2X3NlYzsKQEAgLTEwMTEsNCArMTAwNSw2IEBACiAJX191NjQgY2xvc3VyZTsKIH07CiAKKyNkZWZpbmUgRldfQ0RFVl9WRVJTSU9OIDMgLyogTWVhbmluZ2xlc3MgbGVnYWN5IG1hY3JvOyBkb24ndCB1c2UgaXQuICovCisKICNlbmRpZiAvKiBfTElOVVhfRklSRVdJUkVfQ0RFVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggYzU1ZDZiNy4uNWY1MjNlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtMzIsNyArMzIsOSBAQAogI2RlZmluZSBTRUVLX1NFVAkwCS8qIHNlZWsgcmVsYXRpdmUgdG8gYmVnaW5uaW5nIG9mIGZpbGUgKi8KICNkZWZpbmUgU0VFS19DVVIJMQkvKiBzZWVrIHJlbGF0aXZlIHRvIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiAqLwogI2RlZmluZSBTRUVLX0VORAkyCS8qIHNlZWsgcmVsYXRpdmUgdG8gZW5kIG9mIGZpbGUgKi8KLSNkZWZpbmUgU0VFS19NQVgJU0VFS19FTkQKKyNkZWZpbmUgU0VFS19EQVRBCTMJLyogc2VlayB0byB0aGUgbmV4dCBkYXRhICovCisjZGVmaW5lIFNFRUtfSE9MRQk0CS8qIHNlZWsgdG8gdGhlIG5leHQgaG9sZSAqLworI2RlZmluZSBTRUVLX01BWAlTRUVLX0hPTEUKIAogc3RydWN0IGZzdHJpbV9yYW5nZSB7CiAJX191NjQgc3RhcnQ7CkBAIC02Myw2ICs2NSw3IEBACiAjZGVmaW5lIE1BWV9BQ0NFU1MgMTYKICNkZWZpbmUgTUFZX09QRU4gMzIKICNkZWZpbmUgTUFZX0NIRElSIDY0CisjZGVmaW5lIE1BWV9OT1RfQkxPQ0sgMTI4CS8qIGNhbGxlZCBmcm9tIFJDVSBtb2RlLCBkb24ndCBibG9jayAqLwogCiAvKgogICogZmxhZ3MgaW4gZmlsZS5mX21vZGUuICBOb3RlIHRoYXQgRk1PREVfUkVBRCBhbmQgRk1PREVfV1JJVEUgbXVzdCBjb3JyZXNwb25kCkBAIC0yMDgsNiArMjExLDcgQEAKICNkZWZpbmUgTVNfS0VSTk1PVU5UCSgxPDwyMikgLyogdGhpcyBpcyBhIGtlcm5fbW91bnQgY2FsbCAqLwogI2RlZmluZSBNU19JX1ZFUlNJT04JKDE8PDIzKSAvKiBVcGRhdGUgaW5vZGUgSV92ZXJzaW9uIGZpZWxkICovCiAjZGVmaW5lIE1TX1NUUklDVEFUSU1FCSgxPDwyNCkgLyogQWx3YXlzIHBlcmZvcm0gYXRpbWUgdXBkYXRlcyAqLworI2RlZmluZSBNU19OT1NFQwkoMTw8MjgpCiAjZGVmaW5lIE1TX0JPUk4JCSgxPDwyOSkKICNkZWZpbmUgTVNfQUNUSVZFCSgxPDwzMCkKICNkZWZpbmUgTVNfTk9VU0VSCSgxPDwzMSkKQEAgLTM3NSw3ICszNzksNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhdGguaD4KQEAgLTM5MSw4ICszOTQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3RfYmwuaD4KKyNpbmNsdWRlIDxsaW51eC9zaHJpbmtlci5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zOwpAQCAtNjM4LDYgKzY0Miw3IEBACiAJc3RydWN0IHByaW9fdHJlZV9yb290CWlfbW1hcDsJCS8qIHRyZWUgb2YgcHJpdmF0ZSBhbmQgc2hhcmVkIG1hcHBpbmdzICovCiAJc3RydWN0IGxpc3RfaGVhZAlpX21tYXBfbm9ubGluZWFyOy8qbGlzdCBWTV9OT05MSU5FQVIgbWFwcGluZ3MgKi8KIAlzdHJ1Y3QgbXV0ZXgJCWlfbW1hcF9tdXRleDsJLyogcHJvdGVjdCB0cmVlLCBjb3VudCwgbGlzdCAqLworCS8qIFByb3RlY3RlZCBieSB0cmVlX2xvY2sgdG9nZXRoZXIgd2l0aCB0aGUgcmFkaXggdHJlZSAqLwogCXVuc2lnbmVkIGxvbmcJCW5ycGFnZXM7CS8qIG51bWJlciBvZiB0b3RhbCBwYWdlcyAqLwogCXBnb2ZmX3QJCQl3cml0ZWJhY2tfaW5kZXg7Lyogd3JpdGViYWNrIHN0YXJ0cyBoZXJlICovCiAJY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYV9vcHM7CS8qIG1ldGhvZHMgKi8KQEAgLTc0Myw5ICs3NDgsMTMgQEAKIAogCXNwaW5sb2NrX3QJCWlfbG9jazsJLyogaV9ibG9ja3MsIGlfYnl0ZXMsIG1heWJlIGlfc2l6ZSAqLwogCXVuc2lnbmVkIGludAkJaV9mbGFnczsKKwl1bnNpZ25lZCBsb25nCQlpX3N0YXRlOworI2lmZGVmIENPTkZJR19TRUNVUklUWQorCXZvaWQJCQkqaV9zZWN1cml0eTsKKyNlbmRpZgogCXN0cnVjdCBtdXRleAkJaV9tdXRleDsKIAotCXVuc2lnbmVkIGxvbmcJCWlfc3RhdGU7CisKIAl1bnNpZ25lZCBsb25nCQlkaXJ0aWVkX3doZW47CS8qIGppZmZpZXMgb2YgZmlyc3QgZGlydHlpbmcgKi8KIAogCXN0cnVjdCBobGlzdF9ub2RlCWlfaGFzaDsKQEAgLTc3MSw3ICs3ODAsNyBAQAogCXN0cnVjdCB0aW1lc3BlYwkJaV9jdGltZTsKIAlibGtjbnRfdAkJaV9ibG9ja3M7CiAJdW5zaWduZWQgc2hvcnQgICAgICAgICAgaV9ieXRlczsKLQlzdHJ1Y3Qgcndfc2VtYXBob3JlCWlfYWxsb2Nfc2VtOworCWF0b21pY190CQlpX2Rpb19jb3VudDsKIAljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCSppX2ZvcDsJLyogZm9ybWVyIC0+aV9vcC0+ZGVmYXVsdF9maWxlX29wcyAqLwogCXN0cnVjdCBmaWxlX2xvY2sJKmlfZmxvY2s7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKmlfbWFwcGluZzsKQEAgLTc5Nyw5ICs4MDYsNiBAQAogCWF0b21pY190CQlpX3JlYWRjb3VudDsgLyogc3RydWN0IGZpbGVzIG9wZW4gUk8gKi8KICNlbmRpZgogCWF0b21pY190CQlpX3dyaXRlY291bnQ7Ci0jaWZkZWYgQ09ORklHX1NFQ1VSSVRZCi0Jdm9pZAkJCSppX3NlY3VyaXR5OwotI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAogCXN0cnVjdCBwb3NpeF9hY2wJKmlfYWNsOwogCXN0cnVjdCBwb3NpeF9hY2wJKmlfZGVmYXVsdF9hY2w7CkBAIC0xMDY2LDEyICsxMDcyLDEyIEBACiB9OwogCiBzdHJ1Y3QgbG9ja19tYW5hZ2VyX29wZXJhdGlvbnMgewotCWludCAoKmZsX2NvbXBhcmVfb3duZXIpKHN0cnVjdCBmaWxlX2xvY2sgKiwgc3RydWN0IGZpbGVfbG9jayAqKTsKLQl2b2lkICgqZmxfbm90aWZ5KShzdHJ1Y3QgZmlsZV9sb2NrICopOwkvKiB1bmJsb2NrIGNhbGxiYWNrICovCi0JaW50ICgqZmxfZ3JhbnQpKHN0cnVjdCBmaWxlX2xvY2sgKiwgc3RydWN0IGZpbGVfbG9jayAqLCBpbnQpOwotCXZvaWQgKCpmbF9yZWxlYXNlX3ByaXZhdGUpKHN0cnVjdCBmaWxlX2xvY2sgKik7Ci0Jdm9pZCAoKmZsX2JyZWFrKShzdHJ1Y3QgZmlsZV9sb2NrICopOwotCWludCAoKmZsX2NoYW5nZSkoc3RydWN0IGZpbGVfbG9jayAqKiwgaW50KTsKKwlpbnQgKCpsbV9jb21wYXJlX293bmVyKShzdHJ1Y3QgZmlsZV9sb2NrICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CisJdm9pZCAoKmxtX25vdGlmeSkoc3RydWN0IGZpbGVfbG9jayAqKTsJLyogdW5ibG9jayBjYWxsYmFjayAqLworCWludCAoKmxtX2dyYW50KShzdHJ1Y3QgZmlsZV9sb2NrICosIHN0cnVjdCBmaWxlX2xvY2sgKiwgaW50KTsKKwl2b2lkICgqbG1fcmVsZWFzZV9wcml2YXRlKShzdHJ1Y3QgZmlsZV9sb2NrICopOworCXZvaWQgKCpsbV9icmVhaykoc3RydWN0IGZpbGVfbG9jayAqKTsKKwlpbnQgKCpsbV9jaGFuZ2UpKHN0cnVjdCBmaWxlX2xvY2sgKiosIGludCk7CiB9OwogCiBzdHJ1Y3QgbG9ja19tYW5hZ2VyIHsKQEAgLTEzOTMsNiArMTM5OSwxMSBAQAogCXN0cnVjdCBsaXN0X2hlYWQJc19kZW50cnlfbHJ1OwkvKiB1bnVzZWQgZGVudHJ5IGxydSAqLwogCWludAkJCXNfbnJfZGVudHJ5X3VudXNlZDsJLyogIyBvZiBkZW50cnkgb24gbHJ1ICovCiAKKwkvKiBzX2lub2RlX2xydV9sb2NrIHByb3RlY3RzIHNfaW5vZGVfbHJ1IGFuZCBzX25yX2lub2Rlc191bnVzZWQgKi8KKwlzcGlubG9ja190CQlzX2lub2RlX2xydV9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJc3RydWN0IGxpc3RfaGVhZAlzX2lub2RlX2xydTsJCS8qIHVudXNlZCBpbm9kZSBscnUgKi8KKwlpbnQJCQlzX25yX2lub2Rlc191bnVzZWQ7CS8qICMgb2YgaW5vZGVzIG9uIGxydSAqLworCiAJc3RydWN0IGJsb2NrX2RldmljZQkqc19iZGV2OwogCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpzX2JkaTsKIAlzdHJ1Y3QgbXRkX2luZm8JCSpzX210ZDsKQEAgLTE0MzUsOCArMTQ0NiwxNCBAQAogCSAqIFNhdmVkIHBvb2wgaWRlbnRpZmllciBmb3IgY2xlYW5jYWNoZSAoLTEgbWVhbnMgbm9uZSkKIAkgKi8KIAlpbnQgY2xlYW5jYWNoZV9wb29saWQ7CisKKwlzdHJ1Y3Qgc2hyaW5rZXIgc19zaHJpbms7CS8qIHBlci1zYiBzaHJpbmtlciBoYW5kbGUgKi8KIH07CiAKKy8qIHN1cGVyYmxvY2sgY2FjaGUgcHJ1bmluZyBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkIHBydW5lX2ljYWNoZV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbnJfdG9fc2Nhbik7CitleHRlcm4gdm9pZCBwcnVuZV9kY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG5yX3RvX3NjYW4pOworCiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIGN1cnJlbnRfZnNfdGltZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIAogLyoKQEAgLTE0NTEsMTAgKzE0NjgsNiBAQAogI2RlZmluZSB2ZnNfY2hlY2tfZnJvemVuKHNiLCBsZXZlbCkgXAogCXdhaXRfZXZlbnQoKHNiKS0+c193YWl0X3VuZnJvemVuLCAoKHNiKS0+c19mcm96ZW4gPCAobGV2ZWwpKSkKIAotI2RlZmluZSBnZXRfZnNfZXhjbCgpIGF0b21pY19pbmMoJmN1cnJlbnQtPmZzX2V4Y2wpCi0jZGVmaW5lIHB1dF9mc19leGNsKCkgYXRvbWljX2RlYygmY3VycmVudC0+ZnNfZXhjbCkKLSNkZWZpbmUgaGFzX2ZzX2V4Y2woKSBhdG9taWNfcmVhZCgmY3VycmVudC0+ZnNfZXhjbCkKLQogLyoKICAqIHVudGlsIFZGUyB0cmFja3MgdXNlciBuYW1lc3BhY2VzIGZvciBpbm9kZXMsIGp1c3QgbWFrZSBhbGwgZmlsZXMKICAqIGJlbG9uZyB0byBpbml0X3VzZXJfbnMKQEAgLTE0ODcsNyArMTUwMCw2IEBACiAvKgogICogVkZTIGZpbGUgaGVscGVyIGZ1bmN0aW9ucy4KICAqLwotZXh0ZXJuIGludCBmaWxlX3Blcm1pc3Npb24oc3RydWN0IGZpbGUgKiwgaW50KTsKIGV4dGVybiB2b2lkIGlub2RlX2luaXRfb3duZXIoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3Qgc3RydWN0IGlub2RlICpkaXIsCiAJCQltb2RlX3QgbW9kZSk7CiAvKgpAQCAtMTUzNSwxMSArMTU0Nyw2IEBACiAjZGVmaW5lIEhBVkVfQ09NUEFUX0lPQ1RMIDEKICNkZWZpbmUgSEFWRV9VTkxPQ0tFRF9JT0NUTCAxCiAKLS8qCi0gKiBOT1RFOgotICogYWxsIGZpbGUgb3BlcmF0aW9ucyBleGNlcHQgc2V0bGVhc2UgY2FuIGJlIGNhbGxlZCB3aXRob3V0Ci0gKiB0aGUgYmlnIGtlcm5lbCBsb2NrIGhlbGQgaW4gYWxsIGZpbGVzeXN0ZW1zLgotICovCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAlsb2ZmX3QgKCpsbHNlZWspIChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CkBAIC0xNTU1LDcgKzE1NjIsNyBAQAogCWludCAoKm9wZW4pIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiAJaW50ICgqZmx1c2gpIChzdHJ1Y3QgZmlsZSAqLCBmbF9vd25lcl90IGlkKTsKIAlpbnQgKCpyZWxlYXNlKSAoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwotCWludCAoKmZzeW5jKSAoc3RydWN0IGZpbGUgKiwgaW50IGRhdGFzeW5jKTsKKwlpbnQgKCpmc3luYykgKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgbG9mZl90LCBpbnQgZGF0YXN5bmMpOwogCWludCAoKmFpb19mc3luYykgKHN0cnVjdCBraW9jYiAqLCBpbnQgZGF0YXN5bmMpOwogCWludCAoKmZhc3luYykgKGludCwgc3RydWN0IGZpbGUgKiwgaW50KTsKIAlpbnQgKCpsb2NrKSAoc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOwpAQCAtMTU3MCwxMyArMTU3NywxMSBAQAogCQkJICBsb2ZmX3QgbGVuKTsKIH07CiAKLSNkZWZpbmUgSVBFUk1fRkxBR19SQ1UJMHgwMDAxCi0KIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHsKIAlzdHJ1Y3QgZGVudHJ5ICogKCpsb29rdXApIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CiAJdm9pZCAqICgqZm9sbG93X2xpbmspIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7Ci0JaW50ICgqcGVybWlzc2lvbikgKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHVuc2lnbmVkIGludCk7Ci0JaW50ICgqY2hlY2tfYWNsKShzdHJ1Y3QgaW5vZGUgKiwgaW50LCB1bnNpZ25lZCBpbnQpOworCWludCAoKnBlcm1pc3Npb24pIChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICogKCpnZXRfYWNsKShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKIAogCWludCAoKnJlYWRsaW5rKSAoc3RydWN0IGRlbnRyeSAqLCBjaGFyIF9fdXNlciAqLGludCk7CiAJdm9pZCAoKnB1dF9saW5rKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICosIHZvaWQgKik7CkBAIC0xNjQyLDYgKzE2NDcsOCBAQAogCXNzaXplX3QgKCpxdW90YV93cml0ZSkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY29uc3QgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CiAjZW5kaWYKIAlpbnQgKCpiZGV2X3RyeV90b19mcmVlX3BhZ2UpKHN0cnVjdCBzdXBlcl9ibG9jayosIHN0cnVjdCBwYWdlKiwgZ2ZwX3QpOworCWludCAoKm5yX2NhY2hlZF9vYmplY3RzKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisJdm9pZCAoKmZyZWVfY2FjaGVkX29iamVjdHMpKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQpOwogfTsKIAogLyoKQEAgLTE2OTAsNiArMTY5NywxMCBAQAogICoJCQlzZXQgZHVyaW5nIGRhdGEgd3JpdGViYWNrLCBhbmQgY2xlYXJlZCB3aXRoIGEgd2FrZXVwCiAgKgkJCW9uIHRoZSBiaXQgYWRkcmVzcyBvbmNlIGl0IGlzIGRvbmUuCiAgKgorICogSV9SRUZFUkVOQ0VECQlNYXJrcyB0aGUgaW5vZGUgYXMgcmVjZW50bHkgcmVmZXJlbmNlcyBvbiB0aGUgTFJVIGxpc3QuCisgKgorICogSV9ESU9fV0FLRVVQCQlOZXZlciBzZXQuICBPbmx5IHVzZWQgYXMgYSBrZXkgZm9yIHdhaXRfb25fYml0KCkuCisgKgogICogUTogV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIElfV0lMTF9GUkVFIGFuZCBJX0ZSRUVJTkc/CiAgKi8KICNkZWZpbmUgSV9ESVJUWV9TWU5DCQkoMSA8PCAwKQpAQCAtMTcwMyw2ICsxNzE0LDggQEAKICNkZWZpbmUgX19JX1NZTkMJCTcKICNkZWZpbmUgSV9TWU5DCQkJKDEgPDwgX19JX1NZTkMpCiAjZGVmaW5lIElfUkVGRVJFTkNFRAkJKDEgPDwgOCkKKyNkZWZpbmUgX19JX0RJT19XQUtFVVAJCTkKKyNkZWZpbmUgSV9ESU9fV0FLRVVQCQkoMSA8PCBJX0RJT19XQUtFVVApCiAKICNkZWZpbmUgSV9ESVJUWSAoSV9ESVJUWV9TWU5DIHwgSV9ESVJUWV9EQVRBU1lOQyB8IElfRElSVFlfUEFHRVMpCiAKQEAgLTE4MTMsNyArMTgyNiw2IEBACiAJc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGlfbG9ja19rZXk7CiAJc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGlfbXV0ZXhfa2V5OwogCXN0cnVjdCBsb2NrX2NsYXNzX2tleSBpX211dGV4X2Rpcl9rZXk7Ci0Jc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGlfYWxsb2Nfc2VtX2tleTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICptb3VudF9ucyhzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLApAQCAtMTgzNCw2ICsxODQ2LDggQEAKIHZvaWQgZGVhY3RpdmF0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHZvaWQgZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBpbnQgc2V0X2Fub25fc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhKTsKK2ludCBnZXRfYW5vbl9iZGV2KGRldl90ICopOwordm9pZCBmcmVlX2Fub25fYmRldihkZXZfdCk7CiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNnZXQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsCiAJCQlpbnQgKCp0ZXN0KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKix2b2lkICopLAogCQkJaW50ICgqc2V0KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKix2b2lkICopLApAQCAtMTg2Niw2ICsxODgwLDcgQEAKIGV4dGVybiBpbnQgdW5yZWdpc3Rlcl9maWxlc3lzdGVtKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICopOwogZXh0ZXJuIHN0cnVjdCB2ZnNtb3VudCAqa2Vybl9tb3VudF9kYXRhKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICosIHZvaWQgKmRhdGEpOwogI2RlZmluZSBrZXJuX21vdW50KHR5cGUpIGtlcm5fbW91bnRfZGF0YSh0eXBlLCBOVUxMKQorZXh0ZXJuIHZvaWQga2Vybl91bm1vdW50KHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKIGV4dGVybiBpbnQgbWF5X3Vtb3VudF90cmVlKHN0cnVjdCB2ZnNtb3VudCAqKTsKIGV4dGVybiBpbnQgbWF5X3Vtb3VudChzdHJ1Y3QgdmZzbW91bnQgKik7CiBleHRlcm4gbG9uZyBkb19tb3VudChjaGFyICosIGNoYXIgKiwgY2hhciAqLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOwpAQCAtMjE4NSwxNiArMjIwMCwzOCBAQAogI2VuZGlmCiBleHRlcm4gaW50IG5vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CiBleHRlcm4gaW50IGlub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICosIGludCk7Ci1leHRlcm4gaW50IGdlbmVyaWNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50LCB1bnNpZ25lZCBpbnQsCi0JCWludCAoKmNoZWNrX2FjbCkoc3RydWN0IGlub2RlICosIGludCwgdW5zaWduZWQgaW50KSk7CitleHRlcm4gaW50IGdlbmVyaWNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKIAogc3RhdGljIGlubGluZSBib29sIGV4ZWN1dGVfb2soc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlyZXR1cm4gKGlub2RlLT5pX21vZGUgJiBTX0lYVUdPKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpOwogfQogCi1leHRlcm4gaW50IGdldF93cml0ZV9hY2Nlc3Moc3RydWN0IGlub2RlICopOwotZXh0ZXJuIGludCBkZW55X3dyaXRlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqKTsKKy8qCisgKiBnZXRfd3JpdGVfYWNjZXNzKCkgZ2V0cyB3cml0ZSBwZXJtaXNzaW9uIGZvciBhIGZpbGUuCisgKiBwdXRfd3JpdGVfYWNjZXNzKCkgcmVsZWFzZXMgdGhpcyB3cml0ZSBwZXJtaXNzaW9uLgorICogVGhpcyBpcyB1c2VkIGZvciByZWd1bGFyIGZpbGVzLgorICogV2UgY2Fubm90IHN1cHBvcnQgd3JpdGUgKGFuZCBtYXliZSBtbWFwIHJlYWQtd3JpdGUgc2hhcmVkKSBhY2Nlc3NlcyBhbmQKKyAqIE1BUF9ERU5ZV1JJVEUgbW1hcHBpbmdzIHNpbXVsdGFuZW91c2x5LiBUaGUgaV93cml0ZWNvdW50IGZpZWxkIG9mIGFuIGlub2RlCisgKiBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqIDA6IG5vIHdyaXRlcnMsIG5vIFZNX0RFTllXUklURSBtYXBwaW5ncworICogPCAwOiAoLWlfd3JpdGVjb3VudCkgdm1fYXJlYV9zdHJ1Y3RzIHdpdGggVk1fREVOWVdSSVRFIHNldCBleGlzdAorICogPiAwOiAoaV93cml0ZWNvdW50KSB1c2VycyBhcmUgd3JpdGluZyB0byB0aGUgZmlsZS4KKyAqCisgKiBOb3JtYWxseSB3ZSBvcGVyYXRlIG9uIHRoYXQgY291bnRlciB3aXRoIGF0b21pY197aW5jLGRlY30gYW5kIGl0J3Mgc2FmZQorICogZXhjZXB0IGZvciB0aGUgY2FzZXMgd2hlcmUgd2UgZG9uJ3QgaG9sZCBpX3dyaXRlY291bnQgeWV0LiBUaGVuIHdlIG5lZWQgdG8KKyAqIHVzZSB7Z2V0LGRlbnl9X3dyaXRlX2FjY2VzcygpIC0gdGhlc2UgZnVuY3Rpb25zIGNoZWNrIHRoZSBzaWduIGFuZCByZWZ1c2UKKyAqIHRvIGRvIHRoZSBjaGFuZ2UgaWYgc2lnbiBpcyB3cm9uZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3dyaXRlX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBhdG9taWNfaW5jX3VubGVzc19uZWdhdGl2ZSgmaW5vZGUtPmlfd3JpdGVjb3VudCkgPyAwIDogLUVUWFRCU1k7Cit9CitzdGF0aWMgaW5saW5lIGludCBkZW55X3dyaXRlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlyZXR1cm4gYXRvbWljX2RlY191bmxlc3NfcG9zaXRpdmUoJmlub2RlLT5pX3dyaXRlY291bnQpID8gMCA6IC1FVFhUQlNZOworfQogc3RhdGljIGlubGluZSB2b2lkIHB1dF93cml0ZV9hY2Nlc3Moc3RydWN0IGlub2RlICogaW5vZGUpCiB7CiAJYXRvbWljX2RlYygmaW5vZGUtPmlfd3JpdGVjb3VudCk7CkBAIC0yMzE0LDcgKzIzNTEsOCBAQAogLyogZnMvYmxvY2tfZGV2LmMgKi8KIGV4dGVybiBzc2l6ZV90IGJsa2Rldl9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpOwotZXh0ZXJuIGludCBibGtkZXZfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGludCBkYXRhc3luYyk7CitleHRlcm4gaW50IGJsa2Rldl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkJaW50IGRhdGFzeW5jKTsKIAogLyogZnMvc3BsaWNlLmMgKi8KIGV4dGVybiBzc2l6ZV90IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwKQEAgLTIzNjUsNiArMjQwMyw4IEBACiB9OwogCiB2b2lkIGRpb19lbmRfaW8oc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyb3IpOwordm9pZCBpbm9kZV9kaW9fd2FpdChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgaW5vZGVfZGlvX2RvbmUoc3RydWN0IGlub2RlICppbm9kZSk7CiAKIHNzaXplX3QgX19ibG9ja2Rldl9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCkBAIC0yMzcyLDE0ICsyNDEyLDE3IEBACiAJZGlvX3N1Ym1pdF90IHN1Ym1pdF9pbywJaW50IGZsYWdzKTsKIAogc3RhdGljIGlubGluZSBzc2l6ZV90IGJsb2NrZGV2X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQlsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGdldF9ibG9ja190IGdldF9ibG9jaywKLQlkaW9faW9kb25lX3QgZW5kX2lvKQorCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwKKwkJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBnZXRfYmxvY2tfdCBnZXRfYmxvY2spCiB7Ci0JcmV0dXJuIF9fYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgYmRldiwgaW92LCBvZmZzZXQsCi0JCQkJICAgIG5yX3NlZ3MsIGdldF9ibG9jaywgZW5kX2lvLCBOVUxMLAorCXJldHVybiBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKKwkJCQkgICAgb2Zmc2V0LCBucl9zZWdzLCBnZXRfYmxvY2ssIE5VTEwsIE5VTEwsCiAJCQkJICAgIERJT19MT0NLSU5HIHwgRElPX1NLSVBfSE9MRVMpOwogfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbm9kZV9kaW9fd2FpdChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworfQogI2VuZGlmCiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdlbmVyaWNfcm9fZm9wczsKQEAgLTI0MjksNiArMjQ3Miw4IEBACiBleHRlcm4gc3RydWN0IHN1cGVyX2Jsb2NrICp1c2VyX2dldF9zdXBlcihkZXZfdCk7CiBleHRlcm4gdm9pZCBkcm9wX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogZXh0ZXJuIHZvaWQgaXRlcmF0ZV9zdXBlcnModm9pZCAoKikoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiksIHZvaWQgKik7CitleHRlcm4gdm9pZCBpdGVyYXRlX3N1cGVyc190eXBlKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICosCisJCQkgICAgICAgIHZvaWQgKCopKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICopLCB2b2lkICopOwogCiBleHRlcm4gaW50IGRjYWNoZV9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiBleHRlcm4gaW50IGRjYWNoZV9kaXJfY2xvc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwpAQCAtMjQ0MSw3ICsyNDg2LDcgQEAKIGV4dGVybiBpbnQgc2ltcGxlX3VubGluayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKIGV4dGVybiBpbnQgc2ltcGxlX3JtZGlyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOwogZXh0ZXJuIGludCBzaW1wbGVfcmVuYW1lKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOwotZXh0ZXJuIGludCBub29wX2ZzeW5jKHN0cnVjdCBmaWxlICosIGludCk7CitleHRlcm4gaW50IG5vb3BfZnN5bmMoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBsb2ZmX3QsIGludCk7CiBleHRlcm4gaW50IHNpbXBsZV9lbXB0eShzdHJ1Y3QgZGVudHJ5ICopOwogZXh0ZXJuIGludCBzaW1wbGVfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKTsKIGV4dGVybiBpbnQgc2ltcGxlX3dyaXRlX2JlZ2luKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKQEAgLTI0NjYsNyArMjUxMSw3IEBACiBleHRlcm4gc3NpemVfdCBzaW1wbGVfd3JpdGVfdG9fYnVmZmVyKHZvaWQgKnRvLCBzaXplX3QgYXZhaWxhYmxlLCBsb2ZmX3QgKnBwb3MsCiAJCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCBzaXplX3QgY291bnQpOwogCi1leHRlcm4gaW50IGdlbmVyaWNfZmlsZV9mc3luYyhzdHJ1Y3QgZmlsZSAqLCBpbnQpOworZXh0ZXJuIGludCBnZW5lcmljX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBsb2ZmX3QsIGludCk7CiAKIGV4dGVybiBpbnQgZ2VuZXJpY19jaGVja19hZGRyZXNzYWJsZSh1bnNpZ25lZCwgdTY0KTsKIApAQCAtMjU5MSw3ICsyNjM2LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGlub2RlX2hhc19ub194YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCWlmICghaXNfc3hpZChpbm9kZS0+aV9tb2RlKSkKKwlpZiAoIWlzX3N4aWQoaW5vZGUtPmlfbW9kZSkgJiYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfTk9TRUMpKQogCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PU0VDOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvZnNjYWNoZS5oCmluZGV4IDdjNGQ3MmYuLjllYzIwZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNjYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZnNjYWNoZS5oCkBAIC0yMDQsNiArMjA0LDggQEAKIGV4dGVybiB2b2lkIF9fZnNjYWNoZV93YWl0X29uX3BhZ2Vfd3JpdGUoc3RydWN0IGZzY2FjaGVfY29va2llICosIHN0cnVjdCBwYWdlICopOwogZXh0ZXJuIGJvb2wgX19mc2NhY2hlX21heWJlX3JlbGVhc2VfcGFnZShzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKiwgc3RydWN0IHBhZ2UgKiwKIAkJCQkJIGdmcF90KTsKK2V4dGVybiB2b2lkIF9fZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKiwKKwkJCQkJICAgICAgc3RydWN0IGlub2RlICopOwogCiAvKioKICAqIGZzY2FjaGVfcmVnaXN0ZXJfbmV0ZnMgLSBSZWdpc3RlciBhIGZpbGVzeXN0ZW0gYXMgZGVzaXJpbmcgY2FjaGluZyBzZXJ2aWNlcwpAQCAtNjQzLDQgKzY0NSwyMyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorLyoqCisgKiBmc2NhY2hlX3VuY2FjaGVfYWxsX2lub2RlX3BhZ2VzIC0gVW5jYWNoZSBhbGwgYW4gaW5vZGUncyBwYWdlcworICogQGNvb2tpZTogVGhlIGNvb2tpZSByZXByZXNlbnRpbmcgdGhlIGlub2RlJ3MgY2FjaGUgb2JqZWN0LgorICogQGlub2RlOiBUaGUgaW5vZGUgdG8gdW5jYWNoZSBwYWdlcyBmcm9tLgorICoKKyAqIFVuY2FjaGUgYWxsIHRoZSBwYWdlcyBpbiBhbiBpbm9kZSB0aGF0IGFyZSBtYXJrZWQgUEdfZnNjYWNoZSwgYXNzdW1pbmcgdGhlbQorICogdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb29raWUuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuICBJdCB3aWxsIHdhaXQgZm9yIHBhZ2VzIHRoYXQgYXJlIGJlaW5nIHdyaXR0ZW4gb3V0CisgKiBhbmQgd2lsbCB3YWl0IHdoaWxzdCB0aGUgUEdfZnNjYWNoZSBtYXJrIGlzIHJlbW92ZWQgYnkgdGhlIGNhY2hlLgorICovCitzdGF0aWMgaW5saW5lCit2b2lkIGZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMoc3RydWN0IGZzY2FjaGVfY29va2llICpjb29raWUsCisJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChmc2NhY2hlX2Nvb2tpZV92YWxpZChjb29raWUpKQorCQlfX2ZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMoY29va2llLCBpbm9kZSk7Cit9CisKICNlbmRpZiAvKiBfTElOVVhfRlNDQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzbC1kaXUtZmIuaCBiL2luY2x1ZGUvbGludXgvZnNsLWRpdS1mYi5oCmluZGV4IDc4MWQ0NjcuLmRhYTk5NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNsLWRpdS1mYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZnNsLWRpdS1mYi5oCkBAIC0yNCwxMiArMjQsNiBAQAogICogU2VlIG1wYzg2MTBmYl9zZXRfcGFyKCksIG1hcF92aWRlb19tZW1vcnkoKSwgYW5kIHVubWFwX3ZpZGVvX21lbW9yeSgpCiAgKi8KICNkZWZpbmUgTUVNX0FMTE9DX1RIUkVTSE9MRCAoMTAyNCo3NjgqNCszMikKLS8qIE1pbmltdW0gdmFsdWUgdGhhdCB0aGUgcGl4ZWwgY2xvY2sgY2FuIGJlIHNldCB0byBpbiBwaWNvIHNlY29uZHMKLSAqIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSBwbGF0Zm9ybSBjbG9jay8zIHdoZXJlIHRoZSBtaW5pbXVtIHBsYXRmb3JtCi0gKiBjbG9jayBpcyA1MzNNSHouIFRoaXMgZ2l2ZXMgNTYyOSBwaWNvIHNlY29uZHMuCi0gKi8KLSNkZWZpbmUgTUlOX1BJWF9DTEsgNTYyOQotI2RlZmluZSBNQVhfUElYX0NMSyA5NjA5NgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc2xfaHlwZXJ2aXNvci5oIGIvaW5jbHVkZS9saW51eC9mc2xfaHlwZXJ2aXNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWJhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzbF9oeXBlcnZpc29yLmgKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBGcmVlc2NhbGUgaHlwZXJ2aXNvciBpb2N0bCBhbmQga2VybmVsIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBBdXRob3I6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciAiYXMgaXMiIGFuZCBhbnkKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKyAqIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUKKyAqIGRpc2NsYWltZWQuIEluIG5vIGV2ZW50IHNoYWxsIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGJlIGxpYWJsZSBmb3IgYW55CisgKiBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworICogKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworICogbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQgYW5kCisgKiBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwgb3IgdG9ydAorICogKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMKKyAqIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorICoKKyAqIFRoaXMgZmlsZSBpcyB1c2VkIGJ5IHRoZSBGcmVlc2NhbGUgaHlwZXJ2aXNvciBtYW5hZ2VtZW50IGRyaXZlci4gIEl0IGNhbgorICogYWxzbyBiZSBpbmNsdWRlZCBieSBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRyaXZlcgorICogdmlhIHRoZSBpb2N0bCBpbnRlcmZhY2UuCisgKi8KKworI2lmbmRlZiBGU0xfSFlQRVJWSVNPUl9ICisjZGVmaW5lIEZTTF9IWVBFUlZJU09SX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qKgorICogc3RydWN0IGZzbF9odl9pb2N0bF9yZXN0YXJ0IC0gcmVzdGFydCBhIHBhcnRpdGlvbgorICogQHJldDogcmV0dXJuIGVycm9yIGNvZGUgZnJvbSB0aGUgaHlwZXJ2aXNvcgorICogQHBhcnRpdGlvbjogdGhlIElEIG9mIHRoZSBwYXJ0aXRpb24gdG8gcmVzdGFydCwgb3IgLTEgZm9yIHRoZQorICogICAgICAgICAgICAgY2FsbGluZyBwYXJ0aXRpb24KKyAqCisgKiBVc2VkIGJ5IEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fUkVTVEFSVAorICovCitzdHJ1Y3QgZnNsX2h2X2lvY3RsX3Jlc3RhcnQgeworCV9fdTMyIHJldDsKKwlfX3UzMiBwYXJ0aXRpb247Cit9OworCisvKioKKyAqIHN0cnVjdCBmc2xfaHZfaW9jdGxfc3RhdHVzIC0gZ2V0IGEgcGFydGl0aW9uJ3Mgc3RhdHVzCisgKiBAcmV0OiByZXR1cm4gZXJyb3IgY29kZSBmcm9tIHRoZSBoeXBlcnZpc29yCisgKiBAcGFydGl0aW9uOiB0aGUgSUQgb2YgdGhlIHBhcnRpdGlvbiB0byBxdWVyeSwgb3IgLTEgZm9yIHRoZQorICogICAgICAgICAgICAgY2FsbGluZyBwYXJ0aXRpb24KKyAqIEBzdGF0dXM6IFRoZSByZXR1cm5lZCBzdGF0dXMgb2YgdGhlIHBhcnRpdGlvbgorICoKKyAqIFVzZWQgYnkgRlNMX0hWX0lPQ1RMX1BBUlRJVElPTl9HRVRfU1RBVFVTCisgKgorICogVmFsdWVzIG9mICdzdGF0dXMnOgorICogICAgMCA9IFN0b3BwZWQKKyAqICAgIDEgPSBSdW5uaW5nCisgKiAgICAyID0gU3RhcnRpbmcKKyAqICAgIDMgPSBTdG9wcGluZworICovCitzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0YXR1cyB7CisJX191MzIgcmV0OworCV9fdTMyIHBhcnRpdGlvbjsKKwlfX3UzMiBzdGF0dXM7Cit9OworCisvKioKKyAqIHN0cnVjdCBmc2xfaHZfaW9jdGxfc3RhcnQgLSBzdGFydCBhIHBhcnRpdGlvbgorICogQHJldDogcmV0dXJuIGVycm9yIGNvZGUgZnJvbSB0aGUgaHlwZXJ2aXNvcgorICogQHBhcnRpdGlvbjogdGhlIElEIG9mIHRoZSBwYXJ0aXRpb24gdG8gY29udHJvbAorICogQGVudHJ5X3BvaW50OiBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgZ3Vlc3QgSU1BIHRvIHN0YXJ0IGV4ZWN1dGlvbgorICogQGxvYWQ6IElmIG5vbi16ZXJvLCByZWxvYWQgdGhlIHBhcnRpdGlvbidzIGltYWdlcyBiZWZvcmUgc3RhcnRpbmcKKyAqCisgKiBVc2VkIGJ5IEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fU1RBUlQKKyAqLworc3RydWN0IGZzbF9odl9pb2N0bF9zdGFydCB7CisJX191MzIgcmV0OworCV9fdTMyIHBhcnRpdGlvbjsKKwlfX3UzMiBlbnRyeV9wb2ludDsKKwlfX3UzMiBsb2FkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0b3AgLSBzdG9wIGEgcGFydGl0aW9uCisgKiBAcmV0OiByZXR1cm4gZXJyb3IgY29kZSBmcm9tIHRoZSBoeXBlcnZpc29yCisgKiBAcGFydGl0aW9uOiB0aGUgSUQgb2YgdGhlIHBhcnRpdGlvbiB0byBzdG9wLCBvciAtMSBmb3IgdGhlIGNhbGxpbmcKKyAqICAgICAgICAgICAgIHBhcnRpdGlvbgorICoKKyAqIFVzZWQgYnkgRlNMX0hWX0lPQ1RMX1BBUlRJVElPTl9TVE9QCisgKi8KK3N0cnVjdCBmc2xfaHZfaW9jdGxfc3RvcCB7CisJX191MzIgcmV0OworCV9fdTMyIHBhcnRpdGlvbjsKK307CisKKy8qKgorICogc3RydWN0IGZzbF9odl9pb2N0bF9tZW1jcHkgLSBjb3B5IG1lbW9yeSBiZXR3ZWVuIHBhcnRpdGlvbnMKKyAqIEByZXQ6IHJldHVybiBlcnJvciBjb2RlIGZyb20gdGhlIGh5cGVydmlzb3IKKyAqIEBzb3VyY2U6IHRoZSBwYXJ0aXRpb24gSUQgb2YgdGhlIHNvdXJjZSBwYXJ0aXRpb24sIG9yIC0xIGZvciB0aGlzCisgKiAgICAgICAgICBwYXJ0aXRpb24KKyAqIEB0YXJnZXQ6IHRoZSBwYXJ0aXRpb24gSUQgb2YgdGhlIHRhcmdldCBwYXJ0aXRpb24sIG9yIC0xIGZvciB0aGlzCisgKiAgICAgICAgICBwYXJ0aXRpb24KKyAqIEByZXNlcnZlZDogcmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIDAKKyAqIEBsb2NhbF9hZGRyOiB1c2VyLXNwYWNlIHZpcnR1YWwgYWRkcmVzcyBvZiBhIGJ1ZmZlciBpbiB0aGUgbG9jYWwKKyAqICAgICAgICAgICAgICBwYXJ0aXRpb24KKyAqIEByZW1vdGVfYWRkcjogZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGJ1ZmZlciBpbiB0aGUKKyAqICAgICAgICAgICByZW1vdGUgcGFydGl0aW9uCisgKiBAY291bnQ6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weS4gIEJvdGggdGhlIGxvY2FsIGFuZCByZW1vdGUKKyAqICAgICAgICAgYnVmZmVycyBtdXN0IGJlIGF0IGxlYXN0ICdjb3VudCcgYnl0ZXMgbG9uZworICoKKyAqIFVzZWQgYnkgRlNMX0hWX0lPQ1RMX01FTUNQWQorICoKKyAqIFRoZSAnbG9jYWwnIHBhcnRpdGlvbiBpcyB0aGUgcGFydGl0aW9uIHRoYXQgY2FsbHMgdGhpcyBpb2N0bC4gIFRoZQorICogJ3JlbW90ZScgcGFydGl0aW9uIGlzIGEgZGlmZmVyZW50IHBhcnRpdGlvbi4gIFRoZSBkYXRhIGlzIGNvcGllZCBmcm9tCisgKiB0aGUgJ3NvdXJjZScgcGFyaXRpdGlvbicgdG8gdGhlICd0YXJnZXQnIHBhcnRpdGlvbi4KKyAqCisgKiBUaGUgYnVmZmVyIGluIHRoZSByZW1vdGUgcGFydGl0aW9uIG11c3QgYmUgZ3Vlc3QgcGh5c2ljYWxseQorICogY29udGlndW91cy4KKyAqCisgKiBUaGlzIGlvY3RsIGRvZXMgbm90IHN1cHBvcnQgY29weWluZyBtZW1vcnkgYmV0d2VlbiB0d28gcmVtb3RlCisgKiBwYXJ0aXRpb25zIG9yIHdpdGhpbiB0aGUgc2FtZSBwYXJ0aXRpb24sIHNvIGVpdGhlciAnc291cmNlJyBvcgorICogJ3RhcmdldCcgKGJ1dCBub3QgYm90aCkgbXVzdCBiZSAtMS4gIEluIG90aGVyIHdvcmRzLCBlaXRoZXIKKyAqCisgKiAgICAgIHNvdXJjZSA9PSBsb2NhbCBhbmQgdGFyZ2V0ID09IHJlbW90ZQorICogb3IKKyAqICAgICAgc291cmNlID09IHJlbW90ZSBhbmQgdGFyZ2V0ID09IGxvY2FsCisgKi8KK3N0cnVjdCBmc2xfaHZfaW9jdGxfbWVtY3B5IHsKKwlfX3UzMiByZXQ7CisJX191MzIgc291cmNlOworCV9fdTMyIHRhcmdldDsKKwlfX3UzMiByZXNlcnZlZDsJLyogcGFkZGluZyB0byBlbnN1cmUgbG9jYWxfdmFkZHIgaXMgYWxpZ25lZCAqLworCV9fdTY0IGxvY2FsX3ZhZGRyOworCV9fdTY0IHJlbW90ZV9wYWRkcjsKKwlfX3U2NCBjb3VudDsKK307CisKKy8qKgorICogc3RydWN0IGZzbF9odl9pb2N0bF9kb29yYmVsbCAtIHJpbmcgYSBkb29yYmVsbAorICogQHJldDogcmV0dXJuIGVycm9yIGNvZGUgZnJvbSB0aGUgaHlwZXJ2aXNvcgorICogQGRvb3JiZWxsOiB0aGUgaGFuZGxlIG9mIHRoZSBkb29yYmVsbCB0byByaW5nIGRvb3JiZWxsCisgKgorICogVXNlZCBieSBGU0xfSFZfSU9DVExfRE9PUkJFTEwKKyAqLworc3RydWN0IGZzbF9odl9pb2N0bF9kb29yYmVsbCB7CisJX191MzIgcmV0OworCV9fdTMyIGRvb3JiZWxsOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3Byb3AgLSBnZXQvc2V0IGEgZGV2aWNlIHRyZWUgcHJvcGVydHkKKyAqIEByZXQ6IHJldHVybiBlcnJvciBjb2RlIGZyb20gdGhlIGh5cGVydmlzb3IKKyAqIEBoYW5kbGU6IGhhbmRsZSBvZiBwYXJ0aXRpb24gd2hvc2UgdHJlZSB0byBhY2Nlc3MKKyAqIEBwYXRoOiB2aXJ0dWFsIGFkZHJlc3Mgb2YgcGF0aCBuYW1lIG9mIG5vZGUgdG8gYWNjZXNzCisgKiBAcHJvcG5hbWU6IHZpcnR1YWwgYWRkcmVzcyBvZiBuYW1lIG9mIHByb3BlcnR5IHRvIGFjY2VzcworICogQHByb3B2YWw6IHZpcnR1YWwgYWRkcmVzcyBvZiBwcm9wZXJ0eSBkYXRhIGJ1ZmZlcgorICogQHByb3BsZW46IFNpemUgb2YgcHJvcGVydHkgZGF0YSBidWZmZXIKKyAqIEByZXNlcnZlZDogcmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIDAKKyAqCisgKiBVc2VkIGJ5IEZTTF9IVl9JT0NUTF9ET09SQkVMTAorICovCitzdHJ1Y3QgZnNsX2h2X2lvY3RsX3Byb3AgeworCV9fdTMyIHJldDsKKwlfX3UzMiBoYW5kbGU7CisJX191NjQgcGF0aDsKKwlfX3U2NCBwcm9wbmFtZTsKKwlfX3U2NCBwcm9wdmFsOworCV9fdTMyIHByb3BsZW47CisJX191MzIgcmVzZXJ2ZWQ7CS8qIHBhZGRpbmcgdG8gZW5zdXJlIHN0cnVjdHVyZSBpcyBhbGlnbmVkICovCit9OworCisvKiBUaGUgaW9jdGwgdHlwZSwgZG9jdW1lbnRlZCBpbiBpb2N0bC1udW1iZXIudHh0ICovCisjZGVmaW5lIEZTTF9IVl9JT0NUTF9UWVBFCTB4QUYKKworLyogUmVzdGFydCBhbm90aGVyIHBhcnRpdGlvbiAqLworI2RlZmluZSBGU0xfSFZfSU9DVExfUEFSVElUSU9OX1JFU1RBUlQgXAorCV9JT1dSKEZTTF9IVl9JT0NUTF9UWVBFLCAxLCBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3Jlc3RhcnQpCisKKy8qIEdldCBhIHBhcnRpdGlvbidzIHN0YXR1cyAqLworI2RlZmluZSBGU0xfSFZfSU9DVExfUEFSVElUSU9OX0dFVF9TVEFUVVMgXAorCV9JT1dSKEZTTF9IVl9JT0NUTF9UWVBFLCAyLCBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3N0YXR1cykKKworLyogQm9vdCBhbm90aGVyIHBhcnRpdGlvbiAqLworI2RlZmluZSBGU0xfSFZfSU9DVExfUEFSVElUSU9OX1NUQVJUIFwKKwlfSU9XUihGU0xfSFZfSU9DVExfVFlQRSwgMywgc3RydWN0IGZzbF9odl9pb2N0bF9zdGFydCkKKworLyogU3RvcCB0aGlzIG9yIGFub3RoZXIgcGFydGl0aW9uICovCisjZGVmaW5lIEZTTF9IVl9JT0NUTF9QQVJUSVRJT05fU1RPUCBcCisJX0lPV1IoRlNMX0hWX0lPQ1RMX1RZUEUsIDQsIHN0cnVjdCBmc2xfaHZfaW9jdGxfc3RvcCkKKworLyogQ29weSBkYXRhIGZyb20gb25lIHBhcnRpdGlvbiB0byBhbm90aGVyICovCisjZGVmaW5lIEZTTF9IVl9JT0NUTF9NRU1DUFkgXAorCV9JT1dSKEZTTF9IVl9JT0NUTF9UWVBFLCA1LCBzdHJ1Y3QgZnNsX2h2X2lvY3RsX21lbWNweSkKKworLyogUmluZyBhIGRvb3JiZWxsICovCisjZGVmaW5lIEZTTF9IVl9JT0NUTF9ET09SQkVMTCBcCisJX0lPV1IoRlNMX0hWX0lPQ1RMX1RZUEUsIDYsIHN0cnVjdCBmc2xfaHZfaW9jdGxfZG9vcmJlbGwpCisKKy8qIEdldCBhIHByb3BlcnR5IGZyb20gYW5vdGhlciBndWVzdCdzIGRldmljZSB0cmVlICovCisjZGVmaW5lIEZTTF9IVl9JT0NUTF9HRVRQUk9QIFwKKwlfSU9XUihGU0xfSFZfSU9DVExfVFlQRSwgNywgc3RydWN0IGZzbF9odl9pb2N0bF9wcm9wKQorCisvKiBTZXQgYSBwcm9wZXJ0eSBpbiBhbm90aGVyIGd1ZXN0J3MgZGV2aWNlIHRyZWUgKi8KKyNkZWZpbmUgRlNMX0hWX0lPQ1RMX1NFVFBST1AgXAorCV9JT1dSKEZTTF9IVl9JT0NUTF9UWVBFLCA4LCBzdHJ1Y3QgZnNsX2h2X2lvY3RsX3Byb3ApCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogZnNsX2h2X2V2ZW50X3JlZ2lzdGVyKCkgLSByZWdpc3RlciBhIGNhbGxiYWNrIGZvciBmYWlsb3ZlciBldmVudHMKKyAqIEBuYjogcG9pbnRlciB0byBjYWxsZXItc3VwcGxpZWQgbm90aWZpZXJfYmxvY2sgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZGV2aWNlIGRyaXZlcnMgdG8gcmVnaXN0ZXIgdGhlaXIgY2FsbGJhY2sKKyAqIGZ1bmN0aW9ucyBmb3IgZmFpbC1vdmVyIGV2ZW50cy4KKyAqCisgKiBUaGUgY2FsbGVyIHNob3VsZCBhbGxvY2F0ZSBhIG5vdGlmaWVyX2Jsb2NrIG9iamVjdCBhbmQgaW5pdGlhbGl6ZSB0aGUKKyAqICdwcmlvcml0eScgYW5kICdub3RpZmllcl9jYWxsJyBmaWVsZHMuCisgKi8KK2ludCBmc2xfaHZfZmFpbG92ZXJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CisKKy8qKgorICogZnNsX2h2X2V2ZW50X3VucmVnaXN0ZXIoKSAtIHVucmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgZmFpbG92ZXIgZXZlbnRzCisgKiBAbmI6IHRoZSBzYW1lICduYicgdXNlZCBpbiBwcmV2aW91cyBmc2xfaHZfZmFpbG92ZXJfcmVnaXN0ZXIgY2FsbAorICovCitpbnQgZnNsX2h2X2ZhaWxvdmVyX3VucmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnRyYWNlLmggYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oCmluZGV4IDlkODhlMWMuLmYwYzBlOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnRyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdHJhY2UuaApAQCAtMTksNiArMTksOCBAQAogCiAjaW5jbHVkZSA8YXNtL2Z0cmFjZS5oPgogCitzdHJ1Y3QgZnRyYWNlX2hhc2g7CisKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCiAKIGV4dGVybiBpbnQgZnRyYWNlX2VuYWJsZWQ7CkBAIC0yOSw4ICszMSw2IEBACiAKIHR5cGVkZWYgdm9pZCAoKmZ0cmFjZV9mdW5jX3QpKHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGxvbmcgcGFyZW50X2lwKTsKIAotc3RydWN0IGZ0cmFjZV9oYXNoOwotCiBlbnVtIHsKIAlGVFJBQ0VfT1BTX0ZMX0VOQUJMRUQJCT0gMSA8PCAwLAogCUZUUkFDRV9PUFNfRkxfR0xPQkFMCQk9IDEgPDwgMSwKQEAgLTEyMyw3ICsxMjMsOCBAQAogc3RydWN0IGZ0cmFjZV9mdW5jX2NvbW1hbmQgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAljaGFyCQkJKm5hbWU7Ci0JaW50CQkJKCpmdW5jKShjaGFyICpmdW5jLCBjaGFyICpjbWQsCisJaW50CQkJKCpmdW5jKShzdHJ1Y3QgZnRyYWNlX2hhc2ggKmhhc2gsCisJCQkJCWNoYXIgKmZ1bmMsIGNoYXIgKmNtZCwKIAkJCQkJY2hhciAqcGFyYW1zLCBpbnQgZW5hYmxlKTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmggYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oCmluZGV4IDU5ZDNlZjEuLjk2ZWZhNjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaApAQCAtNzYsNiArNzYsNyBAQAogCXN0cnVjdCB0cmFjZV9lbnRyeQkqZW50OwogCXVuc2lnbmVkIGxvbmcJCWxvc3RfZXZlbnRzOwogCWludAkJCWxlZnRvdmVyOworCWludAkJCWVudF9zaXplOwogCWludAkJCWNwdTsKIAl1NjQJCQl0czsKIApAQCAtMTI5LDYgKzEzMCwxMCBAQAogdm9pZCB0cmFjZV9ub3dha2VfYnVmZmVyX3VubG9ja19jb21taXQoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsCiAJCQkJICAgICAgIHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQsCiAJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYyk7Cit2b2lkIHRyYWNlX25vd2FrZV9idWZmZXJfdW5sb2NrX2NvbW1pdF9yZWdzKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLAorCQkJCQkgICAgc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYywKKwkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHZvaWQgdHJhY2VfY3VycmVudF9idWZmZXJfZGlzY2FyZF9jb21taXQoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsCiAJCQkJCSBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZW5lcmljX2FjbC5oIGIvaW5jbHVkZS9saW51eC9nZW5lcmljX2FjbC5oCmluZGV4IDA0MzdlMzcuLmI2ZDY1NzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2VuZXJpY19hY2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dlbmVyaWNfYWNsLmgKQEAgLTEwLDYgKzEwLDUgQEAKIAogaW50IGdlbmVyaWNfYWNsX2luaXQoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKIGludCBnZW5lcmljX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKik7Ci1pbnQgZ2VuZXJpY19jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncyk7CiAKICNlbmRpZiAvKiBMSU5VWF9HRU5FUklDX0FDTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmggYi9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKaW5kZXggMzAwZDc1OC4uMDJmYTQ2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZW5oZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaApAQCAtNDIwLDcgKzQyMCw3IEBACiAKIGV4dGVybiB2b2lkIGRpc2tfYmxvY2tfZXZlbnRzKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKIGV4dGVybiB2b2lkIGRpc2tfdW5ibG9ja19ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2spOwotZXh0ZXJuIHZvaWQgZGlza19jaGVja19ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2spOworZXh0ZXJuIHZvaWQgZGlza19mbHVzaF9ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2ssIHVuc2lnbmVkIGludCBtYXNrKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZGlza19jbGVhcl9ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2ssIHVuc2lnbmVkIGludCBtYXNrKTsKIAogLyogZHJpdmVycy9jaGFyL3JhbmRvbS5jICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dwaW8uaCBiL2luY2x1ZGUvbGludXgvZ3Bpby5oCmluZGV4IDMyZDQ3ZTcuLjE3YjVhMGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ3Bpby5oCisrKyBiL2luY2x1ZGUvbGludXgvZ3Bpby5oCkBAIC0zLDYgKzMsMTcgQEAKIAogLyogc2VlIERvY3VtZW50YXRpb24vZ3Bpby50eHQgKi8KIAorLyogbWFrZSB0aGVzZSBmbGFnIHZhbHVlcyBhdmFpbGFibGUgcmVnYXJkbGVzcyBvZiBHUElPIGtjb25maWcgb3B0aW9ucyAqLworI2RlZmluZSBHUElPRl9ESVJfT1VUCSgwIDw8IDApCisjZGVmaW5lIEdQSU9GX0RJUl9JTgkoMSA8PCAwKQorCisjZGVmaW5lIEdQSU9GX0lOSVRfTE9XCSgwIDw8IDEpCisjZGVmaW5lIEdQSU9GX0lOSVRfSElHSAkoMSA8PCAxKQorCisjZGVmaW5lIEdQSU9GX0lOCQkoR1BJT0ZfRElSX0lOKQorI2RlZmluZSBHUElPRl9PVVRfSU5JVF9MT1cJKEdQSU9GX0RJUl9PVVQgfCBHUElPRl9JTklUX0xPVykKKyNkZWZpbmUgR1BJT0ZfT1VUX0lOSVRfSElHSAkoR1BJT0ZfRElSX09VVCB8IEdQSU9GX0lOSVRfSElHSCkKKwogI2lmZGVmIENPTkZJR19HRU5FUklDX0dQSU8KICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaCBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCmluZGV4IGJhMzYyMTcuLmY3NDM4ODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCkBAIC05Myw3ICs5Myw3IEBACiAgKi8KICNkZWZpbmUgaW5fbm1pKCkJKHByZWVtcHRfY291bnQoKSAmIE5NSV9NQVNLKQogCi0jaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKKyNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUX0NPVU5UKQogIyBkZWZpbmUgUFJFRU1QVF9DSEVDS19PRkZTRVQgMQogI2Vsc2UKICMgZGVmaW5lIFBSRUVNUFRfQ0hFQ0tfT0ZGU0VUIDAKQEAgLTExNSw3ICsxMTUsNyBAQAogI2RlZmluZSBpbl9hdG9taWNfcHJlZW1wdF9vZmYoKSBcCiAJCSgocHJlZW1wdF9jb3VudCgpICYgflBSRUVNUFRfQUNUSVZFKSAhPSBQUkVFTVBUX0NIRUNLX09GRlNFVCkKIAotI2lmZGVmIENPTkZJR19QUkVFTVBUCisjaWZkZWYgQ09ORklHX1BSRUVNUFRfQ09VTlQKICMgZGVmaW5lIHByZWVtcHRpYmxlKCkJKHByZWVtcHRfY291bnQoKSA9PSAwICYmICFpcnFzX2Rpc2FibGVkKCkpCiAjIGRlZmluZSBJUlFfRVhJVF9PRkZTRVQgKEhBUkRJUlFfT0ZGU0VULTEpCiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWQuaCBiL2luY2x1ZGUvbGludXgvaGlkLmgKaW5kZXggNDJmN2UyZi4uOWNmOGU3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZC5oCkBAIC00NTMsNyArNDUzLDggQEAKIAogZW51bSBoaWRfdHlwZSB7CiAJSElEX1RZUEVfT1RIRVIgPSAwLAotCUhJRF9UWVBFX1VTQk1PVVNFCisJSElEX1RZUEVfVVNCTU9VU0UsCisJSElEX1RZUEVfVVNCTk9ORQogfTsKIAogc3RydWN0IGhpZF9kcml2ZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaCBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCmluZGV4IDUxOTMyZTUuLmZkMGRjMzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCkBAIC0xMzUsNiArMTM1LDcgQEAKICAqIEBjcHVfYmFzZToJCXBlciBjcHUgY2xvY2sgYmFzZQogICogQGluZGV4OgkJY2xvY2sgdHlwZSBpbmRleCBmb3IgcGVyX2NwdSBzdXBwb3J0IHdoZW4gbW92aW5nIGEKICAqCQkJdGltZXIgdG8gYSBiYXNlIG9uIGFub3RoZXIgY3B1LgorICogQGNsb2NraWQ6CQljbG9jayBpZCBmb3IgcGVyX2NwdSBzdXBwb3J0CiAgKiBAYWN0aXZlOgkJcmVkIGJsYWNrIHRyZWUgcm9vdCBub2RlIGZvciB0aGUgYWN0aXZlIHRpbWVycwogICogQHJlc29sdXRpb246CQl0aGUgcmVzb2x1dGlvbiBvZiB0aGUgY2xvY2ssIGluIG5hbm9zZWNvbmRzCiAgKiBAZ2V0X3RpbWU6CQlmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgY3VycmVudCB0aW1lIG9mIHRoZSBjbG9jawpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9odWdldGxiLmggYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAppbmRleCA1OTIyNWVmLi4xOTY0NGUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaApAQCAtMjMxLDYgKzIzMSw5IEBACiBzdHJ1Y3QgaHVnZV9ib290bWVtX3BhZ2UgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgaHN0YXRlICpoc3RhdGU7CisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwlwaHlzX2FkZHJfdCBwaHlzOworI2VuZGlmCiB9OwogCiBzdHJ1Y3QgcGFnZSAqYWxsb2NfaHVnZV9wYWdlX25vZGUoc3RydWN0IGhzdGF0ZSAqaCwgaW50IG5pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h3X2JyZWFrcG9pbnQuaCBiL2luY2x1ZGUvbGludXgvaHdfYnJlYWtwb2ludC5oCmluZGV4IGQxZTU1ZmUuLjZhZTljNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHdfYnJlYWtwb2ludC5oCisrKyBiL2luY2x1ZGUvbGludXgvaHdfYnJlYWtwb2ludC5oCkBAIC03Myw2ICs3Myw3IEBACiBleHRlcm4gc3RydWN0IHBlcmZfZXZlbnQgKgogcmVnaXN0ZXJfdXNlcl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCiAJCQkgICAgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QgdHJpZ2dlcmVkLAorCQkJICAgIHZvaWQgKmNvbnRleHQsCiAJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogCiAvKiBGSVhNRTogb25seSBjaGFuZ2UgZnJvbSB0aGUgYXR0ciwgYW5kIGRvbid0IHVucmVnaXN0ZXIgKi8KQEAgLTg1LDExICs4NiwxMyBAQAogZXh0ZXJuIHN0cnVjdCBwZXJmX2V2ZW50ICoKIHJlZ2lzdGVyX3dpZGVfaHdfYnJlYWtwb2ludF9jcHUoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKIAkJCQlwZXJmX292ZXJmbG93X2hhbmRsZXJfdAl0cmlnZ2VyZWQsCisJCQkJdm9pZCAqY29udGV4dCwKIAkJCQlpbnQgY3B1KTsKIAogZXh0ZXJuIHN0cnVjdCBwZXJmX2V2ZW50ICogX19wZXJjcHUgKgogcmVnaXN0ZXJfd2lkZV9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCi0JCQkgICAgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QgdHJpZ2dlcmVkKTsKKwkJCSAgICBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCB0cmlnZ2VyZWQsCisJCQkgICAgdm9pZCAqY29udGV4dCk7CiAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfcGVyZl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCk7CiBleHRlcm4gaW50IF9fcmVnaXN0ZXJfcGVyZl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCk7CkBAIC0xMTUsNiArMTE4LDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBlcmZfZXZlbnQgKgogcmVnaXN0ZXJfdXNlcl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCiAJCQkgICAgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QgdHJpZ2dlcmVkLAorCQkJICAgIHZvaWQgKmNvbnRleHQsCiAJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCXsgcmV0dXJuIE5VTEw7IH0KIHN0YXRpYyBpbmxpbmUgaW50CiBtb2RpZnlfdXNlcl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCwKQEAgLTEyMiwxMCArMTI2LDEyIEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwZXJmX2V2ZW50ICoKIHJlZ2lzdGVyX3dpZGVfaHdfYnJlYWtwb2ludF9jcHUoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKIAkJCQlwZXJmX292ZXJmbG93X2hhbmRsZXJfdAkgdHJpZ2dlcmVkLAorCQkJCXZvaWQgKmNvbnRleHQsCiAJCQkJaW50IGNwdSkJCXsgcmV0dXJuIE5VTEw7IH0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBlcmZfZXZlbnQgKiBfX3BlcmNwdSAqCiByZWdpc3Rlcl93aWRlX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKLQkJCSAgICBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCB0cmlnZ2VyZWQpCXsgcmV0dXJuIE5VTEw7IH0KKwkJCSAgICBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCB0cmlnZ2VyZWQsCisJCQkgICAgdm9pZCAqY29udGV4dCkJCXsgcmV0dXJuIE5VTEw7IH0KIHN0YXRpYyBpbmxpbmUgaW50CiByZWdpc3Rlcl9wZXJmX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnQgKmJwKQl7IHJldHVybiAtRU5PU1lTOyB9CiBzdGF0aWMgaW5saW5lIGludApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9od19yYW5kb20uaCBiL2luY2x1ZGUvbGludXgvaHdfcmFuZG9tLmgKaW5kZXggOWJlZGU3Ni4uYjRiMGVlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9od19yYW5kb20uaAorKysgYi9pbmNsdWRlL2xpbnV4L2h3X3JhbmRvbS5oCkBAIC0yNSw3ICsyNSw3IEBACiAgKgkJCXRoZXJlIGlzIGFsd2F5cyBkYXRhIGF2YWlsYWJsZS4gICpPQlNPTEVURSoKICAqIEBkYXRhX3JlYWQ6CQlSZWFkIGRhdGEgZnJvbSB0aGUgUk5HIGRldmljZS4KICAqCQkJUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxvd2VyIHJhbmRvbSBieXRlcyBpbiAiZGF0YSIuCi0gKgkJCU11c3Qgbm90IGJlIE5VTEwuICAgICpPU09MRVRFKgorICoJCQlNdXN0IG5vdCBiZSBOVUxMLiAgICAqT0JTT0xFVEUqCiAgKiBAcmVhZDoJCU5ldyBBUEkuIGRyaXZlcnMgY2FuIGZpbGwgdXAgdG8gbWF4IGJ5dGVzIG9mIGRhdGEKICAqCQkJaW50byB0aGUgYnVmZmVyLiBUaGUgYnVmZmVyIGlzIGFsaWduZWQgZm9yIGFueSB0eXBlLgogICogQHByaXY6CQlQcml2YXRlIGRhdGEsIGZvciB1c2UgYnkgdGhlIFJORyBkcml2ZXIuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy9hZHA4ODcwLmggYi9pbmNsdWRlL2xpbnV4L2kyYy9hZHA4ODcwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0ZGNlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL2FkcDg4NzAuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIERlZmluaXRpb25zIGFuZCBwbGF0Zm9ybSBkYXRhIGZvciBBbmFsb2cgRGV2aWNlcworICogQmFja2xpZ2h0IGRyaXZlcnMgQURQODg3MAorICoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfSTJDX0FEUDg4NzBfSAorI2RlZmluZSBfX0xJTlVYX0kyQ19BRFA4ODcwX0gKKworI2RlZmluZSBJRF9BRFA4ODcwCQk4ODcwCisKKyNkZWZpbmUgQURQODg3MF9NQVhfQlJJR0hUTkVTUwkweDdGCisjZGVmaW5lIEZMQUdfT0ZGVF9TSElGVCA4CisKKy8qCisgKiBMRURzIHN1YmRldmljZSBwbGF0Zm9ybSBkYXRhCisgKi8KKworI2RlZmluZSBBRFA4ODcwX0xFRF9ESVNfQkxJTksJKDAgPDwgRkxBR19PRkZUX1NISUZUKQorI2RlZmluZSBBRFA4ODcwX0xFRF9PRkZUXzYwMG1zCSgxIDw8IEZMQUdfT0ZGVF9TSElGVCkKKyNkZWZpbmUgQURQODg3MF9MRURfT0ZGVF8xMjAwbXMJKDIgPDwgRkxBR19PRkZUX1NISUZUKQorI2RlZmluZSBBRFA4ODcwX0xFRF9PRkZUXzE4MDBtcwkoMyA8PCBGTEFHX09GRlRfU0hJRlQpCisKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzIwMG1zCTAKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzYwMG1zCTEKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzgwMG1zCTIKKyNkZWZpbmUgQURQODg3MF9MRURfT05UXzEyMDBtcwkzCisKKyNkZWZpbmUgQURQODg3MF9MRURfRDcJCSg3KQorI2RlZmluZSBBRFA4ODcwX0xFRF9ENgkJKDYpCisjZGVmaW5lIEFEUDg4NzBfTEVEX0Q1CQkoNSkKKyNkZWZpbmUgQURQODg3MF9MRURfRDQJCSg0KQorI2RlZmluZSBBRFA4ODcwX0xFRF9EMwkJKDMpCisjZGVmaW5lIEFEUDg4NzBfTEVEX0QyCQkoMikKKyNkZWZpbmUgQURQODg3MF9MRURfRDEJCSgxKQorCisvKgorICogQmFja2xpZ2h0IHN1YmRldmljZSBwbGF0Zm9ybSBkYXRhCisgKi8KKworI2RlZmluZSBBRFA4ODcwX0JMX0Q3CQkoMSA8PCA2KQorI2RlZmluZSBBRFA4ODcwX0JMX0Q2CQkoMSA8PCA1KQorI2RlZmluZSBBRFA4ODcwX0JMX0Q1CQkoMSA8PCA0KQorI2RlZmluZSBBRFA4ODcwX0JMX0Q0CQkoMSA8PCAzKQorI2RlZmluZSBBRFA4ODcwX0JMX0QzCQkoMSA8PCAyKQorI2RlZmluZSBBRFA4ODcwX0JMX0QyCQkoMSA8PCAxKQorI2RlZmluZSBBRFA4ODcwX0JMX0QxCQkoMSA8PCAwKQorCisjZGVmaW5lIEFEUDg4NzBfRkFERV9UX0RJUwkwCS8qIEZhZGUgVGltZXIgRGlzYWJsZWQgKi8KKyNkZWZpbmUgQURQODg3MF9GQURFX1RfMzAwbXMJMQkvKiAwLjMgU2VjICovCisjZGVmaW5lIEFEUDg4NzBfRkFERV9UXzYwMG1zCTIKKyNkZWZpbmUgQURQODg3MF9GQURFX1RfOTAwbXMJMworI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8xMjAwbXMJNAorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8xNTAwbXMJNQorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8xODAwbXMJNgorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8yMTAwbXMJNworI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8yNDAwbXMJOAorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8yNzAwbXMJOQorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF8zMDAwbXMJMTAKKyNkZWZpbmUgQURQODg3MF9GQURFX1RfMzUwMG1zCTExCisjZGVmaW5lIEFEUDg4NzBfRkFERV9UXzQwMDBtcwkxMgorI2RlZmluZSBBRFA4ODcwX0ZBREVfVF80NTAwbXMJMTMKKyNkZWZpbmUgQURQODg3MF9GQURFX1RfNTAwMG1zCTE0CisjZGVmaW5lIEFEUDg4NzBfRkFERV9UXzU1MDBtcwkxNQkvKiA1LjUgU2VjICovCisKKyNkZWZpbmUgQURQODg3MF9GQURFX0xBV19MSU5FQVIJMAorI2RlZmluZSBBRFA4ODcwX0ZBREVfTEFXX1NRVUFSRQkxCisjZGVmaW5lIEFEUDg4NzBfRkFERV9MQVdfQ1VCSUMxCTIKKyNkZWZpbmUgQURQODg3MF9GQURFX0xBV19DVUJJQzIJMworCisjZGVmaW5lIEFEUDg4NzBfQkxfQU1CTF9GSUxUXzgwbXMJMAkvKiBMaWdodCBzZW5zb3IgZmlsdGVyIHRpbWUgKi8KKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMTYwbXMJMQorI2RlZmluZSBBRFA4ODcwX0JMX0FNQkxfRklMVF8zMjBtcwkyCisjZGVmaW5lIEFEUDg4NzBfQkxfQU1CTF9GSUxUXzY0MG1zCTMKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMTI4MG1zCTQKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMjU2MG1zCTUKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfNTEyMG1zCTYKKyNkZWZpbmUgQURQODg3MF9CTF9BTUJMX0ZJTFRfMTAyNDBtcwk3CS8qIDEwLjI0IHNlYyAqLworCisvKgorICogQmxhY2tsaWdodCBjdXJyZW50IDAuLjMwbUEKKyAqLworI2RlZmluZSBBRFA4ODcwX0JMX0NVUl9tQShJKQkJKChJICogMTI3KSAvIDMwKQorCisvKgorICogTDIgY29tcGFyYXRvciBjdXJyZW50IDAuLjExMDZ1QQorICovCisjZGVmaW5lIEFEUDg4NzBfTDJfQ09NUF9DVVJSX3VBKEkpCSgoSSAqIDI1NSkgLyAxMTA2KQorCisvKgorICogTDMgY29tcGFyYXRvciBjdXJyZW50IDAuLjU1MXVBCisgKi8KKyNkZWZpbmUgQURQODg3MF9MM19DT01QX0NVUlJfdUEoSSkJKChJICogMjU1KSAvIDU1MSkKKworLyoKKyAqIEw0IGNvbXBhcmF0b3IgY3VycmVudCAwLi4yNzV1QQorICovCisjZGVmaW5lIEFEUDg4NzBfTDRfQ09NUF9DVVJSX3VBKEkpCSgoSSAqIDI1NSkgLyAyNzUpCisKKy8qCisgKiBMNSBjb21wYXJhdG9yIGN1cnJlbnQgMC4uMTM4dUEKKyAqLworI2RlZmluZSBBRFA4ODcwX0w1X0NPTVBfQ1VSUl91QShJKQkoKEkgKiAyNTUpIC8gMTM4KQorCitzdHJ1Y3QgYWRwODg3MF9iYWNrbGlnaHRfcGxhdGZvcm1fZGF0YSB7CisJdTggYmxfbGVkX2Fzc2lnbjsJLyogMSA9IEJhY2tsaWdodCAwID0gSW5kaXZpZHVhbCBMRUQgKi8KKwl1OCBwd21fYXNzaWduOwkJLyogMSA9IEVuYWJsZXMgUFdNIG1vZGUgKi8KKworCXU4IGJsX2ZhZGVfaW47CQkvKiBCYWNrbGlnaHQgRmFkZS1JbiBUaW1lciAqLworCXU4IGJsX2ZhZGVfb3V0OwkJLyogQmFja2xpZ2h0IEZhZGUtT3V0IFRpbWVyICovCisJdTggYmxfZmFkZV9sYXc7CQkvKiBmYWRlLW9uL2ZhZGUtb2ZmIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljICovCisKKwl1OCBlbl9hbWJsX3NlbnM7CS8qIDEgPSBlbmFibGUgYW1iaWVudCBsaWdodCBzZW5zb3IgKi8KKwl1OCBhYm1sX2ZpbHQ7CQkvKiBMaWdodCBzZW5zb3IgZmlsdGVyIHRpbWUgKi8KKworCXU4IGwxX2RheWxpZ2h0X21heDsJLyogdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsMV9kYXlsaWdodF9kaW07CS8qIHR5cCA9IDAsIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDJfYnJpZ2h0X21heDsJLyogdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsMl9icmlnaHRfZGltOwkvKiB0eXAgPSAwLCB1c2UgQkxfQ1VSX21BKEkpIDAgPD0gSSA8PSAzMCBtQSAqLworCXU4IGwzX29mZmljZV9tYXg7CS8qIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDNfb2ZmaWNlX2RpbTsJLyogdHlwID0gMCwgdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsNF9pbmRvb3JfbWF4OwkvKiB1c2UgQkxfQ1VSX21BKEkpIDAgPD0gSSA8PSAzMCBtQSAqLworCXU4IGw0X2luZG9yX2RpbTsJLyogdHlwID0gMCwgdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsNV9kYXJrX21heDsJCS8qIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDVfZGFya19kaW07CQkvKiB0eXAgPSAwLCB1c2UgQkxfQ1VSX21BKEkpIDAgPD0gSSA8PSAzMCBtQSAqLworCisJdTggbDJfdHJpcDsJCS8qIHVzZSBMMl9DT01QX0NVUlJfdUEoSSkgMCA8PSBJIDw9IDExMDYgdUEgKi8KKwl1OCBsMl9oeXN0OwkJLyogdXNlIEwyX0NPTVBfQ1VSUl91QShJKSAwIDw9IEkgPD0gMTEwNiB1QSAqLworCXU4IGwzX3RyaXA7CQkvKiB1c2UgTDNfQ09NUF9DVVJSX3VBKEkpIDAgPD0gSSA8PSA1NTEgdUEgKi8KKwl1OCBsM19oeXN0OwkJLyogdXNlIEwzX0NPTVBfQ1VSUl91QShJKSAwIDw9IEkgPD0gNTUxIHVBICovCisJdTggbDRfdHJpcDsJCS8qIHVzZSBMNF9DT01QX0NVUlJfdUEoSSkgMCA8PSBJIDw9IDI3NSB1QSAqLworCXU4IGw0X2h5c3Q7CQkvKiB1c2UgTDRfQ09NUF9DVVJSX3VBKEkpIDAgPD0gSSA8PSAyNzUgdUEgKi8KKwl1OCBsNV90cmlwOwkJLyogdXNlIEw1X0NPTVBfQ1VSUl91QShJKSAwIDw9IEkgPD0gMTM4IHVBICovCisJdTggbDVfaHlzdDsJCS8qIHVzZSBMNl9DT01QX0NVUlJfdUEoSSkgMCA8PSBJIDw9IDEzOCB1QSAqLworCisJLyoqCisJICogSW5kZXBlbmRlbnQgQ3VycmVudCBTaW5rcyAvIExFRFMKKwkgKiBTaW5rcyBub3QgYXNzaWduZWQgdG8gdGhlIEJhY2tsaWdodCBjYW4gYmUgZXhwb3NlZCB0bworCSAqIHVzZXIgc3BhY2UgdXNpbmcgdGhlIExFRFMgQ0xBU1MgaW50ZXJmYWNlCisJICovCisKKwlpbnQgbnVtX2xlZHM7CisJc3RydWN0IGxlZF9pbmZvCSpsZWRzOworCXU4IGxlZF9mYWRlX2luOwkJLyogTEVEIEZhZGUtSW4gVGltZXIgKi8KKwl1OCBsZWRfZmFkZV9vdXQ7CS8qIExFRCBGYWRlLU91dCBUaW1lciAqLworCXU4IGxlZF9mYWRlX2xhdzsJLyogZmFkZS1vbi9mYWRlLW9mZiB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpYyAqLworCXU4IGxlZF9vbl90aW1lOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfSTJDX0FEUDg4NzBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pODI1My5oIGIvaW5jbHVkZS9saW51eC9pODI1My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YmIzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2k4MjUzLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBNYWNoaW5lIHNwZWNpZmljIElPIHBvcnQgYWRkcmVzcyBkZWZpbml0aW9uIGZvciBnZW5lcmljLgorICogIFdyaXR0ZW4gYnkgT3NhbXUgVG9taXRhIDx0b21pdGFAY2luZXQuY28uanA+CisgKi8KKyNpZm5kZWYgX19MSU5VWF9JODI1M19ICisjZGVmaW5lIF9fTElOVVhfSTgyNTNfSAorCisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisKKy8qIGk4MjUzQSBQSVQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBJVF9NT0RFCTB4NDMKKyNkZWZpbmUgUElUX0NIMAkJMHg0MAorI2RlZmluZSBQSVRfQ0gyCQkweDQyCisKKyNkZWZpbmUgUElUX0xBVENICSgoUElUX1RJQ0tfUkFURSArIEhaLzIpIC8gSFopCisKK2V4dGVybiByYXdfc3BpbmxvY2tfdCBpODI1M19sb2NrOworZXh0ZXJuIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgaTgyNTNfY2xvY2tldmVudDsKK2V4dGVybiB2b2lkIGNsb2NrZXZlbnRfaTgyNTNfaW5pdChib29sIG9uZXNob3QpOworCitleHRlcm4gdm9pZCBzZXR1cF9waXRfdGltZXIodm9pZCk7CisKKyNlbmRpZiAvKiBfX0xJTlVYX0k4MjUzX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWVlZTgwMjExLmggYi9pbmNsdWRlL2xpbnV4L2llZWU4MDIxMS5oCmluZGV4IGJmNTZiNmYuLjU0Yzg3ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWVlZTgwMjExLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaApAQCAtMTE3LDggKzExNywxOSBAQAogI2RlZmluZSBJRUVFODAyMTFfTUFYX01FU0hfSURfTEVOCTMyCiAKICNkZWZpbmUgSUVFRTgwMjExX1FPU19DVExfTEVOCQkyCi0jZGVmaW5lIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLCTB4MDAwRgotI2RlZmluZSBJRUVFODAyMTFfUU9TX0NUTF9UQUcxRF9NQVNLCTB4MDAwNworLyogMWQgdGFnIG1hc2sgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1FPU19DVExfVEFHMURfTUFTSwkJMHgwMDA3CisvKiBUSUQgbWFzayAqLworI2RlZmluZSBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSwkJMHgwMDBmCisvKiBFT1NQICovCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfQ1RMX0VPU1AJCQkweDAwMTAKKy8qIEFDSyBwb2xpY3kgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9OT1JNQUwJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfQ1RMX0FDS19QT0xJQ1lfTk9BQ0sJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfQ1RMX0FDS19QT0xJQ1lfTk9fRVhQTAkweDAwNDAKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9CTE9DS0FDSwkweDAwNjAKKy8qIEEtTVNEVSA4MDIuMTFuICovCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfQ1RMX0FfTVNEVV9QUkVTRU5UCTB4MDA4MAogCiAvKiBVLUFQU0QgcXVldWUgZm9yIFdNTSBJRXMgc2VudCBieSBBUCAqLwogI2RlZmluZSBJRUVFODAyMTFfV01NX0lFX0FQX1FPU0lORk9fVUFQU0QJKDE8PDcpCkBAIC0xNDIzLDkgKzE0MzQsNiBAQAogfTsKIAogCi0vKiBBLU1TRFUgODAyLjExbiAqLwotI2RlZmluZSBJRUVFODAyMTFfUU9TX0NPTlRST0xfQV9NU0RVX1BSRVNFTlQgMHgwMDgwCi0KIC8qIGNpcGhlciBzdWl0ZSBzZWxlY3RvcnMgKi8KICNkZWZpbmUgV0xBTl9DSVBIRVJfU1VJVEVfVVNFX0dST1VQCTB4MDAwRkFDMDAKICNkZWZpbmUgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAJCTB4MDAwRkFDMDEKQEAgLTE0NDUsNiArMTQ1Myw0MyBAQAogCiAjZGVmaW5lIFdMQU5fUE1LSURfTEVOCQkJMTYKIAorLyoKKyAqIFdNTS84MDIuMTFlIFRzcGVjIEVsZW1lbnQKKyAqLworI2RlZmluZSBJRUVFODAyMTFfV01NX0lFX1RTUEVDX1RJRF9NQVNLCQkweDBGCisjZGVmaW5lIElFRUU4MDIxMV9XTU1fSUVfVFNQRUNfVElEX1NISUZUCTEKKworZW51bSBpZWVlODAyMTFfdHNwZWNfc3RhdHVzX2NvZGUgeworCUlFRUU4MDIxMV9UU1BFQ19TVEFUVVNfQURNSVNTX0FDQ0VQVEVEID0gMCwKKwlJRUVFODAyMTFfVFNQRUNfU1RBVFVTX0FERFRTX0lOVkFMX1BBUkFNUyA9IDB4MSwKK307CisKK3N0cnVjdCBpZWVlODAyMTFfdHNwZWNfaWUgeworCXU4IGVsZW1lbnRfaWQ7CisJdTggbGVuOworCXU4IG91aVszXTsKKwl1OCBvdWlfdHlwZTsKKwl1OCBvdWlfc3VidHlwZTsKKwl1OCB2ZXJzaW9uOworCV9fbGUxNiB0c2luZm87CisJdTggdHNpbmZvX3Jlc3ZkOworCV9fbGUxNiBub21pbmFsX21zZHU7CisJX19sZTE2IG1heF9tc2R1OworCV9fbGUzMiBtaW5fc2VydmljZV9pbnQ7CisJX19sZTMyIG1heF9zZXJ2aWNlX2ludDsKKwlfX2xlMzIgaW5hY3Rpdml0eV9pbnQ7CisJX19sZTMyIHN1c3BlbnNpb25faW50OworCV9fbGUzMiBzZXJ2aWNlX3N0YXJ0X3RpbWU7CisJX19sZTMyIG1pbl9kYXRhX3JhdGU7CisJX19sZTMyIG1lYW5fZGF0YV9yYXRlOworCV9fbGUzMiBwZWFrX2RhdGFfcmF0ZTsKKwlfX2xlMzIgbWF4X2J1cnN0X3NpemU7CisJX19sZTMyIGRlbGF5X2JvdW5kOworCV9fbGUzMiBtaW5fcGh5X3JhdGU7CisJX19sZTE2IHNiYTsKKwlfX2xlMTYgbWVkaXVtX3RpbWU7Cit9IF9fcGFja2VkOworCiAvKioKICAqIGllZWU4MDIxMV9nZXRfcW9zX2N0bCAtIGdldCBwb2ludGVyIHRvIHFvcyBjb250cm9sIGJ5dGVzCiAgKiBAaGRyOiB0aGUgZnJhbWUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaCBiL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaAppbmRleCAwMDY1ZmZkLi5hM2Q5OWZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCkBAIC03OCwxMCArNzgsMTUgQEAKIAkJCQkJICovCiAjZGVmaW5lIEVUSF9QX1BBRQkweDg4OEUJCS8qIFBvcnQgQWNjZXNzIEVudGl0eSAoSUVFRSA4MDIuMVgpICovCiAjZGVmaW5lIEVUSF9QX0FPRQkweDg4QTIJCS8qIEFUQSBvdmVyIEV0aGVybmV0CQkqLworI2RlZmluZSBFVEhfUF84MDIxQUQJMHg4OEE4ICAgICAgICAgIC8qIDgwMi4xYWQgU2VydmljZSBWTEFOCQkqLwogI2RlZmluZSBFVEhfUF9USVBDCTB4ODhDQQkJLyogVElQQyAJCQkqLworI2RlZmluZSBFVEhfUF84MDIxQUgJMHg4OEU3ICAgICAgICAgIC8qIDgwMi4xYWggQmFja2JvbmUgU2VydmljZSBUYWcgKi8KICNkZWZpbmUgRVRIX1BfMTU4OAkweDg4RjcJCS8qIElFRUUgMTU4OCBUaW1lc3luYyAqLwogI2RlZmluZSBFVEhfUF9GQ09FCTB4ODkwNgkJLyogRmlicmUgQ2hhbm5lbCBvdmVyIEV0aGVybmV0ICAqLwogI2RlZmluZSBFVEhfUF9GSVAJMHg4OTE0CQkvKiBGQ29FIEluaXRpYWxpemF0aW9uIFByb3RvY29sICovCisjZGVmaW5lIEVUSF9QX1FJTlExCTB4OTEwMAkJLyogZGVwcmVjYXRlZCBRaW5RIFZMQU4gWyBOT1QgQU4gT0ZGSUNJQUxMWSBSRUdJU1RFUkVEIElEIF0gKi8KKyNkZWZpbmUgRVRIX1BfUUlOUTIJMHg5MjAwCQkvKiBkZXByZWNhdGVkIFFpblEgVkxBTiBbIE5PVCBBTiBPRkZJQ0lBTExZIFJFR0lTVEVSRUQgSUQgXSAqLworI2RlZmluZSBFVEhfUF9RSU5RMwkweDkzMDAJCS8qIGRlcHJlY2F0ZWQgUWluUSBWTEFOIFsgTk9UIEFOIE9GRklDSUFMTFkgUkVHSVNURVJFRCBJRCBdICovCiAjZGVmaW5lIEVUSF9QX0VEU0EJMHhEQURBCQkvKiBFdGhlcnR5cGUgRFNBIFsgTk9UIEFOIE9GRklDSUFMTFkgUkVHSVNURVJFRCBJRCBdICovCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oIGIvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAppbmRleCA2ZDY2Y2UxLi5jMTQ4NjA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKQEAgLTQ5LDYgKzQ5LDEyIEBACiAjZGVmaW5lIFBBQ0tFVF9WTkVUX0hEUgkJCTE1CiAjZGVmaW5lIFBBQ0tFVF9UWF9USU1FU1RBTVAJCTE2CiAjZGVmaW5lIFBBQ0tFVF9USU1FU1RBTVAJCTE3CisjZGVmaW5lIFBBQ0tFVF9GQU5PVVQJCQkxOAorCisjZGVmaW5lIFBBQ0tFVF9GQU5PVVRfSEFTSAkJMAorI2RlZmluZSBQQUNLRVRfRkFOT1VUX0xCCQkxCisjZGVmaW5lIFBBQ0tFVF9GQU5PVVRfQ1BVCQkyCisjZGVmaW5lIFBBQ0tFVF9GQU5PVVRfRkxBR19ERUZSQUcJMHg4MDAwCiAKIHN0cnVjdCB0cGFja2V0X3N0YXRzIHsKIAl1bnNpZ25lZCBpbnQJdHBfcGFja2V0czsKQEAgLTYyLDYgKzY4LDcgQEAKIAlfX3UxNgkJdHBfbWFjOwogCV9fdTE2CQl0cF9uZXQ7CiAJX191MTYJCXRwX3ZsYW5fdGNpOworCV9fdTE2CQl0cF9wYWRkaW5nOwogfTsKIAogLyogUnggcmluZyAtIGhlYWRlciBzdGF0dXMgKi8KQEAgLTEwMSw2ICsxMDgsNyBAQAogCV9fdTMyCQl0cF9zZWM7CiAJX191MzIJCXRwX25zZWM7CiAJX191MTYJCXRwX3ZsYW5fdGNpOworCV9fdTE2CQl0cF9wYWRkaW5nOwogfTsKIAogI2RlZmluZSBUUEFDS0VUMl9IRFJMRU4JCShUUEFDS0VUX0FMSUdOKHNpemVvZihzdHJ1Y3QgdHBhY2tldDJfaGRyKSkgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKaW5kZXggZGMwMTY4MS4uNDRkYTQ4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKQEAgLTkxLDI1ICs5MSw2IEBACiAJc3RydWN0IHJjdV9oZWFkCQlyY3U7CiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2dyb3VwX2dldF9kZXZpY2Uoc3RydWN0IHZsYW5fZ3JvdXAgKnZnLAotCQkJCQkJICAgICAgIHUxNiB2bGFuX2lkKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICoqYXJyYXk7Ci0JYXJyYXkgPSB2Zy0+dmxhbl9kZXZpY2VzX2FycmF5c1t2bGFuX2lkIC8gVkxBTl9HUk9VUF9BUlJBWV9QQVJUX0xFTl07Ci0JcmV0dXJuIGFycmF5ID8gYXJyYXlbdmxhbl9pZCAlIFZMQU5fR1JPVVBfQVJSQVlfUEFSVF9MRU5dIDogTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHZsYW5fZ3JvdXBfc2V0X2RldmljZShzdHJ1Y3Qgdmxhbl9ncm91cCAqdmcsCi0JCQkJCSB1MTYgdmxhbl9pZCwKLQkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKiphcnJheTsKLQlpZiAoIXZnKQotCQlyZXR1cm47Ci0JYXJyYXkgPSB2Zy0+dmxhbl9kZXZpY2VzX2FycmF5c1t2bGFuX2lkIC8gVkxBTl9HUk9VUF9BUlJBWV9QQVJUX0xFTl07Ci0JYXJyYXlbdmxhbl9pZCAlIFZMQU5fR1JPVVBfQVJSQVlfUEFSVF9MRU5dID0gZGV2OwotfQotCiBzdGF0aWMgaW5saW5lIGludCBpc192bGFuX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogICAgICAgICByZXR1cm4gZGV2LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOOwpAQCAtMTE5LDM1ICsxMDAsMTggQEAKICNkZWZpbmUgdmxhbl90eF90YWdfZ2V0KF9fc2tiKQkJKChfX3NrYiktPnZsYW5fdGNpICYgflZMQU5fVEFHX1BSRVNFTlQpCiAKICNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKLS8qIE11c3QgYmUgaW52b2tlZCB3aXRoIHJjdV9yZWFkX2xvY2sgb3Igd2l0aCBSVE5MLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbl9maW5kX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYsCi0JCQkJCSAgICAgICB1MTYgdmxhbl9pZCkKLXsKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwocmVhbF9kZXYtPnZsZ3JwKTsKIAotCWlmIChncnApCi0JCXJldHVybiB2bGFuX2dyb3VwX2dldF9kZXZpY2UoZ3JwLCB2bGFuX2lkKTsKLQotCXJldHVybiBOVUxMOwotfQotCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKl9fdmxhbl9maW5kX2Rldl9kZWVwKHN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiwKKwkJCQkJICAgICAgIHUxNiB2bGFuX2lkKTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbl9kZXZfcmVhbF9kZXYoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdTE2IHZsYW5fZGV2X3ZsYW5faWQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLWV4dGVybiBpbnQgX192bGFuX2h3YWNjZWxfcngoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKLQkJCSAgICAgdTE2IHZsYW5fdGNpLCBpbnQgcG9sbGluZyk7CiBleHRlcm4gYm9vbCB2bGFuX2RvX3JlY2VpdmUoc3RydWN0IHNrX2J1ZmYgKipza2IpOwogZXh0ZXJuIHN0cnVjdCBza19idWZmICp2bGFuX3VudGFnKHN0cnVjdCBza19idWZmICpza2IpOwotZXh0ZXJuIGdyb19yZXN1bHRfdAotdmxhbl9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsCi0JCSB1bnNpZ25lZCBpbnQgdmxhbl90Y2ksIHN0cnVjdCBza19idWZmICpza2IpOwotZXh0ZXJuIGdyb19yZXN1bHRfdAotdmxhbl9ncm9fZnJhZ3Moc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAotCSAgICAgICB1bnNpZ25lZCBpbnQgdmxhbl90Y2kpOwogCiAjZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbl9maW5kX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYsCi0JCQkJCSAgICAgICB1MTYgdmxhbl9pZCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKgorX192bGFuX2ZpbmRfZGV2X2RlZXAoc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2LCB1MTYgdmxhbl9pZCkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTE2NCwxMyArMTI4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX192bGFuX2h3YWNjZWxfcngoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKLQkJCQkgICAgdTE2IHZsYW5fdGNpLCBpbnQgcG9sbGluZykKLXsKLQlCVUcoKTsKLQlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKLX0KLQogc3RhdGljIGlubGluZSBib29sIHZsYW5fZG9fcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqKnNrYikKIHsKIAlpZiAoKCpza2IpLT52bGFuX3RjaSAmIFZMQU5fVklEX01BU0spCkBAIC0xODIsNTAgKzEzOSwxMCBAQAogewogCXJldHVybiBza2I7CiB9Ci0KLXN0YXRpYyBpbmxpbmUgZ3JvX3Jlc3VsdF90Ci12bGFuX2dyb19yZWNlaXZlKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKLQkJIHVuc2lnbmVkIGludCB2bGFuX3RjaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gR1JPX0RST1A7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgZ3JvX3Jlc3VsdF90Ci12bGFuX2dyb19mcmFncyhzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsCi0JICAgICAgIHVuc2lnbmVkIGludCB2bGFuX3RjaSkKLXsKLQlyZXR1cm4gR1JPX0RST1A7Ci19CiAjZW5kaWYKIAogLyoqCi0gKiB2bGFuX2h3YWNjZWxfcnggLSBuZXRpZl9yeCB3cmFwcGVyIGZvciBWTEFOIFJYIGFjY2VsZXJhdGlvbgotICogQHNrYjogYnVmZmVyCi0gKiBAZ3JwOiB2bGFuIGdyb3VwCi0gKiBAdmxhbl90Y2k6IFZMQU4gVENJIGFzIHJlY2VpdmVkIGZyb20gdGhlIGNhcmQKLSAqLwotc3RhdGljIGlubGluZSBpbnQgdmxhbl9od2FjY2VsX3J4KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAotCQkJCSAgdTE2IHZsYW5fdGNpKQotewotCXJldHVybiBfX3ZsYW5faHdhY2NlbF9yeChza2IsIGdycCwgdmxhbl90Y2ksIDApOwotfQotCi0vKioKLSAqIHZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYiAtIG5ldGlmX3JlY2VpdmVfc2tiIHdyYXBwZXIgZm9yIFZMQU4gUlggYWNjZWxlcmF0aW9uCi0gKiBAc2tiOiBidWZmZXIKLSAqIEBncnA6IHZsYW4gZ3JvdXAKLSAqIEB2bGFuX3RjaTogVkxBTiBUQ0kgYXMgcmVjZWl2ZWQgZnJvbSB0aGUgY2FyZAotICovCi1zdGF0aWMgaW5saW5lIGludCB2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKLQkJCQkJICAgdTE2IHZsYW5fdGNpKQotewotCXJldHVybiBfX3ZsYW5faHdhY2NlbF9yeChza2IsIGdycCwgdmxhbl90Y2ksIDEpOwotfQotCi0vKioKLSAqIF9fdmxhbl9wdXRfdGFnIC0gcmVndWxhciBWTEFOIHRhZyBpbnNlcnRpbmcKKyAqIHZsYW5faW5zZXJ0X3RhZyAtIHJlZ3VsYXIgVkxBTiB0YWcgaW5zZXJ0aW5nCiAgKiBAc2tiOiBza2J1ZmYgdG8gdGFnCiAgKiBAdmxhbl90Y2k6IFZMQU4gVENJIHRvIGluc2VydAogICoKQEAgLTIzNCw4ICsxNTEsMTAgQEAKICAqCiAgKiBGb2xsb3dpbmcgdGhlIHNrYl91bnNoYXJlKCkgZXhhbXBsZSwgaW4gY2FzZSBvZiBlcnJvciwgdGhlIGNhbGxpbmcgZnVuY3Rpb24KICAqIGRvZXNuJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBmcmVlaW5nIHRoZSBvcmlnaW5hbCBza2IuCisgKgorICogRG9lcyBub3QgY2hhbmdlIHNrYi0+cHJvdG9jb2wgc28gdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBkdXJpbmcgcmVjZWl2ZS4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqX192bGFuX3B1dF90YWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHZsYW5fdGNpKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdmxhbl9pbnNlcnRfdGFnKHN0cnVjdCBza19idWZmICpza2IsIHUxNiB2bGFuX3RjaSkKIHsKIAlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZldGg7CiAKQEAgLTI1NSw4ICsxNzQsMjUgQEAKIAkvKiBub3csIHRoZSBUQ0kgKi8KIAl2ZXRoLT5oX3ZsYW5fVENJID0gaHRvbnModmxhbl90Y2kpOwogCi0Jc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMjFRKTsKKwlyZXR1cm4gc2tiOworfQogCisvKioKKyAqIF9fdmxhbl9wdXRfdGFnIC0gcmVndWxhciBWTEFOIHRhZyBpbnNlcnRpbmcKKyAqIEBza2I6IHNrYnVmZiB0byB0YWcKKyAqIEB2bGFuX3RjaTogVkxBTiBUQ0kgdG8gaW5zZXJ0CisgKgorICogSW5zZXJ0cyB0aGUgVkxBTiB0YWcgaW50byBAc2tiIGFzIHBhcnQgb2YgdGhlIHBheWxvYWQKKyAqIFJldHVybnMgYSBWTEFOIHRhZ2dlZCBza2IuIElmIGEgbmV3IHNrYiBpcyBjcmVhdGVkLCBAc2tiIGlzIGZyZWVkLgorICoKKyAqIEZvbGxvd2luZyB0aGUgc2tiX3Vuc2hhcmUoKSBleGFtcGxlLCBpbiBjYXNlIG9mIGVycm9yLCB0aGUgY2FsbGluZyBmdW5jdGlvbgorICogZG9lc24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGZyZWVpbmcgdGhlIG9yaWdpbmFsIHNrYi4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqX192bGFuX3B1dF90YWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHZsYW5fdGNpKQoreworCXNrYiA9IHZsYW5faW5zZXJ0X3RhZyhza2IsIHZsYW5fdGNpKTsKKwlpZiAoc2tiKQorCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyMVEpOwogCXJldHVybiBza2I7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5ldF9scm8uaCBiL2luY2x1ZGUvbGludXgvaW5ldF9scm8uaAppbmRleCBjNDMzNWZhLi4yY2Y1NWFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luZXRfbHJvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbmV0X2xyby5oCkBAIC01MCw3ICs1MCw2IEBACiAJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqbmV4dF9mcmFnOwogCXN0cnVjdCBpcGhkciAqaXBoOwogCXN0cnVjdCB0Y3BoZHIgKnRjcGg7Ci0Jc3RydWN0IHZsYW5fZ3JvdXAgKnZncnA7CiAJX193c3VtICBkYXRhX2NzdW07CiAJX19iZTMyIHRjcF9yY3ZfdHNlY3I7CiAJX19iZTMyIHRjcF9yY3ZfdHN2YWw7CkBAIC02MCw3ICs1OSw2IEBACiAJdTE2IGlwX3RvdF9sZW47CiAJdTE2IHRjcF9zYXdfdHN0YW1wOyAJCS8qIHRpbWVzdGFtcHMgZW5hYmxlZCAqLwogCV9fYmUxNiB0Y3Bfd2luZG93OwotCXUxNiB2bGFuX3RhZzsKIAlpbnQgcGt0X2FnZ3JfY250OwkJLyogY291bnRzIGFnZ3JlZ2F0ZWQgcGFja2V0cyAqLwogCWludCB2bGFuX3BhY2tldDsKIAlpbnQgbXNzOwpAQCAtMTM3LDE2ICsxMzUsNiBAQAogCQkgICAgIHZvaWQgKnByaXYpOwogCiAvKgotICogUHJvY2Vzc2VzIGEgU0tCIHdpdGggVkxBTiBIVyBhY2NlbGVyYXRpb24gc3VwcG9ydAotICovCi0KLXZvaWQgbHJvX3ZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihzdHJ1Y3QgbmV0X2xyb19tZ3IgKmxyb19tZ3IsCi0JCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgc3RydWN0IHZsYW5fZ3JvdXAgKnZncnAsCi0JCQkJICB1MTYgdmxhbl90YWcsCi0JCQkJICB2b2lkICpwcml2KTsKLQotLyoKICAqIFByb2Nlc3NlcyBhIGZyYWdtZW50IGxpc3QKICAqCiAgKiBUaGlzIGZ1bmN0aW9ucyBhZ2dyZWdhdGUgZnJhZ21lbnRzIGFuZCBnZW5lcmF0ZSBTS0JzIGRvIHBhc3MKQEAgLTE2NSwxMyArMTUzLDYgQEAKIAkJICAgICAgIHN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWdzLAogCQkgICAgICAgaW50IGxlbiwgaW50IHRydWVfc2l6ZSwgdm9pZCAqcHJpdiwgX193c3VtIHN1bSk7CiAKLXZvaWQgbHJvX3ZsYW5faHdhY2NlbF9yZWNlaXZlX2ZyYWdzKHN0cnVjdCBuZXRfbHJvX21nciAqbHJvX21nciwKLQkJCQkgICAgc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZ3MsCi0JCQkJICAgIGludCBsZW4sIGludCB0cnVlX3NpemUsCi0JCQkJICAgIHN0cnVjdCB2bGFuX2dyb3VwICp2Z3JwLAotCQkJCSAgICB1MTYgdmxhbl90YWcsCi0JCQkJICAgIHZvaWQgKnByaXYsIF9fd3N1bSBzdW0pOwotCiAvKgogICogRm9yd2FyZCBhbGwgYWdncmVnYXRlZCBTS0JzIGhlbGQgYnkgbHJvX21nciB0byBuZXR3b3JrIHN0YWNrCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmggYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCmluZGV4IDU4MGY3MGMuLmQxNGUwNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaApAQCAtMTc2LDcgKzE3Niw2IEBACiAJLmFsbG9jX2xvY2sJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRCh0c2suYWxsb2NfbG9jayksCQlcCiAJLmpvdXJuYWxfaW5mbwk9IE5VTEwsCQkJCQkJXAogCS5jcHVfdGltZXJzCT0gSU5JVF9DUFVfVElNRVJTKHRzay5jcHVfdGltZXJzKSwJCVwKLQkuZnNfZXhjbAk9IEFUT01JQ19JTklUKDApLAkJCQlcCiAJLnBpX2xvY2sJPSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQodHNrLnBpX2xvY2spLAlcCiAJLnRpbWVyX3NsYWNrX25zID0gNTAwMDAsIC8qIDUwIHVzZWMgZGVmYXVsdCBzbGFjayAqLwkJXAogCS5waWRzID0gewkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lucHV0L3NoX2tleXNjLmggYi9pbmNsdWRlL2xpbnV4L2lucHV0L3NoX2tleXNjLmgKaW5kZXggNjQ5ZGM3Zi4uNWQyNTNjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnB1dC9zaF9rZXlzYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQvc2hfa2V5c2MuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19TSF9LRVlTQ19IX18KICNkZWZpbmUgX19TSF9LRVlTQ19IX18KIAotI2RlZmluZSBTSF9LRVlTQ19NQVhLRVlTIDQ5CisjZGVmaW5lIFNIX0tFWVNDX01BWEtFWVMgNjQKIAogc3RydWN0IHNoX2tleXNjX2luZm8gewogCWVudW0geyBTSF9LRVlTQ19NT0RFXzEsIFNIX0tFWVNDX01PREVfMiwgU0hfS0VZU0NfTU9ERV8zLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggNmMxMjk4OS4uZjZlZmVkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC00MTQsNiArNDE0LDcgQEAKIAlUQVNLTEVUX1NPRlRJUlEsCiAJU0NIRURfU09GVElSUSwKIAlIUlRJTUVSX1NPRlRJUlEsCisJUkNVX1NPRlRJUlEsICAgIC8qIFByZWZlcmFibGUgUkNVIHNob3VsZCBhbHdheXMgYmUgdGhlIGxhc3Qgc29mdGlycSAqLwogCiAJTlJfU09GVElSUVMKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvY29udGV4dC5oIGIvaW5jbHVkZS9saW51eC9pb2NvbnRleHQuaAppbmRleCBiMmVlZTg5Li41MDM3YTBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvY29udGV4dC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW9jb250ZXh0LmgKQEAgLTUsNiArNSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAKIHN0cnVjdCBjZnFfcXVldWU7CitzdHJ1Y3QgY2ZxX3R0aW1lIHsKKwl1bnNpZ25lZCBsb25nIGxhc3RfZW5kX3JlcXVlc3Q7CisKKwl1bnNpZ25lZCBsb25nIHR0aW1lX3RvdGFsOworCXVuc2lnbmVkIGxvbmcgdHRpbWVfc2FtcGxlczsKKwl1bnNpZ25lZCBsb25nIHR0aW1lX21lYW47Cit9OworCiBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgewogCXZvaWQgKmtleTsKIApAQCAtMTIsMTEgKzIwLDcgQEAKIAogCXN0cnVjdCBpb19jb250ZXh0ICppb2M7CiAKLQl1bnNpZ25lZCBsb25nIGxhc3RfZW5kX3JlcXVlc3Q7Ci0KLQl1bnNpZ25lZCBsb25nIHR0aW1lX3RvdGFsOwotCXVuc2lnbmVkIGxvbmcgdHRpbWVfc2FtcGxlczsKLQl1bnNpZ25lZCBsb25nIHR0aW1lX21lYW47CisJc3RydWN0IGNmcV90dGltZSB0dGltZTsKIAogCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVfbGlzdDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSBjaWNfbGlzdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9tbXUuaCBiL2luY2x1ZGUvbGludXgvaW9tbXUuaAppbmRleCAwYTJiYTQwLi45OTQwMzE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvbW11LmgKKysrIGIvaW5jbHVkZS9saW51eC9pb21tdS5oCkBAIC0xOSw2ICsxOSw4IEBACiAjaWZuZGVmIF9fTElOVVhfSU9NTVVfSAogI2RlZmluZSBfX0xJTlVYX0lPTU1VX0gKIAorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKICNkZWZpbmUgSU9NTVVfUkVBRAkoMSkKICNkZWZpbmUgSU9NTVVfV1JJVEUJKDIpCiAjZGVmaW5lIElPTU1VX0NBQ0hFCSg0KSAvKiBETUEgY2FjaGUgY29oZXJlbmN5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaAppbmRleCBlOWJiMjJjLi5jMmViZmU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKQEAgLTEwOSw2ICsxMDksMzYgQEAKIC8qIFBDSSBjb250cm9sIGJpdHMuICBTaGFyZXMgSU9SRVNPVVJDRV9CSVRTIHdpdGggYWJvdmUgUENJIFJPTS4gICovCiAjZGVmaW5lIElPUkVTT1VSQ0VfUENJX0ZJWEVECQkoMTw8NCkJLyogRG8gbm90IG1vdmUgcmVzb3VyY2UgKi8KIAorCisvKiBoZWxwZXJzIHRvIGRlZmluZSByZXNvdXJjZXMgKi8KKyNkZWZpbmUgREVGSU5FX1JFU19OQU1FRChfc3RhcnQsIF9zaXplLCBfbmFtZSwgX2ZsYWdzKQkJCVwKKwl7CQkJCQkJCQlcCisJCS5zdGFydCA9IChfc3RhcnQpLAkJCQkJXAorCQkuZW5kID0gKF9zdGFydCkgKyAoX3NpemUpIC0gMSwJCQkJXAorCQkubmFtZSA9IChfbmFtZSksCQkJCQlcCisJCS5mbGFncyA9IChfZmxhZ3MpLAkJCQkJXAorCX0KKworI2RlZmluZSBERUZJTkVfUkVTX0lPX05BTUVEKF9zdGFydCwgX3NpemUsIF9uYW1lKQkJCVwKKwlERUZJTkVfUkVTX05BTUVEKChfc3RhcnQpLCAoX3NpemUpLCAoX25hbWUpLCBJT1JFU09VUkNFX0lPKQorI2RlZmluZSBERUZJTkVfUkVTX0lPKF9zdGFydCwgX3NpemUpCQkJCQlcCisJREVGSU5FX1JFU19JT19OQU1FRCgoX3N0YXJ0KSwgKF9zaXplKSwgTlVMTCkKKworI2RlZmluZSBERUZJTkVfUkVTX01FTV9OQU1FRChfc3RhcnQsIF9zaXplLCBfbmFtZSkJCQlcCisJREVGSU5FX1JFU19OQU1FRCgoX3N0YXJ0KSwgKF9zaXplKSwgKF9uYW1lKSwgSU9SRVNPVVJDRV9NRU0pCisjZGVmaW5lIERFRklORV9SRVNfTUVNKF9zdGFydCwgX3NpemUpCQkJCQlcCisJREVGSU5FX1JFU19NRU1fTkFNRUQoKF9zdGFydCksIChfc2l6ZSksIE5VTEwpCisKKyNkZWZpbmUgREVGSU5FX1JFU19JUlFfTkFNRUQoX2lycSwgX25hbWUpCQkJCVwKKwlERUZJTkVfUkVTX05BTUVEKChfaXJxKSwgMSwgKF9uYW1lKSwgSU9SRVNPVVJDRV9JUlEpCisjZGVmaW5lIERFRklORV9SRVNfSVJRKF9pcnEpCQkJCQkJXAorCURFRklORV9SRVNfSVJRX05BTUVEKChfaXJxKSwgTlVMTCkKKworI2RlZmluZSBERUZJTkVfUkVTX0RNQV9OQU1FRChfZG1hLCBfbmFtZSkJCQkJXAorCURFRklORV9SRVNfTkFNRUQoKF9kbWEpLCAxLCAoX25hbWUpLCBJT1JFU09VUkNFX0RNQSkKKyNkZWZpbmUgREVGSU5FX1JFU19ETUEoX2RtYSkJCQkJCQlcCisJREVGSU5FX1JFU19ETUFfTkFNRUQoKF9kbWEpLCBOVUxMKQorCiAvKiBQQy9JU0Evd2hhdGV2ZXIgLSB0aGUgbm9ybWFsIFBDIGFkZHJlc3Mgc3BhY2VzOiBJTyBhbmQgbWVtb3J5ICovCiBleHRlcm4gc3RydWN0IHJlc291cmNlIGlvcG9ydF9yZXNvdXJjZTsKIGV4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgaW9tZW1fcmVzb3VyY2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCA4YjQ1Mzg0Li41ZjY5NTA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTk2LDExICs5Niw2IEBACiAKICNkZWZpbmUgSVJRX05PX0JBTEFOQ0lOR19NQVNLCShJUlFfUEVSX0NQVSB8IElSUV9OT19CQUxBTkNJTkcpCiAKLXN0YXRpYyBpbmxpbmUgX19kZXByZWNhdGVkIGJvb2wgQ0hFQ0tfSVJRX1BFUl9DUFUodW5zaWduZWQgaW50IHN0YXR1cykKLXsKLQlyZXR1cm4gc3RhdHVzICYgSVJRX1BFUl9DUFU7Ci19Ci0KIC8qCiAgKiBSZXR1cm4gdmFsdWUgZm9yIGNoaXAtPmlycV9zZXRfYWZmaW5pdHkoKQogICoKQEAgLTY3Niw3ICs2NzEsOCBAQAogdm9pZCBpcnFfZ2NfbWFza19zZXRfYml0KHN0cnVjdCBpcnFfZGF0YSAqZCk7CiB2b2lkIGlycV9nY19tYXNrX2Nscl9iaXQoc3RydWN0IGlycV9kYXRhICpkKTsKIHZvaWQgaXJxX2djX3VubWFza19lbmFibGVfcmVnKHN0cnVjdCBpcnFfZGF0YSAqZCk7Ci12b2lkIGlycV9nY19hY2soc3RydWN0IGlycV9kYXRhICpkKTsKK3ZvaWQgaXJxX2djX2Fja19zZXRfYml0KHN0cnVjdCBpcnFfZGF0YSAqZCk7Cit2b2lkIGlycV9nY19hY2tfY2xyX2JpdChzdHJ1Y3QgaXJxX2RhdGEgKmQpOwogdm9pZCBpcnFfZ2NfbWFza19kaXNhYmxlX3JlZ19hbmRfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCk7CiB2b2lkIGlycV9nY19lb2koc3RydWN0IGlycV9kYXRhICpkKTsKIGludCBpcnFfZ2Nfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnFyZXR1cm4uaCBiL2luY2x1ZGUvbGludXgvaXJxcmV0dXJuLmgKaW5kZXggODE5YWNhYS4uNzE0YmEwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFyZXR1cm4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycXJldHVybi5oCkBAIC04LDkgKzgsOSBAQAogICogQElSUV9XQUtFX1RIUkVBRAloYW5kbGVyIHJlcXVlc3RzIHRvIHdha2UgdGhlIGhhbmRsZXIgdGhyZWFkCiAgKi8KIGVudW0gaXJxcmV0dXJuIHsKLQlJUlFfTk9ORSwKLQlJUlFfSEFORExFRCwKLQlJUlFfV0FLRV9USFJFQUQsCisJSVJRX05PTkUJCT0gKDAgPDwgMCksCisJSVJRX0hBTkRMRUQJCT0gKDEgPDwgMCksCisJSVJRX1dBS0VfVEhSRUFECQk9ICgxIDw8IDEpLAogfTsKIAogdHlwZWRlZiBlbnVtIGlycXJldHVybiBpcnFyZXR1cm5fdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXNjc2lfYm9vdF9zeXNmcy5oIGIvaW5jbHVkZS9saW51eC9pc2NzaV9ib290X3N5c2ZzLmgKaW5kZXggZjFlNmMxOC4uZjBhMmY4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pc2NzaV9ib290X3N5c2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9pc2NzaV9ib290X3N5c2ZzLmgKQEAgLTkyLDYgKzkyLDEzIEBACiAJICogcHJvcGVydGllcy4KIAkgKi8KIAltb2RlX3QgKCppc192aXNpYmxlKSAodm9pZCAqZGF0YSwgaW50IHR5cGUpOworCisJLyoKKwkgKiBEcml2ZXIgc3BlY2lmaWMgcmVsZWFzZSBmdW5jdGlvbi4KKwkgKgorCSAqIFRoZSBmdW5jdGlvbiBzaG91bGQgZnJlZSB0aGUgZGF0YSBwYXNzZWQgaW4uCisJICovCisJdm9pZCAoKnJlbGVhc2UpICh2b2lkICpkYXRhKTsKIH07CiAKIHN0cnVjdCBpc2NzaV9ib290X2tzZXQgewpAQCAtMTAzLDE4ICsxMTAsMjEgQEAKIGlzY3NpX2Jvb3RfY3JlYXRlX2luaXRpYXRvcihzdHJ1Y3QgaXNjc2lfYm9vdF9rc2V0ICpib290X2tzZXQsIGludCBpbmRleCwKIAkJCSAgICB2b2lkICpkYXRhLAogCQkJICAgIHNzaXplX3QgKCpzaG93KSAodm9pZCAqZGF0YSwgaW50IHR5cGUsIGNoYXIgKmJ1ZiksCi0JCQkgICAgbW9kZV90ICgqaXNfdmlzaWJsZSkgKHZvaWQgKmRhdGEsIGludCB0eXBlKSk7CisJCQkgICAgbW9kZV90ICgqaXNfdmlzaWJsZSkgKHZvaWQgKmRhdGEsIGludCB0eXBlKSwKKwkJCSAgICB2b2lkICgqcmVsZWFzZSkgKHZvaWQgKmRhdGEpKTsKIAogc3RydWN0IGlzY3NpX2Jvb3Rfa29iaiAqCiBpc2NzaV9ib290X2NyZWF0ZV9ldGhlcm5ldChzdHJ1Y3QgaXNjc2lfYm9vdF9rc2V0ICpib290X2tzZXQsIGludCBpbmRleCwKIAkJCSAgIHZvaWQgKmRhdGEsCiAJCQkgICBzc2l6ZV90ICgqc2hvdykgKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpLAotCQkJICAgbW9kZV90ICgqaXNfdmlzaWJsZSkgKHZvaWQgKmRhdGEsIGludCB0eXBlKSk7CisJCQkgICBtb2RlX3QgKCppc192aXNpYmxlKSAodm9pZCAqZGF0YSwgaW50IHR5cGUpLAorCQkJICAgdm9pZCAoKnJlbGVhc2UpICh2b2lkICpkYXRhKSk7CiBzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqICoKIGlzY3NpX2Jvb3RfY3JlYXRlX3RhcmdldChzdHJ1Y3QgaXNjc2lfYm9vdF9rc2V0ICpib290X2tzZXQsIGludCBpbmRleCwKIAkJCSB2b2lkICpkYXRhLAogCQkJIHNzaXplX3QgKCpzaG93KSAodm9pZCAqZGF0YSwgaW50IHR5cGUsIGNoYXIgKmJ1ZiksCi0JCQkgbW9kZV90ICgqaXNfdmlzaWJsZSkgKHZvaWQgKmRhdGEsIGludCB0eXBlKSk7CisJCQkgbW9kZV90ICgqaXNfdmlzaWJsZSkgKHZvaWQgKmRhdGEsIGludCB0eXBlKSwKKwkJCSB2b2lkICgqcmVsZWFzZSkgKHZvaWQgKmRhdGEpKTsKIAogc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqaXNjc2lfYm9vdF9jcmVhdGVfa3NldChjb25zdCBjaGFyICpzZXRfbmFtZSk7CiBzdHJ1Y3QgaXNjc2lfYm9vdF9rc2V0ICppc2NzaV9ib290X2NyZWF0ZV9ob3N0X2tzZXQodW5zaWduZWQgaW50IGhvc3Rubyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2piZDIuaCBiL2luY2x1ZGUvbGludXgvamJkMi5oCmluZGV4IDRlY2I3YjEuLmQwODdjMmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamJkMi5oCisrKyBiL2luY2x1ZGUvbGludXgvamJkMi5oCkBAIC0xMDI0LDcgKzEwMjQsNiBAQAogCiAvKiBGaWxpbmcgYnVmZmVycyAqLwogZXh0ZXJuIHZvaWQgamJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoam91cm5hbF90ICosIHN0cnVjdCBqb3VybmFsX2hlYWQgKik7Ci1leHRlcm4gdm9pZCBfX2piZDJfam91cm5hbF91bmZpbGVfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKik7CiBleHRlcm4gdm9pZCBfX2piZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKik7CiBleHRlcm4gdm9pZCBqYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihqb3VybmFsX3QgKiwgc3RydWN0IGpvdXJuYWxfaGVhZCAqKTsKIGV4dGVybiB2b2lkIF9famJkMl9qb3VybmFsX2ZpbGVfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKiwgdHJhbnNhY3Rpb25fdCAqLCBpbnQpOwpAQCAtMTE2NSw3ICsxMTY0LDYgQEAKICAqLwogc3RydWN0IGpvdXJuYWxfaGVhZCAqamJkMl9qb3VybmFsX2FkZF9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqYmQyX2pvdXJuYWxfZ3JhYl9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7Ci12b2lkIGpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogdm9pZCBqYmQyX2pvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCk7CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCBmYjBlNzMyLi45YTQzYWQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTEyMSw3ICsxMjEsNyBAQAogIyBkZWZpbmUgbWlnaHRfcmVzY2hlZCgpIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQCisjaWZkZWYgQ09ORklHX0RFQlVHX0FUT01JQ19TTEVFUAogICB2b2lkIF9fbWlnaHRfc2xlZXAoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBwcmVlbXB0X29mZnNldCk7CiAvKioKICAqIG1pZ2h0X3NsZWVwIC0gYW5ub3RhdGlvbiBmb3IgZnVuY3Rpb25zIHRoYXQgY2FuIHNsZWVwCkBAIC02NDYsMzMgKzY0NiwxMCBAQAogCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsJXAogCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCiAKLXN0cnVjdCBzeXNpbmZvOwotZXh0ZXJuIGludCBkb19zeXNpbmZvKHN0cnVjdCBzeXNpbmZvICppbmZvKTsKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2RlZmluZSBTSV9MT0FEX1NISUZUCTE2Ci1zdHJ1Y3Qgc3lzaW5mbyB7Ci0JbG9uZyB1cHRpbWU7CQkJLyogU2Vjb25kcyBzaW5jZSBib290ICovCi0JdW5zaWduZWQgbG9uZyBsb2Fkc1szXTsJCS8qIDEsIDUsIGFuZCAxNSBtaW51dGUgbG9hZCBhdmVyYWdlcyAqLwotCXVuc2lnbmVkIGxvbmcgdG90YWxyYW07CQkvKiBUb3RhbCB1c2FibGUgbWFpbiBtZW1vcnkgc2l6ZSAqLwotCXVuc2lnbmVkIGxvbmcgZnJlZXJhbTsJCS8qIEF2YWlsYWJsZSBtZW1vcnkgc2l6ZSAqLwotCXVuc2lnbmVkIGxvbmcgc2hhcmVkcmFtOwkvKiBBbW91bnQgb2Ygc2hhcmVkIG1lbW9yeSAqLwotCXVuc2lnbmVkIGxvbmcgYnVmZmVycmFtOwkvKiBNZW1vcnkgdXNlZCBieSBidWZmZXJzICovCi0JdW5zaWduZWQgbG9uZyB0b3RhbHN3YXA7CS8qIFRvdGFsIHN3YXAgc3BhY2Ugc2l6ZSAqLwotCXVuc2lnbmVkIGxvbmcgZnJlZXN3YXA7CQkvKiBzd2FwIHNwYWNlIHN0aWxsIGF2YWlsYWJsZSAqLwotCXVuc2lnbmVkIHNob3J0IHByb2NzOwkJLyogTnVtYmVyIG9mIGN1cnJlbnQgcHJvY2Vzc2VzICovCi0JdW5zaWduZWQgc2hvcnQgcGFkOwkJLyogZXhwbGljaXQgcGFkZGluZyBmb3IgbTY4ayAqLwotCXVuc2lnbmVkIGxvbmcgdG90YWxoaWdoOwkvKiBUb3RhbCBoaWdoIG1lbW9yeSBzaXplICovCi0JdW5zaWduZWQgbG9uZyBmcmVlaGlnaDsJCS8qIEF2YWlsYWJsZSBoaWdoIG1lbW9yeSBzaXplICovCi0JdW5zaWduZWQgaW50IG1lbV91bml0OwkJLyogTWVtb3J5IHVuaXQgc2l6ZSBpbiBieXRlcyAqLwotCWNoYXIgX2ZbMjAtMipzaXplb2YobG9uZyktc2l6ZW9mKGludCldOwkvKiBQYWRkaW5nOiBsaWJjNSB1c2VzIHRoaXMuLiAqLwotfTsKLQogI2lmZGVmIF9fQ0hFQ0tFUl9fCiAjZGVmaW5lIEJVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMihuKQotI2RlZmluZSBCVUlMRF9CVUdfT05fWkVSTyhlKQotI2RlZmluZSBCVUlMRF9CVUdfT05fTlVMTChlKQorI2RlZmluZSBCVUlMRF9CVUdfT05fWkVSTyhlKSAoMCkKKyNkZWZpbmUgQlVJTERfQlVHX09OX05VTEwoZSkgKCh2b2lkKikwKQogI2RlZmluZSBCVUlMRF9CVUdfT04oY29uZGl0aW9uKQogI2Vsc2UgLyogX19DSEVDS0VSX18gKi8KIApAQCAtNzM2LDQgKzcxMywyNyBAQAogIyBkZWZpbmUgUkVCVUlMRF9EVUVfVE9fRlRSQUNFX01DT1VOVF9SRUNPUkQKICNlbmRpZgogCitzdHJ1Y3Qgc3lzaW5mbzsKK2V4dGVybiBpbnQgZG9fc3lzaW5mbyhzdHJ1Y3Qgc3lzaW5mbyAqaW5mbyk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNkZWZpbmUgU0lfTE9BRF9TSElGVAkxNgorc3RydWN0IHN5c2luZm8geworCWxvbmcgdXB0aW1lOwkJCS8qIFNlY29uZHMgc2luY2UgYm9vdCAqLworCXVuc2lnbmVkIGxvbmcgbG9hZHNbM107CQkvKiAxLCA1LCBhbmQgMTUgbWludXRlIGxvYWQgYXZlcmFnZXMgKi8KKwl1bnNpZ25lZCBsb25nIHRvdGFscmFtOwkJLyogVG90YWwgdXNhYmxlIG1haW4gbWVtb3J5IHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIGZyZWVyYW07CQkvKiBBdmFpbGFibGUgbWVtb3J5IHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIHNoYXJlZHJhbTsJLyogQW1vdW50IG9mIHNoYXJlZCBtZW1vcnkgKi8KKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnJhbTsJLyogTWVtb3J5IHVzZWQgYnkgYnVmZmVycyAqLworCXVuc2lnbmVkIGxvbmcgdG90YWxzd2FwOwkvKiBUb3RhbCBzd2FwIHNwYWNlIHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIGZyZWVzd2FwOwkJLyogc3dhcCBzcGFjZSBzdGlsbCBhdmFpbGFibGUgKi8KKwl1bnNpZ25lZCBzaG9ydCBwcm9jczsJCS8qIE51bWJlciBvZiBjdXJyZW50IHByb2Nlc3NlcyAqLworCXVuc2lnbmVkIHNob3J0IHBhZDsJCS8qIGV4cGxpY2l0IHBhZGRpbmcgZm9yIG02OGsgKi8KKwl1bnNpZ25lZCBsb25nIHRvdGFsaGlnaDsJLyogVG90YWwgaGlnaCBtZW1vcnkgc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcgZnJlZWhpZ2g7CQkvKiBBdmFpbGFibGUgaGlnaCBtZW1vcnkgc2l6ZSAqLworCXVuc2lnbmVkIGludCBtZW1fdW5pdDsJCS8qIE1lbW9yeSB1bml0IHNpemUgaW4gYnl0ZXMgKi8KKwljaGFyIF9mWzIwLTIqc2l6ZW9mKGxvbmcpLXNpemVvZihpbnQpXTsJLyogUGFkZGluZzogbGliYzUgdXNlcyB0aGlzLi4gKi8KK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rbW9kLmggYi9pbmNsdWRlL2xpbnV4L2ttb2QuaAppbmRleCBkNGE1Yzg0Li4wZGEzOGNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ttb2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ttb2QuaApAQCAtNDUsNyArNDUsNyBAQAogI2VuZGlmCiAKIAotc3RydWN0IGtleTsKK3N0cnVjdCBjcmVkOwogc3RydWN0IGZpbGU7CiAKIGVudW0gdW1oX3dhaXQgewpAQCAtNjIsNyArNjIsNyBAQAogCWNoYXIgKiplbnZwOwogCWVudW0gdW1oX3dhaXQgd2FpdDsKIAlpbnQgcmV0dmFsOwotCWludCAoKmluaXQpKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8pOworCWludCAoKmluaXQpKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sIHN0cnVjdCBjcmVkICpuZXcpOwogCXZvaWQgKCpjbGVhbnVwKShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvKTsKIAl2b2lkICpkYXRhOwogfTsKQEAgLTczLDcgKzczLDcgQEAKIAogLyogU2V0IHZhcmlvdXMgcGllY2VzIG9mIHN0YXRlIGludG8gdGhlIHN1YnByb2Nlc3NfaW5mbyBzdHJ1Y3R1cmUgKi8KIHZvaWQgY2FsbF91c2VybW9kZWhlbHBlcl9zZXRmbnMoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywKLQkJICAgIGludCAoKmluaXQpKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8pLAorCQkgICAgaW50ICgqaW5pdCkoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldyksCiAJCSAgICB2b2lkICgqY2xlYW51cCkoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbyksCiAJCSAgICB2b2lkICpkYXRhKTsKIApAQCAtODcsNyArODcsNyBAQAogc3RhdGljIGlubGluZSBpbnQKIGNhbGxfdXNlcm1vZGVoZWxwZXJfZm5zKGNoYXIgKnBhdGgsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCwKIAkJCWVudW0gdW1oX3dhaXQgd2FpdCwKLQkJCWludCAoKmluaXQpKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8pLAorCQkJaW50ICgqaW5pdCkoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldyksCiAJCQl2b2lkICgqY2xlYW51cCkoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqKSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rbXNnX2R1bXAuaCBiL2luY2x1ZGUvbGludXgva21zZ19kdW1wLmgKaW5kZXggMmEwZDdkNi4uZWUwYzk1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rbXNnX2R1bXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ttc2dfZHVtcC5oCkBAIC0xMiw2ICsxMiw3IEBACiAjaWZuZGVmIF9MSU5VWF9LTVNHX0RVTVBfSAogI2RlZmluZSBfTElOVVhfS01TR19EVU1QX0gKIAorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiBlbnVtIGttc2dfZHVtcF9yZWFzb24gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rb2JqZWN0X25zLmggYi9pbmNsdWRlL2xpbnV4L2tvYmplY3RfbnMuaAppbmRleCA4MmNiNWJmLi5mNjZiMDY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tvYmplY3RfbnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tvYmplY3RfbnMuaApAQCAtMzIsMTUgKzMyLDE3IEBACiAKIC8qCiAgKiBDYWxsYmFja3Mgc28gc3lzZnMgY2FuIGRldGVybWluZSBuYW1lc3BhY2VzCi0gKiAgIEBjdXJyZW50X25zOiByZXR1cm4gY2FsbGluZyB0YXNrJ3MgbmFtZXNwYWNlCisgKiAgIEBncmFiX2N1cnJlbnRfbnM6IHJldHVybiBhIG5ldyByZWZlcmVuY2UgdG8gY2FsbGluZyB0YXNrJ3MgbmFtZXNwYWNlCiAgKiAgIEBuZXRsaW5rX25zOiByZXR1cm4gbmFtZXNwYWNlIHRvIHdoaWNoIGEgc29jayBiZWxvbmdzIChyaWdodD8pCiAgKiAgIEBpbml0aWFsX25zOiByZXR1cm4gdGhlIGluaXRpYWwgbmFtZXNwYWNlIChpLmUuIGluaXRfbmV0X25zKQorICogICBAZHJvcF9uczogZHJvcHMgYSByZWZlcmVuY2UgdG8gbmFtZXNwYWNlCiAgKi8KIHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyB7CiAJZW51bSBrb2JqX25zX3R5cGUgdHlwZTsKLQljb25zdCB2b2lkICooKmN1cnJlbnRfbnMpKHZvaWQpOworCXZvaWQgKigqZ3JhYl9jdXJyZW50X25zKSh2b2lkKTsKIAljb25zdCB2b2lkICooKm5ldGxpbmtfbnMpKHN0cnVjdCBzb2NrICpzayk7CiAJY29uc3Qgdm9pZCAqKCppbml0aWFsX25zKSh2b2lkKTsKKwl2b2lkICgqZHJvcF9ucykodm9pZCAqKTsKIH07CiAKIGludCBrb2JqX25zX3R5cGVfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGtvYmpfbnNfdHlwZV9vcGVyYXRpb25zICpvcHMpOwpAQCAtNDgsOSArNTAsOSBAQAogY29uc3Qgc3RydWN0IGtvYmpfbnNfdHlwZV9vcGVyYXRpb25zICprb2JqX2NoaWxkX25zX29wcyhzdHJ1Y3Qga29iamVjdCAqcGFyZW50KTsKIGNvbnN0IHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyAqa29ial9uc19vcHMoc3RydWN0IGtvYmplY3QgKmtvYmopOwogCi1jb25zdCB2b2lkICprb2JqX25zX2N1cnJlbnQoZW51bSBrb2JqX25zX3R5cGUgdHlwZSk7Cit2b2lkICprb2JqX25zX2dyYWJfY3VycmVudChlbnVtIGtvYmpfbnNfdHlwZSB0eXBlKTsKIGNvbnN0IHZvaWQgKmtvYmpfbnNfbmV0bGluayhlbnVtIGtvYmpfbnNfdHlwZSB0eXBlLCBzdHJ1Y3Qgc29jayAqc2spOwogY29uc3Qgdm9pZCAqa29ial9uc19pbml0aWFsKGVudW0ga29ial9uc190eXBlIHR5cGUpOwotdm9pZCBrb2JqX25zX2V4aXQoZW51bSBrb2JqX25zX3R5cGUgdHlwZSwgY29uc3Qgdm9pZCAqbnMpOwordm9pZCBrb2JqX25zX2Ryb3AoZW51bSBrb2JqX25zX3R5cGUgdHlwZSwgdm9pZCAqbnMpOwogCiAjZW5kaWYgLyogX0xJTlVYX0tPQkpFQ1RfTlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm0uaCBiL2luY2x1ZGUvbGludXgva3ZtLmgKaW5kZXggNTVlZjE4MS4uMmMzNjZiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2t2bS5oCkBAIC0xNjEsNiArMTYxLDcgQEAKICNkZWZpbmUgS1ZNX0VYSVRfTk1JICAgICAgICAgICAgICAxNgogI2RlZmluZSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUiAgIDE3CiAjZGVmaW5lIEtWTV9FWElUX09TSSAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgS1ZNX0VYSVRfUEFQUl9IQ0FMTAkgIDE5CiAKIC8qIEZvciBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUiAqLwogI2RlZmluZSBLVk1fSU5URVJOQUxfRVJST1JfRU1VTEFUSU9OIDEKQEAgLTI2NCw2ICsyNjUsMTEgQEAKIAkJc3RydWN0IHsKIAkJCV9fdTY0IGdwcnNbMzJdOwogCQl9IG9zaTsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IG5yOworCQkJX191NjQgcmV0OworCQkJX191NjQgYXJnc1s5XTsKKwkJfSBwYXByX2hjYWxsOwogCQkvKiBGaXggdGhlIHNpemUgb2YgdGhlIHVuaW9uLiAqLwogCQljaGFyIHBhZGRpbmdbMjU2XTsKIAl9OwpAQCAtNTQ0LDYgKzU1MCw5IEBACiAjZGVmaW5lIEtWTV9DQVBfVFNDX0NPTlRST0wgNjAKICNkZWZpbmUgS1ZNX0NBUF9HRVRfVFNDX0tIWiA2MQogI2RlZmluZSBLVk1fQ0FQX1BQQ19CT09LRV9TUkVHUyA2MgorI2RlZmluZSBLVk1fQ0FQX1NQQVBSX1RDRSA2MworI2RlZmluZSBLVk1fQ0FQX1BQQ19TTVQgNjQKKyNkZWZpbmUgS1ZNX0NBUF9QUENfUk1BCTY1CiAKICNpZmRlZiBLVk1fQ0FQX0lSUV9ST1VUSU5HCiAKQEAgLTc0Niw2ICs3NTUsOSBAQAogLyogQXZhaWxhYmxlIHdpdGggS1ZNX0NBUF9YQ1JTICovCiAjZGVmaW5lIEtWTV9HRVRfWENSUwkJICBfSU9SKEtWTUlPLCAgMHhhNiwgc3RydWN0IGt2bV94Y3JzKQogI2RlZmluZSBLVk1fU0VUX1hDUlMJCSAgX0lPVyhLVk1JTywgIDB4YTcsIHN0cnVjdCBrdm1feGNycykKKyNkZWZpbmUgS1ZNX0NSRUFURV9TUEFQUl9UQ0UJICBfSU9XKEtWTUlPLCAgMHhhOCwgc3RydWN0IGt2bV9jcmVhdGVfc3BhcHJfdGNlKQorLyogQXZhaWxhYmxlIHdpdGggS1ZNX0NBUF9STUEgKi8KKyNkZWZpbmUgS1ZNX0FMTE9DQVRFX1JNQQkgIF9JT1IoS1ZNSU8sICAweGE5LCBzdHJ1Y3Qga3ZtX2FsbG9jYXRlX3JtYSkKIAogI2RlZmluZSBLVk1fREVWX0FTU0lHTl9FTkFCTEVfSU9NTVUJKDEgPDwgMCkKIApAQCAtNzczLDIwICs3ODUsMTQgQEAKIAogc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEgewogCV9fdTMyIGFzc2lnbmVkX2Rldl9pZDsKLQlfX3UzMiBob3N0X2lycTsKKwlfX3UzMiBob3N0X2lycTsgLyogaWdub3JlZCAobGVnYWN5IGZpZWxkKSAqLwogCV9fdTMyIGd1ZXN0X2lycTsKIAlfX3UzMiBmbGFnczsKIAl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX3UzMiBhZGRyX2xvOwotCQkJX191MzIgYWRkcl9oaTsKLQkJCV9fdTMyIGRhdGE7Ci0JCX0gZ3Vlc3RfbXNpOwogCQlfX3UzMiByZXNlcnZlZFsxMl07CiAJfTsKIH07CiAKLQogc3RydWN0IGt2bV9hc3NpZ25lZF9tc2l4X25yIHsKIAlfX3UzMiBhc3NpZ25lZF9kZXZfaWQ7CiAJX191MTYgZW50cnlfbnI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKaW5kZXggMzFlYmI1OS4uZWFiYjIxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCisrKyBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaApAQCAtNDcsNiArNDcsNyBAQAogI2RlZmluZSBLVk1fUkVRX0RFQUNUSVZBVEVfRlBVICAgIDEwCiAjZGVmaW5lIEtWTV9SRVFfRVZFTlQgICAgICAgICAgICAgMTEKICNkZWZpbmUgS1ZNX1JFUV9BUEZfSEFMVCAgICAgICAgICAxMgorI2RlZmluZSBLVk1fUkVRX1NURUFMX1VQREFURSAgICAgIDEzCiAKICNkZWZpbmUgS1ZNX1VTRVJTUEFDRV9JUlFfU09VUkNFX0lECTAKIApAQCAtMzI2LDEyICszMjcsMTcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2Vycm9yX2hwYShocGFfdCBocGEpIHsgcmV0dXJuIGhwYSA+PiBIUEFfTVNCOyB9CiAKIGV4dGVybiBzdHJ1Y3QgcGFnZSAqYmFkX3BhZ2U7CitleHRlcm4gc3RydWN0IHBhZ2UgKmZhdWx0X3BhZ2U7CisKIGV4dGVybiBwZm5fdCBiYWRfcGZuOworZXh0ZXJuIHBmbl90IGZhdWx0X3BmbjsKIAogaW50IGlzX2Vycm9yX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogaW50IGlzX2Vycm9yX3BmbihwZm5fdCBwZm4pOwogaW50IGlzX2h3cG9pc29uX3BmbihwZm5fdCBwZm4pOwogaW50IGlzX2ZhdWx0X3BmbihwZm5fdCBwZm4pOworaW50IGlzX25vc2xvdF9wZm4ocGZuX3QgcGZuKTsKK2ludCBpc19pbnZhbGlkX3BmbihwZm5fdCBwZm4pOwogaW50IGt2bV9pc19lcnJvcl9odmEodW5zaWduZWQgbG9uZyBhZGRyKTsKIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLAogCQkJICBzdHJ1Y3Qga3ZtX3VzZXJzcGFjZV9tZW1vcnlfcmVnaW9uICptZW0sCkBAIC0zODEsNiArMzg3LDggQEAKIGludCBrdm1fcmVhZF9ndWVzdF9hdG9taWMoc3RydWN0IGt2bSAqa3ZtLCBncGFfdCBncGEsIHZvaWQgKmRhdGEsCiAJCQkgIHVuc2lnbmVkIGxvbmcgbGVuKTsKIGludCBrdm1fcmVhZF9ndWVzdChzdHJ1Y3Qga3ZtICprdm0sIGdwYV90IGdwYSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBsZW4pOworaW50IGt2bV9yZWFkX2d1ZXN0X2NhY2hlZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBnZm5fdG9faHZhX2NhY2hlICpnaGMsCisJCQkgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGxlbik7CiBpbnQga3ZtX3dyaXRlX2d1ZXN0X3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIGNvbnN0IHZvaWQgKmRhdGEsCiAJCQkgaW50IG9mZnNldCwgaW50IGxlbik7CiBpbnQga3ZtX3dyaXRlX2d1ZXN0KHN0cnVjdCBrdm0gKmt2bSwgZ3BhX3QgZ3BhLCBjb25zdCB2b2lkICpkYXRhLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sZWQtbG0zNTMwLmggYi9pbmNsdWRlL2xpbnV4L2xlZC1sbTM1MzAuaAppbmRleCA1ODU5MmZhLi44ZWIxMjM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xlZC1sbTM1MzAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xlZC1sbTM1MzAuaApAQCAtODQsNiArODQsOCBAQAogICogQGJydF9yYW1wX3Jpc2U6IHJhdGUgb2YgcmlzZSBvZiBsZWQgY3VycmVudAogICogQGFsczFfcmVzaXN0b3Jfc2VsOiBpbnRlcm5hbCByZXNpc3RhbmNlIGZyb20gQUxTMSBpbnB1dCB0byBncm91bmQKICAqIEBhbHMyX3Jlc2lzdG9yX3NlbDogaW50ZXJuYWwgcmVzaXN0YW5jZSBmcm9tIEFMUzIgaW5wdXQgdG8gZ3JvdW5kCisgKiBAYWxzX3ZtaW46IGFscyBpbnB1dCB2b2x0YWdlIGNhbGlicmF0ZWQgZm9yIG1heCBicmlnaHRuZXNzIGluIG1WCisgKiBAYWxzX3ZtYXg6IGFscyBpbnB1dCB2b2x0YWdlIGNhbGlicmF0ZWQgZm9yIG1pbiBicmlnaHRuZXNzIGluIG1WCiAgKiBAYnJ0X3ZhbDogYnJpZ2h0bmVzcyB2YWx1ZSAoMC0yNTUpCiAgKi8KIHN0cnVjdCBsbTM1MzBfcGxhdGZvcm1fZGF0YSB7CkBAIC0xMDEsNiArMTAzLDkgQEAKIAl1OCBhbHMxX3Jlc2lzdG9yX3NlbDsKIAl1OCBhbHMyX3Jlc2lzdG9yX3NlbDsKIAorCXUzMiBhbHNfdm1pbjsKKwl1MzIgYWxzX3ZtYXg7CisKIAl1OCBicnRfdmFsOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sZ3Vlc3QuaCBiL2luY2x1ZGUvbGludXgvbGd1ZXN0LmgKaW5kZXggMmZiMWRjYi4uOTk2MmM2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sZ3Vlc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xndWVzdC5oCkBAIC01OSw4ICs1OSw2IEBACiAJdW5zaWduZWQgbG9uZyByZXNlcnZlX21lbTsKIAkvKiBLSHogZm9yIHRoZSBUU0MgY2xvY2suICovCiAJdTMyIHRzY19raHo7Ci0JLyogUGFnZSB3aGVyZSB0aGUgdG9wLWxldmVsIHBhZ2V0YWJsZSBpcyAqLwotCXVuc2lnbmVkIGxvbmcgcGdkaXI7CiAKIC8qIEZpZWxkcyBpbml0aWFsaXplZCBieSB0aGUgR3Vlc3QgYXQgYm9vdDogKi8KIAkvKiBJbnN0cnVjdGlvbiByYW5nZSB0byBzdXBwcmVzcyBpbnRlcnJ1cHRzIGV2ZW4gaWYgZW5hYmxlZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWJhdGEuaCBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKaW5kZXggNWE5OTI2Yi4uZWZkNmY5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saWJhdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCkBAIC03NCw2ICs3NCwxNiBAQAogCiAjZGVmaW5lIEJQUklOVEsoZm10LCBhcmdzLi4uKSBpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfREVCVUdNU0cpIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyMgYXJncykKIAorI2RlZmluZSBhdGFfcHJpbnRfdmVyc2lvbl9vbmNlKGRldiwgdmVyc2lvbikJCQlcCisoewkJCQkJCQkJXAorCXN0YXRpYyBib29sIF9fcHJpbnRfb25jZTsJCQkJXAorCQkJCQkJCQlcCisJaWYgKCFfX3ByaW50X29uY2UpIHsJCQkJCVwKKwkJX19wcmludF9vbmNlID0gdHJ1ZTsJCQkJXAorCQlhdGFfcHJpbnRfdmVyc2lvbihkZXYsIHZlcnNpb24pOwkJXAorCX0JCQkJCQkJXAorfSkKKwogLyogTkVXOiBkZWJ1ZyBsZXZlbHMgKi8KICNkZWZpbmUgSEFWRV9MSUJBVEFfTVNHIDEKIApAQCAtMTI0NCwyMCArMTI1NCw1MCBAQAogLyoKICAqIHByaW50ayBoZWxwZXJzCiAgKi8KLSNkZWZpbmUgYXRhX3BvcnRfcHJpbnRrKGFwLCBsdiwgZm10LCBhcmdzLi4uKSBcCi0JcHJpbnRrKCIlc2F0YSV1OiAiZm10LCBsdiwgKGFwKS0+cHJpbnRfaWQgLCAjI2FyZ3MpCitfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKQoraW50IGF0YV9wb3J0X3ByaW50ayhjb25zdCBzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBjb25zdCBjaGFyICpsZXZlbCwKKwkJICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK19fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpCitpbnQgYXRhX2xpbmtfcHJpbnRrKGNvbnN0IHN0cnVjdCBhdGFfbGluayAqbGluaywgY29uc3QgY2hhciAqbGV2ZWwsCisJCSAgICBjb25zdCBjaGFyICpmbXQsIC4uLik7CitfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKQoraW50IGF0YV9kZXZfcHJpbnRrKGNvbnN0IHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmxldmVsLAorCQkgICBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKLSNkZWZpbmUgYXRhX2xpbmtfcHJpbnRrKGxpbmssIGx2LCBmbXQsIGFyZ3MuLi4pIGRvIHsgXAotCWlmIChzYXRhX3BtcF9hdHRhY2hlZCgobGluayktPmFwKSB8fCAobGluayktPmFwLT5zbGF2ZV9saW5rKQlcCi0JCXByaW50aygiJXNhdGEldS4lMDJ1OiAiZm10LCBsdiwgKGxpbmspLT5hcC0+cHJpbnRfaWQsCVwKLQkJICAgICAgIChsaW5rKS0+cG1wICwgIyNhcmdzKTsgXAotCWVsc2UgXAotCQlwcmludGsoIiVzYXRhJXU6ICJmbXQsIGx2LCAobGluayktPmFwLT5wcmludF9pZCAsICMjYXJncyk7IFwKLQl9IHdoaWxlKDApCisjZGVmaW5lIGF0YV9wb3J0X2VycihhcCwgZm10LCAuLi4pCQkJCVwKKwlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCBmbXQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGF0YV9wb3J0X3dhcm4oYXAsIGZtdCwgLi4uKQkJCQlcCisJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX1dBUk5JTkcsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgYXRhX3BvcnRfbm90aWNlKGFwLCBmbXQsIC4uLikJCQkJXAorCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9OT1RJQ0UsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgYXRhX3BvcnRfaW5mbyhhcCwgZm10LCAuLi4pCQkJCVwKKwlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywgZm10LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBhdGFfcG9ydF9kYmcoYXAsIGZtdCwgLi4uKQkJCQlcCisJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0RFQlVHLCBmbXQsICMjX19WQV9BUkdTX18pCiAKLSNkZWZpbmUgYXRhX2Rldl9wcmludGsoZGV2LCBsdiwgZm10LCBhcmdzLi4uKSBcCi0JcHJpbnRrKCIlc2F0YSV1LiUwMnU6ICJmbXQsIGx2LCAoZGV2KS0+bGluay0+YXAtPnByaW50X2lkLAlcCi0JICAgICAgIChkZXYpLT5saW5rLT5wbXAgKyAoZGV2KS0+ZGV2bm8gLCAjI2FyZ3MpCisjZGVmaW5lIGF0YV9saW5rX2VycihsaW5rLCBmbXQsIC4uLikJCQkJXAorCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwgZm10LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBhdGFfbGlua193YXJuKGxpbmssIGZtdCwgLi4uKQkJCQlcCisJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fV0FSTklORywgZm10LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBhdGFfbGlua19ub3RpY2UobGluaywgZm10LCAuLi4pCQkJCVwKKwlhdGFfbGlua19wcmludGsobGluaywgS0VSTl9OT1RJQ0UsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgYXRhX2xpbmtfaW5mbyhsaW5rLCBmbXQsIC4uLikJCQkJXAorCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0lORk8sIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgYXRhX2xpbmtfZGJnKGxpbmssIGZtdCwgLi4uKQkJCQlcCisJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fREVCVUcsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKworI2RlZmluZSBhdGFfZGV2X2VycihkZXYsIGZtdCwgLi4uKQkJCQlcCisJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0VSUiwgZm10LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBhdGFfZGV2X3dhcm4oZGV2LCBmbXQsIC4uLikJCQkJXAorCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCBmbXQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGF0YV9kZXZfbm90aWNlKGRldiwgZm10LCAuLi4pCQkJCVwKKwlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fTk9USUNFLCBmbXQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGF0YV9kZXZfaW5mbyhkZXYsIGZtdCwgLi4uKQkJCQlcCisJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgYXRhX2Rldl9kYmcoZGV2LCBmbXQsIC4uLikJCQkJXAorCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywgZm10LCAjI19fVkFfQVJHU19fKQorCit2b2lkIGF0YV9wcmludF92ZXJzaW9uKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqdmVyc2lvbik7CiAKIC8qCiAgKiBhdGFfZWhfaW5mbyBoZWxwZXJzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaCBiL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCmluZGV4IDk3MjRhMzguLjUwOTQwZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCkBAIC04NCw2ICs4NCw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXBfZnJvbV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CitleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKnRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKIAogc3RhdGljIGlubGluZQogaW50IG1tX21hdGNoX2Nncm91cChjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwgY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXAgKmNncm91cCkKQEAgLTI0Niw2ICsyNDcsMTEgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IG1tX21hdGNoX2Nncm91cChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKIHsKIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtb3J5LmggYi9pbmNsdWRlL2xpbnV4L21lbW9yeS5oCmluZGV4IGUxZTNiMmIuLjkzNTY5OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtb3J5LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1vcnkuaApAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAorI2RlZmluZSBNSU5fTUVNT1JZX0JMT0NLX1NJWkUgICAgICgxIDw8IFNFQ1RJT05fU0laRV9CSVRTKQorCiBzdHJ1Y3QgbWVtb3J5X2Jsb2NrIHsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3NlY3Rpb25fbnI7CiAJdW5zaWduZWQgbG9uZyBlbmRfc2VjdGlvbl9ucjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaAppbmRleCA4MTIyMDE4ZC4uMGI4ZTJhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaApAQCAtNjgsMTIgKzY4LDE5IEBACiBleHRlcm4gaW50IHpvbmVfZ3Jvd19mcmVlX2xpc3RzKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIG5ld19ucl9wYWdlcyk7CiBleHRlcm4gaW50IHpvbmVfZ3Jvd193YWl0cXVldWVzKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKTsKIGV4dGVybiBpbnQgYWRkX29uZV9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHBmbiwgaW50IGJhZF9wcHJvKTsKLS8qIG5lZWQgc29tZSBkZWZpbmVzIGZvciB0aGVzZSBmb3IgYXJjaHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0ICovCi1leHRlcm4gdm9pZCBvbmxpbmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiAvKiBWTSBpbnRlcmZhY2UgdGhhdCBtYXkgYmUgdXNlZCBieSBmaXJtd2FyZSBpbnRlcmZhY2UgKi8KIGV4dGVybiBpbnQgb25saW5lX3BhZ2VzKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHZvaWQgX19vZmZsaW5lX2lzb2xhdGVkX3BhZ2VzKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogCit0eXBlZGVmIHZvaWQgKCpvbmxpbmVfcGFnZV9jYWxsYmFja190KShzdHJ1Y3QgcGFnZSAqcGFnZSk7CisKK2V4dGVybiBpbnQgc2V0X29ubGluZV9wYWdlX2NhbGxiYWNrKG9ubGluZV9wYWdlX2NhbGxiYWNrX3QgY2FsbGJhY2spOworZXh0ZXJuIGludCByZXN0b3JlX29ubGluZV9wYWdlX2NhbGxiYWNrKG9ubGluZV9wYWdlX2NhbGxiYWNrX3QgY2FsbGJhY2spOworCitleHRlcm4gdm9pZCBfX29ubGluZV9wYWdlX3NldF9saW1pdHMoc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIHZvaWQgX19vbmxpbmVfcGFnZV9pbmNyZW1lbnRfY291bnRlcnMoc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIHZvaWQgX19vbmxpbmVfcGFnZV9mcmVlKHN0cnVjdCBwYWdlICpwYWdlKTsKKwogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFCiBleHRlcm4gYm9vbCBpc19wYWdlYmxvY2tfcmVtb3ZhYmxlX25vbG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSk7CiAjZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RSRU1PVkUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2RzMXdtLmggYi9pbmNsdWRlL2xpbnV4L21mZC9kczF3bS5oCmluZGV4IGJlNDY5YTMuLjM4YTM3MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2RzMXdtLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvZHMxd20uaApAQCAtMyw0ICszLDExIEBACiBzdHJ1Y3QgZHMxd21fZHJpdmVyX2RhdGEgewogCWludCBhY3RpdmVfaGlnaDsKIAlpbnQgY2xvY2tfcmF0ZTsKKwkvKiBpbiBtaWxsaXNlY29uZHMsIHRoZSBhbW91bnQgb2YgdGltZSB0byAqLworCS8qIHNsZWVwIGZvbGxvd2luZyBhIHJlc2V0IHB1bHNlLiBaZXJvICAgICovCisJLyogc2hvdWxkIHdvcmsgaWYgeW91ciBidXMgZGV2aWNlcyByZWNvdmVyKi8KKwkvKiB0aW1lIHJlc3BlY3RzIHRoZSAxLXdpcmUgc3BlYyBzaW5jZSB0aGUqLworCS8qIGRzMXdtIGltcGxlbWVudHMgdGhlIHByZWNpc2UgdGltaW5ncyBvZiovCisJLyogYSByZXNldCBwdWxzZS9wcmVzZW5jZSBkZXRlY3Qgc2VxdWVuY2UuKi8KKwl1bnNpZ25lZCBpbnQgcmVzZXRfcmVjb3Zlcl9kZWxheTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9wbTh4eHgvcnRjLmggYi9pbmNsdWRlL2xpbnV4L21mZC9wbTh4eHgvcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmMTk4MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3BtOHh4eC9ydGMuaApAQCAtMCwwICsxLDI1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fUlRDX1BNOFhYWF9IX18KKyNkZWZpbmUgX19SVENfUE04WFhYX0hfXworCisjZGVmaW5lIFBNOFhYWF9SVENfREVWX05BTUUgICAgICJydGMtcG04eHh4IgorLyoqCisgKiBzdHJ1Y3QgcG04eHh4X3J0Y19wZGF0YSAtIFJUQyBkcml2ZXIgcGxhdGZvcm0gZGF0YQorICogQHJ0Y193cml0ZV9lbmFibGU6IHZhcmlhYmxlIHN0YXRpbmcgUlRDIHdyaXRlIGNhcGFiaWxpdHkKKyAqLworc3RydWN0IHBtOHh4eF9ydGNfcGxhdGZvcm1fZGF0YSB7CisJYm9vbCBydGNfd3JpdGVfZW5hYmxlOworfTsKKworI2VuZGlmIC8qIF9fUlRDX1BNOFhYWF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3RtaW8uaCBiL2luY2x1ZGUvbGludXgvbWZkL3RtaW8uaAppbmRleCA1YTkwMjY2Li4wZGM5ODA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC90bWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvdG1pby5oCkBAIC02OCw2ICs2OCwxMSBAQAogICogY29udHJvbGxlciBhbmQgcmVwb3J0IHRoZSBldmVudCB0byB0aGUgZHJpdmVyLgogICovCiAjZGVmaW5lIFRNSU9fTU1DX0hBU19DT0xEX0NECQkoMSA8PCAzKQorLyoKKyAqIFNvbWUgY29udHJvbGxlcnMgcmVxdWlyZSB3YWl0aW5nIGZvciB0aGUgU0QgYnVzIHRvIGJlY29tZQorICogaWRsZSBiZWZvcmUgd3JpdGluZyB0byBzb21lIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZSBUTUlPX01NQ19IQVNfSURMRV9XQUlUCQkoMSA8PCA0KQogCiBpbnQgdG1pb19jb3JlX21tY19lbmFibGUodm9pZCBfX2lvbWVtICpjbmYsIGludCBzaGlmdCwgdW5zaWduZWQgbG9uZyBiYXNlKTsKIGludCB0bWlvX2NvcmVfbW1jX3Jlc3VtZSh2b2lkIF9faW9tZW0gKmNuZiwgaW50IHNoaWZ0LCB1bnNpZ25lZCBsb25nIGJhc2UpOwpAQCAtODAsNiArODUsOCBAQAogCWludCBhbGlnbm1lbnRfc2hpZnQ7CiB9OwogCitzdHJ1Y3QgdG1pb19tbWNfaG9zdDsKKwogLyoKICAqIGRhdGEgZm9yIHRoZSBNTUMgY29udHJvbGxlcgogICovCkBAIC05NCw2ICsxMDEsNyBAQAogCXZvaWQgKCpzZXRfcHdyKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpob3N0LCBpbnQgc3RhdGUpOwogCXZvaWQgKCpzZXRfY2xrX2Rpdikoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaG9zdCwgaW50IHN0YXRlKTsKIAlpbnQgKCpnZXRfY2QpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmhvc3QpOworCWludCAoKndyaXRlMTZfaG9vaykoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBhZGRyKTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0bWlvX21tY19jZF93YWtldXAoc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU5MTAuaCBiL2luY2x1ZGUvbGludXgvbWZkL3RwczY1OTEwLmgKaW5kZXggOGJiODViOS4uNzM1NzJjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU5MTAuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTkxMC5oCkBAIC0yNjksNyArMjY5LDcgQEAKICNkZWZpbmUgTERPMV9TRUxfTUFTSwkJCQkJMHhGQwogI2RlZmluZSBMRE8zX1NFTF9NQVNLCQkJCQkweDdDCiAjZGVmaW5lIExET19NSU5fVk9MVAkJCQkJMTAwMAotI2RlZmluZSBMRE9fTUFYX1ZPTFQJCQkJCTMzMDA7CisjZGVmaW5lIExET19NQVhfVk9MVAkJCQkJMzMwMAogCiAKIC8qUmVnaXN0ZXIgVkRJRzEgICgweDgwKSByZWdpc3Rlci5SZWdpc3RlckRlc2NyaXB0aW9uICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21paS5oIGIvaW5jbHVkZS9saW51eC9taWkuaAppbmRleCAzNTlmYmE4Li4xMDMxMTNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21paS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWlpLmgKQEAgLTEyOCw2ICsxMjgsOCBAQAogLyogMTAwMEJBU0UtVCBDb250cm9sIHJlZ2lzdGVyICovCiAjZGVmaW5lIEFEVkVSVElTRV8xMDAwRlVMTCAgICAgIDB4MDIwMCAgLyogQWR2ZXJ0aXNlIDEwMDBCQVNFLVQgZnVsbCBkdXBsZXggKi8KICNkZWZpbmUgQURWRVJUSVNFXzEwMDBIQUxGICAgICAgMHgwMTAwICAvKiBBZHZlcnRpc2UgMTAwMEJBU0UtVCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBDVEwxMDAwX0FTX01BU1RFUgkweDA4MDAKKyNkZWZpbmUgQ1RMMTAwMF9FTkFCTEVfTUFTVEVSCTB4MTAwMAogCiAvKiAxMDAwQkFTRS1UIFN0YXR1cyByZWdpc3RlciAqLwogI2RlZmluZSBMUEFfMTAwMExPQ0FMUlhPSyAgICAgICAweDIwMDAgIC8qIExpbmsgcGFydG5lciBsb2NhbCByZWNlaXZlciBzdGF0dXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NC9jbWQuaCBiL2luY2x1ZGUvbGludXgvbWx4NC9jbWQuaAppbmRleCA5YTE4NjY3Li5iNTZlNDU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDQvY21kLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg0L2NtZC5oCkBAIC0xMjMsNiArMTIzLDkgQEAKIAkvKiBkZWJ1ZyBjb21tYW5kcyAqLwogCU1MWDRfQ01EX1FVRVJZX0RFQlVHX01TRyA9IDB4MmEsCiAJTUxYNF9DTURfU0VUX0RFQlVHX01TRwkgPSAweDJiLAorCisJLyogc3RhdGlzdGljcyBjb21tYW5kcyAqLworCU1MWDRfQ01EX1FVRVJZX0lGX1NUQVQJID0gMFg1NCwKIH07CiAKIGVudW0gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCmluZGV4IDg5ODU3NjguLjM4NzMyOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKQEAgLTU4LDIyICs1OCwyOCBAQAogfTsKIAogZW51bSB7Ci0JTUxYNF9ERVZfQ0FQX0ZMQUdfUkMJCT0gMSA8PCAgMCwKLQlNTFg0X0RFVl9DQVBfRkxBR19VQwkJPSAxIDw8ICAxLAotCU1MWDRfREVWX0NBUF9GTEFHX1VECQk9IDEgPDwgIDIsCi0JTUxYNF9ERVZfQ0FQX0ZMQUdfU1JRCQk9IDEgPDwgIDYsCi0JTUxYNF9ERVZfQ0FQX0ZMQUdfSVBPSUJfQ1NVTQk9IDEgPDwgIDcsCi0JTUxYNF9ERVZfQ0FQX0ZMQUdfQkFEX1BLRVlfQ05UUgk9IDEgPDwgIDgsCi0JTUxYNF9ERVZfQ0FQX0ZMQUdfQkFEX1FLRVlfQ05UUgk9IDEgPDwgIDksCi0JTUxYNF9ERVZfQ0FQX0ZMQUdfRFBEUAkJPSAxIDw8IDEyLAotCU1MWDRfREVWX0NBUF9GTEFHX0JMSAkJPSAxIDw8IDE1LAotCU1MWDRfREVWX0NBUF9GTEFHX01FTV9XSU5ET1cJPSAxIDw8IDE2LAotCU1MWDRfREVWX0NBUF9GTEFHX0FQTQkJPSAxIDw8IDE3LAotCU1MWDRfREVWX0NBUF9GTEFHX0FUT01JQwk9IDEgPDwgMTgsCi0JTUxYNF9ERVZfQ0FQX0ZMQUdfUkFXX01DQVNUCT0gMSA8PCAxOSwKLQlNTFg0X0RFVl9DQVBfRkxBR19VRF9BVl9QT1JUCT0gMSA8PCAyMCwKLQlNTFg0X0RFVl9DQVBfRkxBR19VRF9NQ0FTVAk9IDEgPDwgMjEsCi0JTUxYNF9ERVZfQ0FQX0ZMQUdfSUJPRQkJPSAxIDw8IDMwCisJTUxYNF9ERVZfQ0FQX0ZMQUdfUkMJCT0gMUxMIDw8ICAwLAorCU1MWDRfREVWX0NBUF9GTEFHX1VDCQk9IDFMTCA8PCAgMSwKKwlNTFg0X0RFVl9DQVBfRkxBR19VRAkJPSAxTEwgPDwgIDIsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfU1JRCQk9IDFMTCA8PCAgNiwKKwlNTFg0X0RFVl9DQVBfRkxBR19JUE9JQl9DU1VNCT0gMUxMIDw8ICA3LAorCU1MWDRfREVWX0NBUF9GTEFHX0JBRF9QS0VZX0NOVFIJPSAxTEwgPDwgIDgsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfQkFEX1FLRVlfQ05UUgk9IDFMTCA8PCAgOSwKKwlNTFg0X0RFVl9DQVBfRkxBR19EUERQCQk9IDFMTCA8PCAxMiwKKwlNTFg0X0RFVl9DQVBfRkxBR19CTEgJCT0gMUxMIDw8IDE1LAorCU1MWDRfREVWX0NBUF9GTEFHX01FTV9XSU5ET1cJPSAxTEwgPDwgMTYsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfQVBNCQk9IDFMTCA8PCAxNywKKwlNTFg0X0RFVl9DQVBfRkxBR19BVE9NSUMJPSAxTEwgPDwgMTgsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfUkFXX01DQVNUCT0gMUxMIDw8IDE5LAorCU1MWDRfREVWX0NBUF9GTEFHX1VEX0FWX1BPUlQJPSAxTEwgPDwgMjAsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfVURfTUNBU1QJPSAxTEwgPDwgMjEsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfSUJPRQkJPSAxTEwgPDwgMzAsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfVUNfTE9PUEJBQ0sJPSAxTEwgPDwgMzIsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfV09MCQk9IDFMTCA8PCAzOCwKKwlNTFg0X0RFVl9DQVBfRkxBR19VRFBfUlNTCT0gMUxMIDw8IDQwLAorCU1MWDRfREVWX0NBUF9GTEFHX1ZFUF9VQ19TVEVFUgk9IDFMTCA8PCA0MSwKKwlNTFg0X0RFVl9DQVBfRkxBR19WRVBfTUNfU1RFRVIJPSAxTEwgPDwgNDIsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfQ09VTlRFUlMJPSAxTEwgPDwgNDgKIH07CiAKIGVudW0gewpAQCAtMjUzLDE1ICsyNTksMTAgQEAKIAlpbnQJCQltdHRfZW50cnlfc3o7CiAJdTMyCQkJbWF4X21zZ19zejsKIAl1MzIJCQlwYWdlX3NpemVfY2FwOwotCXUzMgkJCWZsYWdzOworCXU2NAkJCWZsYWdzOwogCXUzMgkJCWJtbWVfZmxhZ3M7CiAJdTMyCQkJcmVzZXJ2ZWRfbGtleTsKIAl1MTYJCQlzdGF0X3JhdGVfc3VwcG9ydDsKLQlpbnQJCQl1ZHBfcnNzOwotCWludAkJCWxvb3BiYWNrX3N1cHBvcnQ7Ci0JaW50CQkJdmVwX3VjX3N0ZWVyaW5nOwotCWludAkJCXZlcF9tY19zdGVlcmluZzsKLQlpbnQJCQl3b2w7CiAJdTgJCQlwb3J0X3dpZHRoX2NhcFtNTFg0X01BWF9QT1JUUyArIDFdOwogCWludAkJCW1heF9nc29fc3o7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRfcXBzX2NudFtNTFg0X05VTV9RUF9SRUdJT05dOwpAQCAtMjc0LDYgKzI3NSw3IEBACiAJdTgJCQlzdXBwb3J0ZWRfdHlwZVtNTFg0X01BWF9QT1JUUyArIDFdOwogCXUzMgkJCXBvcnRfbWFzazsKIAllbnVtIG1seDRfcG9ydF90eXBlCXBvc3NpYmxlX3R5cGVbTUxYNF9NQVhfUE9SVFMgKyAxXTsKKwl1MzIJCQltYXhfY291bnRlcnM7CiB9OwogCiBzdHJ1Y3QgbWx4NF9idWZfbGlzdCB7CkBAIC00MzgsNiArNDQwLDE3IEBACiAJc3RydWN0IG1seDRfZXRoX2F2CWV0aDsKIH07CiAKK3N0cnVjdCBtbHg0X2NvdW50ZXIgeworCXU4CXJlc2VydmVkMVszXTsKKwl1OAljb3VudGVyX21vZGU7CisJX19iZTMyCW51bV9pZmM7CisJdTMyCXJlc2VydmVkMlsyXTsKKwlfX2JlNjQJcnhfZnJhbWVzOworCV9fYmU2NAlyeF9ieXRlczsKKwlfX2JlNjQJdHhfZnJhbWVzOworCV9fYmU2NAl0eF9ieXRlczsKK307CisKIHN0cnVjdCBtbHg0X2RldiB7CiAJc3RydWN0IHBjaV9kZXYJICAgICAgICpwZGV2OwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwpAQCAtNTY4LDQgKzU4MSw3IEBACiBpbnQgbWx4NF93b2xfcmVhZChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTY0ICpjb25maWcsIGludCBwb3J0KTsKIGludCBtbHg0X3dvbF93cml0ZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTY0IGNvbmZpZywgaW50IHBvcnQpOwogCitpbnQgbWx4NF9jb3VudGVyX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgKmlkeCk7Cit2b2lkIG1seDRfY291bnRlcl9mcmVlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgaWR4KTsKKwogI2VuZGlmIC8qIE1MWDRfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oIGIvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKaW5kZXggOWU5ZWIyMS4uNDAwMWM4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKQEAgLTU0LDcgKzU0LDggQEAKIAlNTFg0X1FQX09QVFBBUl9SRVRSWV9DT1VOVAkJPSAxIDw8IDEyLAogCU1MWDRfUVBfT1BUUEFSX1JOUl9SRVRSWQkJPSAxIDw8IDEzLAogCU1MWDRfUVBfT1BUUEFSX0FDS19USU1FT1VUCQk9IDEgPDwgMTQsCi0JTUxYNF9RUF9PUFRQQVJfU0NIRURfUVVFVUUJCT0gMSA8PCAxNgorCU1MWDRfUVBfT1BUUEFSX1NDSEVEX1FVRVVFCQk9IDEgPDwgMTYsCisJTUxYNF9RUF9PUFRQQVJfQ09VTlRFUl9JTkRFWAkJPSAxIDw8IDIwCiB9OwogCiBlbnVtIG1seDRfcXBfc3RhdGUgewpAQCAtOTksNyArMTAwLDcgQEAKIAl1OAkJCWZsOwogCXU4CQkJcmVzZXJ2ZWQxWzJdOwogCXU4CQkJcGtleV9pbmRleDsKLQl1OAkJCXJlc2VydmVkMjsKKwl1OAkJCWNvdW50ZXJfaW5kZXg7CiAJdTgJCQlncmhfbXlsbWM7CiAJX19iZTE2CQkJcmxpZDsKIAl1OAkJCWFja3RvOwpAQCAtMTExLDggKzExMiw3IEBACiAJdTgJCQlzY2hlZF9xdWV1ZTsKIAl1OAkJCXZsYW5faW5kZXg7CiAJdTgJCQlyZXNlcnZlZDNbMl07Ci0JdTgJCQljb3VudGVyX2luZGV4OwotCXU4CQkJcmVzZXJ2ZWQ0OworCXU4CQkJcmVzZXJ2ZWQ0WzJdOwogCXU4CQkJZG1hY1s2XTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCA5NjcwZjcxLi4zMTcyYTFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRfc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zaHJpbmtlci5oPgogCiBzdHJ1Y3QgbWVtcG9saWN5Owogc3RydWN0IGFub25fdm1hOwpAQCAtNjM2LDcgKzYzNyw3IEBACiAjZGVmaW5lIFNFQ1RJT05TX01BU0sJCSgoMVVMIDw8IFNFQ1RJT05TX1dJRFRIKSAtIDEpCiAjZGVmaW5lIFpPTkVJRF9NQVNLCQkoKDFVTCA8PCBaT05FSURfU0hJRlQpIC0gMSkKIAotc3RhdGljIGlubGluZSBlbnVtIHpvbmVfdHlwZSBwYWdlX3pvbmVudW0oc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW5saW5lIGVudW0gem9uZV90eXBlIHBhZ2Vfem9uZW51bShjb25zdCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlyZXR1cm4gKHBhZ2UtPmZsYWdzID4+IFpPTkVTX1BHU0hJRlQpICYgWk9ORVNfTUFTSzsKIH0KQEAgLTY2NCwxNSArNjY1LDE1IEBACiB9CiAKICNpZmRlZiBOT0RFX05PVF9JTl9QQUdFX0ZMQUdTCi1leHRlcm4gaW50IHBhZ2VfdG9fbmlkKHN0cnVjdCBwYWdlICpwYWdlKTsKK2V4dGVybiBpbnQgcGFnZV90b19uaWQoY29uc3Qgc3RydWN0IHBhZ2UgKnBhZ2UpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfdG9fbmlkKHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGlubGluZSBpbnQgcGFnZV90b19uaWQoY29uc3Qgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJcmV0dXJuIChwYWdlLT5mbGFncyA+PiBOT0RFU19QR1NISUZUKSAmIE5PREVTX01BU0s7CiB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgem9uZSAqcGFnZV96b25lKHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgem9uZSAqcGFnZV96b25lKGNvbnN0IHN0cnVjdCBwYWdlICpwYWdlKQogewogCXJldHVybiAmTk9ERV9EQVRBKHBhZ2VfdG9fbmlkKHBhZ2UpKS0+bm9kZV96b25lc1twYWdlX3pvbmVudW0ocGFnZSldOwogfQpAQCAtNzE3LDkgKzcxOCw5IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC92bXN0YXQuaD4KIAotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICpsb3dtZW1fcGFnZV9hZGRyZXNzKHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICpsb3dtZW1fcGFnZV9hZGRyZXNzKGNvbnN0IHN0cnVjdCBwYWdlICpwYWdlKQogewotCXJldHVybiBfX3ZhKFBGTl9QSFlTKHBhZ2VfdG9fcGZuKHBhZ2UpKSk7CisJcmV0dXJuIF9fdmEoUEZOX1BIWVMocGFnZV90b19wZm4oKHN0cnVjdCBwYWdlICopcGFnZSkpKTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pICYmICFkZWZpbmVkKFdBTlRfUEFHRV9WSVJUVUFMKQpAQCAtOTEwLDYgKzkxMSw4IEBACiAgKiBAcHRlX2VudHJ5OiBpZiBzZXQsIGNhbGxlZCBmb3IgZWFjaCBub24tZW1wdHkgUFRFICg0dGgtbGV2ZWwpIGVudHJ5CiAgKiBAcHRlX2hvbGU6IGlmIHNldCwgY2FsbGVkIGZvciBlYWNoIGhvbGUgYXQgYWxsIGxldmVscwogICogQGh1Z2V0bGJfZW50cnk6IGlmIHNldCwgY2FsbGVkIGZvciBlYWNoIGh1Z2V0bGIgZW50cnkKKyAqCQkgICAqQ2F1dGlvbio6IFRoZSBjYWxsZXIgbXVzdCBob2xkIG1tYXBfc2VtKCkgaWYgQGh1Z2V0bGJfZW50cnkKKyAqIAkJCSAgICAgIGlzIHVzZWQuCiAgKgogICogKHNlZSB3YWxrX3BhZ2VfcmFuZ2UgZm9yIG1vcmUgZGV0YWlscykKICAqLwpAQCAtOTg1LDYgKzk4OCw4IEBACiBpbnQgZ2V0X3VzZXJfcGFnZXNfZmFzdCh1bnNpZ25lZCBsb25nIHN0YXJ0LCBpbnQgbnJfcGFnZXMsIGludCB3cml0ZSwKIAkJCXN0cnVjdCBwYWdlICoqcGFnZXMpOwogc3RydWN0IHBhZ2UgKmdldF9kdW1wX3BhZ2UodW5zaWduZWQgbG9uZyBhZGRyKTsKK2V4dGVybiBpbnQgZml4dXBfdXNlcl9mYXVsdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgZmF1bHRfZmxhZ3MpOwogCiBleHRlcm4gaW50IHRyeV90b19yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKiBwYWdlLCBnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gdm9pZCBkb19pbnZhbGlkYXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpOwpAQCAtMTEyMSw0NCArMTEyNiw2IEBACiB9CiAjZW5kaWYKIAotLyoKLSAqIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBmcm9tIHBhZ2UgcmVjbGFpbSB0byB0aGUgc2hyaW5rZXJzLgotICogV2UgY29uc29saWRhdGUgdGhlIHZhbHVlcyBmb3IgZWFzaWVyIGV4dGVudGlvbiBsYXRlci4KLSAqLwotc3RydWN0IHNocmlua19jb250cm9sIHsKLQlnZnBfdCBnZnBfbWFzazsKLQotCS8qIEhvdyBtYW55IHNsYWIgb2JqZWN0cyBzaHJpbmtlcigpIHNob3VsZCBzY2FuIGFuZCB0cnkgdG8gcmVjbGFpbSAqLwotCXVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbjsKLX07Ci0KLS8qCi0gKiBBIGNhbGxiYWNrIHlvdSBjYW4gcmVnaXN0ZXIgdG8gYXBwbHkgcHJlc3N1cmUgdG8gYWdlYWJsZSBjYWNoZXMuCi0gKgotICogJ3NjJyBpcyBwYXNzZWQgc2hyaW5rX2NvbnRyb2wgd2hpY2ggaW5jbHVkZXMgYSBjb3VudCAnbnJfdG9fc2NhbicKLSAqIGFuZCBhICdnZnBtYXNrJy4gIEl0IHNob3VsZCBsb29rIHRocm91Z2ggdGhlIGxlYXN0LXJlY2VudGx5LXVzZWQKLSAqICducl90b19zY2FuJyBlbnRyaWVzIGFuZCBhdHRlbXB0IHRvIGZyZWUgdGhlbSB1cC4gIEl0IHNob3VsZCByZXR1cm4KLSAqIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB3aGljaCByZW1haW4gaW4gdGhlIGNhY2hlLiAgSWYgaXQgcmV0dXJucyAtMSwgaXQgbWVhbnMKLSAqIGl0IGNhbm5vdCBkbyBhbnkgc2Nhbm5pbmcgYXQgdGhpcyB0aW1lIChlZy4gdGhlcmUgaXMgYSByaXNrIG9mIGRlYWRsb2NrKS4KLSAqCi0gKiBUaGUgJ2dmcG1hc2snIHJlZmVycyB0byB0aGUgYWxsb2NhdGlvbiB3ZSBhcmUgY3VycmVudGx5IHRyeWluZyB0bwotICogZnVsZmlsLgotICoKLSAqIE5vdGUgdGhhdCAnc2hyaW5rJyB3aWxsIGJlIHBhc3NlZCBucl90b19zY2FuID09IDAgd2hlbiB0aGUgVk0gaXMKLSAqIHF1ZXJ5aW5nIHRoZSBjYWNoZSBzaXplLCBzbyBhIGZhc3RwYXRoIGZvciB0aGF0IGNhc2UgaXMgYXBwcm9wcmlhdGUuCi0gKi8KLXN0cnVjdCBzaHJpbmtlciB7Ci0JaW50ICgqc2hyaW5rKShzdHJ1Y3Qgc2hyaW5rZXIgKiwgc3RydWN0IHNocmlua19jb250cm9sICpzYyk7Ci0JaW50IHNlZWtzOwkvKiBzZWVrcyB0byByZWNyZWF0ZSBhbiBvYmogKi8KLQotCS8qIFRoZXNlIGFyZSBmb3IgaW50ZXJuYWwgdXNlICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCWxvbmcgbnI7CS8qIG9ianMgcGVuZGluZyBkZWxldGUgKi8KLX07Ci0jZGVmaW5lIERFRkFVTFRfU0VFS1MgMiAvKiBBIGdvb2QgbnVtYmVyIGlmIHlvdSBkb24ndCBrbm93IGJldHRlci4gKi8KLWV4dGVybiB2b2lkIHJlZ2lzdGVyX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqKTsKLWV4dGVybiB2b2lkIHVucmVnaXN0ZXJfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICopOwotCiBpbnQgdm1hX3dhbnRzX3dyaXRlbm90aWZ5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIAogZXh0ZXJuIHB0ZV90ICpfX2dldF9sb2NrZWRfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCkBAIC0xMzEzLDYgKzEyODAsNyBAQAogCQkJCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4pOwogZXh0ZXJuIHZvaWQgcmVtb3ZlX2FsbF9hY3RpdmVfcmFuZ2VzKHZvaWQpOwogdm9pZCBzb3J0X25vZGVfbWFwKHZvaWQpOwordW5zaWduZWQgbG9uZyBub2RlX21hcF9wZm5fYWxpZ25tZW50KHZvaWQpOwogdW5zaWduZWQgbG9uZyBfX2Fic2VudF9wYWdlc19pbl9yYW5nZShpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBhYnNlbnRfcGFnZXNfaW5fcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCkBAIC0xNDQ1LDggKzE0MTMsNyBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBkb19icmsodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiAKLS8qIGZpbGVtYXAuYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGFnZV91bnVzZShzdHJ1Y3QgcGFnZSAqKTsKKy8qIHRydW5jYXRlLmMgKi8KIGV4dGVybiB2b2lkIHRydW5jYXRlX2lub2RlX3BhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIGxvZmZfdCk7CiBleHRlcm4gdm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLAogCQkJCSAgICAgICBsb2ZmX3QgbHN0YXJ0LCBsb2ZmX3QgbGVuZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9ib290LmggYi9pbmNsdWRlL2xpbnV4L21tYy9ib290LmgKaW5kZXggMzlkNzg3Yy4uMjNhY2MzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvYm9vdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2Jvb3QuaApAQCAtMSw3ICsxLDcgQEAKLSNpZm5kZWYgTU1DX0JPT1RfSAotI2RlZmluZSBNTUNfQk9PVF9ICisjaWZuZGVmIExJTlVYX01NQ19CT09UX0gKKyNkZWZpbmUgTElOVVhfTU1DX0JPT1RfSAogCiBlbnVtIHsgTU1DX1BST0dSRVNTX0VOVEVSLCBNTUNfUFJPR1JFU1NfSU5JVCwKICAgICAgICBNTUNfUFJPR1JFU1NfTE9BRCwgTU1DX1BST0dSRVNTX0RPTkUgfTsKIAotI2VuZGlmCisjZW5kaWYgLyogTElOVVhfTU1DX0JPT1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oIGIvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCmluZGV4IGM2OTI3YTQuLmI0NjBmYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKQEAgLTY0LDYgKzY0LDE5IEBACiAJdW5zaWduZWQgbG9uZyBsb25nCWVuaGFuY2VkX2FyZWFfb2Zmc2V0OwkvKiBVbml0czogQnl0ZSAqLwogCXVuc2lnbmVkIGludAkJZW5oYW5jZWRfYXJlYV9zaXplOwkvKiBVbml0czogS0IgKi8KIAl1bnNpZ25lZCBpbnQJCWJvb3Rfc2l6ZTsJCS8qIGluIGJ5dGVzICovCisJdTgJCQlyYXdfcGFydGl0aW9uX3N1cHBvcnQ7CS8qIDE2MCAqLworCXU4CQkJcmF3X2VyYXNlZF9tZW1fY291bnQ7CS8qIDE4MSAqLworCXU4CQkJcmF3X2V4dF9jc2Rfc3RydWN0dXJlOwkvKiAxOTQgKi8KKwl1OAkJCXJhd19jYXJkX3R5cGU7CQkvKiAxOTYgKi8KKwl1OAkJCXJhd19zX2FfdGltZW91dDsJCS8qIDIxNyAqLworCXU4CQkJcmF3X2hjX2VyYXNlX2dhcF9zaXplOwkvKiAyMjEgKi8KKwl1OAkJCXJhd19lcmFzZV90aW1lb3V0X211bHQ7CS8qIDIyMyAqLworCXU4CQkJcmF3X2hjX2VyYXNlX2dycF9zaXplOwkvKiAyMjQgKi8KKwl1OAkJCXJhd19zZWNfdHJpbV9tdWx0OwkvKiAyMjkgKi8KKwl1OAkJCXJhd19zZWNfZXJhc2VfbXVsdDsJLyogMjMwICovCisJdTgJCQlyYXdfc2VjX2ZlYXR1cmVfc3VwcG9ydDsvKiAyMzEgKi8KKwl1OAkJCXJhd190cmltX211bHQ7CQkvKiAyMzIgKi8KKwl1OAkJCXJhd19zZWN0b3JzWzRdOwkJLyogMjEyIC0gNCBieXRlcyAqLwogfTsKIAogc3RydWN0IHNkX3NjciB7CkBAIC0zOTAsNCArNDAzLDQgQEAKIGV4dGVybiB2b2lkIG1tY19maXh1cF9kZXZpY2Uoc3RydWN0IG1tY19jYXJkICpjYXJkLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgbW1jX2ZpeHVwICp0YWJsZSk7CiAKLSNlbmRpZgorI2VuZGlmIC8qIExJTlVYX01NQ19DQVJEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbW1jL2NvcmUuaAppbmRleCBiNjcxOGU1Li5iOGIxYjdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvY29yZS5oCkBAIC0xMTcsNiArMTE3LDcgQEAKIAogCXVuc2lnbmVkIGludAkJc2dfbGVuOwkJLyogc2l6ZSBvZiBzY2F0dGVyIGxpc3QgKi8KIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwkJLyogSS9PIHNjYXR0ZXIgbGlzdCAqLworCXMzMgkJCWhvc3RfY29va2llOwkvKiBob3N0IHByaXZhdGUgZGF0YSAqLwogfTsKIAogc3RydWN0IG1tY19yZXF1ZXN0IHsKQEAgLTEyNSwxMyArMTI2LDE2IEBACiAJc3RydWN0IG1tY19kYXRhCQkqZGF0YTsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQJKnN0b3A7CiAKLQl2b2lkCQkJKmRvbmVfZGF0YTsJLyogY29tcGxldGlvbiBkYXRhICovCisJc3RydWN0IGNvbXBsZXRpb24JY29tcGxldGlvbjsKIAl2b2lkCQkJKCpkb25lKShzdHJ1Y3QgbW1jX3JlcXVlc3QgKik7LyogY29tcGxldGlvbiBmdW5jdGlvbiAqLwogfTsKIAogc3RydWN0IG1tY19ob3N0Owogc3RydWN0IG1tY19jYXJkOworc3RydWN0IG1tY19hc3luY19yZXE7CiAKK2V4dGVybiBzdHJ1Y3QgbW1jX2FzeW5jX3JlcSAqbW1jX3N0YXJ0X3JlcShzdHJ1Y3QgbW1jX2hvc3QgKiwKKwkJCQkJICAgc3RydWN0IG1tY19hc3luY19yZXEgKiwgaW50ICopOwogZXh0ZXJuIHZvaWQgbW1jX3dhaXRfZm9yX3JlcShzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19yZXF1ZXN0ICopOwogZXh0ZXJuIGludCBtbWNfd2FpdF9mb3JfY21kKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKiwgaW50KTsKIGV4dGVybiBpbnQgbW1jX2FwcF9jbWQoc3RydWN0IG1tY19ob3N0ICosIHN0cnVjdCBtbWNfY2FyZCAqKTsKQEAgLTE1NSw2ICsxNTksNyBAQAogZXh0ZXJuIGludCBtbWNfY2FuX3NlY3VyZV9lcmFzZV90cmltKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7CiBleHRlcm4gaW50IG1tY19lcmFzZV9ncm91cF9hbGlnbmVkKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGZyb20sCiAJCQkJICAgdW5zaWduZWQgaW50IG5yKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbW1jX2NhbGNfbWF4X2Rpc2NhcmQoc3RydWN0IG1tY19jYXJkICpjYXJkKTsKIAogZXh0ZXJuIGludCBtbWNfc2V0X2Jsb2NrbGVuKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGJsb2NrbGVuKTsKIApAQCAtMTc5LDQgKzE4NCw0IEBACiAKIGV4dGVybiB1MzIgbW1jX3ZkZHJhbmdlX3RvX29jcm1hc2soaW50IHZkZF9taW4sIGludCB2ZGRfbWF4KTsKIAotI2VuZGlmCisjZW5kaWYgLyogTElOVVhfTU1DX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvZHdfbW1jLmggYi9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaAppbmRleCBiZGQ3Y2VlLi42YjQ2ODE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaApAQCAtMTEsOCArMTEsOCBAQAogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaWZuZGVmIF9MSU5VWF9NTUNfRFdfTU1DX0hfCi0jZGVmaW5lIF9MSU5VWF9NTUNfRFdfTU1DX0hfCisjaWZuZGVmIExJTlVYX01NQ19EV19NTUNfSAorI2RlZmluZSBMSU5VWF9NTUNfRFdfTU1DX0gKIAogI2RlZmluZSBNQVhfTUNJX1NMT1RTCTIKIApAQCAtNDgsNiArNDgsNyBAQAogICogQGRhdGE6IFRoZSBkYXRhIGN1cnJlbnRseSBiZWluZyB0cmFuc2ZlcnJlZCwgb3IgTlVMTCBpZiBubyBkYXRhCiAgKgl0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcy4KICAqIEB1c2VfZG1hOiBXaGV0aGVyIERNQSBjaGFubmVsIGlzIGluaXRpYWxpemVkIG9yIG5vdC4KKyAqIEB1c2luZ19kbWE6IFdoZXRoZXIgRE1BIGlzIGluIHVzZSBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmZXIuCiAgKiBAc2dfZG1hOiBCdXMgYWRkcmVzcyBvZiBETUEgYnVmZmVyLgogICogQHNnX2NwdTogVmlydHVhbCBhZGRyZXNzIG9mIERNQSBidWZmZXIuCiAgKiBAZG1hX29wczogUG9pbnRlciB0byBwbGF0Zm9ybS1zcGVjaWZpYyBETUEgY2FsbGJhY2tzLgpAQCAtNzQsNyArNzUsMTEgQEAKICAqIEBwZGV2OiBQbGF0Zm9ybSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBNTUMgY29udHJvbGxlci4KICAqIEBwZGF0YTogUGxhdGZvcm0gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIE1NQyBjb250cm9sbGVyLgogICogQHNsb3Q6IFNsb3RzIHNoYXJpbmcgdGhpcyBNTUMgY29udHJvbGxlci4KKyAqIEBmaWZvX2RlcHRoOiBkZXB0aCBvZiBGSUZPLgogICogQGRhdGFfc2hpZnQ6IGxvZzIgb2YgRklGTyBpdGVtIHNpemUuCisgKiBAcGFydF9idWZfc3RhcnQ6IFN0YXJ0IGluZGV4IGluIHBhcnRfYnVmLgorICogQHBhcnRfYnVmX2NvdW50OiBCeXRlcyBvZiBwYXJ0aWFsIGRhdGEgaW4gcGFydF9idWYuCisgKiBAcGFydF9idWY6IFNpbXBsZSBidWZmZXIgZm9yIHBhcnRpYWwgZmlmbyByZWFkcy93cml0ZXMuCiAgKiBAcHVzaF9kYXRhOiBQb2ludGVyIHRvIEZJRk8gcHVzaCBmdW5jdGlvbi4KICAqIEBwdWxsX2RhdGE6IFBvaW50ZXIgdG8gRklGTyBwdWxsIGZ1bmN0aW9uLgogICogQHF1aXJrczogU2V0IG9mIHF1aXJrcyB0aGF0IGFwcGx5IHRvIHNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSBJUC4KQEAgLTExNyw2ICsxMjIsNyBAQAogCiAJLyogRE1BIGludGVyZmFjZSBtZW1iZXJzKi8KIAlpbnQJCQl1c2VfZG1hOworCWludAkJCXVzaW5nX2RtYTsKIAogCWRtYV9hZGRyX3QJCXNnX2RtYTsKIAl2b2lkCQkJKnNnX2NwdTsKQEAgLTEzMSw3ICsxMzcsNyBAQAogCXUzMgkJCXN0b3BfY21kcjsKIAl1MzIJCQlkaXJfc3RhdHVzOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0YXNrbGV0OwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAljYXJkX3Rhc2tsZXQ7CisJc3RydWN0IHdvcmtfc3RydWN0CWNhcmRfd29yazsKIAl1bnNpZ25lZCBsb25nCQlwZW5kaW5nX2V2ZW50czsKIAl1bnNpZ25lZCBsb25nCQljb21wbGV0ZWRfZXZlbnRzOwogCWVudW0gZHdfbWNpX3N0YXRlCXN0YXRlOwpAQCAtMTQ2LDcgKzE1MiwxNSBAQAogCXN0cnVjdCBkd19tY2lfc2xvdAkqc2xvdFtNQVhfTUNJX1NMT1RTXTsKIAogCS8qIEZJRk8gcHVzaCBhbmQgcHVsbCAqLworCWludAkJCWZpZm9fZGVwdGg7CiAJaW50CQkJZGF0YV9zaGlmdDsKKwl1OAkJCXBhcnRfYnVmX3N0YXJ0OworCXU4CQkJcGFydF9idWZfY291bnQ7CisJdW5pb24geworCQl1MTYJCXBhcnRfYnVmMTY7CisJCXUzMgkJcGFydF9idWYzMjsKKwkJdTY0CQlwYXJ0X2J1ZjsKKwl9OwogCXZvaWQgKCpwdXNoX2RhdGEpKHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCk7CiAJdm9pZCAoKnB1bGxfZGF0YSkoc3RydWN0IGR3X21jaSAqaG9zdCwgdm9pZCAqYnVmLCBpbnQgY250KTsKIApAQCAtMTk2LDYgKzIxMCwxMiBAQAogCXVuc2lnbmVkIGludCBidXNfaHo7IC8qIEJ1cyBzcGVlZCAqLwogCiAJdW5zaWduZWQgaW50IGNhcHM7CS8qIENhcGFiaWxpdGllcyAqLworCS8qCisJICogT3ZlcnJpZGUgZmlmbyBkZXB0aC4gSWYgMCwgYXV0b2RldGVjdCBpdCBmcm9tIHRoZSBGSUZPVEggcmVnaXN0ZXIsCisJICogYnV0IG5vdGUgdGhhdCB0aGlzIG1heSBub3QgYmUgcmVsaWFibGUgYWZ0ZXIgYSBib290bG9hZGVyIGhhcyB1c2VkCisJICogaXQuCisJICovCisJdW5zaWduZWQgaW50IGZpZm9fZGVwdGg7CiAKIAkvKiBkZWxheSBpbiBtUyBiZWZvcmUgZGV0ZWN0aW5nIGNhcmRzIGFmdGVyIGludGVycnVwdCAqLwogCXUzMiBkZXRlY3RfZGVsYXlfbXM7CkBAIC0yMTksNCArMjM5LDQgQEAKIAlzdHJ1Y3QgYmxvY2tfc2V0dGluZ3MgKmJsa19zZXR0aW5nczsKIH07CiAKLSNlbmRpZiAvKiBfTElOVVhfTU1DX0RXX01NQ19IXyAqLworI2VuZGlmIC8qIExJTlVYX01NQ19EV19NTUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCmluZGV4IDFlZTQ0MjQuLjBmODM4NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKQEAgLTEwNiw2ICsxMDYsMTUgQEAKIAkgKi8KIAlpbnQgKCplbmFibGUpKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CiAJaW50ICgqZGlzYWJsZSkoc3RydWN0IG1tY19ob3N0ICpob3N0LCBpbnQgbGF6eSk7CisJLyoKKwkgKiBJdCBpcyBvcHRpb25hbCBmb3IgdGhlIGhvc3QgdG8gaW1wbGVtZW50IHByZV9yZXEgYW5kIHBvc3RfcmVxIGluCisJICogb3JkZXIgdG8gc3VwcG9ydCBkb3VibGUgYnVmZmVyaW5nIG9mIHJlcXVlc3RzIChwcmVwYXJlIG9uZQorCSAqIHJlcXVlc3Qgd2hpbGUgYW5vdGhlciByZXF1ZXN0IGlzIGFjdGl2ZSkuCisJICovCisJdm9pZAkoKnBvc3RfcmVxKShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxLAorCQkJICAgIGludCBlcnIpOworCXZvaWQJKCpwcmVfcmVxKShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxLAorCQkJICAgYm9vbCBpc19maXJzdF9yZXEpOwogCXZvaWQJKCpyZXF1ZXN0KShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxKTsKIAkvKgogCSAqIEF2b2lkIGNhbGxpbmcgdGhlc2UgdGhyZWUgZnVuY3Rpb25zIHRvbyBvZnRlbiBvciBpbiBhICJmYXN0IHBhdGgiLApAQCAtMTM5LDExICsxNDgsMjIgQEAKIAlpbnQJKCpzdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2gpKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19pb3MgKmlvcyk7CiAJaW50CSgqZXhlY3V0ZV90dW5pbmcpKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CiAJdm9pZAkoKmVuYWJsZV9wcmVzZXRfdmFsdWUpKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgYm9vbCBlbmFibGUpOworCWludAkoKnNlbGVjdF9kcml2ZV9zdHJlbmd0aCkodW5zaWduZWQgaW50IG1heF9kdHIsIGludCBob3N0X2RydiwgaW50IGNhcmRfZHJ2KTsKIH07CiAKIHN0cnVjdCBtbWNfY2FyZDsKIHN0cnVjdCBkZXZpY2U7CiAKK3N0cnVjdCBtbWNfYXN5bmNfcmVxIHsKKwkvKiBhY3RpdmUgbW1jIHJlcXVlc3QgKi8KKwlzdHJ1Y3QgbW1jX3JlcXVlc3QJKm1ycTsKKwkvKgorCSAqIENoZWNrIGVycm9yIHN0YXR1cyBvZiBjb21wbGV0ZWQgbW1jIHJlcXVlc3QuCisJICogUmV0dXJucyAwIGlmIHN1Y2Nlc3Mgb3RoZXJ3aXNlIG5vbiB6ZXJvLgorCSAqLworCWludCAoKmVycl9jaGVjaykgKHN0cnVjdCBtbWNfY2FyZCAqLCBzdHJ1Y3QgbW1jX2FzeW5jX3JlcSAqKTsKK307CisKIHN0cnVjdCBtbWNfaG9zdCB7CiAJc3RydWN0IGRldmljZQkJKnBhcmVudDsKIAlzdHJ1Y3QgZGV2aWNlCQljbGFzc19kZXY7CkBAIC0yMzEsNiArMjUxLDcgQEAKIAl1bnNpZ25lZCBpbnQJCW1heF9yZXFfc2l6ZTsJLyogbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gb25lIHJlcSAqLwogCXVuc2lnbmVkIGludAkJbWF4X2Jsa19zaXplOwkvKiBtYXhpbXVtIHNpemUgb2Ygb25lIG1tYyBibG9jayAqLwogCXVuc2lnbmVkIGludAkJbWF4X2Jsa19jb3VudDsJLyogbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIGluIG9uZSByZXEgKi8KKwl1bnNpZ25lZCBpbnQJCW1heF9kaXNjYXJkX3RvOwkvKiBtYXguIGRpc2NhcmQgdGltZW91dCBpbiBtcyAqLwogCiAJLyogcHJpdmF0ZSBkYXRhICovCiAJc3BpbmxvY2tfdAkJbG9jazsJCS8qIGxvY2sgZm9yIGNsYWltIGFuZCBidXMgb3BzICovCkBAIC0yODEsNiArMzAyLDggQEAKIAogCXN0cnVjdCBkZW50cnkJCSpkZWJ1Z2ZzX3Jvb3Q7CiAKKwlzdHJ1Y3QgbW1jX2FzeW5jX3JlcQkqYXJlcTsJCS8qIGFjdGl2ZSBhc3luYyByZXEgKi8KKwogCXVuc2lnbmVkIGxvbmcJCXByaXZhdGVbMF0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogfTsKIApAQCAtMzczLDUgKzM5Niw0IEBACiB7CiAJcmV0dXJuIGhvc3QtPmNhcHMgJiBNTUNfQ0FQX0NNRDIzOwogfQotI2VuZGlmCi0KKyNlbmRpZiAvKiBMSU5VWF9NTUNfSE9TVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9pb2N0bC5oIGIvaW5jbHVkZS9saW51eC9tbWMvaW9jdGwuaAppbmRleCA1YmFmMjk4Li44ZmE1YmM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2lvY3RsLmgKQEAgLTUxLDQgKzUxLDQgQEAKICAqIGJsb2NrIGRldmljZSBvcGVyYXRpb25zLgogICovCiAjZGVmaW5lIE1NQ19JT0NfTUFYX0JZVEVTICAoNTEyTCAqIDI1NikKLSNlbmRpZiAgLyogTElOVVhfTU1DX0lPQ1RMX0ggKi8KKyNlbmRpZiAvKiBMSU5VWF9NTUNfSU9DVExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvbW1jLmggYi9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaAppbmRleCBhYzI2YTY4Li41YTc5NGNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaApAQCAtMjEsOCArMjEsOCBAQAogICogICAgICAgICAgMTUgTWF5IDIwMDIKICAqLwogCi0jaWZuZGVmIE1NQ19NTUNfSAotI2RlZmluZSBNTUNfTU1DX0gKKyNpZm5kZWYgTElOVVhfTU1DX01NQ19ICisjZGVmaW5lIExJTlVYX01NQ19NTUNfSAogCiAvKiBTdGFuZGFyZCBNTUMgY29tbWFuZHMgKDQuMSkgICAgICAgICAgIHR5cGUgIGFyZ3VtZW50ICAgICByZXNwb25zZSAqLwogICAgLyogY2xhc3MgMSAqLwpAQCAtMTQwLDYgKzE0MCwxNiBAQAogI2RlZmluZSBSMV9TV0lUQ0hfRVJST1IJCSgxIDw8IDcpCS8qIHN4LCBjICovCiAjZGVmaW5lIFIxX0FQUF9DTUQJCSgxIDw8IDUpCS8qIHNyLCBjICovCiAKKyNkZWZpbmUgUjFfU1RBVEVfSURMRQkwCisjZGVmaW5lIFIxX1NUQVRFX1JFQURZCTEKKyNkZWZpbmUgUjFfU1RBVEVfSURFTlQJMgorI2RlZmluZSBSMV9TVEFURV9TVEJZCTMKKyNkZWZpbmUgUjFfU1RBVEVfVFJBTgk0CisjZGVmaW5lIFIxX1NUQVRFX0RBVEEJNQorI2RlZmluZSBSMV9TVEFURV9SQ1YJNgorI2RlZmluZSBSMV9TVEFURV9QUkcJNworI2RlZmluZSBSMV9TVEFURV9ESVMJOAorCiAvKgogICogTU1DL1NEIGluIFNQSSBtb2RlIHJlcG9ydHMgUjEgc3RhdHVzIGFsd2F5cywgYW5kIFIyIGZvciBTRU5EX1NUQVRVUwogICogUjEgaXMgdGhlIGxvdyBvcmRlciBieXRlOyBSMiBpcyB0aGUgbmV4dCBoaWdoZXN0IGJ5dGUsIHdoZW4gcHJlc2VudC4KQEAgLTMyNyw1ICszMzcsNCBAQAogI2RlZmluZSBNTUNfU1dJVENIX01PREVfQ0xFQVJfQklUUwkweDAyCS8qIENsZWFyIGJpdHMgd2hpY2ggYXJlIDEgaW4gdmFsdWUgKi8KICNkZWZpbmUgTU1DX1NXSVRDSF9NT0RFX1dSSVRFX0JZVEUJMHgwMwkvKiBTZXQgdGFyZ2V0IHRvIHZhbHVlICovCiAKLSNlbmRpZiAgLyogTU1DX01NQ19QUk9UT0NPTF9IICovCi0KKyNlbmRpZiAvKiBMSU5VWF9NTUNfTU1DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3BtLmggYi9pbmNsdWRlL2xpbnV4L21tYy9wbS5oCmluZGV4IGQzN2FhYzQuLjRhMTM5MjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3BtLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvcG0uaApAQCAtMjcsNCArMjcsNCBAQAogI2RlZmluZSBNTUNfUE1fS0VFUF9QT1dFUgkoMSA8PCAwKQkvKiBwcmVzZXJ2ZSBjYXJkIHBvd2VyIGR1cmluZyBzdXNwZW5kICovCiAjZGVmaW5lIE1NQ19QTV9XQUtFX1NESU9fSVJRCSgxIDw8IDEpCS8qIHdha2UgdXAgaG9zdCBzeXN0ZW0gb24gU0RJTyBJUlEgYXNzZXJ0aW9uICovCiAKLSNlbmRpZgorI2VuZGlmIC8qIExJTlVYX01NQ19QTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9zZC5oIGIvaW5jbHVkZS9saW51eC9tbWMvc2QuaAppbmRleCA3ZDM1ZDUyLi4xZWJjZjliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9zZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL3NkLmgKQEAgLTksOCArOSw4IEBACiAgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2lmbmRlZiBNTUNfU0RfSAotI2RlZmluZSBNTUNfU0RfSAorI2lmbmRlZiBMSU5VWF9NTUNfU0RfSAorI2RlZmluZSBMSU5VWF9NTUNfU0RfSAogCiAvKiBTRCBjb21tYW5kcyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgIGFyZ3VtZW50ICAgICByZXNwb25zZSAqLwogICAvKiBjbGFzcyAwICovCkBAIC05MSw1ICs5MSw0IEBACiAjZGVmaW5lIFNEX1NXSVRDSF9BQ0NFU1NfREVGCTAKICNkZWZpbmUgU0RfU1dJVENIX0FDQ0VTU19IUwkxCiAKLSNlbmRpZgotCisjZW5kaWYgLyogTElOVVhfTU1DX1NEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLXBsdGZtLmggYi9pbmNsdWRlL2xpbnV4L21tYy9zZGhjaS1wbHRmbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDhkNTlkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLXBsdGZtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogUGxhdGZvcm0gZGF0YSBkZWNsYXJhdGlvbnMgZm9yIHRoZSBzZGhjaS1wbHRmbSBkcml2ZXIuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE1vbnRhVmlzdGEgU29mdHdhcmUsIExMQy4KLSAqCi0gKiBBdXRob3I6IEFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfU0RIQ0lfUExURk1fSAotI2RlZmluZSBfU0RIQ0lfUExURk1fSAotCi1zdHJ1Y3Qgc2RoY2lfb3BzOwotc3RydWN0IHNkaGNpX2hvc3Q7Ci0KLS8qKgotICogc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgLSBTREhDSSBwbGF0Zm9ybS1zcGVjaWZpYyBpbmZvcm1hdGlvbiAmIGhvb2tzCi0gKiBAb3BzOiBvcHRpb25hbCBwb2ludGVyIHRvIHRoZSBwbGF0Zm9ybS1wcm92aWRlZCBTREhDSSBvcHMKLSAqIEBxdWlya3M6IG9wdGlvbmFsIFNESENJIHF1aXJrcwotICogQGluaXQ6IG9wdGlvbmFsIGhvb2sgdGhhdCBpcyBjYWxsZWQgZHVyaW5nIGRldmljZSBwcm9iZSwgYmVmb3JlIHRoZQotICogICAgICAgIGRyaXZlciB0cmllcyB0byBhY2Nlc3MgYW55IFNESENJIHJlZ2lzdGVycwotICogQGV4aXQ6IG9wdGlvbmFsIGhvb2sgdGhhdCBpcyBjYWxsZWQgZHVyaW5nIGRldmljZSByZW1vdmFsCi0gKi8KLXN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHsKLQlzdHJ1Y3Qgc2RoY2lfb3BzICpvcHM7Ci0JdW5zaWduZWQgaW50IHF1aXJrczsKLQlpbnQgKCppbml0KShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgKnBkYXRhKTsKLQl2b2lkICgqZXhpdCkoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpOwotfTsKLQotI2VuZGlmIC8qIF9TREhDSV9QTFRGTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9zZGhjaS1zcGVhci5oIGIvaW5jbHVkZS9saW51eC9tbWMvc2RoY2ktc3BlYXIuaAppbmRleCA5MTg4Yzk3Li41Y2RjOTZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9zZGhjaS1zcGVhci5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLXNwZWFyLmgKQEAgLTExLDggKzExLDggQEAKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwogCi0jaWZuZGVmIE1NQ19TREhDSV9TUEVBUl9ICi0jZGVmaW5lIE1NQ19TREhDSV9TUEVBUl9ICisjaWZuZGVmIExJTlVYX01NQ19TREhDSV9TUEVBUl9ICisjZGVmaW5lIExJTlVYX01NQ19TREhDSV9TUEVBUl9ICiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIC8qCkBAIC0zOSw0ICszOSw0IEBACiAJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBkYXRhOwogfQogCi0jZW5kaWYgLyogTU1DX1NESENJX1NQRUFSX0ggKi8KKyNlbmRpZiAvKiBMSU5VWF9NTUNfU0RIQ0lfU1BFQVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2RoY2kuaCBiL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLmgKaW5kZXggNmE2OGM0ZS4uNTY2NmYzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvc2RoY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9zZGhjaS5oCkBAIC04LDggKzgsOCBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLSNpZm5kZWYgX19TREhDSV9ICi0jZGVmaW5lIF9fU0RIQ0lfSAorI2lmbmRlZiBMSU5VWF9NTUNfU0RIQ0lfSAorI2RlZmluZSBMSU5VWF9NTUNfU0RIQ0lfSAogCiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpAQCAtMTYyLDQgKzE2Miw0IEBACiAKIAl1bnNpZ25lZCBsb25nIHByaXZhdGVbMF0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogfTsKLSNlbmRpZiAvKiBfX1NESENJX0ggKi8KKyNlbmRpZiAvKiBMSU5VWF9NTUNfU0RIQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2Rpby5oIGIvaW5jbHVkZS9saW51eC9tbWMvc2Rpby5oCmluZGV4IDI0NWNkYWMuLjJhMmU5OTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NkaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9zZGlvLmgKQEAgLTksOCArOSw4IEBACiAgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2lmbmRlZiBNTUNfU0RJT19ICi0jZGVmaW5lIE1NQ19TRElPX0gKKyNpZm5kZWYgTElOVVhfTU1DX1NESU9fSAorI2RlZmluZSBMSU5VWF9NTUNfU0RJT19ICiAKIC8qIFNESU8gY29tbWFuZHMgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAgYXJndW1lbnQgICAgIHJlc3BvbnNlICovCiAjZGVmaW5lIFNEX0lPX1NFTkRfT1BfQ09ORCAgICAgICAgICA1IC8qIGJjciAgWzIzOjBdIE9DUiAgICAgICAgIFI0ICAqLwpAQCAtMTYxLDUgKzE2MSw0IEBACiAKICNkZWZpbmUgU0RJT19GQlJfQkxLU0laRQkweDEwCS8qIGJsb2NrIHNpemUgKDIgYnl0ZXMpICovCiAKLSNlbmRpZgotCisjZW5kaWYgLyogTElOVVhfTU1DX1NESU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2Rpb19mdW5jLmggYi9pbmNsdWRlL2xpbnV4L21tYy9zZGlvX2Z1bmMuaAppbmRleCAzMWJhYWY4Li41MGYwYmM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9zZGlvX2Z1bmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9zZGlvX2Z1bmMuaApAQCAtOSw4ICs5LDggQEAKICAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaWZuZGVmIE1NQ19TRElPX0ZVTkNfSAotI2RlZmluZSBNTUNfU0RJT19GVU5DX0gKKyNpZm5kZWYgTElOVVhfTU1DX1NESU9fRlVOQ19ICisjZGVmaW5lIExJTlVYX01NQ19TRElPX0ZVTkNfSAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CkBAIC0xNjEsNSArMTYxLDQgQEAKIGV4dGVybiBtbWNfcG1fZmxhZ190IHNkaW9fZ2V0X2hvc3RfcG1fY2FwcyhzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKTsKIGV4dGVybiBpbnQgc2Rpb19zZXRfaG9zdF9wbV9mbGFncyhzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jLCBtbWNfcG1fZmxhZ190IGZsYWdzKTsKIAotI2VuZGlmCi0KKyNlbmRpZiAvKiBMSU5VWF9NTUNfU0RJT19GVU5DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3NkaW9faWRzLmggYi9pbmNsdWRlL2xpbnV4L21tYy9zZGlvX2lkcy5oCmluZGV4IGEzNmFiM2IuLjlmMDNmZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NkaW9faWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvc2Rpb19pZHMuaApAQCAtMiw4ICsyLDggQEAKICAqIFNESU8gQ2xhc3NlcywgSW50ZXJmYWNlIFR5cGVzLCBNYW51ZmFjdHVyZXIgSURzLCBldGMuCiAgKi8KIAotI2lmbmRlZiBNTUNfU0RJT19JRFNfSAotI2RlZmluZSBNTUNfU0RJT19JRFNfSAorI2lmbmRlZiBMSU5VWF9NTUNfU0RJT19JRFNfSAorI2RlZmluZSBMSU5VWF9NTUNfU0RJT19JRFNfSAogCiAvKgogICogU3RhbmRhcmQgU0RJTyBGdW5jdGlvbiBJbnRlcmZhY2VzCkBAIC00NCw0ICs0NCw0IEBACiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX1NJQU5PX05PVkFfQTAJCTB4MTEwMAogI2RlZmluZSBTRElPX0RFVklDRV9JRF9TSUFOT19TVEVMTEFSIAkJMHg1MzQ3CiAKLSNlbmRpZgorI2VuZGlmIC8qIExJTlVYX01NQ19TRElPX0lEU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9zaF9tbWNpZi5oIGIvaW5jbHVkZS9saW51eC9tbWMvc2hfbW1jaWYuaAppbmRleCA5ZWI5YjRiLi4wMjIyY2Q4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9zaF9tbWNpZi5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL3NoX21tY2lmLmgKQEAgLTExLDggKzExLDggQEAKICAqCiAgKi8KIAotI2lmbmRlZiBfX1NIX01NQ0lGX0hfXwotI2RlZmluZSBfX1NIX01NQ0lGX0hfXworI2lmbmRlZiBMSU5VWF9NTUNfU0hfTU1DSUZfSAorI2RlZmluZSBMSU5VWF9NTUNfU0hfTU1DSUZfSAogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTIyMCw0ICsyMjAsNCBAQAogCXNoX21tY2lmX2Jvb3RfY21kKGJhc2UsIDB4MDM0MDAwNDAsIDB4MDAwMTAwMDApOwogfQogCi0jZW5kaWYgLyogX19TSF9NTUNJRl9IX18gKi8KKyNlbmRpZiAvKiBMSU5VWF9NTUNfU0hfTU1DSUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2hfbW9iaWxlX3NkaGkuaCBiL2luY2x1ZGUvbGludXgvbW1jL3NoX21vYmlsZV9zZGhpLmgKaW5kZXggZmFmMzJiNi4uYmQ1MGIzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvc2hfbW9iaWxlX3NkaGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9zaF9tb2JpbGVfc2RoaS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX1NIX01PQklMRV9TREhJX0hfXwotI2RlZmluZSBfX1NIX01PQklMRV9TREhJX0hfXworI2lmbmRlZiBMSU5VWF9NTUNfU0hfTU9CSUxFX1NESElfSAorI2RlZmluZSBMSU5VWF9NTUNfU0hfTU9CSUxFX1NESElfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIApAQCAtMTcsNCArMTcsNCBAQAogCWludCAoKmdldF9jZCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CiB9OwogCi0jZW5kaWYgLyogX19TSF9NT0JJTEVfU0RISV9IX18gKi8KKyNlbmRpZiAvKiBMSU5VWF9NTUNfU0hfTU9CSUxFX1NESElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvdG1pby5oIGIvaW5jbHVkZS9saW51eC9tbWMvdG1pby5oCmluZGV4IDE5NDkwYjkuLmExYzFmMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3RtaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy90bWlvLmgKQEAgLTEyLDggKzEyLDggQEAKICAqCiAgKiBUQzYzOTNYQiBUQzYzOTFYQiBUQzYzODdYQiBUN0w2NlhCIEFTSUMzCiAgKi8KLSNpZm5kZWYgX0xJTlVYX01NQ19UTUlPX0hfCi0jZGVmaW5lIF9MSU5VWF9NTUNfVE1JT19IXworI2lmbmRlZiBMSU5VWF9NTUNfVE1JT19ICisjZGVmaW5lIExJTlVYX01NQ19UTUlPX0gKIAogI2RlZmluZSBDVExfU0RfQ01EIDB4MDAKICNkZWZpbmUgQ1RMX0FSR19SRUcgMHgwNApAQCAtMjEsNiArMjEsNyBAQAogI2RlZmluZSBDVExfWEZFUl9CTEtfQ09VTlQgMHhhCiAjZGVmaW5lIENUTF9SRVNQT05TRSAweDBjCiAjZGVmaW5lIENUTF9TVEFUVVMgMHgxYworI2RlZmluZSBDVExfU1RBVFVTMiAweDFlCiAjZGVmaW5lIENUTF9JUlFfTUFTSyAweDIwCiAjZGVmaW5lIENUTF9TRF9DQVJEX0NMS19DVEwgMHgyNAogI2RlZmluZSBDVExfU0RfWEZFUl9MRU4gMHgyNgpAQCAtMzAsNiArMzEsNyBAQAogI2RlZmluZSBDVExfVFJBTlNBQ1RJT05fQ1RMIDB4MzQKICNkZWZpbmUgQ1RMX1NESU9fU1RBVFVTIDB4MzYKICNkZWZpbmUgQ1RMX1NESU9fSVJRX01BU0sgMHgzOAorI2RlZmluZSBDVExfRE1BX0VOQUJMRSAweGQ4CiAjZGVmaW5lIENUTF9SRVNFVF9TRCAweGUwCiAjZGVmaW5lIENUTF9TRElPX1JFR1MgMHgxMDAKICNkZWZpbmUgQ1RMX0NMS19BTkRfV0FJVF9DVEwgMHgxMzgKQEAgLTYwLDQgKzYyLDQgQEAKIAogI2RlZmluZSBUTUlPX0JCUwkJNTEyCQkvKiBCb290IGJsb2NrIHNpemUgKi8KIAotI2VuZGlmIC8qIF9MSU5VWF9NTUNfVE1JT19IXyAqLworI2VuZGlmIC8qIExJTlVYX01NQ19UTUlPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IGM5MjhkYWMuLjlmN2MzZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtNjQ3LDYgKzY0NywxMyBAQAogI2VuZGlmCiAjZGVmaW5lIG5pZF9wYWdlX25yKG5pZCwgcGFnZW5yKSAJcGdkYXRfcGFnZV9ucihOT0RFX0RBVEEobmlkKSwocGFnZW5yKSkKIAorI2RlZmluZSBub2RlX3N0YXJ0X3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCisKKyNkZWZpbmUgbm9kZV9lbmRfcGZuKG5pZCkgKHtcCisJcGdfZGF0YV90ICpfX3BnZGF0ID0gTk9ERV9EQVRBKG5pZCk7XAorCV9fcGdkYXQtPm5vZGVfc3RhcnRfcGZuICsgX19wZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzO1wKK30pCisKICNpbmNsdWRlIDxsaW51eC9tZW1vcnlfaG90cGx1Zy5oPgogCiBleHRlcm4gc3RydWN0IG11dGV4IHpvbmVsaXN0c19tdXRleDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW50X25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9tbnRfbmFtZXNwYWNlLmgKaW5kZXggMGI4OWVmYy4uMjkzMDQ4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbnRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbnRfbmFtZXNwYWNlLmgKQEAgLTE4LDcgKzE4LDYgQEAKIAlzdHJ1Y3Qgc2VxX2ZpbGUgbTsgLyogbXVzdCBiZSB0aGUgZmlyc3QgZWxlbWVudCAqLwogCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpuczsKIAlzdHJ1Y3QgcGF0aCByb290OwotCWludCBldmVudDsKIH07CiAKIHN0cnVjdCBmc19zdHJ1Y3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCBkOWNhMmQ1Li4xYzMwMDg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTQ4LDEwICs0OCwxOCBAQAogCiBzdHJ1Y3QgbW9kdWxlOwogCitzdHJ1Y3QgbW9kdWxlX2tvYmplY3QgeworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CisJc3RydWN0IG1vZHVsZSAqbW9kOworCXN0cnVjdCBrb2JqZWN0ICpkcml2ZXJzX2RpcjsKKwlzdHJ1Y3QgbW9kdWxlX3BhcmFtX2F0dHJzICptcDsKK307CisKIHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlIHsKLSAgICAgICAgc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotICAgICAgICBzc2l6ZV90ICgqc2hvdykoc3RydWN0IG1vZHVsZV9hdHRyaWJ1dGUgKiwgc3RydWN0IG1vZHVsZSAqLCBjaGFyICopOwotICAgICAgICBzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICosIHN0cnVjdCBtb2R1bGUgKiwKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICosIHN0cnVjdCBtb2R1bGVfa29iamVjdCAqLAorCQkJY2hhciAqKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICosIHN0cnVjdCBtb2R1bGVfa29iamVjdCAqLAogCQkJIGNvbnN0IGNoYXIgKiwgc2l6ZV90IGNvdW50KTsKIAl2b2lkICgqc2V0dXApKHN0cnVjdCBtb2R1bGUgKiwgY29uc3QgY2hhciAqKTsKIAlpbnQgKCp0ZXN0KShzdHJ1Y3QgbW9kdWxlICopOwpAQCAtNjUsMTUgKzczLDkgQEAKIH0gX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKHNpemVvZih2b2lkICopKSkpOwogCiBleHRlcm4gc3NpemVfdCBfX21vZHZlcl92ZXJzaW9uX3Nob3coc3RydWN0IG1vZHVsZV9hdHRyaWJ1dGUgKiwKLQkJCQkgICAgIHN0cnVjdCBtb2R1bGUgKiwgY2hhciAqKTsKKwkJCQkgICAgIHN0cnVjdCBtb2R1bGVfa29iamVjdCAqLCBjaGFyICopOwogCi1zdHJ1Y3QgbW9kdWxlX2tvYmplY3QKLXsKLQlzdHJ1Y3Qga29iamVjdCBrb2JqOwotCXN0cnVjdCBtb2R1bGUgKm1vZDsKLQlzdHJ1Y3Qga29iamVjdCAqZHJpdmVyc19kaXI7Ci0Jc3RydWN0IG1vZHVsZV9wYXJhbV9hdHRycyAqbXA7Ci19OworZXh0ZXJuIHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlIG1vZHVsZV91ZXZlbnQ7CiAKIC8qIFRoZXNlIGFyZSBlaXRoZXIgbW9kdWxlIGxvY2FsLCBvciB0aGUga2VybmVsJ3MgZHVtbXkgb25lcy4gKi8KIGV4dGVybiBpbnQgaW5pdF9tb2R1bGUodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZWxvYWRlci5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGVsb2FkZXIuaAppbmRleCBjMWY0MGMyLi5iMmJlMDJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZWxvYWRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlbG9hZGVyLmgKQEAgLTUsNyArNSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogCi0vKiBUaGVzZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgKi8KKy8qIFRoZXNlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBhcmNoaXRlY3R1cmVzIHRoYXQgbmVlZCB0byBob29rIGludG8gdGhlCisgKiBtb2R1bGUgbG9hZGVyIGNvZGUuICBBcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsCisgKiBjYW4ganVzdCByZWx5IG9uIHRoZSAnd2VhaycgZGVmYXVsdCBob29rcyBkZWZpbmVkIGluIGtlcm5lbC9tb2R1bGUuYy4KKyAqIE5vdGUsIGhvd2V2ZXIsIHRoYXQgYXQgbGVhc3Qgb25lIG9mIGFwcGx5X3JlbG9jYXRlIG9yIGFwcGx5X3JlbG9jYXRlX2FkZAorICogbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBlYWNoIGFyY2hpdGVjdHVyZS4KKyAqLwogCiAvKiBBZGp1c3QgYXJjaC1zcGVjaWZpYyBzZWN0aW9ucy4gIFJldHVybiAwIG9uIHN1Y2Nlc3MuICAqLwogaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmhkciwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3ViaS5oIGIvaW5jbHVkZS9saW51eC9tdGQvdWJpLmgKaW5kZXggMTVkYTBlOS4uZGI0ODM2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvdWJpLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvdWJpLmgKQEAgLTE1NSwxMiArMTU1LDE0IEBACiB9OwogCiAvKgotICogZW51bSAtIHZvbHVtZSBub3RpZmljYXRpb24gdHlwZXMuCi0gKiBAVUJJX1ZPTFVNRV9BRERFRDogdm9sdW1lIGhhcyBiZWVuIGFkZGVkCi0gKiBAVUJJX1ZPTFVNRV9SRU1PVkVEOiBzdGFydCB2b2x1bWUgdm9sdW1lCi0gKiBAVUJJX1ZPTFVNRV9SRVNJWkVEOiB2b2x1bWUgc2l6ZSBoYXMgYmVlbiByZS1zaXplZAotICogQFVCSV9WT0xVTUVfUkVOQU1FRDogdm9sdW1lIG5hbWUgaGFzIGJlZW4gcmUtbmFtZWQKLSAqIEBVQklfVk9MVU1FX1VQREFURUQ6IHZvbHVtZSBuYW1lIGhhcyBiZWVuIHVwZGF0ZWQKKyAqIFZvbHVtZSBub3RpZmljYXRpb24gdHlwZXMuCisgKiBAVUJJX1ZPTFVNRV9BRERFRDogYSB2b2x1bWUgaGFzIGJlZW4gYWRkZWQgKGFuIFVCSSBkZXZpY2Ugd2FzIGF0dGFjaGVkIG9yIGEKKyAqICAgICAgICAgICAgICAgICAgICB2b2x1bWUgd2FzIGNyZWF0ZWQpCisgKiBAVUJJX1ZPTFVNRV9SRU1PVkVEOiBhIHZvbHVtZSBoYXMgYmVlbiByZW1vdmVkIChhbiBVQkkgZGV2aWNlIHdhcyBkZXRhY2hlZAorICoJCQlvciBhIHZvbHVtZSB3YXMgcmVtb3ZlZCkKKyAqIEBVQklfVk9MVU1FX1JFU0laRUQ6IGEgdm9sdW1lIGhhcyBiZWVuIHJlLXNpemVkCisgKiBAVUJJX1ZPTFVNRV9SRU5BTUVEOiBhIHZvbHVtZSBoYXMgYmVlbiByZS1uYW1lZAorICogQFVCSV9WT0xVTUVfVVBEQVRFRDogZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRvIGEgdm9sdW1lCiAgKgogICogVGhlc2UgY29uc3RhbnRzIGRlZmluZSB3aGljaCB0eXBlIG9mIGV2ZW50IGhhcyBoYXBwZW5lZCB3aGVuIGEgdm9sdW1lCiAgKiBub3RpZmljYXRpb24gZnVuY3Rpb24gaXMgaW52b2tlZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXV0ZXguaCBiL2luY2x1ZGUvbGludXgvbXV0ZXguaAppbmRleCBhOTQwZmU0Li43Zjg3MjE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L211dGV4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tdXRleC5oCkBAIC05Miw3ICs5Miw3IEBACiAJCQkJCQkJXAogCV9fbXV0ZXhfaW5pdCgobXV0ZXgpLCAjbXV0ZXgsICZfX2tleSk7CQlcCiB9IHdoaWxlICgwKQotIyBkZWZpbmUgbXV0ZXhfZGVzdHJveShtdXRleCkJCQkJZG8geyB9IHdoaWxlICgwKQorc3RhdGljIGlubGluZSB2b2lkIG11dGV4X2Rlc3Ryb3koc3RydWN0IG11dGV4ICpsb2NrKSB7fQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uYW1laS5oIGIvaW5jbHVkZS9saW51eC9uYW1laS5oCmluZGV4IGViYTQ1ZWEuLjc2ZmUyYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmFtZWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L25hbWVpLmgKQEAgLTQ4LDcgKzQ4LDYgQEAKICAqLwogI2RlZmluZSBMT09LVVBfRk9MTE9XCQkweDAwMDEKICNkZWZpbmUgTE9PS1VQX0RJUkVDVE9SWQkweDAwMDIKLSNkZWZpbmUgTE9PS1VQX0NPTlRJTlVFCQkweDAwMDQKIAogI2RlZmluZSBMT09LVVBfUEFSRU5UCQkweDAwMTAKICNkZWZpbmUgTE9PS1VQX1JFVkFMCQkweDAwMjAKQEAgLTc1LDkgKzc0LDExIEBACiAKIGV4dGVybiBpbnQga2Vybl9wYXRoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQsIHN0cnVjdCBwYXRoICopOwogCitleHRlcm4gc3RydWN0IGRlbnRyeSAqa2Vybl9wYXRoX2NyZWF0ZShpbnQsIGNvbnN0IGNoYXIgKiwgc3RydWN0IHBhdGggKiwgaW50KTsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICp1c2VyX3BhdGhfY3JlYXRlKGludCwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3RydWN0IHBhdGggKiwgaW50KTsKIGV4dGVybiBpbnQga2Vybl9wYXRoX3BhcmVudChjb25zdCBjaGFyICosIHN0cnVjdCBuYW1laWRhdGEgKik7CiBleHRlcm4gaW50IHZmc19wYXRoX2xvb2t1cChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCB2ZnNtb3VudCAqLAotCQkJICAgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CisJCQkgICBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgc3RydWN0IHBhdGggKik7CiAKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqbG9va3VwX2luc3RhbnRpYXRlX2ZpbHAoc3RydWN0IG5hbWVpZGF0YSAqbmQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJaW50ICgqb3Blbikoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IGNhMzMzZTcuLmVhNmY0YWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvc19wYXJhbXMuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgpAQCAtNjEsMTEgKzYwLDYgQEAKICNkZWZpbmUgU0VUX0VUSFRPT0xfT1BTKG5ldGRldixvcHMpIFwKIAkoIChuZXRkZXYpLT5ldGh0b29sX29wcyA9IChvcHMpICkKIAotI2RlZmluZSBIQVZFX0FMTE9DX05FVERFVgkJLyogZmVhdHVyZSBtYWNybzogYWxsb2NfeHh4ZGV2Ci0JCQkJCSAgIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLiAqLwotI2RlZmluZSBIQVZFX0ZSRUVfTkVUREVWCQkvKiBmcmVlX25ldGRldigpICovCi0jZGVmaW5lIEhBVkVfTkVUREVWX1BSSVYJCS8qIG5ldGRldl9wcml2KCkgKi8KLQogLyogaGFyZHdhcmUgYWRkcmVzcyBhc3NpZ25tZW50IHR5cGVzICovCiAjZGVmaW5lIE5FVF9BRERSX1BFUk0JCTAJLyogYWRkcmVzcyBpcyBwZXJtYW5lbnQgKGRlZmF1bHQpICovCiAjZGVmaW5lIE5FVF9BRERSX1JBTkRPTQkJMQkvKiBhZGRyZXNzIGlzIGdlbmVyYXRlZCByYW5kb21seSAqLwpAQCAtMjU4LDIxICsyNTIsOCBAQAogCW5ldGRldl9od19hZGRyX2xpc3RfZm9yX2VhY2goaGEsICYoZGV2KS0+bWMpCiAKIHN0cnVjdCBoaF9jYWNoZSB7Ci0Jc3RydWN0IGhoX2NhY2hlICpoaF9uZXh0OwkvKiBOZXh0IGVudHJ5CQkJICAgICAqLwotCWF0b21pY190CWhoX3JlZmNudDsJLyogbnVtYmVyIG9mIHVzZXJzICAgICAgICAgICAgICAgICAgICovCi0vKgotICogV2Ugd2FudCBoaF9vdXRwdXQsIGhoX2xlbiwgaGhfbG9jayBhbmQgaGhfZGF0YSBiZSBhIGluIGEgc2VwYXJhdGUKLSAqIGNhY2hlIGxpbmUgb24gU01QLgotICogVGhleSBhcmUgbW9zdGx5IHJlYWQsIGJ1dCBoaF9yZWZjbnQgbWF5IGJlIGNoYW5nZWQgcXVpdGUgZnJlcXVlbnRseSwKLSAqIGluY3VycmluZyBjYWNoZSBsaW5lIHBpbmcgcG9uZ3MuCi0gKi8KLQlfX2JlMTYJCWhoX3R5cGUgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKLQkJCQkJLyogcHJvdG9jb2wgaWRlbnRpZmllciwgZi5lIEVUSF9QX0lQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIE5PVEU6ICBGb3IgVkxBTnMsIHRoaXMgd2lsbCBiZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgZW5jYXB1c2xhdGVkIHR5cGUuIC0tQkxHCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdTE2CQloaF9sZW47CQkvKiBsZW5ndGggb2YgaGVhZGVyICovCi0JaW50CQkoKmhoX291dHB1dCkoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJdTE2CQloaF9sZW47CisJdTE2CQlfX3BhZDsKIAlzZXFsb2NrX3QJaGhfbG9jazsKIAogCS8qIGNhY2hlZCBoYXJkd2FyZSBoZWFkZXI7IGFsbG93IGZvciBtYWNoaW5lIGFsaWdubWVudCBuZWVkcy4gICAgICAgICovCkBAIC0yODQsMTIgKzI2NSw2IEBACiAJdW5zaWduZWQgbG9uZwloaF9kYXRhW0hIX0RBVEFfQUxJR04oTExfTUFYX0hFQURFUikgLyBzaXplb2YobG9uZyldOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIGhoX2NhY2hlX3B1dChzdHJ1Y3QgaGhfY2FjaGUgKmhoKQotewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZoaC0+aGhfcmVmY250KSkKLQkJa2ZyZWUoaGgpOwotfQotCiAvKiBSZXNlcnZlIEhIX0RBVEFfTU9EIGJ5dGUgYWxpZ25lZCBoYXJkX2hlYWRlcl9sZW4sIGJ1dCBhdCBsZWFzdCB0aGF0IG11Y2guCiAgKiBBbHRlcm5hdGl2ZSBpczoKICAqICAgZGV2LT5oYXJkX2hlYWRlcl9sZW4gPyAoZGV2LT5oYXJkX2hlYWRlcl9sZW4gKwpAQCAtMzE0LDggKzI4OSw3IEBACiAJCQkgICBjb25zdCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKTsKIAlpbnQJKCpwYXJzZSkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgY2hhciAqaGFkZHIpOwogCWludAkoKnJlYnVpbGQpKHN0cnVjdCBza19idWZmICpza2IpOwotI2RlZmluZSBIQVZFX0hFQURFUl9DQUNIRQotCWludAkoKmNhY2hlKShjb25zdCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IGhoX2NhY2hlICpoaCk7CisJaW50CSgqY2FjaGUpKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3QgaGhfY2FjaGUgKmhoLCBfX2JlMTYgdHlwZSk7CiAJdm9pZAkoKmNhY2hlX3VwZGF0ZSkoc3RydWN0IGhoX2NhY2hlICpoaCwKIAkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmhhZGRyKTsKQEAgLTU1Niw3ICs1MzAsNyBAQAogCXN0cnVjdCBRZGlzYwkJKnFkaXNjOwogCXVuc2lnbmVkIGxvbmcJCXN0YXRlOwogCXN0cnVjdCBRZGlzYwkJKnFkaXNjX3NsZWVwaW5nOwotI2lmZGVmIENPTkZJR19SUFMKKyNpZiBkZWZpbmVkKENPTkZJR19SUFMpIHx8IGRlZmluZWQoQ09ORklHX1hQUykKIAlzdHJ1Y3Qga29iamVjdAkJa29iajsKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1hQUykgJiYgZGVmaW5lZChDT05GSUdfTlVNQSkKQEAgLTc5NCwxMiArNzY4LDYgQEAKICAqCTMuIFVwZGF0ZSBkZXYtPnN0YXRzIGFzeW5jaHJvbm91c2x5IGFuZCBhdG9taWNhbGx5LCBhbmQgZGVmaW5lCiAgKgkgICBuZWl0aGVyIG9wZXJhdGlvbi4KICAqCi0gKiB2b2lkICgqbmRvX3ZsYW5fcnhfcmVnaXN0ZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApOwotICoJSWYgZGV2aWNlIHN1cHBvcnQgVkxBTiByZWNlaXZlIGFjY2VsZXJhdGlvbgotICoJKGllLiBkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKSwgdGhlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAotICoJd2hlbiB2bGFuIGdyb3VwcyBmb3IgdGhlIGRldmljZSBjaGFuZ2VzLiAgTm90ZTogZ3JwIGlzIE5VTEwKLSAqCWlmIG5vIHZsYW4ncyBncm91cHMgYXJlIGJlaW5nIHVzZWQuCi0gKgogICogdm9pZCAoKm5kb192bGFuX3J4X2FkZF92aWQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCk7CiAgKglJZiBkZXZpY2Ugc3VwcG9ydCBWTEFOIGZpbHRlcmluZyAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpCiAgKgl0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgVkxBTiBpZCBpcyByZWdpc3RlcmVkLgpAQCAtODg4LDcgKzg1Niw2IEBACiAgKglNdXN0IHJldHVybiA+MCBvciAtZXJybm8gaWYgaXQgY2hhbmdlZCBkZXYtPmZlYXR1cmVzIGl0c2VsZi4KICAqCiAgKi8KLSNkZWZpbmUgSEFWRV9ORVRfREVWSUNFX09QUwogc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHsKIAlpbnQJCQkoKm5kb19pbml0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl2b2lkCQkJKCpuZG9fdW5pbml0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTkxOSw4ICs4ODYsNiBAQAogCQkJCQkJICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0b3JhZ2UpOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiAoKm5kb19nZXRfc3RhdHMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCi0Jdm9pZAkJCSgqbmRvX3ZsYW5fcnhfcmVnaXN0ZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkgICAgICAgIHN0cnVjdCB2bGFuX2dyb3VwICpncnApOwogCXZvaWQJCQkoKm5kb192bGFuX3J4X2FkZF92aWQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgdmlkKTsKIAl2b2lkCQkJKCpuZG9fdmxhbl9yeF9raWxsX3ZpZCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTEwOTcsMTIgKzEwNjIsNiBAQAogI2RlZmluZSBORVRJRl9GX0FMTF9GQ09FCShORVRJRl9GX0ZDT0VfQ1JDIHwgTkVUSUZfRl9GQ09FX01UVSB8IFwKIAkJCQkgTkVUSUZfRl9GU08pCiAKLSNkZWZpbmUgTkVUSUZfRl9BTExfVFhfT0ZGTE9BRFMJKE5FVElGX0ZfQUxMX0NTVU0gfCBORVRJRl9GX1NHIHwgXAotCQkJCSBORVRJRl9GX0ZSQUdMSVNUIHwgTkVUSUZfRl9BTExfVFNPIHwgXAotCQkJCSBORVRJRl9GX0hJR0hETUEgfCBcCi0JCQkJIE5FVElGX0ZfU0NUUF9DU1VNIHwgXAotCQkJCSBORVRJRl9GX0FMTF9GQ09FKQotCiAJLyoKIAkgKiBJZiBvbmUgZGV2aWNlIHN1cHBvcnRzIG9uZSBvZiB0aGVzZSBmZWF0dXJlcywgdGhlbiBlbmFibGUgdGhlbQogCSAqIGZvciBhbGwgaW4gbmV0ZGV2X2luY3JlbWVudF9mZWF0dXJlcy4KQEAgLTEyMjAsNyArMTE3OSw3IEBACiAKIAl1bnNpZ25lZCBjaGFyCQlicm9hZGNhc3RbTUFYX0FERFJfTEVOXTsJLyogaHcgYmNhc3QgYWRkCSovCiAKLSNpZmRlZiBDT05GSUdfUlBTCisjaWYgZGVmaW5lZChDT05GSUdfUlBTKSB8fCBkZWZpbmVkKENPTkZJR19YUFMpCiAJc3RydWN0IGtzZXQJCSpxdWV1ZXNfa3NldDsKIAogCXN0cnVjdCBuZXRkZXZfcnhfcXVldWUJKl9yeDsKQEAgLTEzNDgsOSArMTMwNyw2IEBACiAJLyogbWF4IGV4Y2hhbmdlIGlkIGZvciBGQ29FIExSTyBieSBkZHAgKi8KIAl1bnNpZ25lZCBpbnQJCWZjb2VfZGRwX3hpZDsKICNlbmRpZgotCS8qIG4tdHVwbGUgZmlsdGVyIGxpc3QgYXR0YWNoZWQgdG8gdGhpcyBkZXZpY2UgKi8KLQlzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGVfbGlzdCBldGh0b29sX250dXBsZV9saXN0OwotCiAJLyogcGh5IGRldmljZSBtYXkgYXR0YWNoIGl0c2VsZiBmb3IgaGFyZHdhcmUgdGltZXN0YW1waW5nICovCiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKIApAQCAtMTU2Myw5ICsxNTE5LDQxIEBACiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogfTsKIAotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKKy8qIG5ldGRldmljZSBub3RpZmllciBjaGFpbi4gUGxlYXNlIHJlbWVtYmVyIHRvIHVwZGF0ZSB0aGUgcnRuZXRsaW5rCisgKiBub3RpZmljYXRpb24gZXhjbHVzaW9uIGxpc3QgaW4gcnRuZXRsaW5rX2V2ZW50KCkgd2hlbiBhZGRpbmcgbmV3CisgKiB0eXBlcy4KKyAqLworI2RlZmluZSBORVRERVZfVVAJMHgwMDAxCS8qIEZvciBub3cgeW91IGNhbid0IHZldG8gYSBkZXZpY2UgdXAvZG93biAqLworI2RlZmluZSBORVRERVZfRE9XTgkweDAwMDIKKyNkZWZpbmUgTkVUREVWX1JFQk9PVAkweDAwMDMJLyogVGVsbCBhIHByb3RvY29sIHN0YWNrIGEgbmV0d29yayBpbnRlcmZhY2UKKwkJCQkgICBkZXRlY3RlZCBhIGhhcmR3YXJlIGNyYXNoIGFuZCByZXN0YXJ0ZWQKKwkJCQkgICAtIHdlIGNhbiB1c2UgdGhpcyBlZyB0byBraWNrIHRjcCBzZXNzaW9ucworCQkJCSAgIG9uY2UgZG9uZSAqLworI2RlZmluZSBORVRERVZfQ0hBTkdFCTB4MDAwNAkvKiBOb3RpZnkgZGV2aWNlIHN0YXRlIGNoYW5nZSAqLworI2RlZmluZSBORVRERVZfUkVHSVNURVIgMHgwMDA1CisjZGVmaW5lIE5FVERFVl9VTlJFR0lTVEVSCTB4MDAwNgorI2RlZmluZSBORVRERVZfQ0hBTkdFTVRVCTB4MDAwNworI2RlZmluZSBORVRERVZfQ0hBTkdFQUREUgkweDAwMDgKKyNkZWZpbmUgTkVUREVWX0dPSU5HX0RPV04JMHgwMDA5CisjZGVmaW5lIE5FVERFVl9DSEFOR0VOQU1FCTB4MDAwQQorI2RlZmluZSBORVRERVZfRkVBVF9DSEFOR0UJMHgwMDBCCisjZGVmaW5lIE5FVERFVl9CT05ESU5HX0ZBSUxPVkVSIDB4MDAwQworI2RlZmluZSBORVRERVZfUFJFX1VQCQkweDAwMEQKKyNkZWZpbmUgTkVUREVWX1BSRV9UWVBFX0NIQU5HRQkweDAwMEUKKyNkZWZpbmUgTkVUREVWX1BPU1RfVFlQRV9DSEFOR0UJMHgwMDBGCisjZGVmaW5lIE5FVERFVl9QT1NUX0lOSVQJMHgwMDEwCisjZGVmaW5lIE5FVERFVl9VTlJFR0lTVEVSX0JBVENIIDB4MDAxMQorI2RlZmluZSBORVRERVZfUkVMRUFTRQkJMHgwMDEyCisjZGVmaW5lIE5FVERFVl9OT1RJRllfUEVFUlMJMHgwMDEzCisjZGVmaW5lIE5FVERFVl9KT0lOCQkweDAwMTQKKworZXh0ZXJuIGludCByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CitleHRlcm4gaW50IHVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworZXh0ZXJuIGludCBjYWxsX25ldGRldmljZV9ub3RpZmllcnModW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKIGV4dGVybiByd2xvY2tfdAkJCQlkZXZfYmFzZV9sb2NrOwkJLyogRGV2aWNlIGxpc3QgbG9jayAqLwogCiAKQEAgLTE2NDgsMTIgKzE2MzYsOSBAQAogZXh0ZXJuIGludCAJCW5ldGRldl9yZWZjbnRfcmVhZChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkCQlmcmVlX25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkCQlzeW5jaHJvbml6ZV9uZXQodm9pZCk7Ci1leHRlcm4gaW50IAkJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwotZXh0ZXJuIGludAkJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiBleHRlcm4gaW50CQlpbml0X2R1bW15X25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkCQluZXRkZXZfcmVzeW5jX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAotZXh0ZXJuIGludCBjYWxsX25ldGRldmljZV9ub3RpZmllcnModW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlCSpkZXZfZ2V0X2J5X2luZGV4KHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlCSpfX2Rldl9nZXRfYnlfaW5kZXgoc3RydWN0IG5ldCAqbmV0LCBpbnQgaWZpbmRleCk7CiBleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UJKmRldl9nZXRfYnlfaW5kZXhfcmN1KHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgpOwpAQCAtMTc4Niw4ICsxNzcxLDYgQEAKIAogREVDTEFSRV9QRVJfQ1BVX0FMSUdORUQoc3RydWN0IHNvZnRuZXRfZGF0YSwgc29mdG5ldF9kYXRhKTsKIAotI2RlZmluZSBIQVZFX05FVElGX1FVRVVFCi0KIGV4dGVybiB2b2lkIF9fbmV0aWZfc2NoZWR1bGUoc3RydWN0IFFkaXNjICpxKTsKIAogc3RhdGljIGlubGluZSB2b2lkIG5ldGlmX3NjaGVkdWxlX3F1ZXVlKHN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cSkKQEAgLTIwNjMsMTAgKzIwNDYsOCBAQAogICovCiBleHRlcm4gdm9pZCBkZXZfa2ZyZWVfc2tiX2FueShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAotI2RlZmluZSBIQVZFX05FVElGX1JYIDEKIGV4dGVybiBpbnQJCW5ldGlmX3J4KHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGludAkJbmV0aWZfcnhfbmkoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0jZGVmaW5lIEhBVkVfTkVUSUZfUkVDRUlWRV9TS0IgMQogZXh0ZXJuIGludAkJbmV0aWZfcmVjZWl2ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gZ3JvX3Jlc3VsdF90CWRldl9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCiAJCQkJCXN0cnVjdCBza19idWZmICpza2IpOwpAQCAtMjI0Niw3ICsyMjI3LDYgQEAKIC8qCiAgKiBOZXR3b3JrIGludGVyZmFjZSBtZXNzYWdlIGxldmVsIHNldHRpbmdzCiAgKi8KLSNkZWZpbmUgSEFWRV9ORVRJRl9NU0cgMQogCiBlbnVtIHsKIAlORVRJRl9NU0dfRFJWCQk9IDB4MDAwMSwKQEAgLTI1NTUsNyArMjUzNSw3IEBACiAKIGV4dGVybiBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgbmV0X25zX3R5cGVfb3BlcmF0aW9uczsKIAotZXh0ZXJuIGNoYXIgKm5ldGRldl9kcml2ZXJuYW1lKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbik7CitleHRlcm4gY29uc3QgY2hhciAqbmV0ZGV2X2RyaXZlcm5hbWUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIGV4dGVybiB2b2lkIGxpbmt3YXRjaF9ydW5fcXVldWUodm9pZCk7CiAKQEAgLTI1NjQsNyArMjU0NCw2IEBACiAJcmV0dXJuIChkZXYtPmZlYXR1cmVzICYgfmRldi0+aHdfZmVhdHVyZXMpIHwgZGV2LT53YW50ZWRfZmVhdHVyZXM7CiB9CiB1MzIgbmV0ZGV2X2luY3JlbWVudF9mZWF0dXJlcyh1MzIgYWxsLCB1MzIgb25lLCB1MzIgbWFzayk7Ci11MzIgbmV0ZGV2X2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpOwogaW50IF9fbmV0ZGV2X3VwZGF0ZV9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgbmV0ZGV2X3VwZGF0ZV9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgbmV0ZGV2X2NoYW5nZV9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0LmgKaW5kZXggNWEyNjJlMy4uMzU0MGM2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0LmgKQEAgLTEwNCw2ICsxMDQsOCBAQAogCUlQU0VUX0FUVFJfTkFNRVJFRiwKIAlJUFNFVF9BVFRSX0lQMiwKIAlJUFNFVF9BVFRSX0NJRFIyLAorCUlQU0VUX0FUVFJfSVAyX1RPLAorCUlQU0VUX0FUVFJfSUZBQ0UsCiAJX19JUFNFVF9BVFRSX0FEVF9NQVgsCiB9OwogI2RlZmluZSBJUFNFVF9BVFRSX0FEVF9NQVgJKF9fSVBTRVRfQVRUUl9BRFRfTUFYIC0gMSkKQEAgLTE0MiwxMiArMTQ0LDE4IEBACiBlbnVtIGlwc2V0X2NtZF9mbGFncyB7CiAJSVBTRVRfRkxBR19CSVRfRVhJU1QJPSAwLAogCUlQU0VUX0ZMQUdfRVhJU1QJPSAoMSA8PCBJUFNFVF9GTEFHX0JJVF9FWElTVCksCisJSVBTRVRfRkxBR19CSVRfTElTVF9TRVROQU1FID0gMSwKKwlJUFNFVF9GTEFHX0xJU1RfU0VUTkFNRQk9ICgxIDw8IElQU0VUX0ZMQUdfQklUX0xJU1RfU0VUTkFNRSksCisJSVBTRVRfRkxBR19CSVRfTElTVF9IRUFERVIgPSAyLAorCUlQU0VUX0ZMQUdfTElTVF9IRUFERVIJPSAoMSA8PCBJUFNFVF9GTEFHX0JJVF9MSVNUX0hFQURFUiksCiB9OwogCiAvKiBGbGFncyBhdCBDQURUIGF0dHJpYnV0ZSBsZXZlbCAqLwogZW51bSBpcHNldF9jYWR0X2ZsYWdzIHsKIAlJUFNFVF9GTEFHX0JJVF9CRUZPUkUJPSAwLAogCUlQU0VUX0ZMQUdfQkVGT1JFCT0gKDEgPDwgSVBTRVRfRkxBR19CSVRfQkVGT1JFKSwKKwlJUFNFVF9GTEFHX0JJVF9QSFlTREVWCT0gMSwKKwlJUFNFVF9GTEFHX1BIWVNERVYJPSAoMSA8PCBJUFNFVF9GTEFHX0JJVF9QSFlTREVWKSwKIH07CiAKIC8qIENvbW1hbmRzIHdpdGggc2V0dHlwZS1zcGVjaWZpYyBhdHRyaWJ1dGVzICovCkBAIC0xNjUsNiArMTczLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCkBAIC0yMDYsNiArMjE1LDggQEAKIAlJUFNFVF9UWVBFX0lQMiA9ICgxIDw8IElQU0VUX1RZUEVfSVAyX0ZMQUcpLAogCUlQU0VUX1RZUEVfTkFNRV9GTEFHID0gNCwKIAlJUFNFVF9UWVBFX05BTUUgPSAoMSA8PCBJUFNFVF9UWVBFX05BTUVfRkxBRyksCisJSVBTRVRfVFlQRV9JRkFDRV9GTEFHID0gNSwKKwlJUFNFVF9UWVBFX0lGQUNFID0gKDEgPDwgSVBTRVRfVFlQRV9JRkFDRV9GTEFHKSwKIAkvKiBTdHJpY3RseSBzcGVha2luZyBub3QgYSBmZWF0dXJlLCBidXQgYSBmbGFnIGZvciBkdW1waW5nOgogCSAqIHRoaXMgc2V0dHlwZSBtdXN0IGJlIGR1bXBlZCBsYXN0ICovCiAJSVBTRVRfRFVNUF9MQVNUX0ZMQUcgPSA3LApAQCAtMjE0LDcgKzIyNSwxNyBAQAogCiBzdHJ1Y3QgaXBfc2V0OwogCi10eXBlZGVmIGludCAoKmlwc2V0X2FkdGZuKShzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCk7Cit0eXBlZGVmIGludCAoKmlwc2V0X2FkdGZuKShzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLAorCQkJICAgdTMyIHRpbWVvdXQsIHUzMiBmbGFncyk7CisKKy8qIEtlcm5lbCBBUEkgZnVuY3Rpb24gb3B0aW9ucyAqLworc3RydWN0IGlwX3NldF9hZHRfb3B0IHsKKwl1OCBmYW1pbHk7CQkvKiBBY3R1YWwgcHJvdG9jb2wgZmFtaWx5ICovCisJdTggZGltOwkJCS8qIERpbWVuc2lvbiBvZiBtYXRjaC90YXJnZXQgKi8KKwl1OCBmbGFnczsJCS8qIERpcmVjdGlvbiBhbmQgbmVnYXRpb24gZmxhZ3MgKi8KKwl1MzIgY21kZmxhZ3M7CQkvKiBDb21tYW5kLWxpa2UgZmxhZ3MgKi8KKwl1MzIgdGltZW91dDsJCS8qIFRpbWVvdXQgdmFsdWUgKi8KK307CiAKIC8qIFNldCB0eXBlLCB2YXJpYW50LXNwZWNpZmljIHBhcnQgKi8KIHN0cnVjdCBpcF9zZXRfdHlwZV92YXJpYW50IHsKQEAgLTIyMywxNCArMjQ0LDE1IEBACiAJICoJCQl6ZXJvIGZvciBubyBtYXRjaC9zdWNjZXNzIHRvIGFkZC9kZWxldGUKIAkgKgkJCXBvc2l0aXZlIGZvciBtYXRjaGluZyBlbGVtZW50ICovCiAJaW50ICgqa2FkdCkoc3RydWN0IGlwX3NldCAqc2V0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwKLQkJICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTggcGYsIHU4IGRpbSwgdTggZmxhZ3MpOworCQkgICAgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCQkgICAgZW51bSBpcHNldF9hZHQgYWR0LCBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCk7CiAKIAkvKiBVc2Vyc3BhY2U6IHRlc3QvYWRkL2RlbCBlbnRyaWVzCiAJICoJCXJldHVybnMgbmVnYXRpdmUgZXJyb3IgY29kZSwKIAkgKgkJCXplcm8gZm9yIG5vIG1hdGNoL3N1Y2Nlc3MgdG8gYWRkL2RlbGV0ZQogCSAqCQkJcG9zaXRpdmUgZm9yIG1hdGNoaW5nIGVsZW1lbnQgKi8KIAlpbnQgKCp1YWR0KShzdHJ1Y3QgaXBfc2V0ICpzZXQsIHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCSAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MpOworCQkgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzLCBib29sIHJldHJpZWQpOwogCiAJLyogTG93IGxldmVsIGFkZC9kZWwvdGVzdCBmdW5jdGlvbnMgKi8KIAlpcHNldF9hZHRmbiBhZHRbSVBTRVRfQURUX01BWF07CkBAIC0yNjgsOCArMjkwLDggQEAKIAl1OCBkaW1lbnNpb247CiAJLyogU3VwcG9ydGVkIGZhbWlseTogbWF5IGJlIEFGX1VOU1BFQyBmb3IgYm90aCBBRl9JTkVUL0FGX0lORVQ2ICovCiAJdTggZmFtaWx5OwotCS8qIFR5cGUgcmV2aXNpb24gKi8KLQl1OCByZXZpc2lvbjsKKwkvKiBUeXBlIHJldmlzaW9ucyAqLworCXU4IHJldmlzaW9uX21pbiwgcmV2aXNpb25fbWF4OwogCiAJLyogQ3JlYXRlIHNldCAqLwogCWludCAoKmNyZWF0ZSkoc3RydWN0IGlwX3NldCAqc2V0LCBzdHJ1Y3QgbmxhdHRyICp0YltdLCB1MzIgZmxhZ3MpOwpAQCAtMzAwLDYgKzMyMiw4IEBACiAJY29uc3Qgc3RydWN0IGlwX3NldF90eXBlX3ZhcmlhbnQgKnZhcmlhbnQ7CiAJLyogVGhlIGFjdHVhbCBJTkVUIGZhbWlseSBvZiB0aGUgc2V0ICovCiAJdTggZmFtaWx5OworCS8qIFRoZSB0eXBlIHJldmlzaW9uICovCisJdTggcmV2aXNpb247CiAJLyogVGhlIHR5cGUgc3BlY2lmaWMgZGF0YSAqLwogCXZvaWQgKmRhdGE7CiB9OwpAQCAtMzA3LDIxICszMzEsMjUgQEAKIC8qIHJlZ2lzdGVyIGFuZCB1bnJlZ2lzdGVyIHNldCByZWZlcmVuY2VzICovCiBleHRlcm4gaXBfc2V0X2lkX3QgaXBfc2V0X2dldF9ieW5hbWUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGlwX3NldCAqKnNldCk7CiBleHRlcm4gdm9pZCBpcF9zZXRfcHV0X2J5aW5kZXgoaXBfc2V0X2lkX3QgaW5kZXgpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKiBpcF9zZXRfbmFtZV9ieWluZGV4KGlwX3NldF9pZF90IGluZGV4KTsKK2V4dGVybiBjb25zdCBjaGFyICppcF9zZXRfbmFtZV9ieWluZGV4KGlwX3NldF9pZF90IGluZGV4KTsKIGV4dGVybiBpcF9zZXRfaWRfdCBpcF9zZXRfbmZubF9nZXQoY29uc3QgY2hhciAqbmFtZSk7CiBleHRlcm4gaXBfc2V0X2lkX3QgaXBfc2V0X25mbmxfZ2V0X2J5aW5kZXgoaXBfc2V0X2lkX3QgaW5kZXgpOwogZXh0ZXJuIHZvaWQgaXBfc2V0X25mbmxfcHV0KGlwX3NldF9pZF90IGluZGV4KTsKIAogLyogQVBJIGZvciBpcHRhYmxlcyBzZXQgbWF0Y2gsIGFuZCBTRVQgdGFyZ2V0ICovCisKIGV4dGVybiBpbnQgaXBfc2V0X2FkZChpcF9zZXRfaWRfdCBpZCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgdTggZmFtaWx5LCB1OCBkaW0sIHU4IGZsYWdzKTsKKwkJICAgICAgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCk7CiBleHRlcm4gaW50IGlwX3NldF9kZWwoaXBfc2V0X2lkX3QgaWQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgIHU4IGZhbWlseSwgdTggZGltLCB1OCBmbGFncyk7CisJCSAgICAgIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKKwkJICAgICAgY29uc3Qgc3RydWN0IGlwX3NldF9hZHRfb3B0ICpvcHQpOwogZXh0ZXJuIGludCBpcF9zZXRfdGVzdChpcF9zZXRfaWRfdCBpZCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgIHU4IGZhbWlseSwgdTggZGltLCB1OCBmbGFncyk7CisJCSAgICAgICBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCk7CiAKIC8qIFV0aWxpdHkgZnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCAqIGlwX3NldF9hbGxvYyhzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCAqaXBfc2V0X2FsbG9jKHNpemVfdCBzaXplKTsKIGV4dGVybiB2b2lkIGlwX3NldF9mcmVlKHZvaWQgKm1lbWJlcnMpOwogZXh0ZXJuIGludCBpcF9zZXRfZ2V0X2lwYWRkcjQoc3RydWN0IG5sYXR0ciAqbmxhLCAgX19iZTMyICppcGFkZHIpOwogZXh0ZXJuIGludCBpcF9zZXRfZ2V0X2lwYWRkcjYoc3RydWN0IG5sYXR0ciAqbmxhLCB1bmlvbiBuZl9pbmV0X2FkZHIgKmlwYWRkcik7CkBAIC0zMzEsNyArMzU5LDcgQEAKIHsKIAlfX2JlMzIgaXA7CiAJaW50IHJldCA9IGlwX3NldF9nZXRfaXBhZGRyNChubGEsICZpcCk7Ci0JCisKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCSppcGFkZHIgPSBudG9obChpcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYWhhc2guaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9haGFzaC5oCmluZGV4IGFjM2M4MjIuLmI4OWZiNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9haGFzaC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9haGFzaC5oCkBAIC01LDYgKzUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfdGltZW91dC5oPgogCisjZGVmaW5lIENPTkNBVChhLCBiLCBjKQkJYSMjYiMjYworI2RlZmluZSBUT0tFTihhLCBiLCBjKQkJQ09OQ0FUKGEsIGIsIGMpCisKKyNkZWZpbmUgdHlwZV9wZl9uZXh0CQlUT0tFTihUWVBFLCBQRiwgX2VsZW0pCisKIC8qIEhhc2hpbmcgd2hpY2ggdXNlcyBhcnJheXMgdG8gcmVzb2x2ZSBjbGFzaGluZy4gVGhlIGhhc2ggdGFibGUgaXMgcmVzaXplZAogICogKGRvdWJsZWQpIHdoZW4gc2VhcmNoaW5nIGJlY29tZXMgdG9vIGxvbmcuCiAgKiBJbnRlcm5hbGx5IGpoYXNoIGlzIHVzZWQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBzaXplIG9mIHRoZQpAQCAtMjMsNyArMjgsMzIgQEAKIC8qIE51bWJlciBvZiBlbGVtZW50cyB0byBzdG9yZSBpbiBhbiBpbml0aWFsIGFycmF5IGJsb2NrICovCiAjZGVmaW5lIEFIQVNIX0lOSVRfU0laRQkJCTQKIC8qIE1heCBudW1iZXIgb2YgZWxlbWVudHMgdG8gc3RvcmUgaW4gYW4gYXJyYXkgYmxvY2sgKi8KLSNkZWZpbmUgQUhBU0hfTUFYX1NJWkUJCQkoMyo0KQorI2RlZmluZSBBSEFTSF9NQVhfU0laRQkJCSgzKkFIQVNIX0lOSVRfU0laRSkKKworLyogTWF4IG51bWJlciBvZiBlbGVtZW50cyBjYW4gYmUgdHVuZWQgKi8KKyNpZmRlZiBJUF9TRVRfSEFTSF9XSVRIX01VTFRJCisjZGVmaW5lIEFIQVNIX01BWChoKQkJCSgoaCktPmFoYXNoX21heCkKKworc3RhdGljIGlubGluZSB1OAordHVuZV9haGFzaF9tYXgodTggY3VyciwgdTMyIG11bHRpKQoreworCXUzMiBuOworCisJaWYgKG11bHRpIDwgY3VycikKKwkJcmV0dXJuIGN1cnI7CisKKwluID0gY3VyciArIEFIQVNIX0lOSVRfU0laRTsKKwkvKiBDdXJyZW50bHksIGF0IGxpc3Rpbmcgb25lIGhhc2ggYnVja2V0IG11c3QgZml0IGludG8gYSBtZXNzYWdlLgorCSAqIFRoZXJlZm9yZSB3ZSBoYXZlIGEgaGFyZCBsaW1pdCBoZXJlLgorCSAqLworCXJldHVybiBuID4gY3VyciAmJiBuIDw9IDY0ID8gbiA6IGN1cnI7Cit9CisjZGVmaW5lIFRVTkVfQUhBU0hfTUFYKGgsIG11bHRpKQlcCisJKChoKS0+YWhhc2hfbWF4ID0gdHVuZV9haGFzaF9tYXgoKGgpLT5haGFzaF9tYXgsIG11bHRpKSkKKyNlbHNlCisjZGVmaW5lIEFIQVNIX01BWChoKQkJCUFIQVNIX01BWF9TSVpFCisjZGVmaW5lIFRVTkVfQUhBU0hfTUFYKGgsIG11bHRpKQorI2VuZGlmCiAKIC8qIEEgaGFzaCBidWNrZXQgKi8KIHN0cnVjdCBoYnVja2V0IHsKQEAgLTM4LDcgKzY4LDcgQEAKIAlzdHJ1Y3QgaGJ1Y2tldCBidWNrZXRbMF07IC8qIGhhc2h0YWJsZSBidWNrZXRzICovCiB9OwogCi0jZGVmaW5lIGhidWNrZXQoaCwgaSkJCSYoKGgpLT5idWNrZXRbaV0pCisjZGVmaW5lIGhidWNrZXQoaCwgaSkJCSgmKChoKS0+YnVja2V0W2ldKSkKIAogLyogQm9vay1rZWVwaW5nIG9mIHRoZSBwcmVmaXhlcyBhZGRlZCB0byB0aGUgc2V0ICovCiBzdHJ1Y3QgaXBfc2V0X2hhc2hfbmV0cyB7CkBAIC01NCw5ICs4NCwxNiBAQAogCXUzMiBpbml0dmFsOwkJLyogcmFuZG9tIGpoYXNoIGluaXQgdmFsdWUgKi8KIAl1MzIgdGltZW91dDsJCS8qIHRpbWVvdXQgdmFsdWUsIGlmIGVuYWJsZWQgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCBnYzsJLyogZ2FyYmFnZSBjb2xsZWN0aW9uIHdoZW4gdGltZW91dCBlbmFibGVkICovCisJc3RydWN0IHR5cGVfcGZfbmV4dCBuZXh0OyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgdWFkZCAqLworI2lmZGVmIElQX1NFVF9IQVNIX1dJVEhfTVVMVEkKKwl1OCBhaGFzaF9tYXg7CQkvKiBtYXggZWxlbWVudHMgaW4gYW4gYXJyYXkgYmxvY2sgKi8KKyNlbmRpZgogI2lmZGVmIElQX1NFVF9IQVNIX1dJVEhfTkVUTUFTSwogCXU4IG5ldG1hc2s7CQkvKiBuZXRtYXNrIHZhbHVlIGZvciBzdWJuZXRzIHRvIHN0b3JlICovCiAjZW5kaWYKKyNpZmRlZiBJUF9TRVRfSEFTSF9XSVRIX1JCVFJFRQorCXN0cnVjdCByYl9yb290IHJidHJlZTsKKyNlbmRpZgogI2lmZGVmIElQX1NFVF9IQVNIX1dJVEhfTkVUUwogCXN0cnVjdCBpcF9zZXRfaGFzaF9uZXRzIG5ldHNbMF07IC8qIGJvb2sta2VlcGluZyBvZiBwcmVmaXhlcyAqLwogI2VuZGlmCkBAIC0xOTQsMTcgKzIzMSwyNCBAQAogCQlkZWxfdGltZXJfc3luYygmaC0+Z2MpOwogCiAJYWhhc2hfZGVzdHJveShoLT50YWJsZSk7CisjaWZkZWYgSVBfU0VUX0hBU0hfV0lUSF9SQlRSRUUKKwlyYnRyZWVfZGVzdHJveSgmaC0+cmJ0cmVlKTsKKyNlbmRpZgogCWtmcmVlKGgpOwogCiAJc2V0LT5kYXRhID0gTlVMTDsKIH0KIAotI2RlZmluZSBIS0VZKGRhdGEsIGluaXR2YWwsIGh0YWJsZV9iaXRzKQkJCQkgXAotKGpoYXNoMigodTMyICopKGRhdGEpLCBzaXplb2Yoc3RydWN0IHR5cGVfcGZfZWxlbSkvc2l6ZW9mKHUzMiksIGluaXR2YWwpIFwKLQkmIGpoYXNoX21hc2soaHRhYmxlX2JpdHMpKQotCiAjZW5kaWYgLyogX0lQX1NFVF9BSEFTSF9IICovCiAKKyNpZm5kZWYgSEtFWV9EQVRBTEVOCisjZGVmaW5lIEhLRVlfREFUQUxFTglzaXplb2Yoc3RydWN0IHR5cGVfcGZfZWxlbSkKKyNlbmRpZgorCisjZGVmaW5lIEhLRVkoZGF0YSwgaW5pdHZhbCwgaHRhYmxlX2JpdHMpCQkJXAorKGpoYXNoMigodTMyICopKGRhdGEpLCBIS0VZX0RBVEFMRU4vc2l6ZW9mKHUzMiksIGluaXR2YWwpCVwKKwkmIGpoYXNoX21hc2soaHRhYmxlX2JpdHMpKQorCiAjZGVmaW5lIENPTkNBVChhLCBiLCBjKQkJYSMjYiMjYwogI2RlZmluZSBUT0tFTihhLCBiLCBjKQkJQ09OQ0FUKGEsIGIsIGMpCiAKQEAgLTIxNyw2ICsyNjEsNyBAQAogI2RlZmluZSB0eXBlX3BmX2RhdGFfbmV0bWFzawlUT0tFTihUWVBFLCBQRiwgX2RhdGFfbmV0bWFzaykKICNkZWZpbmUgdHlwZV9wZl9kYXRhX2xpc3QJVE9LRU4oVFlQRSwgUEYsIF9kYXRhX2xpc3QpCiAjZGVmaW5lIHR5cGVfcGZfZGF0YV90bGlzdAlUT0tFTihUWVBFLCBQRiwgX2RhdGFfdGxpc3QpCisjZGVmaW5lIHR5cGVfcGZfZGF0YV9uZXh0CVRPS0VOKFRZUEUsIFBGLCBfZGF0YV9uZXh0KQogCiAjZGVmaW5lIHR5cGVfcGZfZWxlbQkJVE9LRU4oVFlQRSwgUEYsIF9lbGVtKQogI2RlZmluZSB0eXBlX3BmX3RlbGVtCQlUT0tFTihUWVBFLCBQRiwgX3RlbGVtKQpAQCAtMjYyLDEyICszMDcsMTMgQEAKIC8qIEFkZCBhbiBlbGVtZW50IHRvIHRoZSBoYXNoIHRhYmxlIHdoZW4gcmVzaXppbmcgdGhlIHNldDoKICAqIHdlIHNwYXJlIHRoZSBtYWludGVuYW5jZSBvZiB0aGUgaW50ZXJuYWwgY291bnRlcnMuICovCiBzdGF0aWMgaW50Ci10eXBlX3BmX2VsZW1fYWRkKHN0cnVjdCBoYnVja2V0ICpuLCBjb25zdCBzdHJ1Y3QgdHlwZV9wZl9lbGVtICp2YWx1ZSkKK3R5cGVfcGZfZWxlbV9hZGQoc3RydWN0IGhidWNrZXQgKm4sIGNvbnN0IHN0cnVjdCB0eXBlX3BmX2VsZW0gKnZhbHVlLAorCQkgdTggYWhhc2hfbWF4KQogewogCWlmIChuLT5wb3MgPj0gbi0+c2l6ZSkgewogCQl2b2lkICp0bXA7CiAKLQkJaWYgKG4tPnNpemUgPj0gQUhBU0hfTUFYX1NJWkUpCisJCWlmIChuLT5zaXplID49IGFoYXNoX21heCkKIAkJCS8qIFRyaWdnZXIgcmVoYXNoaW5nICovCiAJCQlyZXR1cm4gLUVBR0FJTjsKIApAQCAtMzIyLDcgKzM2OCw3IEBACiAJCWZvciAoaiA9IDA7IGogPCBuLT5wb3M7IGorKykgewogCQkJZGF0YSA9IGFoYXNoX2RhdGEobiwgaik7CiAJCQltID0gaGJ1Y2tldCh0LCBIS0VZKGRhdGEsIGgtPmluaXR2YWwsIGh0YWJsZV9iaXRzKSk7Ci0JCQlyZXQgPSB0eXBlX3BmX2VsZW1fYWRkKG0sIGRhdGEpOworCQkJcmV0ID0gdHlwZV9wZl9lbGVtX2FkZChtLCBkYXRhLCBBSEFTSF9NQVgoaCkpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQlyZWFkX3VubG9ja19iaCgmc2V0LT5sb2NrKTsKIAkJCQlhaGFzaF9kZXN0cm95KHQpOwpAQCAtMzQ2LDE3ICszOTIsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkCit0eXBlX3BmX2RhdGFfbmV4dChzdHJ1Y3QgaXBfc2V0X2hhc2ggKmgsIGNvbnN0IHN0cnVjdCB0eXBlX3BmX2VsZW0gKmQpOworCiAvKiBBZGQgYW4gZWxlbWVudCB0byBhIGhhc2ggYW5kIHVwZGF0ZSB0aGUgaW50ZXJuYWwgY291bnRlcnMgd2hlbiBzdWNjZWVkZWQsCiAgKiBvdGhlcndpc2UgcmVwb3J0IHRoZSBwcm9wZXIgZXJyb3IgY29kZS4gKi8KIHN0YXRpYyBpbnQKLXR5cGVfcGZfYWRkKHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0KQordHlwZV9wZl9hZGQoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQsIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJc3RydWN0IGh0YWJsZSAqdDsKIAljb25zdCBzdHJ1Y3QgdHlwZV9wZl9lbGVtICpkID0gdmFsdWU7CiAJc3RydWN0IGhidWNrZXQgKm47CiAJaW50IGksIHJldCA9IDA7Ci0JdTMyIGtleTsKKwl1MzIga2V5LCBtdWx0aSA9IDA7CiAKIAlpZiAoaC0+ZWxlbWVudHMgPj0gaC0+bWF4ZWxlbSkKIAkJcmV0dXJuIC1JUFNFVF9FUlJfSEFTSF9GVUxMOwpAQCAtMzY2LDE0ICs0MTUsMTcgQEAKIAlrZXkgPSBIS0VZKHZhbHVlLCBoLT5pbml0dmFsLCB0LT5odGFibGVfYml0cyk7CiAJbiA9IGhidWNrZXQodCwga2V5KTsKIAlmb3IgKGkgPSAwOyBpIDwgbi0+cG9zOyBpKyspCi0JCWlmICh0eXBlX3BmX2RhdGFfZXF1YWwoYWhhc2hfZGF0YShuLCBpKSwgZCkpIHsKKwkJaWYgKHR5cGVfcGZfZGF0YV9lcXVhbChhaGFzaF9kYXRhKG4sIGkpLCBkLCAmbXVsdGkpKSB7CiAJCQlyZXQgPSAtSVBTRVRfRVJSX0VYSVNUOwogCQkJZ290byBvdXQ7CiAJCX0KLQotCXJldCA9IHR5cGVfcGZfZWxlbV9hZGQobiwgdmFsdWUpOwotCWlmIChyZXQgIT0gMCkKKwlUVU5FX0FIQVNIX01BWChoLCBtdWx0aSk7CisJcmV0ID0gdHlwZV9wZl9lbGVtX2FkZChuLCB2YWx1ZSwgQUhBU0hfTUFYKGgpKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJdHlwZV9wZl9kYXRhX25leHQoaCwgZCk7CiAJCWdvdG8gb3V0OworCX0KIAogI2lmZGVmIElQX1NFVF9IQVNIX1dJVEhfTkVUUwogCWFkZF9jaWRyKGgsIGQtPmNpZHIsIEhPU1RfTUFTSyk7CkBAIC0zODgsNyArNDQwLDcgQEAKICAqIGFuZCBmcmVlIHVwIHNwYWNlIGlmIHBvc3NpYmxlLgogICovCiBzdGF0aWMgaW50Ci10eXBlX3BmX2RlbChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCkKK3R5cGVfcGZfZGVsKHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0LCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCXN0cnVjdCBodGFibGUgKnQgPSBoLT50YWJsZTsKQEAgLTM5NiwxMyArNDQ4LDEzIEBACiAJc3RydWN0IGhidWNrZXQgKm47CiAJaW50IGk7CiAJc3RydWN0IHR5cGVfcGZfZWxlbSAqZGF0YTsKLQl1MzIga2V5OworCXUzMiBrZXksIG11bHRpID0gMDsKIAogCWtleSA9IEhLRVkodmFsdWUsIGgtPmluaXR2YWwsIHQtPmh0YWJsZV9iaXRzKTsKIAluID0gaGJ1Y2tldCh0LCBrZXkpOwogCWZvciAoaSA9IDA7IGkgPCBuLT5wb3M7IGkrKykgewogCQlkYXRhID0gYWhhc2hfZGF0YShuLCBpKTsKLQkJaWYgKCF0eXBlX3BmX2RhdGFfZXF1YWwoZGF0YSwgZCkpCisJCWlmICghdHlwZV9wZl9kYXRhX2VxdWFsKGRhdGEsIGQsICZtdWx0aSkpCiAJCQljb250aW51ZTsKIAkJaWYgKGkgIT0gbi0+cG9zIC0gMSkKIAkJCS8qIE5vdCBsYXN0IG9uZSAqLwpAQCAtNDQzLDE3ICs0OTUsMTcgQEAKIAlzdHJ1Y3QgaGJ1Y2tldCAqbjsKIAljb25zdCBzdHJ1Y3QgdHlwZV9wZl9lbGVtICpkYXRhOwogCWludCBpLCBqID0gMDsKLQl1MzIga2V5OworCXUzMiBrZXksIG11bHRpID0gMDsKIAl1OCBob3N0X21hc2sgPSBTRVRfSE9TVF9NQVNLKHNldC0+ZmFtaWx5KTsKIAogCXByX2RlYnVnKCJ0ZXN0IGJ5IG5ldHNcbiIpOwotCWZvciAoOyBqIDwgaG9zdF9tYXNrICYmIGgtPm5ldHNbal0uY2lkcjsgaisrKSB7CisJZm9yICg7IGogPCBob3N0X21hc2sgJiYgaC0+bmV0c1tqXS5jaWRyICYmICFtdWx0aTsgaisrKSB7CiAJCXR5cGVfcGZfZGF0YV9uZXRtYXNrKGQsIGgtPm5ldHNbal0uY2lkcik7CiAJCWtleSA9IEhLRVkoZCwgaC0+aW5pdHZhbCwgdC0+aHRhYmxlX2JpdHMpOwogCQluID0gaGJ1Y2tldCh0LCBrZXkpOwogCQlmb3IgKGkgPSAwOyBpIDwgbi0+cG9zOyBpKyspIHsKIAkJCWRhdGEgPSBhaGFzaF9kYXRhKG4sIGkpOwotCQkJaWYgKHR5cGVfcGZfZGF0YV9lcXVhbChkYXRhLCBkKSkKKwkJCWlmICh0eXBlX3BmX2RhdGFfZXF1YWwoZGF0YSwgZCwgJm11bHRpKSkKIAkJCQlyZXR1cm4gMTsKIAkJfQogCX0KQEAgLTQ2Myw3ICs1MTUsNyBAQAogCiAvKiBUZXN0IHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIHNldCAqLwogc3RhdGljIGludAotdHlwZV9wZl90ZXN0KHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0KQordHlwZV9wZl90ZXN0KHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0LCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCXN0cnVjdCBodGFibGUgKnQgPSBoLT50YWJsZTsKQEAgLTQ3MSw3ICs1MjMsNyBAQAogCXN0cnVjdCBoYnVja2V0ICpuOwogCWNvbnN0IHN0cnVjdCB0eXBlX3BmX2VsZW0gKmRhdGE7CiAJaW50IGk7Ci0JdTMyIGtleTsKKwl1MzIga2V5LCBtdWx0aSA9IDA7CiAKICNpZmRlZiBJUF9TRVRfSEFTSF9XSVRIX05FVFMKIAkvKiBJZiB3ZSB0ZXN0IGFuIElQIGFkZHJlc3MgYW5kIG5vdCBhIG5ldHdvcmsgYWRkcmVzcywKQEAgLTQ4NCw3ICs1MzYsNyBAQAogCW4gPSBoYnVja2V0KHQsIGtleSk7CiAJZm9yIChpID0gMDsgaSA8IG4tPnBvczsgaSsrKSB7CiAJCWRhdGEgPSBhaGFzaF9kYXRhKG4sIGkpOwotCQlpZiAodHlwZV9wZl9kYXRhX2VxdWFsKGRhdGEsIGQpKQorCQlpZiAodHlwZV9wZl9kYXRhX2VxdWFsKGRhdGEsIGQsICZtdWx0aSkpCiAJCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CkBAIC01ODYsMTAgKzYzOCwxMSBAQAogCiBzdGF0aWMgaW50CiB0eXBlX3BmX2thZHQoc3RydWN0IGlwX3NldCAqc2V0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwKLQkgICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTggcGYsIHU4IGRpbSwgdTggZmxhZ3MpOworCSAgICAgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCSAgICAgZW51bSBpcHNldF9hZHQgYWR0LCBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCk7CiBzdGF0aWMgaW50CiB0eXBlX3BmX3VhZHQoc3RydWN0IGlwX3NldCAqc2V0LCBzdHJ1Y3QgbmxhdHRyICp0YltdLAotCSAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzKTsKKwkgICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTMyICpsaW5lbm8sIHUzMiBmbGFncywgYm9vbCByZXRyaWVkKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpcF9zZXRfdHlwZV92YXJpYW50IHR5cGVfcGZfdmFyaWFudCA9IHsKIAkua2FkdAk9IHR5cGVfcGZfa2FkdCwKQEAgLTY0MCwxNCArNjkzLDE0IEBACiAKIHN0YXRpYyBpbnQKIHR5cGVfcGZfZWxlbV90YWRkKHN0cnVjdCBoYnVja2V0ICpuLCBjb25zdCBzdHJ1Y3QgdHlwZV9wZl9lbGVtICp2YWx1ZSwKLQkJICB1MzIgdGltZW91dCkKKwkJICB1OCBhaGFzaF9tYXgsIHUzMiB0aW1lb3V0KQogewogCXN0cnVjdCB0eXBlX3BmX2VsZW0gKmRhdGE7CiAKIAlpZiAobi0+cG9zID49IG4tPnNpemUpIHsKIAkJdm9pZCAqdG1wOwogCi0JCWlmIChuLT5zaXplID49IEFIQVNIX01BWF9TSVpFKQorCQlpZiAobi0+c2l6ZSA+PSBhaGFzaF9tYXgpCiAJCQkvKiBUcmlnZ2VyIHJlaGFzaGluZyAqLwogCQkJcmV0dXJuIC1FQUdBSU47CiAKQEAgLTc1Miw3ICs4MDUsNyBAQAogCQlmb3IgKGogPSAwOyBqIDwgbi0+cG9zOyBqKyspIHsKIAkJCWRhdGEgPSBhaGFzaF90ZGF0YShuLCBqKTsKIAkJCW0gPSBoYnVja2V0KHQsIEhLRVkoZGF0YSwgaC0+aW5pdHZhbCwgaHRhYmxlX2JpdHMpKTsKLQkJCXJldCA9IHR5cGVfcGZfZWxlbV90YWRkKG0sIGRhdGEsCisJCQlyZXQgPSB0eXBlX3BmX2VsZW1fdGFkZChtLCBkYXRhLCBBSEFTSF9NQVgoaCksCiAJCQkJCQl0eXBlX3BmX2RhdGFfdGltZW91dChkYXRhKSk7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCXJlYWRfdW5sb2NrX2JoKCZzZXQtPmxvY2spOwpAQCAtNzc2LDE1ICs4MjksMTYgQEAKIH0KIAogc3RhdGljIGludAotdHlwZV9wZl90YWRkKHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0KQordHlwZV9wZl90YWRkKHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0LCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCXN0cnVjdCBodGFibGUgKnQgPSBoLT50YWJsZTsKIAljb25zdCBzdHJ1Y3QgdHlwZV9wZl9lbGVtICpkID0gdmFsdWU7CiAJc3RydWN0IGhidWNrZXQgKm47CiAJc3RydWN0IHR5cGVfcGZfZWxlbSAqZGF0YTsKLQlpbnQgcmV0ID0gMCwgaSwgaiA9IEFIQVNIX01BWF9TSVpFICsgMTsKLQl1MzIga2V5OworCWludCByZXQgPSAwLCBpLCBqID0gQUhBU0hfTUFYKGgpICsgMTsKKwlib29sIGZsYWdfZXhpc3QgPSBmbGFncyAmIElQU0VUX0ZMQUdfRVhJU1Q7CisJdTMyIGtleSwgbXVsdGkgPSAwOwogCiAJaWYgKGgtPmVsZW1lbnRzID49IGgtPm1heGVsZW0pCiAJCS8qIEZJWE1FOiB3aGVuIHNldCBpcyBmdWxsLCB3ZSBzbG93IGRvd24gaGVyZSAqLwpAQCAtNzk4LDE4ICs4NTIsMTggQEAKIAluID0gaGJ1Y2tldCh0LCBrZXkpOwogCWZvciAoaSA9IDA7IGkgPCBuLT5wb3M7IGkrKykgewogCQlkYXRhID0gYWhhc2hfdGRhdGEobiwgaSk7Ci0JCWlmICh0eXBlX3BmX2RhdGFfZXF1YWwoZGF0YSwgZCkpIHsKLQkJCWlmICh0eXBlX3BmX2RhdGFfZXhwaXJlZChkYXRhKSkKKwkJaWYgKHR5cGVfcGZfZGF0YV9lcXVhbChkYXRhLCBkLCAmbXVsdGkpKSB7CisJCQlpZiAodHlwZV9wZl9kYXRhX2V4cGlyZWQoZGF0YSkgfHwgZmxhZ19leGlzdCkKIAkJCQlqID0gaTsKIAkJCWVsc2UgewogCQkJCXJldCA9IC1JUFNFVF9FUlJfRVhJU1Q7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoaiA9PSBBSEFTSF9NQVhfU0laRSArIDEgJiYKKwkJfSBlbHNlIGlmIChqID09IEFIQVNIX01BWChoKSArIDEgJiYKIAkJCSAgIHR5cGVfcGZfZGF0YV9leHBpcmVkKGRhdGEpKQogCQkJaiA9IGk7CiAJfQotCWlmIChqICE9IEFIQVNIX01BWF9TSVpFICsgMSkgeworCWlmIChqICE9IEFIQVNIX01BWChoKSArIDEpIHsKIAkJZGF0YSA9IGFoYXNoX3RkYXRhKG4sIGopOwogI2lmZGVmIElQX1NFVF9IQVNIX1dJVEhfTkVUUwogCQlkZWxfY2lkcihoLCBkYXRhLT5jaWRyLCBIT1NUX01BU0spOwpAQCAtODE5LDkgKzg3MywxMyBAQAogCQl0eXBlX3BmX2RhdGFfdGltZW91dF9zZXQoZGF0YSwgdGltZW91dCk7CiAJCWdvdG8gb3V0OwogCX0KLQlyZXQgPSB0eXBlX3BmX2VsZW1fdGFkZChuLCBkLCB0aW1lb3V0KTsKLQlpZiAocmV0ICE9IDApCisJVFVORV9BSEFTSF9NQVgoaCwgbXVsdGkpOworCXJldCA9IHR5cGVfcGZfZWxlbV90YWRkKG4sIGQsIEFIQVNIX01BWChoKSwgdGltZW91dCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCXR5cGVfcGZfZGF0YV9uZXh0KGgsIGQpOwogCQlnb3RvIG91dDsKKwl9CiAKICNpZmRlZiBJUF9TRVRfSEFTSF9XSVRIX05FVFMKIAlhZGRfY2lkcihoLCBkLT5jaWRyLCBIT1NUX01BU0spOwpAQCAtODMzLDcgKzg5MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXR5cGVfcGZfdGRlbChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCkKK3R5cGVfcGZfdGRlbChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCwgdTMyIGZsYWdzKQogewogCXN0cnVjdCBpcF9zZXRfaGFzaCAqaCA9IHNldC0+ZGF0YTsKIAlzdHJ1Y3QgaHRhYmxlICp0ID0gaC0+dGFibGU7CkBAIC04NDEsMTMgKzg5OSwxMyBAQAogCXN0cnVjdCBoYnVja2V0ICpuOwogCWludCBpOwogCXN0cnVjdCB0eXBlX3BmX2VsZW0gKmRhdGE7Ci0JdTMyIGtleTsKKwl1MzIga2V5LCBtdWx0aSA9IDA7CiAKIAlrZXkgPSBIS0VZKHZhbHVlLCBoLT5pbml0dmFsLCB0LT5odGFibGVfYml0cyk7CiAJbiA9IGhidWNrZXQodCwga2V5KTsKIAlmb3IgKGkgPSAwOyBpIDwgbi0+cG9zOyBpKyspIHsKIAkJZGF0YSA9IGFoYXNoX3RkYXRhKG4sIGkpOwotCQlpZiAoIXR5cGVfcGZfZGF0YV9lcXVhbChkYXRhLCBkKSkKKwkJaWYgKCF0eXBlX3BmX2RhdGFfZXF1YWwoZGF0YSwgZCwgJm11bHRpKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAodHlwZV9wZl9kYXRhX2V4cGlyZWQoZGF0YSkpCiAJCQlyZXR1cm4gLUlQU0VUX0VSUl9FWElTVDsKQEAgLTg4NywxNiArOTQ1LDE2IEBACiAJc3RydWN0IHR5cGVfcGZfZWxlbSAqZGF0YTsKIAlzdHJ1Y3QgaGJ1Y2tldCAqbjsKIAlpbnQgaSwgaiA9IDA7Ci0JdTMyIGtleTsKKwl1MzIga2V5LCBtdWx0aSA9IDA7CiAJdTggaG9zdF9tYXNrID0gU0VUX0hPU1RfTUFTSyhzZXQtPmZhbWlseSk7CiAKLQlmb3IgKDsgaiA8IGhvc3RfbWFzayAmJiBoLT5uZXRzW2pdLmNpZHI7IGorKykgeworCWZvciAoOyBqIDwgaG9zdF9tYXNrICYmIGgtPm5ldHNbal0uY2lkciAmJiAhbXVsdGk7IGorKykgewogCQl0eXBlX3BmX2RhdGFfbmV0bWFzayhkLCBoLT5uZXRzW2pdLmNpZHIpOwogCQlrZXkgPSBIS0VZKGQsIGgtPmluaXR2YWwsIHQtPmh0YWJsZV9iaXRzKTsKIAkJbiA9IGhidWNrZXQodCwga2V5KTsKIAkJZm9yIChpID0gMDsgaSA8IG4tPnBvczsgaSsrKSB7CiAJCQlkYXRhID0gYWhhc2hfdGRhdGEobiwgaSk7Ci0JCQlpZiAodHlwZV9wZl9kYXRhX2VxdWFsKGRhdGEsIGQpKQorCQkJaWYgKHR5cGVfcGZfZGF0YV9lcXVhbChkYXRhLCBkLCAmbXVsdGkpKQogCQkJCXJldHVybiAhdHlwZV9wZl9kYXRhX2V4cGlyZWQoZGF0YSk7CiAJCX0KIAl9CkBAIC05MDUsMTQgKzk2MywxNCBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQKLXR5cGVfcGZfdHRlc3Qoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQpCit0eXBlX3BmX3R0ZXN0KHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0LCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCXN0cnVjdCBodGFibGUgKnQgPSBoLT50YWJsZTsKIAlzdHJ1Y3QgdHlwZV9wZl9lbGVtICpkYXRhLCAqZCA9IHZhbHVlOwogCXN0cnVjdCBoYnVja2V0ICpuOwogCWludCBpOwotCXUzMiBrZXk7CisJdTMyIGtleSwgbXVsdGkgPSAwOwogCiAjaWZkZWYgSVBfU0VUX0hBU0hfV0lUSF9ORVRTCiAJaWYgKGQtPmNpZHIgPT0gU0VUX0hPU1RfTUFTSyhzZXQtPmZhbWlseSkpCkBAIC05MjIsNyArOTgwLDcgQEAKIAluID0gaGJ1Y2tldCh0LCBrZXkpOwogCWZvciAoaSA9IDA7IGkgPCBuLT5wb3M7IGkrKykgewogCQlkYXRhID0gYWhhc2hfdGRhdGEobiwgaSk7Ci0JCWlmICh0eXBlX3BmX2RhdGFfZXF1YWwoZGF0YSwgZCkpCisJCWlmICh0eXBlX3BmX2RhdGFfZXF1YWwoZGF0YSwgZCwgJm11bHRpKSkKIAkJCXJldHVybiAhdHlwZV9wZl9kYXRhX2V4cGlyZWQoZGF0YSk7CiAJfQogCXJldHVybiAwOwpAQCAtMTAzMCw2ICsxMDg4LDggQEAKIAkJIElQU0VUX0dDX1BFUklPRChoLT50aW1lb3V0KSk7CiB9CiAKKyN1bmRlZiBIS0VZX0RBVEFMRU4KKyN1bmRlZiBIS0VZCiAjdW5kZWYgdHlwZV9wZl9kYXRhX2VxdWFsCiAjdW5kZWYgdHlwZV9wZl9kYXRhX2lzbnVsbAogI3VuZGVmIHR5cGVfcGZfZGF0YV9jb3B5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2guaAppbmRleCBiODZmMTVjLi5lMmE5ZmFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoLmgKQEAgLTExLDYgKzExLDEwIEBACiAJSVBTRVRfRVJSX0lOVkFMSURfUFJPVE8sCiAJLyogUHJvdG9jb2wgbWlzc2luZyBidXQgbXVzdCBiZSBzcGVjaWZpZWQgKi8KIAlJUFNFVF9FUlJfTUlTU0lOR19QUk9UTywKKwkvKiBSYW5nZSBub3Qgc3VwcG9ydGVkICovCisJSVBTRVRfRVJSX0hBU0hfUkFOR0VfVU5TVVBQT1JURUQsCisJLyogSW52YWxpZCByYW5nZSAqLworCUlQU0VUX0VSUl9IQVNIX1JBTkdFLAogfTsKIAogI2lmZGVmIF9fS0VSTkVMX18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF90aW1lb3V0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfdGltZW91dC5oCmluZGV4IGJjZGQ0MGEuLjQ3OTIzMjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF90aW1lb3V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X3RpbWVvdXQuaApAQCAtMjIsNiArMjIsOSBAQAogCiAjZGVmaW5lIHdpdGhfdGltZW91dCh0aW1lb3V0KQkoKHRpbWVvdXQpICE9IElQU0VUX05PX1RJTUVPVVQpCiAKKyNkZWZpbmUgb3B0X3RpbWVvdXQob3B0LCBtYXApCVwKKwkod2l0aF90aW1lb3V0KChvcHQpLT50aW1lb3V0KSA/IChvcHQpLT50aW1lb3V0IDogKG1hcCktPnRpbWVvdXQpCisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CiBpcF9zZXRfdGltZW91dF91Z2V0KHN0cnVjdCBubGF0dHIgKnRiKQogewpAQCAtNzUsNyArNzgsNyBAQAogc3RhdGljIGlubGluZSB1MzIKIGlwX3NldF90aW1lb3V0X2dldCh1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7Ci0JcmV0dXJuIHRpbWVvdXQgPT0gSVBTRVRfRUxFTV9QRVJNQU5FTlQgPyAwIDogCisJcmV0dXJuIHRpbWVvdXQgPT0gSVBTRVRfRUxFTV9QRVJNQU5FTlQgPyAwIDoKIAkJamlmZmllc190b19tc2Vjcyh0aW1lb3V0IC0gamlmZmllcykvMTAwMDsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvcGZ4bGVuLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9wZnhsZW4uaAppbmRleCAwZTFmYjUwLi4xOTlmZDExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9wZnhsZW4uaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9wZnhsZW4uaApAQCAtMiw3ICsyLDggQEAKICNkZWZpbmUgX1BGWExFTl9ICiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+IAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KIAogLyogUHJlZml4bGVuIG1hcHMsIGJ5IEphbiBFbmdlbGhhcmR0ICAqLwogZXh0ZXJuIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciBpcF9zZXRfbmV0bWFza19tYXBbXTsKQEAgLTMyLDQgKzMzLDEyIEBACiAJcmV0dXJuICZpcF9zZXRfaG9zdG1hc2tfbWFwW3BmeGxlbl0uaXA2WzBdOwogfQogCitleHRlcm4gdTMyIGlwX3NldF9yYW5nZV90b19jaWRyKHUzMiBmcm9tLCB1MzIgdG8sIHU4ICpjaWRyKTsKKworI2RlZmluZSBpcF9zZXRfbWFza19mcm9tX3RvKGZyb20sIHRvLCBjaWRyKQlcCitkbyB7CQkJCQkJXAorCWZyb20gJj0gaXBfc2V0X2hvc3RtYXNrKGNpZHIpOwkJXAorCXRvID0gZnJvbSB8IH5pcF9zZXRfaG9zdG1hc2soY2lkcik7CVwKK30gd2hpbGUgKDApCisKICNlbmRpZiAvKl9QRlhMRU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCmluZGV4IDUwY2RjMjUuLjBkM2RkNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKQEAgLTE4LDYgKzE4LDkgQEAKIAkvKiA+PSB0aGlzIGluZGljYXRlcyByZXBseSBkaXJlY3Rpb24gKi8KIAlJUF9DVF9JU19SRVBMWSwKIAorCUlQX0NUX0VTVEFCTElTSEVEX1JFUExZID0gSVBfQ1RfRVNUQUJMSVNIRUQgKyBJUF9DVF9JU19SRVBMWSwKKwlJUF9DVF9SRUxBVEVEX1JFUExZID0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZLAorCUlQX0NUX05FV19SRVBMWSA9IElQX0NUX05FVyArIElQX0NUX0lTX1JFUExZLAkKIAkvKiBOdW1iZXIgb2YgZGlzdGluY3QgSVBfQ1QgdHlwZXMgKG5vIE5FVyBpbiByZXBseSBkaXJuKS4gKi8KIAlJUF9DVF9OVU1CRVIgPSBJUF9DVF9JU19SRVBMWSAqIDIgLSAxCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaAppbmRleCAyYjExZmMxLi43NGQzMzg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaApAQCAtNjAsNiArNjAsOSBAQAogCWludCAoKmNhbGwpKHN0cnVjdCBzb2NrICpubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCiAJCSAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKIAkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBjZGFbXSk7CisJaW50ICgqY2FsbF9yY3UpKHN0cnVjdCBzb2NrICpubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCSAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBjZGFbXSk7CiAJY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgKnBvbGljeTsJLyogbmV0bGluayBhdHRyaWJ1dGUgcG9saWN5ICovCiAJY29uc3QgdV9pbnQxNl90IGF0dHJfY291bnQ7CQkvKiBudW1iZXIgb2YgbmxhdHRyJ3MgKi8KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5oCmluZGV4IGFmOTRlMDAuLjI0YjMyZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5oCkBAIC04LDYgKzgsNyBAQAogCU5GUU5MX01TR19QQUNLRVQsCQkvKiBwYWNrZXQgZnJvbSBrZXJuZWwgdG8gdXNlcnNwYWNlICovCiAJTkZRTkxfTVNHX1ZFUkRJQ1QsCQkvKiB2ZXJkaWN0IGZyb20gdXNlcnNwYWNlIHRvIGtlcm5lbCAqLwogCU5GUU5MX01TR19DT05GSUcsCQkvKiBjb25uZWN0IHRvIGEgcGFydGljdWxhciBxdWV1ZSAqLworCU5GUU5MX01TR19WRVJESUNUX0JBVENILAkvKiBiYXRjaHYgZnJvbSB1c2Vyc3BhY2UgdG8ga2VybmVsICovCiAKIAlORlFOTF9NU0dfTUFYCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2V0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zZXQuaAppbmRleCAwODFmMWRlLi5jMDQwNWFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zZXQuaApAQCAtMzUsNyArMzUsNyBAQAogCXN0cnVjdCB4dF9zZXRfaW5mb192MCBkZWxfc2V0OwogfTsKIAotLyogUmV2aXNpb24gMTogY3VycmVudCBpbnRlcmZhY2UgdG8gbmV0ZmlsdGVyL2lwdGFibGVzICovCisvKiBSZXZpc2lvbiAxICBtYXRjaCBhbmQgdGFyZ2V0ICovCiAKIHN0cnVjdCB4dF9zZXRfaW5mbyB7CiAJaXBfc2V0X2lkX3QgaW5kZXg7CkBAIC00NCwxMyArNDQsMjIgQEAKIH07CiAKIC8qIG1hdGNoIGFuZCB0YXJnZXQgaW5mb3MgKi8KLXN0cnVjdCB4dF9zZXRfaW5mb19tYXRjaCB7CitzdHJ1Y3QgeHRfc2V0X2luZm9fbWF0Y2hfdjEgewogCXN0cnVjdCB4dF9zZXRfaW5mbyBtYXRjaF9zZXQ7CiB9OwogCi1zdHJ1Y3QgeHRfc2V0X2luZm9fdGFyZ2V0IHsKK3N0cnVjdCB4dF9zZXRfaW5mb190YXJnZXRfdjEgewogCXN0cnVjdCB4dF9zZXRfaW5mbyBhZGRfc2V0OwogCXN0cnVjdCB4dF9zZXRfaW5mbyBkZWxfc2V0OwogfTsKIAorLyogUmV2aXNpb24gMiB0YXJnZXQgKi8KKworc3RydWN0IHh0X3NldF9pbmZvX3RhcmdldF92MiB7CisJc3RydWN0IHh0X3NldF9pbmZvIGFkZF9zZXQ7CisJc3RydWN0IHh0X3NldF9pbmZvIGRlbF9zZXQ7CisJdTMyIGZsYWdzOworCXUzMiB0aW1lb3V0OworfTsKKwogI2VuZGlmIC8qX1hUX1NFVF9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKaW5kZXggYTlkZDg5NS4uMmUxN2M1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICNkZWZpbmUgTkxNX0ZfTVVMVEkJCTIJLyogTXVsdGlwYXJ0IG1lc3NhZ2UsIHRlcm1pbmF0ZWQgYnkgTkxNU0dfRE9ORSAqLwogI2RlZmluZSBOTE1fRl9BQ0sJCTQJLyogUmVwbHkgd2l0aCBhY2ssIHdpdGggemVybyBvciBlcnJvciBjb2RlICovCiAjZGVmaW5lIE5MTV9GX0VDSE8JCTgJLyogRWNobyB0aGlzIHJlcXVlc3QgCQkqLworI2RlZmluZSBOTE1fRl9EVU1QX0lOVFIJCTE2CS8qIER1bXAgd2FzIGluY29uc2lzdGVudCBkdWUgdG8gc2VxdWVuY2UgY2hhbmdlICovCiAKIC8qIE1vZGlmaWVycyB0byBHRVQgcmVxdWVzdCAqLwogI2RlZmluZSBOTE1fRl9ST09UCTB4MTAwCS8qIHNwZWNpZnkgdHJlZQlyb290CSovCkBAIC0yMjEsNyArMjIyLDkgQEAKIAlpbnQJCQkoKmR1bXApKHN0cnVjdCBza19idWZmICogc2tiLAogCQkJCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogCWludAkJCSgqZG9uZSkoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKLQlpbnQJCQlmYW1pbHk7CisJdTE2CQkJZmFtaWx5OworCXUxNgkJCW1pbl9kdW1wX2FsbG9jOworCXVuc2lnbmVkIGludAkJcHJldl9zZXEsIHNlcTsKIAlsb25nCQkJYXJnc1s2XTsKIH07CiAKQEAgLTI1OSw3ICsyNjIsOCBAQAogZXh0ZXJuIGludCBuZXRsaW5rX2R1bXBfc3RhcnQoc3RydWN0IHNvY2sgKnNzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLAogCQkJICAgICAgaW50ICgqZHVtcCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sqKSwKLQkJCSAgICAgIGludCAoKmRvbmUpKHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrKikpOworCQkJICAgICAgaW50ICgqZG9uZSkoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sqKSwKKwkJCSAgICAgIHUxNiBtaW5fZHVtcF9hbGxvYyk7CiAKIAogI2RlZmluZSBOTF9OT05ST09UX1JFQ1YgMHgxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldHBvbGwuaCBiL2luY2x1ZGUvbGludXgvbmV0cG9sbC5oCmluZGV4IDc5MzU4YmIuLjVkZmEwOTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0cG9sbC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0cG9sbC5oCkBAIC00MCw4ICs0MCw2IEBACiAJc3RydWN0IG5ldHBvbGwgKm5ldHBvbGw7CiB9OwogCi12b2lkIG5ldHBvbGxfcG9sbF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIG5ldHBvbGxfcG9sbChzdHJ1Y3QgbmV0cG9sbCAqbnApOwogdm9pZCBuZXRwb2xsX3NlbmRfdWRwKHN0cnVjdCBuZXRwb2xsICpucCwgY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuKTsKIHZvaWQgbmV0cG9sbF9wcmludF9vcHRpb25zKHN0cnVjdCBuZXRwb2xsICpucCk7CiBpbnQgbmV0cG9sbF9wYXJzZV9vcHRpb25zKHN0cnVjdCBuZXRwb2xsICpucCwgY2hhciAqb3B0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZjLmggYi9pbmNsdWRlL2xpbnV4L25mYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMGE0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25mYy5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhCisgKgorICogQXV0aG9yczoKKyAqICAgIExhdXJvIFJhbW9zIFZlbmFuY2lvIDxsYXVyby52ZW5hbmNpb0BvcGVuYm9zc2Eub3JnPgorICogICAgQWxvaXNpbyBBbG1laWRhIEpyIDxhbG9pc2lvLmFsbWVpZGFAb3BlbmJvc3NhLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9ORkNfSAorI2RlZmluZSBfX0xJTlVYX05GQ19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisjZGVmaW5lIE5GQ19HRU5MX05BTUUgIm5mYyIKKyNkZWZpbmUgTkZDX0dFTkxfVkVSU0lPTiAxCisKKyNkZWZpbmUgTkZDX0dFTkxfTUNBU1RfRVZFTlRfTkFNRSAiZXZlbnRzIgorCisvKioKKyAqIGVudW0gbmZjX2NvbW1hbmRzIC0gc3VwcG9ydGVkIG5mYyBjb21tYW5kcworICoKKyAqIEBORkNfQ01EX1VOU1BFQzogdW5zcGVjaWZpZWQgY29tbWFuZAorICoKKyAqIEBORkNfQ01EX0dFVF9ERVZJQ0U6IHJlcXVlc3QgaW5mb3JtYXRpb24gYWJvdXQgYSBkZXZpY2UgKHJlcXVpcmVzCisgKgklTkZDX0FUVFJfREVWSUNFX0lOREVYKSBvciBkdW1wIHJlcXVlc3QgdG8gZ2V0IGEgbGlzdCBvZiBhbGwgbmZjIGRldmljZXMKKyAqIEBORkNfQ01EX1NUQVJUX1BPTEw6IHN0YXJ0IHBvbGxpbmcgZm9yIHRhcmdldHMgdXNpbmcgdGhlIGdpdmVuIHByb3RvY29scworICoJKHJlcXVpcmVzICVORkNfQVRUUl9ERVZJQ0VfSU5ERVggYW5kICVORkNfQVRUUl9QUk9UT0NPTFMpCisgKiBATkZDX0NNRF9TVE9QX1BPTEw6IHN0b3AgcG9sbGluZyBmb3IgdGFyZ2V0cyAocmVxdWlyZXMKKyAqCSVORkNfQVRUUl9ERVZJQ0VfSU5ERVgpCisgKiBATkZDX0NNRF9HRVRfVEFSR0VUOiBkdW1wIGFsbCB0YXJnZXRzIGZvdW5kIGJ5IHRoZSBwcmV2aW91cyBwb2xsIChyZXF1aXJlcworICoJJU5GQ19BVFRSX0RFVklDRV9JTkRFWCkKKyAqIEBORkNfRVZFTlRfVEFSR0VUU19GT1VORDogZXZlbnQgZW1pdHRlZCB3aGVuIGEgbmV3IHRhcmdldCBpcyBmb3VuZAorICoJKGl0IHNlbmRzICVORkNfQVRUUl9ERVZJQ0VfSU5ERVgpCisgKiBATkZDX0VWRU5UX0RFVklDRV9BRERFRDogZXZlbnQgZW1pdHRlZCB3aGVuIGEgbmV3IGRldmljZSBpcyByZWdpc3RyZWQKKyAqCShpdCBzZW5kcyAlTkZDX0FUVFJfREVWSUNFX05BTUUsICVORkNfQVRUUl9ERVZJQ0VfSU5ERVggYW5kCisgKgklTkZDX0FUVFJfUFJPVE9DT0xTKQorICogQE5GQ19FVkVOVF9ERVZJQ0VfUkVNT1ZFRDogZXZlbnQgZW1pdHRlZCB3aGVuIGEgZGV2aWNlIGlzIHJlbW92ZWQKKyAqCShpdCBzZW5kcyAlTkZDX0FUVFJfREVWSUNFX0lOREVYKQorICovCitlbnVtIG5mY19jb21tYW5kcyB7CisJTkZDX0NNRF9VTlNQRUMsCisJTkZDX0NNRF9HRVRfREVWSUNFLAorCU5GQ19DTURfU1RBUlRfUE9MTCwKKwlORkNfQ01EX1NUT1BfUE9MTCwKKwlORkNfQ01EX0dFVF9UQVJHRVQsCisJTkZDX0VWRU5UX1RBUkdFVFNfRk9VTkQsCisJTkZDX0VWRU5UX0RFVklDRV9BRERFRCwKKwlORkNfRVZFTlRfREVWSUNFX1JFTU9WRUQsCisvKiBwcml2YXRlOiBpbnRlcm5hbCB1c2Ugb25seSAqLworCV9fTkZDX0NNRF9BRlRFUl9MQVNUCit9OworI2RlZmluZSBORkNfQ01EX01BWCAoX19ORkNfQ01EX0FGVEVSX0xBU1QgLSAxKQorCisvKioKKyAqIGVudW0gbmZjX2F0dHJzIC0gc3VwcG9ydGVkIG5mYyBhdHRyaWJ1dGVzCisgKgorICogQE5GQ19BVFRSX1VOU1BFQzogdW5zcGVjaWZpZWQgYXR0cmlidXRlCisgKgorICogQE5GQ19BVFRSX0RFVklDRV9JTkRFWDogaW5kZXggb2YgbmZjIGRldmljZQorICogQE5GQ19BVFRSX0RFVklDRV9OQU1FOiBkZXZpY2UgbmFtZSwgbWF4IDggY2hhcnMKKyAqIEBORkNfQVRUUl9QUk9UT0NPTFM6IG5mYyBwcm90b2NvbHMgLSBiaXR3aXNlIG9yLWVkIGNvbWJpbmF0aW9uIGZyb20KKyAqCU5GQ19QUk9UT18qX01BU0sgY29uc3RhbnRzCisgKiBATkZDX0FUVFJfVEFSR0VUX0lOREVYOiBpbmRleCBvZiB0aGUgbmZjIHRhcmdldAorICogQE5GQ19BVFRSX1RBUkdFVF9TRU5TX1JFUzogTkZDLUEgdGFyZ2V0cyBleHRyYSBpbmZvcm1hdGlvbiBzdWNoIGFzIE5GQ0lECisgKiBATkZDX0FUVFJfVEFSR0VUX1NFTF9SRVM6IE5GQy1BIHRhcmdldHMgZXh0cmEgaW5mb3JtYXRpb24gKHVzZWZ1bCBpZiB0aGUKKyAqCXRhcmdldCBpcyBub3QgTkZDLUZvcnVtIGNvbXBsaWFudCkKKyAqLworZW51bSBuZmNfYXR0cnMgeworCU5GQ19BVFRSX1VOU1BFQywKKwlORkNfQVRUUl9ERVZJQ0VfSU5ERVgsCisJTkZDX0FUVFJfREVWSUNFX05BTUUsCisJTkZDX0FUVFJfUFJPVE9DT0xTLAorCU5GQ19BVFRSX1RBUkdFVF9JTkRFWCwKKwlORkNfQVRUUl9UQVJHRVRfU0VOU19SRVMsCisJTkZDX0FUVFJfVEFSR0VUX1NFTF9SRVMsCisvKiBwcml2YXRlOiBpbnRlcm5hbCB1c2Ugb25seSAqLworCV9fTkZDX0FUVFJfQUZURVJfTEFTVAorfTsKKyNkZWZpbmUgTkZDX0FUVFJfTUFYIChfX05GQ19BVFRSX0FGVEVSX0xBU1QgLSAxKQorCisjZGVmaW5lIE5GQ19ERVZJQ0VfTkFNRV9NQVhTSVpFIDgKKworLyogTkZDIHByb3RvY29scyAqLworI2RlZmluZSBORkNfUFJPVE9fSkVXRUwJCTEKKyNkZWZpbmUgTkZDX1BST1RPX01JRkFSRQkyCisjZGVmaW5lIE5GQ19QUk9UT19GRUxJQ0EJMworI2RlZmluZSBORkNfUFJPVE9fSVNPMTQ0NDMJNAorI2RlZmluZSBORkNfUFJPVE9fTkZDX0RFUAk1CisKKyNkZWZpbmUgTkZDX1BST1RPX01BWAkJNgorCisvKiBORkMgcHJvdG9jb2xzIG1hc2tzIHVzZWQgaW4gYml0c2V0cyAqLworI2RlZmluZSBORkNfUFJPVE9fSkVXRUxfTUFTSwkoMSA8PCBORkNfUFJPVE9fSkVXRUwpCisjZGVmaW5lIE5GQ19QUk9UT19NSUZBUkVfTUFTSwkoMSA8PCBORkNfUFJPVE9fTUlGQVJFKQorI2RlZmluZSBORkNfUFJPVE9fRkVMSUNBX01BU0sJKDEgPDwgTkZDX1BST1RPX0ZFTElDQSkKKyNkZWZpbmUgTkZDX1BST1RPX0lTTzE0NDQzX01BU0sJKDEgPDwgTkZDX1BST1RPX0lTTzE0NDQzKQorI2RlZmluZSBORkNfUFJPVE9fTkZDX0RFUF9NQVNLCSgxIDw8IE5GQ19QUk9UT19ORkNfREVQKQorCitzdHJ1Y3Qgc29ja2FkZHJfbmZjIHsKKwlzYV9mYW1pbHlfdCBzYV9mYW1pbHk7CisJX191MzIgZGV2X2lkeDsKKwlfX3UzMiB0YXJnZXRfaWR4OworCV9fdTMyIG5mY19wcm90b2NvbDsKK307CisKKy8qIE5GQyBzb2NrZXQgcHJvdG9jb2xzICovCisjZGVmaW5lIE5GQ19TT0NLUFJPVE9fUkFXCTAKKyNkZWZpbmUgTkZDX1NPQ0tQUk9UT19NQVgJMQorCisjZW5kaWYgLypfX0xJTlVYX05GQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc19mcy5oIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaAppbmRleCAxYjkzYjljLi44YjU3OWJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKQEAgLTg1LDcgKzg1LDcgQEAKIHN0cnVjdCBuZnM0X3N0YXRlOwogc3RydWN0IG5mc19vcGVuX2NvbnRleHQgewogCXN0cnVjdCBuZnNfbG9ja19jb250ZXh0IGxvY2tfY29udGV4dDsKLQlzdHJ1Y3QgcGF0aCBwYXRoOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CiAJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlOwogCWZtb2RlX3QgbW9kZTsKQEAgLTM2MCw3ICszNjAsNyBAQAogZXh0ZXJuIGludCBuZnNfcG9zdF9vcF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpOwogZXh0ZXJuIGludCBuZnNfcG9zdF9vcF91cGRhdGVfaW5vZGVfZm9yY2Vfd2NjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKTsKIGV4dGVybiBpbnQgbmZzX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ICopOwotZXh0ZXJuIGludCBuZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCBuZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKIGV4dGVybiBpbnQgbmZzX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogZXh0ZXJuIGludCBuZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiBleHRlcm4gaW50IG5mc19hdHRyaWJ1dGVfdGltZW91dChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKQEAgLTM3Miw3ICszNzIsNyBAQAogZXh0ZXJuIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpnZXRfbmZzX29wZW5fY29udGV4dChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4KTsKIGV4dGVybiB2b2lkIHB1dF9uZnNfb3Blbl9jb250ZXh0KHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpOwogZXh0ZXJuIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpuZnNfZmluZF9vcGVuX2NvbnRleHQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBmbW9kZV90IG1vZGUpOwotZXh0ZXJuIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICphbGxvY19uZnNfb3Blbl9jb250ZXh0KHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIGZtb2RlX3QgZl9tb2RlKTsKK2V4dGVybiBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqYWxsb2NfbmZzX29wZW5fY29udGV4dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgZm1vZGVfdCBmX21vZGUpOwogZXh0ZXJuIHZvaWQgbmZzX2ZpbGVfc2V0X29wZW5fY29udGV4dChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCk7CiBleHRlcm4gc3RydWN0IG5mc19sb2NrX2NvbnRleHQgKm5mc19nZXRfbG9ja19jb250ZXh0KHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpOwogZXh0ZXJuIHZvaWQgbmZzX3B1dF9sb2NrX2NvbnRleHQoc3RydWN0IG5mc19sb2NrX2NvbnRleHQgKmxfY3R4KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX3BhZ2UuaCBiL2luY2x1ZGUvbGludXgvbmZzX3BhZ2UuaAppbmRleCAzYTM0ZTgwLi4yNTMxMWIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc19wYWdlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfcGFnZS5oCkBAIC05Miw2ICs5Miw5IEBACiAJCQkJICAgc3RydWN0IG5mc19wYWdlICopOwogZXh0ZXJuCXZvaWQgbmZzX3BhZ2Vpb19jb21wbGV0ZShzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICpkZXNjKTsKIGV4dGVybgl2b2lkIG5mc19wYWdlaW9fY29uZF9jb21wbGV0ZShzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICosIHBnb2ZmX3QpOworZXh0ZXJuIGJvb2wgbmZzX2dlbmVyaWNfcGdfdGVzdChzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICpkZXNjLAorCQkJCXN0cnVjdCBuZnNfcGFnZSAqcHJldiwKKwkJCQlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSk7CiBleHRlcm4gIGludCBuZnNfd2FpdF9vbl9yZXF1ZXN0KHN0cnVjdCBuZnNfcGFnZSAqKTsKIGV4dGVybgl2b2lkIG5mc191bmxvY2tfcmVxdWVzdChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSk7CiBleHRlcm4JaW50IG5mc19zZXRfcGFnZV90YWdfbG9ja2VkKHN0cnVjdCBuZnNfcGFnZSAqcmVxKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX3hkci5oIGIvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKaW5kZXggNWU4NDQ0YS4uMDA4NDhkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKQEAgLTE1OCw3ICsxNTgsNiBAQAogCiAvKiBuZnM0MSBzZXNzaW9ucyBjaGFubmVsIGF0dHJpYnV0ZXMgKi8KIHN0cnVjdCBuZnM0X2NoYW5uZWxfYXR0cnMgewotCXUzMgkJCWhlYWRlcnBhZHN6OwogCXUzMgkJCW1heF9ycXN0X3N6OwogCXUzMgkJCW1heF9yZXNwX3N6OwogCXUzMgkJCW1heF9yZXNwX3N6X2NhY2hlZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaAppbmRleCA4NDA1OGVjLi44YTMxYTIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCkBAIC0xMzMsOCArMTMzLDYgQEAKIGludAkJCW5mc2RfZXhwb3J0X2luaXQodm9pZCk7CiB2b2lkCQkJbmZzZF9leHBvcnRfc2h1dGRvd24odm9pZCk7CiB2b2lkCQkJbmZzZF9leHBvcnRfZmx1c2godm9pZCk7Ci12b2lkCQkJZXhwX3JlYWRsb2NrKHZvaWQpOwotdm9pZAkJCWV4cF9yZWFkdW5sb2NrKHZvaWQpOwogc3RydWN0IHN2Y19leHBvcnQgKglycXN0X2V4cF9nZXRfYnlfbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwKIAkJCQkJICAgICBzdHJ1Y3QgcGF0aCAqKTsKIHN0cnVjdCBzdmNfZXhwb3J0ICoJcnFzdF9leHBfcGFyZW50KHN0cnVjdCBzdmNfcnFzdCAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ubDgwMjExLmggYi9pbmNsdWRlL2xpbnV4L25sODAyMTEuaAppbmRleCBjN2NjYWFlLi44YWQ3MGRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25sODAyMTEuaAorKysgYi9pbmNsdWRlL2xpbnV4L25sODAyMTEuaApAQCAtNiw3ICs2LDcgQEAKICAqIENvcHlyaWdodCAyMDA2LTIwMTAgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KICAqIENvcHlyaWdodCAyMDA4IE1pY2hhZWwgV3UgPGZsYW1pbmdpY2VAc291cm1pbGsubmV0PgogICogQ29weXJpZ2h0IDIwMDggTHVpcyBDYXJsb3MgQ29ibyA8bHVpc2NhQGNvenliaXQuY29tPgotICogQ29weXJpZ2h0IDIwMDggTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAqIENvcHlyaWdodCAyMDA4IE1pY2hhZWwgQnVlc2NoIDxtQGJ1ZXMuY2g+CiAgKiBDb3B5cmlnaHQgMjAwOCwgMjAwOSBMdWlzIFIuIFJvZHJpZ3VleiA8bHJvZHJpZ3VlekBhdGhlcm9zLmNvbT4KICAqIENvcHlyaWdodCAyMDA4IEpvdW5pIE1hbGluZW4gPGpvdW5pLm1hbGluZW5AYXRoZXJvcy5jb20+CiAgKiBDb3B5cmlnaHQgMjAwOCBDb2xpbiBNY0NhYmUgPGNvbGluQGNvenliaXQuY29tPgpAQCAtMjQ3LDcgKzI0Nyw4IEBACiAgKglwYXNzZWQsIGFsbCBjaGFubmVscyBhbGxvd2VkIGZvciB0aGUgY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbgogICoJYXJlIHVzZWQuICBFeHRyYSBJRXMgY2FuIGFsc28gYmUgcGFzc2VkIGZyb20gdGhlIHVzZXJzcGFjZSBieQogICoJdXNpbmcgdGhlICVOTDgwMjExX0FUVFJfSUUgYXR0cmlidXRlLgotICogQE5MODAyMTFfQ01EX1NUT1BfU0NIRURfU0NBTjogc3RvcCBhIHNjaGVkdWxlZCBzY2FuCisgKiBATkw4MDIxMV9DTURfU1RPUF9TQ0hFRF9TQ0FOOiBzdG9wIGEgc2NoZWR1bGVkIHNjYW4uICBSZXR1cm5zIC1FTk9FTlQKKyAqCWlmIHNjaGVkdWxlZCBzY2FuIGlzIG5vdCBydW5uaW5nLgogICogQE5MODAyMTFfQ01EX1NDSEVEX1NDQU5fUkVTVUxUUzogaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIHNjaGVkdWxlZCBzY2FuCiAgKglyZXN1bHRzIGF2YWlsYWJsZS4KICAqIEBOTDgwMjExX0NNRF9TQ0hFRF9TQ0FOX1NUT1BQRUQ6IGluZGljYXRlcyB0aGF0IHRoZSBzY2hlZHVsZWQgc2NhbiBoYXMKQEAgLTQ4Myw2ICs0ODQsMTQgQEAKICAqCW1vcmUgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiwgc2VlCiAgKglodHRwOi8vd2lyZWxlc3Mua2VybmVsLm9yZy9lbi91c2Vycy9Eb2N1bWVudGF0aW9uL1dvV0xBTi4KICAqCisgKiBATkw4MDIxMV9DTURfU0VUX1JFS0VZX09GRkxPQUQ6IFRoaXMgY29tbWFuZCBpcyB1c2VkIGdpdmUgdGhlIGRyaXZlcgorICoJdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3Igc3VwcG9ydGluZyBHVEsgcmVrZXkgb2ZmbG9hZC4gVGhpcworICoJZmVhdHVyZSBpcyB0eXBpY2FsbHkgdXNlZCBkdXJpbmcgV29XTEFOLiBUaGUgY29uZmlndXJhdGlvbiBkYXRhCisgKglpcyBjb250YWluZWQgaW4gJU5MODAyMTFfQVRUUl9SRUtFWV9EQVRBICh3aGljaCBpcyBuZXN0ZWQgYW5kCisgKgljb250YWlucyB0aGUgZGF0YSBpbiBzdWItYXR0cmlidXRlcykuIEFmdGVyIHJla2V5aW5nIGhhcHBlbmVkLAorICoJdGhpcyBjb21tYW5kIG1heSBhbHNvIGJlIHNlbnQgYnkgdGhlIGRyaXZlciBhcyBhbiBNTE1FIGV2ZW50IHRvCisgKglpbmZvcm0gdXNlcnNwYWNlIG9mIHRoZSBuZXcgcmVwbGF5IGNvdW50ZXIuCisgKgogICogQE5MODAyMTFfQ01EX01BWDogaGlnaGVzdCB1c2VkIGNvbW1hbmQgbnVtYmVyCiAgKiBAX19OTDgwMjExX0NNRF9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKICAqLwpAQCAtNjA1LDYgKzYxNCw4IEBACiAJTkw4MDIxMV9DTURfU0NIRURfU0NBTl9SRVNVTFRTLAogCU5MODAyMTFfQ01EX1NDSEVEX1NDQU5fU1RPUFBFRCwKIAorCU5MODAyMTFfQ01EX1NFVF9SRUtFWV9PRkZMT0FELAorCiAJLyogYWRkIG5ldyBjb21tYW5kcyBhYm92ZSBoZXJlICovCiAKIAkvKiB1c2VkIHRvIGRlZmluZSBOTDgwMjExX0NNRF9NQVggYmVsb3cgKi8KQEAgLTc0NSw4ICs3NTYsMTIgQEAKICAqCiAgKiBATkw4MDIxMV9BVFRSX01BWF9OVU1fU0NBTl9TU0lEUzogbnVtYmVyIG9mIFNTSURzIHlvdSBjYW4gc2NhbiB3aXRoCiAgKglhIHNpbmdsZSBzY2FuIHJlcXVlc3QsIGEgd2lwaHkgYXR0cmlidXRlLgorICogQE5MODAyMTFfQVRUUl9NQVhfTlVNX1NDSEVEX1NDQU5fU1NJRFM6IG51bWJlciBvZiBTU0lEcyB5b3UgY2FuCisgKglzY2FuIHdpdGggYSBzaW5nbGUgc2NoZWR1bGVkIHNjYW4gcmVxdWVzdCwgYSB3aXBoeSBhdHRyaWJ1dGUuCiAgKiBATkw4MDIxMV9BVFRSX01BWF9TQ0FOX0lFX0xFTjogbWF4aW11bSBsZW5ndGggb2YgaW5mb3JtYXRpb24gZWxlbWVudHMKICAqCXRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgc2NhbiByZXF1ZXN0CisgKiBATkw4MDIxMV9BVFRSX01BWF9TQ0hFRF9TQ0FOX0lFX0xFTjogbWF4aW11bSBsZW5ndGggb2YgaW5mb3JtYXRpb24KKyAqCWVsZW1lbnRzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgc2NoZWR1bGVkIHNjYW4gcmVxdWVzdAogICoKICAqIEBOTDgwMjExX0FUVFJfU0NBTl9GUkVRVUVOQ0lFUzogbmVzdGVkIGF0dHJpYnV0ZSB3aXRoIGZyZXF1ZW5jaWVzIChpbiBNSHopCiAgKiBATkw4MDIxMV9BVFRSX1NDQU5fU1NJRFM6IG5lc3RlZCBhdHRyaWJ1dGUgd2l0aCBTU0lEcywgbGVhdmUgb3V0IGZvciBwYXNzaXZlCkBAIC05NzgsOCArOTkzLDggQEAKICAqCWRyaXZpbmcgdGhlIHBlZXIgbGluayBtYW5hZ2VtZW50IHN0YXRlIG1hY2hpbmUuCiAgKglATkw4MDIxMV9NRVNIX1NFVFVQX1VTRVJTUEFDRV9BTVBFIG11c3QgYmUgZW5hYmxlZC4KICAqCi0gKiBATkw4MDIxMV9BVFRSX1dPV0xBTl9TVVBQT1JURUQ6IGluZGljYXRlcywgYXMgcGFydCBvZiB0aGUgd2lwaHkgY2FwYWJpbGl0aWVzLAotICoJdGhlIHN1cHBvcnRlZCBXb1dMQU4gdHJpZ2dlcnMKKyAqIEBOTDgwMjExX0FUVFJfV09XTEFOX1RSSUdHRVJTX1NVUFBPUlRFRDogaW5kaWNhdGVzLCBhcyBwYXJ0IG9mIHRoZSB3aXBoeQorICoJY2FwYWJpbGl0aWVzLCB0aGUgc3VwcG9ydGVkIFdvV0xBTiB0cmlnZ2VycwogICogQE5MODAyMTFfQVRUUl9XT1dMQU5fVFJJR0dFUlM6IHVzZWQgYnkgJU5MODAyMTFfQ01EX1NFVF9XT1dMQU4gdG8KICAqCWluZGljYXRlIHdoaWNoIFdvVyB0cmlnZ2VycyBzaG91bGQgYmUgZW5hYmxlZC4gVGhpcyBpcyBhbHNvCiAgKgl1c2VkIGJ5ICVOTDgwMjExX0NNRF9HRVRfV09XTEFOIHRvIGdldCB0aGUgY3VycmVudGx5IGVuYWJsZWQgV29XTEFOCkBAIC05OTYsNiArMTAxMSwxNCBAQAogICoJYXJlIG1hbmFnZWQgaW4gc29mdHdhcmU6IGludGVyZmFjZXMgb2YgdGhlc2UgdHlwZXMgYXJlbid0IHN1YmplY3QgdG8KICAqCWFueSByZXN0cmljdGlvbnMgaW4gdGhlaXIgbnVtYmVyIG9yIGNvbWJpbmF0aW9ucy4KICAqCisgKiBAJU5MODAyMTFfQVRUUl9SRUtFWV9EQVRBOiBuZXN0ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uCisgKgluZWNlc3NhcnkgZm9yIEdUSyByZWtleWluZyBpbiB0aGUgZGV2aWNlLCBzZWUgJmVudW0gbmw4MDIxMV9yZWtleV9kYXRhLgorICoKKyAqIEBOTDgwMjExX0FUVFJfU0NBTl9TVVBQX1JBVEVTOiByYXRlcyBwZXIgdG8gYmUgYWR2ZXJ0aXNlZCBhcyBzdXBwb3J0ZWQgaW4gc2NhbiwKKyAqCW5lc3RlZCBhcnJheSBhdHRyaWJ1dGUgY29udGFpbmluZyBhbiBlbnRyeSBmb3IgZWFjaCBiYW5kLCB3aXRoIHRoZSBlbnRyeQorICoJYmVpbmcgYSBsaXN0IG9mIHN1cHBvcnRlZCByYXRlcyBhcyBkZWZpbmVkIGJ5IElFRUUgODAyLjExIDcuMy4yLjIgYnV0CisgKgl3aXRob3V0IHRoZSBsZW5ndGggcmVzdHJpY3Rpb24gKGF0IG1vc3QgJU5MODAyMTFfTUFYX1NVUFBfUkFURVMpLgorICoKICAqIEBOTDgwMjExX0FUVFJfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKICAqIEBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKICAqLwpAQCAtMTE5NCw2ICsxMjE3LDEzIEBACiAJTkw4MDIxMV9BVFRSX0lOVEVSRkFDRV9DT01CSU5BVElPTlMsCiAJTkw4MDIxMV9BVFRSX1NPRlRXQVJFX0lGVFlQRVMsCiAKKwlOTDgwMjExX0FUVFJfUkVLRVlfREFUQSwKKworCU5MODAyMTFfQVRUUl9NQVhfTlVNX1NDSEVEX1NDQU5fU1NJRFMsCisJTkw4MDIxMV9BVFRSX01BWF9TQ0hFRF9TQ0FOX0lFX0xFTiwKKworCU5MODAyMTFfQVRUUl9TQ0FOX1NVUFBfUkFURVMsCisKIAkvKiBhZGQgYXR0cmlidXRlcyBoZXJlLCB1cGRhdGUgdGhlIHBvbGljeSBpbiBubDgwMjExLmMgKi8KIAogCV9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1QsCkBAIC0yMjM5LDYgKzIyNjksMTYgQEAKICAqCiAgKglJbiAlTkw4MDIxMV9BVFRSX1dPV0xBTl9UUklHR0VSU19TVVBQT1JURUQsIGl0IGlzIGEgYmluYXJ5IGF0dHJpYnV0ZQogICoJY2FycnlpbmcgYSAmc3RydWN0IG5sODAyMTFfd293bGFuX3BhdHRlcm5fc3VwcG9ydC4KKyAqIEBOTDgwMjExX1dPV0xBTl9UUklHX0dUS19SRUtFWV9TVVBQT1JURUQ6IE5vdCBhIHJlYWwgdHJpZ2dlciwgYW5kIGNhbm5vdCBiZQorICoJdXNlZCB3aGVuIHNldHRpbmcsIHVzZWQgb25seSB0byBpbmRpY2F0ZSB0aGF0IEdUSyByZWtleWluZyBpcyBzdXBwb3J0ZWQKKyAqCWJ5IHRoZSBkZXZpY2UgKGZsYWcpCisgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19HVEtfUkVLRVlfRkFJTFVSRTogd2FrZSB1cCBvbiBHVEsgcmVrZXkgZmFpbHVyZSAoaWYKKyAqCWRvbmUgYnkgdGhlIGRldmljZSkgKGZsYWcpCisgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19FQVBfSURFTlRfUkVRVUVTVDogd2FrZSB1cCBvbiBFQVAgSWRlbnRpdHkgUmVxdWVzdAorICoJcGFja2V0IChmbGFnKQorICogQE5MODAyMTFfV09XTEFOX1RSSUdfNFdBWV9IQU5EU0hBS0U6IHdha2UgdXAgb24gNC13YXkgaGFuZHNoYWtlIChmbGFnKQorICogQE5MODAyMTFfV09XTEFOX1RSSUdfUkZLSUxMX1JFTEVBU0U6IHdha2UgdXAgd2hlbiByZmtpbGwgaXMgcmVsZWFzZWQKKyAqCShvbiBkZXZpY2VzIHRoYXQgaGF2ZSByZmtpbGwgaW4gdGhlIGRldmljZSkgKGZsYWcpCiAgKiBATlVNX05MODAyMTFfV09XTEFOX1RSSUc6IG51bWJlciBvZiB3YWtlIG9uIHdpcmVsZXNzIHRyaWdnZXJzCiAgKiBATUFYX05MODAyMTFfV09XTEFOX1RSSUc6IGhpZ2hlc3Qgd293bGFuIHRyaWdnZXIgYXR0cmlidXRlIG51bWJlcgogICovCkBAIC0yMjQ4LDYgKzIyODgsMTEgQEAKIAlOTDgwMjExX1dPV0xBTl9UUklHX0RJU0NPTk5FQ1QsCiAJTkw4MDIxMV9XT1dMQU5fVFJJR19NQUdJQ19QS1QsCiAJTkw4MDIxMV9XT1dMQU5fVFJJR19QS1RfUEFUVEVSTiwKKwlOTDgwMjExX1dPV0xBTl9UUklHX0dUS19SRUtFWV9TVVBQT1JURUQsCisJTkw4MDIxMV9XT1dMQU5fVFJJR19HVEtfUkVLRVlfRkFJTFVSRSwKKwlOTDgwMjExX1dPV0xBTl9UUklHX0VBUF9JREVOVF9SRVFVRVNULAorCU5MODAyMTFfV09XTEFOX1RSSUdfNFdBWV9IQU5EU0hBS0UsCisJTkw4MDIxMV9XT1dMQU5fVFJJR19SRktJTExfUkVMRUFTRSwKIAogCS8qIGtlZXAgbGFzdCAqLwogCU5VTV9OTDgwMjExX1dPV0xBTl9UUklHLApAQCAtMjM2MSw0ICsyNDA2LDI4IEBACiAJTUFYX05MODAyMTFfUExJTktfU1RBVEVTID0gTlVNX05MODAyMTFfUExJTktfU1RBVEVTIC0gMQogfTsKIAorI2RlZmluZSBOTDgwMjExX0tDS19MRU4JCQkxNgorI2RlZmluZSBOTDgwMjExX0tFS19MRU4JCQkxNgorI2RlZmluZSBOTDgwMjExX1JFUExBWV9DVFJfTEVOCQk4CisKKy8qKgorICogZW51bSBubDgwMjExX3Jla2V5X2RhdGEgLSBhdHRyaWJ1dGVzIGZvciBHVEsgcmVrZXkgb2ZmbG9hZAorICogQF9fTkw4MDIxMV9SRUtFWV9EQVRBX0lOVkFMSUQ6IGludmFsaWQgbnVtYmVyIGZvciBuZXN0ZWQgYXR0cmlidXRlcworICogQE5MODAyMTFfUkVLRVlfREFUQV9LRUs6IGtleSBlbmNyeXB0aW9uIGtleSAoYmluYXJ5KQorICogQE5MODAyMTFfUkVLRVlfREFUQV9LQ0s6IGtleSBjb25maXJtYXRpb24ga2V5IChiaW5hcnkpCisgKiBATkw4MDIxMV9SRUtFWV9EQVRBX1JFUExBWV9DVFI6IHJlcGxheSBjb3VudGVyIChiaW5hcnkpCisgKiBATlVNX05MODAyMTFfUkVLRVlfREFUQTogbnVtYmVyIG9mIHJla2V5IGF0dHJpYnV0ZXMgKGludGVybmFsKQorICogQE1BWF9OTDgwMjExX1JFS0VZX0RBVEE6IGhpZ2hlc3QgcmVrZXkgYXR0cmlidXRlIChpbnRlcm5hbCkKKyAqLworZW51bSBubDgwMjExX3Jla2V5X2RhdGEgeworCV9fTkw4MDIxMV9SRUtFWV9EQVRBX0lOVkFMSUQsCisJTkw4MDIxMV9SRUtFWV9EQVRBX0tFSywKKwlOTDgwMjExX1JFS0VZX0RBVEFfS0NLLAorCU5MODAyMTFfUkVLRVlfREFUQV9SRVBMQVlfQ1RSLAorCisJLyoga2VlcCBsYXN0ICovCisJTlVNX05MODAyMTFfUkVLRVlfREFUQSwKKwlNQVhfTkw4MDIxMV9SRUtFWV9EQVRBID0gTlVNX05MODAyMTFfUkVLRVlfREFUQSAtIDEKK307CisKICNlbmRpZiAvKiBfX0xJTlVYX05MODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ub3RpZmllci5oIGIvaW5jbHVkZS9saW51eC9ub3RpZmllci5oCmluZGV4IGMwNjg4YjAuLmQ2NTc0NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbm90aWZpZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25vdGlmaWVyLmgKQEAgLTE4NSw4MSArMTg1LDE4IEBACiAgKglWQyBzd2l0Y2ggY2hhaW5zIChmb3IgbG9hZGFibGUga2VybmVsIHN2Z2FsaWIgVkMgc3dpdGNoIGhlbHBlcnMpIGV0Yy4uLgogICovCiAgCi0vKiBuZXRkZXZpY2Ugbm90aWZpZXIgY2hhaW4uIFBsZWFzZSByZW1lbWJlciB0byB1cGRhdGUgdGhlIHJ0bmV0bGluawotICogbm90aWZpY2F0aW9uIGV4Y2x1c2lvbiBsaXN0IGluIHJ0bmV0bGlua19ldmVudCgpIHdoZW4gYWRkaW5nIG5ldwotICogdHlwZXMuCi0gKi8KLSNkZWZpbmUgTkVUREVWX1VQCTB4MDAwMQkvKiBGb3Igbm93IHlvdSBjYW4ndCB2ZXRvIGEgZGV2aWNlIHVwL2Rvd24gKi8KLSNkZWZpbmUgTkVUREVWX0RPV04JMHgwMDAyCi0jZGVmaW5lIE5FVERFVl9SRUJPT1QJMHgwMDAzCS8qIFRlbGwgYSBwcm90b2NvbCBzdGFjayBhIG5ldHdvcmsgaW50ZXJmYWNlCi0JCQkJICAgZGV0ZWN0ZWQgYSBoYXJkd2FyZSBjcmFzaCBhbmQgcmVzdGFydGVkCi0JCQkJICAgLSB3ZSBjYW4gdXNlIHRoaXMgZWcgdG8ga2ljayB0Y3Agc2Vzc2lvbnMKLQkJCQkgICBvbmNlIGRvbmUgKi8KLSNkZWZpbmUgTkVUREVWX0NIQU5HRQkweDAwMDQJLyogTm90aWZ5IGRldmljZSBzdGF0ZSBjaGFuZ2UgKi8KLSNkZWZpbmUgTkVUREVWX1JFR0lTVEVSIDB4MDAwNQotI2RlZmluZSBORVRERVZfVU5SRUdJU1RFUgkweDAwMDYKLSNkZWZpbmUgTkVUREVWX0NIQU5HRU1UVQkweDAwMDcKLSNkZWZpbmUgTkVUREVWX0NIQU5HRUFERFIJMHgwMDA4Ci0jZGVmaW5lIE5FVERFVl9HT0lOR19ET1dOCTB4MDAwOQotI2RlZmluZSBORVRERVZfQ0hBTkdFTkFNRQkweDAwMEEKLSNkZWZpbmUgTkVUREVWX0ZFQVRfQ0hBTkdFCTB4MDAwQgotI2RlZmluZSBORVRERVZfQk9ORElOR19GQUlMT1ZFUiAweDAwMEMKLSNkZWZpbmUgTkVUREVWX1BSRV9VUAkJMHgwMDBECi0jZGVmaW5lIE5FVERFVl9QUkVfVFlQRV9DSEFOR0UJMHgwMDBFCi0jZGVmaW5lIE5FVERFVl9QT1NUX1RZUEVfQ0hBTkdFCTB4MDAwRgotI2RlZmluZSBORVRERVZfUE9TVF9JTklUCTB4MDAxMAotI2RlZmluZSBORVRERVZfVU5SRUdJU1RFUl9CQVRDSCAweDAwMTEKLSNkZWZpbmUgTkVUREVWX1JFTEVBU0UJCTB4MDAxMgotI2RlZmluZSBORVRERVZfTk9USUZZX1BFRVJTCTB4MDAxMwotI2RlZmluZSBORVRERVZfSk9JTgkJMHgwMDE0CisvKiBDUFUgbm90ZmllcnMgYXJlIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9jcHUuaC4gKi8KIAotI2RlZmluZSBTWVNfRE9XTgkweDAwMDEJLyogTm90aWZ5IG9mIHN5c3RlbSBkb3duICovCi0jZGVmaW5lIFNZU19SRVNUQVJUCVNZU19ET1dOCi0jZGVmaW5lIFNZU19IQUxUCTB4MDAwMgkvKiBOb3RpZnkgb2Ygc3lzdGVtIGhhbHQgKi8KLSNkZWZpbmUgU1lTX1BPV0VSX09GRgkweDAwMDMJLyogTm90aWZ5IG9mIHN5c3RlbSBwb3dlciBvZmYgKi8KKy8qIG5ldGRldmljZSBub3RpZmllcnMgYXJlIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCAqLworCisvKiByZWJvb3Qgbm90aWZpZXJzIGFyZSBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvcmVib290LmguICovCisKKy8qIEhpYmVybmF0aW9uIGFuZCBzdXNwZW5kIGV2ZW50cyBhcmUgZGVmaW5lZCBpbiBpbmNsdWRlL2xpbnV4L3N1c3BlbmQuaC4gKi8KKworLyogVmlydHVhbCBUZXJtaW5hbCBldmVudHMgYXJlIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC92dC5oLiAqLwogCiAjZGVmaW5lIE5FVExJTktfVVJFTEVBU0UJMHgwMDAxCS8qIFVuaWNhc3QgbmV0bGluayBzb2NrZXQgcmVsZWFzZWQgKi8KIAotI2RlZmluZSBDUFVfT05MSU5FCQkweDAwMDIgLyogQ1BVICh1bnNpZ25lZCl2IGlzIHVwICovCi0jZGVmaW5lIENQVV9VUF9QUkVQQVJFCQkweDAwMDMgLyogQ1BVICh1bnNpZ25lZCl2IGNvbWluZyB1cCAqLwotI2RlZmluZSBDUFVfVVBfQ0FOQ0VMRUQJCTB4MDAwNCAvKiBDUFUgKHVuc2lnbmVkKXYgTk9UIGNvbWluZyB1cCAqLwotI2RlZmluZSBDUFVfRE9XTl9QUkVQQVJFCTB4MDAwNSAvKiBDUFUgKHVuc2lnbmVkKXYgZ29pbmcgZG93biAqLwotI2RlZmluZSBDUFVfRE9XTl9GQUlMRUQJCTB4MDAwNiAvKiBDUFUgKHVuc2lnbmVkKXYgTk9UIGdvaW5nIGRvd24gKi8KLSNkZWZpbmUgQ1BVX0RFQUQJCTB4MDAwNyAvKiBDUFUgKHVuc2lnbmVkKXYgZGVhZCAqLwotI2RlZmluZSBDUFVfRFlJTkcJCTB4MDAwOCAvKiBDUFUgKHVuc2lnbmVkKXYgbm90IHJ1bm5pbmcgYW55IHRhc2ssCi0JCQkJCSogbm90IGhhbmRsaW5nIGludGVycnVwdHMsIHNvb24gZGVhZC4KLQkJCQkJKiBDYWxsZWQgb24gdGhlIGR5aW5nIGNwdSwgaW50ZXJydXB0cwotCQkJCQkqIGFyZSBhbHJlYWR5IGRpc2FibGVkLiBNdXN0IG5vdAotCQkJCQkqIHNsZWVwLCBtdXN0IG5vdCBmYWlsICovCi0jZGVmaW5lIENQVV9QT1NUX0RFQUQJCTB4MDAwOSAvKiBDUFUgKHVuc2lnbmVkKXYgZGVhZCwgY3B1X2hvdHBsdWcKLQkJCQkJKiBsb2NrIGlzIGRyb3BwZWQgKi8KLSNkZWZpbmUgQ1BVX1NUQVJUSU5HCQkweDAwMEEgLyogQ1BVICh1bnNpZ25lZCl2IHNvb24gcnVubmluZy4KLQkJCQkJKiBDYWxsZWQgb24gdGhlIG5ldyBjcHUsIGp1c3QgYmVmb3JlCi0JCQkJCSogZW5hYmxpbmcgaW50ZXJydXB0cy4gTXVzdCBub3Qgc2xlZXAsCi0JCQkJCSogbXVzdCBub3QgZmFpbCAqLwotCi0vKiBVc2VkIGZvciBDUFUgaG90cGx1ZyBldmVudHMgb2NjdXJyaW5nIHdoaWxlIHRhc2tzIGFyZSBmcm96ZW4gZHVlIHRvIGEgc3VzcGVuZAotICogb3BlcmF0aW9uIGluIHByb2dyZXNzCi0gKi8KLSNkZWZpbmUgQ1BVX1RBU0tTX0ZST1pFTgkweDAwMTAKLQotI2RlZmluZSBDUFVfT05MSU5FX0ZST1pFTgkoQ1BVX09OTElORSB8IENQVV9UQVNLU19GUk9aRU4pCi0jZGVmaW5lIENQVV9VUF9QUkVQQVJFX0ZST1pFTgkoQ1BVX1VQX1BSRVBBUkUgfCBDUFVfVEFTS1NfRlJPWkVOKQotI2RlZmluZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOCShDUFVfVVBfQ0FOQ0VMRUQgfCBDUFVfVEFTS1NfRlJPWkVOKQotI2RlZmluZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTgkoQ1BVX0RPV05fUFJFUEFSRSB8IENQVV9UQVNLU19GUk9aRU4pCi0jZGVmaW5lIENQVV9ET1dOX0ZBSUxFRF9GUk9aRU4JKENQVV9ET1dOX0ZBSUxFRCB8IENQVV9UQVNLU19GUk9aRU4pCi0jZGVmaW5lIENQVV9ERUFEX0ZST1pFTgkJKENQVV9ERUFEIHwgQ1BVX1RBU0tTX0ZST1pFTikKLSNkZWZpbmUgQ1BVX0RZSU5HX0ZST1pFTgkoQ1BVX0RZSU5HIHwgQ1BVX1RBU0tTX0ZST1pFTikKLSNkZWZpbmUgQ1BVX1NUQVJUSU5HX0ZST1pFTgkoQ1BVX1NUQVJUSU5HIHwgQ1BVX1RBU0tTX0ZST1pFTikKLQotLyogSGliZXJuYXRpb24gYW5kIHN1c3BlbmQgZXZlbnRzICovCi0jZGVmaW5lIFBNX0hJQkVSTkFUSU9OX1BSRVBBUkUJMHgwMDAxIC8qIEdvaW5nIHRvIGhpYmVybmF0ZSAqLwotI2RlZmluZSBQTV9QT1NUX0hJQkVSTkFUSU9OCTB4MDAwMiAvKiBIaWJlcm5hdGlvbiBmaW5pc2hlZCAqLwotI2RlZmluZSBQTV9TVVNQRU5EX1BSRVBBUkUJMHgwMDAzIC8qIEdvaW5nIHRvIHN1c3BlbmQgdGhlIHN5c3RlbSAqLwotI2RlZmluZSBQTV9QT1NUX1NVU1BFTkQJCTB4MDAwNCAvKiBTdXNwZW5kIGZpbmlzaGVkICovCi0jZGVmaW5lIFBNX1JFU1RPUkVfUFJFUEFSRQkweDAwMDUgLyogR29pbmcgdG8gcmVzdG9yZSBhIHNhdmVkIGltYWdlICovCi0jZGVmaW5lIFBNX1BPU1RfUkVTVE9SRQkJMHgwMDA2IC8qIFJlc3RvcmUgZmFpbGVkICovCi0KIC8qIENvbnNvbGUga2V5Ym9hcmQgZXZlbnRzLgogICogTm90ZTogS0JEX0tFWUNPREUgaXMgYWx3YXlzIHNlbnQgYmVmb3JlIEtCRF9VTkJPVU5EX0tFWUNPREUsIEtCRF9VTklDT0RFIGFuZAogICogS0JEX0tFWVNZTS4gKi8KQEAgLTI3MSwxMiArMjA4LDUgQEAKIAogZXh0ZXJuIHN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkIHJlYm9vdF9ub3RpZmllcl9saXN0OwogCi0vKiBWaXJ0dWFsIFRlcm1pbmFsIGV2ZW50cy4gKi8KLSNkZWZpbmUgVlRfQUxMT0NBVEUJCTB4MDAwMSAvKiBDb25zb2xlIGdvdCBhbGxvY2F0ZWQgKi8KLSNkZWZpbmUgVlRfREVBTExPQ0FURQkJMHgwMDAyIC8qIENvbnNvbGUgd2lsbCBiZSBkZWFsbG9jYXRlZCAqLwotI2RlZmluZSBWVF9XUklURQkJMHgwMDAzIC8qIEEgY2hhciBnb3Qgb3V0cHV0ICovCi0jZGVmaW5lIFZUX1VQREFURQkJMHgwMDA0IC8qIEEgYmlnZ2VyIHVwZGF0ZSBvY2N1cnJlZCAqLwotI2RlZmluZSBWVF9QUkVXUklURQkJMHgwMDA1IC8qIEEgY2hhciBpcyBhYm91dCB0byBiZSB3cml0dGVuIHRvIHRoZSBjb25zb2xlICovCi0KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0xJTlVYX05PVElGSUVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbnNwcm94eS5oIGIvaW5jbHVkZS9saW51eC9uc3Byb3h5LmgKaW5kZXggNTBkMjBhYi4uY2MzN2E1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uc3Byb3h5LmgKKysrIGIvaW5jbHVkZS9saW51eC9uc3Byb3h5LmgKQEAgLTY4LDYgKzY4LDcgQEAKIHZvaWQgZnJlZV9uc3Byb3h5KHN0cnVjdCBuc3Byb3h5ICpucyk7CiBpbnQgdW5zaGFyZV9uc3Byb3h5X25hbWVzcGFjZXModW5zaWduZWQgbG9uZywgc3RydWN0IG5zcHJveHkgKiosCiAJc3RydWN0IGZzX3N0cnVjdCAqKTsKK2ludCBfX2luaXQgbnNwcm94eV9jYWNoZV9pbml0KHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X25zcHJveHkoc3RydWN0IG5zcHJveHkgKm5zKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZi5oIGIvaW5jbHVkZS9saW51eC9vZi5oCmluZGV4IGJmYzBlZDEuLmJkNzE2ZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2YuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mLmgKQEAgLTE5NSw2ICsxOTUsMTMgQEAKIGV4dGVybiBzdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCSBpbnQgKmxlbnApOworZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgICAgIGNoYXIgKnByb3BuYW1lLAorCQkJCSAgICAgIHUzMiAqb3V0X3ZhbHVlcywKKwkJCQkgICAgICBzaXplX3Qgc3opOworCitleHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNoYXIgKnByb3BuYW1lLAorCQkJCQljb25zdCBjaGFyICoqb3V0X3N0cmluZyk7CiBleHRlcm4gaW50IG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLAogCQkJCSAgIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gaW50IG9mX2RldmljZV9pc19hdmFpbGFibGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UpOwpAQCAtMjI3LDEyICsyMzQsMzIgQEAKIGV4dGVybiB2b2lkIG9mX2RldGFjaF9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKICNlbmRpZgogCi0jZWxzZQorI2Vsc2UgLyogQ09ORklHX09GICovCiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBvZl9oYXZlX3BvcHVsYXRlZF9kdCh2b2lkKQogewogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQljaGFyICpwcm9wbmFtZSwgdTMyICpvdXRfdmFsdWVzLCBzaXplX3Qgc3opCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY2hhciAqcHJvcG5hbWUsIGNvbnN0IGNoYXIgKipvdXRfc3RyaW5nKQoreworCXJldHVybiAtRU5PU1lTOworfQorCiAjZW5kaWYgLyogQ09ORklHX09GICovCisKK3N0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICAgICAgIGNoYXIgKnByb3BuYW1lLAorCQkJCSAgICAgICB1MzIgKm91dF92YWx1ZSkKK3sKKwlyZXR1cm4gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkobnAsIHByb3BuYW1lLCBvdXRfdmFsdWUsIDEpOworfQorCiAjZW5kaWYgLyogX0xJTlVYX09GX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfYWRkcmVzcy5oIGIvaW5jbHVkZS9saW51eC9vZl9hZGRyZXNzLmgKaW5kZXggMmZlZGE2ZWUuLjMxMTg2MjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2ZfYWRkcmVzcy5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfYWRkcmVzcy5oCkBAIC0xLDExICsxLDE2IEBACiAjaWZuZGVmIF9fT0ZfQUREUkVTU19ICiAjZGVmaW5lIF9fT0ZfQUREUkVTU19ICiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiBleHRlcm4gdTY0IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IF9fYmUzMiAqYWRkcik7CiBleHRlcm4gaW50IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwKIAkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcik7CitleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX21hdGNoaW5nX25vZGVfYnlfYWRkcmVzcygKKwkJCQkJc3RydWN0IGRldmljZV9ub2RlICpmcm9tLAorCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLAorCQkJCQl1NjQgYmFzZV9hZGRyZXNzKTsKIGV4dGVybiB2b2lkIF9faW9tZW0gKm9mX2lvbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLCBpbnQgaW5kZXgpOwogCiAvKiBFeHRyYWN0IGFuIGFkZHJlc3MgZnJvbSBhIGRldmljZSwgcmV0dXJucyB0aGUgcmVnaW9uIHNpemUgYW5kCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2dwaW8uaCBiL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oCmluZGV4IDY1OThjMDQuLmFlYzgwMjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oCkBAIC00Niw4ICs0Niw5IEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihnYywgc3RydWN0IG9mX21tX2dwaW9fY2hpcCwgZ2MpOwogfQogCi1leHRlcm4gaW50IG9mX2dldF9ncGlvX2ZsYWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpbmRleCwKLQkJCSAgICAgZW51bSBvZl9ncGlvX2ZsYWdzICpmbGFncyk7CitleHRlcm4gaW50IG9mX2dldF9uYW1lZF9ncGlvX2ZsYWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCWNvbnN0IGNoYXIgKmxpc3RfbmFtZSwgaW50IGluZGV4LCBlbnVtIG9mX2dwaW9fZmxhZ3MgKmZsYWdzKTsKKwogZXh0ZXJuIHVuc2lnbmVkIGludCBvZl9ncGlvX2NvdW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwogCiBleHRlcm4gaW50IG9mX21tX2dwaW9jaGlwX2FkZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLApAQCAtNjAsOCArNjEsOCBAQAogI2Vsc2UgLyogQ09ORklHX09GX0dQSU8gKi8KIAogLyogRHJpdmVycyBtYXkgbm90IHN0cmljdGx5IGRlcGVuZCBvbiB0aGUgR1BJTyBzdXBwb3J0LCBzbyBsZXQgdGhlbSBsaW5rLiAqLwotc3RhdGljIGlubGluZSBpbnQgb2ZfZ2V0X2dwaW9fZmxhZ3Moc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGluZGV4LAotCQkJCSAgICBlbnVtIG9mX2dwaW9fZmxhZ3MgKmZsYWdzKQorc3RhdGljIGlubGluZSBpbnQgb2ZfZ2V0X25hbWVkX2dwaW9fZmxhZ3Moc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJY29uc3QgY2hhciAqbGlzdF9uYW1lLCBpbnQgaW5kZXgsIGVudW0gb2ZfZ3Bpb19mbGFncyAqZmxhZ3MpCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CkBAIC03Nyw3ICs3OCwzOCBAQAogI2VuZGlmIC8qIENPTkZJR19PRl9HUElPICovCiAKIC8qKgotICogb2ZfZ2V0X2dwaW8gLSBHZXQgYSBHUElPIG51bWJlciB0byB1c2Ugd2l0aCBHUElPIEFQSQorICogb2ZfZ2V0X2dwaW9fZmxhZ3MoKSAtIEdldCBhIEdQSU8gbnVtYmVyIGFuZCBmbGFncyB0byB1c2Ugd2l0aCBHUElPIEFQSQorICogQG5wOgkJZGV2aWNlIG5vZGUgdG8gZ2V0IEdQSU8gZnJvbQorICogQGluZGV4OglpbmRleCBvZiB0aGUgR1BJTworICogQGZsYWdzOglhIGZsYWdzIHBvaW50ZXIgdG8gZmlsbCBpbgorICoKKyAqIFJldHVybnMgR1BJTyBudW1iZXIgdG8gdXNlIHdpdGggTGludXggZ2VuZXJpYyBHUElPIEFQSSwgb3Igb25lIG9mIHRoZSBlcnJubworICogdmFsdWUgb24gdGhlIGVycm9yIGNvbmRpdGlvbi4gSWYgQGZsYWdzIGlzIG5vdCBOVUxMIHRoZSBmdW5jdGlvbiBhbHNvIGZpbGxzCisgKiBpbiBmbGFncyBmb3IgdGhlIEdQSU8uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9mX2dldF9ncGlvX2ZsYWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpbmRleCwKKwkJICAgICAgZW51bSBvZl9ncGlvX2ZsYWdzICpmbGFncykKK3sKKwlyZXR1cm4gb2ZfZ2V0X25hbWVkX2dwaW9fZmxhZ3MobnAsICJncGlvcyIsIGluZGV4LCBmbGFncyk7Cit9CisKKy8qKgorICogb2ZfZ2V0X25hbWVkX2dwaW8oKSAtIEdldCBhIEdQSU8gbnVtYmVyIHRvIHVzZSB3aXRoIEdQSU8gQVBJCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSB0byBnZXQgR1BJTyBmcm9tCisgKiBAcHJvcG5hbWU6CU5hbWUgb2YgcHJvcGVydHkgY29udGFpbmluZyBncGlvIHNwZWNpZmllcihzKQorICogQGluZGV4OglpbmRleCBvZiB0aGUgR1BJTworICoKKyAqIFJldHVybnMgR1BJTyBudW1iZXIgdG8gdXNlIHdpdGggTGludXggZ2VuZXJpYyBHUElPIEFQSSwgb3Igb25lIG9mIHRoZSBlcnJubworICogdmFsdWUgb24gdGhlIGVycm9yIGNvbmRpdGlvbi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2ZfZ2V0X25hbWVkX2dwaW8oc3RydWN0IGRldmljZV9ub2RlICpucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsIGludCBpbmRleCkKK3sKKwlyZXR1cm4gb2ZfZ2V0X25hbWVkX2dwaW9fZmxhZ3MobnAsIHByb3BuYW1lLCBpbmRleCwgTlVMTCk7Cit9CisKKy8qKgorICogb2ZfZ2V0X2dwaW8oKSAtIEdldCBhIEdQSU8gbnVtYmVyIHRvIHVzZSB3aXRoIEdQSU8gQVBJCiAgKiBAbnA6CQlkZXZpY2Ugbm9kZSB0byBnZXQgR1BJTyBmcm9tCiAgKiBAaW5kZXg6CWluZGV4IG9mIHRoZSBHUElPCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9wY2kuaCBiL2luY2x1ZGUvbGludXgvb2ZfcGNpLmgKaW5kZXggODVhMjdiNi4uZjkzZTIxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX3BjaS5oCkBAIC02LDQgKzYsOSBAQAogc3RydWN0IHBjaV9kZXY7CiBzdHJ1Y3Qgb2ZfaXJxOwogaW50IG9mX2lycV9tYXBfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgb2ZfaXJxICpvdXRfaXJxKTsKKworc3RydWN0IGRldmljZV9ub2RlOworc3RydWN0IGRldmljZV9ub2RlICpvZl9wY2lfZmluZF9jaGlsZF9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRldmZuKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX3BsYXRmb3JtLmggYi9pbmNsdWRlL2xpbnV4L29mX3BsYXRmb3JtLmgKaW5kZXggZmI1MWFlMy4uNWE2ZjQ1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9wbGF0Zm9ybS5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfcGxhdGZvcm0uaApAQCAtMjAsNiArMjAsNDAgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogLyoqCisgKiBzdHJ1Y3Qgb2ZfZGV2X2F1eGRhdGEgLSBsb29rdXAgdGFibGUgZW50cnkgZm9yIGRldmljZSBuYW1lcyAmIHBsYXRmb3JtX2RhdGEKKyAqIEBjb21wYXRpYmxlOiBjb21wYXRpYmxlIHZhbHVlIG9mIG5vZGUgdG8gbWF0Y2ggYWdhaW5zdCBub2RlCisgKiBAcGh5c19hZGRyOiBTdGFydCBhZGRyZXNzIG9mIHJlZ2lzdGVycyB0byBtYXRjaCBhZ2FpbnN0IG5vZGUKKyAqIEBuYW1lOiBOYW1lIHRvIGFzc2lnbiBmb3IgbWF0Y2hpbmcgbm9kZXMKKyAqIEBwbGF0Zm9ybV9kYXRhOiBwbGF0Zm9ybV9kYXRhIHRvIGFzc2lnbiBmb3IgbWF0Y2hpbmcgbm9kZXMKKyAqCisgKiBUaGlzIGxvb2t1cCB0YWJsZSBhbGxvd3MgdGhlIGNhbGxlciBvZiBvZl9wbGF0Zm9ybV9wb3B1bGF0ZSgpIHRvIG92ZXJyaWRlCisgKiB0aGUgbmFtZXMgb2YgZGV2aWNlcyB3aGVuIGNyZWF0aW5nIGRldmljZXMgZnJvbSB0aGUgZGV2aWNlIHRyZWUuICBUaGUgdGFibGUKKyAqIHNob3VsZCBiZSB0ZXJtaW5hdGVkIHdpdGggYW4gZW1wdHkgZW50cnkuICBJdCBhbHNvIGFsbG93cyB0aGUgcGxhdGZvcm1fZGF0YQorICogcG9pbnRlciB0byBiZSBzZXQuCisgKgorICogVGhlIHJlYXNvbiBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIHRoYXQgc29tZSBMaW51eCBpbmZyYXN0cnVjdHVyZSB1c2VzCisgKiB0aGUgZGV2aWNlIG5hbWUgdG8gbG9vayB1cCBhIHNwZWNpZmljIGRldmljZSwgYnV0IHRoZSBMaW51eC1zcGVjaWZpYyBuYW1lcworICogYXJlIG5vdCBlbmNvZGVkIGludG8gdGhlIGRldmljZSB0cmVlLCBzbyB0aGUga2VybmVsIG5lZWRzIHRvIHByb3ZpZGUgc3BlY2lmaWMKKyAqIHZhbHVlcy4KKyAqCisgKiBOb3RlOiBVc2luZyBhbiBhdXhkYXRhIGxvb2t1cCB0YWJsZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGxhc3QgcmVzb3J0IHdoZW4KKyAqIGNvbnZlcnRpbmcgYSBwbGF0Zm9ybSB0byB1c2UgdGhlIERULiAgTm9ybWFsbHkgdGhlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgKiBkZXZpY2UgbmFtZSB3aWxsIG5vdCBtYXR0ZXIsIGFuZCBkcml2ZXJzIHNob3VsZCBvYnRhaW4gZGF0YSBmcm9tIHRoZSBkZXZpY2UKKyAqIG5vZGUgaW5zdGVhZCBvZiBmcm9tIGFuIGFub255bW91bnMgcGxhdGZvcm1fZGF0YSBwb2ludGVyLgorICovCitzdHJ1Y3Qgb2ZfZGV2X2F1eGRhdGEgeworCWNoYXIgKmNvbXBhdGlibGU7CisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNfYWRkcjsKKwljaGFyICpuYW1lOworCXZvaWQgKnBsYXRmb3JtX2RhdGE7Cit9OworCisvKiBNYWNybyB0byBzaW1wbGlmeSBwb3B1bGF0aW5nIGEgbG9va3VwIHRhYmxlICovCisjZGVmaW5lIE9GX0RFVl9BVVhEQVRBKF9jb21wYXQsX3BoeXMsX25hbWUsX3BkYXRhKSBcCisJeyAuY29tcGF0aWJsZSA9IF9jb21wYXQsIC5waHlzX2FkZHIgPSBfcGh5cywgLm5hbWUgPSBfbmFtZSwgXAorCSAgLnBsYXRmb3JtX2RhdGEgPSBfcGRhdGEgfQorCisvKioKICAqIG9mX3BsYXRmb3JtX2RyaXZlciAtIExlZ2FjeSBvZi1hd2FyZSBkcml2ZXIgZm9yIHBsYXRmb3JtIGRldmljZXMuCiAgKgogICogQW4gb2ZfcGxhdGZvcm1fZHJpdmVyIGRyaXZlciBpcyBhdHRhY2hlZCB0byBhIGJhc2ljIHBsYXRmb3JtX2RldmljZSBvbgpAQCAtNDAsNiArNzQsOCBAQAogI2RlZmluZQl0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZHJ2KSBcCiAJY29udGFpbmVyX29mKGRydixzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyLCBkcml2ZXIpCiAKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2RlZmF1bHRfYnVzX21hdGNoX3RhYmxlW107CisKIC8qIFBsYXRmb3JtIGRyaXZlcnMgcmVnaXN0ZXIvdW5yZWdpc3RlciAqLwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mX2RldmljZV9hbGxvYyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCQkgY29uc3QgY2hhciAqYnVzX2lkLApAQCAtNTUsNiArOTEsMTAgQEAKIGV4dGVybiBpbnQgb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCwKIAkJCQkgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywKIAkJCQkgc3RydWN0IGRldmljZSAqcGFyZW50KTsKK2V4dGVybiBpbnQgb2ZfcGxhdGZvcm1fcG9wdWxhdGUoc3RydWN0IGRldmljZV9ub2RlICpyb290LAorCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCisJCQkJY29uc3Qgc3RydWN0IG9mX2Rldl9hdXhkYXRhICpsb29rdXAsCisJCQkJc3RydWN0IGRldmljZSAqcGFyZW50KTsKICNlbmRpZiAvKiAhQ09ORklHX1NQQVJDICovCiAKICNlbmRpZiAvKiBDT05GSUdfT0ZfREVWSUNFICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29vbS5oIGIvaW5jbHVkZS9saW51eC9vb20uaAppbmRleCA0OTUyZmI4Li4xM2I3YjAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29vbS5oCisrKyBiL2luY2x1ZGUvbGludXgvb29tLmgKQEAgLTY0LDEwICs2NCw2IEBACiAJb29tX2tpbGxlcl9kaXNhYmxlZCA9IGZhbHNlOwogfQogCi0vKiBUaGUgYmFkbmVzcyBmcm9tIHRoZSBPT00ga2lsbGVyICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBiYWRuZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKLQkJICAgICAgY29uc3Qgbm9kZW1hc2tfdCAqbm9kZW1hc2ssIHVuc2lnbmVkIGxvbmcgdXB0aW1lKTsKLQogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqZmluZF9sb2NrX3Rhc2tfbW0oc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIAogLyogc3lzY3RscyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vcHAuaCBiL2luY2x1ZGUvbGludXgvb3BwLmgKaW5kZXggNTQ0OTk0NS4uNzAyMGU5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vcHAuaAorKysgYi9pbmNsdWRlL2xpbnV4L29wcC5oCkBAIC05NCwxMiArOTQsMjAgQEAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfRlJFUSkgJiYgZGVmaW5lZChDT05GSUdfUE1fT1BQKQogaW50IG9wcF9pbml0X2NwdWZyZXFfdGFibGUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqKnRhYmxlKTsKK3ZvaWQgb3BwX2ZyZWVfY3B1ZnJlcV90YWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICoqdGFibGUpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IG9wcF9pbml0X2NwdWZyZXFfdGFibGUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqKnRhYmxlKQogewogCXJldHVybiAtRUlOVkFMOwogfQorCitzdGF0aWMgaW5saW5lCit2b2lkIG9wcF9mcmVlX2NwdWZyZXFfdGFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqKnRhYmxlKQoreworfQogI2VuZGlmCQkvKiBDT05GSUdfQ1BVX0ZSRVEgKi8KIAogI2VuZGlmCQkvKiBfX0xJTlVYX09QUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oIGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKaW5kZXggNjA4MTQ5My4uM2U1YTFiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKQEAgLTEzNSw3ICsxMzUsNyBAQAogICogTWFjcm9zIHRvIGNyZWF0ZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgcGFnZSBmbGFncwogICovCiAjZGVmaW5lIFRFU1RQQUdFRkxBRyh1bmFtZSwgbG5hbWUpCQkJCQlcCi1zdGF0aWMgaW5saW5lIGludCBQYWdlIyN1bmFtZShzdHJ1Y3QgcGFnZSAqcGFnZSkgCQkJXAorc3RhdGljIGlubGluZSBpbnQgUGFnZSMjdW5hbWUoY29uc3Qgc3RydWN0IHBhZ2UgKnBhZ2UpCQkJXAogCQkJeyByZXR1cm4gdGVzdF9iaXQoUEdfIyNsbmFtZSwgJnBhZ2UtPmZsYWdzKTsgfQogCiAjZGVmaW5lIFNFVFBBR0VGTEFHKHVuYW1lLCBsbmFtZSkJCQkJCVwKQEAgLTE3Myw3ICsxNzMsNyBAQAogCV9fU0VUUEFHRUZMQUcodW5hbWUsIGxuYW1lKSAgX19DTEVBUlBBR0VGTEFHKHVuYW1lLCBsbmFtZSkKIAogI2RlZmluZSBQQUdFRkxBR19GQUxTRSh1bmFtZSkgCQkJCQkJXAotc3RhdGljIGlubGluZSBpbnQgUGFnZSMjdW5hbWUoc3RydWN0IHBhZ2UgKnBhZ2UpIAkJCVwKK3N0YXRpYyBpbmxpbmUgaW50IFBhZ2UjI3VuYW1lKGNvbnN0IHN0cnVjdCBwYWdlICpwYWdlKQkJCVwKIAkJCXsgcmV0dXJuIDA7IH0KIAogI2RlZmluZSBURVNUU0NGTEFHKHVuYW1lLCBsbmFtZSkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oIGIvaW5jbHVkZS9saW51eC9wYWdlbWFwLmgKaW5kZXggNzE2ODc1ZS4uY2ZhYWE2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYWdlbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9wYWdlbWFwLmgKQEAgLTEzNCw3ICsxMzQsNyBAQAogCVZNX0JVR19PTihpbl9pbnRlcnJ1cHQoKSk7CiAKICNpZiAhZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19UUkVFX1JDVSkKLSMgaWZkZWYgQ09ORklHX1BSRUVNUFQKKyMgaWZkZWYgQ09ORklHX1BSRUVNUFRfQ09VTlQKIAlWTV9CVUdfT04oIWluX2F0b21pYygpKTsKICMgZW5kaWYKIAkvKgpAQCAtMTcyLDcgKzE3Miw3IEBACiAJVk1fQlVHX09OKGluX2ludGVycnVwdCgpKTsKIAogI2lmICFkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoQ09ORklHX1RSRUVfUkNVKQotIyBpZmRlZiBDT05GSUdfUFJFRU1QVAorIyBpZmRlZiBDT05GSUdfUFJFRU1QVF9DT1VOVAogCVZNX0JVR19PTighaW5fYXRvbWljKCkpOwogIyBlbmRpZgogCVZNX0JVR19PTihwYWdlX2NvdW50KHBhZ2UpID09IDApOwpAQCAtMjU1LDI2ICsyNTUsMjQgQEAKIGV4dGVybiBzdHJ1Y3QgcGFnZSAqIGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJcGdvZmZfdCBpbmRleCk7CiBleHRlcm4gc3RydWN0IHBhZ2UgKiByZWFkX2NhY2hlX3BhZ2VfYXN5bmMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQkJcGdvZmZfdCBpbmRleCwgZmlsbGVyX3QgKmZpbGxlciwKLQkJCQl2b2lkICpkYXRhKTsKKwkJCQlwZ29mZl90IGluZGV4LCBmaWxsZXJfdCAqZmlsbGVyLCB2b2lkICpkYXRhKTsKIGV4dGVybiBzdHJ1Y3QgcGFnZSAqIHJlYWRfY2FjaGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCQlwZ29mZl90IGluZGV4LCBmaWxsZXJfdCAqZmlsbGVyLAotCQkJCXZvaWQgKmRhdGEpOworCQkJCXBnb2ZmX3QgaW5kZXgsIGZpbGxlcl90ICpmaWxsZXIsIHZvaWQgKmRhdGEpOwogZXh0ZXJuIHN0cnVjdCBwYWdlICogcmVhZF9jYWNoZV9wYWdlX2dmcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQlwZ29mZl90IGluZGV4LCBnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gaW50IHJlYWRfY2FjaGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCBmaWxsZXJfdCAqZmlsbGVyLCB2b2lkICpkYXRhKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcmVhZF9tYXBwaW5nX3BhZ2VfYXN5bmMoCi0JCQkJCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCQkJCSAgICAgcGdvZmZfdCBpbmRleCwgdm9pZCAqZGF0YSkKKwkJCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQlwZ29mZl90IGluZGV4LCB2b2lkICpkYXRhKQogewogCWZpbGxlcl90ICpmaWxsZXIgPSAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2U7CiAJcmV0dXJuIHJlYWRfY2FjaGVfcGFnZV9hc3luYyhtYXBwaW5nLCBpbmRleCwgZmlsbGVyLCBkYXRhKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcmVhZF9tYXBwaW5nX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQkJCSAgICAgcGdvZmZfdCBpbmRleCwgdm9pZCAqZGF0YSkKKwkJCQlwZ29mZl90IGluZGV4LCB2b2lkICpkYXRhKQogewogCWZpbGxlcl90ICpmaWxsZXIgPSAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2U7CiAJcmV0dXJuIHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCwgZmlsbGVyLCBkYXRhKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IGM0NDZiNWMuLjRlNDIwM2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtMTU4OSw1ICsxNTg5LDQ0IEBACiBpbnQgcGNpX3ZwZF9maW5kX2luZm9fa2V5d29yZChjb25zdCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgb2ZmLAogCQkJICAgICAgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqa3cpOwogCisvKiBQQ0kgPC0+IE9GIGJpbmRpbmcgaGVscGVycyAqLworI2lmZGVmIENPTkZJR19PRgorc3RydWN0IGRldmljZV9ub2RlOworZXh0ZXJuIHZvaWQgcGNpX3NldF9vZl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgcGNpX3JlbGVhc2Vfb2Zfbm9kZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIHBjaV9zZXRfYnVzX29mX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cyk7CitleHRlcm4gdm9pZCBwY2lfcmVsZWFzZV9idXNfb2Zfbm9kZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKKworLyogQXJjaCBtYXkgb3ZlcnJpZGUgdGhpcyAod2VhaykgKi8KK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBfX3dlYWsgcGNpYmlvc19nZXRfcGhiX29mX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cyk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZV9ub2RlICpwY2lfZGV2aWNlX3RvX09GX25vZGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcmV0dXJuIHBkZXYgPyBwZGV2LT5kZXYub2Zfbm9kZSA6IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZV9ub2RlICpwY2lfYnVzX3RvX09GX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlyZXR1cm4gYnVzID8gYnVzLT5kZXYub2Zfbm9kZSA6IE5VTEw7Cit9CisKKyNlbHNlIC8qIENPTkZJR19PRiAqLworc3RhdGljIGlubGluZSB2b2lkIHBjaV9zZXRfb2Zfbm9kZShzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfcmVsZWFzZV9vZl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9zZXRfYnVzX29mX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cykgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3JlbGVhc2VfYnVzX29mX25vZGUoc3RydWN0IHBjaV9idXMgKmJ1cykgeyB9CisjZW5kaWYgIC8qIENPTkZJR19PRiAqLworCisvKioKKyAqIHBjaV9maW5kX3Vwc3RyZWFtX3BjaWVfYnJpZGdlIC0gZmluZCB1cHN0cmVhbSBQQ0llLXRvLVBDSSBicmlkZ2Ugb2YgYSBkZXZpY2UKKyAqIEBwZGV2OiB0aGUgUENJIGRldmljZQorICoKKyAqIGlmIHRoZSBkZXZpY2UgaXMgUENJRSwgcmV0dXJuIE5VTEwKKyAqIGlmIHRoZSBkZXZpY2UgaXNuJ3QgY29ubmVjdGVkIHRvIGEgUENJZSBicmlkZ2UgKHRoYXQgaXMgaXRzIHBhcmVudCBpcyBhCisgKiBsZWdhY3kgUENJIGJyaWRnZSBhbmQgdGhlIGJyaWRnZSBpcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8gYnVzIDApLCByZXR1cm4gaXRzCisgKiBwYXJlbnQKKyAqLworc3RydWN0IHBjaV9kZXYgKnBjaV9maW5kX3Vwc3RyZWFtX3BjaWVfYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBMSU5VWF9QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCAwMzRlYmI0Li5iMDBjNGVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtMTMwOCw2ICsxMzA4LDcgQEAKICNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DUkVBVElWRV9TQjA4ODAxCTB4MDA0MQogI2RlZmluZSBQQ0lfU1VCREVWSUNFX0lEX0NSRUFUSVZFX1NCMDg4MDIJMHgwMDQyCiAjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ1JFQVRJVkVfU0IwODgwMwkweDAwNDMKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9DUkVBVElWRV9TQjEyNzAJMHgwMDYyCiAjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfQ1JFQVRJVkVfSEVORFJJWAkweDYwMDAKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VDVElWQQkJMHgxMTAyIC8qIGR1cGxpY2F0ZTogQ1JFQVRJVkUgKi8KQEAgLTE1MzcsNiArMTUzOCw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUkw1QzQ3NgkweDA0NzYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9STDVDNDc4CTB4MDQ3OAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1QzgyMgkweDA4MjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9SNUNFODIzCTB4ZTgyMwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1QzgzMgkweDA4MzIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9SNUM4NDMJMHgwODQzCiAKQEAgLTIxMDIsNiArMjEwNCw5IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NjFFCTB4MTY4MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzYxCTB4MTY4MQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzY0CTB4MTY4NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05YMl81NzgwMAkJMHgxNjhhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyXzU3ODQwCQkweDE2OGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OWDJfNTc4MTAJCTB4MTY4ZQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181Nzg3TQkweDE2OTMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4MgkweDE2OTYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4NAkweDE2OTgKQEAgLTIxMDksMTEgKzIxMTQsMTcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4NwkweDE2OWIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4OAkweDE2OWMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4OQkweDE2OWQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OWDJfNTc4MDBfTUYJMHgxNmE1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDJYCTB4MTZhNgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAzWAkweDE2YTcKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwNFMJMHgxNmE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyXzU3ODAwX1ZGCTB4MTZhOQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05YMl81NzA2UwkJMHgxNmFhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyXzU3ODQwX01GCTB4MTZhYgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05YMl81NzA4UwkJMHgxNmFjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyXzU3ODQwX1ZGCTB4MTZhZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05YMl81NzgxMF9NRgkweDE2YWUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OWDJfNTc4MTBfVkYJMHgxNmFmCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDJBMwkweDE2YzYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwM0EzCTB4MTZjNwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzgxCTB4MTZkZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJjcHUuaCBiL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKaW5kZXggOGI5NzMwOC4uOWNhMDA4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJjcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCkBAIC0yNTksNiArMjU5LDkgQEAKICAqIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNtcHhjaGdfZG91YmxlLiAgY21weGNoZ19kb3VibGUgaXMgcGFzc2VkIHR3bwogICogcGVyY3B1IHZhcmlhYmxlcy4gIFRoZSBmaXJzdCBoYXMgdG8gYmUgYWxpZ25lZCB0byBhIGRvdWJsZSB3b3JkCiAgKiBib3VuZGFyeSBhbmQgdGhlIHNlY29uZCBoYXMgdG8gZm9sbG93IGRpcmVjdGx5IHRoZXJlYWZ0ZXIuCisgKiBXZSBlbmZvcmNlIHRoaXMgb24gYWxsIGFyY2hpdGVjdHVyZXMgZXZlbiBpZiB0aGV5IGRvbid0IHN1cHBvcnQKKyAqIGEgZG91YmxlIGNtcHhjaGcgaW5zdHJ1Y3Rpb24sIHNpbmNlIGl0J3MgYSBjaGVhcCByZXF1aXJlbWVudCwgYW5kIGl0CisgKiBhdm9pZHMgYnJlYWtpbmcgdGhlIHJlcXVpcmVtZW50IGZvciBhcmNoaXRlY3R1cmVzIHdpdGggdGhlIGluc3RydWN0aW9uLgogICovCiAjZGVmaW5lIF9fcGNwdV9kb3VibGVfY2FsbF9yZXR1cm5fYm9vbChzdGVtLCBwY3AxLCBwY3AyLCAuLi4pCQlcCiAoewkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oIGIvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKaW5kZXggMzQxMjY4NC4uM2YyNzExYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKQEAgLTYxLDcgKzYxLDcgQEAKIC8qCiAgKiBHZW5lcmFsaXplZCBoYXJkd2FyZSBjYWNoZSBldmVudHM6CiAgKgotICogICAgICAgeyBMMS1ELCBMMS1JLCBMTEMsIElUTEIsIERUTEIsIEJQVSB9IHgKKyAqICAgICAgIHsgTDEtRCwgTDEtSSwgTExDLCBJVExCLCBEVExCLCBCUFUsIE5PREUgfSB4CiAgKiAgICAgICB7IHJlYWQsIHdyaXRlLCBwcmVmZXRjaCB9IHgKICAqICAgICAgIHsgYWNjZXNzZXMsIG1pc3NlcyB9CiAgKi8KQEAgLTcyLDYgKzcyLDcgQEAKIAlQRVJGX0NPVU5UX0hXX0NBQ0hFX0RUTEIJCT0gMywKIAlQRVJGX0NPVU5UX0hXX0NBQ0hFX0lUTEIJCT0gNCwKIAlQRVJGX0NPVU5UX0hXX0NBQ0hFX0JQVQkJCT0gNSwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX05PREUJCT0gNiwKIAogCVBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYLAkJLyogbm9uLUFCSSAqLwogfTsKQEAgLTEzNywxNCArMTM4LDE0IEBACiAgKgogICogc3RydWN0IHJlYWRfZm9ybWF0IHsKICAqCXsgdTY0CQl2YWx1ZTsKLSAqCSAgeyB1NjQJCXRpbWVfZW5hYmxlZDsgfSAmJiBQRVJGX0ZPUk1BVF9FTkFCTEVECi0gKgkgIHsgdTY0CQl0aW1lX3J1bm5pbmc7IH0gJiYgUEVSRl9GT1JNQVRfUlVOTklORworICoJICB7IHU2NAkJdGltZV9lbmFibGVkOyB9ICYmIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRAorICoJICB7IHU2NAkJdGltZV9ydW5uaW5nOyB9ICYmIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfUlVOTklORwogICoJICB7IHU2NAkJaWQ7ICAgICAgICAgICB9ICYmIFBFUkZfRk9STUFUX0lECiAgKgl9ICYmICFQRVJGX0ZPUk1BVF9HUk9VUAogICoKICAqCXsgdTY0CQlucjsKLSAqCSAgeyB1NjQJCXRpbWVfZW5hYmxlZDsgfSAmJiBQRVJGX0ZPUk1BVF9FTkFCTEVECi0gKgkgIHsgdTY0CQl0aW1lX3J1bm5pbmc7IH0gJiYgUEVSRl9GT1JNQVRfUlVOTklORworICoJICB7IHU2NAkJdGltZV9lbmFibGVkOyB9ICYmIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRAorICoJICB7IHU2NAkJdGltZV9ydW5uaW5nOyB9ICYmIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfUlVOTklORwogICoJICB7IHU2NAkJdmFsdWU7CiAgKgkgICAgeyB1NjQJaWQ7ICAgICAgICAgICB9ICYmIFBFUkZfRk9STUFUX0lECiAgKgkgIH0JCWNudHJbbnJdOwpAQCAtNTM2LDYgKzUzNywxNiBAQAogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKKy8qCisgKiBleHRyYSBQTVUgcmVnaXN0ZXIgYXNzb2NpYXRlZCB3aXRoIGFuIGV2ZW50CisgKi8KK3N0cnVjdCBod19wZXJmX2V2ZW50X2V4dHJhIHsKKwl1NjQJCWNvbmZpZzsJLyogcmVnaXN0ZXIgdmFsdWUgKi8KKwl1bnNpZ25lZCBpbnQJcmVnOwkvKiByZWdpc3RlciBhZGRyZXNzIG9yIGluZGV4ICovCisJaW50CQlhbGxvYzsJLyogZXh0cmEgcmVnaXN0ZXIgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwlpbnQJCWlkeDsJLyogaW5kZXggaW4gc2hhcmVkX3JlZ3MtPnJlZ3NbXSAqLworfTsKKwogLyoqCiAgKiBzdHJ1Y3QgaHdfcGVyZl9ldmVudCAtIHBlcmZvcm1hbmNlIGV2ZW50IGhhcmR3YXJlIGRldGFpbHM6CiAgKi8KQEAgLTU0OSw5ICs1NjAsNyBAQAogCQkJdW5zaWduZWQgbG9uZwlldmVudF9iYXNlOwogCQkJaW50CQlpZHg7CiAJCQlpbnQJCWxhc3RfY3B1OwotCQkJdW5zaWduZWQgaW50CWV4dHJhX3JlZzsKLQkJCXU2NAkJZXh0cmFfY29uZmlnOwotCQkJaW50CQlleHRyYV9hbGxvYzsKKwkJCXN0cnVjdCBod19wZXJmX2V2ZW50X2V4dHJhIGV4dHJhX3JlZzsKIAkJfTsKIAkJc3RydWN0IHsgLyogc29mdHdhcmUgKi8KIAkJCXN0cnVjdCBocnRpbWVyCWhydGltZXI7CkBAIC02ODAsMzYgKzY4OSw5IEBACiB9OwogCiBzdHJ1Y3QgZmlsZTsKLQotI2RlZmluZSBQRVJGX0JVRkZFUl9XUklUQUJMRQkJMHgwMQotCi1zdHJ1Y3QgcGVyZl9idWZmZXIgewotCWF0b21pY190CQkJcmVmY291bnQ7Ci0Jc3RydWN0IHJjdV9oZWFkCQkJcmN1X2hlYWQ7Ci0jaWZkZWYgQ09ORklHX1BFUkZfVVNFX1ZNQUxMT0MKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcms7Ci0JaW50CQkJCXBhZ2Vfb3JkZXI7CS8qIGFsbG9jYXRpb24gb3JkZXIgICovCi0jZW5kaWYKLQlpbnQJCQkJbnJfcGFnZXM7CS8qIG5yIG9mIGRhdGEgcGFnZXMgICovCi0JaW50CQkJCXdyaXRhYmxlOwkvKiBhcmUgd2Ugd3JpdGFibGUgICAqLwotCi0JYXRvbWljX3QJCQlwb2xsOwkJLyogUE9MTF8gZm9yIHdha2V1cHMgKi8KLQotCWxvY2FsX3QJCQkJaGVhZDsJCS8qIHdyaXRlIHBvc2l0aW9uICAgICovCi0JbG9jYWxfdAkJCQluZXN0OwkJLyogbmVzdGVkIHdyaXRlcnMgICAgKi8KLQlsb2NhbF90CQkJCWV2ZW50czsJCS8qIGV2ZW50IGxpbWl0ICAgICAgICovCi0JbG9jYWxfdAkJCQl3YWtldXA7CQkvKiB3YWtldXAgc3RhbXAgICAgICAqLwotCWxvY2FsX3QJCQkJbG9zdDsJCS8qIG5yIHJlY29yZHMgbG9zdCAgICovCi0KLQlsb25nCQkJCXdhdGVybWFyazsJLyogd2FrZXVwIHdhdGVybWFyayAgKi8KLQotCXN0cnVjdCBwZXJmX2V2ZW50X21tYXBfcGFnZQkqdXNlcl9wYWdlOwotCXZvaWQJCQkJKmRhdGFfcGFnZXNbMF07Ci19OwotCiBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YTsKIAotdHlwZWRlZiB2b2lkICgqcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QpKHN0cnVjdCBwZXJmX2V2ZW50ICosIGludCwKK3R5cGVkZWYgdm9pZCAoKnBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90KShzdHJ1Y3QgcGVyZl9ldmVudCAqLAogCQkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqLAogCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKQEAgLTc0NSw2ICs3MjcsOCBAQAogfTsKICNlbmRpZgogCitzdHJ1Y3QgcmluZ19idWZmZXI7CisKIC8qKgogICogc3RydWN0IHBlcmZfZXZlbnQgLSBwZXJmb3JtYW5jZSBldmVudCBrZXJuZWwgcmVwcmVzZW50YXRpb246CiAgKi8KQEAgLTgzNCw3ICs4MTgsNyBAQAogCWF0b21pY190CQkJbW1hcF9jb3VudDsKIAlpbnQJCQkJbW1hcF9sb2NrZWQ7CiAJc3RydWN0IHVzZXJfc3RydWN0CQkqbW1hcF91c2VyOwotCXN0cnVjdCBwZXJmX2J1ZmZlcgkJKmJ1ZmZlcjsKKwlzdHJ1Y3QgcmluZ19idWZmZXIJCSpyYjsKIAogCS8qIHBvbGwgcmVsYXRlZCAqLwogCXdhaXRfcXVldWVfaGVhZF90CQl3YWl0cTsKQEAgLTg1NSw2ICs4MzksNyBAQAogCXU2NAkJCQlpZDsKIAogCXBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90CQlvdmVyZmxvd19oYW5kbGVyOworCXZvaWQJCQkJKm92ZXJmbG93X2hhbmRsZXJfY29udGV4dDsKIAogI2lmZGVmIENPTkZJR19FVkVOVF9UUkFDSU5HCiAJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsCSp0cF9ldmVudDsKQEAgLTkxOSw4ICs5MDQsOCBAQAogCXU2NAkJCQlwYXJlbnRfZ2VuOwogCXU2NAkJCQlnZW5lcmF0aW9uOwogCWludAkJCQlwaW5fY291bnQ7Ci0Jc3RydWN0IHJjdV9oZWFkCQkJcmN1X2hlYWQ7CiAJaW50CQkJCW5yX2Nncm91cHM7IC8qIGNncm91cCBldmVudHMgcHJlc2VudCAqLworCXN0cnVjdCByY3VfaGVhZAkJCXJjdV9oZWFkOwogfTsKIAogLyoKQEAgLTk0NSwxMyArOTMwLDExIEBACiAKIHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgewogCXN0cnVjdCBwZXJmX2V2ZW50CQkqZXZlbnQ7Ci0Jc3RydWN0IHBlcmZfYnVmZmVyCQkqYnVmZmVyOworCXN0cnVjdCByaW5nX2J1ZmZlcgkJKnJiOwogCXVuc2lnbmVkIGxvbmcJCQl3YWtldXA7CiAJdW5zaWduZWQgbG9uZwkJCXNpemU7CiAJdm9pZAkJCQkqYWRkcjsKIAlpbnQJCQkJcGFnZTsKLQlpbnQJCQkJbm1pOwotCWludAkJCQlzYW1wbGU7CiB9OwogCiAjaWZkZWYgQ09ORklHX1BFUkZfRVZFTlRTCkBAIC05NzIsMTMgKzk1NSwxNSBAQAogZXh0ZXJuIHZvaWQgcGVyZl9wbXVfZW5hYmxlKHN0cnVjdCBwbXUgKnBtdSk7CiBleHRlcm4gaW50IHBlcmZfZXZlbnRfdGFza19kaXNhYmxlKHZvaWQpOwogZXh0ZXJuIGludCBwZXJmX2V2ZW50X3Rhc2tfZW5hYmxlKHZvaWQpOworZXh0ZXJuIGludCBwZXJmX2V2ZW50X3JlZnJlc2goc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgcmVmcmVzaCk7CiBleHRlcm4gdm9pZCBwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwogZXh0ZXJuIGludCBwZXJmX2V2ZW50X3JlbGVhc2Vfa2VybmVsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiBleHRlcm4gc3RydWN0IHBlcmZfZXZlbnQgKgogcGVyZl9ldmVudF9jcmVhdGVfa2VybmVsX2NvdW50ZXIoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKIAkJCQlpbnQgY3B1LAogCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJCQlwZXJmX292ZXJmbG93X2hhbmRsZXJfdCBjYWxsYmFjayk7CisJCQkJcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QgY2FsbGJhY2ssCisJCQkJdm9pZCAqY29udGV4dCk7CiBleHRlcm4gdTY0IHBlcmZfZXZlbnRfcmVhZF92YWx1ZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJIHU2NCAqZW5hYmxlZCwgdTY0ICpydW5uaW5nKTsKIApAQCAtMTAxOCw3ICsxMDAzLDcgQEAKIAkJCQlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCi1leHRlcm4gaW50IHBlcmZfZXZlbnRfb3ZlcmZsb3coc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbm1pLAorZXh0ZXJuIGludCBwZXJmX2V2ZW50X292ZXJmbG93KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQkgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCiAJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIApAQCAtMTAzNyw3ICsxMDIyLDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBqdW1wX2xhYmVsX2tleSBwZXJmX3N3ZXZlbnRfZW5hYmxlZFtQRVJGX0NPVU5UX1NXX01BWF07CiAKLWV4dGVybiB2b2lkIF9fcGVyZl9zd19ldmVudCh1MzIsIHU2NCwgaW50LCBzdHJ1Y3QgcHRfcmVncyAqLCB1NjQpOworZXh0ZXJuIHZvaWQgX19wZXJmX3N3X2V2ZW50KHUzMiwgdTY0LCBzdHJ1Y3QgcHRfcmVncyAqLCB1NjQpOwogCiAjaWZuZGVmIHBlcmZfYXJjaF9mZXRjaF9jYWxsZXJfcmVncwogc3RhdGljIGlubGluZSB2b2lkIHBlcmZfYXJjaF9mZXRjaF9jYWxsZXJfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBpcCkgeyB9CkBAIC0xMDU5LDcgKzEwNDQsNyBAQAogfQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQKLXBlcmZfc3dfZXZlbnQodTMyIGV2ZW50X2lkLCB1NjQgbnIsIGludCBubWksIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1NjQgYWRkcikKK3BlcmZfc3dfZXZlbnQodTMyIGV2ZW50X2lkLCB1NjQgbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1NjQgYWRkcikKIHsKIAlzdHJ1Y3QgcHRfcmVncyBob3RfcmVnczsKIApAQCAtMTA2OCw3ICsxMDUzLDcgQEAKIAkJCXBlcmZfZmV0Y2hfY2FsbGVyX3JlZ3MoJmhvdF9yZWdzKTsKIAkJCXJlZ3MgPSAmaG90X3JlZ3M7CiAJCX0KLQkJX19wZXJmX3N3X2V2ZW50KGV2ZW50X2lkLCBuciwgbm1pLCByZWdzLCBhZGRyKTsKKwkJX19wZXJmX3N3X2V2ZW50KGV2ZW50X2lkLCBuciwgcmVncywgYWRkcik7CiAJfQogfQogCkBAIC0xMDgyLDcgKzEwNjcsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF90YXNrX3NjaGVkX291dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKLQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfQ09OVEVYVF9TV0lUQ0hFUywgMSwgMSwgTlVMTCwgMCk7CisJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0NPTlRFWFRfU1dJVENIRVMsIDEsIE5VTEwsIDApOwogCiAJX19wZXJmX2V2ZW50X3Rhc2tfc2NoZWRfb3V0KHRhc2ssIG5leHQpOwogfQpAQCAtMTE0Myw4ICsxMTI4LDcgQEAKICNlbmRpZgogCiBleHRlcm4gaW50IHBlcmZfb3V0cHV0X2JlZ2luKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwKLQkJCSAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCSAgICAgaW50IG5taSwgaW50IHNhbXBsZSk7CisJCQkgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdW5zaWduZWQgaW50IHNpemUpOwogZXh0ZXJuIHZvaWQgcGVyZl9vdXRwdXRfZW5kKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSk7CiBleHRlcm4gdm9pZCBwZXJmX291dHB1dF9jb3B5KHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwKIAkJCSAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKQEAgLTExNjYsMTAgKzExNTAsMTMgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2V2ZW50X3ByaW50X2RlYnVnKHZvaWQpCQkJCXsgfQogc3RhdGljIGlubGluZSBpbnQgcGVyZl9ldmVudF90YXNrX2Rpc2FibGUodm9pZCkJCQkJeyByZXR1cm4gLUVJTlZBTDsgfQogc3RhdGljIGlubGluZSBpbnQgcGVyZl9ldmVudF90YXNrX2VuYWJsZSh2b2lkKQkJCQl7IHJldHVybiAtRUlOVkFMOyB9CitzdGF0aWMgaW5saW5lIGludCBwZXJmX2V2ZW50X3JlZnJlc2goc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgcmVmcmVzaCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KIAogc3RhdGljIGlubGluZSB2b2lkCi1wZXJmX3N3X2V2ZW50KHUzMiBldmVudF9pZCwgdTY0IG5yLCBpbnQgbm1pLAotCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1NjQgYWRkcikJCQl7IH0KK3BlcmZfc3dfZXZlbnQodTMyIGV2ZW50X2lkLCB1NjQgbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1NjQgYWRkcikJeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQKIHBlcmZfYnBfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB2b2lkICpkYXRhKQkJCXsgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZnNhOTQ4MC5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2ZzYTk0ODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmRkZGNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2ZzYTk0ODAuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIE1pbmt5dSBLYW5nIDxtazcua2FuZ0BzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0ZTQTk0ODBfSF8KKyNkZWZpbmUgX0ZTQTk0ODBfSF8KKworI2RlZmluZSBGU0E5NDgwX0FUVEFDSEVECTEKKyNkZWZpbmUgRlNBOTQ4MF9ERVRBQ0hFRAkwCisKK3N0cnVjdCBmc2E5NDgwX3BsYXRmb3JtX2RhdGEgeworCXZvaWQgKCpjZmdfZ3BpbykgKHZvaWQpOworCXZvaWQgKCp1c2JfY2IpICh1OCBhdHRhY2hlZCk7CisJdm9pZCAoKnVhcnRfY2IpICh1OCBhdHRhY2hlZCk7CisJdm9pZCAoKmNoYXJnZXJfY2IpICh1OCBhdHRhY2hlZCk7CisJdm9pZCAoKmppZ19jYikgKHU4IGF0dGFjaGVkKTsKKwl2b2lkICgqcmVzZXRfY2IpICh2b2lkKTsKKwl2b2lkICgqdXNiX3Bvd2VyKSAodTggb24pOworCWludCB3YWtldXA7Cit9OworCisjZW5kaWYgLyogX0ZTQTk0ODBfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9weGFfc2RoY2kuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9weGFfc2RoY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWFkMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3B4YV9zZGhjaS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvcHhhX3NkaGNpLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBNYXJ2ZWxsCisgKglaaGFuZ2ZlaSBHYW8gPHpoYW5nZmVpLmdhb0BtYXJ2ZWxsLmNvbT4KKyAqCisgKiBQWEEgUGxhdGZvcm0gLSBTREhDSSBwbGF0Zm9ybSBkYXRhIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9QWEFfU0RIQ0lfSF8KKyNkZWZpbmUgX1BYQV9TREhDSV9IXworCisvKiBweGEgc3BlY2lmaWMgZmxhZyAqLworLyogUmVxdWlyZSBjbG9jayBmcmVlIHJ1bm5pbmcgKi8KKyNkZWZpbmUgUFhBX0ZMQUdfRU5BQkxFX0NMT0NLX0dBVElORyAoMTw8MCkKKy8qIGNhcmQgYWx3YXlzIHdpcmVkIHRvIGhvc3QsIGxpa2Ugb24tY2hpcCBlbW1jICovCisjZGVmaW5lIFBYQV9GTEFHX0NBUkRfUEVSTUFORU5UCSgxPDwxKQorLyogQm9hcmQgZGVzaWduIHN1cHBvcnRzIDgtYml0IGRhdGEgb24gU0QvU0RJTyBCVVMgKi8KKyNkZWZpbmUgUFhBX0ZMQUdfU0RfOF9CSVRfQ0FQQUJMRV9TTE9UICgxPDwyKQorCisvKgorICogc3RydWN0IHB4YV9zZGhjaV9wbGF0ZGF0YSgpIC0gUGxhdGZvcm0gZGV2aWNlIGRhdGEgZm9yIFBYQSBTREhDSQorICogQGZsYWdzOiBmbGFncyBmb3IgcGxhdGZvcm0gcmVxdWlyZW1lbnQKKyAqIEBjbGtfZGVsYXlfY3ljbGVzOgorICoJbW1wMjogZWFjaCBzdGVwIGlzIHJvdWdobHkgMTAwcHMsIDViaXRzIHdpZHRoCisgKglweGE5MTA6IGVhY2ggc3RlcCBpcyAxbnMsIDRiaXRzIHdpZHRoCisgKiBAY2xrX2RlbGF5X3NlbDogc2VsZWN0IGNsa19kZWxheSwgdXNlZCBvbiBweGE5MTAKKyAqCTA6IGNob29zZSBmZWVkYmFjayBjbGsKKyAqCTE6IGNob29zZSBmZWVkYmFjayBjbGsgKyBkZWxheSB2YWx1ZQorICoJMjogY2hvb3NlIGludGVybmFsIGNsaworICogQGNsa19kZWxheV9lbmFibGU6IGVuYWJsZSBjbGtfZGVsYXkgb3Igbm90LCB1c2VkIG9uIHB4YTkxMAorICogQGV4dF9jZF9ncGlvOiBncGlvIHBpbiB1c2VkIGZvciBleHRlcm5hbCBDRCBsaW5lCisgKiBAZXh0X2NkX2dwaW9faW52ZXJ0OiBpbnZlcnQgdmFsdWVzIGZvciBleHRlcm5hbCBDRCBncGlvIGxpbmUKKyAqIEBtYXhfc3BlZWQ6IHRoZSBtYXhpbXVtIHNwZWVkIHN1cHBvcnRlZAorICogQGhvc3RfY2FwczogU3RhbmRhcmQgTU1DIGhvc3QgY2FwYWJpbGl0aWVzIGJpdCBmaWVsZC4KKyAqIEBxdWlya3M6IHF1aXJrcyBvZiBwbGF0ZnJvbQorICogQHBtX2NhcHM6IHBtX2NhcHMgb2YgcGxhdGZyb20KKyAqLworc3RydWN0IHNkaGNpX3B4YV9wbGF0ZGF0YSB7CisJdW5zaWduZWQgaW50CWZsYWdzOworCXVuc2lnbmVkIGludAljbGtfZGVsYXlfY3ljbGVzOworCXVuc2lnbmVkIGludAljbGtfZGVsYXlfc2VsOworCWJvb2wJCWNsa19kZWxheV9lbmFibGU7CisJdW5zaWduZWQgaW50CWV4dF9jZF9ncGlvOworCWJvb2wJCWV4dF9jZF9ncGlvX2ludmVydDsKKwl1bnNpZ25lZCBpbnQJbWF4X3NwZWVkOworCXVuc2lnbmVkIGludAlob3N0X2NhcHM7CisJdW5zaWduZWQgaW50CXF1aXJrczsKKwl1bnNpZ25lZCBpbnQJcG1fY2FwczsKK307CisKK3N0cnVjdCBzZGhjaV9weGEgeworCXU4CWNsa19lbmFibGU7CisJdTgJcG93ZXJfbW9kZTsKK307CisjZW5kaWYgLyogX1BYQV9TREhDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKaW5kZXggZWRlMWE4MC4uMjdiYjA1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCkBAIC00Miw2ICs0Miw3IEBACiBleHRlcm4gc3RydWN0IGJ1c190eXBlIHBsYXRmb3JtX2J1c190eXBlOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2UgcGxhdGZvcm1fYnVzOwogCitleHRlcm4gdm9pZCBhcmNoX3NldHVwX3BkZXZfYXJjaGRhdGEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKIGV4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgKnBsYXRmb3JtX2dldF9yZXNvdXJjZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgcGxhdGZvcm1fZ2V0X2lycShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gc3RydWN0IHJlc291cmNlICpwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgdW5zaWduZWQgaW50LCBjb25zdCBjaGFyICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGlzdC5oIGIvaW5jbHVkZS9saW51eC9wbGlzdC5oCmluZGV4IGM5YjlmMzIuLmFhMGZiMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxpc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsaXN0LmgKQEAgLTc3LDE0ICs3Nyw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdHlwZXMuaD4KIAogc3RydWN0IHBsaXN0X2hlYWQgewogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZV9saXN0OwotI2lmZGVmIENPTkZJR19ERUJVR19QSV9MSVNUCi0JcmF3X3NwaW5sb2NrX3QgKnJhd2xvY2s7Ci0Jc3BpbmxvY2tfdCAqc3BpbmxvY2s7Ci0jZW5kaWYKIH07CiAKIHN0cnVjdCBwbGlzdF9ub2RlIHsKQEAgLTkzLDM3ICs4OCwxMyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJbm9kZV9saXN0OwogfTsKIAotI2lmZGVmIENPTkZJR19ERUJVR19QSV9MSVNUCi0jIGRlZmluZSBQTElTVF9IRUFEX0xPQ0tfSU5JVChfbG9jaykJCS5zcGlubG9jayA9IF9sb2NrCi0jIGRlZmluZSBQTElTVF9IRUFEX0xPQ0tfSU5JVF9SQVcoX2xvY2spCS5yYXdsb2NrID0gX2xvY2sKLSNlbHNlCi0jIGRlZmluZSBQTElTVF9IRUFEX0xPQ0tfSU5JVChfbG9jaykKLSMgZGVmaW5lIFBMSVNUX0hFQURfTE9DS19JTklUX1JBVyhfbG9jaykKLSNlbmRpZgotCi0jZGVmaW5lIF9QTElTVF9IRUFEX0lOSVQoaGVhZCkJCQkJXAotCS5ub2RlX2xpc3QgPSBMSVNUX0hFQURfSU5JVCgoaGVhZCkubm9kZV9saXN0KQotCiAvKioKICAqIFBMSVNUX0hFQURfSU5JVCAtIHN0YXRpYyBzdHJ1Y3QgcGxpc3RfaGVhZCBpbml0aWFsaXplcgogICogQGhlYWQ6CXN0cnVjdCBwbGlzdF9oZWFkIHZhcmlhYmxlIG5hbWUKLSAqIEBfbG9jazoJbG9jayB0byBpbml0aWFsaXplIGZvciB0aGlzIGxpc3QKICAqLwotI2RlZmluZSBQTElTVF9IRUFEX0lOSVQoaGVhZCwgX2xvY2spCQkJXAorI2RlZmluZSBQTElTVF9IRUFEX0lOSVQoaGVhZCkJCQkJXAogewkJCQkJCQlcCi0JX1BMSVNUX0hFQURfSU5JVChoZWFkKSwJCQkJXAotCVBMSVNUX0hFQURfTE9DS19JTklUKCYoX2xvY2spKQkJCVwKLX0KLQotLyoqCi0gKiBQTElTVF9IRUFEX0lOSVRfUkFXIC0gc3RhdGljIHN0cnVjdCBwbGlzdF9oZWFkIGluaXRpYWxpemVyCi0gKiBAaGVhZDoJc3RydWN0IHBsaXN0X2hlYWQgdmFyaWFibGUgbmFtZQotICogQF9sb2NrOglsb2NrIHRvIGluaXRpYWxpemUgZm9yIHRoaXMgbGlzdAotICovCi0jZGVmaW5lIFBMSVNUX0hFQURfSU5JVF9SQVcoaGVhZCwgX2xvY2spCQlcCi17CQkJCQkJCVwKLQlfUExJU1RfSEVBRF9JTklUKGhlYWQpLAkJCQlcCi0JUExJU1RfSEVBRF9MT0NLX0lOSVRfUkFXKCYoX2xvY2spKQkJXAorCS5ub2RlX2xpc3QgPSBMSVNUX0hFQURfSU5JVCgoaGVhZCkubm9kZV9saXN0KQlcCiB9CiAKIC8qKgpAQCAtMTQxLDMxICsxMTIsMTEgQEAKIC8qKgogICogcGxpc3RfaGVhZF9pbml0IC0gZHluYW1pYyBzdHJ1Y3QgcGxpc3RfaGVhZCBpbml0aWFsaXplcgogICogQGhlYWQ6CSZzdHJ1Y3QgcGxpc3RfaGVhZCBwb2ludGVyCi0gKiBAbG9jazoJc3BpbmxvY2sgcHJvdGVjdGluZyB0aGUgbGlzdCAoZGVidWdnaW5nKQogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLXBsaXN0X2hlYWRfaW5pdChzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCwgc3BpbmxvY2tfdCAqbG9jaykKK3BsaXN0X2hlYWRfaW5pdChzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCkKIHsKIAlJTklUX0xJU1RfSEVBRCgmaGVhZC0+bm9kZV9saXN0KTsKLSNpZmRlZiBDT05GSUdfREVCVUdfUElfTElTVAotCWhlYWQtPnNwaW5sb2NrID0gbG9jazsKLQloZWFkLT5yYXdsb2NrID0gTlVMTDsKLSNlbmRpZgotfQotCi0vKioKLSAqIHBsaXN0X2hlYWRfaW5pdF9yYXcgLSBkeW5hbWljIHN0cnVjdCBwbGlzdF9oZWFkIGluaXRpYWxpemVyCi0gKiBAaGVhZDoJJnN0cnVjdCBwbGlzdF9oZWFkIHBvaW50ZXIKLSAqIEBsb2NrOglyYXdfc3BpbmxvY2sgcHJvdGVjdGluZyB0aGUgbGlzdCAoZGVidWdnaW5nKQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLXBsaXN0X2hlYWRfaW5pdF9yYXcoc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQsIHJhd19zcGlubG9ja190ICpsb2NrKQotewotCUlOSVRfTElTVF9IRUFEKCZoZWFkLT5ub2RlX2xpc3QpOwotI2lmZGVmIENPTkZJR19ERUJVR19QSV9MSVNUCi0JaGVhZC0+cmF3bG9jayA9IGxvY2s7Ci0JaGVhZC0+c3BpbmxvY2sgPSBOVUxMOwotI2VuZGlmCiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbS5oIGIvaW5jbHVkZS9saW51eC9wbS5oCmluZGV4IDMxNjA2NDguLmY3Yzg0YzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3BtLmgKQEAgLTQyNSw3ICs0MjUsOCBAQAogCXBtX21lc3NhZ2VfdAkJcG93ZXJfc3RhdGU7CiAJdW5zaWduZWQgaW50CQljYW5fd2FrZXVwOjE7CiAJdW5zaWduZWQgaW50CQlhc3luY19zdXNwZW5kOjE7Ci0JdW5zaWduZWQgaW50CQlpbl9zdXNwZW5kOjE7CS8qIE93bmVkIGJ5IHRoZSBQTSBjb3JlICovCisJYm9vbAkJCWlzX3ByZXBhcmVkOjE7CS8qIE93bmVkIGJ5IHRoZSBQTSBjb3JlICovCisJYm9vbAkJCWlzX3N1c3BlbmRlZDoxOwkvKiBEaXR0byAqLwogCXNwaW5sb2NrX3QJCWxvY2s7CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJc3RydWN0IGxpc3RfaGVhZAllbnRyeTsKQEAgLTQ2MCw4ICs0NjEsOCBAQAogCXVuc2lnbmVkIGxvbmcJCWFjdGl2ZV9qaWZmaWVzOwogCXVuc2lnbmVkIGxvbmcJCXN1c3BlbmRlZF9qaWZmaWVzOwogCXVuc2lnbmVkIGxvbmcJCWFjY291bnRpbmdfdGltZXN0YW1wOwotCXZvaWQJCQkqc3Vic3lzX2RhdGE7ICAvKiBPd25lZCBieSB0aGUgc3Vic3lzdGVtLiAqLwogI2VuZGlmCisJdm9pZAkJCSpzdWJzeXNfZGF0YTsgIC8qIE93bmVkIGJ5IHRoZSBzdWJzeXN0ZW0uICovCiB9OwogCiBleHRlcm4gdm9pZCB1cGRhdGVfcG1fcnVudGltZV9hY2NvdW50aW5nKHN0cnVjdCBkZXZpY2UgKmRldik7CkBAIC00NzEsNyArNDcyLDcgQEAKICAqIGhpYmVybmF0aW9uLCBzeXN0ZW0gcmVzdW1lIGFuZCBkdXJpbmcgcnVudGltZSBQTSB0cmFuc2l0aW9ucyBhbG9uZyB3aXRoCiAgKiBzdWJzeXN0ZW0tbGV2ZWwgYW5kIGRyaXZlci1sZXZlbCBjYWxsYmFja3MuCiAgKi8KLXN0cnVjdCBkZXZfcG93ZXJfZG9tYWluIHsKK3N0cnVjdCBkZXZfcG1fZG9tYWluIHsKIAlzdHJ1Y3QgZGV2X3BtX29wcwlvcHM7CiB9OwogCkBAIC01NTIsMTEgKzU1MywxNyBAQAogZXh0ZXJuIGludCBkZXZpY2VfcG1fd2FpdF9mb3JfZGV2KHN0cnVjdCBkZXZpY2UgKnN1Yiwgc3RydWN0IGRldmljZSAqZGV2KTsKIAogZXh0ZXJuIGludCBwbV9nZW5lcmljX3ByZXBhcmUoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcG1fZ2VuZXJpY19zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHBtX2dlbmVyaWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9nZW5lcmljX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBwbV9nZW5lcmljX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9nZW5lcmljX2ZyZWV6ZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBwbV9nZW5lcmljX2ZyZWV6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9nZW5lcmljX3RoYXdfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgcG1fZ2VuZXJpY190aGF3KHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2dlbmVyaWNfcmVzdG9yZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBwbV9nZW5lcmljX3Jlc3RvcmUoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcG1fZ2VuZXJpY19wb3dlcm9mZl9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBwbV9nZW5lcmljX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBwbV9nZW5lcmljX2NvbXBsZXRlKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG1fZG9tYWluLmggYi9pbmNsdWRlL2xpbnV4L3BtX2RvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDk3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BtX2RvbWFpbi5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogcG1fZG9tYWluLmggLSBEZWZpbml0aW9ucyBhbmQgaGVhZGVycyByZWxhdGVkIHRvIGRldmljZSBwb3dlciBkb21haW5zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHNpc2sucGw+LCBSZW5lc2FzIEVsZWN0cm9uaWNzIENvcnAuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9QTV9ET01BSU5fSAorI2RlZmluZSBfTElOVVhfUE1fRE9NQUlOX0gKKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCitlbnVtIGdwZF9zdGF0dXMgeworCUdQRF9TVEFURV9BQ1RJVkUgPSAwLAkvKiBQTSBkb21haW4gaXMgYWN0aXZlICovCisJR1BEX1NUQVRFX0JVU1ksCQkvKiBTb21ldGhpbmcgaXMgaGFwcGVuaW5nIHRvIHRoZSBQTSBkb21haW4gKi8KKwlHUERfU1RBVEVfUkVQRUFULAkvKiBQb3dlciBvZmYgaW4gcHJvZ3Jlc3MsIHRvIGJlIHJlcGVhdGVkICovCisJR1BEX1NUQVRFX1BPV0VSX09GRiwJLyogUE0gZG9tYWluIGlzIG9mZiAqLworfTsKKworc3RydWN0IGRldl9wb3dlcl9nb3Zlcm5vciB7CisJYm9vbCAoKnBvd2VyX2Rvd25fb2spKHN0cnVjdCBkZXZfcG1fZG9tYWluICpkb21haW4pOworfTsKKworc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluIHsKKwlzdHJ1Y3QgZGV2X3BtX2RvbWFpbiBkb21haW47CS8qIFBNIGRvbWFpbiBvcGVyYXRpb25zICovCisJc3RydWN0IGxpc3RfaGVhZCBncGRfbGlzdF9ub2RlOwkvKiBOb2RlIGluIHRoZSBnbG9iYWwgUE0gZG9tYWlucyBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBzZF9ub2RlOwkvKiBOb2RlIGluIHRoZSBwYXJlbnQncyBzdWJkb21haW4gbGlzdCAqLworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqcGFyZW50OwkvKiBQYXJlbnQgUE0gZG9tYWluICovCisJc3RydWN0IGxpc3RfaGVhZCBzZF9saXN0OwkvKiBMaXN0IG9mIGR1YmRvbWFpbnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9saXN0OwkvKiBMaXN0IG9mIGRldmljZXMgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgZGV2X3Bvd2VyX2dvdmVybm9yICpnb3Y7CisJc3RydWN0IHdvcmtfc3RydWN0IHBvd2VyX29mZl93b3JrOworCXVuc2lnbmVkIGludCBpbl9wcm9ncmVzczsJLyogTnVtYmVyIG9mIGRldmljZXMgYmVpbmcgc3VzcGVuZGVkIG5vdyAqLworCXVuc2lnbmVkIGludCBzZF9jb3VudDsJLyogTnVtYmVyIG9mIHN1YmRvbWFpbnMgd2l0aCBwb3dlciAib24iICovCisJZW51bSBncGRfc3RhdHVzIHN0YXR1czsJLyogQ3VycmVudCBzdGF0ZSBvZiB0aGUgZG9tYWluICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3RhdHVzX3dhaXRfcXVldWU7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwb3dlcm9mZl90YXNrOwkvKiBQb3dlcmluZyBvZmYgdGFzayAqLworCXVuc2lnbmVkIGludCByZXN1bWVfY291bnQ7CS8qIE51bWJlciBvZiBkZXZpY2VzIGJlaW5nIHJlc3VtZWQgKi8KKwl1bnNpZ25lZCBpbnQgZGV2aWNlX2NvdW50OwkvKiBOdW1iZXIgb2YgZGV2aWNlcyAqLworCXVuc2lnbmVkIGludCBzdXNwZW5kZWRfY291bnQ7CS8qIFN5c3RlbSBzdXNwZW5kIGRldmljZSBjb3VudGVyICovCisJdW5zaWduZWQgaW50IHByZXBhcmVkX2NvdW50OwkvKiBTdXNwZW5kIGNvdW50ZXIgb2YgcHJlcGFyZWQgZGV2aWNlcyAqLworCWJvb2wgc3VzcGVuZF9wb3dlcl9vZmY7CS8qIFBvd2VyIHN0YXR1cyBiZWZvcmUgc3lzdGVtIHN1c3BlbmQgKi8KKwlpbnQgKCpwb3dlcl9vZmYpKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZG9tYWluKTsKKwlpbnQgKCpwb3dlcl9vbikoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpkb21haW4pOworCWludCAoKnN0YXJ0X2RldmljZSkoc3RydWN0IGRldmljZSAqZGV2KTsKKwlpbnQgKCpzdG9wX2RldmljZSkoc3RydWN0IGRldmljZSAqZGV2KTsKKwlib29sICgqYWN0aXZlX3dha2V1cCkoc3RydWN0IGRldmljZSAqZGV2KTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwZF90b19nZW5wZChzdHJ1Y3QgZGV2X3BtX2RvbWFpbiAqcGQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihwZCwgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluLCBkb21haW4pOworfQorCitzdHJ1Y3QgZGV2X2xpc3RfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJYm9vbCBuZWVkX3Jlc3RvcmU7Cit9OworCisjaWZkZWYgQ09ORklHX1BNX0dFTkVSSUNfRE9NQUlOUworZXh0ZXJuIGludCBwbV9nZW5wZF9hZGRfZGV2aWNlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCisJCQkgICAgICAgc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcG1fZ2VucGRfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAorCQkJCSAgc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcG1fZ2VucGRfYWRkX3N1YmRvbWFpbihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAorCQkJCSAgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpuZXdfc3ViZG9tYWluKTsKK2V4dGVybiBpbnQgcG1fZ2VucGRfcmVtb3ZlX3N1YmRvbWFpbihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAorCQkJCSAgICAgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICp0YXJnZXQpOworZXh0ZXJuIHZvaWQgcG1fZ2VucGRfaW5pdChzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAorCQkJICBzdHJ1Y3QgZGV2X3Bvd2VyX2dvdmVybm9yICpnb3YsIGJvb2wgaXNfb2ZmKTsKK2V4dGVybiBpbnQgcG1fZ2VucGRfcG93ZXJvbihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKTsKK2V4dGVybiB2b2lkIHBtX2dlbnBkX3Bvd2Vyb2ZmX3VudXNlZCh2b2lkKTsKK2V4dGVybiB2b2lkIGdlbnBkX3F1ZXVlX3Bvd2VyX29mZl93b3JrKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHBtX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CitzdGF0aWMgaW5saW5lIGludCBwbV9nZW5wZF9yZW1vdmVfZGV2aWNlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CitzdGF0aWMgaW5saW5lIGludCBwbV9nZW5wZF9hZGRfc3ViZG9tYWluKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCisJCQkJCSBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKm5ld19zZCkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHBtX2dlbnBkX3JlbW92ZV9zdWJkb21haW4oc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKKwkJCQkJICAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqdGFyZ2V0KQoreworCXJldHVybiAtRU5PU1lTOworfQorc3RhdGljIGlubGluZSB2b2lkIHBtX2dlbnBkX2luaXQoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKKwkJCQkgc3RydWN0IGRldl9wb3dlcl9nb3Zlcm5vciAqZ292LCBib29sIGlzX29mZikge30KK3N0YXRpYyBpbmxpbmUgaW50IHBtX2dlbnBkX3Bvd2Vyb24oc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwbV9nZW5wZF9wb3dlcm9mZl91bnVzZWQodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5wZF9xdWV1ZV9wb3dlcl9vZmZfd29yayhzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdwZCkge30KKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTlVYX1BNX0RPTUFJTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtX3J1bnRpbWUuaCBiL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCmluZGV4IDg3OGNmODQuLmRhYWMwNWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCkBAIC04Miw2ICs4MiwxMSBAQAogCQkmJiAhZGV2LT5wb3dlci5kaXNhYmxlX2RlcHRoOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgcG1fcnVudGltZV9zdGF0dXNfc3VzcGVuZGVkKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5wb3dlci5ydW50aW1lX3N0YXR1cyA9PSBSUE1fU1VTUEVOREVEOworfQorCiBzdGF0aWMgaW5saW5lIGJvb2wgcG1fcnVudGltZV9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gIWRldi0+cG93ZXIuZGlzYWJsZV9kZXB0aDsKQEAgLTEzMCw2ICsxMzUsNyBAQAogc3RhdGljIGlubGluZSBib29sIGRldmljZV9ydW5fd2FrZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIGZhbHNlOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZGV2aWNlX3NldF9ydW5fd2FrZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKSB7fQogc3RhdGljIGlubGluZSBib29sIHBtX3J1bnRpbWVfc3VzcGVuZGVkKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gZmFsc2U7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBwbV9ydW50aW1lX3N0YXR1c19zdXNwZW5kZWQoc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiBmYWxzZTsgfQogc3RhdGljIGlubGluZSBib29sIHBtX3J1bnRpbWVfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIGZhbHNlOyB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBtX2dlbmVyaWNfcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gMDsgfQpAQCAtMjQ3LDQxICsyNTMsNDEgQEAKIAogc3RydWN0IHBtX2Nsa19ub3RpZmllcl9ibG9jayB7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5iOwotCXN0cnVjdCBkZXZfcG93ZXJfZG9tYWluICpwd3JfZG9tYWluOworCXN0cnVjdCBkZXZfcG1fZG9tYWluICpwbV9kb21haW47CiAJY2hhciAqY29uX2lkc1tdOwogfTsKIAotI2lmZGVmIENPTkZJR19QTV9SVU5USU1FX0NMSwotZXh0ZXJuIGludCBwbV9ydW50aW1lX2Nsa19pbml0KHN0cnVjdCBkZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBwbV9ydW50aW1lX2Nsa19kZXN0cm95KHN0cnVjdCBkZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IHBtX3J1bnRpbWVfY2xrX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNvbl9pZCk7Ci1leHRlcm4gdm9pZCBwbV9ydW50aW1lX2Nsa19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpOwotZXh0ZXJuIGludCBwbV9ydW50aW1lX2Nsa19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IHBtX3J1bnRpbWVfY2xrX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworI2lmZGVmIENPTkZJR19QTV9DTEsKK2V4dGVybiBpbnQgcG1fY2xrX2luaXQoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHBtX2Nsa19kZXN0cm95KHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2Nsa19hZGQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpOworZXh0ZXJuIHZvaWQgcG1fY2xrX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNvbl9pZCk7CitleHRlcm4gaW50IHBtX2Nsa19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2Nsa19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBwbV9ydW50aW1lX2Nsa19pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgaW50IHBtX2Nsa19pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwbV9ydW50aW1lX2Nsa19kZXN0cm95KHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbV9jbGtfZGVzdHJveShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBwbV9ydW50aW1lX2Nsa19hZGQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpCitzdGF0aWMgaW5saW5lIGludCBwbV9jbGtfYWRkKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqY29uX2lkKQogewogCXJldHVybiAtRUlOVkFMOwogfQotc3RhdGljIGlubGluZSB2b2lkIHBtX3J1bnRpbWVfY2xrX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNvbl9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbV9jbGtfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqY29uX2lkKQogewogfQotI2RlZmluZSBwbV9ydW50aW1lX2Nsb2NrX3N1c3BlbmQJTlVMTAotI2RlZmluZSBwbV9ydW50aW1lX2Nsb2NrX3Jlc3VtZQkJTlVMTAorI2RlZmluZSBwbV9jbGtfc3VzcGVuZAlOVUxMCisjZGVmaW5lIHBtX2Nsa19yZXN1bWUJTlVMTAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSEFWRV9DTEsKLWV4dGVybiB2b2lkIHBtX3J1bnRpbWVfY2xrX2FkZF9ub3RpZmllcihzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywKK2V4dGVybiB2b2lkIHBtX2Nsa19hZGRfbm90aWZpZXIoc3RydWN0IGJ1c190eXBlICpidXMsCiAJCQkJCXN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgKmNsa25iKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgcG1fcnVudGltZV9jbGtfYWRkX25vdGlmaWVyKHN0cnVjdCBidXNfdHlwZSAqYnVzLAorc3RhdGljIGlubGluZSB2b2lkIHBtX2Nsa19hZGRfbm90aWZpZXIoc3RydWN0IGJ1c190eXBlICpidXMsCiAJCQkJCXN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgKmNsa25iKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbnAuaCBiL2luY2x1ZGUvbGludXgvcG5wLmgKaW5kZXggMWJjMTMzOC4uMTk1YWFmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbnAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BucC5oCkBAIC01MCw3ICs1MCw3IEBACiB7CiAJaWYgKHJlcy0+c3RhcnQgPT0gMCAmJiByZXMtPmVuZCA9PSAwKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlyZXR1cm4gcmVzb3VyY2Vfc2l6ZShyZXMpOwogfQogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG9pc29uLmggYi9pbmNsdWRlL2xpbnV4L3BvaXNvbi5oCmluZGV4IDIxMTBhODEuLjc5MTU5ZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG9pc29uLmgKKysrIGIvaW5jbHVkZS9saW51eC9wb2lzb24uaApAQCAtNDAsNiArNDAsMTIgQEAKICNkZWZpbmUJUkVEX0lOQUNUSVZFCTB4MDlGOTExMDI5RDc0RTM1QlVMTAkvKiB3aGVuIG9iaiBpcyBpbmFjdGl2ZSAqLwogI2RlZmluZQlSRURfQUNUSVZFCTB4RDg0MTU2QzU2MzU2ODhDMFVMTAkvKiB3aGVuIG9iaiBpcyBhY3RpdmUgKi8KIAorI2lmZGVmIENPTkZJR19QSFlTX0FERFJfVF82NEJJVAorI2RlZmluZSBNRU1CTE9DS19JTkFDVElWRQkweDNhODRmYjAxNDRjOWU3MWJVTEwKKyNlbHNlCisjZGVmaW5lIE1FTUJMT0NLX0lOQUNUSVZFCTB4NDRjOWU3MWJVTAorI2VuZGlmCisKICNkZWZpbmUgU0xVQl9SRURfSU5BQ1RJVkUJMHhiYgogI2RlZmluZSBTTFVCX1JFRF9BQ1RJVkUJCTB4Y2MKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb3NpeF9hY2wuaCBiL2luY2x1ZGUvbGludXgvcG9zaXhfYWNsLmgKaW5kZXggNTQyMTFjMS4uOWE1M2I5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb3NpeF9hY2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Bvc2l4X2FjbC5oCkBAIC03MywxMyArNzMsMTIgQEAKIAogZXh0ZXJuIHZvaWQgcG9zaXhfYWNsX2luaXQoc3RydWN0IHBvc2l4X2FjbCAqLCBpbnQpOwogZXh0ZXJuIHN0cnVjdCBwb3NpeF9hY2wgKnBvc2l4X2FjbF9hbGxvYyhpbnQsIGdmcF90KTsKLWV4dGVybiBzdHJ1Y3QgcG9zaXhfYWNsICpwb3NpeF9hY2xfY2xvbmUoY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqLCBnZnBfdCk7CiBleHRlcm4gaW50IHBvc2l4X2FjbF92YWxpZChjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICopOwogZXh0ZXJuIGludCBwb3NpeF9hY2xfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqLCBpbnQpOwogZXh0ZXJuIHN0cnVjdCBwb3NpeF9hY2wgKnBvc2l4X2FjbF9mcm9tX21vZGUobW9kZV90LCBnZnBfdCk7CiBleHRlcm4gaW50IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKiwgbW9kZV90ICopOwotZXh0ZXJuIGludCBwb3NpeF9hY2xfY3JlYXRlX21hc3Eoc3RydWN0IHBvc2l4X2FjbCAqLCBtb2RlX3QgKik7Ci1leHRlcm4gaW50IHBvc2l4X2FjbF9jaG1vZF9tYXNxKHN0cnVjdCBwb3NpeF9hY2wgKiwgbW9kZV90KTsKK2V4dGVybiBpbnQgcG9zaXhfYWNsX2NyZWF0ZShzdHJ1Y3QgcG9zaXhfYWNsICoqLCBnZnBfdCwgbW9kZV90ICopOworZXh0ZXJuIGludCBwb3NpeF9hY2xfY2htb2Qoc3RydWN0IHBvc2l4X2FjbCAqKiwgZ2ZwX3QsIG1vZGVfdCk7CiAKIGV4dGVybiBzdHJ1Y3QgcG9zaXhfYWNsICpnZXRfcG9zaXhfYWNsKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogZXh0ZXJuIGludCBzZXRfcG9zaXhfYWNsKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBwb3NpeF9hY2wgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ByZWVtcHQuaCBiL2luY2x1ZGUvbGludXgvcHJlZW1wdC5oCmluZGV4IDJlNjgxZDkuLjU4OTY5YjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJlZW1wdC5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJlZW1wdC5oCkBAIC0yNyw2ICsyNywyMSBAQAogCiBhc21saW5rYWdlIHZvaWQgcHJlZW1wdF9zY2hlZHVsZSh2b2lkKTsKIAorI2RlZmluZSBwcmVlbXB0X2NoZWNrX3Jlc2NoZWQoKSBcCitkbyB7IFwKKwlpZiAodW5saWtlbHkodGVzdF90aHJlYWRfZmxhZyhUSUZfTkVFRF9SRVNDSEVEKSkpIFwKKwkJcHJlZW1wdF9zY2hlZHVsZSgpOyBcCit9IHdoaWxlICgwKQorCisjZWxzZSAvKiAhQ09ORklHX1BSRUVNUFQgKi8KKworI2RlZmluZSBwcmVlbXB0X2NoZWNrX3Jlc2NoZWQoKQkJZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogQ09ORklHX1BSRUVNUFQgKi8KKworCisjaWZkZWYgQ09ORklHX1BSRUVNUFRfQ09VTlQKKwogI2RlZmluZSBwcmVlbXB0X2Rpc2FibGUoKSBcCiBkbyB7IFwKIAlpbmNfcHJlZW1wdF9jb3VudCgpOyBcCkBAIC0zOSwxMiArNTQsNiBAQAogCWRlY19wcmVlbXB0X2NvdW50KCk7IFwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgcHJlZW1wdF9jaGVja19yZXNjaGVkKCkgXAotZG8geyBcCi0JaWYgKHVubGlrZWx5KHRlc3RfdGhyZWFkX2ZsYWcoVElGX05FRURfUkVTQ0hFRCkpKSBcCi0JCXByZWVtcHRfc2NoZWR1bGUoKTsgXAotfSB3aGlsZSAoMCkKLQogI2RlZmluZSBwcmVlbXB0X2VuYWJsZSgpIFwKIGRvIHsgXAogCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsgXApAQCAtODAsMTggKzg5LDE3IEBACiAJcHJlZW1wdF9jaGVja19yZXNjaGVkKCk7IFwKIH0gd2hpbGUgKDApCiAKLSNlbHNlCisjZWxzZSAvKiAhQ09ORklHX1BSRUVNUFRfQ09VTlQgKi8KIAogI2RlZmluZSBwcmVlbXB0X2Rpc2FibGUoKQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBwcmVlbXB0X2VuYWJsZSgpCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHByZWVtcHRfY2hlY2tfcmVzY2hlZCgpCQlkbyB7IH0gd2hpbGUgKDApCiAKICNkZWZpbmUgcHJlZW1wdF9kaXNhYmxlX25vdHJhY2UoKQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkX25vdHJhY2UoKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHByZWVtcHRfZW5hYmxlX25vdHJhY2UoKQkJZG8geyB9IHdoaWxlICgwKQogCi0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfUFJFRU1QVF9DT1VOVCAqLwogCiAjaWZkZWYgQ09ORklHX1BSRUVNUFRfTk9USUZJRVJTCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHRyYWNlLmggYi9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCmluZGV4IDkxNzhkNWMuLjgwMGYxMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wdHJhY2UuaApAQCAtNDcsNiArNDcsMTMgQEAKICNkZWZpbmUgUFRSQUNFX0dFVFJFR1NFVAkweDQyMDQKICNkZWZpbmUgUFRSQUNFX1NFVFJFR1NFVAkweDQyMDUKIAorI2RlZmluZSBQVFJBQ0VfU0VJWkUJCTB4NDIwNgorI2RlZmluZSBQVFJBQ0VfSU5URVJSVVBUCTB4NDIwNworI2RlZmluZSBQVFJBQ0VfTElTVEVOCQkweDQyMDgKKworLyogZmxhZ3MgaW4gQGRhdGEgZm9yIFBUUkFDRV9TRUlaRSAqLworI2RlZmluZSBQVFJBQ0VfU0VJWkVfREVWRUwJMHg4MDAwMDAwMCAvKiB0ZW1wIGZsYWcgZm9yIGRldmVsb3BtZW50ICovCisKIC8qIG9wdGlvbnMgc2V0IHVzaW5nIFBUUkFDRV9TRVRPUFRJT05TICovCiAjZGVmaW5lIFBUUkFDRV9PX1RSQUNFU1lTR09PRAkweDAwMDAwMDAxCiAjZGVmaW5lIFBUUkFDRV9PX1RSQUNFRk9SSwkweDAwMDAwMDAyCkBAIC02NSw2ICs3Miw3IEBACiAjZGVmaW5lIFBUUkFDRV9FVkVOVF9FWEVDCTQKICNkZWZpbmUgUFRSQUNFX0VWRU5UX1ZGT1JLX0RPTkUJNQogI2RlZmluZSBQVFJBQ0VfRVZFTlRfRVhJVAk2CisjZGVmaW5lIFBUUkFDRV9FVkVOVF9TVE9QCTcKIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIApAQCAtNzcsMTYgKzg1LDIyIEBACiAgKiBmbGFncy4gIFdoZW4gdGhlIGEgdGFzayBpcyBzdG9wcGVkIHRoZSBwdHJhY2VyIG93bnMgdGFzay0+cHRyYWNlLgogICovCiAKKyNkZWZpbmUgUFRfU0VJWkVECTB4MDAwMTAwMDAJLyogU0VJWkUgdXNlZCwgZW5hYmxlIG5ldyBiZWhhdmlvciAqLwogI2RlZmluZSBQVF9QVFJBQ0VECTB4MDAwMDAwMDEKICNkZWZpbmUgUFRfRFRSQUNFCTB4MDAwMDAwMDIJLyogZGVsYXllZCB0cmFjZSAodXNlZCBvbiBtNjhrLCBpMzg2KSAqLwogI2RlZmluZSBQVF9UUkFDRVNZU0dPT0QJMHgwMDAwMDAwNAogI2RlZmluZSBQVF9QVFJBQ0VfQ0FQCTB4MDAwMDAwMDgJLyogcHRyYWNlciBjYW4gZm9sbG93IHN1aWQtZXhlYyAqLwotI2RlZmluZSBQVF9UUkFDRV9GT1JLCTB4MDAwMDAwMTAKLSNkZWZpbmUgUFRfVFJBQ0VfVkZPUksJMHgwMDAwMDAyMAotI2RlZmluZSBQVF9UUkFDRV9DTE9ORQkweDAwMDAwMDQwCi0jZGVmaW5lIFBUX1RSQUNFX0VYRUMJMHgwMDAwMDA4MAotI2RlZmluZSBQVF9UUkFDRV9WRk9SS19ET05FCTB4MDAwMDAxMDAKLSNkZWZpbmUgUFRfVFJBQ0VfRVhJVAkweDAwMDAwMjAwCisKKy8qIFBUX1RSQUNFXyogZXZlbnQgZW5hYmxlIGZsYWdzICovCisjZGVmaW5lIFBUX0VWRU5UX0ZMQUdfU0hJRlQJNAorI2RlZmluZSBQVF9FVkVOVF9GTEFHKGV2ZW50KQkoMSA8PCAoUFRfRVZFTlRfRkxBR19TSElGVCArIChldmVudCkgLSAxKSkKKworI2RlZmluZSBQVF9UUkFDRV9GT1JLCQlQVF9FVkVOVF9GTEFHKFBUUkFDRV9FVkVOVF9GT1JLKQorI2RlZmluZSBQVF9UUkFDRV9WRk9SSwkJUFRfRVZFTlRfRkxBRyhQVFJBQ0VfRVZFTlRfVkZPUkspCisjZGVmaW5lIFBUX1RSQUNFX0NMT05FCQlQVF9FVkVOVF9GTEFHKFBUUkFDRV9FVkVOVF9DTE9ORSkKKyNkZWZpbmUgUFRfVFJBQ0VfRVhFQwkJUFRfRVZFTlRfRkxBRyhQVFJBQ0VfRVZFTlRfRVhFQykKKyNkZWZpbmUgUFRfVFJBQ0VfVkZPUktfRE9ORQlQVF9FVkVOVF9GTEFHKFBUUkFDRV9FVkVOVF9WRk9SS19ET05FKQorI2RlZmluZSBQVF9UUkFDRV9FWElUCQlQVF9FVkVOVF9GTEFHKFBUUkFDRV9FVkVOVF9FWElUKQogCiAjZGVmaW5lIFBUX1RSQUNFX01BU0sJMHgwMDAwMDNmNAogCkBAIC0xMDUsNyArMTE5LDcgQEAKIGV4dGVybiBpbnQgcHRyYWNlX3JlYWRkYXRhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nIHNyYywgY2hhciBfX3VzZXIgKmRzdCwgaW50IGxlbik7CiBleHRlcm4gaW50IHB0cmFjZV93cml0ZWRhdGEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGxvbmcgZHN0LCBpbnQgbGVuKTsKIGV4dGVybiB2b2lkIHB0cmFjZV9kaXNhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKLWV4dGVybiBpbnQgcHRyYWNlX2NoZWNrX2F0dGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBraWxsKTsKK2V4dGVybiBpbnQgcHRyYWNlX2NoZWNrX2F0dGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGJvb2wgaWdub3JlX3N0YXRlKTsKIGV4dGVybiBpbnQgcHRyYWNlX3JlcXVlc3Qoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LAogCQkJICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBleHRlcm4gdm9pZCBwdHJhY2Vfbm90aWZ5KGludCBleGl0X2NvZGUpOwpAQCAtMTIyLDcgKzEzNiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHB0cmFjZV9yZXBhcmVudGVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7Ci0JcmV0dXJuIGNoaWxkLT5yZWFsX3BhcmVudCAhPSBjaGlsZC0+cGFyZW50OworCXJldHVybiAhc2FtZV90aHJlYWRfZ3JvdXAoY2hpbGQtPnJlYWxfcGFyZW50LCBjaGlsZC0+cGFyZW50KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHB0cmFjZV91bmxpbmsoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKQEAgLTEzNywzNiArMTUxLDU2IEBACiAJCQkgICAgdW5zaWduZWQgbG9uZyBkYXRhKTsKIAogLyoqCi0gKiB0YXNrX3B0cmFjZSAtIHJldHVybiAlUFRfKiBmbGFncyB0aGF0IGFwcGx5IHRvIGEgdGFzawotICogQHRhc2s6CXBvaW50ZXIgdG8gJnRhc2tfc3RydWN0IGluIHF1ZXN0aW9uCisgKiBwdHJhY2VfcGFyZW50IC0gcmV0dXJuIHRoZSB0YXNrIHRoYXQgaXMgdHJhY2luZyB0aGUgZ2l2ZW4gdGFzaworICogQHRhc2s6IHRhc2sgdG8gY29uc2lkZXIKICAqCi0gKiBSZXR1cm5zIHRoZSAlUFRfKiBmbGFncyB0aGF0IGFwcGx5IHRvIEB0YXNrLgorICogUmV0dXJucyAlTlVMTCBpZiBubyBvbmUgaXMgdHJhY2luZyBAdGFzaywgb3IgdGhlICZzdHJ1Y3QgdGFza19zdHJ1Y3QKKyAqIHBvaW50ZXIgdG8gaXRzIHRyYWNlci4KKyAqCisgKiBNdXN0IGNhbGxlZCB1bmRlciByY3VfcmVhZF9sb2NrKCkuICBUaGUgcG9pbnRlciByZXR1cm5lZCBtaWdodCBiZSBrZXB0CisgKiBsaXZlIG9ubHkgYnkgUkNVLiAgRHVyaW5nIGV4ZWMsIHRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRhc2tfbG9jaygpIGhlbGQKKyAqIG9uIEB0YXNrLCBzdGlsbCBoZWxkIGZyb20gd2hlbiBjaGVja191bnNhZmVfZXhlYygpIHdhcyBjYWxsZWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRhc2tfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICpwdHJhY2VfcGFyZW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlyZXR1cm4gdGFzay0+cHRyYWNlOworCWlmICh1bmxpa2VseSh0YXNrLT5wdHJhY2UpKQorCQlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlKHRhc2stPnBhcmVudCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogcHRyYWNlX2V2ZW50X2VuYWJsZWQgLSB0ZXN0IHdoZXRoZXIgYSBwdHJhY2UgZXZlbnQgaXMgZW5hYmxlZAorICogQHRhc2s6IHB0cmFjZWUgb2YgaW50ZXJlc3QKKyAqIEBldmVudDogJVBUUkFDRV9FVkVOVF8qIHRvIHRlc3QKKyAqCisgKiBUZXN0IHdoZXRoZXIgQGV2ZW50IGlzIGVuYWJsZWQgZm9yIHB0cmFjZWUgQHRhc2suCisgKgorICogUmV0dXJucyAldHJ1ZSBpZiBAZXZlbnQgaXMgZW5hYmxlZCwgJWZhbHNlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIHB0cmFjZV9ldmVudF9lbmFibGVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGV2ZW50KQoreworCXJldHVybiB0YXNrLT5wdHJhY2UgJiBQVF9FVkVOVF9GTEFHKGV2ZW50KTsKIH0KIAogLyoqCiAgKiBwdHJhY2VfZXZlbnQgLSBwb3NzaWJseSBzdG9wIGZvciBhIHB0cmFjZSBldmVudCBub3RpZmljYXRpb24KLSAqIEBtYXNrOgklUFRfKiBiaXQgdG8gY2hlY2sgaW4gQGN1cnJlbnQtPnB0cmFjZQotICogQGV2ZW50OgklUFRSQUNFX0VWRU5UXyogdmFsdWUgdG8gcmVwb3J0IGlmIEBtYXNrIGlzIHNldAorICogQGV2ZW50OgklUFRSQUNFX0VWRU5UXyogdmFsdWUgdG8gcmVwb3J0CiAgKiBAbWVzc2FnZToJdmFsdWUgZm9yICVQVFJBQ0VfR0VURVZFTlRNU0cgdG8gcmV0dXJuCiAgKgotICogVGhpcyBjaGVja3MgdGhlIEBtYXNrIGJpdCB0byBzZWUgaWYgcHRyYWNlIHdhbnRzIHN0b3BzIGZvciB0aGlzIGV2ZW50LgotICogSWYgc28gd2Ugc3RvcCwgcmVwb3J0aW5nIEBldmVudCBhbmQgQG1lc3NhZ2UgdG8gdGhlIHB0cmFjZSBwYXJlbnQuCi0gKgotICogUmV0dXJucyBub256ZXJvIGlmIHdlIGRpZCBhIHB0cmFjZSBub3RpZmljYXRpb24sIHplcm8gaWYgbm90LgorICogQ2hlY2sgd2hldGhlciBAZXZlbnQgaXMgZW5hYmxlZCBhbmQsIGlmIHNvLCByZXBvcnQgQGV2ZW50IGFuZCBAbWVzc2FnZQorICogdG8gdGhlIHB0cmFjZSBwYXJlbnQuCiAgKgogICogQ2FsbGVkIHdpdGhvdXQgbG9ja3MuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0cmFjZV9ldmVudChpbnQgbWFzaywgaW50IGV2ZW50LCB1bnNpZ25lZCBsb25nIG1lc3NhZ2UpCitzdGF0aWMgaW5saW5lIHZvaWQgcHRyYWNlX2V2ZW50KGludCBldmVudCwgdW5zaWduZWQgbG9uZyBtZXNzYWdlKQogewotCWlmIChtYXNrICYmIGxpa2VseSghKGN1cnJlbnQtPnB0cmFjZSAmIG1hc2spKSkKLQkJcmV0dXJuIDA7Ci0JY3VycmVudC0+cHRyYWNlX21lc3NhZ2UgPSBtZXNzYWdlOwotCXB0cmFjZV9ub3RpZnkoKGV2ZW50IDw8IDgpIHwgU0lHVFJBUCk7Ci0JcmV0dXJuIDE7CisJaWYgKHVubGlrZWx5KHB0cmFjZV9ldmVudF9lbmFibGVkKGN1cnJlbnQsIGV2ZW50KSkpIHsKKwkJY3VycmVudC0+cHRyYWNlX21lc3NhZ2UgPSBtZXNzYWdlOworCQlwdHJhY2Vfbm90aWZ5KChldmVudCA8PCA4KSB8IFNJR1RSQVApOworCX0gZWxzZSBpZiAoZXZlbnQgPT0gUFRSQUNFX0VWRU5UX0VYRUMgJiYgdW5saWtlbHkoY3VycmVudC0+cHRyYWNlKSkgeworCQkvKiBsZWdhY3kgRVhFQyByZXBvcnQgdmlhIFNJR1RSQVAgKi8KKwkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMCk7CisJfQogfQogCiAvKioKQEAgLTE4MywxNiArMjE3LDI0IEBACiB7CiAJSU5JVF9MSVNUX0hFQUQoJmNoaWxkLT5wdHJhY2VfZW50cnkpOwogCUlOSVRfTElTVF9IRUFEKCZjaGlsZC0+cHRyYWNlZCk7Ci0JY2hpbGQtPnBhcmVudCA9IGNoaWxkLT5yZWFsX3BhcmVudDsKLQljaGlsZC0+cHRyYWNlID0gMDsKLQlpZiAodW5saWtlbHkocHRyYWNlKSAmJiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpIHsKLQkJY2hpbGQtPnB0cmFjZSA9IGN1cnJlbnQtPnB0cmFjZTsKLQkJX19wdHJhY2VfbGluayhjaGlsZCwgY3VycmVudC0+cGFyZW50KTsKLQl9Ci0KICNpZmRlZiBDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UCiAJYXRvbWljX3NldCgmY2hpbGQtPnB0cmFjZV9icF9yZWZjbnQsIDEpOwogI2VuZGlmCisJY2hpbGQtPmpvYmN0bCA9IDA7CisJY2hpbGQtPnB0cmFjZSA9IDA7CisJY2hpbGQtPnBhcmVudCA9IGNoaWxkLT5yZWFsX3BhcmVudDsKKworCWlmICh1bmxpa2VseShwdHJhY2UpICYmIGN1cnJlbnQtPnB0cmFjZSkgeworCQljaGlsZC0+cHRyYWNlID0gY3VycmVudC0+cHRyYWNlOworCQlfX3B0cmFjZV9saW5rKGNoaWxkLCBjdXJyZW50LT5wYXJlbnQpOworCisJCWlmIChjaGlsZC0+cHRyYWNlICYgUFRfU0VJWkVEKQorCQkJdGFza19zZXRfam9iY3RsX3BlbmRpbmcoY2hpbGQsIEpPQkNUTF9UUkFQX1NUT1ApOworCQllbHNlCisJCQlzaWdhZGRzZXQoJmNoaWxkLT5wZW5kaW5nLnNpZ25hbCwgU0lHU1RPUCk7CisKKwkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NJR1BFTkRJTkcpOworCX0KIH0KIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oIGIvaW5jbHVkZS9saW51eC9yYW5kb20uaAppbmRleCBmYjdhYjlkLi5jZTI5YTA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFuZG9tLmgKQEAgLTU4LDYgKzU4LDcgQEAKIHZvaWQgZ2VuZXJhdGVfcmFuZG9tX3V1aWQodW5zaWduZWQgY2hhciB1dWlkX291dFsxNl0pOwogCiBleHRlcm4gX191MzIgc2VjdXJlX2lwX2lkKF9fYmUzMiBkYWRkcik7CitleHRlcm4gX191MzIgc2VjdXJlX2lwdjZfaWQoY29uc3QgX19iZTMyIGRhZGRyWzRdKTsKIGV4dGVybiB1MzIgc2VjdXJlX2lwdjRfcG9ydF9lcGhlbWVyYWwoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCk7CiBleHRlcm4gdTMyIHNlY3VyZV9pcHY2X3BvcnRfZXBoZW1lcmFsKGNvbnN0IF9fYmUzMiAqc2FkZHIsIGNvbnN0IF9fYmUzMiAqZGFkZHIsCiAJCQkJICAgICAgX19iZTE2IGRwb3J0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1bGlzdC5oIGIvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKaW5kZXggZTNiZWIzMS4uZDA3OTI5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKQEAgLTE4Myw3ICsxODMsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmxhc3QgPSBsaXN0LT5wcmV2OwogCXN0cnVjdCBsaXN0X2hlYWQgKmF0ID0gaGVhZC0+bmV4dDsKIAotCWlmIChsaXN0X2VtcHR5KGhlYWQpKQorCWlmIChsaXN0X2VtcHR5KGxpc3QpKQogCQlyZXR1cm47CiAKIAkvKiAiZmlyc3QiIGFuZCAibGFzdCIgdHJhY2tpbmcgbGlzdCwgc28gaW5pdGlhbGl6ZSBpdC4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaCBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAppbmRleCA5OWY5YWE3Li44ZjRmODgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCkBAIC0yMzksNyArMjM5LDcgQEAKICAqIENoZWNrIGRlYnVnX2xvY2tkZXBfcmN1X2VuYWJsZWQoKSB0byBwcmV2ZW50IGZhbHNlIHBvc2l0aXZlcyBkdXJpbmcgYm9vdAogICogYW5kIHdoaWxlIGxvY2tkZXAgaXMgZGlzYWJsZWQuCiAgKi8KLSNpZmRlZiBDT05GSUdfUFJFRU1QVAorI2lmZGVmIENPTkZJR19QUkVFTVBUX0NPVU5UCiBzdGF0aWMgaW5saW5lIGludCByY3VfcmVhZF9sb2NrX3NjaGVkX2hlbGQodm9pZCkKIHsKIAlpbnQgbG9ja2RlcF9vcGluaW9uID0gMDsKQEAgLTI1MCwxMiArMjUwLDEyIEBACiAJCWxvY2tkZXBfb3BpbmlvbiA9IGxvY2tfaXNfaGVsZCgmcmN1X3NjaGVkX2xvY2tfbWFwKTsKIAlyZXR1cm4gbG9ja2RlcF9vcGluaW9uIHx8IHByZWVtcHRfY291bnQoKSAhPSAwIHx8IGlycXNfZGlzYWJsZWQoKTsKIH0KLSNlbHNlIC8qICNpZmRlZiBDT05GSUdfUFJFRU1QVCAqLworI2Vsc2UgLyogI2lmZGVmIENPTkZJR19QUkVFTVBUX0NPVU5UICovCiBzdGF0aWMgaW5saW5lIGludCByY3VfcmVhZF9sb2NrX3NjaGVkX2hlbGQodm9pZCkKIHsKIAlyZXR1cm4gMTsKIH0KLSNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX1BSRUVNUFQgKi8KKyNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX1BSRUVNUFRfQ09VTlQgKi8KIAogI2Vsc2UgLyogI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DICovCiAKQEAgLTI3NiwxNyArMjc2LDE3IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAorI2lmZGVmIENPTkZJR19QUkVFTVBUX0NPVU5UCiBzdGF0aWMgaW5saW5lIGludCByY3VfcmVhZF9sb2NrX3NjaGVkX2hlbGQodm9pZCkKIHsKIAlyZXR1cm4gcHJlZW1wdF9jb3VudCgpICE9IDAgfHwgaXJxc19kaXNhYmxlZCgpOwogfQotI2Vsc2UgLyogI2lmZGVmIENPTkZJR19QUkVFTVBUICovCisjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1BSRUVNUFRfQ09VTlQgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHJjdV9yZWFkX2xvY2tfc2NoZWRfaGVsZCh2b2lkKQogewogCXJldHVybiAxOwogfQotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUFJFRU1QVCAqLworI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUFJFRU1QVF9DT1VOVCAqLwogCiAjZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVib290LmggYi9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oCmluZGV4IDMwMDVkNWEuLmUwODc5YTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVib290LmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWJvb3QuaApAQCAtMzksNiArMzksMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKKyNkZWZpbmUgU1lTX0RPV04JMHgwMDAxCS8qIE5vdGlmeSBvZiBzeXN0ZW0gZG93biAqLworI2RlZmluZSBTWVNfUkVTVEFSVAlTWVNfRE9XTgorI2RlZmluZSBTWVNfSEFMVAkweDAwMDIJLyogTm90aWZ5IG9mIHN5c3RlbSBoYWx0ICovCisjZGVmaW5lIFNZU19QT1dFUl9PRkYJMHgwMDAzCS8qIE5vdGlmeSBvZiBzeXN0ZW0gcG93ZXIgb2ZmICovCisKIGV4dGVybiBpbnQgcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqKTsKIGV4dGVybiBpbnQgdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICopOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oIGIvaW5jbHVkZS9saW51eC9yZWdtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGE2NWNkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9yZWdtYXAuaApAQCAtMCwwICsxLDgyIEBACisjaWZuZGVmIF9fTElOVVhfUkVHTUFQX0gKKyNkZWZpbmUgX19MSU5VWF9SRUdNQVBfSAorCisvKgorICogUmVnaXN0ZXIgbWFwIGFjY2VzcyBBUEkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKgorICogQXV0aG9yOiBNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0cnVjdCBpMmNfY2xpZW50Oworc3RydWN0IHNwaV9kZXZpY2U7CisKK3N0cnVjdCByZWdtYXBfY29uZmlnIHsKKwlpbnQgcmVnX2JpdHM7CisJaW50IHZhbF9iaXRzOworfTsKKwordHlwZWRlZiBpbnQgKCpyZWdtYXBfaHdfd3JpdGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgICBzaXplX3QgY291bnQpOwordHlwZWRlZiBpbnQgKCpyZWdtYXBfaHdfZ2F0aGVyX3dyaXRlKShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX2xlbiwKKwkJCQkgICAgICBjb25zdCB2b2lkICp2YWwsIHNpemVfdCB2YWxfbGVuKTsKK3R5cGVkZWYgaW50ICgqcmVnbWFwX2h3X3JlYWQpKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKnJlZ19idWYsIHNpemVfdCByZWdfc2l6ZSwKKwkJCSAgICAgIHZvaWQgKnZhbF9idWYsIHNpemVfdCB2YWxfc2l6ZSk7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBoYXJkd2FyZSBidXMgZm9yIHRoZSByZWdpc3RlciBtYXAgaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogQGxpc3Q6IEludGVybmFsIHVzZS4KKyAqIEB0eXBlOiBCdXMgdHlwZSwgdXNlZCB0byBpZGVudGlmeSBidXMgdG8gYmUgdXNlZCBmb3IgYSBkZXZpY2UuCisgKiBAd3JpdGU6IFdyaXRlIG9wZXJhdGlvbi4KKyAqIEBnYXRoZXJfd3JpdGU6IFdyaXRlIG9wZXJhdGlvbiB3aXRoIHNwbGl0IHJlZ2lzdGVyL3ZhbHVlLCByZXR1cm4gLUVOT1RTVVBQCisgKiAgICAgICAgICAgICAgICBpZiBub3QgaW1wbGVtZW50ZWQgIG9uIGEgZ2l2ZW4gZGV2aWNlLgorICogQHJlYWQ6IFJlYWQgb3BlcmF0aW9uLiAgRGF0YSBpcyByZXR1cm5lZCBpbiB0aGUgYnVmZmVyIHVzZWQgdG8gdHJhbnNtaXQKKyAqICAgICAgICAgZGF0YS4KKyAqIEBvd25lcjogTW9kdWxlIHdpdGggdGhlIGJ1cyBpbXBsZW1lbnRhdGlvbiwgdXNlZCB0byBwaW4gdGhlIGltcGxlbWVudGF0aW9uCisgKiAgICAgICAgIGluIG1lbW9yeS4KKyAqIEByZWFkX2ZsYWdfbWFzazogTWFzayB0byBiZSBzZXQgaW4gdGhlIHRvcCBieXRlIG9mIHRoZSByZWdpc3RlciB3aGVuIGRvaW5nCisgKiAgICAgICAgICAgICAgICAgIGEgcmVhZC4KKyAqLworc3RydWN0IHJlZ21hcF9idXMgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgYnVzX3R5cGUgKnR5cGU7CisJcmVnbWFwX2h3X3dyaXRlIHdyaXRlOworCXJlZ21hcF9od19nYXRoZXJfd3JpdGUgZ2F0aGVyX3dyaXRlOworCXJlZ21hcF9od19yZWFkIHJlYWQ7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJdTggcmVhZF9mbGFnX21hc2s7Cit9OworCitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2J1cyAqYnVzLAorCQkJICAgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKmNvbmZpZyk7CitzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfaW5pdF9pMmMoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKK3N0cnVjdCByZWdtYXAgKnJlZ21hcF9pbml0X3NwaShzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOworCit2b2lkIHJlZ21hcF9leGl0KHN0cnVjdCByZWdtYXAgKm1hcCk7CitpbnQgcmVnbWFwX3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgcmVnbWFwX3Jhd193cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsCisJCSAgICAgY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgdmFsX2xlbik7CitpbnQgcmVnbWFwX3JlYWQoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgcmVnbWFwX3Jhd19yZWFkKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKKwkJICAgIHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9sZW4pOworaW50IHJlZ21hcF9idWxrX3JlYWQoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLCB2b2lkICp2YWwsCisJCSAgICAgc2l6ZV90IHZhbF9jb3VudCk7CitpbnQgcmVnbWFwX3VwZGF0ZV9iaXRzKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKKwkJICAgICAgIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2FjbC5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19hY2wuaAppbmRleCAzZmQ4YzQ1Li5mMDk2YjgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2FjbC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfYWNsLmgKQEAgLTU5LDExICs1OSw3IEBACiAjZWxzZQogCiAjZGVmaW5lIHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsKGlub2RlKSAwCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBvc2l4X2FjbCAqcmVpc2VyZnNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKLXsKLQlyZXR1cm4gTlVMTDsKLX0KKyNkZWZpbmUgcmVpc2VyZnNfZ2V0X2FjbCBOVUxMCiAKIHN0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCmluZGV4IGVjYTc1ZGYuLjk2ZDQ2NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKQEAgLTIzMzIsNyArMjMzMiw5IEBACiBfX3UzMiB5dXJhX2hhc2goY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbik7CiBfX3UzMiByNV9oYXNoKGNvbnN0IHNpZ25lZCBjaGFyICptc2csIGludCBsZW4pOwogCisjZGVmaW5lIHJlaXNlcmZzX3NldF9sZV9iaXQJCV9fc2V0X2JpdF9sZQogI2RlZmluZSByZWlzZXJmc190ZXN0X2FuZF9zZXRfbGVfYml0CV9fdGVzdF9hbmRfc2V0X2JpdF9sZQorI2RlZmluZSByZWlzZXJmc19jbGVhcl9sZV9iaXQJCV9fY2xlYXJfYml0X2xlCiAjZGVmaW5lIHJlaXNlcmZzX3Rlc3RfYW5kX2NsZWFyX2xlX2JpdAlfX3Rlc3RfYW5kX2NsZWFyX2JpdF9sZQogI2RlZmluZSByZWlzZXJmc190ZXN0X2xlX2JpdAkJdGVzdF9iaXRfbGUKICNkZWZpbmUgcmVpc2VyZnNfZmluZF9uZXh0X3plcm9fbGVfYml0CWZpbmRfbmV4dF96ZXJvX2JpdF9sZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc194YXR0ci5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc194YXR0ci5oCmluZGV4IDZkZWVmNWQuLmMyYjcxNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfeGF0dHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX3hhdHRyLmgKQEAgLTQxLDcgKzQxLDcgQEAKIGludCByZWlzZXJmc19sb29rdXBfcHJpdnJvb3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBpbnQgcmVpc2VyZnNfZGVsZXRlX3hhdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCByZWlzZXJmc19jaG93bl94YXR0cnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRycyk7Ci1pbnQgcmVpc2VyZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKTsKK2ludCByZWlzZXJmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19GU19YQVRUUgogI2RlZmluZSBoYXNfeGF0dHJfZGlyKGlub2RlKSAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX2hhc194YXR0cl9kaXIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JpbmdfYnVmZmVyLmggYi9pbmNsdWRlL2xpbnV4L3JpbmdfYnVmZmVyLmgKaW5kZXggYWIzOGFjOC4uYjg5MWRlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yaW5nX2J1ZmZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmluZ19idWZmZXIuaApAQCAtMTY5LDcgKzE2OSw3IEBACiBzaXplX3QgcmluZ19idWZmZXJfcGFnZV9sZW4odm9pZCAqcGFnZSk7CiAKIAotdm9pZCAqcmluZ19idWZmZXJfYWxsb2NfcmVhZF9wYWdlKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyKTsKK3ZvaWQgKnJpbmdfYnVmZmVyX2FsbG9jX3JlYWRfcGFnZShzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgaW50IGNwdSk7CiB2b2lkIHJpbmdfYnVmZmVyX2ZyZWVfcmVhZF9wYWdlKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLCB2b2lkICpkYXRhKTsKIGludCByaW5nX2J1ZmZlcl9yZWFkX3BhZ2Uoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIHZvaWQgKipkYXRhX3BhZ2UsCiAJCQkgIHNpemVfdCBsZW4sIGludCBjcHUsIGludCBmdWxsKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRtdXRleC5oIGIvaW5jbHVkZS9saW51eC9ydG11dGV4LmgKaW5kZXggOGQ1MjJmZi4uZGUxNzEzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ydG11dGV4LmgKKysrIGIvaW5jbHVkZS9saW51eC9ydG11dGV4LmgKQEAgLTY2LDcgKzY2LDcgQEAKIAogI2RlZmluZSBfX1JUX01VVEVYX0lOSVRJQUxJWkVSKG11dGV4bmFtZSkgXAogCXsgLndhaXRfbG9jayA9IF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRChtdXRleG5hbWUud2FpdF9sb2NrKSBcCi0JLCAud2FpdF9saXN0ID0gUExJU1RfSEVBRF9JTklUX1JBVyhtdXRleG5hbWUud2FpdF9saXN0LCBtdXRleG5hbWUud2FpdF9sb2NrKSBcCisJLCAud2FpdF9saXN0ID0gUExJU1RfSEVBRF9JTklUKG11dGV4bmFtZS53YWl0X2xpc3QpIFwKIAksIC5vd25lciA9IE5VTEwgXAogCV9fREVCVUdfUlRfTVVURVhfSU5JVElBTElaRVIobXV0ZXhuYW1lKX0KIApAQCAtMTAwLDcgKzEwMCw3IEBACiAKICNpZmRlZiBDT05GSUdfUlRfTVVURVhFUwogIyBkZWZpbmUgSU5JVF9SVF9NVVRFWEVTKHRzaykJCQkJCQlcCi0JLnBpX3dhaXRlcnMJPSBQTElTVF9IRUFEX0lOSVQodHNrLnBpX3dhaXRlcnMsIHRzay5waV9sb2NrKSwJXAorCS5waV93YWl0ZXJzCT0gUExJU1RfSEVBRF9JTklUKHRzay5waV93YWl0ZXJzKSwJXAogCUlOSVRfUlRfTVVURVhfREVCVUcodHNrKQogI2Vsc2UKICMgZGVmaW5lIElOSVRfUlRfTVVURVhFUyh0c2spCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaAppbmRleCBiYmFkNjU3Li44ZTg3MmVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKQEAgLTU4NSw2ICs1ODUsOCBAQAogI2RlZmluZSBSVE5MR1JQX1BIT05FVF9JRkFERFIJUlROTEdSUF9QSE9ORVRfSUZBRERSCiAJUlROTEdSUF9QSE9ORVRfUk9VVEUsCiAjZGVmaW5lIFJUTkxHUlBfUEhPTkVUX1JPVVRFCVJUTkxHUlBfUEhPTkVUX1JPVVRFCisJUlROTEdSUF9EQ0IsCisjZGVmaW5lIFJUTkxHUlBfRENCCQlSVE5MR1JQX0RDQgogCV9fUlROTEdSUF9NQVgKIH07CiAjZGVmaW5lIFJUTkxHUlBfTUFYCShfX1JUTkxHUlBfTUFYIC0gMSkKQEAgLTc1OCw4ICs3NjAsNyBAQAogICogb3IgUlROTC4gTm90ZSA6IFBsZWFzZSBwcmVmZXIgcnRubF9kZXJlZmVyZW5jZSgpIG9yIHJjdV9kZXJlZmVyZW5jZSgpCiAgKi8KICNkZWZpbmUgcmN1X2RlcmVmZXJlbmNlX3J0bmwocCkJCQkJCVwKLQlyY3VfZGVyZWZlcmVuY2VfY2hlY2socCwgcmN1X3JlYWRfbG9ja19oZWxkKCkgfHwJXAotCQkJCSBsb2NrZGVwX3J0bmxfaXNfaGVsZCgpKQorCXJjdV9kZXJlZmVyZW5jZV9jaGVjayhwLCBsb2NrZGVwX3J0bmxfaXNfaGVsZCgpKQogCiAvKioKICAqIHJ0bmxfZGVyZWZlcmVuY2UgLSBmZXRjaCBSQ1UgcG9pbnRlciB3aGVuIHVwZGF0ZXMgYXJlIHByZXZlbnRlZCBieSBSVE5MCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3J3c2VtLmggYi9pbmNsdWRlL2xpbnV4L3J3c2VtLmgKaW5kZXggYThhZmU5Yy4uNzc5NTBkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yd3NlbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcndzZW0uaApAQCAtMTI0LDE5ICsxMjQsOSBAQAogICovCiBleHRlcm4gdm9pZCBkb3duX3JlYWRfbmVzdGVkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSwgaW50IHN1YmNsYXNzKTsKIGV4dGVybiB2b2lkIGRvd25fd3JpdGVfbmVzdGVkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSwgaW50IHN1YmNsYXNzKTsKLS8qCi0gKiBUYWtlL3JlbGVhc2UgYSBsb2NrIHdoZW4gbm90IHRoZSBvd25lciB3aWxsIHJlbGVhc2UgaXQuCi0gKgotICogWyBUaGlzIEFQSSBzaG91bGQgYmUgYXZvaWRlZCBhcyBtdWNoIGFzIHBvc3NpYmxlIC0gdGhlCi0gKiAgIHByb3BlciBhYnN0cmFjdGlvbiBmb3IgdGhpcyBjYXNlIGlzIGNvbXBsZXRpb25zLiBdCi0gKi8KLWV4dGVybiB2b2lkIGRvd25fcmVhZF9ub25fb3duZXIoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKTsKLWV4dGVybiB2b2lkIHVwX3JlYWRfbm9uX293bmVyKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSk7CiAjZWxzZQogIyBkZWZpbmUgZG93bl9yZWFkX25lc3RlZChzZW0sIHN1YmNsYXNzKQkJZG93bl9yZWFkKHNlbSkKICMgZGVmaW5lIGRvd25fd3JpdGVfbmVzdGVkKHNlbSwgc3ViY2xhc3MpCWRvd25fd3JpdGUoc2VtKQotIyBkZWZpbmUgZG93bl9yZWFkX25vbl9vd25lcihzZW0pCQlkb3duX3JlYWQoc2VtKQotIyBkZWZpbmUgdXBfcmVhZF9ub25fb3duZXIoc2VtKQkJCXVwX3JlYWQoc2VtKQogI2VuZGlmCiAKICNlbmRpZiAvKiBfTElOVVhfUldTRU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDJhODYyMWMuLjIwYjAzYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTgwOCw3ICs4MDgsNyBAQAogICogd2hlbiBCSVRTX1BFUl9MT05HIDw9IDMyIGFyZSBwcmV0dHkgaGlnaCBhbmQgdGhlIHJldHVybnMgZG8gbm90IGp1c3RpZnkgdGhlCiAgKiBpbmNyZWFzZWQgY29zdHMuCiAgKi8KLSNpZiBCSVRTX1BFUl9MT05HID4gMzIKKyNpZiAwIC8qIEJJVFNfUEVSX0xPTkcgPiAzMiAtLSBjdXJyZW50bHkgYnJva2VuOiBpdCBpbmNyZWFzZXMgcG93ZXIgdXNhZ2UgdW5kZXIgbGlnaHQgbG9hZCAgKi8KICMgZGVmaW5lIFNDSEVEX0xPQURfUkVTT0xVVElPTgkxMAogIyBkZWZpbmUgc2NhbGVfbG9hZCh3KQkJKCh3KSA8PCBTQ0hFRF9MT0FEX1JFU09MVVRJT04pCiAjIGRlZmluZSBzY2FsZV9sb2FkX2Rvd24odykJKCh3KSA+PiBTQ0hFRF9MT0FEX1JFU09MVVRJT04pCkBAIC04NDQsNiArODQ0LDcgQEAKICNkZWZpbmUgU0RfU0VSSUFMSVpFCQkweDA0MDAJLyogT25seSBhIHNpbmdsZSBsb2FkIGJhbGFuY2luZyBpbnN0YW5jZSAqLwogI2RlZmluZSBTRF9BU1lNX1BBQ0tJTkcJCTB4MDgwMCAgLyogUGxhY2UgYnVzeSBncm91cHMgZWFybGllciBpbiB0aGUgZG9tYWluICovCiAjZGVmaW5lIFNEX1BSRUZFUl9TSUJMSU5HCTB4MTAwMAkvKiBQcmVmZXIgdG8gcGxhY2UgdGFza3MgaW4gYSBzaWJsaW5nIGRvbWFpbiAqLworI2RlZmluZSBTRF9PVkVSTEFQCQkweDIwMDAJLyogc2NoZWRfZG9tYWlucyBvZiB0aGlzIGxldmVsIG92ZXJsYXAgKi8KIAogZW51bSBwb3dlcnNhdmluZ3NfYmFsYW5jZV9sZXZlbCB7CiAJUE9XRVJTQVZJTkdTX0JBTEFOQ0VfTk9ORSA9IDAsICAvKiBObyBwb3dlciBzYXZpbmcgbG9hZCBiYWxhbmNlICovCkBAIC04OTMsMTYgKzg5NCwyMSBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qgc2NoZWRfZ3JvdXAgewotCXN0cnVjdCBzY2hlZF9ncm91cCAqbmV4dDsJLyogTXVzdCBiZSBhIGNpcmN1bGFyIGxpc3QgKi8KK3N0cnVjdCBzY2hlZF9ncm91cF9wb3dlciB7CiAJYXRvbWljX3QgcmVmOwotCiAJLyoKIAkgKiBDUFUgcG93ZXIgb2YgdGhpcyBncm91cCwgU0NIRURfTE9BRF9TQ0FMRSBiZWluZyBtYXggcG93ZXIgZm9yIGEKIAkgKiBzaW5nbGUgQ1BVLgogCSAqLwotCXVuc2lnbmVkIGludCBjcHVfcG93ZXIsIGNwdV9wb3dlcl9vcmlnOworCXVuc2lnbmVkIGludCBwb3dlciwgcG93ZXJfb3JpZzsKK307CisKK3N0cnVjdCBzY2hlZF9ncm91cCB7CisJc3RydWN0IHNjaGVkX2dyb3VwICpuZXh0OwkvKiBNdXN0IGJlIGEgY2lyY3VsYXIgbGlzdCAqLworCWF0b21pY190IHJlZjsKKwogCXVuc2lnbmVkIGludCBncm91cF93ZWlnaHQ7CisJc3RydWN0IHNjaGVkX2dyb3VwX3Bvd2VyICpzZ3A7CiAKIAkvKgogCSAqIFRoZSBDUFVzIHRoaXMgZ3JvdXAgY292ZXJzLgpAQCAtMTA2Myw2ICsxMDY5LDcgQEAKICAqLwogI2RlZmluZSBXRl9TWU5DCQkweDAxCQkvKiB3YWtlciBnb2VzIHRvIHNsZWVwIGFmdGVyIHdha3VwICovCiAjZGVmaW5lIFdGX0ZPUksJCTB4MDIJCS8qIGNoaWxkIHdha2V1cCBhZnRlciBmb3JrICovCisjZGVmaW5lIFdGX01JR1JBVEVECTB4MDQJCS8qIGludGVybmFsIHVzZSwgdGFzayBnb3QgbWlncmF0ZWQgKi8KIAogI2RlZmluZSBFTlFVRVVFX1dBS0VVUAkJMQogI2RlZmluZSBFTlFVRVVFX0hFQUQJCTIKQEAgLTEyNTMsNiArMTI2MCw5IEBACiAjaWZkZWYgQ09ORklHX1BSRUVNUFRfUkNVCiAJaW50IHJjdV9yZWFkX2xvY2tfbmVzdGluZzsKIAljaGFyIHJjdV9yZWFkX3VubG9ja19zcGVjaWFsOworI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgZGVmaW5lZChDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSkKKwlpbnQgcmN1X2Jvb3N0ZWQ7CisjZW5kaWYgLyogI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgZGVmaW5lZChDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSkgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHJjdV9ub2RlX2VudHJ5OwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUFJFRU1QVF9SQ1UgKi8KICNpZmRlZiBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVQpAQCAtMTI4Miw3ICsxMjkyLDcgQEAKIAlpbnQgZXhpdF9zdGF0ZTsKIAlpbnQgZXhpdF9jb2RlLCBleGl0X3NpZ25hbDsKIAlpbnQgcGRlYXRoX3NpZ25hbDsgIC8qICBUaGUgc2lnbmFsIHNlbnQgd2hlbiB0aGUgcGFyZW50IGRpZXMgICovCi0JdW5zaWduZWQgaW50IGdyb3VwX3N0b3A7CS8qIEdST1VQX1NUT1BfKiwgc2lnbG9jayBwcm90ZWN0ZWQgKi8KKwl1bnNpZ25lZCBpbnQgam9iY3RsOwkvKiBKT0JDVExfKiwgc2lnbG9jayBwcm90ZWN0ZWQgKi8KIAkvKiA/Pz8gKi8KIAl1bnNpZ25lZCBpbnQgcGVyc29uYWxpdHk7CiAJdW5zaWduZWQgZGlkX2V4ZWM6MTsKQEAgLTE1MDIsNyArMTUxMiw2IEBACiAJc2hvcnQgaWxfbmV4dDsKIAlzaG9ydCBwcmVmX25vZGVfZm9yazsKICNlbmRpZgotCWF0b21pY190IGZzX2V4Y2w7CS8qIGhvbGRpbmcgZnMgZXhjbHVzaXZlIHJlc291cmNlcyAqLwogCXN0cnVjdCByY3VfaGVhZCByY3U7CiAKIAkvKgpAQCAtMTgwMywxNSArMTgxMiwzNCBAQAogI2RlZmluZSB1c2VkX21hdGgoKSB0c2tfdXNlZF9tYXRoKGN1cnJlbnQpCiAKIC8qCi0gKiB0YXNrLT5ncm91cF9zdG9wIGZsYWdzCisgKiB0YXNrLT5qb2JjdGwgZmxhZ3MKICAqLwotI2RlZmluZSBHUk9VUF9TVE9QX1NJR01BU0sJMHhmZmZmICAgIC8qIHNpZ25yIG9mIHRoZSBsYXN0IGdyb3VwIHN0b3AgKi8KLSNkZWZpbmUgR1JPVVBfU1RPUF9QRU5ESU5HCSgxIDw8IDE2KSAvKiB0YXNrIHNob3VsZCBzdG9wIGZvciBncm91cCBzdG9wICovCi0jZGVmaW5lIEdST1VQX1NUT1BfQ09OU1VNRQkoMSA8PCAxNykgLyogY29uc3VtZSBncm91cCBzdG9wIGNvdW50ICovCi0jZGVmaW5lIEdST1VQX1NUT1BfVFJBUFBJTkcJKDEgPDwgMTgpIC8qIHN3aXRjaGluZyBmcm9tIFNUT1BQRUQgdG8gVFJBQ0VEICovCi0jZGVmaW5lIEdST1VQX1NUT1BfREVRVUVVRUQJKDEgPDwgMTkpIC8qIHN0b3Agc2lnbmFsIGRlcXVldWVkICovCisjZGVmaW5lIEpPQkNUTF9TVE9QX1NJR01BU0sJMHhmZmZmCS8qIHNpZ25yIG9mIHRoZSBsYXN0IGdyb3VwIHN0b3AgKi8KIAotZXh0ZXJuIHZvaWQgdGFza19jbGVhcl9ncm91cF9zdG9wX3BlbmRpbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKKyNkZWZpbmUgSk9CQ1RMX1NUT1BfREVRVUVVRURfQklUIDE2CS8qIHN0b3Agc2lnbmFsIGRlcXVldWVkICovCisjZGVmaW5lIEpPQkNUTF9TVE9QX1BFTkRJTkdfQklUCTE3CS8qIHRhc2sgc2hvdWxkIHN0b3AgZm9yIGdyb3VwIHN0b3AgKi8KKyNkZWZpbmUgSk9CQ1RMX1NUT1BfQ09OU1VNRV9CSVQJMTgJLyogY29uc3VtZSBncm91cCBzdG9wIGNvdW50ICovCisjZGVmaW5lIEpPQkNUTF9UUkFQX1NUT1BfQklUCTE5CS8qIHRyYXAgZm9yIFNUT1AgKi8KKyNkZWZpbmUgSk9CQ1RMX1RSQVBfTk9USUZZX0JJVAkyMAkvKiB0cmFwIGZvciBOT1RJRlkgKi8KKyNkZWZpbmUgSk9CQ1RMX1RSQVBQSU5HX0JJVAkyMQkvKiBzd2l0Y2hpbmcgdG8gVFJBQ0VEICovCisjZGVmaW5lIEpPQkNUTF9MSVNURU5JTkdfQklUCTIyCS8qIHB0cmFjZXIgaXMgbGlzdGVuaW5nIGZvciBldmVudHMgKi8KKworI2RlZmluZSBKT0JDVExfU1RPUF9ERVFVRVVFRAkoMSA8PCBKT0JDVExfU1RPUF9ERVFVRVVFRF9CSVQpCisjZGVmaW5lIEpPQkNUTF9TVE9QX1BFTkRJTkcJKDEgPDwgSk9CQ1RMX1NUT1BfUEVORElOR19CSVQpCisjZGVmaW5lIEpPQkNUTF9TVE9QX0NPTlNVTUUJKDEgPDwgSk9CQ1RMX1NUT1BfQ09OU1VNRV9CSVQpCisjZGVmaW5lIEpPQkNUTF9UUkFQX1NUT1AJKDEgPDwgSk9CQ1RMX1RSQVBfU1RPUF9CSVQpCisjZGVmaW5lIEpPQkNUTF9UUkFQX05PVElGWQkoMSA8PCBKT0JDVExfVFJBUF9OT1RJRllfQklUKQorI2RlZmluZSBKT0JDVExfVFJBUFBJTkcJCSgxIDw8IEpPQkNUTF9UUkFQUElOR19CSVQpCisjZGVmaW5lIEpPQkNUTF9MSVNURU5JTkcJKDEgPDwgSk9CQ1RMX0xJU1RFTklOR19CSVQpCisKKyNkZWZpbmUgSk9CQ1RMX1RSQVBfTUFTSwkoSk9CQ1RMX1RSQVBfU1RPUCB8IEpPQkNUTF9UUkFQX05PVElGWSkKKyNkZWZpbmUgSk9CQ1RMX1BFTkRJTkdfTUFTSwkoSk9CQ1RMX1NUT1BfUEVORElORyB8IEpPQkNUTF9UUkFQX01BU0spCisKK2V4dGVybiBib29sIHRhc2tfc2V0X2pvYmN0bF9wZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgICAgdW5zaWduZWQgaW50IG1hc2spOworZXh0ZXJuIHZvaWQgdGFza19jbGVhcl9qb2JjdGxfdHJhcHBpbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKK2V4dGVybiB2b2lkIHRhc2tfY2xlYXJfam9iY3RsX3BlbmRpbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBtYXNrKTsKIAogI2lmZGVmIENPTkZJR19QUkVFTVBUX1JDVQogCkBAIC0yMTI2LDcgKzIxNTQsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzay0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJldDsKLX0JCit9CiAKIGV4dGVybiB2b2lkIGJsb2NrX2FsbF9zaWduYWxzKGludCAoKm5vdGlmaWVyKSh2b2lkICpwcml2KSwgdm9pZCAqcHJpdiwKIAkJCSAgICAgIHNpZ3NldF90ICptYXNrKTsKQEAgLTIxNDEsNyArMjE2OSw3IEBACiBleHRlcm4gaW50IGtpbGxfcGdycChzdHJ1Y3QgcGlkICpwaWQsIGludCBzaWcsIGludCBwcml2KTsKIGV4dGVybiBpbnQga2lsbF9waWQoc3RydWN0IHBpZCAqcGlkLCBpbnQgc2lnLCBpbnQgcHJpdik7CiBleHRlcm4gaW50IGtpbGxfcHJvY19pbmZvKGludCwgc3RydWN0IHNpZ2luZm8gKiwgcGlkX3QpOwotZXh0ZXJuIGludCBkb19ub3RpZnlfcGFyZW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBpbnQpOworZXh0ZXJuIF9fbXVzdF9jaGVjayBib29sIGRvX25vdGlmeV9wYXJlbnQoc3RydWN0IHRhc2tfc3RydWN0ICosIGludCk7CiBleHRlcm4gdm9pZCBfX3dha2VfdXBfcGFyZW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHRhc2tfc3RydWN0ICpwYXJlbnQpOwogZXh0ZXJuIHZvaWQgZm9yY2Vfc2lnKGludCwgc3RydWN0IHRhc2tfc3RydWN0ICopOwogZXh0ZXJuIGludCBzZW5kX3NpZyhpbnQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBpbnQpOwpAQCAtMjI2NSw4ICsyMjkzLDEwIEBACiAJcmV0dXJuIHRzay0+c2lnbmFsLT5ucl90aHJlYWRzOwogfQogCi0vKiBkZV90aHJlYWQgZGVwZW5kcyBvbiB0aHJlYWRfZ3JvdXBfbGVhZGVyIG5vdCBiZWluZyBhIHBpZCBiYXNlZCBjaGVjayAqLwotI2RlZmluZSB0aHJlYWRfZ3JvdXBfbGVhZGVyKHApCShwID09IHAtPmdyb3VwX2xlYWRlcikKK3N0YXRpYyBpbmxpbmUgYm9vbCB0aHJlYWRfZ3JvdXBfbGVhZGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcC0+ZXhpdF9zaWduYWwgPj0gMDsKK30KIAogLyogRG8gdG8gdGhlIGluc2FuaXRpZXMgb2YgZGVfdGhyZWFkIGl0IGlzIHBvc3NpYmxlIGZvciBhIHByb2Nlc3MKICAqIHRvIGhhdmUgdGhlIHBpZCBvZiB0aGUgdGhyZWFkIGdyb3VwIGxlYWRlciB3aXRob3V0IGFjdHVhbGx5IGJlaW5nCkBAIC0yMjk5LDExICsyMzI5LDYgQEAKICNkZWZpbmUgZGVsYXlfZ3JvdXBfbGVhZGVyKHApIFwKIAkJKHRocmVhZF9ncm91cF9sZWFkZXIocCkgJiYgIXRocmVhZF9ncm91cF9lbXB0eShwKSkKIAotc3RhdGljIGlubGluZSBpbnQgdGFza19kZXRhY2hlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0JcmV0dXJuIHAtPmV4aXRfc2lnbmFsID09IC0xOwotfQotCiAvKgogICogUHJvdGVjdHMgLT5mcywgLT5maWxlcywgLT5tbSwgLT5ncm91cF9pbmZvLCAtPmNvbW0sIGtleXJpbmcKICAqIHN1YnNjcmlwdGlvbnMgYW5kIHN5bmNocm9uaXNlcyB3aXRoIHdhaXQ0KCkuICBBbHNvIHVzZWQgaW4gcHJvY2ZzLiAgQWxzbwpAQCAtMjUwMCw3ICsyNTI1LDcgQEAKIAogZXh0ZXJuIGludCBfX2NvbmRfcmVzY2hlZF9sb2NrKHNwaW5sb2NrX3QgKmxvY2spOwogCi0jaWZkZWYgQ09ORklHX1BSRUVNUFQKKyNpZmRlZiBDT05GSUdfUFJFRU1QVF9DT1VOVAogI2RlZmluZSBQUkVFTVBUX0xPQ0tfT0ZGU0VUCVBSRUVNUFRfT0ZGU0VUCiAjZWxzZQogI2RlZmluZSBQUkVFTVBUX0xPQ0tfT0ZGU0VUCTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2RsYS5oIGIvaW5jbHVkZS9saW51eC9zZGxhLmgKaW5kZXggNTY0YWNkMy4uOTk5NWM3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZGxhLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZGxhLmgKQEAgLTExMiwxMSArMTEyLDcgQEAKICAgIHNob3J0IFRiX21heDsKIH07CiAKLSNpZm5kZWYgX19LRVJORUxfXwotCi12b2lkIHNkbGEodm9pZCAqY2ZnX2luZm8sIGNoYXIgKmRldiwgc3RydWN0IGZyYWRfY29uZiAqY29uZiwgaW50IHF1aWV0KTsKLQotI2Vsc2UKKyNpZmRlZiBfX0tFUk5FTF9fCiAKIC8qIGltcG9ydGFudCBaODAgd2luZG93IGFkZHJlc3NlcyAqLwogI2RlZmluZSBTRExBX0NPTlRST0xfV05ECQkweEUwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VjY29tcC5oIGIvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKaW5kZXggMTY3YzMzMy4uY2M3YTRlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZWNjb21wLmgKQEAgLTE5LDYgKzE5LDExIEBACiBleHRlcm4gbG9uZyBwcmN0bF9nZXRfc2VjY29tcCh2b2lkKTsKIGV4dGVybiBsb25nIHByY3RsX3NldF9zZWNjb21wKHVuc2lnbmVkIGxvbmcpOwogCitzdGF0aWMgaW5saW5lIGludCBzZWNjb21wX21vZGUoc2VjY29tcF90ICpzKQoreworCXJldHVybiBzLT5tb2RlOworfQorCiAjZWxzZSAvKiBDT05GSUdfU0VDQ09NUCAqLwogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTM3LDYgKzQyLDExIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNlY2NvbXBfbW9kZShzZWNjb21wX3QgKnMpCit7CisJcmV0dXJuIDA7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfU0VDQ09NUCAqLwogCiAjZW5kaWYgLyogX0xJTlVYX1NFQ0NPTVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IDhjZTU5ZWYuLmViZDJhNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTE0NTYsNyArMTQ1Niw3IEBACiAJCQkgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSk7CiAJaW50ICgqaW5vZGVfcmVhZGxpbmspIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogCWludCAoKmlub2RlX2ZvbGxvd19saW5rKSAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7Ci0JaW50ICgqaW5vZGVfcGVybWlzc2lvbikgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBmbGFncyk7CisJaW50ICgqaW5vZGVfcGVybWlzc2lvbikgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKTsKIAlpbnQgKCppbm9kZV9zZXRhdHRyKQkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwogCWludCAoKmlub2RlX2dldGF0dHIpIChzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIAlpbnQgKCppbm9kZV9zZXR4YXR0cikgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKQEAgLTE3MjAsNyArMTcyMCw2IEBACiBpbnQgc2VjdXJpdHlfaW5vZGVfcmVhZGxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIGludCBzZWN1cml0eV9pbm9kZV9mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKIGludCBzZWN1cml0eV9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKTsKLWludCBzZWN1cml0eV9pbm9kZV9leGVjX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKIGludCBzZWN1cml0eV9pbm9kZV9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKTsKIGludCBzZWN1cml0eV9pbm9kZV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogaW50IHNlY3VyaXR5X2lub2RlX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKQEAgLTIxMTMsMTIgKzIxMTIsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9leGVjX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkJICBzdHJ1Y3QgaWF0dHIgKmF0dHIpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcV9maWxlLmggYi9pbmNsdWRlL2xpbnV4L3NlcV9maWxlLmgKaW5kZXggMDNjMDIzMi4uYmU3MjBjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXFfZmlsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VxX2ZpbGUuaApAQCAtMjMsNiArMjMsNyBAQAogCXU2NCB2ZXJzaW9uOwogCXN0cnVjdCBtdXRleCBsb2NrOwogCWNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyAqb3A7CisJaW50IHBvbGxfZXZlbnQ7CiAJdm9pZCAqcHJpdmF0ZTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VxbG9jay5oIGIvaW5jbHVkZS9saW51eC9zZXFsb2NrLmgKaW5kZXggZTk4MTE4OS4uYzZkYjlmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXFsb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXFsb2NrLmgKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAogdHlwZWRlZiBzdHJ1Y3QgewogCXVuc2lnbmVkIHNlcXVlbmNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oIGIvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oCmluZGV4IDJiN2ZlYzguLmFhMDhmYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2htZW1fZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmgKQEAgLTMsNiArMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9jb3VudGVyLmg+CiAKIC8qIGlub2RlIGluLWtlcm5lbCBkYXRhICovCkBAIC00NSw3ICs0NiwyNyBAQAogCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpOwogfQogCisvKgorICogRnVuY3Rpb25zIGluIG1tL3NobWVtLmMgY2FsbGVkIGRpcmVjdGx5IGZyb20gZWxzZXdoZXJlOgorICovCiBleHRlcm4gaW50IGluaXRfdG1wZnModm9pZCk7CiBleHRlcm4gaW50IHNobWVtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCk7CitleHRlcm4gc3RydWN0IGZpbGUgKnNobWVtX2ZpbGVfc2V0dXAoY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJbG9mZl90IHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZXh0ZXJuIGludCBzaG1lbV96ZXJvX3NldHVwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKK2V4dGVybiBpbnQgc2htZW1fbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGxvY2ssIHN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcik7CitleHRlcm4gc3RydWN0IHBhZ2UgKnNobWVtX3JlYWRfbWFwcGluZ19wYWdlX2dmcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkJcGdvZmZfdCBpbmRleCwgZ2ZwX3QgZ2ZwX21hc2spOworZXh0ZXJuIHZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKTsKK2V4dGVybiBpbnQgc2htZW1fdW51c2Uoc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfZ2V0X3NobWVtX3RhcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBwZ29mZl90IHBnb2ZmLAorCQkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCBzd3BfZW50cnlfdCAqZW50KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2UoCisJCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgaW5kZXgpCit7CisJcmV0dXJuIHNobWVtX3JlYWRfbWFwcGluZ19wYWdlX2dmcChtYXBwaW5nLCBpbmRleCwKKwkJCQkJbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7Cit9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaHJpbmtlci5oIGIvaW5jbHVkZS9saW51eC9zaHJpbmtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MDY1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3Nocmlua2VyLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBfTElOVVhfU0hSSU5LRVJfSAorI2RlZmluZSBfTElOVVhfU0hSSU5LRVJfSAorCisvKgorICogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGZyb20gcGFnZSByZWNsYWltIHRvIHRoZSBzaHJpbmtlcnMuCisgKiBXZSBjb25zb2xpZGF0ZSB0aGUgdmFsdWVzIGZvciBlYXNpZXIgZXh0ZW50aW9uIGxhdGVyLgorICovCitzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgeworCWdmcF90IGdmcF9tYXNrOworCisJLyogSG93IG1hbnkgc2xhYiBvYmplY3RzIHNocmlua2VyKCkgc2hvdWxkIHNjYW4gYW5kIHRyeSB0byByZWNsYWltICovCisJdW5zaWduZWQgbG9uZyBucl90b19zY2FuOworfTsKKworLyoKKyAqIEEgY2FsbGJhY2sgeW91IGNhbiByZWdpc3RlciB0byBhcHBseSBwcmVzc3VyZSB0byBhZ2VhYmxlIGNhY2hlcy4KKyAqCisgKiAnc2MnIGlzIHBhc3NlZCBzaHJpbmtfY29udHJvbCB3aGljaCBpbmNsdWRlcyBhIGNvdW50ICducl90b19zY2FuJworICogYW5kIGEgJ2dmcG1hc2snLiAgSXQgc2hvdWxkIGxvb2sgdGhyb3VnaCB0aGUgbGVhc3QtcmVjZW50bHktdXNlZAorICogJ25yX3RvX3NjYW4nIGVudHJpZXMgYW5kIGF0dGVtcHQgdG8gZnJlZSB0aGVtIHVwLiAgSXQgc2hvdWxkIHJldHVybgorICogdGhlIG51bWJlciBvZiBvYmplY3RzIHdoaWNoIHJlbWFpbiBpbiB0aGUgY2FjaGUuICBJZiBpdCByZXR1cm5zIC0xLCBpdCBtZWFucworICogaXQgY2Fubm90IGRvIGFueSBzY2FubmluZyBhdCB0aGlzIHRpbWUgKGVnLiB0aGVyZSBpcyBhIHJpc2sgb2YgZGVhZGxvY2spLgorICoKKyAqIFRoZSAnZ2ZwbWFzaycgcmVmZXJzIHRvIHRoZSBhbGxvY2F0aW9uIHdlIGFyZSBjdXJyZW50bHkgdHJ5aW5nIHRvCisgKiBmdWxmaWwuCisgKgorICogTm90ZSB0aGF0ICdzaHJpbmsnIHdpbGwgYmUgcGFzc2VkIG5yX3RvX3NjYW4gPT0gMCB3aGVuIHRoZSBWTSBpcworICogcXVlcnlpbmcgdGhlIGNhY2hlIHNpemUsIHNvIGEgZmFzdHBhdGggZm9yIHRoYXQgY2FzZSBpcyBhcHByb3ByaWF0ZS4KKyAqLworc3RydWN0IHNocmlua2VyIHsKKwlpbnQgKCpzaHJpbmspKHN0cnVjdCBzaHJpbmtlciAqLCBzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKTsKKwlpbnQgc2Vla3M7CS8qIHNlZWtzIHRvIHJlY3JlYXRlIGFuIG9iaiAqLworCWxvbmcgYmF0Y2g7CS8qIHJlY2xhaW0gYmF0Y2ggc2l6ZSwgMCA9IGRlZmF1bHQgKi8KKworCS8qIFRoZXNlIGFyZSBmb3IgaW50ZXJuYWwgdXNlICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWxvbmcgbnI7CS8qIG9ianMgcGVuZGluZyBkZWxldGUgKi8KK307CisjZGVmaW5lIERFRkFVTFRfU0VFS1MgMiAvKiBBIGdvb2QgbnVtYmVyIGlmIHlvdSBkb24ndCBrbm93IGJldHRlci4gKi8KK2V4dGVybiB2b2lkIHJlZ2lzdGVyX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqKTsKK2V4dGVybiB2b2lkIHVucmVnaXN0ZXJfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICopOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaAppbmRleCBlOGI3OGNlLi5hMjQyMThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKQEAgLTE4Nyw2ICsxODcsMjAgQEAKIAogCS8qIGVuc3VyZSB0aGUgb3JpZ2luYXRpbmcgc2sgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZSBvbiBkcml2ZXIgbGV2ZWwgKi8KIAlTS0JUWF9EUlZfTkVFRFNfU0tfUkVGID0gMSA8PCAzLAorCisJLyogZGV2aWNlIGRyaXZlciBzdXBwb3J0cyBUWCB6ZXJvLWNvcHkgYnVmZmVycyAqLworCVNLQlRYX0RFVl9aRVJPQ09QWSA9IDEgPDwgNCwKK307CisKKy8qCisgKiBUaGUgY2FsbGJhY2sgbm90aWZpZXMgdXNlcnNwYWNlIHRvIHJlbGVhc2UgYnVmZmVycyB3aGVuIHNrYiBETUEgaXMgZG9uZSBpbgorICogbG93ZXIgZGV2aWNlLCB0aGUgc2tiIGxhc3QgcmVmZXJlbmNlIHNob3VsZCBiZSAwIHdoZW4gY2FsbGluZyB0aGlzLgorICogVGhlIGRlc2MgaXMgdXNlZCB0byB0cmFjayB1c2Vyc3BhY2UgYnVmZmVyIGluZGV4LgorICovCitzdHJ1Y3QgdWJ1Zl9pbmZvIHsKKwl2b2lkICgqY2FsbGJhY2spKHZvaWQgKik7CisJdm9pZCAqYXJnOworCXVuc2lnbmVkIGxvbmcgZGVzYzsKIH07CiAKIC8qIFRoaXMgZGF0YSBpcyBpbnZhcmlhbnQgYWNyb3NzIGNsb25lcyBhbmQgbGl2ZXMgYXQKQEAgLTIxMSw2ICsyMjUsNyBAQAogCS8qIEludGVybWVkaWF0ZSBsYXllcnMgbXVzdCBlbnN1cmUgdGhhdCBkZXN0cnVjdG9yX2FyZwogCSAqIHJlbWFpbnMgdmFsaWQgdW50aWwgc2tiIGRlc3RydWN0b3IgKi8KIAl2b2lkICoJCWRlc3RydWN0b3JfYXJnOworCiAJLyogbXVzdCBiZSBsYXN0IGZpZWxkLCBzZWUgcHNrYl9leHBhbmRfaGVhZCgpICovCiAJc2tiX2ZyYWdfdAlmcmFnc1tNQVhfU0tCX0ZSQUdTXTsKIH07CkBAIC0yNzAsMTUgKzI4NSwxMiBAQAogICoJc3RydWN0IHNrX2J1ZmYgLSBzb2NrZXQgYnVmZmVyCiAgKglAbmV4dDogTmV4dCBidWZmZXIgaW4gbGlzdAogICoJQHByZXY6IFByZXZpb3VzIGJ1ZmZlciBpbiBsaXN0Ci0gKglAc2s6IFNvY2tldCB3ZSBhcmUgb3duZWQgYnkKICAqCUB0c3RhbXA6IFRpbWUgd2UgYXJyaXZlZAorICoJQHNrOiBTb2NrZXQgd2UgYXJlIG93bmVkIGJ5CiAgKglAZGV2OiBEZXZpY2Ugd2UgYXJyaXZlZCBvbi9hcmUgbGVhdmluZyBieQotICoJQHRyYW5zcG9ydF9oZWFkZXI6IFRyYW5zcG9ydCBsYXllciBoZWFkZXIKLSAqCUBuZXR3b3JrX2hlYWRlcjogTmV0d29yayBsYXllciBoZWFkZXIKLSAqCUBtYWNfaGVhZGVyOiBMaW5rIGxheWVyIGhlYWRlcgorICoJQGNiOiBDb250cm9sIGJ1ZmZlci4gRnJlZSBmb3IgdXNlIGJ5IGV2ZXJ5IGxheWVyLiBQdXQgcHJpdmF0ZSB2YXJzIGhlcmUKICAqCUBfc2tiX3JlZmRzdDogZGVzdGluYXRpb24gZW50cnkgKHdpdGggbm9yZWZjb3VudCBiaXQpCiAgKglAc3A6IHRoZSBzZWN1cml0eSBwYXRoLCB1c2VkIGZvciB4ZnJtCi0gKglAY2I6IENvbnRyb2wgYnVmZmVyLiBGcmVlIGZvciB1c2UgYnkgZXZlcnkgbGF5ZXIuIFB1dCBwcml2YXRlIHZhcnMgaGVyZQogICoJQGxlbjogTGVuZ3RoIG9mIGFjdHVhbCBkYXRhCiAgKglAZGF0YV9sZW46IERhdGEgbGVuZ3RoCiAgKglAbWFjX2xlbjogTGVuZ3RoIG9mIGxpbmsgbGF5ZXIgaGVhZGVyCkBAIC0yODYsNDAgKzI5OCw0NSBAQAogICoJQGNzdW06IENoZWNrc3VtIChtdXN0IGluY2x1ZGUgc3RhcnQvb2Zmc2V0IHBhaXIpCiAgKglAY3N1bV9zdGFydDogT2Zmc2V0IGZyb20gc2tiLT5oZWFkIHdoZXJlIGNoZWNrc3VtbWluZyBzaG91bGQgc3RhcnQKICAqCUBjc3VtX29mZnNldDogT2Zmc2V0IGZyb20gY3N1bV9zdGFydCB3aGVyZSBjaGVja3N1bSBzaG91bGQgYmUgc3RvcmVkCisgKglAcHJpb3JpdHk6IFBhY2tldCBxdWV1ZWluZyBwcmlvcml0eQogICoJQGxvY2FsX2RmOiBhbGxvdyBsb2NhbCBmcmFnbWVudGF0aW9uCiAgKglAY2xvbmVkOiBIZWFkIG1heSBiZSBjbG9uZWQgKGNoZWNrIHJlZmNudCB0byBiZSBzdXJlKQorICoJQGlwX3N1bW1lZDogRHJpdmVyIGZlZCB1cyBhbiBJUCBjaGVja3N1bQogICoJQG5vaGRyOiBQYXlsb2FkIHJlZmVyZW5jZSBvbmx5LCBtdXN0IG5vdCBtb2RpZnkgaGVhZGVyCisgKglAbmZjdGluZm86IFJlbGF0aW9uc2hpcCBvZiB0aGlzIHNrYiB0byB0aGUgY29ubmVjdGlvbgogICoJQHBrdF90eXBlOiBQYWNrZXQgY2xhc3MKICAqCUBmY2xvbmU6IHNrYnVmZiBjbG9uZSBzdGF0dXMKLSAqCUBpcF9zdW1tZWQ6IERyaXZlciBmZWQgdXMgYW4gSVAgY2hlY2tzdW0KLSAqCUBwcmlvcml0eTogUGFja2V0IHF1ZXVlaW5nIHByaW9yaXR5Ci0gKglAdXNlcnM6IFVzZXIgY291bnQgLSBzZWUge2RhdGFncmFtLHRjcH0uYwotICoJQHByb3RvY29sOiBQYWNrZXQgcHJvdG9jb2wgZnJvbSBkcml2ZXIKLSAqCUB0cnVlc2l6ZTogQnVmZmVyIHNpemUgCi0gKglAaGVhZDogSGVhZCBvZiBidWZmZXIKLSAqCUBkYXRhOiBEYXRhIGhlYWQgcG9pbnRlcgotICoJQHRhaWw6IFRhaWwgcG9pbnRlcgotICoJQGVuZDogRW5kIHBvaW50ZXIKLSAqCUBkZXN0cnVjdG9yOiBEZXN0cnVjdCBmdW5jdGlvbgotICoJQG1hcms6IEdlbmVyaWMgcGFja2V0IG1hcmsKLSAqCUBuZmN0OiBBc3NvY2lhdGVkIGNvbm5lY3Rpb24sIGlmIGFueQogICoJQGlwdnNfcHJvcGVydHk6IHNrYnVmZiBpcyBvd25lZCBieSBpcHZzCiAgKglAcGVla2VkOiB0aGlzIHBhY2tldCBoYXMgYmVlbiBzZWVuIGFscmVhZHksIHNvIHN0YXRzIGhhdmUgYmVlbgogICoJCWRvbmUgZm9yIGl0LCBkb24ndCBkbyB0aGVtIGFnYWluCiAgKglAbmZfdHJhY2U6IG5ldGZpbHRlciBwYWNrZXQgdHJhY2UgZmxhZwotICoJQG5mY3RpbmZvOiBSZWxhdGlvbnNoaXAgb2YgdGhpcyBza2IgdG8gdGhlIGNvbm5lY3Rpb24KKyAqCUBwcm90b2NvbDogUGFja2V0IHByb3RvY29sIGZyb20gZHJpdmVyCisgKglAZGVzdHJ1Y3RvcjogRGVzdHJ1Y3QgZnVuY3Rpb24KKyAqCUBuZmN0OiBBc3NvY2lhdGVkIGNvbm5lY3Rpb24sIGlmIGFueQogICoJQG5mY3RfcmVhc206IG5ldGZpbHRlciBjb25udHJhY2sgcmUtYXNzZW1ibHkgcG9pbnRlcgogICoJQG5mX2JyaWRnZTogU2F2ZWQgZGF0YSBhYm91dCBhIGJyaWRnZWQgZnJhbWUgLSBzZWUgYnJfbmV0ZmlsdGVyLmMKICAqCUBza2JfaWlmOiBpZmluZGV4IG9mIGRldmljZSB3ZSBhcnJpdmVkIG9uCi0gKglAcnhoYXNoOiB0aGUgcGFja2V0IGhhc2ggY29tcHV0ZWQgb24gcmVjZWl2ZQotICoJQHF1ZXVlX21hcHBpbmc6IFF1ZXVlIG1hcHBpbmcgZm9yIG11bHRpcXVldWUgZGV2aWNlcwogICoJQHRjX2luZGV4OiBUcmFmZmljIGNvbnRyb2wgaW5kZXgKICAqCUB0Y192ZXJkOiB0cmFmZmljIGNvbnRyb2wgdmVyZGljdAorICoJQHJ4aGFzaDogdGhlIHBhY2tldCBoYXNoIGNvbXB1dGVkIG9uIHJlY2VpdmUKKyAqCUBxdWV1ZV9tYXBwaW5nOiBRdWV1ZSBtYXBwaW5nIGZvciBtdWx0aXF1ZXVlIGRldmljZXMKICAqCUBuZGlzY19ub2RldHlwZTogcm91dGVyIHR5cGUgKGZyb20gbGluayBsYXllcikKKyAqCUBvb29fb2theTogYWxsb3cgdGhlIG1hcHBpbmcgb2YgYSBzb2NrZXQgdG8gYSBxdWV1ZSB0byBiZSBjaGFuZ2VkCiAgKglAZG1hX2Nvb2tpZTogYSBjb29raWUgdG8gb25lIG9mIHNldmVyYWwgcG9zc2libGUgRE1BIG9wZXJhdGlvbnMKICAqCQlkb25lIGJ5IHNrYiBETUEgZnVuY3Rpb25zCiAgKglAc2VjbWFyazogc2VjdXJpdHkgbWFya2luZworICoJQG1hcms6IEdlbmVyaWMgcGFja2V0IG1hcmsKKyAqCUBkcm9wY291bnQ6IHRvdGFsIG51bWJlciBvZiBza19yZWNlaXZlX3F1ZXVlIG92ZXJmbG93cwogICoJQHZsYW5fdGNpOiB2bGFuIHRhZyBjb250cm9sIGluZm9ybWF0aW9uCisgKglAdHJhbnNwb3J0X2hlYWRlcjogVHJhbnNwb3J0IGxheWVyIGhlYWRlcgorICoJQG5ldHdvcmtfaGVhZGVyOiBOZXR3b3JrIGxheWVyIGhlYWRlcgorICoJQG1hY19oZWFkZXI6IExpbmsgbGF5ZXIgaGVhZGVyCisgKglAdGFpbDogVGFpbCBwb2ludGVyCisgKglAZW5kOiBFbmQgcG9pbnRlcgorICoJQGhlYWQ6IEhlYWQgb2YgYnVmZmVyCisgKglAZGF0YTogRGF0YSBoZWFkIHBvaW50ZXIKKyAqCUB0cnVlc2l6ZTogQnVmZmVyIHNpemUKKyAqCUB1c2VyczogVXNlciBjb3VudCAtIHNlZSB7ZGF0YWdyYW0sdGNwfS5jCiAgKi8KIAogc3RydWN0IHNrX2J1ZmYgewpAQCAtMTI1Niw2ICsxMjczLDExIEBACiAJc2tiLT50YWlsICs9IGxlbjsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNrYl9yZXNldF9tYWNfbGVuKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5tYWNfbGVuID0gc2tiLT5uZXR3b3JrX2hlYWRlciAtIHNrYi0+bWFjX2hlYWRlcjsKK30KKwogI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpza2JfdHJhbnNwb3J0X2hlYWRlcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTU1NywxNiArMTU3OSwyMiBAQAogCXJldHVybiBfX25ldGRldl9hbGxvY19za2IoZGV2LCBsZW5ndGgsIEdGUF9BVE9NSUMpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCXVuc2lnbmVkIGludCBsZW5ndGgpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpfX25ldGRldl9hbGxvY19za2JfaXBfYWxpZ24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJdW5zaWduZWQgaW50IGxlbmd0aCwgZ2ZwX3QgZ2ZwKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgbGVuZ3RoICsgTkVUX0lQX0FMSUdOKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19uZXRkZXZfYWxsb2Nfc2tiKGRldiwgbGVuZ3RoICsgTkVUX0lQX0FMSUdOLCBnZnApOwogCiAJaWYgKE5FVF9JUF9BTElHTiAmJiBza2IpCiAJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKIAlyZXR1cm4gc2tiOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJcmV0dXJuIF9fbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihkZXYsIGxlbmd0aCwgR0ZQX0FUT01JQyk7Cit9CisKIC8qKgogICoJX19uZXRkZXZfYWxsb2NfcGFnZSAtIGFsbG9jYXRlIGEgcGFnZSBmb3IgcHMtcnggb24gYSBzcGVjaWZpYyBkZXZpY2UKICAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIHJlY2VpdmUgb24KQEAgLTIwMjMsOCArMjA1MSw3IEBACiAgKiBza2JfdHhfdGltZXN0YW1wKCkgLSBEcml2ZXIgaG9vayBmb3IgdHJhbnNtaXQgdGltZXN0YW1waW5nCiAgKgogICogRXRoZXJuZXQgTUFDIERyaXZlcnMgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiB0aGVpciBoYXJkX3htaXQoKQotICogZnVuY3Rpb24gYXMgc29vbiBhcyBwb3NzaWJsZSBhZnRlciBnaXZpbmcgdGhlIHNrX2J1ZmYgdG8gdGhlIE1BQwotICogaGFyZHdhcmUsIGJ1dCBiZWZvcmUgZnJlZWluZyB0aGUgc2tfYnVmZi4KKyAqIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGJlZm9yZSBnaXZpbmcgdGhlIHNrX2J1ZmYgdG8gdGhlIE1BQyBoYXJkd2FyZS4KICAqCiAgKiBAc2tiOiBBIHNvY2tldCBidWZmZXIuCiAgKi8KQEAgLTIyNjEsNSArMjI4OCw2IEBACiB9CiAKIGJvb2wgc2tiX3BhcnRpYWxfY3N1bV9zZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHN0YXJ0LCB1MTYgb2ZmKTsKKwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfTElOVVhfU0tCVUZGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYi5oIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKaW5kZXggYWQ0ZGQxYy4uNTczYzgwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKQEAgLTEzNCw2ICsxMzQsMjYgQEAKICNkZWZpbmUgS01BTExPQ19NQVhfT1JERVIJKEtNQUxMT0NfU0hJRlRfSElHSCAtIFBBR0VfU0hJRlQpCiAKIC8qCisgKiBTb21lIGFyY2hzIHdhbnQgdG8gcGVyZm9ybSBETUEgaW50byBrbWFsbG9jIGNhY2hlcyBhbmQgbmVlZCBhIGd1YXJhbnRlZWQKKyAqIGFsaWdubWVudCBsYXJnZXIgdGhhbiB0aGUgYWxpZ25tZW50IG9mIGEgNjQtYml0IGludGVnZXIuCisgKiBTZXR0aW5nIEFSQ0hfS01BTExPQ19NSU5BTElHTiBpbiBhcmNoIGhlYWRlcnMgYWxsb3dzIHRoYXQuCisgKi8KKyNpZmRlZiBBUkNIX0RNQV9NSU5BTElHTgorI2RlZmluZSBBUkNIX0tNQUxMT0NfTUlOQUxJR04gQVJDSF9ETUFfTUlOQUxJR04KKyNlbHNlCisjZGVmaW5lIEFSQ0hfS01BTExPQ19NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nIGxvbmcpCisjZW5kaWYKKworLyoKKyAqIFNldHRpbmcgQVJDSF9TTEFCX01JTkFMSUdOIGluIGFyY2ggaGVhZGVycyBhbGxvd3MgYSBkaWZmZXJlbnQgYWxpZ25tZW50LgorICogSW50ZW5kZWQgZm9yIGFyY2hlcyB0aGF0IGdldCBtaXNhbGlnbm1lbnQgZmF1bHRzIGV2ZW4gZm9yIDY0IGJpdCBpbnRlZ2VyCisgKiBhbGlnbmVkIGJ1ZmZlcnMuCisgKi8KKyNpZm5kZWYgQVJDSF9TTEFCX01JTkFMSUdOCisjZGVmaW5lIEFSQ0hfU0xBQl9NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nIGxvbmcpCisjZW5kaWYKKworLyoKICAqIENvbW1vbiBrbWFsbG9jIGZ1bmN0aW9ucyBwcm92aWRlZCBieSBhbGwgYWxsb2NhdG9ycwogICovCiB2b2lkICogX19tdXN0X2NoZWNrIF9fa3JlYWxsb2MoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGdmcF90KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAppbmRleCA4MzIwM2FlLi5kMDBlMGJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCkBAIC0xOCw1MyArMTgsMjUgQEAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMva21lbS5oPgogCiAvKgotICogRW5mb3JjZSBhIG1pbmltdW0gYWxpZ25tZW50IGZvciB0aGUga21hbGxvYyBjYWNoZXMuCi0gKiBVc3VhbGx5LCB0aGUga21hbGxvYyBjYWNoZXMgYXJlIGNhY2hlX2xpbmVfc2l6ZSgpIGFsaWduZWQsIGV4Y2VwdCB3aGVuCi0gKiBERUJVRyBhbmQgRk9SQ0VEX0RFQlVHIGFyZSBlbmFibGVkLCB0aGVuIHRoZXkgYXJlIEJZVEVTX1BFUl9XT1JEIGFsaWduZWQuCi0gKiBTb21lIGFyY2hzIHdhbnQgdG8gcGVyZm9ybSBETUEgaW50byBrbWFsbG9jIGNhY2hlcyBhbmQgbmVlZCBhIGd1YXJhbnRlZWQKLSAqIGFsaWdubWVudCBsYXJnZXIgdGhhbiB0aGUgYWxpZ25tZW50IG9mIGEgNjQtYml0IGludGVnZXIuCi0gKiBBUkNIX0tNQUxMT0NfTUlOQUxJR04gYWxsb3dzIHRoYXQuCi0gKiBOb3RlIHRoYXQgaW5jcmVhc2luZyB0aGlzIHZhbHVlIG1heSBkaXNhYmxlIHNvbWUgZGVidWcgZmVhdHVyZXMuCi0gKi8KLSNpZmRlZiBBUkNIX0RNQV9NSU5BTElHTgotI2RlZmluZSBBUkNIX0tNQUxMT0NfTUlOQUxJR04gQVJDSF9ETUFfTUlOQUxJR04KLSNlbHNlCi0jZGVmaW5lIEFSQ0hfS01BTExPQ19NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nIGxvbmcpCi0jZW5kaWYKLQotI2lmbmRlZiBBUkNIX1NMQUJfTUlOQUxJR04KLS8qCi0gKiBFbmZvcmNlIGEgbWluaW11bSBhbGlnbm1lbnQgZm9yIGFsbCBjYWNoZXMuCi0gKiBJbnRlbmRlZCBmb3IgYXJjaHMgdGhhdCBnZXQgbWlzYWxpZ25tZW50IGZhdWx0cyBldmVuIGZvciBCWVRFU19QRVJfV09SRAotICogYWxpZ25lZCBidWZmZXJzLiBJbmNsdWRlcyBBUkNIX0tNQUxMT0NfTUlOQUxJR04uCi0gKiBJZiBwb3NzaWJsZTogRG8gbm90IGVuYWJsZSB0aGlzIGZsYWcgZm9yIENPTkZJR19ERUJVR19TTEFCLCBpdCBkaXNhYmxlcwotICogc29tZSBkZWJ1ZyBmZWF0dXJlcy4KLSAqLwotI2RlZmluZSBBUkNIX1NMQUJfTUlOQUxJR04gMAotI2VuZGlmCi0KLS8qCiAgKiBzdHJ1Y3Qga21lbV9jYWNoZQogICoKICAqIG1hbmFnZXMgYSBjYWNoZS4KICAqLwogCiBzdHJ1Y3Qga21lbV9jYWNoZSB7Ci0vKiAxKSBwZXItY3B1IGRhdGEsIHRvdWNoZWQgZHVyaW5nIGV2ZXJ5IGFsbG9jL2ZyZWUgKi8KLQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFycmF5W05SX0NQVVNdOwotLyogMikgQ2FjaGUgdHVuYWJsZXMuIFByb3RlY3RlZCBieSBjYWNoZV9jaGFpbl9tdXRleCAqLworLyogMSkgQ2FjaGUgdHVuYWJsZXMuIFByb3RlY3RlZCBieSBjYWNoZV9jaGFpbl9tdXRleCAqLwogCXVuc2lnbmVkIGludCBiYXRjaGNvdW50OwogCXVuc2lnbmVkIGludCBsaW1pdDsKIAl1bnNpZ25lZCBpbnQgc2hhcmVkOwogCiAJdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplOwogCXUzMiByZWNpcHJvY2FsX2J1ZmZlcl9zaXplOwotLyogMykgdG91Y2hlZCBieSBldmVyeSBhbGxvYyAmIGZyZWUgZnJvbSB0aGUgYmFja2VuZCAqLworLyogMikgdG91Y2hlZCBieSBldmVyeSBhbGxvYyAmIGZyZWUgZnJvbSB0aGUgYmFja2VuZCAqLwogCiAJdW5zaWduZWQgaW50IGZsYWdzOwkJLyogY29uc3RhbnQgZmxhZ3MgKi8KIAl1bnNpZ25lZCBpbnQgbnVtOwkJLyogIyBvZiBvYmpzIHBlciBzbGFiICovCiAKLS8qIDQpIGNhY2hlX2dyb3cvc2hyaW5rICovCisvKiAzKSBjYWNoZV9ncm93L3NocmluayAqLwogCS8qIG9yZGVyIG9mIHBncyBwZXIgc2xhYiAoMl5uKSAqLwogCXVuc2lnbmVkIGludCBnZnBvcmRlcjsKIApAQCAtODAsMTEgKzUyLDExIEBACiAJLyogY29uc3RydWN0b3IgZnVuYyAqLwogCXZvaWQgKCpjdG9yKSh2b2lkICpvYmopOwogCi0vKiA1KSBjYWNoZSBjcmVhdGlvbi9yZW1vdmFsICovCisvKiA0KSBjYWNoZSBjcmVhdGlvbi9yZW1vdmFsICovCiAJY29uc3QgY2hhciAqbmFtZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CiAKLS8qIDYpIHN0YXRpc3RpY3MgKi8KKy8qIDUpIHN0YXRpc3RpY3MgKi8KICNpZmRlZiBDT05GSUdfREVCVUdfU0xBQgogCXVuc2lnbmVkIGxvbmcgbnVtX2FjdGl2ZTsKIAl1bnNpZ25lZCBsb25nIG51bV9hbGxvY2F0aW9uczsKQEAgLTExMSwxNiArODMsMTggQEAKIAlpbnQgb2JqX3NpemU7CiAjZW5kaWYgLyogQ09ORklHX0RFQlVHX1NMQUIgKi8KIAorLyogNikgcGVyLWNwdS9wZXItbm9kZSBkYXRhLCB0b3VjaGVkIGR1cmluZyBldmVyeSBhbGxvYy9mcmVlICovCiAJLyoKLQkgKiBXZSBwdXQgbm9kZWxpc3RzW10gYXQgdGhlIGVuZCBvZiBrbWVtX2NhY2hlLCBiZWNhdXNlIHdlIHdhbnQgdG8gc2l6ZQotCSAqIHRoaXMgYXJyYXkgdG8gbnJfbm9kZV9pZHMgc2xvdHMgaW5zdGVhZCBvZiBNQVhfTlVNTk9ERVMKKwkgKiBXZSBwdXQgYXJyYXlbXSBhdCB0aGUgZW5kIG9mIGttZW1fY2FjaGUsIGJlY2F1c2Ugd2Ugd2FudCB0byBzaXplCisJICogdGhpcyBhcnJheSB0byBucl9jcHVfaWRzIHNsb3RzIGluc3RlYWQgb2YgTlJfQ1BVUwogCSAqIChzZWUga21lbV9jYWNoZV9pbml0KCkpCi0JICogV2Ugc3RpbGwgdXNlIFtNQVhfTlVNTk9ERVNdIGFuZCBub3QgWzFdIG9yIFswXSBiZWNhdXNlIGNhY2hlX2NhY2hlCi0JICogaXMgc3RhdGljYWxseSBkZWZpbmVkLCBzbyB3ZSByZXNlcnZlIHRoZSBtYXggbnVtYmVyIG9mIG5vZGVzLgorCSAqIFdlIHN0aWxsIHVzZSBbTlJfQ1BVU10gYW5kIG5vdCBbMV0gb3IgWzBdIGJlY2F1c2UgY2FjaGVfY2FjaGUKKwkgKiBpcyBzdGF0aWNhbGx5IGRlZmluZWQsIHNvIHdlIHJlc2VydmUgdGhlIG1heCBudW1iZXIgb2YgY3B1cy4KIAkgKi8KLQlzdHJ1Y3Qga21lbV9saXN0MyAqbm9kZWxpc3RzW01BWF9OVU1OT0RFU107CisJc3RydWN0IGttZW1fbGlzdDMgKipub2RlbGlzdHM7CisJc3RydWN0IGFycmF5X2NhY2hlICphcnJheVtOUl9DUFVTXTsKIAkvKgotCSAqIERvIG5vdCBhZGQgZmllbGRzIGFmdGVyIG5vZGVsaXN0c1tdCisJICogRG8gbm90IGFkZCBmaWVsZHMgYWZ0ZXIgYXJyYXlbXQogCSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbG9iX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbG9iX2RlZi5oCmluZGV4IDQzODJkYjAuLjBlYzAwYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xvYl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Nsb2JfZGVmLmgKQEAgLTEsMTYgKzEsNiBAQAogI2lmbmRlZiBfX0xJTlVYX1NMT0JfREVGX0gKICNkZWZpbmUgX19MSU5VWF9TTE9CX0RFRl9ICiAKLSNpZmRlZiBBUkNIX0RNQV9NSU5BTElHTgotI2RlZmluZSBBUkNIX0tNQUxMT0NfTUlOQUxJR04gQVJDSF9ETUFfTUlOQUxJR04KLSNlbHNlCi0jZGVmaW5lIEFSQ0hfS01BTExPQ19NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nKQotI2VuZGlmCi0KLSNpZm5kZWYgQVJDSF9TTEFCX01JTkFMSUdOCi0jZGVmaW5lIEFSQ0hfU0xBQl9NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nKQotI2VuZGlmCi0KIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAppbmRleCBjODY2OGQxLi40YjM1YzA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCkBAIC0xMTMsMTYgKzExMyw2IEBACiAKICNkZWZpbmUgS01BTExPQ19TSElGVF9MT1cgaWxvZzIoS01BTExPQ19NSU5fU0laRSkKIAotI2lmZGVmIEFSQ0hfRE1BX01JTkFMSUdOCi0jZGVmaW5lIEFSQ0hfS01BTExPQ19NSU5BTElHTiBBUkNIX0RNQV9NSU5BTElHTgotI2Vsc2UKLSNkZWZpbmUgQVJDSF9LTUFMTE9DX01JTkFMSUdOIF9fYWxpZ25vZl9fKHVuc2lnbmVkIGxvbmcgbG9uZykKLSNlbmRpZgotCi0jaWZuZGVmIEFSQ0hfU0xBQl9NSU5BTElHTgotI2RlZmluZSBBUkNIX1NMQUJfTUlOQUxJR04gX19hbGlnbm9mX18odW5zaWduZWQgbG9uZyBsb25nKQotI2VuZGlmCi0KIC8qCiAgKiBNYXhpbXVtIGttYWxsb2Mgb2JqZWN0IHNpemUgaGFuZGxlZCBieSBTTFVCLiBMYXJnZXIgb2JqZWN0IGFsbG9jYXRpb25zCiAgKiBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHBhZ2UgYWxsb2NhdG9yLiBUaGUgcGFnZSBhbGxvY2F0b3IgImZhc3RwYXRoIgpAQCAtMjI4LDYgKzIxOCwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogQ2FsbGluZyB0aGlzIG9uIGFsbG9jYXRlZCBtZW1vcnkgd2lsbCBjaGVjayB0aGF0IHRoZSBtZW1vcnkKKyAqIGlzIGV4cGVjdGVkIHRvIGJlIGluIHVzZSwgYW5kIHByaW50IHdhcm5pbmdzIGlmIG5vdC4KKyAqLworI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCitleHRlcm4gYm9vbCB2ZXJpZnlfbWVtX25vdF9kZWxldGVkKGNvbnN0IHZvaWQgKngpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCB2ZXJpZnlfbWVtX25vdF9kZWxldGVkKGNvbnN0IHZvaWQgKngpCit7CisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19UUkFDSU5HCiBleHRlcm4gdm9pZCAqCiBrbWVtX2NhY2hlX2FsbG9jX3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBnZnBmbGFncywgc2l6ZV90IHNpemUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbXAuaCBiL2luY2x1ZGUvbGludXgvc21wLmgKaW5kZXggN2FkODI0ZC4uOGNjMzhkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NtcC5oCkBAIC04NSwxMiArODUsMTUgQEAKICAqIEdlbmVyaWMgYW5kIGFyY2ggaGVscGVycwogICovCiAjaWZkZWYgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTCit2b2lkIF9faW5pdCBjYWxsX2Z1bmN0aW9uX2luaXQodm9pZCk7CiB2b2lkIGdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCh2b2lkKTsKIHZvaWQgZ2VuZXJpY19zbXBfY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQodm9pZCk7CiB2b2lkIGlwaV9jYWxsX2xvY2sodm9pZCk7CiB2b2lkIGlwaV9jYWxsX3VubG9jayh2b2lkKTsKIHZvaWQgaXBpX2NhbGxfbG9ja19pcnEodm9pZCk7CiB2b2lkIGlwaV9jYWxsX3VubG9ja19pcnEodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNhbGxfZnVuY3Rpb25faW5pdCh2b2lkKSB7IH0KICNlbmRpZgogCiAvKgpAQCAtMTM0LDcgKzEzNyw3IEBACiAjZGVmaW5lIHNtcF9wcmVwYXJlX2Jvb3RfY3B1KCkJCQlkbyB7fSB3aGlsZSAoMCkKICNkZWZpbmUgc21wX2NhbGxfZnVuY3Rpb25fbWFueShtYXNrLCBmdW5jLCBpbmZvLCB3YWl0KSBcCiAJCQkodXBfc21wX2NhbGxfZnVuY3Rpb24oZnVuYywgaW5mbykpCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9jYWxsX3NpbmdsZV9kYXRhKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGNhbGxfZnVuY3Rpb25faW5pdCh2b2lkKSB7IH0KIAogc3RhdGljIGlubGluZSBpbnQKIHNtcF9jYWxsX2Z1bmN0aW9uX2FueShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgc21wX2NhbGxfZnVuY190IGZ1bmMsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaAppbmRleCA0ZWY5OGU0Li5lMTdmODIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKQEAgLTE5Miw3ICsxOTIsOCBAQAogI2RlZmluZSBBRl9JRUVFODAyMTU0CTM2CS8qIElFRUU4MDIxNTQgc29ja2V0cwkJKi8KICNkZWZpbmUgQUZfQ0FJRgkJMzcJLyogQ0FJRiBzb2NrZXRzCQkJKi8KICNkZWZpbmUgQUZfQUxHCQkzOAkvKiBBbGdvcml0aG0gc29ja2V0cwkJKi8KLSNkZWZpbmUgQUZfTUFYCQkzOQkvKiBGb3Igbm93Li4gKi8KKyNkZWZpbmUgQUZfTkZDCQkzOQkvKiBORkMgc29ja2V0cwkJCSovCisjZGVmaW5lIEFGX01BWAkJNDAJLyogRm9yIG5vdy4uICovCiAKIC8qIFByb3RvY29sIGZhbWlsaWVzLCBzYW1lIGFzIGFkZHJlc3MgZmFtaWxpZXMuICovCiAjZGVmaW5lIFBGX1VOU1BFQwlBRl9VTlNQRUMKQEAgLTIzNCw2ICsyMzUsNyBAQAogI2RlZmluZSBQRl9JRUVFODAyMTU0CUFGX0lFRUU4MDIxNTQKICNkZWZpbmUgUEZfQ0FJRgkJQUZfQ0FJRgogI2RlZmluZSBQRl9BTEcJCUFGX0FMRworI2RlZmluZSBQRl9ORkMJCUFGX05GQwogI2RlZmluZSBQRl9NQVgJCUFGX01BWAogCiAvKiBNYXhpbXVtIHF1ZXVlIGxlbmd0aCBzcGVjaWZpYWJsZSBieSBsaXN0ZW4uICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvNzR4MTY0LmggYi9pbmNsdWRlL2xpbnV4L3NwaS83NHgxNjQuaAppbmRleCBkODVjNTJmLi4wYWE2YWNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaS83NHgxNjQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS83NHgxNjQuaApAQCAtMSw4ICsxLDYgQEAKICNpZm5kZWYgTElOVVhfU1BJXzc0WDE2NF9ICiAjZGVmaW5lIExJTlVYX1NQSV83NFgxNjRfSAogCi0jZGVmaW5lIEdFTl83NFgxNjRfRFJJVkVSX05BTUUgIjc0eDE2NCIKLQogc3RydWN0IGdlbl83NHgxNjRfY2hpcF9wbGF0Zm9ybV9kYXRhIHsKIAkvKiBudW1iZXIgYXNzaWduZWQgdG8gdGhlIGZpcnN0IEdQSU8gKi8KIAl1bnNpZ25lZAliYXNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvbWNwMjNzMDguaCBiL2luY2x1ZGUvbGludXgvc3BpL21jcDIzczA4LmgKaW5kZXggYzQyY2ZmOC4uMmQ2NzZkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvbWNwMjNzMDguaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9tY3AyM3MwOC5oCkBAIC0yMiwxMyArMjIsNCBAQAogCSAqIGJhc2UgdG8gYmFzZSsxNSAob3IgYmFzZSszMSBmb3IgczE3IHZhcmlhbnQpLgogCSAqLwogCXVuc2lnbmVkCWJhc2U7Ci0KLQl2b2lkCQkqY29udGV4dDsJLyogcGFyYW0gdG8gc2V0dXAvdGVhcmRvd24gKi8KLQotCWludAkJKCpzZXR1cCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkJaW50IGdwaW8sIHVuc2lnbmVkIG5ncGlvLAotCQkJCQl2b2lkICpjb250ZXh0KTsKLQlpbnQJCSgqdGVhcmRvd24pKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCQkJCWludCBncGlvLCB1bnNpZ25lZCBuZ3BpbywKLQkJCQkJdm9pZCAqY29udGV4dCk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGxpY2UuaCBiL2luY2x1ZGUvbGludXgvc3BsaWNlLmgKaW5kZXggOTk3YzNiNC4uMjZlNWI2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGxpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwbGljZS5oCkBAIC04OCw1ICs4OCw3IEBACiBleHRlcm4gaW50IHNwbGljZV9ncm93X3NwZChzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjICopOwogZXh0ZXJuIHZvaWQgc3BsaWNlX3Nocmlua19zcGQoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLAogCQkJCXN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjICopOworZXh0ZXJuIHZvaWQgc3BkX3JlbGVhc2VfcGFnZShzdHJ1Y3Qgc3BsaWNlX3BpcGVfZGVzYyAqLCB1bnNpZ25lZCBpbnQpOwogCitleHRlcm4gY29uc3Qgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgcGFnZV9jYWNoZV9waXBlX2J1Zl9vcHM7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3NiL3NzYi5oIGIvaW5jbHVkZS9saW51eC9zc2Ivc3NiLmgKaW5kZXggMjUyZTQ0ODIuLjg2MjMyMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3NiL3NzYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc3NiL3NzYi5oCkBAIC0yNyw2ICsyNyw4IEBACiAJdTggZXQxbWRjcG9ydDsJCS8qIE1ESU8gZm9yIGVuZXQxICovCiAJdTggYm9hcmRfcmV2OwkJLyogQm9hcmQgcmV2aXNpb24gbnVtYmVyIGZyb20gU1BST00uICovCiAJdTggY291bnRyeV9jb2RlOwkvKiBDb3VudHJ5IENvZGUgKi8KKwl1MTYgbGVkZGNfb25fdGltZTsJLyogTEVEIFBvd2Vyc2F2ZSBEdXR5IEN5Y2xlIE9uIENvdW50ICovCisJdTE2IGxlZGRjX29mZl90aW1lOwkvKiBMRUQgUG93ZXJzYXZlIER1dHkgQ3ljbGUgT2ZmIENvdW50ICovCiAJdTggYW50X2F2YWlsYWJsZV9hOwkvKiAyR0h6IGFudGVubmEgYXZhaWxhYmxlIGJpdHMgKHVwIHRvIDQpICovCiAJdTggYW50X2F2YWlsYWJsZV9iZzsJLyogNUdIeiBhbnRlbm5hIGF2YWlsYWJsZSBiaXRzICh1cCB0byA0KSAqLwogCXUxNiBwYTBiMDsKQEAgLTk5LDcgKzEwMSw3IEBACiBzdHJ1Y3Qgc3NiX2JvYXJkaW5mbyB7CiAJdTE2IHZlbmRvcjsKIAl1MTYgdHlwZTsKLQl1MTYgcmV2OworCXU4ICByZXY7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3NiL3NzYl9kcml2ZXJfY2hpcGNvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9zc2Ivc3NiX2RyaXZlcl9jaGlwY29tbW9uLmgKaW5kZXggYTA4ZDY5My4uMWE2YjAwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zc2Ivc3NiX2RyaXZlcl9jaGlwY29tbW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9zc2Ivc3NiX2RyaXZlcl9jaGlwY29tbW9uLmgKQEAgLTgsNyArOCw3IEBACiAgKiBncGlvIGludGVyZmFjZSwgZXh0YnVzLCBhbmQgc3VwcG9ydCBmb3Igc2VyaWFsIGFuZCBwYXJhbGxlbCBmbGFzaGVzLgogICoKICAqIENvcHlyaWdodCAyMDA1LCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IDIwMDYsIE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgKiBDb3B5cmlnaHQgMjAwNiwgTWljaGFlbCBCdWVzY2ggPG1AYnVlcy5jaD4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMIHZlcnNpb24gMi4gU2VlIENPUFlJTkcgZm9yIGRldGFpbHMuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RhY2t0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKaW5kZXggMjUzMTBmMS4uMTE1YjU3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKQEAgLTE0LDggKzE0LDggQEAKIH07CiAKIGV4dGVybiB2b2lkIHNhdmVfc3RhY2tfdHJhY2Uoc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSk7Ci1leHRlcm4gdm9pZCBzYXZlX3N0YWNrX3RyYWNlX3JlZ3Moc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwKLQkJCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIHNhdmVfc3RhY2tfdHJhY2VfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgIHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UpOwogZXh0ZXJuIHZvaWQgc2F2ZV9zdGFja190cmFjZV90c2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkJc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RtbWFjLmggYi9pbmNsdWRlL2xpbnV4L3N0bW1hYy5oCmluZGV4IDk1MjllNDkuLjBkZGRjOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3RtbWFjLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdG1tYWMuaApAQCAtMjgsMTEgKzI4LDIxIEBACiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAotLyogcGxhdGZvcm0gZGF0YSBmb3IgcGxhdGZvcm0gZGV2aWNlIHN0cnVjdHVyZSdzIHBsYXRmb3JtX2RhdGEgZmllbGQgKi8KKy8qIFBsYXRmcm9tIGRhdGEgZm9yIHBsYXRmb3JtIGRldmljZSBzdHJ1Y3R1cmUncyBwbGF0Zm9ybV9kYXRhIGZpZWxkICovCiAKLS8qIFByaXZhdGUgZGF0YSBmb3IgdGhlIFNUTSBvbi1ib2FyZCBldGhlcm5ldCBkcml2ZXIgKi8KK3N0cnVjdCBzdG1tYWNfbWRpb19idXNfZGF0YSB7CisJaW50IGJ1c19pZDsKKwlpbnQgKCpwaHlfcmVzZXQpKHZvaWQgKnByaXYpOworCXVuc2lnbmVkIGludCBwaHlfbWFzazsKKwlpbnQgKmlycXM7CisJaW50IHByb2JlZF9waHlfaXJxOworfTsKKwogc3RydWN0IHBsYXRfc3RtbWFjZW5ldF9kYXRhIHsKIAlpbnQgYnVzX2lkOworCWludCBwaHlfYWRkcjsKKwlpbnQgaW50ZXJmYWNlOworCXN0cnVjdCBzdG1tYWNfbWRpb19idXNfZGF0YSAqbWRpb19idXNfZGF0YTsKIAlpbnQgcGJsOwogCWludCBjbGtfY3NyOwogCWludCBoYXNfZ21hYzsKQEAgLTQwLDYgKzUwLDcgQEAKIAlpbnQgdHhfY29lOwogCWludCBidWdnZWRfanVtYm87CiAJaW50IHBtdDsKKwlpbnQgZm9yY2Vfc2ZfZG1hX21vZGU7CiAJdm9pZCAoKmZpeF9tYWNfc3BlZWQpKHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBzcGVlZCk7CiAJdm9pZCAoKmJ1c19zZXR1cCkodm9pZCBfX2lvbWVtICppb2FkZHIpOwogCWludCAoKmluaXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwpAQCAtNDcsMTQgKzU4LDQgQEAKIAl2b2lkICpjdXN0b21fY2ZnOwogCXZvaWQgKmJzcF9wcml2OwogfTsKLQotc3RydWN0IHBsYXRfc3RtbWFjcGh5X2RhdGEgewotCWludCBidXNfaWQ7Ci0JaW50IHBoeV9hZGRyOwotCXVuc2lnbmVkIGludCBwaHlfbWFzazsKLQlpbnQgaW50ZXJmYWNlOwotCWludCAoKnBoeV9yZXNldCkodm9pZCAqcHJpdik7Ci0Jdm9pZCAqcHJpdjsKLX07CiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdG9wX21hY2hpbmUuaCBiL2luY2x1ZGUvbGludXgvc3RvcF9tYWNoaW5lLmgKaW5kZXggMDkyZGM5Yi4uMmQwNGVhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdG9wX21hY2hpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N0b3BfbWFjaGluZS5oCkBAIC05NCw3ICs5NCw3IEBACiAgKiBzdG9wX21hY2hpbmUgIkJvZ29sb2NrIjogc3RvcCB0aGUgZW50aXJlIG1hY2hpbmUsIGRpc2FibGUKICAqIGludGVycnVwdHMuICBUaGlzIGlzIGEgdmVyeSBoZWF2eSBsb2NrLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvCiAgKiBncmFiYmluZyBldmVyeSBzcGlubG9jayAoYW5kIG1vcmUpLiAgU28gdGhlICJyZWFkIiBzaWRlIHRvIHN1Y2ggYQotICogbG9jayBpcyBhbnl0aGluZyB3aGljaCBkaXNhYmxlcyBwcmVlZW1wdC4KKyAqIGxvY2sgaXMgYW55dGhpbmcgd2hpY2ggZGlzYWJsZXMgcHJlZW1wdGlvbi4KICAqLwogI2lmIGRlZmluZWQoQ09ORklHX1NUT1BfTUFDSElORSkgJiYgZGVmaW5lZChDT05GSUdfU01QKQogCkBAIC0xMjQsMTUgKzEyNCwxOSBAQAogICovCiBpbnQgX19zdG9wX21hY2hpbmUoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVzKTsKIAoraW50IHN0b3BfbWFjaGluZV9mcm9tX2luYWN0aXZlX2NwdShpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1cyk7CisKICNlbHNlCSAvKiBDT05GSUdfU1RPUF9NQUNISU5FICYmIENPTkZJR19TTVAgKi8KIAogc3RhdGljIGlubGluZSBpbnQgX19zdG9wX21hY2hpbmUoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmRhdGEsCiAJCQkJIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVzKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlyZXQgPSBmbihkYXRhKTsKLQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0Miw1ICsxNDYsMTEgQEAKIAlyZXR1cm4gX19zdG9wX21hY2hpbmUoZm4sIGRhdGEsIGNwdXMpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBzdG9wX21hY2hpbmVfZnJvbV9pbmFjdGl2ZV9jcHUoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmRhdGEsCisJCQkJCQkgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdXMpCit7CisJcmV0dXJuIF9fc3RvcF9tYWNoaW5lKGZuLCBkYXRhLCBjcHVzKTsKK30KKwogI2VuZGlmCS8qIENPTkZJR19TVE9QX01BQ0hJTkUgJiYgQ09ORklHX1NNUCAqLwogI2VuZGlmCS8qIF9MSU5VWF9TVE9QX01BQ0hJTkUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2NhY2hlLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jYWNoZS5oCmluZGV4IDhkMmVlZjEuLmQxYzc5YTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvY2FjaGUuaApAQCAtMjU2LDEzICsyNTYsNCBAQAogCXJldHVybiBydiAtIGJvb3QudHZfc2VjOwogfQogCi0jaWZkZWYgQ09ORklHX05GU0RfREVQUkVDQVRFRAotc3RhdGljIGlubGluZSB2b2lkIHN1bnJwY19pbnZhbGlkYXRlKHN0cnVjdCBjYWNoZV9oZWFkICpoLAotCQkJCSAgICAgc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsKQotewotCWgtPmV4cGlyeV90aW1lID0gc2Vjb25kc19zaW5jZV9ib290KCkgLSAxOwotCWRldGFpbC0+bmV4dGNoZWNrID0gc2Vjb25kc19zaW5jZV9ib290KCk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX05GU0RfREVQUkVDQVRFRCAqLwotCiAjZW5kaWYgLyogIF9MSU5VWF9TVU5SUENfQ0FDSEVfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19rcmI1X2VuY3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3Nfa3JiNV9lbmN0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjIzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3Nfa3JiNV9lbmN0eXBlcy5oCkBAIC0wLDAgKzEsNCBAQAorLyoKKyAqIER1bWIgd2F5IHRvIHNoYXJlIHRoaXMgc3RhdGljIHBpZWNlIG9mIGluZm9ybWF0aW9uIHdpdGggbmZzZAorICovCisjZGVmaW5lIEtSQjVfU1VQUE9SVEVEX0VOQ1RZUEVTICIxOCwxNywxNiwyMywzLDEsMiIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zY2hlZC5oCmluZGV4IGY3M2M0ODIuLmZlMmQ4ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc2NoZWQuaApAQCAtODQsNyArODQsOCBAQAogI2VuZGlmCiAJdW5zaWduZWQgY2hhcgkJdGtfcHJpb3JpdHkgOiAyLC8qIFRhc2sgcHJpb3JpdHkgKi8KIAkJCQl0a19nYXJiX3JldHJ5IDogMiwKLQkJCQl0a19jcmVkX3JldHJ5IDogMjsKKwkJCQl0a19jcmVkX3JldHJ5IDogMiwKKwkJCQl0a19yZWJpbmRfcmV0cnkgOiAyOwogfTsKICNkZWZpbmUgdGtfeHBydAkJCXRrX2NsaWVudC0+Y2xfeHBydAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCmluZGV4IGVhMjkzMzAuLjJmMWU1MTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCkBAIC0yNzMsNiArMjczLDcgQEAKIAkvKiBDYXRlcmluZyB0byBuZnNkICovCiAJc3RydWN0IGF1dGhfZG9tYWluICoJcnFfY2xpZW50OwkvKiBSUEMgcGVlciBpbmZvICovCiAJc3RydWN0IGF1dGhfZG9tYWluICoJcnFfZ3NzY2xpZW50OwkvKiAiZ3NzLyItc3R5bGUgcGVlciBpbmZvICovCisJaW50CQkJcnFfY2FjaGV0eXBlOwogCXN0cnVjdCBzdmNfY2FjaGVyZXAgKglycV9jYWNoZXJlcDsJLyogY2FjaGUgaW5mbyAqLwogCWludAkJCXJxX3NwbGljZV9vazsgICAvKiB0dXJuZWQgb2ZmIGluIGdzcyBwcml2YWN5CiAJCQkJCQkgKiB0byBwcmV2ZW50IGVuY3J5cHRpbmcgcGFnZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmggYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaAppbmRleCAwODNmZmVhLi42YmJjZWYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaApAQCAtOTIsNiArOTIsMTMgQEAKICAqCUBlbnRlcigpIGFuZCBAd2FrZSgpLCBldmVuIGlmIGFueSBvZiB0aGVtIGZhaWxzLiAgSXQgaXMgZXhlY3V0ZWQgYWZ0ZXIKICAqCWEgZmFpbGluZyBAcHJlcGFyZS4KICAqCisgKiBAc3VzcGVuZF9hZ2FpbjogUmV0dXJucyB3aGV0aGVyIHRoZSBzeXN0ZW0gc2hvdWxkIHN1c3BlbmQgYWdhaW4gKHRydWUpIG9yCisgKglub3QgKGZhbHNlKS4gSWYgdGhlIHBsYXRmb3JtIHdhbnRzIHRvIHBvbGwgc2Vuc29ycyBvciBleGVjdXRlIHNvbWUKKyAqCWNvZGUgZHVyaW5nIHN1c3BlbmRlZCB3aXRob3V0IGludm9raW5nIHVzZXJzcGFjZSBhbmQgbW9zdCBvZiBkZXZpY2VzLAorICoJc3VzcGVuZF9hZ2FpbiBjYWxsYmFjayBpcyB0aGUgcGxhY2UgYXNzdW1pbmcgdGhhdCBwZXJpb2RpYy13YWtldXAgb3IKKyAqCWFsYXJtLXdha2V1cCBpcyBhbHJlYWR5IHNldHVwLiBUaGlzIGFsbG93cyB0byBleGVjdXRlIHNvbWUgY29kZXMgd2hpbGUKKyAqCWJlaW5nIGtlcHQgc3VzcGVuZGVkIGluIHRoZSB2aWV3IG9mIHVzZXJsYW5kIGFuZCBkZXZpY2VzLgorICoKICAqIEBlbmQ6IENhbGxlZCBieSB0aGUgUE0gY29yZSByaWdodCBhZnRlciByZXN1bWluZyBkZXZpY2VzLCB0byBpbmRpY2F0ZSB0bwogICoJdGhlIHBsYXRmb3JtIHRoYXQgdGhlIHN5c3RlbSBoYXMgcmV0dXJuZWQgdG8gdGhlIHdvcmtpbmcgc3RhdGUgb3IKICAqCXRoZSB0cmFuc2l0aW9uIHRvIHRoZSBzbGVlcCBzdGF0ZSBoYXMgYmVlbiBhYm9ydGVkLgpAQCAtMTEzLDYgKzEyMCw3IEBACiAJaW50ICgqZW50ZXIpKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSk7CiAJdm9pZCAoKndha2UpKHZvaWQpOwogCXZvaWQgKCpmaW5pc2gpKHZvaWQpOworCWJvb2wgKCpzdXNwZW5kX2FnYWluKSh2b2lkKTsKIAl2b2lkICgqZW5kKSh2b2lkKTsKIAl2b2lkICgqcmVjb3Zlcikodm9pZCk7CiB9OwpAQCAtMjYwLDYgKzI2OCwxNCBAQAogc3RhdGljIGlubGluZSBib29sIHN5c3RlbV9lbnRlcmluZ19oaWJlcm5hdGlvbih2b2lkKSB7IHJldHVybiBmYWxzZTsgfQogI2VuZGlmIC8qIENPTkZJR19ISUJFUk5BVElPTiAqLwogCisvKiBIaWJlcm5hdGlvbiBhbmQgc3VzcGVuZCBldmVudHMgKi8KKyNkZWZpbmUgUE1fSElCRVJOQVRJT05fUFJFUEFSRQkweDAwMDEgLyogR29pbmcgdG8gaGliZXJuYXRlICovCisjZGVmaW5lIFBNX1BPU1RfSElCRVJOQVRJT04JMHgwMDAyIC8qIEhpYmVybmF0aW9uIGZpbmlzaGVkICovCisjZGVmaW5lIFBNX1NVU1BFTkRfUFJFUEFSRQkweDAwMDMgLyogR29pbmcgdG8gc3VzcGVuZCB0aGUgc3lzdGVtICovCisjZGVmaW5lIFBNX1BPU1RfU1VTUEVORAkJMHgwMDA0IC8qIFN1c3BlbmQgZmluaXNoZWQgKi8KKyNkZWZpbmUgUE1fUkVTVE9SRV9QUkVQQVJFCTB4MDAwNSAvKiBHb2luZyB0byByZXN0b3JlIGEgc2F2ZWQgaW1hZ2UgKi8KKyNkZWZpbmUgUE1fUE9TVF9SRVNUT1JFCQkweDAwMDYgLyogUmVzdG9yZSBmYWlsZWQgKi8KKwogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogdm9pZCBzYXZlX3Byb2Nlc3Nvcl9zdGF0ZSh2b2lkKTsKIHZvaWQgcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IDM4NGViNWYuLmEyNzM0NjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oCkBAIC0zMDAsMTYgKzMwMCw2IEBACiBleHRlcm4gaW50IGtzd2FwZF9ydW4oaW50IG5pZCk7CiBleHRlcm4gdm9pZCBrc3dhcGRfc3RvcChpbnQgbmlkKTsKIAotI2lmZGVmIENPTkZJR19NTVUKLS8qIGxpbnV4L21tL3NobWVtLmMgKi8KLWV4dGVybiBpbnQgc2htZW1fdW51c2Uoc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKTsKLSNlbmRpZiAvKiBDT05GSUdfTU1VICovCi0KLSNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUgotZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9nZXRfc2htZW1fdGFyZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHBnb2ZmX3QgcGdvZmYsCi0JCQkJCXN0cnVjdCBwYWdlICoqcGFnZXAsIHN3cF9lbnRyeV90ICplbnQpOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfU1dBUAogLyogbGludXgvbW0vcGFnZV9pby5jICovCiBleHRlcm4gaW50IHN3YXBfcmVhZHBhZ2Uoc3RydWN0IHBhZ2UgKik7CkBAIC0zNTgsNiArMzQ4LDcgQEAKIGV4dGVybiBzdHJ1Y3QgbW1fc3RydWN0ICpzd2FwX3Rva2VuX21tOwogZXh0ZXJuIHZvaWQgZ3JhYl9zd2FwX3Rva2VuKHN0cnVjdCBtbV9zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBfX3B1dF9zd2FwX3Rva2VuKHN0cnVjdCBtbV9zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBkaXNhYmxlX3N3YXBfdG9rZW4oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKTsKIAogc3RhdGljIGlubGluZSBpbnQgaGFzX3N3YXBfdG9rZW4oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CkBAIC0zNzAsMTEgKzM2MSw2IEBACiAJCV9fcHV0X3N3YXBfdG9rZW4obW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9zd2FwX3Rva2VuKHZvaWQpCi17Ci0JcHV0X3N3YXBfdG9rZW4oc3dhcF90b2tlbl9tbSk7Ci19Ci0KICNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUgogZXh0ZXJuIHZvaWQKIG1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcGNhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCBzd3BfZW50cnlfdCBlbnQsIGJvb2wgc3dhcG91dCk7CkBAIC01MDAsNyArNDg2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfc3dhcF90b2tlbih2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfc3dhcF90b2tlbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oIGIvaW5jbHVkZS9saW51eC9zd2lvdGxiLmgKaW5kZXggOGMwZTM0OS4uNDQ1NzAyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2lvdGxiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2lvdGxiLmgKQEAgLTI0LDYgKzI0LDcgQEAKIAogZXh0ZXJuIHZvaWQgc3dpb3RsYl9pbml0KGludCB2ZXJib3NlKTsKIGV4dGVybiB2b2lkIHN3aW90bGJfaW5pdF93aXRoX3RibChjaGFyICp0bGIsIHVuc2lnbmVkIGxvbmcgbnNsYWJzLCBpbnQgdmVyYm9zZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzd2lvbHRiX25yX3RibCh2b2lkKTsKIAogLyoKICAqIEVudW1lcmF0aW9uIGZvciBzeW5jIHRhcmdldHMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzZnMuaCBiL2luY2x1ZGUvbGludXgvc3lzZnMuaAppbmRleCBjM2FjZGE2Li5lMjY5NmQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNmcy5oCkBAIC0xNzcsOSArMTc3LDYgQEAKIHN0cnVjdCBzeXNmc19kaXJlbnQgKnN5c2ZzX2dldChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCk7CiB2b2lkIHN5c2ZzX3B1dChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCk7CiAKLS8qIENhbGxlZCB0byBjbGVhciBhIG5zIHRhZyB3aGVuIGl0IGlzIG5vIGxvbmdlciB2YWxpZCAqLwotdm9pZCBzeXNmc19leGl0X25zKGVudW0ga29ial9uc190eXBlIHR5cGUsIGNvbnN0IHZvaWQgKnRhZyk7Ci0KIGludCBfX211c3RfY2hlY2sgc3lzZnNfaW5pdCh2b2lkKTsKIAogI2Vsc2UgLyogQ09ORklHX1NZU0ZTICovCkBAIC0zMzgsMTAgKzMzNSw2IEBACiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzeXNmc19leGl0X25zKGludCB0eXBlLCBjb25zdCB2b2lkICp0YWcpCi17Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBzeXNmc19pbml0KHZvaWQpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmggYi9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmgKaW5kZXggNzEzODk2Mi4uYjExZjhjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbWV0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX21ldGEuaApAQCAtNjcsNyArNjcsNyBAQAogCVRDRl9NRVRBX0lEX1NLX0ZPUldBUkRfQUxMT0NTLAogCVRDRl9NRVRBX0lEX1NLX1NOREJVRiwKICAJVENGX01FVEFfSURfU0tfQUxMT0NTLAotIAlUQ0ZfTUVUQV9JRF9TS19ST1VURV9DQVBTLAorCV9fVENGX01FVEFfSURfU0tfUk9VVEVfQ0FQUywJLyogdW5pbXBsZW1lbnRlZCBidXQgaW4gQUJJIGFscmVhZHkgKi8KICAJVENGX01FVEFfSURfU0tfSEFTSCwKICAJVENGX01FVEFfSURfU0tfTElOR0VSVElNRSwKICAJVENGX01FVEFfSURfU0tfQUNLX0JBQ0tMT0csCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RjcC5oIGIvaW5jbHVkZS9saW51eC90Y3AuaAppbmRleCBlNjRmNGM2Li41MzFlZGU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGNwLmgKQEAgLTI4Miw2ICsyODIsNyBAQAogI2VuZGlmCiAJdTMyCQkJCXJjdl9pc247CiAJdTMyCQkJCXNudF9pc247CisJdTMyCQkJCXNudF9zeW5hY2s7IC8qIHN5bmFjayBzZW50IHRpbWUgKi8KIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2sgKnRjcF9yc2soY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90b3BvbG9neS5oIGIvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCmluZGV4IGI5MWE0MGUuLmZjODM5YmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKQEAgLTYwLDcgKzYwLDcgQEAKICAqIChpbiB3aGF0ZXZlciBhcmNoIHNwZWNpZmljIG1lYXN1cmVtZW50IHVuaXRzIHJldHVybmVkIGJ5IG5vZGVfZGlzdGFuY2UoKSkKICAqIHRoZW4gc3dpdGNoIG9uIHpvbmUgcmVjbGFpbSBvbiBib290LgogICovCi0jZGVmaW5lIFJFQ0xBSU1fRElTVEFOQ0UgMjAKKyNkZWZpbmUgUkVDTEFJTV9ESVNUQU5DRSAzMAogI2VuZGlmCiAjaWZuZGVmIFBFTkFMVFlfRk9SX05PREVfV0lUSF9DUFVTCiAjZGVmaW5lIFBFTkFMVFlfRk9SX05PREVfV0lUSF9DUFVTCSgxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90cmFjZWhvb2suaCBiL2luY2x1ZGUvbGludXgvdHJhY2Vob29rLmgKaW5kZXggZTk1ZjUyMy4uYTcxYTI5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90cmFjZWhvb2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3RyYWNlaG9vay5oCkBAIC01MSwyNyArNTEsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogc3RydWN0IGxpbnV4X2JpbnBybTsKIAotLyoqCi0gKiB0cmFjZWhvb2tfZXhwZWN0X2JyZWFrcG9pbnRzIC0gZ3Vlc3MgaWYgdGFzayBtZW1vcnkgbWlnaHQgYmUgdG91Y2hlZAotICogQHRhc2s6CQljdXJyZW50IHRhc2ssIG1ha2luZyBhIG5ldyBtYXBwaW5nCi0gKgotICogUmV0dXJuIG5vbnplcm8gaWYgQHRhc2sgaXMgZXhwZWN0ZWQgdG8gd2FudCBicmVha3BvaW50IGluc2VydGlvbiBpbgotICogaXRzIG1lbW9yeSBhdCBzb21lIHBvaW50LiAgQSB6ZXJvIHJldHVybiBpcyBubyBndWFyYW50ZWUgaXQgd29uJ3QKLSAqIGJlIGRvbmUsIGJ1dCB0aGlzIGlzIGEgaGludCB0aGF0IGl0J3Mga25vd24gdG8gYmUgbGlrZWx5LgotICoKLSAqIE1heSBiZSBjYWxsZWQgd2l0aCBAdGFzay0+bW0tPm1tYXBfc2VtIGhlbGQgZm9yIHdyaXRpbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRyYWNlaG9va19leHBlY3RfYnJlYWtwb2ludHMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQotewotCXJldHVybiAodGFza19wdHJhY2UodGFzaykgJiBQVF9QVFJBQ0VEKSAhPSAwOwotfQotCiAvKgogICogcHRyYWNlIHJlcG9ydCBmb3Igc3lzY2FsbCBlbnRyeSBhbmQgZXhpdCBsb29rcyBpZGVudGljYWwuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBwdHJhY2VfcmVwb3J0X3N5c2NhbGwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JaW50IHB0cmFjZSA9IHRhc2tfcHRyYWNlKGN1cnJlbnQpOworCWludCBwdHJhY2UgPSBjdXJyZW50LT5wdHJhY2U7CiAKIAlpZiAoIShwdHJhY2UgJiBQVF9QVFJBQ0VEKSkKIAkJcmV0dXJuOwpAQCAtMTQ1LDIyOSArMTMwLDYgQEAKIH0KIAogLyoqCi0gKiB0cmFjZWhvb2tfdW5zYWZlX2V4ZWMgLSBjaGVjayBmb3IgZXhlYyBkZWNsYXJlZCB1bnNhZmUgZHVlIHRvIHRyYWNpbmcKLSAqIEB0YXNrOgkJY3VycmVudCB0YXNrIGRvaW5nIGV4ZWMKLSAqCi0gKiBSZXR1cm4gJUxTTV9VTlNBRkVfKiBiaXRzIGFwcGxpZWQgdG8gYW4gZXhlYyBiZWNhdXNlIG9mIHRyYWNpbmcuCi0gKgotICogQHRhc2stPnNpZ25hbC0+Y3JlZF9ndWFyZF9tdXRleCBpcyBoZWxkIGJ5IHRoZSBjYWxsZXIgdGhyb3VnaCB0aGUgZG9fZXhlY3ZlKCkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRyYWNlaG9va191bnNhZmVfZXhlYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0JaW50IHVuc2FmZSA9IDA7Ci0JaW50IHB0cmFjZSA9IHRhc2tfcHRyYWNlKHRhc2spOwotCWlmIChwdHJhY2UgJiBQVF9QVFJBQ0VEKSB7Ci0JCWlmIChwdHJhY2UgJiBQVF9QVFJBQ0VfQ0FQKQotCQkJdW5zYWZlIHw9IExTTV9VTlNBRkVfUFRSQUNFX0NBUDsKLQkJZWxzZQotCQkJdW5zYWZlIHw9IExTTV9VTlNBRkVfUFRSQUNFOwotCX0KLQlyZXR1cm4gdW5zYWZlOwotfQotCi0vKioKLSAqIHRyYWNlaG9va190cmFjZXJfdGFzayAtIHJldHVybiB0aGUgdGFzayB0aGF0IGlzIHRyYWNpbmcgdGhlIGdpdmVuIHRhc2sKLSAqIEB0c2s6CQl0YXNrIHRvIGNvbnNpZGVyCi0gKgotICogUmV0dXJucyBOVUxMIGlmIG5vIG9uZSBpcyB0cmFjaW5nIEB0YXNrLCBvciB0aGUgJnN0cnVjdCB0YXNrX3N0cnVjdAotICogcG9pbnRlciB0byBpdHMgdHJhY2VyLgotICoKLSAqIE11c3QgY2FsbGVkIHVuZGVyIHJjdV9yZWFkX2xvY2soKS4gIFRoZSBwb2ludGVyIHJldHVybmVkIG1pZ2h0IGJlIGtlcHQKLSAqIGxpdmUgb25seSBieSBSQ1UuICBEdXJpbmcgZXhlYywgdGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGFza19sb2NrKCkKLSAqIGhlbGQgb24gQHRhc2ssIHN0aWxsIGhlbGQgZnJvbSB3aGVuIHRyYWNlaG9va191bnNhZmVfZXhlYygpIHdhcyBjYWxsZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICp0cmFjZWhvb2tfdHJhY2VyX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JaWYgKHRhc2tfcHRyYWNlKHRzaykgJiBQVF9QVFJBQ0VEKQotCQlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlKHRzay0+cGFyZW50KTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoqCi0gKiB0cmFjZWhvb2tfcmVwb3J0X2V4ZWMgLSBhIHN1Y2Nlc3NmdWwgZXhlYyB3YXMgY29tcGxldGVkCi0gKiBAZm10OgkJJnN0cnVjdCBsaW51eF9iaW5mbXQgdGhhdCBwZXJmb3JtZWQgdGhlIGV4ZWMKLSAqIEBicHJtOgkJJnN0cnVjdCBsaW51eF9iaW5wcm0gY29udGFpbmluZyBleGVjIGRldGFpbHMKLSAqIEByZWdzOgkJdXNlci1tb2RlIHJlZ2lzdGVyIHN0YXRlCi0gKgotICogQW4gZXhlYyBqdXN0IGNvbXBsZXRlZCwgd2UgYXJlIHNob3J0bHkgZ29pbmcgdG8gcmV0dXJuIHRvIHVzZXIgbW9kZS4KLSAqIFRoZSBmcmVzaGx5IGluaXRpYWxpemVkIHJlZ2lzdGVyIHN0YXRlIGNhbiBiZSBzZWVuIGFuZCBjaGFuZ2VkIGluIEByZWdzLgotICogVGhlIG5hbWUsIGZpbGUgYW5kIG90aGVyIHBvaW50ZXJzIGluIEBicHJtIGFyZSBzdGlsbCBvbiBoYW5kIHRvIGJlCi0gKiBpbnNwZWN0ZWQsIGJ1dCB3aWxsIGJlIGZyZWVkIGFzIHNvb24gYXMgdGhpcyByZXR1cm5zLgotICoKLSAqIENhbGxlZCB3aXRoIG5vIGxvY2tzLCBidXQgd2l0aCBzb21lIGtlcm5lbCByZXNvdXJjZXMgaGVsZCBsaXZlCi0gKiBhbmQgYSByZWZlcmVuY2Ugb24gQGZtdC0+bW9kdWxlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhY2Vob29rX3JlcG9ydF9leGVjKHN0cnVjdCBsaW51eF9iaW5mbXQgKmZtdCwKLQkJCQkJIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sCi0JCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpZiAoIXB0cmFjZV9ldmVudChQVF9UUkFDRV9FWEVDLCBQVFJBQ0VfRVZFTlRfRVhFQywgMCkgJiYKLQkgICAgdW5saWtlbHkodGFza19wdHJhY2UoY3VycmVudCkgJiBQVF9QVFJBQ0VEKSkKLQkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMCk7Ci19Ci0KLS8qKgotICogdHJhY2Vob29rX3JlcG9ydF9leGl0IC0gdGFzayBoYXMgYmVndW4gdG8gZXhpdAotICogQGV4aXRfY29kZToJCXBvaW50ZXIgdG8gdmFsdWUgZGVzdGluZWQgZm9yIEBjdXJyZW50LT5leGl0X2NvZGUKLSAqCi0gKiBAZXhpdF9jb2RlIHBvaW50cyB0byB0aGUgdmFsdWUgcGFzc2VkIHRvIGRvX2V4aXQoKSwgd2hpY2ggdHJhY2luZwotICogbWlnaHQgY2hhbmdlIGhlcmUuICBUaGlzIGlzIGFsbW9zdCB0aGUgZmlyc3QgdGhpbmcgaW4gZG9fZXhpdCgpLAotICogYmVmb3JlIGZyZWVpbmcgYW55IHJlc291cmNlcyBvciBzZXR0aW5nIHRoZSAlUEZfRVhJVElORyBmbGFnLgotICoKLSAqIENhbGxlZCB3aXRoIG5vIGxvY2tzIGhlbGQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZWhvb2tfcmVwb3J0X2V4aXQobG9uZyAqZXhpdF9jb2RlKQotewotCXB0cmFjZV9ldmVudChQVF9UUkFDRV9FWElULCBQVFJBQ0VfRVZFTlRfRVhJVCwgKmV4aXRfY29kZSk7Ci19Ci0KLS8qKgotICogdHJhY2Vob29rX3ByZXBhcmVfY2xvbmUgLSBwcmVwYXJlIGZvciBuZXcgY2hpbGQgdG8gYmUgY2xvbmVkCi0gKiBAY2xvbmVfZmxhZ3M6CSVDTE9ORV8qIGZsYWdzIGZyb20gY2xvbmUvZm9yay92Zm9yayBzeXN0ZW0gY2FsbAotICoKLSAqIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBhIG5ldyB1c2VyIHRhc2sgaXMgdG8gYmUgY2xvbmVkLgotICogSXRzIHJldHVybiB2YWx1ZSB3aWxsIGJlIHBhc3NlZCB0byB0cmFjZWhvb2tfZmluaXNoX2Nsb25lKCkuCi0gKgotICogQ2FsbGVkIHdpdGggbm8gbG9ja3MgaGVsZC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgdHJhY2Vob29rX3ByZXBhcmVfY2xvbmUodW5zaWduZWQgY2xvbmVfZmxhZ3MpCi17Ci0JaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfVU5UUkFDRUQpCi0JCXJldHVybiAwOwotCi0JaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfVkZPUkspIHsKLQkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFX1ZGT1JLKQotCQkJcmV0dXJuIFBUUkFDRV9FVkVOVF9WRk9SSzsKLQl9IGVsc2UgaWYgKChjbG9uZV9mbGFncyAmIENTSUdOQUwpICE9IFNJR0NITEQpIHsKLQkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFX0NMT05FKQotCQkJcmV0dXJuIFBUUkFDRV9FVkVOVF9DTE9ORTsKLQl9IGVsc2UgaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFX0ZPUkspCi0JCXJldHVybiBQVFJBQ0VfRVZFTlRfRk9SSzsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHRyYWNlaG9va19maW5pc2hfY2xvbmUgLSBuZXcgY2hpbGQgY3JlYXRlZCBhbmQgYmVpbmcgYXR0YWNoZWQKLSAqIEBjaGlsZDoJCW5ldyBjaGlsZCB0YXNrCi0gKiBAY2xvbmVfZmxhZ3M6CSVDTE9ORV8qIGZsYWdzIGZyb20gY2xvbmUvZm9yay92Zm9yayBzeXN0ZW0gY2FsbAotICogQHRyYWNlOgkJcmV0dXJuIHZhbHVlIGZyb20gdHJhY2Vob29rX3ByZXBhcmVfY2xvbmUoKQotICoKLSAqIFRoaXMgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGFkZGluZyBAY2hpbGQgdG8gaXRzIHBhcmVudCdzIGNoaWxkcmVuIGxpc3QuCi0gKiBUaGUgQHRyYWNlIHZhbHVlIGlzIHRoYXQgcmV0dXJuZWQgYnkgdHJhY2Vob29rX3ByZXBhcmVfY2xvbmUoKS4KLSAqCi0gKiBDYWxsZWQgd2l0aCBjdXJyZW50J3Mgc2lnbG9jayBhbmQgd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spIGhlbGQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZWhvb2tfZmluaXNoX2Nsb25lKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCi0JCQkJCSAgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgaW50IHRyYWNlKQotewotCXB0cmFjZV9pbml0X3Rhc2soY2hpbGQsIChjbG9uZV9mbGFncyAmIENMT05FX1BUUkFDRSkgfHwgdHJhY2UpOwotfQotCi0vKioKLSAqIHRyYWNlaG9va19yZXBvcnRfY2xvbmUgLSBpbiBwYXJlbnQsIG5ldyBjaGlsZCBpcyBhYm91dCB0byBzdGFydCBydW5uaW5nCi0gKiBAcmVnczoJCXBhcmVudCdzIHVzZXIgcmVnaXN0ZXIgc3RhdGUKLSAqIEBjbG9uZV9mbGFnczoJZmxhZ3MgZnJvbSBwYXJlbnQncyBzeXN0ZW0gY2FsbAotICogQHBpZDoJCW5ldyBjaGlsZCdzIFBJRCBpbiB0aGUgcGFyZW50J3MgbmFtZXNwYWNlCi0gKiBAY2hpbGQ6CQluZXcgY2hpbGQgdGFzawotICoKLSAqIENhbGxlZCBhZnRlciBhIGNoaWxkIGlzIHNldCB1cCwgYnV0IGJlZm9yZSBpdCBoYXMgYmVlbiBzdGFydGVkIHJ1bm5pbmcuCi0gKiBUaGlzIGlzIG5vdCBhIGdvb2QgcGxhY2UgdG8gYmxvY2ssIGJlY2F1c2UgdGhlIGNoaWxkIGhhcyBub3Qgc3RhcnRlZAotICogeWV0LiAgU3VzcGVuZCB0aGUgY2hpbGQgaGVyZSBpZiBkZXNpcmVkLCBhbmQgdGhlbiBibG9jayBpbgotICogdHJhY2Vob29rX3JlcG9ydF9jbG9uZV9jb21wbGV0ZSgpLiAgVGhpcyBtdXN0IHByZXZlbnQgdGhlIGNoaWxkIGZyb20KLSAqIHNlbGYtcmVhcGluZyBpZiB0cmFjZWhvb2tfcmVwb3J0X2Nsb25lX2NvbXBsZXRlKCkgdXNlcyB0aGUgQGNoaWxkCi0gKiBwb2ludGVyOyBvdGhlcndpc2UgaXQgbWlnaHQgaGF2ZSBkaWVkIGFuZCBiZWVuIHJlbGVhc2VkIGJ5IHRoZSB0aW1lCi0gKiB0cmFjZWhvb2tfcmVwb3J0X2Nsb25lX2NvbXBsZXRlKCkgaXMgY2FsbGVkLgotICoKLSAqIENhbGxlZCB3aXRoIG5vIGxvY2tzIGhlbGQsIGJ1dCB0aGUgY2hpbGQgY2Fubm90IHJ1biB1bnRpbCB0aGlzIHJldHVybnMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZWhvb2tfcmVwb3J0X2Nsb25lKHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsCi0JCQkJCSAgcGlkX3QgcGlkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQotewotCWlmICh1bmxpa2VseSh0YXNrX3B0cmFjZShjaGlsZCkpKSB7Ci0JCS8qCi0JCSAqIEl0IGRvZXNuJ3QgbWF0dGVyIHdobyBhdHRhY2hlZC9hdHRhY2hpbmcgdG8gdGhpcwotCQkgKiB0YXNrLCB0aGUgcGVuZGluZyBTSUdTVE9QIGlzIHJpZ2h0IGluIGFueSBjYXNlLgotCQkgKi8KLQkJc2lnYWRkc2V0KCZjaGlsZC0+cGVuZGluZy5zaWduYWwsIFNJR1NUT1ApOwotCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU0lHUEVORElORyk7Ci0JfQotfQotCi0vKioKLSAqIHRyYWNlaG9va19yZXBvcnRfY2xvbmVfY29tcGxldGUgLSBuZXcgY2hpbGQgaXMgcnVubmluZwotICogQHRyYWNlOgkJcmV0dXJuIHZhbHVlIGZyb20gdHJhY2Vob29rX3ByZXBhcmVfY2xvbmUoKQotICogQHJlZ3M6CQlwYXJlbnQncyB1c2VyIHJlZ2lzdGVyIHN0YXRlCi0gKiBAY2xvbmVfZmxhZ3M6CWZsYWdzIGZyb20gcGFyZW50J3Mgc3lzdGVtIGNhbGwKLSAqIEBwaWQ6CQluZXcgY2hpbGQncyBQSUQgaW4gdGhlIHBhcmVudCdzIG5hbWVzcGFjZQotICogQGNoaWxkOgkJY2hpbGQgdGFzaywgYWxyZWFkeSBydW5uaW5nCi0gKgotICogVGhpcyBpcyBjYWxsZWQganVzdCBhZnRlciB0aGUgY2hpbGQgaGFzIHN0YXJ0ZWQgcnVubmluZy4gIFRoaXMgaXMKLSAqIGp1c3QgYmVmb3JlIHRoZSBjbG9uZS9mb3JrIHN5c2NhbGwgcmV0dXJucywgb3IgYmxvY2tzIGZvciB2Zm9yawotICogY2hpbGQgY29tcGxldGlvbiBpZiBAY2xvbmVfZmxhZ3MgaGFzIHRoZSAlQ0xPTkVfVkZPUksgYml0IHNldC4KLSAqIFRoZSBAY2hpbGQgcG9pbnRlciBtYXkgYmUgaW52YWxpZCBpZiBhIHNlbGYtcmVhcGluZyBjaGlsZCBkaWVkIGFuZAotICogdHJhY2Vob29rX3JlcG9ydF9jbG9uZSgpIHRvb2sgbm8gYWN0aW9uIHRvIHByZXZlbnQgaXQgZnJvbSBzZWxmLXJlYXBpbmcuCi0gKgotICogQ2FsbGVkIHdpdGggbm8gbG9ja3MgaGVsZC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHRyYWNlaG9va19yZXBvcnRfY2xvbmVfY29tcGxldGUoaW50IHRyYWNlLAotCQkJCQkJICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLAotCQkJCQkJICAgcGlkX3QgcGlkLAotCQkJCQkJICAgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKLXsKLQlpZiAodW5saWtlbHkodHJhY2UpKQotCQlwdHJhY2VfZXZlbnQoMCwgdHJhY2UsIHBpZCk7Ci19Ci0KLS8qKgotICogdHJhY2Vob29rX3JlcG9ydF92Zm9ya19kb25lIC0gdmZvcmsgcGFyZW50J3MgY2hpbGQgaGFzIGV4aXRlZCBvciBleGVjJ2QKLSAqIEBjaGlsZDoJCWNoaWxkIHRhc2ssIGFscmVhZHkgcnVubmluZwotICogQHBpZDoJCW5ldyBjaGlsZCdzIFBJRCBpbiB0aGUgcGFyZW50J3MgbmFtZXNwYWNlCi0gKgotICogQ2FsbGVkIGFmdGVyIGEgJUNMT05FX1ZGT1JLIHBhcmVudCBoYXMgd2FpdGVkIGZvciB0aGUgY2hpbGQgdG8gY29tcGxldGUuCi0gKiBUaGUgY2xvbmUvdmZvcmsgc3lzdGVtIGNhbGwgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcy4KLSAqIFRoZSBAY2hpbGQgcG9pbnRlciBtYXkgYmUgaW52YWxpZCBpZiBhIHNlbGYtcmVhcGluZyBjaGlsZCBkaWVkIGFuZAotICogdHJhY2Vob29rX3JlcG9ydF9jbG9uZSgpIHRvb2sgbm8gYWN0aW9uIHRvIHByZXZlbnQgaXQgZnJvbSBzZWxmLXJlYXBpbmcuCi0gKgotICogQ2FsbGVkIHdpdGggbm8gbG9ja3MgaGVsZC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHRyYWNlaG9va19yZXBvcnRfdmZvcmtfZG9uZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAotCQkJCQkgICAgICAgcGlkX3QgcGlkKQotewotCXB0cmFjZV9ldmVudChQVF9UUkFDRV9WRk9SS19ET05FLCBQVFJBQ0VfRVZFTlRfVkZPUktfRE9ORSwgcGlkKTsKLX0KLQotLyoqCi0gKiB0cmFjZWhvb2tfcHJlcGFyZV9yZWxlYXNlX3Rhc2sgLSB0YXNrIGlzIGJlaW5nIHJlYXBlZCwgY2xlYW4gdXAgdHJhY2luZwotICogQHRhc2s6CQl0YXNrIGluICVFWElUX0RFQUQgc3RhdGUKLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBpbiByZWxlYXNlX3Rhc2soKSBqdXN0IGJlZm9yZSBAdGFzayBnZXRzIGZpbmFsbHkgcmVhcGVkCi0gKiBhbmQgZnJlZWQuICBUaGlzIHdvdWxkIGJlIHRoZSBpZGVhbCBwbGFjZSB0byByZW1vdmUgYW5kIGNsZWFuIHVwIGFueQotICogdHJhY2luZy1yZWxhdGVkIHN0YXRlIGZvciBAdGFzay4KLSAqCi0gKiBDYWxsZWQgd2l0aCBubyBsb2NrcyBoZWxkLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhY2Vob29rX3ByZXBhcmVfcmVsZWFzZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLX0KLQotLyoqCi0gKiB0cmFjZWhvb2tfZmluaXNoX3JlbGVhc2VfdGFzayAtIGZpbmFsIHRyYWNpbmcgY2xlYW4tdXAKLSAqIEB0YXNrOgkJdGFzayBpbiAlRVhJVF9ERUFEIHN0YXRlCi0gKgotICogVGhpcyBpcyBjYWxsZWQgaW4gcmVsZWFzZV90YXNrKCkgd2hlbiBAdGFzayBpcyBiZWluZyBpbiB0aGUgbWlkZGxlIG9mCi0gKiBiZWluZyByZWFwZWQuICBBZnRlciB0aGlzLCB0aGVyZSBtdXN0IGJlIG5vIHRyYWNpbmcgZW50YW5nbGVtZW50cy4KLSAqCi0gKiBDYWxsZWQgd2l0aCB3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jaykgaGVsZC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHRyYWNlaG9va19maW5pc2hfcmVsZWFzZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQlwdHJhY2VfcmVsZWFzZV90YXNrKHRhc2spOwotfQotCi0vKioKICAqIHRyYWNlaG9va19zaWduYWxfaGFuZGxlciAtIHNpZ25hbCBoYW5kbGVyIHNldHVwIGlzIGNvbXBsZXRlCiAgKiBAc2lnOgkJbnVtYmVyIG9mIHNpZ25hbCBiZWluZyBkZWxpdmVyZWQKICAqIEBpbmZvOgkJc2lnaW5mb190IG9mIHNpZ25hbCBiZWluZyBkZWxpdmVyZWQKQEAgLTM5MCwxNTEgKzE1Miw2IEBACiAJCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7CiB9CiAKLS8qKgotICogdHJhY2Vob29rX2NvbnNpZGVyX2lnbm9yZWRfc2lnbmFsIC0gc3VwcHJlc3Mgc2hvcnQtY2lyY3VpdCBvZiBpZ25vcmVkIHNpZ25hbAotICogQHRhc2s6CQl0YXNrIHJlY2VpdmluZyB0aGUgc2lnbmFsCi0gKiBAc2lnOgkJc2lnbmFsIG51bWJlciBiZWluZyBzZW50Ci0gKgotICogUmV0dXJuIHplcm8gaWZmIHRyYWNpbmcgZG9lc24ndCBjYXJlIHRvIGV4YW1pbmUgdGhpcyBpZ25vcmVkIHNpZ25hbCwKLSAqIHNvIGl0IGNhbiBzaG9ydC1jaXJjdWl0IG5vcm1hbCBkZWxpdmVyeSBhbmQgbmV2ZXIgZXZlbiBnZXQgcXVldWVkLgotICoKLSAqIENhbGxlZCB3aXRoIEB0YXNrLT5zaWdoYW5kLT5zaWdsb2NrIGhlbGQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRyYWNlaG9va19jb25zaWRlcl9pZ25vcmVkX3NpZ25hbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQkJCQkgICAgaW50IHNpZykKLXsKLQlyZXR1cm4gKHRhc2tfcHRyYWNlKHRhc2spICYgUFRfUFRSQUNFRCkgIT0gMDsKLX0KLQotLyoqCi0gKiB0cmFjZWhvb2tfY29uc2lkZXJfZmF0YWxfc2lnbmFsIC0gc3VwcHJlc3Mgc3BlY2lhbCBoYW5kbGluZyBvZiBmYXRhbCBzaWduYWwKLSAqIEB0YXNrOgkJdGFzayByZWNlaXZpbmcgdGhlIHNpZ25hbAotICogQHNpZzoJCXNpZ25hbCBudW1iZXIgYmVpbmcgc2VudAotICoKLSAqIFJldHVybiBub256ZXJvIHRvIHByZXZlbnQgc3BlY2lhbCBoYW5kbGluZyBvZiB0aGlzIHRlcm1pbmF0aW9uIHNpZ25hbC4KLSAqIE5vcm1hbGx5IGhhbmRsZXIgZm9yIHNpZ25hbCBpcyAlU0lHX0RGTC4gIEl0IGNhbiBiZSAlU0lHX0lHTiBpZiBAc2lnIGlzCi0gKiBpZ25vcmVkLCBpbiB3aGljaCBjYXNlIGZvcmNlX3NpZygpIGlzIGFib3V0IHRvIHJlc2V0IGl0IHRvICVTSUdfREZMLgotICogV2hlbiB0aGlzIHJldHVybnMgemVybywgdGhpcyBzaWduYWwgbWlnaHQgY2F1c2UgYSBxdWljayB0ZXJtaW5hdGlvbgotICogdGhhdCBkb2VzIG5vdCBnaXZlIHRoZSBkZWJ1Z2dlciBhIGNoYW5jZSB0byBpbnRlcmNlcHQgdGhlIHNpZ25hbC4KLSAqCi0gKiBDYWxsZWQgd2l0aCBvciB3aXRob3V0IEB0YXNrLT5zaWdoYW5kLT5zaWdsb2NrIGhlbGQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRyYWNlaG9va19jb25zaWRlcl9mYXRhbF9zaWduYWwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkJCQkJICBpbnQgc2lnKQotewotCXJldHVybiAodGFza19wdHJhY2UodGFzaykgJiBQVF9QVFJBQ0VEKSAhPSAwOwotfQotCi0vKioKLSAqIHRyYWNlaG9va19mb3JjZV9zaWdwZW5kaW5nIC0gbGV0IHRyYWNpbmcgZm9yY2Ugc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgb24KLSAqCi0gKiBDYWxsZWQgd2hlbiByZWNvbXB1dGluZyBvdXIgc2lnbmFsX3BlbmRpbmcoKSBmbGFnLiAgUmV0dXJuIG5vbnplcm8KLSAqIHRvIGZvcmNlIHRoZSBzaWduYWxfcGVuZGluZygpIGZsYWcgb24sIHNvIHRoYXQgdHJhY2Vob29rX2dldF9zaWduYWwoKQotICogd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBuZXh0IHJldHVybiB0byB1c2VyIG1vZGUuCi0gKgotICogQ2FsbGVkIHdpdGggQGN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2sgaGVsZC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgdHJhY2Vob29rX2ZvcmNlX3NpZ3BlbmRpbmcodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB0cmFjZWhvb2tfZ2V0X3NpZ25hbCAtIGRlbGl2ZXIgc3ludGhldGljIHNpZ25hbCB0byB0cmFjZWQgdGFzawotICogQHRhc2s6CQlAY3VycmVudAotICogQHJlZ3M6CQl0YXNrX3B0X3JlZ3MoQGN1cnJlbnQpCi0gKiBAaW5mbzoJCWRldGFpbHMgb2Ygc3ludGhldGljIHNpZ25hbAotICogQHJldHVybl9rYToJCXNpZ2FjdGlvbiBmb3Igc3ludGhldGljIHNpZ25hbAotICoKLSAqIFJldHVybiB6ZXJvIHRvIGNoZWNrIGZvciBhIHJlYWwgcGVuZGluZyBzaWduYWwgbm9ybWFsbHkuCi0gKiBSZXR1cm4gLTEgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBzaWdsb2NrIHRvIHJlcGVhdCB0aGUgY2hlY2suCi0gKiBSZXR1cm4gYSBzaWduYWwgbnVtYmVyIHRvIGluZHVjZSBhbiBhcnRpZmljaWFsIHNpZ25hbCBkZWxpdmVyeSwKLSAqIHNldHRpbmcgKkBpbmZvIGFuZCAqQHJldHVybl9rYSB0byBzcGVjaWZ5IGl0cyBkZXRhaWxzIGFuZCBiZWhhdmlvci4KLSAqCi0gKiBUaGUgQHJldHVybl9rYS0+c2FfaGFuZGxlciB2YWx1ZSBjb250cm9scyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlCi0gKiBzaWduYWwsIG5vIG1hdHRlciB0aGUgc2lnbmFsIG51bWJlci4gIEZvciAlU0lHX0RGTCwgdGhlIHJldHVybiB2YWx1ZQotICogaXMgYSByZXByZXNlbnRhdGl2ZSBzaWduYWwgdG8gaW5kaWNhdGUgdGhlIGJlaGF2aW9yIChlLmcuICVTSUdURVJNCi0gKiBmb3IgZGVhdGgsICVTSUdRVUlUIGZvciBjb3JlIGR1bXAsICVTSUdTVE9QIGZvciBqb2IgY29udHJvbCBzdG9wLAotICogJVNJR1RTVFAgZm9yIHN0b3AgdW5sZXNzIGluIGFuIG9ycGhhbmVkIHBncnApLCBidXQgdGhlIHNpZ25hbCBudW1iZXIKLSAqIHJlcG9ydGVkIHdpbGwgYmUgQGluZm8tPnNpX3NpZ25vIGluc3RlYWQuCi0gKgotICogQ2FsbGVkIHdpdGggQHRhc2stPnNpZ2hhbmQtPnNpZ2xvY2sgaGVsZCwgYmVmb3JlIGRlcXVldWluZyBwZW5kaW5nIHNpZ25hbHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRyYWNlaG9va19nZXRfc2lnbmFsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJICAgICAgIHNpZ2luZm9fdCAqaW5mbywKLQkJCQkgICAgICAgc3RydWN0IGtfc2lnYWN0aW9uICpyZXR1cm5fa2EpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogdHJhY2Vob29rX2ZpbmlzaF9qY3RsIC0gcmVwb3J0IGFib3V0IHJldHVybiBmcm9tIGpvYiBjb250cm9sIHN0b3AKLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBieSBkb19zaWduYWxfc3RvcCgpIGFmdGVyIHdha2V1cC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHRyYWNlaG9va19maW5pc2hfamN0bCh2b2lkKQotewotfQotCi0jZGVmaW5lIERFQVRIX1JFQVAJCQktMQotI2RlZmluZSBERUFUSF9ERUxBWUVEX0dST1VQX0xFQURFUgktMgotCi0vKioKLSAqIHRyYWNlaG9va19ub3RpZnlfZGVhdGggLSB0YXNrIGlzIGRlYWQsIHJlYWR5IHRvIG5vdGlmeSBwYXJlbnQKLSAqIEB0YXNrOgkJQGN1cnJlbnQgdGFzayBub3cgZXhpdGluZwotICogQGRlYXRoX2Nvb2tpZToJdmFsdWUgdG8gcGFzcyB0byB0cmFjZWhvb2tfcmVwb3J0X2RlYXRoKCkKLSAqIEBncm91cF9kZWFkOgkJbm9uemVybyBpZiB0aGlzIHdhcyB0aGUgbGFzdCB0aHJlYWQgaW4gdGhlIGdyb3VwIHRvIGRpZQotICoKLSAqIEEgcmV0dXJuIHZhbHVlID49IDAgbWVhbnMgY2FsbCBkb19ub3RpZnlfcGFyZW50KCkgd2l0aCB0aGF0IHNpZ25hbAotICogbnVtYmVyLiAgTmVnYXRpdmUgcmV0dXJuIHZhbHVlIGNhbiBiZSAlREVBVEhfUkVBUCB0byBzZWxmLXJlYXAgcmlnaHQKLSAqIG5vdywgb3IgJURFQVRIX0RFTEFZRURfR1JPVVBfTEVBREVSIHRvIGEgem9tYmllIHdpdGhvdXQgbm90aWZ5aW5nIG91cgotICogcGFyZW50LiAgTm90ZSB0aGF0IGEgcmV0dXJuIHZhbHVlIG9mIDAgbWVhbnMgYSBkb19ub3RpZnlfcGFyZW50KCkgY2FsbAotICogdGhhdCBzZW5kcyBubyBzaWduYWwsIGJ1dCBzdGlsbCB3YWtlcyB1cCBhIHBhcmVudCBibG9ja2VkIGluIHdhaXQqKCkuCi0gKgotICogQ2FsbGVkIHdpdGggd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spIGhlbGQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRyYWNlaG9va19ub3RpZnlfZGVhdGgoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkJCQkgdm9pZCAqKmRlYXRoX2Nvb2tpZSwgaW50IGdyb3VwX2RlYWQpCi17Ci0JaWYgKHRhc2tfZGV0YWNoZWQodGFzaykpCi0JCXJldHVybiB0YXNrLT5wdHJhY2UgPyBTSUdDSExEIDogREVBVEhfUkVBUDsKLQotCS8qCi0JICogSWYgc29tZXRoaW5nIG90aGVyIHRoYW4gb3VyIG5vcm1hbCBwYXJlbnQgaXMgcHRyYWNpbmcgdXMsIHRoZW4KLQkgKiBzZW5kIGl0IGEgU0lHQ0hMRCBpbnN0ZWFkIG9mIGhvbm9yaW5nIGV4aXRfc2lnbmFsLiAgZXhpdF9zaWduYWwKLQkgKiBvbmx5IGhhcyBzcGVjaWFsIG1lYW5pbmcgdG8gb3VyIHJlYWwgcGFyZW50LgotCSAqLwotCWlmICh0aHJlYWRfZ3JvdXBfZW1wdHkodGFzaykgJiYgIXB0cmFjZV9yZXBhcmVudGVkKHRhc2spKQotCQlyZXR1cm4gdGFzay0+ZXhpdF9zaWduYWw7Ci0KLQlyZXR1cm4gdGFzay0+cHRyYWNlID8gU0lHQ0hMRCA6IERFQVRIX0RFTEFZRURfR1JPVVBfTEVBREVSOwotfQotCi0vKioKLSAqIHRyYWNlaG9va19yZXBvcnRfZGVhdGggLSB0YXNrIGlzIGRlYWQgYW5kIHJlYWR5IHRvIGJlIHJlYXBlZAotICogQHRhc2s6CQlAY3VycmVudCB0YXNrIG5vdyBleGl0aW5nCi0gKiBAc2lnbmFsOgkJcmV0dXJuIHZhbHVlIGZyb20gdHJhY2hlb29rX25vdGlmeV9kZWF0aCgpCi0gKiBAZGVhdGhfY29va2llOgl2YWx1ZSBwYXNzZWQgYmFjayBmcm9tIHRyYWNlaG9va19ub3RpZnlfZGVhdGgoKQotICogQGdyb3VwX2RlYWQ6CQlub256ZXJvIGlmIHRoaXMgd2FzIHRoZSBsYXN0IHRocmVhZCBpbiB0aGUgZ3JvdXAgdG8gZGllCi0gKgotICogVGhyZWFkIGhhcyBqdXN0IGJlY29tZSBhIHpvbWJpZSBvciBpcyBhYm91dCB0byBzZWxmLXJlYXAuICBJZiBwb3NpdGl2ZSwKLSAqIEBzaWduYWwgaXMgdGhlIHNpZ25hbCBudW1iZXIganVzdCBzZW50IHRvIHRoZSBwYXJlbnQgKHVzdWFsbHkgJVNJR0NITEQpLgotICogSWYgQHNpZ25hbCBpcyAlREVBVEhfUkVBUCwgdGhpcyB0aHJlYWQgd2lsbCBzZWxmLXJlYXAuICBJZiBAc2lnbmFsIGlzCi0gKiAlREVBVEhfREVMQVlFRF9HUk9VUF9MRUFERVIsIHRoaXMgaXMgYSBkZWxheWVkX2dyb3VwX2xlYWRlcigpIHpvbWJpZS4KLSAqIFRoZSBAZGVhdGhfY29va2llIHdhcyBwYXNzZWQgYmFjayBieSB0cmFjZWhvb2tfbm90aWZ5X2RlYXRoKCkuCi0gKgotICogSWYgbm9ybWFsIHJlYXBpbmcgaXMgbm90IGluaGliaXRlZCwgQHRhc2stPmV4aXRfc3RhdGUgbWlnaHQgYmUgY2hhbmdpbmcKLSAqIGluIHBhcmFsbGVsLgotICoKLSAqIENhbGxlZCB3aXRob3V0IGxvY2tzLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhY2Vob29rX3JlcG9ydF9kZWF0aChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQkJCSAgaW50IHNpZ25hbCwgdm9pZCAqZGVhdGhfY29va2llLAotCQkJCQkgIGludCBncm91cF9kZWFkKQotewotfQotCiAjaWZkZWYgVElGX05PVElGWV9SRVNVTUUKIC8qKgogICogc2V0X25vdGlmeV9yZXN1bWUgLSBjYXVzZSB0cmFjZWhvb2tfbm90aWZ5X3Jlc3VtZSgpIHRvIGJlIGNhbGxlZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvY29tcG9zaXRlLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaAppbmRleCBiNzhjYmE0Li5hMzE2ZmJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaApAQCAtNTksNiArNTksMTAgQEAKICAqIEBoc19kZXNjcmlwdG9yczogVGFibGUgb2YgaGlnaCBzcGVlZCBkZXNjcmlwdG9ycywgdXNpbmcgaW50ZXJmYWNlIGFuZAogICoJc3RyaW5nIGlkZW50aWZpZXJzIGFzc2lnbmVkIGR1cmluZyBAYmluZCgpLiAgSWYgdGhpcyBwb2ludGVyIGlzIG51bGwsCiAgKgl0aGUgZnVuY3Rpb24gd2lsbCBub3QgYmUgYXZhaWxhYmxlIGF0IGhpZ2ggc3BlZWQuCisgKiBAc3NfZGVzY3JpcHRvcnM6IFRhYmxlIG9mIHN1cGVyIHNwZWVkIGRlc2NyaXB0b3JzLCB1c2luZyBpbnRlcmZhY2UgYW5kCisgKglzdHJpbmcgaWRlbnRpZmllcnMgYXNzaWduZWQgZHVyaW5nIEBiaW5kKCkuIElmIHRoaXMKKyAqCXBvaW50ZXIgaXMgbnVsbCBhZnRlciBpbml0aWF0aW9uLCB0aGUgZnVuY3Rpb24gd2lsbCBub3QKKyAqCWJlIGF2YWlsYWJsZSBhdCBzdXBlciBzcGVlZC4KICAqIEBjb25maWc6IGFzc2lnbmVkIHdoZW4gQHVzYl9hZGRfZnVuY3Rpb24oKSBpcyBjYWxsZWQ7IHRoaXMgaXMgdGhlCiAgKgljb25maWd1cmF0aW9uIHdpdGggd2hpY2ggdGhpcyBmdW5jdGlvbiBpcyBhc3NvY2lhdGVkLgogICogQGJpbmQ6IEJlZm9yZSB0aGUgZ2FkZ2V0IGNhbiByZWdpc3RlciwgYWxsIG9mIGl0cyBmdW5jdGlvbnMgYmluZCgpIHRvIHRoZQpAQCAtNzcsNiArODEsMTAgQEAKICAqIEBzZXR1cDogVXNlZCBmb3IgaW50ZXJmYWNlLXNwZWNpZmljIGNvbnRyb2wgcmVxdWVzdHMuCiAgKiBAc3VzcGVuZDogTm90aWZpZXMgZnVuY3Rpb25zIHdoZW4gdGhlIGhvc3Qgc3RvcHMgc2VuZGluZyBVU0IgdHJhZmZpYy4KICAqIEByZXN1bWU6IE5vdGlmaWVzIGZ1bmN0aW9ucyB3aGVuIHRoZSBob3N0IHJlc3RhcnRzIFVTQiB0cmFmZmljLgorICogQGdldF9zdGF0dXM6IFJldHVybnMgZnVuY3Rpb24gc3RhdHVzIGFzIGEgcmVwbHkgdG8KKyAqCUdldFN0YXR1cygpIHJlcXVlc3Qgd2hlbiB0aGUgcmVjZXBpZW50IGlzIEludGVyZmFjZS4KKyAqIEBmdW5jX3N1c3BlbmQ6IGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuCisgKglTZXRGZWF0dXJlKEZVTkNUSU9OX1NVU1BFTkQpIGlzIHJlc2VpdmVkCiAgKgogICogQSBzaW5nbGUgVVNCIGZ1bmN0aW9uIHVzZXMgb25lIG9yIG1vcmUgaW50ZXJmYWNlcywgYW5kIHNob3VsZCBpbiBtb3N0CiAgKiBjYXNlcyBzdXBwb3J0IG9wZXJhdGlvbiBhdCBib3RoIGZ1bGwgYW5kIGhpZ2ggc3BlZWRzLiAgRWFjaCBmdW5jdGlvbiBpcwpAQCAtMTA2LDYgKzExNCw3IEBACiAJc3RydWN0IHVzYl9nYWRnZXRfc3RyaW5ncwkqKnN0cmluZ3M7CiAJc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlcgkqKmRlc2NyaXB0b3JzOwogCXN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIJKipoc19kZXNjcmlwdG9yczsKKwlzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyCSoqc3NfZGVzY3JpcHRvcnM7CiAKIAlzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24JKmNvbmZpZzsKIApAQCAtMTMyLDYgKzE0MSwxMCBAQAogCXZvaWQJCQkoKnN1c3BlbmQpKHN0cnVjdCB1c2JfZnVuY3Rpb24gKik7CiAJdm9pZAkJCSgqcmVzdW1lKShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICopOwogCisJLyogVVNCIDMuMCBhZGRpdGlvbnMgKi8KKwlpbnQJCQkoKmdldF9zdGF0dXMpKHN0cnVjdCB1c2JfZnVuY3Rpb24gKik7CisJaW50CQkJKCpmdW5jX3N1c3BlbmQpKHN0cnVjdCB1c2JfZnVuY3Rpb24gKiwKKwkJCQkJCXU4IHN1c3BlbmRfb3B0KTsKIAkvKiBwcml2YXRlOiAqLwogCS8qIGludGVybmFscyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7CkBAIC0xNDUsMjAgKzE1OCw4IEBACiAKIGludCB1c2JfaW50ZXJmYWNlX2lkKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqLCBzdHJ1Y3QgdXNiX2Z1bmN0aW9uICopOwogCi0vKioKLSAqIGVwX2Nob29zZSAtIHNlbGVjdCBkZXNjcmlwdG9yIGVuZHBvaW50IGF0IGN1cnJlbnQgZGV2aWNlIHNwZWVkCi0gKiBAZzogZ2FkZ2V0LCBjb25uZWN0ZWQgYW5kIHJ1bm5pbmcgYXQgc29tZSBzcGVlZAotICogQGhzOiBkZXNjcmlwdG9yIHRvIHVzZSBmb3IgaGlnaCBzcGVlZCBvcGVyYXRpb24KLSAqIEBmczogZGVzY3JpcHRvciB0byB1c2UgZm9yIGZ1bGwgb3IgbG93IHNwZWVkIG9wZXJhdGlvbgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqCi1lcF9jaG9vc2Uoc3RydWN0IHVzYl9nYWRnZXQgKmcsIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqaHMsCi0JCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZnMpCi17Ci0JaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZykgJiYgZy0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCi0JCXJldHVybiBoczsKLQlyZXR1cm4gZnM7Ci19CitpbnQgY29uZmlnX2VwX2J5X3NwZWVkKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnLCBzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmLAorCQkJc3RydWN0IHVzYl9lcCAqX2VwKTsKIAogI2RlZmluZQlNQVhfQ09ORklHX0lOVEVSRkFDRVMJCTE2CS8qIGFyYml0cmFyeTsgbWF4IDI1NSAqLwogCkBAIC0yMzEsNiArMjMyLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZAlmdW5jdGlvbnM7CiAJdTgJCQluZXh0X2ludGVyZmFjZV9pZDsKKwl1bnNpZ25lZAkJc3VwZXJzcGVlZDoxOwogCXVuc2lnbmVkCQloaWdoc3BlZWQ6MTsKIAl1bnNpZ25lZAkJZnVsbHNwZWVkOjE7CiAJc3RydWN0IHVzYl9mdW5jdGlvbgkqaW50ZXJmYWNlW01BWF9DT05GSUdfSU5URVJGQUNFU107CkBAIC0yNTIsNiArMjU0LDcgQEAKICAqCWlkZW50aWZpZXJzLgogICogQHN0cmluZ3M6IHRhYmxlcyBvZiBzdHJpbmdzLCBrZXllZCBieSBpZGVudGlmaWVycyBhc3NpZ25lZCBkdXJpbmcgYmluZCgpCiAgKglhbmQgbGFuZ3VhZ2UgSURzIHByb3ZpZGVkIGluIGNvbnRyb2wgcmVxdWVzdHMKKyAqIEBtYXhfc3BlZWQ6IEhpZ2hlc3Qgc3BlZWQgdGhlIGRyaXZlciBzdXBwb3J0cy4KICAqIEBuZWVkc19zZXJpYWw6IHNldCB0byAxIGlmIHRoZSBnYWRnZXQgbmVlZHMgdXNlcnNwYWNlIHRvIHByb3ZpZGUKICAqIAlhIHNlcmlhbCBudW1iZXIuICBJZiBvbmUgaXMgbm90IHByb3ZpZGVkLCB3YXJuaW5nIHdpbGwgYmUgcHJpbnRlZC4KICAqIEB1bmJpbmQ6IFJldmVyc2VzIGJpbmQ7IGNhbGxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHVucmVnaXN0ZXJpbmcKQEAgLTI3OSw2ICsyODIsNyBAQAogCWNvbnN0IGNoYXIJCQkJKmlNYW51ZmFjdHVyZXI7CiAJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvcgkqZGV2OwogCXN0cnVjdCB1c2JfZ2FkZ2V0X3N0cmluZ3MJCSoqc3RyaW5nczsKKwllbnVtIHVzYl9kZXZpY2Vfc3BlZWQJCQltYXhfc3BlZWQ7CiAJdW5zaWduZWQJCW5lZWRzX3NlcmlhbDoxOwogCiAJaW50CQkJKCp1bmJpbmQpKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldC5oIGIvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0LmgKaW5kZXggZGQxNTcxZC4uMDg3ZjRiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0LmgKQEAgLTE1LDcgKzE1LDEzIEBACiAjaWZuZGVmIF9fTElOVVhfVVNCX0dBREdFVF9ICiAjZGVmaW5lIF9fTElOVVhfVVNCX0dBREdFVF9ICiAKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgogCiBzdHJ1Y3QgdXNiX2VwOwogCkBAIC0yNyw2ICszMyw3IEBACiAgKglmaWVsZCwgYW5kIHRoZSB1c2IgY29udHJvbGxlciBuZWVkcyBvbmUsIGl0IGlzIHJlc3BvbnNpYmxlCiAgKglmb3IgbWFwcGluZyBhbmQgdW5tYXBwaW5nIHRoZSBidWZmZXIuCiAgKiBAbGVuZ3RoOiBMZW5ndGggb2YgdGhhdCBkYXRhCisgKiBAc3RyZWFtX2lkOiBUaGUgc3RyZWFtIGlkLCB3aGVuIFVTQjMuMCBidWxrIHN0cmVhbXMgYXJlIGJlaW5nIHVzZWQKICAqIEBub19pbnRlcnJ1cHQ6IElmIHRydWUsIGhpbnRzIHRoYXQgbm8gY29tcGxldGlvbiBpcnEgaXMgbmVlZGVkLgogICoJSGVscGZ1bCBzb21ldGltZXMgd2l0aCBkZWVwIHJlcXVlc3QgcXVldWVzIHRoYXQgYXJlIGhhbmRsZWQKICAqCWRpcmVjdGx5IGJ5IERNQSBjb250cm9sbGVycy4KQEAgLTgxLDYgKzg4LDcgQEAKIAl1bnNpZ25lZAkJbGVuZ3RoOwogCWRtYV9hZGRyX3QJCWRtYTsKIAorCXVuc2lnbmVkCQlzdHJlYW1faWQ6MTY7CiAJdW5zaWduZWQJCW5vX2ludGVycnVwdDoxOwogCXVuc2lnbmVkCQl6ZXJvOjE7CiAJdW5zaWduZWQJCXNob3J0X25vdF9vazoxOwpAQCAtMTMxLDggKzEzOSwxNyBAQAogICogQG1heHBhY2tldDpUaGUgbWF4aW11bSBwYWNrZXQgc2l6ZSB1c2VkIG9uIHRoaXMgZW5kcG9pbnQuICBUaGUgaW5pdGlhbAogICoJdmFsdWUgY2FuIHNvbWV0aW1lcyBiZSByZWR1Y2VkIChoYXJkd2FyZSBhbGxvd2luZyksIGFjY29yZGluZyB0bwogICogICAgICB0aGUgZW5kcG9pbnQgZGVzY3JpcHRvciB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZW5kcG9pbnQuCi0gKiBAZHJpdmVyX2RhdGE6Zm9yIHVzZSBieSB0aGUgZ2FkZ2V0IGRyaXZlci4gIGFsbCBvdGhlciBmaWVsZHMgYXJlCi0gKglyZWFkLW9ubHkgdG8gZ2FkZ2V0IGRyaXZlcnMuCisgKiBAbWF4X3N0cmVhbXM6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zIHN1cHBvcnRlZAorICoJYnkgdGhpcyBFUCAoMCAtIDE2LCBhY3R1YWwgbnVtYmVyIGlzIDJebikKKyAqIEBtdWx0OiBtdWx0aXBsaWVyLCAnbXVsdCcgdmFsdWUgZm9yIFNTIElzb2MgRVBzCisgKiBAbWF4YnVyc3Q6IHRoZSBtYXhpbXVtIG51bWJlciBvZiBidXJzdHMgc3VwcG9ydGVkIGJ5IHRoaXMgRVAgKGZvciB1c2IzKQorICogQGRyaXZlcl9kYXRhOmZvciB1c2UgYnkgdGhlIGdhZGdldCBkcml2ZXIuCisgKiBAYWRkcmVzczogdXNlZCB0byBpZGVudGlmeSB0aGUgZW5kcG9pbnQgd2hlbiBmaW5kaW5nIGRlc2NyaXB0b3IgdGhhdAorICoJbWF0Y2hlcyBjb25uZWN0aW9uIHNwZWVkCisgKiBAZGVzYzogZW5kcG9pbnQgZGVzY3JpcHRvci4gIFRoaXMgcG9pbnRlciBpcyBzZXQgYmVmb3JlIHRoZSBlbmRwb2ludCBpcworICoJZW5hYmxlZCBhbmQgcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgZW5kcG9pbnQgaXMgZGlzYWJsZWQuCisgKiBAY29tcF9kZXNjOiBJbiBjYXNlIG9mIFN1cGVyU3BlZWQgc3VwcG9ydCwgdGhpcyBpcyB0aGUgZW5kcG9pbnQgY29tcGFuaW9uCisgKglkZXNjcmlwdG9yIHRoYXQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGVuZHBvaW50CiAgKgogICogdGhlIGJ1cyBjb250cm9sbGVyIGRyaXZlciBsaXN0cyBhbGwgdGhlIGdlbmVyYWwgcHVycG9zZSBlbmRwb2ludHMgaW4KICAqIGdhZGdldC0+ZXBfbGlzdC4gIHRoZSBjb250cm9sIGVuZHBvaW50IChnYWRnZXQtPmVwMCkgaXMgbm90IGluIHRoYXQgbGlzdCwKQEAgLTE0NSw2ICsxNjIsMTIgQEAKIAljb25zdCBzdHJ1Y3QgdXNiX2VwX29wcwkqb3BzOwogCXN0cnVjdCBsaXN0X2hlYWQJZXBfbGlzdDsKIAl1bnNpZ25lZAkJbWF4cGFja2V0OjE2OworCXVuc2lnbmVkCQltYXhfc3RyZWFtczoxNjsKKwl1bnNpZ25lZAkJbXVsdDoyOworCXVuc2lnbmVkCQltYXhidXJzdDo0OworCXU4CQkJYWRkcmVzczsKKwljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmRlc2M7CisJY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IJKmNvbXBfZGVzYzsKIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xNTMsMTEgKzE3Niw4IEBACiAgKiB1c2JfZXBfZW5hYmxlIC0gY29uZmlndXJlIGVuZHBvaW50LCBtYWtpbmcgaXQgdXNhYmxlCiAgKiBAZXA6dGhlIGVuZHBvaW50IGJlaW5nIGNvbmZpZ3VyZWQuICBtYXkgbm90IGJlIHRoZSBlbmRwb2ludCBuYW1lZCAiZXAwIi4KICAqCWRyaXZlcnMgZGlzY292ZXIgZW5kcG9pbnRzIHRocm91Z2ggdGhlIGVwX2xpc3Qgb2YgYSB1c2JfZ2FkZ2V0LgotICogQGRlc2M6ZGVzY3JpcHRvciBmb3IgZGVzaXJlZCBiZWhhdmlvci4gIGNhbGxlciBndWFyYW50ZWVzIHRoaXMgcG9pbnRlcgotICoJcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgZW5kcG9pbnQgaXMgZGlzYWJsZWQ7IHRoZSBkYXRhIGJ5dGUgb3JkZXIKLSAqCWlzIGxpdHRsZS1lbmRpYW4gKHVzYi1zdGFuZGFyZCkuCiAgKgotICogd2hlbiBjb25maWd1cmF0aW9ucyBhcmUgc2V0LCBvciB3aGVuIGludGVyZmFjZSBzZXR0aW5ncyBjaGFuZ2UsIHRoZSBkcml2ZXIKKyAqIFdoZW4gY29uZmlndXJhdGlvbnMgYXJlIHNldCwgb3Igd2hlbiBpbnRlcmZhY2Ugc2V0dGluZ3MgY2hhbmdlLCB0aGUgZHJpdmVyCiAgKiB3aWxsIGVuYWJsZSBvciBkaXNhYmxlIHRoZSByZWxldmFudCBlbmRwb2ludHMuICB3aGlsZSBpdCBpcyBlbmFibGVkLCBhbgogICogZW5kcG9pbnQgbWF5IGJlIHVzZWQgZm9yIGkvbyB1bnRpbCB0aGUgZHJpdmVyIHJlY2VpdmVzIGEgZGlzY29ubmVjdCgpIGZyb20KICAqIHRoZSBob3N0IG9yIHVudGlsIHRoZSBlbmRwb2ludCBpcyBkaXNhYmxlZC4KQEAgLTE3MiwxMCArMTkyLDkgQEAKICAqCiAgKiByZXR1cm5zIHplcm8sIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgdXNiX2VwX2VuYWJsZShzdHJ1Y3QgdXNiX2VwICplcCwKLQkJCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2MpCitzdGF0aWMgaW5saW5lIGludCB1c2JfZXBfZW5hYmxlKHN0cnVjdCB1c2JfZXAgKmVwKQogewotCXJldHVybiBlcC0+b3BzLT5lbmFibGUoZXAsIGRlc2MpOworCXJldHVybiBlcC0+b3BzLT5lbmFibGUoZXAsIGVwLT5kZXNjKTsKIH0KIAogLyoqCkBAIC00MTYsNyArNDM1LDE2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK3N0cnVjdCB1c2JfZGNkX2NvbmZpZ19wYXJhbXMgeworCV9fdTggIGJVMWRldkV4aXRMYXQ7CS8qIFUxIERldmljZSBleGl0IExhdGVuY3kgKi8KKyNkZWZpbmUgVVNCX0RFRlVMVF9VMV9ERVZfRVhJVF9MQVQJMHgwMQkvKiBMZXNzIHRoZW4gMSBtaWNyb3NlYyAqLworCV9fbGUxNiBiVTJEZXZFeGl0TGF0OwkvKiBVMiBEZXZpY2UgZXhpdCBMYXRlbmN5ICovCisjZGVmaW5lIFVTQl9ERUZVTFRfVTJfREVWX0VYSVRfTEFUCTB4MUY0CS8qIExlc3MgdGhlbiA1MDAgbWljcm9zZWMgKi8KK307CisKKwogc3RydWN0IHVzYl9nYWRnZXQ7CitzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXI7CiAKIC8qIHRoZSByZXN0IG9mIHRoZSBhcGkgdG8gdGhlIGNvbnRyb2xsZXIgaGFyZHdhcmU6IGRldmljZSBvcGVyYXRpb25zLAogICogd2hpY2ggZG9uJ3QgaW52b2x2ZSBlbmRwb2ludHMgKG9yIGkvbykuCkBAIC00MzAsNiArNDU4LDE2IEBACiAJaW50CSgqcHVsbHVwKSAoc3RydWN0IHVzYl9nYWRnZXQgKiwgaW50IGlzX29uKTsKIAlpbnQJKCppb2N0bCkoc3RydWN0IHVzYl9nYWRnZXQgKiwKIAkJCQl1bnNpZ25lZCBjb2RlLCB1bnNpZ25lZCBsb25nIHBhcmFtKTsKKwl2b2lkCSgqZ2V0X2NvbmZpZ19wYXJhbXMpKHN0cnVjdCB1c2JfZGNkX2NvbmZpZ19wYXJhbXMgKik7CisJaW50CSgqdWRjX3N0YXJ0KShzdHJ1Y3QgdXNiX2dhZGdldCAqLAorCQkJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICopOworCWludAkoKnVkY19zdG9wKShzdHJ1Y3QgdXNiX2dhZGdldCAqLAorCQkJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICopOworCisJLyogVGhvc2UgdHdvIGFyZSBkZXByZWNhdGVkICovCisJaW50CSgqc3RhcnQpKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqLAorCQkJaW50ICgqYmluZCkoc3RydWN0IHVzYl9nYWRnZXQgKikpOworCWludAkoKnN0b3ApKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqKTsKIH07CiAKIC8qKgpAQCAtNTIxLDYgKzU1OSwyNCBAQAogfQogCiAvKioKKyAqIGdhZGdldF9pc19zdXBlcnNwZWVkKCkgLSByZXR1cm4gdHJ1ZSBpZiB0aGUgaGFyZHdhcmUgaGFuZGxlcworICogc3VwcGVyc3BlZWQKKyAqIEBnOiBjb250cm9sbGVyIHRoYXQgbWlnaHQgc3VwcG9ydCBzdXBwZXIgc3BlZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoc3RydWN0IHVzYl9nYWRnZXQgKmcpCit7CisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfU1VQRVJTUEVFRAorCS8qCisJICogcnVudGltZSB0ZXN0IHdvdWxkIGNoZWNrICJnLT5pc19zdXBlcnNwZWVkIiAuLi4gdGhhdCBtaWdodCBiZQorCSAqIHVzZWZ1bCB0byB3b3JrIGFyb3VuZCBoYXJkd2FyZSBidWdzLCBidXQgaXMgbW9zdGx5IHBvaW50bGVzcworCSAqLworCXJldHVybiAxOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisvKioKICAqIGdhZGdldF9pc19vdGcgLSByZXR1cm4gdHJ1ZSBpZmYgdGhlIGhhcmR3YXJlIGlzIE9URy1yZWFkeQogICogQGc6IGNvbnRyb2xsZXIgdGhhdCBtaWdodCBoYXZlIGEgTWluaS1BQiBjb25uZWN0b3IKICAqCkBAIC04MjEsNiArODc3LDkgQEAKICAqLwogaW50IHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpOwogCitleHRlcm4gaW50IHVzYl9hZGRfZ2FkZ2V0X3VkYyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpOworZXh0ZXJuIHZvaWQgdXNiX2RlbF9nYWRnZXRfdWRjKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpOworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiB1dGlsaXR5IHRvIHNpbXBsaWZ5IGRlYWxpbmcgd2l0aCBzdHJpbmcgZGVzY3JpcHRvcnMgKi8KQEAgLTg3MCwxMiArOTI5LDYgQEAKIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKip1c2JfY29weV9kZXNjcmlwdG9ycygKIAkJc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKik7CiAKLS8qIHJldHVybiBjb3B5IG9mIGVuZHBvaW50IGRlc2NyaXB0b3IgZ2l2ZW4gb3JpZ2luYWwgZGVzY3JpcHRvciBzZXQgKi8KLXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqdXNiX2ZpbmRfZW5kcG9pbnQoCi0Jc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKnNyYywKLQlzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICoqY29weSwKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKm1hdGNoKTsKLQogLyoqCiAgKiB1c2JfZnJlZV9kZXNjcmlwdG9ycyAtIGZyZWUgZGVzY3JpcHRvcnMgcmV0dXJuZWQgYnkgdXNiX2NvcHlfZGVzY3JpcHRvcnMoKQogICogQHY6IHZlY3RvciBvZiBkZXNjcmlwdG9ycwpAQCAtODkyLDYgKzk0NSwxMSBAQAogZXh0ZXJuIHN0cnVjdCB1c2JfZXAgKnVzYl9lcF9hdXRvY29uZmlnKHN0cnVjdCB1c2JfZ2FkZ2V0ICosCiAJCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKik7CiAKKworZXh0ZXJuIHN0cnVjdCB1c2JfZXAgKnVzYl9lcF9hdXRvY29uZmlnX3NzKHN0cnVjdCB1c2JfZ2FkZ2V0ICosCisJCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKiwKKwkJCXN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yICopOworCiBleHRlcm4gdm9pZCB1c2JfZXBfYXV0b2NvbmZpZ19yZXNldChzdHJ1Y3QgdXNiX2dhZGdldCAqKTsKIAogI2VuZGlmIC8qIF9fTElOVVhfVVNCX0dBREdFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9tNjY1OTIuaCBiL2luY2x1ZGUvbGludXgvdXNiL202NjU5Mi5oCmluZGV4IGNkYTk2MjUuLmE0YmEzMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL202NjU5Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL202NjU5Mi5oCkBAIC0zOCw2ICszOCw4IEBACiAJLyogKGV4dGVybmFsIGNvbnRyb2xsZXIgb25seSkgb25lID0gMy4zViwgemVybyA9IDEuNVYgKi8KIAl1bnNpZ25lZAl2aWY6MTsKIAorCS8qIChleHRlcm5hbCBjb250cm9sbGVyIG9ubHkpIHNldCBvbmUgPSBXUjBfTiBzaG9ydGVkIHRvIFdSMV9OICovCisJdW5zaWduZWQJd3IwX3Nob3J0ZWRfdG9fd3IxOjE7CiB9OwogCiAjZW5kaWYgLyogX19MSU5VWF9VU0JfTTY2NTkyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL3I4YTY2NTk3LmggYi9pbmNsdWRlL2xpbnV4L3VzYi9yOGE2NjU5Ny5oCmluZGV4IDI2ZDIxNjcuLmI2Yjg2NjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3I4YTY2NTk3LmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvcjhhNjY1OTcuaApAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCiAgKgotICogQXV0aG9yIDogWW9zaGloaXJvIFNoaW1vZGEgPHNoaW1vZGEueW9zaGloaXJvQHJlbmVzYXMuY29tPgorICogQXV0aG9yIDogWW9zaGloaXJvIFNoaW1vZGEgPHlvc2hpaGlyby5zaGltb2RhLnVoQHJlbmVzYXMuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzEsNiArMzEsOSBAQAogCS8qIFRoaXMgY2FsbGJhY2sgY2FuIGNvbnRyb2wgcG9ydCBwb3dlciBpbnN0ZWFkIG9mIERWU1RDVFIgcmVnaXN0ZXIuICovCiAJdm9pZCAoKnBvcnRfcG93ZXIpKGludCBwb3J0LCBpbnQgcG93ZXIpOwogCisJLyogVGhpcyBwYXJhbWV0ZXIgaXMgZm9yIEJVU1dBSVQgKi8KKwl1MTYJCWJ1c3dhaXQ7CisKIAkvKiBzZXQgb25lID0gb24gY2hpcCBjb250cm9sbGVyLCBzZXQgemVybyA9IGV4dGVybmFsIGNvbnRyb2xsZXIgKi8KIAl1bnNpZ25lZAlvbl9jaGlwOjE7CiAKQEAgLTQyLDYgKzQ1LDkgQEAKIAogCS8qIHNldCBvbmUgPSBiaWcgZW5kaWFuLCBzZXQgemVybyA9IGxpdHRsZSBlbmRpYW4gKi8KIAl1bnNpZ25lZAllbmRpYW46MTsKKworCS8qIChleHRlcm5hbCBjb250cm9sbGVyIG9ubHkpIHNldCBvbmUgPSBXUjBfTiBzaG9ydGVkIHRvIFdSMV9OICovCisJdW5zaWduZWQJd3IwX3Nob3J0ZWRfdG9fd3IxOjE7CiB9OwogCiAvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvcmVuZXNhc191c2Jocy5oIGIvaW5jbHVkZS9saW51eC91c2IvcmVuZXNhc191c2Jocy5oCmluZGV4IDNhN2YxZDkuLjg5Nzc0MzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3JlbmVzYXNfdXNiaHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9yZW5lc2FzX3VzYmhzLmgKQEAgLTExMCw2ICsxMTAsMjMgQEAKIAkgKiBkZWxheSB0aW1lIGZyb20gbm90aWZ5X2hvdHBsdWcgY2FsbGJhY2sKIAkgKi8KIAlpbnQgZGV0ZWN0aW9uX2RlbGF5OworCisJLyoKKwkgKiBvcHRpb246CisJICoKKwkgKiBkbWEgaWQgZm9yIGRtYWVuZ2luZQorCSAqLworCWludCBkMF90eF9pZDsKKwlpbnQgZDBfcnhfaWQ7CisJaW50IGQxX3R4X2lkOworCWludCBkMV9yeF9pZDsKKworCS8qCisJICogb3B0aW9uOgorCSAqCisJICogcGlvIDwtLT4gZG1hIGJvcmRlci4KKwkgKi8KKwlpbnQgcGlvX2RtYV9ib3JkZXI7IC8qIGRlZmF1bHQgaXMgNjRieXRlICovCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaCBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKaW5kZXggNzE2OTNkNC4uMTdkZjM2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCkBAIC02Miw3ICs2Miw5IEBACiAJVVNfRkxBRyhOT19SRUFEX0RJU0NfSU5GTywJMHgwMDA0MDAwMCkJCVwKIAkJLyogY2Fubm90IGhhbmRsZSBSRUFEX0RJU0NfSU5GTyAqLwkJXAogCVVTX0ZMQUcoTk9fUkVBRF9DQVBBQ0lUWV8xNiwJMHgwMDA4MDAwMCkJCVwKLQkJLyogY2Fubm90IGhhbmRsZSBSRUFEX0NBUEFDSVRZXzE2ICovCisJCS8qIGNhbm5vdCBoYW5kbGUgUkVBRF9DQVBBQ0lUWV8xNiAqLwkJXAorCVVTX0ZMQUcoSU5JVElBTF9SRUFEMTAsCTB4MDAxMDAwMDApCQkJXAorCQkvKiBJbml0aWFsIFJFQUQoMTApIChhbmQgb3RoZXJzKSBtdXN0IGJlIHJldHJpZWQgKi8KIAogI2RlZmluZSBVU19GTEFHKG5hbWUsIHZhbHVlKQlVU19GTF8jI25hbWUgPSB2YWx1ZSAsCiBlbnVtIHsgVVNfRE9fQUxMX0ZMQUdTIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3V0cy5oIGIvaW5jbHVkZS9saW51eC91dHMuaAppbmRleCA3M2ViMWVkLi42ZGRiZDg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3V0cy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXRzLmgKQEAgLTksNyArOSw3IEBACiAjZW5kaWYKIAogI2lmbmRlZiBVVFNfTk9ERU5BTUUKLSNkZWZpbmUgVVRTX05PREVOQU1FICIobm9uZSkiCS8qIHNldCBieSBzZXRob3N0bmFtZSgpICovCisjZGVmaW5lIFVUU19OT0RFTkFNRSBDT05GSUdfREVGQVVMVF9IT1NUTkFNRSAvKiBzZXQgYnkgc2V0aG9zdG5hbWUoKSAqLwogI2VuZGlmCiAKICNpZm5kZWYgVVRTX0RPTUFJTk5BTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvX25ldC5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fbmV0LmgKaW5kZXggMTM2MDQwYi4uOTcwZDVhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW9fbmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fbmV0LmgKQEAgLTYzLDYgKzYzLDcgQEAKICAqIHNwZWNpZnkgR1NPIG9yIENTVU0gZmVhdHVyZXMsIHlvdSBjYW4gc2ltcGx5IGlnbm9yZSB0aGUgaGVhZGVyLiAqLwogc3RydWN0IHZpcnRpb19uZXRfaGRyIHsKICNkZWZpbmUgVklSVElPX05FVF9IRFJfRl9ORUVEU19DU1VNCTEJLy8gVXNlIGNzdW1fc3RhcnQsIGNzdW1fb2Zmc2V0CisjZGVmaW5lIFZJUlRJT19ORVRfSERSX0ZfREFUQV9WQUxJRAkyCS8vIENzdW0gaXMgdmFsaWQKIAlfX3U4IGZsYWdzOwogI2RlZmluZSBWSVJUSU9fTkVUX0hEUl9HU09fTk9ORQkJMAkvLyBOb3QgYSBHU08gZnJhbWUKICNkZWZpbmUgVklSVElPX05FVF9IRFJfR1NPX1RDUFY0CTEJLy8gR1NPIGZyYW1lLCBJUHY0IFRDUCAoVFNPKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92dC5oIGIvaW5jbHVkZS9saW51eC92dC5oCmluZGV4IGQ1ZGQwYmMuLjMwYThkZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Z0LmgKQEAgLTg2LDYgKzg2LDEzIEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKKy8qIFZpcnR1YWwgVGVybWluYWwgZXZlbnRzLiAqLworI2RlZmluZSBWVF9BTExPQ0FURQkJMHgwMDAxIC8qIENvbnNvbGUgZ290IGFsbG9jYXRlZCAqLworI2RlZmluZSBWVF9ERUFMTE9DQVRFCQkweDAwMDIgLyogQ29uc29sZSB3aWxsIGJlIGRlYWxsb2NhdGVkICovCisjZGVmaW5lIFZUX1dSSVRFCQkweDAwMDMgLyogQSBjaGFyIGdvdCBvdXRwdXQgKi8KKyNkZWZpbmUgVlRfVVBEQVRFCQkweDAwMDQgLyogQSBiaWdnZXIgdXBkYXRlIG9jY3VycmVkICovCisjZGVmaW5lIFZUX1BSRVdSSVRFCQkweDAwMDUgLyogQSBjaGFyIGlzIGFib3V0IHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNvbnNvbGUgKi8KKwogI2lmZGVmIENPTkZJR19WVF9DT05TT0xFCiAKIGV4dGVybiBpbnQgdnRfa21zZ19yZWRpcmVjdChpbnQgbmV3KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmggYi9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCmluZGV4IGY1ODRhYmEuLjJiZTI4ODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKKysrIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaApAQCAtMjU1LDcgKzI1NSw3IEBACiAJV1FfSElHSFBSSQkJPSAxIDw8IDQsIC8qIGhpZ2ggcHJpb3JpdHkgKi8KIAlXUV9DUFVfSU5URU5TSVZFCT0gMSA8PCA1LCAvKiBjcHUgaW5zdGVuc2l2ZSB3b3JrcXVldWUgKi8KIAotCVdRX0RZSU5HCQk9IDEgPDwgNiwgLyogaW50ZXJuYWw6IHdvcmtxdWV1ZSBpcyBkeWluZyAqLworCVdRX0RSQUlOSU5HCQk9IDEgPDwgNiwgLyogaW50ZXJuYWw6IHdvcmtxdWV1ZSBpcyBkcmFpbmluZyAqLwogCVdRX1JFU0NVRVIJCT0gMSA8PCA3LCAvKiBpbnRlcm5hbDogd29ya3F1ZXVlIGhhcyByZXNjdWVyICovCiAKIAlXUV9NQVhfQUNUSVZFCQk9IDUxMiwJICAvKiBJIGxpa2UgNTEyLCBiZXR0ZXIgaWRlYXM/ICovCkBAIC0zNTUsNiArMzU1LDcgQEAKIAkJCXN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpOwogCiBleHRlcm4gdm9pZCBmbHVzaF93b3JrcXVldWUoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKTsKK2V4dGVybiB2b2lkIGRyYWluX3dvcmtxdWV1ZShzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpOwogZXh0ZXJuIHZvaWQgZmx1c2hfc2NoZWR1bGVkX3dvcmsodm9pZCk7CiAKIGV4dGVybiBpbnQgc2NoZWR1bGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwpAQCAtNDEyLDIxICs0MTMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIE9ic29sZXRlLiB1c2UgY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCkgKi8KLXN0YXRpYyBpbmxpbmUgX19kZXByZWNhdGVkCi12b2lkIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmtxdWV1ZShzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EsCi0JCQkJCXN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspCi17Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKHdvcmspOwotfQotCi0vKiBPYnNvbGV0ZS4gdXNlIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygpICovCi1zdGF0aWMgaW5saW5lIF9fZGVwcmVjYXRlZAotdm9pZCBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspCi17Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKHdvcmspOwotfQotCiAjaWZuZGVmIENPTkZJR19TTVAKIHN0YXRpYyBpbmxpbmUgbG9uZyB3b3JrX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCBsb25nICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvem9ycm8uaCBiL2luY2x1ZGUvbGludXgvem9ycm8uaAppbmRleCA3YmY5ZGI1Li5kZmY0MjAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3pvcnJvLmgKKysrIGIvaW5jbHVkZS9saW51eC96b3Jyby5oCkBAIC0xODcsNyArMTg3LDcgQEAKIAogI2RlZmluZSB6b3Jyb19yZXNvdXJjZV9zdGFydCh6KQkoKHopLT5yZXNvdXJjZS5zdGFydCkKICNkZWZpbmUgem9ycm9fcmVzb3VyY2VfZW5kKHopCSgoeiktPnJlc291cmNlLmVuZCkKLSNkZWZpbmUgem9ycm9fcmVzb3VyY2VfbGVuKHopCSgoeiktPnJlc291cmNlLmVuZC0oeiktPnJlc291cmNlLnN0YXJ0KzEpCisjZGVmaW5lIHpvcnJvX3Jlc291cmNlX2xlbih6KQkocmVzb3VyY2Vfc2l6ZSgmKHopLT5yZXNvdXJjZSkpCiAjZGVmaW5lIHpvcnJvX3Jlc291cmNlX2ZsYWdzKHopCSgoeiktPnJlc291cmNlLmZsYWdzKQogCiAjZGVmaW5lIHpvcnJvX3JlcXVlc3RfZGV2aWNlKHosIG5hbWUpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbGlyY19kZXYuaCBiL2luY2x1ZGUvbWVkaWEvbGlyY19kZXYuaAppbmRleCA2MzBlNzAyLi4xNjhkZDBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2xpcmNfZGV2LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9saXJjX2Rldi5oCkBAIC05LDcgKzksNyBAQAogI2lmbmRlZiBfTElOVVhfTElSQ19ERVZfSAogI2RlZmluZSBfTElOVVhfTElSQ19ERVZfSAogCi0jZGVmaW5lIE1BWF9JUkNUTF9ERVZJQ0VTIDQKKyNkZWZpbmUgTUFYX0lSQ1RMX0RFVklDRVMgOAogI2RlZmluZSBCVUZMRU4gICAgICAgICAgICAxNgogCiAjZGVmaW5lIG1vZChuLCBkaXYpICgobikgJSAoZGl2KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbTVtb2xzLmggYi9pbmNsdWRlL21lZGlhL201bW9scy5oCmluZGV4IDJkN2U3Y2EuLmFhYzJjMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbTVtb2xzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tNW1vbHMuaApAQCAtMiwxMCArMiwxMCBAQAogICogRHJpdmVyIGhlYWRlciBmb3IgTS01TU9MUyA4TSBQaXhlbCBjYW1lcmEgc2Vuc29yIHdpdGggSVNQCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKiBBdXRob3I6IEhldW5nSnVuIEtpbSwgcml2ZXJmdWwua2ltQHNhbXN1bmcuY29tCisgKiBBdXRob3I6IEhldW5nSnVuIEtpbSA8cml2ZXJmdWwua2ltQHNhbXN1bmcuY29tPgogICoKICAqIENvcHlyaWdodCAoQykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICogQXV0aG9yOiBEb25nc29vIE5hdGhhbmllbCBLaW0sIGRvbmdzb280NS5raW1Ac2Ftc3VuZy5jb20KKyAqIEF1dGhvcjogRG9uZ3NvbyBOYXRoYW5pZWwgS2ltIDxkb25nc29vNDUua2ltQHNhbXN1bmcuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oCmluZGV4IDkzZTk2ZmIuLmM3YzQwZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmgKQEAgLTEyOCw4ICsxMjgsOCBAQAogCXN0cnVjdCBtdXRleCAqbG9jazsKIH07CiAKLSNkZWZpbmUgbWVkaWFfZW50aXR5X3RvX3ZpZGVvX2RldmljZShlbnRpdHkpIFwKLQljb250YWluZXJfb2YoZW50aXR5LCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBlbnRpdHkpCisjZGVmaW5lIG1lZGlhX2VudGl0eV90b192aWRlb19kZXZpY2UoX19lKSBcCisJY29udGFpbmVyX29mKF9fZSwgc3RydWN0IHZpZGVvX2RldmljZSwgZW50aXR5KQogLyogZGV2IHRvIHZpZGVvLWRldmljZSAqLwogI2RlZmluZSB0b192aWRlb19kZXZpY2UoY2QpIGNvbnRhaW5lcl9vZihjZCwgc3RydWN0IHZpZGVvX2RldmljZSwgZGV2KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmggYi9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmgKaW5kZXggMTU2MmM0Zi4uMjg4NGUzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLXN1YmRldi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaApAQCAtMTczLDE2ICsxNzMsMjAgQEAKIAkJCQkgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpOwogfTsKIAotLyogc19tb2RlOiBzd2l0Y2ggdGhlIHR1bmVyIHRvIGEgc3BlY2lmaWMgdHVuZXIgbW9kZS4gUmVwbGFjZW1lbnQgb2Ygc19yYWRpby4KKy8qIHNfcmFkaW86IHY0bCBkZXZpY2Ugd2FzIG9wZW5lZCBpbiByYWRpbyBtb2RlLgogCi0gICBzX3JhZGlvOiB2NGwgZGV2aWNlIHdhcyBvcGVuZWQgaW4gUmFkaW8gbW9kZSwgdG8gYmUgcmVwbGFjZWQgYnkgc19tb2RlLgorICAgZ19mcmVxdWVuY3k6IGZyZXEtPnR5cGUgbXVzdCBiZSBmaWxsZWQgaW4uIE5vcm1hbGx5IGRvbmUgYnkgdmlkZW9faW9jdGwyCisJb3IgdGhlIGJyaWRnZSBkcml2ZXIuCisKKyAgIGdfdHVuZXI6CisgICBzX3R1bmVyOiB2dC0+dHlwZSBtdXN0IGJlIGZpbGxlZCBpbi4gTm9ybWFsbHkgZG9uZSBieSB2aWRlb19pb2N0bDIgb3IgdGhlCisJYnJpZGdlIGRyaXZlci4KIAogICAgc190eXBlX2FkZHI6IHNldHMgdHVuZXIgdHlwZSBhbmQgaXRzIEkyQyBhZGRyLgogCiAgICBzX2NvbmZpZzogc2V0cyB0ZGE5ODg3IHNwZWNpZmljIHN0dWZmLCBsaWtlIHBvcnQxLCBwb3J0MiBhbmQgcXNzCiAgKi8KIHN0cnVjdCB2NGwyX3N1YmRldl90dW5lcl9vcHMgewotCWludCAoKnNfbW9kZSkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgZW51bSB2NGwyX3R1bmVyX3R5cGUpOwogCWludCAoKnNfcmFkaW8pKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpOwogCWludCAoKnNfZnJlcXVlbmN5KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmZyZXEpOwogCWludCAoKmdfZnJlcXVlbmN5KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmZyZXEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvOXAvOXAuaCBiL2luY2x1ZGUvbmV0LzlwLzlwLmgKaW5kZXggMDA4NzExZS4uMzQyZGNmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvOXAvOXAuaAorKysgYi9pbmNsdWRlL25ldC85cC85cC5oCkBAIC00MCw2ICs0MCw3IEBACiAgKiBAUDlfREVCVUdfRklEOiBmaWQgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gdHJhY2tpbmcKICAqIEBQOV9ERUJVR19QS1Q6IHBhY2tldCBtYXJzaGFsbGluZy91bm1hcnNoYWxsaW5nCiAgKiBAUDlfREVCVUdfRlNDOiBGUy1jYWNoZSB0cmFjaW5nCisgKiBAUDlfREVCVUdfVlBLVDogVmVyYm9zZSBwYWNrZXQgZGVidWdnaW5nIChmdWxsIHBhY2tldCBkdW1wKQogICoKICAqIFRoZXNlIGZsYWdzIGFyZSBwYXNzZWQgYXQgbW91bnQgdGltZSB0byB0dXJuIG9uIHZhcmlvdXMgbGV2ZWxzIG9mCiAgKiB2ZXJib3NpdHkgYW5kIHRyYWNpbmcgd2hpY2ggd2lsbCBiZSBvdXRwdXQgdG8gdGhlIHN5c3RlbSBsb2dzLgpAQCAtNTcsNiArNTgsNyBAQAogCVA5X0RFQlVHX0ZJRCA9CQkoMTw8OSksCiAJUDlfREVCVUdfUEtUID0JCSgxPDwxMCksCiAJUDlfREVCVUdfRlNDID0JCSgxPDwxMSksCisJUDlfREVCVUdfVlBLVCA9CQkoMTw8MTIpLAogfTsKIAogI2lmZGVmIENPTkZJR19ORVRfOVBfREVCVUcKQEAgLTc0LDEwICs3NiwxNCBAQAogCX0gXAogfSB3aGlsZSAoMCkKIAorI2RlZmluZSBQOV9EVU1QX1BLVCh3YXksIHBkdSkgcDlwZHVfZHVtcCh3YXksIHBkdSkKKwogI2Vsc2UKICNkZWZpbmUgUDlfRFBSSU5USyhsZXZlbCwgZm9ybWF0LCBhcmcuLi4pICBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIFA5X0RVTVBfUEtUKHdheSwgcGR1KSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorCiAjZGVmaW5lIFA5X0VQUklOVEsobGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSBcCiBkbyB7IFwKIAlwcmludGsobGV2ZWwgIjlwOiAlcyAoJWQpOiAiIFwKQEAgLTE3NSw2ICsxODEsMTAgQEAKIAlQOV9STElOSywKIAlQOV9UTUtESVIgPSA3MiwKIAlQOV9STUtESVIsCisJUDlfVFJFTkFNRUFUID0gNzQsCisJUDlfUlJFTkFNRUFULAorCVA5X1RVTkxJTktBVCA9IDc2LAorCVA5X1JVTkxJTktBVCwKIAlQOV9UVkVSU0lPTiA9IDEwMCwKIAlQOV9SVkVSU0lPTiwKIAlQOV9UQVVUSCA9IDEwMiwKQEAgLTMyMSwyMSArMzMxLDYgQEAKICNkZWZpbmUgUDlfUkVBRERJUkhEUlNaCTI0CiAKIC8qKgotICogc3RydWN0IHA5X3N0ciAtIGxlbmd0aCBwcmVmaXhlZCBzdHJpbmcgdHlwZQotICogQGxlbjogbGVuZ3RoIG9mIHRoZSBzdHJpbmcKLSAqIEBzdHI6IHRoZSBzdHJpbmcKLSAqCi0gKiBUaGUgcHJvdG9jb2wgdXNlcyBsZW5ndGggcHJlZml4ZWQgc3RyaW5ncyBmb3IgYWxsCi0gKiBzdHJpbmcgZGF0YSwgc28gd2UgcmVwbGljYXRlIHRoYXQgZm9yIG91ciBpbnRlcm5hbAotICogc3RyaW5nIG1lbWJlcnMuCi0gKi8KLQotc3RydWN0IHA5X3N0ciB7Ci0JdTE2IGxlbjsKLQljaGFyICpzdHI7Ci19OwotCi0vKioKICAqIHN0cnVjdCBwOV9xaWQgLSBmaWxlIHN5c3RlbSBlbnRpdHkgaW5mb3JtYXRpb24KICAqIEB0eXBlOiA4LWJpdCB0eXBlICZwOV9xaWRfdAogICogQHZlcnNpb246IDE2LWJpdCBtb25vdG9uaWNhbGx5IGluY3JlbWVudGluZyB2ZXJzaW9uIG51bWJlcgpAQCAtMzcxLDExICszNjYsMTEgQEAKICAqIEBhdGltZTogTGFzdCBhY2Nlc3MvcmVhZCB0aW1lCiAgKiBAbXRpbWU6IExhc3QgbW9kaWZ5L3dyaXRlIHRpbWUKICAqIEBsZW5ndGg6IGZpbGUgbGVuZ3RoCi0gKiBAbmFtZTogbGFzdCBlbGVtZW50IG9mIHBhdGggKGFrYSBmaWxlbmFtZSkgaW4gdHlwZSAmcDlfc3RyCi0gKiBAdWlkOiBvd25lciBuYW1lIGluIHR5cGUgJnA5X3N0cgotICogQGdpZDogZ3JvdXAgb3duZXIgaW4gdHlwZSAmcDlfc3RyCi0gKiBAbXVpZDogbGFzdCBtb2RpZmllciBpbiB0eXBlICZwOV9zdHIKLSAqIEBleHRlbnNpb246IGFyZWEgdXNlZCB0byBlbmNvZGUgZXh0ZW5kZWQgVU5JWCBzdXBwb3J0IGluIHR5cGUgJnA5X3N0cgorICogQG5hbWU6IGxhc3QgZWxlbWVudCBvZiBwYXRoIChha2EgZmlsZW5hbWUpCisgKiBAdWlkOiBvd25lciBuYW1lCisgKiBAZ2lkOiBncm91cCBvd25lcgorICogQG11aWQ6IGxhc3QgbW9kaWZpZXIKKyAqIEBleHRlbnNpb246IGFyZWEgdXNlZCB0byBlbmNvZGUgZXh0ZW5kZWQgVU5JWCBzdXBwb3J0CiAgKiBAbl91aWQ6IG51bWVyaWMgdXNlciBpZCBvZiBvd25lciAocGFydCBvZiA5cDIwMDAudSBleHRlbnNpb24pCiAgKiBAbl9naWQ6IG51bWVyaWMgZ3JvdXAgaWQgKHBhcnQgb2YgOXAyMDAwLnUgZXh0ZW5zaW9uKQogICogQG5fbXVpZDogbnVtZXJpYyB1c2VyIGlkIG9mIGxhc3RlciBtb2RpZmllciAocGFydCBvZiA5cDIwMDAudSBleHRlbnNpb24pCkBAIC01MTIsMTEgKzUwNyw2IEBACiAJY2hhciAqY2xpZW50X2lkOwogfTsKIAotLyogU3RydWN0dXJlcyBmb3IgUHJvdG9jb2wgT3BlcmF0aW9ucyAqLwotc3RydWN0IHA5X3RzdGF0ZnMgewotCXUzMiBmaWQ7Ci19OwotCiBzdHJ1Y3QgcDlfcnN0YXRmcyB7CiAJdTMyIHR5cGU7CiAJdTMyIGJzaXplOwpAQCAtNTI5LDE1OSArNTE5LDYgQEAKIAl1MzIgbmFtZWxlbjsKIH07CiAKLXN0cnVjdCBwOV90cmVuYW1lIHsKLQl1MzIgZmlkOwotCXUzMiBuZXdkaXJmaWQ7Ci0Jc3RydWN0IHA5X3N0ciBuYW1lOwotfTsKLQotc3RydWN0IHA5X3JyZW5hbWUgewotfTsKLQotc3RydWN0IHA5X3R2ZXJzaW9uIHsKLQl1MzIgbXNpemU7Ci0Jc3RydWN0IHA5X3N0ciB2ZXJzaW9uOwotfTsKLQotc3RydWN0IHA5X3J2ZXJzaW9uIHsKLQl1MzIgbXNpemU7Ci0Jc3RydWN0IHA5X3N0ciB2ZXJzaW9uOwotfTsKLQotc3RydWN0IHA5X3RhdXRoIHsKLQl1MzIgYWZpZDsKLQlzdHJ1Y3QgcDlfc3RyIHVuYW1lOwotCXN0cnVjdCBwOV9zdHIgYW5hbWU7Ci0JdTMyIG5fdW5hbWU7CQkvKiA5UDIwMDAudSBleHRlbnNpb25zICovCi19OwotCi1zdHJ1Y3QgcDlfcmF1dGggewotCXN0cnVjdCBwOV9xaWQgcWlkOwotfTsKLQotc3RydWN0IHA5X3JlcnJvciB7Ci0Jc3RydWN0IHA5X3N0ciBlcnJvcjsKLQl1MzIgZXJybm87CQkvKiA5cDIwMDAudSBleHRlbnNpb24gKi8KLX07Ci0KLXN0cnVjdCBwOV90Zmx1c2ggewotCXUxNiBvbGR0YWc7Ci19OwotCi1zdHJ1Y3QgcDlfcmZsdXNoIHsKLX07Ci0KLXN0cnVjdCBwOV90YXR0YWNoIHsKLQl1MzIgZmlkOwotCXUzMiBhZmlkOwotCXN0cnVjdCBwOV9zdHIgdW5hbWU7Ci0Jc3RydWN0IHA5X3N0ciBhbmFtZTsKLQl1MzIgbl91bmFtZTsJCS8qIDlQMjAwMC51IGV4dGVuc2lvbnMgKi8KLX07Ci0KLXN0cnVjdCBwOV9yYXR0YWNoIHsKLQlzdHJ1Y3QgcDlfcWlkIHFpZDsKLX07Ci0KLXN0cnVjdCBwOV90d2FsayB7Ci0JdTMyIGZpZDsKLQl1MzIgbmV3ZmlkOwotCXUxNiBud25hbWU7Ci0Jc3RydWN0IHA5X3N0ciB3bmFtZXNbMTZdOwotfTsKLQotc3RydWN0IHA5X3J3YWxrIHsKLQl1MTYgbndxaWQ7Ci0Jc3RydWN0IHA5X3FpZCB3cWlkc1sxNl07Ci19OwotCi1zdHJ1Y3QgcDlfdG9wZW4gewotCXUzMiBmaWQ7Ci0JdTggbW9kZTsKLX07Ci0KLXN0cnVjdCBwOV9yb3BlbiB7Ci0Jc3RydWN0IHA5X3FpZCBxaWQ7Ci0JdTMyIGlvdW5pdDsKLX07Ci0KLXN0cnVjdCBwOV90Y3JlYXRlIHsKLQl1MzIgZmlkOwotCXN0cnVjdCBwOV9zdHIgbmFtZTsKLQl1MzIgcGVybTsKLQl1OCBtb2RlOwotCXN0cnVjdCBwOV9zdHIgZXh0ZW5zaW9uOwotfTsKLQotc3RydWN0IHA5X3JjcmVhdGUgewotCXN0cnVjdCBwOV9xaWQgcWlkOwotCXUzMiBpb3VuaXQ7Ci19OwotCi1zdHJ1Y3QgcDlfdHJlYWQgewotCXUzMiBmaWQ7Ci0JdTY0IG9mZnNldDsKLQl1MzIgY291bnQ7Ci19OwotCi1zdHJ1Y3QgcDlfcnJlYWQgewotCXUzMiBjb3VudDsKLQl1OCAqZGF0YTsKLX07Ci0KLXN0cnVjdCBwOV90d3JpdGUgewotCXUzMiBmaWQ7Ci0JdTY0IG9mZnNldDsKLQl1MzIgY291bnQ7Ci0JdTggKmRhdGE7Ci19OwotCi1zdHJ1Y3QgcDlfcndyaXRlIHsKLQl1MzIgY291bnQ7Ci19OwotCi1zdHJ1Y3QgcDlfdHJlYWRkaXIgewotCXUzMiBmaWQ7Ci0JdTY0IG9mZnNldDsKLQl1MzIgY291bnQ7Ci19OwotCi1zdHJ1Y3QgcDlfcnJlYWRkaXIgewotCXUzMiBjb3VudDsKLQl1OCAqZGF0YTsKLX07Ci0KLQotc3RydWN0IHA5X3RjbHVuayB7Ci0JdTMyIGZpZDsKLX07Ci0KLXN0cnVjdCBwOV9yY2x1bmsgewotfTsKLQotc3RydWN0IHA5X3RyZW1vdmUgewotCXUzMiBmaWQ7Ci19OwotCi1zdHJ1Y3QgcDlfcnJlbW92ZSB7Ci19OwotCi1zdHJ1Y3QgcDlfdHN0YXQgewotCXUzMiBmaWQ7Ci19OwotCi1zdHJ1Y3QgcDlfcnN0YXQgewotCXN0cnVjdCBwOV93c3RhdCBzdGF0OwotfTsKLQotc3RydWN0IHA5X3R3c3RhdCB7Ci0JdTMyIGZpZDsKLQlzdHJ1Y3QgcDlfd3N0YXQgc3RhdDsKLX07Ci0KLXN0cnVjdCBwOV9yd3N0YXQgewotfTsKLQogLyoqCiAgKiBzdHJ1Y3QgcDlfZmNhbGwgLSBwcmltYXJ5IHBhY2tldCBzdHJ1Y3R1cmUKICAqIEBzaXplOiBwcmVmaXhlZCBsZW5ndGggb2YgdGhlIHN0cnVjdHVyZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvOXAvY2xpZW50LmggYi9pbmNsdWRlL25ldC85cC9jbGllbnQuaAppbmRleCBkMjZkNWU5Li41NWNlNzJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC85cC9jbGllbnQuaAorKysgYi9pbmNsdWRlL25ldC85cC9jbGllbnQuaApAQCAtMzYsOSArMzYsOSBAQAogICovCiAKIGVudW0gcDlfcHJvdG9fdmVyc2lvbnN7Ci0JcDlfcHJvdG9fbGVnYWN5ID0gMCwKLQlwOV9wcm90b18yMDAwdSA9IDEsCi0JcDlfcHJvdG9fMjAwMEwgPSAyLAorCXA5X3Byb3RvX2xlZ2FjeSwKKwlwOV9wcm90b18yMDAwdSwKKwlwOV9wcm90b18yMDAwTCwKIH07CiAKIApAQCAtMjExLDcgKzIxMSwxMCBAQAogfTsKIAogaW50IHA5X2NsaWVudF9zdGF0ZnMoc3RydWN0IHA5X2ZpZCAqZmlkLCBzdHJ1Y3QgcDlfcnN0YXRmcyAqc2IpOwotaW50IHA5X2NsaWVudF9yZW5hbWUoc3RydWN0IHA5X2ZpZCAqZmlkLCBzdHJ1Y3QgcDlfZmlkICpuZXdkaXJmaWQsIGNoYXIgKm5hbWUpOworaW50IHA5X2NsaWVudF9yZW5hbWUoc3RydWN0IHA5X2ZpZCAqZmlkLCBzdHJ1Y3QgcDlfZmlkICpuZXdkaXJmaWQsCisJCSAgICAgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgcDlfY2xpZW50X3JlbmFtZWF0KHN0cnVjdCBwOV9maWQgKm9sZGRpcmZpZCwgY29uc3QgY2hhciAqb2xkX25hbWUsCisJCSAgICAgICBzdHJ1Y3QgcDlfZmlkICpuZXdkaXJmaWQsIGNvbnN0IGNoYXIgKm5ld19uYW1lKTsKIHN0cnVjdCBwOV9jbGllbnQgKnA5X2NsaWVudF9jcmVhdGUoY29uc3QgY2hhciAqZGV2X25hbWUsIGNoYXIgKm9wdGlvbnMpOwogdm9pZCBwOV9jbGllbnRfZGVzdHJveShzdHJ1Y3QgcDlfY2xpZW50ICpjbG50KTsKIHZvaWQgcDlfY2xpZW50X2Rpc2Nvbm5lY3Qoc3RydWN0IHA5X2NsaWVudCAqY2xudCk7CkBAIC0yMzEsNiArMjM0LDcgQEAKIGludCBwOV9jbGllbnRfY2x1bmsoc3RydWN0IHA5X2ZpZCAqZmlkKTsKIGludCBwOV9jbGllbnRfZnN5bmMoc3RydWN0IHA5X2ZpZCAqZmlkLCBpbnQgZGF0YXN5bmMpOwogaW50IHA5X2NsaWVudF9yZW1vdmUoc3RydWN0IHA5X2ZpZCAqZmlkKTsKK2ludCBwOV9jbGllbnRfdW5saW5rYXQoc3RydWN0IHA5X2ZpZCAqZGZpZCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKTsKIGludCBwOV9jbGllbnRfcmVhZChzdHJ1Y3QgcDlfZmlkICpmaWQsIGNoYXIgKmRhdGEsIGNoYXIgX191c2VyICp1ZGF0YSwKIAkJCQkJCQl1NjQgb2Zmc2V0LCB1MzIgY291bnQpOwogaW50IHA5X2NsaWVudF93cml0ZShzdHJ1Y3QgcDlfZmlkICpmaWQsIGNoYXIgKmRhdGEsIGNvbnN0IGNoYXIgX191c2VyICp1ZGF0YSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0LzlwL3RyYW5zcG9ydC5oIGIvaW5jbHVkZS9uZXQvOXAvdHJhbnNwb3J0LmgKaW5kZXggZDg1NDlmYi4uODM1MzFlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvOXAvdHJhbnNwb3J0LmgKKysrIGIvaW5jbHVkZS9uZXQvOXAvdHJhbnNwb3J0LmgKQEAgLTY3LDcgKzY3LDcgQEAKIAogdm9pZCB2OWZzX3JlZ2lzdGVyX3RyYW5zKHN0cnVjdCBwOV90cmFuc19tb2R1bGUgKm0pOwogdm9pZCB2OWZzX3VucmVnaXN0ZXJfdHJhbnMoc3RydWN0IHA5X3RyYW5zX21vZHVsZSAqbSk7Ci1zdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICp2OWZzX2dldF90cmFuc19ieV9uYW1lKGNvbnN0IHN1YnN0cmluZ190ICpuYW1lKTsKK3N0cnVjdCBwOV90cmFuc19tb2R1bGUgKnY5ZnNfZ2V0X3RyYW5zX2J5X25hbWUoY2hhciAqcyk7CiBzdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICp2OWZzX2dldF9kZWZhdWx0X3RyYW5zKHZvaWQpOwogdm9pZCB2OWZzX3B1dF90cmFucyhzdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICptKTsKICNlbmRpZiAvKiBORVRfOVBfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2FjdF9hcGkuaCBiL2luY2x1ZGUvbmV0L2FjdF9hcGkuaAppbmRleCBiYWIzODVmLi5jNzM5NTMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hY3RfYXBpLmgKKysrIGIvaW5jbHVkZS9uZXQvYWN0X2FwaS5oCkBAIC03Miw3ICs3Miw3IEBACiAKIHN0cnVjdCB0Y19hY3Rpb24gewogCXZvaWQJCQkqcHJpdjsKLQlzdHJ1Y3QgdGNfYWN0aW9uX29wcwkqb3BzOworCWNvbnN0IHN0cnVjdCB0Y19hY3Rpb25fb3BzCSpvcHM7CiAJX191MzIJCQl0eXBlOyAvKiBmb3IgYmFja3dhcmQgY29tcGF0KFRDQV9PTERfQ09NUEFUKSAqLwogCV9fdTMyCQkJb3JkZXI7CiAJc3RydWN0IHRjX2FjdGlvbgkqbmV4dDsKQEAgLTg2LDcgKzg2LDcgQEAKIAlfX3UzMiAgIHR5cGU7IC8qIFRCRCB0byBtYXRjaCBraW5kICovCiAJX191MzIgCWNhcGFiOyAgLyogY2FwYWJpbGl0aWVzIGluY2x1ZGVzIDQgYml0IHZlcnNpb24gKi8KIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7Ci0JaW50ICAgICAoKmFjdCkoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IHRjX2FjdGlvbiAqLCBzdHJ1Y3QgdGNmX3Jlc3VsdCAqKTsKKwlpbnQgICAgICgqYWN0KShzdHJ1Y3Qgc2tfYnVmZiAqLCBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICosIHN0cnVjdCB0Y2ZfcmVzdWx0ICopOwogCWludCAgICAgKCpnZXRfc3RhdHMpKHN0cnVjdCBza19idWZmICosIHN0cnVjdCB0Y19hY3Rpb24gKik7CiAJaW50ICAgICAoKmR1bXApKHN0cnVjdCBza19idWZmICosIHN0cnVjdCB0Y19hY3Rpb24gKiwgaW50LCBpbnQpOwogCWludCAgICAgKCpjbGVhbnVwKShzdHJ1Y3QgdGNfYWN0aW9uICosIGludCBiaW5kKTsKQEAgLTExNSw3ICsxMTUsNyBAQAogZXh0ZXJuIGludCB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKHN0cnVjdCB0Y19hY3Rpb25fb3BzICphKTsKIGV4dGVybiBpbnQgdGNmX3VucmVnaXN0ZXJfYWN0aW9uKHN0cnVjdCB0Y19hY3Rpb25fb3BzICphKTsKIGV4dGVybiB2b2lkIHRjZl9hY3Rpb25fZGVzdHJveShzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCk7Ci1leHRlcm4gaW50IHRjZl9hY3Rpb25fZXhlYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKTsKK2V4dGVybiBpbnQgdGNmX2FjdGlvbl9leGVjKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpOwogZXh0ZXJuIHN0cnVjdCB0Y19hY3Rpb24gKnRjZl9hY3Rpb25faW5pdChzdHJ1Y3QgbmxhdHRyICpubGEsIHN0cnVjdCBubGF0dHIgKmVzdCwgY2hhciAqbiwgaW50IG92ciwgaW50IGJpbmQpOwogZXh0ZXJuIHN0cnVjdCB0Y19hY3Rpb24gKnRjZl9hY3Rpb25faW5pdF8xKHN0cnVjdCBubGF0dHIgKm5sYSwgc3RydWN0IG5sYXR0ciAqZXN0LCBjaGFyICpuLCBpbnQgb3ZyLCBpbnQgYmluZCk7CiBleHRlcm4gaW50IHRjZl9hY3Rpb25fZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQsIGludCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hcnAuaCBiL2luY2x1ZGUvbmV0L2FycC5oCmluZGV4IDkxZjA1NjguLjQ5NzlhZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2FycC5oCisrKyBiL2luY2x1ZGUvbmV0L2FycC5oCkBAIC04LDYgKzgsMzYgQEAKIAogZXh0ZXJuIHN0cnVjdCBuZWlnaF90YWJsZSBhcnBfdGJsOwogCitzdGF0aWMgaW5saW5lIHUzMiBhcnBfaGFzaGZuKHUzMiBrZXksIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBoYXNoX3JuZCkKK3sKKwl1MzIgdmFsID0ga2V5IF4gZGV2LT5pZmluZGV4OworCisJcmV0dXJuIHZhbCAqIGhhc2hfcm5kOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZWlnaGJvdXIgKl9faXB2NF9uZWlnaF9sb29rdXAoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBrZXkpCit7CisJc3RydWN0IG5laWdoX2hhc2hfdGFibGUgKm5odDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuOworCXUzMiBoYXNoX3ZhbDsKKworCXJjdV9yZWFkX2xvY2tfYmgoKTsKKwluaHQgPSByY3VfZGVyZWZlcmVuY2VfYmgodGJsLT5uaHQpOworCWhhc2hfdmFsID0gYXJwX2hhc2hmbihrZXksIGRldiwgbmh0LT5oYXNoX3JuZCkgPj4gKDMyIC0gbmh0LT5oYXNoX3NoaWZ0KTsKKwlmb3IgKG4gPSByY3VfZGVyZWZlcmVuY2VfYmgobmh0LT5oYXNoX2J1Y2tldHNbaGFzaF92YWxdKTsKKwkgICAgIG4gIT0gTlVMTDsKKwkgICAgIG4gPSByY3VfZGVyZWZlcmVuY2VfYmgobi0+bmV4dCkpIHsKKwkJaWYgKG4tPmRldiA9PSBkZXYgJiYgKih1MzIgKiluLT5wcmltYXJ5X2tleSA9PSBrZXkpIHsKKwkJCWlmICghYXRvbWljX2luY19ub3RfemVybygmbi0+cmVmY250KSkKKwkJCQluID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9ja19iaCgpOworCisJcmV0dXJuIG47Cit9CisKIGV4dGVybiB2b2lkCWFycF9pbml0KHZvaWQpOwogZXh0ZXJuIGludAlhcnBfZmluZCh1bnNpZ25lZCBjaGFyICpoYWRkciwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50CWFycF9pb2N0bChzdHJ1Y3QgbmV0ICpuZXQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOwpAQCAtMTUsNyArNDUsNiBAQAogCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUzMiBzcmNfaXAsCiAJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqZGVzdF9odywKIAkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNfaHcsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRoKTsKLWV4dGVybiBpbnQJYXJwX2JpbmRfbmVpZ2hib3VyKHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CiBleHRlcm4gaW50CWFycF9tY19tYXAoX19iZTMyIGFkZHIsIHU4ICpoYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGRpcik7CiBleHRlcm4gdm9pZAlhcnBfaWZkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmgKaW5kZXggNDM3NTA0My4uZTcyNzU1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaApAQCAtNTYsNiArNTYsNyBAQAogI2RlZmluZSBCVF9TRUNVUklUWQk0CiBzdHJ1Y3QgYnRfc2VjdXJpdHkgewogCV9fdTggbGV2ZWw7CisJX191OCBrZXlfc2l6ZTsKIH07CiAjZGVmaW5lIEJUX1NFQ1VSSVRZX1NEUAkJMAogI2RlZmluZSBCVF9TRUNVUklUWV9MT1cJCTEKQEAgLTY5LDkgKzcwLDE5IEBACiAjZGVmaW5lIEJUX0ZMVVNIQUJMRV9PRkYJMAogI2RlZmluZSBCVF9GTFVTSEFCTEVfT04JCTEKIAotI2RlZmluZSBCVF9JTkZPKGZtdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICJCbHVldG9vdGg6ICIgZm10ICJcbiIgLCAjIyBhcmcpCi0jZGVmaW5lIEJUX0VSUihmbXQsIGFyZy4uLikgIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm10ICJcbiIgLCBfX2Z1bmNfXyAsICMjIGFyZykKLSNkZWZpbmUgQlRfREJHKGZtdCwgYXJnLi4uKSAgcHJfZGVidWcoIiVzOiAiIGZtdCAiXG4iICwgX19mdW5jX18gLCAjIyBhcmcpCisjZGVmaW5lIEJUX1BPV0VSCTkKK3N0cnVjdCBidF9wb3dlciB7CisJX191OCBmb3JjZV9hY3RpdmU7Cit9OworI2RlZmluZSBCVF9QT1dFUl9GT1JDRV9BQ1RJVkVfT0ZGIDAKKyNkZWZpbmUgQlRfUE9XRVJfRk9SQ0VfQUNUSVZFX09OICAxCisKK19fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpCitpbnQgYnRfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKyNkZWZpbmUgQlRfSU5GTyhmbXQsIGFyZy4uLikgICBidF9wcmludGsoS0VSTl9JTkZPLCBwcl9mbXQoZm10KSwgIyNhcmcpCisjZGVmaW5lIEJUX0VSUihmbXQsIGFyZy4uLikgICAgYnRfcHJpbnRrKEtFUk5fRVJSLCBwcl9mbXQoZm10KSwgIyNhcmcpCisjZGVmaW5lIEJUX0RCRyhmbXQsIGFyZy4uLikgICAgcHJfZGVidWcoZm10ICJcbiIsICMjYXJnKQogCiAvKiBDb25uZWN0aW9uIGFuZCBzb2NrZXQgc3RhdGVzICovCiBlbnVtIHsKQEAgLTEzMCw3ICsxNDEsOCBAQAogaW50ICBidF9zb2NrX3VucmVnaXN0ZXIoaW50IHByb3RvKTsKIHZvaWQgYnRfc29ja19saW5rKHN0cnVjdCBidF9zb2NrX2xpc3QgKmwsIHN0cnVjdCBzb2NrICpzKTsKIHZvaWQgYnRfc29ja191bmxpbmsoc3RydWN0IGJ0X3NvY2tfbGlzdCAqbCwgc3RydWN0IHNvY2sgKnMpOwotaW50ICBidF9zb2NrX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncyk7CitpbnQgIGJ0X3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpOwogaW50ICBidF9zb2NrX3N0cmVhbV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKIAkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IGZsYWdzKTsKIHVpbnQgYnRfc29ja19wb2xsKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHNvY2tldCAqc29jaywgcG9sbF90YWJsZSAqd2FpdCk7CkBAIC0xNTAsNiArMTYyLDcgQEAKIAlfX3U4IHJldHJpZXM7CiAJX191OCBzYXI7CiAJdW5zaWduZWQgc2hvcnQgY2hhbm5lbDsKKwlfX3U4IGZvcmNlX2FjdGl2ZTsKIH07CiAjZGVmaW5lIGJ0X2NiKHNrYikgKChzdHJ1Y3QgYnRfc2tiX2NiICopKChza2IpLT5jYikpCiAKQEAgLTE2NCw4ICsxNzcsOCBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmJ0X3NrYl9zZW5kX2FsbG9jKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyBsZW4sIAotCQkJCQkJCWludCBuYiwgaW50ICplcnIpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpidF9za2Jfc2VuZF9hbGxvYyhzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCXVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgbmIsIGludCAqZXJyKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTE5NSw3ICsyMDgsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgYnRfZXJyKF9fdTE2IGNvZGUpOworaW50IGJ0X3RvX2Vycm5vKF9fdTE2IGNvZGUpOwogCiBleHRlcm4gaW50IGhjaV9zb2NrX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBoY2lfc29ja19jbGVhbnVwKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCmluZGV4IDBjMjAyMjcuLmJlMzBhYWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKQEAgLTIxMSwxMSArMjExLDE2IEBACiAjZGVmaW5lIExNUF9FRFJfM1NfRVNDTwkweDgwCiAKICNkZWZpbmUgTE1QX0VYVF9JTlEJMHgwMQorI2RlZmluZSBMTVBfU0lNVUxfTEVfQlIJMHgwMgogI2RlZmluZSBMTVBfU0lNUExFX1BBSVIJMHgwOAogI2RlZmluZSBMTVBfTk9fRkxVU0gJMHg0MAogCiAjZGVmaW5lIExNUF9MU1RPCTB4MDEKICNkZWZpbmUgTE1QX0lOUV9UWF9QV1IJMHgwMgorI2RlZmluZSBMTVBfRVhURkVBVFVSRVMJMHg4MAorCisvKiBFeHRlbmRlZCBMTVAgZmVhdHVyZXMgKi8KKyNkZWZpbmUgTE1QX0hPU1RfTEUJMHgwMgogCiAvKiBDb25uZWN0aW9uIG1vZGVzICovCiAjZGVmaW5lIEhDSV9DTV9BQ1RJVkUJMHgwMDAwCkBAIC0yNTQsNiArMjU5LDEwIEBACiAjZGVmaW5lIEhDSV9MS19VTkFVVEhfQ09NQklOQVRJT04JMHgwNAogI2RlZmluZSBIQ0lfTEtfQVVUSF9DT01CSU5BVElPTgkJMHgwNQogI2RlZmluZSBIQ0lfTEtfQ0hBTkdFRF9DT01CSU5BVElPTgkweDA2CisvKiBUaGUgc3BlYyBkb2Vzbid0IGRlZmluZSB0eXBlcyBmb3IgU01QIGtleXMgKi8KKyNkZWZpbmUgSENJX0xLX1NNUF9MVEsJCQkweDgxCisjZGVmaW5lIEhDSV9MS19TTVBfSVJLCQkJMHg4MgorI2RlZmluZSBIQ0lfTEtfU01QX0NTUksJCQkweDgzCiAKIC8qIC0tLS0tICBIQ0kgQ29tbWFuZHMgLS0tLSAqLwogI2RlZmluZSBIQ0lfT1BfTk9QCQkJMHgwMDAwCkBAIC02NTMsNiArNjYyLDEyIEBACiAKICNkZWZpbmUgSENJX09QX1JFQURfSU5RX1JTUF9UWF9QT1dFUgkweDBjNTgKIAorI2RlZmluZSBIQ0lfT1BfV1JJVEVfTEVfSE9TVF9TVVBQT1JURUQJMHgwYzZkCitzdHJ1Y3QgaGNpX2NwX3dyaXRlX2xlX2hvc3Rfc3VwcG9ydGVkIHsKKwlfX3U4IGxlOworCV9fdTggc2ltdWw7Cit9IF9fcGFja2VkOworCiAjZGVmaW5lIEhDSV9PUF9SRUFEX0xPQ0FMX1ZFUlNJT04JMHgxMDAxCiBzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfdmVyc2lvbiB7CiAJX191OCAgICAgc3RhdHVzOwpAQCAtNjc2LDYgKzY5MSw5IEBACiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9PUF9SRUFEX0xPQ0FMX0VYVF9GRUFUVVJFUwkweDEwMDQKK3N0cnVjdCBoY2lfY3BfcmVhZF9sb2NhbF9leHRfZmVhdHVyZXMgeworCV9fdTggICAgIHBhZ2U7Cit9IF9fcGFja2VkOwogc3RydWN0IGhjaV9ycF9yZWFkX2xvY2FsX2V4dF9mZWF0dXJlcyB7CiAJX191OCAgICAgc3RhdHVzOwogCV9fdTggICAgIHBhZ2U7CkBAIC03MTAsNiArNzI4LDEyIEBACiAJX191OCAgICAgbGVfbWF4X3BrdDsKIH0gX19wYWNrZWQ7CiAKKyNkZWZpbmUgSENJX09QX0xFX1NFVF9TQ0FOX0VOQUJMRQkweDIwMGMKK3N0cnVjdCBoY2lfY3BfbGVfc2V0X3NjYW5fZW5hYmxlIHsKKwlfX3U4ICAgICBlbmFibGU7CisJX191OCAgICAgZmlsdGVyX2R1cDsKK30gX19wYWNrZWQ7CisKICNkZWZpbmUgSENJX09QX0xFX0NSRUFURV9DT05OCQkweDIwMGQKIHN0cnVjdCBoY2lfY3BfbGVfY3JlYXRlX2Nvbm4gewogCV9fbGUxNiAgIHNjYW5faW50ZXJ2YWw7CkBAIC03MzksNiArNzYzLDMzIEBACiAJX19sZTE2ICAgbWF4X2NlX2xlbjsKIH0gX19wYWNrZWQ7CiAKKyNkZWZpbmUgSENJX09QX0xFX1NUQVJUX0VOQwkJMHgyMDE5CitzdHJ1Y3QgaGNpX2NwX2xlX3N0YXJ0X2VuYyB7CisJX19sZTE2CWhhbmRsZTsKKwlfX3U4CXJhbmRbOF07CisJX19sZTE2CWVkaXY7CisJX191OAlsdGtbMTZdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBIQ0lfT1BfTEVfTFRLX1JFUExZCQkweDIwMWEKK3N0cnVjdCBoY2lfY3BfbGVfbHRrX3JlcGx5IHsKKwlfX2xlMTYJaGFuZGxlOworCV9fdTgJbHRrWzE2XTsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgaGNpX3JwX2xlX2x0a19yZXBseSB7CisJX191OAlzdGF0dXM7CisJX19sZTE2CWhhbmRsZTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSENJX09QX0xFX0xUS19ORUdfUkVQTFkJCTB4MjAxYgorc3RydWN0IGhjaV9jcF9sZV9sdGtfbmVnX3JlcGx5IHsKKwlfX2xlMTYJaGFuZGxlOworfSBfX3BhY2tlZDsKK3N0cnVjdCBoY2lfcnBfbGVfbHRrX25lZ19yZXBseSB7CisJX191OAlzdGF0dXM7CisJX19sZTE2CWhhbmRsZTsKK30gX19wYWNrZWQ7CisKIC8qIC0tLS0gSENJIEV2ZW50cyAtLS0tICovCiAjZGVmaW5lIEhDSV9FVl9JTlFVSVJZX0NPTVBMRVRFCQkweDAxCiAKQEAgLTEwMjksNiArMTA4MCwzMiBAQAogCV9fdTggICAgIGNsa19hY2N1cmFuY3k7CiB9IF9fcGFja2VkOwogCisjZGVmaW5lIEhDSV9FVl9MRV9MVEtfUkVRCQkweDA1CitzdHJ1Y3QgaGNpX2V2X2xlX2x0a19yZXEgeworCV9fbGUxNgloYW5kbGU7CisJX191OAlyYW5kb21bOF07CisJX19sZTE2CWVkaXY7Cit9IF9fcGFja2VkOworCisvKiBBZHZlcnRpc2luZyByZXBvcnQgZXZlbnQgdHlwZXMgKi8KKyNkZWZpbmUgQURWX0lORAkJMHgwMAorI2RlZmluZSBBRFZfRElSRUNUX0lORAkweDAxCisjZGVmaW5lIEFEVl9TQ0FOX0lORAkweDAyCisjZGVmaW5lIEFEVl9OT05DT05OX0lORAkweDAzCisjZGVmaW5lIEFEVl9TQ0FOX1JTUAkweDA0CisKKyNkZWZpbmUgQUREUl9MRV9ERVZfUFVCTElDCTB4MDAKKyNkZWZpbmUgQUREUl9MRV9ERVZfUkFORE9NCTB4MDEKKworI2RlZmluZSBIQ0lfRVZfTEVfQURWRVJUSVNJTkdfUkVQT1JUCTB4MDIKK3N0cnVjdCBoY2lfZXZfbGVfYWR2ZXJ0aXNpbmdfaW5mbyB7CisJX191OAkgZXZ0X3R5cGU7CisJX191OAkgYmRhZGRyX3R5cGU7CisJYmRhZGRyX3QgYmRhZGRyOworCV9fdTgJIGxlbmd0aDsKKwlfX3U4CSBkYXRhWzBdOworfSBfX3BhY2tlZDsKKwogLyogSW50ZXJuYWwgZXZlbnRzIGdlbmVyYXRlZCBieSBCbHVldG9vdGggc3RhY2sgKi8KICNkZWZpbmUgSENJX0VWX1NUQUNLX0lOVEVSTkFMCTB4ZmQKIHN0cnVjdCBoY2lfZXZfc3RhY2tfaW50ZXJuYWwgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAppbmRleCA2Yzk5NGMwLi44ZjQ0MWI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaApAQCAtMjUsNiArMjUsNyBAQAogI2lmbmRlZiBfX0hDSV9DT1JFX0gKICNkZWZpbmUgX19IQ0lfQ09SRV9ICiAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaS5oPgogCiAvKiBIQ0kgdXBwZXIgcHJvdG9jb2xzICovCkBAIC03NCwxMiArNzUsMjggQEAKIAl1OCBzdmNfaGludDsKIH07CiAKK3N0cnVjdCBrZXlfbWFzdGVyX2lkIHsKKwlfX2xlMTYgZWRpdjsKKwl1OCByYW5kWzhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGxpbmtfa2V5X2RhdGEgeworCWJkYWRkcl90IGJkYWRkcjsKKwl1OCB0eXBlOworCXU4IHZhbFsxNl07CisJdTggcGluX2xlbjsKKwl1OCBkbGVuOworCXU4IGRhdGFbMF07Cit9IF9fcGFja2VkOworCiBzdHJ1Y3QgbGlua19rZXkgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAliZGFkZHJfdCBiZGFkZHI7CiAJdTggdHlwZTsKIAl1OCB2YWxbMTZdOwogCXU4IHBpbl9sZW47CisJdTggZGxlbjsKKwl1OCBkYXRhWzBdOwogfTsKIAogc3RydWN0IG9vYl9kYXRhIHsKQEAgLTg5LDYgKzEwNiwxMiBAQAogCXU4IHJhbmRvbWl6ZXJbMTZdOwogfTsKIAorc3RydWN0IGFkdl9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWJkYWRkcl90IGJkYWRkcjsKKwl1OCBiZGFkZHJfdHlwZTsKK307CisKICNkZWZpbmUgTlVNX1JFQVNTRU1CTFkgNAogc3RydWN0IGhjaV9kZXYgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKQEAgLTEwNyw2ICsxMzAsNyBAQAogCV9fdTgJCW1ham9yX2NsYXNzOwogCV9fdTgJCW1pbm9yX2NsYXNzOwogCV9fdTgJCWZlYXR1cmVzWzhdOworCV9fdTgJCWV4dGZlYXR1cmVzWzhdOwogCV9fdTgJCWNvbW1hbmRzWzY0XTsKIAlfX3U4CQlzc3BfbW9kZTsKIAlfX3U4CQloY2lfdmVyOwpAQCAtMTcxLDYgKzE5NSw4IEBACiAKIAlfX3UxNgkJCWluaXRfbGFzdF9jbWQ7CiAKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlcgkqdGZtOworCiAJc3RydWN0IGlucXVpcnlfY2FjaGUJaW5xX2NhY2hlOwogCXN0cnVjdCBoY2lfY29ubl9oYXNoCWNvbm5faGFzaDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWJsYWNrbGlzdDsKQEAgLTE4MSw2ICsyMDcsOSBAQAogCiAJc3RydWN0IGxpc3RfaGVhZAlyZW1vdGVfb29iX2RhdGE7CiAKKwlzdHJ1Y3QgbGlzdF9oZWFkCWFkdl9lbnRyaWVzOworCXN0cnVjdCB0aW1lcl9saXN0CWFkdl90aW1lcjsKKwogCXN0cnVjdCBoY2lfZGV2X3N0YXRzCXN0YXQ7CiAKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCWRyaXZlcl9pbml0OwpAQCAtMjEyLDkgKzI0MSw5IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCiAJYXRvbWljX3QJcmVmY250OwotCXNwaW5sb2NrX3QJbG9jazsKIAogCWJkYWRkcl90CWRzdDsKKwlfX3U4CQlkc3RfdHlwZTsKIAlfX3UxNgkJaGFuZGxlOwogCV9fdTE2CQlzdGF0ZTsKIAlfX3U4CQltb2RlOwpAQCAtMjMzLDYgKzI2Miw3IEBACiAJX191OAkJc2VjX2xldmVsOwogCV9fdTgJCXBlbmRpbmdfc2VjX2xldmVsOwogCV9fdTgJCXBpbl9sZW5ndGg7CisJX191OAkJZW5jX2tleV9zaXplOwogCV9fdTgJCWlvX2NhcGFiaWxpdHk7CiAJX191OAkJcG93ZXJfc2F2ZTsKIAlfX3UxNgkJZGlzY190aW1lb3V0OwpAQCAtMjU5LDcgKzI4OSw2IEBACiAJc3RydWN0IGhjaV9kZXYJKmhkZXY7CiAJdm9pZAkJKmwyY2FwX2RhdGE7CiAJdm9pZAkJKnNjb19kYXRhOwotCXZvaWQJCSpwcml2OwogCiAJc3RydWN0IGhjaV9jb25uCSpsaW5rOwogCkBAIC0zMDcsMTIgKzMzNiwxNCBAQAogCXJldHVybiBqaWZmaWVzIC0gZS0+dGltZXN0YW1wOwogfQogCi1zdHJ1Y3QgaW5xdWlyeV9lbnRyeSAqaGNpX2lucXVpcnlfY2FjaGVfbG9va3VwKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKTsKK3N0cnVjdCBpbnF1aXJ5X2VudHJ5ICpoY2lfaW5xdWlyeV9jYWNoZV9sb29rdXAoc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkJCQkJYmRhZGRyX3QgKmJkYWRkcik7CiB2b2lkIGhjaV9pbnF1aXJ5X2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IGlucXVpcnlfZGF0YSAqZGF0YSk7CiAKIC8qIC0tLS0tIEhDSSBDb25uZWN0aW9ucyAtLS0tLSAqLwogZW51bSB7CiAJSENJX0NPTk5fQVVUSF9QRU5ELAorCUhDSV9DT05OX1JFQVVUSF9QRU5ELAogCUhDSV9DT05OX0VOQ1JZUFRfUEVORCwKIAlIQ0lfQ09OTl9SU1dJVENIX1BFTkQsCiAJSENJX0NPTk5fTU9ERV9DSEFOR0VfUEVORCwKQEAgLTQyMCwxNCArNDUxLDE1IEBACiB2b2lkIGhjaV9jb25uX2hhc2hfZmx1c2goc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogdm9pZCBoY2lfY29ubl9jaGVja19wZW5kaW5nKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIAotc3RydWN0IGhjaV9jb25uICpoY2lfY29ubmVjdChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IHR5cGUsIGJkYWRkcl90ICpkc3QsIF9fdTggc2VjX2xldmVsLCBfX3U4IGF1dGhfdHlwZSk7CitzdHJ1Y3QgaGNpX2Nvbm4gKmhjaV9jb25uZWN0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgYmRhZGRyX3QgKmRzdCwKKwkJCQkJCV9fdTggc2VjX2xldmVsLCBfX3U4IGF1dGhfdHlwZSk7CiBpbnQgaGNpX2Nvbm5fY2hlY2tfbGlua19tb2RlKHN0cnVjdCBoY2lfY29ubiAqY29ubik7CiBpbnQgaGNpX2Nvbm5fY2hlY2tfc2VjdXJlKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzZWNfbGV2ZWwpOwogaW50IGhjaV9jb25uX3NlY3VyaXR5KHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzZWNfbGV2ZWwsIF9fdTggYXV0aF90eXBlKTsKIGludCBoY2lfY29ubl9jaGFuZ2VfbGlua19rZXkoc3RydWN0IGhjaV9jb25uICpjb25uKTsKIGludCBoY2lfY29ubl9zd2l0Y2hfcm9sZShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggcm9sZSk7CiAKLXZvaWQgaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoc3RydWN0IGhjaV9jb25uICpjb25uKTsKK3ZvaWQgaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IGZvcmNlX2FjdGl2ZSk7CiB2b2lkIGhjaV9jb25uX2VudGVyX3NuaWZmX21vZGUoc3RydWN0IGhjaV9jb25uICpjb25uKTsKIAogdm9pZCBoY2lfY29ubl9ob2xkX2RldmljZShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pOwpAQCAtNDQ5LDEwICs0ODEsMTIgQEAKIAkJCQl0aW1lbyA9IG1zZWNzX3RvX2ppZmZpZXMoY29ubi0+ZGlzY190aW1lb3V0KTsKIAkJCQlpZiAoIWNvbm4tPm91dCkKIAkJCQkJdGltZW8gKj0gMjsKLQkJCX0gZWxzZQorCQkJfSBlbHNlIHsKIAkJCQl0aW1lbyA9IG1zZWNzX3RvX2ppZmZpZXMoMTApOwotCQl9IGVsc2UKKwkJCX0KKwkJfSBlbHNlIHsKIAkJCXRpbWVvID0gbXNlY3NfdG9famlmZmllcygxMCk7CisJCX0KIAkJbW9kX3RpbWVyKCZjb25uLT5kaXNjX3RpbWVyLCBqaWZmaWVzICsgdGltZW8pOwogCX0KIH0KQEAgLTUxMSw2ICs1NDUsOCBAQAogCiBzdHJ1Y3QgYmRhZGRyX2xpc3QgKmhjaV9ibGFja2xpc3RfbG9va3VwKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKTsKIGludCBoY2lfYmxhY2tsaXN0X2NsZWFyKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKK2ludCBoY2lfYmxhY2tsaXN0X2FkZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcik7CitpbnQgaGNpX2JsYWNrbGlzdF9kZWwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIpOwogCiBpbnQgaGNpX3V1aWRzX2NsZWFyKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIApAQCAtNTE4LDYgKzU1NCwxMSBAQAogc3RydWN0IGxpbmtfa2V5ICpoY2lfZmluZF9saW5rX2tleShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcik7CiBpbnQgaGNpX2FkZF9saW5rX2tleShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IGhjaV9jb25uICpjb25uLCBpbnQgbmV3X2tleSwKIAkJCWJkYWRkcl90ICpiZGFkZHIsIHU4ICp2YWwsIHU4IHR5cGUsIHU4IHBpbl9sZW4pOworc3RydWN0IGxpbmtfa2V5ICpoY2lfZmluZF9sdGsoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fbGUxNiBlZGl2LCB1OCByYW5kWzhdKTsKK3N0cnVjdCBsaW5rX2tleSAqaGNpX2ZpbmRfbGlua19rZXlfdHlwZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJYmRhZGRyX3QgKmJkYWRkciwgdTggdHlwZSk7CitpbnQgaGNpX2FkZF9sdGsoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCBuZXdfa2V5LCBiZGFkZHJfdCAqYmRhZGRyLAorCQkJdTgga2V5X3NpemUsIF9fbGUxNiBlZGl2LCB1OCByYW5kWzhdLCB1OCBsdGtbMTZdKTsKIGludCBoY2lfcmVtb3ZlX2xpbmtfa2V5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKTsKIAogaW50IGhjaV9yZW1vdGVfb29iX2RhdGFfY2xlYXIoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwpAQCAtNTI3LDYgKzU2OCwxMiBAQAogCQkJCQkJCQl1OCAqcmFuZG9taXplcik7CiBpbnQgaGNpX3JlbW92ZV9yZW1vdGVfb29iX2RhdGEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIpOwogCisjZGVmaW5lIEFEVl9DTEVBUl9USU1FT1VUICgzKjYwKkhaKSAvKiBUaHJlZSBtaW51dGVzICovCitpbnQgaGNpX2Fkdl9lbnRyaWVzX2NsZWFyKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKK3N0cnVjdCBhZHZfZW50cnkgKmhjaV9maW5kX2Fkdl9lbnRyeShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcik7CitpbnQgaGNpX2FkZF9hZHZfZW50cnkoc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkJCXN0cnVjdCBoY2lfZXZfbGVfYWR2ZXJ0aXNpbmdfaW5mbyAqZXYpOworCiB2b2lkIGhjaV9kZWxfb2ZmX3RpbWVyKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIAogdm9pZCBoY2lfZXZlbnRfcGFja2V0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTU1Myw2ICs2MDAsOSBAQAogI2RlZmluZSBsbXBfbm9fZmx1c2hfY2FwYWJsZShkZXYpICAoKGRldiktPmZlYXR1cmVzWzZdICYgTE1QX05PX0ZMVVNIKQogI2RlZmluZSBsbXBfbGVfY2FwYWJsZShkZXYpICAgICAgICAoKGRldiktPmZlYXR1cmVzWzRdICYgTE1QX0xFKQogCisvKiAtLS0tLSBFeHRlbmRlZCBMTVAgY2FwYWJpbGl0aWVzIC0tLS0tICovCisjZGVmaW5lIGxtcF9ob3N0X2xlX2NhcGFibGUoZGV2KSAgICgoZGV2KS0+ZXh0ZmVhdHVyZXNbMF0gJiBMTVBfSE9TVF9MRSkKKwogLyogLS0tLS0gSENJIHByb3RvY29scyAtLS0tLSAqLwogc3RydWN0IGhjaV9wcm90byB7CiAJY2hhcgkJKm5hbWU7CkBAIC01NjEsMTYgKzYxMSwyMCBAQAogCiAJdm9pZAkJKnByaXY7CiAKLQlpbnQgKCpjb25uZWN0X2luZCkJKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCBfX3U4IHR5cGUpOworCWludCAoKmNvbm5lY3RfaW5kKQkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsCisJCQkJCQkJCV9fdTggdHlwZSk7CiAJaW50ICgqY29ubmVjdF9jZm0pCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggc3RhdHVzKTsKIAlpbnQgKCpkaXNjb25uX2luZCkJKHN0cnVjdCBoY2lfY29ubiAqY29ubik7CiAJaW50ICgqZGlzY29ubl9jZm0pCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggcmVhc29uKTsKLQlpbnQgKCpyZWN2X2FjbGRhdGEpCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGZsYWdzKTsKKwlpbnQgKCpyZWN2X2FjbGRhdGEpCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkJCV9fdTE2IGZsYWdzKTsKIAlpbnQgKCpyZWN2X3Njb2RhdGEpCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpOwotCWludCAoKnNlY3VyaXR5X2NmbSkJKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzdGF0dXMsIF9fdTggZW5jcnlwdCk7CisJaW50ICgqc2VjdXJpdHlfY2ZtKQkoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cywKKwkJCQkJCQkJX191OCBlbmNyeXB0KTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IGhjaV9wcm90b19jb25uZWN0X2luZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgX191OCB0eXBlKQorc3RhdGljIGlubGluZSBpbnQgaGNpX3Byb3RvX2Nvbm5lY3RfaW5kKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLAorCQkJCQkJCQlfX3U4IHR5cGUpCiB7CiAJcmVnaXN0ZXIgc3RydWN0IGhjaV9wcm90byAqaHA7CiAJaW50IG1hc2sgPSAwOwpAQCAtNjU2LDcgKzcxMCw4IEBACiAJCWNvbm4tPnNlY3VyaXR5X2NmbV9jYihjb25uLCBzdGF0dXMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaGNpX3Byb3RvX2VuY3J5cHRfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzdGF0dXMsIF9fdTggZW5jcnlwdCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfcHJvdG9fZW5jcnlwdF9jZm0oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cywKKwkJCQkJCQkJX191OCBlbmNyeXB0KQogewogCXJlZ2lzdGVyIHN0cnVjdCBoY2lfcHJvdG8gKmhwOwogCkBAIC02ODEsNyArNzM2LDggQEAKIAogCWNoYXIgKm5hbWU7CiAKLQl2b2lkICgqc2VjdXJpdHlfY2ZtKQkoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cywgX191OCBlbmNyeXB0KTsKKwl2b2lkICgqc2VjdXJpdHlfY2ZtKQkoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cywKKwkJCQkJCQkJX191OCBlbmNyeXB0KTsKIAl2b2lkICgqa2V5X2NoYW5nZV9jZm0pCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggc3RhdHVzKTsKIAl2b2lkICgqcm9sZV9zd2l0Y2hfY2ZtKQkoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cywgX191OCByb2xlKTsKIH07CkBAIC03MDcsMTMgKzc2MywxNyBAQAogCXJlYWRfdW5sb2NrX2JoKCZoY2lfY2JfbGlzdF9sb2NrKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGhjaV9lbmNyeXB0X2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggc3RhdHVzLCBfX3U4IGVuY3J5cHQpCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2VuY3J5cHRfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzdGF0dXMsCisJCQkJCQkJCV9fdTggZW5jcnlwdCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCiAJaWYgKGNvbm4tPnNlY19sZXZlbCA9PSBCVF9TRUNVUklUWV9TRFApCiAJCWNvbm4tPnNlY19sZXZlbCA9IEJUX1NFQ1VSSVRZX0xPVzsKIAorCWlmIChjb25uLT5wZW5kaW5nX3NlY19sZXZlbCA+IGNvbm4tPnNlY19sZXZlbCkKKwkJY29ubi0+c2VjX2xldmVsID0gY29ubi0+cGVuZGluZ19zZWNfbGV2ZWw7CisKIAloY2lfcHJvdG9fZW5jcnlwdF9jZm0oY29ubiwgc3RhdHVzLCBlbmNyeXB0KTsKIAogCXJlYWRfbG9ja19iaCgmaGNpX2NiX2xpc3RfbG9jayk7CkBAIC03MzgsNyArNzk4LDggQEAKIAlyZWFkX3VubG9ja19iaCgmaGNpX2NiX2xpc3RfbG9jayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfcm9sZV9zd2l0Y2hfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzdGF0dXMsIF9fdTggcm9sZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfcm9sZV9zd2l0Y2hfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzdGF0dXMsCisJCQkJCQkJCV9fdTggcm9sZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCkBAIC04MzAsNCArODkxLDkgQEAKIAogdm9pZCBoY2lfbGVfY29ubl91cGRhdGUoc3RydWN0IGhjaV9jb25uICpjb25uLCB1MTYgbWluLCB1MTYgbWF4LAogCQkJCQl1MTYgbGF0ZW5jeSwgdTE2IHRvX211bHRpcGxpZXIpOwordm9pZCBoY2lfbGVfc3RhcnRfZW5jKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX19sZTE2IGVkaXYsIF9fdTggcmFuZFs4XSwKKwkJCQkJCQlfX3U4IGx0a1sxNl0pOwordm9pZCBoY2lfbGVfbHRrX3JlcGx5KHN0cnVjdCBoY2lfY29ubiAqY29ubiwgdTggbHRrWzE2XSk7Cit2b2lkIGhjaV9sZV9sdGtfbmVnX3JlcGx5KHN0cnVjdCBoY2lfY29ubiAqY29ubik7CisKICNlbmRpZiAvKiBfX0hDSV9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9sMmNhcC5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmgKaW5kZXggZDA5YzliMS4uNGYzNGFkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmgKQEAgLTM3LDcgKzM3LDYgQEAKICNkZWZpbmUgTDJDQVBfREVGQVVMVF9NT05JVE9SX1RPCTEyMDAwICAgLyogMTIgc2Vjb25kcyAqLwogI2RlZmluZSBMMkNBUF9ERUZBVUxUX01BWF9QRFVfU0laRQkxMDA5ICAgIC8qIFNpemVkIGZvciAzLURINSBwYWNrZXQgKi8KICNkZWZpbmUgTDJDQVBfREVGQVVMVF9BQ0tfVE8JCTIwMAotI2RlZmluZSBMMkNBUF9MT0NBTF9CVVNZX1RSSUVTCQkxMgogI2RlZmluZSBMMkNBUF9MRV9ERUZBVUxUX01UVQkJMjMKIAogI2RlZmluZSBMMkNBUF9DT05OX1RJTUVPVVQJKDQwMDAwKSAvKiA0MCBzZWNvbmRzICovCkBAIC0xMzAsNiArMTI5LDEyIEBACiAjZGVmaW5lIEwyQ0FQX1NEVV9FTkQgICAgICAgICAgICAgICAweDgwMDAKICNkZWZpbmUgTDJDQVBfU0RVX0NPTlRJTlVFICAgICAgICAgIDB4QzAwMAogCisvKiBMMkNBUCBDb21tYW5kIHJlai4gcmVhc29ucyAqLworI2RlZmluZSBMMkNBUF9SRUpfTk9UX1VOREVSU1RPT0QgICAgICAweDAwMDAKKyNkZWZpbmUgTDJDQVBfUkVKX01UVV9FWENFRURFRCAgICAgICAgMHgwMDAxCisjZGVmaW5lIEwyQ0FQX1JFSl9JTlZBTElEX0NJRCAgICAgICAgIDB4MDAwMgorCisKIC8qIEwyQ0FQIHN0cnVjdHVyZXMgKi8KIHN0cnVjdCBsMmNhcF9oZHIgewogCV9fbGUxNiAgICAgbGVuOwpAQCAtMTQ0LDEwICsxNDksMjEgQEAKIH0gX19wYWNrZWQ7CiAjZGVmaW5lIEwyQ0FQX0NNRF9IRFJfU0laRQk0CiAKLXN0cnVjdCBsMmNhcF9jbWRfcmVqIHsKK3N0cnVjdCBsMmNhcF9jbWRfcmVqX3VuayB7CiAJX19sZTE2ICAgICByZWFzb247CiB9IF9fcGFja2VkOwogCitzdHJ1Y3QgbDJjYXBfY21kX3Jlal9tdHUgeworCV9fbGUxNiAgICAgcmVhc29uOworCV9fbGUxNiAgICAgbWF4X210dTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBsMmNhcF9jbWRfcmVqX2NpZCB7CisJX19sZTE2ICAgICByZWFzb247CisJX19sZTE2ICAgICBzY2lkOworCV9fbGUxNiAgICAgZGNpZDsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCBsMmNhcF9jb25uX3JlcSB7CiAJX19sZTE2ICAgICBwc207CiAJX19sZTE2ICAgICBzY2lkOwpAQCAtMjg3LDYgKzMwMywxMCBAQAogCiAJc3RydWN0IGwyY2FwX2Nvbm4JKmNvbm47CiAKKwlfX3U4CQlzdGF0ZTsKKworCWF0b21pY190CXJlZmNudDsKKwogCV9fbGUxNgkJcHNtOwogCV9fdTE2CQlkY2lkOwogCV9fdTE2CQlzY2lkOwpAQCAtMjk1LDYgKzMxNSw3IEBACiAJX191MTYJCW9tdHU7CiAJX191MTYJCWZsdXNoX3RvOwogCV9fdTgJCW1vZGU7CisJX191OAkJY2hhbl90eXBlOwogCiAJX19sZTE2CQlzcG9ydDsKIApAQCAtMzAyLDYgKzMyMyw3IEBACiAJX191OAkJcm9sZV9zd2l0Y2g7CiAJX191OAkJZm9yY2VfcmVsaWFibGU7CiAJX191OAkJZmx1c2hhYmxlOworCV9fdTgJCWZvcmNlX2FjdGl2ZTsKIAogCV9fdTgJCWlkZW50OwogCkBAIC0zMTgsOCArMzQwLDggQEAKIAlfX3UxNgkJbW9uaXRvcl90aW1lb3V0OwogCV9fdTE2CQltcHM7CiAKLQlfX3U4CQljb25mX3N0YXRlOwotCV9fdTE2CQljb25uX3N0YXRlOworCXVuc2lnbmVkIGxvbmcJY29uZl9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nCWNvbm5fc3RhdGU7CiAKIAlfX3U4CQluZXh0X3R4X3NlcTsKIAlfX3U4CQlleHBlY3RlZF9hY2tfc2VxOwpAQCAtMzM5LDE4ICszNjEsMjkgQEAKIAlfX3U4CQlyZW1vdGVfbWF4X3R4OwogCV9fdTE2CQlyZW1vdGVfbXBzOwogCisJc3RydWN0IHRpbWVyX2xpc3QJY2hhbl90aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdAlyZXRyYW5zX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0CW1vbml0b3JfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QJYWNrX3RpbWVyOwogCXN0cnVjdCBza19idWZmCQkqdHhfc2VuZF9oZWFkOwogCXN0cnVjdCBza19idWZmX2hlYWQJdHhfcTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCXNyZWpfcTsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCWJ1c3lfcTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJYnVzeV93b3JrOwogCXN0cnVjdCBsaXN0X2hlYWQJc3Jlal9sOwogCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgZ2xvYmFsX2w7CisKKwl2b2lkCQkqZGF0YTsKKwlzdHJ1Y3QgbDJjYXBfb3BzICpvcHM7Cit9OworCitzdHJ1Y3QgbDJjYXBfb3BzIHsKKwljaGFyCQkqbmFtZTsKKworCXN0cnVjdCBsMmNhcF9jaGFuCSooKm5ld19jb25uZWN0aW9uKSAodm9pZCAqZGF0YSk7CisJaW50CQkJKCpyZWN2KSAodm9pZCAqZGF0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJdm9pZAkJCSgqY2xvc2UpICh2b2lkICpkYXRhKTsKKwl2b2lkCQkJKCpzdGF0ZV9jaGFuZ2UpICh2b2lkICpkYXRhLCBpbnQgc3RhdGUpOwogfTsKIAogc3RydWN0IGwyY2FwX2Nvbm4gewpAQCAtMzc2LDYgKzQwOSwxNSBAQAogCiAJX191OAkJZGlzY19yZWFzb247CiAKKwlfX3U4CQlwcmVxWzddOyAvKiBTTVAgUGFpcmluZyBSZXF1ZXN0ICovCisJX191OAkJcHJzcFs3XTsgLyogU01QIFBhaXJpbmcgUmVzcG9uc2UgKi8KKwlfX3U4CQlwcm5kWzE2XTsgLyogU01QIFBhaXJpbmcgUmFuZG9tICovCisJX191OAkJcGNuZlsxNl07IC8qIFNNUCBQYWlyaW5nIENvbmZpcm0gKi8KKwlfX3U4CQl0a1sxNl07IC8qIFNNUCBUZW1wb3JhcnkgS2V5ICovCisJX191OAkJc21wX2tleV9zaXplOworCisJc3RydWN0IHRpbWVyX2xpc3Qgc2VjdXJpdHlfdGltZXI7CisKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNoYW5fbDsKIAlyd2xvY2tfdAljaGFuX2xvY2s7CiB9OwpAQCAtMzg0LDQ0ICs0MjYsNTcgQEAKICNkZWZpbmUgTDJDQVBfSU5GT19GRUFUX01BU0tfUkVRX1NFTlQJMHgwNAogI2RlZmluZSBMMkNBUF9JTkZPX0ZFQVRfTUFTS19SRVFfRE9ORQkweDA4CiAKKyNkZWZpbmUgTDJDQVBfQ0hBTl9SQVcJCQkxCisjZGVmaW5lIEwyQ0FQX0NIQU5fQ09OTl9MRVNTCQkyCisjZGVmaW5lIEwyQ0FQX0NIQU5fQ09OTl9PUklFTlRFRAkzCisKIC8qIC0tLS0tIEwyQ0FQIHNvY2tldCBpbmZvIC0tLS0tICovCiAjZGVmaW5lIGwyY2FwX3BpKHNrKSAoKHN0cnVjdCBsMmNhcF9waW5mbyAqKSBzaykKIAogc3RydWN0IGwyY2FwX3BpbmZvIHsKIAlzdHJ1Y3QgYnRfc29jawlidDsKIAlzdHJ1Y3QgbDJjYXBfY2hhbgkqY2hhbjsKKwlzdHJ1Y3Qgc2tfYnVmZgkqcnhfYnVzeV9za2I7CiB9OwogCi0jZGVmaW5lIEwyQ0FQX0NPTkZfUkVRX1NFTlQgICAgICAgMHgwMQotI2RlZmluZSBMMkNBUF9DT05GX0lOUFVUX0RPTkUgICAgIDB4MDIKLSNkZWZpbmUgTDJDQVBfQ09ORl9PVVRQVVRfRE9ORSAgICAweDA0Ci0jZGVmaW5lIEwyQ0FQX0NPTkZfTVRVX0RPTkUgICAgICAgMHgwOAotI2RlZmluZSBMMkNBUF9DT05GX01PREVfRE9ORSAgICAgIDB4MTAKLSNkZWZpbmUgTDJDQVBfQ09ORl9DT05ORUNUX1BFTkQgICAweDIwCi0jZGVmaW5lIEwyQ0FQX0NPTkZfTk9fRkNTX1JFQ1YgICAgMHg0MAotI2RlZmluZSBMMkNBUF9DT05GX1NUQVRFMl9ERVZJQ0UgIDB4ODAKK2VudW0geworCUNPTkZfUkVRX1NFTlQsCisJQ09ORl9JTlBVVF9ET05FLAorCUNPTkZfT1VUUFVUX0RPTkUsCisJQ09ORl9NVFVfRE9ORSwKKwlDT05GX01PREVfRE9ORSwKKwlDT05GX0NPTk5FQ1RfUEVORCwKKwlDT05GX05PX0ZDU19SRUNWLAorCUNPTkZfU1RBVEUyX0RFVklDRSwKK307CiAKICNkZWZpbmUgTDJDQVBfQ09ORl9NQVhfQ09ORl9SRVEgMgogI2RlZmluZSBMMkNBUF9DT05GX01BWF9DT05GX1JTUCAyCiAKLSNkZWZpbmUgTDJDQVBfQ09OTl9TQVJfU0RVICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEwyQ0FQX0NPTk5fU1JFSl9TRU5UICAgICAgIDB4MDAwMgotI2RlZmluZSBMMkNBUF9DT05OX1dBSVRfRiAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgTDJDQVBfQ09OTl9TUkVKX0FDVCAgICAgICAgMHgwMDA4Ci0jZGVmaW5lIEwyQ0FQX0NPTk5fU0VORF9QQklUICAgICAgIDB4MDAxMAotI2RlZmluZSBMMkNBUF9DT05OX1JFTU9URV9CVVNZICAgICAweDAwMjAKLSNkZWZpbmUgTDJDQVBfQ09OTl9MT0NBTF9CVVNZICAgICAgMHgwMDQwCi0jZGVmaW5lIEwyQ0FQX0NPTk5fUkVKX0FDVCAgICAgICAgIDB4MDA4MAotI2RlZmluZSBMMkNBUF9DT05OX1NFTkRfRkJJVCAgICAgICAweDAxMDAKLSNkZWZpbmUgTDJDQVBfQ09OTl9STlJfU0VOVCAgICAgICAgMHgwMjAwCi0jZGVmaW5lIEwyQ0FQX0NPTk5fU0FSX1JFVFJZICAgICAgIDB4MDQwMAorZW51bSB7CisJQ09OTl9TQVJfU0RVLAorCUNPTk5fU1JFSl9TRU5ULAorCUNPTk5fV0FJVF9GLAorCUNPTk5fU1JFSl9BQ1QsCisJQ09OTl9TRU5EX1BCSVQsCisJQ09OTl9SRU1PVEVfQlVTWSwKKwlDT05OX0xPQ0FMX0JVU1ksCisJQ09OTl9SRUpfQUNULAorCUNPTk5fU0VORF9GQklULAorCUNPTk5fUk5SX1NFTlQsCit9OwogCi0jZGVmaW5lIF9fbW9kX3JldHJhbnNfdGltZXIoKSBtb2RfdGltZXIoJmNoYW4tPnJldHJhbnNfdGltZXIsIFwKLQkJamlmZmllcyArICBtc2Vjc190b19qaWZmaWVzKEwyQ0FQX0RFRkFVTFRfUkVUUkFOU19UTykpOwotI2RlZmluZSBfX21vZF9tb25pdG9yX3RpbWVyKCkgbW9kX3RpbWVyKCZjaGFuLT5tb25pdG9yX3RpbWVyLCBcCi0JCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEwyQ0FQX0RFRkFVTFRfTU9OSVRPUl9UTykpOwotI2RlZmluZSBfX21vZF9hY2tfdGltZXIoKSBtb2RfdGltZXIoJmNoYW4tPmFja190aW1lciwgXAotCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhMMkNBUF9ERUZBVUxUX0FDS19UTykpOworI2RlZmluZSBfX3NldF9jaGFuX3RpbWVyKGMsIHQpIGwyY2FwX3NldF90aW1lcihjLCAmYy0+Y2hhbl90aW1lciwgKHQpKQorI2RlZmluZSBfX2NsZWFyX2NoYW5fdGltZXIoYykgbDJjYXBfY2xlYXJfdGltZXIoYywgJmMtPmNoYW5fdGltZXIpCisjZGVmaW5lIF9fc2V0X3JldHJhbnNfdGltZXIoYykgbDJjYXBfc2V0X3RpbWVyKGMsICZjLT5yZXRyYW5zX3RpbWVyLCBcCisJCUwyQ0FQX0RFRkFVTFRfUkVUUkFOU19UTyk7CisjZGVmaW5lIF9fY2xlYXJfcmV0cmFuc190aW1lcihjKSBsMmNhcF9jbGVhcl90aW1lcihjLCAmYy0+cmV0cmFuc190aW1lcikKKyNkZWZpbmUgX19zZXRfbW9uaXRvcl90aW1lcihjKSBsMmNhcF9zZXRfdGltZXIoYywgJmMtPm1vbml0b3JfdGltZXIsIFwKKwkJTDJDQVBfREVGQVVMVF9NT05JVE9SX1RPKTsKKyNkZWZpbmUgX19jbGVhcl9tb25pdG9yX3RpbWVyKGMpIGwyY2FwX2NsZWFyX3RpbWVyKGMsICZjLT5tb25pdG9yX3RpbWVyKQorI2RlZmluZSBfX3NldF9hY2tfdGltZXIoYykgbDJjYXBfc2V0X3RpbWVyKGMsICZjaGFuLT5hY2tfdGltZXIsIFwKKwkJTDJDQVBfREVGQVVMVF9BQ0tfVE8pOworI2RlZmluZSBfX2NsZWFyX2Fja190aW1lcihjKSBsMmNhcF9jbGVhcl90aW1lcihjLCAmYy0+YWNrX3RpbWVyKQogCiBzdGF0aWMgaW5saW5lIGludCBsMmNhcF90eF93aW5kb3dfZnVsbChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2gpCiB7CkBAIC00NDYsMzIgKzUwMSwxNyBAQAogaW50IGwyY2FwX2luaXRfc29ja2V0cyh2b2lkKTsKIHZvaWQgbDJjYXBfY2xlYW51cF9zb2NrZXRzKHZvaWQpOwogCi12b2lkIGwyY2FwX3NlbmRfY21kKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCB1OCBpZGVudCwgdTggY29kZSwgdTE2IGxlbiwgdm9pZCAqZGF0YSk7CiB2b2lkIF9fbDJjYXBfY29ubmVjdF9yc3BfZGVmZXIoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pOwogaW50IF9fbDJjYXBfd2FpdF9hY2soc3RydWN0IHNvY2sgKnNrKTsKIAotc3RydWN0IHNrX2J1ZmYgKmwyY2FwX2NyZWF0ZV9jb25ubGVzc19wZHUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbik7Ci1zdHJ1Y3Qgc2tfYnVmZiAqbDJjYXBfY3JlYXRlX2Jhc2ljX3BkdShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKTsKLXN0cnVjdCBza19idWZmICpsMmNhcF9jcmVhdGVfaWZyYW1lX3BkdShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCB1MTYgY29udHJvbCwgdTE2IHNkdWxlbik7Ci1pbnQgbDJjYXBfc2FyX3NlZ21lbnRfc2R1KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pOwotdm9pZCBsMmNhcF9kb19zZW5kKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXZvaWQgbDJjYXBfc3RyZWFtaW5nX3NlbmQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pOwotaW50IGwyY2FwX2VydG1fc2VuZChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbik7Ci0KIGludCBsMmNhcF9hZGRfcHNtKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBiZGFkZHJfdCAqc3JjLCBfX2xlMTYgcHNtKTsKIGludCBsMmNhcF9hZGRfc2NpZChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgIF9fdTE2IHNjaWQpOwogCi12b2lkIGwyY2FwX3NvY2tfc2V0X3RpbWVyKHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lb3V0KTsKLXZvaWQgbDJjYXBfc29ja19jbGVhcl90aW1lcihzdHJ1Y3Qgc29jayAqc2spOwotdm9pZCBfX2wyY2FwX3NvY2tfY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBpbnQgcmVhc29uKTsKLXZvaWQgbDJjYXBfc29ja19raWxsKHN0cnVjdCBzb2NrICpzayk7Ci12b2lkIGwyY2FwX3NvY2tfaW5pdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrICpwYXJlbnQpOwotc3RydWN0IHNvY2sgKmwyY2FwX3NvY2tfYWxsb2Moc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJCQkJCWludCBwcm90bywgZ2ZwX3QgcHJpbyk7Ci12b2lkIGwyY2FwX3NlbmRfZGlzY29ubl9yZXEoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBpbnQgZXJyKTsKIHN0cnVjdCBsMmNhcF9jaGFuICpsMmNhcF9jaGFuX2NyZWF0ZShzdHJ1Y3Qgc29jayAqc2spOwotdm9pZCBsMmNhcF9jaGFuX2RlbChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgaW50IGVycik7Cit2b2lkIGwyY2FwX2NoYW5fY2xvc2Uoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIGludCByZWFzb24pOwogdm9pZCBsMmNhcF9jaGFuX2Rlc3Ryb3koc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pOwogaW50IGwyY2FwX2NoYW5fY29ubmVjdChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbik7CitpbnQgbDJjYXBfY2hhbl9zZW5kKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pOwordm9pZCBsMmNhcF9jaGFuX2J1c3koc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIGludCBidXN5KTsKIAogI2VuZGlmIC8qIF9fTDJDQVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmgKaW5kZXggNDg5OTI4Ni4uNTQyOGZkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvbWdtdC5oCkBAIC0xMDEsNiArMTAxLDggQEAKIAl1OCB0eXBlOwogCXU4IHZhbFsxNl07CiAJdTggcGluX2xlbjsKKwl1OCBkbGVuOworCXU4IGRhdGFbMF07CiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIE1HTVRfT1BfTE9BRF9LRVlTCQkweDAwMEQKQEAgLTE5OSw2ICsyMDEsMTYgQEAKIAogI2RlZmluZSBNR01UX09QX1NUT1BfRElTQ09WRVJZCQkweDAwMUMKIAorI2RlZmluZSBNR01UX09QX0JMT0NLX0RFVklDRQkJMHgwMDFECitzdHJ1Y3QgbWdtdF9jcF9ibG9ja19kZXZpY2UgeworCWJkYWRkcl90IGJkYWRkcjsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgTUdNVF9PUF9VTkJMT0NLX0RFVklDRQkJMHgwMDFFCitzdHJ1Y3QgbWdtdF9jcF91bmJsb2NrX2RldmljZSB7CisJYmRhZGRyX3QgYmRhZGRyOworfSBfX3BhY2tlZDsKKwogI2RlZmluZSBNR01UX0VWX0NNRF9DT01QTEVURQkJMHgwMDAxCiBzdHJ1Y3QgbWdtdF9ldl9jbWRfY29tcGxldGUgewogCV9fbGUxNiBvcGNvZGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvcmZjb21tLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvcmZjb21tLmgKaW5kZXggNmVhYzRhNy4uZDVlZWUyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL3JmY29tbS5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9yZmNvbW0uaApAQCAtMjM0LDcgKzIzNCw4IEBACiAvKiAtLS0tIFJGQ09NTSBETENzIChjaGFubmVscykgLS0tLSAqLwogc3RydWN0IHJmY29tbV9kbGMgKnJmY29tbV9kbGNfYWxsb2MoZ2ZwX3QgcHJpbyk7CiB2b2lkIHJmY29tbV9kbGNfZnJlZShzdHJ1Y3QgcmZjb21tX2RsYyAqZCk7Ci1pbnQgIHJmY29tbV9kbGNfb3BlbihzdHJ1Y3QgcmZjb21tX2RsYyAqZCwgYmRhZGRyX3QgKnNyYywgYmRhZGRyX3QgKmRzdCwgdTggY2hhbm5lbCk7CitpbnQgIHJmY29tbV9kbGNfb3BlbihzdHJ1Y3QgcmZjb21tX2RsYyAqZCwgYmRhZGRyX3QgKnNyYywgYmRhZGRyX3QgKmRzdCwKKwkJCQkJCQkJdTggY2hhbm5lbCk7CiBpbnQgIHJmY29tbV9kbGNfY2xvc2Uoc3RydWN0IHJmY29tbV9kbGMgKmQsIGludCByZWFzb24pOwogaW50ICByZmNvbW1fZGxjX3NlbmQoc3RydWN0IHJmY29tbV9kbGMgKmQsIHN0cnVjdCBza19idWZmICpza2IpOwogaW50ICByZmNvbW1fZGxjX3NldF9tb2RlbV9zdGF0dXMoc3RydWN0IHJmY29tbV9kbGMgKmQsIHU4IHYyNF9zaWcpOwpAQCAtMjcxLDcgKzI3Miw4IEBACiB9CiAKIC8qIC0tLS0gUkZDT01NIHNlc3Npb25zIC0tLS0gKi8KLXZvaWQgICByZmNvbW1fc2Vzc2lvbl9nZXRhZGRyKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgYmRhZGRyX3QgKnNyYywgYmRhZGRyX3QgKmRzdCk7Cit2b2lkICAgcmZjb21tX3Nlc3Npb25fZ2V0YWRkcihzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGJkYWRkcl90ICpzcmMsCisJCQkJCQkJCWJkYWRkcl90ICpkc3QpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmZjb21tX3Nlc3Npb25faG9sZChzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMpCiB7CkBAIC0zMTIsNyArMzE0LDggQEAKIGludCAgcmZjb21tX2luaXRfc29ja2V0cyh2b2lkKTsKIHZvaWQgcmZjb21tX2NsZWFudXBfc29ja2V0cyh2b2lkKTsKIAotaW50ICByZmNvbW1fY29ubmVjdF9pbmQoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBjaGFubmVsLCBzdHJ1Y3QgcmZjb21tX2RsYyAqKmQpOworaW50ICByZmNvbW1fY29ubmVjdF9pbmQoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBjaGFubmVsLAorCQkJCQkJCXN0cnVjdCByZmNvbW1fZGxjICoqZCk7CiAKIC8qIC0tLS0gUkZDT01NIFRUWSAtLS0tICovCiAjZGVmaW5lIFJGQ09NTV9NQVhfREVWICAyNTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9zbXAuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9zbXAuaAppbmRleCA4ZjJlZGJmLi40NmM0NTc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvc21wLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL3NtcC5oCkBAIC0xLDMgKzEsMjUgQEAKKy8qCisgICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKKyAgIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUworICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKICNpZm5kZWYgX19TTVBfSAogI2RlZmluZSBfX1NNUF9ICiAKQEAgLTE2LDYgKzM4LDIzIEBACiAJX191OAlyZXNwX2tleV9kaXN0OwogfSBfX3BhY2tlZDsKIAorI2RlZmluZSBTTVBfSU9fRElTUExBWV9PTkxZCTB4MDAKKyNkZWZpbmUgU01QX0lPX0RJU1BMQVlfWUVTTk8JMHgwMQorI2RlZmluZSBTTVBfSU9fS0VZQk9BUkRfT05MWQkweDAyCisjZGVmaW5lIFNNUF9JT19OT19JTlBVVF9PVVRQVVQJMHgwMworI2RlZmluZSBTTVBfSU9fS0VZQk9BUkRfRElTUExBWQkweDA0CisKKyNkZWZpbmUgU01QX09PQl9OT1RfUFJFU0VOVAkweDAwCisjZGVmaW5lIFNNUF9PT0JfUFJFU0VOVAkJMHgwMQorCisjZGVmaW5lIFNNUF9ESVNUX0VOQ19LRVkJMHgwMQorI2RlZmluZSBTTVBfRElTVF9JRF9LRVkJCTB4MDIKKyNkZWZpbmUgU01QX0RJU1RfU0lHTgkJMHgwNAorCisjZGVmaW5lIFNNUF9BVVRIX05PTkUJCTB4MDAKKyNkZWZpbmUgU01QX0FVVEhfQk9ORElORwkweDAxCisjZGVmaW5lIFNNUF9BVVRIX01JVE0JCTB4MDQKKwogI2RlZmluZSBTTVBfQ01EX1BBSVJJTkdfQ09ORklSTQkweDAzCiBzdHJ1Y3Qgc21wX2NtZF9wYWlyaW5nX2NvbmZpcm0gewogCV9fdTgJY29uZmlybV92YWxbMTZdOwpAQCAtNzMsNCArMTEyLDEyIEBACiAjZGVmaW5lIFNNUF9VTlNQRUNJRklFRAkJMHgwOAogI2RlZmluZSBTTVBfUkVQRUFURURfQVRURU1QVFMJCTB4MDkKIAorI2RlZmluZSBTTVBfTUlOX0VOQ19LRVlfU0laRQkJNworI2RlZmluZSBTTVBfTUFYX0VOQ19LRVlfU0laRQkJMTYKKworLyogU01QIENvbW1hbmRzICovCitpbnQgc21wX2Nvbm5fc2VjdXJpdHkoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIF9fdTggc2VjX2xldmVsKTsKK2ludCBzbXBfc2lnX2NoYW5uZWwoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpOworaW50IHNtcF9kaXN0cmlidXRlX2tleXMoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIF9fdTggZm9yY2UpOworCiAjZW5kaWYgLyogX19TTVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2FpZi9jYWlmX2hzaS5oIGIvaW5jbHVkZS9uZXQvY2FpZi9jYWlmX2hzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZGVkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9jYWlmL2NhaWZfaHNpLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIEFCIDIwMTAKKyAqIENvbnRhY3Q6IFNqdXIgQnJlbmRlbGFuZCAvIHNqdXIuYnJhbmRlbGFuZEBzdGVyaWNzc29uLmNvbQorICogQXV0aG9yOiAgRGFuaWVsIE1hcnRlbnNzb24gLyBkYW5pZWwubWFydGVuc3NvbkBzdGVyaWNzc29uLmNvbQorICoJICAgIERtaXRyeS5UYXJueWFnaW4gIC8gZG1pdHJ5LnRhcm55YWdpbkBzdGVyaWNzc29uLmNvbQorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKi8KKworI2lmbmRlZiBDQUlGX0hTSV9IXworI2RlZmluZSBDQUlGX0hTSV9IXworCisjaW5jbHVkZSA8bmV0L2NhaWYvY2FpZl9sYXllci5oPgorI2luY2x1ZGUgPG5ldC9jYWlmL2NhaWZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBDQUlGIGZyYW1lcyB0aGF0IGNhbiByZXNpZGUgaW4gdGhlIHNhbWUgSFNJIGZyYW1lLgorICovCisjZGVmaW5lIENGSFNJX01BWF9QS1RTIDE1CisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB1c2VkIGZvciB0aGUgZnJhbWUgdGhhdCBjYW4gYmUgZW1iZWRkZWQgaW4gdGhlCisgKiBIU0kgZGVzY3JpcHRvci4KKyAqLworI2RlZmluZSBDRkhTSV9NQVhfRU1CX0ZSTV9TWiA5NgorCisvKgorICogRGVjaWRlcyBpZiBIU0kgYnVmZmVycyBzaG91bGQgYmUgcHJlZmlsbGVkIHdpdGggMHhGRiBwYXR0ZXJuIGZvciBlYXNpZXIKKyAqIGRlYnVnZ2luZy4gQm90aCBUWCBhbmQgUlggYnVmZmVycyB3aWxsIGJlIGZpbGxlZCBiZWZvcmUgdGhlIHRyYW5zZmVyLgorICovCisjZGVmaW5lIENGSFNJX0RCR19QUkVGSUxMCQkwCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgSFNJIHBhY2tldCBkZXNjcmlwdG9yLiAqLworI3ByYWdtYSBwYWNrKDEpIC8qIEJ5dGUgYWxpZ25tZW50LiAqLworc3RydWN0IGNmaHNpX2Rlc2MgeworCXU4IGhlYWRlcjsKKwl1OCBvZmZzZXQ7CisJdTE2IGNmZnJtX2xlbltDRkhTSV9NQVhfUEtUU107CisJdTggZW1iX2ZybVtDRkhTSV9NQVhfRU1CX0ZSTV9TWl07Cit9OworI3ByYWdtYSBwYWNrKCkgLyogRGVmYXVsdCBhbGlnbm1lbnQuICovCisKKy8qIFNpemUgb2YgdGhlIGNvbXBsZXRlIEhTSSBwYWNrZXQgZGVzY3JpcHRvci4gKi8KKyNkZWZpbmUgQ0ZIU0lfREVTQ19TWiAoc2l6ZW9mKHN0cnVjdCBjZmhzaV9kZXNjKSkKKworLyoKKyAqIFNpemUgb2YgdGhlIGNvbXBsZXRlIEhTSSBwYWNrZXQgZGVzY3JpcHRvciBleGNsdWRpbmcgdGhlIG9wdGlvbmFsIGVtYmVkZGVkCisgKiBDQUlGIGZyYW1lLgorICovCisjZGVmaW5lIENGSFNJX0RFU0NfU0hPUlRfU1ogKENGSFNJX0RFU0NfU1ogLSBDRkhTSV9NQVhfRU1CX0ZSTV9TWikKKworLyoKKyAqIE1heGltdW0gYnl0ZXMgdHJhbnNmZXJyZWQgaW4gb25lIHRyYW5zZmVyLgorICovCisvKiBUT0RPOiA0MDk2IGlzIHRlbXBvcmFyeS4uLiAqLworI2RlZmluZSBDRkhTSV9NQVhfUEFZTE9BRF9TWiAoQ0ZIU0lfTUFYX1BLVFMgKiA0MDk2KQorCisvKiBTaXplIG9mIHRoZSBjb21wbGV0ZSBIU0kgVFggYnVmZmVyLiAqLworI2RlZmluZSBDRkhTSV9CVUZfU1pfVFggKENGSFNJX0RFU0NfU1ogKyBDRkhTSV9NQVhfUEFZTE9BRF9TWikKKworLyogU2l6ZSBvZiB0aGUgY29tcGxldGUgSFNJIFJYIGJ1ZmZlci4gKi8KKyNkZWZpbmUgQ0ZIU0lfQlVGX1NaX1JYICgoMiAqIENGSFNJX0RFU0NfU1opICsgQ0ZIU0lfTUFYX1BBWUxPQURfU1opCisKKy8qIEJpdG1hc2tzIGZvciB0aGUgSFNJIGRlc2NyaXB0b3IuICovCisjZGVmaW5lIENGSFNJX1BJR0dZX0RFU0MJCSgweDAxIDw8IDcpCisKKyNkZWZpbmUgQ0ZIU0lfVFhfU1RBVEVfSURMRQkJCTAKKyNkZWZpbmUgQ0ZIU0lfVFhfU1RBVEVfWEZFUgkJCTEKKworI2RlZmluZSBDRkhTSV9SWF9TVEFURV9ERVNDCQkJMAorI2RlZmluZSBDRkhTSV9SWF9TVEFURV9QQVlMT0FECQkJMQorCisvKiBCaXRtYXNrcyBmb3IgcG93ZXIgbWFuYWdlbWVudC4gKi8KKyNkZWZpbmUgQ0ZIU0lfV0FLRV9VUAkJCQkwCisjZGVmaW5lIENGSFNJX1dBS0VfVVBfQUNLCQkJMQorI2RlZmluZSBDRkhTSV9XQUtFX0RPV05fQUNLCQkJMgorI2RlZmluZSBDRkhTSV9BV0FLRQkJCQkzCisjZGVmaW5lIENGSFNJX1BFTkRJTkdfUlgJCQk0CisjZGVmaW5lIENGSFNJX1NIVVRET1dOCQkJCTYKKyNkZWZpbmUgQ0ZIU0lfRkxVU0hfRklGTwkJCTcKKworI2lmbmRlZiBDRkhTSV9JTkFDVElWSVRZX1RPVVQKKyNkZWZpbmUgQ0ZIU0lfSU5BQ1RJVklUWV9UT1VUCQkJKDEgKiBIWikKKyNlbmRpZiAvKiBDRkhTSV9JTkFDVElWSVRZX1RPVVQgKi8KKworI2lmbmRlZiBDRkhTSV9XQUtFVVBfVE9VVAorI2RlZmluZSBDRkhTSV9XQUtFVVBfVE9VVAkJCSgzICogSFopCisjZW5kaWYgLyogQ0ZIU0lfV0FLRVVQX1RPVVQgKi8KKworCisvKiBTdHJ1Y3R1cmUgaW1wbGVtZW50ZWQgYnkgdGhlIENBSUYgSFNJIGRyaXZlci4gKi8KK3N0cnVjdCBjZmhzaV9kcnYgeworCXZvaWQgKCp0eF9kb25lX2NiKSAoc3RydWN0IGNmaHNpX2RydiAqZHJ2KTsKKwl2b2lkICgqcnhfZG9uZV9jYikgKHN0cnVjdCBjZmhzaV9kcnYgKmRydik7CisJdm9pZCAoKndha2VfdXBfY2IpIChzdHJ1Y3QgY2Zoc2lfZHJ2ICpkcnYpOworCXZvaWQgKCp3YWtlX2Rvd25fY2IpIChzdHJ1Y3QgY2Zoc2lfZHJ2ICpkcnYpOworfTsKKworLyogU3RydWN0dXJlIGltcGxlbWVudGVkIGJ5IEhTSSBkZXZpY2UuICovCitzdHJ1Y3QgY2Zoc2lfZGV2IHsKKwlpbnQgKCpjZmhzaV91cCkgKHN0cnVjdCBjZmhzaV9kZXYgKmRldik7CisJaW50ICgqY2Zoc2lfZG93bikgKHN0cnVjdCBjZmhzaV9kZXYgKmRldik7CisJaW50ICgqY2Zoc2lfdHgpICh1OCAqcHRyLCBpbnQgbGVuLCBzdHJ1Y3QgY2Zoc2lfZGV2ICpkZXYpOworCWludCAoKmNmaHNpX3J4KSAodTggKnB0ciwgaW50IGxlbiwgc3RydWN0IGNmaHNpX2RldiAqZGV2KTsKKwlpbnQgKCpjZmhzaV93YWtlX3VwKSAoc3RydWN0IGNmaHNpX2RldiAqZGV2KTsKKwlpbnQgKCpjZmhzaV93YWtlX2Rvd24pIChzdHJ1Y3QgY2Zoc2lfZGV2ICpkZXYpOworCWludCAoKmNmaHNpX2ZpZm9fb2NjdXBhbmN5KShzdHJ1Y3QgY2Zoc2lfZGV2ICpkZXYsIHNpemVfdCAqb2NjdXBhbmN5KTsKKwlpbnQgKCpjZmhzaV9yeF9jYW5jZWwpKHN0cnVjdCBjZmhzaV9kZXYgKmRldik7CisJc3RydWN0IGNmaHNpX2RydiAqZHJ2OworfTsKKworLyogU3RydWN0dXJlIGltcGxlbWVudGVkIGJ5IENBSUYgSFNJIGRyaXZlcnMuICovCitzdHJ1Y3QgY2Zoc2kgeworCXN0cnVjdCBjYWlmX2Rldl9jb21tb24gY2ZkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHFoZWFkOworCXN0cnVjdCBjZmhzaV9kcnYgZHJ2OworCXN0cnVjdCBjZmhzaV9kZXYgKmRldjsKKwlpbnQgdHhfc3RhdGU7CisJaW50IHJ4X3N0YXRlOworCWludCByeF9sZW47CisJdTggKnJ4X3B0cjsKKwl1OCAqdHhfYnVmOworCXU4ICpyeF9idWY7CisJc3BpbmxvY2tfdCBsb2NrOworCWludCBmbG93X29mZl9zZW50OworCXUzMiBxX2xvd19tYXJrOworCXUzMiBxX2hpZ2hfbWFyazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHdvcmtfc3RydWN0IHdha2VfdXBfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2FrZV9kb3duX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHJ4X2RvbmVfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfZG9uZV93b3JrOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWtlX3VwX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FrZV9kb3duX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgZmx1c2hfZmlmb193YWl0OworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXVuc2lnbmVkIGxvbmcgYml0czsKK307CisKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNmaHNpX2RyaXZlcjsKKworI2VuZGlmCQkvKiBDQUlGX0hTSV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaCBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKaW5kZXggMDU4OWY1NS4uZDE3ZjQ3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAorKysgYi9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCkBAIC03NzcsNiArNzc3LDcgQEAKICAqIEBuX2NoYW5uZWxzOiB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbgogICogQGllOiBvcHRpb25hbCBpbmZvcm1hdGlvbiBlbGVtZW50KHMpIHRvIGFkZCBpbnRvIFByb2JlIFJlcXVlc3Qgb3IgJU5VTEwKICAqIEBpZV9sZW46IGxlbmd0aCBvZiBpZSBpbiBvY3RldHMKKyAqIEByYXRlczogYml0bWFwIG9mIHJhdGVzIHRvIGFkdmVydGlzZSBmb3IgZWFjaCBiYW5kCiAgKiBAd2lwaHk6IHRoZSB3aXBoeSB0aGlzIHdhcyBmb3IKICAqIEBkZXY6IHRoZSBpbnRlcmZhY2UKICAqIEBhYm9ydGVkOiAoaW50ZXJuYWwpIHNjYW4gcmVxdWVzdCB3YXMgbm90aWZpZWQgYXMgYWJvcnRlZApAQCAtNzg4LDYgKzc4OSw4IEBACiAJY29uc3QgdTggKmllOwogCXNpemVfdCBpZV9sZW47CiAKKwl1MzIgcmF0ZXNbSUVFRTgwMjExX05VTV9CQU5EU107CisKIAkvKiBpbnRlcm5hbCAqLwogCXN0cnVjdCB3aXBoeSAqd2lwaHk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTExNDYsMTQgKzExNDksMzIgQEAKICAqIEBtYWdpY19wa3Q6IHdha2UgdXAgb24gcmVjZWl2aW5nIG1hZ2ljIHBhY2tldAogICogQHBhdHRlcm5zOiB3YWtlIHVwIG9uIHJlY2VpdmluZyBwYWNrZXQgbWF0Y2hpbmcgYSBwYXR0ZXJuCiAgKiBAbl9wYXR0ZXJuczogbnVtYmVyIG9mIHBhdHRlcm5zCisgKiBAZ3RrX3Jla2V5X2ZhaWx1cmU6IHdha2UgdXAgb24gR1RLIHJla2V5IGZhaWx1cmUKKyAqIEBlYXBfaWRlbnRpdHlfcmVxOiB3YWtlIHVwIG9uIEVBUCBpZGVudGl0eSByZXF1ZXN0IHBhY2tldAorICogQGZvdXJfd2F5X2hhbmRzaGFrZTogd2FrZSB1cCBvbiA0LXdheSBoYW5kc2hha2UKKyAqIEByZmtpbGxfcmVsZWFzZTogd2FrZSB1cCB3aGVuIHJma2lsbCBpcyByZWxlYXNlZAogICovCiBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuIHsKLQlib29sIGFueSwgZGlzY29ubmVjdCwgbWFnaWNfcGt0OworCWJvb2wgYW55LCBkaXNjb25uZWN0LCBtYWdpY19wa3QsIGd0a19yZWtleV9mYWlsdXJlLAorCSAgICAgZWFwX2lkZW50aXR5X3JlcSwgZm91cl93YXlfaGFuZHNoYWtlLAorCSAgICAgcmZraWxsX3JlbGVhc2U7CiAJc3RydWN0IGNmZzgwMjExX3dvd2xhbl90cmlnX3BrdF9wYXR0ZXJuICpwYXR0ZXJuczsKIAlpbnQgbl9wYXR0ZXJuczsKIH07CiAKIC8qKgorICogc3RydWN0IGNmZzgwMjExX2d0a19yZWtleV9kYXRhIC0gcmVrZXkgZGF0YQorICogQGtlazoga2V5IGVuY3J5cHRpb24ga2V5CisgKiBAa2NrOiBrZXkgY29uZmlybWF0aW9uIGtleQorICogQHJlcGxheV9jdHI6IHJlcGxheSBjb3VudGVyCisgKi8KK3N0cnVjdCBjZmc4MDIxMV9ndGtfcmVrZXlfZGF0YSB7CisJdTgga2VrW05MODAyMTFfS0VLX0xFTl07CisJdTgga2NrW05MODAyMTFfS0NLX0xFTl07CisJdTggcmVwbGF5X2N0cltOTDgwMjExX1JFUExBWV9DVFJfTEVOXTsKK307CisKKy8qKgogICogc3RydWN0IGNmZzgwMjExX29wcyAtIGJhY2tlbmQgZGVzY3JpcHRpb24gZm9yIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24KICAqCiAgKiBUaGlzIHN0cnVjdCBpcyByZWdpc3RlcmVkIGJ5IGZ1bGxtYWMgY2FyZCBkcml2ZXJzIGFuZC9vciB3aXJlbGVzcyBzdGFja3MKQEAgLTExOTcsNiArMTIxOCw4IEBACiAgKgogICogQHNldF9kZWZhdWx0X21nbXRfa2V5OiBzZXQgdGhlIGRlZmF1bHQgbWFuYWdlbWVudCBmcmFtZSBrZXkgb24gYW4gaW50ZXJmYWNlCiAgKgorICogQHNldF9yZWtleV9kYXRhOiBnaXZlIHRoZSBkYXRhIG5lY2Vzc2FyeSBmb3IgR1RLIHJla2V5aW5nIHRvIHRoZSBkcml2ZXIKKyAqCiAgKiBAYWRkX2JlYWNvbjogQWRkIGEgYmVhY29uIHdpdGggZ2l2ZW4gcGFyYW1ldGVycywgQGhlYWQsIEBpbnRlcnZhbAogICoJYW5kIEBkdGltX3BlcmlvZCB3aWxsIGJlIHZhbGlkLCBAdGFpbCBpcyBvcHRpb25hbC4KICAqIEBzZXRfYmVhY29uOiBDaGFuZ2UgdGhlIGJlYWNvbiBwYXJhbWV0ZXJzIGZvciBhbiBhY2Nlc3MgcG9pbnQgbW9kZQpAQCAtMTI4NCw2ICsxMzA3LDEyIEBACiAgKglmcmFtZSBvbiBhbm90aGVyIGNoYW5uZWwKICAqCiAgKiBAdGVzdG1vZGVfY21kOiBydW4gYSB0ZXN0IG1vZGUgY29tbWFuZAorICogQHRlc3Rtb2RlX2R1bXA6IEltcGxlbWVudCBhIHRlc3QgbW9kZSBkdW1wLiBUaGUgY2ItPmFyZ3NbMl0gYW5kIHVwIG1heSBiZQorICoJdXNlZCBieSB0aGUgZnVuY3Rpb24sIGJ1dCAwIGFuZCAxIG11c3Qgbm90IGJlIHRvdWNoZWQuIEFkZGl0aW9uYWxseSwKKyAqCXJldHVybiBlcnJvciBjb2RlcyBvdGhlciB0aGFuIC1FTk9CVUZTIGFuZCAtRU5PRU5UIHdpbGwgdGVybWluYXRlIHRoZQorICoJZHVtcCBhbmQgcmV0dXJuIHRvIHVzZXJzcGFjZSB3aXRoIGFuIGVycm9yLCBzbyBiZSBjYXJlZnVsLiBJZiBhbnkgZGF0YQorICoJd2FzIHBhc3NlZCBpbiBmcm9tIHVzZXJzcGFjZSB0aGVuIHRoZSBkYXRhL2xlbiBhcmd1bWVudHMgd2lsbCBiZSBwcmVzZW50CisgKglhbmQgcG9pbnQgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluICVOTDgwMjExX0FUVFJfVEVTVERBVEEuCiAgKgogICogQHNldF9iaXRyYXRlX21hc2s6IHNldCB0aGUgYml0cmF0ZSBtYXNrIGNvbmZpZ3VyYXRpb24KICAqCkBAIC0xNDMzLDYgKzE0NjIsOSBAQAogCiAjaWZkZWYgQ09ORklHX05MODAyMTFfVEVTVE1PREUKIAlpbnQJKCp0ZXN0bW9kZV9jbWQpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHZvaWQgKmRhdGEsIGludCBsZW4pOworCWludAkoKnRlc3Rtb2RlX2R1bXApKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCQkgdm9pZCAqZGF0YSwgaW50IGxlbik7CiAjZW5kaWYKIAogCWludAkoKnNldF9iaXRyYXRlX21hc2spKHN0cnVjdCB3aXBoeSAqd2lwaHksCkBAIC0xNDkwLDYgKzE1MjIsOSBAQAogCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGNmZzgwMjExX3NjaGVkX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCk7CiAJaW50CSgqc2NoZWRfc2Nhbl9zdG9wKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCWludAkoKnNldF9yZWtleV9kYXRhKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGNmZzgwMjExX2d0a19yZWtleV9kYXRhICpkYXRhKTsKIH07CiAKIC8qCkBAIC0xNjQ3LDExICsxNjgyLDIxIEBACiAgKiBAV0lQSFlfV09XTEFOX01BR0lDX1BLVDogc3VwcG9ydHMgd2FrZXVwIG9uIG1hZ2ljIHBhY2tldAogICoJKHNlZSBubDgwMjExLmgpCiAgKiBAV0lQSFlfV09XTEFOX0RJU0NPTk5FQ1Q6IHN1cHBvcnRzIHdha2V1cCBvbiBkaXNjb25uZWN0CisgKiBAV0lQSFlfV09XTEFOX1NVUFBPUlRTX0dUS19SRUtFWTogc3VwcG9ydHMgR1RLIHJla2V5aW5nIHdoaWxlIGFzbGVlcAorICogQFdJUEhZX1dPV0xBTl9HVEtfUkVLRVlfRkFJTFVSRTogc3VwcG9ydHMgd2FrZXVwIG9uIEdUSyByZWtleSBmYWlsdXJlCisgKiBAV0lQSFlfV09XTEFOX0VBUF9JREVOVElUWV9SRVE6IHN1cHBvcnRzIHdha2V1cCBvbiBFQVAgaWRlbnRpdHkgcmVxdWVzdAorICogQFdJUEhZX1dPV0xBTl80V0FZX0hBTkRTSEFLRTogc3VwcG9ydHMgd2FrZXVwIG9uIDQtd2F5IGhhbmRzaGFrZSBmYWlsdXJlCisgKiBAV0lQSFlfV09XTEFOX1JGS0lMTF9SRUxFQVNFOiBzdXBwb3J0cyB3YWtldXAgb24gUkYta2lsbCByZWxlYXNlCiAgKi8KIGVudW0gd2lwaHlfd293bGFuX3N1cHBvcnRfZmxhZ3MgewotCVdJUEhZX1dPV0xBTl9BTlkJPSBCSVQoMCksCi0JV0lQSFlfV09XTEFOX01BR0lDX1BLVAk9IEJJVCgxKSwKLQlXSVBIWV9XT1dMQU5fRElTQ09OTkVDVAk9IEJJVCgyKSwKKwlXSVBIWV9XT1dMQU5fQU5ZCQk9IEJJVCgwKSwKKwlXSVBIWV9XT1dMQU5fTUFHSUNfUEtUCQk9IEJJVCgxKSwKKwlXSVBIWV9XT1dMQU5fRElTQ09OTkVDVAkJPSBCSVQoMiksCisJV0lQSFlfV09XTEFOX1NVUFBPUlRTX0dUS19SRUtFWQk9IEJJVCgzKSwKKwlXSVBIWV9XT1dMQU5fR1RLX1JFS0VZX0ZBSUxVUkUJPSBCSVQoNCksCisJV0lQSFlfV09XTEFOX0VBUF9JREVOVElUWV9SRVEJPSBCSVQoNSksCisJV0lQSFlfV09XTEFOXzRXQVlfSEFORFNIQUtFCT0gQklUKDYpLAorCVdJUEhZX1dPV0xBTl9SRktJTExfUkVMRUFTRQk9IEJJVCg3KSwKIH07CiAKIC8qKgpAQCAtMTcxNiw5ICsxNzYxLDEzIEBACiAgKgl0aGlzIHZhcmlhYmxlIGRldGVybWluZXMgaXRzIHNpemUKICAqIEBtYXhfc2Nhbl9zc2lkczogbWF4aW11bSBudW1iZXIgb2YgU1NJRHMgdGhlIGRldmljZSBjYW4gc2NhbiBmb3IgaW4KICAqCWFueSBnaXZlbiBzY2FuCisgKiBAbWF4X3NjaGVkX3NjYW5fc3NpZHM6IG1heGltdW0gbnVtYmVyIG9mIFNTSURzIHRoZSBkZXZpY2UgY2FuIHNjYW4KKyAqCWZvciBpbiBhbnkgZ2l2ZW4gc2NoZWR1bGVkIHNjYW4KICAqIEBtYXhfc2Nhbl9pZV9sZW46IG1heGltdW0gbGVuZ3RoIG9mIHVzZXItY29udHJvbGxlZCBJRXMgZGV2aWNlIGNhbgogICoJYWRkIHRvIHByb2JlIHJlcXVlc3QgZnJhbWVzIHRyYW5zbWl0dGVkIGR1cmluZyBhIHNjYW4sIG11c3Qgbm90CiAgKglpbmNsdWRlIGZpeGVkIElFcyBsaWtlIHN1cHBvcnRlZCByYXRlcworICogQG1heF9zY2hlZF9zY2FuX2llX2xlbjogc2FtZSBhcyBtYXhfc2Nhbl9pZV9sZW4sIGJ1dCBmb3Igc2NoZWR1bGVkCisgKglzY2FucwogICogQGNvdmVyYWdlX2NsYXNzOiBjdXJyZW50IGNvdmVyYWdlIGNsYXNzCiAgKiBAZndfdmVyc2lvbjogZmlybXdhcmUgdmVyc2lvbiBmb3IgZXRodG9vbCByZXBvcnRpbmcKICAqIEBod192ZXJzaW9uOiBoYXJkd2FyZSB2ZXJzaW9uIGZvciBldGh0b29sIHJlcG9ydGluZwpAQCAtMTc3MCw3ICsxODE5LDkgQEAKIAogCWludCBic3NfcHJpdl9zaXplOwogCXU4IG1heF9zY2FuX3NzaWRzOworCXU4IG1heF9zY2hlZF9zY2FuX3NzaWRzOwogCXUxNiBtYXhfc2Nhbl9pZV9sZW47CisJdTE2IG1heF9zY2hlZF9zY2FuX2llX2xlbjsKIAogCWludCBuX2NpcGhlcl9zdWl0ZXM7CiAJY29uc3QgdTMyICpjaXBoZXJfc3VpdGVzOwpAQCAtMjY4OCw3ICsyNzM5LDcgQEAKICAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlCiAgKiBAYWRkcjogVGhlIHNvdXJjZSBNQUMgYWRkcmVzcyBvZiB0aGUgZnJhbWUKICAqIEBrZXlfdHlwZTogVGhlIGtleSB0eXBlIHRoYXQgdGhlIHJlY2VpdmVkIGZyYW1lIHVzZWQKLSAqIEBrZXlfaWQ6IEtleSBpZGVudGlmaWVyICgwLi4zKQorICogQGtleV9pZDogS2V5IGlkZW50aWZpZXIgKDAuLjMpLiBDYW4gYmUgLTEgaWYgbWlzc2luZy4KICAqIEB0c2M6IFRoZSBUU0MgdmFsdWUgb2YgdGhlIGZyYW1lIHRoYXQgZ2VuZXJhdGVkIHRoZSBNSUMgZmFpbHVyZSAoNiBvY3RldHMpCiAgKiBAZ2ZwOiBhbGxvY2F0aW9uIGZsYWdzCiAgKgpAQCAtMjg0OSw4ICsyOTAwLDEwIEBACiB2b2lkIGNmZzgwMjExX3Rlc3Rtb2RlX2V2ZW50KHN0cnVjdCBza19idWZmICpza2IsIGdmcF90IGdmcCk7CiAKICNkZWZpbmUgQ0ZHODAyMTFfVEVTVE1PREVfQ01EKGNtZCkJLnRlc3Rtb2RlX2NtZCA9IChjbWQpLAorI2RlZmluZSBDRkc4MDIxMV9URVNUTU9ERV9EVU1QKGNtZCkJLnRlc3Rtb2RlX2R1bXAgPSAoY21kKSwKICNlbHNlCiAjZGVmaW5lIENGRzgwMjExX1RFU1RNT0RFX0NNRChjbWQpCisjZGVmaW5lIENGRzgwMjExX1RFU1RNT0RFX0RVTVAoY21kKQogI2VuZGlmCiAKIC8qKgpAQCAtMzAyMiw2ICszMDc1LDE2IEBACiB2b2lkIGNmZzgwMjExX2NxbV9wa3Rsb3NzX25vdGlmeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSBjb25zdCB1OCAqcGVlciwgdTMyIG51bV9wYWNrZXRzLCBnZnBfdCBnZnApOwogCisvKioKKyAqIGNmZzgwMjExX2d0a19yZWtleV9ub3RpZnkgLSBub3RpZnkgdXNlcnNwYWNlIGFib3V0IGRyaXZlciByZWtleWluZworICogQGRldjogbmV0d29yayBkZXZpY2UKKyAqIEBic3NpZDogQlNTSUQgb2YgQVAgKHRvIGF2b2lkIHJhY2VzKQorICogQHJlcGxheV9jdHI6IG5ldyByZXBsYXkgY291bnRlcgorICogQGdmcDogYWxsb2NhdGlvbiBmbGFncworICovCit2b2lkIGNmZzgwMjExX2d0a19yZWtleV9ub3RpZnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKmJzc2lkLAorCQkJICAgICAgIGNvbnN0IHU4ICpyZXBsYXlfY3RyLCBnZnBfdCBnZnApOworCiAvKiBMb2dnaW5nLCBkZWJ1Z2dpbmcgYW5kIHRyb3VibGVzaG9vdGluZy9kaWFnbm9zdGljIGhlbHBlcnMuICovCiAKIC8qIHdpcGh5X3ByaW50ayBoZWxwZXJzLCBzaW1pbGFyIHRvIGRldl9wcmludGsgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RjYm5sLmggYi9pbmNsdWRlL25ldC9kY2JubC5oCmluZGV4IGU1OTgzYzkuLmY1YWEzOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RjYm5sLmgKKysrIGIvaW5jbHVkZS9uZXQvZGNibmwuaApAQCAtMjgsOCArMjgsMTYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICBsaXN0OwogfTsKIAotdTggZGNiX3NldGFwcChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZGNiX2FwcCAqKTsKK2ludCBkY2Jfc2V0YXBwKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBkY2JfYXBwICopOwogdTggZGNiX2dldGFwcChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZGNiX2FwcCAqKTsKK2ludCBkY2JfaWVlZV9zZXRhcHAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGRjYl9hcHAgKik7CitpbnQgZGNiX2llZWVfZGVsYXBwKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBkY2JfYXBwICopOwordTggZGNiX2llZWVfZ2V0YXBwX21hc2soc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGRjYl9hcHAgKik7CisKK2ludCBkY2JubF9pZWVlX25vdGlmeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZXZlbnQsIGludCBjbWQsCisJCSAgICAgIHUzMiBzZXEsIHUzMiBwaWQpOworaW50IGRjYm5sX2NlZV9ub3RpZnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGV2ZW50LCBpbnQgY21kLAorCQkgICAgIHUzMiBzZXEsIHUzMiBwaWQpOwogCiAvKgogICogT3BzIHN0cnVjdCBmb3IgdGhlIG5ldGxpbmsgY2FsbGJhY2tzLiAgVXNlZCBieSBEQ0ItZW5hYmxlZCBkcml2ZXJzIHRocm91Z2gKQEAgLTQzLDYgKzUxLDcgQEAKIAlpbnQgKCppZWVlX3NldHBmYykgKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZWVlX3BmYyAqKTsKIAlpbnQgKCppZWVlX2dldGFwcCkgKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBkY2JfYXBwICopOwogCWludCAoKmllZWVfc2V0YXBwKSAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGRjYl9hcHAgKik7CisJaW50ICgqaWVlZV9kZWxhcHApIChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZGNiX2FwcCAqKTsKIAlpbnQgKCppZWVlX3BlZXJfZ2V0ZXRzKSAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGllZWVfZXRzICopOwogCWludCAoKmllZWVfcGVlcl9nZXRwZmMpIChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWVlZV9wZmMgKik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RzdC5oIGIvaW5jbHVkZS9uZXQvZHN0LmgKaW5kZXggN2QxNWQyMy4uMjllMjU1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZHN0LmgKKysrIGIvaW5jbHVkZS9uZXQvZHN0LmgKQEAgLTM3LDggKzM3LDcgQEAKIAl1bnNpZ25lZCBsb25nCQlfbWV0cmljczsKIAl1bnNpZ25lZCBsb25nCQlleHBpcmVzOwogCXN0cnVjdCBkc3RfZW50cnkJKnBhdGg7Ci0Jc3RydWN0IG5laWdoYm91cgkqbmVpZ2hib3VyOwotCXN0cnVjdCBoaF9jYWNoZQkJKmhoOworCXN0cnVjdCBuZWlnaGJvdXIJKl9uZWlnaGJvdXI7CiAjaWZkZWYgQ09ORklHX1hGUk0KIAlzdHJ1Y3QgeGZybV9zdGF0ZQkqeGZybTsKICNlbHNlCkBAIC00Nyw2ICs0NiwxNCBAQAogCWludAkJCSgqaW5wdXQpKHN0cnVjdCBza19idWZmKik7CiAJaW50CQkJKCpvdXRwdXQpKHN0cnVjdCBza19idWZmKik7CiAKKwlpbnQJCQlmbGFnczsKKyNkZWZpbmUgRFNUX0hPU1QJCTB4MDAwMQorI2RlZmluZSBEU1RfTk9YRlJNCQkweDAwMDIKKyNkZWZpbmUgRFNUX05PUE9MSUNZCQkweDAwMDQKKyNkZWZpbmUgRFNUX05PSEFTSAkJMHgwMDA4CisjZGVmaW5lIERTVF9OT0NBQ0hFCQkweDAwMTAKKyNkZWZpbmUgRFNUX05PQ09VTlQJCTB4MDAyMAorCiAJc2hvcnQJCQllcnJvcjsKIAlzaG9ydAkJCW9ic29sZXRlOwogCXVuc2lnbmVkIHNob3J0CQloZWFkZXJfbGVuOwkvKiBtb3JlIHNwYWNlIGF0IGhlYWQgcmVxdWlyZWQgKi8KQEAgLTYyLDcgKzY5LDcgQEAKIAkgKiAoTDFfQ0FDSEVfU0laRSB3b3VsZCBiZSB0b28gbXVjaCkKIAkgKi8KICNpZmRlZiBDT05GSUdfNjRCSVQKLQlsb25nCQkJX19wYWRfdG9fYWxpZ25fcmVmY250WzFdOworCWxvbmcJCQlfX3BhZF90b19hbGlnbl9yZWZjbnRbMl07CiAjZW5kaWYKIAkvKgogCSAqIF9fcmVmY250IHdhbnRzIHRvIGJlIG9uIGEgZGlmZmVyZW50IGNhY2hlIGxpbmUgZnJvbQpAQCAtNzEsMTIgKzc4LDYgQEAKIAlhdG9taWNfdAkJX19yZWZjbnQ7CS8qIGNsaWVudCByZWZlcmVuY2VzCSovCiAJaW50CQkJX191c2U7CiAJdW5zaWduZWQgbG9uZwkJbGFzdHVzZTsKLQlpbnQJCQlmbGFnczsKLSNkZWZpbmUgRFNUX0hPU1QJCTB4MDAwMQotI2RlZmluZSBEU1RfTk9YRlJNCQkweDAwMDIKLSNkZWZpbmUgRFNUX05PUE9MSUNZCQkweDAwMDQKLSNkZWZpbmUgRFNUX05PSEFTSAkJMHgwMDA4Ci0jZGVmaW5lIERTVF9OT0NBQ0hFCQkweDAwMTAKIAl1bmlvbiB7CiAJCXN0cnVjdCBkc3RfZW50cnkJKm5leHQ7CiAJCXN0cnVjdCBydGFibGUgX19yY3UJKnJ0X25leHQ7CkBAIC04NSw2ICs4NiwxNiBAQAogCX07CiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZWlnaGJvdXIgKmRzdF9nZXRfbmVpZ2hib3VyKHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlyZXR1cm4gZHN0LT5fbmVpZ2hib3VyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHN0X3NldF9uZWlnaGJvdXIoc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKK3sKKwlkc3QtPl9uZWlnaGJvdXIgPSBuZWlnaDsKK30KKwogZXh0ZXJuIHUzMiAqZHN0X2Nvd19tZXRyaWNzX2dlbmVyaWMoc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1bnNpZ25lZCBsb25nIG9sZCk7CiBleHRlcm4gY29uc3QgdTMyIGRzdF9kZWZhdWx0X21ldHJpY3NbUlRBWF9NQVhdOwogCkBAIC0zNzAsOCArMzgxLDE1IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkc3RfY29uZmlybShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCiB7Ci0JaWYgKGRzdCkKLQkJbmVpZ2hfY29uZmlybShkc3QtPm5laWdoYm91cik7CisJaWYgKGRzdCkgeworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwkJbmVpZ2hfY29uZmlybShuKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5laWdoYm91ciAqZHN0X25laWdoX2xvb2t1cChjb25zdCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIGNvbnN0IHZvaWQgKmRhZGRyKQoreworCXJldHVybiBkc3QtPm9wcy0+bmVpZ2hfbG9va3VwKGRzdCwgZGFkZHIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHN0X2xpbmtfZmFpbHVyZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZHN0X29wcy5oIGIvaW5jbHVkZS9uZXQvZHN0X29wcy5oCmluZGV4IGRjMDc0NjMuLjlhZGI5OTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RzdF9vcHMuaAorKysgYi9pbmNsdWRlL25ldC9kc3Rfb3BzLmgKQEAgLTI2LDYgKzI2LDcgQEAKIAl2b2lkCQkJKCpsaW5rX2ZhaWx1cmUpKHN0cnVjdCBza19idWZmICopOwogCXZvaWQJCQkoKnVwZGF0ZV9wbXR1KShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBtdHUpOwogCWludAkJCSgqbG9jYWxfb3V0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwlzdHJ1Y3QgbmVpZ2hib3VyICoJKCpuZWlnaF9sb29rdXApKGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgY29uc3Qgdm9pZCAqZGFkZHIpOwogCiAJc3RydWN0IGttZW1fY2FjaGUJKmttZW1fY2FjaGVwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9nZW5ldGxpbmsuaCBiL2luY2x1ZGUvbmV0L2dlbmV0bGluay5oCmluZGV4IGQ0MjBmMjguLjgyZDhkMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2dlbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbmV0L2dlbmV0bGluay5oCkBAIC0xNjAsNiArMTYwLDM4IEBACiB9CiAKIC8qKgorICogZ2VubG1zZ19ubGhkciAtIE9idGFpbiBuZXRsaW5rIGhlYWRlciBmcm9tIHVzZXIgc3BlY2lmaWVkIGhlYWRlcgorICogQHVzZXJfaGRyOiB1c2VyIGhlYWRlciBhcyByZXR1cm5lZCBmcm9tIGdlbmxtc2dfcHV0KCkKKyAqIEBmYW1pbHk6IGdlbmVyaWMgbmV0bGluayBmYW1pbHkKKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gbmV0bGluayBoZWFkZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5sbXNnaGRyICpnZW5sbXNnX25saGRyKHZvaWQgKnVzZXJfaGRyLAorCQkJCQkgICAgIHN0cnVjdCBnZW5sX2ZhbWlseSAqZmFtaWx5KQoreworCXJldHVybiAoc3RydWN0IG5sbXNnaGRyICopKChjaGFyICopdXNlcl9oZHIgLQorCQkJCSAgIGZhbWlseS0+aGRyc2l6ZSAtCisJCQkJICAgR0VOTF9IRFJMRU4gLQorCQkJCSAgIE5MTVNHX0hEUkxFTik7Cit9CisKKy8qKgorICogZ2VubF9kdW1wX2NoZWNrX2NvbnNpc3RlbnQgLSBjaGVjayBpZiBzZXF1ZW5jZSBpcyBjb25zaXN0ZW50IGFuZCBhZHZlcnRpc2UgaWYgbm90CisgKiBAY2I6IG5ldGxpbmsgY2FsbGJhY2sgc3RydWN0dXJlIHRoYXQgc3RvcmVzIHRoZSBzZXF1ZW5jZSBudW1iZXIKKyAqIEB1c2VyX2hkcjogdXNlciBoZWFkZXIgYXMgcmV0dXJuZWQgZnJvbSBnZW5sbXNnX3B1dCgpCisgKiBAZmFtaWx5OiBnZW5lcmljIG5ldGxpbmsgZmFtaWx5CisgKgorICogQ2YuIG5sX2R1bXBfY2hlY2tfY29uc2lzdGVudCgpLCB0aGlzIGp1c3QgcHJvdmlkZXMgYSB3cmFwcGVyIHRvIG1ha2UgaXQKKyAqIHNpbXBsZXIgdG8gdXNlIHdpdGggZ2VuZXJpYyBuZXRsaW5rLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VubF9kdW1wX2NoZWNrX2NvbnNpc3RlbnQoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkJCQkgICAgICB2b2lkICp1c2VyX2hkciwKKwkJCQkJICAgICAgc3RydWN0IGdlbmxfZmFtaWx5ICpmYW1pbHkpCit7CisJbmxfZHVtcF9jaGVja19jb25zaXN0ZW50KGNiLCBnZW5sbXNnX25saGRyKHVzZXJfaGRyLCBmYW1pbHkpKTsKK30KKworLyoqCiAgKiBnZW5sbXNnX3B1dF9yZXBseSAtIEFkZCBnZW5lcmljIG5ldGxpbmsgaGVhZGVyIHRvIGEgcmVwbHkgbWVzc2FnZQogICogQHNrYjogc29ja2V0IGJ1ZmZlciBob2xkaW5nIHRoZSBtZXNzYWdlCiAgKiBAaW5mbzogcmVjZWl2ZXIgaW5mbwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldHBlZXIuaCBiL2luY2x1ZGUvbmV0L2luZXRwZWVyLmgKaW5kZXggOGExNTljYy4uNDIzM2U2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldHBlZXIuaAorKysgYi9pbmNsdWRlL25ldC9pbmV0cGVlci5oCkBAIC0zMiwxMyArMzIsMTcgQEAKIAlzdHJ1Y3QgaW5ldF9wZWVyIF9fcmN1CSphdmxfbGVmdCwgKmF2bF9yaWdodDsKIAlzdHJ1Y3QgaW5ldHBlZXJfYWRkcglkYWRkcjsKIAlfX3UzMgkJCWF2bF9oZWlnaHQ7Ci0Jc3RydWN0IGxpc3RfaGVhZAl1bnVzZWQ7Ci0JX191MzIJCQlkdGltZTsJCS8qIHRoZSB0aW1lIG9mIGxhc3QgdXNlIG9mIG5vdAotCQkJCQkJICogcmVmZXJlbmNlZCBlbnRyaWVzICovCi0JYXRvbWljX3QJCXJlZmNudDsKKworCXUzMgkJCW1ldHJpY3NbUlRBWF9NQVhdOworCXUzMgkJCXJhdGVfdG9rZW5zOwkvKiByYXRlIGxpbWl0aW5nIGZvciBJQ01QICovCisJdW5zaWduZWQgbG9uZwkJcmF0ZV9sYXN0OworCXVuc2lnbmVkIGxvbmcJCXBtdHVfZXhwaXJlczsKKwl1MzIJCQlwbXR1X29yaWc7CisJdTMyCQkJcG10dV9sZWFybmVkOworCXN0cnVjdCBpbmV0cGVlcl9hZGRyX2Jhc2UgcmVkaXJlY3RfbGVhcm5lZDsKIAkvKgogCSAqIE9uY2UgaW5ldF9wZWVyIGlzIHF1ZXVlZCBmb3IgZGVsZXRpb24gKHJlZmNudCA9PSAtMSksIGZvbGxvd2luZyBmaWVsZHMKLQkgKiBhcmUgbm90IGF2YWlsYWJsZTogcmlkLCBpcF9pZF9jb3VudCwgdGNwX3RzLCB0Y3BfdHNfc3RhbXAsIG1ldHJpY3MKKwkgKiBhcmUgbm90IGF2YWlsYWJsZTogcmlkLCBpcF9pZF9jb3VudCwgdGNwX3RzLCB0Y3BfdHNfc3RhbXAKIAkgKiBXZSBjYW4gc2hhcmUgbWVtb3J5IHdpdGggcmN1X2hlYWQgdG8gaGVscCBrZWVwIGluZXRfcGVlciBzbWFsbC4KIAkgKi8KIAl1bmlvbiB7CkBAIC00NywxNiArNTEsMTQgQEAKIAkJCWF0b21pY190CQkJaXBfaWRfY291bnQ7CS8qIElQIElEIGZvciB0aGUgbmV4dCBwYWNrZXQgKi8KIAkJCV9fdTMyCQkJCXRjcF90czsKIAkJCV9fdTMyCQkJCXRjcF90c19zdGFtcDsKLQkJCXUzMgkJCQltZXRyaWNzW1JUQVhfTUFYXTsKLQkJCXUzMgkJCQlyYXRlX3Rva2VuczsJLyogcmF0ZSBsaW1pdGluZyBmb3IgSUNNUCAqLwotCQkJdW5zaWduZWQgbG9uZwkJCXJhdGVfbGFzdDsKLQkJCXVuc2lnbmVkIGxvbmcJCQlwbXR1X2V4cGlyZXM7Ci0JCQl1MzIJCQkJcG10dV9vcmlnOwotCQkJdTMyCQkJCXBtdHVfbGVhcm5lZDsKLQkJCXN0cnVjdCBpbmV0cGVlcl9hZGRyX2Jhc2UJcmVkaXJlY3RfbGVhcm5lZDsKIAkJfTsKIAkJc3RydWN0IHJjdV9oZWFkICAgICAgICAgcmN1OworCQlzdHJ1Y3QgaW5ldF9wZWVyCSpnY19uZXh0OwogCX07CisKKwkvKiBmb2xsb3dpbmcgZmllbGRzIG1pZ2h0IGJlIGZyZXF1ZW50bHkgZGlydGllZCAqLworCV9fdTMyCQkJZHRpbWU7CS8qIHRoZSB0aW1lIG9mIGxhc3QgdXNlIG9mIG5vdCByZWZlcmVuY2VkIGVudHJpZXMgKi8KKwlhdG9taWNfdAkJcmVmY250OwogfTsKIAogdm9pZAkJCWluZXRfaW5pdHBlZXJzKHZvaWQpIF9faW5pdDsKQEAgLTY5LDcgKzcxLDcgQEAKIH0KIAogLyogY2FuIGJlIGNhbGxlZCB3aXRoIG9yIHdpdGhvdXQgbG9jYWwgQkggYmVpbmcgZGlzYWJsZWQgKi8KLXN0cnVjdCBpbmV0X3BlZXIJKmluZXRfZ2V0cGVlcihzdHJ1Y3QgaW5ldHBlZXJfYWRkciAqZGFkZHIsIGludCBjcmVhdGUpOworc3RydWN0IGluZXRfcGVlcgkqaW5ldF9nZXRwZWVyKGNvbnN0IHN0cnVjdCBpbmV0cGVlcl9hZGRyICpkYWRkciwgaW50IGNyZWF0ZSk7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGluZXRfcGVlciAqaW5ldF9nZXRwZWVyX3Y0KF9fYmUzMiB2NGRhZGRyLCBpbnQgY3JlYXRlKQogewpAQCAtMTA0LDExICsxMDYsMTggQEAKIAogCiAvKiBjYW4gYmUgY2FsbGVkIHdpdGggb3Igd2l0aG91dCBsb2NhbCBCSCBiZWluZyBkaXNhYmxlZCAqLwotc3RhdGljIGlubGluZSBfX3UxNglpbmV0X2dldGlkKHN0cnVjdCBpbmV0X3BlZXIgKnAsIGludCBtb3JlKQorc3RhdGljIGlubGluZSBpbnQgaW5ldF9nZXRpZChzdHJ1Y3QgaW5ldF9wZWVyICpwLCBpbnQgbW9yZSkKIHsKKwlpbnQgb2xkLCBuZXc7CiAJbW9yZSsrOwogCWluZXRfcGVlcl9yZWZjaGVjayhwKTsKLQlyZXR1cm4gYXRvbWljX2FkZF9yZXR1cm4obW9yZSwgJnAtPmlwX2lkX2NvdW50KSAtIG1vcmU7CisJZG8geworCQlvbGQgPSBhdG9taWNfcmVhZCgmcC0+aXBfaWRfY291bnQpOworCQluZXcgPSBvbGQgKyBtb3JlOworCQlpZiAoIW5ldykKKwkJCW5ldyA9IDE7CisJfSB3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnAtPmlwX2lkX2NvdW50LCBvbGQsIG5ldykgIT0gb2xkKTsKKwlyZXR1cm4gbmV3OwogfQogCiAjZW5kaWYgLyogX05FVF9JTkVUUEVFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcC5oIGIvaW5jbHVkZS9uZXQvaXAuaAppbmRleCA2NmRkNDkxLi5hYTc2YzdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwLmgKQEAgLTIyOCw4ICsyMjgsNiBAQAogZXh0ZXJuIGludCBpbmV0X3BlZXJfdGhyZXNob2xkOwogZXh0ZXJuIGludCBpbmV0X3BlZXJfbWludHRsOwogZXh0ZXJuIGludCBpbmV0X3BlZXJfbWF4dHRsOwotZXh0ZXJuIGludCBpbmV0X3BlZXJfZ2NfbWludGltZTsKLWV4dGVybiBpbnQgaW5ldF9wZWVyX2djX21heHRpbWU7CiAKIC8qIEZyb20gaXBfb3V0cHV0LmMgKi8KIGV4dGVybiBpbnQgc3lzY3RsX2lwX2R5bmFkZHI7CkBAIC0yMzgsNiArMjM2LDExIEBACiAKIGV4dGVybiB2b2lkIGlwX3N0YXRpY19zeXNjdGxfaW5pdCh2b2lkKTsKIAorc3RhdGljIGlubGluZSBib29sIGlwX2lzX2ZyYWdtZW50KGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoKQoreworCXJldHVybiAoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkgIT0gMDsKK30KKwogI2lmZGVmIENPTkZJR19JTkVUCiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogCkBAIC00MDEsNyArNDA0LDggQEAKIAlfX0lQX0RFRlJBR19DT05OVFJBQ0tfQlJJREdFX0lOID0gSVBfREVGUkFHX0NPTk5UUkFDS19CUklER0VfSU4gKyBVU0hSVF9NQVgsCiAJSVBfREVGUkFHX1ZTX0lOLAogCUlQX0RFRlJBR19WU19PVVQsCi0JSVBfREVGUkFHX1ZTX0ZXRAorCUlQX0RFRlJBR19WU19GV0QsCisJSVBfREVGUkFHX0FGX1BBQ0tFVCwKIH07CiAKIGludCBpcF9kZWZyYWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHVzZXIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXA2X2ZpYi5oIGIvaW5jbHVkZS9uZXQvaXA2X2ZpYi5oCmluZGV4IDQ3N2VmNzUuLjU3MzVhMGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwNl9maWIuaAorKysgYi9pbmNsdWRlL25ldC9pcDZfZmliLmgKQEAgLTg3LDcgKzg3LDYgQEAKIAlzdHJ1Y3QgZHN0X2VudHJ5CQlkc3Q7CiAKICNkZWZpbmUgcnQ2aV9kZXYJCQlkc3QuZGV2Ci0jZGVmaW5lIHJ0NmlfbmV4dGhvcAkJCWRzdC5uZWlnaGJvdXIKICNkZWZpbmUgcnQ2aV9leHBpcmVzCQkJZHN0LmV4cGlyZXMKIAogCS8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF92cy5oIGIvaW5jbHVkZS9uZXQvaXBfdnMuaAppbmRleCA0ODFmODU2Li5iMTM3MGM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcF92cy5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX3ZzLmgKQEAgLTgzNiw4ICs4MzYsNiBAQAogCWludAkJCW51bV9zZXJ2aWNlczsgICAgLyogbm8gb2YgdmlydHVhbCBzZXJ2aWNlcyAqLwogCiAJcndsb2NrX3QJCXJzX2xvY2s7ICAgICAgICAgLyogcmVhbCBzZXJ2aWNlcyB0YWJsZSAqLwotCS8qIHNlbWFwaG9yZSBmb3IgSVBWUyBzb2Nrb3B0cy4gQW5kLCBbZ3NdZXRzb2Nrb3B0IG1heSBzbGVlcC4gKi8KLQlzdHJ1Y3QgbG9ja19jbGFzc19rZXkJY3RsX2tleTsJLyogY3RsX211dGV4IGRlYnVnaW5nICovCiAJLyogVHJhc2ggZm9yIGRlc3RpbmF0aW9ucyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJZGVzdF90cmFzaDsKIAkvKiBTZXJ2aWNlIGNvdW50ZXJzICovCkBAIC0xMDg5LDE5ICsxMDg3LDE5IEBACiAvKgogICogSVBWUyBuZXRucyBpbml0ICYgY2xlYW51cCBmdW5jdGlvbnMKICAqLwotZXh0ZXJuIGludCBfX2lwX3ZzX2VzdGltYXRvcl9pbml0KHN0cnVjdCBuZXQgKm5ldCk7Ci1leHRlcm4gaW50IF9faXBfdnNfY29udHJvbF9pbml0KHN0cnVjdCBuZXQgKm5ldCk7Ci1leHRlcm4gaW50IF9faXBfdnNfcHJvdG9jb2xfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpOwotZXh0ZXJuIGludCBfX2lwX3ZzX2FwcF9pbml0KHN0cnVjdCBuZXQgKm5ldCk7Ci1leHRlcm4gaW50IF9faXBfdnNfY29ubl9pbml0KHN0cnVjdCBuZXQgKm5ldCk7Ci1leHRlcm4gaW50IF9faXBfdnNfc3luY19pbml0KHN0cnVjdCBuZXQgKm5ldCk7Ci1leHRlcm4gdm9pZCBfX2lwX3ZzX2Nvbm5fY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpOwotZXh0ZXJuIHZvaWQgX19pcF92c19hcHBfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpOwotZXh0ZXJuIHZvaWQgX19pcF92c19wcm90b2NvbF9jbGVhbnVwKHN0cnVjdCBuZXQgKm5ldCk7Ci1leHRlcm4gdm9pZCBfX2lwX3ZzX2NvbnRyb2xfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpOwotZXh0ZXJuIHZvaWQgX19pcF92c19lc3RpbWF0b3JfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpOwotZXh0ZXJuIHZvaWQgX19pcF92c19zeW5jX2NsZWFudXAoc3RydWN0IG5ldCAqbmV0KTsKLWV4dGVybiB2b2lkIF9faXBfdnNfc2VydmljZV9jbGVhbnVwKHN0cnVjdCBuZXQgKm5ldCk7CitleHRlcm4gaW50IGlwX3ZzX2VzdGltYXRvcl9uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpOworZXh0ZXJuIGludCBpcF92c19jb250cm9sX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCk7CitleHRlcm4gaW50IGlwX3ZzX3Byb3RvY29sX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCk7CitleHRlcm4gaW50IGlwX3ZzX2FwcF9uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpOworZXh0ZXJuIGludCBpcF92c19jb25uX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCk7CitleHRlcm4gaW50IGlwX3ZzX3N5bmNfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KTsKK2V4dGVybiB2b2lkIGlwX3ZzX2Nvbm5fbmV0X2NsZWFudXAoc3RydWN0IG5ldCAqbmV0KTsKK2V4dGVybiB2b2lkIGlwX3ZzX2FwcF9uZXRfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpOworZXh0ZXJuIHZvaWQgaXBfdnNfcHJvdG9jb2xfbmV0X2NsZWFudXAoc3RydWN0IG5ldCAqbmV0KTsKK2V4dGVybiB2b2lkIGlwX3ZzX2NvbnRyb2xfbmV0X2NsZWFudXAoc3RydWN0IG5ldCAqbmV0KTsKK2V4dGVybiB2b2lkIGlwX3ZzX2VzdGltYXRvcl9uZXRfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpOworZXh0ZXJuIHZvaWQgaXBfdnNfc3luY19uZXRfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpOworZXh0ZXJuIHZvaWQgaXBfdnNfc2VydmljZV9uZXRfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpOwogCiAvKgogICogICAgICBJUFZTIGFwcGxpY2F0aW9uIGZ1bmN0aW9ucwpAQCAtMTExOSw4ICsxMTE3LDYgQEAKIAogZXh0ZXJuIGludCBpcF92c19hcHBfcGt0X291dChzdHJ1Y3QgaXBfdnNfY29ubiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBpbnQgaXBfdnNfYXBwX3BrdF9pbihzdHJ1Y3QgaXBfdnNfY29ubiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBpbnQgaXBfdnNfYXBwX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBpcF92c19hcHBfY2xlYW51cCh2b2lkKTsKIAogdm9pZCBpcF92c19iaW5kX3BlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIHN0cnVjdCBpcF92c19wZSAqcGUpOwogdm9pZCBpcF92c191bmJpbmRfcGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2Yyk7CkBAIC0xMjIzLDE1ICsxMjE5LDExIEBACiAJCQkgICAgIF9fdTggc3luY2lkKTsKIGV4dGVybiBpbnQgc3RvcF9zeW5jX3RocmVhZChzdHJ1Y3QgbmV0ICpuZXQsIGludCBzdGF0ZSk7CiBleHRlcm4gdm9pZCBpcF92c19zeW5jX2Nvbm4oc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApOwotZXh0ZXJuIGludCBpcF92c19zeW5jX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBpcF92c19zeW5jX2NsZWFudXAodm9pZCk7CiAKIAogLyoKICAqICAgICAgSVBWUyByYXRlIGVzdGltYXRvciBwcm90b3R5cGVzIChmcm9tIGlwX3ZzX2VzdC5jKQogICovCi1leHRlcm4gaW50IGlwX3ZzX2VzdGltYXRvcl9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgaXBfdnNfZXN0aW1hdG9yX2NsZWFudXAodm9pZCk7CiBleHRlcm4gdm9pZCBpcF92c19zdGFydF9lc3RpbWF0b3Ioc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgaXBfdnNfc3RhdHMgKnN0YXRzKTsKIGV4dGVybiB2b2lkIGlwX3ZzX3N0b3BfZXN0aW1hdG9yKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGlwX3ZzX3N0YXRzICpzdGF0cyk7CiBleHRlcm4gdm9pZCBpcF92c196ZXJvX2VzdGltYXRvcihzdHJ1Y3QgaXBfdnNfc3RhdHMgKnN0YXRzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwdjYuaCBiL2luY2x1ZGUvbmV0L2lwdjYuaAppbmRleCBjMDMzZWQwLi4zYjVhYzFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcHY2LmgKKysrIGIvaW5jbHVkZS9uZXQvaXB2Ni5oCkBAIC00NjMsMTcgKzQ2Myw3IEBACiAJcmV0dXJuIF9faXB2Nl9hZGRyX2RpZmYoYTEsIGEyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgaXB2Nl9zZWxlY3RfaWRlbnQoc3RydWN0IGZyYWdfaGRyICpmaGRyKQotewotCXN0YXRpYyB1MzIgaXB2Nl9mcmFnbWVudGF0aW9uX2lkID0gMTsKLQlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlwNl9pZF9sb2NrKTsKLQotCXNwaW5fbG9ja19iaCgmaXA2X2lkX2xvY2spOwotCWZoZHItPmlkZW50aWZpY2F0aW9uID0gaHRvbmwoaXB2Nl9mcmFnbWVudGF0aW9uX2lkKTsKLQlpZiAoKytpcHY2X2ZyYWdtZW50YXRpb25faWQgPT0gMCkKLQkJaXB2Nl9mcmFnbWVudGF0aW9uX2lkID0gMTsKLQlzcGluX3VubG9ja19iaCgmaXA2X2lkX2xvY2spOwotfQorZXh0ZXJuIHZvaWQgaXB2Nl9zZWxlY3RfaWRlbnQoc3RydWN0IGZyYWdfaGRyICpmaGRyLCBzdHJ1Y3QgcnQ2X2luZm8gKnJ0KTsKIAogLyoKICAqCVByb3RvdHlwZXMgZXhwb3J0ZWQgYnkgaXB2NgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBiL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKaW5kZXggZTZkNmE2Ni4uOTI1OWU5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbWFjODAyMTEuaAorKysgYi9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAvKioKICAqIERPQzogSW50cm9kdWN0aW9uCkBAIC0xOTMsNiArMTk0LDE3IEBACiAjZGVmaW5lIElFRUU4MDIxMV9CU1NfQVJQX0FERFJfTElTVF9MRU4gNAogCiAvKioKKyAqIGVudW0gaWVlZTgwMjExX3Jzc2lfZXZlbnQgLSBSU1NJIHRocmVzaG9sZCBldmVudAorICogQW4gaW5kaWNhdG9yIGZvciB3aGVuIFJTU0kgZ29lcyBiZWxvdy9hYm92ZSBhIGNlcnRhaW4gdGhyZXNob2xkLgorICogQFJTU0lfRVZFTlRfSElHSDogQVAncyByc3NpIGNyb3NzZWQgdGhlIGhpZ2ggdGhyZXNob2xkIHNldCBieSB0aGUgZHJpdmVyLgorICogQFJTU0lfRVZFTlRfTE9XOiBBUCdzIHJzc2kgY3Jvc3NlZCB0aGUgbG93IHRocmVzaG9sZCBzZXQgYnkgdGhlIGRyaXZlci4KKyAqLworZW51bSBpZWVlODAyMTFfcnNzaV9ldmVudCB7CisJUlNTSV9FVkVOVF9ISUdILAorCVJTU0lfRVZFTlRfTE9XLAorfTsKKworLyoqCiAgKiBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mIC0gaG9sZHMgdGhlIEJTUydzIGNoYW5naW5nIHBhcmFtZXRlcnMKICAqCiAgKiBUaGlzIHN0cnVjdHVyZSBrZWVwcyBpbmZvcm1hdGlvbiBhYm91dCBhIEJTUyAoYW5kIGFuIGFzc29jaWF0aW9uCkBAIC05MzMsNiArOTQ1LDcgQEAKICAqIEBhaWQ6IEFJRCB3ZSBhc3NpZ25lZCB0byB0aGUgc3RhdGlvbiBpZiB3ZSdyZSBhbiBBUAogICogQHN1cHBfcmF0ZXM6IEJpdG1hcCBvZiBzdXBwb3J0ZWQgcmF0ZXMgKHBlciBiYW5kKQogICogQGh0X2NhcDogSFQgY2FwYWJpbGl0aWVzIG9mIHRoaXMgU1RBOyByZXN0cmljdGVkIHRvIG91ciBvd24gVFggY2FwYWJpbGl0aWVzCisgKiBAd21lOiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgU1RBIHN1cHBvcnRzIFdNRS4gT25seSB2YWxpZCBkdXJpbmcgQVAtbW9kZS4KICAqIEBkcnZfcHJpdjogZGF0YSBhcmVhIGZvciBkcml2ZXIgdXNlLCB3aWxsIGFsd2F5cyBiZSBhbGlnbmVkIHRvCiAgKglzaXplb2Yodm9pZCAqKSwgc2l6ZSBpcyBkZXRlcm1pbmVkIGluIGh3IGluZm9ybWF0aW9uLgogICovCkBAIC05NDEsNiArOTU0LDcgQEAKIAl1OCBhZGRyW0VUSF9BTEVOXTsKIAl1MTYgYWlkOwogCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCBodF9jYXA7CisJYm9vbCB3bWU7CiAKIAkvKiBtdXN0IGJlIGxhc3QgKi8KIAl1OCBkcnZfcHJpdlswXSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhzaXplb2Yodm9pZCAqKSkpKTsKQEAgLTk2MCwyMSArOTc0LDYgQEAKIH07CiAKIC8qKgotICogZW51bSBpZWVlODAyMTFfdGtpcF9rZXlfdHlwZSAtIGdldCB0a2lwIGtleQotICoKLSAqIFVzZWQgYnkgZHJpdmVycyB3aGljaCBuZWVkIHRvIGdldCBhIHRraXAga2V5IGZvciBza2IuIFNvbWUgZHJpdmVycyBuZWVkIGEKLSAqIHBoYXNlIDEga2V5LCBvdGhlcnMgbmVlZCBhIHBoYXNlIDIga2V5LiBBIHNpbmdsZSBmdW5jdGlvbiBhbGxvd3MgdGhlIGRyaXZlcgotICogdG8gZ2V0IHRoZSBrZXksIHRoaXMgZW51bSBpbmRpY2F0ZXMgd2hhdCB0eXBlIG9mIGtleSBpcyByZXF1aXJlZC4KLSAqCi0gKiBASUVFRTgwMjExX1RLSVBfUDFfS0VZOiB0aGUgZHJpdmVyIG5lZWRzIGEgcGhhc2UgMSBrZXkKLSAqIEBJRUVFODAyMTFfVEtJUF9QMl9LRVk6IHRoZSBkcml2ZXIgbmVlZHMgYSBwaGFzZSAyIGtleQotICovCi1lbnVtIGllZWU4MDIxMV90a2lwX2tleV90eXBlIHsKLQlJRUVFODAyMTFfVEtJUF9QMV9LRVksCi0JSUVFRTgwMjExX1RLSVBfUDJfS0VZLAotfTsKLQotLyoqCiAgKiBlbnVtIGllZWU4MDIxMV9od19mbGFncyAtIGhhcmR3YXJlIGZsYWdzCiAgKgogICogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgdG8gaW5kaWNhdGUgaGFyZHdhcmUgY2FwYWJpbGl0aWVzIHRvCkBAIC0xNTg3LDYgKzE1ODYsMjAgQEAKIH07CiAKIC8qKgorICogZW51bSBpZWVlODAyMTFfdHhfc3luY190eXBlIC0gVFggc3luYyB0eXBlCisgKiBASUVFRTgwMjExX1RYX1NZTkNfQVVUSDogc3luYyBUWCBmb3IgYXV0aGVudGljYXRpb24KKyAqCShhbmQgcG9zc2libHkgYWxzbyBiZWZvcmUgZGlyZWN0IHByb2JlKQorICogQElFRUU4MDIxMV9UWF9TWU5DX0FTU09DOiBzeW5jIFRYIGZvciBhc3NvY2lhdGlvbgorICogQElFRUU4MDIxMV9UWF9TWU5DX0FDVElPTjogc3luYyBUWCBmb3IgYWN0aW9uIGZyYW1lCisgKgkobm90IGltcGxlbWVudGVkIHlldCkKKyAqLworZW51bSBpZWVlODAyMTFfdHhfc3luY190eXBlIHsKKwlJRUVFODAyMTFfVFhfU1lOQ19BVVRILAorCUlFRUU4MDIxMV9UWF9TWU5DX0FTU09DLAorCUlFRUU4MDIxMV9UWF9TWU5DX0FDVElPTiwKK307CisKKy8qKgogICogc3RydWN0IGllZWU4MDIxMV9vcHMgLSBjYWxsYmFja3MgZnJvbSBtYWM4MDIxMSB0byB0aGUgZHJpdmVyCiAgKgogICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdmFyaW91cyBjYWxsYmFja3MgdGhhdCB0aGUgZHJpdmVyIG1heQpAQCAtMTYyNiw2ICsxNjM5LDEwIEBACiAgKglhc2sgdGhlIGRldmljZSB0byBzdXNwZW5kLiBUaGlzIGlzIG9ubHkgaW52b2tlZCB3aGVuIFdvV0xBTiBpcwogICoJY29uZmlndXJlZCwgb3RoZXJ3aXNlIHRoZSBkZXZpY2UgaXMgZGVjb25maWd1cmVkIGNvbXBsZXRlbHkgYW5kCiAgKglyZWNvbmZpZ3VyZWQgYXQgcmVzdW1lIHRpbWUuCisgKglUaGUgZHJpdmVyIG1heSBhbHNvIGltcG9zZSBzcGVjaWFsIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggaXQKKyAqCXdhbnRzIHRvIHVzZSB0aGUgIm5vcm1hbCIgc3VzcGVuZCAoZGVjb25maWd1cmUpLCBzYXkgaWYgaXQgb25seQorICoJc3VwcG9ydHMgV29XTEFOIHdoZW4gdGhlIGRldmljZSBpcyBhc3NvY2lhdGVkLiBJbiB0aGlzIGNhc2UsIGl0CisgKgltdXN0IHJldHVybiAxIGZyb20gdGhpcyBmdW5jdGlvbi4KICAqCiAgKiBAcmVzdW1lOiBJZiBXb1dMQU4gd2FzIGNvbmZpZ3VyZWQsIHRoaXMgaW5kaWNhdGVzIHRoYXQgbWFjODAyMTEgaXMKICAqCW5vdyByZXN1bWluZyBpdHMgb3BlcmF0aW9uLCBhZnRlciB0aGlzIHRoZSBkZXZpY2UgbXVzdCBiZSBmdWxseQpAQCAtMTY3MSw2ICsxNjg4LDI2IEBACiAgKglvZiB0aGUgYnNzIHBhcmFtZXRlcnMgaGFzIGNoYW5nZWQgd2hlbiBhIGNhbGwgaXMgbWFkZS4gVGhlIGNhbGxiYWNrCiAgKgljYW4gc2xlZXAuCiAgKgorICogQHR4X3N5bmM6IENhbGxlZCBiZWZvcmUgYSBmcmFtZSBpcyBzZW50IHRvIGFuIEFQL0dPLiBJbiB0aGUgR08gY2FzZSwgdGhlCisgKglkcml2ZXIgc2hvdWxkIHN5bmMgd2l0aCB0aGUgR08ncyBwb3dlcnNhdmluZyBzbyB0aGUgZGV2aWNlIGRvZXNuJ3QKKyAqCXRyYW5zbWl0IHRoZSBmcmFtZSB3aGlsZSB0aGUgR08gaXMgYXNsZWVwLiBJbiB0aGUgcmVndWxhciBBUCBjYXNlCisgKglpdCBtYXkgYmUgdXNlZCBieSBkcml2ZXJzIGZvciBkZXZpY2VzIGltcGxlbWVudGluZyBvdGhlciByZXN0cmljdGlvbnMKKyAqCW9uIHRhbGtpbmcgdG8gQVBzLCBlLmcuIGR1ZSB0byByZWd1bGF0b3J5IGVuZm9yY2VtZW50IG9yIGp1c3QgSFcKKyAqCXJlc3RyaWN0aW9ucy4KKyAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBldmVyeSBhdXRoZW50aWNhdGlvbiwgYXNzb2NpYXRpb24gYW5kCisgKglhY3Rpb24gZnJhbWUgc2VwYXJhdGVseSBzaW5jZSBhcHBsaWNhdGlvbnMgbWlnaHQgYXR0ZW1wdCB0byBhdXRoCisgKgl3aXRoIG11bHRpcGxlIEFQcyBiZWZvcmUgY2hvc2luZyBvbmUgdG8gYXNzb2NpYXRlIHRvLiBJZiBpdCByZXR1cm5zCisgKglhbiBlcnJvciwgdGhlIGNvcnJlc3BvbmRpbmcgYXV0aGVudGljYXRpb24sIGFzc29jaWF0aW9uIG9yIGZyYW1lCisgKgl0cmFuc21pc3Npb24gaXMgYWJvcnRlZCBhbmQgcmVwb3J0ZWQgYXMgaGF2aW5nIGZhaWxlZC4gSXQgaXMgYWx3YXlzCisgKgljYWxsZWQgYWZ0ZXIgdHVuaW5nIHRvIHRoZSBjb3JyZWN0IGNoYW5uZWwuCisgKglUaGUgY2FsbGJhY2sgbWlnaHQgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGJlZm9yZSBAZmluaXNoX3R4X3N5bmMKKyAqCShidXQgQGZpbmlzaF90eF9zeW5jIHdpbGwgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2gpIGJ1dCBpbiBwcmFjdGljZQorICoJdGhpcyBpcyB1bmxpa2VseSB0byBoYXBwZW4uIEl0IGNhbiBhbHNvIHJlZnVzZSBpbiB0aGF0IGNhc2UgaWYgdGhlCisgKglkcml2ZXIgY2Fubm90IGhhbmRsZSB0aGF0IHNpdHVhdGlvbi4KKyAqCVRoaXMgY2FsbGJhY2sgY2FuIHNsZWVwLgorICogQGZpbmlzaF90eF9zeW5jOiBDYWxsZWQgYXMgYSBjb3VudGVycGFydCB0byBAdHhfc3luYywgdW5sZXNzIHRoYXQgcmV0dXJuZWQKKyAqCWFuIGVycm9yLiBUaGlzIGNhbGxiYWNrIGNhbiBzbGVlcC4KKyAqCiAgKiBAcHJlcGFyZV9tdWx0aWNhc3Q6IFByZXBhcmUgZm9yIG11bHRpY2FzdCBmaWx0ZXIgY29uZmlndXJhdGlvbi4KICAqCVRoaXMgY2FsbGJhY2sgaXMgb3B0aW9uYWwsIGFuZCBpdHMgcmV0dXJuIHZhbHVlIGlzIHBhc3NlZAogICoJdG8gY29uZmlndXJlX2ZpbHRlcigpLiBUaGlzIGNhbGxiYWNrIG11c3QgYmUgYXRvbWljLgpAQCAtMTY5NCw2ICsxNzMxLDEyIEBACiAgKiAJd2hpY2ggc2V0IElFRUU4MDIxMV9LRVlfRkxBR19US0lQX1JFUV9SWF9QMV9LRVkuCiAgKglUaGUgY2FsbGJhY2sgbXVzdCBiZSBhdG9taWMuCiAgKgorICogQHNldF9yZWtleV9kYXRhOiBJZiB0aGUgZGV2aWNlIHN1cHBvcnRzIEdUSyByZWtleWluZywgZm9yIGV4YW1wbGUgd2hpbGUgdGhlCisgKglob3N0IGlzIHN1c3BlbmRlZCwgaXQgY2FuIGFzc2lnbiB0aGlzIGNhbGxiYWNrIHRvIHJldHJpZXZlIHRoZSBkYXRhCisgKgluZWNlc3NhcnkgdG8gZG8gR1RLIHJla2V5aW5nLCB0aGlzIGlzIHRoZSBLRUssIEtDSyBhbmQgcmVwbGF5IGNvdW50ZXIuCisgKglBZnRlciByZWtleWluZyB3YXMgZG9uZSBpdCBzaG91bGQgKGZvciBleGFtcGxlIGR1cmluZyByZXN1bWUpIG5vdGlmeQorICoJdXNlcnNwYWNlIG9mIHRoZSBuZXcgcmVwbGF5IGNvdW50ZXIgdXNpbmcgaWVlZTgwMjExX2d0a19yZWtleV9ub3RpZnkoKS4KKyAqCiAgKiBAaHdfc2NhbjogQXNrIHRoZSBoYXJkd2FyZSB0byBzZXJ2aWNlIHRoZSBzY2FuIHJlcXVlc3QsIG5vIG5lZWQgdG8gc3RhcnQKICAqCXRoZSBzY2FuIHN0YXRlIG1hY2hpbmUgaW4gc3RhY2suIFRoZSBzY2FuIG11c3QgaG9ub3VyIHRoZSBjaGFubmVsCiAgKgljb25maWd1cmF0aW9uIGRvbmUgYnkgdGhlIHJlZ3VsYXRvcnkgYWdlbnQgaW4gdGhlIHdpcGh5J3MKQEAgLTE3MDgsNiArMTc1MSwxNCBAQAogICoJYW55IGVycm9yIHVubGVzcyB0aGlzIGNhbGxiYWNrIHJldHVybmVkIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KICAqCVRoZSBjYWxsYmFjayBjYW4gc2xlZXAuCiAgKgorICogQGNhbmNlbF9od19zY2FuOiBBc2sgdGhlIGxvdy1sZXZlbCB0cCBjYW5jZWwgdGhlIGFjdGl2ZSBodyBzY2FuLgorICoJVGhlIGRyaXZlciBzaG91bGQgYXNrIHRoZSBoYXJkd2FyZSB0byBjYW5jZWwgdGhlIHNjYW4gKGlmIHBvc3NpYmxlKSwKKyAqCWJ1dCB0aGUgc2NhbiB3aWxsIGJlIGNvbXBsZXRlZCBvbmx5IGFmdGVyIHRoZSBkcml2ZXIgd2lsbCBjYWxsCisgKglpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQoKS4KKyAqCVRoaXMgY2FsbGJhY2sgaXMgbmVlZGVkIGZvciB3b3dsYW4sIHRvIHByZXZlbnQgZW5xdWV1ZWluZyBhIG5ldworICoJc2Nhbl93b3JrIGFmdGVyIHRoZSBsb3ctbGV2ZWwgZHJpdmVyIHdhcyBhbHJlYWR5IHN1c3BlbmRlZC4KKyAqCVRoZSBjYWxsYmFjayBjYW4gc2xlZXAuCisgKgogICogQHNjaGVkX3NjYW5fc3RhcnQ6IEFzayB0aGUgaGFyZHdhcmUgdG8gc3RhcnQgc2Nhbm5pbmcgcmVwZWF0ZWRseSBhdAogICoJc3BlY2lmaWMgaW50ZXJ2YWxzLiAgVGhlIGRyaXZlciBtdXN0IGNhbGwgdGhlCiAgKglpZWVlODAyMTFfc2NoZWRfc2Nhbl9yZXN1bHRzKCkgZnVuY3Rpb24gd2hlbmV2ZXIgaXQgZmluZHMgcmVzdWx0cy4KQEAgLTE4MTYsNiArMTg2Nyw3IEBACiAgKgogICogQHRlc3Rtb2RlX2NtZDogSW1wbGVtZW50IGEgY2ZnODAyMTEgdGVzdCBtb2RlIGNvbW1hbmQuCiAgKglUaGUgY2FsbGJhY2sgY2FuIHNsZWVwLgorICogQHRlc3Rtb2RlX2R1bXA6IEltcGxlbWVudCBhIGNmZzgwMjExIHRlc3QgbW9kZSBkdW1wLiBUaGUgY2FsbGJhY2sgY2FuIHNsZWVwLgogICoKICAqIEBmbHVzaDogRmx1c2ggYWxsIHBlbmRpbmcgZnJhbWVzIGZyb20gdGhlIGhhcmR3YXJlIHF1ZXVlLCBtYWtpbmcgc3VyZQogICoJdGhhdCB0aGUgaGFyZHdhcmUgcXVldWVzIGFyZSBlbXB0eS4gSWYgdGhlIHBhcmFtZXRlciBAZHJvcCBpcyBzZXQKQEAgLTE4NjAsNiArMTkxMiw4IEBACiAgKiBAc2V0X2JpdHJhdGVfbWFzazogU2V0IGEgbWFzayBvZiByYXRlcyB0byBiZSB1c2VkIGZvciByYXRlIGNvbnRyb2wgc2VsZWN0aW9uCiAgKgl3aGVuIHRyYW5zbWl0dGluZyBhIGZyYW1lLiBDdXJyZW50bHkgb25seSBsZWdhY3kgcmF0ZXMgYXJlIGhhbmRsZWQuCiAgKglUaGUgY2FsbGJhY2sgY2FuIHNsZWVwLgorICogQHJzc2lfY2FsbGJhY2s6IE5vdGlmeSBkcml2ZXIgd2hlbiB0aGUgYXZlcmFnZSBSU1NJIGdvZXMgYWJvdmUvYmVsb3cKKyAqCXRocmVzaG9sZHMgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgcHJldmlvdXNseS4gVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4KICAqLwogc3RydWN0IGllZWU4MDIxMV9vcHMgewogCXZvaWQgKCp0eCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOwpAQCAtMTg4MSw2ICsxOTM1LDE0IEBACiAJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmluZm8sCiAJCQkJIHUzMiBjaGFuZ2VkKTsKKworCWludCAoKnR4X3N5bmMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICAgICAgY29uc3QgdTggKmJzc2lkLCBlbnVtIGllZWU4MDIxMV90eF9zeW5jX3R5cGUgdHlwZSk7CisJdm9pZCAoKmZpbmlzaF90eF9zeW5jKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgIGNvbnN0IHU4ICpic3NpZCwKKwkJCSAgICAgICBlbnVtIGllZWU4MDIxMV90eF9zeW5jX3R5cGUgdHlwZSk7CisKIAl1NjQgKCpwcmVwYXJlX211bHRpY2FzdCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkJIHN0cnVjdCBuZXRkZXZfaHdfYWRkcl9saXN0ICptY19saXN0KTsKIAl2b2lkICgqY29uZmlndXJlX2ZpbHRlcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0xODk3LDggKzE5NTksMTMgQEAKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICpjb25mLAogCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCiAJCQkJdTMyIGl2MzIsIHUxNiAqcGhhc2Uxa2V5KTsKKwl2b2lkICgqc2V0X3Jla2V5X2RhdGEpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICAgc3RydWN0IGNmZzgwMjExX2d0a19yZWtleV9kYXRhICpkYXRhKTsKIAlpbnQgKCpod19zY2FuKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSk7CisJdm9pZCAoKmNhbmNlbF9od19zY2FuKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKIAlpbnQgKCpzY2hlZF9zY2FuX3N0YXJ0KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJCXN0cnVjdCBjZmc4MDIxMV9zY2hlZF9zY2FuX3JlcXVlc3QgKnJlcSwKQEAgLTE5MzYsNiArMjAwMyw5IEBACiAJdm9pZCAoKnNldF9jb3ZlcmFnZV9jbGFzcykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGNvdmVyYWdlX2NsYXNzKTsKICNpZmRlZiBDT05GSUdfTkw4MDIxMV9URVNUTU9ERQogCWludCAoKnRlc3Rtb2RlX2NtZCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHZvaWQgKmRhdGEsIGludCBsZW4pOworCWludCAoKnRlc3Rtb2RlX2R1bXApKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQkgICAgIHZvaWQgKmRhdGEsIGludCBsZW4pOwogI2VuZGlmCiAJdm9pZCAoKmZsdXNoKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBkcm9wKTsKIAl2b2lkICgqY2hhbm5lbF9zd2l0Y2gpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMTk2MCw2ICsyMDMwLDggQEAKIAlib29sICgqdHhfZnJhbWVzX3BlbmRpbmcpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIAlpbnQgKCpzZXRfYml0cmF0ZV9tYXNrKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQljb25zdCBzdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrICptYXNrKTsKKwl2b2lkICgqcnNzaV9jYWxsYmFjaykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBlbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50IHJzc2lfZXZlbnQpOwogfTsKIAogLyoqCkBAIC0yNTUwLDIxICsyNjIyLDEzNiBAQAogaWVlZTgwMjExX2dldF9idWZmZXJlZF9iYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CiAKIC8qKgotICogaWVlZTgwMjExX2dldF90a2lwX2tleSAtIGdldCBhIFRLSVAgcmM0IGZvciBza2IKKyAqIGllZWU4MDIxMV9nZXRfdGtpcF9wMWtfaXYgLSBnZXQgYSBUS0lQIHBoYXNlIDEga2V5IGZvciBJVjMyCiAgKgotICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyBhIFRLSVAgcmM0IGtleSBmb3IgYW4gc2tiLiBJdCBjb21wdXRlcwotICogYSBwaGFzZSAxIGtleSBpZiBuZWVkZWQgKGl2MTYgd3JhcHMgYXJvdW5kKS4gVGhpcyBmdW5jdGlvbiBpcyB0bwotICogYmUgdXNlZCBieSBkcml2ZXJzIHdoaWNoIGNhbiBkbyBIVyBlbmNyeXB0aW9uIGJ1dCBuZWVkIHRvIGNvbXB1dGUKLSAqIHRvIHBoYXNlIDEvMiBrZXkgaW4gU1cuCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFRLSVAgcGhhc2UgMSBrZXkgZm9yIHRoZSBnaXZlbiBJVjMyLgogICoKICAqIEBrZXljb25mOiB0aGUgcGFyYW1ldGVyIHBhc3NlZCB3aXRoIHRoZSBzZXQga2V5Ci0gKiBAc2tiOiB0aGUgc2tiIGZvciB3aGljaCB0aGUga2V5IGlzIG5lZWRlZAotICogQHR5cGU6IFRCRAotICogQGtleTogYSBidWZmZXIgdG8gd2hpY2ggdGhlIGtleSB3aWxsIGJlIHdyaXR0ZW4KKyAqIEBpdjMyOiBJVjMyIHRvIGdldCB0aGUgUDFLIGZvcgorICogQHAxazogYSBidWZmZXIgdG8gd2hpY2ggdGhlIGtleSB3aWxsIGJlIHdyaXR0ZW4sIGFzIDUgdTE2IHZhbHVlcwogICovCi12b2lkIGllZWU4MDIxMV9nZXRfdGtpcF9rZXkoc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCWVudW0gaWVlZTgwMjExX3RraXBfa2V5X3R5cGUgdHlwZSwgdTggKmtleSk7Cit2b2lkIGllZWU4MDIxMV9nZXRfdGtpcF9wMWtfaXYoc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKKwkJCSAgICAgICB1MzIgaXYzMiwgdTE2ICpwMWspOworCisvKioKKyAqIGllZWU4MDIxMV9nZXRfdGtpcF9wMWsgLSBnZXQgYSBUS0lQIHBoYXNlIDEga2V5CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBUS0lQIHBoYXNlIDEga2V5IGZvciB0aGUgSVYzMiB0YWtlbgorICogZnJvbSB0aGUgZ2l2ZW4gcGFja2V0LgorICoKKyAqIEBrZXljb25mOiB0aGUgcGFyYW1ldGVyIHBhc3NlZCB3aXRoIHRoZSBzZXQga2V5CisgKiBAc2tiOiB0aGUgcGFja2V0IHRvIHRha2UgdGhlIElWMzIgdmFsdWUgZnJvbSB0aGF0IHdpbGwgYmUgZW5jcnlwdGVkCisgKgl3aXRoIHRoaXMgUDFLCisgKiBAcDFrOiBhIGJ1ZmZlciB0byB3aGljaCB0aGUga2V5IHdpbGwgYmUgd3JpdHRlbiwgYXMgNSB1MTYgdmFsdWVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfZ2V0X3RraXBfcDFrKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2ICpwMWspCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwljb25zdCB1OCAqZGF0YSA9ICh1OCAqKWhkciArIGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKKwl1MzIgaXYzMiA9IGdldF91bmFsaWduZWRfbGUzMigmZGF0YVs0XSk7CisKKwlpZWVlODAyMTFfZ2V0X3RraXBfcDFrX2l2KGtleWNvbmYsIGl2MzIsIHAxayk7Cit9CisKKy8qKgorICogaWVlZTgwMjExX2dldF90a2lwX3J4X3AxayAtIGdldCBhIFRLSVAgcGhhc2UgMSBrZXkgZm9yIFJYCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBUS0lQIHBoYXNlIDEga2V5IGZvciB0aGUgZ2l2ZW4gSVYzMgorICogYW5kIHRyYW5zbWl0dGVyIGFkZHJlc3MuCisgKgorICogQGtleWNvbmY6IHRoZSBwYXJhbWV0ZXIgcGFzc2VkIHdpdGggdGhlIHNldCBrZXkKKyAqIEB0YTogVEEgdGhhdCB3aWxsIGJlIHVzZWQgd2l0aCB0aGUga2V5CisgKiBAaXYzMjogSVYzMiB0byBnZXQgdGhlIFAxSyBmb3IKKyAqIEBwMWs6IGEgYnVmZmVyIHRvIHdoaWNoIHRoZSBrZXkgd2lsbCBiZSB3cml0dGVuLCBhcyA1IHUxNiB2YWx1ZXMKKyAqLwordm9pZCBpZWVlODAyMTFfZ2V0X3RraXBfcnhfcDFrKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCQkgICAgICAgY29uc3QgdTggKnRhLCB1MzIgaXYzMiwgdTE2ICpwMWspOworCisvKioKKyAqIGllZWU4MDIxMV9nZXRfdGtpcF9wMmsgLSBnZXQgYSBUS0lQIHBoYXNlIDIga2V5CisgKgorICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgVEtJUCBSQzQga2V5IGZvciB0aGUgSVYgdmFsdWVzCisgKiBpbiB0aGUgcGFja2V0LgorICoKKyAqIEBrZXljb25mOiB0aGUgcGFyYW1ldGVyIHBhc3NlZCB3aXRoIHRoZSBzZXQga2V5CisgKiBAc2tiOiB0aGUgcGFja2V0IHRvIHRha2UgdGhlIElWMzIvSVYxNiB2YWx1ZXMgZnJvbSB0aGF0IHdpbGwgYmUKKyAqCWVuY3J5cHRlZCB3aXRoIHRoaXMga2V5CisgKiBAcDJrOiBhIGJ1ZmZlciB0byB3aGljaCB0aGUga2V5IHdpbGwgYmUgd3JpdHRlbiwgMTYgYnl0ZXMKKyAqLwordm9pZCBpZWVlODAyMTFfZ2V0X3RraXBfcDJrKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKnAyayk7CisKKy8qKgorICogc3RydWN0IGllZWU4MDIxMV9rZXlfc2VxIC0ga2V5IHNlcXVlbmNlIGNvdW50ZXIKKyAqCisgKiBAdGtpcDogVEtJUCBkYXRhLCBjb250YWluaW5nIElWMzIgYW5kIElWMTYgaW4gaG9zdCBieXRlIG9yZGVyCisgKiBAY2NtcDogUE4gZGF0YSwgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0IChiaWcgZW5kaWFuLAorICoJcmV2ZXJzZSBvcmRlciB0aGFuIGluIHBhY2tldCkKKyAqIEBhZXNfY21hYzogUE4gZGF0YSwgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0IChiaWcgZW5kaWFuLAorICoJcmV2ZXJzZSBvcmRlciB0aGFuIGluIHBhY2tldCkKKyAqLworc3RydWN0IGllZWU4MDIxMV9rZXlfc2VxIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1MzIgaXYzMjsKKwkJCXUxNiBpdjE2OworCQl9IHRraXA7CisJCXN0cnVjdCB7CisJCQl1OCBwbls2XTsKKwkJfSBjY21wOworCQlzdHJ1Y3QgeworCQkJdTggcG5bNl07CisJCX0gYWVzX2NtYWM7CisJfTsKK307CisKKy8qKgorICogaWVlZTgwMjExX2dldF9rZXlfdHhfc2VxIC0gZ2V0IGtleSBUWCBzZXF1ZW5jZSBjb3VudGVyCisgKgorICogQGtleWNvbmY6IHRoZSBwYXJhbWV0ZXIgcGFzc2VkIHdpdGggdGhlIHNldCBrZXkKKyAqIEBzZXE6IGJ1ZmZlciB0byByZWNlaXZlIHRoZSBzZXF1ZW5jZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSBkcml2ZXIgdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgVFggSVYvUE4KKyAqIGZvciB0aGUgZ2l2ZW4ga2V5LiBJdCBtdXN0IG5vdCBiZSBjYWxsZWQgaWYgSVYgZ2VuZXJhdGlvbiBpcworICogb2ZmbG9hZGVkIHRvIHRoZSBkZXZpY2UuCisgKgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIHdoZW4gbm8gVFggcHJvY2Vzc2luZworICogY2FuIGJlIGRvbmUgY29uY3VycmVudGx5LCBmb3IgZXhhbXBsZSB3aGVuIHF1ZXVlcyBhcmUgc3RvcHBlZAorICogYW5kIHRoZSBzdG9wIGhhcyBiZWVuIHN5bmNocm9uaXplZC4KKyAqLwordm9pZCBpZWVlODAyMTFfZ2V0X2tleV90eF9zZXEoc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X3NlcSAqc2VxKTsKKworLyoqCisgKiBpZWVlODAyMTFfZ2V0X2tleV9yeF9zZXEgLSBnZXQga2V5IFJYIHNlcXVlbmNlIGNvdW50ZXIKKyAqCisgKiBAa2V5Y29uZjogdGhlIHBhcmFtZXRlciBwYXNzZWQgd2l0aCB0aGUgc2V0IGtleQorICogQHRpZDogVGhlIFRJRCwgb3IgLTEgZm9yIHRoZSBtYW5hZ2VtZW50IGZyYW1lIHZhbHVlIChDQ01QIG9ubHkpOworICoJdGhlIHZhbHVlIG9uIFRJRCAwIGlzIGFsc28gdXNlZCBmb3Igbm9uLVFvUyBmcmFtZXMuIEZvcgorICoJQ01BQywgb25seSBUSUQgMCBpcyB2YWxpZC4KKyAqIEBzZXE6IGJ1ZmZlciB0byByZWNlaXZlIHRoZSBzZXF1ZW5jZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSBkcml2ZXIgdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgUlggSVYvUE5zCisgKiBmb3IgdGhlIGdpdmVuIGtleS4gSXQgbXVzdCBub3QgYmUgY2FsbGVkIGlmIElWIGNoZWNraW5nIGlzIGRvbmUKKyAqIGJ5IHRoZSBkZXZpY2UgYW5kIG5vdCBieSBtYWM4MDIxMS4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgd2hlbiBubyBSWCBwcm9jZXNzaW5nCisgKiBjYW4gYmUgZG9uZSBjb25jdXJyZW50bHkuCisgKi8KK3ZvaWQgaWVlZTgwMjExX2dldF9rZXlfcnhfc2VxKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCQkgICAgICBpbnQgdGlkLCBzdHJ1Y3QgaWVlZTgwMjExX2tleV9zZXEgKnNlcSk7CisKKy8qKgorICogaWVlZTgwMjExX2d0a19yZWtleV9ub3RpZnkgLSBub3RpZnkgdXNlcnNwYWNlIHN1cHBsaWNhbnQgb2YgcmVrZXlpbmcKKyAqIEB2aWY6IHZpcnR1YWwgaW50ZXJmYWNlIHRoZSByZWtleWluZyB3YXMgZG9uZSBvbgorICogQGJzc2lkOiBUaGUgQlNTSUQgb2YgdGhlIEFQLCBmb3IgY2hlY2tpbmcgYXNzb2NpYXRpb24KKyAqIEByZXBsYXlfY3RyOiB0aGUgbmV3IHJlcGxheSBjb3VudGVyIGFmdGVyIEdUSyByZWtleWluZworICogQGdmcDogYWxsb2NhdGlvbiBmbGFncworICovCit2b2lkIGllZWU4MDIxMV9ndGtfcmVrZXlfbm90aWZ5KHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIGNvbnN0IHU4ICpic3NpZCwKKwkJCQljb25zdCB1OCAqcmVwbGF5X2N0ciwgZ2ZwX3QgZ2ZwKTsKKwogLyoqCiAgKiBpZWVlODAyMTFfd2FrZV9xdWV1ZSAtIHdha2Ugc3BlY2lmaWMgcXVldWUKICAqIEBodzogcG9pbnRlciBhcyBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpLgpAQCAtMjgzMCw2ICszMDE3LDMzIEBACiAJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnB1YnN0YSwgYm9vbCBibG9jayk7CiAKIC8qKgorICogaWVlZTgwMjExX2l0ZXJfa2V5cyAtIGl0ZXJhdGUga2V5cyBwcm9ncmFtbWVkIGludG8gdGhlIGRldmljZQorICogQGh3OiBwb2ludGVyIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkKKyAqIEB2aWY6IHZpcnR1YWwgaW50ZXJmYWNlIHRvIGl0ZXJhdGUsIG1heSBiZSAlTlVMTCBmb3IgYWxsCisgKiBAaXRlcjogaXRlcmF0b3IgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBrZXkKKyAqIEBpdGVyX2RhdGE6IGN1c3RvbSBkYXRhIHRvIHBhc3MgdG8gdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpdGVyYXRlIGFsbCB0aGUga2V5cyBrbm93biB0bworICogbWFjODAyMTEsIGV2ZW4gdGhvc2UgdGhhdCB3ZXJlbid0IHByZXZpb3VzbHkgcHJvZ3JhbW1lZCBpbnRvCisgKiB0aGUgZGV2aWNlLiBUaGlzIGlzIGludGVuZGVkIGZvciB1c2UgaW4gV29XTEFOIGlmIHRoZSBkZXZpY2UKKyAqIG5lZWRzIHJlcHJvZ3JhbW1pbmcgb2YgdGhlIGtleXMgZHVyaW5nIHN1c3BlbmQuIE5vdGUgdGhhdCBkdWUKKyAqIHRvIGxvY2tpbmcgcmVhc29ucywgaXQgaXMgYWxzbyBvbmx5IHNhZmUgdG8gY2FsbCB0aGlzIGF0IGZldworICogc3BvdHMgc2luY2UgaXQgbXVzdCBob2xkIHRoZSBSVE5MIGFuZCBiZSBhYmxlIHRvIHNsZWVwLgorICoKKyAqIFRoZSBvcmRlciBpbiB3aGljaCB0aGUga2V5cyBhcmUgaXRlcmF0ZWQgbWF0Y2hlcyB0aGUgb3JkZXIKKyAqIGluIHdoaWNoIHRoZXkgd2VyZSBvcmlnaW5hbGx5IGluc3RhbGxlZCBhbmQgaGFuZGVkIHRvIHRoZQorICogc2V0X2tleSBjYWxsYmFjay4KKyAqLwordm9pZCBpZWVlODAyMTFfaXRlcl9rZXlzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgdm9pZCAoKml0ZXIpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksCisJCQkJICAgICAgdm9pZCAqZGF0YSksCisJCQkgdm9pZCAqaXRlcl9kYXRhKTsKKworLyoqCiAgKiBpZWVlODAyMTFfYXBfcHJvYmVyZXFfZ2V0IC0gcmV0cmlldmUgYSBQcm9iZSBSZXF1ZXN0IHRlbXBsYXRlCiAgKiBAaHc6IHBvaW50ZXIgb2J0YWluZWQgZnJvbSBpZWVlODAyMTFfYWxsb2NfaHcoKS4KICAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2suCkBAIC0yODcwLDYgKzMwODQsMjkgQEAKIHZvaWQgaWVlZTgwMjExX2Nvbm5lY3Rpb25fbG9zcyhzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKIAogLyoqCisgKiBpZWVlODAyMTFfcmVzdW1lX2Rpc2Nvbm5lY3QgLSBkaXNjb25uZWN0IGZyb20gQVAgYWZ0ZXIgcmVzdW1lCisgKgorICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KKyAqCisgKiBJbnN0cnVjdHMgbWFjODAyMTEgdG8gZGlzY29ubmVjdCBmcm9tIHRoZSBBUCBhZnRlciByZXN1bWUuCisgKiBEcml2ZXJzIGNhbiB1c2UgdGhpcyBhZnRlciBXb1dMQU4gaWYgdGhleSBrbm93IHRoYXQgdGhlCisgKiBjb25uZWN0aW9uIGNhbm5vdCBiZSBrZXB0IHVwLCBmb3IgZXhhbXBsZSBiZWNhdXNlIGtleXMgd2VyZQorICogdXNlZCB3aGlsZSB0aGUgZGV2aWNlIHdhcyBhc2xlZXAgYnV0IHRoZSByZXBsYXkgY291bnRlcnMgb3IKKyAqIHNpbWlsYXIgY2Fubm90IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBkZXZpY2UgZHVyaW5nIHJlc3VtZS4KKyAqCisgKiBOb3RlIHRoYXQgZHVlIHRvIGltcGxlbWVudGF0aW9uIGlzc3VlcywgaWYgdGhlIGRyaXZlciB1c2VzCisgKiB0aGUgcmVjb25maWd1cmF0aW9uIGZ1bmN0aW9uYWxpdHkgZHVyaW5nIHJlc3VtZSB0aGUgaW50ZXJmYWNlCisgKiB3aWxsIHN0aWxsIGJlIGFkZGVkIGFzIGFzc29jaWF0ZWQgZmlyc3QgZHVyaW5nIHJlc3VtZSBhbmQgdGhlbgorICogZGlzY29ubmVjdCBub3JtYWxseSBsYXRlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSByZXN1bWUgY2FsbGJhY2sgYW5kCisgKiB0aGUgZHJpdmVyIG11c3Qgbm90IGJlIGhvbGRpbmcgYW55IG9mIGl0cyBvd24gbG9ja3Mgd2hpbGUgaXQKKyAqIGNhbGxzIHRoaXMgZnVuY3Rpb24sIG9yIGF0IGxlYXN0IG5vdCBhbnkgbG9ja3MgaXQgbmVlZHMgaW4gdGhlCisgKiBrZXkgY29uZmlndXJhdGlvbiBwYXRocyAoaWYgaXQgc3VwcG9ydHMgSFcgY3J5cHRvKS4KKyAqLwordm9pZCBpZWVlODAyMTFfcmVzdW1lX2Rpc2Nvbm5lY3Qoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CisKKy8qKgogICogaWVlZTgwMjExX2Rpc2FibGVfZHluX3BzIC0gZm9yY2UgbWFjODAyMTEgdG8gdGVtcG9yYXJpbHkgZGlzYWJsZSBkeW5hbWljIHBzbQogICoKICAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2suCkBAIC0yOTE2LDYgKzMxNTMsMTYgQEAKIAkJCSAgICAgICBnZnBfdCBnZnApOwogCiAvKioKKyAqIGllZWU4MDIxMV9nZXRfb3BlcnN0YXRlIC0gZ2V0IHRoZSBvcGVyc3RhdGUgb2YgdGhlIHZpZgorICoKKyAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2suCisgKgorICogVGhlIGRyaXZlciBtaWdodCBuZWVkIHRvIGtub3cgdGhlIG9wZXJzdGF0ZSBvZiB0aGUgbmV0X2RldmljZQorICogKHNwZWNpZmljYWxseSwgd2hldGhlciB0aGUgbGluayBpcyBJRl9PUEVSX1VQIGFmdGVyIHJlc3VtZSkKKyAqLwordW5zaWduZWQgY2hhciBpZWVlODAyMTFfZ2V0X29wZXJzdGF0ZShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKKworLyoqCiAgKiBpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZSAtIENvbXBsZXRlIGNoYW5uZWwgc3dpdGNoIHByb2Nlc3MKICAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2suCiAgKiBAc3VjY2VzczogbWFrZSB0aGUgY2hhbm5lbCBzd2l0Y2ggc3VjY2Vzc2Z1bCBvciBub3QKQEAgLTI5NjUsNiArMzIxMiwyMyBAQAogICovCiB2b2lkIGllZWU4MDIxMV9yZW1haW5fb25fY2hhbm5lbF9leHBpcmVkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIAorLyoqCisgKiBpZWVlODAyMTFfc3RvcF9yeF9iYV9zZXNzaW9uIC0gY2FsbGJhY2sgdG8gc3RvcCBleGlzdGluZyBCQSBzZXNzaW9ucworICoKKyAqIGluIG9yZGVyIG5vdCB0byBoYXJtIHRoZSBzeXN0ZW0gcGVyZm9ybWFuY2UgYW5kIHVzZXIgZXhwZXJpZW5jZSwgdGhlIGRldmljZQorICogbWF5IHJlcXVlc3Qgbm90IHRvIGFsbG93IGFueSByeCBiYSBzZXNzaW9uIGFuZCB0ZWFyIGRvd24gZXhpc3RpbmcgcnggYmEKKyAqIHNlc3Npb25zIGJhc2VkIG9uIHN5c3RlbSBjb25zdHJhaW50cyBzdWNoIGFzIHBlcmlvZGljIEJUIGFjdGl2aXR5IHRoYXQgbmVlZHMKKyAqIHRvIGxpbWl0IHdsYW4gYWN0aXZpdHkgKGVnLnNjbyBvciBhMmRwKS4iCisgKiBpbiBzdWNoIGNhc2VzLCB0aGUgaW50ZW50aW9uIGlzIHRvIGxpbWl0IHRoZSBkdXJhdGlvbiBvZiB0aGUgcnggcHBkdSBhbmQKKyAqIHRoZXJlZm9yZSBwcmV2ZW50IHRoZSBwZWVyIGRldmljZSB0byB1c2UgYS1tcGR1IGFnZ3JlZ2F0aW9uLgorICoKKyAqIEB2aWY6ICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZiBwb2ludGVyIGZyb20gdGhlIGFkZF9pbnRlcmZhY2UgY2FsbGJhY2suCisgKiBAYmFfcnhfYml0bWFwOiBCaXQgbWFwIG9mIG9wZW4gcnggYmEgcGVyIHRpZAorICogQGFkZHI6ICYgdG8gYnNzaWQgbWFjIGFkZHJlc3MKKyAqLwordm9pZCBpZWVlODAyMTFfc3RvcF9yeF9iYV9zZXNzaW9uKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHUxNiBiYV9yeF9iaXRtYXAsCisJCQkJICBjb25zdCB1OCAqYWRkcik7CisKIC8qIFJhdGUgY29udHJvbCBBUEkgKi8KIAogLyoqCkBAIC0zMTUwLDQgKzM0MTQsOSBAQAogCXJldHVybiBpZWVlODAyMTFfaWZ0eXBlX3AycCh2aWYtPnR5cGUsIHZpZi0+cDJwKTsKIH0KIAordm9pZCBpZWVlODAyMTFfZW5hYmxlX3Jzc2lfcmVwb3J0cyhzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgIGludCByc3NpX21pbl90aG9sZCwKKwkJCQkgICBpbnQgcnNzaV9tYXhfdGhvbGQpOworCit2b2lkIGllZWU4MDIxMV9kaXNhYmxlX3Jzc2lfcmVwb3J0cyhzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKICNlbmRpZiAvKiBNQUM4MDIxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZWlnaGJvdXIuaCBiL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCmluZGV4IDQwMTRiNjIuLjRiYTg1MjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCisrKyBiL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCkBAIC0xMDgsOCArMTA4LDggQEAKIAlfX3U4CQkJZGVhZDsKIAlzZXFsb2NrX3QJCWhhX2xvY2s7CiAJdW5zaWduZWQgY2hhcgkJaGFbQUxJR04oTUFYX0FERFJfTEVOLCBzaXplb2YodW5zaWduZWQgbG9uZykpXTsKLQlzdHJ1Y3QgaGhfY2FjaGUJCSpoaDsKLQlpbnQJCQkoKm91dHB1dCkoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJc3RydWN0IGhoX2NhY2hlCQloaDsKKwlpbnQJCQkoKm91dHB1dCkoc3RydWN0IG5laWdoYm91ciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIAljb25zdCBzdHJ1Y3QgbmVpZ2hfb3BzCSpvcHM7CiAJc3RydWN0IHJjdV9oZWFkCQlyY3U7CiAJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKQEAgLTExOCwxMiArMTE4LDEwIEBACiAKIHN0cnVjdCBuZWlnaF9vcHMgewogCWludAkJCWZhbWlseTsKLQl2b2lkCQkJKCpzb2xpY2l0KShzdHJ1Y3QgbmVpZ2hib3VyICosIHN0cnVjdCBza19idWZmKik7Ci0Jdm9pZAkJCSgqZXJyb3JfcmVwb3J0KShzdHJ1Y3QgbmVpZ2hib3VyICosIHN0cnVjdCBza19idWZmKik7Ci0JaW50CQkJKCpvdXRwdXQpKHN0cnVjdCBza19idWZmKik7Ci0JaW50CQkJKCpjb25uZWN0ZWRfb3V0cHV0KShzdHJ1Y3Qgc2tfYnVmZiopOwotCWludAkJCSgqaGhfb3V0cHV0KShzdHJ1Y3Qgc2tfYnVmZiopOwotCWludAkJCSgqcXVldWVfeG1pdCkoc3RydWN0IHNrX2J1ZmYqKTsKKwl2b2lkCQkJKCpzb2xpY2l0KShzdHJ1Y3QgbmVpZ2hib3VyICosIHN0cnVjdCBza19idWZmICopOworCXZvaWQJCQkoKmVycm9yX3JlcG9ydCkoc3RydWN0IG5laWdoYm91ciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKwlpbnQJCQkoKm91dHB1dCkoc3RydWN0IG5laWdoYm91ciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKwlpbnQJCQkoKmNvbm5lY3RlZF9vdXRwdXQpKHN0cnVjdCBuZWlnaGJvdXIgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiB9OwogCiBzdHJ1Y3QgcG5laWdoX2VudHJ5IHsKQEAgLTE0Miw3ICsxNDAsNyBAQAogCiBzdHJ1Y3QgbmVpZ2hfaGFzaF90YWJsZSB7CiAJc3RydWN0IG5laWdoYm91ciBfX3JjdQkqKmhhc2hfYnVja2V0czsKLQl1bnNpZ25lZCBpbnQJCWhhc2hfbWFzazsKKwl1bnNpZ25lZCBpbnQJCWhhc2hfc2hpZnQ7CiAJX191MzIJCQloYXNoX3JuZDsKIAlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKIH07CkBAIC0yMDUsOSArMjAzLDEwIEBACiAJCQkJCSAgICAgdTMyIGZsYWdzKTsKIGV4dGVybiB2b2lkCQkJbmVpZ2hfY2hhbmdlYWRkcihzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50CQkJbmVpZ2hfaWZkb3duKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiBpbnQJCQluZWlnaF9yZXNvbHZlX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBpbnQJCQluZWlnaF9jb25uZWN0ZWRfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpOwotZXh0ZXJuIGludAkJCW5laWdoX2NvbXBhdF9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50CQkJbmVpZ2hfcmVzb2x2ZV9vdXRwdXQoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludAkJCW5laWdoX2Nvbm5lY3RlZF9vdXRwdXQoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludAkJCW5laWdoX2NvbXBhdF9vdXRwdXQoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludAkJCW5laWdoX2RpcmVjdF9vdXRwdXQoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIHN0cnVjdCBuZWlnaGJvdXIgCSpuZWlnaF9ldmVudF9ucyhzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwKIAkJCQkJCXU4ICpsbGFkZHIsIHZvaWQgKnNhZGRyLAogCQkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC0zNDEsNyArMzQwLDE2IEBACiAJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmaGgtPmhoX2xvY2ssIHNlcSkpOwogCiAJc2tiX3B1c2goc2tiLCBoaF9sZW4pOwotCXJldHVybiBoaC0+aGhfb3V0cHV0KHNrYik7CisJcmV0dXJuIGRldl9xdWV1ZV94bWl0KHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5laWdoX291dHB1dChzdHJ1Y3QgbmVpZ2hib3VyICpuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoaF9jYWNoZSAqaGggPSAmbi0+aGg7CisJaWYgKChuLT5udWRfc3RhdGUgJiBOVURfQ09OTkVDVEVEKSAmJiBoaC0+aGhfbGVuKQorCQlyZXR1cm4gbmVpZ2hfaGhfb3V0cHV0KGhoLCBza2IpOworCWVsc2UKKwkJcmV0dXJuIG4tPm91dHB1dChuLCBza2IpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZWlnaGJvdXIgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0X25hbWVzcGFjZS5oIGIvaW5jbHVkZS9uZXQvbmV0X25hbWVzcGFjZS5oCmluZGV4IDJiZjllZDkuLjFhYjFhZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaAorKysgYi9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmgKQEAgLTM1LDggKzM1LDExIEBACiAjZGVmaW5lIE5FVERFVl9IQVNIRU5UUklFUyAoMSA8PCBORVRERVZfSEFTSEJJVFMpCiAKIHN0cnVjdCBuZXQgeworCWF0b21pY190CQlwYXNzaXZlOwkvKiBUbyBkZWNpZGVkIHdoZW4gdGhlIG5ldHdvcmsKKwkJCQkJCSAqIG5hbWVzcGFjZSBzaG91bGQgYmUgZnJlZWQuCisJCQkJCQkgKi8KIAlhdG9taWNfdAkJY291bnQ7CQkvKiBUbyBkZWNpZGVkIHdoZW4gdGhlIG5ldHdvcmsKLQkJCQkJCSAqICBuYW1lc3BhY2Ugc2hvdWxkIGJlIGZyZWVkLgorCQkJCQkJICogIG5hbWVzcGFjZSBzaG91bGQgYmUgc2h1dCBkb3duLgogCQkJCQkJICovCiAjaWZkZWYgTkVUTlNfUkVGQ05UX0RFQlVHCiAJYXRvbWljX3QJCXVzZV9jb3VudDsJLyogVG8gdHJhY2sgcmVmZXJlbmNlcyB3ZQpAQCAtNjIsNiArNjUsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgCWRldl9iYXNlX2hlYWQ7CiAJc3RydWN0IGhsaXN0X2hlYWQgCSpkZXZfbmFtZV9oZWFkOwogCXN0cnVjdCBobGlzdF9oZWFkCSpkZXZfaW5kZXhfaGVhZDsKKwl1bnNpZ25lZCBpbnQJCWRldl9iYXNlX3NlcTsJLyogcHJvdGVjdGVkIGJ5IHJ0bmxfbXV0ZXggKi8KIAogCS8qIGNvcmUgZmliX3J1bGVzICovCiAJc3RydWN0IGxpc3RfaGVhZAlydWxlc19vcHM7CkBAIC0xNTQsNiArMTU4LDkgQEAKIHsKIAlyZXR1cm4gbmV0MSA9PSBuZXQyOwogfQorCitleHRlcm4gdm9pZCBuZXRfZHJvcF9ucyh2b2lkICopOworCiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXQgKmdldF9uZXQoc3RydWN0IG5ldCAqbmV0KQpAQCAtMTc1LDYgKzE4Miw4IEBACiB7CiAJcmV0dXJuIDE7CiB9CisKKyNkZWZpbmUgbmV0X2Ryb3BfbnMgTlVMTAogI2VuZGlmCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IGM3YzQyZTcuLjVkNGY4ZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTMwNyw2ICszMDcsMTIgQEAKIAlyZXR1cm4gdGVzdF9iaXQoSVBTX1VOVFJBQ0tFRF9CSVQsICZjdC0+c3RhdHVzKTsKIH0KIAorLyogUGFja2V0IGlzIHJlY2VpdmVkIGZyb20gbG9vcGJhY2sgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBuZl9pc19sb29wYmFja19wYWNrZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5kZXYgJiYgc2tiLT5za2JfaWlmICYmIHNrYi0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSzsKK30KKwogZXh0ZXJuIGludCBuZl9jb25udHJhY2tfc2V0X2hhc2hzaXplKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOwogZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7CiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19tYXg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRsaW5rLmggYi9pbmNsdWRlL25ldC9uZXRsaW5rLmgKaW5kZXggMDI3NDBhOS4uOThjMTg1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGxpbmsuaApAQCAtNjM4LDYgKzYzOCwzMCBAQAogCSAgICAgbmxtc2dfb2socG9zLCByZW0pOyBcCiAJICAgICBwb3MgPSBubG1zZ19uZXh0KHBvcywgJihyZW0pKSkKIAorLyoqCisgKiBubF9kdW1wX2NoZWNrX2NvbnNpc3RlbnQgLSBjaGVjayBpZiBzZXF1ZW5jZSBpcyBjb25zaXN0ZW50IGFuZCBhZHZlcnRpc2UgaWYgbm90CisgKiBAY2I6IG5ldGxpbmsgY2FsbGJhY2sgc3RydWN0dXJlIHRoYXQgc3RvcmVzIHRoZSBzZXF1ZW5jZSBudW1iZXIKKyAqIEBubGg6IG5ldGxpbmsgbWVzc2FnZSBoZWFkZXIgdG8gd3JpdGUgdGhlIGZsYWcgdG8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgc2VxdWVuY2UgKGdlbmVyYXRpb24pIG51bWJlciBjaGFuZ2VkIGR1cmluZyBkdW1wCisgKiBhbmQgaWYgaXQgZGlkLCBhZHZlcnRpc2VzIGl0IGluIHRoZSBuZXRsaW5rIG1lc3NhZ2UgaGVhZGVyLgorICoKKyAqIFRoZSBjb3JyZWN0IHdheSB0byB1c2UgaXQgaXMgdG8gc2V0IGNiLT5zZXEgdG8gdGhlIGdlbmVyYXRpb24gY291bnRlciB3aGVuCisgKiBhbGwgbG9ja3MgZm9yIGR1bXBpbmcgaGF2ZSBiZWVuIGFjcXVpcmVkLCBhbmQgdGhlbiBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yCisgKiBlYWNoIG1lc3NhZ2UgdGhhdCBpcyBnZW5lcmF0ZWQuCisgKgorICogTm90ZSB0aGF0IGR1ZSB0byBpbml0aWFsaXNhdGlvbiBjb25jZXJucywgMCBpcyBhbiBpbnZhbGlkIHNlcXVlbmNlIG51bWJlcgorICogYW5kIG11c3Qgbm90IGJlIHVzZWQgYnkgY29kZSB0aGF0IHVzZXMgdGhpcyBmdW5jdGlvbmFsaXR5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK25sX2R1bXBfY2hlY2tfY29uc2lzdGVudChzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQkgc3RydWN0IG5sbXNnaGRyICpubGgpCit7CisJaWYgKGNiLT5wcmV2X3NlcSAmJiBjYi0+c2VxICE9IGNiLT5wcmV2X3NlcSkKKwkJbmxoLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9EVU1QX0lOVFI7CisJY2ItPnByZXZfc2VxID0gY2ItPnNlcTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBOZXRsaW5rIEF0dHJpYnV0ZXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25mYy5oIGIvaW5jbHVkZS9uZXQvbmZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwMTMwMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L25mYy5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhCisgKgorICogQXV0aG9yczoKKyAqICAgIExhdXJvIFJhbW9zIFZlbmFuY2lvIDxsYXVyby52ZW5hbmNpb0BvcGVuYm9zc2Eub3JnPgorICogICAgQWxvaXNpbyBBbG1laWRhIEpyIDxhbG9pc2lvLmFsbWVpZGFAb3BlbmJvc3NhLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19ORVRfTkZDX0gKKyNkZWZpbmUgX19ORVRfTkZDX0gKKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjZGVmaW5lIG5mY19kZXZfaW5mbyhkZXYsIGZtdCwgYXJnLi4uKSBkZXZfaW5mbygoZGV2KSwgIk5GQzogIiBmbXQgIlxuIiwgIyMgYXJnKQorI2RlZmluZSBuZmNfZGV2X2VycihkZXYsIGZtdCwgYXJnLi4uKSBkZXZfZXJyKChkZXYpLCAiTkZDOiAiIGZtdCAiXG4iLCAjIyBhcmcpCisjZGVmaW5lIG5mY19kZXZfZGJnKGRldiwgZm10LCBhcmcuLi4pIGRldl9kYmcoKGRldiksIGZtdCAiXG4iLCAjIyBhcmcpCisKK3N0cnVjdCBuZmNfZGV2OworCisvKioKKyAqIGRhdGFfZXhjaGFuZ2VfY2JfdCAtIERlZmluaXRpb24gb2YgbmZjX2RhdGFfZXhjaGFuZ2UgY2FsbGJhY2sKKyAqCisgKiBAY29udGV4dDogbmZjX2RhdGFfZXhjaGFuZ2UgY2JfY29udGV4dCBwYXJhbWV0ZXIKKyAqIEBza2I6IHJlc3BvbnNlIGRhdGEKKyAqIEBlcnI6IElmIGFuIGVycm9yIGhhcyBvY2N1cnJlZCBkdXJpbmcgZGF0YSBleGNoYW5nZSwgaXQgaXMgdGhlCisgKgllcnJvciBudW1iZXIuIFplcm8gbWVhbnMgbm8gZXJyb3IuCisgKgorICogV2hlbiBhIHJ4IG9yIHR4IHBhY2thZ2UgaXMgbG9zdCBvciBjb3JydXB0ZWQgb3IgdGhlIHRhcmdldCBnZXRzIG91dAorICogb2YgdGhlIG9wZXJhdGluZyBmaWVsZCwgZXJyIGlzIC1FSU8uCisgKi8KK3R5cGVkZWYgdm9pZCAoKmRhdGFfZXhjaGFuZ2VfY2JfdCkodm9pZCAqY29udGV4dCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJCQkJaW50IGVycik7CisKK3N0cnVjdCBuZmNfb3BzIHsKKwlpbnQgKCpzdGFydF9wb2xsKShzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgcHJvdG9jb2xzKTsKKwl2b2lkICgqc3RvcF9wb2xsKShzdHJ1Y3QgbmZjX2RldiAqZGV2KTsKKwlpbnQgKCphY3RpdmF0ZV90YXJnZXQpKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHUzMiB0YXJnZXRfaWR4LAorCQkJCQkJCXUzMiBwcm90b2NvbCk7CisJdm9pZCAoKmRlYWN0aXZhdGVfdGFyZ2V0KShzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgdGFyZ2V0X2lkeCk7CisJaW50ICgqZGF0YV9leGNoYW5nZSkoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgZGF0YV9leGNoYW5nZV9jYl90IGNiLAorCQkJCQkJCXZvaWQgKmNiX2NvbnRleHQpOworfTsKKworc3RydWN0IG5mY190YXJnZXQgeworCXUzMiBpZHg7CisJdTMyIHN1cHBvcnRlZF9wcm90b2NvbHM7CisJdTE2IHNlbnNfcmVzOworCXU4IHNlbF9yZXM7Cit9OworCitzdHJ1Y3QgbmZjX2dlbmxfZGF0YSB7CisJdTMyIHBvbGxfcmVxX3BpZDsKKwlzdHJ1Y3QgbXV0ZXggZ2VubF9kYXRhX211dGV4OworfTsKKworc3RydWN0IG5mY19kZXYgeworCXVuc2lnbmVkIGlkeDsKKwl1bnNpZ25lZCB0YXJnZXRfaWR4OworCXN0cnVjdCBuZmNfdGFyZ2V0ICp0YXJnZXRzOworCWludCBuX3RhcmdldHM7CisJaW50IHRhcmdldHNfZ2VuZXJhdGlvbjsKKwlzcGlubG9ja190IHRhcmdldHNfbG9jazsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlib29sIHBvbGxpbmc7CisJc3RydWN0IG5mY19nZW5sX2RhdGEgZ2VubF9kYXRhOworCXUzMiBzdXBwb3J0ZWRfcHJvdG9jb2xzOworCisJc3RydWN0IG5mY19vcHMgKm9wczsKK307CisjZGVmaW5lIHRvX25mY19kZXYoX2RldikgY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBuZmNfZGV2LCBkZXYpCisKK2V4dGVybiBzdHJ1Y3QgY2xhc3MgbmZjX2NsYXNzOworCitzdHJ1Y3QgbmZjX2RldiAqbmZjX2FsbG9jYXRlX2RldmljZShzdHJ1Y3QgbmZjX29wcyAqb3BzLAorCQkJCQl1MzIgc3VwcG9ydGVkX3Byb3RvY29scyk7CisKKy8qKgorICogbmZjX2ZyZWVfZGV2aWNlIC0gZnJlZSBuZmMgZGV2aWNlCisgKgorICogQGRldjogVGhlIG5mYyBkZXZpY2UgdG8gZnJlZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbmZjX2ZyZWVfZGV2aWNlKHN0cnVjdCBuZmNfZGV2ICpkZXYpCit7CisJcHV0X2RldmljZSgmZGV2LT5kZXYpOworfQorCitpbnQgbmZjX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmZjX2RldiAqZGV2KTsKKwordm9pZCBuZmNfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IG5mY19kZXYgKmRldik7CisKKy8qKgorICogbmZjX3NldF9wYXJlbnRfZGV2IC0gc2V0IHRoZSBwYXJlbnQgZGV2aWNlCisgKgorICogQG5mY19kZXY6IFRoZSBuZmMgZGV2aWNlIHdob3NlIHBhcmVudCBpcyBiZWluZyBzZXQKKyAqIEBkZXY6IFRoZSBwYXJlbnQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuZmNfc2V0X3BhcmVudF9kZXYoc3RydWN0IG5mY19kZXYgKm5mY19kZXYsCisJCQkJCXN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwluZmNfZGV2LT5kZXYucGFyZW50ID0gZGV2OworfQorCisvKioKKyAqIG5mY19zZXRfZHJ2ZGF0YSAtIHNldCBkcml2ZXIgc3BlY2lmYyBkYXRhCisgKgorICogQGRldjogVGhlIG5mYyBkZXZpY2UKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGRyaXZlciBzcGVjaWZjIGRhdGEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG5mY19zZXRfZHJ2ZGF0YShzdHJ1Y3QgbmZjX2RldiAqZGV2LCB2b2lkICpkYXRhKQoreworCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIGRhdGEpOworfQorCisvKioKKyAqIG5mY19nZXRfZHJ2ZGF0YSAtIGdldCBkcml2ZXIgc3BlY2lmYyBkYXRhCisgKgorICogQGRldjogVGhlIG5mYyBkZXZpY2UKKyAqLworc3RhdGljIGlubGluZSB2b2lkICpuZmNfZ2V0X2RydmRhdGEoc3RydWN0IG5mY19kZXYgKmRldikKK3sKKwlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7Cit9CisKKy8qKgorICogbmZjX2RldmljZV9uYW1lIC0gZ2V0IHRoZSBuZmMgZGV2aWNlIG5hbWUKKyAqCisgKiBAZGV2OiBUaGUgbmZjIGRldmljZSB3aG9zZSBuYW1lIHRvIHJldHVybgorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKm5mY19kZXZpY2VfbmFtZShzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCXJldHVybiBkZXZfbmFtZSgmZGV2LT5kZXYpOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqbmZjX2FsbG9jX3NrYih1bnNpZ25lZCBpbnQgc2l6ZSwgZ2ZwX3QgZ2ZwKTsKKworaW50IG5mY190YXJnZXRzX2ZvdW5kKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHN0cnVjdCBuZmNfdGFyZ2V0ICp0YXJnZXRzLAorCQkJCQkJCWludCBudGFyZ2V0cyk7CisKKyNlbmRpZiAvKiBfX05FVF9ORkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmggYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAppbmRleCA2NWFmYzQ5Li5mZmZkYzYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAorKysgYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaApAQCAtOTksOSArOTksOSBAQAogCQlfX3FkaXNjX3J1bihxKTsKIH0KIAotZXh0ZXJuIGludCB0Y19jbGFzc2lmeV9jb21wYXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9wcm90byAqdHAsCitleHRlcm4gaW50IHRjX2NsYXNzaWZ5X2NvbXBhdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKIAkJCSAgICAgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpOwotZXh0ZXJuIGludCB0Y19jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKK2V4dGVybiBpbnQgdGNfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjZl9wcm90byAqdHAsCiAJCSAgICAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKTsKIAogLyogQ2FsY3VsYXRlIG1heGltYWwgc2l6ZSBvZiBwYWNrZXQgc2VlbiBieSBoYXJkX3N0YXJ0X3htaXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3J0bmV0bGluay5oIGIvaW5jbHVkZS9uZXQvcnRuZXRsaW5rLmgKaW5kZXggNDA5M2NhNy4uNjc4ZjFmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcnRuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvcnRuZXRsaW5rLmgKQEAgLTYsMTEgKzYsMTQgQEAKIAogdHlwZWRlZiBpbnQgKCpydG5sX2RvaXRfZnVuYykoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5sbXNnaGRyICosIHZvaWQgKik7CiB0eXBlZGVmIGludCAoKnJ0bmxfZHVtcGl0X2Z1bmMpKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICopOwordHlwZWRlZiB1MTYgKCpydG5sX2NhbGNpdF9mdW5jKShzdHJ1Y3Qgc2tfYnVmZiAqKTsKIAogZXh0ZXJuIGludAlfX3J0bmxfcmVnaXN0ZXIoaW50IHByb3RvY29sLCBpbnQgbXNndHlwZSwKLQkJCQlydG5sX2RvaXRfZnVuYywgcnRubF9kdW1waXRfZnVuYyk7CisJCQkJcnRubF9kb2l0X2Z1bmMsIHJ0bmxfZHVtcGl0X2Z1bmMsCisJCQkJcnRubF9jYWxjaXRfZnVuYyk7CiBleHRlcm4gdm9pZAlydG5sX3JlZ2lzdGVyKGludCBwcm90b2NvbCwgaW50IG1zZ3R5cGUsCi0JCQkgICAgICBydG5sX2RvaXRfZnVuYywgcnRubF9kdW1waXRfZnVuYyk7CisJCQkgICAgICBydG5sX2RvaXRfZnVuYywgcnRubF9kdW1waXRfZnVuYywKKwkJCSAgICAgIHJ0bmxfY2FsY2l0X2Z1bmMpOwogZXh0ZXJuIGludAlydG5sX3VucmVnaXN0ZXIoaW50IHByb3RvY29sLCBpbnQgbXNndHlwZSk7CiBleHRlcm4gdm9pZAlydG5sX3VucmVnaXN0ZXJfYWxsKGludCBwcm90b2NvbCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmggYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCmluZGV4IGI5MzFmMDIuLjRmYzg4ZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKKysrIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaApAQCAtMTgxLDggKzE4MSw5IEBACiAJc3RydWN0IHRjZl9wcm90b19vcHMJKm5leHQ7CiAJY2hhcgkJCWtpbmRbSUZOQU1TSVpdOwogCi0JaW50CQkJKCpjbGFzc2lmeSkoc3RydWN0IHNrX2J1ZmYqLCBzdHJ1Y3QgdGNmX3Byb3RvKiwKLQkJCQkJc3RydWN0IHRjZl9yZXN1bHQgKik7CisJaW50CQkJKCpjbGFzc2lmeSkoc3RydWN0IHNrX2J1ZmYgKiwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCB0Y2ZfcHJvdG8gKiwKKwkJCQkJICAgIHN0cnVjdCB0Y2ZfcmVzdWx0ICopOwogCWludAkJCSgqaW5pdCkoc3RydWN0IHRjZl9wcm90byopOwogCXZvaWQJCQkoKmRlc3Ryb3kpKHN0cnVjdCB0Y2ZfcHJvdG8qKTsKIApAQCAtMjA1LDggKzIwNiw5IEBACiAJLyogRmFzdCBhY2Nlc3MgcGFydCAqLwogCXN0cnVjdCB0Y2ZfcHJvdG8JKm5leHQ7CiAJdm9pZAkJCSpyb290OwotCWludAkJCSgqY2xhc3NpZnkpKHN0cnVjdCBza19idWZmKiwgc3RydWN0IHRjZl9wcm90byosCi0JCQkJCXN0cnVjdCB0Y2ZfcmVzdWx0ICopOworCWludAkJCSgqY2xhc3NpZnkpKHN0cnVjdCBza19idWZmICosCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgdGNmX3Byb3RvICosCisJCQkJCSAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqKTsKIAlfX2JlMTYJCQlwcm90b2NvbDsKIAogCS8qIEFsbCB0aGUgcmVzdCAqLwpAQCAtMjE0LDcgKzIxNiw3IEBACiAJdTMyCQkJY2xhc3NpZDsKIAlzdHJ1Y3QgUWRpc2MJCSpxOwogCXZvaWQJCQkqZGF0YTsKLQlzdHJ1Y3QgdGNmX3Byb3RvX29wcwkqb3BzOworCWNvbnN0IHN0cnVjdCB0Y2ZfcHJvdG9fb3BzCSpvcHM7CiB9OwogCiBzdHJ1Y3QgcWRpc2Nfc2tiX2NiIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvY29tbWFuZC5oIGIvaW5jbHVkZS9uZXQvc2N0cC9jb21tYW5kLmgKaW5kZXggZGQ2ODQ3ZS4uNjUwNjQ1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9jb21tYW5kLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9jb21tYW5kLmgKQEAgLTYzLDYgKzYzLDcgQEAKIAlTQ1RQX0NNRF9FQ05fRUNORSwJLyogRG8gZGVsYXllZCBFQ05FIHByb2Nlc3NpbmcuICovCiAJU0NUUF9DTURfRUNOX0NXUiwJLyogRG8gZGVsYXllZCBDV1IgcHJvY2Vzc2luZy4gICovCiAJU0NUUF9DTURfVElNRVJfU1RBUlQsCS8qIFN0YXJ0IGEgdGltZXIuICAqLworCVNDVFBfQ01EX1RJTUVSX1NUQVJUX09OQ0UsIC8qIFN0YXJ0IGEgdGltZXIgb25jZSAqLwogCVNDVFBfQ01EX1RJTUVSX1JFU1RBUlQsCS8qIFJlc3RhcnQgYSB0aW1lci4gKi8KIAlTQ1RQX0NNRF9USU1FUl9TVE9QLAkvKiBTdG9wIGEgdGltZXIuICovCiAJU0NUUF9DTURfSU5JVF9DSE9PU0VfVFJBTlNQT1JULCAvKiBDaG9vc2UgdHJhbnNwb3J0IGZvciBhbiBJTklULiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmggYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAppbmRleCBiMmMyMzY2Li42YTcyYTU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaApAQCAtMTIwLDYgKzEyMCw3IEBACiAJCQkJICAgICBpbnQgZmxhZ3MpOwogZXh0ZXJuIHN0cnVjdCBzY3RwX3BmICpzY3RwX2dldF9wZl9zcGVjaWZpYyhzYV9mYW1pbHlfdCBmYW1pbHkpOwogZXh0ZXJuIGludCBzY3RwX3JlZ2lzdGVyX3BmKHN0cnVjdCBzY3RwX3BmICosIHNhX2ZhbWlseV90KTsKK2V4dGVybiB2b2lkIHNjdHBfYWRkcl93cV9tZ210KHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICosIGludCk7CiAKIC8qCiAgKiBzY3RwL3NvY2tldC5jCkBAIC0xMzQsNiArMTM1LDcgQEAKIHZvaWQgc2N0cF9jb3B5X3NvY2soc3RydWN0IHNvY2sgKm5ld3NrLCBzdHJ1Y3Qgc29jayAqc2ssCiAJCSAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyk7CiBleHRlcm4gc3RydWN0IHBlcmNwdV9jb3VudGVyIHNjdHBfc29ja2V0c19hbGxvY2F0ZWQ7CitleHRlcm4gaW50IHNjdHBfYXNjb25mX21nbXQoc3RydWN0IHNjdHBfc29jayAqLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqKTsKIAogLyoKICAqIHNjdHAvcHJpbWl0aXZlLmMKQEAgLTI4NSwyMCArMjg3LDIxIEBACiAJCXByX2NvbnQoZm10LCAjI2FyZ3MpOwkJCVwKIH0gd2hpbGUgKDApCiAjZGVmaW5lIFNDVFBfREVCVUdfUFJJTlRLX0lQQUREUihmbXRfbGVhZCwgZm10X3RyYWlsLAkJCVwKLQkJCQkgYXJnc19sZWFkLCBzYWRkciwgYXJnc190cmFpbC4uLikJXAorCQkJCSBhcmdzX2xlYWQsIGFkZHIsIGFyZ3NfdHJhaWwuLi4pCVwKIGRvIHsJCQkJCQkJCQlcCisJY29uc3QgdW5pb24gc2N0cF9hZGRyICpfYWRkciA9IChhZGRyKTsJCQkJXAogCWlmIChzY3RwX2RlYnVnX2ZsYWcpIHsJCQkJCQlcCi0JCWlmIChzYWRkci0+c2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CQkJXAorCQlpZiAoX2FkZHItPnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgewkJCVwKIAkJCXByaW50ayhLRVJOX0RFQlVHCQkJCVwKIAkJCSAgICAgICBwcl9mbXQoZm10X2xlYWQgIiVwSTYiIGZtdF90cmFpbCksCVwKIAkJCSAgICAgICBhcmdzX2xlYWQsCQkJCVwKLQkJCSAgICAgICAmc2FkZHItPnY2LnNpbjZfYWRkciwJCQlcCisJCQkgICAgICAgJl9hZGRyLT52Ni5zaW42X2FkZHIsCQkJXAogCQkJICAgICAgIGFyZ3NfdHJhaWwpOwkJCQlcCiAJCX0gZWxzZSB7CQkJCQkJXAogCQkJcHJpbnRrKEtFUk5fREVCVUcJCQkJXAogCQkJICAgICAgIHByX2ZtdChmbXRfbGVhZCAiJXBJNCIgZm10X3RyYWlsKSwJXAogCQkJICAgICAgIGFyZ3NfbGVhZCwJCQkJXAotCQkJICAgICAgICZzYWRkci0+djQuc2luX2FkZHIuc19hZGRyLAkJXAorCQkJICAgICAgICZfYWRkci0+djQuc2luX2FkZHIuc19hZGRyLAkJXAogCQkJICAgICAgIGFyZ3NfdHJhaWwpOwkJCQlcCiAJCX0JCQkJCQkJXAogCX0JCQkJCQkJCVwKQEAgLTU5OCw3ICs2MDEsNyBAQAogCQlyZXR1cm4gQUZfSU5FVDY7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7Ci0JfTsKKwl9CiB9CiAKIC8qIENvbnZlcnQgZnJvbSBhbiBhZGRyZXNzIHBhcmFtZXRlciB0eXBlIHRvIGFuIGFkZHJlc3MgZmFtaWx5LiAgKi8KQEAgLTYxMSw3ICs2MTQsNyBAQAogCQlyZXR1cm4gQUZfSU5FVDY7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7Ci0JfTsKKwl9CiB9CiAKIC8qIFBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tzLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmggYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAppbmRleCA3ZGYzMjdhLi4zMWQ3ZWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaApAQCAtMjA1LDYgKzIwNSwxMSBAQAogCSAqIEl0IGlzIGEgbGlzdCBvZiBzY3RwX3NvY2thZGRyX2VudHJ5LgogCSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbG9jYWxfYWRkcl9saXN0OworCWludCBkZWZhdWx0X2F1dG9fYXNjb25mOworCXN0cnVjdCBsaXN0X2hlYWQgYWRkcl93YWl0cTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBhZGRyX3dxX3RpbWVyOworCXN0cnVjdCBsaXN0X2hlYWQgYXV0b19hc2NvbmZfc3BsaXN0OworCXNwaW5sb2NrX3QgYWRkcl93cV9sb2NrOwogCiAJLyogTG9jayB0aGF0IHByb3RlY3RzIHRoZSBsb2NhbF9hZGRyX2xpc3Qgd3JpdGVycyAqLwogCXNwaW5sb2NrX3QgYWRkcl9saXN0X2xvY2s7CkBAIC0yNjQsNiArMjY5LDExIEBACiAjZGVmaW5lIHNjdHBfcG9ydF9oYXNodGFibGUJCShzY3RwX2dsb2JhbHMucG9ydF9oYXNodGFibGUpCiAjZGVmaW5lIHNjdHBfbG9jYWxfYWRkcl9saXN0CQkoc2N0cF9nbG9iYWxzLmxvY2FsX2FkZHJfbGlzdCkKICNkZWZpbmUgc2N0cF9sb2NhbF9hZGRyX2xvY2sJCShzY3RwX2dsb2JhbHMuYWRkcl9saXN0X2xvY2spCisjZGVmaW5lIHNjdHBfYXV0b19hc2NvbmZfc3BsaXN0CQkoc2N0cF9nbG9iYWxzLmF1dG9fYXNjb25mX3NwbGlzdCkKKyNkZWZpbmUgc2N0cF9hZGRyX3dhaXRxCQkJKHNjdHBfZ2xvYmFscy5hZGRyX3dhaXRxKQorI2RlZmluZSBzY3RwX2FkZHJfd3FfdGltZXIJCShzY3RwX2dsb2JhbHMuYWRkcl93cV90aW1lcikKKyNkZWZpbmUgc2N0cF9hZGRyX3dxX2xvY2sJCShzY3RwX2dsb2JhbHMuYWRkcl93cV9sb2NrKQorI2RlZmluZSBzY3RwX2RlZmF1bHRfYXV0b19hc2NvbmYJKHNjdHBfZ2xvYmFscy5kZWZhdWx0X2F1dG9fYXNjb25mKQogI2RlZmluZSBzY3RwX3Njb3BlX3BvbGljeQkJKHNjdHBfZ2xvYmFscy5pcHY0X3Njb3BlX3BvbGljeSkKICNkZWZpbmUgc2N0cF9hZGRpcF9lbmFibGUJCShzY3RwX2dsb2JhbHMuYWRkaXBfZW5hYmxlKQogI2RlZmluZSBzY3RwX2FkZGlwX25vYXV0aAkJKHNjdHBfZ2xvYmFscy5hZGRpcF9ub2F1dGhfZW5hYmxlKQpAQCAtMzQxLDYgKzM1MSw4IEBACiAJYXRvbWljX3QgcGRfbW9kZTsKIAkvKiBSZWNlaXZlIHRvIGhlcmUgd2hpbGUgcGFydGlhbCBkZWxpdmVyeSBpcyBpbiBlZmZlY3QuICovCiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBwZF9sb2JieTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGF1dG9fYXNjb25mX2xpc3Q7CisJaW50IGRvX2F1dG9fYXNjb25mOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2N0cF9zb2NrICpzY3RwX3NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKQEAgLTc5Miw2ICs4MDQsOCBAQAogCV9fdTggdmFsaWQ7CiB9OwogCisjZGVmaW5lIFNDVFBfQUREUkVTU19USUNLX0RFTEFZCTUwMAorCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2NodW5rICooc2N0cF9wYWNrZXRfcGhhbmRsZXJfdCkoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKik7CiAKIC8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGxpc3RzIG9mIGNodW5rcyBhcyB3ZSBhcmUgYXNzZW1ibGluZyBmb3IKQEAgLTEyMzYsNiArMTI1MCw3IEBACiBpbnQgc2N0cF9pbl9zY29wZShjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIGNvbnN0IHNjdHBfc2NvcGVfdCBzY29wZSk7CiBpbnQgc2N0cF9pc19hbnkoc3RydWN0IHNvY2sgKnNrLCBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpOwogaW50IHNjdHBfYWRkcl9pc192YWxpZChjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpOworaW50IHNjdHBfaXNfZXBfYm91bmRhbGwoc3RydWN0IHNvY2sgKnNrKTsKIAogCiAvKiBXaGF0IHR5cGUgb2YgZW5kcG9pbnQ/ICAqLwpAQCAtMTg5OCw2ICsxOTEzLDggQEAKIAkgKiBhZnRlciByZWFjaGluZyA0Mjk0OTY3Mjk1LgogCSAqLwogCV9fdTMyIGFkZGlwX3NlcmlhbDsKKwl1bmlvbiBzY3RwX2FkZHIgKmFzY29uZl9hZGRyX2RlbF9wZW5kaW5nOworCWludCBzcmNfb3V0X29mX2Fzb2Nfb2s7CiAKIAkvKiBTQ1RQIEFVVEg6IGxpc3Qgb2YgdGhlIGVuZHBvaW50IHNoYXJlZCBrZXlzLiAgVGhlc2UKIAkgKiBrZXlzIGFyZSBwcm92aWRlZCBvdXQgb2YgYmFuZCBieSB0aGUgdXNlciBhcHBsaWNhdG9uCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmggYi9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmgKaW5kZXggOTliMDI3Yi4uY2E0NjkzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC91bHBldmVudC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvdWxwZXZlbnQuaApAQCAtODAsNyArODAsNyBAQAogCiB2b2lkIHNjdHBfdWxwZXZlbnRfZnJlZShzdHJ1Y3Qgc2N0cF91bHBldmVudCAqKTsKIGludCBzY3RwX3VscGV2ZW50X2lzX25vdGlmaWNhdGlvbihjb25zdCBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqKTsKLXZvaWQgc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCk7Cit1bnNpZ25lZCBpbnQgc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCk7CiAKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfYXNzb2NfY2hhbmdlKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC91c2VyLmggYi9pbmNsdWRlL25ldC9zY3RwL3VzZXIuaAppbmRleCAzMmZkNTEyLi4wODQyZWYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3VzZXIuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3VzZXIuaApAQCAtOTIsNiArOTIsNyBAQAogI2RlZmluZSBTQ1RQX0xPQ0FMX0FVVEhfQ0hVTktTCTI3CS8qIFJlYWQgb25seSAqLwogI2RlZmluZSBTQ1RQX0dFVF9BU1NPQ19OVU1CRVIJMjgJLyogUmVhZCBvbmx5ICovCiAjZGVmaW5lIFNDVFBfR0VUX0FTU09DX0lEX0xJU1QJMjkJLyogUmVhZCBvbmx5ICovCisjZGVmaW5lIFNDVFBfQVVUT19BU0NPTkYgICAgICAgMzAKIAogLyogSW50ZXJuYWwgU29ja2V0IE9wdGlvbnMuIFNvbWUgb2YgdGhlIHNjdHAgbGlicmFyeSBmdW5jdGlvbnMgYXJlCiAgKiBpbXBsZW1lbnRlZCB1c2luZyB0aGVzZSBzb2NrZXQgb3B0aW9ucy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NubXAuaCBiL2luY2x1ZGUvbmV0L3NubXAuaAppbmRleCA0NzkwODNhLi44ZjBmOWFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zbm1wLmgKKysrIGIvaW5jbHVkZS9uZXQvc25tcC5oCkBAIC0xMTYsNTcgKzExNiw1MSBAQAogCXVuc2lnbmVkIGxvbmcJbWlic1tMSU5VWF9NSUJfWEZSTU1BWF07CiB9OwogCi0vKiAKLSAqIEZJWE1FOiBPbiB4ODYgYW5kIHNvbWUgb3RoZXIgQ1BVcyB0aGUgc3BsaXQgaW50byB1c2VyIGFuZCBzb2Z0aXJxIHBhcnRzCi0gKiBpcyBub3QgbmVlZGVkIGJlY2F1c2UgYWRkbCAkMSxtZW1vcnkgaXMgYXRvbWljIGFnYWluc3QgaW50ZXJydXB0cyAoYnV0IAotICogYXRvbWljX2luYyB3b3VsZCBiZSBvdmVya2lsbCBiZWNhdXNlIG9mIHRoZSBsb2NrIGN5Y2xlcykuIFdhbnRzIG5ldyAKLSAqIG5vbmxvY2tlZF9hdG9taWNfaW5jKCkgcHJpbWl0aXZlcyAtQUsKLSAqLyAKKyNkZWZpbmUgU05NUF9BUlJBWV9TWiAxCisKICNkZWZpbmUgREVGSU5FX1NOTVBfU1RBVCh0eXBlLCBuYW1lKQlcCi0JX190eXBlb2ZfXyh0eXBlKSBfX3BlcmNwdSAqbmFtZVsyXQorCV9fdHlwZW9mX18odHlwZSkgX19wZXJjcHUgKm5hbWVbU05NUF9BUlJBWV9TWl0KICNkZWZpbmUgREVGSU5FX1NOTVBfU1RBVF9BVE9NSUModHlwZSwgbmFtZSkJXAogCV9fdHlwZW9mX18odHlwZSkgKm5hbWUKICNkZWZpbmUgREVDTEFSRV9TTk1QX1NUQVQodHlwZSwgbmFtZSkJXAotCWV4dGVybiBfX3R5cGVvZl9fKHR5cGUpIF9fcGVyY3B1ICpuYW1lWzJdCi0KLSNkZWZpbmUgU05NUF9TVEFUX0JIUFRSKG5hbWUpCShuYW1lWzBdKQotI2RlZmluZSBTTk1QX1NUQVRfVVNSUFRSKG5hbWUpCShuYW1lWzFdKQorCWV4dGVybiBfX3R5cGVvZl9fKHR5cGUpIF9fcGVyY3B1ICpuYW1lW1NOTVBfQVJSQVlfU1pdCiAKICNkZWZpbmUgU05NUF9JTkNfU1RBVFNfQkgobWliLCBmaWVsZCkJXAogCQkJX190aGlzX2NwdV9pbmMobWliWzBdLT5taWJzW2ZpZWxkXSkKKwogI2RlZmluZSBTTk1QX0lOQ19TVEFUU19VU0VSKG1pYiwgZmllbGQpCVwKLQkJCXRoaXNfY3B1X2luYyhtaWJbMV0tPm1pYnNbZmllbGRdKQorCQkJaXJxc2FmZV9jcHVfaW5jKG1pYlswXS0+bWlic1tmaWVsZF0pCisKICNkZWZpbmUgU05NUF9JTkNfU1RBVFNfQVRPTUlDX0xPTkcobWliLCBmaWVsZCkJXAogCQkJYXRvbWljX2xvbmdfaW5jKCZtaWItPm1pYnNbZmllbGRdKQorCiAjZGVmaW5lIFNOTVBfSU5DX1NUQVRTKG1pYiwgZmllbGQpCVwKLQkJCXRoaXNfY3B1X2luYyhtaWJbIWluX3NvZnRpcnEoKV0tPm1pYnNbZmllbGRdKQorCQkJaXJxc2FmZV9jcHVfaW5jKG1pYlswXS0+bWlic1tmaWVsZF0pCisKICNkZWZpbmUgU05NUF9ERUNfU1RBVFMobWliLCBmaWVsZCkJXAotCQkJdGhpc19jcHVfZGVjKG1pYlshaW5fc29mdGlycSgpXS0+bWlic1tmaWVsZF0pCisJCQlpcnFzYWZlX2NwdV9kZWMobWliWzBdLT5taWJzW2ZpZWxkXSkKKwogI2RlZmluZSBTTk1QX0FERF9TVEFUU19CSChtaWIsIGZpZWxkLCBhZGRlbmQpCVwKIAkJCV9fdGhpc19jcHVfYWRkKG1pYlswXS0+bWlic1tmaWVsZF0sIGFkZGVuZCkKKwogI2RlZmluZSBTTk1QX0FERF9TVEFUU19VU0VSKG1pYiwgZmllbGQsIGFkZGVuZCkJXAotCQkJdGhpc19jcHVfYWRkKG1pYlsxXS0+bWlic1tmaWVsZF0sIGFkZGVuZCkKKwkJCWlycXNhZmVfY3B1X2FkZChtaWJbMF0tPm1pYnNbZmllbGRdLCBhZGRlbmQpCisKICNkZWZpbmUgU05NUF9BRERfU1RBVFMobWliLCBmaWVsZCwgYWRkZW5kKQlcCi0JCQl0aGlzX2NwdV9hZGQobWliWyFpbl9zb2Z0aXJxKCldLT5taWJzW2ZpZWxkXSwgYWRkZW5kKQorCQkJaXJxc2FmZV9jcHVfYWRkKG1pYlswXS0+bWlic1tmaWVsZF0sIGFkZGVuZCkKIC8qCiAgKiBVc2UgIl9fdHlwZW9mX18oKm1pYlswXSkgKnB0ciIgaW5zdGVhZCBvZiAiX190eXBlb2ZfXyhtaWJbMF0pIHB0ciIKICAqIHRvIG1ha2UgQHB0ciBhIG5vbi1wZXJjcHUgcG9pbnRlci4KICAqLwogI2RlZmluZSBTTk1QX1VQRF9QT19TVEFUUyhtaWIsIGJhc2VmaWVsZCwgYWRkZW5kKQlcCiAJZG8geyBcCi0JCV9fdHlwZW9mX18oKm1pYlswXSkgKnB0cjsgXAotCQlwcmVlbXB0X2Rpc2FibGUoKTsgXAotCQlwdHIgPSB0aGlzX2NwdV9wdHIoKG1pYilbIWluX3NvZnRpcnEoKV0pOyBcCi0JCXB0ci0+bWlic1tiYXNlZmllbGQjI1BLVFNdKys7IFwKLQkJcHRyLT5taWJzW2Jhc2VmaWVsZCMjT0NURVRTXSArPSBhZGRlbmQ7XAotCQlwcmVlbXB0X2VuYWJsZSgpOyBcCisJCWlycXNhZmVfY3B1X2luYyhtaWJbMF0tPm1pYnNbYmFzZWZpZWxkIyNQS1RTXSk7CQlcCisJCWlycXNhZmVfY3B1X2FkZChtaWJbMF0tPm1pYnNbYmFzZWZpZWxkIyNPQ1RFVFNdLCBhZGRlbmQpOwlcCiAJfSB3aGlsZSAoMCkKICNkZWZpbmUgU05NUF9VUERfUE9fU1RBVFNfQkgobWliLCBiYXNlZmllbGQsIGFkZGVuZCkJXAogCWRvIHsgXAotCQlfX3R5cGVvZl9fKCptaWJbMF0pICpwdHIgPSBcCi0JCQlfX3RoaXNfY3B1X3B0cigobWliKVswXSk7IFwKLQkJcHRyLT5taWJzW2Jhc2VmaWVsZCMjUEtUU10rKzsgXAotCQlwdHItPm1pYnNbYmFzZWZpZWxkIyNPQ1RFVFNdICs9IGFkZGVuZDtcCisJCV9fdGhpc19jcHVfaW5jKG1pYlswXS0+bWlic1tiYXNlZmllbGQjI1BLVFNdKTsJCVwKKwkJX190aGlzX2NwdV9hZGQobWliWzBdLT5taWJzW2Jhc2VmaWVsZCMjT0NURVRTXSwgYWRkZW5kKTsJXAogCX0gd2hpbGUgKDApCiAKIApAQCAtMTc5LDQwICsxNzMsMjAgQEAKIAkJcHRyLT5taWJzW2ZpZWxkXSArPSBhZGRlbmQ7CQkJCVwKIAkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnB0ci0+c3luY3ApOwkJCVwKIAl9IHdoaWxlICgwKQorCiAjZGVmaW5lIFNOTVBfQUREX1NUQVRTNjRfVVNFUihtaWIsIGZpZWxkLCBhZGRlbmQpIAkJCVwKIAlkbyB7CQkJCQkJCQlcCi0JCV9fdHlwZW9mX18oKm1pYlswXSkgKnB0cjsJCQkJXAotCQlwcmVlbXB0X2Rpc2FibGUoKTsJCQkJCVwKLQkJcHRyID0gX190aGlzX2NwdV9wdHIoKG1pYilbMV0pOwkJCQlcCi0JCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnB0ci0+c3luY3ApOwkJCVwKLQkJcHRyLT5taWJzW2ZpZWxkXSArPSBhZGRlbmQ7CQkJCVwKLQkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnB0ci0+c3luY3ApOwkJCVwKLQkJcHJlZW1wdF9lbmFibGUoKTsJCQkJCVwKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOwkJCQkJXAorCQlTTk1QX0FERF9TVEFUUzY0X0JIKG1pYiwgZmllbGQsIGFkZGVuZCk7CQlcCisJCWxvY2FsX2JoX2VuYWJsZSgpOwkJCQkJXAogCX0gd2hpbGUgKDApCisKICNkZWZpbmUgU05NUF9BRERfU1RBVFM2NChtaWIsIGZpZWxkLCBhZGRlbmQpCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCV9fdHlwZW9mX18oKm1pYlswXSkgKnB0cjsJCQkJXAotCQlwcmVlbXB0X2Rpc2FibGUoKTsJCQkJCVwKLQkJcHRyID0gX190aGlzX2NwdV9wdHIoKG1pYilbIWluX3NvZnRpcnEoKV0pOwkJXAotCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZwdHItPnN5bmNwKTsJCQlcCi0JCXB0ci0+bWlic1tmaWVsZF0gKz0gYWRkZW5kOwkJCQlcCi0JCXU2NF9zdGF0c191cGRhdGVfZW5kKCZwdHItPnN5bmNwKTsJCQlcCi0JCXByZWVtcHRfZW5hYmxlKCk7CQkJCQlcCi0JfSB3aGlsZSAoMCkKKwkJU05NUF9BRERfU1RBVFM2NF9VU0VSKG1pYiwgZmllbGQsIGFkZGVuZCkKKwogI2RlZmluZSBTTk1QX0lOQ19TVEFUUzY0X0JIKG1pYiwgZmllbGQpIFNOTVBfQUREX1NUQVRTNjRfQkgobWliLCBmaWVsZCwgMSkKICNkZWZpbmUgU05NUF9JTkNfU1RBVFM2NF9VU0VSKG1pYiwgZmllbGQpIFNOTVBfQUREX1NUQVRTNjRfVVNFUihtaWIsIGZpZWxkLCAxKQogI2RlZmluZSBTTk1QX0lOQ19TVEFUUzY0KG1pYiwgZmllbGQpIFNOTVBfQUREX1NUQVRTNjQobWliLCBmaWVsZCwgMSkKLSNkZWZpbmUgU05NUF9VUERfUE9fU1RBVFM2NChtaWIsIGJhc2VmaWVsZCwgYWRkZW5kKQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCV9fdHlwZW9mX18oKm1pYlswXSkgKnB0cjsJCQkJXAotCQlwcmVlbXB0X2Rpc2FibGUoKTsJCQkJCVwKLQkJcHRyID0gX190aGlzX2NwdV9wdHIoKG1pYilbIWluX3NvZnRpcnEoKV0pOwkJXAotCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZwdHItPnN5bmNwKTsJCQlcCi0JCXB0ci0+bWlic1tiYXNlZmllbGQjI1BLVFNdKys7CQkJCVwKLQkJcHRyLT5taWJzW2Jhc2VmaWVsZCMjT0NURVRTXSArPSBhZGRlbmQ7CQkJXAotCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcHRyLT5zeW5jcCk7CQkJXAotCQlwcmVlbXB0X2VuYWJsZSgpOwkJCQkJXAotCX0gd2hpbGUgKDApCiAjZGVmaW5lIFNOTVBfVVBEX1BPX1NUQVRTNjRfQkgobWliLCBiYXNlZmllbGQsIGFkZGVuZCkJCQlcCiAJZG8gewkJCQkJCQkJXAogCQlfX3R5cGVvZl9fKCptaWJbMF0pICpwdHI7CQkJCVwKQEAgLTIyMiw2ICsxOTYsMTIgQEAKIAkJcHRyLT5taWJzW2Jhc2VmaWVsZCMjT0NURVRTXSArPSBhZGRlbmQ7CQkJXAogCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcHRyLT5zeW5jcCk7CQkJXAogCX0gd2hpbGUgKDApCisjZGVmaW5lIFNOTVBfVVBEX1BPX1NUQVRTNjQobWliLCBiYXNlZmllbGQsIGFkZGVuZCkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlsb2NhbF9iaF9kaXNhYmxlKCk7CQkJCQlcCisJCVNOTVBfVVBEX1BPX1NUQVRTNjRfQkgobWliLCBiYXNlZmllbGQsIGFkZGVuZCk7CQlcCisJCWxvY2FsX2JoX2VuYWJsZSgpOwkJCQkJXAorCX0gd2hpbGUgKDApCiAjZWxzZQogI2RlZmluZSBTTk1QX0lOQ19TVEFUUzY0X0JIKG1pYiwgZmllbGQpCQlTTk1QX0lOQ19TVEFUU19CSChtaWIsIGZpZWxkKQogI2RlZmluZSBTTk1QX0lOQ19TVEFUUzY0X1VTRVIobWliLCBmaWVsZCkJU05NUF9JTkNfU1RBVFNfVVNFUihtaWIsIGZpZWxkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc29jay5oIGIvaW5jbHVkZS9uZXQvc29jay5oCmluZGV4IGYyMDQ2ZTQuLjhlNDA2MmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9zb2NrLmgKQEAgLTQwLDYgKzQwLDcgQEAKICNpZm5kZWYgX1NPQ0tfSAogI2RlZmluZSBfU09DS19ICiAKKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3RfbnVsbHMuaD4KQEAgLTE3OCw3ICsxNzksNiBAQAogICAqCUBza19kc3RfY2FjaGU6IGRlc3RpbmF0aW9uIGNhY2hlCiAgICoJQHNrX2RzdF9sb2NrOiBkZXN0aW5hdGlvbiBjYWNoZSBsb2NrCiAgICoJQHNrX3BvbGljeTogZmxvdyBwb2xpY3kKLSAgKglAc2tfcm1lbV9hbGxvYzogcmVjZWl2ZSBxdWV1ZSBieXRlcyBjb21taXR0ZWQKICAgKglAc2tfcmVjZWl2ZV9xdWV1ZTogaW5jb21pbmcgcGFja2V0cwogICAqCUBza193bWVtX2FsbG9jOiB0cmFuc21pdCBxdWV1ZSBieXRlcyBjb21taXR0ZWQKICAgKglAc2tfd3JpdGVfcXVldWU6IFBhY2tldCBzZW5kaW5nIHF1ZXVlCkBAIC01NjMsNiArNTYzLDcgQEAKIAlTT0NLX1RJTUVTVEFNUElOR19TWVNfSEFSRFdBUkUsIC8qICVTT0ZfVElNRVNUQU1QSU5HX1NZU19IQVJEV0FSRSAqLwogCVNPQ0tfRkFTWU5DLCAvKiBmYXN5bmMoKSBhY3RpdmUgKi8KIAlTT0NLX1JYUV9PVkZMLAorCVNPQ0tfWkVST0NPUFksIC8qIGJ1ZmZlcnMgZnJvbSB1c2Vyc3BhY2UgKi8KIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzb2NrX2NvcHlfZmxhZ3Moc3RydWN0IHNvY2sgKm5zaywgc3RydWN0IHNvY2sgKm9zaykKQEAgLTEzMDIsOCArMTMwMyw3IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkc3RfZW50cnkgKgogX19za19kc3RfZ2V0KHN0cnVjdCBzb2NrICpzaykKIHsKLQlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHNrLT5za19kc3RfY2FjaGUsIHJjdV9yZWFkX2xvY2tfaGVsZCgpIHx8Ci0JCQkJCQkgICAgICAgc29ja19vd25lZF9ieV91c2VyKHNrKSB8fAorCXJldHVybiByY3VfZGVyZWZlcmVuY2VfY2hlY2soc2stPnNrX2RzdF9jYWNoZSwgc29ja19vd25lZF9ieV91c2VyKHNrKSB8fAogCQkJCQkJICAgICAgIGxvY2tkZXBfaXNfaGVsZCgmc2stPnNrX2xvY2suc2xvY2spKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwLmggYi9pbmNsdWRlL25ldC90Y3AuaAppbmRleCBjZGEzMGVhLi4xNDlhNDE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y3AuaAorKysgYi9pbmNsdWRlL25ldC90Y3AuaApAQCAtMTIyLDcgKzEyMiwxMyBAQAogI2VuZGlmCiAjZGVmaW5lIFRDUF9SVE9fTUFYCSgodW5zaWduZWQpKDEyMCpIWikpCiAjZGVmaW5lIFRDUF9SVE9fTUlOCSgodW5zaWduZWQpKEhaLzUpKQotI2RlZmluZSBUQ1BfVElNRU9VVF9JTklUICgodW5zaWduZWQpKDMqSFopKQkvKiBSRkMgMTEyMiBpbml0aWFsIFJUTyB2YWx1ZQkqLworI2RlZmluZSBUQ1BfVElNRU9VVF9JTklUICgodW5zaWduZWQpKDEqSFopKQkvKiBSRkMyOTg4YmlzIGluaXRpYWwgUlRPIHZhbHVlCSovCisjZGVmaW5lIFRDUF9USU1FT1VUX0ZBTExCQUNLICgodW5zaWduZWQpKDMqSFopKQkvKiBSRkMgMTEyMiBpbml0aWFsIFJUTyB2YWx1ZSwgbm93CisJCQkJCQkgKiB1c2VkIGFzIGEgZmFsbGJhY2sgUlRPIGZvciB0aGUKKwkJCQkJCSAqIGluaXRpYWwgZGF0YSB0cmFuc21pc3Npb24gaWYgbm8KKwkJCQkJCSAqIHZhbGlkIFJUVCBzYW1wbGUgaGFzIGJlZW4gYWNxdWlyZWQsCisJCQkJCQkgKiBtb3N0IGxpa2VseSBkdWUgdG8gcmV0cmFucyBpbiAzV0hTLgorCQkJCQkJICovCiAKICNkZWZpbmUgVENQX1JFU09VUkNFX1BST0JFX0lOVEVSVkFMICgodW5zaWduZWQpKEhaLzJVKSkgLyogTWF4aW1hbCBpbnRlcnZhbCBiZXR3ZWVuIHByb2JlcwogCQkJCQkgICAgICAgICAgICAgICAgICogZm9yIGxvY2FsIHJlc291cmNlcy4KQEAgLTI5NSw3ICszMDEsNyBAQAogc3RhdGljIGlubGluZSBpbnQgdGNwX3N5bnFfbm9fcmVjZW50X292ZXJmbG93KGNvbnN0IHN0cnVjdCBzb2NrICpzaykKIHsKIAl1bnNpZ25lZCBsb25nIGxhc3Rfb3ZlcmZsb3cgPSB0Y3Bfc2soc2spLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wOwotCXJldHVybiB0aW1lX2FmdGVyKGppZmZpZXMsIGxhc3Rfb3ZlcmZsb3cgKyBUQ1BfVElNRU9VVF9JTklUKTsKKwlyZXR1cm4gdGltZV9hZnRlcihqaWZmaWVzLCBsYXN0X292ZXJmbG93ICsgVENQX1RJTUVPVVRfRkFMTEJBQ0spOwogfQogCiBleHRlcm4gc3RydWN0IHByb3RvIHRjcF9wcm90OwpAQCAtNTA4LDYgKzUxNCw3IEBACiBleHRlcm4gaW50IHRjcF9tdHVfdG9fbXNzKHN0cnVjdCBzb2NrICpzaywgaW50IHBtdHUpOwogZXh0ZXJuIGludCB0Y3BfbXNzX3RvX210dShzdHJ1Y3Qgc29jayAqc2ssIGludCBtc3MpOwogZXh0ZXJuIHZvaWQgdGNwX210dXBfaW5pdChzdHJ1Y3Qgc29jayAqc2spOworZXh0ZXJuIHZvaWQgdGNwX3ZhbGlkX3J0dF9tZWFzKHN0cnVjdCBzb2NrICpzaywgdTMyIHNlcV9ydHQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2JvdW5kX3J0byhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC93aW1heC5oIGIvaW5jbHVkZS9uZXQvd2ltYXguaAppbmRleCA3MzI4ZDUwLi4zMjJmZjRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC93aW1heC5oCisrKyBiL2luY2x1ZGUvbmV0L3dpbWF4LmgKQEAgLTQyMyw3ICs0MjMsNiBAQAogCWludCAoKm9wX3Jlc2V0KShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpOwogCiAJc3RydWN0IHJma2lsbCAqcmZraWxsOwotCXN0cnVjdCBpbnB1dF9kZXYgKnJma2lsbF9pbnB1dDsKIAl1bnNpZ25lZCByZl9odzsKIAl1bnNpZ25lZCByZl9zdzsKIAljaGFyIG5hbWVbMzJdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX3BtYS5oIGIvaW5jbHVkZS9yZG1hL2liX3BtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODg5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3JkbWEvaWJfcG1hLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgUUxvZ2ljIENvcnBvcmF0aW9uLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBQYXRoU2NhbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZiAhZGVmaW5lZChJQl9QTUFfSCkKKyNkZWZpbmUgSUJfUE1BX0gKKworI2luY2x1ZGUgPHJkbWEvaWJfbWFkLmg+CisKKy8qCisgKiBQTUEgY2xhc3MgcG9ydGluZm8gY2FwYWJpbGl0eSBtYXNrIGJpdHMKKyAqLworI2RlZmluZSBJQl9QTUFfQ0xBU1NfQ0FQX0FMTFBPUlRTRUxFQ1QgIGNwdV90b19iZTE2KDEgPDwgOCkKKyNkZWZpbmUgSUJfUE1BX0NMQVNTX0NBUF9FWFRfV0lEVEggICAgICBjcHVfdG9fYmUxNigxIDw8IDkpCisjZGVmaW5lIElCX1BNQV9DTEFTU19DQVBfWE1JVF9XQUlUICAgICAgY3B1X3RvX2JlMTYoMSA8PCAxMikKKworI2RlZmluZSBJQl9QTUFfQ0xBU1NfUE9SVF9JTkZPICAgICAgICAgIGNwdV90b19iZTE2KDB4MDAwMSkKKyNkZWZpbmUgSUJfUE1BX1BPUlRfU0FNUExFU19DT05UUk9MICAgICBjcHVfdG9fYmUxNigweDAwMTApCisjZGVmaW5lIElCX1BNQV9QT1JUX1NBTVBMRVNfUkVTVUxUICAgICAgY3B1X3RvX2JlMTYoMHgwMDExKQorI2RlZmluZSBJQl9QTUFfUE9SVF9DT1VOVEVSUyAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MDAxMikKKyNkZWZpbmUgSUJfUE1BX1BPUlRfQ09VTlRFUlNfRVhUICAgICAgICBjcHVfdG9fYmUxNigweDAwMUQpCisjZGVmaW5lIElCX1BNQV9QT1JUX1NBTVBMRVNfUkVTVUxUX0VYVCAgY3B1X3RvX2JlMTYoMHgwMDFFKQorCitzdHJ1Y3QgaWJfcG1hX21hZCB7CisJc3RydWN0IGliX21hZF9oZHIgbWFkX2hkcjsKKwl1OCByZXNlcnZlZFs0MF07CisJdTggZGF0YVsxOTJdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGliX3BtYV9wb3J0c2FtcGxlc2NvbnRyb2wgeworCXU4IG9wY29kZTsKKwl1OCBwb3J0X3NlbGVjdDsKKwl1OCB0aWNrOworCXU4IGNvdW50ZXJfd2lkdGg7CQkvKiByZXN2OiA3OjMsIGNvdW50ZXIgd2lkdGg6IDI6MCAqLworCV9fYmUzMiBjb3VudGVyX21hc2swXzk7CQkvKiAyLCAxMCAzLWJpdCBmaWVsZHMgKi8KKwlfX2JlMTYgY291bnRlcl9tYXNrMTBfMTQ7CS8qIDEsIDUgMy1iaXQgZmllbGRzICovCisJdTggc2FtcGxlX21lY2hhbmlzbXM7CisJdTggc2FtcGxlX3N0YXR1czsJCS8qIG9ubHkgbG93ZXIgMiBiaXRzICovCisJX19iZTY0IG9wdGlvbl9tYXNrOworCV9fYmU2NCB2ZW5kb3JfbWFzazsKKwlfX2JlMzIgc2FtcGxlX3N0YXJ0OworCV9fYmUzMiBzYW1wbGVfaW50ZXJ2YWw7CisJX19iZTE2IHRhZzsKKwlfX2JlMTYgY291bnRlcl9zZWxlY3RbMTVdOworCV9fYmUzMiByZXNlcnZlZDE7CisJX19iZTY0IHNhbXBsZXNfb25seV9vcHRpb25fbWFzazsKKwlfX2JlMzIgcmVzZXJ2ZWQyWzI4XTsKK307CisKK3N0cnVjdCBpYl9wbWFfcG9ydHNhbXBsZXNyZXN1bHQgeworCV9fYmUxNiB0YWc7CisJX19iZTE2IHNhbXBsZV9zdGF0dXM7ICAgLyogb25seSBsb3dlciAyIGJpdHMgKi8KKwlfX2JlMzIgY291bnRlclsxNV07Cit9OworCitzdHJ1Y3QgaWJfcG1hX3BvcnRzYW1wbGVzcmVzdWx0X2V4dCB7CisJX19iZTE2IHRhZzsKKwlfX2JlMTYgc2FtcGxlX3N0YXR1czsgICAvKiBvbmx5IGxvd2VyIDIgYml0cyAqLworCV9fYmUzMiBleHRlbmRlZF93aWR0aDsgIC8qIG9ubHkgdXBwZXIgMiBiaXRzICovCisJX19iZTY0IGNvdW50ZXJbMTVdOworfTsKKworc3RydWN0IGliX3BtYV9wb3J0Y291bnRlcnMgeworCXU4IHJlc2VydmVkOworCXU4IHBvcnRfc2VsZWN0OworCV9fYmUxNiBjb3VudGVyX3NlbGVjdDsKKwlfX2JlMTYgc3ltYm9sX2Vycm9yX2NvdW50ZXI7CisJdTggbGlua19lcnJvcl9yZWNvdmVyeV9jb3VudGVyOworCXU4IGxpbmtfZG93bmVkX2NvdW50ZXI7CisJX19iZTE2IHBvcnRfcmN2X2Vycm9yczsKKwlfX2JlMTYgcG9ydF9yY3ZfcmVtcGh5c19lcnJvcnM7CisJX19iZTE2IHBvcnRfcmN2X3N3aXRjaF9yZWxheV9lcnJvcnM7CisJX19iZTE2IHBvcnRfeG1pdF9kaXNjYXJkczsKKwl1OCBwb3J0X3htaXRfY29uc3RyYWludF9lcnJvcnM7CisJdTggcG9ydF9yY3ZfY29uc3RyYWludF9lcnJvcnM7CisJdTggcmVzZXJ2ZWQxOworCXU4IGxpbmtfb3ZlcnJ1bl9lcnJvcnM7IC8qIExvY2FsTGluazogNzo0LCBCdWZmZXJPdmVycnVuOiAzOjAgKi8KKwlfX2JlMTYgcmVzZXJ2ZWQyOworCV9fYmUxNiB2bDE1X2Ryb3BwZWQ7CisJX19iZTMyIHBvcnRfeG1pdF9kYXRhOworCV9fYmUzMiBwb3J0X3Jjdl9kYXRhOworCV9fYmUzMiBwb3J0X3htaXRfcGFja2V0czsKKwlfX2JlMzIgcG9ydF9yY3ZfcGFja2V0czsKKwlfX2JlMzIgcG9ydF94bWl0X3dhaXQ7Cit9IF9fcGFja2VkOworCisKKyNkZWZpbmUgSUJfUE1BX1NFTF9TWU1CT0xfRVJST1IgICAgICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MDAwMSkKKyNkZWZpbmUgSUJfUE1BX1NFTF9MSU5LX0VSUk9SX1JFQ09WRVJZICAgICAgICAgIGNwdV90b19iZTE2KDB4MDAwMikKKyNkZWZpbmUgSUJfUE1BX1NFTF9MSU5LX0RPV05FRCAgICAgICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MDAwNCkKKyNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1JDVl9FUlJPUlMgICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MDAwOCkKKyNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1JDVl9SRU1QSFlTX0VSUk9SUyAgICAgIGNwdV90b19iZTE2KDB4MDAxMCkKKyNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1hNSVRfRElTQ0FSRFMgICAgICAgICAgIGNwdV90b19iZTE2KDB4MDA0MCkKKyNkZWZpbmUgSUJfUE1BX1NFTF9MT0NBTF9MSU5LX0lOVEVHUklUWV9FUlJPUlMgIGNwdV90b19iZTE2KDB4MDIwMCkKKyNkZWZpbmUgSUJfUE1BX1NFTF9FWENFU1NJVkVfQlVGRkVSX09WRVJSVU5TICAgIGNwdV90b19iZTE2KDB4MDQwMCkKKyNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1ZMMTVfRFJPUFBFRCAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MDgwMCkKKyNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1hNSVRfREFUQSAgICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MTAwMCkKKyNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1JDVl9EQVRBICAgICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4MjAwMCkKKyNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1hNSVRfUEFDS0VUUyAgICAgICAgICAgIGNwdV90b19iZTE2KDB4NDAwMCkKKyNkZWZpbmUgSUJfUE1BX1NFTF9QT1JUX1JDVl9QQUNLRVRTICAgICAgICAgICAgIGNwdV90b19iZTE2KDB4ODAwMCkKKworc3RydWN0IGliX3BtYV9wb3J0Y291bnRlcnNfZXh0IHsKKwl1OCByZXNlcnZlZDsKKwl1OCBwb3J0X3NlbGVjdDsKKwlfX2JlMTYgY291bnRlcl9zZWxlY3Q7CisJX19iZTMyIHJlc2VydmVkMTsKKwlfX2JlNjQgcG9ydF94bWl0X2RhdGE7CisJX19iZTY0IHBvcnRfcmN2X2RhdGE7CisJX19iZTY0IHBvcnRfeG1pdF9wYWNrZXRzOworCV9fYmU2NCBwb3J0X3Jjdl9wYWNrZXRzOworCV9fYmU2NCBwb3J0X3VuaWNhc3RfeG1pdF9wYWNrZXRzOworCV9fYmU2NCBwb3J0X3VuaWNhc3RfcmN2X3BhY2tldHM7CisJX19iZTY0IHBvcnRfbXVsdGljYXN0X3htaXRfcGFja2V0czsKKwlfX2JlNjQgcG9ydF9tdWx0aWNhc3RfcmN2X3BhY2tldHM7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfWE1JVF9EQVRBICAgICAgICAgICAgICBjcHVfdG9fYmUxNigweDAwMDEpCisjZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfUkNWX0RBVEEgICAgICAgICAgICAgICBjcHVfdG9fYmUxNigweDAwMDIpCisjZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfWE1JVF9QQUNLRVRTICAgICAgICAgICBjcHVfdG9fYmUxNigweDAwMDQpCisjZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfUkNWX1BBQ0tFVFMgICAgICAgICAgICBjcHVfdG9fYmUxNigweDAwMDgpCisjZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfVU5JX1hNSVRfUEFDS0VUUyAgICAgICBjcHVfdG9fYmUxNigweDAwMTApCisjZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfVU5JX1JDVl9QQUNLRVRTICAgICAgICBjcHVfdG9fYmUxNigweDAwMjApCisjZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfTVVMVElfWE1JVF9QQUNLRVRTICAgICBjcHVfdG9fYmUxNigweDAwNDApCisjZGVmaW5lIElCX1BNQV9TRUxYX1BPUlRfTVVMVElfUkNWX1BBQ0tFVFMgICAgICBjcHVfdG9fYmUxNigweDAwODApCisKKyNlbmRpZiAvKiBJQl9QTUFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX3ZlcmJzLmggYi9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaAppbmRleCA1NWNkMGEwLi5iZjQzMDZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaAorKysgYi9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaApAQCAtMzUwLDcgKzM1MCw4IEBACiAJSUJfRVZFTlRfU1JRX0VSUiwKIAlJQl9FVkVOVF9TUlFfTElNSVRfUkVBQ0hFRCwKIAlJQl9FVkVOVF9RUF9MQVNUX1dRRV9SRUFDSEVELAotCUlCX0VWRU5UX0NMSUVOVF9SRVJFR0lTVEVSCisJSUJfRVZFTlRfQ0xJRU5UX1JFUkVHSVNURVIsCisJSUJfRVZFTlRfR0lEX0NIQU5HRSwKIH07CiAKIHN0cnVjdCBpYl9ldmVudCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvaXNjc2lfcHJvdG8uaCBiL2luY2x1ZGUvc2NzaS9pc2NzaV9wcm90by5oCmluZGV4IGRkMGE1MmMuLmVhNjhiM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9pc2NzaV9wcm90by5oCisrKyBiL2luY2x1ZGUvc2NzaS9pc2NzaV9wcm90by5oCkBAIC02MCw3ICs2MCw3IEBACiAJdWludDhfdAkJcnN2ZDJbMl07CiAJdWludDhfdAkJaGxlbmd0aDsJLyogQUhTcyB0b3RhbCBsZW5ndGggKi8KIAl1aW50OF90CQlkbGVuZ3RoWzNdOwkvKiBEYXRhIGxlbmd0aCAqLwotCXVpbnQ4X3QJCWx1bls4XTsKKwlzdHJ1Y3Qgc2NzaV9sdW4JbHVuOwogCWl0dF90CQlpdHQ7CQkvKiBJbml0aWF0b3IgVGFzayBUYWcsIG9wYXF1ZSBmb3IgdGFyZ2V0ICovCiAJX19iZTMyCQl0dHQ7CQkvKiBUYXJnZXQgVGFzayBUYWcgKi8KIAlfX2JlMzIJCXN0YXRzbjsKQEAgLTEyMiw3ICsxMjIsNyBAQAogCV9fYmUxNiByc3ZkMjsKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwotCXVpbnQ4X3QgbHVuWzhdOworCXN0cnVjdCBzY3NpX2x1biBsdW47CiAJaXR0X3QJIGl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCiAJX19iZTMyIGRhdGFfbGVuZ3RoOwogCV9fYmUzMiBjbWRzbjsKQEAgLTE5OCw3ICsxOTgsNyBAQAogCXVpbnQ4X3QgcnN2ZDJbMl07CiAJdWludDhfdCByc3ZkMzsKIAl1aW50OF90IGRsZW5ndGhbM107Ci0JdWludDhfdCBsdW5bOF07CisJc3RydWN0IHNjc2lfbHVuCWx1bjsKIAl1aW50OF90IHJzdmQ0WzhdOwogCV9fYmUzMglzdGF0c247CiAJX19iZTMyCWV4cF9jbWRzbjsKQEAgLTIyNiw3ICsyMjYsNyBAQAogCV9fYmUxNglyc3ZkMjsKIAl1aW50OF90IHJzdmQzOwogCXVpbnQ4X3QgZGxlbmd0aFszXTsKLQl1aW50OF90IGx1bls4XTsKKwlzdHJ1Y3Qgc2NzaV9sdW4JbHVuOwogCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwogCV9fYmUzMgl0dHQ7CS8qIFRhcmdldCBUcmFuc2ZlciBUYWcgKi8KIAlfX2JlMzIJY21kc247CkBAIC0yNDEsNyArMjQxLDcgQEAKIAlfX2JlMTYJcnN2ZDI7CiAJdWludDhfdCByc3ZkMzsKIAl1aW50OF90IGRsZW5ndGhbM107Ci0JdWludDhfdCBsdW5bOF07CisJc3RydWN0IHNjc2lfbHVuCWx1bjsKIAlpdHRfdAkgaXR0OwkvKiBJbml0aWF0b3IgVGFzayBUYWcgKi8KIAlfX2JlMzIJdHR0OwkvKiBUYXJnZXQgVHJhbnNmZXIgVGFnICovCiAJX19iZTMyCXN0YXRzbjsKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCXVpbnQ4X3QgcnN2ZDFbMl07CiAJdWludDhfdCBobGVuZ3RoOwogCXVpbnQ4X3QgZGxlbmd0aFszXTsKLQl1aW50OF90IGx1bls4XTsKKwlzdHJ1Y3Qgc2NzaV9sdW4gbHVuOwogCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwogCWl0dF90CSBydHQ7CS8qIFJlZmVyZW5jZSBUYXNrIFRhZyAqLwogCV9fYmUzMgljbWRzbjsKQEAgLTMxNSw3ICszMTUsNyBAQAogCXVpbnQ4X3QgcnN2ZDJbMl07CiAJdWludDhfdAlobGVuZ3RoOwogCXVpbnQ4X3QJZGxlbmd0aFszXTsKLQl1aW50OF90IGx1bls4XTsKKwlzdHJ1Y3Qgc2NzaV9sdW4JbHVuOwogCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwogCV9fYmUzMgl0dHQ7CS8qIFRhcmdldCBUcmFuc2ZlciBUYWcgKi8KIAlfX2JlMzIJc3RhdHNuOwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJdWludDhfdCByc3ZkMlsyXTsKIAl1aW50OF90IHJzdmQzOwogCXVpbnQ4X3QgZGxlbmd0aFszXTsKLQl1aW50OF90IGx1bls4XTsKKwlzdHJ1Y3Qgc2NzaV9sdW4gbHVuOwogCWl0dF90CSBpdHQ7CiAJX19iZTMyCXR0dDsKIAlfX2JlMzIJcnN2ZDQ7CkBAIC0zNTMsNyArMzUzLDcgQEAKIAl1aW50OF90IGNtZF9zdGF0dXM7CiAJdWludDhfdCBobGVuZ3RoOwogCXVpbnQ4X3QgZGxlbmd0aFszXTsKLQl1aW50OF90IGx1bls4XTsKKwlzdHJ1Y3Qgc2NzaV9sdW4JbHVuOwogCWl0dF90CSBpdHQ7CiAJX19iZTMyCXR0dDsKIAlfX2JlMzIJc3RhdHNuOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmZjLmggYi9pbmNsdWRlL3Njc2kvbGliZmMuaAppbmRleCBhM2NiZGE0Li43ZDk2ODI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliZmMuaAorKysgYi9pbmNsdWRlL3Njc2kvbGliZmMuaApAQCAtNTExLDYgKzUxMSwxNCBAQAogCSAqLwogCWludCAoKmRkcF9kb25lKShzdHJ1Y3QgZmNfbHBvcnQgKiwgdTE2KTsKIAkvKgorCSAqIFNldHMgdXAgdGhlIEREUCBjb250ZXh0IGZvciBhIGdpdmVuIGV4Y2hhbmdlIGlkIG9uIHRoZSBnaXZlbgorCSAqIHNjYXR0ZXJsaXN0IGlmIExMRCBzdXBwb3J0cyBERFAgZm9yIEZDb0UgdGFyZ2V0LgorCSAqCisJICogU1RBVFVTOiBPUFRJT05BTAorCSAqLworCWludCAoKmRkcF90YXJnZXQpKHN0cnVjdCBmY19scG9ydCAqLCB1MTYsIHN0cnVjdCBzY2F0dGVybGlzdCAqLAorCQkJICB1bnNpZ25lZCBpbnQpOworCS8qCiAJICogQWxsb3cgTExEIHRvIGZpbGwgaXRzIG93biBMaW5rIEVycm9yIFN0YXR1cyBCbG9jawogCSAqCiAJICogU1RBVFVTOiBPUFRJT05BTApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmggYi9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaAppbmRleCAwZjQzNjc3Li5jZWRjZmYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaAorKysgYi9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaApAQCAtMTE1LDcgKzExNSw3IEBACiAJLyogY29waWVkIHZhbHVlcyBpbiBjYXNlIHdlIG5lZWQgdG8gc2VuZCB0bWZzICovCiAJaXR0X3QJCQloZHJfaXR0OwogCV9fYmUzMgkJCWNtZHNuOwotCXVpbnQ4X3QJCQlsdW5bOF07CisJc3RydWN0IHNjc2lfbHVuCQlsdW47CiAKIAlpbnQJCQlpdHQ7CQkvKiB0aGlzIElUVCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvb3NkX2luaXRpYXRvci5oIGIvaW5jbHVkZS9zY3NpL29zZF9pbml0aWF0b3IuaAppbmRleCAwYTUwNzk5Li41NzJmYjU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvb3NkX2luaXRpYXRvci5oCisrKyBiL2luY2x1ZGUvc2NzaS9vc2RfaW5pdGlhdG9yLmgKQEAgLTI2Miw3ICsyNjIsNyBAQAogICogb3NkX3JlcV9kZWNvZGVfc2Vuc2VfZnVsbCAtIERlY29kZSBzZW5zZSBpbmZvcm1hdGlvbiBhZnRlciBleGVjdXRpb24uCiAgKgogICogQG9yOiAgICAgICAgICAgLSBvc2RfcmVxdWVzdCB0byBleGFtaW5lCi0gKiBAb3NpICAgICAgICAgICAtIFJlY2lldnMgYSBtb3JlIGRldGFpbGVkIGVycm9yIHJlcG9ydCBpbmZvcm1hdGlvbiAob3B0aW9uYWwpLgorICogQG9zaSAgICAgICAgICAgLSBSZWNlaXZlcyBhIG1vcmUgZGV0YWlsZWQgZXJyb3IgcmVwb3J0IGluZm9ybWF0aW9uIChvcHRpb25hbCkuCiAgKiBAc2lsZW50ICAgICAgICAtIERvIG5vdCBwcmludCB0byBkbXNnIChFdmVuIGlmIGVuYWJsZWQpCiAgKiBAYmFkX29ial9saXN0ICAtIFNvbWUgY29tbWFuZHMgYWN0IG9uIG11bHRpcGxlIG9iamVjdHMuIEZhaWxlZCBvYmplY3RzIHdpbGwKICAqICAgICAgICAgICAgICAgICAgYmUgcmVjZWl2ZWQgaGVyZSAob3B0aW9uYWwpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaS5oIGIvaW5jbHVkZS9zY3NpL3Njc2kuaAppbmRleCAzNjY4OTAzLi44MDAxYWU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpLmgKQEAgLTQ5NSw3ICs0OTUsNyBAQAogCiAjZGVmaW5lIHNlbnNlX2NsYXNzKHNlbnNlKSAgKCgoc2Vuc2UpID4+IDQpICYgMHg3KQogI2RlZmluZSBzZW5zZV9lcnJvcihzZW5zZSkgICgoc2Vuc2UpICYgMHhmKQotI2RlZmluZSBzZW5zZV92YWxpZChzZW5zZSkgICgoc2Vuc2UpICYgMHg4MCk7CisjZGVmaW5lIHNlbnNlX3ZhbGlkKHNlbnNlKSAgKChzZW5zZSkgJiAweDgwKQogCiAvKgogICogZGVmYXVsdCB0aW1lb3V0cwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9yYXdtaWRpLmggYi9pbmNsdWRlL3NvdW5kL3Jhd21pZGkuaAppbmRleCAyNDgwZTdkLi42YjE0MzU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3Jhd21pZGkuaAorKysgYi9pbmNsdWRlL3NvdW5kL3Jhd21pZGkuaApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfU0VRVUVOQ0VSKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU0VRVUVOQ0VSX01PRFVMRSkKICNpbmNsdWRlICJzZXFfZGV2aWNlLmgiCkBAIC02Myw2ICs2NCw3IEBACiB9OwogCiBzdHJ1Y3Qgc25kX3Jhd21pZGlfcnVudGltZSB7CisJc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwogCXVuc2lnbmVkIGludCBkcmFpbjogMSwJLyogZHJhaW4gc3RhZ2UgKi8KIAkJICAgICBvc3M6IDE7CS8qIE9TUyBjb21wYXRpYmxlIG1vZGUgKi8KIAkvKiBtaWRpIHN0cmVhbSBidWZmZXIgKi8KQEAgLTc5LDcgKzgxLDcgQEAKIAkvKiBldmVudCBoYW5kbGVyIChuZXcgYnl0ZXMsIGlucHV0IG9ubHkpICovCiAJdm9pZCAoKmV2ZW50KShzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0pOwogCS8qIGRlZmVycyBjYWxscyB0byBldmVudCBbaW5wdXRdIG9yIG9wcy0+dHJpZ2dlciBbb3V0cHV0XSAqLwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OworCXN0cnVjdCB3b3JrX3N0cnVjdCBldmVudF93b3JrOwogCS8qIHByaXZhdGUgZGF0YSAqLwogCXZvaWQgKnByaXZhdGVfZGF0YTsKIAl2b2lkICgqcHJpdmF0ZV9mcmVlKShzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zYjE2X2NzcC5oIGIvaW5jbHVkZS9zb3VuZC9zYjE2X2NzcC5oCmluZGV4IDczNmVhYzcuLmFmMWI0OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc2IxNl9jc3AuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NiMTZfY3NwLmgKQEAgLTk5LDcgKzk5LDE0IEBACiAvKiBnZXQgQ1NQIGluZm9ybWF0aW9uICovCiAjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9JTkZPCQlfSU9SKCdIJywgMHgxMCwgc3RydWN0IHNuZF9zYl9jc3BfaW5mbykKIC8qIGxvYWQgbWljcm9jb2RlIHRvIENTUCAqLwotI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfTE9BRF9DT0RFCV9JT1coJ0gnLCAweDExLCBzdHJ1Y3Qgc25kX3NiX2NzcF9taWNyb2NvZGUpCisvKiBOT1RFOiBzdHJ1Y3Qgc25kX3NiX2NzcF9taWNyb2NvZGUgb3ZlcmZsb3dzIHRoZSBtYXggc2l6ZSAoMTMgYml0cykKKyAqIGRlZmluZWQgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyBsaWtlIE1JUFMsIGFuZCBpdCBsZWFkcyB0byBidWlsZCBlcnJvcnMuCisgKiAoeDg2IGFuZCBjbyBoYXZlIDE0LWJpdCBzaXplLCB0aHVzIGl0J3MgdmFsaWQsIHRob3VnaC4pCisgKiBBcyBhIHdvcmthcm91bmQgZm9yIHNraXBwaW5nIHRoZSBzaXplLWxpbWl0IGNoZWNrLCBoZXJlIHdlIGRvbid0IHVzZSB0aGUKKyAqIG5vcm1hbCBfSU9XKCkgbWFjcm8gYnV0IF9JT0MoKSB3aXRoIHRoZSBtYW51YWwgYXJndW1lbnQuCisgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX0xPQURfQ09ERQlcCisJX0lPQyhfSU9DX1dSSVRFLCAnSCcsIDB4MTEsIHNpemVvZihzdHJ1Y3Qgc25kX3NiX2NzcF9taWNyb2NvZGUpKQogLyogdW5sb2FkIG1pY3JvY29kZSBmcm9tIENTUCAqLwogI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfVU5MT0FEX0NPREUJX0lPKCdIJywgMHgxMikKIC8qIHN0YXJ0IENTUCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFpLmggYi9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaAppbmRleCAxYmFmZTk1Li41YWQ1ZjNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaApAQCAtMjA5LDYgKzIwOSwxMCBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9zdHJlYW0gY2FwdHVyZTsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fc3RyZWFtIHBsYXliYWNrOwogCXVuc2lnbmVkIGludCBzeW1tZXRyaWNfcmF0ZXM6MTsKKworCS8qIHByb2JlIG9yZGVyaW5nIC0gZm9yIGNvbXBvbmVudHMgd2l0aCBydW50aW1lIGRlcGVuZGVuY2llcyAqLworCWludCBwcm9iZV9vcmRlcjsKKwlpbnQgcmVtb3ZlX29yZGVyOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaCBiL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaAppbmRleCBjNDZlN2Q4Li5lMDk1MDVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCkBAIC0zNDgsNiArMzQ4LDggQEAKIHZvaWQgc25kX3NvY19kYXBtX2ZyZWUoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKTsKIGludCBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJCQkgICAgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqcm91dGUsIGludCBudW0pOworaW50IHNuZF9zb2NfZGFwbV93ZWFrX3JvdXRlcyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCisJCQkgICAgIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgKnJvdXRlLCBpbnQgbnVtKTsKIAogLyogZGFwbSBldmVudHMgKi8KIGludCBzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCkBAIC00MjksNiArNDMxLDcgQEAKIAkvKiBzdGF0dXMgKi8KIAl1MzIgY29ubmVjdDoxOwkvKiBzb3VyY2UgYW5kIHNpbmsgd2lkZ2V0cyBhcmUgY29ubmVjdGVkICovCiAJdTMyIHdhbGtlZDoxOwkvKiBwYXRoIGhhcyBiZWVuIHdhbGtlZCAqLworCXUzMiB3ZWFrOjE7CS8qIHBhdGggaWdub3JlZCBmb3IgcG93ZXIgbWFuYWdlbWVudCAqLwogCiAJaW50ICgqY29ubmVjdGVkKShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc291cmNlLAogCQkJIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rKTsKQEAgLTQ0NCw2ICs0NDcsNyBAQAogCWNoYXIgKm5hbWU7CQkvKiB3aWRnZXQgbmFtZSAqLwogCWNoYXIgKnNuYW1lOwkvKiBzdHJlYW0gbmFtZSAqLwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm07CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKIApAQCAtNTA3LDEwICs1MTEsMTEgQEAKIAogCXN0cnVjdCBkZXZpY2UgKmRldjsgLyogZnJvbSBwYXJlbnQgLSBmb3IgZGVidWcgKi8KIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7IC8qIHBhcmVudCBjb2RlYyAqLworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybTsgLyogcGFyZW50IHBsYXRmb3JtICovCiAJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsgLyogcGFyZW50IGNhcmQgKi8KIAogCS8qIHVzZWQgZHVyaW5nIERBUE0gdXBkYXRlcyAqLwotCWludCBkZXZfcG93ZXI7CisJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgdGFyZ2V0X2JpYXNfbGV2ZWw7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy5oIGIvaW5jbHVkZS9zb3VuZC9zb2MuaAppbmRleCBmMWRlM2UwLi5hYTE5ZjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLmgKQEAgLTIwMyw2ICsyMDMsMTYgQEAKIAlTT0NfVkFMVUVfRU5VTV9ET1VCTEVfREVDTChuYW1lLCB4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1hc2ssIHh0ZXh0cywgeHZhbHVlcykKIAogLyoKKyAqIENvbXBvbmVudCBwcm9iZSBhbmQgcmVtb3ZlIG9yZGVyaW5nIGxldmVscyBmb3IgY29tcG9uZW50cyB3aXRoIHJ1bnRpbWUKKyAqIGRlcGVuZGVuY2llcy4KKyAqLworI2RlZmluZSBTTkRfU09DX0NPTVBfT1JERVJfRklSU1QJCS0yCisjZGVmaW5lIFNORF9TT0NfQ09NUF9PUkRFUl9FQVJMWQkJLTEKKyNkZWZpbmUgU05EX1NPQ19DT01QX09SREVSX05PUk1BTAkJMAorI2RlZmluZSBTTkRfU09DX0NPTVBfT1JERVJfTEFURQkJMQorI2RlZmluZSBTTkRfU09DX0NPTVBfT1JERVJfTEFTVAkJMgorCisvKgogICogQmlhcyBsZXZlbHMKICAqCiAgKiBAT046ICAgICAgQmlhcyBpcyBmdWxseSBvbiBmb3IgYXVkaW8gcGxheWJhY2sgYW5kIGNhcHR1cmUgb3BlcmF0aW9ucy4KQEAgLTIxNCwxMCArMjI0LDEwIEBACiAgKiBAT0ZGOiAgICAgUG93ZXIgT2ZmLiBObyByZXN0cmljdGlvbnMgb24gdHJhbnNpdGlvbiB0aW1lcy4KICAqLwogZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgewotCVNORF9TT0NfQklBU19PRkYsCi0JU05EX1NPQ19CSUFTX1NUQU5EQlksCi0JU05EX1NPQ19CSUFTX1BSRVBBUkUsCi0JU05EX1NPQ19CSUFTX09OLAorCVNORF9TT0NfQklBU19PRkYgPSAwLAorCVNORF9TT0NfQklBU19TVEFOREJZID0gMSwKKwlTTkRfU09DX0JJQVNfUFJFUEFSRSA9IDIsCisJU05EX1NPQ19CSUFTX09OID0gMywKIH07CiAKIHN0cnVjdCBzbmRfamFjazsKQEAgLTI0OCw4ICsyNTgsNyBAQAogZXh0ZXJuIHN0cnVjdCBzbmRfYWM5N19idXNfb3BzIHNvY19hYzk3X29wczsKIAogZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSB7Ci0JU05EX1NPQ19DVVNUT00gPSAxLAotCVNORF9TT0NfSTJDLAorCVNORF9TT0NfSTJDID0gMSwKIAlTTkRfU09DX1NQSSwKIH07CiAKQEAgLTI1OSw2ICsyNjgsMTEgQEAKIAlTTkRfU09DX1JCVFJFRV9DT01QUkVTU0lPTgogfTsKIAorZW51bSBzbmRfc29jX3BjbV9zdWJjbGFzcyB7CisJU05EX1NPQ19QQ01fQ0xBU1NfUENNCT0gMCwKKwlTTkRfU09DX1BDTV9DTEFTU19CRQk9IDEsCit9OworCiBpbnQgc25kX3NvY19jb2RlY19zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGNsa19pZCwKIAkJCSAgICAgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpOwogaW50IHNuZF9zb2NfY29kZWNfc2V0X3BsbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBwbGxfaWQsIGludCBzb3VyY2UsCkBAIC0yOTgsNiArMzEyLDEwIEBACiAJCQkJICAgICAgdW5zaWduZWQgaW50IHJlZyk7CiBpbnQgc25kX3NvY19kZWZhdWx0X3dyaXRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgcmVnKTsKK2ludCBzbmRfc29jX3BsYXRmb3JtX3JlYWQoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtLAorCQkJCQl1bnNpZ25lZCBpbnQgcmVnKTsKK2ludCBzbmRfc29jX3BsYXRmb3JtX3dyaXRlKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSwKKwkJCQkJdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCk7CiAKIC8qIFV0aWxpdHkgZnVuY3Rpb25zIHRvIGdldCBjbG9jayByYXRlcyBmcm9tIHZhcmlvdXMgdGhpbmdzICovCiBpbnQgc25kX3NvY19jYWxjX2ZyYW1lX3NpemUoaW50IHNhbXBsZV9zaXplLCBpbnQgY2hhbm5lbHMsIGludCB0ZG1fc2xvdHMpOwpAQCAtMzUwLDYgKzM2OCw4IEBACiAJCQkJICBjb25zdCBjaGFyICpwcmVmaXgpOwogaW50IHNuZF9zb2NfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqY29udHJvbHMsIGludCBudW1fY29udHJvbHMpOworaW50IHNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSwKKwljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqY29udHJvbHMsIGludCBudW1fY29udHJvbHMpOwogaW50IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKTsKIGludCBzbmRfc29jX2luZm9fZW51bV9leHQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCkBAIC02MTMsNiArNjMzLDEwIEBACiAKIAl2b2lkICgqc2VxX25vdGlmaWVyKShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKiwKIAkJCSAgICAgZW51bSBzbmRfc29jX2RhcG1fdHlwZSwgaW50KTsKKworCS8qIHByb2JlIG9yZGVyaW5nIC0gZm9yIGNvbXBvbmVudHMgd2l0aCBydW50aW1lIGRlcGVuZGVuY2llcyAqLworCWludCBwcm9iZV9vcmRlcjsKKwlpbnQgcmVtb3ZlX29yZGVyOwogfTsKIAogLyogU29DIHBsYXRmb3JtIGludGVyZmFjZSAqLwpAQCAtNjI0LDEwICs2NDgsMTcgQEAKIAlpbnQgKCpyZXN1bWUpKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKTsKIAogCS8qIHBjbSBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KLQlpbnQgKCpwY21fbmV3KShzdHJ1Y3Qgc25kX2NhcmQgKiwgc3RydWN0IHNuZF9zb2NfZGFpICosCi0JCXN0cnVjdCBzbmRfcGNtICopOworCWludCAoKnBjbV9uZXcpKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICopOwogCXZvaWQgKCpwY21fZnJlZSkoc3RydWN0IHNuZF9wY20gKik7CiAKKwkvKiBEZWZhdWx0IGNvbnRyb2wgYW5kIHNldHVwLCBhZGRlZCBhZnRlciBwcm9iZSgpIGlzIHJ1biAqLworCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpjb250cm9sczsKKwlpbnQgbnVtX2NvbnRyb2xzOworCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkYXBtX3dpZGdldHM7CisJaW50IG51bV9kYXBtX3dpZGdldHM7CisJY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqZGFwbV9yb3V0ZXM7CisJaW50IG51bV9kYXBtX3JvdXRlczsKKwogCS8qCiAJICogRm9yIHBsYXRmb3JtIGNhdXNlZCBkZWxheSByZXBvcnRpbmcuCiAJICogT3B0aW9uYWwuCkBAIC02MzcsNiArNjY4LDE0IEBACiAKIAkvKiBwbGF0Zm9ybSBzdHJlYW0gb3BzICovCiAJc3RydWN0IHNuZF9wY21fb3BzICpvcHM7CisKKwkvKiBwcm9iZSBvcmRlcmluZyAtIGZvciBjb21wb25lbnRzIHdpdGggcnVudGltZSBkZXBlbmRlbmNpZXMgKi8KKwlpbnQgcHJvYmVfb3JkZXI7CisJaW50IHJlbW92ZV9vcmRlcjsKKworCS8qIHBsYXRmb3JtIElPIC0gdXNlZCBmb3IgcGxhdGZvcm0gREFQTSAqLworCXVuc2lnbmVkIGludCAoKnJlYWQpKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICosIHVuc2lnbmVkIGludCk7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIH07CiAKIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtIHsKQEAgLTY1MSw2ICs2OTAsOCBAQAogCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQ7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgY2FyZF9saXN0OworCisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0IGRhcG07CiB9OwogCiBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayB7CkBAIC03MjYsOCArNzY3LDEwIEBACiAKIAkvKiBjYWxsYmFja3MgKi8KIAlpbnQgKCpzZXRfYmlhc19sZXZlbCkoc3RydWN0IHNuZF9zb2NfY2FyZCAqLAorCQkJICAgICAgc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCQkJICAgICAgZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpOwogCWludCAoKnNldF9iaWFzX2xldmVsX3Bvc3QpKHN0cnVjdCBzbmRfc29jX2NhcmQgKiwKKwkJCQkgICBzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJCQkJICAgZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpOwogCiAJbG9uZyBwbWRvd25fdGltZTsKQEAgLTc5MCw2ICs4MzMsOSBAQAogCXN0cnVjdCBkZXZpY2UgZGV2OwogCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOworCXN0cnVjdCBtdXRleCBwY21fbXV0ZXg7CisJZW51bSBzbmRfc29jX3BjbV9zdWJjbGFzcyBwY21fc3ViY2xhc3M7CisJc3RydWN0IHNuZF9wY21fb3BzIG9wczsKIAogCXVuc2lnbmVkIGludCBjb21wbGV0ZToxOwogCXVuc2lnbmVkIGludCBkZXZfcmVnaXN0ZXJlZDoxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb3VuZGZvbnQuaCBiL2luY2x1ZGUvc291bmQvc291bmRmb250LmgKaW5kZXggZjk1ZDk5Yi4uNjc5ZGYwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb3VuZGZvbnQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvdW5kZm9udC5oCkBAIC0xMjEsNyArMTIxLDcgQEAKIGludCBzbmRfc2ZfY2FsY19wYXJtX2hvbGQoaW50IG1zZWMpOwogaW50IHNuZF9zZl9jYWxjX3Bhcm1fYXR0YWNrKGludCBtc2VjKTsKIGludCBzbmRfc2ZfY2FsY19wYXJtX2RlY2F5KGludCBtc2VjKTsKLSNkZWZpbmUgc25kX3NmX2NhbGNfcGFybV9kZWxheShtc2VjKSAoMHg4MDAwIC0gKG1zZWMpICogMTAwMCAvIDcyNSk7CisjZGVmaW5lIHNuZF9zZl9jYWxjX3Bhcm1fZGVsYXkobXNlYykgKDB4ODAwMCAtIChtc2VjKSAqIDEwMDAgLyA3MjUpCiBleHRlcm4gaW50IHNuZF9zZl92b2xfdGFibGVbMTI4XTsKIGludCBzbmRfc2ZfbGluZWFyX3RvX2xvZyh1bnNpZ25lZCBpbnQgYW1vdW50LCBpbnQgb2Zmc2V0LCBpbnQgcmF0aW8pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9iYXNlLmggYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9iYXNlLmgKaW5kZXggNTYxYWM5OS4uMjcwNDA2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oCisrKyBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2Jhc2UuaApAQCAtOSwxMiArOSwxMyBAQAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogCi0jZGVmaW5lIFRBUkdFVF9DT1JFX01PRF9WRVJTSU9OCQkidjQuMC4wLXJjNy1tbCIKKyNkZWZpbmUgVEFSR0VUX0NPUkVfTU9EX1ZFUlNJT04JCSJ2NC4xLjAtcmMxLW1sIgogI2RlZmluZSBTSFVURE9XTl9TSUdTCShzaWdtYXNrKFNJR0tJTEwpfHNpZ21hc2soU0lHSU5UKXxzaWdtYXNrKFNJR0FCUlQpKQogCiAvKiBVc2VkIGJ5IHRyYW5zcG9ydF9nZW5lcmljX2FsbG9jYXRlX2lvdmVjcygpICovCiAjZGVmaW5lIFRSQU5TUE9SVF9JT1ZfREFUQV9CVUZGRVIJCTUKIC8qIE1heGltdW0gTnVtYmVyIG9mIExVTnMgcGVyIFRhcmdldCBQb3J0YWwgR3JvdXAgKi8KKy8qIERvbid0IHJhaXNlIGFib3ZlIDUxMSBvciBSRVBPUlRfTFVOUyBuZWVkcyB0byBoYW5kbGUgPjEgcGFnZSAqLwogI2RlZmluZSBUUkFOU1BPUlRfTUFYX0xVTlNfUEVSX1RQRwkJMjU2CiAvKgogICogQnkgZGVmYXVsdCB3ZSB1c2UgMzItYnl0ZSBDREJzIGluIFRDTSBDb3JlIGFuZCBzdWJzeXN0ZW0gcGx1Z2luIGNvZGUuCkBAIC05OSw2ICsxMDAsNyBAQAogCVRSQU5TUE9SVF9GUkVFCQk9IDE1LAogCVRSQU5TUE9SVF9ORVdfQ01EX01BUAk9IDE2LAogCVRSQU5TUE9SVF9GUkVFX0NNRF9JTlRSID0gMTcsCisJVFJBTlNQT1JUX0NPTVBMRVRFX1FGX1dQID0gMTgsCiB9OwogCiAvKiBVc2VkIGZvciBzdHJ1Y3Qgc2VfY21kLT5zZV9jbWRfZmxhZ3MgKi8KQEAgLTEwOCwyNyArMTEwLDIyIEBACiAJU0NGX0VNVUxBVEVEX1RBU0tfU0VOU0UJCT0gMHgwMDAwMDAwNCwKIAlTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQgkJPSAweDAwMDAwMDA4LAogCVNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCCT0gMHgwMDAwMDAxMCwKLQlTQ0ZfU0NTSV9DT05UUk9MX05PTlNHX0lPX0NEQgk9IDB4MDAwMDAwMjAsCiAJU0NGX1NDU0lfTk9OX0RBVEFfQ0RCCQk9IDB4MDAwMDAwNDAsCiAJU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTgkJPSAweDAwMDAwMDgwLAogCVNDRl9TQ1NJX1JFU0VSVkFUSU9OX0NPTkZMSUNUCT0gMHgwMDAwMDEwMCwKLQlTQ0ZfQ01EX1BBU1NUSFJPVUdIX05PQUxMT0MJPSAweDAwMDAwMjAwLAogCVNDRl9TRV9DTURfRkFJTEVECQk9IDB4MDAwMDA0MDAsCiAJU0NGX1NFX0xVTl9DTUQJCQk9IDB4MDAwMDA4MDAsCiAJU0NGX1NFX0FMTE9XX0VPTwkJPSAweDAwMDAxMDAwLAotCVNDRl9TRV9ESVNBQkxFX09OTElORV9DSEVDSwk9IDB4MDAwMDIwMDAsCiAJU0NGX1NFTlRfQ0hFQ0tfQ09ORElUSU9OCT0gMHgwMDAwNDAwMCwKIAlTQ0ZfT1ZFUkZMT1dfQklUCQk9IDB4MDAwMDgwMDAsCiAJU0NGX1VOREVSRkxPV19CSVQJCT0gMHgwMDAxMDAwMCwKIAlTQ0ZfU0VOVF9ERUxBWUVEX1RBUwkJPSAweDAwMDIwMDAwLAogCVNDRl9BTFVBX05PTl9PUFRJTUlaRUQJCT0gMHgwMDA0MDAwMCwKIAlTQ0ZfREVMQVlFRF9DTURfRlJPTV9TQU1fQVRUUgk9IDB4MDAwODAwMDAsCi0JU0NGX1BBU1NUSFJPVUdIX1NHX1RPX01FTQk9IDB4MDAxMDAwMDAsCi0JU0NGX1BBU1NUSFJPVUdIX0NPTlRJR19UT19TRwk9IDB4MDAyMDAwMDAsCisJU0NGX1VOVVNFRAkJCT0gMHgwMDEwMDAwMCwKIAlTQ0ZfUEFTU1RIUk9VR0hfU0dfVE9fTUVNX05PQUxMT0MgPSAweDAwNDAwMDAwLAotCVNDRl9FTVVMQVRFX1NZTkNfQ0FDSEUJCT0gMHgwMDgwMDAwMCwKIAlTQ0ZfRU1VTEFURV9DREJfQVNZTkMJCT0gMHgwMTAwMDAwMCwKLQlTQ0ZfRU1VTEFURV9TWU5DX1VOTUFQCQk9IDB4MDIwMDAwMDAKKwlTQ0ZfRU1VTEFURV9RVUVVRV9GVUxMCQk9IDB4MDIwMDAwMDAsCiB9OwogCiAvKiBzdHJ1Y3Qgc2VfZGV2X2VudHJ5LT5sdW5fZmxhZ3MgYW5kIHN0cnVjdCBzZV9sdW4tPmx1bl9hY2Nlc3MgKi8KQEAgLTIwNSwxMSArMjAyLDYgQEAKIAlTQ1NJX0lOREVYX1RZUEVfTUFYCiB9IHNjc2lfaW5kZXhfdDsKIAotc3RydWN0IHNjc2lfaW5kZXhfdGFibGUgewotCXNwaW5sb2NrX3QJbG9jazsKLQl1MzIJCXNjc2lfbWliX2luZGV4W1NDU0lfSU5ERVhfVFlQRV9NQVhdOwotfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7Ci0KIHN0cnVjdCBzZV9jbWQ7CiAKIHN0cnVjdCB0MTBfYWx1YSB7CkBAIC0yMzUsNyArMjI3LDcgQEAKIAlhdG9taWNfdCBsdV9ncF9yZWZfY250OwogCXNwaW5sb2NrX3QgbHVfZ3BfbG9jazsKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwIGx1X2dwX2dyb3VwOwotCXN0cnVjdCBsaXN0X2hlYWQgbHVfZ3BfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGx1X2dwX25vZGU7CiAJc3RydWN0IGxpc3RfaGVhZCBsdV9ncF9tZW1fbGlzdDsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCkBAIC0yOTEsMTAgKzI4MywxMCBAQAogfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKIHN0cnVjdCB0MTBfd3duIHsKLQl1bnNpZ25lZCBjaGFyIHZlbmRvcls4XTsKLQl1bnNpZ25lZCBjaGFyIG1vZGVsWzE2XTsKLQl1bnNpZ25lZCBjaGFyIHJldmlzaW9uWzRdOwotCXVuc2lnbmVkIGNoYXIgdW5pdF9zZXJpYWxbSU5RVUlSWV9WUERfU0VSSUFMX0xFTl07CisJY2hhciB2ZW5kb3JbOF07CisJY2hhciBtb2RlbFsxNl07CisJY2hhciByZXZpc2lvbls0XTsKKwljaGFyIHVuaXRfc2VyaWFsW0lOUVVJUllfVlBEX1NFUklBTF9MRU5dOwogCXNwaW5sb2NrX3QgdDEwX3ZwZF9sb2NrOwogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICp0MTBfc3ViX2RldjsKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwIHQxMF93d25fZ3JvdXA7CkBAIC0zNjYsMTMgKzM1OCwxMyBAQAogCWludCAoKnQxMF9wcl9jbGVhcikoc3RydWN0IHNlX2NtZCAqKTsKIH07CiAKLXN0cnVjdCB0MTBfcmVzZXJ2YXRpb25fdGVtcGxhdGUgeworc3RydWN0IHQxMF9yZXNlcnZhdGlvbiB7CiAJLyogUmVzZXJ2YXRpb24gZWZmZWN0cyBhbGwgdGFyZ2V0IHBvcnRzICovCiAJaW50IHByX2FsbF90Z19wdDsKIAkvKiBBY3RpdmF0ZSBQZXJzaXN0ZW5jZSBhY3Jvc3MgVGFyZ2V0IFBvd2VyIExvc3MgZW5hYmxlZAogCSAqIGZvciBTQ1NJIGRldmljZSAqLwogCWludCBwcl9hcHRwbF9hY3RpdmU7Ci0JLyogVXNlZCBieSBzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uX3RlbXBsYXRlLT5wcl9hcHRwbF9idWZfbGVuICovCisJLyogVXNlZCBieSBzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uLT5wcl9hcHRwbF9idWZfbGVuICovCiAjZGVmaW5lIFBSX0FQVFBMX0JVRl9MRU4JCQk4MTkyCiAJdTMyIHByX2FwdHBsX2J1Zl9sZW47CiAJdTMyIHByX2dlbmVyYXRpb247CkBAIC0zOTcsNyArMzg5LDcgQEAKIAogc3RydWN0IHNlX3F1ZXVlX3JlcSB7CiAJaW50CQkJc3RhdGU7Ci0Jdm9pZAkJCSpjbWQ7CisJc3RydWN0IHNlX2NtZAkJKmNtZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXFyX2xpc3Q7CiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIApAQCAtNDA4LDY0ICs0MDAsMTAgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdAl0aHJlYWRfd3E7CiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAotLyoKLSAqIFVzZWQgb25lIHBlciBzdHJ1Y3Qgc2VfY21kIHRvIGhvbGQgYWxsIGV4dHJhIHN0cnVjdCBzZV90YXNrCi0gKiBtZXRhZGF0YS4gIFRoaXMgc3RydWN0dXJlIGlzIHNldHVwIGFuZCBhbGxvY2F0ZWQgaW4KLSAqIGRyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jOl9fdHJhbnNwb3J0X2FsbG9jX3NlX2NtZCgpCi0gKi8KLXN0cnVjdCBzZV90cmFuc3BvcnRfdGFzayB7Ci0JdW5zaWduZWQgY2hhcgkJKnRfdGFza19jZGI7Ci0JdW5zaWduZWQgY2hhcgkJX190X3Rhc2tfY2RiW1RDTV9NQVhfQ09NTUFORF9TSVpFXTsKLQl1bnNpZ25lZCBsb25nIGxvbmcJdF90YXNrX2xiYTsKLQlpbnQJCQl0X3Rhc2tzX2ZhaWxlZDsKLQlpbnQJCQl0X3Rhc2tzX2Z1YTsKLQlib29sCQkJdF90YXNrc19iaWRpOwotCXUzMgkJCXRfdGFza19jZGJzOwotCXUzMgkJCXRfdGFza3NfY2hlY2s7Ci0JdTMyCQkJdF90YXNrc19ubzsKLQl1MzIJCQl0X3Rhc2tzX3NlY3RvcnM7Ci0JdTMyCQkJdF90YXNrc19zZV9udW07Ci0JdTMyCQkJdF90YXNrc19zZV9iaWRpX251bTsKLQl1MzIJCQl0X3Rhc2tzX3NnX2NoYWluZWRfbm87Ci0JYXRvbWljX3QJCXRfZmVfY291bnQ7Ci0JYXRvbWljX3QJCXRfc2VfY291bnQ7Ci0JYXRvbWljX3QJCXRfdGFza19jZGJzX2xlZnQ7Ci0JYXRvbWljX3QJCXRfdGFza19jZGJzX2V4X2xlZnQ7Ci0JYXRvbWljX3QJCXRfdGFza19jZGJzX3RpbWVvdXRfbGVmdDsKLQlhdG9taWNfdAkJdF90YXNrX2NkYnNfc2VudDsKLQlhdG9taWNfdAkJdF90cmFuc3BvcnRfYWJvcnRlZDsKLQlhdG9taWNfdAkJdF90cmFuc3BvcnRfYWN0aXZlOwotCWF0b21pY190CQl0X3RyYW5zcG9ydF9jb21wbGV0ZTsKLQlhdG9taWNfdAkJdF90cmFuc3BvcnRfcXVldWVfYWN0aXZlOwotCWF0b21pY190CQl0X3RyYW5zcG9ydF9zZW50OwotCWF0b21pY190CQl0X3RyYW5zcG9ydF9zdG9wOwotCWF0b21pY190CQl0X3RyYW5zcG9ydF90aW1lb3V0OwotCWF0b21pY190CQl0cmFuc3BvcnRfZGV2X2FjdGl2ZTsKLQlhdG9taWNfdAkJdHJhbnNwb3J0X2x1bl9hY3RpdmU7Ci0JYXRvbWljX3QJCXRyYW5zcG9ydF9sdW5fZmVfc3RvcDsKLQlhdG9taWNfdAkJdHJhbnNwb3J0X2x1bl9zdG9wOwotCXNwaW5sb2NrX3QJCXRfc3RhdGVfbG9jazsKLQlzdHJ1Y3QgY29tcGxldGlvbgl0X3RyYW5zcG9ydF9zdG9wX2NvbXA7Ci0Jc3RydWN0IGNvbXBsZXRpb24JdHJhbnNwb3J0X2x1bl9mZV9zdG9wX2NvbXA7Ci0Jc3RydWN0IGNvbXBsZXRpb24JdHJhbnNwb3J0X2x1bl9zdG9wX2NvbXA7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0CSp0X3Rhc2tzX3NnX2NoYWluZWQ7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0CXRfdGFza3Nfc2dfYm91bmNlOwotCXZvaWQJCQkqdF90YXNrX2J1ZjsKLQkvKgotCSAqIFVzZWQgZm9yIHByZS1yZWdpc3RlcmVkIGZhYnJpYyBTR0wgcGFzc3Rocm91Z2ggV1JJVEUgYW5kIFJFQUQKLQkgKiB3aXRoIHRoZSBzcGVjaWFsIFNDRl9QQVNTVEhST1VHSF9DT05USUdfVE9fU0cgY2FzZSBmb3IgVENNX0xvb3AKLQkgKiBhbmQgb3RoZXIgSFcgdGFyZ2V0IG1vZGUgZmFicmljIG1vZHVsZXMuCi0JICovCi0Jc3RydWN0IHNjYXR0ZXJsaXN0CSp0X3Rhc2tfcHRfc2dsOwotCXN0cnVjdCBsaXN0X2hlYWQJKnRfbWVtX2xpc3Q7Ci0JLyogVXNlZCBmb3IgQklESSBSRUFEICovCi0Jc3RydWN0IGxpc3RfaGVhZAkqdF9tZW1fYmlkaV9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQJdF90YXNrX2xpc3Q7Ci19IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKLQogc3RydWN0IHNlX3Rhc2sgewogCXVuc2lnbmVkIGNoYXIJdGFza19zZW5zZTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnRhc2tfc2c7CisJdTMyCQl0YXNrX3NnX25lbnRzOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqdGFza19zZ19iaWRpOwogCXU4CQl0YXNrX3Njc2lfc3RhdHVzOwogCXU4CQl0YXNrX2ZsYWdzOwpAQCAtNDc2LDggKzQxNCw2IEBACiAJdTMyCQl0YXNrX25vOwogCXUzMgkJdGFza19zZWN0b3JzOwogCXUzMgkJdGFza19zaXplOwotCXUzMgkJdGFza19zZ19udW07Ci0JdTMyCQl0YXNrX3NnX29mZnNldDsKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbgl0YXNrX2RhdGFfZGlyZWN0aW9uOwogCXN0cnVjdCBzZV9jbWQgKnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9kZXZpY2UJKnNlX2RldjsKQEAgLTQ5NSw5ICs0MzEsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdF9zdGF0ZV9saXN0OwogfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKLSNkZWZpbmUgVEFTS19DTUQodGFzaykJKCh0YXNrKS0+dGFza19zZV9jbWQpCi0jZGVmaW5lIFRBU0tfREVWKHRhc2spCSgodGFzayktPnNlX2RldikKLQogc3RydWN0IHNlX2NtZCB7CiAJLyogU0FNIHJlc3BvbnNlIGNvZGUgYmVpbmcgc2VudCB0byBpbml0aWF0b3IgKi8KIAl1OAkJCXNjc2lfc3RhdHVzOwpAQCAtNTMxLDkgKzQ2NCwxMCBAQAogCWF0b21pY190ICAgICAgICAgICAgICAgIHRyYW5zcG9ydF9zZW50OwogCS8qIFVzZWQgZm9yIHNlbnNlIGRhdGEgKi8KIAl2b2lkCQkJKnNlbnNlX2J1ZmZlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXNlX2RlbGF5ZWRfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXNlX29yZGVyZWRfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXNlX2x1bl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJc2VfZGVsYXllZF9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQJc2Vfb3JkZXJlZF9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQJc2VfbHVuX25vZGU7CisJc3RydWN0IGxpc3RfaGVhZAlzZV9xZl9ub2RlOwogCXN0cnVjdCBzZV9kZXZpY2UgICAgICAqc2VfZGV2OwogCXN0cnVjdCBzZV9kZXZfZW50cnkgICAqc2VfZGV2ZTsKIAlzdHJ1Y3Qgc2VfZGV2aWNlCSpzZV9vYmpfcHRyOwpAQCAtNTQyLDE4ICs0NzYsNjIgQEAKIAkvKiBPbmx5IHVzZWQgZm9yIGludGVybmFsIHBhc3N0aHJvdWdoIGFuZCBsZWdhY3kgVENNIGZhYnJpYyBtb2R1bGVzICovCiAJc3RydWN0IHNlX3Nlc3Npb24JKnNlX3Nlc3M7CiAJc3RydWN0IHNlX3Rtcl9yZXEJKnNlX3Rtcl9yZXE7Ci0JLyogdF90YXNrIGlzIHNldHVwIHRvIHRfdGFza19iYWNrc3RvcmUgaW4gdHJhbnNwb3J0X2luaXRfc2VfY21kKCkgKi8KLQlzdHJ1Y3Qgc2VfdHJhbnNwb3J0X3Rhc2sgKnRfdGFzazsKLQlzdHJ1Y3Qgc2VfdHJhbnNwb3J0X3Rhc2sgdF90YXNrX2JhY2tzdG9yZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXNlX3F1ZXVlX25vZGU7CiAJc3RydWN0IHRhcmdldF9jb3JlX2ZhYnJpY19vcHMgKnNlX3RmbzsKIAlpbnQgKCp0cmFuc3BvcnRfZW11bGF0ZV9jZGIpKHN0cnVjdCBzZV9jbWQgKik7Ci0Jdm9pZCAoKnRyYW5zcG9ydF9zcGxpdF9jZGIpKHVuc2lnbmVkIGxvbmcgbG9uZywgdTMyICosIHVuc2lnbmVkIGNoYXIgKik7CisJdm9pZCAoKnRyYW5zcG9ydF9zcGxpdF9jZGIpKHVuc2lnbmVkIGxvbmcgbG9uZywgdTMyLCB1bnNpZ25lZCBjaGFyICopOwogCXZvaWQgKCp0cmFuc3BvcnRfd2FpdF9mb3JfdGFza3MpKHN0cnVjdCBzZV9jbWQgKiwgaW50LCBpbnQpOwogCXZvaWQgKCp0cmFuc3BvcnRfY29tcGxldGVfY2FsbGJhY2spKHN0cnVjdCBzZV9jbWQgKik7Ci19IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwlpbnQgKCp0cmFuc3BvcnRfcWZfY2FsbGJhY2spKHN0cnVjdCBzZV9jbWQgKik7CiAKLSNkZWZpbmUgVF9UQVNLKGNtZCkgICAgICgoY21kKS0+dF90YXNrKQotI2RlZmluZSBDTURfVEZPKGNtZCkJKChjbWQpLT5zZV90Zm8pCisJdW5zaWduZWQgY2hhcgkJKnRfdGFza19jZGI7CisJdW5zaWduZWQgY2hhcgkJX190X3Rhc2tfY2RiW1RDTV9NQVhfQ09NTUFORF9TSVpFXTsKKwl1bnNpZ25lZCBsb25nIGxvbmcJdF90YXNrX2xiYTsKKwlpbnQJCQl0X3Rhc2tzX2ZhaWxlZDsKKwlpbnQJCQl0X3Rhc2tzX2Z1YTsKKwlib29sCQkJdF90YXNrc19iaWRpOworCXUzMgkJCXRfdGFza3Nfc2dfY2hhaW5lZF9ubzsKKwlhdG9taWNfdAkJdF9mZV9jb3VudDsKKwlhdG9taWNfdAkJdF9zZV9jb3VudDsKKwlhdG9taWNfdAkJdF90YXNrX2NkYnNfbGVmdDsKKwlhdG9taWNfdAkJdF90YXNrX2NkYnNfZXhfbGVmdDsKKwlhdG9taWNfdAkJdF90YXNrX2NkYnNfdGltZW91dF9sZWZ0OworCWF0b21pY190CQl0X3Rhc2tfY2Ric19zZW50OworCWF0b21pY190CQl0X3RyYW5zcG9ydF9hYm9ydGVkOworCWF0b21pY190CQl0X3RyYW5zcG9ydF9hY3RpdmU7CisJYXRvbWljX3QJCXRfdHJhbnNwb3J0X2NvbXBsZXRlOworCWF0b21pY190CQl0X3RyYW5zcG9ydF9xdWV1ZV9hY3RpdmU7CisJYXRvbWljX3QJCXRfdHJhbnNwb3J0X3NlbnQ7CisJYXRvbWljX3QJCXRfdHJhbnNwb3J0X3N0b3A7CisJYXRvbWljX3QJCXRfdHJhbnNwb3J0X3RpbWVvdXQ7CisJYXRvbWljX3QJCXRyYW5zcG9ydF9kZXZfYWN0aXZlOworCWF0b21pY190CQl0cmFuc3BvcnRfbHVuX2FjdGl2ZTsKKwlhdG9taWNfdAkJdHJhbnNwb3J0X2x1bl9mZV9zdG9wOworCWF0b21pY190CQl0cmFuc3BvcnRfbHVuX3N0b3A7CisJc3BpbmxvY2tfdAkJdF9zdGF0ZV9sb2NrOworCXN0cnVjdCBjb21wbGV0aW9uCXRfdHJhbnNwb3J0X3N0b3BfY29tcDsKKwlzdHJ1Y3QgY29tcGxldGlvbgl0cmFuc3BvcnRfbHVuX2ZlX3N0b3BfY29tcDsKKwlzdHJ1Y3QgY29tcGxldGlvbgl0cmFuc3BvcnRfbHVuX3N0b3BfY29tcDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnRfdGFza3Nfc2dfY2hhaW5lZDsKKworCS8qCisJICogVXNlZCBmb3IgcHJlLXJlZ2lzdGVyZWQgZmFicmljIFNHTCBwYXNzdGhyb3VnaCBXUklURSBhbmQgUkVBRAorCSAqIHdpdGggdGhlIHNwZWNpYWwgU0NGX1BBU1NUSFJPVUdIX0NPTlRJR19UT19TRyBjYXNlIGZvciBUQ01fTG9vcAorCSAqIGFuZCBvdGhlciBIVyB0YXJnZXQgbW9kZSBmYWJyaWMgbW9kdWxlcy4KKwkgKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnRfdGFza19wdF9zZ2w7CisJdTMyCQkJdF90YXNrX3B0X3NnbF9udW07CisKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnRfZGF0YV9zZzsKKwl1bnNpZ25lZCBpbnQJCXRfZGF0YV9uZW50czsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnRfYmlkaV9kYXRhX3NnOworCXVuc2lnbmVkIGludAkJdF9iaWRpX2RhdGFfbmVudHM7CisKKwkvKiBVc2VkIGZvciBCSURJIFJFQUQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXRfdGFza19saXN0OworCXUzMgkJCXRfdGFza19saXN0X251bTsKKworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKIHN0cnVjdCBzZV90bXJfcmVxIHsKIAkvKiBUYXNrIE1hbmFnZW1lbnQgZnVuY3Rpb24gdG8gYmUgcHJlZm9ybWVkICovCkBAIC02MTcsOSArNTk1LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNlc3NfYWNsX2xpc3Q7CiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAotI2RlZmluZSBTRV9TRVNTKGNtZCkJCSgoY21kKS0+c2Vfc2VzcykKLSNkZWZpbmUgU0VfTk9ERV9BQ0woc2VzcykJKChzZXNzKS0+c2Vfbm9kZV9hY2wpCi0KIHN0cnVjdCBzZV9kZXZpY2U7CiBzdHJ1Y3Qgc2VfdHJhbnNmb3JtX2luZm87CiBzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CkBAIC02NDAsOCArNjE1LDYgQEAKIAlzdHJ1Y3Qgc2VfbWxfc3RhdF9ncnBzCW1sX3N0YXRfZ3JwczsKIH0gIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAotI2RlZmluZSBNTF9TVEFUX0dSUFMobGFjbCkJKCYobGFjbCktPm1sX3N0YXRfZ3JwcykKLQogc3RydWN0IHNlX2Rldl9lbnRyeSB7CiAJYm9vbAkJCWRlZl9wcl9yZWdpc3RlcmVkOwogCS8qIFNlZSB0cmFuc3BvcnRfbHVuZmxhZ3NfdGFibGUgKi8KQEAgLTY4OCw2ICs2NjEsOCBAQAogCWludAkJZW11bGF0ZV9yZXNlcnZhdGlvbnM7CiAJaW50CQllbXVsYXRlX2FsdWE7CiAJaW50CQllbmZvcmNlX3ByX2lzaWRzOworCWludAkJaXNfbm9ucm90OworCWludAkJZW11bGF0ZV9yZXN0X3Jlb3JkOwogCXUzMgkJaHdfYmxvY2tfc2l6ZTsKIAl1MzIJCWJsb2NrX3NpemU7CiAJdTMyCQlod19tYXhfc2VjdG9yczsKQEAgLTcyNywxMCArNzAyLDEwIEBACiAJLyogVDEwIElucXVpcnkgYW5kIFZQRCBXV04gSW5mb3JtYXRpb24gKi8KIAlzdHJ1Y3QgdDEwX3d3bgl0MTBfd3duOwogCS8qIFQxMCBTUEMtMiArIFNQQy0zIFJlc2VydmF0aW9ucyAqLwotCXN0cnVjdCB0MTBfcmVzZXJ2YXRpb25fdGVtcGxhdGUgdDEwX3Jlc2VydmF0aW9uOworCXN0cnVjdCB0MTBfcmVzZXJ2YXRpb24gdDEwX3ByOwogCXNwaW5sb2NrX3QgICAgICBzZV9kZXZfbG9jazsKIAl2b2lkICAgICAgICAgICAgKnNlX2Rldl9zdV9wdHI7Ci0Jc3RydWN0IGxpc3RfaGVhZCBnX3NlX2Rldl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgc2VfZGV2X25vZGU7CiAJc3RydWN0IGNvbmZpZ19ncm91cCBzZV9kZXZfZ3JvdXA7CiAJLyogRm9yIFQxMCBSZXNlcnZhdGlvbnMgKi8KIAlzdHJ1Y3QgY29uZmlnX2dyb3VwIHNlX2Rldl9wcl9ncm91cDsKQEAgLTczOCwxMSArNzEzLDYgQEAKIAlzdHJ1Y3Qgc2VfZGV2X3N0YXRfZ3JwcyBkZXZfc3RhdF9ncnBzOwogfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKLSNkZWZpbmUgVDEwX0FMVUEoc3VfZGV2KQkoJihzdV9kZXYpLT50MTBfYWx1YSkKLSNkZWZpbmUgVDEwX1JFUyhzdV9kZXYpCQkoJihzdV9kZXYpLT50MTBfcmVzZXJ2YXRpb24pCi0jZGVmaW5lIFQxMF9QUl9PUFMoc3VfZGV2KQkoJihzdV9kZXYpLT50MTBfcmVzZXJ2YXRpb24ucHJfb3BzKQotI2RlZmluZSBERVZfU1RBVF9HUlAoZGV2KQkoJihkZXYpLT5kZXZfc3RhdF9ncnBzKQotCiBzdHJ1Y3Qgc2VfZGV2aWNlIHsKIAkvKiBTZXQgdG8gMSBpZiB0aHJlYWQgaXMgTk9UIHNsZWVwaW5nIG9uIHRocmVhZF9zZW0gKi8KIAl1OAkJCXRocmVhZF9hY3RpdmU7CkBAIC03ODAsMTEgKzc1MCwxMSBAQAogCWF0b21pY190CQlkZXZfc3RhdHVzX3Rocl9jb3VudDsKIAlhdG9taWNfdAkJZGV2X2hvcV9jb3VudDsKIAlhdG9taWNfdAkJZGV2X29yZGVyZWRfc3luYzsKKwlhdG9taWNfdAkJZGV2X3FmX2NvdW50OwogCXN0cnVjdCBzZV9vYmoJCWRldl9vYmo7CiAJc3RydWN0IHNlX29iagkJZGV2X2FjY2Vzc19vYmo7CiAJc3RydWN0IHNlX29iagkJZGV2X2V4cG9ydF9vYmo7Ci0Jc3RydWN0IHNlX3F1ZXVlX29iagkqZGV2X3F1ZXVlX29iajsKLQlzdHJ1Y3Qgc2VfcXVldWVfb2JqCSpkZXZfc3RhdHVzX3F1ZXVlX29iajsKKwlzdHJ1Y3Qgc2VfcXVldWVfb2JqCWRldl9xdWV1ZV9vYmo7CiAJc3BpbmxvY2tfdAkJZGVsYXllZF9jbWRfbG9jazsKIAlzcGlubG9ja190CQlvcmRlcmVkX2NtZF9sb2NrOwogCXNwaW5sb2NrX3QJCWV4ZWN1dGVfdGFza19sb2NrOwpAQCAtNzk2LDYgKzc2Niw3IEBACiAJc3BpbmxvY2tfdAkJZGV2X3N0YXR1c190aHJfbG9jazsKIAlzcGlubG9ja190CQlzZV9wb3J0X2xvY2s7CiAJc3BpbmxvY2tfdAkJc2VfdG1yX2xvY2s7CisJc3BpbmxvY2tfdAkJcWZfY21kX2xvY2s7CiAJLyogVXNlZCBmb3IgbGVnYWN5IFNQQy0yIHJlc2VydmF0aW9uc2EgKi8KIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wJKmRldl9yZXNlcnZlZF9ub2RlX2FjbDsKIAkvKiBVc2VkIGZvciBBTFVBIExvZ2ljYWwgVW5pdCBHcm91cCBtZW1iZXJzaGlwICovCkBAIC04MDksMTAgKzc4MCwxMiBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdAkqcHJvY2Vzc190aHJlYWQ7CiAJcGlkX3QJCQlwcm9jZXNzX3RocmVhZF9waWQ7CiAJc3RydWN0IHRhc2tfc3RydWN0CQkqZGV2X21nbXRfdGhyZWFkOworCXN0cnVjdCB3b3JrX3N0cnVjdAlxZl93b3JrX3F1ZXVlOwogCXN0cnVjdCBsaXN0X2hlYWQJZGVsYXllZF9jbWRfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCW9yZGVyZWRfY21kX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZAlleGVjdXRlX3Rhc2tfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXN0YXRlX3Rhc2tfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXFmX2NtZF9saXN0OwogCS8qIFBvaW50ZXIgdG8gYXNzb2NpYXRlZCBTRSBIQkEgKi8KIAlzdHJ1Y3Qgc2VfaGJhCQkqc2VfaGJhOwogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzZV9zdWJfZGV2OwpAQCAtODI0LDExICs3OTcsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQJZ19zZV9kZXZfbGlzdDsKIH0gIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAotI2RlZmluZSBTRV9ERVYoY21kKQkJKChjbWQpLT5zZV9sdW4tPmx1bl9zZV9kZXYpCi0jZGVmaW5lIFNVX0RFVihkZXYpCQkoKGRldiktPnNlX3N1Yl9kZXYpCi0jZGVmaW5lIERFVl9BVFRSSUIoZGV2KQkJKCYoZGV2KS0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYikKLSNkZWZpbmUgREVWX1QxMF9XV04oZGV2KQkoJihkZXYpLT5zZV9zdWJfZGV2LT50MTBfd3duKQotCiBzdHJ1Y3Qgc2VfaGJhIHsKIAl1MTYJCQloYmFfdHBndDsKIAl1MzIJCQloYmFfaWQ7CkBAIC04MzcsMjQgKzgwNSwxNyBAQAogCS8qIFZpcnR1YWwgaVNDU0kgZGV2aWNlcyBhdHRhY2hlZC4gKi8KIAl1MzIJCQlkZXZfY291bnQ7CiAJdTMyCQkJaGJhX2luZGV4OwotCWF0b21pY190CQlsb2FkX2JhbGFuY2VfcXVldWU7Ci0JYXRvbWljX3QJCWxlZnRfcXVldWVfZGVwdGg7Ci0JLyogTWF4aW11bSBxdWV1ZSBkZXB0aCB0aGUgSEJBIGNhbiBoYW5kbGUuICovCi0JYXRvbWljX3QJCW1heF9xdWV1ZV9kZXB0aDsKIAkvKiBQb2ludGVyIHRvIHRyYW5zcG9ydCBzcGVjaWZpYyBob3N0IHN0cnVjdHVyZS4gKi8KIAl2b2lkCQkJKmhiYV9wdHI7CiAJLyogTGlua2VkIGxpc3QgZm9yIHN0cnVjdCBzZV9kZXZpY2UgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWhiYV9kZXZfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWhiYV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJaGJhX25vZGU7CiAJc3BpbmxvY2tfdAkJZGV2aWNlX2xvY2s7Ci0Jc3BpbmxvY2tfdAkJaGJhX3F1ZXVlX2xvY2s7CiAJc3RydWN0IGNvbmZpZ19ncm91cAloYmFfZ3JvdXA7CiAJc3RydWN0IG11dGV4CQloYmFfYWNjZXNzX211dGV4OwogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fYXBpICp0cmFuc3BvcnQ7CiB9ICBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKLSNkZWZpbmUgU0VfSEJBKGRldikJCSgoZGV2KS0+c2VfaGJhKQotCiBzdHJ1Y3Qgc2VfcG9ydF9zdGF0X2dycHMgewogCXN0cnVjdCBjb25maWdfZ3JvdXAgc3RhdF9ncm91cDsKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwIHNjc2lfcG9ydF9ncm91cDsKQEAgLTg4MSw5ICs4NDIsNiBAQAogCXN0cnVjdCBzZV9wb3J0X3N0YXRfZ3JwcyBwb3J0X3N0YXRfZ3JwczsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCi0jZGVmaW5lIFNFX0xVTihjbWQpCQkoKGNtZCktPnNlX2x1bikKLSNkZWZpbmUgUE9SVF9TVEFUX0dSUChsdW4pCSgmKGx1biktPnBvcnRfc3RhdF9ncnBzKQotCiBzdHJ1Y3Qgc2NzaV9wb3J0X3N0YXRzIHsKICAgICAgICB1NjQgICAgIGNtZF9wZHVzOwogICAgICAgIHU2NCAgICAgdHhfZGF0YV9vY3RldHM7CkBAIC05MzAsNyArODg4LDcgQEAKIAlzcGlubG9ja190CQl0cGdfbHVuX2xvY2s7CiAJLyogUG9pbnRlciB0byAkRkFCUklDX01PRCBwb3J0YWwgZ3JvdXAgKi8KIAl2b2lkCQkJKnNlX3RwZ19mYWJyaWNfcHRyOwotCXN0cnVjdCBsaXN0X2hlYWQJc2VfdHBnX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlzZV90cGdfbm9kZTsKIAkvKiBsaW5rZWQgbGlzdCBmb3IgaW5pdGlhdG9yIEFDTCBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZAlhY2xfbm9kZV9saXN0OwogCXN0cnVjdCBzZV9sdW4JCSp0cGdfbHVuX2xpc3Q7CkBAIC05NDksOCArOTA3LDYgQEAKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwCXRwZ19wYXJhbV9ncm91cDsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCi0jZGVmaW5lIFRQR19URk8oc2VfdHBnKQkoKHNlX3RwZyktPnNlX3RwZ190Zm8pCi0KIHN0cnVjdCBzZV93d24gewogCXN0cnVjdCB0YXJnZXRfZmFicmljX2NvbmZpZ2ZzICp3d25fdGY7CiAJc3RydWN0IGNvbmZpZ19ncm91cAl3d25fZ3JvdXA7CkBAIC05NTgsMjggKzkxNCw0IEBACiAJc3RydWN0IGNvbmZpZ19ncm91cAlmYWJyaWNfc3RhdF9ncm91cDsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCi1zdHJ1Y3Qgc2VfZ2xvYmFsIHsKLQl1MTYJCQlhbHVhX2x1X2dwc19jb3VudGVyOwotCWludAkJCWdfc3ViX2FwaV9pbml0aWFsaXplZDsKLQl1MzIJCQlpbl9zaHV0ZG93bjsKLQl1MzIJCQlhbHVhX2x1X2dwc19jb3VudDsKLQl1MzIJCQlnX2hiYV9pZF9jb3VudGVyOwotCXN0cnVjdCBjb25maWdfZ3JvdXAJdGFyZ2V0X2NvcmVfaGJhZ3JvdXA7Ci0Jc3RydWN0IGNvbmZpZ19ncm91cAlhbHVhX2dyb3VwOwotCXN0cnVjdCBjb25maWdfZ3JvdXAJYWx1YV9sdV9ncHNfZ3JvdXA7Ci0Jc3RydWN0IGxpc3RfaGVhZAlnX2x1X2dwc19saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQJZ19zZV90cGdfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWdfaGJhX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZAlnX3NlX2Rldl9saXN0OwotCXN0cnVjdCBzZV9oYmEJCSpnX2x1bjBfaGJhOwotCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpnX2x1bjBfc3VfZGV2OwotCXN0cnVjdCBzZV9kZXZpY2UJKmdfbHVuMF9kZXY7Ci0Jc3RydWN0IHQxMF9hbHVhX2x1X2dwCSpkZWZhdWx0X2x1X2dwOwotCXNwaW5sb2NrX3QJCWdfZGV2aWNlX2xvY2s7Ci0Jc3BpbmxvY2tfdAkJaGJhX2xvY2s7Ci0Jc3BpbmxvY2tfdAkJc2VfdHBnX2xvY2s7Ci0Jc3BpbmxvY2tfdAkJbHVfZ3BzX2xvY2s7Ci0Jc3BpbmxvY2tfdAkJcGx1Z2luX2NsYXNzX2xvY2s7Ci19IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKLQogI2VuZGlmIC8qIFRBUkdFVF9DT1JFX0JBU0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmggYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaAppbmRleCA1MmIxOGE1Li40NjU3MTkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaApAQCAtMSw4ICsxLDggQEAKICNpZm5kZWYgVEFSR0VUX0NPUkVfREVWSUNFX0gKICNkZWZpbmUgVEFSR0VUX0NPUkVfREVWSUNFX0gKIAotZXh0ZXJuIGludCB0cmFuc3BvcnRfZ2V0X2x1bl9mb3JfY21kKHN0cnVjdCBzZV9jbWQgKiwgdW5zaWduZWQgY2hhciAqLCB1MzIpOwotZXh0ZXJuIGludCB0cmFuc3BvcnRfZ2V0X2x1bl9mb3JfdG1yKHN0cnVjdCBzZV9jbWQgKiwgdTMyKTsKK2V4dGVybiBpbnQgdHJhbnNwb3J0X2xvb2t1cF9jbWRfbHVuKHN0cnVjdCBzZV9jbWQgKiwgdTMyKTsKK2V4dGVybiBpbnQgdHJhbnNwb3J0X2xvb2t1cF90bXJfbHVuKHN0cnVjdCBzZV9jbWQgKiwgdTMyKTsKIGV4dGVybiBzdHJ1Y3Qgc2VfZGV2X2VudHJ5ICpjb3JlX2dldF9zZV9kZXZlX2Zyb21fcnRwaSgKIAkJCQkJc3RydWN0IHNlX25vZGVfYWNsICosIHUxNik7CiBleHRlcm4gaW50IGNvcmVfZnJlZV9kZXZpY2VfbGlzdF9mb3Jfbm9kZShzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKiwKQEAgLTM5LDYgKzM5LDggQEAKIGV4dGVybiBpbnQgc2VfZGV2X3NldF9lbXVsYXRlX3RwdShzdHJ1Y3Qgc2VfZGV2aWNlICosIGludCk7CiBleHRlcm4gaW50IHNlX2Rldl9zZXRfZW11bGF0ZV90cHdzKHN0cnVjdCBzZV9kZXZpY2UgKiwgaW50KTsKIGV4dGVybiBpbnQgc2VfZGV2X3NldF9lbmZvcmNlX3ByX2lzaWRzKHN0cnVjdCBzZV9kZXZpY2UgKiwgaW50KTsKK2V4dGVybiBpbnQgc2VfZGV2X3NldF9pc19ub25yb3Qoc3RydWN0IHNlX2RldmljZSAqLCBpbnQpOworZXh0ZXJuIGludCBzZV9kZXZfc2V0X2VtdWxhdGVfcmVzdF9yZW9yZChzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsIGludCk7CiBleHRlcm4gaW50IHNlX2Rldl9zZXRfcXVldWVfZGVwdGgoc3RydWN0IHNlX2RldmljZSAqLCB1MzIpOwogZXh0ZXJuIGludCBzZV9kZXZfc2V0X21heF9zZWN0b3JzKHN0cnVjdCBzZV9kZXZpY2UgKiwgdTMyKTsKIGV4dGVybiBpbnQgc2VfZGV2X3NldF9vcHRpbWFsX3NlY3RvcnMoc3RydWN0IHNlX2RldmljZSAqLCB1MzIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfZmFicmljX29wcy5oIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfZmFicmljX29wcy5oCmluZGV4IDc0N2UxNDAuLjJkZThmZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpY19vcHMuaAorKysgYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfb3BzLmgKQEAgLTM5LDE3ICszOSwxMSBAQAogCSAqLwogCWludCAoKm5ld19jbWRfbWFwKShzdHJ1Y3Qgc2VfY21kICopOwogCS8qCi0JICogT3B0aW9uYWwgZnVuY3Rpb24gcG9pbnRlciBmb3IgVENNIGZhYnJpYyBtb2R1bGVzIHRoYXQgdXNlCi0JICogTGludXgvTkVUIHNvY2tldHMgdG8gYWxsb2NhdGUgc3RydWN0IGlvdmVjIGFycmF5IHRvIHN0cnVjdCBzZV9jbWQKLQkgKi8KLQlpbnQgKCphbGxvY19jbWRfaW92ZWNzKShzdHJ1Y3Qgc2VfY21kICopOwotCS8qCiAJICogT3B0aW9uYWwgdG8gcmVsZWFzZSBzdHJ1Y3Qgc2VfY21kIGFuZCBmYWJyaWMgZGVwZW5kZW50IGFsbG9jYXRlZAogCSAqIEkvTyBkZXNjcmlwdG9yIGluIHRyYW5zcG9ydF9jbWRfY2hlY2tfc3RvcCgpCiAJICovCiAJdm9pZCAoKmNoZWNrX3N0b3BfZnJlZSkoc3RydWN0IHNlX2NtZCAqKTsKLQl2b2lkICgqcmVsZWFzZV9jbWRfdG9fcG9vbCkoc3RydWN0IHNlX2NtZCAqKTsKLQl2b2lkICgqcmVsZWFzZV9jbWRfZGlyZWN0KShzdHJ1Y3Qgc2VfY21kICopOworCXZvaWQgKCpyZWxlYXNlX2NtZCkoc3RydWN0IHNlX2NtZCAqKTsKIAkvKgogCSAqIENhbGxlZCB3aXRoIHNwaW5fbG9ja19iaChzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwLT5zZXNzaW9uX2xvY2sgaGVsZC4KIAkgKi8KQEAgLTcwLDcgKzY0LDYgQEAKIAl2b2lkICgqc2V0X2RlZmF1bHRfbm9kZV9hdHRyaWJ1dGVzKShzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKik7CiAJdTMyICgqZ2V0X3Rhc2tfdGFnKShzdHJ1Y3Qgc2VfY21kICopOwogCWludCAoKmdldF9jbWRfc3RhdGUpKHN0cnVjdCBzZV9jbWQgKik7Ci0Jdm9pZCAoKm5ld19jbWRfZmFpbHVyZSkoc3RydWN0IHNlX2NtZCAqKTsKIAlpbnQgKCpxdWV1ZV9kYXRhX2luKShzdHJ1Y3Qgc2VfY21kICopOwogCWludCAoKnF1ZXVlX3N0YXR1cykoc3RydWN0IHNlX2NtZCAqKTsKIAlpbnQgKCpxdWV1ZV90bV9yc3ApKHN0cnVjdCBzZV9jbWQgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuaCBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5oCmluZGV4IDI0YTFjNmMuLjQ2YWFlNGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5oCisrKyBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5oCkBAIC0xMDEsNiArMTAxLDEwIEBACiAjZGVmaW5lIERBX0VORk9SQ0VfUFJfSVNJRFMJCQkxCiAjZGVmaW5lIERBX1NUQVRVU19NQVhfU0VDVE9SU19NSU4JCTE2CiAjZGVmaW5lIERBX1NUQVRVU19NQVhfU0VDVE9SU19NQVgJCTgxOTIKKy8qIEJ5IGRlZmF1bHQgZG9uJ3QgcmVwb3J0IG5vbi1yb3RhdGluZyAoc29saWQgc3RhdGUpIG1lZGl1bSAqLworI2RlZmluZSBEQV9JU19OT05ST1QJCQkJMAorLyogUXVldWUgQWxnb3JpdGhtIE1vZGlmaWVyIGRlZmF1bHQgZm9yIHJlc3RyaWN0ZWQgcmVvcmRlcmluZyBpbiBjb250cm9sIG1vZGUgcGFnZSAqLworI2RlZmluZSBEQV9FTVVMQVRFX1JFU1RfUkVPUkQJCQkwCiAKICNkZWZpbmUgU0VfTU9ERV9QQUdFX0JVRgkJCTUxMgogCkBAIC0xMTEsOSArMTE1LDggQEAKIAogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpzZV9tZW1fY2FjaGU7CiAKLWV4dGVybiBpbnQgaW5pdF9zZV9nbG9iYWwodm9pZCk7Ci1leHRlcm4gdm9pZCByZWxlYXNlX3NlX2dsb2JhbCh2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRfc2NzaV9pbmRleF90YWJsZSh2b2lkKTsKK2V4dGVybiBpbnQgaW5pdF9zZV9rbWVtX2NhY2hlcyh2b2lkKTsKK2V4dGVybiB2b2lkIHJlbGVhc2Vfc2Vfa21lbV9jYWNoZXModm9pZCk7CiBleHRlcm4gdTMyIHNjc2lfZ2V0X25ld19pbmRleChzY3NpX2luZGV4X3QpOwogZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X2luaXRfcXVldWVfb2JqKHN0cnVjdCBzZV9xdWV1ZV9vYmogKik7CiBleHRlcm4gaW50IHRyYW5zcG9ydF9zdWJzeXN0ZW1fY2hlY2tfaW5pdCh2b2lkKTsKQEAgLTE2MCwzNiArMTYzLDM4IEBACiAJCQkJCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICosIHUzMiwKIAkJCQkJdm9pZCAqLCBzdHJ1Y3Qgc2VfZGV2X2xpbWl0cyAqLAogCQkJCQljb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gdm9pZCB0cmFuc3BvcnRfZGV2aWNlX3NldHVwX2NtZChzdHJ1Y3Qgc2VfY21kICopOwogZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X2luaXRfc2VfY21kKHN0cnVjdCBzZV9jbWQgKiwKIAkJCQkJc3RydWN0IHRhcmdldF9jb3JlX2ZhYnJpY19vcHMgKiwKIAkJCQkJc3RydWN0IHNlX3Nlc3Npb24gKiwgdTMyLCBpbnQsIGludCwKIAkJCQkJdW5zaWduZWQgY2hhciAqKTsKK3ZvaWQgKnRyYW5zcG9ydF9rbWFwX2ZpcnN0X2RhdGFfcGFnZShzdHJ1Y3Qgc2VfY21kICpjbWQpOwordm9pZCB0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShzdHJ1Y3Qgc2VfY21kICpjbWQpOwogZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X2ZyZWVfc2VfY21kKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gaW50IHRyYW5zcG9ydF9nZW5lcmljX2FsbG9jYXRlX3Rhc2tzKHN0cnVjdCBzZV9jbWQgKiwgdW5zaWduZWQgY2hhciAqKTsKIGV4dGVybiBpbnQgdHJhbnNwb3J0X2dlbmVyaWNfaGFuZGxlX2NkYihzdHJ1Y3Qgc2VfY21kICopOworZXh0ZXJuIGludCB0cmFuc3BvcnRfaGFuZGxlX2NkYl9kaXJlY3Qoc3RydWN0IHNlX2NtZCAqKTsKIGV4dGVybiBpbnQgdHJhbnNwb3J0X2dlbmVyaWNfaGFuZGxlX2NkYl9tYXAoc3RydWN0IHNlX2NtZCAqKTsKIGV4dGVybiBpbnQgdHJhbnNwb3J0X2dlbmVyaWNfaGFuZGxlX2RhdGEoc3RydWN0IHNlX2NtZCAqKTsKIGV4dGVybiB2b2lkIHRyYW5zcG9ydF9uZXdfY21kX2ZhaWx1cmUoc3RydWN0IHNlX2NtZCAqKTsKIGV4dGVybiBpbnQgdHJhbnNwb3J0X2dlbmVyaWNfaGFuZGxlX3RtcihzdHJ1Y3Qgc2VfY21kICopOwogZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWRfaW50cihzdHJ1Y3Qgc2VfY21kICopOwogZXh0ZXJuIHZvaWQgX190cmFuc3BvcnRfc3RvcF90YXNrX3RpbWVyKHN0cnVjdCBzZV90YXNrICosIHVuc2lnbmVkIGxvbmcgKik7Ci1leHRlcm4gdW5zaWduZWQgY2hhciB0cmFuc3BvcnRfYXNjaWloZXhfdG9fYmluYXJ5aGV4KHVuc2lnbmVkIGNoYXIgdmFsWzJdKTsKIGV4dGVybiBpbnQgdHJhbnNwb3J0X2dlbmVyaWNfbWFwX21lbV90b19jbWQoc3RydWN0IHNlX2NtZCAqY21kLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgdTMyLAogCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqLCB1MzIpOwogZXh0ZXJuIGludCB0cmFuc3BvcnRfY2xlYXJfbHVuX2Zyb21fc2Vzc2lvbnMoc3RydWN0IHNlX2x1biAqKTsKIGV4dGVybiBpbnQgdHJhbnNwb3J0X2NoZWNrX2Fib3J0ZWRfc3RhdHVzKHN0cnVjdCBzZV9jbWQgKiwgaW50KTsKIGV4dGVybiBpbnQgdHJhbnNwb3J0X3NlbmRfY2hlY2tfY29uZGl0aW9uX2FuZF9zZW5zZShzdHJ1Y3Qgc2VfY21kICosIHU4LCBpbnQpOwogZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X3NlbmRfdGFza19hYm9ydChzdHJ1Y3Qgc2VfY21kICopOwotZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X3JlbGVhc2VfY21kX3RvX3Bvb2woc3RydWN0IHNlX2NtZCAqKTsKLWV4dGVybiB2b2lkIHRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKHN0cnVjdCBzZV9jbWQgKiwgaW50LCBpbnQsIGludCk7CitleHRlcm4gdm9pZCB0cmFuc3BvcnRfcmVsZWFzZV9jbWQoc3RydWN0IHNlX2NtZCAqKTsKK2V4dGVybiB2b2lkIHRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKHN0cnVjdCBzZV9jbWQgKiwgaW50LCBpbnQpOwogZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X2dlbmVyaWNfd2FpdF9mb3JfY21kcyhzdHJ1Y3Qgc2VfY21kICosIGludCk7Ci1leHRlcm4gdTMyIHRyYW5zcG9ydF9jYWxjX3NnX251bShzdHJ1Y3Qgc2VfdGFzayAqLCBzdHJ1Y3Qgc2VfbWVtICosIHUzMik7CitleHRlcm4gaW50IHRyYW5zcG9ydF9pbml0X3Rhc2tfc2coc3RydWN0IHNlX3Rhc2sgKiwgc3RydWN0IHNlX21lbSAqLCB1MzIpOwogZXh0ZXJuIGludCB0cmFuc3BvcnRfbWFwX21lbV90b19zZyhzdHJ1Y3Qgc2VfdGFzayAqLCBzdHJ1Y3QgbGlzdF9oZWFkICosCi0JCQkJCXZvaWQgKiwgc3RydWN0IHNlX21lbSAqLAorCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgc3RydWN0IHNlX21lbSAqLAogCQkJCQlzdHJ1Y3Qgc2VfbWVtICoqLCB1MzIgKiwgdTMyICopOwogZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X2RvX3Rhc2tfc2dfY2hhaW4oc3RydWN0IHNlX2NtZCAqKTsKIGV4dGVybiB2b2lkIHRyYW5zcG9ydF9nZW5lcmljX3Byb2Nlc3Nfd3JpdGUoc3RydWN0IHNlX2NtZCAqKTsKK2V4dGVybiBpbnQgdHJhbnNwb3J0X2dlbmVyaWNfbmV3X2NtZChzdHJ1Y3Qgc2VfY21kICopOwogZXh0ZXJuIGludCB0cmFuc3BvcnRfZ2VuZXJpY19kb190bXIoc3RydWN0IHNlX2NtZCAqKTsKIC8qIEZyb20gdGFyZ2V0X2NvcmVfYWx1YS5jICovCiBleHRlcm4gaW50IGNvcmVfYWx1YV9jaGVja19ub25vcF9kZWxheShzdHJ1Y3Qgc2VfY21kICopOwpAQCAtMjM1LDEzICsyNDAsMTMgQEAKIAkgKi8KIAlpbnQgKCpjZGJfbm9uZSkoc3RydWN0IHNlX3Rhc2sgKik7CiAJLyoKLQkgKiBGb3IgU0NGX1NDU0lfQ09OVFJPTF9OT05TR19JT19DREIKKwkgKiBGb3IgU0NGX1NDU0lfREFUQV9TR19JT19DREIKIAkgKi8KLQlpbnQgKCptYXBfdGFza19ub25fU0cpKHN0cnVjdCBzZV90YXNrICopOworCWludCAoKm1hcF9kYXRhX1NHKShzdHJ1Y3Qgc2VfdGFzayAqKTsKIAkvKgotCSAqIEZvciBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQiBhbmQgU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREIKKwkgKiBGb3IgU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREIKIAkgKi8KLQlpbnQgKCptYXBfdGFza19TRykoc3RydWN0IHNlX3Rhc2sgKik7CisJaW50ICgqbWFwX2NvbnRyb2xfU0cpKHN0cnVjdCBzZV90YXNrICopOwogCS8qCiAJICogYXR0YWNoX2hiYSgpOgogCSAqLwpAQCAtMjkyLDcgKzI5Nyw3IEBACiAJICogZHJpdmVycy4gIFByb3ZpZGVkIG91dCBvZiBjb252ZW5pZW5jZS4KIAkgKi8KIAlpbnQgKCp0cmFuc3BvcnRfY29tcGxldGUpKHN0cnVjdCBzZV90YXNrICp0YXNrKTsKLQlzdHJ1Y3Qgc2VfdGFzayAqKCphbGxvY190YXNrKShzdHJ1Y3Qgc2VfY21kICopOworCXN0cnVjdCBzZV90YXNrICooKmFsbG9jX3Rhc2spKHVuc2lnbmVkIGNoYXIgKmNkYik7CiAJLyoKIAkgKiBkb190YXNrKCk6CiAJICovCkBAIC0zNDIsMTkgKzM0Nyw5IEBACiAJICovCiAJc2VjdG9yX3QgKCpnZXRfYmxvY2tzKShzdHJ1Y3Qgc2VfZGV2aWNlICopOwogCS8qCi0JICogZG9fc2VfbWVtX21hcCgpOgotCSAqLwotCWludCAoKmRvX3NlX21lbV9tYXApKHN0cnVjdCBzZV90YXNrICosIHN0cnVjdCBsaXN0X2hlYWQgKiwgdm9pZCAqLAotCQkJCXN0cnVjdCBzZV9tZW0gKiwgc3RydWN0IHNlX21lbSAqKiwgdTMyICosIHUzMiAqKTsKLQkvKgogCSAqIGdldF9zZW5zZV9idWZmZXIoKToKIAkgKi8KIAl1bnNpZ25lZCBjaGFyICooKmdldF9zZW5zZV9idWZmZXIpKHN0cnVjdCBzZV90YXNrICopOwogfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKLSNkZWZpbmUgVFJBTlNQT1JUKGRldikJCSgoZGV2KS0+dHJhbnNwb3J0KQotI2RlZmluZSBIQkFfVFJBTlNQT1JUKGhiYSkJKChoYmEpLT50cmFuc3BvcnQpCi0KLWV4dGVybiBzdHJ1Y3Qgc2VfZ2xvYmFsICpzZV9nbG9iYWw7Ci0KICNlbmRpZiAvKiBUQVJHRVRfQ09SRV9UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvYXNvYy5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYXNvYy5oCmluZGV4IGFlOTczZDIuLjYwM2Y1YTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Fzb2MuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9hc29jLmgKQEAgLTksNiArOSw3IEBACiAKIHN0cnVjdCBzbmRfc29jX2phY2s7CiBzdHJ1Y3Qgc25kX3NvY19jb2RlYzsKK3N0cnVjdCBzbmRfc29jX3BsYXRmb3JtOwogc3RydWN0IHNuZF9zb2NfY2FyZDsKIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0OwogCkBAIC01OSw2ICs2MCw1MCBAQAogCiApOwogCitERUNMQVJFX0VWRU5UX0NMQVNTKHNuZF9zb2NfcHJlZywKKworCVRQX1BST1RPKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSwgdW5zaWduZWQgaW50IHJlZywKKwkJIHVuc2lnbmVkIGludCB2YWwpLAorCisJVFBfQVJHUyhwbGF0Zm9ybSwgcmVnLCB2YWwpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoCW5hbWUsCQlwbGF0Zm9ybS0+bmFtZQkpCisJCV9fZmllbGQoCWludCwJCWlkCQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJcmVnCQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJdmFsCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIobmFtZSwgcGxhdGZvcm0tPm5hbWUpOworCQlfX2VudHJ5LT5pZCA9IHBsYXRmb3JtLT5pZDsKKwkJX19lbnRyeS0+cmVnID0gcmVnOworCQlfX2VudHJ5LT52YWwgPSB2YWw7CisJKSwKKworCVRQX3ByaW50aygicGxhdGZvcm09JXMuJWQgcmVnPSV4IHZhbD0leCIsIF9fZ2V0X3N0cihuYW1lKSwKKwkJICAoaW50KV9fZW50cnktPmlkLCAodW5zaWduZWQgaW50KV9fZW50cnktPnJlZywKKwkJICAodW5zaWduZWQgaW50KV9fZW50cnktPnZhbCkKKyk7CisKK0RFRklORV9FVkVOVChzbmRfc29jX3ByZWcsIHNuZF9zb2NfcHJlZ193cml0ZSwKKworCVRQX1BST1RPKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSwgdW5zaWduZWQgaW50IHJlZywKKwkJIHVuc2lnbmVkIGludCB2YWwpLAorCisJVFBfQVJHUyhwbGF0Zm9ybSwgcmVnLCB2YWwpCisKKyk7CisKK0RFRklORV9FVkVOVChzbmRfc29jX3ByZWcsIHNuZF9zb2NfcHJlZ19yZWFkLAorCisJVFBfUFJPVE8oc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkgdW5zaWduZWQgaW50IHZhbCksCisKKwlUUF9BUkdTKHBsYXRmb3JtLCByZWcsIHZhbCkKKworKTsKKwogREVDTEFSRV9FVkVOVF9DTEFTUyhzbmRfc29jX2NhcmQsCiAKIAlUUF9QUk9UTyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLCBpbnQgdmFsKSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaAppbmRleCBlMDk1OTJkLi41Y2UyYjJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oCkBAIC0yNiw3ICsyNiw3IEBACiAJCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCiAJCV9fZmllbGQoCXVpZF90LAl1aWQJCQkpCiAJCV9fZmllbGQoCWdpZF90LAlnaWQJCQkpCi0JCV9fZmllbGQoCWJsa2NudF90LCBibG9ja3MJCSkKKwkJX19maWVsZCgJX191NjQsIGJsb2NrcwkJCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCkBAIC00MCw5ICs0MCw4IEBACiAKIAlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IG1vZGUgMCVvIHVpZCAldSBnaWQgJXUgYmxvY2tzICVsbHUiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCi0JCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICBfX2VudHJ5LT5tb2RlLCBfX2VudHJ5LT51aWQsIF9fZW50cnktPmdpZCwKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5ibG9ja3MpCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+bW9kZSwKKwkJICBfX2VudHJ5LT51aWQsIF9fZW50cnktPmdpZCwgX19lbnRyeS0+YmxvY2tzKQogKTsKIAogVFJBQ0VfRVZFTlQoZXh0NF9yZXF1ZXN0X2lub2RlLApAQCAtMTc4LDcgKzE3Nyw3IEBACiAJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBuZXdfc2l6ZSAlbGxkIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgKGxvbmcgbG9uZykgX19lbnRyeS0+bmV3X3NpemUpCisJCSAgX19lbnRyeS0+bmV3X3NpemUpCiApOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKGV4dDRfX3dyaXRlX2JlZ2luLApAQCAtMjA0LDcgKzIwMyw3IEBACiAJCV9fZW50cnktPmZsYWdzCT0gZmxhZ3M7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcG9zICVsbHUgbGVuICV1IGZsYWdzICV1IiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHBvcyAlbGxkIGxlbiAldSBmbGFncyAldSIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAogCQkgIF9fZW50cnktPnBvcywgX19lbnRyeS0+bGVuLCBfX2VudHJ5LT5mbGFncykKQEAgLTI0OCw3ICsyNDcsNyBAQAogCQlfX2VudHJ5LT5jb3BpZWQJPSBjb3BpZWQ7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcG9zICVsbHUgbGVuICV1IGNvcGllZCAldSIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsZCBsZW4gJXUgY29waWVkICV1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCiAJCSAgX19lbnRyeS0+cG9zLCBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmNvcGllZCkKQEAgLTI4NiwyOSArMjg1LDYgQEAKIAlUUF9BUkdTKGlub2RlLCBwb3MsIGxlbiwgY29waWVkKQogKTsKIAotVFJBQ0VfRVZFTlQoZXh0NF93cml0ZXBhZ2UsCi0JVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UpLAotCi0JVFBfQVJHUyhpbm9kZSwgcGFnZSksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQotCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQotCQlfX2ZpZWxkKAlwZ29mZl90LCBpbmRleAkJCSkKLQotCSksCi0KLQlUUF9mYXN0X2Fzc2lnbigKLQkJX19lbnRyeS0+ZGV2CT0gaW5vZGUtPmlfc2ItPnNfZGV2OwotCQlfX2VudHJ5LT5pbm8JPSBpbm9kZS0+aV9pbm87Ci0JCV9fZW50cnktPmluZGV4CT0gcGFnZS0+aW5kZXg7Ci0JKSwKLQotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcGFnZV9pbmRleCAlbHUiLAotCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCi0JCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+aW5kZXgpCi0pOwotCiBUUkFDRV9FVkVOVChleHQ0X2RhX3dyaXRlcGFnZXMsCiAJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpLAogCkBAIC0zNDEsNyArMzE3LDcgQEAKIAkpLAogCiAJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBucl90b193cml0ZSAlbGQgcGFnZXNfc2tpcHBlZCAlbGQgIgotCQkgICJyYW5nZV9zdGFydCAlbGx1IHJhbmdlX2VuZCAlbGx1IHN5bmNfbW9kZSAlZCIKKwkJICAicmFuZ2Vfc3RhcnQgJWxsZCByYW5nZV9lbmQgJWxsZCBzeW5jX21vZGUgJWQiCiAJCSAgImZvcl9rdXBkYXRlICVkIHJhbmdlX2N5Y2xpYyAlZCB3cml0ZWJhY2tfaW5kZXggJWx1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sIF9fZW50cnktPm5yX3RvX3dyaXRlLApAQCAtNDQ5LDcgKzQyNSwxNCBAQAogCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcGFnZV9pbmRleCAlbHUiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICBfX2VudHJ5LT5pbmRleCkKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5kZXgpCispOworCitERUZJTkVfRVZFTlQoZXh0NF9fcGFnZV9vcCwgZXh0NF93cml0ZXBhZ2UsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcGFnZSAqcGFnZSksCisKKwlUUF9BUkdTKHBhZ2UpCiApOwogCiBERUZJTkVfRVZFTlQoZXh0NF9fcGFnZV9vcCwgZXh0NF9yZWFkcGFnZSwKQEAgLTQ4OSw3ICs0NzIsNyBAQAogCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcGFnZV9pbmRleCAlbHUgb2Zmc2V0ICVsdSIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgIF9fZW50cnktPmluZGV4LCBfX2VudHJ5LT5vZmZzZXQpCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmluZGV4LCBfX2VudHJ5LT5vZmZzZXQpCiApOwogCiBUUkFDRV9FVkVOVChleHQ0X2Rpc2NhcmRfYmxvY2tzLApAQCAtNTYyLDEyICs1NDUsMTAgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfbWJfcmVsZWFzZV9pbm9kZV9wYSwKLQlUUF9QUk9UTyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkgc3RydWN0IGlub2RlICppbm9kZSwKLQkJIHN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICpwYSwKKwlUUF9QUk9UTyhzdHJ1Y3QgZXh0NF9wcmVhbGxvY19zcGFjZSAqcGEsCiAJCSB1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2ssIHVuc2lnbmVkIGludCBjb3VudCksCiAKLQlUUF9BUkdTKHNiLCBpbm9kZSwgcGEsIGJsb2NrLCBjb3VudCksCisJVFBfQVJHUyhwYSwgYmxvY2ssIGNvdW50KSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCkBAIC01NzgsOCArNTU5LDggQEAKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmRldgkJPSBzYi0+c19kZXY7Ci0JCV9fZW50cnktPmlubwkJPSBpbm9kZS0+aV9pbm87CisJCV9fZW50cnktPmRldgkJPSBwYS0+cGFfaW5vZGUtPmlfc2ItPnNfZGV2OworCQlfX2VudHJ5LT5pbm8JCT0gcGEtPnBhX2lub2RlLT5pX2lubzsKIAkJX19lbnRyeS0+YmxvY2sJCT0gYmxvY2s7CiAJCV9fZW50cnktPmNvdW50CQk9IGNvdW50OwogCSksCkBAIC01OTEsMTAgKzU3Miw5IEBACiApOwogCiBUUkFDRV9FVkVOVChleHQ0X21iX3JlbGVhc2VfZ3JvdXBfcGEsCi0JVFBfUFJPVE8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJIHN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICpwYSksCisJVFBfUFJPVE8oc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKnBhKSwKIAotCVRQX0FSR1Moc2IsIHBhKSwKKwlUUF9BUkdTKHBhKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCkBAIC02MDQsNyArNTg0LDcgQEAKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmRldgkJPSBzYi0+c19kZXY7CisJCV9fZW50cnktPmRldgkJPSBwYS0+cGFfaW5vZGUtPmlfc2ItPnNfZGV2OwogCQlfX2VudHJ5LT5wYV9wc3RhcnQJPSBwYS0+cGFfcHN0YXJ0OwogCQlfX2VudHJ5LT5wYV9sZW4JCT0gcGEtPnBhX2xlbjsKIAkpLApAQCAtNjY2LDEwICs2NDYsMTAgQEAKIAkJX19maWVsZCgJaW5vX3QsCWlubwkJCSkKIAkJX19maWVsZCgJdW5zaWduZWQgaW50LCBmbGFncwkJKQogCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsIGxlbgkJKQotCQlfX2ZpZWxkKAlfX3U2NCwgIGxvZ2ljYWwJCQkpCisJCV9fZmllbGQoCV9fdTMyLCAgbG9naWNhbAkJCSkKKwkJX19maWVsZCgJX191MzIsCWxsZWZ0CQkJKQorCQlfX2ZpZWxkKAlfX3UzMiwJbHJpZ2h0CQkJKQogCQlfX2ZpZWxkKAlfX3U2NCwJZ29hbAkJCSkKLQkJX19maWVsZCgJX191NjQsCWxsZWZ0CQkJKQotCQlfX2ZpZWxkKAlfX3U2NCwJbHJpZ2h0CQkJKQogCQlfX2ZpZWxkKAlfX3U2NCwJcGxlZnQJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlwcmlnaHQJCQkpCiAJKSwKQEAgLTY4NywxNyArNjY3LDEzIEBACiAJCV9fZW50cnktPnByaWdodAk9IGFyLT5wcmlnaHQ7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgZmxhZ3MgJXUgbGVuICV1IGxibGsgJWxsdSBnb2FsICVsbHUgIgotCQkgICJsbGVmdCAlbGx1IGxyaWdodCAlbGx1IHBsZWZ0ICVsbHUgcHJpZ2h0ICVsbHUgIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGZsYWdzICV1IGxlbiAldSBsYmxrICV1IGdvYWwgJWxsdSAiCisJCSAgImxsZWZ0ICV1IGxyaWdodCAldSBwbGVmdCAlbGx1IHByaWdodCAlbGx1ICIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKLQkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgIF9fZW50cnktPmZsYWdzLCBfX2VudHJ5LT5sZW4sCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+bG9naWNhbCwKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5nb2FsLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmxsZWZ0LAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmxyaWdodCwKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5wbGVmdCwKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5wcmlnaHQpCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+ZmxhZ3MsCisJCSAgX19lbnRyeS0+bGVuLCBfX2VudHJ5LT5sb2dpY2FsLCBfX2VudHJ5LT5nb2FsLAorCQkgIF9fZW50cnktPmxsZWZ0LCBfX2VudHJ5LT5scmlnaHQsIF9fZW50cnktPnBsZWZ0LAorCQkgIF9fZW50cnktPnByaWdodCkKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfYWxsb2NhdGVfYmxvY2tzLApAQCAtNzExLDEwICs2ODcsMTAgQEAKIAkJX19maWVsZCgJX191NjQsCWJsb2NrCQkJKQogCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsIGZsYWdzCQkpCiAJCV9fZmllbGQoCXVuc2lnbmVkIGludCwgbGVuCQkpCi0JCV9fZmllbGQoCV9fdTY0LCAgbG9naWNhbAkJCSkKKwkJX19maWVsZCgJX191MzIsICBsb2dpY2FsCQkJKQorCQlfX2ZpZWxkKAlfX3UzMiwJbGxlZnQJCQkpCisJCV9fZmllbGQoCV9fdTMyLAlscmlnaHQJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlnb2FsCQkJKQotCQlfX2ZpZWxkKAlfX3U2NCwJbGxlZnQJCQkpCi0JCV9fZmllbGQoCV9fdTY0LAlscmlnaHQJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlwbGVmdAkJCSkKIAkJX19maWVsZCgJX191NjQsCXByaWdodAkJCSkKIAkpLApAQCAtNzMzLDE3ICs3MDksMTMgQEAKIAkJX19lbnRyeS0+cHJpZ2h0CT0gYXItPnByaWdodDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBmbGFncyAldSBsZW4gJXUgYmxvY2sgJWxsdSBsYmxrICVsbHUgIgotCQkgICJnb2FsICVsbHUgbGxlZnQgJWxsdSBscmlnaHQgJWxsdSBwbGVmdCAlbGx1IHByaWdodCAlbGx1IiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGZsYWdzICV1IGxlbiAldSBibG9jayAlbGx1IGxibGsgJXUgIgorCQkgICJnb2FsICVsbHUgbGxlZnQgJXUgbHJpZ2h0ICV1IHBsZWZ0ICVsbHUgcHJpZ2h0ICVsbHUiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCi0JCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICBfX2VudHJ5LT5mbGFncywgX19lbnRyeS0+bGVuLCBfX2VudHJ5LT5ibG9jaywKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5sb2dpY2FsLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmdvYWwsCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+bGxlZnQsCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+bHJpZ2h0LAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBsZWZ0LAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnByaWdodCkKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCBfX2VudHJ5LT5mbGFncywKKwkJICBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmJsb2NrLCBfX2VudHJ5LT5sb2dpY2FsLAorCQkgIF9fZW50cnktPmdvYWwsICBfX2VudHJ5LT5sbGVmdCwgX19lbnRyeS0+bHJpZ2h0LAorCQkgIF9fZW50cnktPnBsZWZ0LCBfX2VudHJ5LT5wcmlnaHQpCiApOwogCiBUUkFDRV9FVkVOVChleHQ0X2ZyZWVfYmxvY2tzLApAQCAtNzU1LDEwICs3MjcsMTAgQEAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQotCQlfX2ZpZWxkKCAgICAgIHVtb2RlX3QsIG1vZGUJCQkpCisJCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlibG9jawkJCSkKIAkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJY291bnQJCSkKLQkJX19maWVsZCgJIGludCwJZmxhZ3MJCQkpCisJCV9fZmllbGQoCWludCwJZmxhZ3MJCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKApAQCAtNzk4LDcgKzc3MCw3IEBACiAJCV9fZW50cnktPnBhcmVudAkJPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX2lubzsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsZCBwYXJlbnQgJWxkIGRhdGFzeW5jICVkICIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwYXJlbnQgJWx1IGRhdGFzeW5jICVkICIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5wYXJlbnQsIF9fZW50cnktPmRhdGFzeW5jKQpAQCAtODIxLDcgKzc5Myw3IEBACiAJCV9fZW50cnktPmRldgkJPSBpbm9kZS0+aV9zYi0+c19kZXY7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbGQgcmV0ICVkIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHJldCAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAogCQkgIF9fZW50cnktPnJldCkKQEAgLTEwMDUsNyArOTc3LDcgQEAKIAkJX19lbnRyeS0+cmVzdWx0X2xlbgk9IGxlbjsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vZGUgJWx1IGV4dGVudCAldS8lZC8ldSAiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlub2RlICVsdSBleHRlbnQgJXUvJWQvJWQgIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCiAJCSAgX19lbnRyeS0+cmVzdWx0X2dyb3VwLCBfX2VudHJ5LT5yZXN1bHRfc3RhcnQsCkBAIC0xMDkzLDcgKzEwNjUsNyBAQAogCQkgICJhbGxvY2F0ZWRfbWV0YV9ibG9ja3MgJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICBfX2VudHJ5LT5tb2RlLCAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+aV9ibG9ja3MsCisJCSAgX19lbnRyeS0+bW9kZSwgX19lbnRyeS0+aV9ibG9ja3MsCiAJCSAgX19lbnRyeS0+dXNlZF9ibG9ja3MsIF9fZW50cnktPnJlc2VydmVkX2RhdGFfYmxvY2tzLAogCQkgIF9fZW50cnktPnJlc2VydmVkX21ldGFfYmxvY2tzLCBfX2VudHJ5LT5hbGxvY2F0ZWRfbWV0YV9ibG9ja3MpCiApOwpAQCAtMTEyNyw3ICsxMDk5LDcgQEAKIAkJICAicmVzZXJ2ZWRfZGF0YV9ibG9ja3MgJWQgcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICBfX2VudHJ5LT5tb2RlLCAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5pX2Jsb2NrcywKKwkJICBfX2VudHJ5LT5tb2RlLCBfX2VudHJ5LT5pX2Jsb2NrcywKIAkJICBfX2VudHJ5LT5tZF9uZWVkZWQsIF9fZW50cnktPnJlc2VydmVkX2RhdGFfYmxvY2tzLAogCQkgIF9fZW50cnktPnJlc2VydmVkX21ldGFfYmxvY2tzKQogKTsKQEAgLTExNjQsNyArMTEzNiw3IEBACiAJCSAgImFsbG9jYXRlZF9tZXRhX2Jsb2NrcyAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgIF9fZW50cnktPm1vZGUsICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmlfYmxvY2tzLAorCQkgIF9fZW50cnktPm1vZGUsIF9fZW50cnktPmlfYmxvY2tzLAogCQkgIF9fZW50cnktPmZyZWVkX2Jsb2NrcywgX19lbnRyeS0+cmVzZXJ2ZWRfZGF0YV9ibG9ja3MsCiAJCSAgX19lbnRyeS0+cmVzZXJ2ZWRfbWV0YV9ibG9ja3MsIF9fZW50cnktPmFsbG9jYXRlZF9tZXRhX2Jsb2NrcykKICk7CkBAIC0xMjM5LDE0ICsxMjExLDE1IEBACiAJCV9fZW50cnktPnJ3CT0gcnc7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcG9zICVsbHUgbGVuICVsdSBydyAlZCIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsZCBsZW4gJWx1IHJ3ICVkIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cG9zLCBfX2VudHJ5LT5sZW4sIF9fZW50cnktPnJ3KQorCQkgIF9fZW50cnktPnBvcywgX19lbnRyeS0+bGVuLCBfX2VudHJ5LT5ydykKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfZGlyZWN0X0lPX2V4aXQsCi0JVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBsZW4sIGludCBydywgaW50IHJldCksCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBsZW4sCisJCSBpbnQgcncsIGludCByZXQpLAogCiAJVFBfQVJHUyhpbm9kZSwgb2Zmc2V0LCBsZW4sIHJ3LCByZXQpLAogCkBAIC0xMjY4LDEwICsxMjQxLDEwIEBACiAJCV9fZW50cnktPnJldAk9IHJldDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsdSBsZW4gJWx1IHJ3ICVkIHJldCAlZCIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBwb3MgJWxsZCBsZW4gJWx1IHJ3ICVkIHJldCAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBvcywgX19lbnRyeS0+bGVuLAorCQkgIF9fZW50cnktPnBvcywgX19lbnRyeS0+bGVuLAogCQkgIF9fZW50cnktPnJ3LCBfX2VudHJ5LT5yZXQpCiApOwogCkBAIC0xMjk2LDE1ICsxMjY5LDE1IEBACiAJCV9fZW50cnktPm1vZGUJPSBtb2RlOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWxkIHBvcyAlbGx1IGxlbiAlbGx1IG1vZGUgJWQiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgcG9zICVsbGQgbGVuICVsbGQgbW9kZSAlZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKLQkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBvcywKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5sZW4sIF9fZW50cnktPm1vZGUpCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+cG9zLAorCQkgIF9fZW50cnktPmxlbiwgX19lbnRyeS0+bW9kZSkKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfZmFsbG9jYXRlX2V4aXQsCi0JVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgaW50IG1heF9ibG9ja3MsIGludCByZXQpLAorCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQsCisJCSB1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcywgaW50IHJldCksCiAKIAlUUF9BUkdTKGlub2RlLCBvZmZzZXQsIG1heF9ibG9ja3MsIHJldCksCiAKQEAgLTEzMTIsNyArMTI4NSw3IEBACiAJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCiAJCV9fZmllbGQoCWxvZmZfdCwJcG9zCQkJKQotCQlfX2ZpZWxkKAl1bnNpZ25lZCwJYmxvY2tzCQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJYmxvY2tzCQkpCiAJCV9fZmllbGQoCWludCwgCXJldAkJCSkKIAkpLAogCkBAIC0xMzI0LDEwICsxMjk3LDEwIEBACiAJCV9fZW50cnktPnJldAk9IHJldDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsZCBwb3MgJWxsdSBibG9ja3MgJWQgcmV0ICVkIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHBvcyAlbGxkIGJsb2NrcyAldSByZXQgJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5wb3MsIF9fZW50cnktPmJsb2NrcywKKwkJICBfX2VudHJ5LT5wb3MsIF9fZW50cnktPmJsb2NrcywKIAkJICBfX2VudHJ5LT5yZXQpCiApOwogCkBAIC0xMzUwLDcgKzEzMjMsNyBAQAogCQlfX2VudHJ5LT5kZXYJCT0gZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2RldjsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsZCBzaXplICVsbGQgcGFyZW50ICVsZCIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBzaXplICVsbGQgcGFyZW50ICVsdSIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCBfX2VudHJ5LT5zaXplLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5wYXJlbnQpCkBAIC0xMzczLDcgKzEzNDYsNyBAQAogCQlfX2VudHJ5LT5yZXQJCT0gcmV0OwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWxkIHJldCAlZCIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSByZXQgJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKIAkJICBfX2VudHJ5LT5yZXQpCkBAIC0xMzg3LDcgKzEzNjAsNyBAQAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWlub190LCAgCWlubwkJKQogCQlfX2ZpZWxkKAlkZXZfdCwgIAlkZXYJCSkKLQkJX19maWVsZCgJYmxrY250X3QsCWJsb2NrcwkJKQorCQlfX2ZpZWxkKAlfX3U2NCwJCWJsb2NrcwkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTEzOTYsOSArMTM2OSw5IEBACiAJCV9fZW50cnktPmJsb2Nrcwk9IGlub2RlLT5pX2Jsb2NrczsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBibG9ja3MgJWx1IiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGJsb2NrcyAlbGx1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAotCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5ibG9ja3MpCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywgX19lbnRyeS0+YmxvY2tzKQogKTsKIAogREVGSU5FX0VWRU5UKGV4dDRfX3RydW5jYXRlLCBleHQ0X3RydW5jYXRlX2VudGVyLApAQCAtMTQxNyw3ICsxMzkwLDcgQEAKIAogREVDTEFSRV9FVkVOVF9DTEFTUyhleHQ0X19tYXBfYmxvY2tzX2VudGVyLAogCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGxibGssCi0JCSB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzKSwKKwkJIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBmbGFncyksCiAKIAlUUF9BUkdTKGlub2RlLCBsYmxrLCBsZW4sIGZsYWdzKSwKIApAQCAtMTQyNSw4ICsxMzk4LDggQEAKIAkJX19maWVsZCgJaW5vX3QsICAJaW5vCQkpCiAJCV9fZmllbGQoCWRldl90LCAgCWRldgkJKQogCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkJKQotCQlfX2ZpZWxkKAl1bnNpZ25lZCwJbGVuCQkpCi0JCV9fZmllbGQoCXVuc2lnbmVkLAlmbGFncwkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCWxlbgkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCWZsYWdzCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKApAQCAtMTQ0MCw3ICsxNDEzLDcgQEAKIAlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGxibGsgJXUgbGVuICV1IGZsYWdzICV1IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCi0JCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5sYmxrLCBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmZsYWdzKQorCQkgIF9fZW50cnktPmxibGssIF9fZW50cnktPmxlbiwgX19lbnRyeS0+ZmxhZ3MpCiApOwogCiBERUZJTkVfRVZFTlQoZXh0NF9fbWFwX2Jsb2Nrc19lbnRlciwgZXh0NF9leHRfbWFwX2Jsb2Nrc19lbnRlciwKQEAgLTE0NTksNyArMTQzMiw3IEBACiAKIERFQ0xBUkVfRVZFTlRfQ0xBU1MoZXh0NF9fbWFwX2Jsb2Nrc19leGl0LAogCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGxibGssCi0JCSBleHQ0X2ZzYmxrX3QgcGJsaywgdW5zaWduZWQgbGVuLCBpbnQgcmV0KSwKKwkJIGV4dDRfZnNibGtfdCBwYmxrLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgcmV0KSwKIAogCVRQX0FSR1MoaW5vZGUsIGxibGssIHBibGssIGxlbiwgcmV0KSwKIApAQCAtMTQ2OCw3ICsxNDQxLDcgQEAKIAkJX19maWVsZCgJZGV2X3QsCQlkZXYJCSkKIAkJX19maWVsZCgJZXh0NF9sYmxrX3QsCWxibGsJCSkKIAkJX19maWVsZCgJZXh0NF9mc2Jsa190LAlwYmxrCQkpCi0JCV9fZmllbGQoCXVuc2lnbmVkLAlsZW4JCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlsZW4JCSkKIAkJX19maWVsZCgJaW50LAkJcmV0CQkpCiAJKSwKIApAQCAtMTQ4NCw3ICsxNDU3LDcgQEAKIAlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGxibGsgJXUgcGJsayAlbGx1IGxlbiAldSByZXQgJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKLQkJICAodW5zaWduZWQpIF9fZW50cnktPmxibGssICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBibGssCisJCSAgX19lbnRyeS0+bGJsaywgX19lbnRyeS0+cGJsaywKIAkJICBfX2VudHJ5LT5sZW4sIF9fZW50cnktPnJldCkKICk7CiAKQEAgLTE1MjQsNyArMTQ5Nyw3IEBACiAJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBsYmxrICV1IHBibGsgJWxsdSIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAotCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+bGJsaywgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cGJsaykKKwkJICBfX2VudHJ5LT5sYmxrLCBfX2VudHJ5LT5wYmxrKQogKTsKIAogVFJBQ0VfRVZFTlQoZXh0NF9sb2FkX2lub2RlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaAppbmRleCBhZTA0NWNhLi4xYzA5ODIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaApAQCAtMjAsNyArMjAsOCBAQAogCQkJIHNvZnRpcnFfbmFtZShCTE9DS19JT1BPTEwpLAlcCiAJCQkgc29mdGlycV9uYW1lKFRBU0tMRVQpLAkJXAogCQkJIHNvZnRpcnFfbmFtZShTQ0hFRCksCQlcCi0JCQkgc29mdGlycV9uYW1lKEhSVElNRVIpKQorCQkJIHNvZnRpcnFfbmFtZShIUlRJTUVSKSwJCVwKKwkJCSBzb2Z0aXJxX25hbWUoUkNVKSkKIAogLyoqCiAgKiBpcnFfaGFuZGxlcl9lbnRyeSAtIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGlycSBhY3Rpb24gaGFuZGxlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvc29jay5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvc29jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OWFiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9zb2NrLmgKQEAgLTAsMCArMSw2OCBAQAorI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gc29jaworCisjaWYgIWRlZmluZWQoX1RSQUNFX1NPQ0tfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX1NPQ0tfSAorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK1RSQUNFX0VWRU5UKHNvY2tfcmN2cXVldWVfZnVsbCwKKworCVRQX1BST1RPKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiksCisKKwlUUF9BUkdTKHNrLCBza2IpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChpbnQsIHJtZW1fYWxsb2MpCisJCV9fZmllbGQodW5zaWduZWQgaW50LCB0cnVlc2l6ZSkKKwkJX19maWVsZChpbnQsIHNrX3JjdmJ1ZikKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnJtZW1fYWxsb2MgPSBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpOworCQlfX2VudHJ5LT50cnVlc2l6ZSAgID0gc2tiLT50cnVlc2l6ZTsKKwkJX19lbnRyeS0+c2tfcmN2YnVmICA9IHNrLT5za19yY3ZidWY7CisJKSwKKworCVRQX3ByaW50aygicm1lbV9hbGxvYz0lZCB0cnVlc2l6ZT0ldSBza19yY3ZidWY9JWQiLAorCQlfX2VudHJ5LT5ybWVtX2FsbG9jLCBfX2VudHJ5LT50cnVlc2l6ZSwgX19lbnRyeS0+c2tfcmN2YnVmKQorKTsKKworVFJBQ0VfRVZFTlQoc29ja19leGNlZWRfYnVmX2xpbWl0LAorCisJVFBfUFJPVE8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHJvdG8gKnByb3QsIGxvbmcgYWxsb2NhdGVkKSwKKworCVRQX0FSR1Moc2ssIHByb3QsIGFsbG9jYXRlZCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2FycmF5KGNoYXIsIG5hbWUsIDMyKQorCQlfX2ZpZWxkKGxvbmcgKiwgc3lzY3RsX21lbSkKKwkJX19maWVsZChsb25nLCBhbGxvY2F0ZWQpCisJCV9fZmllbGQoaW50LCBzeXNjdGxfcm1lbSkKKwkJX19maWVsZChpbnQsIHJtZW1fYWxsb2MpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlzdHJuY3B5KF9fZW50cnktPm5hbWUsIHByb3QtPm5hbWUsIDMyKTsKKwkJX19lbnRyeS0+c3lzY3RsX21lbSA9IHByb3QtPnN5c2N0bF9tZW07CisJCV9fZW50cnktPmFsbG9jYXRlZCA9IGFsbG9jYXRlZDsKKwkJX19lbnRyeS0+c3lzY3RsX3JtZW0gPSBwcm90LT5zeXNjdGxfcm1lbVswXTsKKwkJX19lbnRyeS0+cm1lbV9hbGxvYyA9IGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYyk7CisJKSwKKworCVRQX3ByaW50aygicHJvdG86JXMgc3lzY3RsX21lbT0lbGQsJWxkLCVsZCBhbGxvY2F0ZWQ9JWxkICIKKwkJInN5c2N0bF9ybWVtPSVkIHJtZW1fYWxsb2M9JWQiLAorCQlfX2VudHJ5LT5uYW1lLAorCQlfX2VudHJ5LT5zeXNjdGxfbWVtWzBdLAorCQlfX2VudHJ5LT5zeXNjdGxfbWVtWzFdLAorCQlfX2VudHJ5LT5zeXNjdGxfbWVtWzJdLAorCQlfX2VudHJ5LT5hbGxvY2F0ZWQsCisJCV9fZW50cnktPnN5c2N0bF9ybWVtLAorCQlfX2VudHJ5LT5ybWVtX2FsbG9jKQorKTsKKworI2VuZGlmIC8qIF9UUkFDRV9TT0NLX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy91ZHAuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3VkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjRiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy91ZHAuaApAQCAtMCwwICsxLDMyIEBACisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSB1ZHAKKworI2lmICFkZWZpbmVkKF9UUkFDRV9VRFBfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX1VEUF9ICisKKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK1RSQUNFX0VWRU5UKHVkcF9mYWlsX3F1ZXVlX3Jjdl9za2IsCisKKwlUUF9QUk9UTyhpbnQgcmMsIHN0cnVjdCBzb2NrICpzayksCisKKwlUUF9BUkdTKHJjLCBzayksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKGludCwgcmMpCisJCV9fZmllbGQoX191MTYsIGxwb3J0KQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+cmMgPSByYzsKKwkJX19lbnRyeS0+bHBvcnQgPSBpbmV0X3NrKHNrKS0+aW5ldF9udW07CisJKSwKKworCVRQX3ByaW50aygicmM9JWQgcG9ydD0laHUiLCBfX2VudHJ5LT5yYywgX19lbnRyeS0+bHBvcnQpCispOworCisjZW5kaWYgLyogX1RSQUNFX1VEUF9IICovCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvdm1zY2FuLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAppbmRleCBlYTQyMmFhLi4zNjg1MWY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaApAQCAtNiw2ICs2LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgImdmcGZsYWdzLmgiCiAKICNkZWZpbmUgUkVDTEFJTV9XQl9BTk9OCQkweDAwMDF1CkBAIC0xNzcsNiArMTc5LDgzIEBACiAJVFBfQVJHUyhucl9yZWNsYWltZWQpCiApOwogCitUUkFDRV9FVkVOVChtbV9zaHJpbmtfc2xhYl9zdGFydCwKKwlUUF9QUk9UTyhzdHJ1Y3Qgc2hyaW5rZXIgKnNociwgc3RydWN0IHNocmlua19jb250cm9sICpzYywKKwkJbG9uZyBucl9vYmplY3RzX3RvX3NocmluaywgdW5zaWduZWQgbG9uZyBwZ3Nfc2Nhbm5lZCwKKwkJdW5zaWduZWQgbG9uZyBscnVfcGdzLCB1bnNpZ25lZCBsb25nIGNhY2hlX2l0ZW1zLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGEsIHVuc2lnbmVkIGxvbmcgdG90YWxfc2NhbiksCisKKwlUUF9BUkdTKHNociwgc2MsIG5yX29iamVjdHNfdG9fc2hyaW5rLCBwZ3Nfc2Nhbm5lZCwgbHJ1X3BncywKKwkJY2FjaGVfaXRlbXMsIGRlbHRhLCB0b3RhbF9zY2FuKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoc3RydWN0IHNocmlua2VyICosIHNocikKKwkJX19maWVsZCh2b2lkICosIHNocmluaykKKwkJX19maWVsZChsb25nLCBucl9vYmplY3RzX3RvX3NocmluaykKKwkJX19maWVsZChnZnBfdCwgZ2ZwX2ZsYWdzKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIHBnc19zY2FubmVkKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGxydV9wZ3MpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywgY2FjaGVfaXRlbXMpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZyBsb25nLCBkZWx0YSkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLCB0b3RhbF9zY2FuKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+c2hyID0gc2hyOworCQlfX2VudHJ5LT5zaHJpbmsgPSBzaHItPnNocmluazsKKwkJX19lbnRyeS0+bnJfb2JqZWN0c190b19zaHJpbmsgPSBucl9vYmplY3RzX3RvX3NocmluazsKKwkJX19lbnRyeS0+Z2ZwX2ZsYWdzID0gc2MtPmdmcF9tYXNrOworCQlfX2VudHJ5LT5wZ3Nfc2Nhbm5lZCA9IHBnc19zY2FubmVkOworCQlfX2VudHJ5LT5scnVfcGdzID0gbHJ1X3BnczsKKwkJX19lbnRyeS0+Y2FjaGVfaXRlbXMgPSBjYWNoZV9pdGVtczsKKwkJX19lbnRyeS0+ZGVsdGEgPSBkZWx0YTsKKwkJX19lbnRyeS0+dG90YWxfc2NhbiA9IHRvdGFsX3NjYW47CisJKSwKKworCVRQX3ByaW50aygiJXBGICVwOiBvYmplY3RzIHRvIHNocmluayAlbGQgZ2ZwX2ZsYWdzICVzIHBnc19zY2FubmVkICVsZCBscnVfcGdzICVsZCBjYWNoZSBpdGVtcyAlbGQgZGVsdGEgJWxsZCB0b3RhbF9zY2FuICVsZCIsCisJCV9fZW50cnktPnNocmluaywKKwkJX19lbnRyeS0+c2hyLAorCQlfX2VudHJ5LT5ucl9vYmplY3RzX3RvX3NocmluaywKKwkJc2hvd19nZnBfZmxhZ3MoX19lbnRyeS0+Z2ZwX2ZsYWdzKSwKKwkJX19lbnRyeS0+cGdzX3NjYW5uZWQsCisJCV9fZW50cnktPmxydV9wZ3MsCisJCV9fZW50cnktPmNhY2hlX2l0ZW1zLAorCQlfX2VudHJ5LT5kZWx0YSwKKwkJX19lbnRyeS0+dG90YWxfc2NhbikKKyk7CisKK1RSQUNFX0VWRU5UKG1tX3Nocmlua19zbGFiX2VuZCwKKwlUUF9QUk9UTyhzdHJ1Y3Qgc2hyaW5rZXIgKnNociwgaW50IHNocmlua2VyX3JldHZhbCwKKwkJbG9uZyB1bnVzZWRfc2Nhbl9jbnQsIGxvbmcgbmV3X3NjYW5fY250KSwKKworCVRQX0FSR1Moc2hyLCBzaHJpbmtlcl9yZXR2YWwsIHVudXNlZF9zY2FuX2NudCwgbmV3X3NjYW5fY250KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoc3RydWN0IHNocmlua2VyICosIHNocikKKwkJX19maWVsZCh2b2lkICosIHNocmluaykKKwkJX19maWVsZChsb25nLCB1bnVzZWRfc2NhbikKKwkJX19maWVsZChsb25nLCBuZXdfc2NhbikKKwkJX19maWVsZChpbnQsIHJldHZhbCkKKwkJX19maWVsZChsb25nLCB0b3RhbF9zY2FuKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+c2hyID0gc2hyOworCQlfX2VudHJ5LT5zaHJpbmsgPSBzaHItPnNocmluazsKKwkJX19lbnRyeS0+dW51c2VkX3NjYW4gPSB1bnVzZWRfc2Nhbl9jbnQ7CisJCV9fZW50cnktPm5ld19zY2FuID0gbmV3X3NjYW5fY250OworCQlfX2VudHJ5LT5yZXR2YWwgPSBzaHJpbmtlcl9yZXR2YWw7CisJCV9fZW50cnktPnRvdGFsX3NjYW4gPSBuZXdfc2Nhbl9jbnQgLSB1bnVzZWRfc2Nhbl9jbnQ7CisJKSwKKworCVRQX3ByaW50aygiJXBGICVwOiB1bnVzZWQgc2NhbiBjb3VudCAlbGQgbmV3IHNjYW4gY291bnQgJWxkIHRvdGFsX3NjYW4gJWxkIGxhc3Qgc2hyaW5rZXIgcmV0dXJuIHZhbCAlZCIsCisJCV9fZW50cnktPnNocmluaywKKwkJX19lbnRyeS0+c2hyLAorCQlfX2VudHJ5LT51bnVzZWRfc2NhbiwKKwkJX19lbnRyeS0+bmV3X3NjYW4sCisJCV9fZW50cnktPnRvdGFsX3NjYW4sCisJCV9fZW50cnktPnJldHZhbCkKKyk7CiAKIERFQ0xBUkVfRVZFTlRfQ0xBU1MobW1fdm1zY2FuX2xydV9pc29sYXRlX3RlbXBsYXRlLAogCkBAIC0zMTAsNiArMzg5LDg3IEBACiAJCXNob3dfcmVjbGFpbV9mbGFncyhfX2VudHJ5LT5yZWNsYWltX2ZsYWdzKSkKICk7CiAKK1RSQUNFX0VWRU5UKHJlcGxhY2Vfc3dhcF90b2tlbiwKKwlUUF9QUk9UTyhzdHJ1Y3QgbW1fc3RydWN0ICpvbGRfbW0sCisJCSBzdHJ1Y3QgbW1fc3RydWN0ICpuZXdfbW0pLAorCisJVFBfQVJHUyhvbGRfbW0sIG5ld19tbSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHN0cnVjdCBtbV9zdHJ1Y3QqLAlvbGRfbW0pCisJCV9fZmllbGQodW5zaWduZWQgaW50LAkJb2xkX3ByaW8pCisJCV9fZmllbGQoc3RydWN0IG1tX3N0cnVjdCosCW5ld19tbSkKKwkJX19maWVsZCh1bnNpZ25lZCBpbnQsCQluZXdfcHJpbykKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPm9sZF9tbSAgID0gb2xkX21tOworCQlfX2VudHJ5LT5vbGRfcHJpbyA9IG9sZF9tbSA/IG9sZF9tbS0+dG9rZW5fcHJpb3JpdHkgOiAwOworCQlfX2VudHJ5LT5uZXdfbW0gICA9IG5ld19tbTsKKwkJX19lbnRyeS0+bmV3X3ByaW8gPSBuZXdfbW0tPnRva2VuX3ByaW9yaXR5OworCSksCisKKwlUUF9wcmludGsoIm9sZF90b2tlbl9tbT0lcCBvbGRfcHJpbz0ldSBuZXdfdG9rZW5fbW09JXAgbmV3X3ByaW89JXUiLAorCQkgIF9fZW50cnktPm9sZF9tbSwgX19lbnRyeS0+b2xkX3ByaW8sCisJCSAgX19lbnRyeS0+bmV3X21tLCBfX2VudHJ5LT5uZXdfcHJpbykKKyk7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MocHV0X3N3YXBfdG9rZW5fdGVtcGxhdGUsCisJVFBfUFJPVE8oc3RydWN0IG1tX3N0cnVjdCAqc3dhcF90b2tlbl9tbSksCisKKwlUUF9BUkdTKHN3YXBfdG9rZW5fbW0pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChzdHJ1Y3QgbW1fc3RydWN0Kiwgc3dhcF90b2tlbl9tbSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnN3YXBfdG9rZW5fbW0gPSBzd2FwX3Rva2VuX21tOworCSksCisKKwlUUF9wcmludGsoInRva2VuX21tPSVwIiwgX19lbnRyeS0+c3dhcF90b2tlbl9tbSkKKyk7CisKK0RFRklORV9FVkVOVChwdXRfc3dhcF90b2tlbl90ZW1wbGF0ZSwgcHV0X3N3YXBfdG9rZW4sCisJVFBfUFJPVE8oc3RydWN0IG1tX3N0cnVjdCAqc3dhcF90b2tlbl9tbSksCisJVFBfQVJHUyhzd2FwX3Rva2VuX21tKQorKTsKKworREVGSU5FX0VWRU5UX0NPTkRJVElPTihwdXRfc3dhcF90b2tlbl90ZW1wbGF0ZSwgZGlzYWJsZV9zd2FwX3Rva2VuLAorCVRQX1BST1RPKHN0cnVjdCBtbV9zdHJ1Y3QgKnN3YXBfdG9rZW5fbW0pLAorCVRQX0FSR1Moc3dhcF90b2tlbl9tbSksCisJVFBfQ09ORElUSU9OKHN3YXBfdG9rZW5fbW0gIT0gTlVMTCkKKyk7CisKK1RSQUNFX0VWRU5UX0NPTkRJVElPTih1cGRhdGVfc3dhcF90b2tlbl9wcmlvcml0eSwKKwlUUF9QUk9UTyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJIHVuc2lnbmVkIGludCBvbGRfcHJpbywKKwkJIHN0cnVjdCBtbV9zdHJ1Y3QgKnN3YXBfdG9rZW5fbW0pLAorCisJVFBfQVJHUyhtbSwgb2xkX3ByaW8sIHN3YXBfdG9rZW5fbW0pLAorCisJVFBfQ09ORElUSU9OKG1tLT50b2tlbl9wcmlvcml0eSAhPSBvbGRfcHJpbyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHN0cnVjdCBtbV9zdHJ1Y3QqLCBtbSkKKwkJX19maWVsZCh1bnNpZ25lZCBpbnQsIG9sZF9wcmlvKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGludCwgbmV3X3ByaW8pCisJCV9fZmllbGQoc3RydWN0IG1tX3N0cnVjdCosIHN3YXBfdG9rZW5fbW0pCisJCV9fZmllbGQodW5zaWduZWQgaW50LCBzd2FwX3Rva2VuX3ByaW8pCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5tbQkJPSBtbTsKKwkJX19lbnRyeS0+b2xkX3ByaW8JPSBvbGRfcHJpbzsKKwkJX19lbnRyeS0+bmV3X3ByaW8JPSBtbS0+dG9rZW5fcHJpb3JpdHk7CisJCV9fZW50cnktPnN3YXBfdG9rZW5fbW0JPSBzd2FwX3Rva2VuX21tOworCQlfX2VudHJ5LT5zd2FwX3Rva2VuX3ByaW8gPSBzd2FwX3Rva2VuX21tID8gc3dhcF90b2tlbl9tbS0+dG9rZW5fcHJpb3JpdHkgOiAwOworCSksCisKKwlUUF9wcmludGsoIm1tPSVwIG9sZF9wcmlvPSV1IG5ld19wcmlvPSV1IHN3YXBfdG9rZW5fbW09JXAgdG9rZW5fcHJpbz0ldSIsCisJCSAgX19lbnRyeS0+bW0sIF9fZW50cnktPm9sZF9wcmlvLCBfX2VudHJ5LT5uZXdfcHJpbywKKwkJICBfX2VudHJ5LT5zd2FwX3Rva2VuX21tLCBfX2VudHJ5LT5zd2FwX3Rva2VuX3ByaW8pCispOwogCiAjZW5kaWYgLyogX1RSQUNFX1ZNU0NBTl9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3hlbi5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMveGVuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkOGRlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3hlbi5oCkBAIC0wLDAgKzEsNTA0IEBACisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSB4ZW4KKworI2lmICFkZWZpbmVkKF9UUkFDRV9YRU5fSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX1hFTl9ICisKKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0X3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3hlbi90cmFjZV90eXBlcy5oPgorCisvKiBNdWx0aWNhbGxzICovCitERUNMQVJFX0VWRU5UX0NMQVNTKHhlbl9tY19fYmF0Y2gsCisJICAgIFRQX1BST1RPKGVudW0gcGFyYXZpcnRfbGF6eV9tb2RlIG1vZGUpLAorCSAgICBUUF9BUkdTKG1vZGUpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChlbnVtIHBhcmF2aXJ0X2xhenlfbW9kZSwgbW9kZSkKKwkJICAgICksCisJICAgIFRQX2Zhc3RfYXNzaWduKF9fZW50cnktPm1vZGUgPSBtb2RlKSwKKwkgICAgVFBfcHJpbnRrKCJzdGFydCBiYXRjaCBMQVpZXyVzIiwKKwkJICAgICAgKF9fZW50cnktPm1vZGUgPT0gUEFSQVZJUlRfTEFaWV9NTVUpID8gIk1NVSIgOgorCQkgICAgICAoX19lbnRyeS0+bW9kZSA9PSBQQVJBVklSVF9MQVpZX0NQVSkgPyAiQ1BVIiA6ICJOT05FIikKKwkpOworI2RlZmluZSBERUZJTkVfWEVOX01DX0JBVENIKG5hbWUpCQkJXAorCURFRklORV9FVkVOVCh4ZW5fbWNfX2JhdGNoLCBuYW1lLAkJXAorCQlUUF9QUk9UTyhlbnVtIHBhcmF2aXJ0X2xhenlfbW9kZSBtb2RlKSwJXAorCQkgICAgIFRQX0FSR1MobW9kZSkpCisKK0RFRklORV9YRU5fTUNfQkFUQ0goeGVuX21jX2JhdGNoKTsKK0RFRklORV9YRU5fTUNfQkFUQ0goeGVuX21jX2lzc3VlKTsKKworVFJBQ0VfRVZFTlQoeGVuX21jX2VudHJ5LAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgbXVsdGljYWxsX2VudHJ5ICptYywgdW5zaWduZWQgbmFyZ3MpLAorCSAgICBUUF9BUkdTKG1jLCBuYXJncyksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkIGludCwgb3ApCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkIGludCwgbmFyZ3MpCisJCSAgICBfX2FycmF5KHVuc2lnbmVkIGxvbmcsIGFyZ3MsIDYpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbihfX2VudHJ5LT5vcCA9IG1jLT5vcDsKKwkJCSAgIF9fZW50cnktPm5hcmdzID0gbmFyZ3M7CisJCQkgICBtZW1jcHkoX19lbnRyeS0+YXJncywgbWMtPmFyZ3MsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIG5hcmdzKTsKKwkJCSAgIG1lbXNldChfX2VudHJ5LT5hcmdzICsgbmFyZ3MsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqICg2IC0gbmFyZ3MpKTsKKwkJICAgICksCisJICAgIFRQX3ByaW50aygib3AgJXUlcyBhcmdzIFslbHgsICVseCwgJWx4LCAlbHgsICVseCwgJWx4XSIsCisJCSAgICAgIF9fZW50cnktPm9wLCB4ZW5faHlwZXJjYWxsX25hbWUoX19lbnRyeS0+b3ApLAorCQkgICAgICBfX2VudHJ5LT5hcmdzWzBdLCBfX2VudHJ5LT5hcmdzWzFdLCBfX2VudHJ5LT5hcmdzWzJdLAorCQkgICAgICBfX2VudHJ5LT5hcmdzWzNdLCBfX2VudHJ5LT5hcmdzWzRdLCBfX2VudHJ5LT5hcmdzWzVdKQorCSk7CisKK1RSQUNFX0VWRU5UKHhlbl9tY19lbnRyeV9hbGxvYywKKwkgICAgVFBfUFJPVE8oc2l6ZV90IGFyZ3MpLAorCSAgICBUUF9BUkdTKGFyZ3MpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzaXplX3QsIGFyZ3MpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbihfX2VudHJ5LT5hcmdzID0gYXJncyksCisJICAgIFRQX3ByaW50aygiYWxsb2MgZW50cnkgJXp1IGFyZyBieXRlcyIsIF9fZW50cnktPmFyZ3MpCisJKTsKKworVFJBQ0VfRVZFTlQoeGVuX21jX2NhbGxiYWNrLAorCSAgICBUUF9QUk9UTyh4ZW5fbWNfY2FsbGJhY2tfZm5fdCBmbiwgdm9pZCAqZGF0YSksCisJICAgIFRQX0FSR1MoZm4sIGRhdGEpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZCh4ZW5fbWNfY2FsbGJhY2tfZm5fdCwgZm4pCisJCSAgICBfX2ZpZWxkKHZvaWQgKiwgZGF0YSkKKwkJICAgICksCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Zm4gPSBmbjsKKwkJICAgIF9fZW50cnktPmRhdGEgPSBkYXRhOworCQkgICAgKSwKKwkgICAgVFBfcHJpbnRrKCJjYWxsYmFjayAlcGYsIGRhdGEgJXAiLAorCQkgICAgICBfX2VudHJ5LT5mbiwgX19lbnRyeS0+ZGF0YSkKKwkpOworCitUUkFDRV9FVkVOVCh4ZW5fbWNfZmx1c2hfcmVhc29uLAorCSAgICBUUF9QUk9UTyhlbnVtIHhlbl9tY19mbHVzaF9yZWFzb24gcmVhc29uKSwKKwkgICAgVFBfQVJHUyhyZWFzb24pLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChlbnVtIHhlbl9tY19mbHVzaF9yZWFzb24sIHJlYXNvbikKKwkJICAgICksCisJICAgIFRQX2Zhc3RfYXNzaWduKF9fZW50cnktPnJlYXNvbiA9IHJlYXNvbiksCisJICAgIFRQX3ByaW50aygiZmx1c2ggcmVhc29uICVzIiwKKwkJICAgICAgKF9fZW50cnktPnJlYXNvbiA9PSBYRU5fTUNfRkxfTk9ORSkgPyAiTk9ORSIgOgorCQkgICAgICAoX19lbnRyeS0+cmVhc29uID09IFhFTl9NQ19GTF9CQVRDSCkgPyAiQkFUQ0giIDoKKwkJICAgICAgKF9fZW50cnktPnJlYXNvbiA9PSBYRU5fTUNfRkxfQVJHUykgPyAiQVJHUyIgOgorCQkgICAgICAoX19lbnRyeS0+cmVhc29uID09IFhFTl9NQ19GTF9DQUxMQkFDSykgPyAiQ0FMTEJBQ0siIDogIj8/IikKKwkpOworCitUUkFDRV9FVkVOVCh4ZW5fbWNfZmx1c2gsCisJICAgIFRQX1BST1RPKHVuc2lnbmVkIG1jaWR4LCB1bnNpZ25lZCBhcmdpZHgsIHVuc2lnbmVkIGNiaWR4KSwKKwkgICAgVFBfQVJHUyhtY2lkeCwgYXJnaWR4LCBjYmlkeCksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkLCBtY2lkeCkKKwkJICAgIF9fZmllbGQodW5zaWduZWQsIGFyZ2lkeCkKKwkJICAgIF9fZmllbGQodW5zaWduZWQsIGNiaWR4KQorCQkgICAgKSwKKwkgICAgVFBfZmFzdF9hc3NpZ24oX19lbnRyeS0+bWNpZHggPSBtY2lkeDsKKwkJCSAgIF9fZW50cnktPmFyZ2lkeCA9IGFyZ2lkeDsKKwkJCSAgIF9fZW50cnktPmNiaWR4ID0gY2JpZHgpLAorCSAgICBUUF9wcmludGsoImZsdXNoaW5nICV1IGh5cGVyY2FsbHMsICV1IGFyZyBieXRlcywgJXUgY2FsbGJhY2tzIiwKKwkJICAgICAgX19lbnRyeS0+bWNpZHgsIF9fZW50cnktPmFyZ2lkeCwgX19lbnRyeS0+Y2JpZHgpCisJKTsKKworVFJBQ0VfRVZFTlQoeGVuX21jX2V4dGVuZF9hcmdzLAorCSAgICBUUF9QUk9UTyh1bnNpZ25lZCBsb25nIG9wLCBzaXplX3QgYXJncywgZW51bSB4ZW5fbWNfZXh0ZW5kX2FyZ3MgcmVzKSwKKwkgICAgVFBfQVJHUyhvcCwgYXJncywgcmVzKSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQodW5zaWduZWQgaW50LCBvcCkKKwkJICAgIF9fZmllbGQoc2l6ZV90LCBhcmdzKQorCQkgICAgX19maWVsZChlbnVtIHhlbl9tY19leHRlbmRfYXJncywgcmVzKQorCQkgICAgKSwKKwkgICAgVFBfZmFzdF9hc3NpZ24oX19lbnRyeS0+b3AgPSBvcDsKKwkJCSAgIF9fZW50cnktPmFyZ3MgPSBhcmdzOworCQkJICAgX19lbnRyeS0+cmVzID0gcmVzKSwKKwkgICAgVFBfcHJpbnRrKCJleHRlbmRpbmcgb3AgJXUlcyBieSAlenUgYnl0ZXMgcmVzICVzIiwKKwkJICAgICAgX19lbnRyeS0+b3AsIHhlbl9oeXBlcmNhbGxfbmFtZShfX2VudHJ5LT5vcCksCisJCSAgICAgIF9fZW50cnktPmFyZ3MsCisJCSAgICAgIF9fZW50cnktPnJlcyA9PSBYRU5fTUNfWEVfT0sgPyAiT0siIDoKKwkJICAgICAgX19lbnRyeS0+cmVzID09IFhFTl9NQ19YRV9CQURfT1AgPyAiQkFEX09QIiA6CisJCSAgICAgIF9fZW50cnktPnJlcyA9PSBYRU5fTUNfWEVfTk9fU1BBQ0UgPyAiTk9fU1BBQ0UiIDogIj8/PyIpCisJKTsKKworLyogbW11ICovCitERUNMQVJFX0VWRU5UX0NMQVNTKHhlbl9tbXVfX3NldF9wdGUsCisJICAgIFRQX1BST1RPKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpLAorCSAgICBUUF9BUkdTKHB0ZXAsIHB0ZXZhbCksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHB0ZV90ICosIHB0ZXApCisJCSAgICBfX2ZpZWxkKHB0ZXZhbF90LCBwdGV2YWwpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbihfX2VudHJ5LT5wdGVwID0gcHRlcDsKKwkJCSAgIF9fZW50cnktPnB0ZXZhbCA9IHB0ZXZhbC5wdGUpLAorCSAgICBUUF9wcmludGsoInB0ZXAgJXAgcHRldmFsICUwKmxseCAocmF3ICUwKmxseCkiLAorCQkgICAgICBfX2VudHJ5LT5wdGVwLAorCQkgICAgICAoaW50KXNpemVvZihwdGV2YWxfdCkgKiAyLCAodW5zaWduZWQgbG9uZyBsb25nKXB0ZV92YWwobmF0aXZlX21ha2VfcHRlKF9fZW50cnktPnB0ZXZhbCkpLAorCQkgICAgICAoaW50KXNpemVvZihwdGV2YWxfdCkgKiAyLCAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnB0ZXZhbCkKKwkpOworCisjZGVmaW5lIERFRklORV9YRU5fTU1VX1NFVF9QVEUobmFtZSkJCQkJXAorCURFRklORV9FVkVOVCh4ZW5fbW11X19zZXRfcHRlLCBuYW1lLAkJCVwKKwkJICAgICBUUF9QUk9UTyhwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKSwJXAorCQkgICAgIFRQX0FSR1MocHRlcCwgcHRldmFsKSkKKworREVGSU5FX1hFTl9NTVVfU0VUX1BURSh4ZW5fbW11X3NldF9wdGUpOworREVGSU5FX1hFTl9NTVVfU0VUX1BURSh4ZW5fbW11X3NldF9wdGVfYXRvbWljKTsKKworVFJBQ0VfRVZFTlQoeGVuX21tdV9zZXRfZG9tYWluX3B0ZSwKKwkgICAgVFBfUFJPVE8ocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCwgdW5zaWduZWQgZG9taWQpLAorCSAgICBUUF9BUkdTKHB0ZXAsIHB0ZXZhbCwgZG9taWQpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChwdGVfdCAqLCBwdGVwKQorCQkgICAgX19maWVsZChwdGV2YWxfdCwgcHRldmFsKQorCQkgICAgX19maWVsZCh1bnNpZ25lZCwgZG9taWQpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbihfX2VudHJ5LT5wdGVwID0gcHRlcDsKKwkJCSAgIF9fZW50cnktPnB0ZXZhbCA9IHB0ZXZhbC5wdGU7CisJCQkgICBfX2VudHJ5LT5kb21pZCA9IGRvbWlkKSwKKwkgICAgVFBfcHJpbnRrKCJwdGVwICVwIHB0ZXZhbCAlMCpsbHggKHJhdyAlMCpsbHgpIGRvbWlkICV1IiwKKwkJICAgICAgX19lbnRyeS0+cHRlcCwKKwkJICAgICAgKGludClzaXplb2YocHRldmFsX3QpICogMiwgKHVuc2lnbmVkIGxvbmcgbG9uZylwdGVfdmFsKG5hdGl2ZV9tYWtlX3B0ZShfX2VudHJ5LT5wdGV2YWwpKSwKKwkJICAgICAgKGludClzaXplb2YocHRldmFsX3QpICogMiwgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5wdGV2YWwsCisJCSAgICAgIF9fZW50cnktPmRvbWlkKQorCSk7CisKK1RSQUNFX0VWRU5UKHhlbl9tbXVfc2V0X3B0ZV9hdCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJICAgICBwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKSwKKwkgICAgVFBfQVJHUyhtbSwgYWRkciwgcHRlcCwgcHRldmFsKSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IG1tX3N0cnVjdCAqLCBtbSkKKwkJICAgIF9fZmllbGQodW5zaWduZWQgbG9uZywgYWRkcikKKwkJICAgIF9fZmllbGQocHRlX3QgKiwgcHRlcCkKKwkJICAgIF9fZmllbGQocHRldmFsX3QsIHB0ZXZhbCkKKwkJICAgICksCisJICAgIFRQX2Zhc3RfYXNzaWduKF9fZW50cnktPm1tID0gbW07CisJCQkgICBfX2VudHJ5LT5hZGRyID0gYWRkcjsKKwkJCSAgIF9fZW50cnktPnB0ZXAgPSBwdGVwOworCQkJICAgX19lbnRyeS0+cHRldmFsID0gcHRldmFsLnB0ZSksCisJICAgIFRQX3ByaW50aygibW0gJXAgYWRkciAlbHggcHRlcCAlcCBwdGV2YWwgJTAqbGx4IChyYXcgJTAqbGx4KSIsCisJCSAgICAgIF9fZW50cnktPm1tLCBfX2VudHJ5LT5hZGRyLCBfX2VudHJ5LT5wdGVwLAorCQkgICAgICAoaW50KXNpemVvZihwdGV2YWxfdCkgKiAyLCAodW5zaWduZWQgbG9uZyBsb25nKXB0ZV92YWwobmF0aXZlX21ha2VfcHRlKF9fZW50cnktPnB0ZXZhbCkpLAorCQkgICAgICAoaW50KXNpemVvZihwdGV2YWxfdCkgKiAyLCAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnB0ZXZhbCkKKwkpOworCitUUkFDRV9FVkVOVCh4ZW5fbW11X3B0ZV9jbGVhciwKKwkgICAgVFBfUFJPVE8oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApLAorCSAgICBUUF9BUkdTKG1tLCBhZGRyLCBwdGVwKSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IG1tX3N0cnVjdCAqLCBtbSkKKwkJICAgIF9fZmllbGQodW5zaWduZWQgbG9uZywgYWRkcikKKwkJICAgIF9fZmllbGQocHRlX3QgKiwgcHRlcCkKKwkJICAgICksCisJICAgIFRQX2Zhc3RfYXNzaWduKF9fZW50cnktPm1tID0gbW07CisJCQkgICBfX2VudHJ5LT5hZGRyID0gYWRkcjsKKwkJCSAgIF9fZW50cnktPnB0ZXAgPSBwdGVwKSwKKwkgICAgVFBfcHJpbnRrKCJtbSAlcCBhZGRyICVseCBwdGVwICVwIiwKKwkJICAgICAgX19lbnRyeS0+bW0sIF9fZW50cnktPmFkZHIsIF9fZW50cnktPnB0ZXApCisJKTsKKworVFJBQ0VfRVZFTlQoeGVuX21tdV9zZXRfcG1kLAorCSAgICBUUF9QUk9UTyhwbWRfdCAqcG1kcCwgcG1kX3QgcG1kdmFsKSwKKwkgICAgVFBfQVJHUyhwbWRwLCBwbWR2YWwpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChwbWRfdCAqLCBwbWRwKQorCQkgICAgX19maWVsZChwbWR2YWxfdCwgcG1kdmFsKQorCQkgICAgKSwKKwkgICAgVFBfZmFzdF9hc3NpZ24oX19lbnRyeS0+cG1kcCA9IHBtZHA7CisJCQkgICBfX2VudHJ5LT5wbWR2YWwgPSBwbWR2YWwucG1kKSwKKwkgICAgVFBfcHJpbnRrKCJwbWRwICVwIHBtZHZhbCAlMCpsbHggKHJhdyAlMCpsbHgpIiwKKwkJICAgICAgX19lbnRyeS0+cG1kcCwKKwkJICAgICAgKGludClzaXplb2YocG1kdmFsX3QpICogMiwgKHVuc2lnbmVkIGxvbmcgbG9uZylwbWRfdmFsKG5hdGl2ZV9tYWtlX3BtZChfX2VudHJ5LT5wbWR2YWwpKSwKKwkJICAgICAgKGludClzaXplb2YocG1kdmFsX3QpICogMiwgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5wbWR2YWwpCisJKTsKKworVFJBQ0VfRVZFTlQoeGVuX21tdV9wbWRfY2xlYXIsCisJICAgIFRQX1BST1RPKHBtZF90ICpwbWRwKSwKKwkgICAgVFBfQVJHUyhwbWRwKSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQocG1kX3QgKiwgcG1kcCkKKwkJICAgICksCisJICAgIFRQX2Zhc3RfYXNzaWduKF9fZW50cnktPnBtZHAgPSBwbWRwKSwKKwkgICAgVFBfcHJpbnRrKCJwbWRwICVwIiwgX19lbnRyeS0+cG1kcCkKKwkpOworCisjaWYgUEFHRVRBQkxFX0xFVkVMUyA+PSA0CisKK1RSQUNFX0VWRU5UKHhlbl9tbXVfc2V0X3B1ZCwKKwkgICAgVFBfUFJPVE8ocHVkX3QgKnB1ZHAsIHB1ZF90IHB1ZHZhbCksCisJICAgIFRQX0FSR1MocHVkcCwgcHVkdmFsKSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQocHVkX3QgKiwgcHVkcCkKKwkJICAgIF9fZmllbGQocHVkdmFsX3QsIHB1ZHZhbCkKKwkJICAgICksCisJICAgIFRQX2Zhc3RfYXNzaWduKF9fZW50cnktPnB1ZHAgPSBwdWRwOworCQkJICAgX19lbnRyeS0+cHVkdmFsID0gbmF0aXZlX3B1ZF92YWwocHVkdmFsKSksCisJICAgIFRQX3ByaW50aygicHVkcCAlcCBwdWR2YWwgJTAqbGx4IChyYXcgJTAqbGx4KSIsCisJCSAgICAgIF9fZW50cnktPnB1ZHAsCisJCSAgICAgIChpbnQpc2l6ZW9mKHB1ZHZhbF90KSAqIDIsICh1bnNpZ25lZCBsb25nIGxvbmcpcHVkX3ZhbChuYXRpdmVfbWFrZV9wdWQoX19lbnRyeS0+cHVkdmFsKSksCisJCSAgICAgIChpbnQpc2l6ZW9mKHB1ZHZhbF90KSAqIDIsICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+cHVkdmFsKQorCSk7CisKK1RSQUNFX0VWRU5UKHhlbl9tbXVfc2V0X3BnZCwKKwkgICAgVFBfUFJPVE8ocGdkX3QgKnBnZHAsIHBnZF90ICp1c2VyX3BnZHAsIHBnZF90IHBnZHZhbCksCisJICAgIFRQX0FSR1MocGdkcCwgdXNlcl9wZ2RwLCBwZ2R2YWwpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChwZ2RfdCAqLCBwZ2RwKQorCQkgICAgX19maWVsZChwZ2RfdCAqLCB1c2VyX3BnZHApCisJCSAgICBfX2ZpZWxkKHBnZHZhbF90LCBwZ2R2YWwpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbihfX2VudHJ5LT5wZ2RwID0gcGdkcDsKKwkJCSAgIF9fZW50cnktPnVzZXJfcGdkcCA9IHVzZXJfcGdkcDsKKwkJCSAgIF9fZW50cnktPnBnZHZhbCA9IHBnZHZhbC5wZ2QpLAorCSAgICBUUF9wcmludGsoInBnZHAgJXAgdXNlcl9wZ2RwICVwIHBnZHZhbCAlMCpsbHggKHJhdyAlMCpsbHgpIiwKKwkJICAgICAgX19lbnRyeS0+cGdkcCwgX19lbnRyeS0+dXNlcl9wZ2RwLAorCQkgICAgICAoaW50KXNpemVvZihwZ2R2YWxfdCkgKiAyLCAodW5zaWduZWQgbG9uZyBsb25nKXBnZF92YWwobmF0aXZlX21ha2VfcGdkKF9fZW50cnktPnBnZHZhbCkpLAorCQkgICAgICAoaW50KXNpemVvZihwZ2R2YWxfdCkgKiAyLCAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnBnZHZhbCkKKwkpOworCitUUkFDRV9FVkVOVCh4ZW5fbW11X3B1ZF9jbGVhciwKKwkgICAgVFBfUFJPVE8ocHVkX3QgKnB1ZHApLAorCSAgICBUUF9BUkdTKHB1ZHApLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChwdWRfdCAqLCBwdWRwKQorCQkgICAgKSwKKwkgICAgVFBfZmFzdF9hc3NpZ24oX19lbnRyeS0+cHVkcCA9IHB1ZHApLAorCSAgICBUUF9wcmludGsoInB1ZHAgJXAiLCBfX2VudHJ5LT5wdWRwKQorCSk7CisjZWxzZQorCitUUkFDRV9FVkVOVCh4ZW5fbW11X3NldF9wdWQsCisJICAgIFRQX1BST1RPKHB1ZF90ICpwdWRwLCBwdWRfdCBwdWR2YWwpLAorCSAgICBUUF9BUkdTKHB1ZHAsIHB1ZHZhbCksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHB1ZF90ICosIHB1ZHApCisJCSAgICBfX2ZpZWxkKHB1ZHZhbF90LCBwdWR2YWwpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbihfX2VudHJ5LT5wdWRwID0gcHVkcDsKKwkJCSAgIF9fZW50cnktPnB1ZHZhbCA9IG5hdGl2ZV9wdWRfdmFsKHB1ZHZhbCkpLAorCSAgICBUUF9wcmludGsoInB1ZHAgJXAgcHVkdmFsICUwKmxseCAocmF3ICUwKmxseCkiLAorCQkgICAgICBfX2VudHJ5LT5wdWRwLAorCQkgICAgICAoaW50KXNpemVvZihwdWR2YWxfdCkgKiAyLCAodW5zaWduZWQgbG9uZyBsb25nKXBnZF92YWwobmF0aXZlX21ha2VfcGdkKF9fZW50cnktPnB1ZHZhbCkpLAorCQkgICAgICAoaW50KXNpemVvZihwdWR2YWxfdCkgKiAyLCAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnB1ZHZhbCkKKwkpOworCisjZW5kaWYKKworVFJBQ0VfRVZFTlQoeGVuX21tdV9wZ2RfY2xlYXIsCisJICAgIFRQX1BST1RPKHBnZF90ICpwZ2RwKSwKKwkgICAgVFBfQVJHUyhwZ2RwKSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQocGdkX3QgKiwgcGdkcCkKKwkJICAgICksCisJICAgIFRQX2Zhc3RfYXNzaWduKF9fZW50cnktPnBnZHAgPSBwZ2RwKSwKKwkgICAgVFBfcHJpbnRrKCJwZ2RwICVwIiwgX19lbnRyeS0+cGdkcCkKKwkpOworCitERUNMQVJFX0VWRU5UX0NMQVNTKHhlbl9tbXVfcHRlcF9tb2RpZnlfcHJvdCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJICAgICBwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKSwKKwkgICAgVFBfQVJHUyhtbSwgYWRkciwgcHRlcCwgcHRldmFsKSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IG1tX3N0cnVjdCAqLCBtbSkKKwkJICAgIF9fZmllbGQodW5zaWduZWQgbG9uZywgYWRkcikKKwkJICAgIF9fZmllbGQocHRlX3QgKiwgcHRlcCkKKwkJICAgIF9fZmllbGQocHRldmFsX3QsIHB0ZXZhbCkKKwkJICAgICksCisJICAgIFRQX2Zhc3RfYXNzaWduKF9fZW50cnktPm1tID0gbW07CisJCQkgICBfX2VudHJ5LT5hZGRyID0gYWRkcjsKKwkJCSAgIF9fZW50cnktPnB0ZXAgPSBwdGVwOworCQkJICAgX19lbnRyeS0+cHRldmFsID0gcHRldmFsLnB0ZSksCisJICAgIFRQX3ByaW50aygibW0gJXAgYWRkciAlbHggcHRlcCAlcCBwdGV2YWwgJTAqbGx4IChyYXcgJTAqbGx4KSIsCisJCSAgICAgIF9fZW50cnktPm1tLCBfX2VudHJ5LT5hZGRyLCBfX2VudHJ5LT5wdGVwLAorCQkgICAgICAoaW50KXNpemVvZihwdGV2YWxfdCkgKiAyLCAodW5zaWduZWQgbG9uZyBsb25nKXB0ZV92YWwobmF0aXZlX21ha2VfcHRlKF9fZW50cnktPnB0ZXZhbCkpLAorCQkgICAgICAoaW50KXNpemVvZihwdGV2YWxfdCkgKiAyLCAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnB0ZXZhbCkKKwkpOworI2RlZmluZSBERUZJTkVfWEVOX01NVV9QVEVQX01PRElGWV9QUk9UKG5hbWUpCQkJCVwKKwlERUZJTkVfRVZFTlQoeGVuX21tdV9wdGVwX21vZGlmeV9wcm90LCBuYW1lLAkJCVwKKwkJICAgICBUUF9QUk9UTyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAlcCisJCQkgICAgICBwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKSwJCVwKKwkJICAgICBUUF9BUkdTKG1tLCBhZGRyLCBwdGVwLCBwdGV2YWwpKQorCitERUZJTkVfWEVOX01NVV9QVEVQX01PRElGWV9QUk9UKHhlbl9tbXVfcHRlcF9tb2RpZnlfcHJvdF9zdGFydCk7CitERUZJTkVfWEVOX01NVV9QVEVQX01PRElGWV9QUk9UKHhlbl9tbXVfcHRlcF9tb2RpZnlfcHJvdF9jb21taXQpOworCitUUkFDRV9FVkVOVCh4ZW5fbW11X2FsbG9jX3B0cGFnZSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsZXZlbCwgYm9vbCBwaW5uZWQpLAorCSAgICBUUF9BUkdTKG1tLCBwZm4sIGxldmVsLCBwaW5uZWQpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgbW1fc3RydWN0ICosIG1tKQorCQkgICAgX19maWVsZCh1bnNpZ25lZCBsb25nLCBwZm4pCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkLCBsZXZlbCkKKwkJICAgIF9fZmllbGQoYm9vbCwgcGlubmVkKQorCQkgICAgKSwKKwkgICAgVFBfZmFzdF9hc3NpZ24oX19lbnRyeS0+bW0gPSBtbTsKKwkJCSAgIF9fZW50cnktPnBmbiA9IHBmbjsKKwkJCSAgIF9fZW50cnktPmxldmVsID0gbGV2ZWw7CisJCQkgICBfX2VudHJ5LT5waW5uZWQgPSBwaW5uZWQpLAorCSAgICBUUF9wcmludGsoIm1tICVwICBwZm4gJWx4ICBsZXZlbCAlZCAgJXNwaW5uZWQiLAorCQkgICAgICBfX2VudHJ5LT5tbSwgX19lbnRyeS0+cGZuLCBfX2VudHJ5LT5sZXZlbCwKKwkJICAgICAgX19lbnRyeS0+cGlubmVkID8gIiIgOiAidW4iKQorCSk7CisKK1RSQUNFX0VWRU5UKHhlbl9tbXVfcmVsZWFzZV9wdHBhZ2UsCisJICAgIFRQX1BST1RPKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsZXZlbCwgYm9vbCBwaW5uZWQpLAorCSAgICBUUF9BUkdTKHBmbiwgbGV2ZWwsIHBpbm5lZCksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIHBmbikKKwkJICAgIF9fZmllbGQodW5zaWduZWQsIGxldmVsKQorCQkgICAgX19maWVsZChib29sLCBwaW5uZWQpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbihfX2VudHJ5LT5wZm4gPSBwZm47CisJCQkgICBfX2VudHJ5LT5sZXZlbCA9IGxldmVsOworCQkJICAgX19lbnRyeS0+cGlubmVkID0gcGlubmVkKSwKKwkgICAgVFBfcHJpbnRrKCJwZm4gJWx4ICBsZXZlbCAlZCAgJXNwaW5uZWQiLAorCQkgICAgICBfX2VudHJ5LT5wZm4sIF9fZW50cnktPmxldmVsLAorCQkgICAgICBfX2VudHJ5LT5waW5uZWQgPyAiIiA6ICJ1biIpCisJKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyh4ZW5fbW11X3BnZCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpLAorCSAgICBUUF9BUkdTKG1tLCBwZ2QpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgbW1fc3RydWN0ICosIG1tKQorCQkgICAgX19maWVsZChwZ2RfdCAqLCBwZ2QpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbihfX2VudHJ5LT5tbSA9IG1tOworCQkJICAgX19lbnRyeS0+cGdkID0gcGdkKSwKKwkgICAgVFBfcHJpbnRrKCJtbSAlcCBwZ2QgJXAiLCBfX2VudHJ5LT5tbSwgX19lbnRyeS0+cGdkKQorCSk7CisjZGVmaW5lIERFRklORV9YRU5fTU1VX1BHRF9FVkVOVChuYW1lKQkJCQlcCisJREVGSU5FX0VWRU5UKHhlbl9tbXVfcGdkLCBuYW1lLAkJCQlcCisJCVRQX1BST1RPKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkKSwJXAorCQkgICAgIFRQX0FSR1MobW0sIHBnZCkpCisKK0RFRklORV9YRU5fTU1VX1BHRF9FVkVOVCh4ZW5fbW11X3BnZF9waW4pOworREVGSU5FX1hFTl9NTVVfUEdEX0VWRU5UKHhlbl9tbXVfcGdkX3VucGluKTsKKworVFJBQ0VfRVZFTlQoeGVuX21tdV9mbHVzaF90bGIsCisJICAgIFRQX1BST1RPKGludCB4KSwKKwkgICAgVFBfQVJHUyh4KSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeShfX2FycmF5KGNoYXIsIHgsIDApKSwKKwkgICAgVFBfZmFzdF9hc3NpZ24oKHZvaWQpeCksCisJICAgIFRQX3ByaW50aygiJXMiLCAiIikKKwkpOworCitUUkFDRV9FVkVOVCh4ZW5fbW11X2ZsdXNoX3RsYl9zaW5nbGUsCisJICAgIFRQX1BST1RPKHVuc2lnbmVkIGxvbmcgYWRkciksCisJICAgIFRQX0FSR1MoYWRkciksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGFkZHIpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbihfX2VudHJ5LT5hZGRyID0gYWRkciksCisJICAgIFRQX3ByaW50aygiYWRkciAlbHgiLCBfX2VudHJ5LT5hZGRyKQorCSk7CisKK1RSQUNFX0VWRU5UKHhlbl9tbXVfZmx1c2hfdGxiX290aGVycywKKwkgICAgVFBfUFJPVE8oY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdXMsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkciksCisJICAgIFRQX0FSR1MoY3B1cywgbW0sIGFkZHIpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZCh1bnNpZ25lZCwgbmNwdXMpCisJCSAgICBfX2ZpZWxkKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgbW0pCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGFkZHIpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbihfX2VudHJ5LT5uY3B1cyA9IGNwdW1hc2tfd2VpZ2h0KGNwdXMpOworCQkJICAgX19lbnRyeS0+bW0gPSBtbTsKKwkJCSAgIF9fZW50cnktPmFkZHIgPSBhZGRyKSwKKwkgICAgVFBfcHJpbnRrKCJuY3B1cyAlZCBtbSAlcCBhZGRyICVseCIsCisJCSAgICAgIF9fZW50cnktPm5jcHVzLCBfX2VudHJ5LT5tbSwgX19lbnRyeS0+YWRkcikKKwkpOworCitUUkFDRV9FVkVOVCh4ZW5fbW11X3dyaXRlX2NyMywKKwkgICAgVFBfUFJPVE8oYm9vbCBrZXJuZWwsIHVuc2lnbmVkIGxvbmcgY3IzKSwKKwkgICAgVFBfQVJHUyhrZXJuZWwsIGNyMyksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKGJvb2wsIGtlcm5lbCkKKwkJICAgIF9fZmllbGQodW5zaWduZWQgbG9uZywgY3IzKQorCQkgICAgKSwKKwkgICAgVFBfZmFzdF9hc3NpZ24oX19lbnRyeS0+a2VybmVsID0ga2VybmVsOworCQkJICAgX19lbnRyeS0+Y3IzID0gY3IzKSwKKwkgICAgVFBfcHJpbnRrKCIlcyBjcjMgJWx4IiwKKwkJICAgICAgX19lbnRyeS0+a2VybmVsID8gImtlcm5lbCIgOiAidXNlciIsIF9fZW50cnktPmNyMykKKwkpOworCisKKy8qIENQVSAqLworVFJBQ0VfRVZFTlQoeGVuX2NwdV93cml0ZV9sZHRfZW50cnksCisJICAgIFRQX1BST1RPKHN0cnVjdCBkZXNjX3N0cnVjdCAqZHQsIGludCBlbnRyeW51bSwgdTY0IGRlc2MpLAorCSAgICBUUF9BUkdTKGR0LCBlbnRyeW51bSwgZGVzYyksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCBkZXNjX3N0cnVjdCAqLCBkdCkKKwkJICAgIF9fZmllbGQoaW50LCBlbnRyeW51bSkKKwkJICAgIF9fZmllbGQodTY0LCBkZXNjKQorCQkgICAgKSwKKwkgICAgVFBfZmFzdF9hc3NpZ24oX19lbnRyeS0+ZHQgPSBkdDsKKwkJCSAgIF9fZW50cnktPmVudHJ5bnVtID0gZW50cnludW07CisJCQkgICBfX2VudHJ5LT5kZXNjID0gZGVzYzsKKwkJICAgICksCisJICAgIFRQX3ByaW50aygiZHQgJXAgIGVudHJ5bnVtICVkICBlbnRyeSAlMDE2bGx4IiwKKwkJICAgICAgX19lbnRyeS0+ZHQsIF9fZW50cnktPmVudHJ5bnVtLAorCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPmRlc2MpCisJKTsKKworVFJBQ0VfRVZFTlQoeGVuX2NwdV93cml0ZV9pZHRfZW50cnksCisJICAgIFRQX1BST1RPKGdhdGVfZGVzYyAqZHQsIGludCBlbnRyeW51bSwgY29uc3QgZ2F0ZV9kZXNjICplbnQpLAorCSAgICBUUF9BUkdTKGR0LCBlbnRyeW51bSwgZW50KSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoZ2F0ZV9kZXNjICosIGR0KQorCQkgICAgX19maWVsZChpbnQsIGVudHJ5bnVtKQorCQkgICAgKSwKKwkgICAgVFBfZmFzdF9hc3NpZ24oX19lbnRyeS0+ZHQgPSBkdDsKKwkJCSAgIF9fZW50cnktPmVudHJ5bnVtID0gZW50cnludW07CisJCSAgICApLAorCSAgICBUUF9wcmludGsoImR0ICVwICBlbnRyeW51bSAlZCIsCisJCSAgICAgIF9fZW50cnktPmR0LCBfX2VudHJ5LT5lbnRyeW51bSkKKwkpOworCitUUkFDRV9FVkVOVCh4ZW5fY3B1X2xvYWRfaWR0LAorCSAgICBUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGVzY19wdHIgKmRlc2MpLAorCSAgICBUUF9BUkdTKGRlc2MpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZCh1bnNpZ25lZCBsb25nLCBhZGRyKQorCQkgICAgKSwKKwkgICAgVFBfZmFzdF9hc3NpZ24oX19lbnRyeS0+YWRkciA9IGRlc2MtPmFkZHJlc3MpLAorCSAgICBUUF9wcmludGsoImFkZHIgJWx4IiwgX19lbnRyeS0+YWRkcikKKwkpOworCitUUkFDRV9FVkVOVCh4ZW5fY3B1X3dyaXRlX2dkdF9lbnRyeSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRlc2Nfc3RydWN0ICpkdCwgaW50IGVudHJ5bnVtLCBjb25zdCB2b2lkICpkZXNjLCBpbnQgdHlwZSksCisJICAgIFRQX0FSR1MoZHQsIGVudHJ5bnVtLCBkZXNjLCB0eXBlKSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQodTY0LCBkZXNjKQorCQkgICAgX19maWVsZChzdHJ1Y3QgZGVzY19zdHJ1Y3QgKiwgZHQpCisJCSAgICBfX2ZpZWxkKGludCwgZW50cnludW0pCisJCSAgICBfX2ZpZWxkKGludCwgdHlwZSkKKwkJICAgICksCisJICAgIFRQX2Zhc3RfYXNzaWduKF9fZW50cnktPmR0ID0gZHQ7CisJCQkgICBfX2VudHJ5LT5lbnRyeW51bSA9IGVudHJ5bnVtOworCQkJICAgX19lbnRyeS0+ZGVzYyA9ICoodTY0ICopZGVzYzsKKwkJCSAgIF9fZW50cnktPnR5cGUgPSB0eXBlOworCQkgICAgKSwKKwkgICAgVFBfcHJpbnRrKCJkdCAlcCAgZW50cnludW0gJWQgIHR5cGUgJWQgIGRlc2MgJTAxNmxseCIsCisJCSAgICAgIF9fZW50cnktPmR0LCBfX2VudHJ5LT5lbnRyeW51bSwgX19lbnRyeS0+dHlwZSwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5kZXNjKQorCSk7CisKK1RSQUNFX0VWRU5UKHhlbl9jcHVfc2V0X2xkdCwKKwkgICAgVFBfUFJPVE8oY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgZW50cmllcyksCisJICAgIFRQX0FSR1MoYWRkciwgZW50cmllcyksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKGNvbnN0IHZvaWQgKiwgYWRkcikKKwkJICAgIF9fZmllbGQodW5zaWduZWQsIGVudHJpZXMpCisJCSAgICApLAorCSAgICBUUF9mYXN0X2Fzc2lnbihfX2VudHJ5LT5hZGRyID0gYWRkcjsKKwkJCSAgIF9fZW50cnktPmVudHJpZXMgPSBlbnRyaWVzKSwKKwkgICAgVFBfcHJpbnRrKCJhZGRyICVwICBlbnRyaWVzICV1IiwKKwkJICAgICAgX19lbnRyeS0+YWRkciwgX19lbnRyeS0+ZW50cmllcykKKwkpOworCisKKyNlbmRpZiAvKiAgX1RSQUNFX1hFTl9IICovCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4vYmFsbG9vbi5oIGIvaW5jbHVkZS94ZW4vYmFsbG9vbi5oCmluZGV4IGEyYjIyZjAuLjc2Zjc1MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2JhbGxvb24uaAorKysgYi9pbmNsdWRlL3hlbi9iYWxsb29uLmgKQEAgLTE1LDYgKzE1LDEwIEBACiAJdW5zaWduZWQgbG9uZyBtYXhfc2NoZWR1bGVfZGVsYXk7CiAJdW5zaWduZWQgbG9uZyByZXRyeV9jb3VudDsKIAl1bnNpZ25lZCBsb25nIG1heF9yZXRyeV9jb3VudDsKKyNpZmRlZiBDT05GSUdfWEVOX0JBTExPT05fTUVNT1JZX0hPVFBMVUcKKwl1bnNpZ25lZCBsb25nIGhvdHBsdWdfcGFnZXM7CisJdW5zaWduZWQgbG9uZyBiYWxsb29uX2hvdHBsdWc7CisjZW5kaWYKIH07CiAKIGV4dGVybiBzdHJ1Y3QgYmFsbG9vbl9zdGF0cyBiYWxsb29uX3N0YXRzOwpAQCAtMjMsMyArMjcsMTMgQEAKIAogaW50IGFsbG9jX3hlbmJhbGxvb25lZF9wYWdlcyhpbnQgbnJfcGFnZXMsIHN0cnVjdCBwYWdlKiogcGFnZXMpOwogdm9pZCBmcmVlX3hlbmJhbGxvb25lZF9wYWdlcyhpbnQgbnJfcGFnZXMsIHN0cnVjdCBwYWdlKiogcGFnZXMpOworCitzdHJ1Y3Qgc3lzX2RldmljZTsKKyNpZmRlZiBDT05GSUdfWEVOX1NFTEZCQUxMT09OSU5HCitleHRlcm4gaW50IHJlZ2lzdGVyX3hlbl9zZWxmYmFsbG9vbmluZyhzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl94ZW5fc2VsZmJhbGxvb25pbmcoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4vZXZlbnRzLmggYi9pbmNsdWRlL3hlbi9ldmVudHMuaAppbmRleCA5YWYyMWUxLi5kMjg3OTk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3hlbi9ldmVudHMuaAorKysgYi9pbmNsdWRlL3hlbi9ldmVudHMuaApAQCAtNzQsOCArNzQsNiBAQAogdm9pZCB4ZW5fZXZ0Y2huX2RvX3VwY2FsbChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiB2b2lkIHhlbl9odm1fZXZ0Y2huX2RvX3VwY2FsbCh2b2lkKTsKIAotLyogQWxsb2NhdGUgYSBwaXJxIGZvciBhIHBoeXNpY2FsIGludGVycnVwdCwgZ2l2ZW4gYSBnc2kuICovCi1pbnQgeGVuX2FsbG9jYXRlX3BpcnFfZ3NpKHVuc2lnbmVkIGdzaSk7CiAvKiBCaW5kIGEgcGlycSBmb3IgYSBwaHlzaWNhbCBpbnRlcnJ1cHQgdG8gYW4gaXJxLiAqLwogaW50IHhlbl9iaW5kX3BpcnFfZ3NpX3RvX2lycSh1bnNpZ25lZCBnc2ksCiAJCQkgICAgIHVuc2lnbmVkIHBpcnEsIGludCBzaGFyZWFibGUsIGNoYXIgKm5hbWUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4vaHZjLWNvbnNvbGUuaCBiL2luY2x1ZGUveGVuL2h2Yy1jb25zb2xlLmgKaW5kZXggYzNhZGRlMy4uOTAxNzI0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vaHZjLWNvbnNvbGUuaAorKysgYi9pbmNsdWRlL3hlbi9odmMtY29uc29sZS5oCkBAIC02LDExICs2LDEzIEBACiAjaWZkZWYgQ09ORklHX0hWQ19YRU4KIHZvaWQgeGVuX2NvbnNvbGVfcmVzdW1lKHZvaWQpOwogdm9pZCB4ZW5fcmF3X2NvbnNvbGVfd3JpdGUoY29uc3QgY2hhciAqc3RyKTsKK19fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSkKIHZvaWQgeGVuX3Jhd19wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZW5fY29uc29sZV9yZXN1bWUodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgeGVuX3Jhd19jb25zb2xlX3dyaXRlKGNvbnN0IGNoYXIgKnN0cikgeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgeGVuX3Jhd19wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pIHsgfQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpCit2b2lkIHhlbl9yYXdfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7IH0KICNlbmRpZgogCiAjZW5kaWYJLyogWEVOX0hWQ19DT05TT0xFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS94ZW4uaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS94ZW4uaAppbmRleCA3MDIxM2I0Li42YWNkOWNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UveGVuLmgKKysrIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL3hlbi5oCkBAIC00NTAsNiArNDUwLDQ1IEBACiAJaW50OF90IGNtZF9saW5lW01BWF9HVUVTVF9DTURMSU5FXTsKIH07CiAKK3N0cnVjdCBkb20wX3ZnYV9jb25zb2xlX2luZm8geworCXVpbnQ4X3QgdmlkZW9fdHlwZTsKKyNkZWZpbmUgWEVOX1ZHQVRZUEVfVEVYVF9NT0RFXzMgMHgwMworI2RlZmluZSBYRU5fVkdBVFlQRV9WRVNBX0xGQiAgICAweDIzCisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKiBGb250IGhlaWdodCwgaW4gcGl4ZWxzLiAqLworCQkJdWludDE2X3QgZm9udF9oZWlnaHQ7CisJCQkvKiBDdXJzb3IgbG9jYXRpb24gKGNvbHVtbiwgcm93KS4gKi8KKwkJCXVpbnQxNl90IGN1cnNvcl94LCBjdXJzb3JfeTsKKwkJCS8qIE51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIChkaW1lbnNpb25zIGluIGNoYXJhY3RlcnMpLiAqLworCQkJdWludDE2X3Qgcm93cywgY29sdW1uczsKKwkJfSB0ZXh0X21vZGVfMzsKKworCQlzdHJ1Y3QgeworCQkJLyogV2lkdGggYW5kIGhlaWdodCwgaW4gcGl4ZWxzLiAqLworCQkJdWludDE2X3Qgd2lkdGgsIGhlaWdodDsKKwkJCS8qIEJ5dGVzIHBlciBzY2FuIGxpbmUuICovCisJCQl1aW50MTZfdCBieXRlc19wZXJfbGluZTsKKwkJCS8qIEJpdHMgcGVyIHBpeGVsLiAqLworCQkJdWludDE2X3QgYml0c19wZXJfcGl4ZWw7CisJCQkvKiBMRkIgcGh5c2ljYWwgYWRkcmVzcywgYW5kIHNpemUgKGluIHVuaXRzIG9mIDY0a0IpLiAqLworCQkJdWludDMyX3QgbGZiX2Jhc2U7CisJCQl1aW50MzJfdCBsZmJfc2l6ZTsKKwkJCS8qIFJHQiBtYXNrIG9mZnNldHMgYW5kIHNpemVzLCBhcyBkZWZpbmVkIGJ5IFZCRSAxLjIrICovCisJCQl1aW50OF90ICByZWRfcG9zLCByZWRfc2l6ZTsKKwkJCXVpbnQ4X3QgIGdyZWVuX3BvcywgZ3JlZW5fc2l6ZTsKKwkJCXVpbnQ4X3QgIGJsdWVfcG9zLCBibHVlX3NpemU7CisJCQl1aW50OF90ICByc3ZkX3BvcywgcnN2ZF9zaXplOworCisJCQkvKiBWRVNBIGNhcGFiaWxpdGllcyAob2Zmc2V0IDB4YSwgVkVTQSBjb21tYW5kIDB4NGYwMCkuICovCisJCQl1aW50MzJfdCBnYmxfY2FwczsKKwkJCS8qIE1vZGUgYXR0cmlidXRlcyAob2Zmc2V0IDB4MCwgVkVTQSBjb21tYW5kIDB4NGYwMSkuICovCisJCQl1aW50MTZfdCBtb2RlX2F0dHJzOworCQl9IHZlc2FfbGZiOworCX0gdTsKK307CisKIC8qIFRoZXNlIGZsYWdzIGFyZSBwYXNzZWQgaW4gdGhlICdmbGFncycgZmllbGQgb2Ygc3RhcnRfaW5mb190LiAqLwogI2RlZmluZSBTSUZfUFJJVklMRUdFRCAgICAoMTw8MCkgIC8qIElzIHRoZSBkb21haW4gcHJpdmlsZWdlZD8gKi8KICNkZWZpbmUgU0lGX0lOSVRET01BSU4gICAgKDE8PDEpICAvKiBJcyB0aGlzIHRoZSBpbml0aWFsIGNvbnRyb2wgZG9tYWluPyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4vdG1lbS5oIGIvaW5jbHVkZS94ZW4vdG1lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTJjODMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3hlbi90bWVtLmgKQEAgLTAsMCArMSw1IEBACisjaWZuZGVmIF9YRU5fVE1FTV9ICisjZGVmaW5lIF9YRU5fVE1FTV9ICisvKiBkZWZpbmVkIGluIGRyaXZlcnMveGVuL3RtZW0uYyAqLworZXh0ZXJuIGludCB0bWVtX2VuYWJsZWQ7CisjZW5kaWYgLyogX1hFTl9UTUVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL3hlbmJ1cy5oIGIvaW5jbHVkZS94ZW4veGVuYnVzLmgKaW5kZXggNTQ2NzM2OS4uYWNlZWNhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4veGVuYnVzLmgKKysrIGIvaW5jbHVkZS94ZW4veGVuYnVzLmgKQEAgLTIyMyw3ICsyMjMsOSBAQAogCiBlbnVtIHhlbmJ1c19zdGF0ZSB4ZW5idXNfcmVhZF9kcml2ZXJfc3RhdGUoY29uc3QgY2hhciAqcGF0aCk7CiAKK19fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDMsIDQpKSkKIHZvaWQgeGVuYnVzX2Rldl9lcnJvcihzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LCBpbnQgZXJyLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpCiB2b2lkIHhlbmJ1c19kZXZfZmF0YWwoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldiwgaW50IGVyciwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiBjb25zdCBjaGFyICp4ZW5idXNfc3Ryc3RhdGUoZW51bSB4ZW5idXNfc3RhdGUgc3RhdGUpOwpkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IGViYWZhYzQuLmQ2Mjc3ODMgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTE5LDcgKzE5LDYgQEAKIGNvbmZpZyBDT05TVFJVQ1RPUlMKIAlib29sCiAJZGVwZW5kcyBvbiAhVU1MCi0JZGVmYXVsdCB5CiAKIGNvbmZpZyBIQVZFX0lSUV9XT1JLCiAJYm9vbApAQCAtMjA0LDYgKzIwMywxNSBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIERFRkFVTFRfSE9TVE5BTUUKKwlzdHJpbmcgIkRlZmF1bHQgaG9zdG5hbWUiCisJZGVmYXVsdCAiKG5vbmUpIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGRldGVybWluZXMgdGhlIGRlZmF1bHQgc3lzdGVtIGhvc3RuYW1lIGJlZm9yZSB1c2Vyc3BhY2UKKwkgIGNhbGxzIHNldGhvc3RuYW1lKDIpLiBUaGUga2VybmVsIHRyYWRpdGlvbmFsbHkgdXNlcyAiKG5vbmUpIiBoZXJlLAorCSAgYnV0IHlvdSBtYXkgd2lzaCB0byB1c2UgYSBkaWZmZXJlbnQgZGVmYXVsdCBoZXJlIHRvIG1ha2UgYSBtaW5pbWFsCisJICBzeXN0ZW0gbW9yZSB1c2FibGUgd2l0aCBsZXNzIGNvbmZpZ3VyYXRpb24uCisKIGNvbmZpZyBTV0FQCiAJYm9vbCAiU3VwcG9ydCBmb3IgcGFnaW5nIG9mIGFub255bW91cyBtZW1vcnkgKHN3YXApIgogCWRlcGVuZHMgb24gTU1VICYmIEJMT0NLCkBAIC02NjUsNyArNjczLDcgQEAKIAkgIGJlIGNhcmVmdWwgYWJvdXQgZW5hYmxpbmcgdGhpcy4gV2hlbiBtZW1vcnkgcmVzb3VyY2UgY29udHJvbGxlcgogCSAgaXMgZGlzYWJsZWQgYnkgYm9vdCBvcHRpb24sIHRoaXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGFuZAogCSAgdGhlcmUgd2lsbCBiZSBubyBvdmVyaGVhZCBmcm9tIHRoaXMuIEV2ZW4gd2hlbiB5b3Ugc2V0IHRoaXMgY29uZmlnPXksCi0JICBpZiBib290IG9wdGlvbiAibm9zd2FwYWNjb3VudCIgaXMgc2V0LCBzd2FwIHdpbGwgbm90IGJlIGFjY291bnRlZC4KKwkgIGlmIGJvb3Qgb3B0aW9uICJzd2FwYWNjb3VudD0wIiBpcyBzZXQsIHN3YXAgd2lsbCBub3QgYmUgYWNjb3VudGVkLgogCSAgTm93LCBtZW1vcnkgdXNhZ2Ugb2Ygc3dhcF9jZ3JvdXAgaXMgMiBieXRlcyBwZXIgZW50cnkuIElmIHN3YXAgcGFnZQogCSAgc2l6ZSBpcyA0MDk2Ynl0ZXMsIDUxMmsgcGVyIDFHYnl0ZXMgb2Ygc3dhcC4KIGNvbmZpZyBDR1JPVVBfTUVNX1JFU19DVExSX1NXQVBfRU5BQkxFRApAQCAtNjgwLDcgKzY4OCw3IEBACiAJICBwYXJhbWV0ZXIgc2hvdWxkIGhhdmUgdGhpcyBvcHRpb24gdW5zZWxlY3RlZC4KIAkgIEZvciB0aG9zZSB3aG8gd2FudCB0byBoYXZlIHRoZSBmZWF0dXJlIGVuYWJsZWQgYnkgZGVmYXVsdCBzaG91bGQKIAkgIHNlbGVjdCB0aGlzIG9wdGlvbiAoaWYsIGZvciBzb21lIHJlYXNvbiwgdGhleSBuZWVkIHRvIGRpc2FibGUgaXQKLQkgIHRoZW4gbm9zd2FwYWNjb3VudCBkb2VzIHRoZSB0cmljaykuCisJICB0aGVuIHN3YXBhY2NvdW50PTAgZG9lcyB0aGUgdHJpY2spLgogCiBjb25maWcgQ0dST1VQX1BFUkYKIAlib29sICJFbmFibGUgcGVyZl9ldmVudCBwZXItY3B1IHBlci1jb250YWluZXIgZ3JvdXAgKGNncm91cCkgbW9uaXRvcmluZyIKQEAgLTkwOSw2ICs5MTcsOCBAQAogCiBtZW51Y29uZmlnIEVYUEVSVAogCWJvb2wgIkNvbmZpZ3VyZSBzdGFuZGFyZCBrZXJuZWwgZmVhdHVyZXMgKGV4cGVydCB1c2VycykiCisJIyBVbmhpZGUgZGVidWcgb3B0aW9ucywgdG8gbWFrZSB0aGUgb24tYnktZGVmYXVsdCBvcHRpb25zIHZpc2libGUKKwlzZWxlY3QgREVCVUdfS0VSTkVMCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWxsb3dzIGNlcnRhaW4gYmFzZSBrZXJuZWwgb3B0aW9ucyBhbmQgc2V0dGluZ3MKICAgICAgICAgICB0byBiZSBkaXNhYmxlZCBvciB0d2Vha2VkLiBUaGlzIGlzIGZvciBzcGVjaWFsaXplZApAQCAtOTk5LDE0ICsxMDA5LDE5IEBACiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgY29yZSBkdW1wcy4gRGlzYWJsaW5nIHNhdmVzIGFib3V0IDRrLgogCisKIGNvbmZpZyBQQ1NQS1JfUExBVEZPUk0KIAlib29sICJFbmFibGUgUEMtU3BlYWtlciBzdXBwb3J0IiBpZiBFWFBFUlQKLQlkZXBlbmRzIG9uIEFMUEhBIHx8IFg4NiB8fCBNSVBTIHx8IFBQQ19QUkVQIHx8IFBQQ19DSFJQIHx8IFBQQ19QU0VSSUVTCisJZGVwZW5kcyBvbiBIQVZFX1BDU1BLUl9QTEFURk9STQorCXNlbGVjdCBJODI1M19MT0NLCiAJZGVmYXVsdCB5CiAJaGVscAogICAgICAgICAgIFRoaXMgb3B0aW9uIGFsbG93cyB0byBkaXNhYmxlIHRoZSBpbnRlcm5hbCBQQy1TcGVha2VyCiAgICAgICAgICAgc3VwcG9ydCwgc2F2aW5nIHNvbWUgbWVtb3J5LgogCitjb25maWcgSEFWRV9QQ1NQS1JfUExBVEZPUk0KKwlib29sCisKIGNvbmZpZyBCQVNFX0ZVTEwKIAlkZWZhdWx0IHkKIAlib29sICJFbmFibGUgZnVsbC1zaXplZCBkYXRhIHN0cnVjdHVyZXMgZm9yIGNvcmUiIGlmIEVYUEVSVApkaWZmIC0tZ2l0IGEvaW5pdC9jYWxpYnJhdGUuYyBiL2luaXQvY2FsaWJyYXRlLmMKaW5kZXggY2ZkNzAwMC4uMjRkZjc5NyAxMDA2NDQKLS0tIGEvaW5pdC9jYWxpYnJhdGUuYworKysgYi9pbml0L2NhbGlicmF0ZS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogCiB1bnNpZ25lZCBsb25nIGxwal9maW5lOwogdW5zaWduZWQgbG9uZyBwcmVzZXRfbHBqOwpAQCAtOTMsOSArOTQsNiBAQAogCQkgKiBJZiB0aGUgdXBwZXIgbGltaXQgYW5kIGxvd2VyIGxpbWl0IG9mIHRoZSB0aW1lcl9yYXRlIGlzCiAJCSAqID49IDEyLjUlIGFwYXJ0LCByZWRvIGNhbGlicmF0aW9uLgogCQkgKi8KLQkJcHJpbnRrKEtFUk5fREVCVUcgImNhbGlicmF0ZV9kZWxheV9kaXJlY3QoKSB0aW1lcl9yYXRlX21heD0lbHUgIgotCQkJICAgICJ0aW1lcl9yYXRlX21pbj0lbHUgcHJlX3N0YXJ0PSVsdSBwcmVfZW5kPSVsdVxuIiwKLQkJCSAgdGltZXJfcmF0ZV9tYXgsIHRpbWVyX3JhdGVfbWluLCBwcmVfc3RhcnQsIHByZV9lbmQpOwogCQlpZiAoc3RhcnQgPj0gcG9zdF9lbmQpCiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgImNhbGlicmF0ZV9kZWxheV9kaXJlY3QoKSBpZ25vcmluZyAiCiAJCQkJCSJ0aW1lcl9yYXRlIGFzIHdlIGhhZCBhIFRTQyB3cmFwIGFyb3VuZCIKQEAgLTI0NiwzMiArMjQ0LDQyIEBACiAJcmV0dXJuIGxwajsKIH0KIAorc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGNwdV9sb29wc19wZXJfamlmZnkpID0geyAwIH07CisKIHZvaWQgX19jcHVpbml0IGNhbGlicmF0ZV9kZWxheSh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgbHBqOwogCXN0YXRpYyBib29sIHByaW50ZWQ7CisJaW50IHRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JaWYgKHByZXNldF9scGopIHsKLQkJbG9vcHNfcGVyX2ppZmZ5ID0gcHJlc2V0X2xwajsKKwlpZiAocGVyX2NwdShjcHVfbG9vcHNfcGVyX2ppZmZ5LCB0aGlzX2NwdSkpIHsKKwkJbHBqID0gcGVyX2NwdShjcHVfbG9vcHNfcGVyX2ppZmZ5LCB0aGlzX2NwdSk7CisJCXByX2luZm8oIkNhbGlicmF0aW5nIGRlbGF5IGxvb3AgKHNraXBwZWQpICIKKwkJCQkiYWxyZWFkeSBjYWxpYnJhdGVkIHRoaXMgQ1BVIik7CisJfSBlbHNlIGlmIChwcmVzZXRfbHBqKSB7CisJCWxwaiA9IHByZXNldF9scGo7CiAJCWlmICghcHJpbnRlZCkKIAkJCXByX2luZm8oIkNhbGlicmF0aW5nIGRlbGF5IGxvb3AgKHNraXBwZWQpICIKIAkJCQkicHJlc2V0IHZhbHVlLi4gIik7CiAJfSBlbHNlIGlmICgoIXByaW50ZWQpICYmIGxwal9maW5lKSB7Ci0JCWxvb3BzX3Blcl9qaWZmeSA9IGxwal9maW5lOworCQlscGogPSBscGpfZmluZTsKIAkJcHJfaW5mbygiQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcCAoc2tpcHBlZCksICIKIAkJCSJ2YWx1ZSBjYWxjdWxhdGVkIHVzaW5nIHRpbWVyIGZyZXF1ZW5jeS4uICIpOwotCX0gZWxzZSBpZiAoKGxvb3BzX3Blcl9qaWZmeSA9IGNhbGlicmF0ZV9kZWxheV9kaXJlY3QoKSkgIT0gMCkgeworCX0gZWxzZSBpZiAoKGxwaiA9IGNhbGlicmF0ZV9kZWxheV9kaXJlY3QoKSkgIT0gMCkgewogCQlpZiAoIXByaW50ZWQpCiAJCQlwcl9pbmZvKCJDYWxpYnJhdGluZyBkZWxheSB1c2luZyB0aW1lciAiCiAJCQkJInNwZWNpZmljIHJvdXRpbmUuLiAiKTsKIAl9IGVsc2UgewogCQlpZiAoIXByaW50ZWQpCiAJCQlwcl9pbmZvKCJDYWxpYnJhdGluZyBkZWxheSBsb29wLi4uICIpOwotCQlsb29wc19wZXJfamlmZnkgPSBjYWxpYnJhdGVfZGVsYXlfY29udmVyZ2UoKTsKKwkJbHBqID0gY2FsaWJyYXRlX2RlbGF5X2NvbnZlcmdlKCk7CiAJfQorCXBlcl9jcHUoY3B1X2xvb3BzX3Blcl9qaWZmeSwgdGhpc19jcHUpID0gbHBqOwogCWlmICghcHJpbnRlZCkKIAkJcHJfY29udCgiJWx1LiUwMmx1IEJvZ29NSVBTIChscGo9JWx1KVxuIiwKLQkJCWxvb3BzX3Blcl9qaWZmeS8oNTAwMDAwL0haKSwKLQkJCShsb29wc19wZXJfamlmZnkvKDUwMDAvSFopKSAlIDEwMCwgbG9vcHNfcGVyX2ppZmZ5KTsKKwkJCWxwai8oNTAwMDAwL0haKSwKKwkJCShscGovKDUwMDAvSFopKSAlIDEwMCwgbHBqKTsKIAorCWxvb3BzX3Blcl9qaWZmeSA9IGxwajsKIAlwcmludGVkID0gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggY2FmYmE2Ny4uZDcyMTFmYSAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTU0Miw2ICs1NDIsNyBAQAogCXRpbWVrZWVwaW5nX2luaXQoKTsKIAl0aW1lX2luaXQoKTsKIAlwcm9maWxlX2luaXQoKTsKKwljYWxsX2Z1bmN0aW9uX2luaXQoKTsKIAlpZiAoIWlycXNfZGlzYWJsZWQoKSkKIAkJcHJpbnRrKEtFUk5fQ1JJVCAic3RhcnRfa2VybmVsKCk6IGJ1ZzogaW50ZXJydXB0cyB3ZXJlICIKIAkJCQkgImVuYWJsZWQgZWFybHlcbiIpOwpkaWZmIC0tZ2l0IGEvaXBjL3NlbS5jIGIvaXBjL3NlbS5jCmluZGV4IDM0MTkzZWQuLmM4ZTAwZjggMTAwNjQ0Ci0tLSBhL2lwYy9zZW0uYworKysgYi9pcGMvc2VtLmMKQEAgLTY4OSwxMiArNjg5LDYgQEAKIAlyZXR1cm4gc2VtemNudDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV91bihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IHNlbV91bmRvICp1biA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3Qgc2VtX3VuZG8sIHJjdSk7Ci0Ja2ZyZWUodW4pOwotfQotCiAvKiBGcmVlIGEgc2VtYXBob3JlIHNldC4gZnJlZWFyeSgpIGlzIGNhbGxlZCB3aXRoIHNlbV9pZHMucndfbXV0ZXggbG9ja2VkCiAgKiBhcyBhIHdyaXRlciBhbmQgdGhlIHNwaW5sb2NrIGZvciB0aGlzIHNlbWFwaG9yZSBzZXQgaG9sZC4gc2VtX2lkcy5yd19tdXRleAogICogcmVtYWlucyBsb2NrZWQgb24gZXhpdC4KQEAgLTcxNCw3ICs3MDgsNyBAQAogCQl1bi0+c2VtaWQgPSAtMTsKIAkJbGlzdF9kZWxfcmN1KCZ1bi0+bGlzdF9wcm9jKTsKIAkJc3Bpbl91bmxvY2soJnVuLT51bHAtPmxvY2spOwotCQljYWxsX3JjdSgmdW4tPnJjdSwgZnJlZV91bik7CisJCWtmcmVlX3JjdSh1biwgcmN1KTsKIAl9CiAKIAkvKiBXYWtlIHVwIGFsbCBwZW5kaW5nIHByb2Nlc3NlcyBhbmQgbGV0IHRoZW0gZmFpbCB3aXRoIEVJRFJNLiAqLwpAQCAtMTQ1NiwxNSArMTQ1MCwyNCBAQAogCX0KIAogCXNtYSA9IHNlbV9sb2NrKG5zLCBzZW1pZCk7CisKKwkvKgorCSAqIFdhaXQgdW50aWwgaXQncyBndWFyYW50ZWVkIHRoYXQgbm8gd2FrZXVwX3NlbV9xdWV1ZV9kbygpIGlzIG9uZ29pbmcuCisJICovCisJZXJyb3IgPSBnZXRfcXVldWVfcmVzdWx0KCZxdWV1ZSk7CisKKwkvKgorCSAqIEFycmF5IHJlbW92ZWQ/IElmIHllcywgbGVhdmUgd2l0aG91dCBzZW1fdW5sb2NrKCkuCisJICovCiAJaWYgKElTX0VSUihzbWEpKSB7CiAJCWVycm9yID0gLUVJRFJNOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCWVycm9yID0gZ2V0X3F1ZXVlX3Jlc3VsdCgmcXVldWUpOwogCiAJLyoKLQkgKiBJZiBxdWV1ZS5zdGF0dXMgIT0gLUVJTlRSIHdlIGFyZSB3b2tlbiB1cCBieSBhbm90aGVyIHByb2Nlc3MKKwkgKiBJZiBxdWV1ZS5zdGF0dXMgIT0gLUVJTlRSIHdlIGFyZSB3b2tlbiB1cCBieSBhbm90aGVyIHByb2Nlc3MuCisJICogTGVhdmUgd2l0aG91dCB1bmxpbmtfcXVldWUoKSwgYnV0IHdpdGggc2VtX3VubG9jaygpLgogCSAqLwogCiAJaWYgKGVycm9yICE9IC1FSU5UUikgewpAQCAtMTYxMiw3ICsxNjE1LDcgQEAKIAkJc2VtX3VubG9jayhzbWEpOwogCQl3YWtlX3VwX3NlbV9xdWV1ZV9kbygmdGFza3MpOwogCi0JCWNhbGxfcmN1KCZ1bi0+cmN1LCBmcmVlX3VuKTsKKwkJa2ZyZWVfcmN1KHVuLCByY3UpOwogCX0KIAlrZnJlZSh1bHApOwogfQpkaWZmIC0tZ2l0IGEvaXBjL3NobS5jIGIvaXBjL3NobS5jCmluZGV4IGFiMzM4NWEuLjI3ODg0YWQgMTAwNjQ0Ci0tLSBhL2lwYy9zaG0uYworKysgYi9pcGMvc2htLmMKQEAgLTI3NywxMyArMjc3LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2htX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZGF0YXN5bmMpCitzdGF0aWMgaW50IHNobV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCiB7CiAJc3RydWN0IHNobV9maWxlX2RhdGEgKnNmZCA9IHNobV9maWxlX2RhdGEoZmlsZSk7CiAKIAlpZiAoIXNmZC0+ZmlsZS0+Zl9vcC0+ZnN5bmMpCiAJCXJldHVybiAtRUlOVkFMOwotCXJldHVybiBzZmQtPmZpbGUtPmZfb3AtPmZzeW5jKHNmZC0+ZmlsZSwgZGF0YXN5bmMpOworCXJldHVybiBzZmQtPmZpbGUtPmZfb3AtPmZzeW5jKHNmZC0+ZmlsZSwgc3RhcnQsIGVuZCwgZGF0YXN5bmMpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzaG1fZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbGUsCmRpZmYgLS1naXQgYS9pcGMvdXRpbC5jIGIvaXBjL3V0aWwuYwppbmRleCA1YzBkMjg5Li43NTI2MWEzIDEwMDY0NAotLS0gYS9pcGMvdXRpbC5jCisrKyBiL2lwYy91dGlsLmMKQEAgLTU3OSwxOSArNTc5LDYgQEAKIAlzY2hlZHVsZV93b3JrKCZzY2hlZC0+d29yayk7CiB9CiAKLS8qKgotICogaXBjX2ltbWVkaWF0ZV9mcmVlIC0gZnJlZSBpcGMgKyByY3Ugc3BhY2UKLSAqIEBoZWFkOiBSQ1UgY2FsbGJhY2sgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgcG9pbnRlciB0byBiZSBmcmVlZAotICoKLSAqIEZyZWUgZnJvbSB0aGUgUkNVIGNhbGxiYWNrIGNvbnRleHQuCi0gKi8KLXN0YXRpYyB2b2lkIGlwY19pbW1lZGlhdGVfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGlwY19yY3VfZ3JhY2UgKmZyZWUgPQotCQljb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGlwY19yY3VfZ3JhY2UsIHJjdSk7Ci0Ja2ZyZWUoZnJlZSk7Ci19Ci0KIHZvaWQgaXBjX3JjdV9wdXRyZWYodm9pZCAqcHRyKQogewogCWlmICgtLWNvbnRhaW5lcl9vZihwdHIsIHN0cnVjdCBpcGNfcmN1X2hkciwgZGF0YSktPnJlZmNvdW50ID4gMCkKQEAgLTYwMSw4ICs1ODgsNyBAQAogCQljYWxsX3JjdSgmY29udGFpbmVyX29mKHB0ciwgc3RydWN0IGlwY19yY3VfZ3JhY2UsIGRhdGEpLT5yY3UsCiAJCQkJaXBjX3NjaGVkdWxlX2ZyZWUpOwogCX0gZWxzZSB7Ci0JCWNhbGxfcmN1KCZjb250YWluZXJfb2YocHRyLCBzdHJ1Y3QgaXBjX3JjdV9ncmFjZSwgZGF0YSktPnJjdSwKLQkJCQlpcGNfaW1tZWRpYXRlX2ZyZWUpOworCQlrZnJlZV9yY3UoY29udGFpbmVyX29mKHB0ciwgc3RydWN0IGlwY19yY3VfZ3JhY2UsIGRhdGEpLCByY3UpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL0tjb25maWcucHJlZW1wdCBiL2tlcm5lbC9LY29uZmlnLnByZWVtcHQKaW5kZXggYmY5ODdiOS4uMjRlN2NiMCAxMDA2NDQKLS0tIGEva2VybmVsL0tjb25maWcucHJlZW1wdAorKysgYi9rZXJuZWwvS2NvbmZpZy5wcmVlbXB0CkBAIC0zNSw2ICszNSw3IEBACiAKIGNvbmZpZyBQUkVFTVBUCiAJYm9vbCAiUHJlZW1wdGlibGUgS2VybmVsIChMb3ctTGF0ZW5jeSBEZXNrdG9wKSIKKwlzZWxlY3QgUFJFRU1QVF9DT1VOVAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHJlZHVjZXMgdGhlIGxhdGVuY3kgb2YgdGhlIGtlcm5lbCBieSBtYWtpbmcKIAkgIGFsbCBrZXJuZWwgY29kZSAodGhhdCBpcyBub3QgZXhlY3V0aW5nIGluIGEgY3JpdGljYWwgc2VjdGlvbikKQEAgLTUyLDMgKzUzLDUgQEAKIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBQUkVFTVBUX0NPVU5UCisgICAgICAgYm9vbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2tlcm5lbC9NYWtlZmlsZSBiL2tlcm5lbC9NYWtlZmlsZQppbmRleCAyZDY0Y2ZjLi5kMDY0NjdmIDEwMDY0NAotLS0gYS9rZXJuZWwvTWFrZWZpbGUKKysrIGIva2VybmVsL01ha2VmaWxlCkBAIC0xMjUsMTEgKzEyNSwxMCBAQAogJChvYmopL2NvbmZpZ19kYXRhLmd6OiAkKEtDT05GSUdfQ09ORklHKSBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGd6aXApCiAKLXF1aWV0X2NtZF9pa2NvbmZpZ2d6ID0gSUtDRkcgICAkQAotICAgICAgY21kX2lrY29uZmlnZ3ogPSAoZWNobyAic3RhdGljIGNvbnN0IGNoYXIga2VybmVsX2NvbmZpZ19kYXRhW10gX191c2VkID0gTUFHSUNfU1RBUlQiOyBjYXQgJDwgfCBzY3JpcHRzL2JpbjJjOyBlY2hvICJNQUdJQ19FTkQ7IikgPiAkQAorICAgICAgZmlsZWNoa19pa2NvbmZpZ2d6ID0gKGVjaG8gInN0YXRpYyBjb25zdCBjaGFyIGtlcm5lbF9jb25maWdfZGF0YVtdIF9fdXNlZCA9IE1BR0lDX1NUQVJUIjsgY2F0ICQ8IHwgc2NyaXB0cy9iaW4yYzsgZWNobyAiTUFHSUNfRU5EOyIpCiB0YXJnZXRzICs9IGNvbmZpZ19kYXRhLmgKICQob2JqKS9jb25maWdfZGF0YS5oOiAkKG9iaikvY29uZmlnX2RhdGEuZ3ogRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCxpa2NvbmZpZ2d6KQorCSQoY2FsbCBmaWxlY2hrLGlrY29uZmlnZ3opCiAKICQob2JqKS90aW1lLm86ICQob2JqKS90aW1lY29uc3QuaAogCmRpZmYgLS1naXQgYS9rZXJuZWwvYXN5bmMuYyBiL2tlcm5lbC9hc3luYy5jCmluZGV4IGNkOWRiYjkuLmQ1ZmU3YWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hc3luYy5jCisrKyBiL2tlcm5lbC9hc3luYy5jCkBAIC00OSwxMiArNDksMTMgQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogc3RhdGljIGFzeW5jX2Nvb2tpZV90IG5leHRfY29va2llID0gMTsKIApAQCAtMTI4LDcgKzEyOSw4IEBACiAKIAkvKiAyKSBydW4gKGFuZCBwcmludCBkdXJhdGlvbikgKi8KIAlpZiAoaW5pdGNhbGxfZGVidWcgJiYgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9CT09USU5HKSB7Ci0JCXByaW50aygiY2FsbGluZyAgJWxsaV8lcEYgQCAlaVxuIiwgKGxvbmcgbG9uZyllbnRyeS0+Y29va2llLAorCQlwcmludGsoS0VSTl9ERUJVRyAiY2FsbGluZyAgJWxsaV8lcEYgQCAlaVxuIiwKKwkJCShsb25nIGxvbmcpZW50cnktPmNvb2tpZSwKIAkJCWVudHJ5LT5mdW5jLCB0YXNrX3BpZF9ucihjdXJyZW50KSk7CiAJCWNhbGx0aW1lID0ga3RpbWVfZ2V0KCk7CiAJfQpAQCAtMTM2LDcgKzEzOCw3IEBACiAJaWYgKGluaXRjYWxsX2RlYnVnICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykgewogCQlyZXR0aW1lID0ga3RpbWVfZ2V0KCk7CiAJCWRlbHRhID0ga3RpbWVfc3ViKHJldHRpbWUsIGNhbGx0aW1lKTsKLQkJcHJpbnRrKCJpbml0Y2FsbCAlbGxpXyVwRiByZXR1cm5lZCAwIGFmdGVyICVsbGQgdXNlY3NcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHICJpbml0Y2FsbCAlbGxpXyVwRiByZXR1cm5lZCAwIGFmdGVyICVsbGQgdXNlY3NcbiIsCiAJCQkobG9uZyBsb25nKWVudHJ5LT5jb29raWUsCiAJCQllbnRyeS0+ZnVuYywKIAkJCShsb25nIGxvbmcpa3RpbWVfdG9fbnMoZGVsdGEpID4+IDEwKTsKQEAgLTI3MCw3ICsyNzIsNyBAQAogCWt0aW1lX3Qgc3RhcnR0aW1lLCBkZWx0YSwgZW5kdGltZTsKIAogCWlmIChpbml0Y2FsbF9kZWJ1ZyAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0JPT1RJTkcpIHsKLQkJcHJpbnRrKCJhc3luY193YWl0aW5nIEAgJWlcbiIsIHRhc2tfcGlkX25yKGN1cnJlbnQpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImFzeW5jX3dhaXRpbmcgQCAlaVxuIiwgdGFza19waWRfbnIoY3VycmVudCkpOwogCQlzdGFydHRpbWUgPSBrdGltZV9nZXQoKTsKIAl9CiAKQEAgLTI4MCw3ICsyODIsNyBAQAogCQllbmR0aW1lID0ga3RpbWVfZ2V0KCk7CiAJCWRlbHRhID0ga3RpbWVfc3ViKGVuZHRpbWUsIHN0YXJ0dGltZSk7CiAKLQkJcHJpbnRrKCJhc3luY19jb250aW51aW5nIEAgJWkgYWZ0ZXIgJWxsaSB1c2VjXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAiYXN5bmNfY29udGludWluZyBAICVpIGFmdGVyICVsbGkgdXNlY1xuIiwKIAkJCXRhc2tfcGlkX25yKGN1cnJlbnQpLAogCQkJKGxvbmcgbG9uZylrdGltZV90b19ucyhkZWx0YSkgPj4gMTApOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdC5jIGIva2VybmVsL2F1ZGl0LmMKaW5kZXggOTM5NTAwMy4uNTI1MDFiNSAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0LmMKKysrIGIva2VybmVsL2F1ZGl0LmMKQEAgLTU1LDYgKzU1LDkgQEAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CkBAIC0xNTAyLDYgKzE1MDUsMzIgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfU0VDVVJJVFkKKy8qKgorICogYXVkaXRfbG9nX3NlY2N0eCAtIENvbnZlcnRzIGFuZCBsb2dzIFNFTGludXggY29udGV4dAorICogQGFiOiBhdWRpdF9idWZmZXIKKyAqIEBzZWNpZDogc2VjdXJpdHkgbnVtYmVyCisgKgorICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IGNhbGxzIHNlY3VyaXR5X3NlY2lkX3RvX3NlY2N0eCB0byBjb252ZXJ0CisgKiBzZWNpZCB0byBzZWNjdHggYW5kIHRoZW4gYWRkcyB0aGUgKGNvbnZlcnRlZCkgU0VMaW51eCBjb250ZXh0IHRvIHRoZSBhdWRpdAorICogbG9nIGJ5IGNhbGxpbmcgYXVkaXRfbG9nX2Zvcm1hdCwgdGh1cyBhbHNvIHByZXZlbnRpbmcgbGVhayBvZiBpbnRlcm5hbCBzZWNpZAorICogdG8gdXNlcnNwYWNlLiBJZiBzZWNpZCBjYW5ub3QgYmUgY29udmVydGVkIGF1ZGl0X3BhbmljIGlzIGNhbGxlZC4KKyAqLwordm9pZCBhdWRpdF9sb2dfc2VjY3R4KHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCB1MzIgc2VjaWQpCit7CisJdTMyIGxlbjsKKwljaGFyICpzZWNjdHg7CisKKwlpZiAoc2VjdXJpdHlfc2VjaWRfdG9fc2VjY3R4KHNlY2lkLCAmc2VjY3R4LCAmbGVuKSkgeworCQlhdWRpdF9wYW5pYygiQ2Fubm90IGNvbnZlcnQgc2VjaWQgdG8gY29udGV4dCIpOworCX0gZWxzZSB7CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgb2JqPSVzIiwgc2VjY3R4KTsKKwkJc2VjdXJpdHlfcmVsZWFzZV9zZWNjdHgoc2VjY3R4LCBsZW4pOworCX0KK30KK0VYUE9SVF9TWU1CT0woYXVkaXRfbG9nX3NlY2N0eCk7CisjZW5kaWYKKwogRVhQT1JUX1NZTUJPTChhdWRpdF9sb2dfc3RhcnQpOwogRVhQT1JUX1NZTUJPTChhdWRpdF9sb2dfZW5kKTsKIEVYUE9SVF9TWU1CT0woYXVkaXRfbG9nX2Zvcm1hdCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRfdHJlZS5jIGIva2VybmVsL2F1ZGl0X3RyZWUuYwppbmRleCBlOTlkZGEwLi41YmYwNzkwIDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXRfdHJlZS5jCisrKyBiL2tlcm5lbC9hdWRpdF90cmVlLmMKQEAgLTkzLDE2ICs5MywxMCBAQAogCWF0b21pY19pbmMoJnRyZWUtPmNvdW50KTsKIH0KIAotc3RhdGljIHZvaWQgX19wdXRfdHJlZShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlzdHJ1Y3QgYXVkaXRfdHJlZSAqdHJlZSA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBhdWRpdF90cmVlLCBoZWFkKTsKLQlrZnJlZSh0cmVlKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHB1dF90cmVlKHN0cnVjdCBhdWRpdF90cmVlICp0cmVlKQogewogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ0cmVlLT5jb3VudCkpCi0JCWNhbGxfcmN1KCZ0cmVlLT5oZWFkLCBfX3B1dF90cmVlKTsKKwkJa2ZyZWVfcmN1KHRyZWUsIGhlYWQpOwogfQogCiAvKiB0byBhdm9pZCBicmluZ2luZyB0aGUgZW50aXJlIHRoaW5nIGluIGF1ZGl0LmggKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAuYyBiL2tlcm5lbC9jZ3JvdXAuYwppbmRleCAyNzMxZDExLi5hNjM1MDdiOSAxMDA2NDQKLS0tIGEva2VybmVsL2Nncm91cC5jCisrKyBiL2tlcm5lbC9jZ3JvdXAuYwpAQCAtMTY5Nyw3ICsxNjk3LDYgQEAKIHsKIAljaGFyICpzdGFydDsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2soY2dycC0+ZGVudHJ5LAotCQkJCQkJICAgICAgcmN1X3JlYWRfbG9ja19oZWxkKCkgfHwKIAkJCQkJCSAgICAgIGNncm91cF9sb2NrX2lzX2hlbGQoKSk7CiAKIAlpZiAoIWRlbnRyeSB8fCBjZ3JwID09IGR1bW15dG9wKSB7CkBAIC0xNzIzLDcgKzE3MjIsNiBAQAogCQkJYnJlYWs7CiAKIAkJZGVudHJ5ID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGNncnAtPmRlbnRyeSwKLQkJCQkJICAgICAgIHJjdV9yZWFkX2xvY2tfaGVsZCgpIHx8CiAJCQkJCSAgICAgICBjZ3JvdXBfbG9ja19pc19oZWxkKCkpOwogCQlpZiAoIWNncnAtPnBhcmVudCkKIAkJCWNvbnRpbnVlOwpAQCAtMzU0Miw3ICszNTQwLDggQEAKIAl9CiAKIAkvKiB0aGUgcHJvY2VzcyBuZWVkIHJlYWQgcGVybWlzc2lvbiBvbiBjb250cm9sIGZpbGUgKi8KLQlyZXQgPSBmaWxlX3Blcm1pc3Npb24oY2ZpbGUsIE1BWV9SRUFEKTsKKwkvKiBBVjogc2hvdWxkbid0IHdlIGNoZWNrIHRoYXQgaXQncyBiZWVuIG9wZW5lZCBmb3IgcmVhZCBpbnN0ZWFkPyAqLworCXJldCA9IGlub2RlX3Blcm1pc3Npb24oY2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIE1BWV9SRUFEKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBmYWlsOwogCkBAIC00ODEzLDggKzQ4MTIsNyBAQAogCSAqIG9uIHRoaXMgb3IgdGhpcyBpcyB1bmRlciByY3VfcmVhZF9sb2NrKCkuIE9uY2UgY3NzLT5pZCBpcyBhbGxvY2F0ZWQsCiAJICogaXQncyB1bmNoYW5nZWQgdW50aWwgZnJlZWQuCiAJICovCi0JY3NzaWQgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2soY3NzLT5pZCwKLQkJCXJjdV9yZWFkX2xvY2tfaGVsZCgpIHx8IGF0b21pY19yZWFkKCZjc3MtPnJlZmNudCkpOworCWNzc2lkID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGNzcy0+aWQsIGF0b21pY19yZWFkKCZjc3MtPnJlZmNudCkpOwogCiAJaWYgKGNzc2lkKQogCQlyZXR1cm4gY3NzaWQtPmlkOwpAQCAtNDgyNiw4ICs0ODI0LDcgQEAKIHsKIAlzdHJ1Y3QgY3NzX2lkICpjc3NpZDsKIAotCWNzc2lkID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGNzcy0+aWQsCi0JCQlyY3VfcmVhZF9sb2NrX2hlbGQoKSB8fCBhdG9taWNfcmVhZCgmY3NzLT5yZWZjbnQpKTsKKwljc3NpZCA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhjc3MtPmlkLCBhdG9taWNfcmVhZCgmY3NzLT5yZWZjbnQpKTsKIAogCWlmIChjc3NpZCkKIAkJcmV0dXJuIGNzc2lkLT5kZXB0aDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jb21wYXQuYyBiL2tlcm5lbC9jb21wYXQuYwppbmRleCBmYzllYjA5My4uMTgxOTdhZSAxMDA2NDQKLS0tIGEva2VybmVsL2NvbXBhdC5jCisrKyBiL2tlcm5lbC9jb21wYXQuYwpAQCAtODkwLDYgKzg5MCw3IEBACiAJY2FzZSAxOiBzZXQtPnNpZ1swXSA9IGNvbXBhdC0+c2lnWzBdIHwgKCgobG9uZyljb21wYXQtPnNpZ1sxXSkgPDwgMzIgKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzaWdzZXRfZnJvbV9jb21wYXQpOwogCiBhc21saW5rYWdlIGxvbmcKIGNvbXBhdF9zeXNfcnRfc2lndGltZWR3YWl0IChjb21wYXRfc2lnc2V0X3QgX191c2VyICp1dGhlc2UsCmRpZmYgLS1naXQgYS9rZXJuZWwvY29uZmlncy5jIGIva2VybmVsL2NvbmZpZ3MuYwppbmRleCBiNDA2NmI0Li40MmU4ZmEwIDEwMDY0NAotLS0gYS9rZXJuZWwvY29uZmlncy5jCisrKyBiL2tlcm5lbC9jb25maWdzLmMKQEAgLTkyLDggKzkyLDggQEAKIG1vZHVsZV9pbml0KGlrY29uZmlnX2luaXQpOwogbW9kdWxlX2V4aXQoaWtjb25maWdfY2xlYW51cCk7CiAKKyNlbmRpZiAvKiBDT05GSUdfSUtDT05GSUdfUFJPQyAqLworCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJSYW5keSBEdW5sYXAiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRWNobyB0aGUga2VybmVsIC5jb25maWcgZmlsZSB1c2VkIHRvIGJ1aWxkIHRoZSBrZXJuZWwiKTsKLQotI2VuZGlmIC8qIENPTkZJR19JS0NPTkZJR19QUk9DICovCmRpZmYgLS1naXQgYS9rZXJuZWwvZGVsYXlhY2N0LmMgYi9rZXJuZWwvZGVsYXlhY2N0LmMKaW5kZXggZWFkOWI2MS4uNDE4YjNmNyAxMDA2NDQKLS0tIGEva2VybmVsL2RlbGF5YWNjdC5jCisrKyBiL2tlcm5lbC9kZWxheWFjY3QuYwpAQCAtMTksOCArMTksMTAgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXlhY2N0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIGludCBkZWxheWFjY3Rfb24gX19yZWFkX21vc3RseSA9IDE7CS8qIERlbGF5IGFjY291bnRpbmcgdHVybmVkIG9uL29mZiAqLworRVhQT1JUX1NZTUJPTF9HUEwoZGVsYXlhY2N0X29uKTsKIHN0cnVjdCBrbWVtX2NhY2hlICpkZWxheWFjY3RfY2FjaGU7CiAKIHN0YXRpYyBpbnQgX19pbml0IGRlbGF5YWNjdF9zZXR1cF9kaXNhYmxlKGNoYXIgKnN0cikKZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvTWFrZWZpbGUgYi9rZXJuZWwvZXZlbnRzL01ha2VmaWxlCmluZGV4IDFjZTIzZDMuLjg5ZTVlOGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ldmVudHMvTWFrZWZpbGUKKysrIGIva2VybmVsL2V2ZW50cy9NYWtlZmlsZQpAQCAtMiw1ICsyLDUgQEAKIENGTEFHU19SRU1PVkVfY29yZS5vID0gLXBnCiBlbmRpZgogCi1vYmoteSA6PSBjb3JlLm8KK29iai15IDo9IGNvcmUubyByaW5nX2J1ZmZlci5vCiBvYmotJChDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UKSArPSBod19icmVha3BvaW50Lm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvY29yZS5jIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKaW5kZXggZDg2M2IzYy4uYjg3ODVlMiAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9jb3JlLmMKKysrIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKQEAgLTM2LDYgKzM2LDggQEAKICNpbmNsdWRlIDxsaW51eC9mdHJhY2VfZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9od19icmVha3BvaW50Lmg+CiAKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAKIHN0cnVjdCByZW1vdGVfZnVuY3Rpb25fY2FsbCB7CkBAIC0yMDAsNiArMjAyLDIyIEBACiAJcmV0dXJuIHRoaXNfY3B1X3B0cihjdHgtPnBtdS0+cG11X2NwdV9jb250ZXh0KTsKIH0KIAorc3RhdGljIHZvaWQgcGVyZl9jdHhfbG9jayhzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LAorCQkJICBzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpCit7CisJcmF3X3NwaW5fbG9jaygmY3B1Y3R4LT5jdHgubG9jayk7CisJaWYgKGN0eCkKKwkJcmF3X3NwaW5fbG9jaygmY3R4LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9jdHhfdW5sb2NrKHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgsCisJCQkgICAgc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4KQoreworCWlmIChjdHgpCisJCXJhd19zcGluX3VubG9jaygmY3R4LT5sb2NrKTsKKwlyYXdfc3Bpbl91bmxvY2soJmNwdWN0eC0+Y3R4LmxvY2spOworfQorCiAjaWZkZWYgQ09ORklHX0NHUk9VUF9QRVJGCiAKIC8qCkBAIC0zNDAsMTEgKzM1OCw4IEBACiAJcmN1X3JlYWRfbG9jaygpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocG11LCAmcG11cywgZW50cnkpIHsKLQogCQljcHVjdHggPSB0aGlzX2NwdV9wdHIocG11LT5wbXVfY3B1X2NvbnRleHQpOwogCi0JCXBlcmZfcG11X2Rpc2FibGUoY3B1Y3R4LT5jdHgucG11KTsKLQogCQkvKgogCQkgKiBwZXJmX2Nncm91cF9ldmVudHMgc2F5cyBhdCBsZWFzdCBvbmUKIAkJICogY29udGV4dCBvbiB0aGlzIENQVSBoYXMgY2dyb3VwIGV2ZW50cy4KQEAgLTM1Myw2ICszNjgsOCBAQAogCQkgKiBldmVudHMgZm9yIGEgY29udGV4dC4KIAkJICovCiAJCWlmIChjcHVjdHgtPmN0eC5ucl9jZ3JvdXBzID4gMCkgeworCQkJcGVyZl9jdHhfbG9jayhjcHVjdHgsIGNwdWN0eC0+dGFza19jdHgpOworCQkJcGVyZl9wbXVfZGlzYWJsZShjcHVjdHgtPmN0eC5wbXUpOwogCiAJCQlpZiAobW9kZSAmIFBFUkZfQ0dST1VQX1NXT1VUKSB7CiAJCQkJY3B1X2N0eF9zY2hlZF9vdXQoY3B1Y3R4LCBFVkVOVF9BTEwpOwpAQCAtMzcyLDkgKzM4OSw5IEBACiAJCQkJY3B1Y3R4LT5jZ3JwID0gcGVyZl9jZ3JvdXBfZnJvbV90YXNrKHRhc2spOwogCQkJCWNwdV9jdHhfc2NoZWRfaW4oY3B1Y3R4LCBFVkVOVF9BTEwsIHRhc2spOwogCQkJfQorCQkJcGVyZl9wbXVfZW5hYmxlKGNwdWN0eC0+Y3R4LnBtdSk7CisJCQlwZXJmX2N0eF91bmxvY2soY3B1Y3R4LCBjcHVjdHgtPnRhc2tfY3R4KTsKIAkJfQotCi0JCXBlcmZfcG11X2VuYWJsZShjcHVjdHgtPmN0eC5wbXUpOwogCX0KIAogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtNzMxLDYgKzc0OCw3IEBACiAKIC8qCiAgKiBVcGRhdGUgdGhlIHRvdGFsX3RpbWVfZW5hYmxlZCBhbmQgdG90YWxfdGltZV9ydW5uaW5nIGZpZWxkcyBmb3IgYSBldmVudC4KKyAqIFRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBob2xkIHRoZSBjdHgtPmxvY2suCiAgKi8KIHN0YXRpYyB2b2lkIHVwZGF0ZV9ldmVudF90aW1lcyhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CkBAIC0xMTA1LDYgKzExMjMsMTAgQEAKIAlyYXdfc3Bpbl9sb2NrKCZjdHgtPmxvY2spOwogCWV2ZW50X3NjaGVkX291dChldmVudCwgY3B1Y3R4LCBjdHgpOwogCWxpc3RfZGVsX2V2ZW50KGV2ZW50LCBjdHgpOworCWlmICghY3R4LT5ucl9ldmVudHMgJiYgY3B1Y3R4LT50YXNrX2N0eCA9PSBjdHgpIHsKKwkJY3R4LT5pc19hY3RpdmUgPSAwOworCQljcHVjdHgtPnRhc2tfY3R4ID0gTlVMTDsKKwl9CiAJcmF3X3NwaW5fdW5sb2NrKCZjdHgtPmxvY2spOwogCiAJcmV0dXJuIDA7CkBAIC0xNDU0LDggKzE0NzYsMjQgQEAKIAlldmVudC0+dHN0YW1wX3N0b3BwZWQgPSB0c3RhbXA7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfY29udGV4dF9zY2hlZF9pbihzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgsCi0JCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKK3N0YXRpYyB2b2lkIHRhc2tfY3R4X3NjaGVkX291dChzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpOworc3RhdGljIHZvaWQKK2N0eF9zY2hlZF9pbihzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgsCisJICAgICBzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LAorCSAgICAgZW51bSBldmVudF90eXBlX3QgZXZlbnRfdHlwZSwKKwkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CisKK3N0YXRpYyB2b2lkIHBlcmZfZXZlbnRfc2NoZWRfaW4oc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwKKwkJCQlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgsCisJCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCWNwdV9jdHhfc2NoZWRfaW4oY3B1Y3R4LCBFVkVOVF9QSU5ORUQsIHRhc2spOworCWlmIChjdHgpCisJCWN0eF9zY2hlZF9pbihjdHgsIGNwdWN0eCwgRVZFTlRfUElOTkVELCB0YXNrKTsKKwljcHVfY3R4X3NjaGVkX2luKGNwdWN0eCwgRVZFTlRfRkxFWElCTEUsIHRhc2spOworCWlmIChjdHgpCisJCWN0eF9zY2hlZF9pbihjdHgsIGNwdWN0eCwgRVZFTlRfRkxFWElCTEUsIHRhc2spOworfQogCiAvKgogICogQ3Jvc3MgQ1BVIGNhbGwgdG8gaW5zdGFsbCBhbmQgZW5hYmxlIGEgcGVyZm9ybWFuY2UgZXZlbnQKQEAgLTE0NjYsMjAgKzE1MDQsMzcgQEAKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQgPSBpbmZvOwogCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCA9IGV2ZW50LT5jdHg7Ci0Jc3RydWN0IHBlcmZfZXZlbnQgKmxlYWRlciA9IGV2ZW50LT5ncm91cF9sZWFkZXI7CiAJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCA9IF9fZ2V0X2NwdV9jb250ZXh0KGN0eCk7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICp0YXNrX2N0eCA9IGNwdWN0eC0+dGFza19jdHg7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gY3VycmVudDsKKworCXBlcmZfY3R4X2xvY2soY3B1Y3R4LCB0YXNrX2N0eCk7CisJcGVyZl9wbXVfZGlzYWJsZShjcHVjdHgtPmN0eC5wbXUpOwogCiAJLyoKLQkgKiBJbiBjYXNlIHdlJ3JlIGluc3RhbGxpbmcgYSBuZXcgY29udGV4dCB0byBhbiBhbHJlYWR5IHJ1bm5pbmcgdGFzaywKLQkgKiBjb3VsZCBhbHNvIGhhcHBlbiBiZWZvcmUgcGVyZl9ldmVudF90YXNrX3NjaGVkX2luKCkgb24gYXJjaGl0ZWN0dXJlcwotCSAqIHdoaWNoIGRvIGNvbnRleHQgc3dpdGNoZXMgd2l0aCBJUlFzIGVuYWJsZWQuCisJICogSWYgdGhlcmUgd2FzIGFuIGFjdGl2ZSB0YXNrX2N0eCBzY2hlZHVsZSBpdCBvdXQuCiAJICovCi0JaWYgKGN0eC0+dGFzayAmJiAhY3B1Y3R4LT50YXNrX2N0eCkKLQkJcGVyZl9ldmVudF9jb250ZXh0X3NjaGVkX2luKGN0eCwgY3R4LT50YXNrKTsKKwlpZiAodGFza19jdHgpCisJCXRhc2tfY3R4X3NjaGVkX291dCh0YXNrX2N0eCk7CiAKLQlyYXdfc3Bpbl9sb2NrKCZjdHgtPmxvY2spOwotCWN0eC0+aXNfYWN0aXZlID0gMTsKKwkvKgorCSAqIElmIHRoZSBjb250ZXh0IHdlJ3JlIGluc3RhbGxpbmcgZXZlbnRzIGluIGlzIG5vdCB0aGUKKwkgKiBhY3RpdmUgdGFza19jdHgsIGZsaXAgdGhlbS4KKwkgKi8KKwlpZiAoY3R4LT50YXNrICYmIHRhc2tfY3R4ICE9IGN0eCkgeworCQlpZiAodGFza19jdHgpCisJCQlyYXdfc3Bpbl91bmxvY2soJnRhc2tfY3R4LT5sb2NrKTsKKwkJcmF3X3NwaW5fbG9jaygmY3R4LT5sb2NrKTsKKwkJdGFza19jdHggPSBjdHg7CisJfQorCisJaWYgKHRhc2tfY3R4KSB7CisJCWNwdWN0eC0+dGFza19jdHggPSB0YXNrX2N0eDsKKwkJdGFzayA9IHRhc2tfY3R4LT50YXNrOworCX0KKworCWNwdV9jdHhfc2NoZWRfb3V0KGNwdWN0eCwgRVZFTlRfQUxMKTsKKwogCXVwZGF0ZV9jb250ZXh0X3RpbWUoY3R4KTsKIAkvKgogCSAqIHVwZGF0ZSBjZ3JwIHRpbWUgb25seSBpZiBjdXJyZW50IGNncnAKQEAgLTE0OTAsNDMgKzE1NDUsMTMgQEAKIAogCWFkZF9ldmVudF90b19jdHgoZXZlbnQsIGN0eCk7CiAKLQlpZiAoIWV2ZW50X2ZpbHRlcl9tYXRjaChldmVudCkpCi0JCWdvdG8gdW5sb2NrOwotCiAJLyoKLQkgKiBEb24ndCBwdXQgdGhlIGV2ZW50IG9uIGlmIGl0IGlzIGRpc2FibGVkIG9yIGlmCi0JICogaXQgaXMgaW4gYSBncm91cCBhbmQgdGhlIGdyb3VwIGlzbid0IG9uLgorCSAqIFNjaGVkdWxlIGV2ZXJ5dGhpbmcgYmFjayBpbgogCSAqLwotCWlmIChldmVudC0+c3RhdGUgIT0gUEVSRl9FVkVOVF9TVEFURV9JTkFDVElWRSB8fAotCSAgICAobGVhZGVyICE9IGV2ZW50ICYmIGxlYWRlci0+c3RhdGUgIT0gUEVSRl9FVkVOVF9TVEFURV9BQ1RJVkUpKQotCQlnb3RvIHVubG9jazsKKwlwZXJmX2V2ZW50X3NjaGVkX2luKGNwdWN0eCwgdGFza19jdHgsIHRhc2spOwogCi0JLyoKLQkgKiBBbiBleGNsdXNpdmUgZXZlbnQgY2FuJ3QgZ28gb24gaWYgdGhlcmUgYXJlIGFscmVhZHkgYWN0aXZlCi0JICogaGFyZHdhcmUgZXZlbnRzLCBhbmQgbm8gaGFyZHdhcmUgZXZlbnQgY2FuIGdvIG9uIGlmIHRoZXJlCi0JICogaXMgYWxyZWFkeSBhbiBleGNsdXNpdmUgZXZlbnQgb24uCi0JICovCi0JaWYgKCFncm91cF9jYW5fZ29fb24oZXZlbnQsIGNwdWN0eCwgMSkpCi0JCWVyciA9IC1FRVhJU1Q7Ci0JZWxzZQotCQllcnIgPSBldmVudF9zY2hlZF9pbihldmVudCwgY3B1Y3R4LCBjdHgpOwotCi0JaWYgKGVycikgewotCQkvKgotCQkgKiBUaGlzIGV2ZW50IGNvdWxkbid0IGdvIG9uLiAgSWYgaXQgaXMgaW4gYSBncm91cAotCQkgKiB0aGVuIHdlIGhhdmUgdG8gcHVsbCB0aGUgd2hvbGUgZ3JvdXAgb2ZmLgotCQkgKiBJZiB0aGUgZXZlbnQgZ3JvdXAgaXMgcGlubmVkIHRoZW4gcHV0IGl0IGluIGVycm9yIHN0YXRlLgotCQkgKi8KLQkJaWYgKGxlYWRlciAhPSBldmVudCkKLQkJCWdyb3VwX3NjaGVkX291dChsZWFkZXIsIGNwdWN0eCwgY3R4KTsKLQkJaWYgKGxlYWRlci0+YXR0ci5waW5uZWQpIHsKLQkJCXVwZGF0ZV9ncm91cF90aW1lcyhsZWFkZXIpOwotCQkJbGVhZGVyLT5zdGF0ZSA9IFBFUkZfRVZFTlRfU1RBVEVfRVJST1I7Ci0JCX0KLQl9Ci0KLXVubG9jazoKLQlyYXdfc3Bpbl91bmxvY2soJmN0eC0+bG9jayk7CisJcGVyZl9wbXVfZW5hYmxlKGNwdWN0eC0+Y3R4LnBtdSk7CisJcGVyZl9jdHhfdW5sb2NrKGNwdWN0eCwgdGFza19jdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzM5LDcgKzE3NjQsNyBAQAogCXJhd19zcGluX3VubG9ja19pcnEoJmN0eC0+bG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgcGVyZl9ldmVudF9yZWZyZXNoKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IHJlZnJlc2gpCitpbnQgcGVyZl9ldmVudF9yZWZyZXNoKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IHJlZnJlc2gpCiB7CiAJLyoKIAkgKiBub3Qgc3VwcG9ydGVkIG9uIGluaGVyaXRlZCBldmVudHMKQEAgLTE3NTIsMzYgKzE3NzcsMzUgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocGVyZl9ldmVudF9yZWZyZXNoKTsKIAogc3RhdGljIHZvaWQgY3R4X3NjaGVkX291dChzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgsCiAJCQkgIHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgsCiAJCQkgIGVudW0gZXZlbnRfdHlwZV90IGV2ZW50X3R5cGUpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50OworCWludCBpc19hY3RpdmUgPSBjdHgtPmlzX2FjdGl2ZTsKIAotCXJhd19zcGluX2xvY2soJmN0eC0+bG9jayk7Ci0JcGVyZl9wbXVfZGlzYWJsZShjdHgtPnBtdSk7Ci0JY3R4LT5pc19hY3RpdmUgPSAwOworCWN0eC0+aXNfYWN0aXZlICY9IH5ldmVudF90eXBlOwogCWlmIChsaWtlbHkoIWN0eC0+bnJfZXZlbnRzKSkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKKwogCXVwZGF0ZV9jb250ZXh0X3RpbWUoY3R4KTsKIAl1cGRhdGVfY2dycF90aW1lX2Zyb21fY3B1Y3R4KGNwdWN0eCk7Ci0KIAlpZiAoIWN0eC0+bnJfYWN0aXZlKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCi0JaWYgKGV2ZW50X3R5cGUgJiBFVkVOVF9QSU5ORUQpIHsKKwlwZXJmX3BtdV9kaXNhYmxlKGN0eC0+cG11KTsKKwlpZiAoKGlzX2FjdGl2ZSAmIEVWRU5UX1BJTk5FRCkgJiYgKGV2ZW50X3R5cGUgJiBFVkVOVF9QSU5ORUQpKSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoZXZlbnQsICZjdHgtPnBpbm5lZF9ncm91cHMsIGdyb3VwX2VudHJ5KQogCQkJZ3JvdXBfc2NoZWRfb3V0KGV2ZW50LCBjcHVjdHgsIGN0eCk7CiAJfQogCi0JaWYgKGV2ZW50X3R5cGUgJiBFVkVOVF9GTEVYSUJMRSkgeworCWlmICgoaXNfYWN0aXZlICYgRVZFTlRfRkxFWElCTEUpICYmIChldmVudF90eXBlICYgRVZFTlRfRkxFWElCTEUpKSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoZXZlbnQsICZjdHgtPmZsZXhpYmxlX2dyb3VwcywgZ3JvdXBfZW50cnkpCiAJCQlncm91cF9zY2hlZF9vdXQoZXZlbnQsIGNwdWN0eCwgY3R4KTsKIAl9Ci1vdXQ6CiAJcGVyZl9wbXVfZW5hYmxlKGN0eC0+cG11KTsKLQlyYXdfc3Bpbl91bmxvY2soJmN0eC0+bG9jayk7CiB9CiAKIC8qCkBAIC0xOTI5LDggKzE5NTMsMTAgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChkb19zd2l0Y2gpIHsKKwkJcmF3X3NwaW5fbG9jaygmY3R4LT5sb2NrKTsKIAkJY3R4X3NjaGVkX291dChjdHgsIGNwdWN0eCwgRVZFTlRfQUxMKTsKIAkJY3B1Y3R4LT50YXNrX2N0eCA9IE5VTEw7CisJCXJhd19zcGluX3VubG9jaygmY3R4LT5sb2NrKTsKIAl9CiB9CiAKQEAgLTE5NjUsOCArMTk5MSw3IEBACiAJCXBlcmZfY2dyb3VwX3NjaGVkX291dCh0YXNrKTsKIH0KIAotc3RhdGljIHZvaWQgdGFza19jdHhfc2NoZWRfb3V0KHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCwKLQkJCSAgICAgICBlbnVtIGV2ZW50X3R5cGVfdCBldmVudF90eXBlKQorc3RhdGljIHZvaWQgdGFza19jdHhfc2NoZWRfb3V0KHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCkKIHsKIAlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gX19nZXRfY3B1X2NvbnRleHQoY3R4KTsKIApAQCAtMTk3Niw3ICsyMDAxLDcgQEAKIAlpZiAoV0FSTl9PTl9PTkNFKGN0eCAhPSBjcHVjdHgtPnRhc2tfY3R4KSkKIAkJcmV0dXJuOwogCi0JY3R4X3NjaGVkX291dChjdHgsIGNwdWN0eCwgZXZlbnRfdHlwZSk7CisJY3R4X3NjaGVkX291dChjdHgsIGNwdWN0eCwgRVZFTlRfQUxMKTsKIAljcHVjdHgtPnRhc2tfY3R4ID0gTlVMTDsKIH0KIApAQCAtMjA1NSwxMSArMjA4MCwxMSBAQAogCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXU2NCBub3c7CisJaW50IGlzX2FjdGl2ZSA9IGN0eC0+aXNfYWN0aXZlOwogCi0JcmF3X3NwaW5fbG9jaygmY3R4LT5sb2NrKTsKLQljdHgtPmlzX2FjdGl2ZSA9IDE7CisJY3R4LT5pc19hY3RpdmUgfD0gZXZlbnRfdHlwZTsKIAlpZiAobGlrZWx5KCFjdHgtPm5yX2V2ZW50cykpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAKIAlub3cgPSBwZXJmX2Nsb2NrKCk7CiAJY3R4LT50aW1lc3RhbXAgPSBub3c7CkBAIC0yMDY4LDE1ICsyMDkzLDEyIEBACiAJICogRmlyc3QgZ28gdGhyb3VnaCB0aGUgbGlzdCBhbmQgcHV0IG9uIGFueSBwaW5uZWQgZ3JvdXBzCiAJICogaW4gb3JkZXIgdG8gZ2l2ZSB0aGVtIHRoZSBiZXN0IGNoYW5jZSBvZiBnb2luZyBvbi4KIAkgKi8KLQlpZiAoZXZlbnRfdHlwZSAmIEVWRU5UX1BJTk5FRCkKKwlpZiAoIShpc19hY3RpdmUgJiBFVkVOVF9QSU5ORUQpICYmIChldmVudF90eXBlICYgRVZFTlRfUElOTkVEKSkKIAkJY3R4X3Bpbm5lZF9zY2hlZF9pbihjdHgsIGNwdWN0eCk7CiAKIAkvKiBUaGVuIHdhbGsgdGhyb3VnaCB0aGUgbG93ZXIgcHJpbyBmbGV4aWJsZSBncm91cHMgKi8KLQlpZiAoZXZlbnRfdHlwZSAmIEVWRU5UX0ZMRVhJQkxFKQorCWlmICghKGlzX2FjdGl2ZSAmIEVWRU5UX0ZMRVhJQkxFKSAmJiAoZXZlbnRfdHlwZSAmIEVWRU5UX0ZMRVhJQkxFKSkKIAkJY3R4X2ZsZXhpYmxlX3NjaGVkX2luKGN0eCwgY3B1Y3R4KTsKLQotb3V0OgotCXJhd19zcGluX3VubG9jaygmY3R4LT5sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgY3B1X2N0eF9zY2hlZF9pbihzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LApAQCAtMjA4OCwxOSArMjExMCw2IEBACiAJY3R4X3NjaGVkX2luKGN0eCwgY3B1Y3R4LCBldmVudF90eXBlLCB0YXNrKTsKIH0KIAotc3RhdGljIHZvaWQgdGFza19jdHhfc2NoZWRfaW4oc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4LAotCQkJICAgICAgZW51bSBldmVudF90eXBlX3QgZXZlbnRfdHlwZSkKLXsKLQlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4OwotCi0JY3B1Y3R4ID0gX19nZXRfY3B1X2NvbnRleHQoY3R4KTsKLQlpZiAoY3B1Y3R4LT50YXNrX2N0eCA9PSBjdHgpCi0JCXJldHVybjsKLQotCWN0eF9zY2hlZF9pbihjdHgsIGNwdWN0eCwgZXZlbnRfdHlwZSwgTlVMTCk7Ci0JY3B1Y3R4LT50YXNrX2N0eCA9IGN0eDsKLX0KLQogc3RhdGljIHZvaWQgcGVyZl9ldmVudF9jb250ZXh0X3NjaGVkX2luKHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCwKIAkJCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewpAQCAtMjExMCw2ICsyMTE5LDcgQEAKIAlpZiAoY3B1Y3R4LT50YXNrX2N0eCA9PSBjdHgpCiAJCXJldHVybjsKIAorCXBlcmZfY3R4X2xvY2soY3B1Y3R4LCBjdHgpOwogCXBlcmZfcG11X2Rpc2FibGUoY3R4LT5wbXUpOwogCS8qCiAJICogV2Ugd2FudCB0byBrZWVwIHRoZSBmb2xsb3dpbmcgcHJpb3JpdHkgb3JkZXI6CkBAIC0yMTE4LDE4ICsyMTI4LDE4IEBACiAJICovCiAJY3B1X2N0eF9zY2hlZF9vdXQoY3B1Y3R4LCBFVkVOVF9GTEVYSUJMRSk7CiAKLQljdHhfc2NoZWRfaW4oY3R4LCBjcHVjdHgsIEVWRU5UX1BJTk5FRCwgdGFzayk7Ci0JY3B1X2N0eF9zY2hlZF9pbihjcHVjdHgsIEVWRU5UX0ZMRVhJQkxFLCB0YXNrKTsKLQljdHhfc2NoZWRfaW4oY3R4LCBjcHVjdHgsIEVWRU5UX0ZMRVhJQkxFLCB0YXNrKTsKKwlwZXJmX2V2ZW50X3NjaGVkX2luKGNwdWN0eCwgY3R4LCB0YXNrKTsKIAogCWNwdWN0eC0+dGFza19jdHggPSBjdHg7CiAKKwlwZXJmX3BtdV9lbmFibGUoY3R4LT5wbXUpOworCXBlcmZfY3R4X3VubG9jayhjcHVjdHgsIGN0eCk7CisKIAkvKgogCSAqIFNpbmNlIHRoZXNlIHJvdGF0aW9ucyBhcmUgcGVyLWNwdSwgd2UgbmVlZCB0byBlbnN1cmUgdGhlCiAJICogY3B1LWNvbnRleHQgd2UgZ290IHNjaGVkdWxlZCBvbiBpcyBhY3R1YWxseSByb3RhdGluZy4KIAkgKi8KIAlwZXJmX3BtdV9yb3RhdGVfc3RhcnQoY3R4LT5wbXUpOwotCXBlcmZfcG11X2VuYWJsZShjdHgtPnBtdSk7CiB9CiAKIC8qCkBAIC0yMjY5LDcgKzIyNzksNiBAQAogCXU2NCBpbnRlcnJ1cHRzLCBub3c7CiAJczY0IGRlbHRhOwogCi0JcmF3X3NwaW5fbG9jaygmY3R4LT5sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShldmVudCwgJmN0eC0+ZXZlbnRfbGlzdCwgZXZlbnRfZW50cnkpIHsKIAkJaWYgKGV2ZW50LT5zdGF0ZSAhPSBQRVJGX0VWRU5UX1NUQVRFX0FDVElWRSkKIAkJCWNvbnRpbnVlOwpAQCAtMjMwMSw3ICsyMzEwLDYgQEAKIAkJaWYgKGRlbHRhID4gMCkKIAkJCXBlcmZfYWRqdXN0X3BlcmlvZChldmVudCwgcGVyaW9kLCBkZWx0YSk7CiAJfQotCXJhd19zcGluX3VubG9jaygmY3R4LT5sb2NrKTsKIH0KIAogLyoKQEAgLTIzMDksMTYgKzIzMTcsMTIgQEAKICAqLwogc3RhdGljIHZvaWQgcm90YXRlX2N0eChzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpCiB7Ci0JcmF3X3NwaW5fbG9jaygmY3R4LT5sb2NrKTsKLQogCS8qCiAJICogUm90YXRlIHRoZSBmaXJzdCBlbnRyeSBsYXN0IG9mIG5vbi1waW5uZWQgZ3JvdXBzLiBSb3RhdGlvbiBtaWdodCBiZQogCSAqIGRpc2FibGVkIGJ5IHRoZSBpbmhlcml0YW5jZSBjb2RlLgogCSAqLwogCWlmICghY3R4LT5yb3RhdGVfZGlzYWJsZSkKIAkJbGlzdF9yb3RhdGVfbGVmdCgmY3R4LT5mbGV4aWJsZV9ncm91cHMpOwotCi0JcmF3X3NwaW5fdW5sb2NrKCZjdHgtPmxvY2spOwogfQogCiAvKgpAQCAtMjM0NSw2ICsyMzQ5LDcgQEAKIAkJCXJvdGF0ZSA9IDE7CiAJfQogCisJcGVyZl9jdHhfbG9jayhjcHVjdHgsIGNwdWN0eC0+dGFza19jdHgpOwogCXBlcmZfcG11X2Rpc2FibGUoY3B1Y3R4LT5jdHgucG11KTsKIAlwZXJmX2N0eF9hZGp1c3RfZnJlcSgmY3B1Y3R4LT5jdHgsIGludGVydmFsKTsKIAlpZiAoY3R4KQpAQCAtMjM1NSwyMSArMjM2MCwyMCBAQAogCiAJY3B1X2N0eF9zY2hlZF9vdXQoY3B1Y3R4LCBFVkVOVF9GTEVYSUJMRSk7CiAJaWYgKGN0eCkKLQkJdGFza19jdHhfc2NoZWRfb3V0KGN0eCwgRVZFTlRfRkxFWElCTEUpOworCQljdHhfc2NoZWRfb3V0KGN0eCwgY3B1Y3R4LCBFVkVOVF9GTEVYSUJMRSk7CiAKIAlyb3RhdGVfY3R4KCZjcHVjdHgtPmN0eCk7CiAJaWYgKGN0eCkKIAkJcm90YXRlX2N0eChjdHgpOwogCi0JY3B1X2N0eF9zY2hlZF9pbihjcHVjdHgsIEVWRU5UX0ZMRVhJQkxFLCBjdXJyZW50KTsKLQlpZiAoY3R4KQotCQl0YXNrX2N0eF9zY2hlZF9pbihjdHgsIEVWRU5UX0ZMRVhJQkxFKTsKKwlwZXJmX2V2ZW50X3NjaGVkX2luKGNwdWN0eCwgY3R4LCBjdXJyZW50KTsKIAogZG9uZToKIAlpZiAocmVtb3ZlKQogCQlsaXN0X2RlbF9pbml0KCZjcHVjdHgtPnJvdGF0aW9uX2xpc3QpOwogCiAJcGVyZl9wbXVfZW5hYmxlKGNwdWN0eC0+Y3R4LnBtdSk7CisJcGVyZl9jdHhfdW5sb2NrKGNwdWN0eCwgY3B1Y3R4LT50YXNrX2N0eCk7CiB9CiAKIHZvaWQgcGVyZl9ldmVudF90YXNrX3RpY2sodm9pZCkKQEAgLTI0MjQsOSArMjQyOCw5IEBACiAJICogaW4uCiAJICovCiAJcGVyZl9jZ3JvdXBfc2NoZWRfb3V0KGN1cnJlbnQpOwotCXRhc2tfY3R4X3NjaGVkX291dChjdHgsIEVWRU5UX0FMTCk7CiAKIAlyYXdfc3Bpbl9sb2NrKCZjdHgtPmxvY2spOworCXRhc2tfY3R4X3NjaGVkX291dChjdHgpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudCwgJmN0eC0+cGlubmVkX2dyb3VwcywgZ3JvdXBfZW50cnkpIHsKIAkJcmV0ID0gZXZlbnRfZW5hYmxlX29uX2V4ZWMoZXZlbnQsIGN0eCk7CkBAIC0yODM1LDE2ICsyODM5LDEyIEBACiAJCXVuY2xvbmVfY3R4KGN0eCk7CiAJCSsrY3R4LT5waW5fY291bnQ7CiAJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAoIWN0eCkgeworCX0gZWxzZSB7CiAJCWN0eCA9IGFsbG9jX3BlcmZfY29udGV4dChwbXUsIHRhc2spOwogCQllcnIgPSAtRU5PTUVNOwogCQlpZiAoIWN0eCkKIAkJCWdvdG8gZXJyb3V0OwogCi0JCWdldF9jdHgoY3R4KTsKLQogCQllcnIgPSAwOwogCQltdXRleF9sb2NrKCZ0YXNrLT5wZXJmX2V2ZW50X211dGV4KTsKIAkJLyoKQEAgLTI4NTYsMTQgKzI4NTYsMTQgQEAKIAkJZWxzZSBpZiAodGFzay0+cGVyZl9ldmVudF9jdHhwW2N0eG5dKQogCQkJZXJyID0gLUVBR0FJTjsKIAkJZWxzZSB7CisJCQlnZXRfY3R4KGN0eCk7CiAJCQkrK2N0eC0+cGluX2NvdW50OwogCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHRhc2stPnBlcmZfZXZlbnRfY3R4cFtjdHhuXSwgY3R4KTsKIAkJfQogCQltdXRleF91bmxvY2soJnRhc2stPnBlcmZfZXZlbnRfbXV0ZXgpOwogCiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlwdXRfdGFza19zdHJ1Y3QodGFzayk7Ci0JCQlrZnJlZShjdHgpOworCQkJcHV0X2N0eChjdHgpOwogCiAJCQlpZiAoZXJyID09IC1FQUdBSU4pCiAJCQkJZ290byByZXRyeTsKQEAgLTI4OTAsNyArMjg5MCw3IEBACiAJa2ZyZWUoZXZlbnQpOwogfQogCi1zdGF0aWMgdm9pZCBwZXJmX2J1ZmZlcl9wdXQoc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIpOworc3RhdGljIHZvaWQgcmluZ19idWZmZXJfcHV0KHN0cnVjdCByaW5nX2J1ZmZlciAqcmIpOwogCiBzdGF0aWMgdm9pZCBmcmVlX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKQEAgLTI5MTMsOSArMjkxMyw5IEBACiAJCX0KIAl9CiAKLQlpZiAoZXZlbnQtPmJ1ZmZlcikgewotCQlwZXJmX2J1ZmZlcl9wdXQoZXZlbnQtPmJ1ZmZlcik7Ci0JCWV2ZW50LT5idWZmZXIgPSBOVUxMOworCWlmIChldmVudC0+cmIpIHsKKwkJcmluZ19idWZmZXJfcHV0KGV2ZW50LT5yYik7CisJCWV2ZW50LT5yYiA9IE5VTEw7CiAJfQogCiAJaWYgKGlzX2Nncm91cF9ldmVudChldmVudCkpCkBAIC0yOTM0LDEyICsyOTM0LDYgQEAKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHggPSBldmVudC0+Y3R4OwogCi0JLyoKLQkgKiBSZW1vdmUgZnJvbSB0aGUgUE1VLCBjYW4ndCBnZXQgcmUtZW5hYmxlZCBzaW5jZSB3ZSBnb3QKLQkgKiBoZXJlIGJlY2F1c2UgdGhlIGxhc3QgcmVmIHdlbnQuCi0JICovCi0JcGVyZl9ldmVudF9kaXNhYmxlKGV2ZW50KTsKLQogCVdBUk5fT05fT05DRShjdHgtPnBhcmVudF9jdHgpOwogCS8qCiAJICogVGhlcmUgYXJlIHR3byB3YXlzIHRoaXMgYW5ub3RhdGlvbiBpcyB1c2VmdWw6CkBAIC0yOTU2LDggKzI5NTAsOCBAQAogCW11dGV4X2xvY2tfbmVzdGVkKCZjdHgtPm11dGV4LCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAJcmF3X3NwaW5fbG9ja19pcnEoJmN0eC0+bG9jayk7CiAJcGVyZl9ncm91cF9kZXRhY2goZXZlbnQpOwotCWxpc3RfZGVsX2V2ZW50KGV2ZW50LCBjdHgpOwogCXJhd19zcGluX3VubG9ja19pcnEoJmN0eC0+bG9jayk7CisJcGVyZl9yZW1vdmVfZnJvbV9jb250ZXh0KGV2ZW50KTsKIAltdXRleF91bmxvY2soJmN0eC0+bXV0ZXgpOwogCiAJZnJlZV9ldmVudChldmVudCk7CkBAIC0zMTQ5LDEzICszMTQzLDEzIEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHBlcmZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXI7CisJc3RydWN0IHJpbmdfYnVmZmVyICpyYjsKIAl1bnNpZ25lZCBpbnQgZXZlbnRzID0gUE9MTF9IVVA7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JYnVmZmVyID0gcmN1X2RlcmVmZXJlbmNlKGV2ZW50LT5idWZmZXIpOwotCWlmIChidWZmZXIpCi0JCWV2ZW50cyA9IGF0b21pY194Y2hnKCZidWZmZXItPnBvbGwsIDApOworCXJiID0gcmN1X2RlcmVmZXJlbmNlKGV2ZW50LT5yYik7CisJaWYgKHJiKQorCQlldmVudHMgPSBhdG9taWNfeGNoZygmcmItPnBvbGwsIDApOwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcG9sbF93YWl0KGZpbGUsICZldmVudC0+d2FpdHEsIHdhaXQpOwpAQCAtMzM1OCw2ICszMzUyLDE4IEBACiAJcmV0dXJuIGV2ZW50LT5ody5pZHggKyAxIC0gUEVSRl9FVkVOVF9JTkRFWF9PRkZTRVQ7CiB9CiAKK3N0YXRpYyB2b2lkIGNhbGNfdGltZXJfdmFsdWVzKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQl1NjQgKnJ1bm5pbmcsCisJCQkJdTY0ICplbmFibGVkKQoreworCXU2NCBub3csIGN0eF90aW1lOworCisJbm93ID0gcGVyZl9jbG9jaygpOworCWN0eF90aW1lID0gZXZlbnQtPnNoYWRvd19jdHhfdGltZSArIG5vdzsKKwkqZW5hYmxlZCA9IGN0eF90aW1lIC0gZXZlbnQtPnRzdGFtcF9lbmFibGVkOworCSpydW5uaW5nID0gY3R4X3RpbWUgLSBldmVudC0+dHN0YW1wX3J1bm5pbmc7Cit9CisKIC8qCiAgKiBDYWxsZXJzIG5lZWQgdG8gZW5zdXJlIHRoZXJlIGNhbiBiZSBubyBuZXN0aW5nIG9mIHRoaXMgZnVuY3Rpb24sIG90aGVyd2lzZQogICogdGhlIHNlcWxvY2sgbG9naWMgZ29lcyBiYWQuIFdlIGNhbiBub3Qgc2VyaWFsaXplIHRoaXMgYmVjYXVzZSB0aGUgYXJjaApAQCAtMzM2NiwxNCArMzM3MiwyNSBAQAogdm9pZCBwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfbW1hcF9wYWdlICp1c2VycGc7Ci0Jc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXI7CisJc3RydWN0IHJpbmdfYnVmZmVyICpyYjsKKwl1NjQgZW5hYmxlZCwgcnVubmluZzsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlidWZmZXIgPSByY3VfZGVyZWZlcmVuY2UoZXZlbnQtPmJ1ZmZlcik7Ci0JaWYgKCFidWZmZXIpCisJLyoKKwkgKiBjb21wdXRlIHRvdGFsX3RpbWVfZW5hYmxlZCwgdG90YWxfdGltZV9ydW5uaW5nCisJICogYmFzZWQgb24gc25hcHNob3QgdmFsdWVzIHRha2VuIHdoZW4gdGhlIGV2ZW50CisJICogd2FzIGxhc3Qgc2NoZWR1bGVkIGluLgorCSAqCisJICogd2UgY2Fubm90IHNpbXBseSBjYWxsZWQgdXBkYXRlX2NvbnRleHRfdGltZSgpCisJICogYmVjYXVzZSBvZiBsb2NraW5nIGlzc3VlIGFzIHdlIGNhbiBiZSBjYWxsZWQgaW4KKwkgKiBOTUkgY29udGV4dAorCSAqLworCWNhbGNfdGltZXJfdmFsdWVzKGV2ZW50LCAmZW5hYmxlZCwgJnJ1bm5pbmcpOworCXJiID0gcmN1X2RlcmVmZXJlbmNlKGV2ZW50LT5yYik7CisJaWYgKCFyYikKIAkJZ290byB1bmxvY2s7CiAKLQl1c2VycGcgPSBidWZmZXItPnVzZXJfcGFnZTsKKwl1c2VycGcgPSByYi0+dXNlcl9wYWdlOwogCiAJLyoKIAkgKiBEaXNhYmxlIHByZWVtcHRpb24gc28gYXMgdG8gbm90IGxldCB0aGUgY29ycmVzcG9uZGluZyB1c2VyLXNwYWNlCkBAIC0zMzg3LDEwICszNDA0LDEwIEBACiAJaWYgKGV2ZW50LT5zdGF0ZSA9PSBQRVJGX0VWRU5UX1NUQVRFX0FDVElWRSkKIAkJdXNlcnBnLT5vZmZzZXQgLT0gbG9jYWw2NF9yZWFkKCZldmVudC0+aHcucHJldl9jb3VudCk7CiAKLQl1c2VycGctPnRpbWVfZW5hYmxlZCA9IGV2ZW50LT50b3RhbF90aW1lX2VuYWJsZWQgKworCXVzZXJwZy0+dGltZV9lbmFibGVkID0gZW5hYmxlZCArCiAJCQlhdG9taWM2NF9yZWFkKCZldmVudC0+Y2hpbGRfdG90YWxfdGltZV9lbmFibGVkKTsKIAotCXVzZXJwZy0+dGltZV9ydW5uaW5nID0gZXZlbnQtPnRvdGFsX3RpbWVfcnVubmluZyArCisJdXNlcnBnLT50aW1lX3J1bm5pbmcgPSBydW5uaW5nICsKIAkJCWF0b21pYzY0X3JlYWQoJmV2ZW50LT5jaGlsZF90b3RhbF90aW1lX3J1bm5pbmcpOwogCiAJYmFycmllcigpOwpAQCAtMzQwMCwyMjAgKzM0MTcsMTAgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyZl9kYXRhX3NpemUoc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIpOwotCi1zdGF0aWMgdm9pZAotcGVyZl9idWZmZXJfaW5pdChzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlciwgbG9uZyB3YXRlcm1hcmssIGludCBmbGFncykKLXsKLQlsb25nIG1heF9zaXplID0gcGVyZl9kYXRhX3NpemUoYnVmZmVyKTsKLQotCWlmICh3YXRlcm1hcmspCi0JCWJ1ZmZlci0+d2F0ZXJtYXJrID0gbWluKG1heF9zaXplLCB3YXRlcm1hcmspOwotCi0JaWYgKCFidWZmZXItPndhdGVybWFyaykKLQkJYnVmZmVyLT53YXRlcm1hcmsgPSBtYXhfc2l6ZSAvIDI7Ci0KLQlpZiAoZmxhZ3MgJiBQRVJGX0JVRkZFUl9XUklUQUJMRSkKLQkJYnVmZmVyLT53cml0YWJsZSA9IDE7Ci0KLQlhdG9taWNfc2V0KCZidWZmZXItPnJlZmNvdW50LCAxKTsKLX0KLQotI2lmbmRlZiBDT05GSUdfUEVSRl9VU0VfVk1BTExPQwotCi0vKgotICogQmFjayBwZXJmX21tYXAoKSB3aXRoIHJlZ3VsYXIgR0ZQX0tFUk5FTC0wIHBhZ2VzLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqCi1wZXJmX21tYXBfdG9fcGFnZShzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlpZiAocGdvZmYgPiBidWZmZXItPm5yX3BhZ2VzKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChwZ29mZiA9PSAwKQotCQlyZXR1cm4gdmlydF90b19wYWdlKGJ1ZmZlci0+dXNlcl9wYWdlKTsKLQotCXJldHVybiB2aXJ0X3RvX3BhZ2UoYnVmZmVyLT5kYXRhX3BhZ2VzW3Bnb2ZmIC0gMV0pOwotfQotCi1zdGF0aWMgdm9pZCAqcGVyZl9tbWFwX2FsbG9jX3BhZ2UoaW50IGNwdSkKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgbm9kZTsKLQotCW5vZGUgPSAoY3B1ID09IC0xKSA/IGNwdSA6IGNwdV90b19ub2RlKGNwdSk7Ci0JcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIDApOwotCWlmICghcGFnZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gcGFnZV9hZGRyZXNzKHBhZ2UpOwotfQotCi1zdGF0aWMgc3RydWN0IHBlcmZfYnVmZmVyICoKLXBlcmZfYnVmZmVyX2FsbG9jKGludCBucl9wYWdlcywgbG9uZyB3YXRlcm1hcmssIGludCBjcHUsIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcjsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JaW50IGk7Ci0KLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBwZXJmX2J1ZmZlcik7Ci0Jc2l6ZSArPSBucl9wYWdlcyAqIHNpemVvZih2b2lkICopOwotCi0JYnVmZmVyID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlcikKLQkJZ290byBmYWlsOwotCi0JYnVmZmVyLT51c2VyX3BhZ2UgPSBwZXJmX21tYXBfYWxsb2NfcGFnZShjcHUpOwotCWlmICghYnVmZmVyLT51c2VyX3BhZ2UpCi0JCWdvdG8gZmFpbF91c2VyX3BhZ2U7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewotCQlidWZmZXItPmRhdGFfcGFnZXNbaV0gPSBwZXJmX21tYXBfYWxsb2NfcGFnZShjcHUpOwotCQlpZiAoIWJ1ZmZlci0+ZGF0YV9wYWdlc1tpXSkKLQkJCWdvdG8gZmFpbF9kYXRhX3BhZ2VzOwotCX0KLQotCWJ1ZmZlci0+bnJfcGFnZXMgPSBucl9wYWdlczsKLQotCXBlcmZfYnVmZmVyX2luaXQoYnVmZmVyLCB3YXRlcm1hcmssIGZsYWdzKTsKLQotCXJldHVybiBidWZmZXI7Ci0KLWZhaWxfZGF0YV9wYWdlczoKLQlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWZmZXItPmRhdGFfcGFnZXNbaV0pOwotCi0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1ZmZlci0+dXNlcl9wYWdlKTsKLQotZmFpbF91c2VyX3BhZ2U6Ci0Ja2ZyZWUoYnVmZmVyKTsKLQotZmFpbDoKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgcGVyZl9tbWFwX2ZyZWVfcGFnZSh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoKHZvaWQgKilhZGRyKTsKLQotCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOwotCV9fZnJlZV9wYWdlKHBhZ2UpOwotfQotCi1zdGF0aWMgdm9pZCBwZXJmX2J1ZmZlcl9mcmVlKHN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyKQotewotCWludCBpOwotCi0JcGVyZl9tbWFwX2ZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWZmZXItPnVzZXJfcGFnZSk7Ci0JZm9yIChpID0gMDsgaSA8IGJ1ZmZlci0+bnJfcGFnZXM7IGkrKykKLQkJcGVyZl9tbWFwX2ZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWZmZXItPmRhdGFfcGFnZXNbaV0pOwotCWtmcmVlKGJ1ZmZlcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHBhZ2Vfb3JkZXIoc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi0KLS8qCi0gKiBCYWNrIHBlcmZfbW1hcCgpIHdpdGggdm1hbGxvYyBtZW1vcnkuCi0gKgotICogUmVxdWlyZWQgZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCBoYXZlIGQtY2FjaGUgYWxpYXNpbmcgaXNzdWVzLgotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHBhZ2Vfb3JkZXIoc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIpCi17Ci0JcmV0dXJuIGJ1ZmZlci0+cGFnZV9vcmRlcjsKLX0KLQotc3RhdGljIHN0cnVjdCBwYWdlICoKLXBlcmZfbW1hcF90b19wYWdlKHN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCWlmIChwZ29mZiA+ICgxVUwgPDwgcGFnZV9vcmRlcihidWZmZXIpKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gdm1hbGxvY190b19wYWdlKCh2b2lkICopYnVmZmVyLT51c2VyX3BhZ2UgKyBwZ29mZiAqIFBBR0VfU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcmZfbW1hcF91bm1hcmtfcGFnZSh2b2lkICphZGRyKQotewotCXN0cnVjdCBwYWdlICpwYWdlID0gdm1hbGxvY190b19wYWdlKGFkZHIpOwotCi0JcGFnZS0+bWFwcGluZyA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcmZfYnVmZmVyX2ZyZWVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXI7Ci0Jdm9pZCAqYmFzZTsKLQlpbnQgaSwgbnI7Ci0KLQlidWZmZXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBlcmZfYnVmZmVyLCB3b3JrKTsKLQluciA9IDEgPDwgcGFnZV9vcmRlcihidWZmZXIpOwotCi0JYmFzZSA9IGJ1ZmZlci0+dXNlcl9wYWdlOwotCWZvciAoaSA9IDA7IGkgPCBuciArIDE7IGkrKykKLQkJcGVyZl9tbWFwX3VubWFya19wYWdlKGJhc2UgKyAoaSAqIFBBR0VfU0laRSkpOwotCi0JdmZyZWUoYmFzZSk7Ci0Ja2ZyZWUoYnVmZmVyKTsKLX0KLQotc3RhdGljIHZvaWQgcGVyZl9idWZmZXJfZnJlZShzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlzY2hlZHVsZV93b3JrKCZidWZmZXItPndvcmspOwotfQotCi1zdGF0aWMgc3RydWN0IHBlcmZfYnVmZmVyICoKLXBlcmZfYnVmZmVyX2FsbG9jKGludCBucl9wYWdlcywgbG9uZyB3YXRlcm1hcmssIGludCBjcHUsIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcjsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0Jdm9pZCAqYWxsX2J1ZjsKLQotCXNpemUgPSBzaXplb2Yoc3RydWN0IHBlcmZfYnVmZmVyKTsKLQlzaXplICs9IHNpemVvZih2b2lkICopOwotCi0JYnVmZmVyID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlcikKLQkJZ290byBmYWlsOwotCi0JSU5JVF9XT1JLKCZidWZmZXItPndvcmssIHBlcmZfYnVmZmVyX2ZyZWVfd29yayk7Ci0KLQlhbGxfYnVmID0gdm1hbGxvY191c2VyKChucl9wYWdlcyArIDEpICogUEFHRV9TSVpFKTsKLQlpZiAoIWFsbF9idWYpCi0JCWdvdG8gZmFpbF9hbGxfYnVmOwotCi0JYnVmZmVyLT51c2VyX3BhZ2UgPSBhbGxfYnVmOwotCWJ1ZmZlci0+ZGF0YV9wYWdlc1swXSA9IGFsbF9idWYgKyBQQUdFX1NJWkU7Ci0JYnVmZmVyLT5wYWdlX29yZGVyID0gaWxvZzIobnJfcGFnZXMpOwotCWJ1ZmZlci0+bnJfcGFnZXMgPSAxOwotCi0JcGVyZl9idWZmZXJfaW5pdChidWZmZXIsIHdhdGVybWFyaywgZmxhZ3MpOwotCi0JcmV0dXJuIGJ1ZmZlcjsKLQotZmFpbF9hbGxfYnVmOgotCWtmcmVlKGJ1ZmZlcik7Ci0KLWZhaWw6Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJmX2RhdGFfc2l6ZShzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlyZXR1cm4gYnVmZmVyLT5ucl9wYWdlcyA8PCAoUEFHRV9TSElGVCArIHBhZ2Vfb3JkZXIoYnVmZmVyKSk7Ci19Ci0KIHN0YXRpYyBpbnQgcGVyZl9tbWFwX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcjsKKwlzdHJ1Y3QgcmluZ19idWZmZXIgKnJiOwogCWludCByZXQgPSBWTV9GQVVMVF9TSUdCVVM7CiAKIAlpZiAodm1mLT5mbGFncyAmIEZBVUxUX0ZMQUdfTUtXUklURSkgewpAQCAtMzYyMywxNCArMzQzMCwxNCBAQAogCX0KIAogCXJjdV9yZWFkX2xvY2soKTsKLQlidWZmZXIgPSByY3VfZGVyZWZlcmVuY2UoZXZlbnQtPmJ1ZmZlcik7Ci0JaWYgKCFidWZmZXIpCisJcmIgPSByY3VfZGVyZWZlcmVuY2UoZXZlbnQtPnJiKTsKKwlpZiAoIXJiKQogCQlnb3RvIHVubG9jazsKIAogCWlmICh2bWYtPnBnb2ZmICYmICh2bWYtPmZsYWdzICYgRkFVTFRfRkxBR19XUklURSkpCiAJCWdvdG8gdW5sb2NrOwogCi0Jdm1mLT5wYWdlID0gcGVyZl9tbWFwX3RvX3BhZ2UoYnVmZmVyLCB2bWYtPnBnb2ZmKTsKKwl2bWYtPnBhZ2UgPSBwZXJmX21tYXBfdG9fcGFnZShyYiwgdm1mLT5wZ29mZik7CiAJaWYgKCF2bWYtPnBhZ2UpCiAJCWdvdG8gdW5sb2NrOwogCkBAIC0zNjQ1LDM1ICszNDUyLDM1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgcGVyZl9idWZmZXJfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3VfaGVhZCkKK3N0YXRpYyB2b2lkIHJiX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1X2hlYWQpCiB7Ci0Jc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXI7CisJc3RydWN0IHJpbmdfYnVmZmVyICpyYjsKIAotCWJ1ZmZlciA9IGNvbnRhaW5lcl9vZihyY3VfaGVhZCwgc3RydWN0IHBlcmZfYnVmZmVyLCByY3VfaGVhZCk7Ci0JcGVyZl9idWZmZXJfZnJlZShidWZmZXIpOworCXJiID0gY29udGFpbmVyX29mKHJjdV9oZWFkLCBzdHJ1Y3QgcmluZ19idWZmZXIsIHJjdV9oZWFkKTsKKwlyYl9mcmVlKHJiKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwZXJmX2J1ZmZlciAqcGVyZl9idWZmZXJfZ2V0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3N0YXRpYyBzdHJ1Y3QgcmluZ19idWZmZXIgKnJpbmdfYnVmZmVyX2dldChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7Ci0Jc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXI7CisJc3RydWN0IHJpbmdfYnVmZmVyICpyYjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlidWZmZXIgPSByY3VfZGVyZWZlcmVuY2UoZXZlbnQtPmJ1ZmZlcik7Ci0JaWYgKGJ1ZmZlcikgewotCQlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJmJ1ZmZlci0+cmVmY291bnQpKQotCQkJYnVmZmVyID0gTlVMTDsKKwlyYiA9IHJjdV9kZXJlZmVyZW5jZShldmVudC0+cmIpOworCWlmIChyYikgeworCQlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJnJiLT5yZWZjb3VudCkpCisJCQlyYiA9IE5VTEw7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JcmV0dXJuIGJ1ZmZlcjsKKwlyZXR1cm4gcmI7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmZfYnVmZmVyX3B1dChzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlcikKK3N0YXRpYyB2b2lkIHJpbmdfYnVmZmVyX3B1dChzdHJ1Y3QgcmluZ19idWZmZXIgKnJiKQogewotCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmYnVmZmVyLT5yZWZjb3VudCkpCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZyYi0+cmVmY291bnQpKQogCQlyZXR1cm47CiAKLQljYWxsX3JjdSgmYnVmZmVyLT5yY3VfaGVhZCwgcGVyZl9idWZmZXJfZnJlZV9yY3UpOworCWNhbGxfcmN1KCZyYi0+cmN1X2hlYWQsIHJiX2ZyZWVfcmN1KTsKIH0KIAogc3RhdGljIHZvaWQgcGVyZl9tbWFwX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCkBAIC0zNjg4LDE2ICszNDk1LDE2IEBACiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jaygmZXZlbnQtPm1tYXBfY291bnQsICZldmVudC0+bW1hcF9tdXRleCkpIHsKLQkJdW5zaWduZWQgbG9uZyBzaXplID0gcGVyZl9kYXRhX3NpemUoZXZlbnQtPmJ1ZmZlcik7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHBlcmZfZGF0YV9zaXplKGV2ZW50LT5yYik7CiAJCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlciA9IGV2ZW50LT5tbWFwX3VzZXI7Ci0JCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyID0gZXZlbnQtPmJ1ZmZlcjsKKwkJc3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IGV2ZW50LT5yYjsKIAogCQlhdG9taWNfbG9uZ19zdWIoKHNpemUgPj4gUEFHRV9TSElGVCkgKyAxLCAmdXNlci0+bG9ja2VkX3ZtKTsKIAkJdm1hLT52bV9tbS0+bG9ja2VkX3ZtIC09IGV2ZW50LT5tbWFwX2xvY2tlZDsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKGV2ZW50LT5idWZmZXIsIE5VTEwpOworCQlyY3VfYXNzaWduX3BvaW50ZXIoZXZlbnQtPnJiLCBOVUxMKTsKIAkJbXV0ZXhfdW5sb2NrKCZldmVudC0+bW1hcF9tdXRleCk7CiAKLQkJcGVyZl9idWZmZXJfcHV0KGJ1ZmZlcik7CisJCXJpbmdfYnVmZmVyX3B1dChyYik7CiAJCWZyZWVfdWlkKHVzZXIpOwogCX0KIH0KQEAgLTM3MTUsNyArMzUyMiw3IEBACiAJdW5zaWduZWQgbG9uZyB1c2VyX2xvY2tlZCwgdXNlcl9sb2NrX2xpbWl0OwogCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlciA9IGN1cnJlbnRfdXNlcigpOwogCXVuc2lnbmVkIGxvbmcgbG9ja2VkLCBsb2NrX2xpbWl0OwotCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyOworCXN0cnVjdCByaW5nX2J1ZmZlciAqcmI7CiAJdW5zaWduZWQgbG9uZyB2bWFfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwogCWxvbmcgdXNlcl9leHRyYSwgZXh0cmE7CkBAIC0zNzI0LDcgKzM1MzEsNyBAQAogCS8qCiAJICogRG9uJ3QgYWxsb3cgbW1hcCgpIG9mIGluaGVyaXRlZCBwZXItdGFzayBjb3VudGVycy4gVGhpcyB3b3VsZAogCSAqIGNyZWF0ZSBhIHBlcmZvcm1hbmNlIGlzc3VlIGR1ZSB0byBhbGwgY2hpbGRyZW4gd3JpdGluZyB0byB0aGUKLQkgKiBzYW1lIGJ1ZmZlci4KKwkgKiBzYW1lIHJiLgogCSAqLwogCWlmIChldmVudC0+Y3B1ID09IC0xICYmIGV2ZW50LT5hdHRyLmluaGVyaXQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzczNiw3ICszNTQzLDcgQEAKIAlucl9wYWdlcyA9ICh2bWFfc2l6ZSAvIFBBR0VfU0laRSkgLSAxOwogCiAJLyoKLQkgKiBJZiB3ZSBoYXZlIGJ1ZmZlciBwYWdlcyBlbnN1cmUgdGhleSdyZSBhIHBvd2VyLW9mLXR3byBudW1iZXIsIHNvIHdlCisJICogSWYgd2UgaGF2ZSByYiBwYWdlcyBlbnN1cmUgdGhleSdyZSBhIHBvd2VyLW9mLXR3byBudW1iZXIsIHNvIHdlCiAJICogY2FuIGRvIGJpdG1hc2tzIGluc3RlYWQgb2YgbW9kdWxvLgogCSAqLwogCWlmIChucl9wYWdlcyAhPSAwICYmICFpc19wb3dlcl9vZl8yKG5yX3BhZ2VzKSkKQEAgLTM3NTAsOSArMzU1Nyw5IEBACiAKIAlXQVJOX09OX09OQ0UoZXZlbnQtPmN0eC0+cGFyZW50X2N0eCk7CiAJbXV0ZXhfbG9jaygmZXZlbnQtPm1tYXBfbXV0ZXgpOwotCWlmIChldmVudC0+YnVmZmVyKSB7Ci0JCWlmIChldmVudC0+YnVmZmVyLT5ucl9wYWdlcyA9PSBucl9wYWdlcykKLQkJCWF0b21pY19pbmMoJmV2ZW50LT5idWZmZXItPnJlZmNvdW50KTsKKwlpZiAoZXZlbnQtPnJiKSB7CisJCWlmIChldmVudC0+cmItPm5yX3BhZ2VzID09IG5yX3BhZ2VzKQorCQkJYXRvbWljX2luYygmZXZlbnQtPnJiLT5yZWZjb3VudCk7CiAJCWVsc2UKIAkJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gdW5sb2NrOwpAQCAtMzc4MiwxOCArMzU4OSwyMCBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlXQVJOX09OKGV2ZW50LT5idWZmZXIpOworCVdBUk5fT04oZXZlbnQtPnJiKTsKIAogCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCi0JCWZsYWdzIHw9IFBFUkZfQlVGRkVSX1dSSVRBQkxFOworCQlmbGFncyB8PSBSSU5HX0JVRkZFUl9XUklUQUJMRTsKIAotCWJ1ZmZlciA9IHBlcmZfYnVmZmVyX2FsbG9jKG5yX3BhZ2VzLCBldmVudC0+YXR0ci53YWtldXBfd2F0ZXJtYXJrLAotCQkJCSAgIGV2ZW50LT5jcHUsIGZsYWdzKTsKLQlpZiAoIWJ1ZmZlcikgeworCXJiID0gcmJfYWxsb2MobnJfcGFnZXMsIAorCQlldmVudC0+YXR0ci53YXRlcm1hcmsgPyBldmVudC0+YXR0ci53YWtldXBfd2F0ZXJtYXJrIDogMCwKKwkJZXZlbnQtPmNwdSwgZmxhZ3MpOworCisJaWYgKCFyYikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIHVubG9jazsKIAl9Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGV2ZW50LT5idWZmZXIsIGJ1ZmZlcik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGV2ZW50LT5yYiwgcmIpOwogCiAJYXRvbWljX2xvbmdfYWRkKHVzZXJfZXh0cmEsICZ1c2VyLT5sb2NrZWRfdm0pOwogCWV2ZW50LT5tbWFwX2xvY2tlZCA9IGV4dHJhOwpAQCAtMzg5MiwxMTcgKzM3MDEsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocGVyZl91bnJlZ2lzdGVyX2d1ZXN0X2luZm9fY2FsbGJhY2tzKTsKIAotLyoKLSAqIE91dHB1dAotICovCi1zdGF0aWMgYm9vbCBwZXJmX291dHB1dF9zcGFjZShzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyB0YWlsLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgaGVhZCkKLXsKLQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLQlpZiAoIWJ1ZmZlci0+d3JpdGFibGUpCi0JCXJldHVybiB0cnVlOwotCi0JbWFzayA9IHBlcmZfZGF0YV9zaXplKGJ1ZmZlcikgLSAxOwotCi0Jb2Zmc2V0ID0gKG9mZnNldCAtIHRhaWwpICYgbWFzazsKLQloZWFkICAgPSAoaGVhZCAgIC0gdGFpbCkgJiBtYXNrOwotCi0JaWYgKChpbnQpKGhlYWQgLSBvZmZzZXQpIDwgMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcmZfb3V0cHV0X3dha2V1cChzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpCi17Ci0JYXRvbWljX3NldCgmaGFuZGxlLT5idWZmZXItPnBvbGwsIFBPTExfSU4pOwotCi0JaWYgKGhhbmRsZS0+bm1pKSB7Ci0JCWhhbmRsZS0+ZXZlbnQtPnBlbmRpbmdfd2FrZXVwID0gMTsKLQkJaXJxX3dvcmtfcXVldWUoJmhhbmRsZS0+ZXZlbnQtPnBlbmRpbmcpOwotCX0gZWxzZQotCQlwZXJmX2V2ZW50X3dha2V1cChoYW5kbGUtPmV2ZW50KTsKLX0KLQotLyoKLSAqIFdlIG5lZWQgdG8gZW5zdXJlIGEgbGF0ZXIgZXZlbnRfaWQgZG9lc24ndCBwdWJsaXNoIGEgaGVhZCB3aGVuIGEgZm9ybWVyCi0gKiBldmVudCBpc24ndCBkb25lIHdyaXRpbmcuIEhvd2V2ZXIgc2luY2Ugd2UgbmVlZCB0byBkZWFsIHdpdGggTk1JcyB3ZQotICogY2Fubm90IGZ1bGx5IHNlcmlhbGl6ZSB0aGluZ3MuCi0gKgotICogV2Ugb25seSBwdWJsaXNoIHRoZSBoZWFkIChhbmQgZ2VuZXJhdGUgYSB3YWtldXApIHdoZW4gdGhlIG91dGVyLW1vc3QKLSAqIGV2ZW50IGNvbXBsZXRlcy4KLSAqLwotc3RhdGljIHZvaWQgcGVyZl9vdXRwdXRfZ2V0X2hhbmRsZShzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpCi17Ci0Jc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIgPSBoYW5kbGUtPmJ1ZmZlcjsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCWxvY2FsX2luYygmYnVmZmVyLT5uZXN0KTsKLQloYW5kbGUtPndha2V1cCA9IGxvY2FsX3JlYWQoJmJ1ZmZlci0+d2FrZXVwKTsKLX0KLQotc3RhdGljIHZvaWQgcGVyZl9vdXRwdXRfcHV0X2hhbmRsZShzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpCi17Ci0Jc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXIgPSBoYW5kbGUtPmJ1ZmZlcjsKLQl1bnNpZ25lZCBsb25nIGhlYWQ7Ci0KLWFnYWluOgotCWhlYWQgPSBsb2NhbF9yZWFkKCZidWZmZXItPmhlYWQpOwotCi0JLyoKLQkgKiBJUlEvTk1JIGNhbiBoYXBwZW4gaGVyZSwgd2hpY2ggbWVhbnMgd2UgY2FuIG1pc3MgYSBoZWFkIHVwZGF0ZS4KLQkgKi8KLQotCWlmICghbG9jYWxfZGVjX2FuZF90ZXN0KCZidWZmZXItPm5lc3QpKQotCQlnb3RvIG91dDsKLQotCS8qCi0JICogUHVibGlzaCB0aGUga25vd24gZ29vZCBoZWFkLiBSZWx5IG9uIHRoZSBmdWxsIGJhcnJpZXIgaW1wbGllZAotCSAqIGJ5IGF0b21pY19kZWNfYW5kX3Rlc3QoKSBvcmRlciB0aGUgYnVmZmVyLT5oZWFkIHJlYWQgYW5kIHRoaXMKLQkgKiB3cml0ZS4KLQkgKi8KLQlidWZmZXItPnVzZXJfcGFnZS0+ZGF0YV9oZWFkID0gaGVhZDsKLQotCS8qCi0JICogTm93IGNoZWNrIGlmIHdlIG1pc3NlZCBhbiB1cGRhdGUsIHJlbHkgb24gdGhlIChjb21waWxlcikKLQkgKiBiYXJyaWVyIGluIGF0b21pY19kZWNfYW5kX3Rlc3QoKSB0byByZS1yZWFkIGJ1ZmZlci0+aGVhZC4KLQkgKi8KLQlpZiAodW5saWtlbHkoaGVhZCAhPSBsb2NhbF9yZWFkKCZidWZmZXItPmhlYWQpKSkgewotCQlsb2NhbF9pbmMoJmJ1ZmZlci0+bmVzdCk7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCi0JaWYgKGhhbmRsZS0+d2FrZXVwICE9IGxvY2FsX3JlYWQoJmJ1ZmZlci0+d2FrZXVwKSkKLQkJcGVyZl9vdXRwdXRfd2FrZXVwKGhhbmRsZSk7Ci0KLW91dDoKLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotCi1fX2Fsd2F5c19pbmxpbmUgdm9pZCBwZXJmX291dHB1dF9jb3B5KHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwKLQkJICAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCWRvIHsKLQkJdW5zaWduZWQgbG9uZyBzaXplID0gbWluX3QodW5zaWduZWQgbG9uZywgaGFuZGxlLT5zaXplLCBsZW4pOwotCi0JCW1lbWNweShoYW5kbGUtPmFkZHIsIGJ1Ziwgc2l6ZSk7Ci0KLQkJbGVuIC09IHNpemU7Ci0JCWhhbmRsZS0+YWRkciArPSBzaXplOwotCQlidWYgKz0gc2l6ZTsKLQkJaGFuZGxlLT5zaXplIC09IHNpemU7Ci0JCWlmICghaGFuZGxlLT5zaXplKSB7Ci0JCQlzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlciA9IGhhbmRsZS0+YnVmZmVyOwotCi0JCQloYW5kbGUtPnBhZ2UrKzsKLQkJCWhhbmRsZS0+cGFnZSAmPSBidWZmZXItPm5yX3BhZ2VzIC0gMTsKLQkJCWhhbmRsZS0+YWRkciA9IGJ1ZmZlci0+ZGF0YV9wYWdlc1toYW5kbGUtPnBhZ2VdOwotCQkJaGFuZGxlLT5zaXplID0gUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXIoYnVmZmVyKTsKLQkJfQotCX0gd2hpbGUgKGxlbik7Ci19Ci0KIHN0YXRpYyB2b2lkIF9fcGVyZl9ldmVudF9oZWFkZXJfX2luaXRfaWQoc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpoZWFkZXIsCiAJCQkJCSBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwKIAkJCQkJIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKQEAgLTQwMzMsOSArMzczMSw5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBwZXJmX2V2ZW50X2hlYWRlcl9faW5pdF9pZChzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmhlYWRlciwKLQkJCQkgICAgICAgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCi0JCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3ZvaWQgcGVyZl9ldmVudF9oZWFkZXJfX2luaXRfaWQoc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpoZWFkZXIsCisJCQkJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCisJCQkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCWlmIChldmVudC0+YXR0ci5zYW1wbGVfaWRfYWxsKQogCQlfX3BlcmZfZXZlbnRfaGVhZGVyX19pbml0X2lkKGhlYWRlciwgZGF0YSwgZXZlbnQpOwpAQCAtNDA2MiwxMjEgKzM3NjAsMTQgQEAKIAkJcGVyZl9vdXRwdXRfcHV0KGhhbmRsZSwgZGF0YS0+Y3B1X2VudHJ5KTsKIH0KIAotc3RhdGljIHZvaWQgcGVyZl9ldmVudF9fb3V0cHV0X2lkX3NhbXBsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCi0JCQkJCSBzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCi0JCQkJCSBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqc2FtcGxlKQordm9pZCBwZXJmX2V2ZW50X19vdXRwdXRfaWRfc2FtcGxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQkgIHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpzYW1wbGUpCiB7CiAJaWYgKGV2ZW50LT5hdHRyLnNhbXBsZV9pZF9hbGwpCiAJCV9fcGVyZl9ldmVudF9fb3V0cHV0X2lkX3NhbXBsZShoYW5kbGUsIHNhbXBsZSk7CiB9CiAKLWludCBwZXJmX291dHB1dF9iZWdpbihzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCi0JCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdW5zaWduZWQgaW50IHNpemUsCi0JCSAgICAgIGludCBubWksIGludCBzYW1wbGUpCi17Ci0Jc3RydWN0IHBlcmZfYnVmZmVyICpidWZmZXI7Ci0JdW5zaWduZWQgbG9uZyB0YWlsLCBvZmZzZXQsIGhlYWQ7Ci0JaW50IGhhdmVfbG9zdDsKLQlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSBzYW1wbGVfZGF0YTsKLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOwotCQl1NjQJCQkgaWQ7Ci0JCXU2NAkJCSBsb3N0OwotCX0gbG9zdF9ldmVudDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQkvKgotCSAqIEZvciBpbmhlcml0ZWQgZXZlbnRzIHdlIHNlbmQgYWxsIHRoZSBvdXRwdXQgdG93YXJkcyB0aGUgcGFyZW50LgotCSAqLwotCWlmIChldmVudC0+cGFyZW50KQotCQlldmVudCA9IGV2ZW50LT5wYXJlbnQ7Ci0KLQlidWZmZXIgPSByY3VfZGVyZWZlcmVuY2UoZXZlbnQtPmJ1ZmZlcik7Ci0JaWYgKCFidWZmZXIpCi0JCWdvdG8gb3V0OwotCi0JaGFuZGxlLT5idWZmZXIJPSBidWZmZXI7Ci0JaGFuZGxlLT5ldmVudAk9IGV2ZW50OwotCWhhbmRsZS0+bm1pCT0gbm1pOwotCWhhbmRsZS0+c2FtcGxlCT0gc2FtcGxlOwotCi0JaWYgKCFidWZmZXItPm5yX3BhZ2VzKQotCQlnb3RvIG91dDsKLQotCWhhdmVfbG9zdCA9IGxvY2FsX3JlYWQoJmJ1ZmZlci0+bG9zdCk7Ci0JaWYgKGhhdmVfbG9zdCkgewotCQlsb3N0X2V2ZW50LmhlYWRlci5zaXplID0gc2l6ZW9mKGxvc3RfZXZlbnQpOwotCQlwZXJmX2V2ZW50X2hlYWRlcl9faW5pdF9pZCgmbG9zdF9ldmVudC5oZWFkZXIsICZzYW1wbGVfZGF0YSwKLQkJCQkJICAgZXZlbnQpOwotCQlzaXplICs9IGxvc3RfZXZlbnQuaGVhZGVyLnNpemU7Ci0JfQotCi0JcGVyZl9vdXRwdXRfZ2V0X2hhbmRsZShoYW5kbGUpOwotCi0JZG8gewotCQkvKgotCQkgKiBVc2Vyc3BhY2UgY291bGQgY2hvb3NlIHRvIGlzc3VlIGEgbWIoKSBiZWZvcmUgdXBkYXRpbmcgdGhlCi0JCSAqIHRhaWwgcG9pbnRlci4gU28gdGhhdCBhbGwgcmVhZHMgd2lsbCBiZSBjb21wbGV0ZWQgYmVmb3JlIHRoZQotCQkgKiB3cml0ZSBpcyBpc3N1ZWQuCi0JCSAqLwotCQl0YWlsID0gQUNDRVNTX09OQ0UoYnVmZmVyLT51c2VyX3BhZ2UtPmRhdGFfdGFpbCk7Ci0JCXNtcF9ybWIoKTsKLQkJb2Zmc2V0ID0gaGVhZCA9IGxvY2FsX3JlYWQoJmJ1ZmZlci0+aGVhZCk7Ci0JCWhlYWQgKz0gc2l6ZTsKLQkJaWYgKHVubGlrZWx5KCFwZXJmX291dHB1dF9zcGFjZShidWZmZXIsIHRhaWwsIG9mZnNldCwgaGVhZCkpKQotCQkJZ290byBmYWlsOwotCX0gd2hpbGUgKGxvY2FsX2NtcHhjaGcoJmJ1ZmZlci0+aGVhZCwgb2Zmc2V0LCBoZWFkKSAhPSBvZmZzZXQpOwotCi0JaWYgKGhlYWQgLSBsb2NhbF9yZWFkKCZidWZmZXItPndha2V1cCkgPiBidWZmZXItPndhdGVybWFyaykKLQkJbG9jYWxfYWRkKGJ1ZmZlci0+d2F0ZXJtYXJrLCAmYnVmZmVyLT53YWtldXApOwotCi0JaGFuZGxlLT5wYWdlID0gb2Zmc2V0ID4+IChQQUdFX1NISUZUICsgcGFnZV9vcmRlcihidWZmZXIpKTsKLQloYW5kbGUtPnBhZ2UgJj0gYnVmZmVyLT5ucl9wYWdlcyAtIDE7Ci0JaGFuZGxlLT5zaXplID0gb2Zmc2V0ICYgKChQQUdFX1NJWkUgPDwgcGFnZV9vcmRlcihidWZmZXIpKSAtIDEpOwotCWhhbmRsZS0+YWRkciA9IGJ1ZmZlci0+ZGF0YV9wYWdlc1toYW5kbGUtPnBhZ2VdOwotCWhhbmRsZS0+YWRkciArPSBoYW5kbGUtPnNpemU7Ci0JaGFuZGxlLT5zaXplID0gKFBBR0VfU0laRSA8PCBwYWdlX29yZGVyKGJ1ZmZlcikpIC0gaGFuZGxlLT5zaXplOwotCi0JaWYgKGhhdmVfbG9zdCkgewotCQlsb3N0X2V2ZW50LmhlYWRlci50eXBlID0gUEVSRl9SRUNPUkRfTE9TVDsKLQkJbG9zdF9ldmVudC5oZWFkZXIubWlzYyA9IDA7Ci0JCWxvc3RfZXZlbnQuaWQgICAgICAgICAgPSBldmVudC0+aWQ7Ci0JCWxvc3RfZXZlbnQubG9zdCAgICAgICAgPSBsb2NhbF94Y2hnKCZidWZmZXItPmxvc3QsIDApOwotCi0JCXBlcmZfb3V0cHV0X3B1dChoYW5kbGUsIGxvc3RfZXZlbnQpOwotCQlwZXJmX2V2ZW50X19vdXRwdXRfaWRfc2FtcGxlKGV2ZW50LCBoYW5kbGUsICZzYW1wbGVfZGF0YSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JbG9jYWxfaW5jKCZidWZmZXItPmxvc3QpOwotCXBlcmZfb3V0cHV0X3B1dF9oYW5kbGUoaGFuZGxlKTsKLW91dDoKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiAtRU5PU1BDOwotfQotCi12b2lkIHBlcmZfb3V0cHV0X2VuZChzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpCi17Ci0Jc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gaGFuZGxlLT5ldmVudDsKLQlzdHJ1Y3QgcGVyZl9idWZmZXIgKmJ1ZmZlciA9IGhhbmRsZS0+YnVmZmVyOwotCi0JaW50IHdha2V1cF9ldmVudHMgPSBldmVudC0+YXR0ci53YWtldXBfZXZlbnRzOwotCi0JaWYgKGhhbmRsZS0+c2FtcGxlICYmIHdha2V1cF9ldmVudHMpIHsKLQkJaW50IGV2ZW50cyA9IGxvY2FsX2luY19yZXR1cm4oJmJ1ZmZlci0+ZXZlbnRzKTsKLQkJaWYgKGV2ZW50cyA+PSB3YWtldXBfZXZlbnRzKSB7Ci0JCQlsb2NhbF9zdWIod2FrZXVwX2V2ZW50cywgJmJ1ZmZlci0+ZXZlbnRzKTsKLQkJCWxvY2FsX2luYygmYnVmZmVyLT53YWtldXApOwotCQl9Ci0JfQotCi0JcGVyZl9vdXRwdXRfcHV0X2hhbmRsZShoYW5kbGUpOwotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCiBzdGF0aWMgdm9pZCBwZXJmX291dHB1dF9yZWFkX29uZShzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCiAJCQkJIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQkgdTY0IGVuYWJsZWQsIHU2NCBydW5uaW5nKQpAQCAtNDE5Nyw3ICszNzg4LDcgQEAKIAlpZiAocmVhZF9mb3JtYXQgJiBQRVJGX0ZPUk1BVF9JRCkKIAkJdmFsdWVzW24rK10gPSBwcmltYXJ5X2V2ZW50X2lkKGV2ZW50KTsKIAotCXBlcmZfb3V0cHV0X2NvcHkoaGFuZGxlLCB2YWx1ZXMsIG4gKiBzaXplb2YodTY0KSk7CisJX19vdXRwdXRfY29weShoYW5kbGUsIHZhbHVlcywgbiAqIHNpemVvZih1NjQpKTsKIH0KIAogLyoKQEAgLTQyMjcsNyArMzgxOCw3IEBACiAJaWYgKHJlYWRfZm9ybWF0ICYgUEVSRl9GT1JNQVRfSUQpCiAJCXZhbHVlc1tuKytdID0gcHJpbWFyeV9ldmVudF9pZChsZWFkZXIpOwogCi0JcGVyZl9vdXRwdXRfY29weShoYW5kbGUsIHZhbHVlcywgbiAqIHNpemVvZih1NjQpKTsKKwlfX291dHB1dF9jb3B5KGhhbmRsZSwgdmFsdWVzLCBuICogc2l6ZW9mKHU2NCkpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWIsICZsZWFkZXItPnNpYmxpbmdfbGlzdCwgZ3JvdXBfZW50cnkpIHsKIAkJbiA9IDA7CkBAIC00MjM5LDcgKzM4MzAsNyBAQAogCQlpZiAocmVhZF9mb3JtYXQgJiBQRVJGX0ZPUk1BVF9JRCkKIAkJCXZhbHVlc1tuKytdID0gcHJpbWFyeV9ldmVudF9pZChzdWIpOwogCi0JCXBlcmZfb3V0cHV0X2NvcHkoaGFuZGxlLCB2YWx1ZXMsIG4gKiBzaXplb2YodTY0KSk7CisJCV9fb3V0cHV0X2NvcHkoaGFuZGxlLCB2YWx1ZXMsIG4gKiBzaXplb2YodTY0KSk7CiAJfQogfQogCkBAIC00MjQ5LDcgKzM4NDAsNyBAQAogc3RhdGljIHZvaWQgcGVyZl9vdXRwdXRfcmVhZChzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCiAJCQkgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKLQl1NjQgZW5hYmxlZCA9IDAsIHJ1bm5pbmcgPSAwLCBub3csIGN0eF90aW1lOworCXU2NCBlbmFibGVkID0gMCwgcnVubmluZyA9IDA7CiAJdTY0IHJlYWRfZm9ybWF0ID0gZXZlbnQtPmF0dHIucmVhZF9mb3JtYXQ7CiAKIAkvKgpAQCAtNDI2MSwxMiArMzg1Miw4IEBACiAJICogYmVjYXVzZSBvZiBsb2NraW5nIGlzc3VlIGFzIHdlIGFyZSBjYWxsZWQgaW4KIAkgKiBOTUkgY29udGV4dAogCSAqLwotCWlmIChyZWFkX2Zvcm1hdCAmIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVTKSB7Ci0JCW5vdyA9IHBlcmZfY2xvY2soKTsKLQkJY3R4X3RpbWUgPSBldmVudC0+c2hhZG93X2N0eF90aW1lICsgbm93OwotCQllbmFibGVkID0gY3R4X3RpbWUgLSBldmVudC0+dHN0YW1wX2VuYWJsZWQ7Ci0JCXJ1bm5pbmcgPSBjdHhfdGltZSAtIGV2ZW50LT50c3RhbXBfcnVubmluZzsKLQl9CisJaWYgKHJlYWRfZm9ybWF0ICYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRVMpCisJCWNhbGNfdGltZXJfdmFsdWVzKGV2ZW50LCAmZW5hYmxlZCwgJnJ1bm5pbmcpOwogCiAJaWYgKGV2ZW50LT5hdHRyLnJlYWRfZm9ybWF0ICYgUEVSRl9GT1JNQVRfR1JPVVApCiAJCXBlcmZfb3V0cHV0X3JlYWRfZ3JvdXAoaGFuZGxlLCBldmVudCwgZW5hYmxlZCwgcnVubmluZyk7CkBAIC00MzE5LDcgKzM5MDYsNyBAQAogCiAJCQlzaXplICo9IHNpemVvZih1NjQpOwogCi0JCQlwZXJmX291dHB1dF9jb3B5KGhhbmRsZSwgZGF0YS0+Y2FsbGNoYWluLCBzaXplKTsKKwkJCV9fb3V0cHV0X2NvcHkoaGFuZGxlLCBkYXRhLT5jYWxsY2hhaW4sIHNpemUpOwogCQl9IGVsc2UgewogCQkJdTY0IG5yID0gMDsKIAkJCXBlcmZfb3V0cHV0X3B1dChoYW5kbGUsIG5yKTsKQEAgLTQzMjksOCArMzkxNiw4IEBACiAJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUkFXKSB7CiAJCWlmIChkYXRhLT5yYXcpIHsKIAkJCXBlcmZfb3V0cHV0X3B1dChoYW5kbGUsIGRhdGEtPnJhdy0+c2l6ZSk7Ci0JCQlwZXJmX291dHB1dF9jb3B5KGhhbmRsZSwgZGF0YS0+cmF3LT5kYXRhLAotCQkJCQkgZGF0YS0+cmF3LT5zaXplKTsKKwkJCV9fb3V0cHV0X2NvcHkoaGFuZGxlLCBkYXRhLT5yYXctPmRhdGEsCisJCQkJCSAgIGRhdGEtPnJhdy0+c2l6ZSk7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgewogCQkJCXUzMglzaXplOwpAQCAtNDM0Miw2ICszOTI5LDIwIEBACiAJCQlwZXJmX291dHB1dF9wdXQoaGFuZGxlLCByYXcpOwogCQl9CiAJfQorCisJaWYgKCFldmVudC0+YXR0ci53YXRlcm1hcmspIHsKKwkJaW50IHdha2V1cF9ldmVudHMgPSBldmVudC0+YXR0ci53YWtldXBfZXZlbnRzOworCisJCWlmICh3YWtldXBfZXZlbnRzKSB7CisJCQlzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gaGFuZGxlLT5yYjsKKwkJCWludCBldmVudHMgPSBsb2NhbF9pbmNfcmV0dXJuKCZyYi0+ZXZlbnRzKTsKKworCQkJaWYgKGV2ZW50cyA+PSB3YWtldXBfZXZlbnRzKSB7CisJCQkJbG9jYWxfc3ViKHdha2V1cF9ldmVudHMsICZyYi0+ZXZlbnRzKTsKKwkJCQlsb2NhbF9pbmMoJnJiLT53YWtldXApOworCQkJfQorCQl9CisJfQogfQogCiB2b2lkIHBlcmZfcHJlcGFyZV9zYW1wbGUoc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpoZWFkZXIsCkBAIC00Mzg2LDcgKzM5ODcsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgcGVyZl9ldmVudF9vdXRwdXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbm1pLAorc3RhdGljIHZvaWQgcGVyZl9ldmVudF9vdXRwdXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLAogCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtNDM5OCw3ICszOTk5LDcgQEAKIAogCXBlcmZfcHJlcGFyZV9zYW1wbGUoJmhlYWRlciwgZGF0YSwgZXZlbnQsIHJlZ3MpOwogCi0JaWYgKHBlcmZfb3V0cHV0X2JlZ2luKCZoYW5kbGUsIGV2ZW50LCBoZWFkZXIuc2l6ZSwgbm1pLCAxKSkKKwlpZiAocGVyZl9vdXRwdXRfYmVnaW4oJmhhbmRsZSwgZXZlbnQsIGhlYWRlci5zaXplKSkKIAkJZ290byBleGl0OwogCiAJcGVyZl9vdXRwdXRfc2FtcGxlKCZoYW5kbGUsICZoZWFkZXIsIGRhdGEsIGV2ZW50KTsKQEAgLTQ0MzgsNyArNDAzOSw3IEBACiAJaW50IHJldDsKIAogCXBlcmZfZXZlbnRfaGVhZGVyX19pbml0X2lkKCZyZWFkX2V2ZW50LmhlYWRlciwgJnNhbXBsZSwgZXZlbnQpOwotCXJldCA9IHBlcmZfb3V0cHV0X2JlZ2luKCZoYW5kbGUsIGV2ZW50LCByZWFkX2V2ZW50LmhlYWRlci5zaXplLCAwLCAwKTsKKwlyZXQgPSBwZXJmX291dHB1dF9iZWdpbigmaGFuZGxlLCBldmVudCwgcmVhZF9ldmVudC5oZWFkZXIuc2l6ZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuOwogCkBAIC00NDgxLDcgKzQwODIsNyBAQAogCXBlcmZfZXZlbnRfaGVhZGVyX19pbml0X2lkKCZ0YXNrX2V2ZW50LT5ldmVudF9pZC5oZWFkZXIsICZzYW1wbGUsIGV2ZW50KTsKIAogCXJldCA9IHBlcmZfb3V0cHV0X2JlZ2luKCZoYW5kbGUsIGV2ZW50LAotCQkJCXRhc2tfZXZlbnQtPmV2ZW50X2lkLmhlYWRlci5zaXplLCAwLCAwKTsKKwkJCQl0YXNrX2V2ZW50LT5ldmVudF9pZC5oZWFkZXIuc2l6ZSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKQEAgLTQ2MTgsNyArNDIxOSw3IEBACiAKIAlwZXJmX2V2ZW50X2hlYWRlcl9faW5pdF9pZCgmY29tbV9ldmVudC0+ZXZlbnRfaWQuaGVhZGVyLCAmc2FtcGxlLCBldmVudCk7CiAJcmV0ID0gcGVyZl9vdXRwdXRfYmVnaW4oJmhhbmRsZSwgZXZlbnQsCi0JCQkJY29tbV9ldmVudC0+ZXZlbnRfaWQuaGVhZGVyLnNpemUsIDAsIDApOworCQkJCWNvbW1fZXZlbnQtPmV2ZW50X2lkLmhlYWRlci5zaXplKTsKIAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwpAQCAtNDYyNyw3ICs0MjI4LDcgQEAKIAljb21tX2V2ZW50LT5ldmVudF9pZC50aWQgPSBwZXJmX2V2ZW50X3RpZChldmVudCwgY29tbV9ldmVudC0+dGFzayk7CiAKIAlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgY29tbV9ldmVudC0+ZXZlbnRfaWQpOwotCXBlcmZfb3V0cHV0X2NvcHkoJmhhbmRsZSwgY29tbV9ldmVudC0+Y29tbSwKKwlfX291dHB1dF9jb3B5KCZoYW5kbGUsIGNvbW1fZXZlbnQtPmNvbW0sCiAJCQkJICAgY29tbV9ldmVudC0+Y29tbV9zaXplKTsKIAogCXBlcmZfZXZlbnRfX291dHB1dF9pZF9zYW1wbGUoZXZlbnQsICZoYW5kbGUsICZzYW1wbGUpOwpAQCAtNDc2NSw3ICs0MzY2LDcgQEAKIAogCXBlcmZfZXZlbnRfaGVhZGVyX19pbml0X2lkKCZtbWFwX2V2ZW50LT5ldmVudF9pZC5oZWFkZXIsICZzYW1wbGUsIGV2ZW50KTsKIAlyZXQgPSBwZXJmX291dHB1dF9iZWdpbigmaGFuZGxlLCBldmVudCwKLQkJCQltbWFwX2V2ZW50LT5ldmVudF9pZC5oZWFkZXIuc2l6ZSwgMCwgMCk7CisJCQkJbW1hcF9ldmVudC0+ZXZlbnRfaWQuaGVhZGVyLnNpemUpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC00NzczLDcgKzQzNzQsNyBAQAogCW1tYXBfZXZlbnQtPmV2ZW50X2lkLnRpZCA9IHBlcmZfZXZlbnRfdGlkKGV2ZW50LCBjdXJyZW50KTsKIAogCXBlcmZfb3V0cHV0X3B1dCgmaGFuZGxlLCBtbWFwX2V2ZW50LT5ldmVudF9pZCk7Ci0JcGVyZl9vdXRwdXRfY29weSgmaGFuZGxlLCBtbWFwX2V2ZW50LT5maWxlX25hbWUsCisJX19vdXRwdXRfY29weSgmaGFuZGxlLCBtbWFwX2V2ZW50LT5maWxlX25hbWUsCiAJCQkJICAgbW1hcF9ldmVudC0+ZmlsZV9zaXplKTsKIAogCXBlcmZfZXZlbnRfX291dHB1dF9pZF9zYW1wbGUoZXZlbnQsICZoYW5kbGUsICZzYW1wbGUpOwpAQCAtNDgyOSw3ICs0NDMwLDcgQEAKIAogCWlmIChmaWxlKSB7CiAJCS8qCi0JCSAqIGRfcGF0aCB3b3JrcyBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBiYWNrd2FyZHMsIHNvIHdlCisJCSAqIGRfcGF0aCB3b3JrcyBmcm9tIHRoZSBlbmQgb2YgdGhlIHJiIGJhY2t3YXJkcywgc28gd2UKIAkJICogbmVlZCB0byBhZGQgZW5vdWdoIHplcm8gYnl0ZXMgYWZ0ZXIgdGhlIHN0cmluZyB0byBoYW5kbGUKIAkJICogdGhlIDY0Yml0IGFsaWdubWVudCB3ZSBkbyBsYXRlci4KIAkJICovCkBAIC00OTYwLDcgKzQ1NjEsNyBAQAogCXBlcmZfZXZlbnRfaGVhZGVyX19pbml0X2lkKCZ0aHJvdHRsZV9ldmVudC5oZWFkZXIsICZzYW1wbGUsIGV2ZW50KTsKIAogCXJldCA9IHBlcmZfb3V0cHV0X2JlZ2luKCZoYW5kbGUsIGV2ZW50LAotCQkJCXRocm90dGxlX2V2ZW50LmhlYWRlci5zaXplLCAxLCAwKTsKKwkJCQl0aHJvdHRsZV9ldmVudC5oZWFkZXIuc2l6ZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuOwogCkBAIC00OTczLDcgKzQ1NzQsNyBAQAogICogR2VuZXJpYyBldmVudCBvdmVyZmxvdyBoYW5kbGluZywgc2FtcGxpbmcuCiAgKi8KIAotc3RhdGljIGludCBfX3BlcmZfZXZlbnRfb3ZlcmZsb3coc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbm1pLAorc3RhdGljIGludCBfX3BlcmZfZXZlbnRfb3ZlcmZsb3coc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgIGludCB0aHJvdHRsZSwgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCiAJCQkJICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC01MDE2LDM0ICs0NjE3LDI4IEBACiAJaWYgKGV2ZW50cyAmJiBhdG9taWNfZGVjX2FuZF90ZXN0KCZldmVudC0+ZXZlbnRfbGltaXQpKSB7CiAJCXJldCA9IDE7CiAJCWV2ZW50LT5wZW5kaW5nX2tpbGwgPSBQT0xMX0hVUDsKLQkJaWYgKG5taSkgewotCQkJZXZlbnQtPnBlbmRpbmdfZGlzYWJsZSA9IDE7Ci0JCQlpcnFfd29ya19xdWV1ZSgmZXZlbnQtPnBlbmRpbmcpOwotCQl9IGVsc2UKLQkJCXBlcmZfZXZlbnRfZGlzYWJsZShldmVudCk7CisJCWV2ZW50LT5wZW5kaW5nX2Rpc2FibGUgPSAxOworCQlpcnFfd29ya19xdWV1ZSgmZXZlbnQtPnBlbmRpbmcpOwogCX0KIAogCWlmIChldmVudC0+b3ZlcmZsb3dfaGFuZGxlcikKLQkJZXZlbnQtPm92ZXJmbG93X2hhbmRsZXIoZXZlbnQsIG5taSwgZGF0YSwgcmVncyk7CisJCWV2ZW50LT5vdmVyZmxvd19oYW5kbGVyKGV2ZW50LCBkYXRhLCByZWdzKTsKIAllbHNlCi0JCXBlcmZfZXZlbnRfb3V0cHV0KGV2ZW50LCBubWksIGRhdGEsIHJlZ3MpOworCQlwZXJmX2V2ZW50X291dHB1dChldmVudCwgZGF0YSwgcmVncyk7CiAKIAlpZiAoZXZlbnQtPmZhc3luYyAmJiBldmVudC0+cGVuZGluZ19raWxsKSB7Ci0JCWlmIChubWkpIHsKLQkJCWV2ZW50LT5wZW5kaW5nX3dha2V1cCA9IDE7Ci0JCQlpcnFfd29ya19xdWV1ZSgmZXZlbnQtPnBlbmRpbmcpOwotCQl9IGVsc2UKLQkJCXBlcmZfZXZlbnRfd2FrZXVwKGV2ZW50KTsKKwkJZXZlbnQtPnBlbmRpbmdfd2FrZXVwID0gMTsKKwkJaXJxX3dvcmtfcXVldWUoJmV2ZW50LT5wZW5kaW5nKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgcGVyZl9ldmVudF9vdmVyZmxvdyhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBubWksCitpbnQgcGVyZl9ldmVudF9vdmVyZmxvdyhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkgIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLAogCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlyZXR1cm4gX19wZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCBubWksIDEsIGRhdGEsIHJlZ3MpOworCXJldHVybiBfX3BlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsIDEsIGRhdGEsIHJlZ3MpOwogfQogCiAvKgpAQCAtNTA5Miw3ICs0Njg3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgcGVyZl9zd2V2ZW50X292ZXJmbG93KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdTY0IG92ZXJmbG93LAotCQkJCSAgICBpbnQgbm1pLCBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwKKwkJCQkgICAgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCiAJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwpAQCAtNTEwNiw3ICs0NzAxLDcgQEAKIAkJcmV0dXJuOwogCiAJZm9yICg7IG92ZXJmbG93OyBvdmVyZmxvdy0tKSB7Ci0JCWlmIChfX3BlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsIG5taSwgdGhyb3R0bGUsCisJCWlmIChfX3BlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsIHRocm90dGxlLAogCQkJCQkgICAgZGF0YSwgcmVncykpIHsKIAkJCS8qCiAJCQkgKiBXZSBpbmhpYml0IHRoZSBvdmVyZmxvdyBmcm9tIGhhcHBlbmluZyB3aGVuCkBAIC01MTE5LDcgKzQ3MTQsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBwZXJmX3N3ZXZlbnRfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1NjQgbnIsCi0JCQkgICAgICAgaW50IG5taSwgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCiAJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CkBAIC01MTMzLDEyICs0NzI4LDEyIEBACiAJCXJldHVybjsKIAogCWlmIChuciA9PSAxICYmIGh3Yy0+c2FtcGxlX3BlcmlvZCA9PSAxICYmICFldmVudC0+YXR0ci5mcmVxKQotCQlyZXR1cm4gcGVyZl9zd2V2ZW50X292ZXJmbG93KGV2ZW50LCAxLCBubWksIGRhdGEsIHJlZ3MpOworCQlyZXR1cm4gcGVyZl9zd2V2ZW50X292ZXJmbG93KGV2ZW50LCAxLCBkYXRhLCByZWdzKTsKIAogCWlmIChsb2NhbDY0X2FkZF9uZWdhdGl2ZShuciwgJmh3Yy0+cGVyaW9kX2xlZnQpKQogCQlyZXR1cm47CiAKLQlwZXJmX3N3ZXZlbnRfb3ZlcmZsb3coZXZlbnQsIDAsIG5taSwgZGF0YSwgcmVncyk7CisJcGVyZl9zd2V2ZW50X292ZXJmbG93KGV2ZW50LCAwLCBkYXRhLCByZWdzKTsKIH0KIAogc3RhdGljIGludCBwZXJmX2V4Y2x1ZGVfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LApAQCAtNTIyNiw3ICs0ODIxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgZG9fcGVyZl9zd19ldmVudChlbnVtIHBlcmZfdHlwZV9pZCB0eXBlLCB1MzIgZXZlbnRfaWQsCi0JCQkJICAgIHU2NCBuciwgaW50IG5taSwKKwkJCQkgICAgdTY0IG5yLAogCQkJCSAgICBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwKIAkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC01MjQyLDcgKzQ4MzcsNyBAQAogCiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGV2ZW50LCBub2RlLCBoZWFkLCBobGlzdF9lbnRyeSkgewogCQlpZiAocGVyZl9zd2V2ZW50X21hdGNoKGV2ZW50LCB0eXBlLCBldmVudF9pZCwgZGF0YSwgcmVncykpCi0JCQlwZXJmX3N3ZXZlbnRfZXZlbnQoZXZlbnQsIG5yLCBubWksIGRhdGEsIHJlZ3MpOworCQkJcGVyZl9zd2V2ZW50X2V2ZW50KGV2ZW50LCBuciwgZGF0YSwgcmVncyk7CiAJfQogZW5kOgogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtNTI2Myw4ICs0ODU4LDcgQEAKIAlwdXRfcmVjdXJzaW9uX2NvbnRleHQoc3doYXNoLT5yZWN1cnNpb24sIHJjdHgpOwogfQogCi12b2lkIF9fcGVyZl9zd19ldmVudCh1MzIgZXZlbnRfaWQsIHU2NCBuciwgaW50IG5taSwKLQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTY0IGFkZHIpCit2b2lkIF9fcGVyZl9zd19ldmVudCh1MzIgZXZlbnRfaWQsIHU2NCBuciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHU2NCBhZGRyKQogewogCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhIGRhdGE7CiAJaW50IHJjdHg7CkBAIC01Mjc2LDcgKzQ4NzAsNyBAQAogCiAJcGVyZl9zYW1wbGVfZGF0YV9pbml0KCZkYXRhLCBhZGRyKTsKIAotCWRvX3BlcmZfc3dfZXZlbnQoUEVSRl9UWVBFX1NPRlRXQVJFLCBldmVudF9pZCwgbnIsIG5taSwgJmRhdGEsIHJlZ3MpOworCWRvX3BlcmZfc3dfZXZlbnQoUEVSRl9UWVBFX1NPRlRXQVJFLCBldmVudF9pZCwgbnIsICZkYXRhLCByZWdzKTsKIAogCXBlcmZfc3dldmVudF9wdXRfcmVjdXJzaW9uX2NvbnRleHQocmN0eCk7CiAJcHJlZW1wdF9lbmFibGVfbm90cmFjZSgpOwpAQCAtNTUyNCw3ICs1MTE4LDcgQEAKIAogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShldmVudCwgbm9kZSwgaGVhZCwgaGxpc3RfZW50cnkpIHsKIAkJaWYgKHBlcmZfdHBfZXZlbnRfbWF0Y2goZXZlbnQsICZkYXRhLCByZWdzKSkKLQkJCXBlcmZfc3dldmVudF9ldmVudChldmVudCwgY291bnQsIDEsICZkYXRhLCByZWdzKTsKKwkJCXBlcmZfc3dldmVudF9ldmVudChldmVudCwgY291bnQsICZkYXRhLCByZWdzKTsKIAl9CiAKIAlwZXJmX3N3ZXZlbnRfcHV0X3JlY3Vyc2lvbl9jb250ZXh0KHJjdHgpOwpAQCAtNTYxNyw3ICs1MjExLDcgQEAKIAlwZXJmX3NhbXBsZV9kYXRhX2luaXQoJnNhbXBsZSwgYnAtPmF0dHIuYnBfYWRkcik7CiAKIAlpZiAoIWJwLT5ody5zdGF0ZSAmJiAhcGVyZl9leGNsdWRlX2V2ZW50KGJwLCByZWdzKSkKLQkJcGVyZl9zd2V2ZW50X2V2ZW50KGJwLCAxLCAxLCAmc2FtcGxlLCByZWdzKTsKKwkJcGVyZl9zd2V2ZW50X2V2ZW50KGJwLCAxLCAmc2FtcGxlLCByZWdzKTsKIH0KICNlbmRpZgogCkBAIC01NjQ2LDcgKzUyNDAsNyBAQAogCiAJaWYgKHJlZ3MgJiYgIXBlcmZfZXhjbHVkZV9ldmVudChldmVudCwgcmVncykpIHsKIAkJaWYgKCEoZXZlbnQtPmF0dHIuZXhjbHVkZV9pZGxlICYmIGN1cnJlbnQtPnBpZCA9PSAwKSkKLQkJCWlmIChwZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCAwLCAmZGF0YSwgcmVncykpCisJCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgJmRhdGEsIHJlZ3MpKQogCQkJCXJldCA9IEhSVElNRVJfTk9SRVNUQVJUOwogCX0KIApAQCAtNTk4Niw2ICs1NTgwLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBjcHVjdHhfbXV0ZXg7CitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGNwdWN0eF9sb2NrOwogCiBpbnQgcGVyZl9wbXVfcmVnaXN0ZXIoc3RydWN0IHBtdSAqcG11LCBjaGFyICpuYW1lLCBpbnQgdHlwZSkKIHsKQEAgLTYwMzYsNiArNTYzMSw3IEBACiAJCWNwdWN0eCA9IHBlcl9jcHVfcHRyKHBtdS0+cG11X2NwdV9jb250ZXh0LCBjcHUpOwogCQlfX3BlcmZfZXZlbnRfaW5pdF9jb250ZXh0KCZjcHVjdHgtPmN0eCk7CiAJCWxvY2tkZXBfc2V0X2NsYXNzKCZjcHVjdHgtPmN0eC5tdXRleCwgJmNwdWN0eF9tdXRleCk7CisJCWxvY2tkZXBfc2V0X2NsYXNzKCZjcHVjdHgtPmN0eC5sb2NrLCAmY3B1Y3R4X2xvY2spOwogCQljcHVjdHgtPmN0eC50eXBlID0gY3B1X2NvbnRleHQ7CiAJCWNwdWN0eC0+Y3R4LnBtdSA9IHBtdTsKIAkJY3B1Y3R4LT5qaWZmaWVzX2ludGVydmFsID0gMTsKQEAgLTYxNTAsNyArNTc0Niw4IEBACiAJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCiAJCSBzdHJ1Y3QgcGVyZl9ldmVudCAqZ3JvdXBfbGVhZGVyLAogCQkgc3RydWN0IHBlcmZfZXZlbnQgKnBhcmVudF9ldmVudCwKLQkJIHBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90IG92ZXJmbG93X2hhbmRsZXIpCisJCSBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCBvdmVyZmxvd19oYW5kbGVyLAorCQkgdm9pZCAqY29udGV4dCkKIHsKIAlzdHJ1Y3QgcG11ICpwbXU7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50OwpAQCAtNjIwOCwxMCArNTgwNSwxMyBAQAogI2VuZGlmCiAJfQogCi0JaWYgKCFvdmVyZmxvd19oYW5kbGVyICYmIHBhcmVudF9ldmVudCkKKwlpZiAoIW92ZXJmbG93X2hhbmRsZXIgJiYgcGFyZW50X2V2ZW50KSB7CiAJCW92ZXJmbG93X2hhbmRsZXIgPSBwYXJlbnRfZXZlbnQtPm92ZXJmbG93X2hhbmRsZXI7CisJCWNvbnRleHQgPSBwYXJlbnRfZXZlbnQtPm92ZXJmbG93X2hhbmRsZXJfY29udGV4dDsKKwl9CiAKIAlldmVudC0+b3ZlcmZsb3dfaGFuZGxlcgk9IG92ZXJmbG93X2hhbmRsZXI7CisJZXZlbnQtPm92ZXJmbG93X2hhbmRsZXJfY29udGV4dCA9IGNvbnRleHQ7CiAKIAlpZiAoYXR0ci0+ZGlzYWJsZWQpCiAJCWV2ZW50LT5zdGF0ZSA9IFBFUkZfRVZFTlRfU1RBVEVfT0ZGOwpAQCAtNjMyNiwxMyArNTkyNiw2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkvKgotCSAqIElmIHRoZSB0eXBlIGV4aXN0cywgdGhlIGNvcnJlc3BvbmRpbmcgY3JlYXRpb24gd2lsbCB2ZXJpZnkKLQkgKiB0aGUgYXR0ci0+Y29uZmlnLgotCSAqLwotCWlmIChhdHRyLT50eXBlID49IFBFUkZfVFlQRV9NQVgpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKGF0dHItPl9fcmVzZXJ2ZWRfMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTYzNTQsNyArNTk0Nyw3IEBACiBzdGF0aWMgaW50CiBwZXJmX2V2ZW50X3NldF9vdXRwdXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBzdHJ1Y3QgcGVyZl9ldmVudCAqb3V0cHV0X2V2ZW50KQogewotCXN0cnVjdCBwZXJmX2J1ZmZlciAqYnVmZmVyID0gTlVMTCwgKm9sZF9idWZmZXIgPSBOVUxMOworCXN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMLCAqb2xkX3JiID0gTlVMTDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCWlmICghb3V0cHV0X2V2ZW50KQpAQCAtNjM3MSw3ICs1OTY0LDcgQEAKIAkJZ290byBvdXQ7CiAKIAkvKgotCSAqIElmIGl0cyBub3QgYSBwZXItY3B1IGJ1ZmZlciwgaXQgbXVzdCBiZSB0aGUgc2FtZSB0YXNrLgorCSAqIElmIGl0cyBub3QgYSBwZXItY3B1IHJiLCBpdCBtdXN0IGJlIHRoZSBzYW1lIHRhc2suCiAJICovCiAJaWYgKG91dHB1dF9ldmVudC0+Y3B1ID09IC0xICYmIG91dHB1dF9ldmVudC0+Y3R4ICE9IGV2ZW50LT5jdHgpCiAJCWdvdG8gb3V0OwpAQCAtNjM4MywyMCArNTk3NiwyMCBAQAogCQlnb3RvIHVubG9jazsKIAogCWlmIChvdXRwdXRfZXZlbnQpIHsKLQkJLyogZ2V0IHRoZSBidWZmZXIgd2Ugd2FudCB0byByZWRpcmVjdCB0byAqLwotCQlidWZmZXIgPSBwZXJmX2J1ZmZlcl9nZXQob3V0cHV0X2V2ZW50KTsKLQkJaWYgKCFidWZmZXIpCisJCS8qIGdldCB0aGUgcmIgd2Ugd2FudCB0byByZWRpcmVjdCB0byAqLworCQlyYiA9IHJpbmdfYnVmZmVyX2dldChvdXRwdXRfZXZlbnQpOworCQlpZiAoIXJiKQogCQkJZ290byB1bmxvY2s7CiAJfQogCi0Jb2xkX2J1ZmZlciA9IGV2ZW50LT5idWZmZXI7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGV2ZW50LT5idWZmZXIsIGJ1ZmZlcik7CisJb2xkX3JiID0gZXZlbnQtPnJiOworCXJjdV9hc3NpZ25fcG9pbnRlcihldmVudC0+cmIsIHJiKTsKIAlyZXQgPSAwOwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmZXZlbnQtPm1tYXBfbXV0ZXgpOwogCi0JaWYgKG9sZF9idWZmZXIpCi0JCXBlcmZfYnVmZmVyX3B1dChvbGRfYnVmZmVyKTsKKwlpZiAob2xkX3JiKQorCQlyaW5nX2J1ZmZlcl9wdXQob2xkX3JiKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjQ3OCw3ICs2MDcxLDggQEAKIAkJfQogCX0KIAotCWV2ZW50ID0gcGVyZl9ldmVudF9hbGxvYygmYXR0ciwgY3B1LCB0YXNrLCBncm91cF9sZWFkZXIsIE5VTEwsIE5VTEwpOworCWV2ZW50ID0gcGVyZl9ldmVudF9hbGxvYygmYXR0ciwgY3B1LCB0YXNrLCBncm91cF9sZWFkZXIsIE5VTEwsCisJCQkJIE5VTEwsIE5VTEwpOwogCWlmIChJU19FUlIoZXZlbnQpKSB7CiAJCWVyciA9IFBUUl9FUlIoZXZlbnQpOwogCQlnb3RvIGVycl90YXNrOwpAQCAtNjY2Myw3ICs2MjU3LDggQEAKIHN0cnVjdCBwZXJmX2V2ZW50ICoKIHBlcmZfZXZlbnRfY3JlYXRlX2tlcm5lbF9jb3VudGVyKHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsIGludCBjcHUsCiAJCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJCQkgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3Qgb3ZlcmZsb3dfaGFuZGxlcikKKwkJCQkgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3Qgb3ZlcmZsb3dfaGFuZGxlciwKKwkJCQkgdm9pZCAqY29udGV4dCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHg7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50OwpAQCAtNjY3Myw3ICs2MjY4LDggQEAKIAkgKiBHZXQgdGhlIHRhcmdldCBjb250ZXh0ICh0YXNrIG9yIHBlcmNwdSk6CiAJICovCiAKLQlldmVudCA9IHBlcmZfZXZlbnRfYWxsb2MoYXR0ciwgY3B1LCB0YXNrLCBOVUxMLCBOVUxMLCBvdmVyZmxvd19oYW5kbGVyKTsKKwlldmVudCA9IHBlcmZfZXZlbnRfYWxsb2MoYXR0ciwgY3B1LCB0YXNrLCBOVUxMLCBOVUxMLAorCQkJCSBvdmVyZmxvd19oYW5kbGVyLCBjb250ZXh0KTsKIAlpZiAoSVNfRVJSKGV2ZW50KSkgewogCQllcnIgPSBQVFJfRVJSKGV2ZW50KTsKIAkJZ290byBlcnI7CkBAIC02NzgwLDcgKzYzNzYsNiBAQAogCSAqIG91ciBjb250ZXh0LgogCSAqLwogCWNoaWxkX2N0eCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoY2hpbGQtPnBlcmZfZXZlbnRfY3R4cFtjdHhuXSk7Ci0JdGFza19jdHhfc2NoZWRfb3V0KGNoaWxkX2N0eCwgRVZFTlRfQUxMKTsKIAogCS8qCiAJICogVGFrZSB0aGUgY29udGV4dCBsb2NrIGhlcmUgc28gdGhhdCBpZiBmaW5kX2dldF9jb250ZXh0IGlzCkBAIC02Nzg4LDYgKzYzODMsNyBAQAogCSAqIGluY3JlbWVudGVkIHRoZSBjb250ZXh0J3MgcmVmY291bnQgYmVmb3JlIHdlIGRvIHB1dF9jdHggYmVsb3cuCiAJICovCiAJcmF3X3NwaW5fbG9jaygmY2hpbGRfY3R4LT5sb2NrKTsKKwl0YXNrX2N0eF9zY2hlZF9vdXQoY2hpbGRfY3R4KTsKIAljaGlsZC0+cGVyZl9ldmVudF9jdHhwW2N0eG5dID0gTlVMTDsKIAkvKgogCSAqIElmIHRoaXMgY29udGV4dCBpcyBhIGNsb25lOyB1bmNsb25lIGl0IHNvIGl0IGNhbid0IGdldApAQCAtNjk1Nyw3ICs2NTUzLDcgQEAKIAkJCQkJICAgcGFyZW50X2V2ZW50LT5jcHUsCiAJCQkJCSAgIGNoaWxkLAogCQkJCQkgICBncm91cF9sZWFkZXIsIHBhcmVudF9ldmVudCwKLQkJCQkJICAgTlVMTCk7CisJCQkJICAgICAgICAgICBOVUxMLCBOVUxMKTsKIAlpZiAoSVNfRVJSKGNoaWxkX2V2ZW50KSkKIAkJcmV0dXJuIGNoaWxkX2V2ZW50OwogCWdldF9jdHgoY2hpbGRfY3R4KTsKQEAgLTY5ODQsNiArNjU4MCw4IEBACiAKIAljaGlsZF9ldmVudC0+Y3R4ID0gY2hpbGRfY3R4OwogCWNoaWxkX2V2ZW50LT5vdmVyZmxvd19oYW5kbGVyID0gcGFyZW50X2V2ZW50LT5vdmVyZmxvd19oYW5kbGVyOworCWNoaWxkX2V2ZW50LT5vdmVyZmxvd19oYW5kbGVyX2NvbnRleHQKKwkJPSBwYXJlbnRfZXZlbnQtPm92ZXJmbG93X2hhbmRsZXJfY29udGV4dDsKIAogCS8qCiAJICogUHJlY2FsY3VsYXRlIHNhbXBsZV9kYXRhIHNpemVzCkBAIC03NDAyLDI2ICs3MDAwLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmZfY2dyb3VwX21vdmUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQorc3RhdGljIHZvaWQKK3BlcmZfY2dyb3VwX2F0dGFjaF90YXNrKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAl0YXNrX2Z1bmN0aW9uX2NhbGwodGFzaywgX19wZXJmX2Nncm91cF9tb3ZlLCB0YXNrKTsKIH0KIAotc3RhdGljIHZvaWQgcGVyZl9jZ3JvdXBfYXR0YWNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY2dycCwKLQkJc3RydWN0IGNncm91cCAqb2xkX2NncnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJYm9vbCB0aHJlYWRncm91cCkKLXsKLQlwZXJmX2Nncm91cF9tb3ZlKHRhc2spOwotCWlmICh0aHJlYWRncm91cCkgewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmM7Ci0JCXJjdV9yZWFkX2xvY2soKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYywgJnRhc2stPnRocmVhZF9ncm91cCwgdGhyZWFkX2dyb3VwKSB7Ci0JCQlwZXJmX2Nncm91cF9tb3ZlKGMpOwotCQl9Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCX0KLX0KLQogc3RhdGljIHZvaWQgcGVyZl9jZ3JvdXBfZXhpdChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnAsCiAJCXN0cnVjdCBjZ3JvdXAgKm9sZF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CkBAIC03NDMzLDcgKzcwMTcsNyBAQAogCWlmICghKHRhc2stPmZsYWdzICYgUEZfRVhJVElORykpCiAJCXJldHVybjsKIAotCXBlcmZfY2dyb3VwX21vdmUodGFzayk7CisJcGVyZl9jZ3JvdXBfYXR0YWNoX3Rhc2soY2dycCwgdGFzayk7CiB9CiAKIHN0cnVjdCBjZ3JvdXBfc3Vic3lzIHBlcmZfc3Vic3lzID0gewpAQCAtNzQ0Miw2ICs3MDI2LDYgQEAKIAkuY3JlYXRlCQk9IHBlcmZfY2dyb3VwX2NyZWF0ZSwKIAkuZGVzdHJveQk9IHBlcmZfY2dyb3VwX2Rlc3Ryb3ksCiAJLmV4aXQJCT0gcGVyZl9jZ3JvdXBfZXhpdCwKLQkuYXR0YWNoCQk9IHBlcmZfY2dyb3VwX2F0dGFjaCwKKwkuYXR0YWNoX3Rhc2sJPSBwZXJmX2Nncm91cF9hdHRhY2hfdGFzaywKIH07CiAjZW5kaWYgLyogQ09ORklHX0NHUk9VUF9QRVJGICovCmRpZmYgLS1naXQgYS9rZXJuZWwvZXZlbnRzL2h3X2JyZWFrcG9pbnQuYyBiL2tlcm5lbC9ldmVudHMvaHdfYnJlYWtwb2ludC5jCmluZGV4IDA4NmFkZjIuLmI3OTcxZDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ldmVudHMvaHdfYnJlYWtwb2ludC5jCisrKyBiL2tlcm5lbC9ldmVudHMvaHdfYnJlYWtwb2ludC5jCkBAIC00MzEsOSArNDMxLDExIEBACiBzdHJ1Y3QgcGVyZl9ldmVudCAqCiByZWdpc3Rlcl91c2VyX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKIAkJCSAgICBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCB0cmlnZ2VyZWQsCisJCQkgICAgdm9pZCAqY29udGV4dCwKIAkJCSAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQlyZXR1cm4gcGVyZl9ldmVudF9jcmVhdGVfa2VybmVsX2NvdW50ZXIoYXR0ciwgLTEsIHRzaywgdHJpZ2dlcmVkKTsKKwlyZXR1cm4gcGVyZl9ldmVudF9jcmVhdGVfa2VybmVsX2NvdW50ZXIoYXR0ciwgLTEsIHRzaywgdHJpZ2dlcmVkLAorCQkJCQkJY29udGV4dCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl91c2VyX2h3X2JyZWFrcG9pbnQpOwogCkBAIC01MDIsNyArNTA0LDggQEAKICAqLwogc3RydWN0IHBlcmZfZXZlbnQgKiBfX3BlcmNwdSAqCiByZWdpc3Rlcl93aWRlX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKLQkJCSAgICBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCB0cmlnZ2VyZWQpCisJCQkgICAgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QgdHJpZ2dlcmVkLAorCQkJICAgIHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKiBfX3BlcmNwdSAqY3B1X2V2ZW50cywgKipwZXZlbnQsICpicDsKIAlsb25nIGVycjsKQEAgLTUxNSw3ICs1MTgsOCBAQAogCWdldF9vbmxpbmVfY3B1cygpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCXBldmVudCA9IHBlcl9jcHVfcHRyKGNwdV9ldmVudHMsIGNwdSk7Ci0JCWJwID0gcGVyZl9ldmVudF9jcmVhdGVfa2VybmVsX2NvdW50ZXIoYXR0ciwgY3B1LCBOVUxMLCB0cmlnZ2VyZWQpOworCQlicCA9IHBlcmZfZXZlbnRfY3JlYXRlX2tlcm5lbF9jb3VudGVyKGF0dHIsIGNwdSwgTlVMTCwKKwkJCQkJCSAgICAgIHRyaWdnZXJlZCwgY29udGV4dCk7CiAKIAkJKnBldmVudCA9IGJwOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvZXZlbnRzL2ludGVybmFsLmggYi9rZXJuZWwvZXZlbnRzL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwOTdkZAotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9ldmVudHMvaW50ZXJuYWwuaApAQCAtMCwwICsxLDk2IEBACisjaWZuZGVmIF9LRVJORUxfRVZFTlRTX0lOVEVSTkFMX0gKKyNkZWZpbmUgX0tFUk5FTF9FVkVOVFNfSU5URVJOQUxfSAorCisjZGVmaW5lIFJJTkdfQlVGRkVSX1dSSVRBQkxFCQkweDAxCisKK3N0cnVjdCByaW5nX2J1ZmZlciB7CisJYXRvbWljX3QJCQlyZWZjb3VudDsKKwlzdHJ1Y3QgcmN1X2hlYWQJCQlyY3VfaGVhZDsKKyNpZmRlZiBDT05GSUdfUEVSRl9VU0VfVk1BTExPQworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29yazsKKwlpbnQJCQkJcGFnZV9vcmRlcjsJLyogYWxsb2NhdGlvbiBvcmRlciAgKi8KKyNlbmRpZgorCWludAkJCQlucl9wYWdlczsJLyogbnIgb2YgZGF0YSBwYWdlcyAgKi8KKwlpbnQJCQkJd3JpdGFibGU7CS8qIGFyZSB3ZSB3cml0YWJsZSAgICovCisKKwlhdG9taWNfdAkJCXBvbGw7CQkvKiBQT0xMXyBmb3Igd2FrZXVwcyAqLworCisJbG9jYWxfdAkJCQloZWFkOwkJLyogd3JpdGUgcG9zaXRpb24gICAgKi8KKwlsb2NhbF90CQkJCW5lc3Q7CQkvKiBuZXN0ZWQgd3JpdGVycyAgICAqLworCWxvY2FsX3QJCQkJZXZlbnRzOwkJLyogZXZlbnQgbGltaXQgICAgICAgKi8KKwlsb2NhbF90CQkJCXdha2V1cDsJCS8qIHdha2V1cCBzdGFtcCAgICAgICovCisJbG9jYWxfdAkJCQlsb3N0OwkJLyogbnIgcmVjb3JkcyBsb3N0ICAgKi8KKworCWxvbmcJCQkJd2F0ZXJtYXJrOwkvKiB3YWtldXAgd2F0ZXJtYXJrICAqLworCisJc3RydWN0IHBlcmZfZXZlbnRfbW1hcF9wYWdlCSp1c2VyX3BhZ2U7CisJdm9pZAkJCQkqZGF0YV9wYWdlc1swXTsKK307CisKK2V4dGVybiB2b2lkIHJiX2ZyZWUoc3RydWN0IHJpbmdfYnVmZmVyICpyYik7CitleHRlcm4gc3RydWN0IHJpbmdfYnVmZmVyICoKK3JiX2FsbG9jKGludCBucl9wYWdlcywgbG9uZyB3YXRlcm1hcmssIGludCBjcHUsIGludCBmbGFncyk7CitleHRlcm4gdm9pZCBwZXJmX2V2ZW50X3dha2V1cChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOworCitleHRlcm4gdm9pZAorcGVyZl9ldmVudF9oZWFkZXJfX2luaXRfaWQoc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICpoZWFkZXIsCisJCQkgICBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwKKwkJCSAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CitleHRlcm4gdm9pZAorcGVyZl9ldmVudF9fb3V0cHV0X2lkX3NhbXBsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQkgICAgIHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKnNhbXBsZSk7CisKK2V4dGVybiBzdHJ1Y3QgcGFnZSAqCitwZXJmX21tYXBfdG9fcGFnZShzdHJ1Y3QgcmluZ19idWZmZXIgKnJiLCB1bnNpZ25lZCBsb25nIHBnb2ZmKTsKKworI2lmZGVmIENPTkZJR19QRVJGX1VTRV9WTUFMTE9DCisvKgorICogQmFjayBwZXJmX21tYXAoKSB3aXRoIHZtYWxsb2MgbWVtb3J5LgorICoKKyAqIFJlcXVpcmVkIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgaGF2ZSBkLWNhY2hlIGFsaWFzaW5nIGlzc3Vlcy4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBwYWdlX29yZGVyKHN0cnVjdCByaW5nX2J1ZmZlciAqcmIpCit7CisJcmV0dXJuIHJiLT5wYWdlX29yZGVyOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBwYWdlX29yZGVyKHN0cnVjdCByaW5nX2J1ZmZlciAqcmIpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyZl9kYXRhX3NpemUoc3RydWN0IHJpbmdfYnVmZmVyICpyYikKK3sKKwlyZXR1cm4gcmItPm5yX3BhZ2VzIDw8IChQQUdFX1NISUZUICsgcGFnZV9vcmRlcihyYikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fb3V0cHV0X2NvcHkoc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlLAorCQkgICBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCit7CisJZG8geworCQl1bnNpZ25lZCBsb25nIHNpemUgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBoYW5kbGUtPnNpemUsIGxlbik7CisKKwkJbWVtY3B5KGhhbmRsZS0+YWRkciwgYnVmLCBzaXplKTsKKworCQlsZW4gLT0gc2l6ZTsKKwkJaGFuZGxlLT5hZGRyICs9IHNpemU7CisJCWJ1ZiArPSBzaXplOworCQloYW5kbGUtPnNpemUgLT0gc2l6ZTsKKwkJaWYgKCFoYW5kbGUtPnNpemUpIHsKKwkJCXN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBoYW5kbGUtPnJiOworCisJCQloYW5kbGUtPnBhZ2UrKzsKKwkJCWhhbmRsZS0+cGFnZSAmPSByYi0+bnJfcGFnZXMgLSAxOworCQkJaGFuZGxlLT5hZGRyID0gcmItPmRhdGFfcGFnZXNbaGFuZGxlLT5wYWdlXTsKKwkJCWhhbmRsZS0+c2l6ZSA9IFBBR0VfU0laRSA8PCBwYWdlX29yZGVyKHJiKTsKKwkJfQorCX0gd2hpbGUgKGxlbik7Cit9CisKKyNlbmRpZiAvKiBfS0VSTkVMX0VWRU5UU19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9rZXJuZWwvZXZlbnRzL3JpbmdfYnVmZmVyLmMgYi9rZXJuZWwvZXZlbnRzL3JpbmdfYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhMjkyMAotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9ldmVudHMvcmluZ19idWZmZXIuYwpAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIFBlcmZvcm1hbmNlIGV2ZW50cyByaW5nLWJ1ZmZlciBjb2RlOgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBSZWQgSGF0LCBJbmMuLCBQZXRlciBaaWpsc3RyYSA8cHppamxzdHJAcmVkaGF0LmNvbT4KKyAqICBDb3B5cmlnaHQgIKkgIDIwMDkgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3JwLiA8cGF1bHVzQGF1MS5pYm0uY29tPgorICoKKyAqIEZvciBsaWNlbnNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisKKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBib29sIHBlcmZfb3V0cHV0X3NwYWNlKHN0cnVjdCByaW5nX2J1ZmZlciAqcmIsIHVuc2lnbmVkIGxvbmcgdGFpbCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJaWYgKCFyYi0+d3JpdGFibGUpCisJCXJldHVybiB0cnVlOworCisJbWFzayA9IHBlcmZfZGF0YV9zaXplKHJiKSAtIDE7CisKKwlvZmZzZXQgPSAob2Zmc2V0IC0gdGFpbCkgJiBtYXNrOworCWhlYWQgICA9IChoZWFkICAgLSB0YWlsKSAmIG1hc2s7CisKKwlpZiAoKGludCkoaGVhZCAtIG9mZnNldCkgPCAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9vdXRwdXRfd2FrZXVwKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSkKK3sKKwlhdG9taWNfc2V0KCZoYW5kbGUtPnJiLT5wb2xsLCBQT0xMX0lOKTsKKworCWhhbmRsZS0+ZXZlbnQtPnBlbmRpbmdfd2FrZXVwID0gMTsKKwlpcnFfd29ya19xdWV1ZSgmaGFuZGxlLT5ldmVudC0+cGVuZGluZyk7Cit9CisKKy8qCisgKiBXZSBuZWVkIHRvIGVuc3VyZSBhIGxhdGVyIGV2ZW50X2lkIGRvZXNuJ3QgcHVibGlzaCBhIGhlYWQgd2hlbiBhIGZvcm1lcgorICogZXZlbnQgaXNuJ3QgZG9uZSB3cml0aW5nLiBIb3dldmVyIHNpbmNlIHdlIG5lZWQgdG8gZGVhbCB3aXRoIE5NSXMgd2UKKyAqIGNhbm5vdCBmdWxseSBzZXJpYWxpemUgdGhpbmdzLgorICoKKyAqIFdlIG9ubHkgcHVibGlzaCB0aGUgaGVhZCAoYW5kIGdlbmVyYXRlIGEgd2FrZXVwKSB3aGVuIHRoZSBvdXRlci1tb3N0CisgKiBldmVudCBjb21wbGV0ZXMuCisgKi8KK3N0YXRpYyB2b2lkIHBlcmZfb3V0cHV0X2dldF9oYW5kbGUoc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBoYW5kbGUtPnJiOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJbG9jYWxfaW5jKCZyYi0+bmVzdCk7CisJaGFuZGxlLT53YWtldXAgPSBsb2NhbF9yZWFkKCZyYi0+d2FrZXVwKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9vdXRwdXRfcHV0X2hhbmRsZShzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IGhhbmRsZS0+cmI7CisJdW5zaWduZWQgbG9uZyBoZWFkOworCithZ2FpbjoKKwloZWFkID0gbG9jYWxfcmVhZCgmcmItPmhlYWQpOworCisJLyoKKwkgKiBJUlEvTk1JIGNhbiBoYXBwZW4gaGVyZSwgd2hpY2ggbWVhbnMgd2UgY2FuIG1pc3MgYSBoZWFkIHVwZGF0ZS4KKwkgKi8KKworCWlmICghbG9jYWxfZGVjX2FuZF90ZXN0KCZyYi0+bmVzdCkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBQdWJsaXNoIHRoZSBrbm93biBnb29kIGhlYWQuIFJlbHkgb24gdGhlIGZ1bGwgYmFycmllciBpbXBsaWVkCisJICogYnkgYXRvbWljX2RlY19hbmRfdGVzdCgpIG9yZGVyIHRoZSByYi0+aGVhZCByZWFkIGFuZCB0aGlzCisJICogd3JpdGUuCisJICovCisJcmItPnVzZXJfcGFnZS0+ZGF0YV9oZWFkID0gaGVhZDsKKworCS8qCisJICogTm93IGNoZWNrIGlmIHdlIG1pc3NlZCBhbiB1cGRhdGUsIHJlbHkgb24gdGhlIChjb21waWxlcikKKwkgKiBiYXJyaWVyIGluIGF0b21pY19kZWNfYW5kX3Rlc3QoKSB0byByZS1yZWFkIHJiLT5oZWFkLgorCSAqLworCWlmICh1bmxpa2VseShoZWFkICE9IGxvY2FsX3JlYWQoJnJiLT5oZWFkKSkpIHsKKwkJbG9jYWxfaW5jKCZyYi0+bmVzdCk7CisJCWdvdG8gYWdhaW47CisJfQorCisJaWYgKGhhbmRsZS0+d2FrZXVwICE9IGxvY2FsX3JlYWQoJnJiLT53YWtldXApKQorCQlwZXJmX291dHB1dF93YWtldXAoaGFuZGxlKTsKKworb3V0OgorCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKK2ludCBwZXJmX291dHB1dF9iZWdpbihzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCisJCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IHJpbmdfYnVmZmVyICpyYjsKKwl1bnNpZ25lZCBsb25nIHRhaWwsIG9mZnNldCwgaGVhZDsKKwlpbnQgaGF2ZV9sb3N0OworCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhIHNhbXBsZV9kYXRhOworCXN0cnVjdCB7CisJCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJCXU2NAkJCSBpZDsKKwkJdTY0CQkJIGxvc3Q7CisJfSBsb3N0X2V2ZW50OworCisJcmN1X3JlYWRfbG9jaygpOworCS8qCisJICogRm9yIGluaGVyaXRlZCBldmVudHMgd2Ugc2VuZCBhbGwgdGhlIG91dHB1dCB0b3dhcmRzIHRoZSBwYXJlbnQuCisJICovCisJaWYgKGV2ZW50LT5wYXJlbnQpCisJCWV2ZW50ID0gZXZlbnQtPnBhcmVudDsKKworCXJiID0gcmN1X2RlcmVmZXJlbmNlKGV2ZW50LT5yYik7CisJaWYgKCFyYikKKwkJZ290byBvdXQ7CisKKwloYW5kbGUtPnJiCT0gcmI7CisJaGFuZGxlLT5ldmVudAk9IGV2ZW50OworCisJaWYgKCFyYi0+bnJfcGFnZXMpCisJCWdvdG8gb3V0OworCisJaGF2ZV9sb3N0ID0gbG9jYWxfcmVhZCgmcmItPmxvc3QpOworCWlmIChoYXZlX2xvc3QpIHsKKwkJbG9zdF9ldmVudC5oZWFkZXIuc2l6ZSA9IHNpemVvZihsb3N0X2V2ZW50KTsKKwkJcGVyZl9ldmVudF9oZWFkZXJfX2luaXRfaWQoJmxvc3RfZXZlbnQuaGVhZGVyLCAmc2FtcGxlX2RhdGEsCisJCQkJCSAgIGV2ZW50KTsKKwkJc2l6ZSArPSBsb3N0X2V2ZW50LmhlYWRlci5zaXplOworCX0KKworCXBlcmZfb3V0cHV0X2dldF9oYW5kbGUoaGFuZGxlKTsKKworCWRvIHsKKwkJLyoKKwkJICogVXNlcnNwYWNlIGNvdWxkIGNob29zZSB0byBpc3N1ZSBhIG1iKCkgYmVmb3JlIHVwZGF0aW5nIHRoZQorCQkgKiB0YWlsIHBvaW50ZXIuIFNvIHRoYXQgYWxsIHJlYWRzIHdpbGwgYmUgY29tcGxldGVkIGJlZm9yZSB0aGUKKwkJICogd3JpdGUgaXMgaXNzdWVkLgorCQkgKi8KKwkJdGFpbCA9IEFDQ0VTU19PTkNFKHJiLT51c2VyX3BhZ2UtPmRhdGFfdGFpbCk7CisJCXNtcF9ybWIoKTsKKwkJb2Zmc2V0ID0gaGVhZCA9IGxvY2FsX3JlYWQoJnJiLT5oZWFkKTsKKwkJaGVhZCArPSBzaXplOworCQlpZiAodW5saWtlbHkoIXBlcmZfb3V0cHV0X3NwYWNlKHJiLCB0YWlsLCBvZmZzZXQsIGhlYWQpKSkKKwkJCWdvdG8gZmFpbDsKKwl9IHdoaWxlIChsb2NhbF9jbXB4Y2hnKCZyYi0+aGVhZCwgb2Zmc2V0LCBoZWFkKSAhPSBvZmZzZXQpOworCisJaWYgKGhlYWQgLSBsb2NhbF9yZWFkKCZyYi0+d2FrZXVwKSA+IHJiLT53YXRlcm1hcmspCisJCWxvY2FsX2FkZChyYi0+d2F0ZXJtYXJrLCAmcmItPndha2V1cCk7CisKKwloYW5kbGUtPnBhZ2UgPSBvZmZzZXQgPj4gKFBBR0VfU0hJRlQgKyBwYWdlX29yZGVyKHJiKSk7CisJaGFuZGxlLT5wYWdlICY9IHJiLT5ucl9wYWdlcyAtIDE7CisJaGFuZGxlLT5zaXplID0gb2Zmc2V0ICYgKChQQUdFX1NJWkUgPDwgcGFnZV9vcmRlcihyYikpIC0gMSk7CisJaGFuZGxlLT5hZGRyID0gcmItPmRhdGFfcGFnZXNbaGFuZGxlLT5wYWdlXTsKKwloYW5kbGUtPmFkZHIgKz0gaGFuZGxlLT5zaXplOworCWhhbmRsZS0+c2l6ZSA9IChQQUdFX1NJWkUgPDwgcGFnZV9vcmRlcihyYikpIC0gaGFuZGxlLT5zaXplOworCisJaWYgKGhhdmVfbG9zdCkgeworCQlsb3N0X2V2ZW50LmhlYWRlci50eXBlID0gUEVSRl9SRUNPUkRfTE9TVDsKKwkJbG9zdF9ldmVudC5oZWFkZXIubWlzYyA9IDA7CisJCWxvc3RfZXZlbnQuaWQgICAgICAgICAgPSBldmVudC0+aWQ7CisJCWxvc3RfZXZlbnQubG9zdCAgICAgICAgPSBsb2NhbF94Y2hnKCZyYi0+bG9zdCwgMCk7CisKKwkJcGVyZl9vdXRwdXRfcHV0KGhhbmRsZSwgbG9zdF9ldmVudCk7CisJCXBlcmZfZXZlbnRfX291dHB1dF9pZF9zYW1wbGUoZXZlbnQsIGhhbmRsZSwgJnNhbXBsZV9kYXRhKTsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlsb2NhbF9pbmMoJnJiLT5sb3N0KTsKKwlwZXJmX291dHB1dF9wdXRfaGFuZGxlKGhhbmRsZSk7CitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gLUVOT1NQQzsKK30KKwordm9pZCBwZXJmX291dHB1dF9jb3B5KHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwKKwkJICAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCV9fb3V0cHV0X2NvcHkoaGFuZGxlLCBidWYsIGxlbik7Cit9CisKK3ZvaWQgcGVyZl9vdXRwdXRfZW5kKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSkKK3sKKwlwZXJmX291dHB1dF9wdXRfaGFuZGxlKGhhbmRsZSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB2b2lkCityaW5nX2J1ZmZlcl9pbml0KHN0cnVjdCByaW5nX2J1ZmZlciAqcmIsIGxvbmcgd2F0ZXJtYXJrLCBpbnQgZmxhZ3MpCit7CisJbG9uZyBtYXhfc2l6ZSA9IHBlcmZfZGF0YV9zaXplKHJiKTsKKworCWlmICh3YXRlcm1hcmspCisJCXJiLT53YXRlcm1hcmsgPSBtaW4obWF4X3NpemUsIHdhdGVybWFyayk7CisKKwlpZiAoIXJiLT53YXRlcm1hcmspCisJCXJiLT53YXRlcm1hcmsgPSBtYXhfc2l6ZSAvIDI7CisKKwlpZiAoZmxhZ3MgJiBSSU5HX0JVRkZFUl9XUklUQUJMRSkKKwkJcmItPndyaXRhYmxlID0gMTsKKworCWF0b21pY19zZXQoJnJiLT5yZWZjb3VudCwgMSk7Cit9CisKKyNpZm5kZWYgQ09ORklHX1BFUkZfVVNFX1ZNQUxMT0MKKworLyoKKyAqIEJhY2sgcGVyZl9tbWFwKCkgd2l0aCByZWd1bGFyIEdGUF9LRVJORUwtMCBwYWdlcy4KKyAqLworCitzdHJ1Y3QgcGFnZSAqCitwZXJmX21tYXBfdG9fcGFnZShzdHJ1Y3QgcmluZ19idWZmZXIgKnJiLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQoreworCWlmIChwZ29mZiA+IHJiLT5ucl9wYWdlcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocGdvZmYgPT0gMCkKKwkJcmV0dXJuIHZpcnRfdG9fcGFnZShyYi0+dXNlcl9wYWdlKTsKKworCXJldHVybiB2aXJ0X3RvX3BhZ2UocmItPmRhdGFfcGFnZXNbcGdvZmYgLSAxXSk7Cit9CisKK3N0YXRpYyB2b2lkICpwZXJmX21tYXBfYWxsb2NfcGFnZShpbnQgY3B1KQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBub2RlOworCisJbm9kZSA9IChjcHUgPT0gLTEpID8gY3B1IDogY3B1X3RvX25vZGUoY3B1KTsKKwlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgMCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7Cit9CisKK3N0cnVjdCByaW5nX2J1ZmZlciAqcmJfYWxsb2MoaW50IG5yX3BhZ2VzLCBsb25nIHdhdGVybWFyaywgaW50IGNwdSwgaW50IGZsYWdzKQoreworCXN0cnVjdCByaW5nX2J1ZmZlciAqcmI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBpOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmluZ19idWZmZXIpOworCXNpemUgKz0gbnJfcGFnZXMgKiBzaXplb2Yodm9pZCAqKTsKKworCXJiID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJiKQorCQlnb3RvIGZhaWw7CisKKwlyYi0+dXNlcl9wYWdlID0gcGVyZl9tbWFwX2FsbG9jX3BhZ2UoY3B1KTsKKwlpZiAoIXJiLT51c2VyX3BhZ2UpCisJCWdvdG8gZmFpbF91c2VyX3BhZ2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQlyYi0+ZGF0YV9wYWdlc1tpXSA9IHBlcmZfbW1hcF9hbGxvY19wYWdlKGNwdSk7CisJCWlmICghcmItPmRhdGFfcGFnZXNbaV0pCisJCQlnb3RvIGZhaWxfZGF0YV9wYWdlczsKKwl9CisKKwlyYi0+bnJfcGFnZXMgPSBucl9wYWdlczsKKworCXJpbmdfYnVmZmVyX2luaXQocmIsIHdhdGVybWFyaywgZmxhZ3MpOworCisJcmV0dXJuIHJiOworCitmYWlsX2RhdGFfcGFnZXM6CisJZm9yIChpLS07IGkgPj0gMDsgaS0tKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcmItPmRhdGFfcGFnZXNbaV0pOworCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXJiLT51c2VyX3BhZ2UpOworCitmYWlsX3VzZXJfcGFnZToKKwlrZnJlZShyYik7CisKK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfbW1hcF9mcmVlX3BhZ2UodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKCh2b2lkICopYWRkcik7CisKKwlwYWdlLT5tYXBwaW5nID0gTlVMTDsKKwlfX2ZyZWVfcGFnZShwYWdlKTsKK30KKwordm9pZCByYl9mcmVlKHN0cnVjdCByaW5nX2J1ZmZlciAqcmIpCit7CisJaW50IGk7CisKKwlwZXJmX21tYXBfZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXJiLT51c2VyX3BhZ2UpOworCWZvciAoaSA9IDA7IGkgPCByYi0+bnJfcGFnZXM7IGkrKykKKwkJcGVyZl9tbWFwX2ZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylyYi0+ZGF0YV9wYWdlc1tpXSk7CisJa2ZyZWUocmIpOworfQorCisjZWxzZQorCitzdHJ1Y3QgcGFnZSAqCitwZXJmX21tYXBfdG9fcGFnZShzdHJ1Y3QgcmluZ19idWZmZXIgKnJiLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQoreworCWlmIChwZ29mZiA+ICgxVUwgPDwgcGFnZV9vcmRlcihyYikpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiB2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilyYi0+dXNlcl9wYWdlICsgcGdvZmYgKiBQQUdFX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX21tYXBfdW5tYXJrX3BhZ2Uodm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZtYWxsb2NfdG9fcGFnZShhZGRyKTsKKworCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCByYl9mcmVlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByaW5nX2J1ZmZlciAqcmI7CisJdm9pZCAqYmFzZTsKKwlpbnQgaSwgbnI7CisKKwlyYiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcmluZ19idWZmZXIsIHdvcmspOworCW5yID0gMSA8PCBwYWdlX29yZGVyKHJiKTsKKworCWJhc2UgPSByYi0+dXNlcl9wYWdlOworCWZvciAoaSA9IDA7IGkgPCBuciArIDE7IGkrKykKKwkJcGVyZl9tbWFwX3VubWFya19wYWdlKGJhc2UgKyAoaSAqIFBBR0VfU0laRSkpOworCisJdmZyZWUoYmFzZSk7CisJa2ZyZWUocmIpOworfQorCit2b2lkIHJiX2ZyZWUoc3RydWN0IHJpbmdfYnVmZmVyICpyYikKK3sKKwlzY2hlZHVsZV93b3JrKCZyYi0+d29yayk7Cit9CisKK3N0cnVjdCByaW5nX2J1ZmZlciAqcmJfYWxsb2MoaW50IG5yX3BhZ2VzLCBsb25nIHdhdGVybWFyaywgaW50IGNwdSwgaW50IGZsYWdzKQoreworCXN0cnVjdCByaW5nX2J1ZmZlciAqcmI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXZvaWQgKmFsbF9idWY7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCByaW5nX2J1ZmZlcik7CisJc2l6ZSArPSBzaXplb2Yodm9pZCAqKTsKKworCXJiID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJiKQorCQlnb3RvIGZhaWw7CisKKwlJTklUX1dPUksoJnJiLT53b3JrLCByYl9mcmVlX3dvcmspOworCisJYWxsX2J1ZiA9IHZtYWxsb2NfdXNlcigobnJfcGFnZXMgKyAxKSAqIFBBR0VfU0laRSk7CisJaWYgKCFhbGxfYnVmKQorCQlnb3RvIGZhaWxfYWxsX2J1ZjsKKworCXJiLT51c2VyX3BhZ2UgPSBhbGxfYnVmOworCXJiLT5kYXRhX3BhZ2VzWzBdID0gYWxsX2J1ZiArIFBBR0VfU0laRTsKKwlyYi0+cGFnZV9vcmRlciA9IGlsb2cyKG5yX3BhZ2VzKTsKKwlyYi0+bnJfcGFnZXMgPSAxOworCisJcmluZ19idWZmZXJfaW5pdChyYiwgd2F0ZXJtYXJrLCBmbGFncyk7CisKKwlyZXR1cm4gcmI7CisKK2ZhaWxfYWxsX2J1ZjoKKwlrZnJlZShyYik7CisKK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggMjBhNDA2NC4uOWVlNThiYiAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC04NSw3ICs4NSw2IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnVuaW5pdGlhbGl6ZWRfdmFyKHR0eSk7CiAKIAlzaWdoYW5kID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHRzay0+c2lnaGFuZCwKLQkJCQkJcmN1X3JlYWRfbG9ja19oZWxkKCkgfHwKIAkJCQkJbG9ja2RlcF90YXNrbGlzdF9sb2NrX2lzX2hlbGQoKSk7CiAJc3Bpbl9sb2NrKCZzaWdoYW5kLT5zaWdsb2NrKTsKIApAQCAtMTY5LDcgKzE2OCw2IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICpsZWFkZXI7CiAJaW50IHphcF9sZWFkZXI7CiByZXBlYXQ6Ci0JdHJhY2Vob29rX3ByZXBhcmVfcmVsZWFzZV90YXNrKHApOwogCS8qIGRvbid0IG5lZWQgdG8gZ2V0IHRoZSBSQ1UgcmVhZGxvY2sgaGVyZSAtIHRoZSBwcm9jZXNzIGlzIGRlYWQgYW5kCiAJICogY2FuJ3QgYmUgbW9kaWZ5aW5nIGl0cyBvd24gY3JlZGVudGlhbHMuIEJ1dCBzaHV0IFJDVS1sb2NrZGVwIHVwICovCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMTc5LDcgKzE3Nyw3IEBACiAJcHJvY19mbHVzaF90YXNrKHApOwogCiAJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwotCXRyYWNlaG9va19maW5pc2hfcmVsZWFzZV90YXNrKHApOworCXB0cmFjZV9yZWxlYXNlX3Rhc2socCk7CiAJX19leGl0X3NpZ25hbChwKTsKIAogCS8qCkBAIC0xOTAsMjIgKzE4OCwxMiBAQAogCXphcF9sZWFkZXIgPSAwOwogCWxlYWRlciA9IHAtPmdyb3VwX2xlYWRlcjsKIAlpZiAobGVhZGVyICE9IHAgJiYgdGhyZWFkX2dyb3VwX2VtcHR5KGxlYWRlcikgJiYgbGVhZGVyLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKSB7Ci0JCUJVR19PTih0YXNrX2RldGFjaGVkKGxlYWRlcikpOwotCQlkb19ub3RpZnlfcGFyZW50KGxlYWRlciwgbGVhZGVyLT5leGl0X3NpZ25hbCk7CiAJCS8qCiAJCSAqIElmIHdlIHdlcmUgdGhlIGxhc3QgY2hpbGQgdGhyZWFkIGFuZCB0aGUgbGVhZGVyIGhhcwogCQkgKiBleGl0ZWQgYWxyZWFkeSwgYW5kIHRoZSBsZWFkZXIncyBwYXJlbnQgaWdub3JlcyBTSUdDSExELAogCQkgKiB0aGVuIHdlIGFyZSB0aGUgb25lIHdobyBzaG91bGQgcmVsZWFzZSB0aGUgbGVhZGVyLgotCQkgKgotCQkgKiBkb19ub3RpZnlfcGFyZW50KCkgd2lsbCBoYXZlIG1hcmtlZCBpdCBzZWxmLXJlYXBpbmcgaW4KLQkJICogdGhhdCBjYXNlLgogCQkgKi8KLQkJemFwX2xlYWRlciA9IHRhc2tfZGV0YWNoZWQobGVhZGVyKTsKLQotCQkvKgotCQkgKiBUaGlzIG1haW50YWlucyB0aGUgaW52YXJpYW50IHRoYXQgcmVsZWFzZV90YXNrKCkKLQkJICogb25seSBydW5zIG9uIGEgdGFzayBpbiBFWElUX0RFQUQsIGp1c3QgZm9yIHNhbml0eS4KLQkJICovCisJCXphcF9sZWFkZXIgPSBkb19ub3RpZnlfcGFyZW50KGxlYWRlciwgbGVhZGVyLT5leGl0X3NpZ25hbCk7CiAJCWlmICh6YXBfbGVhZGVyKQogCQkJbGVhZGVyLT5leGl0X3N0YXRlID0gRVhJVF9ERUFEOwogCX0KQEAgLTI3NywxOCArMjY1LDE2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBoYXNfc3RvcHBlZF9qb2JzKHN0cnVjdCBwaWQgKnBncnApCitzdGF0aWMgYm9vbCBoYXNfc3RvcHBlZF9qb2JzKHN0cnVjdCBwaWQgKnBncnApCiB7Ci0JaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCiAJZG9fZWFjaF9waWRfdGFzayhwZ3JwLCBQSURUWVBFX1BHSUQsIHApIHsKLQkJaWYgKCF0YXNrX2lzX3N0b3BwZWQocCkpCi0JCQljb250aW51ZTsKLQkJcmV0dmFsID0gMTsKLQkJYnJlYWs7CisJCWlmIChwLT5zaWduYWwtPmZsYWdzICYgU0lHTkFMX1NUT1BfU1RPUFBFRCkKKwkJCXJldHVybiB0cnVlOwogCX0gd2hpbGVfZWFjaF9waWRfdGFzayhwZ3JwLCBQSURUWVBFX1BHSUQsIHApOwotCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qCkBAIC01NjEsMjkgKzU0NywyOCBAQAogCiAjaWZkZWYgQ09ORklHX01NX09XTkVSCiAvKgotICogVGFzayBwIGlzIGV4aXRpbmcgYW5kIGl0IG93bmVkIG1tLCBsZXRzIGZpbmQgYSBuZXcgb3duZXIgZm9yIGl0CisgKiBBIHRhc2sgaXMgZXhpdGluZy4gICBJZiBpdCBvd25lZCB0aGlzIG1tLCBmaW5kIGEgbmV3IG93bmVyIGZvciB0aGUgbW0uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1tbV9uZWVkX25ld19vd25lcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCS8qCi0JICogSWYgdGhlcmUgYXJlIG90aGVyIHVzZXJzIG9mIHRoZSBtbSBhbmQgdGhlIG93bmVyICh1cykgaXMgZXhpdGluZwotCSAqIHdlIG5lZWQgdG8gZmluZCBhIG5ldyBvd25lciB0byB0YWtlIG9uIHRoZSByZXNwb25zaWJpbGl0eS4KLQkgKi8KLQlpZiAoYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgPD0gMSkKLQkJcmV0dXJuIDA7Ci0JaWYgKG1tLT5vd25lciAhPSBwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQogdm9pZCBtbV91cGRhdGVfbmV4dF9vd25lcihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmMsICpnLCAqcCA9IGN1cnJlbnQ7CiAKIHJldHJ5OgotCWlmICghbW1fbmVlZF9uZXdfb3duZXIobW0sIHApKQorCS8qCisJICogSWYgdGhlIGV4aXRpbmcgb3IgZXhlY2luZyB0YXNrIGlzIG5vdCB0aGUgb3duZXIsIGl0J3MKKwkgKiBzb21lb25lIGVsc2UncyBwcm9ibGVtLgorCSAqLworCWlmIChtbS0+b3duZXIgIT0gcCkKIAkJcmV0dXJuOworCS8qCisJICogVGhlIGN1cnJlbnQgb3duZXIgaXMgZXhpdGluZy9leGVjaW5nIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIKKwkgKiBjYW5kaWRhdGVzLiAgRG8gbm90IGxlYXZlIHRoZSBtbSBwb2ludGluZyB0byBhIHBvc3NpYmx5CisJICogZnJlZWQgdGFzayBzdHJ1Y3R1cmUuCisJICovCisJaWYgKGF0b21pY19yZWFkKCZtbS0+bW1fdXNlcnMpIDw9IDEpIHsKKwkJbW0tPm93bmVyID0gTlVMTDsKKwkJcmV0dXJuOworCX0KIAogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJLyoKQEAgLTc1Miw3ICs3MzcsNyBAQAogewogCWxpc3RfbW92ZV90YWlsKCZwLT5zaWJsaW5nLCAmcC0+cmVhbF9wYXJlbnQtPmNoaWxkcmVuKTsKIAotCWlmICh0YXNrX2RldGFjaGVkKHApKQorCWlmIChwLT5leGl0X3N0YXRlID09IEVYSVRfREVBRCkKIAkJcmV0dXJuOwogCS8qCiAJICogSWYgdGhpcyBpcyBhIHRocmVhZGVkIHJlcGFyZW50IHRoZXJlIGlzIG5vIG5lZWQgdG8KQEAgLTc2NSwxMCArNzUwLDkgQEAKIAlwLT5leGl0X3NpZ25hbCA9IFNJR0NITEQ7CiAKIAkvKiBJZiBpdCBoYXMgZXhpdGVkIG5vdGlmeSB0aGUgbmV3IHBhcmVudCBhYm91dCB0aGlzIGNoaWxkJ3MgZGVhdGguICovCi0JaWYgKCF0YXNrX3B0cmFjZShwKSAmJgorCWlmICghcC0+cHRyYWNlICYmCiAJICAgIHAtPmV4aXRfc3RhdGUgPT0gRVhJVF9aT01CSUUgJiYgdGhyZWFkX2dyb3VwX2VtcHR5KHApKSB7Ci0JCWRvX25vdGlmeV9wYXJlbnQocCwgcC0+ZXhpdF9zaWduYWwpOwotCQlpZiAodGFza19kZXRhY2hlZChwKSkgeworCQlpZiAoZG9fbm90aWZ5X3BhcmVudChwLCBwLT5leGl0X3NpZ25hbCkpIHsKIAkJCXAtPmV4aXRfc3RhdGUgPSBFWElUX0RFQUQ7CiAJCQlsaXN0X21vdmVfdGFpbCgmcC0+c2libGluZywgZGVhZCk7CiAJCX0KQEAgLTc5NSw3ICs3NzksNyBAQAogCQlkbyB7CiAJCQl0LT5yZWFsX3BhcmVudCA9IHJlYXBlcjsKIAkJCWlmICh0LT5wYXJlbnQgPT0gZmF0aGVyKSB7Ci0JCQkJQlVHX09OKHRhc2tfcHRyYWNlKHQpKTsKKwkJCQlCVUdfT04odC0+cHRyYWNlKTsKIAkJCQl0LT5wYXJlbnQgPSB0LT5yZWFsX3BhcmVudDsKIAkJCX0KIAkJCWlmICh0LT5wZGVhdGhfc2lnbmFsKQpAQCAtODIwLDggKzgwNCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGV4aXRfbm90aWZ5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgZ3JvdXBfZGVhZCkKIHsKLQlpbnQgc2lnbmFsOwotCXZvaWQgKmNvb2tpZTsKKwlib29sIGF1dG9yZWFwOwogCiAJLyoKIAkgKiBUaGlzIGRvZXMgdHdvIHRoaW5nczoKQEAgLTg1MiwyNiArODM1LDMzIEBACiAJICogd2UgaGF2ZSBjaGFuZ2VkIGV4ZWN1dGlvbiBkb21haW4gYXMgdGhlc2UgdHdvIHZhbHVlcyBzdGFydGVkCiAJICogdGhlIHNhbWUgYWZ0ZXIgYSBmb3JrLgogCSAqLwotCWlmICh0c2stPmV4aXRfc2lnbmFsICE9IFNJR0NITEQgJiYgIXRhc2tfZGV0YWNoZWQodHNrKSAmJgorCWlmICh0aHJlYWRfZ3JvdXBfbGVhZGVyKHRzaykgJiYgdHNrLT5leGl0X3NpZ25hbCAhPSBTSUdDSExEICYmCiAJICAgICh0c2stPnBhcmVudF9leGVjX2lkICE9IHRzay0+cmVhbF9wYXJlbnQtPnNlbGZfZXhlY19pZCB8fAogCSAgICAgdHNrLT5zZWxmX2V4ZWNfaWQgIT0gdHNrLT5wYXJlbnRfZXhlY19pZCkpCiAJCXRzay0+ZXhpdF9zaWduYWwgPSBTSUdDSExEOwogCi0Jc2lnbmFsID0gdHJhY2Vob29rX25vdGlmeV9kZWF0aCh0c2ssICZjb29raWUsIGdyb3VwX2RlYWQpOwotCWlmIChzaWduYWwgPj0gMCkKLQkJc2lnbmFsID0gZG9fbm90aWZ5X3BhcmVudCh0c2ssIHNpZ25hbCk7CisJaWYgKHVubGlrZWx5KHRzay0+cHRyYWNlKSkgeworCQlpbnQgc2lnID0gdGhyZWFkX2dyb3VwX2xlYWRlcih0c2spICYmCisJCQkJdGhyZWFkX2dyb3VwX2VtcHR5KHRzaykgJiYKKwkJCQkhcHRyYWNlX3JlcGFyZW50ZWQodHNrKSA/CisJCQl0c2stPmV4aXRfc2lnbmFsIDogU0lHQ0hMRDsKKwkJYXV0b3JlYXAgPSBkb19ub3RpZnlfcGFyZW50KHRzaywgc2lnKTsKKwl9IGVsc2UgaWYgKHRocmVhZF9ncm91cF9sZWFkZXIodHNrKSkgeworCQlhdXRvcmVhcCA9IHRocmVhZF9ncm91cF9lbXB0eSh0c2spICYmCisJCQlkb19ub3RpZnlfcGFyZW50KHRzaywgdHNrLT5leGl0X3NpZ25hbCk7CisJfSBlbHNlIHsKKwkJYXV0b3JlYXAgPSB0cnVlOworCX0KIAotCXRzay0+ZXhpdF9zdGF0ZSA9IHNpZ25hbCA9PSBERUFUSF9SRUFQID8gRVhJVF9ERUFEIDogRVhJVF9aT01CSUU7CisJdHNrLT5leGl0X3N0YXRlID0gYXV0b3JlYXAgPyBFWElUX0RFQUQgOiBFWElUX1pPTUJJRTsKIAogCS8qIG10LWV4ZWMsIGRlX3RocmVhZCgpIGlzIHdhaXRpbmcgZm9yIGdyb3VwIGxlYWRlciAqLwogCWlmICh1bmxpa2VseSh0c2stPnNpZ25hbC0+bm90aWZ5X2NvdW50IDwgMCkpCiAJCXdha2VfdXBfcHJvY2Vzcyh0c2stPnNpZ25hbC0+Z3JvdXBfZXhpdF90YXNrKTsKIAl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKIAotCXRyYWNlaG9va19yZXBvcnRfZGVhdGgodHNrLCBzaWduYWwsIGNvb2tpZSwgZ3JvdXBfZGVhZCk7Ci0KIAkvKiBJZiB0aGUgcHJvY2VzcyBpcyBkZWFkLCByZWxlYXNlIGl0IC0gbm9ib2R5IHdpbGwgd2FpdCBmb3IgaXQgKi8KLQlpZiAoc2lnbmFsID09IERFQVRIX1JFQVApCisJaWYgKGF1dG9yZWFwKQogCQlyZWxlYXNlX3Rhc2sodHNrKTsKIH0KIApAQCAtOTA3LDcgKzg5Nyw2IEBACiAKIAlwcm9maWxlX3Rhc2tfZXhpdCh0c2spOwogCi0JV0FSTl9PTihhdG9taWNfcmVhZCgmdHNrLT5mc19leGNsKSk7CiAJV0FSTl9PTihibGtfbmVlZHNfZmx1c2hfcGx1Zyh0c2spKTsKIAogCWlmICh1bmxpa2VseShpbl9pbnRlcnJ1cHQoKSkpCkBAIC05MjQsNyArOTEzLDcgQEAKIAkgKi8KIAlzZXRfZnMoVVNFUl9EUyk7CiAKLQl0cmFjZWhvb2tfcmVwb3J0X2V4aXQoJmNvZGUpOworCXB0cmFjZV9ldmVudChQVFJBQ0VfRVZFTlRfRVhJVCwgY29kZSk7CiAKIAl2YWxpZGF0ZV9jcmVkc19mb3JfZG9fZXhpdCh0c2spOwogCkBAIC0xMjM2LDkgKzEyMjUsOSBAQAogCXRyYWNlZCA9IHB0cmFjZV9yZXBhcmVudGVkKHApOwogCS8qCiAJICogSXQgY2FuIGJlIHB0cmFjZWQgYnV0IG5vdCByZXBhcmVudGVkLCBjaGVjawotCSAqICF0YXNrX2RldGFjaGVkKCkgdG8gZmlsdGVyIG91dCBzdWItdGhyZWFkcy4KKwkgKiB0aHJlYWRfZ3JvdXBfbGVhZGVyKCkgdG8gZmlsdGVyIG91dCBzdWItdGhyZWFkcy4KIAkgKi8KLQlpZiAobGlrZWx5KCF0cmFjZWQpICYmIGxpa2VseSghdGFza19kZXRhY2hlZChwKSkpIHsKKwlpZiAobGlrZWx5KCF0cmFjZWQpICYmIHRocmVhZF9ncm91cF9sZWFkZXIocCkpIHsKIAkJc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnBzaWc7CiAJCXN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWc7CiAJCXVuc2lnbmVkIGxvbmcgbWF4cnNzOwpAQCAtMTM0NiwxNiArMTMzNSwxMyBAQAogCQkvKiBXZSBkcm9wcGVkIHRhc2tsaXN0LCBwdHJhY2VyIGNvdWxkIGRpZSBhbmQgdW50cmFjZSAqLwogCQlwdHJhY2VfdW5saW5rKHApOwogCQkvKgotCQkgKiBJZiB0aGlzIGlzIG5vdCBhIGRldGFjaGVkIHRhc2ssIG5vdGlmeSB0aGUgcGFyZW50LgotCQkgKiBJZiBpdCdzIHN0aWxsIG5vdCBkZXRhY2hlZCBhZnRlciB0aGF0LCBkb24ndCByZWxlYXNlCi0JCSAqIGl0IG5vdy4KKwkJICogSWYgdGhpcyBpcyBub3QgYSBzdWItdGhyZWFkLCBub3RpZnkgdGhlIHBhcmVudC4KKwkJICogSWYgcGFyZW50IHdhbnRzIGEgem9tYmllLCBkb24ndCByZWxlYXNlIGl0IG5vdy4KIAkJICovCi0JCWlmICghdGFza19kZXRhY2hlZChwKSkgewotCQkJZG9fbm90aWZ5X3BhcmVudChwLCBwLT5leGl0X3NpZ25hbCk7Ci0JCQlpZiAoIXRhc2tfZGV0YWNoZWQocCkpIHsKLQkJCQlwLT5leGl0X3N0YXRlID0gRVhJVF9aT01CSUU7Ci0JCQkJcCA9IE5VTEw7Ci0JCQl9CisJCWlmICh0aHJlYWRfZ3JvdXBfbGVhZGVyKHApICYmCisJCSAgICAhZG9fbm90aWZ5X3BhcmVudChwLCBwLT5leGl0X3NpZ25hbCkpIHsKKwkJCXAtPmV4aXRfc3RhdGUgPSBFWElUX1pPTUJJRTsKKwkJCXAgPSBOVUxMOwogCQl9CiAJCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCX0KQEAgLTEzNjgsNyArMTM1NCw4IEBACiBzdGF0aWMgaW50ICp0YXNrX3N0b3BwZWRfY29kZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGJvb2wgcHRyYWNlKQogewogCWlmIChwdHJhY2UpIHsKLQkJaWYgKHRhc2tfaXNfc3RvcHBlZF9vcl90cmFjZWQocCkpCisJCWlmICh0YXNrX2lzX3N0b3BwZWRfb3JfdHJhY2VkKHApICYmCisJCSAgICAhKHAtPmpvYmN0bCAmIEpPQkNUTF9MSVNURU5JTkcpKQogCQkJcmV0dXJuICZwLT5leGl0X2NvZGU7CiAJfSBlbHNlIHsKIAkJaWYgKHAtPnNpZ25hbC0+ZmxhZ3MgJiBTSUdOQUxfU1RPUF9TVE9QUEVEKQpAQCAtMTU2NCw3ICsxNTUxLDcgQEAKIAkJICogTm90aWZpY2F0aW9uIGFuZCByZWFwaW5nIHdpbGwgYmUgY2FzY2FkZWQgdG8gdGhlIHJlYWwKIAkJICogcGFyZW50IHdoZW4gdGhlIHB0cmFjZXIgZGV0YWNoZXMuCiAJCSAqLwotCQlpZiAobGlrZWx5KCFwdHJhY2UpICYmIHVubGlrZWx5KHRhc2tfcHRyYWNlKHApKSkgeworCQlpZiAobGlrZWx5KCFwdHJhY2UpICYmIHVubGlrZWx5KHAtPnB0cmFjZSkpIHsKIAkJCS8qIGl0IHdpbGwgYmVjb21lIHZpc2libGUsIGNsZWFyIG5vdGFza19lcnJvciAqLwogCQkJd28tPm5vdGFza19lcnJvciA9IDA7CiAJCQlyZXR1cm4gMDsKQEAgLTE2MDcsOCArMTU5NCw3IEBACiAJCSAqIG93biBjaGlsZHJlbiwgaXQgc2hvdWxkIGNyZWF0ZSBhIHNlcGFyYXRlIHByb2Nlc3Mgd2hpY2gKIAkJICogdGFrZXMgdGhlIHJvbGUgb2YgcmVhbCBwYXJlbnQuCiAJCSAqLwotCQlpZiAobGlrZWx5KCFwdHJhY2UpICYmIHRhc2tfcHRyYWNlKHApICYmCi0JCSAgICBzYW1lX3RocmVhZF9ncm91cChwLT5wYXJlbnQsIHAtPnJlYWxfcGFyZW50KSkKKwkJaWYgKGxpa2VseSghcHRyYWNlKSAmJiBwLT5wdHJhY2UgJiYgIXB0cmFjZV9yZXBhcmVudGVkKHApKQogCQkJcmV0dXJuIDA7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IDAyNzZjMzAuLjE3YmY3YzggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKKysrIGIva2VybmVsL2ZvcmsuYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KQEAgLTI5MSw3ICsyOTAsNiBAQAogCiAJLyogT25lIGZvciB1cywgb25lIGZvciB3aG9ldmVyIGRvZXMgdGhlICJyZWxlYXNlX3Rhc2soKSIgKHVzdWFsbHkgcGFyZW50KSAqLwogCWF0b21pY19zZXQoJnRzay0+dXNhZ2UsMik7Ci0JYXRvbWljX3NldCgmdHNrLT5mc19leGNsLCAwKTsKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JT19UUkFDRQogCXRzay0+YnRyYWNlX3NlcSA9IDA7CiAjZW5kaWYKQEAgLTEwMTMsNyArMTAxMSw3IEBACiB7CiAJcmF3X3NwaW5fbG9ja19pbml0KCZwLT5waV9sb2NrKTsKICNpZmRlZiBDT05GSUdfUlRfTVVURVhFUwotCXBsaXN0X2hlYWRfaW5pdF9yYXcoJnAtPnBpX3dhaXRlcnMsICZwLT5waV9sb2NrKTsKKwlwbGlzdF9oZWFkX2luaXQoJnAtPnBpX3dhaXRlcnMpOwogCXAtPnBpX2Jsb2NrZWRfb24gPSBOVUxMOwogI2VuZGlmCiB9CkBAIC0xMzQwLDcgKzEzMzgsNyBAQAogCX0KIAogCWlmIChsaWtlbHkocC0+cGlkKSkgewotCQl0cmFjZWhvb2tfZmluaXNoX2Nsb25lKHAsIGNsb25lX2ZsYWdzLCB0cmFjZSk7CisJCXB0cmFjZV9pbml0X3Rhc2socCwgKGNsb25lX2ZsYWdzICYgQ0xPTkVfUFRSQUNFKSB8fCB0cmFjZSk7CiAKIAkJaWYgKHRocmVhZF9ncm91cF9sZWFkZXIocCkpIHsKIAkJCWlmIChpc19jaGlsZF9yZWFwZXIocGlkKSkKQEAgLTE0ODEsMTAgKzE0NzksMjIgQEAKIAl9CiAKIAkvKgotCSAqIFdoZW4gY2FsbGVkIGZyb20ga2VybmVsX3RocmVhZCwgZG9uJ3QgZG8gdXNlciB0cmFjaW5nIHN0dWZmLgorCSAqIERldGVybWluZSB3aGV0aGVyIGFuZCB3aGljaCBldmVudCB0byByZXBvcnQgdG8gcHRyYWNlci4gIFdoZW4KKwkgKiBjYWxsZWQgZnJvbSBrZXJuZWxfdGhyZWFkIG9yIENMT05FX1VOVFJBQ0VEIGlzIGV4cGxpY2l0bHkKKwkgKiByZXF1ZXN0ZWQsIG5vIGV2ZW50IGlzIHJlcG9ydGVkOyBvdGhlcndpc2UsIHJlcG9ydCBpZiB0aGUgZXZlbnQKKwkgKiBmb3IgdGhlIHR5cGUgb2YgZm9ya2luZyBpcyBlbmFibGVkLgogCSAqLwotCWlmIChsaWtlbHkodXNlcl9tb2RlKHJlZ3MpKSkKLQkJdHJhY2UgPSB0cmFjZWhvb2tfcHJlcGFyZV9jbG9uZShjbG9uZV9mbGFncyk7CisJaWYgKGxpa2VseSh1c2VyX21vZGUocmVncykpICYmICEoY2xvbmVfZmxhZ3MgJiBDTE9ORV9VTlRSQUNFRCkpIHsKKwkJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfVkZPUkspCisJCQl0cmFjZSA9IFBUUkFDRV9FVkVOVF9WRk9SSzsKKwkJZWxzZSBpZiAoKGNsb25lX2ZsYWdzICYgQ1NJR05BTCkgIT0gU0lHQ0hMRCkKKwkJCXRyYWNlID0gUFRSQUNFX0VWRU5UX0NMT05FOworCQllbHNlCisJCQl0cmFjZSA9IFBUUkFDRV9FVkVOVF9GT1JLOworCisJCWlmIChsaWtlbHkoIXB0cmFjZV9ldmVudF9lbmFibGVkKGN1cnJlbnQsIHRyYWNlKSkpCisJCQl0cmFjZSA9IDA7CisJfQogCiAJcCA9IGNvcHlfcHJvY2VzcyhjbG9uZV9mbGFncywgc3RhY2tfc3RhcnQsIHJlZ3MsIHN0YWNrX3NpemUsCiAJCQkgY2hpbGRfdGlkcHRyLCBOVUxMLCB0cmFjZSk7CkBAIC0xNTA4LDI2ICsxNTE4LDI2IEBACiAJCX0KIAogCQlhdWRpdF9maW5pc2hfZm9yayhwKTsKLQkJdHJhY2Vob29rX3JlcG9ydF9jbG9uZShyZWdzLCBjbG9uZV9mbGFncywgbnIsIHApOwogCiAJCS8qCiAJCSAqIFdlIHNldCBQRl9TVEFSVElORyBhdCBjcmVhdGlvbiBpbiBjYXNlIHRyYWNpbmcgd2FudHMgdG8KIAkJICogdXNlIHRoaXMgdG8gZGlzdGluZ3Vpc2ggYSBmdWxseSBsaXZlIHRhc2sgZnJvbSBvbmUgdGhhdAotCQkgKiBoYXNuJ3QgZ290dGVuIHRvIHRyYWNlaG9va19yZXBvcnRfY2xvbmUoKSB5ZXQuICBOb3cgd2UKLQkJICogY2xlYXIgaXQgYW5kIHNldCB0aGUgY2hpbGQgZ29pbmcuCisJCSAqIGhhc24ndCBmaW5pc2hlZCBTSUdTVE9QIHJhaXNpbmcgeWV0LiAgTm93IHdlIGNsZWFyIGl0CisJCSAqIGFuZCBzZXQgdGhlIGNoaWxkIGdvaW5nLgogCQkgKi8KIAkJcC0+ZmxhZ3MgJj0gflBGX1NUQVJUSU5HOwogCiAJCXdha2VfdXBfbmV3X3Rhc2socCk7CiAKLQkJdHJhY2Vob29rX3JlcG9ydF9jbG9uZV9jb21wbGV0ZSh0cmFjZSwgcmVncywKLQkJCQkJCWNsb25lX2ZsYWdzLCBuciwgcCk7CisJCS8qIGZvcmtpbmcgY29tcGxldGUgYW5kIGNoaWxkIHN0YXJ0ZWQgdG8gcnVuLCB0ZWxsIHB0cmFjZXIgKi8KKwkJaWYgKHVubGlrZWx5KHRyYWNlKSkKKwkJCXB0cmFjZV9ldmVudCh0cmFjZSwgbnIpOwogCiAJCWlmIChjbG9uZV9mbGFncyAmIENMT05FX1ZGT1JLKSB7CiAJCQlmcmVlemVyX2RvX25vdF9jb3VudCgpOwogCQkJd2FpdF9mb3JfY29tcGxldGlvbigmdmZvcmspOwogCQkJZnJlZXplcl9jb3VudCgpOwotCQkJdHJhY2Vob29rX3JlcG9ydF92Zm9ya19kb25lKHAsIG5yKTsKKwkJCXB0cmFjZV9ldmVudChQVFJBQ0VfRVZFTlRfVkZPUktfRE9ORSwgbnIpOwogCQl9CiAJfSBlbHNlIHsKIAkJbnIgPSBQVFJfRVJSKHApOwpAQCAtMTU3NCw2ICsxNTg0LDcgQEAKIAkJCVNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1BBTklDfFNMQUJfTk9UUkFDSywgTlVMTCk7CiAJdm1fYXJlYV9jYWNoZXAgPSBLTUVNX0NBQ0hFKHZtX2FyZWFfc3RydWN0LCBTTEFCX1BBTklDKTsKIAltbWFwX2luaXQoKTsKKwluc3Byb3h5X2NhY2hlX2luaXQoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggZmUyOGRjMi4uMGEzMDg5NyAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTM1NSw4ICszNTUsOCBAQAogCWludCByZXQ7CiAKIAlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgbW0sICh1bnNpZ25lZCBsb25nKXVhZGRyLAotCQkJICAgICAxLCAxLCAwLCBOVUxMLCBOVUxMKTsKKwlyZXQgPSBmaXh1cF91c2VyX2ZhdWx0KGN1cnJlbnQsIG1tLCAodW5zaWduZWQgbG9uZyl1YWRkciwKKwkJCSAgICAgICBGQVVMVF9GTEFHX1dSSVRFKTsKIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCiAJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOwpAQCAtMjY5Nyw3ICsyNjk3LDcgQEAKIAkJZnV0ZXhfY21weGNoZ19lbmFibGVkID0gMTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZ1dGV4X3F1ZXVlcyk7IGkrKykgewotCQlwbGlzdF9oZWFkX2luaXQoJmZ1dGV4X3F1ZXVlc1tpXS5jaGFpbiwgJmZ1dGV4X3F1ZXVlc1tpXS5sb2NrKTsKKwkJcGxpc3RfaGVhZF9pbml0KCZmdXRleF9xdWV1ZXNbaV0uY2hhaW4pOwogCQlzcGluX2xvY2tfaW5pdCgmZnV0ZXhfcXVldWVzW2ldLmxvY2spOwogCX0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2djb3YvS2NvbmZpZyBiL2tlcm5lbC9nY292L0tjb25maWcKaW5kZXggYjhjYWRmNy4uNWJmOTI0ZCAxMDA2NDQKLS0tIGEva2VybmVsL2djb3YvS2NvbmZpZworKysgYi9rZXJuZWwvZ2Nvdi9LY29uZmlnCkBAIC0yLDcgKzIsOCBAQAogCiBjb25maWcgR0NPVl9LRVJORUwKIAlib29sICJFbmFibGUgZ2Nvdi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nIgotCWRlcGVuZHMgb24gREVCVUdfRlMgJiYgQ09OU1RSVUNUT1JTCisJZGVwZW5kcyBvbiBERUJVR19GUworCXNlbGVjdCBDT05TVFJVQ1RPUlMKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJVGhpcyBvcHRpb24gZW5hYmxlcyBnY292LWJhc2VkIGNvZGUgcHJvZmlsaW5nIChlLmcuIGZvciBjb2RlIGNvdmVyYWdlCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2RldnJlcy5jIGIva2VybmVsL2lycS9kZXZyZXMuYwppbmRleCAxZWY0ZmZjLi5iZDhlNzg4IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2RldnJlcy5jCisrKyBiL2tlcm5lbC9pcnEvZGV2cmVzLmMKQEAgLTg3LDggKzg3LDggQEAKIHsKIAlzdHJ1Y3QgaXJxX2RldnJlcyBtYXRjaF9kYXRhID0geyBpcnEsIGRldl9pZCB9OwogCi0JZnJlZV9pcnEoaXJxLCBkZXZfaWQpOwogCVdBUk5fT04oZGV2cmVzX2Rlc3Ryb3koZGV2LCBkZXZtX2lycV9yZWxlYXNlLCBkZXZtX2lycV9tYXRjaCwKIAkJCSAgICAgICAmbWF0Y2hfZGF0YSkpOworCWZyZWVfaXJxKGlycSwgZGV2X2lkKTsKIH0KIEVYUE9SVF9TWU1CT0woZGV2bV9mcmVlX2lycSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jIGIva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYwppbmRleCAzMWE5ZGI3Li4zYTJjYWI0IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jCisrKyBiL2tlcm5lbC9pcnEvZ2VuZXJpYy1jaGlwLmMKQEAgLTEwMSwxMCArMTAxLDEwIEBACiB9CiAKIC8qKgotICogaXJxX2djX2FjayAtIEFjayBwZW5kaW5nIGludGVycnVwdAorICogaXJxX2djX2Fja19zZXRfYml0IC0gQWNrIHBlbmRpbmcgaW50ZXJydXB0IHZpYSBzZXR0aW5nIGJpdAogICogQGQ6IGlycV9kYXRhCiAgKi8KLXZvaWQgaXJxX2djX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit2b2lkIGlycV9nY19hY2tfc2V0X2JpdChzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CiAJdTMyIG1hc2sgPSAxIDw8IChkLT5pcnEgLSBnYy0+aXJxX2Jhc2UpOwpAQCAtMTE1LDYgKzExNSwyMCBAQAogfQogCiAvKioKKyAqIGlycV9nY19hY2tfY2xyX2JpdCAtIEFjayBwZW5kaW5nIGludGVycnVwdCB2aWEgY2xlYXJpbmcgYml0CisgKiBAZDogaXJxX2RhdGEKKyAqLwordm9pZCBpcnFfZ2NfYWNrX2Nscl9iaXQoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXUzMiBtYXNrID0gfigxIDw8IChkLT5pcnEgLSBnYy0+aXJxX2Jhc2UpKTsKKworCWlycV9nY19sb2NrKGdjKTsKKwlpcnFfcmVnX3dyaXRlbChtYXNrLCBnYy0+cmVnX2Jhc2UgKyBjdXJfcmVncyhkKS0+YWNrKTsKKwlpcnFfZ2NfdW5sb2NrKGdjKTsKK30KKworLyoqCiAgKiBpcnFfZ2NfbWFza19kaXNhYmxlX3JlZ19hbmRfYWNrLSBNYXNrIGFuZCBhY2sgcGVuZGluZyBpbnRlcnJ1cHQKICAqIEBkOiBpcnFfZGF0YQogICovCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2hhbmRsZS5jIGIva2VybmVsL2lycS9oYW5kbGUuYwppbmRleCA5MGNiNTVmLi40NzBkMDhjIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2hhbmRsZS5jCisrKyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKQEAgLTEzMywxMiArMTMzLDYgQEAKIAkJc3dpdGNoIChyZXMpIHsKIAkJY2FzZSBJUlFfV0FLRV9USFJFQUQ6CiAJCQkvKgotCQkJICogU2V0IHJlc3VsdCB0byBoYW5kbGVkIHNvIHRoZSBzcHVyaW91cyBjaGVjawotCQkJICogZG9lcyBub3QgdHJpZ2dlci4KLQkJCSAqLwotCQkJcmVzID0gSVJRX0hBTkRMRUQ7Ci0KLQkJCS8qCiAJCQkgKiBDYXRjaCBkcml2ZXJzIHdoaWNoIHJldHVybiBXQUtFX1RIUkVBRCBidXQKIAkJCSAqIGRpZCBub3Qgc2V0IHVwIGEgdGhyZWFkIGZ1bmN0aW9uCiAJCQkgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaXJxZGVzYy5jIGIva2VybmVsL2lycS9pcnFkZXNjLmMKaW5kZXggODg2ZTgwMy4uNGM2MGE1MCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9pcnFkZXNjLmMKKysrIGIva2VybmVsL2lycS9pcnFkZXNjLmMKQEAgLTI1NywxMyArMjU3LDExIEBACiAJY291bnQgPSBBUlJBWV9TSVpFKGlycV9kZXNjKTsKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWRlc2NbaV0uaXJxX2RhdGEuaXJxID0gaTsKLQkJZGVzY1tpXS5pcnFfZGF0YS5jaGlwID0gJm5vX2lycV9jaGlwOwogCQlkZXNjW2ldLmtzdGF0X2lycXMgPSBhbGxvY19wZXJjcHUodW5zaWduZWQgaW50KTsKLQkJaXJxX3NldHRpbmdzX2Nscl9hbmRfc2V0KGRlc2MsIH4wLCBfSVJRX0RFRkFVTFRfSU5JVF9GTEFHUyk7Ci0JCWFsbG9jX21hc2tzKGRlc2MgKyBpLCBHRlBfS0VSTkVMLCBub2RlKTsKLQkJZGVzY19zbXBfaW5pdChkZXNjICsgaSwgbm9kZSk7CisJCWFsbG9jX21hc2tzKCZkZXNjW2ldLCBHRlBfS0VSTkVMLCBub2RlKTsKKwkJcmF3X3NwaW5fbG9ja19pbml0KCZkZXNjW2ldLmxvY2spOwogCQlsb2NrZGVwX3NldF9jbGFzcygmZGVzY1tpXS5sb2NrLCAmaXJxX2Rlc2NfbG9ja19jbGFzcyk7CisJCWRlc2Nfc2V0X2RlZmF1bHRzKGksICZkZXNjW2ldLCBub2RlKTsKIAl9CiAJcmV0dXJuIGFyY2hfZWFybHlfaXJxX2luaXQoKTsKIH0KQEAgLTM0Niw2ICszNDQsMTIgQEAKIAlpZiAoIWNudCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoaXJxID49IDApIHsKKwkJaWYgKGZyb20gPiBpcnEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZnJvbSA9IGlycTsKKwl9CisKIAltdXRleF9sb2NrKCZzcGFyc2VfaXJxX2xvY2spOwogCiAJc3RhcnQgPSBiaXRtYXBfZmluZF9uZXh0X3plcm9fYXJlYShhbGxvY2F0ZWRfaXJxcywgSVJRX0JJVE1BUF9CSVRTLApkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9tYW5hZ2UuYyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKaW5kZXggZjdjZTAwMi4uMGE3ODQwYWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvbWFuYWdlLmMKKysrIGIva2VybmVsL2lycS9tYW5hZ2UuYwpAQCAtNDkxLDYgKzQ5MSw5IEBACiAJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2dldF9kZXNjX2J1c2xvY2soaXJxLCAmZmxhZ3MpOwogCWludCByZXQgPSAwOwogCisJaWYgKCFkZXNjKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qIHdha2V1cC1jYXBhYmxlIGlycXMgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGRyaXZlcnMgdGhhdAogCSAqIGRvbid0IG5lZWQgdG8gaGF2ZSB0aGUgc2FtZSBzbGVlcCBtb2RlIGJlaGF2aW9ycy4KIAkgKi8KQEAgLTcyMywxMyArNzI2LDE2IEBACiAgKiBjb250ZXh0LiBTbyB3ZSBuZWVkIHRvIGRpc2FibGUgYmggaGVyZSB0byBhdm9pZCBkZWFkbG9ja3MgYW5kIG90aGVyCiAgKiBzaWRlIGVmZmVjdHMuCiAgKi8KLXN0YXRpYyB2b2lkCitzdGF0aWMgaXJxcmV0dXJuX3QKIGlycV9mb3JjZWRfdGhyZWFkX2ZuKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQogeworCWlycXJldHVybl90IHJldDsKKwogCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlhY3Rpb24tPnRocmVhZF9mbihhY3Rpb24tPmlycSwgYWN0aW9uLT5kZXZfaWQpOworCXJldCA9IGFjdGlvbi0+dGhyZWFkX2ZuKGFjdGlvbi0+aXJxLCBhY3Rpb24tPmRldl9pZCk7CiAJaXJxX2ZpbmFsaXplX29uZXNob3QoZGVzYywgYWN0aW9uLCBmYWxzZSk7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTczNywxMCArNzQzLDE0IEBACiAgKiBwcmVlbXRpYmxlIC0gbWFueSBvZiB0aGVtIG5lZWQgdG8gc2xlZXAgYW5kIHdhaXQgZm9yIHNsb3cgYnVzc2VzIHRvCiAgKiBjb21wbGV0ZS4KICAqLwotc3RhdGljIHZvaWQgaXJxX3RocmVhZF9mbihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcnFfdGhyZWFkX2ZuKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywKKwkJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQogewotCWFjdGlvbi0+dGhyZWFkX2ZuKGFjdGlvbi0+aXJxLCBhY3Rpb24tPmRldl9pZCk7CisJaXJxcmV0dXJuX3QgcmV0OworCisJcmV0ID0gYWN0aW9uLT50aHJlYWRfZm4oYWN0aW9uLT5pcnEsIGFjdGlvbi0+ZGV2X2lkKTsKIAlpcnFfZmluYWxpemVfb25lc2hvdChkZXNjLCBhY3Rpb24sIGZhbHNlKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtNzUzLDcgKzc2Myw4IEBACiAJfTsKIAlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24gPSBkYXRhOwogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGFjdGlvbi0+aXJxKTsKLQl2b2lkICgqaGFuZGxlcl9mbikoc3RydWN0IGlycV9kZXNjICpkZXNjLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pOworCWlycXJldHVybl90ICgqaGFuZGxlcl9mbikoc3RydWN0IGlycV9kZXNjICpkZXNjLAorCQkJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKTsKIAlpbnQgd2FrZTsKIAogCWlmIChmb3JjZV9pcnF0aHJlYWRzICYgdGVzdF9iaXQoSVJRVEZfRk9SQ0VEX1RIUkVBRCwKQEAgLTc4Myw4ICs3OTQsMTIgQEAKIAkJCWRlc2MtPmlzdGF0ZSB8PSBJUlFTX1BFTkRJTkc7CiAJCQlyYXdfc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5sb2NrKTsKIAkJfSBlbHNlIHsKKwkJCWlycXJldHVybl90IGFjdGlvbl9yZXQ7CisKIAkJCXJhd19zcGluX3VubG9ja19pcnEoJmRlc2MtPmxvY2spOwotCQkJaGFuZGxlcl9mbihkZXNjLCBhY3Rpb24pOworCQkJYWN0aW9uX3JldCA9IGhhbmRsZXJfZm4oZGVzYywgYWN0aW9uKTsKKwkJCWlmICghbm9pcnFkZWJ1ZykKKwkJCQlub3RlX2ludGVycnVwdChhY3Rpb24tPmlycSwgZGVzYywgYWN0aW9uX3JldCk7CiAJCX0KIAogCQl3YWtlID0gYXRvbWljX2RlY19hbmRfdGVzdCgmZGVzYy0+dGhyZWFkc19hY3RpdmUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9zcHVyaW91cy5jIGIva2VybmVsL2lycS9zcHVyaW91cy5jCmluZGV4IGRmYmQ1NTAuLmFhNTdkNWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvc3B1cmlvdXMuYworKysgYi9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKQEAgLTE2Nyw2ICsxNjcsMTMgQEAKIAkJICBqaWZmaWVzICsgUE9MTF9TUFVSSU9VU19JUlFfSU5URVJWQUwpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBiYWRfYWN0aW9uX3JldChpcnFyZXR1cm5fdCBhY3Rpb25fcmV0KQoreworCWlmIChsaWtlbHkoYWN0aW9uX3JldCA8PSAoSVJRX0hBTkRMRUQgfCBJUlFfV0FLRV9USFJFQUQpKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKIC8qCiAgKiBJZiA5OSw5MDAgb2YgdGhlIHByZXZpb3VzIDEwMCwwMDAgaW50ZXJydXB0cyBoYXZlIG5vdCBiZWVuIGhhbmRsZWQKICAqIHRoZW4gYXNzdW1lIHRoYXQgdGhlIElSUSBpcyBzdHVjayBpbiBzb21lIG1hbm5lci4gRHJvcCBhIGRpYWdub3N0aWMKQEAgLTE4Miw3ICsxODksNyBAQAogCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKGFjdGlvbl9yZXQgIT0gSVJRX0hBTkRMRUQgJiYgYWN0aW9uX3JldCAhPSBJUlFfTk9ORSkgeworCWlmIChiYWRfYWN0aW9uX3JldChhY3Rpb25fcmV0KSkgewogCQlwcmludGsoS0VSTl9FUlIgImlycSBldmVudCAlZDogYm9ndXMgcmV0dXJuIHZhbHVlICV4XG4iLAogCQkJCWlycSwgYWN0aW9uX3JldCk7CiAJfSBlbHNlIHsKQEAgLTIwMSwxMCArMjA4LDExIEBACiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7CiAJYWN0aW9uID0gZGVzYy0+YWN0aW9uOwogCXdoaWxlIChhY3Rpb24pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJbPCVwPl0iLCBhY3Rpb24tPmhhbmRsZXIpOwotCQlwcmludF9zeW1ib2woIiAoJXMpIiwKLQkJCSh1bnNpZ25lZCBsb25nKWFjdGlvbi0+aGFuZGxlcik7Ci0JCXByaW50aygiXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJbPCVwPl0gJXBmIiwgYWN0aW9uLT5oYW5kbGVyLCBhY3Rpb24tPmhhbmRsZXIpOworCQlpZiAoYWN0aW9uLT50aHJlYWRfZm4pCisJCQlwcmludGsoS0VSTl9DT05UICIgdGhyZWFkZWQgWzwlcD5dICVwZiIsCisJCQkJCWFjdGlvbi0+dGhyZWFkX2ZuLCBhY3Rpb24tPnRocmVhZF9mbik7CisJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAJCWFjdGlvbiA9IGFjdGlvbi0+bmV4dDsKIAl9CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKQEAgLTI2Miw3ICsyNzAsMTYgQEAKIAlpZiAoZGVzYy0+aXN0YXRlICYgSVJRU19QT0xMX0lOUFJPR1JFU1MpCiAJCXJldHVybjsKIAotCWlmICh1bmxpa2VseShhY3Rpb25fcmV0ICE9IElSUV9IQU5ETEVEKSkgeworCS8qIHdlIGdldCBoZXJlIGFnYWluIHZpYSB0aGUgdGhyZWFkZWQgaGFuZGxlciAqLworCWlmIChhY3Rpb25fcmV0ID09IElSUV9XQUtFX1RIUkVBRCkKKwkJcmV0dXJuOworCisJaWYgKGJhZF9hY3Rpb25fcmV0KGFjdGlvbl9yZXQpKSB7CisJCXJlcG9ydF9iYWRfaXJxKGlycSwgZGVzYywgYWN0aW9uX3JldCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodW5saWtlbHkoYWN0aW9uX3JldCA9PSBJUlFfTk9ORSkpIHsKIAkJLyoKIAkJICogSWYgd2UgYXJlIHNlZWluZyBvbmx5IHRoZSBvZGQgc3B1cmlvdXMgSVJRIGNhdXNlZCBieQogCQkgKiBidXMgYXN5bmNocm9uaWNpdHkgdGhlbiBkb24ndCBldmVudHVhbGx5IHRyaWdnZXIgYW4gZXJyb3IsCkBAIC0yNzQsOCArMjkxLDYgQEAKIAkJZWxzZQogCQkJZGVzYy0+aXJxc191bmhhbmRsZWQrKzsKIAkJZGVzYy0+bGFzdF91bmhhbmRsZWQgPSBqaWZmaWVzOwotCQlpZiAodW5saWtlbHkoYWN0aW9uX3JldCAhPSBJUlFfTk9ORSkpCi0JCQlyZXBvcnRfYmFkX2lycShpcnEsIGRlc2MsIGFjdGlvbl9yZXQpOwogCX0KIAogCWlmICh1bmxpa2VseSh0cnlfbWlzcm91dGVkX2lycShpcnEsIGRlc2MsIGFjdGlvbl9yZXQpKSkgewpkaWZmIC0tZ2l0IGEva2VybmVsL2p1bXBfbGFiZWwuYyBiL2tlcm5lbC9qdW1wX2xhYmVsLmMKaW5kZXggZmEyN2U3NS4uYThjZTQ1MCAxMDA2NDQKLS0tIGEva2VybmVsL2p1bXBfbGFiZWwuYworKysgYi9rZXJuZWwvanVtcF9sYWJlbC5jCkBAIC0zNzUsMTUgKzM3NSwxOSBAQAogCiBzdGF0aWMgdm9pZCBqdW1wX2xhYmVsX3VwZGF0ZShzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSwgaW50IGVuYWJsZSkKIHsKLQlzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnkgPSBrZXktPmVudHJpZXM7Ci0KLQkvKiBpZiB0aGVyZSBhcmUgbm8gdXNlcnMsIGVudHJ5IGNhbiBiZSBOVUxMICovCi0JaWYgKGVudHJ5KQotCQlfX2p1bXBfbGFiZWxfdXBkYXRlKGtleSwgZW50cnksIF9fc3RvcF9fX2p1bXBfdGFibGUsIGVuYWJsZSk7CisJc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5ID0ga2V5LT5lbnRyaWVzLCAqc3RvcCA9IF9fc3RvcF9fX2p1bXBfdGFibGU7CiAKICNpZmRlZiBDT05GSUdfTU9EVUxFUworCXN0cnVjdCBtb2R1bGUgKm1vZCA9IF9fbW9kdWxlX2FkZHJlc3MoKGp1bXBfbGFiZWxfdClrZXkpOworCiAJX19qdW1wX2xhYmVsX21vZF91cGRhdGUoa2V5LCBlbmFibGUpOworCisJaWYgKG1vZCkKKwkJc3RvcCA9IG1vZC0+anVtcF9lbnRyaWVzICsgbW9kLT5udW1fanVtcF9lbnRyaWVzOwogI2VuZGlmCisJLyogaWYgdGhlcmUgYXJlIG5vIHVzZXJzLCBlbnRyeSBjYW4gYmUgTlVMTCAqLworCWlmIChlbnRyeSkKKwkJX19qdW1wX2xhYmVsX3VwZGF0ZShrZXksIGVudHJ5LCBzdG9wLCBlbmFibGUpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9rZXhlYy5jIGIva2VybmVsL2tleGVjLmMKaW5kZXggOGQ4MTRjYi4uMjk2ZmJjOCAxMDA2NDQKLS0tIGEva2VybmVsL2tleGVjLmMKKysrIGIva2VybmVsL2tleGVjLmMKQEAgLTEwOTUsNyArMTA5NSw3IEBACiAJc2l6ZV90IHNpemUgPSAwOwogCW11dGV4X2xvY2soJmtleGVjX211dGV4KTsKIAlpZiAoY3Jhc2hrX3Jlcy5lbmQgIT0gY3Jhc2hrX3Jlcy5zdGFydCkKLQkJc2l6ZSA9IGNyYXNoa19yZXMuZW5kIC0gY3Jhc2hrX3Jlcy5zdGFydCArIDE7CisJCXNpemUgPSByZXNvdXJjZV9zaXplKCZjcmFzaGtfcmVzKTsKIAltdXRleF91bmxvY2soJmtleGVjX211dGV4KTsKIAlyZXR1cm4gc2l6ZTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9rbW9kLmMgYi9rZXJuZWwva21vZC5jCmluZGV4IGFkNmE4MWMuLjQ3NjEzZGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rbW9kLmMKKysrIGIva2VybmVsL2ttb2QuYwpAQCAtMTU2LDEyICsxNTYsNiBAQAogCSAqLwogCXNldF91c2VyX25pY2UoY3VycmVudCwgMCk7CiAKLQlpZiAoc3ViX2luZm8tPmluaXQpIHsKLQkJcmV0dmFsID0gc3ViX2luZm8tPmluaXQoc3ViX2luZm8pOwotCQlpZiAocmV0dmFsKQotCQkJZ290byBmYWlsOwotCX0KLQogCXJldHZhbCA9IC1FTk9NRU07CiAJbmV3ID0gcHJlcGFyZV9rZXJuZWxfY3JlZChjdXJyZW50KTsKIAlpZiAoIW5ldykKQEAgLTE3Myw2ICsxNjcsMTQgQEAKIAkJCQkJICAgICBuZXctPmNhcF9pbmhlcml0YWJsZSk7CiAJc3Bpbl91bmxvY2soJnVtaF9zeXNjdGxfbG9jayk7CiAKKwlpZiAoc3ViX2luZm8tPmluaXQpIHsKKwkJcmV0dmFsID0gc3ViX2luZm8tPmluaXQoc3ViX2luZm8sIG5ldyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWFib3J0X2NyZWRzKG5ldyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKIAljb21taXRfY3JlZHMobmV3KTsKIAogCXJldHZhbCA9IGtlcm5lbF9leGVjdmUoc3ViX2luZm8tPnBhdGgsCkBAIC0zODgsNyArMzkwLDcgQEAKICAqIGNvbnRleHQgaW4gd2hpY2ggY2FsbF91c2VybW9kZWhlbHBlcl9leGVjIGlzIGNhbGxlZC4KICAqLwogdm9pZCBjYWxsX3VzZXJtb2RlaGVscGVyX3NldGZucyhzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvLAotCQkgICAgaW50ICgqaW5pdCkoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbyksCisJCSAgICBpbnQgKCppbml0KShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvLCBzdHJ1Y3QgY3JlZCAqbmV3KSwKIAkJICAgIHZvaWQgKCpjbGVhbnVwKShzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvKSwKIAkJICAgIHZvaWQgKmRhdGEpCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwva3Byb2Jlcy5jIGIva2VybmVsL2twcm9iZXMuYwppbmRleCA3Nzk4MTgxLi5iMzBmZDU0IDEwMDY0NAotLS0gYS9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTEyNTUsMTkgKzEyNTUsMjkgQEAKIC8qCiAgKiBJZiB3ZSBoYXZlIGEgc3ltYm9sX25hbWUgYXJndW1lbnQsIGxvb2sgaXQgdXAgYW5kIGFkZCB0aGUgb2Zmc2V0IGZpZWxkCiAgKiB0byBpdC4gVGhpcyB3YXksIHdlIGNhbiBzcGVjaWZ5IGEgcmVsYXRpdmUgYWRkcmVzcyB0byBhIHN5bWJvbC4KKyAqIFRoaXMgcmV0dXJucyBlbmNvZGVkIGVycm9ycyBpZiBpdCBmYWlscyB0byBsb29rIHVwIHN5bWJvbCBvciBpbnZhbGlkCisgKiBjb21iaW5hdGlvbiBvZiBwYXJhbWV0ZXJzLgogICovCiBzdGF0aWMga3Byb2JlX29wY29kZV90IF9fa3Byb2JlcyAqa3Byb2JlX2FkZHIoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlrcHJvYmVfb3Bjb2RlX3QgKmFkZHIgPSBwLT5hZGRyOworCisJaWYgKChwLT5zeW1ib2xfbmFtZSAmJiBwLT5hZGRyKSB8fAorCSAgICAoIXAtPnN5bWJvbF9uYW1lICYmICFwLT5hZGRyKSkKKwkJZ290byBpbnZhbGlkOworCiAJaWYgKHAtPnN5bWJvbF9uYW1lKSB7Ci0JCWlmIChhZGRyKQotCQkJcmV0dXJuIE5VTEw7CiAJCWtwcm9iZV9sb29rdXBfbmFtZShwLT5zeW1ib2xfbmFtZSwgYWRkcik7CisJCWlmICghYWRkcikKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCX0KIAotCWlmICghYWRkcikKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIChrcHJvYmVfb3Bjb2RlX3QgKikoKChjaGFyICopYWRkcikgKyBwLT5vZmZzZXQpOworCWFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopKCgoY2hhciAqKWFkZHIpICsgcC0+b2Zmc2V0KTsKKwlpZiAoYWRkcikKKwkJcmV0dXJuIGFkZHI7CisKK2ludmFsaWQ6CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiB9CiAKIC8qIENoZWNrIHBhc3NlZCBrcHJvYmUgaXMgdmFsaWQgYW5kIHJldHVybiBrcHJvYmUgaW4ga3Byb2JlX3RhYmxlLiAqLwpAQCAtMTMxMSw4ICsxMzIxLDggQEAKIAlrcHJvYmVfb3Bjb2RlX3QgKmFkZHI7CiAKIAlhZGRyID0ga3Byb2JlX2FkZHIocCk7Ci0JaWYgKCFhZGRyKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoSVNfRVJSKGFkZHIpKQorCQlyZXR1cm4gUFRSX0VSUihhZGRyKTsKIAlwLT5hZGRyID0gYWRkcjsKIAogCXJldCA9IGNoZWNrX2twcm9iZV9yZXJlZyhwKTsKQEAgLTEzMzUsNiArMTM0NSw4IEBACiAJICovCiAJcHJvYmVkX21vZCA9IF9fbW9kdWxlX3RleHRfYWRkcmVzcygodW5zaWduZWQgbG9uZykgcC0+YWRkcik7CiAJaWYgKHByb2JlZF9tb2QpIHsKKwkJLyogUmV0dXJuIC1FTk9FTlQgaWYgZmFpbC4gKi8KKwkJcmV0ID0gLUVOT0VOVDsKIAkJLyoKIAkJICogV2UgbXVzdCBob2xkIGEgcmVmY291bnQgb2YgdGhlIHByb2JlZCBtb2R1bGUgd2hpbGUgdXBkYXRpbmcKIAkJICogaXRzIGNvZGUgdG8gcHJvaGliaXQgdW5leHBlY3RlZCB1bmxvYWRpbmcuCkBAIC0xMzUxLDYgKzEzNjMsNyBAQAogCQkJbW9kdWxlX3B1dChwcm9iZWRfbW9kKTsKIAkJCWdvdG8gZmFpbF93aXRoX2p1bXBfbGFiZWw7CiAJCX0KKwkJLyogcmV0IHdpbGwgYmUgdXBkYXRlZCBieSBmb2xsb3dpbmcgY29kZSAqLwogCX0KIAlwcmVlbXB0X2VuYWJsZSgpOwogCWp1bXBfbGFiZWxfdW5sb2NrKCk7CkBAIC0xMzk5LDcgKzE0MTIsNyBAQAogZmFpbF93aXRoX2p1bXBfbGFiZWw6CiAJcHJlZW1wdF9lbmFibGUoKTsKIAlqdW1wX2xhYmVsX3VubG9jaygpOwotCXJldHVybiAtRUlOVkFMOworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9rcHJvYmUpOwogCkBAIC0xNjg2LDggKzE2OTksOCBAQAogCiAJaWYgKGtyZXRwcm9iZV9ibGFja2xpc3Rfc2l6ZSkgewogCQlhZGRyID0ga3Byb2JlX2FkZHIoJnJwLT5rcCk7Ci0JCWlmICghYWRkcikKLQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoSVNfRVJSKGFkZHIpKQorCQkJcmV0dXJuIFBUUl9FUlIoYWRkcik7CiAKIAkJZm9yIChpID0gMDsga3JldHByb2JlX2JsYWNrbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykgewogCQkJaWYgKGtyZXRwcm9iZV9ibGFja2xpc3RbaV0uYWRkciA9PSBhZGRyKQpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXAuYyBiL2tlcm5lbC9sb2NrZGVwLmMKaW5kZXggNjM0MzdkMC4uMzk1NmY1MSAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2RlcC5jCkBAIC0yNDY4LDYgKzI0NjgsOSBAQAogCiAJCUJVR19PTih1c2FnZV9iaXQgPj0gTE9DS19VU0FHRV9TVEFURVMpOwogCisJCWlmIChobG9ja19jbGFzcyhobG9jayktPmtleSA9PSAmX19sb2NrZGVwX25vX3ZhbGlkYXRlX18pCisJCQljb250aW51ZTsKKwogCQlpZiAoIW1hcmtfbG9jayhjdXJyLCBobG9jaywgdXNhZ2VfYml0KSkKIAkJCXJldHVybiAwOwogCX0KQEAgLTI0NzgsMTUgKzI0ODEsMTAgQEAKIC8qCiAgKiBIYXJkaXJxcyB3aWxsIGJlIGVuYWJsZWQ6CiAgKi8KLXZvaWQgdHJhY2VfaGFyZGlycXNfb25fY2FsbGVyKHVuc2lnbmVkIGxvbmcgaXApCitzdGF0aWMgdm9pZCBfX3RyYWNlX2hhcmRpcnFzX29uX2NhbGxlcih1bnNpZ25lZCBsb25nIGlwKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IGN1cnJlbnQ7CiAKLQl0aW1lX2hhcmRpcnFzX29uKENBTExFUl9BRERSMCwgaXApOwotCi0JaWYgKHVubGlrZWx5KCFkZWJ1Z19sb2NrcyB8fCBjdXJyZW50LT5sb2NrZGVwX3JlY3Vyc2lvbikpCi0JCXJldHVybjsKLQogCWlmIChERUJVR19MT0NLU19XQVJOX09OKHVubGlrZWx5KGVhcmx5X2Jvb3RfaXJxc19kaXNhYmxlZCkpKQogCQlyZXR1cm47CiAKQEAgLTI1MDIsOCArMjUwMCw2IEBACiAJLyogd2UnbGwgZG8gYW4gT0ZGIC0+IE9OIHRyYW5zaXRpb246ICovCiAJY3Vyci0+aGFyZGlycXNfZW5hYmxlZCA9IDE7CiAKLQlpZiAoREVCVUdfTE9DS1NfV0FSTl9PTighaXJxc19kaXNhYmxlZCgpKSkKLQkJcmV0dXJuOwogCWlmIChERUJVR19MT0NLU19XQVJOX09OKGN1cnJlbnQtPmhhcmRpcnFfY29udGV4dCkpCiAJCXJldHVybjsKIAkvKgpAQCAtMjUyNSw2ICsyNTIxLDIxIEBACiAJY3Vyci0+aGFyZGlycV9lbmFibGVfZXZlbnQgPSArK2N1cnItPmlycV9ldmVudHM7CiAJZGVidWdfYXRvbWljX2luYyhoYXJkaXJxc19vbl9ldmVudHMpOwogfQorCit2b2lkIHRyYWNlX2hhcmRpcnFzX29uX2NhbGxlcih1bnNpZ25lZCBsb25nIGlwKQoreworCXRpbWVfaGFyZGlycXNfb24oQ0FMTEVSX0FERFIwLCBpcCk7CisKKwlpZiAodW5saWtlbHkoIWRlYnVnX2xvY2tzIHx8IGN1cnJlbnQtPmxvY2tkZXBfcmVjdXJzaW9uKSkKKwkJcmV0dXJuOworCisJaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04oIWlycXNfZGlzYWJsZWQoKSkpCisJCXJldHVybjsKKworCWN1cnJlbnQtPmxvY2tkZXBfcmVjdXJzaW9uID0gMTsKKwlfX3RyYWNlX2hhcmRpcnFzX29uX2NhbGxlcihpcCk7CisJY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24gPSAwOworfQogRVhQT1JUX1NZTUJPTCh0cmFjZV9oYXJkaXJxc19vbl9jYWxsZXIpOwogCiB2b2lkIHRyYWNlX2hhcmRpcnFzX29uKHZvaWQpCkBAIC0yNTc0LDcgKzI1ODUsNyBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IGN1cnJlbnQ7CiAKLQlpZiAodW5saWtlbHkoIWRlYnVnX2xvY2tzKSkKKwlpZiAodW5saWtlbHkoIWRlYnVnX2xvY2tzIHx8IGN1cnJlbnQtPmxvY2tkZXBfcmVjdXJzaW9uKSkKIAkJcmV0dXJuOwogCiAJaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04oIWlycXNfZGlzYWJsZWQoKSkpCkBAIC0yNTg1LDYgKzI1OTYsNyBAQAogCQlyZXR1cm47CiAJfQogCisJY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24gPSAxOwogCS8qCiAJICogV2UnbGwgZG8gYW4gT0ZGIC0+IE9OIHRyYW5zaXRpb246CiAJICovCkBAIC0yNTk5LDYgKzI2MTEsNyBAQAogCSAqLwogCWlmIChjdXJyLT5oYXJkaXJxc19lbmFibGVkKQogCQltYXJrX2hlbGRfbG9ja3MoY3VyciwgU09GVElSUSk7CisJY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24gPSAwOwogfQogCiAvKgpAQCAtMjYwOCw3ICsyNjIxLDcgQEAKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBjdXJyZW50OwogCi0JaWYgKHVubGlrZWx5KCFkZWJ1Z19sb2NrcykpCisJaWYgKHVubGlrZWx5KCFkZWJ1Z19sb2NrcyB8fCBjdXJyZW50LT5sb2NrZGVwX3JlY3Vyc2lvbikpCiAJCXJldHVybjsKIAogCWlmIChERUJVR19MT0NLU19XQVJOX09OKCFpcnFzX2Rpc2FibGVkKCkpKQpAQCAtMzQyNiw3ICszNDM5LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmICh1bmxpa2VseShjdXJyZW50LT5sb2NrZGVwX3JlY3Vyc2lvbikpCi0JCXJldHVybiByZXQ7CisJCXJldHVybiAxOyAvKiBhdm9pZCBmYWxzZSBuZWdhdGl2ZSBsb2NrZGVwX2Fzc2VydF9oZWxkKCkgKi8KIAogCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJY2hlY2tfZmxhZ3MoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IDc5NWJkYzcuLjA0Mzc5ZjkyIDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC01NDUsOSArNTQ1LDkgQEAKIAltb2QtPmZpZWxkID0ga3N0cmR1cChzLCBHRlBfS0VSTkVMKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiBzdGF0aWMgc3NpemVfdCBzaG93X21vZGluZm9fIyNmaWVsZChzdHJ1Y3QgbW9kdWxlX2F0dHJpYnV0ZSAqbWF0dHIsICAgXAotCSAgICAgICAgICAgICAgICBzdHJ1Y3QgbW9kdWxlICptb2QsIGNoYXIgKmJ1ZmZlcikgICAgICAgICAgICAgXAorCQkJc3RydWN0IG1vZHVsZV9rb2JqZWN0ICptaywgY2hhciAqYnVmZmVyKSAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXNcbiIsIG1vZC0+ZmllbGQpOyAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXNcbiIsIG1rLT5tb2QtPmZpZWxkKTsgICAgICAgICAgICAgICBcCiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIGludCBtb2RpbmZvXyMjZmllbGQjI19leGlzdHMoc3RydWN0IG1vZHVsZSAqbW9kKSAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC05MDIsOSArOTAyLDkgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHN5bWJvbF9wdXRfYWRkcik7CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfcmVmY250KHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICptYXR0ciwKLQkJCSAgIHN0cnVjdCBtb2R1bGUgKm1vZCwgY2hhciAqYnVmZmVyKQorCQkJICAgc3RydWN0IG1vZHVsZV9rb2JqZWN0ICptaywgY2hhciAqYnVmZmVyKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiV1XG4iLCBtb2R1bGVfcmVmY291bnQobW9kKSk7CisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXVcbiIsIG1vZHVsZV9yZWZjb3VudChtay0+bW9kKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbW9kdWxlX2F0dHJpYnV0ZSByZWZjbnQgPSB7CkBAIC05NTIsMTEgKzk1MiwxMSBAQAogI2VuZGlmIC8qIENPTkZJR19NT0RVTEVfVU5MT0FEICovCiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfaW5pdHN0YXRlKHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICptYXR0ciwKLQkJCSAgIHN0cnVjdCBtb2R1bGUgKm1vZCwgY2hhciAqYnVmZmVyKQorCQkJICAgICAgc3RydWN0IG1vZHVsZV9rb2JqZWN0ICptaywgY2hhciAqYnVmZmVyKQogewogCWNvbnN0IGNoYXIgKnN0YXRlID0gInVua25vd24iOwogCi0Jc3dpdGNoIChtb2QtPnN0YXRlKSB7CisJc3dpdGNoIChtay0+bW9kLT5zdGF0ZSkgewogCWNhc2UgTU9EVUxFX1NUQVRFX0xJVkU6CiAJCXN0YXRlID0gImxpdmUiOwogCQlicmVhazsKQEAgLTk3NSwxMCArOTc1LDI3IEBACiAJLnNob3cgPSBzaG93X2luaXRzdGF0ZSwKIH07CiAKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3VldmVudChzdHJ1Y3QgbW9kdWxlX2F0dHJpYnV0ZSAqbWF0dHIsCisJCQkgICAgc3RydWN0IG1vZHVsZV9rb2JqZWN0ICptaywKKwkJCSAgICBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwllbnVtIGtvYmplY3RfYWN0aW9uIGFjdGlvbjsKKworCWlmIChrb2JqZWN0X2FjdGlvbl90eXBlKGJ1ZmZlciwgY291bnQsICZhY3Rpb24pID09IDApCisJCWtvYmplY3RfdWV2ZW50KCZtay0+a29iaiwgYWN0aW9uKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0cnVjdCBtb2R1bGVfYXR0cmlidXRlIG1vZHVsZV91ZXZlbnQgPSB7CisJLmF0dHIgPSB7IC5uYW1lID0gInVldmVudCIsIC5tb2RlID0gMDIwMCB9LAorCS5zdG9yZSA9IHN0b3JlX3VldmVudCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgbW9kdWxlX2F0dHJpYnV0ZSAqbW9kaW5mb19hdHRyc1tdID0gewogCSZtb2RpbmZvX3ZlcnNpb24sCiAJJm1vZGluZm9fc3JjdmVyc2lvbiwKIAkmaW5pdHN0YXRlLAorCSZtb2R1bGVfdWV2ZW50LAogI2lmZGVmIENPTkZJR19NT0RVTEVfVU5MT0FECiAJJnJlZmNudCwKICNlbmRpZgpAQCAtMTE4Nyw3ICsxMjA0LDcgQEAKIH07CiAKIHN0YXRpYyBzc2l6ZV90IG1vZHVsZV9zZWN0X3Nob3coc3RydWN0IG1vZHVsZV9hdHRyaWJ1dGUgKm1hdHRyLAotCQkJCXN0cnVjdCBtb2R1bGUgKm1vZCwgY2hhciAqYnVmKQorCQkJCXN0cnVjdCBtb2R1bGVfa29iamVjdCAqbWssIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbW9kdWxlX3NlY3RfYXR0ciAqc2F0dHIgPQogCQljb250YWluZXJfb2YobWF0dHIsIHN0cnVjdCBtb2R1bGVfc2VjdF9hdHRyLCBtYXR0cik7CkBAIC0xNjk3LDYgKzE3MTQsMTUgQEAKIHN0YXRpYyB2b2lkIHVuc2V0X21vZHVsZV9pbml0X3JvX254KHN0cnVjdCBtb2R1bGUgKm1vZCkgeyB9CiAjZW5kaWYKIAordm9pZCBfX3dlYWsgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKQoreworCXZmcmVlKG1vZHVsZV9yZWdpb24pOworfQorCit2b2lkIF9fd2VhayBtb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKK30KKwogLyogRnJlZSBhIG1vZHVsZSwgcmVtb3ZlIGZyb20gbGlzdHMsIGV0Yy4gKi8KIHN0YXRpYyB2b2lkIGZyZWVfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKQEAgLTE4NTEsNiArMTg3NywyNiBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBfX3dlYWsgYXBwbHlfcmVsb2NhdGUoRWxmX1NoZHIgKnNlY2hkcnMsCisJCQkgIGNvbnN0IGNoYXIgKnN0cnRhYiwKKwkJCSAgdW5zaWduZWQgaW50IHN5bWluZGV4LAorCQkJICB1bnNpZ25lZCBpbnQgcmVsc2VjLAorCQkJICBzdHJ1Y3QgbW9kdWxlICptZSkKK3sKKwlwcl9lcnIoIm1vZHVsZSAlczogUkVMIHJlbG9jYXRpb24gdW5zdXBwb3J0ZWRcbiIsIG1lLT5uYW1lKTsKKwlyZXR1cm4gLUVOT0VYRUM7Cit9CisKK2ludCBfX3dlYWsgYXBwbHlfcmVsb2NhdGVfYWRkKEVsZl9TaGRyICpzZWNoZHJzLAorCQkJICAgICAgY29uc3QgY2hhciAqc3RydGFiLAorCQkJICAgICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAorCQkJICAgICAgdW5zaWduZWQgaW50IHJlbHNlYywKKwkJCSAgICAgIHN0cnVjdCBtb2R1bGUgKm1lKQoreworCXByX2VycigibW9kdWxlICVzOiBSRUxBIHJlbG9jYXRpb24gdW5zdXBwb3J0ZWRcbiIsIG1lLT5uYW1lKTsKKwlyZXR1cm4gLUVOT0VYRUM7Cit9CisKIHN0YXRpYyBpbnQgYXBwbHlfcmVsb2NhdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQogewogCXVuc2lnbmVkIGludCBpOwpAQCAtMjIzNSw2ICsyMjgxLDExIEBACiAJCWRkZWJ1Z19yZW1vdmVfbW9kdWxlKGRlYnVnLT5tb2RuYW1lKTsKIH0KIAordm9pZCAqIF9fd2VhayBtb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXJldHVybiBzaXplID09IDAgPyBOVUxMIDogdm1hbGxvY19leGVjKHNpemUpOworfQorCiBzdGF0aWMgdm9pZCAqbW9kdWxlX2FsbG9jX3VwZGF0ZV9ib3VuZHModW5zaWduZWQgbG9uZyBzaXplKQogewogCXZvaWQgKnJldCA9IG1vZHVsZV9hbGxvYyhzaXplKTsKQEAgLTI2NDUsNiArMjY5NiwxNCBAQAogCXNldF9mcyhvbGRfZnMpOwogfQogCitpbnQgX193ZWFrIG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmhkciwKKwkJCQkgICAgIEVsZl9TaGRyICpzZWNoZHJzLAorCQkJCSAgICAgY2hhciAqc2Vjc3RyaW5ncywKKwkJCQkgICAgIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBtb2R1bGUgKmxheW91dF9hbmRfYWxsb2NhdGUoc3RydWN0IGxvYWRfaW5mbyAqaW5mbykKIHsKIAkvKiBNb2R1bGUgd2l0aGluIHRlbXBvcmFyeSBjb3B5LiAqLwpAQCAtMjcxNiw2ICsyNzc1LDEzIEBACiAJbW9kdWxlX2ZyZWUobW9kLCBtb2QtPm1vZHVsZV9jb3JlKTsKIH0KIAoraW50IF9fd2VhayBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwKKwkJCSAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAorCQkJICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcG9zdF9yZWxvY2F0aW9uKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykKIHsKIAkvKiBTb3J0IGV4Y2VwdGlvbiB0YWJsZSBub3cgcmVsb2NhdGlvbnMgYXJlIGRvbmUuICovCmRpZmYgLS1naXQgYS9rZXJuZWwvbm90aWZpZXIuYyBiL2tlcm5lbC9ub3RpZmllci5jCmluZGV4IDI0ODhiYTcuLjhkN2I0MzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ub3RpZmllci5jCisrKyBiL2tlcm5lbC9ub3RpZmllci5jCkBAIC01MjUsMzcgKzUyNSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzcmN1X2luaXRfbm90aWZpZXJfaGVhZCk7CiAKLS8qKgotICoJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyIC0gUmVnaXN0ZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGF0IHJlYm9vdCB0aW1lCi0gKglAbmI6IEluZm8gYWJvdXQgbm90aWZpZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKgotICoJUmVnaXN0ZXJzIGEgZnVuY3Rpb24gd2l0aCB0aGUgbGlzdCBvZiBmdW5jdGlvbnMKLSAqCXRvIGJlIGNhbGxlZCBhdCByZWJvb3QgdGltZS4KLSAqCi0gKglDdXJyZW50bHkgYWx3YXlzIHJldHVybnMgemVybywgYXMgYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoKQotICoJYWx3YXlzIHJldHVybnMgemVyby4KLSAqLwotaW50IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcmVib290X25vdGlmaWVyX2xpc3QsIG5iKTsKLX0KLUVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfcmVib290X25vdGlmaWVyKTsKLQotLyoqCi0gKgl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllciAtIFVucmVnaXN0ZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHJlYm9vdCBub3RpZmllcgotICoJQG5iOiBIb29rIHRvIGJlIHVucmVnaXN0ZXJlZAotICoKLSAqCVVucmVnaXN0ZXJzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHJlYm9vdAotICoJbm90aWZpZXIgZnVuY3Rpb24uCi0gKgotICoJUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yICUtRU5PRU5UIG9uIGZhaWx1cmUuCi0gKi8KLWludCB1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZyZWJvb3Rfbm90aWZpZXJfbGlzdCwgbmIpOwotfQotRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcik7Ci0KIHN0YXRpYyBBVE9NSUNfTk9USUZJRVJfSEVBRChkaWVfY2hhaW4pOwogCiBpbnQgbm90cmFjZSBfX2twcm9iZXMgbm90aWZ5X2RpZShlbnVtIGRpZV92YWwgdmFsLCBjb25zdCBjaGFyICpzdHIsCmRpZmYgLS1naXQgYS9rZXJuZWwvbnNwcm94eS5jIGIva2VybmVsL25zcHJveHkuYwppbmRleCBkNmEwMGYzLi45YWVhYjRiIDEwMDY0NAotLS0gYS9rZXJuZWwvbnNwcm94eS5jCisrKyBiL2tlcm5lbC9uc3Byb3h5LmMKQEAgLTI3MSwxMCArMjcxLDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBuc3Byb3h5X2NhY2hlX2luaXQodm9pZCkKK2ludCBfX2luaXQgbnNwcm94eV9jYWNoZV9pbml0KHZvaWQpCiB7CiAJbnNwcm94eV9jYWNoZXAgPSBLTUVNX0NBQ0hFKG5zcHJveHksIFNMQUJfUEFOSUMpOwogCXJldHVybiAwOwogfQotCi1tb2R1bGVfaW5pdChuc3Byb3h5X2NhY2hlX2luaXQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BhcmFtcy5jIGIva2VybmVsL3BhcmFtcy5jCmluZGV4IGVkNzJlMTMuLjIyZGYzZTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wYXJhbXMuYworKysgYi9rZXJuZWwvcGFyYW1zLmMKQEAgLTIyNSw4ICsyMjUsOCBAQAogCQlpbnQgcmV0OwkJCQkJCVwKIAkJCQkJCQkJCVwKIAkJcmV0ID0gc3RydG9sZm4odmFsLCAwLCAmbCk7CQkJCVwKLQkJaWYgKHJldCA9PSAtRUlOVkFMIHx8ICgodHlwZSlsICE9IGwpKQkJCVwKLQkJCXJldHVybiAtRUlOVkFMOwkJCQkJXAorCQlpZiAocmV0IDwgMCB8fCAoKHR5cGUpbCAhPSBsKSkJCQkJXAorCQkJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRUlOVkFMOwkJCVwKIAkJKigodHlwZSAqKWtwLT5hcmcpID0gbDsJCQkJCVwKIAkJcmV0dXJuIDA7CQkJCQkJXAogCX0JCQkJCQkJCVwKQEAgLTUxMSw3ICs1MTEsNyBAQAogI2RlZmluZSB0b19wYXJhbV9hdHRyKG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcGFyYW1fYXR0cmlidXRlLCBtYXR0cikKIAogc3RhdGljIHNzaXplX3QgcGFyYW1fYXR0cl9zaG93KHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICptYXR0ciwKLQkJCSAgICAgICBzdHJ1Y3QgbW9kdWxlICptb2QsIGNoYXIgKmJ1ZikKKwkJCSAgICAgICBzdHJ1Y3QgbW9kdWxlX2tvYmplY3QgKm1rLCBjaGFyICpidWYpCiB7CiAJaW50IGNvdW50OwogCXN0cnVjdCBwYXJhbV9hdHRyaWJ1dGUgKmF0dHJpYnV0ZSA9IHRvX3BhcmFtX2F0dHIobWF0dHIpOwpAQCAtNTMxLDcgKzUzMSw3IEBACiAKIC8qIHN5c2ZzIGFsd2F5cyBoYW5kcyBhIG51bC10ZXJtaW5hdGVkIHN0cmluZyBpbiBidWYuICBXZSByZWx5IG9uIHRoYXQuICovCiBzdGF0aWMgc3NpemVfdCBwYXJhbV9hdHRyX3N0b3JlKHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICptYXR0ciwKLQkJCQlzdHJ1Y3QgbW9kdWxlICpvd25lciwKKwkJCQlzdHJ1Y3QgbW9kdWxlX2tvYmplY3QgKmttLAogCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKICAJaW50IGVycjsKQEAgLTczMCw2ICs3MzAsMTAgQEAKIAkJbWstPmtvYmoua3NldCA9IG1vZHVsZV9rc2V0OwogCQllcnIgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmbWstPmtvYmosICZtb2R1bGVfa3R5cGUsIE5VTEwsCiAJCQkJCSAgICIlcyIsIG5hbWUpOworI2lmZGVmIENPTkZJR19NT0RVTEVTCisJCWlmICghZXJyKQorCQkJZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoJm1rLT5rb2JqLCAmbW9kdWxlX3VldmVudC5hdHRyKTsKKyNlbmRpZgogCQlpZiAoZXJyKSB7CiAJCQlrb2JqZWN0X3B1dCgmbWstPmtvYmopOwogCQkJcHJpbnRrKEtFUk5fRVJSCkBAIC04MDcsNyArODExLDcgQEAKIH0KIAogc3NpemVfdCBfX21vZHZlcl92ZXJzaW9uX3Nob3coc3RydWN0IG1vZHVsZV9hdHRyaWJ1dGUgKm1hdHRyLAotCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbW9kLCBjaGFyICpidWYpCisJCQkgICAgICBzdHJ1Y3QgbW9kdWxlX2tvYmplY3QgKm1rLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IG1vZHVsZV92ZXJzaW9uX2F0dHJpYnV0ZSAqdmF0dHIgPQogCQljb250YWluZXJfb2YobWF0dHIsIHN0cnVjdCBtb2R1bGVfdmVyc2lvbl9hdHRyaWJ1dGUsIG1hdHRyKTsKQEAgLTg1Miw3ICs4NTYsNyBAQAogCWlmICghYXR0cmlidXRlLT5zaG93KQogCQlyZXR1cm4gLUVJTzsKIAotCXJldCA9IGF0dHJpYnV0ZS0+c2hvdyhhdHRyaWJ1dGUsIG1rLT5tb2QsIGJ1Zik7CisJcmV0ID0gYXR0cmlidXRlLT5zaG93KGF0dHJpYnV0ZSwgbWssIGJ1Zik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtODcxLDcgKzg3NSw3IEBACiAJaWYgKCFhdHRyaWJ1dGUtPnN0b3JlKQogCQlyZXR1cm4gLUVJTzsKIAotCXJldCA9IGF0dHJpYnV0ZS0+c3RvcmUoYXR0cmlidXRlLCBtay0+bW9kLCBidWYsIGxlbik7CisJcmV0ID0gYXR0cmlidXRlLT5zdG9yZShhdHRyaWJ1dGUsIG1rLCBidWYsIGxlbik7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3BpZC5jIGIva2VybmVsL3BpZC5jCmluZGV4IDU3YTgzNDYuLmU0MzIwNTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9waWQuYworKysgYi9rZXJuZWwvcGlkLmMKQEAgLTQwNSw3ICs0MDUsNiBAQAogCWlmIChwaWQpIHsKIAkJc3RydWN0IGhsaXN0X25vZGUgKmZpcnN0OwogCQlmaXJzdCA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhobGlzdF9maXJzdF9yY3UoJnBpZC0+dGFza3NbdHlwZV0pLAotCQkJCQkgICAgICByY3VfcmVhZF9sb2NrX2hlbGQoKSB8fAogCQkJCQkgICAgICBsb2NrZGVwX3Rhc2tsaXN0X2xvY2tfaXNfaGVsZCgpKTsKIAkJaWYgKGZpcnN0KQogCQkJcmVzdWx0ID0gaGxpc3RfZW50cnkoZmlyc3QsIHN0cnVjdCB0YXNrX3N0cnVjdCwgcGlkc1sodHlwZSldLm5vZGUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BtX3Fvc19wYXJhbXMuYyBiL2tlcm5lbC9wbV9xb3NfcGFyYW1zLmMKaW5kZXggNjgyNGNhNy4uMzdmMDVkMCAxMDA2NDQKLS0tIGEva2VybmVsL3BtX3Fvc19wYXJhbXMuYworKysgYi9rZXJuZWwvcG1fcW9zX3BhcmFtcy5jCkBAIC03NCw3ICs3NCw3IEBACiBzdGF0aWMgc3RydWN0IHBtX3Fvc19vYmplY3QgbnVsbF9wbV9xb3M7CiBzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChjcHVfZG1hX2xhdF9ub3RpZmllcik7CiBzdGF0aWMgc3RydWN0IHBtX3Fvc19vYmplY3QgY3B1X2RtYV9wbV9xb3MgPSB7Ci0JLnJlcXVlc3RzID0gUExJU1RfSEVBRF9JTklUKGNwdV9kbWFfcG1fcW9zLnJlcXVlc3RzLCBwbV9xb3NfbG9jayksCisJLnJlcXVlc3RzID0gUExJU1RfSEVBRF9JTklUKGNwdV9kbWFfcG1fcW9zLnJlcXVlc3RzKSwKIAkubm90aWZpZXJzID0gJmNwdV9kbWFfbGF0X25vdGlmaWVyLAogCS5uYW1lID0gImNwdV9kbWFfbGF0ZW5jeSIsCiAJLnRhcmdldF92YWx1ZSA9IFBNX1FPU19DUFVfRE1BX0xBVF9ERUZBVUxUX1ZBTFVFLApAQCAtODQsNyArODQsNyBAQAogCiBzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChuZXR3b3JrX2xhdF9ub3RpZmllcik7CiBzdGF0aWMgc3RydWN0IHBtX3Fvc19vYmplY3QgbmV0d29ya19sYXRfcG1fcW9zID0gewotCS5yZXF1ZXN0cyA9IFBMSVNUX0hFQURfSU5JVChuZXR3b3JrX2xhdF9wbV9xb3MucmVxdWVzdHMsIHBtX3Fvc19sb2NrKSwKKwkucmVxdWVzdHMgPSBQTElTVF9IRUFEX0lOSVQobmV0d29ya19sYXRfcG1fcW9zLnJlcXVlc3RzKSwKIAkubm90aWZpZXJzID0gJm5ldHdvcmtfbGF0X25vdGlmaWVyLAogCS5uYW1lID0gIm5ldHdvcmtfbGF0ZW5jeSIsCiAJLnRhcmdldF92YWx1ZSA9IFBNX1FPU19ORVRXT1JLX0xBVF9ERUZBVUxUX1ZBTFVFLApAQCAtOTUsNyArOTUsNyBAQAogCiBzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChuZXR3b3JrX3Rocm91Z2hwdXRfbm90aWZpZXIpOwogc3RhdGljIHN0cnVjdCBwbV9xb3Nfb2JqZWN0IG5ldHdvcmtfdGhyb3VnaHB1dF9wbV9xb3MgPSB7Ci0JLnJlcXVlc3RzID0gUExJU1RfSEVBRF9JTklUKG5ldHdvcmtfdGhyb3VnaHB1dF9wbV9xb3MucmVxdWVzdHMsIHBtX3Fvc19sb2NrKSwKKwkucmVxdWVzdHMgPSBQTElTVF9IRUFEX0lOSVQobmV0d29ya190aHJvdWdocHV0X3BtX3Fvcy5yZXF1ZXN0cyksCiAJLm5vdGlmaWVycyA9ICZuZXR3b3JrX3Rocm91Z2hwdXRfbm90aWZpZXIsCiAJLm5hbWUgPSAibmV0d29ya190aHJvdWdocHV0IiwKIAkudGFyZ2V0X3ZhbHVlID0gUE1fUU9TX05FVFdPUktfVEhST1VHSFBVVF9ERUZBVUxUX1ZBTFVFLApkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL0tjb25maWcgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwppbmRleCA4N2Y0ZDI0Li5iMTkxNGNiOSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL0tjb25maWcKKysrIGIva2VybmVsL3Bvd2VyL0tjb25maWcKQEAgLTE5Myw4ICsxOTMsOCBAQAogCSAgbm90aWZpY2F0aW9uIG9mIEFQTSAiZXZlbnRzIiAoZS5nLiBiYXR0ZXJ5IHN0YXR1cyBjaGFuZ2UpLgogCiAJICBJbiBvcmRlciB0byB1c2UgQVBNLCB5b3Ugd2lsbCBuZWVkIHN1cHBvcnRpbmcgc29mdHdhcmUuIEZvciBsb2NhdGlvbgotCSAgYW5kIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9wb3dlci9wbS50eHQ+IGFuZCB0aGUKLQkgIEJhdHRlcnkgUG93ZXJlZCBMaW51eCBtaW5pLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgYW5kIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9wb3dlci9hcG0tYWNwaS50eHQ+CisJICBhbmQgdGhlIEJhdHRlcnkgUG93ZXJlZCBMaW51eCBtaW5pLUhPV1RPLCBhdmFpbGFibGUgZnJvbQogCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KIAogCSAgVGhpcyBkcml2ZXIgZG9lcyBub3Qgc3BpbiBkb3duIGRpc2sgZHJpdmVzIChzZWUgdGhlIGhkcGFybSg4KQpAQCAtMjI0LDYgKzIyNCwxMCBAQAogCSAgaW1wbGVtZW50YXRpb25zIGEgcmVhZHkgdG8gdXNlIGZyYW1ld29yayB0byBtYW5hZ2UgT1BQcy4KIAkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vcG93ZXIvb3BwLnR4dD4KIAotY29uZmlnIFBNX1JVTlRJTUVfQ0xLCitjb25maWcgUE1fQ0xLCiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gUE1fUlVOVElNRSAmJiBIQVZFX0NMSworCWRlcGVuZHMgb24gUE0gJiYgSEFWRV9DTEsKKworY29uZmlnIFBNX0dFTkVSSUNfRE9NQUlOUworCWJvb2wKKwlkZXBlbmRzIG9uIFBNCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvbWFpbi5jIGIva2VybmVsL3Bvd2VyL21haW4uYwppbmRleCAyOTgxYWY0Li42YzYwMWY4IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvbWFpbi5jCisrKyBiL2tlcm5lbC9wb3dlci9tYWluLmMKQEAgLTM3LDggKzM3LDkgQEAKIAogaW50IHBtX25vdGlmaWVyX2NhbGxfY2hhaW4odW5zaWduZWQgbG9uZyB2YWwpCiB7Ci0JcmV0dXJuIChibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZwbV9jaGFpbl9oZWFkLCB2YWwsIE5VTEwpCi0JCQk9PSBOT1RJRllfQkFEKSA/IC1FSU5WQUwgOiAwOworCWludCByZXQgPSBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZwbV9jaGFpbl9oZWFkLCB2YWwsIE5VTEwpOworCisJcmV0dXJuIG5vdGlmaWVyX3RvX2Vycm5vKHJldCk7CiB9CiAKIC8qIElmIHNldCwgZGV2aWNlcyBtYXkgYmUgc3VzcGVuZGVkIGFuZCByZXN1bWVkIGFzeW5jaHJvbm91c2x5LiAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwppbmRleCBhY2U1NTg4Li4wNmVmYTU0IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYworKysgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwpAQCAtMTIxMSw3ICsxMjExLDExIEBACiAJCXRvX2ZyZWVfaGlnaG1lbSA9IGFsbG9jX2hpZ2htZW0gLSBzYXZlOwogCX0gZWxzZSB7CiAJCXRvX2ZyZWVfaGlnaG1lbSA9IDA7Ci0JCXRvX2ZyZWVfbm9ybWFsIC09IHNhdmUgLSBhbGxvY19oaWdobWVtOworCQlzYXZlIC09IGFsbG9jX2hpZ2htZW07CisJCWlmICh0b19mcmVlX25vcm1hbCA+IHNhdmUpCisJCQl0b19mcmVlX25vcm1hbCAtPSBzYXZlOworCQllbHNlCisJCQl0b19mcmVlX25vcm1hbCA9IDA7CiAJfQogCiAJbWVtb3J5X2JtX3Bvc2l0aW9uX3Jlc2V0KCZjb3B5X2JtKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCmluZGV4IDFjNDFiYTIuLmI2YjcxYWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKKysrIGIva2VybmVsL3Bvd2VyL3N1c3BlbmQuYwpAQCAtNDQsNiArNDQsNyBAQAogCXN1c3BlbmRfb3BzID0gb3BzOwogCW11dGV4X3VubG9jaygmcG1fbXV0ZXgpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc3VzcGVuZF9zZXRfb3BzKTsKIAogYm9vbCB2YWxpZF9zdGF0ZShzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCiB7CkBAIC02NSw2ICs2Niw3IEBACiB7CiAJcmV0dXJuIHN0YXRlID09IFBNX1NVU1BFTkRfTUVNOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc3VzcGVuZF92YWxpZF9vbmx5X21lbSk7CiAKIHN0YXRpYyBpbnQgc3VzcGVuZF90ZXN0KGludCBsZXZlbCkKIHsKQEAgLTEyNiwxMiArMTI4LDEzIEBACiB9CiAKIC8qKgotICoJc3VzcGVuZF9lbnRlciAtIGVudGVyIHRoZSBkZXNpcmVkIHN5c3RlbSBzbGVlcCBzdGF0ZS4KLSAqCUBzdGF0ZToJCXN0YXRlIHRvIGVudGVyCisgKiBzdXNwZW5kX2VudGVyIC0gZW50ZXIgdGhlIGRlc2lyZWQgc3lzdGVtIHNsZWVwIHN0YXRlLgorICogQHN0YXRlOiBTdGF0ZSB0byBlbnRlcgorICogQHdha2V1cDogUmV0dXJucyBpbmZvcm1hdGlvbiB0aGF0IHN1c3BlbmQgc2hvdWxkIG5vdCBiZSBlbnRlcmVkIGFnYWluLgogICoKLSAqCVRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBkZXZpY2VzIGhhdmUgYmVlbiBzdXNwZW5kZWQuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgZGV2aWNlcyBoYXZlIGJlZW4gc3VzcGVuZGVkLgogICovCi1zdGF0aWMgaW50IHN1c3BlbmRfZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQorc3RhdGljIGludCBzdXNwZW5kX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSwgYm9vbCAqd2FrZXVwKQogewogCWludCBlcnJvcjsKIApAQCAtMTY1LDcgKzE2OCw4IEBACiAKIAllcnJvciA9IHN5c2NvcmVfc3VzcGVuZCgpOwogCWlmICghZXJyb3IpIHsKLQkJaWYgKCEoc3VzcGVuZF90ZXN0KFRFU1RfQ09SRSkgfHwgcG1fd2FrZXVwX3BlbmRpbmcoKSkpIHsKKwkJKndha2V1cCA9IHBtX3dha2V1cF9wZW5kaW5nKCk7CisJCWlmICghKHN1c3BlbmRfdGVzdChURVNUX0NPUkUpIHx8ICp3YWtldXApKSB7CiAJCQllcnJvciA9IHN1c3BlbmRfb3BzLT5lbnRlcihzdGF0ZSk7CiAJCQlldmVudHNfY2hlY2tfZW5hYmxlZCA9IGZhbHNlOwogCQl9CkBAIC0xOTksNiArMjAzLDcgQEAKIGludCBzdXNwZW5kX2RldmljZXNfYW5kX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKIHsKIAlpbnQgZXJyb3I7CisJYm9vbCB3YWtldXAgPSBmYWxzZTsKIAogCWlmICghc3VzcGVuZF9vcHMpCiAJCXJldHVybiAtRU5PU1lTOwpAQCAtMjIwLDcgKzIyNSwxMCBAQAogCWlmIChzdXNwZW5kX3Rlc3QoVEVTVF9ERVZJQ0VTKSkKIAkJZ290byBSZWNvdmVyX3BsYXRmb3JtOwogCi0JZXJyb3IgPSBzdXNwZW5kX2VudGVyKHN0YXRlKTsKKwlkbyB7CisJCWVycm9yID0gc3VzcGVuZF9lbnRlcihzdGF0ZSwgJndha2V1cCk7CisJfSB3aGlsZSAoIWVycm9yICYmICF3YWtldXAKKwkJJiYgc3VzcGVuZF9vcHMtPnN1c3BlbmRfYWdhaW4gJiYgc3VzcGVuZF9vcHMtPnN1c3BlbmRfYWdhaW4oKSk7CiAKICBSZXN1bWVfZGV2aWNlczoKIAlzdXNwZW5kX3Rlc3Rfc3RhcnQoKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci91c2VyLmMgYi9rZXJuZWwvcG93ZXIvdXNlci5jCmluZGV4IDdkMDJkMzMuLjQyZGRiYzYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci91c2VyLmMKKysrIGIva2VybmVsL3Bvd2VyL3VzZXIuYwpAQCAtMTEzLDggKzExMywxMCBAQAogCQlpZiAoZXJyb3IpCiAJCQlwbV9ub3RpZmllcl9jYWxsX2NoYWluKFBNX1BPU1RfUkVTVE9SRSk7CiAJfQotCWlmIChlcnJvcikKKwlpZiAoZXJyb3IpIHsKKwkJZnJlZV9iYXNpY19tZW1vcnlfYml0bWFwcygpOwogCQlhdG9taWNfaW5jKCZzbmFwc2hvdF9kZXZpY2VfYXZhaWxhYmxlKTsKKwl9CiAJZGF0YS0+ZnJvemVuID0gMDsKIAlkYXRhLT5yZWFkeSA9IDA7CiAJZGF0YS0+cGxhdGZvcm1fc3VwcG9ydCA9IDA7CmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrLmMgYi9rZXJuZWwvcHJpbnRrLmMKaW5kZXggMzUxODUzOS4uMzdkZmYzNCAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay5jCisrKyBiL2tlcm5lbC9wcmludGsuYwpAQCAtNzgyLDcgKzc4Miw3IEBACiBzdGF0aWMgaW50IGNvbnNvbGVfdHJ5bG9ja19mb3JfcHJpbnRrKHVuc2lnbmVkIGludCBjcHUpCiAJX19yZWxlYXNlcygmbG9nYnVmX2xvY2spCiB7Ci0JaW50IHJldHZhbCA9IDA7CisJaW50IHJldHZhbCA9IDAsIHdha2UgPSAwOwogCiAJaWYgKGNvbnNvbGVfdHJ5bG9jaygpKSB7CiAJCXJldHZhbCA9IDE7CkBAIC03OTUsMTIgKzc5NSwxNCBAQAogCQkgKi8KIAkJaWYgKCFjYW5fdXNlX2NvbnNvbGUoY3B1KSkgewogCQkJY29uc29sZV9sb2NrZWQgPSAwOwotCQkJdXAoJmNvbnNvbGVfc2VtKTsKKwkJCXdha2UgPSAxOwogCQkJcmV0dmFsID0gMDsKIAkJfQogCX0KIAlwcmludGtfY3B1ID0gVUlOVF9NQVg7CiAJc3Bpbl91bmxvY2soJmxvZ2J1Zl9sb2NrKTsKKwlpZiAod2FrZSkKKwkJdXAoJmNvbnNvbGVfc2VtKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogc3RhdGljIGNvbnN0IGNoYXIgcmVjdXJzaW9uX2J1Z19tc2cgW10gPQpAQCAtMTI0Miw3ICsxMjQ0LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIF9jb25fc3RhcnQsIF9sb2dfZW5kOwotCXVuc2lnbmVkIHdha2Vfa2xvZ2QgPSAwOworCXVuc2lnbmVkIHdha2Vfa2xvZ2QgPSAwLCByZXRyeSA9IDA7CiAKIAlpZiAoY29uc29sZV9zdXNwZW5kZWQpIHsKIAkJdXAoJmNvbnNvbGVfc2VtKTsKQEAgLTEyNTEsNiArMTI1Myw3IEBACiAKIAljb25zb2xlX21heV9zY2hlZHVsZSA9IDA7CiAKK2FnYWluOgogCWZvciAoIDsgOyApIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CiAJCXdha2Vfa2xvZ2QgfD0gbG9nX3N0YXJ0IC0gbG9nX2VuZDsKQEAgLTEyNzEsOCArMTI3NCwyMyBAQAogCWlmICh1bmxpa2VseShleGNsdXNpdmVfY29uc29sZSkpCiAJCWV4Y2x1c2l2ZV9jb25zb2xlID0gTlVMTDsKIAorCXNwaW5fdW5sb2NrKCZsb2didWZfbG9jayk7CisKIAl1cCgmY29uc29sZV9zZW0pOworCisJLyoKKwkgKiBTb21lb25lIGNvdWxkIGhhdmUgZmlsbGVkIHVwIHRoZSBidWZmZXIgYWdhaW4sIHNvIHJlLWNoZWNrIGlmIHRoZXJlJ3MKKwkgKiBzb21ldGhpbmcgdG8gZmx1c2guIEluIGNhc2Ugd2UgY2Fubm90IHRyeWxvY2sgdGhlIGNvbnNvbGVfc2VtIGFnYWluLAorCSAqIHRoZXJlJ3MgYSBuZXcgb3duZXIgYW5kIHRoZSBjb25zb2xlX3VubG9jaygpIGZyb20gdGhlbSB3aWxsIGRvIHRoZQorCSAqIGZsdXNoLCBubyB3b3JyaWVzLgorCSAqLworCXNwaW5fbG9jaygmbG9nYnVmX2xvY2spOworCWlmIChjb25fc3RhcnQgIT0gbG9nX2VuZCkKKwkJcmV0cnkgPSAxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CisJaWYgKHJldHJ5ICYmIGNvbnNvbGVfdHJ5bG9jaygpKQorCQlnb3RvIGFnYWluOworCiAJaWYgKHdha2Vfa2xvZ2QpCiAJCXdha2VfdXBfa2xvZ2QoKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wdHJhY2UuYyBiL2tlcm5lbC9wdHJhY2UuYwppbmRleCAyZGYxMTU3Li45ZGUzZWNmIDEwMDY0NAotLS0gYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIva2VybmVsL3B0cmFjZS5jCkBAIC0yMyw4ICsyMywxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9yZWdzZXQuaD4KICNpbmNsdWRlIDxsaW51eC9od19icmVha3BvaW50Lmg+CisjaW5jbHVkZSA8bGludXgvY25fcHJvYy5oPgogCiAKK3N0YXRpYyBpbnQgcHRyYWNlX3RyYXBwaW5nX3NsZWVwX2ZuKHZvaWQgKmZsYWdzKQoreworCXNjaGVkdWxlKCk7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBwdHJhY2UgYSB0YXNrOiBtYWtlIHRoZSBkZWJ1Z2dlciBpdHMgbmV3IHBhcmVudCBhbmQKICAqIG1vdmUgaXQgdG8gdGhlIHB0cmFjZSBsaXN0LgpAQCAtNzcsMTMgKzg0LDIwIEBACiAJc3Bpbl9sb2NrKCZjaGlsZC0+c2lnaGFuZC0+c2lnbG9jayk7CiAKIAkvKgotCSAqIFJlaW5zdGF0ZSBHUk9VUF9TVE9QX1BFTkRJTkcgaWYgZ3JvdXAgc3RvcCBpcyBpbiBlZmZlY3QgYW5kCisJICogQ2xlYXIgYWxsIHBlbmRpbmcgdHJhcHMgYW5kIFRSQVBQSU5HLiAgVFJBUFBJTkcgc2hvdWxkIGJlCisJICogY2xlYXJlZCByZWdhcmRsZXNzIG9mIEpPQkNUTF9TVE9QX1BFTkRJTkcuICBEbyBpdCBleHBsaWNpdGx5LgorCSAqLworCXRhc2tfY2xlYXJfam9iY3RsX3BlbmRpbmcoY2hpbGQsIEpPQkNUTF9UUkFQX01BU0spOworCXRhc2tfY2xlYXJfam9iY3RsX3RyYXBwaW5nKGNoaWxkKTsKKworCS8qCisJICogUmVpbnN0YXRlIEpPQkNUTF9TVE9QX1BFTkRJTkcgaWYgZ3JvdXAgc3RvcCBpcyBpbiBlZmZlY3QgYW5kCiAJICogQGNoaWxkIGlzbid0IGRlYWQuCiAJICovCiAJaWYgKCEoY2hpbGQtPmZsYWdzICYgUEZfRVhJVElORykgJiYKIAkgICAgKGNoaWxkLT5zaWduYWwtPmZsYWdzICYgU0lHTkFMX1NUT1BfU1RPUFBFRCB8fAogCSAgICAgY2hpbGQtPnNpZ25hbC0+Z3JvdXBfc3RvcF9jb3VudCkpCi0JCWNoaWxkLT5ncm91cF9zdG9wIHw9IEdST1VQX1NUT1BfUEVORElORzsKKwkJY2hpbGQtPmpvYmN0bCB8PSBKT0JDVExfU1RPUF9QRU5ESU5HOwogCiAJLyoKIAkgKiBJZiB0cmFuc2l0aW9uIHRvIFRBU0tfU1RPUFBFRCBpcyBwZW5kaW5nIG9yIGluIFRBU0tfVFJBQ0VELCBraWNrCkBAIC05MSwxNiArMTA1LDMwIEBACiAJICogaXMgaW4gVEFTS19UUkFDRUQ7IG90aGVyd2lzZSwgd2UgbWlnaHQgdW5kdWx5IGRpc3J1cHQKIAkgKiBUQVNLX0tJTExBQkxFIHNsZWVwcy4KIAkgKi8KLQlpZiAoY2hpbGQtPmdyb3VwX3N0b3AgJiBHUk9VUF9TVE9QX1BFTkRJTkcgfHwgdGFza19pc190cmFjZWQoY2hpbGQpKQorCWlmIChjaGlsZC0+am9iY3RsICYgSk9CQ1RMX1NUT1BfUEVORElORyB8fCB0YXNrX2lzX3RyYWNlZChjaGlsZCkpCiAJCXNpZ25hbF93YWtlX3VwKGNoaWxkLCB0YXNrX2lzX3RyYWNlZChjaGlsZCkpOwogCiAJc3Bpbl91bmxvY2soJmNoaWxkLT5zaWdoYW5kLT5zaWdsb2NrKTsKIH0KIAotLyoKLSAqIENoZWNrIHRoYXQgd2UgaGF2ZSBpbmRlZWQgYXR0YWNoZWQgdG8gdGhlIHRoaW5nLi4KKy8qKgorICogcHRyYWNlX2NoZWNrX2F0dGFjaCAtIGNoZWNrIHdoZXRoZXIgcHRyYWNlZSBpcyByZWFkeSBmb3IgcHRyYWNlIG9wZXJhdGlvbgorICogQGNoaWxkOiBwdHJhY2VlIHRvIGNoZWNrIGZvcgorICogQGlnbm9yZV9zdGF0ZTogZG9uJ3QgY2hlY2sgd2hldGhlciBAY2hpbGQgaXMgY3VycmVudGx5ICVUQVNLX1RSQUNFRAorICoKKyAqIENoZWNrIHdoZXRoZXIgQGNoaWxkIGlzIGJlaW5nIHB0cmFjZWQgYnkgJWN1cnJlbnQgYW5kIHJlYWR5IGZvciBmdXJ0aGVyCisgKiBwdHJhY2Ugb3BlcmF0aW9ucy4gIElmIEBpZ25vcmVfc3RhdGUgaXMgJWZhbHNlLCBAY2hpbGQgYWxzbyBzaG91bGQgYmUgaW4KKyAqICVUQVNLX1RSQUNFRCBzdGF0ZSBhbmQgb24gcmV0dXJuIHRoZSBjaGlsZCBpcyBndWFyYW50ZWVkIHRvIGJlIHRyYWNlZAorICogYW5kIG5vdCBleGVjdXRpbmcuICBJZiBAaWdub3JlX3N0YXRlIGlzICV0cnVlLCBAY2hpbGQgY2FuIGJlIGluIGFueQorICogc3RhdGUuCisgKgorICogQ09OVEVYVDoKKyAqIEdyYWJzIGFuZCByZWxlYXNlcyB0YXNrbGlzdF9sb2NrIGFuZCBAY2hpbGQtPnNpZ2hhbmQtPnNpZ2xvY2suCisgKgorICogUkVUVVJOUzoKKyAqIDAgb24gc3VjY2VzcywgLUVTUkNIIGlmICVjaGlsZCBpcyBub3QgcmVhZHkuCiAgKi8KLWludCBwdHJhY2VfY2hlY2tfYXR0YWNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGludCBraWxsKQoraW50IHB0cmFjZV9jaGVja19hdHRhY2goc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgYm9vbCBpZ25vcmVfc3RhdGUpCiB7CiAJaW50IHJldCA9IC1FU1JDSDsKIApAQCAtMTE5LDEzICsxNDcsMTQgQEAKIAkJICovCiAJCXNwaW5fbG9ja19pcnEoJmNoaWxkLT5zaWdoYW5kLT5zaWdsb2NrKTsKIAkJV0FSTl9PTl9PTkNFKHRhc2tfaXNfc3RvcHBlZChjaGlsZCkpOwotCQlpZiAodGFza19pc190cmFjZWQoY2hpbGQpIHx8IGtpbGwpCisJCWlmIChpZ25vcmVfc3RhdGUgfHwgKHRhc2tfaXNfdHJhY2VkKGNoaWxkKSAmJgorCQkJCSAgICAgIShjaGlsZC0+am9iY3RsICYgSk9CQ1RMX0xJU1RFTklORykpKQogCQkJcmV0ID0gMDsKIAkJc3Bpbl91bmxvY2tfaXJxKCZjaGlsZC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJfQogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAotCWlmICghcmV0ICYmICFraWxsKQorCWlmICghcmV0ICYmICFpZ25vcmVfc3RhdGUpCiAJCXJldCA9IHdhaXRfdGFza19pbmFjdGl2ZShjaGlsZCwgVEFTS19UUkFDRUQpID8gMCA6IC1FU1JDSDsKIAogCS8qIEFsbCBzeXN0ZW1zIGdvLi4gKi8KQEAgLTE4MiwxMSArMjExLDI4IEBACiAJcmV0dXJuICFlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcHRyYWNlX2F0dGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCitzdGF0aWMgaW50IHB0cmFjZV9hdHRhY2goc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBsb25nIHJlcXVlc3QsCisJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlib29sIHdhaXRfdHJhcCA9IGZhbHNlOworCWJvb2wgc2VpemUgPSAocmVxdWVzdCA9PSBQVFJBQ0VfU0VJWkUpOwogCWludCByZXR2YWw7CiAKKwkvKgorCSAqIFNFSVpFIHdpbGwgZW5hYmxlIG5ldyBwdHJhY2UgYmVoYXZpb3JzIHdoaWNoIHdpbGwgYmUgaW1wbGVtZW50ZWQKKwkgKiBncmFkdWFsbHkuICBTRUlaRV9ERVZFTCBpcyB1c2VkIHRvIHByZXZlbnQgYXBwbGljYXRpb25zCisJICogZXhwZWN0aW5nIGZ1bGwgU0VJWkUgYmVoYXZpb3JzIHRyYXBwaW5nIG9uIGtlcm5lbCBjb21taXRzIHdoaWNoCisJICogYXJlIHN0aWxsIGluIHRoZSBwcm9jZXNzIG9mIGltcGxlbWVudGluZyB0aGVtLgorCSAqCisJICogT25seSB0ZXN0IHByb2dyYW1zIGZvciBuZXcgcHRyYWNlIGJlaGF2aW9ycyBiZWluZyBpbXBsZW1lbnRlZAorCSAqIHNob3VsZCBzZXQgU0VJWkVfREVWRUwuICBJZiB1bnNldCwgU0VJWkUgd2lsbCBmYWlsIHdpdGggLUVJTy4KKwkgKgorCSAqIE9uY2UgU0VJWkUgYmVoYXZpb3JzIGFyZSBjb21wbGV0ZWx5IGltcGxlbWVudGVkLCB0aGlzIGZsYWcgYW5kCisJICogdGhlIGZvbGxvd2luZyB0ZXN0IHdpbGwgYmUgcmVtb3ZlZC4KKwkgKi8KKwlyZXR2YWwgPSAtRUlPOworCWlmIChzZWl6ZSAmJiAhKGZsYWdzICYgUFRSQUNFX1NFSVpFX0RFVkVMKSkKKwkJZ290byBvdXQ7CisKIAlhdWRpdF9wdHJhY2UodGFzayk7CiAKIAlyZXR2YWwgPSAtRVBFUk07CkBAIC0yMTgsMTYgKzI2NCwyMSBAQAogCQlnb3RvIHVubG9ja190YXNrbGlzdDsKIAogCXRhc2stPnB0cmFjZSA9IFBUX1BUUkFDRUQ7CisJaWYgKHNlaXplKQorCQl0YXNrLT5wdHJhY2UgfD0gUFRfU0VJWkVEOwogCWlmICh0YXNrX25zX2NhcGFibGUodGFzaywgQ0FQX1NZU19QVFJBQ0UpKQogCQl0YXNrLT5wdHJhY2UgfD0gUFRfUFRSQUNFX0NBUDsKIAogCV9fcHRyYWNlX2xpbmsodGFzaywgY3VycmVudCk7Ci0Jc2VuZF9zaWdfaW5mbyhTSUdTVE9QLCBTRU5EX1NJR19GT1JDRUQsIHRhc2spOworCisJLyogU0VJWkUgZG9lc24ndCB0cmFwIHRyYWNlZSBvbiBhdHRhY2ggKi8KKwlpZiAoIXNlaXplKQorCQlzZW5kX3NpZ19pbmZvKFNJR1NUT1AsIFNFTkRfU0lHX0ZPUkNFRCwgdGFzayk7CiAKIAlzcGluX2xvY2soJnRhc2stPnNpZ2hhbmQtPnNpZ2xvY2spOwogCiAJLyoKLQkgKiBJZiB0aGUgdGFzayBpcyBhbHJlYWR5IFNUT1BQRUQsIHNldCBHUk9VUF9TVE9QX1BFTkRJTkcgYW5kCisJICogSWYgdGhlIHRhc2sgaXMgYWxyZWFkeSBTVE9QUEVELCBzZXQgSk9CQ1RMX1RSQVBfU1RPUCBhbmQKIAkgKiBUUkFQUElORywgYW5kIGtpY2sgaXQgc28gdGhhdCBpdCB0cmFuc2l0cyB0byBUUkFDRUQuICBUUkFQUElORwogCSAqIHdpbGwgYmUgY2xlYXJlZCBpZiB0aGUgY2hpbGQgY29tcGxldGVzIHRoZSB0cmFuc2l0aW9uIG9yIGFueQogCSAqIGV2ZW50IHdoaWNoIGNsZWFycyB0aGUgZ3JvdXAgc3RvcCBzdGF0ZXMgaGFwcGVucy4gIFdlJ2xsIHdhaXQKQEAgLTI0MywxMSArMjk0LDkgQEAKIAkgKiBUaGUgZm9sbG93aW5nIHRhc2tfaXNfc3RvcHBlZCgpIHRlc3QgaXMgc2FmZSBhcyBib3RoIHRyYW5zaXRpb25zCiAJICogaW4gYW5kIG91dCBvZiBTVE9QUEVEIGFyZSBwcm90ZWN0ZWQgYnkgc2lnbG9jay4KIAkgKi8KLQlpZiAodGFza19pc19zdG9wcGVkKHRhc2spKSB7Ci0JCXRhc2stPmdyb3VwX3N0b3AgfD0gR1JPVVBfU1RPUF9QRU5ESU5HIHwgR1JPVVBfU1RPUF9UUkFQUElORzsKKwlpZiAodGFza19pc19zdG9wcGVkKHRhc2spICYmCisJICAgIHRhc2tfc2V0X2pvYmN0bF9wZW5kaW5nKHRhc2ssIEpPQkNUTF9UUkFQX1NUT1AgfCBKT0JDVExfVFJBUFBJTkcpKQogCQlzaWduYWxfd2FrZV91cCh0YXNrLCAxKTsKLQkJd2FpdF90cmFwID0gdHJ1ZTsKLQl9CiAKIAlzcGluX3VubG9jaygmdGFzay0+c2lnaGFuZC0+c2lnbG9jayk7CiAKQEAgLTI1Nyw5ICszMDYsMTIgQEAKIHVubG9ja19jcmVkczoKIAltdXRleF91bmxvY2soJnRhc2stPnNpZ25hbC0+Y3JlZF9ndWFyZF9tdXRleCk7CiBvdXQ6Ci0JaWYgKHdhaXRfdHJhcCkKLQkJd2FpdF9ldmVudChjdXJyZW50LT5zaWduYWwtPndhaXRfY2hsZGV4aXQsCi0JCQkgICAhKHRhc2stPmdyb3VwX3N0b3AgJiBHUk9VUF9TVE9QX1RSQVBQSU5HKSk7CisJaWYgKCFyZXR2YWwpIHsKKwkJd2FpdF9vbl9iaXQoJnRhc2stPmpvYmN0bCwgSk9CQ1RMX1RSQVBQSU5HX0JJVCwKKwkJCSAgICBwdHJhY2VfdHJhcHBpbmdfc2xlZXBfZm4sIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJcHJvY19wdHJhY2VfY29ubmVjdG9yKHRhc2ssIFBUUkFDRV9BVFRBQ0gpOworCX0KKwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTMyMiwyNSArMzc0LDI3IEBACiAgKi8KIHN0YXRpYyBib29sIF9fcHRyYWNlX2RldGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRyYWNlciwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogeworCWJvb2wgZGVhZDsKKwogCV9fcHRyYWNlX3VubGluayhwKTsKIAotCWlmIChwLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKSB7Ci0JCWlmICghdGFza19kZXRhY2hlZChwKSAmJiB0aHJlYWRfZ3JvdXBfZW1wdHkocCkpIHsKLQkJCWlmICghc2FtZV90aHJlYWRfZ3JvdXAocC0+cmVhbF9wYXJlbnQsIHRyYWNlcikpCi0JCQkJZG9fbm90aWZ5X3BhcmVudChwLCBwLT5leGl0X3NpZ25hbCk7Ci0JCQllbHNlIGlmIChpZ25vcmluZ19jaGlsZHJlbih0cmFjZXItPnNpZ2hhbmQpKSB7Ci0JCQkJX193YWtlX3VwX3BhcmVudChwLCB0cmFjZXIpOwotCQkJCXAtPmV4aXRfc2lnbmFsID0gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRhc2tfZGV0YWNoZWQocCkpIHsKLQkJCS8qIE1hcmsgaXQgYXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgcmVhcGVkLiAqLwotCQkJcC0+ZXhpdF9zdGF0ZSA9IEVYSVRfREVBRDsKLQkJCXJldHVybiB0cnVlOworCWlmIChwLT5leGl0X3N0YXRlICE9IEVYSVRfWk9NQklFKQorCQlyZXR1cm4gZmFsc2U7CisKKwlkZWFkID0gIXRocmVhZF9ncm91cF9sZWFkZXIocCk7CisKKwlpZiAoIWRlYWQgJiYgdGhyZWFkX2dyb3VwX2VtcHR5KHApKSB7CisJCWlmICghc2FtZV90aHJlYWRfZ3JvdXAocC0+cmVhbF9wYXJlbnQsIHRyYWNlcikpCisJCQlkZWFkID0gZG9fbm90aWZ5X3BhcmVudChwLCBwLT5leGl0X3NpZ25hbCk7CisJCWVsc2UgaWYgKGlnbm9yaW5nX2NoaWxkcmVuKHRyYWNlci0+c2lnaGFuZCkpIHsKKwkJCV9fd2FrZV91cF9wYXJlbnQocCwgdHJhY2VyKTsKKwkJCWRlYWQgPSB0cnVlOwogCQl9CiAJfQotCi0JcmV0dXJuIGZhbHNlOworCS8qIE1hcmsgaXQgYXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgcmVhcGVkLiAqLworCWlmIChkZWFkKQorCQlwLT5leGl0X3N0YXRlID0gRVhJVF9ERUFEOworCXJldHVybiBkZWFkOwogfQogCiBzdGF0aWMgaW50IHB0cmFjZV9kZXRhY2goc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgdW5zaWduZWQgaW50IGRhdGEpCkBAIC0zNjUsNiArNDE5LDcgQEAKIAl9CiAJd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CiAKKwlwcm9jX3B0cmFjZV9jb25uZWN0b3IoY2hpbGQsIFBUUkFDRV9ERVRBQ0gpOwogCWlmICh1bmxpa2VseShkZWFkKSkKIAkJcmVsZWFzZV90YXNrKGNoaWxkKTsKIApAQCAtNjExLDEwICs2NjYsMTIgQEAKIGludCBwdHJhY2VfcmVxdWVzdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsCiAJCSAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBkYXRhKQogeworCWJvb2wgc2VpemVkID0gY2hpbGQtPnB0cmFjZSAmIFBUX1NFSVpFRDsKIAlpbnQgcmV0ID0gLUVJTzsKLQlzaWdpbmZvX3Qgc2lnaW5mbzsKKwlzaWdpbmZvX3Qgc2lnaW5mbywgKnNpOwogCXZvaWQgX191c2VyICpkYXRhdnAgPSAodm9pZCBfX3VzZXIgKikgZGF0YTsKIAl1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YWxwID0gZGF0YXZwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAljYXNlIFBUUkFDRV9QRUVLVEVYVDoKQEAgLTY0Nyw2ICs3MDQsNjIgQEAKIAkJCXJldCA9IHB0cmFjZV9zZXRzaWdpbmZvKGNoaWxkLCAmc2lnaW5mbyk7CiAJCWJyZWFrOwogCisJY2FzZSBQVFJBQ0VfSU5URVJSVVBUOgorCQkvKgorCQkgKiBTdG9wIHRyYWNlZSB3aXRob3V0IGFueSBzaWRlLWVmZmVjdCBvbiBzaWduYWwgb3Igam9iCisJCSAqIGNvbnRyb2wuICBBdCBsZWFzdCBvbmUgdHJhcCBpcyBndWFyYW50ZWVkIHRvIGhhcHBlbgorCQkgKiBhZnRlciB0aGlzIHJlcXVlc3QuICBJZiBAY2hpbGQgaXMgYWxyZWFkeSB0cmFwcGVkLCB0aGUKKwkJICogY3VycmVudCB0cmFwIGlzIG5vdCBkaXN0dXJiZWQgYW5kIGFub3RoZXIgdHJhcCB3aWxsCisJCSAqIGhhcHBlbiBhZnRlciB0aGUgY3VycmVudCB0cmFwIGlzIGVuZGVkIHdpdGggUFRSQUNFX0NPTlQuCisJCSAqCisJCSAqIFRoZSBhY3R1YWwgdHJhcCBtaWdodCBub3QgYmUgUFRSQUNFX0VWRU5UX1NUT1AgdHJhcCBidXQKKwkJICogdGhlIHBlbmRpbmcgY29uZGl0aW9uIGlzIGNsZWFyZWQgcmVnYXJkbGVzcy4KKwkJICovCisJCWlmICh1bmxpa2VseSghc2VpemVkIHx8ICFsb2NrX3Rhc2tfc2lnaGFuZChjaGlsZCwgJmZsYWdzKSkpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBJTlRFUlJVUFQgZG9lc24ndCBkaXN0dXJiIGV4aXN0aW5nIHRyYXAgc2FucyBvbmUKKwkJICogZXhjZXB0aW9uLiAgSWYgcHRyYWNlciBpc3N1ZWQgTElTVEVOIGZvciB0aGUgY3VycmVudAorCQkgKiBTVE9QLCB0aGlzIElOVEVSUlVQVCBzaG91bGQgY2xlYXIgTElTVEVOIGFuZCByZS10cmFwCisJCSAqIHRyYWNlZSBpbnRvIFNUT1AuCisJCSAqLworCQlpZiAobGlrZWx5KHRhc2tfc2V0X2pvYmN0bF9wZW5kaW5nKGNoaWxkLCBKT0JDVExfVFJBUF9TVE9QKSkpCisJCQlzaWduYWxfd2FrZV91cChjaGlsZCwgY2hpbGQtPmpvYmN0bCAmIEpPQkNUTF9MSVNURU5JTkcpOworCisJCXVubG9ja190YXNrX3NpZ2hhbmQoY2hpbGQsICZmbGFncyk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfTElTVEVOOgorCQkvKgorCQkgKiBMaXN0ZW4gZm9yIGV2ZW50cy4gIFRyYWNlZSBtdXN0IGJlIGluIFNUT1AuICBJdCdzIG5vdAorCQkgKiByZXN1bWVkIHBlci1zZSBidXQgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgaW4gVFJBQ0VEIGJ5CisJCSAqIHdhaXQoMikgb3IgcHRyYWNlKDIpLiAgSWYgYW4gYXN5bmMgZXZlbnQgKGUuZy4gZ3JvdXAKKwkJICogc3RvcCBzdGF0ZSBjaGFuZ2UpIGhhcHBlbnMsIHRyYWNlZSB3aWxsIGVudGVyIFNUT1AgdHJhcAorCQkgKiBhZ2Fpbi4gIEFsdGVybmF0aXZlbHksIHB0cmFjZXIgY2FuIGlzc3VlIElOVEVSUlVQVCB0bworCQkgKiBmaW5pc2ggbGlzdGVuaW5nIGFuZCByZS10cmFwIHRyYWNlZSBpbnRvIFNUT1AuCisJCSAqLworCQlpZiAodW5saWtlbHkoIXNlaXplZCB8fCAhbG9ja190YXNrX3NpZ2hhbmQoY2hpbGQsICZmbGFncykpKQorCQkJYnJlYWs7CisKKwkJc2kgPSBjaGlsZC0+bGFzdF9zaWdpbmZvOworCQlpZiAodW5saWtlbHkoIXNpIHx8IHNpLT5zaV9jb2RlID4+IDggIT0gUFRSQUNFX0VWRU5UX1NUT1ApKQorCQkJYnJlYWs7CisKKwkJY2hpbGQtPmpvYmN0bCB8PSBKT0JDVExfTElTVEVOSU5HOworCisJCS8qCisJCSAqIElmIE5PVElGWSBpcyBzZXQsIGl0IG1lYW5zIGV2ZW50IGhhcHBlbmVkIGJldHdlZW4gc3RhcnQKKwkJICogb2YgdGhpcyB0cmFwIGFuZCBub3cuICBUcmlnZ2VyIHJlLXRyYXAgaW1tZWRpYXRlbHkuCisJCSAqLworCQlpZiAoY2hpbGQtPmpvYmN0bCAmIEpPQkNUTF9UUkFQX05PVElGWSkKKwkJCXNpZ25hbF93YWtlX3VwKGNoaWxkLCB0cnVlKTsKKworCQl1bmxvY2tfdGFza19zaWdoYW5kKGNoaWxkLCAmZmxhZ3MpOworCQlyZXQgPSAwOworCQlicmVhazsKKwogCWNhc2UgUFRSQUNFX0RFVEFDSDoJIC8qIGRldGFjaCBhIHByb2Nlc3MgdGhhdCB3YXMgYXR0YWNoZWQuICovCiAJCXJldCA9IHB0cmFjZV9kZXRhY2goY2hpbGQsIGRhdGEpOwogCQlicmVhazsKQEAgLTc2MSw4ICs4NzQsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfQVRUQUNIKSB7Ci0JCXJldCA9IHB0cmFjZV9hdHRhY2goY2hpbGQpOworCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9BVFRBQ0ggfHwgcmVxdWVzdCA9PSBQVFJBQ0VfU0VJWkUpIHsKKwkJcmV0ID0gcHRyYWNlX2F0dGFjaChjaGlsZCwgcmVxdWVzdCwgZGF0YSk7CiAJCS8qCiAJCSAqIFNvbWUgYXJjaGl0ZWN0dXJlcyBuZWVkIHRvIGRvIGJvb2sta2VlcGluZyBhZnRlcgogCQkgKiBhIHB0cmFjZSBhdHRhY2guCkBAIC03NzIsNyArODg1LDggQEAKIAkJZ290byBvdXRfcHV0X3Rhc2tfc3RydWN0OwogCX0KIAotCXJldCA9IHB0cmFjZV9jaGVja19hdHRhY2goY2hpbGQsIHJlcXVlc3QgPT0gUFRSQUNFX0tJTEwpOworCXJldCA9IHB0cmFjZV9jaGVja19hdHRhY2goY2hpbGQsIHJlcXVlc3QgPT0gUFRSQUNFX0tJTEwgfHwKKwkJCQkgIHJlcXVlc3QgPT0gUFRSQUNFX0lOVEVSUlVQVCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X3B1dF90YXNrX3N0cnVjdDsKIApAQCAtOTAzLDggKzEwMTcsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfQVRUQUNIKSB7Ci0JCXJldCA9IHB0cmFjZV9hdHRhY2goY2hpbGQpOworCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9BVFRBQ0ggfHwgcmVxdWVzdCA9PSBQVFJBQ0VfU0VJWkUpIHsKKwkJcmV0ID0gcHRyYWNlX2F0dGFjaChjaGlsZCwgcmVxdWVzdCwgZGF0YSk7CiAJCS8qCiAJCSAqIFNvbWUgYXJjaGl0ZWN0dXJlcyBuZWVkIHRvIGRvIGJvb2sta2VlcGluZyBhZnRlcgogCQkgKiBhIHB0cmFjZSBhdHRhY2guCkBAIC05MTQsNyArMTAyOCw4IEBACiAJCWdvdG8gb3V0X3B1dF90YXNrX3N0cnVjdDsKIAl9CiAKLQlyZXQgPSBwdHJhY2VfY2hlY2tfYXR0YWNoKGNoaWxkLCByZXF1ZXN0ID09IFBUUkFDRV9LSUxMKTsKKwlyZXQgPSBwdHJhY2VfY2hlY2tfYXR0YWNoKGNoaWxkLCByZXF1ZXN0ID09IFBUUkFDRV9LSUxMIHx8CisJCQkJICByZXF1ZXN0ID09IFBUUkFDRV9JTlRFUlJVUFQpOwogCWlmICghcmV0KQogCQlyZXQgPSBjb21wYXRfYXJjaF9wdHJhY2UoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dG9ydHVyZS5jIGIva2VybmVsL3JjdXRvcnR1cmUuYwppbmRleCAyZTEzOGRiLi5jZWQ3MjEwIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dG9ydHVyZS5jCisrKyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKQEAgLTk0MSw3ICs5NDEsNiBAQAogCWlkeCA9IGN1cl9vcHMtPnJlYWRsb2NrKCk7CiAJY29tcGxldGVkID0gY3VyX29wcy0+Y29tcGxldGVkKCk7CiAJcCA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhyY3VfdG9ydHVyZV9jdXJyZW50LAotCQkJCSAgcmN1X3JlYWRfbG9ja19oZWxkKCkgfHwKIAkJCQkgIHJjdV9yZWFkX2xvY2tfYmhfaGVsZCgpIHx8CiAJCQkJICByY3VfcmVhZF9sb2NrX3NjaGVkX2hlbGQoKSB8fAogCQkJCSAgc3JjdV9yZWFkX2xvY2tfaGVsZCgmc3JjdV9jdGwpKTsKQEAgLTEwMDIsNyArMTAwMSw2IEBACiAJCWlkeCA9IGN1cl9vcHMtPnJlYWRsb2NrKCk7CiAJCWNvbXBsZXRlZCA9IGN1cl9vcHMtPmNvbXBsZXRlZCgpOwogCQlwID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHJjdV90b3J0dXJlX2N1cnJlbnQsCi0JCQkJCSAgcmN1X3JlYWRfbG9ja19oZWxkKCkgfHwKIAkJCQkJICByY3VfcmVhZF9sb2NrX2JoX2hlbGQoKSB8fAogCQkJCQkgIHJjdV9yZWFkX2xvY2tfc2NoZWRfaGVsZCgpIHx8CiAJCQkJCSAgc3JjdV9yZWFkX2xvY2tfaGVsZCgmc3JjdV9jdGwpKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0cmVlLmMgYi9rZXJuZWwvcmN1dHJlZS5jCmluZGV4IDg5NDE5ZmYuLmJhMDYyMDcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0cmVlLmMKKysrIGIva2VybmVsL3JjdXRyZWUuYwpAQCAtODQsMTAgKzg0LDM1IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmN1X3N0YXRlICpyY3Vfc3RhdGU7CiAKKy8qCisgKiBUaGUgcmN1X3NjaGVkdWxlcl9hY3RpdmUgdmFyaWFibGUgdHJhbnNpdGlvbnMgZnJvbSB6ZXJvIHRvIG9uZSBqdXN0CisgKiBiZWZvcmUgdGhlIGZpcnN0IHRhc2sgaXMgc3Bhd25lZC4gIFNvIHdoZW4gdGhpcyB2YXJpYWJsZSBpcyB6ZXJvLCBSQ1UKKyAqIGNhbiBhc3N1bWUgdGhhdCB0aGVyZSBpcyBidXQgb25lIHRhc2ssIGFsbG93aW5nIFJDVSB0byAoZm9yIGV4YW1wbGUpCisgKiBvcHRpbWl6ZWQgc3luY2hyb25pemVfc2NoZWQoKSB0byBhIHNpbXBsZSBiYXJyaWVyKCkuICBXaGVuIHRoaXMgdmFyaWFibGUKKyAqIGlzIG9uZSwgUkNVIG11c3QgYWN0dWFsbHkgZG8gYWxsIHRoZSBoYXJkIHdvcmsgcmVxdWlyZWQgdG8gZGV0ZWN0IHJlYWwKKyAqIGdyYWNlIHBlcmlvZHMuICBUaGlzIHZhcmlhYmxlIGlzIGFsc28gdXNlZCB0byBzdXBwcmVzcyBib290LXRpbWUgZmFsc2UKKyAqIHBvc2l0aXZlcyBmcm9tIGxvY2tkZXAtUkNVIGVycm9yIGNoZWNraW5nLgorICovCiBpbnQgcmN1X3NjaGVkdWxlcl9hY3RpdmUgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0xfR1BMKHJjdV9zY2hlZHVsZXJfYWN0aXZlKTsKIAogLyoKKyAqIFRoZSByY3Vfc2NoZWR1bGVyX2Z1bGx5X2FjdGl2ZSB2YXJpYWJsZSB0cmFuc2l0aW9ucyBmcm9tIHplcm8gdG8gb25lCisgKiBkdXJpbmcgdGhlIGVhcmx5X2luaXRjYWxsKCkgcHJvY2Vzc2luZywgd2hpY2ggaXMgYWZ0ZXIgdGhlIHNjaGVkdWxlcgorICogaXMgY2FwYWJsZSBvZiBjcmVhdGluZyBuZXcgdGFza3MuICBTbyBSQ1UgcHJvY2Vzc2luZyAoZm9yIGV4YW1wbGUsCisgKiBjcmVhdGluZyB0YXNrcyBmb3IgUkNVIHByaW9yaXR5IGJvb3N0aW5nKSBtdXN0IGJlIGRlbGF5ZWQgdW50aWwgYWZ0ZXIKKyAqIHJjdV9zY2hlZHVsZXJfZnVsbHlfYWN0aXZlIHRyYW5zaXRpb25zIGZyb20gemVybyB0byBvbmUuICBXZSBhbHNvCisgKiBjdXJyZW50bHkgZGVsYXkgaW52b2NhdGlvbiBvZiBhbnkgUkNVIGNhbGxiYWNrcyB1bnRpbCBhZnRlciB0aGlzIHBvaW50LgorICoKKyAqIEl0IG1pZ2h0IGxhdGVyIHByb3ZlIGJldHRlciBmb3IgcGVvcGxlIHJlZ2lzdGVyaW5nIFJDVSBjYWxsYmFja3MgZHVyaW5nCisgKiBlYXJseSBib290IHRvIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHRoZXNlIGNhbGxiYWNrcywgYnV0IG9uZSBzdGVwIGF0CisgKiBhIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQgcmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUgX19yZWFkX21vc3RseTsKKworI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKKworLyoKICAqIENvbnRyb2wgdmFyaWFibGVzIGZvciBwZXItQ1BVIGFuZCBwZXItcmN1X25vZGUga3RocmVhZHMuICBUaGVzZQogICogaGFuZGxlIGFsbCBmbGF2b3JzIG9mIFJDVS4KICAqLwpAQCAtOTYsMTAgKzEyMSwxMiBAQAogREVGSU5FX1BFUl9DUFUoaW50LCByY3VfY3B1X2t0aHJlYWRfY3B1KTsKIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgcmN1X2NwdV9rdGhyZWFkX2xvb3BzKTsKIERFRklORV9QRVJfQ1BVKGNoYXIsIHJjdV9jcHVfaGFzX3dvcmspOwotc3RhdGljIGNoYXIgcmN1X2t0aHJlYWRzX3NwYXduYWJsZTsKKworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCiAKIHN0YXRpYyB2b2lkIHJjdV9ub2RlX2t0aHJlYWRfc2V0YWZmaW5pdHkoc3RydWN0IHJjdV9ub2RlICpybnAsIGludCBvdXRnb2luZ2NwdSk7Ci1zdGF0aWMgdm9pZCBpbnZva2VfcmN1X2NwdV9rdGhyZWFkKHZvaWQpOworc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jb3JlKHZvaWQpOworc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jYWxsYmFja3Moc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCk7CiAKICNkZWZpbmUgUkNVX0tUSFJFQURfUFJJTyAxCS8qIFJUIHByaW9yaXR5IGZvciBwZXItQ1BVIGt0aHJlYWRzLiAqLwogCkBAIC0xMDg4LDE0ICsxMTE1LDggQEAKIAlpbnQgbmVlZF9yZXBvcnQgPSAwOwogCXN0cnVjdCByY3VfZGF0YSAqcmRwID0gcGVyX2NwdV9wdHIocnNwLT5yZGEsIGNwdSk7CiAJc3RydWN0IHJjdV9ub2RlICpybnA7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0OwogCi0JLyogU3RvcCB0aGUgQ1BVJ3Mga3RocmVhZC4gKi8KLQl0ID0gcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KTsKLQlpZiAodCAhPSBOVUxMKSB7Ci0JCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSkgPSBOVUxMOwotCQlrdGhyZWFkX3N0b3AodCk7Ci0JfQorCXJjdV9zdG9wX2NwdV9rdGhyZWFkKGNwdSk7CiAKIAkvKiBFeGNsdWRlIGFueSBhdHRlbXB0cyB0byBzdGFydCBhIG5ldyBncmFjZSBwZXJpb2QuICovCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZyc3AtPm9ub2ZmbG9jaywgZmxhZ3MpOwpAQCAtMTIzMSw3ICsxMjUyLDcgQEAKIAogCS8qIFJlLXJhaXNlIHRoZSBSQ1Ugc29mdGlycSBpZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHJlbWFpbmluZy4gKi8KIAlpZiAoY3B1X2hhc19jYWxsYmFja3NfcmVhZHlfdG9faW52b2tlKHJkcCkpCi0JCWludm9rZV9yY3VfY3B1X2t0aHJlYWQoKTsKKwkJaW52b2tlX3JjdV9jb3JlKCk7CiB9CiAKIC8qCkBAIC0xMjc3LDcgKzEyOTgsNyBAQAogCX0KIAlyY3VfcHJlZW1wdF9jaGVja19jYWxsYmFja3MoY3B1KTsKIAlpZiAocmN1X3BlbmRpbmcoY3B1KSkKLQkJaW52b2tlX3JjdV9jcHVfa3RocmVhZCgpOworCQlpbnZva2VfcmN1X2NvcmUoKTsKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTE0NDIsMTMgKzE0NjMsMTQgQEAKIAl9CiAKIAkvKiBJZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHJlYWR5LCBpbnZva2UgdGhlbS4gKi8KLQlyY3VfZG9fYmF0Y2gocnNwLCByZHApOworCWlmIChjcHVfaGFzX2NhbGxiYWNrc19yZWFkeV90b19pbnZva2UocmRwKSkKKwkJaW52b2tlX3JjdV9jYWxsYmFja3MocnNwLCByZHApOwogfQogCiAvKgogICogRG8gc29mdGlycSBwcm9jZXNzaW5nIGZvciB0aGUgY3VycmVudCBDUFUuCiAgKi8KLXN0YXRpYyB2b2lkIHJjdV9wcm9jZXNzX2NhbGxiYWNrcyh2b2lkKQorc3RhdGljIHZvaWQgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqdW51c2VkKQogewogCV9fcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCZyY3Vfc2NoZWRfc3RhdGUsCiAJCQkJJl9fZ2V0X2NwdV92YXIocmN1X3NjaGVkX2RhdGEpKTsKQEAgLTE0NjUsMzQyICsxNDg3LDIyIEBACiAgKiB0aGUgY3VycmVudCBDUFUgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLCB0aGUgcmN1X2NwdV9rdGhyZWFkX3Rhc2sKICAqIGNhbm5vdCBkaXNhcHBlYXIgb3V0IGZyb20gdW5kZXIgdXMuCiAgKi8KLXN0YXRpYyB2b2lkIGludm9rZV9yY3VfY3B1X2t0aHJlYWQodm9pZCkKK3N0YXRpYyB2b2lkIGludm9rZV9yY3VfY2FsbGJhY2tzKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9kYXRhICpyZHApCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlfX3RoaXNfY3B1X3dyaXRlKHJjdV9jcHVfaGFzX3dvcmssIDEpOwotCWlmIChfX3RoaXNfY3B1X3JlYWQocmN1X2NwdV9rdGhyZWFkX3Rhc2spID09IE5VTEwpIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWlmICh1bmxpa2VseSghQUNDRVNTX09OQ0UocmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUpKSkKKwkJcmV0dXJuOworCWlmIChsaWtlbHkoIXJzcC0+Ym9vc3QpKSB7CisJCXJjdV9kb19iYXRjaChyc3AsIHJkcCk7CiAJCXJldHVybjsKIAl9Ci0Jd2FrZV91cF9wcm9jZXNzKF9fdGhpc19jcHVfcmVhZChyY3VfY3B1X2t0aHJlYWRfdGFzaykpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlpbnZva2VfcmN1X2NhbGxiYWNrc19rdGhyZWFkKCk7CiB9CiAKLS8qCi0gKiBXYWtlIHVwIHRoZSBzcGVjaWZpZWQgcGVyLXJjdV9ub2RlLXN0cnVjdHVyZSBrdGhyZWFkLgotICogQmVjYXVzZSB0aGUgcGVyLXJjdV9ub2RlIGt0aHJlYWRzIGFyZSBpbW1vcnRhbCwgd2UgZG9uJ3QgbmVlZAotICogdG8gZG8gYW55dGhpbmcgdG8ga2VlcCB0aGVtIGFsaXZlLgotICovCi1zdGF0aWMgdm9pZCBpbnZva2VfcmN1X25vZGVfa3RocmVhZChzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3N0YXRpYyB2b2lkIGludm9rZV9yY3VfY29yZSh2b2lkKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKLQotCXQgPSBybnAtPm5vZGVfa3RocmVhZF90YXNrOwotCWlmICh0ICE9IE5VTEwpCi0JCXdha2VfdXBfcHJvY2Vzcyh0KTsKKwlyYWlzZV9zb2Z0aXJxKFJDVV9TT0ZUSVJRKTsKIH0KIAotLyoKLSAqIFNldCB0aGUgc3BlY2lmaWVkIENQVSdzIGt0aHJlYWQgdG8gcnVuIFJUIG9yIG5vdCwgYXMgc3BlY2lmaWVkIGJ5Ci0gKiB0aGUgdG9fcnQgYXJndW1lbnQuICBUaGUgQ1BVLWhvdHBsdWcgbG9ja3MgYXJlIGhlbGQsIHNvIHRoZSB0YXNrCi0gKiBpcyBub3QgZ29pbmcgYXdheS4KLSAqLwotc3RhdGljIHZvaWQgcmN1X2NwdV9rdGhyZWFkX3NldHJ0KGludCBjcHUsIGludCB0b19ydCkKLXsKLQlpbnQgcG9saWN5OwotCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7Ci0KLQl0ID0gcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KTsKLQlpZiAodCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JaWYgKHRvX3J0KSB7Ci0JCXBvbGljeSA9IFNDSEVEX0ZJRk87Ci0JCXNwLnNjaGVkX3ByaW9yaXR5ID0gUkNVX0tUSFJFQURfUFJJTzsKLQl9IGVsc2UgewotCQlwb2xpY3kgPSBTQ0hFRF9OT1JNQUw7Ci0JCXNwLnNjaGVkX3ByaW9yaXR5ID0gMDsKLQl9Ci0Jc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodCwgcG9saWN5LCAmc3ApOwotfQotCi0vKgotICogVGltZXIgaGFuZGxlciB0byBpbml0aWF0ZSB0aGUgd2FraW5nIHVwIG9mIHBlci1DUFUga3RocmVhZHMgdGhhdAotICogaGF2ZSB5aWVsZGVkIHRoZSBDUFUgZHVlIHRvIGV4Y2VzcyBudW1iZXJzIG9mIFJDVSBjYWxsYmFja3MuCi0gKiBXZSB3YWtlIHVwIHRoZSBwZXItcmN1X25vZGUga3RocmVhZCwgd2hpY2ggaW4gdHVybiB3aWxsIHdha2UgdXAKLSAqIHRoZSBib29zdGVyIGt0aHJlYWQuCi0gKi8KLXN0YXRpYyB2b2lkIHJjdV9jcHVfa3RocmVhZF90aW1lcih1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHBlcl9jcHVfcHRyKHJjdV9zdGF0ZS0+cmRhLCBhcmcpOwotCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gcmRwLT5teW5vZGU7Ci0KLQlhdG9taWNfb3IocmRwLT5ncnBtYXNrLCAmcm5wLT53YWtlbWFzayk7Ci0JaW52b2tlX3JjdV9ub2RlX2t0aHJlYWQocm5wKTsKLX0KLQotLyoKLSAqIERyb3AgdG8gbm9uLXJlYWwtdGltZSBwcmlvcml0eSBhbmQgeWllbGQsIGJ1dCBvbmx5IGFmdGVyIHBvc3RpbmcgYQotICogdGltZXIgdGhhdCB3aWxsIGNhdXNlIHVzIHRvIHJlZ2FpbiBvdXIgcmVhbC10aW1lIHByaW9yaXR5IGlmIHdlCi0gKiByZW1haW4gcHJlZW1wdGVkLiAgRWl0aGVyIHdheSwgd2UgcmVzdG9yZSBvdXIgcmVhbC10aW1lIHByaW9yaXR5Ci0gKiBiZWZvcmUgcmV0dXJuaW5nLgotICovCi1zdGF0aWMgdm9pZCByY3VfeWllbGQodm9pZCAoKmYpKHVuc2lnbmVkIGxvbmcpLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgeWllbGRfdGltZXI7Ci0KLQlzZXR1cF90aW1lcl9vbl9zdGFjaygmeWllbGRfdGltZXIsIGYsIGFyZyk7Ci0JbW9kX3RpbWVyKCZ5aWVsZF90aW1lciwgamlmZmllcyArIDIpOwotCXNwLnNjaGVkX3ByaW9yaXR5ID0gMDsKLQlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayhjdXJyZW50LCBTQ0hFRF9OT1JNQUwsICZzcCk7Ci0Jc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7Ci0Jc2NoZWR1bGUoKTsKLQlzcC5zY2hlZF9wcmlvcml0eSA9IFJDVV9LVEhSRUFEX1BSSU87Ci0Jc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2soY3VycmVudCwgU0NIRURfRklGTywgJnNwKTsKLQlkZWxfdGltZXIoJnlpZWxkX3RpbWVyKTsKLX0KLQotLyoKLSAqIEhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgcmN1X2NwdV9rdGhyZWFkKCkgZW5kcyB1cCBvbiB0aGUgd3JvbmcgQ1BVLgotICogVGhpcyBjYW4gaGFwcGVuIHdoaWxlIHRoZSBjb3JyZXNwb25kaW5nIENQVSBpcyBlaXRoZXIgY29taW5nIG9ubGluZQotICogb3IgZ29pbmcgb2ZmbGluZS4gIFdlIGNhbm5vdCB3YWl0IHVudGlsIHRoZSBDUFUgaXMgZnVsbHkgb25saW5lCi0gKiBiZWZvcmUgc3RhcnRpbmcgdGhlIGt0aHJlYWQsIGJlY2F1c2UgdGhlIHZhcmlvdXMgbm90aWZpZXIgZnVuY3Rpb25zCi0gKiBjYW4gd2FpdCBmb3IgUkNVIGdyYWNlIHBlcmlvZHMuICBTbyB3ZSBwYXJrIHJjdV9jcHVfa3RocmVhZCgpIHVudGlsCi0gKiB0aGUgY29ycmVzcG9uZGluZyBDUFUgaXMgb25saW5lLgotICoKLSAqIFJldHVybiAxIGlmIHRoZSBrdGhyZWFkIG5lZWRzIHRvIHN0b3AsIDAgb3RoZXJ3aXNlLgotICoKLSAqIENhbGxlciBtdXN0IGRpc2FibGUgYmguICBUaGlzIGZ1bmN0aW9uIGNhbiBtb21lbnRhcmlseSBlbmFibGUgaXQuCi0gKi8KLXN0YXRpYyBpbnQgcmN1X2NwdV9rdGhyZWFkX3Nob3VsZF9zdG9wKGludCBjcHUpCi17Ci0Jd2hpbGUgKGNwdV9pc19vZmZsaW5lKGNwdSkgfHwKLQkgICAgICAgIWNwdW1hc2tfZXF1YWwoJmN1cnJlbnQtPmNwdXNfYWxsb3dlZCwgY3B1bWFza19vZihjcHUpKSB8fAotCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1KSB7Ci0JCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCQlyZXR1cm4gMTsKLQkJcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfc3RhdHVzLCBjcHUpID0gUkNVX0tUSFJFQURfT0ZGQ1BVOwotCQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9jcHUsIGNwdSkgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwotCQlsb2NhbF9iaF9lbmFibGUoKTsKLQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JCWlmICghY3B1bWFza19lcXVhbCgmY3VycmVudC0+Y3B1c19hbGxvd2VkLCBjcHVtYXNrX29mKGNwdSkpKQotCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZihjcHUpKTsKLQkJbG9jYWxfYmhfZGlzYWJsZSgpOwotCX0KLQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9jcHUsIGNwdSkgPSBjcHU7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQZXItQ1BVIGtlcm5lbCB0aHJlYWQgdGhhdCBpbnZva2VzIFJDVSBjYWxsYmFja3MuICBUaGlzIHJlcGxhY2VzIHRoZQotICogZWFybGllciBSQ1Ugc29mdGlycS4KLSAqLwotc3RhdGljIGludCByY3VfY3B1X2t0aHJlYWQodm9pZCAqYXJnKQotewotCWludCBjcHUgPSAoaW50KShsb25nKWFyZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBzcGluY250ID0gMDsKLQl1bnNpZ25lZCBpbnQgKnN0YXR1c3AgPSAmcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfc3RhdHVzLCBjcHUpOwotCWNoYXIgd29yazsKLQljaGFyICp3b3JrcCA9ICZwZXJfY3B1KHJjdV9jcHVfaGFzX3dvcmssIGNwdSk7Ci0KLQlmb3IgKDs7KSB7Ci0JCSpzdGF0dXNwID0gUkNVX0tUSFJFQURfV0FJVElORzsKLQkJcmN1X3dhaXQoKndvcmtwICE9IDAgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKLQkJbG9jYWxfYmhfZGlzYWJsZSgpOwotCQlpZiAocmN1X2NwdV9rdGhyZWFkX3Nob3VsZF9zdG9wKGNwdSkpIHsKLQkJCWxvY2FsX2JoX2VuYWJsZSgpOwotCQkJYnJlYWs7Ci0JCX0KLQkJKnN0YXR1c3AgPSBSQ1VfS1RIUkVBRF9SVU5OSU5HOwotCQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9sb29wcywgY3B1KSsrOwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCXdvcmsgPSAqd29ya3A7Ci0JCSp3b3JrcCA9IDA7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJaWYgKHdvcmspCi0JCQlyY3VfcHJvY2Vzc19jYWxsYmFja3MoKTsKLQkJbG9jYWxfYmhfZW5hYmxlKCk7Ci0JCWlmICgqd29ya3AgIT0gMCkKLQkJCXNwaW5jbnQrKzsKLQkJZWxzZQotCQkJc3BpbmNudCA9IDA7Ci0JCWlmIChzcGluY250ID4gMTApIHsKLQkJCSpzdGF0dXNwID0gUkNVX0tUSFJFQURfWUlFTERJTkc7Ci0JCQlyY3VfeWllbGQocmN1X2NwdV9rdGhyZWFkX3RpbWVyLCAodW5zaWduZWQgbG9uZyljcHUpOwotCQkJc3BpbmNudCA9IDA7Ci0JCX0KLQl9Ci0JKnN0YXR1c3AgPSBSQ1VfS1RIUkVBRF9TVE9QUEVEOwotCXJldHVybiAwOwotfQotCi0vKgotICogU3Bhd24gYSBwZXItQ1BVIGt0aHJlYWQsIHNldHRpbmcgdXAgYWZmaW5pdHkgYW5kIHByaW9yaXR5LgotICogQmVjYXVzZSB0aGUgQ1BVIGhvdHBsdWcgbG9jayBpcyBoZWxkLCBubyBvdGhlciBDUFUgd2lsbCBiZSBhdHRlbXB0aW5nCi0gKiB0byBtYW5pcHVsYXRlIHJjdV9jcHVfa3RocmVhZF90YXNrLiAgVGhlcmUgbWlnaHQgYmUgYW5vdGhlciBDUFUKLSAqIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGl0IGR1cmluZyBib290LCBidXQgdGhlIGxvY2tpbmcgaW4ga3RocmVhZF9iaW5kKCkKLSAqIHdpbGwgZW5mb3JjZSBzdWZmaWNpZW50IG9yZGVyaW5nLgotICovCi1zdGF0aWMgaW50IF9fY3B1aW5pdCByY3Vfc3Bhd25fb25lX2NwdV9rdGhyZWFkKGludCBjcHUpCi17Ci0Jc3RydWN0IHNjaGVkX3BhcmFtIHNwOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKLQotCWlmICghcmN1X2t0aHJlYWRzX3NwYXduYWJsZSB8fAotCSAgICBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpICE9IE5VTEwpCi0JCXJldHVybiAwOwotCXQgPSBrdGhyZWFkX2NyZWF0ZShyY3VfY3B1X2t0aHJlYWQsICh2b2lkICopKGxvbmcpY3B1LCAicmN1YyVkIiwgY3B1KTsKLQlpZiAoSVNfRVJSKHQpKQotCQlyZXR1cm4gUFRSX0VSUih0KTsKLQlrdGhyZWFkX2JpbmQodCwgY3B1KTsKLQlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9jcHUsIGNwdSkgPSBjcHU7Ci0JV0FSTl9PTl9PTkNFKHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSkgIT0gTlVMTCk7Ci0JcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KSA9IHQ7Ci0Jc3Auc2NoZWRfcHJpb3JpdHkgPSBSQ1VfS1RIUkVBRF9QUklPOwotCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHQsIFNDSEVEX0ZJRk8sICZzcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQZXItcmN1X25vZGUga3RocmVhZCwgd2hpY2ggaXMgaW4gY2hhcmdlIG9mIHdha2luZyB1cCB0aGUgcGVyLUNQVQotICoga3RocmVhZHMgd2hlbiBuZWVkZWQuICBXZSBpZ25vcmUgcmVxdWVzdHMgdG8gd2FrZSB1cCBrdGhyZWFkcwotICogZm9yIG9mZmxpbmUgQ1BVcywgd2hpY2ggaXMgT0sgYmVjYXVzZSBmb3JjZV9xdWllc2NlbnRfc3RhdGUoKQotICogdGFrZXMgY2FyZSBvZiB0aGlzIGNhc2UuCi0gKi8KLXN0YXRpYyBpbnQgcmN1X25vZGVfa3RocmVhZCh2b2lkICphcmcpCi17Ci0JaW50IGNwdTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgbWFzazsKLQlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IChzdHJ1Y3QgcmN1X25vZGUgKilhcmc7Ci0Jc3RydWN0IHNjaGVkX3BhcmFtIHNwOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKLQotCWZvciAoOzspIHsKLQkJcm5wLT5ub2RlX2t0aHJlYWRfc3RhdHVzID0gUkNVX0tUSFJFQURfV0FJVElORzsKLQkJcmN1X3dhaXQoYXRvbWljX3JlYWQoJnJucC0+d2FrZW1hc2spICE9IDApOwotCQlybnAtPm5vZGVfa3RocmVhZF9zdGF0dXMgPSBSQ1VfS1RIUkVBRF9SVU5OSU5HOwotCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOwotCQltYXNrID0gYXRvbWljX3hjaGcoJnJucC0+d2FrZW1hc2ssIDApOwotCQlyY3VfaW5pdGlhdGVfYm9vc3Qocm5wLCBmbGFncyk7IC8qIHJlbGVhc2VzIHJucC0+bG9jay4gKi8KLQkJZm9yIChjcHUgPSBybnAtPmdycGxvOyBjcHUgPD0gcm5wLT5ncnBoaTsgY3B1KyssIG1hc2sgPj49IDEpIHsKLQkJCWlmICgobWFzayAmIDB4MSkgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCXByZWVtcHRfZGlzYWJsZSgpOwotCQkJdCA9IHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSk7Ci0JCQlpZiAoIWNwdV9vbmxpbmUoY3B1KSB8fCB0ID09IE5VTEwpIHsKLQkJCQlwcmVlbXB0X2VuYWJsZSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcGVyX2NwdShyY3VfY3B1X2hhc193b3JrLCBjcHUpID0gMTsKLQkJCXNwLnNjaGVkX3ByaW9yaXR5ID0gUkNVX0tUSFJFQURfUFJJTzsKLQkJCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHQsIFNDSEVEX0ZJRk8sICZzcCk7Ci0JCQlwcmVlbXB0X2VuYWJsZSgpOwotCQl9Ci0JfQotCS8qIE5PVFJFQUNIRUQgKi8KLQlybnAtPm5vZGVfa3RocmVhZF9zdGF0dXMgPSBSQ1VfS1RIUkVBRF9TVE9QUEVEOwotCXJldHVybiAwOwotfQotCi0vKgotICogU2V0IHRoZSBwZXItcmN1X25vZGUga3RocmVhZCdzIGFmZmluaXR5IHRvIGNvdmVyIGFsbCBDUFVzIHRoYXQgYXJlCi0gKiBzZXJ2ZWQgYnkgdGhlIHJjdV9ub2RlIGluIHF1ZXN0aW9uLiAgVGhlIENQVSBob3RwbHVnIGxvY2sgaXMgc3RpbGwKLSAqIGhlbGQsIHNvIHRoZSB2YWx1ZSBvZiBybnAtPnFzbWFza2luaXQgd2lsbCBiZSBzdGFibGUuCi0gKgotICogV2UgZG9uJ3QgaW5jbHVkZSBvdXRnb2luZ2NwdSBpbiB0aGUgYWZmaW5pdHkgc2V0LCB1c2UgLTEgaWYgdGhlcmUgaXMKLSAqIG5vIG91dGdvaW5nIENQVS4gIElmIHRoZXJlIGFyZSBubyBDUFVzIGxlZnQgaW4gdGhlIGFmZmluaXR5IHNldCwKLSAqIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBrdGhyZWFkIHRvIGV4ZWN1dGUgb24gYW55IENQVS4KLSAqLwotc3RhdGljIHZvaWQgcmN1X25vZGVfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwgaW50IG91dGdvaW5nY3B1KQotewotCWNwdW1hc2tfdmFyX3QgY207Ci0JaW50IGNwdTsKLQl1bnNpZ25lZCBsb25nIG1hc2sgPSBybnAtPnFzbWFza2luaXQ7Ci0KLQlpZiAocm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9PSBOVUxMKQotCQlyZXR1cm47Ci0JaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmY20sIEdGUF9LRVJORUwpKQotCQlyZXR1cm47Ci0JY3B1bWFza19jbGVhcihjbSk7Ci0JZm9yIChjcHUgPSBybnAtPmdycGxvOyBjcHUgPD0gcm5wLT5ncnBoaTsgY3B1KyssIG1hc2sgPj49IDEpCi0JCWlmICgobWFzayAmIDB4MSkgJiYgY3B1ICE9IG91dGdvaW5nY3B1KQotCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgY20pOwotCWlmIChjcHVtYXNrX3dlaWdodChjbSkgPT0gMCkgewotCQljcHVtYXNrX3NldGFsbChjbSk7Ci0JCWZvciAoY3B1ID0gcm5wLT5ncnBsbzsgY3B1IDw9IHJucC0+Z3JwaGk7IGNwdSsrKQotCQkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBjbSk7Ci0JCVdBUk5fT05fT05DRShjcHVtYXNrX3dlaWdodChjbSkgPT0gMCk7Ci0JfQotCXNldF9jcHVzX2FsbG93ZWRfcHRyKHJucC0+bm9kZV9rdGhyZWFkX3Rhc2ssIGNtKTsKLQlyY3VfYm9vc3Rfa3RocmVhZF9zZXRhZmZpbml0eShybnAsIGNtKTsKLQlmcmVlX2NwdW1hc2tfdmFyKGNtKTsKLX0KLQotLyoKLSAqIFNwYXduIGEgcGVyLXJjdV9ub2RlIGt0aHJlYWQsIHNldHRpbmcgcHJpb3JpdHkgYW5kIGFmZmluaXR5LgotICogQ2FsbGVkIGR1cmluZyBib290IGJlZm9yZSBvbmxpbmUvb2ZmbGluZSBjYW4gaGFwcGVuLCBvciwgaWYKLSAqIGR1cmluZyBydW50aW1lLCB3aXRoIHRoZSBtYWluIENQVS1ob3RwbHVnIGxvY2tzIGhlbGQuICBTbyBvbmx5Ci0gKiBvbmUgb2YgdGhlc2UgY2FuIGJlIGV4ZWN1dGluZyBhdCBhIHRpbWUuCi0gKi8KLXN0YXRpYyBpbnQgX19jcHVpbml0IHJjdV9zcGF3bl9vbmVfbm9kZV9rdGhyZWFkKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwKLQkJCQkJCXN0cnVjdCByY3Vfbm9kZSAqcm5wKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJucF9pbmRleCA9IHJucCAtICZyc3AtPm5vZGVbMF07Ci0Jc3RydWN0IHNjaGVkX3BhcmFtIHNwOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKLQotCWlmICghcmN1X2t0aHJlYWRzX3NwYXduYWJsZSB8fAotCSAgICBybnAtPnFzbWFza2luaXQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHJucC0+bm9kZV9rdGhyZWFkX3Rhc2sgPT0gTlVMTCkgewotCQl0ID0ga3RocmVhZF9jcmVhdGUocmN1X25vZGVfa3RocmVhZCwgKHZvaWQgKilybnAsCi0JCQkJICAgInJjdW4lZCIsIHJucF9pbmRleCk7Ci0JCWlmIChJU19FUlIodCkpCi0JCQlyZXR1cm4gUFRSX0VSUih0KTsKLQkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKLQkJcm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9IHQ7Ci0JCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKLQkJc3Auc2NoZWRfcHJpb3JpdHkgPSA5OTsKLQkJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2sodCwgU0NIRURfRklGTywgJnNwKTsKLQl9Ci0JcmV0dXJuIHJjdV9zcGF3bl9vbmVfYm9vc3Rfa3RocmVhZChyc3AsIHJucCwgcm5wX2luZGV4KTsKLX0KLQotc3RhdGljIHZvaWQgcmN1X3dha2Vfb25lX2Jvb3N0X2t0aHJlYWQoc3RydWN0IHJjdV9ub2RlICpybnApOwotCi0vKgotICogU3Bhd24gYWxsIGt0aHJlYWRzIC0tIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBzY2hlZHVsZXIgaXMgcnVubmluZy4KLSAqLwotc3RhdGljIGludCBfX2luaXQgcmN1X3NwYXduX2t0aHJlYWRzKHZvaWQpCi17Ci0JaW50IGNwdTsKLQlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7Ci0KLQlyY3Vfa3RocmVhZHNfc3Bhd25hYmxlID0gMTsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCXBlcl9jcHUocmN1X2NwdV9oYXNfd29yaywgY3B1KSA9IDA7Ci0JCWlmIChjcHVfb25saW5lKGNwdSkpIHsKLQkJCSh2b2lkKXJjdV9zcGF3bl9vbmVfY3B1X2t0aHJlYWQoY3B1KTsKLQkJCXQgPSBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpOwotCQkJaWYgKHQpCi0JCQkJd2FrZV91cF9wcm9jZXNzKHQpOwotCQl9Ci0JfQotCXJucCA9IHJjdV9nZXRfcm9vdChyY3Vfc3RhdGUpOwotCSh2b2lkKXJjdV9zcGF3bl9vbmVfbm9kZV9rdGhyZWFkKHJjdV9zdGF0ZSwgcm5wKTsKLQlpZiAocm5wLT5ub2RlX2t0aHJlYWRfdGFzaykKLQkJd2FrZV91cF9wcm9jZXNzKHJucC0+bm9kZV9rdGhyZWFkX3Rhc2spOwotCWlmIChOVU1fUkNVX05PREVTID4gMSkgewotCQlyY3VfZm9yX2VhY2hfbGVhZl9ub2RlKHJjdV9zdGF0ZSwgcm5wKSB7Ci0JCQkodm9pZClyY3Vfc3Bhd25fb25lX25vZGVfa3RocmVhZChyY3Vfc3RhdGUsIHJucCk7Ci0JCQl0ID0gcm5wLT5ub2RlX2t0aHJlYWRfdGFzazsKLQkJCWlmICh0KQotCQkJCXdha2VfdXBfcHJvY2Vzcyh0KTsKLQkJCXJjdV93YWtlX29uZV9ib29zdF9rdGhyZWFkKHJucCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci1lYXJseV9pbml0Y2FsbChyY3Vfc3Bhd25fa3RocmVhZHMpOwotCiBzdGF0aWMgdm9pZAogX19jYWxsX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQsIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSksCiAJICAgc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQpAQCAtMjIwNyw0NCArMTkwOSw2IEBACiAJcmN1X3ByZWVtcHRfaW5pdF9wZXJjcHVfZGF0YShjcHUpOwogfQogCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgcmN1X3ByZXBhcmVfa3RocmVhZHMoaW50IGNwdSkKLXsKLQlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHBlcl9jcHVfcHRyKHJjdV9zdGF0ZS0+cmRhLCBjcHUpOwotCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gcmRwLT5teW5vZGU7Ci0KLQkvKiBGaXJlIHVwIHRoZSBpbmNvbWluZyBDUFUncyBrdGhyZWFkIGFuZCBsZWFmIHJjdV9ub2RlIGt0aHJlYWQuICovCi0JaWYgKHJjdV9rdGhyZWFkc19zcGF3bmFibGUpIHsKLQkJKHZvaWQpcmN1X3NwYXduX29uZV9jcHVfa3RocmVhZChjcHUpOwotCQlpZiAocm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9PSBOVUxMKQotCQkJKHZvaWQpcmN1X3NwYXduX29uZV9ub2RlX2t0aHJlYWQocmN1X3N0YXRlLCBybnApOwotCX0KLX0KLQotLyoKLSAqIGt0aHJlYWRfY3JlYXRlKCkgY3JlYXRlcyB0aHJlYWRzIGluIFRBU0tfVU5JTlRFUlJVUFRJQkxFIHN0YXRlLAotICogYnV0IHRoZSBSQ1UgdGhyZWFkcyBhcmUgd29rZW4gb24gZGVtYW5kLCBhbmQgaWYgZGVtYW5kIGlzIGxvdyB0aGlzCi0gKiBjb3VsZCBiZSBhIHdoaWxlIHRyaWdnZXJpbmcgdGhlIGh1bmcgdGFzayB3YXRjaGRvZy4KLSAqCi0gKiBJbiBvcmRlciB0byBhdm9pZCB0aGlzLCBwb2tlIGFsbCB0YXNrcyBvbmNlIHRoZSBDUFUgaXMgZnVsbHkKLSAqIHVwIGFuZCBydW5uaW5nLgotICovCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgcmN1X29ubGluZV9rdGhyZWFkcyhpbnQgY3B1KQotewotCXN0cnVjdCByY3VfZGF0YSAqcmRwID0gcGVyX2NwdV9wdHIocmN1X3N0YXRlLT5yZGEsIGNwdSk7Ci0Jc3RydWN0IHJjdV9ub2RlICpybnAgPSByZHAtPm15bm9kZTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7Ci0KLQl0ID0gcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KTsKLQlpZiAodCkKLQkJd2FrZV91cF9wcm9jZXNzKHQpOwotCi0JdCA9IHJucC0+bm9kZV9rdGhyZWFkX3Rhc2s7Ci0JaWYgKHQpCi0JCXdha2VfdXBfcHJvY2Vzcyh0KTsKLQotCXJjdV93YWtlX29uZV9ib29zdF9rdGhyZWFkKHJucCk7Ci19Ci0KIC8qCiAgKiBIYW5kbGUgQ1BVIG9ubGluZS9vZmZsaW5lIG5vdGlmaWNhdGlvbiBldmVudHMuCiAgKi8KQEAgLTIyNjIsNyArMTkyNiw2IEBACiAJCXJjdV9wcmVwYXJlX2t0aHJlYWRzKGNwdSk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX09OTElORToKLQkJcmN1X29ubGluZV9rdGhyZWFkcyhjcHUpOwogCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgogCQlyY3Vfbm9kZV9rdGhyZWFkX3NldGFmZmluaXR5KHJucCwgLTEpOwogCQlyY3VfY3B1X2t0aHJlYWRfc2V0cnQoY3B1LCAxKTsKQEAgLTI0MTAsNiArMjA3Myw3IEBACiAJcmN1X2luaXRfb25lKCZyY3Vfc2NoZWRfc3RhdGUsICZyY3Vfc2NoZWRfZGF0YSk7CiAJcmN1X2luaXRfb25lKCZyY3VfYmhfc3RhdGUsICZyY3VfYmhfZGF0YSk7CiAJX19yY3VfaW5pdF9wcmVlbXB0KCk7CisJIG9wZW5fc29mdGlycShSQ1VfU09GVElSUSwgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKTsKIAogCS8qCiAJICogV2UgZG9uJ3QgbmVlZCBwcm90ZWN0aW9uIGFnYWluc3QgQ1BVLWhvdHBsdWcgaGVyZSBiZWNhdXNlCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dHJlZS5oIGIva2VybmVsL3JjdXRyZWUuaAppbmRleCA3YjlhMDhiLi4wMWIyY2NkIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZS5oCisrKyBiL2tlcm5lbC9yY3V0cmVlLmgKQEAgLTM2OSw2ICszNjksNyBAQAogCQkJCQkJLyogIHBlcmlvZCBiZWNhdXNlICovCiAJCQkJCQkvKiAgZm9yY2VfcXVpZXNjZW50X3N0YXRlKCkgKi8KIAkJCQkJCS8qICB3YXMgcnVubmluZy4gKi8KKwl1OAlib29zdDsJCQkJLyogU3ViamVjdCB0byBwcmlvcml0eSBib29zdC4gKi8KIAl1bnNpZ25lZCBsb25nIGdwbnVtOwkJCS8qIEN1cnJlbnQgZ3AgbnVtYmVyLiAqLwogCXVuc2lnbmVkIGxvbmcgY29tcGxldGVkOwkJLyogIyBvZiBsYXN0IGNvbXBsZXRlZCBncC4gKi8KIApAQCAtNDI2LDYgKzQyNyw3IEBACiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBzdGF0aWMgdm9pZCByY3VfcmVwb3J0X3VuYmxvY2tfcXNfcm5wKHN0cnVjdCByY3Vfbm9kZSAqcm5wLAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworc3RhdGljIHZvaWQgcmN1X3N0b3BfY3B1X2t0aHJlYWQoaW50IGNwdSk7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLwogc3RhdGljIHZvaWQgcmN1X3ByaW50X2RldGFpbF90YXNrX3N0YWxsKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCk7CiBzdGF0aWMgdm9pZCByY3VfcHJpbnRfdGFza19zdGFsbChzdHJ1Y3QgcmN1X25vZGUgKnJucCk7CkBAIC00NTAsMTEgKzQ1MiwxOSBAQAogc3RhdGljIHZvaWQgX19pbml0IF9fcmN1X2luaXRfcHJlZW1wdCh2b2lkKTsKIHN0YXRpYyB2b2lkIHJjdV9uZWVkc19jcHVfZmx1c2godm9pZCk7CiBzdGF0aWMgdm9pZCByY3VfaW5pdGlhdGVfYm9vc3Qoc3RydWN0IHJjdV9ub2RlICpybnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfYm9vc3Rfc3RhcnRfZ3Aoc3RydWN0IHJjdV9ub2RlICpybnApOworc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jYWxsYmFja3Nfa3RocmVhZCh2b2lkKTsKKyNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCitzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9kb19jYWxsYmFja3Modm9pZCk7CiBzdGF0aWMgdm9pZCByY3VfYm9vc3Rfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwKIAkJCQkJICBjcHVtYXNrX3Zhcl90IGNtKTsKLXN0YXRpYyB2b2lkIHJjdV9wcmVlbXB0X2Jvb3N0X3N0YXJ0X2dwKHN0cnVjdCByY3Vfbm9kZSAqcm5wKTsKIHN0YXRpYyBpbnQgX19jcHVpbml0IHJjdV9zcGF3bl9vbmVfYm9vc3Rfa3RocmVhZChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCiAJCQkJCQkgc3RydWN0IHJjdV9ub2RlICpybnAsCiAJCQkJCQkgaW50IHJucF9pbmRleCk7CitzdGF0aWMgdm9pZCBpbnZva2VfcmN1X25vZGVfa3RocmVhZChzdHJ1Y3QgcmN1X25vZGUgKnJucCk7CitzdGF0aWMgdm9pZCByY3VfeWllbGQodm9pZCAoKmYpKHVuc2lnbmVkIGxvbmcpLCB1bnNpZ25lZCBsb25nIGFyZyk7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KK3N0YXRpYyB2b2lkIHJjdV9jcHVfa3RocmVhZF9zZXRydChpbnQgY3B1LCBpbnQgdG9fcnQpOworc3RhdGljIHZvaWQgX19jcHVpbml0IHJjdV9wcmVwYXJlX2t0aHJlYWRzKGludCBjcHUpOwogCiAjZW5kaWYgLyogI2lmbmRlZiBSQ1VfVFJFRV9OT05DT1JFICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dHJlZV9wbHVnaW4uaCBiL2tlcm5lbC9yY3V0cmVlX3BsdWdpbi5oCmluZGV4IGM4YmZmMzAuLjhhYWZiYjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0cmVlX3BsdWdpbi5oCisrKyBiL2tlcm5lbC9yY3V0cmVlX3BsdWdpbi5oCkBAIC02OCw2ICs2OCw3IEBACiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmN1X2RhdGEsIHJjdV9wcmVlbXB0X2RhdGEpOwogc3RhdGljIHN0cnVjdCByY3Vfc3RhdGUgKnJjdV9zdGF0ZSA9ICZyY3VfcHJlZW1wdF9zdGF0ZTsKIAorc3RhdGljIHZvaWQgcmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwoc3RydWN0IHRhc2tfc3RydWN0ICp0KTsKIHN0YXRpYyBpbnQgcmN1X3ByZWVtcHRlZF9yZWFkZXJzX2V4cChzdHJ1Y3QgcmN1X25vZGUgKnJucCk7CiAKIC8qCkBAIC0xNDcsNyArMTQ4LDcgQEAKIAlzdHJ1Y3QgcmN1X2RhdGEgKnJkcDsKIAlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKIAotCWlmICh0LT5yY3VfcmVhZF9sb2NrX25lc3RpbmcgJiYKKwlpZiAodC0+cmN1X3JlYWRfbG9ja19uZXN0aW5nID4gMCAmJgogCSAgICAodC0+cmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwgJiBSQ1VfUkVBRF9VTkxPQ0tfQkxPQ0tFRCkgPT0gMCkgewogCiAJCS8qIFBvc3NpYmx5IGJsb2NraW5nIGluIGFuIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbi4gKi8KQEAgLTE5MCw2ICsxOTEsMTQgQEAKIAkJCQlybnAtPmdwX3Rhc2tzID0gJnQtPnJjdV9ub2RlX2VudHJ5OwogCQl9CiAJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgaWYgKHQtPnJjdV9yZWFkX2xvY2tfbmVzdGluZyA8IDAgJiYKKwkJICAgdC0+cmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwpIHsKKworCQkvKgorCQkgKiBDb21wbGV0ZSBleGl0IGZyb20gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIG9uCisJCSAqIGJlaGFsZiBvZiBwcmVlbXB0ZWQgaW5zdGFuY2Ugb2YgX19yY3VfcmVhZF91bmxvY2soKS4KKwkJICovCisJCXJjdV9yZWFkX3VubG9ja19zcGVjaWFsKHQpOwogCX0KIAogCS8qCkBAIC0yODQsNyArMjkzLDcgQEAKICAqIG5vdGlmeSBSQ1UgY29yZSBwcm9jZXNzaW5nIG9yIHRhc2sgaGF2aW5nIGJsb2NrZWQgZHVyaW5nIHRoZSBSQ1UKICAqIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLgogICovCi1zdGF0aWMgdm9pZCByY3VfcmVhZF91bmxvY2tfc3BlY2lhbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCitzdGF0aWMgbm9pbmxpbmUgdm9pZCByY3VfcmVhZF91bmxvY2tfc3BlY2lhbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCiB7CiAJaW50IGVtcHR5OwogCWludCBlbXB0eV9leHA7CkBAIC0zMDksNyArMzE4LDcgQEAKIAl9CiAKIAkvKiBIYXJkd2FyZSBJUlEgaGFuZGxlcnMgY2Fubm90IGJsb2NrLiAqLwotCWlmIChpbl9pcnEoKSkgeworCWlmIChpbl9pcnEoKSB8fCBpbl9zZXJ2aW5nX3NvZnRpcnEoKSkgewogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCXJldHVybjsKIAl9CkBAIC0zNDIsNiArMzUxLDExIEBACiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVAogCQlpZiAoJnQtPnJjdV9ub2RlX2VudHJ5ID09IHJucC0+Ym9vc3RfdGFza3MpCiAJCQlybnAtPmJvb3N0X3Rhc2tzID0gbnA7CisJCS8qIFNuYXBzaG90IGFuZCBjbGVhciAtPnJjdV9ib29zdGVkIHdpdGggcmN1X25vZGUgbG9jayBoZWxkLiAqLworCQlpZiAodC0+cmN1X2Jvb3N0ZWQpIHsKKwkJCXNwZWNpYWwgfD0gUkNVX1JFQURfVU5MT0NLX0JPT1NURUQ7CisJCQl0LT5yY3VfYm9vc3RlZCA9IDA7CisJCX0KICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLwogCQl0LT5yY3VfYmxvY2tlZF9ub2RlID0gTlVMTDsKIApAQCAtMzU4LDcgKzM3Miw2IEBACiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVAogCQkvKiBVbmJvb3N0IGlmIHdlIHdlcmUgYm9vc3RlZC4gKi8KIAkJaWYgKHNwZWNpYWwgJiBSQ1VfUkVBRF9VTkxPQ0tfQk9PU1RFRCkgewotCQkJdC0+cmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwgJj0gflJDVV9SRUFEX1VOTE9DS19CT09TVEVEOwogCQkJcnRfbXV0ZXhfdW5sb2NrKHQtPnJjdV9ib29zdF9tdXRleCk7CiAJCQl0LT5yY3VfYm9vc3RfbXV0ZXggPSBOVUxMOwogCQl9CkBAIC0zODcsMTMgKzQwMCwyMiBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdCA9IGN1cnJlbnQ7CiAKIAliYXJyaWVyKCk7ICAvKiBuZWVkZWQgaWYgd2UgZXZlciBpbnZva2UgcmN1X3JlYWRfdW5sb2NrIGluIHJjdXRyZWUuYyAqLwotCS0tdC0+cmN1X3JlYWRfbG9ja19uZXN0aW5nOwotCWJhcnJpZXIoKTsgIC8qIGRlY3JlbWVudCBiZWZvcmUgbG9hZCBvZiAtPnJjdV9yZWFkX3VubG9ja19zcGVjaWFsICovCi0JaWYgKHQtPnJjdV9yZWFkX2xvY2tfbmVzdGluZyA9PSAwICYmCi0JICAgIHVubGlrZWx5KEFDQ0VTU19PTkNFKHQtPnJjdV9yZWFkX3VubG9ja19zcGVjaWFsKSkpCi0JCXJjdV9yZWFkX3VubG9ja19zcGVjaWFsKHQpOworCWlmICh0LT5yY3VfcmVhZF9sb2NrX25lc3RpbmcgIT0gMSkKKwkJLS10LT5yY3VfcmVhZF9sb2NrX25lc3Rpbmc7CisJZWxzZSB7CisJCXQtPnJjdV9yZWFkX2xvY2tfbmVzdGluZyA9IElOVF9NSU47CisJCWJhcnJpZXIoKTsgIC8qIGFzc2lnbiBiZWZvcmUgLT5yY3VfcmVhZF91bmxvY2tfc3BlY2lhbCBsb2FkICovCisJCWlmICh1bmxpa2VseShBQ0NFU1NfT05DRSh0LT5yY3VfcmVhZF91bmxvY2tfc3BlY2lhbCkpKQorCQkJcmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwodCk7CisJCWJhcnJpZXIoKTsgIC8qIC0+cmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwgbG9hZCBiZWZvcmUgYXNzaWduICovCisJCXQtPnJjdV9yZWFkX2xvY2tfbmVzdGluZyA9IDA7CisJfQogI2lmZGVmIENPTkZJR19QUk9WRV9MT0NLSU5HCi0JV0FSTl9PTl9PTkNFKEFDQ0VTU19PTkNFKHQtPnJjdV9yZWFkX2xvY2tfbmVzdGluZykgPCAwKTsKKwl7CisJCWludCBycmxuID0gQUNDRVNTX09OQ0UodC0+cmN1X3JlYWRfbG9ja19uZXN0aW5nKTsKKworCQlXQVJOX09OX09OQ0UocnJsbiA8IDAgJiYgcnJsbiA+IElOVF9NSU4gLyAyKTsKKwl9CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19QUk9WRV9MT0NLSU5HICovCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX3JjdV9yZWFkX3VubG9jayk7CkBAIC01ODksNyArNjExLDggQEAKIAkJcmN1X3ByZWVtcHRfcXMoY3B1KTsKIAkJcmV0dXJuOwogCX0KLQlpZiAocGVyX2NwdShyY3VfcHJlZW1wdF9kYXRhLCBjcHUpLnFzX3BlbmRpbmcpCisJaWYgKHQtPnJjdV9yZWFkX2xvY2tfbmVzdGluZyA+IDAgJiYKKwkgICAgcGVyX2NwdShyY3VfcHJlZW1wdF9kYXRhLCBjcHUpLnFzX3BlbmRpbmcpCiAJCXQtPnJjdV9yZWFkX3VubG9ja19zcGVjaWFsIHw9IFJDVV9SRUFEX1VOTE9DS19ORUVEX1FTOwogfQogCkBAIC02MDIsNiArNjI1LDE1IEBACiAJCQkJJl9fZ2V0X2NwdV92YXIocmN1X3ByZWVtcHRfZGF0YSkpOwogfQogCisjaWZkZWYgQ09ORklHX1JDVV9CT09TVAorCitzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9kb19jYWxsYmFja3Modm9pZCkKK3sKKwlyY3VfZG9fYmF0Y2goJnJjdV9wcmVlbXB0X3N0YXRlLCAmX19nZXRfY3B1X3ZhcihyY3VfcHJlZW1wdF9kYXRhKSk7Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLworCiAvKgogICogUXVldWUgYSBwcmVlbXB0aWJsZS1SQ1UgY2FsbGJhY2sgZm9yIGludm9jYXRpb24gYWZ0ZXIgYSBncmFjZSBwZXJpb2QuCiAgKi8KQEAgLTY4Niw5ICs3MTgsMTIgQEAKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJZm9yICg7OykgewotCQlpZiAoIXN5bmNfcmN1X3ByZWVtcHRfZXhwX2RvbmUocm5wKSkKKwkJaWYgKCFzeW5jX3JjdV9wcmVlbXB0X2V4cF9kb25lKHJucCkpIHsKKwkJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOworCQl9CiAJCWlmIChybnAtPnBhcmVudCA9PSBOVUxMKSB7CisJCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJCQl3YWtlX3VwKCZzeW5jX3JjdV9wcmVlbXB0X2V4cF93cSk7CiAJCQlicmVhazsKIAkJfQpAQCAtNjk4LDcgKzczMyw2IEBACiAJCXJhd19zcGluX2xvY2soJnJucC0+bG9jayk7IC8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZCAqLwogCQlybnAtPmV4cG1hc2sgJj0gfm1hc2s7CiAJfQotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTExNjUsNyArMTE5OSw3IEBACiAJdCA9IGNvbnRhaW5lcl9vZih0Yiwgc3RydWN0IHRhc2tfc3RydWN0LCByY3Vfbm9kZV9lbnRyeSk7CiAJcnRfbXV0ZXhfaW5pdF9wcm94eV9sb2NrZWQoJm10eCwgdCk7CiAJdC0+cmN1X2Jvb3N0X211dGV4ID0gJm10eDsKLQl0LT5yY3VfcmVhZF91bmxvY2tfc3BlY2lhbCB8PSBSQ1VfUkVBRF9VTkxPQ0tfQk9PU1RFRDsKKwl0LT5yY3VfYm9vc3RlZCA9IDE7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwogCXJ0X211dGV4X2xvY2soJm10eCk7ICAvKiBTaWRlIGVmZmVjdDogYm9vc3RzIHRhc2sgdCdzIHByaW9yaXR5LiAqLwogCXJ0X211dGV4X3VubG9jaygmbXR4KTsgIC8qIEtlZXAgbG9ja2RlcCBoYXBweS4gKi8KQEAgLTEyNDksNiArMTI4MywyMyBAQAogfQogCiAvKgorICogV2FrZSB1cCB0aGUgcGVyLUNQVSBrdGhyZWFkIHRvIGludm9rZSBSQ1UgY2FsbGJhY2tzLgorICovCitzdGF0aWMgdm9pZCBpbnZva2VfcmN1X2NhbGxiYWNrc19rdGhyZWFkKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX3RoaXNfY3B1X3dyaXRlKHJjdV9jcHVfaGFzX3dvcmssIDEpOworCWlmIChfX3RoaXNfY3B1X3JlYWQocmN1X2NwdV9rdGhyZWFkX3Rhc2spID09IE5VTEwpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXdha2VfdXBfcHJvY2VzcyhfX3RoaXNfY3B1X3JlYWQocmN1X2NwdV9rdGhyZWFkX3Rhc2spKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCiAgKiBTZXQgdGhlIGFmZmluaXR5IG9mIHRoZSBib29zdCBrdGhyZWFkLiAgVGhlIENQVS1ob3RwbHVnIGxvY2tzIGFyZQogICogaGVsZCwgc28gbm8gb25lIHNob3VsZCBiZSBtZXNzaW5nIHdpdGggdGhlIGV4aXN0ZW5jZSBvZiB0aGUgYm9vc3QKICAqIGt0aHJlYWQuCkBAIC0xMjg4LDYgKzEzMzksNyBAQAogCiAJaWYgKCZyY3VfcHJlZW1wdF9zdGF0ZSAhPSByc3ApCiAJCXJldHVybiAwOworCXJzcC0+Ym9vc3QgPSAxOwogCWlmIChybnAtPmJvb3N0X2t0aHJlYWRfdGFzayAhPSBOVUxMKQogCQlyZXR1cm4gMDsKIAl0ID0ga3RocmVhZF9jcmVhdGUocmN1X2Jvb3N0X2t0aHJlYWQsICh2b2lkICopcm5wLApAQCAtMTI5OSwxMyArMTM1MSwzNzIgQEAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJc3Auc2NoZWRfcHJpb3JpdHkgPSBSQ1VfS1RIUkVBRF9QUklPOwogCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHQsIFNDSEVEX0ZJRk8sICZzcCk7CisJd2FrZV91cF9wcm9jZXNzKHQpOyAvKiBnZXQgdG8gVEFTS19JTlRFUlJVUFRJQkxFIHF1aWNrbHkuICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3Vfd2FrZV9vbmVfYm9vc3Rfa3RocmVhZChzdHJ1Y3QgcmN1X25vZGUgKnJucCkKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworLyoKKyAqIFN0b3AgdGhlIFJDVSdzIHBlci1DUFUga3RocmVhZCB3aGVuIGl0cyBDUFUgZ29lcyBvZmZsaW5lLC4KKyAqLworc3RhdGljIHZvaWQgcmN1X3N0b3BfY3B1X2t0aHJlYWQoaW50IGNwdSkKIHsKLQlpZiAocm5wLT5ib29zdF9rdGhyZWFkX3Rhc2spCi0JCXdha2VfdXBfcHJvY2VzcyhybnAtPmJvb3N0X2t0aHJlYWRfdGFzayk7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCisJLyogU3RvcCB0aGUgQ1BVJ3Mga3RocmVhZC4gKi8KKwl0ID0gcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KTsKKwlpZiAodCAhPSBOVUxMKSB7CisJCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSkgPSBOVUxMOworCQlrdGhyZWFkX3N0b3AodCk7CisJfQorfQorCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLworCitzdGF0aWMgdm9pZCByY3Vfa3RocmVhZF9kb193b3JrKHZvaWQpCit7CisJcmN1X2RvX2JhdGNoKCZyY3Vfc2NoZWRfc3RhdGUsICZfX2dldF9jcHVfdmFyKHJjdV9zY2hlZF9kYXRhKSk7CisJcmN1X2RvX2JhdGNoKCZyY3VfYmhfc3RhdGUsICZfX2dldF9jcHVfdmFyKHJjdV9iaF9kYXRhKSk7CisJcmN1X3ByZWVtcHRfZG9fY2FsbGJhY2tzKCk7Cit9CisKKy8qCisgKiBXYWtlIHVwIHRoZSBzcGVjaWZpZWQgcGVyLXJjdV9ub2RlLXN0cnVjdHVyZSBrdGhyZWFkLgorICogQmVjYXVzZSB0aGUgcGVyLXJjdV9ub2RlIGt0aHJlYWRzIGFyZSBpbW1vcnRhbCwgd2UgZG9uJ3QgbmVlZAorICogdG8gZG8gYW55dGhpbmcgdG8ga2VlcCB0aGVtIGFsaXZlLgorICovCitzdGF0aWMgdm9pZCBpbnZva2VfcmN1X25vZGVfa3RocmVhZChzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CisKKwl0ID0gcm5wLT5ub2RlX2t0aHJlYWRfdGFzazsKKwlpZiAodCAhPSBOVUxMKQorCQl3YWtlX3VwX3Byb2Nlc3ModCk7Cit9CisKKy8qCisgKiBTZXQgdGhlIHNwZWNpZmllZCBDUFUncyBrdGhyZWFkIHRvIHJ1biBSVCBvciBub3QsIGFzIHNwZWNpZmllZCBieQorICogdGhlIHRvX3J0IGFyZ3VtZW50LiAgVGhlIENQVS1ob3RwbHVnIGxvY2tzIGFyZSBoZWxkLCBzbyB0aGUgdGFzaworICogaXMgbm90IGdvaW5nIGF3YXkuCisgKi8KK3N0YXRpYyB2b2lkIHJjdV9jcHVfa3RocmVhZF9zZXRydChpbnQgY3B1LCBpbnQgdG9fcnQpCit7CisJaW50IHBvbGljeTsKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCisJdCA9IHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSk7CisJaWYgKHQgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmICh0b19ydCkgeworCQlwb2xpY3kgPSBTQ0hFRF9GSUZPOworCQlzcC5zY2hlZF9wcmlvcml0eSA9IFJDVV9LVEhSRUFEX1BSSU87CisJfSBlbHNlIHsKKwkJcG9saWN5ID0gU0NIRURfTk9STUFMOworCQlzcC5zY2hlZF9wcmlvcml0eSA9IDA7CisJfQorCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHQsIHBvbGljeSwgJnNwKTsKK30KKworLyoKKyAqIFRpbWVyIGhhbmRsZXIgdG8gaW5pdGlhdGUgdGhlIHdha2luZyB1cCBvZiBwZXItQ1BVIGt0aHJlYWRzIHRoYXQKKyAqIGhhdmUgeWllbGRlZCB0aGUgQ1BVIGR1ZSB0byBleGNlc3MgbnVtYmVycyBvZiBSQ1UgY2FsbGJhY2tzLgorICogV2Ugd2FrZSB1cCB0aGUgcGVyLXJjdV9ub2RlIGt0aHJlYWQsIHdoaWNoIGluIHR1cm4gd2lsbCB3YWtlIHVwCisgKiB0aGUgYm9vc3RlciBrdGhyZWFkLgorICovCitzdGF0aWMgdm9pZCByY3VfY3B1X2t0aHJlYWRfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHJjdV9kYXRhICpyZHAgPSBwZXJfY3B1X3B0cihyY3Vfc3RhdGUtPnJkYSwgYXJnKTsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IHJkcC0+bXlub2RlOworCisJYXRvbWljX29yKHJkcC0+Z3JwbWFzaywgJnJucC0+d2FrZW1hc2spOworCWludm9rZV9yY3Vfbm9kZV9rdGhyZWFkKHJucCk7Cit9CisKKy8qCisgKiBEcm9wIHRvIG5vbi1yZWFsLXRpbWUgcHJpb3JpdHkgYW5kIHlpZWxkLCBidXQgb25seSBhZnRlciBwb3N0aW5nIGEKKyAqIHRpbWVyIHRoYXQgd2lsbCBjYXVzZSB1cyB0byByZWdhaW4gb3VyIHJlYWwtdGltZSBwcmlvcml0eSBpZiB3ZQorICogcmVtYWluIHByZWVtcHRlZC4gIEVpdGhlciB3YXksIHdlIHJlc3RvcmUgb3VyIHJlYWwtdGltZSBwcmlvcml0eQorICogYmVmb3JlIHJldHVybmluZy4KKyAqLworc3RhdGljIHZvaWQgcmN1X3lpZWxkKHZvaWQgKCpmKSh1bnNpZ25lZCBsb25nKSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNjaGVkX3BhcmFtIHNwOworCXN0cnVjdCB0aW1lcl9saXN0IHlpZWxkX3RpbWVyOworCisJc2V0dXBfdGltZXJfb25fc3RhY2soJnlpZWxkX3RpbWVyLCBmLCBhcmcpOworCW1vZF90aW1lcigmeWllbGRfdGltZXIsIGppZmZpZXMgKyAyKTsKKwlzcC5zY2hlZF9wcmlvcml0eSA9IDA7CisJc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2soY3VycmVudCwgU0NIRURfTk9STUFMLCAmc3ApOworCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOworCXNjaGVkdWxlKCk7CisJc3Auc2NoZWRfcHJpb3JpdHkgPSBSQ1VfS1RIUkVBRF9QUklPOworCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKGN1cnJlbnQsIFNDSEVEX0ZJRk8sICZzcCk7CisJZGVsX3RpbWVyKCZ5aWVsZF90aW1lcik7Cit9CisKKy8qCisgKiBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIHJjdV9jcHVfa3RocmVhZCgpIGVuZHMgdXAgb24gdGhlIHdyb25nIENQVS4KKyAqIFRoaXMgY2FuIGhhcHBlbiB3aGlsZSB0aGUgY29ycmVzcG9uZGluZyBDUFUgaXMgZWl0aGVyIGNvbWluZyBvbmxpbmUKKyAqIG9yIGdvaW5nIG9mZmxpbmUuICBXZSBjYW5ub3Qgd2FpdCB1bnRpbCB0aGUgQ1BVIGlzIGZ1bGx5IG9ubGluZQorICogYmVmb3JlIHN0YXJ0aW5nIHRoZSBrdGhyZWFkLCBiZWNhdXNlIHRoZSB2YXJpb3VzIG5vdGlmaWVyIGZ1bmN0aW9ucworICogY2FuIHdhaXQgZm9yIFJDVSBncmFjZSBwZXJpb2RzLiAgU28gd2UgcGFyayByY3VfY3B1X2t0aHJlYWQoKSB1bnRpbAorICogdGhlIGNvcnJlc3BvbmRpbmcgQ1BVIGlzIG9ubGluZS4KKyAqCisgKiBSZXR1cm4gMSBpZiB0aGUga3RocmVhZCBuZWVkcyB0byBzdG9wLCAwIG90aGVyd2lzZS4KKyAqCisgKiBDYWxsZXIgbXVzdCBkaXNhYmxlIGJoLiAgVGhpcyBmdW5jdGlvbiBjYW4gbW9tZW50YXJpbHkgZW5hYmxlIGl0LgorICovCitzdGF0aWMgaW50IHJjdV9jcHVfa3RocmVhZF9zaG91bGRfc3RvcChpbnQgY3B1KQoreworCXdoaWxlIChjcHVfaXNfb2ZmbGluZShjcHUpIHx8CisJICAgICAgICFjcHVtYXNrX2VxdWFsKCZjdXJyZW50LT5jcHVzX2FsbG93ZWQsIGNwdW1hc2tfb2YoY3B1KSkgfHwKKwkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSkgeworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJcmV0dXJuIDE7CisJCXBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3N0YXR1cywgY3B1KSA9IFJDVV9LVEhSRUFEX09GRkNQVTsKKwkJcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfY3B1LCBjcHUpID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCQlpZiAoIWNwdW1hc2tfZXF1YWwoJmN1cnJlbnQtPmNwdXNfYWxsb3dlZCwgY3B1bWFza19vZihjcHUpKSkKKwkJCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIGNwdW1hc2tfb2YoY3B1KSk7CisJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwl9CisJcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfY3B1LCBjcHUpID0gY3B1OworCXJldHVybiAwOworfQorCisvKgorICogUGVyLUNQVSBrZXJuZWwgdGhyZWFkIHRoYXQgaW52b2tlcyBSQ1UgY2FsbGJhY2tzLiAgVGhpcyByZXBsYWNlcyB0aGUKKyAqIGVhcmxpZXIgUkNVIHNvZnRpcnEuCisgKi8KK3N0YXRpYyBpbnQgcmN1X2NwdV9rdGhyZWFkKHZvaWQgKmFyZykKK3sKKwlpbnQgY3B1ID0gKGludCkobG9uZylhcmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3BpbmNudCA9IDA7CisJdW5zaWduZWQgaW50ICpzdGF0dXNwID0gJnBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3N0YXR1cywgY3B1KTsKKwljaGFyIHdvcms7CisJY2hhciAqd29ya3AgPSAmcGVyX2NwdShyY3VfY3B1X2hhc193b3JrLCBjcHUpOworCisJZm9yICg7OykgeworCQkqc3RhdHVzcCA9IFJDVV9LVEhSRUFEX1dBSVRJTkc7CisJCXJjdV93YWl0KCp3b3JrcCAhPSAwIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CisJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJaWYgKHJjdV9jcHVfa3RocmVhZF9zaG91bGRfc3RvcChjcHUpKSB7CisJCQlsb2NhbF9iaF9lbmFibGUoKTsKKwkJCWJyZWFrOworCQl9CisJCSpzdGF0dXNwID0gUkNVX0tUSFJFQURfUlVOTklORzsKKwkJcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfbG9vcHMsIGNwdSkrKzsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQl3b3JrID0gKndvcmtwOworCQkqd29ya3AgPSAwOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWlmICh3b3JrKQorCQkJcmN1X2t0aHJlYWRfZG9fd29yaygpOworCQlsb2NhbF9iaF9lbmFibGUoKTsKKwkJaWYgKCp3b3JrcCAhPSAwKQorCQkJc3BpbmNudCsrOworCQllbHNlCisJCQlzcGluY250ID0gMDsKKwkJaWYgKHNwaW5jbnQgPiAxMCkgeworCQkJKnN0YXR1c3AgPSBSQ1VfS1RIUkVBRF9ZSUVMRElORzsKKwkJCXJjdV95aWVsZChyY3VfY3B1X2t0aHJlYWRfdGltZXIsICh1bnNpZ25lZCBsb25nKWNwdSk7CisJCQlzcGluY250ID0gMDsKKwkJfQorCX0KKwkqc3RhdHVzcCA9IFJDVV9LVEhSRUFEX1NUT1BQRUQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTcGF3biBhIHBlci1DUFUga3RocmVhZCwgc2V0dGluZyB1cCBhZmZpbml0eSBhbmQgcHJpb3JpdHkuCisgKiBCZWNhdXNlIHRoZSBDUFUgaG90cGx1ZyBsb2NrIGlzIGhlbGQsIG5vIG90aGVyIENQVSB3aWxsIGJlIGF0dGVtcHRpbmcKKyAqIHRvIG1hbmlwdWxhdGUgcmN1X2NwdV9rdGhyZWFkX3Rhc2suICBUaGVyZSBtaWdodCBiZSBhbm90aGVyIENQVQorICogYXR0ZW1wdGluZyB0byBhY2Nlc3MgaXQgZHVyaW5nIGJvb3QsIGJ1dCB0aGUgbG9ja2luZyBpbiBrdGhyZWFkX2JpbmQoKQorICogd2lsbCBlbmZvcmNlIHN1ZmZpY2llbnQgb3JkZXJpbmcuCisgKgorICogUGxlYXNlIG5vdGUgdGhhdCB3ZSBjYW5ub3Qgc2ltcGx5IHJlZnVzZSB0byB3YWtlIHVwIHRoZSBwZXItQ1BVCisgKiBrdGhyZWFkIGJlY2F1c2Uga3RocmVhZHMgYXJlIGNyZWF0ZWQgaW4gVEFTS19VTklOVEVSUlVQVElCTEUgc3RhdGUsCisgKiB3aGljaCBjYW4gcmVzdWx0IGluIHNvZnRsb2NrdXAgY29tcGxhaW50cyBpZiB0aGUgdGFzayBlbmRzIHVwIGJlaW5nCisgKiBpZGxlIGZvciBtb3JlIHRoYW4gYSBjb3VwbGUgb2YgbWludXRlcy4KKyAqCisgKiBIb3dldmVyLCBwbGVhc2Ugbm90ZSBhbHNvIHRoYXQgd2UgY2Fubm90IGJpbmQgdGhlIHBlci1DUFUga3RocmVhZCB0byBpdHMKKyAqIENQVSB1bnRpbCB0aGF0IENQVSBpcyBmdWxseSBvbmxpbmUuICBXZSBhbHNvIGNhbm5vdCB3YWl0IHVudGlsIHRoZQorICogQ1BVIGlzIGZ1bGx5IG9ubGluZSBiZWZvcmUgd2UgY3JlYXRlIGl0cyBwZXItQ1BVIGt0aHJlYWQsIGFzIHRoaXMgd291bGQKKyAqIGRlYWRsb2NrIHRoZSBzeXN0ZW0gd2hlbiBDUFUgbm90aWZpZXJzIHRyaWVkIHdhaXRpbmcgZm9yIGdyYWNlCisgKiBwZXJpb2RzLiAgU28gd2UgYmluZCB0aGUgcGVyLUNQVSBrdGhyZWFkIHRvIGl0cyBDUFUgb25seSBpZiB0aGUgQ1BVCisgKiBpcyBvbmxpbmUuICBJZiBpdHMgQ1BVIGlzIG5vdCB5ZXQgZnVsbHkgb25saW5lLCB0aGVuIHRoZSBjb2RlIGluCisgKiByY3VfY3B1X2t0aHJlYWQoKSB3aWxsIHdhaXQgdW50aWwgaXQgaXMgZnVsbHkgb25saW5lLCBhbmQgdGhlbiBkbworICogdGhlIGJpbmRpbmcuCisgKi8KK3N0YXRpYyBpbnQgX19jcHVpbml0IHJjdV9zcGF3bl9vbmVfY3B1X2t0aHJlYWQoaW50IGNwdSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCisJaWYgKCFyY3Vfc2NoZWR1bGVyX2Z1bGx5X2FjdGl2ZSB8fAorCSAgICBwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF90YXNrLCBjcHUpICE9IE5VTEwpCisJCXJldHVybiAwOworCXQgPSBrdGhyZWFkX2NyZWF0ZShyY3VfY3B1X2t0aHJlYWQsICh2b2lkICopKGxvbmcpY3B1LCAicmN1YyVkIiwgY3B1KTsKKwlpZiAoSVNfRVJSKHQpKQorCQlyZXR1cm4gUFRSX0VSUih0KTsKKwlpZiAoY3B1X29ubGluZShjcHUpKQorCQlrdGhyZWFkX2JpbmQodCwgY3B1KTsKKwlwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9jcHUsIGNwdSkgPSBjcHU7CisJV0FSTl9PTl9PTkNFKHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSkgIT0gTlVMTCk7CisJc3Auc2NoZWRfcHJpb3JpdHkgPSBSQ1VfS1RIUkVBRF9QUklPOworCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHQsIFNDSEVEX0ZJRk8sICZzcCk7CisJcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfdGFzaywgY3B1KSA9IHQ7CisJd2FrZV91cF9wcm9jZXNzKHQpOyAvKiBHZXQgdG8gVEFTS19JTlRFUlJVUFRJQkxFIHF1aWNrbHkuICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXItcmN1X25vZGUga3RocmVhZCwgd2hpY2ggaXMgaW4gY2hhcmdlIG9mIHdha2luZyB1cCB0aGUgcGVyLUNQVQorICoga3RocmVhZHMgd2hlbiBuZWVkZWQuICBXZSBpZ25vcmUgcmVxdWVzdHMgdG8gd2FrZSB1cCBrdGhyZWFkcworICogZm9yIG9mZmxpbmUgQ1BVcywgd2hpY2ggaXMgT0sgYmVjYXVzZSBmb3JjZV9xdWllc2NlbnRfc3RhdGUoKQorICogdGFrZXMgY2FyZSBvZiB0aGlzIGNhc2UuCisgKi8KK3N0YXRpYyBpbnQgcmN1X25vZGVfa3RocmVhZCh2b2lkICphcmcpCit7CisJaW50IGNwdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IChzdHJ1Y3QgcmN1X25vZGUgKilhcmc7CisJc3RydWN0IHNjaGVkX3BhcmFtIHNwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCWZvciAoOzspIHsKKwkJcm5wLT5ub2RlX2t0aHJlYWRfc3RhdHVzID0gUkNVX0tUSFJFQURfV0FJVElORzsKKwkJcmN1X3dhaXQoYXRvbWljX3JlYWQoJnJucC0+d2FrZW1hc2spICE9IDApOworCQlybnAtPm5vZGVfa3RocmVhZF9zdGF0dXMgPSBSQ1VfS1RIUkVBRF9SVU5OSU5HOworCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOworCQltYXNrID0gYXRvbWljX3hjaGcoJnJucC0+d2FrZW1hc2ssIDApOworCQlyY3VfaW5pdGlhdGVfYm9vc3Qocm5wLCBmbGFncyk7IC8qIHJlbGVhc2VzIHJucC0+bG9jay4gKi8KKwkJZm9yIChjcHUgPSBybnAtPmdycGxvOyBjcHUgPD0gcm5wLT5ncnBoaTsgY3B1KyssIG1hc2sgPj49IDEpIHsKKwkJCWlmICgobWFzayAmIDB4MSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXByZWVtcHRfZGlzYWJsZSgpOworCQkJdCA9IHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3Rhc2ssIGNwdSk7CisJCQlpZiAoIWNwdV9vbmxpbmUoY3B1KSB8fCB0ID09IE5VTEwpIHsKKwkJCQlwcmVlbXB0X2VuYWJsZSgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcGVyX2NwdShyY3VfY3B1X2hhc193b3JrLCBjcHUpID0gMTsKKwkJCXNwLnNjaGVkX3ByaW9yaXR5ID0gUkNVX0tUSFJFQURfUFJJTzsKKwkJCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHQsIFNDSEVEX0ZJRk8sICZzcCk7CisJCQlwcmVlbXB0X2VuYWJsZSgpOworCQl9CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KKwlybnAtPm5vZGVfa3RocmVhZF9zdGF0dXMgPSBSQ1VfS1RIUkVBRF9TVE9QUEVEOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHRoZSBwZXItcmN1X25vZGUga3RocmVhZCdzIGFmZmluaXR5IHRvIGNvdmVyIGFsbCBDUFVzIHRoYXQgYXJlCisgKiBzZXJ2ZWQgYnkgdGhlIHJjdV9ub2RlIGluIHF1ZXN0aW9uLiAgVGhlIENQVSBob3RwbHVnIGxvY2sgaXMgc3RpbGwKKyAqIGhlbGQsIHNvIHRoZSB2YWx1ZSBvZiBybnAtPnFzbWFza2luaXQgd2lsbCBiZSBzdGFibGUuCisgKgorICogV2UgZG9uJ3QgaW5jbHVkZSBvdXRnb2luZ2NwdSBpbiB0aGUgYWZmaW5pdHkgc2V0LCB1c2UgLTEgaWYgdGhlcmUgaXMKKyAqIG5vIG91dGdvaW5nIENQVS4gIElmIHRoZXJlIGFyZSBubyBDUFVzIGxlZnQgaW4gdGhlIGFmZmluaXR5IHNldCwKKyAqIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBrdGhyZWFkIHRvIGV4ZWN1dGUgb24gYW55IENQVS4KKyAqLworc3RhdGljIHZvaWQgcmN1X25vZGVfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwgaW50IG91dGdvaW5nY3B1KQoreworCWNwdW1hc2tfdmFyX3QgY207CisJaW50IGNwdTsKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSBybnAtPnFzbWFza2luaXQ7CisKKwlpZiAocm5wLT5ub2RlX2t0aHJlYWRfdGFzayA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmY20sIEdGUF9LRVJORUwpKQorCQlyZXR1cm47CisJY3B1bWFza19jbGVhcihjbSk7CisJZm9yIChjcHUgPSBybnAtPmdycGxvOyBjcHUgPD0gcm5wLT5ncnBoaTsgY3B1KyssIG1hc2sgPj49IDEpCisJCWlmICgobWFzayAmIDB4MSkgJiYgY3B1ICE9IG91dGdvaW5nY3B1KQorCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgY20pOworCWlmIChjcHVtYXNrX3dlaWdodChjbSkgPT0gMCkgeworCQljcHVtYXNrX3NldGFsbChjbSk7CisJCWZvciAoY3B1ID0gcm5wLT5ncnBsbzsgY3B1IDw9IHJucC0+Z3JwaGk7IGNwdSsrKQorCQkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBjbSk7CisJCVdBUk5fT05fT05DRShjcHVtYXNrX3dlaWdodChjbSkgPT0gMCk7CisJfQorCXNldF9jcHVzX2FsbG93ZWRfcHRyKHJucC0+bm9kZV9rdGhyZWFkX3Rhc2ssIGNtKTsKKwlyY3VfYm9vc3Rfa3RocmVhZF9zZXRhZmZpbml0eShybnAsIGNtKTsKKwlmcmVlX2NwdW1hc2tfdmFyKGNtKTsKK30KKworLyoKKyAqIFNwYXduIGEgcGVyLXJjdV9ub2RlIGt0aHJlYWQsIHNldHRpbmcgcHJpb3JpdHkgYW5kIGFmZmluaXR5LgorICogQ2FsbGVkIGR1cmluZyBib290IGJlZm9yZSBvbmxpbmUvb2ZmbGluZSBjYW4gaGFwcGVuLCBvciwgaWYKKyAqIGR1cmluZyBydW50aW1lLCB3aXRoIHRoZSBtYWluIENQVS1ob3RwbHVnIGxvY2tzIGhlbGQuICBTbyBvbmx5CisgKiBvbmUgb2YgdGhlc2UgY2FuIGJlIGV4ZWN1dGluZyBhdCBhIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQgX19jcHVpbml0IHJjdV9zcGF3bl9vbmVfbm9kZV9rdGhyZWFkKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwKKwkJCQkJCXN0cnVjdCByY3Vfbm9kZSAqcm5wKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJucF9pbmRleCA9IHJucCAtICZyc3AtPm5vZGVbMF07CisJc3RydWN0IHNjaGVkX3BhcmFtIHNwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCWlmICghcmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUgfHwKKwkgICAgcm5wLT5xc21hc2tpbml0ID09IDApCisJCXJldHVybiAwOworCWlmIChybnAtPm5vZGVfa3RocmVhZF90YXNrID09IE5VTEwpIHsKKwkJdCA9IGt0aHJlYWRfY3JlYXRlKHJjdV9ub2RlX2t0aHJlYWQsICh2b2lkICopcm5wLAorCQkJCSAgICJyY3VuJWQiLCBybnBfaW5kZXgpOworCQlpZiAoSVNfRVJSKHQpKQorCQkJcmV0dXJuIFBUUl9FUlIodCk7CisJCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJCXJucC0+bm9kZV9rdGhyZWFkX3Rhc2sgPSB0OworCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJCXNwLnNjaGVkX3ByaW9yaXR5ID0gOTk7CisJCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHQsIFNDSEVEX0ZJRk8sICZzcCk7CisJCXdha2VfdXBfcHJvY2Vzcyh0KTsgLyogZ2V0IHRvIFRBU0tfSU5URVJSVVBUSUJMRSBxdWlja2x5LiAqLworCX0KKwlyZXR1cm4gcmN1X3NwYXduX29uZV9ib29zdF9rdGhyZWFkKHJzcCwgcm5wLCBybnBfaW5kZXgpOworfQorCisvKgorICogU3Bhd24gYWxsIGt0aHJlYWRzIC0tIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBzY2hlZHVsZXIgaXMgcnVubmluZy4KKyAqLworc3RhdGljIGludCBfX2luaXQgcmN1X3NwYXduX2t0aHJlYWRzKHZvaWQpCit7CisJaW50IGNwdTsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKKworCXJjdV9zY2hlZHVsZXJfZnVsbHlfYWN0aXZlID0gMTsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXBlcl9jcHUocmN1X2NwdV9oYXNfd29yaywgY3B1KSA9IDA7CisJCWlmIChjcHVfb25saW5lKGNwdSkpCisJCQkodm9pZClyY3Vfc3Bhd25fb25lX2NwdV9rdGhyZWFkKGNwdSk7CisJfQorCXJucCA9IHJjdV9nZXRfcm9vdChyY3Vfc3RhdGUpOworCSh2b2lkKXJjdV9zcGF3bl9vbmVfbm9kZV9rdGhyZWFkKHJjdV9zdGF0ZSwgcm5wKTsKKwlpZiAoTlVNX1JDVV9OT0RFUyA+IDEpIHsKKwkJcmN1X2Zvcl9lYWNoX2xlYWZfbm9kZShyY3Vfc3RhdGUsIHJucCkKKwkJCSh2b2lkKXJjdV9zcGF3bl9vbmVfbm9kZV9rdGhyZWFkKHJjdV9zdGF0ZSwgcm5wKTsKKwl9CisJcmV0dXJuIDA7Cit9CitlYXJseV9pbml0Y2FsbChyY3Vfc3Bhd25fa3RocmVhZHMpOworCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgcmN1X3ByZXBhcmVfa3RocmVhZHMoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHBlcl9jcHVfcHRyKHJjdV9zdGF0ZS0+cmRhLCBjcHUpOworCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gcmRwLT5teW5vZGU7CisKKwkvKiBGaXJlIHVwIHRoZSBpbmNvbWluZyBDUFUncyBrdGhyZWFkIGFuZCBsZWFmIHJjdV9ub2RlIGt0aHJlYWQuICovCisJaWYgKHJjdV9zY2hlZHVsZXJfZnVsbHlfYWN0aXZlKSB7CisJCSh2b2lkKXJjdV9zcGF3bl9vbmVfY3B1X2t0aHJlYWQoY3B1KTsKKwkJaWYgKHJucC0+bm9kZV9rdGhyZWFkX3Rhc2sgPT0gTlVMTCkKKwkJCSh2b2lkKXJjdV9zcGF3bl9vbmVfbm9kZV9rdGhyZWFkKHJjdV9zdGF0ZSwgcm5wKTsKKwl9CiB9CiAKICNlbHNlIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCkBAIC0xMzE1LDIzICsxNzI2LDM5IEBACiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCByY3VfYm9vc3Rfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwKLQkJCQkJICBjcHVtYXNrX3Zhcl90IGNtKQorc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jYWxsYmFja3Nfa3RocmVhZCh2b2lkKQogeworCVdBUk5fT05fT05DRSgxKTsKIH0KIAogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfYm9vc3Rfc3RhcnRfZ3Aoc3RydWN0IHJjdV9ub2RlICpybnApCiB7CiB9CiAKLXN0YXRpYyBpbnQgX19jcHVpbml0IHJjdV9zcGF3bl9vbmVfYm9vc3Rfa3RocmVhZChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCi0JCQkJCQkgc3RydWN0IHJjdV9ub2RlICpybnAsCi0JCQkJCQkgaW50IHJucF9pbmRleCkKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworc3RhdGljIHZvaWQgcmN1X3N0b3BfY3B1X2t0aHJlYWQoaW50IGNwdSkKIHsKLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19jcHVpbml0IHJjdV93YWtlX29uZV9ib29zdF9rdGhyZWFkKHN0cnVjdCByY3Vfbm9kZSAqcm5wKQorI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KKworc3RhdGljIHZvaWQgcmN1X25vZGVfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwgaW50IG91dGdvaW5nY3B1KQoreworfQorCitzdGF0aWMgdm9pZCByY3VfY3B1X2t0aHJlYWRfc2V0cnQoaW50IGNwdSwgaW50IHRvX3J0KQoreworfQorCitzdGF0aWMgaW50IF9faW5pdCByY3Vfc2NoZWR1bGVyX3JlYWxseV9zdGFydGVkKHZvaWQpCit7CisJcmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUgPSAxOworCXJldHVybiAwOworfQorZWFybHlfaW5pdGNhbGwocmN1X3NjaGVkdWxlcl9yZWFsbHlfc3RhcnRlZCk7CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3VfcHJlcGFyZV9rdGhyZWFkcyhpbnQgY3B1KQogewogfQogCkBAIC0xNTA5LDcgKzE5MzYsNyBAQAogICoKICAqIEJlY2F1c2UgaXQgaXMgbm90IGxlZ2FsIHRvIGludm9rZSByY3VfcHJvY2Vzc19jYWxsYmFja3MoKSB3aXRoIGlycXMKICAqIGRpc2FibGVkLCB3ZSBkbyBvbmUgcGFzcyBvZiBmb3JjZV9xdWllc2NlbnRfc3RhdGUoKSwgdGhlbiBkbyBhCi0gKiBpbnZva2VfcmN1X2NwdV9rdGhyZWFkKCkgdG8gY2F1c2UgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCkgdG8gYmUgaW52b2tlZAorICogaW52b2tlX3JjdV9jb3JlKCkgdG8gY2F1c2UgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCkgdG8gYmUgaW52b2tlZAogICogbGF0ZXIuICBUaGUgcGVyLWNwdSByY3VfZHludGlja19kcmFpbiB2YXJpYWJsZSBjb250cm9scyB0aGUgc2VxdWVuY2luZy4KICAqLwogaW50IHJjdV9uZWVkc19jcHUoaW50IGNwdSkKQEAgLTE1NjAsNyArMTk4Nyw3IEBACiAKIAkvKiBJZiBSQ1UgY2FsbGJhY2tzIGFyZSBzdGlsbCBwZW5kaW5nLCBSQ1Ugc3RpbGwgbmVlZHMgdGhpcyBDUFUuICovCiAJaWYgKGMpCi0JCWludm9rZV9yY3VfY3B1X2t0aHJlYWQoKTsKKwkJaW52b2tlX3JjdV9jb3JlKCk7CiAJcmV0dXJuIGM7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0cmVlX3RyYWNlLmMgYi9rZXJuZWwvcmN1dHJlZV90cmFjZS5jCmluZGV4IDk2NzhjYzMuLjRlMTQ0ODcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0cmVlX3RyYWNlLmMKKysrIGIva2VybmVsL3JjdXRyZWVfdHJhY2UuYwpAQCAtNDYsNiArNDYsOCBAQAogI2RlZmluZSBSQ1VfVFJFRV9OT05DT1JFCiAjaW5jbHVkZSAicmN1dHJlZS5oIgogCisjaWZkZWYgQ09ORklHX1JDVV9CT09TVAorCiBERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgaW50LCByY3VfY3B1X2t0aHJlYWRfc3RhdHVzKTsKIERFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIHJjdV9jcHVfa3RocmVhZF9jcHUpOwogREVDTEFSRV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgcmN1X2NwdV9rdGhyZWFkX2xvb3BzKTsKQEAgLTU4LDYgKzYwLDggQEAKIAlyZXR1cm4gIlNSV09ZIltrdGhyZWFkX3N0YXR1c107CiB9CiAKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVCAqLworCiBzdGF0aWMgdm9pZCBwcmludF9vbmVfcmN1X2RhdGEoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKIHsKIAlpZiAoIXJkcC0+YmVlbm9ubGluZSkKQEAgLTc2LDcgKzgwLDcgQEAKIAkJICAgcmRwLT5keW50aWNrc19mcXMpOwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTk9fSFogKi8KIAlzZXFfcHJpbnRmKG0sICIgb2Y9JWx1IHJpPSVsdSIsIHJkcC0+b2ZmbGluZV9mcXMsIHJkcC0+cmVzY2hlZF9pcGkpOwotCXNlcV9wcmludGYobSwgIiBxbD0lbGQgcXM9JWMlYyVjJWMga3Q9JWQvJWMvJWQga3RsPSV4IGI9JWxkIiwKKwlzZXFfcHJpbnRmKG0sICIgcWw9JWxkIHFzPSVjJWMlYyVjIiwKIAkJICAgcmRwLT5xbGVuLAogCQkgICAiLk4iW3JkcC0+bnh0dGFpbFtSQ1VfTkVYVF9SRUFEWV9UQUlMXSAhPQogCQkJcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1RBSUxdXSwKQEAgLTg0LDEzICs4OCwxNiBAQAogCQkJcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1JFQURZX1RBSUxdXSwKIAkJICAgIi5XIltyZHAtPm54dHRhaWxbUkNVX0RPTkVfVEFJTF0gIT0KIAkJCXJkcC0+bnh0dGFpbFtSQ1VfV0FJVF9UQUlMXV0sCi0JCSAgICIuRCJbJnJkcC0+bnh0bGlzdCAhPSByZHAtPm54dHRhaWxbUkNVX0RPTkVfVEFJTF1dLAorCQkgICAiLkQiWyZyZHAtPm54dGxpc3QgIT0gcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdXSk7CisjaWZkZWYgQ09ORklHX1JDVV9CT09TVAorCXNlcV9wcmludGYobSwgIiBrdD0lZC8lYy8lZCBrdGw9JXgiLAogCQkgICBwZXJfY3B1KHJjdV9jcHVfaGFzX3dvcmssIHJkcC0+Y3B1KSwKIAkJICAgY29udmVydF9rdGhyZWFkX3N0YXR1cyhwZXJfY3B1KHJjdV9jcHVfa3RocmVhZF9zdGF0dXMsCiAJCQkJCSAgcmRwLT5jcHUpKSwKIAkJICAgcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfY3B1LCByZHAtPmNwdSksCi0JCSAgIHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX2xvb3BzLCByZHAtPmNwdSkgJiAweGZmZmYsCi0JCSAgIHJkcC0+YmxpbWl0KTsKKwkJICAgcGVyX2NwdShyY3VfY3B1X2t0aHJlYWRfbG9vcHMsIHJkcC0+Y3B1KSAmIDB4ZmZmZik7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KKwlzZXFfcHJpbnRmKG0sICIgYj0lbGQiLCByZHAtPmJsaW1pdCk7CiAJc2VxX3ByaW50ZihtLCAiIGNpPSVsdSBjbz0lbHUgY2E9JWx1XG4iLAogCQkgICByZHAtPm5fY2JzX2ludm9rZWQsIHJkcC0+bl9jYnNfb3JwaGFuZWQsIHJkcC0+bl9jYnNfYWRvcHRlZCk7CiB9CkBAIC0xNDcsMTggKzE1NCwyMSBAQAogCQkgICByZHAtPmR5bnRpY2tzX2Zxcyk7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLwogCXNlcV9wcmludGYobSwgIiwlbHUsJWx1IiwgcmRwLT5vZmZsaW5lX2ZxcywgcmRwLT5yZXNjaGVkX2lwaSk7Ci0Jc2VxX3ByaW50ZihtLCAiLCVsZCxcIiVjJWMlYyVjXCIsJWQsXCIlY1wiLCVsZCIsIHJkcC0+cWxlbiwKKwlzZXFfcHJpbnRmKG0sICIsJWxkLFwiJWMlYyVjJWNcIiIsIHJkcC0+cWxlbiwKIAkJICAgIi5OIltyZHAtPm54dHRhaWxbUkNVX05FWFRfUkVBRFlfVEFJTF0gIT0KIAkJCXJkcC0+bnh0dGFpbFtSQ1VfTkVYVF9UQUlMXV0sCiAJCSAgICIuUiJbcmRwLT5ueHR0YWlsW1JDVV9XQUlUX1RBSUxdICE9CiAJCQlyZHAtPm54dHRhaWxbUkNVX05FWFRfUkVBRFlfVEFJTF1dLAogCQkgICAiLlciW3JkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXSAhPQogCQkJcmRwLT5ueHR0YWlsW1JDVV9XQUlUX1RBSUxdXSwKLQkJICAgIi5EIlsmcmRwLT5ueHRsaXN0ICE9IHJkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXV0sCisJCSAgICIuRCJbJnJkcC0+bnh0bGlzdCAhPSByZHAtPm54dHRhaWxbUkNVX0RPTkVfVEFJTF1dKTsKKyNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCisJc2VxX3ByaW50ZihtLCAiLCVkLFwiJWNcIiIsCiAJCSAgIHBlcl9jcHUocmN1X2NwdV9oYXNfd29yaywgcmRwLT5jcHUpLAogCQkgICBjb252ZXJ0X2t0aHJlYWRfc3RhdHVzKHBlcl9jcHUocmN1X2NwdV9rdGhyZWFkX3N0YXR1cywKLQkJCQkJICByZHAtPmNwdSkpLAotCQkgICByZHAtPmJsaW1pdCk7CisJCQkJCSAgcmRwLT5jcHUpKSk7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KKwlzZXFfcHJpbnRmKG0sICIsJWxkIiwgcmRwLT5ibGltaXQpOwogCXNlcV9wcmludGYobSwgIiwlbHUsJWx1LCVsdVxuIiwKIAkJICAgcmRwLT5uX2Nic19pbnZva2VkLCByZHAtPm5fY2JzX29ycGhhbmVkLCByZHAtPm5fY2JzX2Fkb3B0ZWQpOwogfQpAQCAtMTY5LDcgKzE3OSwxMSBAQAogI2lmZGVmIENPTkZJR19OT19IWgogCXNlcV9wdXRzKG0sICJcImR0XCIsXCJkdCBuZXN0aW5nXCIsXCJkdCBOTUkgbmVzdGluZ1wiLFwiZGZcIiwiKTsKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCi0Jc2VxX3B1dHMobSwgIlwib2ZcIixcInJpXCIsXCJxbFwiLFwiYlwiLFwiY2lcIixcImNvXCIsXCJjYVwiXG4iKTsKKwlzZXFfcHV0cyhtLCAiXCJvZlwiLFwicmlcIixcInFsXCIsXCJxc1wiIik7CisjaWZkZWYgQ09ORklHX1JDVV9CT09TVAorCXNlcV9wdXRzKG0sICJcImt0XCIsXCJrdGxcIiIpOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCisJc2VxX3B1dHMobSwgIixcImJcIixcImNpXCIsXCJjb1wiLFwiY2FcIlxuIik7CiAjaWZkZWYgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UKIAlzZXFfcHV0cyhtLCAiXCJyY3VfcHJlZW1wdDpcIlxuIik7CiAJUFJJTlRfUkNVX0RBVEEocmN1X3ByZWVtcHRfZGF0YSwgcHJpbnRfb25lX3JjdV9kYXRhX2NzdiwgbSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9yZXNvdXJjZS5jCmluZGV4IDc5OGUyZmEuLjNmZjQwMTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2tlcm5lbC9yZXNvdXJjZS5jCkBAIC0zOCw2ICszOCwxNCBAQAogfTsKIEVYUE9SVF9TWU1CT0woaW9tZW1fcmVzb3VyY2UpOwogCisvKiBjb25zdHJhaW50cyB0byBiZSBtZXQgd2hpbGUgYWxsb2NhdGluZyByZXNvdXJjZXMgKi8KK3N0cnVjdCByZXNvdXJjZV9jb25zdHJhaW50IHsKKwlyZXNvdXJjZV9zaXplX3QgbWluLCBtYXgsIGFsaWduOworCXJlc291cmNlX3NpemVfdCAoKmFsaWduZikodm9pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKiwKKwkJCXJlc291cmNlX3NpemVfdCwgcmVzb3VyY2Vfc2l6ZV90KTsKKwl2b2lkICphbGlnbmZfZGF0YTsKK307CisKIHN0YXRpYyBERUZJTkVfUldMT0NLKHJlc291cmNlX2xvY2spOwogCiBzdGF0aWMgdm9pZCAqcl9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCkBAIC0zODQsMTYgKzM5MiwxMyBAQAogfQogCiAvKgotICogRmluZCBlbXB0eSBzbG90IGluIHRoZSByZXNvdXJjZSB0cmVlIGdpdmVuIHJhbmdlIGFuZCBhbGlnbm1lbnQuCisgKiBGaW5kIGVtcHR5IHNsb3QgaW4gdGhlIHJlc291cmNlIHRyZWUgd2l0aCB0aGUgZ2l2ZW4gcmFuZ2UgYW5kCisgKiBhbGlnbm1lbnQgY29uc3RyYWludHMKICAqLwotc3RhdGljIGludCBmaW5kX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcm9vdCwgc3RydWN0IHJlc291cmNlICpuZXcsCi0JCQkgcmVzb3VyY2Vfc2l6ZV90IHNpemUsIHJlc291cmNlX3NpemVfdCBtaW4sCi0JCQkgcmVzb3VyY2Vfc2l6ZV90IG1heCwgcmVzb3VyY2Vfc2l6ZV90IGFsaWduLAotCQkJIHJlc291cmNlX3NpemVfdCAoKmFsaWduZikodm9pZCAqLAotCQkJCQkJICAgY29uc3Qgc3RydWN0IHJlc291cmNlICosCi0JCQkJCQkgICByZXNvdXJjZV9zaXplX3QsCi0JCQkJCQkgICByZXNvdXJjZV9zaXplX3QpLAotCQkJIHZvaWQgKmFsaWduZl9kYXRhKQorc3RhdGljIGludCBfX2ZpbmRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKm9sZCwKKwkJCSBzdHJ1Y3QgcmVzb3VyY2UgKm5ldywKKwkJCSByZXNvdXJjZV9zaXplX3QgIHNpemUsCisJCQkgc3RydWN0IHJlc291cmNlX2NvbnN0cmFpbnQgKmNvbnN0cmFpbnQpCiB7CiAJc3RydWN0IHJlc291cmNlICp0aGlzID0gcm9vdC0+Y2hpbGQ7CiAJc3RydWN0IHJlc291cmNlIHRtcCA9ICpuZXcsIGF2YWlsLCBhbGxvYzsKQEAgLTQwNCwyNSArNDA5LDI2IEBACiAJICogU2tpcCBwYXN0IGFuIGFsbG9jYXRlZCByZXNvdXJjZSB0aGF0IHN0YXJ0cyBhdCAwLCBzaW5jZSB0aGUgYXNzaWdubWVudAogCSAqIG9mIHRoaXMtPnN0YXJ0IC0gMSB0byB0bXAtPmVuZCBiZWxvdyB3b3VsZCBjYXVzZSBhbiB1bmRlcmZsb3cuCiAJICovCi0JaWYgKHRoaXMgJiYgdGhpcy0+c3RhcnQgPT0gMCkgewotCQl0bXAuc3RhcnQgPSB0aGlzLT5lbmQgKyAxOworCWlmICh0aGlzICYmIHRoaXMtPnN0YXJ0ID09IHJvb3QtPnN0YXJ0KSB7CisJCXRtcC5zdGFydCA9ICh0aGlzID09IG9sZCkgPyBvbGQtPnN0YXJ0IDogdGhpcy0+ZW5kICsgMTsKIAkJdGhpcyA9IHRoaXMtPnNpYmxpbmc7CiAJfQogCWZvcig7OykgewogCQlpZiAodGhpcykKLQkJCXRtcC5lbmQgPSB0aGlzLT5zdGFydCAtIDE7CisJCQl0bXAuZW5kID0gKHRoaXMgPT0gb2xkKSA/ICB0aGlzLT5lbmQgOiB0aGlzLT5zdGFydCAtIDE7CiAJCWVsc2UKIAkJCXRtcC5lbmQgPSByb290LT5lbmQ7CiAKLQkJcmVzb3VyY2VfY2xpcCgmdG1wLCBtaW4sIG1heCk7CisJCXJlc291cmNlX2NsaXAoJnRtcCwgY29uc3RyYWludC0+bWluLCBjb25zdHJhaW50LT5tYXgpOwogCQlhcmNoX3JlbW92ZV9yZXNlcnZhdGlvbnMoJnRtcCk7CiAKIAkJLyogQ2hlY2sgZm9yIG92ZXJmbG93IGFmdGVyIEFMSUdOKCkgKi8KIAkJYXZhaWwgPSAqbmV3OwotCQlhdmFpbC5zdGFydCA9IEFMSUdOKHRtcC5zdGFydCwgYWxpZ24pOworCQlhdmFpbC5zdGFydCA9IEFMSUdOKHRtcC5zdGFydCwgY29uc3RyYWludC0+YWxpZ24pOwogCQlhdmFpbC5lbmQgPSB0bXAuZW5kOwogCQlpZiAoYXZhaWwuc3RhcnQgPj0gdG1wLnN0YXJ0KSB7Ci0JCQlhbGxvYy5zdGFydCA9IGFsaWduZihhbGlnbmZfZGF0YSwgJmF2YWlsLCBzaXplLCBhbGlnbik7CisJCQlhbGxvYy5zdGFydCA9IGNvbnN0cmFpbnQtPmFsaWduZihjb25zdHJhaW50LT5hbGlnbmZfZGF0YSwgJmF2YWlsLAorCQkJCQlzaXplLCBjb25zdHJhaW50LT5hbGlnbik7CiAJCQlhbGxvYy5lbmQgPSBhbGxvYy5zdGFydCArIHNpemUgLSAxOwogCQkJaWYgKHJlc291cmNlX2NvbnRhaW5zKCZhdmFpbCwgJmFsbG9jKSkgewogCQkJCW5ldy0+c3RhcnQgPSBhbGxvYy5zdGFydDsKQEAgLTQzMiwxNCArNDM4LDc1IEBACiAJCX0KIAkJaWYgKCF0aGlzKQogCQkJYnJlYWs7Ci0JCXRtcC5zdGFydCA9IHRoaXMtPmVuZCArIDE7CisJCWlmICh0aGlzICE9IG9sZCkKKwkJCXRtcC5zdGFydCA9IHRoaXMtPmVuZCArIDE7CiAJCXRoaXMgPSB0aGlzLT5zaWJsaW5nOwogCX0KIAlyZXR1cm4gLUVCVVNZOwogfQogCisvKgorICogRmluZCBlbXB0eSBzbG90IGluIHRoZSByZXNvdXJjZSB0cmVlIGdpdmVuIHJhbmdlIGFuZCBhbGlnbm1lbnQuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsIHN0cnVjdCByZXNvdXJjZSAqbmV3LAorCQkJcmVzb3VyY2Vfc2l6ZV90IHNpemUsCisJCQlzdHJ1Y3QgcmVzb3VyY2VfY29uc3RyYWludCAgKmNvbnN0cmFpbnQpCit7CisJcmV0dXJuICBfX2ZpbmRfcmVzb3VyY2Uocm9vdCwgTlVMTCwgbmV3LCBzaXplLCBjb25zdHJhaW50KTsKK30KKwogLyoqCi0gKiBhbGxvY2F0ZV9yZXNvdXJjZSAtIGFsbG9jYXRlIGVtcHR5IHNsb3QgaW4gdGhlIHJlc291cmNlIHRyZWUgZ2l2ZW4gcmFuZ2UgJiBhbGlnbm1lbnQKKyAqIHJlYWxsb2NhdGVfcmVzb3VyY2UgLSBhbGxvY2F0ZSBhIHNsb3QgaW4gdGhlIHJlc291cmNlIHRyZWUgZ2l2ZW4gcmFuZ2UgJiBhbGlnbm1lbnQuCisgKglUaGUgcmVzb3VyY2Ugd2lsbCBiZSByZWxvY2F0ZWQgaWYgdGhlIG5ldyBzaXplIGNhbm5vdCBiZSByZWFsbG9jYXRlZCBpbiB0aGUKKyAqCWN1cnJlbnQgbG9jYXRpb24uCisgKgorICogQHJvb3Q6IHJvb3QgcmVzb3VyY2UgZGVzY3JpcHRvcgorICogQG9sZDogIHJlc291cmNlIGRlc2NyaXB0b3IgZGVzaXJlZCBieSBjYWxsZXIKKyAqIEBuZXdzaXplOiBuZXcgc2l6ZSBvZiB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvcgorICogQGNvbnN0cmFpbnQ6IHRoZSBzaXplIGFuZCBhbGlnbm1lbnQgY29uc3RyYWludHMgdG8gYmUgbWV0LgorICovCitpbnQgcmVhbGxvY2F0ZV9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsIHN0cnVjdCByZXNvdXJjZSAqb2xkLAorCQkJcmVzb3VyY2Vfc2l6ZV90IG5ld3NpemUsCisJCQlzdHJ1Y3QgcmVzb3VyY2VfY29uc3RyYWludCAgKmNvbnN0cmFpbnQpCit7CisJaW50IGVycj0wOworCXN0cnVjdCByZXNvdXJjZSBuZXcgPSAqb2xkOworCXN0cnVjdCByZXNvdXJjZSAqY29uZmxpY3Q7CisKKwl3cml0ZV9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKKworCWlmICgoZXJyID0gX19maW5kX3Jlc291cmNlKHJvb3QsIG9sZCwgJm5ldywgbmV3c2l6ZSwgY29uc3RyYWludCkpKQorCQlnb3RvIG91dDsKKworCWlmIChyZXNvdXJjZV9jb250YWlucygmbmV3LCBvbGQpKSB7CisJCW9sZC0+c3RhcnQgPSBuZXcuc3RhcnQ7CisJCW9sZC0+ZW5kID0gbmV3LmVuZDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG9sZC0+Y2hpbGQpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocmVzb3VyY2VfY29udGFpbnMob2xkLCAmbmV3KSkgeworCQlvbGQtPnN0YXJ0ID0gbmV3LnN0YXJ0OworCQlvbGQtPmVuZCA9IG5ldy5lbmQ7CisJfSBlbHNlIHsKKwkJX19yZWxlYXNlX3Jlc291cmNlKG9sZCk7CisJCSpvbGQgPSBuZXc7CisJCWNvbmZsaWN0ID0gX19yZXF1ZXN0X3Jlc291cmNlKHJvb3QsIG9sZCk7CisJCUJVR19PTihjb25mbGljdCk7CisJfQorb3V0OgorCXdyaXRlX3VubG9jaygmcmVzb3VyY2VfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworCisvKioKKyAqIGFsbG9jYXRlX3Jlc291cmNlIC0gYWxsb2NhdGUgZW1wdHkgc2xvdCBpbiB0aGUgcmVzb3VyY2UgdHJlZSBnaXZlbiByYW5nZSAmIGFsaWdubWVudC4KKyAqIAlUaGUgcmVzb3VyY2Ugd2lsbCBiZSByZWFsbG9jYXRlZCB3aXRoIGEgbmV3IHNpemUgaWYgaXQgd2FzIGFscmVhZHkgYWxsb2NhdGVkCiAgKiBAcm9vdDogcm9vdCByZXNvdXJjZSBkZXNjcmlwdG9yCiAgKiBAbmV3OiByZXNvdXJjZSBkZXNjcmlwdG9yIGRlc2lyZWQgYnkgY2FsbGVyCiAgKiBAc2l6ZTogcmVxdWVzdGVkIHJlc291cmNlIHJlZ2lvbiBzaXplCkBAIC00NTksMTIgKzUyNiwyNSBAQAogCQkgICAgICB2b2lkICphbGlnbmZfZGF0YSkKIHsKIAlpbnQgZXJyOworCXN0cnVjdCByZXNvdXJjZV9jb25zdHJhaW50IGNvbnN0cmFpbnQ7CiAKIAlpZiAoIWFsaWduZikKIAkJYWxpZ25mID0gc2ltcGxlX2FsaWduX3Jlc291cmNlOwogCisJY29uc3RyYWludC5taW4gPSBtaW47CisJY29uc3RyYWludC5tYXggPSBtYXg7CisJY29uc3RyYWludC5hbGlnbiA9IGFsaWduOworCWNvbnN0cmFpbnQuYWxpZ25mID0gYWxpZ25mOworCWNvbnN0cmFpbnQuYWxpZ25mX2RhdGEgPSBhbGlnbmZfZGF0YTsKKworCWlmICggbmV3LT5wYXJlbnQgKSB7CisJCS8qIHJlc291cmNlIGlzIGFscmVhZHkgYWxsb2NhdGVkLCB0cnkgcmVhbGxvY2F0aW5nIHdpdGgKKwkJICAgdGhlIG5ldyBjb25zdHJhaW50cyAqLworCQlyZXR1cm4gcmVhbGxvY2F0ZV9yZXNvdXJjZShyb290LCBuZXcsIHNpemUsICZjb25zdHJhaW50KTsKKwl9CisKIAl3cml0ZV9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKLQllcnIgPSBmaW5kX3Jlc291cmNlKHJvb3QsIG5ldywgc2l6ZSwgbWluLCBtYXgsIGFsaWduLCBhbGlnbmYsIGFsaWduZl9kYXRhKTsKKwllcnIgPSBmaW5kX3Jlc291cmNlKHJvb3QsIG5ldywgc2l6ZSwgJmNvbnN0cmFpbnQpOwogCWlmIChlcnIgPj0gMCAmJiBfX3JlcXVlc3RfcmVzb3VyY2Uocm9vdCwgbmV3KSkKIAkJZXJyID0gLUVCVVNZOwogCXdyaXRlX3VubG9jaygmcmVzb3VyY2VfbG9jayk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcnRtdXRleC5jIGIva2VybmVsL3J0bXV0ZXguYwppbmRleCBhYjQ0OTExLi4yNTVlMTY2IDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleC5jCisrKyBiL2tlcm5lbC9ydG11dGV4LmMKQEAgLTg5MCw3ICs4OTAsNyBAQAogewogCWxvY2stPm93bmVyID0gTlVMTDsKIAlyYXdfc3Bpbl9sb2NrX2luaXQoJmxvY2stPndhaXRfbG9jayk7Ci0JcGxpc3RfaGVhZF9pbml0X3JhdygmbG9jay0+d2FpdF9saXN0LCAmbG9jay0+d2FpdF9sb2NrKTsKKwlwbGlzdF9oZWFkX2luaXQoJmxvY2stPndhaXRfbGlzdCk7CiAKIAlkZWJ1Z19ydF9tdXRleF9pbml0KGxvY2ssIG5hbWUpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3J3c2VtLmMgYi9rZXJuZWwvcndzZW0uYwppbmRleCBjYWUwNTBiLi4xNzZlNWU1IDEwMDY0NAotLS0gYS9rZXJuZWwvcndzZW0uYworKysgYi9rZXJuZWwvcndzZW0uYwpAQCAtMTE3LDE1ICsxMTcsNiBAQAogCiBFWFBPUlRfU1lNQk9MKGRvd25fcmVhZF9uZXN0ZWQpOwogCi12b2lkIGRvd25fcmVhZF9ub25fb3duZXIoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQotewotCW1pZ2h0X3NsZWVwKCk7Ci0KLQlfX2Rvd25fcmVhZChzZW0pOwotfQotCi1FWFBPUlRfU1lNQk9MKGRvd25fcmVhZF9ub25fb3duZXIpOwotCiB2b2lkIGRvd25fd3JpdGVfbmVzdGVkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSwgaW50IHN1YmNsYXNzKQogewogCW1pZ2h0X3NsZWVwKCk7CkBAIC0xMzYsMTMgKzEyNyw2IEBACiAKIEVYUE9SVF9TWU1CT0woZG93bl93cml0ZV9uZXN0ZWQpOwogCi12b2lkIHVwX3JlYWRfbm9uX293bmVyKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKLXsKLQlfX3VwX3JlYWQoc2VtKTsKLX0KLQotRVhQT1JUX1NZTUJPTCh1cF9yZWFkX25vbl9vd25lcik7Ci0KICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggY2JiM2EwZS4uY2NhY2RiZCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTc1LDYgKzc1LDkgQEAKICNpbmNsdWRlIDxhc20vdGxiLmg+CiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAjaW5jbHVkZSA8YXNtL211dGV4Lmg+CisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCisjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CisjZW5kaWYKIAogI2luY2x1ZGUgInNjaGVkX2NwdXByaS5oIgogI2luY2x1ZGUgIndvcmtxdWV1ZV9zY2hlZC5oIgpAQCAtMTI0LDcgKzEyNyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHJ0X3BvbGljeShpbnQgcG9saWN5KQogewotCWlmICh1bmxpa2VseShwb2xpY3kgPT0gU0NIRURfRklGTyB8fCBwb2xpY3kgPT0gU0NIRURfUlIpKQorCWlmIChwb2xpY3kgPT0gU0NIRURfRklGTyB8fCBwb2xpY3kgPT0gU0NIRURfUlIpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpAQCAtMjkyLDggKzI5NSw4IEBACiAgKiAoVGhlIGRlZmF1bHQgd2VpZ2h0IGlzIDEwMjQgLSBzbyB0aGVyZSdzIG5vIHByYWN0aWNhbAogICogIGxpbWl0YXRpb24gZnJvbSB0aGlzLikKICAqLwotI2RlZmluZSBNSU5fU0hBUkVTCTIKLSNkZWZpbmUgTUFYX1NIQVJFUwkoMVVMIDw8ICgxOCArIFNDSEVEX0xPQURfUkVTT0xVVElPTikpCisjZGVmaW5lIE1JTl9TSEFSRVMJKDFVTCA8PCAgMSkKKyNkZWZpbmUgTUFYX1NIQVJFUwkoMVVMIDw8IDE4KQogCiBzdGF0aWMgaW50IHJvb3RfdGFza19ncm91cF9sb2FkID0gUk9PVF9UQVNLX0dST1VQX0xPQUQ7CiAjZW5kaWYKQEAgLTQyMiw2ICs0MjUsNyBAQAogICovCiBzdHJ1Y3Qgcm9vdF9kb21haW4gewogCWF0b21pY190IHJlZmNvdW50OworCWF0b21pY190IHJ0b19jb3VudDsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogCWNwdW1hc2tfdmFyX3Qgc3BhbjsKIAljcHVtYXNrX3Zhcl90IG9ubGluZTsKQEAgLTQzMSw3ICs0MzUsNiBAQAogCSAqIG9uZSBydW5uYWJsZSBSVCB0YXNrLgogCSAqLwogCWNwdW1hc2tfdmFyX3QgcnRvX21hc2s7Ci0JYXRvbWljX3QgcnRvX2NvdW50OwogCXN0cnVjdCBjcHVwcmkgY3B1cHJpOwogfTsKIApAQCAtNTI4LDYgKzUzMSwxMiBAQAogI2lmZGVmIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HCiAJdTY0IHByZXZfaXJxX3RpbWU7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEFSQVZJUlQKKwl1NjQgcHJldl9zdGVhbF90aW1lOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUX1RJTUVfQUNDT1VOVElORworCXU2NCBwcmV2X3N0ZWFsX3RpbWVfcnE7CisjZW5kaWYKIAogCS8qIGNhbGNfbG9hZCByZWxhdGVkIGZpZWxkcyAqLwogCXVuc2lnbmVkIGxvbmcgY2FsY19sb2FkX3VwZGF0ZTsKQEAgLTU4MSw3ICs1OTAsNiBAQAogCiAjZGVmaW5lIHJjdV9kZXJlZmVyZW5jZV9jaGVja19zY2hlZF9kb21haW4ocCkgXAogCXJjdV9kZXJlZmVyZW5jZV9jaGVjaygocCksIFwKLQkJCSAgICAgIHJjdV9yZWFkX2xvY2tfaGVsZCgpIHx8IFwKIAkJCSAgICAgIGxvY2tkZXBfaXNfaGVsZCgmc2NoZWRfZG9tYWluc19tdXRleCkpCiAKIC8qCkBAIC02MDUsMTAgKzYxMywxMCBAQAogLyoKICAqIFJldHVybiB0aGUgZ3JvdXAgdG8gd2hpY2ggdGhpcyB0YXNrcyBiZWxvbmdzLgogICoKLSAqIFdlIHVzZSB0YXNrX3N1YnN5c19zdGF0ZV9jaGVjaygpIGFuZCBleHRlbmQgdGhlIFJDVSB2ZXJpZmljYXRpb24KLSAqIHdpdGggbG9ja2RlcF9pc19oZWxkKCZwLT5waV9sb2NrKSBiZWNhdXNlIGNwdV9jZ3JvdXBfYXR0YWNoKCkKLSAqIGhvbGRzIHRoYXQgbG9jayBmb3IgZWFjaCB0YXNrIGl0IG1vdmVzIGludG8gdGhlIGNncm91cC4gVGhlcmVmb3JlCi0gKiBieSBob2xkaW5nIHRoYXQgbG9jaywgd2UgcGluIHRoZSB0YXNrIHRvIHRoZSBjdXJyZW50IGNncm91cC4KKyAqIFdlIHVzZSB0YXNrX3N1YnN5c19zdGF0ZV9jaGVjaygpIGFuZCBleHRlbmQgdGhlIFJDVSB2ZXJpZmljYXRpb24gd2l0aAorICogcGktPmxvY2sgYW5kIHJxLT5sb2NrIGJlY2F1c2UgY3B1X2Nncm91cF9hdHRhY2goKSBob2xkcyB0aG9zZSBsb2NrcyBmb3IgZWFjaAorICogdGFzayBpdCBtb3ZlcyBpbnRvIHRoZSBjZ3JvdXAuIFRoZXJlZm9yZSBieSBob2xkaW5nIGVpdGhlciBvZiB0aG9zZSBsb2NrcywKKyAqIHdlIHBpbiB0aGUgdGFzayB0byB0aGUgY3VycmVudCBjZ3JvdXAuCiAgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfZ3JvdXAgKnRhc2tfZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewpAQCAtNjE2LDcgKzYyNCw4IEBACiAJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzczsKIAogCWNzcyA9IHRhc2tfc3Vic3lzX3N0YXRlX2NoZWNrKHAsIGNwdV9jZ3JvdXBfc3Vic3lzX2lkLAotCQkJbG9ja2RlcF9pc19oZWxkKCZwLT5waV9sb2NrKSk7CisJCQlsb2NrZGVwX2lzX2hlbGQoJnAtPnBpX2xvY2spIHx8CisJCQlsb2NrZGVwX2lzX2hlbGQoJnRhc2tfcnEocCktPmxvY2spKTsKIAl0ZyA9IGNvbnRhaW5lcl9vZihjc3MsIHN0cnVjdCB0YXNrX2dyb3VwLCBjc3MpOwogCiAJcmV0dXJuIGF1dG9ncm91cF90YXNrX2dyb3VwKHAsIHRnKTsKQEAgLTE1NjcsMzggKzE1NzYsNiBAQAogCXJldHVybiBycS0+YXZnX2xvYWRfcGVyX3Rhc2s7CiB9CiAKLSNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAotCi0vKgotICogQ29tcHV0ZSB0aGUgY3B1J3MgaGllcmFyY2hpY2FsIGxvYWQgZmFjdG9yIGZvciBlYWNoIHRhc2sgZ3JvdXAuCi0gKiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgaW4gYSB0b3AtZG93biBmYXNoaW9uIGJlY2F1c2UgdGhlIGxvYWQgb2YgYSBjaGlsZAotICogZ3JvdXAgaXMgYSBmcmFjdGlvbiBvZiBpdHMgcGFyZW50cyBsb2FkLgotICovCi1zdGF0aWMgaW50IHRnX2xvYWRfZG93bihzdHJ1Y3QgdGFza19ncm91cCAqdGcsIHZvaWQgKmRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBsb2FkOwotCWxvbmcgY3B1ID0gKGxvbmcpZGF0YTsKLQotCWlmICghdGctPnBhcmVudCkgewotCQlsb2FkID0gY3B1X3JxKGNwdSktPmxvYWQud2VpZ2h0OwotCX0gZWxzZSB7Ci0JCWxvYWQgPSB0Zy0+cGFyZW50LT5jZnNfcnFbY3B1XS0+aF9sb2FkOwotCQlsb2FkICo9IHRnLT5zZVtjcHVdLT5sb2FkLndlaWdodDsKLQkJbG9hZCAvPSB0Zy0+cGFyZW50LT5jZnNfcnFbY3B1XS0+bG9hZC53ZWlnaHQgKyAxOwotCX0KLQotCXRnLT5jZnNfcnFbY3B1XS0+aF9sb2FkID0gbG9hZDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfaF9sb2FkKGxvbmcgY3B1KQotewotCXdhbGtfdGdfdHJlZSh0Z19sb2FkX2Rvd24sIHRnX25vcCwgKHZvaWQgKiljcHUpOwotfQotCi0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19QUkVFTVBUCiAKIHN0YXRpYyB2b2lkIGRvdWJsZV9ycV9sb2NrKHN0cnVjdCBycSAqcnExLCBzdHJ1Y3QgcnEgKnJxMik7CkBAIC0xOTUyLDEwICsxOTI5LDI4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhY2NvdW50X3N5c3RlbV92dGltZSk7CiAKKyNlbmRpZiAvKiBDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORyAqLworCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCitzdGF0aWMgaW5saW5lIHU2NCBzdGVhbF90aWNrcyh1NjQgc3RlYWwpCit7CisJaWYgKHVubGlrZWx5KHN0ZWFsID4gTlNFQ19QRVJfU0VDKSkKKwkJcmV0dXJuIGRpdl91NjQoc3RlYWwsIFRJQ0tfTlNFQyk7CisKKwlyZXR1cm4gX19pdGVyX2Rpdl91NjRfcmVtKHN0ZWFsLCBUSUNLX05TRUMsICZzdGVhbCk7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgdXBkYXRlX3JxX2Nsb2NrX3Rhc2soc3RydWN0IHJxICpycSwgczY0IGRlbHRhKQogewotCXM2NCBpcnFfZGVsdGE7Ci0KKy8qCisgKiBJbiB0aGVvcnksIHRoZSBjb21waWxlIHNob3VsZCBqdXN0IHNlZSAwIGhlcmUsIGFuZCBvcHRpbWl6ZSBvdXQgdGhlIGNhbGwKKyAqIHRvIHNjaGVkX3J0X2F2Z191cGRhdGUuIEJ1dCBJIGRvbid0IHRydXN0IGl0Li4uCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HKSB8fCBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9USU1FX0FDQ09VTlRJTkcpCisJczY0IHN0ZWFsID0gMCwgaXJxX2RlbHRhID0gMDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HCiAJaXJxX2RlbHRhID0gaXJxX3RpbWVfcmVhZChjcHVfb2YocnEpKSAtIHJxLT5wcmV2X2lycV90aW1lOwogCiAJLyoKQEAgLTE5NzgsMTIgKzE5NzMsMzUgQEAKIAogCXJxLT5wcmV2X2lycV90aW1lICs9IGlycV9kZWx0YTsKIAlkZWx0YSAtPSBpcnFfZGVsdGE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEFSQVZJUlRfVElNRV9BQ0NPVU5USU5HCisJaWYgKHN0YXRpY19icmFuY2goKCZwYXJhdmlydF9zdGVhbF9ycV9lbmFibGVkKSkpIHsKKwkJdTY0IHN0OworCisJCXN0ZWFsID0gcGFyYXZpcnRfc3RlYWxfY2xvY2soY3B1X29mKHJxKSk7CisJCXN0ZWFsIC09IHJxLT5wcmV2X3N0ZWFsX3RpbWVfcnE7CisKKwkJaWYgKHVubGlrZWx5KHN0ZWFsID4gZGVsdGEpKQorCQkJc3RlYWwgPSBkZWx0YTsKKworCQlzdCA9IHN0ZWFsX3RpY2tzKHN0ZWFsKTsKKwkJc3RlYWwgPSBzdCAqIFRJQ0tfTlNFQzsKKworCQlycS0+cHJldl9zdGVhbF90aW1lX3JxICs9IHN0ZWFsOworCisJCWRlbHRhIC09IHN0ZWFsOworCX0KKyNlbmRpZgorCiAJcnEtPmNsb2NrX3Rhc2sgKz0gZGVsdGE7CiAKLQlpZiAoaXJxX2RlbHRhICYmIHNjaGVkX2ZlYXQoTk9OSVJRX1BPV0VSKSkKLQkJc2NoZWRfcnRfYXZnX3VwZGF0ZShycSwgaXJxX2RlbHRhKTsKKyNpZiBkZWZpbmVkKENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HKSB8fCBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9USU1FX0FDQ09VTlRJTkcpCisJaWYgKChpcnFfZGVsdGEgKyBzdGVhbCkgJiYgc2NoZWRfZmVhdChOT05UQVNLX1BPV0VSKSkKKwkJc2NoZWRfcnRfYXZnX3VwZGF0ZShycSwgaXJxX2RlbHRhICsgc3RlYWwpOworI2VuZGlmCiB9CiAKKyNpZmRlZiBDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORwogc3RhdGljIGludCBpcnF0aW1lX2FjY291bnRfaGlfdXBkYXRlKHZvaWQpCiB7CiAJc3RydWN0IGNwdV91c2FnZV9zdGF0ICpjcHVzdGF0ID0gJmtzdGF0X3RoaXNfY3B1LmNwdXN0YXQ7CkBAIC0yMDE4LDEyICsyMDM2LDcgQEAKIAogI2RlZmluZSBzY2hlZF9jbG9ja19pcnF0aW1lCSgwKQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfcnFfY2xvY2tfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzNjQgZGVsdGEpCi17Ci0JcnEtPmNsb2NrX3Rhc2sgKz0gZGVsdGE7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORyAqLworI2VuZGlmCiAKICNpbmNsdWRlICJzY2hlZF9pZGxldGFzay5jIgogI2luY2x1ZGUgInNjaGVkX2ZhaXIuYyIKQEAgLTIyMDAsNiArMjIxMywxNiBAQAogCQkJISh0YXNrX3RocmVhZF9pbmZvKHApLT5wcmVlbXB0X2NvdW50ICYgUFJFRU1QVF9BQ1RJVkUpKTsKIAogI2lmZGVmIENPTkZJR19MT0NLREVQCisJLyoKKwkgKiBUaGUgY2FsbGVyIHNob3VsZCBob2xkIGVpdGhlciBwLT5waV9sb2NrIG9yIHJxLT5sb2NrLCB3aGVuIGNoYW5naW5nCisJICogYSB0YXNrJ3MgQ1BVLiAtPnBpX2xvY2sgZm9yIHdha2luZyB0YXNrcywgcnEtPmxvY2sgZm9yIHJ1bm5hYmxlIHRhc2tzLgorCSAqCisJICogc2NoZWRfbW92ZV90YXNrKCkgaG9sZHMgYm90aCBhbmQgdGh1cyBob2xkaW5nIGVpdGhlciBwaW5zIHRoZSBjZ3JvdXAsCisJICogc2VlIHNldF90YXNrX3JxKCkuCisJICoKKwkgKiBGdXJ0aGVybW9yZSwgYWxsIHRhc2tfcnEgdXNlcnMgc2hvdWxkIGFjcXVpcmUgYm90aCBsb2Nrcywgc2VlCisJICogdGFza19ycV9sb2NrKCkuCisJICovCiAJV0FSTl9PTl9PTkNFKGRlYnVnX2xvY2tzICYmICEobG9ja2RlcF9pc19oZWxkKCZwLT5waV9sb2NrKSB8fAogCQkJCSAgICAgIGxvY2tkZXBfaXNfaGVsZCgmdGFza19ycShwKS0+bG9jaykpKTsKICNlbmRpZgpAQCAtMjIwOSw3ICsyMjMyLDcgQEAKIAogCWlmICh0YXNrX2NwdShwKSAhPSBuZXdfY3B1KSB7CiAJCXAtPnNlLm5yX21pZ3JhdGlvbnMrKzsKLQkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0NQVV9NSUdSQVRJT05TLCAxLCAxLCBOVUxMLCAwKTsKKwkJcGVyZl9zd19ldmVudChQRVJGX0NPVU5UX1NXX0NQVV9NSUdSQVRJT05TLCAxLCBOVUxMLCAwKTsKIAl9CiAKIAlfX3NldF90YXNrX2NwdShwLCBuZXdfY3B1KTsKQEAgLTI0NDcsNiArMjQ3MCwxMCBAQAogCQl9CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCX0KKworCWlmICh3YWtlX2ZsYWdzICYgV0ZfTUlHUkFURUQpCisJCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX21pZ3JhdGUpOworCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAJc2NoZWRzdGF0X2luYyhycSwgdHR3dV9jb3VudCk7CkBAIC0yNDU1LDkgKzI0ODIsNiBAQAogCWlmICh3YWtlX2ZsYWdzICYgV0ZfU1lOQykKIAkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc3luYyk7CiAKLQlpZiAoY3B1ICE9IHRhc2tfY3B1KHApKQotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlKTsKLQogI2VuZGlmIC8qIENPTkZJR19TQ0hFRFNUQVRTICovCiB9CiAKQEAgLTI0ODUsNyArMjUwOSw3IEBACiAJaWYgKHAtPnNjaGVkX2NsYXNzLT50YXNrX3dva2VuKQogCQlwLT5zY2hlZF9jbGFzcy0+dGFza193b2tlbihycSwgcCk7CiAKLQlpZiAodW5saWtlbHkocnEtPmlkbGVfc3RhbXApKSB7CisJaWYgKHJxLT5pZGxlX3N0YW1wKSB7CiAJCXU2NCBkZWx0YSA9IHJxLT5jbG9jayAtIHJxLT5pZGxlX3N0YW1wOwogCQl1NjQgbWF4ID0gMipzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3Q7CiAKQEAgLTI1MzIsMTMgKzI1NTYsOSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHZvaWQgc2NoZWRfdHR3dV9wZW5kaW5nKHZvaWQpCitzdGF0aWMgdm9pZCBzY2hlZF90dHd1X2RvX3BlbmRpbmcoc3RydWN0IHRhc2tfc3RydWN0ICpsaXN0KQogewogCXN0cnVjdCBycSAqcnEgPSB0aGlzX3JxKCk7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpsaXN0ID0geGNoZygmcnEtPndha2VfbGlzdCwgTlVMTCk7Ci0KLQlpZiAoIWxpc3QpCi0JCXJldHVybjsKIAogCXJhd19zcGluX2xvY2soJnJxLT5sb2NrKTsKIApAQCAtMjU1MSw5ICsyNTcxLDQ1IEBACiAJcmF3X3NwaW5fdW5sb2NrKCZycS0+bG9jayk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworc3RhdGljIHZvaWQgc2NoZWRfdHR3dV9wZW5kaW5nKHZvaWQpCit7CisJc3RydWN0IHJxICpycSA9IHRoaXNfcnEoKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxpc3QgPSB4Y2hnKCZycS0+d2FrZV9saXN0LCBOVUxMKTsKKworCWlmICghbGlzdCkKKwkJcmV0dXJuOworCisJc2NoZWRfdHR3dV9kb19wZW5kaW5nKGxpc3QpOworfQorCisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisKIHZvaWQgc2NoZWR1bGVyX2lwaSh2b2lkKQogewotCXNjaGVkX3R0d3VfcGVuZGluZygpOworCXN0cnVjdCBycSAqcnEgPSB0aGlzX3JxKCk7CisJc3RydWN0IHRhc2tfc3RydWN0ICpsaXN0ID0geGNoZygmcnEtPndha2VfbGlzdCwgTlVMTCk7CisKKwlpZiAoIWxpc3QpCisJCXJldHVybjsKKworCS8qCisJICogTm90IGFsbCByZXNjaGVkdWxlIElQSSBoYW5kbGVycyBjYWxsIGlycV9lbnRlci9pcnFfZXhpdCwgc2luY2UKKwkgKiB0cmFkaXRpb25hbGx5IGFsbCB0aGVpciB3b3JrIHdhcyBkb25lIGZyb20gdGhlIGludGVycnVwdCByZXR1cm4KKwkgKiBwYXRoLiBOb3cgdGhhdCB3ZSBhY3R1YWxseSBkbyBzb21lIHdvcmssIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisJICogd2UgZG8gY2FsbCB0aGVtLgorCSAqCisJICogU29tZSBhcmNocyBhbHJlYWR5IGRvIGNhbGwgdGhlbSwgbHVja2lseSBpcnFfZW50ZXIvZXhpdCBuZXN0CisJICogcHJvcGVybHkuCisJICoKKwkgKiBBcmd1YWJseSB3ZSBzaG91bGQgdmlzaXQgYWxsIGFyY2hzIGFuZCB1cGRhdGUgYWxsIGhhbmRsZXJzLAorCSAqIGhvd2V2ZXIgYSBmYWlyIHNoYXJlIG9mIElQSXMgYXJlIHN0aWxsIHJlc2NoZWQgb25seSBzbyB0aGlzIHdvdWxkCisJICogc29tZXdoYXQgcGVzc2ltaXplIHRoZSBzaW1wbGUgcmVzY2hlZCBjYXNlLgorCSAqLworCWlycV9lbnRlcigpOworCXNjaGVkX3R0d3VfZG9fcGVuZGluZyhsaXN0KTsKKwlpcnFfZXhpdCgpOwogfQogCiBzdGF0aWMgdm9pZCB0dHd1X3F1ZXVlX3JlbW90ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBjcHUpCkBAIC0yNjAwLDYgKzI2NTYsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfU01QKQogCWlmIChzY2hlZF9mZWF0KFRUV1VfUVVFVUUpICYmIGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJc2NoZWRfY2xvY2tfY3B1KGNwdSk7IC8qIHN5bmMgY2xvY2tzIHgtY3B1ICovCiAJCXR0d3VfcXVldWVfcmVtb3RlKHAsIGNwdSk7CiAJCXJldHVybjsKIAl9CkBAIC0yNjc0LDggKzI3MzEsMTAgQEAKIAkJcC0+c2NoZWRfY2xhc3MtPnRhc2tfd2FraW5nKHApOwogCiAJY3B1ID0gc2VsZWN0X3Rhc2tfcnEocCwgU0RfQkFMQU5DRV9XQUtFLCB3YWtlX2ZsYWdzKTsKLQlpZiAodGFza19jcHUocCkgIT0gY3B1KQorCWlmICh0YXNrX2NwdShwKSAhPSBjcHUpIHsKKwkJd2FrZV9mbGFncyB8PSBXRl9NSUdSQVRFRDsKIAkJc2V0X3Rhc2tfY3B1KHAsIGNwdSk7CisJfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogCXR0d3VfcXVldWUocCwgY3B1KTsKQEAgLTI4MzksNyArMjg5OCw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU01QKQogCXAtPm9uX2NwdSA9IDA7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAorI2lmZGVmIENPTkZJR19QUkVFTVBUX0NPVU5UCiAJLyogV2FudCB0byBzdGFydCB3aXRoIGtlcm5lbCBwcmVlbXB0aW9uIGRpc2FibGVkLiAqLwogCXRhc2tfdGhyZWFkX2luZm8ocCktPnByZWVtcHRfY291bnQgPSAxOwogI2VuZGlmCkBAIC0zODMwLDYgKzM4ODksMjUgQEAKIAkJY3B1c3RhdC0+aWRsZSA9IGNwdXRpbWU2NF9hZGQoY3B1c3RhdC0+aWRsZSwgY3B1dGltZTY0KTsKIH0KIAorc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIHN0ZWFsX2FjY291bnRfcHJvY2Vzc190aWNrKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCisJaWYgKHN0YXRpY19icmFuY2goJnBhcmF2aXJ0X3N0ZWFsX2VuYWJsZWQpKSB7CisJCXU2NCBzdGVhbCwgc3QgPSAwOworCisJCXN0ZWFsID0gcGFyYXZpcnRfc3RlYWxfY2xvY2soc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJc3RlYWwgLT0gdGhpc19ycSgpLT5wcmV2X3N0ZWFsX3RpbWU7CisKKwkJc3QgPSBzdGVhbF90aWNrcyhzdGVhbCk7CisJCXRoaXNfcnEoKS0+cHJldl9zdGVhbF90aW1lICs9IHN0ICogVElDS19OU0VDOworCisJCWFjY291bnRfc3RlYWxfdGltZShzdCk7CisJCXJldHVybiBzdDsKKwl9CisjZW5kaWYKKwlyZXR1cm4gZmFsc2U7Cit9CisKICNpZm5kZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIAogI2lmZGVmIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HCkBAIC0zODYxLDYgKzM5MzksOSBAQAogCWNwdXRpbWU2NF90IHRtcCA9IGNwdXRpbWVfdG9fY3B1dGltZTY0KGNwdXRpbWVfb25lX2ppZmZ5KTsKIAlzdHJ1Y3QgY3B1X3VzYWdlX3N0YXQgKmNwdXN0YXQgPSAma3N0YXRfdGhpc19jcHUuY3B1c3RhdDsKIAorCWlmIChzdGVhbF9hY2NvdW50X3Byb2Nlc3NfdGljaygpKQorCQlyZXR1cm47CisKIAlpZiAoaXJxdGltZV9hY2NvdW50X2hpX3VwZGF0ZSgpKSB7CiAJCWNwdXN0YXQtPmlycSA9IGNwdXRpbWU2NF9hZGQoY3B1c3RhdC0+aXJxLCB0bXApOwogCX0gZWxzZSBpZiAoaXJxdGltZV9hY2NvdW50X3NpX3VwZGF0ZSgpKSB7CkBAIC0zOTE0LDYgKzM5OTUsOSBAQAogCQlyZXR1cm47CiAJfQogCisJaWYgKHN0ZWFsX2FjY291bnRfcHJvY2Vzc190aWNrKCkpCisJCXJldHVybjsKKwogCWlmICh1c2VyX3RpY2spCiAJCWFjY291bnRfdXNlcl90aW1lKHAsIGNwdXRpbWVfb25lX2ppZmZ5LCBvbmVfamlmZnlfc2NhbGVkKTsKIAllbHNlIGlmICgocCAhPSBycS0+aWRsZSkgfHwgKGlycV9jb3VudCgpICE9IEhBUkRJUlFfT0ZGU0VUKSkKQEAgLTQyOTEsMTEgKzQzNzUsOCBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgb3duZXJfcnVubmluZyhzdHJ1Y3QgbXV0ZXggKmxvY2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXIpCiB7Ci0JYm9vbCByZXQgPSBmYWxzZTsKLQotCXJjdV9yZWFkX2xvY2soKTsKIAlpZiAobG9jay0+b3duZXIgIT0gb3duZXIpCi0JCWdvdG8gZmFpbDsKKwkJcmV0dXJuIGZhbHNlOwogCiAJLyoKIAkgKiBFbnN1cmUgd2UgZW1pdCB0aGUgb3duZXItPm9uX2NwdSwgZGVyZWZlcmVuY2UgX2FmdGVyXyBjaGVja2luZwpAQCAtNDMwNSwxMSArNDM4Niw3IEBACiAJICovCiAJYmFycmllcigpOwogCi0JcmV0ID0gb3duZXItPm9uX2NwdTsKLWZhaWw6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBvd25lci0+b25fY3B1OwogfQogCiAvKgpAQCAtNDMyMSwyMSArNDM5OCwyMSBAQAogCWlmICghc2NoZWRfZmVhdChPV05FUl9TUElOKSkKIAkJcmV0dXJuIDA7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJd2hpbGUgKG93bmVyX3J1bm5pbmcobG9jaywgb3duZXIpKSB7CiAJCWlmIChuZWVkX3Jlc2NoZWQoKSkKLQkJCXJldHVybiAwOworCQkJYnJlYWs7CiAKIAkJYXJjaF9tdXRleF9jcHVfcmVsYXgoKTsKIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkvKgotCSAqIElmIHRoZSBvd25lciBjaGFuZ2VkIHRvIGFub3RoZXIgdGFzayB0aGVyZSBpcyBsaWtlbHkKLQkgKiBoZWF2eSBjb250ZW50aW9uLCBzdG9wIHNwaW5uaW5nLgorCSAqIFdlIGJyZWFrIG91dCB0aGUgbG9vcCBhYm92ZSBvbiBuZWVkX3Jlc2NoZWQoKSBhbmQgd2hlbiB0aGUKKwkgKiBvd25lciBjaGFuZ2VkLCB3aGljaCBpcyBhIHNpZ24gZm9yIGhlYXZ5IGNvbnRlbnRpb24uIFJldHVybgorCSAqIHN1Y2Nlc3Mgb25seSB3aGVuIGxvY2stPm93bmVyIGlzIE5VTEwuCiAJICovCi0JaWYgKGxvY2stPm93bmVyKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOworCXJldHVybiBsb2NrLT5vd25lciA9PSBOVUxMOwogfQogI2VuZGlmCiAKQEAgLTY1NDIsNyArNjYxOSw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmICghZ3JvdXAtPmNwdV9wb3dlcikgeworCQlpZiAoIWdyb3VwLT5zZ3AtPnBvd2VyKSB7CiAJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOwogCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogZG9tYWluLT5jcHVfcG93ZXIgbm90ICIKIAkJCQkJInNldFxuIik7CkBAIC02NTY2LDkgKzY2NDMsOSBAQAogCQljcHVsaXN0X3NjbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCBzY2hlZF9ncm91cF9jcHVzKGdyb3VwKSk7CiAKIAkJcHJpbnRrKEtFUk5fQ09OVCAiICVzIiwgc3RyKTsKLQkJaWYgKGdyb3VwLT5jcHVfcG93ZXIgIT0gU0NIRURfUE9XRVJfU0NBTEUpIHsKKwkJaWYgKGdyb3VwLT5zZ3AtPnBvd2VyICE9IFNDSEVEX1BPV0VSX1NDQUxFKSB7CiAJCQlwcmludGsoS0VSTl9DT05UICIgKGNwdV9wb3dlciA9ICVkKSIsCi0JCQkJZ3JvdXAtPmNwdV9wb3dlcik7CisJCQkJZ3JvdXAtPnNncC0+cG93ZXIpOwogCQl9CiAKIAkJZ3JvdXAgPSBncm91cC0+bmV4dDsKQEAgLTY3NTksMTEgKzY4MzYsMzkgQEAKIAlyZXR1cm4gcmQ7CiB9CiAKK3N0YXRpYyB2b2lkIGZyZWVfc2NoZWRfZ3JvdXBzKHN0cnVjdCBzY2hlZF9ncm91cCAqc2csIGludCBmcmVlX3NncCkKK3sKKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnRtcCwgKmZpcnN0OworCisJaWYgKCFzZykKKwkJcmV0dXJuOworCisJZmlyc3QgPSBzZzsKKwlkbyB7CisJCXRtcCA9IHNnLT5uZXh0OworCisJCWlmIChmcmVlX3NncCAmJiBhdG9taWNfZGVjX2FuZF90ZXN0KCZzZy0+c2dwLT5yZWYpKQorCQkJa2ZyZWUoc2ctPnNncCk7CisKKwkJa2ZyZWUoc2cpOworCQlzZyA9IHRtcDsKKwl9IHdoaWxlIChzZyAhPSBmaXJzdCk7Cit9CisKIHN0YXRpYyB2b2lkIGZyZWVfc2NoZWRfZG9tYWluKHN0cnVjdCByY3VfaGVhZCAqcmN1KQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHNjaGVkX2RvbWFpbiwgcmN1KTsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc2QtPmdyb3Vwcy0+cmVmKSkKKworCS8qCisJICogSWYgaXRzIGFuIG92ZXJsYXBwaW5nIGRvbWFpbiBpdCBoYXMgcHJpdmF0ZSBncm91cHMsIGl0ZXJhdGUgYW5kCisJICogbnVrZSB0aGVtIGFsbC4KKwkgKi8KKwlpZiAoc2QtPmZsYWdzICYgU0RfT1ZFUkxBUCkgeworCQlmcmVlX3NjaGVkX2dyb3VwcyhzZC0+Z3JvdXBzLCAxKTsKKwl9IGVsc2UgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnNkLT5ncm91cHMtPnJlZikpIHsKKwkJa2ZyZWUoc2QtPmdyb3Vwcy0+c2dwKTsKIAkJa2ZyZWUoc2QtPmdyb3Vwcyk7CisJfQogCWtmcmVlKHNkKTsKIH0KIApAQCAtNjkzMCw2ICs3MDM1LDcgQEAKIHN0cnVjdCBzZF9kYXRhIHsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICoqX19wZXJjcHUgc2Q7CiAJc3RydWN0IHNjaGVkX2dyb3VwICoqX19wZXJjcHUgc2c7CisJc3RydWN0IHNjaGVkX2dyb3VwX3Bvd2VyICoqX19wZXJjcHUgc2dwOwogfTsKIAogc3RydWN0IHNfZGF0YSB7CkBAIC02OTQ5LDE1ICs3MDU1LDczIEBACiB0eXBlZGVmIHN0cnVjdCBzY2hlZF9kb21haW4gKigqc2NoZWRfZG9tYWluX2luaXRfZikoc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGwsIGludCBjcHUpOwogdHlwZWRlZiBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqKCpzY2hlZF9kb21haW5fbWFza19mKShpbnQgY3B1KTsKIAorI2RlZmluZSBTRFRMX09WRVJMQVAJMHgwMQorCiBzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsIHsKIAlzY2hlZF9kb21haW5faW5pdF9mIGluaXQ7CiAJc2NoZWRfZG9tYWluX21hc2tfZiBtYXNrOworCWludAkJICAgIGZsYWdzOwogCXN0cnVjdCBzZF9kYXRhICAgICAgZGF0YTsKIH07CiAKLS8qCi0gKiBBc3N1bWVzIHRoZSBzY2hlZF9kb21haW4gdHJlZSBpcyBmdWxseSBjb25zdHJ1Y3RlZAotICovCitzdGF0aWMgaW50CitidWlsZF9vdmVybGFwX3NjaGVkX2dyb3VwcyhzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmZpcnN0ID0gTlVMTCwgKmxhc3QgPSBOVUxMLCAqZ3JvdXBzID0gTlVMTCwgKnNnOworCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpzcGFuID0gc2NoZWRfZG9tYWluX3NwYW4oc2QpOworCXN0cnVjdCBjcHVtYXNrICpjb3ZlcmVkID0gc2NoZWRfZG9tYWluc190bXBtYXNrOworCXN0cnVjdCBzZF9kYXRhICpzZGQgPSBzZC0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpjaGlsZDsKKwlpbnQgaTsKKworCWNwdW1hc2tfY2xlYXIoY292ZXJlZCk7CisKKwlmb3JfZWFjaF9jcHUoaSwgc3BhbikgeworCQlzdHJ1Y3QgY3B1bWFzayAqc2dfc3BhbjsKKworCQlpZiAoY3B1bWFza190ZXN0X2NwdShpLCBjb3ZlcmVkKSkKKwkJCWNvbnRpbnVlOworCisJCXNnID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXApICsgY3B1bWFza19zaXplKCksCisJCQkJR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaSkpOworCisJCWlmICghc2cpCisJCQlnb3RvIGZhaWw7CisKKwkJc2dfc3BhbiA9IHNjaGVkX2dyb3VwX2NwdXMoc2cpOworCisJCWNoaWxkID0gKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGkpOworCQlpZiAoY2hpbGQtPmNoaWxkKSB7CisJCQljaGlsZCA9IGNoaWxkLT5jaGlsZDsKKwkJCWNwdW1hc2tfY29weShzZ19zcGFuLCBzY2hlZF9kb21haW5fc3BhbihjaGlsZCkpOworCQl9IGVsc2UKKwkJCWNwdW1hc2tfc2V0X2NwdShpLCBzZ19zcGFuKTsKKworCQljcHVtYXNrX29yKGNvdmVyZWQsIGNvdmVyZWQsIHNnX3NwYW4pOworCisJCXNnLT5zZ3AgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGNwdW1hc2tfZmlyc3Qoc2dfc3BhbikpOworCQlhdG9taWNfaW5jKCZzZy0+c2dwLT5yZWYpOworCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgc2dfc3BhbikpCisJCQlncm91cHMgPSBzZzsKKworCQlpZiAoIWZpcnN0KQorCQkJZmlyc3QgPSBzZzsKKwkJaWYgKGxhc3QpCisJCQlsYXN0LT5uZXh0ID0gc2c7CisJCWxhc3QgPSBzZzsKKwkJbGFzdC0+bmV4dCA9IGZpcnN0OworCX0KKwlzZC0+Z3JvdXBzID0gZ3JvdXBzOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJZnJlZV9zY2hlZF9ncm91cHMoZmlyc3QsIDApOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKIHN0YXRpYyBpbnQgZ2V0X2dyb3VwKGludCBjcHUsIHN0cnVjdCBzZF9kYXRhICpzZGQsIHN0cnVjdCBzY2hlZF9ncm91cCAqKnNnKQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGNwdSk7CkBAIC02OTY2LDI0ICs3MTMwLDI0IEBACiAJaWYgKGNoaWxkKQogCQljcHUgPSBjcHVtYXNrX2ZpcnN0KHNjaGVkX2RvbWFpbl9zcGFuKGNoaWxkKSk7CiAKLQlpZiAoc2cpCisJaWYgKHNnKSB7CiAJCSpzZyA9ICpwZXJfY3B1X3B0cihzZGQtPnNnLCBjcHUpOworCQkoKnNnKS0+c2dwID0gKnBlcl9jcHVfcHRyKHNkZC0+c2dwLCBjcHUpOworCQlhdG9taWNfc2V0KCYoKnNnKS0+c2dwLT5yZWYsIDEpOyAvKiBmb3IgY2xhaW1fYWxsb2NhdGlvbnMgKi8KKwl9CiAKIAlyZXR1cm4gY3B1OwogfQogCiAvKgotICogYnVpbGRfc2NoZWRfZ3JvdXBzIHRha2VzIHRoZSBjcHVtYXNrIHdlIHdpc2ggdG8gc3BhbiwgYW5kIGEgcG9pbnRlcgotICogdG8gYSBmdW5jdGlvbiB3aGljaCBpZGVudGlmaWVzIHdoYXQgZ3JvdXAoYWxvbmcgd2l0aCBzY2hlZCBncm91cCkgYSBDUFUKLSAqIGJlbG9uZ3MgdG8uIFRoZSByZXR1cm4gdmFsdWUgb2YgZ3JvdXBfZm4gbXVzdCBiZSBhID49IDAgYW5kIDwgbnJfY3B1X2lkcwotICogKGR1ZSB0byB0aGUgZmFjdCB0aGF0IHdlIGtlZXAgdHJhY2sgb2YgZ3JvdXBzIGNvdmVyZWQgd2l0aCBhIHN0cnVjdCBjcHVtYXNrKS4KLSAqCiAgKiBidWlsZF9zY2hlZF9ncm91cHMgd2lsbCBidWlsZCBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0IG9mIHRoZSBncm91cHMKICAqIGNvdmVyZWQgYnkgdGhlIGdpdmVuIHNwYW4sIGFuZCB3aWxsIHNldCBlYWNoIGdyb3VwJ3MgLT5jcHVtYXNrIGNvcnJlY3RseSwKICAqIGFuZCAtPmNwdV9wb3dlciB0byAwLgorICoKKyAqIEFzc3VtZXMgdGhlIHNjaGVkX2RvbWFpbiB0cmVlIGlzIGZ1bGx5IGNvbnN0cnVjdGVkCiAgKi8KLXN0YXRpYyB2b2lkCi1idWlsZF9zY2hlZF9ncm91cHMoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCitzdGF0aWMgaW50CitidWlsZF9zY2hlZF9ncm91cHMoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCiB7CiAJc3RydWN0IHNjaGVkX2dyb3VwICpmaXJzdCA9IE5VTEwsICpsYXN0ID0gTlVMTDsKIAlzdHJ1Y3Qgc2RfZGF0YSAqc2RkID0gc2QtPnByaXZhdGU7CkBAIC02OTkxLDYgKzcxNTUsMTIgQEAKIAlzdHJ1Y3QgY3B1bWFzayAqY292ZXJlZDsKIAlpbnQgaTsKIAorCWdldF9ncm91cChjcHUsIHNkZCwgJnNkLT5ncm91cHMpOworCWF0b21pY19pbmMoJnNkLT5ncm91cHMtPnJlZik7CisKKwlpZiAoY3B1ICE9IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZG9tYWluX3NwYW4oc2QpKSkKKwkJcmV0dXJuIDA7CisKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZzY2hlZF9kb21haW5zX211dGV4KTsKIAljb3ZlcmVkID0gc2NoZWRfZG9tYWluc190bXBtYXNrOwogCkBAIC03MDA1LDcgKzcxNzUsNyBAQAogCQkJY29udGludWU7CiAKIAkJY3B1bWFza19jbGVhcihzY2hlZF9ncm91cF9jcHVzKHNnKSk7Ci0JCXNnLT5jcHVfcG93ZXIgPSAwOworCQlzZy0+c2dwLT5wb3dlciA9IDA7CiAKIAkJZm9yX2VhY2hfY3B1KGosIHNwYW4pIHsKIAkJCWlmIChnZXRfZ3JvdXAoaiwgc2RkLCBOVUxMKSAhPSBncm91cCkKQEAgLTcwMjIsNiArNzE5Miw4IEBACiAJCWxhc3QgPSBzZzsKIAl9CiAJbGFzdC0+bmV4dCA9IGZpcnN0OworCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC03MDM2LDEzICs3MjA4LDE4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGluaXRfc2NoZWRfZ3JvdXBzX3Bvd2VyKGludCBjcHUsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkKQogewotCVdBUk5fT04oIXNkIHx8ICFzZC0+Z3JvdXBzKTsKKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnID0gc2QtPmdyb3VwczsKIAotCWlmIChjcHUgIT0gZ3JvdXBfZmlyc3RfY3B1KHNkLT5ncm91cHMpKQorCVdBUk5fT04oIXNkIHx8ICFzZyk7CisKKwlkbyB7CisJCXNnLT5ncm91cF93ZWlnaHQgPSBjcHVtYXNrX3dlaWdodChzY2hlZF9ncm91cF9jcHVzKHNnKSk7CisJCXNnID0gc2ctPm5leHQ7CisJfSB3aGlsZSAoc2cgIT0gc2QtPmdyb3Vwcyk7CisKKwlpZiAoY3B1ICE9IGdyb3VwX2ZpcnN0X2NwdShzZykpCiAJCXJldHVybjsKIAotCXNkLT5ncm91cHMtPmdyb3VwX3dlaWdodCA9IGNwdW1hc2tfd2VpZ2h0KHNjaGVkX2dyb3VwX2NwdXMoc2QtPmdyb3VwcykpOwotCiAJdXBkYXRlX2dyb3VwX3Bvd2VyKHNkLCBjcHUpOwogfQogCkBAIC03MTYyLDE1ICs3MzM5LDE1IEBACiBzdGF0aWMgdm9pZCBjbGFpbV9hbGxvY2F0aW9ucyhpbnQgY3B1LCBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKIHsKIAlzdHJ1Y3Qgc2RfZGF0YSAqc2RkID0gc2QtPnByaXZhdGU7Ci0Jc3RydWN0IHNjaGVkX2dyb3VwICpzZyA9IHNkLT5ncm91cHM7CiAKIAlXQVJOX09OX09OQ0UoKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGNwdSkgIT0gc2QpOwogCSpwZXJfY3B1X3B0cihzZGQtPnNkLCBjcHUpID0gTlVMTDsKIAotCWlmIChjcHUgPT0gY3B1bWFza19maXJzdChzY2hlZF9ncm91cF9jcHVzKHNnKSkpIHsKLQkJV0FSTl9PTl9PTkNFKCpwZXJfY3B1X3B0cihzZGQtPnNnLCBjcHUpICE9IHNnKTsKKwlpZiAoYXRvbWljX3JlYWQoJigqcGVyX2NwdV9wdHIoc2RkLT5zZywgY3B1KSktPnJlZikpCiAJCSpwZXJfY3B1X3B0cihzZGQtPnNnLCBjcHUpID0gTlVMTDsKLQl9CisKKwlpZiAoYXRvbWljX3JlYWQoJigqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGNwdSkpLT5yZWYpKQorCQkqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGNwdSkgPSBOVUxMOwogfQogCiAjaWZkZWYgQ09ORklHX1NDSEVEX1NNVApAQCAtNzE5NSw3ICs3MzcyLDcgQEAKICNlbmRpZgogCXsgc2RfaW5pdF9DUFUsIGNwdV9jcHVfbWFzaywgfSwKICNpZmRlZiBDT05GSUdfTlVNQQotCXsgc2RfaW5pdF9OT0RFLCBjcHVfbm9kZV9tYXNrLCB9LAorCXsgc2RfaW5pdF9OT0RFLCBjcHVfbm9kZV9tYXNrLCBTRFRMX09WRVJMQVAsIH0sCiAJeyBzZF9pbml0X0FMTE5PREVTLCBjcHVfYWxsbm9kZXNfbWFzaywgfSwKICNlbmRpZgogCXsgTlVMTCwgfSwKQEAgLTcyMTksOSArNzM5NiwxNCBAQAogCQlpZiAoIXNkZC0+c2cpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAorCQlzZGQtPnNncCA9IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgc2NoZWRfZ3JvdXBfcG93ZXIgKik7CisJCWlmICghc2RkLT5zZ3ApCisJCQlyZXR1cm4gLUVOT01FTTsKKwogCQlmb3JfZWFjaF9jcHUoaiwgY3B1X21hcCkgewogCQkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAJCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnOworCQkJc3RydWN0IHNjaGVkX2dyb3VwX3Bvd2VyICpzZ3A7CiAKIAkJICAgICAgIAlzZCA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX2RvbWFpbikgKyBjcHVtYXNrX3NpemUoKSwKIAkJCQkJR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaikpOwpAQCAtNzIzNiw2ICs3NDE4LDEzIEBACiAJCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJCSpwZXJfY3B1X3B0cihzZGQtPnNnLCBqKSA9IHNnOworCisJCQlzZ3AgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBzY2hlZF9ncm91cF9wb3dlciksCisJCQkJCUdGUF9LRVJORUwsIGNwdV90b19ub2RlKGopKTsKKwkJCWlmICghc2dwKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQkqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGopID0gc2dwOwogCQl9CiAJfQogCkBAIC03MjUxLDExICs3NDQwLDE1IEBACiAJCXN0cnVjdCBzZF9kYXRhICpzZGQgPSAmdGwtPmRhdGE7CiAKIAkJZm9yX2VhY2hfY3B1KGosIGNwdV9tYXApIHsKLQkJCWtmcmVlKCpwZXJfY3B1X3B0cihzZGQtPnNkLCBqKSk7CisJCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9ICpwZXJfY3B1X3B0cihzZGQtPnNkLCBqKTsKKwkJCWlmIChzZCAmJiAoc2QtPmZsYWdzICYgU0RfT1ZFUkxBUCkpCisJCQkJZnJlZV9zY2hlZF9ncm91cHMoc2QtPmdyb3VwcywgMCk7CiAJCQlrZnJlZSgqcGVyX2NwdV9wdHIoc2RkLT5zZywgaikpOworCQkJa2ZyZWUoKnBlcl9jcHVfcHRyKHNkZC0+c2dwLCBqKSk7CiAJCX0KIAkJZnJlZV9wZXJjcHUoc2RkLT5zZCk7CiAJCWZyZWVfcGVyY3B1KHNkZC0+c2cpOworCQlmcmVlX3BlcmNwdShzZGQtPnNncCk7CiAJfQogfQogCkBAIC03MzAxLDggKzc0OTQsMTMgQEAKIAkJc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGw7CiAKIAkJc2QgPSBOVUxMOwotCQlmb3IgKHRsID0gc2NoZWRfZG9tYWluX3RvcG9sb2d5OyB0bC0+aW5pdDsgdGwrKykKKwkJZm9yICh0bCA9IHNjaGVkX2RvbWFpbl90b3BvbG9neTsgdGwtPmluaXQ7IHRsKyspIHsKIAkJCXNkID0gYnVpbGRfc2NoZWRfZG9tYWluKHRsLCAmZCwgY3B1X21hcCwgYXR0ciwgc2QsIGkpOworCQkJaWYgKHRsLT5mbGFncyAmIFNEVExfT1ZFUkxBUCB8fCBzY2hlZF9mZWF0KEZPUkNFX1NEX09WRVJMQVApKQorCQkJCXNkLT5mbGFncyB8PSBTRF9PVkVSTEFQOworCQkJaWYgKGNwdW1hc2tfZXF1YWwoY3B1X21hcCwgc2NoZWRfZG9tYWluX3NwYW4oc2QpKSkKKwkJCQlicmVhazsKKwkJfQogCiAJCXdoaWxlIChzZC0+Y2hpbGQpCiAJCQlzZCA9IHNkLT5jaGlsZDsKQEAgLTczMTQsMTMgKzc1MTIsMTMgQEAKIAlmb3JfZWFjaF9jcHUoaSwgY3B1X21hcCkgewogCQlmb3IgKHNkID0gKnBlcl9jcHVfcHRyKGQuc2QsIGkpOyBzZDsgc2QgPSBzZC0+cGFyZW50KSB7CiAJCQlzZC0+c3Bhbl93ZWlnaHQgPSBjcHVtYXNrX3dlaWdodChzY2hlZF9kb21haW5fc3BhbihzZCkpOwotCQkJZ2V0X2dyb3VwKGksIHNkLT5wcml2YXRlLCAmc2QtPmdyb3Vwcyk7Ci0JCQlhdG9taWNfaW5jKCZzZC0+Z3JvdXBzLT5yZWYpOwotCi0JCQlpZiAoaSAhPSBjcHVtYXNrX2ZpcnN0KHNjaGVkX2RvbWFpbl9zcGFuKHNkKSkpCi0JCQkJY29udGludWU7Ci0KLQkJCWJ1aWxkX3NjaGVkX2dyb3VwcyhzZCk7CisJCQlpZiAoc2QtPmZsYWdzICYgU0RfT1ZFUkxBUCkgeworCQkJCWlmIChidWlsZF9vdmVybGFwX3NjaGVkX2dyb3VwcyhzZCwgaSkpCisJCQkJCWdvdG8gZXJyb3I7CisJCQl9IGVsc2UgeworCQkJCWlmIChidWlsZF9zY2hlZF9ncm91cHMoc2QsIGkpKQorCQkJCQlnb3RvIGVycm9yOworCQkJfQogCQl9CiAJfQogCkBAIC03NzMwLDE4ICs3OTI4LDE0IEBACiAJCSYmIGFkZHIgPCAodW5zaWduZWQgbG9uZylfX3NjaGVkX3RleHRfZW5kKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9jZnNfcnEoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3QgcnEgKnJxKQorc3RhdGljIHZvaWQgaW5pdF9jZnNfcnEoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQogewogCWNmc19ycS0+dGFza3NfdGltZWxpbmUgPSBSQl9ST09UOwogCUlOSVRfTElTVF9IRUFEKCZjZnNfcnEtPnRhc2tzKTsKLSNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAotCWNmc19ycS0+cnEgPSBycTsKLQkvKiBhbGxvdyBpbml0aWFsIHVwZGF0ZV9jZnNfbG9hZCgpIHRvIHRydW5jYXRlICovCi0jaWZkZWYgQ09ORklHX1NNUAotCWNmc19ycS0+bG9hZF9zdGFtcCA9IDE7Ci0jZW5kaWYKLSNlbmRpZgogCWNmc19ycS0+bWluX3ZydW50aW1lID0gKHU2NCkoLSgxTEwgPDwgMjApKTsKKyNpZm5kZWYgQ09ORklHXzY0QklUCisJY2ZzX3JxLT5taW5fdnJ1bnRpbWVfY29weSA9IGNmc19ycS0+bWluX3ZydW50aW1lOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGluaXRfcnRfcnEoc3RydWN0IHJ0X3JxICpydF9ycSwgc3RydWN0IHJxICpycSkKQEAgLTc3NTcsMjcgKzc5NTEsMTggQEAKIAkvKiBkZWxpbWl0ZXIgZm9yIGJpdHNlYXJjaDogKi8KIAlfX3NldF9iaXQoTUFYX1JUX1BSSU8sIGFycmF5LT5iaXRtYXApOwogCi0jaWYgZGVmaW5lZCBDT05GSUdfU01QIHx8IGRlZmluZWQgQ09ORklHX1JUX0dST1VQX1NDSEVECisjaWYgZGVmaW5lZCBDT05GSUdfU01QCiAJcnRfcnEtPmhpZ2hlc3RfcHJpby5jdXJyID0gTUFYX1JUX1BSSU87Ci0jaWZkZWYgQ09ORklHX1NNUAogCXJ0X3JxLT5oaWdoZXN0X3ByaW8ubmV4dCA9IE1BWF9SVF9QUklPOwotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU01QCiAJcnRfcnEtPnJ0X25yX21pZ3JhdG9yeSA9IDA7CiAJcnRfcnEtPm92ZXJsb2FkZWQgPSAwOwotCXBsaXN0X2hlYWRfaW5pdF9yYXcoJnJ0X3JxLT5wdXNoYWJsZV90YXNrcywgJnJxLT5sb2NrKTsKKwlwbGlzdF9oZWFkX2luaXQoJnJ0X3JxLT5wdXNoYWJsZV90YXNrcyk7CiAjZW5kaWYKIAogCXJ0X3JxLT5ydF90aW1lID0gMDsKIAlydF9ycS0+cnRfdGhyb3R0bGVkID0gMDsKIAlydF9ycS0+cnRfcnVudGltZSA9IDA7CiAJcmF3X3NwaW5fbG9ja19pbml0KCZydF9ycS0+cnRfcnVudGltZV9sb2NrKTsKLQotI2lmZGVmIENPTkZJR19SVF9HUk9VUF9TQ0hFRAotCXJ0X3JxLT5ydF9ucl9ib29zdGVkID0gMDsKLQlydF9ycS0+cnEgPSBycTsKLSNlbmRpZgogfQogCiAjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKQEAgLTc3ODYsMTEgKzc5NzEsMTcgQEAKIAkJCQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpwYXJlbnQpCiB7CiAJc3RydWN0IHJxICpycSA9IGNwdV9ycShjcHUpOwotCXRnLT5jZnNfcnFbY3B1XSA9IGNmc19ycTsKLQlpbml0X2Nmc19ycShjZnNfcnEsIHJxKTsKLQljZnNfcnEtPnRnID0gdGc7CiAKKwljZnNfcnEtPnRnID0gdGc7CisJY2ZzX3JxLT5ycSA9IHJxOworI2lmZGVmIENPTkZJR19TTVAKKwkvKiBhbGxvdyBpbml0aWFsIHVwZGF0ZV9jZnNfbG9hZCgpIHRvIHRydW5jYXRlICovCisJY2ZzX3JxLT5sb2FkX3N0YW1wID0gMTsKKyNlbmRpZgorCisJdGctPmNmc19ycVtjcHVdID0gY2ZzX3JxOwogCXRnLT5zZVtjcHVdID0gc2U7CisKIAkvKiBzZSBjb3VsZCBiZSBOVUxMIGZvciByb290X3Rhc2tfZ3JvdXAgKi8KIAlpZiAoIXNlKQogCQlyZXR1cm47CkBAIC03ODEzLDEyICs4MDA0LDE0IEBACiB7CiAJc3RydWN0IHJxICpycSA9IGNwdV9ycShjcHUpOwogCi0JdGctPnJ0X3JxW2NwdV0gPSBydF9ycTsKLQlpbml0X3J0X3JxKHJ0X3JxLCBycSk7CisJcnRfcnEtPmhpZ2hlc3RfcHJpby5jdXJyID0gTUFYX1JUX1BSSU87CisJcnRfcnEtPnJ0X25yX2Jvb3N0ZWQgPSAwOworCXJ0X3JxLT5ycSA9IHJxOwogCXJ0X3JxLT50ZyA9IHRnOwotCXJ0X3JxLT5ydF9ydW50aW1lID0gdGctPnJ0X2JhbmR3aWR0aC5ydF9ydW50aW1lOwogCisJdGctPnJ0X3JxW2NwdV0gPSBydF9ycTsKIAl0Zy0+cnRfc2VbY3B1XSA9IHJ0X3NlOworCiAJaWYgKCFydF9zZSkKIAkJcmV0dXJuOwogCkBAIC03OTAwLDcgKzgwOTMsNyBAQAogCQlycS0+bnJfcnVubmluZyA9IDA7CiAJCXJxLT5jYWxjX2xvYWRfYWN0aXZlID0gMDsKIAkJcnEtPmNhbGNfbG9hZF91cGRhdGUgPSBqaWZmaWVzICsgTE9BRF9GUkVROwotCQlpbml0X2Nmc19ycSgmcnEtPmNmcywgcnEpOworCQlpbml0X2Nmc19ycSgmcnEtPmNmcyk7CiAJCWluaXRfcnRfcnEoJnJxLT5ydCwgcnEpOwogI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECiAJCXJvb3RfdGFza19ncm91cC5zaGFyZXMgPSByb290X3Rhc2tfZ3JvdXBfbG9hZDsKQEAgLTc5NzEsNyArODE2NCw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCi0JcGxpc3RfaGVhZF9pbml0X3JhdygmaW5pdF90YXNrLnBpX3dhaXRlcnMsICZpbml0X3Rhc2sucGlfbG9jayk7CisJcGxpc3RfaGVhZF9pbml0KCZpbml0X3Rhc2sucGlfd2FpdGVycyk7CiAjZW5kaWYKIAogCS8qCkBAIC04MDE0LDcgKzgyMDcsNyBAQAogCXNjaGVkdWxlcl9ydW5uaW5nID0gMTsKIH0KIAotI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUAorI2lmZGVmIENPTkZJR19ERUJVR19BVE9NSUNfU0xFRVAKIHN0YXRpYyBpbmxpbmUgaW50IHByZWVtcHRfY291bnRfZXF1YWxzKGludCBwcmVlbXB0X29mZnNldCkKIHsKIAlpbnQgbmVzdGVkID0gKHByZWVtcHRfY291bnQoKSAmIH5QUkVFTVBUX0FDVElWRSkgKyByY3VfcHJlZW1wdF9kZXB0aCgpOwpAQCAtODAyNCw3ICs4MjE3LDYgQEAKIAogdm9pZCBfX21pZ2h0X3NsZWVwKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgcHJlZW1wdF9vZmZzZXQpCiB7Ci0jaWZkZWYgaW5fYXRvbWljCiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9qaWZmeTsJLyogcmF0ZWxpbWl0aW5nICovCiAKIAlpZiAoKHByZWVtcHRfY291bnRfZXF1YWxzKHByZWVtcHRfb2Zmc2V0KSAmJiAhaXJxc19kaXNhYmxlZCgpKSB8fApAQCAtODA0Niw3ICs4MjM4LDYgQEAKIAlpZiAoaXJxc19kaXNhYmxlZCgpKQogCQlwcmludF9pcnF0cmFjZV9ldmVudHMoY3VycmVudCk7CiAJZHVtcF9zdGFjaygpOwotI2VuZGlmCiB9CiBFWFBPUlRfU1lNQk9MKF9fbWlnaHRfc2xlZXApOwogI2VuZGlmCkBAIC04MjA1LDYgKzgzOTYsNyBAQAogCQlpZiAoIXNlKQogCQkJZ290byBlcnJfZnJlZV9ycTsKIAorCQlpbml0X2Nmc19ycShjZnNfcnEpOwogCQlpbml0X3RnX2Nmc19lbnRyeSh0ZywgY2ZzX3JxLCBzZSwgaSwgcGFyZW50LT5zZVtpXSk7CiAJfQogCkBAIC04MjMyLDcgKzg0MjQsNyBAQAogCWxpc3RfZGVsX2xlYWZfY2ZzX3JxKHRnLT5jZnNfcnFbY3B1XSk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7CiB9Ci0jZWxzZSAvKiAhQ09ORkdfRkFJUl9HUk9VUF9TQ0hFRCAqLworI2Vsc2UgLyogIUNPTkZJR19GQUlSX0dST1VQX1NDSEVEICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9mYWlyX3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0ZykKIHsKIH0KQEAgLTgyNTMsNyArODQ0NSw4IEBACiB7CiAJaW50IGk7CiAKLQlkZXN0cm95X3J0X2JhbmR3aWR0aCgmdGctPnJ0X2JhbmR3aWR0aCk7CisJaWYgKHRnLT5ydF9zZSkKKwkJZGVzdHJveV9ydF9iYW5kd2lkdGgoJnRnLT5ydF9iYW5kd2lkdGgpOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJaWYgKHRnLT5ydF9ycSkKQEAgLTgyOTQsNiArODQ4Nyw4IEBACiAJCWlmICghcnRfc2UpCiAJCQlnb3RvIGVycl9mcmVlX3JxOwogCisJCWluaXRfcnRfcnEocnRfcnEsIGNwdV9ycShpKSk7CisJCXJ0X3JxLT5ydF9ydW50aW1lID0gdGctPnJ0X2JhbmR3aWR0aC5ydF9ydW50aW1lOwogCQlpbml0X3RnX3J0X2VudHJ5KHRnLCBydF9ycSwgcnRfc2UsIGksIHBhcmVudC0+cnRfc2VbaV0pOwogCX0KIApAQCAtODQzNSwxMCArODYzMCw3IEBACiAJaWYgKCF0Zy0+c2VbMF0pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHNoYXJlcyA8IE1JTl9TSEFSRVMpCi0JCXNoYXJlcyA9IE1JTl9TSEFSRVM7Ci0JZWxzZSBpZiAoc2hhcmVzID4gTUFYX1NIQVJFUykKLQkJc2hhcmVzID0gTUFYX1NIQVJFUzsKKwlzaGFyZXMgPSBjbGFtcChzaGFyZXMsIHNjYWxlX2xvYWQoTUlOX1NIQVJFUyksIHNjYWxlX2xvYWQoTUFYX1NIQVJFUykpOwogCiAJbXV0ZXhfbG9jaygmc2hhcmVzX211dGV4KTsKIAlpZiAodGctPnNoYXJlcyA9PSBzaGFyZXMpCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfYXV0b2dyb3VwLmggYi9rZXJuZWwvc2NoZWRfYXV0b2dyb3VwLmgKaW5kZXggMDU1NzcwNS4uYzJmMGU3MiAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2F1dG9ncm91cC5oCisrKyBiL2tlcm5lbC9zY2hlZF9hdXRvZ3JvdXAuaApAQCAtMTMsNiArMTMsNyBAQAogCWludAkJCW5pY2U7CiB9OwogCitzdGF0aWMgaW5saW5lIGJvb2wgdGFza19ncm91cF9pc19hdXRvZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnKTsKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfZ3JvdXAgKgogYXV0b2dyb3VwX3Rhc2tfZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgdGFza19ncm91cCAqdGcpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfZmFpci5jIGIva2VybmVsL3NjaGVkX2ZhaXIuYwppbmRleCA0MzM0OTFjMi4uYmM4ZWU5OSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2ZhaXIuYworKysgYi9rZXJuZWwvc2NoZWRfZmFpci5jCkBAIC0xMzUsMTQgKzEzNSw2IEBACiAJcmV0dXJuIGdycC0+bXlfcTsKIH0KIAotLyogR2l2ZW4gYSBncm91cCdzIGNmc19ycSBvbiBvbmUgY3B1LCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2ZzX3JxIG9uCi0gKiBhbm90aGVyIGNwdSAoJ3RoaXNfY3B1JykKLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgY2ZzX3JxICpjcHVfY2ZzX3JxKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgaW50IHRoaXNfY3B1KQotewotCXJldHVybiBjZnNfcnEtPnRnLT5jZnNfcnFbdGhpc19jcHVdOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9hZGRfbGVhZl9jZnNfcnEoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQogewogCWlmICghY2ZzX3JxLT5vbl9saXN0KSB7CkBAIC0yNzEsMTEgKzI2Myw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNmc19ycSAqY3B1X2Nmc19ycShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIGludCB0aGlzX2NwdSkKLXsKLQlyZXR1cm4gJmNwdV9ycSh0aGlzX2NwdSktPmNmczsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkX2xlYWZfY2ZzX3JxKHN0cnVjdCBjZnNfcnEgKmNmc19ycSkKIHsKIH0KQEAgLTMzNCwxMSArMzIxLDYgQEAKIAlyZXR1cm4gKHM2NCkoYS0+dnJ1bnRpbWUgLSBiLT52cnVudGltZSkgPCAwOwogfQogCi1zdGF0aWMgaW5saW5lIHM2NCBlbnRpdHlfa2V5KHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCi17Ci0JcmV0dXJuIHNlLT52cnVudGltZSAtIGNmc19ycS0+bWluX3ZydW50aW1lOwotfQotCiBzdGF0aWMgdm9pZCB1cGRhdGVfbWluX3ZydW50aW1lKHN0cnVjdCBjZnNfcnEgKmNmc19ycSkKIHsKIAl1NjQgdnJ1bnRpbWUgPSBjZnNfcnEtPm1pbl92cnVudGltZTsKQEAgLTM3Miw3ICszNTQsNiBAQAogCXN0cnVjdCByYl9ub2RlICoqbGluayA9ICZjZnNfcnEtPnRhc2tzX3RpbWVsaW5lLnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CiAJc3RydWN0IHNjaGVkX2VudGl0eSAqZW50cnk7Ci0JczY0IGtleSA9IGVudGl0eV9rZXkoY2ZzX3JxLCBzZSk7CiAJaW50IGxlZnRtb3N0ID0gMTsKIAogCS8qCkBAIC0zODUsNyArMzY2LDcgQEAKIAkJICogV2UgZG9udCBjYXJlIGFib3V0IGNvbGxpc2lvbnMuIE5vZGVzIHdpdGgKIAkJICogdGhlIHNhbWUga2V5IHN0YXkgdG9nZXRoZXIuCiAJCSAqLwotCQlpZiAoa2V5IDwgZW50aXR5X2tleShjZnNfcnEsIGVudHJ5KSkgeworCQlpZiAoZW50aXR5X2JlZm9yZShzZSwgZW50cnkpKSB7CiAJCQlsaW5rID0gJnBhcmVudC0+cmJfbGVmdDsKIAkJfSBlbHNlIHsKIAkJCWxpbmsgPSAmcGFyZW50LT5yYl9yaWdodDsKQEAgLTEzMzYsNyArMTMxNyw3IEBACiAJfQogCiAJZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKSB7Ci0JCXN0cnVjdCBjZnNfcnEgKmNmc19ycSA9IGNmc19ycV9vZihzZSk7CisJCWNmc19ycSA9IGNmc19ycV9vZihzZSk7CiAKIAkJdXBkYXRlX2Nmc19sb2FkKGNmc19ycSwgMCk7CiAJCXVwZGF0ZV9jZnNfc2hhcmVzKGNmc19ycSk7CkBAIC0xMzcwLDEzICsxMzUxLDE2IEBACiAJCQkgKi8KIAkJCWlmICh0YXNrX3NsZWVwICYmIHBhcmVudF9lbnRpdHkoc2UpKQogCQkJCXNldF9uZXh0X2J1ZGR5KHBhcmVudF9lbnRpdHkoc2UpKTsKKworCQkJLyogYXZvaWQgcmUtZXZhbHVhdGluZyBsb2FkIGZvciB0aGlzIGVudGl0eSAqLworCQkJc2UgPSBwYXJlbnRfZW50aXR5KHNlKTsKIAkJCWJyZWFrOwogCQl9CiAJCWZsYWdzIHw9IERFUVVFVUVfU0xFRVA7CiAJfQogCiAJZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKSB7Ci0JCXN0cnVjdCBjZnNfcnEgKmNmc19ycSA9IGNmc19ycV9vZihzZSk7CisJCWNmc19ycSA9IGNmc19ycV9vZihzZSk7CiAKIAkJdXBkYXRlX2Nmc19sb2FkKGNmc19ycSwgMCk7CiAJCXVwZGF0ZV9jZnNfc2hhcmVzKGNmc19ycSk7CkBAIC0xNDgxLDcgKzE0NjUsNiBAQAogCSAqIGVmZmVjdCBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzayBmcm9tIHRoZSBsb2FkCiAJICogb2YgdGhlIGN1cnJlbnQgQ1BVOgogCSAqLwotCXJjdV9yZWFkX2xvY2soKTsKIAlpZiAoc3luYykgewogCQl0ZyA9IHRhc2tfZ3JvdXAoY3VycmVudCk7CiAJCXdlaWdodCA9IGN1cnJlbnQtPnNlLmxvYWQud2VpZ2h0OwpAQCAtMTUxNyw3ICsxNTAwLDYgQEAKIAkJYmFsYW5jZWQgPSB0aGlzX2VmZl9sb2FkIDw9IHByZXZfZWZmX2xvYWQ7CiAJfSBlbHNlCiAJCWJhbGFuY2VkID0gdHJ1ZTsKLQlyY3VfcmVhZF91bmxvY2soKTsKIAogCS8qCiAJICogSWYgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRhc2sgd2lsbCBzbGVlcCB3aXRoaW4KQEAgLTE1ODUsNyArMTU2Nyw3IEBACiAJCX0KIAogCQkvKiBBZGp1c3QgYnkgcmVsYXRpdmUgQ1BVIHBvd2VyIG9mIHRoZSBncm91cCAqLwotCQlhdmdfbG9hZCA9IChhdmdfbG9hZCAqIFNDSEVEX1BPV0VSX1NDQUxFKSAvIGdyb3VwLT5jcHVfcG93ZXI7CisJCWF2Z19sb2FkID0gKGF2Z19sb2FkICogU0NIRURfUE9XRVJfU0NBTEUpIC8gZ3JvdXAtPnNncC0+cG93ZXI7CiAKIAkJaWYgKGxvY2FsX2dyb3VwKSB7CiAJCQl0aGlzX2xvYWQgPSBhdmdfbG9hZDsKQEAgLTE5MjEsOCArMTkwMyw4IEBACiAJaWYgKCFzY2hlZF9mZWF0KFdBS0VVUF9QUkVFTVBUKSkKIAkJcmV0dXJuOwogCi0JdXBkYXRlX2N1cnIoY2ZzX3JxKTsKIAlmaW5kX21hdGNoaW5nX3NlKCZzZSwgJnBzZSk7CisJdXBkYXRlX2N1cnIoY2ZzX3JxX29mKHNlKSk7CiAJQlVHX09OKCFwc2UpOwogCWlmICh3YWtldXBfcHJlZW1wdF9lbnRpdHkoc2UsIHBzZSkgPT0gMSkgewogCQkvKgpAQCAtMjIzMSwxMSArMjIxMyw0MyBAQAogCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKIAogCXJjdV9yZWFkX2xvY2soKTsKKwkvKgorCSAqIEl0ZXJhdGVzIHRoZSB0YXNrX2dyb3VwIHRyZWUgaW4gYSBib3R0b20gdXAgZmFzaGlvbiwgc2VlCisJICogbGlzdF9hZGRfbGVhZl9jZnNfcnEoKSBmb3IgZGV0YWlscy4KKwkgKi8KIAlmb3JfZWFjaF9sZWFmX2Nmc19ycShycSwgY2ZzX3JxKQogCQl1cGRhdGVfc2hhcmVzX2NwdShjZnNfcnEtPnRnLCBjcHUpOwogCXJjdV9yZWFkX3VubG9jaygpOwogfQogCisvKgorICogQ29tcHV0ZSB0aGUgY3B1J3MgaGllcmFyY2hpY2FsIGxvYWQgZmFjdG9yIGZvciBlYWNoIHRhc2sgZ3JvdXAuCisgKiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgaW4gYSB0b3AtZG93biBmYXNoaW9uIGJlY2F1c2UgdGhlIGxvYWQgb2YgYSBjaGlsZAorICogZ3JvdXAgaXMgYSBmcmFjdGlvbiBvZiBpdHMgcGFyZW50cyBsb2FkLgorICovCitzdGF0aWMgaW50IHRnX2xvYWRfZG93bihzdHJ1Y3QgdGFza19ncm91cCAqdGcsIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBsb2FkOworCWxvbmcgY3B1ID0gKGxvbmcpZGF0YTsKKworCWlmICghdGctPnBhcmVudCkgeworCQlsb2FkID0gY3B1X3JxKGNwdSktPmxvYWQud2VpZ2h0OworCX0gZWxzZSB7CisJCWxvYWQgPSB0Zy0+cGFyZW50LT5jZnNfcnFbY3B1XS0+aF9sb2FkOworCQlsb2FkICo9IHRnLT5zZVtjcHVdLT5sb2FkLndlaWdodDsKKwkJbG9hZCAvPSB0Zy0+cGFyZW50LT5jZnNfcnFbY3B1XS0+bG9hZC53ZWlnaHQgKyAxOworCX0KKworCXRnLT5jZnNfcnFbY3B1XS0+aF9sb2FkID0gbG9hZDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfaF9sb2FkKGxvbmcgY3B1KQoreworCXdhbGtfdGdfdHJlZSh0Z19sb2FkX2Rvd24sIHRnX25vcCwgKHZvaWQgKiljcHUpOworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogbG9hZF9iYWxhbmNlX2ZhaXIoc3RydWN0IHJxICp0aGlzX3JxLCBpbnQgdGhpc19jcHUsIHN0cnVjdCBycSAqYnVzaWVzdCwKIAkJICB1bnNpZ25lZCBsb25nIG1heF9sb2FkX21vdmUsCkBAIC0yMjQzLDE0ICsyMjU3LDEyIEBACiAJCSAgaW50ICphbGxfcGlubmVkKQogewogCWxvbmcgcmVtX2xvYWRfbW92ZSA9IG1heF9sb2FkX21vdmU7Ci0JaW50IGJ1c2llc3RfY3B1ID0gY3B1X29mKGJ1c2llc3QpOwotCXN0cnVjdCB0YXNrX2dyb3VwICp0ZzsKKwlzdHJ1Y3QgY2ZzX3JxICpidXNpZXN0X2Nmc19ycTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQl1cGRhdGVfaF9sb2FkKGJ1c2llc3RfY3B1KTsKKwl1cGRhdGVfaF9sb2FkKGNwdV9vZihidXNpZXN0KSk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0ZywgJnRhc2tfZ3JvdXBzLCBsaXN0KSB7Ci0JCXN0cnVjdCBjZnNfcnEgKmJ1c2llc3RfY2ZzX3JxID0gdGctPmNmc19ycVtidXNpZXN0X2NwdV07CisJZm9yX2VhY2hfbGVhZl9jZnNfcnEoYnVzaWVzdCwgYnVzaWVzdF9jZnNfcnEpIHsKIAkJdW5zaWduZWQgbG9uZyBidXNpZXN0X2hfbG9hZCA9IGJ1c2llc3RfY2ZzX3JxLT5oX2xvYWQ7CiAJCXVuc2lnbmVkIGxvbmcgYnVzaWVzdF93ZWlnaHQgPSBidXNpZXN0X2Nmc19ycS0+bG9hZC53ZWlnaHQ7CiAJCXU2NCByZW1fbG9hZCwgbW92ZWRfbG9hZDsKQEAgLTI2MzEsNyArMjY0Myw3IEBACiAJCXBvd2VyID4+PSBTQ0hFRF9QT1dFUl9TSElGVDsKIAl9CiAKLQlzZGctPmNwdV9wb3dlcl9vcmlnID0gcG93ZXI7CisJc2RnLT5zZ3AtPnBvd2VyX29yaWcgPSBwb3dlcjsKIAogCWlmIChzY2hlZF9mZWF0KEFSQ0hfUE9XRVIpKQogCQlwb3dlciAqPSBhcmNoX3NjYWxlX2ZyZXFfcG93ZXIoc2QsIGNwdSk7CkBAIC0yNjQ3LDcgKzI2NTksNyBAQAogCQlwb3dlciA9IDE7CiAKIAljcHVfcnEoY3B1KS0+Y3B1X3Bvd2VyID0gcG93ZXI7Ci0Jc2RnLT5jcHVfcG93ZXIgPSBwb3dlcjsKKwlzZGctPnNncC0+cG93ZXIgPSBwb3dlcjsKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX2dyb3VwX3Bvd2VyKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQpAQCAtMjY2NSwxMSArMjY3NywxMSBAQAogCiAJZ3JvdXAgPSBjaGlsZC0+Z3JvdXBzOwogCWRvIHsKLQkJcG93ZXIgKz0gZ3JvdXAtPmNwdV9wb3dlcjsKKwkJcG93ZXIgKz0gZ3JvdXAtPnNncC0+cG93ZXI7CiAJCWdyb3VwID0gZ3JvdXAtPm5leHQ7CiAJfSB3aGlsZSAoZ3JvdXAgIT0gY2hpbGQtPmdyb3Vwcyk7CiAKLQlzZGctPmNwdV9wb3dlciA9IHBvd2VyOworCXNkZy0+c2dwLT5wb3dlciA9IHBvd2VyOwogfQogCiAvKgpAQCAtMjY5MSw3ICsyNzAzLDcgQEAKIAkvKgogCSAqIElmIH45MCUgb2YgdGhlIGNwdV9wb3dlciBpcyBzdGlsbCB0aGVyZSwgd2UncmUgZ29vZC4KIAkgKi8KLQlpZiAoZ3JvdXAtPmNwdV9wb3dlciAqIDMyID4gZ3JvdXAtPmNwdV9wb3dlcl9vcmlnICogMjkpCisJaWYgKGdyb3VwLT5zZ3AtPnBvd2VyICogMzIgPiBncm91cC0+c2dwLT5wb3dlcl9vcmlnICogMjkpCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CkBAIC0yNzcxLDcgKzI3ODMsNyBAQAogCX0KIAogCS8qIEFkanVzdCBieSByZWxhdGl2ZSBDUFUgcG93ZXIgb2YgdGhlIGdyb3VwICovCi0Jc2dzLT5hdmdfbG9hZCA9IChzZ3MtPmdyb3VwX2xvYWQqU0NIRURfUE9XRVJfU0NBTEUpIC8gZ3JvdXAtPmNwdV9wb3dlcjsKKwlzZ3MtPmF2Z19sb2FkID0gKHNncy0+Z3JvdXBfbG9hZCpTQ0hFRF9QT1dFUl9TQ0FMRSkgLyBncm91cC0+c2dwLT5wb3dlcjsKIAogCS8qCiAJICogQ29uc2lkZXIgdGhlIGdyb3VwIHVuYmFsYW5jZWQgd2hlbiB0aGUgaW1iYWxhbmNlIGlzIGxhcmdlcgpAQCAtMjc4OCw3ICsyODAwLDcgQEAKIAlpZiAoKG1heF9jcHVfbG9hZCAtIG1pbl9jcHVfbG9hZCkgPj0gYXZnX2xvYWRfcGVyX3Rhc2sgJiYgbWF4X25yX3J1bm5pbmcgPiAxKQogCQlzZ3MtPmdyb3VwX2ltYiA9IDE7CiAKLQlzZ3MtPmdyb3VwX2NhcGFjaXR5ID0gRElWX1JPVU5EX0NMT1NFU1QoZ3JvdXAtPmNwdV9wb3dlciwKKwlzZ3MtPmdyb3VwX2NhcGFjaXR5ID0gRElWX1JPVU5EX0NMT1NFU1QoZ3JvdXAtPnNncC0+cG93ZXIsCiAJCQkJCQlTQ0hFRF9QT1dFUl9TQ0FMRSk7CiAJaWYgKCFzZ3MtPmdyb3VwX2NhcGFjaXR5KQogCQlzZ3MtPmdyb3VwX2NhcGFjaXR5ID0gZml4X3NtYWxsX2NhcGFjaXR5KHNkLCBncm91cCk7CkBAIC0yODc3LDcgKzI4ODksNyBAQAogCQkJcmV0dXJuOwogCiAJCXNkcy0+dG90YWxfbG9hZCArPSBzZ3MuZ3JvdXBfbG9hZDsKLQkJc2RzLT50b3RhbF9wd3IgKz0gc2ctPmNwdV9wb3dlcjsKKwkJc2RzLT50b3RhbF9wd3IgKz0gc2ctPnNncC0+cG93ZXI7CiAKIAkJLyoKIAkJICogSW4gY2FzZSB0aGUgY2hpbGQgZG9tYWluIHByZWZlcnMgdGFza3MgZ28gdG8gc2libGluZ3MKQEAgLTI5NjIsNyArMjk3NCw3IEBACiAJaWYgKHRoaXNfY3B1ID4gYnVzaWVzdF9jcHUpCiAJCXJldHVybiAwOwogCi0JKmltYmFsYW5jZSA9IERJVl9ST1VORF9DTE9TRVNUKHNkcy0+bWF4X2xvYWQgKiBzZHMtPmJ1c2llc3QtPmNwdV9wb3dlciwKKwkqaW1iYWxhbmNlID0gRElWX1JPVU5EX0NMT1NFU1Qoc2RzLT5tYXhfbG9hZCAqIHNkcy0+YnVzaWVzdC0+c2dwLT5wb3dlciwKIAkJCQkgICAgICAgU0NIRURfUE9XRVJfU0NBTEUpOwogCXJldHVybiAxOwogfQpAQCAtMjk5Myw3ICszMDA1LDcgQEAKIAogCXNjYWxlZF9idXN5X2xvYWRfcGVyX3Rhc2sgPSBzZHMtPmJ1c2llc3RfbG9hZF9wZXJfdGFzawogCQkJCQkgKiBTQ0hFRF9QT1dFUl9TQ0FMRTsKLQlzY2FsZWRfYnVzeV9sb2FkX3Blcl90YXNrIC89IHNkcy0+YnVzaWVzdC0+Y3B1X3Bvd2VyOworCXNjYWxlZF9idXN5X2xvYWRfcGVyX3Rhc2sgLz0gc2RzLT5idXNpZXN0LT5zZ3AtPnBvd2VyOwogCiAJaWYgKHNkcy0+bWF4X2xvYWQgLSBzZHMtPnRoaXNfbG9hZCArIHNjYWxlZF9idXN5X2xvYWRfcGVyX3Rhc2sgPj0KIAkJCShzY2FsZWRfYnVzeV9sb2FkX3Blcl90YXNrICogaW1ibikpIHsKQEAgLTMwMDcsMjggKzMwMTksMjggQEAKIAkgKiBtb3ZpbmcgdGhlbS4KIAkgKi8KIAotCXB3cl9ub3cgKz0gc2RzLT5idXNpZXN0LT5jcHVfcG93ZXIgKgorCXB3cl9ub3cgKz0gc2RzLT5idXNpZXN0LT5zZ3AtPnBvd2VyICoKIAkJCW1pbihzZHMtPmJ1c2llc3RfbG9hZF9wZXJfdGFzaywgc2RzLT5tYXhfbG9hZCk7Ci0JcHdyX25vdyArPSBzZHMtPnRoaXMtPmNwdV9wb3dlciAqCisJcHdyX25vdyArPSBzZHMtPnRoaXMtPnNncC0+cG93ZXIgKgogCQkJbWluKHNkcy0+dGhpc19sb2FkX3Blcl90YXNrLCBzZHMtPnRoaXNfbG9hZCk7CiAJcHdyX25vdyAvPSBTQ0hFRF9QT1dFUl9TQ0FMRTsKIAogCS8qIEFtb3VudCBvZiBsb2FkIHdlJ2Qgc3VidHJhY3QgKi8KIAl0bXAgPSAoc2RzLT5idXNpZXN0X2xvYWRfcGVyX3Rhc2sgKiBTQ0hFRF9QT1dFUl9TQ0FMRSkgLwotCQlzZHMtPmJ1c2llc3QtPmNwdV9wb3dlcjsKKwkJc2RzLT5idXNpZXN0LT5zZ3AtPnBvd2VyOwogCWlmIChzZHMtPm1heF9sb2FkID4gdG1wKQotCQlwd3JfbW92ZSArPSBzZHMtPmJ1c2llc3QtPmNwdV9wb3dlciAqCisJCXB3cl9tb3ZlICs9IHNkcy0+YnVzaWVzdC0+c2dwLT5wb3dlciAqCiAJCQltaW4oc2RzLT5idXNpZXN0X2xvYWRfcGVyX3Rhc2ssIHNkcy0+bWF4X2xvYWQgLSB0bXApOwogCiAJLyogQW1vdW50IG9mIGxvYWQgd2UnZCBhZGQgKi8KLQlpZiAoc2RzLT5tYXhfbG9hZCAqIHNkcy0+YnVzaWVzdC0+Y3B1X3Bvd2VyIDwKKwlpZiAoc2RzLT5tYXhfbG9hZCAqIHNkcy0+YnVzaWVzdC0+c2dwLT5wb3dlciA8CiAJCXNkcy0+YnVzaWVzdF9sb2FkX3Blcl90YXNrICogU0NIRURfUE9XRVJfU0NBTEUpCi0JCXRtcCA9IChzZHMtPm1heF9sb2FkICogc2RzLT5idXNpZXN0LT5jcHVfcG93ZXIpIC8KLQkJCXNkcy0+dGhpcy0+Y3B1X3Bvd2VyOworCQl0bXAgPSAoc2RzLT5tYXhfbG9hZCAqIHNkcy0+YnVzaWVzdC0+c2dwLT5wb3dlcikgLworCQkJc2RzLT50aGlzLT5zZ3AtPnBvd2VyOwogCWVsc2UKIAkJdG1wID0gKHNkcy0+YnVzaWVzdF9sb2FkX3Blcl90YXNrICogU0NIRURfUE9XRVJfU0NBTEUpIC8KLQkJCXNkcy0+dGhpcy0+Y3B1X3Bvd2VyOwotCXB3cl9tb3ZlICs9IHNkcy0+dGhpcy0+Y3B1X3Bvd2VyICoKKwkJCXNkcy0+dGhpcy0+c2dwLT5wb3dlcjsKKwlwd3JfbW92ZSArPSBzZHMtPnRoaXMtPnNncC0+cG93ZXIgKgogCQkJbWluKHNkcy0+dGhpc19sb2FkX3Blcl90YXNrLCBzZHMtPnRoaXNfbG9hZCArIHRtcCk7CiAJcHdyX21vdmUgLz0gU0NIRURfUE9XRVJfU0NBTEU7CiAKQEAgLTMwNzQsNyArMzA4Niw3IEBACiAKIAkJbG9hZF9hYm92ZV9jYXBhY2l0eSAqPSAoU0NIRURfTE9BRF9TQ0FMRSAqIFNDSEVEX1BPV0VSX1NDQUxFKTsKIAotCQlsb2FkX2Fib3ZlX2NhcGFjaXR5IC89IHNkcy0+YnVzaWVzdC0+Y3B1X3Bvd2VyOworCQlsb2FkX2Fib3ZlX2NhcGFjaXR5IC89IHNkcy0+YnVzaWVzdC0+c2dwLT5wb3dlcjsKIAl9CiAKIAkvKgpAQCAtMzA5MCw4ICszMTAyLDggQEAKIAltYXhfcHVsbCA9IG1pbihzZHMtPm1heF9sb2FkIC0gc2RzLT5hdmdfbG9hZCwgbG9hZF9hYm92ZV9jYXBhY2l0eSk7CiAKIAkvKiBIb3cgbXVjaCBsb2FkIHRvIGFjdHVhbGx5IG1vdmUgdG8gZXF1YWxpc2UgdGhlIGltYmFsYW5jZSAqLwotCSppbWJhbGFuY2UgPSBtaW4obWF4X3B1bGwgKiBzZHMtPmJ1c2llc3QtPmNwdV9wb3dlciwKLQkJKHNkcy0+YXZnX2xvYWQgLSBzZHMtPnRoaXNfbG9hZCkgKiBzZHMtPnRoaXMtPmNwdV9wb3dlcikKKwkqaW1iYWxhbmNlID0gbWluKG1heF9wdWxsICogc2RzLT5idXNpZXN0LT5zZ3AtPnBvd2VyLAorCQkoc2RzLT5hdmdfbG9hZCAtIHNkcy0+dGhpc19sb2FkKSAqIHNkcy0+dGhpcy0+c2dwLT5wb3dlcikKIAkJCS8gU0NIRURfUE9XRVJfU0NBTEU7CiAKIAkvKgpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2ZlYXR1cmVzLmggYi9rZXJuZWwvc2NoZWRfZmVhdHVyZXMuaAppbmRleCBiZTQwZjczLi4yZTc0Njc3IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfZmVhdHVyZXMuaAorKysgYi9rZXJuZWwvc2NoZWRfZmVhdHVyZXMuaApAQCAtNjEsMTIgKzYxLDE0IEBACiBTQ0hFRF9GRUFUKE9XTkVSX1NQSU4sIDEpCiAKIC8qCi0gKiBEZWNyZW1lbnQgQ1BVIHBvd2VyIGJhc2VkIG9uIGlycSBhY3Rpdml0eQorICogRGVjcmVtZW50IENQVSBwb3dlciBiYXNlZCBvbiB0aW1lIG5vdCBzcGVudCBydW5uaW5nIHRhc2tzCiAgKi8KLVNDSEVEX0ZFQVQoTk9OSVJRX1BPV0VSLCAxKQorU0NIRURfRkVBVChOT05UQVNLX1BPV0VSLCAxKQogCiAvKgogICogUXVldWUgcmVtb3RlIHdha2V1cHMgb24gdGhlIHRhcmdldCBDUFUgYW5kIHByb2Nlc3MgdGhlbQogICogdXNpbmcgdGhlIHNjaGVkdWxlciBJUEkuIFJlZHVjZXMgcnEtPmxvY2sgY29udGVudGlvbi9ib3VuY2VzLgogICovCiBTQ0hFRF9GRUFUKFRUV1VfUVVFVUUsIDEpCisKK1NDSEVEX0ZFQVQoRk9SQ0VfU0RfT1ZFUkxBUCwgMCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9ydC5jIGIva2VybmVsL3NjaGVkX3J0LmMKaW5kZXggODg3MjVjOS4uOTc1NDBmMCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX3J0LmMKKysrIGIva2VybmVsL3NjaGVkX3J0LmMKQEAgLTE4NSwxMSArMTg1LDIzIEBACiAKIHR5cGVkZWYgc3RydWN0IHRhc2tfZ3JvdXAgKnJ0X3JxX2l0ZXJfdDsKIAotI2RlZmluZSBmb3JfZWFjaF9ydF9ycShydF9ycSwgaXRlciwgcnEpIFwKLQlmb3IgKGl0ZXIgPSBsaXN0X2VudHJ5X3JjdSh0YXNrX2dyb3Vwcy5uZXh0LCB0eXBlb2YoKml0ZXIpLCBsaXN0KTsgXAotCSAgICAgKCZpdGVyLT5saXN0ICE9ICZ0YXNrX2dyb3VwcykgJiYgXAotCSAgICAgKHJ0X3JxID0gaXRlci0+cnRfcnFbY3B1X29mKHJxKV0pOyBcCi0JICAgICBpdGVyID0gbGlzdF9lbnRyeV9yY3UoaXRlci0+bGlzdC5uZXh0LCB0eXBlb2YoKml0ZXIpLCBsaXN0KSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfZ3JvdXAgKm5leHRfdGFza19ncm91cChzdHJ1Y3QgdGFza19ncm91cCAqdGcpCit7CisJZG8geworCQl0ZyA9IGxpc3RfZW50cnlfcmN1KHRnLT5saXN0Lm5leHQsCisJCQl0eXBlb2Yoc3RydWN0IHRhc2tfZ3JvdXApLCBsaXN0KTsKKwl9IHdoaWxlICgmdGctPmxpc3QgIT0gJnRhc2tfZ3JvdXBzICYmIHRhc2tfZ3JvdXBfaXNfYXV0b2dyb3VwKHRnKSk7CisKKwlpZiAoJnRnLT5saXN0ID09ICZ0YXNrX2dyb3VwcykKKwkJdGcgPSBOVUxMOworCisJcmV0dXJuIHRnOworfQorCisjZGVmaW5lIGZvcl9lYWNoX3J0X3JxKHJ0X3JxLCBpdGVyLCBycSkJCQkJCVwKKwlmb3IgKGl0ZXIgPSBjb250YWluZXJfb2YoJnRhc2tfZ3JvdXBzLCB0eXBlb2YoKml0ZXIpLCBsaXN0KTsJXAorCQkoaXRlciA9IG5leHRfdGFza19ncm91cChpdGVyKSkgJiYJCQlcCisJCShydF9ycSA9IGl0ZXItPnJ0X3JxW2NwdV9vZihycSldKTspCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2FkZF9sZWFmX3J0X3JxKHN0cnVjdCBydF9ycSAqcnRfcnEpCiB7CkBAIC0xMDk2LDcgKzExMDgsNyBAQAogCSAqIHRvIG1vdmUgY3VycmVudCBzb21ld2hlcmUgZWxzZSwgbWFraW5nIHJvb20gZm9yIG91ciBub24tbWlncmF0YWJsZQogCSAqIHRhc2suCiAJICovCi0JaWYgKHAtPnByaW8gPT0gcnEtPmN1cnItPnByaW8gJiYgIW5lZWRfcmVzY2hlZCgpKQorCWlmIChwLT5wcmlvID09IHJxLT5jdXJyLT5wcmlvICYmICF0ZXN0X3Rza19uZWVkX3Jlc2NoZWQocnEtPmN1cnIpKQogCQljaGVja19wcmVlbXB0X2VxdWFsX3ByaW8ocnEsIHApOwogI2VuZGlmCiB9CkBAIC0xMTI2LDcgKzExMzgsNyBAQAogCiAJcnRfcnEgPSAmcnEtPnJ0OwogCi0JaWYgKHVubGlrZWx5KCFydF9ycS0+cnRfbnJfcnVubmluZykpCisJaWYgKCFydF9ycS0+cnRfbnJfcnVubmluZykKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAocnRfcnFfdGhyb3R0bGVkKHJ0X3JxKSkKQEAgLTEyMzksNiArMTI1MSwxMCBAQAogCWludCB0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlpbnQgY3B1ICAgICAgPSB0YXNrX2NwdSh0YXNrKTsKIAorCS8qIE1ha2Ugc3VyZSB0aGUgbWFzayBpcyBpbml0aWFsaXplZCBmaXJzdCAqLworCWlmICh1bmxpa2VseSghbG93ZXN0X21hc2spKQorCQlyZXR1cm4gLTE7CisKIAlpZiAodGFzay0+cnQubnJfY3B1c19hbGxvd2VkID09IDEpCiAJCXJldHVybiAtMTsgLyogTm8gb3RoZXIgdGFyZ2V0cyBwb3NzaWJsZSAqLwogCkBAIC0xNTQ0LDcgKzE1NjAsNyBAQAogc3RhdGljIHZvaWQgcHJlX3NjaGVkdWxlX3J0KHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKIHsKIAkvKiBUcnkgdG8gcHVsbCBSVCB0YXNrcyBoZXJlIGlmIHdlIGxvd2VyIHRoaXMgcnEncyBwcmlvICovCi0JaWYgKHVubGlrZWx5KHJ0X3Rhc2socHJldikpICYmIHJxLT5ydC5oaWdoZXN0X3ByaW8uY3VyciA+IHByZXYtPnByaW8pCisJaWYgKHJxLT5ydC5oaWdoZXN0X3ByaW8uY3VyciA+IHByZXYtPnByaW8pCiAJCXB1bGxfcnRfdGFzayhycSk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCA4NmMzMmI4Li5kN2Y3MGFlIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC04Nyw3ICs4Nyw3IEBACiAJLyoKIAkgKiBUcmFjZXJzIG1heSB3YW50IHRvIGtub3cgYWJvdXQgZXZlbiBpZ25vcmVkIHNpZ25hbHMuCiAJICovCi0JcmV0dXJuICF0cmFjZWhvb2tfY29uc2lkZXJfaWdub3JlZF9zaWduYWwodCwgc2lnKTsKKwlyZXR1cm4gIXQtPnB0cmFjZTsKIH0KIAogLyoKQEAgLTEyNCw3ICsxMjQsNyBAQAogCiBzdGF0aWMgaW50IHJlY2FsY19zaWdwZW5kaW5nX3RzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCiB7Ci0JaWYgKCh0LT5ncm91cF9zdG9wICYgR1JPVVBfU1RPUF9QRU5ESU5HKSB8fAorCWlmICgodC0+am9iY3RsICYgSk9CQ1RMX1BFTkRJTkdfTUFTSykgfHwKIAkgICAgUEVORElORygmdC0+cGVuZGluZywgJnQtPmJsb2NrZWQpIHx8CiAJICAgIFBFTkRJTkcoJnQtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcsICZ0LT5ibG9ja2VkKSkgewogCQlzZXRfdHNrX3RocmVhZF9mbGFnKHQsIFRJRl9TSUdQRU5ESU5HKTsKQEAgLTE1MCw5ICsxNTAsNyBAQAogCiB2b2lkIHJlY2FsY19zaWdwZW5kaW5nKHZvaWQpCiB7Ci0JaWYgKHVubGlrZWx5KHRyYWNlaG9va19mb3JjZV9zaWdwZW5kaW5nKCkpKQotCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1NJR1BFTkRJTkcpOwotCWVsc2UgaWYgKCFyZWNhbGNfc2lncGVuZGluZ190c2soY3VycmVudCkgJiYgIWZyZWV6aW5nKGN1cnJlbnQpKQorCWlmICghcmVjYWxjX3NpZ3BlbmRpbmdfdHNrKGN1cnJlbnQpICYmICFmcmVlemluZyhjdXJyZW50KSkKIAkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NJR1BFTkRJTkcpOwogCiB9CkBAIC0yMjQsNDcgKzIyMiw5MyBAQAogfQogCiAvKioKLSAqIHRhc2tfY2xlYXJfZ3JvdXBfc3RvcF90cmFwcGluZyAtIGNsZWFyIGdyb3VwIHN0b3AgdHJhcHBpbmcgYml0CisgKiB0YXNrX3NldF9qb2JjdGxfcGVuZGluZyAtIHNldCBqb2JjdGwgcGVuZGluZyBiaXRzCisgKiBAdGFzazogdGFyZ2V0IHRhc2sKKyAqIEBtYXNrOiBwZW5kaW5nIGJpdHMgdG8gc2V0CisgKgorICogQ2xlYXIgQG1hc2sgZnJvbSBAdGFzay0+am9iY3RsLiAgQG1hc2sgbXVzdCBiZSBzdWJzZXQgb2YKKyAqICVKT0JDVExfUEVORElOR19NQVNLIHwgJUpPQkNUTF9TVE9QX0NPTlNVTUUgfCAlSk9CQ1RMX1NUT1BfU0lHTUFTSyB8CisgKiAlSk9CQ1RMX1RSQVBQSU5HLiAgSWYgc3RvcCBzaWdubyBpcyBiZWluZyBzZXQsIHRoZSBleGlzdGluZyBzaWdubyBpcworICogY2xlYXJlZC4gIElmIEB0YXNrIGlzIGFscmVhZHkgYmVpbmcga2lsbGVkIG9yIGV4aXRpbmcsIHRoaXMgZnVuY3Rpb24KKyAqIGJlY29tZXMgbm9vcC4KKyAqCisgKiBDT05URVhUOgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBAdGFzay0+c2lnaGFuZC0+c2lnbG9jayBoZWxkLgorICoKKyAqIFJFVFVSTlM6CisgKiAldHJ1ZSBpZiBAbWFzayBpcyBzZXQsICVmYWxzZSBpZiBtYWRlIG5vb3AgYmVjYXVzZSBAdGFzayB3YXMgZHlpbmcuCisgKi8KK2Jvb2wgdGFza19zZXRfam9iY3RsX3BlbmRpbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwlCVUdfT04obWFzayAmIH4oSk9CQ1RMX1BFTkRJTkdfTUFTSyB8IEpPQkNUTF9TVE9QX0NPTlNVTUUgfAorCQkJSk9CQ1RMX1NUT1BfU0lHTUFTSyB8IEpPQkNUTF9UUkFQUElORykpOworCUJVR19PTigobWFzayAmIEpPQkNUTF9UUkFQUElORykgJiYgIShtYXNrICYgSk9CQ1RMX1BFTkRJTkdfTUFTSykpOworCisJaWYgKHVubGlrZWx5KGZhdGFsX3NpZ25hbF9wZW5kaW5nKHRhc2spIHx8ICh0YXNrLT5mbGFncyAmIFBGX0VYSVRJTkcpKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKG1hc2sgJiBKT0JDVExfU1RPUF9TSUdNQVNLKQorCQl0YXNrLT5qb2JjdGwgJj0gfkpPQkNUTF9TVE9QX1NJR01BU0s7CisKKwl0YXNrLT5qb2JjdGwgfD0gbWFzazsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiB0YXNrX2NsZWFyX2pvYmN0bF90cmFwcGluZyAtIGNsZWFyIGpvYmN0bCB0cmFwcGluZyBiaXQKICAqIEB0YXNrOiB0YXJnZXQgdGFzawogICoKLSAqIElmIEdST1VQX1NUT1BfVFJBUFBJTkcgaXMgc2V0LCBhIHB0cmFjZXIgaXMgd2FpdGluZyBmb3IgdXMuICBDbGVhciBpdAotICogYW5kIHdha2UgdXAgdGhlIHB0cmFjZXIuICBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCBhbnkgZnVydGhlciBsb2NraW5nLgotICogQHRhc2stPnNpZ2xvY2sgZ3VhcmFudGVlcyB0aGF0IEB0YXNrLT5wYXJlbnQgcG9pbnRzIHRvIHRoZSBwdHJhY2VyLgorICogSWYgSk9CQ1RMX1RSQVBQSU5HIGlzIHNldCwgYSBwdHJhY2VyIGlzIHdhaXRpbmcgZm9yIHVzIHRvIGVudGVyIFRSQUNFRC4KKyAqIENsZWFyIGl0IGFuZCB3YWtlIHVwIHRoZSBwdHJhY2VyLiAgTm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgYW55IGZ1cnRoZXIKKyAqIGxvY2tpbmcuICBAdGFzay0+c2lnbG9jayBndWFyYW50ZWVzIHRoYXQgQHRhc2stPnBhcmVudCBwb2ludHMgdG8gdGhlCisgKiBwdHJhY2VyLgogICoKICAqIENPTlRFWFQ6CiAgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIEB0YXNrLT5zaWdoYW5kLT5zaWdsb2NrIGhlbGQuCiAgKi8KLXN0YXRpYyB2b2lkIHRhc2tfY2xlYXJfZ3JvdXBfc3RvcF90cmFwcGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit2b2lkIHRhc2tfY2xlYXJfam9iY3RsX3RyYXBwaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlpZiAodW5saWtlbHkodGFzay0+Z3JvdXBfc3RvcCAmIEdST1VQX1NUT1BfVFJBUFBJTkcpKSB7Ci0JCXRhc2stPmdyb3VwX3N0b3AgJj0gfkdST1VQX1NUT1BfVFJBUFBJTkc7Ci0JCV9fd2FrZV91cF9zeW5jX2tleSgmdGFzay0+cGFyZW50LT5zaWduYWwtPndhaXRfY2hsZGV4aXQsCi0JCQkJICAgVEFTS19VTklOVEVSUlVQVElCTEUsIDEsIHRhc2spOworCWlmICh1bmxpa2VseSh0YXNrLT5qb2JjdGwgJiBKT0JDVExfVFJBUFBJTkcpKSB7CisJCXRhc2stPmpvYmN0bCAmPSB+Sk9CQ1RMX1RSQVBQSU5HOworCQl3YWtlX3VwX2JpdCgmdGFzay0+am9iY3RsLCBKT0JDVExfVFJBUFBJTkdfQklUKTsKIAl9CiB9CiAKIC8qKgotICogdGFza19jbGVhcl9ncm91cF9zdG9wX3BlbmRpbmcgLSBjbGVhciBwZW5kaW5nIGdyb3VwIHN0b3AKKyAqIHRhc2tfY2xlYXJfam9iY3RsX3BlbmRpbmcgLSBjbGVhciBqb2JjdGwgcGVuZGluZyBiaXRzCiAgKiBAdGFzazogdGFyZ2V0IHRhc2sKKyAqIEBtYXNrOiBwZW5kaW5nIGJpdHMgdG8gY2xlYXIKICAqCi0gKiBDbGVhciBncm91cCBzdG9wIHN0YXRlcyBmb3IgQHRhc2suCisgKiBDbGVhciBAbWFzayBmcm9tIEB0YXNrLT5qb2JjdGwuICBAbWFzayBtdXN0IGJlIHN1YnNldCBvZgorICogJUpPQkNUTF9QRU5ESU5HX01BU0suICBJZiAlSk9CQ1RMX1NUT1BfUEVORElORyBpcyBiZWluZyBjbGVhcmVkLCBvdGhlcgorICogU1RPUCBiaXRzIGFyZSBjbGVhcmVkIHRvZ2V0aGVyLgorICoKKyAqIElmIGNsZWFyaW5nIG9mIEBtYXNrIGxlYXZlcyBubyBzdG9wIG9yIHRyYXAgcGVuZGluZywgdGhpcyBmdW5jdGlvbiBjYWxscworICogdGFza19jbGVhcl9qb2JjdGxfdHJhcHBpbmcoKS4KICAqCiAgKiBDT05URVhUOgogICogTXVzdCBiZSBjYWxsZWQgd2l0aCBAdGFzay0+c2lnaGFuZC0+c2lnbG9jayBoZWxkLgogICovCi12b2lkIHRhc2tfY2xlYXJfZ3JvdXBfc3RvcF9wZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3ZvaWQgdGFza19jbGVhcl9qb2JjdGxfcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGludCBtYXNrKQogewotCXRhc2stPmdyb3VwX3N0b3AgJj0gfihHUk9VUF9TVE9QX1BFTkRJTkcgfCBHUk9VUF9TVE9QX0NPTlNVTUUgfAotCQkJICAgICAgR1JPVVBfU1RPUF9ERVFVRVVFRCk7CisJQlVHX09OKG1hc2sgJiB+Sk9CQ1RMX1BFTkRJTkdfTUFTSyk7CisKKwlpZiAobWFzayAmIEpPQkNUTF9TVE9QX1BFTkRJTkcpCisJCW1hc2sgfD0gSk9CQ1RMX1NUT1BfQ09OU1VNRSB8IEpPQkNUTF9TVE9QX0RFUVVFVUVEOworCisJdGFzay0+am9iY3RsICY9IH5tYXNrOworCisJaWYgKCEodGFzay0+am9iY3RsICYgSk9CQ1RMX1BFTkRJTkdfTUFTSykpCisJCXRhc2tfY2xlYXJfam9iY3RsX3RyYXBwaW5nKHRhc2spOwogfQogCiAvKioKICAqIHRhc2tfcGFydGljaXBhdGVfZ3JvdXBfc3RvcCAtIHBhcnRpY2lwYXRlIGluIGEgZ3JvdXAgc3RvcAogICogQHRhc2s6IHRhc2sgcGFydGljaXBhdGluZyBpbiBhIGdyb3VwIHN0b3AKICAqCi0gKiBAdGFzayBoYXMgR1JPVVBfU1RPUF9QRU5ESU5HIHNldCBhbmQgaXMgcGFydGljaXBhdGluZyBpbiBhIGdyb3VwIHN0b3AuCisgKiBAdGFzayBoYXMgJUpPQkNUTF9TVE9QX1BFTkRJTkcgc2V0IGFuZCBpcyBwYXJ0aWNpcGF0aW5nIGluIGEgZ3JvdXAgc3RvcC4KICAqIEdyb3VwIHN0b3Agc3RhdGVzIGFyZSBjbGVhcmVkIGFuZCB0aGUgZ3JvdXAgc3RvcCBjb3VudCBpcyBjb25zdW1lZCBpZgotICogJUdST1VQX1NUT1BfQ09OU1VNRSB3YXMgc2V0LiAgSWYgdGhlIGNvbnN1bXB0aW9uIGNvbXBsZXRlcyB0aGUgZ3JvdXAKKyAqICVKT0JDVExfU1RPUF9DT05TVU1FIHdhcyBzZXQuICBJZiB0aGUgY29uc3VtcHRpb24gY29tcGxldGVzIHRoZSBncm91cAogICogc3RvcCwgdGhlIGFwcHJvcHJpYXRlICVTSUdOQUxfKiBmbGFncyBhcmUgc2V0LgogICoKICAqIENPTlRFWFQ6CkBAIC0yNzcsMTEgKzMyMSwxMSBAQAogc3RhdGljIGJvb2wgdGFza19wYXJ0aWNpcGF0ZV9ncm91cF9zdG9wKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnID0gdGFzay0+c2lnbmFsOwotCWJvb2wgY29uc3VtZSA9IHRhc2stPmdyb3VwX3N0b3AgJiBHUk9VUF9TVE9QX0NPTlNVTUU7CisJYm9vbCBjb25zdW1lID0gdGFzay0+am9iY3RsICYgSk9CQ1RMX1NUT1BfQ09OU1VNRTsKIAotCVdBUk5fT05fT05DRSghKHRhc2stPmdyb3VwX3N0b3AgJiBHUk9VUF9TVE9QX1BFTkRJTkcpKTsKKwlXQVJOX09OX09OQ0UoISh0YXNrLT5qb2JjdGwgJiBKT0JDVExfU1RPUF9QRU5ESU5HKSk7CiAKLQl0YXNrX2NsZWFyX2dyb3VwX3N0b3BfcGVuZGluZyh0YXNrKTsKKwl0YXNrX2NsZWFyX2pvYmN0bF9wZW5kaW5nKHRhc2ssIEpPQkNUTF9TVE9QX1BFTkRJTkcpOwogCiAJaWYgKCFjb25zdW1lKQogCQlyZXR1cm4gZmFsc2U7CkBAIC00NDksNyArNDkzLDggQEAKIAkJcmV0dXJuIDE7CiAJaWYgKGhhbmRsZXIgIT0gU0lHX0lHTiAmJiBoYW5kbGVyICE9IFNJR19ERkwpCiAJCXJldHVybiAwOwotCXJldHVybiAhdHJhY2Vob29rX2NvbnNpZGVyX2ZhdGFsX3NpZ25hbCh0c2ssIHNpZyk7CisJLyogaWYgcHRyYWNlZCwgbGV0IHRoZSB0cmFjZXIgZGV0ZXJtaW5lICovCisJcmV0dXJuICF0c2stPnB0cmFjZTsKIH0KIAogLyoKQEAgLTYwNCw3ICs2NDksNyBAQAogCQkgKiBpcyB0byBhbGVydCBzdG9wLXNpZ25hbCBwcm9jZXNzaW5nIGNvZGUgd2hlbiBhbm90aGVyCiAJCSAqIHByb2Nlc3NvciBoYXMgY29tZSBhbG9uZyBhbmQgY2xlYXJlZCB0aGUgZmxhZy4KIAkJICovCi0JCWN1cnJlbnQtPmdyb3VwX3N0b3AgfD0gR1JPVVBfU1RPUF9ERVFVRVVFRDsKKwkJY3VycmVudC0+am9iY3RsIHw9IEpPQkNUTF9TVE9QX0RFUVVFVUVEOwogCX0KIAlpZiAoKGluZm8tPnNpX2NvZGUgJiBfX1NJX01BU0spID09IF9fU0lfVElNRVIgJiYgaW5mby0+c2lfc3lzX3ByaXZhdGUpIHsKIAkJLyoKQEAgLTc3Myw2ICs4MTgsMzIgQEAKIAlyZXR1cm4gc2VjdXJpdHlfdGFza19raWxsKHQsIGluZm8sIHNpZywgMCk7CiB9CiAKKy8qKgorICogcHRyYWNlX3RyYXBfbm90aWZ5IC0gc2NoZWR1bGUgdHJhcCB0byBub3RpZnkgcHRyYWNlcgorICogQHQ6IHRyYWNlZSB3YW50aW5nIHRvIG5vdGlmeSB0cmFjZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNjaGVkdWxlcyBzdGlja3kgcHRyYWNlIHRyYXAgd2hpY2ggaXMgY2xlYXJlZCBvbiB0aGUgbmV4dAorICogVFJBUF9TVE9QIHRvIG5vdGlmeSBwdHJhY2VyIG9mIGFuIGV2ZW50LiAgQHQgbXVzdCBoYXZlIGJlZW4gc2VpemVkIGJ5CisgKiBwdHJhY2VyLgorICoKKyAqIElmIEB0IGlzIHJ1bm5pbmcsIFNUT1AgdHJhcCB3aWxsIGJlIHRha2VuLiAgSWYgdHJhcHBlZCBmb3IgU1RPUCBhbmQKKyAqIHB0cmFjZXIgaXMgbGlzdGVuaW5nIGZvciBldmVudHMsIHRyYWNlZSBpcyB3b2tlbiB1cCBzbyB0aGF0IGl0IGNhbgorICogcmUtdHJhcCBmb3IgdGhlIG5ldyBldmVudC4gIElmIHRyYXBwZWQgb3RoZXJ3aXNlLCBTVE9QIHRyYXAgd2lsbCBiZQorICogZXZlbnR1YWxseSB0YWtlbiB3aXRob3V0IHJldHVybmluZyB0byB1c2VybGFuZCBhZnRlciB0aGUgZXhpc3RpbmcgdHJhcHMKKyAqIGFyZSBmaW5pc2hlZCBieSBQVFJBQ0VfQ09OVC4KKyAqCisgKiBDT05URVhUOgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBAdGFzay0+c2lnaGFuZC0+c2lnbG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBwdHJhY2VfdHJhcF9ub3RpZnkoc3RydWN0IHRhc2tfc3RydWN0ICp0KQoreworCVdBUk5fT05fT05DRSghKHQtPnB0cmFjZSAmIFBUX1NFSVpFRCkpOworCWFzc2VydF9zcGluX2xvY2tlZCgmdC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwl0YXNrX3NldF9qb2JjdGxfcGVuZGluZyh0LCBKT0JDVExfVFJBUF9OT1RJRlkpOworCXNpZ25hbF93YWtlX3VwKHQsIHQtPmpvYmN0bCAmIEpPQkNUTF9MSVNURU5JTkcpOworfQorCiAvKgogICogSGFuZGxlIG1hZ2ljIHByb2Nlc3Mtd2lkZSBlZmZlY3RzIG9mIHN0b3AvY29udGludWUgc2lnbmFscy4gVW5saWtlCiAgKiB0aGUgc2lnbmFsIGFjdGlvbnMsIHRoZXNlIGhhcHBlbiBpbW1lZGlhdGVseSBhdCBzaWduYWwtZ2VuZXJhdGlvbgpAQCAtODA5LDkgKzg4MCwxMiBAQAogCQlybV9mcm9tX3F1ZXVlKFNJR19LRVJORUxfU1RPUF9NQVNLLCAmc2lnbmFsLT5zaGFyZWRfcGVuZGluZyk7CiAJCXQgPSBwOwogCQlkbyB7Ci0JCQl0YXNrX2NsZWFyX2dyb3VwX3N0b3BfcGVuZGluZyh0KTsKKwkJCXRhc2tfY2xlYXJfam9iY3RsX3BlbmRpbmcodCwgSk9CQ1RMX1NUT1BfUEVORElORyk7CiAJCQlybV9mcm9tX3F1ZXVlKFNJR19LRVJORUxfU1RPUF9NQVNLLCAmdC0+cGVuZGluZyk7Ci0JCQl3YWtlX3VwX3N0YXRlKHQsIF9fVEFTS19TVE9QUEVEKTsKKwkJCWlmIChsaWtlbHkoISh0LT5wdHJhY2UgJiBQVF9TRUlaRUQpKSkKKwkJCQl3YWtlX3VwX3N0YXRlKHQsIF9fVEFTS19TVE9QUEVEKTsKKwkJCWVsc2UKKwkJCQlwdHJhY2VfdHJhcF9ub3RpZnkodCk7CiAJCX0gd2hpbGVfZWFjaF90aHJlYWQocCwgdCk7CiAKIAkJLyoKQEAgLTkwOCw4ICs5ODIsNyBAQAogCWlmIChzaWdfZmF0YWwocCwgc2lnKSAmJgogCSAgICAhKHNpZ25hbC0+ZmxhZ3MgJiAoU0lHTkFMX1VOS0lMTEFCTEUgfCBTSUdOQUxfR1JPVVBfRVhJVCkpICYmCiAJICAgICFzaWdpc21lbWJlcigmdC0+cmVhbF9ibG9ja2VkLCBzaWcpICYmCi0JICAgIChzaWcgPT0gU0lHS0lMTCB8fAotCSAgICAgIXRyYWNlaG9va19jb25zaWRlcl9mYXRhbF9zaWduYWwodCwgc2lnKSkpIHsKKwkgICAgKHNpZyA9PSBTSUdLSUxMIHx8ICF0LT5wdHJhY2UpKSB7CiAJCS8qCiAJCSAqIFRoaXMgc2lnbmFsIHdpbGwgYmUgZmF0YWwgdG8gdGhlIHdob2xlIGdyb3VwLgogCQkgKi8KQEAgLTkyNSw3ICs5OTgsNyBAQAogCQkJc2lnbmFsLT5ncm91cF9zdG9wX2NvdW50ID0gMDsKIAkJCXQgPSBwOwogCQkJZG8gewotCQkJCXRhc2tfY2xlYXJfZ3JvdXBfc3RvcF9wZW5kaW5nKHQpOworCQkJCXRhc2tfY2xlYXJfam9iY3RsX3BlbmRpbmcodCwgSk9CQ1RMX1BFTkRJTkdfTUFTSyk7CiAJCQkJc2lnYWRkc2V0KCZ0LT5wZW5kaW5nLnNpZ25hbCwgU0lHS0lMTCk7CiAJCQkJc2lnbmFsX3dha2VfdXAodCwgMSk7CiAJCQl9IHdoaWxlX2VhY2hfdGhyZWFkKHAsIHQpOwpAQCAtMTE2MCw3ICsxMjMzLDcgQEAKIAlwLT5zaWduYWwtPmdyb3VwX3N0b3BfY291bnQgPSAwOwogCiAJd2hpbGVfZWFjaF90aHJlYWQocCwgdCkgewotCQl0YXNrX2NsZWFyX2dyb3VwX3N0b3BfcGVuZGluZyh0KTsKKwkJdGFza19jbGVhcl9qb2JjdGxfcGVuZGluZyh0LCBKT0JDVExfUEVORElOR19NQVNLKTsKIAkJY291bnQrKzsKIAogCQkvKiBEb24ndCBib3RoZXIgd2l0aCBhbHJlYWR5IGRlYWQgdGhyZWFkcyAqLwpAQCAtMTE3OCwxOCArMTI1MSwyNSBAQAogewogCXN0cnVjdCBzaWdoYW5kX3N0cnVjdCAqc2lnaGFuZDsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKDs7KSB7CisJCWxvY2FsX2lycV9zYXZlKCpmbGFncyk7CisJCXJjdV9yZWFkX2xvY2soKTsKIAkJc2lnaGFuZCA9IHJjdV9kZXJlZmVyZW5jZSh0c2stPnNpZ2hhbmQpOwotCQlpZiAodW5saWtlbHkoc2lnaGFuZCA9PSBOVUxMKSkKKwkJaWYgKHVubGlrZWx5KHNpZ2hhbmQgPT0gTlVMTCkpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoKmZsYWdzKTsKIAkJCWJyZWFrOworCQl9CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNpZ2hhbmQtPnNpZ2xvY2ssICpmbGFncyk7Ci0JCWlmIChsaWtlbHkoc2lnaGFuZCA9PSB0c2stPnNpZ2hhbmQpKQorCQlzcGluX2xvY2soJnNpZ2hhbmQtPnNpZ2xvY2spOworCQlpZiAobGlrZWx5KHNpZ2hhbmQgPT0gdHNrLT5zaWdoYW5kKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlicmVhazsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2lnaGFuZC0+c2lnbG9jaywgKmZsYWdzKTsKKwkJfQorCQlzcGluX3VubG9jaygmc2lnaGFuZC0+c2lnbG9jayk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlsb2NhbF9pcnFfcmVzdG9yZSgqZmxhZ3MpOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBzaWdoYW5kOwogfQpAQCAtMTUwNCwyMiArMTU4NCwyMiBAQAogICogTGV0IGEgcGFyZW50IGtub3cgYWJvdXQgdGhlIGRlYXRoIG9mIGEgY2hpbGQuCiAgKiBGb3IgYSBzdG9wcGVkL2NvbnRpbnVlZCBzdGF0dXMgY2hhbmdlLCB1c2UgZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wIGluc3RlYWQuCiAgKgotICogUmV0dXJucyAtMSBpZiBvdXIgcGFyZW50IGlnbm9yZWQgdXMgYW5kIHNvIHdlJ3ZlIHN3aXRjaGVkIHRvCi0gKiBzZWxmLXJlYXBpbmcsIG9yIGVsc2UgQHNpZy4KKyAqIFJldHVybnMgdHJ1ZSBpZiBvdXIgcGFyZW50IGlnbm9yZWQgdXMgYW5kIHNvIHdlJ3ZlIHN3aXRjaGVkIHRvCisgKiBzZWxmLXJlYXBpbmcuCiAgKi8KLWludCBkb19ub3RpZnlfcGFyZW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgc2lnKQorYm9vbCBkb19ub3RpZnlfcGFyZW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgc2lnKQogewogCXN0cnVjdCBzaWdpbmZvIGluZm87CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKnBzaWc7Ci0JaW50IHJldCA9IHNpZzsKKwlib29sIGF1dG9yZWFwID0gZmFsc2U7CiAKIAlCVUdfT04oc2lnID09IC0xKTsKIAogIAkvKiBkb19ub3RpZnlfcGFyZW50X2NsZHN0b3Agc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQgaW5zdGVhZC4gICovCiAgCUJVR19PTih0YXNrX2lzX3N0b3BwZWRfb3JfdHJhY2VkKHRzaykpOwogCi0JQlVHX09OKCF0YXNrX3B0cmFjZSh0c2spICYmCisJQlVHX09OKCF0c2stPnB0cmFjZSAmJgogCSAgICAgICAodHNrLT5ncm91cF9sZWFkZXIgIT0gdHNrIHx8ICF0aHJlYWRfZ3JvdXBfZW1wdHkodHNrKSkpOwogCiAJaW5mby5zaV9zaWdubyA9IHNpZzsKQEAgLTE1NTgsNyArMTYzOCw3IEBACiAKIAlwc2lnID0gdHNrLT5wYXJlbnQtPnNpZ2hhbmQ7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBzaWctPnNpZ2xvY2ssIGZsYWdzKTsKLQlpZiAoIXRhc2tfcHRyYWNlKHRzaykgJiYgc2lnID09IFNJR0NITEQgJiYKKwlpZiAoIXRzay0+cHRyYWNlICYmIHNpZyA9PSBTSUdDSExEICYmCiAJICAgIChwc2lnLT5hY3Rpb25bU0lHQ0hMRC0xXS5zYS5zYV9oYW5kbGVyID09IFNJR19JR04gfHwKIAkgICAgIChwc2lnLT5hY3Rpb25bU0lHQ0hMRC0xXS5zYS5zYV9mbGFncyAmIFNBX05PQ0xEV0FJVCkpKSB7CiAJCS8qCkBAIC0xNTc2LDE2ICsxNjU2LDE2IEBACiAJCSAqIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQ6IHdlIGRvIChpZiB5b3UgZG9uJ3Qgd2FudAogCQkgKiBpdCwganVzdCB1c2UgU0lHX0lHTiBpbnN0ZWFkKS4KIAkJICovCi0JCXJldCA9IHRzay0+ZXhpdF9zaWduYWwgPSAtMTsKKwkJYXV0b3JlYXAgPSB0cnVlOwogCQlpZiAocHNpZy0+YWN0aW9uW1NJR0NITEQtMV0uc2Euc2FfaGFuZGxlciA9PSBTSUdfSUdOKQotCQkJc2lnID0gLTE7CisJCQlzaWcgPSAwOwogCX0KLQlpZiAodmFsaWRfc2lnbmFsKHNpZykgJiYgc2lnID4gMCkKKwlpZiAodmFsaWRfc2lnbmFsKHNpZykgJiYgc2lnKQogCQlfX2dyb3VwX3NlbmRfc2lnX2luZm8oc2lnLCAmaW5mbywgdHNrLT5wYXJlbnQpOwogCV9fd2FrZV91cF9wYXJlbnQodHNrLCB0c2stPnBhcmVudCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHNpZy0+c2lnbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gYXV0b3JlYXA7CiB9CiAKIC8qKgpAQCAtMTY1OCw3ICsxNzM4LDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgbWF5X3B0cmFjZV9zdG9wKHZvaWQpCiB7Ci0JaWYgKCFsaWtlbHkodGFza19wdHJhY2UoY3VycmVudCkpKQorCWlmICghbGlrZWx5KGN1cnJlbnQtPnB0cmFjZSkpCiAJCXJldHVybiAwOwogCS8qCiAJICogQXJlIHdlIGluIHRoZSBtaWRkbGUgb2YgZG9fY29yZWR1bXA/CkBAIC0xNjg3LDE1ICsxNzY3LDYgQEAKIH0KIAogLyoKLSAqIFRlc3Qgd2hldGhlciB0aGUgdGFyZ2V0IHRhc2sgb2YgdGhlIHVzdWFsIGNsZHN0b3Agbm90aWZpY2F0aW9uIC0gdGhlCi0gKiByZWFsX3BhcmVudCBvZiBAY2hpbGQgLSBpcyBpbiB0aGUgc2FtZSBncm91cCBhcyB0aGUgcHRyYWNlci4KLSAqLwotc3RhdGljIGJvb2wgcmVhbF9wYXJlbnRfaXNfcHRyYWNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQotewotCXJldHVybiBzYW1lX3RocmVhZF9ncm91cChjaGlsZC0+cGFyZW50LCBjaGlsZC0+cmVhbF9wYXJlbnQpOwotfQotCi0vKgogICogVGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIGN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2sgaGVsZC4KICAqCiAgKiBUaGlzIHNob3VsZCBiZSB0aGUgcGF0aCBmb3IgYWxsIHB0cmFjZSBzdG9wcy4KQEAgLTE3MzIsMzEgKzE4MDMsMzQgQEAKIAl9CiAKIAkvKgotCSAqIElmIEB3aHkgaXMgQ0xEX1NUT1BQRUQsIHdlJ3JlIHRyYXBwaW5nIHRvIHBhcnRpY2lwYXRlIGluIGEgZ3JvdXAKLQkgKiBzdG9wLiAgRG8gdGhlIGJvb2trZWVwaW5nLiAgTm90ZSB0aGF0IGlmIFNJR0NPTlQgd2FzIGRlbGlldmVyZWQKLQkgKiB3aGlsZSBzaWdsb2NrIHdhcyByZWxlYXNlZCBmb3IgdGhlIGFyY2ggaG9vaywgUEVORElORyBjb3VsZCBiZQotCSAqIGNsZWFyIG5vdy4gIFdlIGFjdCBhcyBpZiBTSUdDT05UIGlzIHJlY2VpdmVkIGFmdGVyIFRBU0tfVFJBQ0VECi0JICogaXMgZW50ZXJlZCAtIGlnbm9yZSBpdC4KKwkgKiBXZSdyZSBjb21taXR0aW5nIHRvIHRyYXBwaW5nLiAgVFJBQ0VEIHNob3VsZCBiZSB2aXNpYmxlIGJlZm9yZQorCSAqIFRSQVBQSU5HIGlzIGNsZWFyZWQ7IG90aGVyd2lzZSwgdGhlIHRyYWNlciBtaWdodCBmYWlsIGRvX3dhaXQoKS4KKwkgKiBBbHNvLCB0cmFuc2l0aW9uIHRvIFRSQUNFRCBhbmQgdXBkYXRlcyB0byAtPmpvYmN0bCBzaG91bGQgYmUKKwkgKiBhdG9taWMgd2l0aCByZXNwZWN0IHRvIHNpZ2xvY2sgYW5kIHNob3VsZCBiZSBkb25lIGFmdGVyIHRoZSBhcmNoCisJICogaG9vayBhcyBzaWdsb2NrIGlzIHJlbGVhc2VkIGFuZCByZWdyYWJiZWQgYWNyb3NzIGl0LgogCSAqLwotCWlmICh3aHkgPT0gQ0xEX1NUT1BQRUQgJiYgKGN1cnJlbnQtPmdyb3VwX3N0b3AgJiBHUk9VUF9TVE9QX1BFTkRJTkcpKQotCQlnc3RvcF9kb25lID0gdGFza19wYXJ0aWNpcGF0ZV9ncm91cF9zdG9wKGN1cnJlbnQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVFJBQ0VEKTsKIAogCWN1cnJlbnQtPmxhc3Rfc2lnaW5mbyA9IGluZm87CiAJY3VycmVudC0+ZXhpdF9jb2RlID0gZXhpdF9jb2RlOwogCiAJLyoKLQkgKiBUUkFDRUQgc2hvdWxkIGJlIHZpc2libGUgYmVmb3JlIFRSQVBQSU5HIGlzIGNsZWFyZWQ7IG90aGVyd2lzZSwKLQkgKiB0aGUgdHJhY2VyIG1pZ2h0IGZhaWwgZG9fd2FpdCgpLgorCSAqIElmIEB3aHkgaXMgQ0xEX1NUT1BQRUQsIHdlJ3JlIHRyYXBwaW5nIHRvIHBhcnRpY2lwYXRlIGluIGEgZ3JvdXAKKwkgKiBzdG9wLiAgRG8gdGhlIGJvb2trZWVwaW5nLiAgTm90ZSB0aGF0IGlmIFNJR0NPTlQgd2FzIGRlbGlldmVyZWQKKwkgKiBhY3Jvc3Mgc2lnbG9jayByZWxvY2tzIHNpbmNlIElOVEVSUlVQVCB3YXMgc2NoZWR1bGVkLCBQRU5ESU5HCisJICogY291bGQgYmUgY2xlYXIgbm93LiAgV2UgYWN0IGFzIGlmIFNJR0NPTlQgaXMgcmVjZWl2ZWQgYWZ0ZXIKKwkgKiBUQVNLX1RSQUNFRCBpcyBlbnRlcmVkIC0gaWdub3JlIGl0LgogCSAqLwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVFJBQ0VEKTsKKwlpZiAod2h5ID09IENMRF9TVE9QUEVEICYmIChjdXJyZW50LT5qb2JjdGwgJiBKT0JDVExfU1RPUF9QRU5ESU5HKSkKKwkJZ3N0b3BfZG9uZSA9IHRhc2tfcGFydGljaXBhdGVfZ3JvdXBfc3RvcChjdXJyZW50KTsKIAotCS8qCi0JICogV2UncmUgY29tbWl0dGluZyB0byB0cmFwcGluZy4gIENsZWFyaW5nIEdST1VQX1NUT1BfVFJBUFBJTkcgYW5kCi0JICogdHJhbnNpdGlvbiB0byBUQVNLX1RSQUNFRCBzaG91bGQgYmUgYXRvbWljIHdpdGggcmVzcGVjdCB0bwotCSAqIHNpZ2xvY2suICBUaGlzIGhzb3VsZCBiZSBkb25lIGFmdGVyIHRoZSBhcmNoIGhvb2sgYXMgc2lnbG9jayBpcwotCSAqIHJlbGVhc2VkIGFuZCByZWdyYWJiZWQgYWNyb3NzIGl0LgotCSAqLwotCXRhc2tfY2xlYXJfZ3JvdXBfc3RvcF90cmFwcGluZyhjdXJyZW50KTsKKwkvKiBhbnkgdHJhcCBjbGVhcnMgcGVuZGluZyBTVE9QIHRyYXAsIFNUT1AgdHJhcCBjbGVhcnMgTk9USUZZICovCisJdGFza19jbGVhcl9qb2JjdGxfcGVuZGluZyhjdXJyZW50LCBKT0JDVExfVFJBUF9TVE9QKTsKKwlpZiAoaW5mbyAmJiBpbmZvLT5zaV9jb2RlID4+IDggPT0gUFRSQUNFX0VWRU5UX1NUT1ApCisJCXRhc2tfY2xlYXJfam9iY3RsX3BlbmRpbmcoY3VycmVudCwgSk9CQ1RMX1RSQVBfTk9USUZZKTsKKworCS8qIGVudGVyaW5nIGEgdHJhcCwgY2xlYXIgVFJBUFBJTkcgKi8KKwl0YXNrX2NsZWFyX2pvYmN0bF90cmFwcGluZyhjdXJyZW50KTsKIAogCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKQEAgLTE3NzIsNyArMTg0Niw3IEBACiAJCSAqIHNlcGFyYXRlbHkgdW5sZXNzIHRoZXkncmUgZ29ubmEgYmUgZHVwbGljYXRlcy4KIAkJICovCiAJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChjdXJyZW50LCB0cnVlLCB3aHkpOwotCQlpZiAoZ3N0b3BfZG9uZSAmJiAhcmVhbF9wYXJlbnRfaXNfcHRyYWNlcihjdXJyZW50KSkKKwkJaWYgKGdzdG9wX2RvbmUgJiYgcHRyYWNlX3JlcGFyZW50ZWQoY3VycmVudCkpCiAJCQlkb19ub3RpZnlfcGFyZW50X2NsZHN0b3AoY3VycmVudCwgZmFsc2UsIHdoeSk7CiAKIAkJLyoKQEAgLTE3OTIsOSArMTg2Niw5IEBACiAJCSAqCiAJCSAqIElmIEBnc3RvcF9kb25lLCB0aGUgcHRyYWNlciB3ZW50IGF3YXkgYmV0d2VlbiBncm91cCBzdG9wCiAJCSAqIGNvbXBsZXRpb24gYW5kIGhlcmUuICBEdXJpbmcgZGV0YWNoLCBpdCB3b3VsZCBoYXZlIHNldAotCQkgKiBHUk9VUF9TVE9QX1BFTkRJTkcgb24gdXMgYW5kIHdlJ2xsIHJlLWVudGVyIFRBU0tfU1RPUFBFRAotCQkgKiBpbiBkb19zaWduYWxfc3RvcCgpIG9uIHJldHVybiwgc28gbm90aWZ5aW5nIHRoZSByZWFsCi0JCSAqIHBhcmVudCBvZiB0aGUgZ3JvdXAgc3RvcCBjb21wbGV0aW9uIGlzIGVub3VnaC4KKwkJICogSk9CQ1RMX1NUT1BfUEVORElORyBvbiB1cyBhbmQgd2UnbGwgcmUtZW50ZXIKKwkJICogVEFTS19TVE9QUEVEIGluIGRvX3NpZ25hbF9zdG9wKCkgb24gcmV0dXJuLCBzbyBub3RpZnlpbmcKKwkJICogdGhlIHJlYWwgcGFyZW50IG9mIHRoZSBncm91cCBzdG9wIGNvbXBsZXRpb24gaXMgZW5vdWdoLgogCQkgKi8KIAkJaWYgKGdzdG9wX2RvbmUpCiAJCQlkb19ub3RpZnlfcGFyZW50X2NsZHN0b3AoY3VycmVudCwgZmFsc2UsIHdoeSk7CkBAIC0xODIwLDYgKzE4OTQsOSBAQAogCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCWN1cnJlbnQtPmxhc3Rfc2lnaW5mbyA9IE5VTEw7CiAKKwkvKiBMSVNURU5JTkcgY2FuIGJlIHNldCBvbmx5IGR1cmluZyBTVE9QIHRyYXBzLCBjbGVhciBpdCAqLworCWN1cnJlbnQtPmpvYmN0bCAmPSB+Sk9CQ1RMX0xJU1RFTklORzsKKwogCS8qCiAJICogUXVldWVkIHNpZ25hbHMgaWdub3JlZCB1cyB3aGlsZSB3ZSB3ZXJlIHN0b3BwZWQgZm9yIHRyYWNpbmcuCiAJICogU28gY2hlY2sgZm9yIGFueSB0aGF0IHdlIHNob3VsZCB0YWtlIGJlZm9yZSByZXN1bWluZyB1c2VyIG1vZGUuCkBAIC0xODI4LDQ0ICsxOTA1LDY2IEBACiAJcmVjYWxjX3NpZ3BlbmRpbmdfdHNrKGN1cnJlbnQpOwogfQogCi12b2lkIHB0cmFjZV9ub3RpZnkoaW50IGV4aXRfY29kZSkKK3N0YXRpYyB2b2lkIHB0cmFjZV9kb19ub3RpZnkoaW50IHNpZ25yLCBpbnQgZXhpdF9jb2RlLCBpbnQgd2h5KQogewogCXNpZ2luZm9fdCBpbmZvOwogCi0JQlVHX09OKChleGl0X2NvZGUgJiAoMHg3ZiB8IH4weGZmZmYpKSAhPSBTSUdUUkFQKTsKLQogCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mIGluZm8pOwotCWluZm8uc2lfc2lnbm8gPSBTSUdUUkFQOworCWluZm8uc2lfc2lnbm8gPSBzaWducjsKIAlpbmZvLnNpX2NvZGUgPSBleGl0X2NvZGU7CiAJaW5mby5zaV9waWQgPSB0YXNrX3BpZF92bnIoY3VycmVudCk7CiAJaW5mby5zaV91aWQgPSBjdXJyZW50X3VpZCgpOwogCiAJLyogTGV0IHRoZSBkZWJ1Z2dlciBydW4uICAqLworCXB0cmFjZV9zdG9wKGV4aXRfY29kZSwgd2h5LCAxLCAmaW5mbyk7Cit9CisKK3ZvaWQgcHRyYWNlX25vdGlmeShpbnQgZXhpdF9jb2RlKQoreworCUJVR19PTigoZXhpdF9jb2RlICYgKDB4N2YgfCB+MHhmZmZmKSkgIT0gU0lHVFJBUCk7CisKIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQlwdHJhY2Vfc3RvcChleGl0X2NvZGUsIENMRF9UUkFQUEVELCAxLCAmaW5mbyk7CisJcHRyYWNlX2RvX25vdGlmeShTSUdUUkFQLCBleGl0X2NvZGUsIENMRF9UUkFQUEVEKTsKIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogfQogCi0vKgotICogVGhpcyBwZXJmb3JtcyB0aGUgc3RvcHBpbmcgZm9yIFNJR1NUT1AgYW5kIG90aGVyIHN0b3Agc2lnbmFscy4KLSAqIFdlIGhhdmUgdG8gc3RvcCBhbGwgdGhyZWFkcyBpbiB0aGUgdGhyZWFkIGdyb3VwLgotICogUmV0dXJucyBub24temVybyBpZiB3ZSd2ZSBhY3R1YWxseSBzdG9wcGVkIGFuZCByZWxlYXNlZCB0aGUgc2lnbG9jay4KLSAqIFJldHVybnMgemVybyBpZiB3ZSBkaWRuJ3Qgc3RvcCBhbmQgc3RpbGwgaG9sZCB0aGUgc2lnbG9jay4KKy8qKgorICogZG9fc2lnbmFsX3N0b3AgLSBoYW5kbGUgZ3JvdXAgc3RvcCBmb3IgU0lHU1RPUCBhbmQgb3RoZXIgc3RvcCBzaWduYWxzCisgKiBAc2lnbnI6IHNpZ25yIGNhdXNpbmcgZ3JvdXAgc3RvcCBpZiBpbml0aWF0aW5nCisgKgorICogSWYgJUpPQkNUTF9TVE9QX1BFTkRJTkcgaXMgbm90IHNldCB5ZXQsIGluaXRpYXRlIGdyb3VwIHN0b3Agd2l0aCBAc2lnbnIKKyAqIGFuZCBwYXJ0aWNpcGF0ZSBpbiBpdC4gIElmIGFscmVhZHkgc2V0LCBwYXJ0aWNpcGF0ZSBpbiB0aGUgZXhpc3RpbmcKKyAqIGdyb3VwIHN0b3AuICBJZiBwYXJ0aWNpcGF0ZWQgaW4gYSBncm91cCBzdG9wIChhbmQgdGh1cyBzbGVwdCksICV0cnVlIGlzCisgKiByZXR1cm5lZCB3aXRoIHNpZ2xvY2sgcmVsZWFzZWQuCisgKgorICogSWYgcHRyYWNlZCwgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGhhbmRsZSBzdG9wIGl0c2VsZi4gIEluc3RlYWQsCisgKiAlSk9CQ1RMX1RSQVBfU1RPUCBpcyBzY2hlZHVsZWQgYW5kICVmYWxzZSBpcyByZXR1cm5lZCB3aXRoIHNpZ2xvY2sKKyAqIHVudG91Y2hlZC4gIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBJTlRFUlJVUFQgdHJhcCBoYW5kbGluZyB0YWtlcworICogcGxhY2VzIGFmdGVyd2FyZHMuCisgKgorICogQ09OVEVYVDoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggQGN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2sgaGVsZCwgd2hpY2ggaXMgcmVsZWFzZWQKKyAqIG9uICV0cnVlIHJldHVybi4KKyAqCisgKiBSRVRVUk5TOgorICogJWZhbHNlIGlmIGdyb3VwIHN0b3AgaXMgYWxyZWFkeSBjYW5jZWxsZWQgb3IgcHRyYWNlIHRyYXAgaXMgc2NoZWR1bGVkLgorICogJXRydWUgaWYgcGFydGljaXBhdGVkIGluIGdyb3VwIHN0b3AuCiAgKi8KLXN0YXRpYyBpbnQgZG9fc2lnbmFsX3N0b3AoaW50IHNpZ25yKQorc3RhdGljIGJvb2wgZG9fc2lnbmFsX3N0b3AoaW50IHNpZ25yKQorCV9fcmVsZWFzZXMoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spCiB7CiAJc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZyA9IGN1cnJlbnQtPnNpZ25hbDsKIAotCWlmICghKGN1cnJlbnQtPmdyb3VwX3N0b3AgJiBHUk9VUF9TVE9QX1BFTkRJTkcpKSB7Ci0JCXVuc2lnbmVkIGludCBnc3RvcCA9IEdST1VQX1NUT1BfUEVORElORyB8IEdST1VQX1NUT1BfQ09OU1VNRTsKKwlpZiAoIShjdXJyZW50LT5qb2JjdGwgJiBKT0JDVExfU1RPUF9QRU5ESU5HKSkgeworCQl1bnNpZ25lZCBpbnQgZ3N0b3AgPSBKT0JDVExfU1RPUF9QRU5ESU5HIHwgSk9CQ1RMX1NUT1BfQ09OU1VNRTsKIAkJc3RydWN0IHRhc2tfc3RydWN0ICp0OwogCi0JCS8qIHNpZ25yIHdpbGwgYmUgcmVjb3JkZWQgaW4gdGFzay0+Z3JvdXBfc3RvcCBmb3IgcmV0cmllcyAqLwotCQlXQVJOX09OX09OQ0Uoc2lnbnIgJiB+R1JPVVBfU1RPUF9TSUdNQVNLKTsKKwkJLyogc2lnbnIgd2lsbCBiZSByZWNvcmRlZCBpbiB0YXNrLT5qb2JjdGwgZm9yIHJldHJpZXMgKi8KKwkJV0FSTl9PTl9PTkNFKHNpZ25yICYgfkpPQkNUTF9TVE9QX1NJR01BU0spOwogCi0JCWlmICghbGlrZWx5KGN1cnJlbnQtPmdyb3VwX3N0b3AgJiBHUk9VUF9TVE9QX0RFUVVFVUVEKSB8fAorCQlpZiAoIWxpa2VseShjdXJyZW50LT5qb2JjdGwgJiBKT0JDVExfU1RPUF9ERVFVRVVFRCkgfHwKIAkJICAgIHVubGlrZWx5KHNpZ25hbF9ncm91cF9leGl0KHNpZykpKQotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gZmFsc2U7CiAJCS8qCiAJCSAqIFRoZXJlIGlzIG5vIGdyb3VwIHN0b3AgYWxyZWFkeSBpbiBwcm9ncmVzcy4gIFdlIG11c3QKIAkJICogaW5pdGlhdGUgb25lIG5vdy4KQEAgLTE4ODgsMjggKzE5ODcsMzIgQEAKIAkJaWYgKCEoc2lnLT5mbGFncyAmIFNJR05BTF9TVE9QX1NUT1BQRUQpKQogCQkJc2lnLT5ncm91cF9leGl0X2NvZGUgPSBzaWducjsKIAkJZWxzZQotCQkJV0FSTl9PTl9PTkNFKCF0YXNrX3B0cmFjZShjdXJyZW50KSk7CisJCQlXQVJOX09OX09OQ0UoIWN1cnJlbnQtPnB0cmFjZSk7CiAKLQkJY3VycmVudC0+Z3JvdXBfc3RvcCAmPSB+R1JPVVBfU1RPUF9TSUdNQVNLOwotCQljdXJyZW50LT5ncm91cF9zdG9wIHw9IHNpZ25yIHwgZ3N0b3A7Ci0JCXNpZy0+Z3JvdXBfc3RvcF9jb3VudCA9IDE7CisJCXNpZy0+Z3JvdXBfc3RvcF9jb3VudCA9IDA7CisKKwkJaWYgKHRhc2tfc2V0X2pvYmN0bF9wZW5kaW5nKGN1cnJlbnQsIHNpZ25yIHwgZ3N0b3ApKQorCQkJc2lnLT5ncm91cF9zdG9wX2NvdW50Kys7CisKIAkJZm9yICh0ID0gbmV4dF90aHJlYWQoY3VycmVudCk7IHQgIT0gY3VycmVudDsKIAkJICAgICB0ID0gbmV4dF90aHJlYWQodCkpIHsKLQkJCXQtPmdyb3VwX3N0b3AgJj0gfkdST1VQX1NUT1BfU0lHTUFTSzsKIAkJCS8qCiAJCQkgKiBTZXR0aW5nIHN0YXRlIHRvIFRBU0tfU1RPUFBFRCBmb3IgYSBncm91cAogCQkJICogc3RvcCBpcyBhbHdheXMgZG9uZSB3aXRoIHRoZSBzaWdsb2NrIGhlbGQsCiAJCQkgKiBzbyB0aGlzIGNoZWNrIGhhcyBubyByYWNlcy4KIAkJCSAqLwotCQkJaWYgKCEodC0+ZmxhZ3MgJiBQRl9FWElUSU5HKSAmJiAhdGFza19pc19zdG9wcGVkKHQpKSB7Ci0JCQkJdC0+Z3JvdXBfc3RvcCB8PSBzaWduciB8IGdzdG9wOworCQkJaWYgKCF0YXNrX2lzX3N0b3BwZWQodCkgJiYKKwkJCSAgICB0YXNrX3NldF9qb2JjdGxfcGVuZGluZyh0LCBzaWduciB8IGdzdG9wKSkgewogCQkJCXNpZy0+Z3JvdXBfc3RvcF9jb3VudCsrOwotCQkJCXNpZ25hbF93YWtlX3VwKHQsIDApOworCQkJCWlmIChsaWtlbHkoISh0LT5wdHJhY2UgJiBQVF9TRUlaRUQpKSkKKwkJCQkJc2lnbmFsX3dha2VfdXAodCwgMCk7CisJCQkJZWxzZQorCQkJCQlwdHJhY2VfdHJhcF9ub3RpZnkodCk7CiAJCQl9CiAJCX0KIAl9Ci1yZXRyeToKLQlpZiAobGlrZWx5KCF0YXNrX3B0cmFjZShjdXJyZW50KSkpIHsKKworCWlmIChsaWtlbHkoIWN1cnJlbnQtPnB0cmFjZSkpIHsKIAkJaW50IG5vdGlmeSA9IDA7CiAKIAkJLyoKQEAgLTE5NDAsNDMgKzIwNDMsNjUgQEAKIAogCQkvKiBOb3cgd2UgZG9uJ3QgcnVuIGFnYWluIHVudGlsIHdva2VuIGJ5IFNJR0NPTlQgb3IgU0lHS0lMTCAqLwogCQlzY2hlZHVsZSgpOwotCi0JCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlyZXR1cm4gdHJ1ZTsKIAl9IGVsc2UgewotCQlwdHJhY2Vfc3RvcChjdXJyZW50LT5ncm91cF9zdG9wICYgR1JPVVBfU1RPUF9TSUdNQVNLLAotCQkJICAgIENMRF9TVE9QUEVELCAwLCBOVUxMKTsKKwkJLyoKKwkJICogV2hpbGUgcHRyYWNlZCwgZ3JvdXAgc3RvcCBpcyBoYW5kbGVkIGJ5IFNUT1AgdHJhcC4KKwkJICogU2NoZWR1bGUgaXQgYW5kIGxldCB0aGUgY2FsbGVyIGRlYWwgd2l0aCBpdC4KKwkJICovCisJCXRhc2tfc2V0X2pvYmN0bF9wZW5kaW5nKGN1cnJlbnQsIEpPQkNUTF9UUkFQX1NUT1ApOworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCisvKioKKyAqIGRvX2pvYmN0bF90cmFwIC0gdGFrZSBjYXJlIG9mIHB0cmFjZSBqb2JjdGwgdHJhcHMKKyAqCisgKiBXaGVuIFBUX1NFSVpFRCwgaXQncyB1c2VkIGZvciBib3RoIGdyb3VwIHN0b3AgYW5kIGV4cGxpY2l0CisgKiBTRUlaRS9JTlRFUlJVUFQgdHJhcHMuICBCb3RoIGdlbmVyYXRlIFBUUkFDRV9FVkVOVF9TVE9QIHRyYXAgd2l0aAorICogYWNjb21wYW55aW5nIHNpZ2luZm8uICBJZiBzdG9wcGVkLCBsb3dlciBlaWdodCBiaXRzIG9mIGV4aXRfY29kZSBjb250YWluCisgKiB0aGUgc3RvcCBzaWduYWw7IG90aGVyd2lzZSwgJVNJR1RSQVAuCisgKgorICogV2hlbiAhUFRfU0VJWkVELCBpdCdzIHVzZWQgb25seSBmb3IgZ3JvdXAgc3RvcCB0cmFwIHdpdGggc3RvcCBzaWduYWwKKyAqIG51bWJlciBhcyBleGl0X2NvZGUgYW5kIG5vIHNpZ2luZm8uCisgKgorICogQ09OVEVYVDoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggQGN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2sgaGVsZCwgd2hpY2ggbWF5IGJlCisgKiByZWxlYXNlZCBhbmQgcmUtYWNxdWlyZWQgYmVmb3JlIHJldHVybmluZyB3aXRoIGludGVydmVuaW5nIHNsZWVwLgorICovCitzdGF0aWMgdm9pZCBkb19qb2JjdGxfdHJhcCh2b2lkKQoreworCXN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWduYWwgPSBjdXJyZW50LT5zaWduYWw7CisJaW50IHNpZ25yID0gY3VycmVudC0+am9iY3RsICYgSk9CQ1RMX1NUT1BfU0lHTUFTSzsKKworCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9TRUlaRUQpIHsKKwkJaWYgKCFzaWduYWwtPmdyb3VwX3N0b3BfY291bnQgJiYKKwkJICAgICEoc2lnbmFsLT5mbGFncyAmIFNJR05BTF9TVE9QX1NUT1BQRUQpKQorCQkJc2lnbnIgPSBTSUdUUkFQOworCQlXQVJOX09OX09OQ0UoIXNpZ25yKTsKKwkJcHRyYWNlX2RvX25vdGlmeShzaWduciwgc2lnbnIgfCAoUFRSQUNFX0VWRU5UX1NUT1AgPDwgOCksCisJCQkJIENMRF9TVE9QUEVEKTsKKwl9IGVsc2UgeworCQlXQVJOX09OX09OQ0UoIXNpZ25yKTsKKwkJcHRyYWNlX3N0b3Aoc2lnbnIsIENMRF9TVE9QUEVELCAwLCBOVUxMKTsKIAkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKIAl9Ci0KLQkvKgotCSAqIEdST1VQX1NUT1BfUEVORElORyBjb3VsZCBiZSBzZXQgaWYgYW5vdGhlciBncm91cCBzdG9wIGhhcwotCSAqIHN0YXJ0ZWQgc2luY2UgYmVpbmcgd29rZW4gdXAgb3IgcHRyYWNlIHdhbnRzIHVzIHRvIHRyYW5zaXQKLQkgKiBiZXR3ZWVuIFRBU0tfU1RPUFBFRCBhbmQgVFJBQ0VELiAgUmV0cnkgZ3JvdXAgc3RvcC4KLQkgKi8KLQlpZiAoY3VycmVudC0+Z3JvdXBfc3RvcCAmIEdST1VQX1NUT1BfUEVORElORykgewotCQlXQVJOX09OX09OQ0UoIShjdXJyZW50LT5ncm91cF9zdG9wICYgR1JPVVBfU1RPUF9TSUdNQVNLKSk7Ci0JCWdvdG8gcmV0cnk7Ci0JfQotCi0JLyogUFRSQUNFX0FUVEFDSCBtaWdodCBoYXZlIHJhY2VkIHdpdGggdGFzayBraWxsaW5nLCBjbGVhciB0cmFwcGluZyAqLwotCXRhc2tfY2xlYXJfZ3JvdXBfc3RvcF90cmFwcGluZyhjdXJyZW50KTsKLQotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQl0cmFjZWhvb2tfZmluaXNoX2pjdGwoKTsKLQotCXJldHVybiAxOwogfQogCiBzdGF0aWMgaW50IHB0cmFjZV9zaWduYWwoaW50IHNpZ25yLCBzaWdpbmZvX3QgKmluZm8sCiAJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHZvaWQgKmNvb2tpZSkKIHsKLQlpZiAoIXRhc2tfcHRyYWNlKGN1cnJlbnQpKQotCQlyZXR1cm4gc2lnbnI7Ci0KIAlwdHJhY2Vfc2lnbmFsX2RlbGl2ZXIocmVncywgY29va2llKTsKLQotCS8qIExldCB0aGUgZGVidWdnZXIgcnVuLiAgKi8KKwkvKgorCSAqIFdlIGRvIG5vdCBjaGVjayBzaWdfa2VybmVsX3N0b3Aoc2lnbnIpIGJ1dCBzZXQgdGhpcyBtYXJrZXIKKwkgKiB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSB3ZSBkbyBub3Qga25vdyB3aGV0aGVyIGRlYnVnZ2VyIHdpbGwKKwkgKiBjaGFuZ2Ugc2lnbnIuIFRoaXMgZmxhZyBoYXMgbm8gbWVhbmluZyB1bmxlc3Mgd2UgYXJlIGdvaW5nCisJICogdG8gc3RvcCBhZnRlciByZXR1cm4gZnJvbSBwdHJhY2Vfc3RvcCgpLiBJbiB0aGlzIGNhc2UgaXQgd2lsbAorCSAqIGJlIGNoZWNrZWQgaW4gZG9fc2lnbmFsX3N0b3AoKSwgd2Ugc2hvdWxkIG9ubHkgc3RvcCBpZiBpdCB3YXMKKwkgKiBub3QgY2xlYXJlZCBieSBTSUdDT05UIHdoaWxlIHdlIHdlcmUgc2xlZXBpbmcuIFNlZSBhbHNvIHRoZQorCSAqIGNvbW1lbnQgaW4gZGVxdWV1ZV9zaWduYWwoKS4KKwkgKi8KKwljdXJyZW50LT5qb2JjdGwgfD0gSk9CQ1RMX1NUT1BfREVRVUVVRUQ7CiAJcHRyYWNlX3N0b3Aoc2lnbnIsIENMRF9UUkFQUEVELCAwLCBpbmZvKTsKIAogCS8qIFdlJ3JlIGJhY2suICBEaWQgdGhlIGRlYnVnZ2VyIGNhbmNlbCB0aGUgc2lnPyAgKi8KQEAgLTIwMzIsNyArMjE1Nyw2IEBACiAJICogdGhlIENMRF8gc2lfY29kZSBpbnRvIFNJR05BTF9DTERfTUFTSyBiaXRzLgogCSAqLwogCWlmICh1bmxpa2VseShzaWduYWwtPmZsYWdzICYgU0lHTkFMX0NMRF9NQVNLKSkgewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxlYWRlcjsKIAkJaW50IHdoeTsKIAogCQlpZiAoc2lnbmFsLT5mbGFncyAmIFNJR05BTF9DTERfQ09OVElOVUVEKQpAQCAtMjA1MywxMyArMjE3NywxMSBAQAogCQkgKiBhIGR1cGxpY2F0ZS4KIAkJICovCiAJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0KIAkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKGN1cnJlbnQsIGZhbHNlLCB3aHkpOwogCi0JCWxlYWRlciA9IGN1cnJlbnQtPmdyb3VwX2xlYWRlcjsKLQkJaWYgKHRhc2tfcHRyYWNlKGxlYWRlcikgJiYgIXJlYWxfcGFyZW50X2lzX3B0cmFjZXIobGVhZGVyKSkKLQkJCWRvX25vdGlmeV9wYXJlbnRfY2xkc3RvcChsZWFkZXIsIHRydWUsIHdoeSk7Ci0KKwkJaWYgKHB0cmFjZV9yZXBhcmVudGVkKGN1cnJlbnQtPmdyb3VwX2xlYWRlcikpCisJCQlkb19ub3RpZnlfcGFyZW50X2NsZHN0b3AoY3VycmVudC0+Z3JvdXBfbGVhZGVyLAorCQkJCQkJdHJ1ZSwgd2h5KTsKIAkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCiAJCWdvdG8gcmVsb2NrOwpAQCAtMjA2NywzNyArMjE4OSwzMSBAQAogCiAJZm9yICg7OykgewogCQlzdHJ1Y3Qga19zaWdhY3Rpb24gKmthOwotCQkvKgotCQkgKiBUcmFjaW5nIGNhbiBpbmR1Y2UgYW4gYXJ0aWZpY2lhbCBzaWduYWwgYW5kIGNob29zZSBzaWdhY3Rpb24uCi0JCSAqIFRoZSByZXR1cm4gdmFsdWUgaW4gQHNpZ25yIGRldGVybWluZXMgdGhlIGRlZmF1bHQgYWN0aW9uLAotCQkgKiBidXQgQGluZm8tPnNpX3NpZ25vIGlzIHRoZSBzaWduYWwgbnVtYmVyIHdlIHdpbGwgcmVwb3J0LgotCQkgKi8KLQkJc2lnbnIgPSB0cmFjZWhvb2tfZ2V0X3NpZ25hbChjdXJyZW50LCByZWdzLCBpbmZvLCByZXR1cm5fa2EpOwotCQlpZiAodW5saWtlbHkoc2lnbnIgPCAwKSkKKworCQlpZiAodW5saWtlbHkoY3VycmVudC0+am9iY3RsICYgSk9CQ1RMX1NUT1BfUEVORElORykgJiYKKwkJICAgIGRvX3NpZ25hbF9zdG9wKDApKQogCQkJZ290byByZWxvY2s7Ci0JCWlmICh1bmxpa2VseShzaWduciAhPSAwKSkKLQkJCWthID0gcmV0dXJuX2thOwotCQllbHNlIHsKLQkJCWlmICh1bmxpa2VseShjdXJyZW50LT5ncm91cF9zdG9wICYKLQkJCQkgICAgIEdST1VQX1NUT1BfUEVORElORykgJiYgZG9fc2lnbmFsX3N0b3AoMCkpCi0JCQkJZ290byByZWxvY2s7CiAKLQkJCXNpZ25yID0gZGVxdWV1ZV9zaWduYWwoY3VycmVudCwgJmN1cnJlbnQtPmJsb2NrZWQsCi0JCQkJCSAgICAgICBpbmZvKTsKLQotCQkJaWYgKCFzaWducikKLQkJCQlicmVhazsgLyogd2lsbCByZXR1cm4gMCAqLwotCi0JCQlpZiAoc2lnbnIgIT0gU0lHS0lMTCkgewotCQkJCXNpZ25yID0gcHRyYWNlX3NpZ25hbChzaWduciwgaW5mbywKLQkJCQkJCSAgICAgIHJlZ3MsIGNvb2tpZSk7Ci0JCQkJaWYgKCFzaWducikKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWthID0gJnNpZ2hhbmQtPmFjdGlvbltzaWduci0xXTsKKwkJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmpvYmN0bCAmIEpPQkNUTF9UUkFQX01BU0spKSB7CisJCQlkb19qb2JjdGxfdHJhcCgpOworCQkJc3Bpbl91bmxvY2tfaXJxKCZzaWdoYW5kLT5zaWdsb2NrKTsKKwkJCWdvdG8gcmVsb2NrOwogCQl9CiAKKwkJc2lnbnIgPSBkZXF1ZXVlX3NpZ25hbChjdXJyZW50LCAmY3VycmVudC0+YmxvY2tlZCwgaW5mbyk7CisKKwkJaWYgKCFzaWducikKKwkJCWJyZWFrOyAvKiB3aWxsIHJldHVybiAwICovCisKKwkJaWYgKHVubGlrZWx5KGN1cnJlbnQtPnB0cmFjZSkgJiYgc2lnbnIgIT0gU0lHS0lMTCkgeworCQkJc2lnbnIgPSBwdHJhY2Vfc2lnbmFsKHNpZ25yLCBpbmZvLAorCQkJCQkgICAgICByZWdzLCBjb29raWUpOworCQkJaWYgKCFzaWducikKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWthID0gJnNpZ2hhbmQtPmFjdGlvbltzaWduci0xXTsKKwogCQkvKiBUcmFjZSBhY3R1YWxseSBkZWxpdmVyZWQgc2lnbmFscy4gKi8KIAkJdHJhY2Vfc2lnbmFsX2RlbGl2ZXIoc2lnbnIsIGluZm8sIGthKTsKIApAQCAtMjI1Myw3ICsyMzY5LDcgQEAKIAlzaWdub3RzZXQoJnVuYmxvY2tlZCk7CiAJcmV0YXJnZXRfc2hhcmVkX3BlbmRpbmcodHNrLCAmdW5ibG9ja2VkKTsKIAotCWlmICh1bmxpa2VseSh0c2stPmdyb3VwX3N0b3AgJiBHUk9VUF9TVE9QX1BFTkRJTkcpICYmCisJaWYgKHVubGlrZWx5KHRzay0+am9iY3RsICYgSk9CQ1RMX1NUT1BfUEVORElORykgJiYKIAkgICAgdGFza19wYXJ0aWNpcGF0ZV9ncm91cF9zdG9wKHRzaykpCiAJCWdyb3VwX3N0b3AgPSBDTERfU1RPUFBFRDsKIG91dDoKQEAgLTIzNjUsNyArMjQ4MSw3IEBACiAvKioKICAqICBzeXNfcnRfc2lncHJvY21hc2sgLSBjaGFuZ2UgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGJsb2NrZWQgc2lnbmFscwogICogIEBob3c6IHdoZXRoZXIgdG8gYWRkLCByZW1vdmUsIG9yIHNldCBzaWduYWxzCi0gKiAgQHNldDogc3RvcmVzIHBlbmRpbmcgc2lnbmFscworICogIEBuc2V0OiBzdG9yZXMgcGVuZGluZyBzaWduYWxzCiAgKiAgQG9zZXQ6IHByZXZpb3VzIHZhbHVlIG9mIHNpZ25hbCBtYXNrIGlmIG5vbi1udWxsCiAgKiAgQHNpZ3NldHNpemU6IHNpemUgb2Ygc2lnc2V0X3QgdHlwZQogICovCmRpZmYgLS1naXQgYS9rZXJuZWwvc21wLmMgYi9rZXJuZWwvc21wLmMKaW5kZXggNzNhMTk1MS4uZmI2N2RmYSAxMDA2NDQKLS0tIGEva2VybmVsL3NtcC5jCisrKyBiL2tlcm5lbC9zbXAuYwpAQCAtNzQsNyArNzQsNyBAQAogCS5ub3RpZmllcl9jYWxsCQk9IGhvdHBsdWdfY2ZkLAogfTsKIAotc3RhdGljIGludCBfX2NwdWluaXQgaW5pdF9jYWxsX3NpbmdsZV9kYXRhKHZvaWQpCit2b2lkIF9faW5pdCBjYWxsX2Z1bmN0aW9uX2luaXQodm9pZCkKIHsKIAl2b2lkICpjcHUgPSAodm9pZCAqKShsb25nKXNtcF9wcm9jZXNzb3JfaWQoKTsKIAlpbnQgaTsKQEAgLTg4LDEwICs4OCw3IEBACiAKIAlob3RwbHVnX2NmZCgmaG90cGx1Z19jZmRfbm90aWZpZXIsIENQVV9VUF9QUkVQQVJFLCBjcHUpOwogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmaG90cGx1Z19jZmRfbm90aWZpZXIpOwotCi0JcmV0dXJuIDA7CiB9Ci1lYXJseV9pbml0Y2FsbChpbml0X2NhbGxfc2luZ2xlX2RhdGEpOwogCiAvKgogICogY3NkX2xvY2svY3NkX3VubG9jayB1c2VkIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gcGVyLWNwdSBjc2QgcmVzb3VyY2VzCmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGlycS5jIGIva2VybmVsL3NvZnRpcnEuYwppbmRleCAxMzk2MDE3Li5mY2E4MmMzIDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGlycS5jCisrKyBiL2tlcm5lbC9zb2Z0aXJxLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAogY2hhciAqc29mdGlycV90b19uYW1lW05SX1NPRlRJUlFTXSA9IHsKIAkiSEkiLCAiVElNRVIiLCAiTkVUX1RYIiwgIk5FVF9SWCIsICJCTE9DSyIsICJCTE9DS19JT1BPTEwiLAotCSJUQVNLTEVUIiwgIlNDSEVEIiwgIkhSVElNRVIiCisJIlRBU0tMRVQiLCAiU0NIRUQiLCAiSFJUSU1FUiIsICJSQ1UiCiB9OwogCiAvKgpAQCAtMzE1LDE2ICszMTUsMjQgQEAKIHsKIAlpZiAoIWZvcmNlX2lycXRocmVhZHMpCiAJCV9fZG9fc29mdGlycSgpOwotCWVsc2UKKwllbHNlIHsKKwkJX19sb2NhbF9iaF9kaXNhYmxlKCh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSwKKwkJCQlTT0ZUSVJRX09GRlNFVCk7CiAJCXdha2V1cF9zb2Z0aXJxZCgpOworCQlfX2xvY2FsX2JoX2VuYWJsZShTT0ZUSVJRX09GRlNFVCk7CisJfQogfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnZva2Vfc29mdGlycSh2b2lkKQogewogCWlmICghZm9yY2VfaXJxdGhyZWFkcykKIAkJZG9fc29mdGlycSgpOwotCWVsc2UKKwllbHNlIHsKKwkJX19sb2NhbF9iaF9kaXNhYmxlKCh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSwKKwkJCQlTT0ZUSVJRX09GRlNFVCk7CiAJCXdha2V1cF9zb2Z0aXJxZCgpOworCQlfX2xvY2FsX2JoX2VuYWJsZShTT0ZUSVJRX09GRlNFVCk7CisJfQogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zdGFja3RyYWNlLmMgYi9rZXJuZWwvc3RhY2t0cmFjZS5jCmluZGV4IGViMjEyZjguLmQyMGM2OTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zdGFja3RyYWNlLmMKKysrIGIva2VybmVsL3N0YWNrdHJhY2UuYwpAQCAtMjYsMTIgKzI2LDE4IEBACiBFWFBPUlRfU1lNQk9MX0dQTChwcmludF9zdGFja190cmFjZSk7CiAKIC8qCi0gKiBBcmNoaXRlY3R1cmVzIHRoYXQgZG8gbm90IGltcGxlbWVudCBzYXZlX3N0YWNrX3RyYWNlX3RzayBnZXQgdGhpcwotICogd2VhayBhbGlhcyBhbmQgYSBvbmNlLXBlci1ib290dXAgd2FybmluZyAod2hlbmV2ZXIgdGhpcyBmYWNpbGl0eQotICogaXMgdXRpbGl6ZWQgLSBmb3IgZXhhbXBsZSBieSBwcm9jZnMpOgorICogQXJjaGl0ZWN0dXJlcyB0aGF0IGRvIG5vdCBpbXBsZW1lbnQgc2F2ZV9zdGFja190cmFjZV90c2sgb3IKKyAqIHNhdmVfc3RhY2tfdHJhY2VfcmVncyBnZXQgdGhpcyB3ZWFrIGFsaWFzIGFuZCBhIG9uY2UtcGVyLWJvb3R1cCB3YXJuaW5nCisgKiAod2hlbmV2ZXIgdGhpcyBmYWNpbGl0eSBpcyB1dGlsaXplZCAtIGZvciBleGFtcGxlIGJ5IHByb2Nmcyk6CiAgKi8KIF9fd2VhayB2b2lkCiBzYXZlX3N0YWNrX3RyYWNlX3RzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKIHsKIAlXQVJOX09OQ0UoMSwgS0VSTl9JTkZPICJzYXZlX3N0YWNrX3RyYWNlX3RzaygpIG5vdCBpbXBsZW1lbnRlZCB5ZXQuXG4iKTsKIH0KKworX193ZWFrIHZvaWQKK3NhdmVfc3RhY2tfdHJhY2VfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKK3sKKwlXQVJOX09OQ0UoMSwgS0VSTl9JTkZPICJzYXZlX3N0YWNrX3RyYWNlX3JlZ3MoKSBub3QgaW1wbGVtZW50ZWQgeWV0LlxuIik7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvc3RvcF9tYWNoaW5lLmMgYi9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKaW5kZXggZTM1MTZiMi4uYzExMjQ3NSAxMDA2NDQKLS0tIGEva2VybmVsL3N0b3BfbWFjaGluZS5jCisrKyBiL2tlcm5lbC9zdG9wX21hY2hpbmUuYwpAQCAtMTM2LDEwICsxMzYsMTEgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgoc3RvcF9jcHVzX211dGV4KTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1X3N0b3Bfd29yaywgc3RvcF9jcHVzX3dvcmspOwogCi1pbnQgX19zdG9wX2NwdXMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssIGNwdV9zdG9wX2ZuX3QgZm4sIHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIHF1ZXVlX3N0b3BfY3B1c193b3JrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLAorCQkJCSBjcHVfc3RvcF9mbl90IGZuLCB2b2lkICphcmcsCisJCQkJIHN0cnVjdCBjcHVfc3RvcF9kb25lICpkb25lKQogewogCXN0cnVjdCBjcHVfc3RvcF93b3JrICp3b3JrOwotCXN0cnVjdCBjcHVfc3RvcF9kb25lIGRvbmU7CiAJdW5zaWduZWQgaW50IGNwdTsKIAogCS8qIGluaXRpYWxpemUgd29ya3MgYW5kIGRvbmUgKi8KQEAgLTE0Nyw5ICsxNDgsOCBAQAogCQl3b3JrID0gJnBlcl9jcHUoc3RvcF9jcHVzX3dvcmssIGNwdSk7CiAJCXdvcmstPmZuID0gZm47CiAJCXdvcmstPmFyZyA9IGFyZzsKLQkJd29yay0+ZG9uZSA9ICZkb25lOworCQl3b3JrLT5kb25lID0gZG9uZTsKIAl9Ci0JY3B1X3N0b3BfaW5pdF9kb25lKCZkb25lLCBjcHVtYXNrX3dlaWdodChjcHVtYXNrKSk7CiAKIAkvKgogCSAqIERpc2FibGUgcHJlZW1wdGlvbiB3aGlsZSBxdWV1ZWluZyB0byBhdm9pZCBnZXR0aW5nCkBAIC0xNjEsNyArMTYxLDE1IEBACiAJCWNwdV9zdG9wX3F1ZXVlX3dvcmsoJnBlcl9jcHUoY3B1X3N0b3BwZXIsIGNwdSksCiAJCQkJICAgICZwZXJfY3B1KHN0b3BfY3B1c193b3JrLCBjcHUpKTsKIAlwcmVlbXB0X2VuYWJsZSgpOworfQogCitzdGF0aWMgaW50IF9fc3RvcF9jcHVzKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLAorCQkgICAgICAgY3B1X3N0b3BfZm5fdCBmbiwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBjcHVfc3RvcF9kb25lIGRvbmU7CisKKwljcHVfc3RvcF9pbml0X2RvbmUoJmRvbmUsIGNwdW1hc2tfd2VpZ2h0KGNwdW1hc2spKTsKKwlxdWV1ZV9zdG9wX2NwdXNfd29yayhjcHVtYXNrLCBmbiwgYXJnLCAmZG9uZSk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmZG9uZS5jb21wbGV0aW9uKTsKIAlyZXR1cm4gZG9uZS5leGVjdXRlZCA/IGRvbmUucmV0IDogLUVOT0VOVDsKIH0KQEAgLTQzMSw4ICs0MzksMTUgQEAKIAlzdHJ1Y3Qgc3RvcF9tYWNoaW5lX2RhdGEgKnNtZGF0YSA9IGRhdGE7CiAJZW51bSBzdG9wbWFjaGluZV9zdGF0ZSBjdXJzdGF0ZSA9IFNUT1BNQUNISU5FX05PTkU7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKSwgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgaXNfYWN0aXZlOwogCisJLyoKKwkgKiBXaGVuIGNhbGxlZCBmcm9tIHN0b3BfbWFjaGluZV9mcm9tX2luYWN0aXZlX2NwdSgpLCBpcnEgbWlnaHQKKwkgKiBhbHJlYWR5IGJlIGRpc2FibGVkLiAgU2F2ZSB0aGUgc3RhdGUgYW5kIHJlc3RvcmUgaXQgb24gZXhpdC4KKwkgKi8KKwlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKKwogCWlmICghc21kYXRhLT5hY3RpdmVfY3B1cykKIAkJaXNfYWN0aXZlID0gY3B1ID09IGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKTsKIAllbHNlCkBAIC00NjAsNyArNDc1LDcgQEAKIAkJfQogCX0gd2hpbGUgKGN1cnN0YXRlICE9IFNUT1BNQUNISU5FX0VYSVQpOwogCi0JbG9jYWxfaXJxX2VuYWJsZSgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00ODcsNCArNTAyLDU3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzdG9wX21hY2hpbmUpOwogCisvKioKKyAqIHN0b3BfbWFjaGluZV9mcm9tX2luYWN0aXZlX2NwdSAtIHN0b3BfbWFjaGluZSgpIGZyb20gaW5hY3RpdmUgQ1BVCisgKiBAZm46IHRoZSBmdW5jdGlvbiB0byBydW4KKyAqIEBkYXRhOiB0aGUgZGF0YSBwdHIgZm9yIHRoZSBAZm4oKQorICogQGNwdXM6IHRoZSBjcHVzIHRvIHJ1biB0aGUgQGZuKCkgb24gKE5VTEwgPSBhbnkgb25saW5lIGNwdSkKKyAqCisgKiBUaGlzIGlzIGlkZW50aWNhbCB0byBzdG9wX21hY2hpbmUoKSBidXQgY2FuIGJlIGNhbGxlZCBmcm9tIGEgQ1BVIHdoaWNoCisgKiBpcyBub3QgYWN0aXZlLiAgVGhlIGxvY2FsIENQVSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBob3RwbHVnIChzbyBubyBvdGhlcgorICogQ1BVIGhvdHBsdWcgY2FuIHN0YXJ0KSBhbmQgbm90IG1hcmtlZCBhY3RpdmUgYW5kIGRvZXNuJ3QgaGF2ZSBlbm91Z2gKKyAqIGNvbnRleHQgdG8gc2xlZXAuCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBzdG9wX21hY2hpbmUoKSBmdW5jdGlvbmFsaXR5IGZvciBzdWNoIHN0YXRlIGJ5CisgKiB1c2luZyBidXN5LXdhaXQgZm9yIHN5bmNocm9uaXphdGlvbiBhbmQgZXhlY3V0aW5nIEBmbiBkaXJlY3RseSBmb3IgbG9jYWwKKyAqIENQVS4KKyAqCisgKiBDT05URVhUOgorICogTG9jYWwgQ1BVIGlzIGluYWN0aXZlLiAgVGVtcG9yYXJpbHkgc3RvcHMgYWxsIGFjdGl2ZSBDUFVzLgorICoKKyAqIFJFVFVSTlM6CisgKiAwIGlmIGFsbCBleGVjdXRpb25zIG9mIEBmbiByZXR1cm5lZCAwLCBhbnkgbm9uIHplcm8gcmV0dXJuIHZhbHVlIGlmIGFueQorICogcmV0dXJuZWQgbm9uIHplcm8uCisgKi8KK2ludCBzdG9wX21hY2hpbmVfZnJvbV9pbmFjdGl2ZV9jcHUoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmRhdGEsCisJCQkJICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1cykKK3sKKwlzdHJ1Y3Qgc3RvcF9tYWNoaW5lX2RhdGEgc21kYXRhID0geyAuZm4gPSBmbiwgLmRhdGEgPSBkYXRhLAorCQkJCQkgICAgLmFjdGl2ZV9jcHVzID0gY3B1cyB9OworCXN0cnVjdCBjcHVfc3RvcF9kb25lIGRvbmU7CisJaW50IHJldDsKKworCS8qIExvY2FsIENQVSBtdXN0IGJlIGluYWN0aXZlIGFuZCBDUFUgaG90cGx1ZyBpbiBwcm9ncmVzcy4gKi8KKwlCVUdfT04oY3B1X2FjdGl2ZShyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CisJc21kYXRhLm51bV90aHJlYWRzID0gbnVtX2FjdGl2ZV9jcHVzKCkgKyAxOwkvKiArMSBmb3IgbG9jYWwgKi8KKworCS8qIE5vIHByb3BlciB0YXNrIGVzdGFibGlzaGVkIGFuZCBjYW4ndCBzbGVlcCAtIGJ1c3kgd2FpdCBmb3IgbG9jay4gKi8KKwl3aGlsZSAoIW11dGV4X3RyeWxvY2soJnN0b3BfY3B1c19tdXRleCkpCisJCWNwdV9yZWxheCgpOworCisJLyogU2NoZWR1bGUgd29yayBvbiBvdGhlciBDUFVzIGFuZCBleGVjdXRlIGRpcmVjdGx5IGZvciBsb2NhbCBDUFUgKi8KKwlzZXRfc3RhdGUoJnNtZGF0YSwgU1RPUE1BQ0hJTkVfUFJFUEFSRSk7CisJY3B1X3N0b3BfaW5pdF9kb25lKCZkb25lLCBudW1fYWN0aXZlX2NwdXMoKSk7CisJcXVldWVfc3RvcF9jcHVzX3dvcmsoY3B1X2FjdGl2ZV9tYXNrLCBzdG9wX21hY2hpbmVfY3B1X3N0b3AsICZzbWRhdGEsCisJCQkgICAgICZkb25lKTsKKwlyZXQgPSBzdG9wX21hY2hpbmVfY3B1X3N0b3AoJnNtZGF0YSk7CisKKwkvKiBCdXN5IHdhaXQgZm9yIGNvbXBsZXRpb24uICovCisJd2hpbGUgKCFjb21wbGV0aW9uX2RvbmUoJmRvbmUuY29tcGxldGlvbikpCisJCWNwdV9yZWxheCgpOworCisJbXV0ZXhfdW5sb2NrKCZzdG9wX2NwdXNfbXV0ZXgpOworCXJldHVybiByZXQgPzogZG9uZS5yZXQ7Cit9CisKICNlbmRpZgkvKiBDT05GSUdfU1RPUF9NQUNISU5FICovCmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzLmMgYi9rZXJuZWwvc3lzLmMKaW5kZXggZTQxMjhiMi4uYTEwMWJhMyAxMDA2NDQKLS0tIGEva2VybmVsL3N5cy5jCisrKyBiL2tlcm5lbC9zeXMuYwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KQEAgLTMyMCw2ICszMTksMzcgQEAKIH0KIAogLyoqCisgKglyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIgLSBSZWdpc3RlciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYXQgcmVib290IHRpbWUKKyAqCUBuYjogSW5mbyBhYm91dCBub3RpZmllciBmdW5jdGlvbiB0byBiZSBjYWxsZWQKKyAqCisgKglSZWdpc3RlcnMgYSBmdW5jdGlvbiB3aXRoIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucworICoJdG8gYmUgY2FsbGVkIGF0IHJlYm9vdCB0aW1lLgorICoKKyAqCUN1cnJlbnRseSBhbHdheXMgcmV0dXJucyB6ZXJvLCBhcyBibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigpCisgKglhbHdheXMgcmV0dXJucyB6ZXJvLgorICovCitpbnQgcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZyZWJvb3Rfbm90aWZpZXJfbGlzdCwgbmIpOworfQorRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIpOworCisvKioKKyAqCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyIC0gVW5yZWdpc3RlciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgcmVib290IG5vdGlmaWVyCisgKglAbmI6IEhvb2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgKgorICoJVW5yZWdpc3RlcnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgcmVib290CisgKglub3RpZmllciBmdW5jdGlvbi4KKyAqCisgKglSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgJS1FTk9FTlQgb24gZmFpbHVyZS4KKyAqLworaW50IHVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJnJlYm9vdF9ub3RpZmllcl9saXN0LCBuYik7Cit9CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKTsKKworLyoqCiAgKglrZXJuZWxfcmVzdGFydCAtIHJlYm9vdCB0aGUgc3lzdGVtCiAgKglAY21kOiBwb2ludGVyIHRvIGJ1ZmZlciBjb250YWluaW5nIGNvbW1hbmQgdG8gZXhlY3V0ZSBmb3IgcmVzdGFydAogICoJCW9yICVOVUxMCmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggNGZjOTI0NC4uMTFkNjViNSAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtOTM4LDYgKzkzOCwxMiBAQAogCX0sCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUEVSRl9FVkVOVFMKKwkvKgorCSAqIFVzZXItc3BhY2Ugc2NyaXB0cyByZWx5IG9uIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyBmaWxlCisJICogYXMgYSBmZWF0dXJlIGNoZWNrIGZvciBwZXJmX2V2ZW50cyBiZWluZyBlbmFibGVkLgorCSAqCisJICogU28gaXQncyBhbiBBQkksIGRvIG5vdCByZW1vdmUhCisJICovCiAJewogCQkucHJvY25hbWUJPSAicGVyZl9ldmVudF9wYXJhbm9pZCIsCiAJCS5kYXRhCQk9ICZzeXNjdGxfcGVyZl9ldmVudF9wYXJhbm9pZCwKQEAgLTE1ODQsMTYgKzE1OTAsMTEgQEAKIAlzcGluX3VubG9jaygmc3lzY3RsX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX2hlYWQoc3RydWN0IHJjdV9oZWFkICpyY3UpCi17Ci0Ja2ZyZWUoY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIsIHJjdSkpOwotfQotCiB2b2lkIHN5c2N0bF9oZWFkX3B1dChzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZCkKIHsKIAlzcGluX2xvY2soJnN5c2N0bF9sb2NrKTsKIAlpZiAoIS0taGVhZC0+Y291bnQpCi0JCWNhbGxfcmN1KCZoZWFkLT5yY3UsIGZyZWVfaGVhZCk7CisJCWtmcmVlX3JjdShoZWFkLCByY3UpOwogCXNwaW5fdW5sb2NrKCZzeXNjdGxfbG9jayk7CiB9CiAKQEAgLTE5NjUsMTAgKzE5NjYsMTAgQEAKIAlzdGFydF91bnJlZ2lzdGVyaW5nKGhlYWRlcik7CiAJaWYgKCEtLWhlYWRlci0+cGFyZW50LT5jb3VudCkgewogCQlXQVJOX09OKDEpOwotCQljYWxsX3JjdSgmaGVhZGVyLT5wYXJlbnQtPnJjdSwgZnJlZV9oZWFkKTsKKwkJa2ZyZWVfcmN1KGhlYWRlci0+cGFyZW50LCByY3UpOwogCX0KIAlpZiAoIS0taGVhZGVyLT5jb3VudCkKLQkJY2FsbF9yY3UoJmhlYWRlci0+cmN1LCBmcmVlX2hlYWQpOworCQlrZnJlZV9yY3UoaGVhZGVyLCByY3UpOwogCXNwaW5fdW5sb2NrKCZzeXNjdGxfbG9jayk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90YXNrc3RhdHMuYyBiL2tlcm5lbC90YXNrc3RhdHMuYwppbmRleCA5ZmZlYTM2Li5mYzBmMjIwIDEwMDY0NAotLS0gYS9rZXJuZWwvdGFza3N0YXRzLmMKKysrIGIva2VybmVsL3Rhc2tzdGF0cy5jCkBAIC0yODUsMTYgKzI4NSwxOCBAQAogc3RhdGljIGludCBhZGRfZGVsX2xpc3RlbmVyKHBpZF90IHBpZCwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGludCBpc2FkZCkKIHsKIAlzdHJ1Y3QgbGlzdGVuZXJfbGlzdCAqbGlzdGVuZXJzOwotCXN0cnVjdCBsaXN0ZW5lciAqcywgKnRtcDsKKwlzdHJ1Y3QgbGlzdGVuZXIgKnMsICp0bXAsICpzMjsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCiAJaWYgKCFjcHVtYXNrX3N1YnNldChtYXNrLCBjcHVfcG9zc2libGVfbWFzaykpCiAJCXJldHVybiAtRUlOVkFMOwogCisJcyA9IE5VTEw7CiAJaWYgKGlzYWRkID09IFJFR0lTVEVSKSB7CiAJCWZvcl9lYWNoX2NwdShjcHUsIG1hc2spIHsKLQkJCXMgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBsaXN0ZW5lciksIEdGUF9LRVJORUwsCi0JCQkJCSBjcHVfdG9fbm9kZShjcHUpKTsKKwkJCWlmICghcykKKwkJCQlzID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgbGlzdGVuZXIpLAorCQkJCQkJIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGNwdSkpOwogCQkJaWYgKCFzKQogCQkJCWdvdG8gY2xlYW51cDsKIAkJCXMtPnBpZCA9IHBpZDsKQEAgLTMwMyw5ICszMDUsMTYgQEAKIAogCQkJbGlzdGVuZXJzID0gJnBlcl9jcHUobGlzdGVuZXJfYXJyYXksIGNwdSk7CiAJCQlkb3duX3dyaXRlKCZsaXN0ZW5lcnMtPnNlbSk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoczIsIHRtcCwgJmxpc3RlbmVycy0+bGlzdCwgbGlzdCkgeworCQkJCWlmIChzMi0+cGlkID09IHBpZCkKKwkJCQkJZ290byBuZXh0X2NwdTsKKwkJCX0KIAkJCWxpc3RfYWRkKCZzLT5saXN0LCAmbGlzdGVuZXJzLT5saXN0KTsKKwkJCXMgPSBOVUxMOworbmV4dF9jcHU6CiAJCQl1cF93cml0ZSgmbGlzdGVuZXJzLT5zZW0pOwogCQl9CisJCWtmcmVlKHMpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2FsYXJtdGltZXIuYyBiL2tlcm5lbC90aW1lL2FsYXJtdGltZXIuYwppbmRleCAyZDk2NjI0Li41OWYzNjlmIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9hbGFybXRpbWVyLmMKKysrIGIva2VybmVsL3RpbWUvYWxhcm10aW1lci5jCkBAIC00MiwxNSArNDIsNzUgQEAKIAljbG9ja2lkX3QJCWJhc2VfY2xvY2tpZDsKIH0gYWxhcm1fYmFzZXNbQUxBUk1fTlVNVFlQRV07CiAKKy8qIGZyZWV6ZXIgZGVsdGEgJiBsb2NrIHVzZWQgdG8gaGFuZGxlIGNsb2NrX25hbm9zbGVlcCB0cmlnZ2VyZWQgd2FrZXVwcyAqLworc3RhdGljIGt0aW1lX3QgZnJlZXplcl9kZWx0YTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZnJlZXplcl9kZWx0YV9sb2NrKTsKKwogI2lmZGVmIENPTkZJR19SVENfQ0xBU1MKIC8qIHJ0YyB0aW1lciBhbmQgZGV2aWNlIGZvciBzZXR0aW5nIGFsYXJtIHdha2V1cHMgYXQgc3VzcGVuZCAqLwogc3RhdGljIHN0cnVjdCBydGNfdGltZXIJCXJ0Y3RpbWVyOwogc3RhdGljIHN0cnVjdCBydGNfZGV2aWNlCSpydGNkZXY7Ci0jZW5kaWYKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socnRjZGV2X2xvY2spOwogCi0vKiBmcmVlemVyIGRlbHRhICYgbG9jayB1c2VkIHRvIGhhbmRsZSBjbG9ja19uYW5vc2xlZXAgdHJpZ2dlcmVkIHdha2V1cHMgKi8KLXN0YXRpYyBrdGltZV90IGZyZWV6ZXJfZGVsdGE7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZyZWV6ZXJfZGVsdGFfbG9jayk7CisvKioKKyAqIGhhc193YWtlYWxhcm0gLSBjaGVjayBydGMgZGV2aWNlIGhhcyB3YWtlYWxhcm0gYWJpbGl0eQorICogQGRldjogY3VycmVudCBkZXZpY2UKKyAqIEBuYW1lX3B0cjogbmFtZSB0byBiZSByZXR1cm5lZAorICoKKyAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIHJ0YyBkZXZpY2UgY2FuIHdha2UKKyAqIGZyb20gc3VzcGVuZC4KKyAqLworc3RhdGljIGludCBoYXNfd2FrZWFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqbmFtZV9wdHIpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKmNhbmRpZGF0ZSA9IHRvX3J0Y19kZXZpY2UoZGV2KTsKKworCWlmICghY2FuZGlkYXRlLT5vcHMtPnNldF9hbGFybSkKKwkJcmV0dXJuIDA7CisJaWYgKCFkZXZpY2VfbWF5X3dha2V1cChjYW5kaWRhdGUtPmRldi5wYXJlbnQpKQorCQlyZXR1cm4gMDsKKworCSooY29uc3QgY2hhciAqKiluYW1lX3B0ciA9IGRldl9uYW1lKGRldik7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogYWxhcm10aW1lcl9nZXRfcnRjZGV2IC0gUmV0dXJuIHNlbGVjdGVkIHJ0Y2RldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcnRjIGRldmljZSB0byB1c2UgZm9yIHdha2VhbGFybXMuCisgKiBJZiBvbmUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2hvc2VuLCBpdCBjaGVja3MgdG8gc2VlIGlmIGEKKyAqIGZ1bmN0aW9uYWwgcnRjIGRldmljZSBpcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRjX2RldmljZSAqYWxhcm10aW1lcl9nZXRfcnRjZGV2KHZvaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCWNoYXIgKnN0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydGNfZGV2aWNlICpyZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjZGV2X2xvY2ssIGZsYWdzKTsKKwlpZiAoIXJ0Y2RldikgeworCQkvKiBGaW5kIGFuIHJ0YyBkZXZpY2UgYW5kIGluaXQgdGhlIHJ0Y190aW1lciAqLworCQlkZXYgPSBjbGFzc19maW5kX2RldmljZShydGNfY2xhc3MsIE5VTEwsICZzdHIsIGhhc193YWtlYWxhcm0pOworCQkvKiBJZiB3ZSBoYXZlIGEgZGV2aWNlIHRoZW4gc3RyIGlzIHZhbGlkLiBTZWUgaGFzX3dha2VhbGFybSgpICovCisJCWlmIChkZXYpIHsKKwkJCXJ0Y2RldiA9IHJ0Y19jbGFzc19vcGVuKHN0cik7CisJCQkvKgorCQkJICogRHJvcCB0aGUgcmVmZXJlbmNlIHdlIGdvdCBpbiBjbGFzc19maW5kX2RldmljZSwKKwkJCSAqIHJ0Y19vcGVuIHRha2VzIGl0cyBvd24uCisJCQkgKi8KKwkJCXB1dF9kZXZpY2UoZGV2KTsKKwkJCXJ0Y190aW1lcl9pbml0KCZydGN0aW1lciwgTlVMTCwgTlVMTCk7CisJCX0KKwl9CisJcmV0ID0gcnRjZGV2OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y2Rldl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorI2Vsc2UKKyNkZWZpbmUgYWxhcm10aW1lcl9nZXRfcnRjZGV2KCkgKDApCisjZGVmaW5lIHJ0Y2RldiAoMCkKKyNlbmRpZgogCiAKIC8qKgpAQCAtMTY2LDYgKzIyNiw3IEBACiAJc3RydWN0IHJ0Y190aW1lIHRtOwogCWt0aW1lX3QgbWluLCBub3c7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwogCWludCBpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmZyZWV6ZXJfZGVsdGFfbG9jaywgZmxhZ3MpOwpAQCAtMTczLDggKzIzNCw5IEBACiAJZnJlZXplcl9kZWx0YSA9IGt0aW1lX3NldCgwLCAwKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmcmVlemVyX2RlbHRhX2xvY2ssIGZsYWdzKTsKIAorCXJ0YyA9IHJ0Y2RldjsKIAkvKiBJZiB3ZSBoYXZlIG5vIHJ0Y2RldiwganVzdCByZXR1cm4gKi8KLQlpZiAoIXJ0Y2RldikKKwlpZiAoIXJ0YykKIAkJcmV0dXJuIDA7CiAKIAkvKiBGaW5kIHRoZSBzb29uZXN0IHRpbWVyIHRvIGV4cGlyZSovCkBAIC0xOTksMTIgKzI2MSwxMiBAQAogCVdBUk5fT04obWluLnR2NjQgPCBOU0VDX1BFUl9TRUMpOwogCiAJLyogU2V0dXAgYW4gcnRjIHRpbWVyIHRvIGZpcmUgdGhhdCBmYXIgaW4gdGhlIGZ1dHVyZSAqLwotCXJ0Y190aW1lcl9jYW5jZWwocnRjZGV2LCAmcnRjdGltZXIpOwotCXJ0Y19yZWFkX3RpbWUocnRjZGV2LCAmdG0pOworCXJ0Y190aW1lcl9jYW5jZWwocnRjLCAmcnRjdGltZXIpOworCXJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOwogCW5vdyA9IHJ0Y190bV90b19rdGltZSh0bSk7CiAJbm93ID0ga3RpbWVfYWRkKG5vdywgbWluKTsKIAotCXJ0Y190aW1lcl9zdGFydChydGNkZXYsICZydGN0aW1lciwgbm93LCBrdGltZV9zZXQoMCwgMCkpOworCXJ0Y190aW1lcl9zdGFydChydGMsICZydGN0aW1lciwgbm93LCBrdGltZV9zZXQoMCwgMCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMjIsNiArMzg0LDkgQEAKIHsKIAljbG9ja2lkX3QgYmFzZWlkID0gYWxhcm1fYmFzZXNbY2xvY2syYWxhcm0od2hpY2hfY2xvY2spXS5iYXNlX2Nsb2NraWQ7CiAKKwlpZiAoIWFsYXJtdGltZXJfZ2V0X3J0Y2RldigpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCiAJcmV0dXJuIGhydGltZXJfZ2V0X3JlcyhiYXNlaWQsIHRwKTsKIH0KIApAQCAtMzM2LDYgKzQwMSw5IEBACiB7CiAJc3RydWN0IGFsYXJtX2Jhc2UgKmJhc2UgPSAmYWxhcm1fYmFzZXNbY2xvY2syYWxhcm0od2hpY2hfY2xvY2spXTsKIAorCWlmICghYWxhcm10aW1lcl9nZXRfcnRjZGV2KCkpCisJCXJldHVybiAtRU5PVFNVUFA7CisKIAkqdHAgPSBrdGltZV90b190aW1lc3BlYyhiYXNlLT5nZXR0aW1lKCkpOwogCXJldHVybiAwOwogfQpAQCAtMzUxLDYgKzQxOSw5IEBACiAJZW51bSAgYWxhcm10aW1lcl90eXBlIHR5cGU7CiAJc3RydWN0IGFsYXJtX2Jhc2UgKmJhc2U7CiAKKwlpZiAoIWFsYXJtdGltZXJfZ2V0X3J0Y2RldigpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCiAJaWYgKCFjYXBhYmxlKENBUF9XQUtFX0FMQVJNKSkKIAkJcmV0dXJuIC1FUEVSTTsKIApAQCAtMzg1LDYgKzQ1Niw5IEBACiAgKi8KIHN0YXRpYyBpbnQgYWxhcm1fdGltZXJfZGVsKHN0cnVjdCBrX2l0aW1lciAqdGltcikKIHsKKwlpZiAoIXJ0Y2RldikKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwogCWFsYXJtX2NhbmNlbCgmdGltci0+aXQuYWxhcm10aW1lcik7CiAJcmV0dXJuIDA7CiB9CkBAIC00MDIsNiArNDc2LDkgQEAKIAkJCQlzdHJ1Y3QgaXRpbWVyc3BlYyAqbmV3X3NldHRpbmcsCiAJCQkJc3RydWN0IGl0aW1lcnNwZWMgKm9sZF9zZXR0aW5nKQogeworCWlmICghcnRjZGV2KQorCQlyZXR1cm4gLUVOT1RTVVBQOworCiAJLyogU2F2ZSBvbGQgdmFsdWVzICovCiAJb2xkX3NldHRpbmctPml0X2ludGVydmFsID0KIAkJCWt0aW1lX3RvX3RpbWVzcGVjKHRpbXItPml0LmFsYXJtdGltZXIucGVyaW9kKTsKQEAgLTU0MSw2ICs2MTgsOSBAQAogCWludCByZXQgPSAwOwogCXN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0OwogCisJaWYgKCFhbGFybXRpbWVyX2dldF9ydGNkZXYoKSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwogCWlmICghY2FwYWJsZShDQVBfV0FLRV9BTEFSTSkpCiAJCXJldHVybiAtRVBFUk07CiAKQEAgLTYzOCw2NSArNzE4LDMgQEAKIH0KIGRldmljZV9pbml0Y2FsbChhbGFybXRpbWVyX2luaXQpOwogCi0jaWZkZWYgQ09ORklHX1JUQ19DTEFTUwotLyoqCi0gKiBoYXNfd2FrZWFsYXJtIC0gY2hlY2sgcnRjIGRldmljZSBoYXMgd2FrZWFsYXJtIGFiaWxpdHkKLSAqIEBkZXY6IGN1cnJlbnQgZGV2aWNlCi0gKiBAbmFtZV9wdHI6IG5hbWUgdG8gYmUgcmV0dXJuZWQKLSAqCi0gKiBUaGlzIGhlbHBlciBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmIHRoZSBydGMgZGV2aWNlIGNhbiB3YWtlCi0gKiBmcm9tIHN1c3BlbmQuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGhhc193YWtlYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpuYW1lX3B0cikKLXsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqY2FuZGlkYXRlID0gdG9fcnRjX2RldmljZShkZXYpOwotCi0JaWYgKCFjYW5kaWRhdGUtPm9wcy0+c2V0X2FsYXJtKQotCQlyZXR1cm4gMDsKLQlpZiAoIWRldmljZV9tYXlfd2FrZXVwKGNhbmRpZGF0ZS0+ZGV2LnBhcmVudCkpCi0JCXJldHVybiAwOwotCi0JKihjb25zdCBjaGFyICoqKW5hbWVfcHRyID0gZGV2X25hbWUoZGV2KTsKLQlyZXR1cm4gMTsKLX0KLQotLyoqCi0gKiBhbGFybXRpbWVyX2luaXRfbGF0ZSAtIExhdGUgaW5pdGlhbGl6aW5nIG9mIGFsYXJtdGltZXIgY29kZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gbG9jYXRlcyBhIHJ0YyBkZXZpY2UgdG8gdXNlIGZvciB3YWtlYWxhcm1zLgotICogUnVuIGFzIGxhdGVfaW5pdGNhbGwgdG8gbWFrZSBzdXJlIHJ0YyBkZXZpY2VzIGhhdmUgYmVlbgotICogcmVnaXN0ZXJlZC4KLSAqLwotc3RhdGljIGludCBfX2luaXQgYWxhcm10aW1lcl9pbml0X2xhdGUodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JY2hhciAqc3RyOwotCi0JLyogRmluZCBhbiBydGMgZGV2aWNlIGFuZCBpbml0IHRoZSBydGNfdGltZXIgKi8KLQlkZXYgPSBjbGFzc19maW5kX2RldmljZShydGNfY2xhc3MsIE5VTEwsICZzdHIsIGhhc193YWtlYWxhcm0pOwotCS8qIElmIHdlIGhhdmUgYSBkZXZpY2UgdGhlbiBzdHIgaXMgdmFsaWQuIFNlZSBoYXNfd2FrZWFsYXJtKCkgKi8KLQlpZiAoZGV2KSB7Ci0JCXJ0Y2RldiA9IHJ0Y19jbGFzc19vcGVuKHN0cik7Ci0JCS8qCi0JCSAqIERyb3AgdGhlIHJlZmVyZW5jZSB3ZSBnb3QgaW4gY2xhc3NfZmluZF9kZXZpY2UsCi0JCSAqIHJ0Y19vcGVuIHRha2VzIGl0cyBvd24uCi0JCSAqLwotCQlwdXRfZGV2aWNlKGRldik7Ci0JfQotCWlmICghcnRjZGV2KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIFJUQyBkZXZpY2UgZm91bmQsIEFMQVJNIHRpbWVycyB3aWxsIgotCQkJIiBub3Qgd2FrZSBmcm9tIHN1c3BlbmQiKTsKLQl9Ci0JcnRjX3RpbWVyX2luaXQoJnJ0Y3RpbWVyLCBOVUxMLCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotI2Vsc2UKLXN0YXRpYyBpbnQgX19pbml0IGFsYXJtdGltZXJfaW5pdF9sYXRlKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiS2VybmVsIG5vdCBidWlsdCB3aXRoIFJUQyBzdXBwb3J0LCBBTEFSTSB0aW1lcnMiCi0JCSIgd2lsbCBub3Qgd2FrZSBmcm9tIHN1c3BlbmQiKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotbGF0ZV9pbml0Y2FsbChhbGFybXRpbWVyX2luaXRfbGF0ZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwppbmRleCBjMDI3ZDRmLi5lNGM2OTlkIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKQEAgLTE4Miw3ICsxODIsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJQlVHX09OKGRldi0+bW9kZSAhPSBDTE9DS19FVlRfTU9ERV9VTlVTRUQpOwotCUJVR19PTighZGV2LT5jcHVtYXNrKTsKKwlpZiAoIWRldi0+Y3B1bWFzaykgeworCQlXQVJOX09OKG51bV9wb3NzaWJsZV9jcHVzKCkgPiAxKTsKKwkJZGV2LT5jcHVtYXNrID0gY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpOworCX0KIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tldmVudHNfbG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwppbmRleCAxYzk1ZmQ2Li5lMDk4MGYwIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKQEAgLTE4NSw3ICsxODUsNiBAQAogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOwogc3RhdGljIERFQ0xBUkVfV09SSyh3YXRjaGRvZ193b3JrLCBjbG9ja3NvdXJjZV93YXRjaGRvZ193b3JrKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sod2F0Y2hkb2dfbG9jayk7Ci1zdGF0aWMgY3ljbGVfdCB3YXRjaGRvZ19sYXN0Owogc3RhdGljIGludCB3YXRjaGRvZ19ydW5uaW5nOwogCiBzdGF0aWMgaW50IGNsb2Nrc291cmNlX3dhdGNoZG9nX2t0aHJlYWQodm9pZCAqZGF0YSk7CkBAIC0yNTQsMTEgKzI1Myw2IEBACiAJaWYgKCF3YXRjaGRvZ19ydW5uaW5nKQogCQlnb3RvIG91dDsKIAotCXdkbm93ID0gd2F0Y2hkb2ctPnJlYWQod2F0Y2hkb2cpOwotCXdkX25zZWMgPSBjbG9ja3NvdXJjZV9jeWMybnMoKHdkbm93IC0gd2F0Y2hkb2dfbGFzdCkgJiB3YXRjaGRvZy0+bWFzaywKLQkJCQkgICAgIHdhdGNoZG9nLT5tdWx0LCB3YXRjaGRvZy0+c2hpZnQpOwotCXdhdGNoZG9nX2xhc3QgPSB3ZG5vdzsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3MsICZ3YXRjaGRvZ19saXN0LCB3ZF9saXN0KSB7CiAKIAkJLyogQ2xvY2tzb3VyY2UgYWxyZWFkeSBtYXJrZWQgdW5zdGFibGU/ICovCkBAIC0yNjgsMTkgKzI2MiwyOCBAQAogCQkJY29udGludWU7CiAJCX0KIAorCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQljc25vdyA9IGNzLT5yZWFkKGNzKTsKKwkJd2Rub3cgPSB3YXRjaGRvZy0+cmVhZCh3YXRjaGRvZyk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCQkvKiBDbG9ja3NvdXJjZSBpbml0aWFsaXplZCA/ICovCiAJCWlmICghKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9XQVRDSERPRykpIHsKIAkJCWNzLT5mbGFncyB8PSBDTE9DS19TT1VSQ0VfV0FUQ0hET0c7Ci0JCQljcy0+d2RfbGFzdCA9IGNzbm93OworCQkJY3MtPndkX2xhc3QgPSB3ZG5vdzsKKwkJCWNzLT5jc19sYXN0ID0gY3Nub3c7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCS8qIENoZWNrIHRoZSBkZXZpYXRpb24gZnJvbSB0aGUgd2F0Y2hkb2cgY2xvY2tzb3VyY2UuICovCi0JCWNzX25zZWMgPSBjbG9ja3NvdXJjZV9jeWMybnMoKGNzbm93IC0gY3MtPndkX2xhc3QpICYKKwkJd2RfbnNlYyA9IGNsb2Nrc291cmNlX2N5YzJucygod2Rub3cgLSBjcy0+d2RfbGFzdCkgJiB3YXRjaGRvZy0+bWFzaywKKwkJCQkJICAgICB3YXRjaGRvZy0+bXVsdCwgd2F0Y2hkb2ctPnNoaWZ0KTsKKworCQljc19uc2VjID0gY2xvY2tzb3VyY2VfY3ljMm5zKChjc25vdyAtIGNzLT5jc19sYXN0KSAmCiAJCQkJCSAgICAgY3MtPm1hc2ssIGNzLT5tdWx0LCBjcy0+c2hpZnQpOwotCQljcy0+d2RfbGFzdCA9IGNzbm93OworCQljcy0+Y3NfbGFzdCA9IGNzbm93OworCQljcy0+d2RfbGFzdCA9IHdkbm93OworCisJCS8qIENoZWNrIHRoZSBkZXZpYXRpb24gZnJvbSB0aGUgd2F0Y2hkb2cgY2xvY2tzb3VyY2UuICovCiAJCWlmIChhYnMoY3NfbnNlYyAtIHdkX25zZWMpID4gV0FUQ0hET0dfVEhSRVNIT0xEKSB7CiAJCQljbG9ja3NvdXJjZV91bnN0YWJsZShjcywgY3NfbnNlYyAtIHdkX25zZWMpOwogCQkJY29udGludWU7CkBAIC0zMTgsNyArMzIxLDYgQEAKIAkJcmV0dXJuOwogCWluaXRfdGltZXIoJndhdGNoZG9nX3RpbWVyKTsKIAl3YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9IGNsb2Nrc291cmNlX3dhdGNoZG9nOwotCXdhdGNoZG9nX2xhc3QgPSB3YXRjaGRvZy0+cmVhZCh3YXRjaGRvZyk7CiAJd2F0Y2hkb2dfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBXQVRDSERPR19JTlRFUlZBTDsKIAlhZGRfdGltZXJfb24oJndhdGNoZG9nX3RpbWVyLCBjcHVtYXNrX2ZpcnN0KGNwdV9vbmxpbmVfbWFzaykpOwogCXdhdGNoZG9nX3J1bm5pbmcgPSAxOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKaW5kZXggMzQyNDA4Yy4uMmIwMjFiMGUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKKysrIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwpAQCAtNjA0LDYgKzYwNCwxMiBAQAogICovCiBzdGF0aWMgdm9pZCBfX3RpbWVrZWVwaW5nX2luamVjdF9zbGVlcHRpbWUoc3RydWN0IHRpbWVzcGVjICpkZWx0YSkKIHsKKwlpZiAoIXRpbWVzcGVjX3ZhbGlkKGRlbHRhKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJfX3RpbWVrZWVwaW5nX2luamVjdF9zbGVlcHRpbWU6IEludmFsaWQgIgorCQkJCQkic2xlZXAgZGVsdGEgdmFsdWUhXG4iKTsKKwkJcmV0dXJuOworCX0KKwogCXh0aW1lID0gdGltZXNwZWNfYWRkKHh0aW1lLCAqZGVsdGEpOwogCXdhbGxfdG9fbW9ub3RvbmljID0gdGltZXNwZWNfc3ViKHdhbGxfdG9fbW9ub3RvbmljLCAqZGVsdGEpOwogCXRvdGFsX3NsZWVwX3RpbWUgPSB0aW1lc3BlY19hZGQodG90YWxfc2xlZXBfdGltZSwgKmRlbHRhKTsKQEAgLTY4NiwxMiArNjkyLDM0IEBACiBzdGF0aWMgaW50IHRpbWVrZWVwaW5nX3N1c3BlbmQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0aW1lc3BlYwkJZGVsdGEsIGRlbHRhX2RlbHRhOworCXN0YXRpYyBzdHJ1Y3QgdGltZXNwZWMJb2xkX2RlbHRhOwogCiAJcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKCZ0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUpOwogCiAJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CiAJdGltZWtlZXBpbmdfZm9yd2FyZF9ub3coKTsKIAl0aW1la2VlcGluZ19zdXNwZW5kZWQgPSAxOworCisJLyoKKwkgKiBUbyBhdm9pZCBkcmlmdCBjYXVzZWQgYnkgcmVwZWF0ZWQgc3VzcGVuZC9yZXN1bWVzLAorCSAqIHdoaWNoIGVhY2ggY2FuIGFkZCB+MSBzZWNvbmQgZHJpZnQgZXJyb3IsCisJICogdHJ5IHRvIGNvbXBlbnNhdGUgc28gdGhlIGRpZmZlcmVuY2UgaW4gc3lzdGVtIHRpbWUKKwkgKiBhbmQgcGVyc2lzdGVudF9jbG9jayB0aW1lIHN0YXlzIGNsb3NlIHRvIGNvbnN0YW50LgorCSAqLworCWRlbHRhID0gdGltZXNwZWNfc3ViKHh0aW1lLCB0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUpOworCWRlbHRhX2RlbHRhID0gdGltZXNwZWNfc3ViKGRlbHRhLCBvbGRfZGVsdGEpOworCWlmIChhYnMoZGVsdGFfZGVsdGEudHZfc2VjKSAgPj0gMikgeworCQkvKgorCQkgKiBpZiBkZWx0YV9kZWx0YSBpcyB0b28gbGFyZ2UsIGFzc3VtZSB0aW1lIGNvcnJlY3Rpb24KKwkJICogaGFzIG9jY3VyZWQgYW5kIHNldCBvbGRfZGVsdGEgdG8gdGhlIGN1cnJlbnQgZGVsdGEuCisJCSAqLworCQlvbGRfZGVsdGEgPSBkZWx0YTsKKwl9IGVsc2UgeworCQkvKiBPdGhlcndpc2UgdHJ5IHRvIGFkanVzdCBvbGRfc3lzdGVtIHRvIGNvbXBlbnNhdGUgKi8KKwkJdGltZWtlZXBpbmdfc3VzcGVuZF90aW1lID0KKwkJCXRpbWVzcGVjX2FkZCh0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUsIGRlbHRhX2RlbHRhKTsKKwl9CiAJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKIAogCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX1NVU1BFTkQsIE5VTEwpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWVyLmMgYi9rZXJuZWwvdGltZXIuYwppbmRleCBmZDYxOTg2Li44Y2ZmMzYxIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZXIuYworKysgYi9rZXJuZWwvdGltZXIuYwpAQCAtNzQ5LDE2ICs3NDksMTUgQEAKIAl1bnNpZ25lZCBsb25nIGV4cGlyZXNfbGltaXQsIG1hc2s7CiAJaW50IGJpdDsKIAotCWV4cGlyZXNfbGltaXQgPSBleHBpcmVzOwotCiAJaWYgKHRpbWVyLT5zbGFjayA+PSAwKSB7CiAJCWV4cGlyZXNfbGltaXQgPSBleHBpcmVzICsgdGltZXItPnNsYWNrOwogCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwkJbG9uZyBkZWx0YSA9IGV4cGlyZXMgLSBqaWZmaWVzOwogCi0JCS8qIE5vIHNsYWNrLCBpZiBhbHJlYWR5IGV4cGlyZWQgZWxzZSBhdXRvIHNsYWNrIDAuNCUgKi8KLQkJaWYgKHRpbWVfYWZ0ZXIoZXhwaXJlcywgbm93KSkKLQkJCWV4cGlyZXNfbGltaXQgPSBleHBpcmVzICsgKGV4cGlyZXMgLSBub3cpLzI1NjsKKwkJaWYgKGRlbHRhIDwgMjU2KQorCQkJcmV0dXJuIGV4cGlyZXM7CisKKwkJZXhwaXJlc19saW1pdCA9IGV4cGlyZXMgKyBkZWx0YSAvIDI1NjsKIAl9CiAJbWFzayA9IGV4cGlyZXMgXiBleHBpcmVzX2xpbWl0OwogCWlmIChtYXNrID09IDApCkBAIC03OTUsNiArNzk0LDggQEAKICAqLwogaW50IG1vZF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsIHVuc2lnbmVkIGxvbmcgZXhwaXJlcykKIHsKKwlleHBpcmVzID0gYXBwbHlfc2xhY2sodGltZXIsIGV4cGlyZXMpOworCiAJLyoKIAkgKiBUaGlzIGlzIGEgY29tbW9uIG9wdGltaXphdGlvbiB0cmlnZ2VyZWQgYnkgdGhlCiAJICogbmV0d29ya2luZyBjb2RlIC0gaWYgdGhlIHRpbWVyIGlzIHJlLW1vZGlmaWVkCkBAIC04MDMsOCArODA0LDYgQEAKIAlpZiAodGltZXJfcGVuZGluZyh0aW1lcikgJiYgdGltZXItPmV4cGlyZXMgPT0gZXhwaXJlcykKIAkJcmV0dXJuIDE7CiAKLQlleHBpcmVzID0gYXBwbHlfc2xhY2sodGltZXIsIGV4cGlyZXMpOwotCiAJcmV0dXJuIF9fbW9kX3RpbWVyKHRpbWVyLCBleHBpcmVzLCBmYWxzZSwgVElNRVJfTk9UX1BJTk5FRCk7CiB9CiBFWFBPUlRfU1lNQk9MKG1vZF90aW1lcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMgYi9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKaW5kZXggMWVlNDE3Zi4uYzNlNDU3NSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL2Z0cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwpAQCAtMzIsNyArMzIsNiBAQAogCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NjaGVkLmg+CiAKLSNpbmNsdWRlIDxhc20vZnRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKICNpbmNsdWRlICJ0cmFjZV9vdXRwdXQuaCIKQEAgLTgyLDE0ICs4MSwxNCBAQAogCiBzdGF0aWMgREVGSU5FX01VVEVYKGZ0cmFjZV9sb2NrKTsKIAotc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIGZ0cmFjZV9saXN0X2VuZCBfX3JlYWRfbW9zdGx5ID0KLXsKK3N0YXRpYyBzdHJ1Y3QgZnRyYWNlX29wcyBmdHJhY2VfbGlzdF9lbmQgX19yZWFkX21vc3RseSA9IHsKIAkuZnVuYwkJPSBmdHJhY2Vfc3R1YiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX29wcyAqZnRyYWNlX2dsb2JhbF9saXN0IF9fcmVhZF9tb3N0bHkgPSAmZnRyYWNlX2xpc3RfZW5kOwogc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzICpmdHJhY2Vfb3BzX2xpc3QgX19yZWFkX21vc3RseSA9ICZmdHJhY2VfbGlzdF9lbmQ7CiBmdHJhY2VfZnVuY190IGZ0cmFjZV90cmFjZV9mdW5jdGlvbiBfX3JlYWRfbW9zdGx5ID0gZnRyYWNlX3N0dWI7CitzdGF0aWMgZnRyYWNlX2Z1bmNfdCBfX2Z0cmFjZV90cmFjZV9mdW5jdGlvbl9kZWxheSBfX3JlYWRfbW9zdGx5ID0gZnRyYWNlX3N0dWI7CiBmdHJhY2VfZnVuY190IF9fZnRyYWNlX3RyYWNlX2Z1bmN0aW9uIF9fcmVhZF9tb3N0bHkgPSBmdHJhY2Vfc3R1YjsKIGZ0cmFjZV9mdW5jX3QgZnRyYWNlX3BpZF9mdW5jdGlvbiBfX3JlYWRfbW9zdGx5ID0gZnRyYWNlX3N0dWI7CiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9vcHMgZ2xvYmFsX29wczsKQEAgLTE0OCw5ICsxNDcsMTEgQEAKIHsKIAlmdHJhY2VfdHJhY2VfZnVuY3Rpb24gPSBmdHJhY2Vfc3R1YjsKIAlfX2Z0cmFjZV90cmFjZV9mdW5jdGlvbiA9IGZ0cmFjZV9zdHViOworCV9fZnRyYWNlX3RyYWNlX2Z1bmN0aW9uX2RlbGF5ID0gZnRyYWNlX3N0dWI7CiAJZnRyYWNlX3BpZF9mdW5jdGlvbiA9IGZ0cmFjZV9zdHViOwogfQogCisjdW5kZWYgQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1QKICNpZm5kZWYgQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1QKIC8qCiAgKiBGb3IgdGhvc2UgYXJjaHMgdGhhdCBkbyBub3QgdGVzdCBmdHJhY2VfdHJhY2Vfc3RvcCBpbiB0aGVpcgpAQCAtMjEwLDcgKzIxMSwxMiBAQAogI2lmZGVmIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUCiAJZnRyYWNlX3RyYWNlX2Z1bmN0aW9uID0gZnVuYzsKICNlbHNlCisjaWZkZWYgQ09ORklHX0RZTkFNSUNfRlRSQUNFCisJLyogZG8gbm90IHVwZGF0ZSB0aWxsIGFsbCBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vZGlmaWVkICovCisJX19mdHJhY2VfdHJhY2VfZnVuY3Rpb25fZGVsYXkgPSBmdW5jOworI2Vsc2UKIAlfX2Z0cmFjZV90cmFjZV9mdW5jdGlvbiA9IGZ1bmM7CisjZW5kaWYKIAlmdHJhY2VfdHJhY2VfZnVuY3Rpb24gPSBmdHJhY2VfdGVzdF9zdG9wX2Z1bmM7CiAjZW5kaWYKIH0KQEAgLTc4NSw4ICs3OTEsNyBAQAogCXVucmVnaXN0ZXJfZnRyYWNlX2dyYXBoKCk7CiB9CiAjZWxzZQotc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIGZ0cmFjZV9wcm9maWxlX29wcyBfX3JlYWRfbW9zdGx5ID0KLXsKK3N0YXRpYyBzdHJ1Y3QgZnRyYWNlX29wcyBmdHJhY2VfcHJvZmlsZV9vcHMgX19yZWFkX21vc3RseSA9IHsKIAkuZnVuYwkJPSBmdW5jdGlvbl9wcm9maWxlX2NhbGwsCiB9OwogCkBAIC04MDYsMTkgKzgxMSwxMCBAQAogCQkgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLQljaGFyIGJ1Zls2NF07CQkvKiBiaWcgZW5vdWdoIHRvIGhvbGQgYSBudW1iZXIgKi8KIAlpbnQgcmV0OwogCi0JaWYgKGNudCA+PSBzaXplb2YoYnVmKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgdWJ1ZiwgY250KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlidWZbY250XSA9IDA7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgJnZhbCk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCXZhbCA9ICEhdmFsOwpAQCAtMTE4Miw4ICsxMTc4LDE0IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkCitmdHJhY2VfaGFzaF9yZWNfZGlzYWJsZShzdHJ1Y3QgZnRyYWNlX29wcyAqb3BzLCBpbnQgZmlsdGVyX2hhc2gpOworc3RhdGljIHZvaWQKK2Z0cmFjZV9oYXNoX3JlY19lbmFibGUoc3RydWN0IGZ0cmFjZV9vcHMgKm9wcywgaW50IGZpbHRlcl9oYXNoKTsKKwogc3RhdGljIGludAotZnRyYWNlX2hhc2hfbW92ZShzdHJ1Y3QgZnRyYWNlX2hhc2ggKipkc3QsIHN0cnVjdCBmdHJhY2VfaGFzaCAqc3JjKQorZnRyYWNlX2hhc2hfbW92ZShzdHJ1Y3QgZnRyYWNlX29wcyAqb3BzLCBpbnQgZW5hYmxlLAorCQkgc3RydWN0IGZ0cmFjZV9oYXNoICoqZHN0LCBzdHJ1Y3QgZnRyYWNlX2hhc2ggKnNyYykKIHsKIAlzdHJ1Y3QgZnRyYWNlX2Z1bmNfZW50cnkgKmVudHJ5OwogCXN0cnVjdCBobGlzdF9ub2RlICp0cCwgKnRuOwpAQCAtMTE5Myw5ICsxMTk1LDE2IEBACiAJdW5zaWduZWQgbG9uZyBrZXk7CiAJaW50IHNpemUgPSBzcmMtPmNvdW50OwogCWludCBiaXRzID0gMDsKKwlpbnQgcmV0OwogCWludCBpOwogCiAJLyoKKwkgKiBSZW1vdmUgdGhlIGN1cnJlbnQgc2V0LCB1cGRhdGUgdGhlIGhhc2ggYW5kIGFkZAorCSAqIHRoZW0gYmFjay4KKwkgKi8KKwlmdHJhY2VfaGFzaF9yZWNfZGlzYWJsZShvcHMsIGVuYWJsZSk7CisKKwkvKgogCSAqIElmIHRoZSBuZXcgc291cmNlIGlzIGVtcHR5LCBqdXN0IGZyZWUgZHN0IGFuZCBhc3NpZ24gaXQKIAkgKiB0aGUgZW1wdHlfaGFzaC4KIAkgKi8KQEAgLTEyMTUsOSArMTIyNCwxMCBAQAogCWlmIChiaXRzID4gRlRSQUNFX0hBU0hfTUFYX0JJVFMpCiAJCWJpdHMgPSBGVFJBQ0VfSEFTSF9NQVhfQklUUzsKIAorCXJldCA9IC1FTk9NRU07CiAJbmV3X2hhc2ggPSBhbGxvY19mdHJhY2VfaGFzaChiaXRzKTsKIAlpZiAoIW5ld19oYXNoKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXQ7CiAKIAlzaXplID0gMSA8PCBzcmMtPnNpemVfYml0czsKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CkBAIC0xMjM2LDcgKzEyNDYsMTYgQEAKIAlyY3VfYXNzaWduX3BvaW50ZXIoKmRzdCwgbmV3X2hhc2gpOwogCWZyZWVfZnRyYWNlX2hhc2hfcmN1KG9sZF9oYXNoKTsKIAotCXJldHVybiAwOworCXJldCA9IDA7Cisgb3V0OgorCS8qCisJICogRW5hYmxlIHJlZ2FyZGxlc3Mgb2YgcmV0OgorCSAqICBPbiBzdWNjZXNzLCB3ZSBlbmFibGUgdGhlIG5ldyBoYXNoLgorCSAqICBPbiBmYWlsdXJlLCB3ZSByZS1lbmFibGUgdGhlIG9yaWdpbmFsIGhhc2guCisJICovCisJZnRyYWNlX2hhc2hfcmVjX2VuYWJsZShvcHMsIGVuYWJsZSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMTU5Niw2ICsxNjE1LDEyIEBACiB7CiAJaW50ICpjb21tYW5kID0gZGF0YTsKIAorCS8qCisJICogRG8gbm90IGNhbGwgZnVuY3Rpb24gdHJhY2VyIHdoaWxlIHdlIHVwZGF0ZSB0aGUgY29kZS4KKwkgKiBXZSBhcmUgaW4gc3RvcCBtYWNoaW5lLCBubyB3b3JyeWluZyBhYm91dCByYWNlcy4KKwkgKi8KKwlmdW5jdGlvbl90cmFjZV9zdG9wKys7CisKIAlpZiAoKmNvbW1hbmQgJiBGVFJBQ0VfRU5BQkxFX0NBTExTKQogCQlmdHJhY2VfcmVwbGFjZV9jb2RlKDEpOwogCWVsc2UgaWYgKCpjb21tYW5kICYgRlRSQUNFX0RJU0FCTEVfQ0FMTFMpCkBAIC0xNjA5LDYgKzE2MzQsMTggQEAKIAllbHNlIGlmICgqY29tbWFuZCAmIEZUUkFDRV9TVE9QX0ZVTkNfUkVUKQogCQlmdHJhY2VfZGlzYWJsZV9mdHJhY2VfZ3JhcGhfY2FsbGVyKCk7CiAKKyNpZm5kZWYgQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1QKKwkvKgorCSAqIEZvciBhcmNocyB0aGF0IGNhbGwgZnRyYWNlX3Rlc3Rfc3RvcF9mdW5jKCksIHdlIG11c3QKKwkgKiB3YWl0IHRpbGwgYWZ0ZXIgd2UgdXBkYXRlIGFsbCB0aGUgZnVuY3Rpb24gY2FsbGVycworCSAqIGJlZm9yZSB3ZSB1cGRhdGUgdGhlIGNhbGxiYWNrLiBUaGlzIGtlZXBzIGRpZmZlcmVudAorCSAqIG9wcyB0aGF0IHJlY29yZCBkaWZmZXJlbnQgZnVuY3Rpb25zIGZyb20gY29ycnVwdGluZworCSAqIGVhY2ggb3RoZXIuCisJICovCisJX19mdHJhY2VfdHJhY2VfZnVuY3Rpb24gPSBfX2Z0cmFjZV90cmFjZV9mdW5jdGlvbl9kZWxheTsKKyNlbmRpZgorCWZ1bmN0aW9uX3RyYWNlX3N0b3AtLTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNzQ0LDEwICsxNzgxLDM2IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZwlmdHJhY2VfdXBkYXRlX2NudDsKIHVuc2lnbmVkIGxvbmcJCWZ0cmFjZV91cGRhdGVfdG90X2NudDsKIAorc3RhdGljIGludCBvcHNfdHJhY2VzX21vZChzdHJ1Y3QgZnRyYWNlX29wcyAqb3BzKQoreworCXN0cnVjdCBmdHJhY2VfaGFzaCAqaGFzaDsKKworCWhhc2ggPSBvcHMtPmZpbHRlcl9oYXNoOworCXJldHVybiAhISghaGFzaCB8fCAhaGFzaC0+Y291bnQpOworfQorCiBzdGF0aWMgaW50IGZ0cmFjZV91cGRhdGVfY29kZShzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJc3RydWN0IGR5bl9mdHJhY2UgKnA7CiAJY3ljbGVfdCBzdGFydCwgc3RvcDsKKwl1bnNpZ25lZCBsb25nIHJlZiA9IDA7CisKKwkvKgorCSAqIFdoZW4gYWRkaW5nIGEgbW9kdWxlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRyYWNlcnMgYXJlCisJICogY3VycmVudGx5IGVuYWJsZWQgYW5kIGlmIHRoZXkgYXJlIHNldCB0byB0cmFjZSBhbGwgZnVuY3Rpb25zLgorCSAqIElmIHRoZXkgYXJlLCB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgbW9kdWxlIGZ1bmN0aW9ucyBhcyB3ZWxsCisJICogYXMgdXBkYXRlIHRoZSByZWZlcmVuY2UgY291bnRzIGZvciB0aG9zZSBmdW5jdGlvbiByZWNvcmRzLgorCSAqLworCWlmIChtb2QpIHsKKwkJc3RydWN0IGZ0cmFjZV9vcHMgKm9wczsKKworCQlmb3IgKG9wcyA9IGZ0cmFjZV9vcHNfbGlzdDsKKwkJICAgICBvcHMgIT0gJmZ0cmFjZV9saXN0X2VuZDsgb3BzID0gb3BzLT5uZXh0KSB7CisJCQlpZiAob3BzLT5mbGFncyAmIEZUUkFDRV9PUFNfRkxfRU5BQkxFRCAmJgorCQkJICAgIG9wc190cmFjZXNfbW9kKG9wcykpCisJCQkJcmVmKys7CisJCX0KKwl9CiAKIAlzdGFydCA9IGZ0cmFjZV9ub3cocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJZnRyYWNlX3VwZGF0ZV9jbnQgPSAwOwpAQCAtMTc2MCw3ICsxODIzLDcgQEAKIAogCQlwID0gZnRyYWNlX25ld19hZGRyczsKIAkJZnRyYWNlX25ld19hZGRycyA9IHAtPm5ld2xpc3Q7Ci0JCXAtPmZsYWdzID0gMEw7CisJCXAtPmZsYWdzID0gcmVmOwogCiAJCS8qCiAJCSAqIERvIHRoZSBpbml0aWFsIHJlY29yZCBjb252ZXJzaW9uIGZyb20gbWNvdW50IGp1bXAKQEAgLTE3ODMsNyArMTg0Niw3IEBACiAJCSAqIGNvbnZlcnNpb24gcHV0cyB0aGUgbW9kdWxlIHRvIHRoZSBjb3JyZWN0IHN0YXRlLCB0aHVzCiAJCSAqIHBhc3NpbmcgdGhlIGZ0cmFjZV9tYWtlX2NhbGwgY2hlY2suCiAJCSAqLwotCQlpZiAoZnRyYWNlX3N0YXJ0X3VwKSB7CisJCWlmIChmdHJhY2Vfc3RhcnRfdXAgJiYgcmVmKSB7CiAJCQlpbnQgZmFpbGVkID0gX19mdHJhY2VfcmVwbGFjZV9jb2RlKHAsIDEpOwogCQkJaWYgKGZhaWxlZCkgewogCQkJCWZ0cmFjZV9idWcoZmFpbGVkLCBwLT5pcCk7CkBAIC0yNDA3LDEwICsyNDcwLDkgQEAKICAqLwogCiBzdGF0aWMgaW50Ci1mdHJhY2VfbW9kX2NhbGxiYWNrKGNoYXIgKmZ1bmMsIGNoYXIgKmNtZCwgY2hhciAqcGFyYW0sIGludCBlbmFibGUpCitmdHJhY2VfbW9kX2NhbGxiYWNrKHN0cnVjdCBmdHJhY2VfaGFzaCAqaGFzaCwKKwkJICAgIGNoYXIgKmZ1bmMsIGNoYXIgKmNtZCwgY2hhciAqcGFyYW0sIGludCBlbmFibGUpCiB7Ci0Jc3RydWN0IGZ0cmFjZV9vcHMgKm9wcyA9ICZnbG9iYWxfb3BzOwotCXN0cnVjdCBmdHJhY2VfaGFzaCAqaGFzaDsKIAljaGFyICptb2Q7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKQEAgLTI0MzAsMTEgKzI0OTIsNiBAQAogCWlmICghc3RybGVuKG1vZCkpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoZW5hYmxlKQotCQloYXNoID0gb3BzLT5maWx0ZXJfaGFzaDsKLQllbHNlCi0JCWhhc2ggPSBvcHMtPm5vdHJhY2VfaGFzaDsKLQogCXJldCA9IGZ0cmFjZV9tYXRjaF9tb2R1bGVfcmVjb3JkcyhoYXNoLCBmdW5jLCBtb2QpOwogCWlmICghcmV0KQogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMjc0MCw3ICsyNzk3LDcgQEAKIHsKIAljaGFyICpmdW5jLCAqY29tbWFuZCwgKm5leHQgPSBidWZmOwogCXN0cnVjdCBmdHJhY2VfZnVuY19jb21tYW5kICpwOwotCWludCByZXQ7CisJaW50IHJldCA9IC1FSU5WQUw7CiAKIAlmdW5jID0gc3Ryc2VwKCZuZXh0LCAiOiIpOwogCkBAIC0yNzYwLDcgKzI4MTcsNyBAQAogCW11dGV4X2xvY2soJmZ0cmFjZV9jbWRfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmZ0cmFjZV9jb21tYW5kcywgbGlzdCkgewogCQlpZiAoc3RyY21wKHAtPm5hbWUsIGNvbW1hbmQpID09IDApIHsKLQkJCXJldCA9IHAtPmZ1bmMoZnVuYywgY29tbWFuZCwgbmV4dCwgZW5hYmxlKTsKKwkJCXJldCA9IHAtPmZ1bmMoaGFzaCwgZnVuYywgY29tbWFuZCwgbmV4dCwgZW5hYmxlKTsKIAkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQogCX0KQEAgLTI4NTcsNyArMjkxNCwxMSBAQAogCQlmdHJhY2VfbWF0Y2hfcmVjb3JkcyhoYXNoLCBidWYsIGxlbik7CiAKIAltdXRleF9sb2NrKCZmdHJhY2VfbG9jayk7Ci0JcmV0ID0gZnRyYWNlX2hhc2hfbW92ZShvcmlnX2hhc2gsIGhhc2gpOworCXJldCA9IGZ0cmFjZV9oYXNoX21vdmUob3BzLCBlbmFibGUsIG9yaWdfaGFzaCwgaGFzaCk7CisJaWYgKCFyZXQgJiYgb3BzLT5mbGFncyAmIEZUUkFDRV9PUFNfRkxfRU5BQkxFRAorCSAgICAmJiBmdHJhY2VfZW5hYmxlZCkKKwkJZnRyYWNlX3J1bl91cGRhdGVfY29kZShGVFJBQ0VfRU5BQkxFX0NBTExTKTsKKwogCW11dGV4X3VubG9jaygmZnRyYWNlX2xvY2spOwogCiAJbXV0ZXhfdW5sb2NrKCZmdHJhY2VfcmVnZXhfbG9jayk7CkBAIC0zMDQwLDE4ICszMTAxLDEyIEBACiAJCQlvcmlnX2hhc2ggPSAmaXRlci0+b3BzLT5ub3RyYWNlX2hhc2g7CiAKIAkJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOwotCQkvKgotCQkgKiBSZW1vdmUgdGhlIGN1cnJlbnQgc2V0LCB1cGRhdGUgdGhlIGhhc2ggYW5kIGFkZAotCQkgKiB0aGVtIGJhY2suCi0JCSAqLwotCQlmdHJhY2VfaGFzaF9yZWNfZGlzYWJsZShpdGVyLT5vcHMsIGZpbHRlcl9oYXNoKTsKLQkJcmV0ID0gZnRyYWNlX2hhc2hfbW92ZShvcmlnX2hhc2gsIGl0ZXItPmhhc2gpOwotCQlpZiAoIXJldCkgewotCQkJZnRyYWNlX2hhc2hfcmVjX2VuYWJsZShpdGVyLT5vcHMsIGZpbHRlcl9oYXNoKTsKLQkJCWlmIChpdGVyLT5vcHMtPmZsYWdzICYgRlRSQUNFX09QU19GTF9FTkFCTEVECi0JCQkgICAgJiYgZnRyYWNlX2VuYWJsZWQpCi0JCQkJZnRyYWNlX3J1bl91cGRhdGVfY29kZShGVFJBQ0VfRU5BQkxFX0NBTExTKTsKLQkJfQorCQlyZXQgPSBmdHJhY2VfaGFzaF9tb3ZlKGl0ZXItPm9wcywgZmlsdGVyX2hhc2gsCisJCQkJICAgICAgIG9yaWdfaGFzaCwgaXRlci0+aGFzaCk7CisJCWlmICghcmV0ICYmIChpdGVyLT5vcHMtPmZsYWdzICYgRlRSQUNFX09QU19GTF9FTkFCTEVEKQorCQkgICAgJiYgZnRyYWNlX2VuYWJsZWQpCisJCQlmdHJhY2VfcnVuX3VwZGF0ZV9jb2RlKEZUUkFDRV9FTkFCTEVfQ0FMTFMpOworCiAJCW11dGV4X3VubG9jaygmZnRyYWNlX2xvY2spOwogCX0KIAlmcmVlX2Z0cmFjZV9oYXNoKGl0ZXItPmhhc2gpOwpAQCAtMzMzMCw2ICszMzg1LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nICpwOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsgLyogU2h1dCB1cCBnY2MgKi8KIAogCW11dGV4X2xvY2soJmZ0cmFjZV9sb2NrKTsKIAlwID0gc3RhcnQ7CkBAIC0zMzQ2LDcgKzM0MDIsMTkgQEAKIAkJZnRyYWNlX3JlY29yZF9pcChhZGRyKTsKIAl9CiAKKwkvKgorCSAqIFdlIG9ubHkgbmVlZCB0byBkaXNhYmxlIGludGVycnVwdHMgb24gc3RhcnQgdXAKKwkgKiBiZWNhdXNlIHdlIGFyZSBtb2RpZnlpbmcgY29kZSB0aGF0IGFuIGludGVycnVwdAorCSAqIG1heSBleGVjdXRlLCBhbmQgdGhlIG1vZGlmaWNhdGlvbiBpcyBub3QgYXRvbWljLgorCSAqIEJ1dCBmb3IgbW9kdWxlcywgbm90aGluZyBydW5zIHRoZSBjb2RlIHdlIG1vZGlmeQorCSAqIHVudGlsIHdlIGFyZSBmaW5pc2hlZCB3aXRoIGl0LCBhbmQgdGhlcmUncyBubworCSAqIHJlYXNvbiB0byBjYXVzZSBsYXJnZSBpbnRlcnJ1cHQgbGF0ZW5jaWVzIHdoaWxlIHdlIGRvIGl0LgorCSAqLworCWlmICghbW9kKQorCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJZnRyYWNlX3VwZGF0ZV9jb2RlKG1vZCk7CisJaWYgKCFtb2QpCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAltdXRleF91bmxvY2soJmZ0cmFjZV9sb2NrKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYwppbmRleCBiMGM3YWE0Li43MzEyMDFiIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYworKysgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYwpAQCAtOTk3LDE1ICs5OTcsMjEgQEAKIAkJCSAgICAgdW5zaWduZWQgbnJfcGFnZXMpCiB7CiAJc3RydWN0IGJ1ZmZlcl9wYWdlICpicGFnZSwgKnRtcDsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CiAJTElTVF9IRUFEKHBhZ2VzKTsKIAl1bnNpZ25lZCBpOwogCiAJV0FSTl9PTighbnJfcGFnZXMpOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCS8qCisJCSAqIF9fR0ZQX05PUkVUUlkgZmxhZyBtYWtlcyBzdXJlIHRoYXQgdGhlIGFsbG9jYXRpb24gZmFpbHMKKwkJICogZ3JhY2VmdWxseSB3aXRob3V0IGludm9raW5nIG9vbS1raWxsZXIgYW5kIHRoZSBzeXN0ZW0gaXMKKwkJICogbm90IGRlc3RhYmlsaXplZC4KKwkJICovCiAJCWJwYWdlID0ga3phbGxvY19ub2RlKEFMSUdOKHNpemVvZigqYnBhZ2UpLCBjYWNoZV9saW5lX3NpemUoKSksCi0JCQkJICAgIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGNwdV9idWZmZXItPmNwdSkpOworCQkJCSAgICBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSwKKwkJCQkgICAgY3B1X3RvX25vZGUoY3B1X2J1ZmZlci0+Y3B1KSk7CiAJCWlmICghYnBhZ2UpCiAJCQlnb3RvIGZyZWVfcGFnZXM7CiAKQEAgLTEwMTMsMTAgKzEwMTksMTEgQEAKIAogCQlsaXN0X2FkZCgmYnBhZ2UtPmxpc3QsICZwYWdlcyk7CiAKLQkJYWRkciA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKCFhZGRyKQorCQlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShjcHVfdG9fbm9kZShjcHVfYnVmZmVyLT5jcHUpLAorCQkJCQlHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSwgMCk7CisJCWlmICghcGFnZSkKIAkJCWdvdG8gZnJlZV9wYWdlczsKLQkJYnBhZ2UtPnBhZ2UgPSAodm9pZCAqKWFkZHI7CisJCWJwYWdlLT5wYWdlID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwogCQlyYl9pbml0X3BhZ2UoYnBhZ2UtPnBhZ2UpOwogCX0KIApAQCAtMTA0NSw3ICsxMDUyLDcgQEAKIHsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlcjsKIAlzdHJ1Y3QgYnVmZmVyX3BhZ2UgKmJwYWdlOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgcmV0OwogCiAJY3B1X2J1ZmZlciA9IGt6YWxsb2Nfbm9kZShBTElHTihzaXplb2YoKmNwdV9idWZmZXIpLCBjYWNoZV9saW5lX3NpemUoKSksCkBAIC0xMDY3LDEwICsxMDc0LDEwIEBACiAJcmJfY2hlY2tfYnBhZ2UoY3B1X2J1ZmZlciwgYnBhZ2UpOwogCiAJY3B1X2J1ZmZlci0+cmVhZGVyX3BhZ2UgPSBicGFnZTsKLQlhZGRyID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghYWRkcikKKwlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShjcHVfdG9fbm9kZShjcHUpLCBHRlBfS0VSTkVMLCAwKTsKKwlpZiAoIXBhZ2UpCiAJCWdvdG8gZmFpbF9mcmVlX3JlYWRlcjsKLQlicGFnZS0+cGFnZSA9ICh2b2lkICopYWRkcjsKKwlicGFnZS0+cGFnZSA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKIAlyYl9pbml0X3BhZ2UoYnBhZ2UtPnBhZ2UpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmNwdV9idWZmZXItPnJlYWRlcl9wYWdlLT5saXN0KTsKQEAgLTEzMTQsNyArMTMyMSw2IEBACiAJdW5zaWduZWQgbnJfcGFnZXMsIHJtX3BhZ2VzLCBuZXdfcGFnZXM7CiAJc3RydWN0IGJ1ZmZlcl9wYWdlICpicGFnZSwgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9zaXplOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAlMSVNUX0hFQUQocGFnZXMpOwogCWludCBpLCBjcHU7CiAKQEAgLTEzNzUsMTYgKzEzODEsMjQgQEAKIAogCWZvcl9lYWNoX2J1ZmZlcl9jcHUoYnVmZmVyLCBjcHUpIHsKIAkJZm9yIChpID0gMDsgaSA8IG5ld19wYWdlczsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJCS8qCisJCQkgKiBfX0dGUF9OT1JFVFJZIGZsYWcgbWFrZXMgc3VyZSB0aGF0IHRoZSBhbGxvY2F0aW9uCisJCQkgKiBmYWlscyBncmFjZWZ1bGx5IHdpdGhvdXQgaW52b2tpbmcgb29tLWtpbGxlciBhbmQKKwkJCSAqIHRoZSBzeXN0ZW0gaXMgbm90IGRlc3RhYmlsaXplZC4KKwkJCSAqLwogCQkJYnBhZ2UgPSBremFsbG9jX25vZGUoQUxJR04oc2l6ZW9mKCpicGFnZSksCiAJCQkJCQkgIGNhY2hlX2xpbmVfc2l6ZSgpKSwKLQkJCQkJICAgIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGNwdSkpOworCQkJCQkgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlksCisJCQkJCSAgICBjcHVfdG9fbm9kZShjcHUpKTsKIAkJCWlmICghYnBhZ2UpCiAJCQkJZ290byBmcmVlX3BhZ2VzOwogCQkJbGlzdF9hZGQoJmJwYWdlLT5saXN0LCAmcGFnZXMpOwotCQkJYWRkciA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQkJCWlmICghYWRkcikKKwkJCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKGNwdV90b19ub2RlKGNwdSksCisJCQkJCQlHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSwgMCk7CisJCQlpZiAoIXBhZ2UpCiAJCQkJZ290byBmcmVlX3BhZ2VzOwotCQkJYnBhZ2UtPnBhZ2UgPSAodm9pZCAqKWFkZHI7CisJCQlicGFnZS0+cGFnZSA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKIAkJCXJiX2luaXRfcGFnZShicGFnZS0+cGFnZSk7CiAJCX0KIAl9CkBAIC0zNzMwLDE2ICszNzQ0LDE3IEBACiAgKiBSZXR1cm5zOgogICogIFRoZSBwYWdlIGFsbG9jYXRlZCwgb3IgTlVMTCBvbiBlcnJvci4KICAqLwotdm9pZCAqcmluZ19idWZmZXJfYWxsb2NfcmVhZF9wYWdlKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyKQordm9pZCAqcmluZ19idWZmZXJfYWxsb2NfcmVhZF9wYWdlKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLCBpbnQgY3B1KQogewogCXN0cnVjdCBidWZmZXJfZGF0YV9wYWdlICpicGFnZTsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQlhZGRyID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghYWRkcikKKwlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShjcHVfdG9fbm9kZShjcHUpLAorCQkJCUdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZLCAwKTsKKwlpZiAoIXBhZ2UpCiAJCXJldHVybiBOVUxMOwogCi0JYnBhZ2UgPSAodm9pZCAqKWFkZHI7CisJYnBhZ2UgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAKIAlyYl9pbml0X3BhZ2UoYnBhZ2UpOwogCkBAIC0zOTc4LDIwICszOTkzLDExIEBACiAJCXNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKIHsKIAl1bnNpZ25lZCBsb25nICpwID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzY0XTsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgcmV0OwogCi0JaWYgKGNudCA+PSBzaXplb2YoYnVmKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgdWJ1ZiwgY250KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlidWZbY250XSA9IDA7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgJnZhbCk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCWlmICh2YWwpCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXJfYmVuY2htYXJrLmMgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXJfYmVuY2htYXJrLmMKaW5kZXggMzAyZjhhNi4uYTU0NTdkNSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyX2JlbmNobWFyay5jCisrKyBiL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlcl9iZW5jaG1hcmsuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJaW50IGluYzsKIAlpbnQgaTsKIAotCWJwYWdlID0gcmluZ19idWZmZXJfYWxsb2NfcmVhZF9wYWdlKGJ1ZmZlcik7CisJYnBhZ2UgPSByaW5nX2J1ZmZlcl9hbGxvY19yZWFkX3BhZ2UoYnVmZmVyLCBjcHUpOwogCWlmICghYnBhZ2UpCiAJCXJldHVybiBFVkVOVF9EUk9QUEVEOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2UuYyBiL2tlcm5lbC90cmFjZS90cmFjZS5jCmluZGV4IGVlOWM5MjEuLmU1ZGYwMmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZS5jCkBAIC0zNDMsMjYgKzM0MywyNyBAQAogc3RhdGljIGludCB0cmFjZV9zdG9wX2NvdW50Owogc3RhdGljIERFRklORV9TUElOTE9DSyh0cmFjaW5nX3N0YXJ0X2xvY2spOwogCitzdGF0aWMgdm9pZCB3YWtldXBfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl3YWtlX3VwKCZ0cmFjZV93YWl0KTsKK30KKworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKHdha2V1cF93b3JrLCB3YWtldXBfd29ya19oYW5kbGVyKTsKKwogLyoqCiAgKiB0cmFjZV93YWtlX3VwIC0gd2FrZSB1cCB0YXNrcyB3YWl0aW5nIGZvciB0cmFjZSBpbnB1dAogICoKLSAqIFNpbXBseSB3YWtlcyB1cCBhbnkgdGFzayB0aGF0IGlzIGJsb2NrZWQgb24gdGhlIHRyYWNlX3dhaXQKLSAqIHF1ZXVlLiBUaGVzZSBpcyB1c2VkIHdpdGggdHJhY2VfcG9sbCBmb3IgdGFza3MgcG9sbGluZyB0aGUgdHJhY2UuCisgKiBTY2hlZHVsZXMgYSBkZWxheWVkIHdvcmsgdG8gd2FrZSB1cCBhbnkgdGFzayB0aGF0IGlzIGJsb2NrZWQgb24gdGhlCisgKiB0cmFjZV93YWl0IHF1ZXVlLiBUaGVzZSBpcyB1c2VkIHdpdGggdHJhY2VfcG9sbCBmb3IgdGFza3MgcG9sbGluZyB0aGUKKyAqIHRyYWNlLgogICovCiB2b2lkIHRyYWNlX3dha2VfdXAodm9pZCkKIHsKLQlpbnQgY3B1OworCWNvbnN0IHVuc2lnbmVkIGxvbmcgZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKDIpOwogCiAJaWYgKHRyYWNlX2ZsYWdzICYgVFJBQ0VfSVRFUl9CTE9DSykKIAkJcmV0dXJuOwotCS8qCi0JICogVGhlIHJ1bnF1ZXVlX2lzX2xvY2tlZCgpIGNhbiBmYWlsLCBidXQgdGhpcyBpcyB0aGUgYmVzdCB3ZQotCSAqIGhhdmUgZm9yIG5vdzoKLQkgKi8KLQljcHUgPSBnZXRfY3B1KCk7Ci0JaWYgKCFydW5xdWV1ZV9pc19sb2NrZWQoY3B1KSkKLQkJd2FrZV91cCgmdHJhY2Vfd2FpdCk7Ci0JcHV0X2NwdSgpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmd2FrZXVwX3dvcmssIGRlbGF5KTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgc2V0X2J1Zl9zaXplKGNoYXIgKnN0cikKQEAgLTQyNCw2ICs0MjUsNyBAQAogCSJncmFwaC10aW1lIiwKIAkicmVjb3JkLWNtZCIsCiAJIm92ZXJ3cml0ZSIsCisJImRpc2FibGVfb25fZnJlZSIsCiAJTlVMTAogfTsKIApAQCAtMTE5MSw2ICsxMTkzLDE4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0cmFjZV9ub3dha2VfYnVmZmVyX3VubG9ja19jb21taXQpOwogCit2b2lkIHRyYWNlX25vd2FrZV9idWZmZXJfdW5sb2NrX2NvbW1pdF9yZWdzKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLAorCQkJCQkgICAgc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYywKKwkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQoYnVmZmVyLCBldmVudCk7CisKKwlmdHJhY2VfdHJhY2Vfc3RhY2tfcmVncyhidWZmZXIsIGZsYWdzLCAwLCBwYywgcmVncyk7CisJZnRyYWNlX3RyYWNlX3VzZXJzdGFjayhidWZmZXIsIGZsYWdzLCBwYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0cmFjZV9ub3dha2VfYnVmZmVyX3VubG9ja19jb21taXRfcmVncyk7CisKIHZvaWQgdHJhY2VfY3VycmVudF9idWZmZXJfZGlzY2FyZF9jb21taXQoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsCiAJCQkJCSBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQogewpAQCAtMTIzNCwzMCArMTI0OCwxMDMgQEAKIH0KIAogI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCisKKyNkZWZpbmUgRlRSQUNFX1NUQUNLX01BWF9FTlRSSUVTIChQQUdFX1NJWkUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpCitzdHJ1Y3QgZnRyYWNlX3N0YWNrIHsKKwl1bnNpZ25lZCBsb25nCQljYWxsc1tGVFJBQ0VfU1RBQ0tfTUFYX0VOVFJJRVNdOworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBmdHJhY2Vfc3RhY2ssIGZ0cmFjZV9zdGFjayk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBmdHJhY2Vfc3RhY2tfcmVzZXJ2ZSk7CisKIHN0YXRpYyB2b2lkIF9fZnRyYWNlX3RyYWNlX3N0YWNrKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLAogCQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzLAotCQkJCSBpbnQgc2tpcCwgaW50IHBjKQorCQkJCSBpbnQgc2tpcCwgaW50IHBjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfa2VybmVsX3N0YWNrOwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IHN0YWNrX2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3Qgc3RhY2tfdHJhY2UgdHJhY2U7Ci0KLQlldmVudCA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoYnVmZmVyLCBUUkFDRV9TVEFDSywKLQkJCQkJICBzaXplb2YoKmVudHJ5KSwgZmxhZ3MsIHBjKTsKLQlpZiAoIWV2ZW50KQotCQlyZXR1cm47Ci0JZW50cnkJPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKLQltZW1zZXQoJmVudHJ5LT5jYWxsZXIsIDAsIHNpemVvZihlbnRyeS0+Y2FsbGVyKSk7CisJaW50IHVzZV9zdGFjazsKKwlpbnQgc2l6ZSA9IEZUUkFDRV9TVEFDS19FTlRSSUVTOwogCiAJdHJhY2UubnJfZW50cmllcwk9IDA7Ci0JdHJhY2UubWF4X2VudHJpZXMJPSBGVFJBQ0VfU1RBQ0tfRU5UUklFUzsKIAl0cmFjZS5za2lwCQk9IHNraXA7Ci0JdHJhY2UuZW50cmllcwkJPSBlbnRyeS0+Y2FsbGVyOwogCi0Jc2F2ZV9zdGFja190cmFjZSgmdHJhY2UpOworCS8qCisJICogU2luY2UgZXZlbnRzIGNhbiBoYXBwZW4gaW4gTk1JcyB0aGVyZSdzIG5vIHNhZmUgd2F5IHRvCisJICogdXNlIHRoZSBwZXIgY3B1IGZ0cmFjZV9zdGFja3MuIFdlIHJlc2VydmUgaXQgYW5kIGlmIGFuIGludGVycnVwdAorCSAqIG9yIE5NSSBjb21lcyBpbiwgaXQgd2lsbCBqdXN0IGhhdmUgdG8gdXNlIHRoZSBkZWZhdWx0CisJICogRlRSQUNFX1NUQUNLX1NJWkUuCisJICovCisJcHJlZW1wdF9kaXNhYmxlX25vdHJhY2UoKTsKKworCXVzZV9zdGFjayA9ICsrX19nZXRfY3B1X3ZhcihmdHJhY2Vfc3RhY2tfcmVzZXJ2ZSk7CisJLyoKKwkgKiBXZSBkb24ndCBuZWVkIGFueSBhdG9taWMgdmFyaWFibGVzLCBqdXN0IGEgYmFycmllci4KKwkgKiBJZiBhbiBpbnRlcnJ1cHQgY29tZXMgaW4sIHdlIGRvbid0IGNhcmUsIGJlY2F1c2UgaXQgd291bGQKKwkgKiBoYXZlIGV4aXRlZCBhbmQgcHV0IHRoZSBjb3VudGVyIGJhY2sgdG8gd2hhdCB3ZSB3YW50LgorCSAqIFdlIGp1c3QgbmVlZCBhIGJhcnJpZXIgdG8ga2VlcCBnY2MgZnJvbSBtb3ZpbmcgdGhpbmdzCisJICogYXJvdW5kLgorCSAqLworCWJhcnJpZXIoKTsKKwlpZiAodXNlX3N0YWNrID09IDEpIHsKKwkJdHJhY2UuZW50cmllcwkJPSAmX19nZXRfY3B1X3ZhcihmdHJhY2Vfc3RhY2spLmNhbGxzWzBdOworCQl0cmFjZS5tYXhfZW50cmllcwk9IEZUUkFDRV9TVEFDS19NQVhfRU5UUklFUzsKKworCQlpZiAocmVncykKKwkJCXNhdmVfc3RhY2tfdHJhY2VfcmVncyhyZWdzLCAmdHJhY2UpOworCQllbHNlCisJCQlzYXZlX3N0YWNrX3RyYWNlKCZ0cmFjZSk7CisKKwkJaWYgKHRyYWNlLm5yX2VudHJpZXMgPiBzaXplKQorCQkJc2l6ZSA9IHRyYWNlLm5yX2VudHJpZXM7CisJfSBlbHNlCisJCS8qIEZyb20gbm93IG9uLCB1c2Vfc3RhY2sgaXMgYSBib29sZWFuICovCisJCXVzZV9zdGFjayA9IDA7CisKKwlzaXplICo9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKworCWV2ZW50ID0gdHJhY2VfYnVmZmVyX2xvY2tfcmVzZXJ2ZShidWZmZXIsIFRSQUNFX1NUQUNLLAorCQkJCQkgIHNpemVvZigqZW50cnkpICsgc2l6ZSwgZmxhZ3MsIHBjKTsKKwlpZiAoIWV2ZW50KQorCQlnb3RvIG91dDsKKwllbnRyeSA9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOworCisJbWVtc2V0KCZlbnRyeS0+Y2FsbGVyLCAwLCBzaXplKTsKKworCWlmICh1c2Vfc3RhY2spCisJCW1lbWNweSgmZW50cnktPmNhbGxlciwgdHJhY2UuZW50cmllcywKKwkJICAgICAgIHRyYWNlLm5yX2VudHJpZXMgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWVsc2UgeworCQl0cmFjZS5tYXhfZW50cmllcwk9IEZUUkFDRV9TVEFDS19FTlRSSUVTOworCQl0cmFjZS5lbnRyaWVzCQk9IGVudHJ5LT5jYWxsZXI7CisJCWlmIChyZWdzKQorCQkJc2F2ZV9zdGFja190cmFjZV9yZWdzKHJlZ3MsICZ0cmFjZSk7CisJCWVsc2UKKwkJCXNhdmVfc3RhY2tfdHJhY2UoJnRyYWNlKTsKKwl9CisKKwllbnRyeS0+c2l6ZSA9IHRyYWNlLm5yX2VudHJpZXM7CisKIAlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCBidWZmZXIsIGV2ZW50KSkKIAkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdChidWZmZXIsIGV2ZW50KTsKKworIG91dDoKKwkvKiBBZ2FpbiwgZG9uJ3QgbGV0IGdjYyBvcHRpbWl6ZSB0aGluZ3MgaGVyZSAqLworCWJhcnJpZXIoKTsKKwlfX2dldF9jcHVfdmFyKGZ0cmFjZV9zdGFja19yZXNlcnZlKS0tOworCXByZWVtcHRfZW5hYmxlX25vdHJhY2UoKTsKKworfQorCit2b2lkIGZ0cmFjZV90cmFjZV9zdGFja19yZWdzKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJICAgICBpbnQgc2tpcCwgaW50IHBjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoISh0cmFjZV9mbGFncyAmIFRSQUNFX0lURVJfU1RBQ0tUUkFDRSkpCisJCXJldHVybjsKKworCV9fZnRyYWNlX3RyYWNlX3N0YWNrKGJ1ZmZlciwgZmxhZ3MsIHNraXAsIHBjLCByZWdzKTsKIH0KIAogdm9pZCBmdHJhY2VfdHJhY2Vfc3RhY2soc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCkBAIC0xMjY2LDEzICsxMzUzLDEzIEBACiAJaWYgKCEodHJhY2VfZmxhZ3MgJiBUUkFDRV9JVEVSX1NUQUNLVFJBQ0UpKQogCQlyZXR1cm47CiAKLQlfX2Z0cmFjZV90cmFjZV9zdGFjayhidWZmZXIsIGZsYWdzLCBza2lwLCBwYyk7CisJX19mdHJhY2VfdHJhY2Vfc3RhY2soYnVmZmVyLCBmbGFncywgc2tpcCwgcGMsIE5VTEwpOwogfQogCiB2b2lkIF9fdHJhY2Vfc3RhY2soc3RydWN0IHRyYWNlX2FycmF5ICp0ciwgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHNraXAsCiAJCSAgIGludCBwYykKIHsKLQlfX2Z0cmFjZV90cmFjZV9zdGFjayh0ci0+YnVmZmVyLCBmbGFncywgc2tpcCwgcGMpOworCV9fZnRyYWNlX3RyYWNlX3N0YWNrKHRyLT5idWZmZXIsIGZsYWdzLCBza2lwLCBwYywgTlVMTCk7CiB9CiAKIC8qKgpAQCAtMTI4OCw3ICsxMzc1LDcgQEAKIAlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKIAogCS8qIHNraXBwaW5nIDMgdHJhY2VzLCBzZWVtcyB0byBnZXQgdXMgYXQgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uICovCi0JX19mdHJhY2VfdHJhY2Vfc3RhY2soZ2xvYmFsX3RyYWNlLmJ1ZmZlciwgZmxhZ3MsIDMsIHByZWVtcHRfY291bnQoKSk7CisJX19mdHJhY2VfdHJhY2Vfc3RhY2soZ2xvYmFsX3RyYWNlLmJ1ZmZlciwgZmxhZ3MsIDMsIHByZWVtcHRfY291bnQoKSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHVzZXJfc3RhY2tfY291bnQpOwpAQCAtMTUzNiw3ICsxNjIzLDEyIEBACiAKIAlmdHJhY2VfZW5hYmxlX2NwdSgpOwogCi0JcmV0dXJuIGV2ZW50ID8gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCkgOiBOVUxMOworCWlmIChldmVudCkgeworCQlpdGVyLT5lbnRfc2l6ZSA9IHJpbmdfYnVmZmVyX2V2ZW50X2xlbmd0aChldmVudCk7CisJCXJldHVybiByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKKwl9CisJaXRlci0+ZW50X3NpemUgPSAwOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IHRyYWNlX2VudHJ5ICoKQEAgLTIwNTEsNiArMjE0Myw5IEBACiB7CiAJc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyID0gbS0+cHJpdmF0ZTsKIAorCWlmICghKHRyYWNlX2ZsYWdzICYgVFJBQ0VfSVRFUl9DT05URVhUX0lORk8pKQorCQlyZXR1cm47CisKIAlpZiAoaXRlci0+aXRlcl9mbGFncyAmIFRSQUNFX0ZJTEVfTEFUX0ZNVCkgewogCQkvKiBwcmludCBub3RoaW5nIGlmIHRoZSBidWZmZXJzIGFyZSBlbXB0eSAqLwogCQlpZiAodHJhY2VfZW1wdHkoaXRlcikpCkBAIC0yNzAxLDIwICsyNzk2LDExIEBACiAJCSAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzY0XTsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgcmV0OwogCi0JaWYgKGNudCA+PSBzaXplb2YoYnVmKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgdWJ1ZiwgY250KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlidWZbY250XSA9IDA7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgJnZhbCk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCXZhbCA9ICEhdmFsOwpAQCAtMjc2Nyw3ICsyODUzLDcgQEAKIAlyZXR1cm4gdC0+aW5pdCh0cik7CiB9CiAKLXN0YXRpYyBpbnQgdHJhY2luZ19yZXNpemVfcmluZ19idWZmZXIodW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIGludCBfX3RyYWNpbmdfcmVzaXplX3JpbmdfYnVmZmVyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlpbnQgcmV0OwogCkBAIC0yODE5LDYgKzI5MDUsNDEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgc3NpemVfdCB0cmFjaW5nX3Jlc2l6ZV9yaW5nX2J1ZmZlcih1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IGNwdSwgcmV0ID0gc2l6ZTsKKworCW11dGV4X2xvY2soJnRyYWNlX3R5cGVzX2xvY2spOworCisJdHJhY2luZ19zdG9wKCk7CisKKwkvKiBkaXNhYmxlIGFsbCBjcHUgYnVmZmVycyAqLworCWZvcl9lYWNoX3RyYWNpbmdfY3B1KGNwdSkgeworCQlpZiAoZ2xvYmFsX3RyYWNlLmRhdGFbY3B1XSkKKwkJCWF0b21pY19pbmMoJmdsb2JhbF90cmFjZS5kYXRhW2NwdV0tPmRpc2FibGVkKTsKKwkJaWYgKG1heF90ci5kYXRhW2NwdV0pCisJCQlhdG9taWNfaW5jKCZtYXhfdHIuZGF0YVtjcHVdLT5kaXNhYmxlZCk7CisJfQorCisJaWYgKHNpemUgIT0gZ2xvYmFsX3RyYWNlLmVudHJpZXMpCisJCXJldCA9IF9fdHJhY2luZ19yZXNpemVfcmluZ19idWZmZXIoc2l6ZSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gLUVOT01FTTsKKworCWZvcl9lYWNoX3RyYWNpbmdfY3B1KGNwdSkgeworCQlpZiAoZ2xvYmFsX3RyYWNlLmRhdGFbY3B1XSkKKwkJCWF0b21pY19kZWMoJmdsb2JhbF90cmFjZS5kYXRhW2NwdV0tPmRpc2FibGVkKTsKKwkJaWYgKG1heF90ci5kYXRhW2NwdV0pCisJCQlhdG9taWNfZGVjKCZtYXhfdHIuZGF0YVtjcHVdLT5kaXNhYmxlZCk7CisJfQorCisJdHJhY2luZ19zdGFydCgpOworCW11dGV4X3VubG9jaygmdHJhY2VfdHlwZXNfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCiAKIC8qKgogICogdHJhY2luZ191cGRhdGVfYnVmZmVycyAtIHVzZWQgYnkgdHJhY2luZyBmYWNpbGl0eSB0byBleHBhbmQgcmluZyBidWZmZXJzCkBAIC0yODM2LDcgKzI5NTcsNyBAQAogCiAJbXV0ZXhfbG9jaygmdHJhY2VfdHlwZXNfbG9jayk7CiAJaWYgKCFyaW5nX2J1ZmZlcl9leHBhbmRlZCkKLQkJcmV0ID0gdHJhY2luZ19yZXNpemVfcmluZ19idWZmZXIodHJhY2VfYnVmX3NpemUpOworCQlyZXQgPSBfX3RyYWNpbmdfcmVzaXplX3JpbmdfYnVmZmVyKHRyYWNlX2J1Zl9zaXplKTsKIAltdXRleF91bmxvY2soJnRyYWNlX3R5cGVzX2xvY2spOwogCiAJcmV0dXJuIHJldDsKQEAgLTI4NjAsNyArMjk4MSw3IEBACiAJbXV0ZXhfbG9jaygmdHJhY2VfdHlwZXNfbG9jayk7CiAKIAlpZiAoIXJpbmdfYnVmZmVyX2V4cGFuZGVkKSB7Ci0JCXJldCA9IHRyYWNpbmdfcmVzaXplX3JpbmdfYnVmZmVyKHRyYWNlX2J1Zl9zaXplKTsKKwkJcmV0ID0gX190cmFjaW5nX3Jlc2l6ZV9yaW5nX2J1ZmZlcih0cmFjZV9idWZfc2l6ZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJCXJldCA9IDA7CkBAIC0yOTY2LDIwICszMDg3LDExIEBACiAJCSAgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKIHsKIAl1bnNpZ25lZCBsb25nICpwdHIgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbNjRdOwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCWludCByZXQ7CiAKLQlpZiAoY250ID49IHNpemVvZihidWYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmLCB1YnVmLCBjbnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWJ1ZltjbnRdID0gMDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChyZXQgPCAwKQorCXJldCA9IGtzdHJ0b3VsX2Zyb21fdXNlcih1YnVmLCBjbnQsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJKnB0ciA9IHZhbCAqIDEwMDA7CkBAIC0zNDM0LDY3ICszNTQ2LDU0IEBACiAJCSAgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLQljaGFyIGJ1Zls2NF07Ci0JaW50IHJldCwgY3B1OworCWludCByZXQ7CiAKLQlpZiAoY250ID49IHNpemVvZihidWYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmLCB1YnVmLCBjbnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWJ1ZltjbnRdID0gMDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChyZXQgPCAwKQorCXJldCA9IGtzdHJ0b3VsX2Zyb21fdXNlcih1YnVmLCBjbnQsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJLyogbXVzdCBoYXZlIGF0IGxlYXN0IDEgZW50cnkgKi8KIAlpZiAoIXZhbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZ0cmFjZV90eXBlc19sb2NrKTsKLQotCXRyYWNpbmdfc3RvcCgpOwotCi0JLyogZGlzYWJsZSBhbGwgY3B1IGJ1ZmZlcnMgKi8KLQlmb3JfZWFjaF90cmFjaW5nX2NwdShjcHUpIHsKLQkJaWYgKGdsb2JhbF90cmFjZS5kYXRhW2NwdV0pCi0JCQlhdG9taWNfaW5jKCZnbG9iYWxfdHJhY2UuZGF0YVtjcHVdLT5kaXNhYmxlZCk7Ci0JCWlmIChtYXhfdHIuZGF0YVtjcHVdKQotCQkJYXRvbWljX2luYygmbWF4X3RyLmRhdGFbY3B1XS0+ZGlzYWJsZWQpOwotCX0KLQogCS8qIHZhbHVlIGlzIGluIEtCICovCiAJdmFsIDw8PSAxMDsKIAotCWlmICh2YWwgIT0gZ2xvYmFsX3RyYWNlLmVudHJpZXMpIHsKLQkJcmV0ID0gdHJhY2luZ19yZXNpemVfcmluZ19idWZmZXIodmFsKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWNudCA9IHJldDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQorCXJldCA9IHRyYWNpbmdfcmVzaXplX3JpbmdfYnVmZmVyKHZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkqcHBvcyArPSBjbnQ7CiAKLQkvKiBJZiBjaGVjayBwYWdlcyBmYWlsZWQsIHJldHVybiBFTk9NRU0gKi8KLQlpZiAodHJhY2luZ19kaXNhYmxlZCkKLQkJY250ID0gLUVOT01FTTsKLSBvdXQ6Ci0JZm9yX2VhY2hfdHJhY2luZ19jcHUoY3B1KSB7Ci0JCWlmIChnbG9iYWxfdHJhY2UuZGF0YVtjcHVdKQotCQkJYXRvbWljX2RlYygmZ2xvYmFsX3RyYWNlLmRhdGFbY3B1XS0+ZGlzYWJsZWQpOwotCQlpZiAobWF4X3RyLmRhdGFbY3B1XSkKLQkJCWF0b21pY19kZWMoJm1heF90ci5kYXRhW2NwdV0tPmRpc2FibGVkKTsKLQl9CisJcmV0dXJuIGNudDsKK30KIAotCXRyYWNpbmdfc3RhcnQoKTsKLQltdXRleF91bmxvY2soJnRyYWNlX3R5cGVzX2xvY2spOworc3RhdGljIHNzaXplX3QKK3RyYWNpbmdfZnJlZV9idWZmZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLAorCQkJICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCit7CisJLyoKKwkgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHJlYWQgd2hhdCB0aGUgdXNlciBoYXMgd3JpdHRlbiwgdGhpcyBmdW5jdGlvbgorCSAqIGlzIGp1c3QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgbm8gZXJyb3Igd2hlbiAiZWNobyIgaXMgdXNlZAorCSAqLworCisJKnBwb3MgKz0gY250OwogCiAJcmV0dXJuIGNudDsKIH0KIAorc3RhdGljIGludAordHJhY2luZ19mcmVlX2J1ZmZlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCS8qIGRpc2FibGUgdHJhY2luZyA/ICovCisJaWYgKHRyYWNlX2ZsYWdzICYgVFJBQ0VfSVRFUl9TVE9QX09OX0ZSRUUpCisJCXRyYWNpbmdfb2ZmKCk7CisJLyogcmVzaXplIHRoZSByaW5nIGJ1ZmZlciB0byAwICovCisJdHJhY2luZ19yZXNpemVfcmluZ19idWZmZXIoMCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBtYXJrX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAlpbnQgcmV0OwpAQCAtMzY0MCw2ICszNzM5LDExIEBACiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhY2luZ19mcmVlX2J1ZmZlcl9mb3BzID0geworCS53cml0ZQkJPSB0cmFjaW5nX2ZyZWVfYnVmZmVyX3dyaXRlLAorCS5yZWxlYXNlCT0gdHJhY2luZ19mcmVlX2J1ZmZlcl9yZWxlYXNlLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhY2luZ19tYXJrX2ZvcHMgPSB7CiAJLm9wZW4JCT0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCiAJLndyaXRlCQk9IHRyYWNpbmdfbWFya193cml0ZSwKQEAgLTM2OTYsNyArMzgwMCw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKCFpbmZvLT5zcGFyZSkKLQkJaW5mby0+c3BhcmUgPSByaW5nX2J1ZmZlcl9hbGxvY19yZWFkX3BhZ2UoaW5mby0+dHItPmJ1ZmZlcik7CisJCWluZm8tPnNwYXJlID0gcmluZ19idWZmZXJfYWxsb2NfcmVhZF9wYWdlKGluZm8tPnRyLT5idWZmZXIsIGluZm8tPmNwdSk7CiAJaWYgKCFpbmZvLT5zcGFyZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTM4NTMsNyArMzk1Nyw3IEBACiAKIAkJcmVmLT5yZWYgPSAxOwogCQlyZWYtPmJ1ZmZlciA9IGluZm8tPnRyLT5idWZmZXI7Ci0JCXJlZi0+cGFnZSA9IHJpbmdfYnVmZmVyX2FsbG9jX3JlYWRfcGFnZShyZWYtPmJ1ZmZlcik7CisJCXJlZi0+cGFnZSA9IHJpbmdfYnVmZmVyX2FsbG9jX3JlYWRfcGFnZShyZWYtPmJ1ZmZlciwgaW5mby0+Y3B1KTsKIAkJaWYgKCFyZWYtPnBhZ2UpIHsKIAkJCWtmcmVlKHJlZik7CiAJCQlicmVhazsKQEAgLTM4NjIsOCArMzk2Niw3IEBACiAJCXIgPSByaW5nX2J1ZmZlcl9yZWFkX3BhZ2UocmVmLT5idWZmZXIsICZyZWYtPnBhZ2UsCiAJCQkJCSAgbGVuLCBpbmZvLT5jcHUsIDEpOwogCQlpZiAociA8IDApIHsKLQkJCXJpbmdfYnVmZmVyX2ZyZWVfcmVhZF9wYWdlKHJlZi0+YnVmZmVyLAotCQkJCQkJICAgcmVmLT5wYWdlKTsKKwkJCXJpbmdfYnVmZmVyX2ZyZWVfcmVhZF9wYWdlKHJlZi0+YnVmZmVyLCByZWYtPnBhZ2UpOwogCQkJa2ZyZWUocmVmKTsKIAkJCWJyZWFrOwogCQl9CkBAIC00MDk5LDE5ICs0MjAyLDEwIEBACiB7CiAJc3RydWN0IHRyYWNlX29wdGlvbl9kZW50cnkgKnRvcHQgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgbG9uZyB2YWw7Ci0JY2hhciBidWZbNjRdOwogCWludCByZXQ7CiAKLQlpZiAoY250ID49IHNpemVvZihidWYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmLCB1YnVmLCBjbnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWJ1ZltjbnRdID0gMDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChyZXQgPCAwKQorCXJldCA9IGtzdHJ0b3VsX2Zyb21fdXNlcih1YnVmLCBjbnQsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQpAQCAtNDE1OSwyMCArNDI1MywxMSBAQAogCQkJIGxvZmZfdCAqcHBvcykKIHsKIAlsb25nIGluZGV4ID0gKGxvbmcpZmlscC0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzY0XTsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgcmV0OwogCi0JaWYgKGNudCA+PSBzaXplb2YoYnVmKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgdWJ1ZiwgY250KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlidWZbY250XSA9IDA7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgJnZhbCk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCWlmICh2YWwgIT0gMCAmJiB2YWwgIT0gMSkKQEAgLTQzNjUsNiArNDQ1MCw5IEBACiAJdHJhY2VfY3JlYXRlX2ZpbGUoImJ1ZmZlcl9zaXplX2tiIiwgMDY0NCwgZF90cmFjZXIsCiAJCQkmZ2xvYmFsX3RyYWNlLCAmdHJhY2luZ19lbnRyaWVzX2ZvcHMpOwogCisJdHJhY2VfY3JlYXRlX2ZpbGUoImZyZWVfYnVmZmVyIiwgMDY0NCwgZF90cmFjZXIsCisJCQkmZ2xvYmFsX3RyYWNlLCAmdHJhY2luZ19mcmVlX2J1ZmZlcl9mb3BzKTsKKwogCXRyYWNlX2NyZWF0ZV9maWxlKCJ0cmFjZV9tYXJrZXIiLCAwMjIwLCBkX3RyYWNlciwKIAkJCU5VTEwsICZ0cmFjaW5nX21hcmtfZm9wcyk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5oIGIva2VybmVsL3RyYWNlL3RyYWNlLmgKaW5kZXggMjI5Zjg1OS4uM2YzODFkMCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmgKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmgKQEAgLTI3OCw2ICsyNzgsMjkgQEAKIH07CiAKIAorLyogT25seSBjdXJyZW50IGNhbiB0b3VjaCB0cmFjZV9yZWN1cnNpb24gKi8KKyNkZWZpbmUgdHJhY2VfcmVjdXJzaW9uX2luYygpIGRvIHsgKGN1cnJlbnQpLT50cmFjZV9yZWN1cnNpb24rKzsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdHJhY2VfcmVjdXJzaW9uX2RlYygpIGRvIHsgKGN1cnJlbnQpLT50cmFjZV9yZWN1cnNpb24tLTsgfSB3aGlsZSAoMCkKKworLyogUmluZyBidWZmZXIgaGFzIHRoZSAxMCBMU0IgYml0cyB0byBjb3VudCAqLworI2RlZmluZSB0cmFjZV9yZWN1cnNpb25fYnVmZmVyKCkgKChjdXJyZW50KS0+dHJhY2VfcmVjdXJzaW9uICYgMHgzZmYpCisKKy8qIGZvciBmdW5jdGlvbiB0cmFjaW5nIHJlY3Vyc2lvbiAqLworI2RlZmluZSBUUkFDRV9JTlRFUk5BTF9CSVQJCSgxPDwxMSkKKyNkZWZpbmUgVFJBQ0VfR0xPQkFMX0JJVAkJKDE8PDEyKQorLyoKKyAqIEFidXNlIG9mIHRoZSB0cmFjZV9yZWN1cnNpb24uCisgKiBBcyB3ZSBuZWVkIGEgd2F5IHRvIG1haW50YWluIHN0YXRlIGlmIHdlIGFyZSB0cmFjaW5nIHRoZSBmdW5jdGlvbgorICogZ3JhcGggaW4gaXJxIGJlY2F1c2Ugd2Ugd2FudCB0byB0cmFjZSBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gdGhhdAorICogd2FzIGNhbGxlZCBpbiBpcnEgY29udGV4dCBidXQgd2UgaGF2ZSBpcnEgdHJhY2luZyBvZmYuIFNpbmNlIHRoaXMKKyAqIGNhbiBvbmx5IGJlIG1vZGlmaWVkIGJ5IGN1cnJlbnQsIHdlIGNhbiByZXVzZSB0cmFjZV9yZWN1cnNpb24uCisgKi8KKyNkZWZpbmUgVFJBQ0VfSVJRX0JJVAkJCSgxPDwxMykKKworI2RlZmluZSB0cmFjZV9yZWN1cnNpb25fc2V0KGJpdCkJZG8geyAoY3VycmVudCktPnRyYWNlX3JlY3Vyc2lvbiB8PSAoYml0KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdHJhY2VfcmVjdXJzaW9uX2NsZWFyKGJpdCkJZG8geyAoY3VycmVudCktPnRyYWNlX3JlY3Vyc2lvbiAmPSB+KGJpdCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHRyYWNlX3JlY3Vyc2lvbl90ZXN0KGJpdCkJKChjdXJyZW50KS0+dHJhY2VfcmVjdXJzaW9uICYgKGJpdCkpCisKICNkZWZpbmUgVFJBQ0VfUElQRV9BTExfQ1BVCS0xCiAKIGludCB0cmFjZXJfaW5pdChzdHJ1Y3QgdHJhY2VyICp0LCBzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKTsKQEAgLTM4OSw2ICs0MTIsOSBAQAogdm9pZCBmdHJhY2VfdHJhY2Vfc3RhY2soc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQlpbnQgc2tpcCwgaW50IHBjKTsKIAordm9pZCBmdHJhY2VfdHJhY2Vfc3RhY2tfcmVncyhzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCSAgICAgaW50IHNraXAsIGludCBwYywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCiB2b2lkIGZ0cmFjZV90cmFjZV91c2Vyc3RhY2soc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkgICAgaW50IHBjKTsKIApAQCAtNDAwLDYgKzQyNiwxMiBAQAogewogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX3RyYWNlX3N0YWNrX3JlZ3Moc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBza2lwLAorCQkJCQkgICBpbnQgcGMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX3RyYWNlX3VzZXJzdGFjayhzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwKIAkJCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpCiB7CkBAIC01MDcsOCArNTM5LDE4IEBACiAJCXJldHVybiAxOwogCiAJZm9yIChpID0gMDsgaSA8IGZ0cmFjZV9ncmFwaF9jb3VudDsgaSsrKSB7Ci0JCWlmIChhZGRyID09IGZ0cmFjZV9ncmFwaF9mdW5jc1tpXSkKKwkJaWYgKGFkZHIgPT0gZnRyYWNlX2dyYXBoX2Z1bmNzW2ldKSB7CisJCQkvKgorCQkJICogSWYgbm8gaXJxcyBhcmUgdG8gYmUgdHJhY2VkLCBidXQgYSBzZXRfZ3JhcGhfZnVuY3Rpb24KKwkJCSAqIGlzIHNldCwgYW5kIGNhbGxlZCBieSBhbiBpbnRlcnJ1cHQgaGFuZGxlciwgd2Ugc3RpbGwKKwkJCSAqIHdhbnQgdG8gdHJhY2UgaXQuCisJCQkgKi8KKwkJCWlmIChpbl9pcnEoKSkKKwkJCQl0cmFjZV9yZWN1cnNpb25fc2V0KFRSQUNFX0lSUV9CSVQpOworCQkJZWxzZQorCQkJCXRyYWNlX3JlY3Vyc2lvbl9jbGVhcihUUkFDRV9JUlFfQklUKTsKIAkJCXJldHVybiAxOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CkBAIC02MDksNiArNjUxLDcgQEAKIAlUUkFDRV9JVEVSX0dSQVBIX1RJTUUJCT0gMHg4MDAwMCwKIAlUUkFDRV9JVEVSX1JFQ09SRF9DTUQJCT0gMHgxMDAwMDAsCiAJVFJBQ0VfSVRFUl9PVkVSV1JJVEUJCT0gMHgyMDAwMDAsCisJVFJBQ0VfSVRFUl9TVE9QX09OX0ZSRUUJCT0gMHg0MDAwMDAsCiB9OwogCiAvKgpAQCAtNjc3LDYgKzcyMCw3IEBACiAJc3RydWN0IGRlbnRyeQkJKmVudHJ5OwogCXN0cnVjdCBldmVudF9maWx0ZXIJKmZpbHRlcjsKIAlpbnQJCQlucl9ldmVudHM7CisJaW50CQkJcmVmX2NvdW50OwogfTsKIAogI2RlZmluZSBGSUxURVJfUFJFRF9JTlZBTElECSgodW5zaWduZWQgc2hvcnQpLTEpCkBAIC03ODQsMTkgKzgyOCw0IEBACiAJRlRSQUNFX0VOVFJZKGNhbGwsIHN0cnVjdF9uYW1lLCBpZCwgUEFSQU1TKHRzdHJ1Y3QpLCBQQVJBTVMocHJpbnQpKQogI2luY2x1ZGUgInRyYWNlX2VudHJpZXMuaCIKIAotLyogT25seSBjdXJyZW50IGNhbiB0b3VjaCB0cmFjZV9yZWN1cnNpb24gKi8KLSNkZWZpbmUgdHJhY2VfcmVjdXJzaW9uX2luYygpIGRvIHsgKGN1cnJlbnQpLT50cmFjZV9yZWN1cnNpb24rKzsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgdHJhY2VfcmVjdXJzaW9uX2RlYygpIGRvIHsgKGN1cnJlbnQpLT50cmFjZV9yZWN1cnNpb24tLTsgfSB3aGlsZSAoMCkKLQotLyogUmluZyBidWZmZXIgaGFzIHRoZSAxMCBMU0IgYml0cyB0byBjb3VudCAqLwotI2RlZmluZSB0cmFjZV9yZWN1cnNpb25fYnVmZmVyKCkgKChjdXJyZW50KS0+dHJhY2VfcmVjdXJzaW9uICYgMHgzZmYpCi0KLS8qIGZvciBmdW5jdGlvbiB0cmFjaW5nIHJlY3Vyc2lvbiAqLwotI2RlZmluZSBUUkFDRV9JTlRFUk5BTF9CSVQJCSgxPDwxMSkKLSNkZWZpbmUgVFJBQ0VfR0xPQkFMX0JJVAkJKDE8PDEyKQotCi0jZGVmaW5lIHRyYWNlX3JlY3Vyc2lvbl9zZXQoYml0KQlkbyB7IChjdXJyZW50KS0+dHJhY2VfcmVjdXJzaW9uIHw9IChiaXQpOyB9IHdoaWxlICgwKQotI2RlZmluZSB0cmFjZV9yZWN1cnNpb25fY2xlYXIoYml0KQlkbyB7IChjdXJyZW50KS0+dHJhY2VfcmVjdXJzaW9uICY9IH4oYml0KTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgdHJhY2VfcmVjdXJzaW9uX3Rlc3QoYml0KQkoKGN1cnJlbnQpLT50cmFjZV9yZWN1cnNpb24gJiAoYml0KSkKLQogI2VuZGlmIC8qIF9MSU5VWF9LRVJORUxfVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2VudHJpZXMuaCBiL2tlcm5lbC90cmFjZS90cmFjZV9lbnRyaWVzLmgKaW5kZXggZTMyNzQ0Yy4uOTMzNjU5MCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2VudHJpZXMuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZW50cmllcy5oCkBAIC0xNjEsNyArMTYxLDggQEAKIAlUUkFDRV9TVEFDSywKIAogCUZfU1RSVUNUKAotCQlfX2FycmF5KAl1bnNpZ25lZCBsb25nLAljYWxsZXIsIEZUUkFDRV9TVEFDS19FTlRSSUVTCSkKKwkJX19maWVsZCgJaW50LAkJc2l6ZQkpCisJCV9fZHluYW1pY19hcnJheSh1bnNpZ25lZCBsb25nLAljYWxsZXIJKQogCSksCiAKIAlGX3ByaW50aygiXHQ9PiAoJTA4bHgpXG5cdD0+ICglMDhseClcblx0PT4gKCUwOGx4KVxuXHQ9PiAoJTA4bHgpXG4iCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMKaW5kZXggNjg2ZWMzOS4uNTgxODc2ZiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50cy5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYwpAQCAtMjQ0LDYgKzI0NCwzNSBAQAogCW11dGV4X3VubG9jaygmZXZlbnRfbXV0ZXgpOwogfQogCitzdGF0aWMgdm9pZCBfX3B1dF9zeXN0ZW0oc3RydWN0IGV2ZW50X3N1YnN5c3RlbSAqc3lzdGVtKQoreworCXN0cnVjdCBldmVudF9maWx0ZXIgKmZpbHRlciA9IHN5c3RlbS0+ZmlsdGVyOworCisJV0FSTl9PTl9PTkNFKHN5c3RlbS0+cmVmX2NvdW50ID09IDApOworCWlmICgtLXN5c3RlbS0+cmVmX2NvdW50KQorCQlyZXR1cm47CisKKwlpZiAoZmlsdGVyKSB7CisJCWtmcmVlKGZpbHRlci0+ZmlsdGVyX3N0cmluZyk7CisJCWtmcmVlKGZpbHRlcik7CisJfQorCWtmcmVlKHN5c3RlbS0+bmFtZSk7CisJa2ZyZWUoc3lzdGVtKTsKK30KKworc3RhdGljIHZvaWQgX19nZXRfc3lzdGVtKHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSkKK3sKKwlXQVJOX09OX09OQ0Uoc3lzdGVtLT5yZWZfY291bnQgPT0gMCk7CisJc3lzdGVtLT5yZWZfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQgcHV0X3N5c3RlbShzdHJ1Y3QgZXZlbnRfc3Vic3lzdGVtICpzeXN0ZW0pCit7CisJbXV0ZXhfbG9jaygmZXZlbnRfbXV0ZXgpOworCV9fcHV0X3N5c3RlbShzeXN0ZW0pOworCW11dGV4X3VubG9jaygmZXZlbnRfbXV0ZXgpOworfQorCiAvKgogICogX19mdHJhY2Vfc2V0X2Nscl9ldmVudChOVUxMLCBOVUxMLCBOVUxMLCBzZXQpIHdpbGwgc2V0L3Vuc2V0IGFsbCBldmVudHMuCiAgKi8KQEAgLTQ4NiwyMCArNTE1LDExIEBACiAJCSAgIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbNjRdOwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCWludCByZXQ7CiAKLQlpZiAoY250ID49IHNpemVvZihidWYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmLCB1YnVmLCBjbnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWJ1ZltjbnRdID0gMDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChyZXQgPCAwKQorCXJldCA9IGtzdHJ0b3VsX2Zyb21fdXNlcih1YnVmLCBjbnQsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gdHJhY2luZ191cGRhdGVfYnVmZmVycygpOwpAQCAtNTI4LDcgKzU0OCw3IEBACiAJCSAgIGxvZmZfdCAqcHBvcykKIHsKIAljb25zdCBjaGFyIHNldF90b19jaGFyWzRdID0geyAnPycsICcwJywgJzEnLCAnWCcgfTsKLQljb25zdCBjaGFyICpzeXN0ZW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGV2ZW50X3N1YnN5c3RlbSAqc3lzdGVtID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbDsKIAljaGFyIGJ1ZlsyXTsKIAlpbnQgc2V0ID0gMDsKQEAgLTUzOSw3ICs1NTksNyBAQAogCQlpZiAoIWNhbGwtPm5hbWUgfHwgIWNhbGwtPmNsYXNzIHx8ICFjYWxsLT5jbGFzcy0+cmVnKQogCQkJY29udGludWU7CiAKLQkJaWYgKHN5c3RlbSAmJiBzdHJjbXAoY2FsbC0+Y2xhc3MtPnN5c3RlbSwgc3lzdGVtKSAhPSAwKQorCQlpZiAoc3lzdGVtICYmIHN0cmNtcChjYWxsLT5jbGFzcy0+c3lzdGVtLCBzeXN0ZW0tPm5hbWUpICE9IDApCiAJCQljb250aW51ZTsKIAogCQkvKgpAQCAtNTY5LDIxICs1ODksMTMgQEAKIHN5c3RlbV9lbmFibGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY250LAogCQkgICAgbG9mZl90ICpwcG9zKQogewotCWNvbnN0IGNoYXIgKnN5c3RlbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZXZlbnRfc3Vic3lzdGVtICpzeXN0ZW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyB2YWw7Ci0JY2hhciBidWZbNjRdOwogCXNzaXplX3QgcmV0OwogCi0JaWYgKGNudCA+PSBzaXplb2YoYnVmKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgdWJ1ZiwgY250KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlidWZbY250XSA9IDA7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgJnZhbCk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCXJldCA9IHRyYWNpbmdfdXBkYXRlX2J1ZmZlcnMoKTsKQEAgLTU5Myw3ICs2MDUsMTQgQEAKIAlpZiAodmFsICE9IDAgJiYgdmFsICE9IDEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gX19mdHJhY2Vfc2V0X2Nscl9ldmVudChOVUxMLCBzeXN0ZW0sIE5VTEwsIHZhbCk7CisJLyoKKwkgKiBPcGVuaW5nIG9mICJlbmFibGUiIGFkZHMgYSByZWYgY291bnQgdG8gc3lzdGVtLAorCSAqIHNvIHRoZSBuYW1lIGlzIHNhZmUgdG8gdXNlLgorCSAqLworCWlmIChzeXN0ZW0pCisJCW5hbWUgPSBzeXN0ZW0tPm5hbWU7CisKKwlyZXQgPSBfX2Z0cmFjZV9zZXRfY2xyX2V2ZW50KE5VTEwsIG5hbWUsIE5VTEwsIHZhbCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKQEAgLTgyNiw2ICs4NDUsNTIgQEAKIAlyZXR1cm4gY250OwogfQogCitzdGF0aWMgTElTVF9IRUFEKGV2ZW50X3N1YnN5c3RlbXMpOworCitzdGF0aWMgaW50IHN1YnN5c3RlbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSA9IE5VTEw7CisJaW50IHJldDsKKworCWlmICghaW5vZGUtPmlfcHJpdmF0ZSkKKwkJZ290byBza2lwX3NlYXJjaDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgc3lzdGVtIHN0aWxsIGV4aXN0cyAqLworCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN5c3RlbSwgJmV2ZW50X3N1YnN5c3RlbXMsIGxpc3QpIHsKKwkJaWYgKHN5c3RlbSA9PSBpbm9kZS0+aV9wcml2YXRlKSB7CisJCQkvKiBEb24ndCBvcGVuIHN5c3RlbXMgd2l0aCBubyBldmVudHMgKi8KKwkJCWlmICghc3lzdGVtLT5ucl9ldmVudHMpIHsKKwkJCQlzeXN0ZW0gPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQkJX19nZXRfc3lzdGVtKHN5c3RlbSk7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKKworCWlmIChzeXN0ZW0gIT0gaW5vZGUtPmlfcHJpdmF0ZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKyBza2lwX3NlYXJjaDoKKwlyZXQgPSB0cmFjaW5nX29wZW5fZ2VuZXJpYyhpbm9kZSwgZmlscCk7CisJaWYgKHJldCA8IDAgJiYgc3lzdGVtKQorCQlwdXRfc3lzdGVtKHN5c3RlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN1YnN5c3RlbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSA9IGlub2RlLT5pX3ByaXZhdGU7CisKKwlpZiAoc3lzdGVtKQorCQlwdXRfc3lzdGVtKHN5c3RlbSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHNzaXplX3QKIHN1YnN5c3RlbV9maWx0ZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsCiAJCSAgICAgIGxvZmZfdCAqcHBvcykKQEAgLTk2MywxNyArMTAyOCwxOSBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnRyYWNlX3N1YnN5c3RlbV9maWx0ZXJfZm9wcyA9IHsKLQkub3BlbiA9IHRyYWNpbmdfb3Blbl9nZW5lcmljLAorCS5vcGVuID0gc3Vic3lzdGVtX29wZW4sCiAJLnJlYWQgPSBzdWJzeXN0ZW1fZmlsdGVyX3JlYWQsCiAJLndyaXRlID0gc3Vic3lzdGVtX2ZpbHRlcl93cml0ZSwKIAkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCisJLnJlbGVhc2UgPSBzdWJzeXN0ZW1fcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ0cmFjZV9zeXN0ZW1fZW5hYmxlX2ZvcHMgPSB7Ci0JLm9wZW4gPSB0cmFjaW5nX29wZW5fZ2VuZXJpYywKKwkub3BlbiA9IHN1YnN5c3RlbV9vcGVuLAogCS5yZWFkID0gc3lzdGVtX2VuYWJsZV9yZWFkLAogCS53cml0ZSA9IHN5c3RlbV9lbmFibGVfd3JpdGUsCiAJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorCS5yZWxlYXNlID0gc3Vic3lzdGVtX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdHJhY2Vfc2hvd19oZWFkZXJfZm9wcyA9IHsKQEAgLTEwMDIsOCArMTA2OSw2IEBACiAJcmV0dXJuIGRfZXZlbnRzOwogfQogCi1zdGF0aWMgTElTVF9IRUFEKGV2ZW50X3N1YnN5c3RlbXMpOwotCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqCiBldmVudF9zdWJzeXN0ZW1fZGlyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKmRfZXZlbnRzKQogewpAQCAtMTAxMyw2ICsxMDc4LDcgQEAKIAkvKiBGaXJzdCBzZWUgaWYgd2UgZGlkIG5vdCBhbHJlYWR5IGNyZWF0ZSB0aGlzIGRpciAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoc3lzdGVtLCAmZXZlbnRfc3Vic3lzdGVtcywgbGlzdCkgewogCQlpZiAoc3RyY21wKHN5c3RlbS0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJX19nZXRfc3lzdGVtKHN5c3RlbSk7CiAJCQlzeXN0ZW0tPm5yX2V2ZW50cysrOwogCQkJcmV0dXJuIHN5c3RlbS0+ZW50cnk7CiAJCX0KQEAgLTEwMzUsNiArMTEwMSw3IEBACiAJfQogCiAJc3lzdGVtLT5ucl9ldmVudHMgPSAxOworCXN5c3RlbS0+cmVmX2NvdW50ID0gMTsKIAlzeXN0ZW0tPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOwogCWlmICghc3lzdGVtLT5uYW1lKSB7CiAJCWRlYnVnZnNfcmVtb3ZlKHN5c3RlbS0+ZW50cnkpOwpAQCAtMTA2Miw4ICsxMTI5LDcgQEAKIAkJCSAgICInJXMvZmlsdGVyJyBlbnRyeVxuIiwgbmFtZSk7CiAJfQogCi0JdHJhY2VfY3JlYXRlX2ZpbGUoImVuYWJsZSIsIDA2NDQsIHN5c3RlbS0+ZW50cnksCi0JCQkgICh2b2lkICopc3lzdGVtLT5uYW1lLAorCXRyYWNlX2NyZWF0ZV9maWxlKCJlbmFibGUiLCAwNjQ0LCBzeXN0ZW0tPmVudHJ5LCBzeXN0ZW0sCiAJCQkgICZmdHJhY2Vfc3lzdGVtX2VuYWJsZV9mb3BzKTsKIAogCXJldHVybiBzeXN0ZW0tPmVudHJ5OwpAQCAtMTE4NCwxNiArMTI1MCw5IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzeXN0ZW0sICZldmVudF9zdWJzeXN0ZW1zLCBsaXN0KSB7CiAJCWlmIChzdHJjbXAoc3lzdGVtLT5uYW1lLCBuYW1lKSA9PSAwKSB7CiAJCQlpZiAoIS0tc3lzdGVtLT5ucl9ldmVudHMpIHsKLQkJCQlzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIgPSBzeXN0ZW0tPmZpbHRlcjsKLQogCQkJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShzeXN0ZW0tPmVudHJ5KTsKIAkJCQlsaXN0X2RlbCgmc3lzdGVtLT5saXN0KTsKLQkJCQlpZiAoZmlsdGVyKSB7Ci0JCQkJCWtmcmVlKGZpbHRlci0+ZmlsdGVyX3N0cmluZyk7Ci0JCQkJCWtmcmVlKGZpbHRlcik7Ci0JCQkJfQotCQkJCWtmcmVlKHN5c3RlbS0+bmFtZSk7Ci0JCQkJa2ZyZWUoc3lzdGVtKTsKKwkJCQlfX3B1dF9zeXN0ZW0oc3lzdGVtKTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX2ZpbHRlci5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19maWx0ZXIuYwppbmRleCA4MDA4ZGRjLi4yNTY3NjRlIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX2ZpbHRlci5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfZmlsdGVyLmMKQEAgLTE4ODYsNiArMTg4NiwxMiBAQAogCiAJbXV0ZXhfbG9jaygmZXZlbnRfbXV0ZXgpOwogCisJLyogTWFrZSBzdXJlIHRoZSBzeXN0ZW0gc3RpbGwgaGFzIGV2ZW50cyAqLworCWlmICghc3lzdGVtLT5ucl9ldmVudHMpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwogCWlmICghc3RyY21wKHN0cnN0cmlwKGZpbHRlcl9zdHJpbmcpLCAiMCIpKSB7CiAJCWZpbHRlcl9mcmVlX3N1YnN5c3RlbV9wcmVkcyhzeXN0ZW0pOwogCQlyZW1vdmVfZmlsdGVyX3N0cmluZyhzeXN0ZW0tPmZpbHRlcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zLmMKaW5kZXggOGQwZTFjYy4uYzdiMGM2YSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9ucy5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnMuYwpAQCAtMzI0LDcgKzMyNCw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWZ0cmFjZV90cmFjZV9vbm9mZl9jYWxsYmFjayhjaGFyICpnbG9iLCBjaGFyICpjbWQsIGNoYXIgKnBhcmFtLCBpbnQgZW5hYmxlKQorZnRyYWNlX3RyYWNlX29ub2ZmX2NhbGxiYWNrKHN0cnVjdCBmdHJhY2VfaGFzaCAqaGFzaCwKKwkJCSAgICBjaGFyICpnbG9iLCBjaGFyICpjbWQsIGNoYXIgKnBhcmFtLCBpbnQgZW5hYmxlKQogewogCXN0cnVjdCBmdHJhY2VfcHJvYmVfb3BzICpvcHM7CiAJdm9pZCAqY291bnQgPSAodm9pZCAqKS0xOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jCmluZGV4IDk2MmNkYjIuLmE3ZDJhNGMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMKQEAgLTc0LDYgKzc0LDIwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgdHJhY2VfYXJyYXkgKmdyYXBoX2FycmF5OwogCisvKgorICogRFVSQVRJT04gY29sdW1uIGlzIGJlaW5nIGFsc28gdXNlZCB0byBkaXNwbGF5IElSUSBzaWducywKKyAqIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgYnkgcHJpbnRfZ3JhcGhfaXJxIGFuZCBvdGhlcnMKKyAqIHRvIGZpbGwgaW4gc3BhY2UgaW50byBEVVJBVElPTiBjb2x1bW4uCisgKi8KK2VudW0geworCURVUkFUSU9OX0ZJTExfRlVMTCAgPSAtMSwKKwlEVVJBVElPTl9GSUxMX1NUQVJUID0gLTIsCisJRFVSQVRJT05fRklMTF9FTkQgICA9IC0zLAorfTsKKworc3RhdGljIGVudW0gcHJpbnRfbGluZV90CitwcmludF9ncmFwaF9kdXJhdGlvbih1bnNpZ25lZCBsb25nIGxvbmcgZHVyYXRpb24sIHN0cnVjdCB0cmFjZV9zZXEgKnMsCisJCSAgICAgdTMyIGZsYWdzKTsKIAogLyogQWRkIGEgZnVuY3Rpb24gcmV0dXJuIGFkZHJlc3MgdG8gdGhlIHRyYWNlIHN0YWNrIG9uIHRocmVhZCBpbmZvLiovCiBpbnQKQEAgLTIxMyw3ICsyMjcsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBmdHJhY2VfZ3JhcGhfaWdub3JlX2lycXModm9pZCkKIHsKLQlpZiAoIWZ0cmFjZV9ncmFwaF9za2lwX2lycXMpCisJaWYgKCFmdHJhY2VfZ3JhcGhfc2tpcF9pcnFzIHx8IHRyYWNlX3JlY3Vyc2lvbl90ZXN0KFRSQUNFX0lSUV9CSVQpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBpbl9pcnEoKTsKQEAgLTU3NywzMiArNTkxLDYgQEAKIAlyZXR1cm4gbmV4dDsKIH0KIAotLyogU2lnbmFsIGEgb3ZlcmhlYWQgb2YgdGltZSBleGVjdXRpb24gdG8gdGhlIG91dHB1dCAqLwotc3RhdGljIGludAotcHJpbnRfZ3JhcGhfb3ZlcmhlYWQodW5zaWduZWQgbG9uZyBsb25nIGR1cmF0aW9uLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzLAotCQkgICAgIHUzMiBmbGFncykKLXsKLQkvKiBJZiBkdXJhdGlvbiBkaXNhcHBlYXIsIHdlIGRvbid0IG5lZWQgYW55dGhpbmcgKi8KLQlpZiAoIShmbGFncyAmIFRSQUNFX0dSQVBIX1BSSU5UX0RVUkFUSU9OKSkKLQkJcmV0dXJuIDE7Ci0KLQkvKiBOb24gbmVzdGVkIGVudHJ5IG9yIHJldHVybiAqLwotCWlmIChkdXJhdGlvbiA9PSAtMSkKLQkJcmV0dXJuIHRyYWNlX3NlcV9wcmludGYocywgIiAgIik7Ci0KLQlpZiAoZmxhZ3MgJiBUUkFDRV9HUkFQSF9QUklOVF9PVkVSSEVBRCkgewotCQkvKiBEdXJhdGlvbiBleGNlZWRlZCAxMDAgbXNlY3MgKi8KLQkJaWYgKGR1cmF0aW9uID4gMTAwMDAwVUxMKQotCQkJcmV0dXJuIHRyYWNlX3NlcV9wcmludGYocywgIiEgIik7Ci0KLQkJLyogRHVyYXRpb24gZXhjZWVkZWQgMTAgbXNlY3MgKi8KLQkJaWYgKGR1cmF0aW9uID4gMTAwMDBVTEwpCi0JCQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiKyAiKTsKLQl9Ci0KLQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiICAiKTsKLX0KLQogc3RhdGljIGludCBwcmludF9ncmFwaF9hYnNfdGltZSh1NjQgdCwgc3RydWN0IHRyYWNlX3NlcSAqcykKIHsKIAl1bnNpZ25lZCBsb25nIHVzZWNzX3JlbTsKQEAgLTYyNSwzNCArNjEzLDM2IEBACiAJCWFkZHIgPj0gKHVuc2lnbmVkIGxvbmcpX19pcnFlbnRyeV90ZXh0X2VuZCkKIAkJcmV0dXJuIFRSQUNFX1RZUEVfVU5IQU5ETEVEOwogCi0JLyogQWJzb2x1dGUgdGltZSAqLwotCWlmIChmbGFncyAmIFRSQUNFX0dSQVBIX1BSSU5UX0FCU19USU1FKSB7Ci0JCXJldCA9IHByaW50X2dyYXBoX2Fic190aW1lKGl0ZXItPnRzLCBzKTsKLQkJaWYgKCFyZXQpCi0JCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0JfQorCWlmICh0cmFjZV9mbGFncyAmIFRSQUNFX0lURVJfQ09OVEVYVF9JTkZPKSB7CisJCS8qIEFic29sdXRlIHRpbWUgKi8KKwkJaWYgKGZsYWdzICYgVFJBQ0VfR1JBUEhfUFJJTlRfQUJTX1RJTUUpIHsKKwkJCXJldCA9IHByaW50X2dyYXBoX2Fic190aW1lKGl0ZXItPnRzLCBzKTsKKwkJCWlmICghcmV0KQorCQkJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKKwkJfQogCi0JLyogQ3B1ICovCi0JaWYgKGZsYWdzICYgVFJBQ0VfR1JBUEhfUFJJTlRfQ1BVKSB7Ci0JCXJldCA9IHByaW50X2dyYXBoX2NwdShzLCBjcHUpOwotCQlpZiAocmV0ID09IFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FKQotCQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwotCX0KKwkJLyogQ3B1ICovCisJCWlmIChmbGFncyAmIFRSQUNFX0dSQVBIX1BSSU5UX0NQVSkgeworCQkJcmV0ID0gcHJpbnRfZ3JhcGhfY3B1KHMsIGNwdSk7CisJCQlpZiAocmV0ID09IFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FKQorCQkJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKKwkJfQogCi0JLyogUHJvYyAqLwotCWlmIChmbGFncyAmIFRSQUNFX0dSQVBIX1BSSU5UX1BST0MpIHsKLQkJcmV0ID0gcHJpbnRfZ3JhcGhfcHJvYyhzLCBwaWQpOwotCQlpZiAocmV0ID09IFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FKQotCQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwotCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIgfCAiKTsKLQkJaWYgKCFyZXQpCi0JCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CisJCS8qIFByb2MgKi8KKwkJaWYgKGZsYWdzICYgVFJBQ0VfR1JBUEhfUFJJTlRfUFJPQykgeworCQkJcmV0ID0gcHJpbnRfZ3JhcGhfcHJvYyhzLCBwaWQpOworCQkJaWYgKHJldCA9PSBUUkFDRV9UWVBFX1BBUlRJQUxfTElORSkKKwkJCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CisJCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIgfCAiKTsKKwkJCWlmICghcmV0KQorCQkJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKKwkJfQogCX0KIAogCS8qIE5vIG92ZXJoZWFkICovCi0JcmV0ID0gcHJpbnRfZ3JhcGhfb3ZlcmhlYWQoLTEsIHMsIGZsYWdzKTsKLQlpZiAoIXJldCkKLQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOworCXJldCA9IHByaW50X2dyYXBoX2R1cmF0aW9uKERVUkFUSU9OX0ZJTExfU1RBUlQsIHMsIGZsYWdzKTsKKwlpZiAocmV0ICE9IFRSQUNFX1RZUEVfSEFORExFRCkKKwkJcmV0dXJuIHJldDsKIAogCWlmICh0eXBlID09IFRSQUNFX0dSQVBIX0VOVCkKIAkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiPT09PT09PT09PT4iKTsKQEAgLTY2Miw5ICs2NTIsMTAgQEAKIAlpZiAoIXJldCkKIAkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwogCi0JLyogRG9uJ3QgY2xvc2UgdGhlIGR1cmF0aW9uIGNvbHVtbiBpZiBoYXZlbid0IG9uZSAqLwotCWlmIChmbGFncyAmIFRSQUNFX0dSQVBIX1BSSU5UX0RVUkFUSU9OKQotCQl0cmFjZV9zZXFfcHJpbnRmKHMsICIgfCIpOworCXJldCA9IHByaW50X2dyYXBoX2R1cmF0aW9uKERVUkFUSU9OX0ZJTExfRU5ELCBzLCBmbGFncyk7CisJaWYgKHJldCAhPSBUUkFDRV9UWVBFX0hBTkRMRUQpCisJCXJldHVybiByZXQ7CisKIAlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcbiIpOwogCiAJaWYgKCFyZXQpCkBAIC03MTYsOSArNzA3LDQ5IEBACiB9CiAKIHN0YXRpYyBlbnVtIHByaW50X2xpbmVfdAotcHJpbnRfZ3JhcGhfZHVyYXRpb24odW5zaWduZWQgbG9uZyBsb25nIGR1cmF0aW9uLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKQorcHJpbnRfZ3JhcGhfZHVyYXRpb24odW5zaWduZWQgbG9uZyBsb25nIGR1cmF0aW9uLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzLAorCQkgICAgIHUzMiBmbGFncykKIHsKLQlpbnQgcmV0OworCWludCByZXQgPSAtMTsKKworCWlmICghKGZsYWdzICYgVFJBQ0VfR1JBUEhfUFJJTlRfRFVSQVRJT04pIHx8CisJICAgICEodHJhY2VfZmxhZ3MgJiBUUkFDRV9JVEVSX0NPTlRFWFRfSU5GTykpCisJCQlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOworCisJLyogTm8gcmVhbCBhZGF0YSwganVzdCBmaWxsaW5nIHRoZSBjb2x1bW4gd2l0aCBzcGFjZXMgKi8KKwlzd2l0Y2ggKGR1cmF0aW9uKSB7CisJY2FzZSBEVVJBVElPTl9GSUxMX0ZVTEw6CisJCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiAgICAgICAgICAgICAgfCAgIik7CisJCXJldHVybiByZXQgPyBUUkFDRV9UWVBFX0hBTkRMRUQgOiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKKwljYXNlIERVUkFUSU9OX0ZJTExfU1RBUlQ6CisJCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiAgIik7CisJCXJldHVybiByZXQgPyBUUkFDRV9UWVBFX0hBTkRMRUQgOiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKKwljYXNlIERVUkFUSU9OX0ZJTExfRU5EOgorCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIgfCIpOworCQlyZXR1cm4gcmV0ID8gVFJBQ0VfVFlQRV9IQU5ETEVEIDogVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CisJfQorCisJLyogU2lnbmFsIGEgb3ZlcmhlYWQgb2YgdGltZSBleGVjdXRpb24gdG8gdGhlIG91dHB1dCAqLworCWlmIChmbGFncyAmIFRSQUNFX0dSQVBIX1BSSU5UX09WRVJIRUFEKSB7CisJCS8qIER1cmF0aW9uIGV4Y2VlZGVkIDEwMCBtc2VjcyAqLworCQlpZiAoZHVyYXRpb24gPiAxMDAwMDBVTEwpCisJCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIhICIpOworCQkvKiBEdXJhdGlvbiBleGNlZWRlZCAxMCBtc2VjcyAqLworCQllbHNlIGlmIChkdXJhdGlvbiA+IDEwMDAwVUxMKQorCQkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiKyAiKTsKKwl9CisKKwkvKgorCSAqIFRoZSAtMSBtZWFucyB3ZSBlaXRoZXIgZGlkIG5vdCBleGNlZWQgdGhlIGR1cmF0aW9uIHRyZXNob2xkcworCSAqIG9yIHdlIGRvbnQgd2FudCB0byBwcmludCBvdXQgdGhlIG92ZXJoZWFkLiBFaXRoZXIgd2F5IHdlIG5lZWQKKwkgKiB0byBmaWxsIG91dCB0aGUgc3BhY2UuCisJICovCisJaWYgKHJldCA9PSAtMSkKKwkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiICAiKTsKKworCS8qIENhdGNoaW5nIGhlcmUgYW55IGZhaWx1cmUgaGFwcGVubmVkIGFib3ZlICovCisJaWYgKCFyZXQpCisJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKIAogCXJldCA9IHRyYWNlX3ByaW50X2dyYXBoX2R1cmF0aW9uKGR1cmF0aW9uLCBzKTsKIAlpZiAocmV0ICE9IFRSQUNFX1RZUEVfSEFORExFRCkKQEAgLTc2NywxOCArNzk4LDExIEBACiAJCQljcHVfZGF0YS0+ZW50ZXJfZnVuY3NbY2FsbC0+ZGVwdGhdID0gMDsKIAl9CiAKLQkvKiBPdmVyaGVhZCAqLwotCXJldCA9IHByaW50X2dyYXBoX292ZXJoZWFkKGR1cmF0aW9uLCBzLCBmbGFncyk7Ci0JaWYgKCFyZXQpCisJLyogT3ZlcmhlYWQgYW5kIGR1cmF0aW9uICovCisJcmV0ID0gcHJpbnRfZ3JhcGhfZHVyYXRpb24oZHVyYXRpb24sIHMsIGZsYWdzKTsKKwlpZiAocmV0ID09IFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FKQogCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CiAKLQkvKiBEdXJhdGlvbiAqLwotCWlmIChmbGFncyAmIFRSQUNFX0dSQVBIX1BSSU5UX0RVUkFUSU9OKSB7Ci0JCXJldCA9IHByaW50X2dyYXBoX2R1cmF0aW9uKGR1cmF0aW9uLCBzKTsKLQkJaWYgKHJldCA9PSBUUkFDRV9UWVBFX1BBUlRJQUxfTElORSkKLQkJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQl9Ci0KIAkvKiBGdW5jdGlvbiAqLwogCWZvciAoaSA9IDA7IGkgPCBjYWxsLT5kZXB0aCAqIFRSQUNFX0dSQVBIX0lOREVOVDsgaSsrKSB7CiAJCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiAiKTsKQEAgLTgxNSwxNyArODM5LDEwIEBACiAJCQljcHVfZGF0YS0+ZW50ZXJfZnVuY3NbY2FsbC0+ZGVwdGhdID0gY2FsbC0+ZnVuYzsKIAl9CiAKLQkvKiBObyBvdmVyaGVhZCAqLwotCXJldCA9IHByaW50X2dyYXBoX292ZXJoZWFkKC0xLCBzLCBmbGFncyk7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQogCS8qIE5vIHRpbWUgKi8KLQlpZiAoZmxhZ3MgJiBUUkFDRV9HUkFQSF9QUklOVF9EVVJBVElPTikgewotCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIgICAgICAgICAgICB8ICAiKTsKLQkJaWYgKCFyZXQpCi0JCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0JfQorCXJldCA9IHByaW50X2dyYXBoX2R1cmF0aW9uKERVUkFUSU9OX0ZJTExfRlVMTCwgcywgZmxhZ3MpOworCWlmIChyZXQgIT0gVFJBQ0VfVFlQRV9IQU5ETEVEKQorCQlyZXR1cm4gcmV0OwogCiAJLyogRnVuY3Rpb24gKi8KIAlmb3IgKGkgPSAwOyBpIDwgY2FsbC0+ZGVwdGggKiBUUkFDRV9HUkFQSF9JTkRFTlQ7IGkrKykgewpAQCAtODY1LDYgKzg4Miw5IEBACiAJCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CiAJfQogCisJaWYgKCEodHJhY2VfZmxhZ3MgJiBUUkFDRV9JVEVSX0NPTlRFWFRfSU5GTykpCisJCXJldHVybiAwOworCiAJLyogQWJzb2x1dGUgdGltZSAqLwogCWlmIChmbGFncyAmIFRSQUNFX0dSQVBIX1BSSU5UX0FCU19USU1FKSB7CiAJCXJldCA9IHByaW50X2dyYXBoX2Fic190aW1lKGl0ZXItPnRzLCBzKTsKQEAgLTEwNzgsMTggKzEwOTgsMTEgQEAKIAlpZiAocHJpbnRfZ3JhcGhfcHJvbG9ndWUoaXRlciwgcywgMCwgMCwgZmxhZ3MpKQogCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CiAKLQkvKiBPdmVyaGVhZCAqLwotCXJldCA9IHByaW50X2dyYXBoX292ZXJoZWFkKGR1cmF0aW9uLCBzLCBmbGFncyk7Ci0JaWYgKCFyZXQpCisJLyogT3ZlcmhlYWQgYW5kIGR1cmF0aW9uICovCisJcmV0ID0gcHJpbnRfZ3JhcGhfZHVyYXRpb24oZHVyYXRpb24sIHMsIGZsYWdzKTsKKwlpZiAocmV0ID09IFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FKQogCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CiAKLQkvKiBEdXJhdGlvbiAqLwotCWlmIChmbGFncyAmIFRSQUNFX0dSQVBIX1BSSU5UX0RVUkFUSU9OKSB7Ci0JCXJldCA9IHByaW50X2dyYXBoX2R1cmF0aW9uKGR1cmF0aW9uLCBzKTsKLQkJaWYgKHJldCA9PSBUUkFDRV9UWVBFX1BBUlRJQUxfTElORSkKLQkJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQl9Ci0KIAkvKiBDbG9zaW5nIGJyYWNlICovCiAJZm9yIChpID0gMDsgaSA8IHRyYWNlLT5kZXB0aCAqIFRSQUNFX0dSQVBIX0lOREVOVDsgaSsrKSB7CiAJCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiAiKTsKQEAgLTExNDYsMTcgKzExNTksMTAgQEAKIAlpZiAocHJpbnRfZ3JhcGhfcHJvbG9ndWUoaXRlciwgcywgMCwgMCwgZmxhZ3MpKQogCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CiAKLQkvKiBObyBvdmVyaGVhZCAqLwotCXJldCA9IHByaW50X2dyYXBoX292ZXJoZWFkKC0xLCBzLCBmbGFncyk7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQogCS8qIE5vIHRpbWUgKi8KLQlpZiAoZmxhZ3MgJiBUUkFDRV9HUkFQSF9QUklOVF9EVVJBVElPTikgewotCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIgICAgICAgICAgICB8ICAiKTsKLQkJaWYgKCFyZXQpCi0JCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0JfQorCXJldCA9IHByaW50X2dyYXBoX2R1cmF0aW9uKERVUkFUSU9OX0ZJTExfRlVMTCwgcywgZmxhZ3MpOworCWlmIChyZXQgIT0gVFJBQ0VfVFlQRV9IQU5ETEVEKQorCQlyZXR1cm4gcmV0OwogCiAJLyogSW5kZW50YXRpb24gKi8KIAlpZiAoZGVwdGggPiAwKQpAQCAtMTIwNyw3ICsxMjEzLDcgQEAKIAogCiBlbnVtIHByaW50X2xpbmVfdAotX19wcmludF9ncmFwaF9mdW5jdGlvbl9mbGFncyhzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIHUzMiBmbGFncykKK3ByaW50X2dyYXBoX2Z1bmN0aW9uX2ZsYWdzKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwgdTMyIGZsYWdzKQogewogCXN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50X2VudHJ5ICpmaWVsZDsKIAlzdHJ1Y3QgZmdyYXBoX2RhdGEgKmRhdGEgPSBpdGVyLT5wcml2YXRlOwpAQCAtMTI3MCwxOCArMTI3Niw3IEBACiBzdGF0aWMgZW51bSBwcmludF9saW5lX3QKIHByaW50X2dyYXBoX2Z1bmN0aW9uKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKIHsKLQlyZXR1cm4gX19wcmludF9ncmFwaF9mdW5jdGlvbl9mbGFncyhpdGVyLCB0cmFjZXJfZmxhZ3MudmFsKTsKLX0KLQotZW51bSBwcmludF9saW5lX3QgcHJpbnRfZ3JhcGhfZnVuY3Rpb25fZmxhZ3Moc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLAotCQkJCQkgICAgIHUzMiBmbGFncykKLXsKLQlpZiAodHJhY2VfZmxhZ3MgJiBUUkFDRV9JVEVSX0xBVEVOQ1lfRk1UKQotCQlmbGFncyB8PSBUUkFDRV9HUkFQSF9QUklOVF9EVVJBVElPTjsKLQllbHNlCi0JCWZsYWdzIHw9IFRSQUNFX0dSQVBIX1BSSU5UX0FCU19USU1FOwotCi0JcmV0dXJuIF9fcHJpbnRfZ3JhcGhfZnVuY3Rpb25fZmxhZ3MoaXRlciwgZmxhZ3MpOworCXJldHVybiBwcmludF9ncmFwaF9mdW5jdGlvbl9mbGFncyhpdGVyLCB0cmFjZXJfZmxhZ3MudmFsKTsKIH0KIAogc3RhdGljIGVudW0gcHJpbnRfbGluZV90CkBAIC0xMzA5LDggKzEzMDQsNyBAQAogCXNlcV9wcmludGYocywgIiMlLipzIC8gXy0tLS09PiBuZWVkLXJlc2NoZWQgICAgXG4iLCBzaXplLCBzcGFjZXMpOwogCXNlcV9wcmludGYocywgIiMlLipzfCAvIF8tLS09PiBoYXJkaXJxL3NvZnRpcnEgXG4iLCBzaXplLCBzcGFjZXMpOwogCXNlcV9wcmludGYocywgIiMlLipzfHwgLyBfLS09PiBwcmVlbXB0LWRlcHRoICAgXG4iLCBzaXplLCBzcGFjZXMpOwotCXNlcV9wcmludGYocywgIiMlLipzfHx8IC8gXy09PiBsb2NrLWRlcHRoICAgICAgXG4iLCBzaXplLCBzcGFjZXMpOwotCXNlcV9wcmludGYocywgIiMlLipzfHx8fCAvICAgICAgICAgICAgICAgICAgICAgXG4iLCBzaXplLCBzcGFjZXMpOworCXNlcV9wcmludGYocywgIiMlLipzfHx8IC8gICAgICAgICAgICAgICAgICAgICAgXG4iLCBzaXplLCBzcGFjZXMpOwogfQogCiBzdGF0aWMgdm9pZCBfX3ByaW50X2dyYXBoX2hlYWRlcnNfZmxhZ3Moc3RydWN0IHNlcV9maWxlICpzLCB1MzIgZmxhZ3MpCkBAIC0xMzI5LDcgKzEzMjMsNyBAQAogCWlmIChmbGFncyAmIFRSQUNFX0dSQVBIX1BSSU5UX1BST0MpCiAJCXNlcV9wcmludGYocywgIiAgVEFTSy9QSUQgICAgICAgIik7CiAJaWYgKGxhdCkKLQkJc2VxX3ByaW50ZihzLCAifHx8fHwiKTsKKwkJc2VxX3ByaW50ZihzLCAifHx8fCIpOwogCWlmIChmbGFncyAmIFRSQUNFX0dSQVBIX1BSSU5UX0RVUkFUSU9OKQogCQlzZXFfcHJpbnRmKHMsICIgIERVUkFUSU9OICAgIik7CiAJc2VxX3ByaW50ZihzLCAiICAgICAgICAgICAgICAgRlVOQ1RJT04gQ0FMTFNcbiIpOwpAQCAtMTM0Myw3ICsxMzM3LDcgQEAKIAlpZiAoZmxhZ3MgJiBUUkFDRV9HUkFQSF9QUklOVF9QUk9DKQogCQlzZXFfcHJpbnRmKHMsICIgICB8ICAgIHwgICAgICAgICIpOwogCWlmIChsYXQpCi0JCXNlcV9wcmludGYocywgInx8fHx8Iik7CisJCXNlcV9wcmludGYocywgInx8fHwiKTsKIAlpZiAoZmxhZ3MgJiBUUkFDRV9HUkFQSF9QUklOVF9EVVJBVElPTikKIAkJc2VxX3ByaW50ZihzLCAiICAgfCAgIHwgICAgICAiKTsKIAlzZXFfcHJpbnRmKHMsICIgICAgICAgICAgICAgICB8ICAgfCAgIHwgICB8XG4iKTsKQEAgLTEzNTgsMTUgKzEzNTIsMTYgQEAKIHsKIAlzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIgPSBzLT5wcml2YXRlOwogCisJaWYgKCEodHJhY2VfZmxhZ3MgJiBUUkFDRV9JVEVSX0NPTlRFWFRfSU5GTykpCisJCXJldHVybjsKKwogCWlmICh0cmFjZV9mbGFncyAmIFRSQUNFX0lURVJfTEFURU5DWV9GTVQpIHsKIAkJLyogcHJpbnQgbm90aGluZyBpZiB0aGUgYnVmZmVycyBhcmUgZW1wdHkgKi8KIAkJaWYgKHRyYWNlX2VtcHR5KGl0ZXIpKQogCQkJcmV0dXJuOwogCiAJCXByaW50X3RyYWNlX2hlYWRlcihzLCBpdGVyKTsKLQkJZmxhZ3MgfD0gVFJBQ0VfR1JBUEhfUFJJTlRfRFVSQVRJT047Ci0JfSBlbHNlCi0JCWZsYWdzIHw9IFRSQUNFX0dSQVBIX1BSSU5UX0FCU19USU1FOworCX0KIAogCV9fcHJpbnRfZ3JhcGhfaGVhZGVyc19mbGFncyhzLCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfaXJxc29mZi5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2lycXNvZmYuYwppbmRleCBjNzc0MjRiLi42NjdhYThjIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfaXJxc29mZi5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9pcnFzb2ZmLmMKQEAgLTIyNiw3ICsyMjYsOSBAQAogfQogCiAjZGVmaW5lIEdSQVBIX1RSQUNFUl9GTEFHUyAoVFJBQ0VfR1JBUEhfUFJJTlRfQ1BVIHwgXAotCQkJICAgIFRSQUNFX0dSQVBIX1BSSU5UX1BST0MpCisJCQkgICAgVFJBQ0VfR1JBUEhfUFJJTlRfUFJPQyB8IFwKKwkJCSAgICBUUkFDRV9HUkFQSF9QUklOVF9BQlNfVElNRSB8IFwKKwkJCSAgICBUUkFDRV9HUkFQSF9QUklOVF9EVVJBVElPTikKIAogc3RhdGljIGVudW0gcHJpbnRfbGluZV90IGlycXNvZmZfcHJpbnRfbGluZShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKaW5kZXggZjkyNWM0NS4uNWZiMzY5NyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYwpAQCAtMzQzLDYgKzM0MywxNCBAQAogREVGSU5FX0ZFVENIX2RlcmVmKHN0cmluZykKIERFRklORV9GRVRDSF9kZXJlZihzdHJpbmdfc2l6ZSkKIAorc3RhdGljIF9fa3Byb2JlcyB2b2lkIHVwZGF0ZV9kZXJlZl9mZXRjaF9wYXJhbShzdHJ1Y3QgZGVyZWZfZmV0Y2hfcGFyYW0gKmRhdGEpCit7CisJaWYgKENIRUNLX0ZFVENIX0ZVTkNTKGRlcmVmLCBkYXRhLT5vcmlnLmZuKSkKKwkJdXBkYXRlX2RlcmVmX2ZldGNoX3BhcmFtKGRhdGEtPm9yaWcuZGF0YSk7CisJZWxzZSBpZiAoQ0hFQ0tfRkVUQ0hfRlVOQ1Moc3ltYm9sLCBkYXRhLT5vcmlnLmZuKSkKKwkJdXBkYXRlX3N5bWJvbF9jYWNoZShkYXRhLT5vcmlnLmRhdGEpOworfQorCiBzdGF0aWMgX19rcHJvYmVzIHZvaWQgZnJlZV9kZXJlZl9mZXRjaF9wYXJhbShzdHJ1Y3QgZGVyZWZfZmV0Y2hfcGFyYW0gKmRhdGEpCiB7CiAJaWYgKENIRUNLX0ZFVENIX0ZVTkNTKGRlcmVmLCBkYXRhLT5vcmlnLmZuKSkKQEAgLTM3Nyw2ICszODUsMTkgQEAKICNkZWZpbmUgZmV0Y2hfYml0ZmllbGRfc3RyaW5nX3NpemUgTlVMTAogCiBzdGF0aWMgX19rcHJvYmVzIHZvaWQKK3VwZGF0ZV9iaXRmaWVsZF9mZXRjaF9wYXJhbShzdHJ1Y3QgYml0ZmllbGRfZmV0Y2hfcGFyYW0gKmRhdGEpCit7CisJLyoKKwkgKiBEb24ndCBjaGVjayB0aGUgYml0ZmllbGQgaXRzZWxmLCBiZWNhdXNlIHRoaXMgbXVzdCBiZSB0aGUKKwkgKiBsYXN0IGZldGNoIGZ1bmN0aW9uLgorCSAqLworCWlmIChDSEVDS19GRVRDSF9GVU5DUyhkZXJlZiwgZGF0YS0+b3JpZy5mbikpCisJCXVwZGF0ZV9kZXJlZl9mZXRjaF9wYXJhbShkYXRhLT5vcmlnLmRhdGEpOworCWVsc2UgaWYgKENIRUNLX0ZFVENIX0ZVTkNTKHN5bWJvbCwgZGF0YS0+b3JpZy5mbikpCisJCXVwZGF0ZV9zeW1ib2xfY2FjaGUoZGF0YS0+b3JpZy5kYXRhKTsKK30KKworc3RhdGljIF9fa3Byb2JlcyB2b2lkCiBmcmVlX2JpdGZpZWxkX2ZldGNoX3BhcmFtKHN0cnVjdCBiaXRmaWVsZF9mZXRjaF9wYXJhbSAqZGF0YSkKIHsKIAkvKgpAQCAtMzg5LDYgKzQxMCw3IEBACiAJCWZyZWVfc3ltYm9sX2NhY2hlKGRhdGEtPm9yaWcuZGF0YSk7CiAJa2ZyZWUoZGF0YSk7CiB9CisKIC8qIERlZmF1bHQgKHVuc2lnbmVkIGxvbmcpIGZldGNoIHR5cGUgKi8KICNkZWZpbmUgX19ERUZBVUxUX0ZFVENIX1RZUEUodCkgdSMjdAogI2RlZmluZSBfREVGQVVMVF9GRVRDSF9UWVBFKHQpIF9fREVGQVVMVF9GRVRDSF9UWVBFKHQpCkBAIC01MzYsNiArNTU4LDcgQEAKIC8qIEZsYWdzIGZvciB0cmFjZV9wcm9iZSAqLwogI2RlZmluZSBUUF9GTEFHX1RSQUNFCTEKICNkZWZpbmUgVFBfRkxBR19QUk9GSUxFCTIKKyNkZWZpbmUgVFBfRkxBR19SRUdJU1RFUkVEIDQKIAogc3RydWN0IHRyYWNlX3Byb2JlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CkBAIC01NTUsMTYgKzU3OCw0OSBAQAogCShzaXplb2Yoc3RydWN0IHByb2JlX2FyZykgKiAobikpKQogCiAKLXN0YXRpYyBfX2twcm9iZXMgaW50IHByb2JlX2lzX3JldHVybihzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwKQorc3RhdGljIF9fa3Byb2JlcyBpbnQgdHJhY2VfcHJvYmVfaXNfcmV0dXJuKHN0cnVjdCB0cmFjZV9wcm9iZSAqdHApCiB7CiAJcmV0dXJuIHRwLT5ycC5oYW5kbGVyICE9IE5VTEw7CiB9CiAKLXN0YXRpYyBfX2twcm9iZXMgY29uc3QgY2hhciAqcHJvYmVfc3ltYm9sKHN0cnVjdCB0cmFjZV9wcm9iZSAqdHApCitzdGF0aWMgX19rcHJvYmVzIGNvbnN0IGNoYXIgKnRyYWNlX3Byb2JlX3N5bWJvbChzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwKQogewogCXJldHVybiB0cC0+c3ltYm9sID8gdHAtPnN5bWJvbCA6ICJ1bmtub3duIjsKIH0KIAorc3RhdGljIF9fa3Byb2JlcyB1bnNpZ25lZCBsb25nIHRyYWNlX3Byb2JlX29mZnNldChzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwKQoreworCXJldHVybiB0cC0+cnAua3Aub2Zmc2V0OworfQorCitzdGF0aWMgX19rcHJvYmVzIGJvb2wgdHJhY2VfcHJvYmVfaXNfZW5hYmxlZChzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwKQoreworCXJldHVybiAhISh0cC0+ZmxhZ3MgJiAoVFBfRkxBR19UUkFDRSB8IFRQX0ZMQUdfUFJPRklMRSkpOworfQorCitzdGF0aWMgX19rcHJvYmVzIGJvb2wgdHJhY2VfcHJvYmVfaXNfcmVnaXN0ZXJlZChzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwKQoreworCXJldHVybiAhISh0cC0+ZmxhZ3MgJiBUUF9GTEFHX1JFR0lTVEVSRUQpOworfQorCitzdGF0aWMgX19rcHJvYmVzIGJvb2wgdHJhY2VfcHJvYmVfaGFzX2dvbmUoc3RydWN0IHRyYWNlX3Byb2JlICp0cCkKK3sKKwlyZXR1cm4gISEoa3Byb2JlX2dvbmUoJnRwLT5ycC5rcCkpOworfQorCitzdGF0aWMgX19rcHJvYmVzIGJvb2wgdHJhY2VfcHJvYmVfd2l0aGluX21vZHVsZShzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwLAorCQkJCQkJc3RydWN0IG1vZHVsZSAqbW9kKQoreworCWludCBsZW4gPSBzdHJsZW4obW9kLT5uYW1lKTsKKwljb25zdCBjaGFyICpuYW1lID0gdHJhY2VfcHJvYmVfc3ltYm9sKHRwKTsKKwlyZXR1cm4gc3RybmNtcChtb2QtPm5hbWUsIG5hbWUsIGxlbikgPT0gMCAmJiBuYW1lW2xlbl0gPT0gJzonOworfQorCitzdGF0aWMgX19rcHJvYmVzIGJvb2wgdHJhY2VfcHJvYmVfaXNfb25fbW9kdWxlKHN0cnVjdCB0cmFjZV9wcm9iZSAqdHApCit7CisJcmV0dXJuICEhc3RyY2hyKHRyYWNlX3Byb2JlX3N5bWJvbCh0cCksICc6Jyk7Cit9CisKIHN0YXRpYyBpbnQgcmVnaXN0ZXJfcHJvYmVfZXZlbnQoc3RydWN0IHRyYWNlX3Byb2JlICp0cCk7CiBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX3Byb2JlX2V2ZW50KHN0cnVjdCB0cmFjZV9wcm9iZSAqdHApOwogCkBAIC02NDYsNiArNzAyLDE2IEBACiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAorc3RhdGljIHZvaWQgdXBkYXRlX3Byb2JlX2FyZyhzdHJ1Y3QgcHJvYmVfYXJnICphcmcpCit7CisJaWYgKENIRUNLX0ZFVENIX0ZVTkNTKGJpdGZpZWxkLCBhcmctPmZldGNoLmZuKSkKKwkJdXBkYXRlX2JpdGZpZWxkX2ZldGNoX3BhcmFtKGFyZy0+ZmV0Y2guZGF0YSk7CisJZWxzZSBpZiAoQ0hFQ0tfRkVUQ0hfRlVOQ1MoZGVyZWYsIGFyZy0+ZmV0Y2guZm4pKQorCQl1cGRhdGVfZGVyZWZfZmV0Y2hfcGFyYW0oYXJnLT5mZXRjaC5kYXRhKTsKKwllbHNlIGlmIChDSEVDS19GRVRDSF9GVU5DUyhzeW1ib2wsIGFyZy0+ZmV0Y2guZm4pKQorCQl1cGRhdGVfc3ltYm9sX2NhY2hlKGFyZy0+ZmV0Y2guZGF0YSk7Cit9CisKIHN0YXRpYyB2b2lkIGZyZWVfcHJvYmVfYXJnKHN0cnVjdCBwcm9iZV9hcmcgKmFyZykKIHsKIAlpZiAoQ0hFQ0tfRkVUQ0hfRlVOQ1MoYml0ZmllbGQsIGFyZy0+ZmV0Y2guZm4pKQpAQCAtNjcxLDcgKzczNyw3IEBACiAJa2ZyZWUodHApOwogfQogCi1zdGF0aWMgc3RydWN0IHRyYWNlX3Byb2JlICpmaW5kX3Byb2JlX2V2ZW50KGNvbnN0IGNoYXIgKmV2ZW50LAorc3RhdGljIHN0cnVjdCB0cmFjZV9wcm9iZSAqZmluZF90cmFjZV9wcm9iZShjb25zdCBjaGFyICpldmVudCwKIAkJCQkJICAgIGNvbnN0IGNoYXIgKmdyb3VwKQogewogCXN0cnVjdCB0cmFjZV9wcm9iZSAqdHA7CkBAIC02ODMsMTMgKzc0OSw5NiBAQAogCXJldHVybiBOVUxMOwogfQogCisvKiBFbmFibGUgdHJhY2VfcHJvYmUgLSBAZmxhZyBtdXN0IGJlIFRQX0ZMQUdfVFJBQ0Ugb3IgVFBfRkxBR19QUk9GSUxFICovCitzdGF0aWMgaW50IGVuYWJsZV90cmFjZV9wcm9iZShzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwLCBpbnQgZmxhZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXRwLT5mbGFncyB8PSBmbGFnOworCWlmICh0cmFjZV9wcm9iZV9pc19lbmFibGVkKHRwKSAmJiB0cmFjZV9wcm9iZV9pc19yZWdpc3RlcmVkKHRwKSAmJgorCSAgICAhdHJhY2VfcHJvYmVfaGFzX2dvbmUodHApKSB7CisJCWlmICh0cmFjZV9wcm9iZV9pc19yZXR1cm4odHApKQorCQkJcmV0ID0gZW5hYmxlX2tyZXRwcm9iZSgmdHAtPnJwKTsKKwkJZWxzZQorCQkJcmV0ID0gZW5hYmxlX2twcm9iZSgmdHAtPnJwLmtwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBEaXNhYmxlIHRyYWNlX3Byb2JlIC0gQGZsYWcgbXVzdCBiZSBUUF9GTEFHX1RSQUNFIG9yIFRQX0ZMQUdfUFJPRklMRSAqLworc3RhdGljIHZvaWQgZGlzYWJsZV90cmFjZV9wcm9iZShzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwLCBpbnQgZmxhZykKK3sKKwl0cC0+ZmxhZ3MgJj0gfmZsYWc7CisJaWYgKCF0cmFjZV9wcm9iZV9pc19lbmFibGVkKHRwKSAmJiB0cmFjZV9wcm9iZV9pc19yZWdpc3RlcmVkKHRwKSkgeworCQlpZiAodHJhY2VfcHJvYmVfaXNfcmV0dXJuKHRwKSkKKwkJCWRpc2FibGVfa3JldHByb2JlKCZ0cC0+cnApOworCQllbHNlCisJCQlkaXNhYmxlX2twcm9iZSgmdHAtPnJwLmtwKTsKKwl9Cit9CisKKy8qIEludGVybmFsIHJlZ2lzdGVyIGZ1bmN0aW9uIC0ganVzdCBoYW5kbGUgaypwcm9iZXMgYW5kIGZsYWdzICovCitzdGF0aWMgaW50IF9fcmVnaXN0ZXJfdHJhY2VfcHJvYmUoc3RydWN0IHRyYWNlX3Byb2JlICp0cCkKK3sKKwlpbnQgaSwgcmV0OworCisJaWYgKHRyYWNlX3Byb2JlX2lzX3JlZ2lzdGVyZWQodHApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCB0cC0+bnJfYXJnczsgaSsrKQorCQl1cGRhdGVfcHJvYmVfYXJnKCZ0cC0+YXJnc1tpXSk7CisKKwkvKiBTZXQvY2xlYXIgZGlzYWJsZWQgZmxhZyBhY2NvcmRpbmcgdG8gdHAtPmZsYWcgKi8KKwlpZiAodHJhY2VfcHJvYmVfaXNfZW5hYmxlZCh0cCkpCisJCXRwLT5ycC5rcC5mbGFncyAmPSB+S1BST0JFX0ZMQUdfRElTQUJMRUQ7CisJZWxzZQorCQl0cC0+cnAua3AuZmxhZ3MgfD0gS1BST0JFX0ZMQUdfRElTQUJMRUQ7CisKKwlpZiAodHJhY2VfcHJvYmVfaXNfcmV0dXJuKHRwKSkKKwkJcmV0ID0gcmVnaXN0ZXJfa3JldHByb2JlKCZ0cC0+cnApOworCWVsc2UKKwkJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKCZ0cC0+cnAua3ApOworCisJaWYgKHJldCA9PSAwKQorCQl0cC0+ZmxhZ3MgfD0gVFBfRkxBR19SRUdJU1RFUkVEOworCWVsc2UgeworCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgaW5zZXJ0IHByb2JlIGF0ICVzKyVsdTogJWRcbiIsCisJCQkgICB0cmFjZV9wcm9iZV9zeW1ib2wodHApLCB0cmFjZV9wcm9iZV9vZmZzZXQodHApLCByZXQpOworCQlpZiAocmV0ID09IC1FTk9FTlQgJiYgdHJhY2VfcHJvYmVfaXNfb25fbW9kdWxlKHRwKSkgeworCQkJcHJfd2FybmluZygiVGhpcyBwcm9iZSBtaWdodCBiZSBhYmxlIHRvIHJlZ2lzdGVyIGFmdGVyIgorCQkJCSAgICJ0YXJnZXQgbW9kdWxlIGlzIGxvYWRlZC4gQ29udGludWUuXG4iKTsKKwkJCXJldCA9IDA7CisJCX0gZWxzZSBpZiAocmV0ID09IC1FSUxTRVEpIHsKKwkJCXByX3dhcm5pbmcoIlByb2JpbmcgYWRkcmVzcygweCVwKSBpcyBub3QgYW4gIgorCQkJCSAgICJpbnN0cnVjdGlvbiBib3VuZGFyeS5cbiIsCisJCQkJICAgdHAtPnJwLmtwLmFkZHIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIEludGVybmFsIHVucmVnaXN0ZXIgZnVuY3Rpb24gLSBqdXN0IGhhbmRsZSBrKnByb2JlcyBhbmQgZmxhZ3MgKi8KK3N0YXRpYyB2b2lkIF9fdW5yZWdpc3Rlcl90cmFjZV9wcm9iZShzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwKQoreworCWlmICh0cmFjZV9wcm9iZV9pc19yZWdpc3RlcmVkKHRwKSkgeworCQlpZiAodHJhY2VfcHJvYmVfaXNfcmV0dXJuKHRwKSkKKwkJCXVucmVnaXN0ZXJfa3JldHByb2JlKCZ0cC0+cnApOworCQllbHNlCisJCQl1bnJlZ2lzdGVyX2twcm9iZSgmdHAtPnJwLmtwKTsKKwkJdHAtPmZsYWdzICY9IH5UUF9GTEFHX1JFR0lTVEVSRUQ7CisJCS8qIENsZWFudXAga3Byb2JlIGZvciByZXVzZSAqLworCQlpZiAodHAtPnJwLmtwLnN5bWJvbF9uYW1lKQorCQkJdHAtPnJwLmtwLmFkZHIgPSBOVUxMOworCX0KK30KKwogLyogVW5yZWdpc3RlciBhIHRyYWNlX3Byb2JlIGFuZCBwcm9iZV9ldmVudDogY2FsbCB3aXRoIGxvY2tpbmcgcHJvYmVfbG9jayAqLwogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl90cmFjZV9wcm9iZShzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwKQogewotCWlmIChwcm9iZV9pc19yZXR1cm4odHApKQotCQl1bnJlZ2lzdGVyX2tyZXRwcm9iZSgmdHAtPnJwKTsKLQllbHNlCi0JCXVucmVnaXN0ZXJfa3Byb2JlKCZ0cC0+cnAua3ApOworCV9fdW5yZWdpc3Rlcl90cmFjZV9wcm9iZSh0cCk7CiAJbGlzdF9kZWwoJnRwLT5saXN0KTsKIAl1bnJlZ2lzdGVyX3Byb2JlX2V2ZW50KHRwKTsKIH0KQEAgLTcwMiw0MSArODUxLDY1IEBACiAKIAltdXRleF9sb2NrKCZwcm9iZV9sb2NrKTsKIAotCS8qIHJlZ2lzdGVyIGFzIGFuIGV2ZW50ICovCi0Jb2xkX3RwID0gZmluZF9wcm9iZV9ldmVudCh0cC0+Y2FsbC5uYW1lLCB0cC0+Y2FsbC5jbGFzcy0+c3lzdGVtKTsKKwkvKiBEZWxldGUgb2xkIChzYW1lIG5hbWUpIGV2ZW50IGlmIGV4aXN0ICovCisJb2xkX3RwID0gZmluZF90cmFjZV9wcm9iZSh0cC0+Y2FsbC5uYW1lLCB0cC0+Y2FsbC5jbGFzcy0+c3lzdGVtKTsKIAlpZiAob2xkX3RwKSB7Ci0JCS8qIGRlbGV0ZSBvbGQgZXZlbnQgKi8KIAkJdW5yZWdpc3Rlcl90cmFjZV9wcm9iZShvbGRfdHApOwogCQlmcmVlX3RyYWNlX3Byb2JlKG9sZF90cCk7CiAJfQorCisJLyogUmVnaXN0ZXIgbmV3IGV2ZW50ICovCiAJcmV0ID0gcmVnaXN0ZXJfcHJvYmVfZXZlbnQodHApOwogCWlmIChyZXQpIHsKIAkJcHJfd2FybmluZygiRmFpbGVkIHRvIHJlZ2lzdGVyIHByb2JlIGV2ZW50KCVkKVxuIiwgcmV0KTsKIAkJZ290byBlbmQ7CiAJfQogCi0JdHAtPnJwLmtwLmZsYWdzIHw9IEtQUk9CRV9GTEFHX0RJU0FCTEVEOwotCWlmIChwcm9iZV9pc19yZXR1cm4odHApKQotCQlyZXQgPSByZWdpc3Rlcl9rcmV0cHJvYmUoJnRwLT5ycCk7Ci0JZWxzZQotCQlyZXQgPSByZWdpc3Rlcl9rcHJvYmUoJnRwLT5ycC5rcCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBpbnNlcnQgcHJvYmUoJWQpXG4iLCByZXQpOwotCQlpZiAocmV0ID09IC1FSUxTRVEpIHsKLQkJCXByX3dhcm5pbmcoIlByb2JpbmcgYWRkcmVzcygweCVwKSBpcyBub3QgYW4gIgotCQkJCSAgICJpbnN0cnVjdGlvbiBib3VuZGFyeS5cbiIsCi0JCQkJICAgdHAtPnJwLmtwLmFkZHIpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJfQorCS8qIFJlZ2lzdGVyIGsqcHJvYmUgKi8KKwlyZXQgPSBfX3JlZ2lzdGVyX3RyYWNlX3Byb2JlKHRwKTsKKwlpZiAocmV0IDwgMCkKIAkJdW5yZWdpc3Rlcl9wcm9iZV9ldmVudCh0cCk7Ci0JfSBlbHNlCisJZWxzZQogCQlsaXN0X2FkZF90YWlsKCZ0cC0+bGlzdCwgJnByb2JlX2xpc3QpOworCiBlbmQ6CiAJbXV0ZXhfdW5sb2NrKCZwcm9iZV9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCisvKiBNb2R1bGUgbm90aWZpZXIgY2FsbCBiYWNrLCBjaGVja2luZyBldmVudCBvbiB0aGUgbW9kdWxlICovCitzdGF0aWMgaW50IHRyYWNlX3Byb2JlX21vZHVsZV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbW9kdWxlICptb2QgPSBkYXRhOworCXN0cnVjdCB0cmFjZV9wcm9iZSAqdHA7CisJaW50IHJldDsKKworCWlmICh2YWwgIT0gTU9EVUxFX1NUQVRFX0NPTUlORykKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJLyogVXBkYXRlIHByb2JlcyBvbiBjb21pbmcgbW9kdWxlICovCisJbXV0ZXhfbG9jaygmcHJvYmVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cCwgJnByb2JlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRyYWNlX3Byb2JlX3dpdGhpbl9tb2R1bGUodHAsIG1vZCkpIHsKKwkJCV9fdW5yZWdpc3Rlcl90cmFjZV9wcm9iZSh0cCk7CisJCQlyZXQgPSBfX3JlZ2lzdGVyX3RyYWNlX3Byb2JlKHRwKTsKKwkJCWlmIChyZXQpCisJCQkJcHJfd2FybmluZygiRmFpbGVkIHRvIHJlLXJlZ2lzdGVyIHByb2JlICVzIG9uIgorCQkJCQkgICAiJXM6ICVkXG4iLAorCQkJCQkgICB0cC0+Y2FsbC5uYW1lLCBtb2QtPm5hbWUsIHJldCk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZwcm9iZV9sb2NrKTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB0cmFjZV9wcm9iZV9tb2R1bGVfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB0cmFjZV9wcm9iZV9tb2R1bGVfY2FsbGJhY2ssCisJLnByaW9yaXR5ID0gMQkvKiBJbnZva2VkIGFmdGVyIGtwcm9iZSBtb2R1bGUgY2FsbGJhY2sgKi8KK307CisKIC8qIFNwbGl0IHN5bWJvbCBhbmQgb2Zmc2V0LiAqLwogc3RhdGljIGludCBzcGxpdF9zeW1ib2xfb2Zmc2V0KGNoYXIgKnN5bWJvbCwgdW5zaWduZWQgbG9uZyAqb2Zmc2V0KQogewpAQCAtOTYyLDggKzExMzUsOCBAQAogewogCS8qCiAJICogQXJndW1lbnQgc3ludGF4OgotCSAqICAtIEFkZCBrcHJvYmU6IHBbOltHUlAvXUVWRU5UXSBLU1lNWytPRkZTXXxLQUREUiBbRkVUQ0hBUkdTXQotCSAqICAtIEFkZCBrcmV0cHJvYmU6IHJbOltHUlAvXUVWRU5UXSBLU1lNWyswXSBbRkVUQ0hBUkdTXQorCSAqICAtIEFkZCBrcHJvYmU6IHBbOltHUlAvXUVWRU5UXSBbTU9EOl1LU1lNWytPRkZTXXxLQUREUiBbRkVUQ0hBUkdTXQorCSAqICAtIEFkZCBrcmV0cHJvYmU6IHJbOltHUlAvXUVWRU5UXSBbTU9EOl1LU1lNWyswXSBbRkVUQ0hBUkdTXQogCSAqIEZldGNoIGFyZ3M6CiAJICogICRyZXR2YWwJOiBmZXRjaCByZXR1cm4gdmFsdWUKIAkgKiAgJHN0YWNrCTogZmV0Y2ggc3RhY2sgYWRkcmVzcwpAQCAtMTAyNSw3ICsxMTk4LDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCW11dGV4X2xvY2soJnByb2JlX2xvY2spOwotCQl0cCA9IGZpbmRfcHJvYmVfZXZlbnQoZXZlbnQsIGdyb3VwKTsKKwkJdHAgPSBmaW5kX3RyYWNlX3Byb2JlKGV2ZW50LCBncm91cCk7CiAJCWlmICghdHApIHsKIAkJCW11dGV4X3VubG9jaygmcHJvYmVfbG9jayk7CiAJCQlwcl9pbmZvKCJFdmVudCAlcy8lcyBkb2Vzbid0IGV4aXN0LlxuIiwgZ3JvdXAsIGV2ZW50KTsKQEAgLTExNDQsNyArMTMxNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgY2xlYW51cF9hbGxfcHJvYmVzKHZvaWQpCitzdGF0aWMgdm9pZCByZWxlYXNlX2FsbF90cmFjZV9wcm9iZXModm9pZCkKIHsKIAlzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwOwogCkBAIC0xMTU4LDcgKzEzMzEsNiBAQAogCW11dGV4X3VubG9jaygmcHJvYmVfbG9jayk7CiB9CiAKLQogLyogUHJvYmVzIGxpc3RpbmcgaW50ZXJmYWNlcyAqLwogc3RhdGljIHZvaWQgKnByb2Jlc19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKQEAgLTExODEsMTUgKzEzNTMsMTYgQEAKIAlzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwID0gdjsKIAlpbnQgaTsKIAotCXNlcV9wcmludGYobSwgIiVjIiwgcHJvYmVfaXNfcmV0dXJuKHRwKSA/ICdyJyA6ICdwJyk7CisJc2VxX3ByaW50ZihtLCAiJWMiLCB0cmFjZV9wcm9iZV9pc19yZXR1cm4odHApID8gJ3InIDogJ3AnKTsKIAlzZXFfcHJpbnRmKG0sICI6JXMvJXMiLCB0cC0+Y2FsbC5jbGFzcy0+c3lzdGVtLCB0cC0+Y2FsbC5uYW1lKTsKIAogCWlmICghdHAtPnN5bWJvbCkKIAkJc2VxX3ByaW50ZihtLCAiIDB4JXAiLCB0cC0+cnAua3AuYWRkcik7CiAJZWxzZSBpZiAodHAtPnJwLmtwLm9mZnNldCkKLQkJc2VxX3ByaW50ZihtLCAiICVzKyV1IiwgcHJvYmVfc3ltYm9sKHRwKSwgdHAtPnJwLmtwLm9mZnNldCk7CisJCXNlcV9wcmludGYobSwgIiAlcysldSIsIHRyYWNlX3Byb2JlX3N5bWJvbCh0cCksCisJCQkgICB0cC0+cnAua3Aub2Zmc2V0KTsKIAllbHNlCi0JCXNlcV9wcmludGYobSwgIiAlcyIsIHByb2JlX3N5bWJvbCh0cCkpOworCQlzZXFfcHJpbnRmKG0sICIgJXMiLCB0cmFjZV9wcm9iZV9zeW1ib2wodHApKTsKIAogCWZvciAoaSA9IDA7IGkgPCB0cC0+bnJfYXJnczsgaSsrKQogCQlzZXFfcHJpbnRmKG0sICIgJXM9JXMiLCB0cC0+YXJnc1tpXS5uYW1lLCB0cC0+YXJnc1tpXS5jb21tKTsKQEAgLTEyMDksNyArMTM4Miw3IEBACiB7CiAJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKIAkgICAgKGZpbGUtPmZfZmxhZ3MgJiBPX1RSVU5DKSkKLQkJY2xlYW51cF9hbGxfcHJvYmVzKCk7CisJCXJlbGVhc2VfYWxsX3RyYWNlX3Byb2JlcygpOwogCiAJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZwcm9iZXNfc2VxX29wKTsKIH0KQEAgLTEzOTcsNyArMTU3MCw4IEBACiAJc3RvcmVfdHJhY2VfYXJncyhzaXplb2YoKmVudHJ5KSwgdHAsIHJlZ3MsICh1OCAqKSZlbnRyeVsxXSwgZHNpemUpOwogCiAJaWYgKCFmaWx0ZXJfY3VycmVudF9jaGVja19kaXNjYXJkKGJ1ZmZlciwgY2FsbCwgZW50cnksIGV2ZW50KSkKLQkJdHJhY2Vfbm93YWtlX2J1ZmZlcl91bmxvY2tfY29tbWl0KGJ1ZmZlciwgZXZlbnQsIGlycV9mbGFncywgcGMpOworCQl0cmFjZV9ub3dha2VfYnVmZmVyX3VubG9ja19jb21taXRfcmVncyhidWZmZXIsIGV2ZW50LAorCQkJCQkJICAgICAgIGlycV9mbGFncywgcGMsIHJlZ3MpOwogfQogCiAvKiBLcmV0cHJvYmUgaGFuZGxlciAqLwpAQCAtMTQyOSw3ICsxNjAzLDggQEAKIAlzdG9yZV90cmFjZV9hcmdzKHNpemVvZigqZW50cnkpLCB0cCwgcmVncywgKHU4ICopJmVudHJ5WzFdLCBkc2l6ZSk7CiAKIAlpZiAoIWZpbHRlcl9jdXJyZW50X2NoZWNrX2Rpc2NhcmQoYnVmZmVyLCBjYWxsLCBlbnRyeSwgZXZlbnQpKQotCQl0cmFjZV9ub3dha2VfYnVmZmVyX3VubG9ja19jb21taXQoYnVmZmVyLCBldmVudCwgaXJxX2ZsYWdzLCBwYyk7CisJCXRyYWNlX25vd2FrZV9idWZmZXJfdW5sb2NrX2NvbW1pdF9yZWdzKGJ1ZmZlciwgZXZlbnQsCisJCQkJCQkgICAgICAgaXJxX2ZsYWdzLCBwYywgcmVncyk7CiB9CiAKIC8qIEV2ZW50IGVudHJ5IHByaW50ZXJzICovCkBAIC0xNTExLDMwICsxNjg2LDYgQEAKIAlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CiB9CiAKLXN0YXRpYyBpbnQgcHJvYmVfZXZlbnRfZW5hYmxlKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCkKLXsKLQlzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwID0gKHN0cnVjdCB0cmFjZV9wcm9iZSAqKWNhbGwtPmRhdGE7Ci0KLQl0cC0+ZmxhZ3MgfD0gVFBfRkxBR19UUkFDRTsKLQlpZiAocHJvYmVfaXNfcmV0dXJuKHRwKSkKLQkJcmV0dXJuIGVuYWJsZV9rcmV0cHJvYmUoJnRwLT5ycCk7Ci0JZWxzZQotCQlyZXR1cm4gZW5hYmxlX2twcm9iZSgmdHAtPnJwLmtwKTsKLX0KLQotc3RhdGljIHZvaWQgcHJvYmVfZXZlbnRfZGlzYWJsZShzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwpCi17Ci0Jc3RydWN0IHRyYWNlX3Byb2JlICp0cCA9IChzdHJ1Y3QgdHJhY2VfcHJvYmUgKiljYWxsLT5kYXRhOwotCi0JdHAtPmZsYWdzICY9IH5UUF9GTEFHX1RSQUNFOwotCWlmICghKHRwLT5mbGFncyAmIChUUF9GTEFHX1RSQUNFIHwgVFBfRkxBR19QUk9GSUxFKSkpIHsKLQkJaWYgKHByb2JlX2lzX3JldHVybih0cCkpCi0JCQlkaXNhYmxlX2tyZXRwcm9iZSgmdHAtPnJwKTsKLQkJZWxzZQotCQkJZGlzYWJsZV9rcHJvYmUoJnRwLT5ycC5rcCk7Ci0JfQotfQotCiAjdW5kZWYgREVGSU5FX0ZJRUxECiAjZGVmaW5lIERFRklORV9GSUVMRCh0eXBlLCBpdGVtLCBuYW1lLCBpc19zaWduZWQpCQkJXAogCWRvIHsJCQkJCQkJCVwKQEAgLTE1OTYsNyArMTc0Nyw3IEBACiAKIAljb25zdCBjaGFyICpmbXQsICphcmc7CiAKLQlpZiAoIXByb2JlX2lzX3JldHVybih0cCkpIHsKKwlpZiAoIXRyYWNlX3Byb2JlX2lzX3JldHVybih0cCkpIHsKIAkJZm10ID0gIiglbHgpIjsKIAkJYXJnID0gIlJFQy0+IiBGSUVMRF9TVFJJTkdfSVA7CiAJfSBlbHNlIHsKQEAgLTE3MTMsNDkgKzE4NjQsMjUgQEAKIAloZWFkID0gdGhpc19jcHVfcHRyKGNhbGwtPnBlcmZfZXZlbnRzKTsKIAlwZXJmX3RyYWNlX2J1Zl9zdWJtaXQoZW50cnksIHNpemUsIHJjdHgsIGVudHJ5LT5yZXRfaXAsIDEsIHJlZ3MsIGhlYWQpOwogfQotCi1zdGF0aWMgaW50IHByb2JlX3BlcmZfZW5hYmxlKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCkKLXsKLQlzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwID0gKHN0cnVjdCB0cmFjZV9wcm9iZSAqKWNhbGwtPmRhdGE7Ci0KLQl0cC0+ZmxhZ3MgfD0gVFBfRkxBR19QUk9GSUxFOwotCi0JaWYgKHByb2JlX2lzX3JldHVybih0cCkpCi0JCXJldHVybiBlbmFibGVfa3JldHByb2JlKCZ0cC0+cnApOwotCWVsc2UKLQkJcmV0dXJuIGVuYWJsZV9rcHJvYmUoJnRwLT5ycC5rcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2JlX3BlcmZfZGlzYWJsZShzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwpCi17Ci0Jc3RydWN0IHRyYWNlX3Byb2JlICp0cCA9IChzdHJ1Y3QgdHJhY2VfcHJvYmUgKiljYWxsLT5kYXRhOwotCi0JdHAtPmZsYWdzICY9IH5UUF9GTEFHX1BST0ZJTEU7Ci0KLQlpZiAoISh0cC0+ZmxhZ3MgJiBUUF9GTEFHX1RSQUNFKSkgewotCQlpZiAocHJvYmVfaXNfcmV0dXJuKHRwKSkKLQkJCWRpc2FibGVfa3JldHByb2JlKCZ0cC0+cnApOwotCQllbHNlCi0JCQlkaXNhYmxlX2twcm9iZSgmdHAtPnJwLmtwKTsKLQl9Ci19CiAjZW5kaWYJLyogQ09ORklHX1BFUkZfRVZFTlRTICovCiAKIHN0YXRpYyBfX2twcm9iZXMKIGludCBrcHJvYmVfcmVnaXN0ZXIoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpldmVudCwgZW51bSB0cmFjZV9yZWcgdHlwZSkKIHsKKwlzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwID0gKHN0cnVjdCB0cmFjZV9wcm9iZSAqKWV2ZW50LT5kYXRhOworCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBUUkFDRV9SRUdfUkVHSVNURVI6Ci0JCXJldHVybiBwcm9iZV9ldmVudF9lbmFibGUoZXZlbnQpOworCQlyZXR1cm4gZW5hYmxlX3RyYWNlX3Byb2JlKHRwLCBUUF9GTEFHX1RSQUNFKTsKIAljYXNlIFRSQUNFX1JFR19VTlJFR0lTVEVSOgotCQlwcm9iZV9ldmVudF9kaXNhYmxlKGV2ZW50KTsKKwkJZGlzYWJsZV90cmFjZV9wcm9iZSh0cCwgVFBfRkxBR19UUkFDRSk7CiAJCXJldHVybiAwOwogCiAjaWZkZWYgQ09ORklHX1BFUkZfRVZFTlRTCiAJY2FzZSBUUkFDRV9SRUdfUEVSRl9SRUdJU1RFUjoKLQkJcmV0dXJuIHByb2JlX3BlcmZfZW5hYmxlKGV2ZW50KTsKKwkJcmV0dXJuIGVuYWJsZV90cmFjZV9wcm9iZSh0cCwgVFBfRkxBR19QUk9GSUxFKTsKIAljYXNlIFRSQUNFX1JFR19QRVJGX1VOUkVHSVNURVI6Ci0JCXByb2JlX3BlcmZfZGlzYWJsZShldmVudCk7CisJCWRpc2FibGVfdHJhY2VfcHJvYmUodHAsIFRQX0ZMQUdfUFJPRklMRSk7CiAJCXJldHVybiAwOwogI2VuZGlmCiAJfQpAQCAtMTgwNSw3ICsxOTMyLDcgQEAKIAogCS8qIEluaXRpYWxpemUgZnRyYWNlX2V2ZW50X2NhbGwgKi8KIAlJTklUX0xJU1RfSEVBRCgmY2FsbC0+Y2xhc3MtPmZpZWxkcyk7Ci0JaWYgKHByb2JlX2lzX3JldHVybih0cCkpIHsKKwlpZiAodHJhY2VfcHJvYmVfaXNfcmV0dXJuKHRwKSkgewogCQljYWxsLT5ldmVudC5mdW5jcyA9ICZrcmV0cHJvYmVfZnVuY3M7CiAJCWNhbGwtPmNsYXNzLT5kZWZpbmVfZmllbGRzID0ga3JldHByb2JlX2V2ZW50X2RlZmluZV9maWVsZHM7CiAJfSBlbHNlIHsKQEAgLTE4NDQsNiArMTk3MSw5IEBACiAJc3RydWN0IGRlbnRyeSAqZF90cmFjZXI7CiAJc3RydWN0IGRlbnRyeSAqZW50cnk7CiAKKwlpZiAocmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKCZ0cmFjZV9wcm9iZV9tb2R1bGVfbmIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWRfdHJhY2VyID0gdHJhY2luZ19pbml0X2RlbnRyeSgpOwogCWlmICghZF90cmFjZXIpCiAJCXJldHVybiAwOwpAQCAtMTg3MCw4ICsyMDAwLDEyIEBACiAKICNpZmRlZiBDT05GSUdfRlRSQUNFX1NUQVJUVVBfVEVTVAogCi1zdGF0aWMgaW50IGtwcm9iZV90cmFjZV9zZWxmdGVzdF90YXJnZXQoaW50IGExLCBpbnQgYTIsIGludCBhMywKLQkJCQkJaW50IGE0LCBpbnQgYTUsIGludCBhNikKKy8qCisgKiBUaGUgIl9fdXNlZCIga2VlcHMgZ2NjIGZyb20gcmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHN5bWJvbAorICogZnJvbSB0aGUga2FsbHN5bXMgdGFibGUuCisgKi8KK3N0YXRpYyBfX3VzZWQgaW50IGtwcm9iZV90cmFjZV9zZWxmdGVzdF90YXJnZXQoaW50IGExLCBpbnQgYTIsIGludCBhMywKKwkJCQkJICAgICAgIGludCBhNCwgaW50IGE1LCBpbnQgYTYpCiB7CiAJcmV0dXJuIGExICsgYTIgKyBhMyArIGE0ICsgYTUgKyBhNjsKIH0KQEAgLTE4OTMsMTIgKzIwMjcsMTIgQEAKIAkJd2FybisrOwogCX0gZWxzZSB7CiAJCS8qIEVuYWJsZSB0cmFjZSBwb2ludCAqLwotCQl0cCA9IGZpbmRfcHJvYmVfZXZlbnQoInRlc3Rwcm9iZSIsIEtQUk9CRV9FVkVOVF9TWVNURU0pOworCQl0cCA9IGZpbmRfdHJhY2VfcHJvYmUoInRlc3Rwcm9iZSIsIEtQUk9CRV9FVkVOVF9TWVNURU0pOwogCQlpZiAoV0FSTl9PTl9PTkNFKHRwID09IE5VTEwpKSB7CiAJCQlwcl93YXJuaW5nKCJlcnJvciBvbiBnZXR0aW5nIG5ldyBwcm9iZS5cbiIpOwogCQkJd2FybisrOwogCQl9IGVsc2UKLQkJCXByb2JlX2V2ZW50X2VuYWJsZSgmdHAtPmNhbGwpOworCQkJZW5hYmxlX3RyYWNlX3Byb2JlKHRwLCBUUF9GTEFHX1RSQUNFKTsKIAl9CiAKIAlyZXQgPSBjb21tYW5kX3RyYWNlX3Byb2JlKCJyOnRlc3Rwcm9iZTIga3Byb2JlX3RyYWNlX3NlbGZ0ZXN0X3RhcmdldCAiCkBAIC0xOTA4LDEyICsyMDQyLDEyIEBACiAJCXdhcm4rKzsKIAl9IGVsc2UgewogCQkvKiBFbmFibGUgdHJhY2UgcG9pbnQgKi8KLQkJdHAgPSBmaW5kX3Byb2JlX2V2ZW50KCJ0ZXN0cHJvYmUyIiwgS1BST0JFX0VWRU5UX1NZU1RFTSk7CisJCXRwID0gZmluZF90cmFjZV9wcm9iZSgidGVzdHByb2JlMiIsIEtQUk9CRV9FVkVOVF9TWVNURU0pOwogCQlpZiAoV0FSTl9PTl9PTkNFKHRwID09IE5VTEwpKSB7CiAJCQlwcl93YXJuaW5nKCJlcnJvciBvbiBnZXR0aW5nIG5ldyBwcm9iZS5cbiIpOwogCQkJd2FybisrOwogCQl9IGVsc2UKLQkJCXByb2JlX2V2ZW50X2VuYWJsZSgmdHAtPmNhbGwpOworCQkJZW5hYmxlX3RyYWNlX3Byb2JlKHRwLCBUUF9GTEFHX1RSQUNFKTsKIAl9CiAKIAlpZiAod2FybikKQEAgLTE5MzQsNyArMjA2OCw3IEBACiAJfQogCiBlbmQ6Ci0JY2xlYW51cF9hbGxfcHJvYmVzKCk7CisJcmVsZWFzZV9hbGxfdHJhY2VfcHJvYmVzKCk7CiAJaWYgKHdhcm4pCiAJCXByX2NvbnQoIk5HOiBTb21lIHRlc3RzIGFyZSBmYWlsZWQuIFBsZWFzZSBjaGVjayB0aGVtLlxuIik7CiAJZWxzZQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jCmluZGV4IGUzN2RlNDkuLjUxOTk5MzAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMKQEAgLTExMDcsMTkgKzExMDcsMjAgQEAKIHsKIAlzdHJ1Y3Qgc3RhY2tfZW50cnkgKmZpZWxkOwogCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOwotCWludCBpOworCXVuc2lnbmVkIGxvbmcgKnA7CisJdW5zaWduZWQgbG9uZyAqZW5kOwogCiAJdHJhY2VfYXNzaWduX3R5cGUoZmllbGQsIGl0ZXItPmVudCk7CisJZW5kID0gKHVuc2lnbmVkIGxvbmcgKikoKGxvbmcpaXRlci0+ZW50ICsgaXRlci0+ZW50X3NpemUpOwogCiAJaWYgKCF0cmFjZV9zZXFfcHV0cyhzLCAiPHN0YWNrIHRyYWNlPlxuIikpCiAJCWdvdG8gcGFydGlhbDsKLQlmb3IgKGkgPSAwOyBpIDwgRlRSQUNFX1NUQUNLX0VOVFJJRVM7IGkrKykgewotCQlpZiAoIWZpZWxkLT5jYWxsZXJbaV0gfHwgKGZpZWxkLT5jYWxsZXJbaV0gPT0gVUxPTkdfTUFYKSkKLQkJCWJyZWFrOworCisJZm9yIChwID0gZmllbGQtPmNhbGxlcjsgcCAmJiAqcCAhPSBVTE9OR19NQVggJiYgcCA8IGVuZDsgcCsrKSB7CiAJCWlmICghdHJhY2Vfc2VxX3B1dHMocywgIiA9PiAiKSkKIAkJCWdvdG8gcGFydGlhbDsKIAotCQlpZiAoIXNlcV9wcmludF9pcF9zeW0ocywgZmllbGQtPmNhbGxlcltpXSwgZmxhZ3MpKQorCQlpZiAoIXNlcV9wcmludF9pcF9zeW0ocywgKnAsIGZsYWdzKSkKIAkJCWdvdG8gcGFydGlhbDsKIAkJaWYgKCF0cmFjZV9zZXFfcHV0cyhzLCAiXG4iKSkKIAkJCWdvdG8gcGFydGlhbDsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9wcmludGsuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9wcmludGsuYwppbmRleCBkZmY3NjNiLi4xZjA2NDY4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfcHJpbnRrLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3ByaW50ay5jCkBAIC0yNDAsMTMgKzI0MCwxMCBAQAogCWNvbnN0IGNoYXIgKipmbXQgPSB2OwogCWludCBzdGFydF9pbmRleDsKIAotCWlmICghZm10KQotCQlmbXQgPSBfX3N0YXJ0X19fdHJhY2VfYnByaW50a19mbXQgKyAqcG9zOwotCiAJc3RhcnRfaW5kZXggPSBfX3N0b3BfX190cmFjZV9icHJpbnRrX2ZtdCAtIF9fc3RhcnRfX190cmFjZV9icHJpbnRrX2ZtdDsKIAogCWlmICgqcG9zIDwgc3RhcnRfaW5kZXgpCi0JCXJldHVybiBmbXQ7CisJCXJldHVybiBfX3N0YXJ0X19fdHJhY2VfYnByaW50a19mbXQgKyAqcG9zOwogCiAJcmV0dXJuIGZpbmRfbmV4dF9tb2RfZm9ybWF0KHN0YXJ0X2luZGV4LCB2LCBmbXQsIHBvcyk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfd2FrZXVwLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfd2FrZXVwLmMKaW5kZXggZjAyOWRkNC4uZTRhNzBjMCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3NjaGVkX3dha2V1cC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zY2hlZF93YWtldXAuYwpAQCAtMjI3LDcgKzIyNyw5IEBACiAJCWdyYXBoX3RyYWNlX2Nsb3NlKGl0ZXIpOwogfQogCi0jZGVmaW5lIEdSQVBIX1RSQUNFUl9GTEFHUyAoVFJBQ0VfR1JBUEhfUFJJTlRfUFJPQykKKyNkZWZpbmUgR1JBUEhfVFJBQ0VSX0ZMQUdTIChUUkFDRV9HUkFQSF9QUklOVF9QUk9DIHwgXAorCQkJICAgIFRSQUNFX0dSQVBIX1BSSU5UX0FCU19USU1FIHwgXAorCQkJICAgIFRSQUNFX0dSQVBIX1BSSU5UX0RVUkFUSU9OKQogCiBzdGF0aWMgZW51bSBwcmludF9saW5lX3Qgd2FrZXVwX3ByaW50X2xpbmUoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQogewpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3N0YWNrLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYwppbmRleCBiMGI1M2I4Li43NzU3NWIzIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYwpAQCAtMTU2LDIwICsxNTYsMTEgQEAKIHsKIAlsb25nICpwdHIgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgbG9uZyB2YWwsIGZsYWdzOwotCWNoYXIgYnVmWzY0XTsKIAlpbnQgcmV0OwogCWludCBjcHU7CiAKLQlpZiAoY291bnQgPj0gc2l6ZW9mKGJ1ZikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZidWYsIHVidWYsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlidWZbY291bnRdID0gMDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChyZXQgPCAwKQorCXJldCA9IGtzdHJ0b3VsX2Zyb21fdXNlcih1YnVmLCBjb3VudCwgMTAsICZ2YWwpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvd2F0Y2hkb2cuYyBiL2tlcm5lbC93YXRjaGRvZy5jCmluZGV4IDNkMGM1NmEuLjM2NDkxY2QgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93YXRjaGRvZy5jCisrKyBiL2tlcm5lbC93YXRjaGRvZy5jCkBAIC0yMDAsNiArMjAwLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19IQVJETE9DS1VQX0RFVEVDVE9SCisKIHN0YXRpYyBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIHdkX2h3X2F0dHIgPSB7CiAJLnR5cGUJCT0gUEVSRl9UWVBFX0hBUkRXQVJFLAogCS5jb25maWcJCT0gUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTLApAQCAtMjA5LDcgKzIxMCw3IEBACiB9OwogCiAvKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgcGVyZiBldmVudCBzdWJzeXN0ZW0gKi8KLXN0YXRpYyB2b2lkIHdhdGNoZG9nX292ZXJmbG93X2NhbGxiYWNrKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IG5taSwKK3N0YXRpYyB2b2lkIHdhdGNoZG9nX292ZXJmbG93X2NhbGxiYWNrKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKIAkJIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLAogCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC0zNjgsMTAgKzM2OSwxMSBAQAogCWlmIChldmVudCAhPSBOVUxMKQogCQlnb3RvIG91dF9lbmFibGU7CiAKLQkvKiBUcnkgdG8gcmVnaXN0ZXIgdXNpbmcgaGFyZHdhcmUgcGVyZiBldmVudHMgKi8KIAl3ZF9hdHRyID0gJndkX2h3X2F0dHI7CiAJd2RfYXR0ci0+c2FtcGxlX3BlcmlvZCA9IGh3X25taV9nZXRfc2FtcGxlX3BlcmlvZCh3YXRjaGRvZ190aHJlc2gpOwotCWV2ZW50ID0gcGVyZl9ldmVudF9jcmVhdGVfa2VybmVsX2NvdW50ZXIod2RfYXR0ciwgY3B1LCBOVUxMLCB3YXRjaGRvZ19vdmVyZmxvd19jYWxsYmFjayk7CisKKwkvKiBUcnkgdG8gcmVnaXN0ZXIgdXNpbmcgaGFyZHdhcmUgcGVyZiBldmVudHMgKi8KKwlldmVudCA9IHBlcmZfZXZlbnRfY3JlYXRlX2tlcm5lbF9jb3VudGVyKHdkX2F0dHIsIGNwdSwgTlVMTCwgd2F0Y2hkb2dfb3ZlcmZsb3dfY2FsbGJhY2ssIE5VTEwpOwogCWlmICghSVNfRVJSKGV2ZW50KSkgewogCQlwcmludGsoS0VSTl9JTkZPICJOTUkgd2F0Y2hkb2cgZW5hYmxlZCwgdGFrZXMgb25lIGh3LXBtdSBjb3VudGVyLlxuIik7CiAJCWdvdG8gb3V0X3NhdmU7CmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmMKaW5kZXggMDQwMDU1My4uMjVmYjFiMCAxMDA2NDQKLS0tIGEva2VybmVsL3dvcmtxdWV1ZS5jCisrKyBiL2tlcm5lbC93b3JrcXVldWUuYwpAQCAtMjIxLDcgKzIyMSw3IEBACiAgKiBwZXItQ1BVIHdvcmtxdWV1ZXM6CiAgKi8KIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJCWZsYWdzOwkJLyogSTogV1FfKiBmbGFncyAqLworCXVuc2lnbmVkIGludAkJZmxhZ3M7CQkvKiBXOiBXUV8qIGZsYWdzICovCiAJdW5pb24gewogCQlzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgX19wZXJjcHUJKnBjcHU7CiAJCXN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0cnVjdAkJKnNpbmdsZTsKQEAgLTI0MCw2ICsyNDAsNyBAQAogCW1heWRheV9tYXNrX3QJCW1heWRheV9tYXNrOwkvKiBjcHVzIHJlcXVlc3RpbmcgcmVzY3VlICovCiAJc3RydWN0IHdvcmtlcgkJKnJlc2N1ZXI7CS8qIEk6IHJlc2N1ZSB3b3JrZXIgKi8KIAorCWludAkJCW5yX2RyYWluZXJzOwkvKiBXOiBkcmFpbiBpbiBwcm9ncmVzcyAqLwogCWludAkJCXNhdmVkX21heF9hY3RpdmU7IC8qIFc6IHNhdmVkIGN3cSBtYXhfYWN0aXZlICovCiAJY29uc3QgY2hhcgkJKm5hbWU7CQkvKiBJOiB3b3JrcXVldWUgbmFtZSAqLwogI2lmZGVmIENPTkZJR19MT0NLREVQCkBAIC05OTAsNyArOTkxLDcgQEAKIAlkZWJ1Z193b3JrX2FjdGl2YXRlKHdvcmspOwogCiAJLyogaWYgZHlpbmcsIG9ubHkgd29ya3MgZnJvbSB0aGUgc2FtZSB3b3JrcXVldWUgYXJlIGFsbG93ZWQgKi8KLQlpZiAodW5saWtlbHkod3EtPmZsYWdzICYgV1FfRFlJTkcpICYmCisJaWYgKHVubGlrZWx5KHdxLT5mbGFncyAmIFdRX0RSQUlOSU5HKSAmJgogCSAgICBXQVJOX09OX09OQ0UoIWlzX2NoYWluZWRfd29yayh3cSkpKQogCQlyZXR1cm47CiAKQEAgLTIzODEsNiArMjM4Miw1NCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZmx1c2hfd29ya3F1ZXVlKTsKIAorLyoqCisgKiBkcmFpbl93b3JrcXVldWUgLSBkcmFpbiBhIHdvcmtxdWV1ZQorICogQHdxOiB3b3JrcXVldWUgdG8gZHJhaW4KKyAqCisgKiBXYWl0IHVudGlsIHRoZSB3b3JrcXVldWUgYmVjb21lcyBlbXB0eS4gIFdoaWxlIGRyYWluaW5nIGlzIGluIHByb2dyZXNzLAorICogb25seSBjaGFpbiBxdWV1ZWluZyBpcyBhbGxvd2VkLiAgSU9XLCBvbmx5IGN1cnJlbnRseSBwZW5kaW5nIG9yIHJ1bm5pbmcKKyAqIHdvcmsgaXRlbXMgb24gQHdxIGNhbiBxdWV1ZSBmdXJ0aGVyIHdvcmsgaXRlbXMgb24gaXQuICBAd3EgaXMgZmx1c2hlZAorICogcmVwZWF0ZWRseSB1bnRpbCBpdCBiZWNvbWVzIGVtcHR5LiAgVGhlIG51bWJlciBvZiBmbHVzaGluZyBpcyBkZXRlbWluZWQKKyAqIGJ5IHRoZSBkZXB0aCBvZiBjaGFpbmluZyBhbmQgc2hvdWxkIGJlIHJlbGF0aXZlbHkgc2hvcnQuICBXaGluZSBpZiBpdAorICogdGFrZXMgdG9vIGxvbmcuCisgKi8KK3ZvaWQgZHJhaW5fd29ya3F1ZXVlKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSkKK3sKKwl1bnNpZ25lZCBpbnQgZmx1c2hfY250ID0gMDsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJLyoKKwkgKiBfX3F1ZXVlX3dvcmsoKSBuZWVkcyB0byB0ZXN0IHdoZXRoZXIgdGhlcmUgYXJlIGRyYWluZXJzLCBpcyBtdWNoCisJICogaG90dGVyIHRoYW4gZHJhaW5fd29ya3F1ZXVlKCkgYW5kIGFscmVhZHkgbG9va3MgYXQgQHdxLT5mbGFncy4KKwkgKiBVc2UgV1FfRFJBSU5JTkcgc28gdGhhdCBxdWV1ZSBkb2Vzbid0IGhhdmUgdG8gY2hlY2sgbnJfZHJhaW5lcnMuCisJICovCisJc3Bpbl9sb2NrKCZ3b3JrcXVldWVfbG9jayk7CisJaWYgKCF3cS0+bnJfZHJhaW5lcnMrKykKKwkJd3EtPmZsYWdzIHw9IFdRX0RSQUlOSU5HOworCXNwaW5fdW5sb2NrKCZ3b3JrcXVldWVfbG9jayk7CityZWZsdXNoOgorCWZsdXNoX3dvcmtxdWV1ZSh3cSk7CisKKwlmb3JfZWFjaF9jd3FfY3B1KGNwdSwgd3EpIHsKKwkJc3RydWN0IGNwdV93b3JrcXVldWVfc3RydWN0ICpjd3EgPSBnZXRfY3dxKGNwdSwgd3EpOworCisJCWlmICghY3dxLT5ucl9hY3RpdmUgJiYgbGlzdF9lbXB0eSgmY3dxLT5kZWxheWVkX3dvcmtzKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgrK2ZsdXNoX2NudCA9PSAxMCB8fAorCQkgICAgKGZsdXNoX2NudCAlIDEwMCA9PSAwICYmIGZsdXNoX2NudCA8PSAxMDAwKSkKKwkJCXByX3dhcm5pbmcoIndvcmtxdWV1ZSAlczogZmx1c2ggb24gZGVzdHJ1Y3Rpb24gaXNuJ3QgY29tcGxldGUgYWZ0ZXIgJXUgdHJpZXNcbiIsCisJCQkJICAgd3EtPm5hbWUsIGZsdXNoX2NudCk7CisJCWdvdG8gcmVmbHVzaDsKKwl9CisKKwlzcGluX2xvY2soJndvcmtxdWV1ZV9sb2NrKTsKKwlpZiAoIS0td3EtPm5yX2RyYWluZXJzKQorCQl3cS0+ZmxhZ3MgJj0gfldRX0RSQUlOSU5HOworCXNwaW5fdW5sb2NrKCZ3b3JrcXVldWVfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkcmFpbl93b3JrcXVldWUpOworCiBzdGF0aWMgYm9vbCBzdGFydF9mbHVzaF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywgc3RydWN0IHdxX2JhcnJpZXIgKmJhcnIsCiAJCQkgICAgIGJvb2wgd2FpdF9leGVjdXRpbmcpCiB7CkBAIC0zMDA5LDM0ICszMDU4LDEwIEBACiAgKi8KIHZvaWQgZGVzdHJveV93b3JrcXVldWUoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKQogewotCXVuc2lnbmVkIGludCBmbHVzaF9jbnQgPSAwOwogCXVuc2lnbmVkIGludCBjcHU7CiAKLQkvKgotCSAqIE1hcmsgQHdxIGR5aW5nIGFuZCBkcmFpbiBhbGwgcGVuZGluZyB3b3Jrcy4gIE9uY2UgV1FfRFlJTkcgaXMKLQkgKiBzZXQsIG9ubHkgY2hhaW4gcXVldWVpbmcgaXMgYWxsb3dlZC4gIElPVywgb25seSBjdXJyZW50bHkKLQkgKiBwZW5kaW5nIG9yIHJ1bm5pbmcgd29yayBpdGVtcyBvbiBAd3EgY2FuIHF1ZXVlIGZ1cnRoZXIgd29yawotCSAqIGl0ZW1zIG9uIGl0LiAgQHdxIGlzIGZsdXNoZWQgcmVwZWF0ZWRseSB1bnRpbCBpdCBiZWNvbWVzIGVtcHR5LgotCSAqIFRoZSBudW1iZXIgb2YgZmx1c2hpbmcgaXMgZGV0ZW1pbmVkIGJ5IHRoZSBkZXB0aCBvZiBjaGFpbmluZyBhbmQKLQkgKiBzaG91bGQgYmUgcmVsYXRpdmVseSBzaG9ydC4gIFdoaW5lIGlmIGl0IHRha2VzIHRvbyBsb25nLgotCSAqLwotCXdxLT5mbGFncyB8PSBXUV9EWUlORzsKLXJlZmx1c2g6Ci0JZmx1c2hfd29ya3F1ZXVlKHdxKTsKLQotCWZvcl9lYWNoX2N3cV9jcHUoY3B1LCB3cSkgewotCQlzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cSA9IGdldF9jd3EoY3B1LCB3cSk7Ci0KLQkJaWYgKCFjd3EtPm5yX2FjdGl2ZSAmJiBsaXN0X2VtcHR5KCZjd3EtPmRlbGF5ZWRfd29ya3MpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCsrZmx1c2hfY250ID09IDEwIHx8Ci0JCSAgICAoZmx1c2hfY250ICUgMTAwID09IDAgJiYgZmx1c2hfY250IDw9IDEwMDApKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAid29ya3F1ZXVlICVzOiBmbHVzaCBvbiAiCi0JCQkgICAgICAgImRlc3RydWN0aW9uIGlzbid0IGNvbXBsZXRlIGFmdGVyICV1IHRyaWVzXG4iLAotCQkJICAgICAgIHdxLT5uYW1lLCBmbHVzaF9jbnQpOwotCQlnb3RvIHJlZmx1c2g7Ci0JfQorCS8qIGRyYWluIGl0IGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggZGVzdHJ1Y3Rpb24gKi8KKwlkcmFpbl93b3JrcXVldWUod3EpOwogCiAJLyoKIAkgKiB3cSBsaXN0IGlzIHVzZWQgdG8gZnJlZXplIHdxLCByZW1vdmUgZnJvbSBsaXN0IGFmdGVyCmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZyBiL2xpYi9LY29uZmlnCmluZGV4IDgzMDE4MWMuLjMyZjNlNWEgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnCisrKyBiL2xpYi9LY29uZmlnCkBAIC03OSw2ICs3OSwxMyBAQAogCSAgcmVxdWlyZSBNIGhlcmUuICBTZWUgQ2FzdGFnbm9saTkzLgogCSAgTW9kdWxlIHdpbGwgYmUgbGliY3JjMzJjLgogCitjb25maWcgQ1JDOAorCXRyaXN0YXRlICJDUkM4IGZ1bmN0aW9uIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIENSQzggZnVuY3Rpb24uIERyaXZlcnMgbWF5IHNlbGVjdCB0aGlzCisJICB3aGVuIHRoZXkgbmVlZCB0byBkbyBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjayBhY2NvcmRpbmcgQ1JDOAorCSAgYWxnb3JpdGhtLiBNb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3JjOC4KKwogY29uZmlnIEFVRElUX0dFTkVSSUMKIAlib29sCiAJZGVwZW5kcyBvbiBBVURJVCAmJiAhQVVESVRfQVJDSApAQCAtMjYyLDQgKzI2OSwxMSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgQ09SRElDCisJdHJpc3RhdGUgIkNvcmRpYyBmdW5jdGlvbiIKKwloZWxwCisJICBUaGUgb3B0aW9uIHByb3ZpZGVzIGFyaXRobWV0aWMgZnVuY3Rpb24gdXNpbmcgY29yZGljIGFsZ29yaXRobQorCSAgc28gaXRzIGNhbGN1bGF0aW9ucyBhcmUgaW4gZml4ZWQgcG9pbnQuIE1vZHVsZXMgY2FuIHNlbGVjdCB0aGlzCisJICB3aGVuIHRoZXkgcmVxdWlyZSB0aGlzIGZ1bmN0aW9uLiBNb2R1bGUgd2lsbCBiZSBjYWxsZWQgY29yZGljLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmluZGV4IGRkMzczYzguLmMwY2I5YzQgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLmRlYnVnCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnCkBAIC0yMjcsNyArMjI3LDcgQEAKIGNvbmZpZyBERVRFQ1RfSFVOR19UQVNLCiAJYm9vbCAiRGV0ZWN0IEh1bmcgVGFza3MiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKLQlkZWZhdWx0IERFVEVDVF9TT0ZUTE9DS1VQCisJZGVmYXVsdCBMT0NLVVBfREVURUNUT1IKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUga2VybmVsIHRvIGRldGVjdCAiaHVuZyB0YXNrcyIsCiAJICB3aGljaCBhcmUgYnVncyB0aGF0IGNhdXNlIHRoZSB0YXNrIHRvIGJlIHN0dWNrIGluCkBAIC02NDgsMTIgKzY0OCwxNSBAQAogCSAgRW5hYmxlcyBob29rcyB0byBpbnRlcnJ1cHQgZW5hYmxpbmcgYW5kIGRpc2FibGluZyBmb3IKIAkgIGVpdGhlciB0cmFjaW5nIG9yIGxvY2sgZGVidWdnaW5nLgogCi1jb25maWcgREVCVUdfU1BJTkxPQ0tfU0xFRVAKLQlib29sICJTcGlubG9jayBkZWJ1Z2dpbmc6IHNsZWVwLWluc2lkZS1zcGlubG9jayBjaGVja2luZyIKK2NvbmZpZyBERUJVR19BVE9NSUNfU0xFRVAKKwlib29sICJTbGVlcCBpbnNpZGUgYXRvbWljIHNlY3Rpb24gY2hlY2tpbmciCisJc2VsZWN0IFBSRUVNUFRfQ09VTlQKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB2YXJpb3VzIHJvdXRpbmVzIHdoaWNoIG1heSBzbGVlcCB3aWxsIGJlY29tZSB2ZXJ5Ci0JICBub2lzeSBpZiB0aGV5IGFyZSBjYWxsZWQgd2l0aCBhIHNwaW5sb2NrIGhlbGQuCisJICBub2lzeSBpZiB0aGV5IGFyZSBjYWxsZWQgaW5zaWRlIGF0b21pYyBzZWN0aW9uczogd2hlbiBhIHNwaW5sb2NrIGlzCisJICBoZWxkLCBpbnNpZGUgYW4gcmN1IHJlYWQgc2lkZSBjcml0aWNhbCBzZWN0aW9uLCBpbnNpZGUgcHJlZW1wdCBkaXNhYmxlZAorCSAgc2VjdGlvbnMsIGluc2lkZSBhbiBpbnRlcnJ1cHQsIGV0Yy4uLgogCiBjb25maWcgREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTCiAJYm9vbCAiTG9ja2luZyBBUEkgYm9vdC10aW1lIHNlbGYtdGVzdHMiCkBAIC04NjYsNyArODY5LDcgQEAKIAkgIHN5c3RlbSwgYW5kIHRoZW4gc2V0ICJscGo9TSIgYmVmb3JlIHNldHRpbmcgImJvb3RfZGVsYXk9TiIuCiAJICBOT1RFOiAgVXNpbmcgdGhpcyBvcHRpb24gbWF5IGFkdmVyc2VseSBhZmZlY3QgU01QIHN5c3RlbXMuCiAJICBJLmUuLCBwcm9jZXNzb3JzIG90aGVyIHRoYW4gdGhlIGZpcnN0IG9uZSBtYXkgbm90IGJvb3QgdXAuCi0JICBCT09UX1BSSU5US19ERUxBWSBhbHNvIG1heSBjYXVzZSBERVRFQ1RfU09GVExPQ0tVUCB0byBkZXRlY3QKKwkgIEJPT1RfUFJJTlRLX0RFTEFZIGFsc28gbWF5IGNhdXNlIExPQ0tVUF9ERVRFQ1RPUiB0byBkZXRlY3QKIAkgIHdoYXQgaXQgYmVsaWV2ZXMgdG8gYmUgbG9ja3VwIGNvbmRpdGlvbnMuCiAKIGNvbmZpZyBSQ1VfVE9SVFVSRV9URVNUCmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUgYi9saWIvTWFrZWZpbGUKaW5kZXggNmI1OTdmZC4uODkyZjRlMiAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlCisrKyBiL2xpYi9NYWtlZmlsZQpAQCAtNjEsNiArNjEsNyBAQAogb2JqLSQoQ09ORklHX0NSQzMyKQkrPSBjcmMzMi5vCiBvYmotJChDT05GSUdfQ1JDNykJKz0gY3JjNy5vCiBvYmotJChDT05GSUdfTElCQ1JDMzJDKQkrPSBsaWJjcmMzMmMubworb2JqLSQoQ09ORklHX0NSQzgpCSs9IGNyYzgubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfQUxMT0NBVE9SKSArPSBnZW5hbGxvYy5vCiAKIG9iai0kKENPTkZJR19aTElCX0lORkxBVEUpICs9IHpsaWJfaW5mbGF0ZS8KQEAgLTExMiw2ICsxMTMsOCBAQAogCiBvYmotJChDT05GSUdfQ1BVX1JNQVApICs9IGNwdV9ybWFwLm8KIAorb2JqLSQoQ09ORklHX0NPUkRJQykgKz0gY29yZGljLm8KKwogaG9zdHByb2dzLXkJOj0gZ2VuX2NyYzMydGFibGUKIGNsZWFuLWZpbGVzCTo9IGNyYzMydGFibGUuaAogCmRpZmYgLS1naXQgYS9saWIvYml0bWFwLmMgYi9saWIvYml0bWFwLmMKaW5kZXggNDFiYWYwMi4uM2YzYjY4MSAxMDA2NDQKLS0tIGEvbGliL2JpdG1hcC5jCisrKyBiL2xpYi9iaXRtYXAuYwpAQCAtNTcyLDcgKzU3Miw3IEBACiAKIC8qKgogICogX19iaXRtYXBfcGFyc2VsaXN0IC0gY29udmVydCBsaXN0IGZvcm1hdCBBU0NJSSBzdHJpbmcgdG8gYml0bWFwCi0gKiBAYnA6IHJlYWQgbnVsLXRlcm1pbmF0ZWQgdXNlciBzdHJpbmcgZnJvbSB0aGlzIGJ1ZmZlcgorICogQGJ1ZjogcmVhZCBudWwtdGVybWluYXRlZCB1c2VyIHN0cmluZyBmcm9tIHRoaXMgYnVmZmVyCiAgKiBAYnVmbGVuOiBidWZmZXIgc2l6ZSBpbiBieXRlcy4gIElmIHN0cmluZyBpcyBzbWFsbGVyIHRoYW4gdGhpcwogICogICAgdGhlbiBpdCBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhIFwwLgogICogQGlzX3VzZXI6IGxvY2F0aW9uIG9mIGJ1ZmZlciwgMCBpbmRpY2F0ZXMga2VybmVsIHNwYWNlCmRpZmYgLS1naXQgYS9saWIvY2hlY2tzdW0uYyBiL2xpYi9jaGVja3N1bS5jCmluZGV4IDA5NzUwODcuLjhkZjJmOTEgMTAwNjQ0Ci0tLSBhL2xpYi9jaGVja3N1bS5jCisrKyBiL2xpYi9jaGVja3N1bS5jCkBAIC00OSw3ICs0OSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZG9fY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgbGVuKQogewotCWludCBvZGQsIGNvdW50OworCWludCBvZGQ7CiAJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CiAKIAlpZiAobGVuIDw9IDApCkBAIC02NCwyNSArNjQsMjIgQEAKIAkJbGVuLS07CiAJCWJ1ZmYrKzsKIAl9Ci0JY291bnQgPSBsZW4gPj4gMTsJCS8qIG5yIG9mIDE2LWJpdCB3b3Jkcy4uICovCi0JaWYgKGNvdW50KSB7CisJaWYgKGxlbiA+PSAyKSB7CiAJCWlmICgyICYgKHVuc2lnbmVkIGxvbmcpIGJ1ZmYpIHsKIAkJCXJlc3VsdCArPSAqKHVuc2lnbmVkIHNob3J0ICopIGJ1ZmY7Ci0JCQljb3VudC0tOwogCQkJbGVuIC09IDI7CiAJCQlidWZmICs9IDI7CiAJCX0KLQkJY291bnQgPj49IDE7CQkvKiBuciBvZiAzMi1iaXQgd29yZHMuLiAqLwotCQlpZiAoY291bnQpIHsKKwkJaWYgKGxlbiA+PSA0KSB7CisJCQljb25zdCB1bnNpZ25lZCBjaGFyICplbmQgPSBidWZmICsgKCh1bnNpZ25lZClsZW4gJiB+Myk7CiAJCQl1bnNpZ25lZCBpbnQgY2FycnkgPSAwOwogCQkJZG8gewogCQkJCXVuc2lnbmVkIGludCB3ID0gKih1bnNpZ25lZCBpbnQgKikgYnVmZjsKLQkJCQljb3VudC0tOwogCQkJCWJ1ZmYgKz0gNDsKIAkJCQlyZXN1bHQgKz0gY2Fycnk7CiAJCQkJcmVzdWx0ICs9IHc7CiAJCQkJY2FycnkgPSAodyA+IHJlc3VsdCk7Ci0JCQl9IHdoaWxlIChjb3VudCk7CisJCQl9IHdoaWxlIChidWZmIDwgZW5kKTsKIAkJCXJlc3VsdCArPSBjYXJyeTsKIAkJCXJlc3VsdCA9IChyZXN1bHQgJiAweGZmZmYpICsgKHJlc3VsdCA+PiAxNik7CiAJCX0KZGlmZiAtLWdpdCBhL2xpYi9jb3JkaWMuYyBiL2xpYi9jb3JkaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTI3YTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvcmRpYy5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb3JkaWMuaD4KKworI2RlZmluZSBDT1JESUNfQU5HTEVfR0VOCTM5Nzk3CisjZGVmaW5lIENPUkRJQ19QUkVDSVNJT05fU0hJRlQJMTYKKyNkZWZpbmUJQ09SRElDX05VTV9JVEVSCQkoQ09SRElDX1BSRUNJU0lPTl9TSElGVCArIDIpCisKKyNkZWZpbmUJRklYRUQoWCkJKChzMzIpKChYKSA8PCBDT1JESUNfUFJFQ0lTSU9OX1NISUZUKSkKKyNkZWZpbmUJRkxPQVQoWCkJKCgoWCkgPj0gMCkgXAorCQk/ICgoKChYKSA+PiAoQ09SRElDX1BSRUNJU0lPTl9TSElGVCAtIDEpKSArIDEpID4+IDEpIFwKKwkJOiAtKCgoKC0oWCkpID4+IChDT1JESUNfUFJFQ0lTSU9OX1NISUZUIC0gMSkpICsgMSkgPj4gMSkpCisKK3N0YXRpYyBjb25zdCBzMzIgYXJjdGFuX3RhYmxlW10gPSB7CisJMjk0OTEyMCwKKwkxNzQwOTY3LAorCTkxOTg3OSwKKwk0NjY5NDUsCisJMjM0Mzc5LAorCTExNzMwNCwKKwk1ODY2NiwKKwkyOTMzNSwKKwkxNDY2OCwKKwk3MzM0LAorCTM2NjcsCisJMTgzMywKKwk5MTcsCisJNDU4LAorCTIyOSwKKwkxMTUsCisJNTcsCisJMjkKK307CisKKy8qCisgKiBjb3JkaWNfY2FsY19pcSgpIC0gY2FsY3VsYXRlcyB0aGUgaS9xIGNvb3JkaW5hdGUgZm9yIGdpdmVuIGFuZ2xlCisgKgorICogdGhldGE6IGFuZ2xlIGluIGRlZ3JlZXMgZm9yIHdoaWNoIGkvcSBjb29yZGluYXRlIGlzIHRvIGJlIGNhbGN1bGF0ZWQKKyAqIGNvb3JkOiBmdW5jdGlvbiBvdXRwdXQgcGFyYW1ldGVyIGhvbGRpbmcgdGhlIGkvcSBjb29yZGluYXRlCisgKi8KK3N0cnVjdCBjb3JkaWNfaXEgY29yZGljX2NhbGNfaXEoczMyIHRoZXRhKQoreworCXN0cnVjdCBjb3JkaWNfaXEgY29vcmQ7CisJczMyIGFuZ2xlLCB2YWx0bXA7CisJdW5zaWduZWQgaXRlcjsKKwlpbnQgc2lnbnggPSAxOworCWludCBzaWdudGhldGE7CisKKwljb29yZC5pID0gQ09SRElDX0FOR0xFX0dFTjsKKwljb29yZC5xID0gMDsKKwlhbmdsZSA9IDA7CisKKwl0aGV0YSA9IEZJWEVEKHRoZXRhKTsKKwlzaWdudGhldGEgPSAodGhldGEgPCAwKSA/IC0xIDogMTsKKwl0aGV0YSA9ICgodGhldGEgKyBGSVhFRCgxODApICogc2lnbnRoZXRhKSAlIEZJWEVEKDM2MCkpIC0KKwkJRklYRUQoMTgwKSAqIHNpZ250aGV0YTsKKworCWlmIChGTE9BVCh0aGV0YSkgPiA5MCkgeworCQl0aGV0YSAtPSBGSVhFRCgxODApOworCQlzaWdueCA9IC0xOworCX0gZWxzZSBpZiAoRkxPQVQodGhldGEpIDwgLTkwKSB7CisJCXRoZXRhICs9IEZJWEVEKDE4MCk7CisJCXNpZ254ID0gLTE7CisJfQorCisJZm9yIChpdGVyID0gMDsgaXRlciA8IENPUkRJQ19OVU1fSVRFUjsgaXRlcisrKSB7CisJCWlmICh0aGV0YSA+IGFuZ2xlKSB7CisJCQl2YWx0bXAgPSBjb29yZC5pIC0gKGNvb3JkLnEgPj4gaXRlcik7CisJCQljb29yZC5xICs9IChjb29yZC5pID4+IGl0ZXIpOworCQkJYW5nbGUgKz0gYXJjdGFuX3RhYmxlW2l0ZXJdOworCQl9IGVsc2UgeworCQkJdmFsdG1wID0gY29vcmQuaSArIChjb29yZC5xID4+IGl0ZXIpOworCQkJY29vcmQucSAtPSAoY29vcmQuaSA+PiBpdGVyKTsKKwkJCWFuZ2xlIC09IGFyY3Rhbl90YWJsZVtpdGVyXTsKKwkJfQorCQljb29yZC5pID0gdmFsdG1wOworCX0KKworCWNvb3JkLmkgKj0gc2lnbng7CisJY29vcmQucSAqPSBzaWdueDsKKwlyZXR1cm4gY29vcmQ7Cit9CitFWFBPUlRfU1lNQk9MKGNvcmRpY19jYWxjX2lxKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb3JkaWMgZnVuY3Rpb25zIik7CitNT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvbGliL2NyYzguYyBiL2xpYi9jcmM4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiNTljYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcmM4LmMKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkJCUtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmM4Lmg+CisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisKKy8qCisgKiBjcmM4X3BvcHVsYXRlX21zYiAtIGZpbGwgY3JjIHRhYmxlIGZvciBnaXZlbiBwb2x5bm9taWFsIGluIHJldmVyc2UgYml0IG9yZGVyLgorICoKKyAqIHRhYmxlOgl0YWJsZSB0byBiZSBmaWxsZWQuCisgKiBwb2x5bm9taWFsOglwb2x5bm9taWFsIGZvciB3aGljaCB0YWJsZSBpcyB0byBiZSBmaWxsZWQuCisgKi8KK3ZvaWQgY3JjOF9wb3B1bGF0ZV9tc2IodTggdGFibGVbQ1JDOF9UQUJMRV9TSVpFXSwgdTggcG9seW5vbWlhbCkKK3sKKwlpbnQgaSwgajsKKwljb25zdCB1OCBtc2JpdCA9IDB4ODA7CisJdTggdCA9IG1zYml0OworCisJdGFibGVbMF0gPSAwOworCisJZm9yIChpID0gMTsgaSA8IENSQzhfVEFCTEVfU0laRTsgaSAqPSAyKSB7CisJCXQgPSAodCA8PCAxKSBeICh0ICYgbXNiaXQgPyBwb2x5bm9taWFsIDogMCk7CisJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCQl0YWJsZVtpK2pdID0gdGFibGVbal0gXiB0OworCX0KK30KK0VYUE9SVF9TWU1CT0woY3JjOF9wb3B1bGF0ZV9tc2IpOworCisvKgorICogY3JjOF9wb3B1bGF0ZV9sc2IgLSBmaWxsIGNyYyB0YWJsZSBmb3IgZ2l2ZW4gcG9seW5vbWlhbCBpbiByZWd1bGFyIGJpdCBvcmRlci4KKyAqCisgKiB0YWJsZToJdGFibGUgdG8gYmUgZmlsbGVkLgorICogcG9seW5vbWlhbDoJcG9seW5vbWlhbCBmb3Igd2hpY2ggdGFibGUgaXMgdG8gYmUgZmlsbGVkLgorICovCit2b2lkIGNyYzhfcG9wdWxhdGVfbHNiKHU4IHRhYmxlW0NSQzhfVEFCTEVfU0laRV0sIHU4IHBvbHlub21pYWwpCit7CisJaW50IGksIGo7CisJdTggdCA9IDE7CisKKwl0YWJsZVswXSA9IDA7CisKKwlmb3IgKGkgPSAoQ1JDOF9UQUJMRV9TSVpFID4+IDEpOyBpOyBpID4+PSAxKSB7CisJCXQgPSAodCA+PiAxKSBeICh0ICYgMSA/IHBvbHlub21pYWwgOiAwKTsKKwkJZm9yIChqID0gMDsgaiA8IENSQzhfVEFCTEVfU0laRTsgaiArPSAyKmkpCisJCQl0YWJsZVtpK2pdID0gdGFibGVbal0gXiB0OworCX0KK30KK0VYUE9SVF9TWU1CT0woY3JjOF9wb3B1bGF0ZV9sc2IpOworCisvKgorICogY3JjOCAtIGNhbGN1bGF0ZSBhIGNyYzggb3ZlciB0aGUgZ2l2ZW4gaW5wdXQgZGF0YS4KKyAqCisgKiB0YWJsZTogY3JjIHRhYmxlIHVzZWQgZm9yIGNhbGN1bGF0aW9uLgorICogcGRhdGE6IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCisgKiBuYnl0ZXM6IG51bWJlciBvZiBieXRlcyBpbiBkYXRhIGJ1ZmZlci4KKyAqIGNyYzoJcHJldmlvdXMgcmV0dXJuZWQgY3JjOCB2YWx1ZS4KKyAqLwordTggY3JjOChjb25zdCB1OCB0YWJsZVtDUkM4X1RBQkxFX1NJWkVdLCB1OCAqcGRhdGEsIHNpemVfdCBuYnl0ZXMsIHU4IGNyYykKK3sKKwkvKiBsb29wIG92ZXIgdGhlIGJ1ZmZlciBkYXRhICovCisJd2hpbGUgKG5ieXRlcy0tID4gMCkKKwkJY3JjID0gdGFibGVbKGNyYyBeICpwZGF0YSsrKSAmIDB4ZmZdOworCisJcmV0dXJuIGNyYzsKK30KK0VYUE9SVF9TWU1CT0woY3JjOCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ1JDOCAoYnkgV2lsbGlhbXMsIFJvc3MgTi4pIGZ1bmN0aW9uIik7CitNT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvbGliL2RlYnVnb2JqZWN0cy5jIGIvbGliL2RlYnVnb2JqZWN0cy5jCmluZGV4IDlkODZlNDUuLmE3OGI3YzYgMTAwNjQ0Ci0tLSBhL2xpYi9kZWJ1Z29iamVjdHMuYworKysgYi9saWIvZGVidWdvYmplY3RzLmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogCSAqIGluaXRpYWxpemVkOgogCSAqLwogCWlmIChvYmpfcG9vbF9mcmVlID4gT0RFQlVHX1BPT0xfU0laRSAmJiBvYmpfY2FjaGUpCi0JCXNjaGVkID0gIXdvcmtfcGVuZGluZygmZGVidWdfb2JqX3dvcmspOworCQlzY2hlZCA9IGtldmVudGRfdXAoKSAmJiAhd29ya19wZW5kaW5nKCZkZWJ1Z19vYmpfd29yayk7CiAJaGxpc3RfYWRkX2hlYWQoJm9iai0+bm9kZSwgJm9ial9wb29sKTsKIAlvYmpfcG9vbF9mcmVlKys7CiAJb2JqX3Bvb2xfdXNlZC0tOwpkaWZmIC0tZ2l0IGEvbGliL2RldnJlcy5jIGIvbGliL2RldnJlcy5jCmluZGV4IDZlZmRkZjUuLjdjMGU5NTMgMTAwNjQ0Ci0tLSBhL2xpYi9kZXZyZXMuYworKysgYi9saWIvZGV2cmVzLmMKQEAgLTc5LDkgKzc5LDkgQEAKICAqLwogdm9pZCBkZXZtX2lvdW5tYXAoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JaW91bm1hcChhZGRyKTsKIAlXQVJOX09OKGRldnJlc19kZXN0cm95KGRldiwgZGV2bV9pb3JlbWFwX3JlbGVhc2UsIGRldm1faW9yZW1hcF9tYXRjaCwKIAkJCSAgICAgICAodm9pZCAqKWFkZHIpKTsKKwlpb3VubWFwKGFkZHIpOwogfQogRVhQT1JUX1NZTUJPTChkZXZtX2lvdW5tYXApOwogCmRpZmYgLS1naXQgYS9saWIvaW9tYXAuYyBiL2xpYi9pb21hcC5jCmluZGV4IGQzMjIyOTMuLjVkYmNiNGIgMTAwNjQ0Ci0tLSBhL2xpYi9pb21hcC5jCisrKyBiL2xpYi9pb21hcC5jCkBAIC0yMjQsNiArMjI0LDcgQEAKIEVYUE9SVF9TWU1CT0woaW93cml0ZTE2X3JlcCk7CiBFWFBPUlRfU1lNQk9MKGlvd3JpdGUzMl9yZXApOwogCisjaWZkZWYgQ09ORklHX0hBU19JT1BPUlQKIC8qIENyZWF0ZSBhIHZpcnR1YWwgbWFwcGluZyBjb29raWUgZm9yIGFuIElPIHBvcnQgcmFuZ2UgKi8KIHZvaWQgX19pb21lbSAqaW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBucikKIHsKQEAgLTIzOCw3ICsyMzksOSBAQAogfQogRVhQT1JUX1NZTUJPTChpb3BvcnRfbWFwKTsKIEVYUE9SVF9TWU1CT0woaW9wb3J0X3VubWFwKTsKKyNlbmRpZiAvKiBDT05GSUdfSEFTX0lPUE9SVCAqLwogCisjaWZkZWYgQ09ORklHX1BDSQogLyoqCiAgKiBwY2lfaW9tYXAgLSBjcmVhdGUgYSB2aXJ0dWFsIG1hcHBpbmcgY29va2llIGZvciBhIFBDSSBCQVIKICAqIEBkZXY6IFBDSSBkZXZpY2UgdGhhdCBvd25zIHRoZSBCQVIKQEAgLTI4MCwzICsyODMsNCBAQAogfQogRVhQT1JUX1NZTUJPTChwY2lfaW9tYXApOwogRVhQT1JUX1NZTUJPTChwY2lfaW91bm1hcCk7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvbGliL2tvYmplY3QuYyBiL2xpYi9rb2JqZWN0LmMKaW5kZXggODJkYzM0Yy4uNjQwYmQ5OCAxMDA2NDQKLS0tIGEvbGliL2tvYmplY3QuYworKysgYi9saWIva29iamVjdC5jCkBAIC05NDgsMTQgKzk0OCwxNCBAQAogfQogCiAKLWNvbnN0IHZvaWQgKmtvYmpfbnNfY3VycmVudChlbnVtIGtvYmpfbnNfdHlwZSB0eXBlKQordm9pZCAqa29ial9uc19ncmFiX2N1cnJlbnQoZW51bSBrb2JqX25zX3R5cGUgdHlwZSkKIHsKLQljb25zdCB2b2lkICpucyA9IE5VTEw7CisJdm9pZCAqbnMgPSBOVUxMOwogCiAJc3Bpbl9sb2NrKCZrb2JqX25zX3R5cGVfbG9jayk7CiAJaWYgKCh0eXBlID4gS09CSl9OU19UWVBFX05PTkUpICYmICh0eXBlIDwgS09CSl9OU19UWVBFUykgJiYKIAkgICAga29ial9uc19vcHNfdGJsW3R5cGVdKQotCQlucyA9IGtvYmpfbnNfb3BzX3RibFt0eXBlXS0+Y3VycmVudF9ucygpOworCQlucyA9IGtvYmpfbnNfb3BzX3RibFt0eXBlXS0+Z3JhYl9jdXJyZW50X25zKCk7CiAJc3Bpbl91bmxvY2soJmtvYmpfbnNfdHlwZV9sb2NrKTsKIAogCXJldHVybiBuczsKQEAgLTk4NywyMyArOTg3LDE1IEBACiAJcmV0dXJuIG5zOwogfQogCi0vKgotICoga29ial9uc19leGl0IC0gaW52YWxpZGF0ZSBhIG5hbWVzcGFjZSB0YWcKLSAqCi0gKiBAdHlwZTogdGhlIG5hbWVzcGFjZSB0eXBlIChpLmUuIEtPQkpfTlNfVFlQRV9ORVQpCi0gKiBAbnM6IHRoZSBhY3R1YWwgbmFtZXNwYWNlIGJlaW5nIGludmFsaWRhdGVkCi0gKgotICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHRhZyBpcyBubyBsb25nZXIgdmFsaWQuICBGb3IgaW5zdGFuY2UsCi0gKiB3aGVuIGEgbmV0d29yayBuYW1lc3BhY2UgZXhpdHMsIGl0IHVzZXMgdGhpcyBoZWxwZXIgdG8KLSAqIG1ha2Ugc3VyZSBubyBzYidzIHN5c2ZzX2luZm8gcG9pbnRzIHRvIHRoZSBub3ctaW52YWxpZGF0ZWQKLSAqIG5ldG5zLgotICovCi12b2lkIGtvYmpfbnNfZXhpdChlbnVtIGtvYmpfbnNfdHlwZSB0eXBlLCBjb25zdCB2b2lkICpucykKK3ZvaWQga29ial9uc19kcm9wKGVudW0ga29ial9uc190eXBlIHR5cGUsIHZvaWQgKm5zKQogewotCXN5c2ZzX2V4aXRfbnModHlwZSwgbnMpOworCXNwaW5fbG9jaygma29ial9uc190eXBlX2xvY2spOworCWlmICgodHlwZSA+IEtPQkpfTlNfVFlQRV9OT05FKSAmJiAodHlwZSA8IEtPQkpfTlNfVFlQRVMpICYmCisJICAgIGtvYmpfbnNfb3BzX3RibFt0eXBlXSAmJiBrb2JqX25zX29wc190YmxbdHlwZV0tPmRyb3BfbnMpCisJCWtvYmpfbnNfb3BzX3RibFt0eXBlXS0+ZHJvcF9ucyhucyk7CisJc3Bpbl91bmxvY2soJmtvYmpfbnNfdHlwZV9sb2NrKTsKIH0KIAotCiBFWFBPUlRfU1lNQk9MKGtvYmplY3RfZ2V0KTsKIEVYUE9SVF9TWU1CT0woa29iamVjdF9wdXQpOwogRVhQT1JUX1NZTUJPTChrb2JqZWN0X2RlbCk7CmRpZmYgLS1naXQgYS9saWIva3N0cnRveC5jIGIvbGliL2tzdHJ0b3guYwppbmRleCAyZGJhZTg4Li41ZTA2Njc1IDEwMDY0NAotLS0gYS9saWIva3N0cnRveC5jCisrKyBiL2xpYi9rc3RydG94LmMKQEAgLTE5LDExICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi1zdGF0aWMgaW5saW5lIGNoYXIgX3RvbG93ZXIoY29uc3QgY2hhciBjKQotewotCXJldHVybiBjIHwgMHgyMDsKLX0KLQogc3RhdGljIGludCBfa3N0cnRvdWxsKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnJlcykKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgYWNjOwpkaWZmIC0tZ2l0IGEvbGliL2xjbS5jIGIvbGliL2xjbS5jCmluZGV4IDE1N2NkODguLjEwYjVjZmMgMTAwNjQ0Ci0tLSBhL2xpYi9sY20uYworKysgYi9saWIvbGNtLmMKQEAgLTEsNiArMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZ2NkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbGNtLmg+CiAKIC8qIExvd2VzdCBjb21tb24gbXVsdGlwbGUgKi8KIHVuc2lnbmVkIGxvbmcgbGNtKHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiKQpkaWZmIC0tZ2l0IGEvbGliL3BsaXN0LmMgYi9saWIvcGxpc3QuYwppbmRleCAwYWU3ZTY0Li5hMGE0ZGE0IDEwMDY0NAotLS0gYS9saWIvcGxpc3QuYworKysgYi9saWIvcGxpc3QuYwpAQCAtNTYsMTEgKzU2LDYgQEAKIAogc3RhdGljIHZvaWQgcGxpc3RfY2hlY2tfaGVhZChzdHJ1Y3QgcGxpc3RfaGVhZCAqaGVhZCkKIHsKLQlXQVJOX09OKGhlYWQgIT0gJnRlc3RfaGVhZCAmJiAhaGVhZC0+cmF3bG9jayAmJiAhaGVhZC0+c3BpbmxvY2spOwotCWlmIChoZWFkLT5yYXdsb2NrKQotCQlXQVJOX09OX1NNUCghcmF3X3NwaW5faXNfbG9ja2VkKGhlYWQtPnJhd2xvY2spKTsKLQlpZiAoaGVhZC0+c3BpbmxvY2spCi0JCVdBUk5fT05fU01QKCFzcGluX2lzX2xvY2tlZChoZWFkLT5zcGlubG9jaykpOwogCWlmICghcGxpc3RfaGVhZF9lbXB0eShoZWFkKSkKIAkJcGxpc3RfY2hlY2tfbGlzdCgmcGxpc3RfZmlyc3QoaGVhZCktPnByaW9fbGlzdCk7CiAJcGxpc3RfY2hlY2tfbGlzdCgmaGVhZC0+bm9kZV9saXN0KTsKQEAgLTE4MCw3ICsxNzUsNyBAQAogCXVuc2lnbmVkIGludCByID0gbG9jYWxfY2xvY2soKTsKIAogCXByaW50ayhLRVJOX0lORk8gInN0YXJ0IHBsaXN0IHRlc3RcbiIpOwotCXBsaXN0X2hlYWRfaW5pdCgmdGVzdF9oZWFkLCBOVUxMKTsKKwlwbGlzdF9oZWFkX2luaXQoJnRlc3RfaGVhZCk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVzdF9ub2RlKTsgaSsrKQogCQlwbGlzdF9ub2RlX2luaXQodGVzdF9ub2RlICsgaSwgMCk7CiAKZGlmZiAtLWdpdCBhL2xpYi9zd2lvdGxiLmMgYi9saWIvc3dpb3RsYi5jCmluZGV4IDkzY2EwOGIuLjk5MDkzYjMgMTAwNjQ0Ci0tLSBhL2xpYi9zd2lvdGxiLmMKKysrIGIvbGliL3N3aW90bGIuYwpAQCAtMTEwLDYgKzExMCwxMSBAQAogX19zZXR1cCgic3dpb3RsYj0iLCBzZXR1cF9pb190bGJfbnBhZ2VzKTsKIC8qIG1ha2UgaW9fdGxiX292ZXJmbG93IHR1bmFibGUgdG9vPyAqLwogCit1bnNpZ25lZCBsb25nIHN3aW9sdGJfbnJfdGJsKHZvaWQpCit7CisJcmV0dXJuIGlvX3RsYl9uc2xhYnM7Cit9CisKIC8qIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoIGhpZ2htZW0gcGFnZSAqLwogc3RhdGljIGRtYV9hZGRyX3Qgc3dpb3RsYl92aXJ0X3RvX2J1cyhzdHJ1Y3QgZGV2aWNlICpod2RldiwKIAkJCQkgICAgICB2b2xhdGlsZSB2b2lkICphZGRyZXNzKQpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCBjMTEyMDU2Li5kNzIyMmE5IDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtMzEsMTMgKzMxLDEwIEBACiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CS8qIGZvciBkZXJlZmVyZW5jZV9mdW5jdGlvbl9kZXNjcmlwdG9yKCkgKi8KIAotLyogV29ya3Mgb25seSBmb3IgZGlnaXRzIGFuZCBsZXR0ZXJzLCBidXQgc21hbGwgYW5kIGZhc3QgKi8KLSNkZWZpbmUgVE9MT1dFUih4KSAoKHgpIHwgMHgyMCkKLQogc3RhdGljIHVuc2lnbmVkIGludCBzaW1wbGVfZ3Vlc3NfYmFzZShjb25zdCBjaGFyICpjcCkKIHsKIAlpZiAoY3BbMF0gPT0gJzAnKSB7Ci0JCWlmIChUT0xPV0VSKGNwWzFdKSA9PSAneCcgJiYgaXN4ZGlnaXQoY3BbMl0pKQorCQlpZiAoX3RvbG93ZXIoY3BbMV0pID09ICd4JyAmJiBpc3hkaWdpdChjcFsyXSkpCiAJCQlyZXR1cm4gMTY7CiAJCWVsc2UKIAkJCXJldHVybiA4OwpAQCAtNTksMTMgKzU2LDEzIEBACiAJaWYgKCFiYXNlKQogCQliYXNlID0gc2ltcGxlX2d1ZXNzX2Jhc2UoY3ApOwogCi0JaWYgKGJhc2UgPT0gMTYgJiYgY3BbMF0gPT0gJzAnICYmIFRPTE9XRVIoY3BbMV0pID09ICd4JykKKwlpZiAoYmFzZSA9PSAxNiAmJiBjcFswXSA9PSAnMCcgJiYgX3RvbG93ZXIoY3BbMV0pID09ICd4JykKIAkJY3AgKz0gMjsKIAogCXdoaWxlIChpc3hkaWdpdCgqY3ApKSB7CiAJCXVuc2lnbmVkIGludCB2YWx1ZTsKIAotCQl2YWx1ZSA9IGlzZGlnaXQoKmNwKSA/ICpjcCAtICcwJyA6IFRPTE9XRVIoKmNwKSAtICdhJyArIDEwOworCQl2YWx1ZSA9IGlzZGlnaXQoKmNwKSA/ICpjcCAtICcwJyA6IF90b2xvd2VyKCpjcCkgLSAnYScgKyAxMDsKIAkJaWYgKHZhbHVlID49IGJhc2UpCiAJCQlicmVhazsKIAkJcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIHZhbHVlOwpAQCAtNjY2LDYgKzY2Myw4IEBACiAJCQljb2xvbnBvcyA9IGk7CiAJCX0KIAl9CisJaWYgKGxvbmdlc3QgPT0gMSkJCS8qIGRvbid0IGNvbXByZXNzIGEgc2luZ2xlIDAgKi8KKwkJY29sb25wb3MgPSAtMTsKIAogCS8qIGVtaXQgYWRkcmVzcyAqLwogCWZvciAoaSA9IDA7IGkgPCByYW5nZTsgaSsrKSB7CkBAIC04MjYsNyArODI1LDcgQEAKICAqICAgICAgIElQdjQgdXNlcyBkb3Qtc2VwYXJhdGVkIGRlY2ltYWwgd2l0aCBsZWFkaW5nIDAncyAoMDEwLjEyMy4wNDUuMDA2KQogICogLSAnW0lpXTRbaG5ibF0nIElQdjQgYWRkcmVzc2VzIGluIGhvc3QsIG5ldHdvcmssIGJpZyBvciBsaXR0bGUgZW5kaWFuIG9yZGVyCiAgKiAtICdJNmMnIGZvciBJUHY2IGFkZHJlc3NlcyBwcmludGVkIGFzIHNwZWNpZmllZCBieQotICogICAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi02bWFuLXRleHQtYWRkci1yZXByZXNlbnRhdGlvbi0wMAorICogICAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTk1MgogICogLSAnVScgRm9yIGEgMTYgYnl0ZSBVVUlEL0dVSUQsIGl0IHByaW50cyB0aGUgVVVJRC9HVUlEIGluIHRoZSBmb3JtCiAgKiAgICAgICAieHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IgogICogICAgICAgT3B0aW9ucyBmb3IgJXBVIGFyZToKQEAgLTEwMzQsOCArMTAzMyw4IEBACiBxdWFsaWZpZXI6CiAJLyogZ2V0IHRoZSBjb252ZXJzaW9uIHF1YWxpZmllciAqLwogCXNwZWMtPnF1YWxpZmllciA9IC0xOwotCWlmICgqZm10ID09ICdoJyB8fCBUT0xPV0VSKCpmbXQpID09ICdsJyB8fAotCSAgICBUT0xPV0VSKCpmbXQpID09ICd6JyB8fCAqZm10ID09ICd0JykgeworCWlmICgqZm10ID09ICdoJyB8fCBfdG9sb3dlcigqZm10KSA9PSAnbCcgfHwKKwkgICAgX3RvbG93ZXIoKmZtdCkgPT0gJ3onIHx8ICpmbXQgPT0gJ3QnKSB7CiAJCXNwZWMtPnF1YWxpZmllciA9ICpmbXQrKzsKIAkJaWYgKHVubGlrZWx5KHNwZWMtPnF1YWxpZmllciA9PSAqZm10KSkgewogCQkJaWYgKHNwZWMtPnF1YWxpZmllciA9PSAnbCcpIHsKQEAgLTExMDIsNyArMTEwMSw3IEBACiAJCQlzcGVjLT50eXBlID0gRk9STUFUX1RZUEVfTE9ORzsKIAkJZWxzZQogCQkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1VMT05HOwotCX0gZWxzZSBpZiAoVE9MT1dFUihzcGVjLT5xdWFsaWZpZXIpID09ICd6JykgeworCX0gZWxzZSBpZiAoX3RvbG93ZXIoc3BlYy0+cXVhbGlmaWVyKSA9PSAneicpIHsKIAkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1NJWkVfVDsKIAl9IGVsc2UgaWYgKHNwZWMtPnF1YWxpZmllciA9PSAndCcpIHsKIAkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1BUUkRJRkY7CkBAIC0xMTQ3LDggKzExNDYsNyBAQAogICogJXBpNCBwcmludCBhbiBJUHY0IGFkZHJlc3Mgd2l0aCBsZWFkaW5nIHplcm9zCiAgKiAlcEk2IHByaW50IGFuIElQdjYgYWRkcmVzcyB3aXRoIGNvbG9ucwogICogJXBpNiBwcmludCBhbiBJUHY2IGFkZHJlc3Mgd2l0aG91dCBjb2xvbnMKLSAqICVwSTZjIHByaW50IGFuIElQdjYgYWRkcmVzcyBhcyBzcGVjaWZpZWQgYnkKLSAqICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi02bWFuLXRleHQtYWRkci1yZXByZXNlbnRhdGlvbi0wMAorICogJXBJNmMgcHJpbnQgYW4gSVB2NiBhZGRyZXNzIGFzIHNwZWNpZmllZCBieSBSRkMgNTk1MgogICogJXBVW2JCbExdIHByaW50IGEgVVVJRC9HVUlEIGluIGJpZyBvciBsaXR0bGUgZW5kaWFuIHVzaW5nIGxvd2VyIG9yIHVwcGVyCiAgKiAgIGNhc2UuCiAgKiAlbiBpcyBpZ25vcmVkCkBAIC0xMjYxLDcgKzEyNTksNyBAQAogCQkJaWYgKHF1YWxpZmllciA9PSAnbCcpIHsKIAkJCQlsb25nICppcCA9IHZhX2FyZyhhcmdzLCBsb25nICopOwogCQkJCSppcCA9IChzdHIgLSBidWYpOwotCQkJfSBlbHNlIGlmIChUT0xPV0VSKHF1YWxpZmllcikgPT0gJ3onKSB7CisJCQl9IGVsc2UgaWYgKF90b2xvd2VyKHF1YWxpZmllcikgPT0gJ3onKSB7CiAJCQkJc2l6ZV90ICppcCA9IHZhX2FyZyhhcmdzLCBzaXplX3QgKik7CiAJCQkJKmlwID0gKHN0ciAtIGJ1Zik7CiAJCQl9IGVsc2UgewpAQCAtMTU0OCw3ICsxNTQ2LDcgQEAKIAkJCXZvaWQgKnNraXBfYXJnOwogCQkJaWYgKHF1YWxpZmllciA9PSAnbCcpCiAJCQkJc2tpcF9hcmcgPSB2YV9hcmcoYXJncywgbG9uZyAqKTsKLQkJCWVsc2UgaWYgKFRPTE9XRVIocXVhbGlmaWVyKSA9PSAneicpCisJCQllbHNlIGlmIChfdG9sb3dlcihxdWFsaWZpZXIpID09ICd6JykKIAkJCQlza2lwX2FyZyA9IHZhX2FyZyhhcmdzLCBzaXplX3QgKik7CiAJCQllbHNlCiAJCQkJc2tpcF9hcmcgPSB2YV9hcmcoYXJncywgaW50ICopOwpAQCAtMTg1NCw4ICsxODUyLDggQEAKIAogCQkvKiBnZXQgY29udmVyc2lvbiBxdWFsaWZpZXIgKi8KIAkJcXVhbGlmaWVyID0gLTE7Ci0JCWlmICgqZm10ID09ICdoJyB8fCBUT0xPV0VSKCpmbXQpID09ICdsJyB8fAotCQkgICAgVE9MT1dFUigqZm10KSA9PSAneicpIHsKKwkJaWYgKCpmbXQgPT0gJ2gnIHx8IF90b2xvd2VyKCpmbXQpID09ICdsJyB8fAorCQkgICAgX3RvbG93ZXIoKmZtdCkgPT0gJ3onKSB7CiAJCQlxdWFsaWZpZXIgPSAqZm10Kys7CiAJCQlpZiAodW5saWtlbHkocXVhbGlmaWVyID09ICpmbXQpKSB7CiAJCQkJaWYgKHF1YWxpZmllciA9PSAnaCcpIHsKZGlmZiAtLWdpdCBhL2xpYi94ei94el9wcml2YXRlLmggYi9saWIveHoveHpfcHJpdmF0ZS5oCmluZGV4IGE2NTYzM2UuLjQ4MmI5MGYgMTAwNjQ0Ci0tLSBhL2xpYi94ei94el9wcml2YXRlLmgKKysrIGIvbGliL3h6L3h6X3ByaXZhdGUuaApAQCAtMTIsNyArMTIsNyBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogIwlpbmNsdWRlIDxsaW51eC94ei5oPgotIwlpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjCWluY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogIwlpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAJLyogWFpfUFJFQk9PVCBtYXkgYmUgZGVmaW5lZCBvbmx5IHZpYSBkZWNvbXByZXNzX3VueHouYy4gKi8KICMJaWZuZGVmIFhaX1BSRUJPT1QKZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IDhjYTQ3YTUuLmYyZjFjYTEgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKKysrIGIvbW0vS2NvbmZpZwpAQCAtMzU2LDcgKzM1Niw3IEBACiAJICBmb3IgY2xlYW4gcGFnZXMgdGhhdCB0aGUga2VybmVsJ3MgcGFnZWZyYW1lIHJlcGxhY2VtZW50IGFsZ29yaXRobQogCSAgKFBGUkEpIHdvdWxkIGxpa2UgdG8ga2VlcCBhcm91bmQsIGJ1dCBjYW4ndCBzaW5jZSB0aGVyZSBpc24ndCBlbm91Z2gKIAkgIG1lbW9yeS4gIFNvIHdoZW4gdGhlIFBGUkEgImV2aWN0cyIgYSBwYWdlLCBpdCBmaXJzdCBhdHRlbXB0cyB0byB1c2UKLQkgIGNsZWFuY2FjbmUgY29kZSB0byBwdXQgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoYXQgcGFnZSBpbnRvCisJICBjbGVhbmNhY2hlIGNvZGUgdG8gcHV0IHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGF0IHBhZ2UgaW50bwogCSAgInRyYW5zY2VuZGVudCBtZW1vcnkiLCBtZW1vcnkgdGhhdCBpcyBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSBvcgogCSAgYWRkcmVzc2FibGUgYnkgdGhlIGtlcm5lbCBhbmQgaXMgb2YgdW5rbm93biBhbmQgcG9zc2libHkKIAkgIHRpbWUtdmFyeWluZyBzaXplLiAgQW5kIHdoZW4gYSBjbGVhbmNhY2hlLWVuYWJsZWQKZGlmZiAtLWdpdCBhL21tL2JhY2tpbmctZGV2LmMgYi9tbS9iYWNraW5nLWRldi5jCmluZGV4IGYwMzJlNmUuLjgyOTBiMWUgMTAwNjQ0Ci0tLSBhL21tL2JhY2tpbmctZGV2LmMKKysrIGIvbW0vYmFja2luZy1kZXYuYwpAQCAtNTA1LDcgKzUwNSw3IEBACiAJbGlzdF9kZWxfcmN1KCZiZGktPmJkaV9saXN0KTsKIAlzcGluX3VubG9ja19iaCgmYmRpX2xvY2spOwogCi0Jc3luY2hyb25pemVfcmN1KCk7CisJc3luY2hyb25pemVfcmN1X2V4cGVkaXRlZCgpOwogfQogCiBpbnQgYmRpX3JlZ2lzdGVyKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKQEAgLTYwNiw2ICs2MDYsNyBAQAogdm9pZCBiZGlfdW5yZWdpc3RlcihzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKQogewogCWlmIChiZGktPmRldikgeworCQliZGlfc2V0X21pbl9yYXRpbyhiZGksIDApOwogCQl0cmFjZV93cml0ZWJhY2tfYmRpX3VucmVnaXN0ZXIoYmRpKTsKIAkJYmRpX3BydW5lX3NiKGJkaSk7CiAJCWRlbF90aW1lcl9zeW5jKCZiZGktPndiLndha2V1cF90aW1lcik7CmRpZmYgLS1naXQgYS9tbS9jb21wYWN0aW9uLmMgYi9tbS9jb21wYWN0aW9uLmMKaW5kZXggMDIxYTI5Ni4uNmNjNjA0YiAxMDA2NDQKLS0tIGEvbW0vY29tcGFjdGlvbi5jCisrKyBiL21tL2NvbXBhY3Rpb24uYwpAQCAtMTQ0LDkgKzE0NCwyMCBAQAogCWludCBucl9mcmVlcGFnZXMgPSBjYy0+bnJfZnJlZXBhZ2VzOwogCXN0cnVjdCBsaXN0X2hlYWQgKmZyZWVsaXN0ID0gJmNjLT5mcmVlcGFnZXM7CiAKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIGZyZWUgc2Nhbm5lci4gVGhlIHN0YXJ0aW5nIHBvaW50IGlzIHdoZXJlIHdlIGxhc3QKKwkgKiBzY2FubmVkIGZyb20gKG9yIHRoZSBlbmQgb2YgdGhlIHpvbmUgaWYgc3RhcnRpbmcpLiBUaGUgbG93IHBvaW50CisJICogaXMgdGhlIGVuZCBvZiB0aGUgcGFnZWJsb2NrIHRoZSBtaWdyYXRpb24gc2Nhbm5lciBpcyB1c2luZy4KKwkgKi8KIAlwZm4gPSBjYy0+ZnJlZV9wZm47CiAJbG93X3BmbiA9IGNjLT5taWdyYXRlX3BmbiArIHBhZ2VibG9ja19ucl9wYWdlczsKLQloaWdoX3BmbiA9IGxvd19wZm47CisKKwkvKgorCSAqIFRha2UgY2FyZSB0aGF0IGlmIHRoZSBtaWdyYXRpb24gc2Nhbm5lciBpcyBhdCB0aGUgZW5kIG9mIHRoZSB6b25lCisJICogdGhhdCB0aGUgZnJlZSBzY2FubmVyIGRvZXMgbm90IGFjY2lkZW50YWxseSBtb3ZlIHRvIHRoZSBuZXh0IHpvbmUKKwkgKiBpbiB0aGUgbmV4dCBpc29sYXRpb24gY3ljbGUuCisJICovCisJaGlnaF9wZm4gPSBtaW4obG93X3BmbiwgcGZuKTsKIAogCS8qCiAJICogSXNvbGF0ZSBmcmVlIHBhZ2VzIHVudGlsIGVub3VnaCBhcmUgYXZhaWxhYmxlIHRvIG1pZ3JhdGUgdGhlCkBAIC0yNDAsMTEgKzI1MSwxOCBAQAogCXJldHVybiBpc29sYXRlZCA+IChpbmFjdGl2ZSArIGFjdGl2ZSkgLyAyOwogfQogCisvKiBwb3NzaWJsZSBvdXRjb21lIG9mIGlzb2xhdGVfbWlncmF0ZXBhZ2VzICovCit0eXBlZGVmIGVudW0geworCUlTT0xBVEVfQUJPUlQsCQkvKiBBYm9ydCBjb21wYWN0aW9uIG5vdyAqLworCUlTT0xBVEVfTk9ORSwJCS8qIE5vIHBhZ2VzIGlzb2xhdGVkLCBjb250aW51ZSBzY2FubmluZyAqLworCUlTT0xBVEVfU1VDQ0VTUywJLyogUGFnZXMgaXNvbGF0ZWQsIG1pZ3JhdGUgKi8KK30gaXNvbGF0ZV9taWdyYXRlX3Q7CisKIC8qCiAgKiBJc29sYXRlIGFsbCBwYWdlcyB0aGF0IGNhbiBiZSBtaWdyYXRlZCBmcm9tIHRoZSBibG9jayBwb2ludGVkIHRvIGJ5CiAgKiB0aGUgbWlncmF0ZSBzY2FubmVyIHdpdGhpbiBjb21wYWN0X2NvbnRyb2wuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlzb2xhdGVfbWlncmF0ZXBhZ2VzKHN0cnVjdCB6b25lICp6b25lLAorc3RhdGljIGlzb2xhdGVfbWlncmF0ZV90IGlzb2xhdGVfbWlncmF0ZXBhZ2VzKHN0cnVjdCB6b25lICp6b25lLAogCQkJCQlzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYykKIHsKIAl1bnNpZ25lZCBsb25nIGxvd19wZm4sIGVuZF9wZm47CkBAIC0yNjEsNyArMjc5LDcgQEAKIAkvKiBEbyBub3QgY3Jvc3MgdGhlIGZyZWUgc2Nhbm5lciBvciBzY2FuIHdpdGhpbiBhIG1lbW9yeSBob2xlICovCiAJaWYgKGVuZF9wZm4gPiBjYy0+ZnJlZV9wZm4gfHwgIXBmbl92YWxpZChsb3dfcGZuKSkgewogCQljYy0+bWlncmF0ZV9wZm4gPSBlbmRfcGZuOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIElTT0xBVEVfTk9ORTsKIAl9CiAKIAkvKgpAQCAtMjcwLDEwICsyODgsMTQgQEAKIAkgKiBkZWxheSBmb3Igc29tZSB0aW1lIHVudGlsIGZld2VyIHBhZ2VzIGFyZSBpc29sYXRlZAogCSAqLwogCXdoaWxlICh1bmxpa2VseSh0b29fbWFueV9pc29sYXRlZCh6b25lKSkpIHsKKwkJLyogYXN5bmMgbWlncmF0aW9uIHNob3VsZCBqdXN0IGFib3J0ICovCisJCWlmICghY2MtPnN5bmMpCisJCQlyZXR1cm4gSVNPTEFURV9BQk9SVDsKKwogCQljb25nZXN0aW9uX3dhaXQoQkxLX1JXX0FTWU5DLCBIWi8xMCk7CiAKIAkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gSVNPTEFURV9BQk9SVDsKIAl9CiAKIAkvKiBUaW1lIHRvIGlzb2xhdGUgc29tZSBwYWdlcyBmb3IgbWlncmF0aW9uICovCkBAIC0zNTgsNyArMzgwLDcgQEAKIAogCXRyYWNlX21tX2NvbXBhY3Rpb25faXNvbGF0ZV9taWdyYXRlcGFnZXMobnJfc2Nhbm5lZCwgbnJfaXNvbGF0ZWQpOwogCi0JcmV0dXJuIGNjLT5ucl9taWdyYXRlcGFnZXM7CisJcmV0dXJuIElTT0xBVEVfU1VDQ0VTUzsKIH0KIAogLyoKQEAgLTQyMCwxMyArNDQyLDYgQEAKIAlpZiAoY2MtPmZyZWVfcGZuIDw9IGNjLT5taWdyYXRlX3BmbikKIAkJcmV0dXJuIENPTVBBQ1RfQ09NUExFVEU7CiAKLQkvKiBDb21wYWN0aW9uIHJ1biBpcyBub3QgZmluaXNoZWQgaWYgdGhlIHdhdGVybWFyayBpcyBub3QgbWV0ICovCi0Jd2F0ZXJtYXJrID0gbG93X3dtYXJrX3BhZ2VzKHpvbmUpOwotCXdhdGVybWFyayArPSAoMSA8PCBjYy0+b3JkZXIpOwotCi0JaWYgKCF6b25lX3dhdGVybWFya19vayh6b25lLCBjYy0+b3JkZXIsIHdhdGVybWFyaywgMCwgMCkpCi0JCXJldHVybiBDT01QQUNUX0NPTlRJTlVFOwotCiAJLyoKIAkgKiBvcmRlciA9PSAtMSBpcyBleHBlY3RlZCB3aGVuIGNvbXBhY3RpbmcgdmlhCiAJICogL3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5CkBAIC00MzQsNiArNDQ5LDEzIEBACiAJaWYgKGNjLT5vcmRlciA9PSAtMSkKIAkJcmV0dXJuIENPTVBBQ1RfQ09OVElOVUU7CiAKKwkvKiBDb21wYWN0aW9uIHJ1biBpcyBub3QgZmluaXNoZWQgaWYgdGhlIHdhdGVybWFyayBpcyBub3QgbWV0ICovCisJd2F0ZXJtYXJrID0gbG93X3dtYXJrX3BhZ2VzKHpvbmUpOworCXdhdGVybWFyayArPSAoMSA8PCBjYy0+b3JkZXIpOworCisJaWYgKCF6b25lX3dhdGVybWFya19vayh6b25lLCBjYy0+b3JkZXIsIHdhdGVybWFyaywgMCwgMCkpCisJCXJldHVybiBDT01QQUNUX0NPTlRJTlVFOworCiAJLyogRGlyZWN0IGNvbXBhY3RvcjogSXMgYSBzdWl0YWJsZSBwYWdlIGZyZWU/ICovCiAJZm9yIChvcmRlciA9IGNjLT5vcmRlcjsgb3JkZXIgPCBNQVhfT1JERVI7IG9yZGVyKyspIHsKIAkJLyogSm9iIGRvbmUgaWYgcGFnZSBpcyBmcmVlIG9mIHRoZSByaWdodCBtaWdyYXRldHlwZSAqLwpAQCAtNDYxLDYgKzQ4MywxMyBAQAogCXVuc2lnbmVkIGxvbmcgd2F0ZXJtYXJrOwogCiAJLyoKKwkgKiBvcmRlciA9PSAtMSBpcyBleHBlY3RlZCB3aGVuIGNvbXBhY3RpbmcgdmlhCisJICogL3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5CisJICovCisJaWYgKG9yZGVyID09IC0xKQorCQlyZXR1cm4gQ09NUEFDVF9DT05USU5VRTsKKworCS8qCiAJICogV2F0ZXJtYXJrcyBmb3Igb3JkZXItMCBtdXN0IGJlIG1ldCBmb3IgY29tcGFjdGlvbi4gTm90ZSB0aGUgMlVMLgogCSAqIFRoaXMgaXMgYmVjYXVzZSBkdXJpbmcgbWlncmF0aW9uLCBjb3BpZXMgb2YgcGFnZXMgbmVlZCB0byBiZQogCSAqIGFsbG9jYXRlZCBhbmQgZm9yIGEgc2hvcnQgdGltZSwgdGhlIGZvb3RwcmludCBpcyBoaWdoZXIKQEAgLTQ3MCwxNyArNDk5LDExIEBACiAJCXJldHVybiBDT01QQUNUX1NLSVBQRUQ7CiAKIAkvKgotCSAqIG9yZGVyID09IC0xIGlzIGV4cGVjdGVkIHdoZW4gY29tcGFjdGluZyB2aWEKLQkgKiAvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnkKLQkgKi8KLQlpZiAob3JkZXIgPT0gLTEpCi0JCXJldHVybiBDT01QQUNUX0NPTlRJTlVFOwotCi0JLyoKIAkgKiBmcmFnbWVudGF0aW9uIGluZGV4IGRldGVybWluZXMgaWYgYWxsb2NhdGlvbiBmYWlsdXJlcyBhcmUgZHVlIHRvCiAJICogbG93IG1lbW9yeSBvciBleHRlcm5hbCBmcmFnbWVudGF0aW9uCiAJICoKLQkgKiBpbmRleCBvZiAtMSBpbXBsaWVzIGFsbG9jYXRpb25zIG1pZ2h0IHN1Y2NlZWQgZGVwZW5kaW5nb24gd2F0ZXJtYXJrcworCSAqIGluZGV4IG9mIC0xMDAwIGltcGxpZXMgYWxsb2NhdGlvbnMgbWlnaHQgc3VjY2VlZCBkZXBlbmRpbmcgb24KKwkgKiB3YXRlcm1hcmtzCiAJICogaW5kZXggdG93YXJkcyAwIGltcGxpZXMgZmFpbHVyZSBpcyBkdWUgdG8gbGFjayBvZiBtZW1vcnkKIAkgKiBpbmRleCB0b3dhcmRzIDEwMDAgaW1wbGllcyBmYWlsdXJlIGlzIGR1ZSB0byBmcmFnbWVudGF0aW9uCiAJICoKQEAgLTQ5MCw3ICs1MTMsOCBAQAogCWlmIChmcmFnaW5kZXggPj0gMCAmJiBmcmFnaW5kZXggPD0gc3lzY3RsX2V4dGZyYWdfdGhyZXNob2xkKQogCQlyZXR1cm4gQ09NUEFDVF9TS0lQUEVEOwogCi0JaWYgKGZyYWdpbmRleCA9PSAtMSAmJiB6b25lX3dhdGVybWFya19vayh6b25lLCBvcmRlciwgd2F0ZXJtYXJrLCAwLCAwKSkKKwlpZiAoZnJhZ2luZGV4ID09IC0xMDAwICYmIHpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCB3YXRlcm1hcmssCisJICAgIDAsIDApKQogCQlyZXR1cm4gQ09NUEFDVF9QQVJUSUFMOwogCiAJcmV0dXJuIENPTVBBQ1RfQ09OVElOVUU7CkBAIC01MjIsOCArNTQ2LDE1IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfbWlncmF0ZSwgbnJfcmVtYWluaW5nOwogCQlpbnQgZXJyOwogCi0JCWlmICghaXNvbGF0ZV9taWdyYXRlcGFnZXMoem9uZSwgY2MpKQorCQlzd2l0Y2ggKGlzb2xhdGVfbWlncmF0ZXBhZ2VzKHpvbmUsIGNjKSkgeworCQljYXNlIElTT0xBVEVfQUJPUlQ6CisJCQlyZXQgPSBDT01QQUNUX1BBUlRJQUw7CisJCQlnb3RvIG91dDsKKwkJY2FzZSBJU09MQVRFX05PTkU6CiAJCQljb250aW51ZTsKKwkJY2FzZSBJU09MQVRFX1NVQ0NFU1M6CisJCQk7CisJCX0KIAogCQlucl9taWdyYXRlID0gY2MtPm5yX21pZ3JhdGVwYWdlczsKIAkJZXJyID0gbWlncmF0ZV9wYWdlcygmY2MtPm1pZ3JhdGVwYWdlcywgY29tcGFjdGlvbl9hbGxvYywKQEAgLTU0Nyw2ICs1NzgsNyBAQAogCiAJfQogCitvdXQ6CiAJLyogUmVsZWFzZSBmcmVlIHBhZ2VzIGFuZCBjaGVjayBhY2NvdW50aW5nICovCiAJY2MtPm5yX2ZyZWVwYWdlcyAtPSByZWxlYXNlX2ZyZWVwYWdlcygmY2MtPmZyZWVwYWdlcyk7CiAJVk1fQlVHX09OKGNjLT5ucl9mcmVlcGFnZXMgIT0gMCk7CmRpZmYgLS1naXQgYS9tbS9kbWFwb29sLmMgYi9tbS9kbWFwb29sLmMKaW5kZXggMDNiZjNiYi4uZmJiNThlMyAxMDA2NDQKLS0tIGEvbW0vZG1hcG9vbC5jCisrKyBiL21tL2RtYXBvb2wuYwpAQCAtNTAwLDcgKzUwMCw3IEBACiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcG9vbC0+ZGV2OwogCi0JZG1hX3Bvb2xfZGVzdHJveShwb29sKTsKIAlXQVJOX09OKGRldnJlc19kZXN0cm95KGRldiwgZG1hbV9wb29sX3JlbGVhc2UsIGRtYW1fcG9vbF9tYXRjaCwgcG9vbCkpOworCWRtYV9wb29sX2Rlc3Ryb3kocG9vbCk7CiB9CiBFWFBPUlRfU1lNQk9MKGRtYW1fcG9vbF9kZXN0cm95KTsKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCBkN2IxMDU3Li4xMGExNzExIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC03OCw5ICs3OCw2IEBACiAgKiAgLT5pX211dGV4CQkJKGdlbmVyaWNfZmlsZV9idWZmZXJlZF93cml0ZSkKICAqICAgIC0+bW1hcF9zZW0JCShmYXVsdF9pbl9wYWdlc19yZWFkYWJsZS0+ZG9fcGFnZV9mYXVsdCkKICAqCi0gKiAgLT5pX211dGV4Ci0gKiAgICAtPmlfYWxsb2Nfc2VtICAgICAgICAgICAgICh2YXJpb3VzKQotICoKICAqICBpbm9kZV93Yl9saXN0X2xvY2sKICAqICAgIHNiX2xvY2sJCQkoZnMvZnMtd3JpdGViYWNrLmMpCiAgKiAgICAtPm1hcHBpbmctPnRyZWVfbG9jawkoX19zeW5jX3NpbmdsZV9pbm9kZSkKQEAgLTEzMSw2ICsxMjgsNyBAQAogCiAJcmFkaXhfdHJlZV9kZWxldGUoJm1hcHBpbmctPnBhZ2VfdHJlZSwgcGFnZS0+aW5kZXgpOwogCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOworCS8qIExlYXZlIHBhZ2UtPmluZGV4IHNldDogdHJ1bmNhdGlvbiBsb29rdXAgcmVsaWVzIHVwb24gaXQgKi8KIAltYXBwaW5nLT5ucnBhZ2VzLS07CiAJX19kZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfUEFHRVMpOwogCWlmIChQYWdlU3dhcEJhY2tlZChwYWdlKSkKQEAgLTQ4Niw2ICs0ODQsNyBAQAogCQkJc3Bpbl91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwogCQl9IGVsc2UgewogCQkJcGFnZS0+bWFwcGluZyA9IE5VTEw7CisJCQkvKiBMZWF2ZSBwYWdlLT5pbmRleCBzZXQ6IHRydW5jYXRpb24gcmVsaWVzIHVwb24gaXQgKi8KIAkJCXNwaW5fdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKIAkJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfY2FjaGVfcGFnZShwYWdlKTsKIAkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKQEAgLTE3OTUsNyArMTc5NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqX19yZWFkX2NhY2hlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJcGdvZmZfdCBpbmRleCwKLQkJCQlpbnQgKCpmaWxsZXIpKHZvaWQgKixzdHJ1Y3QgcGFnZSopLAorCQkJCWludCAoKmZpbGxlcikodm9pZCAqLCBzdHJ1Y3QgcGFnZSAqKSwKIAkJCQl2b2lkICpkYXRhLAogCQkJCWdmcF90IGdmcCkKIHsKQEAgLTE4MjYsNyArMTgyNSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZG9fcmVhZF9jYWNoZV9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQkJCXBnb2ZmX3QgaW5kZXgsCi0JCQkJaW50ICgqZmlsbGVyKSh2b2lkICosc3RydWN0IHBhZ2UqKSwKKwkJCQlpbnQgKCpmaWxsZXIpKHZvaWQgKiwgc3RydWN0IHBhZ2UgKiksCiAJCQkJdm9pZCAqZGF0YSwKIAkJCQlnZnBfdCBnZnApCiAKQEAgLTE4NjYsNyArMTg2NSw3IEBACiAgKiBAbWFwcGluZzoJdGhlIHBhZ2UncyBhZGRyZXNzX3NwYWNlCiAgKiBAaW5kZXg6CXRoZSBwYWdlIGluZGV4CiAgKiBAZmlsbGVyOglmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSByZWFkCi0gKiBAZGF0YToJZGVzdGluYXRpb24gZm9yIHJlYWQgZGF0YQorICogQGRhdGE6CWZpcnN0IGFyZyB0byBmaWxsZXIoZGF0YSwgcGFnZSkgZnVuY3Rpb24sIG9mdGVuIGxlZnQgYXMgTlVMTAogICoKICAqIFNhbWUgYXMgcmVhZF9jYWNoZV9wYWdlLCBidXQgZG9uJ3Qgd2FpdCBmb3IgcGFnZSB0byBiZWNvbWUgdW5sb2NrZWQKICAqIGFmdGVyIHN1Ym1pdHRpbmcgaXQgdG8gdGhlIGZpbGxlci4KQEAgLTE4NzgsNyArMTg3Nyw3IEBACiAgKi8KIHN0cnVjdCBwYWdlICpyZWFkX2NhY2hlX3BhZ2VfYXN5bmMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJcGdvZmZfdCBpbmRleCwKLQkJCQlpbnQgKCpmaWxsZXIpKHZvaWQgKixzdHJ1Y3QgcGFnZSopLAorCQkJCWludCAoKmZpbGxlcikodm9pZCAqLCBzdHJ1Y3QgcGFnZSAqKSwKIAkJCQl2b2lkICpkYXRhKQogewogCXJldHVybiBkb19yZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgsIGZpbGxlciwgZGF0YSwgbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7CkBAIC0xOTI2LDcgKzE5MjUsNyBAQAogICogQG1hcHBpbmc6CXRoZSBwYWdlJ3MgYWRkcmVzc19zcGFjZQogICogQGluZGV4Ogl0aGUgcGFnZSBpbmRleAogICogQGZpbGxlcjoJZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgcmVhZAotICogQGRhdGE6CWRlc3RpbmF0aW9uIGZvciByZWFkIGRhdGEKKyAqIEBkYXRhOglmaXJzdCBhcmcgdG8gZmlsbGVyKGRhdGEsIHBhZ2UpIGZ1bmN0aW9uLCBvZnRlbiBsZWZ0IGFzIE5VTEwKICAqCiAgKiBSZWFkIGludG8gdGhlIHBhZ2UgY2FjaGUuIElmIGEgcGFnZSBhbHJlYWR5IGV4aXN0cywgYW5kIFBhZ2VVcHRvZGF0ZSgpIGlzCiAgKiBub3Qgc2V0LCB0cnkgdG8gZmlsbCB0aGUgcGFnZSB0aGVuIHdhaXQgZm9yIGl0IHRvIGJlY29tZSB1bmxvY2tlZC4KQEAgLTE5MzUsNyArMTkzNCw3IEBACiAgKi8KIHN0cnVjdCBwYWdlICpyZWFkX2NhY2hlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJcGdvZmZfdCBpbmRleCwKLQkJCQlpbnQgKCpmaWxsZXIpKHZvaWQgKixzdHJ1Y3QgcGFnZSopLAorCQkJCWludCAoKmZpbGxlcikodm9pZCAqLCBzdHJ1Y3QgcGFnZSAqKSwKIAkJCQl2b2lkICpkYXRhKQogewogCXJldHVybiB3YWl0X29uX3BhZ2VfcmVhZChyZWFkX2NhY2hlX3BhZ2VfYXN5bmMobWFwcGluZywgaW5kZXgsIGZpbGxlciwgZGF0YSkpOwpAQCAtMjAwMCw3ICsxOTk5LDcgQEAKIAkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9raWxscHJpdihkZW50cnkpOwogCWlmICghZXJyb3IgJiYga2lsbHN1aWQpCiAJCWVycm9yID0gX19yZW1vdmVfc3VpZChkZW50cnksIGtpbGxzdWlkKTsKLQlpZiAoIWVycm9yKQorCWlmICghZXJyb3IgJiYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfTk9TRUMpKQogCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PU0VDOwogCiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmMKaW5kZXggNjE1ZDk3NC4uZTJkMTU4NyAxMDA2NDQKLS0tIGEvbW0vaHVnZV9tZW1vcnkuYworKysgYi9tbS9odWdlX21lbW9yeS5jCkBAIC0xNTk2LDE0ICsxNTk2LDEzIEBACiAJCWxpc3RfZGVsKCZtbV9zbG90LT5tbV9ub2RlKTsKIAkJZnJlZSA9IDE7CiAJfQorCXNwaW5fdW5sb2NrKCZraHVnZXBhZ2VkX21tX2xvY2spOwogCiAJaWYgKGZyZWUpIHsKLQkJc3Bpbl91bmxvY2soJmtodWdlcGFnZWRfbW1fbG9jayk7CiAJCWNsZWFyX2JpdChNTUZfVk1fSFVHRVBBR0UsICZtbS0+ZmxhZ3MpOwogCQlmcmVlX21tX3Nsb3QobW1fc2xvdCk7CiAJCW1tZHJvcChtbSk7CiAJfSBlbHNlIGlmIChtbV9zbG90KSB7Ci0JCXNwaW5fdW5sb2NrKCZraHVnZXBhZ2VkX21tX2xvY2spOwogCQkvKgogCQkgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0CiAJCSAqIGtodWdlcGFnZWRfdGVzdF9leGl0KCkgKHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuCkBAIC0xNjE0LDggKzE2MTMsNyBAQAogCQkgKi8KIAkJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0JfSBlbHNlCi0JCXNwaW5fdW5sb2NrKCZraHVnZXBhZ2VkX21tX2xvY2spOworCX0KIH0KIAogc3RhdGljIHZvaWQgcmVsZWFzZV9wdGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKQEAgLTIyMzQsMTEgKzIyMzIsOCBAQAogCXdoaWxlIChsaWtlbHkoa2h1Z2VwYWdlZF9lbmFibGVkKCkpKSB7CiAjaWZuZGVmIENPTkZJR19OVU1BCiAJCWhwYWdlID0ga2h1Z2VwYWdlZF9hbGxvY19odWdlcGFnZSgpOwotCQlpZiAodW5saWtlbHkoIWhwYWdlKSkgewotCQkJY291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DX0ZBSUxFRCk7CisJCWlmICh1bmxpa2VseSghaHBhZ2UpKQogCQkJYnJlYWs7Ci0JCX0KLQkJY291bnRfdm1fZXZlbnQoVEhQX0NPTExBUFNFX0FMTE9DKTsKICNlbHNlCiAJCWlmIChJU19FUlIoaHBhZ2UpKSB7CiAJCQlraHVnZXBhZ2VkX2FsbG9jX3NsZWVwKCk7CmRpZmYgLS1naXQgYS9tbS9odWdldGxiLmMgYi9tbS9odWdldGxiLmMKaW5kZXggNjQwMjQ1OC4uZGFlMjdiYSAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCisrKyBiL21tL2h1Z2V0bGIuYwpAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZS5oPgpAQCAtNjIsMTAgKzYyLDEwIEBACiAgKiBtdXN0IGVpdGhlciBob2xkIHRoZSBtbWFwX3NlbSBmb3Igd3JpdGUsIG9yIHRoZSBtbWFwX3NlbSBmb3IgcmVhZCBhbmQKICAqIHRoZSBodWdldGxiX2luc3RhbnRpYXRpb24gbXV0ZXg6CiAgKgotICogCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisgKglkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogICogb3IKLSAqIAlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0gKiAJbXV0ZXhfbG9jaygmaHVnZXRsYl9pbnN0YW50aWF0aW9uX211dGV4KTsKKyAqCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKyAqCW11dGV4X2xvY2soJmh1Z2V0bGJfaW5zdGFudGlhdGlvbl9tdXRleCk7CiAgKi8KIHN0cnVjdCBmaWxlX3JlZ2lvbiB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaW5rOwpAQCAtNTAzLDkgKzUwMywxMCBAQAogCWgtPm5yX2h1Z2VfcGFnZXMtLTsKIAloLT5ucl9odWdlX3BhZ2VzX25vZGVbcGFnZV90b19uaWQocGFnZSldLS07CiAJZm9yIChpID0gMDsgaSA8IHBhZ2VzX3Blcl9odWdlX3BhZ2UoaCk7IGkrKykgewotCQlwYWdlW2ldLmZsYWdzICY9IH4oMSA8PCBQR19sb2NrZWQgfCAxIDw8IFBHX2Vycm9yIHwgMSA8PCBQR19yZWZlcmVuY2VkIHwKLQkJCQkxIDw8IFBHX2RpcnR5IHwgMSA8PCBQR19hY3RpdmUgfCAxIDw8IFBHX3Jlc2VydmVkIHwKLQkJCQkxIDw8IFBHX3ByaXZhdGUgfCAxPDwgUEdfd3JpdGViYWNrKTsKKwkJcGFnZVtpXS5mbGFncyAmPSB+KDEgPDwgUEdfbG9ja2VkIHwgMSA8PCBQR19lcnJvciB8CisJCQkJMSA8PCBQR19yZWZlcmVuY2VkIHwgMSA8PCBQR19kaXJ0eSB8CisJCQkJMSA8PCBQR19hY3RpdmUgfCAxIDw8IFBHX3Jlc2VydmVkIHwKKwkJCQkxIDw8IFBHX3ByaXZhdGUgfCAxIDw8IFBHX3dyaXRlYmFjayk7CiAJfQogCXNldF9jb21wb3VuZF9wYWdlX2R0b3IocGFnZSwgTlVMTCk7CiAJc2V0X3BhZ2VfcmVmY291bnRlZChwYWdlKTsKQEAgLTU5MSw3ICs1OTIsNiBAQAogCiAJcmV0dXJuIGR0b3IgPT0gZnJlZV9odWdlX3BhZ2U7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKFBhZ2VIdWdlKTsKIAogc3RhdGljIHN0cnVjdCBwYWdlICphbGxvY19mcmVzaF9odWdlX3BhZ2Vfbm9kZShzdHJ1Y3QgaHN0YXRlICpoLCBpbnQgbmlkKQpAQCAtMTEwNSwxMiArMTEwNSwyOCBAQAogCXN0cnVjdCBodWdlX2Jvb3RtZW1fcGFnZSAqbTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgJmh1Z2VfYm9vdF9wYWdlcywgbGlzdCkgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZpcnRfdG9fcGFnZShtKTsKIAkJc3RydWN0IGhzdGF0ZSAqaCA9IG0tPmhzdGF0ZTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCQlwYWdlID0gcGZuX3RvX3BhZ2UobS0+cGh5cyA+PiBQQUdFX1NISUZUKTsKKwkJZnJlZV9ib290bWVtX2xhdGUoKHVuc2lnbmVkIGxvbmcpbSwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgaHVnZV9ib290bWVtX3BhZ2UpKTsKKyNlbHNlCisJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UobSk7CisjZW5kaWYKIAkJX19DbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKIAkJV0FSTl9PTihwYWdlX2NvdW50KHBhZ2UpICE9IDEpOwogCQlwcmVwX2NvbXBvdW5kX2h1Z2VfcGFnZShwYWdlLCBoLT5vcmRlcik7CiAJCXByZXBfbmV3X2h1Z2VfcGFnZShoLCBwYWdlLCBwYWdlX3RvX25pZChwYWdlKSk7CisJCS8qCisJCSAqIElmIHdlIGhhZCBnaWdhbnRpYyBodWdlcGFnZXMgYWxsb2NhdGVkIGF0IGJvb3QgdGltZSwgd2UgbmVlZAorCQkgKiB0byByZXN0b3JlIHRoZSAnc3RvbGVuJyBwYWdlcyB0byB0b3RhbHJhbV9wYWdlcyBpbiBvcmRlciB0bworCQkgKiBmaXggY29uZnVzaW5nIG1lbW9yeSByZXBvcnRzIGZyb20gZnJlZSgxKSBhbmQgYW5vdGhlcgorCQkgKiBzaWRlLWVmZmVjdHMsIGxpa2UgQ29tbWl0TGltaXQgZ29pbmcgbmVnYXRpdmUuCisJCSAqLworCQlpZiAoaC0+b3JkZXIgPiAoTUFYX09SREVSIC0gMSkpCisJCQl0b3RhbHJhbV9wYWdlcyArPSAxIDw8IGgtPm9yZGVyOwogCX0KIH0KIApAQCAtMjExNiw5ICsyMTMyLDggQEAKIAlwdGVfdCBlbnRyeTsKIAogCWVudHJ5ID0gcHRlX21rd3JpdGUocHRlX21rZGlydHkoaHVnZV9wdGVwX2dldChwdGVwKSkpOwotCWlmIChodWdlX3B0ZXBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIGFkZHJlc3MsIHB0ZXAsIGVudHJ5LCAxKSkgeworCWlmIChodWdlX3B0ZXBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIGFkZHJlc3MsIHB0ZXAsIGVudHJ5LCAxKSkKIAkJdXBkYXRlX21tdV9jYWNoZSh2bWEsIGFkZHJlc3MsIHB0ZXApOwotCX0KIH0KIAogCkBAIC0yMTczLDkgKzIxODgsOSBAQAogCWlmIChodWdlX3B0ZV9ub25lKHB0ZSkgfHwgcHRlX3ByZXNlbnQocHRlKSkKIAkJcmV0dXJuIDA7CiAJc3dwID0gcHRlX3RvX3N3cF9lbnRyeShwdGUpOwotCWlmIChub25fc3dhcF9lbnRyeShzd3ApICYmIGlzX21pZ3JhdGlvbl9lbnRyeShzd3ApKSB7CisJaWYgKG5vbl9zd2FwX2VudHJ5KHN3cCkgJiYgaXNfbWlncmF0aW9uX2VudHJ5KHN3cCkpCiAJCXJldHVybiAxOwotCX0gZWxzZQorCWVsc2UKIAkJcmV0dXJuIDA7CiB9CiAKQEAgLTIxODYsOSArMjIwMSw5IEBACiAJaWYgKGh1Z2VfcHRlX25vbmUocHRlKSB8fCBwdGVfcHJlc2VudChwdGUpKQogCQlyZXR1cm4gMDsKIAlzd3AgPSBwdGVfdG9fc3dwX2VudHJ5KHB0ZSk7Ci0JaWYgKG5vbl9zd2FwX2VudHJ5KHN3cCkgJiYgaXNfaHdwb2lzb25fZW50cnkoc3dwKSkgeworCWlmIChub25fc3dhcF9lbnRyeShzd3ApICYmIGlzX2h3cG9pc29uX2VudHJ5KHN3cCkpCiAJCXJldHVybiAxOwotCX0gZWxzZQorCWVsc2UKIAkJcmV0dXJuIDA7CiB9CiAKQEAgLTI1NTEsNyArMjU2Niw3IEBACiAJCSAqIFNvIHdlIG5lZWQgdG8gYmxvY2sgaHVnZXBhZ2UgZmF1bHQgYnkgUEdfaHdwb2lzb24gYml0IGNoZWNrLgogCQkgKi8KIAkJaWYgKHVubGlrZWx5KFBhZ2VIV1BvaXNvbihwYWdlKSkpIHsKLQkJCXJldCA9IFZNX0ZBVUxUX0hXUE9JU09OIHwgCisJCQlyZXQgPSBWTV9GQVVMVF9IV1BPSVNPTiB8CiAJCQkgICAgICBWTV9GQVVMVF9TRVRfSElOREVYKGggLSBoc3RhdGVzKTsKIAkJCWdvdG8gYmFja291dF91bmxvY2tlZDsKIAkJfQpAQCAtMjYxOSw3ICsyNjM0LDcgQEAKIAkJCW1pZ3JhdGlvbl9lbnRyeV93YWl0KG1tLCAocG1kX3QgKilwdGVwLCBhZGRyZXNzKTsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgaWYgKHVubGlrZWx5KGlzX2h1Z2V0bGJfZW50cnlfaHdwb2lzb25lZChlbnRyeSkpKQotCQkJcmV0dXJuIFZNX0ZBVUxUX0hXUE9JU09OX0xBUkdFIHwgCisJCQlyZXR1cm4gVk1fRkFVTFRfSFdQT0lTT05fTEFSR0UgfAogCQkJICAgICAgIFZNX0ZBVUxUX1NFVF9ISU5ERVgoaCAtIGhzdGF0ZXMpOwogCX0KIApkaWZmIC0tZ2l0IGEvbW0va3NtLmMgYi9tbS9rc20uYwppbmRleCBkNzA4YjNlLi45YTY4YjBjIDEwMDY0NAotLS0gYS9tbS9rc20uYworKysgYi9tbS9rc20uYwpAQCAtMTMwMiw2ICsxMzAyLDEyIEBACiAJCXNsb3QgPSBsaXN0X2VudHJ5KHNsb3QtPm1tX2xpc3QubmV4dCwgc3RydWN0IG1tX3Nsb3QsIG1tX2xpc3QpOwogCQlrc21fc2Nhbi5tbV9zbG90ID0gc2xvdDsKIAkJc3Bpbl91bmxvY2soJmtzbV9tbWxpc3RfbG9jayk7CisJCS8qCisJCSAqIEFsdGhvdWdoIHdlIHRlc3RlZCBsaXN0X2VtcHR5KCkgYWJvdmUsIGEgcmFjaW5nIF9fa3NtX2V4aXQKKwkJICogb2YgdGhlIGxhc3QgbW0gb24gdGhlIGxpc3QgbWF5IGhhdmUgcmVtb3ZlZCBpdCBzaW5jZSB0aGVuLgorCQkgKi8KKwkJaWYgKHNsb3QgPT0gJmtzbV9tbV9oZWFkKQorCQkJcmV0dXJuIE5VTEw7CiBuZXh0X21tOgogCQlrc21fc2Nhbi5hZGRyZXNzID0gMDsKIAkJa3NtX3NjYW4ucm1hcF9saXN0ID0gJnNsb3QtPnJtYXBfbGlzdDsKZGlmZiAtLWdpdCBhL21tL21hZHZpc2UuYyBiL21tL21hZHZpc2UuYwppbmRleCAyMjIxNDkxLi43NGJmMTkzIDEwMDY0NAotLS0gYS9tbS9tYWR2aXNlLmMKKysrIGIvbW0vbWFkdmlzZS5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIAllbmRvZmYgPSAobG9mZl90KShlbmQgLSB2bWEtPnZtX3N0YXJ0IC0gMSkKIAkJCSsgKChsb2ZmX3Qpdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKTsKIAotCS8qIHZtdHJ1bmNhdGVfcmFuZ2UgbmVlZHMgdG8gdGFrZSBpX211dGV4IGFuZCBpX2FsbG9jX3NlbSAqLworCS8qIHZtdHJ1bmNhdGVfcmFuZ2UgbmVlZHMgdG8gdGFrZSBpX211dGV4ICovCiAJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAllcnJvciA9IHZtdHJ1bmNhdGVfcmFuZ2UobWFwcGluZy0+aG9zdCwgb2Zmc2V0LCBlbmRvZmYpOwogCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKZGlmZiAtLWdpdCBhL21tL21lbWJsb2NrLmMgYi9tbS9tZW1ibG9jay5jCmluZGV4IGEwNTYyZDEuLmNjYmY5NzMgMTAwNjQ0Ci0tLSBhL21tL21lbWJsb2NrLmMKKysrIGIvbW0vbWVtYmxvY2suYwpAQCAtNzU4LDkgKzc1OCw5IEBACiAKIAkvKiBDaGVjayBtYXJrZXIgaW4gdGhlIHVudXNlZCBsYXN0IGFycmF5IGVudHJ5ICovCiAJV0FSTl9PTihtZW1ibG9ja19tZW1vcnlfaW5pdF9yZWdpb25zW0lOSVRfTUVNQkxPQ0tfUkVHSU9OU10uYmFzZQotCQkhPSAocGh5c19hZGRyX3QpUkVEX0lOQUNUSVZFKTsKKwkJIT0gTUVNQkxPQ0tfSU5BQ1RJVkUpOwogCVdBUk5fT04obWVtYmxvY2tfcmVzZXJ2ZWRfaW5pdF9yZWdpb25zW0lOSVRfTUVNQkxPQ0tfUkVHSU9OU10uYmFzZQotCQkhPSAocGh5c19hZGRyX3QpUkVEX0lOQUNUSVZFKTsKKwkJIT0gTUVNQkxPQ0tfSU5BQ1RJVkUpOwogCiAJbWVtYmxvY2subWVtb3J5X3NpemUgPSAwOwogCkBAIC03ODYsOCArNzg2LDggQEAKIAltZW1ibG9jay5yZXNlcnZlZC5tYXgJPSBJTklUX01FTUJMT0NLX1JFR0lPTlM7CiAKIAkvKiBXcml0ZSBhIG1hcmtlciBpbiB0aGUgdW51c2VkIGxhc3QgYXJyYXkgZW50cnkgKi8KLQltZW1ibG9jay5tZW1vcnkucmVnaW9uc1tJTklUX01FTUJMT0NLX1JFR0lPTlNdLmJhc2UgPSAocGh5c19hZGRyX3QpUkVEX0lOQUNUSVZFOwotCW1lbWJsb2NrLnJlc2VydmVkLnJlZ2lvbnNbSU5JVF9NRU1CTE9DS19SRUdJT05TXS5iYXNlID0gKHBoeXNfYWRkcl90KVJFRF9JTkFDVElWRTsKKwltZW1ibG9jay5tZW1vcnkucmVnaW9uc1tJTklUX01FTUJMT0NLX1JFR0lPTlNdLmJhc2UgPSBNRU1CTE9DS19JTkFDVElWRTsKKwltZW1ibG9jay5yZXNlcnZlZC5yZWdpb25zW0lOSVRfTUVNQkxPQ0tfUkVHSU9OU10uYmFzZSA9IE1FTUJMT0NLX0lOQUNUSVZFOwogCiAJLyogQ3JlYXRlIGEgZHVtbXkgemVybyBzaXplIE1FTUJMT0NLIHdoaWNoIHdpbGwgZ2V0IGNvYWxlc2NlZCBhd2F5IGxhdGVyLgogCSAqIFRoaXMgc2ltcGxpZmllcyB0aGUgbWVtYmxvY2tfYWRkKCkgY29kZSBiZWxvdy4uLgpkaWZmIC0tZ2l0IGEvbW0vbWVtY29udHJvbC5jIGIvbW0vbWVtY29udHJvbC5jCmluZGV4IGJkOTA1MmEuLmUwMTNiOGUgMTAwNjQ0Ci0tLSBhL21tL21lbWNvbnRyb2wuYworKysgYi9tbS9tZW1jb250cm9sLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NobWVtX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CkBAIC0xMDcsMTAgKzEwOCwxMiBAQAogZW51bSBtZW1fY2dyb3VwX2V2ZW50c190YXJnZXQgewogCU1FTV9DR1JPVVBfVEFSR0VUX1RIUkVTSCwKIAlNRU1fQ0dST1VQX1RBUkdFVF9TT0ZUTElNSVQsCisJTUVNX0NHUk9VUF9UQVJHRVRfTlVNQUlORk8sCiAJTUVNX0NHUk9VUF9OVEFSR0VUUywKIH07CiAjZGVmaW5lIFRIUkVTSE9MRFNfRVZFTlRTX1RBUkdFVCAoMTI4KQogI2RlZmluZSBTT0ZUTElNSVRfRVZFTlRTX1RBUkdFVCAoMTAyNCkKKyNkZWZpbmUgTlVNQUlORk9fRVZFTlRTX1RBUkdFVAkoMTAyNCkKIAogc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUgewogCWxvbmcgY291bnRbTUVNX0NHUk9VUF9TVEFUX05TVEFUU107CkBAIC0yMzYsNyArMjM5LDggQEAKIAlpbnQgbGFzdF9zY2FubmVkX25vZGU7CiAjaWYgTUFYX05VTU5PREVTID4gMQogCW5vZGVtYXNrX3QJc2Nhbl9ub2RlczsKLQl1bnNpZ25lZCBsb25nICAgbmV4dF9zY2FuX25vZGVfdXBkYXRlOworCWF0b21pY190CW51bWFpbmZvX2V2ZW50czsKKwlhdG9taWNfdAludW1haW5mb191cGRhdGluZzsKICNlbmRpZgogCS8qCiAJICogU2hvdWxkIHRoZSBhY2NvdW50aW5nIGFuZCBjb250cm9sIGJlIGhpZXJhcmNoaWNhbCwgcGVyIHN1YnRyZWU/CkBAIC0zNTksNyArMzYzLDcgQEAKIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZ2V0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwogc3RhdGljIHZvaWQgbWVtX2Nncm91cF9wdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7CiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudF9tZW1fY2dyb3VwKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwotc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrX2FzeW5jKHZvaWQpOworc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrX2FzeW5jKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwogCiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKgogbWVtX2Nncm91cF96b25laW5mbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBpbnQgbmlkLCBpbnQgemlkKQpAQCAtNTc2LDE1ICs1ODAsNiBAQAogCXJldHVybiB2YWw7CiB9CiAKLXN0YXRpYyBsb25nIG1lbV9jZ3JvdXBfbG9jYWxfdXNhZ2Uoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKLXsKLQlsb25nIHJldDsKLQotCXJldCA9IG1lbV9jZ3JvdXBfcmVhZF9zdGF0KG1lbSwgTUVNX0NHUk9VUF9TVEFUX1JTUyk7Ci0JcmV0ICs9IG1lbV9jZ3JvdXBfcmVhZF9zdGF0KG1lbSwgTUVNX0NHUk9VUF9TVEFUX0NBQ0hFKTsKLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3N3YXBfc3RhdGlzdGljcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAogCQkJCQkgYm9vbCBjaGFyZ2UpCiB7CkBAIC02ODgsNiArNjgzLDkgQEAKIAljYXNlIE1FTV9DR1JPVVBfVEFSR0VUX1NPRlRMSU1JVDoKIAkJbmV4dCA9IHZhbCArIFNPRlRMSU1JVF9FVkVOVFNfVEFSR0VUOwogCQlicmVhazsKKwljYXNlIE1FTV9DR1JPVVBfVEFSR0VUX05VTUFJTkZPOgorCQluZXh0ID0gdmFsICsgTlVNQUlORk9fRVZFTlRTX1RBUkdFVDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuOwogCX0KQEAgLTcwNiwxMSArNzA0LDE5IEBACiAJCW1lbV9jZ3JvdXBfdGhyZXNob2xkKG1lbSk7CiAJCV9fbWVtX2Nncm91cF90YXJnZXRfdXBkYXRlKG1lbSwgTUVNX0NHUk9VUF9UQVJHRVRfVEhSRVNIKTsKIAkJaWYgKHVubGlrZWx5KF9fbWVtY2dfZXZlbnRfY2hlY2sobWVtLAotCQkJTUVNX0NHUk9VUF9UQVJHRVRfU09GVExJTUlUKSkpeworCQkJICAgICBNRU1fQ0dST1VQX1RBUkdFVF9TT0ZUTElNSVQpKSkgewogCQkJbWVtX2Nncm91cF91cGRhdGVfdHJlZShtZW0sIHBhZ2UpOwogCQkJX19tZW1fY2dyb3VwX3RhcmdldF91cGRhdGUobWVtLAotCQkJCU1FTV9DR1JPVVBfVEFSR0VUX1NPRlRMSU1JVCk7CisJCQkJCQkgICBNRU1fQ0dST1VQX1RBUkdFVF9TT0ZUTElNSVQpOwogCQl9CisjaWYgTUFYX05VTU5PREVTID4gMQorCQlpZiAodW5saWtlbHkoX19tZW1jZ19ldmVudF9jaGVjayhtZW0sCisJCQlNRU1fQ0dST1VQX1RBUkdFVF9OVU1BSU5GTykpKSB7CisJCQlhdG9taWNfaW5jKCZtZW0tPm51bWFpbmZvX2V2ZW50cyk7CisJCQlfX21lbV9jZ3JvdXBfdGFyZ2V0X3VwZGF0ZShtZW0sCisJCQkJTUVNX0NHUk9VUF9UQVJHRVRfTlVNQUlORk8pOworCQl9CisjZW5kaWYKIAl9CiB9CiAKQEAgLTczNSw3ICs3NDEsNyBAQAogCQkJCXN0cnVjdCBtZW1fY2dyb3VwLCBjc3MpOwogfQogCi1zdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQorc3RydWN0IG1lbV9jZ3JvdXAgKnRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOwogCkBAIC0xMTI4LDcgKzExMzQsNiBAQAogCXJldHVybiBNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpOwogfQogCi0jaWZkZWYgQ09ORklHX05VTUEKIHN0YXRpYyB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfbm9kZV9ucl9maWxlX2xydV9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJCQkJaW50IG5pZCkKIHsKQEAgLTExNDAsNiArMTE0NSwxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfbm9kZV9ucl9hbm9uX2xydV9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCisJCQkJCQkJaW50IG5pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCXJldCA9IG1lbV9jZ3JvdXBfZ2V0X3pvbmVzdGF0X25vZGUobWVtY2csIG5pZCwgTFJVX0lOQUNUSVZFX0FOT04pICsKKwkJbWVtX2Nncm91cF9nZXRfem9uZXN0YXRfbm9kZShtZW1jZywgbmlkLCBMUlVfQUNUSVZFX0FOT04pOworCXJldHVybiByZXQ7Cit9CisKKyNpZiBNQVhfTlVNTk9ERVMgPiAxCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX25yX2ZpbGVfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAl1NjQgdG90YWwgPSAwOwpAQCAtMTE1MSwxNyArMTE2Nyw2IEBACiAJcmV0dXJuIHRvdGFsOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX25vZGVfbnJfYW5vbl9scnVfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAotCQkJCQkJCWludCBuaWQpCi17Ci0JdW5zaWduZWQgbG9uZyByZXQ7Ci0KLQlyZXQgPSBtZW1fY2dyb3VwX2dldF96b25lc3RhdF9ub2RlKG1lbWNnLCBuaWQsIExSVV9JTkFDVElWRV9BTk9OKSArCi0JCW1lbV9jZ3JvdXBfZ2V0X3pvbmVzdGF0X25vZGUobWVtY2csIG5pZCwgTFJVX0FDVElWRV9BTk9OKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfbnJfYW5vbl9scnVfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXU2NCB0b3RhbCA9IDA7CkBAIC0xNTU4LDYgKzE1NjMsMjggQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIHRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlCisgKiBAbWVtOiB0aGUgdGFyZ2V0IG1lbWNnCisgKiBAbmlkOiB0aGUgbm9kZSBJRCB0byBiZSBjaGVja2VkLgorICogQG5vc3dhcCA6IHNwZWNpZnkgdHJ1ZSBoZXJlIGlmIHRoZSB1c2VyIHdhbnRzIGZsbGUgb25seSBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIG1lbWNnIGNvbnRhaW5zIGFueQorICogcmVjbGFpbWFibGUgcGFnZXMgb24gYSBub2RlLiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFueSByZWNsYWltYWJsZQorICogcGFnZXMgaW4gdGhlIG5vZGUuCisgKi8KK3N0YXRpYyBib29sIHRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCWludCBuaWQsIGJvb2wgbm9zd2FwKQoreworCWlmIChtZW1fY2dyb3VwX25vZGVfbnJfZmlsZV9scnVfcGFnZXMobWVtLCBuaWQpKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAobm9zd2FwIHx8ICF0b3RhbF9zd2FwX3BhZ2VzKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKG1lbV9jZ3JvdXBfbm9kZV9ucl9hbm9uX2xydV9wYWdlcyhtZW0sIG5pZCkpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKKworfQogI2lmIE1BWF9OVU1OT0RFUyA+IDEKIAogLyoKQEAgLTE1NjksMjYgKzE1OTYsMjYgQEAKIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfbWF5X3VwZGF0ZV9ub2RlbWFzayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQogewogCWludCBuaWQ7Ci0KLQlpZiAodGltZV9hZnRlcihtZW0tPm5leHRfc2Nhbl9ub2RlX3VwZGF0ZSwgamlmZmllcykpCisJLyoKKwkgKiBudW1haW5mb19ldmVudHMgPiAwIG1lYW5zIHRoZXJlIHdhcyBhdCBsZWFzdCBOVU1BSU5GT19FVkVOVFNfVEFSR0VUCisJICogcGFnZWluL3BhZ2VvdXQgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCB1cGRhdGUuCisJICovCisJaWYgKCFhdG9taWNfcmVhZCgmbWVtLT5udW1haW5mb19ldmVudHMpKQorCQlyZXR1cm47CisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZtZW0tPm51bWFpbmZvX3VwZGF0aW5nKSA+IDEpCiAJCXJldHVybjsKIAotCW1lbS0+bmV4dF9zY2FuX25vZGVfdXBkYXRlID0gamlmZmllcyArIDEwKkhaOwogCS8qIG1ha2UgYSBub2RlbWFzayB3aGVyZSB0aGlzIG1lbWNnIHVzZXMgbWVtb3J5IGZyb20gKi8KIAltZW0tPnNjYW5fbm9kZXMgPSBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXTsKIAogCWZvcl9lYWNoX25vZGVfbWFzayhuaWQsIG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKSB7CiAKLQkJaWYgKG1lbV9jZ3JvdXBfZ2V0X3pvbmVzdGF0X25vZGUobWVtLCBuaWQsIExSVV9JTkFDVElWRV9GSUxFKSB8fAotCQkgICAgbWVtX2Nncm91cF9nZXRfem9uZXN0YXRfbm9kZShtZW0sIG5pZCwgTFJVX0FDVElWRV9GSUxFKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh0b3RhbF9zd2FwX3BhZ2VzICYmCi0JCSAgICAobWVtX2Nncm91cF9nZXRfem9uZXN0YXRfbm9kZShtZW0sIG5pZCwgTFJVX0lOQUNUSVZFX0FOT04pIHx8Ci0JCSAgICAgbWVtX2Nncm91cF9nZXRfem9uZXN0YXRfbm9kZShtZW0sIG5pZCwgTFJVX0FDVElWRV9BTk9OKSkpCi0JCQljb250aW51ZTsKLQkJbm9kZV9jbGVhcihuaWQsIG1lbS0+c2Nhbl9ub2Rlcyk7CisJCWlmICghdGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtLCBuaWQsIGZhbHNlKSkKKwkJCW5vZGVfY2xlYXIobmlkLCBtZW0tPnNjYW5fbm9kZXMpOwogCX0KKworCWF0b21pY19zZXQoJm1lbS0+bnVtYWluZm9fZXZlbnRzLCAwKTsKKwlhdG9taWNfc2V0KCZtZW0tPm51bWFpbmZvX3VwZGF0aW5nLCAwKTsKIH0KIAogLyoKQEAgLTE2MjYsMTEgKzE2NTMsNTEgQEAKIAlyZXR1cm4gbm9kZTsKIH0KIAorLyoKKyAqIENoZWNrIGFsbCBub2RlcyB3aGV0aGVyIGl0IGNvbnRhaW5zIHJlY2xhaW1hYmxlIHBhZ2VzIG9yIG5vdC4KKyAqIEZvciBxdWljayBzY2FuLCB3ZSBtYWtlIHVzZSBvZiBzY2FuX25vZGVzLiBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gc2tpcAorICogdW51c2VkIG5vZGVzLiBCdXQgc2Nhbl9ub2RlcyBpcyBsYXppbHkgdXBkYXRlZCBhbmQgbWF5IG5vdCBjb3RhaW4KKyAqIGVub3VnaCBuZXcgaW5mb3JtYXRpb24uIFdlIG5lZWQgdG8gZG8gZG91YmxlIGNoZWNrLgorICovCitib29sIG1lbV9jZ3JvdXBfcmVjbGFpbWFibGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgYm9vbCBub3N3YXApCit7CisJaW50IG5pZDsKKworCS8qCisJICogcXVpY2sgY2hlY2suLi5tYWtpbmcgdXNlIG9mIHNjYW5fbm9kZS4KKwkgKiBXZSBjYW4gc2tpcCB1bnVzZWQgbm9kZXMuCisJICovCisJaWYgKCFub2Rlc19lbXB0eShtZW0tPnNjYW5fbm9kZXMpKSB7CisJCWZvciAobmlkID0gZmlyc3Rfbm9kZShtZW0tPnNjYW5fbm9kZXMpOworCQkgICAgIG5pZCA8IE1BWF9OVU1OT0RFUzsKKwkJICAgICBuaWQgPSBuZXh0X25vZGUobmlkLCBtZW0tPnNjYW5fbm9kZXMpKSB7CisKKwkJCWlmICh0ZXN0X21lbV9jZ3JvdXBfbm9kZV9yZWNsYWltYWJsZShtZW0sIG5pZCwgbm9zd2FwKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwkvKgorCSAqIENoZWNrIHJlc3Qgb2Ygbm9kZXMuCisJICovCisJZm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fSElHSF9NRU1PUlkpIHsKKwkJaWYgKG5vZGVfaXNzZXQobmlkLCBtZW0tPnNjYW5fbm9kZXMpKQorCQkJY29udGludWU7CisJCWlmICh0ZXN0X21lbV9jZ3JvdXBfbm9kZV9yZWNsYWltYWJsZShtZW0sIG5pZCwgbm9zd2FwKSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKICNlbHNlCiBpbnQgbWVtX2Nncm91cF9zZWxlY3RfdmljdGltX25vZGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKIHsKIAlyZXR1cm4gMDsKIH0KKworYm9vbCBtZW1fY2dyb3VwX3JlY2xhaW1hYmxlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGJvb2wgbm9zd2FwKQoreworCXJldHVybiB0ZXN0X21lbV9jZ3JvdXBfbm9kZV9yZWNsYWltYWJsZShtZW0sIDAsIG5vc3dhcCk7Cit9CiAjZW5kaWYKIAogLyoKQEAgLTE2NjMsMTUgKzE3MzAsMjEgQEAKIAlleGNlc3MgPSByZXNfY291bnRlcl9zb2Z0X2xpbWl0X2V4Y2Vzcygmcm9vdF9tZW0tPnJlcykgPj4gUEFHRV9TSElGVDsKIAogCS8qIElmIG1lbXN3X2lzX21pbmltdW09PTEsIHN3YXAtb3V0IGlzIG9mLW5vLXVzZS4gKi8KLQlpZiAocm9vdF9tZW0tPm1lbXN3X2lzX21pbmltdW0pCisJaWYgKCFjaGVja19zb2Z0ICYmIHJvb3RfbWVtLT5tZW1zd19pc19taW5pbXVtKQogCQlub3N3YXAgPSB0cnVlOwogCiAJd2hpbGUgKDEpIHsKIAkJdmljdGltID0gbWVtX2Nncm91cF9zZWxlY3RfdmljdGltKHJvb3RfbWVtKTsKIAkJaWYgKHZpY3RpbSA9PSByb290X21lbSkgewogCQkJbG9vcCsrOwotCQkJaWYgKGxvb3AgPj0gMSkKLQkJCQlkcmFpbl9hbGxfc3RvY2tfYXN5bmMoKTsKKwkJCS8qCisJCQkgKiBXZSBhcmUgbm90IGRyYWluaW5nIHBlciBjcHUgY2FjaGVkIGNoYXJnZXMgZHVyaW5nCisJCQkgKiBzb2Z0IGxpbWl0IHJlY2xhaW0gIGJlY2F1c2UgZ2xvYmFsIHJlY2xhaW0gZG9lc24ndAorCQkJICogY2FyZSBhYm91dCBjaGFyZ2VzLiBJdCB0cmllcyB0byBmcmVlIHNvbWUgbWVtb3J5IGFuZAorCQkJICogY2hhcmdlcyB3aWxsIG5vdCBnaXZlIGFueS4KKwkJCSAqLworCQkJaWYgKCFjaGVja19zb2Z0ICYmIGxvb3AgPj0gMSkKKwkJCQlkcmFpbl9hbGxfc3RvY2tfYXN5bmMocm9vdF9tZW0pOwogCQkJaWYgKGxvb3AgPj0gMikgewogCQkJCS8qCiAJCQkJICogSWYgd2UgaGF2ZSBub3QgYmVlbiBhYmxlIHRvIHJlY2xhaW0KQEAgLTE2OTUsNyArMTc2OCw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCWlmICghbWVtX2Nncm91cF9sb2NhbF91c2FnZSh2aWN0aW0pKSB7CisJCWlmICghbWVtX2Nncm91cF9yZWNsYWltYWJsZSh2aWN0aW0sIG5vc3dhcCkpIHsKIAkJCS8qIHRoaXMgY2dyb3VwJ3MgbG9jYWwgdXNhZ2UgPT0gMCAqLwogCQkJY3NzX3B1dCgmdmljdGltLT5jc3MpOwogCQkJY29udGludWU7CkBAIC0xOTM0LDkgKzIwMDcsMTEgQEAKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqY2FjaGVkOyAvKiB0aGlzIG5ldmVyIGJlIHJvb3QgY2dyb3VwICovCiAJdW5zaWduZWQgaW50IG5yX3BhZ2VzOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZGVmaW5lIEZMVVNISU5HX0NBQ0hFRF9DSEFSR0UJKDApCiB9Owogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBtZW1jZ19zdG9ja19wY3AsIG1lbWNnX3N0b2NrKTsKLXN0YXRpYyBhdG9taWNfdCBtZW1jZ19kcmFpbl9jb3VudDsKK3N0YXRpYyBERUZJTkVfTVVURVgocGVyY3B1X2NoYXJnZV9tdXRleCk7CiAKIC8qCiAgKiBUcnkgdG8gY29uc3VtZSBzdG9ja2VkIGNoYXJnZSBvbiB0aGlzIGNwdS4gSWYgc3VjY2Vzcywgb25lIHBhZ2UgaXMgY29uc3VtZWQKQEAgLTE5ODQsNiArMjA1OSw3IEBACiB7CiAJc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2sgPSAmX19nZXRfY3B1X3ZhcihtZW1jZ19zdG9jayk7CiAJZHJhaW5fc3RvY2soc3RvY2spOworCWNsZWFyX2JpdChGTFVTSElOR19DQUNIRURfQ0hBUkdFLCAmc3RvY2stPmZsYWdzKTsKIH0KIAogLyoKQEAgLTIwMDgsMjYgKzIwODQsNDUgQEAKICAqIGV4cGVjdHMgc29tZSBjaGFyZ2VzIHdpbGwgYmUgYmFjayB0byByZXNfY291bnRlciBsYXRlciBidXQgY2Fubm90IHdhaXQgZm9yCiAgKiBpdC4KICAqLwotc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrX2FzeW5jKHZvaWQpCitzdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfYXN5bmMoc3RydWN0IG1lbV9jZ3JvdXAgKnJvb3RfbWVtKQogewotCWludCBjcHU7Ci0JLyogVGhpcyBmdW5jdGlvbiBpcyBmb3Igc2NoZWR1bGluZyAiZHJhaW4iIGluIGFzeW5jaHJvbm91cyB3YXkuCi0JICogVGhlIHJlc3VsdCBvZiAiZHJhaW4iIGlzIG5vdCBkaXJlY3RseSBoYW5kbGVkIGJ5IGNhbGxlcnMuIFRoZW4sCi0JICogaWYgc29tZW9uZSBpcyBjYWxsaW5nIGRyYWluLCB3ZSBkb24ndCBoYXZlIHRvIGNhbGwgZHJhaW4gbW9yZS4KLQkgKiBBbnl3YXksIFdPUktfU1RSVUNUX1BFTkRJTkcgY2hlY2sgaW4gcXVldWVfd29ya19vbigpIHdpbGwgY2F0Y2ggaWYKLQkgKiB0aGVyZSBpcyBhIHJhY2UuIFdlIGp1c3QgZG8gbG9vc2UgY2hlY2sgaGVyZS4KKwlpbnQgY3B1LCBjdXJjcHU7CisJLyoKKwkgKiBJZiBzb21lb25lIGNhbGxzIGRyYWluaW5nLCBhdm9pZCBhZGRpbmcgbW9yZSBrd29ya2VyIHJ1bnMuCiAJICovCi0JaWYgKGF0b21pY19yZWFkKCZtZW1jZ19kcmFpbl9jb3VudCkpCisJaWYgKCFtdXRleF90cnlsb2NrKCZwZXJjcHVfY2hhcmdlX211dGV4KSkKIAkJcmV0dXJuOwogCS8qIE5vdGlmeSBvdGhlciBjcHVzIHRoYXQgc3lzdGVtLXdpZGUgImRyYWluIiBpcyBydW5uaW5nICovCi0JYXRvbWljX2luYygmbWVtY2dfZHJhaW5fY291bnQpOwogCWdldF9vbmxpbmVfY3B1cygpOworCS8qCisJICogR2V0IGEgaGludCBmb3IgYXZvaWRpbmcgZHJhaW5pbmcgY2hhcmdlcyBvbiB0aGUgY3VycmVudCBjcHUsCisJICogd2hpY2ggbXVzdCBiZSBleGhhdXN0ZWQgYnkgb3VyIGNoYXJnaW5nLiAgSXQgaXMgbm90IHJlcXVpcmVkIHRoYXQKKwkgKiB0aGlzIGJlIGEgcHJlY2lzZSBjaGVjaywgc28gd2UgdXNlIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgaW5zdGVhZCBvZgorCSAqIGdldGNwdSgpL3B1dGNwdSgpLgorCSAqLworCWN1cmNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2sgPSAmcGVyX2NwdShtZW1jZ19zdG9jaywgY3B1KTsKLQkJc2NoZWR1bGVfd29ya19vbihjcHUsICZzdG9jay0+d29yayk7CisJCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisKKwkJaWYgKGNwdSA9PSBjdXJjcHUpCisJCQljb250aW51ZTsKKworCQltZW0gPSBzdG9jay0+Y2FjaGVkOworCQlpZiAoIW1lbSkKKwkJCWNvbnRpbnVlOworCQlpZiAobWVtICE9IHJvb3RfbWVtKSB7CisJCQlpZiAoIXJvb3RfbWVtLT51c2VfaGllcmFyY2h5KQorCQkJCWNvbnRpbnVlOworCQkJLyogY2hlY2sgd2hldGhlciAibWVtIiBpcyB1bmRlciB0cmVlIG9mICJyb290X21lbSIgKi8KKwkJCWlmICghY3NzX2lzX2FuY2VzdG9yKCZtZW0tPmNzcywgJnJvb3RfbWVtLT5jc3MpKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChGTFVTSElOR19DQUNIRURfQ0hBUkdFLCAmc3RvY2stPmZsYWdzKSkKKwkJCXNjaGVkdWxlX3dvcmtfb24oY3B1LCAmc3RvY2stPndvcmspOwogCX0KICAJcHV0X29ubGluZV9jcHVzKCk7Ci0JYXRvbWljX2RlYygmbWVtY2dfZHJhaW5fY291bnQpOworCW11dGV4X3VubG9jaygmcGVyY3B1X2NoYXJnZV9tdXRleCk7CiAJLyogV2UgZG9uJ3Qgd2FpdCBmb3IgZmx1c2hfd29yayAqLwogfQogCkBAIC0yMDM1LDkgKzIxMzAsOSBAQAogc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrX3N5bmModm9pZCkKIHsKIAkvKiBjYWxsZWQgd2hlbiBmb3JjZV9lbXB0eSBpcyBjYWxsZWQgKi8KLQlhdG9taWNfaW5jKCZtZW1jZ19kcmFpbl9jb3VudCk7CisJbXV0ZXhfbG9jaygmcGVyY3B1X2NoYXJnZV9tdXRleCk7CiAJc2NoZWR1bGVfb25fZWFjaF9jcHUoZHJhaW5fbG9jYWxfc3RvY2spOwotCWF0b21pY19kZWMoJm1lbWNnX2RyYWluX2NvdW50KTsKKwltdXRleF91bmxvY2soJnBlcmNwdV9jaGFyZ2VfbXV0ZXgpOwogfQogCiAvKgpAQCAtNDY0MCw2ICs0NzM1LDcgQEAKIAl7CiAJCS5uYW1lID0gIm51bWFfc3RhdCIsCiAJCS5vcGVuID0gbWVtX2NvbnRyb2xfbnVtYV9zdGF0X29wZW4sCisJCS5tb2RlID0gU19JUlVHTywKIAl9LAogI2VuZGlmCiB9OwpAQCAtNTQxNCwxOCArNTUxMCwxNiBAQAogCQkJCXN0cnVjdCBjZ3JvdXAgKm9sZF9jb250LAogCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHApOwogCi0JaWYgKCFtYy50bykKLQkJLyogbm8gbmVlZCB0byBtb3ZlIGNoYXJnZSAqLwotCQlyZXR1cm47Ci0KLQltbSA9IGdldF90YXNrX21tKHApOwogCWlmIChtbSkgewotCQltZW1fY2dyb3VwX21vdmVfY2hhcmdlKG1tKTsKKwkJaWYgKG1jLnRvKQorCQkJbWVtX2Nncm91cF9tb3ZlX2NoYXJnZShtbSk7CisJCXB1dF9zd2FwX3Rva2VuKG1tKTsKIAkJbW1wdXQobW0pOwogCX0KLQltZW1fY2dyb3VwX2NsZWFyX21jKCk7CisJaWYgKG1jLnRvKQorCQltZW1fY2dyb3VwX2NsZWFyX21jKCk7CiB9CiAjZWxzZQkvKiAhQ09ORklHX01NVSAqLwogc3RhdGljIGludCBtZW1fY2dyb3VwX2Nhbl9hdHRhY2goc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLApkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LWZhaWx1cmUuYyBiL21tL21lbW9yeS1mYWlsdXJlLmMKaW5kZXggNWM4ZjdlMC4uNzQwYzRmNSAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LWZhaWx1cmUuYworKysgYi9tbS9tZW1vcnktZmFpbHVyZS5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1vcnlfaG90cGx1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L21tX2lubGluZS5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIGludCBzeXNjdGxfbWVtb3J5X2ZhaWx1cmVfZWFybHlfa2lsbCBfX3JlYWRfbW9zdGx5ID0gMDsKQEAgLTM5MCwxMCArMzkxLDExIEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJc3RydWN0IGFub25fdm1hICphdjsKIAotCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJYXYgPSBwYWdlX2xvY2tfYW5vbl92bWEocGFnZSk7CiAJaWYgKGF2ID09IE5VTEwpCS8qIE5vdCBhY3R1YWxseSBtYXBwZWQgYW55bW9yZSAqLwotCQlnb3RvIG91dDsKKwkJcmV0dXJuOworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlmb3JfZWFjaF9wcm9jZXNzICh0c2spIHsKIAkJc3RydWN0IGFub25fdm1hX2NoYWluICp2bWFjOwogCkBAIC00MDcsOSArNDA5LDggQEAKIAkJCQlhZGRfdG9fa2lsbCh0c2ssIHBhZ2UsIHZtYSwgdG9fa2lsbCwgdGtjKTsKIAkJfQogCX0KLQlwYWdlX3VubG9ja19hbm9uX3ZtYShhdik7Ci1vdXQ6CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCXBhZ2VfdW5sb2NrX2Fub25fdm1hKGF2KTsKIH0KIAogLyoKQEAgLTQyMywxNyArNDI0LDggQEAKIAlzdHJ1Y3QgcHJpb190cmVlX2l0ZXIgaXRlcjsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CiAKLQkvKgotCSAqIEEgbm90ZSBvbiB0aGUgbG9ja2luZyBvcmRlciBiZXR3ZWVuIHRoZSB0d28gbG9ja3MuCi0JICogV2UgZG9uJ3QgcmVseSBvbiB0aGlzIHBhcnRpY3VsYXIgb3JkZXIuCi0JICogSWYgeW91IGhhdmUgc29tZSBvdGhlciBjb2RlIHRoYXQgbmVlZHMgYSBkaWZmZXJlbnQgb3JkZXIKLQkgKiBmZWVsIGZyZWUgdG8gc3dpdGNoIHRoZW0gYXJvdW5kLiBPciBhZGQgYSByZXZlcnNlIGxpbmsKLQkgKiBmcm9tIG1tX3N0cnVjdCB0byB0YXNrX3N0cnVjdCwgdGhlbiB0aGlzIGNvdWxkIGJlIGFsbAotCSAqIGRvbmUgd2l0aG91dCB0YWtpbmcgdGFza2xpc3RfbG9jayBhbmQgbG9vcGluZyBvdmVyIGFsbCB0YXNrcy4KLQkgKi8KLQotCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJbXV0ZXhfbG9jaygmbWFwcGluZy0+aV9tbWFwX211dGV4KTsKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCWZvcl9lYWNoX3Byb2Nlc3ModHNrKSB7CiAJCXBnb2ZmX3QgcGdvZmYgPSBwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIFBBR0VfU0hJRlQpOwogCkBAIC00NTMsOCArNDQ1LDggQEAKIAkJCQlhZGRfdG9fa2lsbCh0c2ssIHBhZ2UsIHZtYSwgdG9fa2lsbCwgdGtjKTsKIAkJfQogCX0KLQltdXRleF91bmxvY2soJm1hcHBpbmctPmlfbW1hcF9tdXRleCk7CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCW11dGV4X3VubG9jaygmbWFwcGluZy0+aV9tbWFwX211dGV4KTsKIH0KIAogLyoKQEAgLTE0NjgsNyArMTQ2MCw4IEBACiAJcHV0X3BhZ2UocGFnZSk7CiAJaWYgKCFyZXQpIHsKIAkJTElTVF9IRUFEKHBhZ2VsaXN0KTsKLQorCQlpbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0lTT0xBVEVEX0FOT04gKworCQkJCQkgICAgcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpKTsKIAkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJnBhZ2VsaXN0KTsKIAkJcmV0ID0gbWlncmF0ZV9wYWdlcygmcGFnZWxpc3QsIG5ld19wYWdlLCBNUE9MX01GX01PVkVfQUxMLAogCQkJCQkJCQkwLCB0cnVlKTsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggNjk1M2QzOS4uYTU2ZTNiYSAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTMwNSw2ICszMDUsNyBAQAogCWlmIChiYXRjaC0+bnIgPT0gYmF0Y2gtPm1heCkgewogCQlpZiAoIXRsYl9uZXh0X2JhdGNoKHRsYikpCiAJCQlyZXR1cm4gMDsKKwkJYmF0Y2ggPSB0bGItPmFjdGl2ZTsKIAl9CiAJVk1fQlVHX09OKGJhdGNoLT5uciA+IGJhdGNoLT5tYXgpOwogCkBAIC0xMTEyLDExICsxMTEzLDEzIEBACiAJaW50IGZvcmNlX2ZsdXNoID0gMDsKIAlpbnQgcnNzW05SX01NX0NPVU5URVJTXTsKIAlzcGlubG9ja190ICpwdGw7CisJcHRlX3QgKnN0YXJ0X3B0ZTsKIAlwdGVfdCAqcHRlOwogCiBhZ2FpbjoKIAlpbml0X3Jzc192ZWMocnNzKTsKLQlwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsICZwdGwpOworCXN0YXJ0X3B0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgJnB0bCk7CisJcHRlID0gc3RhcnRfcHRlOwogCWFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSgpOwogCWRvIHsKIAkJcHRlX3QgcHRlbnQgPSAqcHRlOwpAQCAtMTE5Niw3ICsxMTk5LDcgQEAKIAogCWFkZF9tbV9yc3NfdmVjKG1tLCByc3MpOwogCWFyY2hfbGVhdmVfbGF6eV9tbXVfbW9kZSgpOwotCXB0ZV91bm1hcF91bmxvY2socHRlIC0gMSwgcHRsKTsKKwlwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRsKTsKIAogCS8qCiAJICogbW11X2dhdGhlciByYW4gb3V0IG9mIHJvb20gdG8gYmF0Y2ggcGFnZXMsIHdlIGJyZWFrIG91dCBvZgpAQCAtMTI4NywxNiArMTI5MCw5IEBACiAJcmV0dXJuIGFkZHI7CiB9CiAKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotIyBkZWZpbmUgWkFQX0JMT0NLX1NJWkUJKDggKiBQQUdFX1NJWkUpCi0jZWxzZQotLyogTm8gcHJlZW1wdDogZ28gZm9yIGltcHJvdmVkIHN0cmFpZ2h0LWxpbmUgZWZmaWNpZW5jeSAqLwotIyBkZWZpbmUgWkFQX0JMT0NLX1NJWkUJKDEwMjQgKiBQQUdFX1NJWkUpCi0jZW5kaWYKLQogLyoqCiAgKiB1bm1hcF92bWFzIC0gdW5tYXAgYSByYW5nZSBvZiBtZW1vcnkgY292ZXJlZCBieSBhIGxpc3Qgb2Ygdm1hJ3MKLSAqIEB0bGJwOiBhZGRyZXNzIG9mIHRoZSBjYWxsZXIncyBzdHJ1Y3QgbW11X2dhdGhlcgorICogQHRsYjogYWRkcmVzcyBvZiB0aGUgY2FsbGVyJ3Mgc3RydWN0IG1tdV9nYXRoZXIKICAqIEB2bWE6IHRoZSBzdGFydGluZyB2bWEKICAqIEBzdGFydF9hZGRyOiB2aXJ0dWFsIGFkZHJlc3MgYXQgd2hpY2ggdG8gc3RhcnQgdW5tYXBwaW5nCiAgKiBAZW5kX2FkZHI6IHZpcnR1YWwgYWRkcmVzcyBhdCB3aGljaCB0byBlbmQgdW5tYXBwaW5nCkBAIC0xMzA3LDEwICsxMzAzLDYgQEAKICAqCiAgKiBVbm1hcCBhbGwgcGFnZXMgaW4gdGhlIHZtYSBsaXN0LgogICoKLSAqIFdlIGFpbSB0byBub3QgaG9sZCBsb2NrcyBmb3IgdG9vIGxvbmcgKGZvciBzY2hlZHVsaW5nIGxhdGVuY3kgcmVhc29ucykuCi0gKiBTbyB6YXAgcGFnZXMgaW4gWkFQX0JMT0NLX1NJWkUgYnl0ZWNvdW50cy4gIFRoaXMgbWVhbnMgd2UgbmVlZCB0bwotICogcmV0dXJuIHRoZSBlbmRpbmcgbW11X2dhdGhlciB0byB0aGUgY2FsbGVyLgotICoKICAqIE9ubHkgYWRkcmVzc2VzIGJldHdlZW4gYHN0YXJ0JyBhbmQgYGVuZCcgd2lsbCBiZSB1bm1hcHBlZC4KICAqCiAgKiBUaGUgVk1BIGxpc3QgbXVzdCBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIHZpcnR1YWwgYWRkcmVzcyBvcmRlci4KQEAgLTE4MTMsNyArMTgwNSw2MyBAQAogfQogRVhQT1JUX1NZTUJPTChfX2dldF91c2VyX3BhZ2VzKTsKIAotLyoqCisvKgorICogZml4dXBfdXNlcl9mYXVsdCgpIC0gbWFudWFsbHkgcmVzb2x2ZSBhIHVzZXIgcGFnZSBmYXVsdAorICogQHRzazoJdGhlIHRhc2tfc3RydWN0IHRvIHVzZSBmb3IgcGFnZSBmYXVsdCBhY2NvdW50aW5nLCBvcgorICoJCU5VTEwgaWYgZmF1bHRzIGFyZSBub3QgdG8gYmUgcmVjb3JkZWQuCisgKiBAbW06CQltbV9zdHJ1Y3Qgb2YgdGFyZ2V0IG1tCisgKiBAYWRkcmVzczoJdXNlciBhZGRyZXNzCisgKiBAZmF1bHRfZmxhZ3M6ZmxhZ3MgdG8gcGFzcyBkb3duIHRvIGhhbmRsZV9tbV9mYXVsdCgpCisgKgorICogVGhpcyBpcyBtZWFudCB0byBiZSBjYWxsZWQgaW4gdGhlIHNwZWNpZmljIHNjZW5hcmlvIHdoZXJlIGZvciBsb2NraW5nIHJlYXNvbnMKKyAqIHdlIHRyeSB0byBhY2Nlc3MgdXNlciBtZW1vcnkgaW4gYXRvbWljIGNvbnRleHQgKHdpdGhpbiBhIHBhZ2VmYXVsdF9kaXNhYmxlKCkKKyAqIHNlY3Rpb24pLCB0aGlzIHJldHVybnMgLUVGQVVMVCwgYW5kIHdlIHdhbnQgdG8gcmVzb2x2ZSB0aGUgdXNlciBmYXVsdCBiZWZvcmUKKyAqIHRyeWluZyBhZ2Fpbi4KKyAqCisgKiBUeXBpY2FsbHkgdGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIGJ5IHRoZSBmdXRleCBjb2RlLgorICoKKyAqIFRoZSBtYWluIGRpZmZlcmVuY2Ugd2l0aCBnZXRfdXNlcl9wYWdlcygpIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsCisgKiB1bmNvbmRpdGlvbmFsbHkgY2FsbCBoYW5kbGVfbW1fZmF1bHQoKSB3aGljaCB3aWxsIGluIHR1cm4gcGVyZm9ybSBhbGwgdGhlCisgKiBuZWNlc3NhcnkgU1cgZml4dXAgb2YgdGhlIGRpcnR5IGFuZCB5b3VuZyBiaXRzIGluIHRoZSBQVEUsIHdoaWxlCisgKiBoYW5kbGVfbW1fZmF1bHQoKSBvbmx5IGd1YXJhbnRlZXMgdG8gdXBkYXRlIHRoZXNlIGluIHRoZSBzdHJ1Y3QgcGFnZS4KKyAqCisgKiBUaGlzIGlzIGltcG9ydGFudCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIHdoZXJlIHRob3NlIGJpdHMgYWxzbyBnYXRlIHRoZQorICogYWNjZXNzIHBlcm1pc3Npb24gdG8gdGhlIHBhZ2UgYmVjYXVzZSB0aGV5IGFyZSBtYWludGFpbmVkIGluIHNvZnR3YXJlLiAgT24KKyAqIHN1Y2ggYXJjaGl0ZWN0dXJlcywgZ3VwKCkgd2lsbCBub3QgYmUgZW5vdWdoIHRvIG1ha2UgYSBzdWJzZXF1ZW50IGFjY2VzcworICogc3VjY2VlZC4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgbW1fc2VtIGhlbGQgZm9yIHJlYWQuCisgKi8KK2ludCBmaXh1cF91c2VyX2ZhdWx0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCBmYXVsdF9mbGFncykKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlpbnQgcmV0OworCisJdm1hID0gZmluZF9leHRlbmRfdm1hKG1tLCBhZGRyZXNzKTsKKwlpZiAoIXZtYSB8fCBhZGRyZXNzIDwgdm1hLT52bV9zdGFydCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXQgPSBoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgYWRkcmVzcywgZmF1bHRfZmxhZ3MpOworCWlmIChyZXQgJiBWTV9GQVVMVF9FUlJPUikgeworCQlpZiAocmV0ICYgVk1fRkFVTFRfT09NKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmIChyZXQgJiAoVk1fRkFVTFRfSFdQT0lTT04gfCBWTV9GQVVMVF9IV1BPSVNPTl9MQVJHRSkpCisJCQlyZXR1cm4gLUVIV1BPSVNPTjsKKwkJaWYgKHJldCAmIFZNX0ZBVUxUX1NJR0JVUykKKwkJCXJldHVybiAtRUZBVUxUOworCQlCVUcoKTsKKwl9CisJaWYgKHRzaykgeworCQlpZiAocmV0ICYgVk1fRkFVTFRfTUFKT1IpCisJCQl0c2stPm1hal9mbHQrKzsKKwkJZWxzZQorCQkJdHNrLT5taW5fZmx0Kys7CisJfQorCXJldHVybiAwOworfQorCisvKgogICogZ2V0X3VzZXJfcGFnZXMoKSAtIHBpbiB1c2VyIHBhZ2VzIGluIG1lbW9yeQogICogQHRzazoJdGhlIHRhc2tfc3RydWN0IHRvIHVzZSBmb3IgcGFnZSBmYXVsdCBhY2NvdW50aW5nLCBvcgogICoJCU5VTEwgaWYgZmF1bHRzIGFyZSBub3QgdG8gYmUgcmVjb3JkZWQuCkBAIC0yNzk2LDMwICsyODQ0LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wodW5tYXBfbWFwcGluZ19yYW5nZSk7CiAKLWludCB2bXRydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBlbmQpCi17Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCi0JLyoKLQkgKiBJZiB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtIGlzIG5vdCBnb2luZyB0byBwcm92aWRlCi0JICogYSB3YXkgdG8gdHJ1bmNhdGUgYSByYW5nZSBvZiBibG9ja3MgKHB1bmNoIGEgaG9sZSkgLQotCSAqIHdlIHNob3VsZCByZXR1cm4gZmFpbHVyZSByaWdodCBub3cuCi0JICovCi0JaWYgKCFpbm9kZS0+aV9vcC0+dHJ1bmNhdGVfcmFuZ2UpCi0JCXJldHVybiAtRU5PU1lTOwotCi0JbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCWRvd25fd3JpdGUoJmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0JdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBvZmZzZXQsIChlbmQgLSBvZmZzZXQpLCAxKTsKLQl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShtYXBwaW5nLCBvZmZzZXQsIGVuZCk7Ci0JdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBvZmZzZXQsIChlbmQgLSBvZmZzZXQpLCAxKTsKLQlpbm9kZS0+aV9vcC0+dHJ1bmNhdGVfcmFuZ2UoaW5vZGUsIG9mZnNldCwgZW5kKTsKLQl1cF93cml0ZSgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKLQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQotCXJldHVybiAwOwotfQotCiAvKgogICogV2UgZW50ZXIgd2l0aCBub24tZXhjbHVzaXZlIG1tYXBfc2VtICh0byBleGNsdWRlIHZtYSBjaGFuZ2VzLAogICogYnV0IGFsbG93IGNvbmN1cnJlbnQgZmF1bHRzKSwgYW5kIHB0ZSBtYXBwZWQgYnV0IG5vdCB5ZXQgbG9ja2VkLgpAQCAtMzEyNSwxNCArMzE0OSwzNCBAQAogCXB0ZV90ICpwYWdlX3RhYmxlOwogCXNwaW5sb2NrX3QgKnB0bDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqY293X3BhZ2U7CiAJcHRlX3QgZW50cnk7CiAJaW50IGFub24gPSAwOwotCWludCBjaGFyZ2VkID0gMDsKIAlzdHJ1Y3QgcGFnZSAqZGlydHlfcGFnZSA9IE5VTEw7CiAJc3RydWN0IHZtX2ZhdWx0IHZtZjsKIAlpbnQgcmV0OwogCWludCBwYWdlX21rd3JpdGUgPSAwOwogCisJLyoKKwkgKiBJZiB3ZSBkbyBDT1cgbGF0ZXIsIGFsbG9jYXRlIHBhZ2UgYmVmb3IgdGFraW5nIGxvY2tfcGFnZSgpCisJICogb24gdGhlIGZpbGUgY2FjaGUgcGFnZS4gVGhpcyB3aWxsIHJlZHVjZSBsb2NrIGhvbGRpbmcgdGltZS4KKwkgKi8KKwlpZiAoKGZsYWdzICYgRkFVTFRfRkxBR19XUklURSkgJiYgISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkgeworCisJCWlmICh1bmxpa2VseShhbm9uX3ZtYV9wcmVwYXJlKHZtYSkpKQorCQkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKKworCQljb3dfcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUl9NT1ZBQkxFLCB2bWEsIGFkZHJlc3MpOworCQlpZiAoIWNvd19wYWdlKQorCQkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKKworCQlpZiAobWVtX2Nncm91cF9uZXdwYWdlX2NoYXJnZShjb3dfcGFnZSwgbW0sIEdGUF9LRVJORUwpKSB7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UoY293X3BhZ2UpOworCQkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKKwkJfQorCX0gZWxzZQorCQljb3dfcGFnZSA9IE5VTEw7CisKIAl2bWYudmlydHVhbF9hZGRyZXNzID0gKHZvaWQgX191c2VyICopKGFkZHJlc3MgJiBQQUdFX01BU0spOwogCXZtZi5wZ29mZiA9IHBnb2ZmOwogCXZtZi5mbGFncyA9IGZsYWdzOwpAQCAtMzE0MSwxMiArMzE4NSwxMyBAQAogCXJldCA9IHZtYS0+dm1fb3BzLT5mYXVsdCh2bWEsICZ2bWYpOwogCWlmICh1bmxpa2VseShyZXQgJiAoVk1fRkFVTFRfRVJST1IgfCBWTV9GQVVMVF9OT1BBR0UgfAogCQkJICAgIFZNX0ZBVUxUX1JFVFJZKSkpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gdW5jaGFyZ2Vfb3V0OwogCiAJaWYgKHVubGlrZWx5KFBhZ2VIV1BvaXNvbih2bWYucGFnZSkpKSB7CiAJCWlmIChyZXQgJiBWTV9GQVVMVF9MT0NLRUQpCiAJCQl1bmxvY2tfcGFnZSh2bWYucGFnZSk7Ci0JCXJldHVybiBWTV9GQVVMVF9IV1BPSVNPTjsKKwkJcmV0ID0gVk1fRkFVTFRfSFdQT0lTT047CisJCWdvdG8gdW5jaGFyZ2Vfb3V0OwogCX0KIAogCS8qCkBAIC0zMTY0LDIzICszMjA5LDggQEAKIAlwYWdlID0gdm1mLnBhZ2U7CiAJaWYgKGZsYWdzICYgRkFVTFRfRkxBR19XUklURSkgewogCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkgeworCQkJcGFnZSA9IGNvd19wYWdlOwogCQkJYW5vbiA9IDE7Ci0JCQlpZiAodW5saWtlbHkoYW5vbl92bWFfcHJlcGFyZSh2bWEpKSkgewotCQkJCXJldCA9IFZNX0ZBVUxUX09PTTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCXBhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVJfTU9WQUJMRSwKLQkJCQkJCXZtYSwgYWRkcmVzcyk7Ci0JCQlpZiAoIXBhZ2UpIHsKLQkJCQlyZXQgPSBWTV9GQVVMVF9PT007Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlpZiAobWVtX2Nncm91cF9uZXdwYWdlX2NoYXJnZShwYWdlLCBtbSwgR0ZQX0tFUk5FTCkpIHsKLQkJCQlyZXQgPSBWTV9GQVVMVF9PT007Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJY2hhcmdlZCA9IDE7CiAJCQljb3B5X3VzZXJfaGlnaHBhZ2UocGFnZSwgdm1mLnBhZ2UsIGFkZHJlc3MsIHZtYSk7CiAJCQlfX1NldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkJfSBlbHNlIHsKQEAgLTMyNDksOCArMzI3OSw4IEBACiAJCS8qIG5vIG5lZWQgdG8gaW52YWxpZGF0ZTogYSBub3QtcHJlc2VudCBwYWdlIHdvbid0IGJlIGNhY2hlZCAqLwogCQl1cGRhdGVfbW11X2NhY2hlKHZtYSwgYWRkcmVzcywgcGFnZV90YWJsZSk7CiAJfSBlbHNlIHsKLQkJaWYgKGNoYXJnZWQpCi0JCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UocGFnZSk7CisJCWlmIChjb3dfcGFnZSkKKwkJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShjb3dfcGFnZSk7CiAJCWlmIChhbm9uKQogCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQllbHNlCkBAIC0zMjU5LDcgKzMyODksNiBAQAogCiAJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOwogCi1vdXQ6CiAJaWYgKGRpcnR5X3BhZ2UpIHsKIAkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOwogCkBAIC0zMjg5LDYgKzMzMTgsMTMgQEAKIHVud3JpdGFibGVfcGFnZToKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJcmV0dXJuIHJldDsKK3VuY2hhcmdlX291dDoKKwkvKiBmcydzIGZhdWx0IGhhbmRsZXIgZ2V0IGVycm9yICovCisJaWYgKGNvd19wYWdlKSB7CisJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShjb3dfcGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShjb3dfcGFnZSk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZG9fbGluZWFyX2ZhdWx0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDlmNjQ2MzcuLjZlN2Q4YjIgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMzQsNiArMzQsMTcgQEAKIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKKy8qCisgKiBvbmxpbmVfcGFnZV9jYWxsYmFjayBjb250YWlucyBwb2ludGVyIHRvIGN1cnJlbnQgcGFnZSBvbmxpbmluZyBmdW5jdGlvbi4KKyAqIEluaXRpYWxseSBpdCBpcyBnZW5lcmljX29ubGluZV9wYWdlKCkuIElmIGl0IGlzIHJlcXVpcmVkIGl0IGNvdWxkIGJlCisgKiBjaGFuZ2VkIGJ5IGNhbGxpbmcgc2V0X29ubGluZV9wYWdlX2NhbGxiYWNrKCkgZm9yIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbgorICogYW5kIHJlc3RvcmVfb25saW5lX3BhZ2VfY2FsbGJhY2soKSBmb3IgZ2VuZXJpYyBjYWxsYmFjayByZXN0b3JlLgorICovCisKK3N0YXRpYyB2b2lkIGdlbmVyaWNfb25saW5lX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOworCitzdGF0aWMgb25saW5lX3BhZ2VfY2FsbGJhY2tfdCBvbmxpbmVfcGFnZV9jYWxsYmFjayA9IGdlbmVyaWNfb25saW5lX3BhZ2U7CisKIERFRklORV9NVVRFWChtZW1faG90cGx1Z19tdXRleCk7CiAKIHZvaWQgbG9ja19tZW1vcnlfaG90cGx1Zyh2b2lkKQpAQCAtMzYxLDIzICszNzIsNzQgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKF9fcmVtb3ZlX3BhZ2VzKTsKIAotdm9pZCBvbmxpbmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK2ludCBzZXRfb25saW5lX3BhZ2VfY2FsbGJhY2sob25saW5lX3BhZ2VfY2FsbGJhY2tfdCBjYWxsYmFjaykKK3sKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJbG9ja19tZW1vcnlfaG90cGx1ZygpOworCisJaWYgKG9ubGluZV9wYWdlX2NhbGxiYWNrID09IGdlbmVyaWNfb25saW5lX3BhZ2UpIHsKKwkJb25saW5lX3BhZ2VfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwkJcmMgPSAwOworCX0KKworCXVubG9ja19tZW1vcnlfaG90cGx1ZygpOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2V0X29ubGluZV9wYWdlX2NhbGxiYWNrKTsKKworaW50IHJlc3RvcmVfb25saW5lX3BhZ2VfY2FsbGJhY2sob25saW5lX3BhZ2VfY2FsbGJhY2tfdCBjYWxsYmFjaykKK3sKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJbG9ja19tZW1vcnlfaG90cGx1ZygpOworCisJaWYgKG9ubGluZV9wYWdlX2NhbGxiYWNrID09IGNhbGxiYWNrKSB7CisJCW9ubGluZV9wYWdlX2NhbGxiYWNrID0gZ2VuZXJpY19vbmxpbmVfcGFnZTsKKwkJcmMgPSAwOworCX0KKworCXVubG9ja19tZW1vcnlfaG90cGx1ZygpOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVzdG9yZV9vbmxpbmVfcGFnZV9jYWxsYmFjayk7CisKK3ZvaWQgX19vbmxpbmVfcGFnZV9zZXRfbGltaXRzKHN0cnVjdCBwYWdlICpwYWdlKQogewogCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocGFnZSk7CiAKLQl0b3RhbHJhbV9wYWdlcysrOwogCWlmIChwZm4gPj0gbnVtX3BoeXNwYWdlcykKIAkJbnVtX3BoeXNwYWdlcyA9IHBmbiArIDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX29ubGluZV9wYWdlX3NldF9saW1pdHMpOworCit2b2lkIF9fb25saW5lX3BhZ2VfaW5jcmVtZW50X2NvdW50ZXJzKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXRvdGFscmFtX3BhZ2VzKys7CiAKICNpZmRlZiBDT05GSUdfSElHSE1FTQogCWlmIChQYWdlSGlnaE1lbShwYWdlKSkKIAkJdG90YWxoaWdoX3BhZ2VzKys7CiAjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fb25saW5lX3BhZ2VfaW5jcmVtZW50X2NvdW50ZXJzKTsKIAordm9pZCBfX29ubGluZV9wYWdlX2ZyZWUoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CiAJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CiAJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOwogCV9fZnJlZV9wYWdlKHBhZ2UpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoX19vbmxpbmVfcGFnZV9mcmVlKTsKKworc3RhdGljIHZvaWQgZ2VuZXJpY19vbmxpbmVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlfX29ubGluZV9wYWdlX3NldF9saW1pdHMocGFnZSk7CisJX19vbmxpbmVfcGFnZV9pbmNyZW1lbnRfY291bnRlcnMocGFnZSk7CisJX19vbmxpbmVfcGFnZV9mcmVlKHBhZ2UpOworfQogCiBzdGF0aWMgaW50IG9ubGluZV9wYWdlc19yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKIAkJCXZvaWQgKmFyZykKQEAgLTM4OCw3ICs0NTAsNyBAQAogCWlmIChQYWdlUmVzZXJ2ZWQocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSkpCiAJCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7CiAJCQlwYWdlID0gcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuICsgaSk7Ci0JCQlvbmxpbmVfcGFnZShwYWdlKTsKKwkJCSgqb25saW5lX3BhZ2VfY2FsbGJhY2spKHBhZ2UpOwogCQkJb25saW5lZF9wYWdlcysrOwogCQl9CiAJKih1bnNpZ25lZCBsb25nICopYXJnID0gb25saW5lZF9wYWdlczsKQEAgLTQ5NCw2ICs1NTYsMTQgQEAKIAkvKiBpbml0IG5vZGUncyB6b25lcyBhcyBlbXB0eSB6b25lcywgd2UgZG9uJ3QgaGF2ZSBhbnkgcHJlc2VudCBwYWdlcy4qLwogCWZyZWVfYXJlYV9pbml0X25vZGUobmlkLCB6b25lc19zaXplLCBzdGFydF9wZm4sIHpob2xlc19zaXplKTsKIAorCS8qCisJICogVGhlIG5vZGUgd2UgYWxsb2NhdGVkIGhhcyBubyB6b25lIGZhbGxiYWNrIGxpc3RzLiBGb3IgYXZvaWRpbmcKKwkgKiB0byBhY2Nlc3Mgbm90LWluaXRpYWxpemVkIHpvbmVsaXN0LCBidWlsZCBoZXJlLgorCSAqLworCW11dGV4X2xvY2soJnpvbmVsaXN0c19tdXRleCk7CisJYnVpbGRfYWxsX3pvbmVsaXN0cyhOVUxMKTsKKwltdXRleF91bmxvY2soJnpvbmVsaXN0c19tdXRleCk7CisKIAlyZXR1cm4gcGdkYXQ7CiB9CiAKQEAgLTUxNSw3ICs1ODUsNyBAQAogCiAJbG9ja19tZW1vcnlfaG90cGx1ZygpOwogCXBnZGF0ID0gaG90YWRkX25ld19wZ2RhdChuaWQsIDApOwotCWlmIChwZ2RhdCkgeworCWlmICghcGdkYXQpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jCmluZGV4IGU0YTVjOTEuLjY2NmU0ZTYgMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYworKysgYi9tbS9taWdyYXRlLmMKQEAgLTI4OCw3ICsyODgsNyBAQAogCSAqLwogCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX1BBR0VTKTsKIAlfX2luY196b25lX3BhZ2Vfc3RhdGUobmV3cGFnZSwgTlJfRklMRV9QQUdFUyk7Ci0JaWYgKFBhZ2VTd2FwQmFja2VkKHBhZ2UpKSB7CisJaWYgKCFQYWdlU3dhcENhY2hlKHBhZ2UpICYmIFBhZ2VTd2FwQmFja2VkKHBhZ2UpKSB7CiAJCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9TSE1FTSk7CiAJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShuZXdwYWdlLCBOUl9TSE1FTSk7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IGJiZGM5YWYuLmE2NWVmZDQgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTEyMiw5ICsxMjIsMTcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoc3lzY3RsX292ZXJjb21taXRfbWVtb3J5ID09IE9WRVJDT01NSVRfR1VFU1MpIHsKLQkJdW5zaWduZWQgbG9uZyBuOworCQlmcmVlID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRlJFRV9QQUdFUyk7CisJCWZyZWUgKz0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9QQUdFUyk7CiAKLQkJZnJlZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfUEFHRVMpOworCQkvKgorCQkgKiBzaG1lbSBwYWdlcyBzaG91bGRuJ3QgYmUgY291bnRlZCBhcyBmcmVlIGluIHRoaXMKKwkJICogY2FzZSwgdGhleSBjYW4ndCBiZSBwdXJnZWQsIG9ubHkgc3dhcHBlZCBvdXQsIGFuZAorCQkgKiB0aGF0IHdvbid0IGFmZmVjdCB0aGUgb3ZlcmFsbCBhbW91bnQgb2YgYXZhaWxhYmxlCisJCSAqIG1lbW9yeSBpbiB0aGUgc3lzdGVtLgorCQkgKi8KKwkJZnJlZSAtPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9TSE1FTSk7CisKIAkJZnJlZSArPSBucl9zd2FwX3BhZ2VzOwogCiAJCS8qCkBAIC0xMzYsNiArMTQ0LDE0IEBACiAJCWZyZWUgKz0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0xBQl9SRUNMQUlNQUJMRSk7CiAKIAkJLyoKKwkJICogTGVhdmUgcmVzZXJ2ZWQgcGFnZXMuIFRoZSBwYWdlcyBhcmUgbm90IGZvciBhbm9ueW1vdXMgcGFnZXMuCisJCSAqLworCQlpZiAoZnJlZSA8PSB0b3RhbHJlc2VydmVfcGFnZXMpCisJCQlnb3RvIGVycm9yOworCQllbHNlCisJCQlmcmVlIC09IHRvdGFscmVzZXJ2ZV9wYWdlczsKKworCQkvKgogCQkgKiBMZWF2ZSB0aGUgbGFzdCAzJSBmb3Igcm9vdAogCQkgKi8KIAkJaWYgKCFjYXBfc3lzX2FkbWluKQpAQCAtMTQ0LDMwICsxNjAsNiBAQAogCQlpZiAoZnJlZSA+IHBhZ2VzKQogCQkJcmV0dXJuIDA7CiAKLQkJLyoKLQkJICogbnJfZnJlZV9wYWdlcygpIGlzIHZlcnkgZXhwZW5zaXZlIG9uIGxhcmdlIHN5c3RlbXMsCi0JCSAqIG9ubHkgY2FsbCBpZiB3ZSdyZSBhYm91dCB0byBmYWlsLgotCQkgKi8KLQkJbiA9IG5yX2ZyZWVfcGFnZXMoKTsKLQotCQkvKgotCQkgKiBMZWF2ZSByZXNlcnZlZCBwYWdlcy4gVGhlIHBhZ2VzIGFyZSBub3QgZm9yIGFub255bW91cyBwYWdlcy4KLQkJICovCi0JCWlmIChuIDw9IHRvdGFscmVzZXJ2ZV9wYWdlcykKLQkJCWdvdG8gZXJyb3I7Ci0JCWVsc2UKLQkJCW4gLT0gdG90YWxyZXNlcnZlX3BhZ2VzOwotCi0JCS8qCi0JCSAqIExlYXZlIHRoZSBsYXN0IDMlIGZvciByb290Ci0JCSAqLwotCQlpZiAoIWNhcF9zeXNfYWRtaW4pCi0JCQluIC09IG4gLyAzMjsKLQkJZnJlZSArPSBuOwotCi0JCWlmIChmcmVlID4gcGFnZXMpCi0JCQlyZXR1cm4gMDsKLQogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtOTA2LDE0ICs4OTgsNyBAQAogCWlmIChhbm9uX3ZtYSkKIAkJcmV0dXJuIGFub25fdm1hOwogdHJ5X3ByZXY6Ci0JLyoKLQkgKiBJdCBpcyBwb3RlbnRpYWxseSBzbG93IHRvIGhhdmUgdG8gY2FsbCBmaW5kX3ZtYV9wcmV2IGhlcmUuCi0JICogQnV0IGl0J3Mgb25seSBvbiB0aGUgZmlyc3Qgd3JpdGUgZmF1bHQgb24gdGhlIHZtYSwgbm90Ci0JICogZXZlcnkgdGltZSwgYW5kIHdlIGNvdWxkIGRldmlzZSBhIHdheSB0byBhdm9pZCBpdCBsYXRlcgotCSAqIChlLmcuIHN0YXNoIGluZm8gaW4gbmV4dCdzIGFub25fdm1hX25vZGUgd2hlbiBhc3NpZ25pbmcKLQkgKiBhbiBhbm9uX3ZtYSwgb3Igd2hlbiB0cnlpbmcgdm1hX21lcmdlKS4gIEFub3RoZXIgdGltZS4KLQkgKi8KLQlCVUdfT04oZmluZF92bWFfcHJldih2bWEtPnZtX21tLCB2bWEtPnZtX3N0YXJ0LCAmbmVhcikgIT0gdm1hKTsKKwluZWFyID0gdm1hLT52bV9wcmV2OwogCWlmICghbmVhcikKIAkJZ290byBub25lOwogCkBAIC0yMDQ0LDkgKzIwMjksMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBGaW5kIHRoZSBmaXJzdCBvdmVybGFwcGluZyBWTUEgKi8KLQl2bWEgPSBmaW5kX3ZtYV9wcmV2KG1tLCBzdGFydCwgJnByZXYpOworCXZtYSA9IGZpbmRfdm1hKG1tLCBzdGFydCk7CiAJaWYgKCF2bWEpCiAJCXJldHVybiAwOworCXByZXYgPSB2bWEtPnZtX3ByZXY7CiAJLyogd2UgaGF2ZSAgc3RhcnQgPCB2bWEtPnZtX2VuZCAgKi8KIAogCS8qIGlmIGl0IGRvZXNuJ3Qgb3ZlcmxhcCwgd2UgaGF2ZSBub3RoaW5nLi4gKi8KZGlmZiAtLWdpdCBhL21tL25vbW11LmMgYi9tbS9ub21tdS5jCmluZGV4IDFmZDBjNTEuLjQzNTgwMzIgMTAwNjQ0Ci0tLSBhL21tL25vbW11LmMKKysrIGIvbW0vbm9tbXUuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KQEAgLTEwODcsNyArMTA4Niw3IEBACiAJICogaXQncyBiZWluZyB0cmFjZWQgLSBvdGhlcndpc2UgYnJlYWtwb2ludHMgc2V0IGluIGl0IG1heSBpbnRlcmZlcmUKIAkgKiB3aXRoIGFub3RoZXIgdW50cmFjZWQgcHJvY2VzcwogCSAqLwotCWlmICgoZmxhZ3MgJiBNQVBfUFJJVkFURSkgJiYgdHJhY2Vob29rX2V4cGVjdF9icmVha3BvaW50cyhjdXJyZW50KSkKKwlpZiAoKGZsYWdzICYgTUFQX1BSSVZBVEUpICYmIGN1cnJlbnQtPnB0cmFjZSkKIAkJdm1fZmxhZ3MgJj0gflZNX01BWVNIQVJFOwogCiAJcmV0dXJuIHZtX2ZsYWdzOwpAQCAtMTgxMywxMCArMTgxMiwxMyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgcmVtYXBfcGZuX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGZyb20sCi0JCXVuc2lnbmVkIGxvbmcgdG8sIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3QgcHJvdCkKK2ludCByZW1hcF9wZm5fcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3QgcHJvdCkKIHsKLQl2bWEtPnZtX3N0YXJ0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCWlmIChhZGRyICE9IChwZm4gPDwgUEFHRV9TSElGVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEIHwgVk1fUEZOTUFQOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChyZW1hcF9wZm5fcmFuZ2UpOwpAQCAtMTg4Miw5ICsxODg0LDE3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKHN5c2N0bF9vdmVyY29tbWl0X21lbW9yeSA9PSBPVkVSQ09NTUlUX0dVRVNTKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbjsKKwkJZnJlZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZSRUVfUEFHRVMpOworCQlmcmVlICs9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfUEFHRVMpOwogCi0JCWZyZWUgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX1BBR0VTKTsKKwkJLyoKKwkJICogc2htZW0gcGFnZXMgc2hvdWxkbid0IGJlIGNvdW50ZWQgYXMgZnJlZSBpbiB0aGlzCisJCSAqIGNhc2UsIHRoZXkgY2FuJ3QgYmUgcHVyZ2VkLCBvbmx5IHN3YXBwZWQgb3V0LCBhbmQKKwkJICogdGhhdCB3b24ndCBhZmZlY3QgdGhlIG92ZXJhbGwgYW1vdW50IG9mIGF2YWlsYWJsZQorCQkgKiBtZW1vcnkgaW4gdGhlIHN5c3RlbS4KKwkJICovCisJCWZyZWUgLT0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0hNRU0pOworCiAJCWZyZWUgKz0gbnJfc3dhcF9wYWdlczsKIAogCQkvKgpAQCAtMTg5Niw2ICsxOTA2LDE0IEBACiAJCWZyZWUgKz0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0xBQl9SRUNMQUlNQUJMRSk7CiAKIAkJLyoKKwkJICogTGVhdmUgcmVzZXJ2ZWQgcGFnZXMuIFRoZSBwYWdlcyBhcmUgbm90IGZvciBhbm9ueW1vdXMgcGFnZXMuCisJCSAqLworCQlpZiAoZnJlZSA8PSB0b3RhbHJlc2VydmVfcGFnZXMpCisJCQlnb3RvIGVycm9yOworCQllbHNlCisJCQlmcmVlIC09IHRvdGFscmVzZXJ2ZV9wYWdlczsKKworCQkvKgogCQkgKiBMZWF2ZSB0aGUgbGFzdCAzJSBmb3Igcm9vdAogCQkgKi8KIAkJaWYgKCFjYXBfc3lzX2FkbWluKQpAQCAtMTkwNCwzMCArMTkyMiw2IEBACiAJCWlmIChmcmVlID4gcGFnZXMpCiAJCQlyZXR1cm4gMDsKIAotCQkvKgotCQkgKiBucl9mcmVlX3BhZ2VzKCkgaXMgdmVyeSBleHBlbnNpdmUgb24gbGFyZ2Ugc3lzdGVtcywKLQkJICogb25seSBjYWxsIGlmIHdlJ3JlIGFib3V0IHRvIGZhaWwuCi0JCSAqLwotCQluID0gbnJfZnJlZV9wYWdlcygpOwotCi0JCS8qCi0JCSAqIExlYXZlIHJlc2VydmVkIHBhZ2VzLiBUaGUgcGFnZXMgYXJlIG5vdCBmb3IgYW5vbnltb3VzIHBhZ2VzLgotCQkgKi8KLQkJaWYgKG4gPD0gdG90YWxyZXNlcnZlX3BhZ2VzKQotCQkJZ290byBlcnJvcjsKLQkJZWxzZQotCQkJbiAtPSB0b3RhbHJlc2VydmVfcGFnZXM7Ci0KLQkJLyoKLQkJICogTGVhdmUgdGhlIGxhc3QgMyUgZm9yIHJvb3QKLQkJICovCi0JCWlmICghY2FwX3N5c19hZG1pbikKLQkJCW4gLT0gbiAvIDMyOwotCQlmcmVlICs9IG47Ci0KLQkJaWYgKGZyZWUgPiBwYWdlcykKLQkJCXJldHVybiAwOwotCiAJCWdvdG8gZXJyb3I7CiAJfQogCmRpZmYgLS1naXQgYS9tbS9vb21fa2lsbC5jIGIvbW0vb29tX2tpbGwuYwppbmRleCBlNGIwOTkxLi5lYWZmZjg5IDEwMDY0NAotLS0gYS9tbS9vb21fa2lsbC5jCisrKyBiL21tL29vbV9raWxsLmMKQEAgLTMzOSw4ICszMzksNyBAQAogCQkJCSAqIHRoZW4gd2FpdCBmb3IgaXQgdG8gZmluaXNoIGJlZm9yZSBraWxsaW5nCiAJCQkJICogc29tZSBvdGhlciB0YXNrIHVubmVjZXNzYXJpbHkuCiAJCQkJICovCi0JCQkJaWYgKCEodGFza19wdHJhY2UocC0+Z3JvdXBfbGVhZGVyKSAmCi0JCQkJCQkJUFRfVFJBQ0VfRVhJVCkpCisJCQkJaWYgKCEocC0+Z3JvdXBfbGVhZGVyLT5wdHJhY2UgJiBQVF9UUkFDRV9FWElUKSkKIAkJCQkJcmV0dXJuIEVSUl9QVFIoLTFVTCk7CiAJCQl9CiAJCX0KQEAgLTQ4OCw3ICs0ODcsNyBAQAogCiAJLyoKIAkgKiBJZiBhbnkgb2YgcCdzIGNoaWxkcmVuIGhhcyBhIGRpZmZlcmVudCBtbSBhbmQgaXMgZWxpZ2libGUgZm9yIGtpbGwsCi0JICogdGhlIG9uZSB3aXRoIHRoZSBoaWdoZXN0IGJhZG5lc3MoKSBzY29yZSBpcyBzYWNyaWZpY2VkIGZvciBpdHMKKwkgKiB0aGUgb25lIHdpdGggdGhlIGhpZ2hlc3Qgb29tX2JhZG5lc3MoKSBzY29yZSBpcyBzYWNyaWZpY2VkIGZvciBpdHMKIAkgKiBwYXJlbnQuICBUaGlzIGF0dGVtcHRzIHRvIGxvc2UgdGhlIG1pbmltYWwgYW1vdW50IG9mIHdvcmsgZG9uZSB3aGlsZQogCSAqIHN0aWxsIGZyZWVpbmcgbWVtb3J5LgogCSAqLwpkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggMzFmNjk4OC4uZDg3NjdiMyAxMDA2NDQKLS0tIGEvbW0vcGFnZS13cml0ZWJhY2suYworKysgYi9tbS9wYWdlLXdyaXRlYmFjay5jCkBAIC0xMTQxLDcgKzExNDEsNiBAQAogdm9pZCBhY2NvdW50X3BhZ2Vfd3JpdGViYWNrKHN0cnVjdCBwYWdlICpwYWdlKQogewogCWluY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfV1JJVEVCQUNLKTsKLQlpbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX1dSSVRURU4pOwogfQogRVhQT1JUX1NZTUJPTChhY2NvdW50X3BhZ2Vfd3JpdGViYWNrKTsKIApAQCAtMTM1OCw4ICsxMzU3LDEwIEBACiAJfSBlbHNlIHsKIAkJcmV0ID0gVGVzdENsZWFyUGFnZVdyaXRlYmFjayhwYWdlKTsKIAl9Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CiAJCWRlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfV1JJVEVCQUNLKTsKKwkJaW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9XUklUVEVOKTsKKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQwNSwxMCArMTQwNiw2IEBACiAgKi8KIGludCBtYXBwaW5nX3RhZ2dlZChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgaW50IHRhZykKIHsKLQlpbnQgcmV0OwotCXJjdV9yZWFkX2xvY2soKTsKLQlyZXQgPSByYWRpeF90cmVlX3RhZ2dlZCgmbWFwcGluZy0+cGFnZV90cmVlLCB0YWcpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHJhZGl4X3RyZWVfdGFnZ2VkKCZtYXBwaW5nLT5wYWdlX3RyZWUsIHRhZyk7CiB9CiBFWFBPUlRfU1lNQk9MKG1hcHBpbmdfdGFnZ2VkKTsKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCA0ZTg5ODVhLi4wOTQ0NzIzIDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC0xNjE2LDYgKzE2MTYsMjEgQEAKIAlzZXRfYml0KGksIHpsYy0+ZnVsbHpvbmVzKTsKIH0KIAorLyoKKyAqIGNsZWFyIGFsbCB6b25lcyBmdWxsLCBjYWxsZWQgYWZ0ZXIgZGlyZWN0IHJlY2xhaW0gbWFrZXMgcHJvZ3Jlc3Mgc28gdGhhdAorICogYSB6b25lIHRoYXQgd2FzIHJlY2VudGx5IGZ1bGwgaXMgbm90IHNraXBwZWQgb3ZlciBmb3IgdXAgdG8gYSBzZWNvbmQKKyAqLworc3RhdGljIHZvaWQgemxjX2NsZWFyX3pvbmVzX2Z1bGwoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCkKK3sKKwlzdHJ1Y3Qgem9uZWxpc3RfY2FjaGUgKnpsYzsJLyogY2FjaGVkIHpvbmVsaXN0IHNwZWVkdXAgaW5mbyAqLworCisJemxjID0gem9uZWxpc3QtPnpsY2FjaGVfcHRyOworCWlmICghemxjKQorCQlyZXR1cm47CisKKwliaXRtYXBfemVybyh6bGMtPmZ1bGx6b25lcywgTUFYX1pPTkVTX1BFUl9aT05FTElTVCk7Cit9CisKICNlbHNlCS8qIENPTkZJR19OVU1BICovCiAKIHN0YXRpYyBub2RlbWFza190ICp6bGNfc2V0dXAoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgaW50IGFsbG9jX2ZsYWdzKQpAQCAtMTYzMiw2ICsxNjQ3LDEwIEBACiBzdGF0aWMgdm9pZCB6bGNfbWFya196b25lX2Z1bGwoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgc3RydWN0IHpvbmVyZWYgKnopCiB7CiB9CisKK3N0YXRpYyB2b2lkIHpsY19jbGVhcl96b25lc19mdWxsKHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QpCit7Cit9CiAjZW5kaWYJLyogQ09ORklHX05VTUEgKi8KIAogLyoKQEAgLTE2NjQsNyArMTY4Myw3IEBACiAJCQkJY29udGludWU7CiAJCWlmICgoYWxsb2NfZmxhZ3MgJiBBTExPQ19DUFVTRVQpICYmCiAJCQkhY3B1c2V0X3pvbmVfYWxsb3dlZF9zb2Z0d2FsbCh6b25lLCBnZnBfbWFzaykpCi0JCQkJZ290byB0cnlfbmV4dF96b25lOworCQkJCWNvbnRpbnVlOwogCiAJCUJVSUxEX0JVR19PTihBTExPQ19OT19XQVRFUk1BUktTIDwgTlJfV01BUkspOwogCQlpZiAoIShhbGxvY19mbGFncyAmIEFMTE9DX05PX1dBVEVSTUFSS1MpKSB7CkBAIC0xNjc2LDE3ICsxNjk1LDM2IEBACiAJCQkJICAgIGNsYXNzem9uZV9pZHgsIGFsbG9jX2ZsYWdzKSkKIAkJCQlnb3RvIHRyeV90aGlzX3pvbmU7CiAKKwkJCWlmIChOVU1BX0JVSUxEICYmICFkaWRfemxjX3NldHVwICYmIG5yX29ubGluZV9ub2RlcyA+IDEpIHsKKwkJCQkvKgorCQkJCSAqIHdlIGRvIHpsY19zZXR1cCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgbm9kZXMKKwkJCQkgKiBhbmQgYmVmb3JlIGNvbnNpZGVyaW5nIHRoZSBmaXJzdCB6b25lIGFsbG93ZWQKKwkJCQkgKiBieSB0aGUgY3B1c2V0LgorCQkJCSAqLworCQkJCWFsbG93ZWRub2RlcyA9IHpsY19zZXR1cCh6b25lbGlzdCwgYWxsb2NfZmxhZ3MpOworCQkJCXpsY19hY3RpdmUgPSAxOworCQkJCWRpZF96bGNfc2V0dXAgPSAxOworCQkJfQorCiAJCQlpZiAoem9uZV9yZWNsYWltX21vZGUgPT0gMCkKIAkJCQlnb3RvIHRoaXNfem9uZV9mdWxsOwogCisJCQkvKgorCQkJICogQXMgd2UgbWF5IGhhdmUganVzdCBhY3RpdmF0ZWQgWkxDLCBjaGVjayBpZiB0aGUgZmlyc3QKKwkJCSAqIGVsaWdpYmxlIHpvbmUgaGFzIGZhaWxlZCB6b25lX3JlY2xhaW0gcmVjZW50bHkuCisJCQkgKi8KKwkJCWlmIChOVU1BX0JVSUxEICYmIHpsY19hY3RpdmUgJiYKKwkJCQkhemxjX3pvbmVfd29ydGhfdHJ5aW5nKHpvbmVsaXN0LCB6LCBhbGxvd2Vkbm9kZXMpKQorCQkJCWNvbnRpbnVlOworCiAJCQlyZXQgPSB6b25lX3JlY2xhaW0oem9uZSwgZ2ZwX21hc2ssIG9yZGVyKTsKIAkJCXN3aXRjaCAocmV0KSB7CiAJCQljYXNlIFpPTkVfUkVDTEFJTV9OT1NDQU46CiAJCQkJLyogZGlkIG5vdCBzY2FuICovCi0JCQkJZ290byB0cnlfbmV4dF96b25lOworCQkJCWNvbnRpbnVlOwogCQkJY2FzZSBaT05FX1JFQ0xBSU1fRlVMTDoKIAkJCQkvKiBzY2FubmVkIGJ1dCB1bnJlY2xhaW1hYmxlICovCi0JCQkJZ290byB0aGlzX3pvbmVfZnVsbDsKKwkJCQljb250aW51ZTsKIAkJCWRlZmF1bHQ6CiAJCQkJLyogZGlkIHdlIHJlY2xhaW0gZW5vdWdoICovCiAJCQkJaWYgKCF6b25lX3dhdGVybWFya19vayh6b25lLCBvcmRlciwgbWFyaywKQEAgLTE3MDMsMTYgKzE3NDEsNiBAQAogdGhpc196b25lX2Z1bGw6CiAJCWlmIChOVU1BX0JVSUxEKQogCQkJemxjX21hcmtfem9uZV9mdWxsKHpvbmVsaXN0LCB6KTsKLXRyeV9uZXh0X3pvbmU6Ci0JCWlmIChOVU1BX0JVSUxEICYmICFkaWRfemxjX3NldHVwICYmIG5yX29ubGluZV9ub2RlcyA+IDEpIHsKLQkJCS8qCi0JCQkgKiB3ZSBkbyB6bGNfc2V0dXAgYWZ0ZXIgdGhlIGZpcnN0IHpvbmUgaXMgdHJpZWQgYnV0IG9ubHkKLQkJCSAqIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBub2RlcyBtYWtlIGl0IHdvcnRod2hpbGUKLQkJCSAqLwotCQkJYWxsb3dlZG5vZGVzID0gemxjX3NldHVwKHpvbmVsaXN0LCBhbGxvY19mbGFncyk7Ci0JCQl6bGNfYWN0aXZlID0gMTsKLQkJCWRpZF96bGNfc2V0dXAgPSAxOwotCQl9CiAJfQogCiAJaWYgKHVubGlrZWx5KE5VTUFfQlVJTEQgJiYgcGFnZSA9PSBOVUxMICYmIHpsY19hY3RpdmUpKSB7CkBAIC0xOTU0LDYgKzE5ODIsMTAgQEAKIAlpZiAodW5saWtlbHkoISgqZGlkX3NvbWVfcHJvZ3Jlc3MpKSkKIAkJcmV0dXJuIE5VTEw7CiAKKwkvKiBBZnRlciBzdWNjZXNzZnVsIHJlY2xhaW0sIHJlY29uc2lkZXIgYWxsIHpvbmVzIGZvciBhbGxvY2F0aW9uICovCisJaWYgKE5VTUFfQlVJTEQpCisJCXpsY19jbGVhcl96b25lc19mdWxsKHpvbmVsaXN0KTsKKwogcmV0cnk6CiAJcGFnZSA9IGdldF9wYWdlX2Zyb21fZnJlZWxpc3QoZ2ZwX21hc2ssIG5vZGVtYXNrLCBvcmRlciwKIAkJCQkJem9uZWxpc3QsIGhpZ2hfem9uZWlkeCwKQEAgLTQ1ODUsNiArNDYxNyw2MCBAQAogCQkJY21wX25vZGVfYWN0aXZlX3JlZ2lvbiwgTlVMTCk7CiB9CiAKKy8qKgorICogbm9kZV9tYXBfcGZuX2FsaWdubWVudCAtIGRldGVybWluZSB0aGUgbWF4aW11bSBpbnRlcm5vZGUgYWxpZ25tZW50CisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIG5vZGUgbWFwIGlzIHBvcHVsYXRlZCBhbmQgc29ydGVkLgorICogSXQgY2FsY3VsYXRlcyB0aGUgbWF4aW11bSBwb3dlciBvZiB0d28gYWxpZ25tZW50IHdoaWNoIGNhbiBkaXN0aW5ndWlzaAorICogYWxsIHRoZSBub2Rlcy4KKyAqCisgKiBGb3IgZXhhbXBsZSwgaWYgYWxsIG5vZGVzIGFyZSAxR2lCIGFuZCBhbGlnbmVkIHRvIDFHaUIsIHRoZSByZXR1cm4gdmFsdWUKKyAqIHdvdWxkIGluZGljYXRlIDFHaUIgYWxpZ25tZW50IHdpdGggKDEgPDwgKDMwIC0gUEFHRV9TSElGVCkpLiAgSWYgdGhlCisgKiBub2RlcyBhcmUgc2hpZnRlZCBieSAyNTZNaUIsIDI1Nk1pQi4gIE5vdGUgdGhhdCBpZiBvbmx5IHRoZSBsYXN0IG5vZGUgaXMKKyAqIHNoaWZ0ZWQsIDFHaUIgaXMgZW5vdWdoIGFuZCB0aGlzIGZ1bmN0aW9uIHdpbGwgaW5kaWNhdGUgc28uCisgKgorICogVGhpcyBpcyB1c2VkIHRvIHRlc3Qgd2hldGhlciBwZm4gLT4gbmlkIG1hcHBpbmcgb2YgdGhlIGNob3NlbiBtZW1vcnkKKyAqIG1vZGVsIGhhcyBmaW5lIGVub3VnaCBncmFudWxhcml0eSB0byBhdm9pZCBpbmNvcnJlY3QgbWFwcGluZyBmb3IgdGhlCisgKiBwb3B1bGF0ZWQgbm9kZSBtYXAuCisgKgorICogUmV0dXJucyB0aGUgZGV0ZXJtaW5lZCBhbGlnbm1lbnQgaW4gcGZuJ3MuICAwIGlmIHRoZXJlIGlzIG5vIGFsaWdubWVudAorICogcmVxdWlyZW1lbnQgKHNpbmdsZSBub2RlKS4KKyAqLwordW5zaWduZWQgbG9uZyBfX2luaXQgbm9kZV9tYXBfcGZuX2FsaWdubWVudCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYWNjbF9tYXNrID0gMCwgbGFzdF9lbmQgPSAwOworCWludCBsYXN0X25pZCA9IC0xOworCWludCBpOworCisJZm9yX2VhY2hfYWN0aXZlX3JhbmdlX2luZGV4X2luX25pZChpLCBNQVhfTlVNTk9ERVMpIHsKKwkJaW50IG5pZCA9IGVhcmx5X25vZGVfbWFwW2ldLm5pZDsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCA9IGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbjsKKwkJdW5zaWduZWQgbG9uZyBlbmQgPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuOworCQl1bnNpZ25lZCBsb25nIG1hc2s7CisKKwkJaWYgKCFzdGFydCB8fCBsYXN0X25pZCA8IDAgfHwgbGFzdF9uaWQgPT0gbmlkKSB7CisJCQlsYXN0X25pZCA9IG5pZDsKKwkJCWxhc3RfZW5kID0gZW5kOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBTdGFydCB3aXRoIGEgbWFzayBncmFudWxhciBlbm91Z2ggdG8gcGluLXBvaW50IHRvIHRoZQorCQkgKiBzdGFydCBwZm4gYW5kIHRpY2sgb2ZmIGJpdHMgb25lLWJ5LW9uZSB1bnRpbCBpdCBiZWNvbWVzCisJCSAqIHRvbyBjb2Fyc2UgdG8gc2VwYXJhdGUgdGhlIGN1cnJlbnQgbm9kZSBmcm9tIHRoZSBsYXN0LgorCQkgKi8KKwkJbWFzayA9IH4oKDEgPDwgX19mZnMoc3RhcnQpKSAtIDEpOworCQl3aGlsZSAobWFzayAmJiBsYXN0X2VuZCA8PSAoc3RhcnQgJiAobWFzayA8PCAxKSkpCisJCQltYXNrIDw8PSAxOworCisJCS8qIGFjY3VtdWxhdGUgYWxsIGludGVybm9kZSBtYXNrcyAqLworCQlhY2NsX21hc2sgfD0gbWFzazsKKwl9CisKKwkvKiBjb252ZXJ0IG1hc2sgdG8gbnVtYmVyIG9mIHBhZ2VzICovCisJcmV0dXJuIH5hY2NsX21hc2sgKyAxOworfQorCiAvKiBGaW5kIHRoZSBsb3dlc3QgcGZuIGZvciBhIG5vZGUgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBmaW5kX21pbl9wZm5fZm9yX25vZGUoaW50IG5pZCkKIHsKZGlmZiAtLWdpdCBhL21tL3BhZ2VfY2dyb3VwLmMgYi9tbS9wYWdlX2Nncm91cC5jCmluZGV4IDc0Y2NmZjYuLjM5ZDIxNmQgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfY2dyb3VwLmMKKysrIGIvbW0vcGFnZV9jZ3JvdXAuYwpAQCAtMTYyLDEzICsxNjIsMTMgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IF9fbWVtaW5pdCBpbml0X3NlY3Rpb25fcGFnZV9jZ3JvdXAodW5zaWduZWQgbG9uZyBwZm4pCitzdGF0aWMgaW50IF9fbWVtaW5pdCBpbml0X3NlY3Rpb25fcGFnZV9jZ3JvdXAodW5zaWduZWQgbG9uZyBwZm4sIGludCBuaWQpCiB7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpiYXNlLCAqcGM7CiAJc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uOwogCXVuc2lnbmVkIGxvbmcgdGFibGVfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIG5yOwotCWludCBuaWQsIGluZGV4OworCWludCBpbmRleDsKIAogCW5yID0gcGZuX3RvX3NlY3Rpb25fbnIocGZuKTsKIAlzZWN0aW9uID0gX19ucl90b19zZWN0aW9uKG5yKTsKQEAgLTE3Niw3ICsxNzYsNiBAQAogCWlmIChzZWN0aW9uLT5wYWdlX2Nncm91cCkKIAkJcmV0dXJuIDA7CiAKLQluaWQgPSBwYWdlX3RvX25pZChwZm5fdG9fcGFnZShwZm4pKTsKIAl0YWJsZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBwYWdlX2Nncm91cCkgKiBQQUdFU19QRVJfU0VDVElPTjsKIAliYXNlID0gYWxsb2NfcGFnZV9jZ3JvdXAodGFibGVfc2l6ZSwgbmlkKTsKIApAQCAtMTk2LDcgKzE5NSwxMSBAQAogCQlwYyA9IGJhc2UgKyBpbmRleDsKIAkJaW5pdF9wYWdlX2Nncm91cChwYywgbnIpOwogCX0KLQorCS8qCisJICogVGhlIHBhc3NlZCAicGZuIiBtYXkgbm90IGJlIGFsaWduZWQgdG8gU0VDVElPTi4gIEZvciB0aGUgY2FsY3VsYXRpb24KKwkgKiB3ZSBuZWVkIHRvIGFwcGx5IGEgbWFzay4KKwkgKi8KKwlwZm4gJj0gUEFHRV9TRUNUSU9OX01BU0s7CiAJc2VjdGlvbi0+cGFnZV9jZ3JvdXAgPSBiYXNlIC0gcGZuOwogCXRvdGFsX3VzYWdlICs9IHRhYmxlX3NpemU7CiAJcmV0dXJuIDA7CkBAIC0yMjIsMTMgKzIyNSwyMyBAQAogCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZCwgcGZuOwogCWludCBmYWlsID0gMDsKIAotCXN0YXJ0ID0gc3RhcnRfcGZuICYgfihQQUdFU19QRVJfU0VDVElPTiAtIDEpOwotCWVuZCA9IEFMSUdOKHN0YXJ0X3BmbiArIG5yX3BhZ2VzLCBQQUdFU19QRVJfU0VDVElPTik7CisJc3RhcnQgPSBTRUNUSU9OX0FMSUdOX0RPV04oc3RhcnRfcGZuKTsKKwllbmQgPSBTRUNUSU9OX0FMSUdOX1VQKHN0YXJ0X3BmbiArIG5yX3BhZ2VzKTsKKworCWlmIChuaWQgPT0gLTEpIHsKKwkJLyoKKwkJICogSW4gdGhpcyBjYXNlLCAibmlkIiBhbHJlYWR5IGV4aXN0cyBhbmQgY29udGFpbnMgdmFsaWQgbWVtb3J5LgorCQkgKiAic3RhcnRfcGZuIiBwYXNzZWQgdG8gdXMgaXMgYSBwZm4gd2hpY2ggaXMgYW4gYXJnIGZvcgorCQkgKiBvbmxpbmVfX3BhZ2VzKCksIGFuZCBzdGFydF9wZm4gc2hvdWxkIGV4aXN0LgorCQkgKi8KKwkJbmlkID0gcGZuX3RvX25pZChzdGFydF9wZm4pOworCQlWTV9CVUdfT04oIW5vZGVfc3RhdGUobmlkLCBOX09OTElORSkpOworCX0KIAogCWZvciAocGZuID0gc3RhcnQ7ICFmYWlsICYmIHBmbiA8IGVuZDsgcGZuICs9IFBBR0VTX1BFUl9TRUNUSU9OKSB7CiAJCWlmICghcGZuX3ByZXNlbnQocGZuKSkKIAkJCWNvbnRpbnVlOwotCQlmYWlsID0gaW5pdF9zZWN0aW9uX3BhZ2VfY2dyb3VwKHBmbik7CisJCWZhaWwgPSBpbml0X3NlY3Rpb25fcGFnZV9jZ3JvdXAocGZuLCBuaWQpOwogCX0KIAlpZiAoIWZhaWwpCiAJCXJldHVybiAwOwpAQCAtMjQ1LDggKzI1OCw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kLCBwZm47CiAKLQlzdGFydCA9IHN0YXJ0X3BmbiAmIH4oUEFHRVNfUEVSX1NFQ1RJT04gLSAxKTsKLQllbmQgPSBBTElHTihzdGFydF9wZm4gKyBucl9wYWdlcywgUEFHRVNfUEVSX1NFQ1RJT04pOworCXN0YXJ0ID0gU0VDVElPTl9BTElHTl9ET1dOKHN0YXJ0X3Bmbik7CisJZW5kID0gU0VDVElPTl9BTElHTl9VUChzdGFydF9wZm4gKyBucl9wYWdlcyk7CiAKIAlmb3IgKHBmbiA9IHN0YXJ0OyBwZm4gPCBlbmQ7IHBmbiArPSBQQUdFU19QRVJfU0VDVElPTikKIAkJX19mcmVlX3BhZ2VfY2dyb3VwKHBmbik7CkBAIC0yODQsMjUgKzI5Nyw0NyBAQAogdm9pZCBfX2luaXQgcGFnZV9jZ3JvdXBfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgcGZuOwotCWludCBmYWlsID0gMDsKKwlpbnQgbmlkOwogCiAJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuOwogCi0JZm9yIChwZm4gPSAwOyAhZmFpbCAmJiBwZm4gPCBtYXhfcGZuOyBwZm4gKz0gUEFHRVNfUEVSX1NFQ1RJT04pIHsKLQkJaWYgKCFwZm5fcHJlc2VudChwZm4pKQotCQkJY29udGludWU7Ci0JCWZhaWwgPSBpbml0X3NlY3Rpb25fcGFnZV9jZ3JvdXAocGZuKTsKKwlmb3JfZWFjaF9ub2RlX3N0YXRlKG5pZCwgTl9ISUdIX01FTU9SWSkgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKKworCQlzdGFydF9wZm4gPSBub2RlX3N0YXJ0X3BmbihuaWQpOworCQllbmRfcGZuID0gbm9kZV9lbmRfcGZuKG5pZCk7CisJCS8qCisJCSAqIHN0YXJ0X3BmbiBhbmQgZW5kX3BmbiBtYXkgbm90IGJlIGFsaWduZWQgdG8gU0VDVElPTiBhbmQgdGhlCisJCSAqIHBhZ2UtPmZsYWdzIG9mIG91dCBvZiBub2RlIHBhZ2VzIGFyZSBub3QgaW5pdGlhbGl6ZWQuICBTbyB3ZQorCQkgKiBzY2FuIFtzdGFydF9wZm4sIHRoZSBiaWdnZXN0IHNlY3Rpb24ncyBwZm4gPCBlbmRfcGZuKSBoZXJlLgorCQkgKi8KKwkJZm9yIChwZm4gPSBzdGFydF9wZm47CisJCSAgICAgcGZuIDwgZW5kX3BmbjsKKyAgICAgICAgICAgICAgICAgICAgIHBmbiA9IEFMSUdOKHBmbiArIDEsIFBBR0VTX1BFUl9TRUNUSU9OKSkgeworCisJCQlpZiAoIXBmbl92YWxpZChwZm4pKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIE5vZGVzJ3MgcGZucyBjYW4gYmUgb3ZlcmxhcHBpbmcuCisJCQkgKiBXZSBrbm93IHNvbWUgYXJjaCBjYW4gaGF2ZSBhIG5vZGVzIGxheW91dCBzdWNoIGFzCisJCQkgKiAtLS0tLS0tLS0tLS0tcGZuLS0tLS0tLS0tLS0tLS0+CisJCQkgKiBOMCB8IE4xIHwgTjIgfCBOMCB8IE4xIHwgTjJ8Li4uLgorCQkJICovCisJCQlpZiAocGZuX3RvX25pZChwZm4pICE9IG5pZCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChpbml0X3NlY3Rpb25fcGFnZV9jZ3JvdXAocGZuLCBuaWQpKQorCQkJCWdvdG8gb29tOworCQl9CiAJfQotCWlmIChmYWlsKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgInRyeSAnY2dyb3VwX2Rpc2FibGU9bWVtb3J5JyBib290IG9wdGlvblxuIik7Ci0JCXBhbmljKCJPdXQgb2YgbWVtb3J5Iik7Ci0JfSBlbHNlIHsKLQkJaG90cGx1Z19tZW1vcnlfbm90aWZpZXIocGFnZV9jZ3JvdXBfY2FsbGJhY2ssIDApOwotCX0KKwlob3RwbHVnX21lbW9yeV9ub3RpZmllcihwYWdlX2Nncm91cF9jYWxsYmFjaywgMCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiYWxsb2NhdGVkICVsZCBieXRlcyBvZiBwYWdlX2Nncm91cFxuIiwgdG90YWxfdXNhZ2UpOwotCXByaW50ayhLRVJOX0lORk8gInBsZWFzZSB0cnkgJ2Nncm91cF9kaXNhYmxlPW1lbW9yeScgb3B0aW9uIGlmIHlvdSBkb24ndCIKLQkiIHdhbnQgbWVtb3J5IGNncm91cHNcbiIpOworCXByaW50ayhLRVJOX0lORk8gInBsZWFzZSB0cnkgJ2Nncm91cF9kaXNhYmxlPW1lbW9yeScgb3B0aW9uIGlmIHlvdSAiCisJCQkgImRvbid0IHdhbnQgbWVtb3J5IGNncm91cHNcbiIpOworCXJldHVybjsKK29vbToKKwlwcmludGsoS0VSTl9DUklUICJ0cnkgJ2Nncm91cF9kaXNhYmxlPW1lbW9yeScgYm9vdCBvcHRpb25cbiIpOworCXBhbmljKCJPdXQgb2YgbWVtb3J5Iik7CiB9CiAKIHZvaWQgX19tZW1pbml0IHBnZGF0X3BhZ2VfY2dyb3VwX2luaXQoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCkKQEAgLTUwMiw3ICs1MzcsNyBAQAogbm9tZW06CiAJcHJpbnRrKEtFUk5fSU5GTyAiY291bGRuJ3QgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3Igc3dhcF9jZ3JvdXAuXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPCi0JCSJzd2FwX2Nncm91cCBjYW4gYmUgZGlzYWJsZWQgYnkgbm9zd2FwYWNjb3VudCBib290IG9wdGlvblxuIik7CisJCSJzd2FwX2Nncm91cCBjYW4gYmUgZGlzYWJsZWQgYnkgc3dhcGFjY291bnQ9MCBib290IG9wdGlvblxuIik7CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKZGlmZiAtLWdpdCBhL21tL3BhZ2V3YWxrLmMgYi9tbS9wYWdld2Fsay5jCmluZGV4IGMzNDUwZDUuLjJmNWNmMTAgMTAwNjQ0Ci0tLSBhL21tL3BhZ2V3YWxrLmMKKysrIGIvbW0vcGFnZXdhbGsuYwpAQCAtMTI2LDcgKzEyNiwzOSBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKKworc3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCogaHVnZXRsYl92bWEodW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgbW1fd2FsayAqd2FsaykKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKworCS8qIFdlIGRvbid0IG5lZWQgdm1hIGxvb2t1cCBhdCBhbGwuICovCisJaWYgKCF3YWxrLT5odWdldGxiX2VudHJ5KQorCQlyZXR1cm4gTlVMTDsKKworCVZNX0JVR19PTighcndzZW1faXNfbG9ja2VkKCZ3YWxrLT5tbS0+bW1hcF9zZW0pKTsKKwl2bWEgPSBmaW5kX3ZtYSh3YWxrLT5tbSwgYWRkcik7CisJaWYgKHZtYSAmJiB2bWEtPnZtX3N0YXJ0IDw9IGFkZHIgJiYgaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkpCisJCXJldHVybiB2bWE7CisKKwlyZXR1cm4gTlVMTDsKK30KKworI2Vsc2UgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLworc3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCogaHVnZXRsYl92bWEodW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgbW1fd2FsayAqd2FsaykKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB3YWxrX2h1Z2V0bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAorCQkJICAgICAgc3RydWN0IG1tX3dhbGsgKndhbGspCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfSFVHRVRMQl9QQUdFICovCisKKwogCiAvKioKICAqIHdhbGtfcGFnZV9yYW5nZSAtIHdhbGsgYSBtZW1vcnkgbWFwJ3MgcGFnZSB0YWJsZXMgd2l0aCBhIGNhbGxiYWNrCkBAIC0xNDQsMTEgKzE3NiwxNSBAQAogICogYXNzb2NpYXRlZCByYW5nZSwgYW5kIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgbW1fd2FsayBmb3IgYWNjZXNzIHRvCiAgKiB0aGUgLT5wcml2YXRlIG9yIC0+bW0gZmllbGRzLgogICoKLSAqIE5vIGxvY2tzIGFyZSB0YWtlbiwgYnV0IHRoZSBib3R0b20gbGV2ZWwgaXRlcmF0b3Igd2lsbCBtYXAgUFRFCisgKiBVc3VhbGx5IG5vIGxvY2tzIGFyZSB0YWtlbiwgYnV0IHNwbGl0dGluZyB0cmFuc3BhcmVudCBodWdlIHBhZ2UgbWF5CisgKiB0YWtlIHBhZ2UgdGFibGUgbG9jay4gQW5kIHRoZSBib3R0b20gbGV2ZWwgaXRlcmF0b3Igd2lsbCBtYXAgUFRFCiAgKiBkaXJlY3RvcmllcyBmcm9tIGhpZ2htZW0gaWYgbmVjZXNzYXJ5LgogICoKICAqIElmIGFueSBjYWxsYmFjayByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUsIHRoZSB3YWxrIGlzIGFib3J0ZWQgYW5kCiAgKiB0aGUgcmV0dXJuIHZhbHVlIGlzIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgY2FsbGVyLiBPdGhlcndpc2UgMCBpcyByZXR1cm5lZC4KKyAqCisgKiB3YWxrLT5tbS0+bW1hcF9zZW0gbXVzdCBiZSBoZWxkIGZvciBhdCBsZWFzdCByZWFkIGlmIHdhbGstPmh1Z2V0bGJfZW50cnkKKyAqIGlzICFOVUxMLgogICovCiBpbnQgd2Fsa19wYWdlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCiAJCSAgICBzdHJ1Y3QgbW1fd2FsayAqd2FsaykKQEAgLTE2NSwxOCArMjAxLDE3IEBACiAKIAlwZ2QgPSBwZ2Rfb2Zmc2V0KHdhbGstPm1tLCBhZGRyKTsKIAlkbyB7Ci0JCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdW5pbml0aWFsaXplZF92YXIodm1hKTsKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAKIAkJbmV4dCA9IHBnZF9hZGRyX2VuZChhZGRyLCBlbmQpOwogCi0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogCQkvKgogCQkgKiBoYW5kbGUgaHVnZXRsYiB2bWEgaW5kaXZpZHVhbGx5IGJlY2F1c2UgcGFnZXRhYmxlIHdhbGsgZm9yCiAJCSAqIHRoZSBodWdldGxiIHBhZ2UgaXMgZGVwZW5kZW50IG9uIHRoZSBhcmNoaXRlY3R1cmUgYW5kCiAJCSAqIHdlIGNhbid0IGhhbmRsZWQgaXQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIG5vbi1odWdlIHBhZ2VzLgogCQkgKi8KLQkJdm1hID0gZmluZF92bWEod2Fsay0+bW0sIGFkZHIpOwotCQlpZiAodm1hICYmIGlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKSB7CisJCXZtYSA9IGh1Z2V0bGJfdm1hKGFkZHIsIHdhbGspOworCQlpZiAodm1hKSB7CiAJCQlpZiAodm1hLT52bV9lbmQgPCBuZXh0KQogCQkJCW5leHQgPSB2bWEtPnZtX2VuZDsKIAkJCS8qCkBAIC0xODksNyArMjI0LDcgQEAKIAkJCXBnZCA9IHBnZF9vZmZzZXQod2Fsay0+bW0sIG5leHQpOwogCQkJY29udGludWU7CiAJCX0KLSNlbmRpZgorCiAJCWlmIChwZ2Rfbm9uZV9vcl9jbGVhcl9iYWQocGdkKSkgewogCQkJaWYgKHdhbGstPnB0ZV9ob2xlKQogCQkJCWVyciA9IHdhbGstPnB0ZV9ob2xlKGFkZHIsIG5leHQsIHdhbGspOwpkaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IDBlYjQ2M2UuLjk3MDE1NzQgMTAwNjQ0Ci0tLSBhL21tL3JtYXAuYworKysgYi9tbS9ybWFwLmMKQEAgLTIxLDcgKzIxLDYgQEAKICAqIExvY2sgb3JkZXJpbmcgaW4gbW06CiAgKgogICogaW5vZGUtPmlfbXV0ZXgJKHdoaWxlIHdyaXRpbmcgb3IgdHJ1bmNhdGluZywgbm90IHJlYWRpbmcgb3IgZmF1bHRpbmcpCi0gKiAgIGlub2RlLT5pX2FsbG9jX3NlbSAodm10cnVuY2F0ZV9yYW5nZSkKICAqICAgbW0tPm1tYXBfc2VtCiAgKiAgICAgcGFnZS0+ZmxhZ3MgUEdfbG9ja2VkIChsb2NrX3BhZ2UpCiAgKiAgICAgICBtYXBwaW5nLT5pX21tYXBfbXV0ZXgKQEAgLTM4LDkgKzM3LDggQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXJjaC1kZXBlbmRlbnQgZmx1c2hfZGNhY2hlX21tYXBfbG9jaywKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIGlub2RlX3diX2xpc3RfbG9jayBpbiBfX3N5bmNfc2luZ2xlX2lub2RlKQogICoKLSAqIChjb2RlIGRvZXNuJ3QgcmVseSBvbiB0aGF0IG9yZGVyIHNvIGl0IGNvdWxkIGJlIHN3aXRjaGVkIGFyb3VuZCkKLSAqIC0+dGFza2xpc3RfbG9jawotICogICBhbm9uX3ZtYS0+bXV0ZXggICAgICAobWVtb3J5X2ZhaWx1cmUsIGNvbGxlY3RfcHJvY3NfYW5vbikKKyAqIGFub25fdm1hLT5tdXRleCxtYXBwaW5nLT5pX211dGV4ICAgICAgKG1lbW9yeV9mYWlsdXJlLCBjb2xsZWN0X3Byb2NzX2Fub24pCisgKiAgIC0+dGFza2xpc3RfbG9jawogICogICAgIHB0ZSBtYXAgbG9jawogICovCiAKQEAgLTExMiw5ICsxMTAsOSBAQAogCWttZW1fY2FjaGVfZnJlZShhbm9uX3ZtYV9jYWNoZXAsIGFub25fdm1hKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgYW5vbl92bWFfY2hhaW4gKmFub25fdm1hX2NoYWluX2FsbG9jKHZvaWQpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqYW5vbl92bWFfY2hhaW5fYWxsb2MoZ2ZwX3QgZ2ZwKQogewotCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGFub25fdm1hX2NoYWluX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoYW5vbl92bWFfY2hhaW5fY2FjaGVwLCBnZnApOwogfQogCiBzdGF0aWMgdm9pZCBhbm9uX3ZtYV9jaGFpbl9mcmVlKHN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqYW5vbl92bWFfY2hhaW4pCkBAIC0xNTksNyArMTU3LDcgQEAKIAkJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOwogCQlzdHJ1Y3QgYW5vbl92bWEgKmFsbG9jYXRlZDsKIAotCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYygpOworCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYyhHRlBfS0VSTkVMKTsKIAkJaWYgKCFhdmMpCiAJCQlnb3RvIG91dF9lbm9tZW07CiAKQEAgLTIwMCw2ICsxOTgsMzIgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAorLyoKKyAqIFRoaXMgaXMgYSB1c2VmdWwgaGVscGVyIGZ1bmN0aW9uIGZvciBsb2NraW5nIHRoZSBhbm9uX3ZtYSByb290IGFzCisgKiB3ZSB0cmF2ZXJzZSB0aGUgdm1hLT5hbm9uX3ZtYV9jaGFpbiwgbG9vcGluZyBvdmVyIGFub25fdm1hJ3MgdGhhdAorICogaGF2ZSB0aGUgc2FtZSB2bWEuCisgKgorICogU3VjaCBhbm9uX3ZtYSdzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJvb3QsIHNvIHlvdSdkIGV4cGVjdCB0byBzZWUKKyAqIGp1c3QgYSBzaW5nbGUgbXV0ZXhfbG9jayBmb3IgdGhlIHdob2xlIHRyYXZlcnNhbC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYW5vbl92bWEgKmxvY2tfYW5vbl92bWFfcm9vdChzdHJ1Y3QgYW5vbl92bWEgKnJvb3QsIHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEpCit7CisJc3RydWN0IGFub25fdm1hICpuZXdfcm9vdCA9IGFub25fdm1hLT5yb290OworCWlmIChuZXdfcm9vdCAhPSByb290KSB7CisJCWlmIChXQVJOX09OX09OQ0Uocm9vdCkpCisJCQltdXRleF91bmxvY2soJnJvb3QtPm11dGV4KTsKKwkJcm9vdCA9IG5ld19yb290OworCQltdXRleF9sb2NrKCZyb290LT5tdXRleCk7CisJfQorCXJldHVybiByb290OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX2Fub25fdm1hX3Jvb3Qoc3RydWN0IGFub25fdm1hICpyb290KQoreworCWlmIChyb290KQorCQltdXRleF91bmxvY2soJnJvb3QtPm11dGV4KTsKK30KKwogc3RhdGljIHZvaWQgYW5vbl92bWFfY2hhaW5fbGluayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQlzdHJ1Y3QgYW5vbl92bWFfY2hhaW4gKmF2YywKIAkJCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hKQpAQCAtMjA4LDEzICsyMzIsMTEgQEAKIAlhdmMtPmFub25fdm1hID0gYW5vbl92bWE7CiAJbGlzdF9hZGQoJmF2Yy0+c2FtZV92bWEsICZ2bWEtPmFub25fdm1hX2NoYWluKTsKIAotCWFub25fdm1hX2xvY2soYW5vbl92bWEpOwogCS8qCiAJICogSXQncyBjcml0aWNhbCB0byBhZGQgbmV3IHZtYXMgdG8gdGhlIHRhaWwgb2YgdGhlIGFub25fdm1hLAogCSAqIHNlZSBjb21tZW50IGluIGh1Z2VfbWVtb3J5LmM6X19zcGxpdF9odWdlX3BhZ2UoKS4KIAkgKi8KIAlsaXN0X2FkZF90YWlsKCZhdmMtPnNhbWVfYW5vbl92bWEsICZhbm9uX3ZtYS0+aGVhZCk7Ci0JYW5vbl92bWFfdW5sb2NrKGFub25fdm1hKTsKIH0KIAogLyoKQEAgLTIyNCwxMyArMjQ2LDI0IEBACiBpbnQgYW5vbl92bWFfY2xvbmUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICpkc3QsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqc3JjKQogewogCXN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqYXZjLCAqcGF2YzsKKwlzdHJ1Y3QgYW5vbl92bWEgKnJvb3QgPSBOVUxMOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHBhdmMsICZzcmMtPmFub25fdm1hX2NoYWluLCBzYW1lX3ZtYSkgewotCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYygpOwotCQlpZiAoIWF2YykKLQkJCWdvdG8gZW5vbWVtX2ZhaWx1cmU7Ci0JCWFub25fdm1hX2NoYWluX2xpbmsoZHN0LCBhdmMsIHBhdmMtPmFub25fdm1hKTsKKwkJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYTsKKworCQlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYyhHRlBfTk9XQUlUIHwgX19HRlBfTk9XQVJOKTsKKwkJaWYgKHVubGlrZWx5KCFhdmMpKSB7CisJCQl1bmxvY2tfYW5vbl92bWFfcm9vdChyb290KTsKKwkJCXJvb3QgPSBOVUxMOworCQkJYXZjID0gYW5vbl92bWFfY2hhaW5fYWxsb2MoR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWF2YykKKwkJCQlnb3RvIGVub21lbV9mYWlsdXJlOworCQl9CisJCWFub25fdm1hID0gcGF2Yy0+YW5vbl92bWE7CisJCXJvb3QgPSBsb2NrX2Fub25fdm1hX3Jvb3Qocm9vdCwgYW5vbl92bWEpOworCQlhbm9uX3ZtYV9jaGFpbl9saW5rKGRzdCwgYXZjLCBhbm9uX3ZtYSk7CiAJfQorCXVubG9ja19hbm9uX3ZtYV9yb290KHJvb3QpOwogCXJldHVybiAwOwogCiAgZW5vbWVtX2ZhaWx1cmU6CkBAIC0yNjMsNyArMjk2LDcgQEAKIAlhbm9uX3ZtYSA9IGFub25fdm1hX2FsbG9jKCk7CiAJaWYgKCFhbm9uX3ZtYSkKIAkJZ290byBvdXRfZXJyb3I7Ci0JYXZjID0gYW5vbl92bWFfY2hhaW5fYWxsb2MoKTsKKwlhdmMgPSBhbm9uX3ZtYV9jaGFpbl9hbGxvYyhHRlBfS0VSTkVMKTsKIAlpZiAoIWF2YykKIAkJZ290byBvdXRfZXJyb3JfZnJlZV9hbm9uX3ZtYTsKIApAQCAtMjgwLDcgKzMxMyw5IEBACiAJZ2V0X2Fub25fdm1hKGFub25fdm1hLT5yb290KTsKIAkvKiBNYXJrIHRoaXMgYW5vbl92bWEgYXMgdGhlIG9uZSB3aGVyZSBvdXIgbmV3IChDT1dlZCkgcGFnZXMgZ28uICovCiAJdm1hLT5hbm9uX3ZtYSA9IGFub25fdm1hOworCWFub25fdm1hX2xvY2soYW5vbl92bWEpOwogCWFub25fdm1hX2NoYWluX2xpbmsodm1hLCBhdmMsIGFub25fdm1hKTsKKwlhbm9uX3ZtYV91bmxvY2soYW5vbl92bWEpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTI5MSwzNiArMzI2LDQzIEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyB2b2lkIGFub25fdm1hX3VubGluayhzdHJ1Y3QgYW5vbl92bWFfY2hhaW4gKmFub25fdm1hX2NoYWluKQotewotCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBhbm9uX3ZtYV9jaGFpbi0+YW5vbl92bWE7Ci0JaW50IGVtcHR5OwotCi0JLyogSWYgYW5vbl92bWFfZm9yayBmYWlscywgd2UgY2FuIGdldCBhbiBlbXB0eSBhbm9uX3ZtYV9jaGFpbi4gKi8KLQlpZiAoIWFub25fdm1hKQotCQlyZXR1cm47Ci0KLQlhbm9uX3ZtYV9sb2NrKGFub25fdm1hKTsKLQlsaXN0X2RlbCgmYW5vbl92bWFfY2hhaW4tPnNhbWVfYW5vbl92bWEpOwotCi0JLyogV2UgbXVzdCBnYXJiYWdlIGNvbGxlY3QgdGhlIGFub25fdm1hIGlmIGl0J3MgZW1wdHkgKi8KLQllbXB0eSA9IGxpc3RfZW1wdHkoJmFub25fdm1hLT5oZWFkKTsKLQlhbm9uX3ZtYV91bmxvY2soYW5vbl92bWEpOwotCi0JaWYgKGVtcHR5KQotCQlwdXRfYW5vbl92bWEoYW5vbl92bWEpOwotfQotCiB2b2lkIHVubGlua19hbm9uX3ZtYXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGFub25fdm1hX2NoYWluICphdmMsICpuZXh0OworCXN0cnVjdCBhbm9uX3ZtYSAqcm9vdCA9IE5VTEw7CiAKIAkvKgogCSAqIFVubGluayBlYWNoIGFub25fdm1hIGNoYWluZWQgdG8gdGhlIFZNQS4gIFRoaXMgbGlzdCBpcyBvcmRlcmVkCiAJICogZnJvbSBuZXdlc3QgdG8gb2xkZXN0LCBlbnN1cmluZyB0aGUgcm9vdCBhbm9uX3ZtYSBnZXRzIGZyZWVkIGxhc3QuCiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGF2YywgbmV4dCwgJnZtYS0+YW5vbl92bWFfY2hhaW4sIHNhbWVfdm1hKSB7Ci0JCWFub25fdm1hX3VubGluayhhdmMpOworCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gYXZjLT5hbm9uX3ZtYTsKKworCQlyb290ID0gbG9ja19hbm9uX3ZtYV9yb290KHJvb3QsIGFub25fdm1hKTsKKwkJbGlzdF9kZWwoJmF2Yy0+c2FtZV9hbm9uX3ZtYSk7CisKKwkJLyoKKwkJICogTGVhdmUgZW1wdHkgYW5vbl92bWFzIG9uIHRoZSBsaXN0IC0gd2UnbGwgbmVlZAorCQkgKiB0byBmcmVlIHRoZW0gb3V0c2lkZSB0aGUgbG9jay4KKwkJICovCisJCWlmIChsaXN0X2VtcHR5KCZhbm9uX3ZtYS0+aGVhZCkpCisJCQljb250aW51ZTsKKworCQlsaXN0X2RlbCgmYXZjLT5zYW1lX3ZtYSk7CisJCWFub25fdm1hX2NoYWluX2ZyZWUoYXZjKTsKKwl9CisJdW5sb2NrX2Fub25fdm1hX3Jvb3Qocm9vdCk7CisKKwkvKgorCSAqIEl0ZXJhdGUgdGhlIGxpc3Qgb25jZSBtb3JlLCBpdCBub3cgb25seSBjb250YWlucyBlbXB0eSBhbmQgdW5saW5rZWQKKwkgKiBhbm9uX3ZtYXMsIGRlc3Ryb3kgdGhlbS4gQ291bGQgbm90IGRvIGJlZm9yZSBkdWUgdG8gX19wdXRfYW5vbl92bWEoKQorCSAqIG5lZWRpbmcgdG8gYWNxdWlyZSB0aGUgYW5vbl92bWEtPnJvb3QtPm11dGV4LgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhdmMsIG5leHQsICZ2bWEtPmFub25fdm1hX2NoYWluLCBzYW1lX3ZtYSkgeworCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gYXZjLT5hbm9uX3ZtYTsKKworCQlwdXRfYW5vbl92bWEoYW5vbl92bWEpOworCiAJCWxpc3RfZGVsKCZhdmMtPnNhbWVfdm1hKTsKIAkJYW5vbl92bWFfY2hhaW5fZnJlZShhdmMpOwogCX0KQEAgLTgyNywxMSArODY5LDExIEBACiAJCQkJCQkJCXZtX2ZsYWdzKTsKIAkJaWYgKHdlX2xvY2tlZCkKIAkJCXVubG9ja19wYWdlKHBhZ2UpOworCisJCWlmIChwYWdlX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHBhZ2VfdG9fcGZuKHBhZ2UpKSkKKwkJCXJlZmVyZW5jZWQrKzsKIAl9CiBvdXQ6Ci0JaWYgKHBhZ2VfdGVzdF9hbmRfY2xlYXJfeW91bmcocGFnZV90b19wZm4ocGFnZSkpKQotCQlyZWZlcmVuY2VkKys7Ci0KIAlyZXR1cm4gcmVmZXJlbmNlZDsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggZDIyMWExYy4uNWNjMjFmOCAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGxpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KQEAgLTEyNiw4ICsxMjcsMTUgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IHNobWVtX2dldHBhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBpZHgsCi0JCQkgc3RydWN0IHBhZ2UgKipwYWdlcCwgZW51bSBzZ3BfdHlwZSBzZ3AsIGludCAqdHlwZSk7CitzdGF0aWMgaW50IHNobWVtX2dldHBhZ2VfZ2ZwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHBnb2ZmX3QgaW5kZXgsCisJc3RydWN0IHBhZ2UgKipwYWdlcCwgZW51bSBzZ3BfdHlwZSBzZ3AsIGdmcF90IGdmcCwgaW50ICpmYXVsdF90eXBlKTsKKworc3RhdGljIGlubGluZSBpbnQgc2htZW1fZ2V0cGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBwZ29mZl90IGluZGV4LAorCXN0cnVjdCBwYWdlICoqcGFnZXAsIGVudW0gc2dwX3R5cGUgc2dwLCBpbnQgKmZhdWx0X3R5cGUpCit7CisJcmV0dXJuIHNobWVtX2dldHBhZ2VfZ2ZwKGlub2RlLCBpbmRleCwgcGFnZXAsIHNncCwKKwkJCW1hcHBpbmdfZ2ZwX21hc2soaW5vZGUtPmlfbWFwcGluZyksIGZhdWx0X3R5cGUpOworfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpzaG1lbV9kaXJfYWxsb2MoZ2ZwX3QgZ2ZwX21hc2spCiB7CkBAIC0yNDEsOSArMjQ5LDcgQEAKIAlzdHJ1Y3Qgc2htZW1fc2JfaW5mbyAqc2JpbmZvID0gU0hNRU1fU0IoaW5vZGUtPmlfc2IpOwogCWlmIChzYmluZm8tPm1heF9ibG9ja3MpIHsKIAkJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmluZm8tPnVzZWRfYmxvY2tzLCAtcGFnZXMpOwotCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCQlpbm9kZS0+aV9ibG9ja3MgLT0gcGFnZXMqQkxPQ0tTX1BFUl9QQUdFOwotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJfQogfQogCkBAIC00MDUsMTAgKzQxMSwxMiBAQAogICogQGluZm86CWluZm8gc3RydWN0dXJlIGZvciB0aGUgaW5vZGUKICAqIEBpbmRleDoJaW5kZXggb2YgdGhlIHBhZ2UgdG8gZmluZAogICogQHNncDoJY2hlY2sgYW5kIHJlY2hlY2sgaV9zaXplPyBza2lwIGFsbG9jYXRpb24/CisgKiBAZ2ZwOglnZnAgbWFzayB0byB1c2UgZm9yIGFueSBwYWdlIGFsbG9jYXRpb24KICAqCiAgKiBJZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QsIGFsbG9jYXRlIGl0LgogICovCi1zdGF0aWMgc3dwX2VudHJ5X3QgKnNobWVtX3N3cF9hbGxvYyhzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBpbmRleCwgZW51bSBzZ3BfdHlwZSBzZ3ApCitzdGF0aWMgc3dwX2VudHJ5X3QgKnNobWVtX3N3cF9hbGxvYyhzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywKKwkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIGVudW0gc2dwX3R5cGUgc2dwLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9ICZpbmZvLT52ZnNfaW5vZGU7CiAJc3RydWN0IHNobWVtX3NiX2luZm8gKnNiaW5mbyA9IFNITUVNX1NCKGlub2RlLT5pX3NiKTsKQEAgLTQzMiwxMyArNDQwLDExIEBACiAJCQkJCQlzYmluZm8tPm1heF9ibG9ja3MgLSAxKSA+PSAwKQogCQkJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOwogCQkJcGVyY3B1X2NvdW50ZXJfaW5jKCZzYmluZm8tPnVzZWRfYmxvY2tzKTsKLQkJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCQlpbm9kZS0+aV9ibG9ja3MgKz0gQkxPQ0tTX1BFUl9QQUdFOwotCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCQl9CiAKIAkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQlwYWdlID0gc2htZW1fZGlyX2FsbG9jKG1hcHBpbmdfZ2ZwX21hc2soaW5vZGUtPmlfbWFwcGluZykpOworCQlwYWdlID0gc2htZW1fZGlyX2FsbG9jKGdmcCk7CiAJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CiAKIAkJaWYgKCFwYWdlKSB7CkBAIC01MzksNyArNTQ1LDcgQEAKIAl9IHdoaWxlIChuZXh0KTsKIH0KIAotc3RhdGljIHZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKQordm9pZCBzaG1lbV90cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpCiB7CiAJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8gPSBTSE1FTV9JKGlub2RlKTsKIAl1bnNpZ25lZCBsb25nIGlkeDsKQEAgLTU2Miw2ICs1NjgsOCBAQAogCXNwaW5sb2NrX3QgKnB1bmNoX2xvY2s7CiAJdW5zaWduZWQgbG9uZyB1cHBlcl9saW1pdDsKIAorCXRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCiAJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAlpZHggPSAoc3RhcnQgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWlmIChpZHggPj0gaW5mby0+bmV4dF9pbmRleCkKQEAgLTczOCwxNiArNzQ2LDggQEAKIAkJICogbG93ZXJlZCBuZXh0X2luZGV4LiAgQWxzbywgdGhvdWdoIHNobWVtX2dldHBhZ2UgY2hlY2tzCiAJCSAqIGlfc2l6ZSBiZWZvcmUgYWRkaW5nIHRvIGNhY2hlLCBubyByZWNoZWNrIGFmdGVyOiBzbyBmaXggdGhlCiAJCSAqIG5hcnJvdyB3aW5kb3cgdGhlcmUgdG9vLgotCQkgKgotCQkgKiBSZWNhbGxpbmcgdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UgYW5kIHVubWFwX21hcHBpbmdfcmFuZ2UKLQkJICogZXZlcnkgdGltZSBmb3IgcHVuY2hfaG9sZSAod2hpY2ggbmV2ZXIgZ290IGEgY2hhbmNlIHRvIGNsZWFyCi0JCSAqIFNITUVNX1BBR0VJTiBhdCB0aGUgc3RhcnQgb2Ygdm10cnVuY2F0ZV9yYW5nZSkgaXMgZXhwZW5zaXZlLAotCQkgKiB5ZXQgaGFyZGx5IGV2ZXIgbmVjZXNzYXJ5OiB0cnkgdG8gb3B0aW1pemUgdGhlbSBvdXQgbGF0ZXIuCiAJCSAqLwogCQl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKLQkJaWYgKHB1bmNoX2hvbGUpCi0JCQl1bm1hcF9tYXBwaW5nX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LAotCQkJCQkJCWVuZCAtIHN0YXJ0LCAxKTsKIAl9CiAKIAlzcGluX2xvY2soJmluZm8tPmxvY2spOwpAQCAtNzY2LDIyICs3NjYsMjMgQEAKIAkJc2htZW1fZnJlZV9wYWdlcyhwYWdlc190b19mcmVlLm5leHQpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNobWVtX3RydW5jYXRlX3JhbmdlKTsKIAotc3RhdGljIGludCBzaG1lbV9ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQorc3RhdGljIGludCBzaG1lbV9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7Ci0JbG9mZl90IG5ld3NpemUgPSBhdHRyLT5pYV9zaXplOwogCWludCBlcnJvcjsKIAogCWVycm9yID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBhdHRyKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkKLQkJCQkJJiYgbmV3c2l6ZSAhPSBpbm9kZS0+aV9zaXplKSB7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSkgeworCQlsb2ZmX3Qgb2xkc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJCWxvZmZfdCBuZXdzaXplID0gYXR0ci0+aWFfc2l6ZTsKIAkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCi0JCWlmIChuZXdzaXplIDwgaW5vZGUtPmlfc2l6ZSkgeworCQlpZiAobmV3c2l6ZSA8IG9sZHNpemUpIHsKIAkJCS8qCiAJCQkgKiBJZiB0cnVuY2F0aW5nIGRvd24gdG8gYSBwYXJ0aWFsIHBhZ2UsIHRoZW4KIAkJCSAqIGlmIHRoYXQgcGFnZSBpcyBhbHJlYWR5IGFsbG9jYXRlZCwgaG9sZCBpdApAQCAtODEwLDEyICs4MTEsMTkgQEAKIAkJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CiAJCQl9CiAJCX0KLQotCQkvKiBYWFgodHJ1bmNhdGUpOiB0cnVuY2F0ZV9zZXRzaXplIHNob3VsZCBiZSBjYWxsZWQgbGFzdCAqLwotCQl0cnVuY2F0ZV9zZXRzaXplKGlub2RlLCBuZXdzaXplKTsKKwkJaWYgKG5ld3NpemUgIT0gb2xkc2l6ZSkgeworCQkJaV9zaXplX3dyaXRlKGlub2RlLCBuZXdzaXplKTsKKwkJCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJCX0KKwkJaWYgKG5ld3NpemUgPCBvbGRzaXplKSB7CisJCQlsb2ZmX3QgaG9sZWJlZ2luID0gcm91bmRfdXAobmV3c2l6ZSwgUEFHRV9TSVpFKTsKKwkJCXVubWFwX21hcHBpbmdfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgaG9sZWJlZ2luLCAwLCAxKTsKKwkJCXNobWVtX3RydW5jYXRlX3JhbmdlKGlub2RlLCBuZXdzaXplLCAobG9mZl90KS0xKTsKKwkJCS8qIHVubWFwIGFnYWluIHRvIHJlbW92ZSByYWNpbHkgQ09XZWQgcHJpdmF0ZSBwYWdlcyAqLworCQkJdW5tYXBfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBob2xlYmVnaW4sIDAsIDEpOworCQl9CiAJCWlmIChwYWdlKQogCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQlzaG1lbV90cnVuY2F0ZV9yYW5nZShpbm9kZSwgbmV3c2l6ZSwgKGxvZmZfdCktMSk7CiAJfQogCiAJc2V0YXR0cl9jb3B5KGlub2RlLCBhdHRyKTsKQEAgLTgzMiw3ICs4NDAsNiBAQAogCXN0cnVjdCBzaG1lbV94YXR0ciAqeGF0dHIsICpueGF0dHI7CiAKIAlpZiAoaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPT0gJnNobWVtX2FvcHMpIHsKLQkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgMCk7CiAJCXNobWVtX3VuYWNjdF9zaXplKGluZm8tPmZsYWdzLCBpbm9kZS0+aV9zaXplKTsKIAkJaW5vZGUtPmlfc2l6ZSA9IDA7CiAJCXNobWVtX3RydW5jYXRlX3JhbmdlKGlub2RlLCAwLCAobG9mZl90KS0xKTsKQEAgLTk2NSwyMCArOTcyLDcgQEAKIAllcnJvciA9IGFkZF90b19wYWdlX2NhY2hlX2xvY2tlZChwYWdlLCBtYXBwaW5nLCBpZHgsIEdGUF9OT1dBSVQpOwogCS8qIHdoaWNoIGRvZXMgbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlIG9uIGVycm9yICovCiAKLQlpZiAoZXJyb3IgPT0gLUVFWElTVCkgewotCQlzdHJ1Y3QgcGFnZSAqZmlsZXBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIGlkeCk7Ci0JCWVycm9yID0gMTsKLQkJaWYgKGZpbGVwYWdlKSB7Ci0JCQkvKgotCQkJICogVGhlcmUgbWlnaHQgYmUgYSBtb3JlIHVwdG9kYXRlIHBhZ2UgY29taW5nIGRvd24KLQkJCSAqIGZyb20gYSBzdGFja2VkIHdyaXRlcGFnZTogZm9yZ2V0IG91ciBzd2FwcGFnZSBpZiBzby4KLQkJCSAqLwotCQkJaWYgKFBhZ2VVcHRvZGF0ZShmaWxlcGFnZSkpCi0JCQkJZXJyb3IgPSAwOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGZpbGVwYWdlKTsKLQkJfQotCX0KLQlpZiAoIWVycm9yKSB7CisJaWYgKGVycm9yICE9IC1FTk9NRU0pIHsKIAkJZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKIAkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CiAJCWluZm8tPmZsYWdzIHw9IFNITUVNX1BBR0VJTjsKQEAgLTEwNjUsMTYgKzEwNTksMTcgQEAKIAkvKgogCSAqIHNobWVtX2JhY2tpbmdfZGV2X2luZm8ncyBjYXBhYmlsaXRpZXMgcHJldmVudCByZWd1bGFyIHdyaXRlYmFjayBvcgogCSAqIHN5bmMgZnJvbSBldmVyIGNhbGxpbmcgc2htZW1fd3JpdGVwYWdlOyBidXQgYSBzdGFja2luZyBmaWxlc3lzdGVtCi0JICogbWF5IHVzZSB0aGUgLT53cml0ZXBhZ2Ugb2YgaXRzIHVuZGVybHlpbmcgZmlsZXN5c3RlbSwgaW4gd2hpY2ggY2FzZQorCSAqIG1pZ2h0IHVzZSAtPndyaXRlcGFnZSBvZiBpdHMgdW5kZXJseWluZyBmaWxlc3lzdGVtLCBpbiB3aGljaCBjYXNlCiAJICogdG1wZnMgc2hvdWxkIHdyaXRlIG91dCB0byBzd2FwIG9ubHkgaW4gcmVzcG9uc2UgdG8gbWVtb3J5IHByZXNzdXJlLAotCSAqIGFuZCBub3QgZm9yIHRoZSB3cml0ZWJhY2sgdGhyZWFkcyBvciBzeW5jLiAgSG93ZXZlciwgaW4gdGhvc2UgY2FzZXMsCi0JICogd2UgZG8gc3RpbGwgd2FudCB0byBjaGVjayBpZiB0aGVyZSdzIGEgcmVkdW5kYW50IHN3YXBwYWdlIHRvIGJlCi0JICogZGlzY2FyZGVkLgorCSAqIGFuZCBub3QgZm9yIHRoZSB3cml0ZWJhY2sgdGhyZWFkcyBvciBzeW5jLgogCSAqLwotCWlmICh3YmMtPmZvcl9yZWNsYWltKQotCQlzd2FwID0gZ2V0X3N3YXBfcGFnZSgpOwotCWVsc2UKLQkJc3dhcC52YWwgPSAwOworCWlmICghd2JjLT5mb3JfcmVjbGFpbSkgeworCQlXQVJOX09OX09OQ0UoMSk7CS8qIFN0aWxsIGhhcHBlbnM/IFRlbGwgdXMgYWJvdXQgaXQhICovCisJCWdvdG8gcmVkaXJ0eTsKKwl9CisJc3dhcCA9IGdldF9zd2FwX3BhZ2UoKTsKKwlpZiAoIXN3YXAudmFsKQorCQlnb3RvIHJlZGlydHk7CiAKIAkvKgogCSAqIEFkZCBpbm9kZSB0byBzaG1lbV91bnVzZSgpJ3MgbGlzdCBvZiBzd2FwcGVkLW91dCBpbm9kZXMsCkBAIC0xMDg1LDE1ICsxMDgwLDEyIEBACiAJICogd2UndmUgdGFrZW4gdGhlIHNwaW5sb2NrLCBiZWNhdXNlIHNobWVtX3VudXNlX2lub2RlKCkgd2lsbAogCSAqIHBydW5lIGEgIXN3YXBwZWQgaW5vZGUgZnJvbSB0aGUgc3dhcGxpc3QgdW5kZXIgYm90aCBsb2Nrcy4KIAkgKi8KLQlpZiAoc3dhcC52YWwpIHsKLQkJbXV0ZXhfbG9jaygmc2htZW1fc3dhcGxpc3RfbXV0ZXgpOwotCQlpZiAobGlzdF9lbXB0eSgmaW5mby0+c3dhcGxpc3QpKQotCQkJbGlzdF9hZGRfdGFpbCgmaW5mby0+c3dhcGxpc3QsICZzaG1lbV9zd2FwbGlzdCk7Ci0JfQorCW11dGV4X2xvY2soJnNobWVtX3N3YXBsaXN0X211dGV4KTsKKwlpZiAobGlzdF9lbXB0eSgmaW5mby0+c3dhcGxpc3QpKQorCQlsaXN0X2FkZF90YWlsKCZpbmZvLT5zd2FwbGlzdCwgJnNobWVtX3N3YXBsaXN0KTsKIAogCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0JaWYgKHN3YXAudmFsKQotCQltdXRleF91bmxvY2soJnNobWVtX3N3YXBsaXN0X211dGV4KTsKKwltdXRleF91bmxvY2soJnNobWVtX3N3YXBsaXN0X211dGV4KTsKIAogCWlmIChpbmRleCA+PSBpbmZvLT5uZXh0X2luZGV4KSB7CiAJCUJVR19PTighKGluZm8tPmZsYWdzICYgU0hNRU1fVFJVTkNBVEUpKTsKQEAgLTExMDEsMTYgKzEwOTMsMTMgQEAKIAl9CiAJZW50cnkgPSBzaG1lbV9zd3BfZW50cnkoaW5mbywgaW5kZXgsIE5VTEwpOwogCWlmIChlbnRyeS0+dmFsKSB7Ci0JCS8qCi0JCSAqIFRoZSBtb3JlIHVwdG9kYXRlIHBhZ2UgY29taW5nIGRvd24gZnJvbSBhIHN0YWNrZWQKLQkJICogd3JpdGVwYWdlIHNob3VsZCByZXBsYWNlIG91ciBvbGQgc3dhcHBhZ2UuCi0JCSAqLworCQlXQVJOX09OX09OQ0UoMSk7CS8qIFN0aWxsIGhhcHBlbnM/IFRlbGwgdXMgYWJvdXQgaXQhICovCiAJCWZyZWVfc3dhcF9hbmRfY2FjaGUoKmVudHJ5KTsKIAkJc2htZW1fc3dwX3NldChpbmZvLCBlbnRyeSwgMCk7CiAJfQogCXNobWVtX3JlY2FsY19pbm9kZShpbm9kZSk7CiAKLQlpZiAoc3dhcC52YWwgJiYgYWRkX3RvX3N3YXBfY2FjaGUocGFnZSwgc3dhcCwgR0ZQX0FUT01JQykgPT0gMCkgeworCWlmIChhZGRfdG9fc3dhcF9jYWNoZShwYWdlLCBzd2FwLCBHRlBfQVRPTUlDKSA9PSAwKSB7CiAJCWRlbGV0ZV9mcm9tX3BhZ2VfY2FjaGUocGFnZSk7CiAJCXNobWVtX3N3cF9zZXQoaW5mbywgZW50cnksIHN3YXAudmFsKTsKIAkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKQEAgLTEyMjcsOTIgKzEyMTYsODMgQEAKICNlbmRpZgogCiAvKgotICogc2htZW1fZ2V0cGFnZSAtIGVpdGhlciBnZXQgdGhlIHBhZ2UgZnJvbSBzd2FwIG9yIGFsbG9jYXRlIGEgbmV3IG9uZQorICogc2htZW1fZ2V0cGFnZV9nZnAgLSBmaW5kIHBhZ2UgaW4gY2FjaGUsIG9yIGdldCBmcm9tIHN3YXAsIG9yIGFsbG9jYXRlCiAgKgogICogSWYgd2UgYWxsb2NhdGUgYSBuZXcgb25lIHdlIGRvIG5vdCBtYXJrIGl0IGRpcnR5LiBUaGF0J3MgdXAgdG8gdGhlCiAgKiB2bS4gSWYgd2Ugc3dhcCBpdCBpbiB3ZSBtYXJrIGl0IGRpcnR5IHNpbmNlIHdlIGFsc28gZnJlZSB0aGUgc3dhcAogICogZW50cnkgc2luY2UgYSBwYWdlIGNhbm5vdCBsaXZlIGluIGJvdGggdGhlIHN3YXAgYW5kIHBhZ2UgY2FjaGUKICAqLwotc3RhdGljIGludCBzaG1lbV9nZXRwYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgaWR4LAotCQkJc3RydWN0IHBhZ2UgKipwYWdlcCwgZW51bSBzZ3BfdHlwZSBzZ3AsIGludCAqdHlwZSkKK3N0YXRpYyBpbnQgc2htZW1fZ2V0cGFnZV9nZnAoc3RydWN0IGlub2RlICppbm9kZSwgcGdvZmZfdCBpZHgsCisJc3RydWN0IHBhZ2UgKipwYWdlcCwgZW51bSBzZ3BfdHlwZSBzZ3AsIGdmcF90IGdmcCwgaW50ICpmYXVsdF90eXBlKQogewogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKIAlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbyA9IFNITUVNX0koaW5vZGUpOwogCXN0cnVjdCBzaG1lbV9zYl9pbmZvICpzYmluZm87Ci0Jc3RydWN0IHBhZ2UgKmZpbGVwYWdlID0gKnBhZ2VwOwotCXN0cnVjdCBwYWdlICpzd2FwcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlzdHJ1Y3QgcGFnZSAqcHJlYWxsb2NfcGFnZSA9IE5VTEw7CiAJc3dwX2VudHJ5X3QgKmVudHJ5OwogCXN3cF9lbnRyeV90IHN3YXA7Ci0JZ2ZwX3QgZ2ZwOwogCWludCBlcnJvcjsKKwlpbnQgcmV0OwogCiAJaWYgKGlkeCA+PSBTSE1FTV9NQVhfSU5ERVgpCiAJCXJldHVybiAtRUZCSUc7Ci0KLQlpZiAodHlwZSkKLQkJKnR5cGUgPSAwOworcmVwZWF0OgorCXBhZ2UgPSBmaW5kX2xvY2tfcGFnZShtYXBwaW5nLCBpZHgpOworCWlmIChwYWdlKSB7CisJCS8qCisJCSAqIE9uY2Ugd2UgY2FuIGdldCB0aGUgcGFnZSBsb2NrLCBpdCBtdXN0IGJlIHVwdG9kYXRlOgorCQkgKiBpZiB0aGVyZSB3ZXJlIGFuIGVycm9yIGluIHJlYWRpbmcgYmFjayBmcm9tIHN3YXAsCisJCSAqIHRoZSBwYWdlIHdvdWxkIG5vdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBmaWxlY2FjaGUuCisJCSAqLworCQlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJCWdvdG8gZG9uZTsKKwl9CiAKIAkvKgotCSAqIE5vcm1hbGx5LCBmaWxlcGFnZSBpcyBOVUxMIG9uIGVudHJ5LCBhbmQgZWl0aGVyIGZvdW5kCi0JICogdXB0b2RhdGUgaW1tZWRpYXRlbHksIG9yIGFsbG9jYXRlZCBhbmQgemVyb2VkLCBvciByZWFkCi0JICogaW4gdW5kZXIgc3dhcHBhZ2UsIHdoaWNoIGlzIHRoZW4gYXNzaWduZWQgdG8gZmlsZXBhZ2UuCi0JICogQnV0IHNobWVtX3JlYWRwYWdlIChyZXF1aXJlZCBmb3Igc3BsaWNlKSBwYXNzZXMgaW4gYSBsb2NrZWQKLQkgKiBmaWxlcGFnZSwgd2hpY2ggbWF5IGJlIGZvdW5kIG5vdCB1cHRvZGF0ZSBieSBvdGhlciBjYWxsZXJzCi0JICogdG9vLCBhbmQgbWF5IG5lZWQgdG8gYmUgY29waWVkIGZyb20gdGhlIHN3YXBwYWdlIHJlYWQgaW4uCisJICogVHJ5IHRvIHByZWxvYWQgd2hpbGUgd2UgY2FuIHdhaXQsIHRvIG5vdCBtYWtlIGEgaGFiaXQgb2YKKwkgKiBkcmFpbmluZyBhdG9taWMgcmVzZXJ2ZXM7IGJ1dCBkb24ndCBsYXRjaCBvbiB0byB0aGlzIGNwdS4KIAkgKi8KLXJlcGVhdDoKLQlpZiAoIWZpbGVwYWdlKQotCQlmaWxlcGFnZSA9IGZpbmRfbG9ja19wYWdlKG1hcHBpbmcsIGlkeCk7Ci0JaWYgKGZpbGVwYWdlICYmIFBhZ2VVcHRvZGF0ZShmaWxlcGFnZSkpCi0JCWdvdG8gZG9uZTsKLQlnZnAgPSBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpOwotCWlmICghZmlsZXBhZ2UpIHsKLQkJLyoKLQkJICogVHJ5IHRvIHByZWxvYWQgd2hpbGUgd2UgY2FuIHdhaXQsIHRvIG5vdCBtYWtlIGEgaGFiaXQgb2YKLQkJICogZHJhaW5pbmcgYXRvbWljIHJlc2VydmVzOyBidXQgZG9uJ3QgbGF0Y2ggb24gdG8gdGhpcyBjcHUuCi0JCSAqLwotCQllcnJvciA9IHJhZGl4X3RyZWVfcHJlbG9hZChnZnAgJiB+X19HRlBfSElHSE1FTSk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gZmFpbGVkOwotCQlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7Ci0JCWlmIChzZ3AgIT0gU0dQX1JFQUQgJiYgIXByZWFsbG9jX3BhZ2UpIHsKLQkJCS8qIFdlIGRvbid0IGNhcmUgaWYgdGhpcyBmYWlscyAqLwotCQkJcHJlYWxsb2NfcGFnZSA9IHNobWVtX2FsbG9jX3BhZ2UoZ2ZwLCBpbmZvLCBpZHgpOwotCQkJaWYgKHByZWFsbG9jX3BhZ2UpIHsKLQkJCQlpZiAobWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UocHJlYWxsb2NfcGFnZSwKLQkJCQkJCWN1cnJlbnQtPm1tLCBHRlBfS0VSTkVMKSkgewotCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocHJlYWxsb2NfcGFnZSk7Ci0JCQkJCXByZWFsbG9jX3BhZ2UgPSBOVUxMOwotCQkJCX0KKwllcnJvciA9IHJhZGl4X3RyZWVfcHJlbG9hZChnZnAgJiBHRlBfUkVDTEFJTV9NQVNLKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCXJhZGl4X3RyZWVfcHJlbG9hZF9lbmQoKTsKKworCWlmIChzZ3AgIT0gU0dQX1JFQUQgJiYgIXByZWFsbG9jX3BhZ2UpIHsKKwkJcHJlYWxsb2NfcGFnZSA9IHNobWVtX2FsbG9jX3BhZ2UoZ2ZwLCBpbmZvLCBpZHgpOworCQlpZiAocHJlYWxsb2NfcGFnZSkgeworCQkJU2V0UGFnZVN3YXBCYWNrZWQocHJlYWxsb2NfcGFnZSk7CisJCQlpZiAobWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UocHJlYWxsb2NfcGFnZSwKKwkJCQkJY3VycmVudC0+bW0sIEdGUF9LRVJORUwpKSB7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHByZWFsbG9jX3BhZ2UpOworCQkJCXByZWFsbG9jX3BhZ2UgPSBOVUxMOwogCQkJfQogCQl9CiAJfQotCWVycm9yID0gMDsKIAogCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CiAJc2htZW1fcmVjYWxjX2lub2RlKGlub2RlKTsKLQllbnRyeSA9IHNobWVtX3N3cF9hbGxvYyhpbmZvLCBpZHgsIHNncCk7CisJZW50cnkgPSBzaG1lbV9zd3BfYWxsb2MoaW5mbywgaWR4LCBzZ3AsIGdmcCk7CiAJaWYgKElTX0VSUihlbnRyeSkpIHsKIAkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwogCQllcnJvciA9IFBUUl9FUlIoZW50cnkpOwotCQlnb3RvIGZhaWxlZDsKKwkJZ290byBvdXQ7CiAJfQogCXN3YXAgPSAqZW50cnk7CiAKIAlpZiAoc3dhcC52YWwpIHsKIAkJLyogTG9vayBpdCB1cCBhbmQgcmVhZCBpdCBpbi4uICovCi0JCXN3YXBwYWdlID0gbG9va3VwX3N3YXBfY2FjaGUoc3dhcCk7Ci0JCWlmICghc3dhcHBhZ2UpIHsKKwkJcGFnZSA9IGxvb2t1cF9zd2FwX2NhY2hlKHN3YXApOworCQlpZiAoIXBhZ2UpIHsKIAkJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7CiAJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CiAJCQkvKiBoZXJlIHdlIGFjdHVhbGx5IGRvIHRoZSBpbyAqLwotCQkJaWYgKHR5cGUpCi0JCQkJKnR5cGUgfD0gVk1fRkFVTFRfTUFKT1I7Ci0JCQlzd2FwcGFnZSA9IHNobWVtX3N3YXBpbihzd2FwLCBnZnAsIGluZm8sIGlkeCk7Ci0JCQlpZiAoIXN3YXBwYWdlKSB7CisJCQlpZiAoZmF1bHRfdHlwZSkKKwkJCQkqZmF1bHRfdHlwZSB8PSBWTV9GQVVMVF9NQUpPUjsKKwkJCXBhZ2UgPSBzaG1lbV9zd2FwaW4oc3dhcCwgZ2ZwLCBpbmZvLCBpZHgpOworCQkJaWYgKCFwYWdlKSB7CiAJCQkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCQllbnRyeSA9IHNobWVtX3N3cF9hbGxvYyhpbmZvLCBpZHgsIHNncCk7CisJCQkJZW50cnkgPSBzaG1lbV9zd3BfYWxsb2MoaW5mbywgaWR4LCBzZ3AsIGdmcCk7CiAJCQkJaWYgKElTX0VSUihlbnRyeSkpCiAJCQkJCWVycm9yID0gUFRSX0VSUihlbnRyeSk7CiAJCQkJZWxzZSB7CkBAIC0xMzIyLDYyICsxMzAyLDQyIEBACiAJCQkJfQogCQkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKIAkJCQlpZiAoZXJyb3IpCi0JCQkJCWdvdG8gZmFpbGVkOworCQkJCQlnb3RvIG91dDsKIAkJCQlnb3RvIHJlcGVhdDsKIAkJCX0KLQkJCXdhaXRfb25fcGFnZV9sb2NrZWQoc3dhcHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHN3YXBwYWdlKTsKKwkJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQlnb3RvIHJlcGVhdDsKIAkJfQogCiAJCS8qIFdlIGhhdmUgdG8gZG8gdGhpcyB3aXRoIHBhZ2UgbG9ja2VkIHRvIHByZXZlbnQgcmFjZXMgKi8KLQkJaWYgKCF0cnlsb2NrX3BhZ2Uoc3dhcHBhZ2UpKSB7CisJCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CiAJCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwogCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJd2FpdF9vbl9wYWdlX2xvY2tlZChzd2FwcGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc3dhcHBhZ2UpOworCQkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCWdvdG8gcmVwZWF0OwogCQl9Ci0JCWlmIChQYWdlV3JpdGViYWNrKHN3YXBwYWdlKSkgeworCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkgewogCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKIAkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2soc3dhcHBhZ2UpOwotCQkJdW5sb2NrX3BhZ2Uoc3dhcHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHN3YXBwYWdlKTsKKwkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCWdvdG8gcmVwZWF0OwogCQl9Ci0JCWlmICghUGFnZVVwdG9kYXRlKHN3YXBwYWdlKSkgeworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgewogCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKIAkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCXVubG9ja19wYWdlKHN3YXBwYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShzd2FwcGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCWVycm9yID0gLUVJTzsKLQkJCWdvdG8gZmFpbGVkOworCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAoZmlsZXBhZ2UpIHsKLQkJCXNobWVtX3N3cF9zZXQoaW5mbywgZW50cnksIDApOwotCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJCWRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoc3dhcHBhZ2UpOwotCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJY29weV9oaWdocGFnZShmaWxlcGFnZSwgc3dhcHBhZ2UpOwotCQkJdW5sb2NrX3BhZ2Uoc3dhcHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHN3YXBwYWdlKTsKLQkJCWZsdXNoX2RjYWNoZV9wYWdlKGZpbGVwYWdlKTsKLQkJCVNldFBhZ2VVcHRvZGF0ZShmaWxlcGFnZSk7Ci0JCQlzZXRfcGFnZV9kaXJ0eShmaWxlcGFnZSk7Ci0JCQlzd2FwX2ZyZWUoc3dhcCk7Ci0JCX0gZWxzZSBpZiAoIShlcnJvciA9IGFkZF90b19wYWdlX2NhY2hlX2xvY2tlZChzd2FwcGFnZSwgbWFwcGluZywKLQkJCQkJaWR4LCBHRlBfTk9XQUlUKSkpIHsKLQkJCWluZm8tPmZsYWdzIHw9IFNITUVNX1BBR0VJTjsKLQkJCXNobWVtX3N3cF9zZXQoaW5mbywgZW50cnksIDApOwotCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJCWRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoc3dhcHBhZ2UpOwotCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJZmlsZXBhZ2UgPSBzd2FwcGFnZTsKLQkJCXNldF9wYWdlX2RpcnR5KGZpbGVwYWdlKTsKLQkJCXN3YXBfZnJlZShzd2FwKTsKLQkJfSBlbHNlIHsKKwkJZXJyb3IgPSBhZGRfdG9fcGFnZV9jYWNoZV9sb2NrZWQocGFnZSwgbWFwcGluZywKKwkJCQkJCSBpZHgsIEdGUF9OT1dBSVQpOworCQlpZiAoZXJyb3IpIHsKIAkJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7CiAJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CiAJCQlpZiAoZXJyb3IgPT0gLUVOT01FTSkgewpAQCAtMTM4NiwzMiArMTM0NiwzOCBAQAogCQkJCSAqIGNhbGwgbWVtY2cncyBPT00gaWYgbmVlZGVkLgogCQkJCSAqLwogCQkJCWVycm9yID0gbWVtX2Nncm91cF9zaG1lbV9jaGFyZ2VfZmFsbGJhY2soCi0JCQkJCQkJCXN3YXBwYWdlLAotCQkJCQkJCQljdXJyZW50LT5tbSwKLQkJCQkJCQkJZ2ZwKTsKKwkJCQkJCXBhZ2UsIGN1cnJlbnQtPm1tLCBnZnApOwogCQkJCWlmIChlcnJvcikgewotCQkJCQl1bmxvY2tfcGFnZShzd2FwcGFnZSk7Ci0JCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShzd2FwcGFnZSk7Ci0JCQkJCWdvdG8gZmFpbGVkOworCQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCQlnb3RvIG91dDsKIAkJCQl9CiAJCQl9Ci0JCQl1bmxvY2tfcGFnZShzd2FwcGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc3dhcHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQlnb3RvIHJlcGVhdDsKIAkJfQotCX0gZWxzZSBpZiAoc2dwID09IFNHUF9SRUFEICYmICFmaWxlcGFnZSkgeworCisJCWluZm8tPmZsYWdzIHw9IFNITUVNX1BBR0VJTjsKKwkJc2htZW1fc3dwX3NldChpbmZvLCBlbnRyeSwgMCk7CiAJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCWZpbGVwYWdlID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBpZHgpOwotCQlpZiAoZmlsZXBhZ2UgJiYKLQkJICAgICghUGFnZVVwdG9kYXRlKGZpbGVwYWdlKSB8fCAhdHJ5bG9ja19wYWdlKGZpbGVwYWdlKSkpIHsKKwkJZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKKwkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJc3dhcF9mcmVlKHN3YXApOworCisJfSBlbHNlIGlmIChzZ3AgPT0gU0dQX1JFQUQpIHsKKwkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKKwkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UobWFwcGluZywgaWR4KTsKKwkJaWYgKHBhZ2UgJiYgIXRyeWxvY2tfcGFnZShwYWdlKSkgewogCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJd2FpdF9vbl9wYWdlX2xvY2tlZChmaWxlcGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UoZmlsZXBhZ2UpOwotCQkJZmlsZXBhZ2UgPSBOVUxMOworCQkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCWdvdG8gcmVwZWF0OwogCQl9CiAJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQl9IGVsc2UgeworCisJfSBlbHNlIGlmIChwcmVhbGxvY19wYWdlKSB7CiAJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7CiAJCXNiaW5mbyA9IFNITUVNX1NCKGlub2RlLT5pX3NiKTsKIAkJaWYgKHNiaW5mby0+bWF4X2Jsb2NrcykgewpAQCAtMTQyMCwxMjYgKzEzODYsODYgQEAKIAkJCSAgICBzaG1lbV9hY2N0X2Jsb2NrKGluZm8tPmZsYWdzKSkKIAkJCQlnb3RvIG5vc3BhY2U7CiAJCQlwZXJjcHVfY291bnRlcl9pbmMoJnNiaW5mby0+dXNlZF9ibG9ja3MpOwotCQkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAkJCWlub2RlLT5pX2Jsb2NrcyArPSBCTE9DS1NfUEVSX1BBR0U7Ci0JCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCX0gZWxzZSBpZiAoc2htZW1fYWNjdF9ibG9jayhpbmZvLT5mbGFncykpCiAJCQlnb3RvIG5vc3BhY2U7CiAKLQkJaWYgKCFmaWxlcGFnZSkgewotCQkJaW50IHJldDsKKwkJcGFnZSA9IHByZWFsbG9jX3BhZ2U7CisJCXByZWFsbG9jX3BhZ2UgPSBOVUxMOwogCi0JCQlpZiAoIXByZWFsbG9jX3BhZ2UpIHsKLQkJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCQkJZmlsZXBhZ2UgPSBzaG1lbV9hbGxvY19wYWdlKGdmcCwgaW5mbywgaWR4KTsKLQkJCQlpZiAoIWZpbGVwYWdlKSB7Ci0JCQkJCXNobWVtX3VuYWNjdF9ibG9ja3MoaW5mby0+ZmxhZ3MsIDEpOwotCQkJCQlzaG1lbV9mcmVlX2Jsb2Nrcyhpbm9kZSwgMSk7Ci0JCQkJCWVycm9yID0gLUVOT01FTTsKLQkJCQkJZ290byBmYWlsZWQ7Ci0JCQkJfQotCQkJCVNldFBhZ2VTd2FwQmFja2VkKGZpbGVwYWdlKTsKLQotCQkJCS8qCi0JCQkJICogUHJlY2hhcmdlIHBhZ2Ugd2hpbGUgd2UgY2FuIHdhaXQsIGNvbXBlbnNhdGUKLQkJCQkgKiBhZnRlcgotCQkJCSAqLwotCQkJCWVycm9yID0gbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UoZmlsZXBhZ2UsCi0JCQkJCWN1cnJlbnQtPm1tLCBHRlBfS0VSTkVMKTsKLQkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGZpbGVwYWdlKTsKLQkJCQkJc2htZW1fdW5hY2N0X2Jsb2NrcyhpbmZvLT5mbGFncywgMSk7Ci0JCQkJCXNobWVtX2ZyZWVfYmxvY2tzKGlub2RlLCAxKTsKLQkJCQkJZmlsZXBhZ2UgPSBOVUxMOwotCQkJCQlnb3RvIGZhaWxlZDsKLQkJCQl9Ci0KLQkJCQlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCQkJfSBlbHNlIHsKLQkJCQlmaWxlcGFnZSA9IHByZWFsbG9jX3BhZ2U7Ci0JCQkJcHJlYWxsb2NfcGFnZSA9IE5VTEw7Ci0JCQkJU2V0UGFnZVN3YXBCYWNrZWQoZmlsZXBhZ2UpOwotCQkJfQotCi0JCQllbnRyeSA9IHNobWVtX3N3cF9hbGxvYyhpbmZvLCBpZHgsIHNncCk7Ci0JCQlpZiAoSVNfRVJSKGVudHJ5KSkKLQkJCQllcnJvciA9IFBUUl9FUlIoZW50cnkpOwotCQkJZWxzZSB7Ci0JCQkJc3dhcCA9ICplbnRyeTsKLQkJCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQkJfQotCQkJcmV0ID0gZXJyb3IgfHwgc3dhcC52YWw7Ci0JCQlpZiAocmV0KQotCQkJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfY2FjaGVfcGFnZShmaWxlcGFnZSk7Ci0JCQllbHNlCi0JCQkJcmV0ID0gYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KGZpbGVwYWdlLCBtYXBwaW5nLAotCQkJCQkJaWR4LCBHRlBfTk9XQUlUKTsKLQkJCS8qCi0JCQkgKiBBdCBhZGRfdG9fcGFnZV9jYWNoZV9scnUoKSBmYWlsdXJlLCB1bmNoYXJnZSB3aWxsCi0JCQkgKiBiZSBkb25lIGF1dG9tYXRpY2FsbHkuCi0JCQkgKi8KLQkJCWlmIChyZXQpIHsKLQkJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGZpbGVwYWdlKTsKLQkJCQlzaG1lbV91bmFjY3RfYmxvY2tzKGluZm8tPmZsYWdzLCAxKTsKLQkJCQlzaG1lbV9mcmVlX2Jsb2Nrcyhpbm9kZSwgMSk7Ci0JCQkJZmlsZXBhZ2UgPSBOVUxMOwotCQkJCWlmIChlcnJvcikKLQkJCQkJZ290byBmYWlsZWQ7Ci0JCQkJZ290byByZXBlYXQ7Ci0JCQl9Ci0JCQlpbmZvLT5mbGFncyB8PSBTSE1FTV9QQUdFSU47CisJCWVudHJ5ID0gc2htZW1fc3dwX2FsbG9jKGluZm8sIGlkeCwgc2dwLCBnZnApOworCQlpZiAoSVNfRVJSKGVudHJ5KSkKKwkJCWVycm9yID0gUFRSX0VSUihlbnRyeSk7CisJCWVsc2UgeworCQkJc3dhcCA9ICplbnRyeTsKKwkJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7CiAJCX0KLQotCQlpbmZvLT5hbGxvY2VkKys7Ci0JCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJY2xlYXJfaGlnaHBhZ2UoZmlsZXBhZ2UpOwotCQlmbHVzaF9kY2FjaGVfcGFnZShmaWxlcGFnZSk7Ci0JCVNldFBhZ2VVcHRvZGF0ZShmaWxlcGFnZSk7Ci0JCWlmIChzZ3AgPT0gU0dQX0RJUlRZKQotCQkJc2V0X3BhZ2VfZGlydHkoZmlsZXBhZ2UpOwotCX0KLWRvbmU6Ci0JKnBhZ2VwID0gZmlsZXBhZ2U7Ci0JZXJyb3IgPSAwOwotCWdvdG8gb3V0OwotCi1ub3NwYWNlOgotCS8qCi0JICogUGVyaGFwcyB0aGUgcGFnZSB3YXMgYnJvdWdodCBpbiBmcm9tIHN3YXAgYmV0d2VlbiBmaW5kX2xvY2tfcGFnZQotCSAqIGFuZCB0YWtpbmcgaW5mby0+bG9jaz8gIFdlIGFsbG93IGZvciB0aGF0IGF0IGFkZF90b19wYWdlX2NhY2hlX2xydSwKLQkgKiBidXQgbXVzdCBhbHNvIGF2b2lkIHJlcG9ydGluZyBhIHNwdXJpb3VzIEVOT1NQQyB3aGlsZSB3b3JraW5nIG9uIGEKLQkgKiBmdWxsIHRtcGZzLiAgKFdoZW4gZmlsZXBhZ2UgaGFzIGJlZW4gcGFzc2VkIGluIHRvIHNobWVtX2dldHBhZ2UsIGl0Ci0JICogaXMgYWxyZWFkeSBpbiBwYWdlIGNhY2hlLCB3aGljaCBwcmV2ZW50cyB0aGlzIHJhY2UgZnJvbSBvY2N1cnJpbmcuKQotCSAqLwotCWlmICghZmlsZXBhZ2UpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIGlkeCk7Ci0JCWlmIChwYWdlKSB7CisJCXJldCA9IGVycm9yIHx8IHN3YXAudmFsOworCQlpZiAocmV0KQorCQkJbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKHBhZ2UpOworCQllbHNlCisJCQlyZXQgPSBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywKKwkJCQkJCWlkeCwgR0ZQX05PV0FJVCk7CisJCS8qCisJCSAqIEF0IGFkZF90b19wYWdlX2NhY2hlX2xydSgpIGZhaWx1cmUsCisJCSAqIHVuY2hhcmdlIHdpbGwgYmUgZG9uZSBhdXRvbWF0aWNhbGx5LgorCQkgKi8KKwkJaWYgKHJldCkgeworCQkJc2htZW1fdW5hY2N0X2Jsb2NrcyhpbmZvLT5mbGFncywgMSk7CisJCQlzaG1lbV9mcmVlX2Jsb2Nrcyhpbm9kZSwgMSk7CiAJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CiAJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBvdXQ7CiAJCQlnb3RvIHJlcGVhdDsKIAkJfQorCisJCWluZm8tPmZsYWdzIHw9IFNITUVNX1BBR0VJTjsKKwkJaW5mby0+YWxsb2NlZCsrOworCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisJCWNsZWFyX2hpZ2hwYWdlKHBhZ2UpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQlpZiAoc2dwID09IFNHUF9ESVJUWSkKKwkJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OwogCX0KLQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JZXJyb3IgPSAtRU5PU1BDOwotZmFpbGVkOgotCWlmICgqcGFnZXAgIT0gZmlsZXBhZ2UpIHsKLQkJdW5sb2NrX3BhZ2UoZmlsZXBhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UoZmlsZXBhZ2UpOwotCX0KK2RvbmU6CisJKnBhZ2VwID0gcGFnZTsKKwllcnJvciA9IDA7CiBvdXQ6CiAJaWYgKHByZWFsbG9jX3BhZ2UpIHsKIAkJbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKHByZWFsbG9jX3BhZ2UpOwogCQlwYWdlX2NhY2hlX3JlbGVhc2UocHJlYWxsb2NfcGFnZSk7CiAJfQogCXJldHVybiBlcnJvcjsKKworbm9zcGFjZToKKwkvKgorCSAqIFBlcmhhcHMgdGhlIHBhZ2Ugd2FzIGJyb3VnaHQgaW4gZnJvbSBzd2FwIGJldHdlZW4gZmluZF9sb2NrX3BhZ2UKKwkgKiBhbmQgdGFraW5nIGluZm8tPmxvY2s/ICBXZSBhbGxvdyBmb3IgdGhhdCBhdCBhZGRfdG9fcGFnZV9jYWNoZV9scnUsCisJICogYnV0IG11c3QgYWxzbyBhdm9pZCByZXBvcnRpbmcgYSBzcHVyaW91cyBFTk9TUEMgd2hpbGUgd29ya2luZyBvbiBhCisJICogZnVsbCB0bXBmcy4KKwkgKi8KKwlwYWdlID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBpZHgpOworCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwlpZiAocGFnZSkgeworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCWdvdG8gcmVwZWF0OworCX0KKwllcnJvciA9IC1FTk9TUEM7CisJZ290byBvdXQ7CiB9CiAKIHN0YXRpYyBpbnQgc2htZW1fZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50IGVycm9yOwotCWludCByZXQ7CisJaW50IHJldCA9IFZNX0ZBVUxUX0xPQ0tFRDsKIAogCWlmICgoKGxvZmZfdCl2bWYtPnBnb2ZmIDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IGlfc2l6ZV9yZWFkKGlub2RlKSkKIAkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKQEAgLTE1NDcsMTEgKzE0NzMsMTIgQEAKIAllcnJvciA9IHNobWVtX2dldHBhZ2UoaW5vZGUsIHZtZi0+cGdvZmYsICZ2bWYtPnBhZ2UsIFNHUF9DQUNIRSwgJnJldCk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gKChlcnJvciA9PSAtRU5PTUVNKSA/IFZNX0ZBVUxUX09PTSA6IFZNX0ZBVUxUX1NJR0JVUyk7CisKIAlpZiAocmV0ICYgVk1fRkFVTFRfTUFKT1IpIHsKIAkJY291bnRfdm1fZXZlbnQoUEdNQUpGQVVMVCk7CiAJCW1lbV9jZ3JvdXBfY291bnRfdm1fZXZlbnQodm1hLT52bV9tbSwgUEdNQUpGQVVMVCk7CiAJfQotCXJldHVybiByZXQgfCBWTV9GQVVMVF9MT0NLRUQ7CisJcmV0dXJuIHJldDsKIH0KIAogI2lmZGVmIENPTkZJR19OVU1BCkBAIC0xNjY4LDE5ICsxNTk1LDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc2htZW1fc3ltbGlua19pbmxpbmVfb3BlcmF0aW9uczsKIAotLyoKLSAqIE5vcm1hbGx5IHRtcGZzIGF2b2lkcyB0aGUgdXNlIG9mIHNobWVtX3JlYWRwYWdlIGFuZCBzaG1lbV93cml0ZV9iZWdpbjsKLSAqIGJ1dCBwcm92aWRpbmcgdGhlbSBhbGxvd3MgYSB0bXBmcyBmaWxlIHRvIGJlIHVzZWQgZm9yIHNwbGljZSwgc2VuZGZpbGUsIGFuZAotICogYmVsb3cgdGhlIGxvb3AgZHJpdmVyLCBpbiB0aGUgZ2VuZXJpYyBmYXNoaW9uIHRoYXQgbWFueSBmaWxlc3lzdGVtcyBzdXBwb3J0LgotICovCi1zdGF0aWMgaW50IHNobWVtX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQlpbnQgZXJyb3IgPSBzaG1lbV9nZXRwYWdlKGlub2RlLCBwYWdlLT5pbmRleCwgJnBhZ2UsIFNHUF9DQUNIRSwgTlVMTCk7Ci0JdW5sb2NrX3BhZ2UocGFnZSk7Ci0JcmV0dXJuIGVycm9yOwotfQotCiBzdGF0aWMgaW50CiBzaG1lbV93cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQlsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzLApAQCAtMTY4OCw3ICsxNjAyLDYgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlwZ29mZl90IGluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JKnBhZ2VwID0gTlVMTDsKIAlyZXR1cm4gc2htZW1fZ2V0cGFnZShpbm9kZSwgaW5kZXgsIHBhZ2VwLCBTR1BfV1JJVEUsIE5VTEwpOwogfQogCkBAIC0xODQ1LDYgKzE3NTgsMTE5IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2htZW1fZmlsZV9zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqaW4sIGxvZmZfdCAqcHBvcywKKwkJCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzaXplX3QgbGVuLAorCQkJCXVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGluLT5mX21hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgaW50IGxvZmYsIG5yX3BhZ2VzLCByZXFfcGFnZXM7CisJc3RydWN0IHBhZ2UgKnBhZ2VzW1BJUEVfREVGX0JVRkZFUlNdOworCXN0cnVjdCBwYXJ0aWFsX3BhZ2UgcGFydGlhbFtQSVBFX0RFRl9CVUZGRVJTXTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlwZ29mZl90IGluZGV4LCBlbmRfaW5kZXg7CisJbG9mZl90IGlzaXplLCBsZWZ0OworCWludCBlcnJvciwgcGFnZV9ucjsKKwlzdHJ1Y3Qgc3BsaWNlX3BpcGVfZGVzYyBzcGQgPSB7CisJCS5wYWdlcyA9IHBhZ2VzLAorCQkucGFydGlhbCA9IHBhcnRpYWwsCisJCS5mbGFncyA9IGZsYWdzLAorCQkub3BzID0gJnBhZ2VfY2FjaGVfcGlwZV9idWZfb3BzLAorCQkuc3BkX3JlbGVhc2UgPSBzcGRfcmVsZWFzZV9wYWdlLAorCX07CisKKwlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwlpZiAodW5saWtlbHkoKnBwb3MgPj0gaXNpemUpKQorCQlyZXR1cm4gMDsKKworCWxlZnQgPSBpc2l6ZSAtICpwcG9zOworCWlmICh1bmxpa2VseShsZWZ0IDwgbGVuKSkKKwkJbGVuID0gbGVmdDsKKworCWlmIChzcGxpY2VfZ3Jvd19zcGQocGlwZSwgJnNwZCkpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5kZXggPSAqcHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWxvZmYgPSAqcHBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CisJcmVxX3BhZ2VzID0gKGxlbiArIGxvZmYgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCW5yX3BhZ2VzID0gbWluKHJlcV9wYWdlcywgcGlwZS0+YnVmZmVycyk7CisKKwlzcGQubnJfcGFnZXMgPSBmaW5kX2dldF9wYWdlc19jb250aWcobWFwcGluZywgaW5kZXgsCisJCQkJCQlucl9wYWdlcywgc3BkLnBhZ2VzKTsKKwlpbmRleCArPSBzcGQubnJfcGFnZXM7CisJZXJyb3IgPSAwOworCisJd2hpbGUgKHNwZC5ucl9wYWdlcyA8IG5yX3BhZ2VzKSB7CisJCWVycm9yID0gc2htZW1fZ2V0cGFnZShpbm9kZSwgaW5kZXgsICZwYWdlLCBTR1BfQ0FDSEUsIE5VTEwpOworCQlpZiAoZXJyb3IpCisJCQlicmVhazsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXNwZC5wYWdlc1tzcGQubnJfcGFnZXMrK10gPSBwYWdlOworCQlpbmRleCsrOworCX0KKworCWluZGV4ID0gKnBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlucl9wYWdlcyA9IHNwZC5ucl9wYWdlczsKKwlzcGQubnJfcGFnZXMgPSAwOworCisJZm9yIChwYWdlX25yID0gMDsgcGFnZV9uciA8IG5yX3BhZ2VzOyBwYWdlX25yKyspIHsKKwkJdW5zaWduZWQgaW50IHRoaXNfbGVuOworCisJCWlmICghbGVuKQorCQkJYnJlYWs7CisKKwkJdGhpc19sZW4gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBsZW4sIFBBR0VfQ0FDSEVfU0laRSAtIGxvZmYpOworCQlwYWdlID0gc3BkLnBhZ2VzW3BhZ2VfbnJdOworCisJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IHBhZ2UtPm1hcHBpbmcgIT0gbWFwcGluZykgeworCQkJZXJyb3IgPSBzaG1lbV9nZXRwYWdlKGlub2RlLCBpbmRleCwgJnBhZ2UsCisJCQkJCQkJU0dQX0NBQ0hFLCBOVUxMKTsKKwkJCWlmIChlcnJvcikKKwkJCQlicmVhazsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHNwZC5wYWdlc1twYWdlX25yXSk7CisJCQlzcGQucGFnZXNbcGFnZV9ucl0gPSBwYWdlOworCQl9CisKKwkJaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJCWVuZF9pbmRleCA9IChpc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWlmICh1bmxpa2VseSghaXNpemUgfHwgaW5kZXggPiBlbmRfaW5kZXgpKQorCQkJYnJlYWs7CisKKwkJaWYgKGVuZF9pbmRleCA9PSBpbmRleCkgeworCQkJdW5zaWduZWQgaW50IHBsZW47CisKKwkJCXBsZW4gPSAoKGlzaXplIC0gMSkgJiB+UEFHRV9DQUNIRV9NQVNLKSArIDE7CisJCQlpZiAocGxlbiA8PSBsb2ZmKQorCQkJCWJyZWFrOworCisJCQl0aGlzX2xlbiA9IG1pbih0aGlzX2xlbiwgcGxlbiAtIGxvZmYpOworCQkJbGVuID0gdGhpc19sZW47CisJCX0KKworCQlzcGQucGFydGlhbFtwYWdlX25yXS5vZmZzZXQgPSBsb2ZmOworCQlzcGQucGFydGlhbFtwYWdlX25yXS5sZW4gPSB0aGlzX2xlbjsKKwkJbGVuIC09IHRoaXNfbGVuOworCQlsb2ZmID0gMDsKKwkJc3BkLm5yX3BhZ2VzKys7CisJCWluZGV4Kys7CisJfQorCisJd2hpbGUgKHBhZ2VfbnIgPCBucl9wYWdlcykKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHNwZC5wYWdlc1twYWdlX25yKytdKTsKKworCWlmIChzcGQubnJfcGFnZXMpCisJCWVycm9yID0gc3BsaWNlX3RvX3BpcGUocGlwZSwgJnNwZCk7CisKKwlzcGxpY2Vfc2hyaW5rX3NwZChwaXBlLCAmc3BkKTsKKworCWlmIChlcnJvciA+IDApIHsKKwkJKnBwb3MgKz0gZXJyb3I7CisJCWZpbGVfYWNjZXNzZWQoaW4pOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKIHN0YXRpYyBpbnQgc2htZW1fc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIHsKIAlzdHJ1Y3Qgc2htZW1fc2JfaW5mbyAqc2JpbmZvID0gU0hNRU1fU0IoZGVudHJ5LT5kX3NiKTsKQEAgLTIwMDUsNyArMjAzMSw3IEBACiAJaW50IGVycm9yOwogCWludCBsZW47CiAJc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJY2hhciAqa2FkZHI7CiAJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm87CiAKQEAgLTI2ODMsNyArMjcwOSw2IEBACiAJLndyaXRlcGFnZQk9IHNobWVtX3dyaXRlcGFnZSwKIAkuc2V0X3BhZ2VfZGlydHkJPSBfX3NldF9wYWdlX2RpcnR5X25vX3dyaXRlYmFjaywKICNpZmRlZiBDT05GSUdfVE1QRlMKLQkucmVhZHBhZ2UJPSBzaG1lbV9yZWFkcGFnZSwKIAkud3JpdGVfYmVnaW4JPSBzaG1lbV93cml0ZV9iZWdpbiwKIAkud3JpdGVfZW5kCT0gc2htZW1fd3JpdGVfZW5kLAogI2VuZGlmCkBAIC0yNzAwLDEzICsyNzI1LDEzIEBACiAJLmFpb19yZWFkCT0gc2htZW1fZmlsZV9haW9fcmVhZCwKIAkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKIAkuZnN5bmMJCT0gbm9vcF9mc3luYywKLQkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCisJLnNwbGljZV9yZWFkCT0gc2htZW1fZmlsZV9zcGxpY2VfcmVhZCwKIAkuc3BsaWNlX3dyaXRlCT0gZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSwKICNlbmRpZgogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0JLnNldGF0dHIJPSBzaG1lbV9ub3RpZnlfY2hhbmdlLAorCS5zZXRhdHRyCT0gc2htZW1fc2V0YXR0ciwKIAkudHJ1bmNhdGVfcmFuZ2UJPSBzaG1lbV90cnVuY2F0ZV9yYW5nZSwKICNpZmRlZiBDT05GSUdfVE1QRlNfWEFUVFIKIAkuc2V0eGF0dHIJPSBzaG1lbV9zZXR4YXR0ciwKQEAgLTI3MTQsMTAgKzI3MzksNiBAQAogCS5saXN0eGF0dHIJPSBzaG1lbV9saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyCT0gc2htZW1fcmVtb3ZleGF0dHIsCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfVE1QRlNfUE9TSVhfQUNMCi0JLmNoZWNrX2FjbAk9IGdlbmVyaWNfY2hlY2tfYWNsLAotI2VuZGlmCi0KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKQEAgLTI3MzksOCArMjc2MCw3IEBACiAJLnJlbW92ZXhhdHRyCT0gc2htZW1fcmVtb3ZleGF0dHIsCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVE1QRlNfUE9TSVhfQUNMCi0JLnNldGF0dHIJPSBzaG1lbV9ub3RpZnlfY2hhbmdlLAotCS5jaGVja19hY2wJPSBnZW5lcmljX2NoZWNrX2FjbCwKKwkuc2V0YXR0cgk9IHNobWVtX3NldGF0dHIsCiAjZW5kaWYKIH07CiAKQEAgLTI3NTIsOCArMjc3Miw3IEBACiAJLnJlbW92ZXhhdHRyCT0gc2htZW1fcmVtb3ZleGF0dHIsCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVE1QRlNfUE9TSVhfQUNMCi0JLnNldGF0dHIJPSBzaG1lbV9ub3RpZnlfY2hhbmdlLAotCS5jaGVja19hY2wJPSBnZW5lcmljX2NoZWNrX2FjbCwKKwkuc2V0YXR0cgk9IHNobWVtX3NldGF0dHIsCiAjZW5kaWYKIH07CiAKQEAgLTI5MDgsNiArMjkyNywxMiBAQAogCXJldHVybiAwOwogfQogCit2b2lkIHNobWVtX3RydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCkKK3sKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNobWVtX3RydW5jYXRlX3JhbmdlKTsKKwogI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCiAvKioKICAqIG1lbV9jZ3JvdXBfZ2V0X3NobWVtX3RhcmdldCAtIGZpbmQgYSBwYWdlIG9yIGVudHJ5IGFzc2lnbmVkIHRvIHRoZSBzaG1lbSBmaWxlCkBAIC0zMDI4LDMgKzMwNTMsNDIgQEAKIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX0NBTl9OT05MSU5FQVI7CiAJcmV0dXJuIDA7CiB9CisKKy8qKgorICogc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2VfZ2ZwIC0gcmVhZCBpbnRvIHBhZ2UgY2FjaGUsIHVzaW5nIHNwZWNpZmllZCBwYWdlIGFsbG9jYXRpb24gZmxhZ3MuCisgKiBAbWFwcGluZzoJdGhlIHBhZ2UncyBhZGRyZXNzX3NwYWNlCisgKiBAaW5kZXg6CXRoZSBwYWdlIGluZGV4CisgKiBAZ2ZwOgl0aGUgcGFnZSBhbGxvY2F0b3IgZmxhZ3MgdG8gdXNlIGlmIGFsbG9jYXRpbmcKKyAqCisgKiBUaGlzIGJlaGF2ZXMgYXMgYSB0bXBmcyAicmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBpbmRleCwgZ2ZwKSIsCisgKiB3aXRoIGFueSBuZXcgcGFnZSBhbGxvY2F0aW9ucyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgYWxsb2NhdGlvbiBmbGFncy4KKyAqIEJ1dCByZWFkX2NhY2hlX3BhZ2VfZ2ZwKCkgdXNlcyB0aGUgLT5yZWFkcGFnZSgpIG1ldGhvZDogd2hpY2ggZG9lcyBub3QKKyAqIHN1aXQgdG1wZnMsIHNpbmNlIGl0IG1heSBoYXZlIHBhZ2VzIGluIHN3YXBjYWNoZSwgYW5kIG5lZWRzIHRvIGZpbmQgdGhvc2UKKyAqIGZvciBpdHNlbGY7IGFsdGhvdWdoIGRyaXZlcnMvZ3B1L2RybSBpOTE1IGFuZCB0dG0gcmVseSB1cG9uIHRoaXMgc3VwcG9ydC4KKyAqCisgKiBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzX2d0dCgpIG1peGVzIF9fR0ZQX05PUkVUUlkgfCBfX0dGUF9OT1dBUk4gaW4KKyAqIHdpdGggdGhlIG1hcHBpbmdfZ2ZwX21hc2soKSwgdG8gYXZvaWQgT09NaW5nIHRoZSBtYWNoaW5lIHVubmVjZXNzYXJpbHkuCisgKi8KK3N0cnVjdCBwYWdlICpzaG1lbV9yZWFkX21hcHBpbmdfcGFnZV9nZnAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJCSBwZ29mZl90IGluZGV4LCBnZnBfdCBnZnApCit7CisjaWZkZWYgQ09ORklHX1NITUVNCisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGVycm9yOworCisJQlVHX09OKG1hcHBpbmctPmFfb3BzICE9ICZzaG1lbV9hb3BzKTsKKwllcnJvciA9IHNobWVtX2dldHBhZ2VfZ2ZwKGlub2RlLCBpbmRleCwgJnBhZ2UsIFNHUF9DQUNIRSwgZ2ZwLCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXBhZ2UgPSBFUlJfUFRSKGVycm9yKTsKKwllbHNlCisJCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBwYWdlOworI2Vsc2UKKwkvKgorCSAqIFRoZSB0aW55ICFTSE1FTSBjYXNlIHVzZXMgcmFtZnMgd2l0aG91dCBzd2FwCisJICovCisJcmV0dXJuIHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgaW5kZXgsIGdmcCk7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNobWVtX3JlYWRfbWFwcGluZ19wYWdlX2dmcCk7CmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggYmNmYTQ5OC4uMWU1MjNlZCAxMDA2NDQKLS0tIGEvbW0vc2xhYi5jCisrKyBiL21tL3NsYWIuYwpAQCAtNTc0LDcgKzU3NCw5IEBACiAgICAgeyB7MCwgQk9PVF9DUFVDQUNIRV9FTlRSSUVTLCAxLCAwfSB9OwogCiAvKiBpbnRlcm5hbCBjYWNoZSBvZiBjYWNoZSBkZXNjcmlwdGlvbiBvYmpzICovCitzdGF0aWMgc3RydWN0IGttZW1fbGlzdDMgKmNhY2hlX2NhY2hlX25vZGVsaXN0c1tNQVhfTlVNTk9ERVNdOwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlIGNhY2hlX2NhY2hlID0geworCS5ub2RlbGlzdHMgPSBjYWNoZV9jYWNoZV9ub2RlbGlzdHMsCiAJLmJhdGNoY291bnQgPSAxLAogCS5saW1pdCA9IEJPT1RfQ1BVQ0FDSEVfRU5UUklFUywKIAkuc2hhcmVkID0gMSwKQEAgLTE0OTIsMTEgKzE0OTQsMTAgQEAKIAljYWNoZV9jYWNoZS5ub2RlbGlzdHNbbm9kZV0gPSAmaW5pdGttZW1fbGlzdDNbQ0FDSEVfQ0FDSEUgKyBub2RlXTsKIAogCS8qCi0JICogc3RydWN0IGttZW1fY2FjaGUgc2l6ZSBkZXBlbmRzIG9uIG5yX25vZGVfaWRzLCB3aGljaAotCSAqIGNhbiBiZSBsZXNzIHRoYW4gTUFYX05VTU5PREVTLgorCSAqIHN0cnVjdCBrbWVtX2NhY2hlIHNpemUgZGVwZW5kcyBvbiBucl9ub2RlX2lkcyAmIG5yX2NwdV9pZHMKIAkgKi8KLQljYWNoZV9jYWNoZS5idWZmZXJfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBrbWVtX2NhY2hlLCBub2RlbGlzdHMpICsKLQkJCQkgbnJfbm9kZV9pZHMgKiBzaXplb2Yoc3RydWN0IGttZW1fbGlzdDMgKik7CisJY2FjaGVfY2FjaGUuYnVmZmVyX3NpemUgPSBvZmZzZXRvZihzdHJ1Y3Qga21lbV9jYWNoZSwgYXJyYXlbbnJfY3B1X2lkc10pICsKKwkJCQkgIG5yX25vZGVfaWRzICogc2l6ZW9mKHN0cnVjdCBrbWVtX2xpc3QzICopOwogI2lmIERFQlVHCiAJY2FjaGVfY2FjaGUub2JqX3NpemUgPSBjYWNoZV9jYWNoZS5idWZmZXJfc2l6ZTsKICNlbmRpZgpAQCAtMjMwOCw2ICsyMzA5LDcgQEAKIAlpZiAoIWNhY2hlcCkKIAkJZ290byBvb3BzOwogCisJY2FjaGVwLT5ub2RlbGlzdHMgPSAoc3RydWN0IGttZW1fbGlzdDMgKiopJmNhY2hlcC0+YXJyYXlbbnJfY3B1X2lkc107CiAjaWYgREVCVUcKIAljYWNoZXAtPm9ial9zaXplID0gc2l6ZTsKIApAQCAtMzE1MywxMiArMzE1NSwxMSBAQAogCW9ianAgKz0gb2JqX29mZnNldChjYWNoZXApOwogCWlmIChjYWNoZXAtPmN0b3IgJiYgY2FjaGVwLT5mbGFncyAmIFNMQUJfUE9JU09OKQogCQljYWNoZXAtPmN0b3Iob2JqcCk7Ci0jaWYgQVJDSF9TTEFCX01JTkFMSUdOCi0JaWYgKCh1MzIpb2JqcCAmIChBUkNIX1NMQUJfTUlOQUxJR04tMSkpIHsKKwlpZiAoQVJDSF9TTEFCX01JTkFMSUdOICYmCisJICAgICgodW5zaWduZWQgbG9uZylvYmpwICYgKEFSQ0hfU0xBQl9NSU5BTElHTi0xKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIweCVwOiBub3QgYWxpZ25lZCB0byBBUkNIX1NMQUJfTUlOQUxJR049JWRcbiIsCi0JCSAgICAgICBvYmpwLCBBUkNIX1NMQUJfTUlOQUxJR04pOworCQkgICAgICAgb2JqcCwgKGludClBUkNIX1NMQUJfTUlOQUxJR04pOwogCX0KLSNlbmRpZgogCXJldHVybiBvYmpwOwogfQogI2Vsc2UKQEAgLTM2MDQsMTMgKzM2MDUsMTQgQEAKICAqIFJlbGVhc2UgYW4gb2JqIGJhY2sgdG8gaXRzIGNhY2hlLiBJZiB0aGUgb2JqIGhhcyBhIGNvbnN0cnVjdGVkIHN0YXRlLCBpdCBtdXN0CiAgKiBiZSBpbiB0aGlzIHN0YXRlIF9iZWZvcmVfIGl0IGlzIHJlbGVhc2VkLiAgQ2FsbGVkIHdpdGggZGlzYWJsZWQgaW50cy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCB2b2lkICpvYmpwKQorc3RhdGljIGlubGluZSB2b2lkIF9fY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCB2b2lkICpvYmpwLAorICAgIHZvaWQgKmNhbGxlcikKIHsKIAlzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFjID0gY3B1X2NhY2hlX2dldChjYWNoZXApOwogCiAJY2hlY2tfaXJxX29mZigpOwogCWttZW1sZWFrX2ZyZWVfcmVjdXJzaXZlKG9ianAsIGNhY2hlcC0+ZmxhZ3MpOwotCW9ianAgPSBjYWNoZV9mcmVlX2RlYnVnY2hlY2soY2FjaGVwLCBvYmpwLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCW9ianAgPSBjYWNoZV9mcmVlX2RlYnVnY2hlY2soY2FjaGVwLCBvYmpwLCBjYWxsZXIpOwogCiAJa21lbWNoZWNrX3NsYWJfZnJlZShjYWNoZXAsIG9ianAsIG9ial9zaXplKGNhY2hlcCkpOwogCkBAIC0zODAxLDcgKzM4MDMsNyBAQAogCWRlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKG9ianAsIG9ial9zaXplKGNhY2hlcCkpOwogCWlmICghKGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX0RFQlVHX09CSkVDVFMpKQogCQlkZWJ1Z19jaGVja19ub19vYmpfZnJlZWQob2JqcCwgb2JqX3NpemUoY2FjaGVwKSk7Ci0JX19jYWNoZV9mcmVlKGNhY2hlcCwgb2JqcCk7CisJX19jYWNoZV9mcmVlKGNhY2hlcCwgb2JqcCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAl0cmFjZV9rbWVtX2NhY2hlX2ZyZWUoX1JFVF9JUF8sIG9ianApOwpAQCAtMzgzMSw3ICszODMzLDcgQEAKIAljID0gdmlydF90b19jYWNoZShvYmpwKTsKIAlkZWJ1Z19jaGVja19ub19sb2Nrc19mcmVlZChvYmpwLCBvYmpfc2l6ZShjKSk7CiAJZGVidWdfY2hlY2tfbm9fb2JqX2ZyZWVkKG9ianAsIG9ial9zaXplKGMpKTsKLQlfX2NhY2hlX2ZyZWUoYywgKHZvaWQgKilvYmpwKTsKKwlfX2NhY2hlX2ZyZWUoYywgKHZvaWQgKilvYmpwLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woa2ZyZWUpOwpkaWZmIC0tZ2l0IGEvbW0vc2xvYi5jIGIvbW0vc2xvYi5jCmluZGV4IDQ2ZTBhZWUuLjBhZTg4MTggMTAwNjQ0Ci0tLSBhL21tL3Nsb2IuYworKysgYi9tbS9zbG9iLmMKQEAgLTQ4Miw2ICs0ODIsOCBAQAogCWludCBhbGlnbiA9IG1heChBUkNIX0tNQUxMT0NfTUlOQUxJR04sIEFSQ0hfU0xBQl9NSU5BTElHTik7CiAJdm9pZCAqcmV0OwogCisJZ2ZwICY9IGdmcF9hbGxvd2VkX21hc2s7CisKIAlsb2NrZGVwX3RyYWNlX2FsbG9jKGdmcCk7CiAKIAlpZiAoc2l6ZSA8IFBBR0VfU0laRSAtIGFsaWduKSB7CkBAIC02MDgsNiArNjEwLDEwIEBACiB7CiAJdm9pZCAqYjsKIAorCWZsYWdzICY9IGdmcF9hbGxvd2VkX21hc2s7CisKKwlsb2NrZGVwX3RyYWNlX2FsbG9jKGZsYWdzKTsKKwogCWlmIChjLT5zaXplIDwgUEFHRV9TSVpFKSB7CiAJCWIgPSBzbG9iX2FsbG9jKGMtPnNpemUsIGZsYWdzLCBjLT5hbGlnbiwgbm9kZSk7CiAJCXRyYWNlX2ttZW1fY2FjaGVfYWxsb2Nfbm9kZShfUkVUX0lQXywgYiwgYy0+c2l6ZSwKZGlmZiAtLWdpdCBhL21tL3NsdWIuYyBiL21tL3NsdWIuYwppbmRleCA3YmUwMjIzLi5mOGY1ZThlIDEwMDY0NAotLS0gYS9tbS9zbHViLmMKKysrIGIvbW0vc2x1Yi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbWVtb3J5Lmg+CiAjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmF1bHQtaW5qZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhY2t0cmFjZS5oPgogCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2ttZW0uaD4KIApAQCAtMTkxLDggKzE5MiwxMiBAQAogLyoKICAqIFRyYWNraW5nIHVzZXIgb2YgYSBzbGFiLgogICovCisjZGVmaW5lIFRSQUNLX0FERFJTX0NPVU5UIDE2CiBzdHJ1Y3QgdHJhY2sgewogCXVuc2lnbmVkIGxvbmcgYWRkcjsJLyogQ2FsbGVkIGZyb20gYWRkcmVzcyAqLworI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCisJdW5zaWduZWQgbG9uZyBhZGRyc1tUUkFDS19BRERSU19DT1VOVF07CS8qIENhbGxlZCBmcm9tIGFkZHJlc3MgKi8KKyNlbmRpZgogCWludCBjcHU7CQkvKiBXYXMgcnVubmluZyBvbiBjcHUgKi8KIAlpbnQgcGlkOwkJLyogUGlkIGNvbnRleHQgKi8KIAl1bnNpZ25lZCBsb25nIHdoZW47CS8qIFdoZW4gZGlkIHRoZSBvcGVyYXRpb24gb2NjdXIgKi8KQEAgLTQyMCw2ICs0MjUsMjQgQEAKIAlzdHJ1Y3QgdHJhY2sgKnAgPSBnZXRfdHJhY2socywgb2JqZWN0LCBhbGxvYyk7CiAKIAlpZiAoYWRkcikgeworI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCisJCXN0cnVjdCBzdGFja190cmFjZSB0cmFjZTsKKwkJaW50IGk7CisKKwkJdHJhY2UubnJfZW50cmllcyA9IDA7CisJCXRyYWNlLm1heF9lbnRyaWVzID0gVFJBQ0tfQUREUlNfQ09VTlQ7CisJCXRyYWNlLmVudHJpZXMgPSBwLT5hZGRyczsKKwkJdHJhY2Uuc2tpcCA9IDM7CisJCXNhdmVfc3RhY2tfdHJhY2UoJnRyYWNlKTsKKworCQkvKiBTZWUgcmFudCBpbiBsb2NrZGVwLmMgKi8KKwkJaWYgKHRyYWNlLm5yX2VudHJpZXMgIT0gMCAmJgorCQkgICAgdHJhY2UuZW50cmllc1t0cmFjZS5ucl9lbnRyaWVzIC0gMV0gPT0gVUxPTkdfTUFYKQorCQkJdHJhY2UubnJfZW50cmllcy0tOworCisJCWZvciAoaSA9IHRyYWNlLm5yX2VudHJpZXM7IGkgPCBUUkFDS19BRERSU19DT1VOVDsgaSsrKQorCQkJcC0+YWRkcnNbaV0gPSAwOworI2VuZGlmCiAJCXAtPmFkZHIgPSBhZGRyOwogCQlwLT5jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJCXAtPnBpZCA9IGN1cnJlbnQtPnBpZDsKQEAgLTQ0NCw2ICs0NjcsMTYgQEAKIAogCXByaW50ayhLRVJOX0VSUiAiSU5GTzogJXMgaW4gJXBTIGFnZT0lbHUgY3B1PSV1IHBpZD0lZFxuIiwKIAkJcywgKHZvaWQgKil0LT5hZGRyLCBqaWZmaWVzIC0gdC0+d2hlbiwgdC0+Y3B1LCB0LT5waWQpOworI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IFRSQUNLX0FERFJTX0NPVU5UOyBpKyspCisJCQlpZiAodC0+YWRkcnNbaV0pCisJCQkJcHJpbnRrKEtFUk5fRVJSICJcdCVwU1xuIiwgKHZvaWQgKil0LT5hZGRyc1tpXSk7CisJCQllbHNlCisJCQkJYnJlYWs7CisJfQorI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIHByaW50X3RyYWNraW5nKHN0cnVjdCBrbWVtX2NhY2hlICpzLCB2b2lkICpvYmplY3QpCkBAIC01NTcsMTAgKzU5MCwxMCBAQAogCQltZW1zZXQocCArIHMtPm9ianNpemUsIHZhbCwgcy0+aW51c2UgLSBzLT5vYmpzaXplKTsKIH0KIAotc3RhdGljIHU4ICpjaGVja19ieXRlcyh1OCAqc3RhcnQsIHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgaW50IGJ5dGVzKQorc3RhdGljIHU4ICpjaGVja19ieXRlczgodTggKnN0YXJ0LCB1OCB2YWx1ZSwgdW5zaWduZWQgaW50IGJ5dGVzKQogewogCXdoaWxlIChieXRlcykgewotCQlpZiAoKnN0YXJ0ICE9ICh1OCl2YWx1ZSkKKwkJaWYgKCpzdGFydCAhPSB2YWx1ZSkKIAkJCXJldHVybiBzdGFydDsKIAkJc3RhcnQrKzsKIAkJYnl0ZXMtLTsKQEAgLTU2OCw2ICs2MDEsMzggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHU4ICpjaGVja19ieXRlcyh1OCAqc3RhcnQsIHU4IHZhbHVlLCB1bnNpZ25lZCBpbnQgYnl0ZXMpCit7CisJdTY0IHZhbHVlNjQ7CisJdW5zaWduZWQgaW50IHdvcmRzLCBwcmVmaXg7CisKKwlpZiAoYnl0ZXMgPD0gMTYpCisJCXJldHVybiBjaGVja19ieXRlczgoc3RhcnQsIHZhbHVlLCBieXRlcyk7CisKKwl2YWx1ZTY0ID0gdmFsdWUgfCB2YWx1ZSA8PCA4IHwgdmFsdWUgPDwgMTYgfCB2YWx1ZSA8PCAyNDsKKwl2YWx1ZTY0ID0gdmFsdWU2NCB8IHZhbHVlNjQgPDwgMzI7CisJcHJlZml4ID0gOCAtICgodW5zaWduZWQgbG9uZylzdGFydCkgJSA4OworCisJaWYgKHByZWZpeCkgeworCQl1OCAqciA9IGNoZWNrX2J5dGVzOChzdGFydCwgdmFsdWUsIHByZWZpeCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJCXN0YXJ0ICs9IHByZWZpeDsKKwkJYnl0ZXMgLT0gcHJlZml4OworCX0KKworCXdvcmRzID0gYnl0ZXMgLyA4OworCisJd2hpbGUgKHdvcmRzKSB7CisJCWlmICgqKHU2NCAqKXN0YXJ0ICE9IHZhbHVlNjQpCisJCQlyZXR1cm4gY2hlY2tfYnl0ZXM4KHN0YXJ0LCB2YWx1ZSwgOCk7CisJCXN0YXJ0ICs9IDg7CisJCXdvcmRzLS07CisJfQorCisJcmV0dXJuIGNoZWNrX2J5dGVzOChzdGFydCwgdmFsdWUsIGJ5dGVzICUgOCk7Cit9CisKIHN0YXRpYyB2b2lkIHJlc3RvcmVfYnl0ZXMoc3RydWN0IGttZW1fY2FjaGUgKnMsIGNoYXIgKm1lc3NhZ2UsIHU4IGRhdGEsCiAJCQkJCQl2b2lkICpmcm9tLCB2b2lkICp0bykKIHsKQEAgLTIzMjAsMTYgKzIzODUsMTIgQEAKIAlCVUlMRF9CVUdfT04oUEVSQ1BVX0RZTkFNSUNfRUFSTFlfU0laRSA8CiAJCQlTTFVCX1BBR0VfU0hJRlQgKiBzaXplb2Yoc3RydWN0IGttZW1fY2FjaGVfY3B1KSk7CiAKLSNpZmRlZiBDT05GSUdfQ01QWENIR19MT0NBTAogCS8qCi0JICogTXVzdCBhbGlnbiB0byBkb3VibGUgd29yZCBib3VuZGFyeSBmb3IgdGhlIGRvdWJsZSBjbXB4Y2hnIGluc3RydWN0aW9ucwotCSAqIHRvIHdvcmsuCisJICogTXVzdCBhbGlnbiB0byBkb3VibGUgd29yZCBib3VuZGFyeSBmb3IgdGhlIGRvdWJsZSBjbXB4Y2hnCisJICogaW5zdHJ1Y3Rpb25zIHRvIHdvcms7IHNlZSBfX3BjcHVfZG91YmxlX2NhbGxfcmV0dXJuX2Jvb2woKS4KIAkgKi8KLQlzLT5jcHVfc2xhYiA9IF9fYWxsb2NfcGVyY3B1KHNpemVvZihzdHJ1Y3Qga21lbV9jYWNoZV9jcHUpLCAyICogc2l6ZW9mKHZvaWQgKikpOwotI2Vsc2UKLQkvKiBSZWd1bGFyIGFsaWdubWVudCBpcyBzdWZmaWNpZW50ICovCi0Jcy0+Y3B1X3NsYWIgPSBhbGxvY19wZXJjcHUoc3RydWN0IGttZW1fY2FjaGVfY3B1KTsKLSNlbmRpZgorCXMtPmNwdV9zbGFiID0gX19hbGxvY19wZXJjcHUoc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlX2NwdSksCisJCQkJICAgICAyICogc2l6ZW9mKHZvaWQgKikpOwogCiAJaWYgKCFzLT5jcHVfc2xhYikKIAkJcmV0dXJuIDA7CkBAIC0yOTMyLDYgKzI5OTMsNDIgQEAKIH0KIEVYUE9SVF9TWU1CT0woa3NpemUpOwogCisjaWZkZWYgQ09ORklHX1NMVUJfREVCVUcKK2Jvb2wgdmVyaWZ5X21lbV9ub3RfZGVsZXRlZChjb25zdCB2b2lkICp4KQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXZvaWQgKm9iamVjdCA9ICh2b2lkICopeDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgcnY7CisKKwlpZiAodW5saWtlbHkoWkVST19PUl9OVUxMX1BUUih4KSkpCisJCXJldHVybiBmYWxzZTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXBhZ2UgPSB2aXJ0X3RvX2hlYWRfcGFnZSh4KTsKKwlpZiAodW5saWtlbHkoIVBhZ2VTbGFiKHBhZ2UpKSkgeworCQkvKiBtYXliZSBpdCB3YXMgZnJvbSBzdGFjaz8gKi8KKwkJcnYgPSB0cnVlOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJc2xhYl9sb2NrKHBhZ2UpOworCWlmIChvbl9mcmVlbGlzdChwYWdlLT5zbGFiLCBwYWdlLCBvYmplY3QpKSB7CisJCW9iamVjdF9lcnIocGFnZS0+c2xhYiwgcGFnZSwgb2JqZWN0LCAiT2JqZWN0IGlzIG9uIGZyZWUtbGlzdCIpOworCQlydiA9IGZhbHNlOworCX0gZWxzZSB7CisJCXJ2ID0gdHJ1ZTsKKwl9CisJc2xhYl91bmxvY2socGFnZSk7CisKK291dF91bmxvY2s6CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiBydjsKK30KK0VYUE9SVF9TWU1CT0wodmVyaWZ5X21lbV9ub3RfZGVsZXRlZCk7CisjZW5kaWYKKwogdm9pZCBrZnJlZShjb25zdCB2b2lkICp4KQogewogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtNDA2Miw3ICs0MTU5LDcgQEAKICNlbmRpZgogCiAjZGVmaW5lIHRvX3NsYWJfYXR0cihuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IHNsYWJfYXR0cmlidXRlLCBhdHRyKQotI2RlZmluZSB0b19zbGFiKG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3Qga21lbV9jYWNoZSwga29iaik7CisjZGVmaW5lIHRvX3NsYWIobikgY29udGFpbmVyX29mKG4sIHN0cnVjdCBrbWVtX2NhY2hlLCBrb2JqKQogCiBzdHJ1Y3Qgc2xhYl9hdHRyaWJ1dGUgewogCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKZGlmZiAtLWdpdCBhL21tL3NwYXJzZS5jIGIvbW0vc3BhcnNlLmMKaW5kZXggYWE2NGIxMi4uODU4ZTFkZiAxMDA2NDQKLS0tIGEvbW0vc3BhcnNlLmMKKysrIGIvbW0vc3BhcnNlLmMKQEAgLTQwLDcgKzQwLDcgQEAKIHN0YXRpYyB1MTYgc2VjdGlvbl90b19ub2RlX3RhYmxlW05SX01FTV9TRUNUSU9OU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKICNlbmRpZgogCi1pbnQgcGFnZV90b19uaWQoc3RydWN0IHBhZ2UgKnBhZ2UpCitpbnQgcGFnZV90b19uaWQoY29uc3Qgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJcmV0dXJuIHNlY3Rpb25fdG9fbm9kZV90YWJsZVtwYWdlX3RvX3NlY3Rpb24ocGFnZSldOwogfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggZDUzN2QyOS4uMWI4YzMzOSAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgotI2luY2x1ZGUgPGxpbnV4L3NobS5oPgorI2luY2x1ZGUgPGxpbnV4L3NobWVtX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CkBAIC0xNjgxLDE5ICsxNjgxLDE0IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RydWN0IHByb2Nfc3dhcHMgewotCXN0cnVjdCBzZXFfZmlsZSBzZXE7Ci0JaW50IGV2ZW50OwotfTsKLQogc3RhdGljIHVuc2lnbmVkIHN3YXBzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7Ci0Jc3RydWN0IHByb2Nfc3dhcHMgKnMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNlcV9maWxlICpzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlwb2xsX3dhaXQoZmlsZSwgJnByb2NfcG9sbF93YWl0LCB3YWl0KTsKIAotCWlmIChzLT5ldmVudCAhPSBhdG9taWNfcmVhZCgmcHJvY19wb2xsX2V2ZW50KSkgewotCQlzLT5ldmVudCA9IGF0b21pY19yZWFkKCZwcm9jX3BvbGxfZXZlbnQpOworCWlmIChzZXEtPnBvbGxfZXZlbnQgIT0gYXRvbWljX3JlYWQoJnByb2NfcG9sbF9ldmVudCkpIHsKKwkJc2VxLT5wb2xsX2V2ZW50ID0gYXRvbWljX3JlYWQoJnByb2NfcG9sbF9ldmVudCk7CiAJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNIHwgUE9MTEVSUiB8IFBPTExQUkk7CiAJfQogCkBAIC0xNzgzLDI0ICsxNzc4LDE2IEBACiAKIHN0YXRpYyBpbnQgc3dhcHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgcHJvY19zd2FwcyAqczsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKIAlpbnQgcmV0OwogCi0JcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX3N3YXBzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7Ci0KIAlyZXQgPSBzZXFfb3BlbihmaWxlLCAmc3dhcHNfb3ApOwotCWlmIChyZXQpIHsKLQkJa2ZyZWUocyk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQl9CiAKLQlzLT5zZXEucHJpdmF0ZSA9IHM7Ci0Jcy0+ZXZlbnQgPSBhdG9taWNfcmVhZCgmcHJvY19wb2xsX2V2ZW50KTsKLQlyZXR1cm4gcmV0OworCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnBvbGxfZXZlbnQgPSBhdG9taWNfcmVhZCgmcHJvY19wb2xsX2V2ZW50KTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zd2Fwc19vcGVyYXRpb25zID0gewpkaWZmIC0tZ2l0IGEvbW0vdGhyYXNoLmMgYi9tbS90aHJhc2guYwppbmRleCAyMzcyZDRlLi5lNTNmN2QwIDEwMDY0NAotLS0gYS9tbS90aHJhc2guYworKysgYi9tbS90aHJhc2guYwpAQCAtNiw3ICs2LDcgQEAKICAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEwsIHNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzLgogICoKICAqIFNpbXBsZSB0b2tlbiBiYXNlZCB0aHJhc2hpbmcgcHJvdGVjdGlvbiwgdXNpbmcgdGhlIGFsZ29yaXRobQotICogZGVzY3JpYmVkIGluOiAgaHR0cDovL3d3dy5jcy53bS5lZHUvfnNqaWFuZy90b2tlbi5wZGYKKyAqIGRlc2NyaWJlZCBpbjogaHR0cDovL3d3dy5jc2Uub2hpby1zdGF0ZS5lZHUvaHBjcy9XV1cvSFRNTC9wdWJsaWNhdGlvbnMvYWJzMDUtMS5odG1sCiAgKgogICogU2VwIDIwMDYsIEFzaHdpbiBDaGF1Z3VsZSA8YXNod2luLmNoYXVndWxlQGNlbHVuaXRlLmNvbT4KICAqIEltcHJvdmVkIGFsZ29yaXRobSB0byBwYXNzIHRva2VuOgpAQCAtMjEsMTQgKzIxLDQwIEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CisKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvdm1zY2FuLmg+CisKKyNkZWZpbmUgVE9LRU5fQUdJTkdfSU5URVJWQUwJKDB4RkYpCiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF90b2tlbl9sb2NrKTsKIHN0cnVjdCBtbV9zdHJ1Y3QgKnN3YXBfdG9rZW5fbW07Ci1zdGF0aWMgdW5zaWduZWQgaW50IGdsb2JhbF9mYXVsdHM7CitzdHJ1Y3QgbWVtX2Nncm91cCAqc3dhcF90b2tlbl9tZW1jZzsKKworI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnN3YXBfdG9rZW5fbWVtY2dfZnJvbV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CisKKwltZW1jZyA9IHRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX21tKG1tKTsKKwlpZiAobWVtY2cpCisJCWNzc19wdXQobWVtX2Nncm91cF9jc3MobWVtY2cpKTsKKworCXJldHVybiBtZW1jZzsKK30KKyNlbHNlCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnN3YXBfdG9rZW5fbWVtY2dfZnJvbV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgogCiB2b2lkIGdyYWJfc3dhcF90b2tlbihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlpbnQgY3VycmVudF9pbnRlcnZhbDsKKwl1bnNpZ25lZCBpbnQgb2xkX3ByaW8gPSBtbS0+dG9rZW5fcHJpb3JpdHk7CisJc3RhdGljIHVuc2lnbmVkIGludCBnbG9iYWxfZmF1bHRzOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9hZ2luZzsKIAogCWdsb2JhbF9mYXVsdHMrKzsKIApAQCAtMzgsNDAgKzY0LDkyIEBACiAJCXJldHVybjsKIAogCS8qIEZpcnN0IGNvbWUgZmlyc3Qgc2VydmVkICovCi0JaWYgKHN3YXBfdG9rZW5fbW0gPT0gTlVMTCkgewotCQltbS0+dG9rZW5fcHJpb3JpdHkgPSBtbS0+dG9rZW5fcHJpb3JpdHkgKyAyOwotCQlzd2FwX3Rva2VuX21tID0gbW07Ci0JCWdvdG8gb3V0OworCWlmICghc3dhcF90b2tlbl9tbSkKKwkJZ290byByZXBsYWNlX3Rva2VuOworCisJLyoKKwkgKiBVc3VhbGx5LCB3ZSBkb24ndCBuZWVkIHByaW9yaXR5IGFnaW5nIGJlY2F1c2UgbG9uZyBpbnRlcnZhbCBmYXVsdHMKKwkgKiBtYWtlcyBwcmlvcml0eSBkZWNyZWFzZSBxdWlja2x5LiBCdXQgdGhlcmUgaXMgb25lIGV4Y2VwdGlvbi4gSWYgdGhlCisJICogdG9rZW4gb3duZXIgdGFzayBpcyBzbGVlcGluZywgaXQgbmV2ZXIgbWFrZSBsb25nIGludGVydmFsIGZhdWx0cy4KKwkgKiBUaHVzLCB3ZSBuZWVkIGEgcHJpb3JpdHkgYWdpbmcgbWVjaGFuaXNtIGluc3RlYWQuIFRoZSByZXF1aXJlbWVudHMKKwkgKiBvZiBwcmlvcml0eSBhZ2luZyBhcmUKKwkgKiAgMSkgQW4gYWdpbmcgaW50ZXJ2YWwgaXMgcmVhc29uYWJsZSBlbm91Z2ggbG9uZy4gVG9vIHNob3J0IGFnaW5nCisJICogICAgIGludGVydmFsIG1ha2VzIHF1aWNrIHN3YXAgdG9rZW4gbG9zdCBhbmQgZGVjcmVhc2UgcGVyZm9ybWFuY2UuCisJICogIDIpIFRoZSBzd2FwIHRva2VuIG93bmVyIHRhc2sgaGF2ZSB0byBnZXQgcHJpb3JpdHkgYWdpbmcgZXZlbiBpZgorCSAqICAgICBpdCdzIHVuZGVyIHNsZWVwLgorCSAqLworCWlmICgoZ2xvYmFsX2ZhdWx0cyAtIGxhc3RfYWdpbmcpID4gVE9LRU5fQUdJTkdfSU5URVJWQUwpIHsKKwkJc3dhcF90b2tlbl9tbS0+dG9rZW5fcHJpb3JpdHkgLz0gMjsKKwkJbGFzdF9hZ2luZyA9IGdsb2JhbF9mYXVsdHM7CiAJfQogCi0JaWYgKG1tICE9IHN3YXBfdG9rZW5fbW0pIHsKLQkJaWYgKGN1cnJlbnRfaW50ZXJ2YWwgPCBtbS0+bGFzdF9pbnRlcnZhbCkKLQkJCW1tLT50b2tlbl9wcmlvcml0eSsrOwotCQllbHNlIHsKLQkJCWlmIChsaWtlbHkobW0tPnRva2VuX3ByaW9yaXR5ID4gMCkpCi0JCQkJbW0tPnRva2VuX3ByaW9yaXR5LS07Ci0JCX0KLQkJLyogQ2hlY2sgaWYgd2UgZGVzZXJ2ZSB0aGUgdG9rZW4gKi8KLQkJaWYgKG1tLT50b2tlbl9wcmlvcml0eSA+IHN3YXBfdG9rZW5fbW0tPnRva2VuX3ByaW9yaXR5KSB7Ci0JCQltbS0+dG9rZW5fcHJpb3JpdHkgKz0gMjsKLQkJCXN3YXBfdG9rZW5fbW0gPSBtbTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFRva2VuIGhvbGRlciBjYW1lIGluIGFnYWluISAqLworCWlmIChtbSA9PSBzd2FwX3Rva2VuX21tKSB7CiAJCW1tLT50b2tlbl9wcmlvcml0eSArPSAyOworCQlnb3RvIHVwZGF0ZV9wcmlvcml0eTsKIAl9CiAKKwlpZiAoY3VycmVudF9pbnRlcnZhbCA8IG1tLT5sYXN0X2ludGVydmFsKQorCQltbS0+dG9rZW5fcHJpb3JpdHkrKzsKKwllbHNlIHsKKwkJaWYgKGxpa2VseShtbS0+dG9rZW5fcHJpb3JpdHkgPiAwKSkKKwkJCW1tLT50b2tlbl9wcmlvcml0eS0tOworCX0KKworCS8qIENoZWNrIGlmIHdlIGRlc2VydmUgdGhlIHRva2VuICovCisJaWYgKG1tLT50b2tlbl9wcmlvcml0eSA+IHN3YXBfdG9rZW5fbW0tPnRva2VuX3ByaW9yaXR5KQorCQlnb3RvIHJlcGxhY2VfdG9rZW47CisKK3VwZGF0ZV9wcmlvcml0eToKKwl0cmFjZV91cGRhdGVfc3dhcF90b2tlbl9wcmlvcml0eShtbSwgb2xkX3ByaW8sIHN3YXBfdG9rZW5fbW0pOworCiBvdXQ6CiAJbW0tPmZhdWx0c3RhbXAgPSBnbG9iYWxfZmF1bHRzOwogCW1tLT5sYXN0X2ludGVydmFsID0gY3VycmVudF9pbnRlcnZhbDsKIAlzcGluX3VubG9jaygmc3dhcF90b2tlbl9sb2NrKTsKKwlyZXR1cm47CisKK3JlcGxhY2VfdG9rZW46CisJbW0tPnRva2VuX3ByaW9yaXR5ICs9IDI7CisJdHJhY2VfcmVwbGFjZV9zd2FwX3Rva2VuKHN3YXBfdG9rZW5fbW0sIG1tKTsKKwlzd2FwX3Rva2VuX21tID0gbW07CisJc3dhcF90b2tlbl9tZW1jZyA9IHN3YXBfdG9rZW5fbWVtY2dfZnJvbV9tbShtbSk7CisJbGFzdF9hZ2luZyA9IGdsb2JhbF9mYXVsdHM7CisJZ290byBvdXQ7CiB9CiAKIC8qIENhbGxlZCBvbiBwcm9jZXNzIGV4aXQuICovCiB2b2lkIF9fcHV0X3N3YXBfdG9rZW4oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJc3Bpbl9sb2NrKCZzd2FwX3Rva2VuX2xvY2spOwotCWlmIChsaWtlbHkobW0gPT0gc3dhcF90b2tlbl9tbSkpCisJaWYgKGxpa2VseShtbSA9PSBzd2FwX3Rva2VuX21tKSkgeworCQl0cmFjZV9wdXRfc3dhcF90b2tlbihzd2FwX3Rva2VuX21tKTsKIAkJc3dhcF90b2tlbl9tbSA9IE5VTEw7CisJCXN3YXBfdG9rZW5fbWVtY2cgPSBOVUxMOworCX0KIAlzcGluX3VubG9jaygmc3dhcF90b2tlbl9sb2NrKTsKIH0KKworc3RhdGljIGJvb2wgbWF0Y2hfbWVtY2coc3RydWN0IG1lbV9jZ3JvdXAgKmEsIHN0cnVjdCBtZW1fY2dyb3VwICpiKQoreworCWlmICghYSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKCFiKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoYSA9PSBiKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgZGlzYWJsZV9zd2FwX3Rva2VuKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKK3sKKwkvKiBtZW1jZyByZWNsYWltIGRvbid0IGRpc2FibGUgdW5yZWxhdGVkIG1tIHRva2VuLiAqLworCWlmIChtYXRjaF9tZW1jZyhtZW1jZywgc3dhcF90b2tlbl9tZW1jZykpIHsKKwkJc3Bpbl9sb2NrKCZzd2FwX3Rva2VuX2xvY2spOworCQlpZiAobWF0Y2hfbWVtY2cobWVtY2csIHN3YXBfdG9rZW5fbWVtY2cpKSB7CisJCQl0cmFjZV9kaXNhYmxlX3N3YXBfdG9rZW4oc3dhcF90b2tlbl9tbSk7CisJCQlzd2FwX3Rva2VuX21tID0gTlVMTDsKKwkJCXN3YXBfdG9rZW5fbWVtY2cgPSBOVUxMOworCQl9CisJCXNwaW5fdW5sb2NrKCZzd2FwX3Rva2VuX2xvY2spOworCX0KK30KZGlmZiAtLWdpdCBhL21tL3RydW5jYXRlLmMgYi9tbS90cnVuY2F0ZS5jCmluZGV4IDNhMjlhNjEuLjIzMmViMjcgMTAwNjQ0Ci0tLSBhL21tL3RydW5jYXRlLmMKKysrIGIvbW0vdHJ1bmNhdGUuYwpAQCAtMTk5LDkgKzE5OSw2IEBACiAgKiBUaGUgZmlyc3QgcGFzcyB3aWxsIHJlbW92ZSBtb3N0IHBhZ2VzLCBzbyB0aGUgc2VhcmNoIGNvc3Qgb2YgdGhlIHNlY29uZCBwYXNzCiAgKiBpcyBsb3cuCiAgKgotICogV2hlbiBsb29raW5nIGF0IHBhZ2UtPmluZGV4IG91dHNpZGUgdGhlIHBhZ2UgbG9jayB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgdG8KLSAqIGNvcHkgaXQgaW50byBhIGxvY2FsIHRvIGF2b2lkIHJhY2VzIChpdCBjb3VsZCBjaGFuZ2UgYXQgYW55IHRpbWUpLgotICoKICAqIFdlIHBhc3MgZG93biB0aGUgY2FjaGUtaG90IGhpbnQgdG8gdGhlIHBhZ2UgZnJlZWluZyBjb2RlLiAgRXZlbiBpZiB0aGUKICAqIG1hcHBpbmcgaXMgbGFyZ2UsIGl0IGlzIHByb2JhYmx5IHRoZSBjYXNlIHRoYXQgdGhlIGZpbmFsIHBhZ2VzIGFyZSB0aGUgbW9zdAogICogcmVjZW50bHkgdG91Y2hlZCwgYW5kIGZyZWVpbmcgaGFwcGVucyBpbiBhc2NlbmRpbmcgZmlsZSBvZmZzZXQgb3JkZXIuCkBAIC0yMTAsMTAgKzIwNywxMCBAQAogCQkJCWxvZmZfdCBsc3RhcnQsIGxvZmZfdCBsZW5kKQogewogCWNvbnN0IHBnb2ZmX3Qgc3RhcnQgPSAobHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFLTEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JcGdvZmZfdCBlbmQ7CiAJY29uc3QgdW5zaWduZWQgcGFydGlhbCA9IGxzdGFydCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKIAlzdHJ1Y3QgcGFnZXZlYyBwdmVjOwotCXBnb2ZmX3QgbmV4dDsKKwlwZ29mZl90IGluZGV4OworCXBnb2ZmX3QgZW5kOwogCWludCBpOwogCiAJY2xlYW5jYWNoZV9mbHVzaF9pbm9kZShtYXBwaW5nKTsKQEAgLTIyNCwyNCArMjIxLDIxIEBACiAJZW5kID0gKGxlbmQgPj4gUEFHRV9DQUNIRV9TSElGVCk7CiAKIAlwYWdldmVjX2luaXQoJnB2ZWMsIDApOwotCW5leHQgPSBzdGFydDsKLQl3aGlsZSAobmV4dCA8PSBlbmQgJiYKLQkgICAgICAgcGFnZXZlY19sb29rdXAoJnB2ZWMsIG1hcHBpbmcsIG5leHQsIFBBR0VWRUNfU0laRSkpIHsKKwlpbmRleCA9IHN0YXJ0OworCXdoaWxlIChpbmRleCA8PSBlbmQgJiYgcGFnZXZlY19sb29rdXAoJnB2ZWMsIG1hcHBpbmcsIGluZGV4LAorCQkJbWluKGVuZCAtIGluZGV4LCAocGdvZmZfdClQQUdFVkVDX1NJWkUgLSAxKSArIDEpKSB7CiAJCW1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3RhcnQoKTsKIAkJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQoJnB2ZWMpOyBpKyspIHsKIAkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKLQkJCXBnb2ZmX3QgcGFnZV9pbmRleCA9IHBhZ2UtPmluZGV4OwogCi0JCQlpZiAocGFnZV9pbmRleCA+IGVuZCkgewotCQkJCW5leHQgPSBwYWdlX2luZGV4OworCQkJLyogV2UgcmVseSB1cG9uIGRlbGV0aW9uIG5vdCBjaGFuZ2luZyBwYWdlLT5pbmRleCAqLworCQkJaW5kZXggPSBwYWdlLT5pbmRleDsKKwkJCWlmIChpbmRleCA+IGVuZCkKIAkJCQlicmVhazsKLQkJCX0KIAotCQkJaWYgKHBhZ2VfaW5kZXggPiBuZXh0KQotCQkJCW5leHQgPSBwYWdlX2luZGV4OwotCQkJbmV4dCsrOwogCQkJaWYgKCF0cnlsb2NrX3BhZ2UocGFnZSkpCiAJCQkJY29udGludWU7CisJCQlXQVJOX09OKHBhZ2UtPmluZGV4ICE9IGluZGV4KTsKIAkJCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKSB7CiAJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCQkJY29udGludWU7CkBAIC0yNTIsNiArMjQ2LDcgQEAKIAkJcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKIAkJbWVtX2Nncm91cF91bmNoYXJnZV9lbmQoKTsKIAkJY29uZF9yZXNjaGVkKCk7CisJCWluZGV4Kys7CiAJfQogCiAJaWYgKHBhcnRpYWwpIHsKQEAgLTI2NCwxNiArMjU5LDE3IEBACiAJCX0KIAl9CiAKLQluZXh0ID0gc3RhcnQ7CisJaW5kZXggPSBzdGFydDsKIAlmb3IgKCA7IDsgKSB7CiAJCWNvbmRfcmVzY2hlZCgpOwotCQlpZiAoIXBhZ2V2ZWNfbG9va3VwKCZwdmVjLCBtYXBwaW5nLCBuZXh0LCBQQUdFVkVDX1NJWkUpKSB7Ci0JCQlpZiAobmV4dCA9PSBzdGFydCkKKwkJaWYgKCFwYWdldmVjX2xvb2t1cCgmcHZlYywgbWFwcGluZywgaW5kZXgsCisJCQltaW4oZW5kIC0gaW5kZXgsIChwZ29mZl90KVBBR0VWRUNfU0laRSAtIDEpICsgMSkpIHsKKwkJCWlmIChpbmRleCA9PSBzdGFydCkKIAkJCQlicmVhazsKLQkJCW5leHQgPSBzdGFydDsKKwkJCWluZGV4ID0gc3RhcnQ7CiAJCQljb250aW51ZTsKIAkJfQotCQlpZiAocHZlYy5wYWdlc1swXS0+aW5kZXggPiBlbmQpIHsKKwkJaWYgKGluZGV4ID09IHN0YXJ0ICYmIHB2ZWMucGFnZXNbMF0tPmluZGV4ID4gZW5kKSB7CiAJCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTI4MSwxOCArMjc3LDIwIEBACiAJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CiAJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CiAKLQkJCWlmIChwYWdlLT5pbmRleCA+IGVuZCkKKwkJCS8qIFdlIHJlbHkgdXBvbiBkZWxldGlvbiBub3QgY2hhbmdpbmcgcGFnZS0+aW5kZXggKi8KKwkJCWluZGV4ID0gcGFnZS0+aW5kZXg7CisJCQlpZiAoaW5kZXggPiBlbmQpCiAJCQkJYnJlYWs7CisKIAkJCWxvY2tfcGFnZShwYWdlKTsKKwkJCVdBUk5fT04ocGFnZS0+aW5kZXggIT0gaW5kZXgpOwogCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAkJCXRydW5jYXRlX2lub2RlX3BhZ2UobWFwcGluZywgcGFnZSk7Ci0JCQlpZiAocGFnZS0+aW5kZXggPiBuZXh0KQotCQkJCW5leHQgPSBwYWdlLT5pbmRleDsKLQkJCW5leHQrKzsKIAkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQl9CiAJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CiAJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfZW5kKCk7CisJCWluZGV4Kys7CiAJfQogCWNsZWFuY2FjaGVfZmx1c2hfaW5vZGUobWFwcGluZyk7CiB9CkBAIC0zMDQsNiArMzAyLDExIEBACiAgKiBAbHN0YXJ0OiBvZmZzZXQgZnJvbSB3aGljaCB0byB0cnVuY2F0ZQogICoKICAqIENhbGxlZCB1bmRlciAoYW5kIHNlcmlhbGlzZWQgYnkpIGlub2RlLT5pX211dGV4LgorICoKKyAqIE5vdGU6IFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zLCB0aGVyZSBjYW4gYmUgYSBwYWdlIGluIHRoZSBwcm9jZXNzIG9mCisgKiBkZWxldGlvbiAoaW5zaWRlIF9fZGVsZXRlX2Zyb21fcGFnZV9jYWNoZSgpKSBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAgVGh1cworICogbWFwcGluZy0+bnJwYWdlcyBjYW4gYmUgbm9uLXplcm8gd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZXZlbiBhZnRlcgorICogdHJ1bmNhdGlvbiBvZiB0aGUgd2hvbGUgbWFwcGluZy4KICAqLwogdm9pZCB0cnVuY2F0ZV9pbm9kZV9wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGxzdGFydCkKIHsKQEAgLTMyOCwzNSArMzMxLDI2IEBACiAJCXBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kKQogewogCXN0cnVjdCBwYWdldmVjIHB2ZWM7Ci0JcGdvZmZfdCBuZXh0ID0gc3RhcnQ7CisJcGdvZmZfdCBpbmRleCA9IHN0YXJ0OwogCXVuc2lnbmVkIGxvbmcgcmV0OwogCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOwogCWludCBpOwogCiAJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKLQl3aGlsZSAobmV4dCA8PSBlbmQgJiYKLQkJCXBhZ2V2ZWNfbG9va3VwKCZwdmVjLCBtYXBwaW5nLCBuZXh0LCBQQUdFVkVDX1NJWkUpKSB7CisJd2hpbGUgKGluZGV4IDw9IGVuZCAmJiBwYWdldmVjX2xvb2t1cCgmcHZlYywgbWFwcGluZywgaW5kZXgsCisJCQltaW4oZW5kIC0gaW5kZXgsIChwZ29mZl90KVBBR0VWRUNfU0laRSAtIDEpICsgMSkpIHsKIAkJbWVtX2Nncm91cF91bmNoYXJnZV9zdGFydCgpOwogCQlmb3IgKGkgPSAwOyBpIDwgcGFnZXZlY19jb3VudCgmcHZlYyk7IGkrKykgewogCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOwotCQkJcGdvZmZfdCBpbmRleDsKLQkJCWludCBsb2NrX2ZhaWxlZDsKIAotCQkJbG9ja19mYWlsZWQgPSAhdHJ5bG9ja19wYWdlKHBhZ2UpOwotCi0JCQkvKgotCQkJICogV2UgcmVhbGx5IHNob3VsZG4ndCBiZSBsb29raW5nIGF0IHRoZSAtPmluZGV4IG9mIGFuCi0JCQkgKiB1bmxvY2tlZCBwYWdlLiAgQnV0IHdlJ3JlIG5vdCBhbGxvd2VkIHRvIGxvY2sgdGhlc2UKLQkJCSAqIHBhZ2VzLiAgU28gd2UgcmVseSB1cG9uIG5vYm9keSBhbHRlcmluZyB0aGUgLT5pbmRleAotCQkJICogb2YgdGhpcyAocGlubmVkLWJ5LXVzKSBwYWdlLgotCQkJICovCisJCQkvKiBXZSByZWx5IHVwb24gZGVsZXRpb24gbm90IGNoYW5naW5nIHBhZ2UtPmluZGV4ICovCiAJCQlpbmRleCA9IHBhZ2UtPmluZGV4OwotCQkJaWYgKGluZGV4ID4gbmV4dCkKLQkJCQluZXh0ID0gaW5kZXg7Ci0JCQluZXh0Kys7Ci0JCQlpZiAobG9ja19mYWlsZWQpCi0JCQkJY29udGludWU7CisJCQlpZiAoaW5kZXggPiBlbmQpCisJCQkJYnJlYWs7CiAKKwkJCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKQorCQkJCWNvbnRpbnVlOworCQkJV0FSTl9PTihwYWdlLT5pbmRleCAhPSBpbmRleCk7CiAJCQlyZXQgPSBpbnZhbGlkYXRlX2lub2RlX3BhZ2UocGFnZSk7CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJCS8qCkBAIC0zNjYsMTIgKzM2MCwxMSBAQAogCQkJaWYgKCFyZXQpCiAJCQkJZGVhY3RpdmF0ZV9wYWdlKHBhZ2UpOwogCQkJY291bnQgKz0gcmV0OwotCQkJaWYgKG5leHQgPiBlbmQpCi0JCQkJYnJlYWs7CiAJCX0KIAkJcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKIAkJbWVtX2Nncm91cF91bmNoYXJnZV9lbmQoKTsKIAkJY29uZF9yZXNjaGVkKCk7CisJCWluZGV4Kys7CiAJfQogCXJldHVybiBjb3VudDsKIH0KQEAgLTQzNywzNyArNDMwLDMyIEBACiAJCQkJICBwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCkKIHsKIAlzdHJ1Y3QgcGFnZXZlYyBwdmVjOwotCXBnb2ZmX3QgbmV4dDsKKwlwZ29mZl90IGluZGV4OwogCWludCBpOwogCWludCByZXQgPSAwOwogCWludCByZXQyID0gMDsKIAlpbnQgZGlkX3JhbmdlX3VubWFwID0gMDsKLQlpbnQgd3JhcHBlZCA9IDA7CiAKIAljbGVhbmNhY2hlX2ZsdXNoX2lub2RlKG1hcHBpbmcpOwogCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7Ci0JbmV4dCA9IHN0YXJ0OwotCXdoaWxlIChuZXh0IDw9IGVuZCAmJiAhd3JhcHBlZCAmJgotCQlwYWdldmVjX2xvb2t1cCgmcHZlYywgbWFwcGluZywgbmV4dCwKLQkJCW1pbihlbmQgLSBuZXh0LCAocGdvZmZfdClQQUdFVkVDX1NJWkUgLSAxKSArIDEpKSB7CisJaW5kZXggPSBzdGFydDsKKwl3aGlsZSAoaW5kZXggPD0gZW5kICYmIHBhZ2V2ZWNfbG9va3VwKCZwdmVjLCBtYXBwaW5nLCBpbmRleCwKKwkJCW1pbihlbmQgLSBpbmRleCwgKHBnb2ZmX3QpUEFHRVZFQ19TSVpFIC0gMSkgKyAxKSkgewogCQltZW1fY2dyb3VwX3VuY2hhcmdlX3N0YXJ0KCk7CiAJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CiAJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07Ci0JCQlwZ29mZl90IHBhZ2VfaW5kZXg7CisKKwkJCS8qIFdlIHJlbHkgdXBvbiBkZWxldGlvbiBub3QgY2hhbmdpbmcgcGFnZS0+aW5kZXggKi8KKwkJCWluZGV4ID0gcGFnZS0+aW5kZXg7CisJCQlpZiAoaW5kZXggPiBlbmQpCisJCQkJYnJlYWs7CiAKIAkJCWxvY2tfcGFnZShwYWdlKTsKKwkJCVdBUk5fT04ocGFnZS0+aW5kZXggIT0gaW5kZXgpOwogCQkJaWYgKHBhZ2UtPm1hcHBpbmcgIT0gbWFwcGluZykgewogCQkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJcGFnZV9pbmRleCA9IHBhZ2UtPmluZGV4OwotCQkJbmV4dCA9IHBhZ2VfaW5kZXggKyAxOwotCQkJaWYgKG5leHQgPT0gMCkKLQkJCQl3cmFwcGVkID0gMTsKLQkJCWlmIChwYWdlX2luZGV4ID4gZW5kKSB7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9CiAJCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCQkJaWYgKHBhZ2VfbWFwcGVkKHBhZ2UpKSB7CiAJCQkJaWYgKCFkaWRfcmFuZ2VfdW5tYXApIHsKQEAgLTQ3NSw5ICs0NjMsOSBAQAogCQkJCQkgKiBaYXAgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgaW4gb25lIGhpdC4KIAkJCQkJICovCiAJCQkJCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywKLQkJCQkJICAgKGxvZmZfdClwYWdlX2luZGV4PDxQQUdFX0NBQ0hFX1NISUZULAotCQkJCQkgICAobG9mZl90KShlbmQgLSBwYWdlX2luZGV4ICsgMSkKLQkJCQkJCQk8PCBQQUdFX0NBQ0hFX1NISUZULAorCQkJCQkgICAobG9mZl90KWluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQsCisJCQkJCSAgIChsb2ZmX3QpKDEgKyBlbmQgLSBpbmRleCkKKwkJCQkJCQkgPDwgUEFHRV9DQUNIRV9TSElGVCwKIAkJCQkJICAgIDApOwogCQkJCQlkaWRfcmFuZ2VfdW5tYXAgPSAxOwogCQkJCX0gZWxzZSB7CkBAIC00ODUsOCArNDczLDggQEAKIAkJCQkJICogSnVzdCB6YXAgdGhpcyBwYWdlCiAJCQkJCSAqLwogCQkJCQl1bm1hcF9tYXBwaW5nX3JhbmdlKG1hcHBpbmcsCi0JCQkJCSAgKGxvZmZfdClwYWdlX2luZGV4PDxQQUdFX0NBQ0hFX1NISUZULAotCQkJCQkgIFBBR0VfQ0FDSEVfU0laRSwgMCk7CisJCQkJCSAgIChsb2ZmX3QpaW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCwKKwkJCQkJICAgUEFHRV9DQUNIRV9TSVpFLCAwKTsKIAkJCQl9CiAJCQl9CiAJCQlCVUdfT04ocGFnZV9tYXBwZWQocGFnZSkpOwpAQCAtNTAyLDYgKzQ5MCw3IEBACiAJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CiAJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfZW5kKCk7CiAJCWNvbmRfcmVzY2hlZCgpOworCQlpbmRleCsrOwogCX0KIAljbGVhbmNhY2hlX2ZsdXNoX2lub2RlKG1hcHBpbmcpOwogCXJldHVybiByZXQ7CkBAIC01MjYsOCArNTE1LDggQEAKIC8qKgogICogdHJ1bmNhdGVfcGFnZWNhY2hlIC0gdW5tYXAgYW5kIHJlbW92ZSBwYWdlY2FjaGUgdGhhdCBoYXMgYmVlbiB0cnVuY2F0ZWQKICAqIEBpbm9kZTogaW5vZGUKLSAqIEBvbGQ6IG9sZCBmaWxlIG9mZnNldAotICogQG5ldzogbmV3IGZpbGUgb2Zmc2V0CisgKiBAb2xkc2l6ZTogb2xkIGZpbGUgc2l6ZQorICogQG5ld3NpemU6IG5ldyBmaWxlIHNpemUKICAqCiAgKiBpbm9kZSdzIG5ldyBpX3NpemUgbXVzdCBhbHJlYWR5IGJlIHdyaXR0ZW4gYmVmb3JlIHRydW5jYXRlX3BhZ2VjYWNoZQogICogaXMgY2FsbGVkLgpAQCAtNTM5LDkgKzUyOCwxMCBAQAogICogc2l0dWF0aW9ucyBzdWNoIGFzIHdyaXRlcGFnZSBiZWluZyBjYWxsZWQgZm9yIGEgcGFnZSB0aGF0IGhhcyBhbHJlYWR5CiAgKiBoYWQgaXRzIHVuZGVybHlpbmcgYmxvY2tzIGRlYWxsb2NhdGVkLgogICovCi12b2lkIHRydW5jYXRlX3BhZ2VjYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2xkLCBsb2ZmX3QgbmV3KQordm9pZCB0cnVuY2F0ZV9wYWdlY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9sZHNpemUsIGxvZmZfdCBuZXdzaXplKQogewogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlsb2ZmX3QgaG9sZWJlZ2luID0gcm91bmRfdXAobmV3c2l6ZSwgUEFHRV9TSVpFKTsKIAogCS8qCiAJICogdW5tYXBfbWFwcGluZ19yYW5nZSBpcyBjYWxsZWQgdHdpY2UsIGZpcnN0IHNpbXBseSBmb3IKQEAgLTU1Miw5ICs1NDIsOSBAQAogCSAqIHRydW5jYXRlX2lub2RlX3BhZ2VzIGZpbmlzaGVzLCBoZW5jZSB0aGUgc2Vjb25kCiAJICogdW5tYXBfbWFwcGluZ19yYW5nZSBjYWxsIG11c3QgYmUgbWFkZSBmb3IgY29ycmVjdG5lc3MuCiAJICovCi0JdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBuZXcgKyBQQUdFX1NJWkUgLSAxLCAwLCAxKTsKLQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhtYXBwaW5nLCBuZXcpOwotCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgbmV3ICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7CisJdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBob2xlYmVnaW4sIDAsIDEpOworCXRydW5jYXRlX2lub2RlX3BhZ2VzKG1hcHBpbmcsIG5ld3NpemUpOworCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgaG9sZWJlZ2luLCAwLCAxKTsKIH0KIEVYUE9SVF9TWU1CT0wodHJ1bmNhdGVfcGFnZWNhY2hlKTsKIApAQCAtNTg0LDIyICs1NzQsNDcgQEAKIC8qKgogICogdm10cnVuY2F0ZSAtIHVubWFwIG1hcHBpbmdzICJmcmVlZCIgYnkgdHJ1bmNhdGUoKSBzeXNjYWxsCiAgKiBAaW5vZGU6IGlub2RlIG9mIHRoZSBmaWxlIHVzZWQKLSAqIEBvZmZzZXQ6IGZpbGUgb2Zmc2V0IHRvIHN0YXJ0IHRydW5jYXRpbmcKKyAqIEBuZXdzaXplOiBmaWxlIG9mZnNldCB0byBzdGFydCB0cnVuY2F0aW5nCiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGFuZCB0cnVuY2F0ZV9zZXRzaXplIG9yIHRydW5jYXRlX3BhZ2VjYWNoZQogICogc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCwgdG9nZXRoZXIgd2l0aCBmaWxlc3lzdGVtIHNwZWNpZmljIGJsb2NrIHRydW5jYXRpb24uCiAgKi8KLWludCB2bXRydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQpCitpbnQgdm10cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbmV3c2l6ZSkKIHsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IGlub2RlX25ld3NpemVfb2soaW5vZGUsIG9mZnNldCk7CisJZXJyb3IgPSBpbm9kZV9uZXdzaXplX29rKGlub2RlLCBuZXdzaXplKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCXRydW5jYXRlX3NldHNpemUoaW5vZGUsIG9mZnNldCk7CisJdHJ1bmNhdGVfc2V0c2l6ZShpbm9kZSwgbmV3c2l6ZSk7CiAJaWYgKGlub2RlLT5pX29wLT50cnVuY2F0ZSkKIAkJaW5vZGUtPmlfb3AtPnRydW5jYXRlKGlub2RlKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wodm10cnVuY2F0ZSk7CisKK2ludCB2bXRydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIGxvZmZfdCBsZW5kKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlsb2ZmX3QgaG9sZWJlZ2luID0gcm91bmRfdXAobHN0YXJ0LCBQQUdFX1NJWkUpOworCWxvZmZfdCBob2xlbGVuID0gMSArIGxlbmQgLSBob2xlYmVnaW47CisKKwkvKgorCSAqIElmIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gaXMgbm90IGdvaW5nIHRvIHByb3ZpZGUKKwkgKiBhIHdheSB0byB0cnVuY2F0ZSBhIHJhbmdlIG9mIGJsb2NrcyAocHVuY2ggYSBob2xlKSAtCisJICogd2Ugc2hvdWxkIHJldHVybiBmYWlsdXJlIHJpZ2h0IG5vdy4KKwkgKi8KKwlpZiAoIWlub2RlLT5pX29wLT50cnVuY2F0ZV9yYW5nZSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJaW5vZGVfZGlvX3dhaXQoaW5vZGUpOworCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgaG9sZWJlZ2luLCBob2xlbGVuLCAxKTsKKwlpbm9kZS0+aV9vcC0+dHJ1bmNhdGVfcmFuZ2UoaW5vZGUsIGxzdGFydCwgbGVuZCk7CisJLyogdW5tYXAgYWdhaW4gdG8gcmVtb3ZlIHJhY2lseSBDT1dlZCBwcml2YXRlIHBhZ2VzICovCisJdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBob2xlYmVnaW4sIGhvbGVsZW4sIDEpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tbS92bWFsbG9jLmMgYi9tbS92bWFsbG9jLmMKaW5kZXggMWQzNGQ3NS4uYWI4NDk0YyAxMDA2NDQKLS0tIGEvbW0vdm1hbGxvYy5jCisrKyBiL21tL3ZtYWxsb2MuYwpAQCAtNDUyLDEzICs0NTIsNiBAQAogCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CiB9CiAKLXN0YXRpYyB2b2lkIHJjdV9mcmVlX3ZhKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3Qgdm1hcF9hcmVhICp2YSA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3Qgdm1hcF9hcmVhLCByY3VfaGVhZCk7Ci0KLQlrZnJlZSh2YSk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9fZnJlZV92bWFwX2FyZWEoc3RydWN0IHZtYXBfYXJlYSAqdmEpCiB7CiAJQlVHX09OKFJCX0VNUFRZX05PREUoJnZhLT5yYl9ub2RlKSk7CkBAIC00OTEsNyArNDg0LDcgQEAKIAlpZiAodmEtPnZhX2VuZCA+IFZNQUxMT0NfU1RBUlQgJiYgdmEtPnZhX2VuZCA8PSBWTUFMTE9DX0VORCkKIAkJdm1hcF9hcmVhX3BjcHVfaG9sZSA9IG1heCh2bWFwX2FyZWFfcGNwdV9ob2xlLCB2YS0+dmFfZW5kKTsKIAotCWNhbGxfcmN1KCZ2YS0+cmN1X2hlYWQsIHJjdV9mcmVlX3ZhKTsKKwlrZnJlZV9yY3UodmEsIHJjdV9oZWFkKTsKIH0KIAogLyoKQEAgLTgzNywxMyArODMwLDYgQEAKIAlyZXR1cm4gdmI7CiB9CiAKLXN0YXRpYyB2b2lkIHJjdV9mcmVlX3ZiKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3Qgdm1hcF9ibG9jayAqdmIgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHZtYXBfYmxvY2ssIHJjdV9oZWFkKTsKLQotCWtmcmVlKHZiKTsKLX0KLQogc3RhdGljIHZvaWQgZnJlZV92bWFwX2Jsb2NrKHN0cnVjdCB2bWFwX2Jsb2NrICp2YikKIHsKIAlzdHJ1Y3Qgdm1hcF9ibG9jayAqdG1wOwpAQCAtODU2LDcgKzg0Miw3IEBACiAJQlVHX09OKHRtcCAhPSB2Yik7CiAKIAlmcmVlX3ZtYXBfYXJlYV9ub2ZsdXNoKHZiLT52YSk7Ci0JY2FsbF9yY3UoJnZiLT5yY3VfaGVhZCwgcmN1X2ZyZWVfdmIpOworCWtmcmVlX3JjdSh2YiwgcmN1X2hlYWQpOwogfQogCiBzdGF0aWMgdm9pZCBwdXJnZV9mcmFnbWVudGVkX2Jsb2NrcyhpbnQgY3B1KQpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCBmYWEwYTA4Li5mZWJiYzA0IDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtMjUwLDQ5ICsyNTAsOTAgQEAKIAkJdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhOwogCQl1bnNpZ25lZCBsb25nIHRvdGFsX3NjYW47CiAJCXVuc2lnbmVkIGxvbmcgbWF4X3Bhc3M7CisJCWludCBzaHJpbmtfcmV0ID0gMDsKKwkJbG9uZyBucjsKKwkJbG9uZyBuZXdfbnI7CisJCWxvbmcgYmF0Y2hfc2l6ZSA9IHNocmlua2VyLT5iYXRjaCA/IHNocmlua2VyLT5iYXRjaAorCQkJCQkJICA6IFNIUklOS19CQVRDSDsKIAorCQkvKgorCQkgKiBjb3B5IHRoZSBjdXJyZW50IHNocmlua2VyIHNjYW4gY291bnQgaW50byBhIGxvY2FsIHZhcmlhYmxlCisJCSAqIGFuZCB6ZXJvIGl0IHNvIHRoYXQgb3RoZXIgY29uY3VycmVudCBzaHJpbmtlciBpbnZvY2F0aW9ucworCQkgKiBkb24ndCBhbHNvIGRvIHRoaXMgc2Nhbm5pbmcgd29yay4KKwkJICovCisJCWRvIHsKKwkJCW5yID0gc2hyaW5rZXItPm5yOworCQl9IHdoaWxlIChjbXB4Y2hnKCZzaHJpbmtlci0+bnIsIG5yLCAwKSAhPSBucik7CisKKwkJdG90YWxfc2NhbiA9IG5yOwogCQltYXhfcGFzcyA9IGRvX3Nocmlua2VyX3NocmluayhzaHJpbmtlciwgc2hyaW5rLCAwKTsKIAkJZGVsdGEgPSAoNCAqIG5yX3BhZ2VzX3NjYW5uZWQpIC8gc2hyaW5rZXItPnNlZWtzOwogCQlkZWx0YSAqPSBtYXhfcGFzczsKIAkJZG9fZGl2KGRlbHRhLCBscnVfcGFnZXMgKyAxKTsKLQkJc2hyaW5rZXItPm5yICs9IGRlbHRhOwotCQlpZiAoc2hyaW5rZXItPm5yIDwgMCkgeworCQl0b3RhbF9zY2FuICs9IGRlbHRhOworCQlpZiAodG90YWxfc2NhbiA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAic2hyaW5rX3NsYWI6ICVwRiBuZWdhdGl2ZSBvYmplY3RzIHRvICIKIAkJCSAgICAgICAiZGVsZXRlIG5yPSVsZFxuIiwKLQkJCSAgICAgICBzaHJpbmtlci0+c2hyaW5rLCBzaHJpbmtlci0+bnIpOwotCQkJc2hyaW5rZXItPm5yID0gbWF4X3Bhc3M7CisJCQkgICAgICAgc2hyaW5rZXItPnNocmluaywgdG90YWxfc2Nhbik7CisJCQl0b3RhbF9zY2FuID0gbWF4X3Bhc3M7CiAJCX0KIAogCQkvKgorCQkgKiBXZSBuZWVkIHRvIGF2b2lkIGV4Y2Vzc2l2ZSB3aW5kdXAgb24gZmlsZXN5c3RlbSBzaHJpbmtlcnMKKwkJICogZHVlIHRvIGxhcmdlIG51bWJlcnMgb2YgR0ZQX05PRlMgYWxsb2NhdGlvbnMgY2F1c2luZyB0aGUKKwkJICogc2hyaW5rZXJzIHRvIHJldHVybiAtMSBhbGwgdGhlIHRpbWUuIFRoaXMgcmVzdWx0cyBpbiBhIGxhcmdlCisJCSAqIG5yIGJlaW5nIGJ1aWx0IHVwIHNvIHdoZW4gYSBzaHJpbmsgdGhhdCBjYW4gZG8gc29tZSB3b3JrCisJCSAqIGNvbWVzIGFsb25nIGl0IGVtcHRpZXMgdGhlIGVudGlyZSBjYWNoZSBkdWUgdG8gbnIgPj4+CisJCSAqIG1heF9wYXNzLiAgVGhpcyBpcyBiYWQgZm9yIHN1c3RhaW5pbmcgYSB3b3JraW5nIHNldCBpbgorCQkgKiBtZW1vcnkuCisJCSAqCisJCSAqIEhlbmNlIG9ubHkgYWxsb3cgdGhlIHNocmlua2VyIHRvIHNjYW4gdGhlIGVudGlyZSBjYWNoZSB3aGVuCisJCSAqIGEgbGFyZ2UgZGVsdGEgY2hhbmdlIGlzIGNhbGN1bGF0ZWQgZGlyZWN0bHkuCisJCSAqLworCQlpZiAoZGVsdGEgPCBtYXhfcGFzcyAvIDQpCisJCQl0b3RhbF9zY2FuID0gbWluKHRvdGFsX3NjYW4sIG1heF9wYXNzIC8gMik7CisKKwkJLyoKIAkJICogQXZvaWQgcmlza2luZyBsb29waW5nIGZvcmV2ZXIgZHVlIHRvIHRvbyBsYXJnZSBuciB2YWx1ZToKIAkJICogbmV2ZXIgdHJ5IHRvIGZyZWUgbW9yZSB0aGFuIHR3aWNlIHRoZSBlc3RpbWF0ZSBudW1iZXIgb2YKIAkJICogZnJlZWFibGUgZW50cmllcy4KIAkJICovCi0JCWlmIChzaHJpbmtlci0+bnIgPiBtYXhfcGFzcyAqIDIpCi0JCQlzaHJpbmtlci0+bnIgPSBtYXhfcGFzcyAqIDI7CisJCWlmICh0b3RhbF9zY2FuID4gbWF4X3Bhc3MgKiAyKQorCQkJdG90YWxfc2NhbiA9IG1heF9wYXNzICogMjsKIAotCQl0b3RhbF9zY2FuID0gc2hyaW5rZXItPm5yOwotCQlzaHJpbmtlci0+bnIgPSAwOworCQl0cmFjZV9tbV9zaHJpbmtfc2xhYl9zdGFydChzaHJpbmtlciwgc2hyaW5rLCBuciwKKwkJCQkJbnJfcGFnZXNfc2Nhbm5lZCwgbHJ1X3BhZ2VzLAorCQkJCQltYXhfcGFzcywgZGVsdGEsIHRvdGFsX3NjYW4pOwogCi0JCXdoaWxlICh0b3RhbF9zY2FuID49IFNIUklOS19CQVRDSCkgewotCQkJbG9uZyB0aGlzX3NjYW4gPSBTSFJJTktfQkFUQ0g7Ci0JCQlpbnQgc2hyaW5rX3JldDsKKwkJd2hpbGUgKHRvdGFsX3NjYW4gPj0gYmF0Y2hfc2l6ZSkgewogCQkJaW50IG5yX2JlZm9yZTsKIAogCQkJbnJfYmVmb3JlID0gZG9fc2hyaW5rZXJfc2hyaW5rKHNocmlua2VyLCBzaHJpbmssIDApOwogCQkJc2hyaW5rX3JldCA9IGRvX3Nocmlua2VyX3NocmluayhzaHJpbmtlciwgc2hyaW5rLAotCQkJCQkJCXRoaXNfc2Nhbik7CisJCQkJCQkJYmF0Y2hfc2l6ZSk7CiAJCQlpZiAoc2hyaW5rX3JldCA9PSAtMSkKIAkJCQlicmVhazsKIAkJCWlmIChzaHJpbmtfcmV0IDwgbnJfYmVmb3JlKQogCQkJCXJldCArPSBucl9iZWZvcmUgLSBzaHJpbmtfcmV0OwotCQkJY291bnRfdm1fZXZlbnRzKFNMQUJTX1NDQU5ORUQsIHRoaXNfc2Nhbik7Ci0JCQl0b3RhbF9zY2FuIC09IHRoaXNfc2NhbjsKKwkJCWNvdW50X3ZtX2V2ZW50cyhTTEFCU19TQ0FOTkVELCBiYXRjaF9zaXplKTsKKwkJCXRvdGFsX3NjYW4gLT0gYmF0Y2hfc2l6ZTsKIAogCQkJY29uZF9yZXNjaGVkKCk7CiAJCX0KIAotCQlzaHJpbmtlci0+bnIgKz0gdG90YWxfc2NhbjsKKwkJLyoKKwkJICogbW92ZSB0aGUgdW51c2VkIHNjYW4gY291bnQgYmFjayBpbnRvIHRoZSBzaHJpbmtlciBpbiBhCisJCSAqIG1hbm5lciB0aGF0IGhhbmRsZXMgY29uY3VycmVudCB1cGRhdGVzLiBJZiB3ZSBleGhhdXN0ZWQgdGhlCisJCSAqIHNjYW4sIHRoZXJlIGlzIG5vIG5lZWQgdG8gZG8gYW4gdXBkYXRlLgorCQkgKi8KKwkJZG8geworCQkJbnIgPSBzaHJpbmtlci0+bnI7CisJCQluZXdfbnIgPSB0b3RhbF9zY2FuICsgbnI7CisJCQlpZiAodG90YWxfc2NhbiA8PSAwKQorCQkJCWJyZWFrOworCQl9IHdoaWxlIChjbXB4Y2hnKCZzaHJpbmtlci0+bnIsIG5yLCBuZXdfbnIpICE9IG5yKTsKKworCQl0cmFjZV9tbV9zaHJpbmtfc2xhYl9lbmQoc2hyaW5rZXIsIHNocmlua19yZXQsIG5yLCBuZXdfbnIpOwogCX0KIAl1cF9yZWFkKCZzaHJpbmtlcl9yd3NlbSk7CiBvdXQ6CkBAIC0xMTI0LDggKzExNjUsMjAgQEAKIAkJCQkJbnJfbHVtcHlfZGlydHkrKzsKIAkJCQlzY2FuKys7CiAJCQl9IGVsc2UgewotCQkJCS8qIHRoZSBwYWdlIGlzIGZyZWVkIGFscmVhZHkuICovCi0JCQkJaWYgKCFwYWdlX2NvdW50KGN1cnNvcl9wYWdlKSkKKwkJCQkvKgorCQkJCSAqIENoZWNrIGlmIHRoZSBwYWdlIGlzIGZyZWVkIGFscmVhZHkuCisJCQkJICoKKwkJCQkgKiBXZSBjYW4ndCB1c2UgcGFnZV9jb3VudCgpIGFzIHRoYXQKKwkJCQkgKiByZXF1aXJlcyBjb21wb3VuZF9oZWFkIGFuZCB3ZSBkb24ndAorCQkJCSAqIGhhdmUgYSBwaW4gb24gdGhlIHBhZ2UgaGVyZS4gSWYgYQorCQkJCSAqIHBhZ2UgaXMgdGFpbCwgd2UgbWF5IG9yIG1heSBub3QKKwkJCQkgKiBoYXZlIGlzb2xhdGVkIHRoZSBoZWFkLCBzbyBhc3N1bWUKKwkJCQkgKiBpdCdzIG5vdCBmcmVlLCBpdCdkIGJlIHRyaWNreSB0bworCQkJCSAqIHRyYWNrIHRoZSBoZWFkIHN0YXR1cyB3aXRob3V0IGEKKwkJCQkgKiBwYWdlIHBpbi4KKwkJCQkgKi8KKwkJCQlpZiAoIVBhZ2VUYWlsKGN1cnNvcl9wYWdlKSAmJgorCQkJCSAgICAhYXRvbWljX3JlYWQoJmN1cnNvcl9wYWdlLT5fY291bnQpKQogCQkJCQljb250aW51ZTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTE5ODMsMTQgKzIwMzYsMTMgQEAKICAqIElmIGEgem9uZSBpcyBkZWVtZWQgdG8gYmUgZnVsbCBvZiBwaW5uZWQgcGFnZXMgdGhlbiBqdXN0IGdpdmUgaXQgYSBsaWdodAogICogc2NhbiB0aGVuIGdpdmUgdXAgb24gaXQuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNocmlua196b25lcyhpbnQgcHJpb3JpdHksIHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsCitzdGF0aWMgdm9pZCBzaHJpbmtfem9uZXMoaW50IHByaW9yaXR5LCBzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LAogCQkJCQlzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKIHsKIAlzdHJ1Y3Qgem9uZXJlZiAqejsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIAl1bnNpZ25lZCBsb25nIG5yX3NvZnRfcmVjbGFpbWVkOwogCXVuc2lnbmVkIGxvbmcgbnJfc29mdF9zY2FubmVkOwotCXVuc2lnbmVkIGxvbmcgdG90YWxfc2Nhbm5lZCA9IDA7CiAKIAlmb3JfZWFjaF96b25lX3pvbmVsaXN0X25vZGVtYXNrKHpvbmUsIHosIHpvbmVsaXN0LAogCQkJCQlnZnBfem9uZShzYy0+Z2ZwX21hc2spLCBzYy0+bm9kZW1hc2spIHsKQEAgLTIwMDUsMTkgKzIwNTcsMjMgQEAKIAkJCQljb250aW51ZTsKIAkJCWlmICh6b25lLT5hbGxfdW5yZWNsYWltYWJsZSAmJiBwcmlvcml0eSAhPSBERUZfUFJJT1JJVFkpCiAJCQkJY29udGludWU7CS8qIExldCBrc3dhcGQgcG9sbCBpdCAqLworCQkJLyoKKwkJCSAqIFRoaXMgc3RlYWxzIHBhZ2VzIGZyb20gbWVtb3J5IGNncm91cHMgb3ZlciBzb2Z0bGltaXQKKwkJCSAqIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIHBhZ2VzIGFuZAorCQkJICogc2Nhbm5lZCBwYWdlcy4gVGhpcyB3b3JrcyBmb3IgZ2xvYmFsIG1lbW9yeSBwcmVzc3VyZQorCQkJICogYW5kIGJhbGFuY2luZywgbm90IGZvciBhIG1lbWNnJ3MgbGltaXQuCisJCQkgKi8KKwkJCW5yX3NvZnRfc2Nhbm5lZCA9IDA7CisJCQlucl9zb2Z0X3JlY2xhaW1lZCA9IG1lbV9jZ3JvdXBfc29mdF9saW1pdF9yZWNsYWltKHpvbmUsCisJCQkJCQlzYy0+b3JkZXIsIHNjLT5nZnBfbWFzaywKKwkJCQkJCSZucl9zb2Z0X3NjYW5uZWQpOworCQkJc2MtPm5yX3JlY2xhaW1lZCArPSBucl9zb2Z0X3JlY2xhaW1lZDsKKwkJCXNjLT5ucl9zY2FubmVkICs9IG5yX3NvZnRfc2Nhbm5lZDsKKwkJCS8qIG5lZWQgc29tZSBjaGVjayBmb3IgYXZvaWQgbW9yZSBzaHJpbmtfem9uZSgpICovCiAJCX0KIAotCQlucl9zb2Z0X3NjYW5uZWQgPSAwOwotCQlucl9zb2Z0X3JlY2xhaW1lZCA9IG1lbV9jZ3JvdXBfc29mdF9saW1pdF9yZWNsYWltKHpvbmUsCi0JCQkJCQkJc2MtPm9yZGVyLCBzYy0+Z2ZwX21hc2ssCi0JCQkJCQkJJm5yX3NvZnRfc2Nhbm5lZCk7Ci0JCXNjLT5ucl9yZWNsYWltZWQgKz0gbnJfc29mdF9yZWNsYWltZWQ7Ci0JCXRvdGFsX3NjYW5uZWQgKz0gbnJfc29mdF9zY2FubmVkOwotCiAJCXNocmlua196b25lKHByaW9yaXR5LCB6b25lLCBzYyk7CiAJfQotCi0JcmV0dXJuIHRvdGFsX3NjYW5uZWQ7CiB9CiAKIHN0YXRpYyBib29sIHpvbmVfcmVjbGFpbWFibGUoc3RydWN0IHpvbmUgKnpvbmUpCkBAIC0yMDgxLDggKzIxMzcsOCBAQAogCWZvciAocHJpb3JpdHkgPSBERUZfUFJJT1JJVFk7IHByaW9yaXR5ID49IDA7IHByaW9yaXR5LS0pIHsKIAkJc2MtPm5yX3NjYW5uZWQgPSAwOwogCQlpZiAoIXByaW9yaXR5KQotCQkJZGlzYWJsZV9zd2FwX3Rva2VuKCk7Ci0JCXRvdGFsX3NjYW5uZWQgKz0gc2hyaW5rX3pvbmVzKHByaW9yaXR5LCB6b25lbGlzdCwgc2MpOworCQkJZGlzYWJsZV9zd2FwX3Rva2VuKHNjLT5tZW1fY2dyb3VwKTsKKwkJc2hyaW5rX3pvbmVzKHByaW9yaXR5LCB6b25lbGlzdCwgc2MpOwogCQkvKgogCQkgKiBEb24ndCBzaHJpbmsgc2xhYnMgd2hlbiByZWNsYWltaW5nIG1lbW9yeSBmcm9tCiAJCSAqIG92ZXIgbGltaXQgY2dyb3VwcwpAQCAtMjI5NSw3ICsyMzUxLDggQEAKIAlmb3IgKGkgPSAwOyBpIDw9IGNsYXNzem9uZV9pZHg7IGkrKykKIAkJcHJlc2VudF9wYWdlcyArPSBwZ2RhdC0+bm9kZV96b25lc1tpXS5wcmVzZW50X3BhZ2VzOwogCi0JcmV0dXJuIGJhbGFuY2VkX3BhZ2VzID4gKHByZXNlbnRfcGFnZXMgPj4gMik7CisJLyogQSBzcGVjaWFsIGNhc2UgaGVyZTogaWYgem9uZSBoYXMgbm8gcGFnZSwgd2UgdGhpbmsgaXQncyBiYWxhbmNlZCAqLworCXJldHVybiBiYWxhbmNlZF9wYWdlcyA+PSAocHJlc2VudF9wYWdlcyA+PiAyKTsKIH0KIAogLyogaXMga3N3YXBkIHNsZWVwaW5nIHByZW1hdHVyZWx5PyAqLwpAQCAtMjMxMSw3ICsyMzY4LDcgQEAKIAkJcmV0dXJuIHRydWU7CiAKIAkvKiBDaGVjayB0aGUgd2F0ZXJtYXJrIGxldmVscyAqLwotCWZvciAoaSA9IDA7IGkgPCBwZ2RhdC0+bnJfem9uZXM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPD0gY2xhc3N6b25lX2lkeDsgaSsrKSB7CiAJCXN0cnVjdCB6b25lICp6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyBpOwogCiAJCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCkBAIC0yMzI5LDcgKzIzODYsNyBAQAogCQl9CiAKIAkJaWYgKCF6b25lX3dhdGVybWFya19va19zYWZlKHpvbmUsIG9yZGVyLCBoaWdoX3dtYXJrX3BhZ2VzKHpvbmUpLAotCQkJCQkJCWNsYXNzem9uZV9pZHgsIDApKQorCQkJCQkJCWksIDApKQogCQkJYWxsX3pvbmVzX29rID0gZmFsc2U7CiAJCWVsc2UKIAkJCWJhbGFuY2VkICs9IHpvbmUtPnByZXNlbnRfcGFnZXM7CkBAIC0yNDA3LDcgKzI0NjQsNyBAQAogCiAJCS8qIFRoZSBzd2FwIHRva2VuIGdldHMgaW4gdGhlIHdheSBvZiBzd2Fwb3V0Li4uICovCiAJCWlmICghcHJpb3JpdHkpCi0JCQlkaXNhYmxlX3N3YXBfdG9rZW4oKTsKKwkJCWRpc2FibGVfc3dhcF90b2tlbihOVUxMKTsKIAogCQlhbGxfem9uZXNfb2sgPSAxOwogCQliYWxhbmNlZCA9IDA7CkBAIC0yNDM2LDcgKzI0OTMsNiBAQAogCQkJaWYgKCF6b25lX3dhdGVybWFya19va19zYWZlKHpvbmUsIG9yZGVyLAogCQkJCQloaWdoX3dtYXJrX3BhZ2VzKHpvbmUpLCAwLCAwKSkgewogCQkJCWVuZF96b25lID0gaTsKLQkJCQkqY2xhc3N6b25lX2lkeCA9IGk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTI0OTUsMTggKzI1NTEsMTggQEAKIAkJCQlLU1dBUERfWk9ORV9CQUxBTkNFX0dBUF9SQVRJTyk7CiAJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rX3NhZmUoem9uZSwgb3JkZXIsCiAJCQkJCWhpZ2hfd21hcmtfcGFnZXMoem9uZSkgKyBiYWxhbmNlX2dhcCwKLQkJCQkJZW5kX3pvbmUsIDApKQorCQkJCQllbmRfem9uZSwgMCkpIHsKIAkJCQlzaHJpbmtfem9uZShwcmlvcml0eSwgem9uZSwgJnNjKTsKLQkJCXJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiID0gMDsKLQkJCW5yX3NsYWIgPSBzaHJpbmtfc2xhYigmc2hyaW5rLCBzYy5ucl9zY2FubmVkLCBscnVfcGFnZXMpOwotCQkJc2MubnJfcmVjbGFpbWVkICs9IHJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiOwotCQkJdG90YWxfc2Nhbm5lZCArPSBzYy5ucl9zY2FubmVkOwogCi0JCQlpZiAoem9uZS0+YWxsX3VucmVjbGFpbWFibGUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAobnJfc2xhYiA9PSAwICYmCi0JCQkgICAgIXpvbmVfcmVjbGFpbWFibGUoem9uZSkpCi0JCQkJem9uZS0+YWxsX3VucmVjbGFpbWFibGUgPSAxOworCQkJCXJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiID0gMDsKKwkJCQlucl9zbGFiID0gc2hyaW5rX3NsYWIoJnNocmluaywgc2MubnJfc2Nhbm5lZCwgbHJ1X3BhZ2VzKTsKKwkJCQlzYy5ucl9yZWNsYWltZWQgKz0gcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWI7CisJCQkJdG90YWxfc2Nhbm5lZCArPSBzYy5ucl9zY2FubmVkOworCisJCQkJaWYgKG5yX3NsYWIgPT0gMCAmJiAhem9uZV9yZWNsYWltYWJsZSh6b25lKSkKKwkJCQkJem9uZS0+YWxsX3VucmVjbGFpbWFibGUgPSAxOworCQkJfQorCiAJCQkvKgogCQkJICogSWYgd2UndmUgZG9uZSBhIGRlY2VudCBhbW91bnQgb2Ygc2Nhbm5pbmcgYW5kCiAJCQkgKiB0aGUgcmVjbGFpbSByYXRpbyBpcyBsb3csIHN0YXJ0IGRvaW5nIHdyaXRlcGFnZQpAQCAtMjUxNiw2ICsyNTcyLDEyIEBACiAJCQkgICAgdG90YWxfc2Nhbm5lZCA+IHNjLm5yX3JlY2xhaW1lZCArIHNjLm5yX3JlY2xhaW1lZCAvIDIpCiAJCQkJc2MubWF5X3dyaXRlcGFnZSA9IDE7CiAKKwkJCWlmICh6b25lLT5hbGxfdW5yZWNsYWltYWJsZSkgeworCQkJCWlmIChlbmRfem9uZSAmJiBlbmRfem9uZSA9PSBpKQorCQkJCQllbmRfem9uZS0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCiAJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rX3NhZmUoem9uZSwgb3JkZXIsCiAJCQkJCWhpZ2hfd21hcmtfcGFnZXMoem9uZSksIGVuZF96b25lLCAwKSkgewogCQkJCWFsbF96b25lc19vayA9IDA7CkBAIC0yNjk0LDggKzI3NTYsOCBAQAogICovCiBzdGF0aWMgaW50IGtzd2FwZCh2b2lkICpwKQogewotCXVuc2lnbmVkIGxvbmcgb3JkZXI7Ci0JaW50IGNsYXNzem9uZV9pZHg7CisJdW5zaWduZWQgbG9uZyBvcmRlciwgbmV3X29yZGVyOworCWludCBjbGFzc3pvbmVfaWR4LCBuZXdfY2xhc3N6b25lX2lkeDsKIAlwZ19kYXRhX3QgKnBnZGF0ID0gKHBnX2RhdGFfdCopcDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAKQEAgLTI3MjUsMTcgKzI3ODcsMjMgQEAKIAl0c2stPmZsYWdzIHw9IFBGX01FTUFMTE9DIHwgUEZfU1dBUFdSSVRFIHwgUEZfS1NXQVBEOwogCXNldF9mcmVlemFibGUoKTsKIAotCW9yZGVyID0gMDsKLQljbGFzc3pvbmVfaWR4ID0gTUFYX05SX1pPTkVTIC0gMTsKKwlvcmRlciA9IG5ld19vcmRlciA9IDA7CisJY2xhc3N6b25lX2lkeCA9IG5ld19jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPm5yX3pvbmVzIC0gMTsKIAlmb3IgKCA7IDsgKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbmV3X29yZGVyOwotCQlpbnQgbmV3X2NsYXNzem9uZV9pZHg7CiAJCWludCByZXQ7CiAKLQkJbmV3X29yZGVyID0gcGdkYXQtPmtzd2FwZF9tYXhfb3JkZXI7Ci0JCW5ld19jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPmNsYXNzem9uZV9pZHg7Ci0JCXBnZGF0LT5rc3dhcGRfbWF4X29yZGVyID0gMDsKLQkJcGdkYXQtPmNsYXNzem9uZV9pZHggPSBNQVhfTlJfWk9ORVMgLSAxOworCQkvKgorCQkgKiBJZiB0aGUgbGFzdCBiYWxhbmNlX3BnZGF0IHdhcyB1bnN1Y2Nlc3NmdWwgaXQncyB1bmxpa2VseSBhCisJCSAqIG5ldyByZXF1ZXN0IG9mIGEgc2ltaWxhciBvciBoYXJkZXIgdHlwZSB3aWxsIHN1Y2NlZWQgc29vbgorCQkgKiBzbyBjb25zaWRlciBnb2luZyB0byBzbGVlcCBvbiB0aGUgYmFzaXMgd2UgcmVjbGFpbWVkIGF0CisJCSAqLworCQlpZiAoY2xhc3N6b25lX2lkeCA+PSBuZXdfY2xhc3N6b25lX2lkeCAmJiBvcmRlciA9PSBuZXdfb3JkZXIpIHsKKwkJCW5ld19vcmRlciA9IHBnZGF0LT5rc3dhcGRfbWF4X29yZGVyOworCQkJbmV3X2NsYXNzem9uZV9pZHggPSBwZ2RhdC0+Y2xhc3N6b25lX2lkeDsKKwkJCXBnZGF0LT5rc3dhcGRfbWF4X29yZGVyID0gIDA7CisJCQlwZ2RhdC0+Y2xhc3N6b25lX2lkeCA9IHBnZGF0LT5ucl96b25lcyAtIDE7CisJCX0KKwogCQlpZiAob3JkZXIgPCBuZXdfb3JkZXIgfHwgY2xhc3N6b25lX2lkeCA+IG5ld19jbGFzc3pvbmVfaWR4KSB7CiAJCQkvKgogCQkJICogRG9uJ3Qgc2xlZXAgaWYgc29tZW9uZSB3YW50cyBhIGxhcmdlciAnb3JkZXInCkBAIC0yNzQ4LDcgKzI4MTYsNyBAQAogCQkJb3JkZXIgPSBwZ2RhdC0+a3N3YXBkX21heF9vcmRlcjsKIAkJCWNsYXNzem9uZV9pZHggPSBwZ2RhdC0+Y2xhc3N6b25lX2lkeDsKIAkJCXBnZGF0LT5rc3dhcGRfbWF4X29yZGVyID0gMDsKLQkJCXBnZGF0LT5jbGFzc3pvbmVfaWR4ID0gTUFYX05SX1pPTkVTIC0gMTsKKwkJCXBnZGF0LT5jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPm5yX3pvbmVzIC0gMTsKIAkJfQogCiAJCXJldCA9IHRyeV90b19mcmVlemUoKTsKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuLmMgYi9uZXQvODAyMXEvdmxhbi5jCmluZGV4IGM3YTU4MWEuLjg5NzBiYTEgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW4uYwpAQCAtMTgsNiArMTgsOCBAQAogICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpAQCAtMTMyLDggKzEzNCw2IEBACiAJCXZsYW5fZ3ZycF91bmluaXRfYXBwbGljYW50KHJlYWxfZGV2KTsKIAogCQlyY3VfYXNzaWduX3BvaW50ZXIocmVhbF9kZXYtPnZsZ3JwLCBOVUxMKTsKLQkJaWYgKG9wcy0+bmRvX3ZsYW5fcnhfcmVnaXN0ZXIpCi0JCQlvcHMtPm5kb192bGFuX3J4X3JlZ2lzdGVyKHJlYWxfZGV2LCBOVUxMKTsKIAogCQkvKiBGcmVlIHRoZSBncm91cCwgYWZ0ZXIgYWxsIGNwdSdzIGFyZSBkb25lLiAqLwogCQljYWxsX3JjdSgmZ3JwLT5yY3UsIHZsYW5fcmN1X2ZyZWUpOwpAQCAtMTQ5LDEzICsxNDksMTMgQEAKIAljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IHJlYWxfZGV2LT5uZXRkZXZfb3BzOwogCiAJaWYgKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEKSB7Ci0JCXByX2luZm8oIjgwMjFxOiBWTEFOcyBub3Qgc3VwcG9ydGVkIG9uICVzXG4iLCBuYW1lKTsKKwkJcHJfaW5mbygiVkxBTnMgbm90IHN1cHBvcnRlZCBvbiAlc1xuIiwgbmFtZSk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKIAlpZiAoKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpICYmCiAJICAgICghb3BzLT5uZG9fdmxhbl9yeF9hZGRfdmlkIHx8ICFvcHMtPm5kb192bGFuX3J4X2tpbGxfdmlkKSkgewotCQlwcl9pbmZvKCI4MDIxcTogRGV2aWNlICVzIGhhcyBidWdneSBWTEFOIGh3IGFjY2VsXG4iLCBuYW1lKTsKKwkJcHJfaW5mbygiRGV2aWNlICVzIGhhcyBidWdneSBWTEFOIGh3IGFjY2VsXG4iLCBuYW1lKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIApAQCAtMjA1LDggKzIwNSw2IEBACiAJZ3JwLT5ucl92bGFucysrOwogCiAJaWYgKG5ncnApIHsKLQkJaWYgKG9wcy0+bmRvX3ZsYW5fcnhfcmVnaXN0ZXIpCi0JCQlvcHMtPm5kb192bGFuX3J4X3JlZ2lzdGVyKHJlYWxfZGV2LCBuZ3JwKTsKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKHJlYWxfZGV2LT52bGdycCwgbmdycCk7CiAJfQogCWlmIChyZWFsX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKQpAQCAtMzQ0LDEzICszNDIsMTIgQEAKIAljYXNlIE5FVERFVl9DSEFOR0VOQU1FOgogCQl2bGFuX3Byb2NfcmVtX2RldihkZXYpOwogCQlpZiAodmxhbl9wcm9jX2FkZF9kZXYoZGV2KSA8IDApCi0JCQlwcl93YXJuaW5nKCI4MDIxcTogZmFpbGVkIHRvIGNoYW5nZSBwcm9jIG5hbWUgZm9yICVzXG4iLAotCQkJCQlkZXYtPm5hbWUpOworCQkJcHJfd2FybigiZmFpbGVkIHRvIGNoYW5nZSBwcm9jIG5hbWUgZm9yICVzXG4iLAorCQkJCWRldi0+bmFtZSk7CiAJCWJyZWFrOwogCWNhc2UgTkVUREVWX1JFR0lTVEVSOgogCQlpZiAodmxhbl9wcm9jX2FkZF9kZXYoZGV2KSA8IDApCi0JCQlwcl93YXJuaW5nKCI4MDIxcTogZmFpbGVkIHRvIGFkZCBwcm9jIGVudHJ5IGZvciAlc1xuIiwKLQkJCQkJZGV2LT5uYW1lKTsKKwkJCXByX3dhcm4oImZhaWxlZCB0byBhZGQgcHJvYyBlbnRyeSBmb3IgJXNcbiIsIGRldi0+bmFtZSk7CiAJCWJyZWFrOwogCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CiAJCXZsYW5fcHJvY19yZW1fZGV2KGRldik7CkBAIC0zNzQsNyArMzcxLDcgQEAKIAlpZiAoKGV2ZW50ID09IE5FVERFVl9VUCkgJiYKIAkgICAgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKSAmJgogCSAgICBkZXYtPm5ldGRldl9vcHMtPm5kb192bGFuX3J4X2FkZF92aWQpIHsKLQkJcHJfaW5mbygiODAyMXE6IGFkZGluZyBWTEFOIDAgdG8gSFcgZmlsdGVyIG9uIGRldmljZSAlc1xuIiwKKwkJcHJfaW5mbygiYWRkaW5nIFZMQU4gMCB0byBIVyBmaWx0ZXIgb24gZGV2aWNlICVzXG4iLAogCQkJZGV2LT5uYW1lKTsKIAkJZGV2LT5uZXRkZXZfb3BzLT5uZG9fdmxhbl9yeF9hZGRfdmlkKGRldiwgMCk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW4uaCBiL25ldC84MDIxcS92bGFuLmgKaW5kZXggOWRhMDdlMy4uOWZkNDVmMyAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW4uaAorKysgYi9uZXQvODAyMXEvdmxhbi5oCkBAIC03NCw2ICs3NCwzNyBAQAogCXJldHVybiBuZXRkZXZfcHJpdihkZXYpOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2dyb3VwX2dldF9kZXZpY2Uoc3RydWN0IHZsYW5fZ3JvdXAgKnZnLAorCQkJCQkJICAgICAgIHUxNiB2bGFuX2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICoqYXJyYXk7CisJYXJyYXkgPSB2Zy0+dmxhbl9kZXZpY2VzX2FycmF5c1t2bGFuX2lkIC8gVkxBTl9HUk9VUF9BUlJBWV9QQVJUX0xFTl07CisJcmV0dXJuIGFycmF5ID8gYXJyYXlbdmxhbl9pZCAlIFZMQU5fR1JPVVBfQVJSQVlfUEFSVF9MRU5dIDogTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZsYW5fZ3JvdXBfc2V0X2RldmljZShzdHJ1Y3Qgdmxhbl9ncm91cCAqdmcsCisJCQkJCSB1MTYgdmxhbl9pZCwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKiphcnJheTsKKwlpZiAoIXZnKQorCQlyZXR1cm47CisJYXJyYXkgPSB2Zy0+dmxhbl9kZXZpY2VzX2FycmF5c1t2bGFuX2lkIC8gVkxBTl9HUk9VUF9BUlJBWV9QQVJUX0xFTl07CisJYXJyYXlbdmxhbl9pZCAlIFZMQU5fR1JPVVBfQVJSQVlfUEFSVF9MRU5dID0gZGV2OworfQorCisvKiBNdXN0IGJlIGludm9rZWQgd2l0aCByY3VfcmVhZF9sb2NrIG9yIHdpdGggUlROTC4gKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZmluZF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2LAorCQkJCQkgICAgICAgdTE2IHZsYW5faWQpCit7CisJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKHJlYWxfZGV2LT52bGdycCk7CisKKwlpZiAoZ3JwKQorCQlyZXR1cm4gdmxhbl9ncm91cF9nZXRfZGV2aWNlKGdycCwgdmxhbl9pZCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKwogLyogZm91bmQgaW4gdmxhbl9kZXYuYyAqLwogdm9pZCB2bGFuX2Rldl9zZXRfaW5ncmVzc19wcmlvcml0eShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHUzMiBza2JfcHJpbywgdTE2IHZsYW5fcHJpbyk7CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbl9jb3JlLmMgYi9uZXQvODAyMXEvdmxhbl9jb3JlLmMKaW5kZXggNDE0OTVkYzIuLjVmMjdmOGUgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuX2NvcmUuYworKysgYi9uZXQvODAyMXEvdmxhbl9jb3JlLmMKQEAgLTIzLDYgKzIzLDMxIEBACiAJCXJldHVybiBmYWxzZTsKIAogCXNrYi0+ZGV2ID0gdmxhbl9kZXY7CisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkgeworCQkvKiBPdXIgbG93ZXIgbGF5ZXIgdGhpbmtzIHRoaXMgaXMgbm90IGxvY2FsLCBsZXQncyBtYWtlIHN1cmUuCisJCSAqIFRoaXMgYWxsb3dzIHRoZSBWTEFOIHRvIGhhdmUgYSBkaWZmZXJlbnQgTUFDIHRoYW4gdGhlCisJCSAqIHVuZGVybHlpbmcgZGV2aWNlLCBhbmQgc3RpbGwgcm91dGUgY29ycmVjdGx5LiAqLworCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihldGhfaGRyKHNrYiktPmhfZGVzdCwKKwkJCQkJdmxhbl9kZXYtPmRldl9hZGRyKSkKKwkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwl9CisKKwlpZiAoISh2bGFuX2Rldl9pbmZvKHZsYW5fZGV2KS0+ZmxhZ3MgJiBWTEFOX0ZMQUdfUkVPUkRFUl9IRFIpKSB7CisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpOworCisJCS8qCisJCSAqIHZsYW5faW5zZXJ0X3RhZyBleHBlY3Qgc2tiLT5kYXRhIHBvaW50aW5nIHRvIG1hYyBoZWFkZXIuCisJCSAqIFNvIGNoYW5nZSBza2ItPmRhdGEgYmVmb3JlIGNhbGxpbmcgaXQgYW5kIGNoYW5nZSBiYWNrIHRvCisJCSAqIG9yaWdpbmFsIHBvc2l0aW9uIGxhdGVyCisJCSAqLworCQlza2JfcHVzaChza2IsIG9mZnNldCk7CisJCXNrYiA9ICpza2JwID0gdmxhbl9pbnNlcnRfdGFnKHNrYiwgc2tiLT52bGFuX3RjaSk7CisJCWlmICghc2tiKQorCQkJcmV0dXJuIGZhbHNlOworCQlza2JfcHVsbChza2IsIG9mZnNldCArIFZMQU5fSExFTik7CisJCXNrYl9yZXNldF9tYWNfbGVuKHNrYik7CisJfQorCiAJc2tiLT5wcmlvcml0eSA9IHZsYW5fZ2V0X2luZ3Jlc3NfcHJpb3JpdHkodmxhbl9kZXYsIHNrYi0+dmxhbl90Y2kpOwogCXNrYi0+dmxhbl90Y2kgPSAwOwogCkBAIC0zMSwyNyArNTYsMzQgQEAKIAl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9zdGF0cy0+c3luY3ApOwogCXJ4X3N0YXRzLT5yeF9wYWNrZXRzKys7CiAJcnhfc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOwotCi0Jc3dpdGNoIChza2ItPnBrdF90eXBlKSB7Ci0JY2FzZSBQQUNLRVRfQlJPQURDQVNUOgotCQlicmVhazsKLQljYXNlIFBBQ0tFVF9NVUxUSUNBU1Q6CisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX01VTFRJQ0FTVCkKIAkJcnhfc3RhdHMtPnJ4X211bHRpY2FzdCsrOwotCQlicmVhazsKLQljYXNlIFBBQ0tFVF9PVEhFUkhPU1Q6Ci0JCS8qIE91ciBsb3dlciBsYXllciB0aGlua3MgdGhpcyBpcyBub3QgbG9jYWwsIGxldCdzIG1ha2Ugc3VyZS4KLQkJICogVGhpcyBhbGxvd3MgdGhlIFZMQU4gdG8gaGF2ZSBhIGRpZmZlcmVudCBNQUMgdGhhbiB0aGUKLQkJICogdW5kZXJseWluZyBkZXZpY2UsIGFuZCBzdGlsbCByb3V0ZSBjb3JyZWN0bHkuICovCi0JCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGV0aF9oZHIoc2tiKS0+aF9kZXN0LAotCQkJCQl2bGFuX2Rldi0+ZGV2X2FkZHIpKQotCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwotCQlicmVhazsKLQl9CiAJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3N0YXRzLT5zeW5jcCk7CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorLyogTXVzdCBiZSBpbnZva2VkIHdpdGggcmN1X3JlYWRfbG9jayBvciB3aXRoIFJUTkwuICovCitzdHJ1Y3QgbmV0X2RldmljZSAqX192bGFuX2ZpbmRfZGV2X2RlZXAoc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2LAorCQkJCQl1MTYgdmxhbl9pZCkKK3sKKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwocmVhbF9kZXYtPnZsZ3JwKTsKKworCWlmIChncnApIHsKKwkJcmV0dXJuIHZsYW5fZ3JvdXBfZ2V0X2RldmljZShncnAsIHZsYW5faWQpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEJvbmRpbmcgc2xhdmVzIGRvIG5vdCBoYXZlIGdycCBhc3NpZ25lZCB0byB0aGVtc2VsdmVzLgorCQkgKiBHcnAgaXMgYXNzaWduZWQgdG8gYm9uZGluZyBtYXN0ZXIgaW5zdGVhZC4KKwkJICovCisJCWlmIChuZXRpZl9pc19ib25kX3NsYXZlKHJlYWxfZGV2KSkKKwkJCXJldHVybiBfX3ZsYW5fZmluZF9kZXZfZGVlcChyZWFsX2Rldi0+bWFzdGVyLCB2bGFuX2lkKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woX192bGFuX2ZpbmRfZGV2X2RlZXApOworCiBzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbl9kZXZfcmVhbF9kZXYoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gdmxhbl9kZXZfaW5mbyhkZXYpLT5yZWFsX2RldjsKQEAgLTY0LDQzICs5NiwxMyBAQAogfQogRVhQT1JUX1NZTUJPTCh2bGFuX2Rldl92bGFuX2lkKTsKIAotLyogVkxBTiByeCBodyBhY2NlbGVyYXRpb24gaGVscGVyLiAgVGhpcyBhY3RzIGxpa2UgbmV0aWZfe3J4LHJlY2VpdmVfc2tifSgpLiAqLwotaW50IF9fdmxhbl9od2FjY2VsX3J4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsCi0JCSAgICAgIHUxNiB2bGFuX3RjaSwgaW50IHBvbGxpbmcpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnZsYW5fcmVvcmRlcl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdmxhbl90Y2kpOwotCXJldHVybiBwb2xsaW5nID8gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKSA6IG5ldGlmX3J4KHNrYik7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fdmxhbl9od2FjY2VsX3J4KTsKLQotZ3JvX3Jlc3VsdF90IHZsYW5fZ3JvX3JlY2VpdmUoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAotCQkJICAgICAgdW5zaWduZWQgaW50IHZsYW5fdGNpLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGFuX3RjaSk7Ci0JcmV0dXJuIG5hcGlfZ3JvX3JlY2VpdmUobmFwaSwgc2tiKTsKLX0KLUVYUE9SVF9TWU1CT0wodmxhbl9ncm9fcmVjZWl2ZSk7Ci0KLWdyb19yZXN1bHRfdCB2bGFuX2dyb19mcmFncyhzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsCi0JCQkgICAgdW5zaWduZWQgaW50IHZsYW5fdGNpKQotewotCV9fdmxhbl9od2FjY2VsX3B1dF90YWcobmFwaS0+c2tiLCB2bGFuX3RjaSk7Ci0JcmV0dXJuIG5hcGlfZ3JvX2ZyYWdzKG5hcGkpOwotfQotRVhQT1JUX1NZTUJPTCh2bGFuX2dyb19mcmFncyk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdmxhbl9jaGVja19yZW9yZGVyX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWlmICh2bGFuX2Rldl9pbmZvKHNrYi0+ZGV2KS0+ZmxhZ3MgJiBWTEFOX0ZMQUdfUkVPUkRFUl9IRFIpIHsKLQkJaWYgKHNrYl9jb3coc2tiLCBza2JfaGVhZHJvb20oc2tiKSkgPCAwKQotCQkJc2tiID0gTlVMTDsKLQkJaWYgKHNrYikgewotCQkJLyogTGlmdGVkIGZyb20gR2xlYidzIFZMQU4gY29kZS4uLiAqLwotCQkJbWVtbW92ZShza2ItPmRhdGEgLSBFVEhfSExFTiwKLQkJCQlza2ItPmRhdGEgLSBWTEFOX0VUSF9ITEVOLCAxMik7Ci0JCQlza2ItPm1hY19oZWFkZXIgKz0gVkxBTl9ITEVOOwotCQl9Ci0JfQorCWlmIChza2JfY293KHNrYiwgc2tiX2hlYWRyb29tKHNrYikpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtbW92ZShza2ItPmRhdGEgLSBFVEhfSExFTiwgc2tiLT5kYXRhIC0gVkxBTl9FVEhfSExFTiwgMiAqIEVUSF9BTEVOKTsKKwlza2ItPm1hY19oZWFkZXIgKz0gVkxBTl9ITEVOOworCXNrYl9yZXNldF9tYWNfbGVuKHNrYik7CiAJcmV0dXJuIHNrYjsKIH0KIApAQCAtMTYxLDcgKzE2Myw3IEBACiAJc2tiX3B1bGxfcmNzdW0oc2tiLCBWTEFOX0hMRU4pOwogCXZsYW5fc2V0X2VuY2FwX3Byb3RvKHNrYiwgdmhkcik7CiAKLQlza2IgPSB2bGFuX2NoZWNrX3Jlb3JkZXJfaGVhZGVyKHNrYik7CisJc2tiID0gdmxhbl9yZW9yZGVyX2hlYWRlcihza2IpOwogCWlmICh1bmxpa2VseSghc2tiKSkKIAkJZ290byBlcnJfZnJlZTsKIApkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwppbmRleCA3ZWE1Y2Y5Li45MzRlMjIxIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9kZXYuYworKysgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwpAQCAtMjAsNiArMjAsOCBAQAogICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgpAQCAtNTUsNyArNTcsNyBAQAogCQlyZXR1cm4gYXJwX2ZpbmQodmV0aC0+aF9kZXN0LCBza2IpOwogI2VuZGlmCiAJZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzOiB1bmFibGUgdG8gcmVzb2x2ZSB0eXBlICVYIGFkZHJlc3Nlcy5cbiIsCisJCXByX2RlYnVnKCIlczogdW5hYmxlIHRvIHJlc29sdmUgdHlwZSAlWCBhZGRyZXNzZXNcbiIsCiAJCQkgZGV2LT5uYW1lLCBudG9ocyh2ZXRoLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvKSk7CiAKIAkJbWVtY3B5KHZldGgtPmhfc291cmNlLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CkBAIC01MjgsNyArNTMwLDExIEBACiAJCQkJCSAgKDE8PF9fTElOS19TVEFURV9ET1JNQU5UKSkpIHwKIAkJICAgICAgKDE8PF9fTElOS19TVEFURV9QUkVTRU5UKTsKIAotCWRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX0FMTF9UWF9PRkZMT0FEUzsKKwlkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9BTExfQ1NVTSB8IE5FVElGX0ZfU0cgfAorCQkJICAgTkVUSUZfRl9GUkFHTElTVCB8IE5FVElGX0ZfQUxMX1RTTyB8CisJCQkgICBORVRJRl9GX0hJR0hETUEgfCBORVRJRl9GX1NDVFBfQ1NVTSB8CisJCQkgICBORVRJRl9GX0FMTF9GQ09FOworCiAJZGV2LT5mZWF0dXJlcyB8PSByZWFsX2Rldi0+dmxhbl9mZWF0dXJlcyB8IE5FVElGX0ZfTExUWDsKIAlkZXYtPmdzb19tYXhfc2l6ZSA9IHJlYWxfZGV2LT5nc29fbWF4X3NpemU7CiAKQEAgLTU4Niw5ICs1OTIsMTMgQEAKIHN0YXRpYyB1MzIgdmxhbl9kZXZfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCXUzMiBvbGRfZmVhdHVyZXMgPSBmZWF0dXJlczsKIAogCWZlYXR1cmVzICY9IHJlYWxfZGV2LT5mZWF0dXJlczsKIAlmZWF0dXJlcyAmPSByZWFsX2Rldi0+dmxhbl9mZWF0dXJlczsKKworCWZlYXR1cmVzIHw9IG9sZF9mZWF0dXJlcyAmIE5FVElGX0ZfU09GVF9GRUFUVVJFUzsKKwogCWlmIChkZXZfZXRodG9vbF9nZXRfcnhfY3N1bShyZWFsX2RldikpCiAJCWZlYXR1cmVzIHw9IE5FVElGX0ZfUlhDU1VNOwogCWZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFucHJvYy5jIGIvbmV0LzgwMjFxL3ZsYW5wcm9jLmMKaW5kZXggZDk0MGM0OS4uZDM0YjZkYSAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW5wcm9jLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5wcm9jLmMKQEAgLTE3LDYgKzE3LDggQEAKICAqIEphbiAyMCwgMTk5OCAgICAgICAgQmVuIEdyZWVhciAgICAgSW5pdGlhbCBWZXJzaW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xNTUsNyArMTU3LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyOgotCXByX2VycigiJXM6IGNhbid0IGNyZWF0ZSBlbnRyeSBpbiBwcm9jIGZpbGVzeXN0ZW0hXG4iLCBfX2Z1bmNfXyk7CisJcHJfZXJyKCJjYW4ndCBjcmVhdGUgZW50cnkgaW4gcHJvYyBmaWxlc3lzdGVtIVxuIik7CiAJdmxhbl9wcm9jX2NsZWFudXAobmV0KTsKIAlyZXR1cm4gLUVOT0JVRlM7CiB9CkBAIC0yMjksNyArMjMxLDcgQEAKIAogCSsrKnBvczsKIAotCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXY7CisJZGV2ID0gdjsKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCiAJCWRldiA9IG5ldF9kZXZpY2VfZW50cnkoJm5ldC0+ZGV2X2Jhc2VfaGVhZCk7CiAKZGlmZiAtLWdpdCBhL25ldC85cC9jbGllbnQuYyBiL25ldC85cC9jbGllbnQuYwppbmRleCA5ZTNiMGU2Li4wNTA1YTAzIDEwMDY0NAotLS0gYS9uZXQvOXAvY2xpZW50LmMKKysrIGIvbmV0LzlwL2NsaWVudC5jCkBAIC03MiwyMyArNzIsMjIgQEAKIEVYUE9SVF9TWU1CT0wocDlfaXNfcHJvdG9fZG90dSk7CiAKIC8qIEludGVycHJldCBtb3VudCBvcHRpb24gZm9yIHByb3RvY29sIHZlcnNpb24gKi8KLXN0YXRpYyBpbnQgZ2V0X3Byb3RvY29sX3ZlcnNpb24oY29uc3Qgc3Vic3RyaW5nX3QgKm5hbWUpCitzdGF0aWMgaW50IGdldF9wcm90b2NvbF92ZXJzaW9uKGNoYXIgKnMpCiB7CiAJaW50IHZlcnNpb24gPSAtRUlOVkFMOwogCi0JaWYgKCFzdHJuY21wKCI5cDIwMDAiLCBuYW1lLT5mcm9tLCBuYW1lLT50by1uYW1lLT5mcm9tKSkgeworCWlmICghc3RyY21wKHMsICI5cDIwMDAiKSkgewogCQl2ZXJzaW9uID0gcDlfcHJvdG9fbGVnYWN5OwogCQlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiUHJvdG9jb2wgdmVyc2lvbjogTGVnYWN5XG4iKTsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKCI5cDIwMDAudSIsIG5hbWUtPmZyb20sIG5hbWUtPnRvLW5hbWUtPmZyb20pKSB7CisJfSBlbHNlIGlmICghc3RyY21wKHMsICI5cDIwMDAudSIpKSB7CiAJCXZlcnNpb24gPSBwOV9wcm90b18yMDAwdTsKIAkJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIlByb3RvY29sIHZlcnNpb246IDlQMjAwMC51XG4iKTsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKCI5cDIwMDAuTCIsIG5hbWUtPmZyb20sIG5hbWUtPnRvLW5hbWUtPmZyb20pKSB7CisJfSBlbHNlIGlmICghc3RyY21wKHMsICI5cDIwMDAuTCIpKSB7CiAJCXZlcnNpb24gPSBwOV9wcm90b18yMDAwTDsKIAkJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIlByb3RvY29sIHZlcnNpb246IDlQMjAwMC5MXG4iKTsKLQl9IGVsc2UgewotCQlQOV9EUFJJTlRLKFA5X0RFQlVHX0VSUk9SLCAiVW5rbm93biBwcm90b2NvbCB2ZXJzaW9uICVzLiAiLAotCQkJCQkJCW5hbWUtPmZyb20pOwotCX0KKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiOXA6IFVua25vd24gcHJvdG9jb2wgdmVyc2lvbiAlcy5cbiIsIHMpOworCiAJcmV0dXJuIHZlcnNpb247CiB9CiAKQEAgLTEwNiw2ICsxMDUsNyBAQAogCWNoYXIgKnA7CiAJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwogCWludCBvcHRpb247CisJY2hhciAqczsKIAlpbnQgcmV0ID0gMDsKIAogCWNsbnQtPnByb3RvX3ZlcnNpb24gPSBwOV9wcm90b18yMDAwdTsKQEAgLTE0MSwyMiArMTQxLDQxIEBACiAJCQljbG50LT5tc2l6ZSA9IG9wdGlvbjsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF90cmFuczoKLQkJCWNsbnQtPnRyYW5zX21vZCA9IHY5ZnNfZ2V0X3RyYW5zX2J5X25hbWUoJmFyZ3NbMF0pOwotCQkJaWYoY2xudC0+dHJhbnNfbW9kID09IE5VTEwpIHsKKwkJCXMgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJaWYgKCFzKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKIAkJCQlQOV9EUFJJTlRLKFA5X0RFQlVHX0VSUk9SLAotCQkJCSAgICJDb3VsZCBub3QgZmluZCByZXF1ZXN0IHRyYW5zcG9ydDogJXNcbiIsCi0JCQkJICAgKGNoYXIgKikgJmFyZ3NbMF0pOworCQkJCQkicHJvYmxlbSBhbGxvY2F0aW5nIGNvcHkgb2YgdHJhbnMgYXJnXG4iKTsKKwkJCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwkJCSB9CisJCQljbG50LT50cmFuc19tb2QgPSB2OWZzX2dldF90cmFuc19ieV9uYW1lKHMpOworCQkJaWYgKGNsbnQtPnRyYW5zX21vZCA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiOXA6IENvdWxkIG5vdCBmaW5kICIKKwkJCQkJInJlcXVlc3QgdHJhbnNwb3J0OiAlc1xuIiwgcyk7CiAJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlrZnJlZShzKTsKIAkJCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKIAkJCX0KKwkJCWtmcmVlKHMpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2xlZ2FjeToKIAkJCWNsbnQtPnByb3RvX3ZlcnNpb24gPSBwOV9wcm90b19sZWdhY3k7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfdmVyc2lvbjoKLQkJCXJldCA9IGdldF9wcm90b2NvbF92ZXJzaW9uKCZhcmdzWzBdKTsKLQkJCWlmIChyZXQgPT0gLUVJTlZBTCkKKwkJCXMgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJaWYgKCFzKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlQOV9EUFJJTlRLKFA5X0RFQlVHX0VSUk9SLAorCQkJCQkicHJvYmxlbSBhbGxvY2F0aW5nIGNvcHkgb2YgdmVyc2lvbiBhcmdcbiIpOwogCQkJCWdvdG8gZnJlZV9hbmRfcmV0dXJuOworCQkJfQorCQkJcmV0ID0gZ2V0X3Byb3RvY29sX3ZlcnNpb24ocyk7CisJCQlpZiAocmV0ID09IC1FSU5WQUwpIHsKKwkJCQlrZnJlZShzKTsKKwkJCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwkJCX0KKwkJCWtmcmVlKHMpOwogCQkJY2xudC0+cHJvdG9fdmVyc2lvbiA9IHJldDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtMjgwLDcgKzI5OSw4IEBACiAJICogYnVmZmVyIHRvIHJlYWQgdGhlIGRhdGEgaW50byAqLwogCXRhZysrOwogCi0JQlVHX09OKHRhZyA+PSBjLT5tYXhfdGFnKTsKKwlpZih0YWcgPj0gYy0+bWF4X3RhZykgCisJCXJldHVybiBOVUxMOwogCiAJcm93ID0gdGFnIC8gUDlfUk9XX01BWFRBRzsKIAljb2wgPSB0YWcgJSBQOV9ST1dfTUFYVEFHOwpAQCAtNzQ5LDcgKzc2OSw3IEBACiAJZXJyID0gcDlwZHVfcmVhZGYocmVxLT5yYywgYy0+cHJvdG9fdmVyc2lvbiwgImRzIiwgJm1zaXplLCAmdmVyc2lvbik7CiAJaWYgKGVycikgewogCQlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAidmVyc2lvbiBlcnJvciAlZFxuIiwgZXJyKTsKLQkJcDlwZHVfZHVtcCgxLCByZXEtPnJjKTsKKwkJUDlfRFVNUF9QS1QoMSwgcmVxLT5yYyk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC04MjEsOCArODQxLDggQEAKIAlpZiAoZXJyKQogCQlnb3RvIGRlc3Ryb3lfZmlkcG9vbDsKIAotCWlmICgoY2xudC0+bXNpemUrUDlfSU9IRFJTWikgPiBjbG50LT50cmFuc19tb2QtPm1heHNpemUpCi0JCWNsbnQtPm1zaXplID0gY2xudC0+dHJhbnNfbW9kLT5tYXhzaXplLVA5X0lPSERSU1o7CisJaWYgKGNsbnQtPm1zaXplID4gY2xudC0+dHJhbnNfbW9kLT5tYXhzaXplKQorCQljbG50LT5tc2l6ZSA9IGNsbnQtPnRyYW5zX21vZC0+bWF4c2l6ZTsKIAogCWVyciA9IHA5X2NsaWVudF92ZXJzaW9uKGNsbnQpOwogCWlmIChlcnIpCkBAIC05MTEsNyArOTMxLDcgQEAKIAogCWVyciA9IHA5cGR1X3JlYWRmKHJlcS0+cmMsIGNsbnQtPnByb3RvX3ZlcnNpb24sICJRIiwgJnFpZCk7CiAJaWYgKGVycikgewotCQlwOXBkdV9kdW1wKDEsIHJlcS0+cmMpOworCQlQOV9EVU1QX1BLVCgxLCByZXEtPnJjKTsKIAkJcDlfZnJlZV9yZXEoY2xudCwgcmVxKTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC05NzEsNyArOTkxLDcgQEAKIAogCWVyciA9IHA5cGR1X3JlYWRmKHJlcS0+cmMsIGNsbnQtPnByb3RvX3ZlcnNpb24sICJSIiwgJm53cWlkcywgJndxaWRzKTsKIAlpZiAoZXJyKSB7Ci0JCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCVA5X0RVTVBfUEtUKDEsIHJlcS0+cmMpOwogCQlwOV9mcmVlX3JlcShjbG50LCByZXEpOwogCQlnb3RvIGNsdW5rX2ZpZDsKIAl9CkBAIC0xMDM4LDcgKzEwNTgsNyBAQAogCiAJZXJyID0gcDlwZHVfcmVhZGYocmVxLT5yYywgY2xudC0+cHJvdG9fdmVyc2lvbiwgIlFkIiwgJnFpZCwgJmlvdW5pdCk7CiAJaWYgKGVycikgewotCQlwOXBkdV9kdW1wKDEsIHJlcS0+cmMpOworCQlQOV9EVU1QX1BLVCgxLCByZXEtPnJjKTsKIAkJZ290byBmcmVlX2FuZF9lcnJvcjsKIAl9CiAKQEAgLTEwODEsNyArMTEwMSw3IEBACiAKIAllcnIgPSBwOXBkdV9yZWFkZihyZXEtPnJjLCBjbG50LT5wcm90b192ZXJzaW9uLCAiUWQiLCBxaWQsICZpb3VuaXQpOwogCWlmIChlcnIpIHsKLQkJcDlwZHVfZHVtcCgxLCByZXEtPnJjKTsKKwkJUDlfRFVNUF9QS1QoMSwgcmVxLT5yYyk7CiAJCWdvdG8gZnJlZV9hbmRfZXJyb3I7CiAJfQogCkBAIC0xMTI2LDcgKzExNDYsNyBAQAogCiAJZXJyID0gcDlwZHVfcmVhZGYocmVxLT5yYywgY2xudC0+cHJvdG9fdmVyc2lvbiwgIlFkIiwgJnFpZCwgJmlvdW5pdCk7CiAJaWYgKGVycikgewotCQlwOXBkdV9kdW1wKDEsIHJlcS0+cmMpOworCQlQOV9EVU1QX1BLVCgxLCByZXEtPnJjKTsKIAkJZ290byBmcmVlX2FuZF9lcnJvcjsKIAl9CiAKQEAgLTExNjUsNyArMTE4NSw3IEBACiAKIAllcnIgPSBwOXBkdV9yZWFkZihyZXEtPnJjLCBjbG50LT5wcm90b192ZXJzaW9uLCAiUSIsIHFpZCk7CiAJaWYgKGVycikgewotCQlwOXBkdV9kdW1wKDEsIHJlcS0+cmMpOworCQlQOV9EVU1QX1BLVCgxLCByZXEtPnJjKTsKIAkJZ290byBmcmVlX2FuZF9lcnJvcjsKIAl9CiAKQEAgLTEyNDksOSArMTI2OSwxMSBAQAogCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI8PDwgUkNMVU5LIGZpZCAlZFxuIiwgZmlkLT5maWQpOwogCiAJcDlfZnJlZV9yZXEoY2xudCwgcmVxKTsKLQlwOV9maWRfZGVzdHJveShmaWQpOwotCiBlcnJvcjoKKwkvKgorCSAqIEZpZCBpcyBub3QgdmFsaWQgZXZlbiBhZnRlciBhIGZhaWxlZCBjbHVuaworCSAqLworCXA5X2ZpZF9kZXN0cm95KGZpZCk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0wocDlfY2xpZW50X2NsdW5rKTsKQEAgLTEyODEsNiArMTMwMywyOSBAQAogfQogRVhQT1JUX1NZTUJPTChwOV9jbGllbnRfcmVtb3ZlKTsKIAoraW50IHA5X2NsaWVudF91bmxpbmthdChzdHJ1Y3QgcDlfZmlkICpkZmlkLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHA5X3JlcV90ICpyZXE7CisJc3RydWN0IHA5X2NsaWVudCAqY2xudDsKKworCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI+Pj4gVFVOTElOS0FUIGZpZCAlZCAlcyAlZFxuIiwKKwkJICAgZGZpZC0+ZmlkLCBuYW1lLCBmbGFncyk7CisKKwljbG50ID0gZGZpZC0+Y2xudDsKKwlyZXEgPSBwOV9jbGllbnRfcnBjKGNsbnQsIFA5X1RVTkxJTktBVCwgImRzZCIsIGRmaWQtPmZpZCwgbmFtZSwgZmxhZ3MpOworCWlmIChJU19FUlIocmVxKSkgeworCQllcnIgPSBQVFJfRVJSKHJlcSk7CisJCWdvdG8gZXJyb3I7CisJfQorCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI8PDwgUlVOTElOS0FUIGZpZCAlZCAlc1xuIiwgZGZpZC0+ZmlkLCBuYW1lKTsKKworCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChwOV9jbGllbnRfdW5saW5rYXQpOworCiBpbnQKIHA5X2NsaWVudF9yZWFkKHN0cnVjdCBwOV9maWQgKmZpZCwgY2hhciAqZGF0YSwgY2hhciBfX3VzZXIgKnVkYXRhLCB1NjQgb2Zmc2V0LAogCQkJCQkJCQl1MzIgY291bnQpCkBAIC0xMzE4LDExICsxMzYzLDEyIEBACiAKIAllcnIgPSBwOXBkdV9yZWFkZihyZXEtPnJjLCBjbG50LT5wcm90b192ZXJzaW9uLCAiRCIsICZjb3VudCwgJmRhdGFwdHIpOwogCWlmIChlcnIpIHsKLQkJcDlwZHVfZHVtcCgxLCByZXEtPnJjKTsKKwkJUDlfRFVNUF9QS1QoMSwgcmVxLT5yYyk7CiAJCWdvdG8gZnJlZV9hbmRfZXJyb3I7CiAJfQogCiAJUDlfRFBSSU5USyhQOV9ERUJVR185UCwgIjw8PCBSUkVBRCBjb3VudCAlZFxuIiwgY291bnQpOworCVA5X0RVTVBfUEtUKDEsIHJlcS0+cmMpOwogCiAJaWYgKCFyZXEtPnRjLT5wYnVmX3NpemUpIHsKIAkJaWYgKGRhdGEpIHsKQEAgLTEzODYsNyArMTQzMiw3IEBACiAKIAllcnIgPSBwOXBkdV9yZWFkZihyZXEtPnJjLCBjbG50LT5wcm90b192ZXJzaW9uLCAiZCIsICZjb3VudCk7CiAJaWYgKGVycikgewotCQlwOXBkdV9kdW1wKDEsIHJlcS0+cmMpOworCQlQOV9EVU1QX1BLVCgxLCByZXEtPnJjKTsKIAkJZ290byBmcmVlX2FuZF9lcnJvcjsKIAl9CiAKQEAgLTE0MjYsNyArMTQ3Miw3IEBACiAKIAllcnIgPSBwOXBkdV9yZWFkZihyZXEtPnJjLCBjbG50LT5wcm90b192ZXJzaW9uLCAid1MiLCAmaWdub3JlZCwgcmV0KTsKIAlpZiAoZXJyKSB7Ci0JCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCVA5X0RVTVBfUEtUKDEsIHJlcS0+cmMpOwogCQlwOV9mcmVlX3JlcShjbG50LCByZXEpOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTE0NzcsNyArMTUyMyw3IEBACiAKIAllcnIgPSBwOXBkdV9yZWFkZihyZXEtPnJjLCBjbG50LT5wcm90b192ZXJzaW9uLCAiQSIsIHJldCk7CiAJaWYgKGVycikgewotCQlwOXBkdV9kdW1wKDEsIHJlcS0+cmMpOworCQlQOV9EVU1QX1BLVCgxLCByZXEtPnJjKTsKIAkJcDlfZnJlZV9yZXEoY2xudCwgcmVxKTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0xNjI1LDcgKzE2NzEsNyBAQAogCQkmc2ItPmJzaXplLCAmc2ItPmJsb2NrcywgJnNiLT5iZnJlZSwgJnNiLT5iYXZhaWwsCiAJCSZzYi0+ZmlsZXMsICZzYi0+ZmZyZWUsICZzYi0+ZnNpZCwgJnNiLT5uYW1lbGVuKTsKIAlpZiAoZXJyKSB7Ci0JCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCVA5X0RVTVBfUEtUKDEsIHJlcS0+cmMpOwogCQlwOV9mcmVlX3JlcShjbG50LCByZXEpOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTE2NDMsNyArMTY4OSw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKHA5X2NsaWVudF9zdGF0ZnMpOwogCi1pbnQgcDlfY2xpZW50X3JlbmFtZShzdHJ1Y3QgcDlfZmlkICpmaWQsIHN0cnVjdCBwOV9maWQgKm5ld2RpcmZpZCwgY2hhciAqbmFtZSkKK2ludCBwOV9jbGllbnRfcmVuYW1lKHN0cnVjdCBwOV9maWQgKmZpZCwKKwkJICAgICBzdHJ1Y3QgcDlfZmlkICpuZXdkaXJmaWQsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgcDlfcmVxX3QgKnJlcTsKQEAgLTE2NzAsNiArMTcxNywzNiBAQAogfQogRVhQT1JUX1NZTUJPTChwOV9jbGllbnRfcmVuYW1lKTsKIAoraW50IHA5X2NsaWVudF9yZW5hbWVhdChzdHJ1Y3QgcDlfZmlkICpvbGRkaXJmaWQsIGNvbnN0IGNoYXIgKm9sZF9uYW1lLAorCQkgICAgICAgc3RydWN0IHA5X2ZpZCAqbmV3ZGlyZmlkLCBjb25zdCBjaGFyICpuZXdfbmFtZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBwOV9yZXFfdCAqcmVxOworCXN0cnVjdCBwOV9jbGllbnQgKmNsbnQ7CisKKwllcnIgPSAwOworCWNsbnQgPSBvbGRkaXJmaWQtPmNsbnQ7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPj4+IFRSRU5BTUVBVCBvbGRkaXJmaWQgJWQgb2xkIG5hbWUgJXMiCisJCSAgICIgbmV3ZGlyZmlkICVkIG5ldyBuYW1lICVzXG4iLCBvbGRkaXJmaWQtPmZpZCwgb2xkX25hbWUsCisJCSAgIG5ld2RpcmZpZC0+ZmlkLCBuZXdfbmFtZSk7CisKKwlyZXEgPSBwOV9jbGllbnRfcnBjKGNsbnQsIFA5X1RSRU5BTUVBVCwgImRzZHMiLCBvbGRkaXJmaWQtPmZpZCwKKwkJCSAgICBvbGRfbmFtZSwgbmV3ZGlyZmlkLT5maWQsIG5ld19uYW1lKTsKKwlpZiAoSVNfRVJSKHJlcSkpIHsKKwkJZXJyID0gUFRSX0VSUihyZXEpOworCQlnb3RvIGVycm9yOworCX0KKworCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI8PDwgUlJFTkFNRUFUIG5ld2RpcmZpZCAlZCBuZXcgbmFtZSAlc1xuIiwKKwkJICAgbmV3ZGlyZmlkLT5maWQsIG5ld19uYW1lKTsKKworCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChwOV9jbGllbnRfcmVuYW1lYXQpOworCiAvKgogICogQW4geGF0dHJ3YWxrIHdpdGhvdXQgQGF0dHJfbmFtZSBnaXZlcyB0aGUgZmlkIGZvciB0aGUgbGlzeGF0dHIgbmFtZXNwYWNlCiAgKi8KQEAgLTE3MDEsNyArMTc3OCw3IEBACiAJfQogCWVyciA9IHA5cGR1X3JlYWRmKHJlcS0+cmMsIGNsbnQtPnByb3RvX3ZlcnNpb24sICJxIiwgYXR0cl9zaXplKTsKIAlpZiAoZXJyKSB7Ci0JCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCVA5X0RVTVBfUEtUKDEsIHJlcS0+cmMpOwogCQlwOV9mcmVlX3JlcShjbG50LCByZXEpOwogCQlnb3RvIGNsdW5rX2ZpZDsKIAl9CkBAIC0xNzgwLDcgKzE4NTcsNyBAQAogCiAJZXJyID0gcDlwZHVfcmVhZGYocmVxLT5yYywgY2xudC0+cHJvdG9fdmVyc2lvbiwgIkQiLCAmY291bnQsICZkYXRhcHRyKTsKIAlpZiAoZXJyKSB7Ci0JCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCVA5X0RVTVBfUEtUKDEsIHJlcS0+cmMpOwogCQlnb3RvIGZyZWVfYW5kX2Vycm9yOwogCX0KIApAQCAtMTgxNyw3ICsxODk0LDcgQEAKIAogCWVyciA9IHA5cGR1X3JlYWRmKHJlcS0+cmMsIGNsbnQtPnByb3RvX3ZlcnNpb24sICJRIiwgcWlkKTsKIAlpZiAoZXJyKSB7Ci0JCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCVA5X0RVTVBfUEtUKDEsIHJlcS0+cmMpOwogCQlnb3RvIGVycm9yOwogCX0KIAlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPDw8IFJNS05PRCBxaWQgJXguJWxseC4leFxuIiwgcWlkLT50eXBlLApAQCAtMTg0OCw3ICsxOTI1LDcgQEAKIAogCWVyciA9IHA5cGR1X3JlYWRmKHJlcS0+cmMsIGNsbnQtPnByb3RvX3ZlcnNpb24sICJRIiwgcWlkKTsKIAlpZiAoZXJyKSB7Ci0JCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCVA5X0RVTVBfUEtUKDEsIHJlcS0+cmMpOwogCQlnb3RvIGVycm9yOwogCX0KIAlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPDw8IFJNS0RJUiBxaWQgJXguJWxseC4leFxuIiwgcWlkLT50eXBlLApAQCAtMTg4Myw3ICsxOTYwLDcgQEAKIAogCWVyciA9IHA5cGR1X3JlYWRmKHJlcS0+cmMsIGNsbnQtPnByb3RvX3ZlcnNpb24sICJiIiwgc3RhdHVzKTsKIAlpZiAoZXJyKSB7Ci0JCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCVA5X0RVTVBfUEtUKDEsIHJlcS0+cmMpOwogCQlnb3RvIGVycm9yOwogCX0KIAlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPDw8IFJMT0NLIHN0YXR1cyAlaVxuIiwgKnN0YXR1cyk7CkBAIC0xOTE2LDcgKzE5OTMsNyBAQAogCQkJJmdsb2NrLT5zdGFydCwgJmdsb2NrLT5sZW5ndGgsICZnbG9jay0+cHJvY19pZCwKIAkJCSZnbG9jay0+Y2xpZW50X2lkKTsKIAlpZiAoZXJyKSB7Ci0JCXA5cGR1X2R1bXAoMSwgcmVxLT5yYyk7CisJCVA5X0RVTVBfUEtUKDEsIHJlcS0+cmMpOwogCQlnb3RvIGVycm9yOwogCX0KIAlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPDw8IFJHRVRMT0NLIHR5cGUgJWkgc3RhcnQgJWxsZCBsZW5ndGggJWxsZCAiCkBAIC0xOTQ0LDcgKzIwMjEsNyBAQAogCiAJZXJyID0gcDlwZHVfcmVhZGYocmVxLT5yYywgY2xudC0+cHJvdG9fdmVyc2lvbiwgInMiLCB0YXJnZXQpOwogCWlmIChlcnIpIHsKLQkJcDlwZHVfZHVtcCgxLCByZXEtPnJjKTsKKwkJUDlfRFVNUF9QS1QoMSwgcmVxLT5yYyk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCVA5X0RQUklOVEsoUDlfREVCVUdfOVAsICI8PDwgUlJFQURMSU5LIHRhcmdldCAlc1xuIiwgKnRhcmdldCk7CmRpZmYgLS1naXQgYS9uZXQvOXAvbW9kLmMgYi9uZXQvOXAvbW9kLmMKaW5kZXggNzJjMzk4Mi4uMjY2NGQxMiAxMDA2NDQKLS0tIGEvbmV0LzlwL21vZC5jCisrKyBiL25ldC85cC9tb2QuYwpAQCAtODAsMTQgKzgwLDE0IEBACiAgKiBAbmFtZTogc3RyaW5nIGlkZW50aWZ5aW5nIHRyYW5zcG9ydAogICoKICAqLwotc3RydWN0IHA5X3RyYW5zX21vZHVsZSAqdjlmc19nZXRfdHJhbnNfYnlfbmFtZShjb25zdCBzdWJzdHJpbmdfdCAqbmFtZSkKK3N0cnVjdCBwOV90cmFuc19tb2R1bGUgKnY5ZnNfZ2V0X3RyYW5zX2J5X25hbWUoY2hhciAqcykKIHsKIAlzdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICp0LCAqZm91bmQgPSBOVUxMOwogCiAJc3Bpbl9sb2NrKCZ2OWZzX3RyYW5zX2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmdjlmc190cmFuc19saXN0LCBsaXN0KQotCQlpZiAoc3RybmNtcCh0LT5uYW1lLCBuYW1lLT5mcm9tLCBuYW1lLT50by1uYW1lLT5mcm9tKSA9PSAwICYmCisJCWlmIChzdHJjbXAodC0+bmFtZSwgcykgPT0gMCAmJgogCQkgICAgdHJ5X21vZHVsZV9nZXQodC0+b3duZXIpKSB7CiAJCQlmb3VuZCA9IHQ7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC85cC9wcm90b2NvbC5jIGIvbmV0LzlwL3Byb3RvY29sLmMKaW5kZXggYTg3MzI3Ny4uZGY1ODM3NSAxMDA2NDQKLS0tIGEvbmV0LzlwL3Byb3RvY29sLmMKKysrIGIvbmV0LzlwL3Byb3RvY29sLmMKQEAgLTQ0LDMwICs0NCwyNCBAQAogdm9pZAogcDlwZHVfZHVtcChpbnQgd2F5LCBzdHJ1Y3QgcDlfZmNhbGwgKnBkdSkKIHsKLQlpbnQgaSwgbjsKLQl1OCAqZGF0YSA9IHBkdS0+c2RhdGE7Ci0JaW50IGRhdGFsZW4gPSBwZHUtPnNpemU7Ci0JY2hhciBidWZbMjU1XTsKLQlpbnQgYnVmbGVuID0gMjU1OworCWludCBsZW4gPSBwZHUtPnNpemU7CiAKLQlpID0gbiA9IDA7Ci0JaWYgKGRhdGFsZW4gPiAoYnVmbGVuLTE2KSkKLQkJZGF0YWxlbiA9IGJ1Zmxlbi0xNjsKLQl3aGlsZSAoaSA8IGRhdGFsZW4pIHsKLQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgYnVmbGVuIC0gbiwgIiUwMnggIiwgZGF0YVtpXSk7Ci0JCWlmIChpJTQgPT0gMykKLQkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIGJ1ZmxlbiAtIG4sICIgIik7Ci0JCWlmIChpJTMyID09IDMxKQotCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgYnVmbGVuIC0gbiwgIlxuIik7Ci0KLQkJaSsrOworCWlmICgocDlfZGVidWdfbGV2ZWwgJiBQOV9ERUJVR19WUEtUKSAhPSBQOV9ERUJVR19WUEtUKSB7CisJCWlmICgocDlfZGVidWdfbGV2ZWwgJiBQOV9ERUJVR19QS1QpID09IFA5X0RFQlVHX1BLVCkgeworCQkJaWYgKGxlbiA+IDMyKQorCQkJCWxlbiA9IDMyOworCQl9IGVsc2UgeworCQkJLyogc2hvdWxkbid0IGhhcHBlbiAqLworCQkJcmV0dXJuOworCQl9CiAJfQotCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIGJ1ZmxlbiAtIG4sICJcbiIpOwogCiAJaWYgKHdheSkKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19QS1QsICJbW1soJWQpICVzXG4iLCBkYXRhbGVuLCBidWYpOworCQlwcmludF9oZXhfZHVtcF9ieXRlcygiWzlQXSAiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIHBkdS0+c2RhdGEsCisJCQkJCQkJCQlsZW4pOwogCWVsc2UKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19QS1QsICJdXV0oJWQpICVzXG4iLCBkYXRhbGVuLCBidWYpOworCQlwcmludF9oZXhfZHVtcF9ieXRlcygiXTlQWyAiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIHBkdS0+c2RhdGEsCisJCQkJCQkJCQlsZW4pOwogfQogI2Vsc2UKIHZvaWQKQEAgLTYxMCw3ICs2MDQsNyBAQAogCXJldCA9IHA5cGR1X3JlYWRmKCZmYWtlX3BkdSwgcHJvdG9fdmVyc2lvbiwgIlMiLCBzdCk7CiAJaWYgKHJldCkgewogCQlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPDw8IHA5c3RhdF9yZWFkIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCXA5cGR1X2R1bXAoMSwgJmZha2VfcGR1KTsKKwkJUDlfRFVNUF9QS1QoMCwgJmZha2VfcGR1KTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNjMyLDExICs2MjYsNyBAQAogCWVyciA9IHA5cGR1X3dyaXRlZihwZHUsIDAsICJkIiwgc2l6ZSk7CiAJcGR1LT5zaXplID0gc2l6ZTsKIAotI2lmZGVmIENPTkZJR19ORVRfOVBfREVCVUcKLQlpZiAoKHA5X2RlYnVnX2xldmVsICYgUDlfREVCVUdfUEtUKSA9PSBQOV9ERUJVR19QS1QpCi0JCXA5cGR1X2R1bXAoMCwgcGR1KTsKLSNlbmRpZgotCisJUDlfRFVNUF9QS1QoMCwgcGR1KTsKIAlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPj4+IHNpemU9JWQgdHlwZTogJWQgdGFnOiAlZFxuIiwgcGR1LT5zaXplLAogCQkJCQkJCXBkdS0+aWQsIHBkdS0+dGFnKTsKIApAQCAtNjY5LDcgKzY1OSw3IEBACiAJCQkmZGlyZW50LT5kX29mZiwgJmRpcmVudC0+ZF90eXBlLCAmbmFtZXB0cik7CiAJaWYgKHJldCkgewogCQlQOV9EUFJJTlRLKFA5X0RFQlVHXzlQLCAiPDw8IHA5ZGlyZW50X3JlYWQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKLQkJcDlwZHVfZHVtcCgxLCAmZmFrZV9wZHUpOworCQlQOV9EVU1QX1BLVCgxLCAmZmFrZV9wZHUpOwogCQlnb3RvIG91dDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC85cC90cmFuc192aXJ0aW8uYyBiL25ldC85cC90cmFuc192aXJ0aW8uYwppbmRleCAyNDRlNzA3Li4xNzViNTEzIDEwMDY0NAotLS0gYS9uZXQvOXAvdHJhbnNfdmlydGlvLmMKKysrIGIvbmV0LzlwL3RyYW5zX3ZpcnRpby5jCkBAIC0zNjcsNyArMzY3LDcgQEAKIAkJaW4gKz0gaW5wOwogCX0gZWxzZSB7CiAJCWluID0gcGFja19zZ19saXN0KGNoYW4tPnNnLCBvdXQsIFZJUlRRVUVVRV9OVU0sIHJkYXRhLAotCQkJCWNsaWVudC0+bXNpemUpOworCQkJCXJlcS0+cmMtPmNhcGFjaXR5KTsKIAl9CiAKIAllcnIgPSB2aXJ0cXVldWVfYWRkX2J1ZihjaGFuLT52cSwgY2hhbi0+c2csIG91dCwgaW4sIHJlcS0+dGMpOwpAQCAtNTkyLDcgKzU5Miw3IEBACiAJLmNsb3NlID0gcDlfdmlydGlvX2Nsb3NlLAogCS5yZXF1ZXN0ID0gcDlfdmlydGlvX3JlcXVlc3QsCiAJLmNhbmNlbCA9IHA5X3ZpcnRpb19jYW5jZWwsCi0JLm1heHNpemUgPSBQQUdFX1NJWkUqMTYsCisJLm1heHNpemUgPSBQQUdFX1NJWkUqVklSVFFVRVVFX05VTSwKIAkucHJlZiA9IFA5X1RSQU5TX1BSRUZfUEFZTE9BRF9TRVAsCiAJLmRlZiA9IDAsCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnCmluZGV4IDg3ODE1MWMuLmEwNzMxNDggMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCisrKyBiL25ldC9LY29uZmlnCkBAIC0zMjIsNiArMzIyLDcgQEAKIHNvdXJjZSAibmV0LzlwL0tjb25maWciCiBzb3VyY2UgIm5ldC9jYWlmL0tjb25maWciCiBzb3VyY2UgIm5ldC9jZXBoL0tjb25maWciCitzb3VyY2UgIm5ldC9uZmMvS2NvbmZpZyIKIAogCiBlbmRpZiAgICMgaWYgTkVUCmRpZmYgLS1naXQgYS9uZXQvTWFrZWZpbGUgYi9uZXQvTWFrZWZpbGUKaW5kZXggYTUxZDk0Ni4uYWNkZGU0OSAxMDA2NDQKLS0tIGEvbmV0L01ha2VmaWxlCisrKyBiL25ldC9NYWtlZmlsZQpAQCAtNjgsMyArNjgsNCBAQAogb2JqLSQoQ09ORklHX0ROU19SRVNPTFZFUikJKz0gZG5zX3Jlc29sdmVyLwogb2JqLSQoQ09ORklHX0NFUEhfTElCKQkJKz0gY2VwaC8KIG9iai0kKENPTkZJR19CQVRNQU5fQURWKQkrPSBiYXRtYW4tYWR2Lworb2JqLSQoQ09ORklHX05GQykJCSs9IG5mYy8KZGlmZiAtLWdpdCBhL25ldC9UVU5BQkxFIGIvbmV0L1RVTkFCTEUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTMyMTEuLjAwMDAwMDAKLS0tIGEvbmV0L1RVTkFCTEUKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHR1bmFibGUgYXQgY29tcGlsZSB0aW1lLiBTb21lIG9mIHRoZW0KLWV4aXN0IGFzIHN5c2N0bHMgdG9vLgotCi1UaGlzIGlzIGZhciBmcm9tIGNvbXBsZXRlCi0KLUl0ZW0JCQlEZXNjcmlwdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUFYX0xJTktTCQlNYXhpbXVtIG51bWJlciBvZiBuZXRsaW5rIG1pbm9yIGRldmljZXMuICgxLTMyKQotUklGX1RBQkxFX1NJWkUJCVRva2VuIHJpbmcgUklGIGNhY2hlIHNpemUgKHR1bmFibGUpCi1BQVJQX0hBU0hfU0laRQkJU2l6ZSBvZiBBcHBsZXRhbGsgaGFzaCB0YWJsZSAodHVuYWJsZSkKLUFYMjVfREVGX1QxCQlBWC4yNSBwYXJhbWV0ZXJzLiBUaGVzZSBhcmUgYWxsIHR1bmFibGUgdmlhCi1BWDI1X0RFRl9UMgkJU0lPQ0FYMjVTRVRQQVJNUwotQVgyNV9ERUZfVDMJCVQxLVQzLE4yIGhhdmUgdGhlIG1lYW5pbmdzIGluIHRoZSBzcGVjaWZpY2F0aW9uCi1BWDI1X0RFRl9OMgotQVgyNV9ERUZfQVhERUZNT0RFCTggPSBub3JtYWwgMTI4IGlzIFBFMUNITCBleHRlbmRlZAotQVgyNV9ERUZfSVBERUZNT0RFCSdEJyAtIGRhdGFncmFtICAnVicgLSB2aXJ0dWFsIGNvbm5lY3Rpb24KLUFYMjVfREVGX0JBQ0tPRkYJJ0UneHBvbmVudGlhbCAnTCdpbmVhcgotQVgyNV9ERUZfTkVUUk9NCQlBbGxvdyBuZXRyb20gMT1ZCi1BWDI1X0RGX1RFWFQJCUFsbG93IFBJRD1UZXh0IDE9WQotQVgyNV9ERUZfV0lORE9XCQlXaW5kb3cgZm9yIG5vcm1hbCBtb2RlCi1BWDI1X0RFRl9FV0lORE9XCVdpbmRvdyBmb3IgUEUxQ0hMIG1vZGUKLUFYMjVfREVGX0RJR0kJCTEgZm9yIGluYmFuZCAyIGZvciBjcm9zcyBiYW5kIDMgZm9yIGJvdGgKLUFYMjVfREVGX0NPTk1PREUJQWxsb3cgY29ubmVjdGVkIG1vZGVzIDE9WWVzCi1BWDI1X1JPVVRFX01BWAkJQVguMjUgcm91dGUgY2FjaGUgc2l6ZSAtIG5vIGN1cnJlbnRseSB0dW5hYmxlCi1Vbm5hbWVkICgxNikJCU51bWJlciBvZiBwcm90b2NvbCBoYXNoIHNsb3RzICh0dW5hYmxlKQotREVWX05VTUJVRkZTCQlOdW1iZXIgb2YgcHJpb3JpdHkgbGV2ZWxzIChub3QgZWFzaWx5IHR1bmFibGUpCi1Vbm5hbWVkICgzMDApCQlNYXhpbXVtIHBhY2tldCBiYWNrbG9nIHF1ZXVlICh0dW5hYmxlKQotTUFYX0lPVkVDCQlNYXhpbXVtIG51bWJlciBvZiBpb3ZlY3MgaW4gYSBtZXNzYWdlICh0dW5hYmxlKQotTUlOX1dJTkRPVwkJT2ZmZXJlZCBtaW5pbXVtIHdpbmRvdyAodHVuYWJsZSkKLU1BWF9XSU5ET1cJCU9mZmVyZWQgbWF4aW11bSB3aW5kb3cgKHR1bmFibGUpCi1NQVhfSEVBREVSCQlMYXJnZXN0IHBoeXNpY2FsIGhlYWRlciAodHVuYWJsZSkKLU1BWF9BRERSX0xFTgkJTGFyZ2VzdCBwaHlzaWNhbCBhZGRyZXNzICh0dW5hYmxlKQotU09DS19BUlJBWV9TSVpFCQlJUCBzb2NrZXQgYXJyYXkgaGFzaCBzaXplICh0dW5hYmxlKQotSVBfTUFYX01FTUJFUlNISVBTCUxhcmdlc3QgbnVtYmVyIG9mIGdyb3VwcyBwZXIgc29ja2V0IChCU0Qgc3R5bGUpICh0dW5hYmxlKQotMTYJCQlIYXJkIGNvZGVkIGNvbnN0YW50IGZvciBhbW91bnQgb2Ygcm9vbSBhbGxvd2VkIGZvcgotCQkJY2FjaGUgYWxpZ24gYW5kIGZhc3RlciBmb3J3YXJkaW5nICh0dW5hYmxlKQotSVBfRlJBR19USU1FCQlUaW1lIHdlIGhvbGQgYSBmcmFnbWVudCBmb3IuICh0dW5hYmxlKQotUE9SVF9NQVNRX0JFR0lOCQlGaXJzdCBwb3J0IHJlc2VydmVkIGZvciBtYXNxdWVyYWRlICh0dW5hYmxlKQotUE9SVF9NQVNRX0VORAkJTGFzdCBwb3J0IHVzZWQgZm9yIG1hc3F1ZXJhZGUJKHR1bmFibGUpCi1NQVNRVUVSQURFX0VYUElSRV9UQ1BfRklOCVRpbWUgd2Uga2VlcCBhIG1hc3F1ZXJhZGUgZm9yIGFmdGVyIGEgRklOCi1NQVNRVUVSQURFX0VYUElSRV9VRFAJVGltZSB3ZSBrZWVwIGEgVURQIG1hc3F1ZXJhZGUgZm9yICh0dW5hYmxlKQotTUFYVklGUwkJCU1heGltdW0gbXJvdXRlZCB2aWZzICgxLTMyKQotTUZDX0xJTkVTCQlMaW5lcyBpbiB0aGUgbXVsdGljYXN0IHJvdXRlciBjYWNoZSAodHVuYWJsZSkKLQotTmV0Uk9NIHBhcmFtZXRlcnMgYXJlIHR1bmFibGUgdmlhIGFuIGlvY3RsIHBhc3NpbmcgYSBzdHJ1Y3QKLQotNDAwMAkJCVNpemUgYSBVbml4IGRvbWFpbiBzb2NrZXQgbWFsbG9jIGZhbGxzIGJhY2sgdG8gCi0JCQkodHVuYWJsZSkgc2hvdWxkIGJlIDhLIC0gYSBiaXQgZm9yIDhLIG1hY2hpbmVzIGxpa2UKLQkJCXRoZSBBTFBIQQotCmRpZmYgLS1naXQgYS9uZXQvYXBwbGV0YWxrL2FhcnAuYyBiL25ldC9hcHBsZXRhbGsvYWFycC5jCmluZGV4IDUwZGNlNzkuLjFhY2M2OTUgMTAwNjQ0Ci0tLSBhL25ldC9hcHBsZXRhbGsvYWFycC5jCisrKyBiL25ldC9hcHBsZXRhbGsvYWFycC5jCkBAIC03NzksODcgKzc3OSw4NyBAQAogCX0KIAogCXN3aXRjaCAoZnVuY3Rpb24pIHsKLQkJY2FzZSBBQVJQX1JFUExZOgotCQkJaWYgKCF1bnJlc29sdmVkX2NvdW50KQkvKiBTcGVlZCB1cCAqLwotCQkJCWJyZWFrOwotCi0JCQkvKiBGaW5kIHRoZSBlbnRyeS4gICovCi0JCQlhID0gX19hYXJwX2ZpbmRfZW50cnkodW5yZXNvbHZlZFtoYXNoXSwgZGV2LCAmc2EpOwotCQkJaWYgKCFhIHx8IGRldiAhPSBhLT5kZXYpCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIFdlIGNhbiBmaWxsIG9uZSBpbiAtIHRoaXMgaXMgZ29vZC4gKi8KLQkJCW1lbWNweShhLT5od2FkZHIsIGVhLT5od19zcmMsIEVUSF9BTEVOKTsKLQkJCV9fYWFycF9yZXNvbHZlZCgmdW5yZXNvbHZlZFtoYXNoXSwgYSwgaGFzaCk7Ci0JCQlpZiAoIXVucmVzb2x2ZWRfY291bnQpCi0JCQkJbW9kX3RpbWVyKCZhYXJwX3RpbWVyLAotCQkJCQkgIGppZmZpZXMgKyBzeXNjdGxfYWFycF9leHBpcnlfdGltZSk7CisJY2FzZSBBQVJQX1JFUExZOgorCQlpZiAoIXVucmVzb2x2ZWRfY291bnQpCS8qIFNwZWVkIHVwICovCiAJCQlicmVhazsKIAotCQljYXNlIEFBUlBfUkVRVUVTVDoKLQkJY2FzZSBBQVJQX1BST0JFOgorCQkvKiBGaW5kIHRoZSBlbnRyeS4gICovCisJCWEgPSBfX2FhcnBfZmluZF9lbnRyeSh1bnJlc29sdmVkW2hhc2hdLCBkZXYsICZzYSk7CisJCWlmICghYSB8fCBkZXYgIT0gYS0+ZGV2KQorCQkJYnJlYWs7CisKKwkJLyogV2UgY2FuIGZpbGwgb25lIGluIC0gdGhpcyBpcyBnb29kLiAqLworCQltZW1jcHkoYS0+aHdhZGRyLCBlYS0+aHdfc3JjLCBFVEhfQUxFTik7CisJCV9fYWFycF9yZXNvbHZlZCgmdW5yZXNvbHZlZFtoYXNoXSwgYSwgaGFzaCk7CisJCWlmICghdW5yZXNvbHZlZF9jb3VudCkKKwkJCW1vZF90aW1lcigmYWFycF90aW1lciwKKwkJCQkgIGppZmZpZXMgKyBzeXNjdGxfYWFycF9leHBpcnlfdGltZSk7CisJCWJyZWFrOworCisJY2FzZSBBQVJQX1JFUVVFU1Q6CisJY2FzZSBBQVJQX1BST0JFOgorCisJCS8qCisJCSAqIElmIGl0IGlzIG15IGFkZHJlc3Mgc2V0IG1hIHRvIG15IGFkZHJlc3MgYW5kIHJlcGx5LgorCQkgKiBXZSBjYW4gdHJlYXQgcHJvYmUgYW5kIHJlcXVlc3QgdGhlIHNhbWUuICBQcm9iZQorCQkgKiBzaW1wbHkgbWVhbnMgd2Ugc2hvdWxkbid0IGNhY2hlIHRoZSBxdWVyeWluZyBob3N0LAorCQkgKiBhcyBpbiBhIHByb2JlIHRoZXkgYXJlIHByb3Bvc2luZyBhbiBhZGRyZXNzIG5vdAorCQkgKiB1c2luZyBvbmUuCisJCSAqCisJCSAqIFN1cHBvcnQgZm9yIHByb3h5LUFBUlAgYWRkZWQuIFdlIGNoZWNrIGlmIHRoZQorCQkgKiBhZGRyZXNzIGlzIG9uZSBvZiBvdXIgcHJveGllcyBiZWZvcmUgd2UgdG9zcyB0aGUKKwkJICogcGFja2V0IG91dC4KKwkJICovCisKKwkJc2Euc19ub2RlID0gZWEtPnBhX2RzdF9ub2RlOworCQlzYS5zX25ldCAgPSBlYS0+cGFfZHN0X25ldDsKKworCQkvKiBTZWUgaWYgd2UgaGF2ZSBhIG1hdGNoaW5nIHByb3h5LiAqLworCQltYSA9IF9fYWFycF9wcm94eV9maW5kKGRldiwgJnNhKTsKKwkJaWYgKCFtYSkKKwkJCW1hID0gJmlmYS0+YWRkcmVzczsKKwkJZWxzZSB7IC8qIFdlIG5lZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGVudHJ5LiAqLworCQkJZGEuc19ub2RlID0gc2Euc19ub2RlOworCQkJZGEuc19uZXQgPSBzYS5zX25ldDsKKwkJCW1hID0gJmRhOworCQl9CisKKwkJaWYgKGZ1bmN0aW9uID09IEFBUlBfUFJPQkUpIHsKKwkJCS8qCisJCQkgKiBBIHByb2JlIGltcGxpZXMgc29tZW9uZSB0cnlpbmcgdG8gZ2V0IGFuCisJCQkgKiBhZGRyZXNzLiBTbyBhcyBhIHByZWNhdXRpb24gZmx1c2ggYW55CisJCQkgKiBlbnRyaWVzIHdlIGhhdmUgZm9yIHRoaXMgYWRkcmVzcy4KKwkJCSAqLworCQkJYSA9IF9fYWFycF9maW5kX2VudHJ5KHJlc29sdmVkW3NhLnNfbm9kZSAlCisJCQkJCQkgICAgICAgKEFBUlBfSEFTSF9TSVpFIC0gMSldLAorCQkJCQkgICAgICBza2ItPmRldiwgJnNhKTsKIAogCQkJLyoKLQkJCSAqIElmIGl0IGlzIG15IGFkZHJlc3Mgc2V0IG1hIHRvIG15IGFkZHJlc3MgYW5kIHJlcGx5LgotCQkJICogV2UgY2FuIHRyZWF0IHByb2JlIGFuZCByZXF1ZXN0IHRoZSBzYW1lLiAgUHJvYmUKLQkJCSAqIHNpbXBseSBtZWFucyB3ZSBzaG91bGRuJ3QgY2FjaGUgdGhlIHF1ZXJ5aW5nIGhvc3QsCi0JCQkgKiBhcyBpbiBhIHByb2JlIHRoZXkgYXJlIHByb3Bvc2luZyBhbiBhZGRyZXNzIG5vdAotCQkJICogdXNpbmcgb25lLgotCQkJICoKLQkJCSAqIFN1cHBvcnQgZm9yIHByb3h5LUFBUlAgYWRkZWQuIFdlIGNoZWNrIGlmIHRoZQotCQkJICogYWRkcmVzcyBpcyBvbmUgb2Ygb3VyIHByb3hpZXMgYmVmb3JlIHdlIHRvc3MgdGhlCi0JCQkgKiBwYWNrZXQgb3V0LgorCQkJICogTWFrZSBpdCBleHBpcmUgbmV4dCB0aWNrIC0gdGhhdCBhdm9pZHMgdXMKKwkJCSAqIGdldHRpbmcgaW50byBhIHByb2JlL2ZsdXNoL2xlYXJuL3Byb2JlLworCQkJICogZmx1c2gvbGVhcm4gY3ljbGUgZHVyaW5nIHByb2Jpbmcgb2YgYSBzbG93CisJCQkgKiB0byByZXNwb25kIGhvc3QgYWRkci4KIAkJCSAqLwotCi0JCQlzYS5zX25vZGUgPSBlYS0+cGFfZHN0X25vZGU7Ci0JCQlzYS5zX25ldCAgPSBlYS0+cGFfZHN0X25ldDsKLQotCQkJLyogU2VlIGlmIHdlIGhhdmUgYSBtYXRjaGluZyBwcm94eS4gKi8KLQkJCW1hID0gX19hYXJwX3Byb3h5X2ZpbmQoZGV2LCAmc2EpOwotCQkJaWYgKCFtYSkKLQkJCQltYSA9ICZpZmEtPmFkZHJlc3M7Ci0JCQllbHNlIHsgLyogV2UgbmVlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgZW50cnkuICovCi0JCQkJZGEuc19ub2RlID0gc2Euc19ub2RlOwotCQkJCWRhLnNfbmV0ID0gc2Euc19uZXQ7Ci0JCQkJbWEgPSAmZGE7CisJCQlpZiAoYSkgeworCQkJCWEtPmV4cGlyZXNfYXQgPSBqaWZmaWVzIC0gMTsKKwkJCQltb2RfdGltZXIoJmFhcnBfdGltZXIsIGppZmZpZXMgKworCQkJCQkgIHN5c2N0bF9hYXJwX3RpY2tfdGltZSk7CiAJCQl9CisJCX0KIAotCQkJaWYgKGZ1bmN0aW9uID09IEFBUlBfUFJPQkUpIHsKLQkJCQkvKgotCQkJCSAqIEEgcHJvYmUgaW1wbGllcyBzb21lb25lIHRyeWluZyB0byBnZXQgYW4KLQkJCQkgKiBhZGRyZXNzLiBTbyBhcyBhIHByZWNhdXRpb24gZmx1c2ggYW55Ci0JCQkJICogZW50cmllcyB3ZSBoYXZlIGZvciB0aGlzIGFkZHJlc3MuCi0JCQkJICovCi0JCQkJYSA9IF9fYWFycF9maW5kX2VudHJ5KHJlc29sdmVkW3NhLnNfbm9kZSAlCi0JCQkJCQkJICAoQUFSUF9IQVNIX1NJWkUgLSAxKV0sCi0JCQkJCQkgICAgICBza2ItPmRldiwgJnNhKTsKLQotCQkJCS8qCi0JCQkJICogTWFrZSBpdCBleHBpcmUgbmV4dCB0aWNrIC0gdGhhdCBhdm9pZHMgdXMKLQkJCQkgKiBnZXR0aW5nIGludG8gYSBwcm9iZS9mbHVzaC9sZWFybi9wcm9iZS8KLQkJCQkgKiBmbHVzaC9sZWFybiBjeWNsZSBkdXJpbmcgcHJvYmluZyBvZiBhIHNsb3cKLQkJCQkgKiB0byByZXNwb25kIGhvc3QgYWRkci4KLQkJCQkgKi8KLQkJCQlpZiAoYSkgewotCQkJCQlhLT5leHBpcmVzX2F0ID0gamlmZmllcyAtIDE7Ci0JCQkJCW1vZF90aW1lcigmYWFycF90aW1lciwgamlmZmllcyArCi0JCQkJCQkJc3lzY3RsX2FhcnBfdGlja190aW1lKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzYS5zX25vZGUgIT0gbWEtPnNfbm9kZSkKLQkJCQlicmVhazsKLQotCQkJaWYgKHNhLnNfbmV0ICYmIG1hLT5zX25ldCAmJiBzYS5zX25ldCAhPSBtYS0+c19uZXQpCi0JCQkJYnJlYWs7Ci0KLQkJCXNhLnNfbm9kZSA9IGVhLT5wYV9zcmNfbm9kZTsKLQkJCXNhLnNfbmV0ID0gZWEtPnBhX3NyY19uZXQ7Ci0KLQkJCS8qIGFhcnBfbXlfYWRkcmVzcyBoYXMgZm91bmQgdGhlIGFkZHJlc3MgdG8gdXNlIGZvciB1cy4KLQkJCSovCi0JCQlhYXJwX3NlbmRfcmVwbHkoZGV2LCBtYSwgJnNhLCBlYS0+aHdfc3JjKTsKKwkJaWYgKHNhLnNfbm9kZSAhPSBtYS0+c19ub2RlKQogCQkJYnJlYWs7CisKKwkJaWYgKHNhLnNfbmV0ICYmIG1hLT5zX25ldCAmJiBzYS5zX25ldCAhPSBtYS0+c19uZXQpCisJCQlicmVhazsKKworCQlzYS5zX25vZGUgPSBlYS0+cGFfc3JjX25vZGU7CisJCXNhLnNfbmV0ID0gZWEtPnBhX3NyY19uZXQ7CisKKwkJLyogYWFycF9teV9hZGRyZXNzIGhhcyBmb3VuZCB0aGUgYWRkcmVzcyB0byB1c2UgZm9yIHVzLgorCQkgKi8KKwkJYWFycF9zZW5kX3JlcGx5KGRldiwgbWEsICZzYSwgZWEtPmh3X3NyYyk7CisJCWJyZWFrOwogCX0KIAogdW5sb2NrOgpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9kZHAuYyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKaW5kZXggOTU2YTUzMC4uYjFmZTdjMyAxMDA2NDQKLS0tIGEvbmV0L2FwcGxldGFsay9kZHAuYworKysgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCkBAIC02ODQsMTkyICs2ODQsMTkyIEBACiAJYXRpZiA9IGF0YWxrX2ZpbmRfZGV2KGRldik7CiAKIAlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFNJT0NTSUZBRERSOgotCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQkJCXJldHVybiAtRVBFUk07Ci0JCQlpZiAoc2EtPnNhdF9mYW1pbHkgIT0gQUZfQVBQTEVUQUxLKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKGRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIgJiYKLQkJCSAgICBkZXYtPnR5cGUgIT0gQVJQSFJEX0xPT1BCQUNLICYmCi0JCQkgICAgZGV2LT50eXBlICE9IEFSUEhSRF9MT0NBTFRMSyAmJgotCQkJICAgIGRldi0+dHlwZSAhPSBBUlBIUkRfUFBQKQotCQkJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCWNhc2UgU0lPQ1NJRkFERFI6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChzYS0+c2F0X2ZhbWlseSAhPSBBRl9BUFBMRVRBTEspCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIgJiYKKwkJICAgIGRldi0+dHlwZSAhPSBBUlBIUkRfTE9PUEJBQ0sgJiYKKwkJICAgIGRldi0+dHlwZSAhPSBBUlBIUkRfTE9DQUxUTEsgJiYKKwkJICAgIGRldi0+dHlwZSAhPSBBUlBIUkRfUFBQKQorCQkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CiAKLQkJCW5yID0gKHN0cnVjdCBhdGFsa19uZXRyYW5nZSAqKSZzYS0+c2F0X3plcm9bMF07Ci0JCQlhZGRfcm91dGUgPSAxOworCQluciA9IChzdHJ1Y3QgYXRhbGtfbmV0cmFuZ2UgKikmc2EtPnNhdF96ZXJvWzBdOworCQlhZGRfcm91dGUgPSAxOwogCi0JCQkvKgotCQkJICogaWYgdGhpcyBpcyBhIHBvaW50LXRvLXBvaW50IGlmYWNlLCBhbmQgd2UgYWxyZWFkeQotCQkJICogaGF2ZSBhbiBpZmFjZSBmb3IgdGhpcyBBcHBsZVRhbGsgYWRkcmVzcywgdGhlbiB3ZQotCQkJICogc2hvdWxkIG5vdCBhZGQgYSByb3V0ZQotCQkJICovCi0JCQlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQpICYmCi0JCQkgICAgYXRhbGtfZmluZF9pbnRlcmZhY2Uoc2EtPnNhdF9hZGRyLnNfbmV0LAotCQkJCQkJIHNhLT5zYXRfYWRkci5zX25vZGUpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIkFwcGxlVGFsazogcG9pbnQtdG8tcG9pbnQgIgotCQkJCQkJICAiaW50ZXJmYWNlIGFkZGVkIHdpdGggIgotCQkJCQkJICAiZXhpc3RpbmcgYWRkcmVzc1xuIik7Ci0JCQkJYWRkX3JvdXRlID0gMDsKLQkJCX0KKwkJLyoKKwkJICogaWYgdGhpcyBpcyBhIHBvaW50LXRvLXBvaW50IGlmYWNlLCBhbmQgd2UgYWxyZWFkeQorCQkgKiBoYXZlIGFuIGlmYWNlIGZvciB0aGlzIEFwcGxlVGFsayBhZGRyZXNzLCB0aGVuIHdlCisJCSAqIHNob3VsZCBub3QgYWRkIGEgcm91dGUKKwkJICovCisJCWlmICgoZGV2LT5mbGFncyAmIElGRl9QT0lOVE9QT0lOVCkgJiYKKwkJICAgIGF0YWxrX2ZpbmRfaW50ZXJmYWNlKHNhLT5zYXRfYWRkci5zX25ldCwKKwkJCQkJIHNhLT5zYXRfYWRkci5zX25vZGUpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQXBwbGVUYWxrOiBwb2ludC10by1wb2ludCAiCisJCQkgICAgICAgImludGVyZmFjZSBhZGRlZCB3aXRoICIKKwkJCSAgICAgICAiZXhpc3RpbmcgYWRkcmVzc1xuIik7CisJCQlhZGRfcm91dGUgPSAwOworCQl9CiAKLQkJCS8qCi0JCQkgKiBQaGFzZSAxIGlzIGZpbmUgb24gTG9jYWxUYWxrIGJ1dCB3ZSBkb24ndCBkbwotCQkJICogRXRoZXJUYWxrIHBoYXNlIDEuIEFueW9uZSB3YW50aW5nIHRvIGFkZCBpdCBnbyBhaGVhZC4KLQkJCSAqLwotCQkJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIgJiYgbnItPm5yX3BoYXNlICE9IDIpCi0JCQkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7Ci0JCQlpZiAoc2EtPnNhdF9hZGRyLnNfbm9kZSA9PSBBVEFERFJfQkNBU1QgfHwKLQkJCSAgICBzYS0+c2F0X2FkZHIuc19ub2RlID09IDI1NCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChhdGlmKSB7Ci0JCQkJLyogQWxyZWFkeSBzZXR0aW5nIGFkZHJlc3MgKi8KLQkJCQlpZiAoYXRpZi0+c3RhdHVzICYgQVRJRl9QUk9CRSkKLQkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJLyoKKwkJICogUGhhc2UgMSBpcyBmaW5lIG9uIExvY2FsVGFsayBidXQgd2UgZG9uJ3QgZG8KKwkJICogRXRoZXJUYWxrIHBoYXNlIDEuIEFueW9uZSB3YW50aW5nIHRvIGFkZCBpdCBnbyBhaGVhZC4KKwkJICovCisJCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSICYmIG5yLT5ucl9waGFzZSAhPSAyKQorCQkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisJCWlmIChzYS0+c2F0X2FkZHIuc19ub2RlID09IEFUQUREUl9CQ0FTVCB8fAorCQkgICAgc2EtPnNhdF9hZGRyLnNfbm9kZSA9PSAyNTQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGF0aWYpIHsKKwkJCS8qIEFscmVhZHkgc2V0dGluZyBhZGRyZXNzICovCisJCQlpZiAoYXRpZi0+c3RhdHVzICYgQVRJRl9QUk9CRSkKKwkJCQlyZXR1cm4gLUVCVVNZOwogCi0JCQkJYXRpZi0+YWRkcmVzcy5zX25ldCAgPSBzYS0+c2F0X2FkZHIuc19uZXQ7Ci0JCQkJYXRpZi0+YWRkcmVzcy5zX25vZGUgPSBzYS0+c2F0X2FkZHIuc19ub2RlOwotCQkJCWF0cnRyX2RldmljZV9kb3duKGRldik7CS8qIEZsdXNoIG9sZCByb3V0ZXMgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJYXRpZiA9IGF0aWZfYWRkX2RldmljZShkZXYsICZzYS0+c2F0X2FkZHIpOwotCQkJCWlmICghYXRpZikKLQkJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCQlhdGlmLT5uZXRzID0gKm5yOwotCi0JCQkvKgotCQkJICogQ2hlY2sgaWYgdGhlIGNob3NlbiBhZGRyZXNzIGlzIHVzZWQuIElmIHNvIHdlCi0JCQkgKiBlcnJvciBhbmQgYXRhbGtkIHdpbGwgdHJ5IGFub3RoZXIuCi0JCQkgKi8KLQotCQkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgJiYKLQkJCSAgICAhKGRldi0+ZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQpICYmCi0JCQkgICAgYXRpZl9wcm9iZV9kZXZpY2UoYXRpZikgPCAwKSB7Ci0JCQkJYXRpZl9kcm9wX2RldmljZShkZXYpOwotCQkJCXJldHVybiAtRUFERFJJTlVTRTsKLQkJCX0KLQotCQkJLyogSGV5IGl0IHdvcmtlZCAtIGFkZCB0aGUgZGlyZWN0IHJvdXRlcyAqLwotCQkJc2EgPSAoc3RydWN0IHNvY2thZGRyX2F0ICopJnJ0ZGVmLnJ0X2dhdGV3YXk7Ci0JCQlzYS0+c2F0X2ZhbWlseSA9IEFGX0FQUExFVEFMSzsKLQkJCXNhLT5zYXRfYWRkci5zX25ldCAgPSBhdGlmLT5hZGRyZXNzLnNfbmV0OwotCQkJc2EtPnNhdF9hZGRyLnNfbm9kZSA9IGF0aWYtPmFkZHJlc3Muc19ub2RlOwotCQkJc2EgPSAoc3RydWN0IHNvY2thZGRyX2F0ICopJnJ0ZGVmLnJ0X2RzdDsKLQkJCXJ0ZGVmLnJ0X2ZsYWdzID0gUlRGX1VQOwotCQkJc2EtPnNhdF9mYW1pbHkgPSBBRl9BUFBMRVRBTEs7Ci0JCQlzYS0+c2F0X2FkZHIuc19ub2RlID0gQVRBRERSX0FOWU5PREU7Ci0JCQlpZiAoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSyB8fAotCQkJICAgIGRldi0+ZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQpCi0JCQkJcnRkZWYucnRfZmxhZ3MgfD0gUlRGX0hPU1Q7Ci0KLQkJCS8qIFJvdXRlcmxlc3MgaW5pdGlhbCBzdGF0ZSAqLwotCQkJaWYgKG5yLT5ucl9maXJzdG5ldCA9PSBodG9ucygwKSAmJgotCQkJICAgIG5yLT5ucl9sYXN0bmV0ID09IGh0b25zKDB4RkZGRSkpIHsKLQkJCQlzYS0+c2F0X2FkZHIuc19uZXQgPSBhdGlmLT5hZGRyZXNzLnNfbmV0OwotCQkJCWF0cnRyX2NyZWF0ZSgmcnRkZWYsIGRldik7Ci0JCQkJYXRydHJfc2V0X2RlZmF1bHQoZGV2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGltaXQgPSBudG9ocyhuci0+bnJfbGFzdG5ldCk7Ci0JCQkJaWYgKGxpbWl0IC0gbnRvaHMobnItPm5yX2ZpcnN0bmV0KSA+IDQwOTYpIHsKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVG9vIG1hbnkgcm91dGVzLyIKLQkJCQkJCQkgICAgImlmYWNlLlxuIik7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQkJCQlpZiAoYWRkX3JvdXRlKQotCQkJCQlmb3IgKGN0ID0gbnRvaHMobnItPm5yX2ZpcnN0bmV0KTsKLQkJCQkJICAgICBjdCA8PSBsaW1pdDsgY3QrKykgewotCQkJCQkJc2EtPnNhdF9hZGRyLnNfbmV0ID0gaHRvbnMoY3QpOwotCQkJCQkJYXRydHJfY3JlYXRlKCZydGRlZiwgZGV2KTsKLQkJCQkJfQotCQkJfQotCQkJZGV2X21jX2FkZF9nbG9iYWwoZGV2LCBhYXJwX21jYXN0KTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgU0lPQ0dJRkFERFI6CisJCQlhdGlmLT5hZGRyZXNzLnNfbmV0ICA9IHNhLT5zYXRfYWRkci5zX25ldDsKKwkJCWF0aWYtPmFkZHJlc3Muc19ub2RlID0gc2EtPnNhdF9hZGRyLnNfbm9kZTsKKwkJCWF0cnRyX2RldmljZV9kb3duKGRldik7CS8qIEZsdXNoIG9sZCByb3V0ZXMgKi8KKwkJfSBlbHNlIHsKKwkJCWF0aWYgPSBhdGlmX2FkZF9kZXZpY2UoZGV2LCAmc2EtPnNhdF9hZGRyKTsKIAkJCWlmICghYXRpZikKLQkJCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYXRpZi0+bmV0cyA9ICpucjsKIAotCQkJc2EtPnNhdF9mYW1pbHkgPSBBRl9BUFBMRVRBTEs7Ci0JCQlzYS0+c2F0X2FkZHIgPSBhdGlmLT5hZGRyZXNzOwotCQkJYnJlYWs7CisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSBjaG9zZW4gYWRkcmVzcyBpcyB1c2VkLiBJZiBzbyB3ZQorCQkgKiBlcnJvciBhbmQgYXRhbGtkIHdpbGwgdHJ5IGFub3RoZXIuCisJCSAqLwogCi0JCWNhc2UgU0lPQ0dJRkJSREFERFI6Ci0JCQlpZiAoIWF0aWYpCi0JCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCQlpZiAoIShkZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSAmJgorCQkgICAgIShkZXYtPmZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKSAmJgorCQkgICAgYXRpZl9wcm9iZV9kZXZpY2UoYXRpZikgPCAwKSB7CisJCQlhdGlmX2Ryb3BfZGV2aWNlKGRldik7CisJCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJCX0KIAotCQkJc2EtPnNhdF9mYW1pbHkgPSBBRl9BUFBMRVRBTEs7CisJCS8qIEhleSBpdCB3b3JrZWQgLSBhZGQgdGhlIGRpcmVjdCByb3V0ZXMgKi8KKwkJc2EgPSAoc3RydWN0IHNvY2thZGRyX2F0ICopJnJ0ZGVmLnJ0X2dhdGV3YXk7CisJCXNhLT5zYXRfZmFtaWx5ID0gQUZfQVBQTEVUQUxLOworCQlzYS0+c2F0X2FkZHIuc19uZXQgID0gYXRpZi0+YWRkcmVzcy5zX25ldDsKKwkJc2EtPnNhdF9hZGRyLnNfbm9kZSA9IGF0aWYtPmFkZHJlc3Muc19ub2RlOworCQlzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfYXQgKikmcnRkZWYucnRfZHN0OworCQlydGRlZi5ydF9mbGFncyA9IFJURl9VUDsKKwkJc2EtPnNhdF9mYW1pbHkgPSBBRl9BUFBMRVRBTEs7CisJCXNhLT5zYXRfYWRkci5zX25vZGUgPSBBVEFERFJfQU5ZTk9ERTsKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0sgfHwKKwkJICAgIGRldi0+ZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQpCisJCQlydGRlZi5ydF9mbGFncyB8PSBSVEZfSE9TVDsKKworCQkvKiBSb3V0ZXJsZXNzIGluaXRpYWwgc3RhdGUgKi8KKwkJaWYgKG5yLT5ucl9maXJzdG5ldCA9PSBodG9ucygwKSAmJgorCQkgICAgbnItPm5yX2xhc3RuZXQgPT0gaHRvbnMoMHhGRkZFKSkgewogCQkJc2EtPnNhdF9hZGRyLnNfbmV0ID0gYXRpZi0+YWRkcmVzcy5zX25ldDsKLQkJCXNhLT5zYXRfYWRkci5zX25vZGUgPSBBVEFERFJfQkNBU1Q7Ci0JCQlicmVhazsKLQotCQljYXNlIFNJT0NBVEFMS0RJRkFERFI6Ci0JCWNhc2UgU0lPQ0RJRkFERFI6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQkJcmV0dXJuIC1FUEVSTTsKLQkJCWlmIChzYS0+c2F0X2ZhbWlseSAhPSBBRl9BUFBMRVRBTEspCisJCQlhdHJ0cl9jcmVhdGUoJnJ0ZGVmLCBkZXYpOworCQkJYXRydHJfc2V0X2RlZmF1bHQoZGV2KTsKKwkJfSBlbHNlIHsKKwkJCWxpbWl0ID0gbnRvaHMobnItPm5yX2xhc3RuZXQpOworCQkJaWYgKGxpbWl0IC0gbnRvaHMobnItPm5yX2ZpcnN0bmV0KSA+IDQwOTYpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJUb28gbWFueSByb3V0ZXMvIgorCQkJCSAgICAgICAiaWZhY2UuXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWF0YWxrX2Rldl9kb3duKGRldik7Ci0JCQlicmVhazsKKwkJCX0KKwkJCWlmIChhZGRfcm91dGUpCisJCQkJZm9yIChjdCA9IG50b2hzKG5yLT5ucl9maXJzdG5ldCk7CisJCQkJICAgICBjdCA8PSBsaW1pdDsgY3QrKykgeworCQkJCQlzYS0+c2F0X2FkZHIuc19uZXQgPSBodG9ucyhjdCk7CisJCQkJCWF0cnRyX2NyZWF0ZSgmcnRkZWYsIGRldik7CisJCQkJfQorCQl9CisJCWRldl9tY19hZGRfZ2xvYmFsKGRldiwgYWFycF9tY2FzdCk7CisJCXJldHVybiAwOwogCi0JCWNhc2UgU0lPQ1NBUlA6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQkJcmV0dXJuIC1FUEVSTTsKLQkJCWlmIChzYS0+c2F0X2ZhbWlseSAhPSBBRl9BUFBMRVRBTEspCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkvKgotCQkJICogZm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IHByb3h5IEFBUlAgb24gRUxBUDsKLQkJCSAqIHdlIHNob3VsZCBiZSBhYmxlIHRvIGRvIGl0IGZvciBMb2NhbFRhbGssIHRvby4KLQkJCSAqLwotCQkJaWYgKGRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpCi0JCQkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisJY2FzZSBTSU9DR0lGQUREUjoKKwkJaWYgKCFhdGlmKQorCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCi0JCQkvKgotCQkJICogYXRpZiBwb2ludHMgdG8gdGhlIGN1cnJlbnQgaW50ZXJmYWNlIG9uIHRoaXMgbmV0d29yazsKLQkJCSAqIHdlIGFyZW4ndCBjb25jZXJuZWQgYWJvdXQgaXRzIGN1cnJlbnQgc3RhdHVzIChhdAotCQkJICogbGVhc3QgZm9yIG5vdyksIGJ1dCBpdCBoYXMgYWxsIHRoZSBzZXR0aW5ncyBhYm91dAotCQkJICogdGhlIG5ldHdvcmsgd2UncmUgZ29pbmcgdG8gcHJvYmUuIENvbnNlcXVlbnRseSwgaXQKLQkJCSAqIG11c3QgZXhpc3QuCi0JCQkgKi8KLQkJCWlmICghYXRpZikKLQkJCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJCXNhLT5zYXRfZmFtaWx5ID0gQUZfQVBQTEVUQUxLOworCQlzYS0+c2F0X2FkZHIgPSBhdGlmLT5hZGRyZXNzOworCQlicmVhazsKIAotCQkJbnIgPSAoc3RydWN0IGF0YWxrX25ldHJhbmdlICopJihhdGlmLT5uZXRzKTsKLQkJCS8qCi0JCQkgKiBQaGFzZSAxIGlzIGZpbmUgb24gTG9jYWx0YWxrIGJ1dCB3ZSBkb24ndCBkbwotCQkJICogRXRoZXJ0YWxrIHBoYXNlIDEuIEFueW9uZSB3YW50aW5nIHRvIGFkZCBpdCBnbyBhaGVhZC4KLQkJCSAqLwotCQkJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIgJiYgbnItPm5yX3BoYXNlICE9IDIpCi0JCQkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisJY2FzZSBTSU9DR0lGQlJEQUREUjoKKwkJaWYgKCFhdGlmKQorCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCi0JCQlpZiAoc2EtPnNhdF9hZGRyLnNfbm9kZSA9PSBBVEFERFJfQkNBU1QgfHwKLQkJCSAgICBzYS0+c2F0X2FkZHIuc19ub2RlID09IDI1NCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc2EtPnNhdF9mYW1pbHkgPSBBRl9BUFBMRVRBTEs7CisJCXNhLT5zYXRfYWRkci5zX25ldCA9IGF0aWYtPmFkZHJlc3Muc19uZXQ7CisJCXNhLT5zYXRfYWRkci5zX25vZGUgPSBBVEFERFJfQkNBU1Q7CisJCWJyZWFrOwogCi0JCQkvKgotCQkJICogQ2hlY2sgaWYgdGhlIGNob3NlbiBhZGRyZXNzIGlzIHVzZWQuIElmIHNvIHdlCi0JCQkgKiBlcnJvciBhbmQgQVRDUCB3aWxsIHRyeSBhbm90aGVyLgotCQkJICovCi0JCQlpZiAoYXRpZl9wcm94eV9wcm9iZV9kZXZpY2UoYXRpZiwgJihzYS0+c2F0X2FkZHIpKSA8IDApCi0JCQkJcmV0dXJuIC1FQUREUklOVVNFOworCWNhc2UgU0lPQ0FUQUxLRElGQUREUjoKKwljYXNlIFNJT0NESUZBRERSOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoc2EtPnNhdF9mYW1pbHkgIT0gQUZfQVBQTEVUQUxLKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWF0YWxrX2Rldl9kb3duKGRldik7CisJCWJyZWFrOwogCi0JCQkvKgotCQkJICogV2Ugbm93IGhhdmUgYW4gYWRkcmVzcyBvbiB0aGUgbG9jYWwgbmV0d29yaywgYW5kCi0JCQkgKiB0aGUgQUFSUCBjb2RlIHdpbGwgZGVmZW5kIGl0IGZvciB1cyB1bnRpbCB3ZSB0YWtlIGl0Ci0JCQkgKiBkb3duLiBXZSBkb24ndCBzZXQgdXAgYW55IHJvdXRlcyByaWdodCBub3csIGJlY2F1c2UKLQkJCSAqIEFUQ1Agd2lsbCBpbnN0YWxsIHRoZW0gbWFudWFsbHkgdmlhIFNJT0NBRERSVC4KLQkJCSAqLwotCQkJYnJlYWs7CisJY2FzZSBTSU9DU0FSUDoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKHNhLT5zYXRfZmFtaWx5ICE9IEFGX0FQUExFVEFMSykKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKgorCQkgKiBmb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQgcHJveHkgQUFSUCBvbiBFTEFQOworCQkgKiB3ZSBzaG91bGQgYmUgYWJsZSB0byBkbyBpdCBmb3IgTG9jYWxUYWxrLCB0b28uCisJCSAqLworCQlpZiAoZGV2LT50eXBlICE9IEFSUEhSRF9FVEhFUikKKwkJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwogCi0JCWNhc2UgU0lPQ0RBUlA6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQkJcmV0dXJuIC1FUEVSTTsKLQkJCWlmIChzYS0+c2F0X2ZhbWlseSAhPSBBRl9BUFBMRVRBTEspCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoIWF0aWYpCi0JCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCQkvKgorCQkgKiBhdGlmIHBvaW50cyB0byB0aGUgY3VycmVudCBpbnRlcmZhY2Ugb24gdGhpcyBuZXR3b3JrOworCQkgKiB3ZSBhcmVuJ3QgY29uY2VybmVkIGFib3V0IGl0cyBjdXJyZW50IHN0YXR1cyAoYXQKKwkJICogbGVhc3QgZm9yIG5vdyksIGJ1dCBpdCBoYXMgYWxsIHRoZSBzZXR0aW5ncyBhYm91dAorCQkgKiB0aGUgbmV0d29yayB3ZSdyZSBnb2luZyB0byBwcm9iZS4gQ29uc2VxdWVudGx5LCBpdAorCQkgKiBtdXN0IGV4aXN0LgorCQkgKi8KKwkJaWYgKCFhdGlmKQorCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCi0JCQkvKiBnaXZlIHRvIGFhcnAgbW9kdWxlIHRvIHJlbW92ZSBwcm94eSBlbnRyeSAqLwotCQkJYWFycF9wcm94eV9yZW1vdmUoYXRpZi0+ZGV2LCAmKHNhLT5zYXRfYWRkcikpOwotCQkJcmV0dXJuIDA7CisJCW5yID0gKHN0cnVjdCBhdGFsa19uZXRyYW5nZSAqKSYoYXRpZi0+bmV0cyk7CisJCS8qCisJCSAqIFBoYXNlIDEgaXMgZmluZSBvbiBMb2NhbHRhbGsgYnV0IHdlIGRvbid0IGRvCisJCSAqIEV0aGVydGFsayBwaGFzZSAxLiBBbnlvbmUgd2FudGluZyB0byBhZGQgaXQgZ28gYWhlYWQuCisJCSAqLworCQlpZiAoZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUiAmJiBuci0+bnJfcGhhc2UgIT0gMikKKwkJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCisJCWlmIChzYS0+c2F0X2FkZHIuc19ub2RlID09IEFUQUREUl9CQ0FTVCB8fAorCQkgICAgc2EtPnNhdF9hZGRyLnNfbm9kZSA9PSAyNTQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGUgY2hvc2VuIGFkZHJlc3MgaXMgdXNlZC4gSWYgc28gd2UKKwkJICogZXJyb3IgYW5kIEFUQ1Agd2lsbCB0cnkgYW5vdGhlci4KKwkJICovCisJCWlmIChhdGlmX3Byb3h5X3Byb2JlX2RldmljZShhdGlmLCAmKHNhLT5zYXRfYWRkcikpIDwgMCkKKwkJCXJldHVybiAtRUFERFJJTlVTRTsKKworCQkvKgorCQkgKiBXZSBub3cgaGF2ZSBhbiBhZGRyZXNzIG9uIHRoZSBsb2NhbCBuZXR3b3JrLCBhbmQKKwkJICogdGhlIEFBUlAgY29kZSB3aWxsIGRlZmVuZCBpdCBmb3IgdXMgdW50aWwgd2UgdGFrZSBpdAorCQkgKiBkb3duLiBXZSBkb24ndCBzZXQgdXAgYW55IHJvdXRlcyByaWdodCBub3csIGJlY2F1c2UKKwkJICogQVRDUCB3aWxsIGluc3RhbGwgdGhlbSBtYW51YWxseSB2aWEgU0lPQ0FERFJULgorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NEQVJQOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoc2EtPnNhdF9mYW1pbHkgIT0gQUZfQVBQTEVUQUxLKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghYXRpZikKKwkJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCQkvKiBnaXZlIHRvIGFhcnAgbW9kdWxlIHRvIHJlbW92ZSBwcm94eSBlbnRyeSAqLworCQlhYXJwX3Byb3h5X3JlbW92ZShhdGlmLT5kZXYsICYoc2EtPnNhdF9hZGRyKSk7CisJCXJldHVybiAwOwogCX0KIAogCXJldHVybiBjb3B5X3RvX3VzZXIoYXJnLCAmYXRyZXEsIHNpemVvZihhdHJlcSkpID8gLUVGQVVMVCA6IDA7CkBAIC04ODQsMjUgKzg4NCwyNSBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgU0lPQ0RFTFJUOgotCQkJaWYgKHJ0LnJ0X2RzdC5zYV9mYW1pbHkgIT0gQUZfQVBQTEVUQUxLKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJcmV0dXJuIGF0cnRyX2RlbGV0ZSgmKChzdHJ1Y3Qgc29ja2FkZHJfYXQgKikKLQkJCQkJCSZydC5ydF9kc3QpLT5zYXRfYWRkcik7CisJY2FzZSBTSU9DREVMUlQ6CisJCWlmIChydC5ydF9kc3Quc2FfZmFtaWx5ICE9IEFGX0FQUExFVEFMSykKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gYXRydHJfZGVsZXRlKCYoKHN0cnVjdCBzb2NrYWRkcl9hdCAqKQorCQkJCSAgICAgICZydC5ydF9kc3QpLT5zYXRfYWRkcik7CiAKLQkJY2FzZSBTSU9DQUREUlQ6IHsKLQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOwotCQkJaWYgKHJ0LnJ0X2RldikgewotCQkJCWNoYXIgbmFtZVtJRk5BTVNJWl07Ci0JCQkJaWYgKGNvcHlfZnJvbV91c2VyKG5hbWUsIHJ0LnJ0X2RldiwgSUZOQU1TSVotMSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCW5hbWVbSUZOQU1TSVotMV0gPSAnXDAnOwotCQkJCWRldiA9IF9fZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgbmFtZSk7Ci0JCQkJaWYgKCFkZXYpCi0JCQkJCXJldHVybiAtRU5PREVWOwotCQkJfQotCQkJcmV0dXJuIGF0cnRyX2NyZWF0ZSgmcnQsIGRldik7CisJY2FzZSBTSU9DQUREUlQ6IHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJCWlmIChydC5ydF9kZXYpIHsKKwkJCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJCQlpZiAoY29weV9mcm9tX3VzZXIobmFtZSwgcnQucnRfZGV2LCBJRk5BTVNJWi0xKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCW5hbWVbSUZOQU1TSVotMV0gPSAnXDAnOworCQkJZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBuYW1lKTsKKwkJCWlmICghZGV2KQorCQkJCXJldHVybiAtRU5PREVWOwogCQl9CisJCXJldHVybiBhdHJ0cl9jcmVhdGUoJnJ0LCBkZXYpOworCX0KIAl9CiAJcmV0dXJuIC1FSU5WQUw7CiB9CmRpZmYgLS1naXQgYS9uZXQvYXRtL2NsaXAuYyBiL25ldC9hdG0vY2xpcC5jCmluZGV4IDFkNGJlNjAuLjRiYzhjNjcgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vY2xpcC5jCisrKyBiL25ldC9hdG0vY2xpcC5jCkBAIC0yNzEsMTAgKzI3MSw4IEBACiAJLmZhbWlseSA9CQlBRl9JTkVULAogCS5zb2xpY2l0ID0JCWNsaXBfbmVpZ2hfc29saWNpdCwKIAkuZXJyb3JfcmVwb3J0ID0JCWNsaXBfbmVpZ2hfZXJyb3IsCi0JLm91dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKLQkuY29ubmVjdGVkX291dHB1dCA9CWRldl9xdWV1ZV94bWl0LAotCS5oaF9vdXRwdXQgPQkJZGV2X3F1ZXVlX3htaXQsCi0JLnF1ZXVlX3htaXQgPQkJZGV2X3F1ZXVlX3htaXQsCisJLm91dHB1dCA9CQluZWlnaF9kaXJlY3Rfb3V0cHV0LAorCS5jb25uZWN0ZWRfb3V0cHV0ID0JbmVpZ2hfZGlyZWN0X291dHB1dCwKIH07CiAKIHN0YXRpYyBpbnQgY2xpcF9jb25zdHJ1Y3RvcihzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKQEAgLTM2NCwzMyArMzYyLDM3IEBACiAJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgY2xpcF9wcml2ICpjbGlwX3ByaXYgPSBQUklWKGRldik7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOwogCXN0cnVjdCBhdG1hcnBfZW50cnkgKmVudHJ5OworCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAJc3RydWN0IGF0bV92Y2MgKnZjYzsKIAlpbnQgb2xkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwcl9kZWJ1ZygiKHNrYiAlcClcbiIsIHNrYik7Ci0JaWYgKCFza2JfZHN0KHNrYikpIHsKKwlpZiAoIWRzdCkgewogCQlwcl9lcnIoInNrYl9kc3Qoc2tiKSA9PSBOVUxMXG4iKTsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9Ci0JaWYgKCFza2JfZHN0KHNrYiktPm5laWdoYm91cikgeworCW4gPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOworCWlmICghbikgewogI2lmIDAKLQkJc2tiX2RzdChza2IpLT5uZWlnaGJvdXIgPSBjbGlwX2ZpbmRfbmVpZ2hib3VyKHNrYl9kc3Qoc2tiKSwgMSk7Ci0JCWlmICghc2tiX2RzdChza2IpLT5uZWlnaGJvdXIpIHsKKwkJbiA9IGNsaXBfZmluZF9uZWlnaGJvdXIoc2tiX2RzdChza2IpLCAxKTsKKwkJaWYgKCFuKSB7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CS8qIGxvc3QgdGhhdCBvbmUgKi8KIAkJCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQkJcmV0dXJuIDA7CiAJCX0KKwkJZHN0X3NldF9uZWlnaGJvdXIoZHN0LCBuKTsKICNlbmRpZgogCQlwcl9lcnIoIk5PIE5FSUdIQk9VUiAhXG4iKTsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9Ci0JZW50cnkgPSBORUlHSDJFTlRSWShza2JfZHN0KHNrYiktPm5laWdoYm91cik7CisJZW50cnkgPSBORUlHSDJFTlRSWShuKTsKIAlpZiAoIWVudHJ5LT52Y2NzKSB7CiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGVudHJ5LT5leHBpcmVzKSkgewogCQkJLyogc2hvdWxkIGJlIHJlc29sdmVkICovCkBAIC00MDcsNyArNDA5LDcgQEAKIAl9CiAJcHJfZGVidWcoIm5laWdoICVwLCB2Y2NzICVwXG4iLCBlbnRyeSwgZW50cnktPnZjY3MpOwogCUFUTV9TS0Ioc2tiKS0+dmNjID0gdmNjID0gZW50cnktPnZjY3MtPnZjYzsKLQlwcl9kZWJ1ZygidXNpbmcgbmVpZ2hib3VyICVwLCB2Y2MgJXBcbiIsIHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyLCB2Y2MpOworCXByX2RlYnVnKCJ1c2luZyBuZWlnaGJvdXIgJXAsIHZjYyAlcFxuIiwgbiwgdmNjKTsKIAlpZiAoZW50cnktPnZjY3MtPmVuY2FwKSB7CiAJCXZvaWQgKmhlcmU7CiAKZGlmZiAtLWdpdCBhL25ldC9hdG0vbXBjLmMgYi9uZXQvYXRtL21wYy5jCmluZGV4IDNjY2NhNDIuLmFhOTcyNDAgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbXBjLmMKKysrIGIvbmV0L2F0bS9tcGMuYwpAQCAtMTAwNSw3ICsxMDA1LDcgQEAKIAlzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYzsKIAlzdHJ1Y3QgbGVjX3ByaXYgKnByaXY7CiAKLQlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfcHRyOworCWRldiA9IGRldl9wdHI7CiAKIAlpZiAoIW5ldF9lcShkZXZfbmV0KGRldiksICZpbml0X25ldCkpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vcHBwb2F0bS5jIGIvbmV0L2F0bS9wcHBvYXRtLmMKaW5kZXggZTlhY2VkMC4uZGI0YTExYyAxMDA2NDQKLS0tIGEvbmV0L2F0bS9wcHBvYXRtLmMKKysrIGIvbmV0L2F0bS9wcHBvYXRtLmMKQEAgLTM3LDYgKzM3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYXRtLmg+CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9LY29uZmlnIGIvbmV0L2JhdG1hbi1hZHYvS2NvbmZpZwppbmRleCA2YzA1MWFkLi4yYjY4ZDA2IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9LY29uZmlnCisrKyBiL25ldC9iYXRtYW4tYWR2L0tjb25maWcKQEAgLTUsNiArNSw3IEBACiBjb25maWcgQkFUTUFOX0FEVgogCXRyaXN0YXRlICJCLkEuVC5NLkEuTi4gQWR2YW5jZWQgTWVzaGluZyBQcm90b2NvbCIKIAlkZXBlbmRzIG9uIE5FVAorCXNlbGVjdCBDUkMxNgogICAgICAgICBkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmMgYi9uZXQvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jCmluZGV4IGE4YzMyMDMuLjY5NDY3ZmUgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvYWdncmVnYXRpb24uYwpAQCAtMjAsMjggKzIwLDI2IEBACiAgKi8KIAogI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgogI2luY2x1ZGUgImFnZ3JlZ2F0aW9uLmgiCiAjaW5jbHVkZSAic2VuZC5oIgogI2luY2x1ZGUgInJvdXRpbmcuaCIKICNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgogCi0vKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHR0IGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIHBhY2tldCAqLwotc3RhdGljIGludCB0dF9sZW4oc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQpCi17Ci0JcmV0dXJuIGJhdG1hbl9wYWNrZXQtPm51bV90dCAqIEVUSF9BTEVOOwotfQotCiAvKiByZXR1cm4gdHJ1ZSBpZiBuZXdfcGFja2V0IGNhbiBiZSBhZ2dyZWdhdGVkIHdpdGggZm9yd19wYWNrZXQgKi8KLXN0YXRpYyBib29sIGNhbl9hZ2dyZWdhdGVfd2l0aChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqbmV3X2JhdG1hbl9wYWNrZXQsCitzdGF0aWMgYm9vbCBjYW5fYWdncmVnYXRlX3dpdGgoY29uc3Qgc3RydWN0IGJhdG1hbl9wYWNrZXQgKm5ld19iYXRtYW5fcGFja2V0LAorCQkJICAgICAgIHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCiAJCQkgICAgICAgaW50IHBhY2tldF9sZW4sCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUsCiAJCQkgICAgICAgYm9vbCBkaXJlY3RsaW5rLAotCQkJICAgICAgIHN0cnVjdCBoYXJkX2lmYWNlICppZl9pbmNvbWluZywKLQkJCSAgICAgICBzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0KQorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBoYXJkX2lmYWNlICppZl9pbmNvbWluZywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0KQogewogCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0ID0KIAkJKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopZm9yd19wYWNrZXQtPnNrYi0+ZGF0YTsKIAlpbnQgYWdncmVnYXRlZF9ieXRlcyA9IGZvcndfcGFja2V0LT5wYWNrZXRfbGVuICsgcGFja2V0X2xlbjsKKwlzdHJ1Y3QgaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiA9IE5VTEw7CisJYm9vbCByZXMgPSBmYWxzZTsKIAogCS8qKgogCSAqIHdlIGNhbiBhZ2dyZWdhdGUgdGhlIGN1cnJlbnQgcGFja2V0IHRvIHRoaXMgYWdncmVnYXRlZCBwYWNrZXQKQEAgLTY2LDYgKzY0LDEwIEBACiAJCSAqICAgIHBhY2tldAogCQkgKi8KIAorCQlwcmltYXJ5X2lmID0gcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCQlpZiAoIXByaW1hcnlfaWYpCisJCQlnb3RvIG91dDsKKwogCQkvKiBwYWNrZXRzIHdpdGhvdXQgZGlyZWN0IGxpbmsgZmxhZyBhbmQgaGlnaCBUVEwKIAkJICogYXJlIGZsb29kZWQgdGhyb3VnaCB0aGUgbmV0ICAqLwogCQlpZiAoKCFkaXJlY3RsaW5rKSAmJgpAQCAtNzUsOCArNzcsMTAgQEAKIAkJICAgIC8qIG93biBwYWNrZXRzIG9yaWdpbmF0aW5nIG5vbi1wcmltYXJ5CiAJCSAgICAgKiBpbnRlcmZhY2VzIGxlYXZlIG9ubHkgdGhhdCBpbnRlcmZhY2UgKi8KIAkJICAgICgoIWZvcndfcGFja2V0LT5vd24pIHx8Ci0JCSAgICAgKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+aWZfbnVtID09IDApKSkKLQkJCXJldHVybiB0cnVlOworCQkgICAgIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgPT0gcHJpbWFyeV9pZikpKSB7CisJCQlyZXMgPSB0cnVlOworCQkJZ290byBvdXQ7CisJCX0KIAogCQkvKiBpZiB0aGUgaW5jb21pbmcgcGFja2V0IGlzIHNlbnQgdmlhIHRoaXMgb25lCiAJCSAqIGludGVyZmFjZSBvbmx5IC0gd2Ugc3RpbGwgY2FuIGFnZ3JlZ2F0ZSAqLwpAQCAtODksMTYgKzkzLDIyIEBACiAJCSAgICAgKiAoPSBzZWNvbmRhcnkgaW50ZXJmYWNlIHBhY2tldHMgaW4gZ2VuZXJhbCkgKi8KIAkJICAgIChiYXRtYW5fcGFja2V0LT5mbGFncyAmIERJUkVDVExJTksgfHwKIAkJICAgICAoZm9yd19wYWNrZXQtPm93biAmJgotCQkgICAgICBmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmlmX251bSAhPSAwKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKKwkJICAgICAgZm9yd19wYWNrZXQtPmlmX2luY29taW5nICE9IHByaW1hcnlfaWYpKSkgeworCQkJcmVzID0gdHJ1ZTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCi0JcmV0dXJuIGZhbHNlOworb3V0OgorCWlmIChwcmltYXJ5X2lmKQorCQloYXJkaWZfZnJlZV9yZWYocHJpbWFyeV9pZik7CisJcmV0dXJuIHJlczsKIH0KIAogLyogY3JlYXRlIGEgbmV3IGFnZ3JlZ2F0ZWQgcGFja2V0IGFuZCBhZGQgdGhpcyBwYWNrZXQgdG8gaXQgKi8KLXN0YXRpYyB2b2lkIG5ld19hZ2dyZWdhdGVkX3BhY2tldCh1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwgaW50IHBhY2tldF9sZW4sCi0JCQkJICB1bnNpZ25lZCBsb25nIHNlbmRfdGltZSwgYm9vbCBkaXJlY3RfbGluaywKK3N0YXRpYyB2b2lkIG5ld19hZ2dyZWdhdGVkX3BhY2tldChjb25zdCB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwKKwkJCQkgIGludCBwYWNrZXRfbGVuLCB1bnNpZ25lZCBsb25nIHNlbmRfdGltZSwKKwkJCQkgIGJvb2wgZGlyZWN0X2xpbmssCiAJCQkJICBzdHJ1Y3QgaGFyZF9pZmFjZSAqaWZfaW5jb21pbmcsCiAJCQkJICBpbnQgb3duX3BhY2tldCkKIHsKQEAgLTExOCw3ICsxMjgsNyBAQAogCQl9CiAJfQogCi0JZm9yd19wYWNrZXRfYWdnciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmb3J3X3BhY2tldCksIEdGUF9BVE9NSUMpOworCWZvcndfcGFja2V0X2FnZ3IgPSBrbWFsbG9jKHNpemVvZigqZm9yd19wYWNrZXRfYWdnciksIEdGUF9BVE9NSUMpOwogCWlmICghZm9yd19wYWNrZXRfYWdncikgewogCQlpZiAoIW93bl9wYWNrZXQpCiAJCQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQpOwpAQCAtMTUwLDcgKzE2MCw3IEBACiAJZm9yd19wYWNrZXRfYWdnci0+b3duID0gb3duX3BhY2tldDsKIAlmb3J3X3BhY2tldF9hZ2dyLT5pZl9pbmNvbWluZyA9IGlmX2luY29taW5nOwogCWZvcndfcGFja2V0X2FnZ3ItPm51bV9wYWNrZXRzID0gMDsKLQlmb3J3X3BhY2tldF9hZ2dyLT5kaXJlY3RfbGlua19mbGFncyA9IDA7CisJZm9yd19wYWNrZXRfYWdnci0+ZGlyZWN0X2xpbmtfZmxhZ3MgPSBOT19GTEFHUzsKIAlmb3J3X3BhY2tldF9hZ2dyLT5zZW5kX3RpbWUgPSBzZW5kX3RpbWU7CiAKIAkvKiBzYXZlIHBhY2tldCBkaXJlY3QgbGluayBmbGFnIHN0YXR1cyAqLwpAQCAtMTc2LDggKzE4Niw3IEBACiAKIC8qIGFnZ3JlZ2F0ZSBhIG5ldyBwYWNrZXQgaW50byB0aGUgZXhpc3RpbmcgYWdncmVnYXRpb24gKi8KIHN0YXRpYyB2b2lkIGFnZ3JlZ2F0ZShzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0X2FnZ3IsCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLAotCQkgICAgICBpbnQgcGFja2V0X2xlbiwKKwkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuLAogCQkgICAgICBib29sIGRpcmVjdF9saW5rKQogewogCXVuc2lnbmVkIGNoYXIgKnNrYl9idWZmOwpAQCAtMTk1LDcgKzIwNCw3IEBACiAKIHZvaWQgYWRkX2JhdF9wYWNrZXRfdG9fbGlzdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAogCQkJICAgIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLCBpbnQgcGFja2V0X2xlbiwKLQkJCSAgICBzdHJ1Y3QgaGFyZF9pZmFjZSAqaWZfaW5jb21pbmcsIGNoYXIgb3duX3BhY2tldCwKKwkJCSAgICBzdHJ1Y3QgaGFyZF9pZmFjZSAqaWZfaW5jb21pbmcsIGludCBvd25fcGFja2V0LAogCQkJICAgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lKQogewogCS8qKgpAQCAtMjE1LDYgKzIyNCw3IEBACiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZvcndfcGFja2V0X3BvcywgdG1wX25vZGUsCiAJCQkJICAgICAmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3QsIGxpc3QpIHsKIAkJCWlmIChjYW5fYWdncmVnYXRlX3dpdGgoYmF0bWFuX3BhY2tldCwKKwkJCQkJICAgICAgIGJhdF9wcml2LAogCQkJCQkgICAgICAgcGFja2V0X2xlbiwKIAkJCQkJICAgICAgIHNlbmRfdGltZSwKIAkJCQkJICAgICAgIGRpcmVjdF9saW5rLApAQCAtMjUzLDggKzI2Myw5IEBACiB9CiAKIC8qIHVucGFjayB0aGUgYWdncmVnYXRlZCBwYWNrZXRzIGFuZCBwcm9jZXNzIHRoZW0gb25lIGJ5IG9uZSAqLwotdm9pZCByZWNlaXZlX2FnZ3JfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLAotCQkJICAgICBpbnQgcGFja2V0X2xlbiwgc3RydWN0IGhhcmRfaWZhY2UgKmlmX2luY29taW5nKQordm9pZCByZWNlaXZlX2FnZ3JfYmF0X3BhY2tldChjb25zdCBzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLCBpbnQgcGFja2V0X2xlbiwKKwkJCSAgICAgc3RydWN0IGhhcmRfaWZhY2UgKmlmX2luY29taW5nKQogewogCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OwogCWludCBidWZmX3BvcyA9IDA7CkBAIC0yNjMsMTggKzI3NCwyMCBAQAogCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKilwYWNrZXRfYnVmZjsKIAogCWRvIHsKLQkJLyogbmV0d29yayB0byBob3N0IG9yZGVyIGZvciBvdXIgMzJiaXQgc2Vxbm8sIGFuZCB0aGUKLQkJICAgb3JpZ19pbnRlcnZhbC4gKi8KKwkJLyogbmV0d29yayB0byBob3N0IG9yZGVyIGZvciBvdXIgMzJiaXQgc2Vxbm8gYW5kIHRoZQorCQkgICBvcmlnX2ludGVydmFsICovCiAJCWJhdG1hbl9wYWNrZXQtPnNlcW5vID0gbnRvaGwoYmF0bWFuX3BhY2tldC0+c2Vxbm8pOworCQliYXRtYW5fcGFja2V0LT50dF9jcmMgPSBudG9ocyhiYXRtYW5fcGFja2V0LT50dF9jcmMpOwogCiAJCXR0X2J1ZmYgPSBwYWNrZXRfYnVmZiArIGJ1ZmZfcG9zICsgQkFUX1BBQ0tFVF9MRU47Ci0JCXJlY2VpdmVfYmF0X3BhY2tldChldGhoZHIsIGJhdG1hbl9wYWNrZXQsCi0JCQkJICAgdHRfYnVmZiwgdHRfbGVuKGJhdG1hbl9wYWNrZXQpLAotCQkJCSAgIGlmX2luY29taW5nKTsKIAotCQlidWZmX3BvcyArPSBCQVRfUEFDS0VUX0xFTiArIHR0X2xlbihiYXRtYW5fcGFja2V0KTsKKwkJcmVjZWl2ZV9iYXRfcGFja2V0KGV0aGhkciwgYmF0bWFuX3BhY2tldCwgdHRfYnVmZiwgaWZfaW5jb21pbmcpOworCisJCWJ1ZmZfcG9zICs9IEJBVF9QQUNLRVRfTEVOICsKKwkJCXR0X2xlbihiYXRtYW5fcGFja2V0LT50dF9udW1fY2hhbmdlcyk7CisKIAkJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKQogCQkJKHBhY2tldF9idWZmICsgYnVmZl9wb3MpOwogCX0gd2hpbGUgKGFnZ3JlZ2F0ZWRfcGFja2V0KGJ1ZmZfcG9zLCBwYWNrZXRfbGVuLAotCQkJCSAgIGJhdG1hbl9wYWNrZXQtPm51bV90dCkpOworCQkJCSAgIGJhdG1hbl9wYWNrZXQtPnR0X251bV9jaGFuZ2VzKSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5oIGIvbmV0L2JhdG1hbi1hZHYvYWdncmVnYXRpb24uaAppbmRleCA3ZTZkNzJmLi4yMTYzMzdiIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5oCisrKyBiL25ldC9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmgKQEAgLTI1LDkgKzI1LDExIEBACiAjaW5jbHVkZSAibWFpbi5oIgogCiAvKiBpcyB0aGVyZSBhbm90aGVyIGFnZ3JlZ2F0ZWQgcGFja2V0IGhlcmU/ICovCi1zdGF0aWMgaW5saW5lIGludCBhZ2dyZWdhdGVkX3BhY2tldChpbnQgYnVmZl9wb3MsIGludCBwYWNrZXRfbGVuLCBpbnQgbnVtX3R0KQorc3RhdGljIGlubGluZSBpbnQgYWdncmVnYXRlZF9wYWNrZXQoaW50IGJ1ZmZfcG9zLCBpbnQgcGFja2V0X2xlbiwKKwkJCQkgICAgaW50IHR0X251bV9jaGFuZ2VzKQogewotCWludCBuZXh0X2J1ZmZfcG9zID0gYnVmZl9wb3MgKyBCQVRfUEFDS0VUX0xFTiArIChudW1fdHQgKiBFVEhfQUxFTik7CisJaW50IG5leHRfYnVmZl9wb3MgPSBidWZmX3BvcyArIEJBVF9QQUNLRVRfTEVOICsgKHR0X251bV9jaGFuZ2VzICoKKwkJCQkJCXNpemVvZihzdHJ1Y3QgdHRfY2hhbmdlKSk7CiAKIAlyZXR1cm4gKG5leHRfYnVmZl9wb3MgPD0gcGFja2V0X2xlbikgJiYKIAkJKG5leHRfYnVmZl9wb3MgPD0gTUFYX0FHR1JFR0FUSU9OX0JZVEVTKTsKQEAgLTM1LDkgKzM3LDEwIEBACiAKIHZvaWQgYWRkX2JhdF9wYWNrZXRfdG9fbGlzdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAogCQkJICAgIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLCBpbnQgcGFja2V0X2xlbiwKLQkJCSAgICBzdHJ1Y3QgaGFyZF9pZmFjZSAqaWZfaW5jb21pbmcsIGNoYXIgb3duX3BhY2tldCwKKwkJCSAgICBzdHJ1Y3QgaGFyZF9pZmFjZSAqaWZfaW5jb21pbmcsIGludCBvd25fcGFja2V0LAogCQkJICAgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lKTsKLXZvaWQgcmVjZWl2ZV9hZ2dyX2JhdF9wYWNrZXQoc3RydWN0IGV0aGhkciAqZXRoaGRyLCB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwKLQkJCSAgICAgaW50IHBhY2tldF9sZW4sIHN0cnVjdCBoYXJkX2lmYWNlICppZl9pbmNvbWluZyk7Cit2b2lkIHJlY2VpdmVfYWdncl9iYXRfcGFja2V0KGNvbnN0IHN0cnVjdCBldGhoZHIgKmV0aGhkciwKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuLAorCQkJICAgICBzdHJ1Y3QgaGFyZF9pZmFjZSAqaWZfaW5jb21pbmcpOwogCiAjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0FHR1JFR0FUSU9OX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9iYXRfZGVidWdmcy5jIGIvbmV0L2JhdG1hbi1hZHYvYmF0X2RlYnVnZnMuYwppbmRleCBhYmFlZWM1Li5kMGFmOWJmIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9iYXRfZGVidWdmcy5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2JhdF9kZWJ1Z2ZzLmMKQEAgLTUwLDcgKzUwLDggQEAKIAkJZGVidWdfbG9nLT5sb2dfc3RhcnQgPSBkZWJ1Z19sb2ctPmxvZ19lbmQgLSBsb2dfYnVmZl9sZW47CiB9CiAKLXN0YXRpYyBpbnQgZmRlYnVnX2xvZyhzdHJ1Y3QgZGVidWdfbG9nICpkZWJ1Z19sb2csIGNoYXIgKmZtdCwgLi4uKQorX19wcmludGYoMiwgMykKK3N0YXRpYyBpbnQgZmRlYnVnX2xvZyhzdHJ1Y3QgZGVidWdfbG9nICpkZWJ1Z19sb2csIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKIAlzdGF0aWMgY2hhciBkZWJ1Z19sb2dfYnVmWzI1Nl07CkBAIC03NCwxNCArNzUsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRlYnVnX2xvZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBjaGFyICpmbXQsIC4uLikKK2ludCBkZWJ1Z19sb2coc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwogCWNoYXIgdG1wX2xvZ19idWZbMjU2XTsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CiAJdnNjbnByaW50Zih0bXBfbG9nX2J1Ziwgc2l6ZW9mKHRtcF9sb2dfYnVmKSwgZm10LCBhcmdzKTsKLQlmZGVidWdfbG9nKGJhdF9wcml2LT5kZWJ1Z19sb2csICJbJTEwdV0gJXMiLAorCWZkZWJ1Z19sb2coYmF0X3ByaXYtPmRlYnVnX2xvZywgIlslMTBsdV0gJXMiLAogCQkgICAoamlmZmllcyAvIEhaKSwgdG1wX2xvZ19idWYpOwogCXZhX2VuZChhcmdzKTsKIApAQCAtMTE0LDcgKzExNSw3IEBACiAJICAgICEoZGVidWdfbG9nLT5sb2dfZW5kIC0gZGVidWdfbG9nLT5sb2dfc3RhcnQpKQogCQlyZXR1cm4gLUVBR0FJTjsKIAotCWlmICgoIWJ1ZikgfHwgKGNvdW50IDwgMCkpCisJaWYgKCFidWYpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGNvdW50ID09IDApCkBAIC0xODQsNyArMTg1LDcgQEAKIAlpZiAoIWJhdF9wcml2LT5kZWJ1Z19kaXIpCiAJCWdvdG8gZXJyOwogCi0JYmF0X3ByaXYtPmRlYnVnX2xvZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWJ1Z19sb2cpLCBHRlBfQVRPTUlDKTsKKwliYXRfcHJpdi0+ZGVidWdfbG9nID0ga3phbGxvYyhzaXplb2YoKmJhdF9wcml2LT5kZWJ1Z19sb2cpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWJhdF9wcml2LT5kZWJ1Z19sb2cpCiAJCWdvdG8gZXJyOwogCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9iYXRfc3lzZnMuYyBiL25ldC9iYXRtYW4tYWR2L2JhdF9zeXNmcy5jCmluZGV4IDQ5N2EwNzAuLmNkMTVkZWIgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2JhdF9zeXNmcy5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2JhdF9zeXNmcy5jCkBAIC0yOCw5ICsyOCwzMSBAQAogI2luY2x1ZGUgImdhdGV3YXlfY2xpZW50LmgiCiAjaW5jbHVkZSAidmlzLmgiCiAKLSNkZWZpbmUgdG9fZGV2KG9iaikJCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopCi0jZGVmaW5lIGtvYmpfdG9fbmV0ZGV2KG9iaikJdG9fbmV0X2Rldih0b19kZXYob2JqLT5wYXJlbnQpKQotI2RlZmluZSBrb2JqX3RvX2JhdHByaXYob2JqKQluZXRkZXZfcHJpdihrb2JqX3RvX25ldGRldihvYmopKQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICprb2JqX3RvX25ldGRldihzdHJ1Y3Qga29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihvYmotPnBhcmVudCwgc3RydWN0IGRldmljZSwga29iaik7CisJcmV0dXJuIHRvX25ldF9kZXYoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBiYXRfcHJpdiAqa29ial90b19iYXRwcml2KHN0cnVjdCBrb2JqZWN0ICpvYmopCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBrb2JqX3RvX25ldGRldihvYmopOworCXJldHVybiBuZXRkZXZfcHJpdihuZXRfZGV2KTsKK30KKworI2RlZmluZSBVRVZfVFlQRV9WQVIJIkJBVFRZUEU9IgorI2RlZmluZSBVRVZfQUNUSU9OX1ZBUgkiQkFUQUNUSU9OPSIKKyNkZWZpbmUgVUVWX0RBVEFfVkFSCSJCQVREQVRBPSIKKworc3RhdGljIGNoYXIgKnVldl9hY3Rpb25fc3RyW10gPSB7CisJImFkZCIsCisJImRlbCIsCisJImNoYW5nZSIKK307CisKK3N0YXRpYyBjaGFyICp1ZXZfdHlwZV9zdHJbXSA9IHsKKwkiZ3ciCit9OwogCiAvKiBVc2UgdGhpcywgaWYgeW91IGhhdmUgY3VzdG9taXplZCBzaG93IGFuZCBzdG9yZSBmdW5jdGlvbnMgKi8KICNkZWZpbmUgQkFUX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQlcCkBAIC05Niw3ICsxMTgsNyBAQAogCiBzdGF0aWMgaW50IHN0b3JlX2Jvb2xfYXR0cihjaGFyICpidWZmLCBzaXplX3QgY291bnQsCiAJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKLQkJCSAgIGNoYXIgKmF0dHJfbmFtZSwgYXRvbWljX3QgKmF0dHIpCisJCQkgICBjb25zdCBjaGFyICphdHRyX25hbWUsIGF0b21pY190ICphdHRyKQogewogCWludCBlbmFibGVkID0gLTE7CiAKQEAgLTEzOCwxNiArMTYwLDE1IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHN0b3JlX2Jvb2xfYXR0cihidWZmLCBjb3VudCwgbmV0X2RldiwgKGNoYXIgKilhdHRyLT5uYW1lLAotCQkJICAgICAgYXR0cl9zdG9yZSk7CisJcmV0ID0gc3RvcmVfYm9vbF9hdHRyKGJ1ZmYsIGNvdW50LCBuZXRfZGV2LCBhdHRyLT5uYW1lLCBhdHRyX3N0b3JlKTsKIAlpZiAocG9zdF9mdW5jICYmIHJldCkKIAkJcG9zdF9mdW5jKG5ldF9kZXYpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzdG9yZV91aW50X2F0dHIoY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50LAotCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGNoYXIgKmF0dHJfbmFtZSwKK3N0YXRpYyBpbnQgc3RvcmVfdWludF9hdHRyKGNvbnN0IGNoYXIgKmJ1ZmYsIHNpemVfdCBjb3VudCwKKwkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBjb25zdCBjaGFyICphdHRyX25hbWUsCiAJCQkgICB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4LCBhdG9taWNfdCAqYXR0cikKIHsKIAl1bnNpZ25lZCBsb25nIHVpbnRfdmFsOwpAQCAtMTgzLDE1ICsyMDQsMTUgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3NpemVfdCBfX3N0b3JlX3VpbnRfYXR0cihjaGFyICpidWZmLCBzaXplX3QgY291bnQsCitzdGF0aWMgaW5saW5lIHNzaXplX3QgX19zdG9yZV91aW50X2F0dHIoY29uc3QgY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50LAogCQkJaW50IG1pbiwgaW50IG1heCwKIAkJCXZvaWQgKCpwb3N0X2Z1bmMpKHN0cnVjdCBuZXRfZGV2aWNlICopLAotCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCiAJCQlhdG9taWNfdCAqYXR0cl9zdG9yZSwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHN0b3JlX3VpbnRfYXR0cihidWZmLCBjb3VudCwgbmV0X2RldiwgKGNoYXIgKilhdHRyLT5uYW1lLAorCXJldCA9IHN0b3JlX3VpbnRfYXR0cihidWZmLCBjb3VudCwgbmV0X2RldiwgYXR0ci0+bmFtZSwKIAkJCSAgICAgIG1pbiwgbWF4LCBhdHRyX3N0b3JlKTsKIAlpZiAocG9zdF9mdW5jICYmIHJldCkKIAkJcG9zdF9mdW5jKG5ldF9kZXYpOwpAQCAtMzY4LDcgKzM4OSw3IEBACiBzdGF0aWMgQkFUX0FUVFIoZ3dfYmFuZHdpZHRoLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19nd19id2lkdGgsCiAJCXN0b3JlX2d3X2J3aWR0aCk7CiAjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUcKLUJBVF9BVFRSX1VJTlQobG9nX2xldmVsLCBTX0lSVUdPIHwgU19JV1VTUiwgMCwgMywgTlVMTCk7CitCQVRfQVRUUl9VSU5UKGxvZ19sZXZlbCwgU19JUlVHTyB8IFNfSVdVU1IsIDAsIDcsIE5VTEwpOwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgYmF0X2F0dHJpYnV0ZSAqbWVzaF9hdHRyc1tdID0gewpAQCAtNTk0LDMgKzYxNSw2MCBAQAogCWtvYmplY3RfcHV0KCpoYXJkaWZfb2JqKTsKIAkqaGFyZGlmX29iaiA9IE5VTEw7CiB9CisKK2ludCB0aHJvd191ZXZlbnQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgZW51bSB1ZXZfdHlwZSB0eXBlLAorCQkgZW51bSB1ZXZfYWN0aW9uIGFjdGlvbiwgY29uc3QgY2hhciAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gLTE7CisJc3RydWN0IGhhcmRfaWZhY2UgKnByaW1hcnlfaWYgPSBOVUxMOworCXN0cnVjdCBrb2JqZWN0ICpiYXRfa29iajsKKwljaGFyICp1ZXZlbnRfZW52WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisKKwlwcmltYXJ5X2lmID0gcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCWlmICghcHJpbWFyeV9pZikKKwkJZ290byBvdXQ7CisKKwliYXRfa29iaiA9ICZwcmltYXJ5X2lmLT5zb2Z0X2lmYWNlLT5kZXYua29iajsKKworCXVldmVudF9lbnZbMF0gPSBrbWFsbG9jKHN0cmxlbihVRVZfVFlQRV9WQVIpICsKKwkJCQlzdHJsZW4odWV2X3R5cGVfc3RyW3R5cGVdKSArIDEsCisJCQkJR0ZQX0FUT01JQyk7CisJaWYgKCF1ZXZlbnRfZW52WzBdKQorCQlnb3RvIG91dDsKKworCXNwcmludGYodWV2ZW50X2VudlswXSwgIiVzJXMiLCBVRVZfVFlQRV9WQVIsIHVldl90eXBlX3N0clt0eXBlXSk7CisKKwl1ZXZlbnRfZW52WzFdID0ga21hbGxvYyhzdHJsZW4oVUVWX0FDVElPTl9WQVIpICsKKwkJCQlzdHJsZW4odWV2X2FjdGlvbl9zdHJbYWN0aW9uXSkgKyAxLAorCQkJCUdGUF9BVE9NSUMpOworCWlmICghdWV2ZW50X2VudlsxXSkKKwkJZ290byBvdXQ7CisKKwlzcHJpbnRmKHVldmVudF9lbnZbMV0sICIlcyVzIiwgVUVWX0FDVElPTl9WQVIsIHVldl9hY3Rpb25fc3RyW2FjdGlvbl0pOworCisJLyogSWYgdGhlIGV2ZW50IGlzIERFTCwgaWdub3JlIHRoZSBkYXRhIGZpZWxkICovCisJaWYgKGFjdGlvbiAhPSBVRVZfREVMKSB7CisJCXVldmVudF9lbnZbMl0gPSBrbWFsbG9jKHN0cmxlbihVRVZfREFUQV9WQVIpICsKKwkJCQkJc3RybGVuKGRhdGEpICsgMSwgR0ZQX0FUT01JQyk7CisJCWlmICghdWV2ZW50X2VudlsyXSkKKwkJCWdvdG8gb3V0OworCisJCXNwcmludGYodWV2ZW50X2VudlsyXSwgIiVzJXMiLCBVRVZfREFUQV9WQVIsIGRhdGEpOworCX0KKworCXJldCA9IGtvYmplY3RfdWV2ZW50X2VudihiYXRfa29iaiwgS09CSl9DSEFOR0UsIHVldmVudF9lbnYpOworb3V0OgorCWtmcmVlKHVldmVudF9lbnZbMF0pOworCWtmcmVlKHVldmVudF9lbnZbMV0pOworCWtmcmVlKHVldmVudF9lbnZbMl0pOworCisJaWYgKHByaW1hcnlfaWYpCisJCWhhcmRpZl9mcmVlX3JlZihwcmltYXJ5X2lmKTsKKworCWlmIChyZXQpCisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsICJJbXBvc3NpYmxlIHRvIHNlbmQgIgorCQkJInVldmVudCBmb3IgKCVzLCVzLCVzKSBldmVudCAoZXJyOiAlZClcbiIsCisJCQl1ZXZfdHlwZV9zdHJbdHlwZV0sIHVldl9hY3Rpb25fc3RyW2FjdGlvbl0sCisJCQkoYWN0aW9uID09IFVFVl9ERUwgPyAiTlVMTCIgOiBkYXRhKSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmggYi9uZXQvYmF0bWFuLWFkdi9iYXRfc3lzZnMuaAppbmRleCAwMmYxZmE3Li5hM2Y3NWE3IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9iYXRfc3lzZnMuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9iYXRfc3lzZnMuaApAQCAtMzgsNSArMzgsNyBAQAogdm9pZCBzeXNmc19kZWxfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IHN5c2ZzX2FkZF9oYXJkaWYoc3RydWN0IGtvYmplY3QgKipoYXJkaWZfb2JqLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgc3lzZnNfZGVsX2hhcmRpZihzdHJ1Y3Qga29iamVjdCAqKmhhcmRpZl9vYmopOworaW50IHRocm93X3VldmVudChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBlbnVtIHVldl90eXBlIHR5cGUsCisJCSBlbnVtIHVldl9hY3Rpb24gYWN0aW9uLCBjb25zdCBjaGFyICpkYXRhKTsKIAogI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9TWVNGU19IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYml0YXJyYXkuYyBiL25ldC9iYXRtYW4tYWR2L2JpdGFycmF5LmMKaW5kZXggYWQyY2E5Mi4uYzFmNGJmYyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvYml0YXJyYXkuYworKysgYi9uZXQvYmF0bWFuLWFkdi9iaXRhcnJheS5jCkBAIC0yNiw4ICsyNiw4IEBACiAKIC8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGdpdmVuIHNlcV9iaXRzIGluZGljYXRlcyB0cnVlCiAgKiBhbmQgY3Vycl9zZXFubyBpcyB3aXRoaW4gcmFuZ2Ugb2YgbGFzdF9zZXFubyAqLwotdWludDhfdCBnZXRfYml0X3N0YXR1cyh1bnNpZ25lZCBsb25nICpzZXFfYml0cywgdWludDMyX3QgbGFzdF9zZXFubywKLQkJICAgICAgIHVpbnQzMl90IGN1cnJfc2Vxbm8pCitpbnQgZ2V0X2JpdF9zdGF0dXMoY29uc3QgdW5zaWduZWQgbG9uZyAqc2VxX2JpdHMsIHVpbnQzMl90IGxhc3Rfc2Vxbm8sCisJCSAgIHVpbnQzMl90IGN1cnJfc2Vxbm8pCiB7CiAJaW50MzJfdCBkaWZmLCB3b3JkX29mZnNldCwgd29yZF9udW07CiAKQEAgLTEyNywxMCArMTI3LDEwIEBACiAgKiAgMSBpZiB0aGUgd2luZG93IHdhcyBtb3ZlZCAoZWl0aGVyIG5ldyBvciB2ZXJ5IG9sZCkKICAqICAwIGlmIHRoZSB3aW5kb3cgd2FzIG5vdCBtb3ZlZC9zaGlmdGVkLgogICovCi1jaGFyIGJpdF9nZXRfcGFja2V0KHZvaWQgKnByaXYsIHVuc2lnbmVkIGxvbmcgKnNlcV9iaXRzLAotCQkgICAgaW50MzJfdCBzZXFfbnVtX2RpZmYsIGludDhfdCBzZXRfbWFyaykKK2ludCBiaXRfZ2V0X3BhY2tldCh2b2lkICpwcml2LCB1bnNpZ25lZCBsb25nICpzZXFfYml0cywKKwkJICAgIGludDMyX3Qgc2VxX251bV9kaWZmLCBpbnQgc2V0X21hcmspCiB7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IChzdHJ1Y3QgYmF0X3ByaXYgKilwcml2OworCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBwcml2OwogCiAJLyogc2VxdWVuY2UgbnVtYmVyIGlzIHNsaWdodGx5IG9sZGVyLiBXZSBhbHJlYWR5IGdvdCBhIHNlcXVlbmNlIG51bWJlcgogCSAqIGhpZ2hlciB0aGFuIHRoaXMgb25lLCBzbyB3ZSBqdXN0IG1hcmsgaXQuICovCkBAIC0xOTAsNyArMTkwLDcgQEAKIC8qIGNvdW50IHRoZSBoYW1taW5nIHdlaWdodCwgaG93IG1hbnkgZ29vZCBwYWNrZXRzIGRpZCB3ZSByZWNlaXZlPyBqdXN0IGNvdW50CiAgKiB0aGUgMSdzLgogICovCi1pbnQgYml0X3BhY2tldF9jb3VudCh1bnNpZ25lZCBsb25nICpzZXFfYml0cykKK2ludCBiaXRfcGFja2V0X2NvdW50KGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNlcV9iaXRzKQogewogCWludCBpLCBoYW1taW5nID0gMDsKIApkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYml0YXJyYXkuaCBiL25ldC9iYXRtYW4tYWR2L2JpdGFycmF5LmgKaW5kZXggNzY5YzI0Ni4uOWMwNDQyMiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvYml0YXJyYXkuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9iaXRhcnJheS5oCkBAIC0yNiw4ICsyNiw4IEBACiAKIC8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGdpdmVuIHNlcV9iaXRzIGluZGljYXRlcyB0cnVlCiAgKiBhbmQgY3Vycl9zZXFubyBpcyB3aXRoaW4gcmFuZ2Ugb2YgbGFzdF9zZXFubyAqLwotdWludDhfdCBnZXRfYml0X3N0YXR1cyh1bnNpZ25lZCBsb25nICpzZXFfYml0cywgdWludDMyX3QgbGFzdF9zZXFubywKLQkJCQkJICAgdWludDMyX3QgY3Vycl9zZXFubyk7CitpbnQgZ2V0X2JpdF9zdGF0dXMoY29uc3QgdW5zaWduZWQgbG9uZyAqc2VxX2JpdHMsIHVpbnQzMl90IGxhc3Rfc2Vxbm8sCisJCSAgIHVpbnQzMl90IGN1cnJfc2Vxbm8pOwogCiAvKiB0dXJuIGNvcnJlc3BvbmRpbmcgYml0IG9uLCBzbyB3ZSBjYW4gcmVtZW1iZXIgdGhhdCB3ZSBnb3QgdGhlIHBhY2tldCAqLwogdm9pZCBiaXRfbWFyayh1bnNpZ25lZCBsb25nICpzZXFfYml0cywgaW50MzJfdCBuKTsKQEAgLTM1LDEwICszNSwxMCBAQAogCiAvKiByZWNlaXZlIGFuZCBwcm9jZXNzIG9uZSBwYWNrZXQsIHJldHVybnMgMSBpZiByZWNlaXZlZCBzZXFfbnVtIGlzIGNvbnNpZGVyZWQKICAqIG5ldywgMCBpZiBvbGQgICovCi1jaGFyIGJpdF9nZXRfcGFja2V0KHZvaWQgKnByaXYsIHVuc2lnbmVkIGxvbmcgKnNlcV9iaXRzLAotCQkgICAgaW50MzJfdCBzZXFfbnVtX2RpZmYsIGludDhfdCBzZXRfbWFyayk7CitpbnQgYml0X2dldF9wYWNrZXQodm9pZCAqcHJpdiwgdW5zaWduZWQgbG9uZyAqc2VxX2JpdHMsCisJCSAgIGludDMyX3Qgc2VxX251bV9kaWZmLCBpbnQgc2V0X21hcmspOwogCiAvKiBjb3VudCB0aGUgaGFtbWluZyB3ZWlnaHQsIGhvdyBtYW55IGdvb2QgcGFja2V0cyBkaWQgd2UgcmVjZWl2ZT8gKi8KLWludCAgYml0X3BhY2tldF9jb3VudCh1bnNpZ25lZCBsb25nICpzZXFfYml0cyk7CitpbnQgYml0X3BhY2tldF9jb3VudChjb25zdCB1bnNpZ25lZCBsb25nICpzZXFfYml0cyk7CiAKICNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfQklUQVJSQVlfSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMgYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5jCmluZGV4IDYxNjA1YTAuLjA1NjE4MGUgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuYwpAQCAtMjAsMTUgKzIwLDIyIEBACiAgKi8KIAogI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJiYXRfc3lzZnMuaCIKICNpbmNsdWRlICJnYXRld2F5X2NsaWVudC5oIgogI2luY2x1ZGUgImdhdGV3YXlfY29tbW9uLmgiCiAjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCisjaW5jbHVkZSAicm91dGluZy5oIgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KIAorLyogVGhpcyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBvcHRpb25zIGZpZWxkIGluIGEgZGhjcCBwYWNrZXQgc3RhcnRpbmcgYXQKKyAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRoY3AgaGVhZGVyICovCisjZGVmaW5lIERIQ1BfT1BUSU9OU19PRkZTRVQgMjQwCisjZGVmaW5lIERIQ1BfUkVRVUVTVCAzCisKIHN0YXRpYyB2b2lkIGd3X25vZGVfZnJlZV9yZWYoc3RydWN0IGd3X25vZGUgKmd3X25vZGUpCiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmd3X25vZGUtPnJlZmNvdW50KSkKQEAgLTg2LDcgKzkzLDcgQEAKIAlpZiAobmV3X2d3X25vZGUgJiYgIWF0b21pY19pbmNfbm90X3plcm8oJm5ld19nd19ub2RlLT5yZWZjb3VudCkpCiAJCW5ld19nd19ub2RlID0gTlVMTDsKIAotCWN1cnJfZ3dfbm9kZSA9IGJhdF9wcml2LT5jdXJyX2d3OworCWN1cnJfZ3dfbm9kZSA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoYmF0X3ByaXYtPmN1cnJfZ3csIDEpOwogCXJjdV9hc3NpZ25fcG9pbnRlcihiYXRfcHJpdi0+Y3Vycl9ndywgbmV3X2d3X25vZGUpOwogCiAJaWYgKGN1cnJfZ3dfbm9kZSkKQEAgLTk3LDQwICsxMDQsMTkgQEAKIAogdm9pZCBnd19kZXNlbGVjdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQogewotCWd3X3NlbGVjdChiYXRfcHJpdiwgTlVMTCk7CisJYXRvbWljX3NldCgmYmF0X3ByaXYtPmd3X3Jlc2VsZWN0LCAxKTsKIH0KIAotdm9pZCBnd19lbGVjdGlvbihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQorc3RhdGljIHN0cnVjdCBnd19ub2RlICpnd19nZXRfYmVzdF9nd19ub2RlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCiB7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0Jc3RydWN0IGd3X25vZGUgKmd3X25vZGUsICpjdXJyX2d3ID0gTlVMTCwgKmN1cnJfZ3dfdG1wID0gTlVMTDsKIAlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyOwotCXVpbnQ4X3QgbWF4X3RxID0gMDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgZ3dfbm9kZSAqZ3dfbm9kZSwgKmN1cnJfZ3cgPSBOVUxMOwogCXVpbnQzMl90IG1heF9nd19mYWN0b3IgPSAwLCB0bXBfZ3dfZmFjdG9yID0gMDsKKwl1aW50OF90IG1heF90cSA9IDA7CiAJaW50IGRvd24sIHVwOwogCi0JLyoqCi0JICogVGhlIGJhdG1hbiBkYWVtb24gY2hlY2tzIGhlcmUgaWYgd2UgYWxyZWFkeSBwYXNzZWQgYSBmdWxsIG9yaWdpbmF0b3IKLQkgKiBjeWNsZSBpbiBvcmRlciB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgY2hvb3NlIHRoZSBmaXJzdCBnYXRld2F5IHdlCi0JICogaGVhciBhYm91dC4gVGhpcyBjaGVjayBpcyBiYXNlZCBvbiB0aGUgZGFlbW9uJ3MgdXB0aW1lIHdoaWNoIHdlCi0JICogZG9uJ3QgaGF2ZS4KLQkgKiovCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3dfbW9kZSkgIT0gR1dfTU9ERV9DTElFTlQpCi0JCXJldHVybjsKLQotCWN1cnJfZ3cgPSBnd19nZXRfc2VsZWN0ZWRfZ3dfbm9kZShiYXRfcHJpdik7Ci0JaWYgKGN1cnJfZ3cpCi0JCWdvdG8gb3V0OwotCiAJcmN1X3JlYWRfbG9jaygpOwotCWlmIChobGlzdF9lbXB0eSgmYmF0X3ByaXYtPmd3X2xpc3QpKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiUmVtb3Zpbmcgc2VsZWN0ZWQgZ2F0ZXdheSAtICIKLQkJCSJubyBnYXRld2F5IGluIHJhbmdlXG4iKTsKLQkJZ3dfZGVzZWxlY3QoYmF0X3ByaXYpOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ3dfbm9kZSwgbm9kZSwgJmJhdF9wcml2LT5nd19saXN0LCBsaXN0KSB7CiAJCWlmIChnd19ub2RlLT5kZWxldGVkKQogCQkJY29udGludWU7CkBAIC0xMzksNiArMTI1LDkgQEAKIAkJaWYgKCFyb3V0ZXIpCiAJCQljb250aW51ZTsKIAorCQlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJmd3X25vZGUtPnJlZmNvdW50KSkKKwkJCWdvdG8gbmV4dDsKKwogCQlzd2l0Y2ggKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3dfc2VsX2NsYXNzKSkgewogCQljYXNlIDE6IC8qIGZhc3QgY29ubmVjdGlvbiAqLwogCQkJZ3dfYmFuZHdpZHRoX3RvX2tiaXQoZ3dfbm9kZS0+b3JpZ19ub2RlLT5nd19mbGFncywKQEAgLTE1MSw4ICsxNDAsMTIgQEAKIAogCQkJaWYgKCh0bXBfZ3dfZmFjdG9yID4gbWF4X2d3X2ZhY3RvcikgfHwKIAkJCSAgICAoKHRtcF9nd19mYWN0b3IgPT0gbWF4X2d3X2ZhY3RvcikgJiYKLQkJCSAgICAgKHJvdXRlci0+dHFfYXZnID4gbWF4X3RxKSkpCi0JCQkJY3Vycl9nd190bXAgPSBnd19ub2RlOworCQkJICAgICAocm91dGVyLT50cV9hdmcgPiBtYXhfdHEpKSkgeworCQkJCWlmIChjdXJyX2d3KQorCQkJCQlnd19ub2RlX2ZyZWVfcmVmKGN1cnJfZ3cpOworCQkJCWN1cnJfZ3cgPSBnd19ub2RlOworCQkJCWF0b21pY19pbmMoJmN1cnJfZ3ctPnJlZmNvdW50KTsKKwkJCX0KIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6IC8qKgpAQCAtMTYzLDggKzE1NiwxMiBAQAogCQkJICAqICAgICBzb29uIGFzIGEgYmV0dGVyIGdhdGV3YXkgYXBwZWFycyB3aGljaCBoYXMKIAkJCSAgKiAgICAgJHJvdXRpbmdfY2xhc3MgbW9yZSB0cSBwb2ludHMpCiAJCQkgICoqLwotCQkJaWYgKHJvdXRlci0+dHFfYXZnID4gbWF4X3RxKQotCQkJCWN1cnJfZ3dfdG1wID0gZ3dfbm9kZTsKKwkJCWlmIChyb3V0ZXItPnRxX2F2ZyA+IG1heF90cSkgeworCQkJCWlmIChjdXJyX2d3KQorCQkJCQlnd19ub2RlX2ZyZWVfcmVmKGN1cnJfZ3cpOworCQkJCWN1cnJfZ3cgPSBnd19ub2RlOworCQkJCWF0b21pY19pbmMoJmN1cnJfZ3ctPnJlZmNvdW50KTsKKwkJCX0KIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE3NCw0MiArMTcxLDgxIEBACiAJCWlmICh0bXBfZ3dfZmFjdG9yID4gbWF4X2d3X2ZhY3RvcikKIAkJCW1heF9nd19mYWN0b3IgPSB0bXBfZ3dfZmFjdG9yOwogCisJCWd3X25vZGVfZnJlZV9yZWYoZ3dfbm9kZSk7CisKK25leHQ6CiAJCW5laWdoX25vZGVfZnJlZV9yZWYocm91dGVyKTsKIAl9Ci0KLQlpZiAoY3Vycl9ndyAhPSBjdXJyX2d3X3RtcCkgewotCQlyb3V0ZXIgPSBvcmlnX25vZGVfZ2V0X3JvdXRlcihjdXJyX2d3X3RtcC0+b3JpZ19ub2RlKTsKLQkJaWYgKCFyb3V0ZXIpCi0JCQlnb3RvIHVubG9jazsKLQotCQlpZiAoKGN1cnJfZ3cpICYmICghY3Vycl9nd190bXApKQotCQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCQkiUmVtb3Zpbmcgc2VsZWN0ZWQgZ2F0ZXdheSAtICIKLQkJCQkibm8gZ2F0ZXdheSBpbiByYW5nZVxuIik7Ci0JCWVsc2UgaWYgKCghY3Vycl9ndykgJiYgKGN1cnJfZ3dfdG1wKSkKLQkJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkJIkFkZGluZyByb3V0ZSB0byBnYXRld2F5ICVwTSAiCi0JCQkJIihnd19mbGFnczogJWksIHRxOiAlaSlcbiIsCi0JCQkJY3Vycl9nd190bXAtPm9yaWdfbm9kZS0+b3JpZywKLQkJCQljdXJyX2d3X3RtcC0+b3JpZ19ub2RlLT5nd19mbGFncywKLQkJCQlyb3V0ZXItPnRxX2F2Zyk7Ci0JCWVsc2UKLQkJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkJIkNoYW5naW5nIHJvdXRlIHRvIGdhdGV3YXkgJXBNICIKLQkJCQkiKGd3X2ZsYWdzOiAlaSwgdHE6ICVpKVxuIiwKLQkJCQljdXJyX2d3X3RtcC0+b3JpZ19ub2RlLT5vcmlnLAotCQkJCWN1cnJfZ3dfdG1wLT5vcmlnX25vZGUtPmd3X2ZsYWdzLAotCQkJCXJvdXRlci0+dHFfYXZnKTsKLQotCQluZWlnaF9ub2RlX2ZyZWVfcmVmKHJvdXRlcik7Ci0JCWd3X3NlbGVjdChiYXRfcHJpdiwgY3Vycl9nd190bXApOwotCX0KLQotdW5sb2NrOgogCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIGN1cnJfZ3c7Cit9CisKK3ZvaWQgZ3dfZWxlY3Rpb24oc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKK3sKKwlzdHJ1Y3QgZ3dfbm9kZSAqY3Vycl9ndyA9IE5VTEwsICpuZXh0X2d3ID0gTlVMTDsKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyID0gTlVMTDsKKwljaGFyIGd3X2FkZHJbMThdID0geyAnXDAnIH07CisKKwkvKioKKwkgKiBUaGUgYmF0bWFuIGRhZW1vbiBjaGVja3MgaGVyZSBpZiB3ZSBhbHJlYWR5IHBhc3NlZCBhIGZ1bGwgb3JpZ2luYXRvcgorCSAqIGN5Y2xlIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBjaG9vc2UgdGhlIGZpcnN0IGdhdGV3YXkgd2UKKwkgKiBoZWFyIGFib3V0LiBUaGlzIGNoZWNrIGlzIGJhc2VkIG9uIHRoZSBkYWVtb24ncyB1cHRpbWUgd2hpY2ggd2UKKwkgKiBkb24ndCBoYXZlLgorCSAqKi8KKwlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5nd19tb2RlKSAhPSBHV19NT0RFX0NMSUVOVCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWF0b21pY19kZWNfbm90X3plcm8oJmJhdF9wcml2LT5nd19yZXNlbGVjdCkpCisJCWdvdG8gb3V0OworCisJY3Vycl9ndyA9IGd3X2dldF9zZWxlY3RlZF9nd19ub2RlKGJhdF9wcml2KTsKKworCW5leHRfZ3cgPSBnd19nZXRfYmVzdF9nd19ub2RlKGJhdF9wcml2KTsKKworCWlmIChjdXJyX2d3ID09IG5leHRfZ3cpCisJCWdvdG8gb3V0OworCisJaWYgKG5leHRfZ3cpIHsKKwkJc3ByaW50Zihnd19hZGRyLCAiJXBNIiwgbmV4dF9ndy0+b3JpZ19ub2RlLT5vcmlnKTsKKworCQlyb3V0ZXIgPSBvcmlnX25vZGVfZ2V0X3JvdXRlcihuZXh0X2d3LT5vcmlnX25vZGUpOworCQlpZiAoIXJvdXRlcikgeworCQkJZ3dfZGVzZWxlY3QoYmF0X3ByaXYpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoKGN1cnJfZ3cpICYmICghbmV4dF9ndykpIHsKKwkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKKwkJCSJSZW1vdmluZyBzZWxlY3RlZCBnYXRld2F5IC0gbm8gZ2F0ZXdheSBpbiByYW5nZVxuIik7CisJCXRocm93X3VldmVudChiYXRfcHJpdiwgVUVWX0dXLCBVRVZfREVMLCBOVUxMKTsKKwl9IGVsc2UgaWYgKCghY3Vycl9ndykgJiYgKG5leHRfZ3cpKSB7CisJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCisJCQkiQWRkaW5nIHJvdXRlIHRvIGdhdGV3YXkgJXBNIChnd19mbGFnczogJWksIHRxOiAlaSlcbiIsCisJCQluZXh0X2d3LT5vcmlnX25vZGUtPm9yaWcsCisJCQluZXh0X2d3LT5vcmlnX25vZGUtPmd3X2ZsYWdzLAorCQkJcm91dGVyLT50cV9hdmcpOworCQl0aHJvd191ZXZlbnQoYmF0X3ByaXYsIFVFVl9HVywgVUVWX0FERCwgZ3dfYWRkcik7CisJfSBlbHNlIHsKKwkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKKwkJCSJDaGFuZ2luZyByb3V0ZSB0byBnYXRld2F5ICVwTSAiCisJCQkiKGd3X2ZsYWdzOiAlaSwgdHE6ICVpKVxuIiwKKwkJCW5leHRfZ3ctPm9yaWdfbm9kZS0+b3JpZywKKwkJCW5leHRfZ3ctPm9yaWdfbm9kZS0+Z3dfZmxhZ3MsCisJCQlyb3V0ZXItPnRxX2F2Zyk7CisJCXRocm93X3VldmVudChiYXRfcHJpdiwgVUVWX0dXLCBVRVZfQ0hBTkdFLCBnd19hZGRyKTsKKwl9CisKKwlnd19zZWxlY3QoYmF0X3ByaXYsIG5leHRfZ3cpOworCiBvdXQ6CiAJaWYgKGN1cnJfZ3cpCiAJCWd3X25vZGVfZnJlZV9yZWYoY3Vycl9ndyk7CisJaWYgKG5leHRfZ3cpCisJCWd3X25vZGVfZnJlZV9yZWYobmV4dF9ndyk7CisJaWYgKHJvdXRlcikKKwkJbmVpZ2hfbm9kZV9mcmVlX3JlZihyb3V0ZXIpOwogfQogCiB2b2lkIGd3X2NoZWNrX2VsZWN0aW9uKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSkKQEAgLTI3MywxMSArMzA5LDEwIEBACiAJc3RydWN0IGd3X25vZGUgKmd3X25vZGU7CiAJaW50IGRvd24sIHVwOwogCi0JZ3dfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBnd19ub2RlKSwgR0ZQX0FUT01JQyk7CisJZ3dfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpnd19ub2RlKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFnd19ub2RlKQogCQlyZXR1cm47CiAKLQltZW1zZXQoZ3dfbm9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBnd19ub2RlKSk7CiAJSU5JVF9ITElTVF9OT0RFKCZnd19ub2RlLT5saXN0KTsKIAlnd19ub2RlLT5vcmlnX25vZGUgPSBvcmlnX25vZGU7CiAJYXRvbWljX3NldCgmZ3dfbm9kZS0+cmVmY291bnQsIDEpOwpAQCAtMzIzLDcgKzM1OCw3IEBACiAKIAkJZ3dfbm9kZS0+ZGVsZXRlZCA9IDA7CiAKLQkJaWYgKG5ld19nd2ZsYWdzID09IDApIHsKKwkJaWYgKG5ld19nd2ZsYWdzID09IE5PX0ZMQUdTKSB7CiAJCQlnd19ub2RlLT5kZWxldGVkID0gamlmZmllczsKIAkJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCiAJCQkJIkdhdGV3YXkgJXBNIHJlbW92ZWQgZnJvbSBnYXRld2F5IGxpc3RcbiIsCkBAIC0zMzYsNyArMzcxLDcgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JaWYgKG5ld19nd2ZsYWdzID09IDApCisJaWYgKG5ld19nd2ZsYWdzID09IE5PX0ZMQUdTKQogCQlnb3RvIHVubG9jazsKIAogCWd3X25vZGVfYWRkKGJhdF9wcml2LCBvcmlnX25vZGUsIG5ld19nd2ZsYWdzKTsKQEAgLTM1Myw3ICszODgsNyBAQAogCiB2b2lkIGd3X25vZGVfZGVsZXRlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSkKIHsKLQlyZXR1cm4gZ3dfbm9kZV91cGRhdGUoYmF0X3ByaXYsIG9yaWdfbm9kZSwgMCk7CisJZ3dfbm9kZV91cGRhdGUoYmF0X3ByaXYsIG9yaWdfbm9kZSwgMCk7CiB9CiAKIHZvaWQgZ3dfbm9kZV9wdXJnZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQpAQCAtMzYxLDcgKzM5Niw3IEBACiAJc3RydWN0IGd3X25vZGUgKmd3X25vZGUsICpjdXJyX2d3OwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbm9kZV90bXA7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gMiAqIFBVUkdFX1RJTUVPVVQgKiBIWjsKLQljaGFyIGRvX2Rlc2VsZWN0ID0gMDsKKwlpbnQgZG9fZGVzZWxlY3QgPSAwOwogCiAJY3Vycl9ndyA9IGd3X2dldF9zZWxlY3RlZF9nd19ub2RlKGJhdF9wcml2KTsKIApAQCAtMzk0LDggKzQyOSw4IEBACiAvKioKICAqIGZhaWxzIGlmIG9yaWdfbm9kZSBoYXMgbm8gcm91dGVyCiAgKi8KLXN0YXRpYyBpbnQgX3dyaXRlX2J1ZmZlcl90ZXh0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgICBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGd3X25vZGUgKmd3X25vZGUpCitzdGF0aWMgaW50IF93cml0ZV9idWZmZXJfdGV4dChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBnd19ub2RlICpnd19ub2RlKQogewogCXN0cnVjdCBnd19ub2RlICpjdXJyX2d3OwogCXN0cnVjdCBuZWlnaF9ub2RlICpyb3V0ZXI7CkBAIC00NTIsMTAgKzQ4Nyw5IEBACiAJfQogCiAJc2VxX3ByaW50ZihzZXEsICIgICAgICAlLTEycyAoJXMvJWkpICUxN3MgWyUxMHNdOiBnd19jbGFzcyAuLi4gIgotCQkgICAiW0IuQS5ULk0uQS5OLiBhZHYgJXMlcywgTWFpbklGL01BQzogJXMvJXBNICglcyldXG4iLAorCQkgICAiW0IuQS5ULk0uQS5OLiBhZHYgJXMsIE1haW5JRi9NQUM6ICVzLyVwTSAoJXMpXVxuIiwKIAkJICAgIkdhdGV3YXkiLCAiIyIsIFRRX01BWF9WQUxVRSwgIk5leHRob3AiLAotCQkgICAib3V0Z29pbmdJRiIsIFNPVVJDRV9WRVJTSU9OLCBSRVZJU0lPTl9WRVJTSU9OX1NUUiwKLQkJICAgcHJpbWFyeV9pZi0+bmV0X2Rldi0+bmFtZSwKKwkJICAgIm91dGdvaW5nSUYiLCBTT1VSQ0VfVkVSU0lPTiwgcHJpbWFyeV9pZi0+bmV0X2Rldi0+bmFtZSwKIAkJICAgcHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIG5ldF9kZXYtPm5hbWUpOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtNDgwLDE0ICs1MTQsNzUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZ3dfaXNfdGFyZ2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgYm9vbCBpc190eXBlX2RoY3ByZXF1ZXN0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZWFkZXJfbGVuKQoreworCWludCByZXQgPSBmYWxzZTsKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBwa3RfbGVuOworCisJaWYgKHNrYl9saW5lYXJpemUoc2tiKSA8IDApCisJCWdvdG8gb3V0OworCisJcGt0X2xlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisKKwlpZiAocGt0X2xlbiA8IGhlYWRlcl9sZW4gKyBESENQX09QVElPTlNfT0ZGU0VUICsgMSkKKwkJZ290byBvdXQ7CisKKwlwID0gc2tiLT5kYXRhICsgaGVhZGVyX2xlbiArIERIQ1BfT1BUSU9OU19PRkZTRVQ7CisJcGt0X2xlbiAtPSBoZWFkZXJfbGVuICsgREhDUF9PUFRJT05TX09GRlNFVCArIDE7CisKKwkvKiBBY2Nlc3MgdGhlIGRoY3Agb3B0aW9uIGxpc3RzLiBFYWNoIGVudHJ5IGlzIG1hZGUgdXAgYnk6CisJICogLSBvY3RlY3QgMTogb3B0aW9uIHR5cGUKKwkgKiAtIG9jdGVjdCAyOiBvcHRpb24gZGF0YSBsZW4gKG9ubHkgaWYgdHlwZSAhPSAyNTUgYW5kIDApCisJICogLSBvY3RlY3QgMzogb3B0aW9uIGRhdGEgKi8KKwl3aGlsZSAoKnAgIT0gMjU1ICYmICFyZXQpIHsKKwkJLyogcCBub3cgcG9pbnRzIHRvIHRoZSBmaXJzdCBvY3RlY3Q6IG9wdGlvbiB0eXBlICovCisJCWlmICgqcCA9PSA1MykgeworCQkJLyogdHlwZSA1MyBpcyB0aGUgbWVzc2FnZSB0eXBlIG9wdGlvbi4KKwkJCSAqIEp1bXAgdGhlIGxlbiBvY3RlY3QgYW5kIGdvIHRvIHRoZSBkYXRhIG9jdGVjdCAqLworCQkJaWYgKHBrdF9sZW4gPCAyKQorCQkJCWdvdG8gb3V0OworCQkJcCArPSAyOworCisJCQkvKiBjaGVjayBpZiB0aGUgbWVzc2FnZSB0eXBlIGlzIHdoYXQgd2UgbmVlZCAqLworCQkJaWYgKCpwID09IERIQ1BfUkVRVUVTVCkKKwkJCQlyZXQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKnAgPT0gMCkgeworCQkJLyogb3B0aW9uIHR5cGUgMCAocGFkZGluZyksIGp1c3QgZ28gZm9yd2FyZCAqLworCQkJaWYgKHBrdF9sZW4gPCAxKQorCQkJCWdvdG8gb3V0OworCQkJcGt0X2xlbi0tOworCQkJcCsrOworCQl9IGVsc2UgeworCQkJLyogVGhpcyBpcyBhbnkgb3RoZXIgb3B0aW9uLiBTbyB3ZSBnZXQgdGhlIGxlbmd0aC4uLiAqLworCQkJaWYgKHBrdF9sZW4gPCAxKQorCQkJCWdvdG8gb3V0OworCQkJcGt0X2xlbi0tOworCQkJcCsrOworCisJCQkvKiAuLi5hbmQgdGhlbiB3ZSBqdW1wIG92ZXIgdGhlIGRhdGEgKi8KKwkJCWlmIChwa3RfbGVuIDwgKnApCisJCQkJZ290byBvdXQ7CisJCQlwa3RfbGVuIC09ICpwOworCQkJcCArPSAoKnApOworCQl9CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2ludCBnd19pc190YXJnZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJIHN0cnVjdCBvcmlnX25vZGUgKm9sZF9ndykKIHsKIAlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7CiAJc3RydWN0IGlwaGRyICppcGhkcjsKIAlzdHJ1Y3QgaXB2NmhkciAqaXB2NmhkcjsKIAlzdHJ1Y3QgdWRwaGRyICp1ZHBoZHI7CiAJc3RydWN0IGd3X25vZGUgKmN1cnJfZ3c7CisJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX2N1cnIgPSBOVUxMLCAqbmVpZ2hfb2xkID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgaGVhZGVyX2xlbiA9IDA7CisJaW50IHJldCA9IDE7CiAKIAlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5nd19tb2RlKSA9PSBHV19NT0RFX09GRikKIAkJcmV0dXJuIDA7CkBAIC01MDksNyArNjA0LDcgQEAKIAkvKiBjaGVjayBmb3IgaXAgaGVhZGVyICovCiAJc3dpdGNoIChudG9ocyhldGhoZHItPmhfcHJvdG8pKSB7CiAJY2FzZSBFVEhfUF9JUDoKLQkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKKwkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaGVhZGVyX2xlbiArIHNpemVvZigqaXBoZHIpKSkKIAkJCXJldHVybiAwOwogCQlpcGhkciA9IChzdHJ1Y3QgaXBoZHIgKikoc2tiLT5kYXRhICsgaGVhZGVyX2xlbik7CiAJCWhlYWRlcl9sZW4gKz0gaXBoZHItPmlobCAqIDQ7CkBAIC01MjAsMTAgKzYxNSwxMCBAQAogCiAJCWJyZWFrOwogCWNhc2UgRVRIX1BfSVBWNjoKLQkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQorCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBoZWFkZXJfbGVuICsgc2l6ZW9mKCppcHY2aGRyKSkpCiAJCQlyZXR1cm4gMDsKIAkJaXB2NmhkciA9IChzdHJ1Y3QgaXB2NmhkciAqKShza2ItPmRhdGEgKyBoZWFkZXJfbGVuKTsKLQkJaGVhZGVyX2xlbiArPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCQloZWFkZXJfbGVuICs9IHNpemVvZigqaXB2Nmhkcik7CiAKIAkJLyogY2hlY2sgZm9yIHVkcCBoZWFkZXIgKi8KIAkJaWYgKGlwdjZoZHItPm5leHRoZHIgIT0gSVBQUk9UT19VRFApCkBAIC01MzQsMTAgKzYyOSwxMCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBoZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKSkKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBoZWFkZXJfbGVuICsgc2l6ZW9mKCp1ZHBoZHIpKSkKIAkJcmV0dXJuIDA7CiAJdWRwaGRyID0gKHN0cnVjdCB1ZHBoZHIgKikoc2tiLT5kYXRhICsgaGVhZGVyX2xlbik7Ci0JaGVhZGVyX2xlbiArPSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJaGVhZGVyX2xlbiArPSBzaXplb2YoKnVkcGhkcik7CiAKIAkvKiBjaGVjayBmb3IgYm9vdHAgcG9ydCAqLwogCWlmICgobnRvaHMoZXRoaGRyLT5oX3Byb3RvKSA9PSBFVEhfUF9JUCkgJiYKQEAgLTU1NSw3ICs2NTAsMzAgQEAKIAlpZiAoIWN1cnJfZ3cpCiAJCXJldHVybiAwOwogCisJLyogSWYgb2xkX2d3ICE9IE5VTEwgdGhlbiB0aGlzIHBhY2tldCBpcyB1bmljYXN0LgorCSAqIFNvLCBhdCB0aGlzIHBvaW50IHdlIGhhdmUgdG8gY2hlY2sgdGhlIG1lc3NhZ2UgdHlwZTogaWYgaXQgaXMgYQorCSAqIERIQ1BSRVFVRVNUIHdlIGhhdmUgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZHJvcCBpdCBvciBub3QgKi8KKwlpZiAob2xkX2d3ICYmIGN1cnJfZ3ctPm9yaWdfbm9kZSAhPSBvbGRfZ3cpIHsKKwkJaWYgKGlzX3R5cGVfZGhjcHJlcXVlc3Qoc2tiLCBoZWFkZXJfbGVuKSkgeworCQkJLyogSWYgdGhlIGRoY3AgcGFja2V0IGhhcyBiZWVuIHNlbnQgdG8gYSBkaWZmZXJlbnQgZ3csCisJCQkgKiB3ZSBoYXZlIHRvIGV2YWx1YXRlIHdoZXRoZXIgdGhlIG9sZCBndyBpcyBzdGlsbAorCQkJICogcmVsaWFibGUgZW5vdWdoICovCisJCQluZWlnaF9jdXJyID0gZmluZF9yb3V0ZXIoYmF0X3ByaXYsIGN1cnJfZ3ctPm9yaWdfbm9kZSwKKwkJCQkJCSBOVUxMKTsKKwkJCW5laWdoX29sZCA9IGZpbmRfcm91dGVyKGJhdF9wcml2LCBvbGRfZ3csIE5VTEwpOworCQkJaWYgKCFuZWlnaF9jdXJyIHx8ICFuZWlnaF9vbGQpCisJCQkJZ290byBmcmVlX25laWdoOworCQkJaWYgKG5laWdoX2N1cnItPnRxX2F2ZyAtIG5laWdoX29sZC0+dHFfYXZnIDwKKwkJCQkJCQkJR1dfVEhSRVNIT0xEKQorCQkJCXJldCA9IC0xOworCQl9CisJfQorZnJlZV9uZWlnaDoKKwlpZiAobmVpZ2hfb2xkKQorCQluZWlnaF9ub2RlX2ZyZWVfcmVmKG5laWdoX29sZCk7CisJaWYgKG5laWdoX2N1cnIpCisJCW5laWdoX25vZGVfZnJlZV9yZWYobmVpZ2hfY3Vycik7CiAJaWYgKGN1cnJfZ3cpCiAJCWd3X25vZGVfZnJlZV9yZWYoY3Vycl9ndyk7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmggYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5oCmluZGV4IDFjZThjNjAuLmI5Yjk4M2MgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuaApAQCAtMzEsNiArMzEsNyBAQAogdm9pZCBnd19ub2RlX2RlbGV0ZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUpOwogdm9pZCBnd19ub2RlX3B1cmdlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwogaW50IGd3X2NsaWVudF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLWludCBnd19pc190YXJnZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgZ3dfaXNfdGFyZ2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCSBzdHJ1Y3Qgb3JpZ19ub2RlICpvbGRfZ3cpOwogCiAjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0dBVEVXQVlfQ0xJRU5UX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NvbW1vbi5jIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jb21tb24uYwppbmRleCA1MGQzYTU5Li4xODY2MWFmIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NvbW1vbi5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY29tbW9uLmMKQEAgLTYxLDkgKzYxLDkgQEAKIC8qIHJldHVybnMgdGhlIHVwIGFuZCBkb3duc3BlZWRzIGluIGtiaXQsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY2xhc3MgKi8KIHZvaWQgZ3dfYmFuZHdpZHRoX3RvX2tiaXQodWludDhfdCBnd19zcnZfY2xhc3MsIGludCAqZG93biwgaW50ICp1cCkKIHsKLQljaGFyIHNiaXQgPSAoZ3dfc3J2X2NsYXNzICYgMHg4MCkgPj4gNzsKLQljaGFyIGRwYXJ0ID0gKGd3X3Nydl9jbGFzcyAmIDB4NzgpID4+IDM7Ci0JY2hhciB1cGFydCA9IChnd19zcnZfY2xhc3MgJiAweDA3KTsKKwlpbnQgc2JpdCA9IChnd19zcnZfY2xhc3MgJiAweDgwKSA+PiA3OworCWludCBkcGFydCA9IChnd19zcnZfY2xhc3MgJiAweDc4KSA+PiAzOworCWludCB1cGFydCA9IChnd19zcnZfY2xhc3MgJiAweDA3KTsKIAogCWlmICghZ3dfc3J2X2NsYXNzKSB7CiAJCSpkb3duID0gMDsKQEAgLTc2LDEwICs3NiwxMSBAQAogfQogCiBzdGF0aWMgYm9vbCBwYXJzZV9nd19iYW5kd2lkdGgoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGNoYXIgKmJ1ZmYsCi0JCQkgICAgICAgbG9uZyAqdXAsIGxvbmcgKmRvd24pCisJCQkgICAgICAgaW50ICp1cCwgaW50ICpkb3duKQogewogCWludCByZXQsIG11bHRpID0gMTsKIAljaGFyICpzbGFzaF9wdHIsICp0bXBfcHRyOworCWxvbmcgbGRvd24sIGx1cDsKIAogCXNsYXNoX3B0ciA9IHN0cmNocihidWZmLCAnLycpOwogCWlmIChzbGFzaF9wdHIpCkBAIC05Niw3ICs5Nyw3IEBACiAJCQkqdG1wX3B0ciA9ICdcMCc7CiAJfQogCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmZiwgMTAsIGRvd24pOworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmZiwgMTAsICZsZG93bik7CiAJaWYgKHJldCkgewogCQliYXRfZXJyKG5ldF9kZXYsCiAJCQkiRG93bmxvYWQgc3BlZWQgb2YgZ2F0ZXdheSBtb2RlIGludmFsaWQ6ICVzXG4iLApAQCAtMTA0LDcgKzEwNSw3IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQkqZG93biAqPSBtdWx0aTsKKwkqZG93biA9IGxkb3duICogbXVsdGk7CiAKIAkvKiB3ZSBhbHNvIGdvdCBzb21lIHVwbG9hZCBpbmZvICovCiAJaWYgKHNsYXNoX3B0cikgewpAQCAtMTIxLDcgKzEyMiw3IEBACiAJCQkJKnRtcF9wdHIgPSAnXDAnOwogCQl9CiAKLQkJcmV0ID0gc3RyaWN0X3N0cnRvdWwoc2xhc2hfcHRyICsgMSwgMTAsIHVwKTsKKwkJcmV0ID0gc3RyaWN0X3N0cnRvbChzbGFzaF9wdHIgKyAxLCAxMCwgJmx1cCk7CiAJCWlmIChyZXQpIHsKIAkJCWJhdF9lcnIobmV0X2RldiwKIAkJCQkiVXBsb2FkIHNwZWVkIG9mIGdhdGV3YXkgbW9kZSBpbnZhbGlkOiAiCkBAIC0xMjksNyArMTMwLDcgQEAKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCi0JCSp1cCAqPSBtdWx0aTsKKwkJKnVwID0gbHVwICogbXVsdGk7CiAJfQogCiAJcmV0dXJuIHRydWU7CkBAIC0xMzgsNyArMTM5LDggQEAKIHNzaXplX3QgZ3dfYmFuZHdpZHRoX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlsb25nIGd3X2JhbmR3aWR0aF90bXAgPSAwLCB1cCA9IDAsIGRvd24gPSAwOworCWxvbmcgZ3dfYmFuZHdpZHRoX3RtcCA9IDA7CisJaW50IHVwID0gMCwgZG93biA9IDA7CiAJYm9vbCByZXQ7CiAKIAlyZXQgPSBwYXJzZV9nd19iYW5kd2lkdGgobmV0X2RldiwgYnVmZiwgJnVwLCAmZG93bik7CkBAIC0xNTgsMTIgKzE2MCwxMSBAQAogCSAqIHNwZWVkcywgaGVuY2Ugd2UgbmVlZCB0byBjYWxjdWxhdGUgaXQgYmFjayB0byBzaG93IHRoZSBudW1iZXIKIAkgKiB0aGF0IGlzIGdvaW5nIHRvIGJlIHByb3BhZ2F0ZWQKIAkgKiovCi0JZ3dfYmFuZHdpZHRoX3RvX2tiaXQoKHVpbnQ4X3QpZ3dfYmFuZHdpZHRoX3RtcCwKLQkJCSAgICAgKGludCAqKSZkb3duLCAoaW50ICopJnVwKTsKKwlnd19iYW5kd2lkdGhfdG9fa2JpdCgodWludDhfdClnd19iYW5kd2lkdGhfdG1wLCAmZG93biwgJnVwKTsKIAogCWd3X2Rlc2VsZWN0KGJhdF9wcml2KTsKIAliYXRfaW5mbyhuZXRfZGV2LCAiQ2hhbmdpbmcgZ2F0ZXdheSBiYW5kd2lkdGggZnJvbTogJyVpJyB0bzogJyVsZCcgIgotCQkgIihwcm9wYWdhdGluZzogJWxkJXMvJWxkJXMpXG4iLAorCQkgIihwcm9wYWdhdGluZzogJWQlcy8lZCVzKVxuIiwKIAkJIGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3dfYmFuZHdpZHRoKSwgZ3dfYmFuZHdpZHRoX3RtcCwKIAkJIChkb3duID4gMjA0OCA/IGRvd24gLyAxMDI0IDogZG93biksCiAJCSAoZG93biA+IDIwNDggPyAiTUJpdCIgOiAiS0JpdCIpLApkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYyBiL25ldC9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMKaW5kZXggZGZiZmNjYy4uZGI3YWFjZiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYworKysgYi9uZXQvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jCkBAIC00Niw3ICs0Niw3IEBACiAJa2ZyZWUoaGFyZF9pZmFjZSk7CiB9CiAKLXN0cnVjdCBoYXJkX2lmYWNlICpoYXJkaWZfZ2V0X2J5X25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3N0cnVjdCBoYXJkX2lmYWNlICpoYXJkaWZfZ2V0X2J5X25ldGRldihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKIAlzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZTsKIApAQCAtNjQsNyArNjQsNyBAQAogCXJldHVybiBoYXJkX2lmYWNlOwogfQogCi1zdGF0aWMgaW50IGlzX3ZhbGlkX2lmYWNlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQorc3RhdGljIGludCBpc192YWxpZF9pZmFjZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKIAlpZiAobmV0X2Rldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spCiAJCXJldHVybiAwOwpAQCAtODYsNyArODYsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRpZl9nZXRfYWN0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQorc3RhdGljIHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkaWZfZ2V0X2FjdGl2ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSkKIHsKIAlzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZTsKIApAQCAtMTM4LDcgKzEzOCw3IEBACiAJaWYgKG5ld19oYXJkX2lmYWNlICYmICFhdG9taWNfaW5jX25vdF96ZXJvKCZuZXdfaGFyZF9pZmFjZS0+cmVmY291bnQpKQogCQluZXdfaGFyZF9pZmFjZSA9IE5VTEw7CiAKLQljdXJyX2hhcmRfaWZhY2UgPSBiYXRfcHJpdi0+cHJpbWFyeV9pZjsKKwljdXJyX2hhcmRfaWZhY2UgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKGJhdF9wcml2LT5wcmltYXJ5X2lmLCAxKTsKIAlyY3VfYXNzaWduX3BvaW50ZXIoYmF0X3ByaXYtPnByaW1hcnlfaWYsIG5ld19oYXJkX2lmYWNlKTsKIAogCWlmIChjdXJyX2hhcmRfaWZhY2UpCkBAIC0xNTIsMTUgKzE1Miw5IEBACiAJYmF0bWFuX3BhY2tldC0+dHRsID0gVFRMOwogCiAJcHJpbWFyeV9pZl91cGRhdGVfYWRkcihiYXRfcHJpdik7Ci0KLQkvKioqCi0JICogaGFja3kgdHJpY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc2VuZCB0aGUgVFQgaW5mb3JtYXRpb24gdmlhCi0JICogb3VyIG5ldyBwcmltYXJ5IGludGVyZmFjZQotCSAqLwotCWF0b21pY19zZXQoJmJhdF9wcml2LT50dF9sb2NhbF9jaGFuZ2VkLCAxKTsKIH0KIAotc3RhdGljIGJvb2wgaGFyZGlmX2lzX2lmYWNlX3VwKHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlKQorc3RhdGljIGJvb2wgaGFyZGlmX2lzX2lmYWNlX3VwKGNvbnN0IHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlKQogewogCWlmIChoYXJkX2lmYWNlLT5uZXRfZGV2LT5mbGFncyAmIElGRl9VUCkKIAkJcmV0dXJuIHRydWU7CkBAIC0xNzYsOSArMTcwLDkgQEAKIAkgICAgICAgaGFyZF9pZmFjZS0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIH0KIAotc3RhdGljIHZvaWQgY2hlY2tfa25vd25fbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCitzdGF0aWMgdm9pZCBjaGVja19rbm93bl9tYWNfYWRkcihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKLQlzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZTsKKwljb25zdCBzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShoYXJkX2lmYWNlLCAmaGFyZGlmX2xpc3QsIGxpc3QpIHsKQEAgLTIwNCw4ICsxOTgsOCBAQAogCiBpbnQgaGFyZGlmX21pbl9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpCiB7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOwotCXN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlOworCWNvbnN0IHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKKwljb25zdCBzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZTsKIAkvKiBhbGxvdyBiaWcgZnJhbWVzIGlmIGFsbCBkZXZpY2VzIGFyZSBjYXBhYmxlIHRvIGRvIHNvCiAJICogKGhhdmUgTVRVID4gMTUwMCArIEJBVF9IRUFERVJfTEVOKSAqLwogCWludCBtaW5fbXR1ID0gRVRIX0RBVEFfTEVOOwpAQCAtMjg1LDcgKzI3OSw4IEBACiAJdXBkYXRlX21pbl9tdHUoaGFyZF9pZmFjZS0+c29mdF9pZmFjZSk7CiB9CiAKLWludCBoYXJkaWZfZW5hYmxlX2ludGVyZmFjZShzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSwgY2hhciAqaWZhY2VfbmFtZSkKK2ludCBoYXJkaWZfZW5hYmxlX2ludGVyZmFjZShzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSwKKwkJCSAgICBjb25zdCBjaGFyICppZmFjZV9uYW1lKQogewogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7CiAJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7CkBAIC0zMzYsMTAgKzMzMSwxMSBAQAogCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoaGFyZF9pZmFjZS0+cGFja2V0X2J1ZmYpOwogCWJhdG1hbl9wYWNrZXQtPnBhY2tldF90eXBlID0gQkFUX1BBQ0tFVDsKIAliYXRtYW5fcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047Ci0JYmF0bWFuX3BhY2tldC0+ZmxhZ3MgPSAwOworCWJhdG1hbl9wYWNrZXQtPmZsYWdzID0gTk9fRkxBR1M7CiAJYmF0bWFuX3BhY2tldC0+dHRsID0gMjsKIAliYXRtYW5fcGFja2V0LT50cSA9IFRRX01BWF9WQUxVRTsKLQliYXRtYW5fcGFja2V0LT5udW1fdHQgPSAwOworCWJhdG1hbl9wYWNrZXQtPnR0X251bV9jaGFuZ2VzID0gMDsKKwliYXRtYW5fcGFja2V0LT50dHZuID0gMDsKIAogCWhhcmRfaWZhY2UtPmlmX251bSA9IGJhdF9wcml2LT5udW1faWZhY2VzOwogCWJhdF9wcml2LT5udW1faWZhY2VzKys7CkBAIC00NTgsNyArNDU0LDcgQEAKIAogCWRldl9ob2xkKG5ldF9kZXYpOwogCi0JaGFyZF9pZmFjZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoYXJkX2lmYWNlKSwgR0ZQX0FUT01JQyk7CisJaGFyZF9pZmFjZSA9IGttYWxsb2Moc2l6ZW9mKCpoYXJkX2lmYWNlKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFoYXJkX2lmYWNlKSB7CiAJCXByX2VycigiQ2FuJ3QgYWRkIGludGVyZmFjZSAoJXMpOiBvdXQgb2YgbWVtb3J5XG4iLAogCQkgICAgICAgbmV0X2Rldi0+bmFtZSk7CkBAIC01MjIsNyArNTE4LDcgQEAKIHN0YXRpYyBpbnQgaGFyZF9pZl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCiAJCQkgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcHRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcHRyOwogCXN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlID0gaGFyZGlmX2dldF9ieV9uZXRkZXYobmV0X2Rldik7CiAJc3RydWN0IGhhcmRfaWZhY2UgKnByaW1hcnlfaWYgPSBOVUxMOwogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7CkBAIC01NjcsNyArNTYzLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIGhhcmRpZl9wdXQ6CiAJaGFyZGlmX2ZyZWVfcmVmKGhhcmRfaWZhY2UpOwpAQCAtNjU4LDYgKzY1NCwxNCBAQAogCWNhc2UgQkFUX1ZJUzoKIAkJcmV0ID0gcmVjdl92aXNfcGFja2V0KHNrYiwgaGFyZF9pZmFjZSk7CiAJCWJyZWFrOworCQkvKiBUcmFuc2xhdGlvbiB0YWJsZSBxdWVyeSAocmVxdWVzdCBvciByZXNwb25zZSkgKi8KKwljYXNlIEJBVF9UVF9RVUVSWToKKwkJcmV0ID0gcmVjdl90dF9xdWVyeShza2IsIGhhcmRfaWZhY2UpOworCQlicmVhazsKKwkJLyogUm9hbWluZyBhZHZlcnRpc2VtZW50ICovCisJY2FzZSBCQVRfUk9BTV9BRFY6CisJCXJldCA9IHJlY3Zfcm9hbV9hZHYoc2tiLCBoYXJkX2lmYWNlKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gTkVUX1JYX0RST1A7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuaCBiL25ldC9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmgKaW5kZXggNjQyNjU5OS4uNDQyZWFjYiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5oCkBAIC0yMiwxNyArMjIsMjEgQEAKICNpZm5kZWYgX05FVF9CQVRNQU5fQURWX0hBUkRfSU5URVJGQUNFX0hfCiAjZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9IQVJEX0lOVEVSRkFDRV9IXwogCi0jZGVmaW5lIElGX05PVF9JTl9VU0UgMAotI2RlZmluZSBJRl9UT19CRV9SRU1PVkVEIDEKLSNkZWZpbmUgSUZfSU5BQ1RJVkUgMgotI2RlZmluZSBJRl9BQ1RJVkUgMwotI2RlZmluZSBJRl9UT19CRV9BQ1RJVkFURUQgNAotI2RlZmluZSBJRl9JX1dBTlRfWU9VIDUKK2VudW0gaGFyZF9pZl9zdGF0ZSB7CisJSUZfTk9UX0lOX1VTRSwKKwlJRl9UT19CRV9SRU1PVkVELAorCUlGX0lOQUNUSVZFLAorCUlGX0FDVElWRSwKKwlJRl9UT19CRV9BQ1RJVkFURUQsCisJSUZfSV9XQU5UX1lPVQorfTsKIAogZXh0ZXJuIHN0cnVjdCBub3RpZmllcl9ibG9jayBoYXJkX2lmX25vdGlmaWVyOwogCi1zdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZGlmX2dldF9ieV9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotaW50IGhhcmRpZl9lbmFibGVfaW50ZXJmYWNlKHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlLCBjaGFyICppZmFjZV9uYW1lKTsKK3N0cnVjdCBoYXJkX2lmYWNlKgoraGFyZGlmX2dldF9ieV9uZXRkZXYoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworaW50IGhhcmRpZl9lbmFibGVfaW50ZXJmYWNlKHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlLAorCQkJICAgIGNvbnN0IGNoYXIgKmlmYWNlX25hbWUpOwogdm9pZCBoYXJkaWZfZGlzYWJsZV9pbnRlcmZhY2Uoc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2UpOwogdm9pZCBoYXJkaWZfcmVtb3ZlX2ludGVyZmFjZXModm9pZCk7CiBpbnQgaGFyZGlmX21pbl9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpOwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvaGFzaC5jIGIvbmV0L2JhdG1hbi1hZHYvaGFzaC5jCmluZGV4IGM1MjEzZDguLjJhMTcyNTAgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2hhc2guYworKysgYi9uZXQvYmF0bWFuLWFkdi9oYXNoLmMKQEAgLTQ2LDE1ICs0NiwxNiBAQAogewogCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaDsKIAotCWhhc2ggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGFzaHRhYmxlX3QpLCBHRlBfQVRPTUlDKTsKKwloYXNoID0ga21hbGxvYyhzaXplb2YoKmhhc2gpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWhhc2gpCiAJCXJldHVybiBOVUxMOwogCi0JaGFzaC0+dGFibGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWxlbWVudF90ICopICogc2l6ZSwgR0ZQX0FUT01JQyk7CisJaGFzaC0+dGFibGUgPSBrbWFsbG9jKHNpemVvZigqaGFzaC0+dGFibGUpICogc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFoYXNoLT50YWJsZSkKIAkJZ290byBmcmVlX2hhc2g7CiAKLQloYXNoLT5saXN0X2xvY2tzID0ga21hbGxvYyhzaXplb2Yoc3BpbmxvY2tfdCkgKiBzaXplLCBHRlBfQVRPTUlDKTsKKwloYXNoLT5saXN0X2xvY2tzID0ga21hbGxvYyhzaXplb2YoKmhhc2gtPmxpc3RfbG9ja3MpICogc2l6ZSwKKwkJCQkgICBHRlBfQVRPTUlDKTsKIAlpZiAoIWhhc2gtPmxpc3RfbG9ja3MpCiAJCWdvdG8gZnJlZV90YWJsZTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvaGFzaC5oIGIvbmV0L2JhdG1hbi1hZHYvaGFzaC5oCmluZGV4IDQzNDgyMmIuLmRkNWM5ZmQgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2hhc2guaAorKysgYi9uZXQvYmF0bWFuLWFkdi9oYXNoLmgKQEAgLTI4LDEyICsyOCwxMiBAQAogICogY29tcGFyZSAyIGVsZW1lbnQgZGF0YXMgZm9yIHRoZWlyIGtleXMsCiAgKiByZXR1cm4gMCBpZiBzYW1lIGFuZCBub3QgMCBpZiBub3QKICAqIHNhbWUgKi8KLXR5cGVkZWYgaW50ICgqaGFzaGRhdGFfY29tcGFyZV9jYikoc3RydWN0IGhsaXN0X25vZGUgKiwgdm9pZCAqKTsKK3R5cGVkZWYgaW50ICgqaGFzaGRhdGFfY29tcGFyZV9jYikoY29uc3Qgc3RydWN0IGhsaXN0X25vZGUgKiwgY29uc3Qgdm9pZCAqKTsKIAogLyogdGhlIGhhc2hmdW5jdGlvbiwgc2hvdWxkIHJldHVybiBhbiBpbmRleAogICogYmFzZWQgb24gdGhlIGtleSBpbiB0aGUgZGF0YSBvZiB0aGUgZmlyc3QKICAqIGFyZ3VtZW50IGFuZCB0aGUgc2l6ZSB0aGUgc2Vjb25kICovCi10eXBlZGVmIGludCAoKmhhc2hkYXRhX2Nob29zZV9jYikodm9pZCAqLCBpbnQpOwordHlwZWRlZiBpbnQgKCpoYXNoZGF0YV9jaG9vc2VfY2IpKGNvbnN0IHZvaWQgKiwgaW50KTsKIHR5cGVkZWYgdm9pZCAoKmhhc2hkYXRhX2ZyZWVfY2IpKHN0cnVjdCBobGlzdF9ub2RlICosIHZvaWQgKik7CiAKIHN0cnVjdCBoYXNodGFibGVfdCB7CkBAIC04MCw3ICs4MCw3IEBACiBzdGF0aWMgaW5saW5lIGludCBoYXNoX2FkZChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsCiAJCQkgICBoYXNoZGF0YV9jb21wYXJlX2NiIGNvbXBhcmUsCiAJCQkgICBoYXNoZGF0YV9jaG9vc2VfY2IgY2hvb3NlLAotCQkJICAgdm9pZCAqZGF0YSwgc3RydWN0IGhsaXN0X25vZGUgKmRhdGFfbm9kZSkKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHN0cnVjdCBobGlzdF9ub2RlICpkYXRhX25vZGUpCiB7CiAJaW50IGluZGV4OwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuYyBiL25ldC9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmMKaW5kZXggZmEyMmJhMi4uYWMzNTIwZSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuYworKysgYi9uZXQvYmF0bWFuLWFkdi9pY21wX3NvY2tldC5jCkBAIC00Niw3ICs0Niw3IEBACiAKIAlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIAotCXNvY2tldF9jbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2V0X2NsaWVudCksIEdGUF9LRVJORUwpOworCXNvY2tldF9jbGllbnQgPSBrbWFsbG9jKHNpemVvZigqc29ja2V0X2NsaWVudCksIEdGUF9LRVJORUwpOwogCiAJaWYgKCFzb2NrZXRfY2xpZW50KQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTMxMCw3ICszMTAsNyBAQAogewogCXN0cnVjdCBzb2NrZXRfcGFja2V0ICpzb2NrZXRfcGFja2V0OwogCi0Jc29ja2V0X3BhY2tldCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrZXRfcGFja2V0KSwgR0ZQX0FUT01JQyk7CisJc29ja2V0X3BhY2tldCA9IGttYWxsb2Moc2l6ZW9mKCpzb2NrZXRfcGFja2V0KSwgR0ZQX0FUT01JQyk7CiAKIAlpZiAoIXNvY2tldF9wYWNrZXQpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L21haW4uYyBiL25ldC9iYXRtYW4tYWR2L21haW4uYwppbmRleCAwYTdjZWUwLi5iMGY5MDY4IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9tYWluLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvbWFpbi5jCkBAIC01OCw5ICs1OCw4IEBACiAKIAlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmhhcmRfaWZfbm90aWZpZXIpOwogCi0JcHJfaW5mbygiQi5BLlQuTS5BLk4uIGFkdmFuY2VkICVzJXMgKGNvbXBhdGliaWxpdHkgdmVyc2lvbiAlaSkgIgotCQkibG9hZGVkXG4iLCBTT1VSQ0VfVkVSU0lPTiwgUkVWSVNJT05fVkVSU0lPTl9TVFIsCi0JCUNPTVBBVF9WRVJTSU9OKTsKKwlwcl9pbmZvKCJCLkEuVC5NLkEuTi4gYWR2YW5jZWQgJXMgKGNvbXBhdGliaWxpdHkgdmVyc2lvbiAlaSkgIgorCQkibG9hZGVkXG4iLCBTT1VSQ0VfVkVSU0lPTiwgQ09NUEFUX1ZFUlNJT04pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04NCw4ICs4MywxMCBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZiYXRfcHJpdi0+dHRfbGhhc2hfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT50dF9naGFzaF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYmF0X3ByaXYtPnR0X2NoYW5nZXNfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYmF0X3ByaXYtPnR0X3JlcV9saXN0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZiYXRfcHJpdi0+dHRfcm9hbV9saXN0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZiYXRfcHJpdi0+dHRfYnVmZl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYmF0X3ByaXYtPmd3X2xpc3RfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYmF0X3ByaXYtPnZpc19saXN0X2xvY2spOwpAQCAtOTYsMTQgKzk3LDE0IEBACiAJSU5JVF9ITElTVF9IRUFEKCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0KTsKIAlJTklUX0hMSVNUX0hFQUQoJmJhdF9wcml2LT5nd19saXN0KTsKIAlJTklUX0hMSVNUX0hFQUQoJmJhdF9wcml2LT5zb2Z0aWZfbmVpZ2hfdmlkcyk7CisJSU5JVF9MSVNUX0hFQUQoJmJhdF9wcml2LT50dF9jaGFuZ2VzX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZiYXRfcHJpdi0+dHRfcmVxX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZiYXRfcHJpdi0+dHRfcm9hbV9saXN0KTsKIAogCWlmIChvcmlnaW5hdG9yX2luaXQoYmF0X3ByaXYpIDwgMSkKIAkJZ290byBlcnI7CiAKLQlpZiAodHRfbG9jYWxfaW5pdChiYXRfcHJpdikgPCAxKQotCQlnb3RvIGVycjsKLQotCWlmICh0dF9nbG9iYWxfaW5pdChiYXRfcHJpdikgPCAxKQorCWlmICh0dF9pbml0KGJhdF9wcml2KSA8IDEpCiAJCWdvdG8gZXJyOwogCiAJdHRfbG9jYWxfYWRkKHNvZnRfaWZhY2UsIHNvZnRfaWZhY2UtPmRldl9hZGRyKTsKQEAgLTExMSw2ICsxMTIsNyBAQAogCWlmICh2aXNfaW5pdChiYXRfcHJpdikgPCAxKQogCQlnb3RvIGVycjsKIAorCWF0b21pY19zZXQoJmJhdF9wcml2LT5nd19yZXNlbGVjdCwgMCk7CiAJYXRvbWljX3NldCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUsIE1FU0hfQUNUSVZFKTsKIAlnb3RvIGVuZDsKIApAQCAtMTM3LDggKzEzOSw3IEBACiAJZ3dfbm9kZV9wdXJnZShiYXRfcHJpdik7CiAJb3JpZ2luYXRvcl9mcmVlKGJhdF9wcml2KTsKIAotCXR0X2xvY2FsX2ZyZWUoYmF0X3ByaXYpOwotCXR0X2dsb2JhbF9mcmVlKGJhdF9wcml2KTsKKwl0dF9mcmVlKGJhdF9wcml2KTsKIAogCXNvZnRpZl9uZWlnaF9wdXJnZShiYXRfcHJpdik7CiAKQEAgLTE1NSw5ICsxNTYsOSBAQAogCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogfQogCi1pbnQgaXNfbXlfbWFjKHVpbnQ4X3QgKmFkZHIpCitpbnQgaXNfbXlfbWFjKGNvbnN0IHVpbnQ4X3QgKmFkZHIpCiB7Ci0Jc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2U7CisJY29uc3Qgc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2U7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaGFyZF9pZmFjZSwgJmhhcmRpZl9saXN0LCBsaXN0KSB7CkBAIC0xODIsOCArMTgzLDQgQEAKIE1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoRFJJVkVSX0RFVklDRSk7Ci0jaWZkZWYgUkVWSVNJT05fVkVSU0lPTgotTU9EVUxFX1ZFUlNJT04oU09VUkNFX1ZFUlNJT04gIi0iIFJFVklTSU9OX1ZFUlNJT04pOwotI2Vsc2UKIE1PRFVMRV9WRVJTSU9OKFNPVVJDRV9WRVJTSU9OKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvbWFpbi5oIGIvbmV0L2JhdG1hbi1hZHYvbWFpbi5oCmluZGV4IDE0OGI0OWUuLmE2ZGY2MWEgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L21haW4uaAorKysgYi9uZXQvYmF0bWFuLWFkdi9tYWluLmgKQEAgLTI3LDggKzI3LDkgQEAKICNkZWZpbmUgRFJJVkVSX0RFU0MgICAiQi5BLlQuTS5BLk4uIGFkdmFuY2VkIgogI2RlZmluZSBEUklWRVJfREVWSUNFICJiYXRtYW4tYWR2IgogCi0jZGVmaW5lIFNPVVJDRV9WRVJTSU9OICJuZXh0IgotCisjaWZuZGVmIFNPVVJDRV9WRVJTSU9OCisjZGVmaW5lIFNPVVJDRV9WRVJTSU9OICIyMDExLjMuMCIKKyNlbmRpZgogCiAvKiBCLkEuVC5NLkEuTi4gcGFyYW1ldGVycyAqLwogCkBAIC00MiwxNSArNDMsMjUgQEAKICAqIC0+IFRPRE86IGNoZWNrIGluZmx1ZW5jZSBvbiBUUV9MT0NBTF9XSU5ET1dfU0laRSAqLwogI2RlZmluZSBQVVJHRV9USU1FT1VUIDIwMAogI2RlZmluZSBUVF9MT0NBTF9USU1FT1VUIDM2MDAgLyogaW4gc2Vjb25kcyAqLwotCisjZGVmaW5lIFRUX0NMSUVOVF9ST0FNX1RJTUVPVVQgNjAwCiAvKiBzbGlkaW5nIHBhY2tldCByYW5nZSBvZiByZWNlaXZlZCBvcmlnaW5hdG9yIG1lc3NhZ2VzIGluIHNxdWVuY2UgbnVtYmVycwogICogKHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG91ciB3b3JkIHNpemUpICovCiAjZGVmaW5lIFRRX0xPQ0FMX1dJTkRPV19TSVpFIDY0CisjZGVmaW5lIFRUX1JFUVVFU1RfVElNRU9VVCAzIC8qIHNlY29uZHMgd2UgaGF2ZSB0byBrZWVwIHBlbmRpbmcgdHRfcmVxICovCisKICNkZWZpbmUgVFFfR0xPQkFMX1dJTkRPV19TSVpFIDUKICNkZWZpbmUgVFFfTE9DQUxfQklEUkVDVF9TRU5EX01JTklNVU0gMQogI2RlZmluZSBUUV9MT0NBTF9CSURSRUNUX1JFQ1ZfTUlOSU1VTSAxCiAjZGVmaW5lIFRRX1RPVEFMX0JJRFJFQ1RfTElNSVQgMQogCisjZGVmaW5lIFRUX09HTV9BUFBFTkRfTUFYIDMgLyogbnVtYmVyIG9mIE9HTXMgc2VudCB3aXRoIHRoZSBsYXN0IHR0IGRpZmYgKi8KKworI2RlZmluZSBST0FNSU5HX01BWF9USU1FIDIwIC8qIFRpbWUgaW4gd2hpY2ggYSBjbGllbnQgY2FuIHJvYW0gYXQgbW9zdAorCQkJICAgICAqIFJPQU1JTkdfTUFYX0NPVU5UIHRpbWVzICovCisjZGVmaW5lIFJPQU1JTkdfTUFYX0NPVU5UIDUKKworI2RlZmluZSBOT19GTEFHUyAwCisKICNkZWZpbmUgTlVNX1dPUkRTIChUUV9MT0NBTF9XSU5ET1dfU0laRSAvIFdPUkRfQklUX1NJWkUpCiAKICNkZWZpbmUgTE9HX0JVRl9MRU4gODE5MgkgIC8qIGhhcyB0byBiZSBhIHBvd2VyIG9mIDIgKi8KQEAgLTcyLDEzICs4MywyNyBAQAogI2RlZmluZSBSRVNFVF9QUk9URUNUSU9OX01TIDMwMDAwCiAjZGVmaW5lIEVYUEVDVEVEX1NFUU5PX1JBTkdFCTY1NTM2CiAKLSNkZWZpbmUgTUVTSF9JTkFDVElWRSAwCi0jZGVmaW5lIE1FU0hfQUNUSVZFIDEKLSNkZWZpbmUgTUVTSF9ERUFDVElWQVRJTkcgMgorZW51bSBtZXNoX3N0YXRlIHsKKwlNRVNIX0lOQUNUSVZFLAorCU1FU0hfQUNUSVZFLAorCU1FU0hfREVBQ1RJVkFUSU5HCit9OwogCiAjZGVmaW5lIEJDQVNUX1FVRVVFX0xFTgkJMjU2CiAjZGVmaW5lIEJBVE1BTl9RVUVVRV9MRU4JMjU2CiAKK2VudW0gdWV2X2FjdGlvbiB7CisJVUVWX0FERCA9IDAsCisJVUVWX0RFTCwKKwlVRVZfQ0hBTkdFCit9OworCitlbnVtIHVldl90eXBlIHsKKwlVRVZfR1cgPSAwCit9OworCisjZGVmaW5lIEdXX1RIUkVTSE9MRAk1MAorCiAvKgogICogRGVidWcgTWVzc2FnZXMKICAqLwpAQCAtODksMTAgKzExNCwxMiBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAvKiBhbGwgbWVzc2FnZXMgcmVsYXRlZCB0byByb3V0aW5nIC8gZmxvb2RpbmcgLyBicm9hZGNhc3RpbmcgLyBldGMgKi8KLSNkZWZpbmUgREJHX0JBVE1BTiAxCi0vKiByb3V0ZSBvciB0dCBlbnRyeSBhZGRlZCAvIGNoYW5nZWQgLyBkZWxldGVkICovCi0jZGVmaW5lIERCR19ST1VURVMgMgotI2RlZmluZSBEQkdfQUxMIDMKK2VudW0gZGJnX2xldmVsIHsKKwlEQkdfQkFUTUFOID0gMSA8PCAwLAorCURCR19ST1VURVMgPSAxIDw8IDEsIC8qIHJvdXRlIGFkZGVkIC8gY2hhbmdlZCAvIGRlbGV0ZWQgKi8KKwlEQkdfVFQJICAgPSAxIDw8IDIsIC8qIHRyYW5zbGF0aW9uIHRhYmxlIG9wZXJhdGlvbnMgKi8KKwlEQkdfQUxMICAgID0gNworfTsKIAogCiAvKgpAQCAtMTE4LDEyICsxNDUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSAidHlwZXMuaCIKIAotI2lmbmRlZiBSRVZJU0lPTl9WRVJTSU9OCi0jZGVmaW5lIFJFVklTSU9OX1ZFUlNJT05fU1RSICIiCi0jZWxzZQotI2RlZmluZSBSRVZJU0lPTl9WRVJTSU9OX1NUUiAiICJSRVZJU0lPTl9WRVJTSU9OCi0jZW5kaWYKLQogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaGFyZGlmX2xpc3Q7CiAKIGV4dGVybiB1bnNpZ25lZCBjaGFyIGJyb2FkY2FzdF9hZGRyW107CkBAIC0xMzMsMTAgKzE1NCwxMCBAQAogdm9pZCBtZXNoX2ZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpOwogdm9pZCBpbmNfbW9kdWxlX2NvdW50KHZvaWQpOwogdm9pZCBkZWNfbW9kdWxlX2NvdW50KHZvaWQpOwotaW50IGlzX215X21hYyh1aW50OF90ICphZGRyKTsKK2ludCBpc19teV9tYWMoY29uc3QgdWludDhfdCAqYWRkcik7CiAKICNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVRwotaW50IGRlYnVnX2xvZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBjaGFyICpmbXQsIC4uLik7CitpbnQgZGVidWdfbG9nKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX3ByaW50ZigyLCAzKTsKIAogI2RlZmluZSBiYXRfZGJnKHR5cGUsIGJhdF9wcml2LCBmbXQsIGFyZy4uLikJCQlcCiAJZG8gewkJCQkJCQlcCkBAIC0xNDUsOSArMTY2LDEwIEBACiAJfQkJCQkJCQlcCiAJd2hpbGUgKDApCiAjZWxzZSAvKiAhQ09ORklHX0JBVE1BTl9BRFZfREVCVUcgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBiYXRfZGJnKGNoYXIgdHlwZSBfX2Fsd2F5c191bnVzZWQsCitfX3ByaW50ZigzLCA0KQorc3RhdGljIGlubGluZSB2b2lkIGJhdF9kYmcoaW50IHR5cGUgX19hbHdheXNfdW51c2VkLAogCQkJICAgc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiBfX2Fsd2F5c191bnVzZWQsCi0JCQkgICBjaGFyICpmbXQgX19hbHdheXNfdW51c2VkLCAuLi4pCisJCQkgICBjb25zdCBjaGFyICpmbXQgX19hbHdheXNfdW51c2VkLCAuLi4pCiB7CiB9CiAjZW5kaWYKQEAgLTE3MiwxMSArMTk0LDMyIEBACiAgKgogICogbm90ZTogY2FuJ3QgdXNlIGNvbXBhcmVfZXRoZXJfYWRkcigpIGFzIGl0IHJlcXVpcmVzIGFsaWduZWQgbWVtb3J5CiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfZXRoKHZvaWQgKmRhdGExLCB2b2lkICpkYXRhMikKKworc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9ldGgoY29uc3Qgdm9pZCAqZGF0YTEsIGNvbnN0IHZvaWQgKmRhdGEyKQogewogCXJldHVybiAobWVtY21wKGRhdGExLCBkYXRhMiwgRVRIX0FMRU4pID09IDAgPyAxIDogMCk7CiB9CiAKKwogI2RlZmluZSBhdG9taWNfZGVjX25vdF96ZXJvKHYpCWF0b21pY19hZGRfdW5sZXNzKCh2KSwgLTEsIDApCiAKKy8qIFJldHVybnMgdGhlIHNtYWxsZXN0IHNpZ25lZCBpbnRlZ2VyIGluIHR3bydzIGNvbXBsZW1lbnQgd2l0aCB0aGUgc2l6ZW9mIHggKi8KKyNkZWZpbmUgc21hbGxlc3Rfc2lnbmVkX2ludCh4KSAoMXUgPDwgKDd1ICsgOHUgKiAoc2l6ZW9mKHgpIC0gMXUpKSkKKworLyogQ2hlY2tzIGlmIGEgc2VxdWVuY2UgbnVtYmVyIHggaXMgYSBwcmVkZWNlc3Nvci9zdWNjZXNzb3Igb2YgeS4KKyAqIHRoZXkgaGFuZGxlIG92ZXJmbG93cy91bmRlcmZsb3dzIGFuZCBjYW4gY29ycmVjdGx5IGNoZWNrIGZvciBhCisgKiBwcmVkZWNlc3Nvci9zdWNjZXNzb3IgdW5sZXNzIHRoZSB2YXJpYWJsZSBzZXF1ZW5jZSBudW1iZXIgaGFzIGdyb3duIGJ5CisgKiBtb3JlIHRoZW4gMioqKGJpdHdpZHRoKHgpLTEpLTEuCisgKiBUaGlzIG1lYW5zIHRoYXQgZm9yIGEgdWludDhfdCB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlIDI1NSwgaXQgd291bGQgdGhpbms6CisgKiAgLSB3aGVuIGFkZGluZyBub3RoaW5nIC0gaXQgaXMgbmVpdGhlciBhIHByZWRlY2Vzc29yIG5vciBhIHN1Y2Nlc3NvcgorICogIC0gYmVmb3JlIGFkZGluZyBtb3JlIHRoYW4gMTI3IHRvIHRoZSBzdGFydGluZyB2YWx1ZSAtIGl0IGlzIGEgcHJlZGVjZXNzb3IsCisgKiAgLSB3aGVuIGFkZGluZyAxMjggLSBpdCBpcyBuZWl0aGVyIGEgcHJlZGVjZXNzb3Igbm9yIGEgc3VjY2Vzc29yLAorICogIC0gYWZ0ZXIgYWRkaW5nIG1vcmUgdGhhbiAxMjcgdG8gdGhlIHN0YXJ0aW5nIHZhbHVlIC0gaXQgaXMgYSBzdWNjZXNzb3IgKi8KKyNkZWZpbmUgc2VxX2JlZm9yZSh4LCB5KSAoe3R5cGVvZih4KSBfZDEgPSAoeCk7IFwKKwkJCSAgdHlwZW9mKHkpIF9kMiA9ICh5KTsgXAorCQkJICB0eXBlb2YoeCkgX2R1bW15ID0gKF9kMSAtIF9kMik7IFwKKwkJCSAgKHZvaWQpICgmX2QxID09ICZfZDIpOyBcCisJCQkgIF9kdW1teSA+IHNtYWxsZXN0X3NpZ25lZF9pbnQoX2R1bW15KTsgfSkKKyNkZWZpbmUgc2VxX2FmdGVyKHgsIHkpIHNlcV9iZWZvcmUoeSwgeCkKKwogI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9NQUlOX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMgYi9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMKaW5kZXggNDBhMzBiYi4uZjNjM2Y2MiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5jCisrKyBiL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuYwpAQCAtMzcsNiArMzcsMTQgQEAKIAlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwgJmJhdF9wcml2LT5vcmlnX3dvcmssIDEgKiBIWik7CiB9CiAKKy8qIHJldHVybnMgMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBvcmlnaW5hdG9yICovCitzdGF0aWMgaW50IGNvbXBhcmVfb3JpZyhjb25zdCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgY29uc3Qgdm9pZCAqZGF0YTIpCit7CisJY29uc3Qgdm9pZCAqZGF0YTEgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IG9yaWdfbm9kZSwgaGFzaF9lbnRyeSk7CisKKwlyZXR1cm4gKG1lbWNtcChkYXRhMSwgZGF0YTIsIEVUSF9BTEVOKSA9PSAwID8gMSA6IDApOworfQorCiBpbnQgb3JpZ2luYXRvcl9pbml0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCiB7CiAJaWYgKGJhdF9wcml2LT5vcmlnX2hhc2gpCkBAIC03Nyw3ICs4NSw3IEBACiAKIHN0cnVjdCBuZWlnaF9ub2RlICpjcmVhdGVfbmVpZ2hib3Ioc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAogCQkJCSAgIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwKLQkJCQkgICB1aW50OF90ICpuZWlnaCwKKwkJCQkgICBjb25zdCB1aW50OF90ICpuZWlnaCwKIAkJCQkgICBzdHJ1Y3QgaGFyZF9pZmFjZSAqaWZfaW5jb21pbmcpCiB7CiAJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGlmX2luY29taW5nLT5zb2Z0X2lmYWNlKTsKQEAgLTg2LDcgKzk0LDcgQEAKIAliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAogCQkiQ3JlYXRpbmcgbmV3IGxhc3QtaG9wIG5laWdoYm9yIG9mIG9yaWdpbmF0b3JcbiIpOwogCi0JbmVpZ2hfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZWlnaF9ub2RlKSwgR0ZQX0FUT01JQyk7CisJbmVpZ2hfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpuZWlnaF9ub2RlKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFuZWlnaF9ub2RlKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTM3LDYgKzE0NSw3IEBACiAJdHRfZ2xvYmFsX2RlbF9vcmlnKG9yaWdfbm9kZS0+YmF0X3ByaXYsIG9yaWdfbm9kZSwKIAkJCSAgICAib3JpZ2luYXRvciB0aW1lZCBvdXQiKTsKIAorCWtmcmVlKG9yaWdfbm9kZS0+dHRfYnVmZik7CiAJa2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd24pOwogCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSk7CiAJa2ZyZWUob3JpZ19ub2RlKTsKQEAgLTE4Myw3ICsxOTIsNyBAQAogCiAvKiB0aGlzIGZ1bmN0aW9uIGZpbmRzIG9yIGNyZWF0ZXMgYW4gb3JpZ2luYXRvciBlbnRyeSBmb3IgdGhlIGdpdmVuCiAgKiBhZGRyZXNzIGlmIGl0IGRvZXMgbm90IGV4aXRzICovCi1zdHJ1Y3Qgb3JpZ19ub2RlICpnZXRfb3JpZ19ub2RlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHVpbnQ4X3QgKmFkZHIpCitzdHJ1Y3Qgb3JpZ19ub2RlICpnZXRfb3JpZ19ub2RlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIGNvbnN0IHVpbnQ4X3QgKmFkZHIpCiB7CiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwogCWludCBzaXplOwpAQCAtMTk2LDcgKzIwNSw3IEBACiAJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKIAkJIkNyZWF0aW5nIG5ldyBvcmlnaW5hdG9yOiAlcE1cbiIsIGFkZHIpOwogCi0Jb3JpZ19ub2RlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9yaWdfbm9kZSksIEdGUF9BVE9NSUMpOworCW9yaWdfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpvcmlnX25vZGUpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW9yaWdfbm9kZSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTIwNSwxNCArMjE0LDIwIEBACiAJc3Bpbl9sb2NrX2luaXQoJm9yaWdfbm9kZS0+b2dtX2NudF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmb3JpZ19ub2RlLT5iY2FzdF9zZXFub19sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmb3JpZ19ub2RlLT5uZWlnaF9saXN0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZvcmlnX25vZGUtPnR0X2J1ZmZfbG9jayk7CiAKIAkvKiBleHRyYSByZWZlcmVuY2UgZm9yIHJldHVybiAqLwogCWF0b21pY19zZXQoJm9yaWdfbm9kZS0+cmVmY291bnQsIDIpOwogCisJb3JpZ19ub2RlLT50dF9wb3NzX2NoYW5nZSA9IGZhbHNlOwogCW9yaWdfbm9kZS0+YmF0X3ByaXYgPSBiYXRfcHJpdjsKIAltZW1jcHkob3JpZ19ub2RlLT5vcmlnLCBhZGRyLCBFVEhfQUxFTik7CiAJb3JpZ19ub2RlLT5yb3V0ZXIgPSBOVUxMOworCW9yaWdfbm9kZS0+dHRfY3JjID0gMDsKKwlhdG9taWNfc2V0KCZvcmlnX25vZGUtPmxhc3RfdHR2biwgMCk7CiAJb3JpZ19ub2RlLT50dF9idWZmID0gTlVMTDsKKwlvcmlnX25vZGUtPnR0X2J1ZmZfbGVuID0gMDsKKwlhdG9taWNfc2V0KCZvcmlnX25vZGUtPnR0X3NpemUsIDApOwogCW9yaWdfbm9kZS0+YmNhc3Rfc2Vxbm9fcmVzZXQgPSBqaWZmaWVzIC0gMQogCQkJCQktIG1zZWNzX3RvX2ppZmZpZXMoUkVTRVRfUFJPVEVDVElPTl9NUyk7CiAJb3JpZ19ub2RlLT5iYXRtYW5fc2Vxbm9fcmVzZXQgPSBqaWZmaWVzIC0gMQpAQCAtMzIyLDkgKzMzNyw3IEBACiAJCWlmIChwdXJnZV9vcmlnX25laWdoYm9ycyhiYXRfcHJpdiwgb3JpZ19ub2RlLAogCQkJCQkJCSZiZXN0X25laWdoX25vZGUpKSB7CiAJCQl1cGRhdGVfcm91dGVzKGJhdF9wcml2LCBvcmlnX25vZGUsCi0JCQkJICAgICAgYmVzdF9uZWlnaF9ub2RlLAotCQkJCSAgICAgIG9yaWdfbm9kZS0+dHRfYnVmZiwKLQkJCQkgICAgICBvcmlnX25vZGUtPnR0X2J1ZmZfbGVuKTsKKwkJCQkgICAgICBiZXN0X25laWdoX25vZGUpOwogCQl9CiAJfQogCkBAIC00MTksOSArNDMyLDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jc2VxX3ByaW50ZihzZXEsICJbQi5BLlQuTS5BLk4uIGFkdiAlcyVzLCBNYWluSUYvTUFDOiAlcy8lcE0gKCVzKV1cbiIsCi0JCSAgIFNPVVJDRV9WRVJTSU9OLCBSRVZJU0lPTl9WRVJTSU9OX1NUUiwKLQkJICAgcHJpbWFyeV9pZi0+bmV0X2Rldi0+bmFtZSwKKwlzZXFfcHJpbnRmKHNlcSwgIltCLkEuVC5NLkEuTi4gYWR2ICVzLCBNYWluSUYvTUFDOiAlcy8lcE0gKCVzKV1cbiIsCisJCSAgIFNPVVJDRV9WRVJTSU9OLCBwcmltYXJ5X2lmLT5uZXRfZGV2LT5uYW1lLAogCQkgICBwcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgbmV0X2Rldi0+bmFtZSk7CiAJc2VxX3ByaW50ZihzZXEsICIgICUtMTVzICVzICglcy8laSkgJTE3cyBbJTEwc106ICUyMHMgLi4uXG4iLAogCQkgICAiT3JpZ2luYXRvciIsICJsYXN0LXNlZW4iLCAiIyIsIFRRX01BWF9WQUxVRSwgIk5leHRob3AiLApAQCAtNTU5LDcgKzU3MSw3IEBACiAJbWVtY3B5KGRhdGFfcHRyLCBvcmlnX25vZGUtPmJjYXN0X293biwgZGVsX2lmX251bSAqIGNodW5rX3NpemUpOwogCiAJLyogY29weSBzZWNvbmQgcGFydCAqLwotCW1lbWNweShkYXRhX3B0ciArIGRlbF9pZl9udW0gKiBjaHVua19zaXplLAorCW1lbWNweSgoY2hhciAqKWRhdGFfcHRyICsgZGVsX2lmX251bSAqIGNodW5rX3NpemUsCiAJICAgICAgIG9yaWdfbm9kZS0+YmNhc3Rfb3duICsgKChkZWxfaWZfbnVtICsgMSkgKiBjaHVua19zaXplKSwKIAkgICAgICAgKG1heF9pZl9udW0gLSBkZWxfaWZfbnVtKSAqIGNodW5rX3NpemUpOwogCkBAIC01NzksNyArNTkxLDcgQEAKIAltZW1jcHkoZGF0YV9wdHIsIG9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSwKIAkgICAgICAgZGVsX2lmX251bSAqIHNpemVvZih1aW50OF90KSk7CiAKLQltZW1jcHkoZGF0YV9wdHIgKyBkZWxfaWZfbnVtICogc2l6ZW9mKHVpbnQ4X3QpLAorCW1lbWNweSgoY2hhciAqKWRhdGFfcHRyICsgZGVsX2lmX251bSAqIHNpemVvZih1aW50OF90KSwKIAkgICAgICAgb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtICsgKChkZWxfaWZfbnVtICsgMSkgKiBzaXplb2YodWludDhfdCkpLAogCSAgICAgICAobWF4X2lmX251bSAtIGRlbF9pZl9udW0pICogc2l6ZW9mKHVpbnQ4X3QpKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5oIGIvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5oCmluZGV4IGUxZDY0MWYuLmNmYzFmNjAgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmgKQEAgLTI4LDEwICsyOCwxMCBAQAogdm9pZCBvcmlnaW5hdG9yX2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7CiB2b2lkIHB1cmdlX29yaWdfcmVmKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwogdm9pZCBvcmlnX25vZGVfZnJlZV9yZWYoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlKTsKLXN0cnVjdCBvcmlnX25vZGUgKmdldF9vcmlnX25vZGUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgdWludDhfdCAqYWRkcik7CitzdHJ1Y3Qgb3JpZ19ub2RlICpnZXRfb3JpZ19ub2RlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIGNvbnN0IHVpbnQ4X3QgKmFkZHIpOwogc3RydWN0IG5laWdoX25vZGUgKmNyZWF0ZV9uZWlnaGJvcihzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCiAJCQkJICAgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLAotCQkJCSAgIHVpbnQ4X3QgKm5laWdoLAorCQkJCSAgIGNvbnN0IHVpbnQ4X3QgKm5laWdoLAogCQkJCSAgIHN0cnVjdCBoYXJkX2lmYWNlICppZl9pbmNvbWluZyk7CiB2b2lkIG5laWdoX25vZGVfZnJlZV9yZWYoc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUpOwogc3RydWN0IG5laWdoX25vZGUgKm9yaWdfbm9kZV9nZXRfcm91dGVyKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSk7CkBAIC00MCwxOSArNDAsMTEgQEAKIGludCBvcmlnX2hhc2hfZGVsX2lmKHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlLCBpbnQgbWF4X2lmX251bSk7CiAKIAotLyogcmV0dXJucyAxIGlmIHRoZXkgYXJlIHRoZSBzYW1lIG9yaWdpbmF0b3IgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfb3JpZyhzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgdm9pZCAqZGF0YTIpCi17Ci0Jdm9pZCAqZGF0YTEgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IG9yaWdfbm9kZSwgaGFzaF9lbnRyeSk7Ci0KLQlyZXR1cm4gKG1lbWNtcChkYXRhMSwgZGF0YTIsIEVUSF9BTEVOKSA9PSAwID8gMSA6IDApOwotfQotCiAvKiBoYXNoZnVuY3Rpb24gdG8gY2hvb3NlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZSBvZiBnaXZlbiBzaXplICovCiAvKiBoYXNoIGFsZ29yaXRobSBmcm9tIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFzaF90YWJsZSAqLwotc3RhdGljIGlubGluZSBpbnQgY2hvb3NlX29yaWcodm9pZCAqZGF0YSwgaW50MzJfdCBzaXplKQorc3RhdGljIGlubGluZSBpbnQgY2hvb3NlX29yaWcoY29uc3Qgdm9pZCAqZGF0YSwgaW50MzJfdCBzaXplKQogewotCXVuc2lnbmVkIGNoYXIgKmtleSA9IGRhdGE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqa2V5ID0gZGF0YTsKIAl1aW50MzJfdCBoYXNoID0gMDsKIAlzaXplX3QgaTsKIApAQCAtNzAsNyArNjIsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfaGFzaF9maW5kKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJCSAgICAgICB2b2lkICpkYXRhKQorCQkJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2ggPSBiYXRfcHJpdi0+b3JpZ19oYXNoOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvcGFja2V0LmggYi9uZXQvYmF0bWFuLWFkdi9wYWNrZXQuaAppbmRleCBlZGE5OTY1Li5iNzZiNGJlIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9wYWNrZXQuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9wYWNrZXQuaApAQCAtMjQsNDYgKzI0LDg0IEBACiAKICNkZWZpbmUgRVRIX1BfQkFUTUFOICAweDQzMDUJLyogdW5vZmZpY2lhbC9ub3QgcmVnaXN0ZXJlZCBFdGhlcnR5cGUgKi8KIAotI2RlZmluZSBCQVRfUEFDS0VUICAgICAgIDB4MDEKLSNkZWZpbmUgQkFUX0lDTVAgICAgICAgICAweDAyCi0jZGVmaW5lIEJBVF9VTklDQVNUICAgICAgMHgwMwotI2RlZmluZSBCQVRfQkNBU1QgICAgICAgIDB4MDQKLSNkZWZpbmUgQkFUX1ZJUyAgICAgICAgICAweDA1Ci0jZGVmaW5lIEJBVF9VTklDQVNUX0ZSQUcgMHgwNgorZW51bSBiYXRfcGFja2V0dHlwZSB7CisJQkFUX1BBQ0tFVCAgICAgICA9IDB4MDEsCisJQkFUX0lDTVAgICAgICAgICA9IDB4MDIsCisJQkFUX1VOSUNBU1QgICAgICA9IDB4MDMsCisJQkFUX0JDQVNUICAgICAgICA9IDB4MDQsCisJQkFUX1ZJUyAgICAgICAgICA9IDB4MDUsCisJQkFUX1VOSUNBU1RfRlJBRyA9IDB4MDYsCisJQkFUX1RUX1FVRVJZICAgICA9IDB4MDcsCisJQkFUX1JPQU1fQURWICAgICA9IDB4MDgKK307CiAKIC8qIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBiYXRjdGwgd2hpY2ggbmVlZHMgdGhlc2UgZGVmaW5lcyAqLwotI2RlZmluZSBDT01QQVRfVkVSU0lPTiAxMgotI2RlZmluZSBESVJFQ1RMSU5LIDB4NDAKLSNkZWZpbmUgVklTX1NFUlZFUiAweDIwCi0jZGVmaW5lIFBSSU1BUklFU19GSVJTVF9IT1AgMHgxMAorI2RlZmluZSBDT01QQVRfVkVSU0lPTiAxNAorCitlbnVtIGJhdG1hbl9mbGFncyB7CisJUFJJTUFSSUVTX0ZJUlNUX0hPUCA9IDEgPDwgNCwKKwlWSVNfU0VSVkVSCSAgICA9IDEgPDwgNSwKKwlESVJFQ1RMSU5LCSAgICA9IDEgPDwgNgorfTsKIAogLyogSUNNUCBtZXNzYWdlIHR5cGVzICovCi0jZGVmaW5lIEVDSE9fUkVQTFkgMAotI2RlZmluZSBERVNUSU5BVElPTl9VTlJFQUNIQUJMRSAzCi0jZGVmaW5lIEVDSE9fUkVRVUVTVCA4Ci0jZGVmaW5lIFRUTF9FWENFRURFRCAxMQotI2RlZmluZSBQQVJBTUVURVJfUFJPQkxFTSAxMgorZW51bSBpY21wX3BhY2tldHR5cGUgeworCUVDSE9fUkVQTFkJCT0gMCwKKwlERVNUSU5BVElPTl9VTlJFQUNIQUJMRSA9IDMsCisJRUNIT19SRVFVRVNUCQk9IDgsCisJVFRMX0VYQ0VFREVECQk9IDExLAorCVBBUkFNRVRFUl9QUk9CTEVNCT0gMTIKK307CiAKIC8qIHZpcyBkZWZpbmVzICovCi0jZGVmaW5lIFZJU19UWVBFX1NFUlZFUl9TWU5DCQkwCi0jZGVmaW5lIFZJU19UWVBFX0NMSUVOVF9VUERBVEUJCTEKK2VudW0gdmlzX3BhY2tldHR5cGUgeworCVZJU19UWVBFX1NFUlZFUl9TWU5DICAgPSAwLAorCVZJU19UWVBFX0NMSUVOVF9VUERBVEUgPSAxCit9OwogCiAvKiBmcmFnbWVudGF0aW9uIGRlZmluZXMgKi8KLSNkZWZpbmUgVU5JX0ZSQUdfSEVBRCAweDAxCi0jZGVmaW5lIFVOSV9GUkFHX0xBUkdFVEFJTCAweDAyCitlbnVtIHVuaWNhc3RfZnJhZ19mbGFncyB7CisJVU5JX0ZSQUdfSEVBRAkgICA9IDEgPDwgMCwKKwlVTklfRlJBR19MQVJHRVRBSUwgPSAxIDw8IDEKK307CisKKy8qIFRUX1FVRVJZIHN1YnR5cGVzICovCisjZGVmaW5lIFRUX1FVRVJZX1RZUEVfTUFTSyAweDMKKworZW51bSB0dF9xdWVyeV9wYWNrZXR0eXBlIHsKKwlUVF9SRVFVRVNUICAgID0gMCwKKwlUVF9SRVNQT05TRSAgID0gMQorfTsKKworLyogVFRfUVVFUlkgZmxhZ3MgKi8KK2VudW0gdHRfcXVlcnlfZmxhZ3MgeworCVRUX0ZVTExfVEFCTEUgPSAxIDw8IDIKK307CisKKy8qIFRUX0NMSUVOVCBmbGFncy4KKyAqIEZsYWdzIGZyb20gMSB0byAxIDw8IDcgYXJlIHNlbnQgb24gdGhlIHdpcmUsIHdoaWxlIGZsYWdzIGZyb20gMSA8PCA4IHRvCisgKiAxIDw8IDE1IGFyZSB1c2VkIGZvciBsb2NhbCBjb21wdXRhdGlvbiBvbmx5ICovCitlbnVtIHR0X2NsaWVudF9mbGFncyB7CisJVFRfQ0xJRU5UX0RFTCAgICAgPSAxIDw8IDAsCisJVFRfQ0xJRU5UX1JPQU0gICAgPSAxIDw8IDEsCisJVFRfQ0xJRU5UX05PUFVSR0UgPSAxIDw8IDgsCisJVFRfQ0xJRU5UX05FVyAgICAgPSAxIDw8IDksCisJVFRfQ0xJRU5UX1BFTkRJTkcgPSAxIDw8IDEwCit9OwogCiBzdHJ1Y3QgYmF0bWFuX3BhY2tldCB7CiAJdWludDhfdCAgcGFja2V0X3R5cGU7CiAJdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCisJdWludDhfdCAgdHRsOwogCXVpbnQ4X3QgIGZsYWdzOyAgICAvKiAweDQwOiBESVJFQ1RMSU5LIGZsYWcsIDB4MjAgVklTX1NFUlZFUiBmbGFnLi4uICovCi0JdWludDhfdCAgdHE7CiAJdWludDMyX3Qgc2Vxbm87CiAJdWludDhfdCAgb3JpZ1s2XTsKIAl1aW50OF90ICBwcmV2X3NlbmRlcls2XTsKLQl1aW50OF90ICB0dGw7Ci0JdWludDhfdCAgbnVtX3R0OwogCXVpbnQ4X3QgIGd3X2ZsYWdzOyAgLyogZmxhZ3MgcmVsYXRlZCB0byBnYXRld2F5IGNsYXNzICovCi0JdWludDhfdCAgYWxpZ247CisJdWludDhfdCAgdHE7CisJdWludDhfdCAgdHRfbnVtX2NoYW5nZXM7CisJdWludDhfdCAgdHR2bjsgLyogdHJhbnNsYXRpb24gdGFibGUgdmVyc2lvbiBudW1iZXIgKi8KKwl1aW50MTZfdCB0dF9jcmM7CiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIEJBVF9QQUNLRVRfTEVOIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkKQEAgLTcxLDEyICsxMDksMTMgQEAKIHN0cnVjdCBpY21wX3BhY2tldCB7CiAJdWludDhfdCAgcGFja2V0X3R5cGU7CiAJdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCi0JdWludDhfdCAgbXNnX3R5cGU7IC8qIHNlZSBJQ01QIG1lc3NhZ2UgdHlwZXMgYWJvdmUgKi8KIAl1aW50OF90ICB0dGw7CisJdWludDhfdCAgbXNnX3R5cGU7IC8qIHNlZSBJQ01QIG1lc3NhZ2UgdHlwZXMgYWJvdmUgKi8KIAl1aW50OF90ICBkc3RbNl07CiAJdWludDhfdCAgb3JpZ1s2XTsKIAl1aW50MTZfdCBzZXFubzsKIAl1aW50OF90ICB1aWQ7CisJdWludDhfdCAgcmVzZXJ2ZWQ7CiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIEJBVF9SUl9MRU4gMTYKQEAgLTg2LDggKzEyNSw4IEBACiBzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgewogCXVpbnQ4X3QgIHBhY2tldF90eXBlOwogCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLwotCXVpbnQ4X3QgIG1zZ190eXBlOyAvKiBzZWUgSUNNUCBtZXNzYWdlIHR5cGVzIGFib3ZlICovCiAJdWludDhfdCAgdHRsOworCXVpbnQ4X3QgIG1zZ190eXBlOyAvKiBzZWUgSUNNUCBtZXNzYWdlIHR5cGVzIGFib3ZlICovCiAJdWludDhfdCAgZHN0WzZdOwogCXVpbnQ4X3QgIG9yaWdbNl07CiAJdWludDE2X3Qgc2Vxbm87CkBAIC05OSwxNiArMTM4LDE5IEBACiBzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgewogCXVpbnQ4X3QgIHBhY2tldF90eXBlOwogCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLwotCXVpbnQ4X3QgIGRlc3RbNl07CiAJdWludDhfdCAgdHRsOworCXVpbnQ4X3QgIHR0dm47IC8qIGRlc3RpbmF0aW9uIHRyYW5zbGF0aW9uIHRhYmxlIHZlcnNpb24gbnVtYmVyICovCisJdWludDhfdCAgZGVzdFs2XTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0IHsKIAl1aW50OF90ICBwYWNrZXRfdHlwZTsKIAl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KLQl1aW50OF90ICBkZXN0WzZdOwogCXVpbnQ4X3QgIHR0bDsKKwl1aW50OF90ICB0dHZuOyAvKiBkZXN0aW5hdGlvbiB0cmFuc2xhdGlvbiB0YWJsZSB2ZXJzaW9uIG51bWJlciAqLworCXVpbnQ4X3QgIGRlc3RbNl07CiAJdWludDhfdCAgZmxhZ3M7CisJdWludDhfdCAgYWxpZ247CiAJdWludDhfdCAgb3JpZ1s2XTsKIAl1aW50MTZfdCBzZXFubzsKIH0gX19wYWNrZWQ7CkBAIC0xMTYsMjEgKzE1OCw2MSBAQAogc3RydWN0IGJjYXN0X3BhY2tldCB7CiAJdWludDhfdCAgcGFja2V0X3R5cGU7CiAJdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCi0JdWludDhfdCAgb3JpZ1s2XTsKIAl1aW50OF90ICB0dGw7CisJdWludDhfdCAgcmVzZXJ2ZWQ7CiAJdWludDMyX3Qgc2Vxbm87CisJdWludDhfdCAgb3JpZ1s2XTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCB2aXNfcGFja2V0IHsKIAl1aW50OF90ICBwYWNrZXRfdHlwZTsKIAl1aW50OF90ICB2ZXJzaW9uOyAgICAgICAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KLQl1aW50OF90ICB2aXNfdHlwZTsJIC8qIHdoaWNoIHR5cGUgb2YgdmlzLXBhcnRpY2lwYW50IHNlbnQgdGhpcz8gKi8KLQl1aW50OF90ICBlbnRyaWVzOwkgLyogbnVtYmVyIG9mIGVudHJpZXMgYmVoaW5kIHRoaXMgc3RydWN0ICovCi0JdWludDMyX3Qgc2Vxbm87CQkgLyogc2VxdWVuY2UgbnVtYmVyICovCiAJdWludDhfdCAgdHRsOwkJIC8qIFRUTCAqLworCXVpbnQ4X3QgIHZpc190eXBlOwkgLyogd2hpY2ggdHlwZSBvZiB2aXMtcGFydGljaXBhbnQgc2VudCB0aGlzPyAqLworCXVpbnQzMl90IHNlcW5vOwkJIC8qIHNlcXVlbmNlIG51bWJlciAqLworCXVpbnQ4X3QgIGVudHJpZXM7CSAvKiBudW1iZXIgb2YgZW50cmllcyBiZWhpbmQgdGhpcyBzdHJ1Y3QgKi8KKwl1aW50OF90ICByZXNlcnZlZDsKIAl1aW50OF90ICB2aXNfb3JpZ1s2XTsJIC8qIG9yaWdpbmF0b3IgdGhhdCBhbm5vdW5jZXMgaXRzIG5laWdoYm9ycyAqLwogCXVpbnQ4X3QgIHRhcmdldF9vcmlnWzZdOyAvKiB3aG8gc2hvdWxkIHJlY2VpdmUgdGhpcyBwYWNrZXQgKi8KIAl1aW50OF90ICBzZW5kZXJfb3JpZ1s2XTsgLyogd2hvIHNlbnQgb3IgcmVicm9hZGNhc3RlZCB0aGlzIHBhY2tldCAqLwogfSBfX3BhY2tlZDsKIAorc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCB7CisJdWludDhfdCAgcGFja2V0X3R5cGU7CisJdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCisJdWludDhfdCAgdHRsOworCS8qIHRoZSBmbGFnIGZpZWxkIGlzIGEgY29tYmluYXRpb24gb2Y6CisJICogLSBUVF9SRVFVRVNUIG9yIFRUX1JFU1BPTlNFCisJICogLSBUVF9GVUxMX1RBQkxFICovCisJdWludDhfdCAgZmxhZ3M7CisJdWludDhfdCAgZHN0W0VUSF9BTEVOXTsKKwl1aW50OF90ICBzcmNbRVRIX0FMRU5dOworCS8qIHRoZSB0dHZuIGZpZWxkIGlzOgorCSAqIGlmIFRUX1JFUVVFU1Q6IHR0dm4gdGhhdCB0cmlnZ2VyZWQgdGhlCisJICoJCSAgcmVxdWVzdAorCSAqIGlmIFRUX1JFU1BPTlNFOiBuZXcgdHR2biBmb3IgdGhlIHNyYworCSAqCQkgICBvcmlnX25vZGUgKi8KKwl1aW50OF90ICB0dHZuOworCS8qIHR0X2RhdGEgZmllbGQgaXM6CisJICogaWYgVFRfUkVRVUVTVDogY3JjIGFzc29jaWF0ZWQgd2l0aCB0aGUKKwkgKgkJICB0dHZuCisJICogaWYgVFRfUkVTUE9OU0U6IHRhYmxlX3NpemUgKi8KKwl1aW50MTZfdCB0dF9kYXRhOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJvYW1fYWR2X3BhY2tldCB7CisJdWludDhfdCAgcGFja2V0X3R5cGU7CisJdWludDhfdCAgdmVyc2lvbjsKKwl1aW50OF90ICB0dGw7CisJdWludDhfdCAgcmVzZXJ2ZWQ7CisJdWludDhfdCAgZHN0W0VUSF9BTEVOXTsKKwl1aW50OF90ICBzcmNbRVRIX0FMRU5dOworCXVpbnQ4X3QgIGNsaWVudFtFVEhfQUxFTl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgdHRfY2hhbmdlIHsKKwl1aW50OF90IGZsYWdzOworCXVpbnQ4X3QgYWRkcltFVEhfQUxFTl07Cit9IF9fcGFja2VkOworCiAjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1BBQ0tFVF9IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvcmluZ19idWZmZXIuYyBiL25ldC9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmMKaW5kZXggNWJiNmE2MS4uZjFjY2ZhNyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvcmluZ19idWZmZXIuYworKysgYi9uZXQvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5jCkBAIC0yOCw5ICsyOCw5IEBACiAJKmxxX2luZGV4ID0gKCpscV9pbmRleCArIDEpICUgVFFfR0xPQkFMX1dJTkRPV19TSVpFOwogfQogCi11aW50OF90IHJpbmdfYnVmZmVyX2F2Zyh1aW50OF90IGxxX3JlY3ZbXSkKK3VpbnQ4X3QgcmluZ19idWZmZXJfYXZnKGNvbnN0IHVpbnQ4X3QgbHFfcmVjdltdKQogewotCXVpbnQ4X3QgKnB0cjsKKwljb25zdCB1aW50OF90ICpwdHI7CiAJdWludDE2X3QgY291bnQgPSAwLCBpID0gMCwgc3VtID0gMDsKIAogCXB0ciA9IGxxX3JlY3Y7CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oIGIvbmV0L2JhdG1hbi1hZHYvcmluZ19idWZmZXIuaAppbmRleCAwMzk1YjI3Li43Y2RmZTYyIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oCisrKyBiL25ldC9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmgKQEAgLTIzLDYgKzIzLDYgQEAKICNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1JJTkdfQlVGRkVSX0hfCiAKIHZvaWQgcmluZ19idWZmZXJfc2V0KHVpbnQ4X3QgbHFfcmVjdltdLCB1aW50OF90ICpscV9pbmRleCwgdWludDhfdCB2YWx1ZSk7Ci11aW50OF90IHJpbmdfYnVmZmVyX2F2Zyh1aW50OF90IGxxX3JlY3ZbXSk7Cit1aW50OF90IHJpbmdfYnVmZmVyX2F2Zyhjb25zdCB1aW50OF90IGxxX3JlY3ZbXSk7CiAKICNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfUklOR19CVUZGRVJfSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3JvdXRpbmcuYyBiL25ldC9iYXRtYW4tYWR2L3JvdXRpbmcuYwppbmRleCBiYjFjM2VjLi4wZjMyYzgxIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9yb3V0aW5nLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvcm91dGluZy5jCkBAIC02NCwyOCArNjQsNjkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9UVChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICp0dF9idWZmLCBpbnQgdHRfYnVmZl9sZW4pCitzdGF0aWMgdm9pZCB1cGRhdGVfdHJhbnN0YWJsZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJICAgICAgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdHRfYnVmZiwKKwkJCSAgICAgIHVpbnQ4X3QgdHRfbnVtX2NoYW5nZXMsIHVpbnQ4X3QgdHR2biwKKwkJCSAgICAgIHVpbnQxNl90IHR0X2NyYykKIHsKLQlpZiAoKHR0X2J1ZmZfbGVuICE9IG9yaWdfbm9kZS0+dHRfYnVmZl9sZW4pIHx8Ci0JICAgICgodHRfYnVmZl9sZW4gPiAwKSAmJgotCSAgICAgKG9yaWdfbm9kZS0+dHRfYnVmZl9sZW4gPiAwKSAmJgotCSAgICAgKG1lbWNtcChvcmlnX25vZGUtPnR0X2J1ZmYsIHR0X2J1ZmYsIHR0X2J1ZmZfbGVuKSAhPSAwKSkpIHsKKwl1aW50OF90IG9yaWdfdHR2biA9ICh1aW50OF90KWF0b21pY19yZWFkKCZvcmlnX25vZGUtPmxhc3RfdHR2bik7CisJYm9vbCBmdWxsX3RhYmxlID0gdHJ1ZTsKIAotCQlpZiAob3JpZ19ub2RlLT50dF9idWZmX2xlbiA+IDApCi0JCQl0dF9nbG9iYWxfZGVsX29yaWcoYmF0X3ByaXYsIG9yaWdfbm9kZSwKLQkJCQkJICAgICJvcmlnaW5hdG9yIGNoYW5nZWQgdHQiKTsKKwkvKiB0aGUgdHR2biBpbmNyZWFzZWQgYnkgb25lIC0+IHdlIGNhbiBhcHBseSB0aGUgYXR0YWNoZWQgY2hhbmdlcyAqLworCWlmICh0dHZuIC0gb3JpZ190dHZuID09IDEpIHsKKwkJLyogdGhlIE9HTSBjb3VsZCBub3QgY29udGFpbiB0aGUgY2hhbmdlcyBiZWNhdXNlIHRoZXkgd2VyZSB0b28KKwkJICogbWFueSB0byBmaXQgaW4gb25lIGZyYW1lIG9yIGJlY2F1c2UgdGhleSBoYXZlIGFscmVhZHkgYmVlbgorCQkgKiBzZW50IFRUX09HTV9BUFBFTkRfTUFYIHRpbWVzLiBJbiB0aGlzIGNhc2Ugc2VuZCBhIHR0CisJCSAqIHJlcXVlc3QgKi8KKwkJaWYgKCF0dF9udW1fY2hhbmdlcykgeworCQkJZnVsbF90YWJsZSA9IGZhbHNlOworCQkJZ290byByZXF1ZXN0X3RhYmxlOworCQl9CiAKLQkJaWYgKCh0dF9idWZmX2xlbiA+IDApICYmICh0dF9idWZmKSkKLQkJCXR0X2dsb2JhbF9hZGRfb3JpZyhiYXRfcHJpdiwgb3JpZ19ub2RlLAotCQkJCQkgICAgdHRfYnVmZiwgdHRfYnVmZl9sZW4pOworCQl0dF91cGRhdGVfY2hhbmdlcyhiYXRfcHJpdiwgb3JpZ19ub2RlLCB0dF9udW1fY2hhbmdlcywgdHR2biwKKwkJCQkgIChzdHJ1Y3QgdHRfY2hhbmdlICopdHRfYnVmZik7CisKKwkJLyogRXZlbiBpZiB3ZSByZWNlaXZlZCB0aGUgY3JjIGludG8gdGhlIE9HTSwgd2UgcHJlZmVyCisJCSAqIHRvIHJlY29tcHV0ZSBpdCB0byBzcG90IGFueSBwb3NzaWJsZSBpbmNvbnNpc3RlbmN5CisJCSAqIGluIHRoZSBnbG9iYWwgdGFibGUgKi8KKwkJb3JpZ19ub2RlLT50dF9jcmMgPSB0dF9nbG9iYWxfY3JjKGJhdF9wcml2LCBvcmlnX25vZGUpOworCisJCS8qIFRoZSB0dHZuIGFsb25lIGlzIG5vdCBlbm91Z2ggdG8gZ3VhcmFudGVlIGNvbnNpc3RlbmN5CisJCSAqIGJlY2F1c2UgYSBzaW5nbGUgdmFsdWUgY291bGQgcmVwZXNlbnQgZGlmZmVyZW50IHN0YXRlcworCQkgKiAoZHVlIHRvIHRoZSB3cmFwIGFyb3VuZCkuIFRodXMgYSBub2RlIGhhcyB0byBjaGVjayB3aGV0aGVyCisJCSAqIHRoZSByZXN1bHRpbmcgdGFibGUgKGFmdGVyIGFwcGx5aW5nIHRoZSBjaGFuZ2VzKSBpcyBzdGlsbAorCQkgKiBjb25zaXN0ZW50IG9yIG5vdC4gRS5nLiBhIG5vZGUgY291bGQgZGlzY29ubmVjdCB3aGlsZSBpdHMKKwkJICogdHR2biBpcyBYIGFuZCByZWNvbm5lY3Qgb24gdHR2biA9IFggKyBUVFZOX01BWDogaW4gdGhpcyBjYXNlCisJCSAqIGNoZWNraW5nIHRoZSBDUkMgdmFsdWUgaXMgbWFuZGF0b3J5IHRvIGRldGVjdCB0aGUKKwkJICogaW5jb25zaXN0ZW5jeSAqLworCQlpZiAob3JpZ19ub2RlLT50dF9jcmMgIT0gdHRfY3JjKQorCQkJZ290byByZXF1ZXN0X3RhYmxlOworCisJCS8qIFJvYW1pbmcgcGhhc2UgaXMgb3ZlcjogdGFibGVzIGFyZSBpbiBzeW5jIGFnYWluLiBJIGNhbgorCQkgKiB1bnNldCB0aGUgZmxhZyAqLworCQlvcmlnX25vZGUtPnR0X3Bvc3NfY2hhbmdlID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJLyogaWYgd2UgbWlzc2VkIG1vcmUgdGhhbiBvbmUgY2hhbmdlIG9yIG91ciB0YWJsZXMgYXJlIG5vdAorCQkgKiBpbiBzeW5jIGFueW1vcmUgLT4gcmVxdWVzdCBmcmVzaCB0dCBkYXRhICovCisJCWlmICh0dHZuICE9IG9yaWdfdHR2biB8fCBvcmlnX25vZGUtPnR0X2NyYyAhPSB0dF9jcmMpIHsKK3JlcXVlc3RfdGFibGU6CisJCQliYXRfZGJnKERCR19UVCwgYmF0X3ByaXYsICJUVCBpbmNvbnNpc3RlbmN5IGZvciAlcE0uICIKKwkJCQkiTmVlZCB0byByZXRyaWV2ZSB0aGUgY29ycmVjdCBpbmZvcm1hdGlvbiAiCisJCQkJIih0dHZuOiAldSBsYXN0X3R0dm46ICV1IGNyYzogJXUgbGFzdF9jcmM6ICIKKwkJCQkiJXUgbnVtX2NoYW5nZXM6ICV1KVxuIiwgb3JpZ19ub2RlLT5vcmlnLCB0dHZuLAorCQkJCW9yaWdfdHR2biwgdHRfY3JjLCBvcmlnX25vZGUtPnR0X2NyYywKKwkJCQl0dF9udW1fY2hhbmdlcyk7CisJCQlzZW5kX3R0X3JlcXVlc3QoYmF0X3ByaXYsIG9yaWdfbm9kZSwgdHR2biwgdHRfY3JjLAorCQkJCQlmdWxsX3RhYmxlKTsKKwkJCXJldHVybjsKKwkJfQogCX0KIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX3JvdXRlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCiAJCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJIHN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlLAotCQkJIHVuc2lnbmVkIGNoYXIgKnR0X2J1ZmYsIGludCB0dF9idWZmX2xlbikKKwkJCSBzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSkKIHsKIAlzdHJ1Y3QgbmVpZ2hfbm9kZSAqY3Vycl9yb3V0ZXI7CiAKQEAgLTkzLDExICsxMzQsMTAgQEAKIAogCS8qIHJvdXRlIGRlbGV0ZWQgKi8KIAlpZiAoKGN1cnJfcm91dGVyKSAmJiAoIW5laWdoX25vZGUpKSB7Ci0KIAkJYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwgIkRlbGV0aW5nIHJvdXRlIHRvd2FyZHM6ICVwTVxuIiwKIAkJCW9yaWdfbm9kZS0+b3JpZyk7CiAJCXR0X2dsb2JhbF9kZWxfb3JpZyhiYXRfcHJpdiwgb3JpZ19ub2RlLAotCQkJCSAgICAib3JpZ2luYXRvciB0aW1lZCBvdXQiKTsKKwkJCQkgICAgIkRlbGV0ZWQgcm91dGUgdG93YXJkcyBvcmlnaW5hdG9yIik7CiAKIAkvKiByb3V0ZSBhZGRlZCAqLwogCX0gZWxzZSBpZiAoKCFjdXJyX3JvdXRlcikgJiYgKG5laWdoX25vZGUpKSB7CkBAIC0xMDUsMTEgKzE0NSw4IEBACiAJCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCiAJCQkiQWRkaW5nIHJvdXRlIHRvd2FyZHM6ICVwTSAodmlhICVwTSlcbiIsCiAJCQlvcmlnX25vZGUtPm9yaWcsIG5laWdoX25vZGUtPmFkZHIpOwotCQl0dF9nbG9iYWxfYWRkX29yaWcoYmF0X3ByaXYsIG9yaWdfbm9kZSwKLQkJCQkgICAgdHRfYnVmZiwgdHRfYnVmZl9sZW4pOwotCiAJLyogcm91dGUgY2hhbmdlZCAqLwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChuZWlnaF9ub2RlICYmIGN1cnJfcm91dGVyKSB7CiAJCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCiAJCQkiQ2hhbmdpbmcgcm91dGUgdG93YXJkczogJXBNICIKIAkJCSIobm93IHZpYSAlcE0gLSB3YXMgdmlhICVwTSlcbiIsCkBAIC0xMzMsMTAgKzE3MCw4IEBACiAJCW5laWdoX25vZGVfZnJlZV9yZWYoY3Vycl9yb3V0ZXIpOwogfQogCi0KIHZvaWQgdXBkYXRlX3JvdXRlcyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCSAgIHN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlLCB1bnNpZ25lZCBjaGFyICp0dF9idWZmLAotCQkgICBpbnQgdHRfYnVmZl9sZW4pCisJCSAgIHN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlKQogewogCXN0cnVjdCBuZWlnaF9ub2RlICpyb3V0ZXIgPSBOVUxMOwogCkBAIC0xNDYsMTEgKzE4MSw3IEBACiAJcm91dGVyID0gb3JpZ19ub2RlX2dldF9yb3V0ZXIob3JpZ19ub2RlKTsKIAogCWlmIChyb3V0ZXIgIT0gbmVpZ2hfbm9kZSkKLQkJdXBkYXRlX3JvdXRlKGJhdF9wcml2LCBvcmlnX25vZGUsIG5laWdoX25vZGUsCi0JCQkgICAgIHR0X2J1ZmYsIHR0X2J1ZmZfbGVuKTsKLQkvKiBtYXkgYmUganVzdCBUVCBjaGFuZ2VkICovCi0JZWxzZQotCQl1cGRhdGVfVFQoYmF0X3ByaXYsIG9yaWdfbm9kZSwgdHRfYnVmZiwgdHRfYnVmZl9sZW4pOworCQl1cGRhdGVfcm91dGUoYmF0X3ByaXYsIG9yaWdfbm9kZSwgbmVpZ2hfbm9kZSk7CiAKIG91dDoKIAlpZiAocm91dGVyKQpAQCAtMTY1LDcgKzE5Niw3IEBACiAJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGlmX2luY29taW5nLT5zb2Z0X2lmYWNlKTsKIAlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSA9IE5VTEwsICp0bXBfbmVpZ2hfbm9kZTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKLQl1bnNpZ25lZCBjaGFyIHRvdGFsX2NvdW50OworCXVpbnQ4X3QgdG90YWxfY291bnQ7CiAJdWludDhfdCBvcmlnX2VxX2NvdW50LCBuZWlnaF9ycV9jb3VudCwgdHFfb3duOwogCWludCB0cV9hc3ltX3BlbmFsdHksIHJldCA9IDA7CiAKQEAgLTM0OCw5ICszNzksOSBAQAogfQogCiAvKiBjb3B5IHByaW1hcnkgYWRkcmVzcyBmb3IgYm9uZGluZyAqLwotc3RhdGljIHZvaWQgYm9uZGluZ19zYXZlX3ByaW1hcnkoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAorc3RhdGljIHZvaWQgYm9uZGluZ19zYXZlX3ByaW1hcnkoY29uc3Qgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAogCQkJCSBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25laWdoX25vZGUsCi0JCQkJIHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0KQorCQkJCSBjb25zdCBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCkKIHsKIAlpZiAoIShiYXRtYW5fcGFja2V0LT5mbGFncyAmIFBSSU1BUklFU19GSVJTVF9IT1ApKQogCQlyZXR1cm47CkBAIC0zNTgsMTkgKzM4OSwxNiBAQAogCW1lbWNweShvcmlnX25laWdoX25vZGUtPnByaW1hcnlfYWRkciwgb3JpZ19ub2RlLT5vcmlnLCBFVEhfQUxFTik7CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9vcmlnKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCQlzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCi0JCQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKK3N0YXRpYyB2b2lkIHVwZGF0ZV9vcmlnKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKKwkJCWNvbnN0IHN0cnVjdCBldGhoZHIgKmV0aGhkciwKKwkJCWNvbnN0IHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAogCQkJc3RydWN0IGhhcmRfaWZhY2UgKmlmX2luY29taW5nLAotCQkJdW5zaWduZWQgY2hhciAqdHRfYnVmZiwgaW50IHR0X2J1ZmZfbGVuLAotCQkJY2hhciBpc19kdXBsaWNhdGUpCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICp0dF9idWZmLCBpbnQgaXNfZHVwbGljYXRlKQogewogCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlID0gTlVMTCwgKnRtcF9uZWlnaF9ub2RlID0gTlVMTDsKIAlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyID0gTlVMTDsKIAlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGVfdG1wOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCWludCB0bXBfdHRfYnVmZl9sZW47CiAJdWludDhfdCBiY2FzdF9vd25fc3VtX29yaWcsIGJjYXN0X293bl9zdW1fbmVpZ2g7CiAKIAliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LCAidXBkYXRlX29yaWdpbmF0b3IoKTogIgpAQCAtNDM1LDkgKzQ2Myw2IEBACiAKIAlib25kaW5nX2NhbmRpZGF0ZV9hZGQob3JpZ19ub2RlLCBuZWlnaF9ub2RlKTsKIAotCXRtcF90dF9idWZmX2xlbiA9ICh0dF9idWZmX2xlbiA+IGJhdG1hbl9wYWNrZXQtPm51bV90dCAqIEVUSF9BTEVOID8KLQkJCSAgICBiYXRtYW5fcGFja2V0LT5udW1fdHQgKiBFVEhfQUxFTiA6IHR0X2J1ZmZfbGVuKTsKLQogCS8qIGlmIHRoaXMgbmVpZ2hib3IgYWxyZWFkeSBpcyBvdXIgbmV4dCBob3AgdGhlcmUgaXMgbm90aGluZwogCSAqIHRvIGNoYW5nZSAqLwogCXJvdXRlciA9IG9yaWdfbm9kZV9nZXRfcm91dGVyKG9yaWdfbm9kZSk7CkBAIC00NjcsMTUgKzQ5MiwxOSBAQAogCQkJZ290byB1cGRhdGVfdHQ7CiAJfQogCi0JdXBkYXRlX3JvdXRlcyhiYXRfcHJpdiwgb3JpZ19ub2RlLCBuZWlnaF9ub2RlLAotCQkgICAgICB0dF9idWZmLCB0bXBfdHRfYnVmZl9sZW4pOwotCWdvdG8gdXBkYXRlX2d3OworCXVwZGF0ZV9yb3V0ZXMoYmF0X3ByaXYsIG9yaWdfbm9kZSwgbmVpZ2hfbm9kZSk7CiAKIHVwZGF0ZV90dDoKLQl1cGRhdGVfcm91dGVzKGJhdF9wcml2LCBvcmlnX25vZGUsIHJvdXRlciwKLQkJICAgICAgdHRfYnVmZiwgdG1wX3R0X2J1ZmZfbGVuKTsKKwkvKiBJIGhhdmUgdG8gY2hlY2sgZm9yIHRyYW5zdGFibGUgY2hhbmdlcyBvbmx5IGlmIHRoZSBPR00gaGFzIGJlZW4KKwkgKiBzZW50IHRocm91Z2ggYSBwcmltYXJ5IGludGVyZmFjZSAqLworCWlmICgoKGJhdG1hbl9wYWNrZXQtPm9yaWcgIT0gZXRoaGRyLT5oX3NvdXJjZSkgJiYKKwkJCQkoYmF0bWFuX3BhY2tldC0+dHRsID4gMikpIHx8CisJCQkJKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgUFJJTUFSSUVTX0ZJUlNUX0hPUCkpCisJCXVwZGF0ZV90cmFuc3RhYmxlKGJhdF9wcml2LCBvcmlnX25vZGUsIHR0X2J1ZmYsCisJCQkJICBiYXRtYW5fcGFja2V0LT50dF9udW1fY2hhbmdlcywKKwkJCQkgIGJhdG1hbl9wYWNrZXQtPnR0dm4sCisJCQkJICBiYXRtYW5fcGFja2V0LT50dF9jcmMpOwogCi11cGRhdGVfZ3c6CiAJaWYgKG9yaWdfbm9kZS0+Z3dfZmxhZ3MgIT0gYmF0bWFuX3BhY2tldC0+Z3dfZmxhZ3MpCiAJCWd3X25vZGVfdXBkYXRlKGJhdF9wcml2LCBvcmlnX25vZGUsIGJhdG1hbl9wYWNrZXQtPmd3X2ZsYWdzKTsKIApAQCAtNTMxLDE1ICs1NjAsMTUgQEAKICAqICAtMSB0aGUgcGFja2V0IGlzIG9sZCBhbmQgaGFzIGJlZW4gcmVjZWl2ZWQgd2hpbGUgdGhlIHNlcW5vIHdpbmRvdwogICogICAgIHdhcyBwcm90ZWN0ZWQuIENhbGxlciBzaG91bGQgZHJvcCBpdC4KICAqLwotc3RhdGljIGNoYXIgY291bnRfcmVhbF9wYWNrZXRzKHN0cnVjdCBldGhoZHIgKmV0aGhkciwKLQkJCSAgICAgICBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKLQkJCSAgICAgICBzdHJ1Y3QgaGFyZF9pZmFjZSAqaWZfaW5jb21pbmcpCitzdGF0aWMgaW50IGNvdW50X3JlYWxfcGFja2V0cyhjb25zdCBzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGhhcmRfaWZhY2UgKmlmX2luY29taW5nKQogewogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihpZl9pbmNvbWluZy0+c29mdF9pZmFjZSk7CiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwogCXN0cnVjdCBuZWlnaF9ub2RlICp0bXBfbmVpZ2hfbm9kZTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKLQljaGFyIGlzX2R1cGxpY2F0ZSA9IDA7CisJaW50IGlzX2R1cGxpY2F0ZSA9IDA7CiAJaW50MzJfdCBzZXFfZGlmZjsKIAlpbnQgbmVlZF91cGRhdGUgPSAwOwogCWludCBzZXRfbWFyaywgcmV0ID0gLTE7CkBAIC01OTUsOSArNjI0LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIHJlY2VpdmVfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCit2b2lkIHJlY2VpdmVfYmF0X3BhY2tldChjb25zdCBzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCiAJCQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKLQkJCXVuc2lnbmVkIGNoYXIgKnR0X2J1ZmYsIGludCB0dF9idWZmX2xlbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnR0X2J1ZmYsCiAJCQlzdHJ1Y3QgaGFyZF9pZmFjZSAqaWZfaW5jb21pbmcpCiB7CiAJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGlmX2luY29taW5nLT5zb2Z0X2lmYWNlKTsKQEAgLTYwNSwxMCArNjM0LDEwIEBACiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLCAqb3JpZ19ub2RlOwogCXN0cnVjdCBuZWlnaF9ub2RlICpyb3V0ZXIgPSBOVUxMLCAqcm91dGVyX3JvdXRlciA9IE5VTEw7CiAJc3RydWN0IG5laWdoX25vZGUgKm9yaWdfbmVpZ2hfcm91dGVyID0gTlVMTDsKLQljaGFyIGhhc19kaXJlY3RsaW5rX2ZsYWc7Ci0JY2hhciBpc19teV9hZGRyID0gMCwgaXNfbXlfb3JpZyA9IDAsIGlzX215X29sZG9yaWcgPSAwOwotCWNoYXIgaXNfYnJvYWRjYXN0ID0gMCwgaXNfYmlkaXJlY3Rpb25hbCwgaXNfc2luZ2xlX2hvcF9uZWlnaDsKLQljaGFyIGlzX2R1cGxpY2F0ZTsKKwlpbnQgaGFzX2RpcmVjdGxpbmtfZmxhZzsKKwlpbnQgaXNfbXlfYWRkciA9IDAsIGlzX215X29yaWcgPSAwLCBpc19teV9vbGRvcmlnID0gMDsKKwlpbnQgaXNfYnJvYWRjYXN0ID0gMCwgaXNfYmlkaXJlY3Rpb25hbCwgaXNfc2luZ2xlX2hvcF9uZWlnaDsKKwlpbnQgaXNfZHVwbGljYXRlOwogCXVpbnQzMl90IGlmX2luY29taW5nX3NlcW5vOwogCiAJLyogU2lsZW50bHkgZHJvcCB3aGVuIHRoZSBiYXRtYW4gcGFja2V0IGlzIGFjdHVhbGx5IG5vdCBhCkBAIC02MzYsMTIgKzY2NSwxNCBAQAogCiAJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKIAkJIlJlY2VpdmVkIEJBVE1BTiBwYWNrZXQgdmlhIE5COiAlcE0sIElGOiAlcyBbJXBNXSAiCi0JCSIoZnJvbSBPRzogJXBNLCB2aWEgcHJldiBPRzogJXBNLCBzZXFubyAlZCwgdHEgJWQsICIKLQkJIlRUTCAlZCwgViAlZCwgSURGICVkKVxuIiwKKwkJIihmcm9tIE9HOiAlcE0sIHZpYSBwcmV2IE9HOiAlcE0sIHNlcW5vICVkLCB0dHZuICV1LCAiCisJCSJjcmMgJXUsIGNoYW5nZXMgJXUsIHRkICVkLCBUVEwgJWQsIFYgJWQsIElERiAlZClcbiIsCiAJCWV0aGhkci0+aF9zb3VyY2UsIGlmX2luY29taW5nLT5uZXRfZGV2LT5uYW1lLAogCQlpZl9pbmNvbWluZy0+bmV0X2Rldi0+ZGV2X2FkZHIsIGJhdG1hbl9wYWNrZXQtPm9yaWcsCiAJCWJhdG1hbl9wYWNrZXQtPnByZXZfc2VuZGVyLCBiYXRtYW5fcGFja2V0LT5zZXFubywKLQkJYmF0bWFuX3BhY2tldC0+dHEsIGJhdG1hbl9wYWNrZXQtPnR0bCwgYmF0bWFuX3BhY2tldC0+dmVyc2lvbiwKKwkJYmF0bWFuX3BhY2tldC0+dHR2biwgYmF0bWFuX3BhY2tldC0+dHRfY3JjLAorCQliYXRtYW5fcGFja2V0LT50dF9udW1fY2hhbmdlcywgYmF0bWFuX3BhY2tldC0+dHEsCisJCWJhdG1hbl9wYWNrZXQtPnR0bCwgYmF0bWFuX3BhY2tldC0+dmVyc2lvbiwKIAkJaGFzX2RpcmVjdGxpbmtfZmxhZyk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC02NjQsNyArNjk1LDcgQEAKIAkJCQloYXJkX2lmYWNlLT5uZXRfZGV2LT5kZXZfYWRkcikpCiAJCQlpc19teV9vbGRvcmlnID0gMTsKIAotCQlpZiAoY29tcGFyZV9ldGgoZXRoaGRyLT5oX3NvdXJjZSwgYnJvYWRjYXN0X2FkZHIpKQorCQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZXRoaGRyLT5oX3NvdXJjZSkpCiAJCQlpc19icm9hZGNhc3QgPSAxOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTcwMSwxNyArNzMyLDE2IEBACiAKIAkJLyogbmVpZ2hib3IgaGFzIHRvIGluZGljYXRlIGRpcmVjdCBsaW5rIGFuZCBpdCBoYXMgdG8KIAkJICogY29tZSB2aWEgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlICovCi0JCS8qIGlmIHJlY2VpdmVkIHNlcW5vIGVxdWFscyBsYXN0IHNlbmQgc2Vxbm8gc2F2ZSBuZXcKLQkJICogc2Vxbm8gZm9yIGJpZGlyZWN0aW9uYWwgY2hlY2sgKi8KKwkJLyogc2F2ZSBwYWNrZXQgc2Vxbm8gZm9yIGJpZGlyZWN0aW9uYWwgY2hlY2sgKi8KIAkJaWYgKGhhc19kaXJlY3RsaW5rX2ZsYWcgJiYKIAkJICAgIGNvbXBhcmVfZXRoKGlmX2luY29taW5nLT5uZXRfZGV2LT5kZXZfYWRkciwKLQkJCQliYXRtYW5fcGFja2V0LT5vcmlnKSAmJgotCQkgICAgKGJhdG1hbl9wYWNrZXQtPnNlcW5vIC0gaWZfaW5jb21pbmdfc2Vxbm8gKyAyID09IDApKSB7CisJCQkJYmF0bWFuX3BhY2tldC0+b3JpZykpIHsKIAkJCW9mZnNldCA9IGlmX2luY29taW5nLT5pZl9udW0gKiBOVU1fV09SRFM7CiAKIAkJCXNwaW5fbG9ja19iaCgmb3JpZ19uZWlnaF9ub2RlLT5vZ21fY250X2xvY2spOwogCQkJd29yZCA9ICYob3JpZ19uZWlnaF9ub2RlLT5iY2FzdF9vd25bb2Zmc2V0XSk7Ci0JCQliaXRfbWFyayh3b3JkLCAwKTsKKwkJCWJpdF9tYXJrKHdvcmQsCisJCQkJIGlmX2luY29taW5nX3NlcW5vIC0gYmF0bWFuX3BhY2tldC0+c2Vxbm8gLSAyKTsKIAkJCW9yaWdfbmVpZ2hfbm9kZS0+YmNhc3Rfb3duX3N1bVtpZl9pbmNvbWluZy0+aWZfbnVtXSA9CiAJCQkJYml0X3BhY2tldF9jb3VudCh3b3JkKTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZvcmlnX25laWdoX25vZGUtPm9nbV9jbnRfbG9jayk7CkBAIC03OTQsMTQgKzgyNCwxNCBAQAogCSAgICAgKChvcmlnX25vZGUtPmxhc3RfcmVhbF9zZXFubyA9PSBiYXRtYW5fcGFja2V0LT5zZXFubykgJiYKIAkgICAgICAob3JpZ19ub2RlLT5sYXN0X3R0bCAtIDMgPD0gYmF0bWFuX3BhY2tldC0+dHRsKSkpKQogCQl1cGRhdGVfb3JpZyhiYXRfcHJpdiwgb3JpZ19ub2RlLCBldGhoZHIsIGJhdG1hbl9wYWNrZXQsCi0JCQkgICAgaWZfaW5jb21pbmcsIHR0X2J1ZmYsIHR0X2J1ZmZfbGVuLCBpc19kdXBsaWNhdGUpOworCQkJICAgIGlmX2luY29taW5nLCB0dF9idWZmLCBpc19kdXBsaWNhdGUpOwogCiAJLyogaXMgc2luZ2xlIGhvcCAoZGlyZWN0KSBuZWlnaGJvciAqLwogCWlmIChpc19zaW5nbGVfaG9wX25laWdoKSB7CiAKIAkJLyogbWFyayBkaXJlY3QgbGluayBvbiBpbmNvbWluZyBpbnRlcmZhY2UgKi8KIAkJc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQob3JpZ19ub2RlLCBldGhoZHIsIGJhdG1hbl9wYWNrZXQsCi0JCQkJCTEsIHR0X2J1ZmZfbGVuLCBpZl9pbmNvbWluZyk7CisJCQkJCTEsIGlmX2luY29taW5nKTsKIAogCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LCAiRm9yd2FyZGluZyBwYWNrZXQ6ICIKIAkJCSJyZWJyb2FkY2FzdCBuZWlnaGJvciBwYWNrZXQgd2l0aCBkaXJlY3QgbGluayBmbGFnXG4iKTsKQEAgLTgyNCw3ICs4NTQsNyBAQAogCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCiAJCSJGb3J3YXJkaW5nIHBhY2tldDogcmVicm9hZGNhc3Qgb3JpZ2luYXRvciBwYWNrZXRcbiIpOwogCXNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KG9yaWdfbm9kZSwgZXRoaGRyLCBiYXRtYW5fcGFja2V0LAotCQkJCTAsIHR0X2J1ZmZfbGVuLCBpZl9pbmNvbWluZyk7CisJCQkJMCwgaWZfaW5jb21pbmcpOwogCiBvdXRfbmVpZ2g6CiAJaWYgKChvcmlnX25laWdoX25vZGUpICYmICghaXNfc2luZ2xlX2hvcF9uZWlnaCkpCkBAIC0xMDc3LDcgKzExMDcsNyBAQAogICogVGhpcyBtZXRob2Qgcm90YXRlcyB0aGUgYm9uZGluZyBsaXN0IGFuZCBpbmNyZWFzZXMgdGhlCiAgKiByZXR1cm5lZCByb3V0ZXIncyByZWZjb3VudC4gKi8KIHN0YXRpYyBzdHJ1Y3QgbmVpZ2hfbm9kZSAqZmluZF9ib25kX3JvdXRlcihzdHJ1Y3Qgb3JpZ19ub2RlICpwcmltYXJ5X29yaWcsCi0JCQkJCSAgIHN0cnVjdCBoYXJkX2lmYWNlICpyZWN2X2lmKQorCQkJCQkgICBjb25zdCBzdHJ1Y3QgaGFyZF9pZmFjZSAqcmVjdl9pZikKIHsKIAlzdHJ1Y3QgbmVpZ2hfbm9kZSAqdG1wX25laWdoX25vZGU7CiAJc3RydWN0IG5laWdoX25vZGUgKnJvdXRlciA9IE5VTEwsICpmaXJzdF9jYW5kaWRhdGUgPSBOVUxMOwpAQCAtMTEyOCw3ICsxMTU4LDcgQEAKICAqCiAgKiBJbmNyZWFzZXMgdGhlIHJldHVybmVkIHJvdXRlcidzIHJlZmNvdW50ICovCiBzdGF0aWMgc3RydWN0IG5laWdoX25vZGUgKmZpbmRfaWZhbHRlcl9yb3V0ZXIoc3RydWN0IG9yaWdfbm9kZSAqcHJpbWFyeV9vcmlnLAotCQkJCQkgICAgICBzdHJ1Y3QgaGFyZF9pZmFjZSAqcmVjdl9pZikKKwkJCQkJICAgICAgY29uc3Qgc3RydWN0IGhhcmRfaWZhY2UgKnJlY3ZfaWYpCiB7CiAJc3RydWN0IG5laWdoX25vZGUgKnRtcF9uZWlnaF9ub2RlOwogCXN0cnVjdCBuZWlnaF9ub2RlICpyb3V0ZXIgPSBOVUxMLCAqZmlyc3RfY2FuZGlkYXRlID0gTlVMTDsKQEAgLTExNzEsMTIgKzEyMDEsMTI0IEBACiAJcmV0dXJuIHJvdXRlcjsKIH0KIAoraW50IHJlY3ZfdHRfcXVlcnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhhcmRfaWZhY2UgKnJlY3ZfaWYpCit7CisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHJlY3ZfaWYtPnNvZnRfaWZhY2UpOworCXN0cnVjdCB0dF9xdWVyeV9wYWNrZXQgKnR0X3F1ZXJ5OworCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKKworCS8qIGRyb3AgcGFja2V0IGlmIGl0IGhhcyBub3QgbmVjZXNzYXJ5IG1pbmltdW0gc2l6ZSAqLworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgdHRfcXVlcnlfcGFja2V0KSkpKQorCQlnb3RvIG91dDsKKworCS8qIEkgY291bGQgbmVlZCB0byBtb2RpZnkgaXQgKi8KKwlpZiAoc2tiX2Nvdyhza2IsIHNpemVvZihzdHJ1Y3QgdHRfcXVlcnlfcGFja2V0KSkgPCAwKQorCQlnb3RvIG91dDsKKworCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKKworCS8qIHBhY2tldCB3aXRoIHVuaWNhc3QgaW5kaWNhdGlvbiBidXQgYnJvYWRjYXN0IHJlY2lwaWVudCAqLworCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihldGhoZHItPmhfZGVzdCkpCisJCWdvdG8gb3V0OworCisJLyogcGFja2V0IHdpdGggYnJvYWRjYXN0IHNlbmRlciBhZGRyZXNzICovCisJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGV0aGhkci0+aF9zb3VyY2UpKQorCQlnb3RvIG91dDsKKworCXR0X3F1ZXJ5ID0gKHN0cnVjdCB0dF9xdWVyeV9wYWNrZXQgKilza2ItPmRhdGE7CisKKwl0dF9xdWVyeS0+dHRfZGF0YSA9IG50b2hzKHR0X3F1ZXJ5LT50dF9kYXRhKTsKKworCXN3aXRjaCAodHRfcXVlcnktPmZsYWdzICYgVFRfUVVFUllfVFlQRV9NQVNLKSB7CisJY2FzZSBUVF9SRVFVRVNUOgorCQkvKiBJZiB3ZSBjYW5ub3QgcHJvdmlkZSBhbiBhbnN3ZXIgdGhlIHR0X3JlcXVlc3QgaXMKKwkJICogZm9yd2FyZGVkICovCisJCWlmICghc2VuZF90dF9yZXNwb25zZShiYXRfcHJpdiwgdHRfcXVlcnkpKSB7CisJCQliYXRfZGJnKERCR19UVCwgYmF0X3ByaXYsCisJCQkJIlJvdXRpbmcgVFRfUkVRVUVTVCB0byAlcE0gWyVjXVxuIiwKKwkJCQl0dF9xdWVyeS0+ZHN0LAorCQkJCSh0dF9xdWVyeS0+ZmxhZ3MgJiBUVF9GVUxMX1RBQkxFID8gJ0YnIDogJy4nKSk7CisJCQl0dF9xdWVyeS0+dHRfZGF0YSA9IGh0b25zKHR0X3F1ZXJ5LT50dF9kYXRhKTsKKwkJCXJldHVybiByb3V0ZV91bmljYXN0X3BhY2tldChza2IsIHJlY3ZfaWYpOworCQl9CisJCWJyZWFrOworCWNhc2UgVFRfUkVTUE9OU0U6CisJCS8qIHBhY2tldCBuZWVkcyB0byBiZSBsaW5lYXJpc2VkIHRvIGFjY2VzcyB0aGUgVFQgY2hhbmdlcyAqLworCQlpZiAoc2tiX2xpbmVhcml6ZShza2IpIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCWlmIChpc19teV9tYWModHRfcXVlcnktPmRzdCkpCisJCQloYW5kbGVfdHRfcmVzcG9uc2UoYmF0X3ByaXYsIHR0X3F1ZXJ5KTsKKwkJZWxzZSB7CisJCQliYXRfZGJnKERCR19UVCwgYmF0X3ByaXYsCisJCQkJIlJvdXRpbmcgVFRfUkVTUE9OU0UgdG8gJXBNIFslY11cbiIsCisJCQkJdHRfcXVlcnktPmRzdCwKKwkJCQkodHRfcXVlcnktPmZsYWdzICYgVFRfRlVMTF9UQUJMRSA/ICdGJyA6ICcuJykpOworCQkJdHRfcXVlcnktPnR0X2RhdGEgPSBodG9ucyh0dF9xdWVyeS0+dHRfZGF0YSk7CisJCQlyZXR1cm4gcm91dGVfdW5pY2FzdF9wYWNrZXQoc2tiLCByZWN2X2lmKTsKKwkJfQorCQlicmVhazsKKwl9CisKK291dDoKKwkvKiByZXR1cm5pbmcgTkVUX1JYX0RST1Agd2lsbCBtYWtlIHRoZSBjYWxsZXIgZnVuY3Rpb24ga2ZyZWUgdGhlIHNrYiAqLworCXJldHVybiBORVRfUlhfRFJPUDsKK30KKworaW50IHJlY3Zfcm9hbV9hZHYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhhcmRfaWZhY2UgKnJlY3ZfaWYpCit7CisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHJlY3ZfaWYtPnNvZnRfaWZhY2UpOworCXN0cnVjdCByb2FtX2Fkdl9wYWNrZXQgKnJvYW1fYWR2X3BhY2tldDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IGV0aGhkciAqZXRoaGRyOworCisJLyogZHJvcCBwYWNrZXQgaWYgaXQgaGFzIG5vdCBuZWNlc3NhcnkgbWluaW11bSBzaXplICovCisJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCByb2FtX2Fkdl9wYWNrZXQpKSkpCisJCWdvdG8gb3V0OworCisJZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOworCisJLyogcGFja2V0IHdpdGggdW5pY2FzdCBpbmRpY2F0aW9uIGJ1dCBicm9hZGNhc3QgcmVjaXBpZW50ICovCisJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGV0aGhkci0+aF9kZXN0KSkKKwkJZ290byBvdXQ7CisKKwkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3Qgc2VuZGVyIGFkZHJlc3MgKi8KKwlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZXRoaGRyLT5oX3NvdXJjZSkpCisJCWdvdG8gb3V0OworCisJcm9hbV9hZHZfcGFja2V0ID0gKHN0cnVjdCByb2FtX2Fkdl9wYWNrZXQgKilza2ItPmRhdGE7CisKKwlpZiAoIWlzX215X21hYyhyb2FtX2Fkdl9wYWNrZXQtPmRzdCkpCisJCXJldHVybiByb3V0ZV91bmljYXN0X3BhY2tldChza2IsIHJlY3ZfaWYpOworCisJb3JpZ19ub2RlID0gb3JpZ19oYXNoX2ZpbmQoYmF0X3ByaXYsIHJvYW1fYWR2X3BhY2tldC0+c3JjKTsKKwlpZiAoIW9yaWdfbm9kZSkKKwkJZ290byBvdXQ7CisKKwliYXRfZGJnKERCR19UVCwgYmF0X3ByaXYsICJSZWNlaXZlZCBST0FNSU5HX0FEViBmcm9tICVwTSAiCisJCSIoY2xpZW50ICVwTSlcbiIsIHJvYW1fYWR2X3BhY2tldC0+c3JjLAorCQlyb2FtX2Fkdl9wYWNrZXQtPmNsaWVudCk7CisKKwl0dF9nbG9iYWxfYWRkKGJhdF9wcml2LCBvcmlnX25vZGUsIHJvYW1fYWR2X3BhY2tldC0+Y2xpZW50LAorCQkgICAgICBhdG9taWNfcmVhZCgmb3JpZ19ub2RlLT5sYXN0X3R0dm4pICsgMSwgdHJ1ZSk7CisKKwkvKiBSb2FtaW5nIHBoYXNlIHN0YXJ0czogSSBoYXZlIG5ldyBpbmZvcm1hdGlvbiBidXQgdGhlIHR0dm4gaGFzIG5vdAorCSAqIGJlZW4gaW5jcmVtZW50ZWQgeWV0LiBUaGlzIGZsYWcgd2lsbCBtYWtlIG1lIGNoZWNrIGFsbCB0aGUgaW5jb21pbmcKKwkgKiBwYWNrZXRzIGZvciB0aGUgY29ycmVjdCBkZXN0aW5hdGlvbi4gKi8KKwliYXRfcHJpdi0+dHRfcG9zc19jaGFuZ2UgPSB0cnVlOworCisJb3JpZ19ub2RlX2ZyZWVfcmVmKG9yaWdfbm9kZSk7CitvdXQ6CisJLyogcmV0dXJuaW5nIE5FVF9SWF9EUk9QIHdpbGwgbWFrZSB0aGUgY2FsbGVyIGZ1bmN0aW9uIGtmcmVlIHRoZSBza2IgKi8KKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CisKIC8qIGZpbmQgYSBzdWl0YWJsZSByb3V0ZXIgZm9yIHRoaXMgb3JpZ2luYXRvciwgYW5kIHVzZQogICogYm9uZGluZyBpZiBwb3NzaWJsZS4gaW5jcmVhc2VzIHRoZSBmb3VuZCBuZWlnaGJvcnMKICAqIHJlZmNvdW50LiovCiBzdHJ1Y3QgbmVpZ2hfbm9kZSAqZmluZF9yb3V0ZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKIAkJCSAgICAgICBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCQkgICAgICAgc3RydWN0IGhhcmRfaWZhY2UgKnJlY3ZfaWYpCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGhhcmRfaWZhY2UgKnJlY3ZfaWYpCiB7CiAJc3RydWN0IG9yaWdfbm9kZSAqcHJpbWFyeV9vcmlnX25vZGU7CiAJc3RydWN0IG9yaWdfbm9kZSAqcm91dGVyX29yaWc7CkBAIC0xMjQwLDYgKzEzODIsOSBAQAogCQlyb3V0ZXIgPSBmaW5kX2lmYWx0ZXJfcm91dGVyKHByaW1hcnlfb3JpZ19ub2RlLCByZWN2X2lmKTsKIAogcmV0dXJuX3JvdXRlcjoKKwlpZiAocm91dGVyICYmIHJvdXRlci0+aWZfaW5jb21pbmctPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCisJCWdvdG8gZXJyX3VubG9jazsKKwogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByb3V0ZXI7CiBlcnJfdW5sb2NrOgpAQCAtMTM1NCwxNCArMTQ5OSw4NCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgY2hlY2tfdW5pY2FzdF90dHZuKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgeworCXVpbnQ4X3QgY3Vycl90dHZuOworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7CisJc3RydWN0IGhhcmRfaWZhY2UgKnByaW1hcnlfaWY7CisJc3RydWN0IHVuaWNhc3RfcGFja2V0ICp1bmljYXN0X3BhY2tldDsKKwlib29sIHR0X3Bvc3NfY2hhbmdlOworCisJLyogSSBjb3VsZCBuZWVkIHRvIG1vZGlmeSBpdCAqLworCWlmIChza2JfY293KHNrYiwgc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCkpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7CisKKwlpZiAoaXNfbXlfbWFjKHVuaWNhc3RfcGFja2V0LT5kZXN0KSkgeworCQl0dF9wb3NzX2NoYW5nZSA9IGJhdF9wcml2LT50dF9wb3NzX2NoYW5nZTsKKwkJY3Vycl90dHZuID0gKHVpbnQ4X3QpYXRvbWljX3JlYWQoJmJhdF9wcml2LT50dHZuKTsKKwl9IGVsc2UgeworCQlvcmlnX25vZGUgPSBvcmlnX2hhc2hfZmluZChiYXRfcHJpdiwgdW5pY2FzdF9wYWNrZXQtPmRlc3QpOworCisJCWlmICghb3JpZ19ub2RlKQorCQkJcmV0dXJuIDA7CisKKwkJY3Vycl90dHZuID0gKHVpbnQ4X3QpYXRvbWljX3JlYWQoJm9yaWdfbm9kZS0+bGFzdF90dHZuKTsKKwkJdHRfcG9zc19jaGFuZ2UgPSBvcmlnX25vZGUtPnR0X3Bvc3NfY2hhbmdlOworCQlvcmlnX25vZGVfZnJlZV9yZWYob3JpZ19ub2RlKTsKKwl9CisKKwkvKiBDaGVjayB3aGV0aGVyIEkgaGF2ZSB0byByZXJvdXRlIHRoZSBwYWNrZXQgKi8KKwlpZiAoc2VxX2JlZm9yZSh1bmljYXN0X3BhY2tldC0+dHR2biwgY3Vycl90dHZuKSB8fCB0dF9wb3NzX2NoYW5nZSkgeworCQkvKiBMaW5lYXJpemUgdGhlIHNrYiBiZWZvcmUgYWNjZXNzaW5nIGl0ICovCisJCWlmIChza2JfbGluZWFyaXplKHNrYikgPCAwKQorCQkJcmV0dXJuIDA7CisKKwkJZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKikoc2tiLT5kYXRhICsKKwkJCXNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpKTsKKwkJb3JpZ19ub2RlID0gdHJhbnN0YWJsZV9zZWFyY2goYmF0X3ByaXYsIGV0aGhkci0+aF9kZXN0KTsKKworCQlpZiAoIW9yaWdfbm9kZSkgeworCQkJaWYgKCFpc19teV9jbGllbnQoYmF0X3ByaXYsIGV0aGhkci0+aF9kZXN0KSkKKwkJCQlyZXR1cm4gMDsKKwkJCXByaW1hcnlfaWYgPSBwcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7CisJCQlpZiAoIXByaW1hcnlfaWYpCisJCQkJcmV0dXJuIDA7CisJCQltZW1jcHkodW5pY2FzdF9wYWNrZXQtPmRlc3QsCisJCQkgICAgICAgcHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwkJCWhhcmRpZl9mcmVlX3JlZihwcmltYXJ5X2lmKTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSh1bmljYXN0X3BhY2tldC0+ZGVzdCwgb3JpZ19ub2RlLT5vcmlnLAorCQkJICAgICAgIEVUSF9BTEVOKTsKKwkJCWN1cnJfdHR2biA9ICh1aW50OF90KQorCQkJCWF0b21pY19yZWFkKCZvcmlnX25vZGUtPmxhc3RfdHR2bik7CisJCQlvcmlnX25vZGVfZnJlZV9yZWYob3JpZ19ub2RlKTsKKwkJfQorCisJCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsICJUVFZOIG1pc21hdGNoIChvbGRfdHR2biAldSAiCisJCQkibmV3X3R0dm4gJXUpISBSZXJvdXRpbmcgdW5pY2FzdCBwYWNrZXQgKGZvciAlcE0pIHRvICIKKwkJCSIlcE1cbiIsIHVuaWNhc3RfcGFja2V0LT50dHZuLCBjdXJyX3R0dm4sCisJCQlldGhoZHItPmhfZGVzdCwgdW5pY2FzdF9wYWNrZXQtPmRlc3QpOworCisJCXVuaWNhc3RfcGFja2V0LT50dHZuID0gY3Vycl90dHZuOworCX0KKwlyZXR1cm4gMTsKK30KKwogaW50IHJlY3ZfdW5pY2FzdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhhcmRfaWZhY2UgKnJlY3ZfaWYpCiB7CisJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHJlY3ZfaWYtPnNvZnRfaWZhY2UpOwogCXN0cnVjdCB1bmljYXN0X3BhY2tldCAqdW5pY2FzdF9wYWNrZXQ7Ci0JaW50IGhkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCk7CisJaW50IGhkcl9zaXplID0gc2l6ZW9mKCp1bmljYXN0X3BhY2tldCk7CiAKIAlpZiAoY2hlY2tfdW5pY2FzdF9wYWNrZXQoc2tiLCBoZHJfc2l6ZSkgPCAwKQogCQlyZXR1cm4gTkVUX1JYX0RST1A7CiAKKwlpZiAoIWNoZWNrX3VuaWNhc3RfdHR2bihiYXRfcHJpdiwgc2tiKSkKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOworCiAJdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfcGFja2V0ICopc2tiLT5kYXRhOwogCiAJLyogcGFja2V0IGZvciBtZSAqLwpAQCAtMTM3NywxMyArMTU5MiwxNiBAQAogewogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihyZWN2X2lmLT5zb2Z0X2lmYWNlKTsKIAlzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqdW5pY2FzdF9wYWNrZXQ7Ci0JaW50IGhkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0KTsKKwlpbnQgaGRyX3NpemUgPSBzaXplb2YoKnVuaWNhc3RfcGFja2V0KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYiA9IE5VTEw7CiAJaW50IHJldDsKIAogCWlmIChjaGVja191bmljYXN0X3BhY2tldChza2IsIGhkcl9zaXplKSA8IDApCiAJCXJldHVybiBORVRfUlhfRFJPUDsKIAorCWlmICghY2hlY2tfdW5pY2FzdF90dHZuKGJhdF9wcml2LCBza2IpKQorCQlyZXR1cm4gTkVUX1JYX0RST1A7CisKIAl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqKXNrYi0+ZGF0YTsKIAogCS8qIHBhY2tldCBmb3IgbWUgKi8KQEAgLTE0MTMsNyArMTYzMSw3IEBACiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlID0gTlVMTDsKIAlzdHJ1Y3QgYmNhc3RfcGFja2V0ICpiY2FzdF9wYWNrZXQ7CiAJc3RydWN0IGV0aGhkciAqZXRoaGRyOwotCWludCBoZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KTsKKwlpbnQgaGRyX3NpemUgPSBzaXplb2YoKmJjYXN0X3BhY2tldCk7CiAJaW50IHJldCA9IE5FVF9SWF9EUk9QOwogCWludDMyX3Qgc2VxX2RpZmY7CiAKQEAgLTE0NzEsNyArMTY4OSw3IEBACiAJc3Bpbl91bmxvY2tfYmgoJm9yaWdfbm9kZS0+YmNhc3Rfc2Vxbm9fbG9jayk7CiAKIAkvKiByZWJyb2FkY2FzdCBwYWNrZXQgKi8KLQlhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3QoYmF0X3ByaXYsIHNrYik7CisJYWRkX2JjYXN0X3BhY2tldF90b19saXN0KGJhdF9wcml2LCBza2IsIDEpOwogCiAJLyogYnJvYWRjYXN0IGZvciBtZSAqLwogCWludGVyZmFjZV9yeChyZWN2X2lmLT5zb2Z0X2lmYWNlLCBza2IsIHJlY3ZfaWYsIGhkcl9zaXplKTsKQEAgLTE0OTEsNyArMTcwOSw3IEBACiAJc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQ7CiAJc3RydWN0IGV0aGhkciAqZXRoaGRyOwogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihyZWN2X2lmLT5zb2Z0X2lmYWNlKTsKLQlpbnQgaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpOworCWludCBoZHJfc2l6ZSA9IHNpemVvZigqdmlzX3BhY2tldCk7CiAKIAkvKiBrZWVwIHNrYiBsaW5lYXIgKi8KIAlpZiAoc2tiX2xpbmVhcml6ZShza2IpIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3JvdXRpbmcuaCBiL25ldC9iYXRtYW4tYWR2L3JvdXRpbmcuaAppbmRleCA4NzBmMjk4Li5mYjE0ZTk1IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9yb3V0aW5nLmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvcm91dGluZy5oCkBAIC0yMywxMyArMjMsMTIgQEAKICNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1JPVVRJTkdfSF8KIAogdm9pZCBzbGlkZV9vd25fYmNhc3Rfd2luZG93KHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlKTsKLXZvaWQgcmVjZWl2ZV9iYXRfcGFja2V0KHN0cnVjdCBldGhoZHIgKmV0aGhkciwKLQkJCQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKLQkJCQl1bnNpZ25lZCBjaGFyICp0dF9idWZmLCBpbnQgdHRfYnVmZl9sZW4sCi0JCQkJc3RydWN0IGhhcmRfaWZhY2UgKmlmX2luY29taW5nKTsKK3ZvaWQgcmVjZWl2ZV9iYXRfcGFja2V0KGNvbnN0IHN0cnVjdCBldGhoZHIgKmV0aGhkciwKKwkJCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqdHRfYnVmZiwKKwkJCXN0cnVjdCBoYXJkX2lmYWNlICppZl9pbmNvbWluZyk7CiB2b2lkIHVwZGF0ZV9yb3V0ZXMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkgICBzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSwgdW5zaWduZWQgY2hhciAqdHRfYnVmZiwKLQkJICAgaW50IHR0X2J1ZmZfbGVuKTsKKwkJICAgc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUpOwogaW50IHJvdXRlX3VuaWNhc3RfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBoYXJkX2lmYWNlICpyZWN2X2lmKTsKIGludCByZWN2X2ljbXBfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBoYXJkX2lmYWNlICpyZWN2X2lmKTsKIGludCByZWN2X3VuaWNhc3RfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBoYXJkX2lmYWNlICpyZWN2X2lmKTsKQEAgLTM3LDkgKzM2LDExIEBACiBpbnQgcmVjdl9iY2FzdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhhcmRfaWZhY2UgKnJlY3ZfaWYpOwogaW50IHJlY3ZfdmlzX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaGFyZF9pZmFjZSAqcmVjdl9pZik7CiBpbnQgcmVjdl9iYXRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBoYXJkX2lmYWNlICpyZWN2X2lmKTsKK2ludCByZWN2X3R0X3F1ZXJ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBoYXJkX2lmYWNlICpyZWN2X2lmKTsKK2ludCByZWN2X3JvYW1fYWR2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBoYXJkX2lmYWNlICpyZWN2X2lmKTsKIHN0cnVjdCBuZWlnaF9ub2RlICpmaW5kX3JvdXRlcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAogCQkJICAgICAgIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCSAgICAgICBzdHJ1Y3QgaGFyZF9pZmFjZSAqcmVjdl9pZik7CisJCQkgICAgICAgY29uc3Qgc3RydWN0IGhhcmRfaWZhY2UgKnJlY3ZfaWYpOwogdm9pZCBib25kaW5nX2NhbmRpZGF0ZV9kZWwoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAogCQkJICAgc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUpOwogCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9zZW5kLmMgYi9uZXQvYmF0bWFuLWFkdi9zZW5kLmMKaW5kZXggMzM3NzkyNy4uNThkMTQ0NyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvc2VuZC5jCisrKyBiL25ldC9iYXRtYW4tYWR2L3NlbmQuYwpAQCAtMzMsMTQgKzMzLDE0IEBACiBzdGF0aWMgdm9pZCBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAvKiBhcHBseSBob3AgcGVuYWx0eSBmb3IgYSBub3JtYWwgbGluayAqLwotc3RhdGljIHVpbnQ4X3QgaG9wX3BlbmFsdHkoY29uc3QgdWludDhfdCB0cSwgc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKK3N0YXRpYyB1aW50OF90IGhvcF9wZW5hbHR5KHVpbnQ4X3QgdHEsIGNvbnN0IHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCiB7CiAJaW50IGhvcF9wZW5hbHR5ID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ob3BfcGVuYWx0eSk7CiAJcmV0dXJuICh0cSAqIChUUV9NQVhfVkFMVUUgLSBob3BfcGVuYWx0eSkpIC8gKFRRX01BWF9WQUxVRSk7CiB9CiAKIC8qIHdoZW4gZG8gd2Ugc2NoZWR1bGUgb3VyIG93biBwYWNrZXQgdG8gYmUgc2VudCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3duX3NlbmRfdGltZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQorc3RhdGljIHVuc2lnbmVkIGxvbmcgb3duX3NlbmRfdGltZShjb25zdCBzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQogewogCXJldHVybiBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygKIAkJICAgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsKSAtCkBAIC01NSw5ICs1NSw4IEBACiAKIC8qIHNlbmQgb3V0IGFuIGFscmVhZHkgcHJlcGFyZWQgcGFja2V0IHRvIHRoZSBnaXZlbiBhZGRyZXNzIHZpYSB0aGUKICAqIHNwZWNpZmllZCBiYXRtYW4gaW50ZXJmYWNlICovCi1pbnQgc2VuZF9za2JfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2UsCi0JCQkJdWludDhfdCAqZHN0X2FkZHIpCitpbnQgc2VuZF9za2JfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlLAorCQkgICAgY29uc3QgdWludDhfdCAqZHN0X2FkZHIpCiB7CiAJc3RydWN0IGV0aGhkciAqZXRoaGRyOwogCkBAIC03NCw3ICs3Myw3IEBACiAJfQogCiAJLyogcHVzaCB0byB0aGUgZXRoZXJuZXQgaGVhZGVyLiAqLwotCWlmIChteV9za2JfaGVhZF9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKSA8IDApCisJaWYgKG15X3NrYl9oZWFkX3B1c2goc2tiLCBzaXplb2YoKmV0aGhkcikpIDwgMCkKIAkJZ290byBzZW5kX3NrYl9lcnI7CiAKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwpAQCAtMTIxLDcgKzEyMCw3IEBACiAJLyogYWRqdXN0IGFsbCBmbGFncyBhbmQgbG9nIHBhY2tldHMgKi8KIAl3aGlsZSAoYWdncmVnYXRlZF9wYWNrZXQoYnVmZl9wb3MsCiAJCQkJIGZvcndfcGFja2V0LT5wYWNrZXRfbGVuLAotCQkJCSBiYXRtYW5fcGFja2V0LT5udW1fdHQpKSB7CisJCQkJIGJhdG1hbl9wYWNrZXQtPnR0X251bV9jaGFuZ2VzKSkgewogCiAJCS8qIHdlIG1pZ2h0IGhhdmUgYWdncmVnYXRlZCBkaXJlY3QgbGluayBwYWNrZXRzIHdpdGggYW4KIAkJICogb3JkaW5hcnkgYmFzZSBwYWNrZXQgKi8KQEAgLTEzNiwxNyArMTM1LDE3IEBACiAJCQkJCQkJICAgICJGb3J3YXJkaW5nIikpOwogCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAogCQkJIiVzICVzcGFja2V0IChvcmlnaW5hdG9yICVwTSwgc2Vxbm8gJWQsIFRRICVkLCBUVEwgJWQsIgotCQkJIiBJREYgJXMpIG9uIGludGVyZmFjZSAlcyBbJXBNXVxuIiwKKwkJCSIgSURGICVzLCBodm4gJWQpIG9uIGludGVyZmFjZSAlcyBbJXBNXVxuIiwKIAkJCWZ3ZF9zdHIsIChwYWNrZXRfbnVtID4gMCA/ICJhZ2dyZWdhdGVkICIgOiAiIiksCiAJCQliYXRtYW5fcGFja2V0LT5vcmlnLCBudG9obChiYXRtYW5fcGFja2V0LT5zZXFubyksCiAJCQliYXRtYW5fcGFja2V0LT50cSwgYmF0bWFuX3BhY2tldC0+dHRsLAogCQkJKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSyA/CiAJCQkgIm9uIiA6ICJvZmYiKSwKLQkJCWhhcmRfaWZhY2UtPm5ldF9kZXYtPm5hbWUsCisJCQliYXRtYW5fcGFja2V0LT50dHZuLCBoYXJkX2lmYWNlLT5uZXRfZGV2LT5uYW1lLAogCQkJaGFyZF9pZmFjZS0+bmV0X2Rldi0+ZGV2X2FkZHIpOwogCi0JCWJ1ZmZfcG9zICs9IHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkgKwotCQkJKGJhdG1hbl9wYWNrZXQtPm51bV90dCAqIEVUSF9BTEVOKTsKKwkJYnVmZl9wb3MgKz0gc2l6ZW9mKCpiYXRtYW5fcGFja2V0KSArCisJCQl0dF9sZW4oYmF0bWFuX3BhY2tldC0+dHRfbnVtX2NoYW5nZXMpOwogCQlwYWNrZXRfbnVtKys7CiAJCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikKIAkJCShmb3J3X3BhY2tldC0+c2tiLT5kYXRhICsgYnVmZl9wb3MpOwpAQCAtMTY0LDI2ICsxNjMsMzEgQEAKIAlzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKIAlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2OworCXN0cnVjdCBoYXJkX2lmYWNlICpwcmltYXJ5X2lmID0gTlVMTDsKIAlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCA9CiAJCShzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKShmb3J3X3BhY2tldC0+c2tiLT5kYXRhKTsKLQl1bnNpZ25lZCBjaGFyIGRpcmVjdGxpbmsgPSAoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8gMSA6IDApOworCWludCBkaXJlY3RsaW5rID0gKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSyA/IDEgOiAwKTsKIAogCWlmICghZm9yd19wYWNrZXQtPmlmX2luY29taW5nKSB7CiAJCXByX2VycigiRXJyb3IgLSBjYW4ndCBmb3J3YXJkIHBhY2tldDogaW5jb21pbmcgaWZhY2Ugbm90ICIKIAkJICAgICAgICJzcGVjaWZpZWRcbiIpOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAogCXNvZnRfaWZhY2UgPSBmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPnNvZnRfaWZhY2U7CiAJYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKIAogCWlmIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CisKKwlwcmltYXJ5X2lmID0gcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCWlmICghcHJpbWFyeV9pZikKKwkJZ290byBvdXQ7CiAKIAkvKiBtdWx0aWhvbWVkIHBlZXIgYXNzdW1lZCAqLwogCS8qIG5vbi1wcmltYXJ5IE9HTXMgYXJlIG9ubHkgYnJvYWRjYXN0ZWQgb24gdGhlaXIgaW50ZXJmYWNlICovCiAJaWYgKChkaXJlY3RsaW5rICYmIChiYXRtYW5fcGFja2V0LT50dGwgPT0gMSkpIHx8Ci0JICAgIChmb3J3X3BhY2tldC0+b3duICYmIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmlmX251bSA+IDApKSkgeworCSAgICAoZm9yd19wYWNrZXQtPm93biAmJiAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nICE9IHByaW1hcnlfaWYpKSkgewogCiAJCS8qIEZJWE1FOiB3aGF0IGFib3V0IGFnZ3JlZ2F0ZWQgcGFja2V0cyA/ICovCiAJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCkBAIC0yMDAsNyArMjA0LDcgQEAKIAkJCQlicm9hZGNhc3RfYWRkcik7CiAJCWZvcndfcGFja2V0LT5za2IgPSBOVUxMOwogCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogYnJvYWRjYXN0IG9uIGV2ZXJ5IGludGVyZmFjZSAqLwpAQCAtMjEyLDI4ICsyMTYsMjQgQEAKIAkJc2VuZF9wYWNrZXRfdG9faWYoZm9yd19wYWNrZXQsIGhhcmRfaWZhY2UpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKKworb3V0OgorCWlmIChwcmltYXJ5X2lmKQorCQloYXJkaWZfZnJlZV9yZWYocHJpbWFyeV9pZik7CiB9CiAKLXN0YXRpYyB2b2lkIHJlYnVpbGRfYmF0bWFuX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCSAgc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2UpCitzdGF0aWMgdm9pZCByZWFsbG9jX3BhY2tldF9idWZmZXIoc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2UsCisJCQkJaW50IG5ld19sZW4pCiB7Ci0JaW50IG5ld19sZW47CiAJdW5zaWduZWQgY2hhciAqbmV3X2J1ZmY7CiAJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7CiAKLQluZXdfbGVuID0gc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSArCi0JCQkoYmF0X3ByaXYtPm51bV9sb2NhbF90dCAqIEVUSF9BTEVOKTsKIAluZXdfYnVmZiA9IGttYWxsb2MobmV3X2xlbiwgR0ZQX0FUT01JQyk7CiAKIAkvKiBrZWVwIG9sZCBidWZmZXIgaWYga21hbGxvYyBzaG91bGQgZmFpbCAqLwogCWlmIChuZXdfYnVmZikgewogCQltZW1jcHkobmV3X2J1ZmYsIGhhcmRfaWZhY2UtPnBhY2tldF9idWZmLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSk7Ci0JCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKiluZXdfYnVmZjsKLQotCQliYXRtYW5fcGFja2V0LT5udW1fdHQgPSB0dF9sb2NhbF9maWxsX2J1ZmZlcihiYXRfcHJpdiwKLQkJCQluZXdfYnVmZiArIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCksCi0JCQkJbmV3X2xlbiAtIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkpOworCQkgICAgICAgc2l6ZW9mKCpiYXRtYW5fcGFja2V0KSk7CiAKIAkJa2ZyZWUoaGFyZF9pZmFjZS0+cGFja2V0X2J1ZmYpOwogCQloYXJkX2lmYWNlLT5wYWNrZXRfYnVmZiA9IG5ld19idWZmOwpAQCAtMjQxLDYgKzI0MSw0NiBAQAogCX0KIH0KIAorLyogd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gKGhhcmRfaWZhY2UgPT0gcHJpbWFyeV9pZikgaGFzIHRvIGJlIHRydWUgKi8KK3N0YXRpYyB2b2lkIHByZXBhcmVfcGFja2V0X2J1ZmZlcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJCSAgc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2UpCit7CisJaW50IG5ld19sZW47CisJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7CisKKwluZXdfbGVuID0gQkFUX1BBQ0tFVF9MRU4gKworCQkgIHR0X2xlbigodWludDhfdClhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnR0X2xvY2FsX2NoYW5nZXMpKTsKKworCS8qIGlmIHdlIGhhdmUgdG9vIG1hbnkgY2hhbmdlcyBmb3Igb25lIHBhY2tldCBkb24ndCBzZW5kIGFueQorCSAqIGFuZCB3YWl0IGZvciB0aGUgdHQgdGFibGUgcmVxdWVzdCB3aGljaCB3aWxsIGJlIGZyYWdtZW50ZWQgKi8KKwlpZiAobmV3X2xlbiA+IGhhcmRfaWZhY2UtPnNvZnRfaWZhY2UtPm10dSkKKwkJbmV3X2xlbiA9IEJBVF9QQUNLRVRfTEVOOworCisJcmVhbGxvY19wYWNrZXRfYnVmZmVyKGhhcmRfaWZhY2UsIG5ld19sZW4pOworCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKiloYXJkX2lmYWNlLT5wYWNrZXRfYnVmZjsKKworCWF0b21pY19zZXQoJmJhdF9wcml2LT50dF9jcmMsIHR0X2xvY2FsX2NyYyhiYXRfcHJpdikpOworCisJLyogcmVzZXQgdGhlIHNlbmRpbmcgY291bnRlciAqLworCWF0b21pY19zZXQoJmJhdF9wcml2LT50dF9vZ21fYXBwZW5kX2NudCwgVFRfT0dNX0FQUEVORF9NQVgpOworCisJYmF0bWFuX3BhY2tldC0+dHRfbnVtX2NoYW5nZXMgPSB0dF9jaGFuZ2VzX2ZpbGxfYnVmZmVyKGJhdF9wcml2LAorCQkJCWhhcmRfaWZhY2UtPnBhY2tldF9idWZmICsgQkFUX1BBQ0tFVF9MRU4sCisJCQkJaGFyZF9pZmFjZS0+cGFja2V0X2xlbiAtIEJBVF9QQUNLRVRfTEVOKTsKKworfQorCitzdGF0aWMgdm9pZCByZXNldF9wYWNrZXRfYnVmZmVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2UpCit7CisJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7CisKKwlyZWFsbG9jX3BhY2tldF9idWZmZXIoaGFyZF9pZmFjZSwgQkFUX1BBQ0tFVF9MRU4pOworCisJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKWhhcmRfaWZhY2UtPnBhY2tldF9idWZmOworCWJhdG1hbl9wYWNrZXQtPnR0X251bV9jaGFuZ2VzID0gMDsKK30KKwogdm9pZCBzY2hlZHVsZV9vd25fcGFja2V0KHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlKQogewogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihoYXJkX2lmYWNlLT5zb2Z0X2lmYWNlKTsKQEAgLTI2NiwxNCArMzA2LDIxIEBACiAJaWYgKGhhcmRfaWZhY2UtPmlmX3N0YXR1cyA9PSBJRl9UT19CRV9BQ1RJVkFURUQpCiAJCWhhcmRfaWZhY2UtPmlmX3N0YXR1cyA9IElGX0FDVElWRTsKIAotCS8qIGlmIGxvY2FsIHR0IGhhcyBjaGFuZ2VkIGFuZCBpbnRlcmZhY2UgaXMgYSBwcmltYXJ5IGludGVyZmFjZSAqLwotCWlmICgoYXRvbWljX3JlYWQoJmJhdF9wcml2LT50dF9sb2NhbF9jaGFuZ2VkKSkgJiYKLQkgICAgKGhhcmRfaWZhY2UgPT0gcHJpbWFyeV9pZikpCi0JCXJlYnVpbGRfYmF0bWFuX3BhY2tldChiYXRfcHJpdiwgaGFyZF9pZmFjZSk7CisJaWYgKGhhcmRfaWZhY2UgPT0gcHJpbWFyeV9pZikgeworCQkvKiBpZiBhdCBsZWFzdCBvbmUgY2hhbmdlIGhhcHBlbmVkICovCisJCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnR0X2xvY2FsX2NoYW5nZXMpID4gMCkgeworCQkJdHRfY29tbWl0X2NoYW5nZXMoYmF0X3ByaXYpOworCQkJcHJlcGFyZV9wYWNrZXRfYnVmZmVyKGJhdF9wcml2LCBoYXJkX2lmYWNlKTsKKwkJfQorCisJCS8qIGlmIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBzZW50IGVub3VnaCB0aW1lcyAqLworCQlpZiAoIWF0b21pY19kZWNfbm90X3plcm8oJmJhdF9wcml2LT50dF9vZ21fYXBwZW5kX2NudCkpCisJCQlyZXNldF9wYWNrZXRfYnVmZmVyKGJhdF9wcml2LCBoYXJkX2lmYWNlKTsKKwl9CiAKIAkvKioKIAkgKiBOT1RFOiBwYWNrZXRfYnVmZiBtaWdodCBqdXN0IGhhdmUgYmVlbiByZS1hbGxvY2F0ZWQgaW4KLQkgKiByZWJ1aWxkX2JhdG1hbl9wYWNrZXQoKQorCSAqIHByZXBhcmVfcGFja2V0X2J1ZmZlcigpIG9yIGluIHJlc2V0X3BhY2tldF9idWZmZXIoKQogCSAqLwogCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKiloYXJkX2lmYWNlLT5wYWNrZXRfYnVmZjsKIApAQCAtMjgxLDYgKzMyOCw5IEBACiAJYmF0bWFuX3BhY2tldC0+c2Vxbm8gPQogCQlodG9ubCgodWludDMyX3QpYXRvbWljX3JlYWQoJmhhcmRfaWZhY2UtPnNlcW5vKSk7CiAKKwliYXRtYW5fcGFja2V0LT50dHZuID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT50dHZuKTsKKwliYXRtYW5fcGFja2V0LT50dF9jcmMgPSBodG9ucygodWludDE2X3QpYXRvbWljX3JlYWQoJmJhdF9wcml2LT50dF9jcmMpKTsKKwogCWlmICh2aXNfc2VydmVyID09IFZJU19UWVBFX1NFUlZFUl9TWU5DKQogCQliYXRtYW5fcGFja2V0LT5mbGFncyB8PSBWSVNfU0VSVkVSOwogCWVsc2UKQEAgLTI5MSw3ICszNDEsNyBAQAogCQliYXRtYW5fcGFja2V0LT5nd19mbGFncyA9CiAJCQkJKHVpbnQ4X3QpYXRvbWljX3JlYWQoJmJhdF9wcml2LT5nd19iYW5kd2lkdGgpOwogCWVsc2UKLQkJYmF0bWFuX3BhY2tldC0+Z3dfZmxhZ3MgPSAwOworCQliYXRtYW5fcGFja2V0LT5nd19mbGFncyA9IE5PX0ZMQUdTOwogCiAJYXRvbWljX2luYygmaGFyZF9pZmFjZS0+c2Vxbm8pOwogCkBAIC0zMDcsMTUgKzM1NywxNiBAQAogfQogCiB2b2lkIHNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCSAgICAgc3RydWN0IGV0aGhkciAqZXRoaGRyLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCiAJCQkgICAgIHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAotCQkJICAgICB1aW50OF90IGRpcmVjdGxpbmssIGludCB0dF9idWZmX2xlbiwKKwkJCSAgICAgaW50IGRpcmVjdGxpbmssCiAJCQkgICAgIHN0cnVjdCBoYXJkX2lmYWNlICppZl9pbmNvbWluZykKIHsKIAlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoaWZfaW5jb21pbmctPnNvZnRfaWZhY2UpOwogCXN0cnVjdCBuZWlnaF9ub2RlICpyb3V0ZXI7Ci0JdW5zaWduZWQgY2hhciBpbl90cSwgaW5fdHRsLCB0cV9hdmcgPSAwOworCXVpbnQ4X3QgaW5fdHEsIGluX3R0bCwgdHFfYXZnID0gMDsKIAl1bnNpZ25lZCBsb25nIHNlbmRfdGltZTsKKwl1aW50OF90IHR0X251bV9jaGFuZ2VzOwogCiAJaWYgKGJhdG1hbl9wYWNrZXQtPnR0bCA8PSAxKSB7CiAJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsICJ0dGwgZXhjZWVkZWRcbiIpOwpAQCAtMzI2LDYgKzM3Nyw3IEBACiAKIAlpbl90cSA9IGJhdG1hbl9wYWNrZXQtPnRxOwogCWluX3R0bCA9IGJhdG1hbl9wYWNrZXQtPnR0bDsKKwl0dF9udW1fY2hhbmdlcyA9IGJhdG1hbl9wYWNrZXQtPnR0X251bV9jaGFuZ2VzOwogCiAJYmF0bWFuX3BhY2tldC0+dHRsLS07CiAJbWVtY3B5KGJhdG1hbl9wYWNrZXQtPnByZXZfc2VuZGVyLCBldGhoZHItPmhfc291cmNlLCBFVEhfQUxFTik7CkBAIC0zNTgsNiArNDEwLDcgQEAKIAkJYmF0bWFuX3BhY2tldC0+dHRsKTsKIAogCWJhdG1hbl9wYWNrZXQtPnNlcW5vID0gaHRvbmwoYmF0bWFuX3BhY2tldC0+c2Vxbm8pOworCWJhdG1hbl9wYWNrZXQtPnR0X2NyYyA9IGh0b25zKGJhdG1hbl9wYWNrZXQtPnR0X2NyYyk7CiAKIAkvKiBzd2l0Y2ggb2YgcHJpbWFyaWVzIGZpcnN0IGhvcCBmbGFnIHdoZW4gZm9yd2FyZGluZyAqLwogCWJhdG1hbl9wYWNrZXQtPmZsYWdzICY9IH5QUklNQVJJRVNfRklSU1RfSE9QOwpAQCAtMzY5LDcgKzQyMiw3IEBACiAJc2VuZF90aW1lID0gZm9yd2FyZF9zZW5kX3RpbWUoKTsKIAlhZGRfYmF0X3BhY2tldF90b19saXN0KGJhdF9wcml2LAogCQkJICAgICAgICh1bnNpZ25lZCBjaGFyICopYmF0bWFuX3BhY2tldCwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJhdG1hbl9wYWNrZXQpICsgdHRfYnVmZl9sZW4sCisJCQkgICAgICAgc2l6ZW9mKCpiYXRtYW5fcGFja2V0KSArIHR0X2xlbih0dF9udW1fY2hhbmdlcyksCiAJCQkgICAgICAgaWZfaW5jb21pbmcsIDAsIHNlbmRfdGltZSk7CiB9CiAKQEAgLTQwOCwxMSArNDYxLDEzIEBACiAgKgogICogVGhlIHNrYiBpcyBub3QgY29uc3VtZWQsIHNvIHRoZSBjYWxsZXIgc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZQogICogc2tiIGlzIGZyZWVkLiAqLwotaW50IGFkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IGFkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBsb25nIGRlbGF5KQogewogCXN0cnVjdCBoYXJkX2lmYWNlICpwcmltYXJ5X2lmID0gTlVMTDsKIAlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0OwogCXN0cnVjdCBiY2FzdF9wYWNrZXQgKmJjYXN0X3BhY2tldDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOwogCiAJaWYgKCFhdG9taWNfZGVjX25vdF96ZXJvKCZiYXRfcHJpdi0+YmNhc3RfcXVldWVfbGVmdCkpIHsKIAkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwgImJjYXN0IHBhY2tldCBxdWV1ZSBmdWxsXG4iKTsKQEAgLTQyMywyOCArNDc4LDI4IEBACiAJaWYgKCFwcmltYXJ5X2lmKQogCQlnb3RvIG91dF9hbmRfaW5jOwogCi0JZm9yd19wYWNrZXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZm9yd19wYWNrZXQpLCBHRlBfQVRPTUlDKTsKKwlmb3J3X3BhY2tldCA9IGttYWxsb2Moc2l6ZW9mKCpmb3J3X3BhY2tldCksIEdGUF9BVE9NSUMpOwogCiAJaWYgKCFmb3J3X3BhY2tldCkKIAkJZ290byBvdXRfYW5kX2luYzsKIAotCXNrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFza2IpCisJbmV3c2tiID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5ld3NrYikKIAkJZ290byBwYWNrZXRfZnJlZTsKIAogCS8qIGFzIHdlIGhhdmUgYSBjb3B5IG5vdywgaXQgaXMgc2FmZSB0byBkZWNyZWFzZSB0aGUgVFRMICovCi0JYmNhc3RfcGFja2V0ID0gKHN0cnVjdCBiY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7CisJYmNhc3RfcGFja2V0ID0gKHN0cnVjdCBiY2FzdF9wYWNrZXQgKiluZXdza2ItPmRhdGE7CiAJYmNhc3RfcGFja2V0LT50dGwtLTsKIAotCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIobmV3c2tiKTsKIAotCWZvcndfcGFja2V0LT5za2IgPSBza2I7CisJZm9yd19wYWNrZXQtPnNrYiA9IG5ld3NrYjsKIAlmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgPSBwcmltYXJ5X2lmOwogCiAJLyogaG93IG9mdGVuIGRpZCB3ZSBzZW5kIHRoZSBiY2FzdCBwYWNrZXQgPyAqLwogCWZvcndfcGFja2V0LT5udW1fcGFja2V0cyA9IDA7CiAKLQlfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KGJhdF9wcml2LCBmb3J3X3BhY2tldCwgMSk7CisJX2FkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChiYXRfcHJpdiwgZm9yd19wYWNrZXQsIGRlbGF5KTsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogCiBwYWNrZXRfZnJlZToKQEAgLTUzNyw3ICs1OTIsNyBAQAogfQogCiB2b2lkIHB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSkKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSkKIHsKIAlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0OwogCXN0cnVjdCBobGlzdF9ub2RlICp0bXBfbm9kZSwgKnNhZmVfdG1wX25vZGU7CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9zZW5kLmggYi9uZXQvYmF0bWFuLWFkdi9zZW5kLmgKaW5kZXggMjQ3MTcyZC4uMWYyZDFlOCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvc2VuZC5oCisrKyBiL25ldC9iYXRtYW4tYWR2L3NlbmQuaApAQCAtMjIsMTggKzIyLDE4IEBACiAjaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9TRU5EX0hfCiAjZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9TRU5EX0hfCiAKLWludCBzZW5kX3NrYl9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSwKLQkJCQl1aW50OF90ICpkc3RfYWRkcik7CitpbnQgc2VuZF9za2JfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlLAorCQkgICAgY29uc3QgdWludDhfdCAqZHN0X2FkZHIpOwogdm9pZCBzY2hlZHVsZV9vd25fcGFja2V0KHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlKTsKIHZvaWQgc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJICAgICBzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBldGhoZHIgKmV0aGhkciwKIAkJCSAgICAgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCi0JCQkgICAgIHVpbnQ4X3QgZGlyZWN0bGluaywgaW50IHR0X2J1ZmZfbGVuLAorCQkJICAgICBpbnQgZGlyZWN0bGluaywKIAkJCSAgICAgc3RydWN0IGhhcmRfaWZhY2UgKmlmX291dGdvaW5nKTsKLWludCBhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3Qoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGxvbmcgZGVsYXkpOwogdm9pZCBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgICAgIHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlKTsKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSk7CiAKICNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfU0VORF9IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYyBiL25ldC9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMKaW5kZXggZDVhYTYwOS4uM2UyZjkxZiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYworKysgYi9uZXQvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiZ2F0ZXdheV9jb21tb24uaCIKICNpbmNsdWRlICJnYXRld2F5X2NsaWVudC5oIgogI2luY2x1ZGUgImJhdF9zeXNmcy5oIgorI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CkBAIC0xMjMsOCArMTI0LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jc29mdGlmX25laWdoX3ZpZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2Z0aWZfbmVpZ2hfdmlkKSwKLQkJCQkgICBHRlBfQVRPTUlDKTsKKwlzb2Z0aWZfbmVpZ2hfdmlkID0ga3phbGxvYyhzaXplb2YoKnNvZnRpZl9uZWlnaF92aWQpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNvZnRpZl9uZWlnaF92aWQpCiAJCWdvdG8gb3V0OwogCkBAIC0xNDYsNyArMTQ2LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzb2Z0aWZfbmVpZ2ggKnNvZnRpZl9uZWlnaF9nZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkJICAgICB1aW50OF90ICphZGRyLCBzaG9ydCB2aWQpCisJCQkJCSAgICAgY29uc3QgdWludDhfdCAqYWRkciwgc2hvcnQgdmlkKQogewogCXN0cnVjdCBzb2Z0aWZfbmVpZ2hfdmlkICpzb2Z0aWZfbmVpZ2hfdmlkOwogCXN0cnVjdCBzb2Z0aWZfbmVpZ2ggKnNvZnRpZl9uZWlnaCA9IE5VTEw7CkBAIC0xNzAsNyArMTcwLDcgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCi0Jc29mdGlmX25laWdoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNvZnRpZl9uZWlnaCksIEdGUF9BVE9NSUMpOworCXNvZnRpZl9uZWlnaCA9IGt6YWxsb2Moc2l6ZW9mKCpzb2Z0aWZfbmVpZ2gpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNvZnRpZl9uZWlnaCkKIAkJZ290byB1bmxvY2s7CiAKQEAgLTI0Miw3ICsyNDIsOCBAQAogCWlmIChuZXdfbmVpZ2ggJiYgIWF0b21pY19pbmNfbm90X3plcm8oJm5ld19uZWlnaC0+cmVmY291bnQpKQogCQluZXdfbmVpZ2ggPSBOVUxMOwogCi0JY3Vycl9uZWlnaCA9IHNvZnRpZl9uZWlnaF92aWQtPnNvZnRpZl9uZWlnaDsKKwljdXJyX25laWdoID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzb2Z0aWZfbmVpZ2hfdmlkLT5zb2Z0aWZfbmVpZ2gsCisJCQkJCSAgICAgICAxKTsKIAlyY3VfYXNzaWduX3BvaW50ZXIoc29mdGlmX25laWdoX3ZpZC0+c29mdGlmX25laWdoLCBuZXdfbmVpZ2gpOwogCiAJaWYgKChjdXJyX25laWdoKSAmJiAoIW5ld19uZWlnaCkpCkBAIC0zODAsNyArMzgxLDcgQEAKIAlzdHJ1Y3Qgc29mdGlmX25laWdoICpzb2Z0aWZfbmVpZ2gsICpjdXJyX3NvZnRpZl9uZWlnaDsKIAlzdHJ1Y3Qgc29mdGlmX25laWdoX3ZpZCAqc29mdGlmX25laWdoX3ZpZDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5vZGVfdG1wLCAqbm9kZV90bXAyOwotCWNoYXIgZG9fZGVzZWxlY3Q7CisJaW50IGRvX2Rlc2VsZWN0OwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzb2Z0aWZfbmVpZ2hfdmlkLCBub2RlLApAQCAtNTM0LDcgKzUzNSw3IEBACiAJLyogb25seSBtb2RpZnkgdHJhbnN0YWJsZSBpZiBpdCBoYXMgYmVlbiBpbml0aWFsaXNlZCBiZWZvcmUgKi8KIAlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5tZXNoX3N0YXRlKSA9PSBNRVNIX0FDVElWRSkgewogCQl0dF9sb2NhbF9yZW1vdmUoYmF0X3ByaXYsIGRldi0+ZGV2X2FkZHIsCi0JCQkJICJtYWMgYWRkcmVzcyBjaGFuZ2VkIik7CisJCQkJIm1hYyBhZGRyZXNzIGNoYW5nZWQiLCBmYWxzZSk7CiAJCXR0X2xvY2FsX2FkZChkZXYsIGFkZHItPnNhX2RhdGEpOwogCX0KIApAQCAtNTUzLDcgKzU1NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpbnRlcmZhY2VfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpCitzdGF0aWMgaW50IGludGVyZmFjZV90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSkKIHsKIAlzdHJ1Y3QgZXRoaGRyICpldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKIAlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7CkBAIC01NjEsNiArNTYyLDcgQEAKIAlzdHJ1Y3QgYmNhc3RfcGFja2V0ICpiY2FzdF9wYWNrZXQ7CiAJc3RydWN0IHZsYW5fZXRoaGRyICp2aGRyOwogCXN0cnVjdCBzb2Z0aWZfbmVpZ2ggKmN1cnJfc29mdGlmX25laWdoID0gTlVMTDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUgPSBOVUxMOwogCWludCBkYXRhX2xlbiA9IHNrYi0+bGVuLCByZXQ7CiAJc2hvcnQgdmlkID0gLTE7CiAJYm9vbCBkb19iY2FzdCA9IGZhbHNlOwpAQCAtNTkyLDExICs1OTQsMTMgQEAKIAlpZiAoY3Vycl9zb2Z0aWZfbmVpZ2gpCiAJCWdvdG8gZHJvcHBlZDsKIAotCS8qIFRPRE86IGNoZWNrIHRoaXMgZm9yIGxvY2tzICovCisJLyogUmVnaXN0ZXIgdGhlIGNsaWVudCBNQUMgaW4gdGhlIHRyYW5zdGFibGUgKi8KIAl0dF9sb2NhbF9hZGQoc29mdF9pZmFjZSwgZXRoaGRyLT5oX3NvdXJjZSk7CiAKLQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZXRoaGRyLT5oX2Rlc3QpKSB7Ci0JCXJldCA9IGd3X2lzX3RhcmdldChiYXRfcHJpdiwgc2tiKTsKKwlvcmlnX25vZGUgPSB0cmFuc3RhYmxlX3NlYXJjaChiYXRfcHJpdiwgZXRoaGRyLT5oX2Rlc3QpOworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihldGhoZHItPmhfZGVzdCkgfHwKKwkJCQkob3JpZ19ub2RlICYmIG9yaWdfbm9kZS0+Z3dfZmxhZ3MpKSB7CisJCXJldCA9IGd3X2lzX3RhcmdldChiYXRfcHJpdiwgc2tiLCBvcmlnX25vZGUpOwogCiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBkcm9wcGVkOwpAQCAtNjExLDcgKzYxNSw3IEBACiAJCWlmICghcHJpbWFyeV9pZikKIAkJCWdvdG8gZHJvcHBlZDsKIAotCQlpZiAobXlfc2tiX2hlYWRfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSkgPCAwKQorCQlpZiAobXlfc2tiX2hlYWRfcHVzaChza2IsIHNpemVvZigqYmNhc3RfcGFja2V0KSkgPCAwKQogCQkJZ290byBkcm9wcGVkOwogCiAJCWJjYXN0X3BhY2tldCA9IChzdHJ1Y3QgYmNhc3RfcGFja2V0ICopc2tiLT5kYXRhOwpAQCAtNjMwLDcgKzYzNCw3IEBACiAJCWJjYXN0X3BhY2tldC0+c2Vxbm8gPQogCQkJaHRvbmwoYXRvbWljX2luY19yZXR1cm4oJmJhdF9wcml2LT5iY2FzdF9zZXFubykpOwogCi0JCWFkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChiYXRfcHJpdiwgc2tiKTsKKwkJYWRkX2JjYXN0X3BhY2tldF90b19saXN0KGJhdF9wcml2LCBza2IsIDEpOwogCiAJCS8qIGEgY29weSBpcyBzdG9yZWQgaW4gdGhlIGJjYXN0IGxpc3QsIHRoZXJlZm9yZSByZW1vdmluZwogCQkgKiB0aGUgb3JpZ2luYWwgc2tiLiAqLwpAQCAtNjU2LDYgKzY2MCw4IEBACiAJCXNvZnRpZl9uZWlnaF9mcmVlX3JlZihjdXJyX3NvZnRpZl9uZWlnaCk7CiAJaWYgKHByaW1hcnlfaWYpCiAJCWhhcmRpZl9mcmVlX3JlZihwcmltYXJ5X2lmKTsKKwlpZiAob3JpZ19ub2RlKQorCQlvcmlnX25vZGVfZnJlZV9yZWYob3JpZ19ub2RlKTsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCkBAIC03NDQsNyArNzUwLDYgQEAKIAlyZXR1cm47CiB9CiAKLSNpZmRlZiBIQVZFX05FVF9ERVZJQ0VfT1BTCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGJhdF9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbiA9IGludGVyZmFjZV9vcGVuLAogCS5uZG9fc3RvcCA9IGludGVyZmFjZV9yZWxlYXNlLApAQCAtNzU0LDcgKzc1OSw2IEBACiAJLm5kb19zdGFydF94bWl0ID0gaW50ZXJmYWNlX3R4LAogCS5uZG9fdmFsaWRhdGVfYWRkciA9IGV0aF92YWxpZGF0ZV9hZGRyCiB9OwotI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGludGVyZmFjZV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtNzYzLDE2ICs3NjcsNyBAQAogCiAJZXRoZXJfc2V0dXAoZGV2KTsKIAotI2lmZGVmIEhBVkVfTkVUX0RFVklDRV9PUFMKIAlkZXYtPm5ldGRldl9vcHMgPSAmYmF0X25ldGRldl9vcHM7Ci0jZWxzZQotCWRldi0+b3BlbiA9IGludGVyZmFjZV9vcGVuOwotCWRldi0+c3RvcCA9IGludGVyZmFjZV9yZWxlYXNlOwotCWRldi0+Z2V0X3N0YXRzID0gaW50ZXJmYWNlX3N0YXRzOwotCWRldi0+c2V0X21hY19hZGRyZXNzID0gaW50ZXJmYWNlX3NldF9tYWNfYWRkcjsKLQlkZXYtPmNoYW5nZV9tdHUgPSBpbnRlcmZhY2VfY2hhbmdlX210dTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGludGVyZmFjZV90eDsKLSNlbmRpZgogCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OwogCWRldi0+dHhfcXVldWVfbGVuID0gMDsKIApAQCAtNzkwLDE3ICs3ODUsMTYgQEAKIAogCVNFVF9FVEhUT09MX09QUyhkZXYsICZiYXRfZXRodG9vbF9vcHMpOwogCi0JbWVtc2V0KHByaXYsIDAsIHNpemVvZihzdHJ1Y3QgYmF0X3ByaXYpKTsKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CiB9CiAKLXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0aWZfY3JlYXRlKGNoYXIgKm5hbWUpCitzdHJ1Y3QgbmV0X2RldmljZSAqc29mdGlmX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOwogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7CiAJaW50IHJldDsKIAotCXNvZnRfaWZhY2UgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBiYXRfcHJpdikgLCBuYW1lLAotCQkJCSAgIGludGVyZmFjZV9zZXR1cCk7CisJc29mdF9pZmFjZSA9IGFsbG9jX25ldGRldihzaXplb2YoKmJhdF9wcml2KSwgbmFtZSwgaW50ZXJmYWNlX3NldHVwKTsKIAogCWlmICghc29mdF9pZmFjZSkgewogCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSB0aGUgYmF0bWFuIGludGVyZmFjZTogJXNcbiIsIG5hbWUpOwpAQCAtODMxLDcgKzgyNSwxMyBAQAogCiAJYXRvbWljX3NldCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUsIE1FU0hfSU5BQ1RJVkUpOwogCWF0b21pY19zZXQoJmJhdF9wcml2LT5iY2FzdF9zZXFubywgMSk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPnR0X2xvY2FsX2NoYW5nZWQsIDApOworCWF0b21pY19zZXQoJmJhdF9wcml2LT50dHZuLCAwKTsKKwlhdG9taWNfc2V0KCZiYXRfcHJpdi0+dHRfbG9jYWxfY2hhbmdlcywgMCk7CisJYXRvbWljX3NldCgmYmF0X3ByaXYtPnR0X29nbV9hcHBlbmRfY250LCAwKTsKKworCWJhdF9wcml2LT50dF9idWZmID0gTlVMTDsKKwliYXRfcHJpdi0+dHRfYnVmZl9sZW4gPSAwOworCWJhdF9wcml2LT50dF9wb3NzX2NoYW5nZSA9IGZhbHNlOwogCiAJYmF0X3ByaXYtPnByaW1hcnlfaWYgPSBOVUxMOwogCWJhdF9wcml2LT5udW1faWZhY2VzID0gMDsKQEAgLTg3MiwxNSArODcyLDEwIEBACiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Uoc29mdF9pZmFjZSk7CiB9CiAKLWludCBzb2Z0aWZfaXNfdmFsaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCitpbnQgc29mdGlmX2lzX3ZhbGlkKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQogewotI2lmZGVmIEhBVkVfTkVUX0RFVklDRV9PUFMKIAlpZiAobmV0X2Rldi0+bmV0ZGV2X29wcy0+bmRvX3N0YXJ0X3htaXQgPT0gaW50ZXJmYWNlX3R4KQogCQlyZXR1cm4gMTsKLSNlbHNlCi0JaWYgKG5ldF9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9PSBpbnRlcmZhY2VfdHgpCi0JCXJldHVybiAxOwotI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkyNCw0ICs5MTksMyBAQAogewogCXJldHVybiAxOwogfQotCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5oIGIvbmV0L2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuaAppbmRleCA0Nzg5YjZmLi4wMDE1NDZmIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5oCisrKyBiL25ldC9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmgKQEAgLTI1LDEyICsyNSwxMSBAQAogaW50IG15X3NrYl9oZWFkX3B1c2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbik7CiBpbnQgc29mdGlmX25laWdoX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwogdm9pZCBzb2Z0aWZfbmVpZ2hfcHVyZ2Uoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci1pbnQgaW50ZXJmYWNlX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKTsKIHZvaWQgaW50ZXJmYWNlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlLAogCQkgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBoYXJkX2lmYWNlICpyZWN2X2lmLAogCQkgIGludCBoZHJfc2l6ZSk7Ci1zdHJ1Y3QgbmV0X2RldmljZSAqc29mdGlmX2NyZWF0ZShjaGFyICpuYW1lKTsKK3N0cnVjdCBuZXRfZGV2aWNlICpzb2Z0aWZfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpOwogdm9pZCBzb2Z0aWZfZGVzdHJveShzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSk7Ci1pbnQgc29mdGlmX2lzX3ZhbGlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK2ludCBzb2Z0aWZfaXNfdmFsaWQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwogCiAjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1NPRlRfSU5URVJGQUNFX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jIGIvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYwppbmRleCA3YjcyOTY2Li5mYjY5MzFkIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jCisrKyBiL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKQEAgLTIzLDM4ICsyMyw0NSBAQAogI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCiAjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgorI2luY2x1ZGUgInNlbmQuaCIKICNpbmNsdWRlICJoYXNoLmgiCiAjaW5jbHVkZSAib3JpZ2luYXRvci5oIgorI2luY2x1ZGUgInJvdXRpbmcuaCIKIAotc3RhdGljIHZvaWQgdHRfbG9jYWxfcHVyZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXN0YXRpYyB2b2lkIF90dF9nbG9iYWxfZGVsX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgc3RydWN0IHR0X2dsb2JhbF9lbnRyeSAqdHRfZ2xvYmFsX2VudHJ5LAotCQkJCSBjaGFyICptZXNzYWdlKTsKKyNpbmNsdWRlIDxsaW51eC9jcmMxNi5oPgorCitzdGF0aWMgdm9pZCBfdHRfZ2xvYmFsX2RlbChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJICAgc3RydWN0IHR0X2dsb2JhbF9lbnRyeSAqdHRfZ2xvYmFsX2VudHJ5LAorCQkJICAgY29uc3QgY2hhciAqbWVzc2FnZSk7CitzdGF0aWMgdm9pZCB0dF9wdXJnZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAvKiByZXR1cm5zIDEgaWYgdGhleSBhcmUgdGhlIHNhbWUgbWFjIGFkZHIgKi8KLXN0YXRpYyBpbnQgY29tcGFyZV9sdHQoc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsIHZvaWQgKmRhdGEyKQorc3RhdGljIGludCBjb21wYXJlX2x0dChjb25zdCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgY29uc3Qgdm9pZCAqZGF0YTIpCiB7Ci0Jdm9pZCAqZGF0YTEgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IHR0X2xvY2FsX2VudHJ5LCBoYXNoX2VudHJ5KTsKKwljb25zdCB2b2lkICpkYXRhMSA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgdHRfbG9jYWxfZW50cnksCisJCQkJCSBoYXNoX2VudHJ5KTsKIAogCXJldHVybiAobWVtY21wKGRhdGExLCBkYXRhMiwgRVRIX0FMRU4pID09IDAgPyAxIDogMCk7CiB9CiAKIC8qIHJldHVybnMgMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBtYWMgYWRkciAqLwotc3RhdGljIGludCBjb21wYXJlX2d0dChzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgdm9pZCAqZGF0YTIpCitzdGF0aWMgaW50IGNvbXBhcmVfZ3R0KGNvbnN0IHN0cnVjdCBobGlzdF9ub2RlICpub2RlLCBjb25zdCB2b2lkICpkYXRhMikKIHsKLQl2b2lkICpkYXRhMSA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5LCBoYXNoX2VudHJ5KTsKKwljb25zdCB2b2lkICpkYXRhMSA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5LAorCQkJCQkgaGFzaF9lbnRyeSk7CiAKIAlyZXR1cm4gKG1lbWNtcChkYXRhMSwgZGF0YTIsIEVUSF9BTEVOKSA9PSAwID8gMSA6IDApOwogfQogCi1zdGF0aWMgdm9pZCB0dF9sb2NhbF9zdGFydF90aW1lcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQorc3RhdGljIHZvaWQgdHRfc3RhcnRfdGltZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKIHsKLQlJTklUX0RFTEFZRURfV09SSygmYmF0X3ByaXYtPnR0X3dvcmssIHR0X2xvY2FsX3B1cmdlKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwgJmJhdF9wcml2LT50dF93b3JrLCAxMCAqIEhaKTsKKwlJTklUX0RFTEFZRURfV09SSygmYmF0X3ByaXYtPnR0X3dvcmssIHR0X3B1cmdlKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwgJmJhdF9wcml2LT50dF93b3JrLAorCQkJICAgbXNlY3NfdG9famlmZmllcyg1MDAwKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdHRfbG9jYWxfZW50cnkgKnR0X2xvY2FsX2hhc2hfZmluZChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCQkJICAgdm9pZCAqZGF0YSkKKwkJCQkJCSBjb25zdCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCA9IGJhdF9wcml2LT50dF9sb2NhbF9oYXNoOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwpAQCAtNzMsNiArODAsOSBAQAogCQlpZiAoIWNvbXBhcmVfZXRoKHR0X2xvY2FsX2VudHJ5LCBkYXRhKSkKIAkJCWNvbnRpbnVlOwogCisJCWlmICghYXRvbWljX2luY19ub3RfemVybygmdHRfbG9jYWxfZW50cnktPnJlZmNvdW50KSkKKwkJCWNvbnRpbnVlOworCiAJCXR0X2xvY2FsX2VudHJ5X3RtcCA9IHR0X2xvY2FsX2VudHJ5OwogCQlicmVhazsKIAl9CkBAIC04Miw3ICs5Miw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5ICp0dF9nbG9iYWxfaGFzaF9maW5kKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJCQkgICAgIHZvaWQgKmRhdGEpCisJCQkJCQkgICBjb25zdCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCA9IGJhdF9wcml2LT50dF9nbG9iYWxfaGFzaDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKQEAgLTEwMiw2ICsxMTIsOSBAQAogCQlpZiAoIWNvbXBhcmVfZXRoKHR0X2dsb2JhbF9lbnRyeSwgZGF0YSkpCiAJCQljb250aW51ZTsKIAorCQlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJnR0X2dsb2JhbF9lbnRyeS0+cmVmY291bnQpKQorCQkJY29udGludWU7CisKIAkJdHRfZ2xvYmFsX2VudHJ5X3RtcCA9IHR0X2dsb2JhbF9lbnRyeTsKIAkJYnJlYWs7CiAJfQpAQCAtMTEwLDcgKzEyMyw1NCBAQAogCXJldHVybiB0dF9nbG9iYWxfZW50cnlfdG1wOwogfQogCi1pbnQgdHRfbG9jYWxfaW5pdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQorc3RhdGljIGJvb2wgaXNfb3V0X29mX3RpbWUodW5zaWduZWQgbG9uZyBzdGFydGluZ190aW1lLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJdW5zaWduZWQgbG9uZyBkZWFkbGluZTsKKwlkZWFkbGluZSA9IHN0YXJ0aW5nX3RpbWUgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpOworCisJcmV0dXJuIHRpbWVfYWZ0ZXIoamlmZmllcywgZGVhZGxpbmUpOworfQorCitzdGF0aWMgdm9pZCB0dF9sb2NhbF9lbnRyeV9mcmVlX3JlZihzdHJ1Y3QgdHRfbG9jYWxfZW50cnkgKnR0X2xvY2FsX2VudHJ5KQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ0dF9sb2NhbF9lbnRyeS0+cmVmY291bnQpKQorCQlrZnJlZV9yY3UodHRfbG9jYWxfZW50cnksIHJjdSk7Cit9CisKK3N0YXRpYyB2b2lkIHR0X2dsb2JhbF9lbnRyeV9mcmVlX3JlZihzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5ICp0dF9nbG9iYWxfZW50cnkpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnR0X2dsb2JhbF9lbnRyeS0+cmVmY291bnQpKQorCQlrZnJlZV9yY3UodHRfZ2xvYmFsX2VudHJ5LCByY3UpOworfQorCitzdGF0aWMgdm9pZCB0dF9sb2NhbF9ldmVudChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBjb25zdCB1aW50OF90ICphZGRyLAorCQkJICAgdWludDhfdCBmbGFncykKK3sKKwlzdHJ1Y3QgdHRfY2hhbmdlX25vZGUgKnR0X2NoYW5nZV9ub2RlOworCisJdHRfY2hhbmdlX25vZGUgPSBrbWFsbG9jKHNpemVvZigqdHRfY2hhbmdlX25vZGUpLCBHRlBfQVRPTUlDKTsKKworCWlmICghdHRfY2hhbmdlX25vZGUpCisJCXJldHVybjsKKworCXR0X2NoYW5nZV9ub2RlLT5jaGFuZ2UuZmxhZ3MgPSBmbGFnczsKKwltZW1jcHkodHRfY2hhbmdlX25vZGUtPmNoYW5nZS5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CisKKwlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dF9jaGFuZ2VzX2xpc3RfbG9jayk7CisJLyogdHJhY2sgdGhlIGNoYW5nZSBpbiB0aGUgT0dNaW50ZXJ2YWwgbGlzdCAqLworCWxpc3RfYWRkX3RhaWwoJnR0X2NoYW5nZV9ub2RlLT5saXN0LCAmYmF0X3ByaXYtPnR0X2NoYW5nZXNfbGlzdCk7CisJYXRvbWljX2luYygmYmF0X3ByaXYtPnR0X2xvY2FsX2NoYW5nZXMpOworCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfY2hhbmdlc19saXN0X2xvY2spOworCisJYXRvbWljX3NldCgmYmF0X3ByaXYtPnR0X29nbV9hcHBlbmRfY250LCAwKTsKK30KKworaW50IHR0X2xlbihpbnQgY2hhbmdlc19udW0pCit7CisJcmV0dXJuIGNoYW5nZXNfbnVtICogc2l6ZW9mKHN0cnVjdCB0dF9jaGFuZ2UpOworfQorCitzdGF0aWMgaW50IHR0X2xvY2FsX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKIHsKIAlpZiAoYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2gpCiAJCXJldHVybiAxOwpAQCAtMTIwLDExNiArMTgwLDExNCBAQAogCWlmICghYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2gpCiAJCXJldHVybiAwOwogCi0JYXRvbWljX3NldCgmYmF0X3ByaXYtPnR0X2xvY2FsX2NoYW5nZWQsIDApOwotCXR0X2xvY2FsX3N0YXJ0X3RpbWVyKGJhdF9wcml2KTsKLQogCXJldHVybiAxOwogfQogCi12b2lkIHR0X2xvY2FsX2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSwgdWludDhfdCAqYWRkcikKK3ZvaWQgdHRfbG9jYWxfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlLCBjb25zdCB1aW50OF90ICphZGRyKQogewogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgdHRfbG9jYWxfZW50cnkgKnR0X2xvY2FsX2VudHJ5OwotCXN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeTsKLQlpbnQgcmVxdWlyZWRfYnl0ZXM7CisJc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeSA9IE5VTEw7CisJc3RydWN0IHR0X2dsb2JhbF9lbnRyeSAqdHRfZ2xvYmFsX2VudHJ5ID0gTlVMTDsKIAotCXNwaW5fbG9ja19iaCgmYmF0X3ByaXYtPnR0X2xoYXNoX2xvY2spOwogCXR0X2xvY2FsX2VudHJ5ID0gdHRfbG9jYWxfaGFzaF9maW5kKGJhdF9wcml2LCBhZGRyKTsKLQlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0X2xoYXNoX2xvY2spOwogCiAJaWYgKHR0X2xvY2FsX2VudHJ5KSB7CiAJCXR0X2xvY2FsX2VudHJ5LT5sYXN0X3NlZW4gPSBqaWZmaWVzOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAotCS8qIG9ubHkgYW5ub3VuY2UgYXMgbWFueSBob3N0cyBhcyBwb3NzaWJsZSBpbiB0aGUgYmF0bWFuLXBhY2tldCBhbmQKLQkgICBzcGFjZSBpbiBiYXRtYW5fcGFja2V0LT5udW1fdHQgVGhhdCBhbHNvIHNob3VsZCBnaXZlIGEgbGltaXQgdG8KLQkgICBNQUMtZmxvb2RpbmcuICovCi0JcmVxdWlyZWRfYnl0ZXMgPSAoYmF0X3ByaXYtPm51bV9sb2NhbF90dCArIDEpICogRVRIX0FMRU47Ci0JcmVxdWlyZWRfYnl0ZXMgKz0gQkFUX1BBQ0tFVF9MRU47Ci0KLQlpZiAoKHJlcXVpcmVkX2J5dGVzID4gRVRIX0RBVEFfTEVOKSB8fAotCSAgICAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5hZ2dyZWdhdGVkX29nbXMpICYmCi0JICAgICByZXF1aXJlZF9ieXRlcyA+IE1BWF9BR0dSRUdBVElPTl9CWVRFUykgfHwKLQkgICAgKGJhdF9wcml2LT5udW1fbG9jYWxfdHQgKyAxID4gMjU1KSkgewotCQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LAotCQkJIkNhbid0IGFkZCBuZXcgbG9jYWwgdHQgZW50cnkgKCVwTSk6ICIKLQkJCSJudW1iZXIgb2YgbG9jYWwgdHQgZW50cmllcyBleGNlZWRzIHBhY2tldCBzaXplXG4iLAotCQkJYWRkcik7Ci0JCXJldHVybjsKLQl9Ci0KLQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LAotCQkiQ3JlYXRpbmcgbmV3IGxvY2FsIHR0IGVudHJ5OiAlcE1cbiIsIGFkZHIpOwotCi0JdHRfbG9jYWxfZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHRfbG9jYWxfZW50cnkpLCBHRlBfQVRPTUlDKTsKKwl0dF9sb2NhbF9lbnRyeSA9IGttYWxsb2Moc2l6ZW9mKCp0dF9sb2NhbF9lbnRyeSksIEdGUF9BVE9NSUMpOwogCWlmICghdHRfbG9jYWxfZW50cnkpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CisKKwliYXRfZGJnKERCR19UVCwgYmF0X3ByaXYsCisJCSJDcmVhdGluZyBuZXcgbG9jYWwgdHQgZW50cnk6ICVwTSAodHR2bjogJWQpXG4iLCBhZGRyLAorCQkodWludDhfdClhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnR0dm4pKTsKIAogCW1lbWNweSh0dF9sb2NhbF9lbnRyeS0+YWRkciwgYWRkciwgRVRIX0FMRU4pOwogCXR0X2xvY2FsX2VudHJ5LT5sYXN0X3NlZW4gPSBqaWZmaWVzOworCXR0X2xvY2FsX2VudHJ5LT5mbGFncyA9IE5PX0ZMQUdTOworCWF0b21pY19zZXQoJnR0X2xvY2FsX2VudHJ5LT5yZWZjb3VudCwgMik7CiAKIAkvKiB0aGUgYmF0bWFuIGludGVyZmFjZSBtYWMgYWRkcmVzcyBzaG91bGQgbmV2ZXIgYmUgcHVyZ2VkICovCiAJaWYgKGNvbXBhcmVfZXRoKGFkZHIsIHNvZnRfaWZhY2UtPmRldl9hZGRyKSkKLQkJdHRfbG9jYWxfZW50cnktPm5ldmVyX3B1cmdlID0gMTsKLQllbHNlCi0JCXR0X2xvY2FsX2VudHJ5LT5uZXZlcl9wdXJnZSA9IDA7CisJCXR0X2xvY2FsX2VudHJ5LT5mbGFncyB8PSBUVF9DTElFTlRfTk9QVVJHRTsKIAotCXNwaW5fbG9ja19iaCgmYmF0X3ByaXYtPnR0X2xoYXNoX2xvY2spOworCXR0X2xvY2FsX2V2ZW50KGJhdF9wcml2LCBhZGRyLCB0dF9sb2NhbF9lbnRyeS0+ZmxhZ3MpOworCisJLyogVGhlIGxvY2FsIGVudHJ5IGhhcyB0byBiZSBtYXJrZWQgYXMgTkVXIHRvIGF2b2lkIHRvIHNlbmQgaXQgaW4KKwkgKiBhIGZ1bGwgdGFibGUgcmVzcG9uc2UgZ29pbmcgb3V0IGJlZm9yZSB0aGUgbmV4dCB0dHZuIGluY3JlbWVudAorCSAqIChjb25zaXN0ZW5jeSBjaGVjaykgKi8KKwl0dF9sb2NhbF9lbnRyeS0+ZmxhZ3MgfD0gVFRfQ0xJRU5UX05FVzsKIAogCWhhc2hfYWRkKGJhdF9wcml2LT50dF9sb2NhbF9oYXNoLCBjb21wYXJlX2x0dCwgY2hvb3NlX29yaWcsCiAJCSB0dF9sb2NhbF9lbnRyeSwgJnR0X2xvY2FsX2VudHJ5LT5oYXNoX2VudHJ5KTsKLQliYXRfcHJpdi0+bnVtX2xvY2FsX3R0Kys7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPnR0X2xvY2FsX2NoYW5nZWQsIDEpOwotCi0Jc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dF9saGFzaF9sb2NrKTsKIAogCS8qIHJlbW92ZSBhZGRyZXNzIGZyb20gZ2xvYmFsIGhhc2ggaWYgcHJlc2VudCAqLwotCXNwaW5fbG9ja19iaCgmYmF0X3ByaXYtPnR0X2doYXNoX2xvY2spOwotCiAJdHRfZ2xvYmFsX2VudHJ5ID0gdHRfZ2xvYmFsX2hhc2hfZmluZChiYXRfcHJpdiwgYWRkcik7CiAKKwkvKiBDaGVjayB3aGV0aGVyIGl0IGlzIGEgcm9hbWluZyEgKi8KKwlpZiAodHRfZ2xvYmFsX2VudHJ5KSB7CisJCS8qIFRoaXMgbm9kZSBpcyBwcm9iYWJseSBnb2luZyB0byB1cGRhdGUgaXRzIHR0IHRhYmxlICovCisJCXR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT50dF9wb3NzX2NoYW5nZSA9IHRydWU7CisJCS8qIFRoZSBnbG9iYWwgZW50cnkgaGFzIHRvIGJlIG1hcmtlZCBhcyBQRU5ESU5HIGFuZCBoYXMgdG8gYmUKKwkJICoga2VwdCBmb3IgY29uc2lzdGVuY3kgcHVycG9zZSAqLworCQl0dF9nbG9iYWxfZW50cnktPmZsYWdzIHw9IFRUX0NMSUVOVF9QRU5ESU5HOworCQlzZW5kX3JvYW1fYWR2KGJhdF9wcml2LCB0dF9nbG9iYWxfZW50cnktPmFkZHIsCisJCQkgICAgICB0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZSk7CisJfQorb3V0OgorCWlmICh0dF9sb2NhbF9lbnRyeSkKKwkJdHRfbG9jYWxfZW50cnlfZnJlZV9yZWYodHRfbG9jYWxfZW50cnkpOwogCWlmICh0dF9nbG9iYWxfZW50cnkpCi0JCV90dF9nbG9iYWxfZGVsX29yaWcoYmF0X3ByaXYsIHR0X2dsb2JhbF9lbnRyeSwKLQkJCQkgICAgICJsb2NhbCB0dCByZWNlaXZlZCIpOwotCi0Jc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dF9naGFzaF9sb2NrKTsKKwkJdHRfZ2xvYmFsX2VudHJ5X2ZyZWVfcmVmKHR0X2dsb2JhbF9lbnRyeSk7CiB9CiAKLWludCB0dF9sb2NhbF9maWxsX2J1ZmZlcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgYnVmZl9sZW4pCitpbnQgdHRfY2hhbmdlc19maWxsX2J1ZmZlcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJICAgdW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGJ1ZmZfbGVuKQogewotCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCA9IGJhdF9wcml2LT50dF9sb2NhbF9oYXNoOwotCXN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnk7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0JaW50IGksIGNvdW50ID0gMDsKKwlpbnQgY291bnQgPSAwLCB0b3RfY2hhbmdlcyA9IDA7CisJc3RydWN0IHR0X2NoYW5nZV9ub2RlICplbnRyeSwgKnNhZmU7CiAKLQlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dF9saGFzaF9sb2NrKTsKKwlpZiAoYnVmZl9sZW4gPiAwKQorCQl0b3RfY2hhbmdlcyA9IGJ1ZmZfbGVuIC8gdHRfbGVuKDEpOwogCi0JZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgewotCQloZWFkID0gJmhhc2gtPnRhYmxlW2ldOworCXNwaW5fbG9ja19iaCgmYmF0X3ByaXYtPnR0X2NoYW5nZXNfbGlzdF9sb2NrKTsKKwlhdG9taWNfc2V0KCZiYXRfcHJpdi0+dHRfbG9jYWxfY2hhbmdlcywgMCk7CiAKLQkJcmN1X3JlYWRfbG9jaygpOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHRfbG9jYWxfZW50cnksIG5vZGUsCi0JCQkJCSBoZWFkLCBoYXNoX2VudHJ5KSB7Ci0JCQlpZiAoYnVmZl9sZW4gPCAoY291bnQgKyAxKSAqIEVUSF9BTEVOKQotCQkJCWJyZWFrOwotCi0JCQltZW1jcHkoYnVmZiArIChjb3VudCAqIEVUSF9BTEVOKSwgdHRfbG9jYWxfZW50cnktPmFkZHIsCi0JCQkgICAgICAgRVRIX0FMRU4pOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBzYWZlLCAmYmF0X3ByaXYtPnR0X2NoYW5nZXNfbGlzdCwKKwkJCWxpc3QpIHsKKwkJaWYgKGNvdW50IDwgdG90X2NoYW5nZXMpIHsKKwkJCW1lbWNweShidWZmICsgdHRfbGVuKGNvdW50KSwKKwkJCSAgICAgICAmZW50cnktPmNoYW5nZSwgc2l6ZW9mKHN0cnVjdCB0dF9jaGFuZ2UpKTsKIAkJCWNvdW50Kys7CiAJCX0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJCWtmcmVlKGVudHJ5KTsKIAl9CisJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dF9jaGFuZ2VzX2xpc3RfbG9jayk7CiAKLQkvKiBpZiB3ZSBkaWQgbm90IGdldCBhbGwgbmV3IGxvY2FsIHR0cyBzZWUgeW91IG5leHQgdGltZSAgOy0pICovCi0JaWYgKGNvdW50ID09IGJhdF9wcml2LT5udW1fbG9jYWxfdHQpCi0JCWF0b21pY19zZXQoJmJhdF9wcml2LT50dF9sb2NhbF9jaGFuZ2VkLCAwKTsKKwkvKiBLZWVwIHRoZSBidWZmZXIgZm9yIHBvc3NpYmxlIHR0X3JlcXVlc3QgKi8KKwlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dF9idWZmX2xvY2spOworCWtmcmVlKGJhdF9wcml2LT50dF9idWZmKTsKKwliYXRfcHJpdi0+dHRfYnVmZl9sZW4gPSAwOworCWJhdF9wcml2LT50dF9idWZmID0gTlVMTDsKKwkvKiBXZSBjaGVjayB3aGV0aGVyIHRoaXMgbmV3IE9HTSBoYXMgbm8gY2hhbmdlcyBkdWUgdG8gc2l6ZQorCSAqIHByb2JsZW1zICovCisJaWYgKGJ1ZmZfbGVuID4gMCkgeworCQkvKioKKwkJICogaWYga21hbGxvYygpIGZhaWxzIHdlIHdpbGwgcmVwbHkgd2l0aCB0aGUgZnVsbCB0YWJsZQorCQkgKiBpbnN0ZWFkIG9mIHByb3ZpZGluZyB0aGUgZGlmZgorCQkgKi8KKwkJYmF0X3ByaXYtPnR0X2J1ZmYgPSBrbWFsbG9jKGJ1ZmZfbGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGJhdF9wcml2LT50dF9idWZmKSB7CisJCQltZW1jcHkoYmF0X3ByaXYtPnR0X2J1ZmYsIGJ1ZmYsIGJ1ZmZfbGVuKTsKKwkJCWJhdF9wcml2LT50dF9idWZmX2xlbiA9IGJ1ZmZfbGVuOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfYnVmZl9sb2NrKTsKIAotCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfbGhhc2hfbG9jayk7Ci0JcmV0dXJuIGNvdW50OworCXJldHVybiB0b3RfY2hhbmdlczsKIH0KIAogaW50IHR0X2xvY2FsX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCkBAIC0yNjEsMTAgKzMxOSw4IEBACiAJfQogCiAJc2VxX3ByaW50ZihzZXEsICJMb2NhbGx5IHJldHJpZXZlZCBhZGRyZXNzZXMgKGZyb20gJXMpICIKLQkJICAgImFubm91bmNlZCB2aWEgVFQ6XG4iLAotCQkgICBuZXRfZGV2LT5uYW1lKTsKLQotCXNwaW5fbG9ja19iaCgmYmF0X3ByaXYtPnR0X2xoYXNoX2xvY2spOworCQkgICAiYW5ub3VuY2VkIHZpYSBUVCAoVFRWTjogJXUpOlxuIiwKKwkJICAgbmV0X2Rldi0+bmFtZSwgKHVpbnQ4X3QpYXRvbWljX3JlYWQoJmJhdF9wcml2LT50dHZuKSk7CiAKIAlidWZfc2l6ZSA9IDE7CiAJLyogRXN0aW1hdGUgbGVuZ3RoIGZvcjogIiAqIHh4Onh4Onh4Onh4Onh4Onh4XG4iICovCkBAIC0yNzksNyArMzM1LDYgQEAKIAogCWJ1ZmYgPSBrbWFsbG9jKGJ1Zl9zaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWJ1ZmYpIHsKLQkJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dF9saGFzaF9sb2NrKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjk5LDggKzM1NCw2IEBACiAJCXJjdV9yZWFkX3VubG9jaygpOwogCX0KIAotCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfbGhhc2hfbG9jayk7Ci0KIAlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYnVmZik7CiAJa2ZyZWUoYnVmZik7CiBvdXQ6CkBAIC0zMDksOTIgKzM2MiwxMDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBfdHRfbG9jYWxfZGVsKHN0cnVjdCBobGlzdF9ub2RlICpub2RlLCB2b2lkICphcmcpCitzdGF0aWMgdm9pZCB0dF9sb2NhbF9zZXRfcGVuZGluZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJCSBzdHJ1Y3QgdHRfbG9jYWxfZW50cnkgKnR0X2xvY2FsX2VudHJ5LAorCQkJCSB1aW50MTZfdCBmbGFncykKIHsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gKHN0cnVjdCBiYXRfcHJpdiAqKWFyZzsKLQl2b2lkICpkYXRhID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCB0dF9sb2NhbF9lbnRyeSwgaGFzaF9lbnRyeSk7CisJdHRfbG9jYWxfZXZlbnQoYmF0X3ByaXYsIHR0X2xvY2FsX2VudHJ5LT5hZGRyLAorCQkgICAgICAgdHRfbG9jYWxfZW50cnktPmZsYWdzIHwgZmxhZ3MpOwogCi0Ja2ZyZWUoZGF0YSk7Ci0JYmF0X3ByaXYtPm51bV9sb2NhbF90dC0tOwotCWF0b21pY19zZXQoJmJhdF9wcml2LT50dF9sb2NhbF9jaGFuZ2VkLCAxKTsKKwkvKiBUaGUgbG9jYWwgY2xpZW50IGhhcyB0byBiZSBtZXJrZWQgYXMgInBlbmRpbmcgdG8gYmUgcmVtb3ZlZCIgYnV0IGhhcworCSAqIHRvIGJlIGtlcHQgaW4gdGhlIHRhYmxlIGluIG9yZGVyIHRvIHNlbmQgaXQgaW4gYW4gZnVsbCB0YWJsZXMKKwkgKiByZXNwb25zZSBpc3N1ZWQgYmVmb3JlIHRoZSBuZXQgdHR2biBpbmNyZW1lbnQgKGNvbnNpc3RlbmN5IGNoZWNrKSAqLworCXR0X2xvY2FsX2VudHJ5LT5mbGFncyB8PSBUVF9DTElFTlRfUEVORElORzsKIH0KIAotc3RhdGljIHZvaWQgdHRfbG9jYWxfZGVsKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgIHN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnksCi0JCQkgIGNoYXIgKm1lc3NhZ2UpCit2b2lkIHR0X2xvY2FsX3JlbW92ZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBjb25zdCB1aW50OF90ICphZGRyLAorCQkgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGJvb2wgcm9hbWluZykKIHsKLQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LCAiRGVsZXRpbmcgbG9jYWwgdHQgZW50cnkgKCVwTSk6ICVzXG4iLAotCQl0dF9sb2NhbF9lbnRyeS0+YWRkciwgbWVzc2FnZSk7Ci0KLQloYXNoX3JlbW92ZShiYXRfcHJpdi0+dHRfbG9jYWxfaGFzaCwgY29tcGFyZV9sdHQsIGNob29zZV9vcmlnLAotCQkgICAgdHRfbG9jYWxfZW50cnktPmFkZHIpOwotCV90dF9sb2NhbF9kZWwoJnR0X2xvY2FsX2VudHJ5LT5oYXNoX2VudHJ5LCBiYXRfcHJpdik7Ci19Ci0KLXZvaWQgdHRfbG9jYWxfcmVtb3ZlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCSAgICAgIHVpbnQ4X3QgKmFkZHIsIGNoYXIgKm1lc3NhZ2UpCi17Ci0Jc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeTsKLQotCXNwaW5fbG9ja19iaCgmYmF0X3ByaXYtPnR0X2xoYXNoX2xvY2spOworCXN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnkgPSBOVUxMOwogCiAJdHRfbG9jYWxfZW50cnkgPSB0dF9sb2NhbF9oYXNoX2ZpbmQoYmF0X3ByaXYsIGFkZHIpOworCWlmICghdHRfbG9jYWxfZW50cnkpCisJCWdvdG8gb3V0OwogCisJdHRfbG9jYWxfc2V0X3BlbmRpbmcoYmF0X3ByaXYsIHR0X2xvY2FsX2VudHJ5LCBUVF9DTElFTlRfREVMIHwKKwkJCSAgICAgKHJvYW1pbmcgPyBUVF9DTElFTlRfUk9BTSA6IE5PX0ZMQUdTKSk7CisKKwliYXRfZGJnKERCR19UVCwgYmF0X3ByaXYsICJMb2NhbCB0dCBlbnRyeSAoJXBNKSBwZW5kaW5nIHRvIGJlIHJlbW92ZWQ6ICIKKwkJIiVzXG4iLCB0dF9sb2NhbF9lbnRyeS0+YWRkciwgbWVzc2FnZSk7CitvdXQ6CiAJaWYgKHR0X2xvY2FsX2VudHJ5KQotCQl0dF9sb2NhbF9kZWwoYmF0X3ByaXYsIHR0X2xvY2FsX2VudHJ5LCBtZXNzYWdlKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfbGhhc2hfbG9jayk7CisJCXR0X2xvY2FsX2VudHJ5X2ZyZWVfcmVmKHR0X2xvY2FsX2VudHJ5KTsKIH0KIAotc3RhdGljIHZvaWQgdHRfbG9jYWxfcHVyZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgdHRfbG9jYWxfcHVyZ2Uoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKIHsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9Ci0JCWNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBiYXRfcHJpdiwgdHRfd29yayk7CiAJc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoID0gYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2g7CiAJc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5vZGVfdG1wOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlzcGlubG9ja190ICpsaXN0X2xvY2s7IC8qIHByb3RlY3RzIHdyaXRlIGFjY2VzcyB0byB0aGUgaGFzaCBsaXN0cyAqLwogCWludCBpOwogCi0Jc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHRfbGhhc2hfbG9jayk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7CiAJCWhlYWQgPSAmaGFzaC0+dGFibGVbaV07CisJCWxpc3RfbG9jayA9ICZoYXNoLT5saXN0X2xvY2tzW2ldOwogCisJCXNwaW5fbG9ja19iaChsaXN0X2xvY2spOwogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHR0X2xvY2FsX2VudHJ5LCBub2RlLCBub2RlX3RtcCwKIAkJCQkJICBoZWFkLCBoYXNoX2VudHJ5KSB7Ci0JCQlpZiAodHRfbG9jYWxfZW50cnktPm5ldmVyX3B1cmdlKQorCQkJaWYgKHR0X2xvY2FsX2VudHJ5LT5mbGFncyAmIFRUX0NMSUVOVF9OT1BVUkdFKQogCQkJCWNvbnRpbnVlOwogCi0JCQl0aW1lb3V0ID0gdHRfbG9jYWxfZW50cnktPmxhc3Rfc2VlbjsKLQkJCXRpbWVvdXQgKz0gVFRfTE9DQUxfVElNRU9VVCAqIEhaOwotCi0JCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCQkvKiBlbnRyeSBhbHJlYWR5IG1hcmtlZCBmb3IgZGVsZXRpb24gKi8KKwkJCWlmICh0dF9sb2NhbF9lbnRyeS0+ZmxhZ3MgJiBUVF9DTElFTlRfUEVORElORykKIAkJCQljb250aW51ZTsKIAotCQkJdHRfbG9jYWxfZGVsKGJhdF9wcml2LCB0dF9sb2NhbF9lbnRyeSwKLQkJCQkgICAgICAiYWRkcmVzcyB0aW1lZCBvdXQiKTsKKwkJCWlmICghaXNfb3V0X29mX3RpbWUodHRfbG9jYWxfZW50cnktPmxhc3Rfc2VlbiwKKwkJCQkJICAgIFRUX0xPQ0FMX1RJTUVPVVQgKiAxMDAwKSkKKwkJCQljb250aW51ZTsKKworCQkJdHRfbG9jYWxfc2V0X3BlbmRpbmcoYmF0X3ByaXYsIHR0X2xvY2FsX2VudHJ5LAorCQkJCQkgICAgIFRUX0NMSUVOVF9ERUwpOworCQkJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LCAiTG9jYWwgdHQgZW50cnkgKCVwTSkgIgorCQkJCSJwZW5kaW5nIHRvIGJlIHJlbW92ZWQ6IHRpbWVkIG91dFxuIiwKKwkJCQl0dF9sb2NhbF9lbnRyeS0+YWRkcik7CiAJCX0KKwkJc3Bpbl91bmxvY2tfYmgobGlzdF9sb2NrKTsKIAl9CiAKLQlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0X2xoYXNoX2xvY2spOwotCXR0X2xvY2FsX3N0YXJ0X3RpbWVyKGJhdF9wcml2KTsKIH0KIAotdm9pZCB0dF9sb2NhbF9mcmVlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCitzdGF0aWMgdm9pZCB0dF9sb2NhbF90YWJsZV9mcmVlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCiB7CisJc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoOworCXNwaW5sb2NrX3QgKmxpc3RfbG9jazsgLyogcHJvdGVjdHMgd3JpdGUgYWNjZXNzIHRvIHRoZSBoYXNoIGxpc3RzICovCisJc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5vZGVfdG1wOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCWludCBpOworCiAJaWYgKCFiYXRfcHJpdi0+dHRfbG9jYWxfaGFzaCkKIAkJcmV0dXJuOwogCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZiYXRfcHJpdi0+dHRfd29yayk7Ci0JaGFzaF9kZWxldGUoYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2gsIF90dF9sb2NhbF9kZWwsIGJhdF9wcml2KTsKKwloYXNoID0gYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2g7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7CisJCWhlYWQgPSAmaGFzaC0+dGFibGVbaV07CisJCWxpc3RfbG9jayA9ICZoYXNoLT5saXN0X2xvY2tzW2ldOworCisJCXNwaW5fbG9ja19iaChsaXN0X2xvY2spOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHR0X2xvY2FsX2VudHJ5LCBub2RlLCBub2RlX3RtcCwKKwkJCQkJICBoZWFkLCBoYXNoX2VudHJ5KSB7CisJCQlobGlzdF9kZWxfcmN1KG5vZGUpOworCQkJdHRfbG9jYWxfZW50cnlfZnJlZV9yZWYodHRfbG9jYWxfZW50cnkpOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKGxpc3RfbG9jayk7CisJfQorCisJaGFzaF9kZXN0cm95KGhhc2gpOworCiAJYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2ggPSBOVUxMOwogfQogCi1pbnQgdHRfZ2xvYmFsX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKK3N0YXRpYyBpbnQgdHRfZ2xvYmFsX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKIHsKIAlpZiAoYmF0X3ByaXYtPnR0X2dsb2JhbF9oYXNoKQogCQlyZXR1cm4gMTsKQEAgLTQwNyw3NCArNDc3LDc4IEBACiAJcmV0dXJuIDE7CiB9CiAKLXZvaWQgdHRfZ2xvYmFsX2FkZF9vcmlnKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJIHVuc2lnbmVkIGNoYXIgKnR0X2J1ZmYsIGludCB0dF9idWZmX2xlbikKK3N0YXRpYyB2b2lkIHR0X2NoYW5nZXNfbGlzdF9mcmVlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCit7CisJc3RydWN0IHR0X2NoYW5nZV9ub2RlICplbnRyeSwgKnNhZmU7CisKKwlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dF9jaGFuZ2VzX2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHNhZmUsICZiYXRfcHJpdi0+dHRfY2hhbmdlc19saXN0LAorCQkJCSBsaXN0KSB7CisJCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJCWtmcmVlKGVudHJ5KTsKKwl9CisKKwlhdG9taWNfc2V0KCZiYXRfcHJpdi0+dHRfbG9jYWxfY2hhbmdlcywgMCk7CisJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dF9jaGFuZ2VzX2xpc3RfbG9jayk7Cit9CisKKy8qIGNhbGxlciBtdXN0IGhvbGQgb3JpZ19ub2RlIHJlZmNvdW50ICovCitpbnQgdHRfZ2xvYmFsX2FkZChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCisJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqdHRfYWRkciwgdWludDhfdCB0dHZuLCBib29sIHJvYW1pbmcpCiB7CiAJc3RydWN0IHR0X2dsb2JhbF9lbnRyeSAqdHRfZ2xvYmFsX2VudHJ5OwotCXN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnk7Ci0JaW50IHR0X2J1ZmZfY291bnQgPSAwOwotCXVuc2lnbmVkIGNoYXIgKnR0X3B0cjsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGVfdG1wOworCWludCByZXQgPSAwOwogCi0Jd2hpbGUgKCh0dF9idWZmX2NvdW50ICsgMSkgKiBFVEhfQUxFTiA8PSB0dF9idWZmX2xlbikgewotCQlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dF9naGFzaF9sb2NrKTsKKwl0dF9nbG9iYWxfZW50cnkgPSB0dF9nbG9iYWxfaGFzaF9maW5kKGJhdF9wcml2LCB0dF9hZGRyKTsKIAotCQl0dF9wdHIgPSB0dF9idWZmICsgKHR0X2J1ZmZfY291bnQgKiBFVEhfQUxFTik7Ci0JCXR0X2dsb2JhbF9lbnRyeSA9IHR0X2dsb2JhbF9oYXNoX2ZpbmQoYmF0X3ByaXYsIHR0X3B0cik7CisJaWYgKCF0dF9nbG9iYWxfZW50cnkpIHsKKwkJdHRfZ2xvYmFsX2VudHJ5ID0KKwkJCWttYWxsb2Moc2l6ZW9mKCp0dF9nbG9iYWxfZW50cnkpLAorCQkJCUdGUF9BVE9NSUMpOworCQlpZiAoIXR0X2dsb2JhbF9lbnRyeSkKKwkJCWdvdG8gb3V0OwogCi0JCWlmICghdHRfZ2xvYmFsX2VudHJ5KSB7Ci0JCQlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0X2doYXNoX2xvY2spOwotCi0JCQl0dF9nbG9iYWxfZW50cnkgPQotCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dF9nbG9iYWxfZW50cnkpLAotCQkJCQlHRlBfQVRPTUlDKTsKLQotCQkJaWYgKCF0dF9nbG9iYWxfZW50cnkpCi0JCQkJYnJlYWs7Ci0KLQkJCW1lbWNweSh0dF9nbG9iYWxfZW50cnktPmFkZHIsIHR0X3B0ciwgRVRIX0FMRU4pOwotCi0JCQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LAotCQkJCSJDcmVhdGluZyBuZXcgZ2xvYmFsIHR0IGVudHJ5OiAiCi0JCQkJIiVwTSAodmlhICVwTSlcbiIsCi0JCQkJdHRfZ2xvYmFsX2VudHJ5LT5hZGRyLCBvcmlnX25vZGUtPm9yaWcpOwotCi0JCQlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dF9naGFzaF9sb2NrKTsKLQkJCWhhc2hfYWRkKGJhdF9wcml2LT50dF9nbG9iYWxfaGFzaCwgY29tcGFyZV9ndHQsCi0JCQkJIGNob29zZV9vcmlnLCB0dF9nbG9iYWxfZW50cnksCi0JCQkJICZ0dF9nbG9iYWxfZW50cnktPmhhc2hfZW50cnkpOwotCi0JCX0KLQorCQltZW1jcHkodHRfZ2xvYmFsX2VudHJ5LT5hZGRyLCB0dF9hZGRyLCBFVEhfQUxFTik7CisJCS8qIEFzc2lnbiB0aGUgbmV3IG9yaWdfbm9kZSAqLworCQlhdG9taWNfaW5jKCZvcmlnX25vZGUtPnJlZmNvdW50KTsKIAkJdHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUgPSBvcmlnX25vZGU7Ci0JCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfZ2hhc2hfbG9jayk7CisJCXR0X2dsb2JhbF9lbnRyeS0+dHR2biA9IHR0dm47CisJCXR0X2dsb2JhbF9lbnRyeS0+ZmxhZ3MgPSBOT19GTEFHUzsKKwkJdHRfZ2xvYmFsX2VudHJ5LT5yb2FtX2F0ID0gMDsKKwkJYXRvbWljX3NldCgmdHRfZ2xvYmFsX2VudHJ5LT5yZWZjb3VudCwgMik7CiAKLQkJLyogcmVtb3ZlIGFkZHJlc3MgZnJvbSBsb2NhbCBoYXNoIGlmIHByZXNlbnQgKi8KLQkJc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHRfbGhhc2hfbG9jayk7Ci0KLQkJdHRfcHRyID0gdHRfYnVmZiArICh0dF9idWZmX2NvdW50ICogRVRIX0FMRU4pOwotCQl0dF9sb2NhbF9lbnRyeSA9IHR0X2xvY2FsX2hhc2hfZmluZChiYXRfcHJpdiwgdHRfcHRyKTsKLQotCQlpZiAodHRfbG9jYWxfZW50cnkpCi0JCQl0dF9sb2NhbF9kZWwoYmF0X3ByaXYsIHR0X2xvY2FsX2VudHJ5LAotCQkJCSAgICAgICJnbG9iYWwgdHQgcmVjZWl2ZWQiKTsKLQotCQlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0X2xoYXNoX2xvY2spOwotCi0JCXR0X2J1ZmZfY291bnQrKzsKLQl9Ci0KLQkvKiBpbml0aWFsaXplLCBhbmQgb3ZlcndyaXRlIGlmIG1hbGxvYyBzdWNjZWVkcyAqLwotCW9yaWdfbm9kZS0+dHRfYnVmZiA9IE5VTEw7Ci0Jb3JpZ19ub2RlLT50dF9idWZmX2xlbiA9IDA7Ci0KLQlpZiAodHRfYnVmZl9sZW4gPiAwKSB7Ci0JCW9yaWdfbm9kZS0+dHRfYnVmZiA9IGttYWxsb2ModHRfYnVmZl9sZW4sIEdGUF9BVE9NSUMpOwotCQlpZiAob3JpZ19ub2RlLT50dF9idWZmKSB7Ci0JCQltZW1jcHkob3JpZ19ub2RlLT50dF9idWZmLCB0dF9idWZmLCB0dF9idWZmX2xlbik7Ci0JCQlvcmlnX25vZGUtPnR0X2J1ZmZfbGVuID0gdHRfYnVmZl9sZW47CisJCWhhc2hfYWRkKGJhdF9wcml2LT50dF9nbG9iYWxfaGFzaCwgY29tcGFyZV9ndHQsCisJCQkgY2hvb3NlX29yaWcsIHR0X2dsb2JhbF9lbnRyeSwKKwkJCSAmdHRfZ2xvYmFsX2VudHJ5LT5oYXNoX2VudHJ5KTsKKwkJYXRvbWljX2luYygmb3JpZ19ub2RlLT50dF9zaXplKTsKKwl9IGVsc2UgeworCQlpZiAodHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUgIT0gb3JpZ19ub2RlKSB7CisJCQlhdG9taWNfZGVjKCZ0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+dHRfc2l6ZSk7CisJCQlvcmlnX25vZGVfdG1wID0gdHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGU7CisJCQlhdG9taWNfaW5jKCZvcmlnX25vZGUtPnJlZmNvdW50KTsKKwkJCXR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlID0gb3JpZ19ub2RlOworCQkJb3JpZ19ub2RlX2ZyZWVfcmVmKG9yaWdfbm9kZV90bXApOworCQkJYXRvbWljX2luYygmb3JpZ19ub2RlLT50dF9zaXplKTsKIAkJfQorCQl0dF9nbG9iYWxfZW50cnktPnR0dm4gPSB0dHZuOworCQl0dF9nbG9iYWxfZW50cnktPmZsYWdzID0gTk9fRkxBR1M7CisJCXR0X2dsb2JhbF9lbnRyeS0+cm9hbV9hdCA9IDA7CiAJfQorCisJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LAorCQkiQ3JlYXRpbmcgbmV3IGdsb2JhbCB0dCBlbnRyeTogJXBNICh2aWEgJXBNKVxuIiwKKwkJdHRfZ2xvYmFsX2VudHJ5LT5hZGRyLCBvcmlnX25vZGUtPm9yaWcpOworCisJLyogcmVtb3ZlIGFkZHJlc3MgZnJvbSBsb2NhbCBoYXNoIGlmIHByZXNlbnQgKi8KKwl0dF9sb2NhbF9yZW1vdmUoYmF0X3ByaXYsIHR0X2dsb2JhbF9lbnRyeS0+YWRkciwKKwkJCSJnbG9iYWwgdHQgcmVjZWl2ZWQiLCByb2FtaW5nKTsKKwlyZXQgPSAxOworb3V0OgorCWlmICh0dF9nbG9iYWxfZW50cnkpCisJCXR0X2dsb2JhbF9lbnRyeV9mcmVlX3JlZih0dF9nbG9iYWxfZW50cnkpOworCXJldHVybiByZXQ7CiB9CiAKIGludCB0dF9nbG9iYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKQEAgLTUwOCwyNiArNTgyLDI3IEBACiAJc2VxX3ByaW50ZihzZXEsCiAJCSAgICJHbG9iYWxseSBhbm5vdW5jZWQgVFQgZW50cmllcyByZWNlaXZlZCB2aWEgdGhlIG1lc2ggJXNcbiIsCiAJCSAgIG5ldF9kZXYtPm5hbWUpOwotCi0Jc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHRfZ2hhc2hfbG9jayk7CisJc2VxX3ByaW50ZihzZXEsICIgICAgICAgJS0xM3MgJXMgICAgICAgJS0xNXMgJXNcbiIsCisJCSAgICJDbGllbnQiLCAiKFRUVk4pIiwgIk9yaWdpbmF0b3IiLCAiKEN1cnIgVFRWTikiKTsKIAogCWJ1Zl9zaXplID0gMTsKLQkvKiBFc3RpbWF0ZSBsZW5ndGggZm9yOiAiICogeHg6eHg6eHg6eHg6eHg6eHggdmlhIHh4Onh4Onh4Onh4Onh4Onh4XG4iKi8KKwkvKiBFc3RpbWF0ZSBsZW5ndGggZm9yOiAiICogeHg6eHg6eHg6eHg6eHg6eHggKHR0dm4pIHZpYQorCSAqIHh4Onh4Onh4Onh4Onh4Onh4IChjdXJfdHR2bilcbiIqLwogCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5zaXplOyBpKyspIHsKIAkJaGVhZCA9ICZoYXNoLT50YWJsZVtpXTsKIAogCQlyY3VfcmVhZF9sb2NrKCk7CiAJCV9faGxpc3RfZm9yX2VhY2hfcmN1KG5vZGUsIGhlYWQpCi0JCQlidWZfc2l6ZSArPSA0MzsKKwkJCWJ1Zl9zaXplICs9IDU5OwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKIAlidWZmID0ga21hbGxvYyhidWZfc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidWZmKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfZ2hhc2hfbG9jayk7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KKwogCWJ1ZmZbMF0gPSAnXDAnOwogCXBvcyA9IDA7CiAKQEAgLTUzNywxNiArNjEyLDE4IEBACiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHR0X2dsb2JhbF9lbnRyeSwgbm9kZSwKIAkJCQkJIGhlYWQsIGhhc2hfZW50cnkpIHsKLQkJCXBvcyArPSBzbnByaW50ZihidWZmICsgcG9zLCA0NCwKLQkJCQkJIiAqICVwTSB2aWEgJXBNXG4iLAorCQkJcG9zICs9IHNucHJpbnRmKGJ1ZmYgKyBwb3MsIDYxLAorCQkJCQkiICogJXBNICAoJTN1KSB2aWEgJXBNICAgICAoJTN1KVxuIiwKIAkJCQkJdHRfZ2xvYmFsX2VudHJ5LT5hZGRyLAotCQkJCQl0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZyk7CisJCQkJCXR0X2dsb2JhbF9lbnRyeS0+dHR2biwKKwkJCQkJdHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWcsCisJCQkJCSh1aW50OF90KSBhdG9taWNfcmVhZCgKKwkJCQkJCSZ0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+CisJCQkJCQlsYXN0X3R0dm4pKTsKIAkJfQogCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKLQlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0X2doYXNoX2xvY2spOwotCiAJc2VxX3ByaW50ZihzZXEsICIlcyIsIGJ1ZmYpOwogCWtmcmVlKGJ1ZmYpOwogb3V0OgpAQCAtNTU1LDg0ICs2MzIsMTA5MSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF90dF9nbG9iYWxfZGVsX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgc3RydWN0IHR0X2dsb2JhbF9lbnRyeSAqdHRfZ2xvYmFsX2VudHJ5LAotCQkJCSBjaGFyICptZXNzYWdlKQorc3RhdGljIHZvaWQgX3R0X2dsb2JhbF9kZWwoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKKwkJCSAgIHN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeSwKKwkJCSAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCiB7Ci0JYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwKKwlpZiAoIXR0X2dsb2JhbF9lbnRyeSkKKwkJZ290byBvdXQ7CisKKwliYXRfZGJnKERCR19UVCwgYmF0X3ByaXYsCiAJCSJEZWxldGluZyBnbG9iYWwgdHQgZW50cnkgJXBNICh2aWEgJXBNKTogJXNcbiIsCiAJCXR0X2dsb2JhbF9lbnRyeS0+YWRkciwgdHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWcsCiAJCW1lc3NhZ2UpOwogCisJYXRvbWljX2RlYygmdHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPnR0X3NpemUpOworCiAJaGFzaF9yZW1vdmUoYmF0X3ByaXYtPnR0X2dsb2JhbF9oYXNoLCBjb21wYXJlX2d0dCwgY2hvb3NlX29yaWcsCiAJCSAgICB0dF9nbG9iYWxfZW50cnktPmFkZHIpOwotCWtmcmVlKHR0X2dsb2JhbF9lbnRyeSk7CitvdXQ6CisJaWYgKHR0X2dsb2JhbF9lbnRyeSkKKwkJdHRfZ2xvYmFsX2VudHJ5X2ZyZWVfcmVmKHR0X2dsb2JhbF9lbnRyeSk7Cit9CisKK3ZvaWQgdHRfZ2xvYmFsX2RlbChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkgICBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsCisJCSAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGJvb2wgcm9hbWluZykKK3sKKwlzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5ICp0dF9nbG9iYWxfZW50cnkgPSBOVUxMOworCisJdHRfZ2xvYmFsX2VudHJ5ID0gdHRfZ2xvYmFsX2hhc2hfZmluZChiYXRfcHJpdiwgYWRkcik7CisJaWYgKCF0dF9nbG9iYWxfZW50cnkpCisJCWdvdG8gb3V0OworCisJaWYgKHR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlID09IG9yaWdfbm9kZSkgeworCQlpZiAocm9hbWluZykgeworCQkJdHRfZ2xvYmFsX2VudHJ5LT5mbGFncyB8PSBUVF9DTElFTlRfUk9BTTsKKwkJCXR0X2dsb2JhbF9lbnRyeS0+cm9hbV9hdCA9IGppZmZpZXM7CisJCQlnb3RvIG91dDsKKwkJfQorCQlfdHRfZ2xvYmFsX2RlbChiYXRfcHJpdiwgdHRfZ2xvYmFsX2VudHJ5LCBtZXNzYWdlKTsKKwl9CitvdXQ6CisJaWYgKHR0X2dsb2JhbF9lbnRyeSkKKwkJdHRfZ2xvYmFsX2VudHJ5X2ZyZWVfcmVmKHR0X2dsb2JhbF9lbnRyeSk7CiB9CiAKIHZvaWQgdHRfZ2xvYmFsX2RlbF9vcmlnKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBjaGFyICptZXNzYWdlKQorCQkJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBjb25zdCBjaGFyICptZXNzYWdlKQogewogCXN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeTsKLQlpbnQgdHRfYnVmZl9jb3VudCA9IDA7Ci0JdW5zaWduZWQgY2hhciAqdHRfcHRyOworCWludCBpOworCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCA9IGJhdF9wcml2LT50dF9nbG9iYWxfaGFzaDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKnNhZmU7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJc3BpbmxvY2tfdCAqbGlzdF9sb2NrOyAvKiBwcm90ZWN0cyB3cml0ZSBhY2Nlc3MgdG8gdGhlIGhhc2ggbGlzdHMgKi8KIAotCWlmIChvcmlnX25vZGUtPnR0X2J1ZmZfbGVuID09IDApCi0JCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7CisJCWhlYWQgPSAmaGFzaC0+dGFibGVbaV07CisJCWxpc3RfbG9jayA9ICZoYXNoLT5saXN0X2xvY2tzW2ldOwogCi0Jc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHRfZ2hhc2hfbG9jayk7CisJCXNwaW5fbG9ja19iaChsaXN0X2xvY2spOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHR0X2dsb2JhbF9lbnRyeSwgbm9kZSwgc2FmZSwKKwkJCQkJIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJCWlmICh0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZSA9PSBvcmlnX25vZGUpIHsKKwkJCQliYXRfZGJnKERCR19UVCwgYmF0X3ByaXYsCisJCQkJCSJEZWxldGluZyBnbG9iYWwgdHQgZW50cnkgJXBNICIKKwkJCQkJIih2aWEgJXBNKTogb3JpZ2luYXRvciB0aW1lIG91dFxuIiwKKwkJCQkJdHRfZ2xvYmFsX2VudHJ5LT5hZGRyLAorCQkJCQl0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZyk7CisJCQkJaGxpc3RfZGVsX3JjdShub2RlKTsKKwkJCQl0dF9nbG9iYWxfZW50cnlfZnJlZV9yZWYodHRfZ2xvYmFsX2VudHJ5KTsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19iaChsaXN0X2xvY2spOworCX0KKwlhdG9taWNfc2V0KCZvcmlnX25vZGUtPnR0X3NpemUsIDApOworfQogCi0Jd2hpbGUgKCh0dF9idWZmX2NvdW50ICsgMSkgKiBFVEhfQUxFTiA8PSBvcmlnX25vZGUtPnR0X2J1ZmZfbGVuKSB7Ci0JCXR0X3B0ciA9IG9yaWdfbm9kZS0+dHRfYnVmZiArICh0dF9idWZmX2NvdW50ICogRVRIX0FMRU4pOwotCQl0dF9nbG9iYWxfZW50cnkgPSB0dF9nbG9iYWxfaGFzaF9maW5kKGJhdF9wcml2LCB0dF9wdHIpOworc3RhdGljIHZvaWQgdHRfZ2xvYmFsX3JvYW1fcHVyZ2Uoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKK3sKKwlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2ggPSBiYXRfcHJpdi0+dHRfZ2xvYmFsX2hhc2g7CisJc3RydWN0IHR0X2dsb2JhbF9lbnRyeSAqdHRfZ2xvYmFsX2VudHJ5OworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbm9kZV90bXA7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJc3BpbmxvY2tfdCAqbGlzdF9sb2NrOyAvKiBwcm90ZWN0cyB3cml0ZSBhY2Nlc3MgdG8gdGhlIGhhc2ggbGlzdHMgKi8KKwlpbnQgaTsKIAotCQlpZiAoKHR0X2dsb2JhbF9lbnRyeSkgJiYKLQkJICAgICh0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZSA9PSBvcmlnX25vZGUpKQotCQkJX3R0X2dsb2JhbF9kZWxfb3JpZyhiYXRfcHJpdiwgdHRfZ2xvYmFsX2VudHJ5LAotCQkJCQkgICAgIG1lc3NhZ2UpOworCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5zaXplOyBpKyspIHsKKwkJaGVhZCA9ICZoYXNoLT50YWJsZVtpXTsKKwkJbGlzdF9sb2NrID0gJmhhc2gtPmxpc3RfbG9ja3NbaV07CiAKLQkJdHRfYnVmZl9jb3VudCsrOworCQlzcGluX2xvY2tfYmgobGlzdF9sb2NrKTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0dF9nbG9iYWxfZW50cnksIG5vZGUsIG5vZGVfdG1wLAorCQkJCQkgIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJCWlmICghKHR0X2dsb2JhbF9lbnRyeS0+ZmxhZ3MgJiBUVF9DTElFTlRfUk9BTSkpCisJCQkJY29udGludWU7CisJCQlpZiAoIWlzX291dF9vZl90aW1lKHR0X2dsb2JhbF9lbnRyeS0+cm9hbV9hdCwKKwkJCQkJICAgIFRUX0NMSUVOVF9ST0FNX1RJTUVPVVQgKiAxMDAwKSkKKwkJCQljb250aW51ZTsKKworCQkJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LCAiRGVsZXRpbmcgZ2xvYmFsICIKKwkJCQkidHQgZW50cnkgKCVwTSk6IFJvYW1pbmcgdGltZW91dFxuIiwKKwkJCQl0dF9nbG9iYWxfZW50cnktPmFkZHIpOworCQkJYXRvbWljX2RlYygmdHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPnR0X3NpemUpOworCQkJaGxpc3RfZGVsX3JjdShub2RlKTsKKwkJCXR0X2dsb2JhbF9lbnRyeV9mcmVlX3JlZih0dF9nbG9iYWxfZW50cnkpOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKGxpc3RfbG9jayk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dF9naGFzaF9sb2NrKTsKLQotCW9yaWdfbm9kZS0+dHRfYnVmZl9sZW4gPSAwOwotCWtmcmVlKG9yaWdfbm9kZS0+dHRfYnVmZik7Ci0Jb3JpZ19ub2RlLT50dF9idWZmID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgdHRfZ2xvYmFsX2RlbChzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgdHRfZ2xvYmFsX3RhYmxlX2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKIHsKLQl2b2lkICpkYXRhID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCB0dF9nbG9iYWxfZW50cnksIGhhc2hfZW50cnkpOworCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaDsKKwlzcGlubG9ja190ICpsaXN0X2xvY2s7IC8qIHByb3RlY3RzIHdyaXRlIGFjY2VzcyB0byB0aGUgaGFzaCBsaXN0cyAqLworCXN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5vZGVfdG1wOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCWludCBpOwogCi0Ja2ZyZWUoZGF0YSk7Ci19Ci0KLXZvaWQgdHRfZ2xvYmFsX2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKIAlpZiAoIWJhdF9wcml2LT50dF9nbG9iYWxfaGFzaCkKIAkJcmV0dXJuOwogCi0JaGFzaF9kZWxldGUoYmF0X3ByaXYtPnR0X2dsb2JhbF9oYXNoLCB0dF9nbG9iYWxfZGVsLCBOVUxMKTsKKwloYXNoID0gYmF0X3ByaXYtPnR0X2dsb2JhbF9oYXNoOworCisJZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgeworCQloZWFkID0gJmhhc2gtPnRhYmxlW2ldOworCQlsaXN0X2xvY2sgPSAmaGFzaC0+bGlzdF9sb2Nrc1tpXTsKKworCQlzcGluX2xvY2tfYmgobGlzdF9sb2NrKTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0dF9nbG9iYWxfZW50cnksIG5vZGUsIG5vZGVfdG1wLAorCQkJCQkgIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJCWhsaXN0X2RlbF9yY3Uobm9kZSk7CisJCQl0dF9nbG9iYWxfZW50cnlfZnJlZV9yZWYodHRfZ2xvYmFsX2VudHJ5KTsKKwkJfQorCQlzcGluX3VubG9ja19iaChsaXN0X2xvY2spOworCX0KKworCWhhc2hfZGVzdHJveShoYXNoKTsKKwogCWJhdF9wcml2LT50dF9nbG9iYWxfaGFzaCA9IE5VTEw7CiB9CiAKLXN0cnVjdCBvcmlnX25vZGUgKnRyYW5zdGFibGVfc2VhcmNoKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHVpbnQ4X3QgKmFkZHIpCitzdHJ1Y3Qgb3JpZ19ub2RlICp0cmFuc3RhYmxlX3NlYXJjaChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJCSAgICBjb25zdCB1aW50OF90ICphZGRyKQogewogCXN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeTsKIAlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUgPSBOVUxMOwogCi0Jc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHRfZ2hhc2hfbG9jayk7CiAJdHRfZ2xvYmFsX2VudHJ5ID0gdHRfZ2xvYmFsX2hhc2hfZmluZChiYXRfcHJpdiwgYWRkcik7CiAKIAlpZiAoIXR0X2dsb2JhbF9lbnRyeSkKIAkJZ290byBvdXQ7CiAKIAlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJnR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5yZWZjb3VudCkpCi0JCWdvdG8gb3V0OworCQlnb3RvIGZyZWVfdHQ7CisKKwkvKiBBIGdsb2JhbCBjbGllbnQgbWFya2VkIGFzIFBFTkRJTkcgaGFzIGFscmVhZHkgbW92ZWQgZnJvbSB0aGF0CisJICogb3JpZ2luYXRvciAqLworCWlmICh0dF9nbG9iYWxfZW50cnktPmZsYWdzICYgVFRfQ0xJRU5UX1BFTkRJTkcpCisJCWdvdG8gZnJlZV90dDsKIAogCW9yaWdfbm9kZSA9IHR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlOwogCitmcmVlX3R0OgorCXR0X2dsb2JhbF9lbnRyeV9mcmVlX3JlZih0dF9nbG9iYWxfZW50cnkpOwogb3V0OgotCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfZ2hhc2hfbG9jayk7CiAJcmV0dXJuIG9yaWdfbm9kZTsKIH0KKworLyogQ2FsY3VsYXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIGxvY2FsIHRhYmxlIG9mIGEgZ2l2ZW4gb3JpZ19ub2RlICovCit1aW50MTZfdCB0dF9nbG9iYWxfY3JjKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSkKK3sKKwl1aW50MTZfdCB0b3RhbCA9IDAsIHRvdGFsX29uZTsKKwlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2ggPSBiYXRfcHJpdi0+dHRfZ2xvYmFsX2hhc2g7CisJc3RydWN0IHR0X2dsb2JhbF9lbnRyeSAqdHRfZ2xvYmFsX2VudHJ5OworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgeworCQloZWFkID0gJmhhc2gtPnRhYmxlW2ldOworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHR0X2dsb2JhbF9lbnRyeSwgbm9kZSwKKwkJCQkJIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJCWlmIChjb21wYXJlX2V0aCh0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZSwKKwkJCQkJb3JpZ19ub2RlKSkgeworCQkJCS8qIFJvYW1pbmcgY2xpZW50cyBhcmUgaW4gdGhlIGdsb2JhbCB0YWJsZSBmb3IKKwkJCQkgKiBjb25zaXN0ZW5jeSBvbmx5LiBUaGV5IGRvbid0IGhhdmUgdG8gYmUKKwkJCQkgKiB0YWtlbiBpbnRvIGFjY291bnQgd2hpbGUgY29tcHV0aW5nIHRoZQorCQkJCSAqIGdsb2JhbCBjcmMgKi8KKwkJCQlpZiAodHRfZ2xvYmFsX2VudHJ5LT5mbGFncyAmIFRUX0NMSUVOVF9ST0FNKQorCQkJCQljb250aW51ZTsKKwkJCQl0b3RhbF9vbmUgPSAwOworCQkJCWZvciAoaiA9IDA7IGogPCBFVEhfQUxFTjsgaisrKQorCQkJCQl0b3RhbF9vbmUgPSBjcmMxNl9ieXRlKHRvdGFsX29uZSwKKwkJCQkJCXR0X2dsb2JhbF9lbnRyeS0+YWRkcltqXSk7CisJCQkJdG90YWwgXj0gdG90YWxfb25lOworCQkJfQorCQl9CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0KKworCXJldHVybiB0b3RhbDsKK30KKworLyogQ2FsY3VsYXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIGxvY2FsIHRhYmxlICovCit1aW50MTZfdCB0dF9sb2NhbF9jcmMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKK3sKKwl1aW50MTZfdCB0b3RhbCA9IDAsIHRvdGFsX29uZTsKKwlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2ggPSBiYXRfcHJpdi0+dHRfbG9jYWxfaGFzaDsKKwlzdHJ1Y3QgdHRfbG9jYWxfZW50cnkgKnR0X2xvY2FsX2VudHJ5OworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgeworCQloZWFkID0gJmhhc2gtPnRhYmxlW2ldOworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHR0X2xvY2FsX2VudHJ5LCBub2RlLAorCQkJCQkgaGVhZCwgaGFzaF9lbnRyeSkgeworCQkJLyogbm90IHlldCBjb21taXR0ZWQgY2xpZW50cyBoYXZlIG5vdCB0byBiZSB0YWtlbiBpbnRvCisJCQkgKiBhY2NvdW50IHdoaWxlIGNvbXB1dGluZyB0aGUgQ1JDICovCisJCQlpZiAodHRfbG9jYWxfZW50cnktPmZsYWdzICYgVFRfQ0xJRU5UX05FVykKKwkJCQljb250aW51ZTsKKwkJCXRvdGFsX29uZSA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgRVRIX0FMRU47IGorKykKKwkJCQl0b3RhbF9vbmUgPSBjcmMxNl9ieXRlKHRvdGFsX29uZSwKKwkJCQkJCSAgIHR0X2xvY2FsX2VudHJ5LT5hZGRyW2pdKTsKKwkJCXRvdGFsIF49IHRvdGFsX29uZTsKKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisKKwlyZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyB2b2lkIHR0X3JlcV9saXN0X2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKK3sKKwlzdHJ1Y3QgdHRfcmVxX25vZGUgKm5vZGUsICpzYWZlOworCisJc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHRfcmVxX2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgc2FmZSwgJmJhdF9wcml2LT50dF9yZXFfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmbm9kZS0+bGlzdCk7CisJCWtmcmVlKG5vZGUpOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfcmVxX2xpc3RfbG9jayk7Cit9CisKK3ZvaWQgdHRfc2F2ZV9vcmlnX2J1ZmZlcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqdHRfYnVmZiwgdWludDhfdCB0dF9udW1fY2hhbmdlcykKK3sKKwl1aW50MTZfdCB0dF9idWZmX2xlbiA9IHR0X2xlbih0dF9udW1fY2hhbmdlcyk7CisKKwkvKiBSZXBsYWNlIHRoZSBvbGQgYnVmZmVyIG9ubHkgaWYgSSByZWNlaXZlZCBzb21ldGhpbmcgaW4gdGhlCisJICogbGFzdCBPR00gKHRoZSBPR00gY291bGQgY2Fycnkgbm8gY2hhbmdlcykgKi8KKwlzcGluX2xvY2tfYmgoJm9yaWdfbm9kZS0+dHRfYnVmZl9sb2NrKTsKKwlpZiAodHRfYnVmZl9sZW4gPiAwKSB7CisJCWtmcmVlKG9yaWdfbm9kZS0+dHRfYnVmZik7CisJCW9yaWdfbm9kZS0+dHRfYnVmZl9sZW4gPSAwOworCQlvcmlnX25vZGUtPnR0X2J1ZmYgPSBrbWFsbG9jKHR0X2J1ZmZfbGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKG9yaWdfbm9kZS0+dHRfYnVmZikgeworCQkJbWVtY3B5KG9yaWdfbm9kZS0+dHRfYnVmZiwgdHRfYnVmZiwgdHRfYnVmZl9sZW4pOworCQkJb3JpZ19ub2RlLT50dF9idWZmX2xlbiA9IHR0X2J1ZmZfbGVuOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZvcmlnX25vZGUtPnR0X2J1ZmZfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHR0X3JlcV9wdXJnZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQoreworCXN0cnVjdCB0dF9yZXFfbm9kZSAqbm9kZSwgKnNhZmU7CisKKwlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dF9yZXFfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgc2FmZSwgJmJhdF9wcml2LT50dF9yZXFfbGlzdCwgbGlzdCkgeworCQlpZiAoaXNfb3V0X29mX3RpbWUobm9kZS0+aXNzdWVkX2F0LAorCQkgICAgVFRfUkVRVUVTVF9USU1FT1VUICogMTAwMCkpIHsKKwkJCWxpc3RfZGVsKCZub2RlLT5saXN0KTsKKwkJCWtmcmVlKG5vZGUpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfcmVxX2xpc3RfbG9jayk7Cit9CisKKy8qIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyB0dF9yZXFfbm9kZSBzdHJ1Y3QgaWYgbm8gcmVxdWVzdAorICogaGFzIGFscmVhZHkgYmVlbiBpc3N1ZWQgZm9yIHRoaXMgb3JpZ19ub2RlLCBOVUxMIG90aGVyd2lzZSAqLworc3RhdGljIHN0cnVjdCB0dF9yZXFfbm9kZSAqbmV3X3R0X3JlcV9ub2RlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCQkJCSAgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlKQoreworCXN0cnVjdCB0dF9yZXFfbm9kZSAqdHRfcmVxX25vZGVfdG1wLCAqdHRfcmVxX25vZGUgPSBOVUxMOworCisJc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHRfcmVxX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0dF9yZXFfbm9kZV90bXAsICZiYXRfcHJpdi0+dHRfcmVxX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNvbXBhcmVfZXRoKHR0X3JlcV9ub2RlX3RtcCwgb3JpZ19ub2RlKSAmJgorCQkgICAgIWlzX291dF9vZl90aW1lKHR0X3JlcV9ub2RlX3RtcC0+aXNzdWVkX2F0LAorCQkJCSAgICBUVF9SRVFVRVNUX1RJTUVPVVQgKiAxMDAwKSkKKwkJCWdvdG8gdW5sb2NrOworCX0KKworCXR0X3JlcV9ub2RlID0ga21hbGxvYyhzaXplb2YoKnR0X3JlcV9ub2RlKSwgR0ZQX0FUT01JQyk7CisJaWYgKCF0dF9yZXFfbm9kZSkKKwkJZ290byB1bmxvY2s7CisKKwltZW1jcHkodHRfcmVxX25vZGUtPmFkZHIsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOworCXR0X3JlcV9ub2RlLT5pc3N1ZWRfYXQgPSBqaWZmaWVzOworCisJbGlzdF9hZGQoJnR0X3JlcV9ub2RlLT5saXN0LCAmYmF0X3ByaXYtPnR0X3JlcV9saXN0KTsKK3VubG9jazoKKwlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0X3JlcV9saXN0X2xvY2spOworCXJldHVybiB0dF9yZXFfbm9kZTsKK30KKworLyogZGF0YV9wdHIgaXMgdXNlbGVzcyBoZXJlLCBidXQgaGFzIHRvIGJlIGtlcHQgdG8gcmVzcGVjdCB0aGUgcHJvdG90eXBlICovCitzdGF0aWMgaW50IHR0X2xvY2FsX3ZhbGlkX2VudHJ5KGNvbnN0IHZvaWQgKmVudHJ5X3B0ciwgY29uc3Qgdm9pZCAqZGF0YV9wdHIpCit7CisJY29uc3Qgc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeSA9IGVudHJ5X3B0cjsKKworCWlmICh0dF9sb2NhbF9lbnRyeS0+ZmxhZ3MgJiBUVF9DTElFTlRfTkVXKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0dF9nbG9iYWxfdmFsaWRfZW50cnkoY29uc3Qgdm9pZCAqZW50cnlfcHRyLCBjb25zdCB2b2lkICpkYXRhX3B0cikKK3sKKwljb25zdCBzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5ICp0dF9nbG9iYWxfZW50cnkgPSBlbnRyeV9wdHI7CisJY29uc3Qgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlID0gZGF0YV9wdHI7CisKKwlpZiAodHRfZ2xvYmFsX2VudHJ5LT5mbGFncyAmIFRUX0NMSUVOVF9ST0FNKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAodHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUgPT0gb3JpZ19ub2RlKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICp0dF9yZXNwb25zZV9maWxsX3RhYmxlKHVpbnQxNl90IHR0X2xlbiwgdWludDhfdCB0dHZuLAorCQkJCQkgICAgICBzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsCisJCQkJCSAgICAgIHN0cnVjdCBoYXJkX2lmYWNlICpwcmltYXJ5X2lmLAorCQkJCQkgICAgICBpbnQgKCp2YWxpZF9jYikoY29uc3Qgdm9pZCAqLAorCQkJCQkJCSAgICAgIGNvbnN0IHZvaWQgKiksCisJCQkJCSAgICAgIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgdHRfcXVlcnlfcGFja2V0ICp0dF9yZXNwb25zZTsKKwlzdHJ1Y3QgdHRfY2hhbmdlICp0dF9jaGFuZ2U7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdWludDE2X3QgdHRfdG90LCB0dF9jb3VudDsKKwlzc2l6ZV90IHR0X3F1ZXJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCk7CisJaW50IGk7CisKKwlpZiAodHRfcXVlcnlfc2l6ZSArIHR0X2xlbiA+IHByaW1hcnlfaWYtPnNvZnRfaWZhY2UtPm10dSkgeworCQl0dF9sZW4gPSBwcmltYXJ5X2lmLT5zb2Z0X2lmYWNlLT5tdHUgLSB0dF9xdWVyeV9zaXplOworCQl0dF9sZW4gLT0gdHRfbGVuICUgc2l6ZW9mKHN0cnVjdCB0dF9jaGFuZ2UpOworCX0KKwl0dF90b3QgPSB0dF9sZW4gLyBzaXplb2Yoc3RydWN0IHR0X2NoYW5nZSk7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHR0X3F1ZXJ5X3NpemUgKyB0dF9sZW4gKyBFVEhfSExFTik7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJc2tiX3Jlc2VydmUoc2tiLCBFVEhfSExFTik7CisJdHRfcmVzcG9uc2UgPSAoc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCAqKXNrYl9wdXQoc2tiLAorCQkJCQkJICAgICB0dF9xdWVyeV9zaXplICsgdHRfbGVuKTsKKwl0dF9yZXNwb25zZS0+dHR2biA9IHR0dm47CisJdHRfcmVzcG9uc2UtPnR0X2RhdGEgPSBodG9ucyh0dF90b3QpOworCisJdHRfY2hhbmdlID0gKHN0cnVjdCB0dF9jaGFuZ2UgKikoc2tiLT5kYXRhICsgdHRfcXVlcnlfc2l6ZSk7CisJdHRfY291bnQgPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5zaXplOyBpKyspIHsKKwkJaGVhZCA9ICZoYXNoLT50YWJsZVtpXTsKKworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHRfbG9jYWxfZW50cnksIG5vZGUsCisJCQkJCSBoZWFkLCBoYXNoX2VudHJ5KSB7CisJCQlpZiAodHRfY291bnQgPT0gdHRfdG90KQorCQkJCWJyZWFrOworCisJCQlpZiAoKHZhbGlkX2NiKSAmJiAoIXZhbGlkX2NiKHR0X2xvY2FsX2VudHJ5LCBjYl9kYXRhKSkpCisJCQkJY29udGludWU7CisKKwkJCW1lbWNweSh0dF9jaGFuZ2UtPmFkZHIsIHR0X2xvY2FsX2VudHJ5LT5hZGRyLCBFVEhfQUxFTik7CisJCQl0dF9jaGFuZ2UtPmZsYWdzID0gTk9fRkxBR1M7CisKKwkJCXR0X2NvdW50Kys7CisJCQl0dF9jaGFuZ2UrKzsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworb3V0OgorCXJldHVybiBza2I7Cit9CisKK2ludCBzZW5kX3R0X3JlcXVlc3Qoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IG9yaWdfbm9kZSAqZHN0X29yaWdfbm9kZSwKKwkJICAgIHVpbnQ4X3QgdHR2biwgdWludDE2X3QgdHRfY3JjLCBib29sIGZ1bGxfdGFibGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCAqdHRfcmVxdWVzdDsKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSA9IE5VTEw7CisJc3RydWN0IGhhcmRfaWZhY2UgKnByaW1hcnlfaWY7CisJc3RydWN0IHR0X3JlcV9ub2RlICp0dF9yZXFfbm9kZSA9IE5VTEw7CisJaW50IHJldCA9IDE7CisKKwlwcmltYXJ5X2lmID0gcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCWlmICghcHJpbWFyeV9pZikKKwkJZ290byBvdXQ7CisKKwkvKiBUaGUgbmV3IHR0X3JlcSB3aWxsIGJlIGlzc3VlZCBvbmx5IGlmIEknbSBub3Qgd2FpdGluZyBmb3IgYQorCSAqIHJlcGx5IGZyb20gdGhlIHNhbWUgb3JpZ19ub2RlIHlldCAqLworCXR0X3JlcV9ub2RlID0gbmV3X3R0X3JlcV9ub2RlKGJhdF9wcml2LCBkc3Rfb3JpZ19ub2RlKTsKKwlpZiAoIXR0X3JlcV9ub2RlKQorCQlnb3RvIG91dDsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCB0dF9xdWVyeV9wYWNrZXQpICsgRVRIX0hMRU4pOworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKworCXNrYl9yZXNlcnZlKHNrYiwgRVRIX0hMRU4pOworCisJdHRfcmVxdWVzdCA9IChzdHJ1Y3QgdHRfcXVlcnlfcGFja2V0ICopc2tiX3B1dChza2IsCisJCQkJc2l6ZW9mKHN0cnVjdCB0dF9xdWVyeV9wYWNrZXQpKTsKKworCXR0X3JlcXVlc3QtPnBhY2tldF90eXBlID0gQkFUX1RUX1FVRVJZOworCXR0X3JlcXVlc3QtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKKwltZW1jcHkodHRfcmVxdWVzdC0+c3JjLCBwcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweSh0dF9yZXF1ZXN0LT5kc3QsIGRzdF9vcmlnX25vZGUtPm9yaWcsIEVUSF9BTEVOKTsKKwl0dF9yZXF1ZXN0LT50dGwgPSBUVEw7CisJdHRfcmVxdWVzdC0+dHR2biA9IHR0dm47CisJdHRfcmVxdWVzdC0+dHRfZGF0YSA9IHR0X2NyYzsKKwl0dF9yZXF1ZXN0LT5mbGFncyA9IFRUX1JFUVVFU1Q7CisKKwlpZiAoZnVsbF90YWJsZSkKKwkJdHRfcmVxdWVzdC0+ZmxhZ3MgfD0gVFRfRlVMTF9UQUJMRTsKKworCW5laWdoX25vZGUgPSBvcmlnX25vZGVfZ2V0X3JvdXRlcihkc3Rfb3JpZ19ub2RlKTsKKwlpZiAoIW5laWdoX25vZGUpCisJCWdvdG8gb3V0OworCisJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LCAiU2VuZGluZyBUVF9SRVFVRVNUIHRvICVwTSB2aWEgJXBNICIKKwkJIlslY11cbiIsIGRzdF9vcmlnX25vZGUtPm9yaWcsIG5laWdoX25vZGUtPmFkZHIsCisJCShmdWxsX3RhYmxlID8gJ0YnIDogJy4nKSk7CisKKwlzZW5kX3NrYl9wYWNrZXQoc2tiLCBuZWlnaF9ub2RlLT5pZl9pbmNvbWluZywgbmVpZ2hfbm9kZS0+YWRkcik7CisJcmV0ID0gMDsKKworb3V0OgorCWlmIChuZWlnaF9ub2RlKQorCQluZWlnaF9ub2RlX2ZyZWVfcmVmKG5laWdoX25vZGUpOworCWlmIChwcmltYXJ5X2lmKQorCQloYXJkaWZfZnJlZV9yZWYocHJpbWFyeV9pZik7CisJaWYgKHJldCkKKwkJa2ZyZWVfc2tiKHNrYik7CisJaWYgKHJldCAmJiB0dF9yZXFfbm9kZSkgeworCQlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dF9yZXFfbGlzdF9sb2NrKTsKKwkJbGlzdF9kZWwoJnR0X3JlcV9ub2RlLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dF9yZXFfbGlzdF9sb2NrKTsKKwkJa2ZyZWUodHRfcmVxX25vZGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBzZW5kX290aGVyX3R0X3Jlc3BvbnNlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCQkJICAgc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCAqdHRfcmVxdWVzdCkKK3sKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpyZXFfZHN0X29yaWdfbm9kZSA9IE5VTEwsICpyZXNfZHN0X29yaWdfbm9kZSA9IE5VTEw7CisJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUgPSBOVUxMOworCXN0cnVjdCBoYXJkX2lmYWNlICpwcmltYXJ5X2lmID0gTlVMTDsKKwl1aW50OF90IG9yaWdfdHR2biwgcmVxX3R0dm4sIHR0dm47CisJaW50IHJldCA9IGZhbHNlOworCXVuc2lnbmVkIGNoYXIgKnR0X2J1ZmY7CisJYm9vbCBmdWxsX3RhYmxlOworCXVpbnQxNl90IHR0X2xlbiwgdHRfdG90OworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCB0dF9xdWVyeV9wYWNrZXQgKnR0X3Jlc3BvbnNlOworCisJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LAorCQkiUmVjZWl2ZWQgVFRfUkVRVUVTVCBmcm9tICVwTSBmb3IgIgorCQkidHR2bjogJXUgKCVwTSkgWyVjXVxuIiwgdHRfcmVxdWVzdC0+c3JjLAorCQl0dF9yZXF1ZXN0LT50dHZuLCB0dF9yZXF1ZXN0LT5kc3QsCisJCSh0dF9yZXF1ZXN0LT5mbGFncyAmIFRUX0ZVTExfVEFCTEUgPyAnRicgOiAnLicpKTsKKworCS8qIExldCdzIGdldCB0aGUgb3JpZyBub2RlIG9mIHRoZSBSRUFMIGRlc3RpbmF0aW9uICovCisJcmVxX2RzdF9vcmlnX25vZGUgPSBnZXRfb3JpZ19ub2RlKGJhdF9wcml2LCB0dF9yZXF1ZXN0LT5kc3QpOworCWlmICghcmVxX2RzdF9vcmlnX25vZGUpCisJCWdvdG8gb3V0OworCisJcmVzX2RzdF9vcmlnX25vZGUgPSBnZXRfb3JpZ19ub2RlKGJhdF9wcml2LCB0dF9yZXF1ZXN0LT5zcmMpOworCWlmICghcmVzX2RzdF9vcmlnX25vZGUpCisJCWdvdG8gb3V0OworCisJbmVpZ2hfbm9kZSA9IG9yaWdfbm9kZV9nZXRfcm91dGVyKHJlc19kc3Rfb3JpZ19ub2RlKTsKKwlpZiAoIW5laWdoX25vZGUpCisJCWdvdG8gb3V0OworCisJcHJpbWFyeV9pZiA9IHByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKKwlpZiAoIXByaW1hcnlfaWYpCisJCWdvdG8gb3V0OworCisJb3JpZ190dHZuID0gKHVpbnQ4X3QpYXRvbWljX3JlYWQoJnJlcV9kc3Rfb3JpZ19ub2RlLT5sYXN0X3R0dm4pOworCXJlcV90dHZuID0gdHRfcmVxdWVzdC0+dHR2bjsKKworCS8qIEkgaGF2ZSBub3QgdGhlIHJlcXVlc3RlZCBkYXRhICovCisJaWYgKG9yaWdfdHR2biAhPSByZXFfdHR2biB8fAorCSAgICB0dF9yZXF1ZXN0LT50dF9kYXRhICE9IHJlcV9kc3Rfb3JpZ19ub2RlLT50dF9jcmMpCisJCWdvdG8gb3V0OworCisJLyogSWYgaXQgaGFzIGV4cGxpY2l0bHkgYmVlbiByZXF1ZXN0ZWQgdGhlIGZ1bGwgdGFibGUgKi8KKwlpZiAodHRfcmVxdWVzdC0+ZmxhZ3MgJiBUVF9GVUxMX1RBQkxFIHx8CisJICAgICFyZXFfZHN0X29yaWdfbm9kZS0+dHRfYnVmZikKKwkJZnVsbF90YWJsZSA9IHRydWU7CisJZWxzZQorCQlmdWxsX3RhYmxlID0gZmFsc2U7CisKKwkvKiBJbiB0aGlzIHZlcnNpb24sIGZyYWdtZW50YXRpb24gaXMgbm90IGltcGxlbWVudGVkLCB0aGVuCisJICogSSdsbCBzZW5kIG9ubHkgb25lIHBhY2tldCB3aXRoIGFzIG11Y2ggVFQgZW50cmllcyBhcyBJIGNhbiAqLworCWlmICghZnVsbF90YWJsZSkgeworCQlzcGluX2xvY2tfYmgoJnJlcV9kc3Rfb3JpZ19ub2RlLT50dF9idWZmX2xvY2spOworCQl0dF9sZW4gPSByZXFfZHN0X29yaWdfbm9kZS0+dHRfYnVmZl9sZW47CisJCXR0X3RvdCA9IHR0X2xlbiAvIHNpemVvZihzdHJ1Y3QgdHRfY2hhbmdlKTsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgdHRfcXVlcnlfcGFja2V0KSArCisJCQkJICAgIHR0X2xlbiArIEVUSF9ITEVOKTsKKwkJaWYgKCFza2IpCisJCQlnb3RvIHVubG9jazsKKworCQlza2JfcmVzZXJ2ZShza2IsIEVUSF9ITEVOKTsKKwkJdHRfcmVzcG9uc2UgPSAoc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCAqKXNrYl9wdXQoc2tiLAorCQkJCXNpemVvZihzdHJ1Y3QgdHRfcXVlcnlfcGFja2V0KSArIHR0X2xlbik7CisJCXR0X3Jlc3BvbnNlLT50dHZuID0gcmVxX3R0dm47CisJCXR0X3Jlc3BvbnNlLT50dF9kYXRhID0gaHRvbnModHRfdG90KTsKKworCQl0dF9idWZmID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCB0dF9xdWVyeV9wYWNrZXQpOworCQkvKiBDb3B5IHRoZSBsYXN0IG9yaWdfbm9kZSdzIE9HTSBidWZmZXIgKi8KKwkJbWVtY3B5KHR0X2J1ZmYsIHJlcV9kc3Rfb3JpZ19ub2RlLT50dF9idWZmLAorCQkgICAgICAgcmVxX2RzdF9vcmlnX25vZGUtPnR0X2J1ZmZfbGVuKTsKKworCQlzcGluX3VubG9ja19iaCgmcmVxX2RzdF9vcmlnX25vZGUtPnR0X2J1ZmZfbG9jayk7CisJfSBlbHNlIHsKKwkJdHRfbGVuID0gKHVpbnQxNl90KWF0b21pY19yZWFkKCZyZXFfZHN0X29yaWdfbm9kZS0+dHRfc2l6ZSkgKgorCQkJCQkJc2l6ZW9mKHN0cnVjdCB0dF9jaGFuZ2UpOworCQl0dHZuID0gKHVpbnQ4X3QpYXRvbWljX3JlYWQoJnJlcV9kc3Rfb3JpZ19ub2RlLT5sYXN0X3R0dm4pOworCisJCXNrYiA9IHR0X3Jlc3BvbnNlX2ZpbGxfdGFibGUodHRfbGVuLCB0dHZuLAorCQkJCQkgICAgIGJhdF9wcml2LT50dF9nbG9iYWxfaGFzaCwKKwkJCQkJICAgICBwcmltYXJ5X2lmLCB0dF9nbG9iYWxfdmFsaWRfZW50cnksCisJCQkJCSAgICAgcmVxX2RzdF9vcmlnX25vZGUpOworCQlpZiAoIXNrYikKKwkJCWdvdG8gb3V0OworCisJCXR0X3Jlc3BvbnNlID0gKHN0cnVjdCB0dF9xdWVyeV9wYWNrZXQgKilza2ItPmRhdGE7CisJfQorCisJdHRfcmVzcG9uc2UtPnBhY2tldF90eXBlID0gQkFUX1RUX1FVRVJZOworCXR0X3Jlc3BvbnNlLT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047CisJdHRfcmVzcG9uc2UtPnR0bCA9IFRUTDsKKwltZW1jcHkodHRfcmVzcG9uc2UtPnNyYywgcmVxX2RzdF9vcmlnX25vZGUtPm9yaWcsIEVUSF9BTEVOKTsKKwltZW1jcHkodHRfcmVzcG9uc2UtPmRzdCwgdHRfcmVxdWVzdC0+c3JjLCBFVEhfQUxFTik7CisJdHRfcmVzcG9uc2UtPmZsYWdzID0gVFRfUkVTUE9OU0U7CisKKwlpZiAoZnVsbF90YWJsZSkKKwkJdHRfcmVzcG9uc2UtPmZsYWdzIHw9IFRUX0ZVTExfVEFCTEU7CisKKwliYXRfZGJnKERCR19UVCwgYmF0X3ByaXYsCisJCSJTZW5kaW5nIFRUX1JFU1BPTlNFICVwTSB2aWEgJXBNIGZvciAlcE0gKHR0dm46ICV1KVxuIiwKKwkJcmVzX2RzdF9vcmlnX25vZGUtPm9yaWcsIG5laWdoX25vZGUtPmFkZHIsCisJCXJlcV9kc3Rfb3JpZ19ub2RlLT5vcmlnLCByZXFfdHR2bik7CisKKwlzZW5kX3NrYl9wYWNrZXQoc2tiLCBuZWlnaF9ub2RlLT5pZl9pbmNvbWluZywgbmVpZ2hfbm9kZS0+YWRkcik7CisJcmV0ID0gdHJ1ZTsKKwlnb3RvIG91dDsKKwordW5sb2NrOgorCXNwaW5fdW5sb2NrX2JoKCZyZXFfZHN0X29yaWdfbm9kZS0+dHRfYnVmZl9sb2NrKTsKKworb3V0OgorCWlmIChyZXNfZHN0X29yaWdfbm9kZSkKKwkJb3JpZ19ub2RlX2ZyZWVfcmVmKHJlc19kc3Rfb3JpZ19ub2RlKTsKKwlpZiAocmVxX2RzdF9vcmlnX25vZGUpCisJCW9yaWdfbm9kZV9mcmVlX3JlZihyZXFfZHN0X29yaWdfbm9kZSk7CisJaWYgKG5laWdoX25vZGUpCisJCW5laWdoX25vZGVfZnJlZV9yZWYobmVpZ2hfbm9kZSk7CisJaWYgKHByaW1hcnlfaWYpCisJCWhhcmRpZl9mcmVlX3JlZihwcmltYXJ5X2lmKTsKKwlpZiAoIXJldCkKKwkJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIHJldDsKKworfQorc3RhdGljIGJvb2wgc2VuZF9teV90dF9yZXNwb25zZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJCXN0cnVjdCB0dF9xdWVyeV9wYWNrZXQgKnR0X3JlcXVlc3QpCit7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSA9IE5VTEw7CisJc3RydWN0IGhhcmRfaWZhY2UgKnByaW1hcnlfaWYgPSBOVUxMOworCXVpbnQ4X3QgbXlfdHR2biwgcmVxX3R0dm4sIHR0dm47CisJaW50IHJldCA9IGZhbHNlOworCXVuc2lnbmVkIGNoYXIgKnR0X2J1ZmY7CisJYm9vbCBmdWxsX3RhYmxlOworCXVpbnQxNl90IHR0X2xlbiwgdHRfdG90OworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCB0dF9xdWVyeV9wYWNrZXQgKnR0X3Jlc3BvbnNlOworCisJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LAorCQkiUmVjZWl2ZWQgVFRfUkVRVUVTVCBmcm9tICVwTSBmb3IgIgorCQkidHR2bjogJXUgKG1lKSBbJWNdXG4iLCB0dF9yZXF1ZXN0LT5zcmMsCisJCXR0X3JlcXVlc3QtPnR0dm4sCisJCSh0dF9yZXF1ZXN0LT5mbGFncyAmIFRUX0ZVTExfVEFCTEUgPyAnRicgOiAnLicpKTsKKworCisJbXlfdHR2biA9ICh1aW50OF90KWF0b21pY19yZWFkKCZiYXRfcHJpdi0+dHR2bik7CisJcmVxX3R0dm4gPSB0dF9yZXF1ZXN0LT50dHZuOworCisJb3JpZ19ub2RlID0gZ2V0X29yaWdfbm9kZShiYXRfcHJpdiwgdHRfcmVxdWVzdC0+c3JjKTsKKwlpZiAoIW9yaWdfbm9kZSkKKwkJZ290byBvdXQ7CisKKwluZWlnaF9ub2RlID0gb3JpZ19ub2RlX2dldF9yb3V0ZXIob3JpZ19ub2RlKTsKKwlpZiAoIW5laWdoX25vZGUpCisJCWdvdG8gb3V0OworCisJcHJpbWFyeV9pZiA9IHByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKKwlpZiAoIXByaW1hcnlfaWYpCisJCWdvdG8gb3V0OworCisJLyogSWYgdGhlIGZ1bGwgdGFibGUgaGFzIGJlZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgb3IgdGhlIGdhcAorCSAqIGlzIHRvbyBiaWcgc2VuZCB0aGUgd2hvbGUgbG9jYWwgdHJhbnNsYXRpb24gdGFibGUgKi8KKwlpZiAodHRfcmVxdWVzdC0+ZmxhZ3MgJiBUVF9GVUxMX1RBQkxFIHx8IG15X3R0dm4gIT0gcmVxX3R0dm4gfHwKKwkgICAgIWJhdF9wcml2LT50dF9idWZmKQorCQlmdWxsX3RhYmxlID0gdHJ1ZTsKKwllbHNlCisJCWZ1bGxfdGFibGUgPSBmYWxzZTsKKworCS8qIEluIHRoaXMgdmVyc2lvbiwgZnJhZ21lbnRhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQsIHRoZW4KKwkgKiBJJ2xsIHNlbmQgb25seSBvbmUgcGFja2V0IHdpdGggYXMgbXVjaCBUVCBlbnRyaWVzIGFzIEkgY2FuICovCisJaWYgKCFmdWxsX3RhYmxlKSB7CisJCXNwaW5fbG9ja19iaCgmYmF0X3ByaXYtPnR0X2J1ZmZfbG9jayk7CisJCXR0X2xlbiA9IGJhdF9wcml2LT50dF9idWZmX2xlbjsKKwkJdHRfdG90ID0gdHRfbGVuIC8gc2l6ZW9mKHN0cnVjdCB0dF9jaGFuZ2UpOworCisJCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCB0dF9xdWVyeV9wYWNrZXQpICsKKwkJCQkgICAgdHRfbGVuICsgRVRIX0hMRU4pOworCQlpZiAoIXNrYikKKwkJCWdvdG8gdW5sb2NrOworCisJCXNrYl9yZXNlcnZlKHNrYiwgRVRIX0hMRU4pOworCQl0dF9yZXNwb25zZSA9IChzdHJ1Y3QgdHRfcXVlcnlfcGFja2V0ICopc2tiX3B1dChza2IsCisJCQkJc2l6ZW9mKHN0cnVjdCB0dF9xdWVyeV9wYWNrZXQpICsgdHRfbGVuKTsKKwkJdHRfcmVzcG9uc2UtPnR0dm4gPSByZXFfdHR2bjsKKwkJdHRfcmVzcG9uc2UtPnR0X2RhdGEgPSBodG9ucyh0dF90b3QpOworCisJCXR0X2J1ZmYgPSBza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCk7CisJCW1lbWNweSh0dF9idWZmLCBiYXRfcHJpdi0+dHRfYnVmZiwKKwkJICAgICAgIGJhdF9wcml2LT50dF9idWZmX2xlbik7CisJCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfYnVmZl9sb2NrKTsKKwl9IGVsc2UgeworCQl0dF9sZW4gPSAodWludDE2X3QpYXRvbWljX3JlYWQoJmJhdF9wcml2LT5udW1fbG9jYWxfdHQpICoKKwkJCQkJCXNpemVvZihzdHJ1Y3QgdHRfY2hhbmdlKTsKKwkJdHR2biA9ICh1aW50OF90KWF0b21pY19yZWFkKCZiYXRfcHJpdi0+dHR2bik7CisKKwkJc2tiID0gdHRfcmVzcG9uc2VfZmlsbF90YWJsZSh0dF9sZW4sIHR0dm4sCisJCQkJCSAgICAgYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2gsCisJCQkJCSAgICAgcHJpbWFyeV9pZiwgdHRfbG9jYWxfdmFsaWRfZW50cnksCisJCQkJCSAgICAgTlVMTCk7CisJCWlmICghc2tiKQorCQkJZ290byBvdXQ7CisKKwkJdHRfcmVzcG9uc2UgPSAoc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCAqKXNrYi0+ZGF0YTsKKwl9CisKKwl0dF9yZXNwb25zZS0+cGFja2V0X3R5cGUgPSBCQVRfVFRfUVVFUlk7CisJdHRfcmVzcG9uc2UtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKKwl0dF9yZXNwb25zZS0+dHRsID0gVFRMOworCW1lbWNweSh0dF9yZXNwb25zZS0+c3JjLCBwcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweSh0dF9yZXNwb25zZS0+ZHN0LCB0dF9yZXF1ZXN0LT5zcmMsIEVUSF9BTEVOKTsKKwl0dF9yZXNwb25zZS0+ZmxhZ3MgPSBUVF9SRVNQT05TRTsKKworCWlmIChmdWxsX3RhYmxlKQorCQl0dF9yZXNwb25zZS0+ZmxhZ3MgfD0gVFRfRlVMTF9UQUJMRTsKKworCWJhdF9kYmcoREJHX1RULCBiYXRfcHJpdiwKKwkJIlNlbmRpbmcgVFRfUkVTUE9OU0UgdG8gJXBNIHZpYSAlcE0gWyVjXVxuIiwKKwkJb3JpZ19ub2RlLT5vcmlnLCBuZWlnaF9ub2RlLT5hZGRyLAorCQkodHRfcmVzcG9uc2UtPmZsYWdzICYgVFRfRlVMTF9UQUJMRSA/ICdGJyA6ICcuJykpOworCisJc2VuZF9za2JfcGFja2V0KHNrYiwgbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcsIG5laWdoX25vZGUtPmFkZHIpOworCXJldCA9IHRydWU7CisJZ290byBvdXQ7CisKK3VubG9jazoKKwlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0X2J1ZmZfbG9jayk7CitvdXQ6CisJaWYgKG9yaWdfbm9kZSkKKwkJb3JpZ19ub2RlX2ZyZWVfcmVmKG9yaWdfbm9kZSk7CisJaWYgKG5laWdoX25vZGUpCisJCW5laWdoX25vZGVfZnJlZV9yZWYobmVpZ2hfbm9kZSk7CisJaWYgKHByaW1hcnlfaWYpCisJCWhhcmRpZl9mcmVlX3JlZihwcmltYXJ5X2lmKTsKKwlpZiAoIXJldCkKKwkJa2ZyZWVfc2tiKHNrYik7CisJLyogVGhpcyBwYWNrZXQgd2FzIGZvciBtZSwgc28gaXQgZG9lc24ndCBuZWVkIHRvIGJlIHJlLXJvdXRlZCAqLworCXJldHVybiB0cnVlOworfQorCitib29sIHNlbmRfdHRfcmVzcG9uc2Uoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKKwkJICAgICAgc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCAqdHRfcmVxdWVzdCkKK3sKKwlpZiAoaXNfbXlfbWFjKHR0X3JlcXVlc3QtPmRzdCkpCisJCXJldHVybiBzZW5kX215X3R0X3Jlc3BvbnNlKGJhdF9wcml2LCB0dF9yZXF1ZXN0KTsKKwllbHNlCisJCXJldHVybiBzZW5kX290aGVyX3R0X3Jlc3BvbnNlKGJhdF9wcml2LCB0dF9yZXF1ZXN0KTsKK30KKworc3RhdGljIHZvaWQgX3R0X3VwZGF0ZV9jaGFuZ2VzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgICAgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAorCQkJICAgICAgIHN0cnVjdCB0dF9jaGFuZ2UgKnR0X2NoYW5nZSwKKwkJCSAgICAgICB1aW50MTZfdCB0dF9udW1fY2hhbmdlcywgdWludDhfdCB0dHZuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHR0X251bV9jaGFuZ2VzOyBpKyspIHsKKwkJaWYgKCh0dF9jaGFuZ2UgKyBpKS0+ZmxhZ3MgJiBUVF9DTElFTlRfREVMKQorCQkJdHRfZ2xvYmFsX2RlbChiYXRfcHJpdiwgb3JpZ19ub2RlLAorCQkJCSAgICAgICh0dF9jaGFuZ2UgKyBpKS0+YWRkciwKKwkJCQkgICAgICAidHQgcmVtb3ZlZCBieSBjaGFuZ2VzIiwKKwkJCQkgICAgICAodHRfY2hhbmdlICsgaSktPmZsYWdzICYgVFRfQ0xJRU5UX1JPQU0pOworCQllbHNlCisJCQlpZiAoIXR0X2dsb2JhbF9hZGQoYmF0X3ByaXYsIG9yaWdfbm9kZSwKKwkJCQkJICAgKHR0X2NoYW5nZSArIGkpLT5hZGRyLCB0dHZuLCBmYWxzZSkpCisJCQkJLyogSW4gY2FzZSBvZiBwcm9ibGVtIHdoaWxlIHN0b3JpbmcgYQorCQkJCSAqIGdsb2JhbF9lbnRyeSwgd2Ugc3RvcCB0aGUgdXBkYXRpbmcKKwkJCQkgKiBwcm9jZWR1cmUgd2l0aG91dCBjb21taXR0aW5nIHRoZQorCQkJCSAqIHR0dm4gY2hhbmdlLiBUaGlzIHdpbGwgYXZvaWQgdG8gc2VuZAorCQkJCSAqIGNvcnJ1cHRlZCBkYXRhIG9uIHR0X3JlcXVlc3QKKwkJCQkgKi8KKwkJCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZCB0dF9maWxsX2d0YWJsZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJICAgc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCAqdHRfcmVzcG9uc2UpCit7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlID0gTlVMTDsKKworCW9yaWdfbm9kZSA9IG9yaWdfaGFzaF9maW5kKGJhdF9wcml2LCB0dF9yZXNwb25zZS0+c3JjKTsKKwlpZiAoIW9yaWdfbm9kZSkKKwkJZ290byBvdXQ7CisKKwkvKiBQdXJnZSB0aGUgb2xkIHRhYmxlIGZpcnN0Li4gKi8KKwl0dF9nbG9iYWxfZGVsX29yaWcoYmF0X3ByaXYsIG9yaWdfbm9kZSwgIlJlY2VpdmVkIGZ1bGwgdGFibGUiKTsKKworCV90dF91cGRhdGVfY2hhbmdlcyhiYXRfcHJpdiwgb3JpZ19ub2RlLAorCQkJICAgKHN0cnVjdCB0dF9jaGFuZ2UgKikodHRfcmVzcG9uc2UgKyAxKSwKKwkJCSAgIHR0X3Jlc3BvbnNlLT50dF9kYXRhLCB0dF9yZXNwb25zZS0+dHR2bik7CisKKwlzcGluX2xvY2tfYmgoJm9yaWdfbm9kZS0+dHRfYnVmZl9sb2NrKTsKKwlrZnJlZShvcmlnX25vZGUtPnR0X2J1ZmYpOworCW9yaWdfbm9kZS0+dHRfYnVmZl9sZW4gPSAwOworCW9yaWdfbm9kZS0+dHRfYnVmZiA9IE5VTEw7CisJc3Bpbl91bmxvY2tfYmgoJm9yaWdfbm9kZS0+dHRfYnVmZl9sb2NrKTsKKworCWF0b21pY19zZXQoJm9yaWdfbm9kZS0+bGFzdF90dHZuLCB0dF9yZXNwb25zZS0+dHR2bik7CisKK291dDoKKwlpZiAob3JpZ19ub2RlKQorCQlvcmlnX25vZGVfZnJlZV9yZWYob3JpZ19ub2RlKTsKK30KKwordm9pZCB0dF91cGRhdGVfY2hhbmdlcyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCisJCSAgICAgICB1aW50MTZfdCB0dF9udW1fY2hhbmdlcywgdWludDhfdCB0dHZuLAorCQkgICAgICAgc3RydWN0IHR0X2NoYW5nZSAqdHRfY2hhbmdlKQoreworCV90dF91cGRhdGVfY2hhbmdlcyhiYXRfcHJpdiwgb3JpZ19ub2RlLCB0dF9jaGFuZ2UsIHR0X251bV9jaGFuZ2VzLAorCQkJICAgdHR2bik7CisKKwl0dF9zYXZlX29yaWdfYnVmZmVyKGJhdF9wcml2LCBvcmlnX25vZGUsICh1bnNpZ25lZCBjaGFyICopdHRfY2hhbmdlLAorCQkJICAgIHR0X251bV9jaGFuZ2VzKTsKKwlhdG9taWNfc2V0KCZvcmlnX25vZGUtPmxhc3RfdHR2biwgdHR2bik7Cit9CisKK2Jvb2wgaXNfbXlfY2xpZW50KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIGNvbnN0IHVpbnQ4X3QgKmFkZHIpCit7CisJc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeSA9IE5VTEw7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCXR0X2xvY2FsX2VudHJ5ID0gdHRfbG9jYWxfaGFzaF9maW5kKGJhdF9wcml2LCBhZGRyKTsKKwlpZiAoIXR0X2xvY2FsX2VudHJ5KQorCQlnb3RvIG91dDsKKwkvKiBDaGVjayBpZiB0aGUgY2xpZW50IGhhcyBiZWVuIGxvZ2ljYWxseSBkZWxldGVkIChidXQgaXMga2VwdCBmb3IKKwkgKiBjb25zaXN0ZW5jeSBwdXJwb3NlKSAqLworCWlmICh0dF9sb2NhbF9lbnRyeS0+ZmxhZ3MgJiBUVF9DTElFTlRfUEVORElORykKKwkJZ290byBvdXQ7CisJcmV0ID0gdHJ1ZTsKK291dDoKKwlpZiAodHRfbG9jYWxfZW50cnkpCisJCXR0X2xvY2FsX2VudHJ5X2ZyZWVfcmVmKHR0X2xvY2FsX2VudHJ5KTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGhhbmRsZV90dF9yZXNwb25zZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkJc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCAqdHRfcmVzcG9uc2UpCit7CisJc3RydWN0IHR0X3JlcV9ub2RlICpub2RlLCAqc2FmZTsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUgPSBOVUxMOworCisJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LCAiUmVjZWl2ZWQgVFRfUkVTUE9OU0UgZnJvbSAlcE0gZm9yICIKKwkJInR0dm4gJWQgdF9zaXplOiAlZCBbJWNdXG4iLAorCQl0dF9yZXNwb25zZS0+c3JjLCB0dF9yZXNwb25zZS0+dHR2biwKKwkJdHRfcmVzcG9uc2UtPnR0X2RhdGEsCisJCSh0dF9yZXNwb25zZS0+ZmxhZ3MgJiBUVF9GVUxMX1RBQkxFID8gJ0YnIDogJy4nKSk7CisKKwlvcmlnX25vZGUgPSBvcmlnX2hhc2hfZmluZChiYXRfcHJpdiwgdHRfcmVzcG9uc2UtPnNyYyk7CisJaWYgKCFvcmlnX25vZGUpCisJCWdvdG8gb3V0OworCisJaWYgKHR0X3Jlc3BvbnNlLT5mbGFncyAmIFRUX0ZVTExfVEFCTEUpCisJCXR0X2ZpbGxfZ3RhYmxlKGJhdF9wcml2LCB0dF9yZXNwb25zZSk7CisJZWxzZQorCQl0dF91cGRhdGVfY2hhbmdlcyhiYXRfcHJpdiwgb3JpZ19ub2RlLCB0dF9yZXNwb25zZS0+dHRfZGF0YSwKKwkJCQkgIHR0X3Jlc3BvbnNlLT50dHZuLAorCQkJCSAgKHN0cnVjdCB0dF9jaGFuZ2UgKikodHRfcmVzcG9uc2UgKyAxKSk7CisKKwkvKiBEZWxldGUgdGhlIHR0X3JlcV9ub2RlIGZyb20gcGVuZGluZyB0dF9yZXF1ZXN0cyBsaXN0ICovCisJc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHRfcmVxX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5vZGUsIHNhZmUsICZiYXRfcHJpdi0+dHRfcmVxX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFjb21wYXJlX2V0aChub2RlLT5hZGRyLCB0dF9yZXNwb25zZS0+c3JjKSkKKwkJCWNvbnRpbnVlOworCQlsaXN0X2RlbCgmbm9kZS0+bGlzdCk7CisJCWtmcmVlKG5vZGUpOworCX0KKwlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0X3JlcV9saXN0X2xvY2spOworCisJLyogUmVjYWxjdWxhdGUgdGhlIENSQyBmb3IgdGhpcyBvcmlnX25vZGUgYW5kIHN0b3JlIGl0ICovCisJb3JpZ19ub2RlLT50dF9jcmMgPSB0dF9nbG9iYWxfY3JjKGJhdF9wcml2LCBvcmlnX25vZGUpOworCS8qIFJvYW1pbmcgcGhhc2UgaXMgb3ZlcjogdGFibGVzIGFyZSBpbiBzeW5jIGFnYWluLiBJIGNhbgorCSAqIHVuc2V0IHRoZSBmbGFnICovCisJb3JpZ19ub2RlLT50dF9wb3NzX2NoYW5nZSA9IGZhbHNlOworb3V0OgorCWlmIChvcmlnX25vZGUpCisJCW9yaWdfbm9kZV9mcmVlX3JlZihvcmlnX25vZGUpOworfQorCitpbnQgdHRfaW5pdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQoreworCWlmICghdHRfbG9jYWxfaW5pdChiYXRfcHJpdikpCisJCXJldHVybiAwOworCisJaWYgKCF0dF9nbG9iYWxfaW5pdChiYXRfcHJpdikpCisJCXJldHVybiAwOworCisJdHRfc3RhcnRfdGltZXIoYmF0X3ByaXYpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHR0X3JvYW1fbGlzdF9mcmVlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCit7CisJc3RydWN0IHR0X3JvYW1fbm9kZSAqbm9kZSwgKnNhZmU7CisKKwlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dF9yb2FtX2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgc2FmZSwgJmJhdF9wcml2LT50dF9yb2FtX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJm5vZGUtPmxpc3QpOworCQlrZnJlZShub2RlKTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0X3JvYW1fbGlzdF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgdHRfcm9hbV9wdXJnZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQoreworCXN0cnVjdCB0dF9yb2FtX25vZGUgKm5vZGUsICpzYWZlOworCisJc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHRfcm9hbV9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCBzYWZlLCAmYmF0X3ByaXYtPnR0X3JvYW1fbGlzdCwgbGlzdCkgeworCQlpZiAoIWlzX291dF9vZl90aW1lKG5vZGUtPmZpcnN0X3RpbWUsCisJCQkJICAgIFJPQU1JTkdfTUFYX1RJTUUgKiAxMDAwKSkKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZGVsKCZub2RlLT5saXN0KTsKKwkJa2ZyZWUobm9kZSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHRfcm9hbV9saXN0X2xvY2spOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBjbGllbnQgYWxyZWFkeSByZWFjaGVkIHRoZQorICogbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUgcm9hbWluZyBwaGFzZXMuIEluIHRoaXMgY2FzZSB0aGUgUk9BTUlOR19BRFYKKyAqIHdpbGwgbm90IGJlIHNlbnQuCisgKgorICogcmV0dXJucyB0cnVlIGlmIHRoZSBST0FNSU5HX0FEViBjYW4gYmUgc2VudCwgZmFsc2Ugb3RoZXJ3aXNlICovCitzdGF0aWMgYm9vbCB0dF9jaGVja19yb2FtX2NvdW50KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCQkJdWludDhfdCAqY2xpZW50KQoreworCXN0cnVjdCB0dF9yb2FtX25vZGUgKnR0X3JvYW1fbm9kZTsKKwlib29sIHJldCA9IGZhbHNlOworCisJc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHRfcm9hbV9saXN0X2xvY2spOworCS8qIFRoZSBuZXcgdHRfcmVxIHdpbGwgYmUgaXNzdWVkIG9ubHkgaWYgSSdtIG5vdCB3YWl0aW5nIGZvciBhCisJICogcmVwbHkgZnJvbSB0aGUgc2FtZSBvcmlnX25vZGUgeWV0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0dF9yb2FtX25vZGUsICZiYXRfcHJpdi0+dHRfcm9hbV9saXN0LCBsaXN0KSB7CisJCWlmICghY29tcGFyZV9ldGgodHRfcm9hbV9ub2RlLT5hZGRyLCBjbGllbnQpKQorCQkJY29udGludWU7CisKKwkJaWYgKGlzX291dF9vZl90aW1lKHR0X3JvYW1fbm9kZS0+Zmlyc3RfdGltZSwKKwkJCQkgICBST0FNSU5HX01BWF9USU1FICogMTAwMCkpCisJCQljb250aW51ZTsKKworCQlpZiAoIWF0b21pY19kZWNfbm90X3plcm8oJnR0X3JvYW1fbm9kZS0+Y291bnRlcikpCisJCQkvKiBTb3JyeSwgeW91IHJvYW1lZCB0b28gbWFueSB0aW1lcyEgKi8KKwkJCWdvdG8gdW5sb2NrOworCQlyZXQgPSB0cnVlOworCQlicmVhazsKKwl9CisKKwlpZiAoIXJldCkgeworCQl0dF9yb2FtX25vZGUgPSBrbWFsbG9jKHNpemVvZigqdHRfcm9hbV9ub2RlKSwgR0ZQX0FUT01JQyk7CisJCWlmICghdHRfcm9hbV9ub2RlKQorCQkJZ290byB1bmxvY2s7CisKKwkJdHRfcm9hbV9ub2RlLT5maXJzdF90aW1lID0gamlmZmllczsKKwkJYXRvbWljX3NldCgmdHRfcm9hbV9ub2RlLT5jb3VudGVyLCBST0FNSU5HX01BWF9DT1VOVCAtIDEpOworCQltZW1jcHkodHRfcm9hbV9ub2RlLT5hZGRyLCBjbGllbnQsIEVUSF9BTEVOKTsKKworCQlsaXN0X2FkZCgmdHRfcm9hbV9ub2RlLT5saXN0LCAmYmF0X3ByaXYtPnR0X3JvYW1fbGlzdCk7CisJCXJldCA9IHRydWU7CisJfQorCit1bmxvY2s6CisJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dF9yb2FtX2xpc3RfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzZW5kX3JvYW1fYWR2KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHVpbnQ4X3QgKmNsaWVudCwKKwkJICAgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlKQoreworCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3Qgcm9hbV9hZHZfcGFja2V0ICpyb2FtX2Fkdl9wYWNrZXQ7CisJaW50IHJldCA9IDE7CisJc3RydWN0IGhhcmRfaWZhY2UgKnByaW1hcnlfaWY7CisKKwkvKiBiZWZvcmUgZ29pbmcgb24gd2UgaGF2ZSB0byBjaGVjayB3aGV0aGVyIHRoZSBjbGllbnQgaGFzCisJICogYWxyZWFkeSByb2FtZWQgdG8gdXMgdG9vIG1hbnkgdGltZXMgKi8KKwlpZiAoIXR0X2NoZWNrX3JvYW1fY291bnQoYmF0X3ByaXYsIGNsaWVudCkpCisJCWdvdG8gb3V0OworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IHJvYW1fYWR2X3BhY2tldCkgKyBFVEhfSExFTik7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJc2tiX3Jlc2VydmUoc2tiLCBFVEhfSExFTik7CisKKwlyb2FtX2Fkdl9wYWNrZXQgPSAoc3RydWN0IHJvYW1fYWR2X3BhY2tldCAqKXNrYl9wdXQoc2tiLAorCQkJCQlzaXplb2Yoc3RydWN0IHJvYW1fYWR2X3BhY2tldCkpOworCisJcm9hbV9hZHZfcGFja2V0LT5wYWNrZXRfdHlwZSA9IEJBVF9ST0FNX0FEVjsKKwlyb2FtX2Fkdl9wYWNrZXQtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKKwlyb2FtX2Fkdl9wYWNrZXQtPnR0bCA9IFRUTDsKKwlwcmltYXJ5X2lmID0gcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCWlmICghcHJpbWFyeV9pZikKKwkJZ290byBvdXQ7CisJbWVtY3B5KHJvYW1fYWR2X3BhY2tldC0+c3JjLCBwcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWhhcmRpZl9mcmVlX3JlZihwcmltYXJ5X2lmKTsKKwltZW1jcHkocm9hbV9hZHZfcGFja2V0LT5kc3QsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOworCW1lbWNweShyb2FtX2Fkdl9wYWNrZXQtPmNsaWVudCwgY2xpZW50LCBFVEhfQUxFTik7CisKKwluZWlnaF9ub2RlID0gb3JpZ19ub2RlX2dldF9yb3V0ZXIob3JpZ19ub2RlKTsKKwlpZiAoIW5laWdoX25vZGUpCisJCWdvdG8gb3V0OworCisJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LAorCQkiU2VuZGluZyBST0FNSU5HX0FEViB0byAlcE0gKGNsaWVudCAlcE0pIHZpYSAlcE1cbiIsCisJCW9yaWdfbm9kZS0+b3JpZywgY2xpZW50LCBuZWlnaF9ub2RlLT5hZGRyKTsKKworCXNlbmRfc2tiX3BhY2tldChza2IsIG5laWdoX25vZGUtPmlmX2luY29taW5nLCBuZWlnaF9ub2RlLT5hZGRyKTsKKwlyZXQgPSAwOworCitvdXQ6CisJaWYgKG5laWdoX25vZGUpCisJCW5laWdoX25vZGVfZnJlZV9yZWYobmVpZ2hfbm9kZSk7CisJaWYgKHJldCkKKwkJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB0dF9wdXJnZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZGVsYXllZF93b3JrID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPQorCQljb250YWluZXJfb2YoZGVsYXllZF93b3JrLCBzdHJ1Y3QgYmF0X3ByaXYsIHR0X3dvcmspOworCisJdHRfbG9jYWxfcHVyZ2UoYmF0X3ByaXYpOworCXR0X2dsb2JhbF9yb2FtX3B1cmdlKGJhdF9wcml2KTsKKwl0dF9yZXFfcHVyZ2UoYmF0X3ByaXYpOworCXR0X3JvYW1fcHVyZ2UoYmF0X3ByaXYpOworCisJdHRfc3RhcnRfdGltZXIoYmF0X3ByaXYpOworfQorCit2b2lkIHR0X2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKK3sKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmJhdF9wcml2LT50dF93b3JrKTsKKworCXR0X2xvY2FsX3RhYmxlX2ZyZWUoYmF0X3ByaXYpOworCXR0X2dsb2JhbF90YWJsZV9mcmVlKGJhdF9wcml2KTsKKwl0dF9yZXFfbGlzdF9mcmVlKGJhdF9wcml2KTsKKwl0dF9jaGFuZ2VzX2xpc3RfZnJlZShiYXRfcHJpdik7CisJdHRfcm9hbV9saXN0X2ZyZWUoYmF0X3ByaXYpOworCisJa2ZyZWUoYmF0X3ByaXYtPnR0X2J1ZmYpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIHNwZWNpZmllZCBmbGFncyBmcm9tIGFsbCB0aGUgZW50cmllcyBpbgorICogdGhlIGdpdmVuIGhhc2ggdGFibGUgYW5kIHdpbGwgaW5jcmVtZW50IG51bV9sb2NhbF90dCBmb3IgZWFjaCBpbnZvbHZlZAorICogZW50cnkgKi8KK3N0YXRpYyB2b2lkIHR0X2xvY2FsX3Jlc2V0X2ZsYWdzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHVpbnQxNl90IGZsYWdzKQoreworCWludCBpOworCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCA9IGJhdF9wcml2LT50dF9sb2NhbF9oYXNoOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnk7CisKKwlpZiAoIWhhc2gpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5zaXplOyBpKyspIHsKKwkJaGVhZCA9ICZoYXNoLT50YWJsZVtpXTsKKworCQlyY3VfcmVhZF9sb2NrKCk7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0dF9sb2NhbF9lbnRyeSwgbm9kZSwKKwkJCQkJIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJCXR0X2xvY2FsX2VudHJ5LT5mbGFncyAmPSB+ZmxhZ3M7CisJCQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+bnVtX2xvY2FsX3R0KTsKKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisKK30KKworLyogUHVyZ2Ugb3V0IGFsbCB0aGUgdHQgbG9jYWwgZW50cmllcyBtYXJrZWQgd2l0aCBUVF9DTElFTlRfUEVORElORyAqLworc3RhdGljIHZvaWQgdHRfbG9jYWxfcHVyZ2VfcGVuZGluZ19jbGllbnRzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCit7CisJc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoID0gYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2g7CisJc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5vZGVfdG1wOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXNwaW5sb2NrX3QgKmxpc3RfbG9jazsgLyogcHJvdGVjdHMgd3JpdGUgYWNjZXNzIHRvIHRoZSBoYXNoIGxpc3RzICovCisJaW50IGk7CisKKwlpZiAoIWhhc2gpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5zaXplOyBpKyspIHsKKwkJaGVhZCA9ICZoYXNoLT50YWJsZVtpXTsKKwkJbGlzdF9sb2NrID0gJmhhc2gtPmxpc3RfbG9ja3NbaV07CisKKwkJc3Bpbl9sb2NrX2JoKGxpc3RfbG9jayk7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHRfbG9jYWxfZW50cnksIG5vZGUsIG5vZGVfdG1wLAorCQkJCQkgIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJCWlmICghKHR0X2xvY2FsX2VudHJ5LT5mbGFncyAmIFRUX0NMSUVOVF9QRU5ESU5HKSkKKwkJCQljb250aW51ZTsKKworCQkJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LCAiRGVsZXRpbmcgbG9jYWwgdHQgZW50cnkgIgorCQkJCSIoJXBNKTogcGVuZGluZ1xuIiwgdHRfbG9jYWxfZW50cnktPmFkZHIpOworCisJCQlhdG9taWNfZGVjKCZiYXRfcHJpdi0+bnVtX2xvY2FsX3R0KTsKKwkJCWhsaXN0X2RlbF9yY3Uobm9kZSk7CisJCQl0dF9sb2NhbF9lbnRyeV9mcmVlX3JlZih0dF9sb2NhbF9lbnRyeSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgobGlzdF9sb2NrKTsKKwl9CisKK30KKwordm9pZCB0dF9jb21taXRfY2hhbmdlcyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQoreworCXR0X2xvY2FsX3Jlc2V0X2ZsYWdzKGJhdF9wcml2LCBUVF9DTElFTlRfTkVXKTsKKwl0dF9sb2NhbF9wdXJnZV9wZW5kaW5nX2NsaWVudHMoYmF0X3ByaXYpOworCisJLyogSW5jcmVtZW50IHRoZSBUVFZOIG9ubHkgb25jZSBwZXIgT0dNIGludGVydmFsICovCisJYXRvbWljX2luYygmYmF0X3ByaXYtPnR0dm4pOworCWJhdF9wcml2LT50dF9wb3NzX2NoYW5nZSA9IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaCBiL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmgKaW5kZXggNDYxNTJjMy4uZDQxMjJjYiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaAorKysgYi9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oCkBAIC0yMiwyMiArMjIsNDUgQEAKICNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1RSQU5TTEFUSU9OX1RBQkxFX0hfCiAjZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9UUkFOU0xBVElPTl9UQUJMRV9IXwogCi1pbnQgdHRfbG9jYWxfaW5pdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLXZvaWQgdHRfbG9jYWxfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlLCB1aW50OF90ICphZGRyKTsKK2ludCB0dF9sZW4oaW50IGNoYW5nZXNfbnVtKTsKK2ludCB0dF9jaGFuZ2VzX2ZpbGxfYnVmZmVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCQkgICB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgYnVmZl9sZW4pOworaW50IHR0X2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Cit2b2lkIHR0X2xvY2FsX2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSwgY29uc3QgdWludDhfdCAqYWRkcik7CiB2b2lkIHR0X2xvY2FsX3JlbW92ZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkgICAgICB1aW50OF90ICphZGRyLCBjaGFyICptZXNzYWdlKTsKLWludCB0dF9sb2NhbF9maWxsX2J1ZmZlcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgYnVmZl9sZW4pOworCQkgICAgIGNvbnN0IHVpbnQ4X3QgKmFkZHIsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGJvb2wgcm9hbWluZyk7CiBpbnQgdHRfbG9jYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7Ci12b2lkIHR0X2xvY2FsX2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci1pbnQgdHRfZ2xvYmFsX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci12b2lkIHR0X2dsb2JhbF9hZGRfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCSB1bnNpZ25lZCBjaGFyICp0dF9idWZmLCBpbnQgdHRfYnVmZl9sZW4pOwordm9pZCB0dF9nbG9iYWxfYWRkX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqdHRfYnVmZiwgaW50IHR0X2J1ZmZfbGVuKTsKK2ludCB0dF9nbG9iYWxfYWRkKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCSAgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLAorCQkgIHVpbnQ4X3QgdHR2biwgYm9vbCByb2FtaW5nKTsKIGludCB0dF9nbG9iYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CiB2b2lkIHR0X2dsb2JhbF9kZWxfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgY2hhciAqbWVzc2FnZSk7Ci12b2lkIHR0X2dsb2JhbF9mcmVlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwotc3RydWN0IG9yaWdfbm9kZSAqdHJhbnN0YWJsZV9zZWFyY2goc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgdWludDhfdCAqYWRkcik7CisJCQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwordm9pZCB0dF9nbG9iYWxfZGVsKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCSAgIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwKKwkJICAgY29uc3QgY2hhciAqbWVzc2FnZSwgYm9vbCByb2FtaW5nKTsKK3N0cnVjdCBvcmlnX25vZGUgKnRyYW5zdGFibGVfc2VhcmNoKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCQkJICAgIGNvbnN0IHVpbnQ4X3QgKmFkZHIpOwordm9pZCB0dF9zYXZlX29yaWdfYnVmZmVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICp0dF9idWZmLCB1aW50OF90IHR0X251bV9jaGFuZ2VzKTsKK3VpbnQxNl90IHR0X2xvY2FsX2NyYyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKK3VpbnQxNl90IHR0X2dsb2JhbF9jcmMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlKTsKK3ZvaWQgdHRfZnJlZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKK2ludCBzZW5kX3R0X3JlcXVlc3Qoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKKwkJICAgIHN0cnVjdCBvcmlnX25vZGUgKmRzdF9vcmlnX25vZGUsIHVpbnQ4X3QgaHZuLAorCQkgICAgdWludDE2X3QgdHRfY3JjLCBib29sIGZ1bGxfdGFibGUpOworYm9vbCBzZW5kX3R0X3Jlc3BvbnNlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCSAgICAgIHN0cnVjdCB0dF9xdWVyeV9wYWNrZXQgKnR0X3JlcXVlc3QpOwordm9pZCB0dF91cGRhdGVfY2hhbmdlcyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCisJCSAgICAgICB1aW50MTZfdCB0dF9udW1fY2hhbmdlcywgdWludDhfdCB0dHZuLAorCQkgICAgICAgc3RydWN0IHR0X2NoYW5nZSAqdHRfY2hhbmdlKTsKK2Jvb2wgaXNfbXlfY2xpZW50KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIGNvbnN0IHVpbnQ4X3QgKmFkZHIpOwordm9pZCBoYW5kbGVfdHRfcmVzcG9uc2Uoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKKwkJCXN0cnVjdCB0dF9xdWVyeV9wYWNrZXQgKnR0X3Jlc3BvbnNlKTsKK3ZvaWQgc2VuZF9yb2FtX2FkdihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCB1aW50OF90ICpjbGllbnQsCisJCSAgIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSk7Cit2b2lkIHR0X2NvbW1pdF9jaGFuZ2VzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwogCiAjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1RSQU5TTEFUSU9OX1RBQkxFX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi90eXBlcy5oIGIvbmV0L2JhdG1hbi1hZHYvdHlwZXMuaAppbmRleCBmYWI3MGU4Li4yNWJkMWRiIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi90eXBlcy5oCisrKyBiL25ldC9iYXRtYW4tYWR2L3R5cGVzLmgKQEAgLTc1LDggKzc1LDE4IEBACiAJdW5zaWduZWQgbG9uZyBiYXRtYW5fc2Vxbm9fcmVzZXQ7CiAJdWludDhfdCBnd19mbGFnczsKIAl1aW50OF90IGZsYWdzOworCWF0b21pY190IGxhc3RfdHR2bjsgLyogbGFzdCBzZWVuIHRyYW5zbGF0aW9uIHRhYmxlIHZlcnNpb24gbnVtYmVyICovCisJdWludDE2X3QgdHRfY3JjOwogCXVuc2lnbmVkIGNoYXIgKnR0X2J1ZmY7CiAJaW50MTZfdCB0dF9idWZmX2xlbjsKKwlzcGlubG9ja190IHR0X2J1ZmZfbG9jazsgLyogcHJvdGVjdHMgdHRfYnVmZiAqLworCWF0b21pY190IHR0X3NpemU7CisJLyogVGhlIHR0X3Bvc3NfY2hhbmdlIGZsYWcgaXMgdXNlZCB0byBkZXRlY3QgYW4gb25nb2luZyByb2FtaW5nIHBoYXNlLgorCSAqIElmIHRydWUsIHRoZW4gSSBzZW50IGEgUm9hbWluZ19hZHYgdG8gdGhpcyBvcmlnX25vZGUgYW5kIEkgaGF2ZSB0bworCSAqIGluc3BlY3QgZXZlcnkgcGFja2V0IGRpcmVjdGVkIHRvIGl0IHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMgc3RpbGwKKwkgKiB0aGUgdHJ1ZSBkZXN0aW5hdGlvbiBvciBub3QuIFRoaXMgZmxhZyB3aWxsIGJlIHJlc2V0IHRvIGZhbHNlIGFzCisJICogc29vbiBhcyBJIHJlY2VpdmUgYSBuZXcgVFRWTiBmcm9tIHRoaXMgb3JpZ19ub2RlICovCisJYm9vbCB0dF9wb3NzX2NoYW5nZTsKIAl1aW50MzJfdCBsYXN0X3JlYWxfc2Vxbm87CiAJdWludDhfdCBsYXN0X3R0bDsKIAl1bnNpZ25lZCBsb25nIGJjYXN0X2JpdHNbTlVNX1dPUkRTXTsKQEAgLTk0LDYgKzEwNCw3IEBACiAJc3BpbmxvY2tfdCBvZ21fY250X2xvY2s7CiAJLyogYmNhc3Rfc2Vxbm9fbG9jayBwcm90ZWN0cyBiY2FzdF9iaXRzLCBsYXN0X2JjYXN0X3NlcW5vICovCiAJc3BpbmxvY2tfdCBiY2FzdF9zZXFub19sb2NrOworCXNwaW5sb2NrX3QgdHRfbGlzdF9sb2NrOyAvKiBwcm90ZWN0cyB0dF9saXN0ICovCiAJYXRvbWljX3QgYm9uZF9jYW5kaWRhdGVzOwogCXN0cnVjdCBsaXN0X2hlYWQgYm9uZF9saXN0OwogfTsKQEAgLTE0NSw2ICsxNTYsMTUgQEAKIAlhdG9taWNfdCBiY2FzdF9zZXFubzsKIAlhdG9taWNfdCBiY2FzdF9xdWV1ZV9sZWZ0OwogCWF0b21pY190IGJhdG1hbl9xdWV1ZV9sZWZ0OworCWF0b21pY190IHR0dm47IC8qIHRyYW5sYXRpb24gdGFibGUgdmVyc2lvbiBudW1iZXIgKi8KKwlhdG9taWNfdCB0dF9vZ21fYXBwZW5kX2NudDsKKwlhdG9taWNfdCB0dF9sb2NhbF9jaGFuZ2VzOyAvKiBjaGFuZ2VzIHJlZ2lzdGVyZWQgaW4gYSBPR00gaW50ZXJ2YWwgKi8KKwkvKiBUaGUgdHRfcG9zc19jaGFuZ2UgZmxhZyBpcyB1c2VkIHRvIGRldGVjdCBhbiBvbmdvaW5nIHJvYW1pbmcgcGhhc2UuCisJICogSWYgdHJ1ZSwgdGhlbiBJIHJlY2VpdmVkIGEgUm9hbWluZ19hZHYgYW5kIEkgaGF2ZSB0byBpbnNwZWN0IGV2ZXJ5CisJICogcGFja2V0IGRpcmVjdGVkIHRvIG1lIHRvIGNoZWNrIHdoZXRoZXIgSSBhbSBzdGlsbCB0aGUgdHJ1ZQorCSAqIGRlc3RpbmF0aW9uIG9yIG5vdC4gVGhpcyBmbGFnIHdpbGwgYmUgcmVzZXQgdG8gZmFsc2UgYXMgc29vbiBhcyBJCisJICogaW5jcmVhc2UgbXkgVFRWTiAqLworCWJvb2wgdHRfcG9zc19jaGFuZ2U7CiAJY2hhciBudW1faWZhY2VzOwogCXN0cnVjdCBkZWJ1Z19sb2cgKmRlYnVnX2xvZzsKIAlzdHJ1Y3Qga29iamVjdCAqbWVzaF9vYmo7CkBAIC0xNTMsMjYgKzE3MywzNSBAQAogCXN0cnVjdCBobGlzdF9oZWFkIGZvcndfYmNhc3RfbGlzdDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCBnd19saXN0OwogCXN0cnVjdCBobGlzdF9oZWFkIHNvZnRpZl9uZWlnaF92aWRzOworCXN0cnVjdCBsaXN0X2hlYWQgdHRfY2hhbmdlc19saXN0OyAvKiB0cmFja3MgY2hhbmdlcyBpbiBhIE9HTSBpbnQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHZpc19zZW5kX2xpc3Q7CiAJc3RydWN0IGhhc2h0YWJsZV90ICpvcmlnX2hhc2g7CiAJc3RydWN0IGhhc2h0YWJsZV90ICp0dF9sb2NhbF9oYXNoOwogCXN0cnVjdCBoYXNodGFibGVfdCAqdHRfZ2xvYmFsX2hhc2g7CisJc3RydWN0IGxpc3RfaGVhZCB0dF9yZXFfbGlzdDsgLyogbGlzdCBvZiBwZW5kaW5nIHR0X3JlcXVlc3RzICovCisJc3RydWN0IGxpc3RfaGVhZCB0dF9yb2FtX2xpc3Q7CiAJc3RydWN0IGhhc2h0YWJsZV90ICp2aXNfaGFzaDsKIAlzcGlubG9ja190IGZvcndfYmF0X2xpc3RfbG9jazsgLyogcHJvdGVjdHMgZm9yd19iYXRfbGlzdCAqLwogCXNwaW5sb2NrX3QgZm9yd19iY2FzdF9saXN0X2xvY2s7IC8qIHByb3RlY3RzICAqLwotCXNwaW5sb2NrX3QgdHRfbGhhc2hfbG9jazsgLyogcHJvdGVjdHMgdHRfbG9jYWxfaGFzaCAqLwotCXNwaW5sb2NrX3QgdHRfZ2hhc2hfbG9jazsgLyogcHJvdGVjdHMgdHRfZ2xvYmFsX2hhc2ggKi8KKwlzcGlubG9ja190IHR0X2NoYW5nZXNfbGlzdF9sb2NrOyAvKiBwcm90ZWN0cyB0dF9jaGFuZ2VzICovCisJc3BpbmxvY2tfdCB0dF9yZXFfbGlzdF9sb2NrOyAvKiBwcm90ZWN0cyB0dF9yZXFfbGlzdCAqLworCXNwaW5sb2NrX3QgdHRfcm9hbV9saXN0X2xvY2s7IC8qIHByb3RlY3RzIHR0X3JvYW1fbGlzdCAqLwogCXNwaW5sb2NrX3QgZ3dfbGlzdF9sb2NrOyAvKiBwcm90ZWN0cyBnd19saXN0IGFuZCBjdXJyX2d3ICovCiAJc3BpbmxvY2tfdCB2aXNfaGFzaF9sb2NrOyAvKiBwcm90ZWN0cyB2aXNfaGFzaCAqLwogCXNwaW5sb2NrX3QgdmlzX2xpc3RfbG9jazsgLyogcHJvdGVjdHMgdmlzX2luZm86OnJlY3ZfbGlzdCAqLwogCXNwaW5sb2NrX3Qgc29mdGlmX25laWdoX2xvY2s7IC8qIHByb3RlY3RzIHNvZnQtaW50ZXJmYWNlIG5laWdoIGxpc3QgKi8KIAlzcGlubG9ja190IHNvZnRpZl9uZWlnaF92aWRfbG9jazsgLyogcHJvdGVjdHMgc29mdC1pbnRlcmZhY2UgdmlkIGxpc3QgKi8KLQlpbnQxNl90IG51bV9sb2NhbF90dDsKLQlhdG9taWNfdCB0dF9sb2NhbF9jaGFuZ2VkOworCWF0b21pY190IG51bV9sb2NhbF90dDsKKwkvKiBDaGVja3N1bSBvZiB0aGUgbG9jYWwgdGFibGUsIHJlY29tcHV0ZWQgYmVmb3JlIHNlbmRpbmcgYSBuZXcgT0dNICovCisJYXRvbWljX3QgdHRfY3JjOworCXVuc2lnbmVkIGNoYXIgKnR0X2J1ZmY7CisJaW50MTZfdCB0dF9idWZmX2xlbjsKKwlzcGlubG9ja190IHR0X2J1ZmZfbG9jazsgLyogcHJvdGVjdHMgdHRfYnVmZiAqLwogCXN0cnVjdCBkZWxheWVkX3dvcmsgdHRfd29yazsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIG9yaWdfd29yazsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHZpc193b3JrOwogCXN0cnVjdCBnd19ub2RlIF9fcmN1ICpjdXJyX2d3OyAgLyogcmN1IHByb3RlY3RlZCBwb2ludGVyICovCisJYXRvbWljX3QgZ3dfcmVzZWxlY3Q7CiAJc3RydWN0IGhhcmRfaWZhY2UgX19yY3UgKnByaW1hcnlfaWY7ICAvKiByY3UgcHJvdGVjdGVkIHBvaW50ZXIgKi8KIAlzdHJ1Y3QgdmlzX2luZm8gKm15X3Zpc19pbmZvOwogfTsKQEAgLTE5NSwxNCArMjI0LDM5IEBACiBzdHJ1Y3QgdHRfbG9jYWxfZW50cnkgewogCXVpbnQ4X3QgYWRkcltFVEhfQUxFTl07CiAJdW5zaWduZWQgbG9uZyBsYXN0X3NlZW47Ci0JY2hhciBuZXZlcl9wdXJnZTsKKwl1aW50MTZfdCBmbGFnczsKKwlhdG9taWNfdCByZWZjb3VudDsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogCXN0cnVjdCBobGlzdF9ub2RlIGhhc2hfZW50cnk7CiB9OwogCiBzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5IHsKIAl1aW50OF90IGFkZHJbRVRIX0FMRU5dOwogCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSBoYXNoX2VudHJ5OworCXVpbnQ4X3QgdHR2bjsKKwl1aW50MTZfdCBmbGFnczsgLyogb25seSBUVF9HTE9CQUxfUk9BTSBpcyB1c2VkICovCisJdW5zaWduZWQgbG9uZyByb2FtX2F0OyAvKiB0aW1lIGF0IHdoaWNoIFRUX0dMT0JBTF9ST0FNIHdhcyBzZXQgKi8KKwlhdG9taWNfdCByZWZjb3VudDsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCXN0cnVjdCBobGlzdF9ub2RlIGhhc2hfZW50cnk7IC8qIGVudHJ5IGluIHRoZSBnbG9iYWwgdGFibGUgKi8KK307CisKK3N0cnVjdCB0dF9jaGFuZ2Vfbm9kZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB0dF9jaGFuZ2UgY2hhbmdlOworfTsKKworc3RydWN0IHR0X3JlcV9ub2RlIHsKKwl1aW50OF90IGFkZHJbRVRIX0FMRU5dOworCXVuc2lnbmVkIGxvbmcgaXNzdWVkX2F0OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCB0dF9yb2FtX25vZGUgeworCXVpbnQ4X3QgYWRkcltFVEhfQUxFTl07CisJYXRvbWljX3QgY291bnRlcjsKKwl1bnNpZ25lZCBsb25nIGZpcnN0X3RpbWU7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogfTsKIAogLyoqCkBAIC0yNDYsMTAgKzMwMCwxMCBAQAogfTsKIAogc3RydWN0IHZpc19pbmZvIHsKLQl1bnNpZ25lZCBsb25nICAgICAgIGZpcnN0X3NlZW47Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICByZWN2X2xpc3Q7Ci0JCQkgICAgLyogbGlzdCBvZiBzZXJ2ZXItbmVpZ2hib3JzIHdlIHJlY2VpdmVkIGEgdmlzLXBhY2tldAotCQkJICAgICAqIGZyb20uICB3ZSBzaG91bGQgbm90IHJlcGx5IHRvIHRoZW0uICovCisJdW5zaWduZWQgbG9uZyBmaXJzdF9zZWVuOworCS8qIGxpc3Qgb2Ygc2VydmVyLW5laWdoYm9ycyB3ZSByZWNlaXZlZCBhIHZpcy1wYWNrZXQKKwkgKiBmcm9tLiAgd2Ugc2hvdWxkIG5vdCByZXBseSB0byB0aGVtLiAqLworCXN0cnVjdCBsaXN0X2hlYWQgcmVjdl9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgc2VuZF9saXN0OwogCXN0cnVjdCBrcmVmIHJlZmNvdW50OwogCXN0cnVjdCBobGlzdF9ub2RlIGhhc2hfZW50cnk7CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi91bmljYXN0LmMgYi9uZXQvYmF0bWFuLWFkdi91bmljYXN0LmMKaW5kZXggMTljM2RhZi4uMzJiMTI1ZiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvdW5pY2FzdC5jCisrKyBiL25ldC9iYXRtYW4tYWR2L3VuaWNhc3QuYwpAQCAtMzksOCArMzksOCBAQAogCQkoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKilza2ItPmRhdGE7CiAJc3RydWN0IHNrX2J1ZmYgKnRtcF9za2I7CiAJc3RydWN0IHVuaWNhc3RfcGFja2V0ICp1bmljYXN0X3BhY2tldDsKLQlpbnQgaGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpOwotCWludCB1bmlfZGlmZiA9IHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCkgLSBoZHJfbGVuOworCWludCBoZHJfbGVuID0gc2l6ZW9mKCp1bmljYXN0X3BhY2tldCk7CisJaW50IHVuaV9kaWZmID0gc2l6ZW9mKCp1cCkgLSBoZHJfbGVuOwogCiAJLyogc2V0IHNrYiB0byB0aGUgZmlyc3QgcGFydCBhbmQgdG1wX3NrYiB0byB0aGUgc2Vjb25kIHBhcnQgKi8KIAlpZiAodXAtPmZsYWdzICYgVU5JX0ZSQUdfSEVBRCkgewpAQCAtNTMsNyArNTMsNyBAQAogCWlmIChza2JfbGluZWFyaXplKHNrYikgPCAwIHx8IHNrYl9saW5lYXJpemUodG1wX3NrYikgPCAwKQogCQlnb3RvIGVycjsKIAotCXNrYl9wdWxsKHRtcF9za2IsIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCkpOworCXNrYl9wdWxsKHRtcF9za2IsIHNpemVvZigqdXApKTsKIAlpZiAocHNrYl9leHBhbmRfaGVhZChza2IsIDAsIHRtcF9za2ItPmxlbiwgR0ZQX0FUT01JQykgPCAwKQogCQlnb3RvIGVycjsKIApAQCAtOTksOCArOTksNyBAQAogCXN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5ICp0ZnA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgRlJBR19CVUZGRVJfU0laRTsgaSsrKSB7Ci0JCXRmcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5KSwKLQkJCUdGUF9BVE9NSUMpOworCQl0ZnAgPSBrbWFsbG9jKHNpemVvZigqdGZwKSwgR0ZQX0FUT01JQyk7CiAJCWlmICghdGZwKSB7CiAJCQlmcmFnX2xpc3RfZnJlZShoZWFkKTsKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtMTE1LDcgKzExNCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSAqZnJhZ19zZWFyY2hfcGFja2V0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCi0JCQkJCQkgc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKnVwKQorCQkJCQkgICBjb25zdCBzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqdXApCiB7CiAJc3RydWN0IGZyYWdfcGFja2V0X2xpc3RfZW50cnkgKnRmcDsKIAlzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqdG1wX3VwID0gTlVMTDsKQEAgLTIxOCwxNCArMjE3LDE0IEBACiB9CiAKIGludCBmcmFnX3NlbmRfc2tiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCSAgc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2UsIHVpbnQ4X3QgZHN0YWRkcltdKQorCQkgIHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlLCBjb25zdCB1aW50OF90IGRzdGFkZHJbXSkKIHsKIAlzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgdG1wX3VjLCAqdW5pY2FzdF9wYWNrZXQ7CiAJc3RydWN0IGhhcmRfaWZhY2UgKnByaW1hcnlfaWY7CiAJc3RydWN0IHNrX2J1ZmYgKmZyYWdfc2tiOwogCXN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICpmcmFnMSwgKmZyYWcyOwotCWludCB1Y19oZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCk7Ci0JaW50IHVjZl9oZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0KTsKKwlpbnQgdWNfaGRyX2xlbiA9IHNpemVvZigqdW5pY2FzdF9wYWNrZXQpOworCWludCB1Y2ZfaGRyX2xlbiA9IHNpemVvZigqZnJhZzEpOwogCWludCBkYXRhX2xlbiA9IHNrYi0+bGVuIC0gdWNfaGRyX2xlbjsKIAlpbnQgbGFyZ2VfdGFpbCA9IDAsIHJldCA9IE5FVF9SWF9EUk9QOwogCXVpbnQxNl90IHNlcW5vOwpAQCAtMjUwLDE0ICsyNDksMTQgQEAKIAlmcmFnMSA9IChzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqKXNrYi0+ZGF0YTsKIAlmcmFnMiA9IChzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqKWZyYWdfc2tiLT5kYXRhOwogCi0JbWVtY3B5KGZyYWcxLCAmdG1wX3VjLCBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSk7CisJbWVtY3B5KGZyYWcxLCAmdG1wX3VjLCBzaXplb2YodG1wX3VjKSk7CiAKIAlmcmFnMS0+dHRsLS07CiAJZnJhZzEtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKIAlmcmFnMS0+cGFja2V0X3R5cGUgPSBCQVRfVU5JQ0FTVF9GUkFHOwogCiAJbWVtY3B5KGZyYWcxLT5vcmlnLCBwcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShmcmFnMiwgZnJhZzEsIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCkpOworCW1lbWNweShmcmFnMiwgZnJhZzEsIHNpemVvZigqZnJhZzIpKTsKIAogCWlmIChkYXRhX2xlbiAmIDEpCiAJCWxhcmdlX3RhaWwgPSBVTklfRlJBR19MQVJHRVRBSUw7CkBAIC0yOTUsNyArMjk0LDcgQEAKIAogCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGV0aGhkci0+aF9kZXN0KSkgewotCQlvcmlnX25vZGUgPSAoc3RydWN0IG9yaWdfbm9kZSAqKWd3X2dldF9zZWxlY3RlZF9vcmlnKGJhdF9wcml2KTsKKwkJb3JpZ19ub2RlID0gZ3dfZ2V0X3NlbGVjdGVkX29yaWcoYmF0X3ByaXYpOwogCQlpZiAob3JpZ19ub2RlKQogCQkJZ290byBmaW5kX3JvdXRlcjsKIAl9CkBAIC0zMTQsMTAgKzMxMyw3IEBACiAJaWYgKCFuZWlnaF9ub2RlKQogCQlnb3RvIG91dDsKIAotCWlmIChuZWlnaF9ub2RlLT5pZl9pbmNvbWluZy0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAobXlfc2tiX2hlYWRfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpKSA8IDApCisJaWYgKG15X3NrYl9oZWFkX3B1c2goc2tiLCBzaXplb2YoKnVuaWNhc3RfcGFja2V0KSkgPCAwKQogCQlnb3RvIG91dDsKIAogCXVuaWNhc3RfcGFja2V0ID0gKHN0cnVjdCB1bmljYXN0X3BhY2tldCAqKXNrYi0+ZGF0YTsKQEAgLTMyOSw5ICszMjUsMTIgQEAKIAl1bmljYXN0X3BhY2tldC0+dHRsID0gVFRMOwogCS8qIGNvcHkgdGhlIGRlc3RpbmF0aW9uIGZvciBmYXN0ZXIgcm91dGluZyAqLwogCW1lbWNweSh1bmljYXN0X3BhY2tldC0+ZGVzdCwgb3JpZ19ub2RlLT5vcmlnLCBFVEhfQUxFTik7CisJLyogc2V0IHRoZSBkZXN0aW5hdGlvbiB0dCB2ZXJzaW9uIG51bWJlciAqLworCXVuaWNhc3RfcGFja2V0LT50dHZuID0KKwkJKHVpbnQ4X3QpYXRvbWljX3JlYWQoJm9yaWdfbm9kZS0+bGFzdF90dHZuKTsKIAogCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmZyYWdtZW50YXRpb24pICYmCi0JICAgIGRhdGFfbGVuICsgc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCkgPgorCSAgICBkYXRhX2xlbiArIHNpemVvZigqdW5pY2FzdF9wYWNrZXQpID4KIAkJCQluZWlnaF9ub2RlLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+bXR1KSB7CiAJCS8qIHNlbmQgZnJhZyBza2IgZGVjcmVhc2VzIHR0bCAqLwogCQl1bmljYXN0X3BhY2tldC0+dHRsKys7CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi91bmljYXN0LmggYi9uZXQvYmF0bWFuLWFkdi91bmljYXN0LmgKaW5kZXggMTZhZDdhOS4uNjJmNTRiOSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvdW5pY2FzdC5oCisrKyBiL25ldC9iYXRtYW4tYWR2L3VuaWNhc3QuaApAQCAtMzIsMTEgKzMyLDExIEBACiB2b2lkIGZyYWdfbGlzdF9mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwogaW50IHVuaWNhc3Rfc2VuZF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7CiBpbnQgZnJhZ19zZW5kX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkgIHN0cnVjdCBoYXJkX2lmYWNlICpoYXJkX2lmYWNlLCB1aW50OF90IGRzdGFkZHJbXSk7CisJCSAgc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2UsIGNvbnN0IHVpbnQ4X3QgZHN0YWRkcltdKTsKIAotc3RhdGljIGlubGluZSBpbnQgZnJhZ19jYW5fcmVhc3NlbWJsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbXR1KQorc3RhdGljIGlubGluZSBpbnQgZnJhZ19jYW5fcmVhc3NlbWJsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbXR1KQogewotCXN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICp1bmljYXN0X3BhY2tldDsKKwljb25zdCBzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqdW5pY2FzdF9wYWNrZXQ7CiAJaW50IHVuZXZlbl9jb3JyZWN0aW9uID0gMDsKIAl1bnNpZ25lZCBpbnQgbWVyZ2VkX3NpemU7CiAKQEAgLTQ5LDcgKzQ5LDcgQEAKIAkJCXVuZXZlbl9jb3JyZWN0aW9uID0gLTE7CiAJfQogCi0JbWVyZ2VkX3NpemUgPSAoc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQpKSAqIDI7CisJbWVyZ2VkX3NpemUgPSAoc2tiLT5sZW4gLSBzaXplb2YoKnVuaWNhc3RfcGFja2V0KSkgKiAyOwogCW1lcmdlZF9zaXplICs9IHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpICsgdW5ldmVuX2NvcnJlY3Rpb247CiAKIAlyZXR1cm4gbWVyZ2VkX3NpemUgPD0gbXR1OwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvdmlzLmMgYi9uZXQvYmF0bWFuLWFkdi92aXMuYwppbmRleCBjMzlmMjBjLi44YTFiOTg1IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi92aXMuYworKysgYi9uZXQvYmF0bWFuLWFkdi92aXMuYwpAQCAtMzAsMjIgKzMwLDYgQEAKIAogI2RlZmluZSBNQVhfVklTX1BBQ0tFVF9TSVpFIDEwMDAKIAotLyogUmV0dXJucyB0aGUgc21hbGxlc3Qgc2lnbmVkIGludGVnZXIgaW4gdHdvJ3MgY29tcGxlbWVudCB3aXRoIHRoZSBzaXplb2YgeCAqLwotI2RlZmluZSBzbWFsbGVzdF9zaWduZWRfaW50KHgpICgxdSA8PCAoN3UgKyA4dSAqIChzaXplb2YoeCkgLSAxdSkpKQotCi0vKiBDaGVja3MgaWYgYSBzZXF1ZW5jZSBudW1iZXIgeCBpcyBhIHByZWRlY2Vzc29yL3N1Y2Nlc3NvciBvZiB5LgotICogdGhleSBoYW5kbGUgb3ZlcmZsb3dzL3VuZGVyZmxvd3MgYW5kIGNhbiBjb3JyZWN0bHkgY2hlY2sgZm9yIGEKLSAqIHByZWRlY2Vzc29yL3N1Y2Nlc3NvciB1bmxlc3MgdGhlIHZhcmlhYmxlIHNlcXVlbmNlIG51bWJlciBoYXMgZ3Jvd24gYnkKLSAqIG1vcmUgdGhlbiAyKiooYml0d2lkdGgoeCktMSktMS4KLSAqIFRoaXMgbWVhbnMgdGhhdCBmb3IgYSB1aW50OF90IHdpdGggdGhlIG1heGltdW0gdmFsdWUgMjU1LCBpdCB3b3VsZCB0aGluazoKLSAqICAtIHdoZW4gYWRkaW5nIG5vdGhpbmcgLSBpdCBpcyBuZWl0aGVyIGEgcHJlZGVjZXNzb3Igbm9yIGEgc3VjY2Vzc29yCi0gKiAgLSBiZWZvcmUgYWRkaW5nIG1vcmUgdGhhbiAxMjcgdG8gdGhlIHN0YXJ0aW5nIHZhbHVlIC0gaXQgaXMgYSBwcmVkZWNlc3NvciwKLSAqICAtIHdoZW4gYWRkaW5nIDEyOCAtIGl0IGlzIG5laXRoZXIgYSBwcmVkZWNlc3NvciBub3IgYSBzdWNjZXNzb3IsCi0gKiAgLSBhZnRlciBhZGRpbmcgbW9yZSB0aGFuIDEyNyB0byB0aGUgc3RhcnRpbmcgdmFsdWUgLSBpdCBpcyBhIHN1Y2Nlc3NvciAqLwotI2RlZmluZSBzZXFfYmVmb3JlKHgsIHkpICh7dHlwZW9mKHgpIF9kdW1teSA9ICh4IC0geSk7IFwKLQkJCV9kdW1teSA+IHNtYWxsZXN0X3NpZ25lZF9pbnQoX2R1bW15KTsgfSkKLSNkZWZpbmUgc2VxX2FmdGVyKHgsIHkpIHNlcV9iZWZvcmUoeSwgeCkKLQogc3RhdGljIHZvaWQgc3RhcnRfdmlzX3RpbWVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwogCiAvKiBmcmVlIHRoZSBpbmZvICovCkBAIC02OCwxMCArNTIsMTAgQEAKIH0KIAogLyogQ29tcGFyZSB0d28gdmlzIHBhY2tldHMsIHVzZWQgYnkgdGhlIGhhc2hpbmcgYWxnb3JpdGhtICovCi1zdGF0aWMgaW50IHZpc19pbmZvX2NtcChzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgdm9pZCAqZGF0YTIpCitzdGF0aWMgaW50IHZpc19pbmZvX2NtcChjb25zdCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgY29uc3Qgdm9pZCAqZGF0YTIpCiB7Ci0Jc3RydWN0IHZpc19pbmZvICpkMSwgKmQyOwotCXN0cnVjdCB2aXNfcGFja2V0ICpwMSwgKnAyOworCWNvbnN0IHN0cnVjdCB2aXNfaW5mbyAqZDEsICpkMjsKKwljb25zdCBzdHJ1Y3QgdmlzX3BhY2tldCAqcDEsICpwMjsKIAogCWQxID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCB2aXNfaW5mbywgaGFzaF9lbnRyeSk7CiAJZDIgPSBkYXRhMjsKQEAgLTgyLDExICs2NiwxMSBAQAogCiAvKiBoYXNoIGZ1bmN0aW9uIHRvIGNob29zZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUgb2YgZ2l2ZW4gc2l6ZSAqLwogLyogaGFzaCBhbGdvcml0aG0gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhc2hfdGFibGUgKi8KLXN0YXRpYyBpbnQgdmlzX2luZm9fY2hvb3NlKHZvaWQgKmRhdGEsIGludCBzaXplKQorc3RhdGljIGludCB2aXNfaW5mb19jaG9vc2UoY29uc3Qgdm9pZCAqZGF0YSwgaW50IHNpemUpCiB7Ci0Jc3RydWN0IHZpc19pbmZvICp2aXNfaW5mbyA9IGRhdGE7Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKLQl1bnNpZ25lZCBjaGFyICprZXk7CisJY29uc3Qgc3RydWN0IHZpc19pbmZvICp2aXNfaW5mbyA9IGRhdGE7CisJY29uc3Qgc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICprZXk7CiAJdWludDMyX3QgaGFzaCA9IDA7CiAJc2l6ZV90IGk7CiAKQEAgLTEwNiw3ICs5MCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdmlzX2luZm8gKnZpc19oYXNoX2ZpbmQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgICAgICB2b2lkICpkYXRhKQorCQkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoID0gYmF0X3ByaXYtPnZpc19oYXNoOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwpAQCAtMTQzLDcgKzEyNyw3IEBACiAJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKIAogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBwb3MsIGlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGNvbXBhcmVfZXRoKGVudHJ5LT5hZGRyLCAodm9pZCAqKWludGVyZmFjZSkpCisJCWlmIChjb21wYXJlX2V0aChlbnRyeS0+YWRkciwgaW50ZXJmYWNlKSkKIAkJCXJldHVybjsKIAl9CiAKQEAgLTE1Niw3ICsxNDAsOCBAQAogCWhsaXN0X2FkZF9oZWFkKCZlbnRyeS0+bGlzdCwgaWZfbGlzdCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHZpc19kYXRhX3JlYWRfcHJpbV9zZWMoY2hhciAqYnVmZiwgc3RydWN0IGhsaXN0X2hlYWQgKmlmX2xpc3QpCitzdGF0aWMgc3NpemVfdCB2aXNfZGF0YV9yZWFkX3ByaW1fc2VjKGNoYXIgKmJ1ZmYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGhsaXN0X2hlYWQgKmlmX2xpc3QpCiB7CiAJc3RydWN0IGlmX2xpc3RfZW50cnkgKmVudHJ5OwogCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CkBAIC0xODksOCArMTc0LDkgQEAKIH0KIAogLyogcmVhZCBhbiBlbnRyeSAgKi8KLXN0YXRpYyBzc2l6ZV90IHZpc19kYXRhX3JlYWRfZW50cnkoY2hhciAqYnVmZiwgc3RydWN0IHZpc19pbmZvX2VudHJ5ICplbnRyeSwKLQkJCQkgICB1aW50OF90ICpzcmMsIGJvb2wgcHJpbWFyeSkKK3N0YXRpYyBzc2l6ZV90IHZpc19kYXRhX3JlYWRfZW50cnkoY2hhciAqYnVmZiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKmVudHJ5LAorCQkJCSAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgYm9vbCBwcmltYXJ5KQogewogCS8qIG1heGltYWwgbGVuZ3RoOiBtYXgoNCsxNysyLCAzKzE3KzErMysyKSA9PSAyNiAqLwogCWlmIChwcmltYXJ5ICYmIGVudHJ5LT5xdWFsaXR5ID09IDApCkBAIC0yMzksNyArMjI1LDcgQEAKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGluZm8sIG5vZGUsIGhlYWQsIGhhc2hfZW50cnkpIHsKIAkJCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWluZm8tPnNrYl9wYWNrZXQtPmRhdGE7CiAJCQllbnRyaWVzID0gKHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqKQotCQkJCSgoY2hhciAqKXBhY2tldCArIHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkpOworCQkJCSgoY2hhciAqKXBhY2tldCArIHNpemVvZigqcGFja2V0KSk7CiAKIAkJCWZvciAoaiA9IDA7IGogPCBwYWNrZXQtPmVudHJpZXM7IGorKykgewogCQkJCWlmIChlbnRyaWVzW2pdLnF1YWxpdHkgPT0gMCkKQEAgLTI4Nyw3ICsyNzMsNyBAQAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaW5mbywgbm9kZSwgaGVhZCwgaGFzaF9lbnRyeSkgewogCQkJcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKIAkJCWVudHJpZXMgPSAoc3RydWN0IHZpc19pbmZvX2VudHJ5ICopCi0JCQkJKChjaGFyICopcGFja2V0ICsgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSk7CisJCQkJKChjaGFyICopcGFja2V0ICsgc2l6ZW9mKCpwYWNrZXQpKTsKIAogCQkJZm9yIChqID0gMDsgaiA8IHBhY2tldC0+ZW50cmllczsgaisrKSB7CiAJCQkJaWYgKGVudHJpZXNbal0ucXVhbGl0eSA9PSAwKQpAQCAtMzYxLDExICszNDcsMTEgQEAKIAogLyogdHJpZXMgdG8gYWRkIG9uZSBlbnRyeSB0byB0aGUgcmVjZWl2ZSBsaXN0LiAqLwogc3RhdGljIHZvaWQgcmVjdl9saXN0X2FkZChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpyZWN2X2xpc3QsIGNoYXIgKm1hYykKKwkJCSAgc3RydWN0IGxpc3RfaGVhZCAqcmVjdl9saXN0LCBjb25zdCBjaGFyICptYWMpCiB7CiAJc3RydWN0IHJlY3ZsaXN0X25vZGUgKmVudHJ5OwogCi0JZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSksIEdGUF9BVE9NSUMpOworCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuOwogCkBAIC0zNzcsOSArMzYzLDkgQEAKIAogLyogcmV0dXJucyAxIGlmIHRoaXMgbWFjIGlzIGluIHRoZSByZWN2X2xpc3QgKi8KIHN0YXRpYyBpbnQgcmVjdl9saXN0X2lzX2luKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpyZWN2X2xpc3QsIGNoYXIgKm1hYykKKwkJCSAgIGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKnJlY3ZfbGlzdCwgY29uc3QgY2hhciAqbWFjKQogewotCXN0cnVjdCByZWN2bGlzdF9ub2RlICplbnRyeTsKKwljb25zdCBzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSAqZW50cnk7CiAKIAlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT52aXNfbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCByZWN2X2xpc3QsIGxpc3QpIHsKQEAgLTQxMiwxMSArMzk4LDExIEBACiAJCXJldHVybiBOVUxMOwogCiAJLyogc2VlIGlmIHRoZSBwYWNrZXQgaXMgYWxyZWFkeSBpbiB2aXNfaGFzaCAqLwotCXNlYXJjaF9lbGVtLnNrYl9wYWNrZXQgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkpOworCXNlYXJjaF9lbGVtLnNrYl9wYWNrZXQgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZigqc2VhcmNoX3BhY2tldCkpOwogCWlmICghc2VhcmNoX2VsZW0uc2tiX3BhY2tldCkKIAkJcmV0dXJuIE5VTEw7CiAJc2VhcmNoX3BhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKXNrYl9wdXQoc2VhcmNoX2VsZW0uc2tiX3BhY2tldCwKLQkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSk7CisJCQkJCQkgICAgIHNpemVvZigqc2VhcmNoX3BhY2tldCkpOwogCiAJbWVtY3B5KHNlYXJjaF9wYWNrZXQtPnZpc19vcmlnLCB2aXNfcGFja2V0LT52aXNfb3JpZywgRVRIX0FMRU4pOwogCW9sZF9pbmZvID0gdmlzX2hhc2hfZmluZChiYXRfcHJpdiwgJnNlYXJjaF9lbGVtKTsKQEAgLTQ0MiwyNyArNDI4LDI2IEBACiAJCWtyZWZfcHV0KCZvbGRfaW5mby0+cmVmY291bnQsIGZyZWVfaW5mbyk7CiAJfQogCi0JaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aXNfaW5mbyksIEdGUF9BVE9NSUMpOworCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9BVE9NSUMpOwogCWlmICghaW5mbykKIAkJcmV0dXJuIE5VTEw7CiAKLQlpbmZvLT5za2JfcGFja2V0ID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpICsKLQkJCQkJIHZpc19pbmZvX2xlbiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisJaW5mby0+c2tiX3BhY2tldCA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKCpwYWNrZXQpICsgdmlzX2luZm9fbGVuICsKKwkJCQkJIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CiAJaWYgKCFpbmZvLT5za2JfcGFja2V0KSB7CiAJCWtmcmVlKGluZm8pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJc2tiX3Jlc2VydmUoaW5mby0+c2tiX3BhY2tldCwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKLQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilza2JfcHV0KGluZm8tPnNrYl9wYWNrZXQsCi0JCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkgKwotCQkJCQkgICAgICB2aXNfaW5mb19sZW4pOworCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKXNrYl9wdXQoaW5mby0+c2tiX3BhY2tldCwgc2l6ZW9mKCpwYWNrZXQpCisJCQkJCSAgICAgICsgdmlzX2luZm9fbGVuKTsKIAogCWtyZWZfaW5pdCgmaW5mby0+cmVmY291bnQpOwogCUlOSVRfTElTVF9IRUFEKCZpbmZvLT5zZW5kX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZpbmZvLT5yZWN2X2xpc3QpOwogCWluZm8tPmZpcnN0X3NlZW4gPSBqaWZmaWVzOwogCWluZm8tPmJhdF9wcml2ID0gYmF0X3ByaXY7Ci0JbWVtY3B5KHBhY2tldCwgdmlzX3BhY2tldCwgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSArIHZpc19pbmZvX2xlbik7CisJbWVtY3B5KHBhY2tldCwgdmlzX3BhY2tldCwgc2l6ZW9mKCpwYWNrZXQpICsgdmlzX2luZm9fbGVuKTsKIAogCS8qIGluaXRpYWxpemUgYW5kIGFkZCBuZXcgcGFja2V0LiAqLwogCSppc19uZXcgPSAxOwpAQCAtNTk5LDkgKzU4NCw5IEBACiB9CiAKIC8qIFJldHVybiB0cnVlIGlmIHRoZSB2aXMgcGFja2V0IGlzIGZ1bGwuICovCi1zdGF0aWMgYm9vbCB2aXNfcGFja2V0X2Z1bGwoc3RydWN0IHZpc19pbmZvICppbmZvKQorc3RhdGljIGJvb2wgdmlzX3BhY2tldF9mdWxsKGNvbnN0IHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0OworCWNvbnN0IHN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7CiAJcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKIAogCWlmIChNQVhfVklTX1BBQ0tFVF9TSVpFIC8gc2l6ZW9mKHN0cnVjdCB2aXNfaW5mb19lbnRyeSkKQEAgLTYxOSw3ICs2MDQsNyBAQAogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwogCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKIAlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyOwotCXN0cnVjdCB2aXNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgdmlzX2luZm8gKiliYXRfcHJpdi0+bXlfdmlzX2luZm87CisJc3RydWN0IHZpc19pbmZvICppbmZvID0gYmF0X3ByaXYtPm15X3Zpc19pbmZvOwogCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwogCXN0cnVjdCB2aXNfaW5mb19lbnRyeSAqZW50cnk7CiAJc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeTsKQEAgLTYzMiw3ICs2MTcsNyBAQAogCXBhY2tldC0+dHRsID0gVFRMOwogCXBhY2tldC0+c2Vxbm8gPSBodG9ubChudG9obChwYWNrZXQtPnNlcW5vKSArIDEpOwogCXBhY2tldC0+ZW50cmllcyA9IDA7Ci0Jc2tiX3RyaW0oaW5mby0+c2tiX3BhY2tldCwgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSk7CisJc2tiX3RyaW0oaW5mby0+c2tiX3BhY2tldCwgc2l6ZW9mKCpwYWNrZXQpKTsKIAogCWlmIChwYWNrZXQtPnZpc190eXBlID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUpIHsKIAkJYmVzdF90cSA9IGZpbmRfYmVzdF92aXNfc2VydmVyKGJhdF9wcml2LCBpbmZvKTsKQEAgLTY4MCwxMSArNjY1LDEyIEBACiAKIAloYXNoID0gYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2g7CiAKLQlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dF9saGFzaF9sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7CiAJCWhlYWQgPSAmaGFzaC0+dGFibGVbaV07CiAKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkodHRfbG9jYWxfZW50cnksIG5vZGUsIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHRfbG9jYWxfZW50cnksIG5vZGUsIGhlYWQsCisJCQkJCSBoYXNoX2VudHJ5KSB7CiAJCQllbnRyeSA9IChzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKikKIAkJCQkJc2tiX3B1dChpbmZvLT5za2JfcGFja2V0LAogCQkJCQkJc2l6ZW9mKCplbnRyeSkpOwpAQCAtNjkzLDE0ICs2NzksMTIgQEAKIAkJCWVudHJ5LT5xdWFsaXR5ID0gMDsgLyogMCBtZWFucyBUVCAqLwogCQkJcGFja2V0LT5lbnRyaWVzKys7CiAKLQkJCWlmICh2aXNfcGFja2V0X2Z1bGwoaW5mbykpIHsKLQkJCQlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0X2xoYXNoX2xvY2spOwotCQkJCXJldHVybiAwOwotCQkJfQorCQkJaWYgKHZpc19wYWNrZXRfZnVsbChpbmZvKSkKKwkJCQlnb3RvIHVubG9jazsKIAkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKLQlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0X2xoYXNoX2xvY2spOwogCXJldHVybiAwOwogCiB1bmxvY2s6CkBAIC05MDgsMTcgKzg5MiwxNSBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQliYXRfcHJpdi0+bXlfdmlzX2luZm8tPnNrYl9wYWNrZXQgPSBkZXZfYWxsb2Nfc2tiKAotCQkJCQkJc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSArCi0JCQkJCQlNQVhfVklTX1BBQ0tFVF9TSVpFICsKLQkJCQkJCXNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisJYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5za2JfcGFja2V0ID0gZGV2X2FsbG9jX3NrYihzaXplb2YoKnBhY2tldCkgKworCQkJCQkJCSAgTUFYX1ZJU19QQUNLRVRfU0laRSArCisJCQkJCQkJIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CiAJaWYgKCFiYXRfcHJpdi0+bXlfdmlzX2luZm8tPnNrYl9wYWNrZXQpCiAJCWdvdG8gZnJlZV9pbmZvOwogCiAJc2tiX3Jlc2VydmUoYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5za2JfcGFja2V0LCBzaXplb2Yoc3RydWN0IGV0aGhkcikpOwotCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKXNrYl9wdXQoCi0JCQkJCWJhdF9wcml2LT5teV92aXNfaW5mby0+c2tiX3BhY2tldCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSk7CisJcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopc2tiX3B1dChiYXRfcHJpdi0+bXlfdmlzX2luZm8tPnNrYl9wYWNrZXQsCisJCQkJCSAgICAgIHNpemVvZigqcGFja2V0KSk7CiAKIAkvKiBwcmVmaWxsIHRoZSB2aXMgaW5mbyAqLwogCWJhdF9wcml2LT5teV92aXNfaW5mby0+Zmlyc3Rfc2VlbiA9IGppZmZpZXMgLQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9LY29uZmlnIGIvbmV0L2JsdWV0b290aC9LY29uZmlnCmluZGV4IDZhZTVlYzUuLmJmYjNkYzAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvS2NvbmZpZworKysgYi9uZXQvYmx1ZXRvb3RoL0tjb25maWcKQEAgLTYsNiArNiw3IEBACiAJdHJpc3RhdGUgIkJsdWV0b290aCBzdWJzeXN0ZW0gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE5FVCAmJiAhUzM5MAogCWRlcGVuZHMgb24gUkZLSUxMIHx8ICFSRktJTEwKKwlzZWxlY3QgQ1JZUFRPCiAJaGVscAogCSAgQmx1ZXRvb3RoIGlzIGxvdy1jb3N0LCBsb3ctcG93ZXIsIHNob3J0LXJhbmdlIHdpcmVsZXNzIHRlY2hub2xvZ3kuCiAJICBJdCB3YXMgZGVzaWduZWQgYXMgYSByZXBsYWNlbWVudCBmb3IgY2FibGVzIGFuZCBvdGhlciBzaG9ydC1yYW5nZQpAQCAtMjIsNiArMjMsNyBAQAogCSAgICAgQk5FUCBNb2R1bGUgKEJsdWV0b290aCBOZXR3b3JrIEVuY2Fwc3VsYXRpb24gUHJvdG9jb2wpCiAJICAgICBDTVRQIE1vZHVsZSAoQ0FQSSBNZXNzYWdlIFRyYW5zcG9ydCBQcm90b2NvbCkKIAkgICAgIEhJRFAgTW9kdWxlIChIdW1hbiBJbnRlcmZhY2UgRGV2aWNlIFByb3RvY29sKQorCSAgICAgU01QIE1vZHVsZSAoU2VjdXJpdHkgTWFuYWdlciBQcm90b2NvbCkKIAogCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIEJsdWV0b290aCBzdXBwb3J0IGludG8gdGhlIGtlcm5lbCBvciBzYXkgTSB0bwogCSAgY29tcGlsZSBpdCBhcyBtb2R1bGUgKGJsdWV0b290aCkuCkBAIC0zNiwxMSArMzgsMTggQEAKIGNvbmZpZyBCVF9MMkNBUAogCWJvb2wgIkwyQ0FQIHByb3RvY29sIHN1cHBvcnQiCiAJc2VsZWN0IENSQzE2CisJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fQkxLQ0lQSEVSCisJc2VsZWN0IENSWVBUT19BRVMKKwlzZWxlY3QgQ1JZUFRPX0VDQgogCWhlbHAKIAkgIEwyQ0FQIChMb2dpY2FsIExpbmsgQ29udHJvbCBhbmQgQWRhcHRhdGlvbiBQcm90b2NvbCkgcHJvdmlkZXMKIAkgIGNvbm5lY3Rpb24gb3JpZW50ZWQgYW5kIGNvbm5lY3Rpb24tbGVzcyBkYXRhIHRyYW5zcG9ydC4gIEwyQ0FQCiAJICBzdXBwb3J0IGlzIHJlcXVpcmVkIGZvciBtb3N0IEJsdWV0b290aCBhcHBsaWNhdGlvbnMuCiAKKwkgIEFsc28gaW5jbHVkZWQgaXMgc3VwcG9ydCBmb3IgU01QIChTZWN1cml0eSBNYW5hZ2VyIFByb3RvY29sKSB3aGljaAorCSAgaXMgdGhlIHNlY3VyaXR5IGxheWVyIG9uIHRvcCBvZiBMRSAoTG93IEVuZXJneSkgbGlua3MuCisKIGNvbmZpZyBCVF9TQ08KIAlib29sICJTQ08gbGlua3Mgc3VwcG9ydCIKIAloZWxwCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL01ha2VmaWxlIGIvbmV0L2JsdWV0b290aC9NYWtlZmlsZQppbmRleCBmMDRmZTlhLi45YjY3ZjNkIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL01ha2VmaWxlCisrKyBiL25ldC9ibHVldG9vdGgvTWFrZWZpbGUKQEAgLTksNSArOSw1IEBACiBvYmotJChDT05GSUdfQlRfSElEUCkJKz0gaGlkcC8KIAogYmx1ZXRvb3RoLXkgOj0gYWZfYmx1ZXRvb3RoLm8gaGNpX2NvcmUubyBoY2lfY29ubi5vIGhjaV9ldmVudC5vIG1nbXQubyBoY2lfc29jay5vIGhjaV9zeXNmcy5vIGxpYi5vCi1ibHVldG9vdGgtJChDT05GSUdfQlRfTDJDQVApCSs9IGwyY2FwX2NvcmUubyBsMmNhcF9zb2NrLm8KK2JsdWV0b290aC0kKENPTkZJR19CVF9MMkNBUCkJKz0gbDJjYXBfY29yZS5vIGwyY2FwX3NvY2subyBzbXAubwogYmx1ZXRvb3RoLSQoQ09ORklHX0JUX1NDTykJKz0gc2NvLm8KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvY210cC9jYXBpLmMgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY2FwaS5jCmluZGV4IDc0NDIzM2MuLjA0MGY2N2IgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvY210cC9jYXBpLmMKKysrIGIvbmV0L2JsdWV0b290aC9jbXRwL2NhcGkuYwpAQCAtMzI2LDcgKzMyNiw3IEBACiB7CiAJc3RydWN0IGNhcGlfY3RyICpjdHJsID0gJnNlc3Npb24tPmN0cmw7CiAJc3RydWN0IGNtdHBfYXBwbGljYXRpb24gKmFwcGxpY2F0aW9uOwotCV9fdTE2IGNtZCwgYXBwbDsKKwlfX3UxNiBhcHBsOwogCV9fdTMyIGNvbnRyOwogCiAJQlRfREJHKCJzZXNzaW9uICVwIHNrYiAlcCBsZW4gJWQiLCBzZXNzaW9uLCBza2IsIHNrYi0+bGVuKTsKQEAgLTM0NCw3ICszNDQsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JY21kID0gQ0FQSUNNRChDQVBJTVNHX0NPTU1BTkQoc2tiLT5kYXRhKSwgQ0FQSU1TR19TVUJDT01NQU5EKHNrYi0+ZGF0YSkpOwogCWFwcGwgPSBDQVBJTVNHX0FQUElEKHNrYi0+ZGF0YSk7CiAJY29udHIgPSBDQVBJTVNHX0NPTlRST0woc2tiLT5kYXRhKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jIGIvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCmluZGV4IDMxNjMzMzAuLmVhN2YwMzEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKQEAgLTUzLDExICs1MywxMyBAQAogCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVDsKIAljb25uLT5vdXQgPSAxOwogCWNvbm4tPmxpbmtfbW9kZSB8PSBIQ0lfTE1fTUFTVEVSOworCWNvbm4tPnNlY19sZXZlbCA9IEJUX1NFQ1VSSVRZX0xPVzsKIAogCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOwogCWNwLnNjYW5faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNigweDAwMDQpOwogCWNwLnNjYW5fd2luZG93ID0gY3B1X3RvX2xlMTYoMHgwMDA0KTsKIAliYWNweSgmY3AucGVlcl9hZGRyLCAmY29ubi0+ZHN0KTsKKwljcC5wZWVyX2FkZHJfdHlwZSA9IGNvbm4tPmRzdF90eXBlOwogCWNwLmNvbm5faW50ZXJ2YWxfbWluID0gY3B1X3RvX2xlMTYoMHgwMDA4KTsKIAljcC5jb25uX2ludGVydmFsX21heCA9IGNwdV90b19sZTE2KDB4MDEwMCk7CiAJY3Auc3VwZXJ2aXNpb25fdGltZW91dCA9IGNwdV90b19sZTE2KDB4MDA2NCk7CkBAIC0yMDMsNiArMjA1LDU1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGhjaV9sZV9jb25uX3VwZGF0ZSk7CiAKK3ZvaWQgaGNpX2xlX3N0YXJ0X2VuYyhzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fbGUxNiBlZGl2LCBfX3U4IHJhbmRbOF0sCisJCQkJCQkJX191OCBsdGtbMTZdKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKwlzdHJ1Y3QgaGNpX2NwX2xlX3N0YXJ0X2VuYyBjcDsKKworCUJUX0RCRygiJXAiLCBjb25uKTsKKworCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOworCisJY3AuaGFuZGxlID0gY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwltZW1jcHkoY3AubHRrLCBsdGssIHNpemVvZihjcC5sdGspKTsKKwljcC5lZGl2ID0gZWRpdjsKKwltZW1jcHkoY3AucmFuZCwgcmFuZCwgc2l6ZW9mKHJhbmQpKTsKKworCWhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfTEVfU1RBUlRfRU5DLCBzaXplb2YoY3ApLCAmY3ApOworfQorRVhQT1JUX1NZTUJPTChoY2lfbGVfc3RhcnRfZW5jKTsKKwordm9pZCBoY2lfbGVfbHRrX3JlcGx5KHN0cnVjdCBoY2lfY29ubiAqY29ubiwgdTggbHRrWzE2XSkKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhkZXY7CisJc3RydWN0IGhjaV9jcF9sZV9sdGtfcmVwbHkgY3A7CisKKwlCVF9EQkcoIiVwIiwgY29ubik7CisKKwltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKKworCWNwLmhhbmRsZSA9IGNwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJbWVtY3B5KGNwLmx0aywgbHRrLCBzaXplb2YobHRrKSk7CisKKwloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX0xFX0xUS19SRVBMWSwgc2l6ZW9mKGNwKSwgJmNwKTsKK30KK0VYUE9SVF9TWU1CT0woaGNpX2xlX2x0a19yZXBseSk7CisKK3ZvaWQgaGNpX2xlX2x0a19uZWdfcmVwbHkoc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKwlzdHJ1Y3QgaGNpX2NwX2xlX2x0a19uZWdfcmVwbHkgY3A7CisKKwlCVF9EQkcoIiVwIiwgY29ubik7CisKKwltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKKworCWNwLmhhbmRsZSA9IGNwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisKKwloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX0xFX0xUS19ORUdfUkVQTFksIHNpemVvZihjcCksICZjcCk7Cit9CisKIC8qIERldmljZSBfbXVzdF8gYmUgbG9ja2VkICovCiB2b2lkIGhjaV9zY29fc2V0dXAoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cykKIHsKQEAgLTM5Myw2ICs0NDQsOSBAQAogCiAJaGNpX2Rldl9wdXQoaGRldik7CiAKKwlpZiAoY29ubi0+aGFuZGxlID09IDApCisJCWtmcmVlKGNvbm4pOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ0NywxNCArNTAxLDIzIEBACiAJQlRfREJHKCIlcyBkc3QgJXMiLCBoZGV2LT5uYW1lLCBiYXRvc3RyKGRzdCkpOwogCiAJaWYgKHR5cGUgPT0gTEVfTElOSykgeworCQlzdHJ1Y3QgYWR2X2VudHJ5ICplbnRyeTsKKwogCQlsZSA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIExFX0xJTkssIGRzdCk7CiAJCWlmIChsZSkKIAkJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CisKKwkJZW50cnkgPSBoY2lfZmluZF9hZHZfZW50cnkoaGRldiwgZHN0KTsKKwkJaWYgKCFlbnRyeSkKKwkJCXJldHVybiBFUlJfUFRSKC1FSE9TVFVOUkVBQ0gpOworCiAJCWxlID0gaGNpX2Nvbm5fYWRkKGhkZXYsIExFX0xJTkssIGRzdCk7CiAJCWlmICghbGUpCiAJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQkJaWYgKGxlLT5zdGF0ZSA9PSBCVF9PUEVOKQotCQkJaGNpX2xlX2Nvbm5lY3QobGUpOworCisJCWxlLT5kc3RfdHlwZSA9IGVudHJ5LT5iZGFkZHJfdHlwZTsKKworCQloY2lfbGVfY29ubmVjdChsZSk7CiAKIAkJaGNpX2Nvbm5faG9sZChsZSk7CiAKQEAgLTQ5Nyw3ICs1NjAsNyBAQAogCWlmIChhY2wtPnN0YXRlID09IEJUX0NPTk5FQ1RFRCAmJgogCQkJKHNjby0+c3RhdGUgPT0gQlRfT1BFTiB8fCBzY28tPnN0YXRlID09IEJUX0NMT1NFRCkpIHsKIAkJYWNsLT5wb3dlcl9zYXZlID0gMTsKLQkJaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoYWNsKTsKKwkJaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoYWNsLCBCVF9QT1dFUl9GT1JDRV9BQ1RJVkVfT04pOwogCiAJCWlmICh0ZXN0X2JpdChIQ0lfQ09OTl9NT0RFX0NIQU5HRV9QRU5ELCAmYWNsLT5wZW5kKSkgewogCQkJLyogZGVmZXIgU0NPIHNldHVwIHVudGlsIG1vZGUgY2hhbmdlIGNvbXBsZXRlZCAqLwpAQCAtNTQ4LDYgKzYxMSw4IEBACiAJCWNwLmhhbmRsZSA9IGNwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CiAJCWhjaV9zZW5kX2NtZChjb25uLT5oZGV2LCBIQ0lfT1BfQVVUSF9SRVFVRVNURUQsCiAJCQkJCQkJc2l6ZW9mKGNwKSwgJmNwKTsKKwkJaWYgKGNvbm4tPmtleV90eXBlICE9IDB4ZmYpCisJCQlzZXRfYml0KEhDSV9DT05OX1JFQVVUSF9QRU5ELCAmY29ubi0+cGVuZCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC02MDgsMTEgKzY3MywxMSBAQAogCQlnb3RvIGVuY3J5cHQ7CiAKIGF1dGg6Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fRU5DUllQVF9QRU5ELCAmY29ubi0+cGVuZCkpCisJaWYgKHRlc3RfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmNvbm4tPnBlbmQpKQogCQlyZXR1cm4gMDsKIAotCWhjaV9jb25uX2F1dGgoY29ubiwgc2VjX2xldmVsLCBhdXRoX3R5cGUpOwotCXJldHVybiAwOworCWlmICghaGNpX2Nvbm5fYXV0aChjb25uLCBzZWNfbGV2ZWwsIGF1dGhfdHlwZSkpCisJCXJldHVybiAwOwogCiBlbmNyeXB0OgogCWlmIChjb25uLT5saW5rX21vZGUgJiBIQ0lfTE1fRU5DUllQVCkKQEAgLTYzMSw5ICs2OTYsNyBAQAogCWlmIChzZWNfbGV2ZWwgIT0gQlRfU0VDVVJJVFlfSElHSCkKIAkJcmV0dXJuIDE7IC8qIEFjY2VwdCBpZiBub24tc2VjdXJlIGlzIHJlcXVpcmVkICovCiAKLQlpZiAoY29ubi0+a2V5X3R5cGUgPT0gSENJX0xLX0FVVEhfQ09NQklOQVRJT04gfHwKLQkJCShjb25uLT5rZXlfdHlwZSA9PSBIQ0lfTEtfQ09NQklOQVRJT04gJiYKLQkJCWNvbm4tPnBpbl9sZW5ndGggPT0gMTYpKQorCWlmIChjb25uLT5zZWNfbGV2ZWwgPT0gQlRfU0VDVVJJVFlfSElHSCkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsgLyogUmVqZWN0IG5vdCBzZWN1cmUgbGluayAqLwpAQCAtNjc2LDcgKzczOSw3IEBACiBFWFBPUlRfU1lNQk9MKGhjaV9jb25uX3N3aXRjaF9yb2xlKTsKIAogLyogRW50ZXIgYWN0aXZlIG1vZGUgKi8KLXZvaWQgaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoc3RydWN0IGhjaV9jb25uICpjb25uKQordm9pZCBoY2lfY29ubl9lbnRlcl9hY3RpdmVfbW9kZShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggZm9yY2VfYWN0aXZlKQogewogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKIApAQCAtNjg1LDcgKzc0OCwxMCBAQAogCWlmICh0ZXN0X2JpdChIQ0lfUkFXLCAmaGRldi0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKLQlpZiAoY29ubi0+bW9kZSAhPSBIQ0lfQ01fU05JRkYgfHwgIWNvbm4tPnBvd2VyX3NhdmUpCisJaWYgKGNvbm4tPm1vZGUgIT0gSENJX0NNX1NOSUZGKQorCQlnb3RvIHRpbWVyOworCisJaWYgKCFjb25uLT5wb3dlcl9zYXZlICYmICFmb3JjZV9hY3RpdmUpCiAJCWdvdG8gdGltZXI7CiAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fTU9ERV9DSEFOR0VfUEVORCwgJmNvbm4tPnBlbmQpKSB7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKaW5kZXggODE1MjY5Yi4uZWMwYmMzZiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTQ1LDcgKzE0Niw3IEBACiAKIAlzd2l0Y2ggKGhkZXYtPnJlcV9zdGF0dXMpIHsKIAljYXNlIEhDSV9SRVFfRE9ORToKLQkJZXJyID0gLWJ0X2VycihoZGV2LT5yZXFfcmVzdWx0KTsKKwkJZXJyID0gLWJ0X3RvX2Vycm5vKGhkZXYtPnJlcV9yZXN1bHQpOwogCQlicmVhazsKIAogCWNhc2UgSENJX1JFUV9DQU5DRUxFRDoKQEAgLTUzOSw3ICs1NDAsNyBAQAogCQlyZXQgPSBfX2hjaV9yZXF1ZXN0KGhkZXYsIGhjaV9pbml0X3JlcSwgMCwKIAkJCQkJbXNlY3NfdG9famlmZmllcyhIQ0lfSU5JVF9USU1FT1VUKSk7CiAKLQkJaWYgKGxtcF9sZV9jYXBhYmxlKGhkZXYpKQorCQlpZiAobG1wX2hvc3RfbGVfY2FwYWJsZShoZGV2KSkKIAkJCXJldCA9IF9faGNpX3JlcXVlc3QoaGRldiwgaGNpX2xlX2luaXRfcmVxLCAwLAogCQkJCQltc2Vjc190b19qaWZmaWVzKEhDSV9JTklUX1RJTUVPVVQpKTsKIApAQCAtMTA1Niw2ICsxMDU3LDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBsaW5rX2tleSAqaGNpX2ZpbmRfbHRrKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX2xlMTYgZWRpdiwgdTggcmFuZFs4XSkKK3sKKwlzdHJ1Y3QgbGlua19rZXkgKms7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGssICZoZGV2LT5saW5rX2tleXMsIGxpc3QpIHsKKwkJc3RydWN0IGtleV9tYXN0ZXJfaWQgKmlkOworCisJCWlmIChrLT50eXBlICE9IEhDSV9MS19TTVBfTFRLKQorCQkJY29udGludWU7CisKKwkJaWYgKGstPmRsZW4gIT0gc2l6ZW9mKCppZCkpCisJCQljb250aW51ZTsKKworCQlpZCA9ICh2b2lkICopICZrLT5kYXRhOworCQlpZiAoaWQtPmVkaXYgPT0gZWRpdiAmJgorCQkJCShtZW1jbXAocmFuZCwgaWQtPnJhbmQsIHNpemVvZihpZC0+cmFuZCkpID09IDApKQorCQkJcmV0dXJuIGs7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9maW5kX2x0ayk7CisKK3N0cnVjdCBsaW5rX2tleSAqaGNpX2ZpbmRfbGlua19rZXlfdHlwZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJYmRhZGRyX3QgKmJkYWRkciwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgbGlua19rZXkgKms7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGssICZoZGV2LT5saW5rX2tleXMsIGxpc3QpCisJCWlmIChrLT50eXBlID09IHR5cGUgJiYgYmFjbXAoYmRhZGRyLCAmay0+YmRhZGRyKSA9PSAwKQorCQkJcmV0dXJuIGs7CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaGNpX2ZpbmRfbGlua19rZXlfdHlwZSk7CisKIGludCBoY2lfYWRkX2xpbmtfa2V5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIGludCBuZXdfa2V5LAogCQkJCWJkYWRkcl90ICpiZGFkZHIsIHU4ICp2YWwsIHU4IHR5cGUsIHU4IHBpbl9sZW4pCiB7CkBAIC0xMTExLDYgKzExNDgsNDQgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGhjaV9hZGRfbHRrKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgbmV3X2tleSwgYmRhZGRyX3QgKmJkYWRkciwKKwkJCXU4IGtleV9zaXplLCBfX2xlMTYgZWRpdiwgdTggcmFuZFs4XSwgdTggbHRrWzE2XSkKK3sKKwlzdHJ1Y3QgbGlua19rZXkgKmtleSwgKm9sZF9rZXk7CisJc3RydWN0IGtleV9tYXN0ZXJfaWQgKmlkOworCXU4IG9sZF9rZXlfdHlwZTsKKworCUJUX0RCRygiJXMgYWRkciAlcyIsIGhkZXYtPm5hbWUsIGJhdG9zdHIoYmRhZGRyKSk7CisKKwlvbGRfa2V5ID0gaGNpX2ZpbmRfbGlua19rZXlfdHlwZShoZGV2LCBiZGFkZHIsIEhDSV9MS19TTVBfTFRLKTsKKwlpZiAob2xkX2tleSkgeworCQlrZXkgPSBvbGRfa2V5OworCQlvbGRfa2V5X3R5cGUgPSBvbGRfa2V5LT50eXBlOworCX0gZWxzZSB7CisJCWtleSA9IGt6YWxsb2Moc2l6ZW9mKCprZXkpICsgc2l6ZW9mKCppZCksIEdGUF9BVE9NSUMpOworCQlpZiAoIWtleSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlsaXN0X2FkZCgma2V5LT5saXN0LCAmaGRldi0+bGlua19rZXlzKTsKKwkJb2xkX2tleV90eXBlID0gMHhmZjsKKwl9CisKKwlrZXktPmRsZW4gPSBzaXplb2YoKmlkKTsKKworCWJhY3B5KCZrZXktPmJkYWRkciwgYmRhZGRyKTsKKwltZW1jcHkoa2V5LT52YWwsIGx0aywgc2l6ZW9mKGtleS0+dmFsKSk7CisJa2V5LT50eXBlID0gSENJX0xLX1NNUF9MVEs7CisJa2V5LT5waW5fbGVuID0ga2V5X3NpemU7CisKKwlpZCA9ICh2b2lkICopICZrZXktPmRhdGE7CisJaWQtPmVkaXYgPSBlZGl2OworCW1lbWNweShpZC0+cmFuZCwgcmFuZCwgc2l6ZW9mKGlkLT5yYW5kKSk7CisKKwlpZiAobmV3X2tleSkKKwkJbWdtdF9uZXdfa2V5KGhkZXYtPmlkLCBrZXksIG9sZF9rZXlfdHlwZSk7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGhjaV9yZW1vdmVfbGlua19rZXkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIpCiB7CiAJc3RydWN0IGxpbmtfa2V5ICprZXk7CkBAIC0xMjAyLDYgKzEyNzcsMTY5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBiZGFkZHJfbGlzdCAqaGNpX2JsYWNrbGlzdF9sb29rdXAoc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkJCQliZGFkZHJfdCAqYmRhZGRyKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZoZGV2LT5ibGFja2xpc3QpIHsKKwkJc3RydWN0IGJkYWRkcl9saXN0ICpiOworCisJCWIgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBiZGFkZHJfbGlzdCwgbGlzdCk7CisKKwkJaWYgKGJhY21wKGJkYWRkciwgJmItPmJkYWRkcikgPT0gMCkKKwkJCXJldHVybiBiOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQgaGNpX2JsYWNrbGlzdF9jbGVhcihzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmaGRldi0+YmxhY2tsaXN0KSB7CisJCXN0cnVjdCBiZGFkZHJfbGlzdCAqYjsKKworCQliID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmRhZGRyX2xpc3QsIGxpc3QpOworCisJCWxpc3RfZGVsKHApOworCQlrZnJlZShiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGhjaV9ibGFja2xpc3RfYWRkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKQoreworCXN0cnVjdCBiZGFkZHJfbGlzdCAqZW50cnk7CisJaW50IGVycjsKKworCWlmIChiYWNtcChiZGFkZHIsIEJEQUREUl9BTlkpID09IDApCisJCXJldHVybiAtRUJBREY7CisKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CisKKwlpZiAoaGNpX2JsYWNrbGlzdF9sb29rdXAoaGRldiwgYmRhZGRyKSkgeworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIGVycjsKKwl9CisKKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiZGFkZHJfbGlzdCksIEdGUF9LRVJORUwpOworCWlmICghZW50cnkpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCWJhY3B5KCZlbnRyeS0+YmRhZGRyLCBiZGFkZHIpOworCisJbGlzdF9hZGQoJmVudHJ5LT5saXN0LCAmaGRldi0+YmxhY2tsaXN0KTsKKworCWVyciA9IDA7CisKK2VycjoKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaGNpX2JsYWNrbGlzdF9kZWwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIpCit7CisJc3RydWN0IGJkYWRkcl9saXN0ICplbnRyeTsKKwlpbnQgZXJyID0gMDsKKworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKworCWlmIChiYWNtcChiZGFkZHIsIEJEQUREUl9BTlkpID09IDApIHsKKwkJaGNpX2JsYWNrbGlzdF9jbGVhcihoZGV2KTsKKwkJZ290byBkb25lOworCX0KKworCWVudHJ5ID0gaGNpX2JsYWNrbGlzdF9sb29rdXAoaGRldiwgYmRhZGRyKTsKKwlpZiAoIWVudHJ5KSB7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlsaXN0X2RlbCgmZW50cnktPmxpc3QpOworCWtmcmVlKGVudHJ5KTsKKworZG9uZToKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBoY2lfY2xlYXJfYWR2X2NhY2hlKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gKHZvaWQgKikgYXJnOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJaGNpX2Fkdl9lbnRyaWVzX2NsZWFyKGhkZXYpOworCisJaGNpX2Rldl91bmxvY2soaGRldik7Cit9CisKK2ludCBoY2lfYWR2X2VudHJpZXNfY2xlYXIoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IGFkdl9lbnRyeSAqZW50cnksICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHRtcCwgJmhkZXYtPmFkdl9lbnRyaWVzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJCWtmcmVlKGVudHJ5KTsKKwl9CisKKwlCVF9EQkcoIiVzIGFkdiBjYWNoZSBjbGVhcmVkIiwgaGRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFkdl9lbnRyeSAqaGNpX2ZpbmRfYWR2X2VudHJ5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKQoreworCXN0cnVjdCBhZHZfZW50cnkgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmhkZXYtPmFkdl9lbnRyaWVzLCBsaXN0KQorCQlpZiAoYmFjbXAoYmRhZGRyLCAmZW50cnktPmJkYWRkcikgPT0gMCkKKwkJCXJldHVybiBlbnRyeTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19jb25uZWN0YWJsZV9hZHYodTggZXZ0X3R5cGUpCit7CisJaWYgKGV2dF90eXBlID09IEFEVl9JTkQgfHwgZXZ0X3R5cGUgPT0gQURWX0RJUkVDVF9JTkQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBoY2lfYWRkX2Fkdl9lbnRyeShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJc3RydWN0IGhjaV9ldl9sZV9hZHZlcnRpc2luZ19pbmZvICpldikKK3sKKwlzdHJ1Y3QgYWR2X2VudHJ5ICplbnRyeTsKKworCWlmICghaXNfY29ubmVjdGFibGVfYWR2KGV2LT5ldnRfdHlwZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT25seSBuZXcgZW50cmllcyBzaG91bGQgYmUgYWRkZWQgdG8gYWR2X2VudHJpZXMuIFNvLCBpZgorCSAqIGJkYWRkciB3YXMgZm91bmQsIGRvbid0IGFkZCBpdC4gKi8KKwlpZiAoaGNpX2ZpbmRfYWR2X2VudHJ5KGhkZXYsICZldi0+YmRhZGRyKSkKKwkJcmV0dXJuIDA7CisKKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOworCWlmICghZW50cnkpCisJCXJldHVybiAtRU5PTUVNOworCisJYmFjcHkoJmVudHJ5LT5iZGFkZHIsICZldi0+YmRhZGRyKTsKKwllbnRyeS0+YmRhZGRyX3R5cGUgPSBldi0+YmRhZGRyX3R5cGU7CisKKwlsaXN0X2FkZCgmZW50cnktPmxpc3QsICZoZGV2LT5hZHZfZW50cmllcyk7CisKKwlCVF9EQkcoIiVzIGFkdiBlbnRyeSBhZGRlZDogYWRkcmVzcyAlcyB0eXBlICV1IiwgaGRldi0+bmFtZSwKKwkJCQliYXRvc3RyKCZlbnRyeS0+YmRhZGRyKSwgZW50cnktPmJkYWRkcl90eXBlKTsKKworCXJldHVybiAwOworfQorCiAvKiBSZWdpc3RlciBIQ0kgZGV2aWNlICovCiBpbnQgaGNpX3JlZ2lzdGVyX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKQEAgLTEyNjgsNiArMTUwNiwxMCBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJmhkZXYtPnJlbW90ZV9vb2JfZGF0YSk7CiAKKwlJTklUX0xJU1RfSEVBRCgmaGRldi0+YWR2X2VudHJpZXMpOworCXNldHVwX3RpbWVyKCZoZGV2LT5hZHZfdGltZXIsIGhjaV9jbGVhcl9hZHZfY2FjaGUsCisJCQkJCQkodW5zaWduZWQgbG9uZykgaGRldik7CisKIAlJTklUX1dPUksoJmhkZXYtPnBvd2VyX29uLCBoY2lfcG93ZXJfb24pOwogCUlOSVRfV09SSygmaGRldi0+cG93ZXJfb2ZmLCBoY2lfcG93ZXJfb2ZmKTsKIAlzZXR1cF90aW1lcigmaGRldi0+b2ZmX3RpbWVyLCBoY2lfYXV0b19vZmYsICh1bnNpZ25lZCBsb25nKSBoZGV2KTsKQEAgLTEyODIsNiArMTUyNCwxMSBAQAogCWlmICghaGRldi0+d29ya3F1ZXVlKQogCQlnb3RvIG5vbWVtOwogCisJaGRldi0+dGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFlcykiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKGhkZXYtPnRmbSkpCisJCUJUX0lORk8oIkZhaWxlZCB0byBsb2FkIHRyYW5zZm9ybSBmb3IgZWNiKGFlcyk6ICVsZCIsCisJCQkJCQkJUFRSX0VSUihoZGV2LT50Zm0pKTsKKwogCWhjaV9yZWdpc3Rlcl9zeXNmcyhoZGV2KTsKIAogCWhkZXYtPnJma2lsbCA9IHJma2lsbF9hbGxvYyhoZGV2LT5uYW1lLCAmaGRldi0+ZGV2LApAQCAtMTMzMCw2ICsxNTc3LDkgQEAKIAkJCQkJIXRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmZsYWdzKSkKIAkJbWdtdF9pbmRleF9yZW1vdmVkKGhkZXYtPmlkKTsKIAorCWlmICghSVNfRVJSKGhkZXYtPnRmbSkpCisJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihoZGV2LT50Zm0pOworCiAJaGNpX25vdGlmeShoZGV2LCBIQ0lfREVWX1VOUkVHKTsKIAogCWlmIChoZGV2LT5yZmtpbGwpIHsKQEAgLTEzNDAsNiArMTU5MCw3IEBACiAJaGNpX3VucmVnaXN0ZXJfc3lzZnMoaGRldik7CiAKIAloY2lfZGVsX29mZl90aW1lcihoZGV2KTsKKwlkZWxfdGltZXIoJmhkZXYtPmFkdl90aW1lcik7CiAKIAlkZXN0cm95X3dvcmtxdWV1ZShoZGV2LT53b3JrcXVldWUpOwogCkBAIC0xMzQ4LDYgKzE1OTksNyBAQAogCWhjaV91dWlkc19jbGVhcihoZGV2KTsKIAloY2lfbGlua19rZXlzX2NsZWFyKGhkZXYpOwogCWhjaV9yZW1vdGVfb29iX2RhdGFfY2xlYXIoaGRldik7CisJaGNpX2Fkdl9lbnRyaWVzX2NsZWFyKGhkZXYpOwogCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogCiAJX19oY2lfZGV2X3B1dChoZGV2KTsKQEAgLTE1MTksNyArMTc3MSw3IEBACiAKIAkJZGF0YSArPSAoY291bnQgLSByZW0pOwogCQljb3VudCA9IHJlbTsKLQl9OworCX0KIAogCXJldHVybiByZW07CiB9CkBAIC0xNTU0LDcgKzE4MDYsNyBAQAogCiAJCWRhdGEgKz0gKGNvdW50IC0gcmVtKTsKIAkJY291bnQgPSByZW07Ci0JfTsKKwl9CiAKIAlyZXR1cm4gcmVtOwogfQpAQCAtMTg5MSw3ICsyMTQzLDcgQEAKIAkJd2hpbGUgKHF1b3RlLS0gJiYgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjb25uLT5kYXRhX3EpKSkgewogCQkJQlRfREJHKCJza2IgJXAgbGVuICVkIiwgc2tiLCBza2ItPmxlbik7CiAKLQkJCWhjaV9jb25uX2VudGVyX2FjdGl2ZV9tb2RlKGNvbm4pOworCQkJaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoY29ubiwgYnRfY2Ioc2tiKS0+Zm9yY2VfYWN0aXZlKTsKIAogCQkJaGNpX3NlbmRfZnJhbWUoc2tiKTsKIAkJCWhkZXYtPmFjbF9sYXN0X3R4ID0gamlmZmllczsKQEAgLTIwMzAsNyArMjI4Miw3IEBACiAJaWYgKGNvbm4pIHsKIAkJcmVnaXN0ZXIgc3RydWN0IGhjaV9wcm90byAqaHA7CiAKLQkJaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoY29ubik7CisJCWhjaV9jb25uX2VudGVyX2FjdGl2ZV9tb2RlKGNvbm4sIGJ0X2NiKHNrYiktPmZvcmNlX2FjdGl2ZSk7CiAKIAkJLyogU2VuZCB0byB1cHBlciBwcm90b2NvbCAqLwogCQlocCA9IGhjaV9wcm90b1tIQ0lfUFJPVE9fTDJDQVBdOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYyBiL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKaW5kZXggZjEzZGRiZi4uYTQwMTcwZSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCkBAIC00NSw2ICs0NSw4IEBACiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CiAKK3N0YXRpYyBpbnQgZW5hYmxlX2xlOworCiAvKiBIYW5kbGUgSENJIEV2ZW50IHBhY2tldHMgKi8KIAogc3RhdGljIHZvaWQgaGNpX2NjX2lucXVpcnlfY2FuY2VsKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtNDc3LDE0ICs0NzksMTYgQEAKIAkgKiBjb21tYW5kIG90aGVyd2lzZSAqLwogCXU4IGV2ZW50c1s4XSA9IHsgMHhmZiwgMHhmZiwgMHhmYiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCi0JLyogRXZlbnRzIGZvciAxLjIgYW5kIG5ld2VyIGNvbnRyb2xsZXJzICovCi0JaWYgKGhkZXYtPmxtcF92ZXIgPiAxKSB7Ci0JCWV2ZW50c1s0XSB8PSAweDAxOyAvKiBGbG93IFNwZWNpZmljYXRpb24gQ29tcGxldGUgKi8KLQkJZXZlbnRzWzRdIHw9IDB4MDI7IC8qIElucXVpcnkgUmVzdWx0IHdpdGggUlNTSSAqLwotCQlldmVudHNbNF0gfD0gMHgwNDsgLyogUmVhZCBSZW1vdGUgRXh0ZW5kZWQgRmVhdHVyZXMgQ29tcGxldGUgKi8KLQkJZXZlbnRzWzVdIHw9IDB4MDg7IC8qIFN5bmNocm9ub3VzIENvbm5lY3Rpb24gQ29tcGxldGUgKi8KLQkJZXZlbnRzWzVdIHw9IDB4MTA7IC8qIFN5bmNocm9ub3VzIENvbm5lY3Rpb24gQ2hhbmdlZCAqLwotCX0KKwkvKiBDU1IgMS4xIGRvbmdsZXMgZG9lcyBub3QgYWNjZXB0IGFueSBiaXRmaWVsZCBzbyBkb24ndCB0cnkgdG8gc2V0CisJICogYW55IGV2ZW50IG1hc2sgZm9yIHByZSAxLjIgZGV2aWNlcyAqLworCWlmIChoZGV2LT5sbXBfdmVyIDw9IDEpCisJCXJldHVybjsKKworCWV2ZW50c1s0XSB8PSAweDAxOyAvKiBGbG93IFNwZWNpZmljYXRpb24gQ29tcGxldGUgKi8KKwlldmVudHNbNF0gfD0gMHgwMjsgLyogSW5xdWlyeSBSZXN1bHQgd2l0aCBSU1NJICovCisJZXZlbnRzWzRdIHw9IDB4MDQ7IC8qIFJlYWQgUmVtb3RlIEV4dGVuZGVkIEZlYXR1cmVzIENvbXBsZXRlICovCisJZXZlbnRzWzVdIHw9IDB4MDg7IC8qIFN5bmNocm9ub3VzIENvbm5lY3Rpb24gQ29tcGxldGUgKi8KKwlldmVudHNbNV0gfD0gMHgxMDsgLyogU3luY2hyb25vdXMgQ29ubmVjdGlvbiBDaGFuZ2VkICovCiAKIAlpZiAoaGRldi0+ZmVhdHVyZXNbM10gJiBMTVBfUlNTSV9JTlEpCiAJCWV2ZW50c1s0XSB8PSAweDA0OyAvKiBJbnF1aXJ5IFJlc3VsdCB3aXRoIFJTU0kgKi8KQEAgLTUyMyw2ICs1MjcsMjAgQEAKIAloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1NFVF9FVkVOVF9NQVNLLCBzaXplb2YoZXZlbnRzKSwgZXZlbnRzKTsKIH0KIAorc3RhdGljIHZvaWQgaGNpX3NldF9sZV9zdXBwb3J0KHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfY3Bfd3JpdGVfbGVfaG9zdF9zdXBwb3J0ZWQgY3A7CisKKwltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKKworCWlmIChlbmFibGVfbGUpIHsKKwkJY3AubGUgPSAxOworCQljcC5zaW11bCA9ICEhKGhkZXYtPmZlYXR1cmVzWzZdICYgTE1QX1NJTVVMX0xFX0JSKTsKKwl9CisKKwloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1dSSVRFX0xFX0hPU1RfU1VQUE9SVEVELCBzaXplb2YoY3ApLCAmY3ApOworfQorCiBzdGF0aWMgdm9pZCBoY2lfc2V0dXAoc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7CiAJaGNpX3NldHVwX2V2ZW50X21hc2soaGRldik7CkBAIC01NDAsNiArNTU4LDE3IEBACiAKIAlpZiAoaGRldi0+ZmVhdHVyZXNbN10gJiBMTVBfSU5RX1RYX1BXUikKIAkJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9SRUFEX0lOUV9SU1BfVFhfUE9XRVIsIDAsIE5VTEwpOworCisJaWYgKGhkZXYtPmZlYXR1cmVzWzddICYgTE1QX0VYVEZFQVRVUkVTKSB7CisJCXN0cnVjdCBoY2lfY3BfcmVhZF9sb2NhbF9leHRfZmVhdHVyZXMgY3A7CisKKwkJY3AucGFnZSA9IDB4MDE7CisJCWhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfUkVBRF9MT0NBTF9FWFRfRkVBVFVSRVMsCisJCQkJCQkJc2l6ZW9mKGNwKSwgJmNwKTsKKwl9CisKKwlpZiAoaGRldi0+ZmVhdHVyZXNbNF0gJiBMTVBfTEUpCisJCWhjaV9zZXRfbGVfc3VwcG9ydChoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgaGNpX2NjX3JlYWRfbG9jYWxfdmVyc2lvbihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTY1Niw2ICs2ODUsMjEgQEAKIAkJCQkJaGRldi0+ZmVhdHVyZXNbNl0sIGhkZXYtPmZlYXR1cmVzWzddKTsKIH0KIAorc3RhdGljIHZvaWQgaGNpX2NjX3JlYWRfbG9jYWxfZXh0X2ZlYXR1cmVzKHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ycF9yZWFkX2xvY2FsX2V4dF9mZWF0dXJlcyAqcnAgPSAodm9pZCAqKSBza2ItPmRhdGE7CisKKwlCVF9EQkcoIiVzIHN0YXR1cyAweCV4IiwgaGRldi0+bmFtZSwgcnAtPnN0YXR1cyk7CisKKwlpZiAocnAtPnN0YXR1cykKKwkJcmV0dXJuOworCisJbWVtY3B5KGhkZXYtPmV4dGZlYXR1cmVzLCBycC0+ZmVhdHVyZXMsIDgpOworCisJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBIQ0lfT1BfUkVBRF9MT0NBTF9FWFRfRkVBVFVSRVMsIHJwLT5zdGF0dXMpOworfQorCiBzdGF0aWMgdm9pZCBoY2lfY2NfcmVhZF9idWZmZXJfc2l6ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaGNpX3JwX3JlYWRfYnVmZmVyX3NpemUgKnJwID0gKHZvaWQgKikgc2tiLT5kYXRhOwpAQCAtODM5LDYgKzg4Myw3MiBAQAogCQkJCQkJcnAtPnJhbmRvbWl6ZXIsIHJwLT5zdGF0dXMpOwogfQogCitzdGF0aWMgdm9pZCBoY2lfY2NfbGVfc2V0X3NjYW5fZW5hYmxlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfY3BfbGVfc2V0X3NjYW5fZW5hYmxlICpjcDsKKwlfX3U4IHN0YXR1cyA9ICooKF9fdTggKikgc2tiLT5kYXRhKTsKKworCUJUX0RCRygiJXMgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cykKKwkJcmV0dXJuOworCisJY3AgPSBoY2lfc2VudF9jbWRfZGF0YShoZGV2LCBIQ0lfT1BfTEVfU0VUX1NDQU5fRU5BQkxFKTsKKwlpZiAoIWNwKQorCQlyZXR1cm47CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwlpZiAoY3AtPmVuYWJsZSA9PSAweDAxKSB7CisJCWRlbF90aW1lcigmaGRldi0+YWR2X3RpbWVyKTsKKwkJaGNpX2Fkdl9lbnRyaWVzX2NsZWFyKGhkZXYpOworCX0gZWxzZSBpZiAoY3AtPmVuYWJsZSA9PSAweDAwKSB7CisJCW1vZF90aW1lcigmaGRldi0+YWR2X3RpbWVyLCBqaWZmaWVzICsgQURWX0NMRUFSX1RJTUVPVVQpOworCX0KKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworfQorCitzdGF0aWMgdm9pZCBoY2lfY2NfbGVfbHRrX3JlcGx5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfcnBfbGVfbHRrX3JlcGx5ICpycCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKworCUJUX0RCRygiJXMgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBycC0+c3RhdHVzKTsKKworCWlmIChycC0+c3RhdHVzKQorCQlyZXR1cm47CisKKwloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIEhDSV9PUF9MRV9MVEtfUkVQTFksIHJwLT5zdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBoY2lfY2NfbGVfbHRrX25lZ19yZXBseShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX3JwX2xlX2x0a19uZWdfcmVwbHkgKnJwID0gKHZvaWQgKikgc2tiLT5kYXRhOworCisJQlRfREJHKCIlcyBzdGF0dXMgMHgleCIsIGhkZXYtPm5hbWUsIHJwLT5zdGF0dXMpOworCisJaWYgKHJwLT5zdGF0dXMpCisJCXJldHVybjsKKworCWhjaV9yZXFfY29tcGxldGUoaGRldiwgSENJX09QX0xFX0xUS19ORUdfUkVQTFksIHJwLT5zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2NjX3dyaXRlX2xlX2hvc3Rfc3VwcG9ydGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9jcF9yZWFkX2xvY2FsX2V4dF9mZWF0dXJlcyBjcDsKKwlfX3U4IHN0YXR1cyA9ICooKF9fdTggKikgc2tiLT5kYXRhKTsKKworCUJUX0RCRygiJXMgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cykKKwkJcmV0dXJuOworCisJY3AucGFnZSA9IDB4MDE7CisJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9SRUFEX0xPQ0FMX0VYVF9GRUFUVVJFUywgc2l6ZW9mKGNwKSwgJmNwKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGhjaV9jc19pbnF1aXJ5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3U4IHN0YXR1cykKIHsKIAlCVF9EQkcoIiVzIHN0YXR1cyAweCV4IiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKQEAgLTEyMDcsMTYgKzEzMTcsMjMgQEAKIAl9IGVsc2UgewogCQlpZiAoIWNvbm4pIHsKIAkJCWNvbm4gPSBoY2lfY29ubl9hZGQoaGRldiwgTEVfTElOSywgJmNwLT5wZWVyX2FkZHIpOwotCQkJaWYgKGNvbm4pCisJCQlpZiAoY29ubikgeworCQkJCWNvbm4tPmRzdF90eXBlID0gY3AtPnBlZXJfYWRkcl90eXBlOwogCQkJCWNvbm4tPm91dCA9IDE7Ci0JCQllbHNlCisJCQl9IGVsc2UgewogCQkJCUJUX0VSUigiTm8gbWVtb3J5IGZvciBuZXcgY29ubmVjdGlvbiIpOworCQkJfQogCQl9CiAJfQogCiAJaGNpX2Rldl91bmxvY2soaGRldik7CiB9CiAKK3N0YXRpYyB2b2lkIGhjaV9jc19sZV9zdGFydF9lbmMoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHN0YXR1cykKK3sKKwlCVF9EQkcoIiVzIHN0YXR1cyAweCV4IiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGhjaV9pbnF1aXJ5X2NvbXBsZXRlX2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlfX3U4IHN0YXR1cyA9ICooKF9fdTggKikgc2tiLT5kYXRhKTsKQEAgLTE0NjAsNTEgKzE1NzcsNTggQEAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIF9fbGUxNl90b19jcHUoZXYtPmhhbmRsZSkpOwotCWlmIChjb25uKSB7Ci0JCWlmICghZXYtPnN0YXR1cykgeworCWlmICghY29ubikKKwkJZ290byB1bmxvY2s7CisKKwlpZiAoIWV2LT5zdGF0dXMpIHsKKwkJaWYgKCEoY29ubi0+c3NwX21vZGUgPiAwICYmIGhkZXYtPnNzcF9tb2RlID4gMCkgJiYKKwkJCQl0ZXN0X2JpdChIQ0lfQ09OTl9SRUFVVEhfUEVORCwJJmNvbm4tPnBlbmQpKSB7CisJCQlCVF9JTkZPKCJyZS1hdXRoIG9mIGxlZ2FjeSBkZXZpY2UgaXMgbm90IHBvc3NpYmxlLiIpOworCQl9IGVsc2UgewogCQkJY29ubi0+bGlua19tb2RlIHw9IEhDSV9MTV9BVVRIOwogCQkJY29ubi0+c2VjX2xldmVsID0gY29ubi0+cGVuZGluZ19zZWNfbGV2ZWw7Ci0JCX0gZWxzZSB7Ci0JCQltZ210X2F1dGhfZmFpbGVkKGhkZXYtPmlkLCAmY29ubi0+ZHN0LCBldi0+c3RhdHVzKTsKIAkJfQorCX0gZWxzZSB7CisJCW1nbXRfYXV0aF9mYWlsZWQoaGRldi0+aWQsICZjb25uLT5kc3QsIGV2LT5zdGF0dXMpOworCX0KIAotCQljbGVhcl9iaXQoSENJX0NPTk5fQVVUSF9QRU5ELCAmY29ubi0+cGVuZCk7CisJY2xlYXJfYml0KEhDSV9DT05OX0FVVEhfUEVORCwgJmNvbm4tPnBlbmQpOworCWNsZWFyX2JpdChIQ0lfQ09OTl9SRUFVVEhfUEVORCwgJmNvbm4tPnBlbmQpOwogCi0JCWlmIChjb25uLT5zdGF0ZSA9PSBCVF9DT05GSUcpIHsKLQkJCWlmICghZXYtPnN0YXR1cyAmJiBoZGV2LT5zc3BfbW9kZSA+IDAgJiYKLQkJCQkJCQljb25uLT5zc3BfbW9kZSA+IDApIHsKLQkJCQlzdHJ1Y3QgaGNpX2NwX3NldF9jb25uX2VuY3J5cHQgY3A7Ci0JCQkJY3AuaGFuZGxlICA9IGV2LT5oYW5kbGU7Ci0JCQkJY3AuZW5jcnlwdCA9IDB4MDE7Ci0JCQkJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9TRVRfQ09OTl9FTkNSWVBULAotCQkJCQkJCXNpemVvZihjcCksICZjcCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVEVEOwotCQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBldi0+c3RhdHVzKTsKLQkJCQloY2lfY29ubl9wdXQoY29ubik7Ci0JCQl9CisJaWYgKGNvbm4tPnN0YXRlID09IEJUX0NPTkZJRykgeworCQlpZiAoIWV2LT5zdGF0dXMgJiYgaGRldi0+c3NwX21vZGUgPiAwICYmIGNvbm4tPnNzcF9tb2RlID4gMCkgeworCQkJc3RydWN0IGhjaV9jcF9zZXRfY29ubl9lbmNyeXB0IGNwOworCQkJY3AuaGFuZGxlICA9IGV2LT5oYW5kbGU7CisJCQljcC5lbmNyeXB0ID0gMHgwMTsKKwkJCWhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfU0VUX0NPTk5fRU5DUllQVCwgc2l6ZW9mKGNwKSwKKwkJCQkJCQkJCSZjcCk7CiAJCX0gZWxzZSB7Ci0JCQloY2lfYXV0aF9jZm0oY29ubiwgZXYtPnN0YXR1cyk7Ci0KLQkJCWhjaV9jb25uX2hvbGQoY29ubik7Ci0JCQljb25uLT5kaXNjX3RpbWVvdXQgPSBIQ0lfRElTQ09OTl9USU1FT1VUOworCQkJY29ubi0+c3RhdGUgPSBCVF9DT05ORUNURUQ7CisJCQloY2lfcHJvdG9fY29ubmVjdF9jZm0oY29ubiwgZXYtPnN0YXR1cyk7CiAJCQloY2lfY29ubl9wdXQoY29ubik7CiAJCX0KKwl9IGVsc2UgeworCQloY2lfYXV0aF9jZm0oY29ubiwgZXYtPnN0YXR1cyk7CiAKLQkJaWYgKHRlc3RfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmNvbm4tPnBlbmQpKSB7Ci0JCQlpZiAoIWV2LT5zdGF0dXMpIHsKLQkJCQlzdHJ1Y3QgaGNpX2NwX3NldF9jb25uX2VuY3J5cHQgY3A7Ci0JCQkJY3AuaGFuZGxlICA9IGV2LT5oYW5kbGU7Ci0JCQkJY3AuZW5jcnlwdCA9IDB4MDE7Ci0JCQkJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9TRVRfQ09OTl9FTkNSWVBULAotCQkJCQkJCXNpemVvZihjcCksICZjcCk7Ci0JCQl9IGVsc2UgewotCQkJCWNsZWFyX2JpdChIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsICZjb25uLT5wZW5kKTsKLQkJCQloY2lfZW5jcnlwdF9jZm0oY29ubiwgZXYtPnN0YXR1cywgMHgwMCk7Ci0JCQl9CisJCWhjaV9jb25uX2hvbGQoY29ubik7CisJCWNvbm4tPmRpc2NfdGltZW91dCA9IEhDSV9ESVNDT05OX1RJTUVPVVQ7CisJCWhjaV9jb25uX3B1dChjb25uKTsKKwl9CisKKwlpZiAodGVzdF9iaXQoSENJX0NPTk5fRU5DUllQVF9QRU5ELCAmY29ubi0+cGVuZCkpIHsKKwkJaWYgKCFldi0+c3RhdHVzKSB7CisJCQlzdHJ1Y3QgaGNpX2NwX3NldF9jb25uX2VuY3J5cHQgY3A7CisJCQljcC5oYW5kbGUgID0gZXYtPmhhbmRsZTsKKwkJCWNwLmVuY3J5cHQgPSAweDAxOworCQkJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9TRVRfQ09OTl9FTkNSWVBULCBzaXplb2YoY3ApLAorCQkJCQkJCQkJJmNwKTsKKwkJfSBlbHNlIHsKKwkJCWNsZWFyX2JpdChIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsICZjb25uLT5wZW5kKTsKKwkJCWhjaV9lbmNyeXB0X2NmbShjb25uLCBldi0+c3RhdHVzLCAweDAwKTsKIAkJfQogCX0KIAordW5sb2NrOgogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCkBAIC0xNTU1LDYgKzE2NzksNyBAQAogCQkJCS8qIEVuY3J5cHRpb24gaW1wbGllcyBhdXRoZW50aWNhdGlvbiAqLwogCQkJCWNvbm4tPmxpbmtfbW9kZSB8PSBIQ0lfTE1fQVVUSDsKIAkJCQljb25uLT5saW5rX21vZGUgfD0gSENJX0xNX0VOQ1JZUFQ7CisJCQkJY29ubi0+c2VjX2xldmVsID0gY29ubi0+cGVuZGluZ19zZWNfbGV2ZWw7CiAJCQl9IGVsc2UKIAkJCQljb25uLT5saW5rX21vZGUgJj0gfkhDSV9MTV9FTkNSWVBUOwogCQl9CkBAIC0xNzU4LDYgKzE4ODMsMTAgQEAKIAkJaGNpX2NjX3JlYWRfbG9jYWxfZmVhdHVyZXMoaGRldiwgc2tiKTsKIAkJYnJlYWs7CiAKKwljYXNlIEhDSV9PUF9SRUFEX0xPQ0FMX0VYVF9GRUFUVVJFUzoKKwkJaGNpX2NjX3JlYWRfbG9jYWxfZXh0X2ZlYXR1cmVzKGhkZXYsIHNrYik7CisJCWJyZWFrOworCiAJY2FzZSBIQ0lfT1BfUkVBRF9CVUZGRVJfU0laRToKIAkJaGNpX2NjX3JlYWRfYnVmZmVyX3NpemUoaGRldiwgc2tiKTsKIAkJYnJlYWs7CkBAIC0xODE0LDYgKzE5NDMsMjIgQEAKIAkJaGNpX2NjX3VzZXJfY29uZmlybV9uZWdfcmVwbHkoaGRldiwgc2tiKTsKIAkJYnJlYWs7CiAKKwljYXNlIEhDSV9PUF9MRV9TRVRfU0NBTl9FTkFCTEU6CisJCWhjaV9jY19sZV9zZXRfc2Nhbl9lbmFibGUoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9PUF9MRV9MVEtfUkVQTFk6CisJCWhjaV9jY19sZV9sdGtfcmVwbHkoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9PUF9MRV9MVEtfTkVHX1JFUExZOgorCQloY2lfY2NfbGVfbHRrX25lZ19yZXBseShoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX09QX1dSSVRFX0xFX0hPU1RfU1VQUE9SVEVEOgorCQloY2lfY2Nfd3JpdGVfbGVfaG9zdF9zdXBwb3J0ZWQoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlCVF9EQkcoIiVzIG9wY29kZSAweCV4IiwgaGRldi0+bmFtZSwgb3Bjb2RlKTsKIAkJYnJlYWs7CkBAIC0xODkyLDYgKzIwMzcsMTAgQEAKIAkJaGNpX2NzX2xlX2NyZWF0ZV9jb25uKGhkZXYsIGV2LT5zdGF0dXMpOwogCQlicmVhazsKIAorCWNhc2UgSENJX09QX0xFX1NUQVJUX0VOQzoKKwkJaGNpX2NzX2xlX3N0YXJ0X2VuYyhoZGV2LCBldi0+c3RhdHVzKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlCVF9EQkcoIiVzIG9wY29kZSAweCV4IiwgaGRldi0+bmFtZSwgb3Bjb2RlKTsKIAkJYnJlYWs7CkBAIC0yNjU2LDYgKzI4MDUsOCBAQAogCQkJaGNpX2Rldl91bmxvY2soaGRldik7CiAJCQlyZXR1cm47CiAJCX0KKworCQljb25uLT5kc3RfdHlwZSA9IGV2LT5iZGFkZHJfdHlwZTsKIAl9CiAKIAlpZiAoZXYtPnN0YXR1cykgewpAQCAtMjY2OCw2ICsyODE5LDcgQEAKIAogCW1nbXRfY29ubmVjdGVkKGhkZXYtPmlkLCAmZXYtPmJkYWRkcik7CiAKKwljb25uLT5zZWNfbGV2ZWwgPSBCVF9TRUNVUklUWV9MT1c7CiAJY29ubi0+aGFuZGxlID0gX19sZTE2X3RvX2NwdShldi0+aGFuZGxlKTsKIAljb25uLT5zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKIApAQCAtMjY4MCw2ICsyODMyLDY0IEBACiAJaGNpX2Rldl91bmxvY2soaGRldik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfbGVfYWR2X3JlcG9ydF9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZXZfbGVfYWR2ZXJ0aXNpbmdfaW5mbyAqZXY7CisJdTggbnVtX3JlcG9ydHM7CisKKwludW1fcmVwb3J0cyA9IHNrYi0+ZGF0YVswXTsKKwlldiA9ICh2b2lkICopICZza2ItPmRhdGFbMV07CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwloY2lfYWRkX2Fkdl9lbnRyeShoZGV2LCBldik7CisKKwl3aGlsZSAoLS1udW1fcmVwb3J0cykgeworCQlldiA9ICh2b2lkICopIChldi0+ZGF0YSArIGV2LT5sZW5ndGggKyAxKTsKKwkJaGNpX2FkZF9hZHZfZW50cnkoaGRldiwgZXYpOworCX0KKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2xlX2x0a19yZXF1ZXN0X2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ldl9sZV9sdGtfcmVxICpldiA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaGNpX2NwX2xlX2x0a19yZXBseSBjcDsKKwlzdHJ1Y3QgaGNpX2NwX2xlX2x0a19uZWdfcmVwbHkgbmVnOworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwlzdHJ1Y3QgbGlua19rZXkgKmx0azsKKworCUJUX0RCRygiJXMgaGFuZGxlICVkIiwgaGRldi0+bmFtZSwgY3B1X3RvX2xlMTYoZXYtPmhhbmRsZSkpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2hhbmRsZShoZGV2LCBfX2xlMTZfdG9fY3B1KGV2LT5oYW5kbGUpKTsKKwlpZiAoY29ubiA9PSBOVUxMKQorCQlnb3RvIG5vdF9mb3VuZDsKKworCWx0ayA9IGhjaV9maW5kX2x0ayhoZGV2LCBldi0+ZWRpdiwgZXYtPnJhbmRvbSk7CisJaWYgKGx0ayA9PSBOVUxMKQorCQlnb3RvIG5vdF9mb3VuZDsKKworCW1lbWNweShjcC5sdGssIGx0ay0+dmFsLCBzaXplb2YobHRrLT52YWwpKTsKKwljcC5oYW5kbGUgPSBjcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCWNvbm4tPnBpbl9sZW5ndGggPSBsdGstPnBpbl9sZW47CisKKwloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX0xFX0xUS19SRVBMWSwgc2l6ZW9mKGNwKSwgJmNwKTsKKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCisJcmV0dXJuOworCitub3RfZm91bmQ6CisJbmVnLmhhbmRsZSA9IGV2LT5oYW5kbGU7CisJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9MRV9MVEtfTkVHX1JFUExZLCBzaXplb2YobmVnKSwgJm5lZyk7CisJaGNpX2Rldl91bmxvY2soaGRldik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfbGVfbWV0YV9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGhjaV9ldl9sZV9tZXRhICpsZV9ldiA9ICh2b2lkICopIHNrYi0+ZGF0YTsKQEAgLTI2OTEsNiArMjkwMSwxNCBAQAogCQloY2lfbGVfY29ubl9jb21wbGV0ZV9ldnQoaGRldiwgc2tiKTsKIAkJYnJlYWs7CiAKKwljYXNlIEhDSV9FVl9MRV9BRFZFUlRJU0lOR19SRVBPUlQ6CisJCWhjaV9sZV9hZHZfcmVwb3J0X2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX0VWX0xFX0xUS19SRVE6CisJCWhjaV9sZV9sdGtfcmVxdWVzdF9ldnQoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0yODg0LDMgKzMxMDIsNiBAQAogCWhjaV9zZW5kX3RvX3NvY2soaGRldiwgc2tiLCBOVUxMKTsKIAlrZnJlZV9za2Ioc2tiKTsKIH0KKworbW9kdWxlX3BhcmFtKGVuYWJsZV9sZSwgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9sZSwgIkVuYWJsZSBMRSBzdXBwb3J0Iik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKaW5kZXggMjk1ZTRhOC4uZmYwMmNmNSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwpAQCAtMTgwLDgyICsxODAsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGJkYWRkcl9saXN0ICpoY2lfYmxhY2tsaXN0X2xvb2t1cChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCi0JbGlzdF9mb3JfZWFjaChwLCAmaGRldi0+YmxhY2tsaXN0KSB7Ci0JCXN0cnVjdCBiZGFkZHJfbGlzdCAqYjsKLQotCQliID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmRhZGRyX2xpc3QsIGxpc3QpOwotCi0JCWlmIChiYWNtcChiZGFkZHIsICZiLT5iZGFkZHIpID09IDApCi0JCQlyZXR1cm4gYjsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBoY2lfYmxhY2tsaXN0X2FkZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgaGNpX3NvY2tfYmxhY2tsaXN0X2FkZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAliZGFkZHJfdCBiZGFkZHI7Ci0Jc3RydWN0IGJkYWRkcl9saXN0ICplbnRyeTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmYmRhZGRyLCBhcmcsIHNpemVvZihiZGFkZHIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAoYmFjbXAoJmJkYWRkciwgQkRBRERSX0FOWSkgPT0gMCkKLQkJcmV0dXJuIC1FQkFERjsKLQotCWlmIChoY2lfYmxhY2tsaXN0X2xvb2t1cChoZGV2LCAmYmRhZGRyKSkKLQkJcmV0dXJuIC1FRVhJU1Q7Ci0KLQllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBiZGFkZHJfbGlzdCksIEdGUF9LRVJORUwpOwotCWlmICghZW50cnkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYmFjcHkoJmVudHJ5LT5iZGFkZHIsICZiZGFkZHIpOwotCi0JbGlzdF9hZGQoJmVudHJ5LT5saXN0LCAmaGRldi0+YmxhY2tsaXN0KTsKLQotCXJldHVybiAwOworCXJldHVybiBoY2lfYmxhY2tsaXN0X2FkZChoZGV2LCAmYmRhZGRyKTsKIH0KIAotaW50IGhjaV9ibGFja2xpc3RfY2xlYXIoc3RydWN0IGhjaV9kZXYgKmhkZXYpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJmhkZXYtPmJsYWNrbGlzdCkgewotCQlzdHJ1Y3QgYmRhZGRyX2xpc3QgKmI7Ci0KLQkJYiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJkYWRkcl9saXN0LCBsaXN0KTsKLQotCQlsaXN0X2RlbChwKTsKLQkJa2ZyZWUoYik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGNpX2JsYWNrbGlzdF9kZWwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IGhjaV9zb2NrX2JsYWNrbGlzdF9kZWwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgX191c2VyICphcmcpCiB7CiAJYmRhZGRyX3QgYmRhZGRyOwotCXN0cnVjdCBiZGFkZHJfbGlzdCAqZW50cnk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmJkYWRkciwgYXJnLCBzaXplb2YoYmRhZGRyKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKGJhY21wKCZiZGFkZHIsIEJEQUREUl9BTlkpID09IDApCi0JCXJldHVybiBoY2lfYmxhY2tsaXN0X2NsZWFyKGhkZXYpOwotCi0JZW50cnkgPSBoY2lfYmxhY2tsaXN0X2xvb2t1cChoZGV2LCAmYmRhZGRyKTsKLQlpZiAoIWVudHJ5KQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0Ja2ZyZWUoZW50cnkpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGhjaV9ibGFja2xpc3RfZGVsKGhkZXYsICZiZGFkZHIpOwogfQogCiAvKiBJb2N0bHMgdGhhdCByZXF1aXJlIGJvdW5kIHNvY2tldCAqLwpAQCAtMjkwLDEyICsyMzIsMTIgQEAKIAljYXNlIEhDSUJMT0NLQUREUjoKIAkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCXJldHVybiBoY2lfYmxhY2tsaXN0X2FkZChoZGV2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJcmV0dXJuIGhjaV9zb2NrX2JsYWNrbGlzdF9hZGQoaGRldiwgKHZvaWQgX191c2VyICopIGFyZyk7CiAKIAljYXNlIEhDSVVOQkxPQ0tBRERSOgogCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJcmV0dXJuIGhjaV9ibGFja2xpc3RfZGVsKGhkZXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQlyZXR1cm4gaGNpX3NvY2tfYmxhY2tsaXN0X2RlbChoZGV2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKIAogCWRlZmF1bHQ6CiAJCWlmIChoZGV2LT5pb2N0bCkKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCmluZGV4IGM0MDVhOTUuLjQzYjRjMmQgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwpAQCAtNDY0LDcgKzQ2NCw4IEBACiB7CiAJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiA9IChzdHJ1Y3QgaGlkcF9zZXNzaW9uICopIGFyZzsKIAotCWt0aHJlYWRfc3RvcChzZXNzaW9uLT50YXNrKTsKKwlhdG9taWNfaW5jKCZzZXNzaW9uLT50ZXJtaW5hdGUpOworCXdha2VfdXBfcHJvY2VzcyhzZXNzaW9uLT50YXNrKTsKIH0KIAogc3RhdGljIHZvaWQgaGlkcF9zZXRfdGltZXIoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKQEAgLTUzNSw3ICs1MzYsOCBAQAogCQlza2JfcXVldWVfcHVyZ2UoJnNlc3Npb24tPmN0cmxfdHJhbnNtaXQpOwogCQlza2JfcXVldWVfcHVyZ2UoJnNlc3Npb24tPmludHJfdHJhbnNtaXQpOwogCi0JCWt0aHJlYWRfc3RvcChzZXNzaW9uLT50YXNrKTsKKwkJYXRvbWljX2luYygmc2Vzc2lvbi0+dGVybWluYXRlKTsKKwkJd2FrZV91cF9wcm9jZXNzKGN1cnJlbnQpOwogCX0KIH0KIApAQCAtNzA2LDkgKzcwOCw4IEBACiAJYWRkX3dhaXRfcXVldWUoc2tfc2xlZXAoaW50cl9zayksICZpbnRyX3dhaXQpOwogCXNlc3Npb24tPndhaXRpbmdfZm9yX3N0YXJ0dXAgPSAwOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2Vzc2lvbi0+c3RhcnR1cF9xdWV1ZSk7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJd2hpbGUgKCFhdG9taWNfcmVhZCgmc2Vzc2lvbi0+dGVybWluYXRlKSkgewogCQlpZiAoY3RybF9zay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEIHx8CiAJCQkJaW50cl9zay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKQogCQkJYnJlYWs7CkBAIC03MjYsNiArNzI3LDcgQEAKIAkJaGlkcF9wcm9jZXNzX3RyYW5zbWl0KHNlc3Npb24pOwogCiAJCXNjaGVkdWxlKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJfQogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmVtb3ZlX3dhaXRfcXVldWUoc2tfc2xlZXAoaW50cl9zayksICZpbnRyX3dhaXQpOwpAQCAtMTA2MCw3ICsxMDYyLDggQEAKIGVycl9hZGRfZGV2aWNlOgogCWhpZF9kZXN0cm95X2RldmljZShzZXNzaW9uLT5oaWQpOwogCXNlc3Npb24tPmhpZCA9IE5VTEw7Ci0Ja3RocmVhZF9zdG9wKHNlc3Npb24tPnRhc2spOworCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7CisJd2FrZV91cF9wcm9jZXNzKHNlc3Npb24tPnRhc2spOwogCiB1bmxpbms6CiAJaGlkcF9kZWxfdGltZXIoc2Vzc2lvbik7CkBAIC0xMTExLDcgKzExMTQsOCBAQAogCQkJc2tiX3F1ZXVlX3B1cmdlKCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0KTsKIAkJCXNrYl9xdWV1ZV9wdXJnZSgmc2Vzc2lvbi0+aW50cl90cmFuc21pdCk7CiAKLQkJCWt0aHJlYWRfc3RvcChzZXNzaW9uLT50YXNrKTsKKwkJCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7CisJCQl3YWtlX3VwX3Byb2Nlc3Moc2Vzc2lvbi0+dGFzayk7CiAJCX0KIAl9IGVsc2UKIAkJZXJyID0gLUVOT0VOVDsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9oaWRwLmggYi9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oCmluZGV4IDE5ZTk1MDAuLmFmMWJjYzggMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9oaWRwLmgKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2hpZHAuaApAQCAtMTQyLDYgKzE0Miw3IEBACiAJdWludCBjdHJsX210dTsKIAl1aW50IGludHJfbXR1OwogCisJYXRvbWljX3QgdGVybWluYXRlOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIAogCXVuc2lnbmVkIGNoYXIga2V5c1s4XTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKaW5kZXggZTY0YTFjMi4uMzIwNGJhOCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKQEAgLTU0LDI2ICs1NCwzOSBAQAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvbDJjYXAuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL3NtcC5oPgogCiBpbnQgZGlzYWJsZV9lcnRtOwogCiBzdGF0aWMgdTMyIGwyY2FwX2ZlYXRfbWFzayA9IEwyQ0FQX0ZFQVRfRklYRURfQ0hBTjsKIHN0YXRpYyB1OCBsMmNhcF9maXhlZF9jaGFuWzhdID0geyAweDAyLCB9OwogCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKl9idXN5X3dxOwotCi1MSVNUX0hFQUQoY2hhbl9saXN0KTsKLURFRklORV9SV0xPQ0soY2hhbl9saXN0X2xvY2spOwotCi1zdGF0aWMgdm9pZCBsMmNhcF9idXN5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyBMSVNUX0hFQUQoY2hhbl9saXN0KTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGNoYW5fbGlzdF9sb2NrKTsKIAogc3RhdGljIHN0cnVjdCBza19idWZmICpsMmNhcF9idWlsZF9jbWQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sCiAJCQkJdTggY29kZSwgdTggaWRlbnQsIHUxNiBkbGVuLCB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGwyY2FwX3NlbmRfY21kKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCB1OCBpZGVudCwgdTggY29kZSwgdTE2IGxlbiwKKwkJCQkJCQkJdm9pZCAqZGF0YSk7CiBzdGF0aWMgaW50IGwyY2FwX2J1aWxkX2NvbmZfcmVxKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGwyY2FwX3NlbmRfZGlzY29ubl9yZXEoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sCisJCQkJc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIGludCBlcnIpOwogCiBzdGF0aWMgaW50IGwyY2FwX2VydG1fZGF0YV9yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogLyogLS0tLSBMMkNBUCBjaGFubmVscyAtLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFuX2hvbGQoc3RydWN0IGwyY2FwX2NoYW4gKmMpCit7CisJYXRvbWljX2luYygmYy0+cmVmY250KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNoYW5fcHV0KHN0cnVjdCBsMmNhcF9jaGFuICpjKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjLT5yZWZjbnQpKQorCQlrZnJlZShjKTsKK30KKwogc3RhdGljIHN0cnVjdCBsMmNhcF9jaGFuICpfX2wyY2FwX2dldF9jaGFuX2J5X2RjaWQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHUxNiBjaWQpCiB7CiAJc3RydWN0IGwyY2FwX2NoYW4gKmM7CkBAIC0yMDQsNiArMjE3LDYyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGwyY2FwX3NldF90aW1lcihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCBsb25nIHRpbWVvdXQpCit7CisJQlRfREJHKCJjaGFuICVwIHN0YXRlICVkIHRpbWVvdXQgJWxkIiwgY2hhbi0+c2ssIGNoYW4tPnN0YXRlLCB0aW1lb3V0KTsKKworCWlmICghbW9kX3RpbWVyKHRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSkpCisJCWNoYW5faG9sZChjaGFuKTsKK30KKworc3RhdGljIHZvaWQgbDJjYXBfY2xlYXJfdGltZXIoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlCVF9EQkcoImNoYW4gJXAgc3RhdGUgJWQiLCBjaGFuLCBjaGFuLT5zdGF0ZSk7CisKKwlpZiAodGltZXJfcGVuZGluZyh0aW1lcikgJiYgZGVsX3RpbWVyKHRpbWVyKSkKKwkJY2hhbl9wdXQoY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3N0YXRlX2NoYW5nZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgaW50IHN0YXRlKQoreworCWNoYW4tPnN0YXRlID0gc3RhdGU7CisJY2hhbi0+b3BzLT5zdGF0ZV9jaGFuZ2UoY2hhbi0+ZGF0YSwgc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCBsMmNhcF9jaGFuX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4gPSAoc3RydWN0IGwyY2FwX2NoYW4gKikgYXJnOworCXN0cnVjdCBzb2NrICpzayA9IGNoYW4tPnNrOworCWludCByZWFzb247CisKKwlCVF9EQkcoImNoYW4gJXAgc3RhdGUgJWQiLCBjaGFuLCBjaGFuLT5zdGF0ZSk7CisKKwliaF9sb2NrX3NvY2soc2spOworCisJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKKwkJLyogc2sgaXMgb3duZWQgYnkgdXNlci4gVHJ5IGFnYWluIGxhdGVyICovCisJCV9fc2V0X2NoYW5fdGltZXIoY2hhbiwgSFogLyA1KTsKKwkJYmhfdW5sb2NrX3NvY2soc2spOworCQljaGFuX3B1dChjaGFuKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjaGFuLT5zdGF0ZSA9PSBCVF9DT05ORUNURUQgfHwgY2hhbi0+c3RhdGUgPT0gQlRfQ09ORklHKQorCQlyZWFzb24gPSBFQ09OTlJFRlVTRUQ7CisJZWxzZSBpZiAoY2hhbi0+c3RhdGUgPT0gQlRfQ09OTkVDVCAmJgorCQkJCQljaGFuLT5zZWNfbGV2ZWwgIT0gQlRfU0VDVVJJVFlfU0RQKQorCQlyZWFzb24gPSBFQ09OTlJFRlVTRUQ7CisJZWxzZQorCQlyZWFzb24gPSBFVElNRURPVVQ7CisKKwlsMmNhcF9jaGFuX2Nsb3NlKGNoYW4sIHJlYXNvbik7CisKKwliaF91bmxvY2tfc29jayhzayk7CisKKwljaGFuLT5vcHMtPmNsb3NlKGNoYW4tPmRhdGEpOworCWNoYW5fcHV0KGNoYW4pOworfQorCiBzdHJ1Y3QgbDJjYXBfY2hhbiAqbDJjYXBfY2hhbl9jcmVhdGUoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuOwpAQCAtMjE4LDYgKzI4NywxMiBAQAogCWxpc3RfYWRkKCZjaGFuLT5nbG9iYWxfbCwgJmNoYW5fbGlzdCk7CiAJd3JpdGVfdW5sb2NrX2JoKCZjaGFuX2xpc3RfbG9jayk7CiAKKwlzZXR1cF90aW1lcigmY2hhbi0+Y2hhbl90aW1lciwgbDJjYXBfY2hhbl90aW1lb3V0LCAodW5zaWduZWQgbG9uZykgY2hhbik7CisKKwljaGFuLT5zdGF0ZSA9IEJUX09QRU47CisKKwlhdG9taWNfc2V0KCZjaGFuLT5yZWZjbnQsIDEpOworCiAJcmV0dXJuIGNoYW47CiB9CiAKQEAgLTIyNywxMyArMzAyLDExIEBACiAJbGlzdF9kZWwoJmNoYW4tPmdsb2JhbF9sKTsKIAl3cml0ZV91bmxvY2tfYmgoJmNoYW5fbGlzdF9sb2NrKTsKIAotCWtmcmVlKGNoYW4pOworCWNoYW5fcHV0KGNoYW4pOwogfQogCiBzdGF0aWMgdm9pZCBfX2wyY2FwX2NoYW5fYWRkKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKIHsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLT5zazsKLQogCUJUX0RCRygiY29ubiAlcCwgcHNtIDB4JTIuMngsIGRjaWQgMHglNC40eCIsIGNvbm4sCiAJCQljaGFuLT5wc20sIGNoYW4tPmRjaWQpOwogCkBAIC0yNDEsNyArMzE0LDcgQEAKIAogCWNoYW4tPmNvbm4gPSBjb25uOwogCi0JaWYgKHNrLT5za190eXBlID09IFNPQ0tfU0VRUEFDS0VUIHx8IHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKSB7CisJaWYgKGNoYW4tPmNoYW5fdHlwZSA9PSBMMkNBUF9DSEFOX0NPTk5fT1JJRU5URUQpIHsKIAkJaWYgKGNvbm4tPmhjb24tPnR5cGUgPT0gTEVfTElOSykgewogCQkJLyogTEUgY29ubmVjdGlvbiAqLwogCQkJY2hhbi0+b210dSA9IEwyQ0FQX0xFX0RFRkFVTFRfTVRVOwpAQCAtMjUyLDcgKzMyNSw3IEBACiAJCQljaGFuLT5zY2lkID0gbDJjYXBfYWxsb2NfY2lkKGNvbm4pOwogCQkJY2hhbi0+b210dSA9IEwyQ0FQX0RFRkFVTFRfTVRVOwogCQl9Ci0JfSBlbHNlIGlmIChzay0+c2tfdHlwZSA9PSBTT0NLX0RHUkFNKSB7CisJfSBlbHNlIGlmIChjaGFuLT5jaGFuX3R5cGUgPT0gTDJDQVBfQ0hBTl9DT05OX0xFU1MpIHsKIAkJLyogQ29ubmVjdGlvbmxlc3Mgc29ja2V0ICovCiAJCWNoYW4tPnNjaWQgPSBMMkNBUF9DSURfQ09OTl9MRVNTOwogCQljaGFuLT5kY2lkID0gTDJDQVBfQ0lEX0NPTk5fTEVTUzsKQEAgLTI2NCwyMCArMzM3LDIwIEBACiAJCWNoYW4tPm9tdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKIAl9CiAKLQlzb2NrX2hvbGQoc2spOworCWNoYW5faG9sZChjaGFuKTsKIAogCWxpc3RfYWRkKCZjaGFuLT5saXN0LCAmY29ubi0+Y2hhbl9sKTsKIH0KIAogLyogRGVsZXRlIGNoYW5uZWwuCiAgKiBNdXN0IGJlIGNhbGxlZCBvbiB0aGUgbG9ja2VkIHNvY2tldC4gKi8KLXZvaWQgbDJjYXBfY2hhbl9kZWwoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIGludCBlcnIpCitzdGF0aWMgdm9pZCBsMmNhcF9jaGFuX2RlbChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgaW50IGVycikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLT5zazsKIAlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IGNoYW4tPmNvbm47CiAJc3RydWN0IHNvY2sgKnBhcmVudCA9IGJ0X3NrKHNrKS0+cGFyZW50OwogCi0JbDJjYXBfc29ja19jbGVhcl90aW1lcihzayk7CisJX19jbGVhcl9jaGFuX3RpbWVyKGNoYW4pOwogCiAJQlRfREJHKCJjaGFuICVwLCBjb25uICVwLCBlcnIgJWQiLCBjaGFuLCBjb25uLCBlcnIpOwogCkBAIC0yODYsMTMgKzM1OSwxMyBAQAogCQl3cml0ZV9sb2NrX2JoKCZjb25uLT5jaGFuX2xvY2spOwogCQlsaXN0X2RlbCgmY2hhbi0+bGlzdCk7CiAJCXdyaXRlX3VubG9ja19iaCgmY29ubi0+Y2hhbl9sb2NrKTsKLQkJX19zb2NrX3B1dChzayk7CisJCWNoYW5fcHV0KGNoYW4pOwogCiAJCWNoYW4tPmNvbm4gPSBOVUxMOwogCQloY2lfY29ubl9wdXQoY29ubi0+aGNvbik7CiAJfQogCi0Jc2stPnNrX3N0YXRlID0gQlRfQ0xPU0VEOworCWwyY2FwX3N0YXRlX2NoYW5nZShjaGFuLCBCVF9DTE9TRUQpOwogCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKIAogCWlmIChlcnIpCkBAIC0zMDQsOCArMzc3LDggQEAKIAl9IGVsc2UKIAkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CiAKLQlpZiAoIShjaGFuLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9PVVRQVVRfRE9ORSAmJgotCQkJY2hhbi0+Y29uZl9zdGF0ZSAmIEwyQ0FQX0NPTkZfSU5QVVRfRE9ORSkpCisJaWYgKCEodGVzdF9iaXQoQ09ORl9PVVRQVVRfRE9ORSwgJmNoYW4tPmNvbmZfc3RhdGUpICYmCisJCQl0ZXN0X2JpdChDT05GX0lOUFVUX0RPTkUsICZjaGFuLT5jb25mX3N0YXRlKSkpCiAJCXJldHVybjsKIAogCXNrYl9xdWV1ZV9wdXJnZSgmY2hhbi0+dHhfcSk7CkBAIC0zMTMsMTIgKzM4NiwxMSBAQAogCWlmIChjaGFuLT5tb2RlID09IEwyQ0FQX01PREVfRVJUTSkgewogCQlzdHJ1Y3Qgc3Jlal9saXN0ICpsLCAqdG1wOwogCi0JCWRlbF90aW1lcigmY2hhbi0+cmV0cmFuc190aW1lcik7Ci0JCWRlbF90aW1lcigmY2hhbi0+bW9uaXRvcl90aW1lcik7Ci0JCWRlbF90aW1lcigmY2hhbi0+YWNrX3RpbWVyKTsKKwkJX19jbGVhcl9yZXRyYW5zX3RpbWVyKGNoYW4pOworCQlfX2NsZWFyX21vbml0b3JfdGltZXIoY2hhbik7CisJCV9fY2xlYXJfYWNrX3RpbWVyKGNoYW4pOwogCiAJCXNrYl9xdWV1ZV9wdXJnZSgmY2hhbi0+c3Jlal9xKTsKLQkJc2tiX3F1ZXVlX3B1cmdlKCZjaGFuLT5idXN5X3EpOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsLCB0bXAsICZjaGFuLT5zcmVqX2wsIGxpc3QpIHsKIAkJCWxpc3RfZGVsKCZsLT5saXN0KTsKQEAgLTMyNywxMSArMzk5LDg2IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHU4IGwyY2FwX2dldF9hdXRoX3R5cGUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCitzdGF0aWMgdm9pZCBsMmNhcF9jaGFuX2NsZWFudXBfbGlzdGVuKHN0cnVjdCBzb2NrICpwYXJlbnQpCiB7CisJc3RydWN0IHNvY2sgKnNrOworCisJQlRfREJHKCJwYXJlbnQgJXAiLCBwYXJlbnQpOworCisJLyogQ2xvc2Ugbm90IHlldCBhY2NlcHRlZCBjaGFubmVscyAqLworCXdoaWxlICgoc2sgPSBidF9hY2NlcHRfZGVxdWV1ZShwYXJlbnQsIE5VTEwpKSkgeworCQlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IGwyY2FwX3BpKHNrKS0+Y2hhbjsKKwkJX19jbGVhcl9jaGFuX3RpbWVyKGNoYW4pOworCQlsb2NrX3NvY2soc2spOworCQlsMmNhcF9jaGFuX2Nsb3NlKGNoYW4sIEVDT05OUkVTRVQpOworCQlyZWxlYXNlX3NvY2soc2spOworCQljaGFuLT5vcHMtPmNsb3NlKGNoYW4tPmRhdGEpOworCX0KK30KKwordm9pZCBsMmNhcF9jaGFuX2Nsb3NlKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBpbnQgcmVhc29uKQoreworCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gY2hhbi0+Y29ubjsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLT5zazsKIAotCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1JBVykgeworCUJUX0RCRygiY2hhbiAlcCBzdGF0ZSAlZCBzb2NrZXQgJXAiLCBjaGFuLCBjaGFuLT5zdGF0ZSwgc2stPnNrX3NvY2tldCk7CisKKwlzd2l0Y2ggKGNoYW4tPnN0YXRlKSB7CisJY2FzZSBCVF9MSVNURU46CisJCWwyY2FwX2NoYW5fY2xlYW51cF9saXN0ZW4oc2spOworCisJCWwyY2FwX3N0YXRlX2NoYW5nZShjaGFuLCBCVF9DTE9TRUQpOworCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisJCWJyZWFrOworCisJY2FzZSBCVF9DT05ORUNURUQ6CisJY2FzZSBCVF9DT05GSUc6CisJCWlmIChjaGFuLT5jaGFuX3R5cGUgPT0gTDJDQVBfQ0hBTl9DT05OX09SSUVOVEVEICYmCisJCQkJCWNvbm4tPmhjb24tPnR5cGUgPT0gQUNMX0xJTkspIHsKKwkJCV9fY2xlYXJfY2hhbl90aW1lcihjaGFuKTsKKwkJCV9fc2V0X2NoYW5fdGltZXIoY2hhbiwgc2stPnNrX3NuZHRpbWVvKTsKKwkJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEoY29ubiwgY2hhbiwgcmVhc29uKTsKKwkJfSBlbHNlCisJCQlsMmNhcF9jaGFuX2RlbChjaGFuLCByZWFzb24pOworCQlicmVhazsKKworCWNhc2UgQlRfQ09OTkVDVDI6CisJCWlmIChjaGFuLT5jaGFuX3R5cGUgPT0gTDJDQVBfQ0hBTl9DT05OX09SSUVOVEVEICYmCisJCQkJCWNvbm4tPmhjb24tPnR5cGUgPT0gQUNMX0xJTkspIHsKKwkJCXN0cnVjdCBsMmNhcF9jb25uX3JzcCByc3A7CisJCQlfX3UxNiByZXN1bHQ7CisKKwkJCWlmIChidF9zayhzayktPmRlZmVyX3NldHVwKQorCQkJCXJlc3VsdCA9IEwyQ0FQX0NSX1NFQ19CTE9DSzsKKwkJCWVsc2UKKwkJCQlyZXN1bHQgPSBMMkNBUF9DUl9CQURfUFNNOworCQkJbDJjYXBfc3RhdGVfY2hhbmdlKGNoYW4sIEJUX0RJU0NPTk4pOworCisJCQlyc3Auc2NpZCAgID0gY3B1X3RvX2xlMTYoY2hhbi0+ZGNpZCk7CisJCQlyc3AuZGNpZCAgID0gY3B1X3RvX2xlMTYoY2hhbi0+c2NpZCk7CisJCQlyc3AucmVzdWx0ID0gY3B1X3RvX2xlMTYocmVzdWx0KTsKKwkJCXJzcC5zdGF0dXMgPSBjcHVfdG9fbGUxNihMMkNBUF9DU19OT19JTkZPKTsKKwkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNoYW4tPmlkZW50LCBMMkNBUF9DT05OX1JTUCwKKwkJCQkJCQlzaXplb2YocnNwKSwgJnJzcCk7CisJCX0KKworCQlsMmNhcF9jaGFuX2RlbChjaGFuLCByZWFzb24pOworCQlicmVhazsKKworCWNhc2UgQlRfQ09OTkVDVDoKKwljYXNlIEJUX0RJU0NPTk46CisJCWwyY2FwX2NoYW5fZGVsKGNoYW4sIHJlYXNvbik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggbDJjYXBfZ2V0X2F1dGhfdHlwZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKK3sKKwlpZiAoY2hhbi0+Y2hhbl90eXBlID09IEwyQ0FQX0NIQU5fUkFXKSB7CiAJCXN3aXRjaCAoY2hhbi0+c2VjX2xldmVsKSB7CiAJCWNhc2UgQlRfU0VDVVJJVFlfSElHSDoKIAkJCXJldHVybiBIQ0lfQVRfREVESUNBVEVEX0JPTkRJTkdfTUlUTTsKQEAgLTM3MSw3ICs1MTgsNyBAQAogCXJldHVybiBoY2lfY29ubl9zZWN1cml0eShjb25uLT5oY29uLCBjaGFuLT5zZWNfbGV2ZWwsIGF1dGhfdHlwZSk7CiB9CiAKLXU4IGwyY2FwX2dldF9pZGVudChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubikKK3N0YXRpYyB1OCBsMmNhcF9nZXRfaWRlbnQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4pCiB7CiAJdTggaWQ7CiAKQEAgLTM5Myw3ICs1NDAsNyBAQAogCXJldHVybiBpZDsKIH0KIAotdm9pZCBsMmNhcF9zZW5kX2NtZChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgdTggaWRlbnQsIHU4IGNvZGUsIHUxNiBsZW4sIHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBsMmNhcF9zZW5kX2NtZChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgdTggaWRlbnQsIHU4IGNvZGUsIHUxNiBsZW4sIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGwyY2FwX2J1aWxkX2NtZChjb25uLCBjb2RlLCBpZGVudCwgbGVuLCBkYXRhKTsKIAl1OCBmbGFnczsKQEAgLTQwOCw2ICs1NTUsOCBAQAogCWVsc2UKIAkJZmxhZ3MgPSBBQ0xfU1RBUlQ7CiAKKwlidF9jYihza2IpLT5mb3JjZV9hY3RpdmUgPSBCVF9QT1dFUl9GT1JDRV9BQ1RJVkVfT047CisKIAloY2lfc2VuZF9hY2woY29ubi0+aGNvbiwgc2tiLCBmbGFncyk7CiB9CiAKQEAgLTQxNSwxMyArNTY0LDExIEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgbDJjYXBfaGRyICpsaDsKLQlzdHJ1Y3QgbDJjYXBfcGluZm8gKnBpID0gbDJjYXBfcGkoY2hhbi0+c2spOwogCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gY2hhbi0+Y29ubjsKLQlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilwaTsKIAlpbnQgY291bnQsIGhsZW4gPSBMMkNBUF9IRFJfU0laRSArIDI7CiAJdTggZmxhZ3M7CiAKLQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKKwlpZiAoY2hhbi0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEKQogCQlyZXR1cm47CiAKIAlpZiAoY2hhbi0+ZmNzID09IEwyQ0FQX0ZDU19DUkMxNikKQEAgLTQzMiwxNSArNTc5LDExIEBACiAJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbm4tPm10dSwgaGxlbik7CiAJY29udHJvbCB8PSBMMkNBUF9DVFJMX0ZSQU1FX1RZUEU7CiAKLQlpZiAoY2hhbi0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fU0VORF9GQklUKSB7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDT05OX1NFTkRfRkJJVCwgJmNoYW4tPmNvbm5fc3RhdGUpKQogCQljb250cm9sIHw9IEwyQ0FQX0NUUkxfRklOQUw7Ci0JCWNoYW4tPmNvbm5fc3RhdGUgJj0gfkwyQ0FQX0NPTk5fU0VORF9GQklUOwotCX0KIAotCWlmIChjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9TRU5EX1BCSVQpIHsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENPTk5fU0VORF9QQklULCAmY2hhbi0+Y29ubl9zdGF0ZSkpCiAJCWNvbnRyb2wgfD0gTDJDQVBfQ1RSTF9QT0xMOwotCQljaGFuLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1NFTkRfUEJJVDsKLQl9CiAKIAlza2IgPSBidF9za2JfYWxsb2MoY291bnQsIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKQpAQCAtNDYxLDE0ICs2MDQsMTYgQEAKIAllbHNlCiAJCWZsYWdzID0gQUNMX1NUQVJUOwogCisJYnRfY2Ioc2tiKS0+Zm9yY2VfYWN0aXZlID0gY2hhbi0+Zm9yY2VfYWN0aXZlOworCiAJaGNpX3NlbmRfYWNsKGNoYW4tPmNvbm4tPmhjb24sIHNrYiwgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfc2VuZF9ycl9vcl9ybnIoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUxNiBjb250cm9sKQogewotCWlmIChjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9MT0NBTF9CVVNZKSB7CisJaWYgKHRlc3RfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7CiAJCWNvbnRyb2wgfD0gTDJDQVBfU1VQRVJfUkNWX05PVF9SRUFEWTsKLQkJY2hhbi0+Y29ubl9zdGF0ZSB8PSBMMkNBUF9DT05OX1JOUl9TRU5UOworCQlzZXRfYml0KENPTk5fUk5SX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKTsKIAl9IGVsc2UKIAkJY29udHJvbCB8PSBMMkNBUF9TVVBFUl9SQ1ZfUkVBRFk7CiAKQEAgLTQ3OSw3ICs2MjQsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBfX2wyY2FwX25vX2Nvbm5fcGVuZGluZyhzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKIHsKLQlyZXR1cm4gIShjaGFuLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9DT05ORUNUX1BFTkQpOworCXJldHVybiAhdGVzdF9iaXQoQ09ORl9DT05ORUNUX1BFTkQsICZjaGFuLT5jb25mX3N0YXRlKTsKIH0KIAogc3RhdGljIHZvaWQgbDJjYXBfZG9fc3RhcnQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCkBAIC00OTcsNyArNjQyLDcgQEAKIAkJCXJlcS5wc20gID0gY2hhbi0+cHNtOwogCiAJCQljaGFuLT5pZGVudCA9IGwyY2FwX2dldF9pZGVudChjb25uKTsKLQkJCWNoYW4tPmNvbmZfc3RhdGUgfD0gTDJDQVBfQ09ORl9DT05ORUNUX1BFTkQ7CisJCQlzZXRfYml0KENPTkZfQ09OTkVDVF9QRU5ELCAmY2hhbi0+Y29uZl9zdGF0ZSk7CiAKIAkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNoYW4tPmlkZW50LCBMMkNBUF9DT05OX1JFUSwKIAkJCQkJCQlzaXplb2YocmVxKSwgJnJlcSk7CkBAIC01MzMsNyArNjc4LDcgQEAKIAl9CiB9CiAKLXZvaWQgbDJjYXBfc2VuZF9kaXNjb25uX3JlcShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIGludCBlcnIpCitzdGF0aWMgdm9pZCBsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgaW50IGVycikKIHsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJc3RydWN0IGwyY2FwX2Rpc2Nvbm5fcmVxIHJlcTsKQEAgLTU0NCw5ICs2ODksOSBAQAogCXNrID0gY2hhbi0+c2s7CiAKIAlpZiAoY2hhbi0+bW9kZSA9PSBMMkNBUF9NT0RFX0VSVE0pIHsKLQkJZGVsX3RpbWVyKCZjaGFuLT5yZXRyYW5zX3RpbWVyKTsKLQkJZGVsX3RpbWVyKCZjaGFuLT5tb25pdG9yX3RpbWVyKTsKLQkJZGVsX3RpbWVyKCZjaGFuLT5hY2tfdGltZXIpOworCQlfX2NsZWFyX3JldHJhbnNfdGltZXIoY2hhbik7CisJCV9fY2xlYXJfbW9uaXRvcl90aW1lcihjaGFuKTsKKwkJX19jbGVhcl9hY2tfdGltZXIoY2hhbik7CiAJfQogCiAJcmVxLmRjaWQgPSBjcHVfdG9fbGUxNihjaGFuLT5kY2lkKTsKQEAgLTU1NCw3ICs2OTksNyBAQAogCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwKIAkJCUwyQ0FQX0RJU0NPTk5fUkVRLCBzaXplb2YocmVxKSwgJnJlcSk7CiAKLQlzay0+c2tfc3RhdGUgPSBCVF9ESVNDT05OOworCWwyY2FwX3N0YXRlX2NoYW5nZShjaGFuLCBCVF9ESVNDT05OKTsKIAlzay0+c2tfZXJyID0gZXJyOwogfQogCkBAIC01NzIsMTMgKzcxNywxMiBAQAogCiAJCWJoX2xvY2tfc29jayhzayk7CiAKLQkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfU0VRUEFDS0VUICYmCi0JCQkJc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pIHsKKwkJaWYgKGNoYW4tPmNoYW5fdHlwZSAhPSBMMkNBUF9DSEFOX0NPTk5fT1JJRU5URUQpIHsKIAkJCWJoX3VubG9ja19zb2NrKHNrKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DT05ORUNUKSB7CisJCWlmIChjaGFuLT5zdGF0ZSA9PSBCVF9DT05ORUNUKSB7CiAJCQlzdHJ1Y3QgbDJjYXBfY29ubl9yZXEgcmVxOwogCiAJCQlpZiAoIWwyY2FwX2NoZWNrX3NlY3VyaXR5KGNoYW4pIHx8CkBAIC01ODcsMTUgKzczMSwxNCBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlpZiAoIWwyY2FwX21vZGVfc3VwcG9ydGVkKGNoYW4tPm1vZGUsCi0JCQkJCWNvbm4tPmZlYXRfbWFzaykKLQkJCQkJJiYgY2hhbi0+Y29uZl9zdGF0ZSAmCi0JCQkJCUwyQ0FQX0NPTkZfU1RBVEUyX0RFVklDRSkgewotCQkJCS8qIF9fbDJjYXBfc29ja19jbG9zZSgpIGNhbGxzIGxpc3RfZGVsKGNoYW4pCisJCQlpZiAoIWwyY2FwX21vZGVfc3VwcG9ydGVkKGNoYW4tPm1vZGUsIGNvbm4tPmZlYXRfbWFzaykKKwkJCQkJJiYgdGVzdF9iaXQoQ09ORl9TVEFURTJfREVWSUNFLAorCQkJCQkmY2hhbi0+Y29uZl9zdGF0ZSkpIHsKKwkJCQkvKiBsMmNhcF9jaGFuX2Nsb3NlKCkgY2FsbHMgbGlzdF9kZWwoY2hhbikKIAkJCQkgKiBzbyByZWxlYXNlIHRoZSBsb2NrICovCi0JCQkJcmVhZF91bmxvY2tfYmgoJmNvbm4tPmNoYW5fbG9jayk7Ci0JCQkJIF9fbDJjYXBfc29ja19jbG9zZShzaywgRUNPTk5SRVNFVCk7Ci0JCQkJcmVhZF9sb2NrX2JoKCZjb25uLT5jaGFuX2xvY2spOworCQkJCXJlYWRfdW5sb2NrKCZjb25uLT5jaGFuX2xvY2spOworCQkJCWwyY2FwX2NoYW5fY2xvc2UoY2hhbiwgRUNPTk5SRVNFVCk7CisJCQkJcmVhZF9sb2NrKCZjb25uLT5jaGFuX2xvY2spOwogCQkJCWJoX3VubG9ja19zb2NrKHNrKTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTYwNCwxMiArNzQ3LDEyIEBACiAJCQlyZXEucHNtICA9IGNoYW4tPnBzbTsKIAogCQkJY2hhbi0+aWRlbnQgPSBsMmNhcF9nZXRfaWRlbnQoY29ubik7Ci0JCQljaGFuLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfQ09OTkVDVF9QRU5EOworCQkJc2V0X2JpdChDT05GX0NPTk5FQ1RfUEVORCwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCiAJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjaGFuLT5pZGVudCwgTDJDQVBfQ09OTl9SRVEsCiAJCQkJCQkJc2l6ZW9mKHJlcSksICZyZXEpOwogCi0JCX0gZWxzZSBpZiAoc2stPnNrX3N0YXRlID09IEJUX0NPTk5FQ1QyKSB7CisJCX0gZWxzZSBpZiAoY2hhbi0+c3RhdGUgPT0gQlRfQ09OTkVDVDIpIHsKIAkJCXN0cnVjdCBsMmNhcF9jb25uX3JzcCByc3A7CiAJCQljaGFyIGJ1ZlsxMjhdOwogCQkJcnNwLnNjaWQgPSBjcHVfdG9fbGUxNihjaGFuLT5kY2lkKTsKQEAgLTYyMCwxMCArNzYzLDExIEBACiAJCQkJCXN0cnVjdCBzb2NrICpwYXJlbnQgPSBidF9zayhzayktPnBhcmVudDsKIAkJCQkJcnNwLnJlc3VsdCA9IGNwdV90b19sZTE2KEwyQ0FQX0NSX1BFTkQpOwogCQkJCQlyc3Auc3RhdHVzID0gY3B1X3RvX2xlMTYoTDJDQVBfQ1NfQVVUSE9SX1BFTkQpOwotCQkJCQlwYXJlbnQtPnNrX2RhdGFfcmVhZHkocGFyZW50LCAwKTsKKwkJCQkJaWYgKHBhcmVudCkKKwkJCQkJCXBhcmVudC0+c2tfZGF0YV9yZWFkeShwYXJlbnQsIDApOwogCiAJCQkJfSBlbHNlIHsKLQkJCQkJc2stPnNrX3N0YXRlID0gQlRfQ09ORklHOworCQkJCQlsMmNhcF9zdGF0ZV9jaGFuZ2UoY2hhbiwgQlRfQ09ORklHKTsKIAkJCQkJcnNwLnJlc3VsdCA9IGNwdV90b19sZTE2KEwyQ0FQX0NSX1NVQ0NFU1MpOwogCQkJCQlyc3Auc3RhdHVzID0gY3B1X3RvX2xlMTYoTDJDQVBfQ1NfTk9fSU5GTyk7CiAJCQkJfQpAQCAtNjM1LDEzICs3NzksMTMgQEAKIAkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNoYW4tPmlkZW50LCBMMkNBUF9DT05OX1JTUCwKIAkJCQkJCQlzaXplb2YocnNwKSwgJnJzcCk7CiAKLQkJCWlmIChjaGFuLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9SRVFfU0VOVCB8fAorCQkJaWYgKHRlc3RfYml0KENPTkZfUkVRX1NFTlQsICZjaGFuLT5jb25mX3N0YXRlKSB8fAogCQkJCQlyc3AucmVzdWx0ICE9IEwyQ0FQX0NSX1NVQ0NFU1MpIHsKIAkJCQliaF91bmxvY2tfc29jayhzayk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWNoYW4tPmNvbmZfc3RhdGUgfD0gTDJDQVBfQ09ORl9SRVFfU0VOVDsKKwkJCXNldF9iaXQoQ09ORl9SRVFfU0VOVCwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfZ2V0X2lkZW50KGNvbm4pLCBMMkNBUF9DT05GX1JFUSwKIAkJCQkJCWwyY2FwX2J1aWxkX2NvbmZfcmVxKGNoYW4sIGJ1ZiksIGJ1Zik7CiAJCQljaGFuLT5udW1fY29uZl9yZXErKzsKQEAgLTY2NSw3ICs4MDksNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNoYW5fbGlzdCwgZ2xvYmFsX2wpIHsKIAkJc3RydWN0IHNvY2sgKnNrID0gYy0+c2s7CiAKLQkJaWYgKHN0YXRlICYmIHNrLT5za19zdGF0ZSAhPSBzdGF0ZSkKKwkJaWYgKHN0YXRlICYmIGMtPnN0YXRlICE9IHN0YXRlKQogCQkJY29udGludWU7CiAKIAkJaWYgKGMtPnNjaWQgPT0gY2lkKSB7CkBAIC03MDksMjQgKzg1MywxNiBAQAogCQlnb3RvIGNsZWFuOwogCX0KIAotCXNrID0gbDJjYXBfc29ja19hbGxvYyhzb2NrX25ldChwYXJlbnQpLCBOVUxMLCBCVFBST1RPX0wyQ0FQLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXNrKQorCWNoYW4gPSBwY2hhbi0+b3BzLT5uZXdfY29ubmVjdGlvbihwY2hhbi0+ZGF0YSk7CisJaWYgKCFjaGFuKQogCQlnb3RvIGNsZWFuOwogCi0JY2hhbiA9IGwyY2FwX2NoYW5fY3JlYXRlKHNrKTsKLQlpZiAoIWNoYW4pIHsKLQkJbDJjYXBfc29ja19raWxsKHNrKTsKLQkJZ290byBjbGVhbjsKLQl9Ci0KLQlsMmNhcF9waShzayktPmNoYW4gPSBjaGFuOworCXNrID0gY2hhbi0+c2s7CiAKIAl3cml0ZV9sb2NrX2JoKCZjb25uLT5jaGFuX2xvY2spOwogCiAJaGNpX2Nvbm5faG9sZChjb25uLT5oY29uKTsKIAotCWwyY2FwX3NvY2tfaW5pdChzaywgcGFyZW50KTsKLQogCWJhY3B5KCZidF9zayhzayktPnNyYywgY29ubi0+c3JjKTsKIAliYWNweSgmYnRfc2soc2spLT5kc3QsIGNvbm4tPmRzdCk7CiAKQEAgLTczNCw5ICs4NzAsOSBAQAogCiAJX19sMmNhcF9jaGFuX2FkZChjb25uLCBjaGFuKTsKIAotCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBzay0+c2tfc25kdGltZW8pOworCV9fc2V0X2NoYW5fdGltZXIoY2hhbiwgc2stPnNrX3NuZHRpbWVvKTsKIAotCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKKwlsMmNhcF9zdGF0ZV9jaGFuZ2UoY2hhbiwgQlRfQ09OTkVDVEVEKTsKIAlwYXJlbnQtPnNrX2RhdGFfcmVhZHkocGFyZW50LCAwKTsKIAogCXdyaXRlX3VubG9ja19iaCgmY29ubi0+Y2hhbl9sb2NrKTsKQEAgLTc0NSw2ICs4ODEsMjMgQEAKIAliaF91bmxvY2tfc29jayhwYXJlbnQpOwogfQogCitzdGF0aWMgdm9pZCBsMmNhcF9jaGFuX3JlYWR5KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IGwyY2FwX3BpKHNrKS0+Y2hhbjsKKwlzdHJ1Y3Qgc29jayAqcGFyZW50ID0gYnRfc2soc2spLT5wYXJlbnQ7CisKKwlCVF9EQkcoInNrICVwLCBwYXJlbnQgJXAiLCBzaywgcGFyZW50KTsKKworCWNoYW4tPmNvbmZfc3RhdGUgPSAwOworCV9fY2xlYXJfY2hhbl90aW1lcihjaGFuKTsKKworCWwyY2FwX3N0YXRlX2NoYW5nZShjaGFuLCBCVF9DT05ORUNURUQpOworCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCisJaWYgKHBhcmVudCkKKwkJcGFyZW50LT5za19kYXRhX3JlYWR5KHBhcmVudCwgMCk7Cit9CisKIHN0YXRpYyB2b2lkIGwyY2FwX2Nvbm5fcmVhZHkoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4pCiB7CiAJc3RydWN0IGwyY2FwX2NoYW4gKmNoYW47CkBAIC03NjIsMTcgKzkxNSwxNSBAQAogCQliaF9sb2NrX3NvY2soc2spOwogCiAJCWlmIChjb25uLT5oY29uLT50eXBlID09IExFX0xJTkspIHsKLQkJCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOwotCQkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVEVEOwotCQkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7Ci0JCX0KKwkJCWlmIChzbXBfY29ubl9zZWN1cml0eShjb25uLCBjaGFuLT5zZWNfbGV2ZWwpKQorCQkJCWwyY2FwX2NoYW5fcmVhZHkoc2spOwogCi0JCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCAmJgotCQkJCXNrLT5za190eXBlICE9IFNPQ0tfU1RSRUFNKSB7Ci0JCQlsMmNhcF9zb2NrX2NsZWFyX3RpbWVyKHNrKTsKLQkJCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKKwkJfSBlbHNlIGlmIChjaGFuLT5jaGFuX3R5cGUgIT0gTDJDQVBfQ0hBTl9DT05OX09SSUVOVEVEKSB7CisJCQlfX2NsZWFyX2NoYW5fdGltZXIoY2hhbik7CisJCQlsMmNhcF9zdGF0ZV9jaGFuZ2UoY2hhbiwgQlRfQ09OTkVDVEVEKTsKIAkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwotCQl9IGVsc2UgaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DT05ORUNUKQorCisJCX0gZWxzZSBpZiAoY2hhbi0+c3RhdGUgPT0gQlRfQ09OTkVDVCkKIAkJCWwyY2FwX2RvX3N0YXJ0KGNoYW4pOwogCiAJCWJoX3VubG9ja19zb2NrKHNrKTsKQEAgLTgxMCw2ICs5NjEsNDUgQEAKIAlsMmNhcF9jb25uX3N0YXJ0KGNvbm4pOwogfQogCitzdGF0aWMgdm9pZCBsMmNhcF9jb25uX2RlbChzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIGludCBlcnIpCit7CisJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBoY29uLT5sMmNhcF9kYXRhOworCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCAqbDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlpZiAoIWNvbm4pCisJCXJldHVybjsKKworCUJUX0RCRygiaGNvbiAlcCBjb25uICVwLCBlcnIgJWQiLCBoY29uLCBjb25uLCBlcnIpOworCisJa2ZyZWVfc2tiKGNvbm4tPnJ4X3NrYik7CisKKwkvKiBLaWxsIGNoYW5uZWxzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoYW4sIGwsICZjb25uLT5jaGFuX2wsIGxpc3QpIHsKKwkJc2sgPSBjaGFuLT5zazsKKwkJYmhfbG9ja19zb2NrKHNrKTsKKwkJbDJjYXBfY2hhbl9kZWwoY2hhbiwgZXJyKTsKKwkJYmhfdW5sb2NrX3NvY2soc2spOworCQljaGFuLT5vcHMtPmNsb3NlKGNoYW4tPmRhdGEpOworCX0KKworCWlmIChjb25uLT5pbmZvX3N0YXRlICYgTDJDQVBfSU5GT19GRUFUX01BU0tfUkVRX1NFTlQpCisJCWRlbF90aW1lcl9zeW5jKCZjb25uLT5pbmZvX3RpbWVyKTsKKworCWlmICh0ZXN0X2JpdChIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsICZoY29uLT5wZW5kKSkKKwkJZGVsX3RpbWVyKCZjb25uLT5zZWN1cml0eV90aW1lcik7CisKKwloY29uLT5sMmNhcF9kYXRhID0gTlVMTDsKKwlrZnJlZShjb25uKTsKK30KKworc3RhdGljIHZvaWQgc2VjdXJpdHlfdGltZW91dCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9ICh2b2lkICopIGFyZzsKKworCWwyY2FwX2Nvbm5fZGVsKGNvbm4tPmhjb24sIEVUSU1FRE9VVCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgbDJjYXBfY29ubiAqbDJjYXBfY29ubl9hZGQoc3RydWN0IGhjaV9jb25uICpoY29uLCB1OCBzdGF0dXMpCiB7CiAJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBoY29uLT5sMmNhcF9kYXRhOwpAQCAtODQxLDcgKzEwMzEsMTAgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZjb25uLT5jaGFuX2wpOwogCi0JaWYgKGhjb24tPnR5cGUgIT0gTEVfTElOSykKKwlpZiAoaGNvbi0+dHlwZSA9PSBMRV9MSU5LKQorCQlzZXR1cF90aW1lcigmY29ubi0+c2VjdXJpdHlfdGltZXIsIHNlY3VyaXR5X3RpbWVvdXQsCisJCQkJCQkodW5zaWduZWQgbG9uZykgY29ubik7CisJZWxzZQogCQlzZXR1cF90aW1lcigmY29ubi0+aW5mb190aW1lciwgbDJjYXBfaW5mb190aW1lb3V0LAogCQkJCQkJKHVuc2lnbmVkIGxvbmcpIGNvbm4pOwogCkBAIC04NTAsMzUgKzEwNDMsNiBAQAogCXJldHVybiBjb25uOwogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9jb25uX2RlbChzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIGludCBlcnIpCi17Ci0Jc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBoY29uLT5sMmNhcF9kYXRhOwotCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCAqbDsKLQlzdHJ1Y3Qgc29jayAqc2s7Ci0KLQlpZiAoIWNvbm4pCi0JCXJldHVybjsKLQotCUJUX0RCRygiaGNvbiAlcCBjb25uICVwLCBlcnIgJWQiLCBoY29uLCBjb25uLCBlcnIpOwotCi0Ja2ZyZWVfc2tiKGNvbm4tPnJ4X3NrYik7Ci0KLQkvKiBLaWxsIGNoYW5uZWxzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoYW4sIGwsICZjb25uLT5jaGFuX2wsIGxpc3QpIHsKLQkJc2sgPSBjaGFuLT5zazsKLQkJYmhfbG9ja19zb2NrKHNrKTsKLQkJbDJjYXBfY2hhbl9kZWwoY2hhbiwgZXJyKTsKLQkJYmhfdW5sb2NrX3NvY2soc2spOwotCQlsMmNhcF9zb2NrX2tpbGwoc2spOwotCX0KLQotCWlmIChjb25uLT5pbmZvX3N0YXRlICYgTDJDQVBfSU5GT19GRUFUX01BU0tfUkVRX1NFTlQpCi0JCWRlbF90aW1lcl9zeW5jKCZjb25uLT5pbmZvX3RpbWVyKTsKLQotCWhjb24tPmwyY2FwX2RhdGEgPSBOVUxMOwotCWtmcmVlKGNvbm4pOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfY2hhbl9hZGQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewogCXdyaXRlX2xvY2tfYmgoJmNvbm4tPmNoYW5fbG9jayk7CkBAIC05MDAsNyArMTA2NCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmY2hhbl9saXN0LCBnbG9iYWxfbCkgewogCQlzdHJ1Y3Qgc29jayAqc2sgPSBjLT5zazsKIAotCQlpZiAoc3RhdGUgJiYgc2stPnNrX3N0YXRlICE9IHN0YXRlKQorCQlpZiAoc3RhdGUgJiYgYy0+c3RhdGUgIT0gc3RhdGUpCiAJCQljb250aW51ZTsKIAogCQlpZiAoYy0+cHNtID09IHBzbSkgewpAQCAtOTY3LDE1ICsxMTMxLDE0IEBACiAKIAlsMmNhcF9jaGFuX2FkZChjb25uLCBjaGFuKTsKIAotCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1Q7Ci0JbDJjYXBfc29ja19zZXRfdGltZXIoc2ssIHNrLT5za19zbmR0aW1lbyk7CisJbDJjYXBfc3RhdGVfY2hhbmdlKGNoYW4sIEJUX0NPTk5FQ1QpOworCV9fc2V0X2NoYW5fdGltZXIoY2hhbiwgc2stPnNrX3NuZHRpbWVvKTsKIAogCWlmIChoY29uLT5zdGF0ZSA9PSBCVF9DT05ORUNURUQpIHsKLQkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfU0VRUEFDS0VUICYmCi0JCQkJc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pIHsKLQkJCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQlpZiAoY2hhbi0+Y2hhbl90eXBlICE9IEwyQ0FQX0NIQU5fQ09OTl9PUklFTlRFRCkgeworCQkJX19jbGVhcl9jaGFuX3RpbWVyKGNoYW4pOwogCQkJaWYgKGwyY2FwX2NoZWNrX3NlY3VyaXR5KGNoYW4pKQotCQkJCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKKwkJCQlsMmNhcF9zdGF0ZV9jaGFuZ2UoY2hhbiwgQlRfQ09OTkVDVEVEKTsKIAkJfSBlbHNlCiAJCQlsMmNhcF9kb19zdGFydChjaGFuKTsKIAl9CkBAIC0xMDM1LDcgKzExOTgsNyBAQAogCX0KIAogCWNoYW4tPnJldHJ5X2NvdW50Kys7Ci0JX19tb2RfbW9uaXRvcl90aW1lcigpOworCV9fc2V0X21vbml0b3JfdGltZXIoY2hhbik7CiAKIAlsMmNhcF9zZW5kX3JyX29yX3JucihjaGFuLCBMMkNBUF9DVFJMX1BPTEwpOwogCWJoX3VubG9ja19zb2NrKHNrKTsKQEAgLTEwNTAsOSArMTIxMyw5IEBACiAKIAliaF9sb2NrX3NvY2soc2spOwogCWNoYW4tPnJldHJ5X2NvdW50ID0gMTsKLQlfX21vZF9tb25pdG9yX3RpbWVyKCk7CisJX19zZXRfbW9uaXRvcl90aW1lcihjaGFuKTsKIAotCWNoYW4tPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9XQUlUX0Y7CisJc2V0X2JpdChDT05OX1dBSVRfRiwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCiAJbDJjYXBfc2VuZF9ycl9vcl9ybnIoY2hhbiwgTDJDQVBfQ1RSTF9QT0xMKTsKIAliaF91bmxvY2tfc29jayhzayk7CkBAIC0xMDc0LDcgKzEyMzcsNyBAQAogCX0KIAogCWlmICghY2hhbi0+dW5hY2tlZF9mcmFtZXMpCi0JCWRlbF90aW1lcigmY2hhbi0+cmV0cmFuc190aW1lcik7CisJCV9fY2xlYXJfcmV0cmFuc190aW1lcihjaGFuKTsKIH0KIAogdm9pZCBsMmNhcF9kb19zZW5kKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTA4OSw2ICsxMjUyLDcgQEAKIAllbHNlCiAJCWZsYWdzID0gQUNMX1NUQVJUOwogCisJYnRfY2Ioc2tiKS0+Zm9yY2VfYWN0aXZlID0gY2hhbi0+Zm9yY2VfYWN0aXZlOwogCWhjaV9zZW5kX2FjbChoY29uLCBza2IsIGZsYWdzKTsKIH0KIApAQCAtMTE0MiwxMCArMTMwNiw4IEBACiAJY29udHJvbCA9IGdldF91bmFsaWduZWRfbGUxNih0eF9za2ItPmRhdGEgKyBMMkNBUF9IRFJfU0laRSk7CiAJY29udHJvbCAmPSBMMkNBUF9DVFJMX1NBUjsKIAotCWlmIChjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9TRU5EX0ZCSVQpIHsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENPTk5fU0VORF9GQklULCAmY2hhbi0+Y29ubl9zdGF0ZSkpCiAJCWNvbnRyb2wgfD0gTDJDQVBfQ1RSTF9GSU5BTDsKLQkJY2hhbi0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9TRU5EX0ZCSVQ7Ci0JfQogCiAJY29udHJvbCB8PSAoY2hhbi0+YnVmZmVyX3NlcSA8PCBMMkNBUF9DVFJMX1JFUVNFUV9TSElGVCkKIAkJCXwgKHR4X3NlcSA8PCBMMkNBUF9DVFJMX1RYU0VRX1NISUZUKTsKQEAgLTExNjMsMTEgKzEzMjUsMTAgQEAKIGludCBsMmNhcF9lcnRtX3NlbmQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnR4X3NrYjsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLT5zazsKIAl1MTYgY29udHJvbCwgZmNzOwogCWludCBuc2VudCA9IDA7CiAKLQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKKwlpZiAoY2hhbi0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCiAJd2hpbGUgKChza2IgPSBjaGFuLT50eF9zZW5kX2hlYWQpICYmICghbDJjYXBfdHhfd2luZG93X2Z1bGwoY2hhbikpKSB7CkBAIC0xMTg1LDEwICsxMzQ2LDkgQEAKIAkJY29udHJvbCA9IGdldF91bmFsaWduZWRfbGUxNih0eF9za2ItPmRhdGEgKyBMMkNBUF9IRFJfU0laRSk7CiAJCWNvbnRyb2wgJj0gTDJDQVBfQ1RSTF9TQVI7CiAKLQkJaWYgKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1NFTkRfRkJJVCkgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENPTk5fU0VORF9GQklULCAmY2hhbi0+Y29ubl9zdGF0ZSkpCiAJCQljb250cm9sIHw9IEwyQ0FQX0NUUkxfRklOQUw7Ci0JCQljaGFuLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1NFTkRfRkJJVDsKLQkJfQorCiAJCWNvbnRyb2wgfD0gKGNoYW4tPmJ1ZmZlcl9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQpCiAJCQkJfCAoY2hhbi0+bmV4dF90eF9zZXEgPDwgTDJDQVBfQ1RSTF9UWFNFUV9TSElGVCk7CiAJCXB1dF91bmFsaWduZWRfbGUxNihjb250cm9sLCB0eF9za2ItPmRhdGEgKyBMMkNBUF9IRFJfU0laRSk7CkBAIC0xMjAxLDcgKzEzNjEsNyBAQAogCiAJCWwyY2FwX2RvX3NlbmQoY2hhbiwgdHhfc2tiKTsKIAotCQlfX21vZF9yZXRyYW5zX3RpbWVyKCk7CisJCV9fc2V0X3JldHJhbnNfdGltZXIoY2hhbik7CiAKIAkJYnRfY2Ioc2tiKS0+dHhfc2VxID0gY2hhbi0+bmV4dF90eF9zZXE7CiAJCWNoYW4tPm5leHRfdHhfc2VxID0gKGNoYW4tPm5leHRfdHhfc2VxICsgMSkgJSA2NDsKQEAgLTEyNDAsOSArMTQwMCw5IEBACiAKIAljb250cm9sIHw9IGNoYW4tPmJ1ZmZlcl9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQ7CiAKLQlpZiAoY2hhbi0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fTE9DQUxfQlVTWSkgeworCWlmICh0ZXN0X2JpdChDT05OX0xPQ0FMX0JVU1ksICZjaGFuLT5jb25uX3N0YXRlKSkgewogCQljb250cm9sIHw9IEwyQ0FQX1NVUEVSX1JDVl9OT1RfUkVBRFk7Ci0JCWNoYW4tPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9STlJfU0VOVDsKKwkJc2V0X2JpdChDT05OX1JOUl9TRU5ULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJCWwyY2FwX3NlbmRfc2ZyYW1lKGNoYW4sIGNvbnRyb2wpOwogCQlyZXR1cm47CiAJfQpAQCAtMTQ1MCwyOCArMTYxMCw4MyBAQAogCXJldHVybiBzaXplOwogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9jaGFuX3JlYWR5KHN0cnVjdCBzb2NrICpzaykKK2ludCBsMmNhcF9jaGFuX3NlbmQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKLQlzdHJ1Y3Qgc29jayAqcGFyZW50ID0gYnRfc2soc2spLT5wYXJlbnQ7Ci0Jc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4gPSBsMmNhcF9waShzayktPmNoYW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MTYgY29udHJvbDsKKwlpbnQgZXJyOwogCi0JQlRfREJHKCJzayAlcCwgcGFyZW50ICVwIiwgc2ssIHBhcmVudCk7CisJLyogQ29ubmVjdGlvbmxlc3MgY2hhbm5lbCAqLworCWlmIChjaGFuLT5jaGFuX3R5cGUgPT0gTDJDQVBfQ0hBTl9DT05OX0xFU1MpIHsKKwkJc2tiID0gbDJjYXBfY3JlYXRlX2Nvbm5sZXNzX3BkdShjaGFuLCBtc2csIGxlbik7CisJCWlmIChJU19FUlIoc2tiKSkKKwkJCXJldHVybiBQVFJfRVJSKHNrYik7CiAKLQljaGFuLT5jb25mX3N0YXRlID0gMDsKLQlsMmNhcF9zb2NrX2NsZWFyX3RpbWVyKHNrKTsKLQotCWlmICghcGFyZW50KSB7Ci0JCS8qIE91dGdvaW5nIGNoYW5uZWwuCi0JCSAqIFdha2UgdXAgc29ja2V0IHNsZWVwaW5nIG9uIGNvbm5lY3QuCi0JCSAqLwotCQlzay0+c2tfc3RhdGUgPSBCVF9DT05ORUNURUQ7Ci0JCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwotCX0gZWxzZSB7Ci0JCS8qIEluY29taW5nIGNoYW5uZWwuCi0JCSAqIFdha2UgdXAgc29ja2V0IHNsZWVwaW5nIG9uIGFjY2VwdC4KLQkJICovCi0JCXBhcmVudC0+c2tfZGF0YV9yZWFkeShwYXJlbnQsIDApOworCQlsMmNhcF9kb19zZW5kKGNoYW4sIHNrYik7CisJCXJldHVybiBsZW47CiAJfQorCisJc3dpdGNoIChjaGFuLT5tb2RlKSB7CisJY2FzZSBMMkNBUF9NT0RFX0JBU0lDOgorCQkvKiBDaGVjayBvdXRnb2luZyBNVFUgKi8KKwkJaWYgKGxlbiA+IGNoYW4tPm9tdHUpCisJCQlyZXR1cm4gLUVNU0dTSVpFOworCisJCS8qIENyZWF0ZSBhIGJhc2ljIFBEVSAqLworCQlza2IgPSBsMmNhcF9jcmVhdGVfYmFzaWNfcGR1KGNoYW4sIG1zZywgbGVuKTsKKwkJaWYgKElTX0VSUihza2IpKQorCQkJcmV0dXJuIFBUUl9FUlIoc2tiKTsKKworCQlsMmNhcF9kb19zZW5kKGNoYW4sIHNrYik7CisJCWVyciA9IGxlbjsKKwkJYnJlYWs7CisKKwljYXNlIEwyQ0FQX01PREVfRVJUTToKKwljYXNlIEwyQ0FQX01PREVfU1RSRUFNSU5HOgorCQkvKiBFbnRpcmUgU0RVIGZpdHMgaW50byBvbmUgUERVICovCisJCWlmIChsZW4gPD0gY2hhbi0+cmVtb3RlX21wcykgeworCQkJY29udHJvbCA9IEwyQ0FQX1NEVV9VTlNFR01FTlRFRDsKKwkJCXNrYiA9IGwyY2FwX2NyZWF0ZV9pZnJhbWVfcGR1KGNoYW4sIG1zZywgbGVuLCBjb250cm9sLAorCQkJCQkJCQkJMCk7CisJCQlpZiAoSVNfRVJSKHNrYikpCisJCQkJcmV0dXJuIFBUUl9FUlIoc2tiKTsKKworCQkJX19za2JfcXVldWVfdGFpbCgmY2hhbi0+dHhfcSwgc2tiKTsKKworCQkJaWYgKGNoYW4tPnR4X3NlbmRfaGVhZCA9PSBOVUxMKQorCQkJCWNoYW4tPnR4X3NlbmRfaGVhZCA9IHNrYjsKKworCQl9IGVsc2UgeworCQkJLyogU2VnbWVudCBTRFUgaW50byBtdWx0aXBsZXMgUERVcyAqLworCQkJZXJyID0gbDJjYXBfc2FyX3NlZ21lbnRfc2R1KGNoYW4sIG1zZywgbGVuKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKworCQlpZiAoY2hhbi0+bW9kZSA9PSBMMkNBUF9NT0RFX1NUUkVBTUlORykgeworCQkJbDJjYXBfc3RyZWFtaW5nX3NlbmQoY2hhbik7CisJCQllcnIgPSBsZW47CisJCQlicmVhazsKKwkJfQorCisJCWlmICh0ZXN0X2JpdChDT05OX1JFTU9URV9CVVNZLCAmY2hhbi0+Y29ubl9zdGF0ZSkgJiYKKwkJCQl0ZXN0X2JpdChDT05OX1dBSVRfRiwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7CisJCQllcnIgPSBsZW47CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IGwyY2FwX2VydG1fc2VuZChjaGFuKTsKKwkJaWYgKGVyciA+PSAwKQorCQkJZXJyID0gbGVuOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlRfREJHKCJiYWQgc3RhdGUgJTEuMXgiLCBjaGFuLT5tb2RlKTsKKwkJZXJyID0gLUVCQURGRDsKKwl9CisKKwlyZXR1cm4gZXJyOwogfQogCiAvKiBDb3B5IGZyYW1lIHRvIGFsbCByYXcgc29ja2V0cyBvbiB0aGF0IGNvbm5lY3Rpb24gKi8KQEAgLTE0ODUsNyArMTcwMCw3IEBACiAJcmVhZF9sb2NrKCZjb25uLT5jaGFuX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmNvbm4tPmNoYW5fbCwgbGlzdCkgewogCQlzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLT5zazsKLQkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfUkFXKQorCQlpZiAoY2hhbi0+Y2hhbl90eXBlICE9IEwyQ0FQX0NIQU5fUkFXKQogCQkJY29udGludWU7CiAKIAkJLyogRG9uJ3Qgc2VuZCBmcmFtZSB0byB0aGUgc29ja2V0IGl0IGNhbWUgZnJvbSAqLwpAQCAtMTQ5NSw3ICsxNzEwLDcgQEAKIAkJaWYgKCFuc2tiKQogCQkJY29udGludWU7CiAKLQkJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihzaywgbnNrYikpCisJCWlmIChjaGFuLT5vcHMtPnJlY3YoY2hhbi0+ZGF0YSwgbnNrYikpCiAJCQlrZnJlZV9za2IobnNrYik7CiAJfQogCXJlYWRfdW5sb2NrKCZjb25uLT5jaGFuX2xvY2spOwpAQCAtMTY1NCwxMSArMTg2OSw5IEBACiAJc2V0dXBfdGltZXIoJmNoYW4tPmFja190aW1lciwgbDJjYXBfYWNrX3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKSBjaGFuKTsKIAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNoYW4tPnNyZWpfcSk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2hhbi0+YnVzeV9xKTsKIAogCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5zcmVqX2wpOwogCi0JSU5JVF9XT1JLKCZjaGFuLT5idXN5X3dvcmssIGwyY2FwX2J1c3lfd29yayk7CiAKIAlzay0+c2tfYmFja2xvZ19yY3YgPSBsMmNhcF9lcnRtX2RhdGFfcmN2OwogfQpAQCAtMTY5MCw3ICsxOTAzLDcgQEAKIAlzd2l0Y2ggKGNoYW4tPm1vZGUpIHsKIAljYXNlIEwyQ0FQX01PREVfU1RSRUFNSU5HOgogCWNhc2UgTDJDQVBfTU9ERV9FUlRNOgotCQlpZiAoY2hhbi0+Y29uZl9zdGF0ZSAmIEwyQ0FQX0NPTkZfU1RBVEUyX0RFVklDRSkKKwkJaWYgKHRlc3RfYml0KENPTkZfU1RBVEUyX0RFVklDRSwgJmNoYW4tPmNvbmZfc3RhdGUpKQogCQkJYnJlYWs7CiAKIAkJLyogZmFsbCB0aHJvdWdoICovCkBAIC0xNzM3LDcgKzE5NTAsNyBAQAogCQkJYnJlYWs7CiAKIAkJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfTk9ORSB8fAotCQkJCWNoYW4tPmNvbmZfc3RhdGUgJiBMMkNBUF9DT05GX05PX0ZDU19SRUNWKSB7CisJCQkJdGVzdF9iaXQoQ09ORl9OT19GQ1NfUkVDViwgJmNoYW4tPmNvbmZfc3RhdGUpKSB7CiAJCQljaGFuLT5mY3MgPSBMMkNBUF9GQ1NfTk9ORTsKIAkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0ZDUywgMSwgY2hhbi0+ZmNzKTsKIAkJfQpAQCAtMTc2MCw3ICsxOTczLDcgQEAKIAkJCWJyZWFrOwogCiAJCWlmIChjaGFuLT5mY3MgPT0gTDJDQVBfRkNTX05PTkUgfHwKLQkJCQljaGFuLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9OT19GQ1NfUkVDVikgeworCQkJCXRlc3RfYml0KENPTkZfTk9fRkNTX1JFQ1YsICZjaGFuLT5jb25mX3N0YXRlKSkgewogCQkJY2hhbi0+ZmNzID0gTDJDQVBfRkNTX05PTkU7CiAJCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9GQ1MsIDEsIGNoYW4tPmZjcyk7CiAJCX0KQEAgLTE4MTIsNyArMjAyNSw3IEBACiAKIAkJY2FzZSBMMkNBUF9DT05GX0ZDUzoKIAkJCWlmICh2YWwgPT0gTDJDQVBfRkNTX05PTkUpCi0JCQkJY2hhbi0+Y29uZl9zdGF0ZSB8PSBMMkNBUF9DT05GX05PX0ZDU19SRUNWOworCQkJCXNldF9iaXQoQ09ORl9OT19GQ1NfUkVDViwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCiAJCQlicmVhazsKIApAQCAtMTgzMiw3ICsyMDQ1LDcgQEAKIAlzd2l0Y2ggKGNoYW4tPm1vZGUpIHsKIAljYXNlIEwyQ0FQX01PREVfU1RSRUFNSU5HOgogCWNhc2UgTDJDQVBfTU9ERV9FUlRNOgotCQlpZiAoIShjaGFuLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9TVEFURTJfREVWSUNFKSkgeworCQlpZiAoIXRlc3RfYml0KENPTkZfU1RBVEUyX0RFVklDRSwgJmNoYW4tPmNvbmZfc3RhdGUpKSB7CiAJCQljaGFuLT5tb2RlID0gbDJjYXBfc2VsZWN0X21vZGUocmZjLm1vZGUsCiAJCQkJCWNoYW4tPmNvbm4tPmZlYXRfbWFzayk7CiAJCQlicmVhazsKQEAgLTE4NjUsMTQgKzIwNzgsMTQgQEAKIAkJCXJlc3VsdCA9IEwyQ0FQX0NPTkZfVU5BQ0NFUFQ7CiAJCWVsc2UgewogCQkJY2hhbi0+b210dSA9IG10dTsKLQkJCWNoYW4tPmNvbmZfc3RhdGUgfD0gTDJDQVBfQ09ORl9NVFVfRE9ORTsKKwkJCXNldF9iaXQoQ09ORl9NVFVfRE9ORSwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCQl9CiAJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX01UVSwgMiwgY2hhbi0+b210dSk7CiAKIAkJc3dpdGNoIChyZmMubW9kZSkgewogCQljYXNlIEwyQ0FQX01PREVfQkFTSUM6CiAJCQljaGFuLT5mY3MgPSBMMkNBUF9GQ1NfTk9ORTsKLQkJCWNoYW4tPmNvbmZfc3RhdGUgfD0gTDJDQVBfQ09ORl9NT0RFX0RPTkU7CisJCQlzZXRfYml0KENPTkZfTU9ERV9ET05FLCAmY2hhbi0+Y29uZl9zdGF0ZSk7CiAJCQlicmVhazsKIAogCQljYXNlIEwyQ0FQX01PREVfRVJUTToKQEAgLTE4ODksNyArMjEwMiw3IEBACiAJCQlyZmMubW9uaXRvcl90aW1lb3V0ID0KIAkJCQlsZTE2X3RvX2NwdShMMkNBUF9ERUZBVUxUX01PTklUT1JfVE8pOwogCi0JCQljaGFuLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfTU9ERV9ET05FOworCQkJc2V0X2JpdChDT05GX01PREVfRE9ORSwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCiAJCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9SRkMsCiAJCQkJCXNpemVvZihyZmMpLCAodW5zaWduZWQgbG9uZykgJnJmYyk7CkBAIC0xOTAyLDcgKzIxMTUsNyBAQAogCiAJCQljaGFuLT5yZW1vdGVfbXBzID0gbGUxNl90b19jcHUocmZjLm1heF9wZHVfc2l6ZSk7CiAKLQkJCWNoYW4tPmNvbmZfc3RhdGUgfD0gTDJDQVBfQ09ORl9NT0RFX0RPTkU7CisJCQlzZXRfYml0KENPTkZfTU9ERV9ET05FLCAmY2hhbi0+Y29uZl9zdGF0ZSk7CiAKIAkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX1JGQywKIAkJCQkJc2l6ZW9mKHJmYyksICh1bnNpZ25lZCBsb25nKSAmcmZjKTsKQEAgLTE5MTcsNyArMjEzMCw3IEBACiAJCX0KIAogCQlpZiAocmVzdWx0ID09IEwyQ0FQX0NPTkZfU1VDQ0VTUykKLQkJCWNoYW4tPmNvbmZfc3RhdGUgfD0gTDJDQVBfQ09ORl9PVVRQVVRfRE9ORTsKKwkJCXNldF9iaXQoQ09ORl9PVVRQVVRfRE9ORSwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCX0KIAlyc3AtPnNjaWQgICA9IGNwdV90b19sZTE2KGNoYW4tPmRjaWQpOwogCXJzcC0+cmVzdWx0ID0gY3B1X3RvX2xlMTYocmVzdWx0KTsKQEAgLTE5NTksNyArMjE3Miw3IEBACiAJCQlpZiAob2xlbiA9PSBzaXplb2YocmZjKSkKIAkJCQltZW1jcHkoJnJmYywgKHZvaWQgKil2YWwsIG9sZW4pOwogCi0JCQlpZiAoKGNoYW4tPmNvbmZfc3RhdGUgJiBMMkNBUF9DT05GX1NUQVRFMl9ERVZJQ0UpICYmCisJCQlpZiAodGVzdF9iaXQoQ09ORl9TVEFURTJfREVWSUNFLCAmY2hhbi0+Y29uZl9zdGF0ZSkgJiYKIAkJCQkJCQlyZmMubW9kZSAhPSBjaGFuLT5tb2RlKQogCQkJCXJldHVybiAtRUNPTk5SRUZVU0VEOwogCkBAIC0yMDIxLDEwICsyMjM0LDkgQEAKIAlsMmNhcF9zZW5kX2NtZChjb25uLCBjaGFuLT5pZGVudCwKIAkJCQlMMkNBUF9DT05OX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOwogCi0JaWYgKGNoYW4tPmNvbmZfc3RhdGUgJiBMMkNBUF9DT05GX1JFUV9TRU5UKQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KENPTkZfUkVRX1NFTlQsICZjaGFuLT5jb25mX3N0YXRlKSkKIAkJcmV0dXJuOwogCi0JY2hhbi0+Y29uZl9zdGF0ZSB8PSBMMkNBUF9DT05GX1JFUV9TRU5UOwogCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwgTDJDQVBfQ09ORl9SRVEsCiAJCQlsMmNhcF9idWlsZF9jb25mX3JlcShjaGFuLCBidWYpLCBidWYpOwogCWNoYW4tPm51bV9jb25mX3JlcSsrOwpAQCAtMjA2Niw5ICsyMjc4LDkgQEAKIAogc3RhdGljIGlubGluZSBpbnQgbDJjYXBfY29tbWFuZF9yZWooc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBsMmNhcF9jbWRfaGRyICpjbWQsIHU4ICpkYXRhKQogewotCXN0cnVjdCBsMmNhcF9jbWRfcmVqICpyZWogPSAoc3RydWN0IGwyY2FwX2NtZF9yZWogKikgZGF0YTsKKwlzdHJ1Y3QgbDJjYXBfY21kX3Jlal91bmsgKnJlaiA9IChzdHJ1Y3QgbDJjYXBfY21kX3Jlal91bmsgKikgZGF0YTsKIAotCWlmIChyZWotPnJlYXNvbiAhPSAweDAwMDApCisJaWYgKHJlai0+cmVhc29uICE9IEwyQ0FQX1JFSl9OT1RfVU5ERVJTVE9PRCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoKGNvbm4tPmluZm9fc3RhdGUgJiBMMkNBUF9JTkZPX0ZFQVRfTUFTS19SRVFfU0VOVCkgJiYKQEAgLTIxMjQsMTcgKzIzMzYsMTEgQEAKIAkJZ290byByZXNwb25zZTsKIAl9CiAKLQlzayA9IGwyY2FwX3NvY2tfYWxsb2Moc29ja19uZXQocGFyZW50KSwgTlVMTCwgQlRQUk9UT19MMkNBUCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFzaykKKwljaGFuID0gcGNoYW4tPm9wcy0+bmV3X2Nvbm5lY3Rpb24ocGNoYW4tPmRhdGEpOworCWlmICghY2hhbikKIAkJZ290byByZXNwb25zZTsKIAotCWNoYW4gPSBsMmNhcF9jaGFuX2NyZWF0ZShzayk7Ci0JaWYgKCFjaGFuKSB7Ci0JCWwyY2FwX3NvY2tfa2lsbChzayk7Ci0JCWdvdG8gcmVzcG9uc2U7Ci0JfQotCi0JbDJjYXBfcGkoc2spLT5jaGFuID0gY2hhbjsKKwlzayA9IGNoYW4tPnNrOwogCiAJd3JpdGVfbG9ja19iaCgmY29ubi0+Y2hhbl9sb2NrKTsKIApAQCAtMjE0MiwxMyArMjM0OCwxMiBAQAogCWlmIChfX2wyY2FwX2dldF9jaGFuX2J5X2RjaWQoY29ubiwgc2NpZCkpIHsKIAkJd3JpdGVfdW5sb2NrX2JoKCZjb25uLT5jaGFuX2xvY2spOwogCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7Ci0JCWwyY2FwX3NvY2tfa2lsbChzayk7CisJCWNoYW4tPm9wcy0+Y2xvc2UoY2hhbi0+ZGF0YSk7CiAJCWdvdG8gcmVzcG9uc2U7CiAJfQogCiAJaGNpX2Nvbm5faG9sZChjb25uLT5oY29uKTsKIAotCWwyY2FwX3NvY2tfaW5pdChzaywgcGFyZW50KTsKIAliYWNweSgmYnRfc2soc2spLT5zcmMsIGNvbm4tPnNyYyk7CiAJYmFjcHkoJmJ0X3NrKHNrKS0+ZHN0LCBjb25uLT5kc3QpOwogCWNoYW4tPnBzbSAgPSBwc207CkBAIC0yMTYwLDI5ICsyMzY1LDI5IEBACiAKIAlkY2lkID0gY2hhbi0+c2NpZDsKIAotCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBzay0+c2tfc25kdGltZW8pOworCV9fc2V0X2NoYW5fdGltZXIoY2hhbiwgc2stPnNrX3NuZHRpbWVvKTsKIAogCWNoYW4tPmlkZW50ID0gY21kLT5pZGVudDsKIAogCWlmIChjb25uLT5pbmZvX3N0YXRlICYgTDJDQVBfSU5GT19GRUFUX01BU0tfUkVRX0RPTkUpIHsKIAkJaWYgKGwyY2FwX2NoZWNrX3NlY3VyaXR5KGNoYW4pKSB7CiAJCQlpZiAoYnRfc2soc2spLT5kZWZlcl9zZXR1cCkgewotCQkJCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1QyOworCQkJCWwyY2FwX3N0YXRlX2NoYW5nZShjaGFuLCBCVF9DT05ORUNUMik7CiAJCQkJcmVzdWx0ID0gTDJDQVBfQ1JfUEVORDsKIAkJCQlzdGF0dXMgPSBMMkNBUF9DU19BVVRIT1JfUEVORDsKIAkJCQlwYXJlbnQtPnNrX2RhdGFfcmVhZHkocGFyZW50LCAwKTsKIAkJCX0gZWxzZSB7Ci0JCQkJc2stPnNrX3N0YXRlID0gQlRfQ09ORklHOworCQkJCWwyY2FwX3N0YXRlX2NoYW5nZShjaGFuLCBCVF9DT05GSUcpOwogCQkJCXJlc3VsdCA9IEwyQ0FQX0NSX1NVQ0NFU1M7CiAJCQkJc3RhdHVzID0gTDJDQVBfQ1NfTk9fSU5GTzsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1QyOworCQkJbDJjYXBfc3RhdGVfY2hhbmdlKGNoYW4sIEJUX0NPTk5FQ1QyKTsKIAkJCXJlc3VsdCA9IEwyQ0FQX0NSX1BFTkQ7CiAJCQlzdGF0dXMgPSBMMkNBUF9DU19BVVRIRU5fUEVORDsKIAkJfQogCX0gZWxzZSB7Ci0JCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1QyOworCQlsMmNhcF9zdGF0ZV9jaGFuZ2UoY2hhbiwgQlRfQ09OTkVDVDIpOwogCQlyZXN1bHQgPSBMMkNBUF9DUl9QRU5EOwogCQlzdGF0dXMgPSBMMkNBUF9DU19OT19JTkZPOwogCX0KQEAgLTIyMTMsMTAgKzI0MTgsMTAgQEAKIAkJCQkJTDJDQVBfSU5GT19SRVEsIHNpemVvZihpbmZvKSwgJmluZm8pOwogCX0KIAotCWlmIChjaGFuICYmICEoY2hhbi0+Y29uZl9zdGF0ZSAmIEwyQ0FQX0NPTkZfUkVRX1NFTlQpICYmCisJaWYgKGNoYW4gJiYgIXRlc3RfYml0KENPTkZfUkVRX1NFTlQsICZjaGFuLT5jb25mX3N0YXRlKSAmJgogCQkJCXJlc3VsdCA9PSBMMkNBUF9DUl9TVUNDRVNTKSB7CiAJCXU4IGJ1ZlsxMjhdOwotCQljaGFuLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfUkVRX1NFTlQ7CisJCXNldF9iaXQoQ09ORl9SRVFfU0VOVCwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9nZXRfaWRlbnQoY29ubiksIEwyQ0FQX0NPTkZfUkVRLAogCQkJCQlsMmNhcF9idWlsZF9jb25mX3JlcShjaGFuLCBidWYpLCBidWYpOwogCQljaGFuLT5udW1fY29uZl9yZXErKzsKQEAgLTIyNTQsMzEgKzI0NTksMjkgQEAKIAogCXN3aXRjaCAocmVzdWx0KSB7CiAJY2FzZSBMMkNBUF9DUl9TVUNDRVNTOgotCQlzay0+c2tfc3RhdGUgPSBCVF9DT05GSUc7CisJCWwyY2FwX3N0YXRlX2NoYW5nZShjaGFuLCBCVF9DT05GSUcpOwogCQljaGFuLT5pZGVudCA9IDA7CiAJCWNoYW4tPmRjaWQgPSBkY2lkOwotCQljaGFuLT5jb25mX3N0YXRlICY9IH5MMkNBUF9DT05GX0NPTk5FQ1RfUEVORDsKKwkJY2xlYXJfYml0KENPTkZfQ09OTkVDVF9QRU5ELCAmY2hhbi0+Y29uZl9zdGF0ZSk7CiAKLQkJaWYgKGNoYW4tPmNvbmZfc3RhdGUgJiBMMkNBUF9DT05GX1JFUV9TRU5UKQorCQlpZiAodGVzdF9hbmRfc2V0X2JpdChDT05GX1JFUV9TRU5ULCAmY2hhbi0+Y29uZl9zdGF0ZSkpCiAJCQlicmVhazsKIAotCQljaGFuLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfUkVRX1NFTlQ7Ci0KIAkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfZ2V0X2lkZW50KGNvbm4pLCBMMkNBUF9DT05GX1JFUSwKIAkJCQkJbDJjYXBfYnVpbGRfY29uZl9yZXEoY2hhbiwgcmVxKSwgcmVxKTsKIAkJY2hhbi0+bnVtX2NvbmZfcmVxKys7CiAJCWJyZWFrOwogCiAJY2FzZSBMMkNBUF9DUl9QRU5EOgotCQljaGFuLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfQ09OTkVDVF9QRU5EOworCQlzZXRfYml0KENPTkZfQ09OTkVDVF9QRU5ELCAmY2hhbi0+Y29uZl9zdGF0ZSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJLyogZG9uJ3QgZGVsZXRlIGwyY2FwIGNoYW5uZWwgaWYgc2sgaXMgb3duZWQgYnkgdXNlciAqLwogCQlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkgewotCQkJc2stPnNrX3N0YXRlID0gQlRfRElTQ09OTjsKLQkJCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOwotCQkJbDJjYXBfc29ja19zZXRfdGltZXIoc2ssIEhaIC8gNSk7CisJCQlsMmNhcF9zdGF0ZV9jaGFuZ2UoY2hhbiwgQlRfRElTQ09OTik7CisJCQlfX2NsZWFyX2NoYW5fdGltZXIoY2hhbik7CisJCQlfX3NldF9jaGFuX3RpbWVyKGNoYW4sIEhaIC8gNSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0yMjkyLDE0ICsyNDk1LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZGVmYXVsdF9mY3Moc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCiB7Ci0Jc3RydWN0IGwyY2FwX3BpbmZvICpwaSA9IGwyY2FwX3BpKGNoYW4tPnNrKTsKLQogCS8qIEZDUyBpcyBlbmFibGVkIG9ubHkgaW4gRVJUTSBvciBzdHJlYW1pbmcgbW9kZSwgaWYgb25lIG9yIGJvdGgKIAkgKiBzaWRlcyByZXF1ZXN0IGl0LgogCSAqLwogCWlmIChjaGFuLT5tb2RlICE9IEwyQ0FQX01PREVfRVJUTSAmJiBjaGFuLT5tb2RlICE9IEwyQ0FQX01PREVfU1RSRUFNSU5HKQogCQljaGFuLT5mY3MgPSBMMkNBUF9GQ1NfTk9ORTsKLQllbHNlIGlmICghKHBpLT5jaGFuLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9OT19GQ1NfUkVDVikpCisJZWxzZSBpZiAoIXRlc3RfYml0KENPTkZfTk9fRkNTX1JFQ1YsICZjaGFuLT5jb25mX3N0YXRlKSkKIAkJY2hhbi0+ZmNzID0gTDJDQVBfRkNTX0NSQzE2OwogfQogCkBAIC0yMzIzLDEwICsyNTI0LDEzIEBACiAKIAlzayA9IGNoYW4tPnNrOwogCi0JaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9DT05GSUcpIHsKLQkJc3RydWN0IGwyY2FwX2NtZF9yZWogcmVqOworCWlmIChjaGFuLT5zdGF0ZSAhPSBCVF9DT05GSUcgJiYgY2hhbi0+c3RhdGUgIT0gQlRfQ09OTkVDVDIpIHsKKwkJc3RydWN0IGwyY2FwX2NtZF9yZWpfY2lkIHJlajsKIAotCQlyZWoucmVhc29uID0gY3B1X3RvX2xlMTYoMHgwMDAyKTsKKwkJcmVqLnJlYXNvbiA9IGNwdV90b19sZTE2KEwyQ0FQX1JFSl9JTlZBTElEX0NJRCk7CisJCXJlai5zY2lkID0gY3B1X3RvX2xlMTYoY2hhbi0+c2NpZCk7CisJCXJlai5kY2lkID0gY3B1X3RvX2xlMTYoY2hhbi0+ZGNpZCk7CisKIAkJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLT5pZGVudCwgTDJDQVBfQ09NTUFORF9SRUosCiAJCQkJc2l6ZW9mKHJlaiksICZyZWopOwogCQlnb3RvIHVubG9jazsKQEAgLTIzMzQsNyArMjUzOCw3IEBACiAKIAkvKiBSZWplY3QgaWYgY29uZmlnIGJ1ZmZlciBpcyB0b28gc21hbGwuICovCiAJbGVuID0gY21kX2xlbiAtIHNpemVvZigqcmVxKTsKLQlpZiAoY2hhbi0+Y29uZl9sZW4gKyBsZW4gPiBzaXplb2YoY2hhbi0+Y29uZl9yZXEpKSB7CisJaWYgKGxlbiA8IDAgfHwgY2hhbi0+Y29uZl9sZW4gKyBsZW4gPiBzaXplb2YoY2hhbi0+Y29uZl9yZXEpKSB7CiAJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNtZC0+aWRlbnQsIEwyQ0FQX0NPTkZfUlNQLAogCQkJCWwyY2FwX2J1aWxkX2NvbmZfcnNwKGNoYW4sIHJzcCwKIAkJCQkJTDJDQVBfQ09ORl9SRUpFQ1QsIGZsYWdzKSwgcnNwKTsKQEAgLTIzNjYsMTMgKzI1NzAsMTMgQEAKIAkvKiBSZXNldCBjb25maWcgYnVmZmVyLiAqLwogCWNoYW4tPmNvbmZfbGVuID0gMDsKIAotCWlmICghKGNoYW4tPmNvbmZfc3RhdGUgJiBMMkNBUF9DT05GX09VVFBVVF9ET05FKSkKKwlpZiAoIXRlc3RfYml0KENPTkZfT1VUUFVUX0RPTkUsICZjaGFuLT5jb25mX3N0YXRlKSkKIAkJZ290byB1bmxvY2s7CiAKLQlpZiAoY2hhbi0+Y29uZl9zdGF0ZSAmIEwyQ0FQX0NPTkZfSU5QVVRfRE9ORSkgeworCWlmICh0ZXN0X2JpdChDT05GX0lOUFVUX0RPTkUsICZjaGFuLT5jb25mX3N0YXRlKSkgewogCQlzZXRfZGVmYXVsdF9mY3MoY2hhbik7CiAKLQkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVEVEOworCQlsMmNhcF9zdGF0ZV9jaGFuZ2UoY2hhbiwgQlRfQ09OTkVDVEVEKTsKIAogCQljaGFuLT5uZXh0X3R4X3NlcSA9IDA7CiAJCWNoYW4tPmV4cGVjdGVkX3R4X3NlcSA9IDA7CkBAIC0yMzg0LDkgKzI1ODgsOCBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlpZiAoIShjaGFuLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9SRVFfU0VOVCkpIHsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQ09ORl9SRVFfU0VOVCwgJmNoYW4tPmNvbmZfc3RhdGUpKSB7CiAJCXU4IGJ1Zls2NF07Ci0JCWNoYW4tPmNvbmZfc3RhdGUgfD0gTDJDQVBfQ09ORl9SRVFfU0VOVDsKIAkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfZ2V0X2lkZW50KGNvbm4pLCBMMkNBUF9DT05GX1JFUSwKIAkJCQkJbDJjYXBfYnVpbGRfY29uZl9yZXEoY2hhbiwgYnVmKSwgYnVmKTsKIAkJY2hhbi0+bnVtX2NvbmZfcmVxKys7CkBAIC0yNDUxLDcgKzI2NTQsNyBAQAogCiAJZGVmYXVsdDoKIAkJc2stPnNrX2VyciA9IEVDT05OUkVTRVQ7Ci0JCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBIWiAqIDUpOworCQlfX3NldF9jaGFuX3RpbWVyKGNoYW4sIEhaICogNSk7CiAJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEoY29ubiwgY2hhbiwgRUNPTk5SRVNFVCk7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC0yNDU5LDEyICsyNjYyLDEyIEBACiAJaWYgKGZsYWdzICYgMHgwMSkKIAkJZ290byBkb25lOwogCi0JY2hhbi0+Y29uZl9zdGF0ZSB8PSBMMkNBUF9DT05GX0lOUFVUX0RPTkU7CisJc2V0X2JpdChDT05GX0lOUFVUX0RPTkUsICZjaGFuLT5jb25mX3N0YXRlKTsKIAotCWlmIChjaGFuLT5jb25mX3N0YXRlICYgTDJDQVBfQ09ORl9PVVRQVVRfRE9ORSkgeworCWlmICh0ZXN0X2JpdChDT05GX09VVFBVVF9ET05FLCAmY2hhbi0+Y29uZl9zdGF0ZSkpIHsKIAkJc2V0X2RlZmF1bHRfZmNzKGNoYW4pOwogCi0JCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKKwkJbDJjYXBfc3RhdGVfY2hhbmdlKGNoYW4sIEJUX0NPTk5FQ1RFRCk7CiAJCWNoYW4tPm5leHRfdHhfc2VxID0gMDsKIAkJY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxID0gMDsKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2hhbi0+dHhfcSk7CkBAIC0yNTA2LDkgKzI3MDksOSBAQAogCiAJLyogZG9uJ3QgZGVsZXRlIGwyY2FwIGNoYW5uZWwgaWYgc2sgaXMgb3duZWQgYnkgdXNlciAqLwogCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7Ci0JCXNrLT5za19zdGF0ZSA9IEJUX0RJU0NPTk47Ci0JCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOwotCQlsMmNhcF9zb2NrX3NldF90aW1lcihzaywgSFogLyA1KTsKKwkJbDJjYXBfc3RhdGVfY2hhbmdlKGNoYW4sIEJUX0RJU0NPTk4pOworCQlfX2NsZWFyX2NoYW5fdGltZXIoY2hhbik7CisJCV9fc2V0X2NoYW5fdGltZXIoY2hhbiwgSFogLyA1KTsKIAkJYmhfdW5sb2NrX3NvY2soc2spOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yNTE2LDcgKzI3MTksNyBAQAogCWwyY2FwX2NoYW5fZGVsKGNoYW4sIEVDT05OUkVTRVQpOwogCWJoX3VubG9ja19zb2NrKHNrKTsKIAotCWwyY2FwX3NvY2tfa2lsbChzayk7CisJY2hhbi0+b3BzLT5jbG9zZShjaGFuLT5kYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjU0MCw5ICsyNzQzLDkgQEAKIAogCS8qIGRvbid0IGRlbGV0ZSBsMmNhcCBjaGFubmVsIGlmIHNrIGlzIG93bmVkIGJ5IHVzZXIgKi8KIAlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkgewotCQlzay0+c2tfc3RhdGUgPSBCVF9ESVNDT05OOwotCQlsMmNhcF9zb2NrX2NsZWFyX3RpbWVyKHNrKTsKLQkJbDJjYXBfc29ja19zZXRfdGltZXIoc2ssIEhaIC8gNSk7CisJCWwyY2FwX3N0YXRlX2NoYW5nZShjaGFuLEJUX0RJU0NPTk4pOworCQlfX2NsZWFyX2NoYW5fdGltZXIoY2hhbik7CisJCV9fc2V0X2NoYW5fdGltZXIoY2hhbiwgSFogLyA1KTsKIAkJYmhfdW5sb2NrX3NvY2soc2spOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yNTUwLDcgKzI3NTMsNyBAQAogCWwyY2FwX2NoYW5fZGVsKGNoYW4sIDApOwogCWJoX3VubG9ja19zb2NrKHNrKTsKIAotCWwyY2FwX3NvY2tfa2lsbChzayk7CisJY2hhbi0+b3BzLT5jbG9zZShjaGFuLT5kYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjgxOCwxMiArMzAyMSwxMiBAQAogCQkJZXJyID0gbDJjYXBfYnJlZHJfc2lnX2NtZChjb25uLCAmY21kLCBjbWRfbGVuLCBkYXRhKTsKIAogCQlpZiAoZXJyKSB7Ci0JCQlzdHJ1Y3QgbDJjYXBfY21kX3JlaiByZWo7CisJCQlzdHJ1Y3QgbDJjYXBfY21kX3Jlal91bmsgcmVqOwogCiAJCQlCVF9FUlIoIldyb25nIGxpbmsgdHlwZSAoJWQpIiwgZXJyKTsKIAogCQkJLyogRklYTUU6IE1hcCBlcnIgdG8gYSB2YWxpZCByZWFzb24gKi8KLQkJCXJlai5yZWFzb24gPSBjcHVfdG9fbGUxNigwKTsKKwkJCXJlai5yZWFzb24gPSBjcHVfdG9fbGUxNihMMkNBUF9SRUpfTk9UX1VOREVSU1RPT0QpOwogCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLmlkZW50LCBMMkNBUF9DT01NQU5EX1JFSiwgc2l6ZW9mKHJlaiksICZyZWopOwogCQl9CiAKQEAgLTI4NTgsMTggKzMwNjEsMTggQEAKIAogCWNvbnRyb2wgfD0gY2hhbi0+YnVmZmVyX3NlcSA8PCBMMkNBUF9DVFJMX1JFUVNFUV9TSElGVDsKIAotCWlmIChjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9MT0NBTF9CVVNZKSB7CisJaWYgKHRlc3RfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7CiAJCWNvbnRyb2wgfD0gTDJDQVBfU1VQRVJfUkNWX05PVF9SRUFEWTsKIAkJbDJjYXBfc2VuZF9zZnJhbWUoY2hhbiwgY29udHJvbCk7Ci0JCWNoYW4tPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9STlJfU0VOVDsKKwkJc2V0X2JpdChDT05OX1JOUl9TRU5ULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJfQogCi0JaWYgKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1JFTU9URV9CVVNZKQorCWlmICh0ZXN0X2JpdChDT05OX1JFTU9URV9CVVNZLCAmY2hhbi0+Y29ubl9zdGF0ZSkpCiAJCWwyY2FwX3JldHJhbnNtaXRfZnJhbWVzKGNoYW4pOwogCiAJbDJjYXBfZXJ0bV9zZW5kKGNoYW4pOwogCi0JaWYgKCEoY2hhbi0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fTE9DQUxfQlVTWSkgJiYKKwlpZiAoIXRlc3RfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpICYmCiAJCQljaGFuLT5mcmFtZXNfc2VudCA9PSAwKSB7CiAJCWNvbnRyb2wgfD0gTDJDQVBfU1VQRVJfUkNWX1JFQURZOwogCQlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKQEAgLTI5MjUsMTcgKzMxMjgsMTMgQEAKIAogCXN3aXRjaCAoY29udHJvbCAmIEwyQ0FQX0NUUkxfU0FSKSB7CiAJY2FzZSBMMkNBUF9TRFVfVU5TRUdNRU5URUQ6Ci0JCWlmIChjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9TQVJfU0RVKQorCQlpZiAodGVzdF9iaXQoQ09OTl9TQVJfU0RVLCAmY2hhbi0+Y29ubl9zdGF0ZSkpCiAJCQlnb3RvIGRyb3A7CiAKLQkJZXJyID0gc29ja19xdWV1ZV9yY3Zfc2tiKGNoYW4tPnNrLCBza2IpOwotCQlpZiAoIWVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJYnJlYWs7CisJCXJldHVybiBjaGFuLT5vcHMtPnJlY3YoY2hhbi0+ZGF0YSwgc2tiKTsKIAogCWNhc2UgTDJDQVBfU0RVX1NUQVJUOgotCQlpZiAoY2hhbi0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fU0FSX1NEVSkKKwkJaWYgKHRlc3RfYml0KENPTk5fU0FSX1NEVSwgJmNoYW4tPmNvbm5fc3RhdGUpKQogCQkJZ290byBkcm9wOwogCiAJCWNoYW4tPnNkdV9sZW4gPSBnZXRfdW5hbGlnbmVkX2xlMTYoc2tiLT5kYXRhKTsKQEAgLTI5NTQsMTIgKzMxNTMsMTIgQEAKIAogCQltZW1jcHkoc2tiX3B1dChjaGFuLT5zZHUsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAKLQkJY2hhbi0+Y29ubl9zdGF0ZSB8PSBMMkNBUF9DT05OX1NBUl9TRFU7CisJCXNldF9iaXQoQ09OTl9TQVJfU0RVLCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJCWNoYW4tPnBhcnRpYWxfc2R1X2xlbiA9IHNrYi0+bGVuOwogCQlicmVhazsKIAogCWNhc2UgTDJDQVBfU0RVX0NPTlRJTlVFOgotCQlpZiAoIShjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9TQVJfU0RVKSkKKwkJaWYgKCF0ZXN0X2JpdChDT05OX1NBUl9TRFUsICZjaGFuLT5jb25uX3N0YXRlKSkKIAkJCWdvdG8gZGlzY29ubmVjdDsKIAogCQlpZiAoIWNoYW4tPnNkdSkKQEAgLTI5NzQsMzkgKzMxNzMsMzQgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEwyQ0FQX1NEVV9FTkQ6Ci0JCWlmICghKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1NBUl9TRFUpKQorCQlpZiAoIXRlc3RfYml0KENPTk5fU0FSX1NEVSwgJmNoYW4tPmNvbm5fc3RhdGUpKQogCQkJZ290byBkaXNjb25uZWN0OwogCiAJCWlmICghY2hhbi0+c2R1KQogCQkJZ290byBkaXNjb25uZWN0OwogCi0JCWlmICghKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1NBUl9SRVRSWSkpIHsKLQkJCWNoYW4tPnBhcnRpYWxfc2R1X2xlbiArPSBza2ItPmxlbjsKKwkJY2hhbi0+cGFydGlhbF9zZHVfbGVuICs9IHNrYi0+bGVuOwogCi0JCQlpZiAoY2hhbi0+cGFydGlhbF9zZHVfbGVuID4gY2hhbi0+aW10dSkKLQkJCQlnb3RvIGRyb3A7CisJCWlmIChjaGFuLT5wYXJ0aWFsX3NkdV9sZW4gPiBjaGFuLT5pbXR1KQorCQkJZ290byBkcm9wOwogCi0JCQlpZiAoY2hhbi0+cGFydGlhbF9zZHVfbGVuICE9IGNoYW4tPnNkdV9sZW4pCi0JCQkJZ290byBkcm9wOworCQlpZiAoY2hhbi0+cGFydGlhbF9zZHVfbGVuICE9IGNoYW4tPnNkdV9sZW4pCisJCQlnb3RvIGRyb3A7CiAKLQkJCW1lbWNweShza2JfcHV0KGNoYW4tPnNkdSwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJfQorCQltZW1jcHkoc2tiX3B1dChjaGFuLT5zZHUsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAKIAkJX3NrYiA9IHNrYl9jbG9uZShjaGFuLT5zZHUsIEdGUF9BVE9NSUMpOwogCQlpZiAoIV9za2IpIHsKLQkJCWNoYW4tPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9TQVJfUkVUUlk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCi0JCWVyciA9IHNvY2tfcXVldWVfcmN2X3NrYihjaGFuLT5zaywgX3NrYik7CisJCWVyciA9IGNoYW4tPm9wcy0+cmVjdihjaGFuLT5kYXRhLCBfc2tiKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWtmcmVlX3NrYihfc2tiKTsKLQkJCWNoYW4tPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9TQVJfUkVUUlk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKLQkJY2hhbi0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9TQVJfUkVUUlk7Ci0JCWNoYW4tPmNvbm5fc3RhdGUgJj0gfkwyQ0FQX0NPTk5fU0FSX1NEVTsKKwkJY2xlYXJfYml0KENPTk5fU0FSX1NEVSwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCiAJCWtmcmVlX3NrYihjaGFuLT5zZHUpOwogCQlicmVhazsKQEAgLTMwMjUsMjQgKzMyMTksMjggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsMmNhcF90cnlfcHVzaF9yeF9za2Ioc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCitzdGF0aWMgdm9pZCBsMmNhcF9lcnRtX2VudGVyX2xvY2FsX2J1c3koc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1MTYgY29udHJvbDsKLQlpbnQgZXJyOwogCi0Jd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY2hhbi0+YnVzeV9xKSkpIHsKLQkJY29udHJvbCA9IGJ0X2NiKHNrYiktPnNhciA8PCBMMkNBUF9DVFJMX1NBUl9TSElGVDsKLQkJZXJyID0gbDJjYXBfZXJ0bV9yZWFzc2VtYmx5X3NkdShjaGFuLCBza2IsIGNvbnRyb2wpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJc2tiX3F1ZXVlX2hlYWQoJmNoYW4tPmJ1c3lfcSwgc2tiKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KKwlCVF9EQkcoImNoYW4gJXAsIEVudGVyIGxvY2FsIGJ1c3kiLCBjaGFuKTsKIAotCQljaGFuLT5idWZmZXJfc2VxID0gKGNoYW4tPmJ1ZmZlcl9zZXEgKyAxKSAlIDY0OwotCX0KKwlzZXRfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCi0JaWYgKCEoY2hhbi0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fUk5SX1NFTlQpKQorCWNvbnRyb2wgPSBjaGFuLT5idWZmZXJfc2VxIDw8IEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUOworCWNvbnRyb2wgfD0gTDJDQVBfU1VQRVJfUkNWX05PVF9SRUFEWTsKKwlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKKworCXNldF9iaXQoQ09OTl9STlJfU0VOVCwgJmNoYW4tPmNvbm5fc3RhdGUpOworCisJX19jbGVhcl9hY2tfdGltZXIoY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX2VydG1fZXhpdF9sb2NhbF9idXN5KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQoreworCXUxNiBjb250cm9sOworCisJaWYgKCF0ZXN0X2JpdChDT05OX1JOUl9TRU5ULCAmY2hhbi0+Y29ubl9zdGF0ZSkpCiAJCWdvdG8gZG9uZTsKIAogCWNvbnRyb2wgPSBjaGFuLT5idWZmZXJfc2VxIDw8IEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUOwpAQCAtMzA1MCwxMDMgKzMyNDgsMjYgQEAKIAlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKIAljaGFuLT5yZXRyeV9jb3VudCA9IDE7CiAKLQlkZWxfdGltZXIoJmNoYW4tPnJldHJhbnNfdGltZXIpOwotCV9fbW9kX21vbml0b3JfdGltZXIoKTsKKwlfX2NsZWFyX3JldHJhbnNfdGltZXIoY2hhbik7CisJX19zZXRfbW9uaXRvcl90aW1lcihjaGFuKTsKIAotCWNoYW4tPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9XQUlUX0Y7CisJc2V0X2JpdChDT05OX1dBSVRfRiwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCiBkb25lOgotCWNoYW4tPmNvbm5fc3RhdGUgJj0gfkwyQ0FQX0NPTk5fTE9DQUxfQlVTWTsKLQljaGFuLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1JOUl9TRU5UOworCWNsZWFyX2JpdChDT05OX0xPQ0FMX0JVU1ksICZjaGFuLT5jb25uX3N0YXRlKTsKKwljbGVhcl9iaXQoQ09OTl9STlJfU0VOVCwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCiAJQlRfREJHKCJjaGFuICVwLCBFeGl0IGxvY2FsIGJ1c3kiLCBjaGFuKTsKLQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9idXN5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQordm9pZCBsMmNhcF9jaGFuX2J1c3koc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIGludCBidXN5KQogewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBsMmNhcF9jaGFuLCBidXN5X3dvcmspOwotCXN0cnVjdCBzb2NrICpzayA9IGNoYW4tPnNrOwotCWludCBuX3RyaWVzID0gMCwgdGltZW8gPSBIWi81LCBlcnI7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCWxvY2tfc29jayhzayk7Ci0KLQlhZGRfd2FpdF9xdWV1ZShza19zbGVlcChzayksICZ3YWl0KTsKLQl3aGlsZSAoKHNrYiA9IHNrYl9wZWVrKCZjaGFuLT5idXN5X3EpKSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCi0JCWlmIChuX3RyaWVzKysgPiBMMkNBUF9MT0NBTF9CVVNZX1RSSUVTKSB7Ci0JCQllcnIgPSAtRUJVU1k7Ci0JCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNoYW4tPmNvbm4sIGNoYW4sIEVCVVNZKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKCF0aW1lbykKLQkJCXRpbWVvID0gSFovNTsKLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCWVyciA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJlbGVhc2Vfc29jayhzayk7Ci0JCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7Ci0JCWxvY2tfc29jayhzayk7Ci0KLQkJZXJyID0gc29ja19lcnJvcihzayk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQotCQlpZiAobDJjYXBfdHJ5X3B1c2hfcnhfc2tiKGNoYW4pID09IDApCi0JCQlicmVhazsKKwlpZiAoY2hhbi0+bW9kZSA9PSBMMkNBUF9NT0RFX0VSVE0pIHsKKwkJaWYgKGJ1c3kpCisJCQlsMmNhcF9lcnRtX2VudGVyX2xvY2FsX2J1c3koY2hhbik7CisJCWVsc2UKKwkJCWwyY2FwX2VydG1fZXhpdF9sb2NhbF9idXN5KGNoYW4pOwogCX0KLQotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoc2tfc2xlZXAoc2spLCAmd2FpdCk7Ci0KLQlyZWxlYXNlX3NvY2soc2spOwotfQotCi1zdGF0aWMgaW50IGwyY2FwX3B1c2hfcnhfc2tiKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgY29udHJvbCkKLXsKLQlpbnQgc2N0cmwsIGVycjsKLQotCWlmIChjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9MT0NBTF9CVVNZKSB7Ci0JCWJ0X2NiKHNrYiktPnNhciA9IGNvbnRyb2wgPj4gTDJDQVBfQ1RSTF9TQVJfU0hJRlQ7Ci0JCV9fc2tiX3F1ZXVlX3RhaWwoJmNoYW4tPmJ1c3lfcSwgc2tiKTsKLQkJcmV0dXJuIGwyY2FwX3RyeV9wdXNoX3J4X3NrYihjaGFuKTsKLQotCi0JfQotCi0JZXJyID0gbDJjYXBfZXJ0bV9yZWFzc2VtYmx5X3NkdShjaGFuLCBza2IsIGNvbnRyb2wpOwotCWlmIChlcnIgPj0gMCkgewotCQljaGFuLT5idWZmZXJfc2VxID0gKGNoYW4tPmJ1ZmZlcl9zZXEgKyAxKSAlIDY0OwotCQlyZXR1cm4gZXJyOwotCX0KLQotCS8qIEJ1c3kgQ29uZGl0aW9uICovCi0JQlRfREJHKCJjaGFuICVwLCBFbnRlciBsb2NhbCBidXN5IiwgY2hhbik7Ci0KLQljaGFuLT5jb25uX3N0YXRlIHw9IEwyQ0FQX0NPTk5fTE9DQUxfQlVTWTsKLQlidF9jYihza2IpLT5zYXIgPSBjb250cm9sID4+IEwyQ0FQX0NUUkxfU0FSX1NISUZUOwotCV9fc2tiX3F1ZXVlX3RhaWwoJmNoYW4tPmJ1c3lfcSwgc2tiKTsKLQotCXNjdHJsID0gY2hhbi0+YnVmZmVyX3NlcSA8PCBMMkNBUF9DVFJMX1JFUVNFUV9TSElGVDsKLQlzY3RybCB8PSBMMkNBUF9TVVBFUl9SQ1ZfTk9UX1JFQURZOwotCWwyY2FwX3NlbmRfc2ZyYW1lKGNoYW4sIHNjdHJsKTsKLQotCWNoYW4tPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9STlJfU0VOVDsKLQotCWRlbF90aW1lcigmY2hhbi0+YWNrX3RpbWVyKTsKLQotCXF1ZXVlX3dvcmsoX2J1c3lfd3EsICZjaGFuLT5idXN5X3dvcmspOwotCi0JcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBsMmNhcF9zdHJlYW1pbmdfcmVhc3NlbWJseV9zZHUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IsIHUxNiBjb250cm9sKQpAQCAtMzE2MSwxOSArMzI4MiwxOSBAQAogCiAJc3dpdGNoIChjb250cm9sICYgTDJDQVBfQ1RSTF9TQVIpIHsKIAljYXNlIEwyQ0FQX1NEVV9VTlNFR01FTlRFRDoKLQkJaWYgKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1NBUl9TRFUpIHsKKwkJaWYgKHRlc3RfYml0KENPTk5fU0FSX1NEVSwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7CiAJCQlrZnJlZV9za2IoY2hhbi0+c2R1KTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJZXJyID0gc29ja19xdWV1ZV9yY3Zfc2tiKGNoYW4tPnNrLCBza2IpOworCQllcnIgPSBjaGFuLT5vcHMtPnJlY3YoY2hhbi0+ZGF0YSwgc2tiKTsKIAkJaWYgKCFlcnIpCiAJCQlyZXR1cm4gMDsKIAogCQlicmVhazsKIAogCWNhc2UgTDJDQVBfU0RVX1NUQVJUOgotCQlpZiAoY2hhbi0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fU0FSX1NEVSkgeworCQlpZiAodGVzdF9iaXQoQ09OTl9TQVJfU0RVLCAmY2hhbi0+Y29ubl9zdGF0ZSkpIHsKIAkJCWtmcmVlX3NrYihjaGFuLT5zZHUpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTMxOTQsMTMgKzMzMTUsMTMgQEAKIAogCQltZW1jcHkoc2tiX3B1dChjaGFuLT5zZHUsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAKLQkJY2hhbi0+Y29ubl9zdGF0ZSB8PSBMMkNBUF9DT05OX1NBUl9TRFU7CisJCXNldF9iaXQoQ09OTl9TQVJfU0RVLCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJCWNoYW4tPnBhcnRpYWxfc2R1X2xlbiA9IHNrYi0+bGVuOwogCQllcnIgPSAwOwogCQlicmVhazsKIAogCWNhc2UgTDJDQVBfU0RVX0NPTlRJTlVFOgotCQlpZiAoIShjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9TQVJfU0RVKSkKKwkJaWYgKCF0ZXN0X2JpdChDT05OX1NBUl9TRFUsICZjaGFuLT5jb25uX3N0YXRlKSkKIAkJCWJyZWFrOwogCiAJCW1lbWNweShza2JfcHV0KGNoYW4tPnNkdSwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKQEAgLTMyMTQsMTIgKzMzMzUsMTIgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEwyQ0FQX1NEVV9FTkQ6Ci0JCWlmICghKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1NBUl9TRFUpKQorCQlpZiAoIXRlc3RfYml0KENPTk5fU0FSX1NEVSwgJmNoYW4tPmNvbm5fc3RhdGUpKQogCQkJYnJlYWs7CiAKIAkJbWVtY3B5KHNrYl9wdXQoY2hhbi0+c2R1LCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCi0JCWNoYW4tPmNvbm5fc3RhdGUgJj0gfkwyQ0FQX0NPTk5fU0FSX1NEVTsKKwkJY2xlYXJfYml0KENPTk5fU0FSX1NEVSwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCQljaGFuLT5wYXJ0aWFsX3NkdV9sZW4gKz0gc2tiLT5sZW47CiAKIAkJaWYgKGNoYW4tPnBhcnRpYWxfc2R1X2xlbiA+IGNoYW4tPmltdHUpCkBAIC0zMjI3LDcgKzMzNDgsNyBAQAogCiAJCWlmIChjaGFuLT5wYXJ0aWFsX3NkdV9sZW4gPT0gY2hhbi0+c2R1X2xlbikgewogCQkJX3NrYiA9IHNrYl9jbG9uZShjaGFuLT5zZHUsIEdGUF9BVE9NSUMpOwotCQkJZXJyID0gc29ja19xdWV1ZV9yY3Zfc2tiKGNoYW4tPnNrLCBfc2tiKTsKKwkJCWVyciA9IGNoYW4tPm9wcy0+cmVjdihjaGFuLT5kYXRhLCBfc2tiKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCWtmcmVlX3NrYihfc2tiKTsKIAkJfQpAQCAtMzI0NywxMyArMzM2OCwyMiBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJdTE2IGNvbnRyb2w7CiAKLQl3aGlsZSAoKHNrYiA9IHNrYl9wZWVrKCZjaGFuLT5zcmVqX3EpKSkgeworCXdoaWxlICgoc2tiID0gc2tiX3BlZWsoJmNoYW4tPnNyZWpfcSkpICYmCisJCQkhdGVzdF9iaXQoQ09OTl9MT0NBTF9CVVNZLCAmY2hhbi0+Y29ubl9zdGF0ZSkpIHsKKwkJaW50IGVycjsKKwogCQlpZiAoYnRfY2Ioc2tiKS0+dHhfc2VxICE9IHR4X3NlcSkKIAkJCWJyZWFrOwogCiAJCXNrYiA9IHNrYl9kZXF1ZXVlKCZjaGFuLT5zcmVqX3EpOwogCQljb250cm9sID0gYnRfY2Ioc2tiKS0+c2FyIDw8IEwyQ0FQX0NUUkxfU0FSX1NISUZUOwotCQlsMmNhcF9lcnRtX3JlYXNzZW1ibHlfc2R1KGNoYW4sIHNrYiwgY29udHJvbCk7CisJCWVyciA9IGwyY2FwX2VydG1fcmVhc3NlbWJseV9zZHUoY2hhbiwgc2tiLCBjb250cm9sKTsKKworCQlpZiAoZXJyIDwgMCkgeworCQkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjaGFuLT5jb25uLCBjaGFuLCBFQ09OTlJFU0VUKTsKKwkJCWJyZWFrOworCQl9CisKIAkJY2hhbi0+YnVmZmVyX3NlcV9zcmVqID0KIAkJCShjaGFuLT5idWZmZXJfc2VxX3NyZWogKyAxKSAlIDY0OwogCQl0eF9zZXEgPSAodHhfc2VxICsgMSkgJSA2NDsKQEAgLTMzMTAsMTkgKzM0NDAsMTYgQEAKIAkJCQkJCQl0eF9zZXEsIHJ4X2NvbnRyb2wpOwogCiAJaWYgKEwyQ0FQX0NUUkxfRklOQUwgJiByeF9jb250cm9sICYmCi0JCQljaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9XQUlUX0YpIHsKLQkJZGVsX3RpbWVyKCZjaGFuLT5tb25pdG9yX3RpbWVyKTsKKwkJCXRlc3RfYml0KENPTk5fV0FJVF9GLCAmY2hhbi0+Y29ubl9zdGF0ZSkpIHsKKwkJX19jbGVhcl9tb25pdG9yX3RpbWVyKGNoYW4pOwogCQlpZiAoY2hhbi0+dW5hY2tlZF9mcmFtZXMgPiAwKQotCQkJX19tb2RfcmV0cmFuc190aW1lcigpOwotCQljaGFuLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1dBSVRfRjsKKwkJCV9fc2V0X3JldHJhbnNfdGltZXIoY2hhbik7CisJCWNsZWFyX2JpdChDT05OX1dBSVRfRiwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCX0KIAogCWNoYW4tPmV4cGVjdGVkX2Fja19zZXEgPSByZXFfc2VxOwogCWwyY2FwX2Ryb3BfYWNrZWRfZnJhbWVzKGNoYW4pOwogCi0JaWYgKHR4X3NlcSA9PSBjaGFuLT5leHBlY3RlZF90eF9zZXEpCi0JCWdvdG8gZXhwZWN0ZWQ7Ci0KIAl0eF9zZXFfb2Zmc2V0ID0gKHR4X3NlcSAtIGNoYW4tPmJ1ZmZlcl9zZXEpICUgNjQ7CiAJaWYgKHR4X3NlcV9vZmZzZXQgPCAwKQogCQl0eF9zZXFfb2Zmc2V0ICs9IDY0OwpAQCAtMzMzMywxMCArMzQ2MCwxMyBAQAogCQlnb3RvIGRyb3A7CiAJfQogCi0JaWYgKGNoYW4tPmNvbm5fc3RhdGUgPT0gTDJDQVBfQ09OTl9MT0NBTF9CVVNZKQorCWlmICh0ZXN0X2JpdChDT05OX0xPQ0FMX0JVU1ksICZjaGFuLT5jb25uX3N0YXRlKSkKIAkJZ290byBkcm9wOwogCi0JaWYgKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1NSRUpfU0VOVCkgeworCWlmICh0eF9zZXEgPT0gY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxKQorCQlnb3RvIGV4cGVjdGVkOworCisJaWYgKHRlc3RfYml0KENPTk5fU1JFSl9TRU5ULCAmY2hhbi0+Y29ubl9zdGF0ZSkpIHsKIAkJc3RydWN0IHNyZWpfbGlzdCAqZmlyc3Q7CiAKIAkJZmlyc3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjaGFuLT5zcmVqX2wsCkBAIC0zMzUwLDcgKzM0ODAsNyBAQAogCiAJCQlpZiAobGlzdF9lbXB0eSgmY2hhbi0+c3Jlal9sKSkgewogCQkJCWNoYW4tPmJ1ZmZlcl9zZXEgPSBjaGFuLT5idWZmZXJfc2VxX3NyZWo7Ci0JCQkJY2hhbi0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9TUkVKX1NFTlQ7CisJCQkJY2xlYXJfYml0KENPTk5fU1JFSl9TRU5ULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJCQkJbDJjYXBfc2VuZF9hY2soY2hhbik7CiAJCQkJQlRfREJHKCJjaGFuICVwLCBFeGl0IFNSRUpfU0VOVCIsIGNoYW4pOwogCQkJfQpAQCAtMzM3OSw3ICszNTA5LDcgQEAKIAkJaWYgKHR4X3NlcV9vZmZzZXQgPCBleHBlY3RlZF90eF9zZXFfb2Zmc2V0KQogCQkJZ290byBkcm9wOwogCi0JCWNoYW4tPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9TUkVKX1NFTlQ7CisJCXNldF9iaXQoQ09OTl9TUkVKX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKTsKIAogCQlCVF9EQkcoImNoYW4gJXAsIEVudGVyIFNSRUoiLCBjaGFuKTsKIApAQCAtMzM4NywzOSArMzUxNywzOSBAQAogCQljaGFuLT5idWZmZXJfc2VxX3NyZWogPSBjaGFuLT5idWZmZXJfc2VxOwogCiAJCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2hhbi0+c3Jlal9xKTsKLQkJX19za2JfcXVldWVfaGVhZF9pbml0KCZjaGFuLT5idXN5X3EpOwogCQlsMmNhcF9hZGRfdG9fc3Jlal9xdWV1ZShjaGFuLCBza2IsIHR4X3NlcSwgc2FyKTsKIAotCQljaGFuLT5jb25uX3N0YXRlIHw9IEwyQ0FQX0NPTk5fU0VORF9QQklUOworCQlzZXRfYml0KENPTk5fU0VORF9QQklULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAKIAkJbDJjYXBfc2VuZF9zcmVqZnJhbWUoY2hhbiwgdHhfc2VxKTsKIAotCQlkZWxfdGltZXIoJmNoYW4tPmFja190aW1lcik7CisJCV9fY2xlYXJfYWNrX3RpbWVyKGNoYW4pOwogCX0KIAlyZXR1cm4gMDsKIAogZXhwZWN0ZWQ6CiAJY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxID0gKGNoYW4tPmV4cGVjdGVkX3R4X3NlcSArIDEpICUgNjQ7CiAKLQlpZiAoY2hhbi0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fU1JFSl9TRU5UKSB7CisJaWYgKHRlc3RfYml0KENPTk5fU1JFSl9TRU5ULCAmY2hhbi0+Y29ubl9zdGF0ZSkpIHsKIAkJYnRfY2Ioc2tiKS0+dHhfc2VxID0gdHhfc2VxOwogCQlidF9jYihza2IpLT5zYXIgPSBzYXI7CiAJCV9fc2tiX3F1ZXVlX3RhaWwoJmNoYW4tPnNyZWpfcSwgc2tiKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZXJyID0gbDJjYXBfcHVzaF9yeF9za2IoY2hhbiwgc2tiLCByeF9jb250cm9sKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIDA7CisJZXJyID0gbDJjYXBfZXJ0bV9yZWFzc2VtYmx5X3NkdShjaGFuLCBza2IsIHJ4X2NvbnRyb2wpOworCWNoYW4tPmJ1ZmZlcl9zZXEgPSAoY2hhbi0+YnVmZmVyX3NlcSArIDEpICUgNjQ7CisJaWYgKGVyciA8IDApIHsKKwkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjaGFuLT5jb25uLCBjaGFuLCBFQ09OTlJFU0VUKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKIAlpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfRklOQUwpIHsKLQkJaWYgKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1JFSl9BQ1QpCi0JCQljaGFuLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1JFSl9BQ1Q7Ci0JCWVsc2UKKwkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9SRUpfQUNULCAmY2hhbi0+Y29ubl9zdGF0ZSkpCiAJCQlsMmNhcF9yZXRyYW5zbWl0X2ZyYW1lcyhjaGFuKTsKIAl9CiAKLQlfX21vZF9hY2tfdGltZXIoKTsKKwlfX3NldF9hY2tfdGltZXIoY2hhbik7CiAKIAljaGFuLT5udW1fYWNrZWQgPSAoY2hhbi0+bnVtX2Fja2VkICsgMSkgJSBudW1fdG9fYWNrOwogCWlmIChjaGFuLT5udW1fYWNrZWQgPT0gbnVtX3RvX2FjayAtIDEpCkBAIC0zNDQxLDMzICszNTcxLDMxIEBACiAJbDJjYXBfZHJvcF9hY2tlZF9mcmFtZXMoY2hhbik7CiAKIAlpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfUE9MTCkgewotCQljaGFuLT5jb25uX3N0YXRlIHw9IEwyQ0FQX0NPTk5fU0VORF9GQklUOwotCQlpZiAoY2hhbi0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fU1JFSl9TRU5UKSB7Ci0JCQlpZiAoKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1JFTU9URV9CVVNZKSAmJgorCQlzZXRfYml0KENPTk5fU0VORF9GQklULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CisJCWlmICh0ZXN0X2JpdChDT05OX1NSRUpfU0VOVCwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7CisJCQlpZiAodGVzdF9iaXQoQ09OTl9SRU1PVEVfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpICYmCiAJCQkJCShjaGFuLT51bmFja2VkX2ZyYW1lcyA+IDApKQotCQkJCV9fbW9kX3JldHJhbnNfdGltZXIoKTsKKwkJCQlfX3NldF9yZXRyYW5zX3RpbWVyKGNoYW4pOwogCi0JCQljaGFuLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1JFTU9URV9CVVNZOworCQkJY2xlYXJfYml0KENPTk5fUkVNT1RFX0JVU1ksICZjaGFuLT5jb25uX3N0YXRlKTsKIAkJCWwyY2FwX3NlbmRfc3JlanRhaWwoY2hhbik7CiAJCX0gZWxzZSB7CiAJCQlsMmNhcF9zZW5kX2lfb3JfcnJfb3Jfcm5yKGNoYW4pOwogCQl9CiAKIAl9IGVsc2UgaWYgKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX0ZJTkFMKSB7Ci0JCWNoYW4tPmNvbm5fc3RhdGUgJj0gfkwyQ0FQX0NPTk5fUkVNT1RFX0JVU1k7CisJCWNsZWFyX2JpdChDT05OX1JFTU9URV9CVVNZLCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAKLQkJaWYgKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1JFSl9BQ1QpCi0JCQljaGFuLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1JFSl9BQ1Q7Ci0JCWVsc2UKKwkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9SRUpfQUNULCAmY2hhbi0+Y29ubl9zdGF0ZSkpCiAJCQlsMmNhcF9yZXRyYW5zbWl0X2ZyYW1lcyhjaGFuKTsKIAogCX0gZWxzZSB7Ci0JCWlmICgoY2hhbi0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fUkVNT1RFX0JVU1kpICYmCisJCWlmICh0ZXN0X2JpdChDT05OX1JFTU9URV9CVVNZLCAmY2hhbi0+Y29ubl9zdGF0ZSkgJiYKIAkJCQkoY2hhbi0+dW5hY2tlZF9mcmFtZXMgPiAwKSkKLQkJCV9fbW9kX3JldHJhbnNfdGltZXIoKTsKKwkJCV9fc2V0X3JldHJhbnNfdGltZXIoY2hhbik7CiAKLQkJY2hhbi0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9SRU1PVEVfQlVTWTsKLQkJaWYgKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1NSRUpfU0VOVCkKKwkJY2xlYXJfYml0KENPTk5fUkVNT1RFX0JVU1ksICZjaGFuLT5jb25uX3N0YXRlKTsKKwkJaWYgKHRlc3RfYml0KENPTk5fU1JFSl9TRU5ULCAmY2hhbi0+Y29ubl9zdGF0ZSkpCiAJCQlsMmNhcF9zZW5kX2FjayhjaGFuKTsKIAkJZWxzZQogCQkJbDJjYXBfZXJ0bV9zZW5kKGNoYW4pOwpAQCAtMzQ4MCwyMSArMzYwOCwxOSBAQAogCiAJQlRfREJHKCJjaGFuICVwLCByZXFfc2VxICVkIGN0cmwgMHglNC40eCIsIGNoYW4sIHR4X3NlcSwgcnhfY29udHJvbCk7CiAKLQljaGFuLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1JFTU9URV9CVVNZOworCWNsZWFyX2JpdChDT05OX1JFTU9URV9CVVNZLCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAKIAljaGFuLT5leHBlY3RlZF9hY2tfc2VxID0gdHhfc2VxOwogCWwyY2FwX2Ryb3BfYWNrZWRfZnJhbWVzKGNoYW4pOwogCiAJaWYgKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX0ZJTkFMKSB7Ci0JCWlmIChjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9SRUpfQUNUKQotCQkJY2hhbi0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9SRUpfQUNUOwotCQllbHNlCisJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KENPTk5fUkVKX0FDVCwgJmNoYW4tPmNvbm5fc3RhdGUpKQogCQkJbDJjYXBfcmV0cmFuc21pdF9mcmFtZXMoY2hhbik7CiAJfSBlbHNlIHsKIAkJbDJjYXBfcmV0cmFuc21pdF9mcmFtZXMoY2hhbik7CiAKLQkJaWYgKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1dBSVRfRikKLQkJCWNoYW4tPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9SRUpfQUNUOworCQlpZiAodGVzdF9iaXQoQ09OTl9XQUlUX0YsICZjaGFuLT5jb25uX3N0YXRlKSkKKwkJCXNldF9iaXQoQ09OTl9SRUpfQUNULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJfQogfQogc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX2RhdGFfY2hhbm5lbF9zcmVqZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUxNiByeF9jb250cm9sKQpAQCAtMzUwMywzMiArMzYyOSwzMiBAQAogCiAJQlRfREJHKCJjaGFuICVwLCByZXFfc2VxICVkIGN0cmwgMHglNC40eCIsIGNoYW4sIHR4X3NlcSwgcnhfY29udHJvbCk7CiAKLQljaGFuLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1JFTU9URV9CVVNZOworCWNsZWFyX2JpdChDT05OX1JFTU9URV9CVVNZLCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAKIAlpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfUE9MTCkgewogCQljaGFuLT5leHBlY3RlZF9hY2tfc2VxID0gdHhfc2VxOwogCQlsMmNhcF9kcm9wX2Fja2VkX2ZyYW1lcyhjaGFuKTsKIAotCQljaGFuLT5jb25uX3N0YXRlIHw9IEwyQ0FQX0NPTk5fU0VORF9GQklUOworCQlzZXRfYml0KENPTk5fU0VORF9GQklULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJCWwyY2FwX3JldHJhbnNtaXRfb25lX2ZyYW1lKGNoYW4sIHR4X3NlcSk7CiAKIAkJbDJjYXBfZXJ0bV9zZW5kKGNoYW4pOwogCi0JCWlmIChjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9XQUlUX0YpIHsKKwkJaWYgKHRlc3RfYml0KENPTk5fV0FJVF9GLCAmY2hhbi0+Y29ubl9zdGF0ZSkpIHsKIAkJCWNoYW4tPnNyZWpfc2F2ZV9yZXFzZXEgPSB0eF9zZXE7Ci0JCQljaGFuLT5jb25uX3N0YXRlIHw9IEwyQ0FQX0NPTk5fU1JFSl9BQ1Q7CisJCQlzZXRfYml0KENPTk5fU1JFSl9BQ1QsICZjaGFuLT5jb25uX3N0YXRlKTsKIAkJfQogCX0gZWxzZSBpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfRklOQUwpIHsKLQkJaWYgKChjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9TUkVKX0FDVCkgJiYKKwkJaWYgKHRlc3RfYml0KENPTk5fU1JFSl9BQ1QsICZjaGFuLT5jb25uX3N0YXRlKSAmJgogCQkJCWNoYW4tPnNyZWpfc2F2ZV9yZXFzZXEgPT0gdHhfc2VxKQotCQkJY2hhbi0+Y29ubl9zdGF0ZSAmPSB+TDJDQVBfQ09OTl9TUkVKX0FDVDsKKwkJCWNsZWFyX2JpdChDT05OX1NSRUpfQUNULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJCWVsc2UKIAkJCWwyY2FwX3JldHJhbnNtaXRfb25lX2ZyYW1lKGNoYW4sIHR4X3NlcSk7CiAJfSBlbHNlIHsKIAkJbDJjYXBfcmV0cmFuc21pdF9vbmVfZnJhbWUoY2hhbiwgdHhfc2VxKTsKLQkJaWYgKGNoYW4tPmNvbm5fc3RhdGUgJiBMMkNBUF9DT05OX1dBSVRfRikgeworCQlpZiAodGVzdF9iaXQoQ09OTl9XQUlUX0YsICZjaGFuLT5jb25uX3N0YXRlKSkgewogCQkJY2hhbi0+c3Jlal9zYXZlX3JlcXNlcSA9IHR4X3NlcTsKLQkJCWNoYW4tPmNvbm5fc3RhdGUgfD0gTDJDQVBfQ09OTl9TUkVKX0FDVDsKKwkJCXNldF9iaXQoQ09OTl9TUkVKX0FDVCwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCQl9CiAJfQogfQpAQCAtMzUzOSwxNSArMzY2NSwxNSBAQAogCiAJQlRfREJHKCJjaGFuICVwLCByZXFfc2VxICVkIGN0cmwgMHglNC40eCIsIGNoYW4sIHR4X3NlcSwgcnhfY29udHJvbCk7CiAKLQljaGFuLT5jb25uX3N0YXRlIHw9IEwyQ0FQX0NPTk5fUkVNT1RFX0JVU1k7CisJc2V0X2JpdChDT05OX1JFTU9URV9CVVNZLCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJY2hhbi0+ZXhwZWN0ZWRfYWNrX3NlcSA9IHR4X3NlcTsKIAlsMmNhcF9kcm9wX2Fja2VkX2ZyYW1lcyhjaGFuKTsKIAogCWlmIChyeF9jb250cm9sICYgTDJDQVBfQ1RSTF9QT0xMKQotCQljaGFuLT5jb25uX3N0YXRlIHw9IEwyQ0FQX0NPTk5fU0VORF9GQklUOworCQlzZXRfYml0KENPTk5fU0VORF9GQklULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAKLQlpZiAoIShjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9TUkVKX1NFTlQpKSB7Ci0JCWRlbF90aW1lcigmY2hhbi0+cmV0cmFuc190aW1lcik7CisJaWYgKCF0ZXN0X2JpdChDT05OX1NSRUpfU0VOVCwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7CisJCV9fY2xlYXJfcmV0cmFuc190aW1lcihjaGFuKTsKIAkJaWYgKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX1BPTEwpCiAJCQlsMmNhcF9zZW5kX3JyX29yX3JucihjaGFuLCBMMkNBUF9DVFJMX0ZJTkFMKTsKIAkJcmV0dXJuOwpAQCAtMzU2NCwxMSArMzY5MCwxMSBAQAogCUJUX0RCRygiY2hhbiAlcCByeF9jb250cm9sIDB4JTQuNHggbGVuICVkIiwgY2hhbiwgcnhfY29udHJvbCwgc2tiLT5sZW4pOwogCiAJaWYgKEwyQ0FQX0NUUkxfRklOQUwgJiByeF9jb250cm9sICYmCi0JCQljaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9XQUlUX0YpIHsKLQkJZGVsX3RpbWVyKCZjaGFuLT5tb25pdG9yX3RpbWVyKTsKKwkJCXRlc3RfYml0KENPTk5fV0FJVF9GLCAmY2hhbi0+Y29ubl9zdGF0ZSkpIHsKKwkJX19jbGVhcl9tb25pdG9yX3RpbWVyKGNoYW4pOwogCQlpZiAoY2hhbi0+dW5hY2tlZF9mcmFtZXMgPiAwKQotCQkJX19tb2RfcmV0cmFuc190aW1lcigpOwotCQljaGFuLT5jb25uX3N0YXRlICY9IH5MMkNBUF9DT05OX1dBSVRfRjsKKwkJCV9fc2V0X3JldHJhbnNfdGltZXIoY2hhbik7CisJCWNsZWFyX2JpdChDT05OX1dBSVRfRiwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCX0KIAogCXN3aXRjaCAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfU1VQRVJWSVNFKSB7CkBAIC0zNjY3LDcgKzM3OTMsNiBAQAogewogCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuOwogCXN0cnVjdCBzb2NrICpzayA9IE5VTEw7Ci0Jc3RydWN0IGwyY2FwX3BpbmZvICpwaTsKIAl1MTYgY29udHJvbDsKIAl1OCB0eF9zZXE7CiAJaW50IGxlbjsKQEAgLTM2NzksMTEgKzM4MDQsMTAgQEAKIAl9CiAKIAlzayA9IGNoYW4tPnNrOwotCXBpID0gbDJjYXBfcGkoc2spOwogCiAJQlRfREJHKCJjaGFuICVwLCBsZW4gJWQiLCBjaGFuLCBza2ItPmxlbik7CiAKLQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKKwlpZiAoY2hhbi0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEKQogCQlnb3RvIGRyb3A7CiAKIAlzd2l0Y2ggKGNoYW4tPm1vZGUpIHsKQEAgLTM2OTYsNyArMzgyMCw3IEBACiAJCWlmIChjaGFuLT5pbXR1IDwgc2tiLT5sZW4pCiAJCQlnb3RvIGRyb3A7CiAKLQkJaWYgKCFzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYikpCisJCWlmICghY2hhbi0+b3BzLT5yZWN2KGNoYW4tPmRhdGEsIHNrYikpCiAJCQlnb3RvIGRvbmU7CiAJCWJyZWFrOwogCkBAIC0zNzY4LDEzICszODkyLDEzIEBACiAKIAlCVF9EQkcoInNrICVwLCBsZW4gJWQiLCBzaywgc2tiLT5sZW4pOwogCi0JaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9CT1VORCAmJiBzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKQorCWlmIChjaGFuLT5zdGF0ZSAhPSBCVF9CT1VORCAmJiBjaGFuLT5zdGF0ZSAhPSBCVF9DT05ORUNURUQpCiAJCWdvdG8gZHJvcDsKIAotCWlmIChsMmNhcF9waShzayktPmNoYW4tPmltdHUgPCBza2ItPmxlbikKKwlpZiAoY2hhbi0+aW10dSA8IHNrYi0+bGVuKQogCQlnb3RvIGRyb3A7CiAKLQlpZiAoIXNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKSkKKwlpZiAoIWNoYW4tPm9wcy0+cmVjdihjaGFuLT5kYXRhLCBza2IpKQogCQlnb3RvIGRvbmU7CiAKIGRyb3A6CkBAIC0zODAxLDEzICszOTI1LDEzIEBACiAKIAlCVF9EQkcoInNrICVwLCBsZW4gJWQiLCBzaywgc2tiLT5sZW4pOwogCi0JaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9CT1VORCAmJiBzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKQorCWlmIChjaGFuLT5zdGF0ZSAhPSBCVF9CT1VORCAmJiBjaGFuLT5zdGF0ZSAhPSBCVF9DT05ORUNURUQpCiAJCWdvdG8gZHJvcDsKIAotCWlmIChsMmNhcF9waShzayktPmNoYW4tPmltdHUgPCBza2ItPmxlbikKKwlpZiAoY2hhbi0+aW10dSA8IHNrYi0+bGVuKQogCQlnb3RvIGRyb3A7CiAKLQlpZiAoIXNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKSkKKwlpZiAoIWNoYW4tPm9wcy0+cmVjdihjaGFuLT5kYXRhLCBza2IpKQogCQlnb3RvIGRvbmU7CiAKIGRyb3A6CkBAIC0zODUyLDYgKzM5NzYsMTEgQEAKIAkJbDJjYXBfYXR0X2NoYW5uZWwoY29ubiwgY2lkLCBza2IpOwogCQlicmVhazsKIAorCWNhc2UgTDJDQVBfQ0lEX1NNUDoKKwkJaWYgKHNtcF9zaWdfY2hhbm5lbChjb25uLCBza2IpKQorCQkJbDJjYXBfY29ubl9kZWwoY29ubi0+aGNvbiwgRUFDQ0VTKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlsMmNhcF9kYXRhX2NoYW5uZWwoY29ubiwgY2lkLCBza2IpOwogCQlicmVhazsKQEAgLTM4NzUsNyArNDAwNCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmY2hhbl9saXN0LCBnbG9iYWxfbCkgewogCQlzdHJ1Y3Qgc29jayAqc2sgPSBjLT5zazsKIAotCQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0xJU1RFTikKKwkJaWYgKGMtPnN0YXRlICE9IEJUX0xJU1RFTikKIAkJCWNvbnRpbnVlOwogCiAJCWlmICghYmFjbXAoJmJ0X3NrKHNrKS0+c3JjLCAmaGRldi0+YmRhZGRyKSkgewpAQCAtMzkwOCw3ICs0MDM3LDcgQEAKIAkJaWYgKGNvbm4pCiAJCQlsMmNhcF9jb25uX3JlYWR5KGNvbm4pOwogCX0gZWxzZQotCQlsMmNhcF9jb25uX2RlbChoY29uLCBidF9lcnIoc3RhdHVzKSk7CisJCWwyY2FwX2Nvbm5fZGVsKGhjb24sIGJ0X3RvX2Vycm5vKHN0YXR1cykpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zOTE5LDcgKzQwNDgsNyBAQAogCiAJQlRfREJHKCJoY29uICVwIiwgaGNvbik7CiAKLQlpZiAoaGNvbi0+dHlwZSAhPSBBQ0xfTElOSyB8fCAhY29ubikKKwlpZiAoKGhjb24tPnR5cGUgIT0gQUNMX0xJTksgJiYgaGNvbi0+dHlwZSAhPSBMRV9MSU5LKSB8fCAhY29ubikKIAkJcmV0dXJuIDB4MTM7CiAKIAlyZXR1cm4gY29ubi0+ZGlzY19yZWFzb247CkBAIC0zOTMyLDI3ICs0MDYxLDI1IEBACiAJaWYgKCEoaGNvbi0+dHlwZSA9PSBBQ0xfTElOSyB8fCBoY29uLT50eXBlID09IExFX0xJTkspKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWwyY2FwX2Nvbm5fZGVsKGhjb24sIGJ0X2VycihyZWFzb24pKTsKKwlsMmNhcF9jb25uX2RlbChoY29uLCBidF90b19lcnJubyhyZWFzb24pKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfY2hlY2tfZW5jcnlwdGlvbihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTggZW5jcnlwdCkKIHsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLT5zazsKLQotCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCAmJiBzay0+c2tfdHlwZSAhPSBTT0NLX1NUUkVBTSkKKwlpZiAoY2hhbi0+Y2hhbl90eXBlICE9IEwyQ0FQX0NIQU5fQ09OTl9PUklFTlRFRCkKIAkJcmV0dXJuOwogCiAJaWYgKGVuY3J5cHQgPT0gMHgwMCkgewogCQlpZiAoY2hhbi0+c2VjX2xldmVsID09IEJUX1NFQ1VSSVRZX01FRElVTSkgewotCQkJbDJjYXBfc29ja19jbGVhcl90aW1lcihzayk7Ci0JCQlsMmNhcF9zb2NrX3NldF90aW1lcihzaywgSFogKiA1KTsKKwkJCV9fY2xlYXJfY2hhbl90aW1lcihjaGFuKTsKKwkJCV9fc2V0X2NoYW5fdGltZXIoY2hhbiwgSFogKiA1KTsKIAkJfSBlbHNlIGlmIChjaGFuLT5zZWNfbGV2ZWwgPT0gQlRfU0VDVVJJVFlfSElHSCkKLQkJCV9fbDJjYXBfc29ja19jbG9zZShzaywgRUNPTk5SRUZVU0VEKTsKKwkJCWwyY2FwX2NoYW5fY2xvc2UoY2hhbiwgRUNPTk5SRUZVU0VEKTsKIAl9IGVsc2UgewogCQlpZiAoY2hhbi0+c2VjX2xldmVsID09IEJUX1NFQ1VSSVRZX01FRElVTSkKLQkJCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQkJX19jbGVhcl9jaGFuX3RpbWVyKGNoYW4pOwogCX0KIH0KIApAQCAtMzk3Myw1MCArNDEwMCw3NCBAQAogCiAJCWJoX2xvY2tfc29jayhzayk7CiAKLQkJaWYgKGNoYW4tPmNvbmZfc3RhdGUgJiBMMkNBUF9DT05GX0NPTk5FQ1RfUEVORCkgeworCQlCVF9EQkcoImNoYW4tPnNjaWQgJWQiLCBjaGFuLT5zY2lkKTsKKworCQlpZiAoY2hhbi0+c2NpZCA9PSBMMkNBUF9DSURfTEVfREFUQSkgeworCQkJaWYgKCFzdGF0dXMgJiYgZW5jcnlwdCkgeworCQkJCWNoYW4tPnNlY19sZXZlbCA9IGhjb24tPnNlY19sZXZlbDsKKwkJCQlkZWxfdGltZXIoJmNvbm4tPnNlY3VyaXR5X3RpbWVyKTsKKwkJCQlsMmNhcF9jaGFuX3JlYWR5KHNrKTsKKwkJCQlzbXBfZGlzdHJpYnV0ZV9rZXlzKGNvbm4sIDApOworCQkJfQorCiAJCQliaF91bmxvY2tfc29jayhzayk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmICghc3RhdHVzICYmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVEVEIHx8Ci0JCQkJCQlzay0+c2tfc3RhdGUgPT0gQlRfQ09ORklHKSkgeworCQlpZiAodGVzdF9iaXQoQ09ORl9DT05ORUNUX1BFTkQsICZjaGFuLT5jb25mX3N0YXRlKSkgeworCQkJYmhfdW5sb2NrX3NvY2soc2spOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0YXR1cyAmJiAoY2hhbi0+c3RhdGUgPT0gQlRfQ09OTkVDVEVEIHx8CisJCQkJCQljaGFuLT5zdGF0ZSA9PSBCVF9DT05GSUcpKSB7CiAJCQlsMmNhcF9jaGVja19lbmNyeXB0aW9uKGNoYW4sIGVuY3J5cHQpOwogCQkJYmhfdW5sb2NrX3NvY2soc2spOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoc2stPnNrX3N0YXRlID09IEJUX0NPTk5FQ1QpIHsKKwkJaWYgKGNoYW4tPnN0YXRlID09IEJUX0NPTk5FQ1QpIHsKIAkJCWlmICghc3RhdHVzKSB7CiAJCQkJc3RydWN0IGwyY2FwX2Nvbm5fcmVxIHJlcTsKIAkJCQlyZXEuc2NpZCA9IGNwdV90b19sZTE2KGNoYW4tPnNjaWQpOwogCQkJCXJlcS5wc20gID0gY2hhbi0+cHNtOwogCiAJCQkJY2hhbi0+aWRlbnQgPSBsMmNhcF9nZXRfaWRlbnQoY29ubik7Ci0JCQkJY2hhbi0+Y29uZl9zdGF0ZSB8PSBMMkNBUF9DT05GX0NPTk5FQ1RfUEVORDsKKwkJCQlzZXRfYml0KENPTkZfQ09OTkVDVF9QRU5ELCAmY2hhbi0+Y29uZl9zdGF0ZSk7CiAKIAkJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjaGFuLT5pZGVudCwKIAkJCQkJTDJDQVBfQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKIAkJCX0gZWxzZSB7Ci0JCQkJbDJjYXBfc29ja19jbGVhcl90aW1lcihzayk7Ci0JCQkJbDJjYXBfc29ja19zZXRfdGltZXIoc2ssIEhaIC8gMTApOworCQkJCV9fY2xlYXJfY2hhbl90aW1lcihjaGFuKTsKKwkJCQlfX3NldF9jaGFuX3RpbWVyKGNoYW4sIEhaIC8gMTApOwogCQkJfQotCQl9IGVsc2UgaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DT05ORUNUMikgeworCQl9IGVsc2UgaWYgKGNoYW4tPnN0YXRlID09IEJUX0NPTk5FQ1QyKSB7CiAJCQlzdHJ1Y3QgbDJjYXBfY29ubl9yc3AgcnNwOwotCQkJX191MTYgcmVzdWx0OworCQkJX191MTYgcmVzLCBzdGF0OwogCiAJCQlpZiAoIXN0YXR1cykgewotCQkJCXNrLT5za19zdGF0ZSA9IEJUX0NPTkZJRzsKLQkJCQlyZXN1bHQgPSBMMkNBUF9DUl9TVUNDRVNTOworCQkJCWlmIChidF9zayhzayktPmRlZmVyX3NldHVwKSB7CisJCQkJCXN0cnVjdCBzb2NrICpwYXJlbnQgPSBidF9zayhzayktPnBhcmVudDsKKwkJCQkJcmVzID0gTDJDQVBfQ1JfUEVORDsKKwkJCQkJc3RhdCA9IEwyQ0FQX0NTX0FVVEhPUl9QRU5EOworCQkJCQlpZiAocGFyZW50KQorCQkJCQkJcGFyZW50LT5za19kYXRhX3JlYWR5KHBhcmVudCwgMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbDJjYXBfc3RhdGVfY2hhbmdlKGNoYW4sIEJUX0NPTkZJRyk7CisJCQkJCXJlcyA9IEwyQ0FQX0NSX1NVQ0NFU1M7CisJCQkJCXN0YXQgPSBMMkNBUF9DU19OT19JTkZPOworCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJc2stPnNrX3N0YXRlID0gQlRfRElTQ09OTjsKLQkJCQlsMmNhcF9zb2NrX3NldF90aW1lcihzaywgSFogLyAxMCk7Ci0JCQkJcmVzdWx0ID0gTDJDQVBfQ1JfU0VDX0JMT0NLOworCQkJCWwyY2FwX3N0YXRlX2NoYW5nZShjaGFuLCBCVF9ESVNDT05OKTsKKwkJCQlfX3NldF9jaGFuX3RpbWVyKGNoYW4sIEhaIC8gMTApOworCQkJCXJlcyA9IEwyQ0FQX0NSX1NFQ19CTE9DSzsKKwkJCQlzdGF0ID0gTDJDQVBfQ1NfTk9fSU5GTzsKIAkJCX0KIAogCQkJcnNwLnNjaWQgICA9IGNwdV90b19sZTE2KGNoYW4tPmRjaWQpOwogCQkJcnNwLmRjaWQgICA9IGNwdV90b19sZTE2KGNoYW4tPnNjaWQpOwotCQkJcnNwLnJlc3VsdCA9IGNwdV90b19sZTE2KHJlc3VsdCk7Ci0JCQlyc3Auc3RhdHVzID0gY3B1X3RvX2xlMTYoTDJDQVBfQ1NfTk9fSU5GTyk7CisJCQlyc3AucmVzdWx0ID0gY3B1X3RvX2xlMTYocmVzKTsKKwkJCXJzcC5zdGF0dXMgPSBjcHVfdG9fbGUxNihzdGF0KTsKIAkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNoYW4tPmlkZW50LCBMMkNBUF9DT05OX1JTUCwKIAkJCQkJCQlzaXplb2YocnNwKSwgJnJzcCk7CiAJCX0KQEAgLTQxNTIsMTAgKzQzMDMsMTAgQEAKIAkJc2VxX3ByaW50ZihmLCAiJXMgJXMgJWQgJWQgMHglNC40eCAweCU0LjR4ICVkICVkICVkICVkXG4iLAogCQkJCQliYXRvc3RyKCZidF9zayhzayktPnNyYyksCiAJCQkJCWJhdG9zdHIoJmJ0X3NrKHNrKS0+ZHN0KSwKLQkJCQkJc2stPnNrX3N0YXRlLCBfX2xlMTZfdG9fY3B1KGMtPnBzbSksCisJCQkJCWMtPnN0YXRlLCBfX2xlMTZfdG9fY3B1KGMtPnBzbSksCiAJCQkJCWMtPnNjaWQsIGMtPmRjaWQsIGMtPmltdHUsIGMtPm9tdHUsCiAJCQkJCWMtPnNlY19sZXZlbCwgYy0+bW9kZSk7Ci0JfQorfQogCiAJcmVhZF91bmxvY2tfYmgoJmNoYW5fbGlzdF9sb2NrKTsKIApAQCAtNDE5NSwxMiArNDM0Niw2IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlfYnVzeV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJsMmNhcCIpOwotCWlmICghX2J1c3lfd3EpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KIAllcnIgPSBoY2lfcmVnaXN0ZXJfcHJvdG8oJmwyY2FwX2hjaV9wcm90byk7CiAJaWYgKGVyciA8IDApIHsKIAkJQlRfRVJSKCJMMkNBUCBwcm90b2NvbCByZWdpc3RyYXRpb24gZmFpbGVkIik7CkBAIC00MjE4LDcgKzQzNjMsNiBAQAogCXJldHVybiAwOwogCiBlcnJvcjoKLQlkZXN0cm95X3dvcmtxdWV1ZShfYnVzeV93cSk7CiAJbDJjYXBfY2xlYW51cF9zb2NrZXRzKCk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTQyMjcsOSArNDM3MSw2IEBACiB7CiAJZGVidWdmc19yZW1vdmUobDJjYXBfZGVidWdmcyk7CiAKLQlmbHVzaF93b3JrcXVldWUoX2J1c3lfd3EpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKF9idXN5X3dxKTsKLQogCWlmIChoY2lfdW5yZWdpc3Rlcl9wcm90bygmbDJjYXBfaGNpX3Byb3RvKSA8IDApCiAJCUJUX0VSUigiTDJDQVAgcHJvdG9jb2wgdW5yZWdpc3RyYXRpb24gZmFpbGVkIik7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKaW5kZXggMThkYzk4OC4uNWMzNmIzZSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKQEAgLTI5LDU0ICsyOSwxMSBAQAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvbDJjYXAuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL3NtcC5oPgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBsMmNhcF9zb2NrX29wczsKLQotLyogLS0tLSBMMkNBUCB0aW1lcnMgLS0tLSAqLwotc3RhdGljIHZvaWQgbDJjYXBfc29ja190aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKSBhcmc7Ci0JaW50IHJlYXNvbjsKLQotCUJUX0RCRygic29jayAlcCBzdGF0ZSAlZCIsIHNrLCBzay0+c2tfc3RhdGUpOwotCi0JYmhfbG9ja19zb2NrKHNrKTsKLQotCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7Ci0JCS8qIHNrIGlzIG93bmVkIGJ5IHVzZXIuIFRyeSBhZ2FpbiBsYXRlciAqLwotCQlsMmNhcF9zb2NrX3NldF90aW1lcihzaywgSFogLyA1KTsKLQkJYmhfdW5sb2NrX3NvY2soc2spOwotCQlzb2NrX3B1dChzayk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoc2stPnNrX3N0YXRlID09IEJUX0NPTk5FQ1RFRCB8fCBzay0+c2tfc3RhdGUgPT0gQlRfQ09ORklHKQotCQlyZWFzb24gPSBFQ09OTlJFRlVTRUQ7Ci0JZWxzZSBpZiAoc2stPnNrX3N0YXRlID09IEJUX0NPTk5FQ1QgJiYKLQkJCWwyY2FwX3BpKHNrKS0+Y2hhbi0+c2VjX2xldmVsICE9IEJUX1NFQ1VSSVRZX1NEUCkKLQkJcmVhc29uID0gRUNPTk5SRUZVU0VEOwotCWVsc2UKLQkJcmVhc29uID0gRVRJTUVET1VUOwotCi0JX19sMmNhcF9zb2NrX2Nsb3NlKHNrLCByZWFzb24pOwotCi0JYmhfdW5sb2NrX3NvY2soc2spOwotCi0JbDJjYXBfc29ja19raWxsKHNrKTsKLQlzb2NrX3B1dChzayk7Ci19Ci0KLXZvaWQgbDJjYXBfc29ja19zZXRfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCi17Ci0JQlRfREJHKCJzayAlcCBzdGF0ZSAlZCB0aW1lb3V0ICVsZCIsIHNrLCBzay0+c2tfc3RhdGUsIHRpbWVvdXQpOwotCXNrX3Jlc2V0X3RpbWVyKHNrLCAmc2stPnNrX3RpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7Ci19Ci0KLXZvaWQgbDJjYXBfc29ja19jbGVhcl90aW1lcihzdHJ1Y3Qgc29jayAqc2spCi17Ci0JQlRfREJHKCJzb2NrICVwIHN0YXRlICVkIiwgc2ssIHNrLT5za19zdGF0ZSk7Ci0Jc2tfc3RvcF90aW1lcihzaywgJnNrLT5za190aW1lcik7Ci19CitzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX2luaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGFyZW50KTsKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqbDJjYXBfc29ja19hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90bywgZ2ZwX3QgcHJpbyk7CiAKIHN0YXRpYyBpbnQgbDJjYXBfc29ja19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFsZW4pCiB7CkBAIC0xMzMsNiArOTAsOCBAQAogCQljaGFuLT5zZWNfbGV2ZWwgPSBCVF9TRUNVUklUWV9TRFA7CiAKIAliYWNweSgmYnRfc2soc2spLT5zcmMsICZsYS5sMl9iZGFkZHIpOworCisJY2hhbi0+c3RhdGUgPSBCVF9CT1VORDsKIAlzay0+c2tfc3RhdGUgPSBCVF9CT1VORDsKIAogZG9uZToKQEAgLTE2Miw3ICsxMjEsNyBAQAogCiAJbG9ja19zb2NrKHNrKTsKIAotCWlmICgoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQgfHwgc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0pCisJaWYgKGNoYW4tPmNoYW5fdHlwZSA9PSBMMkNBUF9DSEFOX0NPTk5fT1JJRU5URUQKIAkJCSYmICEobGEubDJfcHNtIHx8IGxhLmwyX2NpZCkpIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBkb25lOwpAQCAtMjA0LDggKzE2Myw4IEBACiAJfQogCiAJLyogUFNNIG11c3QgYmUgb2RkIGFuZCBsc2Igb2YgdXBwZXIgYnl0ZSBtdXN0IGJlIDAgKi8KLQlpZiAoKF9fbGUxNl90b19jcHUobGEubDJfcHNtKSAmIDB4MDEwMSkgIT0gMHgwMDAxICYmCi0JCQkJc2stPnNrX3R5cGUgIT0gU09DS19SQVcgJiYgIWxhLmwyX2NpZCkgeworCWlmICgoX19sZTE2X3RvX2NwdShsYS5sMl9wc20pICYgMHgwMTAxKSAhPSAweDAwMDEgJiYgIWxhLmwyX2NpZCAmJgorCQkJCQljaGFuLT5jaGFuX3R5cGUgIT0gTDJDQVBfQ0hBTl9SQVcpIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBkb25lOwogCX0KQEAgLTI1OCw2ICsyMTcsOCBAQAogCiAJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CiAJc2stPnNrX2Fja19iYWNrbG9nID0gMDsKKworCWNoYW4tPnN0YXRlID0gQlRfTElTVEVOOwogCXNrLT5za19zdGF0ZSA9IEJUX0xJU1RFTjsKIAogZG9uZToKQEAgLTQxMyw2ICszNzQsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQltZW1zZXQoJmNpbmZvLCAwLCBzaXplb2YoY2luZm8pKTsKIAkJY2luZm8uaGNpX2hhbmRsZSA9IGNoYW4tPmNvbm4tPmhjb24tPmhhbmRsZTsKIAkJbWVtY3B5KGNpbmZvLmRldl9jbGFzcywgY2hhbi0+Y29ubi0+aGNvbi0+ZGV2X2NsYXNzLCAzKTsKIApAQCAtNDM2LDYgKzM5OCw3IEBACiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4gPSBsMmNhcF9waShzayktPmNoYW47CiAJc3RydWN0IGJ0X3NlY3VyaXR5IHNlYzsKKwlzdHJ1Y3QgYnRfcG93ZXIgcHdyOwogCWludCBsZW4sIGVyciA9IDA7CiAKIAlCVF9EQkcoInNrICVwIiwgc2spOwpAQCAtNDUzLDE0ICs0MTYsMTggQEAKIAogCXN3aXRjaCAob3B0bmFtZSkgewogCWNhc2UgQlRfU0VDVVJJVFk6Ci0JCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCAmJiBzay0+c2tfdHlwZSAhPSBTT0NLX1NUUkVBTQotCQkJCSYmIHNrLT5za190eXBlICE9IFNPQ0tfUkFXKSB7CisJCWlmIChjaGFuLT5jaGFuX3R5cGUgIT0gTDJDQVBfQ0hBTl9DT05OX09SSUVOVEVEICYmCisJCQkJCWNoYW4tPmNoYW5fdHlwZSAhPSBMMkNBUF9DSEFOX1JBVykgewogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9CiAKKwkJbWVtc2V0KCZzZWMsIDAsIHNpemVvZihzZWMpKTsKIAkJc2VjLmxldmVsID0gY2hhbi0+c2VjX2xldmVsOwogCisJCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQkJc2VjLmtleV9zaXplID0gY2hhbi0+Y29ubi0+aGNvbi0+ZW5jX2tleV9zaXplOworCiAJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2Yoc2VjKSk7CiAJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAoY2hhciAqKSAmc2VjLCBsZW4pKQogCQkJZXJyID0gLUVGQVVMVDsKQEAgLTQ4NCw2ICs0NTEsMjEgQEAKIAogCQlicmVhazsKIAorCWNhc2UgQlRfUE9XRVI6CisJCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCAmJiBzay0+c2tfdHlwZSAhPSBTT0NLX1NUUkVBTQorCQkJCSYmIHNrLT5za190eXBlICE9IFNPQ0tfUkFXKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlwd3IuZm9yY2VfYWN0aXZlID0gY2hhbi0+Zm9yY2VfYWN0aXZlOworCisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2YocHdyKSk7CisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAoY2hhciAqKSAmcHdyLCBsZW4pKQorCQkJZXJyID0gLUVGQVVMVDsKKworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWVyciA9IC1FTk9QUk9UT09QVDsKIAkJYnJlYWs7CkBAIC01MzQsNyArNTE2LDcgQEAKIAkJY2hhbi0+bW9kZSA9IG9wdHMubW9kZTsKIAkJc3dpdGNoIChjaGFuLT5tb2RlKSB7CiAJCWNhc2UgTDJDQVBfTU9ERV9CQVNJQzoKLQkJCWNoYW4tPmNvbmZfc3RhdGUgJj0gfkwyQ0FQX0NPTkZfU1RBVEUyX0RFVklDRTsKKwkJCWNsZWFyX2JpdChDT05GX1NUQVRFMl9ERVZJQ0UsICZjaGFuLT5jb25mX3N0YXRlKTsKIAkJCWJyZWFrOwogCQljYXNlIEwyQ0FQX01PREVfRVJUTToKIAkJY2FzZSBMMkNBUF9NT0RFX1NUUkVBTUlORzoKQEAgLTU4NCw2ICs1NjYsOCBAQAogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuID0gbDJjYXBfcGkoc2spLT5jaGFuOwogCXN0cnVjdCBidF9zZWN1cml0eSBzZWM7CisJc3RydWN0IGJ0X3Bvd2VyIHB3cjsKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubjsKIAlpbnQgbGVuLCBlcnIgPSAwOwogCXUzMiBvcHQ7CiAKQEAgLTU5OSw4ICs1ODMsOCBAQAogCiAJc3dpdGNoIChvcHRuYW1lKSB7CiAJY2FzZSBCVF9TRUNVUklUWToKLQkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfU0VRUEFDS0VUICYmIHNrLT5za190eXBlICE9IFNPQ0tfU1RSRUFNCi0JCQkJJiYgc2stPnNrX3R5cGUgIT0gU09DS19SQVcpIHsKKwkJaWYgKGNoYW4tPmNoYW5fdHlwZSAhPSBMMkNBUF9DSEFOX0NPTk5fT1JJRU5URUQgJiYKKwkJCQkJY2hhbi0+Y2hhbl90eXBlICE9IEwyQ0FQX0NIQU5fUkFXKSB7CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCX0KQEAgLTYyMCw2ICs2MDQsMjAgQEAKIAkJfQogCiAJCWNoYW4tPnNlY19sZXZlbCA9IHNlYy5sZXZlbDsKKworCQljb25uID0gY2hhbi0+Y29ubjsKKwkJaWYgKGNvbm4gJiYgY2hhbi0+c2NpZCA9PSBMMkNBUF9DSURfTEVfREFUQSkgeworCQkJaWYgKCFjb25uLT5oY29uLT5vdXQpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoc21wX2Nvbm5fc2VjdXJpdHkoY29ubiwgc2VjLmxldmVsKSkKKwkJCQlicmVhazsKKworCQkJZXJyID0gMDsKKwkJCXNrLT5za19zdGF0ZSA9IEJUX0NPTkZJRzsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQlRfREVGRVJfU0VUVVA6CkBAIC02NjAsNiArNjU4LDIzIEBACiAJCWNoYW4tPmZsdXNoYWJsZSA9IG9wdDsKIAkJYnJlYWs7CiAKKwljYXNlIEJUX1BPV0VSOgorCQlpZiAoY2hhbi0+Y2hhbl90eXBlICE9IEwyQ0FQX0NIQU5fQ09OTl9PUklFTlRFRCAmJgorCQkJCQljaGFuLT5jaGFuX3R5cGUgIT0gTDJDQVBfQ0hBTl9SQVcpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXB3ci5mb3JjZV9hY3RpdmUgPSBCVF9QT1dFUl9GT1JDRV9BQ1RJVkVfT047CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplb2YocHdyKSwgb3B0bGVuKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyICopICZwd3IsIG9wdHZhbCwgbGVuKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNoYW4tPmZvcmNlX2FjdGl2ZSA9IHB3ci5mb3JjZV9hY3RpdmU7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT1BST1RPT1BUOwogCQlicmVhazsKQEAgLTY3Myw4ICs2ODgsNiBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuID0gbDJjYXBfcGkoc2spLT5jaGFuOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTE2IGNvbnRyb2w7CiAJaW50IGVycjsKIAogCUJUX0RCRygic29jayAlcCwgc2sgJXAiLCBzb2NrLCBzayk7CkBAIC02ODksODcgKzcwMiwxMiBAQAogCWxvY2tfc29jayhzayk7CiAKIAlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkgewotCQllcnIgPSAtRU5PVENPTk47Ci0JCWdvdG8gZG9uZTsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIC1FTk9UQ09OTjsKIAl9CiAKLQkvKiBDb25uZWN0aW9ubGVzcyBjaGFubmVsICovCi0JaWYgKHNrLT5za190eXBlID09IFNPQ0tfREdSQU0pIHsKLQkJc2tiID0gbDJjYXBfY3JlYXRlX2Nvbm5sZXNzX3BkdShjaGFuLCBtc2csIGxlbik7Ci0JCWlmIChJU19FUlIoc2tiKSkgewotCQkJZXJyID0gUFRSX0VSUihza2IpOwotCQl9IGVsc2UgewotCQkJbDJjYXBfZG9fc2VuZChjaGFuLCBza2IpOwotCQkJZXJyID0gbGVuOwotCQl9Ci0JCWdvdG8gZG9uZTsKLQl9CisJZXJyID0gbDJjYXBfY2hhbl9zZW5kKGNoYW4sIG1zZywgbGVuKTsKIAotCXN3aXRjaCAoY2hhbi0+bW9kZSkgewotCWNhc2UgTDJDQVBfTU9ERV9CQVNJQzoKLQkJLyogQ2hlY2sgb3V0Z29pbmcgTVRVICovCi0JCWlmIChsZW4gPiBjaGFuLT5vbXR1KSB7Ci0JCQllcnIgPSAtRU1TR1NJWkU7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQkvKiBDcmVhdGUgYSBiYXNpYyBQRFUgKi8KLQkJc2tiID0gbDJjYXBfY3JlYXRlX2Jhc2ljX3BkdShjaGFuLCBtc2csIGxlbik7Ci0JCWlmIChJU19FUlIoc2tiKSkgewotCQkJZXJyID0gUFRSX0VSUihza2IpOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJbDJjYXBfZG9fc2VuZChjaGFuLCBza2IpOwotCQllcnIgPSBsZW47Ci0JCWJyZWFrOwotCi0JY2FzZSBMMkNBUF9NT0RFX0VSVE06Ci0JY2FzZSBMMkNBUF9NT0RFX1NUUkVBTUlORzoKLQkJLyogRW50aXJlIFNEVSBmaXRzIGludG8gb25lIFBEVSAqLwotCQlpZiAobGVuIDw9IGNoYW4tPnJlbW90ZV9tcHMpIHsKLQkJCWNvbnRyb2wgPSBMMkNBUF9TRFVfVU5TRUdNRU5URUQ7Ci0JCQlza2IgPSBsMmNhcF9jcmVhdGVfaWZyYW1lX3BkdShjaGFuLCBtc2csIGxlbiwgY29udHJvbCwKLQkJCQkJCQkJCTApOwotCQkJaWYgKElTX0VSUihza2IpKSB7Ci0JCQkJZXJyID0gUFRSX0VSUihza2IpOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJCV9fc2tiX3F1ZXVlX3RhaWwoJmNoYW4tPnR4X3EsIHNrYik7Ci0KLQkJCWlmIChjaGFuLT50eF9zZW5kX2hlYWQgPT0gTlVMTCkKLQkJCQljaGFuLT50eF9zZW5kX2hlYWQgPSBza2I7Ci0KLQkJfSBlbHNlIHsKLQkJLyogU2VnbWVudCBTRFUgaW50byBtdWx0aXBsZXMgUERVcyAqLwotCQkJZXJyID0gbDJjYXBfc2FyX3NlZ21lbnRfc2R1KGNoYW4sIG1zZywgbGVuKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWlmIChjaGFuLT5tb2RlID09IEwyQ0FQX01PREVfU1RSRUFNSU5HKSB7Ci0JCQlsMmNhcF9zdHJlYW1pbmdfc2VuZChjaGFuKTsKLQkJCWVyciA9IGxlbjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKChjaGFuLT5jb25uX3N0YXRlICYgTDJDQVBfQ09OTl9SRU1PVEVfQlVTWSkgJiYKLQkJCQkoY2hhbi0+Y29ubl9zdGF0ZSAmIEwyQ0FQX0NPTk5fV0FJVF9GKSkgewotCQkJZXJyID0gbGVuOwotCQkJYnJlYWs7Ci0JCX0KLQkJZXJyID0gbDJjYXBfZXJ0bV9zZW5kKGNoYW4pOwotCi0JCWlmIChlcnIgPj0gMCkKLQkJCWVyciA9IGxlbjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlCVF9EQkcoImJhZCBzdGF0ZSAlMS4xeCIsIGNoYW4tPm1vZGUpOwotCQllcnIgPSAtRUJBREZEOwotCX0KLQotZG9uZToKIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CiB9CkBAIC03NzcsMTMgKzcxNSwxNSBAQAogc3RhdGljIGludCBsMmNhcF9zb2NrX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgbDJjYXBfcGluZm8gKnBpID0gbDJjYXBfcGkoc2spOworCWludCBlcnI7CiAKIAlsb2NrX3NvY2soc2spOwogCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DT05ORUNUMiAmJiBidF9zayhzayktPmRlZmVyX3NldHVwKSB7CiAJCXNrLT5za19zdGF0ZSA9IEJUX0NPTkZJRzsKIAotCQlfX2wyY2FwX2Nvbm5lY3RfcnNwX2RlZmVyKGwyY2FwX3BpKHNrKS0+Y2hhbik7CisJCV9fbDJjYXBfY29ubmVjdF9yc3BfZGVmZXIocGktPmNoYW4pOwogCQlyZWxlYXNlX3NvY2soc2spOwogCQlyZXR1cm4gMDsKIAl9CkBAIC03OTEsMTUgKzczMSw0MyBAQAogCXJlbGVhc2Vfc29jayhzayk7CiAKIAlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSkKLQkJcmV0dXJuIGJ0X3NvY2tfc3RyZWFtX3JlY3Ztc2coaW9jYiwgc29jaywgbXNnLCBsZW4sIGZsYWdzKTsKKwkJZXJyID0gYnRfc29ja19zdHJlYW1fcmVjdm1zZyhpb2NiLCBzb2NrLCBtc2csIGxlbiwgZmxhZ3MpOworCWVsc2UKKwkJZXJyID0gYnRfc29ja19yZWN2bXNnKGlvY2IsIHNvY2ssIG1zZywgbGVuLCBmbGFncyk7CiAKLQlyZXR1cm4gYnRfc29ja19yZWN2bXNnKGlvY2IsIHNvY2ssIG1zZywgbGVuLCBmbGFncyk7CisJaWYgKHBpLT5jaGFuLT5tb2RlICE9IEwyQ0FQX01PREVfRVJUTSkKKwkJcmV0dXJuIGVycjsKKworCS8qIEF0dGVtcHQgdG8gcHV0IHBlbmRpbmcgcnggZGF0YSBpbiB0aGUgc29ja2V0IGJ1ZmZlciAqLworCisJbG9ja19zb2NrKHNrKTsKKworCWlmICghdGVzdF9iaXQoQ09OTl9MT0NBTF9CVVNZLCAmcGktPmNoYW4tPmNvbm5fc3RhdGUpKQorCQlnb3RvIGRvbmU7CisKKwlpZiAocGktPnJ4X2J1c3lfc2tiKSB7CisJCWlmICghc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBwaS0+cnhfYnVzeV9za2IpKQorCQkJcGktPnJ4X2J1c3lfc2tiID0gTlVMTDsKKwkJZWxzZQorCQkJZ290byBkb25lOworCX0KKworCS8qIFJlc3RvcmUgZGF0YSBmbG93IHdoZW4gaGFsZiBvZiB0aGUgcmVjZWl2ZSBidWZmZXIgaXMKKwkgKiBhdmFpbGFibGUuICBUaGlzIGF2b2lkcyByZXNlbmRpbmcgbGFyZ2UgbnVtYmVycyBvZgorCSAqIGZyYW1lcy4KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA8PSBzay0+c2tfcmN2YnVmID4+IDEpCisJCWwyY2FwX2NoYW5fYnVzeShwaS0+Y2hhbiwgMCk7CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKiBLaWxsIHNvY2tldCAob25seSBpZiB6YXBwZWQgYW5kIG9ycGhhbikKICAqIE11c3QgYmUgY2FsbGVkIG9uIHVubG9ja2VkIHNvY2tldC4KICAqLwotdm9pZCBsMmNhcF9zb2NrX2tpbGwoc3RydWN0IHNvY2sgKnNrKQorc3RhdGljIHZvaWQgbDJjYXBfc29ja19raWxsKHN0cnVjdCBzb2NrICpzaykKIHsKIAlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpIHx8IHNrLT5za19zb2NrZXQpCiAJCXJldHVybjsKQEAgLTgxMyw4NyArNzgxLDYgQEAKIAlzb2NrX3B1dChzayk7CiB9CiAKLS8qIE11c3QgYmUgY2FsbGVkIG9uIHVubG9ja2VkIHNvY2tldC4gKi8KLXN0YXRpYyB2b2lkIGwyY2FwX3NvY2tfY2xvc2Uoc3RydWN0IHNvY2sgKnNrKQotewotCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOwotCWxvY2tfc29jayhzayk7Ci0JX19sMmNhcF9zb2NrX2Nsb3NlKHNrLCBFQ09OTlJFU0VUKTsKLQlyZWxlYXNlX3NvY2soc2spOwotCWwyY2FwX3NvY2tfa2lsbChzayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGwyY2FwX3NvY2tfY2xlYW51cF9saXN0ZW4oc3RydWN0IHNvY2sgKnBhcmVudCkKLXsKLQlzdHJ1Y3Qgc29jayAqc2s7Ci0KLQlCVF9EQkcoInBhcmVudCAlcCIsIHBhcmVudCk7Ci0KLQkvKiBDbG9zZSBub3QgeWV0IGFjY2VwdGVkIGNoYW5uZWxzICovCi0Jd2hpbGUgKChzayA9IGJ0X2FjY2VwdF9kZXF1ZXVlKHBhcmVudCwgTlVMTCkpKQotCQlsMmNhcF9zb2NrX2Nsb3NlKHNrKTsKLQotCXBhcmVudC0+c2tfc3RhdGUgPSBCVF9DTE9TRUQ7Ci0Jc29ja19zZXRfZmxhZyhwYXJlbnQsIFNPQ0tfWkFQUEVEKTsKLX0KLQotdm9pZCBfX2wyY2FwX3NvY2tfY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBpbnQgcmVhc29uKQotewotCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuID0gbDJjYXBfcGkoc2spLT5jaGFuOwotCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gY2hhbi0+Y29ubjsKLQotCUJUX0RCRygic2sgJXAgc3RhdGUgJWQgc29ja2V0ICVwIiwgc2ssIHNrLT5za19zdGF0ZSwgc2stPnNrX3NvY2tldCk7Ci0KLQlzd2l0Y2ggKHNrLT5za19zdGF0ZSkgewotCWNhc2UgQlRfTElTVEVOOgotCQlsMmNhcF9zb2NrX2NsZWFudXBfbGlzdGVuKHNrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJUX0NPTk5FQ1RFRDoKLQljYXNlIEJUX0NPTkZJRzoKLQkJaWYgKChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCB8fAotCQkJCQlzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSkgJiYKLQkJCQkJY29ubi0+aGNvbi0+dHlwZSA9PSBBQ0xfTElOSykgewotCQkJbDJjYXBfc29ja19zZXRfdGltZXIoc2ssIHNrLT5za19zbmR0aW1lbyk7Ci0JCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNvbm4sIGNoYW4sIHJlYXNvbik7Ci0JCX0gZWxzZQotCQkJbDJjYXBfY2hhbl9kZWwoY2hhbiwgcmVhc29uKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJUX0NPTk5FQ1QyOgotCQlpZiAoKHNrLT5za190eXBlID09IFNPQ0tfU0VRUEFDS0VUIHx8Ci0JCQkJCXNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKSAmJgotCQkJCQljb25uLT5oY29uLT50eXBlID09IEFDTF9MSU5LKSB7Ci0JCQlzdHJ1Y3QgbDJjYXBfY29ubl9yc3AgcnNwOwotCQkJX191MTYgcmVzdWx0OwotCi0JCQlpZiAoYnRfc2soc2spLT5kZWZlcl9zZXR1cCkKLQkJCQlyZXN1bHQgPSBMMkNBUF9DUl9TRUNfQkxPQ0s7Ci0JCQllbHNlCi0JCQkJcmVzdWx0ID0gTDJDQVBfQ1JfQkFEX1BTTTsKLQotCQkJcnNwLnNjaWQgICA9IGNwdV90b19sZTE2KGNoYW4tPmRjaWQpOwotCQkJcnNwLmRjaWQgICA9IGNwdV90b19sZTE2KGNoYW4tPnNjaWQpOwotCQkJcnNwLnJlc3VsdCA9IGNwdV90b19sZTE2KHJlc3VsdCk7Ci0JCQlyc3Auc3RhdHVzID0gY3B1X3RvX2xlMTYoTDJDQVBfQ1NfTk9fSU5GTyk7Ci0JCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjaGFuLT5pZGVudCwgTDJDQVBfQ09OTl9SU1AsCi0JCQkJCQkJc2l6ZW9mKHJzcCksICZyc3ApOwotCQl9Ci0KLQkJbDJjYXBfY2hhbl9kZWwoY2hhbiwgcmVhc29uKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJUX0NPTk5FQ1Q6Ci0JY2FzZSBCVF9ESVNDT05OOgotCQlsMmNhcF9jaGFuX2RlbChjaGFuLCByZWFzb24pOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKLQkJYnJlYWs7Ci0JfQotfQotCiBzdGF0aWMgaW50IGwyY2FwX3NvY2tfc2h1dGRvd24oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGhvdykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKQEAgLTkxMSw4ICs3OTgsNyBAQAogCQkJZXJyID0gX19sMmNhcF93YWl0X2Fjayhzayk7CiAKIAkJc2stPnNrX3NodXRkb3duID0gU0hVVERPV05fTUFTSzsKLQkJbDJjYXBfc29ja19jbGVhcl90aW1lcihzayk7Ci0JCV9fbDJjYXBfc29ja19jbG9zZShzaywgMCk7CisJCWwyY2FwX2NoYW5fY2xvc2UoY2hhbiwgMCk7CiAKIAkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19MSU5HRVIpICYmIHNrLT5za19saW5nZXJ0aW1lKQogCQkJZXJyID0gYnRfc29ja193YWl0X3N0YXRlKHNrLCBCVF9DTE9TRUQsCkBAIC05NDMsMTUgKzgyOSw4NSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbDJjYXBfY2hhbiAqbDJjYXBfc29ja19uZXdfY29ubmVjdGlvbl9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCBzb2NrICpzaywgKnBhcmVudCA9IGRhdGE7CisKKwlzayA9IGwyY2FwX3NvY2tfYWxsb2Moc29ja19uZXQocGFyZW50KSwgTlVMTCwgQlRQUk9UT19MMkNBUCwKKwkJCQkJCQkJR0ZQX0FUT01JQyk7CisJaWYgKCFzaykKKwkJcmV0dXJuIE5VTEw7CisKKwlsMmNhcF9zb2NrX2luaXQoc2ssIHBhcmVudCk7CisKKwlyZXR1cm4gbDJjYXBfcGkoc2spLT5jaGFuOworfQorCitzdGF0aWMgaW50IGwyY2FwX3NvY2tfcmVjdl9jYih2b2lkICpkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBlcnI7CisJc3RydWN0IHNvY2sgKnNrID0gZGF0YTsKKwlzdHJ1Y3QgbDJjYXBfcGluZm8gKnBpID0gbDJjYXBfcGkoc2spOworCisJaWYgKHBpLT5yeF9idXN5X3NrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CisKKwkvKiBGb3IgRVJUTSwgaGFuZGxlIG9uZSBza2IgdGhhdCBkb2Vzbid0IGZpdCBpbnRvIHRoZSByZWN2CisJICogYnVmZmVyLiAgVGhpcyBpcyBpbXBvcnRhbnQgdG8gZG8gYmVjYXVzZSB0aGUgZGF0YSBmcmFtZXMKKwkgKiBoYXZlIGFscmVhZHkgYmVlbiBhY2tlZCwgc28gdGhlIHNrYiBjYW5ub3QgYmUgZGlzY2FyZGVkLgorCSAqCisJICogTm90aWZ5IHRoZSBsMmNhcCBjb3JlIHRoYXQgdGhlIGJ1ZmZlciBpcyBmdWxsLCBzbyB0aGUKKwkgKiBMT0NBTF9CVVNZIHN0YXRlIGlzIGVudGVyZWQgYW5kIG5vIG1vcmUgZnJhbWVzIGFyZQorCSAqIGFja2VkIGFuZCByZWFzc2VtYmxlZCB1bnRpbCB0aGVyZSBpcyBidWZmZXIgc3BhY2UKKwkgKiBhdmFpbGFibGUuCisJICovCisJaWYgKGVyciA8IDAgJiYgcGktPmNoYW4tPm1vZGUgPT0gTDJDQVBfTU9ERV9FUlRNKSB7CisJCXBpLT5yeF9idXN5X3NrYiA9IHNrYjsKKwkJbDJjYXBfY2hhbl9idXN5KHBpLT5jaGFuLCAxKTsKKwkJZXJyID0gMDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX2Nsb3NlX2NiKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNvY2sgKnNrID0gZGF0YTsKKworCWwyY2FwX3NvY2tfa2lsbChzayk7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3NvY2tfc3RhdGVfY2hhbmdlX2NiKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBkYXRhOworCisJc2stPnNrX3N0YXRlID0gc3RhdGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbDJjYXBfb3BzIGwyY2FwX2NoYW5fb3BzID0geworCS5uYW1lCQk9ICJMMkNBUCBTb2NrZXQgSW50ZXJmYWNlIiwKKwkubmV3X2Nvbm5lY3Rpb24JPSBsMmNhcF9zb2NrX25ld19jb25uZWN0aW9uX2NiLAorCS5yZWN2CQk9IGwyY2FwX3NvY2tfcmVjdl9jYiwKKwkuY2xvc2UJCT0gbDJjYXBfc29ja19jbG9zZV9jYiwKKwkuc3RhdGVfY2hhbmdlCT0gbDJjYXBfc29ja19zdGF0ZV9jaGFuZ2VfY2IsCit9OworCiBzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX2Rlc3RydWN0KHN0cnVjdCBzb2NrICpzaykKIHsKIAlCVF9EQkcoInNrICVwIiwgc2spOwogCisJaWYgKGwyY2FwX3BpKHNrKS0+cnhfYnVzeV9za2IpIHsKKwkJa2ZyZWVfc2tiKGwyY2FwX3BpKHNrKS0+cnhfYnVzeV9za2IpOworCQlsMmNhcF9waShzayktPnJ4X2J1c3lfc2tiID0gTlVMTDsKKwl9CisKIAlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKIAlza2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7CiB9CiAKLXZvaWQgbDJjYXBfc29ja19pbml0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnBhcmVudCkKK3N0YXRpYyB2b2lkIGwyY2FwX3NvY2tfaW5pdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrICpwYXJlbnQpCiB7CiAJc3RydWN0IGwyY2FwX3BpbmZvICpwaSA9IGwyY2FwX3BpKHNrKTsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IHBpLT5jaGFuOwpAQCAtOTY0LDYgKzkyMCw3IEBACiAJCXNrLT5za190eXBlID0gcGFyZW50LT5za190eXBlOwogCQlidF9zayhzayktPmRlZmVyX3NldHVwID0gYnRfc2socGFyZW50KS0+ZGVmZXJfc2V0dXA7CiAKKwkJY2hhbi0+Y2hhbl90eXBlID0gcGNoYW4tPmNoYW5fdHlwZTsKIAkJY2hhbi0+aW10dSA9IHBjaGFuLT5pbXR1OwogCQljaGFuLT5vbXR1ID0gcGNoYW4tPm9tdHU7CiAJCWNoYW4tPmNvbmZfc3RhdGUgPSBwY2hhbi0+Y29uZl9zdGF0ZTsKQEAgLTk3NSwxMiArOTMyLDI3IEBACiAJCWNoYW4tPnJvbGVfc3dpdGNoID0gcGNoYW4tPnJvbGVfc3dpdGNoOwogCQljaGFuLT5mb3JjZV9yZWxpYWJsZSA9IHBjaGFuLT5mb3JjZV9yZWxpYWJsZTsKIAkJY2hhbi0+Zmx1c2hhYmxlID0gcGNoYW4tPmZsdXNoYWJsZTsKKwkJY2hhbi0+Zm9yY2VfYWN0aXZlID0gcGNoYW4tPmZvcmNlX2FjdGl2ZTsKIAl9IGVsc2UgeworCisJCXN3aXRjaCAoc2stPnNrX3R5cGUpIHsKKwkJY2FzZSBTT0NLX1JBVzoKKwkJCWNoYW4tPmNoYW5fdHlwZSA9IEwyQ0FQX0NIQU5fUkFXOworCQkJYnJlYWs7CisJCWNhc2UgU09DS19ER1JBTToKKwkJCWNoYW4tPmNoYW5fdHlwZSA9IEwyQ0FQX0NIQU5fQ09OTl9MRVNTOworCQkJYnJlYWs7CisJCWNhc2UgU09DS19TRVFQQUNLRVQ6CisJCWNhc2UgU09DS19TVFJFQU06CisJCQljaGFuLT5jaGFuX3R5cGUgPSBMMkNBUF9DSEFOX0NPTk5fT1JJRU5URUQ7CisJCQlicmVhazsKKwkJfQorCiAJCWNoYW4tPmltdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKIAkJY2hhbi0+b210dSA9IDA7CiAJCWlmICghZGlzYWJsZV9lcnRtICYmIHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKSB7CiAJCQljaGFuLT5tb2RlID0gTDJDQVBfTU9ERV9FUlRNOwotCQkJY2hhbi0+Y29uZl9zdGF0ZSB8PSBMMkNBUF9DT05GX1NUQVRFMl9ERVZJQ0U7CisJCQlzZXRfYml0KENPTkZfU1RBVEUyX0RFVklDRSwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCQl9IGVsc2UgewogCQkJY2hhbi0+bW9kZSA9IEwyQ0FQX01PREVfQkFTSUM7CiAJCX0KQEAgLTk5MSwxMCArOTYzLDE1IEBACiAJCWNoYW4tPnJvbGVfc3dpdGNoID0gMDsKIAkJY2hhbi0+Zm9yY2VfcmVsaWFibGUgPSAwOwogCQljaGFuLT5mbHVzaGFibGUgPSBCVF9GTFVTSEFCTEVfT0ZGOworCQljaGFuLT5mb3JjZV9hY3RpdmUgPSBCVF9QT1dFUl9GT1JDRV9BQ1RJVkVfT047CisKIAl9CiAKIAkvKiBEZWZhdWx0IGNvbmZpZyBvcHRpb25zICovCiAJY2hhbi0+Zmx1c2hfdG8gPSBMMkNBUF9ERUZBVUxUX0ZMVVNIX1RPOworCisJY2hhbi0+ZGF0YSA9IHNrOworCWNoYW4tPm9wcyA9ICZsMmNhcF9jaGFuX29wczsKIH0KIAogc3RhdGljIHN0cnVjdCBwcm90byBsMmNhcF9wcm90byA9IHsKQEAgLTEwMDMsOSArOTgwLDEwIEBACiAJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBsMmNhcF9waW5mbykKIH07CiAKLXN0cnVjdCBzb2NrICpsMmNhcF9zb2NrX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvLCBnZnBfdCBwcmlvKQorc3RhdGljIHN0cnVjdCBzb2NrICpsMmNhcF9zb2NrX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvLCBnZnBfdCBwcmlvKQogewogCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbjsKIAogCXNrID0gc2tfYWxsb2MobmV0LCBQRl9CTFVFVE9PVEgsIHByaW8sICZsMmNhcF9wcm90byk7CiAJaWYgKCFzaykKQEAgLTEwMjIsNyArMTAwMCwxMyBAQAogCXNrLT5za19wcm90b2NvbCA9IHByb3RvOwogCXNrLT5za19zdGF0ZSA9IEJUX09QRU47CiAKLQlzZXR1cF90aW1lcigmc2stPnNrX3RpbWVyLCBsMmNhcF9zb2NrX3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKSBzayk7CisJY2hhbiA9IGwyY2FwX2NoYW5fY3JlYXRlKHNrKTsKKwlpZiAoIWNoYW4pIHsKKwkJbDJjYXBfc29ja19raWxsKHNrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbDJjYXBfcGkoc2spLT5jaGFuID0gY2hhbjsKIAogCXJldHVybiBzazsKIH0KQEAgLTEwMzEsNyArMTAxNSw2IEBACiAJCQkgICAgIGludCBrZXJuKQogewogCXN0cnVjdCBzb2NrICpzazsKLQlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbjsKIAogCUJUX0RCRygic29jayAlcCIsIHNvY2spOwogCkBAIC0xMDUwLDE0ICsxMDMzLDYgQEAKIAlpZiAoIXNrKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWNoYW4gPSBsMmNhcF9jaGFuX2NyZWF0ZShzayk7Ci0JaWYgKCFjaGFuKSB7Ci0JCWwyY2FwX3NvY2tfa2lsbChzayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWwyY2FwX3BpKHNrKS0+Y2hhbiA9IGNoYW47Ci0KIAlsMmNhcF9zb2NrX2luaXQoc2ssIE5VTEwpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9saWIuYyBiL25ldC9ibHVldG9vdGgvbGliLmMKaW5kZXggYjgyNmQxYi4uODZhNmJlZCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9saWIuYworKysgYi9uZXQvYmx1ZXRvb3RoL2xpYi5jCkBAIC01OSw3ICs1OSw3IEBACiBFWFBPUlRfU1lNQk9MKGJhdG9zdHIpOwogCiAvKiBCbHVldG9vdGggZXJyb3IgY29kZXMgdG8gVW5peCBlcnJubyBtYXBwaW5nICovCi1pbnQgYnRfZXJyKF9fdTE2IGNvZGUpCitpbnQgYnRfdG9fZXJybm8oX191MTYgY29kZSkKIHsKIAlzd2l0Y2ggKGNvZGUpIHsKIAljYXNlIDA6CkBAIC0xNDksNCArMTQ5LDIzIEBACiAJCXJldHVybiBFTk9TWVM7CiAJfQogfQotRVhQT1JUX1NZTUJPTChidF9lcnIpOworRVhQT1JUX1NZTUJPTChidF90b19lcnJubyk7CisKK2ludCBidF9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOworCXZhX2xpc3QgYXJnczsKKwlpbnQgcjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisKKwl2YWYuZm10ID0gZm9ybWF0OworCXZhZi52YSA9ICZhcmdzOworCisJciA9IHByaW50aygiJXNCbHVldG9vdGg6ICVwVlxuIiwgbGV2ZWwsICZ2YWYpOworCisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X3ByaW50ayk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL21nbXQuYyBiL25ldC9ibHVldG9vdGgvbWdtdC5jCmluZGV4IGRhZTM4MmMuLjUzZTEwOWUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbWdtdC5jCisrKyBiL25ldC9ibHVldG9vdGgvbWdtdC5jCkBAIC00MSw3ICs0MSw3IEBACiAJdm9pZCAqdXNlcl9kYXRhOwogfTsKIAotTElTVF9IRUFEKGNtZF9saXN0KTsKK3N0YXRpYyBMSVNUX0hFQUQoY21kX2xpc3QpOwogCiBzdGF0aWMgaW50IGNtZF9zdGF0dXMoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHUxNiBjbWQsIHU4IHN0YXR1cykKIHsKQEAgLTE3OSw3ICsxNzksNyBAQAogCiAJaGNpX2RlbF9vZmZfdGltZXIoaGRldik7CiAKLQloY2lfZGV2X2xvY2soaGRldik7CisJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCiAJc2V0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKTsKIApAQCAtMjA4LDcgKzIwOCw3IEBACiAKIAltZW1jcHkocnAubmFtZSwgaGRldi0+ZGV2X25hbWUsIHNpemVvZihoZGV2LT5kZXZfbmFtZSkpOwogCi0JaGNpX2Rldl91bmxvY2soaGRldik7CisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gY21kX2NvbXBsZXRlKHNrLCBpbmRleCwgTUdNVF9PUF9SRUFEX0lORk8sICZycCwgc2l6ZW9mKHJwKSk7CkBAIC0zMTYsNyArMzE2LDcgQEAKIAlpZiAoIWhkZXYpCiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfUE9XRVJFRCwgRU5PREVWKTsKIAotCWhjaV9kZXZfbG9jayhoZGV2KTsKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKIAl1cCA9IHRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKTsKIAlpZiAoKGNwLT52YWwgJiYgdXApIHx8ICghY3AtPnZhbCAmJiAhdXApKSB7CkBAIC0zNDMsNyArMzQzLDcgQEAKIAllcnIgPSAwOwogCiBmYWlsZWQ6Ci0JaGNpX2Rldl91bmxvY2soaGRldik7CisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTM2OCw3ICszNjgsNyBAQAogCWlmICghaGRldikKIAkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9ESVNDT1ZFUkFCTEUsIEVOT0RFVik7CiAKLQloY2lfZGV2X2xvY2soaGRldik7CisJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCiAJaWYgKCF0ZXN0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncykpIHsKIAkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwgRU5FVERPV04pOwpAQCAtNDAzLDcgKzQwMyw3IEBACiAJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIAogZmFpbGVkOgotCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTQyOSw3ICs0MjksNyBAQAogCWlmICghaGRldikKIAkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgRU5PREVWKTsKIAotCWhjaV9kZXZfbG9jayhoZGV2KTsKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKIAlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkgewogCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsIEVORVRET1dOKTsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCQltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiAKIGZhaWxlZDoKLQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC01MjIsNyArNTIyLDcgQEAKIAlpZiAoIWhkZXYpCiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfUEFJUkFCTEUsIEVOT0RFVik7CiAKLQloY2lfZGV2X2xvY2soaGRldik7CisJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCiAJaWYgKGNwLT52YWwpCiAJCXNldF9iaXQoSENJX1BBSVJBQkxFLCAmaGRldi0+ZmxhZ3MpOwpAQCAtNTM4LDcgKzUzOCw3IEBACiAJZXJyID0gbWdtdF9ldmVudChNR01UX0VWX1BBSVJBQkxFLCBpbmRleCwgJmV2LCBzaXplb2YoZXYpLCBzayk7CiAKIGZhaWxlZDoKLQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC03MzksNyArNzM5LDcgQEAKIAlpZiAoIWhkZXYpCiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9BRERfVVVJRCwgRU5PREVWKTsKIAotCWhjaV9kZXZfbG9jayhoZGV2KTsKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKIAl1dWlkID0ga21hbGxvYyhzaXplb2YoKnV1aWQpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXV1aWQpIHsKQEAgLTc2Myw3ICs3NjMsNyBAQAogCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfQUREX1VVSUQsIE5VTEwsIDApOwogCiBmYWlsZWQ6Ci0JaGNpX2Rldl91bmxvY2soaGRldik7CisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtNzg4LDcgKzc4OCw3IEBACiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUkVNT1ZFX1VVSUQsIEVOT0RFVik7CiAKLQloY2lfZGV2X2xvY2soaGRldik7CisJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCiAJaWYgKG1lbWNtcChjcC0+dXVpZCwgYnRfdXVpZF9hbnksIDE2KSA9PSAwKSB7CiAJCWVyciA9IGhjaV91dWlkc19jbGVhcihoZGV2KTsKQEAgLTgyMyw3ICs4MjMsNyBAQAogCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfUkVNT1ZFX1VVSUQsIE5VTEwsIDApOwogCiB1bmxvY2s6Ci0JaGNpX2Rldl91bmxvY2soaGRldik7CisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtODQ3LDcgKzg0Nyw3IEBACiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0RFVl9DTEFTUywgRU5PREVWKTsKIAotCWhjaV9kZXZfbG9jayhoZGV2KTsKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKIAloZGV2LT5tYWpvcl9jbGFzcyA9IGNwLT5tYWpvcjsKIAloZGV2LT5taW5vcl9jbGFzcyA9IGNwLT5taW5vcjsKQEAgLTg1Nyw3ICs4NTcsNyBAQAogCWlmIChlcnIgPT0gMCkKIAkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfREVWX0NMQVNTLCBOVUxMLCAwKTsKIAotCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTg3OSw3ICs4NzksNyBAQAogCWlmICghaGRldikKIAkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9TRVJWSUNFX0NBQ0hFLCBFTk9ERVYpOwogCi0JaGNpX2Rldl9sb2NrKGhkZXYpOworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKIAogCUJUX0RCRygiaGNpJXUgZW5hYmxlICVkIiwgaW5kZXgsIGNwLT5lbmFibGUpOwogCkBAIC04OTcsNyArODk3LDcgQEAKIAkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfU0VSVklDRV9DQUNIRSwgTlVMTCwKIAkJCQkJCQkJCTApOwogCi0JaGNpX2Rldl91bmxvY2soaGRldik7CisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtOTA4LDcgKzkwOCw3IEBACiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7CiAJc3RydWN0IG1nbXRfY3BfbG9hZF9rZXlzICpjcDsKIAl1MTYga2V5X2NvdW50LCBleHBlY3RlZF9sZW47Ci0JaW50IGk7CisJaW50IGksIGVycjsKIAogCWNwID0gKHZvaWQgKikgZGF0YTsKIApAQCAtOTE4LDkgKzkxOCw5IEBACiAJa2V5X2NvdW50ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZjcC0+a2V5X2NvdW50KTsKIAogCWV4cGVjdGVkX2xlbiA9IHNpemVvZigqY3ApICsga2V5X2NvdW50ICogc2l6ZW9mKHN0cnVjdCBtZ210X2tleV9pbmZvKTsKLQlpZiAoZXhwZWN0ZWRfbGVuICE9IGxlbikgewotCQlCVF9FUlIoImxvYWRfa2V5czogZXhwZWN0ZWQgJXUgYnl0ZXMsIGdvdCAldSBieXRlcyIsCi0JCQkJCQkJbGVuLCBleHBlY3RlZF9sZW4pOworCWlmIChleHBlY3RlZF9sZW4gPiBsZW4pIHsKKwkJQlRfRVJSKCJsb2FkX2tleXM6IGV4cGVjdGVkIGF0IGxlYXN0ICV1IGJ5dGVzLCBnb3QgJXUgYnl0ZXMiLAorCQkJCQkJCWV4cGVjdGVkX2xlbiwgbGVuKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC05MzEsNyArOTMxLDcgQEAKIAlCVF9EQkcoImhjaSV1IGRlYnVnX2tleXMgJXUga2V5X2NvdW50ICV1IiwgaW5kZXgsIGNwLT5kZWJ1Z19rZXlzLAogCQkJCQkJCQlrZXlfY291bnQpOwogCi0JaGNpX2Rldl9sb2NrKGhkZXYpOworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKIAogCWhjaV9saW5rX2tleXNfY2xlYXIoaGRldik7CiAKQEAgLTk0MiwxNyArOTQyLDM2IEBACiAJZWxzZQogCQljbGVhcl9iaXQoSENJX0RFQlVHX0tFWVMsICZoZGV2LT5mbGFncyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwga2V5X2NvdW50OyBpKyspIHsKLQkJc3RydWN0IG1nbXRfa2V5X2luZm8gKmtleSA9ICZjcC0+a2V5c1tpXTsKKwlsZW4gLT0gc2l6ZW9mKCpjcCk7CisJaSA9IDA7CisKKwl3aGlsZSAoaSA8IGxlbikgeworCQlzdHJ1Y3QgbWdtdF9rZXlfaW5mbyAqa2V5ID0gKHZvaWQgKikgY3AtPmtleXMgKyBpOworCisJCWkgKz0gc2l6ZW9mKCprZXkpICsga2V5LT5kbGVuOworCisJCWlmIChrZXktPnR5cGUgPT0gSENJX0xLX1NNUF9MVEspIHsKKwkJCXN0cnVjdCBrZXlfbWFzdGVyX2lkICppZCA9ICh2b2lkICopIGtleS0+ZGF0YTsKKworCQkJaWYgKGtleS0+ZGxlbiAhPSBzaXplb2Yoc3RydWN0IGtleV9tYXN0ZXJfaWQpKQorCQkJCWNvbnRpbnVlOworCisJCQloY2lfYWRkX2x0ayhoZGV2LCAwLCAma2V5LT5iZGFkZHIsIGtleS0+cGluX2xlbiwKKwkJCQkJCWlkLT5lZGl2LCBpZC0+cmFuZCwga2V5LT52YWwpOworCisJCQljb250aW51ZTsKKwkJfQogCiAJCWhjaV9hZGRfbGlua19rZXkoaGRldiwgTlVMTCwgMCwgJmtleS0+YmRhZGRyLCBrZXktPnZhbCwga2V5LT50eXBlLAogCQkJCQkJCQlrZXktPnBpbl9sZW4pOwogCX0KIAotCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfTE9BRF9LRVlTLCBOVUxMLCAwKTsKKworCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCByZW1vdmVfa2V5KHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1MTYgbGVuKQpAQCAtOTcxLDcgKzk5MCw3IEBACiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUkVNT1ZFX0tFWSwgRU5PREVWKTsKIAotCWhjaV9kZXZfbG9jayhoZGV2KTsKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKIAllcnIgPSBoY2lfcmVtb3ZlX2xpbmtfa2V5KGhkZXYsICZjcC0+YmRhZGRyKTsKIAlpZiAoZXJyIDwgMCkgewpAQCAtOTkwLDExICsxMDA5LDExIEBACiAKIAkJcHV0X3VuYWxpZ25lZF9sZTE2KGNvbm4tPmhhbmRsZSwgJmRjLmhhbmRsZSk7CiAJCWRjLnJlYXNvbiA9IDB4MTM7IC8qIFJlbW90ZSBVc2VyIFRlcm1pbmF0ZWQgQ29ubmVjdGlvbiAqLwotCQllcnIgPSBoY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX0RJU0NPTk5FQ1QsIDAsIE5VTEwpOworCQllcnIgPSBoY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX0RJU0NPTk5FQ1QsIHNpemVvZihkYyksICZkYyk7CiAJfQogCiB1bmxvY2s6Ci0JaGNpX2Rldl91bmxvY2soaGRldik7CisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTAyMCw3ICsxMDM5LDcgQEAKIAlpZiAoIWhkZXYpCiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9ESVNDT05ORUNULCBFTk9ERVYpOwogCi0JaGNpX2Rldl9sb2NrKGhkZXYpOworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKIAogCWlmICghdGVzdF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpKSB7CiAJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0RJU0NPTk5FQ1QsIEVORVRET1dOKTsKQEAgLTEwNTUsNyArMTA3NCw3IEBACiAJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIAogZmFpbGVkOgotCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTEwNzYsNyArMTA5NSw3IEBACiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfR0VUX0NPTk5FQ1RJT05TLCBFTk9ERVYpOwogCi0JaGNpX2Rldl9sb2NrKGhkZXYpOworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKIAogCWNvdW50ID0gMDsKIAlsaXN0X2Zvcl9lYWNoKHAsICZoZGV2LT5jb25uX2hhc2gubGlzdCkgewpAQCAtMTA5Miw4ICsxMTExLDYgQEAKIAogCXB1dF91bmFsaWduZWRfbGUxNihjb3VudCwgJnJwLT5jb25uX2NvdW50KTsKIAotCXJlYWRfbG9jaygmaGNpX2Rldl9saXN0X2xvY2spOwotCiAJaSA9IDA7CiAJbGlzdF9mb3JfZWFjaChwLCAmaGRldi0+Y29ubl9oYXNoLmxpc3QpIHsKIAkJc3RydWN0IGhjaV9jb25uICpjID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOwpAQCAtMTEwMSwyMiArMTExOCw0MSBAQAogCQliYWNweSgmcnAtPmNvbm5baSsrXSwgJmMtPmRzdCk7CiAJfQogCi0JcmVhZF91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKLQogCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfR0VUX0NPTk5FQ1RJT05TLCBycCwgcnBfbGVuKTsKIAogdW5sb2NrOgogCWtmcmVlKHJwKTsKLQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IHNlbmRfcGluX2NvZGVfbmVnX3JlcGx5KHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LAorCQlzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IG1nbXRfY3BfcGluX2NvZGVfbmVnX3JlcGx5ICpjcCkKK3sKKwlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlpbnQgZXJyOworCisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9QSU5fQ09ERV9ORUdfUkVQTFksIGluZGV4LCBjcCwKKwkJCQkJCQkJc2l6ZW9mKCpjcCkpOworCWlmICghY21kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IGhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfUElOX0NPREVfTkVHX1JFUExZLCBzaXplb2YoY3AtPmJkYWRkciksCisJCQkJCQkJCSZjcC0+YmRhZGRyKTsKKwlpZiAoZXJyIDwgMCkKKwkJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBwaW5fY29kZV9yZXBseShzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdW5zaWduZWQgY2hhciAqZGF0YSwKIAkJCQkJCQkJCXUxNiBsZW4pCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJc3RydWN0IGhjaV9jb25uICpjb25uOwogCXN0cnVjdCBtZ210X2NwX3Bpbl9jb2RlX3JlcGx5ICpjcDsKKwlzdHJ1Y3QgbWdtdF9jcF9waW5fY29kZV9uZWdfcmVwbHkgbmNwOwogCXN0cnVjdCBoY2lfY3BfcGluX2NvZGVfcmVwbHkgcmVwbHk7CiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJaW50IGVycjsKQEAgLTExMzIsMTMgKzExNjgsMzIgQEAKIAlpZiAoIWhkZXYpCiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9QSU5fQ09ERV9SRVBMWSwgRU5PREVWKTsKIAotCWhjaV9kZXZfbG9jayhoZGV2KTsKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKIAlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkgewogCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9QSU5fQ09ERV9SRVBMWSwgRU5FVERPV04pOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgQUNMX0xJTkssICZjcC0+YmRhZGRyKTsKKwlpZiAoIWNvbm4pIHsKKwkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUElOX0NPREVfUkVQTFksIEVOT1RDT05OKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKGNvbm4tPnBlbmRpbmdfc2VjX2xldmVsID09IEJUX1NFQ1VSSVRZX0hJR0ggJiYgY3AtPnBpbl9sZW4gIT0gMTYpIHsKKwkJYmFjcHkoJm5jcC5iZGFkZHIsICZjcC0+YmRhZGRyKTsKKworCQlCVF9FUlIoIlBJTiBjb2RlIGlzIG5vdCAxNiBieXRlcyBsb25nIik7CisKKwkJZXJyID0gc2VuZF9waW5fY29kZV9uZWdfcmVwbHkoc2ssIGluZGV4LCBoZGV2LCAmbmNwKTsKKwkJaWYgKGVyciA+PSAwKQorCQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUElOX0NPREVfUkVQTFksCisJCQkJCQkJCUVJTlZBTCk7CisKKwkJZ290byBmYWlsZWQ7CisJfQorCiAJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9QSU5fQ09ERV9SRVBMWSwgaW5kZXgsIGRhdGEsIGxlbik7CiAJaWYgKCFjbWQpIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTExNDcsMTQgKzEyMDIsMTQgQEAKIAogCWJhY3B5KCZyZXBseS5iZGFkZHIsICZjcC0+YmRhZGRyKTsKIAlyZXBseS5waW5fbGVuID0gY3AtPnBpbl9sZW47Ci0JbWVtY3B5KHJlcGx5LnBpbl9jb2RlLCBjcC0+cGluX2NvZGUsIDE2KTsKKwltZW1jcHkocmVwbHkucGluX2NvZGUsIGNwLT5waW5fY29kZSwgc2l6ZW9mKHJlcGx5LnBpbl9jb2RlKSk7CiAKIAllcnIgPSBoY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1BJTl9DT0RFX1JFUExZLCBzaXplb2YocmVwbHkpLCAmcmVwbHkpOwogCWlmIChlcnIgPCAwKQogCQltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiAKIGZhaWxlZDoKLQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC0xMTY1LDcgKzEyMjAsNiBAQAogewogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OwogCXN0cnVjdCBtZ210X2NwX3Bpbl9jb2RlX25lZ19yZXBseSAqY3A7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJaW50IGVycjsKIAogCUJUX0RCRygiIik7CkBAIC0xMTgxLDcgKzEyMzUsNyBAQAogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUElOX0NPREVfTkVHX1JFUExZLAogCQkJCQkJCQkJRU5PREVWKTsKIAotCWhjaV9kZXZfbG9jayhoZGV2KTsKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKIAlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkgewogCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9QSU5fQ09ERV9ORUdfUkVQTFksCkBAIC0xMTg5LDIwICsxMjQzLDEwIEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfUElOX0NPREVfTkVHX1JFUExZLCBpbmRleCwKLQkJCQkJCQkJZGF0YSwgbGVuKTsKLQlpZiAoIWNtZCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQllcnIgPSBoY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1BJTl9DT0RFX05FR19SRVBMWSwgc2l6ZW9mKGNwLT5iZGFkZHIpLAotCQkJCQkJCQkmY3AtPmJkYWRkcik7Ci0JaWYgKGVyciA8IDApCi0JCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKKwllcnIgPSBzZW5kX3Bpbl9jb2RlX25lZ19yZXBseShzaywgaW5kZXgsIGhkZXYsIGNwKTsKIAogZmFpbGVkOgotCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTEyMjUsMTQgKzEyNjksMTQgQEAKIAlpZiAoIWhkZXYpCiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfSU9fQ0FQQUJJTElUWSwgRU5PREVWKTsKIAotCWhjaV9kZXZfbG9jayhoZGV2KTsKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKIAloZGV2LT5pb19jYXBhYmlsaXR5ID0gY3AtPmlvX2NhcGFiaWxpdHk7CiAKIAlCVF9EQkcoIiVzIElPIGNhcGFiaWxpdHkgc2V0IHRvIDB4JTAyeCIsIGhkZXYtPm5hbWUsCiAJCQkJCQkJaGRldi0+aW9fY2FwYWJpbGl0eSk7CiAKLQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBjbWRfY29tcGxldGUoc2ssIGluZGV4LCBNR01UX09QX1NFVF9JT19DQVBBQklMSVRZLCBOVUxMLCAwKTsKQEAgLTEzMTgsNyArMTM2Miw3IEBACiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUEFJUl9ERVZJQ0UsIEVOT0RFVik7CiAKLQloY2lfZGV2X2xvY2soaGRldik7CisJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCiAJaWYgKGNwLT5pb19jYXAgPT0gMHgwMykgewogCQlzZWNfbGV2ZWwgPSBCVF9TRUNVUklUWV9NRURJVU07CkBAIC0xMzYwLDcgKzE0MDQsNyBAQAogCWVyciA9IDA7CiAKIHVubG9jazoKLQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC0xMzkyLDcgKzE0MzYsNyBAQAogCWlmICghaGRldikKIAkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBtZ210X29wLCBFTk9ERVYpOwogCi0JaGNpX2Rldl9sb2NrKGhkZXYpOworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKIAogCWlmICghdGVzdF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpKSB7CiAJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBtZ210X29wLCBFTkVURE9XTik7CkBAIC0xNDEwLDcgKzE0NTQsNyBAQAogCQltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiAKIGZhaWxlZDoKLQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC0xNDM0LDcgKzE0NzgsNyBAQAogCWlmICghaGRldikKIAkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLCBFTk9ERVYpOwogCi0JaGNpX2Rldl9sb2NrKGhkZXYpOworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKIAogCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsIGluZGV4LCBkYXRhLCBsZW4pOwogCWlmICghY21kKSB7CkBAIC0xNDQ5LDcgKzE0OTMsNyBAQAogCQltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiAKIGZhaWxlZDoKLQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC0xNDY4LDcgKzE1MTIsNyBAQAogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUkVBRF9MT0NBTF9PT0JfREFUQSwKIAkJCQkJCQkJCUVOT0RFVik7CiAKLQloY2lfZGV2X2xvY2soaGRldik7CisJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCiAJaWYgKCF0ZXN0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncykpIHsKIAkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUkVBRF9MT0NBTF9PT0JfREFUQSwKQEAgLTE0OTgsNyArMTU0Miw3IEBACiAJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIAogdW5sb2NrOgotCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTE1MjIsNyArMTU2Niw3IEBACiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9BRERfUkVNT1RFX09PQl9EQVRBLAogCQkJCQkJCQkJRU5PREVWKTsKIAotCWhjaV9kZXZfbG9jayhoZGV2KTsKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKIAllcnIgPSBoY2lfYWRkX3JlbW90ZV9vb2JfZGF0YShoZGV2LCAmY3AtPmJkYWRkciwgY3AtPmhhc2gsCiAJCQkJCQkJCWNwLT5yYW5kb21pemVyKTsKQEAgLTE1MzIsNyArMTU3Niw3IEBACiAJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfQUREX1JFTU9URV9PT0JfREFUQSwgTlVMTCwKIAkJCQkJCQkJCTApOwogCi0JaGNpX2Rldl91bmxvY2soaGRldik7CisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTU1Niw3ICsxNjAwLDcgQEAKIAkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1JFTU9WRV9SRU1PVEVfT09CX0RBVEEsCiAJCQkJCQkJCQlFTk9ERVYpOwogCi0JaGNpX2Rldl9sb2NrKGhkZXYpOworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKIAogCWVyciA9IGhjaV9yZW1vdmVfcmVtb3RlX29vYl9kYXRhKGhkZXYsICZjcC0+YmRhZGRyKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTE1NjYsNyArMTYxMCw3IEBACiAJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfUkVNT1ZFX1JFTU9URV9PT0JfREFUQSwKIAkJCQkJCQkJTlVMTCwgMCk7CiAKLQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC0xNjQxLDYgKzE2ODUsNzAgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IGJsb2NrX2RldmljZShzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCQkJCQkJdTE2IGxlbikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlzdHJ1Y3QgbWdtdF9jcF9ibG9ja19kZXZpY2UgKmNwOworCWludCBlcnI7CisKKwlCVF9EQkcoImhjaSV1IiwgaW5kZXgpOworCisJY3AgPSAodm9pZCAqKSBkYXRhOworCisJaWYgKGxlbiAhPSBzaXplb2YoKmNwKSkKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0JMT0NLX0RFVklDRSwKKwkJCQkJCQlFSU5WQUwpOworCisJaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKKwlpZiAoIWhkZXYpCisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9CTE9DS19ERVZJQ0UsCisJCQkJCQkJRU5PREVWKTsKKworCWVyciA9IGhjaV9ibGFja2xpc3RfYWRkKGhkZXYsICZjcC0+YmRhZGRyKTsKKworCWlmIChlcnIgPCAwKQorCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9CTE9DS19ERVZJQ0UsIC1lcnIpOworCWVsc2UKKwkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBpbmRleCwgTUdNVF9PUF9CTE9DS19ERVZJQ0UsCisJCQkJCQkJTlVMTCwgMCk7CisJaGNpX2Rldl9wdXQoaGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVuYmxvY2tfZGV2aWNlKHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJCQkJCQl1MTYgbGVuKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCXN0cnVjdCBtZ210X2NwX3VuYmxvY2tfZGV2aWNlICpjcDsKKwlpbnQgZXJyOworCisJQlRfREJHKCJoY2kldSIsIGluZGV4KTsKKworCWNwID0gKHZvaWQgKikgZGF0YTsKKworCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9VTkJMT0NLX0RFVklDRSwKKwkJCQkJCQkJRUlOVkFMKTsKKworCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CisJaWYgKCFoZGV2KQorCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfVU5CTE9DS19ERVZJQ0UsCisJCQkJCQkJCUVOT0RFVik7CisKKwllcnIgPSBoY2lfYmxhY2tsaXN0X2RlbChoZGV2LCAmY3AtPmJkYWRkcik7CisKKwlpZiAoZXJyIDwgMCkKKwkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfVU5CTE9DS19ERVZJQ0UsIC1lcnIpOworCWVsc2UKKwkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBpbmRleCwgTUdNVF9PUF9VTkJMT0NLX0RFVklDRSwKKwkJCQkJCQkJTlVMTCwgMCk7CisJaGNpX2Rldl9wdXQoaGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCiBpbnQgbWdtdF9jb250cm9sKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbXNnbGVuKQogewogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKQEAgLTE3NTUsNiArMTg2MywxMiBAQAogCWNhc2UgTUdNVF9PUF9TVE9QX0RJU0NPVkVSWToKIAkJZXJyID0gc3RvcF9kaXNjb3Zlcnkoc2ssIGluZGV4KTsKIAkJYnJlYWs7CisJY2FzZSBNR01UX09QX0JMT0NLX0RFVklDRToKKwkJZXJyID0gYmxvY2tfZGV2aWNlKHNrLCBpbmRleCwgYnVmICsgc2l6ZW9mKCpoZHIpLCBsZW4pOworCQlicmVhazsKKwljYXNlIE1HTVRfT1BfVU5CTE9DS19ERVZJQ0U6CisJCWVyciA9IHVuYmxvY2tfZGV2aWNlKHNrLCBpbmRleCwgYnVmICsgc2l6ZW9mKCpoZHIpLCBsZW4pOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVF9EQkcoIlVua25vd24gb3AgJXUiLCBvcGNvZGUpOwogCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgb3Bjb2RlLCAweDAxKTsKQEAgLTE4NjMsMTcgKzE5NzcsMjggQEAKIAogaW50IG1nbXRfbmV3X2tleSh1MTYgaW5kZXgsIHN0cnVjdCBsaW5rX2tleSAqa2V5LCB1OCBwZXJzaXN0ZW50KQogewotCXN0cnVjdCBtZ210X2V2X25ld19rZXkgZXY7CisJc3RydWN0IG1nbXRfZXZfbmV3X2tleSAqZXY7CisJaW50IGVyciwgdG90YWw7CiAKLQltZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKKwl0b3RhbCA9IHNpemVvZihzdHJ1Y3QgbWdtdF9ldl9uZXdfa2V5KSArIGtleS0+ZGxlbjsKKwlldiA9IGt6YWxsb2ModG90YWwsIEdGUF9BVE9NSUMpOworCWlmICghZXYpCisJCXJldHVybiAtRU5PTUVNOwogCi0JZXYuc3RvcmVfaGludCA9IHBlcnNpc3RlbnQ7Ci0JYmFjcHkoJmV2LmtleS5iZGFkZHIsICZrZXktPmJkYWRkcik7Ci0JZXYua2V5LnR5cGUgPSBrZXktPnR5cGU7Ci0JbWVtY3B5KGV2LmtleS52YWwsIGtleS0+dmFsLCAxNik7Ci0JZXYua2V5LnBpbl9sZW4gPSBrZXktPnBpbl9sZW47CisJYmFjcHkoJmV2LT5rZXkuYmRhZGRyLCAma2V5LT5iZGFkZHIpOworCWV2LT5rZXkudHlwZSA9IGtleS0+dHlwZTsKKwltZW1jcHkoZXYtPmtleS52YWwsIGtleS0+dmFsLCAxNik7CisJZXYtPmtleS5waW5fbGVuID0ga2V5LT5waW5fbGVuOworCWV2LT5rZXkuZGxlbiA9IGtleS0+ZGxlbjsKKwlldi0+c3RvcmVfaGludCA9IHBlcnNpc3RlbnQ7CiAKLQlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX05FV19LRVksIGluZGV4LCAmZXYsIHNpemVvZihldiksIE5VTEwpOworCW1lbWNweShldi0+a2V5LmRhdGEsIGtleS0+ZGF0YSwga2V5LT5kbGVuKTsKKworCWVyciA9IG1nbXRfZXZlbnQoTUdNVF9FVl9ORVdfS0VZLCBpbmRleCwgZXYsIHRvdGFsLCBOVUxMKTsKKworCWtmcmVlKGV2KTsKKworCXJldHVybiBlcnI7CiB9CiAKIGludCBtZ210X2Nvbm5lY3RlZCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIpCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKaW5kZXggMzg2Y2ZhZi4uOGYwMWU2YiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYwpAQCAtNjc5LDcgKzY3OSw4IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGJ0X3NlY3VyaXR5IHNlYzsKLQlpbnQgbGVuLCBlcnIgPSAwOworCWludCBlcnIgPSAwOworCXNpemVfdCBsZW47CiAJdTMyIG9wdDsKIAogCUJUX0RCRygic2sgJXAiLCBzayk7CkBAIC03NDEsNyArNzQyLDYgQEAKIHN0YXRpYyBpbnQgcmZjb21tX3NvY2tfZ2V0c29ja29wdF9vbGQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKLQlzdHJ1Y3Qgc29jayAqbDJjYXBfc2s7CiAJc3RydWN0IHJmY29tbV9jb25uaW5mbyBjaW5mbzsKIAlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IGwyY2FwX3BpKHNrKS0+Y2hhbi0+Y29ubjsKIAlpbnQgbGVuLCBlcnIgPSAwOwpAQCAtNzg2LDggKzc4Niw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWwyY2FwX3NrID0gcmZjb21tX3BpKHNrKS0+ZGxjLT5zZXNzaW9uLT5zb2NrLT5zazsKLQorCQltZW1zZXQoJmNpbmZvLCAwLCBzaXplb2YoY2luZm8pKTsKIAkJY2luZm8uaGNpX2hhbmRsZSA9IGNvbm4tPmhjb24tPmhhbmRsZTsKIAkJbWVtY3B5KGNpbmZvLmRldl9jbGFzcywgY29ubi0+aGNvbi0+ZGV2X2NsYXNzLCAzKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9zY28uYyBiL25ldC9ibHVldG9vdGgvc2NvLmMKaW5kZXggNDJmZGZmZC4uNGMzNjIxYiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9zY28uYworKysgYi9uZXQvYmx1ZXRvb3RoL3Njby5jCkBAIC0zNjksNiArMzY5LDE1IEBACiAKIAljYXNlIEJUX0NPTk5FQ1RFRDoKIAljYXNlIEJUX0NPTkZJRzoKKwkJaWYgKHNjb19waShzayktPmNvbm4pIHsKKwkJCXNrLT5za19zdGF0ZSA9IEJUX0RJU0NPTk47CisJCQlzY29fc29ja19zZXRfdGltZXIoc2ssIFNDT19ESVNDT05OX1RJTUVPVVQpOworCQkJaGNpX2Nvbm5fcHV0KHNjb19waShzayktPmNvbm4tPmhjb24pOworCQkJc2NvX3BpKHNrKS0+Y29ubi0+aGNvbiA9IE5VTEw7CisJCX0gZWxzZQorCQkJc2NvX2NoYW5fZGVsKHNrLCBFQ09OTlJFU0VUKTsKKwkJYnJlYWs7CisKIAljYXNlIEJUX0NPTk5FQ1Q6CiAJY2FzZSBCVF9ESVNDT05OOgogCQlzY29fY2hhbl9kZWwoc2ssIEVDT05OUkVTRVQpOwpAQCAtODE5LDcgKzgyOCw5IEBACiAJCWNvbm4tPnNrID0gTlVMTDsKIAkJc2NvX3BpKHNrKS0+Y29ubiA9IE5VTEw7CiAJCXNjb19jb25uX3VubG9jayhjb25uKTsKLQkJaGNpX2Nvbm5fcHV0KGNvbm4tPmhjb24pOworCisJCWlmIChjb25uLT5oY29uKQorCQkJaGNpX2Nvbm5fcHV0KGNvbm4tPmhjb24pOwogCX0KIAogCXNrLT5za19zdGF0ZSA9IEJUX0NMT1NFRDsKQEAgLTkyMSw3ICs5MzIsNyBAQAogCQlpZiAoY29ubikKIAkJCXNjb19jb25uX3JlYWR5KGNvbm4pOwogCX0gZWxzZQotCQlzY29fY29ubl9kZWwoaGNvbiwgYnRfZXJyKHN0YXR1cykpOworCQlzY29fY29ubl9kZWwoaGNvbiwgYnRfdG9fZXJybm8oc3RhdHVzKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkzMyw3ICs5NDQsNyBAQAogCWlmIChoY29uLT50eXBlICE9IFNDT19MSU5LICYmIGhjb24tPnR5cGUgIT0gRVNDT19MSU5LKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNjb19jb25uX2RlbChoY29uLCBidF9lcnIocmVhc29uKSk7CisJc2NvX2Nvbm5fZGVsKGhjb24sIGJ0X3RvX2Vycm5vKHJlYXNvbikpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3NtcC5jIGIvbmV0L2JsdWV0b290aC9zbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTE4ODhiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9zbXAuYwpAQCAtMCwwICsxLDcwMiBAQAorLyoKKyAgIEJsdWVaIC0gQmx1ZXRvb3RoIHByb3RvY29sIHN0YWNrIGZvciBMaW51eAorICAgQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUworICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvbDJjYXAuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8Y3J5cHRvL2IxMjhvcHMuaD4KKworI2RlZmluZSBTTVBfVElNRU9VVCAzMDAwMCAvKiAzMCBzZWNvbmRzICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2FwMTI4KHU4IHNyY1sxNl0sIHU4IGRzdFsxNl0pCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCWRzdFsxNSAtIGldID0gc3JjW2ldOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3dhcDU2KHU4IHNyY1s3XSwgdTggZHN0WzddKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJCWRzdFs2IC0gaV0gPSBzcmNbaV07Cit9CisKK3N0YXRpYyBpbnQgc21wX2Uoc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSwgY29uc3QgdTggKmssIHU4ICpyKQoreworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlpbnQgZXJyLCBpdl9sZW47CisJdW5zaWduZWQgY2hhciBpdlsxMjhdOworCisJaWYgKHRmbSA9PSBOVUxMKSB7CisJCUJUX0VSUigidGZtICVwIiwgdGZtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGVzYy50Zm0gPSB0Zm07CisJZGVzYy5mbGFncyA9IDA7CisKKwllcnIgPSBjcnlwdG9fYmxrY2lwaGVyX3NldGtleSh0Zm0sIGssIDE2KTsKKwlpZiAoZXJyKSB7CisJCUJUX0VSUigiY2lwaGVyIHNldGtleSBmYWlsZWQ6ICVkIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzZ19pbml0X29uZSgmc2csIHIsIDE2KTsKKworCWl2X2xlbiA9IGNyeXB0b19ibGtjaXBoZXJfaXZzaXplKHRmbSk7CisJaWYgKGl2X2xlbikgeworCQltZW1zZXQoJml2LCAweGZmLCBpdl9sZW4pOworCQljcnlwdG9fYmxrY2lwaGVyX3NldF9pdih0Zm0sIGl2LCBpdl9sZW4pOworCX0KKworCWVyciA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIDE2KTsKKwlpZiAoZXJyKQorCQlCVF9FUlIoIkVuY3J5cHQgZGF0YSBlcnJvciAlZCIsIGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNtcF9jMShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLCB1OCBrWzE2XSwgdTggclsxNl0sCisJCXU4IHByZXFbN10sIHU4IHByZXNbN10sIHU4IF9pYXQsIGJkYWRkcl90ICppYSwKKwkJdTggX3JhdCwgYmRhZGRyX3QgKnJhLCB1OCByZXNbMTZdKQoreworCXU4IHAxWzE2XSwgcDJbMTZdOworCWludCBlcnI7CisKKwltZW1zZXQocDEsIDAsIDE2KTsKKworCS8qIHAxID0gcHJlcyB8fCBwcmVxIHx8IF9yYXQgfHwgX2lhdCAqLworCXN3YXA1NihwcmVzLCBwMSk7CisJc3dhcDU2KHByZXEsIHAxICsgNyk7CisJcDFbMTRdID0gX3JhdDsKKwlwMVsxNV0gPSBfaWF0OworCisJbWVtc2V0KHAyLCAwLCAxNik7CisKKwkvKiBwMiA9IHBhZGRpbmcgfHwgaWEgfHwgcmEgKi8KKwliYXN3YXAoKGJkYWRkcl90ICopIChwMiArIDQpLCBpYSk7CisJYmFzd2FwKChiZGFkZHJfdCAqKSAocDIgKyAxMCksIHJhKTsKKworCS8qIHJlcyA9IHIgWE9SIHAxICovCisJdTEyOF94b3IoKHUxMjggKikgcmVzLCAodTEyOCAqKSByLCAodTEyOCAqKSBwMSk7CisKKwkvKiByZXMgPSBlKGssIHJlcykgKi8KKwllcnIgPSBzbXBfZSh0Zm0sIGssIHJlcyk7CisJaWYgKGVycikgeworCQlCVF9FUlIoIkVuY3J5cHQgZGF0YSBlcnJvciIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIHJlcyA9IHJlcyBYT1IgcDIgKi8KKwl1MTI4X3hvcigodTEyOCAqKSByZXMsICh1MTI4ICopIHJlcywgKHUxMjggKikgcDIpOworCisJLyogcmVzID0gZShrLCByZXMpICovCisJZXJyID0gc21wX2UodGZtLCBrLCByZXMpOworCWlmIChlcnIpCisJCUJUX0VSUigiRW5jcnlwdCBkYXRhIGVycm9yIik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNtcF9zMShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLCB1OCBrWzE2XSwKKwkJCXU4IHIxWzE2XSwgdTggcjJbMTZdLCB1OCBfclsxNl0pCit7CisJaW50IGVycjsKKworCS8qIEp1c3QgbGVhc3Qgc2lnbmlmaWNhbnQgb2N0ZXRzIGZyb20gcjEgYW5kIHIyIGFyZSBjb25zaWRlcmVkICovCisJbWVtY3B5KF9yLCByMSArIDgsIDgpOworCW1lbWNweShfciArIDgsIHIyICsgOCwgOCk7CisKKwllcnIgPSBzbXBfZSh0Zm0sIGssIF9yKTsKKwlpZiAoZXJyKQorCQlCVF9FUlIoIkVuY3J5cHQgZGF0YSBlcnJvciIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzbXBfcmFuZCh1OCAqYnVmKQoreworCWdldF9yYW5kb21fYnl0ZXMoYnVmLCAxNik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpzbXBfYnVpbGRfY21kKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCB1OCBjb2RlLAorCQkJCQkJdTE2IGRsZW4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbDJjYXBfaGRyICpsaDsKKwlpbnQgbGVuOworCisJbGVuID0gTDJDQVBfSERSX1NJWkUgKyBzaXplb2YoY29kZSkgKyBkbGVuOworCisJaWYgKGxlbiA+IGNvbm4tPm10dSkKKwkJcmV0dXJuIE5VTEw7CisKKwlza2IgPSBidF9za2JfYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlsaCA9IChzdHJ1Y3QgbDJjYXBfaGRyICopIHNrYl9wdXQoc2tiLCBMMkNBUF9IRFJfU0laRSk7CisJbGgtPmxlbiA9IGNwdV90b19sZTE2KHNpemVvZihjb2RlKSArIGRsZW4pOworCWxoLT5jaWQgPSBjcHVfdG9fbGUxNihMMkNBUF9DSURfU01QKTsKKworCW1lbWNweShza2JfcHV0KHNrYiwgc2l6ZW9mKGNvZGUpKSwgJmNvZGUsIHNpemVvZihjb2RlKSk7CisKKwltZW1jcHkoc2tiX3B1dChza2IsIGRsZW4pLCBkYXRhLCBkbGVuKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyB2b2lkIHNtcF9zZW5kX2NtZChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgdTggY29kZSwgdTE2IGxlbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc21wX2J1aWxkX2NtZChjb25uLCBjb2RlLCBsZW4sIGRhdGEpOworCisJQlRfREJHKCJjb2RlIDB4JTIuMngiLCBjb2RlKTsKKworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwloY2lfc2VuZF9hY2woY29ubi0+aGNvbiwgc2tiLCAwKTsKK30KKworc3RhdGljIF9fdTggc2VjbGV2ZWxfdG9fYXV0aHJlcShfX3U4IGxldmVsKQoreworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIEJUX1NFQ1VSSVRZX0hJR0g6CisJCS8qIFJpZ2h0IG5vdyB3ZSBkb24ndCBzdXBwb3J0IGJvbmRpbmcgKi8KKwkJcmV0dXJuIFNNUF9BVVRIX01JVE07CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gU01QX0FVVEhfTk9ORTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3BhaXJpbmdfY21kKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLAorCQkJCXN0cnVjdCBzbXBfY21kX3BhaXJpbmcgKnJlcSwKKwkJCQlzdHJ1Y3Qgc21wX2NtZF9wYWlyaW5nICpyc3AsCisJCQkJX191OCBhdXRocmVxKQoreworCXU4IGRpc3Rfa2V5czsKKworCWRpc3Rfa2V5cyA9IDA7CisJaWYgKHRlc3RfYml0KEhDSV9QQUlSQUJMRSwgJmNvbm4tPmhjb24tPmhkZXYtPmZsYWdzKSkgeworCQlkaXN0X2tleXMgPSBTTVBfRElTVF9FTkNfS0VZIHwgU01QX0RJU1RfSURfS0VZIHwgU01QX0RJU1RfU0lHTjsKKwkJYXV0aHJlcSB8PSBTTVBfQVVUSF9CT05ESU5HOworCX0KKworCWlmIChyc3AgPT0gTlVMTCkgeworCQlyZXEtPmlvX2NhcGFiaWxpdHkgPSBjb25uLT5oY29uLT5pb19jYXBhYmlsaXR5OworCQlyZXEtPm9vYl9mbGFnID0gU01QX09PQl9OT1RfUFJFU0VOVDsKKwkJcmVxLT5tYXhfa2V5X3NpemUgPSBTTVBfTUFYX0VOQ19LRVlfU0laRTsKKwkJcmVxLT5pbml0X2tleV9kaXN0ID0gZGlzdF9rZXlzOworCQlyZXEtPnJlc3Bfa2V5X2Rpc3QgPSBkaXN0X2tleXM7CisJCXJlcS0+YXV0aF9yZXEgPSBhdXRocmVxOworCQlyZXR1cm47CisJfQorCisJcnNwLT5pb19jYXBhYmlsaXR5ID0gY29ubi0+aGNvbi0+aW9fY2FwYWJpbGl0eTsKKwlyc3AtPm9vYl9mbGFnID0gU01QX09PQl9OT1RfUFJFU0VOVDsKKwlyc3AtPm1heF9rZXlfc2l6ZSA9IFNNUF9NQVhfRU5DX0tFWV9TSVpFOworCXJzcC0+aW5pdF9rZXlfZGlzdCA9IHJlcS0+aW5pdF9rZXlfZGlzdCAmIGRpc3Rfa2V5czsKKwlyc3AtPnJlc3Bfa2V5X2Rpc3QgPSByZXEtPnJlc3Bfa2V5X2Rpc3QgJiBkaXN0X2tleXM7CisJcnNwLT5hdXRoX3JlcSA9IGF1dGhyZXE7Cit9CisKK3N0YXRpYyB1OCBjaGVja19lbmNfa2V5X3NpemUoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIF9fdTggbWF4X2tleV9zaXplKQoreworCWlmICgobWF4X2tleV9zaXplID4gU01QX01BWF9FTkNfS0VZX1NJWkUpIHx8CisJCQkobWF4X2tleV9zaXplIDwgU01QX01JTl9FTkNfS0VZX1NJWkUpKQorCQlyZXR1cm4gU01QX0VOQ19LRVlfU0laRTsKKworCWNvbm4tPnNtcF9rZXlfc2l6ZSA9IG1heF9rZXlfc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggc21wX2NtZF9wYWlyaW5nX3JlcShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc21wX2NtZF9wYWlyaW5nIHJzcCwgKnJlcSA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwl1OCBrZXlfc2l6ZTsKKworCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOworCisJY29ubi0+cHJlcVswXSA9IFNNUF9DTURfUEFJUklOR19SRVE7CisJbWVtY3B5KCZjb25uLT5wcmVxWzFdLCByZXEsIHNpemVvZigqcmVxKSk7CisJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnJlcSkpOworCisJaWYgKHJlcS0+b29iX2ZsYWcpCisJCXJldHVybiBTTVBfT09CX05PVF9BVkFJTDsKKworCS8qIFdlIGRpZG4ndCBzdGFydCB0aGUgcGFpcmluZywgc28gbm8gcmVxdWlyZW1lbnRzICovCisJYnVpbGRfcGFpcmluZ19jbWQoY29ubiwgcmVxLCAmcnNwLCBTTVBfQVVUSF9OT05FKTsKKworCWtleV9zaXplID0gbWluKHJlcS0+bWF4X2tleV9zaXplLCByc3AubWF4X2tleV9zaXplKTsKKwlpZiAoY2hlY2tfZW5jX2tleV9zaXplKGNvbm4sIGtleV9zaXplKSkKKwkJcmV0dXJuIFNNUF9FTkNfS0VZX1NJWkU7CisKKwkvKiBKdXN0IHdvcmtzICovCisJbWVtc2V0KGNvbm4tPnRrLCAwLCBzaXplb2YoY29ubi0+dGspKTsKKworCWNvbm4tPnByc3BbMF0gPSBTTVBfQ01EX1BBSVJJTkdfUlNQOworCW1lbWNweSgmY29ubi0+cHJzcFsxXSwgJnJzcCwgc2l6ZW9mKHJzcCkpOworCisJc21wX3NlbmRfY21kKGNvbm4sIFNNUF9DTURfUEFJUklOR19SU1AsIHNpemVvZihyc3ApLCAmcnNwKTsKKworCW1vZF90aW1lcigmY29ubi0+c2VjdXJpdHlfdGltZXIsIGppZmZpZXMgKworCQkJCQltc2Vjc190b19qaWZmaWVzKFNNUF9USU1FT1VUKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IHNtcF9jbWRfcGFpcmluZ19yc3Aoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNtcF9jbWRfcGFpcmluZyAqcmVxLCAqcnNwID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXN0cnVjdCBzbXBfY21kX3BhaXJpbmdfY29uZmlybSBjcDsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtID0gY29ubi0+aGNvbi0+aGRldi0+dGZtOworCWludCByZXQ7CisJdTggcmVzWzE2XSwga2V5X3NpemU7CisKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpyc3ApKTsKKworCXJlcSA9ICh2b2lkICopICZjb25uLT5wcmVxWzFdOworCisJa2V5X3NpemUgPSBtaW4ocmVxLT5tYXhfa2V5X3NpemUsIHJzcC0+bWF4X2tleV9zaXplKTsKKwlpZiAoY2hlY2tfZW5jX2tleV9zaXplKGNvbm4sIGtleV9zaXplKSkKKwkJcmV0dXJuIFNNUF9FTkNfS0VZX1NJWkU7CisKKwlpZiAocnNwLT5vb2JfZmxhZykKKwkJcmV0dXJuIFNNUF9PT0JfTk9UX0FWQUlMOworCisJLyogSnVzdCB3b3JrcyAqLworCW1lbXNldChjb25uLT50aywgMCwgc2l6ZW9mKGNvbm4tPnRrKSk7CisKKwljb25uLT5wcnNwWzBdID0gU01QX0NNRF9QQUlSSU5HX1JTUDsKKwltZW1jcHkoJmNvbm4tPnByc3BbMV0sIHJzcCwgc2l6ZW9mKCpyc3ApKTsKKworCXJldCA9IHNtcF9yYW5kKGNvbm4tPnBybmQpOworCWlmIChyZXQpCisJCXJldHVybiBTTVBfVU5TUEVDSUZJRUQ7CisKKwlyZXQgPSBzbXBfYzEodGZtLCBjb25uLT50aywgY29ubi0+cHJuZCwgY29ubi0+cHJlcSwgY29ubi0+cHJzcCwgMCwKKwkJCWNvbm4tPnNyYywgY29ubi0+aGNvbi0+ZHN0X3R5cGUsIGNvbm4tPmRzdCwgcmVzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOworCisJc3dhcDEyOChyZXMsIGNwLmNvbmZpcm1fdmFsKTsKKworCXNtcF9zZW5kX2NtZChjb25uLCBTTVBfQ01EX1BBSVJJTkdfQ09ORklSTSwgc2l6ZW9mKGNwKSwgJmNwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggc21wX2NtZF9wYWlyaW5nX2NvbmZpcm0oc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSA9IGNvbm4tPmhjb24tPmhkZXYtPnRmbTsKKworCUJUX0RCRygiY29ubiAlcCAlcyIsIGNvbm4sIGNvbm4tPmhjb24tPm91dCA/ICJtYXN0ZXIiIDogInNsYXZlIik7CisKKwltZW1jcHkoY29ubi0+cGNuZiwgc2tiLT5kYXRhLCBzaXplb2YoY29ubi0+cGNuZikpOworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKGNvbm4tPnBjbmYpKTsKKworCWlmIChjb25uLT5oY29uLT5vdXQpIHsKKwkJdTggcmFuZG9tWzE2XTsKKworCQlzd2FwMTI4KGNvbm4tPnBybmQsIHJhbmRvbSk7CisJCXNtcF9zZW5kX2NtZChjb25uLCBTTVBfQ01EX1BBSVJJTkdfUkFORE9NLCBzaXplb2YocmFuZG9tKSwKKwkJCQkJCQkJcmFuZG9tKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc21wX2NtZF9wYWlyaW5nX2NvbmZpcm0gY3A7CisJCWludCByZXQ7CisJCXU4IHJlc1sxNl07CisKKwkJcmV0ID0gc21wX3JhbmQoY29ubi0+cHJuZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOworCisJCXJldCA9IHNtcF9jMSh0Zm0sIGNvbm4tPnRrLCBjb25uLT5wcm5kLCBjb25uLT5wcmVxLCBjb25uLT5wcnNwLAorCQkJCQkJY29ubi0+aGNvbi0+ZHN0X3R5cGUsIGNvbm4tPmRzdCwKKwkJCQkJCTAsIGNvbm4tPnNyYywgcmVzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiBTTVBfQ09ORklSTV9GQUlMRUQ7CisKKwkJc3dhcDEyOChyZXMsIGNwLmNvbmZpcm1fdmFsKTsKKworCQlzbXBfc2VuZF9jbWQoY29ubiwgU01QX0NNRF9QQUlSSU5HX0NPTkZJUk0sIHNpemVvZihjcCksICZjcCk7CisJfQorCisJbW9kX3RpbWVyKCZjb25uLT5zZWN1cml0eV90aW1lciwgamlmZmllcyArCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoU01QX1RJTUVPVVQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggc21wX2NtZF9wYWlyaW5nX3JhbmRvbShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24gPSBjb25uLT5oY29uOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0gPSBoY29uLT5oZGV2LT50Zm07CisJaW50IHJldDsKKwl1OCBrZXlbMTZdLCByZXNbMTZdLCByYW5kb21bMTZdLCBjb25maXJtWzE2XTsKKworCXN3YXAxMjgoc2tiLT5kYXRhLCByYW5kb20pOworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHJhbmRvbSkpOworCisJaWYgKGNvbm4tPmhjb24tPm91dCkKKwkJcmV0ID0gc21wX2MxKHRmbSwgY29ubi0+dGssIHJhbmRvbSwgY29ubi0+cHJlcSwgY29ubi0+cHJzcCwgMCwKKwkJCQljb25uLT5zcmMsIGNvbm4tPmhjb24tPmRzdF90eXBlLCBjb25uLT5kc3QsCisJCQkJcmVzKTsKKwllbHNlCisJCXJldCA9IHNtcF9jMSh0Zm0sIGNvbm4tPnRrLCByYW5kb20sIGNvbm4tPnByZXEsIGNvbm4tPnByc3AsCisJCQkJY29ubi0+aGNvbi0+ZHN0X3R5cGUsIGNvbm4tPmRzdCwgMCwgY29ubi0+c3JjLAorCQkJCXJlcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIFNNUF9VTlNQRUNJRklFRDsKKworCUJUX0RCRygiY29ubiAlcCAlcyIsIGNvbm4sIGNvbm4tPmhjb24tPm91dCA/ICJtYXN0ZXIiIDogInNsYXZlIik7CisKKwlzd2FwMTI4KHJlcywgY29uZmlybSk7CisKKwlpZiAobWVtY21wKGNvbm4tPnBjbmYsIGNvbmZpcm0sIHNpemVvZihjb25uLT5wY25mKSkgIT0gMCkgeworCQlCVF9FUlIoIlBhaXJpbmcgZmFpbGVkIChjb25maXJtYXRpb24gdmFsdWVzIG1pc21hdGNoKSIpOworCQlyZXR1cm4gU01QX0NPTkZJUk1fRkFJTEVEOworCX0KKworCWlmIChjb25uLT5oY29uLT5vdXQpIHsKKwkJdTggc3RrWzE2XSwgcmFuZFs4XTsKKwkJX19sZTE2IGVkaXY7CisKKwkJbWVtc2V0KHJhbmQsIDAsIHNpemVvZihyYW5kKSk7CisJCWVkaXYgPSAwOworCisJCXNtcF9zMSh0Zm0sIGNvbm4tPnRrLCByYW5kb20sIGNvbm4tPnBybmQsIGtleSk7CisJCXN3YXAxMjgoa2V5LCBzdGspOworCisJCW1lbXNldChzdGsgKyBjb25uLT5zbXBfa2V5X3NpemUsIDAsCisJCQkJU01QX01BWF9FTkNfS0VZX1NJWkUgLSBjb25uLT5zbXBfa2V5X3NpemUpOworCisJCWhjaV9sZV9zdGFydF9lbmMoaGNvbiwgZWRpdiwgcmFuZCwgc3RrKTsKKwkJaGNvbi0+ZW5jX2tleV9zaXplID0gY29ubi0+c21wX2tleV9zaXplOworCX0gZWxzZSB7CisJCXU4IHN0a1sxNl0sIHJbMTZdLCByYW5kWzhdOworCQlfX2xlMTYgZWRpdjsKKworCQltZW1zZXQocmFuZCwgMCwgc2l6ZW9mKHJhbmQpKTsKKwkJZWRpdiA9IDA7CisKKwkJc3dhcDEyOChjb25uLT5wcm5kLCByKTsKKwkJc21wX3NlbmRfY21kKGNvbm4sIFNNUF9DTURfUEFJUklOR19SQU5ET00sIHNpemVvZihyKSwgcik7CisKKwkJc21wX3MxKHRmbSwgY29ubi0+dGssIGNvbm4tPnBybmQsIHJhbmRvbSwga2V5KTsKKwkJc3dhcDEyOChrZXksIHN0ayk7CisKKwkJbWVtc2V0KHN0ayArIGNvbm4tPnNtcF9rZXlfc2l6ZSwgMCwKKwkJCQlTTVBfTUFYX0VOQ19LRVlfU0laRSAtIGNvbm4tPnNtcF9rZXlfc2l6ZSk7CisKKwkJaGNpX2FkZF9sdGsoY29ubi0+aGNvbi0+aGRldiwgMCwgY29ubi0+ZHN0LCBjb25uLT5zbXBfa2V5X3NpemUsCisJCQkJCQkJZWRpdiwgcmFuZCwgc3RrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IHNtcF9jbWRfc2VjdXJpdHlfcmVxKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzbXBfY21kX3NlY3VyaXR5X3JlcSAqcnAgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJc3RydWN0IHNtcF9jbWRfcGFpcmluZyBjcDsKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24gPSBjb25uLT5oY29uOworCisJQlRfREJHKCJjb25uICVwIiwgY29ubik7CisKKwlpZiAodGVzdF9iaXQoSENJX0NPTk5fRU5DUllQVF9QRU5ELCAmaGNvbi0+cGVuZCkpCisJCXJldHVybiAwOworCisJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnJwKSk7CisKKwltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKKwlidWlsZF9wYWlyaW5nX2NtZChjb25uLCAmY3AsIE5VTEwsIHJwLT5hdXRoX3JlcSk7CisKKwljb25uLT5wcmVxWzBdID0gU01QX0NNRF9QQUlSSU5HX1JFUTsKKwltZW1jcHkoJmNvbm4tPnByZXFbMV0sICZjcCwgc2l6ZW9mKGNwKSk7CisKKwlzbXBfc2VuZF9jbWQoY29ubiwgU01QX0NNRF9QQUlSSU5HX1JFUSwgc2l6ZW9mKGNwKSwgJmNwKTsKKworCW1vZF90aW1lcigmY29ubi0+c2VjdXJpdHlfdGltZXIsIGppZmZpZXMgKworCQkJCQltc2Vjc190b19qaWZmaWVzKFNNUF9USU1FT1VUKSk7CisKKwlzZXRfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmhjb24tPnBlbmQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzbXBfY29ubl9zZWN1cml0eShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgX191OCBzZWNfbGV2ZWwpCit7CisJc3RydWN0IGhjaV9jb25uICpoY29uID0gY29ubi0+aGNvbjsKKwlfX3U4IGF1dGhyZXE7CisKKwlCVF9EQkcoImNvbm4gJXAgaGNvbiAlcCBsZXZlbCAweCUyLjJ4IiwgY29ubiwgaGNvbiwgc2VjX2xldmVsKTsKKworCWlmICghbG1wX2hvc3RfbGVfY2FwYWJsZShoY29uLT5oZGV2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoSVNfRVJSKGhjb24tPmhkZXYtPnRmbSkpCisJCXJldHVybiAxOworCisJaWYgKHRlc3RfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmhjb24tPnBlbmQpKQorCQlyZXR1cm4gMDsKKworCWlmIChzZWNfbGV2ZWwgPT0gQlRfU0VDVVJJVFlfTE9XKQorCQlyZXR1cm4gMTsKKworCWlmIChoY29uLT5zZWNfbGV2ZWwgPj0gc2VjX2xldmVsKQorCQlyZXR1cm4gMTsKKworCWF1dGhyZXEgPSBzZWNsZXZlbF90b19hdXRocmVxKHNlY19sZXZlbCk7CisKKwlpZiAoaGNvbi0+bGlua19tb2RlICYgSENJX0xNX01BU1RFUikgeworCQlzdHJ1Y3Qgc21wX2NtZF9wYWlyaW5nIGNwOworCQlzdHJ1Y3QgbGlua19rZXkgKmtleTsKKworCQlrZXkgPSBoY2lfZmluZF9saW5rX2tleV90eXBlKGhjb24tPmhkZXYsIGNvbm4tPmRzdCwKKwkJCQkJCQlIQ0lfTEtfU01QX0xUSyk7CisJCWlmIChrZXkpIHsKKwkJCXN0cnVjdCBrZXlfbWFzdGVyX2lkICptYXN0ZXIgPSAodm9pZCAqKSBrZXktPmRhdGE7CisKKwkJCWhjaV9sZV9zdGFydF9lbmMoaGNvbiwgbWFzdGVyLT5lZGl2LCBtYXN0ZXItPnJhbmQsCisJCQkJCQkJCWtleS0+dmFsKTsKKwkJCWhjb24tPmVuY19rZXlfc2l6ZSA9IGtleS0+cGluX2xlbjsKKworCQkJZ290byBkb25lOworCQl9CisKKwkJYnVpbGRfcGFpcmluZ19jbWQoY29ubiwgJmNwLCBOVUxMLCBhdXRocmVxKTsKKwkJY29ubi0+cHJlcVswXSA9IFNNUF9DTURfUEFJUklOR19SRVE7CisJCW1lbWNweSgmY29ubi0+cHJlcVsxXSwgJmNwLCBzaXplb2YoY3ApKTsKKworCQltb2RfdGltZXIoJmNvbm4tPnNlY3VyaXR5X3RpbWVyLCBqaWZmaWVzICsKKwkJCQkJbXNlY3NfdG9famlmZmllcyhTTVBfVElNRU9VVCkpOworCisJCXNtcF9zZW5kX2NtZChjb25uLCBTTVBfQ01EX1BBSVJJTkdfUkVRLCBzaXplb2YoY3ApLCAmY3ApOworCX0gZWxzZSB7CisJCXN0cnVjdCBzbXBfY21kX3NlY3VyaXR5X3JlcSBjcDsKKwkJY3AuYXV0aF9yZXEgPSBhdXRocmVxOworCQlzbXBfc2VuZF9jbWQoY29ubiwgU01QX0NNRF9TRUNVUklUWV9SRVEsIHNpemVvZihjcCksICZjcCk7CisJfQorCitkb25lOgorCWhjb24tPnBlbmRpbmdfc2VjX2xldmVsID0gc2VjX2xldmVsOworCXNldF9iaXQoSENJX0NPTk5fRU5DUllQVF9QRU5ELCAmaGNvbi0+cGVuZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbXBfY21kX2VuY3J5cHRfaW5mbyhzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc21wX2NtZF9lbmNyeXB0X2luZm8gKnJwID0gKHZvaWQgKikgc2tiLT5kYXRhOworCisJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnJwKSk7CisKKwltZW1jcHkoY29ubi0+dGssIHJwLT5sdGssIHNpemVvZihjb25uLT50aykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21wX2NtZF9tYXN0ZXJfaWRlbnQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNtcF9jbWRfbWFzdGVyX2lkZW50ICpycCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpycCkpOworCisJaGNpX2FkZF9sdGsoY29ubi0+aGNvbi0+aGRldiwgMSwgY29ubi0+c3JjLCBjb25uLT5zbXBfa2V5X3NpemUsCisJCQkJCQlycC0+ZWRpdiwgcnAtPnJhbmQsIGNvbm4tPnRrKTsKKworCXNtcF9kaXN0cmlidXRlX2tleXMoY29ubiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNtcF9zaWdfY2hhbm5lbChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3U4IGNvZGUgPSBza2ItPmRhdGFbMF07CisJX191OCByZWFzb247CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWxtcF9ob3N0X2xlX2NhcGFibGUoY29ubi0+aGNvbi0+aGRldikpIHsKKwkJZXJyID0gLUVOT1RTVVBQOworCQlyZWFzb24gPSBTTVBfUEFJUklOR19OT1RTVVBQOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKElTX0VSUihjb25uLT5oY29uLT5oZGV2LT50Zm0pKSB7CisJCWVyciA9IFBUUl9FUlIoY29ubi0+aGNvbi0+aGRldi0+dGZtKTsKKwkJcmVhc29uID0gU01QX1BBSVJJTkdfTk9UU1VQUDsKKwkJZ290byBkb25lOworCX0KKworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKGNvZGUpKTsKKworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgU01QX0NNRF9QQUlSSU5HX1JFUToKKwkJcmVhc29uID0gc21wX2NtZF9wYWlyaW5nX3JlcShjb25uLCBza2IpOworCQlicmVhazsKKworCWNhc2UgU01QX0NNRF9QQUlSSU5HX0ZBSUw6CisJCXJlYXNvbiA9IDA7CisJCWVyciA9IC1FUEVSTTsKKwkJYnJlYWs7CisKKwljYXNlIFNNUF9DTURfUEFJUklOR19SU1A6CisJCXJlYXNvbiA9IHNtcF9jbWRfcGFpcmluZ19yc3AoY29ubiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIFNNUF9DTURfU0VDVVJJVFlfUkVROgorCQlyZWFzb24gPSBzbXBfY21kX3NlY3VyaXR5X3JlcShjb25uLCBza2IpOworCQlicmVhazsKKworCWNhc2UgU01QX0NNRF9QQUlSSU5HX0NPTkZJUk06CisJCXJlYXNvbiA9IHNtcF9jbWRfcGFpcmluZ19jb25maXJtKGNvbm4sIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBTTVBfQ01EX1BBSVJJTkdfUkFORE9NOgorCQlyZWFzb24gPSBzbXBfY21kX3BhaXJpbmdfcmFuZG9tKGNvbm4sIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBTTVBfQ01EX0VOQ1JZUFRfSU5GTzoKKwkJcmVhc29uID0gc21wX2NtZF9lbmNyeXB0X2luZm8oY29ubiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIFNNUF9DTURfTUFTVEVSX0lERU5UOgorCQlyZWFzb24gPSBzbXBfY21kX21hc3Rlcl9pZGVudChjb25uLCBza2IpOworCQlicmVhazsKKworCWNhc2UgU01QX0NNRF9JREVOVF9JTkZPOgorCWNhc2UgU01QX0NNRF9JREVOVF9BRERSX0lORk86CisJY2FzZSBTTVBfQ01EX1NJR05fSU5GTzoKKwkJLyogSnVzdCBpZ25vcmVkICovCisJCXJlYXNvbiA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlRfREJHKCJVbmtub3duIGNvbW1hbmQgY29kZSAweCUyLjJ4IiwgY29kZSk7CisKKwkJcmVhc29uID0gU01QX0NNRF9OT1RTVVBQOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwlpZiAocmVhc29uKQorCQlzbXBfc2VuZF9jbWQoY29ubiwgU01QX0NNRF9QQUlSSU5HX0ZBSUwsIHNpemVvZihyZWFzb24pLAorCQkJCQkJCQkmcmVhc29uKTsKKworCWtmcmVlX3NrYihza2IpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBzbXBfZGlzdHJpYnV0ZV9rZXlzKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBfX3U4IGZvcmNlKQoreworCXN0cnVjdCBzbXBfY21kX3BhaXJpbmcgKnJlcSwgKnJzcDsKKwlfX3U4ICprZXlkaXN0OworCisJQlRfREJHKCJjb25uICVwIGZvcmNlICVkIiwgY29ubiwgZm9yY2UpOworCisJaWYgKElTX0VSUihjb25uLT5oY29uLT5oZGV2LT50Zm0pKQorCQlyZXR1cm4gUFRSX0VSUihjb25uLT5oY29uLT5oZGV2LT50Zm0pOworCisJcnNwID0gKHZvaWQgKikgJmNvbm4tPnByc3BbMV07CisKKwkvKiBUaGUgcmVzcG9uZGVyIHNlbmRzIGl0cyBrZXlzIGZpcnN0ICovCisJaWYgKCFmb3JjZSAmJiBjb25uLT5oY29uLT5vdXQgJiYgKHJzcC0+cmVzcF9rZXlfZGlzdCAmIDB4MDcpKQorCQlyZXR1cm4gMDsKKworCXJlcSA9ICh2b2lkICopICZjb25uLT5wcmVxWzFdOworCisJaWYgKGNvbm4tPmhjb24tPm91dCkgeworCQlrZXlkaXN0ID0gJnJzcC0+aW5pdF9rZXlfZGlzdDsKKwkJKmtleWRpc3QgJj0gcmVxLT5pbml0X2tleV9kaXN0OworCX0gZWxzZSB7CisJCWtleWRpc3QgPSAmcnNwLT5yZXNwX2tleV9kaXN0OworCQkqa2V5ZGlzdCAmPSByZXEtPnJlc3Bfa2V5X2Rpc3Q7CisJfQorCisKKwlCVF9EQkcoImtleWRpc3QgMHgleCIsICprZXlkaXN0KTsKKworCWlmICgqa2V5ZGlzdCAmIFNNUF9ESVNUX0VOQ19LRVkpIHsKKwkJc3RydWN0IHNtcF9jbWRfZW5jcnlwdF9pbmZvIGVuYzsKKwkJc3RydWN0IHNtcF9jbWRfbWFzdGVyX2lkZW50IGlkZW50OworCQlfX2xlMTYgZWRpdjsKKworCQlnZXRfcmFuZG9tX2J5dGVzKGVuYy5sdGssIHNpemVvZihlbmMubHRrKSk7CisJCWdldF9yYW5kb21fYnl0ZXMoJmVkaXYsIHNpemVvZihlZGl2KSk7CisJCWdldF9yYW5kb21fYnl0ZXMoaWRlbnQucmFuZCwgc2l6ZW9mKGlkZW50LnJhbmQpKTsKKworCQlzbXBfc2VuZF9jbWQoY29ubiwgU01QX0NNRF9FTkNSWVBUX0lORk8sIHNpemVvZihlbmMpLCAmZW5jKTsKKworCQloY2lfYWRkX2x0ayhjb25uLT5oY29uLT5oZGV2LCAxLCBjb25uLT5kc3QsIGNvbm4tPnNtcF9rZXlfc2l6ZSwKKwkJCQkJCWVkaXYsIGlkZW50LnJhbmQsIGVuYy5sdGspOworCisJCWlkZW50LmVkaXYgPSBjcHVfdG9fbGUxNihlZGl2KTsKKworCQlzbXBfc2VuZF9jbWQoY29ubiwgU01QX0NNRF9NQVNURVJfSURFTlQsIHNpemVvZihpZGVudCksICZpZGVudCk7CisKKwkJKmtleWRpc3QgJj0gflNNUF9ESVNUX0VOQ19LRVk7CisJfQorCisJaWYgKCprZXlkaXN0ICYgU01QX0RJU1RfSURfS0VZKSB7CisJCXN0cnVjdCBzbXBfY21kX2lkZW50X2FkZHJfaW5mbyBhZGRyaW5mbzsKKwkJc3RydWN0IHNtcF9jbWRfaWRlbnRfaW5mbyBpZGluZm87CisKKwkJLyogU2VuZCBhIGR1bW15IGtleSAqLworCQlnZXRfcmFuZG9tX2J5dGVzKGlkaW5mby5pcmssIHNpemVvZihpZGluZm8uaXJrKSk7CisKKwkJc21wX3NlbmRfY21kKGNvbm4sIFNNUF9DTURfSURFTlRfSU5GTywgc2l6ZW9mKGlkaW5mbyksICZpZGluZm8pOworCisJCS8qIEp1c3QgcHVibGljIGFkZHJlc3MgKi8KKwkJbWVtc2V0KCZhZGRyaW5mbywgMCwgc2l6ZW9mKGFkZHJpbmZvKSk7CisJCWJhY3B5KCZhZGRyaW5mby5iZGFkZHIsIGNvbm4tPnNyYyk7CisKKwkJc21wX3NlbmRfY21kKGNvbm4sIFNNUF9DTURfSURFTlRfQUREUl9JTkZPLCBzaXplb2YoYWRkcmluZm8pLAorCQkJCQkJCQkmYWRkcmluZm8pOworCisJCSprZXlkaXN0ICY9IH5TTVBfRElTVF9JRF9LRVk7CisJfQorCisJaWYgKCprZXlkaXN0ICYgU01QX0RJU1RfU0lHTikgeworCQlzdHJ1Y3Qgc21wX2NtZF9zaWduX2luZm8gc2lnbjsKKworCQkvKiBTZW5kIGEgZHVtbXkga2V5ICovCisJCWdldF9yYW5kb21fYnl0ZXMoc2lnbi5jc3JrLCBzaXplb2Yoc2lnbi5jc3JrKSk7CisKKwkJc21wX3NlbmRfY21kKGNvbm4sIFNNUF9DTURfU0lHTl9JTkZPLCBzaXplb2Yoc2lnbiksICZzaWduKTsKKworCQkqa2V5ZGlzdCAmPSB+U01QX0RJU1RfU0lHTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCmluZGV4IGE2YjJmODYuLjMyYjhmOWYgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKKysrIGIvbmV0L2JyaWRnZS9icl9kZXZpY2UuYwpAQCAtNDksNyArNDksOSBAQAogCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgeworCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkKKwkJYnJfZmxvb2RfZGVsaXZlcihiciwgc2tiKTsKKwllbHNlIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewogCQlpZiAodW5saWtlbHkobmV0cG9sbF90eF9ydW5uaW5nKGRldikpKSB7CiAJCQlicl9mbG9vZF9kZWxpdmVyKGJyLCBza2IpOwogCQkJZ290byBvdXQ7CkBAIC0yNDMsNiArMjQ1LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlucC0+ZGV2ID0gcC0+ZGV2OworCXN0cmxjcHkobnAtPmRldl9uYW1lLCBwLT5kZXYtPm5hbWUsIElGTkFNU0laKTsKIAogCWVyciA9IF9fbmV0cG9sbF9zZXR1cChucCk7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9pZi5jIGIvbmV0L2JyaWRnZS9icl9pZi5jCmluZGV4IDFiYWNjYTQuLjMxNzZlMmUgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX2lmLmMKQEAgLTM4OCw3ICszODgsNyBAQAogCWJyX2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIHApOwogCiAJaWYgKGNoYW5nZWRfYWRkcikKLQkJY2FsbF9uZXRkZXZpY2Vfbm90aWZpZXJzKE5FVERFVl9DSEFOR0VBRERSLCBkZXYpOworCQljYWxsX25ldGRldmljZV9ub3RpZmllcnMoTkVUREVWX0NIQU5HRUFERFIsIGJyLT5kZXYpOwogCiAJZGV2X3NldF9tdHUoYnItPmRldiwgYnJfbWluX210dShicikpOwogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKaW5kZXggZjNhYzFlOC4uZjA2ZWUzOSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jCisrKyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwpAQCAtNjAsNyArNjAsNyBAQAogCWJyID0gcC0+YnI7CiAJYnJfZmRiX3VwZGF0ZShiciwgcCwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSk7CiAKLQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkgJiYKKwlpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpICYmIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpICYmCiAJICAgIGJyX211bHRpY2FzdF9yY3YoYnIsIHAsIHNrYikpCiAJCWdvdG8gZHJvcDsKIApAQCAtNzcsNyArNzcsOSBAQAogCiAJZHN0ID0gTlVMTDsKIAotCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgeworCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkKKwkJc2tiMiA9IHNrYjsKKwllbHNlIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewogCQltZHN0ID0gYnJfbWRiX2dldChiciwgc2tiKTsKIAkJaWYgKG1kc3QgfHwgQlJfSU5QVVRfU0tCX0NCX01ST1VURVJTX09OTFkoc2tiKSkgewogCQkJaWYgKChtZHN0ICYmIG1kc3QtPm1nbGlzdCkgfHwKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMgYi9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jCmluZGV4IDJmMTRlYWYuLjJkODVjYTcgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMKKysrIGIvbmV0L2JyaWRnZS9icl9tdWx0aWNhc3QuYwpAQCAtMTM3OSw4ICsxMzc5LDExIEBACiAJaWYgKHVubGlrZWx5KGlwX2Zhc3RfY3N1bSgodTggKilpcGgsIGlwaC0+aWhsKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19JR01QKQorCWlmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fSUdNUCkgeworCQlpZiAoKGlwaC0+ZGFkZHIgJiBJR01QX0xPQ0FMX0dST1VQX01BU0spICE9IElHTVBfTE9DQUxfR1JPVVApCisJCQlCUl9JTlBVVF9TS0JfQ0Ioc2tiKS0+bXJvdXRlcnNfb25seSA9IDE7CiAJCXJldHVybiAwOworCX0KIAogCWxlbiA9IG50b2hzKGlwaC0+dG90X2xlbik7CiAJaWYgKHNrYi0+bGVuIDwgbGVuIHx8IGxlbiA8IGlwX2hkcmxlbihza2IpKQpAQCAtMTQyNCw3ICsxNDI3LDcgQEAKIAlzd2l0Y2ggKGloLT50eXBlKSB7CiAJY2FzZSBJR01QX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQ6CiAJY2FzZSBJR01QVjJfSE9TVF9NRU1CRVJTSElQX1JFUE9SVDoKLQkJQlJfSU5QVVRfU0tCX0NCKHNrYjIpLT5tcm91dGVyc19vbmx5ID0gMTsKKwkJQlJfSU5QVVRfU0tCX0NCKHNrYiktPm1yb3V0ZXJzX29ubHkgPSAxOwogCQllcnIgPSBicl9pcDRfbXVsdGljYXN0X2FkZF9ncm91cChiciwgcG9ydCwgaWgtPmdyb3VwKTsKIAkJYnJlYWs7CiAJY2FzZSBJR01QVjNfSE9TVF9NRU1CRVJTSElQX1JFUE9SVDoKQEAgLTE1NDMsNyArMTU0Niw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCQltbGQgPSAoc3RydWN0IG1sZF9tc2cgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IyKTsKLQkJQlJfSU5QVVRfU0tCX0NCKHNrYjIpLT5tcm91dGVyc19vbmx5ID0gMTsKKwkJQlJfSU5QVVRfU0tCX0NCKHNrYiktPm1yb3V0ZXJzX29ubHkgPSAxOwogCQllcnIgPSBicl9pcDZfbXVsdGljYXN0X2FkZF9ncm91cChiciwgcG9ydCwgJm1sZC0+bWxkX21jYSk7CiAJCWJyZWFrOwogCSAgICB9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwppbmRleCAzZmExMjMxLi5kNmVjMzcyIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKQEAgLTEwNCwxMCArMTA0LDIyIEBACiB7CiB9CiAKK3N0YXRpYyB1MzIgKmZha2VfY293X21ldHJpY3Moc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1bnNpZ25lZCBsb25nIG9sZCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuZWlnaGJvdXIgKmZha2VfbmVpZ2hfbG9va3VwKGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgY29uc3Qgdm9pZCAqZGFkZHIpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHN0X29wcyBmYWtlX2RzdF9vcHMgPSB7CiAJLmZhbWlseSA9CQlBRl9JTkVULAogCS5wcm90b2NvbCA9CQljcHVfdG9fYmUxNihFVEhfUF9JUCksCiAJLnVwZGF0ZV9wbXR1ID0JCWZha2VfdXBkYXRlX3BtdHUsCisJLmNvd19tZXRyaWNzID0JCWZha2VfY293X21ldHJpY3MsCisJLm5laWdoX2xvb2t1cCA9CQlmYWtlX25laWdoX2xvb2t1cCwKIH07CiAKIC8qCkBAIC0zMzcsMjQgKzM0OSwyNiBAQAogc3RhdGljIGludCBicl9uZl9wcmVfcm91dGluZ19maW5pc2hfYnJpZGdlKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZTsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAKIAlza2ItPmRldiA9IGJyaWRnZV9wYXJlbnQoc2tiLT5kZXYpOwogCWlmICghc2tiLT5kZXYpCiAJCWdvdG8gZnJlZV9za2I7CiAJZHN0ID0gc2tiX2RzdChza2IpOwotCWlmIChkc3QtPmhoKSB7Ci0JCW5laWdoX2hoX2JyaWRnZShkc3QtPmhoLCBza2IpOworCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwlpZiAobmVpZ2gtPmhoLmhoX2xlbikgeworCQluZWlnaF9oaF9icmlkZ2UoJm5laWdoLT5oaCwgc2tiKTsKIAkJc2tiLT5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldjsKIAkJcmV0dXJuIGJyX2hhbmRsZV9mcmFtZV9maW5pc2goc2tiKTsKLQl9IGVsc2UgaWYgKGRzdC0+bmVpZ2hib3VyKSB7CisJfSBlbHNlIHsKIAkJLyogdGhlIG5laWdoYm91ciBmdW5jdGlvbiBiZWxvdyBvdmVyd3JpdGVzIHRoZSBjb21wbGV0ZQogCQkgKiBNQUMgaGVhZGVyLCBzbyB3ZSBzYXZlIHRoZSBFdGhlcm5ldCBzb3VyY2UgYWRkcmVzcyBhbmQKIAkJICogcHJvdG9jb2wgbnVtYmVyLiAqLwogCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIC0oRVRIX0hMRU4tRVRIX0FMRU4pLCBza2ItPm5mX2JyaWRnZS0+ZGF0YSwgRVRIX0hMRU4tRVRIX0FMRU4pOwogCQkvKiB0ZWxsIGJyX2Rldl94bWl0IHRvIGNvbnRpbnVlIHdpdGggZm9yd2FyZGluZyAqLwogCQluZl9icmlkZ2UtPm1hc2sgfD0gQlJORl9CUklER0VEX0ROQVQ7Ci0JCXJldHVybiBkc3QtPm5laWdoYm91ci0+b3V0cHV0KHNrYik7CisJCXJldHVybiBuZWlnaC0+b3V0cHV0KG5laWdoLCBza2IpOwogCX0KIGZyZWVfc2tiOgogCWtmcmVlX3NrYihza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYwppbmRleCBmZmIwZGM0Li41YjFlZDFiIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYworKysgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYwpAQCAtMTg4LDYgKzE4OCw4IEBACiAKIAlwLT5zdGF0ZSA9IG5ld19zdGF0ZTsKIAlicl9sb2dfc3RhdGUocCk7CisJYnJfaWZpbmZvX25vdGlmeShSVE1fTkVXTElOSywgcCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE4LDE5ICsyMjAsMjQgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnIxOwogCi0JZXJyID0gX19ydG5sX3JlZ2lzdGVyKFBGX0JSSURHRSwgUlRNX0dFVExJTkssIE5VTEwsIGJyX2R1bXBfaWZpbmZvKTsKKwllcnIgPSBfX3J0bmxfcmVnaXN0ZXIoUEZfQlJJREdFLCBSVE1fR0VUTElOSywgTlVMTCwKKwkJCSAgICAgIGJyX2R1bXBfaWZpbmZvLCBOVUxMKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycjI7Ci0JZXJyID0gX19ydG5sX3JlZ2lzdGVyKFBGX0JSSURHRSwgUlRNX1NFVExJTkssIGJyX3J0bV9zZXRsaW5rLCBOVUxMKTsKKwllcnIgPSBfX3J0bmxfcmVnaXN0ZXIoUEZfQlJJREdFLCBSVE1fU0VUTElOSywKKwkJCSAgICAgIGJyX3J0bV9zZXRsaW5rLCBOVUxMLCBOVUxMKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycjM7Ci0JZXJyID0gX19ydG5sX3JlZ2lzdGVyKFBGX0JSSURHRSwgUlRNX05FV05FSUdILCBicl9mZGJfYWRkLCBOVUxMKTsKKwllcnIgPSBfX3J0bmxfcmVnaXN0ZXIoUEZfQlJJREdFLCBSVE1fTkVXTkVJR0gsCisJCQkgICAgICBicl9mZGJfYWRkLCBOVUxMLCBOVUxMKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycjM7Ci0JZXJyID0gX19ydG5sX3JlZ2lzdGVyKFBGX0JSSURHRSwgUlRNX0RFTE5FSUdILCBicl9mZGJfZGVsZXRlLCBOVUxMKTsKKwllcnIgPSBfX3J0bmxfcmVnaXN0ZXIoUEZfQlJJREdFLCBSVE1fREVMTkVJR0gsCisJCQkgICAgICBicl9mZGJfZGVsZXRlLCBOVUxMLCBOVUxMKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycjM7Ci0JZXJyID0gX19ydG5sX3JlZ2lzdGVyKFBGX0JSSURHRSwgUlRNX0dFVE5FSUdILCBOVUxMLCBicl9mZGJfZHVtcCk7CisJZXJyID0gX19ydG5sX3JlZ2lzdGVyKFBGX0JSSURHRSwgUlRNX0dFVE5FSUdILAorCQkJICAgICAgTlVMTCwgYnJfZmRiX2R1bXAsIE5VTEwpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyMzsKIApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9wcml2YXRlLmggYi9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaAppbmRleCA1NDU3OGYyLi43OGNjMzY0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaAorKysgYi9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaApAQCAtMTI0LDYgKzEyNCw3IEBACiAJYnJpZGdlX2lkCQkJZGVzaWduYXRlZF9icmlkZ2U7CiAJdTMyCQkJCXBhdGhfY29zdDsKIAl1MzIJCQkJZGVzaWduYXRlZF9jb3N0OworCXVuc2lnbmVkIGxvbmcJCQlkZXNpZ25hdGVkX2FnZTsKIAogCXN0cnVjdCB0aW1lcl9saXN0CQlmb3J3YXJkX2RlbGF5X3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0CQlob2xkX3RpbWVyOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9wcml2YXRlX3N0cC5oIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlX3N0cC5oCmluZGV4IDY0MmVmNDcuLjA1ZWQ5YmMgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZV9zdHAuaAorKysgYi9uZXQvYnJpZGdlL2JyX3ByaXZhdGVfc3RwLmgKQEAgLTU2LDcgKzU2LDggQEAKIGV4dGVybiB2b2lkIGJyX2NvbmZpZ19icGR1X2dlbmVyYXRpb24oc3RydWN0IG5ldF9icmlkZ2UgKik7CiBleHRlcm4gdm9pZCBicl9jb25maWd1cmF0aW9uX3VwZGF0ZShzdHJ1Y3QgbmV0X2JyaWRnZSAqKTsKIGV4dGVybiB2b2lkIGJyX3BvcnRfc3RhdGVfc2VsZWN0aW9uKHN0cnVjdCBuZXRfYnJpZGdlICopOwotZXh0ZXJuIHZvaWQgYnJfcmVjZWl2ZWRfY29uZmlnX2JwZHUoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IGJyX2NvbmZpZ19icGR1ICpicGR1KTsKK2V4dGVybiB2b2lkIGJyX3JlY2VpdmVkX2NvbmZpZ19icGR1KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBicl9jb25maWdfYnBkdSAqYnBkdSk7CiBleHRlcm4gdm9pZCBicl9yZWNlaXZlZF90Y25fYnBkdShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKTsKIGV4dGVybiB2b2lkIGJyX3RyYW5zbWl0X2NvbmZpZyhzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKTsKIGV4dGVybiB2b2lkIGJyX3RyYW5zbWl0X3RjbihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zdHAuYyBiL25ldC9icmlkZ2UvYnJfc3RwLmMKaW5kZXggYmI0MzgzZS4uYWQwYTNmNyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zdHAuYworKysgYi9uZXQvYnJpZGdlL2JyX3N0cC5jCkBAIC0xMDksNyArMTA5LDYgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZici0+cG9ydF9saXN0LCBsaXN0KSB7CiAJCWlmIChicl9zaG91bGRfYmVjb21lX3Jvb3RfcG9ydChwLCByb290X3BvcnQpKQogCQkJcm9vdF9wb3J0ID0gcC0+cG9ydF9ubzsKLQogCX0KIAogCWJyLT5yb290X3BvcnQgPSByb290X3BvcnQ7CkBAIC0xNDUsNyArMTQ0LDYgQEAKIAlzdHJ1Y3QgYnJfY29uZmlnX2JwZHUgYnBkdTsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7CiAKLQogCWlmICh0aW1lcl9wZW5kaW5nKCZwLT5ob2xkX3RpbWVyKSkgewogCQlwLT5jb25maWdfcGVuZGluZyA9IDE7CiAJCXJldHVybjsKQEAgLTE2NCw4ICsxNjIsNyBAQAogCWVsc2UgewogCQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpyb290CiAJCQk9IGJyX2dldF9wb3J0KGJyLCBici0+cm9vdF9wb3J0KTsKLQkJYnBkdS5tZXNzYWdlX2FnZSA9IGJyLT5tYXhfYWdlCi0JCQktIChyb290LT5tZXNzYWdlX2FnZV90aW1lci5leHBpcmVzIC0gamlmZmllcykKKwkJYnBkdS5tZXNzYWdlX2FnZSA9IChqaWZmaWVzIC0gcm9vdC0+ZGVzaWduYXRlZF9hZ2UpCiAJCQkrIE1FU1NBR0VfQUdFX0lOQ1I7CiAJfQogCWJwZHUubWF4X2FnZSA9IGJyLT5tYXhfYWdlOwpAQCAtMTgyLDIwICsxNzksMjEgQEAKIH0KIAogLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYnJfcmVjb3JkX2NvbmZpZ19pbmZvcm1hdGlvbihzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAotCQkJCQkJY29uc3Qgc3RydWN0IGJyX2NvbmZpZ19icGR1ICpicGR1KQorc3RhdGljIHZvaWQgYnJfcmVjb3JkX2NvbmZpZ19pbmZvcm1hdGlvbihzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAorCQkJCQkgY29uc3Qgc3RydWN0IGJyX2NvbmZpZ19icGR1ICpicGR1KQogewogCXAtPmRlc2lnbmF0ZWRfcm9vdCA9IGJwZHUtPnJvb3Q7CiAJcC0+ZGVzaWduYXRlZF9jb3N0ID0gYnBkdS0+cm9vdF9wYXRoX2Nvc3Q7CiAJcC0+ZGVzaWduYXRlZF9icmlkZ2UgPSBicGR1LT5icmlkZ2VfaWQ7CiAJcC0+ZGVzaWduYXRlZF9wb3J0ID0gYnBkdS0+cG9ydF9pZDsKKwlwLT5kZXNpZ25hdGVkX2FnZSA9IGppZmZpZXMgKyBicGR1LT5tZXNzYWdlX2FnZTsKIAogCW1vZF90aW1lcigmcC0+bWVzc2FnZV9hZ2VfdGltZXIsIGppZmZpZXMKIAkJICArIChwLT5ici0+bWF4X2FnZSAtIGJwZHUtPm1lc3NhZ2VfYWdlKSk7CiB9CiAKIC8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwotc3RhdGljIGlubGluZSB2b2lkIGJyX3JlY29yZF9jb25maWdfdGltZW91dF92YWx1ZXMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAorc3RhdGljIHZvaWQgYnJfcmVjb3JkX2NvbmZpZ190aW1lb3V0X3ZhbHVlcyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCiAJCQkJCSAgICBjb25zdCBzdHJ1Y3QgYnJfY29uZmlnX2JwZHUgKmJwZHUpCiB7CiAJYnItPm1heF9hZ2UgPSBicGR1LT5tYXhfYWdlOwpAQCAtMjU0LDcgKzI1Miw4IEBACiB9CiAKIC8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwotc3RhdGljIGludCBicl9zdXBlcnNlZGVzX3BvcnRfaW5mbyhzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBzdHJ1Y3QgYnJfY29uZmlnX2JwZHUgKmJwZHUpCitzdGF0aWMgaW50IGJyX3N1cGVyc2VkZXNfcG9ydF9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkJICAgY29uc3Qgc3RydWN0IGJyX2NvbmZpZ19icGR1ICpicGR1KQogewogCWludCB0OwogCkBAIC0yODUsNyArMjg0LDcgQEAKIH0KIAogLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYnJfdG9wb2xvZ3lfY2hhbmdlX2Fja25vd2xlZGdlZChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCitzdGF0aWMgdm9pZCBicl90b3BvbG9neV9jaGFuZ2VfYWNrbm93bGVkZ2VkKHN0cnVjdCBuZXRfYnJpZGdlICpicikKIHsKIAlici0+dG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkID0gMDsKIAlkZWxfdGltZXIoJmJyLT50Y25fdGltZXIpOwpAQCAtMzI3LDcgKzMyNiw3IEBACiB9CiAKIC8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwotc3RhdGljIGlubGluZSB2b2lkIGJyX3JlcGx5KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCitzdGF0aWMgdm9pZCBicl9yZXBseShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQogewogCWJyX3RyYW5zbWl0X2NvbmZpZyhwKTsKIH0KQEAgLTM2Myw2ICszNjIsOCBAQAogCiAJCXAtPnN0YXRlID0gQlJfU1RBVEVfQkxPQ0tJTkc7CiAJCWJyX2xvZ19zdGF0ZShwKTsKKwkJYnJfaWZpbmZvX25vdGlmeShSVE1fTkVXTElOSywgcCk7CisKIAkJZGVsX3RpbWVyKCZwLT5mb3J3YXJkX2RlbGF5X3RpbWVyKTsKIAl9CiB9CkBAIC0zNzksMTUgKzM4MCwxNCBAQAogCQlwLT5zdGF0ZSA9IEJSX1NUQVRFX0ZPUldBUkRJTkc7CiAJCWJyX3RvcG9sb2d5X2NoYW5nZV9kZXRlY3Rpb24oYnIpOwogCQlkZWxfdGltZXIoJnAtPmZvcndhcmRfZGVsYXlfdGltZXIpOwotCX0KLQllbHNlIGlmIChici0+c3RwX2VuYWJsZWQgPT0gQlJfS0VSTkVMX1NUUCkKKwl9IGVsc2UgaWYgKGJyLT5zdHBfZW5hYmxlZCA9PSBCUl9LRVJORUxfU1RQKQogCQlwLT5zdGF0ZSA9IEJSX1NUQVRFX0xJU1RFTklORzsKIAllbHNlCiAJCXAtPnN0YXRlID0gQlJfU1RBVEVfTEVBUk5JTkc7CiAKIAlicl9tdWx0aWNhc3RfZW5hYmxlX3BvcnQocCk7Ci0KIAlicl9sb2dfc3RhdGUocCk7CisJYnJfaWZpbmZvX25vdGlmeShSVE1fTkVXTElOSywgcCk7CiAKIAlpZiAoYnItPmZvcndhcmRfZGVsYXkgIT0gMCkKIAkJbW9kX3RpbWVyKCZwLT5mb3J3YXJkX2RlbGF5X3RpbWVyLCBqaWZmaWVzICsgYnItPmZvcndhcmRfZGVsYXkpOwpAQCAtNDMxLDE0ICs0MzEsMTUgQEAKIH0KIAogLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYnJfdG9wb2xvZ3lfY2hhbmdlX2Fja25vd2xlZGdlKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCitzdGF0aWMgdm9pZCBicl90b3BvbG9neV9jaGFuZ2VfYWNrbm93bGVkZ2Uoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKIHsKIAlwLT50b3BvbG9neV9jaGFuZ2VfYWNrID0gMTsKIAlicl90cmFuc21pdF9jb25maWcocCk7CiB9CiAKIC8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwotdm9pZCBicl9yZWNlaXZlZF9jb25maWdfYnBkdShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBzdHJ1Y3QgYnJfY29uZmlnX2JwZHUgKmJwZHUpCit2b2lkIGJyX3JlY2VpdmVkX2NvbmZpZ19icGR1KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBicl9jb25maWdfYnBkdSAqYnBkdSkKIHsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7CiAJaW50IHdhc19yb290OwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zdHBfYnBkdS5jIGIvbmV0L2JyaWRnZS9icl9zdHBfYnBkdS5jCmluZGV4IDI4OTY0NmUuLmUxNmFhZGUgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfc3RwX2JwZHUuYworKysgYi9uZXQvYnJpZGdlL2JyX3N0cF9icGR1LmMKQEAgLTIxMCwxMCArMjEwLDE5IEBACiAJCWJwZHUuaGVsbG9fdGltZSA9IGJyX2dldF90aWNrcyhidWYrMjgpOwogCQlicGR1LmZvcndhcmRfZGVsYXkgPSBicl9nZXRfdGlja3MoYnVmKzMwKTsKIAotCQlicl9yZWNlaXZlZF9jb25maWdfYnBkdShwLCAmYnBkdSk7Ci0JfQorCQlpZiAoYnBkdS5tZXNzYWdlX2FnZSA+IGJwZHUubWF4X2FnZSkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlicl9ub3RpY2UocC0+YnIsCisJCQkJCSAgInBvcnQgJXUgY29uZmlnIGZyb20gJXBNIgorCQkJCQkgICIgKG1lc3NhZ2VfYWdlICV1bCA+IG1heF9hZ2UgJXVsKVxuIiwKKwkJCQkJICBwLT5wb3J0X25vLAorCQkJCQkgIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsCisJCQkJCSAgYnBkdS5tZXNzYWdlX2FnZSwgYnBkdS5tYXhfYWdlKTsKKwkJCWdvdG8gb3V0OworCQl9CiAKLQllbHNlIGlmIChidWZbMF0gPT0gQlBEVV9UWVBFX1RDTikgeworCQlicl9yZWNlaXZlZF9jb25maWdfYnBkdShwLCAmYnBkdSk7CisJfSBlbHNlIGlmIChidWZbMF0gPT0gQlBEVV9UWVBFX1RDTikgewogCQlicl9yZWNlaXZlZF90Y25fYnBkdShwKTsKIAl9CiAgb3V0OgpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zdHBfaWYuYyBiL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKaW5kZXggNmY2MTViOC4uMTBlZGEzYyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zdHBfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCkBAIC04OCw2ICs4OCw3IEBACiAJYnJfaW5pdF9wb3J0KHApOwogCWJyX3BvcnRfc3RhdGVfc2VsZWN0aW9uKHAtPmJyKTsKIAlicl9sb2dfc3RhdGUocCk7CisJYnJfaWZpbmZvX25vdGlmeShSVE1fTkVXTElOSywgcCk7CiB9CiAKIC8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwpAQCAtMTA0LDYgKzEwNSw4IEBACiAJcC0+dG9wb2xvZ3lfY2hhbmdlX2FjayA9IDA7CiAJcC0+Y29uZmlnX3BlbmRpbmcgPSAwOwogCisJYnJfaWZpbmZvX25vdGlmeShSVE1fTkVXTElOSywgcCk7CisKIAlkZWxfdGltZXIoJnAtPm1lc3NhZ2VfYWdlX3RpbWVyKTsKIAlkZWxfdGltZXIoJnAtPmZvcndhcmRfZGVsYXlfdGltZXIpOwogCWRlbF90aW1lcigmcC0+aG9sZF90aW1lcik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N0cF90aW1lci5jIGIvbmV0L2JyaWRnZS9icl9zdHBfdGltZXIuYwppbmRleCAzZTk2NTE0Li41OGRlMmEwIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N0cF90aW1lci5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3RwX3RpbWVyLmMKQEAgLTk3LDYgKzk3LDcgQEAKIAkJbmV0aWZfY2Fycmllcl9vbihici0+ZGV2KTsKIAl9CiAJYnJfbG9nX3N0YXRlKHApOworCWJyX2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIHApOwogCXNwaW5fdW5sb2NrKCZici0+bG9jayk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jCmluZGV4IDI2Mzc3ZTkuLmJmMmEzMzMgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYwpAQCAtMjE2LDcgKzIxNiw2IEBACiBubG1zZ19mYWlsdXJlOgogCXByX2RlYnVnKCJlcnJvciBkdXJpbmcgTkxNU0dfUFVULiBUaGlzIHNob3VsZCAiCiAJCSAibm90IGhhcHBlbiwgcGxlYXNlIHJlcG9ydCB0byBhdXRob3IuXG4iKTsKLQlnb3RvIHVubG9jazsKIGFsbG9jX2ZhaWx1cmU6CiAJZ290byB1bmxvY2s7CiB9CmRpZmYgLS1naXQgYS9uZXQvY2FpZi9jYWlmX2Rldi5jIGIvbmV0L2NhaWYvY2FpZl9kZXYuYwppbmRleCA2ODJjMGZlLi43YzJmYTBhIDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jYWlmX2Rldi5jCisrKyBiL25ldC9jYWlmL2NhaWZfZGV2LmMKQEAgLTExLDcgKzExLDYgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiVzKCk6ICIgZm10LCBfX2Z1bmNfXwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2ZtdXhsLmMgYi9uZXQvY2FpZi9jZm11eGwuYwppbmRleCAzYTY2YjhjLi5jMjM5NzllIDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jZm11eGwuYworKysgYi9uZXQvY2FpZi9jZm11eGwuYwpAQCAtMjU1LDcgKzI1NSw3IEBACiAKIAkJaWYgKGNmc3J2bF9waHlpZF9tYXRjaChsYXllciwgcGh5aWQpICYmIGxheWVyLT5jdHJsY21kKSB7CiAKLQkJCWlmICgoY3RybCA9PSBfQ0FJRl9DVFJMQ01EX1BIWUlGX0ZMT1dfT0ZGX0lORCB8fAorCQkJaWYgKChjdHJsID09IF9DQUlGX0NUUkxDTURfUEhZSUZfRE9XTl9JTkQgfHwKIAkJCQljdHJsID09IENBSUZfQ1RSTENNRF9SRU1PVEVfU0hVVERPV05fSU5EKSAmJgogCQkJCQlsYXllci0+aWQgIT0gMCkgewogCmRpZmYgLS1naXQgYS9uZXQvY2FpZi9jaG5sX25ldC5jIGIvbmV0L2NhaWYvY2hubF9uZXQuYwppbmRleCBhZGJiNDI0Li44NjU2OTA5IDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jaG5sX25ldC5jCisrKyBiL25ldC9jYWlmL2NobmxfbmV0LmMKQEAgLTcsOCArNyw4IEBACiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjolcygpOiAiIGZtdCwgX19mdW5jX18KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9uZXQvY2FuL2FmX2Nhbi5jIGIvbmV0L2Nhbi9hZl9jYW4uYwppbmRleCAwOTRmYzUzLi44Y2U5MjZkIDEwMDY0NAotLS0gYS9uZXQvY2FuL2FmX2Nhbi5jCisrKyBiL25ldC9jYW4vYWZfY2FuLmMKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9jYW4uaD4KICNpbmNsdWRlIDxsaW51eC9jYW4vY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIApAQCAtMTYxLDggKzE2Miw4IEBACiAJCSAqIHJldHVybiB0aGUgZXJyb3IgY29kZSBpbW1lZGlhdGVseS4gIEJlbG93IHdlIHdpbGwKIAkJICogcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQKIAkJICovCi0JCWlmIChlcnIgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJjYW46IHJlcXVlc3RfbW9kdWxlICIKKwkJaWYgKGVycikKKwkJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUiAiY2FuOiByZXF1ZXN0X21vZHVsZSAiCiAJCQkgICAgICAgIihjYW4tcHJvdG8tJWQpIGZhaWxlZC5cbiIsIHByb3RvY29sKTsKIAogCQljcCA9IGNhbl9nZXRfcHJvdG8ocHJvdG9jb2wpOwpkaWZmIC0tZ2l0IGEvbmV0L2Nhbi9iY20uYyBiL25ldC9jYW4vYmNtLmMKaW5kZXggMTg0YTY1Ny4uZDZjOGFlNSAxMDA2NDQKLS0tIGEvbmV0L2Nhbi9iY20uYworKysgYi9uZXQvY2FuL2JjbS5jCkBAIC00Myw2ICs0Myw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CmRpZmYgLS1naXQgYS9uZXQvY2VwaC9jZXBoX2ZzLmMgYi9uZXQvY2VwaC9jZXBoX2ZzLmMKaW5kZXggYTNhM2EzMS4uNDE0NjZjYyAxMDA2NDQKLS0tIGEvbmV0L2NlcGgvY2VwaF9mcy5jCisrKyBiL25ldC9jZXBoL2NlcGhfZnMuYwpAQCAtMzYsMTYgKzM2LDE5IEBACiAJaWYgKChmbGFncyAmIE9fRElSRUNUT1JZKSA9PSBPX0RJUkVDVE9SWSkKIAkJcmV0dXJuIENFUEhfRklMRV9NT0RFX1BJTjsKICNlbmRpZgotCWlmICgoZmxhZ3MgJiBPX0FQUEVORCkgPT0gT19BUFBFTkQpCi0JCWZsYWdzIHw9IE9fV1JPTkxZOwogCi0JaWYgKChmbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRFdSKQotCQltb2RlID0gQ0VQSF9GSUxFX01PREVfUkRXUjsKLQllbHNlIGlmICgoZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZKQorCXN3aXRjaCAoZmxhZ3MgJiBPX0FDQ01PREUpIHsKKwljYXNlIE9fV1JPTkxZOgogCQltb2RlID0gQ0VQSF9GSUxFX01PREVfV1I7Ci0JZWxzZQorCQlicmVhazsKKwljYXNlIE9fUkRPTkxZOgogCQltb2RlID0gQ0VQSF9GSUxFX01PREVfUkQ7Ci0KKwkJYnJlYWs7CisJY2FzZSBPX1JEV1I6CisJY2FzZSBPX0FDQ01PREU6IC8qIHRoaXMgaXMgd2hhdCB0aGUgVkZTIGRvZXMgKi8KKwkJbW9kZSA9IENFUEhfRklMRV9NT0RFX1JEV1I7CisJCWJyZWFrOworCX0KICNpZmRlZiBPX0xBWlkKIAlpZiAoZmxhZ3MgJiBPX0xBWlkpCiAJCW1vZGUgfD0gQ0VQSF9GSUxFX01PREVfTEFaWTsKZGlmZiAtLWdpdCBhL25ldC9jZXBoL2NyeXB0by5jIGIvbmV0L2NlcGgvY3J5cHRvLmMKaW5kZXggNWE4MDA5Yy4uODVmM2JjMCAxMDA2NDQKLS0tIGEvbmV0L2NlcGgvY3J5cHRvLmMKKysrIGIvbmV0L2NlcGgvY3J5cHRvLmMKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCQlnb3RvIGVycjsKIAogCS8qIFRPRE8gY2VwaF9jcnlwdG9fa2V5X2RlY29kZSBzaG91bGQgcmVhbGx5IHRha2UgY29uc3QgaW5wdXQgKi8KLQlwID0gKHZvaWQqKWRhdGE7CisJcCA9ICh2b2lkICopZGF0YTsKIAlyZXQgPSBjZXBoX2NyeXB0b19rZXlfZGVjb2RlKGNrZXksICZwLCAoY2hhciopZGF0YStkYXRhbGVuKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfY2tleTsKZGlmZiAtLWdpdCBhL25ldC9jZXBoL29zZF9jbGllbnQuYyBiL25ldC9jZXBoL29zZF9jbGllbnQuYwppbmRleCA2ZWEyYjg5Li43MzMwYzI3IDEwMDY0NAotLS0gYS9uZXQvY2VwaC9vc2RfY2xpZW50LmMKKysrIGIvbmV0L2NlcGgvb3NkX2NsaWVudC5jCkBAIC00NzcsOCArNDc3LDkgQEAKIAljYWxjX2xheW91dChvc2RjLCB2aW5vLCBsYXlvdXQsIG9mZiwgcGxlbiwgcmVxLCBvcHMpOwogCXJlcS0+cl9maWxlX2xheW91dCA9ICpsYXlvdXQ7ICAvKiBrZWVwIGEgY29weSAqLwogCi0JLyogaW4gY2FzZSBpdCBkaWZmZXJzIGZyb20gbmF0dXJhbCBhbGlnbm1lbnQgdGhhdCBjYWxjX2xheW91dAotCSAgIGZpbGxlZCBpbiBmb3IgdXMgKi8KKwkvKiBpbiBjYXNlIGl0IGRpZmZlcnMgZnJvbSBuYXR1cmFsIChmaWxlKSBhbGlnbm1lbnQgdGhhdAorCSAgIGNhbGNfbGF5b3V0IGZpbGxlZCBpbiBmb3IgdXMgKi8KKwlyZXEtPnJfbnVtX3BhZ2VzID0gY2FsY19wYWdlc19mb3IocGFnZV9hbGlnbiwgKnBsZW4pOwogCXJlcS0+cl9wYWdlX2FsaWdubWVudCA9IHBhZ2VfYWxpZ247CiAKIAljZXBoX29zZGNfYnVpbGRfcmVxdWVzdChyZXEsIG9mZiwgcGxlbiwgb3BzLApAQCAtMTE0NCw2ICsxMTQ1LDEzIEBACiAJCQkgICAgICByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKGRlbGF5KSk7CiB9CiAKK3N0YXRpYyB2b2lkIGNvbXBsZXRlX3JlcXVlc3Qoc3RydWN0IGNlcGhfb3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpZiAocmVxLT5yX3NhZmVfY2FsbGJhY2spCisJCXJlcS0+cl9zYWZlX2NhbGxiYWNrKHJlcSwgTlVMTCk7CisJY29tcGxldGVfYWxsKCZyZXEtPnJfc2FmZV9jb21wbGV0aW9uKTsgIC8qIGZzeW5jIHdhaXRlciAqLworfQorCiAvKgogICogaGFuZGxlIG9zZCBvcCByZXBseS4gIGVpdGhlciBjYWxsIHRoZSBjYWxsYmFjayBpZiBpdCBpcyBzcGVjaWZpZWQsCiAgKiBvciBkbyB0aGUgY29tcGxldGlvbiB0byB3YWtlIHVwIHRoZSB3YWl0aW5nIHRocmVhZC4KQEAgLTEyMjYsMTEgKzEyMzQsOCBAQAogCWVsc2UKIAkJY29tcGxldGVfYWxsKCZyZXEtPnJfY29tcGxldGlvbik7CiAKLQlpZiAoZmxhZ3MgJiBDRVBIX09TRF9GTEFHX09ORElTSykgewotCQlpZiAocmVxLT5yX3NhZmVfY2FsbGJhY2spCi0JCQlyZXEtPnJfc2FmZV9jYWxsYmFjayhyZXEsIG1zZyk7Ci0JCWNvbXBsZXRlX2FsbCgmcmVxLT5yX3NhZmVfY29tcGxldGlvbik7ICAvKiBmc3luYyB3YWl0ZXIgKi8KLQl9CisJaWYgKGZsYWdzICYgQ0VQSF9PU0RfRkxBR19PTkRJU0spCisJCWNvbXBsZXRlX3JlcXVlc3QocmVxKTsKIAogZG9uZToKIAlkb3V0KCJyZXE9JXAgcmVxLT5yX2xpbmdlcj0lZFxuIiwgcmVxLCByZXEtPnJfbGluZ2VyKTsKQEAgLTE3MzIsNiArMTczNyw3IEBACiAJCV9fY2FuY2VsX3JlcXVlc3QocmVxKTsKIAkJX191bnJlZ2lzdGVyX3JlcXVlc3Qob3NkYywgcmVxKTsKIAkJbXV0ZXhfdW5sb2NrKCZvc2RjLT5yZXF1ZXN0X211dGV4KTsKKwkJY29tcGxldGVfcmVxdWVzdChyZXEpOwogCQlkb3V0KCJ3YWl0X3JlcXVlc3QgdGlkICVsbHUgY2FuY2VsZWQvdGltZWQgb3V0XG4iLCByZXEtPnJfdGlkKTsKIAkJcmV0dXJuIHJjOwogCX0KQEAgLTIwMjIsOCArMjAyOCw5IEBACiAJCWludCB3YW50ID0gY2FsY19wYWdlc19mb3IocmVxLT5yX3BhZ2VfYWxpZ25tZW50LCBkYXRhX2xlbik7CiAKIAkJaWYgKHVubGlrZWx5KHJlcS0+cl9udW1fcGFnZXMgPCB3YW50KSkgewotCQkJcHJfd2FybmluZygidGlkICVsbGQgcmVwbHkgJWQgPiBleHBlY3RlZCAlZCBwYWdlc1xuIiwKLQkJCQkgICB0aWQsIHdhbnQsIG0tPm5yX3BhZ2VzKTsKKwkJCXByX3dhcm5pbmcoInRpZCAlbGxkIHJlcGx5IGhhcyAlZCBieXRlcyAlZCBwYWdlcywgd2UiCisJCQkJICAgIiBoYWQgb25seSAlZCBwYWdlcyByZWFkeVxuIiwgdGlkLCBkYXRhX2xlbiwKKwkJCQkgICB3YW50LCByZXEtPnJfbnVtX3BhZ2VzKTsKIAkJCSpza2lwID0gMTsKIAkJCWNlcGhfbXNnX3B1dChtKTsKIAkJCW0gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCA5MzkzMDc4Li45NDQ0YzVjIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtMTk5LDYgKzE5OSwxMSBAQAogREVGSU5FX1JXTE9DSyhkZXZfYmFzZV9sb2NrKTsKIEVYUE9SVF9TWU1CT0woZGV2X2Jhc2VfbG9jayk7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXZfYmFzZV9zZXFfaW5jKHN0cnVjdCBuZXQgKm5ldCkKK3sKKwl3aGlsZSAoKytuZXQtPmRldl9iYXNlX3NlcSA9PSAwKTsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgaGxpc3RfaGVhZCAqZGV2X25hbWVfaGFzaChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJdW5zaWduZWQgaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKG5hbWUsIHN0cm5sZW4obmFtZSwgSUZOQU1TSVopKTsKQEAgLTIzNyw2ICsyNDIsOSBAQAogCWhsaXN0X2FkZF9oZWFkX3JjdSgmZGV2LT5pbmRleF9obGlzdCwKIAkJCSAgIGRldl9pbmRleF9oYXNoKG5ldCwgZGV2LT5pZmluZGV4KSk7CiAJd3JpdGVfdW5sb2NrX2JoKCZkZXZfYmFzZV9sb2NrKTsKKworCWRldl9iYXNlX3NlcV9pbmMobmV0KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yNTMsNiArMjYxLDggQEAKIAlobGlzdF9kZWxfcmN1KCZkZXYtPm5hbWVfaGxpc3QpOwogCWhsaXN0X2RlbF9yY3UoJmRldi0+aW5kZXhfaGxpc3QpOwogCXdyaXRlX3VubG9ja19iaCgmZGV2X2Jhc2VfbG9jayk7CisKKwlkZXZfYmFzZV9zZXFfaW5jKGRldl9uZXQoZGV2KSk7CiB9CiAKIC8qCkBAIC0yNTMyLDcgKzI1NDIsNyBAQAogCQkJZ290byBkb25lOwogCiAJCWlwID0gKGNvbnN0IHN0cnVjdCBpcGhkciAqKSAoc2tiLT5kYXRhICsgbmhvZmYpOwotCQlpZiAoaXAtPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKQorCQlpZiAoaXBfaXNfZnJhZ21lbnQoaXApKQogCQkJaXBfcHJvdG8gPSAwOwogCQllbHNlCiAJCQlpcF9wcm90byA9IGlwLT5wcm90b2NvbDsKQEAgLTMxMTQsNyArMzEyNCw3IEBACiAKIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwotCXNrYi0+bWFjX2xlbiA9IHNrYi0+bmV0d29ya19oZWFkZXIgLSBza2ItPm1hY19oZWFkZXI7CisJc2tiX3Jlc2V0X21hY19sZW4oc2tiKTsKIAogCXB0X3ByZXYgPSBOVUxMOwogCkBAIC01MTk5LDcgKzUyMDksNyBAQAogCWxpc3RfZGVsKCZzaW5nbGUpOwogfQogCi11MzIgbmV0ZGV2X2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgdTMyIG5ldGRldl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQogewogCS8qIEZpeCBpbGxlZ2FsIGNoZWNrc3VtIGNvbWJpbmF0aW9ucyAqLwogCWlmICgoZmVhdHVyZXMgJiBORVRJRl9GX0hXX0NTVU0pICYmCkBAIC01MjU4LDcgKzUyNjgsNiBAQAogCiAJcmV0dXJuIGZlYXR1cmVzOwogfQotRVhQT1JUX1NZTUJPTChuZXRkZXZfZml4X2ZlYXR1cmVzKTsKIAogaW50IF9fbmV0ZGV2X3VwZGF0ZV9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtNTQ3OCwxMSArNTQ4Nyw5IEBACiAJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9OT0NBQ0hFX0NPUFk7CiAJfQogCi0JLyogRW5hYmxlIEdSTyBhbmQgTkVUSUZfRl9ISUdIRE1BIGZvciB2bGFucyBieSBkZWZhdWx0LAotCSAqIHZsYW5fZGV2X2luaXQoKSB3aWxsIGRvIHRoZSBkZXYtPmZlYXR1cmVzIGNoZWNrLCBzbyB0aGVzZSBmZWF0dXJlcwotCSAqIGFyZSBlbmFibGVkIG9ubHkgaWYgc3VwcG9ydGVkIGJ5IHVuZGVybHlpbmcgZGV2aWNlLgorCS8qIE1ha2UgTkVUSUZfRl9ISUdIRE1BIGluaGVyaXRhYmxlIHRvIFZMQU4gZGV2aWNlcy4KIAkgKi8KLQlkZXYtPnZsYW5fZmVhdHVyZXMgfD0gKE5FVElGX0ZfR1JPIHwgTkVUSUZfRl9ISUdIRE1BKTsKKwlkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwogCiAJcmV0ID0gY2FsbF9uZXRkZXZpY2Vfbm90aWZpZXJzKE5FVERFVl9QT1NUX0lOSVQsIGRldik7CiAJcmV0ID0gbm90aWZpZXJfdG9fZXJybm8ocmV0KTsKQEAgLTU4NjcsOCArNTg3NCw2IEBACiAKIAlkZXYtPmdzb19tYXhfc2l6ZSA9IEdTT19NQVhfU0laRTsKIAotCUlOSVRfTElTVF9IRUFEKCZkZXYtPmV0aHRvb2xfbnR1cGxlX2xpc3QubGlzdCk7Ci0JZGV2LT5ldGh0b29sX250dXBsZV9saXN0LmNvdW50ID0gMDsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5uYXBpX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPnVucmVnX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmxpbmtfd2F0Y2hfbGlzdCk7CkBAIC01OTMyLDkgKzU5MzcsNiBAQAogCS8qIEZsdXNoIGRldmljZSBhZGRyZXNzZXMgKi8KIAlkZXZfYWRkcl9mbHVzaChkZXYpOwogCi0JLyogQ2xlYXIgZXRodG9vbCBuLXR1cGxlIGxpc3QgKi8KLQlldGh0b29sX250dXBsZV9mbHVzaChkZXYpOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG4sICZkZXYtPm5hcGlfbGlzdCwgZGV2X2xpc3QpCiAJCW5ldGlmX25hcGlfZGVsKHApOwogCkBAIC02MTc4LDYgKzYxODAsMTEgQEAKIAkJb2xkc2QtPm91dHB1dF9xdWV1ZSA9IE5VTEw7CiAJCW9sZHNkLT5vdXRwdXRfcXVldWVfdGFpbHAgPSAmb2xkc2QtPm91dHB1dF9xdWV1ZTsKIAl9CisJLyogQXBwZW5kIE5BUEkgcG9sbCBsaXN0IGZyb20gb2ZmbGluZSBDUFUuICovCisJaWYgKCFsaXN0X2VtcHR5KCZvbGRzZC0+cG9sbF9saXN0KSkgeworCQlsaXN0X3NwbGljZV9pbml0KCZvbGRzZC0+cG9sbF9saXN0LCAmc2QtPnBvbGxfbGlzdCk7CisJCXJhaXNlX3NvZnRpcnFfaXJxb2ZmKE5FVF9SWF9TT0ZUSVJRKTsKKwl9CiAKIAlyYWlzZV9zb2Z0aXJxX2lycW9mZihORVRfVFhfU09GVElSUSk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwpAQCAtNjI2NCwyOSArNjI3MSwyMyBAQAogLyoqCiAgKgluZXRkZXZfZHJpdmVybmFtZSAtIG5ldHdvcmsgZHJpdmVyIGZvciB0aGUgZGV2aWNlCiAgKglAZGV2OiBuZXR3b3JrIGRldmljZQotICoJQGJ1ZmZlcjogYnVmZmVyIGZvciByZXN1bHRpbmcgbmFtZQotICoJQGxlbjogc2l6ZSBvZiBidWZmZXIKICAqCiAgKglEZXRlcm1pbmUgbmV0d29yayBkcml2ZXIgZm9yIGRldmljZS4KICAqLwotY2hhciAqbmV0ZGV2X2RyaXZlcm5hbWUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQorY29uc3QgY2hhciAqbmV0ZGV2X2RyaXZlcm5hbWUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAljb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyOwogCWNvbnN0IHN0cnVjdCBkZXZpY2UgKnBhcmVudDsKLQotCWlmIChsZW4gPD0gMCB8fCAhYnVmZmVyKQotCQlyZXR1cm4gYnVmZmVyOwotCWJ1ZmZlclswXSA9IDA7CisJY29uc3QgY2hhciAqZW1wdHkgPSAiIjsKIAogCXBhcmVudCA9IGRldi0+ZGV2LnBhcmVudDsKLQogCWlmICghcGFyZW50KQotCQlyZXR1cm4gYnVmZmVyOworCQlyZXR1cm4gZW1wdHk7CiAKIAlkcml2ZXIgPSBwYXJlbnQtPmRyaXZlcjsKIAlpZiAoZHJpdmVyICYmIGRyaXZlci0+bmFtZSkKLQkJc3RybGNweShidWZmZXIsIGRyaXZlci0+bmFtZSwgbGVuKTsKLQlyZXR1cm4gYnVmZmVyOworCQlyZXR1cm4gZHJpdmVyLT5uYW1lOworCXJldHVybiBlbXB0eTsKIH0KIAogc3RhdGljIGludCBfX25ldGRldl9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kc3QuYyBiL25ldC9jb3JlL2RzdC5jCmluZGV4IDljY2NhMDMuLjE0YjMzYmFmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kc3QuYworKysgYi9uZXQvY29yZS9kc3QuYwpAQCAtMTcxLDggKzE3MSw3IEBACiAJZHN0X2luaXRfbWV0cmljcyhkc3QsIGRzdF9kZWZhdWx0X21ldHJpY3MsIHRydWUpOwogCWRzdC0+ZXhwaXJlcyA9IDBVTDsKIAlkc3QtPnBhdGggPSBkc3Q7Ci0JZHN0LT5uZWlnaGJvdXIgPSBOVUxMOwotCWRzdC0+aGggPSBOVUxMOworCWRzdC0+X25laWdoYm91ciA9IE5VTEw7CiAjaWZkZWYgQ09ORklHX1hGUk0KIAlkc3QtPnhmcm0gPSBOVUxMOwogI2VuZGlmCkBAIC0xOTAsNyArMTg5LDggQEAKIAlkc3QtPmxhc3R1c2UgPSBqaWZmaWVzOwogCWRzdC0+ZmxhZ3MgPSBmbGFnczsKIAlkc3QtPm5leHQgPSBOVUxMOwotCWRzdF9lbnRyaWVzX2FkZChvcHMsIDEpOworCWlmICghKGZsYWdzICYgRFNUX05PQ09VTlQpKQorCQlkc3RfZW50cmllc19hZGQob3BzLCAxKTsKIAlyZXR1cm4gZHN0OwogfQogRVhQT1JUX1NZTUJPTChkc3RfYWxsb2MpOwpAQCAtMjI1LDI1ICsyMjUsMjAgQEAKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpjaGlsZDsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKLQlzdHJ1Y3QgaGhfY2FjaGUgKmhoOwogCiAJc21wX3JtYigpOwogCiBhZ2FpbjoKLQluZWlnaCA9IGRzdC0+bmVpZ2hib3VyOwotCWhoID0gZHN0LT5oaDsKKwluZWlnaCA9IGRzdC0+X25laWdoYm91cjsKIAljaGlsZCA9IGRzdC0+Y2hpbGQ7CiAKLQlkc3QtPmhoID0gTlVMTDsKLQlpZiAoaGgpCi0JCWhoX2NhY2hlX3B1dChoaCk7Ci0KIAlpZiAobmVpZ2gpIHsKLQkJZHN0LT5uZWlnaGJvdXIgPSBOVUxMOworCQlkc3QtPl9uZWlnaGJvdXIgPSBOVUxMOwogCQluZWlnaF9yZWxlYXNlKG5laWdoKTsKIAl9CiAKLQlkc3RfZW50cmllc19hZGQoZHN0LT5vcHMsIC0xKTsKKwlpZiAoIShkc3QtPmZsYWdzICYgRFNUX05PQ09VTlQpKQorCQlkc3RfZW50cmllc19hZGQoZHN0LT5vcHMsIC0xKTsKIAogCWlmIChkc3QtPm9wcy0+ZGVzdHJveSkKIAkJZHN0LT5vcHMtPmRlc3Ryb3koZHN0KTsKQEAgLTM2OCw4ICszNjMsOCBAQAogCQlkc3QtPmRldiA9IGRldl9uZXQoZHN0LT5kZXYpLT5sb29wYmFja19kZXY7CiAJCWRldl9ob2xkKGRzdC0+ZGV2KTsKIAkJZGV2X3B1dChkZXYpOwotCQlpZiAoZHN0LT5uZWlnaGJvdXIgJiYgZHN0LT5uZWlnaGJvdXItPmRldiA9PSBkZXYpIHsKLQkJCWRzdC0+bmVpZ2hib3VyLT5kZXYgPSBkc3QtPmRldjsKKwkJaWYgKGRzdC0+X25laWdoYm91ciAmJiBkc3QtPl9uZWlnaGJvdXItPmRldiA9PSBkZXYpIHsKKwkJCWRzdC0+X25laWdoYm91ci0+ZGV2ID0gZHN0LT5kZXY7CiAJCQlkZXZfaG9sZChkc3QtPmRldik7CiAJCQlkZXZfcHV0KGRldik7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2V0aHRvb2wuYyBiL25ldC9jb3JlL2V0aHRvb2wuYwppbmRleCBmZDE0MTE2Li42Y2RiYTVmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9ldGh0b29sLmMKKysrIGIvbmV0L2NvcmUvZXRodG9vbC5jCkBAIC0xNjksMTggKzE2OSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGV0aHRvb2xfb3Bfc2V0X2ZsYWdzKTsKIAotdm9pZCBldGh0b29sX250dXBsZV9mbHVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBldGh0b29sX3J4X250dXBsZV9mbG93X3NwZWNfY29udGFpbmVyICpmc2MsICpmOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZzYywgZiwgJmRldi0+ZXRodG9vbF9udHVwbGVfbGlzdC5saXN0LCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZmc2MtPmxpc3QpOwotCQlrZnJlZShmc2MpOwotCX0KLQlkZXYtPmV0aHRvb2xfbnR1cGxlX2xpc3QuY291bnQgPSAwOwotfQotRVhQT1JUX1NZTUJPTChldGh0b29sX250dXBsZV9mbHVzaCk7Ci0KIC8qIEhhbmRsZXJzIGZvciBlYWNoIGV0aHRvb2wgY29tbWFuZCAqLwogCiAjZGVmaW5lIEVUSFRPT0xfREVWX0ZFQVRVUkVfV09SRFMJMQpAQCAtODY1LDM0ICs4NTMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fcnhfbnR1cGxlX2ZpbHRlcl9hZGQoc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlX2xpc3QgKmxpc3QsCi0JCQlzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGVfZmxvd19zcGVjICpzcGVjLAotCQkJc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlX2Zsb3dfc3BlY19jb250YWluZXIgKmZzYykKLXsKLQotCS8qIGRvbid0IGFkZCBmaWx0ZXJzIGZvcmV2ZXIgKi8KLQlpZiAobGlzdC0+Y291bnQgPj0gRVRIVE9PTF9NQVhfTlRVUExFX0xJU1RfRU5UUlkpIHsKLQkJLyogZnJlZSB0aGUgY29udGFpbmVyICovCi0JCWtmcmVlKGZzYyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBDb3B5IHRoZSB3aG9sZSBmaWx0ZXIgb3ZlciAqLwotCWZzYy0+ZnMuZmxvd190eXBlID0gc3BlYy0+Zmxvd190eXBlOwotCW1lbWNweSgmZnNjLT5mcy5oX3UsICZzcGVjLT5oX3UsIHNpemVvZihzcGVjLT5oX3UpKTsKLQltZW1jcHkoJmZzYy0+ZnMubV91LCAmc3BlYy0+bV91LCBzaXplb2Yoc3BlYy0+bV91KSk7Ci0KLQlmc2MtPmZzLnZsYW5fdGFnID0gc3BlYy0+dmxhbl90YWc7Ci0JZnNjLT5mcy52bGFuX3RhZ19tYXNrID0gc3BlYy0+dmxhbl90YWdfbWFzazsKLQlmc2MtPmZzLmRhdGEgPSBzcGVjLT5kYXRhOwotCWZzYy0+ZnMuZGF0YV9tYXNrID0gc3BlYy0+ZGF0YV9tYXNrOwotCWZzYy0+ZnMuYWN0aW9uID0gc3BlYy0+YWN0aW9uOwotCi0JLyogYWRkIHRvIHRoZSBsaXN0ICovCi0JbGlzdF9hZGRfdGFpbF9yY3UoJmZzYy0+bGlzdCwgJmxpc3QtPmxpc3QpOwotCWxpc3QtPmNvdW50Kys7Ci19Ci0KIC8qCiAgKiBldGh0b29sIGRvZXMgbm90IChvciBkaWQgbm90KSBzZXQgbWFza3MgZm9yIGZsb3cgcGFyYW1ldGVycyB0aGF0IGFyZQogICogbm90IHNwZWNpZmllZCwgc28gaWYgYm90aCB2YWx1ZSBhbmQgbWFzayBhcmUgMCB0aGVuIHRoaXMgbXVzdCBiZQpAQCAtOTMwLDggKzg5MCw2IEBACiB7CiAJc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlIGNtZDsKIAljb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgKm9wcyA9IGRldi0+ZXRodG9vbF9vcHM7Ci0Jc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlX2Zsb3dfc3BlY19jb250YWluZXIgKmZzYyA9IE5VTEw7Ci0JaW50IHJldDsKIAogCWlmICghb3BzLT5zZXRfcnhfbnR1cGxlKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC05NDQsMjY5ICs5MDIsNyBAQAogCiAJcnhfbnR1cGxlX2ZpeF9tYXNrcygmY21kLmZzKTsKIAotCS8qCi0JICogQ2FjaGUgZmlsdGVyIGluIGRldiBzdHJ1Y3QgZm9yIEdFVCBvcGVyYXRpb24gb25seSBpZgotCSAqIHRoZSB1bmRlcmx5aW5nIGRyaXZlciBkb2Vzbid0IGhhdmUgaXRzIG93biBHRVQgb3BlcmF0aW9uLCBhbmQKLQkgKiBvbmx5IGlmIHRoZSBmaWx0ZXIgd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseS4gIEZpcnN0IG1ha2Ugc3VyZSB3ZQotCSAqIGNhbiBhbGxvY2F0ZSB0aGUgZmlsdGVyLCB0aGVuIGNvbnRpbnVlIGlmIHN1Y2Nlc3NmdWwuCi0JICovCi0JaWYgKCFvcHMtPmdldF9yeF9udHVwbGUpIHsKLQkJZnNjID0ga21hbGxvYyhzaXplb2YoKmZzYyksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWZzYykKLQkJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXJldCA9IG9wcy0+c2V0X3J4X250dXBsZShkZXYsICZjbWQpOwotCWlmIChyZXQpIHsKLQkJa2ZyZWUoZnNjKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoIW9wcy0+Z2V0X3J4X250dXBsZSkKLQkJX19yeF9udHVwbGVfZmlsdGVyX2FkZCgmZGV2LT5ldGh0b29sX250dXBsZV9saXN0LCAmY21kLmZzLCBmc2MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBldGh0b29sX2dldF9yeF9udHVwbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCBfX3VzZXIgKnVzZXJhZGRyKQotewotCXN0cnVjdCBldGh0b29sX2dzdHJpbmdzIGdzdHJpbmdzOwotCWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqb3BzID0gZGV2LT5ldGh0b29sX29wczsKLQlzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGVfZmxvd19zcGVjX2NvbnRhaW5lciAqZnNjOwotCXU4ICpkYXRhOwotCWNoYXIgKnA7Ci0JaW50IHJldCwgaSwgbnVtX3N0cmluZ3MgPSAwOwotCi0JaWYgKCFvcHMtPmdldF9zc2V0X2NvdW50KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmdzdHJpbmdzLCB1c2VyYWRkciwgc2l6ZW9mKGdzdHJpbmdzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0ID0gb3BzLT5nZXRfc3NldF9jb3VudChkZXYsIGdzdHJpbmdzLnN0cmluZ19zZXQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZ3N0cmluZ3MubGVuID0gcmV0OwotCi0JZGF0YSA9IGt6YWxsb2MoZ3N0cmluZ3MubGVuICogRVRIX0dTVFJJTkdfTEVOLCBHRlBfVVNFUik7Ci0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChvcHMtPmdldF9yeF9udHVwbGUpIHsKLQkJLyogZHJpdmVyLXNwZWNpZmljIGZpbHRlciBncmFiICovCi0JCXJldCA9IG9wcy0+Z2V0X3J4X250dXBsZShkZXYsIGdzdHJpbmdzLnN0cmluZ19zZXQsIGRhdGEpOwotCQlnb3RvIGNvcHk7Ci0JfQotCi0JLyogZGVmYXVsdCBldGh0b29sIGZpbHRlciBncmFiICovCi0JaSA9IDA7Ci0JcCA9IChjaGFyICopZGF0YTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZzYywgJmRldi0+ZXRodG9vbF9udHVwbGVfbGlzdC5saXN0LCBsaXN0KSB7Ci0JCXNwcmludGYocCwgIkZpbHRlciAlZDpcbiIsIGkpOwotCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJbnVtX3N0cmluZ3MrKzsKLQotCQlzd2l0Y2ggKGZzYy0+ZnMuZmxvd190eXBlKSB7Ci0JCWNhc2UgVENQX1Y0X0ZMT1c6Ci0JCQlzcHJpbnRmKHAsICJcdEZsb3cgVHlwZTogVENQXG4iKTsKLQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJbnVtX3N0cmluZ3MrKzsKLQkJCWJyZWFrOwotCQljYXNlIFVEUF9WNF9GTE9XOgotCQkJc3ByaW50ZihwLCAiXHRGbG93IFR5cGU6IFVEUFxuIik7Ci0JCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCW51bV9zdHJpbmdzKys7Ci0JCQlicmVhazsKLQkJY2FzZSBTQ1RQX1Y0X0ZMT1c6Ci0JCQlzcHJpbnRmKHAsICJcdEZsb3cgVHlwZTogU0NUUFxuIik7Ci0JCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCW51bV9zdHJpbmdzKys7Ci0JCQlicmVhazsKLQkJY2FzZSBBSF9FU1BfVjRfRkxPVzoKLQkJCXNwcmludGYocCwgIlx0RmxvdyBUeXBlOiBBSCBFU1BcbiIpOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVNQX1Y0X0ZMT1c6Ci0JCQlzcHJpbnRmKHAsICJcdEZsb3cgVHlwZTogRVNQXG4iKTsKLQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJbnVtX3N0cmluZ3MrKzsKLQkJCWJyZWFrOwotCQljYXNlIElQX1VTRVJfRkxPVzoKLQkJCXNwcmludGYocCwgIlx0RmxvdyBUeXBlOiBSYXcgSVBcbiIpOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBWNF9GTE9XOgotCQkJc3ByaW50ZihwLCAiXHRGbG93IFR5cGU6IElQdjRcbiIpOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHAsICJcdEZsb3cgVHlwZTogVW5rbm93blxuIik7Ci0JCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCW51bV9zdHJpbmdzKys7Ci0JCQlnb3RvIHVua25vd25fZmlsdGVyOwotCQl9Ci0KLQkJLyogbm93IHRoZSByZXN0IG9mIHRoZSBmaWx0ZXJzICovCi0JCXN3aXRjaCAoZnNjLT5mcy5mbG93X3R5cGUpIHsKLQkJY2FzZSBUQ1BfVjRfRkxPVzoKLQkJY2FzZSBVRFBfVjRfRkxPVzoKLQkJY2FzZSBTQ1RQX1Y0X0ZMT1c6Ci0JCQlzcHJpbnRmKHAsICJcdFNyYyBJUCBhZGRyOiAweCV4XG4iLAotCQkJCWZzYy0+ZnMuaF91LnRjcF9pcDRfc3BlYy5pcDRzcmMpOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJc3ByaW50ZihwLCAiXHRTcmMgSVAgbWFzazogMHgleFxuIiwKLQkJCQlmc2MtPmZzLm1fdS50Y3BfaXA0X3NwZWMuaXA0c3JjKTsKLQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJbnVtX3N0cmluZ3MrKzsKLQkJCXNwcmludGYocCwgIlx0RGVzdCBJUCBhZGRyOiAweCV4XG4iLAotCQkJCWZzYy0+ZnMuaF91LnRjcF9pcDRfc3BlYy5pcDRkc3QpOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJc3ByaW50ZihwLCAiXHREZXN0IElQIG1hc2s6IDB4JXhcbiIsCi0JCQkJZnNjLT5mcy5tX3UudGNwX2lwNF9zcGVjLmlwNGRzdCk7Ci0JCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCW51bV9zdHJpbmdzKys7Ci0JCQlzcHJpbnRmKHAsICJcdFNyYyBQb3J0OiAlZCwgbWFzazogMHgleFxuIiwKLQkJCQlmc2MtPmZzLmhfdS50Y3BfaXA0X3NwZWMucHNyYywKLQkJCQlmc2MtPmZzLm1fdS50Y3BfaXA0X3NwZWMucHNyYyk7Ci0JCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCW51bV9zdHJpbmdzKys7Ci0JCQlzcHJpbnRmKHAsICJcdERlc3QgUG9ydDogJWQsIG1hc2s6IDB4JXhcbiIsCi0JCQkJZnNjLT5mcy5oX3UudGNwX2lwNF9zcGVjLnBkc3QsCi0JCQkJZnNjLT5mcy5tX3UudGNwX2lwNF9zcGVjLnBkc3QpOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJc3ByaW50ZihwLCAiXHRUT1M6ICVkLCBtYXNrOiAweCV4XG4iLAotCQkJCWZzYy0+ZnMuaF91LnRjcF9pcDRfc3BlYy50b3MsCi0JCQkJZnNjLT5mcy5tX3UudGNwX2lwNF9zcGVjLnRvcyk7Ci0JCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCW51bV9zdHJpbmdzKys7Ci0JCQlicmVhazsKLQkJY2FzZSBBSF9FU1BfVjRfRkxPVzoKLQkJY2FzZSBFU1BfVjRfRkxPVzoKLQkJCXNwcmludGYocCwgIlx0U3JjIElQIGFkZHI6IDB4JXhcbiIsCi0JCQkJZnNjLT5mcy5oX3UuYWhfaXA0X3NwZWMuaXA0c3JjKTsKLQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJbnVtX3N0cmluZ3MrKzsKLQkJCXNwcmludGYocCwgIlx0U3JjIElQIG1hc2s6IDB4JXhcbiIsCi0JCQkJZnNjLT5mcy5tX3UuYWhfaXA0X3NwZWMuaXA0c3JjKTsKLQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJbnVtX3N0cmluZ3MrKzsKLQkJCXNwcmludGYocCwgIlx0RGVzdCBJUCBhZGRyOiAweCV4XG4iLAotCQkJCWZzYy0+ZnMuaF91LmFoX2lwNF9zcGVjLmlwNGRzdCk7Ci0JCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCW51bV9zdHJpbmdzKys7Ci0JCQlzcHJpbnRmKHAsICJcdERlc3QgSVAgbWFzazogMHgleFxuIiwKLQkJCQlmc2MtPmZzLm1fdS5haF9pcDRfc3BlYy5pcDRkc3QpOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJc3ByaW50ZihwLCAiXHRTUEk6ICVkLCBtYXNrOiAweCV4XG4iLAotCQkJCWZzYy0+ZnMuaF91LmFoX2lwNF9zcGVjLnNwaSwKLQkJCQlmc2MtPmZzLm1fdS5haF9pcDRfc3BlYy5zcGkpOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJc3ByaW50ZihwLCAiXHRUT1M6ICVkLCBtYXNrOiAweCV4XG4iLAotCQkJCWZzYy0+ZnMuaF91LmFoX2lwNF9zcGVjLnRvcywKLQkJCQlmc2MtPmZzLm1fdS5haF9pcDRfc3BlYy50b3MpOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfVVNFUl9GTE9XOgotCQkJc3ByaW50ZihwLCAiXHRTcmMgSVAgYWRkcjogMHgleFxuIiwKLQkJCQlmc2MtPmZzLmhfdS51c3JfaXA0X3NwZWMuaXA0c3JjKTsKLQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJbnVtX3N0cmluZ3MrKzsKLQkJCXNwcmludGYocCwgIlx0U3JjIElQIG1hc2s6IDB4JXhcbiIsCi0JCQkJZnNjLT5mcy5tX3UudXNyX2lwNF9zcGVjLmlwNHNyYyk7Ci0JCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCW51bV9zdHJpbmdzKys7Ci0JCQlzcHJpbnRmKHAsICJcdERlc3QgSVAgYWRkcjogMHgleFxuIiwKLQkJCQlmc2MtPmZzLmhfdS51c3JfaXA0X3NwZWMuaXA0ZHN0KTsKLQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJbnVtX3N0cmluZ3MrKzsKLQkJCXNwcmludGYocCwgIlx0RGVzdCBJUCBtYXNrOiAweCV4XG4iLAotCQkJCWZzYy0+ZnMubV91LnVzcl9pcDRfc3BlYy5pcDRkc3QpOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBWNF9GTE9XOgotCQkJc3ByaW50ZihwLCAiXHRTcmMgSVAgYWRkcjogMHgleFxuIiwKLQkJCQlmc2MtPmZzLmhfdS51c3JfaXA0X3NwZWMuaXA0c3JjKTsKLQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJbnVtX3N0cmluZ3MrKzsKLQkJCXNwcmludGYocCwgIlx0U3JjIElQIG1hc2s6IDB4JXhcbiIsCi0JCQkJZnNjLT5mcy5tX3UudXNyX2lwNF9zcGVjLmlwNHNyYyk7Ci0JCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCW51bV9zdHJpbmdzKys7Ci0JCQlzcHJpbnRmKHAsICJcdERlc3QgSVAgYWRkcjogMHgleFxuIiwKLQkJCQlmc2MtPmZzLmhfdS51c3JfaXA0X3NwZWMuaXA0ZHN0KTsKLQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJbnVtX3N0cmluZ3MrKzsKLQkJCXNwcmludGYocCwgIlx0RGVzdCBJUCBtYXNrOiAweCV4XG4iLAotCQkJCWZzYy0+ZnMubV91LnVzcl9pcDRfc3BlYy5pcDRkc3QpOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJc3ByaW50ZihwLCAiXHRMNCBieXRlczogMHgleCwgbWFzazogMHgleFxuIiwKLQkJCQlmc2MtPmZzLmhfdS51c3JfaXA0X3NwZWMubDRfNF9ieXRlcywKLQkJCQlmc2MtPmZzLm1fdS51c3JfaXA0X3NwZWMubDRfNF9ieXRlcyk7Ci0JCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJCW51bV9zdHJpbmdzKys7Ci0JCQlzcHJpbnRmKHAsICJcdFRPUzogJWQsIG1hc2s6IDB4JXhcbiIsCi0JCQkJZnNjLT5mcy5oX3UudXNyX2lwNF9zcGVjLnRvcywKLQkJCQlmc2MtPmZzLm1fdS51c3JfaXA0X3NwZWMudG9zKTsKLQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJbnVtX3N0cmluZ3MrKzsKLQkJCXNwcmludGYocCwgIlx0SVAgVmVyc2lvbjogJWQsIG1hc2s6IDB4JXhcbiIsCi0JCQkJZnNjLT5mcy5oX3UudXNyX2lwNF9zcGVjLmlwX3ZlciwKLQkJCQlmc2MtPmZzLm1fdS51c3JfaXA0X3NwZWMuaXBfdmVyKTsKLQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJbnVtX3N0cmluZ3MrKzsKLQkJCXNwcmludGYocCwgIlx0UHJvdG9jb2w6ICVkLCBtYXNrOiAweCV4XG4iLAotCQkJCWZzYy0+ZnMuaF91LnVzcl9pcDRfc3BlYy5wcm90bywKLQkJCQlmc2MtPmZzLm1fdS51c3JfaXA0X3NwZWMucHJvdG8pOwotCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQludW1fc3RyaW5ncysrOwotCQkJYnJlYWs7Ci0JCX0KLQkJc3ByaW50ZihwLCAiXHRWTEFOOiAlZCwgbWFzazogMHgleFxuIiwKLQkJCWZzYy0+ZnMudmxhbl90YWcsIGZzYy0+ZnMudmxhbl90YWdfbWFzayk7Ci0JCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQludW1fc3RyaW5ncysrOwotCQlzcHJpbnRmKHAsICJcdFVzZXItZGVmaW5lZDogMHglTHhcbiIsIGZzYy0+ZnMuZGF0YSk7Ci0JCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQludW1fc3RyaW5ncysrOwotCQlzcHJpbnRmKHAsICJcdFVzZXItZGVmaW5lZCBtYXNrOiAweCVMeFxuIiwgZnNjLT5mcy5kYXRhX21hc2spOwotCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJbnVtX3N0cmluZ3MrKzsKLQkJaWYgKGZzYy0+ZnMuYWN0aW9uID09IEVUSFRPT0xfUlhOVFVQTEVfQUNUSU9OX0RST1ApCi0JCQlzcHJpbnRmKHAsICJcdEFjdGlvbjogRHJvcFxuIik7Ci0JCWVsc2UKLQkJCXNwcmludGYocCwgIlx0QWN0aW9uOiBEaXJlY3QgdG8gcXVldWUgJWRcbiIsCi0JCQkJZnNjLT5mcy5hY3Rpb24pOwotCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKLQkJbnVtX3N0cmluZ3MrKzsKLXVua25vd25fZmlsdGVyOgotCQlpKys7Ci0JfQotY29weToKLQkvKiBpbmRpY2F0ZSB0byB1c2Vyc3BhY2UgaG93IG1hbnkgc3RyaW5ncyB3ZSBhY3R1YWxseSBoYXZlICovCi0JZ3N0cmluZ3MubGVuID0gbnVtX3N0cmluZ3M7Ci0JcmV0ID0gLUVGQVVMVDsKLQlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmZ3N0cmluZ3MsIHNpemVvZihnc3RyaW5ncykpKQotCQlnb3RvIG91dDsKLQl1c2VyYWRkciArPSBzaXplb2YoZ3N0cmluZ3MpOwotCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIsIGRhdGEsIGdzdHJpbmdzLmxlbiAqIEVUSF9HU1RSSU5HX0xFTikpCi0JCWdvdG8gb3V0OwotCXJldCA9IDA7Ci0KLW91dDoKLQlrZnJlZShkYXRhKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBvcHMtPnNldF9yeF9udHVwbGUoZGV2LCAmY21kKTsKIH0KIAogc3RhdGljIGludCBldGh0b29sX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgX191c2VyICp1c2VyYWRkcikKQEAgLTEyMjcsNyArOTIzLDcgQEAKIAkJcmVncy5sZW4gPSByZWdsZW47CiAKIAlyZWdidWYgPSB2emFsbG9jKHJlZ2xlbik7Ci0JaWYgKCFyZWdidWYpCisJaWYgKHJlZ2xlbiAmJiAhcmVnYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCW9wcy0+Z2V0X3JlZ3MoZGV2LCAmcmVncywgcmVnYnVmKTsKQEAgLTEyMzYsNyArOTMyLDcgQEAKIAlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmcmVncywgc2l6ZW9mKHJlZ3MpKSkKIAkJZ290byBvdXQ7CiAJdXNlcmFkZHIgKz0gb2Zmc2V0b2Yoc3RydWN0IGV0aHRvb2xfcmVncywgZGF0YSk7Ci0JaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgcmVnYnVmLCByZWdzLmxlbikpCisJaWYgKHJlZ2J1ZiAmJiBjb3B5X3RvX3VzZXIodXNlcmFkZHIsIHJlZ2J1ZiwgcmVncy5sZW4pKQogCQlnb3RvIG91dDsKIAlyZXQgPSAwOwogCkBAIC0yMTAxLDkgKzE3OTcsNiBAQAogCWNhc2UgRVRIVE9PTF9TUlhOVFVQTEU6CiAJCXJjID0gZXRodG9vbF9zZXRfcnhfbnR1cGxlKGRldiwgdXNlcmFkZHIpOwogCQlicmVhazsKLQljYXNlIEVUSFRPT0xfR1JYTlRVUExFOgotCQlyYyA9IGV0aHRvb2xfZ2V0X3J4X250dXBsZShkZXYsIHVzZXJhZGRyKTsKLQkJYnJlYWs7CiAJY2FzZSBFVEhUT09MX0dTU0VUX0lORk86CiAJCXJjID0gZXRodG9vbF9nZXRfc3NldF9pbmZvKGRldiwgdXNlcmFkZHIpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpYl9ydWxlcy5jIGIvbmV0L2NvcmUvZmliX3J1bGVzLmMKaW5kZXggMDA4ZGM3MC4uZTdhYjBjMCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmliX3J1bGVzLmMKKysrIGIvbmV0L2NvcmUvZmliX3J1bGVzLmMKQEAgLTc0MCw5ICs3NDAsOSBAQAogc3RhdGljIGludCBfX2luaXQgZmliX3J1bGVzX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fTkVXUlVMRSwgZmliX25sX25ld3J1bGUsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fREVMUlVMRSwgZmliX25sX2RlbHJ1bGUsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUUlVMRSwgTlVMTCwgZmliX25sX2R1bXBydWxlKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX05FV1JVTEUsIGZpYl9ubF9uZXdydWxlLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0RFTFJVTEUsIGZpYl9ubF9kZWxydWxlLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVFJVTEUsIE5VTEwsIGZpYl9ubF9kdW1wcnVsZSwgTlVMTCk7CiAKIAllcnIgPSByZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZmaWJfcnVsZXNfbmV0X29wcyk7CiAJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9uZXQvY29yZS9saW5rX3dhdGNoLmMgYi9uZXQvY29yZS9saW5rX3dhdGNoLmMKaW5kZXggYTdiMzQyMS4uMzU3YmQ0ZSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbGlua193YXRjaC5jCisrKyBiL25ldC9jb3JlL2xpbmtfd2F0Y2guYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAJCXJldHVybjsKIAogCS8qIEl0J3MgYWxyZWFkeSBydW5uaW5nIHdoaWNoIGlzIGdvb2QgZW5vdWdoLiAqLwotCWlmICghY2FuY2VsX2RlbGF5ZWRfd29yaygmbGlua3dhdGNoX3dvcmspKQorCWlmICghX19jYW5jZWxfZGVsYXllZF93b3JrKCZsaW5rd2F0Y2hfd29yaykpCiAJCXJldHVybjsKIAogCS8qIE90aGVyd2lzZSB3ZSByZXNjaGVkdWxlIGl0IGFnYWluIGZvciBpbW1lZGlhdGUgZXhlY3V0aW9uLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwppbmRleCA3OTlmMDZlLi44ZmFiOWIwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZWlnaGJvdXIuYworKysgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwpAQCAtOTgsNyArOTgsNyBAQAogCiBzdGF0aWMgREVGSU5FX1JXTE9DSyhuZWlnaF90YmxfbG9jayk7CiAKLXN0YXRpYyBpbnQgbmVpZ2hfYmxhY2tob2xlKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IG5laWdoX2JsYWNraG9sZShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gLUVORVRET1dOOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJd3JpdGVfbG9ja19iaCgmdGJsLT5sb2NrKTsKIAluaHQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHRibC0+bmh0LAogCQkJCQlsb2NrZGVwX2lzX2hlbGQoJnRibC0+bG9jaykpOwotCWZvciAoaSA9IDA7IGkgPD0gbmh0LT5oYXNoX21hc2s7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBuaHQtPmhhc2hfc2hpZnQpOyBpKyspIHsKIAkJc3RydWN0IG5laWdoYm91ciAqbjsKIAkJc3RydWN0IG5laWdoYm91ciBfX3JjdSAqKm5wOwogCkBAIC0yMTAsNyArMjEwLDcgQEAKIAluaHQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHRibC0+bmh0LAogCQkJCQlsb2NrZGVwX2lzX2hlbGQoJnRibC0+bG9jaykpOwogCi0JZm9yIChpID0gMDsgaSA8PSBuaHQtPmhhc2hfbWFzazsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8ICgxIDw8IG5odC0+aGFzaF9zaGlmdCk7IGkrKykgewogCQlzdHJ1Y3QgbmVpZ2hib3VyICpuOwogCQlzdHJ1Y3QgbmVpZ2hib3VyIF9fcmN1ICoqbnAgPSAmbmh0LT5oYXNoX2J1Y2tldHNbaV07CiAKQEAgLTI5Nyw2ICsyOTcsNyBAQAogCW4tPnVwZGF0ZWQJICA9IG4tPnVzZWQgPSBub3c7CiAJbi0+bnVkX3N0YXRlCSAgPSBOVURfTk9ORTsKIAluLT5vdXRwdXQJICA9IG5laWdoX2JsYWNraG9sZTsKKwlzZXFsb2NrX2luaXQoJm4tPmhoLmhoX2xvY2spOwogCW4tPnBhcm1zCSAgPSBuZWlnaF9wYXJtc19jbG9uZSgmdGJsLT5wYXJtcyk7CiAJc2V0dXBfdGltZXIoJm4tPnRpbWVyLCBuZWlnaF90aW1lcl9oYW5kbGVyLCAodW5zaWduZWQgbG9uZyluKTsKIApAQCAtMzEyLDkgKzMxMyw5IEBACiAJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmVpZ2hfaGFzaF90YWJsZSAqbmVpZ2hfaGFzaF9hbGxvYyh1bnNpZ25lZCBpbnQgZW50cmllcykKK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hfaGFzaF90YWJsZSAqbmVpZ2hfaGFzaF9hbGxvYyh1bnNpZ25lZCBpbnQgc2hpZnQpCiB7Ci0Jc2l6ZV90IHNpemUgPSBlbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXIgKik7CisJc2l6ZV90IHNpemUgPSAoMSA8PCBzaGlmdCkgKiBzaXplb2Yoc3RydWN0IG5laWdoYm91ciAqKTsKIAlzdHJ1Y3QgbmVpZ2hfaGFzaF90YWJsZSAqcmV0OwogCXN0cnVjdCBuZWlnaGJvdXIgX19yY3UgKipidWNrZXRzOwogCkBAIC0zMzIsOCArMzMzLDkgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXJldC0+aGFzaF9idWNrZXRzID0gYnVja2V0czsKLQlyZXQtPmhhc2hfbWFzayA9IGVudHJpZXMgLSAxOworCXJldC0+aGFzaF9zaGlmdCA9IHNoaWZ0OwogCWdldF9yYW5kb21fYnl0ZXMoJnJldC0+aGFzaF9ybmQsIHNpemVvZihyZXQtPmhhc2hfcm5kKSk7CisJcmV0LT5oYXNoX3JuZCB8PSAxOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM0Miw3ICszNDQsNyBAQAogCXN0cnVjdCBuZWlnaF9oYXNoX3RhYmxlICpuaHQgPSBjb250YWluZXJfb2YoaGVhZCwKIAkJCQkJCSAgICBzdHJ1Y3QgbmVpZ2hfaGFzaF90YWJsZSwKIAkJCQkJCSAgICByY3UpOwotCXNpemVfdCBzaXplID0gKG5odC0+aGFzaF9tYXNrICsgMSkgKiBzaXplb2Yoc3RydWN0IG5laWdoYm91ciAqKTsKKwlzaXplX3Qgc2l6ZSA9ICgxIDw8IG5odC0+aGFzaF9zaGlmdCkgKiBzaXplb2Yoc3RydWN0IG5laWdoYm91ciAqKTsKIAlzdHJ1Y3QgbmVpZ2hib3VyIF9fcmN1ICoqYnVja2V0cyA9IG5odC0+aGFzaF9idWNrZXRzOwogCiAJaWYgKHNpemUgPD0gUEFHRV9TSVpFKQpAQCAtMzUzLDIxICszNTUsMjAgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBuZWlnaF9oYXNoX3RhYmxlICpuZWlnaF9oYXNoX2dyb3coc3RydWN0IG5laWdoX3RhYmxlICp0YmwsCi0JCQkJCQl1bnNpZ25lZCBsb25nIG5ld19lbnRyaWVzKQorCQkJCQkJdW5zaWduZWQgbG9uZyBuZXdfc2hpZnQpCiB7CiAJdW5zaWduZWQgaW50IGksIGhhc2g7CiAJc3RydWN0IG5laWdoX2hhc2hfdGFibGUgKm5ld19uaHQsICpvbGRfbmh0OwogCiAJTkVJR0hfQ0FDSEVfU1RBVF9JTkModGJsLCBoYXNoX2dyb3dzKTsKIAotCUJVR19PTighaXNfcG93ZXJfb2ZfMihuZXdfZW50cmllcykpOwogCW9sZF9uaHQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHRibC0+bmh0LAogCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZ0YmwtPmxvY2spKTsKLQluZXdfbmh0ID0gbmVpZ2hfaGFzaF9hbGxvYyhuZXdfZW50cmllcyk7CisJbmV3X25odCA9IG5laWdoX2hhc2hfYWxsb2MobmV3X3NoaWZ0KTsKIAlpZiAoIW5ld19uaHQpCiAJCXJldHVybiBvbGRfbmh0OwogCi0JZm9yIChpID0gMDsgaSA8PSBvbGRfbmh0LT5oYXNoX21hc2s7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBvbGRfbmh0LT5oYXNoX3NoaWZ0KTsgaSsrKSB7CiAJCXN0cnVjdCBuZWlnaGJvdXIgKm4sICpuZXh0OwogCiAJCWZvciAobiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQob2xkX25odC0+aGFzaF9idWNrZXRzW2ldLApAQCAtMzc3LDcgKzM3OCw3IEBACiAJCQloYXNoID0gdGJsLT5oYXNoKG4tPnByaW1hcnlfa2V5LCBuLT5kZXYsCiAJCQkJCSBuZXdfbmh0LT5oYXNoX3JuZCk7CiAKLQkJCWhhc2ggJj0gbmV3X25odC0+aGFzaF9tYXNrOworCQkJaGFzaCA+Pj0gKDMyIC0gbmV3X25odC0+aGFzaF9zaGlmdCk7CiAJCQluZXh0ID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChuLT5uZXh0LAogCQkJCQkJbG9ja2RlcF9pc19oZWxkKCZ0YmwtPmxvY2spKTsKIApAQCAtNDA2LDcgKzQwNyw3IEBACiAKIAlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJbmh0ID0gcmN1X2RlcmVmZXJlbmNlX2JoKHRibC0+bmh0KTsKLQloYXNoX3ZhbCA9IHRibC0+aGFzaChwa2V5LCBkZXYsIG5odC0+aGFzaF9ybmQpICYgbmh0LT5oYXNoX21hc2s7CisJaGFzaF92YWwgPSB0YmwtPmhhc2gocGtleSwgZGV2LCBuaHQtPmhhc2hfcm5kKSA+PiAoMzIgLSBuaHQtPmhhc2hfc2hpZnQpOwogCiAJZm9yIChuID0gcmN1X2RlcmVmZXJlbmNlX2JoKG5odC0+aGFzaF9idWNrZXRzW2hhc2hfdmFsXSk7CiAJICAgICBuICE9IE5VTEw7CkBAIC00MzYsNyArNDM3LDcgQEAKIAogCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAluaHQgPSByY3VfZGVyZWZlcmVuY2VfYmgodGJsLT5uaHQpOwotCWhhc2hfdmFsID0gdGJsLT5oYXNoKHBrZXksIE5VTEwsIG5odC0+aGFzaF9ybmQpICYgbmh0LT5oYXNoX21hc2s7CisJaGFzaF92YWwgPSB0YmwtPmhhc2gocGtleSwgTlVMTCwgbmh0LT5oYXNoX3JuZCkgPj4gKDMyIC0gbmh0LT5oYXNoX3NoaWZ0KTsKIAogCWZvciAobiA9IHJjdV9kZXJlZmVyZW5jZV9iaChuaHQtPmhhc2hfYnVja2V0c1toYXNoX3ZhbF0pOwogCSAgICAgbiAhPSBOVUxMOwpAQCAtNDkyLDEwICs0OTMsMTAgQEAKIAluaHQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHRibC0+bmh0LAogCQkJCQlsb2NrZGVwX2lzX2hlbGQoJnRibC0+bG9jaykpOwogCi0JaWYgKGF0b21pY19yZWFkKCZ0YmwtPmVudHJpZXMpID4gKG5odC0+aGFzaF9tYXNrICsgMSkpCi0JCW5odCA9IG5laWdoX2hhc2hfZ3Jvdyh0YmwsIChuaHQtPmhhc2hfbWFzayArIDEpIDw8IDEpOworCWlmIChhdG9taWNfcmVhZCgmdGJsLT5lbnRyaWVzKSA+ICgxIDw8IG5odC0+aGFzaF9zaGlmdCkpCisJCW5odCA9IG5laWdoX2hhc2hfZ3Jvdyh0YmwsIG5odC0+aGFzaF9zaGlmdCArIDEpOwogCi0JaGFzaF92YWwgPSB0YmwtPmhhc2gocGtleSwgZGV2LCBuaHQtPmhhc2hfcm5kKSAmIG5odC0+aGFzaF9tYXNrOworCWhhc2hfdmFsID0gdGJsLT5oYXNoKHBrZXksIGRldiwgbmh0LT5oYXNoX3JuZCkgPj4gKDMyIC0gbmh0LT5oYXNoX3NoaWZ0KTsKIAogCWlmIChuLT5wYXJtcy0+ZGVhZCkgewogCQlyYyA9IEVSUl9QVFIoLUVJTlZBTCk7CkBAIC02ODgsOCArNjg5LDYgQEAKICAqLwogdm9pZCBuZWlnaF9kZXN0cm95KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQogewotCXN0cnVjdCBoaF9jYWNoZSAqaGg7Ci0KIAlORUlHSF9DQUNIRV9TVEFUX0lOQyhuZWlnaC0+dGJsLCBkZXN0cm95cyk7CiAKIAlpZiAoIW5laWdoLT5kZWFkKSB7CkBAIC03MDIsMTYgKzcwMSw2IEBACiAJaWYgKG5laWdoX2RlbF90aW1lcihuZWlnaCkpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkltcG9zc2libGUgZXZlbnQuXG4iKTsKIAotCXdoaWxlICgoaGggPSBuZWlnaC0+aGgpICE9IE5VTEwpIHsKLQkJbmVpZ2gtPmhoID0gaGgtPmhoX25leHQ7Ci0JCWhoLT5oaF9uZXh0ID0gTlVMTDsKLQotCQl3cml0ZV9zZXFsb2NrX2JoKCZoaC0+aGhfbG9jayk7Ci0JCWhoLT5oaF9vdXRwdXQgPSBuZWlnaF9ibGFja2hvbGU7Ci0JCXdyaXRlX3NlcXVubG9ja19iaCgmaGgtPmhoX2xvY2spOwotCQloaF9jYWNoZV9wdXQoaGgpOwotCX0KLQogCXNrYl9xdWV1ZV9wdXJnZSgmbmVpZ2gtPmFycF9xdWV1ZSk7CiAKIAlkZXZfcHV0KG5laWdoLT5kZXYpOwpAQCAtNzMxLDE0ICs3MjAsOSBAQAogICovCiBzdGF0aWMgdm9pZCBuZWlnaF9zdXNwZWN0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQogewotCXN0cnVjdCBoaF9jYWNoZSAqaGg7Ci0KIAlORUlHSF9QUklOVEsyKCJuZWlnaCAlcCBpcyBzdXNwZWN0ZWQuXG4iLCBuZWlnaCk7CiAKIAluZWlnaC0+b3V0cHV0ID0gbmVpZ2gtPm9wcy0+b3V0cHV0OwotCi0JZm9yIChoaCA9IG5laWdoLT5oaDsgaGg7IGhoID0gaGgtPmhoX25leHQpCi0JCWhoLT5oaF9vdXRwdXQgPSBuZWlnaC0+b3BzLT5vdXRwdXQ7CiB9CiAKIC8qIE5laWdoYm91ciBzdGF0ZSBpcyBPSzsKQEAgLTc0OCwxNCArNzMyLDkgQEAKICAqLwogc3RhdGljIHZvaWQgbmVpZ2hfY29ubmVjdChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKIHsKLQlzdHJ1Y3QgaGhfY2FjaGUgKmhoOwotCiAJTkVJR0hfUFJJTlRLMigibmVpZ2ggJXAgaXMgY29ubmVjdGVkLlxuIiwgbmVpZ2gpOwogCiAJbmVpZ2gtPm91dHB1dCA9IG5laWdoLT5vcHMtPmNvbm5lY3RlZF9vdXRwdXQ7Ci0KLQlmb3IgKGhoID0gbmVpZ2gtPmhoOyBoaDsgaGggPSBoaC0+aGhfbmV4dCkKLQkJaGgtPmhoX291dHB1dCA9IG5laWdoLT5vcHMtPmhoX291dHB1dDsKIH0KIAogc3RhdGljIHZvaWQgbmVpZ2hfcGVyaW9kaWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC03ODQsNyArNzYzLDcgQEAKIAkJCQluZWlnaF9yYW5kX3JlYWNoX3RpbWUocC0+YmFzZV9yZWFjaGFibGVfdGltZSk7CiAJfQogCi0JZm9yIChpID0gMCA7IGkgPD0gbmh0LT5oYXNoX21hc2s7IGkrKykgeworCWZvciAoaSA9IDAgOyBpIDwgKDEgPDwgbmh0LT5oYXNoX3NoaWZ0KTsgaSsrKSB7CiAJCW5wID0gJm5odC0+aGFzaF9idWNrZXRzW2ldOwogCiAJCXdoaWxlICgobiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoKm5wLApAQCAtMTAxNSw3ICs5OTQsNyBAQAogfQogRVhQT1JUX1NZTUJPTChfX25laWdoX2V2ZW50X3NlbmQpOwogCi1zdGF0aWMgdm9pZCBuZWlnaF91cGRhdGVfaGhzKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQorc3RhdGljIHZvaWQgbmVpZ2hfdXBkYXRlX2hocyhzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKIHsKIAlzdHJ1Y3QgaGhfY2FjaGUgKmhoOwogCXZvaWQgKCp1cGRhdGUpKHN0cnVjdCBoaF9jYWNoZSosIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlKiwgY29uc3QgdW5zaWduZWQgY2hhciAqKQpAQCAtMTAyNSw3ICsxMDA0LDggQEAKIAkJdXBkYXRlID0gbmVpZ2gtPmRldi0+aGVhZGVyX29wcy0+Y2FjaGVfdXBkYXRlOwogCiAJaWYgKHVwZGF0ZSkgewotCQlmb3IgKGhoID0gbmVpZ2gtPmhoOyBoaDsgaGggPSBoaC0+aGhfbmV4dCkgeworCQloaCA9ICZuZWlnaC0+aGg7CisJCWlmIChoaC0+aGhfbGVuKSB7CiAJCQl3cml0ZV9zZXFsb2NrX2JoKCZoaC0+aGhfbG9jayk7CiAJCQl1cGRhdGUoaGgsIG5laWdoLT5kZXYsIG5laWdoLT5oYSk7CiAJCQl3cml0ZV9zZXF1bmxvY2tfYmgoJmhoLT5oaF9sb2NrKTsKQEAgLTExNzMsMTIgKzExNTMsMTMgQEAKIAogCQl3aGlsZSAobmVpZ2gtPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCAmJgogCQkgICAgICAgKHNrYiA9IF9fc2tiX2RlcXVldWUoJm5laWdoLT5hcnBfcXVldWUpKSAhPSBOVUxMKSB7Ci0JCQlzdHJ1Y3QgbmVpZ2hib3VyICpuMSA9IG5laWdoOworCQkJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOworCQkJc3RydWN0IG5laWdoYm91ciAqbjIsICpuMSA9IG5laWdoOwogCQkJd3JpdGVfdW5sb2NrX2JoKCZuZWlnaC0+bG9jayk7CiAJCQkvKiBPbiBzaGFwZXIvZXFsIHNrYi0+ZHN0LT5uZWlnaGJvdXIgIT0gbmVpZ2ggOiggKi8KLQkJCWlmIChza2JfZHN0KHNrYikgJiYgc2tiX2RzdChza2IpLT5uZWlnaGJvdXIpCi0JCQkJbjEgPSBza2JfZHN0KHNrYiktPm5laWdoYm91cjsKLQkJCW4xLT5vdXRwdXQoc2tiKTsKKwkJCWlmIChkc3QgJiYgKG4yID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KSkgIT0gTlVMTCkKKwkJCQluMSA9IG4yOworCQkJbjEtPm91dHB1dChuMSwgc2tiKTsKIAkJCXdyaXRlX2xvY2tfYmgoJm5laWdoLT5sb2NrKTsKIAkJfQogCQlza2JfcXVldWVfcHVyZ2UoJm5laWdoLT5hcnBfcXVldWUpOwpAQCAtMTIxMSw2NyArMTE5MiwyMSBAQAogfQogRVhQT1JUX1NZTUJPTChuZWlnaF9ldmVudF9ucyk7CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBuZWlnaF9oaF9sb29rdXAoc3RydWN0IG5laWdoYm91ciAqbiwgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAotCQkJCSAgIF9fYmUxNiBwcm90b2NvbCkKLXsKLQlzdHJ1Y3QgaGhfY2FjaGUgKmhoOwotCi0Jc21wX3JtYigpOyAvKiBwYWlyZWQgd2l0aCBzbXBfd21iKCkgaW4gbmVpZ2hfaGhfaW5pdCgpICovCi0JZm9yIChoaCA9IG4tPmhoOyBoaDsgaGggPSBoaC0+aGhfbmV4dCkgewotCQlpZiAoaGgtPmhoX3R5cGUgPT0gcHJvdG9jb2wpIHsKLQkJCWF0b21pY19pbmMoJmhoLT5oaF9yZWZjbnQpOwotCQkJaWYgKHVubGlrZWx5KGNtcHhjaGcoJmRzdC0+aGgsIE5VTEwsIGhoKSAhPSBOVUxMKSkKLQkJCQloaF9jYWNoZV9wdXQoaGgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCiAvKiBjYWxsZWQgd2l0aCByZWFkX2xvY2tfYmgoJm4tPmxvY2spOyAqLwotc3RhdGljIHZvaWQgbmVpZ2hfaGhfaW5pdChzdHJ1Y3QgbmVpZ2hib3VyICpuLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCi0JCQkgIF9fYmUxNiBwcm90b2NvbCkKK3N0YXRpYyB2b2lkIG5laWdoX2hoX2luaXQoc3RydWN0IG5laWdoYm91ciAqbiwgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQogewotCXN0cnVjdCBoaF9jYWNoZQkqaGg7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRzdC0+ZGV2OwotCi0JaWYgKGxpa2VseShuZWlnaF9oaF9sb29rdXAobiwgZHN0LCBwcm90b2NvbCkpKQotCQlyZXR1cm47Ci0KLQkvKiBzbG93IHBhdGggKi8KLQloaCA9IGt6YWxsb2Moc2l6ZW9mKCpoaCksIEdGUF9BVE9NSUMpOwotCWlmICghaGgpCi0JCXJldHVybjsKLQotCXNlcWxvY2tfaW5pdCgmaGgtPmhoX2xvY2spOwotCWhoLT5oaF90eXBlID0gcHJvdG9jb2w7Ci0JYXRvbWljX3NldCgmaGgtPmhoX3JlZmNudCwgMik7Ci0KLQlpZiAoZGV2LT5oZWFkZXJfb3BzLT5jYWNoZShuLCBoaCkpIHsKLQkJa2ZyZWUoaGgpOwotCQlyZXR1cm47Ci0JfQorCV9fYmUxNiBwcm90ID0gZHN0LT5vcHMtPnByb3RvY29sOworCXN0cnVjdCBoaF9jYWNoZQkqaGggPSAmbi0+aGg7CiAKIAl3cml0ZV9sb2NrX2JoKCZuLT5sb2NrKTsKIAotCS8qIG11c3QgY2hlY2sgaWYgYW5vdGhlciB0aHJlYWQgYWxyZWFkeSBkaWQgdGhlIGluc2VydCAqLwotCWlmIChuZWlnaF9oaF9sb29rdXAobiwgZHN0LCBwcm90b2NvbCkpIHsKLQkJa2ZyZWUoaGgpOwotCQlnb3RvIGVuZDsKLQl9CisJLyogT25seSBvbmUgdGhyZWFkIGNhbiBjb21lIGluIGhlcmUgYW5kIGluaXRpYWxpemUgdGhlCisJICogaGhfY2FjaGUgZW50cnkuCisJICovCisJaWYgKCFoaC0+aGhfbGVuKQorCQlkZXYtPmhlYWRlcl9vcHMtPmNhY2hlKG4sIGhoLCBwcm90KTsKIAotCWlmIChuLT5udWRfc3RhdGUgJiBOVURfQ09OTkVDVEVEKQotCQloaC0+aGhfb3V0cHV0ID0gbi0+b3BzLT5oaF9vdXRwdXQ7Ci0JZWxzZQotCQloaC0+aGhfb3V0cHV0ID0gbi0+b3BzLT5vdXRwdXQ7Ci0KLQloaC0+aGhfbmV4dCA9IG4tPmhoOwotCXNtcF93bWIoKTsgLyogcGFpcmVkIHdpdGggc21wX3JtYigpIGluIG5laWdoX2hoX2xvb2t1cCgpICovCi0Jbi0+aGgJICAgID0gaGg7Ci0KLQlpZiAodW5saWtlbHkoY21weGNoZygmZHN0LT5oaCwgTlVMTCwgaGgpICE9IE5VTEwpKQotCQloaF9jYWNoZV9wdXQoaGgpOwotZW5kOgogCXdyaXRlX3VubG9ja19iaCgmbi0+bG9jayk7CiB9CiAKQEAgLTEyODAsNyArMTIxNSw3IEBACiAgKiBidXQgcmVzb2x1dGlvbiBpcyBub3QgbWFkZSB5ZXQuCiAgKi8KIAotaW50IG5laWdoX2NvbXBhdF9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBuZWlnaF9jb21wYXRfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIApAQCAtMTI5NywxMyArMTIzMiwxMiBAQAogCiAvKiBTbG93IGFuZCBjYXJlZnVsLiAqLwogCi1pbnQgbmVpZ2hfcmVzb2x2ZV9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBuZWlnaF9yZXNvbHZlX291dHB1dChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7Ci0Jc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CiAJaW50IHJjID0gMDsKIAotCWlmICghZHN0IHx8ICEobmVpZ2ggPSBkc3QtPm5laWdoYm91cikpCisJaWYgKCFkc3QpCiAJCWdvdG8gZGlzY2FyZDsKIAogCV9fc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CkBAIC0xMzEzLDEwICsxMjQ3LDggQEAKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CiAJCXVuc2lnbmVkIGludCBzZXE7CiAKLQkJaWYgKGRldi0+aGVhZGVyX29wcy0+Y2FjaGUgJiYKLQkJICAgICFkc3QtPmhoICYmCi0JCSAgICAhKGRzdC0+ZmxhZ3MgJiBEU1RfTk9DQUNIRSkpCi0JCQluZWlnaF9oaF9pbml0KG5laWdoLCBkc3QsIGRzdC0+b3BzLT5wcm90b2NvbCk7CisJCWlmIChkZXYtPmhlYWRlcl9vcHMtPmNhY2hlICYmICFuZWlnaC0+aGguaGhfbGVuKQorCQkJbmVpZ2hfaGhfaW5pdChuZWlnaCwgZHN0KTsKIAogCQlkbyB7CiAJCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZuZWlnaC0+aGFfbG9jayk7CkBAIC0xMzI1LDcgKzEyNTcsNyBAQAogCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZuZWlnaC0+aGFfbG9jaywgc2VxKSk7CiAKIAkJaWYgKGVyciA+PSAwKQotCQkJcmMgPSBuZWlnaC0+b3BzLT5xdWV1ZV94bWl0KHNrYik7CisJCQlyYyA9IGRldl9xdWV1ZV94bWl0KHNrYik7CiAJCWVsc2UKIAkJCWdvdG8gb3V0X2tmcmVlX3NrYjsKIAl9CkBAIC0xMzMzLDcgKzEyNjUsNyBAQAogCXJldHVybiByYzsKIGRpc2NhcmQ6CiAJTkVJR0hfUFJJTlRLMSgibmVpZ2hfcmVzb2x2ZV9vdXRwdXQ6IGRzdD0lcCBuZWlnaD0lcFxuIiwKLQkJICAgICAgZHN0LCBkc3QgPyBkc3QtPm5laWdoYm91ciA6IE5VTEwpOworCQkgICAgICBkc3QsIG5laWdoKTsKIG91dF9rZnJlZV9za2I6CiAJcmMgPSAtRUlOVkFMOwogCWtmcmVlX3NrYihza2IpOwpAQCAtMTM0MywxMyArMTI3NSwxMSBAQAogCiAvKiBBcyBmYXN0IGFzIHBvc3NpYmxlIHdpdGhvdXQgaGggY2FjaGUgKi8KIAotaW50IG5laWdoX2Nvbm5lY3RlZF9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBuZWlnaF9jb25uZWN0ZWRfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWludCBlcnI7Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOwotCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gZHN0LT5uZWlnaGJvdXI7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CiAJdW5zaWduZWQgaW50IHNlcTsKKwlpbnQgZXJyOwogCiAJX19za2JfcHVsbChza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpKTsKIApAQCAtMTM2MCw3ICsxMjkwLDcgQEAKIAl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZuZWlnaC0+aGFfbG9jaywgc2VxKSk7CiAKIAlpZiAoZXJyID49IDApCi0JCWVyciA9IG5laWdoLT5vcHMtPnF1ZXVlX3htaXQoc2tiKTsKKwkJZXJyID0gZGV2X3F1ZXVlX3htaXQoc2tiKTsKIAllbHNlIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJa2ZyZWVfc2tiKHNrYik7CkBAIC0xMzY5LDYgKzEyOTksMTIgQEAKIH0KIEVYUE9SVF9TWU1CT0wobmVpZ2hfY29ubmVjdGVkX291dHB1dCk7CiAKK2ludCBuZWlnaF9kaXJlY3Rfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBkZXZfcXVldWVfeG1pdChza2IpOworfQorRVhQT1JUX1NZTUJPTChuZWlnaF9kaXJlY3Rfb3V0cHV0KTsKKwogc3RhdGljIHZvaWQgbmVpZ2hfcHJveHlfcHJvY2Vzcyh1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCA9IChzdHJ1Y3QgbmVpZ2hfdGFibGUgKilhcmc7CkBAIC0xNTQwLDcgKzE0NzYsNyBAQAogCQlwYW5pYygiY2Fubm90IGNyZWF0ZSBuZWlnaGJvdXIgcHJvYyBkaXIgZW50cnkiKTsKICNlbmRpZgogCi0JUkNVX0lOSVRfUE9JTlRFUih0YmwtPm5odCwgbmVpZ2hfaGFzaF9hbGxvYyg4KSk7CisJUkNVX0lOSVRfUE9JTlRFUih0YmwtPm5odCwgbmVpZ2hfaGFzaF9hbGxvYygzKSk7CiAKIAlwaHNpemUgPSAoUE5FSUdIX0hBU0hNQVNLICsgMSkgKiBzaXplb2Yoc3RydWN0IHBuZWlnaF9lbnRyeSAqKTsKIAl0YmwtPnBoYXNoX2J1Y2tldHMgPSBremFsbG9jKHBoc2l6ZSwgR0ZQX0tFUk5FTCk7CkBAIC0xODU3LDcgKzE3OTMsNyBAQAogCQlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJCW5odCA9IHJjdV9kZXJlZmVyZW5jZV9iaCh0YmwtPm5odCk7CiAJCW5kYy5uZHRjX2hhc2hfcm5kID0gbmh0LT5oYXNoX3JuZDsKLQkJbmRjLm5kdGNfaGFzaF9tYXNrID0gbmh0LT5oYXNoX21hc2s7CisJCW5kYy5uZHRjX2hhc2hfbWFzayA9ICgoMSA8PCBuaHQtPmhhc2hfc2hpZnQpIC0gMSk7CiAJCXJjdV9yZWFkX3VubG9ja19iaCgpOwogCiAJCU5MQV9QVVQoc2tiLCBORFRBX0NPTkZJRywgc2l6ZW9mKG5kYyksICZuZGMpOwpAQCAtMjIwMCw3ICsyMTM2LDcgQEAKIAlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJbmh0ID0gcmN1X2RlcmVmZXJlbmNlX2JoKHRibC0+bmh0KTsKIAotCWZvciAoaCA9IDA7IGggPD0gbmh0LT5oYXNoX21hc2s7IGgrKykgeworCWZvciAoaCA9IDA7IGggPCAoMSA8PCBuaHQtPmhhc2hfc2hpZnQpOyBoKyspIHsKIAkJaWYgKGggPCBzX2gpCiAJCQljb250aW51ZTsKIAkJaWYgKGggPiBzX2gpCkBAIC0yMjY0LDcgKzIyMDAsNyBAQAogCW5odCA9IHJjdV9kZXJlZmVyZW5jZV9iaCh0YmwtPm5odCk7CiAKIAlyZWFkX2xvY2soJnRibC0+bG9jayk7IC8qIGF2b2lkIHJlc2l6ZXMgKi8KLQlmb3IgKGNoYWluID0gMDsgY2hhaW4gPD0gbmh0LT5oYXNoX21hc2s7IGNoYWluKyspIHsKKwlmb3IgKGNoYWluID0gMDsgY2hhaW4gPCAoMSA8PCBuaHQtPmhhc2hfc2hpZnQpOyBjaGFpbisrKSB7CiAJCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAKIAkJZm9yIChuID0gcmN1X2RlcmVmZXJlbmNlX2JoKG5odC0+aGFzaF9idWNrZXRzW2NoYWluXSk7CkBAIC0yMjg2LDcgKzIyMjIsNyBAQAogCiAJbmh0ID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZCh0YmwtPm5odCwKIAkJCQkJbG9ja2RlcF9pc19oZWxkKCZ0YmwtPmxvY2spKTsKLQlmb3IgKGNoYWluID0gMDsgY2hhaW4gPD0gbmh0LT5oYXNoX21hc2s7IGNoYWluKyspIHsKKwlmb3IgKGNoYWluID0gMDsgY2hhaW4gPCAoMSA8PCBuaHQtPmhhc2hfc2hpZnQpOyBjaGFpbisrKSB7CiAJCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAJCXN0cnVjdCBuZWlnaGJvdXIgX19yY3UgKipucDsKIApAQCAtMjMyMyw3ICsyMjU5LDcgQEAKIAlpbnQgYnVja2V0ID0gc3RhdGUtPmJ1Y2tldDsKIAogCXN0YXRlLT5mbGFncyAmPSB+TkVJR0hfU0VRX0lTX1BORUlHSDsKLQlmb3IgKGJ1Y2tldCA9IDA7IGJ1Y2tldCA8PSBuaHQtPmhhc2hfbWFzazsgYnVja2V0KyspIHsKKwlmb3IgKGJ1Y2tldCA9IDA7IGJ1Y2tldCA8ICgxIDw8IG5odC0+aGFzaF9zaGlmdCk7IGJ1Y2tldCsrKSB7CiAJCW4gPSByY3VfZGVyZWZlcmVuY2VfYmgobmh0LT5oYXNoX2J1Y2tldHNbYnVja2V0XSk7CiAKIAkJd2hpbGUgKG4pIHsKQEAgLTIzOTAsNyArMjMyNiw3IEBACiAJCWlmIChuKQogCQkJYnJlYWs7CiAKLQkJaWYgKCsrc3RhdGUtPmJ1Y2tldCA+IG5odC0+aGFzaF9tYXNrKQorCQlpZiAoKytzdGF0ZS0+YnVja2V0ID49ICgxIDw8IG5odC0+aGFzaF9zaGlmdCkpCiAJCQlicmVhazsKIAogCQluID0gcmN1X2RlcmVmZXJlbmNlX2JoKG5odC0+aGFzaF9idWNrZXRzW3N0YXRlLT5idWNrZXRdKTsKQEAgLTI5MDksMTIgKzI4NDUsMTMgQEAKIAogc3RhdGljIGludCBfX2luaXQgbmVpZ2hfaW5pdCh2b2lkKQogewotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fTkVXTkVJR0gsIG5laWdoX2FkZCwgTlVMTCk7Ci0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxORUlHSCwgbmVpZ2hfZGVsZXRlLCBOVUxMKTsKLQlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVE5FSUdILCBOVUxMLCBuZWlnaF9kdW1wX2luZm8pOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fTkVXTkVJR0gsIG5laWdoX2FkZCwgTlVMTCwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxORUlHSCwgbmVpZ2hfZGVsZXRlLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVE5FSUdILCBOVUxMLCBuZWlnaF9kdW1wX2luZm8sIE5VTEwpOwogCi0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRORUlHSFRCTCwgTlVMTCwgbmVpZ2h0YmxfZHVtcF9pbmZvKTsKLQlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX1NFVE5FSUdIVEJMLCBuZWlnaHRibF9zZXQsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUTkVJR0hUQkwsIE5VTEwsIG5laWdodGJsX2R1bXBfaW5mbywKKwkJICAgICAgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9TRVRORUlHSFRCTCwgbmVpZ2h0Ymxfc2V0LCBOVUxMLCBOVUxMKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0LXN5c2ZzLmMgYi9uZXQvY29yZS9uZXQtc3lzZnMuYwppbmRleCAxMWI5OGJjLi4xNjgzZTVkIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXQtc3lzZnMuYworKysgYi9uZXQvY29yZS9uZXQtc3lzZnMuYwpAQCAtMTAwLDcgKzEwMCw2IEBACiBORVRERVZJQ0VfU0hPVyhhZGRyX2xlbiwgZm10X2RlYyk7CiBORVRERVZJQ0VfU0hPVyhpZmxpbmssIGZtdF9kZWMpOwogTkVUREVWSUNFX1NIT1coaWZpbmRleCwgZm10X2RlYyk7Ci1ORVRERVZJQ0VfU0hPVyhmZWF0dXJlcywgZm10X2hleCk7CiBORVRERVZJQ0VfU0hPVyh0eXBlLCBmbXRfZGVjKTsKIE5FVERFVklDRV9TSE9XKGxpbmtfbW9kZSwgZm10X2RlYyk7CiAKQEAgLTMxMiw3ICszMTEsNiBAQAogCV9fQVRUUihpZmFsaWFzLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19pZmFsaWFzLCBzdG9yZV9pZmFsaWFzKSwKIAlfX0FUVFIoaWZsaW5rLCBTX0lSVUdPLCBzaG93X2lmbGluaywgTlVMTCksCiAJX19BVFRSKGlmaW5kZXgsIFNfSVJVR08sIHNob3dfaWZpbmRleCwgTlVMTCksCi0JX19BVFRSKGZlYXR1cmVzLCBTX0lSVUdPLCBzaG93X2ZlYXR1cmVzLCBOVUxMKSwKIAlfX0FUVFIodHlwZSwgU19JUlVHTywgc2hvd190eXBlLCBOVUxMKSwKIAlfX0FUVFIobGlua19tb2RlLCBTX0lSVUdPLCBzaG93X2xpbmtfbW9kZSwgTlVMTCksCiAJX19BVFRSKGFkZHJlc3MsIFNfSVJVR08sIHNob3dfYWRkcmVzcywgTlVMTCksCkBAIC0xMTc5LDkgKzExNzcsMTQgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgY29uc3Qgdm9pZCAqbmV0X2N1cnJlbnRfbnModm9pZCkKK3N0YXRpYyB2b2lkICpuZXRfZ3JhYl9jdXJyZW50X25zKHZvaWQpCiB7Ci0JcmV0dXJuIGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKKwlzdHJ1Y3QgbmV0ICpucyA9IGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKKyNpZmRlZiBDT05GSUdfTkVUX05TCisJaWYgKG5zKQorCQlhdG9taWNfaW5jKCZucy0+cGFzc2l2ZSk7CisjZW5kaWYKKwlyZXR1cm4gbnM7CiB9CiAKIHN0YXRpYyBjb25zdCB2b2lkICpuZXRfaW5pdGlhbF9ucyh2b2lkKQpAQCAtMTE5NiwyMiArMTE5OSwxMyBAQAogCiBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgbmV0X25zX3R5cGVfb3BlcmF0aW9ucyA9IHsKIAkudHlwZSA9IEtPQkpfTlNfVFlQRV9ORVQsCi0JLmN1cnJlbnRfbnMgPSBuZXRfY3VycmVudF9ucywKKwkuZ3JhYl9jdXJyZW50X25zID0gbmV0X2dyYWJfY3VycmVudF9ucywKIAkubmV0bGlua19ucyA9IG5ldF9uZXRsaW5rX25zLAogCS5pbml0aWFsX25zID0gbmV0X2luaXRpYWxfbnMsCisJLmRyb3BfbnMgPSBuZXRfZHJvcF9ucywKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChuZXRfbnNfdHlwZV9vcGVyYXRpb25zKTsKIAotc3RhdGljIHZvaWQgbmV0X2tvYmpfbnNfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0Ja29ial9uc19leGl0KEtPQkpfTlNfVFlQRV9ORVQsIG5ldCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMga29ial9uZXRfb3BzID0gewotCS5leGl0ID0gbmV0X2tvYmpfbnNfZXhpdCwKLX07Ci0KLQogI2lmZGVmIENPTkZJR19IT1RQTFVHCiBzdGF0aWMgaW50IG5ldGRldl91ZXZlbnQoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQogewpAQCAtMTMzOSw2ICsxMzMzLDUgQEAKIGludCBuZXRkZXZfa29iamVjdF9pbml0KHZvaWQpCiB7CiAJa29ial9uc190eXBlX3JlZ2lzdGVyKCZuZXRfbnNfdHlwZV9vcGVyYXRpb25zKTsKLQlyZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZrb2JqX25ldF9vcHMpOwogCXJldHVybiBjbGFzc19yZWdpc3RlcigmbmV0X2NsYXNzKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC10cmFjZXMuYyBiL25ldC9jb3JlL25ldC10cmFjZXMuYwppbmRleCA3ZjFiYjJhLi41MjM4MGIxIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXQtdHJhY2VzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXRyYWNlcy5jCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NrYi5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9uZXQuaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvbmFwaS5oPgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9zb2NrLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3VkcC5oPgogCiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGtmcmVlX3NrYik7CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYyBiL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYwppbmRleCA2YzZiODZkLi41YmJkYmYwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKKysrIGIvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jCkBAIC0xMjgsNiArMTI4LDggQEAKIAlMSVNUX0hFQUQobmV0X2V4aXRfbGlzdCk7CiAKIAlhdG9taWNfc2V0KCZuZXQtPmNvdW50LCAxKTsKKwlhdG9taWNfc2V0KCZuZXQtPnBhc3NpdmUsIDEpOworCW5ldC0+ZGV2X2Jhc2Vfc2VxID0gMTsKIAogI2lmZGVmIE5FVE5TX1JFRkNOVF9ERUJVRwogCWF0b21pY19zZXQoJm5ldC0+dXNlX2NvdW50LCAwKTsKQEAgLTIxMCw2ICsyMTIsMTMgQEAKIAlrbWVtX2NhY2hlX2ZyZWUobmV0X2NhY2hlcCwgbmV0KTsKIH0KIAordm9pZCBuZXRfZHJvcF9ucyh2b2lkICpwKQoreworCXN0cnVjdCBuZXQgKm5zID0gcDsKKwlpZiAobnMgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmbnMtPnBhc3NpdmUpKQorCQluZXRfZnJlZShucyk7Cit9CisKIHN0cnVjdCBuZXQgKmNvcHlfbmV0X25zKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBuZXQgKm9sZF9uZXQpCiB7CiAJc3RydWN0IG5ldCAqbmV0OwpAQCAtMjMwLDcgKzIzOSw3IEBACiAJfQogCW11dGV4X3VubG9jaygmbmV0X211dGV4KTsKIAlpZiAocnYgPCAwKSB7Ci0JCW5ldF9mcmVlKG5ldCk7CisJCW5ldF9kcm9wX25zKG5ldCk7CiAJCXJldHVybiBFUlJfUFRSKHJ2KTsKIAl9CiAJcmV0dXJuIG5ldDsKQEAgLTI4Niw3ICsyOTUsNyBAQAogCS8qIEZpbmFsbHkgaXQgaXMgc2FmZSB0byBmcmVlIG15IG5ldHdvcmsgbmFtZXNwYWNlIHN0cnVjdHVyZSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuZXQsIHRtcCwgJm5ldF9leGl0X2xpc3QsIGV4aXRfbGlzdCkgewogCQlsaXN0X2RlbF9pbml0KCZuZXQtPmV4aXRfbGlzdCk7Ci0JCW5ldF9mcmVlKG5ldCk7CisJCW5ldF9kcm9wX25zKG5ldCk7CiAJfQogfQogc3RhdGljIERFQ0xBUkVfV09SSyhuZXRfY2xlYW51cF93b3JrLCBjbGVhbnVwX25ldCk7CkBAIC0zMTAsMTkgKzMxOSwxNyBAQAogCXN0cnVjdCBmaWxlICpmaWxlOwogCXN0cnVjdCBuZXQgKm5ldDsKIAotCW5ldCA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJZmlsZSA9IHByb2NfbnNfZmdldChmZCk7Ci0JaWYgKCFmaWxlKQotCQlnb3RvIG91dDsKKwlpZiAoSVNfRVJSKGZpbGUpKQorCQlyZXR1cm4gRVJSX0NBU1QoZmlsZSk7CiAKIAllaSA9IFBST0NfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7Ci0JaWYgKGVpLT5uc19vcHMgIT0gJm5ldG5zX29wZXJhdGlvbnMpCi0JCWdvdG8gb3V0OworCWlmIChlaS0+bnNfb3BzID09ICZuZXRuc19vcGVyYXRpb25zKQorCQluZXQgPSBnZXRfbmV0KGVpLT5ucyk7CisJZWxzZQorCQluZXQgPSBFUlJfUFRSKC1FSU5WQUwpOwogCi0JbmV0ID0gZ2V0X25ldChlaS0+bnMpOwotb3V0OgotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOworCWZwdXQoZmlsZSk7CiAJcmV0dXJuIG5ldDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0cG9sbC5jIGIvbmV0L2NvcmUvbmV0cG9sbC5jCmluZGV4IDJkN2Q2ZDQuLmFkZjg0ZGQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldHBvbGwuYworKysgYi9uZXQvY29yZS9uZXRwb2xsLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCX0KIH0KIAotdm9pZCBuZXRwb2xsX3BvbGxfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuZXRwb2xsX3BvbGxfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHM7CiAKQEAgLTIwOCwxMyArMjA4LDYgQEAKIAogCXphcF9jb21wbGV0aW9uX3F1ZXVlKCk7CiB9Ci1FWFBPUlRfU1lNQk9MKG5ldHBvbGxfcG9sbF9kZXYpOwotCi12b2lkIG5ldHBvbGxfcG9sbChzdHJ1Y3QgbmV0cG9sbCAqbnApCi17Ci0JbmV0cG9sbF9wb2xsX2RldihucC0+ZGV2KTsKLX0KLUVYUE9SVF9TWU1CT0wobmV0cG9sbF9wb2xsKTsKIAogc3RhdGljIHZvaWQgcmVmaWxsX3NrYnModm9pZCkKIHsKQEAgLTI3NSw3ICsyNjgsNyBAQAogCiAJaWYgKCFza2IpIHsKIAkJaWYgKCsrY291bnQgPCAxMCkgewotCQkJbmV0cG9sbF9wb2xsKG5wKTsKKwkJCW5ldHBvbGxfcG9sbF9kZXYobnAtPmRldik7CiAJCQlnb3RvIHJlcGVhdDsKIAkJfQogCQlyZXR1cm4gTlVMTDsKQEAgLTMzNiw3ICszMjksNyBAQAogCQkJfQogCiAJCQkvKiB0aWNrbGUgZGV2aWNlIG1heWJlIHRoZXJlIGlzIHNvbWUgY2xlYW51cCAqLwotCQkJbmV0cG9sbF9wb2xsKG5wKTsKKwkJCW5ldHBvbGxfcG9sbF9kZXYobnAtPmRldik7CiAKIAkJCXVkZWxheShVU0VDX1BFUl9QT0xMKTsKIAkJfQpAQCAtNzkyLDYgKzc4NSwxMyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlpZiAobmRldi0+bWFzdGVyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGlzIGEgc2xhdmUgZGV2aWNlLCBhYm9ydGluZy5cbiIsCisJCSAgICAgICBucC0+bmFtZSwgbnAtPmRldl9uYW1lKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIHB1dDsKKwl9CisKIAlpZiAoIW5ldGlmX3J1bm5pbmcobmRldikpIHsKIAkJdW5zaWduZWQgbG9uZyBhdG1vc3QsIGF0bGVhc3Q7CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3J0bmV0bGluay5jIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKaW5kZXggYWJkOTM2ZC4uOTlkOWU5NSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMKKysrIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKQEAgLTU2LDkgKzU2LDExIEBACiBzdHJ1Y3QgcnRubF9saW5rIHsKIAlydG5sX2RvaXRfZnVuYwkJZG9pdDsKIAlydG5sX2R1bXBpdF9mdW5jCWR1bXBpdDsKKwlydG5sX2NhbGNpdF9mdW5jIAljYWxjaXQ7CiB9OwogCiBzdGF0aWMgREVGSU5FX01VVEVYKHJ0bmxfbXV0ZXgpOworc3RhdGljIHUxNiBtaW5faWZpbmZvX2R1bXBfc2l6ZTsKIAogdm9pZCBydG5sX2xvY2sodm9pZCkKIHsKQEAgLTE0NCwxMiArMTQ2LDI4IEBACiAJcmV0dXJuIHRhYiA/IHRhYlttc2dpbmRleF0uZHVtcGl0IDogTlVMTDsKIH0KIAorc3RhdGljIHJ0bmxfY2FsY2l0X2Z1bmMgcnRubF9nZXRfY2FsY2l0KGludCBwcm90b2NvbCwgaW50IG1zZ2luZGV4KQoreworCXN0cnVjdCBydG5sX2xpbmsgKnRhYjsKKworCWlmIChwcm90b2NvbCA8PSBSVE5MX0ZBTUlMWV9NQVgpCisJCXRhYiA9IHJ0bmxfbXNnX2hhbmRsZXJzW3Byb3RvY29sXTsKKwllbHNlCisJCXRhYiA9IE5VTEw7CisKKwlpZiAodGFiID09IE5VTEwgfHwgdGFiW21zZ2luZGV4XS5jYWxjaXQgPT0gTlVMTCkKKwkJdGFiID0gcnRubF9tc2dfaGFuZGxlcnNbUEZfVU5TUEVDXTsKKworCXJldHVybiB0YWIgPyB0YWJbbXNnaW5kZXhdLmNhbGNpdCA6IE5VTEw7Cit9CisKIC8qKgogICogX19ydG5sX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgYSBydG5ldGxpbmsgbWVzc2FnZSB0eXBlCiAgKiBAcHJvdG9jb2w6IFByb3RvY29sIGZhbWlseSBvciBQRl9VTlNQRUMKICAqIEBtc2d0eXBlOiBydG5ldGxpbmsgbWVzc2FnZSB0eXBlCiAgKiBAZG9pdDogRnVuY3Rpb24gcG9pbnRlciBjYWxsZWQgZm9yIGVhY2ggcmVxdWVzdCBtZXNzYWdlCiAgKiBAZHVtcGl0OiBGdW5jdGlvbiBwb2ludGVyIGNhbGxlZCBmb3IgZWFjaCBkdW1wIHJlcXVlc3QgKE5MTV9GX0RVTVApIG1lc3NhZ2UKKyAqIEBjYWxjaXQ6IEZ1bmN0aW9uIHBvaW50ZXIgdG8gY2FsYyBzaXplIG9mIGR1bXAgbWVzc2FnZQogICoKICAqIFJlZ2lzdGVycyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHBvaW50ZXJzIChhdCBsZWFzdCBvbmUgb2YgdGhlbSBoYXMKICAqIHRvIGJlIG5vbi1OVUxMKSB0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYSByZXF1ZXN0IG1lc3NhZ2UgZm9yIHRoZQpAQCAtMTYyLDcgKzE4MCw4IEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KIGludCBfX3J0bmxfcmVnaXN0ZXIoaW50IHByb3RvY29sLCBpbnQgbXNndHlwZSwKLQkJICAgIHJ0bmxfZG9pdF9mdW5jIGRvaXQsIHJ0bmxfZHVtcGl0X2Z1bmMgZHVtcGl0KQorCQkgICAgcnRubF9kb2l0X2Z1bmMgZG9pdCwgcnRubF9kdW1waXRfZnVuYyBkdW1waXQsCisJCSAgICBydG5sX2NhbGNpdF9mdW5jIGNhbGNpdCkKIHsKIAlzdHJ1Y3QgcnRubF9saW5rICp0YWI7CiAJaW50IG1zZ2luZGV4OwpAQCAtMTg1LDYgKzIwNCw5IEBACiAJaWYgKGR1bXBpdCkKIAkJdGFiW21zZ2luZGV4XS5kdW1waXQgPSBkdW1waXQ7CiAKKwlpZiAoY2FsY2l0KQorCQl0YWJbbXNnaW5kZXhdLmNhbGNpdCA9IGNhbGNpdDsKKwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19ydG5sX3JlZ2lzdGVyKTsKQEAgLTE5OSw5ICsyMjEsMTAgQEAKICAqIG9mIG1lbW9yeSBpbXBsaWVzIG5vIHNlbnNlIGluIGNvbnRpbnVpbmcuCiAgKi8KIHZvaWQgcnRubF9yZWdpc3RlcihpbnQgcHJvdG9jb2wsIGludCBtc2d0eXBlLAotCQkgICBydG5sX2RvaXRfZnVuYyBkb2l0LCBydG5sX2R1bXBpdF9mdW5jIGR1bXBpdCkKKwkJICAgcnRubF9kb2l0X2Z1bmMgZG9pdCwgcnRubF9kdW1waXRfZnVuYyBkdW1waXQsCisJCSAgIHJ0bmxfY2FsY2l0X2Z1bmMgY2FsY2l0KQogewotCWlmIChfX3J0bmxfcmVnaXN0ZXIocHJvdG9jb2wsIG1zZ3R5cGUsIGRvaXQsIGR1bXBpdCkgPCAwKQorCWlmIChfX3J0bmxfcmVnaXN0ZXIocHJvdG9jb2wsIG1zZ3R5cGUsIGRvaXQsIGR1bXBpdCwgY2FsY2l0KSA8IDApCiAJCXBhbmljKCJVbmFibGUgdG8gcmVnaXN0ZXIgcnRuZXRsaW5rIG1lc3NhZ2UgaGFuZGxlciwgIgogCQkgICAgICAicHJvdG9jb2wgPSAlZCwgbWVzc2FnZSB0eXBlID0gJWRcbiIsCiAJCSAgICAgIHByb3RvY29sLCBtc2d0eXBlKTsKQEAgLTEwMDksNiArMTAzMiw4IEBACiAJc19pZHggPSBjYi0+YXJnc1sxXTsKIAogCXJjdV9yZWFkX2xvY2soKTsKKwljYi0+c2VxID0gbmV0LT5kZXZfYmFzZV9zZXE7CisKIAlmb3IgKGggPSBzX2g7IGggPCBORVRERVZfSEFTSEVOVFJJRVM7IGgrKywgc19pZHggPSAwKSB7CiAJCWlkeCA9IDA7CiAJCWhlYWQgPSAmbmV0LT5kZXZfaW5kZXhfaGVhZFtoXTsKQEAgLTEwMjAsNiArMTA0NSw4IEBACiAJCQkJCSAgICAgY2ItPm5saC0+bmxtc2dfc2VxLCAwLAogCQkJCQkgICAgIE5MTV9GX01VTFRJKSA8PSAwKQogCQkJCWdvdG8gb3V0OworCisJCQlubF9kdW1wX2NoZWNrX2NvbnNpc3RlbnQoY2IsIG5sbXNnX2hkcihza2IpKTsKIGNvbnQ6CiAJCQlpZHgrKzsKIAkJfQpAQCAtMTgxOCw2ICsxODQ1LDExIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHUxNiBydG5sX2NhbGNpdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBtaW5faWZpbmZvX2R1bXBfc2l6ZTsKK30KKwogc3RhdGljIGludCBydG5sX2R1bXBfYWxsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKIAlpbnQgaWR4OwpAQCAtMTg0NywxMSArMTg3OSwxNCBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnIgPSAtRU5PQlVGUzsKKwlzaXplX3QgaWZfaW5mb19zaXplOwogCi0Jc2tiID0gbmxtc2dfbmV3KGlmX25sbXNnX3NpemUoZGV2KSwgR0ZQX0tFUk5FTCk7CisJc2tiID0gbmxtc2dfbmV3KChpZl9pbmZvX3NpemUgPSBpZl9ubG1zZ19zaXplKGRldikpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyb3V0OwogCisJbWluX2lmaW5mb19kdW1wX3NpemUgPSBtYXhfdCh1MTYsIGlmX2luZm9fc2l6ZSwgbWluX2lmaW5mb19kdW1wX3NpemUpOworCiAJZXJyID0gcnRubF9maWxsX2lmaW5mbyhza2IsIGRldiwgdHlwZSwgMCwgMCwgY2hhbmdlLCAwKTsKIAlpZiAoZXJyIDwgMCkgewogCQkvKiAtRU1TR1NJWkUgaW1wbGllcyBCVUcgaW4gaWZfbmxtc2dfc2l6ZSgpICovCkBAIC0xOTAyLDE0ICsxOTM3LDIwIEBACiAJaWYgKGtpbmQgPT0gMiAmJiBubGgtPm5sbXNnX2ZsYWdzJk5MTV9GX0RVTVApIHsKIAkJc3RydWN0IHNvY2sgKnJ0bmw7CiAJCXJ0bmxfZHVtcGl0X2Z1bmMgZHVtcGl0OworCQlydG5sX2NhbGNpdF9mdW5jIGNhbGNpdDsKKwkJdTE2IG1pbl9kdW1wX2FsbG9jID0gMDsKIAogCQlkdW1waXQgPSBydG5sX2dldF9kdW1waXQoZmFtaWx5LCB0eXBlKTsKIAkJaWYgKGR1bXBpdCA9PSBOVUxMKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQljYWxjaXQgPSBydG5sX2dldF9jYWxjaXQoZmFtaWx5LCB0eXBlKTsKKwkJaWYgKGNhbGNpdCkKKwkJCW1pbl9kdW1wX2FsbG9jID0gY2FsY2l0KHNrYik7CiAKIAkJX19ydG5sX3VubG9jaygpOwogCQlydG5sID0gbmV0LT5ydG5sOwotCQllcnIgPSBuZXRsaW5rX2R1bXBfc3RhcnQocnRubCwgc2tiLCBubGgsIGR1bXBpdCwgTlVMTCk7CisJCWVyciA9IG5ldGxpbmtfZHVtcF9zdGFydChydG5sLCBza2IsIG5saCwgZHVtcGl0LAorCQkJCQkgTlVMTCwgbWluX2R1bXBfYWxsb2MpOwogCQlydG5sX2xvY2soKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yMDE5LDEyICsyMDYwLDEzIEBACiAJbmV0bGlua19zZXRfbm9ucm9vdChORVRMSU5LX1JPVVRFLCBOTF9OT05ST09UX1JFQ1YpOwogCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcnRuZXRsaW5rX2Rldl9ub3RpZmllcik7CiAKLQlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVExJTkssIHJ0bmxfZ2V0bGluaywgcnRubF9kdW1wX2lmaW5mbyk7Ci0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9TRVRMSU5LLCBydG5sX3NldGxpbmssIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fTkVXTElOSywgcnRubF9uZXdsaW5rLCBOVUxMKTsKLQlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0RFTExJTkssIHJ0bmxfZGVsbGluaywgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRMSU5LLCBydG5sX2dldGxpbmssCisJCSAgICAgIHJ0bmxfZHVtcF9pZmluZm8sIHJ0bmxfY2FsY2l0KTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX1NFVExJTkssIHJ0bmxfc2V0bGluaywgTlVMTCwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdMSU5LLCBydG5sX25ld2xpbmssIE5VTEwsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fREVMTElOSywgcnRubF9kZWxsaW5rLCBOVUxMLCBOVUxMKTsKIAotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUQUREUiwgTlVMTCwgcnRubF9kdW1wX2FsbCk7Ci0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRST1VURSwgTlVMTCwgcnRubF9kdW1wX2FsbCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRBRERSLCBOVUxMLCBydG5sX2R1bXBfYWxsLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVFJPVVRFLCBOVUxMLCBydG5sX2R1bXBfYWxsLCBOVUxMKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCA0NmNiZDI4Li4yYmVkYTgyIDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtMzI5LDYgKzMyOSwxOCBAQAogCQkJCXB1dF9wYWdlKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSk7CiAJCX0KIAorCQkvKgorCQkgKiBJZiBza2IgYnVmIGlzIGZyb20gdXNlcnNwYWNlLCB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgY2FsbGVyCisJCSAqIHRoZSBsb3dlciBkZXZpY2UgRE1BIGhhcyBkb25lOworCQkgKi8KKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgJiBTS0JUWF9ERVZfWkVST0NPUFkpIHsKKwkJCXN0cnVjdCB1YnVmX2luZm8gKnVhcmc7CisKKwkJCXVhcmcgPSBza2Jfc2hpbmZvKHNrYiktPmRlc3RydWN0b3JfYXJnOworCQkJaWYgKHVhcmctPmNhbGxiYWNrKQorCQkJCXVhcmctPmNhbGxiYWNrKHVhcmcpOworCQl9CisKIAkJaWYgKHNrYl9oYXNfZnJhZ19saXN0KHNrYikpCiAJCQlza2JfZHJvcF9mcmFnbGlzdChza2IpOwogCkBAIC00ODEsNiArNDkzLDkgQEAKIAlpZiAoaXJxc19kaXNhYmxlZCgpKQogCQlyZXR1cm4gZmFsc2U7CiAKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT50eF9mbGFncyAmIFNLQlRYX0RFVl9aRVJPQ09QWSkKKwkJcmV0dXJuIGZhbHNlOworCiAJaWYgKHNrYl9pc19ub25saW5lYXIoc2tiKSB8fCBza2ItPmZjbG9uZSAhPSBTS0JfRkNMT05FX1VOQVZBSUxBQkxFKQogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTU5Niw2ICs2MTEsNTEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNrYl9tb3JwaCk7CiAKKy8qIHNrYiBmcmFncyBjb3B5IHVzZXJzcGFjZSBidWZmZXJzIHRvIGtlcm5lbCAqLworc3RhdGljIGludCBza2JfY29weV91YnVmcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBnZnBfbWFzaykKK3sKKwlpbnQgaTsKKwlpbnQgbnVtX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKmhlYWQgPSBOVUxMOworCXN0cnVjdCB1YnVmX2luZm8gKnVhcmcgPSBza2Jfc2hpbmZvKHNrYiktPmRlc3RydWN0b3JfYXJnOworCisJZm9yIChpID0gMDsgaSA8IG51bV9mcmFnczsgaSsrKSB7CisJCXU4ICp2YWRkcjsKKwkJc2tiX2ZyYWdfdCAqZiA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCisJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOworCQlpZiAoIXBhZ2UpIHsKKwkJCXdoaWxlIChoZWFkKSB7CisJCQkJc3RydWN0IHBhZ2UgKm5leHQgPSAoc3RydWN0IHBhZ2UgKiloZWFkLT5wcml2YXRlOworCQkJCXB1dF9wYWdlKGhlYWQpOworCQkJCWhlYWQgPSBuZXh0OworCQkJfQorCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdmFkZHIgPSBrbWFwX3NrYl9mcmFnKCZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldKTsKKwkJbWVtY3B5KHBhZ2VfYWRkcmVzcyhwYWdlKSwKKwkJICAgICAgIHZhZGRyICsgZi0+cGFnZV9vZmZzZXQsIGYtPnNpemUpOworCQlrdW5tYXBfc2tiX2ZyYWcodmFkZHIpOworCQlwYWdlLT5wcml2YXRlID0gKHVuc2lnbmVkIGxvbmcpaGVhZDsKKwkJaGVhZCA9IHBhZ2U7CisJfQorCisJLyogc2tiIGZyYWdzIHJlbGVhc2UgdXNlcnNwYWNlIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKQorCQlwdXRfcGFnZShza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UpOworCisJdWFyZy0+Y2FsbGJhY2sodWFyZyk7CisKKwkvKiBza2IgZnJhZ3MgcG9pbnQgdG8ga2VybmVsIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpID4gMDsgaS0tKSB7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnBhZ2Vfb2Zmc2V0ID0gMDsKKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0ucGFnZSA9IGhlYWQ7CisJCWhlYWQgPSAoc3RydWN0IHBhZ2UgKiloZWFkLT5wcml2YXRlOworCX0KKwlyZXR1cm4gMDsKK30KKworCiAvKioKICAqCXNrYl9jbG9uZQktCWR1cGxpY2F0ZSBhbiBza19idWZmCiAgKglAc2tiOiBidWZmZXIgdG8gY2xvbmUKQEAgLTYxNCw2ICs2NzQsMTIgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbjsKIAorCWlmIChza2Jfc2hpbmZvKHNrYiktPnR4X2ZsYWdzICYgU0tCVFhfREVWX1pFUk9DT1BZKSB7CisJCWlmIChza2JfY29weV91YnVmcyhza2IsIGdmcF9tYXNrKSkKKwkJCXJldHVybiBOVUxMOworCQlza2Jfc2hpbmZvKHNrYiktPnR4X2ZsYWdzICY9IH5TS0JUWF9ERVZfWkVST0NPUFk7CisJfQorCiAJbiA9IHNrYiArIDE7CiAJaWYgKHNrYi0+ZmNsb25lID09IFNLQl9GQ0xPTkVfT1JJRyAmJgogCSAgICBuLT5mY2xvbmUgPT0gU0tCX0ZDTE9ORV9VTkFWQUlMQUJMRSkgewpAQCAtNzMxLDYgKzc5NywxNCBAQAogCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSB7CiAJCWludCBpOwogCisJCWlmIChza2Jfc2hpbmZvKHNrYiktPnR4X2ZsYWdzICYgU0tCVFhfREVWX1pFUk9DT1BZKSB7CisJCQlpZiAoc2tiX2NvcHlfdWJ1ZnMoc2tiLCBnZnBfbWFzaykpIHsKKwkJCQlrZnJlZV9za2Iobik7CisJCQkJbiA9IE5VTEw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlza2Jfc2hpbmZvKHNrYiktPnR4X2ZsYWdzICY9IH5TS0JUWF9ERVZfWkVST0NPUFk7CisJCX0KIAkJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgewogCQkJc2tiX3NoaW5mbyhuKS0+ZnJhZ3NbaV0gPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwogCQkJZ2V0X3BhZ2Uoc2tiX3NoaW5mbyhuKS0+ZnJhZ3NbaV0ucGFnZSk7CkBAIC03ODgsNyArODYyLDYgQEAKIAkJZmFzdHBhdGggPSB0cnVlOwogCWVsc2UgewogCQlpbnQgZGVsdGEgPSBza2ItPm5vaGRyID8gKDEgPDwgU0tCX0RBVEFSRUZfU0hJRlQpICsgMSA6IDE7Ci0KIAkJZmFzdHBhdGggPSBhdG9taWNfcmVhZCgmc2tiX3NoaW5mbyhza2IpLT5kYXRhcmVmKSA9PSBkZWx0YTsKIAl9CiAKQEAgLTgxOSw2ICs4OTIsMTIgQEAKIAlpZiAoZmFzdHBhdGgpIHsKIAkJa2ZyZWUoc2tiLT5oZWFkKTsKIAl9IGVsc2UgeworCQkvKiBjb3B5IHRoaXMgemVybyBjb3B5IHNrYiBmcmFncyAqLworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT50eF9mbGFncyAmIFNLQlRYX0RFVl9aRVJPQ09QWSkgeworCQkJaWYgKHNrYl9jb3B5X3VidWZzKHNrYiwgZ2ZwX21hc2spKQorCQkJCWdvdG8gbm9mcmFnczsKKwkJCXNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgJj0gflNLQlRYX0RFVl9aRVJPQ09QWTsKKwkJfQogCQlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKQogCQkJZ2V0X3BhZ2Uoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlKTsKIApAQCAtODUzLDYgKzkzMiw4IEBACiAJYXRvbWljX3NldCgmc2tiX3NoaW5mbyhza2IpLT5kYXRhcmVmLCAxKTsKIAlyZXR1cm4gMDsKIAorbm9mcmFnczoKKwlrZnJlZShkYXRhKTsKIG5vZGF0YToKIAlyZXR1cm4gLUVOT01FTTsKIH0KQEAgLTEzNTQsNiArMTQzNSw3IEBACiAJCX0KIAkJc3RhcnQgPSBlbmQ7CiAJfQorCiAJaWYgKCFsZW4pCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9zb2NrLmMgYi9uZXQvY29yZS9zb2NrLmMKaW5kZXggNmU4MTk3OC4uYmM3NDVkMCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc29jay5jCisrKyBiL25ldC9jb3JlL3NvY2suYwpAQCAtMTI4LDYgKzEyOCw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KIAorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9zb2NrLmg+CisKICNpZmRlZiBDT05GSUdfSU5FVAogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNlbmRpZgpAQCAtMTU4LDcgKzE2MCw3IEBACiAgICJza19sb2NrLUFGX1RJUEMiICAsICJza19sb2NrLUFGX0JMVUVUT09USCIsICJza19sb2NrLUlVQ1YiICAgICAgICAsCiAgICJza19sb2NrLUFGX1JYUlBDIiAsICJza19sb2NrLUFGX0lTRE4iICAgICAsICJza19sb2NrLUFGX1BIT05FVCIgICAsCiAgICJza19sb2NrLUFGX0lFRUU4MDIxNTQiLCAic2tfbG9jay1BRl9DQUlGIiAsICJza19sb2NrLUFGX0FMRyIgICAgICAsCi0gICJza19sb2NrLUFGX01BWCIKKyAgInNrX2xvY2stQUZfTkZDIiAgICwgInNrX2xvY2stQUZfTUFYIgogfTsKIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhZl9mYW1pbHlfc2xvY2tfa2V5X3N0cmluZ3NbQUZfTUFYKzFdID0gewogICAic2xvY2stQUZfVU5TUEVDIiwgInNsb2NrLUFGX1VOSVgiICAgICAsICJzbG9jay1BRl9JTkVUIiAgICAgLApAQCAtMTc0LDcgKzE3Niw3IEBACiAgICJzbG9jay1BRl9USVBDIiAgLCAic2xvY2stQUZfQkxVRVRPT1RIIiwgInNsb2NrLUFGX0lVQ1YiICAgICAsCiAgICJzbG9jay1BRl9SWFJQQyIgLCAic2xvY2stQUZfSVNETiIgICAgICwgInNsb2NrLUFGX1BIT05FVCIgICAsCiAgICJzbG9jay1BRl9JRUVFODAyMTU0IiwgInNsb2NrLUFGX0NBSUYiICwgInNsb2NrLUFGX0FMRyIgICAgICAsCi0gICJzbG9jay1BRl9NQVgiCisgICJzbG9jay1BRl9ORkMiICAgLCAic2xvY2stQUZfTUFYIgogfTsKIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhZl9mYW1pbHlfY2xvY2tfa2V5X3N0cmluZ3NbQUZfTUFYKzFdID0gewogICAiY2xvY2stQUZfVU5TUEVDIiwgImNsb2NrLUFGX1VOSVgiICAgICAsICJjbG9jay1BRl9JTkVUIiAgICAgLApAQCAtMTkwLDcgKzE5Miw3IEBACiAgICJjbG9jay1BRl9USVBDIiAgLCAiY2xvY2stQUZfQkxVRVRPT1RIIiwgImNsb2NrLUFGX0lVQ1YiICAgICAsCiAgICJjbG9jay1BRl9SWFJQQyIgLCAiY2xvY2stQUZfSVNETiIgICAgICwgImNsb2NrLUFGX1BIT05FVCIgICAsCiAgICJjbG9jay1BRl9JRUVFODAyMTU0IiwgImNsb2NrLUFGX0NBSUYiICwgImNsb2NrLUFGX0FMRyIgICAgICAsCi0gICJjbG9jay1BRl9NQVgiCisgICJjbG9jay1BRl9ORkMiICAgLCAiY2xvY2stQUZfTUFYIgogfTsKIAogLyoKQEAgLTI5Miw2ICsyOTQsNyBAQAogCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpICsgc2tiLT50cnVlc2l6ZSA+PQogCSAgICAodW5zaWduZWQpc2stPnNrX3JjdmJ1ZikgewogCQlhdG9taWNfaW5jKCZzay0+c2tfZHJvcHMpOworCQl0cmFjZV9zb2NrX3JjdnF1ZXVlX2Z1bGwoc2ssIHNrYik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTczNiw2ICsxNzM5LDggQEAKIAkJCXJldHVybiAxOwogCX0KIAorCXRyYWNlX3NvY2tfZXhjZWVkX2J1Zl9saW1pdChzaywgcHJvdCwgYWxsb2NhdGVkKTsKKwogCS8qIEFsYXMuIFVuZG8gY2hhbmdlcy4gKi8KIAlzay0+c2tfZm9yd2FyZF9hbGxvYyAtPSBhbXQgKiBTS19NRU1fUVVBTlRVTTsKIAlhdG9taWNfbG9uZ19zdWIoYW10LCBwcm90LT5tZW1vcnlfYWxsb2NhdGVkKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3RpbWVzdGFtcGluZy5jIGIvbmV0L2NvcmUvdGltZXN0YW1waW5nLmMKaW5kZXggN2U3Y2EzNy4uOThhNTI2NCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvdGltZXN0YW1waW5nLmMKKysrIGIvbmV0L2NvcmUvdGltZXN0YW1waW5nLmMKQEAgLTY4LDYgKzY4LDcgQEAKIAkJYnJlYWs7CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2tiX2Nsb25lX3R4X3RpbWVzdGFtcCk7CiAKIHZvaWQgc2tiX2NvbXBsZXRlX3R4X3RpbWVzdGFtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgIHN0cnVjdCBza2Jfc2hhcmVkX2h3dHN0YW1wcyAqaHd0c3RhbXBzKQpAQCAtMTIxLDYgKzEyMiw3IEBACiAKIAlyZXR1cm4gZmFsc2U7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChza2JfZGVmZXJfcnhfdGltZXN0YW1wKTsKIAogdm9pZCBfX2luaXQgc2tiX3RpbWVzdGFtcGluZ19pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9uZXQvZGNiL2RjYm5sLmMgYi9uZXQvZGNiL2RjYm5sLmMKaW5kZXggMzYwOWVhYy4uM2NiNTZhZiAxMDA2NDQKLS0tIGEvbmV0L2RjYi9kY2JubC5jCisrKyBiL25ldC9kY2IvZGNibmwuYwpAQCAtMTE2Niw2NCArMTE2Niw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogSGFuZGxlIElFRUUgODAyLjFRYXogU0VUIGNvbW1hbmRzLiBJZiBhbnkgcmVxdWVzdGVkIG9wZXJhdGlvbiBjYW4gbm90Ci0gKiBiZSBjb21wbGV0ZWQgdGhlIGVudGlyZSBtc2cgaXMgYWJvcnRlZCBhbmQgZXJyb3IgdmFsdWUgaXMgcmV0dXJuZWQuCi0gKiBObyBhdHRlbXB0IGlzIG1hZGUgdG8gcmVjb25jaWxlIHRoZSBjYXNlIHdoZXJlIG9ubHkgcGFydCBvZiB0aGUKLSAqIGNtZCBjYW4gYmUgY29tcGxldGVkLgotICovCi1zdGF0aWMgaW50IGRjYm5sX2llZWVfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBubGF0dHIgKip0YiwKLQkJCSAgdTMyIHBpZCwgdTMyIHNlcSwgdTE2IGZsYWdzKQotewotCWNvbnN0IHN0cnVjdCBkY2JubF9ydG5sX29wcyAqb3BzID0gbmV0ZGV2LT5kY2JubF9vcHM7Ci0Jc3RydWN0IG5sYXR0ciAqaWVlZVtEQ0JfQVRUUl9JRUVFX01BWCArIDFdOwotCWludCBlcnIgPSAtRU9QTk9UU1VQUDsKLQotCWlmICghb3BzKQotCQlnb3RvIGVycjsKLQotCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQoaWVlZSwgRENCX0FUVFJfSUVFRV9NQVgsCi0JCQkgICAgICAgdGJbRENCX0FUVFJfSUVFRV0sIGRjYm5sX2llZWVfcG9saWN5KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjsKLQotCWlmIChpZWVlW0RDQl9BVFRSX0lFRUVfRVRTXSAmJiBvcHMtPmllZWVfc2V0ZXRzKSB7Ci0JCXN0cnVjdCBpZWVlX2V0cyAqZXRzID0gbmxhX2RhdGEoaWVlZVtEQ0JfQVRUUl9JRUVFX0VUU10pOwotCQllcnIgPSBvcHMtPmllZWVfc2V0ZXRzKG5ldGRldiwgZXRzKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyOwotCX0KLQotCWlmIChpZWVlW0RDQl9BVFRSX0lFRUVfUEZDXSAmJiBvcHMtPmllZWVfc2V0cGZjKSB7Ci0JCXN0cnVjdCBpZWVlX3BmYyAqcGZjID0gbmxhX2RhdGEoaWVlZVtEQ0JfQVRUUl9JRUVFX1BGQ10pOwotCQllcnIgPSBvcHMtPmllZWVfc2V0cGZjKG5ldGRldiwgcGZjKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyOwotCX0KLQotCWlmIChpZWVlW0RDQl9BVFRSX0lFRUVfQVBQX1RBQkxFXSkgewotCQlzdHJ1Y3QgbmxhdHRyICphdHRyOwotCQlpbnQgcmVtOwotCi0JCW5sYV9mb3JfZWFjaF9uZXN0ZWQoYXR0ciwgaWVlZVtEQ0JfQVRUUl9JRUVFX0FQUF9UQUJMRV0sIHJlbSkgewotCQkJc3RydWN0IGRjYl9hcHAgKmFwcF9kYXRhOwotCQkJaWYgKG5sYV90eXBlKGF0dHIpICE9IERDQl9BVFRSX0lFRUVfQVBQKQotCQkJCWNvbnRpbnVlOwotCQkJYXBwX2RhdGEgPSBubGFfZGF0YShhdHRyKTsKLQkJCWlmIChvcHMtPmllZWVfc2V0YXBwKQotCQkJCWVyciA9IG9wcy0+aWVlZV9zZXRhcHAobmV0ZGV2LCBhcHBfZGF0YSk7Ci0JCQllbHNlCi0JCQkJZXJyID0gZGNiX3NldGFwcChuZXRkZXYsIGFwcF9kYXRhKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLWVycjoKLQlkY2JubF9yZXBseShlcnIsIFJUTV9TRVREQ0IsIERDQl9DTURfSUVFRV9TRVQsIERDQl9BVFRSX0lFRUUsCi0JCSAgICBwaWQsIHNlcSwgZmxhZ3MpOwotCXJldHVybiBlcnI7Ci19Ci0KIHN0YXRpYyBpbnQgZGNibmxfYnVpbGRfcGVlcl9hcHAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IHNrX2J1ZmYqIHNrYiwKIAkJCQlpbnQgYXBwX25lc3RlZF90eXBlLCBpbnQgYXBwX2luZm9fdHlwZSwKIAkJCQlpbnQgYXBwX2VudHJ5X3R5cGUpCkBAIC0xMjc5LDI5ICsxMjIxLDEzIEBACiB9CiAKIC8qIEhhbmRsZSBJRUVFIDgwMi4xUWF6IEdFVCBjb21tYW5kcy4gKi8KLXN0YXRpYyBpbnQgZGNibmxfaWVlZV9nZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IG5sYXR0ciAqKnRiLAotCQkJICB1MzIgcGlkLCB1MzIgc2VxLCB1MTYgZmxhZ3MpCitzdGF0aWMgaW50IGRjYm5sX2llZWVfZmlsbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IG5sbXNnaGRyICpubGg7Ci0Jc3RydWN0IGRjYm1zZyAqZGNiOwogCXN0cnVjdCBubGF0dHIgKmllZWUsICphcHA7CiAJc3RydWN0IGRjYl9hcHBfdHlwZSAqaXRyOwogCWNvbnN0IHN0cnVjdCBkY2JubF9ydG5sX29wcyAqb3BzID0gbmV0ZGV2LT5kY2JubF9vcHM7Ci0JaW50IGVycjsKLQotCWlmICghb3BzKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlza2IgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIC1FTk9CVUZTOwotCi0JbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIFJUTV9HRVREQ0IsIHNpemVvZigqZGNiKSwgZmxhZ3MpOwotCi0JZGNiID0gTkxNU0dfREFUQShubGgpOwotCWRjYi0+ZGNiX2ZhbWlseSA9IEFGX1VOU1BFQzsKLQlkY2ItPmNtZCA9IERDQl9DTURfSUVFRV9HRVQ7CisJaW50IGRjYng7CisJaW50IGVyciA9IC1FTVNHU0laRTsKIAogCU5MQV9QVVRfU1RSSU5HKHNrYiwgRENCX0FUVFJfSUZOQU1FLCBuZXRkZXYtPm5hbWUpOwogCkBAIC0xMzM4LDYgKzEyNjQsMTIgQEAKIAkJCX0KIAkJfQogCX0KKworCWlmIChuZXRkZXYtPmRjYm5sX29wcy0+Z2V0ZGNieCkKKwkJZGNieCA9IG5ldGRldi0+ZGNibmxfb3BzLT5nZXRkY2J4KG5ldGRldik7CisJZWxzZQorCQlkY2J4ID0gLUVPUE5PVFNVUFA7CisKIAlzcGluX3VubG9jaygmZGNiX2xvY2spOwogCW5sYV9uZXN0X2VuZChza2IsIGFwcCk7CiAKQEAgLTEzNjYsMTYgKzEyOTgsNDEzIEBACiAJfQogCiAJbmxhX25lc3RfZW5kKHNrYiwgaWVlZSk7Ci0Jbmxtc2dfZW5kKHNrYiwgbmxoKTsKKwlpZiAoZGNieCA+PSAwKSB7CisJCWVyciA9IG5sYV9wdXRfdTgoc2tiLCBEQ0JfQVRUUl9EQ0JYLCBkY2J4KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KIAotCXJldHVybiBydG5sX3VuaWNhc3Qoc2tiLCAmaW5pdF9uZXQsIHBpZCk7CisJcmV0dXJuIDA7CisKIG5sYV9wdXRfZmFpbHVyZToKLQlubG1zZ19jYW5jZWwoc2tiLCBubGgpOwotbmxtc2dfZmFpbHVyZToKLQlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBkY2JubF9jZWVfcGdfZmlsbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBpbnQgZGlyKQoreworCXU4IHBnaWQsIHVwX21hcCwgcHJpbywgdGNfcGN0OworCWNvbnN0IHN0cnVjdCBkY2JubF9ydG5sX29wcyAqb3BzID0gZGV2LT5kY2JubF9vcHM7CisJaW50IGkgPSBkaXIgPyBEQ0JfQVRUUl9DRUVfVFhfUEcgOiBEQ0JfQVRUUl9DRUVfUlhfUEc7CisJc3RydWN0IG5sYXR0ciAqcGcgPSBubGFfbmVzdF9zdGFydChza2IsIGkpOworCisJaWYgKCFwZykKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlmb3IgKGkgPSBEQ0JfUEdfQVRUUl9UQ18wOyBpIDw9IERDQl9QR19BVFRSX1RDXzc7IGkrKykgeworCQlzdHJ1Y3QgbmxhdHRyICp0Y19uZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBpKTsKKworCQlpZiAoIXRjX25lc3QpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCQlwZ2lkID0gRENCX0FUVFJfVkFMVUVfVU5ERUZJTkVEOworCQlwcmlvID0gRENCX0FUVFJfVkFMVUVfVU5ERUZJTkVEOworCQl0Y19wY3QgPSBEQ0JfQVRUUl9WQUxVRV9VTkRFRklORUQ7CisJCXVwX21hcCA9IERDQl9BVFRSX1ZBTFVFX1VOREVGSU5FRDsKKworCQlpZiAoIWRpcikKKwkJCW9wcy0+Z2V0cGd0Y2NmZ3J4KGRldiwgaSAtIERDQl9QR19BVFRSX1RDXzAsCisJCQkJCSAgJnByaW8sICZwZ2lkLCAmdGNfcGN0LCAmdXBfbWFwKTsKKwkJZWxzZQorCQkJb3BzLT5nZXRwZ3RjY2ZndHgoZGV2LCBpIC0gRENCX1BHX0FUVFJfVENfMCwKKwkJCQkJICAmcHJpbywgJnBnaWQsICZ0Y19wY3QsICZ1cF9tYXApOworCisJCU5MQV9QVVRfVTgoc2tiLCBEQ0JfVENfQVRUUl9QQVJBTV9QR0lELCBwZ2lkKTsKKwkJTkxBX1BVVF9VOChza2IsIERDQl9UQ19BVFRSX1BBUkFNX1VQX01BUFBJTkcsIHVwX21hcCk7CisJCU5MQV9QVVRfVTgoc2tiLCBEQ0JfVENfQVRUUl9QQVJBTV9TVFJJQ1RfUFJJTywgcHJpbyk7CisJCU5MQV9QVVRfVTgoc2tiLCBEQ0JfVENfQVRUUl9QQVJBTV9CV19QQ1QsIHRjX3BjdCk7CisJCW5sYV9uZXN0X2VuZChza2IsIHRjX25lc3QpOworCX0KKworCWZvciAoaSA9IERDQl9QR19BVFRSX0JXX0lEXzA7IGkgPD0gRENCX1BHX0FUVFJfQldfSURfNzsgaSsrKSB7CisJCXRjX3BjdCA9IERDQl9BVFRSX1ZBTFVFX1VOREVGSU5FRDsKKworCQlpZiAoIWRpcikKKwkJCW9wcy0+Z2V0cGdid2djZmdyeChkZXYsIGkgLSBEQ0JfUEdfQVRUUl9CV19JRF8wLAorCQkJCQkgICAmdGNfcGN0KTsKKwkJZWxzZQorCQkJb3BzLT5nZXRwZ2J3Z2NmZ3R4KGRldiwgaSAtIERDQl9QR19BVFRSX0JXX0lEXzAsCisJCQkJCSAgICZ0Y19wY3QpOworCQlOTEFfUFVUX1U4KHNrYiwgaSwgdGNfcGN0KTsKKwl9CisJbmxhX25lc3RfZW5kKHNrYiwgcGcpOworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCBkY2JubF9jZWVfZmlsbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBubGF0dHIgKmNlZSwgKmFwcDsKKwlzdHJ1Y3QgZGNiX2FwcF90eXBlICppdHI7CisJY29uc3Qgc3RydWN0IGRjYm5sX3J0bmxfb3BzICpvcHMgPSBuZXRkZXYtPmRjYm5sX29wczsKKwlpbnQgZGNieCwgaSwgZXJyID0gLUVNU0dTSVpFOworCXU4IHZhbHVlOworCisJTkxBX1BVVF9TVFJJTkcoc2tiLCBEQ0JfQVRUUl9JRk5BTUUsIG5ldGRldi0+bmFtZSk7CisKKwljZWUgPSBubGFfbmVzdF9zdGFydChza2IsIERDQl9BVFRSX0NFRSk7CisJaWYgKCFjZWUpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJLyogbG9jYWwgcGcgKi8KKwlpZiAob3BzLT5nZXRwZ3RjY2ZndHggJiYgb3BzLT5nZXRwZ2J3Z2NmZ3R4KSB7CisJCWVyciA9IGRjYm5sX2NlZV9wZ19maWxsKHNrYiwgbmV0ZGV2LCAxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KKworCWlmIChvcHMtPmdldHBndGNjZmdyeCAmJiBvcHMtPmdldHBnYndnY2ZncngpIHsKKwkJZXJyID0gZGNibmxfY2VlX3BnX2ZpbGwoc2tiLCBuZXRkZXYsIDApOworCQlpZiAoZXJyKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQorCisJLyogbG9jYWwgcGZjICovCisJaWYgKG9wcy0+Z2V0cGZjY2ZnKSB7CisJCXN0cnVjdCBubGF0dHIgKnBmY19uZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBEQ0JfQVRUUl9DRUVfUEZDKTsKKworCQlpZiAoIXBmY19uZXN0KQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwkJZm9yIChpID0gRENCX1BGQ19VUF9BVFRSXzA7IGkgPD0gRENCX1BGQ19VUF9BVFRSXzc7IGkrKykgeworCQkJb3BzLT5nZXRwZmNjZmcobmV0ZGV2LCBpIC0gRENCX1BGQ19VUF9BVFRSXzAsICZ2YWx1ZSk7CisJCQlOTEFfUFVUX1U4KHNrYiwgaSwgdmFsdWUpOworCQl9CisJCW5sYV9uZXN0X2VuZChza2IsIHBmY19uZXN0KTsKKwl9CisKKwkvKiBsb2NhbCBhcHAgKi8KKwlzcGluX2xvY2soJmRjYl9sb2NrKTsKKwlhcHAgPSBubGFfbmVzdF9zdGFydChza2IsIERDQl9BVFRSX0NFRV9BUFBfVEFCTEUpOworCWlmICghYXBwKQorCQlnb3RvIGRjYl91bmxvY2s7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ciwgJmRjYl9hcHBfbGlzdCwgbGlzdCkgeworCQlpZiAoc3RybmNtcChpdHItPm5hbWUsIG5ldGRldi0+bmFtZSwgSUZOQU1TSVopID09IDApIHsKKwkJCXN0cnVjdCBubGF0dHIgKmFwcF9uZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLAorCQkJCQkJCQkgRENCX0FUVFJfQVBQKTsKKwkJCWlmICghYXBwX25lc3QpCisJCQkJZ290byBkY2JfdW5sb2NrOworCisJCQllcnIgPSBubGFfcHV0X3U4KHNrYiwgRENCX0FQUF9BVFRSX0lEVFlQRSwKKwkJCQkJIGl0ci0+YXBwLnNlbGVjdG9yKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBkY2JfdW5sb2NrOworCisJCQllcnIgPSBubGFfcHV0X3UxNihza2IsIERDQl9BUFBfQVRUUl9JRCwKKwkJCQkJICBpdHItPmFwcC5wcm90b2NvbCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZGNiX3VubG9jazsKKworCQkJZXJyID0gbmxhX3B1dF91OChza2IsIERDQl9BUFBfQVRUUl9QUklPUklUWSwKKwkJCQkJIGl0ci0+YXBwLnByaW9yaXR5KTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBkY2JfdW5sb2NrOworCisJCQlubGFfbmVzdF9lbmQoc2tiLCBhcHBfbmVzdCk7CisJCX0KKwl9CisJbmxhX25lc3RfZW5kKHNrYiwgYXBwKTsKKworCWlmIChuZXRkZXYtPmRjYm5sX29wcy0+Z2V0ZGNieCkKKwkJZGNieCA9IG5ldGRldi0+ZGNibmxfb3BzLT5nZXRkY2J4KG5ldGRldik7CisJZWxzZQorCQlkY2J4ID0gLUVPUE5PVFNVUFA7CisKKwlzcGluX3VubG9jaygmZGNiX2xvY2spOworCisJLyogZmVhdHVyZXMgZmxhZ3MgKi8KKwlpZiAob3BzLT5nZXRmZWF0Y2ZnKSB7CisJCXN0cnVjdCBubGF0dHIgKmZlYXQgPSBubGFfbmVzdF9zdGFydChza2IsIERDQl9BVFRSX0NFRV9GRUFUKTsKKwkJaWYgKCFmZWF0KQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwkJZm9yIChpID0gRENCX0ZFQVRDRkdfQVRUUl9BTEwgKyAxOyBpIDw9IERDQl9GRUFUQ0ZHX0FUVFJfTUFYOworCQkgICAgIGkrKykKKwkJCWlmICghb3BzLT5nZXRmZWF0Y2ZnKG5ldGRldiwgaSwgJnZhbHVlKSkKKwkJCQlOTEFfUFVUX1U4KHNrYiwgaSwgdmFsdWUpOworCisJCW5sYV9uZXN0X2VuZChza2IsIGZlYXQpOworCX0KKworCS8qIHBlZXIgaW5mbyBpZiBhdmFpbGFibGUgKi8KKwlpZiAob3BzLT5jZWVfcGVlcl9nZXRwZykgeworCQlzdHJ1Y3QgY2VlX3BnIHBnOworCQllcnIgPSBvcHMtPmNlZV9wZWVyX2dldHBnKG5ldGRldiwgJnBnKTsKKwkJaWYgKCFlcnIpCisJCQlOTEFfUFVUKHNrYiwgRENCX0FUVFJfQ0VFX1BFRVJfUEcsIHNpemVvZihwZyksICZwZyk7CisJfQorCisJaWYgKG9wcy0+Y2VlX3BlZXJfZ2V0cGZjKSB7CisJCXN0cnVjdCBjZWVfcGZjIHBmYzsKKwkJZXJyID0gb3BzLT5jZWVfcGVlcl9nZXRwZmMobmV0ZGV2LCAmcGZjKTsKKwkJaWYgKCFlcnIpCisJCQlOTEFfUFVUKHNrYiwgRENCX0FUVFJfQ0VFX1BFRVJfUEZDLCBzaXplb2YocGZjKSwgJnBmYyk7CisJfQorCisJaWYgKG9wcy0+cGVlcl9nZXRhcHBpbmZvICYmIG9wcy0+cGVlcl9nZXRhcHB0YWJsZSkgeworCQllcnIgPSBkY2JubF9idWlsZF9wZWVyX2FwcChuZXRkZXYsIHNrYiwKKwkJCQkJICAgRENCX0FUVFJfQ0VFX1BFRVJfQVBQX1RBQkxFLAorCQkJCQkgICBEQ0JfQVRUUl9DRUVfUEVFUl9BUFBfSU5GTywKKwkJCQkJICAgRENCX0FUVFJfQ0VFX1BFRVJfQVBQKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KKwlubGFfbmVzdF9lbmQoc2tiLCBjZWUpOworCisJLyogRENCWCBzdGF0ZSAqLworCWlmIChkY2J4ID49IDApIHsKKwkJZXJyID0gbmxhX3B1dF91OChza2IsIERDQl9BVFRSX0RDQlgsIGRjYngpOworCQlpZiAoZXJyKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQorCXJldHVybiAwOworCitkY2JfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZkY2JfbG9jayk7CitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkY2JubF9ub3RpZnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGV2ZW50LCBpbnQgY21kLAorCQkJdTMyIHNlcSwgdTMyIHBpZCwgaW50IGRjYnhfdmVyKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXN0cnVjdCBkY2Jtc2cgKmRjYjsKKwljb25zdCBzdHJ1Y3QgZGNibmxfcnRubF9vcHMgKm9wcyA9IGRldi0+ZGNibmxfb3BzOworCWludCBlcnI7CisKKwlpZiAoIW9wcykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc2tiID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PQlVGUzsKKworCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgMCwgZXZlbnQsIHNpemVvZigqZGNiKSwgMCk7CisJaWYgKG5saCA9PSBOVUxMKSB7CisJCW5sbXNnX2ZyZWUoc2tiKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CisKKwlkY2IgPSBOTE1TR19EQVRBKG5saCk7CisJZGNiLT5kY2JfZmFtaWx5ID0gQUZfVU5TUEVDOworCWRjYi0+Y21kID0gY21kOworCisJaWYgKGRjYnhfdmVyID09IERDQl9DQVBfRENCWF9WRVJfSUVFRSkKKwkJZXJyID0gZGNibmxfaWVlZV9maWxsKHNrYiwgZGV2KTsKKwllbHNlCisJCWVyciA9IGRjYm5sX2NlZV9maWxsKHNrYiwgZGV2KTsKKworCWlmIChlcnIgPCAwKSB7CisJCS8qIFJlcG9ydCBlcnJvciB0byBicm9hZGNhc3QgbGlzdGVuZXJzICovCisJCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJCWtmcmVlX3NrYihza2IpOworCQlydG5sX3NldF9za19lcnIobmV0LCBSVE5MR1JQX0RDQiwgZXJyKTsKKwl9IGVsc2UgeworCQkvKiBFbmQgbmxtc2cgYW5kIG5vdGlmeSBicm9hZGNhc3QgbGlzdGVuZXJzICovCisJCW5sbXNnX2VuZChza2IsIG5saCk7CisJCXJ0bmxfbm90aWZ5KHNrYiwgbmV0LCAwLCBSVE5MR1JQX0RDQiwgTlVMTCwgR0ZQX0tFUk5FTCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworaW50IGRjYm5sX2llZWVfbm90aWZ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBldmVudCwgaW50IGNtZCwKKwkJICAgICAgdTMyIHNlcSwgdTMyIHBpZCkKK3sKKwlyZXR1cm4gZGNibmxfbm90aWZ5KGRldiwgZXZlbnQsIGNtZCwgc2VxLCBwaWQsIERDQl9DQVBfRENCWF9WRVJfSUVFRSk7Cit9CitFWFBPUlRfU1lNQk9MKGRjYm5sX2llZWVfbm90aWZ5KTsKKworaW50IGRjYm5sX2NlZV9ub3RpZnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGV2ZW50LCBpbnQgY21kLAorCQkgICAgIHUzMiBzZXEsIHUzMiBwaWQpCit7CisJcmV0dXJuIGRjYm5sX25vdGlmeShkZXYsIGV2ZW50LCBjbWQsIHNlcSwgcGlkLCBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSk7Cit9CitFWFBPUlRfU1lNQk9MKGRjYm5sX2NlZV9ub3RpZnkpOworCisvKiBIYW5kbGUgSUVFRSA4MDIuMVFheiBTRVQgY29tbWFuZHMuIElmIGFueSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGNhbiBub3QKKyAqIGJlIGNvbXBsZXRlZCB0aGUgZW50aXJlIG1zZyBpcyBhYm9ydGVkIGFuZCBlcnJvciB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqIE5vIGF0dGVtcHQgaXMgbWFkZSB0byByZWNvbmNpbGUgdGhlIGNhc2Ugd2hlcmUgb25seSBwYXJ0IG9mIHRoZQorICogY21kIGNhbiBiZSBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyBpbnQgZGNibmxfaWVlZV9zZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IG5sYXR0ciAqKnRiLAorCQkJICB1MzIgcGlkLCB1MzIgc2VxLCB1MTYgZmxhZ3MpCit7CisJY29uc3Qgc3RydWN0IGRjYm5sX3J0bmxfb3BzICpvcHMgPSBuZXRkZXYtPmRjYm5sX29wczsKKwlzdHJ1Y3QgbmxhdHRyICppZWVlW0RDQl9BVFRSX0lFRUVfTUFYICsgMV07CisJaW50IGVyciA9IC1FT1BOT1RTVVBQOworCisJaWYgKCFvcHMpCisJCXJldHVybiBlcnI7CisKKwlpZiAoIXRiW0RDQl9BVFRSX0lFRUVdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQoaWVlZSwgRENCX0FUVFJfSUVFRV9NQVgsCisJCQkgICAgICAgdGJbRENCX0FUVFJfSUVFRV0sIGRjYm5sX2llZWVfcG9saWN5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGllZWVbRENCX0FUVFJfSUVFRV9FVFNdICYmIG9wcy0+aWVlZV9zZXRldHMpIHsKKwkJc3RydWN0IGllZWVfZXRzICpldHMgPSBubGFfZGF0YShpZWVlW0RDQl9BVFRSX0lFRUVfRVRTXSk7CisJCWVyciA9IG9wcy0+aWVlZV9zZXRldHMobmV0ZGV2LCBldHMpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnI7CisJfQorCisJaWYgKGllZWVbRENCX0FUVFJfSUVFRV9QRkNdICYmIG9wcy0+aWVlZV9zZXRwZmMpIHsKKwkJc3RydWN0IGllZWVfcGZjICpwZmMgPSBubGFfZGF0YShpZWVlW0RDQl9BVFRSX0lFRUVfUEZDXSk7CisJCWVyciA9IG9wcy0+aWVlZV9zZXRwZmMobmV0ZGV2LCBwZmMpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnI7CisJfQorCisJaWYgKGllZWVbRENCX0FUVFJfSUVFRV9BUFBfVEFCTEVdKSB7CisJCXN0cnVjdCBubGF0dHIgKmF0dHI7CisJCWludCByZW07CisKKwkJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCBpZWVlW0RDQl9BVFRSX0lFRUVfQVBQX1RBQkxFXSwgcmVtKSB7CisJCQlzdHJ1Y3QgZGNiX2FwcCAqYXBwX2RhdGE7CisJCQlpZiAobmxhX3R5cGUoYXR0cikgIT0gRENCX0FUVFJfSUVFRV9BUFApCisJCQkJY29udGludWU7CisJCQlhcHBfZGF0YSA9IG5sYV9kYXRhKGF0dHIpOworCQkJaWYgKG9wcy0+aWVlZV9zZXRhcHApCisJCQkJZXJyID0gb3BzLT5pZWVlX3NldGFwcChuZXRkZXYsIGFwcF9kYXRhKTsKKwkJCWVsc2UKKwkJCQllcnIgPSBkY2JfaWVlZV9zZXRhcHAobmV0ZGV2LCBhcHBfZGF0YSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZXJyOworCQl9CisJfQorCitlcnI6CisJZGNibmxfcmVwbHkoZXJyLCBSVE1fU0VURENCLCBEQ0JfQ01EX0lFRUVfU0VULCBEQ0JfQVRUUl9JRUVFLAorCQkgICAgcGlkLCBzZXEsIGZsYWdzKTsKKwlkY2JubF9pZWVlX25vdGlmeShuZXRkZXYsIFJUTV9TRVREQ0IsIERDQl9DTURfSUVFRV9TRVQsIHNlcSwgMCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkY2JubF9pZWVlX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgbmxhdHRyICoqdGIsCisJCQkgIHUzMiBwaWQsIHUzMiBzZXEsIHUxNiBmbGFncykKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KG5ldGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlzdHJ1Y3QgZGNibXNnICpkY2I7CisJY29uc3Qgc3RydWN0IGRjYm5sX3J0bmxfb3BzICpvcHMgPSBuZXRkZXYtPmRjYm5sX29wczsKKwlpbnQgZXJyOworCisJaWYgKCFvcHMpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXNrYiA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgUlRNX0dFVERDQiwgc2l6ZW9mKCpkY2IpLCBmbGFncyk7CisJaWYgKG5saCA9PSBOVUxMKSB7CisJCW5sbXNnX2ZyZWUoc2tiKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CisKKwlkY2IgPSBOTE1TR19EQVRBKG5saCk7CisJZGNiLT5kY2JfZmFtaWx5ID0gQUZfVU5TUEVDOworCWRjYi0+Y21kID0gRENCX0NNRF9JRUVFX0dFVDsKKworCWVyciA9IGRjYm5sX2llZWVfZmlsbChza2IsIG5ldGRldik7CisKKwlpZiAoZXJyIDwgMCkgeworCQlubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlubG1zZ19lbmQoc2tiLCBubGgpOworCQllcnIgPSBydG5sX3VuaWNhc3Qoc2tiLCBuZXQsIHBpZCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkY2JubF9pZWVlX2RlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgbmxhdHRyICoqdGIsCisJCQkgIHUzMiBwaWQsIHUzMiBzZXEsIHUxNiBmbGFncykKK3sKKwljb25zdCBzdHJ1Y3QgZGNibmxfcnRubF9vcHMgKm9wcyA9IG5ldGRldi0+ZGNibmxfb3BzOworCXN0cnVjdCBubGF0dHIgKmllZWVbRENCX0FUVFJfSUVFRV9NQVggKyAxXTsKKwlpbnQgZXJyID0gLUVPUE5PVFNVUFA7CisKKwlpZiAoIW9wcykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCF0YltEQ0JfQVRUUl9JRUVFXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBubGFfcGFyc2VfbmVzdGVkKGllZWUsIERDQl9BVFRSX0lFRUVfTUFYLAorCQkJICAgICAgIHRiW0RDQl9BVFRSX0lFRUVdLCBkY2JubF9pZWVlX3BvbGljeSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChpZWVlW0RDQl9BVFRSX0lFRUVfQVBQX1RBQkxFXSkgeworCQlzdHJ1Y3QgbmxhdHRyICphdHRyOworCQlpbnQgcmVtOworCisJCW5sYV9mb3JfZWFjaF9uZXN0ZWQoYXR0ciwgaWVlZVtEQ0JfQVRUUl9JRUVFX0FQUF9UQUJMRV0sIHJlbSkgeworCQkJc3RydWN0IGRjYl9hcHAgKmFwcF9kYXRhOworCisJCQlpZiAobmxhX3R5cGUoYXR0cikgIT0gRENCX0FUVFJfSUVFRV9BUFApCisJCQkJY29udGludWU7CisJCQlhcHBfZGF0YSA9IG5sYV9kYXRhKGF0dHIpOworCQkJaWYgKG9wcy0+aWVlZV9kZWxhcHApCisJCQkJZXJyID0gb3BzLT5pZWVlX2RlbGFwcChuZXRkZXYsIGFwcF9kYXRhKTsKKwkJCWVsc2UKKwkJCQllcnIgPSBkY2JfaWVlZV9kZWxhcHAobmV0ZGV2LCBhcHBfZGF0YSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZXJyOworCQl9CisJfQorCitlcnI6CisJZGNibmxfcmVwbHkoZXJyLCBSVE1fU0VURENCLCBEQ0JfQ01EX0lFRUVfREVMLCBEQ0JfQVRUUl9JRUVFLAorCQkgICAgcGlkLCBzZXEsIGZsYWdzKTsKKwlkY2JubF9pZWVlX25vdGlmeShuZXRkZXYsIFJUTV9TRVREQ0IsIERDQl9DTURfSUVFRV9ERUwsIHNlcSwgMCk7CisJcmV0dXJuIGVycjsKK30KKworCiAvKiBEQ0JYIGNvbmZpZ3VyYXRpb24gKi8KIHN0YXRpYyBpbnQgZGNibmxfZ2V0ZGNieChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgbmxhdHRyICoqdGIsCiAJCQkgdTMyIHBpZCwgdTMyIHNlcSwgdTE2IGZsYWdzKQpAQCAtMTUyMiwxMCArMTg1MSwxMCBAQAogc3RhdGljIGludCBkY2JubF9jZWVfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBubGF0dHIgKip0YiwKIAkJCSB1MzIgcGlkLCB1MzIgc2VxLCB1MTYgZmxhZ3MpCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChuZXRkZXYpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IGRjYm1zZyAqZGNiOwotCXN0cnVjdCBubGF0dHIgKmNlZTsKIAljb25zdCBzdHJ1Y3QgZGNibmxfcnRubF9vcHMgKm9wcyA9IG5ldGRldi0+ZGNibmxfb3BzOwogCWludCBlcnI7CiAKQEAgLTE1MzYsNTEgKzE4NjUsMjYgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIFJUTV9HRVREQ0IsIHNpemVvZigqZGNiKSwgZmxhZ3MpOworCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBSVE1fR0VURENCLCBzaXplb2YoKmRjYiksIGZsYWdzKTsKKwlpZiAobmxoID09IE5VTEwpIHsKKwkJbmxtc2dfZnJlZShza2IpOworCQlyZXR1cm4gLUVNU0dTSVpFOworCX0KIAogCWRjYiA9IE5MTVNHX0RBVEEobmxoKTsKIAlkY2ItPmRjYl9mYW1pbHkgPSBBRl9VTlNQRUM7CiAJZGNiLT5jbWQgPSBEQ0JfQ01EX0NFRV9HRVQ7CiAKLQlOTEFfUFVUX1NUUklORyhza2IsIERDQl9BVFRSX0lGTkFNRSwgbmV0ZGV2LT5uYW1lKTsKKwllcnIgPSBkY2JubF9jZWVfZmlsbChza2IsIG5ldGRldik7CiAKLQljZWUgPSBubGFfbmVzdF9zdGFydChza2IsIERDQl9BVFRSX0NFRSk7Ci0JaWYgKCFjZWUpCi0JCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCi0JLyogZ2V0IHBlZXIgaW5mbyBpZiBhdmFpbGFibGUgKi8KLQlpZiAob3BzLT5jZWVfcGVlcl9nZXRwZykgewotCQlzdHJ1Y3QgY2VlX3BnIHBnOwotCQllcnIgPSBvcHMtPmNlZV9wZWVyX2dldHBnKG5ldGRldiwgJnBnKTsKLQkJaWYgKCFlcnIpCi0JCQlOTEFfUFVUKHNrYiwgRENCX0FUVFJfQ0VFX1BFRVJfUEcsIHNpemVvZihwZyksICZwZyk7CisJaWYgKGVyciA8IDApIHsKKwkJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwkJbmxtc2dfZnJlZShza2IpOworCX0gZWxzZSB7CisJCW5sbXNnX2VuZChza2IsIG5saCk7CisJCWVyciA9IHJ0bmxfdW5pY2FzdChza2IsIG5ldCwgcGlkKTsKIAl9Ci0KLQlpZiAob3BzLT5jZWVfcGVlcl9nZXRwZmMpIHsKLQkJc3RydWN0IGNlZV9wZmMgcGZjOwotCQllcnIgPSBvcHMtPmNlZV9wZWVyX2dldHBmYyhuZXRkZXYsICZwZmMpOwotCQlpZiAoIWVycikKLQkJCU5MQV9QVVQoc2tiLCBEQ0JfQVRUUl9DRUVfUEVFUl9QRkMsIHNpemVvZihwZmMpLCAmcGZjKTsKLQl9Ci0KLQlpZiAob3BzLT5wZWVyX2dldGFwcGluZm8gJiYgb3BzLT5wZWVyX2dldGFwcHRhYmxlKSB7Ci0JCWVyciA9IGRjYm5sX2J1aWxkX3BlZXJfYXBwKG5ldGRldiwgc2tiLAotCQkJCQkgICBEQ0JfQVRUUl9DRUVfUEVFUl9BUFBfVEFCTEUsCi0JCQkJCSAgIERDQl9BVFRSX0NFRV9QRUVSX0FQUF9JTkZPLAotCQkJCQkgICBEQ0JfQVRUUl9DRUVfUEVFUl9BUFApOwotCQlpZiAoZXJyKQotCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JfQotCi0JbmxhX25lc3RfZW5kKHNrYiwgY2VlKTsKLQlubG1zZ19lbmQoc2tiLCBubGgpOwotCi0JcmV0dXJuIHJ0bmxfdW5pY2FzdChza2IsICZpbml0X25ldCwgcGlkKTsKLW5sYV9wdXRfZmFpbHVyZToKLQlubG1zZ19jYW5jZWwoc2tiLCBubGgpOwotbmxtc2dfZmFpbHVyZToKLQlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBkY2JfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQpAQCAtMTY5MCwxMSArMTk5NCwxNSBAQAogCQlnb3RvIG91dDsKIAljYXNlIERDQl9DTURfSUVFRV9TRVQ6CiAJCXJldCA9IGRjYm5sX2llZWVfc2V0KG5ldGRldiwgdGIsIHBpZCwgbmxoLT5ubG1zZ19zZXEsCi0JCQkJIG5saC0+bmxtc2dfZmxhZ3MpOworCQkJCSAgICAgbmxoLT5ubG1zZ19mbGFncyk7CiAJCWdvdG8gb3V0OwogCWNhc2UgRENCX0NNRF9JRUVFX0dFVDoKIAkJcmV0ID0gZGNibmxfaWVlZV9nZXQobmV0ZGV2LCB0YiwgcGlkLCBubGgtPm5sbXNnX3NlcSwKLQkJCQkgbmxoLT5ubG1zZ19mbGFncyk7CisJCQkJICAgICBubGgtPm5sbXNnX2ZsYWdzKTsKKwkJZ290byBvdXQ7CisJY2FzZSBEQ0JfQ01EX0lFRUVfREVMOgorCQlyZXQgPSBkY2JubF9pZWVlX2RlbChuZXRkZXYsIHRiLCBwaWQsIG5saC0+bmxtc2dfc2VxLAorCQkJCSAgICAgbmxoLT5ubG1zZ19mbGFncyk7CiAJCWdvdG8gb3V0OwogCWNhc2UgRENCX0NNRF9HRENCWDoKIAkJcmV0ID0gZGNibmxfZ2V0ZGNieChuZXRkZXYsIHRiLCBwaWQsIG5saC0+bmxtc2dfc2VxLApAQCAtMTc1NCwxMiArMjA2MiwxMyBAQAogRVhQT1JUX1NZTUJPTChkY2JfZ2V0YXBwKTsKIAogLyoqCi0gKiBpeGdiZV9kY2JubF9zZXRhcHAgLSBhZGQgZGNiIGFwcGxpY2F0aW9uIGRhdGEgdG8gYXBwIGxpc3QKKyAqIGRjYl9zZXRhcHAgLSBhZGQgQ0VFIGRjYiBhcHBsaWNhdGlvbiBkYXRhIHRvIGFwcCBsaXN0CiAgKgotICogUHJpb3JpdHkgMCBpcyB0aGUgZGVmYXVsdCBwcmlvcml0eSB0aGlzIHJlbW92ZXMgYXBwbGljYXRpb25zCi0gKiBmcm9tIHRoZSBhcHAgbGlzdCBpZiB0aGUgcHJpb3JpdHkgaXMgc2V0IHRvIHplcm8uCisgKiBQcmlvcml0eSAwIGlzIGFuIGludmFsaWQgcHJpb3JpdHkgaW4gQ0VFIHNwZWMuIFRoaXMgcm91dGluZQorICogcmVtb3ZlcyBhcHBsaWNhdGlvbnMgZnJvbSB0aGUgYXBwIGxpc3QgaWYgdGhlIHByaW9yaXR5IGlzCisgKiBzZXQgdG8gemVyby4KICAqLwotdTggZGNiX3NldGFwcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2FwcCAqbmV3KQoraW50IGRjYl9zZXRhcHAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9hcHAgKm5ldykKIHsKIAlzdHJ1Y3QgZGNiX2FwcF90eXBlICppdHI7CiAJc3RydWN0IGRjYl9hcHBfdHlwZSBldmVudDsKQEAgLTE4MDIsNiArMjExMSwxMTQgQEAKIH0KIEVYUE9SVF9TWU1CT0woZGNiX3NldGFwcCk7CiAKKy8qKgorICogZGNiX2llZWVfZ2V0YXBwX21hc2sgLSByZXRyaWV2ZSB0aGUgSUVFRSBEQ0IgYXBwbGljYXRpb24gcHJpb3JpdHkKKyAqCisgKiBIZWxwZXIgcm91dGluZSB3aGljaCBvbiBzdWNjZXNzIHJldHVybnMgYSBub24temVybyA4MDIuMVFheiB1c2VyCisgKiBwcmlvcml0eSBiaXRtYXAgb3RoZXJ3aXNlIHJldHVybnMgMCB0byBpbmRpY2F0ZSB0aGUgZGNiX2FwcCB3YXMKKyAqIG5vdCBmb3VuZCBpbiBBUFAgbGlzdC4KKyAqLwordTggZGNiX2llZWVfZ2V0YXBwX21hc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9hcHAgKmFwcCkKK3sKKwlzdHJ1Y3QgZGNiX2FwcF90eXBlICppdHI7CisJdTggcHJpbyA9IDA7CisKKwlzcGluX2xvY2soJmRjYl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ciwgJmRjYl9hcHBfbGlzdCwgbGlzdCkgeworCQlpZiAoaXRyLT5hcHAuc2VsZWN0b3IgPT0gYXBwLT5zZWxlY3RvciAmJgorCQkgICAgaXRyLT5hcHAucHJvdG9jb2wgPT0gYXBwLT5wcm90b2NvbCAmJgorCQkgICAgKHN0cm5jbXAoaXRyLT5uYW1lLCBkZXYtPm5hbWUsIElGTkFNU0laKSA9PSAwKSkgeworCQkJcHJpbyB8PSAxIDw8IGl0ci0+YXBwLnByaW9yaXR5OworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZkY2JfbG9jayk7CisKKwlyZXR1cm4gcHJpbzsKK30KK0VYUE9SVF9TWU1CT0woZGNiX2llZWVfZ2V0YXBwX21hc2spOworCisvKioKKyAqIGRjYl9pZWVlX3NldGFwcCAtIGFkZCBJRUVFIGRjYiBhcHBsaWNhdGlvbiBkYXRhIHRvIGFwcCBsaXN0CisgKgorICogVGhpcyBhZGRzIEFwcGxpY2F0aW9uIGRhdGEgdG8gdGhlIGxpc3QuIE11bHRpcGxlIGFwcGxpY2F0aW9uCisgKiBlbnRyaWVzIG1heSBleGlzdHMgZm9yIHRoZSBzYW1lIHNlbGVjdG9yIGFuZCBwcm90b2NvbCBhcyBsb25nCisgKiBhcyB0aGUgcHJpb3JpdGllcyBhcmUgZGlmZmVyZW50LgorICovCitpbnQgZGNiX2llZWVfc2V0YXBwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfYXBwICpuZXcpCit7CisJc3RydWN0IGRjYl9hcHBfdHlwZSAqaXRyLCAqZW50cnk7CisJc3RydWN0IGRjYl9hcHBfdHlwZSBldmVudDsKKwlpbnQgZXJyID0gMDsKKworCW1lbWNweSgmZXZlbnQubmFtZSwgZGV2LT5uYW1lLCBzaXplb2YoZXZlbnQubmFtZSkpOworCW1lbWNweSgmZXZlbnQuYXBwLCBuZXcsIHNpemVvZihldmVudC5hcHApKTsKKworCXNwaW5fbG9jaygmZGNiX2xvY2spOworCS8qIFNlYXJjaCBmb3IgZXhpc3RpbmcgbWF0Y2ggYW5kIGFib3J0IGlmIGZvdW5kICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdHIsICZkY2JfYXBwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGl0ci0+YXBwLnNlbGVjdG9yID09IG5ldy0+c2VsZWN0b3IgJiYKKwkJICAgIGl0ci0+YXBwLnByb3RvY29sID09IG5ldy0+cHJvdG9jb2wgJiYKKwkJICAgIGl0ci0+YXBwLnByaW9yaXR5ID09IG5ldy0+cHJpb3JpdHkgJiYKKwkJICAgIChzdHJuY21wKGl0ci0+bmFtZSwgZGV2LT5uYW1lLCBJRk5BTVNJWikgPT0gMCkpIHsKKwkJCWVyciA9IC1FRVhJU1Q7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIEFwcCBlbnRyeSBkb2VzIG5vdCBleGlzdCBhZGQgbmV3IGVudHJ5ICovCisJZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGNiX2FwcF90eXBlKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFlbnRyeSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoJmVudHJ5LT5hcHAsIG5ldywgc2l6ZW9mKCpuZXcpKTsKKwlzdHJuY3B5KGVudHJ5LT5uYW1lLCBkZXYtPm5hbWUsIElGTkFNU0laKTsKKwlsaXN0X2FkZCgmZW50cnktPmxpc3QsICZkY2JfYXBwX2xpc3QpOworb3V0OgorCXNwaW5fdW5sb2NrKCZkY2JfbG9jayk7CisJaWYgKCFlcnIpCisJCWNhbGxfZGNiZXZlbnRfbm90aWZpZXJzKERDQl9BUFBfRVZFTlQsICZldmVudCk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woZGNiX2llZWVfc2V0YXBwKTsKKworLyoqCisgKiBkY2JfaWVlZV9kZWxhcHAgLSBkZWxldGUgSUVFRSBkY2IgYXBwbGljYXRpb24gZGF0YSBmcm9tIGxpc3QKKyAqCisgKiBUaGlzIHJlbW92ZXMgYSBtYXRjaGluZyBBUFAgZGF0YSBmcm9tIHRoZSBBUFAgbGlzdAorICovCitpbnQgZGNiX2llZWVfZGVsYXBwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfYXBwICpkZWwpCit7CisJc3RydWN0IGRjYl9hcHBfdHlwZSAqaXRyOworCXN0cnVjdCBkY2JfYXBwX3R5cGUgZXZlbnQ7CisJaW50IGVyciA9IC1FTk9FTlQ7CisKKwltZW1jcHkoJmV2ZW50Lm5hbWUsIGRldi0+bmFtZSwgc2l6ZW9mKGV2ZW50Lm5hbWUpKTsKKwltZW1jcHkoJmV2ZW50LmFwcCwgZGVsLCBzaXplb2YoZXZlbnQuYXBwKSk7CisKKwlzcGluX2xvY2soJmRjYl9sb2NrKTsKKwkvKiBTZWFyY2ggZm9yIGV4aXN0aW5nIG1hdGNoIGFuZCByZW1vdmUgaXQuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdHIsICZkY2JfYXBwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGl0ci0+YXBwLnNlbGVjdG9yID09IGRlbC0+c2VsZWN0b3IgJiYKKwkJICAgIGl0ci0+YXBwLnByb3RvY29sID09IGRlbC0+cHJvdG9jb2wgJiYKKwkJICAgIGl0ci0+YXBwLnByaW9yaXR5ID09IGRlbC0+cHJpb3JpdHkgJiYKKwkJICAgIChzdHJuY21wKGl0ci0+bmFtZSwgZGV2LT5uYW1lLCBJRk5BTVNJWikgPT0gMCkpIHsKKwkJCWxpc3RfZGVsKCZpdHItPmxpc3QpOworCQkJa2ZyZWUoaXRyKTsKKwkJCWVyciA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCXNwaW5fdW5sb2NrKCZkY2JfbG9jayk7CisJaWYgKCFlcnIpCisJCWNhbGxfZGNiZXZlbnRfbm90aWZpZXJzKERDQl9BUFBfRVZFTlQsICZldmVudCk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woZGNiX2llZWVfZGVsYXBwKTsKKwogc3RhdGljIHZvaWQgZGNiX2ZsdXNoYXBwKHZvaWQpCiB7CiAJc3RydWN0IGRjYl9hcHBfdHlwZSAqYXBwOwpAQCAtMTgxOSw4ICsyMjM2LDggQEAKIHsKIAlJTklUX0xJU1RfSEVBRCgmZGNiX2FwcF9saXN0KTsKIAotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VURENCLCBkY2JfZG9pdCwgTlVMTCk7Ci0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9TRVREQ0IsIGRjYl9kb2l0LCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVERDQiwgZGNiX2RvaXQsIE5VTEwsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fU0VURENCLCBkY2JfZG9pdCwgTlVMTCwgTlVMTCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWQuYyBiL25ldC9kY2NwL2NjaWQuYwppbmRleCAzNjQ3OWNhLi40OGI1ODVhIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkLmMKKysrIGIvbmV0L2RjY3AvY2NpZC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAlpZiAoY2NpZF9vcHMtPmNjaWRfaGNfdHhfc2xhYiA9PSBOVUxMKQogCQlnb3RvIG91dF9mcmVlX3J4X3NsYWI7CiAKLQlwcl9pbmZvKCJDQ0lEOiBBY3RpdmF0ZWQgQ0NJRCAlZCAoJXMpXG4iLAorCXByX2luZm8oIkRDQ1A6IEFjdGl2YXRlZCBDQ0lEICVkICglcylcbiIsCiAJCWNjaWRfb3BzLT5jY2lkX2lkLCBjY2lkX29wcy0+Y2NpZF9uYW1lKTsKIAllcnIgPSAwOwogb3V0OgpAQCAtMTM2LDcgKzEzNiw3IEBACiAJY2NpZF9rbWVtX2NhY2hlX2Rlc3Ryb3koY2NpZF9vcHMtPmNjaWRfaGNfcnhfc2xhYik7CiAJY2NpZF9vcHMtPmNjaWRfaGNfcnhfc2xhYiA9IE5VTEw7CiAKLQlwcl9pbmZvKCJDQ0lEOiBEZWFjdGl2YXRlZCBDQ0lEICVkICglcylcbiIsCisJcHJfaW5mbygiRENDUDogRGVhY3RpdmF0ZWQgQ0NJRCAlZCAoJXMpXG4iLAogCQljY2lkX29wcy0+Y2NpZF9pZCwgY2NpZF9vcHMtPmNjaWRfbmFtZSk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQyLmMgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMi5jCmluZGV4IGZhZGVjZDIuLjA0NjIwNDAgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQyLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDIuYwpAQCAtMTUzLDE3ICsxNTMsOTMgQEAKIAlzb2NrX3B1dChzayk7CiB9CiAKKy8qCisgKglDb25nZXN0aW9uIHdpbmRvdyB2YWxpZGF0aW9uIChSRkMgMjg2MSkuCisgKi8KK3N0YXRpYyBpbnQgY2NpZDJfZG9fY3d2ID0gMTsKK21vZHVsZV9wYXJhbShjY2lkMl9kb19jd3YsIGJvb2wsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjY2lkMl9kb19jd3YsICJQZXJmb3JtIFJGQzI4NjEgQ29uZ2VzdGlvbiBXaW5kb3cgVmFsaWRhdGlvbiIpOworCisvKioKKyAqIGNjaWQyX3VwZGF0ZV91c2VkX3dpbmRvdyAgLSAgVHJhY2sgaG93IG11Y2ggb2YgY3duZCBpcyBhY3R1YWxseSB1c2VkCisgKiBUaGlzIGlzIGRvbmUgaW4gYWRkaXRpb24gdG8gQ1dWLiBUaGUgc2VuZGVyIG5lZWRzIHRvIGhhdmUgYW4gaWRlYSBvZiBob3cgbWFueQorICogcGFja2V0cyBtYXkgYmUgaW4gZmxpZ2h0LCB0byBzZXQgdGhlIGxvY2FsIFNlcXVlbmNlIFdpbmRvdyB2YWx1ZSBhY2NvcmRpbmdseQorICogKFJGQyA0MzQwLCA3LjUuMikuIFRoZSBDV1YgbWVjaGFuaXNtIGlzIGV4cGxvaXRlZCB0byBrZWVwIHRyYWNrIG9mIHRoZQorICogbWF4aW11bS11c2VkIHdpbmRvdy4gV2UgdXNlIGFuIEVXTUEgbG93LXBhc3MgZmlsdGVyIHRvIGZpbHRlciBvdXQgbm9pc2UuCisgKi8KK3N0YXRpYyB2b2lkIGNjaWQyX3VwZGF0ZV91c2VkX3dpbmRvdyhzdHJ1Y3QgY2NpZDJfaGNfdHhfc29jayAqaGMsIHUzMiBuZXdfd25kKQoreworCWhjLT50eF9leHBlY3RlZF93bmQgPSAoMyAqIGhjLT50eF9leHBlY3RlZF93bmQgKyBuZXdfd25kKSAvIDQ7Cit9CisKKy8qIFRoaXMgYm9ycm93cyB0aGUgY29kZSBvZiB0Y3BfY3duZF9hcHBsaWNhdGlvbl9saW1pdGVkKCkgKi8KK3N0YXRpYyB2b2lkIGNjaWQyX2N3bmRfYXBwbGljYXRpb25fbGltaXRlZChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHUzMiBub3cpCit7CisJc3RydWN0IGNjaWQyX2hjX3R4X3NvY2sgKmhjID0gY2NpZDJfaGNfdHhfc2soc2spOworCS8qIGRvbid0IHJlZHVjZSBjd25kIGJlbG93IHRoZSBpbml0aWFsIHdpbmRvdyAoSVcpICovCisJdTMyIGluaXRfd2luID0gcmZjMzM5MF9ieXRlc190b19wYWNrZXRzKGRjY3Bfc2soc2spLT5kY2Nwc19tc3NfY2FjaGUpLAorCSAgICB3aW5fdXNlZCA9IG1heChoYy0+dHhfY3duZF91c2VkLCBpbml0X3dpbik7CisKKwlpZiAod2luX3VzZWQgPCBoYy0+dHhfY3duZCkgeworCQloYy0+dHhfc3N0aHJlc2ggPSBtYXgoaGMtPnR4X3NzdGhyZXNoLAorCQkJCSAgICAgKGhjLT50eF9jd25kID4+IDEpICsgKGhjLT50eF9jd25kID4+IDIpKTsKKwkJaGMtPnR4X2N3bmQgPSAoaGMtPnR4X2N3bmQgKyB3aW5fdXNlZCkgPj4gMTsKKwl9CisJaGMtPnR4X2N3bmRfdXNlZCAgPSAwOworCWhjLT50eF9jd25kX3N0YW1wID0gbm93OworfQorCisvKiBUaGlzIGJvcnJvd3MgdGhlIGNvZGUgb2YgdGNwX2N3bmRfcmVzdGFydCgpICovCitzdGF0aWMgdm9pZCBjY2lkMl9jd25kX3Jlc3RhcnQoc3RydWN0IHNvY2sgKnNrLCBjb25zdCB1MzIgbm93KQoreworCXN0cnVjdCBjY2lkMl9oY190eF9zb2NrICpoYyA9IGNjaWQyX2hjX3R4X3NrKHNrKTsKKwl1MzIgY3duZCA9IGhjLT50eF9jd25kLCByZXN0YXJ0X2N3bmQsCisJICAgIGl3bmQgPSByZmMzMzkwX2J5dGVzX3RvX3BhY2tldHMoZGNjcF9zayhzayktPmRjY3BzX21zc19jYWNoZSk7CisKKwloYy0+dHhfc3N0aHJlc2ggPSBtYXgoaGMtPnR4X3NzdGhyZXNoLCAoY3duZCA+PiAxKSArIChjd25kID4+IDIpKTsKKworCS8qIGRvbid0IHJlZHVjZSBjd25kIGJlbG93IHRoZSBpbml0aWFsIHdpbmRvdyAoSVcpICovCisJcmVzdGFydF9jd25kID0gbWluKGN3bmQsIGl3bmQpOworCWN3bmQgPj49IChub3cgLSBoYy0+dHhfbHNuZHRpbWUpIC8gaGMtPnR4X3J0bzsKKwloYy0+dHhfY3duZCA9IG1heChjd25kLCByZXN0YXJ0X2N3bmQpOworCisJaGMtPnR4X2N3bmRfc3RhbXAgPSBub3c7CisJaGMtPnR4X2N3bmRfdXNlZCAgPSAwOworfQorCiBzdGF0aWMgdm9pZCBjY2lkMl9oY190eF9wYWNrZXRfc2VudChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKIAlzdHJ1Y3QgY2NpZDJfaGNfdHhfc29jayAqaGMgPSBjY2lkMl9oY190eF9zayhzayk7CisJY29uc3QgdTMyIG5vdyA9IGNjaWQyX3RpbWVfc3RhbXA7CiAJc3RydWN0IGNjaWQyX3NlcSAqbmV4dDsKIAotCWhjLT50eF9waXBlKys7CisJLyogc2xvdy1zdGFydCBhZnRlciBpZGxlIHBlcmlvZHMgKFJGQyAyNTgxLCBSRkMgMjg2MSkgKi8KKwlpZiAoY2NpZDJfZG9fY3d2ICYmICFoYy0+dHhfcGlwZSAmJgorCSAgICAoczMyKShub3cgLSBoYy0+dHhfbHNuZHRpbWUpID49IGhjLT50eF9ydG8pCisJCWNjaWQyX2N3bmRfcmVzdGFydChzaywgbm93KTsKKworCWhjLT50eF9sc25kdGltZSA9IG5vdzsKKwloYy0+dHhfcGlwZSAgICArPSAxOworCisJLyogc2VlIHdoZXRoZXIgY3duZCB3YXMgZnVsbHkgdXNlZCAoUkZDIDI4NjEpLCB1cGRhdGUgZXhwZWN0ZWQgd2luZG93ICovCisJaWYgKGNjaWQyX2N3bmRfbmV0d29ya19saW1pdGVkKGhjKSkgeworCQljY2lkMl91cGRhdGVfdXNlZF93aW5kb3coaGMsIGhjLT50eF9jd25kKTsKKwkJaGMtPnR4X2N3bmRfdXNlZCAgPSAwOworCQloYy0+dHhfY3duZF9zdGFtcCA9IG5vdzsKKwl9IGVsc2UgeworCQlpZiAoaGMtPnR4X3BpcGUgPiBoYy0+dHhfY3duZF91c2VkKQorCQkJaGMtPnR4X2N3bmRfdXNlZCA9IGhjLT50eF9waXBlOworCisJCWNjaWQyX3VwZGF0ZV91c2VkX3dpbmRvdyhoYywgaGMtPnR4X2N3bmRfdXNlZCk7CisKKwkJaWYgKGNjaWQyX2RvX2N3diAmJiAoczMyKShub3cgLSBoYy0+dHhfY3duZF9zdGFtcCkgPj0gaGMtPnR4X3J0bykKKwkJCWNjaWQyX2N3bmRfYXBwbGljYXRpb25fbGltaXRlZChzaywgbm93KTsKKwl9CiAKIAloYy0+dHhfc2VxaC0+Y2NpZDJzX3NlcSAgID0gZHAtPmRjY3BzX2dzczsKIAloYy0+dHhfc2VxaC0+Y2NpZDJzX2Fja2VkID0gMDsKLQloYy0+dHhfc2VxaC0+Y2NpZDJzX3NlbnQgID0gY2NpZDJfdGltZV9zdGFtcDsKKwloYy0+dHhfc2VxaC0+Y2NpZDJzX3NlbnQgID0gbm93OwogCiAJbmV4dCA9IGhjLT50eF9zZXFoLT5jY2lkMnNfbmV4dDsKIAkvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIGFsbG9jIG1vcmUgc3BhY2UgKi8KQEAgLTU4MywxNSArNjU5LDYgQEAKIAlkY2NwX2Fja3ZlY19wYXJzZWRfY2xlYW51cCgmaGMtPnR4X2F2X2NodW5rcyk7CiB9CiAKLS8qCi0gKiBDb252ZXJ0IFJGQyAzMzkwIGxhcmdlciBpbml0aWFsIHdpbmRvdyBpbnRvIGFuIGVxdWl2YWxlbnQgbnVtYmVyIG9mIHBhY2tldHMuCi0gKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBudW1iZXJzIHNwZWNpZmllZCBpbiBSRkMgNTY4MSwgMy4xLgotICovCi1zdGF0aWMgaW5saW5lIHUzMiByZmMzMzkwX2J5dGVzX3RvX3BhY2tldHMoY29uc3QgdTMyIHNtc3MpCi17Ci0JcmV0dXJuIHNtc3MgPD0gMTA5NSA/IDQgOiAoc21zcyA+IDIxOTAgPyAyIDogMyk7Ci19Ci0KIHN0YXRpYyBpbnQgY2NpZDJfaGNfdHhfaW5pdChzdHJ1Y3QgY2NpZCAqY2NpZCwgc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBjY2lkMl9oY190eF9zb2NrICpoYyA9IGNjaWRfcHJpdihjY2lkKTsKQEAgLTYwMyw2ICs2NzAsNyBAQAogCiAJLyogVXNlIGxhcmdlciBpbml0aWFsIHdpbmRvd3MgKFJGQyA0MzQxLCBzZWN0aW9uIDUpLiAqLwogCWhjLT50eF9jd25kID0gcmZjMzM5MF9ieXRlc190b19wYWNrZXRzKGRwLT5kY2Nwc19tc3NfY2FjaGUpOworCWhjLT50eF9leHBlY3RlZF93bmQgPSBoYy0+dHhfY3duZDsKIAogCS8qIE1ha2Ugc3VyZSB0aGF0IEFjayBSYXRpbyBpcyBlbmFibGVkIGFuZCB3aXRoaW4gYm91bmRzLiAqLwogCW1heF9yYXRpbyA9IERJVl9ST1VORF9VUChoYy0+dHhfY3duZCwgMik7CkBAIC02MTUsNyArNjgzLDggQEAKIAogCWhjLT50eF9ydG8JID0gRENDUF9USU1FT1VUX0lOSVQ7CiAJaGMtPnR4X3JwZHVwYWNrICA9IC0xOwotCWhjLT50eF9sYXN0X2NvbmcgPSBjY2lkMl90aW1lX3N0YW1wOworCWhjLT50eF9sYXN0X2NvbmcgPSBoYy0+dHhfbHNuZHRpbWUgPSBoYy0+dHhfY3duZF9zdGFtcCA9IGNjaWQyX3RpbWVfc3RhbXA7CisJaGMtPnR4X2N3bmRfdXNlZCA9IDA7CiAJc2V0dXBfdGltZXIoJmhjLT50eF9ydG90aW1lciwgY2NpZDJfaGNfdHhfcnRvX2V4cGlyZSwKIAkJCSh1bnNpZ25lZCBsb25nKXNrKTsKIAlJTklUX0xJU1RfSEVBRCgmaGMtPnR4X2F2X2NodW5rcyk7CkBAIC02MzYsMTggKzcwNSwxNCBAQAogCiBzdGF0aWMgdm9pZCBjY2lkMl9oY19yeF9wYWNrZXRfcmVjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JY29uc3Qgc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKIAlzdHJ1Y3QgY2NpZDJfaGNfcnhfc29jayAqaGMgPSBjY2lkMl9oY19yeF9zayhzayk7CiAKLQlzd2l0Y2ggKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUpIHsKLQljYXNlIERDQ1BfUEtUX0RBVEE6Ci0JY2FzZSBEQ0NQX1BLVF9EQVRBQUNLOgotCQloYy0+cnhfZGF0YSsrOwotCQlpZiAoaGMtPnJ4X2RhdGEgPj0gZHAtPmRjY3BzX3JfYWNrX3JhdGlvKSB7Ci0JCQlkY2NwX3NlbmRfYWNrKHNrKTsKLQkJCWhjLT5yeF9kYXRhID0gMDsKLQkJfQotCQlicmVhazsKKwlpZiAoIWRjY3BfZGF0YV9wYWNrZXQoc2tiKSkKKwkJcmV0dXJuOworCisJaWYgKCsraGMtPnJ4X251bV9kYXRhX3BrdHMgPj0gZGNjcF9zayhzayktPmRjY3BzX3JfYWNrX3JhdGlvKSB7CisJCWRjY3Bfc2VuZF9hY2soc2spOworCQloYy0+cnhfbnVtX2RhdGFfcGt0cyA9IDA7CiAJfQogfQogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9jY2lkMi5oIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDIuaAppbmRleCBlOTk4NWRhLi5mNTg1ZDMzIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9jY2lkMi5oCisrKyBiL25ldC9kY2NwL2NjaWRzL2NjaWQyLmgKQEAgLTUzLDYgKzUzLDEwIEBACiAgKiBAdHhfcnR0dmFyOgkJICAgICBtb3ZpbmcgYXZlcmFnZS9tYXhpbXVtIG9mIEBtZGV2X21heAogICogQHR4X3J0bzoJCSAgICAgUlRPIHZhbHVlIGRlcml2aW5nIGZyb20gU1JUVCBhbmQgUlRUVkFSIChSRkMgMjk4OCkKICAqIEB0eF9ydHRfc2VxOgkJICAgICB0byBkZWNheSBSVFRWQVIgYXQgbW9zdCBvbmNlIHBlciBmbGlnaHQKKyAqIEB0eF9jd25kX3VzZWQ6CSAgICAgYWN0dWFsbHkgdXNlZCBjd25kLCBXX3VzZWQgb2YgUkZDIDI4NjEKKyAqIEB0eF9leHBlY3RlZF93bmQ6CSAgICAgbW92aW5nIGF2ZXJhZ2Ugb2YgQHR4X2N3bmRfdXNlZAorICogQHR4X2N3bmRfc3RhbXA6CSAgICAgdG8gdHJhY2sgaWRsZSBwZXJpb2RzIGluIENXVgorICogQHR4X2xzbmR0aW1lOgkgICAgIGxhc3QgdGltZSAoaW4gamlmZmllcykgYSBkYXRhIHBhY2tldCB3YXMgc2VudAogICogQHR4X3Jwc2VxOgkJICAgICBsYXN0IGNvbnNlY3V0aXZlIHNlcW5vCiAgKiBAdHhfcnBkdXBhY2s6CSAgICAgZHVwYWNrcyBzaW5jZSBycHNlcQogICogQHR4X2F2X2NodW5rczoJICAgICBsaXN0IG9mIEFjayBWZWN0b3JzIHJlY2VpdmVkIG9uIGN1cnJlbnQgc2tiCkBAIC03Niw2ICs4MCwxMiBAQAogCXU2NAkJCXR4X3J0dF9zZXE6NDg7CiAJc3RydWN0IHRpbWVyX2xpc3QJdHhfcnRvdGltZXI7CiAKKwkvKiBDb25nZXN0aW9uIFdpbmRvdyB2YWxpZGF0aW9uIChvcHRpb25hbCwgUkZDIDI4NjEpICovCisJdTMyCQkJdHhfY3duZF91c2VkLAorCQkJCXR4X2V4cGVjdGVkX3duZCwKKwkJCQl0eF9jd25kX3N0YW1wLAorCQkJCXR4X2xzbmR0aW1lOworCiAJdTY0CQkJdHhfcnBzZXE7CiAJaW50CQkJdHhfcnBkdXBhY2s7CiAJdTMyCQkJdHhfbGFzdF9jb25nOwpAQCAtODgsOCArOTgsMjEgQEAKIAlyZXR1cm4gaGMtPnR4X3BpcGUgPj0gaGMtPnR4X2N3bmQ7CiB9CiAKKy8qCisgKiBDb252ZXJ0IFJGQyAzMzkwIGxhcmdlciBpbml0aWFsIHdpbmRvdyBpbnRvIGFuIGVxdWl2YWxlbnQgbnVtYmVyIG9mIHBhY2tldHMuCisgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBudW1iZXJzIHNwZWNpZmllZCBpbiBSRkMgNTY4MSwgMy4xLgorICovCitzdGF0aWMgaW5saW5lIHUzMiByZmMzMzkwX2J5dGVzX3RvX3BhY2tldHMoY29uc3QgdTMyIHNtc3MpCit7CisJcmV0dXJuIHNtc3MgPD0gMTA5NSA/IDQgOiAoc21zcyA+IDIxOTAgPyAyIDogMyk7Cit9CisKKy8qKgorICogc3RydWN0IGNjaWQyX2hjX3J4X3NvY2sgIC0gIFJlY2VpdmluZyBlbmQgb2YgQ0NJRC0yIGhhbGYtY29ubmVjdGlvbgorICogQHJ4X251bV9kYXRhX3BrdHM6IG51bWJlciBvZiBkYXRhIHBhY2tldHMgcmVjZWl2ZWQgc2luY2UgbGFzdCBmZWVkYmFjaworICovCiBzdHJ1Y3QgY2NpZDJfaGNfcnhfc29jayB7Ci0JaW50CXJ4X2RhdGE7CisJdTMyCXJ4X251bV9kYXRhX3BrdHM7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjY2lkMl9oY190eF9zb2NrICpjY2lkMl9oY190eF9zayhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pbnB1dC5jIGIvbmV0L2RjY3AvaW5wdXQuYwppbmRleCA0MjIyZTdhLi41MWQ1ZmU1IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pbnB1dC5jCisrKyBiL25ldC9kY2NwL2lucHV0LmMKQEAgLTYxOSwyMCArNjE5LDMxIEBACiAJCXJldHVybiAxOwogCX0KIAotCWlmIChzay0+c2tfc3RhdGUgIT0gRENDUF9SRVFVRVNUSU5HICYmIHNrLT5za19zdGF0ZSAhPSBEQ0NQX1JFU1BPTkQpIHsKLQkJaWYgKGRjY3BfY2hlY2tfc2Vxbm8oc2ssIHNrYikpCi0JCQlnb3RvIGRpc2NhcmQ7CisJLyogU3RlcCA2OiBDaGVjayBzZXF1ZW5jZSBudW1iZXJzIChvbWl0dGVkIGluIExJU1RFTi9SRVFVRVNUIHN0YXRlKSAqLworCWlmIChzay0+c2tfc3RhdGUgIT0gRENDUF9SRVFVRVNUSU5HICYmIGRjY3BfY2hlY2tfc2Vxbm8oc2ssIHNrYikpCisJCWdvdG8gZGlzY2FyZDsKIAotCQkvKgotCQkgKiBTdGVwIDg6IFByb2Nlc3Mgb3B0aW9ucyBhbmQgbWFyayBhY2tub3dsZWRnZWFibGUKLQkJICovCi0JCWlmIChkY2NwX3BhcnNlX29wdGlvbnMoc2ssIE5VTEwsIHNrYikpCi0JCQlyZXR1cm4gMTsKLQotCQlkY2NwX2hhbmRsZV9hY2t2ZWNfcHJvY2Vzc2luZyhzaywgc2tiKTsKLQkJZGNjcF9kZWxpdmVyX2lucHV0X3RvX2NjaWRzKHNrLCBza2IpOworCS8qCisJICogICBTdGVwIDc6IENoZWNrIGZvciB1bmV4cGVjdGVkIHBhY2tldCB0eXBlcworCSAqICAgICAgSWYgKFMuaXNfc2VydmVyIGFuZCBQLnR5cGUgPT0gUmVzcG9uc2UpCisJICoJICAgIG9yIChTLmlzX2NsaWVudCBhbmQgUC50eXBlID09IFJlcXVlc3QpCisJICoJICAgIG9yIChTLnN0YXRlID09IFJFU1BPTkQgYW5kIFAudHlwZSA9PSBEYXRhKSwKKwkgKgkgIFNlbmQgU3luYyBwYWNrZXQgYWNrbm93bGVkZ2luZyBQLnNlcW5vCisJICoJICBEcm9wIHBhY2tldCBhbmQgcmV0dXJuCisJICovCisJaWYgKChkcC0+ZGNjcHNfcm9sZSAhPSBEQ0NQX1JPTEVfQ0xJRU5UICYmCisJICAgICBkaC0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9SRVNQT05TRSkgfHwKKwkgICAgKGRwLT5kY2Nwc19yb2xlID09IERDQ1BfUk9MRV9DTElFTlQgJiYKKwkgICAgIGRoLT5kY2NwaF90eXBlID09IERDQ1BfUEtUX1JFUVVFU1QpIHx8CisJICAgIChzay0+c2tfc3RhdGUgPT0gRENDUF9SRVNQT05EICYmIGRoLT5kY2NwaF90eXBlID09IERDQ1BfUEtUX0RBVEEpKSB7CisJCWRjY3Bfc2VuZF9zeW5jKHNrLCBkY2ItPmRjY3BkX3NlcSwgRENDUF9QS1RfU1lOQyk7CisJCWdvdG8gZGlzY2FyZDsKIAl9CiAKKwkvKiAgU3RlcCA4OiBQcm9jZXNzIG9wdGlvbnMgKi8KKwlpZiAoZGNjcF9wYXJzZV9vcHRpb25zKHNrLCBOVUxMLCBza2IpKQorCQlyZXR1cm4gMTsKKwogCS8qCiAJICogIFN0ZXAgOTogUHJvY2VzcyBSZXNldAogCSAqCUlmIFAudHlwZSA9PSBSZXNldCwKQEAgLTY0MCwzMSArNjUxLDE1IEBACiAJICoJCVMuc3RhdGUgOj0gVElNRVdBSVQKIAkgKgkJU2V0IFRJTUVXQUlUIHRpbWVyCiAJICoJCURyb3AgcGFja2V0IGFuZCByZXR1cm4KLQkqLworCSAqLwogCWlmIChkaC0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9SRVNFVCkgewogCQlkY2NwX3Jjdl9yZXNldChzaywgc2tiKTsKIAkJcmV0dXJuIDA7Ci0JCS8qCi0JCSAqICAgU3RlcCA3OiBDaGVjayBmb3IgdW5leHBlY3RlZCBwYWNrZXQgdHlwZXMKLQkJICogICAgICBJZiAoUy5pc19zZXJ2ZXIgYW5kIFAudHlwZSA9PSBSZXNwb25zZSkKLQkJICoJICAgIG9yIChTLmlzX2NsaWVudCBhbmQgUC50eXBlID09IFJlcXVlc3QpCi0JCSAqCSAgICBvciAoUy5zdGF0ZSA9PSBSRVNQT05EIGFuZCBQLnR5cGUgPT0gRGF0YSksCi0JCSAqCSAgU2VuZCBTeW5jIHBhY2tldCBhY2tub3dsZWRnaW5nIFAuc2Vxbm8KLQkJICoJICBEcm9wIHBhY2tldCBhbmQgcmV0dXJuCi0JCSAqLwotCX0gZWxzZSBpZiAoKGRwLT5kY2Nwc19yb2xlICE9IERDQ1BfUk9MRV9DTElFTlQgJiYKLQkJICAgIGRoLT5kY2NwaF90eXBlID09IERDQ1BfUEtUX1JFU1BPTlNFKSB8fAotCQkgICAgKGRwLT5kY2Nwc19yb2xlID09IERDQ1BfUk9MRV9DTElFTlQgJiYKLQkJICAgICBkaC0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9SRVFVRVNUKSB8fAotCQkgICAgKHNrLT5za19zdGF0ZSA9PSBEQ0NQX1JFU1BPTkQgJiYKLQkJICAgICBkaC0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9EQVRBKSkgewotCQlkY2NwX3NlbmRfc3luYyhzaywgZGNiLT5kY2NwZF9zZXEsIERDQ1BfUEtUX1NZTkMpOwotCQlnb3RvIGRpc2NhcmQ7Ci0JfSBlbHNlIGlmIChkaC0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9DTE9TRVJFUSkgeworCX0gZWxzZSBpZiAoZGgtPmRjY3BoX3R5cGUgPT0gRENDUF9QS1RfQ0xPU0VSRVEpIHsJLyogU3RlcCAxMyAqLwogCQlpZiAoZGNjcF9yY3ZfY2xvc2VyZXEoc2ssIHNrYikpCiAJCQlyZXR1cm4gMDsKIAkJZ290byBkaXNjYXJkOwotCX0gZWxzZSBpZiAoZGgtPmRjY3BoX3R5cGUgPT0gRENDUF9QS1RfQ0xPU0UpIHsKKwl9IGVsc2UgaWYgKGRoLT5kY2NwaF90eXBlID09IERDQ1BfUEtUX0NMT1NFKSB7CQkvKiBTdGVwIDE0ICovCiAJCWlmIChkY2NwX3Jjdl9jbG9zZShzaywgc2tiKSkKIAkJCXJldHVybiAwOwogCQlnb3RvIGRpc2NhcmQ7CkBAIC02NzksOCArNjc0LDEyIEBACiAJCV9fa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAwOwogCi0JY2FzZSBEQ0NQX1JFU1BPTkQ6CiAJY2FzZSBEQ0NQX1BBUlRPUEVOOgorCQkvKiBTdGVwIDg6IGlmIHVzaW5nIEFjayBWZWN0b3JzLCBtYXJrIHBhY2tldCBhY2tub3dsZWRnZWFibGUgKi8KKwkJZGNjcF9oYW5kbGVfYWNrdmVjX3Byb2Nlc3Npbmcoc2ssIHNrYik7CisJCWRjY3BfZGVsaXZlcl9pbnB1dF90b19jY2lkcyhzaywgc2tiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBEQ0NQX1JFU1BPTkQ6CiAJCXF1ZXVlZCA9IGRjY3BfcmN2X3Jlc3BvbmRfcGFydG9wZW5fc3RhdGVfcHJvY2Vzcyhzaywgc2tiLAogCQkJCQkJCQkgZGgsIGxlbik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3Avb3V0cHV0LmMgYi9uZXQvZGNjcC9vdXRwdXQuYwppbmRleCBmYWIxMDhlLi5kZWRlM2VkIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9vdXRwdXQuYworKysgYi9uZXQvZGNjcC9vdXRwdXQuYwpAQCAtMjcsMTEgKzI3LDEzIEBACiAJaW5ldF9jc2tfY2xlYXJfeG1pdF90aW1lcihzaywgSUNTS19USU1FX0RBQ0spOwogfQogCi1zdGF0aWMgdm9pZCBkY2NwX3NrYl9lbnRhaWwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorLyogZW5xdWV1ZSBAc2tiIG9uIHNrX3NlbmRfaGVhZCBmb3IgcmV0cmFuc21pc3Npb24sIHJldHVybiBjbG9uZSB0byBzZW5kIG5vdyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICpkY2NwX3NrYl9lbnRhaWwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXNrYl9zZXRfb3duZXJfdyhza2IsIHNrKTsKIAlXQVJOX09OKHNrLT5za19zZW5kX2hlYWQpOwogCXNrLT5za19zZW5kX2hlYWQgPSBza2I7CisJcmV0dXJuIHNrYl9jbG9uZShzay0+c2tfc2VuZF9oZWFkLCBnZnBfYW55KCkpOwogfQogCiAvKgpAQCAtNTUyLDggKzU1NCw3IEBACiAKIAlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlID0gRENDUF9QS1RfUkVRVUVTVDsKIAotCWRjY3Bfc2tiX2VudGFpbChzaywgc2tiKTsKLQlkY2NwX3RyYW5zbWl0X3NrYihzaywgc2tiX2Nsb25lKHNrYiwgR0ZQX0tFUk5FTCkpOworCWRjY3BfdHJhbnNtaXRfc2tiKHNrLCBkY2NwX3NrYl9lbnRhaWwoc2ssIHNrYikpOwogCURDQ1BfSU5DX1NUQVRTKERDQ1BfTUlCX0FDVElWRU9QRU5TKTsKIAogCS8qIFRpbWVyIGZvciByZXBlYXRpbmcgdGhlIFJFUVVFU1QgdW50aWwgYW4gYW5zd2VyLiAqLwpAQCAtNjc4LDggKzY3OSw3IEBACiAJCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUgPSBEQ0NQX1BLVF9DTE9TRTsKIAogCWlmIChhY3RpdmUpIHsKLQkJZGNjcF9za2JfZW50YWlsKHNrLCBza2IpOwotCQlkY2NwX3RyYW5zbWl0X3NrYihzaywgc2tiX2Nsb25lKHNrYiwgcHJpbykpOworCQlza2IgPSBkY2NwX3NrYl9lbnRhaWwoc2ssIHNrYik7CiAJCS8qCiAJCSAqIFJldHJhbnNtaXNzaW9uIHRpbWVyIGZvciBhY3RpdmUtY2xvc2U6IFJGQyA0MzQwLCA4LjMgcmVxdWlyZXMKIAkJICogdG8gcmV0cmFuc21pdCB0aGUgQ2xvc2UvQ2xvc2VSZXEgdW50aWwgdGhlIENMT1NJTkcvQ0xPU0VSRVEKQEAgLTY5Miw2ICs2OTIsNiBAQAogCQkgKi8KIAkJaW5ldF9jc2tfcmVzZXRfeG1pdF90aW1lcihzaywgSUNTS19USU1FX1JFVFJBTlMsCiAJCQkJCSAgRENDUF9USU1FT1VUX0lOSVQsIERDQ1BfUlRPX01BWCk7Ci0JfSBlbHNlCi0JCWRjY3BfdHJhbnNtaXRfc2tiKHNrLCBza2IpOworCX0KKwlkY2NwX3RyYW5zbWl0X3NrYihzaywgc2tiKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMgYi9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCmluZGV4IGVhM2I2ZWUuLjE5YWNkMDAgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKKysrIGIvbmV0L2RlY25ldC9hZl9kZWNuZXQuYwpAQCAtMjkxLDIzICsyOTEsMjMgQEAKIAogCSpidWYrKyA9IHR5cGU7CiAKLQlzd2l0Y2godHlwZSkgewotCQljYXNlIDA6Ci0JCQkqYnVmKysgPSBzZG4tPnNkbl9vYmpudW07Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJKmJ1ZisrID0gMDsKLQkJCSpidWYrKyA9IGxlMTZfdG9fY3B1KHNkbi0+c2RuX29iam5hbWVsKTsKLQkJCW1lbWNweShidWYsIHNkbi0+c2RuX29iam5hbWUsIGxlMTZfdG9fY3B1KHNkbi0+c2RuX29iam5hbWVsKSk7Ci0JCQlsZW4gPSAzICsgbGUxNl90b19jcHUoc2RuLT5zZG5fb2JqbmFtZWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCW1lbXNldChidWYsIDAsIDUpOwotCQkJYnVmICs9IDU7Ci0JCQkqYnVmKysgPSBsZTE2X3RvX2NwdShzZG4tPnNkbl9vYmpuYW1lbCk7Ci0JCQltZW1jcHkoYnVmLCBzZG4tPnNkbl9vYmpuYW1lLCBsZTE2X3RvX2NwdShzZG4tPnNkbl9vYmpuYW1lbCkpOwotCQkJbGVuID0gNyArIGxlMTZfdG9fY3B1KHNkbi0+c2RuX29iam5hbWVsKTsKLQkJCWJyZWFrOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMDoKKwkJKmJ1ZisrID0gc2RuLT5zZG5fb2JqbnVtOworCQlicmVhazsKKwljYXNlIDE6CisJCSpidWYrKyA9IDA7CisJCSpidWYrKyA9IGxlMTZfdG9fY3B1KHNkbi0+c2RuX29iam5hbWVsKTsKKwkJbWVtY3B5KGJ1Ziwgc2RuLT5zZG5fb2JqbmFtZSwgbGUxNl90b19jcHUoc2RuLT5zZG5fb2JqbmFtZWwpKTsKKwkJbGVuID0gMyArIGxlMTZfdG9fY3B1KHNkbi0+c2RuX29iam5hbWVsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltZW1zZXQoYnVmLCAwLCA1KTsKKwkJYnVmICs9IDU7CisJCSpidWYrKyA9IGxlMTZfdG9fY3B1KHNkbi0+c2RuX29iam5hbWVsKTsKKwkJbWVtY3B5KGJ1Ziwgc2RuLT5zZG5fb2JqbmFtZSwgbGUxNl90b19jcHUoc2RuLT5zZG5fb2JqbmFtZWwpKTsKKwkJbGVuID0gNyArIGxlMTZfdG9fY3B1KHNkbi0+c2RuX29iam5hbWVsKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIGxlbjsKQEAgLTMzNywyMyArMzM3LDIzIEBACiAJKmZtdCA9ICpkYXRhKys7CiAJdHlwZSA9ICpkYXRhKys7CiAKLQlzd2l0Y2goKmZtdCkgewotCQljYXNlIDA6Ci0JCQlzZG4tPnNkbl9vYmpudW0gPSB0eXBlOwotCQkJcmV0dXJuIDI7Ci0JCWNhc2UgMToKLQkJCW5hbWVsID0gMTY7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJbGVuICAtPSA0OwotCQkJZGF0YSArPSA0OwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWxlbiAgLT0gODsKLQkJCWRhdGEgKz0gODsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC0xOworCXN3aXRjaCAoKmZtdCkgeworCWNhc2UgMDoKKwkJc2RuLT5zZG5fb2JqbnVtID0gdHlwZTsKKwkJcmV0dXJuIDI7CisJY2FzZSAxOgorCQluYW1lbCA9IDE2OworCQlicmVhazsKKwljYXNlIDI6CisJCWxlbiAgLT0gNDsKKwkJZGF0YSArPSA0OworCQlicmVhazsKKwljYXNlIDQ6CisJCWxlbiAgLT0gODsKKwkJZGF0YSArPSA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CiAJfQogCiAJbGVuIC09IDE7CkBAIC01NzUsMjUgKzU3NSwyNiBAQAogCiAJc2NwLT5wZXJzaXN0ID0gZG5fbnNwX3BlcnNpc3Qoc2spOwogCi0Jc3dpdGNoKHNjcC0+c3RhdGUpIHsKLQkJY2FzZSBETl9ESToKLQkJCWRuX25zcF9zZW5kX2Rpc2Moc2ssIE5TUF9ESVNDSU5JVCwgMCwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoc2NwLT5uc3Bfcnh0c2hpZnQgPj0gZGVjbmV0X2RpX2NvdW50KQotCQkJCXNjcC0+c3RhdGUgPSBETl9DTjsKLQkJCXJldHVybiAwOworCXN3aXRjaCAoc2NwLT5zdGF0ZSkgeworCWNhc2UgRE5fREk6CisJCWRuX25zcF9zZW5kX2Rpc2Moc2ssIE5TUF9ESVNDSU5JVCwgMCwgR0ZQX0FUT01JQyk7CisJCWlmIChzY3AtPm5zcF9yeHRzaGlmdCA+PSBkZWNuZXRfZGlfY291bnQpCisJCQlzY3AtPnN0YXRlID0gRE5fQ047CisJCXJldHVybiAwOwogCi0JCWNhc2UgRE5fRFI6Ci0JCQlkbl9uc3Bfc2VuZF9kaXNjKHNrLCBOU1BfRElTQ0lOSVQsIDAsIEdGUF9BVE9NSUMpOwotCQkJaWYgKHNjcC0+bnNwX3J4dHNoaWZ0ID49IGRlY25ldF9kcl9jb3VudCkKLQkJCQlzY3AtPnN0YXRlID0gRE5fRFJDOwotCQkJcmV0dXJuIDA7CisJY2FzZSBETl9EUjoKKwkJZG5fbnNwX3NlbmRfZGlzYyhzaywgTlNQX0RJU0NJTklULCAwLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHNjcC0+bnNwX3J4dHNoaWZ0ID49IGRlY25ldF9kcl9jb3VudCkKKwkJCXNjcC0+c3RhdGUgPSBETl9EUkM7CisJCXJldHVybiAwOwogCi0JCWNhc2UgRE5fRE46Ci0JCQlpZiAoc2NwLT5uc3Bfcnh0c2hpZnQgPCBkZWNuZXRfZG5fY291bnQpIHsKLQkJCQkvKiBwcmludGsoS0VSTl9ERUJVRyAiZG5fZGVzdHJveV90aW1lcjogRE5cbiIpOyAqLwotCQkJCWRuX25zcF9zZW5kX2Rpc2Moc2ssIE5TUF9ESVNDQ09ORiwgTlNQX1JFQVNPTl9EQywgR0ZQX0FUT01JQyk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9CisJY2FzZSBETl9ETjoKKwkJaWYgKHNjcC0+bnNwX3J4dHNoaWZ0IDwgZGVjbmV0X2RuX2NvdW50KSB7CisJCQkvKiBwcmludGsoS0VSTl9ERUJVRyAiZG5fZGVzdHJveV90aW1lcjogRE5cbiIpOyAqLworCQkJZG5fbnNwX3NlbmRfZGlzYyhzaywgTlNQX0RJU0NDT05GLCBOU1BfUkVBU09OX0RDLAorCQkJCQkgR0ZQX0FUT01JQyk7CisJCQlyZXR1cm4gMDsKKwkJfQogCX0KIAogCXNjcC0+cGVyc2lzdCA9IChIWiAqIGRlY25ldF90aW1lX3dhaXQpOwpAQCAtNjIzLDQyICs2MjQsNDIgQEAKIAogCXNrLT5za19zdGF0ZSA9IFRDUF9DTE9TRTsKIAotCXN3aXRjaChzY3AtPnN0YXRlKSB7Ci0JCWNhc2UgRE5fRE46Ci0JCQlkbl9uc3Bfc2VuZF9kaXNjKHNrLCBOU1BfRElTQ0NPTkYsIE5TUF9SRUFTT05fREMsCi0JCQkJCSBzay0+c2tfYWxsb2NhdGlvbik7Ci0JCQlzY3AtPnBlcnNpc3RfZnhuID0gZG5fZGVzdHJveV90aW1lcjsKLQkJCXNjcC0+cGVyc2lzdCA9IGRuX25zcF9wZXJzaXN0KHNrKTsKLQkJCWJyZWFrOwotCQljYXNlIEROX0NSOgotCQkJc2NwLT5zdGF0ZSA9IEROX0RSOwotCQkJZ290byBkaXNjX3JlamVjdDsKLQkJY2FzZSBETl9SVU46Ci0JCQlzY3AtPnN0YXRlID0gRE5fREk7Ci0JCWNhc2UgRE5fREk6Ci0JCWNhc2UgRE5fRFI6CisJc3dpdGNoIChzY3AtPnN0YXRlKSB7CisJY2FzZSBETl9ETjoKKwkJZG5fbnNwX3NlbmRfZGlzYyhzaywgTlNQX0RJU0NDT05GLCBOU1BfUkVBU09OX0RDLAorCQkJCSBzay0+c2tfYWxsb2NhdGlvbik7CisJCXNjcC0+cGVyc2lzdF9meG4gPSBkbl9kZXN0cm95X3RpbWVyOworCQlzY3AtPnBlcnNpc3QgPSBkbl9uc3BfcGVyc2lzdChzayk7CisJCWJyZWFrOworCWNhc2UgRE5fQ1I6CisJCXNjcC0+c3RhdGUgPSBETl9EUjsKKwkJZ290byBkaXNjX3JlamVjdDsKKwljYXNlIEROX1JVTjoKKwkJc2NwLT5zdGF0ZSA9IEROX0RJOworCWNhc2UgRE5fREk6CisJY2FzZSBETl9EUjoKIGRpc2NfcmVqZWN0OgotCQkJZG5fbnNwX3NlbmRfZGlzYyhzaywgTlNQX0RJU0NJTklULCAwLCBzay0+c2tfYWxsb2NhdGlvbik7Ci0JCWNhc2UgRE5fTkM6Ci0JCWNhc2UgRE5fTlI6Ci0JCWNhc2UgRE5fUko6Ci0JCWNhc2UgRE5fRElDOgotCQljYXNlIEROX0NOOgotCQljYXNlIEROX0RSQzoKLQkJY2FzZSBETl9DSToKLQkJY2FzZSBETl9DRDoKLQkJCXNjcC0+cGVyc2lzdF9meG4gPSBkbl9kZXN0cm95X3RpbWVyOwotCQkJc2NwLT5wZXJzaXN0ID0gZG5fbnNwX3BlcnNpc3Qoc2spOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiREVDbmV0OiBkbl9kZXN0cm95X3NvY2sgcGFzc2VkIHNvY2tldCBpbiBpbnZhbGlkIHN0YXRlXG4iKTsKLQkJY2FzZSBETl9POgotCQkJZG5fc3RvcF9zbG93X3RpbWVyKHNrKTsKKwkJZG5fbnNwX3NlbmRfZGlzYyhzaywgTlNQX0RJU0NJTklULCAwLCBzay0+c2tfYWxsb2NhdGlvbik7CisJY2FzZSBETl9OQzoKKwljYXNlIEROX05SOgorCWNhc2UgRE5fUko6CisJY2FzZSBETl9ESUM6CisJY2FzZSBETl9DTjoKKwljYXNlIEROX0RSQzoKKwljYXNlIEROX0NJOgorCWNhc2UgRE5fQ0Q6CisJCXNjcC0+cGVyc2lzdF9meG4gPSBkbl9kZXN0cm95X3RpbWVyOworCQlzY3AtPnBlcnNpc3QgPSBkbl9uc3BfcGVyc2lzdChzayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJERUNuZXQ6IGRuX2Rlc3Ryb3lfc29jayBwYXNzZWQgc29ja2V0IGluIGludmFsaWQgc3RhdGVcbiIpOworCWNhc2UgRE5fTzoKKwkJZG5fc3RvcF9zbG93X3RpbWVyKHNrKTsKIAotCQkJZG5fdW5oYXNoX3NvY2tfYmgoc2spOwotCQkJc29ja19wdXQoc2spOworCQlkbl91bmhhc2hfc29ja19iaChzayk7CisJCXNvY2tfcHV0KHNrKTsKIAotCQkJYnJlYWs7CisJCWJyZWFrOwogCX0KIH0KIApAQCAtNjgzLDE1ICs2ODQsMTUgQEAKIAlpZiAoIW5ldF9lcShuZXQsICZpbml0X25ldCkpCiAJCXJldHVybiAtRUFGTk9TVVBQT1JUOwogCi0Jc3dpdGNoKHNvY2stPnR5cGUpIHsKLQkJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKLQkJCWlmIChwcm90b2NvbCAhPSBETlBST1RPX05TUCkKLQkJCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKLQkJCWJyZWFrOwotCQljYXNlIFNPQ0tfU1RSRUFNOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKwlzd2l0Y2ggKHNvY2stPnR5cGUpIHsKKwljYXNlIFNPQ0tfU0VRUEFDS0VUOgorCQlpZiAocHJvdG9jb2wgIT0gRE5QUk9UT19OU1ApCisJCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKwkJYnJlYWs7CisJY2FzZSBTT0NLX1NUUkVBTToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CiAJfQogCiAKQEAgLTk4NywxNiArOTg4LDE2IEBACiB7CiAJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOwogCi0Jc3dpdGNoKHNjcC0+c3RhdGUpIHsKLQkJY2FzZSBETl9SVU46Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBETl9DUjoKLQkJCXJldHVybiBkbl9jb25maXJtX2FjY2VwdChzaywgdGltZW8sIHNrLT5za19hbGxvY2F0aW9uKTsKLQkJY2FzZSBETl9DSToKLQkJY2FzZSBETl9DQzoKLQkJCXJldHVybiBkbl93YWl0X3J1bihzaywgdGltZW8pOwotCQljYXNlIEROX086Ci0JCQlyZXR1cm4gX19kbl9jb25uZWN0KHNrLCBhZGRyLCBhZGRybGVuLCB0aW1lbywgZmxhZ3MpOworCXN3aXRjaCAoc2NwLT5zdGF0ZSkgeworCWNhc2UgRE5fUlVOOgorCQlyZXR1cm4gMDsKKwljYXNlIEROX0NSOgorCQlyZXR1cm4gZG5fY29uZmlybV9hY2NlcHQoc2ssIHRpbWVvLCBzay0+c2tfYWxsb2NhdGlvbik7CisJY2FzZSBETl9DSToKKwljYXNlIEROX0NDOgorCQlyZXR1cm4gZG5fd2FpdF9ydW4oc2ssIHRpbWVvKTsKKwljYXNlIEROX086CisJCXJldHVybiBfX2RuX2Nvbm5lY3Qoc2ssIGFkZHIsIGFkZHJsZW4sIHRpbWVvLCBmbGFncyk7CiAJfQogCiAJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzYzLDE0MSArMTM2NCwxNDAgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnUsIG9wdHZhbCwgb3B0bGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlzd2l0Y2gob3B0bmFtZSkgewotCQljYXNlIERTT19DT05EQVRBOgotCQkJaWYgKHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RFRCkKLQkJCQlyZXR1cm4gLUVJU0NPTk47Ci0JCQlpZiAoKHNjcC0+c3RhdGUgIT0gRE5fTykgJiYgKHNjcC0+c3RhdGUgIT0gRE5fQ1IpKQotCQkJCXJldHVybiAtRUlOVkFMOworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgRFNPX0NPTkRBVEE6CisJCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNURUQpCisJCQlyZXR1cm4gLUVJU0NPTk47CisJCWlmICgoc2NwLT5zdGF0ZSAhPSBETl9PKSAmJiAoc2NwLT5zdGF0ZSAhPSBETl9DUikpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IG9wdGRhdGFfZG4pKQotCQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3Qgb3B0ZGF0YV9kbikpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKGxlMTZfdG9fY3B1KHUub3B0Lm9wdF9vcHRsKSA+IDE2KQotCQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobGUxNl90b19jcHUodS5vcHQub3B0X29wdGwpID4gMTYpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJbWVtY3B5KCZzY3AtPmNvbm5kYXRhX291dCwgJnUub3B0LCBvcHRsZW4pOwotCQkJYnJlYWs7CisJCW1lbWNweSgmc2NwLT5jb25uZGF0YV9vdXQsICZ1Lm9wdCwgb3B0bGVuKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBEU09fRElTREFUQToKLQkJCWlmIChzb2NrLT5zdGF0ZSAhPSBTU19DT05ORUNURUQgJiYgc2NwLT5hY2NlcHRfbW9kZSA9PSBBQ0NfSU1NRUQpCi0JCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwljYXNlIERTT19ESVNEQVRBOgorCQlpZiAoc29jay0+c3RhdGUgIT0gU1NfQ09OTkVDVEVEICYmCisJCSAgICBzY3AtPmFjY2VwdF9tb2RlID09IEFDQ19JTU1FRCkKKwkJCXJldHVybiAtRU5PVENPTk47CiAKLQkJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBvcHRkYXRhX2RuKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IG9wdGRhdGFfZG4pKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCWlmIChsZTE2X3RvX2NwdSh1Lm9wdC5vcHRfb3B0bCkgPiAxNikKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGxlMTZfdG9fY3B1KHUub3B0Lm9wdF9vcHRsKSA+IDE2KQorCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCW1lbWNweSgmc2NwLT5kaXNjZGF0YV9vdXQsICZ1Lm9wdCwgb3B0bGVuKTsKLQkJCWJyZWFrOworCQltZW1jcHkoJnNjcC0+ZGlzY2RhdGFfb3V0LCAmdS5vcHQsIG9wdGxlbik7CisJCWJyZWFrOwogCi0JCWNhc2UgRFNPX0NPTkFDQ0VTUzoKLQkJCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNURUQpCi0JCQkJcmV0dXJuIC1FSVNDT05OOwotCQkJaWYgKHNjcC0+c3RhdGUgIT0gRE5fTykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIERTT19DT05BQ0NFU1M6CisJCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNURUQpCisJCQlyZXR1cm4gLUVJU0NPTk47CisJCWlmIChzY3AtPnN0YXRlICE9IEROX08pCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IGFjY2Vzc2RhdGFfZG4pKQotCQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3QgYWNjZXNzZGF0YV9kbikpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKCh1LmFjYy5hY2NfYWNjbCA+IEROX01BWEFDQ0wpIHx8Ci0JCQkJCSh1LmFjYy5hY2NfcGFzc2wgPiBETl9NQVhBQ0NMKSB8fAotCQkJCQkodS5hY2MuYWNjX3VzZXJsID4gRE5fTUFYQUNDTCkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICgodS5hY2MuYWNjX2FjY2wgPiBETl9NQVhBQ0NMKSB8fAorCQkgICAgKHUuYWNjLmFjY19wYXNzbCA+IEROX01BWEFDQ0wpIHx8CisJCSAgICAodS5hY2MuYWNjX3VzZXJsID4gRE5fTUFYQUNDTCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJbWVtY3B5KCZzY3AtPmFjY2Vzc2RhdGEsICZ1LmFjYywgb3B0bGVuKTsKLQkJCWJyZWFrOworCQltZW1jcHkoJnNjcC0+YWNjZXNzZGF0YSwgJnUuYWNjLCBvcHRsZW4pOworCQlicmVhazsKIAotCQljYXNlIERTT19BQ0NFUFRNT0RFOgotCQkJaWYgKHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RFRCkKLQkJCQlyZXR1cm4gLUVJU0NPTk47Ci0JCQlpZiAoc2NwLT5zdGF0ZSAhPSBETl9PKQotCQkJCXJldHVybiAtRUlOVkFMOworCWNhc2UgRFNPX0FDQ0VQVE1PREU6CisJCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNURUQpCisJCQlyZXR1cm4gLUVJU0NPTk47CisJCWlmIChzY3AtPnN0YXRlICE9IEROX08pCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKG9wdGxlbiAhPSBzaXplb2YoaW50KSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKG9wdGxlbiAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUlOVkFMOwogCi0JCQlpZiAoKHUubW9kZSAhPSBBQ0NfSU1NRUQpICYmICh1Lm1vZGUgIT0gQUNDX0RFRkVSKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCh1Lm1vZGUgIT0gQUNDX0lNTUVEKSAmJiAodS5tb2RlICE9IEFDQ19ERUZFUikpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJc2NwLT5hY2NlcHRfbW9kZSA9ICh1bnNpZ25lZCBjaGFyKXUubW9kZTsKLQkJCWJyZWFrOworCQlzY3AtPmFjY2VwdF9tb2RlID0gKHVuc2lnbmVkIGNoYXIpdS5tb2RlOworCQlicmVhazsKIAotCQljYXNlIERTT19DT05BQ0NFUFQ6CisJY2FzZSBEU09fQ09OQUNDRVBUOgorCQlpZiAoc2NwLT5zdGF0ZSAhPSBETl9DUikKKwkJCXJldHVybiAtRUlOVkFMOworCQl0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIDApOworCQllcnIgPSBkbl9jb25maXJtX2FjY2VwdChzaywgJnRpbWVvLCBzay0+c2tfYWxsb2NhdGlvbik7CisJCXJldHVybiBlcnI7CiAKLQkJCWlmIChzY3AtPnN0YXRlICE9IEROX0NSKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCAwKTsKLQkJCWVyciA9IGRuX2NvbmZpcm1fYWNjZXB0KHNrLCAmdGltZW8sIHNrLT5za19hbGxvY2F0aW9uKTsKLQkJCXJldHVybiBlcnI7CisJY2FzZSBEU09fQ09OUkVKRUNUOgorCQlpZiAoc2NwLT5zdGF0ZSAhPSBETl9DUikKKwkJCXJldHVybiAtRUlOVkFMOwogCi0JCWNhc2UgRFNPX0NPTlJFSkVDVDoKKwkJc2NwLT5zdGF0ZSA9IEROX0RSOworCQlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOworCQlkbl9uc3Bfc2VuZF9kaXNjKHNrLCAweDM4LCAwLCBzay0+c2tfYWxsb2NhdGlvbik7CisJCWJyZWFrOwogCi0JCQlpZiAoc2NwLT5zdGF0ZSAhPSBETl9DUikKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJc2NwLT5zdGF0ZSA9IEROX0RSOwotCQkJc2stPnNrX3NodXRkb3duID0gU0hVVERPV05fTUFTSzsKLQkJCWRuX25zcF9zZW5kX2Rpc2Moc2ssIDB4MzgsIDAsIHNrLT5za19hbGxvY2F0aW9uKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6CisJZGVmYXVsdDoKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCiAJCXJldHVybiBuZl9zZXRzb2Nrb3B0KHNrLCBQRl9ERUNuZXQsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKICNlbmRpZgotCQljYXNlIERTT19MSU5LSU5GTzoKLQkJY2FzZSBEU09fU1RSRUFNOgotCQljYXNlIERTT19TRVFQQUNLRVQ6Ci0JCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCWNhc2UgRFNPX0xJTktJTkZPOgorCWNhc2UgRFNPX1NUUkVBTToKKwljYXNlIERTT19TRVFQQUNLRVQ6CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAKLQkJY2FzZSBEU09fTUFYV0lORE9XOgotCQkJaWYgKG9wdGxlbiAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAodS53aW4gPiBOU1BfTUFYX1dJTkRPVykKLQkJCQl1LndpbiA9IE5TUF9NQVhfV0lORE9XOwotCQkJaWYgKHUud2luID09IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlzY3AtPm1heF93aW5kb3cgPSB1LndpbjsKLQkJCWlmIChzY3AtPnNuZF93aW5kb3cgPiB1LndpbikKLQkJCQlzY3AtPnNuZF93aW5kb3cgPSB1LndpbjsKLQkJCWJyZWFrOworCWNhc2UgRFNPX01BWFdJTkRPVzoKKwkJaWYgKG9wdGxlbiAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHUud2luID4gTlNQX01BWF9XSU5ET1cpCisJCQl1LndpbiA9IE5TUF9NQVhfV0lORE9XOworCQlpZiAodS53aW4gPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzY3AtPm1heF93aW5kb3cgPSB1LndpbjsKKwkJaWYgKHNjcC0+c25kX3dpbmRvdyA+IHUud2luKQorCQkJc2NwLT5zbmRfd2luZG93ID0gdS53aW47CisJCWJyZWFrOwogCi0JCWNhc2UgRFNPX05PREVMQVk6Ci0JCQlpZiAob3B0bGVuICE9IHNpemVvZihpbnQpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKHNjcC0+bm9uYWdsZSA9PSAyKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJc2NwLT5ub25hZ2xlID0gKHUudmFsID09IDApID8gMCA6IDE7Ci0JCQkvKiBpZiAoc2NwLT5ub25hZ2xlID09IDEpIHsgUHVzaCBwZW5kaW5nIGZyYW1lcyB9ICovCi0JCQlicmVhazsKKwljYXNlIERTT19OT0RFTEFZOgorCQlpZiAob3B0bGVuICE9IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChzY3AtPm5vbmFnbGUgPT0gMikKKwkJCXJldHVybiAtRUlOVkFMOworCQlzY3AtPm5vbmFnbGUgPSAodS52YWwgPT0gMCkgPyAwIDogMTsKKwkJLyogaWYgKHNjcC0+bm9uYWdsZSA9PSAxKSB7IFB1c2ggcGVuZGluZyBmcmFtZXMgfSAqLworCQlicmVhazsKIAotCQljYXNlIERTT19DT1JLOgotCQkJaWYgKG9wdGxlbiAhPSBzaXplb2YoaW50KSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChzY3AtPm5vbmFnbGUgPT0gMSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXNjcC0+bm9uYWdsZSA9ICh1LnZhbCA9PSAwKSA/IDAgOiAyOwotCQkJLyogaWYgKHNjcC0+bm9uYWdsZSA9PSAwKSB7IFB1c2ggcGVuZGluZyBmcmFtZXMgfSAqLwotCQkJYnJlYWs7CisJY2FzZSBEU09fQ09SSzoKKwkJaWYgKG9wdGxlbiAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoc2NwLT5ub25hZ2xlID09IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc2NwLT5ub25hZ2xlID0gKHUudmFsID09IDApID8gMCA6IDI7CisJCS8qIGlmIChzY3AtPm5vbmFnbGUgPT0gMCkgeyBQdXNoIHBlbmRpbmcgZnJhbWVzIH0gKi8KKwkJYnJlYWs7CiAKLQkJY2FzZSBEU09fU0VSVklDRVM6Ci0JCQlpZiAob3B0bGVuICE9IHNpemVvZih1bnNpZ25lZCBjaGFyKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmICgodS5zZXJ2aWNlcyAmIH5OU1BfRkNfTUFTSykgIT0gMHgwMSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmICgodS5zZXJ2aWNlcyAmIE5TUF9GQ19NQVNLKSA9PSBOU1BfRkNfTUFTSykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXNjcC0+c2VydmljZXNfbG9jID0gdS5zZXJ2aWNlczsKLQkJCWJyZWFrOworCWNhc2UgRFNPX1NFUlZJQ0VTOgorCQlpZiAob3B0bGVuICE9IHNpemVvZih1bnNpZ25lZCBjaGFyKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoKHUuc2VydmljZXMgJiB+TlNQX0ZDX01BU0spICE9IDB4MDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCh1LnNlcnZpY2VzICYgTlNQX0ZDX01BU0spID09IE5TUF9GQ19NQVNLKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNjcC0+c2VydmljZXNfbG9jID0gdS5zZXJ2aWNlczsKKwkJYnJlYWs7CiAKLQkJY2FzZSBEU09fSU5GTzoKLQkJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKHUuaW5mbyAmIDB4ZmMpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlzY3AtPmluZm9fbG9jID0gdS5pbmZvOwotCQkJYnJlYWs7CisJY2FzZSBEU09fSU5GTzoKKwkJaWYgKG9wdGxlbiAhPSBzaXplb2YodW5zaWduZWQgY2hhcikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHUuaW5mbyAmIDB4ZmMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc2NwLT5pbmZvX2xvYyA9IHUuaW5mbzsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNTI3LDEwNyArMTUyNywxMDYgQEAKIAlpZihnZXRfdXNlcihyX2xlbiAsIG9wdGxlbikpCiAJCXJldHVybiAtRUZBVUxUOwogCi0Jc3dpdGNoKG9wdG5hbWUpIHsKLQkJY2FzZSBEU09fQ09OREFUQToKLQkJCWlmIChyX2xlbiA+IHNpemVvZihzdHJ1Y3Qgb3B0ZGF0YV9kbikpCi0JCQkJcl9sZW4gPSBzaXplb2Yoc3RydWN0IG9wdGRhdGFfZG4pOwotCQkJcl9kYXRhID0gJnNjcC0+Y29ubmRhdGFfaW47CisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBEU09fQ09OREFUQToKKwkJaWYgKHJfbGVuID4gc2l6ZW9mKHN0cnVjdCBvcHRkYXRhX2RuKSkKKwkJCXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBvcHRkYXRhX2RuKTsKKwkJcl9kYXRhID0gJnNjcC0+Y29ubmRhdGFfaW47CisJCWJyZWFrOworCisJY2FzZSBEU09fRElTREFUQToKKwkJaWYgKHJfbGVuID4gc2l6ZW9mKHN0cnVjdCBvcHRkYXRhX2RuKSkKKwkJCXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBvcHRkYXRhX2RuKTsKKwkJcl9kYXRhID0gJnNjcC0+ZGlzY2RhdGFfaW47CisJCWJyZWFrOworCisJY2FzZSBEU09fQ09OQUNDRVNTOgorCQlpZiAocl9sZW4gPiBzaXplb2Yoc3RydWN0IGFjY2Vzc2RhdGFfZG4pKQorCQkJcl9sZW4gPSBzaXplb2Yoc3RydWN0IGFjY2Vzc2RhdGFfZG4pOworCQlyX2RhdGEgPSAmc2NwLT5hY2Nlc3NkYXRhOworCQlicmVhazsKKworCWNhc2UgRFNPX0FDQ0VQVE1PREU6CisJCWlmIChyX2xlbiA+IHNpemVvZih1bnNpZ25lZCBjaGFyKSkKKwkJCXJfbGVuID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworCQlyX2RhdGEgPSAmc2NwLT5hY2NlcHRfbW9kZTsKKwkJYnJlYWs7CisKKwljYXNlIERTT19MSU5LSU5GTzoKKwkJaWYgKHJfbGVuID4gc2l6ZW9mKHN0cnVjdCBsaW5raW5mb19kbikpCisJCQlyX2xlbiA9IHNpemVvZihzdHJ1Y3QgbGlua2luZm9fZG4pOworCisJCW1lbXNldCgmbGluaywgMCwgc2l6ZW9mKGxpbmspKTsKKworCQlzd2l0Y2ggKHNvY2stPnN0YXRlKSB7CisJCWNhc2UgU1NfQ09OTkVDVElORzoKKwkJCWxpbmsuaWRuX2xpbmtzdGF0ZSA9IExMX0NPTk5FQ1RJTkc7CiAJCQlicmVhazsKLQotCQljYXNlIERTT19ESVNEQVRBOgotCQkJaWYgKHJfbGVuID4gc2l6ZW9mKHN0cnVjdCBvcHRkYXRhX2RuKSkKLQkJCQlyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgb3B0ZGF0YV9kbik7Ci0JCQlyX2RhdGEgPSAmc2NwLT5kaXNjZGF0YV9pbjsKKwkJY2FzZSBTU19ESVNDT05ORUNUSU5HOgorCQkJbGluay5pZG5fbGlua3N0YXRlID0gTExfRElTQ09OTkVDVElORzsKIAkJCWJyZWFrOwotCi0JCWNhc2UgRFNPX0NPTkFDQ0VTUzoKLQkJCWlmIChyX2xlbiA+IHNpemVvZihzdHJ1Y3QgYWNjZXNzZGF0YV9kbikpCi0JCQkJcl9sZW4gPSBzaXplb2Yoc3RydWN0IGFjY2Vzc2RhdGFfZG4pOwotCQkJcl9kYXRhID0gJnNjcC0+YWNjZXNzZGF0YTsKKwkJY2FzZSBTU19DT05ORUNURUQ6CisJCQlsaW5rLmlkbl9saW5rc3RhdGUgPSBMTF9SVU5OSU5HOwogCQkJYnJlYWs7Ci0KLQkJY2FzZSBEU09fQUNDRVBUTU9ERToKLQkJCWlmIChyX2xlbiA+IHNpemVvZih1bnNpZ25lZCBjaGFyKSkKLQkJCQlyX2xlbiA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKLQkJCXJfZGF0YSA9ICZzY3AtPmFjY2VwdF9tb2RlOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBEU09fTElOS0lORk86Ci0JCQlpZiAocl9sZW4gPiBzaXplb2Yoc3RydWN0IGxpbmtpbmZvX2RuKSkKLQkJCQlyX2xlbiA9IHNpemVvZihzdHJ1Y3QgbGlua2luZm9fZG4pOwotCi0JCQltZW1zZXQoJmxpbmssIDAsIHNpemVvZihsaW5rKSk7Ci0KLQkJCXN3aXRjaChzb2NrLT5zdGF0ZSkgewotCQkJCWNhc2UgU1NfQ09OTkVDVElORzoKLQkJCQkJbGluay5pZG5fbGlua3N0YXRlID0gTExfQ09OTkVDVElORzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTU19ESVNDT05ORUNUSU5HOgotCQkJCQlsaW5rLmlkbl9saW5rc3RhdGUgPSBMTF9ESVNDT05ORUNUSU5HOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNTX0NPTk5FQ1RFRDoKLQkJCQkJbGluay5pZG5fbGlua3N0YXRlID0gTExfUlVOTklORzsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJbGluay5pZG5fbGlua3N0YXRlID0gTExfSU5BQ1RJVkU7Ci0JCQl9Ci0KLQkJCWxpbmsuaWRuX3NlZ3NpemUgPSBzY3AtPnNlZ3NpemVfcmVtOwotCQkJcl9kYXRhID0gJmxpbms7Ci0JCQlicmVhazsKLQogCQlkZWZhdWx0OgotI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLQkJewotCQkJaW50IHJldCwgbGVuOwotCi0JCQlpZihnZXRfdXNlcihsZW4sIG9wdGxlbikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCXJldCA9IG5mX2dldHNvY2tvcHQoc2ssIFBGX0RFQ25ldCwgb3B0bmFtZSwKLQkJCQkJCQlvcHR2YWwsICZsZW4pOwotCQkJaWYgKHJldCA+PSAwKQotCQkJCXJldCA9IHB1dF91c2VyKGxlbiwgb3B0bGVuKTsKLQkJCXJldHVybiByZXQ7CisJCQlsaW5rLmlkbl9saW5rc3RhdGUgPSBMTF9JTkFDVElWRTsKIAkJfQorCisJCWxpbmsuaWRuX3NlZ3NpemUgPSBzY3AtPnNlZ3NpemVfcmVtOworCQlyX2RhdGEgPSAmbGluazsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorI2lmZGVmIENPTkZJR19ORVRGSUxURVIKKwl7CisJCWludCByZXQsIGxlbjsKKworCQlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0ID0gbmZfZ2V0c29ja29wdChzaywgUEZfREVDbmV0LCBvcHRuYW1lLCBvcHR2YWwsICZsZW4pOworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSBwdXRfdXNlcihsZW4sIG9wdGxlbik7CisJCXJldHVybiByZXQ7CisJfQogI2VuZGlmCi0JCWNhc2UgRFNPX1NUUkVBTToKLQkJY2FzZSBEU09fU0VRUEFDS0VUOgotCQljYXNlIERTT19DT05BQ0NFUFQ6Ci0JCWNhc2UgRFNPX0NPTlJFSkVDVDoKLQkJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJY2FzZSBEU09fU1RSRUFNOgorCWNhc2UgRFNPX1NFUVBBQ0tFVDoKKwljYXNlIERTT19DT05BQ0NFUFQ6CisJY2FzZSBEU09fQ09OUkVKRUNUOgorCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCi0JCWNhc2UgRFNPX01BWFdJTkRPVzoKLQkJCWlmIChyX2xlbiA+IHNpemVvZih1bnNpZ25lZCBsb25nKSkKLQkJCQlyX2xlbiA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQkJCXJfZGF0YSA9ICZzY3AtPm1heF93aW5kb3c7Ci0JCQlicmVhazsKKwljYXNlIERTT19NQVhXSU5ET1c6CisJCWlmIChyX2xlbiA+IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCXJfbGVuID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQlyX2RhdGEgPSAmc2NwLT5tYXhfd2luZG93OworCQlicmVhazsKIAotCQljYXNlIERTT19OT0RFTEFZOgotCQkJaWYgKHJfbGVuID4gc2l6ZW9mKGludCkpCi0JCQkJcl9sZW4gPSBzaXplb2YoaW50KTsKLQkJCXZhbCA9IChzY3AtPm5vbmFnbGUgPT0gMSk7Ci0JCQlyX2RhdGEgPSAmdmFsOwotCQkJYnJlYWs7CisJY2FzZSBEU09fTk9ERUxBWToKKwkJaWYgKHJfbGVuID4gc2l6ZW9mKGludCkpCisJCQlyX2xlbiA9IHNpemVvZihpbnQpOworCQl2YWwgPSAoc2NwLT5ub25hZ2xlID09IDEpOworCQlyX2RhdGEgPSAmdmFsOworCQlicmVhazsKIAotCQljYXNlIERTT19DT1JLOgotCQkJaWYgKHJfbGVuID4gc2l6ZW9mKGludCkpCi0JCQkJcl9sZW4gPSBzaXplb2YoaW50KTsKLQkJCXZhbCA9IChzY3AtPm5vbmFnbGUgPT0gMik7Ci0JCQlyX2RhdGEgPSAmdmFsOwotCQkJYnJlYWs7CisJY2FzZSBEU09fQ09SSzoKKwkJaWYgKHJfbGVuID4gc2l6ZW9mKGludCkpCisJCQlyX2xlbiA9IHNpemVvZihpbnQpOworCQl2YWwgPSAoc2NwLT5ub25hZ2xlID09IDIpOworCQlyX2RhdGEgPSAmdmFsOworCQlicmVhazsKIAotCQljYXNlIERTT19TRVJWSUNFUzoKLQkJCWlmIChyX2xlbiA+IHNpemVvZih1bnNpZ25lZCBjaGFyKSkKLQkJCQlyX2xlbiA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKLQkJCXJfZGF0YSA9ICZzY3AtPnNlcnZpY2VzX3JlbTsKLQkJCWJyZWFrOworCWNhc2UgRFNPX1NFUlZJQ0VTOgorCQlpZiAocl9sZW4gPiBzaXplb2YodW5zaWduZWQgY2hhcikpCisJCQlyX2xlbiA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKwkJcl9kYXRhID0gJnNjcC0+c2VydmljZXNfcmVtOworCQlicmVhazsKIAotCQljYXNlIERTT19JTkZPOgotCQkJaWYgKHJfbGVuID4gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKQotCQkJCXJfbGVuID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwotCQkJcl9kYXRhID0gJnNjcC0+aW5mb19yZW07Ci0JCQlicmVhazsKKwljYXNlIERTT19JTkZPOgorCQlpZiAocl9sZW4gPiBzaXplb2YodW5zaWduZWQgY2hhcikpCisJCQlyX2xlbiA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKwkJcl9kYXRhID0gJnNjcC0+aW5mb19yZW07CisJCWJyZWFrOwogCX0KIAogCWlmIChyX2RhdGEpIHsKQEAgLTIwODgsMTUgKzIwODcsMTUgQEAKIAlpZiAoIW5ldF9lcShkZXZfbmV0KGRldiksICZpbml0X25ldCkpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAotCXN3aXRjaChldmVudCkgewotCQljYXNlIE5FVERFVl9VUDoKLQkJCWRuX2Rldl91cChkZXYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkVUREVWX0RPV046Ci0JCQlkbl9kZXZfZG93bihkZXYpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfVVA6CisJCWRuX2Rldl91cChkZXYpOworCQlicmVhazsKKwljYXNlIE5FVERFVl9ET1dOOgorCQlkbl9kZXZfZG93bihkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CkBAIC0yMjA5LDU0ICsyMjA4LDU0IEBACiAJaW50IGk7CiAKIAlzd2l0Y2ggKGxlMTZfdG9fY3B1KGRuLT5zZG5fb2JqbmFtZWwpKSB7Ci0JCWNhc2UgMDoKLQkJCXNwcmludGYoYnVmLCAiJWQiLCBkbi0+c2RuX29iam51bSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShkbi0+c2RuX29iam5hbWVsKTsgaSsrKSB7Ci0JCQkJYnVmW2ldID0gZG4tPnNkbl9vYmpuYW1lW2ldOwotCQkJCWlmIChJU19OT1RfUFJJTlRBQkxFKGJ1ZltpXSkpCi0JCQkJCWJ1ZltpXSA9ICcuJzsKLQkJCX0KLQkJCWJ1ZltpXSA9IDA7CisJY2FzZSAwOgorCQlzcHJpbnRmKGJ1ZiwgIiVkIiwgZG4tPnNkbl9vYmpudW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmb3IgKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoZG4tPnNkbl9vYmpuYW1lbCk7IGkrKykgeworCQkJYnVmW2ldID0gZG4tPnNkbl9vYmpuYW1lW2ldOworCQkJaWYgKElTX05PVF9QUklOVEFCTEUoYnVmW2ldKSkKKwkJCQlidWZbaV0gPSAnLic7CisJCX0KKwkJYnVmW2ldID0gMDsKIAl9CiB9CiAKIHN0YXRpYyBjaGFyICpkbl9zdGF0ZTJhc2ModW5zaWduZWQgY2hhciBzdGF0ZSkKIHsKLQlzd2l0Y2goc3RhdGUpIHsKLQkJY2FzZSBETl9POgotCQkJcmV0dXJuICJPUEVOIjsKLQkJY2FzZSBETl9DUjoKLQkJCXJldHVybiAiICBDUiI7Ci0JCWNhc2UgRE5fRFI6Ci0JCQlyZXR1cm4gIiAgRFIiOwotCQljYXNlIEROX0RSQzoKLQkJCXJldHVybiAiIERSQyI7Ci0JCWNhc2UgRE5fQ0M6Ci0JCQlyZXR1cm4gIiAgQ0MiOwotCQljYXNlIEROX0NJOgotCQkJcmV0dXJuICIgIENJIjsKLQkJY2FzZSBETl9OUjoKLQkJCXJldHVybiAiICBOUiI7Ci0JCWNhc2UgRE5fTkM6Ci0JCQlyZXR1cm4gIiAgTkMiOwotCQljYXNlIEROX0NEOgotCQkJcmV0dXJuICIgIENEIjsKLQkJY2FzZSBETl9SSjoKLQkJCXJldHVybiAiICBSSiI7Ci0JCWNhc2UgRE5fUlVOOgotCQkJcmV0dXJuICIgUlVOIjsKLQkJY2FzZSBETl9ESToKLQkJCXJldHVybiAiICBESSI7Ci0JCWNhc2UgRE5fRElDOgotCQkJcmV0dXJuICIgRElDIjsKLQkJY2FzZSBETl9ETjoKLQkJCXJldHVybiAiICBETiI7Ci0JCWNhc2UgRE5fQ0w6Ci0JCQlyZXR1cm4gIiAgQ0wiOwotCQljYXNlIEROX0NOOgotCQkJcmV0dXJuICIgIENOIjsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBETl9POgorCQlyZXR1cm4gIk9QRU4iOworCWNhc2UgRE5fQ1I6CisJCXJldHVybiAiICBDUiI7CisJY2FzZSBETl9EUjoKKwkJcmV0dXJuICIgIERSIjsKKwljYXNlIEROX0RSQzoKKwkJcmV0dXJuICIgRFJDIjsKKwljYXNlIEROX0NDOgorCQlyZXR1cm4gIiAgQ0MiOworCWNhc2UgRE5fQ0k6CisJCXJldHVybiAiICBDSSI7CisJY2FzZSBETl9OUjoKKwkJcmV0dXJuICIgIE5SIjsKKwljYXNlIEROX05DOgorCQlyZXR1cm4gIiAgTkMiOworCWNhc2UgRE5fQ0Q6CisJCXJldHVybiAiICBDRCI7CisJY2FzZSBETl9SSjoKKwkJcmV0dXJuICIgIFJKIjsKKwljYXNlIEROX1JVTjoKKwkJcmV0dXJuICIgUlVOIjsKKwljYXNlIEROX0RJOgorCQlyZXR1cm4gIiAgREkiOworCWNhc2UgRE5fRElDOgorCQlyZXR1cm4gIiBESUMiOworCWNhc2UgRE5fRE46CisJCXJldHVybiAiICBETiI7CisJY2FzZSBETl9DTDoKKwkJcmV0dXJuICIgIENMIjsKKwljYXNlIEROX0NOOgorCQlyZXR1cm4gIiAgQ04iOwogCX0KIAogCXJldHVybiAiPz8/PyI7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX2Rldi5jIGIvbmV0L2RlY25ldC9kbl9kZXYuYwppbmRleCBjZjI2YWM3Li5iYTRmYWNlIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX2Rldi5jCisrKyBiL25ldC9kZWNuZXQvZG5fZGV2LmMKQEAgLTQzNywxNyArNDM3LDE3IEBACiAKIAlkZXZfbG9hZCgmaW5pdF9uZXQsIGlmci0+aWZyX25hbWUpOwogCi0Jc3dpdGNoKGNtZCkgewotCQljYXNlIFNJT0NHSUZBRERSOgotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ1NJRkFERFI6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQlpZiAoc2RuLT5zZG5fZmFtaWx5ICE9IEFGX0RFQ25ldCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0lGQUREUjoKKwkJYnJlYWs7CisJY2FzZSBTSU9DU0lGQUREUjoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWlmIChzZG4tPnNkbl9mYW1pbHkgIT0gQUZfREVDbmV0KQogCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJ0bmxfbG9jaygpOwpAQCAtNDcwLDI3ICs0NzAsMjcgQEAKIAkJZ290byBkb25lOwogCX0KIAotCXN3aXRjaChjbWQpIHsKLQkJY2FzZSBTSU9DR0lGQUREUjoKLQkJCSooKF9fbGUxNiAqKXNkbi0+c2RuX25vZGVhZGRyKSA9IGlmYS0+aWZhX2xvY2FsOwotCQkJZ290byByYXJvazsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dJRkFERFI6CisJCSooKF9fbGUxNiAqKXNkbi0+c2RuX25vZGVhZGRyKSA9IGlmYS0+aWZhX2xvY2FsOworCQlnb3RvIHJhcm9rOwogCi0JCWNhc2UgU0lPQ1NJRkFERFI6Ci0JCQlpZiAoIWlmYSkgewotCQkJCWlmICgoaWZhID0gZG5fZGV2X2FsbG9jX2lmYSgpKSA9PSBOVUxMKSB7Ci0JCQkJCXJldCA9IC1FTk9CVUZTOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbWVtY3B5KGlmYS0+aWZhX2xhYmVsLCBkZXYtPm5hbWUsIElGTkFNU0laKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGlmYS0+aWZhX2xvY2FsID09IGRuX3NhZGRyMmRuKHNkbikpCi0JCQkJCWJyZWFrOwotCQkJCWRuX2Rldl9kZWxfaWZhKGRuX2RiLCBpZmFwLCAwKTsKKwljYXNlIFNJT0NTSUZBRERSOgorCQlpZiAoIWlmYSkgeworCQkJaWYgKChpZmEgPSBkbl9kZXZfYWxsb2NfaWZhKCkpID09IE5VTEwpIHsKKwkJCQlyZXQgPSAtRU5PQlVGUzsKKwkJCQlicmVhazsKIAkJCX0KKwkJCW1lbWNweShpZmEtPmlmYV9sYWJlbCwgZGV2LT5uYW1lLCBJRk5BTVNJWik7CisJCX0gZWxzZSB7CisJCQlpZiAoaWZhLT5pZmFfbG9jYWwgPT0gZG5fc2FkZHIyZG4oc2RuKSkKKwkJCQlicmVhazsKKwkJCWRuX2Rldl9kZWxfaWZhKGRuX2RiLCBpZmFwLCAwKTsKKwkJfQogCi0JCQlpZmEtPmlmYV9sb2NhbCA9IGlmYS0+aWZhX2FkZHJlc3MgPSBkbl9zYWRkcjJkbihzZG4pOworCQlpZmEtPmlmYV9sb2NhbCA9IGlmYS0+aWZhX2FkZHJlc3MgPSBkbl9zYWRkcjJkbihzZG4pOwogCi0JCQlyZXQgPSBkbl9kZXZfc2V0X2lmYShkZXYsIGlmYSk7CisJCXJldCA9IGRuX2Rldl9zZXRfaWZhKGRldiwgaWZhKTsKIAl9CiBkb25lOgogCXJ0bmxfdW5sb2NrKCk7CkBAIC0xMzEzLDcgKzEzMTMsNyBAQAogCiAJKysqcG9zOwogCi0JZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopdjsKKwlkZXYgPSB2OwogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKIAkJZGV2ID0gbmV0X2RldmljZV9lbnRyeSgmaW5pdF9uZXQuZGV2X2Jhc2VfaGVhZCk7CiAKQEAgLTEzMzUsMTMgKzEzMzUsMTMgQEAKIAogc3RhdGljIGNoYXIgKmRuX3R5cGUyYXNjKGNoYXIgdHlwZSkKIHsKLQlzd2l0Y2godHlwZSkgewotCQljYXNlIEROX0RFVl9CQ0FTVDoKLQkJCXJldHVybiAiQiI7Ci0JCWNhc2UgRE5fREVWX1VDQVNUOgotCQkJcmV0dXJuICJVIjsKLQkJY2FzZSBETl9ERVZfTVBPSU5UOgotCQkJcmV0dXJuICJNIjsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEROX0RFVl9CQ0FTVDoKKwkJcmV0dXJuICJCIjsKKwljYXNlIEROX0RFVl9VQ0FTVDoKKwkJcmV0dXJuICJVIjsKKwljYXNlIEROX0RFVl9NUE9JTlQ6CisJCXJldHVybiAiTSI7CiAJfQogCiAJcmV0dXJuICI/IjsKQEAgLTE0MTQsOSArMTQxNCw5IEBACiAKIAlkbl9kZXZfZGV2aWNlc19vbigpOwogCi0JcnRubF9yZWdpc3RlcihQRl9ERUNuZXQsIFJUTV9ORVdBRERSLCBkbl9ubF9uZXdhZGRyLCBOVUxMKTsKLQlydG5sX3JlZ2lzdGVyKFBGX0RFQ25ldCwgUlRNX0RFTEFERFIsIGRuX25sX2RlbGFkZHIsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fR0VUQUREUiwgTlVMTCwgZG5fbmxfZHVtcF9pZmFkZHIpOworCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fTkVXQUREUiwgZG5fbmxfbmV3YWRkciwgTlVMTCwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9ERUNuZXQsIFJUTV9ERUxBRERSLCBkbl9ubF9kZWxhZGRyLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0RFQ25ldCwgUlRNX0dFVEFERFIsIE5VTEwsIGRuX25sX2R1bXBfaWZhZGRyLCBOVUxMKTsKIAogCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCZpbml0X25ldCwgImRlY25ldF9kZXYiLCBTX0lSVUdPLCAmZG5fZGV2X3NlcV9mb3BzKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9maWIuYyBiL25ldC9kZWNuZXQvZG5fZmliLmMKaW5kZXggMWM3NGVkMy4uMmJkOGU1MyAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9maWIuYworKysgYi9uZXQvZGVjbmV0L2RuX2ZpYi5jCkBAIC00MTQsMzMgKzQxNCwzNCBAQAogCiAJCXJlcy0+ZmkgPSBmaTsKIAotCQlzd2l0Y2godHlwZSkgewotCQkJY2FzZSBSVE5fTkFUOgotCQkJCUROX0ZJQl9SRVNfUkVTRVQoKnJlcyk7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFJUTl9OQVQ6CisJCQlETl9GSUJfUkVTX1JFU0VUKCpyZXMpOworCQkJYXRvbWljX2luYygmZmktPmZpYl9jbG50cmVmKTsKKwkJCXJldHVybiAwOworCQljYXNlIFJUTl9VTklDQVNUOgorCQljYXNlIFJUTl9MT0NBTDoKKwkJCWZvcl9uZXh0aG9wcyhmaSkgeworCQkJCWlmIChuaC0+bmhfZmxhZ3MgJiBSVE5IX0ZfREVBRCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKCFmbGQtPmZsb3dpZG5fb2lmIHx8CisJCQkJICAgIGZsZC0+Zmxvd2lkbl9vaWYgPT0gbmgtPm5oX29pZikKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAobmhzZWwgPCBmaS0+ZmliX25ocykgeworCQkJCXJlcy0+bmhfc2VsID0gbmhzZWw7CiAJCQkJYXRvbWljX2luYygmZmktPmZpYl9jbG50cmVmKTsKIAkJCQlyZXR1cm4gMDsKLQkJCWNhc2UgUlROX1VOSUNBU1Q6Ci0JCQljYXNlIFJUTl9MT0NBTDoKLQkJCQlmb3JfbmV4dGhvcHMoZmkpIHsKLQkJCQkJaWYgKG5oLT5uaF9mbGFncyAmIFJUTkhfRl9ERUFEKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmICghZmxkLT5mbG93aWRuX29pZiB8fAotCQkJCQkgICAgZmxkLT5mbG93aWRuX29pZiA9PSBuaC0+bmhfb2lmKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChuaHNlbCA8IGZpLT5maWJfbmhzKSB7Ci0JCQkJCXJlcy0+bmhfc2VsID0gbmhzZWw7Ci0JCQkJCWF0b21pY19pbmMoJmZpLT5maWJfY2xudHJlZik7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQllbmRmb3JfbmV4dGhvcHMoZmkpOwotCQkJCXJlcy0+ZmkgPSBOVUxMOwotCQkJCXJldHVybiAxOwotCQkJZGVmYXVsdDoKLQkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCQkgcHJpbnRrKCJERUNuZXQ6IGltcG9zc2libGUgcm91dGluZyBldmVudCA6IGRuX2ZpYl9zZW1hbnRpY19tYXRjaCB0eXBlPSVkXG4iLCB0eXBlKTsKLQkJCQlyZXMtPmZpID0gTlVMTDsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWVuZGZvcl9uZXh0aG9wcyhmaSk7CisJCQlyZXMtPmZpID0gTlVMTDsKKwkJCXJldHVybiAxOworCQlkZWZhdWx0OgorCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoIkRFQ25ldDogaW1wb3NzaWJsZSByb3V0aW5nIGV2ZW50IDogZG5fZmliX3NlbWFudGljX21hdGNoIHR5cGU9JWRcbiIsCisJCQkJICAgICAgIHR5cGUpOworCQkJcmVzLT5maSA9IE5VTEw7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAlyZXR1cm4gZXJyOwpAQCAtNjQ3LDIwICs2NDgsMjAgQEAKIHsKIAlzdHJ1Y3QgZG5faWZhZGRyICppZmEgPSAoc3RydWN0IGRuX2lmYWRkciAqKXB0cjsKIAotCXN3aXRjaChldmVudCkgewotCQljYXNlIE5FVERFVl9VUDoKLQkJCWRuX2ZpYl9hZGRfaWZhZGRyKGlmYSk7Ci0JCQlkbl9maWJfc3luY191cChpZmEtPmlmYV9kZXYtPmRldik7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1VQOgorCQlkbl9maWJfYWRkX2lmYWRkcihpZmEpOworCQlkbl9maWJfc3luY191cChpZmEtPmlmYV9kZXYtPmRldik7CisJCWRuX3J0X2NhY2hlX2ZsdXNoKC0xKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfRE9XTjoKKwkJZG5fZmliX2RlbF9pZmFkZHIoaWZhKTsKKwkJaWYgKGlmYS0+aWZhX2RldiAmJiBpZmEtPmlmYV9kZXYtPmlmYV9saXN0ID09IE5VTEwpIHsKKwkJCWRuX2ZpYl9kaXNhYmxlX2FkZHIoaWZhLT5pZmFfZGV2LT5kZXYsIDEpOworCQl9IGVsc2UgewogCQkJZG5fcnRfY2FjaGVfZmx1c2goLTEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkVUREVWX0RPV046Ci0JCQlkbl9maWJfZGVsX2lmYWRkcihpZmEpOwotCQkJaWYgKGlmYS0+aWZhX2RldiAmJiBpZmEtPmlmYV9kZXYtPmlmYV9saXN0ID09IE5VTEwpIHsKLQkJCQlkbl9maWJfZGlzYWJsZV9hZGRyKGlmYS0+aWZhX2Rldi0+ZGV2LCAxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG5fcnRfY2FjaGVfZmx1c2goLTEpOwotCQkJfQotCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAJfQogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KQEAgLTc2Myw4ICs3NjQsOCBAQAogCiAJcmVnaXN0ZXJfZG5hZGRyX25vdGlmaWVyKCZkbl9maWJfZG5hZGRyX25vdGlmaWVyKTsKIAotCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fTkVXUk9VVEUsIGRuX2ZpYl9ydG1fbmV3cm91dGUsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fREVMUk9VVEUsIGRuX2ZpYl9ydG1fZGVscm91dGUsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fTkVXUk9VVEUsIGRuX2ZpYl9ydG1fbmV3cm91dGUsIE5VTEwsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fREVMUk9VVEUsIGRuX2ZpYl9ydG1fZGVscm91dGUsIE5VTEwsIE5VTEwpOwogfQogCiAKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fbmVpZ2guYyBiL25ldC9kZWNuZXQvZG5fbmVpZ2guYwppbmRleCA2MDJkYWRlLi4wZGMzZmU2IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX25laWdoLmMKKysrIGIvbmV0L2RlY25ldC9kbl9uZWlnaC5jCkBAIC01MSw5ICs1MSw5IEBACiBzdGF0aWMgaW50IGRuX25laWdoX2NvbnN0cnVjdChzdHJ1Y3QgbmVpZ2hib3VyICopOwogc3RhdGljIHZvaWQgZG5fbG9uZ19lcnJvcl9yZXBvcnQoc3RydWN0IG5laWdoYm91ciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIHN0YXRpYyB2b2lkIGRuX3Nob3J0X2Vycm9yX3JlcG9ydChzdHJ1Y3QgbmVpZ2hib3VyICosIHN0cnVjdCBza19idWZmICopOwotc3RhdGljIGludCBkbl9sb25nX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqKTsKLXN0YXRpYyBpbnQgZG5fc2hvcnRfb3V0cHV0KHN0cnVjdCBza19idWZmICopOwotc3RhdGljIGludCBkbl9waGFzZTNfb3V0cHV0KHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBkbl9sb25nX291dHB1dChzdHJ1Y3QgbmVpZ2hib3VyICosIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBkbl9zaG9ydF9vdXRwdXQoc3RydWN0IG5laWdoYm91ciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyBpbnQgZG5fcGhhc2UzX291dHB1dChzdHJ1Y3QgbmVpZ2hib3VyICosIHN0cnVjdCBza19idWZmICopOwogCiAKIC8qCkBAIC02NCw4ICs2NCw2IEBACiAJLmVycm9yX3JlcG9ydCA9CQlkbl9sb25nX2Vycm9yX3JlcG9ydCwKIAkub3V0cHV0ID0JCWRuX2xvbmdfb3V0cHV0LAogCS5jb25uZWN0ZWRfb3V0cHV0ID0JZG5fbG9uZ19vdXRwdXQsCi0JLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKLQkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKIH07CiAKIC8qCkBAIC03Niw4ICs3NCw2IEBACiAJLmVycm9yX3JlcG9ydCA9CQlkbl9zaG9ydF9lcnJvcl9yZXBvcnQsCiAJLm91dHB1dCA9CQlkbl9zaG9ydF9vdXRwdXQsCiAJLmNvbm5lY3RlZF9vdXRwdXQgPQlkbl9zaG9ydF9vdXRwdXQsCi0JLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKLQkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKIH07CiAKIC8qCkBAIC04OCw4ICs4NCw2IEBACiAJLmVycm9yX3JlcG9ydCA9CQlkbl9zaG9ydF9lcnJvcl9yZXBvcnQsIC8qIENhbiB1c2Ugc2hvcnQgdmVyc2lvbiBoZXJlICovCiAJLm91dHB1dCA9CQlkbl9waGFzZTNfb3V0cHV0LAogCS5jb25uZWN0ZWRfb3V0cHV0ID0JZG5fcGhhc2UzX291dHB1dCwKLQkuaGhfb3V0cHV0ID0JCWRldl9xdWV1ZV94bWl0LAotCS5xdWV1ZV94bWl0ID0JCWRldl9xdWV1ZV94bWl0CiB9OwogCiBzdGF0aWMgdTMyIGRuX25laWdoX2hhc2goY29uc3Qgdm9pZCAqcGtleSwKQEAgLTIwOCwxNCArMjAyLDE0IEBACiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOwogCXN0cnVjdCBkbl9yb3V0ZSAqcnQgPSAoc3RydWN0IGRuX3JvdXRlICopZHN0OwotCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gZHN0LT5uZWlnaGJvdXI7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OwogCWNoYXIgbWFjX2FkZHJbRVRIX0FMRU5dOwogCiAJZG5fZG4yZXRoKG1hY19hZGRyLCBydC0+cnRfbG9jYWxfc3JjKTsKIAlpZiAoZGV2X2hhcmRfaGVhZGVyKHNrYiwgZGV2LCBudG9ocyhza2ItPnByb3RvY29sKSwgbmVpZ2gtPmhhLAogCQkJICAgIG1hY19hZGRyLCBza2ItPmxlbikgPj0gMCkKLQkJcmV0dXJuIG5laWdoLT5vcHMtPnF1ZXVlX3htaXQoc2tiKTsKKwkJcmV0dXJuIGRldl9xdWV1ZV94bWl0KHNrYik7CiAKIAlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQlwcmludGsoS0VSTl9ERUJVRyAiZG5fbmVpZ2hfb3V0cHV0X3BhY2tldDogb29wcywgY2FuJ3Qgc2VuZCBwYWNrZXRcbiIpOwpAQCAtMjI0LDEwICsyMTgsOCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IGRuX2xvbmdfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IGRuX2xvbmdfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IGRzdC0+bmVpZ2hib3VyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OwogCWludCBoZWFkcm9vbSA9IGRldi0+aGFyZF9oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBkbl9sb25nX3BhY2tldCkgKyAzOwogCXVuc2lnbmVkIGNoYXIgKmRhdGE7CkBAIC0yNzEsMTAgKzI2Myw4IEBACiAJCSAgICAgICBuZWlnaC0+ZGV2LCBkbl9uZWlnaF9vdXRwdXRfcGFja2V0KTsKIH0KIAotc3RhdGljIGludCBkbl9zaG9ydF9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgZG5fc2hvcnRfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IGRzdC0+bmVpZ2hib3VyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OwogCWludCBoZWFkcm9vbSA9IGRldi0+aGFyZF9oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBkbl9zaG9ydF9wYWNrZXQpICsgMjsKIAlzdHJ1Y3QgZG5fc2hvcnRfcGFja2V0ICpzcDsKQEAgLTMxNSwxMCArMzA1LDggQEAKICAqIFBoYXNlIDMgb3V0cHV0IGlzIHRoZSBzYW1lIGlzIHNob3J0IG91dHB1dCwgZXhlY3B0IHRoYXQKICAqIGl0IGNsZWFycyB0aGUgYXJlYSBiaXRzIGJlZm9yZSB0cmFuc21pc3Npb24uCiAgKi8KLXN0YXRpYyBpbnQgZG5fcGhhc2UzX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBkbl9waGFzZTNfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IGRzdC0+bmVpZ2hib3VyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OwogCWludCBoZWFkcm9vbSA9IGRldi0+aGFyZF9oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBkbl9zaG9ydF9wYWNrZXQpICsgMjsKIAlzdHJ1Y3QgZG5fc2hvcnRfcGFja2V0ICpzcDsKQEAgLTQwNCwxMyArMzkyLDEzIEBACiAKIAkJCWRuLT5mbGFncyAmPSB+RE5fTkRGTEFHX1AzOwogCi0JCQlzd2l0Y2gobXNnLT5paW5mbyAmIEROX1JUX0lORk9fVFlQRSkgewotCQkJCWNhc2UgRE5fUlRfSU5GT19MMVJUOgotCQkJCQlkbi0+ZmxhZ3MgJj1+RE5fTkRGTEFHX1IyOwotCQkJCQlkbi0+ZmxhZ3MgfD0gRE5fTkRGTEFHX1IxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEROX1JUX0lORk9fTDJSVDoKLQkJCQkJZG4tPmZsYWdzIHw9IEROX05ERkxBR19SMjsKKwkJCXN3aXRjaCAobXNnLT5paW5mbyAmIEROX1JUX0lORk9fVFlQRSkgeworCQkJY2FzZSBETl9SVF9JTkZPX0wxUlQ6CisJCQkJZG4tPmZsYWdzICY9fkROX05ERkxBR19SMjsKKwkJCQlkbi0+ZmxhZ3MgfD0gRE5fTkRGTEFHX1IxOworCQkJCWJyZWFrOworCQkJY2FzZSBETl9SVF9JTkZPX0wyUlQ6CisJCQkJZG4tPmZsYWdzIHw9IEROX05ERkxBR19SMjsKIAkJCX0KIAkJfQogCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX25zcF9pbi5jIGIvbmV0L2RlY25ldC9kbl9uc3BfaW4uYwppbmRleCBiNDMwNTQ5Li43M2ZhMjY4IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX25zcF9pbi5jCisrKyBiL25ldC9kZWNuZXQvZG5fbnNwX2luLmMKQEAgLTEwMSwyMyArMTAxLDI3IEBACiAJdW5zaWduZWQgc2hvcnQgdHlwZSA9ICgoYWNrID4+IDEyKSAmIDB4MDAwMyk7CiAJaW50IHdha2V1cCA9IDA7CiAKLQlzd2l0Y2godHlwZSkgewotCQljYXNlIDA6IC8qIEFDSyAtIERhdGEgKi8KLQkJCWlmIChkbl9hZnRlcihhY2ssIHNjcC0+YWNrcmN2X2RhdCkpIHsKLQkJCQlzY3AtPmFja3Jjdl9kYXQgPSBhY2sgJiAweDBmZmY7Ci0JCQkJd2FrZXVwIHw9IGRuX25zcF9jaGVja194bWl0X3F1ZXVlKHNrLCBza2IsICZzY3AtPmRhdGFfeG1pdF9xdWV1ZSwgYWNrKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDE6IC8qIE5BSyAtIERhdGEgKi8KLQkJCWJyZWFrOwotCQljYXNlIDI6IC8qIEFDSyAtIE90aGVyRGF0YSAqLwotCQkJaWYgKGRuX2FmdGVyKGFjaywgc2NwLT5hY2tyY3Zfb3RoKSkgewotCQkJCXNjcC0+YWNrcmN2X290aCA9IGFjayAmIDB4MGZmZjsKLQkJCQl3YWtldXAgfD0gZG5fbnNwX2NoZWNrX3htaXRfcXVldWUoc2ssIHNrYiwgJnNjcC0+b3RoZXJfeG1pdF9xdWV1ZSwgYWNrKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDM6IC8qIE5BSyAtIE90aGVyRGF0YSAqLwotCQkJYnJlYWs7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAwOiAvKiBBQ0sgLSBEYXRhICovCisJCWlmIChkbl9hZnRlcihhY2ssIHNjcC0+YWNrcmN2X2RhdCkpIHsKKwkJCXNjcC0+YWNrcmN2X2RhdCA9IGFjayAmIDB4MGZmZjsKKwkJCXdha2V1cCB8PSBkbl9uc3BfY2hlY2tfeG1pdF9xdWV1ZShzaywgc2tiLAorCQkJCQkJCSAgJnNjcC0+ZGF0YV94bWl0X3F1ZXVlLAorCQkJCQkJCSAgYWNrKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDE6IC8qIE5BSyAtIERhdGEgKi8KKwkJYnJlYWs7CisJY2FzZSAyOiAvKiBBQ0sgLSBPdGhlckRhdGEgKi8KKwkJaWYgKGRuX2FmdGVyKGFjaywgc2NwLT5hY2tyY3Zfb3RoKSkgeworCQkJc2NwLT5hY2tyY3Zfb3RoID0gYWNrICYgMHgwZmZmOworCQkJd2FrZXVwIHw9IGRuX25zcF9jaGVja194bWl0X3F1ZXVlKHNrLCBza2IsCisJCQkJCQkJICAmc2NwLT5vdGhlcl94bWl0X3F1ZXVlLAorCQkJCQkJCSAgYWNrKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDM6IC8qIE5BSyAtIE90aGVyRGF0YSAqLworCQlicmVhazsKIAl9CiAKIAlpZiAod2FrZXVwICYmICFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCkBAIC00MTcsMTkgKzQyMSwxOSBAQAogCXNjcC0+YWRkcnJlbSA9IGNiLT5zcmNfcG9ydDsKIAlzay0+c2tfc3RhdGUgPSBUQ1BfQ0xPU0U7CiAKLQlzd2l0Y2goc2NwLT5zdGF0ZSkgewotCQljYXNlIEROX0NJOgotCQljYXNlIEROX0NEOgotCQkJc2NwLT5zdGF0ZSA9IEROX1JKOwotCQkJc2stPnNrX2VyciA9IEVDT05OUkVGVVNFRDsKLQkJCWJyZWFrOwotCQljYXNlIEROX1JVTjoKLQkJCXNrLT5za19zaHV0ZG93biB8PSBTSFVURE9XTl9NQVNLOwotCQkJc2NwLT5zdGF0ZSA9IEROX0ROOwotCQkJYnJlYWs7Ci0JCWNhc2UgRE5fREk6Ci0JCQlzY3AtPnN0YXRlID0gRE5fRElDOwotCQkJYnJlYWs7CisJc3dpdGNoIChzY3AtPnN0YXRlKSB7CisJY2FzZSBETl9DSToKKwljYXNlIEROX0NEOgorCQlzY3AtPnN0YXRlID0gRE5fUko7CisJCXNrLT5za19lcnIgPSBFQ09OTlJFRlVTRUQ7CisJCWJyZWFrOworCWNhc2UgRE5fUlVOOgorCQlzay0+c2tfc2h1dGRvd24gfD0gU0hVVERPV05fTUFTSzsKKwkJc2NwLT5zdGF0ZSA9IEROX0ROOworCQlicmVhazsKKwljYXNlIEROX0RJOgorCQlzY3AtPnN0YXRlID0gRE5fRElDOworCQlicmVhazsKIAl9CiAKIAlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgewpAQCAtNDcwLDIzICs0NzQsMjMgQEAKIAogCXNrLT5za19zdGF0ZSA9IFRDUF9DTE9TRTsKIAotCXN3aXRjaChzY3AtPnN0YXRlKSB7Ci0JCWNhc2UgRE5fQ0k6Ci0JCQlzY3AtPnN0YXRlID0gRE5fTlI7Ci0JCQlicmVhazsKLQkJY2FzZSBETl9EUjoKLQkJCWlmIChyZWFzb24gPT0gTlNQX1JFQVNPTl9EQykKLQkJCQlzY3AtPnN0YXRlID0gRE5fRFJDOwotCQkJaWYgKHJlYXNvbiA9PSBOU1BfUkVBU09OX05MKQotCQkJCXNjcC0+c3RhdGUgPSBETl9DTjsKLQkJCWJyZWFrOwotCQljYXNlIEROX0RJOgotCQkJc2NwLT5zdGF0ZSA9IEROX0RJQzsKLQkJCWJyZWFrOwotCQljYXNlIEROX1JVTjoKLQkJCXNrLT5za19zaHV0ZG93biB8PSBTSFVURE9XTl9NQVNLOwotCQljYXNlIEROX0NDOgorCXN3aXRjaCAoc2NwLT5zdGF0ZSkgeworCWNhc2UgRE5fQ0k6CisJCXNjcC0+c3RhdGUgPSBETl9OUjsKKwkJYnJlYWs7CisJY2FzZSBETl9EUjoKKwkJaWYgKHJlYXNvbiA9PSBOU1BfUkVBU09OX0RDKQorCQkJc2NwLT5zdGF0ZSA9IEROX0RSQzsKKwkJaWYgKHJlYXNvbiA9PSBOU1BfUkVBU09OX05MKQogCQkJc2NwLT5zdGF0ZSA9IEROX0NOOworCQlicmVhazsKKwljYXNlIEROX0RJOgorCQlzY3AtPnN0YXRlID0gRE5fRElDOworCQlicmVhazsKKwljYXNlIEROX1JVTjoKKwkJc2stPnNrX3NodXRkb3duIHw9IFNIVVRET1dOX01BU0s7CisJY2FzZSBETl9DQzoKKwkJc2NwLT5zdGF0ZSA9IEROX0NOOwogCX0KIAogCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CkBAIC02OTIsMTYgKzY5NiwxNiBAQAogCQlnb3RvIG91dDsKIAogCWlmICgocmVhc29uICE9IE5TUF9SRUFTT05fT0spICYmICgoY2ItPm5zcF9mbGFncyAmIDB4MGMpID09IDB4MDgpKSB7Ci0JCXN3aXRjaChjYi0+bnNwX2ZsYWdzICYgMHg3MCkgewotCQkJY2FzZSAweDEwOgotCQkJY2FzZSAweDYwOiAvKiAoUmV0cmFuc21pdHRlZCkgQ29ubmVjdCBJbml0ICovCi0JCQkJZG5fbnNwX3JldHVybl9kaXNjKHNrYiwgTlNQX0RJU0NJTklULCByZWFzb24pOwotCQkJCXJldCA9IE5FVF9SWF9TVUNDRVNTOwotCQkJCWJyZWFrOwotCQkJY2FzZSAweDIwOiAvKiBDb25uZWN0IENvbmZpcm0gKi8KLQkJCQlkbl9uc3BfcmV0dXJuX2Rpc2Moc2tiLCBOU1BfRElTQ0NPTkYsIHJlYXNvbik7Ci0JCQkJcmV0ID0gTkVUX1JYX1NVQ0NFU1M7Ci0JCQkJYnJlYWs7CisJCXN3aXRjaCAoY2ItPm5zcF9mbGFncyAmIDB4NzApIHsKKwkJY2FzZSAweDEwOgorCQljYXNlIDB4NjA6IC8qIChSZXRyYW5zbWl0dGVkKSBDb25uZWN0IEluaXQgKi8KKwkJCWRuX25zcF9yZXR1cm5fZGlzYyhza2IsIE5TUF9ESVNDSU5JVCwgcmVhc29uKTsKKwkJCXJldCA9IE5FVF9SWF9TVUNDRVNTOworCQkJYnJlYWs7CisJCWNhc2UgMHgyMDogLyogQ29ubmVjdCBDb25maXJtICovCisJCQlkbl9uc3BfcmV0dXJuX2Rpc2Moc2tiLCBOU1BfRElTQ0NPTkYsIHJlYXNvbik7CisJCQlyZXQgPSBORVRfUlhfU1VDQ0VTUzsKKwkJCWJyZWFrOwogCQl9CiAJfQogCkBAIC03MzMsMTcgKzczNywxNyBAQAogCSAqIEZpbHRlciBvdXQgY29ubmluaXRzIGFuZCB1c2VsZXNzIHBhY2tldCB0eXBlcwogCSAqLwogCWlmICgoY2ItPm5zcF9mbGFncyAmIDB4MGMpID09IDB4MDgpIHsKLQkJc3dpdGNoKGNiLT5uc3BfZmxhZ3MgJiAweDcwKSB7Ci0JCQljYXNlIDB4MDA6IC8qIE5PUCAqLwotCQkJY2FzZSAweDcwOiAvKiBSZXNlcnZlZCAqLwotCQkJY2FzZSAweDUwOiAvKiBSZXNlcnZlZCwgUGhhc2UgSUkgbm9kZSBpbml0ICovCisJCXN3aXRjaCAoY2ItPm5zcF9mbGFncyAmIDB4NzApIHsKKwkJY2FzZSAweDAwOiAvKiBOT1AgKi8KKwkJY2FzZSAweDcwOiAvKiBSZXNlcnZlZCAqLworCQljYXNlIDB4NTA6IC8qIFJlc2VydmVkLCBQaGFzZSBJSSBub2RlIGluaXQgKi8KKwkJCWdvdG8gZnJlZV9vdXQ7CisJCWNhc2UgMHgxMDoKKwkJY2FzZSAweDYwOgorCQkJaWYgKHVubGlrZWx5KGNiLT5ydF9mbGFncyAmIEROX1JUX0ZfUlRTKSkKIAkJCQlnb3RvIGZyZWVfb3V0OwotCQkJY2FzZSAweDEwOgotCQkJY2FzZSAweDYwOgotCQkJCWlmICh1bmxpa2VseShjYi0+cnRfZmxhZ3MgJiBETl9SVF9GX1JUUykpCi0JCQkJCWdvdG8gZnJlZV9vdXQ7Ci0JCQkJc2sgPSBkbl9maW5kX2xpc3RlbmVyKHNrYiwgJnJlYXNvbik7Ci0JCQkJZ290byBnb3RfaXQ7CisJCQlzayA9IGRuX2ZpbmRfbGlzdGVuZXIoc2tiLCAmcmVhc29uKTsKKwkJCWdvdG8gZ290X2l0OwogCQl9CiAJfQogCkBAIC04MzYsMjAgKzg0MCwyMCBAQAogCSAqIENvbnRyb2wgcGFja2V0LgogCSAqLwogCWlmICgoY2ItPm5zcF9mbGFncyAmIDB4MGMpID09IDB4MDgpIHsKLQkJc3dpdGNoKGNiLT5uc3BfZmxhZ3MgJiAweDcwKSB7Ci0JCQljYXNlIDB4MTA6Ci0JCQljYXNlIDB4NjA6Ci0JCQkJZG5fbnNwX2Nvbm5faW5pdChzaywgc2tiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgyMDoKLQkJCQlkbl9uc3BfY29ubl9jb25mKHNrLCBza2IpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAweDMwOgotCQkJCWRuX25zcF9kaXNjX2luaXQoc2ssIHNrYik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4NDA6Ci0JCQkJZG5fbnNwX2Rpc2NfY29uZihzaywgc2tiKTsKLQkJCQlicmVhazsKKwkJc3dpdGNoIChjYi0+bnNwX2ZsYWdzICYgMHg3MCkgeworCQljYXNlIDB4MTA6CisJCWNhc2UgMHg2MDoKKwkJCWRuX25zcF9jb25uX2luaXQoc2ssIHNrYik7CisJCQlicmVhazsKKwkJY2FzZSAweDIwOgorCQkJZG5fbnNwX2Nvbm5fY29uZihzaywgc2tiKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MzA6CisJCQlkbl9uc3BfZGlzY19pbml0KHNrLCBza2IpOworCQkJYnJlYWs7CisJCWNhc2UgMHg0MDoKKwkJCWRuX25zcF9kaXNjX2NvbmYoc2ssIHNrYik7CisJCQlicmVhazsKIAkJfQogCiAJfSBlbHNlIGlmIChjYi0+bnNwX2ZsYWdzID09IDB4MjQpIHsKQEAgLTg5MCwxNSArODk0LDE1IEBACiAJCQlpZiAoc2NwLT5zdGF0ZSAhPSBETl9SVU4pCiAJCQkJZ290byBmcmVlX291dDsKIAotCQkJc3dpdGNoKGNiLT5uc3BfZmxhZ3MpIHsKLQkJCQljYXNlIDB4MTA6IC8qIExTICovCi0JCQkJCWRuX25zcF9saW5rc2VydmljZShzaywgc2tiKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAweDMwOiAvKiBPRCAqLwotCQkJCQlkbl9uc3Bfb3RoZXJkYXRhKHNrLCBza2IpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlkbl9uc3BfZGF0YShzaywgc2tiKTsKKwkJCXN3aXRjaCAoY2ItPm5zcF9mbGFncykgeworCQkJY2FzZSAweDEwOiAvKiBMUyAqLworCQkJCWRuX25zcF9saW5rc2VydmljZShzaywgc2tiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgzMDogLyogT0QgKi8KKwkJCQlkbl9uc3Bfb3RoZXJkYXRhKHNrLCBza2IpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkbl9uc3BfZGF0YShzaywgc2tiKTsKIAkJCX0KIAogCQl9IGVsc2UgeyAvKiBBY2ssIGNodWNrIGl0IG91dCBoZXJlICovCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3JvdXRlLmMgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKaW5kZXggNzQ1NDRiYy4uNDM0NTBjMSAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCisrKyBiL25ldC9kZWNuZXQvZG5fcm91dGUuYwpAQCAtMTE2LDYgKzExNiw3IEBACiBzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqZG5fZHN0X25lZ2F0aXZlX2FkdmljZShzdHJ1Y3QgZHN0X2VudHJ5ICopOwogc3RhdGljIHZvaWQgZG5fZHN0X2xpbmtfZmFpbHVyZShzdHJ1Y3Qgc2tfYnVmZiAqKTsKIHN0YXRpYyB2b2lkIGRuX2RzdF91cGRhdGVfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBtdHUpOworc3RhdGljIHN0cnVjdCBuZWlnaGJvdXIgKmRuX2RzdF9uZWlnaF9sb29rdXAoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBjb25zdCB2b2lkICpkYWRkcik7CiBzdGF0aWMgaW50IGRuX3JvdXRlX2lucHV0KHN0cnVjdCBza19idWZmICopOwogc3RhdGljIHZvaWQgZG5fcnVuX2ZsdXNoKHVuc2lnbmVkIGxvbmcgZHVtbXkpOwogCkBAIC0xMzksNiArMTQwLDcgQEAKIAkubmVnYXRpdmVfYWR2aWNlID0JZG5fZHN0X25lZ2F0aXZlX2FkdmljZSwKIAkubGlua19mYWlsdXJlID0JCWRuX2RzdF9saW5rX2ZhaWx1cmUsCiAJLnVwZGF0ZV9wbXR1ID0JCWRuX2RzdF91cGRhdGVfcG10dSwKKwkubmVpZ2hfbG9va3VwID0JCWRuX2RzdF9uZWlnaF9sb29rdXAsCiB9OwogCiBzdGF0aWMgdm9pZCBkbl9kc3RfZGVzdHJveShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCkBAIC0yNDEsOSArMjQzLDExIEBACiAgKi8KIHN0YXRpYyB2b2lkIGRuX2RzdF91cGRhdGVfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBtdHUpCiB7CisJc3RydWN0IG5laWdoYm91ciAqbiA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCk7CiAJdTMyIG1pbl9tdHUgPSAyMzA7Ci0Jc3RydWN0IGRuX2RldiAqZG4gPSBkc3QtPm5laWdoYm91ciA/Ci0JCQkgICAgcmN1X2RlcmVmZXJlbmNlX3Jhdyhkc3QtPm5laWdoYm91ci0+ZGV2LT5kbl9wdHIpIDogTlVMTDsKKwlzdHJ1Y3QgZG5fZGV2ICpkbjsKKworCWRuID0gbiA/IHJjdV9kZXJlZmVyZW5jZV9yYXcobi0+ZGV2LT5kbl9wdHIpIDogTlVMTDsKIAogCWlmIChkbiAmJiBkbi0+dXNlX2xvbmcgPT0gMCkKIAkJbWluX210dSAtPSA2OwpAQCAtNDk1LDExICs0OTksMTEgQEAKIAl9CiAKIAlpZiAoKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX0hPU1QpICYmIChjYi0+cnRfZmxhZ3MgJiBETl9SVF9GX1JRUikpIHsKLQkJc3dpdGNoKGNiLT5ydF9mbGFncyAmIEROX1JUX1BLVF9NU0spIHsKLQkJCWNhc2UgRE5fUlRfUEtUX1NIT1JUOgotCQkJCXJldHVybiBkbl9yZXR1cm5fc2hvcnQoc2tiKTsKLQkJCWNhc2UgRE5fUlRfUEtUX0xPTkc6Ci0JCQkJcmV0dXJuIGRuX3JldHVybl9sb25nKHNrYik7CisJCXN3aXRjaCAoY2ItPnJ0X2ZsYWdzICYgRE5fUlRfUEtUX01TSykgeworCQljYXNlIEROX1JUX1BLVF9TSE9SVDoKKwkJCXJldHVybiBkbl9yZXR1cm5fc2hvcnQoc2tiKTsKKwkJY2FzZSBETl9SVF9QS1RfTE9ORzoKKwkJCXJldHVybiBkbl9yZXR1cm5fbG9uZyhza2IpOwogCQl9CiAJfQogCkBAIC02NTIsMzggKzY1NiwzOCBAQAogCQlpZiAodW5saWtlbHkoc2tiX2xpbmVhcml6ZShza2IpKSkKIAkJCWdvdG8gZHVtcF9pdDsKIAotCQlzd2l0Y2goZmxhZ3MgJiBETl9SVF9DTlRMX01TSykgewotCQkJY2FzZSBETl9SVF9QS1RfSU5JVDoKLQkJCQlkbl9kZXZfaW5pdF9wa3Qoc2tiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRE5fUlRfUEtUX1ZFUkk6Ci0JCQkJZG5fZGV2X3ZlcmlfcGt0KHNrYik7Ci0JCQkJYnJlYWs7CisJCXN3aXRjaCAoZmxhZ3MgJiBETl9SVF9DTlRMX01TSykgeworCQljYXNlIEROX1JUX1BLVF9JTklUOgorCQkJZG5fZGV2X2luaXRfcGt0KHNrYik7CisJCQlicmVhazsKKwkJY2FzZSBETl9SVF9QS1RfVkVSSToKKwkJCWRuX2Rldl92ZXJpX3BrdChza2IpOworCQkJYnJlYWs7CiAJCX0KIAogCQlpZiAoZG4tPnBhcm1zLnN0YXRlICE9IEROX0RFVl9TX1JVKQogCQkJZ290byBkdW1wX2l0OwogCi0JCXN3aXRjaChmbGFncyAmIEROX1JUX0NOVExfTVNLKSB7Ci0JCQljYXNlIEROX1JUX1BLVF9IRUxPOgotCQkJCXJldHVybiBORl9IT09LKE5GUFJPVE9fREVDTkVULCBORl9ETl9IRUxMTywKLQkJCQkJICAgICAgIHNrYiwgc2tiLT5kZXYsIE5VTEwsCi0JCQkJCSAgICAgICBkbl9yb3V0ZV9wdHBfaGVsbG8pOworCQlzd2l0Y2ggKGZsYWdzICYgRE5fUlRfQ05UTF9NU0spIHsKKwkJY2FzZSBETl9SVF9QS1RfSEVMTzoKKwkJCXJldHVybiBORl9IT09LKE5GUFJPVE9fREVDTkVULCBORl9ETl9IRUxMTywKKwkJCQkgICAgICAgc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJCQkgICAgICAgZG5fcm91dGVfcHRwX2hlbGxvKTsKIAotCQkJY2FzZSBETl9SVF9QS1RfTDFSVDoKLQkJCWNhc2UgRE5fUlRfUEtUX0wyUlQ6Ci0JCQkJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX1JPVVRFLAotCQkJCQkgICAgICAgc2tiLCBza2ItPmRldiwgTlVMTCwKLQkJCQkJICAgICAgIGRuX3JvdXRlX2Rpc2NhcmQpOwotCQkJY2FzZSBETl9SVF9QS1RfRVJUSDoKLQkJCQlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0RFQ05FVCwgTkZfRE5fSEVMTE8sCi0JCQkJCSAgICAgICBza2IsIHNrYi0+ZGV2LCBOVUxMLAotCQkJCQkgICAgICAgZG5fbmVpZ2hfcm91dGVyX2hlbGxvKTsKKwkJY2FzZSBETl9SVF9QS1RfTDFSVDoKKwkJY2FzZSBETl9SVF9QS1RfTDJSVDoKKwkJCXJldHVybiBORl9IT09LKE5GUFJPVE9fREVDTkVULCBORl9ETl9ST1VURSwKKwkJCQkgICAgICAgc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJCQkgICAgICAgZG5fcm91dGVfZGlzY2FyZCk7CisJCWNhc2UgRE5fUlRfUEtUX0VSVEg6CisJCQlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0RFQ05FVCwgTkZfRE5fSEVMTE8sCisJCQkJICAgICAgIHNrYiwgc2tiLT5kZXYsIE5VTEwsCisJCQkJICAgICAgIGRuX25laWdoX3JvdXRlcl9oZWxsbyk7CiAKLQkJCWNhc2UgRE5fUlRfUEtUX0VFREg6Ci0JCQkJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX0hFTExPLAotCQkJCQkgICAgICAgc2tiLCBza2ItPmRldiwgTlVMTCwKLQkJCQkJICAgICAgIGRuX25laWdoX2VuZG5vZGVfaGVsbG8pOworCQljYXNlIEROX1JUX1BLVF9FRURIOgorCQkJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX0hFTExPLAorCQkJCSAgICAgICBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCQkJCSAgICAgICBkbl9uZWlnaF9lbmRub2RlX2hlbGxvKTsKIAkJfQogCX0gZWxzZSB7CiAJCWlmIChkbi0+cGFybXMuc3RhdGUgIT0gRE5fREVWX1NfUlUpCkBAIC02OTEsMTEgKzY5NSwxMSBAQAogCiAJCXNrYl9wdWxsKHNrYiwgMSk7IC8qIFB1bGwgZmxhZ3MgKi8KIAotCQlzd2l0Y2goZmxhZ3MgJiBETl9SVF9QS1RfTVNLKSB7Ci0JCQljYXNlIEROX1JUX1BLVF9MT05HOgotCQkJCXJldHVybiBkbl9yb3V0ZV9yeF9sb25nKHNrYik7Ci0JCQljYXNlIEROX1JUX1BLVF9TSE9SVDoKLQkJCQlyZXR1cm4gZG5fcm91dGVfcnhfc2hvcnQoc2tiKTsKKwkJc3dpdGNoIChmbGFncyAmIEROX1JUX1BLVF9NU0spIHsKKwkJY2FzZSBETl9SVF9QS1RfTE9ORzoKKwkJCXJldHVybiBkbl9yb3V0ZV9yeF9sb25nKHNrYik7CisJCWNhc2UgRE5fUlRfUEtUX1NIT1JUOgorCQkJcmV0dXJuIGRuX3JvdXRlX3J4X3Nob3J0KHNrYik7CiAJCX0KIAl9CiAKQEAgLTcwNSw2ICs3MDksMTQgQEAKIAlyZXR1cm4gTkVUX1JYX0RST1A7CiB9CiAKK3N0YXRpYyBpbnQgZG5fdG9fbmVpZ2hfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOworCXN0cnVjdCBuZWlnaGJvdXIgKm4gPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOworCisJcmV0dXJuIG4tPm91dHB1dChuLCBza2IpOworfQorCiBzdGF0aWMgaW50IGRuX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKQEAgLTcxNSw3ICs3MjcsNyBAQAogCiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQlpZiAoKG5laWdoID0gZHN0LT5uZWlnaGJvdXIpID09IE5VTEwpCisJaWYgKChuZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCkpID09IE5VTEwpCiAJCWdvdG8gZXJyb3I7CiAKIAlza2ItPmRldiA9IGRldjsKQEAgLTczMyw3ICs3NDUsNyBAQAogCWNiLT5ob3BzID0gMDsKIAogCXJldHVybiBORl9IT09LKE5GUFJPVE9fREVDTkVULCBORl9ETl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgZGV2LAotCQkgICAgICAgbmVpZ2gtPm91dHB1dCk7CisJCSAgICAgICBkbl90b19uZWlnaF9vdXRwdXQpOwogCiBlcnJvcjoKIAlpZiAobmV0X3JhdGVsaW1pdCgpKQpAQCAtNzUwLDcgKzc2Miw2IEBACiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOwogCXN0cnVjdCBkbl9kZXYgKmRuX2RiID0gcmN1X2RlcmVmZXJlbmNlKGRzdC0+ZGV2LT5kbl9wdHIpOwogCXN0cnVjdCBkbl9yb3V0ZSAqcnQ7Ci0Jc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBkc3QtPm5laWdoYm91cjsKIAlpbnQgaGVhZGVyX2xlbjsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwpAQCAtNzgzLDcgKzc5NCw3IEBACiAJCWNiLT5ydF9mbGFncyB8PSBETl9SVF9GX0lFOwogCiAJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX0ZPUldBUkQsIHNrYiwgZGV2LCBza2ItPmRldiwKLQkJICAgICAgIG5laWdoLT5vdXRwdXQpOworCQkgICAgICAgZG5fdG9fbmVpZ2hfb3V0cHV0KTsKIAogZHJvcDoKIAlrZnJlZV9za2Ioc2tiKTsKQEAgLTgxOCw2ICs4MjksMTEgQEAKIAlyZXR1cm4gZHN0LT5kZXYtPm10dTsKIH0KIAorc3RhdGljIHN0cnVjdCBuZWlnaGJvdXIgKmRuX2RzdF9uZWlnaF9sb29rdXAoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBjb25zdCB2b2lkICpkYWRkcikKK3sKKwlyZXR1cm4gX19uZWlnaF9sb29rdXBfZXJybm8oJmRuX25laWdoX3RhYmxlLCBkYWRkciwgZHN0LT5kZXYpOworfQorCiBzdGF0aWMgaW50IGRuX3J0X3NldF9uZXh0X2hvcChzdHJ1Y3QgZG5fcm91dGUgKnJ0LCBzdHJ1Y3QgZG5fZmliX3JlcyAqcmVzKQogewogCXN0cnVjdCBkbl9maWJfaW5mbyAqZmkgPSByZXMtPmZpOwpAQCAtODMzLDExICs4NDksMTEgQEAKIAl9CiAJcnQtPnJ0X3R5cGUgPSByZXMtPnR5cGU7CiAKLQlpZiAoZGV2ICE9IE5VTEwgJiYgcnQtPmRzdC5uZWlnaGJvdXIgPT0gTlVMTCkgeworCWlmIChkZXYgIT0gTlVMTCAmJiBkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCkgPT0gTlVMTCkgewogCQluID0gX19uZWlnaF9sb29rdXBfZXJybm8oJmRuX25laWdoX3RhYmxlLCAmcnQtPnJ0X2dhdGV3YXksIGRldik7CiAJCWlmIChJU19FUlIobikpCiAJCQlyZXR1cm4gUFRSX0VSUihuKTsKLQkJcnQtPmRzdC5uZWlnaGJvdXIgPSBuOworCQlkc3Rfc2V0X25laWdoYm91cigmcnQtPmRzdCwgbik7CiAJfQogCiAJaWYgKGRzdF9tZXRyaWMoJnJ0LT5kc3QsIFJUQVhfTVRVKSA+IHJ0LT5kc3QuZGV2LT5tdHUpCkBAIC0xMTQ0LDcgKzExNjAsNyBAQAogCXJ0LT5ydF9kc3RfbWFwICAgID0gZmxkLmRhZGRyOwogCXJ0LT5ydF9zcmNfbWFwICAgID0gZmxkLnNhZGRyOwogCi0JcnQtPmRzdC5uZWlnaGJvdXIgPSBuZWlnaDsKKwlkc3Rfc2V0X25laWdoYm91cigmcnQtPmRzdCwgbmVpZ2gpOwogCW5laWdoID0gTlVMTDsKIAogCXJ0LT5kc3QubGFzdHVzZSA9IGppZmZpZXM7CkBAIC0xNDE2LDIzICsxNDMyLDIzIEBACiAJcnQtPmZsZC5mbG93aWRuX2lpZiAgPSBpbl9kZXYtPmlmaW5kZXg7CiAJcnQtPmZsZC5mbG93aWRuX21hcmsgPSBmbGQuZmxvd2lkbl9tYXJrOwogCi0JcnQtPmRzdC5uZWlnaGJvdXIgPSBuZWlnaDsKKwlkc3Rfc2V0X25laWdoYm91cigmcnQtPmRzdCwgbmVpZ2gpOwogCXJ0LT5kc3QubGFzdHVzZSA9IGppZmZpZXM7CiAJcnQtPmRzdC5vdXRwdXQgPSBkbl9ydF9idWc7Ci0Jc3dpdGNoKHJlcy50eXBlKSB7Ci0JCWNhc2UgUlROX1VOSUNBU1Q6Ci0JCQlydC0+ZHN0LmlucHV0ID0gZG5fZm9yd2FyZDsKLQkJCWJyZWFrOwotCQljYXNlIFJUTl9MT0NBTDoKLQkJCXJ0LT5kc3Qub3V0cHV0ID0gZG5fb3V0cHV0OwotCQkJcnQtPmRzdC5pbnB1dCA9IGRuX25zcF9yeDsKLQkJCXJ0LT5kc3QuZGV2ID0gaW5fZGV2OwotCQkJZmxhZ3MgfD0gUlRDRl9MT0NBTDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQljYXNlIFJUTl9VTlJFQUNIQUJMRToKLQkJY2FzZSBSVE5fQkxBQ0tIT0xFOgotCQkJcnQtPmRzdC5pbnB1dCA9IGRzdF9kaXNjYXJkOworCXN3aXRjaCAocmVzLnR5cGUpIHsKKwljYXNlIFJUTl9VTklDQVNUOgorCQlydC0+ZHN0LmlucHV0ID0gZG5fZm9yd2FyZDsKKwkJYnJlYWs7CisJY2FzZSBSVE5fTE9DQUw6CisJCXJ0LT5kc3Qub3V0cHV0ID0gZG5fb3V0cHV0OworCQlydC0+ZHN0LmlucHV0ID0gZG5fbnNwX3J4OworCQlydC0+ZHN0LmRldiA9IGluX2RldjsKKwkJZmxhZ3MgfD0gUlRDRl9MT0NBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwljYXNlIFJUTl9VTlJFQUNIQUJMRToKKwljYXNlIFJUTl9CTEFDS0hPTEU6CisJCXJ0LT5kc3QuaW5wdXQgPSBkc3RfZGlzY2FyZDsKIAl9CiAJcnQtPnJ0X2ZsYWdzID0gZmxhZ3M7CiAKQEAgLTE4NDEsMTAgKzE4NTcsMTEgQEAKIAlwcm9jX25ldF9mb3BzX2NyZWF0ZSgmaW5pdF9uZXQsICJkZWNuZXRfY2FjaGUiLCBTX0lSVUdPLCAmZG5fcnRfY2FjaGVfc2VxX2ZvcHMpOwogCiAjaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURVIKLQlydG5sX3JlZ2lzdGVyKFBGX0RFQ25ldCwgUlRNX0dFVFJPVVRFLCBkbl9jYWNoZV9nZXRyb3V0ZSwgZG5fZmliX2R1bXApOworCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fR0VUUk9VVEUsIGRuX2NhY2hlX2dldHJvdXRlLAorCQkgICAgICBkbl9maWJfZHVtcCwgTlVMTCk7CiAjZWxzZQogCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fR0VUUk9VVEUsIGRuX2NhY2hlX2dldHJvdXRlLAotCQkgICAgICBkbl9jYWNoZV9kdW1wKTsKKwkJICAgICAgZG5fY2FjaGVfZHVtcCwgTlVMTCk7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl90YWJsZS5jIGIvbmV0L2RlY25ldC9kbl90YWJsZS5jCmluZGV4IGJkMGE1MmQuLmNkMDM1NGUgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fdGFibGUuYworKysgYi9uZXQvZGVjbmV0L2RuX3RhYmxlLmMKQEAgLTE0NywxNyArMTQ3LDE4IEBACiAKIAlvbGRfZGl2aXNvciA9IGR6LT5kel9kaXZpc29yOwogCi0Jc3dpdGNoKG9sZF9kaXZpc29yKSB7Ci0JCWNhc2UgMTY6Ci0JCQluZXdfZGl2aXNvciA9IDI1NjsKLQkJCW5ld19oYXNobWFzayA9IDB4RkY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0RFQlVHICJERUNuZXQ6IGRuX3JlaGFzaF96b25lOiBCVUchICVkXG4iLCBvbGRfZGl2aXNvcik7Ci0JCWNhc2UgMjU2OgotCQkJbmV3X2Rpdmlzb3IgPSAxMDI0OwotCQkJbmV3X2hhc2htYXNrID0gMHgzRkY7Ci0JCQlicmVhazsKKwlzd2l0Y2ggKG9sZF9kaXZpc29yKSB7CisJY2FzZSAxNjoKKwkJbmV3X2Rpdmlzb3IgPSAyNTY7CisJCW5ld19oYXNobWFzayA9IDB4RkY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJERUNuZXQ6IGRuX3JlaGFzaF96b25lOiBCVUchICVkXG4iLAorCQkgICAgICAgb2xkX2Rpdmlzb3IpOworCWNhc2UgMjU2OgorCQluZXdfZGl2aXNvciA9IDEwMjQ7CisJCW5ld19oYXNobWFzayA9IDB4M0ZGOworCQlicmVhazsKIAl9CiAKIAlodCA9IGtjYWxsb2MobmV3X2Rpdmlzb3IsIHNpemVvZihzdHJ1Y3QgZG5fZmliX25vZGUqKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L25ldGZpbHRlci9kbl9ydG1zZy5jIGIvbmV0L2RlY25ldC9uZXRmaWx0ZXIvZG5fcnRtc2cuYwppbmRleCA2NGE3ZjM5Li42OTk3NWUwIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L25ldGZpbHRlci9kbl9ydG1zZy5jCisrKyBiL25ldC9kZWNuZXQvbmV0ZmlsdGVyL2RuX3J0bXNnLmMKQEAgLTY5LDE1ICs2OSwxNSBAQAogCWludCBncm91cCA9IDA7CiAJdW5zaWduZWQgY2hhciBmbGFncyA9ICpza2ItPmRhdGE7CiAKLQlzd2l0Y2goZmxhZ3MgJiBETl9SVF9DTlRMX01TSykgewotCQljYXNlIEROX1JUX1BLVF9MMVJUOgotCQkJZ3JvdXAgPSBETlJOR19OTEdSUF9MMTsKLQkJCWJyZWFrOwotCQljYXNlIEROX1JUX1BLVF9MMlJUOgotCQkJZ3JvdXAgPSBETlJOR19OTEdSUF9MMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuOworCXN3aXRjaCAoZmxhZ3MgJiBETl9SVF9DTlRMX01TSykgeworCWNhc2UgRE5fUlRfUEtUX0wxUlQ6CisJCWdyb3VwID0gRE5STkdfTkxHUlBfTDE7CisJCWJyZWFrOworCWNhc2UgRE5fUlRfUEtUX0wyUlQ6CisJCWdyb3VwID0gRE5STkdfTkxHUlBfTDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKIAl9CiAKIAlza2IyID0gZG5ybWdfYnVpbGRfbWVzc2FnZShza2IsICZzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9zeXNjdGxfbmV0X2RlY25ldC5jIGIvbmV0L2RlY25ldC9zeXNjdGxfbmV0X2RlY25ldC5jCmluZGV4IDI4ZjhiNWUuLjAyZTc1ZDEgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvc3lzY3RsX25ldF9kZWNuZXQuYworKysgYi9uZXQvZGVjbmV0L3N5c2N0bF9uZXRfZGVjbmV0LmMKQEAgLTY4LDE0ICs2OCwxNSBAQAogc3RhdGljIHZvaWQgc3RyaXBfaXQoY2hhciAqc3RyKQogewogCWZvcig7OykgewotCQlzd2l0Y2goKnN0cikgewotCQkJY2FzZSAnICc6Ci0JCQljYXNlICdcbic6Ci0JCQljYXNlICdccic6Ci0JCQljYXNlICc6JzoKLQkJCQkqc3RyID0gMDsKLQkJCWNhc2UgMDoKLQkJCQlyZXR1cm47CisJCXN3aXRjaCAoKnN0cikgeworCQljYXNlICcgJzoKKwkJY2FzZSAnXG4nOgorCQljYXNlICdccic6CisJCWNhc2UgJzonOgorCQkJKnN0ciA9IDA7CisJCQkvKiBGYWxsdGhyb3VnaCAqLworCQljYXNlIDA6CisJCQlyZXR1cm47CiAJCX0KIAkJc3RyKys7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9tdjg4ZTYxMzEuYyBiL25ldC9kc2EvbXY4OGU2MTMxLmMKaW5kZXggNDVmNzQxMS4uOWJkMTA2MSAxMDA2NDQKLS0tIGEvbmV0L2RzYS9tdjg4ZTYxMzEuYworKysgYi9uZXQvZHNhL212ODhlNjEzMS5jCkBAIC0xMTgsMTAgKzExOCwxNCBAQAogCVJFR19XUklURShSRUdfR0xPQkFMLCAweDFhLCAoZHNhX3Vwc3RyZWFtX3BvcnQoZHMpICogMHgxMTAwKSB8IDB4MDBmMCk7CiAKIAkvKgotCSAqIERpc2FibGUgY2FzY2FkZSBwb3J0IGZ1bmN0aW9uYWxpdHksIGFuZCBzZXQgdGhlIHN3aXRjaCdzCisJICogRGlzYWJsZSBjYXNjYWRlIHBvcnQgZnVuY3Rpb25hbGl0eSB1bmxlc3MgdGhpcyBkZXZpY2UKKwkgKiBpcyB1c2VkIGluIGEgY2FzY2FkZSBjb25maWd1cmF0aW9uLCBhbmQgc2V0IHRoZSBzd2l0Y2gncwogCSAqIERTQSBkZXZpY2UgbnVtYmVyLgogCSAqLwotCVJFR19XUklURShSRUdfR0xPQkFMLCAweDFjLCAweGUwMDAgfCAoZHMtPmluZGV4ICYgMHgxZikpOworCWlmIChkcy0+ZHN0LT5wZC0+bnJfY2hpcHMgPiAxKQorCQlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgxYywgMHhmMDAwIHwgKGRzLT5pbmRleCAmIDB4MWYpKTsKKwllbHNlCisJCVJFR19XUklURShSRUdfR0xPQkFMLCAweDFjLCAweGUwMDAgfCAoZHMtPmluZGV4ICYgMHgxZikpOwogCiAJLyoKIAkgKiBTZW5kIGFsbCBmcmFtZXMgd2l0aCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgbWF0Y2hpbmcKZGlmZiAtLWdpdCBhL25ldC9lY29uZXQvYWZfZWNvbmV0LmMgYi9uZXQvZWNvbmV0L2FmX2Vjb25ldC5jCmluZGV4IGExZDlmMzcuLjFjMWYyNmMgMTAwNjQ0Ci0tLSBhL25ldC9lY29uZXQvYWZfZWNvbmV0LmMKKysrIGIvbmV0L2Vjb25ldC9hZl9lY29uZXQuYwpAQCAtOSw2ICs5LDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTQ0LDcgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBlY29uZXRfb3BzOwpAQCAtNjMsOSArNjUsNyBAQAogc3RhdGljIHN0cnVjdCBzb2NrZXQgKnVkcHNvY2s7CiAjZGVmaW5lIEFVTl9QT1JUCTB4ODAwMAogCi0KLXN0cnVjdCBhdW5oZHIKLXsKK3N0cnVjdCBhdW5oZHIgewogCXVuc2lnbmVkIGNoYXIgY29kZTsJCS8qIEFVTiBtYWdpYyBwcm90b2NvbCBieXRlICovCiAJdW5zaWduZWQgY2hhciBwb3J0OwogCXVuc2lnbmVkIGNoYXIgY2I7CkBAIC04Miw4ICs4Miw3IEBACiAjZW5kaWYJCS8qIENPTkZJR19FQ09ORVRfQVVOVURQICovCiAKIC8qIFBlci1wYWNrZXQgaW5mb3JtYXRpb24gKi8KLXN0cnVjdCBlY19jYgoteworc3RydWN0IGVjX2NiIHsKIAlzdHJ1Y3Qgc29ja2FkZHJfZWMgc2VjOwogCXVuc2lnbmVkIGxvbmcgY29va2llOwkJLyogU3VwcGxpZWQgYnkgdXNlci4gKi8KICNpZmRlZiBDT05GSUdfRUNPTkVUX0FVTlVEUApAQCAtMTM3LDcgKzEzNiw3IEBACiAJICoJYnV0IHRoZW4gaXQgd2lsbCBibG9jay4KIAkgKi8KIAotCXNrYj1za2JfcmVjdl9kYXRhZ3JhbShzayxmbGFncyxmbGFncyZNU0dfRE9OVFdBSVQsJmVycik7CisJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzLCBmbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CiAKIAkvKgogCSAqCUFuIGVycm9yIG9jY3VycmVkIHNvIHJldHVybiBpdC4gQmVjYXVzZSBza2JfcmVjdl9kYXRhZ3JhbSgpCkBAIC0xNDUsNyArMTQ0LDcgQEAKIAkgKglyZXRyaWVzLgogCSAqLwogCi0JaWYoc2tiPT1OVUxMKQorCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKIAkvKgpAQCAtMTU0LDEwICsxNTMsOSBAQAogCSAqLwogCiAJY29waWVkID0gc2tiLT5sZW47Ci0JaWYgKGNvcGllZCA+IGxlbikKLQl7Ci0JCWNvcGllZD1sZW47Ci0JCW1zZy0+bXNnX2ZsYWdzfD1NU0dfVFJVTkM7CisJaWYgKGNvcGllZCA+IGxlbikgeworCQljb3BpZWQgPSBsZW47CisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKIAl9CiAKIAkvKiBXZSBjYW4ndCB1c2Ugc2tiX2NvcHlfZGF0YWdyYW0gaGVyZSAqLwpAQCAtMTg2LDcgKzE4NCw4IEBACiAgKglCaW5kIGFuIEVjb25ldCBzb2NrZXQuCiAgKi8KIAotc3RhdGljIGludCBlY29uZXRfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4pCitzdGF0aWMgaW50IGVjb25ldF9iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCisJCSAgICAgICBpbnQgYWRkcl9sZW4pCiB7CiAJc3RydWN0IHNvY2thZGRyX2VjICpzZWMgPSAoc3RydWN0IHNvY2thZGRyX2VjICopdWFkZHI7CiAJc3RydWN0IHNvY2sgKnNrOwpAQCAtMjI2LDkgKzIyNSw4IEBACiAJc3RydWN0IGVjX2NiICplYjsKIAlzdHJ1Y3Qgc29ja2FkZHJfZWMgKnNlYzsKIAotCWlmIChza2IgPT0gTlVMTCkKLQl7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJlYzogbWVtb3J5IHNxdWVlemUsIHRyYW5zbWl0IHJlc3VsdCBkcm9wcGVkLlxuIik7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByX2RlYnVnKCJlY29uZXQ6IG1lbW9yeSBzcXVlZXplLCB0cmFuc21pdCByZXN1bHQgZHJvcHBlZFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI2NSw3ICsyNjMsNyBAQAogc3RhdGljIGludCBlY29uZXRfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCQkgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKLQlzdHJ1Y3Qgc29ja2FkZHJfZWMgKnNhZGRyPShzdHJ1Y3Qgc29ja2FkZHJfZWMgKiltc2ctPm1zZ19uYW1lOworCXN0cnVjdCBzb2NrYWRkcl9lYyAqc2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2VjICopbXNnLT5tc2dfbmFtZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBlY19hZGRyIGFkZHI7CiAJaW50IGVycjsKQEAgLTI5OCwxNCArMjk2LDE0IEBACiAKIAltdXRleF9sb2NrKCZlY29uZXRfbXV0ZXgpOwogCi0gICAgICAgIGlmIChzYWRkciA9PSBOVUxMIHx8IG1zZy0+bXNnX25hbWVsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2VjKSkgewotICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmZWNvbmV0X211dGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBhZGRyLnN0YXRpb24gPSBzYWRkci0+YWRkci5zdGF0aW9uOwotICAgICAgICBhZGRyLm5ldCA9IHNhZGRyLT5hZGRyLm5ldDsKLSAgICAgICAgcG9ydCA9IHNhZGRyLT5wb3J0OwotICAgICAgICBjYiA9IHNhZGRyLT5jYjsKKwlpZiAoc2FkZHIgPT0gTlVMTCB8fCBtc2ctPm1zZ19uYW1lbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9lYykpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlY29uZXRfbXV0ZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYWRkci5zdGF0aW9uID0gc2FkZHItPmFkZHIuc3RhdGlvbjsKKwlhZGRyLm5ldCA9IHNhZGRyLT5hZGRyLm5ldDsKKwlwb3J0ID0gc2FkZHItPnBvcnQ7CisJY2IgPSBzYWRkci0+Y2I7CiAKIAkvKiBMb29rIGZvciBhIGRldmljZSB3aXRoIHRoZSByaWdodCBuZXR3b3JrIG51bWJlci4gKi8KIAlkZXYgPSBuZXQyZGV2X21hcFthZGRyLm5ldF07CkBAIC0zMzMsOSArMzMxLDkgQEAKIAogCQlkZXZfaG9sZChkZXYpOwogCi0JCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIGxlbitMTF9BTExPQ0FURURfU1BBQ0UoZGV2KSwKKwkJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgbGVuICsgTExfQUxMT0NBVEVEX1NQQUNFKGRldiksCiAJCQkJCSAgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOwotCQlpZiAoc2tiPT1OVUxMKQorCQlpZiAoc2tiID09IE5VTEwpCiAJCQlnb3RvIG91dF91bmxvY2s7CiAKIAkJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKQEAgLTM1NSw3ICszNTMsNyBAQAogCQkJc3RydWN0IGVjX2ZyYW1laGRyICpmaDsKIAkJCS8qIFBva2UgaW4gb3VyIGNvbnRyb2wgYnl0ZSBhbmQKIAkJCSAgIHBvcnQgbnVtYmVyLiAgSGFjaywgaGFjay4gICovCi0JCQlmaCA9IChzdHJ1Y3QgZWNfZnJhbWVoZHIgKikoc2tiLT5kYXRhKTsKKwkJCWZoID0gKHN0cnVjdCBlY19mcmFtZWhkciAqKXNrYi0+ZGF0YTsKIAkJCWZoLT5jYiA9IGNiOwogCQkJZmgtPnBvcnQgPSBwb3J0OwogCQkJaWYgKHNvY2stPnR5cGUgIT0gU09DS19ER1JBTSkgewpAQCAtMzY1LDcgKzM2Myw3IEBACiAJCX0KIAogCQkvKiBDb3B5IHRoZSBkYXRhLiBSZXR1cm5zIC1FRkFVTFQgb24gZXJyb3IgKi8KLQkJZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYixsZW4pLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJCWVyciA9IG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKIAkJc2tiLT5wcm90b2NvbCA9IHByb3RvOwogCQlza2ItPmRldiA9IGRldjsKIAkJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKQEAgLTM4NSw5ICszODMsOSBAQAogCQltdXRleF91bmxvY2soJmVjb25ldF9tdXRleCk7CiAJCXJldHVybiBsZW47CiAKLQlvdXRfZnJlZToKK291dF9mcmVlOgogCQlrZnJlZV9za2Ioc2tiKTsKLQlvdXRfdW5sb2NrOgorb3V0X3VubG9jazoKIAkJaWYgKGRldikKIAkJCWRldl9wdXQoZGV2KTsKICNlbHNlCkBAIC00NTgsMTUgKzQ1NiwxNCBAQAogCQlnb3RvIGVycm9yX2ZyZWVfYnVmOwogCiAJLyogR2V0IGEgc2tidWZmIChubyBkYXRhLCBqdXN0IGhvbGRzIG91ciBjYiBpbmZvcm1hdGlvbikgKi8KLQlpZiAoKHNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIDAsCi0JCQkJICAgICAgIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULAotCQkJCSAgICAgICAmZXJyKSkgPT0gTlVMTCkKKwlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCAwLCBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CisJaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIGVycm9yX2ZyZWVfYnVmOwogCiAJZWIgPSAoc3RydWN0IGVjX2NiICopJnNrYi0+Y2I7CiAKIAllYi0+Y29va2llID0gc2FkZHItPmNvb2tpZTsKLQllYi0+dGltZW91dCA9ICg1KkhaKTsKKwllYi0+dGltZW91dCA9IDUgKiBIWjsKIAllYi0+c3RhcnQgPSBqaWZmaWVzOwogCWFoLmhhbmRsZSA9IGF1bl9zZXE7CiAJZWItPnNlcSA9IChhdW5fc2VxKyspOwpAQCAtNDgwLDkgKzQ3NywxMCBAQAogCXVkcG1zZy5tc2dfaW92bGVuID0gMjsKIAl1ZHBtc2cubXNnX2NvbnRyb2wgPSBOVUxMOwogCXVkcG1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JdWRwbXNnLm1zZ19mbGFncz0wOworCXVkcG1zZy5tc2dfZmxhZ3MgPSAwOwogCi0Jb2xkZnMgPSBnZXRfZnMoKTsgc2V0X2ZzKEtFUk5FTF9EUyk7CS8qIE1vcmUgcHJpdnMgOi0pICovCisJb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsJCS8qIE1vcmUgcHJpdnMgOi0pICovCiAJZXJyID0gc29ja19zZW5kbXNnKHVkcHNvY2ssICZ1ZHBtc2csIHNpemUpOwogCXNldF9mcyhvbGRmcyk7CiAKQEAgLTUzMCw3ICs1MjgsNyBAQAogCiBzdGF0aWMgdm9pZCBlY29uZXRfZGVzdHJveV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IHNvY2sgKnNrPShzdHJ1Y3Qgc29jayAqKWRhdGE7CisJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopZGF0YTsKIAogCWlmICghc2tfaGFzX2FsbG9jYXRpb25zKHNrKSkgewogCQlza19mcmVlKHNrKTsKQEAgLTUzOSw3ICs1MzcsNyBAQAogCiAJc2stPnNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTAgKiBIWjsKIAlhZGRfdGltZXIoJnNrLT5za190aW1lcik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgImVjb25ldCBzb2NrZXQgZGVzdHJveSBkZWxheWVkXG4iKTsKKwlwcl9kZWJ1ZygiZWNvbmV0OiBzb2NrZXQgZGVzdHJveSBkZWxheWVkXG4iKTsKIH0KIAogLyoKQEAgLTY1MSw3ICs2NDksOCBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmaWZyLCBhcmcsIHNpemVvZihzdHJ1Y3QgaWZyZXEpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAoKGRldiA9IGRldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIGlmci5pZnJfbmFtZSkpID09IE5VTEwpCisJZGV2ID0gZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgaWZyLmlmcl9uYW1lKTsKKwlpZiAoZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJc2VjID0gKHN0cnVjdCBzb2NrYWRkcl9lYyAqKSZpZnIuaWZyX2FkZHI7CkBAIC03MTUsMjggKzcxNCwyNiBAQAogICoJSGFuZGxlIGdlbmVyaWMgaW9jdGxzCiAgKi8KIAotc3RhdGljIGludCBlY29uZXRfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IGVjb25ldF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKLQlzd2l0Y2goY21kKSB7Ci0JCWNhc2UgU0lPQ0dTVEFNUDoKLQkJCXJldHVybiBzb2NrX2dldF90aW1lc3RhbXAoc2ssIGFyZ3ApOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR1NUQU1QOgorCQlyZXR1cm4gc29ja19nZXRfdGltZXN0YW1wKHNrLCBhcmdwKTsKIAotCQljYXNlIFNJT0NHU1RBTVBOUzoKLQkJCXJldHVybiBzb2NrX2dldF90aW1lc3RhbXBucyhzaywgYXJncCk7CisJY2FzZSBTSU9DR1NUQU1QTlM6CisJCXJldHVybiBzb2NrX2dldF90aW1lc3RhbXBucyhzaywgYXJncCk7CiAKLQkJY2FzZSBTSU9DU0lGQUREUjoKLQkJY2FzZSBTSU9DR0lGQUREUjoKLQkJCXJldHVybiBlY19kZXZfaW9jdGwoc29jaywgY21kLCBhcmdwKTsKLQkJCWJyZWFrOworCWNhc2UgU0lPQ1NJRkFERFI6CisJY2FzZSBTSU9DR0lGQUREUjoKKwkJcmV0dXJuIGVjX2Rldl9pb2N0bChzb2NrLCBjbWQsIGFyZ3ApOwogCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KLQkvKk5PVFJFQUNIRUQqLwotCXJldHVybiAwOworCisJcmV0dXJuIC1FTk9JT0NUTENNRDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGVjb25ldF9mYW1pbHlfb3BzID0gewpAQCAtODM2LDcgKzgzMyw3IEBACiAJdWRwbXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHNpbik7CiAJdWRwbXNnLm1zZ19jb250cm9sID0gTlVMTDsKIAl1ZHBtc2cubXNnX2NvbnRyb2xsZW4gPSAwOwotCXVkcG1zZy5tc2dfZmxhZ3M9MDsKKwl1ZHBtc2cubXNnX2ZsYWdzID0gMDsKIAogCWtlcm5lbF9zZW5kbXNnKHVkcHNvY2ssICZ1ZHBtc2csICZpb3YsIDEsIHNpemVvZihhaCkpOwogfQpAQCAtODU5LDI2ICs4NTYsMjUgQEAKIAlpZiAoZHN0KQogCQllZGV2ID0gZHN0LT5kZXYtPmVjX3B0cjsKIAotCWlmICghIGVkZXYpCisJaWYgKCFlZGV2KQogCQlnb3RvIGJhZDsKIAotCWlmICgoc2sgPSBlY19saXN0ZW5pbmdfc29ja2V0KGFoLT5wb3J0LCBzdG4sIGVkZXYtPm5ldCkpID09IE5VTEwpCisJc2sgPSBlY19saXN0ZW5pbmdfc29ja2V0KGFoLT5wb3J0LCBzdG4sIGVkZXYtPm5ldCk7CisJaWYgKHNrID09IE5VTEwpCiAJCWdvdG8gYmFkOwkJLyogTm9ib2R5IHdhbnRzIGl0ICovCiAKIAluZXdza2IgPSBhbGxvY19za2IoKGxlbiAtIHNpemVvZihzdHJ1Y3QgYXVuaGRyKSArIDE1KSAmIH4xNSwKIAkJCSAgIEdGUF9BVE9NSUMpOwotCWlmIChuZXdza2IgPT0gTlVMTCkKLQl7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJBVU46IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iKTsKKwlpZiAobmV3c2tiID09IE5VTEwpIHsKKwkJcHJfZGVidWcoIkFVTjogbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldFxuIik7CiAJCS8qIFNlbmQgbmFjayBhbmQgaG9wZSBzZW5kZXIgdHJpZXMgYWdhaW4gKi8KIAkJZ290byBiYWQ7CiAJfQogCi0JbWVtY3B5KHNrYl9wdXQobmV3c2tiLCBsZW4gLSBzaXplb2Yoc3RydWN0IGF1bmhkcikpLCAodm9pZCAqKShhaCsxKSwKKwltZW1jcHkoc2tiX3B1dChuZXdza2IsIGxlbiAtIHNpemVvZihzdHJ1Y3QgYXVuaGRyKSksICh2b2lkICopKGFoICsgMSksCiAJICAgICAgIGxlbiAtIHNpemVvZihzdHJ1Y3QgYXVuaGRyKSk7CiAKLQlpZiAoZWNfcXVldWVfcGFja2V0KHNrLCBuZXdza2IsIHN0biwgZWRldi0+bmV0LCBhaC0+Y2IsIGFoLT5wb3J0KSkKLQl7CisJaWYgKGVjX3F1ZXVlX3BhY2tldChzaywgbmV3c2tiLCBzdG4sIGVkZXYtPm5ldCwgYWgtPmNiLCBhaC0+cG9ydCkpIHsKIAkJLyogU29ja2V0IGlzIGJhbmtydXB0LiAqLwogCQlrZnJlZV9za2IobmV3c2tiKTsKIAkJZ290byBiYWQ7CkBAIC05MTQsNyArOTEwLDcgQEAKIAkJCWdvdG8gZm91bmRpdDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVuX3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiQVVOOiB1bmtub3duIHNlcXVlbmNlICVsZFxuIiwgc2VxKTsKKwlwcl9kZWJ1ZygiQVVOOiB1bmtub3duIHNlcXVlbmNlICVsZFxuIiwgc2VxKTsKIAlyZXR1cm47CiAKIGZvdW5kaXQ6CkBAIC05MzksMTggKzkzNSwxNyBAQAogCiAJd2hpbGUgKChza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgMCwgMSwgJmVycikpID09IE5VTEwpIHsKIAkJaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkFVTjogbm8gZGF0YSBhdmFpbGFibGU/ISIpOworCQkJcHJfZXJyKCJBVU46IG5vIGRhdGEgYXZhaWxhYmxlPyFcbiIpOwogCQkJcmV0dXJuOwogCQl9Ci0JCXByaW50ayhLRVJOX0RFQlVHICJBVU46IHJlY3Zmcm9tKCkgZXJyb3IgJWRcbiIsIC1lcnIpOworCQlwcl9kZWJ1ZygiQVVOOiByZWN2ZnJvbSgpIGVycm9yICVkXG4iLCAtZXJyKTsKIAl9CiAKIAlkYXRhID0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKIAlhaCA9IChzdHJ1Y3QgYXVuaGRyICopZGF0YTsKIAlsZW4gPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKIAotCXN3aXRjaCAoYWgtPmNvZGUpCi0JeworCXN3aXRjaCAoYWgtPmNvZGUpIHsKIAljYXNlIDI6CiAJCWF1bl9pbmNvbWluZyhza2IsIGFoLCBsZW4pOwogCQlicmVhazsKQEAgLTk2MSw3ICs5NTYsNyBAQAogCQlhdW5fdHhfYWNrKGFoLT5oYW5kbGUsIEVDVFlQRV9UUkFOU01JVF9OT1RfTElTVEVOSU5HKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgInVua25vd24gQVVOIHBhY2tldCAodHlwZSAlZClcbiIsIGRhdGFbMF0pOworCQlwcl9kZWJ1ZygiQVVOOiB1bmtub3duIHBhY2tldCB0eXBlOiAlZFxuIiwgZGF0YVswXSk7CiAJfQogCiAJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CkBAIC05OTEsNyArOTg2LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVuX3F1ZXVlX2xvY2ssIGZsYWdzKTsKIAotCW1vZF90aW1lcigmYWJfY2xlYW51cF90aW1lciwgamlmZmllcyArIChIWioyKSk7CisJbW9kX3RpbWVyKCZhYl9jbGVhbnVwX3RpbWVyLCBqaWZmaWVzICsgKEhaICogMikpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhdW5fdWRwX2luaXRpYWxpc2Uodm9pZCkKQEAgLTEwMDEsNyArOTk2LDcgQEAKIAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmF1bl9xdWV1ZSk7CiAJc2V0dXBfdGltZXIoJmFiX2NsZWFudXBfdGltZXIsIGFiX2NsZWFudXAsIDApOwotCWFiX2NsZWFudXBfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFoqMik7CisJYWJfY2xlYW51cF90aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAqIDIpOwogCWFkZF90aW1lcigmYWJfY2xlYW51cF90aW1lcik7CiAKIAltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOwpAQCAtMTAwOSw5ICsxMDA0LDkgQEAKIAogCS8qIFdlIGNhbiBjb3VudCBvdXJzZWx2ZXMgbHVja3kgQWNvcm4gbWFjaGluZXMgYXJlIHRvbyBkaW0gdG8KIAkgICBzcGVhayBJUHY2LiA6LSkgKi8KLQlpZiAoKGVycm9yID0gc29ja19jcmVhdGVfa2VybihQRl9JTkVULCBTT0NLX0RHUkFNLCAwLCAmdWRwc29jaykpIDwgMCkKLQl7Ci0JCXByaW50aygiQVVOOiBzb2NrZXQgZXJyb3IgJWRcbiIsIC1lcnJvcik7CisJZXJyb3IgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIFNPQ0tfREdSQU0sIDAsICZ1ZHBzb2NrKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCXByX2VycigiQVVOOiBzb2NrZXQgZXJyb3IgJWRcbiIsIC1lcnJvcik7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKQEAgLTEwMjAsMTAgKzEwMTUsOSBAQAogCQkJCQkJICAgIGZyb20gaW50ZXJydXB0cyAqLwogCiAJZXJyb3IgPSB1ZHBzb2NrLT5vcHMtPmJpbmQodWRwc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sCi0JCQkJc2l6ZW9mKHNpbikpOwotCWlmIChlcnJvciA8IDApCi0JewotCQlwcmludGsoIkFVTjogYmluZCBlcnJvciAlZFxuIiwgLWVycm9yKTsKKwkJCQkgICBzaXplb2Yoc2luKSk7CisJaWYgKGVycm9yIDwgMCkgeworCQlwcl9lcnIoIkFVTjogYmluZCBlcnJvciAlZFxuIiwgLWVycm9yKTsKIAkJZ290byByZWxlYXNlOwogCX0KIApAQCAtMTA0NCw3ICsxMDM4LDggQEAKICAqCVJlY2VpdmUgYW4gRWNvbmV0IGZyYW1lIGZyb20gYSBkZXZpY2UuCiAgKi8KIAotc3RhdGljIGludCBlY29uZXRfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQsIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKK3N0YXRpYyBpbnQgZWNvbmV0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCiB7CiAJc3RydWN0IGVjX2ZyYW1laGRyICpoZHI7CiAJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKQEAgLTEwNTksMTMgKzEwNTQsMTQgQEAKIAlpZiAoIWVkZXYpCiAJCWdvdG8gZHJvcDsKIAotCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQogCQlyZXR1cm4gTkVUX1JYX0RST1A7CiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGVjX2ZyYW1laGRyKSkpCiAJCWdvdG8gZHJvcDsKIAotCWhkciA9IChzdHJ1Y3QgZWNfZnJhbWVoZHIgKikgc2tiLT5kYXRhOworCWhkciA9IChzdHJ1Y3QgZWNfZnJhbWVoZHIgKilza2ItPmRhdGE7CiAKIAkvKiBGaXJzdCBjaGVjayBmb3IgZW5jYXBzdWxhdGVkIElQICovCiAJaWYgKGhkci0+cG9ydCA9PSBFQ19QT1JUX0lQKSB7CkBAIC0xMDkzLDggKzEwODksOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGVjb25ldF9wYWNrZXRfdHlwZSBfX3JlYWRfbW9zdGx5ID0gewotCS50eXBlID0JCWNwdV90b19iZTE2KEVUSF9QX0VDT05FVCksCi0JLmZ1bmMgPQkJZWNvbmV0X3JjdiwKKwkudHlwZSA9CWNwdV90b19iZTE2KEVUSF9QX0VDT05FVCksCisJLmZ1bmMgPQllY29uZXRfcmN2LAogfTsKIAogc3RhdGljIHZvaWQgZWNvbmV0X2h3X2luaXRpYWxpc2Uodm9pZCkKQEAgLTExMDQsOSArMTEwMCwxMCBAQAogCiAjZW5kaWYKIAotc3RhdGljIGludCBlY29uZXRfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIG1zZywgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgZWNvbmV0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBtc2csCisJCQkgICB2b2lkICpkYXRhKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwogCXN0cnVjdCBlY19kZXZpY2UgKmVkZXY7CiAKIAlpZiAoIW5ldF9lcShkZXZfbmV0KGRldiksICZpbml0X25ldCkpCkBAIC0xMTE2LDggKzExMTMsNyBAQAogCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CiAJCS8qIEEgZGV2aWNlIGhhcyBnb25lIGRvd24gLSBraWxsIGFueSBkYXRhIHdlIGhvbGQgZm9yIGl0LiAqLwogCQllZGV2ID0gZGV2LT5lY19wdHI7Ci0JCWlmIChlZGV2KQotCQl7CisJCWlmIChlZGV2KSB7CiAJCQlpZiAobmV0MmRldl9tYXBbMF0gPT0gZGV2KQogCQkJCW5ldDJkZXZfbWFwWzBdID0gTlVMTDsKIAkJCW5ldDJkZXZfbWFwW2VkZXYtPm5ldF0gPSBOVUxMOwpAQCAtMTEzMSw3ICsxMTI3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBlY29uZXRfbmV0ZGV2X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID1lY29uZXRfbm90aWZpZXIsCisJLm5vdGlmaWVyX2NhbGwgPSBlY29uZXRfbm90aWZpZXIsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZWNvbmV0X3Byb3RvX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9ldGhlcm5ldC9ldGguYyBiL25ldC9ldGhlcm5ldC9ldGguYwppbmRleCA0NGQyYjQyLi41Y2ZmYjYzIDEwMDY0NAotLS0gYS9uZXQvZXRoZXJuZXQvZXRoLmMKKysrIGIvbmV0L2V0aGVybmV0L2V0aC5jCkBAIC0yMzMsOSArMjMzLDggQEAKICAqIEBoaDogZGVzdGluYXRpb24gY2FjaGUgZW50cnkKICAqIENyZWF0ZSBhbiBFdGhlcm5ldCBoZWFkZXIgdGVtcGxhdGUgZnJvbSB0aGUgbmVpZ2hib3VyLgogICovCi1pbnQgZXRoX2hlYWRlcl9jYWNoZShjb25zdCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IGhoX2NhY2hlICpoaCkKK2ludCBldGhfaGVhZGVyX2NhY2hlKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3QgaGhfY2FjaGUgKmhoLCBfX2JlMTYgdHlwZSkKIHsKLQlfX2JlMTYgdHlwZSA9IGhoLT5oaF90eXBlOwogCXN0cnVjdCBldGhoZHIgKmV0aDsKIAljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKIApkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxNTQvYWZfaWVlZTgwMjE1NC5jIGIvbmV0L2llZWU4MDIxNTQvYWZfaWVlZTgwMjE1NC5jCmluZGV4IDZkZjZlY2YuLjQwZTYwNmYgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTU0L2FmX2llZWU4MDIxNTQuYworKysgYi9uZXQvaWVlZTgwMjE1NC9hZl9pZWVlODAyMTU0LmMKQEAgLTMwMiw3ICszMDIsNyBAQAogCXN0cnVjdCBwYWNrZXRfdHlwZSAqcHQsIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKIHsKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWdvdG8gZHJvcDsKIAlwcl9kZWJ1ZygiZ290IGZyYW1lLCB0eXBlICVkLCBkZXYgJXBcbiIsIGRldi0+dHlwZSwgZGV2KTsKICNpZmRlZiBERUJVRwogCXByaW50X2hleF9kdW1wX2J5dGVzKCJpZWVlODAyMTU0X3JjdiAiLCBEVU1QX1BSRUZJWF9OT05FLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L2RncmFtLmMgYi9uZXQvaWVlZTgwMjE1NC9kZ3JhbS5jCmluZGV4IDFhMzMzNGMuLmZhZWNmNjQgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTU0L2RncmFtLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvZGdyYW0uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBaaWdCZWUgc29ja2V0IGludGVyZmFjZQorICogSUVFRSA4MDIuMTUuNCBkZ3JhbSBzb2NrZXQgaW50ZXJmYWNlCiAgKgogICogQ29weXJpZ2h0IDIwMDcsIDIwMDggU2llbWVucyBBRwogICoKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L25sLXBoeS5jIGIvbmV0L2llZWU4MDIxNTQvbmwtcGh5LmMKaW5kZXggZWQwZWFiMy4uYzY0YTM4ZCAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvbmwtcGh5LmMKKysrIGIvbmV0L2llZWU4MDIxNTQvbmwtcGh5LmMKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvd3Bhbi1waHkuaD4KQEAgLTQ0LDcgKzQ1LDcgQEAKIAlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKIAogCWlmICghYnVmKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgMCwgc2VxLCAmbmw4MDIxNTRfZmFtaWx5LCBmbGFncywKIAkJSUVFRTgwMjE1NF9MSVNUX1BIWSk7CkBAIC02NSw2ICs2Niw3IEBACiAJCQkJcGFnZXMgKiBzaXplb2YodWludDMyX3QpLCBidWYpOwogCiAJbXV0ZXhfdW5sb2NrKCZwaHktPnBpYl9sb2NrKTsKKwlrZnJlZShidWYpOwogCXJldHVybiBnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIG5sYV9wdXRfZmFpbHVyZToKQEAgLTIxMiwxMiArMjE0LDM3IEBACiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCX0KIAorCWlmIChpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfSFdfQUREUl0gJiYKKwkgICAgbmxhX2xlbihpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfSFdfQUREUl0pICE9CisJCQlJRUVFODAyMTU0X0FERFJfTEVOKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQorCiAJZGV2ID0gcGh5LT5hZGRfaWZhY2UocGh5LCBkZXZuYW1lKTsKIAlpZiAoSVNfRVJSKGRldikpIHsKIAkJcmMgPSBQVFJfRVJSKGRldik7CiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCX0KIAorCWlmIChpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfSFdfQUREUl0pIHsKKwkJc3RydWN0IHNvY2thZGRyIGFkZHI7CisKKwkJYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfSUVFRTgwMjE1NDsKKwkJbmxhX21lbWNweSgmYWRkci5zYV9kYXRhLCBpbmZvLT5hdHRyc1tJRUVFODAyMTU0X0FUVFJfSFdfQUREUl0sCisJCQkJSUVFRTgwMjE1NF9BRERSX0xFTik7CisKKwkJLyoKKwkJICogc3RyYW5nZWx5IGVub3VnaCwgc29tZSBjYWxsYmFja3MgKGluZXRkZXZfZXZlbnQpIGZyb20KKwkJICogZGV2X3NldF9tYWNfYWRkcmVzcyByZXF1aXJlIFJUTkxfTE9DSworCQkgKi8KKwkJcnRubF9sb2NrKCk7CisJCXJjID0gZGV2X3NldF9tYWNfYWRkcmVzcyhkZXYsICZhZGRyKTsKKwkJcnRubF91bmxvY2soKTsKKwkJaWYgKHJjKQorCQkJZ290byBkZXZfdW5yZWdpc3RlcjsKKwl9CisKIAlOTEFfUFVUX1NUUklORyhtc2csIElFRUU4MDIxNTRfQVRUUl9QSFlfTkFNRSwgd3Bhbl9waHlfbmFtZShwaHkpKTsKIAlOTEFfUFVUX1NUUklORyhtc2csIElFRUU4MDIxNTRfQVRUUl9ERVZfTkFNRSwgZGV2LT5uYW1lKTsKIApAQCAtMjI3LDYgKzI1NCwxMSBAQAogCiAJcmV0dXJuIGllZWU4MDIxNTRfbmxfcmVwbHkobXNnLCBpbmZvKTsKIAorZGV2X3VucmVnaXN0ZXI6CisJcnRubF9sb2NrKCk7IC8qIGRlbF9pZmFjZSBtdXN0IGJlIGNhbGxlZCB3aXRoIFJUTkwgbG9jayAqLworCXBoeS0+ZGVsX2lmYWNlKHBoeSwgZGV2KTsKKwlkZXZfcHV0KGRldik7CisJcnRubF91bmxvY2soKTsKIG5sYV9wdXRfZmFpbHVyZToKIAlubG1zZ19mcmVlKG1zZyk7CiBvdXRfZGV2OgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYWZfaW5ldC5jIGIvbmV0L2lwdjQvYWZfaW5ldC5jCmluZGV4IDljMTkyNjAuLjFiNzQ1ZDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2FmX2luZXQuYworKysgYi9uZXQvaXB2NC9hZl9pbmV0LmMKQEAgLTQ2NSw4ICs0NjUsMTAgQEAKIAlpZiAoYWRkcl9sZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoYWRkci0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKQorCWlmIChhZGRyLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJZXJyID0gLUVBRk5PU1VQUE9SVDsKIAkJZ290byBvdXQ7CisJfQogCiAJY2hrX2FkZHJfcmV0ID0gaW5ldF9hZGRyX3R5cGUoc29ja19uZXQoc2spLCBhZGRyLT5zaW5fYWRkci5zX2FkZHIpOwogCkBAIC02NzYsNiArNjc4LDcgQEAKIAogCWxvY2tfc29jayhzazIpOwogCisJc29ja19ycHNfcmVjb3JkX2Zsb3coc2syKTsKIAlXQVJOX09OKCEoKDEgPDwgc2syLT5za19zdGF0ZSkgJgogCQkgIChUQ1BGX0VTVEFCTElTSEVEIHwgVENQRl9DTE9TRV9XQUlUIHwgVENQRl9DTE9TRSkpKTsKIApAQCAtMTQzNywxMSArMTQ0MCwxMSBAQAogdW5zaWduZWQgbG9uZyBzbm1wX2ZvbGRfZmllbGQodm9pZCBfX3BlcmNwdSAqbWliW10sIGludCBvZmZ0KQogewogCXVuc2lnbmVkIGxvbmcgcmVzID0gMDsKLQlpbnQgaTsKKwlpbnQgaSwgajsKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCXJlcyArPSAqKCgodW5zaWduZWQgbG9uZyAqKSBwZXJfY3B1X3B0cihtaWJbMF0sIGkpKSArIG9mZnQpOwotCQlyZXMgKz0gKigoKHVuc2lnbmVkIGxvbmcgKikgcGVyX2NwdV9wdHIobWliWzFdLCBpKSkgKyBvZmZ0KTsKKwkJZm9yIChqID0gMDsgaiA8IFNOTVBfQVJSQVlfU1o7IGorKykKKwkJCXJlcyArPSAqKCgodW5zaWduZWQgbG9uZyAqKSBwZXJfY3B1X3B0cihtaWJbal0sIGkpKSArIG9mZnQpOwogCX0KIAlyZXR1cm4gcmVzOwogfQpAQCAtMTQ1NSwyOCArMTQ1OCwxOSBAQAogCWludCBjcHU7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCXZvaWQgKmJocHRyLCAqdXNlcnB0cjsKKwkJdm9pZCAqYmhwdHI7CiAJCXN0cnVjdCB1NjRfc3RhdHNfc3luYyAqc3luY3A7Ci0JCXU2NCB2X2JoLCB2X3VzZXI7CisJCXU2NCB2OwogCQl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAKLQkJLyogZmlyc3QgbWliIHVzZWQgYnkgc29mdGlycSBjb250ZXh0LCB3ZSBtdXN0IHVzZSBfYmgoKSBhY2Nlc3NvcnMgKi8KLQkJYmhwdHIgPSBwZXJfY3B1X3B0cihTTk1QX1NUQVRfQkhQVFIobWliKSwgY3B1KTsKKwkJYmhwdHIgPSBwZXJfY3B1X3B0cihtaWJbMF0sIGNwdSk7CiAJCXN5bmNwID0gKHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqKShiaHB0ciArIHN5bmNwX29mZnNldCk7CiAJCWRvIHsKIAkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2JoKHN5bmNwKTsKLQkJCXZfYmggPSAqKCgodTY0ICopIGJocHRyKSArIG9mZnQpOworCQkJdiA9ICooKCh1NjQgKikgYmhwdHIpICsgb2ZmdCk7CiAJCX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeV9iaChzeW5jcCwgc3RhcnQpKTsKIAotCQkvKiBzZWNvbmQgbWliIHVzZWQgaW4gVVNFUiBjb250ZXh0ICovCi0JCXVzZXJwdHIgPSBwZXJfY3B1X3B0cihTTk1QX1NUQVRfVVNSUFRSKG1pYiksIGNwdSk7Ci0JCXN5bmNwID0gKHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqKSh1c2VycHRyICsgc3luY3Bfb2Zmc2V0KTsKLQkJZG8gewotCQkJc3RhcnQgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW4oc3luY3ApOwotCQkJdl91c2VyID0gKigoKHU2NCAqKSB1c2VycHRyKSArIG9mZnQpOwotCQl9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoc3luY3AsIHN0YXJ0KSk7Ci0KLQkJcmVzICs9IHZfYmggKyB2X3VzZXI7CisJCXJlcyArPSB2OwogCX0KIAlyZXR1cm4gcmVzOwogfQpAQCAtMTQ4OCwyNSArMTQ4MiwyOCBAQAogCUJVR19PTihwdHIgPT0gTlVMTCk7CiAJcHRyWzBdID0gX19hbGxvY19wZXJjcHUobWlic2l6ZSwgYWxpZ24pOwogCWlmICghcHRyWzBdKQotCQlnb3RvIGVycjA7CisJCXJldHVybiAtRU5PTUVNOworI2lmIFNOTVBfQVJSQVlfU1ogPT0gMgogCXB0clsxXSA9IF9fYWxsb2NfcGVyY3B1KG1pYnNpemUsIGFsaWduKTsKLQlpZiAoIXB0clsxXSkKLQkJZ290byBlcnIxOworCWlmICghcHRyWzFdKSB7CisJCWZyZWVfcGVyY3B1KHB0clswXSk7CisJCXB0clswXSA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKyNlbmRpZgogCXJldHVybiAwOwotZXJyMToKLQlmcmVlX3BlcmNwdShwdHJbMF0pOwotCXB0clswXSA9IE5VTEw7Ci1lcnIwOgotCXJldHVybiAtRU5PTUVNOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25tcF9taWJfaW5pdCk7CiAKLXZvaWQgc25tcF9taWJfZnJlZSh2b2lkIF9fcGVyY3B1ICpwdHJbMl0pCit2b2lkIHNubXBfbWliX2ZyZWUodm9pZCBfX3BlcmNwdSAqcHRyW1NOTVBfQVJSQVlfU1pdKQogeworCWludCBpOworCiAJQlVHX09OKHB0ciA9PSBOVUxMKTsKLQlmcmVlX3BlcmNwdShwdHJbMF0pOwotCWZyZWVfcGVyY3B1KHB0clsxXSk7Ci0JcHRyWzBdID0gcHRyWzFdID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgU05NUF9BUlJBWV9TWjsgaSsrKSB7CisJCWZyZWVfcGVyY3B1KHB0cltpXSk7CisJCXB0cltpXSA9IE5VTEw7CisJfQogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25tcF9taWJfZnJlZSk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FycC5jIGIvbmV0L2lwdjQvYXJwLmMKaW5kZXggMWI3NGQzYi4uOTZhMTY0YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYXJwLmMKKysrIGIvbmV0L2lwdjQvYXJwLmMKQEAgLTk3LDcgKzk3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KLSNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CkBAIC0xMzksOCArMTM4LDYgQEAKIAkuZXJyb3JfcmVwb3J0ID0JCWFycF9lcnJvcl9yZXBvcnQsCiAJLm91dHB1dCA9CQluZWlnaF9yZXNvbHZlX291dHB1dCwKIAkuY29ubmVjdGVkX291dHB1dCA9CW5laWdoX2Nvbm5lY3RlZF9vdXRwdXQsCi0JLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKLQkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmVpZ2hfb3BzIGFycF9oaF9vcHMgPSB7CkBAIC0xNDksMTYgKzE0NiwxMiBAQAogCS5lcnJvcl9yZXBvcnQgPQkJYXJwX2Vycm9yX3JlcG9ydCwKIAkub3V0cHV0ID0JCW5laWdoX3Jlc29sdmVfb3V0cHV0LAogCS5jb25uZWN0ZWRfb3V0cHV0ID0JbmVpZ2hfcmVzb2x2ZV9vdXRwdXQsCi0JLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKLQkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmVpZ2hfb3BzIGFycF9kaXJlY3Rfb3BzID0gewogCS5mYW1pbHkgPQkJQUZfSU5FVCwKLQkub3V0cHV0ID0JCWRldl9xdWV1ZV94bWl0LAotCS5jb25uZWN0ZWRfb3V0cHV0ID0JZGV2X3F1ZXVlX3htaXQsCi0JLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKLQkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKKwkub3V0cHV0ID0JCW5laWdoX2RpcmVjdF9vdXRwdXQsCisJLmNvbm5lY3RlZF9vdXRwdXQgPQluZWlnaF9kaXJlY3Rfb3V0cHV0LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZWlnaF9vcHMgYXJwX2Jyb2tlbl9vcHMgPSB7CkBAIC0xNjcsOCArMTYwLDYgQEAKIAkuZXJyb3JfcmVwb3J0ID0JCWFycF9lcnJvcl9yZXBvcnQsCiAJLm91dHB1dCA9CQluZWlnaF9jb21wYXRfb3V0cHV0LAogCS5jb25uZWN0ZWRfb3V0cHV0ID0JbmVpZ2hfY29tcGF0X291dHB1dCwKLQkuaGhfb3V0cHV0ID0JCWRldl9xdWV1ZV94bWl0LAotCS5xdWV1ZV94bWl0ID0JCWRldl9xdWV1ZV94bWl0LAogfTsKIAogc3RydWN0IG5laWdoX3RhYmxlIGFycF90YmwgPSB7CkBAIC0yMzIsNyArMjIzLDcgQEAKIAkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCSAgICBfX3UzMiBoYXNoX3JuZCkKIHsKLQlyZXR1cm4gamhhc2hfMndvcmRzKCoodTMyICopcGtleSwgZGV2LT5pZmluZGV4LCBoYXNoX3JuZCk7CisJcmV0dXJuIGFycF9oYXNoZm4oKih1MzIgKilwa2V5LCBkZXYsIGhhc2hfcm5kKTsKIH0KIAogc3RhdGljIGludCBhcnBfY29uc3RydWN0b3Ioc3RydWN0IG5laWdoYm91ciAqbmVpZ2gpCkBAIC0yNTksNyArMjUwLDcgQEAKIAlpZiAoIWRldi0+aGVhZGVyX29wcykgewogCQluZWlnaC0+bnVkX3N0YXRlID0gTlVEX05PQVJQOwogCQluZWlnaC0+b3BzID0gJmFycF9kaXJlY3Rfb3BzOwotCQluZWlnaC0+b3V0cHV0ID0gbmVpZ2gtPm9wcy0+cXVldWVfeG1pdDsKKwkJbmVpZ2gtPm91dHB1dCA9IG5laWdoX2RpcmVjdF9vdXRwdXQ7CiAJfSBlbHNlIHsKIAkJLyogR29vZCBkZXZpY2VzIChjaGVja2VkIGJ5IHJlYWRpbmcgdGV4dHMsIGJ1dCBvbmx5IEV0aGVybmV0IGlzCiAJCSAgIHRlc3RlZCkKQEAgLTUxOCwzMCArNTA5LDYgQEAKIAogLyogRU5EIE9GIE9CU09MRVRFIEZVTkNUSU9OUyAqLwogCi1pbnQgYXJwX2JpbmRfbmVpZ2hib3VyKHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHN0LT5kZXY7Ci0Jc3RydWN0IG5laWdoYm91ciAqbiA9IGRzdC0+bmVpZ2hib3VyOwotCi0JaWYgKGRldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAobiA9PSBOVUxMKSB7Ci0JCV9fYmUzMiBuZXh0aG9wID0gKChzdHJ1Y3QgcnRhYmxlICopZHN0KS0+cnRfZ2F0ZXdheTsKLQkJaWYgKGRldi0+ZmxhZ3MgJiAoSUZGX0xPT1BCQUNLIHwgSUZGX1BPSU5UT1BPSU5UKSkKLQkJCW5leHRob3AgPSAwOwotCQluID0gX19uZWlnaF9sb29rdXBfZXJybm8oCi0jaWYgZGVmaW5lZChDT05GSUdfQVRNX0NMSVApIHx8IGRlZmluZWQoQ09ORklHX0FUTV9DTElQX01PRFVMRSkKLQkJCQkJIGRldi0+dHlwZSA9PSBBUlBIUkRfQVRNID8KLQkJCQkJIGNsaXBfdGJsX2hvb2sgOgotI2VuZGlmCi0JCQkJCSAmYXJwX3RibCwgJm5leHRob3AsIGRldik7Ci0JCWlmIChJU19FUlIobikpCi0JCQlyZXR1cm4gUFRSX0VSUihuKTsKLQkJZHN0LT5uZWlnaGJvdXIgPSBuOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIENoZWNrIGlmIHdlIGNhbiB1c2UgcHJveHkgQVJQIGZvciB0aGlzIHBhdGgKICAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZGV2aW5ldC5jIGIvbmV0L2lwdjQvZGV2aW5ldC5jCmluZGV4IDBkNGExODQuLjM3YjNjMTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2RldmluZXQuYworKysgYi9uZXQvaXB2NC9kZXZpbmV0LmMKQEAgLTE4MzMsOCArMTgzMyw4IEBACiAKIAlydG5sX2FmX3JlZ2lzdGVyKCZpbmV0X2FmX29wcyk7CiAKLQlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9ORVdBRERSLCBpbmV0X3J0bV9uZXdhZGRyLCBOVUxMKTsKLQlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9ERUxBRERSLCBpbmV0X3J0bV9kZWxhZGRyLCBOVUxMKTsKLQlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9HRVRBRERSLCBOVUxMLCBpbmV0X2R1bXBfaWZhZGRyKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9ORVdBRERSLCBpbmV0X3J0bV9uZXdhZGRyLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9ERUxBRERSLCBpbmV0X3J0bV9kZWxhZGRyLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9HRVRBRERSLCBOVUxMLCBpbmV0X2R1bXBfaWZhZGRyLCBOVUxMKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMgYi9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYwppbmRleCAyMjUyNDcxLi45MmZjNWY2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYworKysgYi9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYwpAQCAtMTEyNCw5ICsxMTI0LDkgQEAKIAogdm9pZCBfX2luaXQgaXBfZmliX2luaXQodm9pZCkKIHsKLQlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9ORVdST1VURSwgaW5ldF9ydG1fbmV3cm91dGUsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfSU5FVCwgUlRNX0RFTFJPVVRFLCBpbmV0X3J0bV9kZWxyb3V0ZSwgTlVMTCk7Ci0JcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fR0VUUk9VVEUsIE5VTEwsIGluZXRfZHVtcF9maWIpOworCXJ0bmxfcmVnaXN0ZXIoUEZfSU5FVCwgUlRNX05FV1JPVVRFLCBpbmV0X3J0bV9uZXdyb3V0ZSwgTlVMTCwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fREVMUk9VVEUsIGluZXRfcnRtX2RlbHJvdXRlLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9HRVRST1VURSwgTlVMTCwgaW5ldF9kdW1wX2ZpYiwgTlVMTCk7CiAKIAlyZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZmaWJfbmV0X29wcyk7CiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZmaWJfbmV0ZGV2X25vdGlmaWVyKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl90cmllLmMgYi9uZXQvaXB2NC9maWJfdHJpZS5jCmluZGV4IDU4YzI1ZWEuLmRlOWUyOTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl90cmllLmMKKysrIGIvbmV0L2lwdjQvZmliX3RyaWUuYwpAQCAtMTEwLDkgKzExMCwxMCBAQAogCiBzdHJ1Y3QgbGVhZl9pbmZvIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSBobGlzdDsKLQlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogCWludCBwbGVuOworCXUzMiBtYXNrX3BsZW47IC8qIG50b2hsKGluZXRfbWFrZV9tYXNrKHBsZW4pKSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZmFsaDsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogfTsKIAogc3RydWN0IHRub2RlIHsKQEAgLTQ1MSw2ICs0NTIsNyBAQAogCXN0cnVjdCBsZWFmX2luZm8gKmxpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxlYWZfaW5mbyksICBHRlBfS0VSTkVMKTsKIAlpZiAobGkpIHsKIAkJbGktPnBsZW4gPSBwbGVuOworCQlsaS0+bWFza19wbGVuID0gbnRvaGwoaW5ldF9tYWtlX21hc2socGxlbikpOwogCQlJTklUX0xJU1RfSEVBRCgmbGktPmZhbGgpOwogCX0KIAlyZXR1cm4gbGk7CkBAIC0xMzU5LDEwICsxMzYxLDggQEAKIAogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShsaSwgbm9kZSwgaGhlYWQsIGhsaXN0KSB7CiAJCXN0cnVjdCBmaWJfYWxpYXMgKmZhOwotCQlpbnQgcGxlbiA9IGxpLT5wbGVuOwotCQlfX2JlMzIgbWFzayA9IGluZXRfbWFrZV9tYXNrKHBsZW4pOwogCi0JCWlmIChsLT5rZXkgIT0gKGtleSAmIG50b2hsKG1hc2spKSkKKwkJaWYgKGwtPmtleSAhPSAoa2V5ICYgbGktPm1hc2tfcGxlbikpCiAJCQljb250aW51ZTsKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShmYSwgJmxpLT5mYWxoLCBmYV9saXN0KSB7CkBAIC0xMzk0LDcgKzEzOTQsNyBAQAogI2lmZGVmIENPTkZJR19JUF9GSUJfVFJJRV9TVEFUUwogCQkJCXQtPnN0YXRzLnNlbWFudGljX21hdGNoX3Bhc3NlZCsrOwogI2VuZGlmCi0JCQkJcmVzLT5wcmVmaXhsZW4gPSBwbGVuOworCQkJCXJlcy0+cHJlZml4bGVuID0gbGktPnBsZW47CiAJCQkJcmVzLT5uaF9zZWwgPSBuaHNlbDsKIAkJCQlyZXMtPnR5cGUgPSBmYS0+ZmFfdHlwZTsKIAkJCQlyZXMtPnNjb3BlID0gZmEtPmZhX2luZm8tPmZpYl9zY29wZTsKQEAgLTE0MDIsNyArMTQwMiw3IEBACiAJCQkJcmVzLT50YWJsZSA9IHRiOwogCQkJCXJlcy0+ZmFfaGVhZCA9ICZsaS0+ZmFsaDsKIAkJCQlpZiAoIShmaWJfZmxhZ3MgJiBGSUJfTE9PS1VQX05PUkVGKSkKLQkJCQkJYXRvbWljX2luYygmcmVzLT5maS0+ZmliX2NsbnRyZWYpOworCQkJCQlhdG9taWNfaW5jKCZmaS0+ZmliX2NsbnRyZWYpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9ncmUuYyBiL25ldC9pcHY0L2dyZS5jCmluZGV4IGM2OTMzZjIuLmRiZmMyMWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2dyZS5jCisrKyBiL25ldC9pcHY0L2dyZS5jCkBAIC0xNSw4ICsxNSw4IEBACiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxuZXQvZ3JlLmg+CkBAIC05NywyNyArOTcsMTcgQEAKIHN0YXRpYyB2b2lkIGdyZV9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGluZm8pCiB7CiAJY29uc3Qgc3RydWN0IGdyZV9wcm90b2NvbCAqcHJvdG87Ci0JdTggdmVyOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gKGNvbnN0IHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKKwl1OCB2ZXIgPSBza2ItPmRhdGFbKGlwaC0+aWhsPDwyKSArIDFdJjB4N2Y7CiAKLQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAxMikpCi0JCWdvdG8gZHJvcDsKLQotCXZlciA9IHNrYi0+ZGF0YVsxXSYweDdmOwogCWlmICh2ZXIgPj0gR1JFUFJPVE9fTUFYKQotCQlnb3RvIGRyb3A7CisJCXJldHVybjsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlwcm90byA9IHJjdV9kZXJlZmVyZW5jZShncmVfcHJvdG9bdmVyXSk7Ci0JaWYgKCFwcm90byB8fCAhcHJvdG8tPmVycl9oYW5kbGVyKQotCQlnb3RvIGRyb3BfdW5sb2NrOwotCXByb3RvLT5lcnJfaGFuZGxlcihza2IsIGluZm8pOworCWlmIChwcm90byAmJiBwcm90by0+ZXJyX2hhbmRsZXIpCisJCXByb3RvLT5lcnJfaGFuZGxlcihza2IsIGluZm8pOwogCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybjsKLQotZHJvcF91bmxvY2s6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci1kcm9wOgotCWtmcmVlX3NrYihza2IpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9wcm90b2NvbCBuZXRfZ3JlX3Byb3RvY29sID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWNtcC5jIGIvbmV0L2lwdjQvaWNtcC5jCmluZGV4IDUzOTVlNDUuLjIzZWYzMWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ljbXAuYworKysgYi9uZXQvaXB2NC9pY21wLmMKQEAgLTM4MCw2ICszODAsNyBAQAogCQkJCQlzdHJ1Y3QgaWNtcF9ieG0gKnBhcmFtKQogewogCXN0cnVjdCBydGFibGUgKnJ0LCAqcnQyOworCXN0cnVjdCBmbG93aTQgZmw0X2RlYzsKIAlpbnQgZXJyOwogCiAJbWVtc2V0KGZsNCwgMCwgc2l6ZW9mKCpmbDQpKTsKQEAgLTQwOCwxOSArNDA5LDE5IEBACiAJfSBlbHNlCiAJCXJldHVybiBydDsKIAotCWVyciA9IHhmcm1fZGVjb2RlX3Nlc3Npb25fcmV2ZXJzZShza2JfaW4sIGZsb3dpNF90b19mbG93aShmbDQpLCBBRl9JTkVUKTsKKwllcnIgPSB4ZnJtX2RlY29kZV9zZXNzaW9uX3JldmVyc2Uoc2tiX2luLCBmbG93aTRfdG9fZmxvd2koJmZsNF9kZWMpLCBBRl9JTkVUKTsKIAlpZiAoZXJyKQogCQlnb3RvIHJlbG9va3VwX2ZhaWxlZDsKIAotCWlmIChpbmV0X2FkZHJfdHlwZShuZXQsIGZsNC0+c2FkZHIpID09IFJUTl9MT0NBTCkgewotCQlydDIgPSBfX2lwX3JvdXRlX291dHB1dF9rZXkobmV0LCBmbDQpOworCWlmIChpbmV0X2FkZHJfdHlwZShuZXQsIGZsNF9kZWMuc2FkZHIpID09IFJUTl9MT0NBTCkgeworCQlydDIgPSBfX2lwX3JvdXRlX291dHB1dF9rZXkobmV0LCAmZmw0X2RlYyk7CiAJCWlmIChJU19FUlIocnQyKSkKIAkJCWVyciA9IFBUUl9FUlIocnQyKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgZmxvd2k0IGZsNF8yID0ge307CiAJCXVuc2lnbmVkIGxvbmcgb3JlZmRzdDsKIAotCQlmbDRfMi5kYWRkciA9IGZsNC0+c2FkZHI7CisJCWZsNF8yLmRhZGRyID0gZmw0X2RlYy5zYWRkcjsKIAkJcnQyID0gaXBfcm91dGVfb3V0cHV0X2tleShuZXQsICZmbDRfMik7CiAJCWlmIChJU19FUlIocnQyKSkgewogCQkJZXJyID0gUFRSX0VSUihydDIpOwpAQCAtNDI4LDcgKzQyOSw3IEBACiAJCX0KIAkJLyogVWdoISAqLwogCQlvcmVmZHN0ID0gc2tiX2luLT5fc2tiX3JlZmRzdDsgLyogc2F2ZSBvbGQgcmVmZHN0ICovCi0JCWVyciA9IGlwX3JvdXRlX2lucHV0KHNrYl9pbiwgZmw0LT5kYWRkciwgZmw0LT5zYWRkciwKKwkJZXJyID0gaXBfcm91dGVfaW5wdXQoc2tiX2luLCBmbDRfZGVjLmRhZGRyLCBmbDRfZGVjLnNhZGRyLAogCQkJCSAgICAgUlRfVE9TKHRvcyksIHJ0Mi0+ZHN0LmRldik7CiAKIAkJZHN0X3JlbGVhc2UoJnJ0Mi0+ZHN0KTsKQEAgLTQ0MCwxMCArNDQxLDExIEBACiAJCWdvdG8gcmVsb29rdXBfZmFpbGVkOwogCiAJcnQyID0gKHN0cnVjdCBydGFibGUgKikgeGZybV9sb29rdXAobmV0LCAmcnQyLT5kc3QsCi0JCQkJCSAgICBmbG93aTRfdG9fZmxvd2koZmw0KSwgTlVMTCwKKwkJCQkJICAgIGZsb3dpNF90b19mbG93aSgmZmw0X2RlYyksIE5VTEwsCiAJCQkJCSAgICBYRlJNX0xPT0tVUF9JQ01QKTsKIAlpZiAoIUlTX0VSUihydDIpKSB7CiAJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKKwkJbWVtY3B5KGZsNCwgJmZsNF9kZWMsIHNpemVvZigqZmw0KSk7CiAJCXJ0ID0gcnQyOwogCX0gZWxzZSBpZiAoUFRSX0VSUihydDIpID09IC1FUEVSTSkgewogCQlpZiAocnQpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2RpYWcuYyBiL25ldC9pcHY0L2luZXRfZGlhZy5jCmluZGV4IDZmZmU5NGMuLjM4OWEyZTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfZGlhZy5jCisrKyBiL25ldC9pcHY0L2luZXRfZGlhZy5jCkBAIC00MzcsNyArNDM3LDcgQEAKIAkJCXJldHVybiAwOwogCQlpZiAoY2MgPT0gbGVuKQogCQkJcmV0dXJuIDE7Ci0JCWlmIChvcC0+eWVzIDwgNCkKKwkJaWYgKG9wLT55ZXMgPCA0IHx8IG9wLT55ZXMgJiAzKQogCQkJcmV0dXJuIDA7CiAJCWxlbiAtPSBvcC0+eWVzOwogCQliYyAgKz0gb3AtPnllczsKQEAgLTQ0NywxMSArNDQ3LDExIEBACiAKIHN0YXRpYyBpbnQgaW5ldF9kaWFnX2JjX2F1ZGl0KGNvbnN0IHZvaWQgKmJ5dGVjb2RlLCBpbnQgYnl0ZWNvZGVfbGVuKQogewotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJjID0gYnl0ZWNvZGU7CisJY29uc3Qgdm9pZCAqYmMgPSBieXRlY29kZTsKIAlpbnQgIGxlbiA9IGJ5dGVjb2RlX2xlbjsKIAogCXdoaWxlIChsZW4gPiAwKSB7Ci0JCXN0cnVjdCBpbmV0X2RpYWdfYmNfb3AgKm9wID0gKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3AgKiliYzsKKwkJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19iY19vcCAqb3AgPSBiYzsKIAogLy9wcmludGsoIkJDOiAlZCAlZCAlZCB7JWR9IC8gJWRcbiIsIG9wLT5jb2RlLCBvcC0+eWVzLCBvcC0+bm8sIG9wWzFdLm5vLCBsZW4pOwogCQlzd2l0Y2ggKG9wLT5jb2RlKSB7CkBAIC00NjIsMjIgKzQ2MiwyMCBAQAogCQljYXNlIElORVRfRElBR19CQ19TX0xFOgogCQljYXNlIElORVRfRElBR19CQ19EX0dFOgogCQljYXNlIElORVRfRElBR19CQ19EX0xFOgotCQkJaWYgKG9wLT55ZXMgPCA0IHx8IG9wLT55ZXMgPiBsZW4gKyA0KQotCQkJCXJldHVybiAtRUlOVkFMOwogCQljYXNlIElORVRfRElBR19CQ19KTVA6Ci0JCQlpZiAob3AtPm5vIDwgNCB8fCBvcC0+bm8gPiBsZW4gKyA0KQorCQkJaWYgKG9wLT5ubyA8IDQgfHwgb3AtPm5vID4gbGVuICsgNCB8fCBvcC0+bm8gJiAzKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJaWYgKG9wLT5ubyA8IGxlbiAmJgogCQkJICAgICF2YWxpZF9jYyhieXRlY29kZSwgYnl0ZWNvZGVfbGVuLCBsZW4gLSBvcC0+bm8pKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCWNhc2UgSU5FVF9ESUFHX0JDX05PUDoKLQkJCWlmIChvcC0+eWVzIDwgNCB8fCBvcC0+eWVzID4gbGVuICsgNCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KKwkJaWYgKG9wLT55ZXMgPCA0IHx8IG9wLT55ZXMgPiBsZW4gKyA0IHx8IG9wLT55ZXMgJiAzKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJjICArPSBvcC0+eWVzOwogCQlsZW4gLT0gb3AtPnllczsKIAl9CkBAIC04NzEsNyArODY5LDcgQEAKIAkJfQogCiAJCXJldHVybiBuZXRsaW5rX2R1bXBfc3RhcnQoaWRpYWdubCwgc2tiLCBubGgsCi0JCQkJCSAgaW5ldF9kaWFnX2R1bXAsIE5VTEwpOworCQkJCQkgIGluZXRfZGlhZ19kdW1wLCBOVUxMLCAwKTsKIAl9CiAKIAlyZXR1cm4gaW5ldF9kaWFnX2dldF9leGFjdChza2IsIG5saCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2xyby5jIGIvbmV0L2lwdjQvaW5ldF9scm8uYwppbmRleCA4NWEwZjc1Li5lZjdhZTYwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2xyby5jCisrKyBiL25ldC9pcHY0L2luZXRfbHJvLmMKQEAgLTE0Niw4ICsxNDYsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBscm9faW5pdF9kZXNjKHN0cnVjdCBuZXRfbHJvX2Rlc2MgKmxyb19kZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICBzdHJ1Y3QgaXBoZHIgKmlwaCwgc3RydWN0IHRjcGhkciAqdGNwaCwKLQkJCSAgdTE2IHZsYW5fdGFnLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqdmdycCkKKwkJCSAgc3RydWN0IGlwaGRyICppcGgsIHN0cnVjdCB0Y3BoZHIgKnRjcGgpCiB7CiAJaW50IG5yX2ZyYWdzOwogCV9fYmUzMiAqcHRyOwpAQCAtMTczLDggKzE3Miw2IEBACiAJfQogCiAJbHJvX2Rlc2MtPm1zcyA9IHRjcF9kYXRhX2xlbjsKLQlscm9fZGVzYy0+dmdycCA9IHZncnA7Ci0JbHJvX2Rlc2MtPnZsYW5fdGFnID0gdmxhbl90YWc7CiAJbHJvX2Rlc2MtPmFjdGl2ZSA9IDE7CiAKIAlscm9fZGVzYy0+ZGF0YV9jc3VtID0gbHJvX3RjcF9kYXRhX2NzdW0oaXBoLCB0Y3BoLApAQCAtMzA5LDI5ICszMDYsMTcgQEAKIAogCXNrYl9zaGluZm8obHJvX2Rlc2MtPnBhcmVudCktPmdzb19zaXplID0gbHJvX2Rlc2MtPm1zczsKIAotCWlmIChscm9fZGVzYy0+dmdycCkgewotCQlpZiAobHJvX21nci0+ZmVhdHVyZXMgJiBMUk9fRl9OQVBJKQotCQkJdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKGxyb19kZXNjLT5wYXJlbnQsCi0JCQkJCQkgbHJvX2Rlc2MtPnZncnAsCi0JCQkJCQkgbHJvX2Rlc2MtPnZsYW5fdGFnKTsKLQkJZWxzZQotCQkJdmxhbl9od2FjY2VsX3J4KGxyb19kZXNjLT5wYXJlbnQsCi0JCQkJCWxyb19kZXNjLT52Z3JwLAotCQkJCQlscm9fZGVzYy0+dmxhbl90YWcpOwotCi0JfSBlbHNlIHsKLQkJaWYgKGxyb19tZ3ItPmZlYXR1cmVzICYgTFJPX0ZfTkFQSSkKLQkJCW5ldGlmX3JlY2VpdmVfc2tiKGxyb19kZXNjLT5wYXJlbnQpOwotCQllbHNlCi0JCQluZXRpZl9yeChscm9fZGVzYy0+cGFyZW50KTsKLQl9CisJaWYgKGxyb19tZ3ItPmZlYXR1cmVzICYgTFJPX0ZfTkFQSSkKKwkJbmV0aWZfcmVjZWl2ZV9za2IobHJvX2Rlc2MtPnBhcmVudCk7CisJZWxzZQorCQluZXRpZl9yeChscm9fZGVzYy0+cGFyZW50KTsKIAogCUxST19JTkNfU1RBVFMobHJvX21nciwgZmx1c2hlZCk7CiAJbHJvX2NsZWFyX2Rlc2MobHJvX2Rlc2MpOwogfQogCiBzdGF0aWMgaW50IF9fbHJvX3Byb2Nfc2tiKHN0cnVjdCBuZXRfbHJvX21nciAqbHJvX21nciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgc3RydWN0IHZsYW5fZ3JvdXAgKnZncnAsIHUxNiB2bGFuX3RhZywgdm9pZCAqcHJpdikKKwkJCSAgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgbmV0X2xyb19kZXNjICpscm9fZGVzYzsKIAlzdHJ1Y3QgaXBoZHIgKmlwaDsKQEAgLTM2MCw3ICszNDUsNyBAQAogCQkJZ290byBvdXQ7CiAKIAkJc2tiLT5pcF9zdW1tZWQgPSBscm9fbWdyLT5pcF9zdW1tZWRfYWdncjsKLQkJbHJvX2luaXRfZGVzYyhscm9fZGVzYywgc2tiLCBpcGgsIHRjcGgsIHZsYW5fdGFnLCB2Z3JwKTsKKwkJbHJvX2luaXRfZGVzYyhscm9fZGVzYywgc2tiLCBpcGgsIHRjcGgpOwogCQlMUk9fSU5DX1NUQVRTKGxyb19tZ3IsIGFnZ3JlZ2F0ZWQpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC00MzMsOCArNDE4LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqX19scm9fcHJvY19zZWdtZW50KHN0cnVjdCBuZXRfbHJvX21nciAqbHJvX21nciwKIAkJCQkJICBzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFncywKIAkJCQkJICBpbnQgbGVuLCBpbnQgdHJ1ZV9zaXplLAotCQkJCQkgIHN0cnVjdCB2bGFuX2dyb3VwICp2Z3JwLAotCQkJCQkgIHUxNiB2bGFuX3RhZywgdm9pZCAqcHJpdiwgX193c3VtIHN1bSkKKwkJCQkJICB2b2lkICpwcml2LCBfX3dzdW0gc3VtKQogewogCXN0cnVjdCBuZXRfbHJvX2Rlc2MgKmxyb19kZXNjOwogCXN0cnVjdCBpcGhkciAqaXBoOwpAQCAtNDgwLDcgKzQ2NCw3IEBACiAJCXRjcGggPSAodm9pZCAqKSgodTggKilza2ItPmRhdGEgKyB2bGFuX2hkcl9sZW4KIAkJCQkrIElQX0hEUl9MRU4oaXBoKSk7CiAKLQkJbHJvX2luaXRfZGVzYyhscm9fZGVzYywgc2tiLCBpcGgsIHRjcGgsIDAsIE5VTEwpOworCQlscm9faW5pdF9kZXNjKGxyb19kZXNjLCBza2IsIGlwaCwgdGNwaCk7CiAJCUxST19JTkNfU1RBVFMobHJvX21nciwgYWdncmVnYXRlZCk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTUxNCw3ICs0OTgsNyBAQAogCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgdm9pZCAqcHJpdikKIHsKLQlpZiAoX19scm9fcHJvY19za2IobHJvX21nciwgc2tiLCBOVUxMLCAwLCBwcml2KSkgeworCWlmIChfX2xyb19wcm9jX3NrYihscm9fbWdyLCBza2IsIHByaXYpKSB7CiAJCWlmIChscm9fbWdyLT5mZWF0dXJlcyAmIExST19GX05BUEkpCiAJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCQllbHNlCkBAIC01MjMsMjkgKzUwNywxMyBAQAogfQogRVhQT1JUX1NZTUJPTChscm9fcmVjZWl2ZV9za2IpOwogCi12b2lkIGxyb192bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc3RydWN0IG5ldF9scm9fbWdyICpscm9fbWdyLAotCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgIHN0cnVjdCB2bGFuX2dyb3VwICp2Z3JwLAotCQkJCSAgdTE2IHZsYW5fdGFnLAotCQkJCSAgdm9pZCAqcHJpdikKLXsKLQlpZiAoX19scm9fcHJvY19za2IobHJvX21nciwgc2tiLCB2Z3JwLCB2bGFuX3RhZywgcHJpdikpIHsKLQkJaWYgKGxyb19tZ3ItPmZlYXR1cmVzICYgTFJPX0ZfTkFQSSkKLQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIHZncnAsIHZsYW5fdGFnKTsKLQkJZWxzZQotCQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgdmdycCwgdmxhbl90YWcpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0wobHJvX3ZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYik7Ci0KIHZvaWQgbHJvX3JlY2VpdmVfZnJhZ3Moc3RydWN0IG5ldF9scm9fbWdyICpscm9fbWdyLAogCQkgICAgICAgc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZ3MsCiAJCSAgICAgICBpbnQgbGVuLCBpbnQgdHJ1ZV9zaXplLCB2b2lkICpwcml2LCBfX3dzdW0gc3VtKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQlza2IgPSBfX2xyb19wcm9jX3NlZ21lbnQobHJvX21nciwgZnJhZ3MsIGxlbiwgdHJ1ZV9zaXplLCBOVUxMLCAwLAotCQkJCSBwcml2LCBzdW0pOworCXNrYiA9IF9fbHJvX3Byb2Nfc2VnbWVudChscm9fbWdyLCBmcmFncywgbGVuLCB0cnVlX3NpemUsIHByaXYsIHN1bSk7CiAJaWYgKCFza2IpCiAJCXJldHVybjsKIApAQCAtNTU2LDI2ICs1MjQsNiBAQAogfQogRVhQT1JUX1NZTUJPTChscm9fcmVjZWl2ZV9mcmFncyk7CiAKLXZvaWQgbHJvX3ZsYW5faHdhY2NlbF9yZWNlaXZlX2ZyYWdzKHN0cnVjdCBuZXRfbHJvX21nciAqbHJvX21nciwKLQkJCQkgICAgc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZ3MsCi0JCQkJICAgIGludCBsZW4sIGludCB0cnVlX3NpemUsCi0JCQkJICAgIHN0cnVjdCB2bGFuX2dyb3VwICp2Z3JwLAotCQkJCSAgICB1MTYgdmxhbl90YWcsIHZvaWQgKnByaXYsIF9fd3N1bSBzdW0pCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCXNrYiA9IF9fbHJvX3Byb2Nfc2VnbWVudChscm9fbWdyLCBmcmFncywgbGVuLCB0cnVlX3NpemUsIHZncnAsCi0JCQkJIHZsYW5fdGFnLCBwcml2LCBzdW0pOwotCWlmICghc2tiKQotCQlyZXR1cm47Ci0KLQlpZiAobHJvX21nci0+ZmVhdHVyZXMgJiBMUk9fRl9OQVBJKQotCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCB2Z3JwLCB2bGFuX3RhZyk7Ci0JZWxzZQotCQl2bGFuX2h3YWNjZWxfcngoc2tiLCB2Z3JwLCB2bGFuX3RhZyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGxyb192bGFuX2h3YWNjZWxfcmVjZWl2ZV9mcmFncyk7Ci0KIHZvaWQgbHJvX2ZsdXNoX2FsbChzdHJ1Y3QgbmV0X2xyb19tZ3IgKmxyb19tZ3IpCiB7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0cGVlci5jIGIvbmV0L2lwdjQvaW5ldHBlZXIuYwppbmRleCBjZTYxNmQ5Li5lMzgyMTM4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0cGVlci5jCisrKyBiL25ldC9pcHY0L2luZXRwZWVyLmMKQEAgLTU0LDE1ICs1NCwxMSBAQAogICogIDEuICBOb2RlcyBtYXkgYXBwZWFyIGluIHRoZSB0cmVlIG9ubHkgd2l0aCB0aGUgcG9vbCBsb2NrIGhlbGQuCiAgKiAgMi4gIE5vZGVzIG1heSBkaXNhcHBlYXIgZnJvbSB0aGUgdHJlZSBvbmx5IHdpdGggdGhlIHBvb2wgbG9jayBoZWxkCiAgKiAgICAgIEFORCByZWZlcmVuY2UgY291bnQgYmVpbmcgMC4KLSAqICAzLiAgTm9kZXMgYXBwZWFycyBhbmQgZGlzYXBwZWFycyBmcm9tIHVudXNlZCBub2RlIGxpc3Qgb25seSB1bmRlcgotICogICAgICAiaW5ldF9wZWVyX3VudXNlZF9sb2NrIi4KLSAqICA0LiAgR2xvYmFsIHZhcmlhYmxlIHBlZXJfdG90YWwgaXMgbW9kaWZpZWQgdW5kZXIgdGhlIHBvb2wgbG9jay4KLSAqICA1LiAgc3RydWN0IGluZXRfcGVlciBmaWVsZHMgbW9kaWZpY2F0aW9uOgorICogIDMuICBHbG9iYWwgdmFyaWFibGUgcGVlcl90b3RhbCBpcyBtb2RpZmllZCB1bmRlciB0aGUgcG9vbCBsb2NrLgorICogIDQuICBzdHJ1Y3QgaW5ldF9wZWVyIGZpZWxkcyBtb2RpZmljYXRpb246CiAgKgkJYXZsX2xlZnQsIGF2bF9yaWdodCwgYXZsX3BhcmVudCwgYXZsX2hlaWdodDogcG9vbCBsb2NrCi0gKgkJdW51c2VkOiB1bnVzZWQgbm9kZSBsaXN0IGxvY2sKICAqCQlyZWZjbnQ6IGF0b21pY2FsbHkgYWdhaW5zdCBtb2RpZmljYXRpb25zIG9uIG90aGVyIENQVTsKICAqCQkgICB1c3VhbGx5IHVuZGVyIHNvbWUgb3RoZXIgbG9jayB0byBwcmV2ZW50IG5vZGUgZGlzYXBwZWFyaW5nCi0gKgkJZHRpbWU6IHVudXNlZCBub2RlIGxpc3QgbG9jawogICoJCWRhZGRyOiB1bmNoYW5nZWFibGUKICAqCQlpcF9pZF9jb3VudDogYXRvbWljIHZhbHVlIChubyBsb2NrIG5lZWRlZCkKICAqLwpAQCAtMTA0LDE5ICsxMDAsNiBAQAogCQkJCQkgKiBhZ2dyZXNzaXZlbHkgYXQgdGhpcyBzdGFnZSAqLwogaW50IGluZXRfcGVlcl9taW50dGwgX19yZWFkX21vc3RseSA9IDEyMCAqIEhaOwkvKiBUVEwgdW5kZXIgaGlnaCBsb2FkOiAxMjAgc2VjICovCiBpbnQgaW5ldF9wZWVyX21heHR0bCBfX3JlYWRfbW9zdGx5ID0gMTAgKiA2MCAqIEhaOwkvKiB1c3VhbCB0aW1lIHRvIGxpdmU6IDEwIG1pbiAqLwotaW50IGluZXRfcGVlcl9nY19taW50aW1lIF9fcmVhZF9tb3N0bHkgPSAxMCAqIEhaOwotaW50IGluZXRfcGVlcl9nY19tYXh0aW1lIF9fcmVhZF9tb3N0bHkgPSAxMjAgKiBIWjsKLQotc3RhdGljIHN0cnVjdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXNwaW5sb2NrX3QJCWxvY2s7Ci19IHVudXNlZF9wZWVycyA9IHsKLQkubGlzdAkJCT0gTElTVF9IRUFEX0lOSVQodW51c2VkX3BlZXJzLmxpc3QpLAotCS5sb2NrCQkJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRCh1bnVzZWRfcGVlcnMubG9jayksCi19OwotCi1zdGF0aWMgdm9pZCBwZWVyX2NoZWNrX2V4cGlyZSh1bnNpZ25lZCBsb25nIGR1bW15KTsKLXN0YXRpYyBERUZJTkVfVElNRVIocGVlcl9wZXJpb2RpY190aW1lciwgcGVlcl9jaGVja19leHBpcmUsIDAsIDApOwogCiAKIC8qIENhbGxlZCBmcm9tIGlwX291dHB1dC5jOmlwX2luaXQgICovCkBAIC0xNDIsMjEgKzEyNSw2IEBACiAJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR04gfCBTTEFCX1BBTklDLAogCQkJTlVMTCk7CiAKLQkvKiBBbGwgdGhlIHRpbWVycywgc3RhcnRlZCBhdCBzeXN0ZW0gc3RhcnR1cCB0ZW5kCi0JICAgdG8gc3luY2hyb25pemUuIFBlcnR1cmIgaXQgYSBiaXQuCi0JICovCi0JcGVlcl9wZXJpb2RpY190aW1lci5leHBpcmVzID0gamlmZmllcwotCQkrIG5ldF9yYW5kb20oKSAlIGluZXRfcGVlcl9nY19tYXh0aW1lCi0JCSsgaW5ldF9wZWVyX2djX21heHRpbWU7Ci0JYWRkX3RpbWVyKCZwZWVyX3BlcmlvZGljX3RpbWVyKTsKLX0KLQotLyogQ2FsbGVkIHdpdGggb3Igd2l0aG91dCBsb2NhbCBCSCBiZWluZyBkaXNhYmxlZC4gKi8KLXN0YXRpYyB2b2lkIHVubGlua19mcm9tX3VudXNlZChzdHJ1Y3QgaW5ldF9wZWVyICpwKQotewotCXNwaW5fbG9ja19iaCgmdW51c2VkX3BlZXJzLmxvY2spOwotCWxpc3RfZGVsX2luaXQoJnAtPnVudXNlZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnVudXNlZF9wZWVycy5sb2NrKTsKIH0KIAogc3RhdGljIGludCBhZGRyX2NvbXBhcmUoY29uc3Qgc3RydWN0IGluZXRwZWVyX2FkZHIgKmEsCkBAIC0yMDMsMjAgKzE3MSw2IEBACiAJdTsJCQkJCQkJXAogfSkKIAotc3RhdGljIGJvb2wgYXRvbWljX2FkZF91bmxlc3NfcmV0dXJuKGF0b21pY190ICpwdHIsIGludCBhLCBpbnQgdSwgaW50ICpuZXd2KQotewotCWludCBjdXIsIG9sZCA9IGF0b21pY19yZWFkKHB0cik7Ci0KLQl3aGlsZSAob2xkICE9IHUpIHsKLQkJKm5ld3YgPSBvbGQgKyBhOwotCQljdXIgPSBhdG9taWNfY21weGNoZyhwdHIsIG9sZCwgKm5ld3YpOwotCQlpZiAoY3VyID09IG9sZCkKLQkJCXJldHVybiB0cnVlOwotCQlvbGQgPSBjdXI7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQogLyoKICAqIENhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2soKQogICogQmVjYXVzZSB3ZSBob2xkIG5vIGxvY2sgYWdhaW5zdCBhIHdyaXRlciwgaXRzIHF1aXRlIHBvc3NpYmxlIHdlIGZhbGwKQEAgLTIyNSw4ICsxNzksNyBAQAogICogV2UgZXhpdCBmcm9tIHRoaXMgZnVuY3Rpb24gaWYgbnVtYmVyIG9mIGxpbmtzIGV4Y2VlZHMgUEVFUl9NQVhERVBUSAogICovCiBzdGF0aWMgc3RydWN0IGluZXRfcGVlciAqbG9va3VwX3JjdShjb25zdCBzdHJ1Y3QgaW5ldHBlZXJfYWRkciAqZGFkZHIsCi0JCQkJICAgIHN0cnVjdCBpbmV0X3BlZXJfYmFzZSAqYmFzZSwKLQkJCQkgICAgaW50ICpuZXdyZWZjbnQpCisJCQkJICAgIHN0cnVjdCBpbmV0X3BlZXJfYmFzZSAqYmFzZSkKIHsKIAlzdHJ1Y3QgaW5ldF9wZWVyICp1ID0gcmN1X2RlcmVmZXJlbmNlKGJhc2UtPnJvb3QpOwogCWludCBjb3VudCA9IDA7CkBAIC0yMzUsMTEgKzE4OCw5IEBACiAJCWludCBjbXAgPSBhZGRyX2NvbXBhcmUoZGFkZHIsICZ1LT5kYWRkcik7CiAJCWlmIChjbXAgPT0gMCkgewogCQkJLyogQmVmb3JlIHRha2luZyBhIHJlZmVyZW5jZSwgY2hlY2sgaWYgdGhpcyBlbnRyeSB3YXMKLQkJCSAqIGRlbGV0ZWQsIHVubGlua19mcm9tX3Bvb2woKSBzZXRzIHJlZmNudD0tMSB0byBtYWtlCi0JCQkgKiBkaXN0aW5jdGlvbiBiZXR3ZWVuIGFuIHVudXNlZCBlbnRyeSAocmVmY250PTApIGFuZAotCQkJICogYSBmcmVlZCBvbmUuCisJCQkgKiBkZWxldGVkIChyZWZjbnQ9LTEpCiAJCQkgKi8KLQkJCWlmICghYXRvbWljX2FkZF91bmxlc3NfcmV0dXJuKCZ1LT5yZWZjbnQsIDEsIC0xLCBuZXdyZWZjbnQpKQorCQkJaWYgKCFhdG9taWNfYWRkX3VubGVzcygmdS0+cmVmY250LCAxLCAtMSkpCiAJCQkJdSA9IE5VTEw7CiAJCQlyZXR1cm4gdTsKIAkJfQpAQCAtMzY2LDEzNyArMzE3LDk5IEBACiAJa21lbV9jYWNoZV9mcmVlKHBlZXJfY2FjaGVwLCBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGluZXRfcGVlciwgcmN1KSk7CiB9CiAKLS8qIE1heSBiZSBjYWxsZWQgd2l0aCBsb2NhbCBCSCBlbmFibGVkLiAqLwogc3RhdGljIHZvaWQgdW5saW5rX2Zyb21fcG9vbChzdHJ1Y3QgaW5ldF9wZWVyICpwLCBzdHJ1Y3QgaW5ldF9wZWVyX2Jhc2UgKmJhc2UsCiAJCQkgICAgIHN0cnVjdCBpbmV0X3BlZXIgX19yY3UgKipzdGFja1tQRUVSX01BWERFUFRIXSkKIHsKLQlpbnQgZG9fZnJlZTsKKwlzdHJ1Y3QgaW5ldF9wZWVyIF9fcmN1ICoqKnN0YWNrcHRyLCAqKipkZWxwOwogCi0JZG9fZnJlZSA9IDA7Ci0KLQl3cml0ZV9zZXFsb2NrX2JoKCZiYXNlLT5sb2NrKTsKLQkvKiBDaGVjayB0aGUgcmVmZXJlbmNlIGNvdW50ZXIuICBJdCB3YXMgYXJ0aWZpY2lhbGx5IGluY3JlbWVudGVkIGJ5IDEKLQkgKiBpbiBjbGVhbnVwKCkgZnVuY3Rpb24gdG8gcHJldmVudCBzdWRkZW4gZGlzYXBwZWFyaW5nLiAgSWYgd2UgY2FuCi0JICogYXRvbWljYWxseSAoYmVjYXVzZSBvZiBsb2NrbGVzcyByZWFkZXJzKSB0YWtlIHRoaXMgbGFzdCByZWZlcmVuY2UsCi0JICogaXQncyBzYWZlIHRvIHJlbW92ZSB0aGUgbm9kZSBhbmQgZnJlZSBpdCBsYXRlci4KLQkgKiBXZSB1c2UgcmVmY250PS0xIHRvIGFsZXJ0IGxvY2tsZXNzIHJlYWRlcnMgdGhpcyBlbnRyeSBpcyBkZWxldGVkLgotCSAqLwotCWlmIChhdG9taWNfY21weGNoZygmcC0+cmVmY250LCAxLCAtMSkgPT0gMSkgewotCQlzdHJ1Y3QgaW5ldF9wZWVyIF9fcmN1ICoqKnN0YWNrcHRyLCAqKipkZWxwOwotCQlpZiAobG9va3VwKCZwLT5kYWRkciwgc3RhY2ssIGJhc2UpICE9IHApCi0JCQlCVUcoKTsKLQkJZGVscCA9IHN0YWNrcHRyIC0gMTsgLyogKmRlbHBbMF0gPT0gcCAqLwotCQlpZiAocC0+YXZsX2xlZnQgPT0gcGVlcl9hdmxfZW1wdHlfcmN1KSB7Ci0JCQkqZGVscFswXSA9IHAtPmF2bF9yaWdodDsKLQkJCS0tc3RhY2twdHI7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBsb29rIGZvciBhIG5vZGUgdG8gaW5zZXJ0IGluc3RlYWQgb2YgcCAqLwotCQkJc3RydWN0IGluZXRfcGVlciAqdDsKLQkJCXQgPSBsb29rdXBfcmlnaHRlbXB0eShwLCBiYXNlKTsKLQkJCUJVR19PTihyY3VfZGVyZWZfbG9ja2VkKCpzdGFja3B0clstMV0sIGJhc2UpICE9IHQpOwotCQkJKiotLXN0YWNrcHRyID0gdC0+YXZsX2xlZnQ7Ci0JCQkvKiB0IGlzIHJlbW92ZWQsIHQtPmRhZGRyID4geC0+ZGFkZHIgZm9yIGFueQotCQkJICogeCBpbiBwLT5hdmxfbGVmdCBzdWJ0cmVlLgotCQkJICogUHV0IHQgaW4gdGhlIG9sZCBwbGFjZSBvZiBwLiAqLwotCQkJUkNVX0lOSVRfUE9JTlRFUigqZGVscFswXSwgdCk7Ci0JCQl0LT5hdmxfbGVmdCA9IHAtPmF2bF9sZWZ0OwotCQkJdC0+YXZsX3JpZ2h0ID0gcC0+YXZsX3JpZ2h0OwotCQkJdC0+YXZsX2hlaWdodCA9IHAtPmF2bF9oZWlnaHQ7Ci0JCQlCVUdfT04oZGVscFsxXSAhPSAmcC0+YXZsX2xlZnQpOwotCQkJZGVscFsxXSA9ICZ0LT5hdmxfbGVmdDsgLyogd2FzICZwLT5hdmxfbGVmdCAqLwotCQl9Ci0JCXBlZXJfYXZsX3JlYmFsYW5jZShzdGFjaywgc3RhY2twdHIsIGJhc2UpOwotCQliYXNlLT50b3RhbC0tOwotCQlkb19mcmVlID0gMTsKKwlpZiAobG9va3VwKCZwLT5kYWRkciwgc3RhY2ssIGJhc2UpICE9IHApCisJCUJVRygpOworCWRlbHAgPSBzdGFja3B0ciAtIDE7IC8qICpkZWxwWzBdID09IHAgKi8KKwlpZiAocC0+YXZsX2xlZnQgPT0gcGVlcl9hdmxfZW1wdHlfcmN1KSB7CisJCSpkZWxwWzBdID0gcC0+YXZsX3JpZ2h0OworCQktLXN0YWNrcHRyOworCX0gZWxzZSB7CisJCS8qIGxvb2sgZm9yIGEgbm9kZSB0byBpbnNlcnQgaW5zdGVhZCBvZiBwICovCisJCXN0cnVjdCBpbmV0X3BlZXIgKnQ7CisJCXQgPSBsb29rdXBfcmlnaHRlbXB0eShwLCBiYXNlKTsKKwkJQlVHX09OKHJjdV9kZXJlZl9sb2NrZWQoKnN0YWNrcHRyWy0xXSwgYmFzZSkgIT0gdCk7CisJCSoqLS1zdGFja3B0ciA9IHQtPmF2bF9sZWZ0OworCQkvKiB0IGlzIHJlbW92ZWQsIHQtPmRhZGRyID4geC0+ZGFkZHIgZm9yIGFueQorCQkgKiB4IGluIHAtPmF2bF9sZWZ0IHN1YnRyZWUuCisJCSAqIFB1dCB0IGluIHRoZSBvbGQgcGxhY2Ugb2YgcC4gKi8KKwkJUkNVX0lOSVRfUE9JTlRFUigqZGVscFswXSwgdCk7CisJCXQtPmF2bF9sZWZ0ID0gcC0+YXZsX2xlZnQ7CisJCXQtPmF2bF9yaWdodCA9IHAtPmF2bF9yaWdodDsKKwkJdC0+YXZsX2hlaWdodCA9IHAtPmF2bF9oZWlnaHQ7CisJCUJVR19PTihkZWxwWzFdICE9ICZwLT5hdmxfbGVmdCk7CisJCWRlbHBbMV0gPSAmdC0+YXZsX2xlZnQ7IC8qIHdhcyAmcC0+YXZsX2xlZnQgKi8KIAl9Ci0Jd3JpdGVfc2VxdW5sb2NrX2JoKCZiYXNlLT5sb2NrKTsKLQotCWlmIChkb19mcmVlKQotCQljYWxsX3JjdSgmcC0+cmN1LCBpbmV0cGVlcl9mcmVlX3JjdSk7Ci0JZWxzZQotCQkvKiBUaGUgbm9kZSBpcyB1c2VkIGFnYWluLiAgRGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudGVyCi0JCSAqIGJhY2suICBUaGUgbG9vcCAiY2xlYW51cCAtPiB1bmxpbmtfZnJvbV91bnVzZWQKLQkJICogICAtPiB1bmxpbmtfZnJvbV9wb29sIC0+IHB1dHBlZXIgLT4gbGlua190b191bnVzZWQKLQkJICogICAtPiBjbGVhbnVwIChmb3IgdGhlIHNhbWUgbm9kZSkiCi0JCSAqIGRvZXNuJ3QgcmVhbGx5IGV4aXN0IGJlY2F1c2UgdGhlIGVudHJ5IHdpbGwgaGF2ZSBhCi0JCSAqIHJlY2VudCBkZWxldGlvbiB0aW1lIGFuZCB3aWxsIG5vdCBiZSBjbGVhbmVkIGFnYWluIHNvb24uCi0JCSAqLwotCQlpbmV0X3B1dHBlZXIocCk7CisJcGVlcl9hdmxfcmViYWxhbmNlKHN0YWNrLCBzdGFja3B0ciwgYmFzZSk7CisJYmFzZS0+dG90YWwtLTsKKwljYWxsX3JjdSgmcC0+cmN1LCBpbmV0cGVlcl9mcmVlX3JjdSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW5ldF9wZWVyX2Jhc2UgKmZhbWlseV90b19iYXNlKGludCBmYW1pbHkpCiB7Ci0JcmV0dXJuIChmYW1pbHkgPT0gQUZfSU5FVCA/ICZ2NF9wZWVycyA6ICZ2Nl9wZWVycyk7CisJcmV0dXJuIGZhbWlseSA9PSBBRl9JTkVUID8gJnY0X3BlZXJzIDogJnY2X3BlZXJzOwogfQogCi1zdGF0aWMgc3RydWN0IGluZXRfcGVlcl9iYXNlICpwZWVyX3RvX2Jhc2Uoc3RydWN0IGluZXRfcGVlciAqcCkKKy8qIHBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0IG9uIGFsbCBpdGVtcyBzdGFja2VkIGR1cmluZyBhIGxvb2t1cCAqLworc3RhdGljIGludCBpbmV0X3BlZXJfZ2Moc3RydWN0IGluZXRfcGVlcl9iYXNlICpiYXNlLAorCQkJc3RydWN0IGluZXRfcGVlciBfX3JjdSAqKnN0YWNrW1BFRVJfTUFYREVQVEhdLAorCQkJc3RydWN0IGluZXRfcGVlciBfX3JjdSAqKipzdGFja3B0cikKIHsKLQlyZXR1cm4gZmFtaWx5X3RvX2Jhc2UocC0+ZGFkZHIuZmFtaWx5KTsKLX0KKwlzdHJ1Y3QgaW5ldF9wZWVyICpwLCAqZ2NoZWFkID0gTlVMTDsKKwlfX3UzMiBkZWx0YSwgdHRsOworCWludCBjbnQgPSAwOwogCi0vKiBNYXkgYmUgY2FsbGVkIHdpdGggbG9jYWwgQkggZW5hYmxlZC4gKi8KLXN0YXRpYyBpbnQgY2xlYW51cF9vbmNlKHVuc2lnbmVkIGxvbmcgdHRsLCBzdHJ1Y3QgaW5ldF9wZWVyIF9fcmN1ICoqc3RhY2tbUEVFUl9NQVhERVBUSF0pCi17Ci0Jc3RydWN0IGluZXRfcGVlciAqcCA9IE5VTEw7Ci0KLQkvKiBSZW1vdmUgdGhlIGZpcnN0IGVudHJ5IGZyb20gdGhlIGxpc3Qgb2YgdW51c2VkIG5vZGVzLiAqLwotCXNwaW5fbG9ja19iaCgmdW51c2VkX3BlZXJzLmxvY2spOwotCWlmICghbGlzdF9lbXB0eSgmdW51c2VkX3BlZXJzLmxpc3QpKSB7Ci0JCV9fdTMyIGRlbHRhOwotCi0JCXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ1bnVzZWRfcGVlcnMubGlzdCwgc3RydWN0IGluZXRfcGVlciwgdW51c2VkKTsKLQkJZGVsdGEgPSAoX191MzIpamlmZmllcyAtIHAtPmR0aW1lOwotCi0JCWlmIChkZWx0YSA8IHR0bCkgewotCQkJLyogRG8gbm90IHBydW5lIGZyZXNoIGVudHJpZXMuICovCi0JCQlzcGluX3VubG9ja19iaCgmdW51c2VkX3BlZXJzLmxvY2spOwotCQkJcmV0dXJuIC0xOworCWlmIChiYXNlLT50b3RhbCA+PSBpbmV0X3BlZXJfdGhyZXNob2xkKQorCQl0dGwgPSAwOyAvKiBiZSBhZ2dyZXNzaXZlICovCisJZWxzZQorCQl0dGwgPSBpbmV0X3BlZXJfbWF4dHRsCisJCQkJLSAoaW5ldF9wZWVyX21heHR0bCAtIGluZXRfcGVlcl9taW50dGwpIC8gSFogKgorCQkJCQliYXNlLT50b3RhbCAvIGluZXRfcGVlcl90aHJlc2hvbGQgKiBIWjsKKwlzdGFja3B0ci0tOyAvKiBsYXN0IHN0YWNrIHNsb3QgaXMgcGVlcl9hdmxfZW1wdHkgKi8KKwl3aGlsZSAoc3RhY2twdHIgPiBzdGFjaykgeworCQlzdGFja3B0ci0tOworCQlwID0gcmN1X2RlcmVmX2xvY2tlZCgqKnN0YWNrcHRyLCBiYXNlKTsKKwkJaWYgKGF0b21pY19yZWFkKCZwLT5yZWZjbnQpID09IDApIHsKKwkJCXNtcF9ybWIoKTsKKwkJCWRlbHRhID0gKF9fdTMyKWppZmZpZXMgLSBwLT5kdGltZTsKKwkJCWlmIChkZWx0YSA+PSB0dGwgJiYKKwkJCSAgICBhdG9taWNfY21weGNoZygmcC0+cmVmY250LCAwLCAtMSkgPT0gMCkgeworCQkJCXAtPmdjX25leHQgPSBnY2hlYWQ7CisJCQkJZ2NoZWFkID0gcDsKKwkJCX0KIAkJfQotCi0JCWxpc3RfZGVsX2luaXQoJnAtPnVudXNlZCk7Ci0KLQkJLyogR3JhYiBhbiBleHRyYSByZWZlcmVuY2UgdG8gcHJldmVudCBub2RlIGRpc2FwcGVhcmluZwotCQkgKiBiZWZvcmUgdW5saW5rX2Zyb21fcG9vbCgpIGNhbGwuICovCi0JCWF0b21pY19pbmMoJnAtPnJlZmNudCk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZ1bnVzZWRfcGVlcnMubG9jayk7Ci0KLQlpZiAocCA9PSBOVUxMKQotCQkvKiBJdCBtZWFucyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgVVNFRCBlbnRyaWVzIGhhcwotCQkgKiBncm93biBvdmVyIGluZXRfcGVlcl90aHJlc2hvbGQuICBJdCBzaG91bGRuJ3QgcmVhbGx5Ci0JCSAqIGhhcHBlbiBiZWNhdXNlIG9mIGVudHJ5IGxpbWl0cyBpbiByb3V0ZSBjYWNoZS4gKi8KLQkJcmV0dXJuIC0xOwotCi0JdW5saW5rX2Zyb21fcG9vbChwLCBwZWVyX3RvX2Jhc2UocCksIHN0YWNrKTsKLQlyZXR1cm4gMDsKKwl3aGlsZSAoKHAgPSBnY2hlYWQpICE9IE5VTEwpIHsKKwkJZ2NoZWFkID0gcC0+Z2NfbmV4dDsKKwkJY250Kys7CisJCXVubGlua19mcm9tX3Bvb2wocCwgYmFzZSwgc3RhY2spOworCX0KKwlyZXR1cm4gY250OwogfQogCi0vKiBDYWxsZWQgd2l0aCBvciB3aXRob3V0IGxvY2FsIEJIIGJlaW5nIGRpc2FibGVkLiAqLwotc3RydWN0IGluZXRfcGVlciAqaW5ldF9nZXRwZWVyKHN0cnVjdCBpbmV0cGVlcl9hZGRyICpkYWRkciwgaW50IGNyZWF0ZSkKK3N0cnVjdCBpbmV0X3BlZXIgKmluZXRfZ2V0cGVlcihjb25zdCBzdHJ1Y3QgaW5ldHBlZXJfYWRkciAqZGFkZHIsIGludCBjcmVhdGUpCiB7CiAJc3RydWN0IGluZXRfcGVlciBfX3JjdSAqKnN0YWNrW1BFRVJfTUFYREVQVEhdLCAqKipzdGFja3B0cjsKIAlzdHJ1Y3QgaW5ldF9wZWVyX2Jhc2UgKmJhc2UgPSBmYW1pbHlfdG9fYmFzZShkYWRkci0+ZmFtaWx5KTsKIAlzdHJ1Y3QgaW5ldF9wZWVyICpwOwogCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKLQlpbnQgaW52YWxpZGF0ZWQsIG5ld3JlZmNudCA9IDA7CisJaW50IGludmFsaWRhdGVkLCBnY2NudCA9IDA7CiAKLQkvKiBMb29rIHVwIGZvciB0aGUgYWRkcmVzcyBxdWlja2x5LCBsb2NrbGVzcy4KKwkvKiBBdHRlbXB0IGEgbG9ja2xlc3MgbG9va3VwIGZpcnN0LgogCSAqIEJlY2F1c2Ugb2YgYSBjb25jdXJyZW50IHdyaXRlciwgd2UgbWlnaHQgbm90IGZpbmQgYW4gZXhpc3RpbmcgZW50cnkuCiAJICovCiAJcmN1X3JlYWRfbG9jaygpOwogCXNlcXVlbmNlID0gcmVhZF9zZXFiZWdpbigmYmFzZS0+bG9jayk7Ci0JcCA9IGxvb2t1cF9yY3UoZGFkZHIsIGJhc2UsICZuZXdyZWZjbnQpOworCXAgPSBsb29rdXBfcmN1KGRhZGRyLCBiYXNlKTsKIAlpbnZhbGlkYXRlZCA9IHJlYWRfc2VxcmV0cnkoJmJhc2UtPmxvY2ssIHNlcXVlbmNlKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCWlmIChwKSB7Ci1mb3VuZDoJCS8qIFRoZSBleGlzdGluZyBub2RlIGhhcyBiZWVuIGZvdW5kLgotCQkgKiBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdW51c2VkIGxpc3QgaWYgaXQgd2FzIHRoZXJlLgotCQkgKi8KLQkJaWYgKG5ld3JlZmNudCA9PSAxKQotCQkJdW5saW5rX2Zyb21fdW51c2VkKHApOworCWlmIChwKQogCQlyZXR1cm4gcDsKLQl9CiAKIAkvKiBJZiBubyB3cml0ZXIgZGlkIGEgY2hhbmdlIGR1cmluZyBvdXIgbG9va3VwLCB3ZSBjYW4gcmV0dXJuIGVhcmx5LiAqLwogCWlmICghY3JlYXRlICYmICFpbnZhbGlkYXRlZCkKQEAgLTUwNiwxOCArNDE5LDI3IEBACiAJICogQXQgbGVhc3QsIG5vZGVzIHNob3VsZCBiZSBob3QgaW4gb3VyIGNhY2hlLgogCSAqLwogCXdyaXRlX3NlcWxvY2tfYmgoJmJhc2UtPmxvY2spOworcmVsb29rdXA6CiAJcCA9IGxvb2t1cChkYWRkciwgc3RhY2ssIGJhc2UpOwogCWlmIChwICE9IHBlZXJfYXZsX2VtcHR5KSB7Ci0JCW5ld3JlZmNudCA9IGF0b21pY19pbmNfcmV0dXJuKCZwLT5yZWZjbnQpOworCQlhdG9taWNfaW5jKCZwLT5yZWZjbnQpOwogCQl3cml0ZV9zZXF1bmxvY2tfYmgoJmJhc2UtPmxvY2spOwotCQlnb3RvIGZvdW5kOworCQlyZXR1cm4gcDsKKwl9CisJaWYgKCFnY2NudCkgeworCQlnY2NudCA9IGluZXRfcGVlcl9nYyhiYXNlLCBzdGFjaywgc3RhY2twdHIpOworCQlpZiAoZ2NjbnQgJiYgY3JlYXRlKQorCQkJZ290byByZWxvb2t1cDsKIAl9CiAJcCA9IGNyZWF0ZSA/IGttZW1fY2FjaGVfYWxsb2MocGVlcl9jYWNoZXAsIEdGUF9BVE9NSUMpIDogTlVMTDsKIAlpZiAocCkgewogCQlwLT5kYWRkciA9ICpkYWRkcjsKIAkJYXRvbWljX3NldCgmcC0+cmVmY250LCAxKTsKIAkJYXRvbWljX3NldCgmcC0+cmlkLCAwKTsKLQkJYXRvbWljX3NldCgmcC0+aXBfaWRfY291bnQsIHNlY3VyZV9pcF9pZChkYWRkci0+YWRkci5hNCkpOworCQlhdG9taWNfc2V0KCZwLT5pcF9pZF9jb3VudCwKKwkJCQkoZGFkZHItPmZhbWlseSA9PSBBRl9JTkVUKSA/CisJCQkJCXNlY3VyZV9pcF9pZChkYWRkci0+YWRkci5hNCkgOgorCQkJCQlzZWN1cmVfaXB2Nl9pZChkYWRkci0+YWRkci5hNikpOwogCQlwLT50Y3BfdHNfc3RhbXAgPSAwOwogCQlwLT5tZXRyaWNzW1JUQVhfTE9DSy0xXSA9IElORVRQRUVSX01FVFJJQ1NfTkVXOwogCQlwLT5yYXRlX3Rva2VucyA9IDA7CkBAIC01MjUsNyArNDQ3LDYgQEAKIAkJcC0+cG10dV9leHBpcmVzID0gMDsKIAkJcC0+cG10dV9vcmlnID0gMDsKIAkJbWVtc2V0KCZwLT5yZWRpcmVjdF9sZWFybmVkLCAwLCBzaXplb2YocC0+cmVkaXJlY3RfbGVhcm5lZCkpOwotCQlJTklUX0xJU1RfSEVBRCgmcC0+dW51c2VkKTsKIAogCiAJCS8qIExpbmsgdGhlIG5vZGUuICovCkBAIC01MzQsNjMgKzQ1NSwxNSBAQAogCX0KIAl3cml0ZV9zZXF1bmxvY2tfYmgoJmJhc2UtPmxvY2spOwogCi0JaWYgKGJhc2UtPnRvdGFsID49IGluZXRfcGVlcl90aHJlc2hvbGQpCi0JCS8qIFJlbW92ZSBvbmUgbGVzcy1yZWNlbnRseS11c2VkIGVudHJ5LiAqLwotCQljbGVhbnVwX29uY2UoMCwgc3RhY2spOwotCiAJcmV0dXJuIHA7CiB9Ci0KLXN0YXRpYyBpbnQgY29tcHV0ZV90b3RhbCh2b2lkKQotewotCXJldHVybiB2NF9wZWVycy50b3RhbCArIHY2X3BlZXJzLnRvdGFsOwotfQogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF9nZXRwZWVyKTsKIAotLyogQ2FsbGVkIHdpdGggbG9jYWwgQkggZGlzYWJsZWQuICovCi1zdGF0aWMgdm9pZCBwZWVyX2NoZWNrX2V4cGlyZSh1bnNpZ25lZCBsb25nIGR1bW15KQotewotCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQlpbnQgdHRsLCB0b3RhbDsKLQlzdHJ1Y3QgaW5ldF9wZWVyIF9fcmN1ICoqc3RhY2tbUEVFUl9NQVhERVBUSF07Ci0KLQl0b3RhbCA9IGNvbXB1dGVfdG90YWwoKTsKLQlpZiAodG90YWwgPj0gaW5ldF9wZWVyX3RocmVzaG9sZCkKLQkJdHRsID0gaW5ldF9wZWVyX21pbnR0bDsKLQllbHNlCi0JCXR0bCA9IGluZXRfcGVlcl9tYXh0dGwKLQkJCQktIChpbmV0X3BlZXJfbWF4dHRsIC0gaW5ldF9wZWVyX21pbnR0bCkgLyBIWiAqCi0JCQkJCXRvdGFsIC8gaW5ldF9wZWVyX3RocmVzaG9sZCAqIEhaOwotCXdoaWxlICghY2xlYW51cF9vbmNlKHR0bCwgc3RhY2spKSB7Ci0JCWlmIChqaWZmaWVzICE9IG5vdykKLQkJCWJyZWFrOwotCX0KLQotCS8qIFRyaWdnZXIgdGhlIHRpbWVyIGFmdGVyIGluZXRfcGVlcl9nY19taW50aW1lIC4uIGluZXRfcGVlcl9nY19tYXh0aW1lCi0JICogaW50ZXJ2YWwgZGVwZW5kaW5nIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyAobW9yZSBlbnRyaWVzLAotCSAqIGxlc3MgaW50ZXJ2YWwpLiAqLwotCXRvdGFsID0gY29tcHV0ZV90b3RhbCgpOwotCWlmICh0b3RhbCA+PSBpbmV0X3BlZXJfdGhyZXNob2xkKQotCQlwZWVyX3BlcmlvZGljX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgaW5ldF9wZWVyX2djX21pbnRpbWU7Ci0JZWxzZQotCQlwZWVyX3BlcmlvZGljX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzCi0JCQkrIGluZXRfcGVlcl9nY19tYXh0aW1lCi0JCQktIChpbmV0X3BlZXJfZ2NfbWF4dGltZSAtIGluZXRfcGVlcl9nY19taW50aW1lKSAvIEhaICoKLQkJCQl0b3RhbCAvIGluZXRfcGVlcl90aHJlc2hvbGQgKiBIWjsKLQlhZGRfdGltZXIoJnBlZXJfcGVyaW9kaWNfdGltZXIpOwotfQotCiB2b2lkIGluZXRfcHV0cGVlcihzdHJ1Y3QgaW5ldF9wZWVyICpwKQogewotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQotCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZwLT5yZWZjbnQsICZ1bnVzZWRfcGVlcnMubG9jaykpIHsKLQkJbGlzdF9hZGRfdGFpbCgmcC0+dW51c2VkLCAmdW51c2VkX3BlZXJzLmxpc3QpOwotCQlwLT5kdGltZSA9IChfX3UzMilqaWZmaWVzOwotCQlzcGluX3VubG9jaygmdW51c2VkX3BlZXJzLmxvY2spOwotCX0KLQotCWxvY2FsX2JoX2VuYWJsZSgpOworCXAtPmR0aW1lID0gKF9fdTMyKWppZmZpZXM7CisJc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpOworCWF0b21pY19kZWMoJnAtPnJlZmNudCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpbmV0X3B1dHBlZXIpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9mcmFnbWVudC5jIGIvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYwppbmRleCAwYWQ2MDM1Li4wZTBhYjk4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9mcmFnbWVudC5jCisrKyBiL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKQEAgLTI2MSw4ICsyNjEsOSBAQAogCQkgKiBPbmx5IGFuIGVuZCBob3N0IG5lZWRzIHRvIHNlbmQgYW4gSUNNUAogCQkgKiAiRnJhZ21lbnQgUmVhc3NlbWJseSBUaW1lb3V0IiBtZXNzYWdlLCBwZXIgUkZDNzkyLgogCQkgKi8KLQkJaWYgKHFwLT51c2VyID09IElQX0RFRlJBR19DT05OVFJBQ0tfSU4gJiYKLQkJICAgIHNrYl9ydGFibGUoaGVhZCktPnJ0X3R5cGUgIT0gUlROX0xPQ0FMKQorCQlpZiAocXAtPnVzZXIgPT0gSVBfREVGUkFHX0FGX1BBQ0tFVCB8fAorCQkgICAgKHFwLT51c2VyID09IElQX0RFRlJBR19DT05OVFJBQ0tfSU4gJiYKKwkJICAgICBza2JfcnRhYmxlKGhlYWQpLT5ydF90eXBlICE9IFJUTl9MT0NBTCkpCiAJCQlnb3RvIG91dF9yY3VfdW5sb2NrOwogCiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2dyZS5jIGIvbmV0L2lwdjQvaXBfZ3JlLmMKaW5kZXggODg3MTA2Ny4uZDdiYjk0YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZ3JlLmMKKysrIGIvbmV0L2lwdjQvaXBfZ3JlLmMKQEAgLTczMSw5ICs3MzEsOSBAQAogCQl9CiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCiAJCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKKwkJCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoc2tiX2RzdChza2IpKTsKIAkJCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcjY7CiAJCQlpbnQgYWRkcl90eXBlOwotCQkJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBza2JfZHN0KHNrYiktPm5laWdoYm91cjsKIAogCQkJaWYgKG5laWdoID09IE5VTEwpCiAJCQkJZ290byB0eF9lcnJvcjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2lucHV0LmMgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCmluZGV4IGM4ZjQ4ZWYuLjA3M2E5YjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfaW5wdXQuYwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJCSAgICAoIXNrLT5za19ib3VuZF9kZXZfaWYgfHwKIAkJICAgICBzay0+c2tfYm91bmRfZGV2X2lmID09IGRldi0+aWZpbmRleCkgJiYKIAkJICAgIG5ldF9lcShzb2NrX25ldChzayksIGRldl9uZXQoZGV2KSkpIHsKLQkJCWlmIChpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpIHsKKwkJCWlmIChpcF9pc19mcmFnbWVudChpcF9oZHIoc2tiKSkpIHsKIAkJCQlpZiAoaXBfZGVmcmFnKHNrYiwgSVBfREVGUkFHX0NBTExfUkFfQ0hBSU4pKQogCQkJCQlyZXR1cm4gMTsKIAkJCX0KQEAgLTI1Niw3ICsyNTYsNyBAQAogCSAqCVJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzLgogCSAqLwogCi0JaWYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkgeworCWlmIChpcF9pc19mcmFnbWVudChpcF9oZHIoc2tiKSkpIHsKIAkJaWYgKGlwX2RlZnJhZyhza2IsIElQX0RFRlJBR19MT0NBTF9ERUxJVkVSKSkKIAkJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX291dHB1dC5jIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKaW5kZXggOThhZjM2OS4uY2NhYWE4NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKQEAgLTE4Miw2ICsxODIsNyBAQAogCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKilkc3Q7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRzdC0+ZGV2OwogCXVuc2lnbmVkIGludCBoaF9sZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOwogCiAJaWYgKHJ0LT5ydF90eXBlID09IFJUTl9NVUxUSUNBU1QpIHsKIAkJSVBfVVBEX1BPX1NUQVRTKGRldl9uZXQoZGV2KSwgSVBTVEFUU19NSUJfT1VUTUNBU1QsIHNrYi0+bGVuKTsKQEAgLTIwMywxMCArMjA0LDkgQEAKIAkJc2tiID0gc2tiMjsKIAl9CiAKLQlpZiAoZHN0LT5oaCkKLQkJcmV0dXJuIG5laWdoX2hoX291dHB1dChkc3QtPmhoLCBza2IpOwotCWVsc2UgaWYgKGRzdC0+bmVpZ2hib3VyKQotCQlyZXR1cm4gZHN0LT5uZWlnaGJvdXItPm91dHB1dChza2IpOworCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwlpZiAobmVpZ2gpCisJCXJldHVybiBuZWlnaF9vdXRwdXQobmVpZ2gsIHNrYik7CiAKIAlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQlwcmludGsoS0VSTl9ERUJVRyAiaXBfZmluaXNoX291dHB1dDI6IE5vIGhlYWRlciBjYWNoZSBhbmQgbm8gbmVpZ2hib3VyIVxuIik7CkBAIC00ODksNyArNDg5LDcgQEAKIAogCQlpZiAoZmlyc3RfbGVuIC0gaGxlbiA+IG10dSB8fAogCQkgICAgKChmaXJzdF9sZW4gLSBobGVuKSAmIDcpIHx8Ci0JCSAgICAoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GfElQX09GRlNFVCkpIHx8CisJCSAgICBpcF9pc19mcmFnbWVudChpcGgpIHx8CiAJCSAgICBza2JfY2xvbmVkKHNrYikpCiAJCQlnb3RvIHNsb3dfcGF0aDsKIApAQCAtNzM0LDcgKzczNCw3IEBACiAJCQlpbnQgZ2V0ZnJhZyh2b2lkICpmcm9tLCBjaGFyICp0bywgaW50IG9mZnNldCwgaW50IGxlbiwKIAkJCSAgICAgICBpbnQgb2RkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSwKIAkJCXZvaWQgKmZyb20sIGludCBsZW5ndGgsIGludCBoaF9sZW4sIGludCBmcmFnaGVhZGVybGVuLAotCQkJaW50IHRyYW5zaGRybGVuLCBpbnQgbXR1LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCisJCQlpbnQgdHJhbnNoZHJsZW4sIGludCBtYXhmcmFnbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgZXJyOwpAQCAtNzY3LDcgKzc2Nyw3IEBACiAJCXNrYi0+Y3N1bSA9IDA7CiAKIAkJLyogc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIGVhY2ggSVAgZGF0YWdyYW0gZnJhZ21lbnQgKi8KLQkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IG10dSAtIGZyYWdoZWFkZXJsZW47CisJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPSBtYXhmcmFnbGVuIC0gZnJhZ2hlYWRlcmxlbjsKIAkJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9IFNLQl9HU09fVURQOwogCQlfX3NrYl9xdWV1ZV90YWlsKHF1ZXVlLCBza2IpOwogCX0KQEAgLTc5OSw5ICs3OTksOSBAQAogCWludCBjc3VtbW9kZSA9IENIRUNLU1VNX05PTkU7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKWNvcmstPmRzdDsKIAotCWV4dGhkcmxlbiA9IHRyYW5zaGRybGVuID8gcnQtPmRzdC5oZWFkZXJfbGVuIDogMDsKLQlsZW5ndGggKz0gZXh0aGRybGVuOwotCXRyYW5zaGRybGVuICs9IGV4dGhkcmxlbjsKKwlza2IgPSBza2JfcGVla190YWlsKHF1ZXVlKTsKKworCWV4dGhkcmxlbiA9ICFza2IgPyBydC0+ZHN0LmhlYWRlcl9sZW4gOiAwOwogCW10dSA9IGNvcmstPmZyYWdzaXplOwogCiAJaGhfbGVuID0gTExfUkVTRVJWRURfU1BBQ0UocnQtPmRzdC5kZXYpOwpAQCAtODI1LDE1ICs4MjUsMTMgQEAKIAkgICAgIWV4dGhkcmxlbikKIAkJY3N1bW1vZGUgPSBDSEVDS1NVTV9QQVJUSUFMOwogCi0Jc2tiID0gc2tiX3BlZWtfdGFpbChxdWV1ZSk7Ci0KIAljb3JrLT5sZW5ndGggKz0gbGVuZ3RoOwogCWlmICgoKGxlbmd0aCA+IG10dSkgfHwgKHNrYiAmJiBza2JfaXNfZ3NvKHNrYikpKSAmJgogCSAgICAoc2stPnNrX3Byb3RvY29sID09IElQUFJPVE9fVURQKSAmJgotCSAgICAocnQtPmRzdC5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9VRk8pKSB7CisJICAgIChydC0+ZHN0LmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1VGTykgJiYgIXJ0LT5kc3QuaGVhZGVyX2xlbikgewogCQllcnIgPSBpcF91Zm9fYXBwZW5kX2RhdGEoc2ssIHF1ZXVlLCBnZXRmcmFnLCBmcm9tLCBsZW5ndGgsCiAJCQkJCSBoaF9sZW4sIGZyYWdoZWFkZXJsZW4sIHRyYW5zaGRybGVuLAotCQkJCQkgbXR1LCBmbGFncyk7CisJCQkJCSBtYXhmcmFnbGVuLCBmbGFncyk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycm9yOwogCQlyZXR1cm4gMDsKQEAgLTg4MywxNyArODgxLDE2IEBACiAJCQllbHNlCiAJCQkJYWxsb2NsZW4gPSBmcmFnbGVuOwogCisJCQlhbGxvY2xlbiArPSBleHRoZHJsZW47CisKIAkJCS8qIFRoZSBsYXN0IGZyYWdtZW50IGdldHMgYWRkaXRpb25hbCBzcGFjZSBhdCB0YWlsLgogCQkJICogTm90ZSwgd2l0aCBNU0dfTU9SRSB3ZSBvdmVyYWxsb2NhdGUgb24gZnJhZ21lbnRzLAogCQkJICogYmVjYXVzZSB3ZSBoYXZlIG5vIGlkZWEgd2hhdCBmcmFnbWVudCB3aWxsIGJlCiAJCQkgKiB0aGUgbGFzdC4KIAkJCSAqLwotCQkJaWYgKGRhdGFsZW4gPT0gbGVuZ3RoICsgZnJhZ2dhcCkgeworCQkJaWYgKGRhdGFsZW4gPT0gbGVuZ3RoICsgZnJhZ2dhcCkKIAkJCQlhbGxvY2xlbiArPSBydC0+ZHN0LnRyYWlsZXJfbGVuOwotCQkJCS8qIG1ha2Ugc3VyZSBtdHUgaXMgbm90IHJlYWNoZWQgKi8KLQkJCQlpZiAoZGF0YWxlbiA+IG10dSAtIGZyYWdoZWFkZXJsZW4gLSBydC0+ZHN0LnRyYWlsZXJfbGVuKQotCQkJCQlkYXRhbGVuIC09IEFMSUdOKHJ0LT5kc3QudHJhaWxlcl9sZW4sIDgpOwotCQkJfQorCiAJCQlpZiAodHJhbnNoZHJsZW4pIHsKIAkJCQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLAogCQkJCQkJYWxsb2NsZW4gKyBoaF9sZW4gKyAxNSwKQEAgLTkyNiwxMSArOTIzLDExIEBACiAJCQkvKgogCQkJICoJRmluZCB3aGVyZSB0byBzdGFydCBwdXR0aW5nIGJ5dGVzLgogCQkJICovCi0JCQlkYXRhID0gc2tiX3B1dChza2IsIGZyYWdsZW4pOworCQkJZGF0YSA9IHNrYl9wdXQoc2tiLCBmcmFnbGVuICsgZXh0aGRybGVuKTsKIAkJCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBleHRoZHJsZW4pOwogCQkJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gKHNrYi0+bmV0d29ya19oZWFkZXIgKwogCQkJCQkJIGZyYWdoZWFkZXJsZW4pOwotCQkJZGF0YSArPSBmcmFnaGVhZGVybGVuOworCQkJZGF0YSArPSBmcmFnaGVhZGVybGVuICsgZXh0aGRybGVuOwogCiAJCQlpZiAoZnJhZ2dhcCkgewogCQkJCXNrYi0+Y3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoCkBAIC0xMDY0LDcgKzEwNjEsNyBAQAogCSAqLwogCSpydHAgPSBOVUxMOwogCWNvcmstPmZyYWdzaXplID0gaW5ldC0+cG10dWRpc2MgPT0gSVBfUE1UVURJU0NfUFJPQkUgPwotCQkJIHJ0LT5kc3QuZGV2LT5tdHUgOiBkc3RfbXR1KHJ0LT5kc3QucGF0aCk7CisJCQkgcnQtPmRzdC5kZXYtPm10dSA6IGRzdF9tdHUoJnJ0LT5kc3QpOwogCWNvcmstPmRzdCA9ICZydC0+ZHN0OwogCWNvcmstPmxlbmd0aCA9IDA7CiAJY29yay0+dHhfZmxhZ3MgPSBpcGMtPnR4X2ZsYWdzOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBjb25maWcuYyBiL25ldC9pcHY0L2lwY29uZmlnLmMKaW5kZXggYWI3ZTU1NC4uNDcyYThjNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBjb25maWcuYworKysgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCkBAIC04NjEsNDEgKzg2MSw0NCBAQAogI2VuZGlmCiAKIAlzd2l0Y2ggKCpleHQrKykgewotCQljYXNlIDE6CQkvKiBTdWJuZXQgbWFzayAqLwotCQkJaWYgKGljX25ldG1hc2sgPT0gTk9ORSkKLQkJCQltZW1jcHkoJmljX25ldG1hc2ssIGV4dCsxLCA0KTsKLQkJCWJyZWFrOwotCQljYXNlIDM6CQkvKiBEZWZhdWx0IGdhdGV3YXkgKi8KLQkJCWlmIChpY19nYXRld2F5ID09IE5PTkUpCi0JCQkJbWVtY3B5KCZpY19nYXRld2F5LCBleHQrMSwgNCk7Ci0JCQlicmVhazsKLQkJY2FzZSA2OgkJLyogRE5TIHNlcnZlciAqLwotCQkJc2VydmVycz0gKmV4dC80OwotCQkJaWYgKHNlcnZlcnMgPiBDT05GX05BTUVTRVJWRVJTX01BWCkKLQkJCQlzZXJ2ZXJzID0gQ09ORl9OQU1FU0VSVkVSU19NQVg7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc2VydmVyczsgaSsrKSB7Ci0JCQkJaWYgKGljX25hbWVzZXJ2ZXJzW2ldID09IE5PTkUpCi0JCQkJCW1lbWNweSgmaWNfbmFtZXNlcnZlcnNbaV0sIGV4dCsxKzQqaSwgNCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoJLyogSG9zdCBuYW1lICovCi0JCQlpY19ib290cF9zdHJpbmcodXRzbmFtZSgpLT5ub2RlbmFtZSwgZXh0KzEsICpleHQsIF9fTkVXX1VUU19MRU4pOwotCQkJaWNfaG9zdF9uYW1lX3NldCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAxNToJLyogRG9tYWluIG5hbWUgKEROUykgKi8KLQkJCWljX2Jvb3RwX3N0cmluZyhpY19kb21haW4sIGV4dCsxLCAqZXh0LCBzaXplb2YoaWNfZG9tYWluKSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxNzoJLyogUm9vdCBwYXRoICovCi0JCQlpZiAoIXJvb3Rfc2VydmVyX3BhdGhbMF0pCi0JCQkJaWNfYm9vdHBfc3RyaW5nKHJvb3Rfc2VydmVyX3BhdGgsIGV4dCsxLCAqZXh0LCBzaXplb2Yocm9vdF9zZXJ2ZXJfcGF0aCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjY6CS8qIEludGVyZmFjZSBNVFUgKi8KLQkJCW1lbWNweSgmbXR1LCBleHQrMSwgc2l6ZW9mKG10dSkpOwotCQkJaWNfZGV2X210dSA9IG50b2hzKG10dSk7Ci0JCQlicmVhazsKLQkJY2FzZSA0MDoJLyogTklTIERvbWFpbiBuYW1lIChfbm90XyBETlMpICovCi0JCQlpY19ib290cF9zdHJpbmcodXRzbmFtZSgpLT5kb21haW5uYW1lLCBleHQrMSwgKmV4dCwgX19ORVdfVVRTX0xFTik7Ci0JCQlicmVhazsKKwljYXNlIDE6CQkvKiBTdWJuZXQgbWFzayAqLworCQlpZiAoaWNfbmV0bWFzayA9PSBOT05FKQorCQkJbWVtY3B5KCZpY19uZXRtYXNrLCBleHQrMSwgNCk7CisJCWJyZWFrOworCWNhc2UgMzoJCS8qIERlZmF1bHQgZ2F0ZXdheSAqLworCQlpZiAoaWNfZ2F0ZXdheSA9PSBOT05FKQorCQkJbWVtY3B5KCZpY19nYXRld2F5LCBleHQrMSwgNCk7CisJCWJyZWFrOworCWNhc2UgNjoJCS8qIEROUyBzZXJ2ZXIgKi8KKwkJc2VydmVycz0gKmV4dC80OworCQlpZiAoc2VydmVycyA+IENPTkZfTkFNRVNFUlZFUlNfTUFYKQorCQkJc2VydmVycyA9IENPTkZfTkFNRVNFUlZFUlNfTUFYOworCQlmb3IgKGkgPSAwOyBpIDwgc2VydmVyczsgaSsrKSB7CisJCQlpZiAoaWNfbmFtZXNlcnZlcnNbaV0gPT0gTk9ORSkKKwkJCQltZW1jcHkoJmljX25hbWVzZXJ2ZXJzW2ldLCBleHQrMSs0KmksIDQpOworCQl9CisJCWJyZWFrOworCWNhc2UgMTI6CS8qIEhvc3QgbmFtZSAqLworCQlpY19ib290cF9zdHJpbmcodXRzbmFtZSgpLT5ub2RlbmFtZSwgZXh0KzEsICpleHQsCisJCQkJX19ORVdfVVRTX0xFTik7CisJCWljX2hvc3RfbmFtZV9zZXQgPSAxOworCQlicmVhazsKKwljYXNlIDE1OgkvKiBEb21haW4gbmFtZSAoRE5TKSAqLworCQlpY19ib290cF9zdHJpbmcoaWNfZG9tYWluLCBleHQrMSwgKmV4dCwgc2l6ZW9mKGljX2RvbWFpbikpOworCQlicmVhazsKKwljYXNlIDE3OgkvKiBSb290IHBhdGggKi8KKwkJaWYgKCFyb290X3NlcnZlcl9wYXRoWzBdKQorCQkJaWNfYm9vdHBfc3RyaW5nKHJvb3Rfc2VydmVyX3BhdGgsIGV4dCsxLCAqZXh0LAorCQkJCQlzaXplb2Yocm9vdF9zZXJ2ZXJfcGF0aCkpOworCQlicmVhazsKKwljYXNlIDI2OgkvKiBJbnRlcmZhY2UgTVRVICovCisJCW1lbWNweSgmbXR1LCBleHQrMSwgc2l6ZW9mKG10dSkpOworCQlpY19kZXZfbXR1ID0gbnRvaHMobXR1KTsKKwkJYnJlYWs7CisJY2FzZSA0MDoJLyogTklTIERvbWFpbiBuYW1lIChfbm90XyBETlMpICovCisJCWljX2Jvb3RwX3N0cmluZyh1dHNuYW1lKCktPmRvbWFpbm5hbWUsIGV4dCsxLCAqZXh0LAorCQkJCV9fTkVXX1VUU19MRU4pOworCQlicmVhazsKIAl9CiB9CiAKQEAgLTkzMiw3ICs5MzUsNyBAQAogCQlnb3RvIGRyb3A7CiAKIAkvKiBGcmFnbWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KLQlpZiAoaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQgfCBJUF9NRikpIHsKKwlpZiAoaXBfaXNfZnJhZ21lbnQoaCkpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCXByaW50ayhLRVJOX0VSUiAiREhDUC9CT09UUDogSWdub3JpbmcgZnJhZ21lbnRlZCAiCiAJCQkgICAgICAgInJlcGx5LlxuIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcG1yLmMgYi9uZXQvaXB2NC9pcG1yLmMKaW5kZXggMzBhNzc2My4uNThlODc5MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBtci5jCisrKyBiL25ldC9pcHY0L2lwbXIuYwpAQCAtMTc5Niw3ICsxNzk2LDcgQEAKIAlzdHJ1Y3QgZmxvd2k0IGZsNCA9IHsKIAkJLmRhZGRyID0gaXBoLT5kYWRkciwKIAkJLnNhZGRyID0gaXBoLT5zYWRkciwKLQkJLmZsb3dpNF90b3MgPSBpcGgtPnRvcywKKwkJLmZsb3dpNF90b3MgPSBSVF9UT1MoaXBoLT50b3MpLAogCQkuZmxvd2k0X29pZiA9IHJ0LT5ydF9vaWYsCiAJCS5mbG93aTRfaWlmID0gcnQtPnJ0X2lpZiwKIAkJLmZsb3dpNF9tYXJrID0gcnQtPnJ0X21hcmssCkBAIC0yNTQ0LDcgKzI1NDQsOCBAQAogCQlnb3RvIGFkZF9wcm90b19mYWlsOwogCX0KICNlbmRpZgotCXJ0bmxfcmVnaXN0ZXIoUlROTF9GQU1JTFlfSVBNUiwgUlRNX0dFVFJPVVRFLCBOVUxMLCBpcG1yX3J0bV9kdW1wcm91dGUpOworCXJ0bmxfcmVnaXN0ZXIoUlROTF9GQU1JTFlfSVBNUiwgUlRNX0dFVFJPVVRFLAorCQkgICAgICBOVUxMLCBpcG1yX3J0bV9kdW1wcm91dGUsIE5VTEwpOwogCXJldHVybiAwOwogCiAjaWZkZWYgQ09ORklHX0lQX1BJTVNNX1YyCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci5jCmluZGV4IDQ2MTRiYWIuLjJlOTdlM2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci5jCkBAIC0xNyw1MSArMTcsMzUgQEAKIAljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCXN0cnVjdCBydGFibGUgKnJ0OwogCXN0cnVjdCBmbG93aTQgZmw0ID0ge307Ci0JdW5zaWduZWQgbG9uZyBvcmVmZHN0OworCV9fYmUzMiBzYWRkciA9IGlwaC0+c2FkZHI7CisJX191OCBmbGFncyA9IDA7CiAJdW5zaWduZWQgaW50IGhoX2xlbjsKLQl1bnNpZ25lZCBpbnQgdHlwZTsKIAotCXR5cGUgPSBpbmV0X2FkZHJfdHlwZShuZXQsIGlwaC0+c2FkZHIpOwotCWlmIChza2ItPnNrICYmIGluZXRfc2soc2tiLT5zayktPnRyYW5zcGFyZW50KQotCQl0eXBlID0gUlROX0xPQ0FMOwotCWlmIChhZGRyX3R5cGUgPT0gUlROX1VOU1BFQykKLQkJYWRkcl90eXBlID0gdHlwZTsKKwlpZiAoIXNrYi0+c2sgJiYgYWRkcl90eXBlICE9IFJUTl9MT0NBTCkgeworCQlpZiAoYWRkcl90eXBlID09IFJUTl9VTlNQRUMpCisJCQlhZGRyX3R5cGUgPSBpbmV0X2FkZHJfdHlwZShuZXQsIHNhZGRyKTsKKwkJaWYgKGFkZHJfdHlwZSA9PSBSVE5fTE9DQUwgfHwgYWRkcl90eXBlID09IFJUTl9VTklDQVNUKQorCQkJZmxhZ3MgfD0gRkxPV0lfRkxBR19BTllTUkM7CisJCWVsc2UKKwkJCXNhZGRyID0gMDsKKwl9CiAKIAkvKiBzb21lIG5vbi1zdGFuZGFyZCBoYWNrcyBsaWtlIGlwdF9SRUpFQ1QuYzpzZW5kX3Jlc2V0KCkgY2FuIGNhdXNlCiAJICogcGFja2V0cyB3aXRoIGZvcmVpZ24gc2FkZHIgdG8gYXBwZWFyIG9uIHRoZSBORl9JTkVUX0xPQ0FMX09VVCBob29rLgogCSAqLwotCWlmIChhZGRyX3R5cGUgPT0gUlROX0xPQ0FMKSB7Ci0JCWZsNC5kYWRkciA9IGlwaC0+ZGFkZHI7Ci0JCWlmICh0eXBlID09IFJUTl9MT0NBTCkKLQkJCWZsNC5zYWRkciA9IGlwaC0+c2FkZHI7Ci0JCWZsNC5mbG93aTRfdG9zID0gUlRfVE9TKGlwaC0+dG9zKTsKLQkJZmw0LmZsb3dpNF9vaWYgPSBza2ItPnNrID8gc2tiLT5zay0+c2tfYm91bmRfZGV2X2lmIDogMDsKLQkJZmw0LmZsb3dpNF9tYXJrID0gc2tiLT5tYXJrOwotCQlmbDQuZmxvd2k0X2ZsYWdzID0gc2tiLT5zayA/IGluZXRfc2tfZmxvd2lfZmxhZ3Moc2tiLT5zaykgOiAwOwotCQlydCA9IGlwX3JvdXRlX291dHB1dF9rZXkobmV0LCAmZmw0KTsKLQkJaWYgKElTX0VSUihydCkpCi0JCQlyZXR1cm4gLTE7CisJZmw0LmRhZGRyID0gaXBoLT5kYWRkcjsKKwlmbDQuc2FkZHIgPSBzYWRkcjsKKwlmbDQuZmxvd2k0X3RvcyA9IFJUX1RPUyhpcGgtPnRvcyk7CisJZmw0LmZsb3dpNF9vaWYgPSBza2ItPnNrID8gc2tiLT5zay0+c2tfYm91bmRfZGV2X2lmIDogMDsKKwlmbDQuZmxvd2k0X21hcmsgPSBza2ItPm1hcms7CisJZmw0LmZsb3dpNF9mbGFncyA9IHNrYi0+c2sgPyBpbmV0X3NrX2Zsb3dpX2ZsYWdzKHNrYi0+c2spIDogZmxhZ3M7CisJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KG5ldCwgJmZsNCk7CisJaWYgKElTX0VSUihydCkpCisJCXJldHVybiAtMTsKIAotCQkvKiBEcm9wIG9sZCByb3V0ZS4gKi8KLQkJc2tiX2RzdF9kcm9wKHNrYik7Ci0JCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwotCX0gZWxzZSB7Ci0JCS8qIG5vbi1sb2NhbCBzcmMsIGZpbmQgdmFsaWQgaWlmIHRvIHNhdGlzZnkKLQkJICogcnAtZmlsdGVyIHdoZW4gY2FsbGluZyBpcF9yb3V0ZV9pbnB1dC4gKi8KLQkJZmw0LmRhZGRyID0gaXBoLT5zYWRkcjsKLQkJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KG5ldCwgJmZsNCk7Ci0JCWlmIChJU19FUlIocnQpKQotCQkJcmV0dXJuIC0xOwotCi0JCW9yZWZkc3QgPSBza2ItPl9za2JfcmVmZHN0OwotCQlpZiAoaXBfcm91dGVfaW5wdXQoc2tiLCBpcGgtPmRhZGRyLCBpcGgtPnNhZGRyLAotCQkJCSAgIFJUX1RPUyhpcGgtPnRvcyksIHJ0LT5kc3QuZGV2KSAhPSAwKSB7Ci0JCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwotCQlyZWZkc3RfZHJvcChvcmVmZHN0KTsKLQl9CisJLyogRHJvcCBvbGQgcm91dGUuICovCisJc2tiX2RzdF9kcm9wKHNrYik7CisJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7CiAKIAlpZiAoc2tiX2RzdChza2IpLT5lcnJvcikKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwppbmRleCBkMmMxMzExLi41YzliOWQ5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwpAQCAtMjAzLDcgKzIwMyw4IEBACiAJZWxzZQogCQlwbXNnLT5vdXRkZXZfbmFtZVswXSA9ICdcMCc7CiAKLQlpZiAoZW50cnktPmluZGV2ICYmIGVudHJ5LT5za2ItPmRldikgeworCWlmIChlbnRyeS0+aW5kZXYgJiYgZW50cnktPnNrYi0+ZGV2ICYmCisJICAgIGVudHJ5LT5za2ItPm1hY19oZWFkZXIgIT0gZW50cnktPnNrYi0+bmV0d29ya19oZWFkZXIpIHsKIAkJcG1zZy0+aHdfdHlwZSA9IGVudHJ5LT5za2ItPmRldi0+dHlwZTsKIAkJcG1zZy0+aHdfYWRkcmxlbiA9IGRldl9wYXJzZV9oZWFkZXIoZW50cnktPnNrYiwKIAkJCQkJCSAgICBwbXNnLT5od19hZGRyKTsKQEAgLTQwMiw3ICs0MDMsOCBAQAogc3RhdGljIGlubGluZSB2b2lkCiBfX2lwcV9yY3Zfc2tiKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IHN0YXR1cywgdHlwZSwgcGlkLCBmbGFncywgbmxtc2dsZW4sIHNrYmxlbjsKKwlpbnQgc3RhdHVzLCB0eXBlLCBwaWQsIGZsYWdzOworCXVuc2lnbmVkIGludCBubG1zZ2xlbiwgc2tibGVuOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCiAJc2tibGVuID0gc2tiLT5sZW47CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKaW5kZXggNzY0NzQzOC4uMjRlNTU2ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwpAQCAtNTY2LDcgKzU2Niw3IEBACiAJY29uc3Qgc3RydWN0IHh0X2VudHJ5X3RhcmdldCAqdDsKIAogCWlmICghaXBfY2hlY2tlbnRyeSgmZS0+aXApKSB7Ci0JCWR1cHJpbnRmKCJpcCBjaGVjayBmYWlsZWQgJXAgJXMuXG4iLCBlLCBwYXItPm1hdGNoLT5uYW1lKTsKKwkJZHVwcmludGYoImlwIGNoZWNrIGZhaWxlZCAlcCAlcy5cbiIsIGUsIG5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCmluZGV4IGQ2MDlhYzMuLmRiOGQyMmQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJICogZXJyb3IgbWVzc2FnZXMgKFJFTEFURUQpIGFuZCBpbmZvcm1hdGlvbiByZXF1ZXN0cyAoc2VlIGJlbG93KSAqLwogCWlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QICYmCiAJICAgIChjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCB8fAotCSAgICAgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkpCisJICAgICBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRF9SRVBMWSkpCiAJCXJldHVybiBYVF9DT05USU5VRTsKIAogCS8qIGlwX2Nvbm50cmFja19pY21wIGd1YXJhbnRlZXMgdXMgdGhhdCB3ZSBvbmx5IGhhdmUgSUNNUF9FQ0hPLApAQCAtMzE3LDE5ICszMTcsMTkgQEAKIAloYXNoID0gY2x1c3RlcmlwX2hhc2hmbihza2IsIGNpcGluZm8tPmNvbmZpZyk7CiAKIAlzd2l0Y2ggKGN0aW5mbykgewotCQljYXNlIElQX0NUX05FVzoKLQkJCWN0LT5tYXJrID0gaGFzaDsKLQkJCWJyZWFrOwotCQljYXNlIElQX0NUX1JFTEFURUQ6Ci0JCWNhc2UgSVBfQ1RfUkVMQVRFRCtJUF9DVF9JU19SRVBMWToKLQkJCS8qIEZJWE1FOiB3ZSBkb24ndCBoYW5kbGUgZXhwZWN0YXRpb25zIGF0IHRoZQotCQkJICogbW9tZW50LiAgdGhleSBjYW4gYXJyaXZlIG9uIGEgZGlmZmVyZW50IG5vZGUgdGhhbgotCQkJICogdGhlIG1hc3RlciBjb25uZWN0aW9uIChlLmcuIEZUUCBwYXNzaXZlIG1vZGUpICovCi0JCWNhc2UgSVBfQ1RfRVNUQUJMSVNIRUQ6Ci0JCWNhc2UgSVBfQ1RfRVNUQUJMSVNIRUQrSVBfQ1RfSVNfUkVQTFk6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOworCWNhc2UgSVBfQ1RfTkVXOgorCQljdC0+bWFyayA9IGhhc2g7CisJCWJyZWFrOworCWNhc2UgSVBfQ1RfUkVMQVRFRDoKKwljYXNlIElQX0NUX1JFTEFURURfUkVQTFk6CisJCS8qIEZJWE1FOiB3ZSBkb24ndCBoYW5kbGUgZXhwZWN0YXRpb25zIGF0IHRoZSBtb21lbnQuCisJCSAqIFRoZXkgY2FuIGFycml2ZSBvbiBhIGRpZmZlcmVudCBub2RlIHRoYW4KKwkJICogdGhlIG1hc3RlciBjb25uZWN0aW9uIChlLmcuIEZUUCBwYXNzaXZlIG1vZGUpICovCisJY2FzZSBJUF9DVF9FU1RBQkxJU0hFRDoKKwljYXNlIElQX0NUX0VTVEFCTElTSEVEX1JFUExZOgorCQlicmVhazsKKwlkZWZhdWx0OgkJCS8qIFByZXZlbnQgZ2NjIHdhcm5pbmdzICovCisJCWJyZWFrOwogCX0KIAogI2lmZGVmIERFQlVHCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCmluZGV4IGQyZWQ5ZGMuLjk5MzExNTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCkBAIC02MCw3ICs2MCw3IEBACiAJbmF0ID0gbmZjdF9uYXQoY3QpOwogCiAJTkZfQ1RfQVNTRVJUKGN0ICYmIChjdGluZm8gPT0gSVBfQ1RfTkVXIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEIHx8Ci0JCQkgICAgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkpOworCQkJICAgIGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEX1JFUExZKSk7CiAKIAkvKiBTb3VyY2UgYWRkcmVzcyBpcyAwLjAuMC4wIC0gbG9jYWxseSBnZW5lcmF0ZWQgcGFja2V0IHRoYXQgaXMKIAkgKiBwcm9iYWJseSBub3Qgc3VwcG9zZWQgdG8gYmUgbWFzcXVlcmFkZWQuCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYwppbmRleCAxZmY3OWU1Li41MWYxM2Y4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKQEAgLTQwLDcgKzQwLDYgQEAKIAlzdHJ1Y3QgaXBoZHIgKm5pcGg7CiAJY29uc3Qgc3RydWN0IHRjcGhkciAqb3RoOwogCXN0cnVjdCB0Y3BoZHIgX290Y3BoLCAqdGNwaDsKLQl1bnNpZ25lZCBpbnQgYWRkcl90eXBlOwogCiAJLyogSVAgaGVhZGVyIGNoZWNrczogZnJhZ21lbnQuICovCiAJaWYgKGlwX2hkcihvbGRza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX09GRlNFVCkpCkBAIC01NSw2ICs1NCw5IEBACiAJaWYgKG90aC0+cnN0KQogCQlyZXR1cm47CiAKKwlpZiAoc2tiX3J0YWJsZShvbGRza2IpLT5ydF9mbGFncyAmIChSVENGX0JST0FEQ0FTVCB8IFJUQ0ZfTVVMVElDQVNUKSkKKwkJcmV0dXJuOworCiAJLyogQ2hlY2sgY2hlY2tzdW0gKi8KIAlpZiAobmZfaXBfY2hlY2tzdW0ob2xkc2tiLCBob29rLCBpcF9oZHJsZW4ob2xkc2tiKSwgSVBQUk9UT19UQ1ApKQogCQlyZXR1cm47CkBAIC0xMDEsMTkgKzEwMywxMSBAQAogCW5za2ItPmNzdW1fc3RhcnQgPSAodW5zaWduZWQgY2hhciAqKXRjcGggLSBuc2tiLT5oZWFkOwogCW5za2ItPmNzdW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spOwogCi0JYWRkcl90eXBlID0gUlROX1VOU1BFQzsKLQlpZiAoaG9vayAhPSBORl9JTkVUX0ZPUldBUkQKLSNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgotCSAgICB8fCAobnNrYi0+bmZfYnJpZGdlICYmIG5za2ItPm5mX2JyaWRnZS0+bWFzayAmIEJSTkZfQlJJREdFRCkKLSNlbmRpZgotCSAgICkKLQkJYWRkcl90eXBlID0gUlROX0xPQ0FMOwotCiAJLyogaXBfcm91dGVfbWVfaGFyZGVyIGV4cGVjdHMgc2tiLT5kc3QgdG8gYmUgc2V0ICovCiAJc2tiX2RzdF9zZXRfbm9yZWYobnNrYiwgc2tiX2RzdChvbGRza2IpKTsKIAogCW5za2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwotCWlmIChpcF9yb3V0ZV9tZV9oYXJkZXIobnNrYiwgYWRkcl90eXBlKSkKKwlpZiAoaXBfcm91dGVfbWVfaGFyZGVyKG5za2IsIFJUTl9VTlNQRUMpKQogCQlnb3RvIGZyZWVfbnNrYjsKIAogCW5pcGgtPnR0bAk9IGlwNF9kc3RfaG9wbGltaXQoc2tiX2RzdChuc2tiKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYwppbmRleCBhZjZlOWM3Li4yYjU3ZTUyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKQEAgLTI1LDcgKzI1LDggQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBtYXRjaF9pcChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgIGNvbnN0IHN0cnVjdCBpcHRfZWNuX2luZm8gKmVpbmZvKQogewotCXJldHVybiAoaXBfaGRyKHNrYiktPnRvcyAmIElQVF9FQ05fSVBfTUFTSykgPT0gZWluZm8tPmlwX2VjdDsKKwlyZXR1cm4gKChpcF9oZHIoc2tiKS0+dG9zICYgSVBUX0VDTl9JUF9NQVNLKSA9PSBlaW5mby0+aXBfZWN0KSBeCisJICAgICAgICEhKGVpbmZvLT5pbnZlcnQgJiBJUFRfRUNOX09QX01BVENIX0lQKTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIG1hdGNoX3RjcChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtNzYsOCArNzcsNiBAQAogCQkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGluZm8tPm9wZXJhdGlvbiAmIChJUFRfRUNOX09QX01BVENIX0VDRXxJUFRfRUNOX09QX01BVENIX0NXUikpIHsKLQkJaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCkKLQkJCXJldHVybiBmYWxzZTsKIAkJaWYgKCFtYXRjaF90Y3Aoc2tiLCBpbmZvLCAmcGFyLT5ob3Rkcm9wKSkKIAkJCXJldHVybiBmYWxzZTsKIAl9CkBAIC05Nyw3ICs5Niw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGluZm8tPm9wZXJhdGlvbiAmIChJUFRfRUNOX09QX01BVENIX0VDRXxJUFRfRUNOX09QX01BVENIX0NXUikgJiYKLQkgICAgaXAtPnByb3RvICE9IElQUFJPVE9fVENQKSB7CisJICAgIChpcC0+cHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwgaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykpIHsKIAkJcHJfaW5mbygiY2Fubm90IG1hdGNoIFRDUCBiaXRzIGluIHJ1bGUgZm9yIG5vbi10Y3AgcGFja2V0c1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCmluZGV4IDVhMDNjMDIuLmRlOWRhMjEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAKIAkvKiBUaGlzIGlzIHdoZXJlIHdlIGNhbGwgdGhlIGhlbHBlcjogYXMgdGhlIHBhY2tldCBnb2VzIG91dC4gKi8KIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwotCWlmICghY3QgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkKKwlpZiAoIWN0IHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEX1JFUExZKQogCQlnb3RvIG91dDsKIAogCWhlbHAgPSBuZmN0X2hlbHAoY3QpOwpAQCAtMTIxLDcgKzEyMSw5IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHRlc3RfYml0KElQU19TRVFfQURKVVNUX0JJVCwgJmN0LT5zdGF0dXMpKSB7CisJLyogYWRqdXN0IHNlcXMgZm9yIGxvb3BiYWNrIHRyYWZmaWMgb25seSBpbiBvdXRnb2luZyBkaXJlY3Rpb24gKi8KKwlpZiAodGVzdF9iaXQoSVBTX1NFUV9BREpVU1RfQklULCAmY3QtPnN0YXR1cykgJiYKKwkgICAgIW5mX2lzX2xvb3BiYWNrX3BhY2tldChza2IpKSB7CiAJCXR5cGVvZihuZl9uYXRfc2VxX2FkanVzdF9ob29rKSBzZXFfYWRqdXN0OwogCiAJCXNlcV9hZGp1c3QgPSByY3VfZGVyZWZlcmVuY2UobmZfbmF0X3NlcV9hZGp1c3RfaG9vayk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCmluZGV4IDc0MDRiZGUuLmFiNWIyN2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkvKiBVcGRhdGUgc2tiIHRvIHJlZmVyIHRvIHRoaXMgY29ubmVjdGlvbiAqLwogCXNrYi0+bmZjdCA9ICZuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpLT5jdF9nZW5lcmFsOwogCXNrYi0+bmZjdGluZm8gPSAqY3RpbmZvOwotCXJldHVybiAtTkZfQUNDRVBUOworCXJldHVybiBORl9BQ0NFUFQ7CiB9CiAKIC8qIFNtYWxsIGFuZCBtb2RpZmllZCB2ZXJzaW9uIG9mIGljbXBfcmN2ICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfZGVmcmFnX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2NC5jCmluZGV4IGYzYTliNDIuLjliYjFiOGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2NC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2NC5jCkBAIC04Miw3ICs4Miw3IEBACiAjZW5kaWYKICNlbmRpZgogCS8qIEdhdGhlciBmcmFnbWVudHMuICovCi0JaWYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkgeworCWlmIChpcF9pc19mcmFnbWVudChpcF9oZHIoc2tiKSkpIHsKIAkJZW51bSBpcF9kZWZyYWdfdXNlcnMgdXNlciA9IG5mX2N0X2RlZnJhZ191c2VyKGhvb2tudW0sIHNrYik7CiAJCWlmIChuZl9jdF9pcHY0X2dhdGhlcl9mcmFncyhza2IsIHVzZXIpKQogCQkJcmV0dXJuIE5GX1NUT0xFTjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKaW5kZXggOWM3MWIyNy4uMzM0NmRlNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKQEAgLTQzMyw3ICs0MzMsNyBAQAogCiAJLyogTXVzdCBiZSBSRUxBVEVEICovCiAJTkZfQ1RfQVNTRVJUKHNrYi0+bmZjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCB8fAotCQkgICAgIHNrYi0+bmZjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCtJUF9DVF9JU19SRVBMWSk7CisJCSAgICAgc2tiLT5uZmN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEX1JFUExZKTsKIAogCS8qIFJlZGlyZWN0cyBvbiBub24tbnVsbCBuYXRzIG11c3QgYmUgZHJvcHBlZCwgZWxzZSB0aGV5J2xsCiAJICAgc3RhcnQgdGFsa2luZyB0byBlYWNoIG90aGVyIHdpdGhvdXQgb3VyIHRyYW5zbGF0aW9uLCBhbmQgYmUKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jCmluZGV4IDk5Y2ZhMjguLmViYzVmODggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQlpZiAoIShydC0+cnRfZmxhZ3MgJiBSVENGX0xPQ0FMKSAmJgotCQkgICAgc2tiLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9WNF9DU1VNKSB7CisJCSAgICAoIXNrYi0+ZGV2IHx8IHNrYi0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVjRfQ1NVTSkpIHsKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKIAkJCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl9oZWFkcm9vbShza2IpICsKIAkJCQkJICBza2JfbmV0d29ya19vZmZzZXQoc2tiKSArCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCmluZGV4IDIxYzMwNDIuLjczM2M5YWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCkBAIC01Myw3ICs1Myw3IEBACiAKIAkvKiBDb25uZWN0aW9uIG11c3QgYmUgdmFsaWQgYW5kIG5ldy4gKi8KIAlORl9DVF9BU1NFUlQoY3QgJiYgKGN0aW5mbyA9PSBJUF9DVF9ORVcgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQgfHwKLQkJCSAgICBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZKSk7CisJCQkgICAgY3RpbmZvID09IElQX0NUX1JFTEFURURfUkVQTFkpKTsKIAlORl9DVF9BU1NFUlQocGFyLT5vdXQgIT0gTlVMTCk7CiAKIAlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZtci0+cmFuZ2VbMF0sIElQX05BVF9NQU5JUF9TUkMpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zbm1wX2Jhc2ljLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NubXBfYmFzaWMuYwppbmRleCA4ODEyYTAyLi4wNzZiN2M4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NubXBfYmFzaWMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NubXBfYmFzaWMuYwpAQCAtNzE5LDExNyArNzE5LDExNSBAQAogCiAJbCA9IDA7CiAJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgU05NUF9JTlRFR0VSOgotCQkJbGVuID0gc2l6ZW9mKGxvbmcpOwotCQkJaWYgKCFhc24xX2xvbmdfZGVjb2RlKGN0eCwgZW5kLCAmbCkpIHsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwKLQkJCQkgICAgICAgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoKm9iaiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCSgqb2JqKS0+c3ludGF4LmxbMF0gPSBsOwotCQkJYnJlYWs7Ci0JCWNhc2UgU05NUF9PQ1RFVFNUUjoKLQkJY2FzZSBTTk1QX09QQVFVRToKLQkJCWlmICghYXNuMV9vY3RldHNfZGVjb2RlKGN0eCwgZW5kLCAmcCwgJmxlbikpIHsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwKLQkJCQkgICAgICAgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoKm9iaiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUocCk7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCW1lbWNweSgoKm9iaiktPnN5bnRheC5jLCBwLCBsZW4pOwotCQkJa2ZyZWUocCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTTk1QX05VTEw6Ci0JCWNhc2UgU05NUF9OT1NVQ0hPQkpFQ1Q6Ci0JCWNhc2UgU05NUF9OT1NVQ0hJTlNUQU5DRToKLQkJY2FzZSBTTk1QX0VORE9GTUlCVklFVzoKLQkJCWxlbiA9IDA7Ci0JCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoKm9iaiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmICghYXNuMV9udWxsX2RlY29kZShjdHgsIGVuZCkpIHsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJa2ZyZWUoKm9iaik7Ci0JCQkJKm9iaiA9IE5VTEw7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTTk1QX09CSkVDVElEOgotCQkJaWYgKCFhc24xX29pZF9kZWNvZGUoY3R4LCBlbmQsICh1bnNpZ25lZCBsb25nICoqKSZscCwgJmxlbikpIHsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlsZW4gKj0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotCQkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sIEdGUF9BVE9NSUMpOwotCQkJaWYgKCpvYmogPT0gTlVMTCkgewotCQkJCWtmcmVlKGxwKTsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQkJcHJfbm90aWNlKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJbWVtY3B5KCgqb2JqKS0+c3ludGF4LnVsLCBscCwgbGVuKTsKLQkJCWtmcmVlKGxwKTsKLQkJCWJyZWFrOwotCQljYXNlIFNOTVBfSVBBRERSOgotCQkJaWYgKCFhc24xX29jdGV0c19kZWNvZGUoY3R4LCBlbmQsICZwLCAmbGVuKSkgewotCQkJCWtmcmVlKGlkKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChsZW4gIT0gNCkgewotCQkJCWtmcmVlKHApOwotCQkJCWtmcmVlKGlkKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCSpvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpICsgbGVuLCBHRlBfQVRPTUlDKTsKLQkJCWlmICgqb2JqID09IE5VTEwpIHsKLQkJCQlrZnJlZShwKTsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQkJcHJfbm90aWNlKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJbWVtY3B5KCgqb2JqKS0+c3ludGF4LnVjLCBwLCBsZW4pOwotCQkJa2ZyZWUocCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTTk1QX0NPVU5URVI6Ci0JCWNhc2UgU05NUF9HQVVHRToKLQkJY2FzZSBTTk1QX1RJTUVUSUNLUzoKLQkJCWxlbiA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQkJCWlmICghYXNuMV91bG9uZ19kZWNvZGUoY3R4LCBlbmQsICZ1bCkpIHsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoKm9iaiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCSgqb2JqKS0+c3ludGF4LnVsWzBdID0gdWw7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKKwljYXNlIFNOTVBfSU5URUdFUjoKKwkJbGVuID0gc2l6ZW9mKGxvbmcpOworCQlpZiAoIWFzbjFfbG9uZ19kZWNvZGUoY3R4LCBlbmQsICZsKSkgewogCQkJa2ZyZWUoaWQpOwogCQkJcmV0dXJuIDA7CisJCX0KKwkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoKm9iaiA9PSBOVUxMKSB7CisJCQlrZnJlZShpZCk7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKKwkJCXJldHVybiAwOworCQl9CisJCSgqb2JqKS0+c3ludGF4LmxbMF0gPSBsOworCQlicmVhazsKKwljYXNlIFNOTVBfT0NURVRTVFI6CisJY2FzZSBTTk1QX09QQVFVRToKKwkJaWYgKCFhc24xX29jdGV0c19kZWNvZGUoY3R4LCBlbmQsICZwLCAmbGVuKSkgeworCQkJa2ZyZWUoaWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoKm9iaiA9PSBOVUxMKSB7CisJCQlrZnJlZShwKTsKKwkJCWtmcmVlKGlkKTsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJfbm90aWNlKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbWVtY3B5KCgqb2JqKS0+c3ludGF4LmMsIHAsIGxlbik7CisJCWtmcmVlKHApOworCQlicmVhazsKKwljYXNlIFNOTVBfTlVMTDoKKwljYXNlIFNOTVBfTk9TVUNIT0JKRUNUOgorCWNhc2UgU05NUF9OT1NVQ0hJTlNUQU5DRToKKwljYXNlIFNOTVBfRU5ET0ZNSUJWSUVXOgorCQlsZW4gPSAwOworCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSwgR0ZQX0FUT01JQyk7CisJCWlmICgqb2JqID09IE5VTEwpIHsKKwkJCWtmcmVlKGlkKTsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJfbm90aWNlKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFhc24xX251bGxfZGVjb2RlKGN0eCwgZW5kKSkgeworCQkJa2ZyZWUoaWQpOworCQkJa2ZyZWUoKm9iaik7CisJCQkqb2JqID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgU05NUF9PQkpFQ1RJRDoKKwkJaWYgKCFhc24xX29pZF9kZWNvZGUoY3R4LCBlbmQsICh1bnNpZ25lZCBsb25nICoqKSZscCwgJmxlbikpIHsKKwkJCWtmcmVlKGlkKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxlbiAqPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCSpvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpICsgbGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCpvYmogPT0gTlVMTCkgeworCQkJa2ZyZWUobHApOworCQkJa2ZyZWUoaWQpOworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcl9ub3RpY2UoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQltZW1jcHkoKCpvYmopLT5zeW50YXgudWwsIGxwLCBsZW4pOworCQlrZnJlZShscCk7CisJCWJyZWFrOworCWNhc2UgU05NUF9JUEFERFI6CisJCWlmICghYXNuMV9vY3RldHNfZGVjb2RlKGN0eCwgZW5kLCAmcCwgJmxlbikpIHsKKwkJCWtmcmVlKGlkKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChsZW4gIT0gNCkgeworCQkJa2ZyZWUocCk7CisJCQlrZnJlZShpZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwgR0ZQX0FUT01JQyk7CisJCWlmICgqb2JqID09IE5VTEwpIHsKKwkJCWtmcmVlKHApOworCQkJa2ZyZWUoaWQpOworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcl9ub3RpY2UoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQltZW1jcHkoKCpvYmopLT5zeW50YXgudWMsIHAsIGxlbik7CisJCWtmcmVlKHApOworCQlicmVhazsKKwljYXNlIFNOTVBfQ09VTlRFUjoKKwljYXNlIFNOTVBfR0FVR0U6CisJY2FzZSBTTk1QX1RJTUVUSUNLUzoKKwkJbGVuID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQlpZiAoIWFzbjFfdWxvbmdfZGVjb2RlKGN0eCwgZW5kLCAmdWwpKSB7CisJCQlrZnJlZShpZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwgR0ZQX0FUT01JQyk7CisJCWlmICgqb2JqID09IE5VTEwpIHsKKwkJCWtmcmVlKGlkKTsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJfbm90aWNlKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKCpvYmopLT5zeW50YXgudWxbMF0gPSB1bDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJa2ZyZWUoaWQpOworCQlyZXR1cm4gMDsKIAl9CiAKIAkoKm9iaiktPnN5bnRheF9sZW4gPSBsZW47CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCmluZGV4IDczMTdiZGYuLmE2ZTYwNmUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCkBAIC04OCw3ICs4OCw3IEBACiAKIAkvKiBXZSBuZXZlciBzZWUgZnJhZ21lbnRzOiBjb25udHJhY2sgZGVmcmFncyBvbiBwcmUtcm91dGluZwogCSAgIGFuZCBsb2NhbC1vdXQsIGFuZCBuZl9uYXRfb3V0IHByb3RlY3RzIHBvc3Qtcm91dGluZy4gKi8KLQlORl9DVF9BU1NFUlQoIShpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpKTsKKwlORl9DVF9BU1NFUlQoIWlwX2lzX2ZyYWdtZW50KGlwX2hkcihza2IpKSk7CiAKIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwogCS8qIENhbid0IHRyYWNrPyAgSXQncyBub3QgZHVlIHRvIHN0cmVzcywgb3IgY29ubnRyYWNrIHdvdWxkCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogCXN3aXRjaCAoY3RpbmZvKSB7CiAJY2FzZSBJUF9DVF9SRUxBVEVEOgotCWNhc2UgSVBfQ1RfUkVMQVRFRCtJUF9DVF9JU19SRVBMWToKKwljYXNlIElQX0NUX1JFTEFURURfUkVQTFk6CiAJCWlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CiAJCQlpZiAoIW5mX25hdF9pY21wX3JlcGx5X3RyYW5zbGF0aW9uKGN0LCBjdGluZm8sCiAJCQkJCQkJICAgaG9va251bSwgc2tiKSkKQEAgLTE0NCw3ICsxNDQsNyBAQAogCWRlZmF1bHQ6CiAJCS8qIEVTVEFCTElTSEVEICovCiAJCU5GX0NUX0FTU0VSVChjdGluZm8gPT0gSVBfQ1RfRVNUQUJMSVNIRUQgfHwKLQkJCSAgICAgY3RpbmZvID09IChJUF9DVF9FU1RBQkxJU0hFRCtJUF9DVF9JU19SRVBMWSkpOworCQkJICAgICBjdGluZm8gPT0gSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkpOwogCX0KIAogCXJldHVybiBuZl9uYXRfcGFja2V0KGN0LCBjdGluZm8sIGhvb2tudW0sIHNrYik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9waW5nLmMgYi9uZXQvaXB2NC9waW5nLmMKaW5kZXggOWFhYTY3MS4uMzliNDAzZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcGluZy5jCisrKyBiL25ldC9pcHY0L3BpbmcuYwpAQCAtNDEsNyArNDEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9waW5nLmg+Ci0jaW5jbHVkZSA8bmV0L2ljbXAuaD4KICNpbmNsdWRlIDxuZXQvdWRwLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yYXcuYyBiL25ldC9pcHY0L3Jhdy5jCmluZGV4IGM5ODkzZDQuLjA4NTI2NzggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3Jhdy5jCisrKyBiL25ldC9pcHY0L3Jhdy5jCkBAIC04MjUsMjggKzgyNSwyOCBAQAogc3RhdGljIGludCByYXdfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFNJT0NPVVRROiB7Ci0JCQlpbnQgYW1vdW50ID0gc2tfd21lbV9hbGxvY19nZXQoc2spOworCWNhc2UgU0lPQ09VVFE6IHsKKwkJaW50IGFtb3VudCA9IHNrX3dtZW1fYWxsb2NfZ2V0KHNrKTsKIAotCQkJcmV0dXJuIHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOwotCQl9Ci0JCWNhc2UgU0lPQ0lOUTogewotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJCWludCBhbW91bnQgPSAwOworCQlyZXR1cm4gcHV0X3VzZXIoYW1vdW50LCAoaW50IF9fdXNlciAqKWFyZyk7CisJfQorCWNhc2UgU0lPQ0lOUTogeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgYW1vdW50ID0gMDsKIAotCQkJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKLQkJCXNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7Ci0JCQlpZiAoc2tiICE9IE5VTEwpCi0JCQkJYW1vdW50ID0gc2tiLT5sZW47Ci0JCQlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7Ci0JCQlyZXR1cm4gcHV0X3VzZXIoYW1vdW50LCAoaW50IF9fdXNlciAqKWFyZyk7Ci0JCX0KKwkJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwkJaWYgKHNrYiAhPSBOVUxMKQorCQkJYW1vdW50ID0gc2tiLT5sZW47CisJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJcmV0dXJuIHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCX0KIAotCQlkZWZhdWx0OgorCWRlZmF1bHQ6CiAjaWZkZWYgQ09ORklHX0lQX01ST1VURQotCQkJcmV0dXJuIGlwbXJfaW9jdGwoc2ssIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKwkJcmV0dXJuIGlwbXJfaW9jdGwoc2ssIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKICNlbHNlCi0JCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogI2VuZGlmCiAJfQogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcm91dGUuYyBiL25ldC9pcHY0L3JvdXRlLmMKaW5kZXggNTJiMGI5NS4uMTczMDY4OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcm91dGUuYworKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC0xMDgsNiArMTA4LDcgQEAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxuZXQvYXRtY2xpcC5oPgogCiAjZGVmaW5lIFJUX0ZMX1RPUyhvbGRmbHA0KSBcCiAgICAgKCh1MzIpKG9sZGZscDQtPmZsb3dpNF90b3MgJiAoSVBUT1NfUlRfTUFTSyB8IFJUT19PTkxJTkspKSkKQEAgLTE4NCw2ICsxODUsOCBAQAogCXJldHVybiBwOwogfQogCitzdGF0aWMgc3RydWN0IG5laWdoYm91ciAqaXB2NF9uZWlnaF9sb29rdXAoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBjb25zdCB2b2lkICpkYWRkcik7CisKIHN0YXRpYyBzdHJ1Y3QgZHN0X29wcyBpcHY0X2RzdF9vcHMgPSB7CiAJLmZhbWlseSA9CQlBRl9JTkVULAogCS5wcm90b2NvbCA9CQljcHVfdG9fYmUxNihFVEhfUF9JUCksCkBAIC0xOTgsNiArMjAxLDcgQEAKIAkubGlua19mYWlsdXJlID0JCWlwdjRfbGlua19mYWlsdXJlLAogCS51cGRhdGVfcG10dSA9CQlpcF9ydF91cGRhdGVfcG10dSwKIAkubG9jYWxfb3V0ID0JCV9faXBfbG9jYWxfb3V0LAorCS5uZWlnaF9sb29rdXAgPQkJaXB2NF9uZWlnaF9sb29rdXAsCiB9OwogCiAjZGVmaW5lIEVDTl9PUl9DT1NUKGNsYXNzKQlUQ19QUklPXyMjY2xhc3MKQEAgLTQxMSw4ICs0MTUsMTAgQEAKIAkJCSAgICJISFVwdG9kXHRTcGVjRHN0Iik7CiAJZWxzZSB7CiAJCXN0cnVjdCBydGFibGUgKnIgPSB2OworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuOwogCQlpbnQgbGVuOwogCisJCW4gPSBkc3RfZ2V0X25laWdoYm91cigmci0+ZHN0KTsKIAkJc2VxX3ByaW50ZihzZXEsICIlc1x0JTA4WFx0JTA4WFx0JThYXHQlZFx0JXVcdCVkXHQiCiAJCQkgICAgICAiJTA4WFx0JWRcdCV1XHQldVx0JTAyWFx0JWRcdCUxZFx0JTA4WCVuIiwKIAkJCXItPmRzdC5kZXYgPyByLT5kc3QuZGV2LT5uYW1lIDogIioiLApAQCAtNDI1LDkgKzQzMSw4IEBACiAJCQkoaW50KSgoZHN0X21ldHJpYygmci0+ZHN0LCBSVEFYX1JUVCkgPj4gMykgKwogCQkJICAgICAgZHN0X21ldHJpYygmci0+ZHN0LCBSVEFYX1JUVFZBUikpLAogCQkJci0+cnRfa2V5X3RvcywKLQkJCXItPmRzdC5oaCA/IGF0b21pY19yZWFkKCZyLT5kc3QuaGgtPmhoX3JlZmNudCkgOiAtMSwKLQkJCXItPmRzdC5oaCA/IChyLT5kc3QuaGgtPmhoX291dHB1dCA9PQotCQkJCSAgICAgICBkZXZfcXVldWVfeG1pdCkgOiAwLAorCQkJLTEsCisJCQkobiAmJiAobi0+bnVkX3N0YXRlICYgTlVEX0NPTk5FQ1RFRCkpID8gMSA6IDAsCiAJCQlyLT5ydF9zcGVjX2RzdCwgJmxlbik7CiAKIAkJc2VxX3ByaW50ZihzZXEsICIlKnNcbiIsIDEyNyAtIGxlbiwgIiIpOwpAQCAtMTAwNiw2ICsxMDExLDM3IEBACiAJcmV0dXJuIGxlbmd0aCA+PiBGUkFDVF9CSVRTOwogfQogCitzdGF0aWMgc3RydWN0IG5laWdoYm91ciAqaXB2NF9uZWlnaF9sb29rdXAoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBjb25zdCB2b2lkICpkYWRkcikKK3sKKwlzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCA9ICZhcnBfdGJsOworCXN0YXRpYyBjb25zdCBfX2JlMzIgaW5hZGRyX2FueSA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRzdC0+ZGV2OworCWNvbnN0IF9fYmUzMiAqcGtleSA9IGRhZGRyOworCXN0cnVjdCBuZWlnaGJvdXIgKm47CisKKyNpZiBkZWZpbmVkKENPTkZJR19BVE1fQ0xJUCkgfHwgZGVmaW5lZChDT05GSUdfQVRNX0NMSVBfTU9EVUxFKQorCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0FUTSkKKwkJdGJsID0gY2xpcF90YmxfaG9vazsKKyNlbmRpZgorCWlmIChkZXYtPmZsYWdzICYgKElGRl9MT09QQkFDSyB8IElGRl9QT0lOVE9QT0lOVCkpCisJCXBrZXkgPSAmaW5hZGRyX2FueTsKKworCW4gPSBfX2lwdjRfbmVpZ2hfbG9va3VwKHRibCwgZGV2LCAqKF9fZm9yY2UgdTMyICopcGtleSk7CisJaWYgKG4pCisJCXJldHVybiBuOworCXJldHVybiBuZWlnaF9jcmVhdGUodGJsLCBwa2V5LCBkZXYpOworfQorCitzdGF0aWMgaW50IHJ0X2JpbmRfbmVpZ2hib3VyKHN0cnVjdCBydGFibGUgKnJ0KQoreworCXN0cnVjdCBuZWlnaGJvdXIgKm4gPSBpcHY0X25laWdoX2xvb2t1cCgmcnQtPmRzdCwgJnJ0LT5ydF9nYXRld2F5KTsKKwlpZiAoSVNfRVJSKG4pKQorCQlyZXR1cm4gUFRSX0VSUihuKTsKKwlkc3Rfc2V0X25laWdoYm91cigmcnQtPmRzdCwgbik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBydGFibGUgKnJ0X2ludGVybl9oYXNoKHVuc2lnbmVkIGhhc2gsIHN0cnVjdCBydGFibGUgKnJ0LAogCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGlmaW5kZXgpCiB7CkBAIC0xMDQyLDcgKzEwNzgsNyBAQAogCiAJCXJ0LT5kc3QuZmxhZ3MgfD0gRFNUX05PQ0FDSEU7CiAJCWlmIChydC0+cnRfdHlwZSA9PSBSVE5fVU5JQ0FTVCB8fCBydF9pc19vdXRwdXRfcm91dGUocnQpKSB7Ci0JCQlpbnQgZXJyID0gYXJwX2JpbmRfbmVpZ2hib3VyKCZydC0+ZHN0KTsKKwkJCWludCBlcnIgPSBydF9iaW5kX25laWdoYm91cihydCk7CiAJCQlpZiAoZXJyKSB7CiAJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtMTEzOCw3ICsxMTc0LDcgQEAKIAkgICByb3V0ZSBvciB1bmljYXN0IGZvcndhcmRpbmcgcGF0aC4KIAkgKi8KIAlpZiAocnQtPnJ0X3R5cGUgPT0gUlROX1VOSUNBU1QgfHwgcnRfaXNfb3V0cHV0X3JvdXRlKHJ0KSkgewotCQlpbnQgZXJyID0gYXJwX2JpbmRfbmVpZ2hib3VyKCZydC0+ZHN0KTsKKwkJaW50IGVyciA9IHJ0X2JpbmRfbmVpZ2hib3VyKHJ0KTsKIAkJaWYgKGVycikgewogCQkJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwogCkBAIC0xMzE2LDYgKzEzNTIsMjMgQEAKIAk7CiB9CiAKK3N0YXRpYyBib29sIHBlZXJfcG10dV9leHBpcmVkKHN0cnVjdCBpbmV0X3BlZXIgKnBlZXIpCit7CisJdW5zaWduZWQgbG9uZyBvcmlnID0gQUNDRVNTX09OQ0UocGVlci0+cG10dV9leHBpcmVzKTsKKworCXJldHVybiBvcmlnICYmCisJICAgICAgIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgb3JpZykgJiYKKwkgICAgICAgY21weGNoZygmcGVlci0+cG10dV9leHBpcmVzLCBvcmlnLCAwKSA9PSBvcmlnOworfQorCitzdGF0aWMgYm9vbCBwZWVyX3BtdHVfY2xlYW5lZChzdHJ1Y3QgaW5ldF9wZWVyICpwZWVyKQoreworCXVuc2lnbmVkIGxvbmcgb3JpZyA9IEFDQ0VTU19PTkNFKHBlZXItPnBtdHVfZXhwaXJlcyk7CisKKwlyZXR1cm4gb3JpZyAmJgorCSAgICAgICBjbXB4Y2hnKCZwZWVyLT5wbXR1X2V4cGlyZXMsIG9yaWcsIDApID09IG9yaWc7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICppcHY0X25lZ2F0aXZlX2FkdmljZShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCiB7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKWRzdDsKQEAgLTEzMzEsMTQgKzEzODQsOCBAQAogCQkJCQkJcnRfZ2VuaWQoZGV2X25ldChkc3QtPmRldikpKTsKIAkJCXJ0X2RlbChoYXNoLCBydCk7CiAJCQlyZXQgPSBOVUxMOwotCQl9IGVsc2UgaWYgKHJ0LT5wZWVyICYmCi0JCQkgICBydC0+cGVlci0+cG10dV9leHBpcmVzICYmCi0JCQkgICB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJ0LT5wZWVyLT5wbXR1X2V4cGlyZXMpKSB7Ci0JCQl1bnNpZ25lZCBsb25nIG9yaWcgPSBydC0+cGVlci0+cG10dV9leHBpcmVzOwotCi0JCQlpZiAoY21weGNoZygmcnQtPnBlZXItPnBtdHVfZXhwaXJlcywgb3JpZywgMCkgPT0gb3JpZykKLQkJCQlkc3RfbWV0cmljX3NldChkc3QsIFJUQVhfTVRVLAotCQkJCQkgICAgICAgcnQtPnBlZXItPnBtdHVfb3JpZyk7CisJCX0gZWxzZSBpZiAocnQtPnBlZXIgJiYgcGVlcl9wbXR1X2V4cGlyZWQocnQtPnBlZXIpKSB7CisJCQlkc3RfbWV0cmljX3NldChkc3QsIFJUQVhfTVRVLCBydC0+cGVlci0+cG10dV9vcmlnKTsKIAkJfQogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTQyOCwyMCArMTQ3NSwyMCBAQAogCWludCBjb2RlOwogCiAJc3dpdGNoIChydC0+ZHN0LmVycm9yKSB7Ci0JCWNhc2UgRUlOVkFMOgotCQlkZWZhdWx0OgotCQkJZ290byBvdXQ7Ci0JCWNhc2UgRUhPU1RVTlJFQUNIOgotCQkJY29kZSA9IElDTVBfSE9TVF9VTlJFQUNIOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5FVFVOUkVBQ0g6Ci0JCQljb2RlID0gSUNNUF9ORVRfVU5SRUFDSDsKLQkJCUlQX0lOQ19TVEFUU19CSChkZXZfbmV0KHJ0LT5kc3QuZGV2KSwKLQkJCQkJSVBTVEFUU19NSUJfSU5OT1JPVVRFUyk7Ci0JCQlicmVhazsKLQkJY2FzZSBFQUNDRVM6Ci0JCQljb2RlID0gSUNNUF9QS1RfRklMVEVSRUQ7Ci0JCQlicmVhazsKKwljYXNlIEVJTlZBTDoKKwlkZWZhdWx0OgorCQlnb3RvIG91dDsKKwljYXNlIEVIT1NUVU5SRUFDSDoKKwkJY29kZSA9IElDTVBfSE9TVF9VTlJFQUNIOworCQlicmVhazsKKwljYXNlIEVORVRVTlJFQUNIOgorCQljb2RlID0gSUNNUF9ORVRfVU5SRUFDSDsKKwkJSVBfSU5DX1NUQVRTX0JIKGRldl9uZXQocnQtPmRzdC5kZXYpLAorCQkJCUlQU1RBVFNfTUlCX0lOTk9ST1VURVMpOworCQlicmVhazsKKwljYXNlIEVBQ0NFUzoKKwkJY29kZSA9IElDTVBfUEtUX0ZJTFRFUkVEOworCQlicmVhazsKIAl9CiAKIAlpZiAoIXJ0LT5wZWVyKQpAQCAtMTUzMSw4ICsxNTc4LDEwIEBACiAKIHN0YXRpYyB2b2lkIGNoZWNrX3BlZXJfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHN0cnVjdCBpbmV0X3BlZXIgKnBlZXIpCiB7Ci0JdW5zaWduZWQgbG9uZyBleHBpcmVzID0gcGVlci0+cG10dV9leHBpcmVzOworCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IEFDQ0VTU19PTkNFKHBlZXItPnBtdHVfZXhwaXJlcyk7CiAKKwlpZiAoIWV4cGlyZXMpCisJCXJldHVybjsKIAlpZiAodGltZV9iZWZvcmUoamlmZmllcywgZXhwaXJlcykpIHsKIAkJdTMyIG9yaWdfZHN0X210dSA9IGRzdF9tdHUoZHN0KTsKIAkJaWYgKHBlZXItPnBtdHVfbGVhcm5lZCA8IG9yaWdfZHN0X210dSkgewpAQCAtMTU1NSwxMCArMTYwNCwxMSBAQAogCQlydF9iaW5kX3BlZXIocnQsIHJ0LT5ydF9kc3QsIDEpOwogCXBlZXIgPSBydC0+cGVlcjsKIAlpZiAocGVlcikgeworCQl1bnNpZ25lZCBsb25nIHBtdHVfZXhwaXJlcyA9IEFDQ0VTU19PTkNFKHBlZXItPnBtdHVfZXhwaXJlcyk7CisKIAkJaWYgKG10dSA8IGlwX3J0X21pbl9wbXR1KQogCQkJbXR1ID0gaXBfcnRfbWluX3BtdHU7Ci0JCWlmICghcGVlci0+cG10dV9leHBpcmVzIHx8IG10dSA8IHBlZXItPnBtdHVfbGVhcm5lZCkgewotCQkJdW5zaWduZWQgbG9uZyBwbXR1X2V4cGlyZXM7CisJCWlmICghcG10dV9leHBpcmVzIHx8IG10dSA8IHBlZXItPnBtdHVfbGVhcm5lZCkgewogCiAJCQlwbXR1X2V4cGlyZXMgPSBqaWZmaWVzICsgaXBfcnRfbXR1X2V4cGlyZXM7CiAJCQlpZiAoIXBtdHVfZXhwaXJlcykKQEAgLTE1NzgsMjMgKzE2MjgsMjQgQEAKIHsKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopIGRzdDsKIAlfX2JlMzIgb3JpZ19ndyA9IHJ0LT5ydF9nYXRld2F5OworCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAKIAlkc3RfY29uZmlybSgmcnQtPmRzdCk7CiAKLQluZWlnaF9yZWxlYXNlKHJ0LT5kc3QubmVpZ2hib3VyKTsKLQlydC0+ZHN0Lm5laWdoYm91ciA9IE5VTEw7CisJbmVpZ2hfcmVsZWFzZShkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCkpOworCWRzdF9zZXRfbmVpZ2hib3VyKCZydC0+ZHN0LCBOVUxMKTsKIAogCXJ0LT5ydF9nYXRld2F5ID0gcGVlci0+cmVkaXJlY3RfbGVhcm5lZC5hNDsKLQlpZiAoYXJwX2JpbmRfbmVpZ2hib3VyKCZydC0+ZHN0KSB8fAotCSAgICAhKHJ0LT5kc3QubmVpZ2hib3VyLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKSB7Ci0JCWlmIChydC0+ZHN0Lm5laWdoYm91cikKLQkJCW5laWdoX2V2ZW50X3NlbmQocnQtPmRzdC5uZWlnaGJvdXIsIE5VTEwpOworCXJ0X2JpbmRfbmVpZ2hib3VyKHJ0KTsKKwluID0gZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpOworCWlmICghbiB8fCAhKG4tPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkpIHsKKwkJaWYgKG4pCisJCQluZWlnaF9ldmVudF9zZW5kKG4sIE5VTEwpOwogCQlydC0+cnRfZ2F0ZXdheSA9IG9yaWdfZ3c7CiAJCXJldHVybiAtRUFHQUlOOwogCX0gZWxzZSB7CiAJCXJ0LT5ydF9mbGFncyB8PSBSVENGX1JFRElSRUNURUQ7Ci0JCWNhbGxfbmV0ZXZlbnRfbm90aWZpZXJzKE5FVEVWRU5UX05FSUdIX1VQREFURSwKLQkJCQkJcnQtPmRzdC5uZWlnaGJvdXIpOworCQljYWxsX25ldGV2ZW50X25vdGlmaWVycyhORVRFVkVOVF9ORUlHSF9VUERBVEUsIG4pOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE2MTIsMTMgKzE2NjMsMTQgQEAKIAkJCXJ0X2JpbmRfcGVlcihydCwgcnQtPnJ0X2RzdCwgMCk7CiAKIAkJcGVlciA9IHJ0LT5wZWVyOwotCQlpZiAocGVlciAmJiBwZWVyLT5wbXR1X2V4cGlyZXMpCisJCWlmIChwZWVyKSB7CiAJCQljaGVja19wZWVyX3BtdHUoZHN0LCBwZWVyKTsKIAotCQlpZiAocGVlciAmJiBwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICYmCi0JCSAgICBwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICE9IHJ0LT5ydF9nYXRld2F5KSB7Ci0JCQlpZiAoY2hlY2tfcGVlcl9yZWRpcihkc3QsIHBlZXIpKQotCQkJCXJldHVybiBOVUxMOworCQkJaWYgKHBlZXItPnJlZGlyZWN0X2xlYXJuZWQuYTQgJiYKKwkJCSAgICBwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICE9IHJ0LT5ydF9nYXRld2F5KSB7CisJCQkJaWYgKGNoZWNrX3BlZXJfcmVkaXIoZHN0LCBwZWVyKSkKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQl9CiAJCX0KIAogCQlydC0+cnRfcGVlcl9nZW5pZCA9IHJ0X3BlZXJfZ2VuaWQoKTsKQEAgLTE2NDksMTQgKzE3MDEsOCBAQAogCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX0hPU1RfVU5SRUFDSCwgMCk7CiAKIAlydCA9IHNrYl9ydGFibGUoc2tiKTsKLQlpZiAocnQgJiYKLQkgICAgcnQtPnBlZXIgJiYKLQkgICAgcnQtPnBlZXItPnBtdHVfZXhwaXJlcykgewotCQl1bnNpZ25lZCBsb25nIG9yaWcgPSBydC0+cGVlci0+cG10dV9leHBpcmVzOwotCi0JCWlmIChjbXB4Y2hnKCZydC0+cGVlci0+cG10dV9leHBpcmVzLCBvcmlnLCAwKSA9PSBvcmlnKQotCQkJZHN0X21ldHJpY19zZXQoJnJ0LT5kc3QsIFJUQVhfTVRVLCBydC0+cGVlci0+cG10dV9vcmlnKTsKLQl9CisJaWYgKHJ0ICYmIHJ0LT5wZWVyICYmIHBlZXJfcG10dV9jbGVhbmVkKHJ0LT5wZWVyKSkKKwkJZHN0X21ldHJpY19zZXQoJnJ0LT5kc3QsIFJUQVhfTVRVLCBydC0+cGVlci0+cG10dV9vcmlnKTsKIH0KIAogc3RhdGljIGludCBpcF9ydF9idWcoc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTE2OTQsNyArMTc0MCw3IEBACiAJCW1lbXNldCgmZmw0LCAwLCBzaXplb2YoZmw0KSk7CiAJCWZsNC5kYWRkciA9IGlwaC0+ZGFkZHI7CiAJCWZsNC5zYWRkciA9IGlwaC0+c2FkZHI7Ci0JCWZsNC5mbG93aTRfdG9zID0gaXBoLT50b3M7CisJCWZsNC5mbG93aTRfdG9zID0gUlRfVE9TKGlwaC0+dG9zKTsKIAkJZmw0LmZsb3dpNF9vaWYgPSBydC0+ZHN0LmRldi0+aWZpbmRleDsKIAkJZmw0LmZsb3dpNF9paWYgPSBza2ItPmRldi0+aWZpbmRleDsKIAkJZmw0LmZsb3dpNF9tYXJrID0gc2tiLT5tYXJrOwpAQCAtMTc3MCw4ICsxODE2LDcgQEAKIAkJCSAgICAgICBzaXplb2YodTMyKSAqIFJUQVhfTUFYKTsKIAkJZHN0X2luaXRfbWV0cmljcygmcnQtPmRzdCwgcGVlci0+bWV0cmljcywgZmFsc2UpOwogCi0JCWlmIChwZWVyLT5wbXR1X2V4cGlyZXMpCi0JCQljaGVja19wZWVyX3BtdHUoJnJ0LT5kc3QsIHBlZXIpOworCQljaGVja19wZWVyX3BtdHUoJnJ0LT5kc3QsIHBlZXIpOwogCQlpZiAocGVlci0+cmVkaXJlY3RfbGVhcm5lZC5hNCAmJgogCQkgICAgcGVlci0+cmVkaXJlY3RfbGVhcm5lZC5hNCAhPSBydC0+cnRfZ2F0ZXdheSkgewogCQkJcnQtPnJ0X2dhdGV3YXkgPSBwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0OwpAQCAtMTg5NCw5ICsxOTM5LDcgQEAKIAogCWhhc2ggPSBydF9oYXNoKGRhZGRyLCBzYWRkciwgZGV2LT5pZmluZGV4LCBydF9nZW5pZChkZXZfbmV0KGRldikpKTsKIAlydGggPSBydF9pbnRlcm5faGFzaChoYXNoLCBydGgsIHNrYiwgZGV2LT5pZmluZGV4KTsKLQllcnIgPSAwOwotCWlmIChJU19FUlIocnRoKSkKLQkJZXJyID0gUFRSX0VSUihydGgpOworCXJldHVybiBJU19FUlIocnRoKSA/IFBUUl9FUlIocnRoKSA6IDA7CiAKIGVfbm9idWZzOgogCXJldHVybiAtRU5PQlVGUzsKQEAgLTI3MDIsNiArMjc0NSw3IEBACiAJLmRlZmF1bHRfYWR2bXNzCQk9CWlwdjRfZGVmYXVsdF9hZHZtc3MsCiAJLnVwZGF0ZV9wbXR1CQk9CWlwdjRfcnRfYmxhY2tob2xlX3VwZGF0ZV9wbXR1LAogCS5jb3dfbWV0cmljcwkJPQlpcHY0X3J0X2JsYWNraG9sZV9jb3dfbWV0cmljcywKKwkubmVpZ2hfbG9va3VwCQk9CWlwdjRfbmVpZ2hfbG9va3VwLAogfTsKIAogc3RydWN0IGRzdF9lbnRyeSAqaXB2NF9ibGFja2hvbGVfcm91dGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Rfb3JpZykKQEAgLTI3NzUsNyArMjgxOSw4IEBACiAJc3RydWN0IHJ0YWJsZSAqcnQgPSBza2JfcnRhYmxlKHNrYik7CiAJc3RydWN0IHJ0bXNnICpyOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCWxvbmcgZXhwaXJlczsKKwlsb25nIGV4cGlyZXMgPSAwOworCWNvbnN0IHN0cnVjdCBpbmV0X3BlZXIgKnBlZXIgPSBydC0+cGVlcjsKIAl1MzIgaWQgPSAwLCB0cyA9IDAsIHRzYWdlID0gMCwgZXJyb3I7CiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqciksIGZsYWdzKTsKQEAgLTI4MjMsMTUgKzI4NjgsMTYgQEAKIAkJTkxBX1BVVF9CRTMyKHNrYiwgUlRBX01BUkssIHJ0LT5ydF9tYXJrKTsKIAogCWVycm9yID0gcnQtPmRzdC5lcnJvcjsKLQlleHBpcmVzID0gKHJ0LT5wZWVyICYmIHJ0LT5wZWVyLT5wbXR1X2V4cGlyZXMpID8KLQkJcnQtPnBlZXItPnBtdHVfZXhwaXJlcyAtIGppZmZpZXMgOiAwOwotCWlmIChydC0+cGVlcikgeworCWlmIChwZWVyKSB7CiAJCWluZXRfcGVlcl9yZWZjaGVjayhydC0+cGVlcik7Ci0JCWlkID0gYXRvbWljX3JlYWQoJnJ0LT5wZWVyLT5pcF9pZF9jb3VudCkgJiAweGZmZmY7Ci0JCWlmIChydC0+cGVlci0+dGNwX3RzX3N0YW1wKSB7Ci0JCQl0cyA9IHJ0LT5wZWVyLT50Y3BfdHM7Ci0JCQl0c2FnZSA9IGdldF9zZWNvbmRzKCkgLSBydC0+cGVlci0+dGNwX3RzX3N0YW1wOworCQlpZCA9IGF0b21pY19yZWFkKCZwZWVyLT5pcF9pZF9jb3VudCkgJiAweGZmZmY7CisJCWlmIChwZWVyLT50Y3BfdHNfc3RhbXApIHsKKwkJCXRzID0gcGVlci0+dGNwX3RzOworCQkJdHNhZ2UgPSBnZXRfc2Vjb25kcygpIC0gcGVlci0+dGNwX3RzX3N0YW1wOwogCQl9CisJCWV4cGlyZXMgPSBBQ0NFU1NfT05DRShwZWVyLT5wbXR1X2V4cGlyZXMpOworCQlpZiAoZXhwaXJlcykKKwkJCWV4cGlyZXMgLT0gamlmZmllczsKIAl9CiAKIAlpZiAocnRfaXNfaW5wdXRfcm91dGUocnQpKSB7CkBAIC0zMjk1LDcgKzMzNDEsNyBAQAogCXhmcm1faW5pdCgpOwogCXhmcm00X2luaXQoaXBfcnRfbWF4X3NpemUpOwogI2VuZGlmCi0JcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fR0VUUk9VVEUsIGluZXRfcnRtX2dldHJvdXRlLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9HRVRST1VURSwgaW5ldF9ydG1fZ2V0cm91dGUsIE5VTEwsIE5VTEwpOwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCXJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJnN5c2N0bF9yb3V0ZV9vcHMpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvc3luY29va2llcy5jIGIvbmV0L2lwdjQvc3luY29va2llcy5jCmluZGV4IDI2NDYxNDkuLjkyYmI5NDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3N5bmNvb2tpZXMuYworKysgYi9uZXQvaXB2NC9zeW5jb29raWVzLmMKQEAgLTMxNiw2ICszMTYsNyBAQAogCWlyZXEtPndzY2FsZV9vawkJPSB0Y3Bfb3B0LndzY2FsZV9vazsKIAlpcmVxLT50c3RhbXBfb2sJCT0gdGNwX29wdC5zYXdfdHN0YW1wOwogCXJlcS0+dHNfcmVjZW50CQk9IHRjcF9vcHQuc2F3X3RzdGFtcCA/IHRjcF9vcHQucmN2X3RzdmFsIDogMDsKKwl0cmVxLT5zbnRfc3luYWNrCT0gdGNwX29wdC5zYXdfdHN0YW1wID8gdGNwX29wdC5yY3ZfdHNlY3IgOiAwOwogCiAJLyogV2UgdGhyb3dlZCB0aGUgb3B0aW9ucyBvZiB0aGUgaW5pdGlhbCBTWU4gYXdheSwgc28gd2UgaG9wZQogCSAqIHRoZSBBQ0sgY2FycmllcyB0aGUgc2FtZSBvcHRpb25zIGFnYWluIChzZWUgUkZDMTEyMiA0LjIuMy44KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMgYi9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYwppbmRleCA1N2QwNzUyLi42OWZkNzIwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYworKysgYi9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYwpAQCAtMzk4LDIwICszOTgsNiBAQAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAogCX0sCiAJewotCQkucHJvY25hbWUJPSAiaW5ldF9wZWVyX2djX21pbnRpbWUiLAotCQkuZGF0YQkJPSAmaW5ldF9wZWVyX2djX21pbnRpbWUsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpbmV0X3BlZXJfZ2NfbWF4dGltZSIsCi0JCS5kYXRhCQk9ICZpbmV0X3BlZXJfZ2NfbWF4dGltZSwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKIAkJLnByb2NuYW1lCT0gInRjcF9vcnBoYW5fcmV0cmllcyIsCiAJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX29ycGhhbl9yZXRyaWVzLAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCAwNTRhNTlkLi40NmZlYmNhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtMzIyMCw3ICszMjIwLDcgQEAKIHZvaWQgX19pbml0IHRjcF9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBucl9wYWdlcywgbGltaXQ7CisJdW5zaWduZWQgbG9uZyBsaW1pdDsKIAlpbnQgaSwgbWF4X3NoYXJlLCBjbnQ7CiAJdW5zaWduZWQgbG9uZyBqaWZmeSA9IGppZmZpZXM7CiAKQEAgLTMyNzcsMTMgKzMyNzcsNyBAQAogCXN5c2N0bF90Y3BfbWF4X29ycGhhbnMgPSBjbnQgLyAyOwogCXN5c2N0bF9tYXhfc3luX2JhY2tsb2cgPSBtYXgoMTI4LCBjbnQgLyAyNTYpOwogCi0JLyogU2V0IHRoZSBwcmVzc3VyZSB0aHJlc2hvbGQgdG8gYmUgYSBmcmFjdGlvbiBvZiBnbG9iYWwgbWVtb3J5IHRoYXQKLQkgKiBpcyB1cCB0byAxLzIgYXQgMjU2IE1CLCBkZWNyZWFzaW5nIHRvd2FyZCB6ZXJvIHdpdGggdGhlIGFtb3VudCBvZgotCSAqIG1lbW9yeSwgd2l0aCBhIGZsb29yIG9mIDEyOCBwYWdlcy4KLQkgKi8KLQlucl9wYWdlcyA9IHRvdGFscmFtX3BhZ2VzIC0gdG90YWxoaWdoX3BhZ2VzOwotCWxpbWl0ID0gbWluKG5yX3BhZ2VzLCAxVUw8PCgyOC1QQUdFX1NISUZUKSkgPj4gKDIwLVBBR0VfU0hJRlQpOwotCWxpbWl0ID0gKGxpbWl0ICogKG5yX3BhZ2VzID4+ICgyMC1QQUdFX1NISUZUKSkpID4+IChQQUdFX1NISUZULTExKTsKKwlsaW1pdCA9IG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKCkgLyA4OwogCWxpbWl0ID0gbWF4KGxpbWl0LCAxMjhVTCk7CiAJc3lzY3RsX3RjcF9tZW1bMF0gPSBsaW1pdCAvIDQgKiAzOwogCXN5c2N0bF90Y3BfbWVtWzFdID0gbGltaXQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaW5wdXQuYyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCmluZGV4IGJlZjlmMDQuLmVhMGQyMTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCkBAIC04ODAsNiArODgwLDExIEBACiAJCXRwLT5zbmRfc3N0aHJlc2ggPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9TU1RIUkVTSCk7CiAJCWlmICh0cC0+c25kX3NzdGhyZXNoID4gdHAtPnNuZF9jd25kX2NsYW1wKQogCQkJdHAtPnNuZF9zc3RocmVzaCA9IHRwLT5zbmRfY3duZF9jbGFtcDsKKwl9IGVsc2UgeworCQkvKiBzc3RocmVzaCBtYXkgaGF2ZSBiZWVuIHJlZHVjZWQgdW5uZWNlc3NhcmlseSBkdXJpbmcuCisJCSAqIDNXSFMuIFJlc3RvcmUgaXQgYmFjayB0byBpdHMgaW5pdGlhbCBkZWZhdWx0LgorCQkgKi8KKwkJdHAtPnNuZF9zc3RocmVzaCA9IFRDUF9JTkZJTklURV9TU1RIUkVTSDsKIAl9CiAJaWYgKGRzdF9tZXRyaWMoZHN0LCBSVEFYX1JFT1JERVJJTkcpICYmCiAJICAgIHRwLT5yZW9yZGVyaW5nICE9IGRzdF9tZXRyaWMoZHN0LCBSVEFYX1JFT1JERVJJTkcpKSB7CkBAIC04ODcsMTAgKzg5Miw3IEBACiAJCXRwLT5yZW9yZGVyaW5nID0gZHN0X21ldHJpYyhkc3QsIFJUQVhfUkVPUkRFUklORyk7CiAJfQogCi0JaWYgKGRzdF9tZXRyaWMoZHN0LCBSVEFYX1JUVCkgPT0gMCkKLQkJZ290byByZXNldDsKLQotCWlmICghdHAtPnNydHQgJiYgZHN0X21ldHJpY19ydHQoZHN0LCBSVEFYX1JUVCkgPCAoVENQX1RJTUVPVVRfSU5JVCA8PCAzKSkKKwlpZiAoZHN0X21ldHJpYyhkc3QsIFJUQVhfUlRUKSA9PSAwIHx8IHRwLT5zcnR0ID09IDApCiAJCWdvdG8gcmVzZXQ7CiAKIAkvKiBJbml0aWFsIHJ0dCBpcyBkZXRlcm1pbmVkIGZyb20gU1lOLFNZTi1BQ0suCkBAIC05MTYsMTkgKzkxOCwyNiBAQAogCQl0cC0+bWRldl9tYXggPSB0cC0+cnR0dmFyID0gbWF4KHRwLT5tZGV2LCB0Y3BfcnRvX21pbihzaykpOwogCX0KIAl0Y3Bfc2V0X3J0byhzayk7Ci0JaWYgKGluZXRfY3NrKHNrKS0+aWNza19ydG8gPCBUQ1BfVElNRU9VVF9JTklUICYmICF0cC0+cnhfb3B0LnNhd190c3RhbXApIHsKIHJlc2V0OgotCQkvKiBQbGF5IGNvbnNlcnZhdGl2ZS4gSWYgdGltZXN0YW1wcyBhcmUgbm90Ci0JCSAqIHN1cHBvcnRlZCwgVENQIHdpbGwgZmFpbCB0byByZWNhbGN1bGF0ZSBjb3JyZWN0Ci0JCSAqIHJ0dCwgaWYgaW5pdGlhbCBydG8gaXMgdG9vIHNtYWxsLiBGT1JHRVQgQUxMIEFORCBSRVNFVCEKKwlpZiAodHAtPnNydHQgPT0gMCkgeworCQkvKiBSRkMyOTg4YmlzOiBXZSd2ZSBmYWlsZWQgdG8gZ2V0IGEgdmFsaWQgUlRUIHNhbXBsZSBmcm9tCisJCSAqIDNXSFMuIFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHJldHJhbnNtaXNzaW9uLAorCQkgKiBpbmNsdWRpbmcgc3B1cmlvdXMgb25lLiBSZXNldCB0aGUgUlRPIGJhY2sgdG8gM3NlY3MKKwkJICogZnJvbSB0aGUgbW9yZSBhZ2dyZXNzaXZlIDFzZWMgdG8gYXZvaWQgbW9yZSBzcHVyaW91cworCQkgKiByZXRyYW5zbWlzc2lvbi4KIAkJICovCi0JCWlmICghdHAtPnJ4X29wdC5zYXdfdHN0YW1wICYmIHRwLT5zcnR0KSB7Ci0JCQl0cC0+c3J0dCA9IDA7Ci0JCQl0cC0+bWRldiA9IHRwLT5tZGV2X21heCA9IHRwLT5ydHR2YXIgPSBUQ1BfVElNRU9VVF9JTklUOwotCQkJaW5ldF9jc2soc2spLT5pY3NrX3J0byA9IFRDUF9USU1FT1VUX0lOSVQ7Ci0JCX0KKwkJdHAtPm1kZXYgPSB0cC0+bWRldl9tYXggPSB0cC0+cnR0dmFyID0gVENQX1RJTUVPVVRfRkFMTEJBQ0s7CisJCWluZXRfY3NrKHNrKS0+aWNza19ydG8gPSBUQ1BfVElNRU9VVF9GQUxMQkFDSzsKIAl9Ci0JdHAtPnNuZF9jd25kID0gdGNwX2luaXRfY3duZCh0cCwgZHN0KTsKKwkvKiBDdXQgY3duZCBkb3duIHRvIDEgcGVyIFJGQzU2ODEgaWYgU1lOIG9yIFNZTi1BQ0sgaGFzIGJlZW4KKwkgKiByZXRyYW5zbWl0dGVkLiBJbiBsaWdodCBvZiBSRkMyOTg4YmlzJyBtb3JlIGFnZ3Jlc3NpdmUgMXNlYworCSAqIGluaXRSVE8sIHdlIG9ubHkgcmVzZXQgY3duZCB3aGVuIG1vcmUgdGhhbiAxIFNZTi9TWU4tQUNLCisJICogcmV0cmFuc21pc3Npb24gaGFzIG9jY3VycmVkLgorCSAqLworCWlmICh0cC0+dG90YWxfcmV0cmFucyA+IDEpCisJCXRwLT5zbmRfY3duZCA9IDE7CisJZWxzZQorCQl0cC0+c25kX2N3bmQgPSB0Y3BfaW5pdF9jd25kKHRwLCBkc3QpOwogCXRwLT5zbmRfY3duZF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOwogfQogCkBAIC0zMTEyLDEyICszMTIxLDEzIEBACiAJdGNwX3htaXRfcmV0cmFuc21pdF9xdWV1ZShzayk7CiB9CiAKLXN0YXRpYyB2b2lkIHRjcF92YWxpZF9ydHRfbWVhcyhzdHJ1Y3Qgc29jayAqc2ssIHUzMiBzZXFfcnR0KQordm9pZCB0Y3BfdmFsaWRfcnR0X21lYXMoc3RydWN0IHNvY2sgKnNrLCB1MzIgc2VxX3J0dCkKIHsKIAl0Y3BfcnR0X2VzdGltYXRvcihzaywgc2VxX3J0dCk7CiAJdGNwX3NldF9ydG8oc2spOwogCWluZXRfY3NrKHNrKS0+aWNza19iYWNrb2ZmID0gMDsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX3ZhbGlkX3J0dF9tZWFzKTsKIAogLyogUmVhZCBkcmFmdC1pZXRmLXRjcGx3LWhpZ2gtcGVyZm9ybWFuY2UgYmVmb3JlIG11Y2tpbmcKICAqIHdpdGggdGhpcyBjb2RlLiAoU3VwZXJzZWRlcyBSRkMxMzIzKQpAQCAtNTgwNiwxMiArNTgxNiw2IEBACiAJCQkJCSAgICAgIHRwLT5yeF9vcHQuc25kX3dzY2FsZTsKIAkJCQl0Y3BfaW5pdF93bCh0cCwgVENQX1NLQl9DQihza2IpLT5zZXEpOwogCi0JCQkJLyogdGNwX2FjayBjb25zaWRlcnMgdGhpcyBBQ0sgYXMgZHVwbGljYXRlCi0JCQkJICogYW5kIGRvZXMgbm90IGNhbGN1bGF0ZSBydHQuCi0JCQkJICogRm9yY2UgaXQgaGVyZS4KLQkJCQkgKi8KLQkJCQl0Y3BfYWNrX3VwZGF0ZV9ydHQoc2ssIDAsIDApOwotCiAJCQkJaWYgKHRwLT5yeF9vcHQudHN0YW1wX29rKQogCQkJCQl0cC0+YWR2bXNzIC09IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQ7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pcHY0LmMgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCmluZGV4IGE3ZDY2NzEuLjk1NWI4ZTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pcHY0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwpAQCAtNDI5LDggKzQyOSw4IEBACiAJCQlicmVhazsKIAogCQlpY3NrLT5pY3NrX2JhY2tvZmYtLTsKLQkJaW5ldF9jc2soc2spLT5pY3NrX3J0byA9IF9fdGNwX3NldF9ydG8odHApIDw8Ci0JCQkJCSBpY3NrLT5pY3NrX2JhY2tvZmY7CisJCWluZXRfY3NrKHNrKS0+aWNza19ydG8gPSAodHAtPnNydHQgPyBfX3RjcF9zZXRfcnRvKHRwKSA6CisJCQlUQ1BfVElNRU9VVF9JTklUKSA8PCBpY3NrLT5pY3NrX2JhY2tvZmY7CiAJCXRjcF9ib3VuZF9ydG8oc2spOwogCiAJCXNrYiA9IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKTsKQEAgLTEzODQsNiArMTM4NCw3IEBACiAJCWlzbiA9IHRjcF92NF9pbml0X3NlcXVlbmNlKHNrYik7CiAJfQogCXRjcF9yc2socmVxKS0+c250X2lzbiA9IGlzbjsKKwl0Y3BfcnNrKHJlcSktPnNudF9zeW5hY2sgPSB0Y3BfdGltZV9zdGFtcDsKIAogCWlmICh0Y3BfdjRfc2VuZF9zeW5hY2soc2ssIGRzdCwgcmVxLAogCQkJICAgICAgIChzdHJ1Y3QgcmVxdWVzdF92YWx1ZXMgKikmdG1wX2V4dCkgfHwKQEAgLTE0NTgsNiArMTQ1OSwxMCBAQAogCQluZXd0cC0+YWR2bXNzID0gdGNwX3NrKHNrKS0+cnhfb3B0LnVzZXJfbXNzOwogCiAJdGNwX2luaXRpYWxpemVfcmN2X21zcyhuZXdzayk7CisJaWYgKHRjcF9yc2socmVxKS0+c250X3N5bmFjaykKKwkJdGNwX3ZhbGlkX3J0dF9tZWFzKG5ld3NrLAorCQkgICAgdGNwX3RpbWVfc3RhbXAgLSB0Y3BfcnNrKHJlcSktPnNudF9zeW5hY2spOworCW5ld3RwLT50b3RhbF9yZXRyYW5zID0gcmVxLT5yZXRyYW5zOwogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKIAkvKiBDb3B5IG92ZXIgdGhlIE1ENSBrZXkgZnJvbSB0aGUgb3JpZ2luYWwgc29ja2V0ICovCkBAIC0xNTg5LDYgKzE1OTQsNyBAQAogCQkJZ290byBkaXNjYXJkOwogCiAJCWlmIChuc2sgIT0gc2spIHsKKwkJCXNvY2tfcnBzX3NhdmVfcnhoYXNoKG5zaywgc2tiLT5yeGhhc2gpOwogCQkJaWYgKHRjcF9jaGlsZF9wcm9jZXNzKHNrLCBuc2ssIHNrYikpIHsKIAkJCQlyc2sgPSBuc2s7CiAJCQkJZ290byByZXNldDsKQEAgLTE4NTQsNyArMTg2MCw3IEBACiAJICogYWxnb3JpdGhtcyB0aGF0IHdlIG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nIGJhbmRhaWQgdG8gdGFsawogCSAqIGVmZmljaWVudGx5IHRvIHRoZW0uICAtRGF2ZU0KIAkgKi8KLQl0cC0+c25kX2N3bmQgPSAyOworCXRwLT5zbmRfY3duZCA9IFRDUF9JTklUX0NXTkQ7CiAKIAkvKiBTZWUgZHJhZnQtc3RldmVucy10Y3BjYS1zcGVjLTAxIGZvciBkaXNjdXNzaW9uIG9mIHRoZQogCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZXNlIHZhbHVlcy4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYyBiL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYwppbmRleCA4MGIxZjgwLi5kMmZlNGUwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKKysrIGIvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCkBAIC00ODYsNyArNDg2LDcgQEAKIAkJICogYWxnb3JpdGhtcyB0aGF0IHdlIG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nIGJhbmRhaWQgdG8gdGFsawogCQkgKiBlZmZpY2llbnRseSB0byB0aGVtLiAgLURhdmVNCiAJCSAqLwotCQluZXd0cC0+c25kX2N3bmQgPSAyOworCQluZXd0cC0+c25kX2N3bmQgPSBUQ1BfSU5JVF9DV05EOwogCQluZXd0cC0+c25kX2N3bmRfY250ID0gMDsKIAkJbmV3dHAtPmJ5dGVzX2Fja2VkID0gMDsKIApAQCAtNzIwLDYgKzcyMCwxMCBAQAogCQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUERFRkVSQUNDRVBURFJPUCk7CiAJCXJldHVybiBOVUxMOwogCX0KKwlpZiAodG1wX29wdC5zYXdfdHN0YW1wICYmIHRtcF9vcHQucmN2X3RzZWNyKQorCQl0Y3BfcnNrKHJlcSktPnNudF9zeW5hY2sgPSB0bXBfb3B0LnJjdl90c2VjcjsKKwllbHNlIGlmIChyZXEtPnJldHJhbnMpIC8qIGRvbid0IHRha2UgUlRUIHNhbXBsZSBpZiByZXRyYW5zICYmIH5UUyAqLworCQl0Y3BfcnNrKHJlcSktPnNudF9zeW5hY2sgPSAwOwogCiAJLyogT0ssIEFDSyBpcyB2YWxpZCwgY3JlYXRlIGJpZyBzb2NrZXQgYW5kCiAJICogZmVlZCB0aGlzIHNlZ21lbnQgdG8gaXQuIEl0IHdpbGwgcmVwZWF0IGFsbApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwppbmRleCBhYmNhODcwLi4xYjVhMTkzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHAuYworKysgYi9uZXQvaXB2NC91ZHAuYwpAQCAtMTA1LDYgKzEwNSw3IEBACiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvdWRwLmg+CiAjaW5jbHVkZSAidWRwX2ltcGwuaCIKIAogc3RydWN0IHVkcF90YWJsZSB1ZHBfdGFibGUgX19yZWFkX21vc3RseTsKQEAgLTEyNDksNiArMTI1MCw5IEBACiAKIAlpZiAobm9ibG9jaykKIAkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBzdGFydGluZyBvdmVyIGZvciBhIG5ldyBwYWNrZXQgKi8KKwltc2ctPm1zZ19mbGFncyAmPSB+TVNHX1RSVU5DOwogCWdvdG8gdHJ5X2FnYWluOwogfQogCkBAIC0xMzYzLDYgKzEzNjcsNyBAQAogCQkJCQkgaXNfdWRwbGl0ZSk7CiAJCVVEUF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBVRFBfTUlCX0lORVJST1JTLCBpc191ZHBsaXRlKTsKIAkJa2ZyZWVfc2tiKHNrYik7CisJCXRyYWNlX3VkcF9mYWlsX3F1ZXVlX3Jjdl9za2IocmMsIHNrKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMjIwNiwxNiArMjIxMSwxMCBAQAogCiB2b2lkIF9faW5pdCB1ZHBfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIGxpbWl0OworCXVuc2lnbmVkIGxvbmcgbGltaXQ7CiAKIAl1ZHBfdGFibGVfaW5pdCgmdWRwX3RhYmxlLCAiVURQIik7Ci0JLyogU2V0IHRoZSBwcmVzc3VyZSB0aHJlc2hvbGQgdXAgYnkgdGhlIHNhbWUgc3RyYXRlZ3kgb2YgVENQLiBJdCBpcyBhCi0JICogZnJhY3Rpb24gb2YgZ2xvYmFsIG1lbW9yeSB0aGF0IGlzIHVwIHRvIDEvMiBhdCAyNTYgTUIsIGRlY3JlYXNpbmcKLQkgKiB0b3dhcmQgemVybyB3aXRoIHRoZSBhbW91bnQgb2YgbWVtb3J5LCB3aXRoIGEgZmxvb3Igb2YgMTI4IHBhZ2VzLgotCSAqLwotCW5yX3BhZ2VzID0gdG90YWxyYW1fcGFnZXMgLSB0b3RhbGhpZ2hfcGFnZXM7Ci0JbGltaXQgPSBtaW4obnJfcGFnZXMsIDFVTDw8KDI4LVBBR0VfU0hJRlQpKSA+PiAoMjAtUEFHRV9TSElGVCk7Ci0JbGltaXQgPSAobGltaXQgKiAobnJfcGFnZXMgPj4gKDIwLVBBR0VfU0hJRlQpKSkgPj4gKFBBR0VfU0hJRlQtMTEpOworCWxpbWl0ID0gbnJfZnJlZV9idWZmZXJfcGFnZXMoKSAvIDg7CiAJbGltaXQgPSBtYXgobGltaXQsIDEyOFVMKTsKIAlzeXNjdGxfdWRwX21lbVswXSA9IGxpbWl0IC8gNCAqIDM7CiAJc3lzY3RsX3VkcF9tZW1bMV0gPSBsaW1pdDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X291dHB1dC5jIGIvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKaW5kZXggMmQ1MTg0MC4uMzI3YTYxNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKQEAgLTMyLDcgKzMyLDEyIEBACiAJZHN0ID0gc2tiX2RzdChza2IpOwogCW10dSA9IGRzdF9tdHUoZHN0KTsKIAlpZiAoc2tiLT5sZW4gPiBtdHUpIHsKLQkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsIElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOworCQlpZiAoc2tiLT5zaykKKwkJCWlwX2xvY2FsX2Vycm9yKHNrYi0+c2ssIEVNU0dTSVpFLCBpcF9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJICAgICAgIGluZXRfc2soc2tiLT5zayktPmluZXRfZHBvcnQsIG10dSk7CisJCWVsc2UKKwkJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILAorCQkJCSAgSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CiAJCXJldCA9IC1FTVNHU0laRTsKIAl9CiBvdXQ6CmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYyBiL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCmluZGV4IDk4MWU0M2UuLmZjNTM2OGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCisrKyBiL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIAltZW1zZXQoZmw0LCAwLCBzaXplb2Yoc3RydWN0IGZsb3dpNCkpOwogCWZsNC0+Zmxvd2k0X21hcmsgPSBza2ItPm1hcms7CiAKLQlpZiAoIShpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKSkgeworCWlmICghaXBfaXNfZnJhZ21lbnQoaXBoKSkgewogCQlzd2l0Y2ggKGlwaC0+cHJvdG9jb2wpIHsKIAkJY2FzZSBJUFBST1RPX1VEUDoKIAkJY2FzZSBJUFBST1RPX1VEUExJVEU6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZGRyY29uZi5jIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwppbmRleCA0OThiOTI3Li5hMDZjNTNjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZGRyY29uZi5jCisrKyBiL25ldC9pcHY2L2FkZHJjb25mLmMKQEAgLTY1Niw3ICs2NTYsNyBAQAogCSAqIGxheWVyIGFkZHJlc3Mgb2Ygb3VyIG5leGhvcCByb3V0ZXIKIAkgKi8KIAotCWlmIChydC0+cnQ2aV9uZXh0aG9wID09IE5VTEwpCisJaWYgKGRzdF9nZXRfbmVpZ2hib3VyKCZydC0+ZHN0KSA9PSBOVUxMKQogCQlpZmEtPmZsYWdzICY9IH5JRkFfRl9PUFRJTUlTVElDOwogCiAJaWZhLT5pZGV2ID0gaWRldjsKQEAgLTE0NzAsNiArMTQ3MCw4IEBACiBzdGF0aWMgdm9pZCBhZGRyY29uZl9qb2luX2FueWNhc3Qoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKQogewogCXN0cnVjdCBpbjZfYWRkciBhZGRyOworCWlmIChpZnAtPnByZWZpeF9sZW4gPT0gMTI3KSAvKiBSRkMgNjE2NCAqLworCQlyZXR1cm47CiAJaXB2Nl9hZGRyX3ByZWZpeCgmYWRkciwgJmlmcC0+YWRkciwgaWZwLT5wcmVmaXhfbGVuKTsKIAlpZiAoaXB2Nl9hZGRyX2FueSgmYWRkcikpCiAJCXJldHVybjsKQEAgLTE1NTksNiArMTU2MSwxMSBAQAogCXJldHVybiAtMTsKIH0KIAorc3RhdGljIGludCBhZGRyY29uZl9pZmlkX2dyZSh1OCAqZXVpLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBfX2lwdjZfaXNhdGFwX2lmaWQoZXVpLCAqKF9fYmUzMiAqKWRldi0+ZGV2X2FkZHIpOworfQorCiBzdGF0aWMgaW50IGlwdjZfZ2VuZXJhdGVfZXVpNjQodTggKmV1aSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzd2l0Y2ggKGRldi0+dHlwZSkgewpAQCAtMTU3Miw2ICsxNTc5LDggQEAKIAkJcmV0dXJuIGFkZHJjb25mX2lmaWRfaW5maW5pYmFuZChldWksIGRldik7CiAJY2FzZSBBUlBIUkRfU0lUOgogCQlyZXR1cm4gYWRkcmNvbmZfaWZpZF9zaXQoZXVpLCBkZXYpOworCWNhc2UgQVJQSFJEX0lQR1JFOgorCQlyZXR1cm4gYWRkcmNvbmZfaWZpZF9ncmUoZXVpLCBkZXYpOwogCX0KIAlyZXR1cm4gLTE7CiB9CkBAIC0yNDIzLDYgKzI0MzIsMjkgQEAKIH0KICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfTkVUX0lQR1JFKSB8fCBkZWZpbmVkKENPTkZJR19ORVRfSVBHUkVfTU9EVUxFKQorc3RhdGljIHZvaWQgYWRkcmNvbmZfZ3JlX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisJc3RydWN0IGluNl9hZGRyIGFkZHI7CisKKwlwcl9pbmZvKCJpcHY2OiBhZGRyY29uZl9ncmVfY29uZmlnKCVzKVxuIiwgZGV2LT5uYW1lKTsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAoKGlkZXYgPSBpcHY2X2ZpbmRfaWRldihkZXYpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpbml0IGdyZTogYWRkX2RldiBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJaXB2Nl9hZGRyX3NldCgmYWRkciwgIGh0b25sKDB4RkU4MDAwMDApLCAwLCAwLCAwKTsKKwlhZGRyY29uZl9wcmVmaXhfcm91dGUoJmFkZHIsIDY0LCBkZXYsIDAsIDApOworCisJaWYgKCFpcHY2X2dlbmVyYXRlX2V1aTY0KGFkZHIuczZfYWRkciArIDgsIGRldikpCisJCWFkZHJjb25mX2FkZF9saW5rbG9jYWwoaWRldiwgJmFkZHIpOworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgaW50CiBpcHY2X2luaGVyaXRfbGlua2xvY2FsKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpsaW5rX2RldikKIHsKQEAgLTI1MzksNiArMjU3MSwxMSBAQAogCQkJYWRkcmNvbmZfc2l0X2NvbmZpZyhkZXYpOwogCQkJYnJlYWs7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19ORVRfSVBHUkUpIHx8IGRlZmluZWQoQ09ORklHX05FVF9JUEdSRV9NT0RVTEUpCisJCWNhc2UgQVJQSFJEX0lQR1JFOgorCQkJYWRkcmNvbmZfZ3JlX2NvbmZpZyhkZXYpOworCQkJYnJlYWs7CisjZW5kaWYKIAkJY2FzZSBBUlBIUkRfVFVOTkVMNjoKIAkJCWFkZHJjb25mX2lwNl90bmxfY29uZmlnKGRldik7CiAJCQlicmVhazsKQEAgLTQ2OTIsMTYgKzQ3MjksMjAgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvdXRfYWY7CiAKLQllcnIgPSBfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9HRVRMSU5LLCBOVUxMLCBpbmV0Nl9kdW1wX2lmaW5mbyk7CisJZXJyID0gX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUTElOSywgTlVMTCwgaW5ldDZfZHVtcF9pZmluZm8sCisJCQkgICAgICBOVUxMKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvdXQ7CiAKIAkvKiBPbmx5IHRoZSBmaXJzdCBjYWxsIHRvIF9fcnRubF9yZWdpc3RlciBjYW4gZmFpbCAqLwotCV9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX05FV0FERFIsIGluZXQ2X3J0bV9uZXdhZGRyLCBOVUxMKTsKLQlfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9ERUxBRERSLCBpbmV0Nl9ydG1fZGVsYWRkciwgTlVMTCk7Ci0JX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUQUREUiwgaW5ldDZfcnRtX2dldGFkZHIsIGluZXQ2X2R1bXBfaWZhZGRyKTsKLQlfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9HRVRNVUxUSUNBU1QsIE5VTEwsIGluZXQ2X2R1bXBfaWZtY2FkZHIpOwotCV9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX0dFVEFOWUNBU1QsIE5VTEwsIGluZXQ2X2R1bXBfaWZhY2FkZHIpOworCV9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX05FV0FERFIsIGluZXQ2X3J0bV9uZXdhZGRyLCBOVUxMLCBOVUxMKTsKKwlfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9ERUxBRERSLCBpbmV0Nl9ydG1fZGVsYWRkciwgTlVMTCwgTlVMTCk7CisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUQUREUiwgaW5ldDZfcnRtX2dldGFkZHIsCisJCQlpbmV0Nl9kdW1wX2lmYWRkciwgTlVMTCk7CisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUTVVMVElDQVNULCBOVUxMLAorCQkJaW5ldDZfZHVtcF9pZm1jYWRkciwgTlVMTCk7CisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUQU5ZQ0FTVCwgTlVMTCwKKwkJCWluZXQ2X2R1bXBfaWZhY2FkZHIsIE5VTEwpOwogCiAJaXB2Nl9hZGRyX2xhYmVsX3J0bmxfcmVnaXN0ZXIoKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmxhYmVsLmMgYi9uZXQvaXB2Ni9hZGRybGFiZWwuYwppbmRleCBjODk5M2U1Li4yZDhkZGJhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZGRybGFiZWwuYworKysgYi9uZXQvaXB2Ni9hZGRybGFiZWwuYwpAQCAtNTkyLDggKzU5MiwxMSBAQAogCiB2b2lkIF9faW5pdCBpcHY2X2FkZHJfbGFiZWxfcnRubF9yZWdpc3Rlcih2b2lkKQogewotCV9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX05FV0FERFJMQUJFTCwgaXA2YWRkcmxibF9uZXdkZWwsIE5VTEwpOwotCV9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX0RFTEFERFJMQUJFTCwgaXA2YWRkcmxibF9uZXdkZWwsIE5VTEwpOwotCV9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX0dFVEFERFJMQUJFTCwgaXA2YWRkcmxibF9nZXQsIGlwNmFkZHJsYmxfZHVtcCk7CisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fTkVXQUREUkxBQkVMLCBpcDZhZGRybGJsX25ld2RlbCwKKwkJCU5VTEwsIE5VTEwpOworCV9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX0RFTEFERFJMQUJFTCwgaXA2YWRkcmxibF9uZXdkZWwsCisJCQlOVUxMLCBOVUxMKTsKKwlfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9HRVRBRERSTEFCRUwsIGlwNmFkZHJsYmxfZ2V0LAorCQkJaXA2YWRkcmxibF9kdW1wLCBOVUxMKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWZfaW5ldDYuYyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKaW5kZXggYjc5MTlmOS4uM2I1NjY5YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWZfaW5ldDYuYworKysgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCkBAIC0yNzIsNiArMjcyLDEwIEBACiAKIAlpZiAoYWRkcl9sZW4gPCBTSU42X0xFTl9SRkMyMTMzKQogCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhZGRyLT5zaW42X2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKIAlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZSgmYWRkci0+c2luNl9hZGRyKTsKIAlpZiAoKGFkZHJfdHlwZSAmIElQVjZfQUREUl9NVUxUSUNBU1QpICYmIHNvY2stPnR5cGUgPT0gU09DS19TVFJFQU0pCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2ZpYi5jIGIvbmV0L2lwdjYvaXA2X2ZpYi5jCmluZGV4IDQwNzZhMGIuLjU0YTQ2NzggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9maWIuYworKysgYi9uZXQvaXB2Ni9pcDZfZmliLmMKQEAgLTE0NTUsNyArMTQ1NSw3IEBACiAJCQlSVDZfVFJBQ0UoImFnaW5nIGNsb25lICVwXG4iLCBydCk7CiAJCQlyZXR1cm4gLTE7CiAJCX0gZWxzZSBpZiAoKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0dBVEVXQVkpICYmCi0JCQkgICAoIShydC0+cnQ2aV9uZXh0aG9wLT5mbGFncyAmIE5URl9ST1VURVIpKSkgeworCQkJICAgKCEoZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpLT5mbGFncyAmIE5URl9ST1VURVIpKSkgewogCQkJUlQ2X1RSQUNFKCJwdXJnaW5nIHJvdXRlICVwIHZpYSBub24tcm91dGVyIGJ1dCBnYXRld2F5XG4iLAogCQkJCSAgcnQpOwogCQkJcmV0dXJuIC0xOwpAQCAtMTU4Niw3ICsxNTg2LDggQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF9rbWVtX2NhY2hlX2NyZWF0ZTsKIAotCXJldCA9IF9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX0dFVFJPVVRFLCBOVUxMLCBpbmV0Nl9kdW1wX2ZpYik7CisJcmV0ID0gX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUUk9VVEUsIE5VTEwsIGluZXQ2X2R1bXBfZmliLAorCQkJICAgICAgTlVMTCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfdW5yZWdpc3Rlcl9zdWJzeXM7CiBvdXQ6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggOWQ0YjE2NTguLjMyZTUzMzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYworKysgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKQEAgLTEwMCw2ICsxMDAsNyBAQAogewogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHN0LT5kZXY7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CiAKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CiAJc2tiLT5kZXYgPSBkZXY7CkBAIC0xMzQsMTAgKzEzNSw5IEBACiAJCQkJc2tiLT5sZW4pOwogCX0KIAotCWlmIChkc3QtPmhoKQotCQlyZXR1cm4gbmVpZ2hfaGhfb3V0cHV0KGRzdC0+aGgsIHNrYik7Ci0JZWxzZSBpZiAoZHN0LT5uZWlnaGJvdXIpCi0JCXJldHVybiBkc3QtPm5laWdoYm91ci0+b3V0cHV0KHNrYik7CisJbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOworCWlmIChuZWlnaCkKKwkJcmV0dXJuIG5laWdoX291dHB1dChuZWlnaCwgc2tiKTsKIAogCUlQNl9JTkNfU1RBVFNfQkgoZGV2X25ldChkc3QtPmRldiksCiAJCQkgaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKQEAgLTM4NSw2ICszODUsNyBAQAogCXN0cnVjdCBpcHY2aGRyICpoZHIgPSBpcHY2X2hkcihza2IpOwogCXN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0ID0gSVA2Q0Ioc2tiKTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRzdC0+ZGV2KTsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuOwogCXUzMiBtdHU7CiAKIAlpZiAobmV0LT5pcHY2LmRldmNvbmZfYWxsLT5mb3J3YXJkaW5nID09IDApCkBAIC00NTksMTEgKzQ2MCwxMCBAQAogCSAgIHNlbmQgcmVkaXJlY3RzIHRvIHNvdXJjZSByb3V0ZWQgZnJhbWVzLgogCSAgIFdlIGRvbid0IHNlbmQgcmVkaXJlY3RzIHRvIGZyYW1lcyBkZWNhcHN1bGF0ZWQgZnJvbSBJUHNlYy4KIAkgKi8KLQlpZiAoc2tiLT5kZXYgPT0gZHN0LT5kZXYgJiYgZHN0LT5uZWlnaGJvdXIgJiYgb3B0LT5zcmNydCA9PSAwICYmCi0JICAgICFza2Jfc2VjX3BhdGgoc2tiKSkgeworCW4gPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOworCWlmIChza2ItPmRldiA9PSBkc3QtPmRldiAmJiBuICYmIG9wdC0+c3JjcnQgPT0gMCAmJiAhc2tiX3NlY19wYXRoKHNrYikpIHsKIAkJc3RydWN0IGluNl9hZGRyICp0YXJnZXQgPSBOVUxMOwogCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwotCQlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gZHN0LT5uZWlnaGJvdXI7CiAKIAkJLyoKIAkJICoJaW5jb21pbmcgYW5kIG91dGdvaW5nIGRldmljZXMgYXJlIHRoZSBzYW1lCkBAIC01OTYsNiArNTk2LDMxIEBACiAJcmV0dXJuIG9mZnNldDsKIH0KIAordm9pZCBpcHY2X3NlbGVjdF9pZGVudChzdHJ1Y3QgZnJhZ19oZHIgKmZoZHIsIHN0cnVjdCBydDZfaW5mbyAqcnQpCit7CisJc3RhdGljIGF0b21pY190IGlwdjZfZnJhZ21lbnRhdGlvbl9pZDsKKwlpbnQgb2xkLCBuZXc7CisKKwlpZiAocnQpIHsKKwkJc3RydWN0IGluZXRfcGVlciAqcGVlcjsKKworCQlpZiAoIXJ0LT5ydDZpX3BlZXIpCisJCQlydDZfYmluZF9wZWVyKHJ0LCAxKTsKKwkJcGVlciA9IHJ0LT5ydDZpX3BlZXI7CisJCWlmIChwZWVyKSB7CisJCQlmaGRyLT5pZGVudGlmaWNhdGlvbiA9IGh0b25sKGluZXRfZ2V0aWQocGVlciwgMCkpOworCQkJcmV0dXJuOworCQl9CisJfQorCWRvIHsKKwkJb2xkID0gYXRvbWljX3JlYWQoJmlwdjZfZnJhZ21lbnRhdGlvbl9pZCk7CisJCW5ldyA9IG9sZCArIDE7CisJCWlmICghbmV3KQorCQkJbmV3ID0gMTsKKwl9IHdoaWxlIChhdG9taWNfY21weGNoZygmaXB2Nl9mcmFnbWVudGF0aW9uX2lkLCBvbGQsIG5ldykgIT0gb2xkKTsKKwlmaGRyLT5pZGVudGlmaWNhdGlvbiA9IGh0b25sKG5ldyk7Cit9CisKIGludCBpcDZfZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICgqb3V0cHV0KShzdHJ1Y3Qgc2tfYnVmZiAqKSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZzsKQEAgLTY4MCw3ICs3MDUsNyBAQAogCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJbWVtY3B5KHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCB0bXBfaGRyLCBobGVuKTsKIAotCQlpcHY2X3NlbGVjdF9pZGVudChmaCk7CisJCWlwdjZfc2VsZWN0X2lkZW50KGZoLCBydCk7CiAJCWZoLT5uZXh0aGRyID0gbmV4dGhkcjsKIAkJZmgtPnJlc2VydmVkID0gMDsKIAkJZmgtPmZyYWdfb2ZmID0gaHRvbnMoSVA2X01GKTsKQEAgLTgyNiw3ICs4NTEsNyBAQAogCQlmaC0+bmV4dGhkciA9IG5leHRoZHI7CiAJCWZoLT5yZXNlcnZlZCA9IDA7CiAJCWlmICghZnJhZ19pZCkgewotCQkJaXB2Nl9zZWxlY3RfaWRlbnQoZmgpOworCQkJaXB2Nl9zZWxlY3RfaWRlbnQoZmgsIHJ0KTsKIAkJCWZyYWdfaWQgPSBmaC0+aWRlbnRpZmljYXRpb247CiAJCX0gZWxzZQogCQkJZmgtPmlkZW50aWZpY2F0aW9uID0gZnJhZ19pZDsKQEAgLTkyMCw4ICs5NDUsMTEgQEAKIHN0YXRpYyBpbnQgaXA2X2RzdF9sb29rdXBfdGFpbChzdHJ1Y3Qgc29jayAqc2ssCiAJCQkgICAgICAgc3RydWN0IGRzdF9lbnRyeSAqKmRzdCwgc3RydWN0IGZsb3dpNiAqZmw2KQogewotCWludCBlcnI7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOworI2lmZGVmIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFECisJc3RydWN0IG5laWdoYm91ciAqbjsKKyNlbmRpZgorCWludCBlcnI7CiAKIAlpZiAoKmRzdCA9PSBOVUxMKQogCQkqZHN0ID0gaXA2X3JvdXRlX291dHB1dChuZXQsIHNrLCBmbDYpOwpAQCAtOTQ3LDcgKzk3NSw4IEBACiAJICogZHN0IGVudHJ5IGFuZCByZXBsYWNlIGl0IGluc3RlYWQgd2l0aCB0aGUKIAkgKiBkc3QgZW50cnkgb2YgdGhlIG5leHRob3Agcm91dGVyCiAJICovCi0JaWYgKCgqZHN0KS0+bmVpZ2hib3VyICYmICEoKCpkc3QpLT5uZWlnaGJvdXItPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkpIHsKKwluID0gZHN0X2dldF9uZWlnaGJvdXIoKmRzdCk7CisJaWYgKG4gJiYgIShuLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKSB7CiAJCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKIAkJc3RydWN0IGZsb3dpNiBmbF9ndzY7CiAJCWludCByZWRpcmVjdDsKQEAgLTEwNzIsNyArMTEwMSw4IEBACiAJCQlpbnQgZ2V0ZnJhZyh2b2lkICpmcm9tLCBjaGFyICp0bywgaW50IG9mZnNldCwgaW50IGxlbiwKIAkJCWludCBvZGQsIHN0cnVjdCBza19idWZmICpza2IpLAogCQkJdm9pZCAqZnJvbSwgaW50IGxlbmd0aCwgaW50IGhoX2xlbiwgaW50IGZyYWdoZWFkZXJsZW4sCi0JCQlpbnQgdHJhbnNoZHJsZW4sIGludCBtdHUsdW5zaWduZWQgaW50IGZsYWdzKQorCQkJaW50IHRyYW5zaGRybGVuLCBpbnQgbXR1LHVuc2lnbmVkIGludCBmbGFncywKKwkJCXN0cnVjdCBydDZfaW5mbyAqcnQpCiAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTExNiw3ICsxMTQ2LDcgQEAKIAkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IChtdHUgLSBmcmFnaGVhZGVybGVuIC0KIAkJCQkJICAgICBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSkgJiB+NzsKIAkJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9IFNLQl9HU09fVURQOwotCQlpcHY2X3NlbGVjdF9pZGVudCgmZmhkcik7CisJCWlwdjZfc2VsZWN0X2lkZW50KCZmaGRyLCBydCk7CiAJCXNrYl9zaGluZm8oc2tiKS0+aXA2X2ZyYWdfaWQgPSBmaGRyLmlkZW50aWZpY2F0aW9uOwogCQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CiAKQEAgLTEyODIsNyArMTMxMiw3IEBACiAKIAkJCWVyciA9IGlwNl91Zm9fYXBwZW5kX2RhdGEoc2ssIGdldGZyYWcsIGZyb20sIGxlbmd0aCwKIAkJCQkJCSAgaGhfbGVuLCBmcmFnaGVhZGVybGVuLAotCQkJCQkJICB0cmFuc2hkcmxlbiwgbXR1LCBmbGFncyk7CisJCQkJCQkgIHRyYW5zaGRybGVuLCBtdHUsIGZsYWdzLCBydCk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZXJyb3I7CiAJCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jCmluZGV4IDgyYTgwOTkuLjcwNWM4MjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNm1yLmMKKysrIGIvbmV0L2lwdjYvaXA2bXIuYwpAQCAtMTM1NCw3ICsxMzU0LDggQEAKIAkJZ290byBhZGRfcHJvdG9fZmFpbDsKIAl9CiAjZW5kaWYKLQlydG5sX3JlZ2lzdGVyKFJUTkxfRkFNSUxZX0lQNk1SLCBSVE1fR0VUUk9VVEUsIE5VTEwsIGlwNm1yX3J0bV9kdW1wcm91dGUpOworCXJ0bmxfcmVnaXN0ZXIoUlROTF9GQU1JTFlfSVA2TVIsIFJUTV9HRVRST1VURSwgTlVMTCwKKwkJICAgICAgaXA2bXJfcnRtX2R1bXByb3V0ZSwgTlVMTCk7CiAJcmV0dXJuIDA7CiAjaWZkZWYgQ09ORklHX0lQVjZfUElNU01fVjIKIGFkZF9wcm90b19mYWlsOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmRpc2MuYyBiL25ldC9pcHY2L25kaXNjLmMKaW5kZXggNzU5NmYwNy4uOWRhNmUwMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmRpc2MuYworKysgYi9uZXQvaXB2Ni9uZGlzYy5jCkBAIC0xMDcsOCArMTA3LDYgQEAKIAkuZXJyb3JfcmVwb3J0ID0JCW5kaXNjX2Vycm9yX3JlcG9ydCwKIAkub3V0cHV0ID0JCW5laWdoX3Jlc29sdmVfb3V0cHV0LAogCS5jb25uZWN0ZWRfb3V0cHV0ID0JbmVpZ2hfY29ubmVjdGVkX291dHB1dCwKLQkuaGhfb3V0cHV0ID0JCWRldl9xdWV1ZV94bWl0LAotCS5xdWV1ZV94bWl0ID0JCWRldl9xdWV1ZV94bWl0LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZWlnaF9vcHMgbmRpc2NfaGhfb3BzID0gewpAQCAtMTE3LDE3ICsxMTUsMTMgQEAKIAkuZXJyb3JfcmVwb3J0ID0JCW5kaXNjX2Vycm9yX3JlcG9ydCwKIAkub3V0cHV0ID0JCW5laWdoX3Jlc29sdmVfb3V0cHV0LAogCS5jb25uZWN0ZWRfb3V0cHV0ID0JbmVpZ2hfcmVzb2x2ZV9vdXRwdXQsCi0JLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKLQkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKIH07CiAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZWlnaF9vcHMgbmRpc2NfZGlyZWN0X29wcyA9IHsKIAkuZmFtaWx5ID0JCUFGX0lORVQ2LAotCS5vdXRwdXQgPQkJZGV2X3F1ZXVlX3htaXQsCi0JLmNvbm5lY3RlZF9vdXRwdXQgPQlkZXZfcXVldWVfeG1pdCwKLQkuaGhfb3V0cHV0ID0JCWRldl9xdWV1ZV94bWl0LAotCS5xdWV1ZV94bWl0ID0JCWRldl9xdWV1ZV94bWl0LAorCS5vdXRwdXQgPQkJbmVpZ2hfZGlyZWN0X291dHB1dCwKKwkuY29ubmVjdGVkX291dHB1dCA9CW5laWdoX2RpcmVjdF9vdXRwdXQsCiB9OwogCiBzdHJ1Y3QgbmVpZ2hfdGFibGUgbmRfdGJsID0gewpAQCAtMzkyLDcgKzM4Niw3IEBACiAJaWYgKCFkZXYtPmhlYWRlcl9vcHMpIHsKIAkJbmVpZ2gtPm51ZF9zdGF0ZSA9IE5VRF9OT0FSUDsKIAkJbmVpZ2gtPm9wcyA9ICZuZGlzY19kaXJlY3Rfb3BzOwotCQluZWlnaC0+b3V0cHV0ID0gbmVpZ2gtPm9wcy0+cXVldWVfeG1pdDsKKwkJbmVpZ2gtPm91dHB1dCA9IG5laWdoX2RpcmVjdF9vdXRwdXQ7CiAJfSBlbHNlIHsKIAkJaWYgKGlzX211bHRpY2FzdCkgewogCQkJbmVpZ2gtPm51ZF9zdGF0ZSA9IE5VRF9OT0FSUDsKQEAgLTEyNDQsNyArMTIzOCw3IEBACiAJcnQgPSBydDZfZ2V0X2RmbHRfcm91dGVyKCZpcHY2X2hkcihza2IpLT5zYWRkciwgc2tiLT5kZXYpOwogCiAJaWYgKHJ0KQotCQluZWlnaCA9IHJ0LT5ydDZpX25leHRob3A7CisJCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpOwogCiAJaWYgKHJ0ICYmIGxpZmV0aW1lID09IDApIHsKIAkJbmVpZ2hfY2xvbmUobmVpZ2gpOwpAQCAtMTI2NSw3ICsxMjU5LDcgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCW5laWdoID0gcnQtPnJ0NmlfbmV4dGhvcDsKKwkJbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCk7CiAJCWlmIChuZWlnaCA9PSBOVUxMKSB7CiAJCQlORF9QUklOVEswKEtFUk5fRVJSCiAJCQkJICAgIklDTVB2NiBSQTogJXMoKSBnb3QgZGVmYXVsdCByb3V0ZXIgd2l0aG91dCBuZWlnaGJvdXIuXG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jCmluZGV4IDQxM2FiMDcuLjI0OTM5NDggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKQEAgLTIwNCw3ICsyMDQsOCBAQAogCWVsc2UKIAkJcG1zZy0+b3V0ZGV2X25hbWVbMF0gPSAnXDAnOwogCi0JaWYgKGVudHJ5LT5pbmRldiAmJiBlbnRyeS0+c2tiLT5kZXYpIHsKKwlpZiAoZW50cnktPmluZGV2ICYmIGVudHJ5LT5za2ItPmRldiAmJgorCSAgICBlbnRyeS0+c2tiLT5tYWNfaGVhZGVyICE9IGVudHJ5LT5za2ItPm5ldHdvcmtfaGVhZGVyKSB7CiAJCXBtc2ctPmh3X3R5cGUgPSBlbnRyeS0+c2tiLT5kZXYtPnR5cGU7CiAJCXBtc2ctPmh3X2FkZHJsZW4gPSBkZXZfcGFyc2VfaGVhZGVyKGVudHJ5LT5za2IsIHBtc2ctPmh3X2FkZHIpOwogCX0KQEAgLTQwMyw3ICs0MDQsOCBAQAogc3RhdGljIGlubGluZSB2b2lkCiBfX2lwcV9yY3Zfc2tiKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IHN0YXR1cywgdHlwZSwgcGlkLCBmbGFncywgbmxtc2dsZW4sIHNrYmxlbjsKKwlpbnQgc3RhdHVzLCB0eXBlLCBwaWQsIGZsYWdzOworCXVuc2lnbmVkIGludCBubG1zZ2xlbiwgc2tibGVuOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCiAJc2tibGVuID0gc2tiLT5sZW47CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwppbmRleCBjOGFmNThiLi40MTExMDUwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAJLyogVGhpcyBpcyB3aGVyZSB3ZSBjYWxsIHRoZSBoZWxwZXI6IGFzIHRoZSBwYWNrZXQgZ29lcyBvdXQuICovCiAJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKLQlpZiAoIWN0IHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEICsgSVBfQ1RfSVNfUkVQTFkpCisJaWYgKCFjdCB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRF9SRVBMWSkKIAkJZ290byBvdXQ7CiAKIAloZWxwID0gbmZjdF9oZWxwKGN0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCmluZGV4IDFkZjNjOGIuLjdjMDVlN2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJLyogVXBkYXRlIHNrYiB0byByZWZlciB0byB0aGlzIGNvbm5lY3Rpb24gKi8KIAlza2ItPm5mY3QgPSAmbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKS0+Y3RfZ2VuZXJhbDsKIAlza2ItPm5mY3RpbmZvID0gKmN0aW5mbzsKLQlyZXR1cm4gLU5GX0FDQ0VQVDsKKwlyZXR1cm4gTkZfQUNDRVBUOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yYXcuYyBiL25ldC9pcHY2L3Jhdy5jCmluZGV4IGNjNzMxM2IuLjZhNzlmMzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Jhdy5jCisrKyBiL25ldC9pcHY2L3Jhdy5jCkBAIC05NTksNTcgKzk1OSw1NCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXN3aXRjaCAob3B0bmFtZSkgewotCQljYXNlIElQVjZfQ0hFQ0tTVU06Ci0JCQlpZiAoaW5ldF9zayhzayktPmluZXRfbnVtID09IElQUFJPVE9fSUNNUFY2ICYmCi0JCQkgICAgbGV2ZWwgPT0gSVBQUk9UT19JUFY2KSB7Ci0JCQkJLyoKLQkJCQkgKiBSRkMzNTQyIHRlbGxzIHRoYXQgSVBWNl9DSEVDS1NVTSBzb2NrZXQKLQkJCQkgKiBvcHRpb24gaW4gdGhlIElQUFJPVE9fSVBWNiBsZXZlbCBpcyBub3QKLQkJCQkgKiBhbGxvd2VkIG9uIElDTVB2NiBzb2NrZXRzLgotCQkJCSAqIElmIHlvdSB3YW50IHRvIHNldCBpdCwgdXNlIElQUFJPVE9fUkFXCi0JCQkJICogbGV2ZWwgSVBWNl9DSEVDS1NVTSBzb2NrZXQgb3B0aW9uCi0JCQkJICogKExpbnV4IGV4dGVuc2lvbikuCi0JCQkJICovCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CisJY2FzZSBJUFY2X0NIRUNLU1VNOgorCQlpZiAoaW5ldF9zayhzayktPmluZXRfbnVtID09IElQUFJPVE9fSUNNUFY2ICYmCisJCSAgICBsZXZlbCA9PSBJUFBST1RPX0lQVjYpIHsKKwkJCS8qCisJCQkgKiBSRkMzNTQyIHRlbGxzIHRoYXQgSVBWNl9DSEVDS1NVTSBzb2NrZXQKKwkJCSAqIG9wdGlvbiBpbiB0aGUgSVBQUk9UT19JUFY2IGxldmVsIGlzIG5vdAorCQkJICogYWxsb3dlZCBvbiBJQ01QdjYgc29ja2V0cy4KKwkJCSAqIElmIHlvdSB3YW50IHRvIHNldCBpdCwgdXNlIElQUFJPVE9fUkFXCisJCQkgKiBsZXZlbCBJUFY2X0NIRUNLU1VNIHNvY2tldCBvcHRpb24KKwkJCSAqIChMaW51eCBleHRlbnNpb24pLgorCQkJICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCi0JCQkvKiBZb3UgbWF5IGdldCBzdHJhbmdlIHJlc3VsdCB3aXRoIGEgcG9zaXRpdmUgb2RkIG9mZnNldDsKLQkJCSAgIFJGQzIyOTJiaXMgYWdyZWVzIHdpdGggbWUuICovCi0JCQlpZiAodmFsID4gMCAmJiAodmFsJjEpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKHZhbCA8IDApIHsKLQkJCQlycC0+Y2hlY2tzdW0gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlycC0+Y2hlY2tzdW0gPSAxOwotCQkJCXJwLT5vZmZzZXQgPSB2YWw7Ci0JCQl9CisJCS8qIFlvdSBtYXkgZ2V0IHN0cmFuZ2UgcmVzdWx0IHdpdGggYSBwb3NpdGl2ZSBvZGQgb2Zmc2V0OworCQkgICBSRkMyMjkyYmlzIGFncmVlcyB3aXRoIG1lLiAqLworCQlpZiAodmFsID4gMCAmJiAodmFsJjEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2YWwgPCAwKSB7CisJCQlycC0+Y2hlY2tzdW0gPSAwOworCQl9IGVsc2UgeworCQkJcnAtPmNoZWNrc3VtID0gMTsKKwkJCXJwLT5vZmZzZXQgPSB2YWw7CisJCX0KIAotCQkJcmV0dXJuIDA7Ci0JCQlicmVhazsKKwkJcmV0dXJuIDA7CiAKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgcmF3djZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7Ci0Jc3dpdGNoKGxldmVsKSB7Ci0JCWNhc2UgU09MX1JBVzoKLQkJCWJyZWFrOworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNPTF9SQVc6CisJCWJyZWFrOwogCi0JCWNhc2UgU09MX0lDTVBWNjoKLQkJCWlmIChpbmV0X3NrKHNrKS0+aW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpCi0JCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQkJcmV0dXJuIHJhd3Y2X3NldGljbXBmaWx0ZXIoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsCi0JCQkJCQkgICBvcHRsZW4pOwotCQljYXNlIFNPTF9JUFY2OgotCQkJaWYgKG9wdG5hbWUgPT0gSVBWNl9DSEVDS1NVTSkKLQkJCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBpcHY2X3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsCi0JCQkJCSAgICAgICBvcHRsZW4pOworCWNhc2UgU09MX0lDTVBWNjoKKwkJaWYgKGluZXRfc2soc2spLT5pbmV0X251bSAhPSBJUFBST1RPX0lDTVBWNikKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJcmV0dXJuIHJhd3Y2X3NldGljbXBmaWx0ZXIoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisJY2FzZSBTT0xfSVBWNjoKKwkJaWYgKG9wdG5hbWUgPT0gSVBWNl9DSEVDS1NVTSkKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBpcHY2X3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiAJfQogCiAJcmV0dXJuIGRvX3Jhd3Y2X3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CkBAIC0xMDc1LDIxICsxMDcyLDE5IEBACiBzdGF0aWMgaW50IHJhd3Y2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCiB7Ci0Jc3dpdGNoKGxldmVsKSB7Ci0JCWNhc2UgU09MX1JBVzoKLQkJCWJyZWFrOworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNPTF9SQVc6CisJCWJyZWFrOwogCi0JCWNhc2UgU09MX0lDTVBWNjoKLQkJCWlmIChpbmV0X3NrKHNrKS0+aW5ldF9udW0gIT0gSVBQUk9UT19JQ01QVjYpCi0JCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQkJcmV0dXJuIHJhd3Y2X2dldGljbXBmaWx0ZXIoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsCi0JCQkJCQkgICBvcHRsZW4pOwotCQljYXNlIFNPTF9JUFY2OgotCQkJaWYgKG9wdG5hbWUgPT0gSVBWNl9DSEVDS1NVTSkKLQkJCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBpcHY2X2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsCi0JCQkJCSAgICAgICBvcHRsZW4pOworCWNhc2UgU09MX0lDTVBWNjoKKwkJaWYgKGluZXRfc2soc2spLT5pbmV0X251bSAhPSBJUFBST1RPX0lDTVBWNikKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJcmV0dXJuIHJhd3Y2X2dldGljbXBmaWx0ZXIoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisJY2FzZSBTT0xfSVBWNjoKKwkJaWYgKG9wdG5hbWUgPT0gSVBWNl9DSEVDS1NVTSkKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBpcHY2X2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiAJfQogCiAJcmV0dXJuIGRvX3Jhd3Y2X2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CkBAIC0xMTE5LDMxICsxMTE0LDI5IEBACiAKIHN0YXRpYyBpbnQgcmF3djZfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzd2l0Y2goY21kKSB7Ci0JCWNhc2UgU0lPQ09VVFE6Ci0JCXsKLQkJCWludCBhbW91bnQgPSBza193bWVtX2FsbG9jX2dldChzayk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NPVVRROiB7CisJCWludCBhbW91bnQgPSBza193bWVtX2FsbG9jX2dldChzayk7CiAKLQkJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKLQkJfQotCQljYXNlIFNJT0NJTlE6Ci0JCXsKLQkJCXN0cnVjdCBza19idWZmICpza2I7Ci0JCQlpbnQgYW1vdW50ID0gMDsKKwkJcmV0dXJuIHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCX0KKwljYXNlIFNJT0NJTlE6IHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJaW50IGFtb3VudCA9IDA7CiAKLQkJCXNwaW5fbG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7Ci0JCQlza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpOwotCQkJaWYgKHNrYiAhPSBOVUxMKQotCQkJCWFtb3VudCA9IHNrYi0+dGFpbCAtIHNrYi0+dHJhbnNwb3J0X2hlYWRlcjsKLQkJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKLQkJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKLQkJfQorCQlzcGluX2xvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCQlza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQlpZiAoc2tiICE9IE5VTEwpCisJCQlhbW91bnQgPSBza2ItPnRhaWwgLSBza2ItPnRyYW5zcG9ydF9oZWFkZXI7CisJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJcmV0dXJuIHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCX0KIAotCQlkZWZhdWx0OgorCWRlZmF1bHQ6CiAjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFCi0JCQlyZXR1cm4gaXA2bXJfaW9jdGwoc2ssIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKwkJcmV0dXJuIGlwNm1yX2lvY3RsKHNrLCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7CiAjZWxzZQotCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKICNlbmRpZgogCX0KIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JvdXRlLmMgYi9uZXQvaXB2Ni9yb3V0ZS5jCmluZGV4IGRlMmIxZGUuLmU4OTg3ZGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JvdXRlLmMKKysrIGIvbmV0L2lwdjYvcm91dGUuYwpAQCAtNzIsNyArNzIsOCBAQAogI2RlZmluZSBSVDZfVFJBQ0UoeC4uLikgZG8geyA7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBydDZfaW5mbyAqIGlwNl9ydF9jb3B5KHN0cnVjdCBydDZfaW5mbyAqb3J0KTsKK3N0YXRpYyBzdHJ1Y3QgcnQ2X2luZm8gKmlwNl9ydF9jb3B5KGNvbnN0IHN0cnVjdCBydDZfaW5mbyAqb3J0LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRlc3QpOwogc3RhdGljIHN0cnVjdCBkc3RfZW50cnkJKmlwNl9kc3RfY2hlY2soc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1MzIgY29va2llKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQJIGlwNl9kZWZhdWx0X2Fkdm1zcyhjb25zdCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogc3RhdGljIHVuc2lnbmVkIGludAkgaXA2X2RlZmF1bHRfbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CkBAIC0xMjcsNiArMTI4LDExIEBACiAJcmV0dXJuIHA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hib3VyICppcDZfbmVpZ2hfbG9va3VwKGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgY29uc3Qgdm9pZCAqZGFkZHIpCit7CisJcmV0dXJuIF9fbmVpZ2hfbG9va3VwX2Vycm5vKCZuZF90YmwsIGRhZGRyLCBkc3QtPmRldik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHN0X29wcyBpcDZfZHN0X29wc190ZW1wbGF0ZSA9IHsKIAkuZmFtaWx5CQkJPQlBRl9JTkVUNiwKIAkucHJvdG9jb2wJCT0JY3B1X3RvX2JlMTYoRVRIX1BfSVBWNiksCkBAIC0xNDIsNiArMTQ4LDcgQEAKIAkubGlua19mYWlsdXJlCQk9CWlwNl9saW5rX2ZhaWx1cmUsCiAJLnVwZGF0ZV9wbXR1CQk9CWlwNl9ydF91cGRhdGVfcG10dSwKIAkubG9jYWxfb3V0CQk9CV9faXA2X2xvY2FsX291dCwKKwkubmVpZ2hfbG9va3VwCQk9CWlwNl9uZWlnaF9sb29rdXAsCiB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlwNl9ibGFja2hvbGVfZGVmYXVsdF9tdHUoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQpAQCAtMTY4LDYgKzE3NSw3IEBACiAJLmRlZmF1bHRfYWR2bXNzCQk9CWlwNl9kZWZhdWx0X2Fkdm1zcywKIAkudXBkYXRlX3BtdHUJCT0JaXA2X3J0X2JsYWNraG9sZV91cGRhdGVfcG10dSwKIAkuY293X21ldHJpY3MJCT0JaXA2X3J0X2JsYWNraG9sZV9jb3dfbWV0cmljcywKKwkubmVpZ2hfbG9va3VwCQk9CWlwNl9uZWlnaF9sb29rdXAsCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGlwNl90ZW1wbGF0ZV9tZXRyaWNzW1JUQVhfTUFYXSA9IHsKQEAgLTIyOCw5ICsyMzYsMTAgQEAKIAogLyogYWxsb2NhdGUgZHN0IHdpdGggaXA2X2RzdF9vcHMgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJ0Nl9pbmZvICppcDZfZHN0X2FsbG9jKHN0cnVjdCBkc3Rfb3BzICpvcHMsCi0JCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKwkJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gZHN0X2FsbG9jKG9wcywgZGV2LCAwLCAwLCAwKTsKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gZHN0X2FsbG9jKG9wcywgZGV2LCAwLCAwLCBmbGFncyk7CiAKIAltZW1zZXQoJnJ0LT5ydDZpX3RhYmxlLCAwLCBzaXplb2YoKnJ0KSAtIHNpemVvZihzdHJ1Y3QgZHN0X2VudHJ5KSk7CiAKQEAgLTM1NSw3ICszNjQsNyBAQAogI2lmZGVmIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGCiBzdGF0aWMgdm9pZCBydDZfcHJvYmUoc3RydWN0IHJ0Nl9pbmZvICpydCkKIHsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IHJ0ID8gcnQtPnJ0NmlfbmV4dGhvcCA6IE5VTEw7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBydCA/IGRzdF9nZXRfbmVpZ2hib3VyKCZydC0+ZHN0KSA6IE5VTEw7CiAJLyoKIAkgKiBPa2F5LCB0aGlzIGRvZXMgbm90IHNlZW0gdG8gYmUgYXBwcm9wcmlhdGUKIAkgKiBmb3Igbm93LCBob3dldmVyLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0CkBAIC00MDMsNyArNDEyLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgcnQ2X2NoZWNrX25laWdoKHN0cnVjdCBydDZfaW5mbyAqcnQpCiB7Ci0Jc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBydC0+cnQ2aV9uZXh0aG9wOworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpOwogCWludCBtOwogCWlmIChydC0+cnQ2aV9mbGFncyAmIFJURl9OT05FWFRIT1AgfHwKIAkgICAgIShydC0+cnQ2aV9mbGFncyAmIFJURl9HQVRFV0FZKSkKQEAgLTY4Miw3ICs2OTEsOCBAQAogCXJldHVybiBfX2lwNl9pbnNfcnQocnQsICZpbmZvKTsKIH0KIAotc3RhdGljIHN0cnVjdCBydDZfaW5mbyAqcnQ2X2FsbG9jX2NvdyhzdHJ1Y3QgcnQ2X2luZm8gKm9ydCwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKK3N0YXRpYyBzdHJ1Y3QgcnQ2X2luZm8gKnJ0Nl9hbGxvY19jb3coY29uc3Qgc3RydWN0IHJ0Nl9pbmZvICpvcnQsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyKQogewogCXN0cnVjdCBydDZfaW5mbyAqcnQ7CkBAIC02OTEsNyArNzAxLDcgQEAKIAkgKglDbG9uZSB0aGUgcm91dGUuCiAJICovCiAKLQlydCA9IGlwNl9ydF9jb3B5KG9ydCk7CisJcnQgPSBpcDZfcnRfY29weShvcnQsIGRhZGRyKTsKIAogCWlmIChydCkgewogCQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKQEAgLTY5OSwxMiArNzA5LDExIEBACiAKIAkJaWYgKCEocnQtPnJ0NmlfZmxhZ3MmUlRGX0dBVEVXQVkpKSB7CiAJCQlpZiAocnQtPnJ0NmlfZHN0LnBsZW4gIT0gMTI4ICYmCi0JCQkgICAgaXB2Nl9hZGRyX2VxdWFsKCZydC0+cnQ2aV9kc3QuYWRkciwgZGFkZHIpKQorCQkJICAgIGlwdjZfYWRkcl9lcXVhbCgmb3J0LT5ydDZpX2RzdC5hZGRyLCBkYWRkcikpCiAJCQkJcnQtPnJ0NmlfZmxhZ3MgfD0gUlRGX0FOWUNBU1Q7CiAJCQlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZ2F0ZXdheSwgZGFkZHIpOwogCQl9CiAKLQkJaXB2Nl9hZGRyX2NvcHkoJnJ0LT5ydDZpX2RzdC5hZGRyLCBkYWRkcik7CiAJCXJ0LT5ydDZpX2RzdC5wbGVuID0gMTI4OwogCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfQ0FDSEU7CiAJCXJ0LT5kc3QuZmxhZ3MgfD0gRFNUX0hPU1Q7CkBAIC03NDQsMjIgKzc1MywyMyBAQAogCQkJZHN0X2ZyZWUoJnJ0LT5kc3QpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJcnQtPnJ0NmlfbmV4dGhvcCA9IG5laWdoOworCQlkc3Rfc2V0X25laWdoYm91cigmcnQtPmRzdCwgbmVpZ2gpOwogCiAJfQogCiAJcmV0dXJuIHJ0OwogfQogCi1zdGF0aWMgc3RydWN0IHJ0Nl9pbmZvICpydDZfYWxsb2NfY2xvbmUoc3RydWN0IHJ0Nl9pbmZvICpvcnQsIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIpCitzdGF0aWMgc3RydWN0IHJ0Nl9pbmZvICpydDZfYWxsb2NfY2xvbmUoc3RydWN0IHJ0Nl9pbmZvICpvcnQsCisJCQkJCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIpCiB7Ci0Jc3RydWN0IHJ0Nl9pbmZvICpydCA9IGlwNl9ydF9jb3B5KG9ydCk7CisJc3RydWN0IHJ0Nl9pbmZvICpydCA9IGlwNl9ydF9jb3B5KG9ydCwgZGFkZHIpOworCiAJaWYgKHJ0KSB7Ci0JCWlwdjZfYWRkcl9jb3B5KCZydC0+cnQ2aV9kc3QuYWRkciwgZGFkZHIpOwogCQlydC0+cnQ2aV9kc3QucGxlbiA9IDEyODsKIAkJcnQtPnJ0NmlfZmxhZ3MgfD0gUlRGX0NBQ0hFOwogCQlydC0+ZHN0LmZsYWdzIHw9IERTVF9IT1NUOwotCQlydC0+cnQ2aV9uZXh0aG9wID0gbmVpZ2hfY2xvbmUob3J0LT5ydDZpX25leHRob3ApOworCQlkc3Rfc2V0X25laWdoYm91cigmcnQtPmRzdCwgbmVpZ2hfY2xvbmUoZHN0X2dldF9uZWlnaGJvdXIoJm9ydC0+ZHN0KSkpOwogCX0KIAlyZXR1cm4gcnQ7CiB9CkBAIC03OTMsNyArODAzLDcgQEAKIAlkc3RfaG9sZCgmcnQtPmRzdCk7CiAJcmVhZF91bmxvY2tfYmgoJnRhYmxlLT50YjZfbG9jayk7CiAKLQlpZiAoIXJ0LT5ydDZpX25leHRob3AgJiYgIShydC0+cnQ2aV9mbGFncyAmIFJURl9OT05FWFRIT1ApKQorCWlmICghZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpICYmICEocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfTk9ORVhUSE9QKSkKIAkJbnJ0ID0gcnQ2X2FsbG9jX2NvdyhydCwgJmZsNi0+ZGFkZHIsICZmbDYtPnNhZGRyKTsKIAllbHNlIGlmICghKHJ0LT5kc3QuZmxhZ3MgJiBEU1RfSE9TVCkpCiAJCW5ydCA9IHJ0Nl9hbGxvY19jbG9uZShydCwgJmZsNi0+ZGFkZHIpOwpAQCAtODk5LDcgKzkwOSwxMCBAQAogCQluZXctPmlucHV0ID0gZHN0X2Rpc2NhcmQ7CiAJCW5ldy0+b3V0cHV0ID0gZHN0X2Rpc2NhcmQ7CiAKLQkJZHN0X2NvcHlfbWV0cmljcyhuZXcsICZvcnQtPmRzdCk7CisJCWlmIChkc3RfbWV0cmljc19yZWFkX29ubHkoJm9ydC0+ZHN0KSkKKwkJCW5ldy0+X21ldHJpY3MgPSBvcnQtPmRzdC5fbWV0cmljczsKKwkJZWxzZQorCQkJZHN0X2NvcHlfbWV0cmljcyhuZXcsICZvcnQtPmRzdCk7CiAJCXJ0LT5ydDZpX2lkZXYgPSBvcnQtPnJ0NmlfaWRldjsKIAkJaWYgKHJ0LT5ydDZpX2lkZXYpCiAJCQlpbjZfZGV2X2hvbGQocnQtPnJ0NmlfaWRldik7CkBAIC0xMDQyLDcgKzEwNTUsNyBAQAogCWlmICh1bmxpa2VseShpZGV2ID09IE5VTEwpKQogCQlyZXR1cm4gTlVMTDsKIAotCXJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzLCBkZXYpOworCXJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzLCBkZXYsIDApOwogCWlmICh1bmxpa2VseShydCA9PSBOVUxMKSkgewogCQlpbjZfZGV2X3B1dChpZGV2KTsKIAkJZ290byBvdXQ7CkBAIC0xMDU3LDE5ICsxMDcwLDEyIEBACiAJfQogCiAJcnQtPnJ0NmlfaWRldiAgICAgPSBpZGV2OwotCXJ0LT5ydDZpX25leHRob3AgID0gbmVpZ2g7CisJZHN0X3NldF9uZWlnaGJvdXIoJnJ0LT5kc3QsIG5laWdoKTsKIAlhdG9taWNfc2V0KCZydC0+ZHN0Ll9fcmVmY250LCAxKTsKKwlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZHN0LmFkZHIsIGFkZHIpOwogCWRzdF9tZXRyaWNfc2V0KCZydC0+ZHN0LCBSVEFYX0hPUExJTUlULCAyNTUpOwogCXJ0LT5kc3Qub3V0cHV0ICA9IGlwNl9vdXRwdXQ7CiAKLSNpZiAwCS8qIHRoZXJlJ3Mgbm8gY2hhbmNlIHRvIHVzZSB0aGVzZSBmb3IgbmRpc2MgKi8KLQlydC0+ZHN0LmZsYWdzICAgPSBpcHY2X2FkZHJfdHlwZShhZGRyKSAmIElQVjZfQUREUl9VTklDQVNUCi0JCQkJPyBEU1RfSE9TVAotCQkJCTogMDsKLQlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZHN0LmFkZHIsIGFkZHIpOwotCXJ0LT5ydDZpX2RzdC5wbGVuID0gMTI4OwotI2VuZGlmCi0KIAlzcGluX2xvY2tfYmgoJmljbXA2X2RzdF9sb2NrKTsKIAlydC0+ZHN0Lm5leHQgPSBpY21wNl9kc3RfZ2NfbGlzdDsKIAlpY21wNl9kc3RfZ2NfbGlzdCA9ICZydC0+ZHN0OwpAQCAtMTIxNCw3ICsxMjIwLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcnQgPSBpcDZfZHN0X2FsbG9jKCZuZXQtPmlwdjYuaXA2X2RzdF9vcHMsIE5VTEwpOworCXJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzLCBOVUxMLCBEU1RfTk9DT1VOVCk7CiAKIAlpZiAocnQgPT0gTlVMTCkgewogCQllcnIgPSAtRU5PTUVNOwpAQCAtMTI0NCw3ICsxMjUwLDcgQEAKIAlpcHY2X2FkZHJfcHJlZml4KCZydC0+cnQ2aV9kc3QuYWRkciwgJmNmZy0+ZmNfZHN0LCBjZmctPmZjX2RzdF9sZW4pOwogCXJ0LT5ydDZpX2RzdC5wbGVuID0gY2ZnLT5mY19kc3RfbGVuOwogCWlmIChydC0+cnQ2aV9kc3QucGxlbiA9PSAxMjgpCi0JICAgICAgIHJ0LT5kc3QuZmxhZ3MgPSBEU1RfSE9TVDsKKwkgICAgICAgcnQtPmRzdC5mbGFncyB8PSBEU1RfSE9TVDsKIAogI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCiAJaXB2Nl9hZGRyX3ByZWZpeCgmcnQtPnJ0Nmlfc3JjLmFkZHIsICZjZmctPmZjX3NyYywgY2ZnLT5mY19zcmNfbGVuKTsKQEAgLTEzNDUsMTIgKzEzNTEsMTIgQEAKIAkJcnQtPnJ0NmlfcHJlZnNyYy5wbGVuID0gMDsKIAogCWlmIChjZmctPmZjX2ZsYWdzICYgKFJURl9HQVRFV0FZIHwgUlRGX05PTkVYVEhPUCkpIHsKLQkJcnQtPnJ0NmlfbmV4dGhvcCA9IF9fbmVpZ2hfbG9va3VwX2Vycm5vKCZuZF90YmwsICZydC0+cnQ2aV9nYXRld2F5LCBkZXYpOwotCQlpZiAoSVNfRVJSKHJ0LT5ydDZpX25leHRob3ApKSB7Ci0JCQllcnIgPSBQVFJfRVJSKHJ0LT5ydDZpX25leHRob3ApOwotCQkJcnQtPnJ0NmlfbmV4dGhvcCA9IE5VTEw7CisJCXN0cnVjdCBuZWlnaGJvdXIgKm4gPSBfX25laWdoX2xvb2t1cF9lcnJubygmbmRfdGJsLCAmcnQtPnJ0NmlfZ2F0ZXdheSwgZGV2KTsKKwkJaWYgKElTX0VSUihuKSkgeworCQkJZXJyID0gUFRSX0VSUihuKTsKIAkJCWdvdG8gb3V0OwogCQl9CisJCWRzdF9zZXRfbmVpZ2hib3VyKCZydC0+ZHN0LCBuKTsKIAl9CiAKIAlydC0+cnQ2aV9mbGFncyA9IGNmZy0+ZmNfZmxhZ3M7CkBAIC0xNTgxLDEwICsxNTg3LDEwIEBACiAJZHN0X2NvbmZpcm0oJnJ0LT5kc3QpOwogCiAJLyogRHVwbGljYXRlIHJlZGlyZWN0OiBzaWxlbnRseSBpZ25vcmUuICovCi0JaWYgKG5laWdoID09IHJ0LT5kc3QubmVpZ2hib3VyKQorCWlmIChuZWlnaCA9PSBkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCkpCiAJCWdvdG8gb3V0OwogCi0JbnJ0ID0gaXA2X3J0X2NvcHkocnQpOworCW5ydCA9IGlwNl9ydF9jb3B5KHJ0LCBkZXN0KTsKIAlpZiAobnJ0ID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCkBAIC0xNTkyLDEyICsxNTk4LDExIEBACiAJaWYgKG9uX2xpbmspCiAJCW5ydC0+cnQ2aV9mbGFncyAmPSB+UlRGX0dBVEVXQVk7CiAKLQlpcHY2X2FkZHJfY29weSgmbnJ0LT5ydDZpX2RzdC5hZGRyLCBkZXN0KTsKIAlucnQtPnJ0NmlfZHN0LnBsZW4gPSAxMjg7CiAJbnJ0LT5kc3QuZmxhZ3MgfD0gRFNUX0hPU1Q7CiAKIAlpcHY2X2FkZHJfY29weSgmbnJ0LT5ydDZpX2dhdGV3YXksIChzdHJ1Y3QgaW42X2FkZHIqKW5laWdoLT5wcmltYXJ5X2tleSk7Ci0JbnJ0LT5ydDZpX25leHRob3AgPSBuZWlnaF9jbG9uZShuZWlnaCk7CisJZHN0X3NldF9uZWlnaGJvdXIoJm5ydC0+ZHN0LCBuZWlnaF9jbG9uZShuZWlnaCkpOwogCiAJaWYgKGlwNl9pbnNfcnQobnJ0KSkKIAkJZ290byBvdXQ7CkBAIC0xNjc3LDcgKzE2ODIsNyBAQAogCSAgIDEuIEl0IGlzIGNvbm5lY3RlZCByb3V0ZS4gQWN0aW9uOiBDT1cKIAkgICAyLiBJdCBpcyBnYXRld2F5ZWQgcm91dGUgb3IgTk9ORVhUSE9QIHJvdXRlLiBBY3Rpb246IGNsb25lIGl0LgogCSAqLwotCWlmICghcnQtPnJ0NmlfbmV4dGhvcCAmJiAhKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX05PTkVYVEhPUCkpCisJaWYgKCFkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCkgJiYgIShydC0+cnQ2aV9mbGFncyAmIFJURl9OT05FWFRIT1ApKQogCQlucnQgPSBydDZfYWxsb2NfY293KHJ0LCBkYWRkciwgc2FkZHIpOwogCWVsc2UKIAkJbnJ0ID0gcnQ2X2FsbG9jX2Nsb25lKHJ0LCBkYWRkcik7CkBAIC0xNzMwLDE2ICsxNzM1LDE5IEBACiAgKglNaXNjIHN1cHBvcnQgZnVuY3Rpb25zCiAgKi8KIAotc3RhdGljIHN0cnVjdCBydDZfaW5mbyAqIGlwNl9ydF9jb3B5KHN0cnVjdCBydDZfaW5mbyAqb3J0KQorc3RhdGljIHN0cnVjdCBydDZfaW5mbyAqaXA2X3J0X2NvcHkoY29uc3Qgc3RydWN0IHJ0Nl9pbmZvICpvcnQsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGVzdCkKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KG9ydC0+cnQ2aV9kZXYpOwogCXN0cnVjdCBydDZfaW5mbyAqcnQgPSBpcDZfZHN0X2FsbG9jKCZuZXQtPmlwdjYuaXA2X2RzdF9vcHMsCi0JCQkJCSAgICBvcnQtPmRzdC5kZXYpOworCQkJCQkgICAgb3J0LT5kc3QuZGV2LCAwKTsKIAogCWlmIChydCkgewogCQlydC0+ZHN0LmlucHV0ID0gb3J0LT5kc3QuaW5wdXQ7CiAJCXJ0LT5kc3Qub3V0cHV0ID0gb3J0LT5kc3Qub3V0cHV0OwogCisJCWlwdjZfYWRkcl9jb3B5KCZydC0+cnQ2aV9kc3QuYWRkciwgZGVzdCk7CisJCXJ0LT5ydDZpX2RzdC5wbGVuID0gb3J0LT5ydDZpX2RzdC5wbGVuOwogCQlkc3RfY29weV9tZXRyaWNzKCZydC0+ZHN0LCAmb3J0LT5kc3QpOwogCQlydC0+ZHN0LmVycm9yID0gb3J0LT5kc3QuZXJyb3I7CiAJCXJ0LT5ydDZpX2lkZXYgPSBvcnQtPnJ0NmlfaWRldjsKQEAgLTE3NTIsNyArMTc2MCw2IEBACiAJCXJ0LT5ydDZpX2ZsYWdzID0gb3J0LT5ydDZpX2ZsYWdzICYgflJURl9FWFBJUkVTOwogCQlydC0+cnQ2aV9tZXRyaWMgPSAwOwogCi0JCW1lbWNweSgmcnQtPnJ0NmlfZHN0LCAmb3J0LT5ydDZpX2RzdCwgc2l6ZW9mKHN0cnVjdCBydDZrZXkpKTsKICNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUwogCQltZW1jcHkoJnJ0LT5ydDZpX3NyYywgJm9ydC0+cnQ2aV9zcmMsIHNpemVvZihzdHJ1Y3QgcnQ2a2V5KSk7CiAjZW5kaWYKQEAgLTIwMTMsNyArMjAyMCw3IEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChpZGV2LT5kZXYpOwogCXN0cnVjdCBydDZfaW5mbyAqcnQgPSBpcDZfZHN0X2FsbG9jKCZuZXQtPmlwdjYuaXA2X2RzdF9vcHMsCi0JCQkJCSAgICBuZXQtPmxvb3BiYWNrX2Rldik7CisJCQkJCSAgICBuZXQtPmxvb3BiYWNrX2RldiwgMCk7CiAJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CiAKIAlpZiAocnQgPT0gTlVMTCkgewpAQCAtMjAyNSw3ICsyMDMyLDcgQEAKIAogCWluNl9kZXZfaG9sZChpZGV2KTsKIAotCXJ0LT5kc3QuZmxhZ3MgPSBEU1RfSE9TVDsKKwlydC0+ZHN0LmZsYWdzIHw9IERTVF9IT1NUOwogCXJ0LT5kc3QuaW5wdXQgPSBpcDZfaW5wdXQ7CiAJcnQtPmRzdC5vdXRwdXQgPSBpcDZfb3V0cHV0OwogCXJ0LT5ydDZpX2lkZXYgPSBpZGV2OwpAQCAtMjA0Miw3ICsyMDQ5LDcgQEAKIAogCQlyZXR1cm4gRVJSX0NBU1QobmVpZ2gpOwogCX0KLQlydC0+cnQ2aV9uZXh0aG9wID0gbmVpZ2g7CisJZHN0X3NldF9uZWlnaGJvdXIoJnJ0LT5kc3QsIG5laWdoKTsKIAogCWlwdjZfYWRkcl9jb3B5KCZydC0+cnQ2aV9kc3QuYWRkciwgYWRkcik7CiAJcnQtPnJ0NmlfZHN0LnBsZW4gPSAxMjg7CkBAIC0yNDA3LDggKzI0MTQsOCBAQAogCWlmIChydG5ldGxpbmtfcHV0X21ldHJpY3Moc2tiLCBkc3RfbWV0cmljc19wdHIoJnJ0LT5kc3QpKSA8IDApCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JaWYgKHJ0LT5kc3QubmVpZ2hib3VyKQotCQlOTEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDE2LCAmcnQtPmRzdC5uZWlnaGJvdXItPnByaW1hcnlfa2V5KTsKKwlpZiAoZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpKQorCQlOTEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDE2LCAmZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpLT5wcmltYXJ5X2tleSk7CiAKIAlpZiAocnQtPmRzdC5kZXYpCiAJCU5MQV9QVVRfVTMyKHNrYiwgUlRBX09JRiwgcnQtPnJ0NmlfZGV2LT5pZmluZGV4KTsKQEAgLTI1OTIsNiArMjU5OSw3IEBACiBzdGF0aWMgaW50IHJ0Nl9pbmZvX3JvdXRlKHN0cnVjdCBydDZfaW5mbyAqcnQsIHZvaWQgKnBfYXJnKQogewogCXN0cnVjdCBzZXFfZmlsZSAqbSA9IHBfYXJnOworCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAKIAlzZXFfcHJpbnRmKG0sICIlcGk2ICUwMnggIiwgJnJ0LT5ydDZpX2RzdC5hZGRyLCBydC0+cnQ2aV9kc3QucGxlbik7CiAKQEAgLTI2MDAsOSArMjYwOCw5IEBACiAjZWxzZQogCXNlcV9wdXRzKG0sICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMCAiKTsKICNlbmRpZgotCi0JaWYgKHJ0LT5ydDZpX25leHRob3ApIHsKLQkJc2VxX3ByaW50ZihtLCAiJXBpNiIsIHJ0LT5ydDZpX25leHRob3AtPnByaW1hcnlfa2V5KTsKKwluID0gZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpOworCWlmIChuKSB7CisJCXNlcV9wcmludGYobSwgIiVwaTYiLCBuLT5wcmltYXJ5X2tleSk7CiAJfSBlbHNlIHsKIAkJc2VxX3B1dHMobSwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIik7CiAJfQpAQCAtMjkyNSw5ICsyOTMzLDkgQEAKIAkJZ290byB4ZnJtNl9pbml0OwogCiAJcmV0ID0gLUVOT0JVRlM7Ci0JaWYgKF9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX05FV1JPVVRFLCBpbmV0Nl9ydG1fbmV3cm91dGUsIE5VTEwpIHx8Ci0JICAgIF9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX0RFTFJPVVRFLCBpbmV0Nl9ydG1fZGVscm91dGUsIE5VTEwpIHx8Ci0JICAgIF9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX0dFVFJPVVRFLCBpbmV0Nl9ydG1fZ2V0cm91dGUsIE5VTEwpKQorCWlmIChfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9ORVdST1VURSwgaW5ldDZfcnRtX25ld3JvdXRlLCBOVUxMLCBOVUxMKSB8fAorCSAgICBfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9ERUxST1VURSwgaW5ldDZfcnRtX2RlbHJvdXRlLCBOVUxMLCBOVUxMKSB8fAorCSAgICBfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9HRVRST1VURSwgaW5ldDZfcnRtX2dldHJvdXRlLCBOVUxMLCBOVUxMKSkKIAkJZ290byBmaWI2X3J1bGVzX2luaXQ7CiAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmlwNl9yb3V0ZV9kZXZfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc2l0LmMgYi9uZXQvaXB2Ni9zaXQuYwppbmRleCAxY2NhNTc2Li4wN2JmMTA4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zaXQuYworKysgYi9uZXQvaXB2Ni9zaXQuYwpAQCAtNjc3LDcgKzY3Nyw3IEBACiAJCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gTlVMTDsKIAogCQlpZiAoc2tiX2RzdChza2IpKQotCQkJbmVpZ2ggPSBza2JfZHN0KHNrYiktPm5laWdoYm91cjsKKwkJCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoc2tiX2RzdChza2IpKTsKIAogCQlpZiAobmVpZ2ggPT0gTlVMTCkgewogCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKQEAgLTcwMiw3ICs3MDIsNyBAQAogCQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IE5VTEw7CiAKIAkJaWYgKHNrYl9kc3Qoc2tiKSkKLQkJCW5laWdoID0gc2tiX2RzdChza2IpLT5uZWlnaGJvdXI7CisJCQluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyKHNrYl9kc3Qoc2tiKSk7CiAKIAkJaWYgKG5laWdoID09IE5VTEwpIHsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9zeW5jb29raWVzLmMgYi9uZXQvaXB2Ni9zeW5jb29raWVzLmMKaW5kZXggOGI5NjQ0YS4uODlkNWJmOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvc3luY29va2llcy5jCisrKyBiL25ldC9pcHY2L3N5bmNvb2tpZXMuYwpAQCAtMjIzLDYgKzIyMyw3IEBACiAJaXJlcS0+d3NjYWxlX29rCQk9IHRjcF9vcHQud3NjYWxlX29rOwogCWlyZXEtPnRzdGFtcF9vawkJPSB0Y3Bfb3B0LnNhd190c3RhbXA7CiAJcmVxLT50c19yZWNlbnQJCT0gdGNwX29wdC5zYXdfdHN0YW1wID8gdGNwX29wdC5yY3ZfdHN2YWwgOiAwOworCXRyZXEtPnNudF9zeW5hY2sJPSB0Y3Bfb3B0LnNhd190c3RhbXAgPyB0Y3Bfb3B0LnJjdl90c2VjciA6IDA7CiAJdHJlcS0+cmN2X2lzbiA9IG50b2hsKHRoLT5zZXEpIC0gMTsKIAl0cmVxLT5zbnRfaXNuID0gY29va2llOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwppbmRleCBkMWZkMjg3Li43OGFhNTM0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKQEAgLTEzNDEsNiArMTM0MSw3IEBACiAJfQogaGF2ZV9pc246CiAJdGNwX3JzayhyZXEpLT5zbnRfaXNuID0gaXNuOworCXRjcF9yc2socmVxKS0+c250X3N5bmFjayA9IHRjcF90aW1lX3N0YW1wOwogCiAJc2VjdXJpdHlfaW5ldF9jb25uX3JlcXVlc3Qoc2ssIHNrYiwgcmVxKTsKIApAQCAtMTUwOSw2ICsxNTEwLDEwIEBACiAJdGNwX3N5bmNfbXNzKG5ld3NrLCBkc3RfbXR1KGRzdCkpOwogCW5ld3RwLT5hZHZtc3MgPSBkc3RfbWV0cmljX2Fkdm1zcyhkc3QpOwogCXRjcF9pbml0aWFsaXplX3Jjdl9tc3MobmV3c2spOworCWlmICh0Y3BfcnNrKHJlcSktPnNudF9zeW5hY2spCisJCXRjcF92YWxpZF9ydHRfbWVhcyhuZXdzaywKKwkJICAgIHRjcF90aW1lX3N0YW1wIC0gdGNwX3JzayhyZXEpLT5zbnRfc3luYWNrKTsKKwluZXd0cC0+dG90YWxfcmV0cmFucyA9IHJlcS0+cmV0cmFuczsKIAogCW5ld2luZXQtPmluZXRfZGFkZHIgPSBuZXdpbmV0LT5pbmV0X3NhZGRyID0gTE9PUEJBQ0s0X0lQVjY7CiAJbmV3aW5ldC0+aW5ldF9yY3Zfc2FkZHIgPSBMT09QQkFDSzRfSVBWNjsKQEAgLTE2NDQsNiArMTY0OSw3IEBACiAJCSAqIHRoZSBuZXcgc29ja2V0Li4KIAkJICovCiAJCWlmKG5zayAhPSBzaykgeworCQkJc29ja19ycHNfc2F2ZV9yeGhhc2gobnNrLCBza2ItPnJ4aGFzaCk7CiAJCQlpZiAodGNwX2NoaWxkX3Byb2Nlc3Moc2ssIG5zaywgc2tiKSkKIAkJCQlnb3RvIHJlc2V0OwogCQkJaWYgKG9wdF9za2IpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHAuYyBiL25ldC9pcHY2L3VkcC5jCmluZGV4IDQxZjhjOWMuLjI5MjEzYjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcC5jCisrKyBiL25ldC9pcHY2L3VkcC5jCkBAIC00NTMsOCArNDUzLDExIEBACiAJfQogCXVubG9ja19zb2NrX2Zhc3Qoc2ssIHNsb3cpOwogCi0JaWYgKGZsYWdzICYgTVNHX0RPTlRXQUlUKQorCWlmIChub2Jsb2NrKQogCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIHN0YXJ0aW5nIG92ZXIgZm9yIGEgbmV3IHBhY2tldCAqLworCW1zZy0+bXNnX2ZsYWdzICY9IH5NU0dfVFJVTkM7CiAJZ290byB0cnlfYWdhaW47CiB9CiAKQEAgLTEzNTYsNyArMTM1OSw3IEBACiAJZnB0ciA9IChzdHJ1Y3QgZnJhZ19oZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyB1bmZyYWdfaXA2aGxlbik7CiAJZnB0ci0+bmV4dGhkciA9IG5leHRoZHI7CiAJZnB0ci0+cmVzZXJ2ZWQgPSAwOwotCWlwdjZfc2VsZWN0X2lkZW50KGZwdHIpOworCWlwdjZfc2VsZWN0X2lkZW50KGZwdHIsIChzdHJ1Y3QgcnQ2X2luZm8gKilza2JfZHN0KHNrYikpOwogCiAJLyogRnJhZ21lbnQgdGhlIHNrYi4gaXB2NiBoZWFkZXIgYW5kIHRoZSByZW1haW5pbmcgZmllbGRzIG9mIHRoZQogCSAqIGZyYWdtZW50IGhlYWRlciBhcmUgdXBkYXRlZCBpbiBpcHY2X2dzb19zZWdtZW50KCkKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2FmX2lyZGEuYyBiL25ldC9pcmRhL2FmX2lyZGEuYwppbmRleCBjYzYxNjk3Li5jMjRmMjVhIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9hZl9pcmRhLmMKKysrIGIvbmV0L2lyZGEvYWZfaXJkYS5jCkBAIC0zNjksNyArMzY5LDcgQEAKIHsKIAlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmOwogCi0Jc2VsZiA9IChzdHJ1Y3QgaXJkYV9zb2NrICopIHByaXY7CisJc2VsZiA9IHByaXY7CiAJaWYgKCFzZWxmKSB7CiAJCUlSREFfV0FSTklORygiJXM6IGxvc3QgbXlzZWxmIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CkBAIC00MTgsNyArNDE4LDcgQEAKIAogCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAotCXNlbGYgPSAoc3RydWN0IGlyZGFfc29jayAqKSBwcml2OworCXNlbGYgPSBwcml2OwogCWlmICghc2VsZikgewogCQlJUkRBX1dBUk5JTkcoIiVzOiBsb3N0IG15c2VsZiFcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJjb21tL2lyY29tbV90dHlfYXR0YWNoLmMgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eV9hdHRhY2guYwppbmRleCAzYzE3NTQwLi5iNjVkNjZlIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eV9hdHRhY2guYworKysgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eV9hdHRhY2guYwpAQCAtMzgyLDcgKzM4Miw3IEBACiAJaW5mby5kYWRkciA9IGRpc2NvdmVyeS0+ZGFkZHI7CiAJaW5mby5zYWRkciA9IGRpc2NvdmVyeS0+c2FkZHI7CiAKLQlzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIHByaXY7CisJc2VsZiA9IHByaXY7CiAJaXJjb21tX3R0eV9kb19ldmVudChzZWxmLCBJUkNPTU1fVFRZX0RJU0NPVkVSWV9JTkRJQ0FUSU9OLAogCQkJICAgIE5VTEwsICZpbmZvKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMgYi9uZXQvaXJkYS9pcmRhX2RldmljZS5jCmluZGV4IDI1Y2MyZTYuLjNlY2EzNWYgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMKKysrIGIvbmV0L2lyZGEvaXJkYV9kZXZpY2UuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAKIAlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQl0YXNrID0gKHN0cnVjdCBpcmRhX3Rhc2sgKikgZGF0YTsKKwl0YXNrID0gZGF0YTsKIAogCWlyZGFfdGFza19raWNrKHRhc2spOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJpYXAuYyBiL25ldC9pcmRhL2lyaWFwLmMKaW5kZXggMzY0Nzc1My4uZTcxZTg1YiAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJpYXAuYworKysgYi9uZXQvaXJkYS9pcmlhcC5jCkBAIC04Nyw2ICs4Nyw4IEBACiAJCQkgaXJpYXBfd2F0Y2hkb2dfdGltZXJfZXhwaXJlZCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgaXJpYXNfb2JqZWN0c19rZXk7CisKIC8qCiAgKiBGdW5jdGlvbiBpcmlhcF9pbml0ICh2b2lkKQogICoKQEAgLTExNCw2ICsxMTYsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlsb2NrZGVwX3NldF9jbGFzc19hbmRfbmFtZSgmaXJpYXNfb2JqZWN0cy0+aGJfc3BpbmxvY2ssICZpcmlhc19vYmplY3RzX2tleSwKKwkJCQkgICAiaXJpYXNfb2JqZWN0cyIpOworCiAJLyoKIAkgKiAgUmVnaXN0ZXIgc29tZSBkZWZhdWx0IHNlcnZpY2VzIGZvciBJckxNUAogCSAqLwpAQCAtMzAwLDcgKzMwNSw3IEBACiAKIAlJUkRBX0RFQlVHKDQsICIlcygpLCByZWFzb249JXNcbiIsIF9fZnVuY19fLCBpcmxtcF9yZWFzb25zW3JlYXNvbl0pOwogCi0Jc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaW5zdGFuY2U7CisJc2VsZiA9IGluc3RhbmNlOwogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwpAQCAtNzU0LDcgKzc1OSw3IEBACiB7CiAJc3RydWN0IGlyaWFwX2NiICpzZWxmOwogCi0Jc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaW5zdGFuY2U7CisJc2VsZiA9IGluc3RhbmNlOwogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwpAQCAtNzg2LDcgKzc5MSw3IEBACiAKIAlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQlzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBpbnN0YW5jZTsKKwlzZWxmID0gaW5zdGFuY2U7CiAKIAlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCBnb3RvIG91dDspOwpAQCAtODM0LDcgKzgzOSw3IEBACiAKIAlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQlzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBpbnN0YW5jZTsKKwlzZWxmID0gaW5zdGFuY2U7CiAKIAlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIDA7KTsKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIGdvdG8gb3V0Oyk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jbGllbnQuYyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2NsaWVudC5jCmluZGV4IDdlZDNhZjkuLmJhMWEzZmMgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybGFuL2lybGFuX2NsaWVudC5jCisrKyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2NsaWVudC5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIAogCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fZnVuY19fICk7CiAKLQlzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKKwlzZWxmID0gaW5zdGFuY2U7CiAKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwogCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLTE7KTsKQEAgLTIyNiw4ICsyMjYsOCBAQAogCiAJSVJEQV9ERUJVRyg0LCAiJXMoKSwgcmVhc29uPSVkXG4iLCBfX2Z1bmNfXyAsIHJlYXNvbik7CiAKLQlzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKLQl0c2FwID0gKHN0cnVjdCB0c2FwX2NiICopIHNhcDsKKwlzZWxmID0gaW5zdGFuY2U7CisJdHNhcCA9IHNhcDsKIAogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CiAJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwpAQCAtMjk4LDcgKzI5OCw3IEBACiAKIAlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX2Z1bmNfXyApOwogCi0Jc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7CisJc2VsZiA9IGluc3RhbmNlOwogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CkBAIC01NDIsNyArNTQyLDcgQEAKIAogCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuOyk7CiAKLQlzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBwcml2OworCXNlbGYgPSBwcml2OwogCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKIAogCS8qIFdlIHByb2JhYmx5IGRvbid0IG5lZWQgdG8gbWFrZSBhbnkgbW9yZSBxdWVyaWVzICovCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2NvbW1vbi5jCmluZGV4IDYxMzBmOWQuLjc3OTExNzYgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybGFuL2lybGFuX2NvbW1vbi5jCisrKyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2NvbW1vbi5jCkBAIC0zMTcsOCArMzE3LDggQEAKIAogCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fZnVuY19fICk7CiAKLQlzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKLQl0c2FwID0gKHN0cnVjdCB0c2FwX2NiICopIHNhcDsKKwlzZWxmID0gaW5zdGFuY2U7CisJdHNhcCA9IHNhcDsKIAogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CiAJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwpAQCAtMzYxLDcgKzM2MSw3IEBACiB7CiAJc3RydWN0IGlybGFuX2NiICpzZWxmOwogCi0Jc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7CisJc2VsZiA9IGluc3RhbmNlOwogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CkBAIC00MDYsOCArNDA2LDggQEAKIAogCUlSREFfREVCVUcoMCwgIiVzKCksIHJlYXNvbj0lZFxuIiwgX19mdW5jX18gLCByZWFzb24pOwogCi0Jc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7Ci0JdHNhcCA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBzYXA7CisJc2VsZiA9IGluc3RhbmNlOworCXRzYXAgPSBzYXA7CiAKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwogCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFuL2lybGFuX2V0aC5jIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fZXRoLmMKaW5kZXggOGVlMWZmNi4uZThkNWY0NCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fZXRoLmMKKysrIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fZXRoLmMKQEAgLTI3Miw3ICsyNzIsNyBAQAogCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCi0Jc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7CisJc2VsZiA9IGluc3RhbmNlOwogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9wcm92aWRlci5jIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fcHJvdmlkZXIuYwppbmRleCBiOGFmNzRhLi44YjYxY2YwIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9wcm92aWRlci5jCisrKyBiL25ldC9pcmRhL2lybGFuL2lybGFuX3Byb3ZpZGVyLmMKQEAgLTczLDcgKzczLDcgQEAKIAogCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fZnVuY19fICk7CiAKLQlzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKKwlzZWxmID0gaW5zdGFuY2U7CiAKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwogCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLTE7KTsKQEAgLTEzMSw4ICsxMzEsOCBAQAogCiAJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19mdW5jX18gKTsKIAotCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOwotCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOworCXNlbGYgPSBpbnN0YW5jZTsKKwl0c2FwID0gc2FwOwogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CkBAIC0xODIsOCArMTgyLDggQEAKIAogCUlSREFfREVCVUcoNCwgIiVzKCksIHJlYXNvbj0lZFxuIiwgX19mdW5jX18gLCByZWFzb24pOwogCi0Jc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7Ci0JdHNhcCA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBzYXA7CisJc2VsZiA9IGluc3RhbmNlOworCXRzYXAgPSBzYXA7CiAKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwogCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lycXVldWUuYyBiL25ldC9pcmRhL2lycXVldWUuYwppbmRleCA5NzE1ZTZlLi5mMDY5NDdjIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcnF1ZXVlLmMKKysrIGIvbmV0L2lyZGEvaXJxdWV1ZS5jCkBAIC03ODAsNyArNzgwLDcgQEAKIAkvKgogCSAqIFNlYXJjaCBmb3IgZW50cnkKIAkgKi8KLQllbnRyeSA9IChpcmRhX3F1ZXVlX3QqICkgaGFzaGJpbl9maW5kKCBoYXNoYmluLCBoYXNodiwgbmFtZSApOworCWVudHJ5ID0gaGFzaGJpbl9maW5kKGhhc2hiaW4sIGhhc2h2LCBuYW1lKTsKIAogCS8qIFJlbGVhc2UgbG9jayAqLwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CkBAIC04MTMsNyArODEzLDcgQEAKIAkgKiBUaGlzIGFsbG93IHRvIGNoZWNrIGlmIHRoZSBjdXJyZW50IGl0ZW0gaXMgc3RpbGwgaW4gdGhlCiAJICogaGFzaGJpbiBvciBoYXMgYmVlbiByZW1vdmVkLgogCSAqLwotCWVudHJ5ID0gKGlyZGFfcXVldWVfdCogKSBoYXNoYmluX2ZpbmQoIGhhc2hiaW4sIGhhc2h2LCBuYW1lICk7CisJZW50cnkgPSBoYXNoYmluX2ZpbmQoaGFzaGJpbiwgaGFzaHYsIG5hbWUpOwogCiAJLyoKIAkgKiBUcmljayBoYXNoYmluX2dldF9uZXh0KCkgdG8gcmV0dXJuIHdoYXQgd2Ugd2FudApkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJ0dHAuYyBiL25ldC9pcmRhL2lydHRwLmMKaW5kZXggOWQ5YWY0Ni4uMjg1Y2NkNiAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJ0dHAuYworKysgYi9uZXQvaXJkYS9pcnR0cC5jCkBAIC0zNTAsNyArMzUwLDcgQEAKIHsKIAlzdHJ1Y3QgdHNhcF9jYiAqc2VsZjsKIAotCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CisJc2VsZiA9IGluc3RhbmNlOwogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CkBAIC04NzksNyArODc5LDcgQEAKIAogCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAotCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CisJc2VsZiA9IGluc3RhbmNlOwogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CkBAIC05MTQsNyArOTE0LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBuOwogCi0Jc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKKwlzZWxmID0gaW5zdGFuY2U7CiAKIAluID0gc2tiLT5kYXRhWzBdICYgMHg3ZjsgICAgIC8qIEV4dHJhY3QgdGhlIGNyZWRpdHMgKi8KIApAQCAtOTk2LDcgKzk5Niw3IEBACiAKIAlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQlzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOworCXNlbGYgPSBpbnN0YW5jZTsKIAogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CiAJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwpAQCAtMTAyNSw3ICsxMDI1LDcgQEAKIHsKIAlzdHJ1Y3QgdHNhcF9jYiAqc2VsZjsKIAotCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CisJc2VsZiA9IGluc3RhbmNlOwogCiAJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CkBAIC0xMjA4LDcgKzEyMDgsNyBAQAogCiAJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19mdW5jX18pOwogCi0Jc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKKwlzZWxmID0gaW5zdGFuY2U7CiAKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwogCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKQEAgLTEyOTIsMTMgKzEyOTIsMTMgQEAKIAlfX3U4IHBsZW47CiAJX191OCBuOwogCi0Jc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKKwlzZWxmID0gaW5zdGFuY2U7CiAKIAlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwogCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKIAlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CiAKLQlsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIHNhcDsKKwlsc2FwID0gc2FwOwogCiAJc2VsZi0+bWF4X3NlZ19zaXplID0gbWF4X3NlZ19zaXplIC0gVFRQX0hFQURFUjsKIAlzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemUrVFRQX0hFQURFUjsKQEAgLTE2MDIsNyArMTYwMiw3IEBACiAKIAlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQlzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOworCXNlbGYgPSBpbnN0YW5jZTsKIAogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CiAJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOwpkaWZmIC0tZ2l0IGEvbmV0L2l1Y3YvaXVjdi5jIGIvbmV0L2l1Y3YvaXVjdi5jCmluZGV4IDdmOTEyNDkuLmYyYjcxMzggMTAwNjQ0Ci0tLSBhL25ldC9pdWN2L2l1Y3YuYworKysgYi9uZXQvaXVjdi9pdWN2LmMKQEAgLTE5ODgsMTIgKzE5ODgsMTMgQEAKIAkJcmMgPSAtRVBST1RPTk9TVVBQT1JUOwogCQlnb3RvIG91dDsKIAl9CisJY3RsX3NldF9iaXQoMCwgMSk7CiAJcmMgPSBpdWN2X3F1ZXJ5X21heGNvbm4oKTsKIAlpZiAocmMpCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9jdGw7CiAJcmMgPSByZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQoMHg0MDAwLCBpdWN2X2V4dGVybmFsX2ludGVycnVwdCk7CiAJaWYgKHJjKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfY3RsOwogCWl1Y3Zfcm9vdCA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJpdWN2Iik7CiAJaWYgKElTX0VSUihpdWN2X3Jvb3QpKSB7CiAJCXJjID0gUFRSX0VSUihpdWN2X3Jvb3QpOwpAQCAtMjA1NSw2ICsyMDU2LDggQEAKIAlyb290X2RldmljZV91bnJlZ2lzdGVyKGl1Y3Zfcm9vdCk7CiBvdXRfaW50OgogCXVucmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4NDAwMCwgaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQpOworb3V0X2N0bDoKKwljdGxfY2xlYXJfYml0KDAsIDEpOwogb3V0OgogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL25ldC9rZXkvYWZfa2V5LmMgYi9uZXQva2V5L2FmX2tleS5jCmluZGV4IDhmOTJjZjguLjFlNzMzZTkgMTAwNjQ0Ci0tLSBhL25ldC9rZXkvYWZfa2V5LmMKKysrIGIvbmV0L2tleS9hZl9rZXkuYwpAQCAtNjIxLDcgKzYyMSw3IEBACiAJdW5zaWduZWQgc2hvcnQgZmFtaWx5OwogCXhmcm1fYWRkcmVzc190ICp4YWRkcjsKIAotCXNhID0gKGNvbnN0IHN0cnVjdCBzYWRiX3NhICopIGV4dF9oZHJzW1NBREJfRVhUX1NBLTFdOworCXNhID0gZXh0X2hkcnNbU0FEQl9FWFRfU0EgLSAxXTsKIAlpZiAoc2EgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTYzMCw3ICs2MzAsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCS8qIHNhZGJfYWRkcmVzc19sZW4gc2hvdWxkIGJlIGNoZWNrZWQgYnkgY2FsbGVyICovCi0JYWRkciA9IChjb25zdCBzdHJ1Y3Qgc2FkYl9hZGRyZXNzICopIGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfRFNULTFdOworCWFkZHIgPSBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX0RTVCAtIDFdOwogCWlmIChhZGRyID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCkBAIC0xMDM5LDcgKzEwMzksNyBAQAogCWludCBlcnI7CiAKIAotCXNhID0gKGNvbnN0IHN0cnVjdCBzYWRiX3NhICopIGV4dF9oZHJzW1NBREJfRVhUX1NBLTFdOworCXNhID0gZXh0X2hkcnNbU0FEQl9FWFRfU0EgLSAxXTsKIAlpZiAoIXNhIHx8CiAJICAgICFwcmVzZW50X2FuZF9zYW1lX2ZhbWlseShleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX1NSQy0xXSwKIAkJCQkgICAgIGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfRFNULTFdKSkKQEAgLTEwNzgsNyArMTA3OCw3IEBACiAJICAgICBzYS0+c2FkYl9zYV9lbmNyeXB0ID4gU0FEQl9YX0NBTEdfTUFYKSB8fAogCSAgICBzYS0+c2FkYl9zYV9lbmNyeXB0ID4gU0FEQl9FQUxHX01BWCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0Ja2V5ID0gKGNvbnN0IHN0cnVjdCBzYWRiX2tleSopIGV4dF9oZHJzW1NBREJfRVhUX0tFWV9BVVRILTFdOworCWtleSA9IGV4dF9oZHJzW1NBREJfRVhUX0tFWV9BVVRIIC0gMV07CiAJaWYgKGtleSAhPSBOVUxMICYmCiAJICAgIHNhLT5zYWRiX3NhX2F1dGggIT0gU0FEQl9YX0FBTEdfTlVMTCAmJgogCSAgICAoKGtleS0+c2FkYl9rZXlfYml0cys3KSAvIDggPT0gMCB8fApAQCAtMTEwNSwxNCArMTEwNSwxNCBAQAogCWlmIChzYS0+c2FkYl9zYV9mbGFncyAmIFNBREJfU0FGTEFHU19OT1BNVFVESVNDKQogCQl4LT5wcm9wcy5mbGFncyB8PSBYRlJNX1NUQVRFX05PUE1UVURJU0M7CiAKLQlsaWZldGltZSA9IChjb25zdCBzdHJ1Y3Qgc2FkYl9saWZldGltZSopIGV4dF9oZHJzW1NBREJfRVhUX0xJRkVUSU1FX0hBUkQtMV07CisJbGlmZXRpbWUgPSBleHRfaGRyc1tTQURCX0VYVF9MSUZFVElNRV9IQVJEIC0gMV07CiAJaWYgKGxpZmV0aW1lICE9IE5VTEwpIHsKIAkJeC0+bGZ0LmhhcmRfcGFja2V0X2xpbWl0ID0gX0tFWTJYKGxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2FsbG9jYXRpb25zKTsKIAkJeC0+bGZ0LmhhcmRfYnl0ZV9saW1pdCA9IF9LRVkyWChsaWZldGltZS0+c2FkYl9saWZldGltZV9ieXRlcyk7CiAJCXgtPmxmdC5oYXJkX2FkZF9leHBpcmVzX3NlY29uZHMgPSBsaWZldGltZS0+c2FkYl9saWZldGltZV9hZGR0aW1lOwogCQl4LT5sZnQuaGFyZF91c2VfZXhwaXJlc19zZWNvbmRzID0gbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfdXNldGltZTsKIAl9Ci0JbGlmZXRpbWUgPSAoY29uc3Qgc3RydWN0IHNhZGJfbGlmZXRpbWUqKSBleHRfaGRyc1tTQURCX0VYVF9MSUZFVElNRV9TT0ZULTFdOworCWxpZmV0aW1lID0gZXh0X2hkcnNbU0FEQl9FWFRfTElGRVRJTUVfU09GVCAtIDFdOwogCWlmIChsaWZldGltZSAhPSBOVUxMKSB7CiAJCXgtPmxmdC5zb2Z0X3BhY2tldF9saW1pdCA9IF9LRVkyWChsaWZldGltZS0+c2FkYl9saWZldGltZV9hbGxvY2F0aW9ucyk7CiAJCXgtPmxmdC5zb2Z0X2J5dGVfbGltaXQgPSBfS0VZMlgobGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfYnl0ZXMpOwpAQCAtMTEyMCw3ICsxMTIwLDcgQEAKIAkJeC0+bGZ0LnNvZnRfdXNlX2V4cGlyZXNfc2Vjb25kcyA9IGxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX3VzZXRpbWU7CiAJfQogCi0Jc2VjX2N0eCA9IChjb25zdCBzdHJ1Y3Qgc2FkYl94X3NlY19jdHggKikgZXh0X2hkcnNbU0FEQl9YX0VYVF9TRUNfQ1RYLTFdOworCXNlY19jdHggPSBleHRfaGRyc1tTQURCX1hfRVhUX1NFQ19DVFggLSAxXTsKIAlpZiAoc2VjX2N0eCAhPSBOVUxMKSB7CiAJCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCA9IHBma2V5X3NhZGIyeGZybV91c2VyX3NlY19jdHgoc2VjX2N0eCk7CiAKQEAgLTExMzQsNyArMTEzNCw3IEBACiAJCQlnb3RvIG91dDsKIAl9CiAKLQlrZXkgPSAoY29uc3Qgc3RydWN0IHNhZGJfa2V5KikgZXh0X2hkcnNbU0FEQl9FWFRfS0VZX0FVVEgtMV07CisJa2V5ID0gZXh0X2hkcnNbU0FEQl9FWFRfS0VZX0FVVEggLSAxXTsKIAlpZiAoc2EtPnNhZGJfc2FfYXV0aCkgewogCQlpbnQga2V5c2l6ZSA9IDA7CiAJCXN0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqYSA9IHhmcm1fYWFsZ19nZXRfYnlpZChzYS0+c2FkYl9zYV9hdXRoKTsKQEAgLTIyMTksNyArMjIxOSw3IEBACiAJaWYgKHhwLT5zZWxlY3Rvci5kcG9ydCkKIAkJeHAtPnNlbGVjdG9yLmRwb3J0X21hc2sgPSBodG9ucygweGZmZmYpOwogCi0Jc2VjX2N0eCA9IChzdHJ1Y3Qgc2FkYl94X3NlY19jdHggKikgZXh0X2hkcnNbU0FEQl9YX0VYVF9TRUNfQ1RYLTFdOworCXNlY19jdHggPSBleHRfaGRyc1tTQURCX1hfRVhUX1NFQ19DVFggLSAxXTsKIAlpZiAoc2VjX2N0eCAhPSBOVUxMKSB7CiAJCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCA9IHBma2V5X3NhZGIyeGZybV91c2VyX3NlY19jdHgoc2VjX2N0eCk7CiAKQEAgLTIzMjMsNyArMjMyMyw3IEBACiAJaWYgKHNlbC5kcG9ydCkKIAkJc2VsLmRwb3J0X21hc2sgPSBodG9ucygweGZmZmYpOwogCi0Jc2VjX2N0eCA9IChzdHJ1Y3Qgc2FkYl94X3NlY19jdHggKikgZXh0X2hkcnNbU0FEQl9YX0VYVF9TRUNfQ1RYLTFdOworCXNlY19jdHggPSBleHRfaGRyc1tTQURCX1hfRVhUX1NFQ19DVFggLSAxXTsKIAlpZiAoc2VjX2N0eCAhPSBOVUxMKSB7CiAJCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCA9IHBma2V5X3NhZGIyeGZybV91c2VyX3NlY19jdHgoc2VjX2N0eCk7CiAKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfZGVidWdmcy5jIGIvbmV0L2wydHAvbDJ0cF9kZWJ1Z2ZzLmMKaW5kZXggYjhkYmFlOC4uNzYxMzAxMyAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9kZWJ1Z2ZzLmMKKysrIGIvbmV0L2wydHAvbDJ0cF9kZWJ1Z2ZzLmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCSAqLwogCXBkLT5uZXQgPSBnZXRfbmV0X25zX2J5X3BpZChjdXJyZW50LT5waWQpOwogCWlmIChJU19FUlIocGQtPm5ldCkpIHsKLQkJcmMgPSAtUFRSX0VSUihwZC0+bmV0KTsKKwkJcmMgPSBQVFJfRVJSKHBkLT5uZXQpOwogCQlnb3RvIGVycl9mcmVlX3BkOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2wydHAvbDJ0cF9pcC5jIGIvbmV0L2wydHAvbDJ0cF9pcC5jCmluZGV4IGI2NDY2ZTcuLmQyMWU3ZWIgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfaXAuYworKysgYi9uZXQvbDJ0cC9sMnRwX2lwLmMKQEAgLTQ4MCwxOCArNDgwLDE2IEBACiAJaWYgKGNvbm5lY3RlZCkKIAkJcnQgPSAoc3RydWN0IHJ0YWJsZSAqKSBfX3NrX2RzdF9jaGVjayhzaywgMCk7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKHJ0ID09IE5VTEwpIHsKLQkJc3RydWN0IGlwX29wdGlvbnNfcmN1ICppbmV0X29wdDsKKwkJY29uc3Qgc3RydWN0IGlwX29wdGlvbnNfcmN1ICppbmV0X29wdDsKIAotCQlyY3VfcmVhZF9sb2NrKCk7CiAJCWluZXRfb3B0ID0gcmN1X2RlcmVmZXJlbmNlKGluZXQtPmluZXRfb3B0KTsKIAogCQkvKiBVc2UgY29ycmVjdCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlmIHdlIGhhdmUgb3B0aW9ucy4gKi8KIAkJaWYgKGluZXRfb3B0ICYmIGluZXRfb3B0LT5vcHQuc3JyKQogCQkJZGFkZHIgPSBpbmV0X29wdC0+b3B0LmZhZGRyOwogCi0JCXJjdV9yZWFkX3VubG9jaygpOwotCiAJCS8qIElmIHRoaXMgZmFpbHMsIHJldHJhbnNtaXQgbWVjaGFuaXNtIG9mIHRyYW5zcG9ydCBsYXllciB3aWxsCiAJCSAqIGtlZXAgdHJ5aW5nIHVudGlsIHJvdXRlIGFwcGVhcnMgb3IgdGhlIGNvbm5lY3Rpb24gdGltZXMKIAkJICogaXRzZWxmIG91dC4KQEAgLTUwMywxMiArNTAxLDIwIEBACiAJCQkJCSAgIHNrLT5za19ib3VuZF9kZXZfaWYpOwogCQlpZiAoSVNfRVJSKHJ0KSkKIAkJCWdvdG8gbm9fcm91dGU7Ci0JCXNrX3NldHVwX2NhcHMoc2ssICZydC0+ZHN0KTsKKwkJaWYgKGNvbm5lY3RlZCkKKwkJCXNrX3NldHVwX2NhcHMoc2ssICZydC0+ZHN0KTsKKwkJZWxzZQorCQkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOyAvKiBzYWZlIHNpbmNlIHdlIGhvbGQgcmN1X3JlYWRfbG9jayAqLwogCX0KLQlza2JfZHN0X3NldChza2IsIGRzdF9jbG9uZSgmcnQtPmRzdCkpOworCisJLyogV2UgZG9udCBuZWVkIHRvIGNsb25lIGRzdCBoZXJlLCBpdCBpcyBndWFyYW50ZWVkIHRvIG5vdCBkaXNhcHBlYXIuCisJICogIF9fZGV2X3htaXRfc2tiKCkgbWlnaHQgZm9yY2UgYSByZWZjb3VudCBpZiBuZWVkZWQuCisJICovCisJc2tiX2RzdF9zZXRfbm9yZWYoc2tiLCAmcnQtPmRzdCk7CiAKIAkvKiBRdWV1ZSB0aGUgcGFja2V0IHRvIElQIGZvciBvdXRwdXQgKi8KIAlyYyA9IGlwX3F1ZXVlX3htaXQoc2tiLCAmaW5ldC0+Y29yay5mbCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIGVycm9yOgogCS8qIFVwZGF0ZSBzdGF0cyAqLwpAQCAtNTI1LDYgKzUzMSw3IEBACiAJcmV0dXJuIHJjOwogCiBub19yb3V0ZToKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlJUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CiAJa2ZyZWVfc2tiKHNrYik7CiAJcmMgPSAtRUhPU1RVTlJFQUNIOwpkaWZmIC0tZ2l0IGEvbmV0L2xhcGIvbGFwYl9pZmFjZS5jIGIvbmV0L2xhcGIvbGFwYl9pZmFjZS5jCmluZGV4IGQ1ZDhkNTUuLjk1NmI3ZTQgMTAwNjQ0Ci0tLSBhL25ldC9sYXBiL2xhcGJfaWZhY2UuYworKysgYi9uZXQvbGFwYi9sYXBiX2lmYWNlLmMKQEAgLTMwMCwyNiArMzAwLDI2IEBACiAJCWdvdG8gb3V0OwogCiAJc3dpdGNoIChsYXBiLT5zdGF0ZSkgewotCQljYXNlIExBUEJfU1RBVEVfMDoKLQkJCXJjID0gTEFQQl9OT1RDT05ORUNURUQ7Ci0JCQlnb3RvIG91dF9wdXQ7CisJY2FzZSBMQVBCX1NUQVRFXzA6CisJCXJjID0gTEFQQl9OT1RDT05ORUNURUQ7CisJCWdvdG8gb3V0X3B1dDsKIAotCQljYXNlIExBUEJfU1RBVEVfMToKKwljYXNlIExBUEJfU1RBVEVfMToKICNpZiBMQVBCX0RFQlVHID4gMQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgVFggRElTQygxKVxuIiwgbGFwYi0+ZGV2KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgVFggRElTQygxKVxuIiwgbGFwYi0+ZGV2KTsKICNlbmRpZgogI2lmIExBUEJfREVCVUcgPiAwCi0JCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSAtPiBTMFxuIiwgbGFwYi0+ZGV2KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgLT4gUzBcbiIsIGxhcGItPmRldik7CiAjZW5kaWYKLQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRElTQywgTEFQQl9QT0xMT04sIExBUEJfQ09NTUFORCk7Ci0JCQlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMDsKLQkJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKLQkJCXJjID0gTEFQQl9OT1RDT05ORUNURUQ7Ci0JCQlnb3RvIG91dF9wdXQ7CisJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRElTQywgTEFQQl9QT0xMT04sIExBUEJfQ09NTUFORCk7CisJCWxhcGItPnN0YXRlID0gTEFQQl9TVEFURV8wOworCQlsYXBiX3N0YXJ0X3QxdGltZXIobGFwYik7CisJCXJjID0gTEFQQl9OT1RDT05ORUNURUQ7CisJCWdvdG8gb3V0X3B1dDsKIAotCQljYXNlIExBUEJfU1RBVEVfMjoKLQkJCXJjID0gTEFQQl9PSzsKLQkJCWdvdG8gb3V0X3B1dDsKKwljYXNlIExBUEJfU1RBVEVfMjoKKwkJcmMgPSBMQVBCX09LOworCQlnb3RvIG91dF9wdXQ7CiAJfQogCiAJbGFwYl9jbGVhcl9xdWV1ZXMobGFwYik7CmRpZmYgLS1naXQgYS9uZXQvbGFwYi9sYXBiX2luLmMgYi9uZXQvbGFwYi9sYXBiX2luLmMKaW5kZXggMjE5MDRhMC4uMmVjMWFmNSAxMDA2NDQKLS0tIGEvbmV0L2xhcGIvbGFwYl9pbi5jCisrKyBiL25ldC9sYXBiL2xhcGJfaW4uYwpAQCAtNDQsODkgKzQ0LDg2IEBACiAJCQkJc3RydWN0IGxhcGJfZnJhbWUgKmZyYW1lKQogewogCXN3aXRjaCAoZnJhbWUtPnR5cGUpIHsKLQkJY2FzZSBMQVBCX1NBQk06CisJY2FzZSBMQVBCX1NBQk06CiAjaWYgTEFQQl9ERUJVRyA+IDEKLQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMwIFJYIFNBQk0oJWQpXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMCBSWCBTQUJNKCVkKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzAgVFggRE0oJWQpXG4iLAogCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKICNlbmRpZgotCQkJaWYgKGxhcGItPm1vZGUgJiBMQVBCX0VYVEVOREVEKSB7CisJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX0RNLCBmcmFtZS0+cGYsCisJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCX0gZWxzZSB7CiAjaWYgTEFQQl9ERUJVRyA+IDEKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMCBUWCBETSglZClcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLSNlbmRpZgotCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKLQkJCQkJCSAgTEFQQl9SRVNQT05TRSk7Ci0JCQl9IGVsc2UgewotI2lmIExBUEJfREVCVUcgPiAxCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzAgVFggVUEoJWQpXG4iLAotCQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7Ci0jZW5kaWYKLSNpZiBMQVBCX0RFQlVHID4gMAotCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMwIC0+IFMzXG4iLAotCQkJCSAgICAgICBsYXBiLT5kZXYpOwotI2VuZGlmCi0JCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLAotCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKLQkJCQlsYXBiX3N0b3BfdDF0aW1lcihsYXBiKTsKLQkJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKLQkJCQlsYXBiLT5zdGF0ZSAgICAgPSBMQVBCX1NUQVRFXzM7Ci0JCQkJbGFwYi0+Y29uZGl0aW9uID0gMHgwMDsKLQkJCQlsYXBiLT5uMmNvdW50ICAgPSAwOwotCQkJCWxhcGItPnZzICAgICAgICA9IDA7Ci0JCQkJbGFwYi0+dnIgICAgICAgID0gMDsKLQkJCQlsYXBiLT52YSAgICAgICAgPSAwOwotCQkJCWxhcGJfY29ubmVjdF9pbmRpY2F0aW9uKGxhcGIsIExBUEJfT0spOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBMQVBCX1NBQk1FOgotI2lmIExBUEJfREVCVUcgPiAxCi0JCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMCBSWCBTQUJNRSglZClcbiIsCi0JCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwotI2VuZGlmCi0JCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKLSNpZiBMQVBCX0RFQlVHID4gMQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMwIFRYIFVBKCVkKVxuIiwKLQkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwotI2VuZGlmCi0jaWYgTEFQQl9ERUJVRyA+IDAKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMCAtPiBTM1xuIiwKLQkJCQkgICAgICAgbGFwYi0+ZGV2KTsKLSNlbmRpZgotCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfVUEsIGZyYW1lLT5wZiwKLQkJCQkJCSAgTEFQQl9SRVNQT05TRSk7Ci0JCQkJbGFwYl9zdG9wX3QxdGltZXIobGFwYik7Ci0JCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7Ci0JCQkJbGFwYi0+c3RhdGUgICAgID0gTEFQQl9TVEFURV8zOwotCQkJCWxhcGItPmNvbmRpdGlvbiA9IDB4MDA7Ci0JCQkJbGFwYi0+bjJjb3VudCAgID0gMDsKLQkJCQlsYXBiLT52cyAgICAgICAgPSAwOwotCQkJCWxhcGItPnZyICAgICAgICA9IDA7Ci0JCQkJbGFwYi0+dmEgICAgICAgID0gMDsKLQkJCQlsYXBiX2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX09LKTsKLQkJCX0gZWxzZSB7Ci0jaWYgTEFQQl9ERUJVRyA+IDEKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMCBUWCBETSglZClcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLSNlbmRpZgotCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKLQkJCQkJCSAgTEFQQl9SRVNQT05TRSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIExBUEJfRElTQzoKLSNpZiBMQVBCX0RFQlVHID4gMQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzAgUlggRElTQyglZClcbiIsCi0JCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwogCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzAgVFggVUEoJWQpXG4iLAogCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKICNlbmRpZgorI2lmIExBUEJfREVCVUcgPiAwCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMCAtPiBTM1xuIiwgbGFwYi0+ZGV2KTsKKyNlbmRpZgogCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLAogCQkJCQkgIExBUEJfUkVTUE9OU0UpOwotCQkJYnJlYWs7CisJCQlsYXBiX3N0b3BfdDF0aW1lcihsYXBiKTsKKwkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJbGFwYi0+c3RhdGUgICAgID0gTEFQQl9TVEFURV8zOworCQkJbGFwYi0+Y29uZGl0aW9uID0gMHgwMDsKKwkJCWxhcGItPm4yY291bnQgICA9IDA7CisJCQlsYXBiLT52cyAgICAgICAgPSAwOworCQkJbGFwYi0+dnIgICAgICAgID0gMDsKKwkJCWxhcGItPnZhICAgICAgICA9IDA7CisJCQlsYXBiX2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX09LKTsKKwkJfQorCQlicmVhazsKIAotCQlkZWZhdWx0OgotCQkJYnJlYWs7CisJY2FzZSBMQVBCX1NBQk1FOgorI2lmIExBUEJfREVCVUcgPiAxCisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMwIFJYIFNBQk1FKCVkKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzAgVFggVUEoJWQpXG4iLAorCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorI2lmIExBUEJfREVCVUcgPiAwCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMCAtPiBTM1xuIiwgbGFwYi0+ZGV2KTsKKyNlbmRpZgorCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLAorCQkJCQkgIExBUEJfUkVTUE9OU0UpOworCQkJbGFwYl9zdG9wX3QxdGltZXIobGFwYik7CisJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKKwkJCWxhcGItPnN0YXRlICAgICA9IExBUEJfU1RBVEVfMzsKKwkJCWxhcGItPmNvbmRpdGlvbiA9IDB4MDA7CisJCQlsYXBiLT5uMmNvdW50ICAgPSAwOworCQkJbGFwYi0+dnMgICAgICAgID0gMDsKKwkJCWxhcGItPnZyICAgICAgICA9IDA7CisJCQlsYXBiLT52YSAgICAgICAgPSAwOworCQkJbGFwYl9jb25uZWN0X2luZGljYXRpb24obGFwYiwgTEFQQl9PSyk7CisJCX0gZWxzZSB7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMwIFRYIERNKCVkKVxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKKwkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTEFQQl9ESVNDOgorI2lmIExBUEJfREVCVUcgPiAxCisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMwIFJYIERJU0MoJWQpXG4iLAorCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMCBUWCBVQSglZClcbiIsCisJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLCBMQVBCX1JFU1BPTlNFKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAKIAlrZnJlZV9za2Ioc2tiKTsKQEAgLTE0MCwxMDAgKzEzNyw5NyBAQAogCQkJCXN0cnVjdCBsYXBiX2ZyYW1lICpmcmFtZSkKIHsKIAlzd2l0Y2ggKGZyYW1lLT50eXBlKSB7Ci0JCWNhc2UgTEFQQl9TQUJNOgorCWNhc2UgTEFQQl9TQUJNOgogI2lmIExBUEJfREVCVUcgPiAxCi0JCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBSWCBTQUJNKCVkKVxuIiwKLQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIFJYIFNBQk0oJWQpXG4iLAorCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwogI2VuZGlmCi0JCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKKwkJaWYgKGxhcGItPm1vZGUgJiBMQVBCX0VYVEVOREVEKSB7CiAjaWYgTEFQQl9ERUJVRyA+IDEKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBUWCBETSglZClcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLSNlbmRpZgotCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKLQkJCQkJCSAgTEFQQl9SRVNQT05TRSk7Ci0JCQl9IGVsc2UgewotI2lmIExBUEJfREVCVUcgPiAxCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgVFggVUEoJWQpXG4iLAotCQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7Ci0jZW5kaWYKLQkJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX1VBLCBmcmFtZS0+cGYsCi0JCQkJCQkgIExBUEJfUkVTUE9OU0UpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBMQVBCX1NBQk1FOgotI2lmIExBUEJfREVCVUcgPiAxCi0JCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBSWCBTQUJNRSglZClcbiIsCi0JCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwotI2VuZGlmCi0JCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKLSNpZiBMQVBCX0RFQlVHID4gMQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIFRYIFVBKCVkKVxuIiwKLQkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwotI2VuZGlmCi0JCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLAotCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKLQkJCX0gZWxzZSB7Ci0jaWYgTEFQQl9ERUJVRyA+IDEKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBUWCBETSglZClcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLSNlbmRpZgotCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKLQkJCQkJCSAgTEFQQl9SRVNQT05TRSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIExBUEJfRElTQzoKLSNpZiBMQVBCX0RFQlVHID4gMQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgUlggRElTQyglZClcbiIsCi0JCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwogCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgVFggRE0oJWQpXG4iLAogCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKICNlbmRpZgogCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9ETSwgZnJhbWUtPnBmLAogCQkJCQkgIExBUEJfUkVTUE9OU0UpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBMQVBCX1VBOgorCQl9IGVsc2UgewogI2lmIExBUEJfREVCVUcgPiAxCi0JCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBSWCBVQSglZClcbiIsCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBUWCBVQSglZClcbiIsCiAJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwogI2VuZGlmCi0JCQlpZiAoZnJhbWUtPnBmKSB7Ci0jaWYgTEFQQl9ERUJVRyA+IDAKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSAtPiBTM1xuIiwKLQkJCQkgICAgICAgbGFwYi0+ZGV2KTsKLSNlbmRpZgotCQkJCWxhcGJfc3RvcF90MXRpbWVyKGxhcGIpOwotCQkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOwotCQkJCWxhcGItPnN0YXRlICAgICA9IExBUEJfU1RBVEVfMzsKLQkJCQlsYXBiLT5jb25kaXRpb24gPSAweDAwOwotCQkJCWxhcGItPm4yY291bnQgICA9IDA7Ci0JCQkJbGFwYi0+dnMgICAgICAgID0gMDsKLQkJCQlsYXBiLT52ciAgICAgICAgPSAwOwotCQkJCWxhcGItPnZhICAgICAgICA9IDA7Ci0JCQkJbGFwYl9jb25uZWN0X2NvbmZpcm1hdGlvbihsYXBiLCBMQVBCX09LKTsKLQkJCX0KLQkJCWJyZWFrOworCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLAorCQkJCQkgIExBUEJfUkVTUE9OU0UpOworCQl9CisJCWJyZWFrOwogCi0JCWNhc2UgTEFQQl9ETToKKwljYXNlIExBUEJfU0FCTUU6CiAjaWYgTEFQQl9ERUJVRyA+IDEKLQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIFJYIERNKCVkKVxuIiwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgUlggU0FCTUUoJWQpXG4iLAorCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCWlmIChsYXBiLT5tb2RlICYgTEFQQl9FWFRFTkRFRCkgeworI2lmIExBUEJfREVCVUcgPiAxCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBUWCBVQSglZClcbiIsCiAJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwogI2VuZGlmCi0JCQlpZiAoZnJhbWUtPnBmKSB7Ci0jaWYgTEFQQl9ERUJVRyA+IDAKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSAtPiBTMFxuIiwKLQkJCQkgICAgICAgbGFwYi0+ZGV2KTsKKwkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfVUEsIGZyYW1lLT5wZiwKKwkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJfSBlbHNlIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgVFggRE0oJWQpXG4iLAorCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKICNlbmRpZgotCQkJCWxhcGJfY2xlYXJfcXVldWVzKGxhcGIpOwotCQkJCWxhcGItPnN0YXRlID0gTEFQQl9TVEFURV8wOwotCQkJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKLQkJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKLQkJCQlsYXBiX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX1JFRlVTRUQpOwotCQkJfQotCQkJYnJlYWs7CisJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX0RNLCBmcmFtZS0+cGYsCisJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIExBUEJfRElTQzoKKyNpZiBMQVBCX0RFQlVHID4gMQorCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBSWCBESVNDKCVkKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgVFggRE0oJWQpXG4iLAorCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwgTEFQQl9SRVNQT05TRSk7CisJCWJyZWFrOworCisJY2FzZSBMQVBCX1VBOgorI2lmIExBUEJfREVCVUcgPiAxCisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIFJYIFVBKCVkKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQlpZiAoZnJhbWUtPnBmKSB7CisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIC0+IFMzXG4iLCBsYXBiLT5kZXYpOworI2VuZGlmCisJCQlsYXBiX3N0b3BfdDF0aW1lcihsYXBiKTsKKwkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJbGFwYi0+c3RhdGUgICAgID0gTEFQQl9TVEFURV8zOworCQkJbGFwYi0+Y29uZGl0aW9uID0gMHgwMDsKKwkJCWxhcGItPm4yY291bnQgICA9IDA7CisJCQlsYXBiLT52cyAgICAgICAgPSAwOworCQkJbGFwYi0+dnIgICAgICAgID0gMDsKKwkJCWxhcGItPnZhICAgICAgICA9IDA7CisJCQlsYXBiX2Nvbm5lY3RfY29uZmlybWF0aW9uKGxhcGIsIExBUEJfT0spOworCQl9CisJCWJyZWFrOworCisJY2FzZSBMQVBCX0RNOgorI2lmIExBUEJfREVCVUcgPiAxCisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIFJYIERNKCVkKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQlpZiAoZnJhbWUtPnBmKSB7CisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIC0+IFMwXG4iLCBsYXBiLT5kZXYpOworI2VuZGlmCisJCQlsYXBiX2NsZWFyX3F1ZXVlcyhsYXBiKTsKKwkJCWxhcGItPnN0YXRlID0gTEFQQl9TVEFURV8wOworCQkJbGFwYl9zdGFydF90MXRpbWVyKGxhcGIpOworCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7CisJCQlsYXBiX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX1JFRlVTRUQpOworCQl9CisJCWJyZWFrOwogCX0KIAogCWtmcmVlX3NrYihza2IpOwpAQCAtMjQ3LDc4ICsyNDEsNzMgQEAKIAkJCQlzdHJ1Y3QgbGFwYl9mcmFtZSAqZnJhbWUpCiB7CiAJc3dpdGNoIChmcmFtZS0+dHlwZSkgewotCQljYXNlIExBUEJfU0FCTToKLQkJY2FzZSBMQVBCX1NBQk1FOgorCWNhc2UgTEFQQl9TQUJNOgorCWNhc2UgTEFQQl9TQUJNRToKICNpZiBMQVBCX0RFQlVHID4gMQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgUlgge1NBQk0sU0FCTUV9KCVkKVxuIiwKLQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMiBUWCBETSglZClcbiIsCi0JCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMiBSWCB7U0FCTSxTQUJNRX0oJWQpXG4iLAorCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMiBUWCBETSglZClcbiIsCisJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CiAjZW5kaWYKKwkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9ETSwgZnJhbWUtPnBmLCBMQVBCX1JFU1BPTlNFKTsKKwkJYnJlYWs7CisKKwljYXNlIExBUEJfRElTQzoKKyNpZiBMQVBCX0RFQlVHID4gMQorCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMiBSWCBESVNDKCVkKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgVFggVUEoJWQpXG4iLAorCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfVUEsIGZyYW1lLT5wZiwgTEFQQl9SRVNQT05TRSk7CisJCWJyZWFrOworCisJY2FzZSBMQVBCX1VBOgorI2lmIExBUEJfREVCVUcgPiAxCisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMyIFJYIFVBKCVkKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQlpZiAoZnJhbWUtPnBmKSB7CisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMyIC0+IFMwXG4iLCBsYXBiLT5kZXYpOworI2VuZGlmCisJCQlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMDsKKwkJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJbGFwYl9kaXNjb25uZWN0X2NvbmZpcm1hdGlvbihsYXBiLCBMQVBCX09LKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTEFQQl9ETToKKyNpZiBMQVBCX0RFQlVHID4gMQorCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMiBSWCBETSglZClcbiIsCisJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJaWYgKGZyYW1lLT5wZikgeworI2lmIExBUEJfREVCVUcgPiAwCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMiAtPiBTMFxuIiwgbGFwYi0+ZGV2KTsKKyNlbmRpZgorCQkJbGFwYi0+c3RhdGUgPSBMQVBCX1NUQVRFXzA7CisJCQlsYXBiX3N0YXJ0X3QxdGltZXIobGFwYik7CisJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKKwkJCWxhcGJfZGlzY29ubmVjdF9jb25maXJtYXRpb24obGFwYiwgTEFQQl9OT1RDT05ORUNURUQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBMQVBCX0k6CisJY2FzZSBMQVBCX1JFSjoKKwljYXNlIExBUEJfUk5SOgorCWNhc2UgTEFQQl9SUjoKKyNpZiBMQVBCX0RFQlVHID4gMQorCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMiBSWCB7SSxSRUosUk5SLFJSfSglZClcbiIsCisJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMyIFJYIERNKCVkKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQlpZiAoZnJhbWUtPnBmKQogCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9ETSwgZnJhbWUtPnBmLAogCQkJCQkgIExBUEJfUkVTUE9OU0UpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBMQVBCX0RJU0M6Ci0jaWYgTEFQQl9ERUJVRyA+IDEKLQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMyIFJYIERJU0MoJWQpXG4iLAotCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMyIFRYIFVBKCVkKVxuIiwKLQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7Ci0jZW5kaWYKLQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfVUEsIGZyYW1lLT5wZiwKLQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTEFQQl9VQToKLSNpZiBMQVBCX0RFQlVHID4gMQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgUlggVUEoJWQpXG4iLAotCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLSNlbmRpZgotCQkJaWYgKGZyYW1lLT5wZikgewotI2lmIExBUEJfREVCVUcgPiAwCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgLT4gUzBcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldik7Ci0jZW5kaWYKLQkJCQlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMDsKLQkJCQlsYXBiX3N0YXJ0X3QxdGltZXIobGFwYik7Ci0JCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7Ci0JCQkJbGFwYl9kaXNjb25uZWN0X2NvbmZpcm1hdGlvbihsYXBiLCBMQVBCX09LKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTEFQQl9ETToKLSNpZiBMQVBCX0RFQlVHID4gMQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgUlggRE0oJWQpXG4iLAotCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLSNlbmRpZgotCQkJaWYgKGZyYW1lLT5wZikgewotI2lmIExBUEJfREVCVUcgPiAwCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgLT4gUzBcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldik7Ci0jZW5kaWYKLQkJCQlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMDsKLQkJCQlsYXBiX3N0YXJ0X3QxdGltZXIobGFwYik7Ci0JCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7Ci0JCQkJbGFwYl9kaXNjb25uZWN0X2NvbmZpcm1hdGlvbihsYXBiLAotCQkJCQkJCSAgICAgTEFQQl9OT1RDT05ORUNURUQpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBMQVBCX0k6Ci0JCWNhc2UgTEFQQl9SRUo6Ci0JCWNhc2UgTEFQQl9STlI6Ci0JCWNhc2UgTEFQQl9SUjoKLSNpZiBMQVBCX0RFQlVHID4gMQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgUlgge0ksUkVKLFJOUixSUn0iCi0JCQkgICAgICAgIiglZClcbiIsIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMyIFJYIERNKCVkKVxuIiwKLQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7Ci0jZW5kaWYKLQkJCWlmIChmcmFtZS0+cGYpCi0JCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9ETSwgZnJhbWUtPnBmLAotCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKLQkJCWJyZWFrOworCQlicmVhazsKIAl9CiAKIAlrZnJlZV9za2Ioc2tiKTsKQEAgLTMzNiwyNjggKzMyNSwxNzcgQEAKIAkJCQkJCSAgICAgTEFQQl9TTU9EVUxVUzsKIAogCXN3aXRjaCAoZnJhbWUtPnR5cGUpIHsKLQkJY2FzZSBMQVBCX1NBQk06CisJY2FzZSBMQVBCX1NBQk06CiAjaWYgTEFQQl9ERUJVRyA+IDEKLQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFJYIFNBQk0oJWQpXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBSWCBTQUJNKCVkKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgVFggRE0oJWQpXG4iLAogCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKICNlbmRpZgotCQkJaWYgKGxhcGItPm1vZGUgJiBMQVBCX0VYVEVOREVEKSB7CisJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX0RNLCBmcmFtZS0+cGYsCisJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCX0gZWxzZSB7CiAjaWYgTEFQQl9ERUJVRyA+IDEKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBUWCBETSglZClcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLSNlbmRpZgotCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKLQkJCQkJCSAgTEFQQl9SRVNQT05TRSk7Ci0JCQl9IGVsc2UgewotI2lmIExBUEJfREVCVUcgPiAxCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgVFggVUEoJWQpXG4iLAotCQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7Ci0jZW5kaWYKLQkJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX1VBLCBmcmFtZS0+cGYsCi0JCQkJCQkgIExBUEJfUkVTUE9OU0UpOwotCQkJCWxhcGJfc3RvcF90MXRpbWVyKGxhcGIpOwotCQkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOwotCQkJCWxhcGItPmNvbmRpdGlvbiA9IDB4MDA7Ci0JCQkJbGFwYi0+bjJjb3VudCAgID0gMDsKLQkJCQlsYXBiLT52cyAgICAgICAgPSAwOwotCQkJCWxhcGItPnZyICAgICAgICA9IDA7Ci0JCQkJbGFwYi0+dmEgICAgICAgID0gMDsKLQkJCQlsYXBiX3JlcXVldWVfZnJhbWVzKGxhcGIpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBMQVBCX1NBQk1FOgotI2lmIExBUEJfREVCVUcgPiAxCi0JCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBSWCBTQUJNRSglZClcbiIsCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBUWCBVQSglZClcbiIsCiAJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwogI2VuZGlmCi0JCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKLSNpZiBMQVBCX0RFQlVHID4gMQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFRYIFVBKCVkKVxuIiwKLQkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwotI2VuZGlmCi0JCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLAotCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKLQkJCQlsYXBiX3N0b3BfdDF0aW1lcihsYXBiKTsKLQkJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKLQkJCQlsYXBiLT5jb25kaXRpb24gPSAweDAwOwotCQkJCWxhcGItPm4yY291bnQgICA9IDA7Ci0JCQkJbGFwYi0+dnMgICAgICAgID0gMDsKLQkJCQlsYXBiLT52ciAgICAgICAgPSAwOwotCQkJCWxhcGItPnZhICAgICAgICA9IDA7Ci0JCQkJbGFwYl9yZXF1ZXVlX2ZyYW1lcyhsYXBiKTsKLQkJCX0gZWxzZSB7Ci0jaWYgTEFQQl9ERUJVRyA+IDEKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBUWCBETSglZClcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLSNlbmRpZgotCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKLQkJCQkJCSAgTEFQQl9SRVNQT05TRSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIExBUEJfRElTQzoKLSNpZiBMQVBCX0RFQlVHID4gMQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgUlggRElTQyglZClcbiIsCi0JCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwotI2VuZGlmCi0jaWYgTEFQQl9ERUJVRyA+IDAKLQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIC0+IFMwXG4iLAotCQkJICAgICAgIGxhcGItPmRldik7Ci0jZW5kaWYKLQkJCWxhcGJfY2xlYXJfcXVldWVzKGxhcGIpOwogCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLAogCQkJCQkgIExBUEJfUkVTUE9OU0UpOwotCQkJbGFwYl9zdGFydF90MXRpbWVyKGxhcGIpOworCQkJbGFwYl9zdG9wX3QxdGltZXIobGFwYik7CiAJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKLQkJCWxhcGItPnN0YXRlID0gTEFQQl9TVEFURV8wOwotCQkJbGFwYl9kaXNjb25uZWN0X2luZGljYXRpb24obGFwYiwgTEFQQl9PSyk7Ci0JCQlicmVhazsKLQotCQljYXNlIExBUEJfRE06Ci0jaWYgTEFQQl9ERUJVRyA+IDEKLQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFJYIERNKCVkKVxuIiwKLQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7Ci0jZW5kaWYKLSNpZiBMQVBCX0RFQlVHID4gMAotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzBcbiIsCi0JCQkgICAgICAgbGFwYi0+ZGV2KTsKLSNlbmRpZgotCQkJbGFwYl9jbGVhcl9xdWV1ZXMobGFwYik7Ci0JCQlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMDsKLQkJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKLQkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOwotCQkJbGFwYl9kaXNjb25uZWN0X2luZGljYXRpb24obGFwYiwgTEFQQl9OT1RDT05ORUNURUQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBMQVBCX1JOUjoKLSNpZiBMQVBCX0RFQlVHID4gMQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgUlggUk5SKCVkKSBSJWRcbiIsCi0JCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYsIGZyYW1lLT5ucik7Ci0jZW5kaWYKLQkJCWxhcGItPmNvbmRpdGlvbiB8PSBMQVBCX1BFRVJfUlhfQlVTWV9DT05ESVRJT047Ci0JCQlsYXBiX2NoZWNrX25lZWRfcmVzcG9uc2UobGFwYiwgZnJhbWUtPmNyLCBmcmFtZS0+cGYpOwotCQkJaWYgKGxhcGJfdmFsaWRhdGVfbnIobGFwYiwgZnJhbWUtPm5yKSkgewotCQkJCWxhcGJfY2hlY2tfaWZyYW1lc19hY2tlZChsYXBiLCBmcmFtZS0+bnIpOwotCQkJfSBlbHNlIHsKLQkJCQlsYXBiLT5mcm1yX2RhdGEgPSAqZnJhbWU7Ci0JCQkJbGFwYi0+ZnJtcl90eXBlID0gTEFQQl9GUk1SX1o7Ci0JCQkJbGFwYl90cmFuc21pdF9mcm1yKGxhcGIpOwotI2lmIExBUEJfREVCVUcgPiAwCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzRcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldik7Ci0jZW5kaWYKLQkJCQlsYXBiX3N0YXJ0X3QxdGltZXIobGFwYik7Ci0JCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7Ci0JCQkJbGFwYi0+c3RhdGUgICA9IExBUEJfU1RBVEVfNDsKLQkJCQlsYXBiLT5uMmNvdW50ID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTEFQQl9SUjoKLSNpZiBMQVBCX0RFQlVHID4gMQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgUlggUlIoJWQpIFIlZFxuIiwKLQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZiwgZnJhbWUtPm5yKTsKLSNlbmRpZgotCQkJbGFwYi0+Y29uZGl0aW9uICY9IH5MQVBCX1BFRVJfUlhfQlVTWV9DT05ESVRJT047Ci0JCQlsYXBiX2NoZWNrX25lZWRfcmVzcG9uc2UobGFwYiwgZnJhbWUtPmNyLCBmcmFtZS0+cGYpOwotCQkJaWYgKGxhcGJfdmFsaWRhdGVfbnIobGFwYiwgZnJhbWUtPm5yKSkgewotCQkJCWxhcGJfY2hlY2tfaWZyYW1lc19hY2tlZChsYXBiLCBmcmFtZS0+bnIpOwotCQkJfSBlbHNlIHsKLQkJCQlsYXBiLT5mcm1yX2RhdGEgPSAqZnJhbWU7Ci0JCQkJbGFwYi0+ZnJtcl90eXBlID0gTEFQQl9GUk1SX1o7Ci0JCQkJbGFwYl90cmFuc21pdF9mcm1yKGxhcGIpOwotI2lmIExBUEJfREVCVUcgPiAwCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzRcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldik7Ci0jZW5kaWYKLQkJCQlsYXBiX3N0YXJ0X3QxdGltZXIobGFwYik7Ci0JCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7Ci0JCQkJbGFwYi0+c3RhdGUgICA9IExBUEJfU1RBVEVfNDsKLQkJCQlsYXBiLT5uMmNvdW50ID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTEFQQl9SRUo6Ci0jaWYgTEFQQl9ERUJVRyA+IDEKLQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFJYIFJFSiglZCkgUiVkXG4iLAotCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmLCBmcmFtZS0+bnIpOwotI2VuZGlmCi0JCQlsYXBiLT5jb25kaXRpb24gJj0gfkxBUEJfUEVFUl9SWF9CVVNZX0NPTkRJVElPTjsKLQkJCWxhcGJfY2hlY2tfbmVlZF9yZXNwb25zZShsYXBiLCBmcmFtZS0+Y3IsIGZyYW1lLT5wZik7Ci0JCQlpZiAobGFwYl92YWxpZGF0ZV9ucihsYXBiLCBmcmFtZS0+bnIpKSB7Ci0JCQkJbGFwYl9mcmFtZXNfYWNrZWQobGFwYiwgZnJhbWUtPm5yKTsKLQkJCQlsYXBiX3N0b3BfdDF0aW1lcihsYXBiKTsKLQkJCQlsYXBiLT5uMmNvdW50ID0gMDsKLQkJCQlsYXBiX3JlcXVldWVfZnJhbWVzKGxhcGIpOwotCQkJfSBlbHNlIHsKLQkJCQlsYXBiLT5mcm1yX2RhdGEgPSAqZnJhbWU7Ci0JCQkJbGFwYi0+ZnJtcl90eXBlID0gTEFQQl9GUk1SX1o7Ci0JCQkJbGFwYl90cmFuc21pdF9mcm1yKGxhcGIpOwotI2lmIExBUEJfREVCVUcgPiAwCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzRcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldik7Ci0jZW5kaWYKLQkJCQlsYXBiX3N0YXJ0X3QxdGltZXIobGFwYik7Ci0JCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7Ci0JCQkJbGFwYi0+c3RhdGUgICA9IExBUEJfU1RBVEVfNDsKLQkJCQlsYXBiLT5uMmNvdW50ID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTEFQQl9JOgotI2lmIExBUEJfREVCVUcgPiAxCi0JCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBSWCBJKCVkKSBTJWQgUiVkXG4iLAotCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmLCBmcmFtZS0+bnMsIGZyYW1lLT5ucik7Ci0jZW5kaWYKLQkJCWlmICghbGFwYl92YWxpZGF0ZV9ucihsYXBiLCBmcmFtZS0+bnIpKSB7Ci0JCQkJbGFwYi0+ZnJtcl9kYXRhID0gKmZyYW1lOwotCQkJCWxhcGItPmZybXJfdHlwZSA9IExBUEJfRlJNUl9aOwotCQkJCWxhcGJfdHJhbnNtaXRfZnJtcihsYXBiKTsKLSNpZiBMQVBCX0RFQlVHID4gMAotCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIC0+IFM0XG4iLAotCQkJCSAgICAgICBsYXBiLT5kZXYpOwotI2VuZGlmCi0JCQkJbGFwYl9zdGFydF90MXRpbWVyKGxhcGIpOwotCQkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOwotCQkJCWxhcGItPnN0YXRlICAgPSBMQVBCX1NUQVRFXzQ7Ci0JCQkJbGFwYi0+bjJjb3VudCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobGFwYi0+Y29uZGl0aW9uICYgTEFQQl9QRUVSX1JYX0JVU1lfQ09ORElUSU9OKQotCQkJCWxhcGJfZnJhbWVzX2Fja2VkKGxhcGIsIGZyYW1lLT5ucik7Ci0JCQllbHNlCi0JCQkJbGFwYl9jaGVja19pZnJhbWVzX2Fja2VkKGxhcGIsIGZyYW1lLT5ucik7Ci0KLQkJCWlmIChmcmFtZS0+bnMgPT0gbGFwYi0+dnIpIHsKLQkJCQlpbnQgY247Ci0JCQkJY24gPSBsYXBiX2RhdGFfaW5kaWNhdGlvbihsYXBiLCBza2IpOwotCQkJCXF1ZXVlZCA9IDE7Ci0JCQkJLyoKLQkJCQkgKiBJZiB1cHBlciBsYXllciBoYXMgZHJvcHBlZCB0aGUgZnJhbWUsIHdlCi0JCQkJICogYmFzaWNhbGx5IGlnbm9yZSBhbnkgZnVydGhlciBwcm90b2NvbAotCQkJCSAqIHByb2Nlc3NpbmcuIFRoaXMgd2lsbCBjYXVzZSB0aGUgcGVlcgotCQkJCSAqIHRvIHJlLXRyYW5zbWl0IHRoZSBmcmFtZSBsYXRlciBsaWtlCi0JCQkJICogYSBmcmFtZSBsb3N0IG9uIHRoZSB3aXJlLgotCQkJCSAqLwotCQkJCWlmIChjbiA9PSBORVRfUlhfRFJPUCkgewotCQkJCQlwcmludGsoS0VSTl9ERUJVRwotCQkJCQkgICAgICAgIkxBUEI6IHJ4IGNvbmdlc3Rpb25cbiIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbGFwYi0+dnIgPSAobGFwYi0+dnIgKyAxKSAlIG1vZHVsdXM7Ci0JCQkJbGFwYi0+Y29uZGl0aW9uICY9IH5MQVBCX1JFSkVDVF9DT05ESVRJT047Ci0JCQkJaWYgKGZyYW1lLT5wZikKLQkJCQkJbGFwYl9lbnF1aXJ5X3Jlc3BvbnNlKGxhcGIpOwotCQkJCWVsc2UgewotCQkJCQlpZiAoIShsYXBiLT5jb25kaXRpb24gJgotCQkJCQkgICAgICBMQVBCX0FDS19QRU5ESU5HX0NPTkRJVElPTikpIHsKLQkJCQkJCWxhcGItPmNvbmRpdGlvbiB8PSBMQVBCX0FDS19QRU5ESU5HX0NPTkRJVElPTjsKLQkJCQkJCWxhcGJfc3RhcnRfdDJ0aW1lcihsYXBiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGxhcGItPmNvbmRpdGlvbiAmIExBUEJfUkVKRUNUX0NPTkRJVElPTikgewotCQkJCQlpZiAoZnJhbWUtPnBmKQotCQkJCQkJbGFwYl9lbnF1aXJ5X3Jlc3BvbnNlKGxhcGIpOwotCQkJCX0gZWxzZSB7Ci0jaWYgTEFQQl9ERUJVRyA+IDEKLQkJCQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJCQkJICAgICAgICJsYXBiOiAoJXApIFMzIFRYIFJFSiglZCkgUiVkXG4iLAotCQkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYsIGxhcGItPnZyKTsKLSNlbmRpZgotCQkJCQlsYXBiLT5jb25kaXRpb24gfD0gTEFQQl9SRUpFQ1RfQ09ORElUSU9OOwotCQkJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX1JFSiwKLQkJCQkJCQkgIGZyYW1lLT5wZiwKLQkJCQkJCQkgIExBUEJfUkVTUE9OU0UpOwotCQkJCQlsYXBiLT5jb25kaXRpb24gJj0gfkxBUEJfQUNLX1BFTkRJTkdfQ09ORElUSU9OOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTEFQQl9GUk1SOgotI2lmIExBUEJfREVCVUcgPiAxCi0JCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBSWCBGUk1SKCVkKSAlMDJYICIKLQkJCSAgICAgICAiJTAyWCAlMDJYICUwMlggJTAyWFxuIiwgbGFwYi0+ZGV2LCBmcmFtZS0+cGYsCi0JCQkgICAgICAgc2tiLT5kYXRhWzBdLCBza2ItPmRhdGFbMV0sIHNrYi0+ZGF0YVsyXSwKLQkJCSAgICAgICBza2ItPmRhdGFbM10sIHNrYi0+ZGF0YVs0XSk7Ci0jZW5kaWYKLQkJCWxhcGJfZXN0YWJsaXNoX2RhdGFfbGluayhsYXBiKTsKLSNpZiBMQVBCX0RFQlVHID4gMAotCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzFcbiIsCi0JCQkgICAgICAgbGFwYi0+ZGV2KTsKLSNlbmRpZgorCQkJbGFwYi0+Y29uZGl0aW9uID0gMHgwMDsKKwkJCWxhcGItPm4yY291bnQgICA9IDA7CisJCQlsYXBiLT52cyAgICAgICAgPSAwOworCQkJbGFwYi0+dnIgICAgICAgID0gMDsKKwkJCWxhcGItPnZhICAgICAgICA9IDA7CiAJCQlsYXBiX3JlcXVldWVfZnJhbWVzKGxhcGIpOwotCQkJbGFwYi0+c3RhdGUgPSBMQVBCX1NUQVRFXzE7Ci0JCQlicmVhazsKKwkJfQorCQlicmVhazsKIAotCQljYXNlIExBUEJfSUxMRUdBTDoKKwljYXNlIExBUEJfU0FCTUU6CiAjaWYgTEFQQl9ERUJVRyA+IDEKLQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFJYIElMTEVHQUwoJWQpXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBSWCBTQUJNRSglZClcbiIsCisJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJaWYgKGxhcGItPm1vZGUgJiBMQVBCX0VYVEVOREVEKSB7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFRYIFVBKCVkKVxuIiwKIAkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CiAjZW5kaWYKKwkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfVUEsIGZyYW1lLT5wZiwKKwkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJCWxhcGJfc3RvcF90MXRpbWVyKGxhcGIpOworCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7CisJCQlsYXBiLT5jb25kaXRpb24gPSAweDAwOworCQkJbGFwYi0+bjJjb3VudCAgID0gMDsKKwkJCWxhcGItPnZzICAgICAgICA9IDA7CisJCQlsYXBiLT52ciAgICAgICAgPSAwOworCQkJbGFwYi0+dmEgICAgICAgID0gMDsKKwkJCWxhcGJfcmVxdWV1ZV9mcmFtZXMobGFwYik7CisJCX0gZWxzZSB7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFRYIERNKCVkKVxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKKwkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTEFQQl9ESVNDOgorI2lmIExBUEJfREVCVUcgPiAxCisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFJYIERJU0MoJWQpXG4iLAorCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzBcbiIsIGxhcGItPmRldik7CisjZW5kaWYKKwkJbGFwYl9jbGVhcl9xdWV1ZXMobGFwYik7CisJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfVUEsIGZyYW1lLT5wZiwgTEFQQl9SRVNQT05TRSk7CisJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7CisJCWxhcGItPnN0YXRlID0gTEFQQl9TVEFURV8wOworCQlsYXBiX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX09LKTsKKwkJYnJlYWs7CisKKwljYXNlIExBUEJfRE06CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgUlggRE0oJWQpXG4iLAorCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzBcbiIsIGxhcGItPmRldik7CisjZW5kaWYKKwkJbGFwYl9jbGVhcl9xdWV1ZXMobGFwYik7CisJCWxhcGItPnN0YXRlID0gTEFQQl9TVEFURV8wOworCQlsYXBiX3N0YXJ0X3QxdGltZXIobGFwYik7CisJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQlsYXBiX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX05PVENPTk5FQ1RFRCk7CisJCWJyZWFrOworCisJY2FzZSBMQVBCX1JOUjoKKyNpZiBMQVBCX0RFQlVHID4gMQorCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBSWCBSTlIoJWQpIFIlZFxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmLCBmcmFtZS0+bnIpOworI2VuZGlmCisJCWxhcGItPmNvbmRpdGlvbiB8PSBMQVBCX1BFRVJfUlhfQlVTWV9DT05ESVRJT047CisJCWxhcGJfY2hlY2tfbmVlZF9yZXNwb25zZShsYXBiLCBmcmFtZS0+Y3IsIGZyYW1lLT5wZik7CisJCWlmIChsYXBiX3ZhbGlkYXRlX25yKGxhcGIsIGZyYW1lLT5ucikpIHsKKwkJCWxhcGJfY2hlY2tfaWZyYW1lc19hY2tlZChsYXBiLCBmcmFtZS0+bnIpOworCQl9IGVsc2UgewogCQkJbGFwYi0+ZnJtcl9kYXRhID0gKmZyYW1lOwotCQkJbGFwYi0+ZnJtcl90eXBlID0gTEFQQl9GUk1SX1c7CisJCQlsYXBiLT5mcm1yX3R5cGUgPSBMQVBCX0ZSTVJfWjsKKwkJCWxhcGJfdHJhbnNtaXRfZnJtcihsYXBiKTsKKyNpZiBMQVBCX0RFQlVHID4gMAorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzRcbiIsIGxhcGItPmRldik7CisjZW5kaWYKKwkJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJbGFwYi0+c3RhdGUgICA9IExBUEJfU1RBVEVfNDsKKwkJCWxhcGItPm4yY291bnQgPSAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBMQVBCX1JSOgorI2lmIExBUEJfREVCVUcgPiAxCisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFJYIFJSKCVkKSBSJWRcbiIsCisJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZiwgZnJhbWUtPm5yKTsKKyNlbmRpZgorCQlsYXBiLT5jb25kaXRpb24gJj0gfkxBUEJfUEVFUl9SWF9CVVNZX0NPTkRJVElPTjsKKwkJbGFwYl9jaGVja19uZWVkX3Jlc3BvbnNlKGxhcGIsIGZyYW1lLT5jciwgZnJhbWUtPnBmKTsKKwkJaWYgKGxhcGJfdmFsaWRhdGVfbnIobGFwYiwgZnJhbWUtPm5yKSkgeworCQkJbGFwYl9jaGVja19pZnJhbWVzX2Fja2VkKGxhcGIsIGZyYW1lLT5ucik7CisJCX0gZWxzZSB7CisJCQlsYXBiLT5mcm1yX2RhdGEgPSAqZnJhbWU7CisJCQlsYXBiLT5mcm1yX3R5cGUgPSBMQVBCX0ZSTVJfWjsKKwkJCWxhcGJfdHJhbnNtaXRfZnJtcihsYXBiKTsKKyNpZiBMQVBCX0RFQlVHID4gMAorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzRcbiIsIGxhcGItPmRldik7CisjZW5kaWYKKwkJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJbGFwYi0+c3RhdGUgICA9IExBUEJfU1RBVEVfNDsKKwkJCWxhcGItPm4yY291bnQgPSAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBMQVBCX1JFSjoKKyNpZiBMQVBCX0RFQlVHID4gMQorCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBSWCBSRUooJWQpIFIlZFxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmLCBmcmFtZS0+bnIpOworI2VuZGlmCisJCWxhcGItPmNvbmRpdGlvbiAmPSB+TEFQQl9QRUVSX1JYX0JVU1lfQ09ORElUSU9OOworCQlsYXBiX2NoZWNrX25lZWRfcmVzcG9uc2UobGFwYiwgZnJhbWUtPmNyLCBmcmFtZS0+cGYpOworCQlpZiAobGFwYl92YWxpZGF0ZV9ucihsYXBiLCBmcmFtZS0+bnIpKSB7CisJCQlsYXBiX2ZyYW1lc19hY2tlZChsYXBiLCBmcmFtZS0+bnIpOworCQkJbGFwYl9zdG9wX3QxdGltZXIobGFwYik7CisJCQlsYXBiLT5uMmNvdW50ID0gMDsKKwkJCWxhcGJfcmVxdWV1ZV9mcmFtZXMobGFwYik7CisJCX0gZWxzZSB7CisJCQlsYXBiLT5mcm1yX2RhdGEgPSAqZnJhbWU7CisJCQlsYXBiLT5mcm1yX3R5cGUgPSBMQVBCX0ZSTVJfWjsKKwkJCWxhcGJfdHJhbnNtaXRfZnJtcihsYXBiKTsKKyNpZiBMQVBCX0RFQlVHID4gMAorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzRcbiIsIGxhcGItPmRldik7CisjZW5kaWYKKwkJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJbGFwYi0+c3RhdGUgICA9IExBUEJfU1RBVEVfNDsKKwkJCWxhcGItPm4yY291bnQgPSAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBMQVBCX0k6CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgUlggSSglZCkgUyVkIFIlZFxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmLCBmcmFtZS0+bnMsIGZyYW1lLT5ucik7CisjZW5kaWYKKwkJaWYgKCFsYXBiX3ZhbGlkYXRlX25yKGxhcGIsIGZyYW1lLT5ucikpIHsKKwkJCWxhcGItPmZybXJfZGF0YSA9ICpmcmFtZTsKKwkJCWxhcGItPmZybXJfdHlwZSA9IExBUEJfRlJNUl9aOwogCQkJbGFwYl90cmFuc21pdF9mcm1yKGxhcGIpOwogI2lmIExBUEJfREVCVUcgPiAwCiAJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyAtPiBTNFxuIiwgbGFwYi0+ZGV2KTsKQEAgLTYwNyw2ICs1MDUsODcgQEAKIAkJCWxhcGItPnN0YXRlICAgPSBMQVBCX1NUQVRFXzQ7CiAJCQlsYXBiLT5uMmNvdW50ID0gMDsKIAkJCWJyZWFrOworCQl9CisJCWlmIChsYXBiLT5jb25kaXRpb24gJiBMQVBCX1BFRVJfUlhfQlVTWV9DT05ESVRJT04pCisJCQlsYXBiX2ZyYW1lc19hY2tlZChsYXBiLCBmcmFtZS0+bnIpOworCQllbHNlCisJCQlsYXBiX2NoZWNrX2lmcmFtZXNfYWNrZWQobGFwYiwgZnJhbWUtPm5yKTsKKworCQlpZiAoZnJhbWUtPm5zID09IGxhcGItPnZyKSB7CisJCQlpbnQgY247CisJCQljbiA9IGxhcGJfZGF0YV9pbmRpY2F0aW9uKGxhcGIsIHNrYik7CisJCQlxdWV1ZWQgPSAxOworCQkJLyoKKwkJCSAqIElmIHVwcGVyIGxheWVyIGhhcyBkcm9wcGVkIHRoZSBmcmFtZSwgd2UKKwkJCSAqIGJhc2ljYWxseSBpZ25vcmUgYW55IGZ1cnRoZXIgcHJvdG9jb2wKKwkJCSAqIHByb2Nlc3NpbmcuIFRoaXMgd2lsbCBjYXVzZSB0aGUgcGVlcgorCQkJICogdG8gcmUtdHJhbnNtaXQgdGhlIGZyYW1lIGxhdGVyIGxpa2UKKwkJCSAqIGEgZnJhbWUgbG9zdCBvbiB0aGUgd2lyZS4KKwkJCSAqLworCQkJaWYgKGNuID09IE5FVF9SWF9EUk9QKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIkxBUEI6IHJ4IGNvbmdlc3Rpb25cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbGFwYi0+dnIgPSAobGFwYi0+dnIgKyAxKSAlIG1vZHVsdXM7CisJCQlsYXBiLT5jb25kaXRpb24gJj0gfkxBUEJfUkVKRUNUX0NPTkRJVElPTjsKKwkJCWlmIChmcmFtZS0+cGYpCisJCQkJbGFwYl9lbnF1aXJ5X3Jlc3BvbnNlKGxhcGIpOworCQkJZWxzZSB7CisJCQkJaWYgKCEobGFwYi0+Y29uZGl0aW9uICYKKwkJCQkgICAgICBMQVBCX0FDS19QRU5ESU5HX0NPTkRJVElPTikpIHsKKwkJCQkJbGFwYi0+Y29uZGl0aW9uIHw9IExBUEJfQUNLX1BFTkRJTkdfQ09ORElUSU9OOworCQkJCQlsYXBiX3N0YXJ0X3QydGltZXIobGFwYik7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGxhcGItPmNvbmRpdGlvbiAmIExBUEJfUkVKRUNUX0NPTkRJVElPTikgeworCQkJCWlmIChmcmFtZS0+cGYpCisJCQkJCWxhcGJfZW5xdWlyeV9yZXNwb25zZShsYXBiKTsKKwkJCX0gZWxzZSB7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAibGFwYjogKCVwKSBTMyBUWCBSRUooJWQpIFIlZFxuIiwKKwkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYsIGxhcGItPnZyKTsKKyNlbmRpZgorCQkJCWxhcGItPmNvbmRpdGlvbiB8PSBMQVBCX1JFSkVDVF9DT05ESVRJT047CisJCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9SRUosIGZyYW1lLT5wZiwKKwkJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCQkJbGFwYi0+Y29uZGl0aW9uICY9IH5MQVBCX0FDS19QRU5ESU5HX0NPTkRJVElPTjsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgTEFQQl9GUk1SOgorI2lmIExBUEJfREVCVUcgPiAxCisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFJYIEZSTVIoJWQpICUwMlggIgorCQkgICAgICAgIiUwMlggJTAyWCAlMDJYICUwMlhcbiIsIGxhcGItPmRldiwgZnJhbWUtPnBmLAorCQkgICAgICAgc2tiLT5kYXRhWzBdLCBza2ItPmRhdGFbMV0sIHNrYi0+ZGF0YVsyXSwKKwkJICAgICAgIHNrYi0+ZGF0YVszXSwgc2tiLT5kYXRhWzRdKTsKKyNlbmRpZgorCQlsYXBiX2VzdGFibGlzaF9kYXRhX2xpbmsobGFwYik7CisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzFcbiIsIGxhcGItPmRldik7CisjZW5kaWYKKwkJbGFwYl9yZXF1ZXVlX2ZyYW1lcyhsYXBiKTsKKwkJbGFwYi0+c3RhdGUgPSBMQVBCX1NUQVRFXzE7CisJCWJyZWFrOworCisJY2FzZSBMQVBCX0lMTEVHQUw6CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgUlggSUxMRUdBTCglZClcbiIsCisJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJbGFwYi0+ZnJtcl9kYXRhID0gKmZyYW1lOworCQlsYXBiLT5mcm1yX3R5cGUgPSBMQVBCX0ZSTVJfVzsKKwkJbGFwYl90cmFuc21pdF9mcm1yKGxhcGIpOworI2lmIExBUEJfREVCVUcgPiAwCisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIC0+IFM0XG4iLCBsYXBiLT5kZXYpOworI2VuZGlmCisJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7CisJCWxhcGItPnN0YXRlICAgPSBMQVBCX1NUQVRFXzQ7CisJCWxhcGItPm4yY291bnQgPSAwOworCQlicmVhazsKIAl9CiAKIAlpZiAoIXF1ZXVlZCkKQEAgLTYyMSw3NSArNjAwLDczIEBACiAJCQkJc3RydWN0IGxhcGJfZnJhbWUgKmZyYW1lKQogewogCXN3aXRjaCAoZnJhbWUtPnR5cGUpIHsKLQkJY2FzZSBMQVBCX1NBQk06CisJY2FzZSBMQVBCX1NBQk06CiAjaWYgTEFQQl9ERUJVRyA+IDEKLQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFM0IFJYIFNBQk0oJWQpXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTNCBSWCBTQUJNKCVkKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzQgVFggRE0oJWQpXG4iLAogCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKICNlbmRpZgotCQkJaWYgKGxhcGItPm1vZGUgJiBMQVBCX0VYVEVOREVEKSB7CisJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX0RNLCBmcmFtZS0+cGYsCisJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCX0gZWxzZSB7CiAjaWYgTEFQQl9ERUJVRyA+IDEKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTNCBUWCBETSglZClcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLSNlbmRpZgotCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKLQkJCQkJCSAgTEFQQl9SRVNQT05TRSk7Ci0JCQl9IGVsc2UgewotI2lmIExBUEJfREVCVUcgPiAxCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzQgVFggVUEoJWQpXG4iLAotCQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTNCBUWCBVQSglZClcbiIsCisJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOwogI2VuZGlmCiAjaWYgTEFQQl9ERUJVRyA+IDAKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTNCAtPiBTM1xuIiwKLQkJCQkgICAgICAgbGFwYi0+ZGV2KTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFM0IC0+IFMzXG4iLCBsYXBiLT5kZXYpOwogI2VuZGlmCi0JCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLAotCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKLQkJCQlsYXBiX3N0b3BfdDF0aW1lcihsYXBiKTsKLQkJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKLQkJCQlsYXBiLT5zdGF0ZSAgICAgPSBMQVBCX1NUQVRFXzM7Ci0JCQkJbGFwYi0+Y29uZGl0aW9uID0gMHgwMDsKLQkJCQlsYXBiLT5uMmNvdW50ICAgPSAwOwotCQkJCWxhcGItPnZzICAgICAgICA9IDA7Ci0JCQkJbGFwYi0+dnIgICAgICAgID0gMDsKLQkJCQlsYXBiLT52YSAgICAgICAgPSAwOwotCQkJCWxhcGJfY29ubmVjdF9pbmRpY2F0aW9uKGxhcGIsIExBUEJfT0spOwotCQkJfQotCQkJYnJlYWs7CisJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX1VBLCBmcmFtZS0+cGYsCisJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCQlsYXBiX3N0b3BfdDF0aW1lcihsYXBiKTsKKwkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJbGFwYi0+c3RhdGUgICAgID0gTEFQQl9TVEFURV8zOworCQkJbGFwYi0+Y29uZGl0aW9uID0gMHgwMDsKKwkJCWxhcGItPm4yY291bnQgICA9IDA7CisJCQlsYXBiLT52cyAgICAgICAgPSAwOworCQkJbGFwYi0+dnIgICAgICAgID0gMDsKKwkJCWxhcGItPnZhICAgICAgICA9IDA7CisJCQlsYXBiX2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX09LKTsKKwkJfQorCQlicmVhazsKIAotCQljYXNlIExBUEJfU0FCTUU6CisJY2FzZSBMQVBCX1NBQk1FOgogI2lmIExBUEJfREVCVUcgPiAxCi0JCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTNCBSWCBTQUJNRSglZClcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFM0IFJYIFNBQk1FKCVkKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzQgVFggVUEoJWQpXG4iLAogCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKICNlbmRpZgotCQkJaWYgKGxhcGItPm1vZGUgJiBMQVBCX0VYVEVOREVEKSB7Ci0jaWYgTEFQQl9ERUJVRyA+IDEKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTNCBUWCBVQSglZClcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKLSNlbmRpZgogI2lmIExBUEJfREVCVUcgPiAwCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzQgLT4gUzNcbiIsCi0JCQkJICAgICAgIGxhcGItPmRldik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTNCAtPiBTM1xuIiwgbGFwYi0+ZGV2KTsKICNlbmRpZgotCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfVUEsIGZyYW1lLT5wZiwKLQkJCQkJCSAgTEFQQl9SRVNQT05TRSk7Ci0JCQkJbGFwYl9zdG9wX3QxdGltZXIobGFwYik7Ci0JCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7Ci0JCQkJbGFwYi0+c3RhdGUgICAgID0gTEFQQl9TVEFURV8zOwotCQkJCWxhcGItPmNvbmRpdGlvbiA9IDB4MDA7Ci0JCQkJbGFwYi0+bjJjb3VudCAgID0gMDsKLQkJCQlsYXBiLT52cyAgICAgICAgPSAwOwotCQkJCWxhcGItPnZyICAgICAgICA9IDA7Ci0JCQkJbGFwYi0+dmEgICAgICAgID0gMDsKLQkJCQlsYXBiX2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX09LKTsKLQkJCX0gZWxzZSB7CisJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX1VBLCBmcmFtZS0+cGYsCisJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCQlsYXBiX3N0b3BfdDF0aW1lcihsYXBiKTsKKwkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJbGFwYi0+c3RhdGUgICAgID0gTEFQQl9TVEFURV8zOworCQkJbGFwYi0+Y29uZGl0aW9uID0gMHgwMDsKKwkJCWxhcGItPm4yY291bnQgICA9IDA7CisJCQlsYXBiLT52cyAgICAgICAgPSAwOworCQkJbGFwYi0+dnIgICAgICAgID0gMDsKKwkJCWxhcGItPnZhICAgICAgICA9IDA7CisJCQlsYXBiX2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX09LKTsKKwkJfSBlbHNlIHsKICNpZiBMQVBCX0RFQlVHID4gMQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFM0IFRYIERNKCVkKVxuIiwKLQkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzQgVFggRE0oJWQpXG4iLAorCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKICNlbmRpZgotCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKLQkJCQkJCSAgTEFQQl9SRVNQT05TRSk7Ci0JCQl9Ci0JCQlicmVhazsKKwkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKKwkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJfQorCQlicmVhazsKIAl9CiAKIAlrZnJlZV9za2Ioc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9hZXNfY2NtLmMgYi9uZXQvbWFjODAyMTEvYWVzX2NjbS5jCmluZGV4IGI5YjU5NWMuLjA3ODVlOTUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZXNfY2NtLmMKKysrIGIvbmV0L21hYzgwMjExL2Flc19jY20uYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2Flcy5oPgogCiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSAia2V5LmgiCkBAIC0yMSwyMSArMjIsMjEgQEAKIAlpbnQgaTsKIAl1OCAqYl8wLCAqYWFkLCAqYiwgKnNfMDsKIAotCWJfMCA9IHNjcmF0Y2ggKyAzICogQUVTX0JMT0NLX0xFTjsKLQlhYWQgPSBzY3JhdGNoICsgNCAqIEFFU19CTE9DS19MRU47CisJYl8wID0gc2NyYXRjaCArIDMgKiBBRVNfQkxPQ0tfU0laRTsKKwlhYWQgPSBzY3JhdGNoICsgNCAqIEFFU19CTE9DS19TSVpFOwogCWIgPSBzY3JhdGNoOwotCXNfMCA9IHNjcmF0Y2ggKyBBRVNfQkxPQ0tfTEVOOworCXNfMCA9IHNjcmF0Y2ggKyBBRVNfQkxPQ0tfU0laRTsKIAogCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUodGZtLCBiLCBiXzApOwogCiAJLyogRXh0cmEgQXV0aGVudGljYXRlLW9ubHkgZGF0YSAoYWx3YXlzIHR3byBBRVMgYmxvY2tzKSAqLwotCWZvciAoaSA9IDA7IGkgPCBBRVNfQkxPQ0tfTEVOOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEFFU19CTE9DS19TSVpFOyBpKyspCiAJCWFhZFtpXSBePSBiW2ldOwogCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUodGZtLCBiLCBhYWQpOwogCi0JYWFkICs9IEFFU19CTE9DS19MRU47CisJYWFkICs9IEFFU19CTE9DS19TSVpFOwogCi0JZm9yIChpID0gMDsgaSA8IEFFU19CTE9DS19MRU47IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgQUVTX0JMT0NLX1NJWkU7IGkrKykKIAkJYWFkW2ldIF49IGJbaV07CiAJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZSh0Zm0sIGEsIGFhZCk7CiAKQEAgLTU3LDEyICs1OCwxMiBAQAogCXU4ICpwb3MsICpjcG9zLCAqYiwgKnNfMCwgKmUsICpiXzA7CiAKIAliID0gc2NyYXRjaDsKLQlzXzAgPSBzY3JhdGNoICsgQUVTX0JMT0NLX0xFTjsKLQllID0gc2NyYXRjaCArIDIgKiBBRVNfQkxPQ0tfTEVOOwotCWJfMCA9IHNjcmF0Y2ggKyAzICogQUVTX0JMT0NLX0xFTjsKKwlzXzAgPSBzY3JhdGNoICsgQUVTX0JMT0NLX1NJWkU7CisJZSA9IHNjcmF0Y2ggKyAyICogQUVTX0JMT0NLX1NJWkU7CisJYl8wID0gc2NyYXRjaCArIDMgKiBBRVNfQkxPQ0tfU0laRTsKIAotCW51bV9ibG9ja3MgPSBESVZfUk9VTkRfVVAoZGF0YV9sZW4sIEFFU19CTE9DS19MRU4pOwotCWxhc3RfbGVuID0gZGF0YV9sZW4gJSBBRVNfQkxPQ0tfTEVOOworCW51bV9ibG9ja3MgPSBESVZfUk9VTkRfVVAoZGF0YV9sZW4sIEFFU19CTE9DS19TSVpFKTsKKwlsYXN0X2xlbiA9IGRhdGFfbGVuICUgQUVTX0JMT0NLX1NJWkU7CiAJYWVzX2NjbV9wcmVwYXJlKHRmbSwgc2NyYXRjaCwgYik7CiAKIAkvKiBQcm9jZXNzIHBheWxvYWQgYmxvY2tzICovCkBAIC03MCw3ICs3MSw3IEBACiAJY3BvcyA9IGNkYXRhOwogCWZvciAoaiA9IDE7IGogPD0gbnVtX2Jsb2NrczsgaisrKSB7CiAJCWludCBibGVuID0gKGogPT0gbnVtX2Jsb2NrcyAmJiBsYXN0X2xlbikgPwotCQkJbGFzdF9sZW4gOiBBRVNfQkxPQ0tfTEVOOworCQkJbGFzdF9sZW4gOiBBRVNfQkxPQ0tfU0laRTsKIAogCQkvKiBBdXRoZW50aWNhdGlvbiBmb2xsb3dlZCBieSBlbmNyeXB0aW9uICovCiAJCWZvciAoaSA9IDA7IGkgPCBibGVuOyBpKyspCkBAIC05NiwxMiArOTcsMTIgQEAKIAl1OCAqcG9zLCAqY3BvcywgKmIsICpzXzAsICphLCAqYl8wOwogCiAJYiA9IHNjcmF0Y2g7Ci0Jc18wID0gc2NyYXRjaCArIEFFU19CTE9DS19MRU47Ci0JYSA9IHNjcmF0Y2ggKyAyICogQUVTX0JMT0NLX0xFTjsKLQliXzAgPSBzY3JhdGNoICsgMyAqIEFFU19CTE9DS19MRU47CisJc18wID0gc2NyYXRjaCArIEFFU19CTE9DS19TSVpFOworCWEgPSBzY3JhdGNoICsgMiAqIEFFU19CTE9DS19TSVpFOworCWJfMCA9IHNjcmF0Y2ggKyAzICogQUVTX0JMT0NLX1NJWkU7CiAKLQludW1fYmxvY2tzID0gRElWX1JPVU5EX1VQKGRhdGFfbGVuLCBBRVNfQkxPQ0tfTEVOKTsKLQlsYXN0X2xlbiA9IGRhdGFfbGVuICUgQUVTX0JMT0NLX0xFTjsKKwludW1fYmxvY2tzID0gRElWX1JPVU5EX1VQKGRhdGFfbGVuLCBBRVNfQkxPQ0tfU0laRSk7CisJbGFzdF9sZW4gPSBkYXRhX2xlbiAlIEFFU19CTE9DS19TSVpFOwogCWFlc19jY21fcHJlcGFyZSh0Zm0sIHNjcmF0Y2gsIGEpOwogCiAJLyogUHJvY2VzcyBwYXlsb2FkIGJsb2NrcyAqLwpAQCAtMTA5LDcgKzExMCw3IEBACiAJcG9zID0gZGF0YTsKIAlmb3IgKGogPSAxOyBqIDw9IG51bV9ibG9ja3M7IGorKykgewogCQlpbnQgYmxlbiA9IChqID09IG51bV9ibG9ja3MgJiYgbGFzdF9sZW4pID8KLQkJCWxhc3RfbGVuIDogQUVTX0JMT0NLX0xFTjsKKwkJCWxhc3RfbGVuIDogQUVTX0JMT0NLX1NJWkU7CiAKIAkJLyogRGVjcnlwdGlvbiBmb2xsb3dlZCBieSBhdXRoZW50aWNhdGlvbiAqLwogCQliXzBbMTRdID0gKGogPj4gOCkgJiAweGZmOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2Flc19jY20uaCBiL25ldC9tYWM4MDIxMS9hZXNfY2NtLmgKaW5kZXggNmU3ODIwZS4uNWI3ZDc0NCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2Flc19jY20uaAorKysgYi9uZXQvbWFjODAyMTEvYWVzX2NjbS5oCkBAIC0xMiw4ICsxMiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KIAotI2RlZmluZSBBRVNfQkxPQ0tfTEVOIDE2Ci0KIHN0cnVjdCBjcnlwdG9fY2lwaGVyICppZWVlODAyMTFfYWVzX2tleV9zZXR1cF9lbmNyeXB0KGNvbnN0IHU4IGtleVtdKTsKIHZvaWQgaWVlZTgwMjExX2Flc19jY21fZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLCB1OCAqc2NyYXRjaCwKIAkJCSAgICAgICB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2Flc19jbWFjLmMgYi9uZXQvbWFjODAyMTEvYWVzX2NtYWMuYwppbmRleCBkNTAyYjI2Li44ZGZkNzBkIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvYWVzX2NtYWMuYworKysgYi9uZXQvbWFjODAyMTEvYWVzX2NtYWMuYwpAQCAtMTEsMTIgKzExLDEyIEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxjcnlwdG8vYWVzLmg+CiAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlICJrZXkuaCIKICNpbmNsdWRlICJhZXNfY21hYy5oIgogCi0jZGVmaW5lIEFFU19CTE9DS19TSVpFIDE2CiAjZGVmaW5lIEFFU19DTUFDX0tFWV9MRU4gMTYKICNkZWZpbmUgQ01BQ19UTEVOIDggLyogQ01BQyBUTGVuID0gNjQgYml0cyAoOCBvY3RldHMpICovCiAjZGVmaW5lIEFBRF9MRU4gMjAKQEAgLTM1LDEwICszNSwxMCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGFlc18xMjhfY21hY192ZWN0b3Ioc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwgdTggKnNjcmF0Y2gsCi0JCQkJc2l6ZV90IG51bV9lbGVtLAorc3RhdGljIHZvaWQgYWVzXzEyOF9jbWFjX3ZlY3RvcihzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLCBzaXplX3QgbnVtX2VsZW0sCiAJCQkJY29uc3QgdTggKmFkZHJbXSwgY29uc3Qgc2l6ZV90ICpsZW4sIHU4ICptYWMpCiB7CisJdTggc2NyYXRjaFsyICogQUVTX0JMT0NLX1NJWkVdOwogCXU4ICpjYmMsICpwYWQ7CiAJY29uc3QgdTggKnBvcywgKmVuZDsKIAlzaXplX3QgaSwgZSwgbGVmdCwgdG90YWxfbGVuOwpAQCAtOTUsNyArOTUsNyBAQAogfQogCiAKLXZvaWQgaWVlZTgwMjExX2Flc19jbWFjKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0sIHU4ICpzY3JhdGNoLCBjb25zdCB1OCAqYWFkLAordm9pZCBpZWVlODAyMTFfYWVzX2NtYWMoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwgY29uc3QgdTggKmFhZCwKIAkJCWNvbnN0IHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptaWMpCiB7CiAJY29uc3QgdTggKmFkZHJbM107CkBAIC0xMTAsNyArMTEwLDcgQEAKIAlhZGRyWzJdID0gemVybzsKIAlsZW5bMl0gPSBDTUFDX1RMRU47CiAKLQlhZXNfMTI4X2NtYWNfdmVjdG9yKHRmbSwgc2NyYXRjaCwgMywgYWRkciwgbGVuLCBtaWMpOworCWFlc18xMjhfY21hY192ZWN0b3IodGZtLCAzLCBhZGRyLCBsZW4sIG1pYyk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2Flc19jbWFjLmggYi9uZXQvbWFjODAyMTEvYWVzX2NtYWMuaAppbmRleCAwZWI5YTQ4Li4yMDc4NWE2IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvYWVzX2NtYWMuaAorKysgYi9uZXQvbWFjODAyMTEvYWVzX2NtYWMuaApAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogCiBzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqIGllZWU4MDIxMV9hZXNfY21hY19rZXlfc2V0dXAoY29uc3QgdTgga2V5W10pOwotdm9pZCBpZWVlODAyMTFfYWVzX2NtYWMoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwgdTggKnNjcmF0Y2gsIGNvbnN0IHU4ICphYWQsCit2b2lkIGllZWU4MDIxMV9hZXNfY21hYyhzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLCBjb25zdCB1OCAqYWFkLAogCQkJY29uc3QgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1pYyk7CiB2b2lkIGllZWU4MDIxMV9hZXNfY21hY19rZXlfZnJlZShzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtKTsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy1yeC5jIGIvbmV0L21hYzgwMjExL2FnZy1yeC5jCmluZGV4IDljMGQ3NmMuLmZkMWFhZjIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctcnguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXJ4LmMKQEAgLTEwMCw2ICsxMDAsMjkgQEAKIAltdXRleF91bmxvY2soJnN0YS0+YW1wZHVfbWxtZS5tdHgpOwogfQogCit2b2lkIGllZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24oc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTE2IGJhX3J4X2JpdG1hcCwKKwkJCQkgIGNvbnN0IHU4ICphZGRyKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisJaW50IGk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBhZGRyKTsKKwlpZiAoIXN0YSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBTVEFfVElEX05VTTsgaSsrKQorCQlpZiAoYmFfcnhfYml0bWFwICYgQklUKGkpKQorCQkJc2V0X2JpdChpLCBzdGEtPmFtcGR1X21sbWUudGlkX3J4X3N0b3BfcmVxdWVzdGVkKTsKKworCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZzdGEtPmxvY2FsLT5odywgJnN0YS0+YW1wZHVfbWxtZS53b3JrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3BfcnhfYmFfc2Vzc2lvbik7CisKIC8qCiAgKiBBZnRlciBhY2NlcHRpbmcgdGhlIEFkZEJBIFJlcXVlc3Qgd2UgYWN0aXZhdGVkIGEgdGltZXIsCiAgKiByZXNldHRpbmcgaXQgYWZ0ZXIgZWFjaCBmcmFtZSB0aGF0IGFycml2ZXMgZnJvbSB0aGUgb3JpZ2luYXRvci4KQEAgLTI0Nyw3ICsyNzAsMTEgQEAKIAkJCQkiJXBNIG9uIHRpZCAldVxuIiwKIAkJCQltZ210LT5zYSwgdGlkKTsKICNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KLQkJZ290byBlbmQ7CisKKwkJLyogZGVsZXRlIGV4aXN0aW5nIFJ4IEJBIHNlc3Npb24gb24gdGhlIHNhbWUgdGlkICovCisJCV9fX2llZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24oc3RhLCB0aWQsIFdMQU5fQkFDS19SRUNJUElFTlQsCisJCQkJCQlXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9RT1MsCisJCQkJCQlmYWxzZSk7CiAJfQogCiAJLyogcHJlcGFyZSBBLU1QRFUgTUxNRSBmb3IgUnggYWdncmVnYXRpb24gKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9jZmcuYyBiL25ldC9tYWM4MDIxMS9jZmcuYwppbmRleCBiZTcwYzcwLi4zZDFiMDkxIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvY2ZnLmMKKysrIGIvbmV0L21hYzgwMjExL2NmZy5jCkBAIC0yMDksNiArMjA5LDcgQEAKIAl1OCBzZXFbNl0gPSB7MH07CiAJc3RydWN0IGtleV9wYXJhbXMgcGFyYW1zOwogCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXkgPSBOVUxMOworCXU2NCBwbjY0OwogCXUzMiBpdjMyOwogCXUxNiBpdjE2OwogCWludCBlcnIgPSAtRU5PRU5UOwpAQCAtMjU2LDIyICsyNTcsMjQgQEAKIAkJcGFyYW1zLnNlcV9sZW4gPSA2OwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCXNlcVswXSA9IGtleS0+dS5jY21wLnR4X3BuWzVdOwotCQlzZXFbMV0gPSBrZXktPnUuY2NtcC50eF9wbls0XTsKLQkJc2VxWzJdID0ga2V5LT51LmNjbXAudHhfcG5bM107Ci0JCXNlcVszXSA9IGtleS0+dS5jY21wLnR4X3BuWzJdOwotCQlzZXFbNF0gPSBrZXktPnUuY2NtcC50eF9wblsxXTsKLQkJc2VxWzVdID0ga2V5LT51LmNjbXAudHhfcG5bMF07CisJCXBuNjQgPSBhdG9taWM2NF9yZWFkKCZrZXktPnUuY2NtcC50eF9wbik7CisJCXNlcVswXSA9IHBuNjQ7CisJCXNlcVsxXSA9IHBuNjQgPj4gODsKKwkJc2VxWzJdID0gcG42NCA+PiAxNjsKKwkJc2VxWzNdID0gcG42NCA+PiAyNDsKKwkJc2VxWzRdID0gcG42NCA+PiAzMjsKKwkJc2VxWzVdID0gcG42NCA+PiA0MDsKIAkJcGFyYW1zLnNlcSA9IHNlcTsKIAkJcGFyYW1zLnNlcV9sZW4gPSA2OwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDOgotCQlzZXFbMF0gPSBrZXktPnUuYWVzX2NtYWMudHhfcG5bNV07Ci0JCXNlcVsxXSA9IGtleS0+dS5hZXNfY21hYy50eF9wbls0XTsKLQkJc2VxWzJdID0ga2V5LT51LmFlc19jbWFjLnR4X3BuWzNdOwotCQlzZXFbM10gPSBrZXktPnUuYWVzX2NtYWMudHhfcG5bMl07Ci0JCXNlcVs0XSA9IGtleS0+dS5hZXNfY21hYy50eF9wblsxXTsKLQkJc2VxWzVdID0ga2V5LT51LmFlc19jbWFjLnR4X3BuWzBdOworCQlwbjY0ID0gYXRvbWljNjRfcmVhZCgma2V5LT51LmFlc19jbWFjLnR4X3BuKTsKKwkJc2VxWzBdID0gcG42NDsKKwkJc2VxWzFdID0gcG42NCA+PiA4OworCQlzZXFbMl0gPSBwbjY0ID4+IDE2OworCQlzZXFbM10gPSBwbjY0ID4+IDI0OworCQlzZXFbNF0gPSBwbjY0ID4+IDMyOworCQlzZXFbNV0gPSBwbjY0ID4+IDQwOwogCQlwYXJhbXMuc2VxID0gc2VxOwogCQlwYXJhbXMuc2VxX2xlbiA9IDY7CiAJCWJyZWFrOwpAQCAtNjc0LDggKzY3NywxMSBAQAogCiAJaWYgKG1hc2sgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19XTUUpKSB7CiAJCXN0YS0+ZmxhZ3MgJj0gfldMQU5fU1RBX1dNRTsKLQkJaWYgKHNldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpCisJCXN0YS0+c3RhLndtZSA9IGZhbHNlOworCQlpZiAoc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSkgewogCQkJc3RhLT5mbGFncyB8PSBXTEFOX1NUQV9XTUU7CisJCQlzdGEtPnN0YS53bWUgPSB0cnVlOworCQl9CiAJfQogCiAJaWYgKG1hc2sgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19NRlApKSB7CkBAIC0xMjQ5LDYgKzEyNTUsMTAgQEAKIAkgKi8KIAlwLnVhcHNkID0gZmFsc2U7CiAKKwlpZiAocGFyYW1zLT5xdWV1ZSA+PSBsb2NhbC0+aHcucXVldWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2FsLT50eF9jb25mW3BhcmFtcy0+cXVldWVdID0gcDsKIAlpZiAoZHJ2X2NvbmZfdHgobG9jYWwsIHBhcmFtcy0+cXVldWUsICZwKSkgewogCQl3aXBoeV9kZWJ1Zyhsb2NhbC0+aHcud2lwaHksCiAJCQkgICAgImZhaWxlZCB0byBzZXQgVFggcXVldWUgcGFyYW1ldGVycyBmb3IgcXVldWUgJWRcbiIsCkBAIC0xNTU0LDYgKzE1NjQsMTkgQEAKIAogCXJldHVybiBsb2NhbC0+b3BzLT50ZXN0bW9kZV9jbWQoJmxvY2FsLT5odywgZGF0YSwgbGVuKTsKIH0KKworc3RhdGljIGludCBpZWVlODAyMTFfdGVzdG1vZGVfZHVtcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkJCSAgIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3aXBoeV9wcml2KHdpcGh5KTsKKworCWlmICghbG9jYWwtPm9wcy0+dGVzdG1vZGVfZHVtcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIGxvY2FsLT5vcHMtPnRlc3Rtb2RlX2R1bXAoJmxvY2FsLT5odywgc2tiLCBjYiwgZGF0YSwgbGVuKTsKK30KICNlbmRpZgogCiBpbnQgX19pZWVlODAyMTFfcmVxdWVzdF9zbXBzKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApAQCAtMjA4NSw2ICsyMTA4LDIxIEBACiAJZHJ2X2dldF9yaW5ncGFyYW0obG9jYWwsIHR4LCB0eF9tYXgsIHJ4LCByeF9tYXgpOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9zZXRfcmVrZXlfZGF0YShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfZ3RrX3Jla2V5X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CisKKwlpZiAoIWxvY2FsLT5vcHMtPnNldF9yZWtleV9kYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlkcnZfc2V0X3Jla2V5X2RhdGEobG9jYWwsIHNkYXRhLCBkYXRhKTsKKworCXJldHVybiAwOworfQorCiBzdHJ1Y3QgY2ZnODAyMTFfb3BzIG1hYzgwMjExX2NvbmZpZ19vcHMgPSB7CiAJLmFkZF92aXJ0dWFsX2ludGYgPSBpZWVlODAyMTFfYWRkX2lmYWNlLAogCS5kZWxfdmlydHVhbF9pbnRmID0gaWVlZTgwMjExX2RlbF9pZmFjZSwKQEAgLTIxMzQsNiArMjE3Miw3IEBACiAJLnNldF93ZHNfcGVlciA9IGllZWU4MDIxMV9zZXRfd2RzX3BlZXIsCiAJLnJma2lsbF9wb2xsID0gaWVlZTgwMjExX3Jma2lsbF9wb2xsLAogCUNGRzgwMjExX1RFU1RNT0RFX0NNRChpZWVlODAyMTFfdGVzdG1vZGVfY21kKQorCUNGRzgwMjExX1RFU1RNT0RFX0RVTVAoaWVlZTgwMjExX3Rlc3Rtb2RlX2R1bXApCiAJLnNldF9wb3dlcl9tZ210ID0gaWVlZTgwMjExX3NldF9wb3dlcl9tZ210LAogCS5zZXRfYml0cmF0ZV9tYXNrID0gaWVlZTgwMjExX3NldF9iaXRyYXRlX21hc2ssCiAJLnJlbWFpbl9vbl9jaGFubmVsID0gaWVlZTgwMjExX3JlbWFpbl9vbl9jaGFubmVsLApAQCAtMjE0Niw0ICsyMTg1LDUgQEAKIAkuZ2V0X2FudGVubmEgPSBpZWVlODAyMTFfZ2V0X2FudGVubmEsCiAJLnNldF9yaW5ncGFyYW0gPSBpZWVlODAyMTFfc2V0X3JpbmdwYXJhbSwKIAkuZ2V0X3JpbmdwYXJhbSA9IGllZWU4MDIxMV9nZXRfcmluZ3BhcmFtLAorCS5zZXRfcmVrZXlfZGF0YSA9IGllZWU4MDIxMV9zZXRfcmVrZXlfZGF0YSwKIH07CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZGVidWdmc19rZXkuYyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX2tleS5jCmluZGV4IDMzYzU4YjguLjM4ZTYxMDEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX2tleS5jCisrKyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX2tleS5jCkBAIC03OCw3ICs3OCw3IEBACiBzdGF0aWMgc3NpemVfdCBrZXlfdHhfc3BlY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQljb25zdCB1OCAqdHBuOworCXU2NCBwbjsKIAljaGFyIGJ1ZlsyMF07CiAJaW50IGxlbjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtOTQsMTUgKzk0LDE2IEBACiAJCQkJa2V5LT51LnRraXAudHguaXYxNik7CiAJCWJyZWFrOwogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJdHBuID0ga2V5LT51LmNjbXAudHhfcG47CisJCXBuID0gYXRvbWljNjRfcmVhZCgma2V5LT51LmNjbXAudHhfcG4pOwogCQlsZW4gPSBzY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKLQkJCQl0cG5bMF0sIHRwblsxXSwgdHBuWzJdLCB0cG5bM10sIHRwbls0XSwgdHBuWzVdKTsKKwkJCQkodTgpKHBuID4+IDQwKSwgKHU4KShwbiA+PiAzMiksICh1OCkocG4gPj4gMjQpLAorCQkJCSh1OCkocG4gPj4gMTYpLCAodTgpKHBuID4+IDgpLCAodTgpcG4pOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDOgotCQl0cG4gPSBrZXktPnUuYWVzX2NtYWMudHhfcG47CisJCXBuID0gYXRvbWljNjRfcmVhZCgma2V5LT51LmFlc19jbWFjLnR4X3BuKTsKIAkJbGVuID0gc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCi0JCQkJdHBuWzBdLCB0cG5bMV0sIHRwblsyXSwgdHBuWzNdLCB0cG5bNF0sCi0JCQkJdHBuWzVdKTsKKwkJCQkodTgpKHBuID4+IDQwKSwgKHU4KShwbiA+PiAzMiksICh1OCkocG4gPj4gMjQpLAorCQkJCSh1OCkocG4gPj4gMTYpLCAodTgpKHBuID4+IDgpLCAodTgpcG4pOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmggYi9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oCmluZGV4IGVlYmY3YTYuLjE0MjUzODAgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmgKKysrIGIvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaApAQCAtMTMwLDYgKzEzMCwzNyBAQAogCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGRydl90eF9zeW5jKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkgICAgICBjb25zdCB1OCAqYnNzaWQsCisJCQkgICAgICBlbnVtIGllZWU4MDIxMV90eF9zeW5jX3R5cGUgdHlwZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwl0cmFjZV9kcnZfdHhfc3luYyhsb2NhbCwgc2RhdGEsIGJzc2lkLCB0eXBlKTsKKwlpZiAobG9jYWwtPm9wcy0+dHhfc3luYykKKwkJcmV0ID0gbG9jYWwtPm9wcy0+dHhfc3luYygmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwKKwkJCQkJICBic3NpZCwgdHlwZSk7CisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRydl9maW5pc2hfdHhfc3luYyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICAgICBjb25zdCB1OCAqYnNzaWQsCisJCQkJICAgICAgZW51bSBpZWVlODAyMTFfdHhfc3luY190eXBlIHR5cGUpCit7CisJbWlnaHRfc2xlZXAoKTsKKworCXRyYWNlX2Rydl9maW5pc2hfdHhfc3luYyhsb2NhbCwgc2RhdGEsIGJzc2lkLCB0eXBlKTsKKwlpZiAobG9jYWwtPm9wcy0+ZmluaXNoX3R4X3N5bmMpCisJCWxvY2FsLT5vcHMtPmZpbmlzaF90eF9zeW5jKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLAorCQkJCQkgICBic3NpZCwgdHlwZSk7CisJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKK30KKwogc3RhdGljIGlubGluZSB1NjQgZHJ2X3ByZXBhcmVfbXVsdGljYXN0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJCQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHJfbGlzdCAqbWNfbGlzdCkKIHsKQEAgLTIxOCw2ICsyNDksMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X2NhbmNlbF9od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCW1pZ2h0X3NsZWVwKCk7CisKKwl0cmFjZV9kcnZfY2FuY2VsX2h3X3NjYW4obG9jYWwsIHNkYXRhKTsKKwlsb2NhbC0+b3BzLT5jYW5jZWxfaHdfc2NhbigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CisJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQKIGRydl9zY2hlZF9zY2FuX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApAQCAtNjM3LDQgKzY3OCwyMiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcnZfc2V0X3Jla2V5X2RhdGEoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgICAgc3RydWN0IGNmZzgwMjExX2d0a19yZWtleV9kYXRhICpkYXRhKQoreworCXRyYWNlX2Rydl9zZXRfcmVrZXlfZGF0YShsb2NhbCwgc2RhdGEsIGRhdGEpOworCWlmIChsb2NhbC0+b3BzLT5zZXRfcmVrZXlfZGF0YSkKKwkJbG9jYWwtPm9wcy0+c2V0X3Jla2V5X2RhdGEoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIGRhdGEpOworCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcnZfcnNzaV9jYWxsYmFjayhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkgICAgIGNvbnN0IGVudW0gaWVlZTgwMjExX3Jzc2lfZXZlbnQgZXZlbnQpCit7CisJdHJhY2VfZHJ2X3Jzc2lfY2FsbGJhY2sobG9jYWwsIGV2ZW50KTsKKwlpZiAobG9jYWwtPm9wcy0+cnNzaV9jYWxsYmFjaykKKwkJbG9jYWwtPm9wcy0+cnNzaV9jYWxsYmFjaygmbG9jYWwtPmh3LCBldmVudCk7CisJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKK30KICNlbmRpZiAvKiBfX01BQzgwMjExX0RSSVZFUl9PUFMgKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kcml2ZXItdHJhY2UuaCBiL25ldC9tYWM4MDIxMS9kcml2ZXItdHJhY2UuaAppbmRleCBlZDllZGNiLi5mNDdiMDBkIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvZHJpdmVyLXRyYWNlLmgKKysrIGIvbmV0L21hYzgwMjExL2RyaXZlci10cmFjZS5oCkBAIC0zMTksNiArMzE5LDQ5IEBACiAJKQogKTsKIAorREVDTEFSRV9FVkVOVF9DTEFTUyh0eF9zeW5jX2V2dCwKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkgY29uc3QgdTggKmJzc2lkLAorCQkgZW51bSBpZWVlODAyMTFfdHhfc3luY190eXBlIHR5cGUpLAorCVRQX0FSR1MobG9jYWwsIHNkYXRhLCBic3NpZCwgdHlwZSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlMT0NBTF9FTlRSWQorCQlWSUZfRU5UUlkKKwkJX19hcnJheShjaGFyLCBic3NpZCwgRVRIX0FMRU4pCisJCV9fZmllbGQodTMyLCBzeW5jX3R5cGUpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlMT0NBTF9BU1NJR047CisJCVZJRl9BU1NJR047CisJCW1lbWNweShfX2VudHJ5LT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKTsKKwkJX19lbnRyeS0+c3luY190eXBlID0gdHlwZTsKKwkpLAorCisJVFBfcHJpbnRrKAorCQlMT0NBTF9QUl9GTVQgIFZJRl9QUl9GTVQgIiBic3NpZDolcE0gdHlwZTolZCIsCisJCUxPQ0FMX1BSX0FSRywgVklGX1BSX0FSRywgX19lbnRyeS0+YnNzaWQsIF9fZW50cnktPnN5bmNfdHlwZQorCSkKKyk7CisKK0RFRklORV9FVkVOVCh0eF9zeW5jX2V2dCwgZHJ2X3R4X3N5bmMsCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJIGNvbnN0IHU4ICpic3NpZCwKKwkJIGVudW0gaWVlZTgwMjExX3R4X3N5bmNfdHlwZSB0eXBlKSwKKwlUUF9BUkdTKGxvY2FsLCBzZGF0YSwgYnNzaWQsIHR5cGUpCispOworCitERUZJTkVfRVZFTlQodHhfc3luY19ldnQsIGRydl9maW5pc2hfdHhfc3luYywKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkgY29uc3QgdTggKmJzc2lkLAorCQkgZW51bSBpZWVlODAyMTFfdHhfc3luY190eXBlIHR5cGUpLAorCVRQX0FSR1MobG9jYWwsIHNkYXRhLCBic3NpZCwgdHlwZSkKKyk7CisKIFRSQUNFX0VWRU5UKGRydl9wcmVwYXJlX211bHRpY2FzdCwKIAlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgaW50IG1jX2NvdW50KSwKIApAQCAtNDYwLDYgKzUwMywxMiBAQAogCVRQX0FSR1MobG9jYWwsIHNkYXRhKQogKTsKIAorREVGSU5FX0VWRU5UKGxvY2FsX3NkYXRhX2V2dCwgZHJ2X2NhbmNlbF9od19zY2FuLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpLAorCVRQX0FSR1MobG9jYWwsIHNkYXRhKQorKTsKKwogREVGSU5FX0VWRU5UKGxvY2FsX3NkYXRhX2V2dCwgZHJ2X3NjaGVkX3NjYW5fc3RhcnQsCiAJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSksCkBAIC0xMDE4LDYgKzEwNjcsNTYgQEAKIAkpCiApOwogCitUUkFDRV9FVkVOVChkcnZfc2V0X3Jla2V5X2RhdGEsCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJIHN0cnVjdCBjZmc4MDIxMV9ndGtfcmVrZXlfZGF0YSAqZGF0YSksCisKKwlUUF9BUkdTKGxvY2FsLCBzZGF0YSwgZGF0YSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlMT0NBTF9FTlRSWQorCQlWSUZfRU5UUlkKKwkJX19hcnJheSh1OCwga2VrLCBOTDgwMjExX0tFS19MRU4pCisJCV9fYXJyYXkodTgsIGtjaywgTkw4MDIxMV9LQ0tfTEVOKQorCQlfX2FycmF5KHU4LCByZXBsYXlfY3RyLCBOTDgwMjExX1JFUExBWV9DVFJfTEVOKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJTE9DQUxfQVNTSUdOOworCQlWSUZfQVNTSUdOOworCQltZW1jcHkoX19lbnRyeS0+a2VrLCBkYXRhLT5rZWssIE5MODAyMTFfS0VLX0xFTik7CisJCW1lbWNweShfX2VudHJ5LT5rY2ssIGRhdGEtPmtjaywgTkw4MDIxMV9LQ0tfTEVOKTsKKwkJbWVtY3B5KF9fZW50cnktPnJlcGxheV9jdHIsIGRhdGEtPnJlcGxheV9jdHIsCisJCSAgICAgICBOTDgwMjExX1JFUExBWV9DVFJfTEVOKTsKKwkpLAorCisJVFBfcHJpbnRrKExPQ0FMX1BSX0ZNVCBWSUZfUFJfRk1ULAorCQkgIExPQ0FMX1BSX0FSRywgVklGX1BSX0FSRykKKyk7CisKK1RSQUNFX0VWRU5UKGRydl9yc3NpX2NhbGxiYWNrLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgZW51bSBpZWVlODAyMTFfcnNzaV9ldmVudCByc3NpX2V2ZW50KSwKKworCVRQX0FSR1MobG9jYWwsIHJzc2lfZXZlbnQpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkJX19maWVsZCh1MzIsIHJzc2lfZXZlbnQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlMT0NBTF9BU1NJR047CisJCV9fZW50cnktPnJzc2lfZXZlbnQgPSByc3NpX2V2ZW50OworCSksCisKKwlUUF9wcmludGsoCisJCUxPQ0FMX1BSX0ZNVCAiIHJzc2lfZXZlbnQ6JWQiLAorCQlMT0NBTF9QUl9BUkcsIF9fZW50cnktPnJzc2lfZXZlbnQKKwkpCispOworCiAvKgogICogVHJhY2luZyBmb3IgQVBJIGNhbGxzIHRoYXQgZHJpdmVycyBjYWxsLgogICovCkBAIC0xMjg3LDYgKzEzODYsNTEgQEAKIAlUUF9BUkdTKGxvY2FsKQogKTsKIAorVFJBQ0VfRVZFTlQoYXBpX2d0a19yZWtleV9ub3RpZnksCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICpyZXBsYXlfY3RyKSwKKworCVRQX0FSR1Moc2RhdGEsIGJzc2lkLCByZXBsYXlfY3RyKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCVZJRl9FTlRSWQorCQlfX2FycmF5KHU4LCBic3NpZCwgRVRIX0FMRU4pCisJCV9fYXJyYXkodTgsIHJlcGxheV9jdHIsIE5MODAyMTFfUkVQTEFZX0NUUl9MRU4pCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlWSUZfQVNTSUdOOworCQltZW1jcHkoX19lbnRyeS0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTik7CisJCW1lbWNweShfX2VudHJ5LT5yZXBsYXlfY3RyLCByZXBsYXlfY3RyLCBOTDgwMjExX1JFUExBWV9DVFJfTEVOKTsKKwkpLAorCisJVFBfcHJpbnRrKFZJRl9QUl9GTVQsIFZJRl9QUl9BUkcpCispOworCitUUkFDRV9FVkVOVChhcGlfZW5hYmxlX3Jzc2lfcmVwb3J0cywKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJIGludCByc3NpX21pbl90aG9sZCwgaW50IHJzc2lfbWF4X3Rob2xkKSwKKworCVRQX0FSR1Moc2RhdGEsIHJzc2lfbWluX3Rob2xkLCByc3NpX21heF90aG9sZCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlWSUZfRU5UUlkKKwkJX19maWVsZChpbnQsIHJzc2lfbWluX3Rob2xkKQorCQlfX2ZpZWxkKGludCwgcnNzaV9tYXhfdGhvbGQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlWSUZfQVNTSUdOOworCQlfX2VudHJ5LT5yc3NpX21pbl90aG9sZCA9IHJzc2lfbWluX3Rob2xkOworCQlfX2VudHJ5LT5yc3NpX21heF90aG9sZCA9IHJzc2lfbWF4X3Rob2xkOworCSksCisKKwlUUF9wcmludGsoCisJCVZJRl9QUl9GTVQgIiByc3NpX21pbl90aG9sZCA9JWQsIHJzc2lfbWF4X3Rob2xkID0gJWQiLAorCQlWSUZfUFJfQVJHLCBfX2VudHJ5LT5yc3NpX21pbl90aG9sZCwgX19lbnRyeS0+cnNzaV9tYXhfdGhvbGQKKwkpCispOworCiAvKgogICogVHJhY2luZyBmb3IgaW50ZXJuYWwgZnVuY3Rpb25zCiAgKiAod2hpY2ggbWF5IGFsc28gYmUgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGRyaXZlciBjYWxscykKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9odC5jIGIvbmV0L21hYzgwMjExL2h0LmMKaW5kZXggNTkxYWRkMi4uN2NmYzI4NiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2h0LmMKKysrIGIvbmV0L21hYzgwMjExL2h0LmMKQEAgLTE0MCw2ICsxNDAsMTIgQEAKIAkJCQlzdGEsIHRpZCwgV0xBTl9CQUNLX1JFQ0lQSUVOVCwKIAkJCQlXTEFOX1JFQVNPTl9RU1RBX1RJTUVPVVQsIHRydWUpOwogCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQodGlkLAorCQkJCSAgICAgICBzdGEtPmFtcGR1X21sbWUudGlkX3J4X3N0b3BfcmVxdWVzdGVkKSkKKwkJCV9fX2llZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24oCisJCQkJc3RhLCB0aWQsIFdMQU5fQkFDS19SRUNJUElFTlQsCisJCQkJV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQsIHRydWUpOworCiAJCXRpZF90eCA9IHN0YS0+YW1wZHVfbWxtZS50aWRfc3RhcnRfdHhbdGlkXTsKIAkJaWYgKHRpZF90eCkgewogCQkJLyoKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pYnNzLmMgYi9uZXQvbWFjODAyMTEvaWJzcy5jCmluZGV4IDQyMWVhYTYuLjU2YzI0Y2EgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pYnNzLmMKKysrIGIvbmV0L21hYzgwMjExL2lic3MuYwpAQCAtOTY1LDYgKzk2NSwxMCBAQAogCiAJbXV0ZXhfbG9jaygmc2RhdGEtPnUuaWJzcy5tdHgpOwogCisJc2RhdGEtPnUuaWJzcy5zdGF0ZSA9IElFRUU4MDIxMV9JQlNTX01MTUVfU0VBUkNIOworCW1lbXNldChzZGF0YS0+dS5pYnNzLmJzc2lkLCAwLCBFVEhfQUxFTik7CisJc2RhdGEtPnUuaWJzcy5zc2lkX2xlbiA9IDA7CisKIAlhY3RpdmVfaWJzcyA9IGllZWU4MDIxMV9zdGFfYWN0aXZlX2lic3Moc2RhdGEpOwogCiAJaWYgKCFhY3RpdmVfaWJzcyAmJiAhaXNfemVyb19ldGhlcl9hZGRyKGlmaWJzcy0+YnNzaWQpKSB7CkBAIC05OTksOCArMTAwMyw2IEBACiAJa2ZyZWVfc2tiKHNrYik7CiAKIAlza2JfcXVldWVfcHVyZ2UoJnNkYXRhLT5za2JfcXVldWUpOwotCW1lbXNldChzZGF0YS0+dS5pYnNzLmJzc2lkLCAwLCBFVEhfQUxFTik7Ci0Jc2RhdGEtPnUuaWJzcy5zc2lkX2xlbiA9IDA7CiAKIAlkZWxfdGltZXJfc3luYygmc2RhdGEtPnUuaWJzcy50aW1lcik7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oIGIvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKaW5kZXggMjAyNWFmNS4uNDAwYzA5YiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKKysrIGIvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKQEAgLTIwMiw3ICsyMDIsMjIgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5OwogCiAJdW5zaWduZWQgaW50IGZsYWdzOwotCWludCBxdWV1ZTsKKworCS8qCisJICogSW5kZXggaW50byBzZXF1ZW5jZSBudW1iZXJzIGFycmF5LCAwLi4xNgorCSAqIHNpbmNlIHRoZSBsYXN0ICgxNikgaXMgdXNlZCBmb3Igbm9uLVFvUywKKwkgKiB3aWxsIGJlIDE2IG9uIG5vbi1Rb1MgZnJhbWVzLgorCSAqLworCWludCBzZXFub19pZHg7CisKKwkvKgorCSAqIEluZGV4IGludG8gdGhlIHNlY3VyaXR5IElWL1BOIGFycmF5cywgMC4uMTYKKwkgKiBzaW5jZSB0aGUgbGFzdCAoMTYpIGlzIHVzZWQgZm9yIENDTVAtZW5jcnlwdGVkCisJICogbWFuYWdlbWVudCBmcmFtZXMsIHdpbGwgYmUgc2V0IHRvIDE2IG9uIG1nbXQKKwkgKiBmcmFtZXMgYW5kIDAgb24gbm9uLVFvUyBmcmFtZXMuCisJICovCisJaW50IHNlY3VyaXR5X2lkeDsKKwogCXUzMiB0a2lwX2l2MzI7CiAJdTE2IHRraXBfaXYxNjsKIH07CkBAIC0zMDgsNiArMzIzLDcgQEAKIAkJCXU4IGtleVtXTEFOX0tFWV9MRU5fV0VQMTA0XTsKIAkJCXU4IGtleV9sZW4sIGtleV9pZHg7CiAJCQlib29sIHByaXZhY3k7CisJCQlib29sIHN5bmNlZDsKIAkJfSBwcm9iZV9hdXRoOwogCQlzdHJ1Y3QgewogCQkJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwpAQCAtMzIxLDYgKzMzNyw3IEBACiAJCQl1OCBzc2lkX2xlbjsKIAkJCXU4IHN1cHBfcmF0ZXNfbGVuOwogCQkJYm9vbCB3bW1fdXNlZCwgdXNlXzExbiwgdWFwc2RfdXNlZDsKKwkJCWJvb2wgc3luY2VkOwogCQl9IGFzc29jOwogCQlzdHJ1Y3QgewogCQkJdTMyIGR1cmF0aW9uOwpAQCAtNDE3LDYgKzQzNCwxNCBAQAogCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgYXNzb2NpYXRpb24uCiAJICovCiAJaW50IGxhc3RfY3FtX2V2ZW50X3NpZ25hbDsKKworCS8qCisJICogU3RhdGUgdmFyaWFibGVzIGZvciBrZWVwaW5nIHRyYWNrIG9mIFJTU0kgb2YgdGhlIEFQIGN1cnJlbnRseQorCSAqIGNvbm5lY3RlZCB0byBhbmQgaW5mb3JtaW5nIGRyaXZlciB3aGVuIFJTU0kgaGFzIGdvbmUKKwkgKiBiZWxvdy9hYm92ZSBhIGNlcnRhaW4gdGhyZXNob2xkLgorCSAqLworCWludCByc3NpX21pbl90aG9sZCwgcnNzaV9tYXhfdGhvbGQ7CisJaW50IGxhc3RfYXZlX2JlYWNvbl9zaWduYWw7CiB9OwogCiBzdHJ1Y3QgaWVlZTgwMjExX2lmX2lic3MgewpAQCAtNTE1LDEyICs1NDAsMTQgQEAKICAqIEBJRUVFODAyMTFfU0RBVEFfRE9OVF9CUklER0VfUEFDS0VUUzogYnJpZGdlIHBhY2tldHMgYmV0d2VlbgogICoJYXNzb2NpYXRlZCBzdGF0aW9ucyBhbmQgZGVsaXZlciBtdWx0aWNhc3QgZnJhbWVzIGJvdGgKICAqCWJhY2sgdG8gd2lyZWxlc3MgbWVkaWEgYW5kIHRvIHRoZSBsb2NhbCBuZXQgc3RhY2suCisgKiBASUVFRTgwMjExX1NEQVRBX0RJU0NPTk5FQ1RfUkVTVU1FOiBEaXNjb25uZWN0IGFmdGVyIHJlc3VtZS4KICAqLwogZW51bSBpZWVlODAyMTFfc3ViX2lmX2RhdGFfZmxhZ3MgewogCUlFRUU4MDIxMV9TREFUQV9BTExNVUxUSQkJPSBCSVQoMCksCiAJSUVFRTgwMjExX1NEQVRBX1BST01JU0MJCQk9IEJJVCgxKSwKIAlJRUVFODAyMTFfU0RBVEFfT1BFUkFUSU5HX0dNT0RFCQk9IEJJVCgyKSwKIAlJRUVFODAyMTFfU0RBVEFfRE9OVF9CUklER0VfUEFDS0VUUwk9IEJJVCgzKSwKKwlJRUVFODAyMTFfU0RBVEFfRElTQ09OTkVDVF9SRVNVTUUJPSBCSVQoNCksCiB9OwogCiAvKioKQEAgLTU0NCw2ICs1NzEsOSBAQAogCS8qIGtleXMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGtleV9saXN0OwogCisJLyogY291bnQgZm9yIGtleXMgbmVlZGluZyB0YWlscm9vbSBzcGFjZSBhbGxvY2F0aW9uICovCisJaW50IGNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250OworCiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbDsKIApAQCAtNzE4LDYgKzc0OCw3IEBACiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKIAogCXVuc2lnbmVkIGxvbmcgcXVldWVfc3RvcF9yZWFzb25zW0lFRUU4MDIxMV9NQVhfUVVFVUVTXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyB0eF9jb25mW0lFRUU4MDIxMV9NQVhfUVVFVUVTXTsKIAkvKiBhbHNvIHVzZWQgdG8gcHJvdGVjdCBhbXBkdV9hY19xdWV1ZSBhbmQgYW1kcHVfYWNfc3RvcF9yZWZjbnQgKi8KIAlzcGlubG9ja190IHF1ZXVlX3N0b3BfcmVhc29uX2xvY2s7CiAKQEAgLTc3NSw5ICs4MDYsNiBAQAogCiAJaW50IHR4X2hlYWRyb29tOyAvKiByZXF1aXJlZCBoZWFkcm9vbSBmb3IgaGFyZHdhcmUvcmFkaW90YXAgKi8KIAotCS8qIGNvdW50IGZvciBrZXlzIG5lZWRpbmcgdGFpbHJvb20gc3BhY2UgYWxsb2NhdGlvbiAqLwotCWludCBjcnlwdG9fdHhfdGFpbHJvb21fbmVlZGVkX2NudDsKLQogCS8qIFRhc2tsZXQgYW5kIHNrYiBxdWV1ZSB0byBwcm9jZXNzIGNhbGxzIGZyb20gSVJRIG1vZGUuIEFsbCBmcmFtZXMKIAkgKiBhZGRlZCB0byBza2JfcXVldWUgd2lsbCBiZSBwcm9jZXNzZWQsIGJ1dCBmcmFtZXMgaW4KIAkgKiBza2JfcXVldWVfdW5yZWxpYWJsZSBtYXkgYmUgZHJvcHBlZCBpZiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZXNlCkBAIC0xMzUxLDEyICsxMzc5LDE0IEBACiAJCQkgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgdTMyIHJhdGVfbWFzaywKIAkJCSAgICAgdTggY2hhbm5lbCk7CiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2J1aWxkX3Byb2JlX3JlcShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkJICB1OCAqZHN0LAorCQkJCQkgIHU4ICpkc3QsIHUzMiByYXRlbWFzaywKIAkJCQkJICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAotCQkJCQkgIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbik7CisJCQkJCSAgY29uc3QgdTggKmllLCBzaXplX3QgaWVfbGVuLAorCQkJCQkgIGJvb2wgZGlyZWN0ZWQpOwogdm9pZCBpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHU4ICpkc3QsCiAJCQkgICAgICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAotCQkJICAgICAgY29uc3QgdTggKmllLCBzaXplX3QgaWVfbGVuKTsKKwkJCSAgICAgIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbiwKKwkJCSAgICAgIHUzMiByYXRlbWFzaywgYm9vbCBkaXJlY3RlZCk7CiAKIHZvaWQgaWVlZTgwMjExX3N0YV9kZWZfd21tX3BhcmFtcyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgIGNvbnN0IHNpemVfdCBzdXBwX3JhdGVzX2xlbiwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZmFjZS5jIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKaW5kZXggNDlkNGY4Ni4uY2Q1ZmI0MCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lmYWNlLmMKKysrIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKQEAgLTM2Myw4ICszNjMsNyBAQAogCWludCBlcnI7CiAKIAkvKiBmYWlsIGVhcmx5IGlmIHVzZXIgc2V0IGFuIGludmFsaWQgYWRkcmVzcyAqLwotCWlmICghaXNfemVyb19ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpICYmCi0JICAgICFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKQorCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCiAJZXJyID0gaWVlZTgwMjExX2NoZWNrX2NvbmN1cnJlbnRfaWZhY2Uoc2RhdGEsIHNkYXRhLT52aWYudHlwZSk7CkBAIC0xMTMwLDggKzExMjksOCBAQAogCiAJQVNTRVJUX1JUTkwoKTsKIAotCW5kZXYgPSBhbGxvY19uZXRkZXZfbXEoc2l6ZW9mKCpzZGF0YSkgKyBsb2NhbC0+aHcudmlmX2RhdGFfc2l6ZSwKLQkJCSAgICAgICBuYW1lLCBpZWVlODAyMTFfaWZfc2V0dXAsIGxvY2FsLT5ody5xdWV1ZXMpOworCW5kZXYgPSBhbGxvY19uZXRkZXZfbXFzKHNpemVvZigqc2RhdGEpICsgbG9jYWwtPmh3LnZpZl9kYXRhX3NpemUsCisJCQkJbmFtZSwgaWVlZTgwMjExX2lmX3NldHVwLCBsb2NhbC0+aHcucXVldWVzLCAxKTsKIAlpZiAoIW5kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCWRldl9uZXRfc2V0KG5kZXYsIHdpcGh5X25ldChsb2NhbC0+aHcud2lwaHkpKTsKQEAgLTExNDUsNiArMTE0NCwxMCBAQAogCQkJCSsgSUVFRTgwMjExX0VOQ1JZUFRfSEVBRFJPT007CiAJbmRldi0+bmVlZGVkX3RhaWxyb29tID0gSUVFRTgwMjExX0VOQ1JZUFRfVEFJTFJPT007CiAKKwlyZXQgPSBkZXZfYWxsb2NfbmFtZShuZGV2LCBuZGV2LT5uYW1lKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCiAJaWVlZTgwMjExX2Fzc2lnbl9wZXJtX2FkZHIobG9jYWwsIG5kZXYsIHR5cGUpOwogCW1lbWNweShuZGV2LT5kZXZfYWRkciwgbmRldi0+cGVybV9hZGRyLCBFVEhfQUxFTik7CiAJU0VUX05FVERFVl9ERVYobmRldiwgd2lwaHlfZGV2KGxvY2FsLT5ody53aXBoeSkpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2tleS5jIGIvbmV0L21hYzgwMjExL2tleS5jCmluZGV4IDMxYWZkNzEyLi41MTUwYzZkIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEva2V5LmMKKysrIGIvbmV0L21hYzgwMjExL2tleS5jCkBAIC02MSw2ICs2MSwzNiBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgdm9pZCBpbmNyZW1lbnRfdGFpbHJvb21fbmVlZF9jb3VudChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKK3sKKwkvKgorCSAqIFdoZW4gdGhpcyBjb3VudCBpcyB6ZXJvLCBTS0IgcmVzaXppbmcgZm9yIGFsbG9jYXRpbmcgdGFpbHJvb20KKwkgKiBmb3IgSVYgb3IgTU1JQyBpcyBza2lwcGVkLiBCdXQsIHRoaXMgY2hlY2sgaGFzIGNyZWF0ZWQgdHdvIHJhY2UKKwkgKiBjYXNlcyBpbiB4bWl0IHBhdGggd2hpbGUgdHJhbnNpdGluZyBmcm9tIHplcm8gY291bnQgdG8gb25lOgorCSAqCisJICogMS4gU0tCIHJlc2l6ZSB3YXMgc2tpcHBlZCBiZWNhdXNlIG5vIGtleSB3YXMgYWRkZWQgYnV0IGp1c3QgYmVmb3JlCisJICogdGhlIHhtaXQga2V5IGlzIGFkZGVkIGFuZCBTVyBlbmNyeXB0aW9uIGtpY2tzIG9mZi4KKwkgKgorCSAqIDIuIFNLQiByZXNpemUgd2FzIHNraXBwZWQgYmVjYXVzZSBhbGwgdGhlIGtleXMgd2VyZSBodyBwbGFudGVkIGJ1dAorCSAqIGp1c3QgYmVmb3JlIHhtaXQgb25lIG9mIHRoZSBrZXkgaXMgZGVsZXRlZCBhbmQgU1cgZW5jcnlwdGlvbiBraWNrcworCSAqIG9mZi4KKwkgKgorCSAqIEluIGJvdGggdGhlIGFib3ZlIGNhc2UgU1cgZW5jcnlwdGlvbiB3aWxsIGZpbmQgbm90IGVub3VnaCBzcGFjZSBmb3IKKwkgKiB0YWlscm9vbSBhbmQgZXhpdHMgd2l0aCBXQVJOX09OLiAoU2VlIFdBUk5fT05zIGF0IHdwYS5jKQorCSAqCisJICogU29sdXRpb24gaGFzIGJlZW4gZXhwbGFpbmVkIGF0CisJICogaHR0cDovL21pZC5nbWFuZS5vcmcvMTMwODU5MDk4MC40MzIyLjE5LmNhbWVsQGpsdDMuc2lwc29sdXRpb25zLm5ldAorCSAqLworCisJaWYgKCFzZGF0YS0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQrKykgeworCQkvKgorCQkgKiBGbHVzaCBhbGwgWE1JVCBwYWNrZXRzIGN1cnJlbnRseSB1c2luZyBIVyBlbmNyeXB0aW9uIG9yIG5vCisJCSAqIGVuY3J5cHRpb24gYXQgYWxsIGlmIHRoZSBjb3VudCB0cmFuc2l0aW9uIGlzIGZyb20gMCAtPiAxLgorCQkgKi8KKwkJc3luY2hyb25pemVfbmV0KCk7CisJfQorfQorCiBzdGF0aWMgaW50IGllZWU4MDIxMV9rZXlfZW5hYmxlX2h3X2FjY2VsKHN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXkpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CkBAIC0xMDQsNyArMTM0LDcgQEAKIAogCQlpZiAoISgoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX01NSUMpIHx8CiAJCSAgICAgIChrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYpKSkKLQkJCWtleS0+bG9jYWwtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250LS07CisJCQlzZGF0YS0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQtLTsKIAogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNDcsNiArMTc3LDEwIEBACiAJc3RhID0gZ2V0X3N0YV9mb3Jfa2V5KGtleSk7CiAJc2RhdGEgPSBrZXktPnNkYXRhOwogCisJaWYgKCEoKGtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDKSB8fAorCSAgICAgIChrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYpKSkKKwkJaW5jcmVtZW50X3RhaWxyb29tX25lZWRfY291bnQoc2RhdGEpOworCiAJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKQogCQlzZGF0YSA9IGNvbnRhaW5lcl9vZihzZGF0YS0+YnNzLAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSwKQEAgLTE2MSwxMCArMTk1LDYgQEAKIAkJCSAga2V5LT5jb25mLmtleWlkeCwgc3RhID8gc3RhLT5hZGRyIDogYmNhc3RfYWRkciwgcmV0KTsKIAogCWtleS0+ZmxhZ3MgJj0gfktFWV9GTEFHX1VQTE9BREVEX1RPX0hBUkRXQVJFOwotCi0JaWYgKCEoKGtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDKSB8fAotCSAgICAgIChrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYpKSkKLQkJa2V5LT5sb2NhbC0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQrKzsKIH0KIAogdm9pZCBpZWVlODAyMTFfa2V5X3JlbW92ZWQoc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5X2NvbmYpCkBAIC0yNDgsNyArMjc4LDcgQEAKIAlib29sIGRlZnVuaWtleSwgZGVmbXVsdGlrZXksIGRlZm1nbXRrZXk7CiAKIAlpZiAobmV3KQotCQlsaXN0X2FkZCgmbmV3LT5saXN0LCAmc2RhdGEtPmtleV9saXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmbmV3LT5saXN0LCAmc2RhdGEtPmtleV9saXN0KTsKIAogCWlmIChzdGEgJiYgcGFpcndpc2UpIHsKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKHN0YS0+cHRrLCBuZXcpOwpAQCAtMzM5LDYgKzM2OSw3IEBACiAJCQkJCWdldF91bmFsaWduZWRfbGUxNihzZXEpOwogCQkJfQogCQl9CisJCXNwaW5fbG9ja19pbml0KCZrZXktPnUudGtpcC50eGxvY2spOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CiAJCWtleS0+Y29uZi5pdl9sZW4gPSBDQ01QX0hEUl9MRU47CkBAIC00MDUsNyArNDM2LDcgQEAKIAkJaWVlZTgwMjExX2Flc19jbWFjX2tleV9mcmVlKGtleS0+dS5hZXNfY21hYy50Zm0pOwogCWlmIChrZXktPmxvY2FsKSB7CiAJCWllZWU4MDIxMV9kZWJ1Z2ZzX2tleV9yZW1vdmUoa2V5KTsKLQkJa2V5LT5sb2NhbC0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQtLTsKKwkJa2V5LT5zZGF0YS0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQtLTsKIAl9CiAKIAlrZnJlZShrZXkpOwpAQCAtNDYzLDEzICs0OTQsMTMgQEAKIAllbHNlCiAJCW9sZF9rZXkgPSBrZXlfbXR4X2RlcmVmZXJlbmNlKHNkYXRhLT5sb2NhbCwgc2RhdGEtPmtleXNbaWR4XSk7CiAKKwlpbmNyZW1lbnRfdGFpbHJvb21fbmVlZF9jb3VudChzZGF0YSk7CisKIAlfX2llZWU4MDIxMV9rZXlfcmVwbGFjZShzZGF0YSwgc3RhLCBwYWlyd2lzZSwgb2xkX2tleSwga2V5KTsKIAlfX2llZWU4MDIxMV9rZXlfZGVzdHJveShvbGRfa2V5KTsKIAogCWllZWU4MDIxMV9kZWJ1Z2ZzX2tleV9hZGQoa2V5KTsKIAotCWtleS0+bG9jYWwtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250Kys7Ci0KIAlyZXQgPSBpZWVlODAyMTFfa2V5X2VuYWJsZV9od19hY2NlbChrZXkpOwogCiAJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+bG9jYWwtPmtleV9tdHgpOwpAQCAtNTExLDE2ICs1NDIsNDkgQEAKIAogCW11dGV4X2xvY2soJnNkYXRhLT5sb2NhbC0+a2V5X210eCk7CiAKLQlzZGF0YS0+bG9jYWwtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250ID0gMDsKKwlzZGF0YS0+Y3J5cHRvX3R4X3RhaWxyb29tX25lZWRlZF9jbnQgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShrZXksICZzZGF0YS0+a2V5X2xpc3QsIGxpc3QpIHsKLQkJc2RhdGEtPmxvY2FsLT5jcnlwdG9fdHhfdGFpbHJvb21fbmVlZGVkX2NudCsrOworCQlpbmNyZW1lbnRfdGFpbHJvb21fbmVlZF9jb3VudChzZGF0YSk7CiAJCWllZWU4MDIxMV9rZXlfZW5hYmxlX2h3X2FjY2VsKGtleSk7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+bG9jYWwtPmtleV9tdHgpOwogfQogCit2b2lkIGllZWU4MDIxMV9pdGVyX2tleXMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSB2b2lkICgqaXRlcikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwKKwkJCQkgICAgICB2b2lkICpkYXRhKSwKKwkJCSB2b2lkICppdGVyX2RhdGEpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CisJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKKworCUFTU0VSVF9SVE5MKCk7CisKKwltdXRleF9sb2NrKCZsb2NhbC0+a2V5X210eCk7CisJaWYgKHZpZikgeworCQlzZGF0YSA9IHZpZl90b19zZGF0YSh2aWYpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGtleSwgJnNkYXRhLT5rZXlfbGlzdCwgbGlzdCkKKwkJCWl0ZXIoaHcsICZzZGF0YS0+dmlmLAorCQkJICAgICBrZXktPnN0YSA/ICZrZXktPnN0YS0+c3RhIDogTlVMTCwKKwkJCSAgICAgJmtleS0+Y29uZiwgaXRlcl9kYXRhKTsKKwl9IGVsc2UgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGtleSwgJnNkYXRhLT5rZXlfbGlzdCwgbGlzdCkKKwkJCQlpdGVyKGh3LCAmc2RhdGEtPnZpZiwKKwkJCQkgICAgIGtleS0+c3RhID8gJmtleS0+c3RhLT5zdGEgOiBOVUxMLAorCQkJCSAgICAgJmtleS0+Y29uZiwgaXRlcl9kYXRhKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+a2V5X210eCk7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9pdGVyX2tleXMpOworCiB2b2lkIGllZWU4MDIxMV9kaXNhYmxlX2tleXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleTsKQEAgLTU1MCwzICs2MTQsODkgQEAKIAogCW11dGV4X3VubG9jaygmc2RhdGEtPmxvY2FsLT5rZXlfbXR4KTsKIH0KKworCit2b2lkIGllZWU4MDIxMV9ndGtfcmVrZXlfbm90aWZ5KHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIGNvbnN0IHU4ICpic3NpZCwKKwkJCQljb25zdCB1OCAqcmVwbGF5X2N0ciwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CisKKwl0cmFjZV9hcGlfZ3RrX3Jla2V5X25vdGlmeShzZGF0YSwgYnNzaWQsIHJlcGxheV9jdHIpOworCisJY2ZnODAyMTFfZ3RrX3Jla2V5X25vdGlmeShzZGF0YS0+ZGV2LCBic3NpZCwgcmVwbGF5X2N0ciwgZ2ZwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMV9ndGtfcmVrZXlfbm90aWZ5KTsKKwordm9pZCBpZWVlODAyMTFfZ2V0X2tleV90eF9zZXEoc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X3NlcSAqc2VxKQoreworCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXk7CisJdTY0IHBuNjQ7CisKKwlpZiAoV0FSTl9PTighKGtleWNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWKSkpCisJCXJldHVybjsKKworCWtleSA9IGNvbnRhaW5lcl9vZihrZXljb25mLCBzdHJ1Y3QgaWVlZTgwMjExX2tleSwgY29uZik7CisKKwlzd2l0Y2ggKGtleS0+Y29uZi5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCXNlcS0+dGtpcC5pdjMyID0ga2V5LT51LnRraXAudHguaXYzMjsKKwkJc2VxLT50a2lwLml2MTYgPSBrZXktPnUudGtpcC50eC5pdjE2OworCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCXBuNjQgPSBhdG9taWM2NF9yZWFkKCZrZXktPnUuY2NtcC50eF9wbik7CisJCXNlcS0+Y2NtcC5wbls1XSA9IHBuNjQ7CisJCXNlcS0+Y2NtcC5wbls0XSA9IHBuNjQgPj4gODsKKwkJc2VxLT5jY21wLnBuWzNdID0gcG42NCA+PiAxNjsKKwkJc2VxLT5jY21wLnBuWzJdID0gcG42NCA+PiAyNDsKKwkJc2VxLT5jY21wLnBuWzFdID0gcG42NCA+PiAzMjsKKwkJc2VxLT5jY21wLnBuWzBdID0gcG42NCA+PiA0MDsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzoKKwkJcG42NCA9IGF0b21pYzY0X3JlYWQoJmtleS0+dS5hZXNfY21hYy50eF9wbik7CisJCXNlcS0+Y2NtcC5wbls1XSA9IHBuNjQ7CisJCXNlcS0+Y2NtcC5wbls0XSA9IHBuNjQgPj4gODsKKwkJc2VxLT5jY21wLnBuWzNdID0gcG42NCA+PiAxNjsKKwkJc2VxLT5jY21wLnBuWzJdID0gcG42NCA+PiAyNDsKKwkJc2VxLT5jY21wLnBuWzFdID0gcG42NCA+PiAzMjsKKwkJc2VxLT5jY21wLnBuWzBdID0gcG42NCA+PiA0MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9nZXRfa2V5X3R4X3NlcSk7CisKK3ZvaWQgaWVlZTgwMjExX2dldF9rZXlfcnhfc2VxKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCQkgICAgICBpbnQgdGlkLCBzdHJ1Y3QgaWVlZTgwMjExX2tleV9zZXEgKnNlcSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5OworCWNvbnN0IHU4ICpwbjsKKworCWtleSA9IGNvbnRhaW5lcl9vZihrZXljb25mLCBzdHJ1Y3QgaWVlZTgwMjExX2tleSwgY29uZik7CisKKwlzd2l0Y2ggKGtleS0+Y29uZi5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCWlmIChXQVJOX09OKHRpZCA8IDAgfHwgdGlkID49IE5VTV9SWF9EQVRBX1FVRVVFUykpCisJCQlyZXR1cm47CisJCXNlcS0+dGtpcC5pdjMyID0ga2V5LT51LnRraXAucnhbdGlkXS5pdjMyOworCQlzZXEtPnRraXAuaXYxNiA9IGtleS0+dS50a2lwLnJ4W3RpZF0uaXYxNjsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgorCQlpZiAoV0FSTl9PTih0aWQgPCAtMSB8fCB0aWQgPj0gTlVNX1JYX0RBVEFfUVVFVUVTKSkKKwkJCXJldHVybjsKKwkJaWYgKHRpZCA8IDApCisJCQlwbiA9IGtleS0+dS5jY21wLnJ4X3BuW05VTV9SWF9EQVRBX1FVRVVFU107CisJCWVsc2UKKwkJCXBuID0ga2V5LT51LmNjbXAucnhfcG5bdGlkXTsKKwkJbWVtY3B5KHNlcS0+Y2NtcC5wbiwgcG4sIENDTVBfUE5fTEVOKTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzoKKwkJaWYgKFdBUk5fT04odGlkICE9IDApKQorCQkJcmV0dXJuOworCQlwbiA9IGtleS0+dS5hZXNfY21hYy5yeF9wbjsKKwkJbWVtY3B5KHNlcS0+YWVzX2NtYWMucG4sIHBuLCBDTUFDX1BOX0xFTik7CisJCWJyZWFrOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2dldF9rZXlfcnhfc2VxKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9rZXkuaCBiL25ldC9tYWM4MDIxMS9rZXkuaAppbmRleCBkODAxZDUzLi43ZDRlMzFmIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEva2V5LmgKKysrIGIvbmV0L21hYzgwMjExL2tleS5oCkBAIC0yOCw4ICsyOCw5IEBACiAjZGVmaW5lIENDTVBfUE5fTEVOCQk2CiAjZGVmaW5lIFRLSVBfSVZfTEVOCQk4CiAjZGVmaW5lIFRLSVBfSUNWX0xFTgkJNAorI2RlZmluZSBDTUFDX1BOX0xFTgkJNgogCi0jZGVmaW5lIE5VTV9SWF9EQVRBX1FVRVVFUwkxNworI2RlZmluZSBOVU1fUlhfREFUQV9RVUVVRVMJMTYKIAogc3RydWN0IGllZWU4MDIxMV9sb2NhbDsKIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGE7CkBAIC00MCw5ICs0MSwxMSBAQAogICoKICAqIEBLRVlfRkxBR19VUExPQURFRF9UT19IQVJEV0FSRTogSW5kaWNhdGVzIHRoYXQgdGhpcyBrZXkgaXMgcHJlc2VudAogICoJaW4gdGhlIGhhcmR3YXJlIGZvciBUWCBjcnlwdG8gaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgorICogQEtFWV9GTEFHX1RBSU5URUQ6IEtleSBpcyB0YWludGVkIGFuZCBwYWNrZXRzIHNob3VsZCBiZSBkcm9wcGVkLgogICovCiBlbnVtIGllZWU4MDIxMV9pbnRlcm5hbF9rZXlfZmxhZ3MgewogCUtFWV9GTEFHX1VQTE9BREVEX1RPX0hBUkRXQVJFCT0gQklUKDApLAorCUtFWV9GTEFHX1RBSU5URUQJCT0gQklUKDEpLAogfTsKIAogZW51bSBpZWVlODAyMTFfaW50ZXJuYWxfdGtpcF9zdGF0ZSB7CkBAIC01Miw5ICs1NSwxMCBAQAogfTsKIAogc3RydWN0IHRraXBfY3R4IHsKLQl1MzIgaXYzMjsKLQl1MTYgaXYxNjsKLQl1MTYgcDFrWzVdOworCXUzMiBpdjMyOwkvKiBjdXJyZW50IGl2MzIgKi8KKwl1MTYgaXYxNjsJLyogY3VycmVudCBpdjE2ICovCisJdTE2IHAxa1s1XTsJLyogcDFrIGNhY2hlICovCisJdTMyIHAxa19pdjMyOwkvKiBpdjMyIGZvciB3aGljaCBwMWsgY29tcHV0ZWQgKi8KIAllbnVtIGllZWU4MDIxMV9pbnRlcm5hbF90a2lwX3N0YXRlIHN0YXRlOwogfTsKIApAQCAtNzEsNiArNzUsOSBAQAogCiAJdW5pb24gewogCQlzdHJ1Y3QgeworCQkJLyogcHJvdGVjdHMgdHggY29udGV4dCAqLworCQkJc3BpbmxvY2tfdCB0eGxvY2s7CisKIAkJCS8qIGxhc3QgdXNlZCBUU0MgKi8KIAkJCXN0cnVjdCB0a2lwX2N0eCB0eDsKIApAQCAtNzgsMzIgKzg1LDIzIEBACiAJCQlzdHJ1Y3QgdGtpcF9jdHggcnhbTlVNX1JYX0RBVEFfUVVFVUVTXTsKIAkJfSB0a2lwOwogCQlzdHJ1Y3QgewotCQkJdTggdHhfcG5bNl07CisJCQlhdG9taWM2NF90IHR4X3BuOwogCQkJLyoKIAkJCSAqIExhc3QgcmVjZWl2ZWQgcGFja2V0IG51bWJlci4gVGhlIGZpcnN0CiAJCQkgKiBOVU1fUlhfREFUQV9RVUVVRVMgY291bnRlcnMgYXJlIHVzZWQgd2l0aCBEYXRhCiAJCQkgKiBmcmFtZXMgYW5kIHRoZSBsYXN0IGNvdW50ZXIgaXMgdXNlZCB3aXRoIFJvYnVzdAogCQkJICogTWFuYWdlbWVudCBmcmFtZXMuCiAJCQkgKi8KLQkJCXU4IHJ4X3BuW05VTV9SWF9EQVRBX1FVRVVFUyArIDFdWzZdOworCQkJdTggcnhfcG5bTlVNX1JYX0RBVEFfUVVFVUVTICsgMV1bQ0NNUF9QTl9MRU5dOwogCQkJc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbTsKIAkJCXUzMiByZXBsYXlzOyAvKiBkb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzICovCi0JCQkvKiBzY3JhdGNoIGJ1ZmZlcnMgZm9yIHZpcnRfdG9fcGFnZSgpIChjcnlwdG8gQVBJKSAqLwotI2lmbmRlZiBBRVNfQkxPQ0tfTEVOCi0jZGVmaW5lIEFFU19CTE9DS19MRU4gMTYKLSNlbmRpZgotCQkJdTggdHhfY3J5cHRvX2J1Zls2ICogQUVTX0JMT0NLX0xFTl07Ci0JCQl1OCByeF9jcnlwdG9fYnVmWzYgKiBBRVNfQkxPQ0tfTEVOXTsKIAkJfSBjY21wOwogCQlzdHJ1Y3QgewotCQkJdTggdHhfcG5bNl07Ci0JCQl1OCByeF9wbls2XTsKKwkJCWF0b21pYzY0X3QgdHhfcG47CisJCQl1OCByeF9wbltDTUFDX1BOX0xFTl07CiAJCQlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtOwogCQkJdTMyIHJlcGxheXM7IC8qIGRvdDExUlNOQVN0YXRzQ01BQ1JlcGxheXMgKi8KIAkJCXUzMiBpY3ZlcnJvcnM7IC8qIGRvdDExUlNOQVN0YXRzQ01BQ0lDVkVycm9ycyAqLwotCQkJLyogc2NyYXRjaCBidWZmZXJzIGZvciB2aXJ0X3RvX3BhZ2UoKSAoY3J5cHRvIEFQSSkgKi8KLQkJCXU4IHR4X2NyeXB0b19idWZbMiAqIEFFU19CTE9DS19MRU5dOwotCQkJdTggcnhfY3J5cHRvX2J1ZlsyICogQUVTX0JMT0NLX0xFTl07CiAJCX0gYWVzX2NtYWM7CiAJfSB1OwogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMgYi9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKaW5kZXggMmIxODA1My4uMzQ2MDEwOCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYwpAQCAtNTcsMjkgKzU3LDI5IEBACiAjZGVmaW5lIFBSRVFfSUVfVFRMKHgpCQkoKih4ICsgMikpCiAjZGVmaW5lIFBSRVFfSUVfUFJFUV9JRCh4KQl1MzJfZmllbGRfZ2V0KHgsIDMsIDApCiAjZGVmaW5lIFBSRVFfSUVfT1JJR19BRERSKHgpCSh4ICsgNykKLSNkZWZpbmUgUFJFUV9JRV9PUklHX1NOKHgpCXUzMl9maWVsZF9nZXQoeCwgMTMsIDApOwotI2RlZmluZSBQUkVRX0lFX0xJRkVUSU1FKHgpCXUzMl9maWVsZF9nZXQoeCwgMTcsIEFFX0ZfU0VUKHgpKTsKLSNkZWZpbmUgUFJFUV9JRV9NRVRSSUMoeCkgCXUzMl9maWVsZF9nZXQoeCwgMjEsIEFFX0ZfU0VUKHgpKTsKKyNkZWZpbmUgUFJFUV9JRV9PUklHX1NOKHgpCXUzMl9maWVsZF9nZXQoeCwgMTMsIDApCisjZGVmaW5lIFBSRVFfSUVfTElGRVRJTUUoeCkJdTMyX2ZpZWxkX2dldCh4LCAxNywgQUVfRl9TRVQoeCkpCisjZGVmaW5lIFBSRVFfSUVfTUVUUklDKHgpIAl1MzJfZmllbGRfZ2V0KHgsIDIxLCBBRV9GX1NFVCh4KSkKICNkZWZpbmUgUFJFUV9JRV9UQVJHRVRfRih4KQkoKihBRV9GX1NFVCh4KSA/IHggKyAzMiA6IHggKyAyNikpCiAjZGVmaW5lIFBSRVFfSUVfVEFSR0VUX0FERFIoeCkgCShBRV9GX1NFVCh4KSA/IHggKyAzMyA6IHggKyAyNykKLSNkZWZpbmUgUFJFUV9JRV9UQVJHRVRfU04oeCkgCXUzMl9maWVsZF9nZXQoeCwgMzMsIEFFX0ZfU0VUKHgpKTsKKyNkZWZpbmUgUFJFUV9JRV9UQVJHRVRfU04oeCkgCXUzMl9maWVsZF9nZXQoeCwgMzMsIEFFX0ZfU0VUKHgpKQogCiAKICNkZWZpbmUgUFJFUF9JRV9GTEFHUyh4KQlQUkVRX0lFX0ZMQUdTKHgpCiAjZGVmaW5lIFBSRVBfSUVfSE9QQ09VTlQoeCkJUFJFUV9JRV9IT1BDT1VOVCh4KQogI2RlZmluZSBQUkVQX0lFX1RUTCh4KQkJUFJFUV9JRV9UVEwoeCkKICNkZWZpbmUgUFJFUF9JRV9PUklHX0FERFIoeCkJKHggKyAzKQotI2RlZmluZSBQUkVQX0lFX09SSUdfU04oeCkJdTMyX2ZpZWxkX2dldCh4LCA5LCAwKTsKLSNkZWZpbmUgUFJFUF9JRV9MSUZFVElNRSh4KQl1MzJfZmllbGRfZ2V0KHgsIDEzLCBBRV9GX1NFVCh4KSk7Ci0jZGVmaW5lIFBSRVBfSUVfTUVUUklDKHgpCXUzMl9maWVsZF9nZXQoeCwgMTcsIEFFX0ZfU0VUKHgpKTsKKyNkZWZpbmUgUFJFUF9JRV9PUklHX1NOKHgpCXUzMl9maWVsZF9nZXQoeCwgOSwgMCkKKyNkZWZpbmUgUFJFUF9JRV9MSUZFVElNRSh4KQl1MzJfZmllbGRfZ2V0KHgsIDEzLCBBRV9GX1NFVCh4KSkKKyNkZWZpbmUgUFJFUF9JRV9NRVRSSUMoeCkJdTMyX2ZpZWxkX2dldCh4LCAxNywgQUVfRl9TRVQoeCkpCiAjZGVmaW5lIFBSRVBfSUVfVEFSR0VUX0FERFIoeCkJKEFFX0ZfU0VUKHgpID8geCArIDI3IDogeCArIDIxKQotI2RlZmluZSBQUkVQX0lFX1RBUkdFVF9TTih4KQl1MzJfZmllbGRfZ2V0KHgsIDI3LCBBRV9GX1NFVCh4KSk7CisjZGVmaW5lIFBSRVBfSUVfVEFSR0VUX1NOKHgpCXUzMl9maWVsZF9nZXQoeCwgMjcsIEFFX0ZfU0VUKHgpKQogCiAjZGVmaW5lIFBFUlJfSUVfVFRMKHgpCQkoKih4KSkKICNkZWZpbmUgUEVSUl9JRV9UQVJHRVRfRkxBR1MoeCkJKCooeCArIDIpKQogI2RlZmluZSBQRVJSX0lFX1RBUkdFVF9BRERSKHgpCSh4ICsgMykKLSNkZWZpbmUgUEVSUl9JRV9UQVJHRVRfU04oeCkJdTMyX2ZpZWxkX2dldCh4LCA5LCAwKTsKLSNkZWZpbmUgUEVSUl9JRV9UQVJHRVRfUkNPREUoeCkJdTE2X2ZpZWxkX2dldCh4LCAxMywgMCk7CisjZGVmaW5lIFBFUlJfSUVfVEFSR0VUX1NOKHgpCXUzMl9maWVsZF9nZXQoeCwgOSwgMCkKKyNkZWZpbmUgUEVSUl9JRV9UQVJHRVRfUkNPREUoeCkJdTE2X2ZpZWxkX2dldCh4LCAxMywgMCkKIAogI2RlZmluZSBNU0VDX1RPX1RVKHgpICh4KjEwMDAvMTAyNCkKICNkZWZpbmUgU05fR1QoeCwgeSkgKChsb25nKSAoeSkgLSAobG9uZykgKHgpIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYyBiL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYwppbmRleCAwZDJmYWFjLi4wNjhlZTY1IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jCkBAIC02NDcsMTIgKzY0NywxMiBAQAogCQltcGF0aCA9IG5vZGUtPm1wYXRoOwogCQlpZiAobXBhdGgtPnNkYXRhID09IHNkYXRhICYmCiAJCSAgICBtZW1jbXAoYWRkciwgbXBhdGgtPmRzdCwgRVRIX0FMRU4pID09IDApIHsKLQkJCXNwaW5fbG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOworCQkJc3Bpbl9sb2NrKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJCQltcGF0aC0+ZmxhZ3MgfD0gTUVTSF9QQVRIX1JFU09MVklORzsKIAkJCWhsaXN0X2RlbF9yY3UoJm5vZGUtPmxpc3QpOwogCQkJY2FsbF9yY3UoJm5vZGUtPnJjdSwgbWVzaF9wYXRoX25vZGVfcmVjbGFpbSk7CiAJCQlhdG9taWNfZGVjKCZ0YmwtPmVudHJpZXMpOwotCQkJc3Bpbl91bmxvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJCQlnb3RvIGVuZGRlbDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tbG1lLmMgYi9uZXQvbWFjODAyMTEvbWxtZS5jCmluZGV4IDQ1NmNjY2YuLmQ2NDcwYzcgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tbG1lLmMKKysrIGIvbmV0L21hYzgwMjExL21sbWUuYwpAQCAtMjMyLDkgKzIzMiw2IEBACiAJCVdBUk5fT04oIWllZWU4MDIxMV9zZXRfY2hhbm5lbF90eXBlKGxvY2FsLCBzZGF0YSwgY2hhbm5lbF90eXBlKSk7CiAJfQogCi0JaWVlZTgwMjExX3N0b3BfcXVldWVzX2J5X3JlYXNvbigmc2RhdGEtPmxvY2FsLT5odywKLQkJCQkJSUVFRTgwMjExX1FVRVVFX1NUT1BfUkVBU09OX0NTQSk7Ci0KIAkvKiBjaGFubmVsX3R5cGUgY2hhbmdlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgKi8KIAlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCAwKTsKIApAQCAtMjQ4LDkgKzI0NSw2IEBACiAJCXJjdV9yZWFkX3VubG9jaygpOwogCX0KIAotCWllZWU4MDIxMV93YWtlX3F1ZXVlc19ieV9yZWFzb24oJnNkYXRhLT5sb2NhbC0+aHcsCi0JCQkJCUlFRUU4MDIxMV9RVUVVRV9TVE9QX1JFQVNPTl9DU0EpOwotCiAJaHRfb3Btb2RlID0gbGUxNl90b19jcHUoaHRpLT5vcGVyYXRpb25fbW9kZSk7CiAKIAkvKiBpZiBic3MgY29uZmlndXJhdGlvbiBjaGFuZ2VkIHN0b3JlIHRoZSBuZXcgb25lICovCkBAIC03NTUsNyArNzQ5LDcgQEAKIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwsCiAJCQkgICAgIGR5bmFtaWNfcHNfZW5hYmxlX3dvcmspOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gbG9jYWwtPnBzX3NkYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2QgPSAmc2RhdGEtPnUubWdkOworCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcTsKIApAQCAtNzYzLDI2ICs3NTcsMzkgQEAKIAlpZiAoIXNkYXRhKQogCQlyZXR1cm47CiAKKwlpZm1nZCA9ICZzZGF0YS0+dS5tZ2Q7CisKIAlpZiAobG9jYWwtPmh3LmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9QUykKIAkJcmV0dXJuOwogCi0JLyoKLQkgKiB0cmFuc21pc3Npb24gY2FuIGJlIHN0b3BwZWQgYnkgb3RoZXJzIHdoaWNoIGxlYWRzIHRvCi0JICogZHluYW1pY19wc190aW1lciBleHBpcnkuIFBvc3Rwb25kIHRoZSBwcyB0aW1lciBpZiBpdAotCSAqIGlzIG5vdCB0aGUgYWN0dWFsIGlkbGUgc3RhdGUuCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbl9sb2NrLCBmbGFncyk7Ci0JZm9yIChxID0gMDsgcSA8IGxvY2FsLT5ody5xdWV1ZXM7IHErKykgewotCQlpZiAobG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uc1txXSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uX2xvY2ssCi0JCQkJCSAgICAgICBmbGFncyk7CisJaWYgKCFsb2NhbC0+ZGlzYWJsZV9keW5hbWljX3BzICYmCisJICAgIGxvY2FsLT5ody5jb25mLmR5bmFtaWNfcHNfdGltZW91dCA+IDApIHsKKwkJLyogZG9uJ3QgZW50ZXIgUFMgaWYgVFggZnJhbWVzIGFyZSBwZW5kaW5nICovCisJCWlmIChkcnZfdHhfZnJhbWVzX3BlbmRpbmcobG9jYWwpKSB7CiAJCQltb2RfdGltZXIoJmxvY2FsLT5keW5hbWljX3BzX3RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoCiAJCQkJICBsb2NhbC0+aHcuY29uZi5keW5hbWljX3BzX3RpbWVvdXQpKTsKIAkJCXJldHVybjsKIAkJfQorCisJCS8qCisJCSAqIHRyYW5zbWlzc2lvbiBjYW4gYmUgc3RvcHBlZCBieSBvdGhlcnMgd2hpY2ggbGVhZHMgdG8KKwkJICogZHluYW1pY19wc190aW1lciBleHBpcnkuIFBvc3Rwb25lIHRoZSBwcyB0aW1lciBpZiBpdAorCQkgKiBpcyBub3QgdGhlIGFjdHVhbCBpZGxlIHN0YXRlLgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbl9sb2NrLCBmbGFncyk7CisJCWZvciAocSA9IDA7IHEgPCBsb2NhbC0+aHcucXVldWVzOyBxKyspIHsKKwkJCWlmIChsb2NhbC0+cXVldWVfc3RvcF9yZWFzb25zW3FdKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uX2xvY2ssCisJCQkJCQkgICAgICAgZmxhZ3MpOworCQkJCW1vZF90aW1lcigmbG9jYWwtPmR5bmFtaWNfcHNfdGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoCisJCQkJCSAgbG9jYWwtPmh3LmNvbmYuZHluYW1pY19wc190aW1lb3V0KSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbl9sb2NrLCBmbGFncyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbl9sb2NrLCBmbGFncyk7CiAKIAlpZiAoKGxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV19QU19OVUxMRlVOQ19TVEFDSykgJiYKIAkgICAgKCEoaWZtZ2QtPmZsYWdzICYgSUVFRTgwMjExX1NUQV9OVUxMRlVOQ19BQ0tFRCkpKSB7CkBAIC04MDcsNyArODE0LDggQEAKIAkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BTKTsKIAl9CiAKLQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMoc2RhdGEtPmRldik7CisJaWYgKGxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV19QU19OVUxMRlVOQ19TVEFDSykKKwkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKHNkYXRhLT5kZXYpOwogfQogCiB2b2lkIGllZWU4MDIxMV9keW5hbWljX3BzX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKQEAgLTkwOSw2ICs5MTcsNyBAQAogCQkJICAgIHBhcmFtcy5haWZzLCBwYXJhbXMuY3dfbWluLCBwYXJhbXMuY3dfbWF4LAogCQkJICAgIHBhcmFtcy50eG9wLCBwYXJhbXMudWFwc2QpOwogI2VuZGlmCisJCWxvY2FsLT50eF9jb25mW3F1ZXVlXSA9IHBhcmFtczsKIAkJaWYgKGRydl9jb25mX3R4KGxvY2FsLCBxdWV1ZSwgJnBhcmFtcykpCiAJCQl3aXBoeV9kZWJ1Zyhsb2NhbC0+aHcud2lwaHksCiAJCQkJICAgICJmYWlsZWQgdG8gc2V0IFRYIHF1ZXVlIHBhcmFtZXRlcnMgZm9yIHF1ZXVlICVkXG4iLApAQCAtMTIxMCw3ICsxMjE5LDggQEAKIAkJaWVlZTgwMjExX3NlbmRfbnVsbGZ1bmMoc2RhdGEtPmxvY2FsLCBzZGF0YSwgMCk7CiAJfSBlbHNlIHsKIAkJc3NpZCA9IGllZWU4MDIxMV9ic3NfZ2V0X2llKGlmbWdkLT5hc3NvY2lhdGVkLCBXTEFOX0VJRF9TU0lEKTsKLQkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxKHNkYXRhLCBkc3QsIHNzaWQgKyAyLCBzc2lkWzFdLCBOVUxMLCAwKTsKKwkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxKHNkYXRhLCBkc3QsIHNzaWQgKyAyLCBzc2lkWzFdLCBOVUxMLCAwLAorCQkJCQkgKHUzMikgLTEsIHRydWUpOwogCX0KIAogCWlmbWdkLT5wcm9iZV9zZW5kX2NvdW50Kys7CkBAIC0xMjk1LDcgKzEzMDUsOCBAQAogCiAJc3NpZCA9IGllZWU4MDIxMV9ic3NfZ2V0X2llKGlmbWdkLT5hc3NvY2lhdGVkLCBXTEFOX0VJRF9TU0lEKTsKIAlza2IgPSBpZWVlODAyMTFfYnVpbGRfcHJvYmVfcmVxKHNkYXRhLCBpZm1nZC0+YXNzb2NpYXRlZC0+YnNzaWQsCi0JCQkJCXNzaWQgKyAyLCBzc2lkWzFdLCBOVUxMLCAwKTsKKwkJCQkJKHUzMikgLTEsIHNzaWQgKyAyLCBzc2lkWzFdLAorCQkJCQlOVUxMLCAwLCB0cnVlKTsKIAogCXJldHVybiBza2I7CiB9CkBAIC0xNzU0LDYgKzE3NjUsNyBAQAogCQlpZm1nZC0+YXZlX2JlYWNvbl9zaWduYWwgPSByeF9zdGF0dXMtPnNpZ25hbCAqIDE2OwogCQlpZm1nZC0+bGFzdF9jcW1fZXZlbnRfc2lnbmFsID0gMDsKIAkJaWZtZ2QtPmNvdW50X2JlYWNvbl9zaWduYWwgPSAxOworCQlpZm1nZC0+bGFzdF9hdmVfYmVhY29uX3NpZ25hbCA9IDA7CiAJfSBlbHNlIHsKIAkJaWZtZ2QtPmF2ZV9iZWFjb25fc2lnbmFsID0KIAkJCShJRUVFODAyMTFfU0lHTkFMX0FWRV9XRUlHSFQgKiByeF9zdGF0dXMtPnNpZ25hbCAqIDE2ICsKQEAgLTE3NjEsNiArMTc3MywyOCBAQAogCQkJIGlmbWdkLT5hdmVfYmVhY29uX3NpZ25hbCkgLyAxNjsKIAkJaWZtZ2QtPmNvdW50X2JlYWNvbl9zaWduYWwrKzsKIAl9CisKKwlpZiAoaWZtZ2QtPnJzc2lfbWluX3Rob2xkICE9IGlmbWdkLT5yc3NpX21heF90aG9sZCAmJgorCSAgICBpZm1nZC0+Y291bnRfYmVhY29uX3NpZ25hbCA+PSBJRUVFODAyMTFfU0lHTkFMX0FWRV9NSU5fQ09VTlQpIHsKKwkJaW50IHNpZyA9IGlmbWdkLT5hdmVfYmVhY29uX3NpZ25hbDsKKwkJaW50IGxhc3Rfc2lnID0gaWZtZ2QtPmxhc3RfYXZlX2JlYWNvbl9zaWduYWw7CisKKwkJLyoKKwkJICogaWYgc2lnbmFsIGNyb3NzZXMgZWl0aGVyIG9mIHRoZSBib3VuZGFyaWVzLCBpbnZva2UgY2FsbGJhY2sKKwkJICogd2l0aCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzCisJCSAqLworCQlpZiAoc2lnID4gaWZtZ2QtPnJzc2lfbWF4X3Rob2xkICYmCisJCSAgICAobGFzdF9zaWcgPD0gaWZtZ2QtPnJzc2lfbWluX3Rob2xkIHx8IGxhc3Rfc2lnID09IDApKSB7CisJCQlpZm1nZC0+bGFzdF9hdmVfYmVhY29uX3NpZ25hbCA9IHNpZzsKKwkJCWRydl9yc3NpX2NhbGxiYWNrKGxvY2FsLCBSU1NJX0VWRU5UX0hJR0gpOworCQl9IGVsc2UgaWYgKHNpZyA8IGlmbWdkLT5yc3NpX21pbl90aG9sZCAmJgorCQkJICAgKGxhc3Rfc2lnID49IGlmbWdkLT5yc3NpX21heF90aG9sZCB8fAorCQkJICAgbGFzdF9zaWcgPT0gMCkpIHsKKwkJCWlmbWdkLT5sYXN0X2F2ZV9iZWFjb25fc2lnbmFsID0gc2lnOworCQkJZHJ2X3Jzc2lfY2FsbGJhY2sobG9jYWwsIFJTU0lfRVZFTlRfTE9XKTsKKwkJfQorCX0KKwogCWlmIChic3NfY29uZi0+Y3FtX3Jzc2lfdGhvbGQgJiYKIAkgICAgaWZtZ2QtPmNvdW50X2JlYWNvbl9zaWduYWwgPj0gSUVFRTgwMjExX1NJR05BTF9BVkVfTUlOX0NPVU5UICYmCiAJICAgICEobG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX1NVUFBPUlRTX0NRTV9SU1NJKSkgewpAQCAtMjAyMCw3ICsyMDU0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV9jb25uZWN0aW9uX2xvc3Qoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkJCSAgdTggKmJzc2lkKQorCQkJCQkgIHU4ICpic3NpZCwgdTggcmVhc29uKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2QgPSAmc2RhdGEtPnUubWdkOwpAQCAtMjAzOCw4ICsyMDcyLDcgQEAKIAkgKiBidXQgdGhhdCdzIG5vdCBhIHByb2JsZW0uCiAJICovCiAJaWVlZTgwMjExX3NlbmRfZGVhdXRoX2Rpc2Fzc29jKHNkYXRhLCBic3NpZCwKLQkJCUlFRUU4MDIxMV9TVFlQRV9ERUFVVEgsCi0JCQlXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSwKKwkJCUlFRUU4MDIxMV9TVFlQRV9ERUFVVEgsIHJlYXNvbiwKIAkJCU5VTEwsIHRydWUpOwogCW11dGV4X2xvY2soJmlmbWdkLT5tdHgpOwogfQpAQCAtMjA4NSw3ICsyMTE4LDggQEAKIAkJCQkJICAgICIgQVAgJXBNLCBkaXNjb25uZWN0aW5nLlxuIiwKIAkJCQkJICAgIHNkYXRhLT5uYW1lLCBic3NpZCk7CiAjZW5kaWYKLQkJCQlpZWVlODAyMTFfc3RhX2Nvbm5lY3Rpb25fbG9zdChzZGF0YSwgYnNzaWQpOworCQkJCWllZWU4MDIxMV9zdGFfY29ubmVjdGlvbl9sb3N0KHNkYXRhLCBic3NpZCwKKwkJCQkJV0xBTl9SRUFTT05fRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFkpOwogCQkJfQogCQl9IGVsc2UgaWYgKHRpbWVfaXNfYWZ0ZXJfamlmZmllcyhpZm1nZC0+cHJvYmVfdGltZW91dCkpCiAJCQlydW5fYWdhaW4oaWZtZ2QsIGlmbWdkLT5wcm9iZV90aW1lb3V0KTsKQEAgLTIwOTcsNyArMjEzMSw4IEBACiAJCQkJICAgIHNkYXRhLT5uYW1lLAogCQkJCSAgICBic3NpZCwgcHJvYmVfd2FpdF9tcyk7CiAjZW5kaWYKLQkJCWllZWU4MDIxMV9zdGFfY29ubmVjdGlvbl9sb3N0KHNkYXRhLCBic3NpZCk7CisJCQlpZWVlODAyMTFfc3RhX2Nvbm5lY3Rpb25fbG9zdChzZGF0YSwgYnNzaWQsCisJCQkJV0xBTl9SRUFTT05fRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFkpOwogCQl9IGVsc2UgaWYgKGlmbWdkLT5wcm9iZV9zZW5kX2NvdW50IDwgbWF4X3RyaWVzKSB7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKIAkJCXdpcGh5X2RlYnVnKGxvY2FsLT5ody53aXBoeSwKQEAgLTIxMTksNyArMjE1NCw4IEBACiAJCQkJICAgIHNkYXRhLT5uYW1lLAogCQkJCSAgICBic3NpZCwgcHJvYmVfd2FpdF9tcyk7CiAKLQkJCWllZWU4MDIxMV9zdGFfY29ubmVjdGlvbl9sb3N0KHNkYXRhLCBic3NpZCk7CisJCQlpZWVlODAyMTFfc3RhX2Nvbm5lY3Rpb25fbG9zdChzZGF0YSwgYnNzaWQsCisJCQkJV0xBTl9SRUFTT05fRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFkpOwogCQl9CiAJfQogCkBAIC0yMjA2LDEyICsyMjQyLDM0IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9tYW5hZ2VkICppZm1nZCA9ICZzZGF0YS0+dS5tZ2Q7CiAKKwlpZiAoIWlmbWdkLT5hc3NvY2lhdGVkKQorCQlyZXR1cm47CisKKwlpZiAoc2RhdGEtPmZsYWdzICYgSUVFRTgwMjExX1NEQVRBX0RJU0NPTk5FQ1RfUkVTVU1FKSB7CisJCXNkYXRhLT5mbGFncyAmPSB+SUVFRTgwMjExX1NEQVRBX0RJU0NPTk5FQ1RfUkVTVU1FOworCQltdXRleF9sb2NrKCZpZm1nZC0+bXR4KTsKKwkJaWYgKGlmbWdkLT5hc3NvY2lhdGVkKSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKKwkJCXdpcGh5X2RlYnVnKHNkYXRhLT5sb2NhbC0+aHcud2lwaHksCisJCQkJICAgICIlczogZHJpdmVyIHJlcXVlc3RlZCBkaXNjb25uZWN0IGFmdGVyIHJlc3VtZS5cbiIsCisJCQkJICAgIHNkYXRhLT5uYW1lKTsKKyNlbmRpZgorCQkJaWVlZTgwMjExX3N0YV9jb25uZWN0aW9uX2xvc3Qoc2RhdGEsCisJCQkJaWZtZ2QtPmFzc29jaWF0ZWQtPmJzc2lkLAorCQkJCVdMQU5fUkVBU09OX1VOU1BFQ0lGSUVEKTsKKwkJCW11dGV4X3VubG9jaygmaWZtZ2QtPm10eCk7CisJCQlyZXR1cm47CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZpZm1nZC0+bXR4KTsKKwl9CisKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRNUl9SVU5OSU5HX1RJTUVSLCAmaWZtZ2QtPnRpbWVyc19ydW5uaW5nKSkKIAkJYWRkX3RpbWVyKCZpZm1nZC0+dGltZXIpOwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoVE1SX1JVTk5JTkdfQ0hBTlNXLCAmaWZtZ2QtPnRpbWVyc19ydW5uaW5nKSkKIAkJYWRkX3RpbWVyKCZpZm1nZC0+Y2hzd2l0Y2hfdGltZXIpOwogCWllZWU4MDIxMV9zdGFfcmVzZXRfYmVhY29uX21vbml0b3Ioc2RhdGEpOwogCWllZWU4MDIxMV9yZXN0YXJ0X3N0YV90aW1lcihzZGF0YSk7CisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJnNkYXRhLT5sb2NhbC0+aHcsICZzZGF0YS0+dS5tZ2QubW9uaXRvcl93b3JrKTsKIH0KICNlbmRpZgogCkBAIC0yMjc3LDE0ICsyMzM1LDE2IEBACiBpZWVlODAyMTFfcHJvYmVfYXV0aF9kb25lKHN0cnVjdCBpZWVlODAyMTFfd29yayAqd2ssCiAJCQkgIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ay0+c2RhdGEtPmxvY2FsOworCiAJaWYgKCFza2IpIHsKIAkJY2ZnODAyMTFfc2VuZF9hdXRoX3RpbWVvdXQod2stPnNkYXRhLT5kZXYsIHdrLT5maWx0ZXJfdGEpOwotCQlyZXR1cm4gV09SS19ET05FX0RFU1RST1k7CisJCWdvdG8gZGVzdHJveTsKIAl9CiAKIAlpZiAod2stPnR5cGUgPT0gSUVFRTgwMjExX1dPUktfQVVUSCkgewogCQljZmc4MDIxMV9zZW5kX3J4X2F1dGgod2stPnNkYXRhLT5kZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQlyZXR1cm4gV09SS19ET05FX0RFU1RST1k7CisJCWdvdG8gZGVzdHJveTsKIAl9CiAKIAltdXRleF9sb2NrKCZ3ay0+c2RhdGEtPnUubWdkLm10eCk7CkBAIC0yMjk0LDYgKzIzNTQsMTIgQEAKIAl3ay0+dHlwZSA9IElFRUU4MDIxMV9XT1JLX0FVVEg7CiAJd2stPnByb2JlX2F1dGgudHJpZXMgPSAwOwogCXJldHVybiBXT1JLX0RPTkVfUkVRVUVVRTsKKyBkZXN0cm95OgorCWlmICh3ay0+cHJvYmVfYXV0aC5zeW5jZWQpCisJCWRydl9maW5pc2hfdHhfc3luYyhsb2NhbCwgd2stPnNkYXRhLCB3ay0+ZmlsdGVyX3RhLAorCQkJCSAgIElFRUU4MDIxMV9UWF9TWU5DX0FVVEgpOworCisJcmV0dXJuIFdPUktfRE9ORV9ERVNUUk9ZOwogfQogCiBpbnQgaWVlZTgwMjExX21nZF9hdXRoKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApAQCAtMjM2Niw2ICsyNDMyLDcgQEAKIHN0YXRpYyBlbnVtIHdvcmtfZG9uZV9yZXN1bHQgaWVlZTgwMjExX2Fzc29jX2RvbmUoc3RydWN0IGllZWU4MDIxMV93b3JrICp3aywKIAkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdrLT5zZGF0YS0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXM7CiAJc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgZWxlbXM7CkBAIC0yMzczLDcgKzI0NDAsNyBAQAogCiAJaWYgKCFza2IpIHsKIAkJY2ZnODAyMTFfc2VuZF9hc3NvY190aW1lb3V0KHdrLT5zZGF0YS0+ZGV2LCB3ay0+ZmlsdGVyX3RhKTsKLQkJcmV0dXJuIFdPUktfRE9ORV9ERVNUUk9ZOworCQlnb3RvIGRlc3Ryb3k7CiAJfQogCiAJaWYgKHdrLT50eXBlID09IElFRUU4MDIxMV9XT1JLX0FTU09DX0JFQUNPTl9XQUlUKSB7CkBAIC0yMzkzLDYgKzI0NjAsMTAgQEAKIAlzdGF0dXMgPSBsZTE2X3RvX2NwdShtZ210LT51LmFzc29jX3Jlc3Auc3RhdHVzX2NvZGUpOwogCiAJaWYgKHN0YXR1cyA9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7CisJCWlmICh3ay0+YXNzb2Muc3luY2VkKQorCQkJZHJ2X2ZpbmlzaF90eF9zeW5jKGxvY2FsLCB3ay0+c2RhdGEsIHdrLT5maWx0ZXJfdGEsCisJCQkJCSAgIElFRUU4MDIxMV9UWF9TWU5DX0FTU09DKTsKKwogCQltdXRleF9sb2NrKCZ3ay0+c2RhdGEtPnUubWdkLm10eCk7CiAJCWlmICghaWVlZTgwMjExX2Fzc29jX3N1Y2Nlc3Mod2ssIG1nbXQsIHNrYi0+bGVuKSkgewogCQkJbXV0ZXhfdW5sb2NrKCZ3ay0+c2RhdGEtPnUubWdkLm10eCk7CkBAIC0yNDA2LDYgKzI0NzcsMTEgQEAKIAl9CiAKIAljZmc4MDIxMV9zZW5kX3J4X2Fzc29jKHdrLT5zZGF0YS0+ZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyBkZXN0cm95OgorCWlmICh3ay0+YXNzb2Muc3luY2VkKQorCQlkcnZfZmluaXNoX3R4X3N5bmMobG9jYWwsIHdrLT5zZGF0YSwgd2stPmZpbHRlcl90YSwKKwkJCQkgICBJRUVFODAyMTFfVFhfU1lOQ19BU1NPQyk7CisKIAlyZXR1cm4gV09SS19ET05FX0RFU1RST1k7CiB9CiAKQEAgLTI2NTgsMyArMjczNCwxMCBAQAogCWNmZzgwMjExX2NxbV9yc3NpX25vdGlmeShzZGF0YS0+ZGV2LCByc3NpX2V2ZW50LCBnZnApOwogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY3FtX3Jzc2lfbm90aWZ5KTsKKwordW5zaWduZWQgY2hhciBpZWVlODAyMTFfZ2V0X29wZXJzdGF0ZShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CisJcmV0dXJuIHNkYXRhLT5kZXYtPm9wZXJzdGF0ZTsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2dldF9vcGVyc3RhdGUpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3BtLmMgYi9uZXQvbWFjODAyMTEvcG0uYwppbmRleCA3MzA3NzhhLi42MzI2ZDM0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcG0uYworKysgYi9uZXQvbWFjODAyMTEvcG0uYwpAQCAtNiwxMiArNiwzNyBAQAogI2luY2x1ZGUgImRyaXZlci1vcHMuaCIKICNpbmNsdWRlICJsZWQuaCIKIAorLyogcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkcml2ZXIgc2hvdWxkIGJlIGZ1cnRoZXIgbm90aWZpZWQgKi8KK3N0YXRpYyBib29sIGllZWU4MDIxMV9xdWllc2NlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQlpZWVlODAyMTFfc3RhX3F1aWVzY2Uoc2RhdGEpOworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQlpZWVlODAyMTFfaWJzc19xdWllc2NlKHNkYXRhKTsKKwkJcmV0dXJuIHRydWU7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgorCQlpZWVlODAyMTFfbWVzaF9xdWllc2NlKHNkYXRhKTsKKwkJcmV0dXJuIHRydWU7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKwkJLyogZG9uJ3QgdGVsbCBkcml2ZXIgYWJvdXQgdGhpcyAqLworCQlyZXR1cm4gZmFsc2U7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHRydWU7CisJfQorfQorCiBpbnQgX19pZWVlODAyMTFfc3VzcGVuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCisJaWYgKCFsb2NhbC0+b3Blbl9jb3VudCkKKwkJZ290byBzdXNwZW5kOworCiAJaWVlZTgwMjExX3NjYW5fY2FuY2VsKGxvY2FsKTsKIAogCWlmIChody0+ZmxhZ3MgJiBJRUVFODAyMTFfSFdfQU1QRFVfQUdHUkVHQVRJT04pIHsKQEAgLTUwLDExICs3NSwxOSBAQAogCWxvY2FsLT53b3dsYW4gPSB3b3dsYW4gJiYgbG9jYWwtPm9wZW5fY291bnQ7CiAJaWYgKGxvY2FsLT53b3dsYW4pIHsKIAkJaW50IGVyciA9IGRydl9zdXNwZW5kKGxvY2FsLCB3b3dsYW4pOwotCQlpZiAoZXJyKSB7CisJCWlmIChlcnIgPCAwKSB7CiAJCQlsb2NhbC0+cXVpZXNjaW5nID0gZmFsc2U7CiAJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UgaWYgKGVyciA+IDApIHsKKwkJCVdBUk5fT04oZXJyICE9IDEpOworCQkJbG9jYWwtPndvd2xhbiA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7CisJCQkJY2FuY2VsX3dvcmtfc3luYygmc2RhdGEtPndvcmspOworCQkJCWllZWU4MDIxMV9xdWllc2NlKHNkYXRhKTsKKwkJCX0KKwkJCWdvdG8gc3VzcGVuZDsKIAkJfQotCQlnb3RvIHN1c3BlbmQ7CiAJfQogCiAJLyogZGlzYWJsZSBrZXlzICovCkBAIC04MiwyMyArMTE1LDggQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpIHsKIAkJY2FuY2VsX3dvcmtfc3luYygmc2RhdGEtPndvcmspOwogCi0JCXN3aXRjaChzZGF0YS0+dmlmLnR5cGUpIHsKLQkJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQkJaWVlZTgwMjExX3N0YV9xdWllc2NlKHNkYXRhKTsKLQkJCWJyZWFrOwotCQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQkJaWVlZTgwMjExX2lic3NfcXVpZXNjZShzZGF0YSk7Ci0JCQlicmVhazsKLQkJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgotCQkJaWVlZTgwMjExX21lc2hfcXVpZXNjZShzZGF0YSk7Ci0JCQlicmVhazsKLQkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgotCQljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6Ci0JCQkvKiBkb24ndCB0ZWxsIGRyaXZlciBhYm91dCB0aGlzICovCisJCWlmICghaWVlZTgwMjExX3F1aWVzY2Uoc2RhdGEpKQogCQkJY29udGludWU7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQogCiAJCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYwppbmRleCA4YWRhYzY3Li41OGE4OTU1IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmMKQEAgLTUzMiwxMiArNTMyLDIxIEBACiAJbXAtPmh3ID0gaHc7CiAJbXAtPnVwZGF0ZV9pbnRlcnZhbCA9IDEwMDsKIAorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCisJbXAtPmZpeGVkX3JhdGVfaWR4ID0gKHUzMikgLTE7CisJbXAtPmRiZ19maXhlZF9yYXRlID0gZGVidWdmc19jcmVhdGVfdTMyKCJmaXhlZF9yYXRlX2lkeCIsCisJCQlTX0lSVUdPIHwgU19JV1VHTywgZGVidWdmc2RpciwgJm1wLT5maXhlZF9yYXRlX2lkeCk7CisjZW5kaWYKKwogCXJldHVybiBtcDsKIH0KIAogc3RhdGljIHZvaWQKIG1pbnN0cmVsX2ZyZWUodm9pZCAqcHJpdikKIHsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCWRlYnVnZnNfcmVtb3ZlKCgoc3RydWN0IG1pbnN0cmVsX3ByaXYgKilwcml2KS0+ZGJnX2ZpeGVkX3JhdGUpOworI2VuZGlmCiAJa2ZyZWUocHJpdik7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmggYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5oCmluZGV4IDBmNWE4MzMuLjVkMjc4ZWMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmgKKysrIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuaApAQCAtNzgsNiArNzgsMTggQEAKIAl1bnNpZ25lZCBpbnQgdXBkYXRlX2ludGVydmFsOwogCXVuc2lnbmVkIGludCBsb29rYXJvdW5kX3JhdGU7CiAJdW5zaWduZWQgaW50IGxvb2thcm91bmRfcmF0ZV9tcnI7CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCS8qCisJICogZW5hYmxlIGZpeGVkIHJhdGUgcHJvY2Vzc2luZyBwZXIgUkMKKwkgKiAgIC0gd3JpdGUgc3RhdGljIGluZGV4IHRvIGRlYnVnZnM6aWVlZTgwMjExL3BoeVgvcmMvZml4ZWRfcmF0ZV9pZHgKKwkgKiAgIC0gd3JpdGUgLTEgdG8gZW5hYmxlIFJDIHByb2Nlc3NpbmcgYWdhaW4KKwkgKiAgIC0gc2V0dGluZyB3aWxsIGJlIGFwcGxpZWQgb24gbmV4dCB1cGRhdGUKKwkgKi8KKwl1MzIgZml4ZWRfcmF0ZV9pZHg7CisJc3RydWN0IGRlbnRyeSAqZGJnX2ZpeGVkX3JhdGU7CisjZW5kaWYKKwogfTsKIAogc3RydWN0IG1pbnN0cmVsX2RlYnVnZnNfaW5mbyB7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHQuYwppbmRleCAzMzNiNTExLi42NmExZWViIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0LmMKQEAgLTYwOSw2ICs2MDksMTMgQEAKIAogCWluZm8tPmZsYWdzIHw9IG1pLT50eF9mbGFnczsKIAlzYW1wbGVfaWR4ID0gbWluc3RyZWxfZ2V0X3NhbXBsZV9yYXRlKG1wLCBtaSk7CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCS8qIHVzZSBmaXhlZCBpbmRleCBpZiBzZXQgKi8KKwlpZiAobXAtPmZpeGVkX3JhdGVfaWR4ICE9IC0xKQorCQlzYW1wbGVfaWR4ID0gbXAtPmZpeGVkX3JhdGVfaWR4OworI2VuZGlmCisKIAlpZiAoc2FtcGxlX2lkeCA+PSAwKSB7CiAJCXNhbXBsZSA9IHRydWU7CiAJCW1pbnN0cmVsX2h0X3NldF9yYXRlKG1wLCBtaSwgJmFyWzBdLCBzYW1wbGVfaWR4LApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3J4LmMgYi9uZXQvbWFjODAyMTEvcnguYwppbmRleCA3ZmE4YzZiLi5mZTJjMmE3IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcnguYworKysgYi9uZXQvbWFjODAyMTEvcnguYwpAQCAtMzMxLDE1ICszMzEsMTggQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcngtPnNrYi0+ZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENCKHJ4LT5za2IpOwotCWludCB0aWQ7CisJaW50IHRpZCwgc2Vxbm9faWR4LCBzZWN1cml0eV9pZHg7CiAKIAkvKiBkb2VzIHRoZSBmcmFtZSBoYXZlIGEgcW9zIGNvbnRyb2wgZmllbGQ/ICovCiAJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7CiAJCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwogCQkvKiBmcmFtZSBoYXMgcW9zIGNvbnRyb2wgKi8KIAkJdGlkID0gKnFjICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0s7Ci0JCWlmICgqcWMgJiBJRUVFODAyMTFfUU9TX0NPTlRST0xfQV9NU0RVX1BSRVNFTlQpCisJCWlmICgqcWMgJiBJRUVFODAyMTFfUU9TX0NUTF9BX01TRFVfUFJFU0VOVCkKIAkJCXN0YXR1cy0+cnhfZmxhZ3MgfD0gSUVFRTgwMjExX1JYX0FNU0RVOworCisJCXNlcW5vX2lkeCA9IHRpZDsKKwkJc2VjdXJpdHlfaWR4ID0gdGlkOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIElFRUUgODAyLjExLTIwMDcsIDcuMS4zLjQuMSAoIlNlcXVlbmNlIE51bWJlciBmaWVsZCIpOgpAQCAtMzUyLDEwICszNTUsMTUgQEAKIAkJICoKIAkJICogV2UgYWxzbyB1c2UgdGhhdCBjb3VudGVyIGZvciBub24tUW9TIFNUQXMuCiAJCSAqLwotCQl0aWQgPSBOVU1fUlhfREFUQV9RVUVVRVMgLSAxOworCQlzZXFub19pZHggPSBOVU1fUlhfREFUQV9RVUVVRVM7CisJCXNlY3VyaXR5X2lkeCA9IDA7CisJCWlmIChpZWVlODAyMTFfaXNfbWdtdChoZHItPmZyYW1lX2NvbnRyb2wpKQorCQkJc2VjdXJpdHlfaWR4ID0gTlVNX1JYX0RBVEFfUVVFVUVTOworCQl0aWQgPSAwOwogCX0KIAotCXJ4LT5xdWV1ZSA9IHRpZDsKKwlyeC0+c2Vxbm9faWR4ID0gc2Vxbm9faWR4OworCXJ4LT5zZWN1cml0eV9pZHggPSBzZWN1cml0eV9pZHg7CiAJLyogU2V0IHNrYi0+cHJpb3JpdHkgdG8gMWQgdGFnIGlmIGhpZ2hlc3Qgb3JkZXIgYml0IG9mIFRJRCBpcyBub3Qgc2V0LgogCSAqIEZvciBub3csIHNldCBza2ItPnByaW9yaXR5IHRvIDAgZm9yIG90aGVyIGNhc2VzLiAqLwogCXJ4LT5za2ItPnByaW9yaXR5ID0gKHRpZCA+IDcpID8gMCA6IHRpZDsKQEAgLTgxMCw3ICs4MTgsNyBAQAogCS8qIERyb3AgZHVwbGljYXRlIDgwMi4xMSByZXRyYW5zbWlzc2lvbnMgKElFRUUgODAyLjExIENoYXAuIDkuMi45KSAqLwogCWlmIChyeC0+c3RhICYmICFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkgewogCQlpZiAodW5saWtlbHkoaWVlZTgwMjExX2hhc19yZXRyeShoZHItPmZyYW1lX2NvbnRyb2wpICYmCi0JCQkgICAgIHJ4LT5zdGEtPmxhc3Rfc2VxX2N0cmxbcngtPnF1ZXVlXSA9PQorCQkJICAgICByeC0+c3RhLT5sYXN0X3NlcV9jdHJsW3J4LT5zZXFub19pZHhdID09CiAJCQkgICAgIGhkci0+c2VxX2N0cmwpKSB7CiAJCQlpZiAoc3RhdHVzLT5yeF9mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkgewogCQkJCXJ4LT5sb2NhbC0+ZG90MTFGcmFtZUR1cGxpY2F0ZUNvdW50Kys7CkBAIC04MTgsNyArODI2LDcgQEAKIAkJCX0KIAkJCXJldHVybiBSWF9EUk9QX1VOVVNBQkxFOwogCQl9IGVsc2UKLQkJCXJ4LT5zdGEtPmxhc3Rfc2VxX2N0cmxbcngtPnF1ZXVlXSA9IGhkci0+c2VxX2N0cmw7CisJCQlyeC0+c3RhLT5sYXN0X3NlcV9jdHJsW3J4LT5zZXFub19pZHhdID0gaGRyLT5zZXFfY3RybDsKIAl9CiAKIAlpZiAodW5saWtlbHkocngtPnNrYi0+bGVuIDwgMTYpKSB7CkBAIC0xMDExLDYgKzEwMTksOSBAQAogCX0KIAogCWlmIChyeC0+a2V5KSB7CisJCWlmICh1bmxpa2VseShyeC0+a2V5LT5mbGFncyAmIEtFWV9GTEFHX1RBSU5URUQpKQorCQkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKKwogCQlyeC0+a2V5LT50eF9yeF9jb3VudCsrOwogCQkvKiBUT0RPOiBhZGQgdGhyZXNob2xkIHN0dWZmIGFnYWluICovCiAJfSBlbHNlIHsKQEAgLTEzNzQsMTEgKzEzODUsMTAgQEAKIAlpZiAoZnJhZyA9PSAwKSB7CiAJCS8qIFRoaXMgaXMgdGhlIGZpcnN0IGZyYWdtZW50IG9mIGEgbmV3IGZyYW1lLiAqLwogCQllbnRyeSA9IGllZWU4MDIxMV9yZWFzc2VtYmxlX2FkZChyeC0+c2RhdGEsIGZyYWcsIHNlcSwKLQkJCQkJCSByeC0+cXVldWUsICYocngtPnNrYikpOworCQkJCQkJIHJ4LT5zZXFub19pZHgsICYocngtPnNrYikpOwogCQlpZiAocngtPmtleSAmJiByeC0+a2V5LT5jb25mLmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QICYmCiAJCSAgICBpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChmYykpIHsKLQkJCWludCBxdWV1ZSA9IGllZWU4MDIxMV9pc19tZ210KGZjKSA/Ci0JCQkJTlVNX1JYX0RBVEFfUVVFVUVTIDogcngtPnF1ZXVlOworCQkJaW50IHF1ZXVlID0gcngtPnNlY3VyaXR5X2lkeDsKIAkJCS8qIFN0b3JlIENDTVAgUE4gc28gdGhhdCB3ZSBjYW4gdmVyaWZ5IHRoYXQgdGhlIG5leHQKIAkJCSAqIGZyYWdtZW50IGhhcyBhIHNlcXVlbnRpYWwgUE4gdmFsdWUuICovCiAJCQllbnRyeS0+Y2NtcCA9IDE7CkBAIC0xMzkyLDcgKzE0MDIsOCBAQAogCS8qIFRoaXMgaXMgYSBmcmFnbWVudCBmb3IgYSBmcmFtZSB0aGF0IHNob3VsZCBhbHJlYWR5IGJlIHBlbmRpbmcgaW4KIAkgKiBmcmFnbWVudCBjYWNoZS4gQWRkIHRoaXMgZnJhZ21lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcGVuZGluZyBlbnRyeS4KIAkgKi8KLQllbnRyeSA9IGllZWU4MDIxMV9yZWFzc2VtYmxlX2ZpbmQocngtPnNkYXRhLCBmcmFnLCBzZXEsIHJ4LT5xdWV1ZSwgaGRyKTsKKwllbnRyeSA9IGllZWU4MDIxMV9yZWFzc2VtYmxlX2ZpbmQocngtPnNkYXRhLCBmcmFnLCBzZXEsCisJCQkJCSAgcngtPnNlcW5vX2lkeCwgaGRyKTsKIAlpZiAoIWVudHJ5KSB7CiAJCUk4MDJfREVCVUdfSU5DKHJ4LT5sb2NhbC0+cnhfaGFuZGxlcnNfZHJvcF9kZWZyYWcpOwogCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwpAQCAtMTQxMiw4ICsxNDIzLDcgQEAKIAkJCWlmIChwbltpXSkKIAkJCQlicmVhazsKIAkJfQotCQlxdWV1ZSA9IGllZWU4MDIxMV9pc19tZ210KGZjKSA/Ci0JCQlOVU1fUlhfREFUQV9RVUVVRVMgOiByeC0+cXVldWU7CisJCXF1ZXVlID0gcngtPnNlY3VyaXR5X2lkeDsKIAkJcnBuID0gcngtPmtleS0+dS5jY21wLnJ4X3BuW3F1ZXVlXTsKIAkJaWYgKG1lbWNtcChwbiwgcnBuLCBDQ01QX1BOX0xFTikpCiAJCQlyZXR1cm4gUlhfRFJPUF9VTlVTQUJMRTsKQEAgLTI1OTAsNyArMjYwMCw5IEBACiAJCS5zdGEgPSBzdGEsCiAJCS5zZGF0YSA9IHN0YS0+c2RhdGEsCiAJCS5sb2NhbCA9IHN0YS0+bG9jYWwsCi0JCS5xdWV1ZSA9IHRpZCwKKwkJLyogVGhpcyBpcyBPSyAtLSBtdXN0IGJlIFFvUyBkYXRhIGZyYW1lICovCisJCS5zZWN1cml0eV9pZHggPSB0aWQsCisJCS5zZXFub19pZHggPSB0aWQsCiAJCS5mbGFncyA9IDAsCiAJfTsKIAlzdHJ1Y3QgdGlkX2FtcGR1X3J4ICp0aWRfYWdnX3J4OwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3NjYW4uYyBiL25ldC9tYWM4MDIxMS9zY2FuLmMKaW5kZXggNThmZmE3ZC4uNmYwOWVjYSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3NjYW4uYworKysgYi9uZXQvbWFjODAyMTEvc2Nhbi5jCkBAIC0yNTEsOCArMjUxLDggQEAKIAlsb2NhbC0+aHdfc2Nhbl9yZXEtPm5fY2hhbm5lbHMgPSBuX2NoYW5zOwogCiAJaWVsZW4gPSBpZWVlODAyMTFfYnVpbGRfcHJlcV9pZXMobG9jYWwsICh1OCAqKWxvY2FsLT5od19zY2FuX3JlcS0+aWUsCi0JCQkJCSByZXEtPmllLCByZXEtPmllX2xlbiwgYmFuZCwgKHUzMikgLTEsCi0JCQkJCSAwKTsKKwkJCQkJIHJlcS0+aWUsIHJlcS0+aWVfbGVuLCBiYW5kLAorCQkJCQkgcmVxLT5yYXRlc1tiYW5kXSwgMCk7CiAJbG9jYWwtPmh3X3NjYW5fcmVxLT5pZV9sZW4gPSBpZWxlbjsKIAogCXJldHVybiB0cnVlOwpAQCAtNjUyLDEzICs2NTIsMTUgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IGxvY2FsLT5zY2FuX3NkYXRhOworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCA9IGxvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbG9jYWwtPnNjYW5fcmVxLT5uX3NzaWRzOyBpKyspCiAJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcSgKIAkJCXNkYXRhLCBOVUxMLAogCQkJbG9jYWwtPnNjYW5fcmVxLT5zc2lkc1tpXS5zc2lkLAogCQkJbG9jYWwtPnNjYW5fcmVxLT5zc2lkc1tpXS5zc2lkX2xlbiwKLQkJCWxvY2FsLT5zY2FuX3JlcS0+aWUsIGxvY2FsLT5zY2FuX3JlcS0+aWVfbGVuKTsKKwkJCWxvY2FsLT5zY2FuX3JlcS0+aWUsIGxvY2FsLT5zY2FuX3JlcS0+aWVfbGVuLAorCQkJbG9jYWwtPnNjYW5fcmVxLT5yYXRlc1tiYW5kXSwgZmFsc2UpOwogCiAJLyoKIAkgKiBBZnRlciBzZW5kaW5nIHByb2JlIHJlcXVlc3RzLCB3YWl0IGZvciBwcm9iZSByZXNwb25zZXMKQEAgLTgyMSwxMCArODIzLDggQEAKICAqLwogdm9pZCBpZWVlODAyMTFfc2Nhbl9jYW5jZWwoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7Ci0JYm9vbCBhYm9ydHNjYW47Ci0KIAkvKgotCSAqIFdlIGFyZSBvbmx5IGNhbmNlbGluZyBzb2Z0d2FyZSBzY2FuLCBvciBkZWZlcnJlZCBzY2FuIHRoYXQgd2FzIG5vdAorCSAqIFdlIGFyZSBjYW5jZWxpbmcgc29mdHdhcmUgc2Nhbiwgb3IgZGVmZXJyZWQgc2NhbiB0aGF0IHdhcyBub3QKIAkgKiB5ZXQgcmVhbGx5IHN0YXJ0ZWQgKHNlZSBfX2llZWU4MDIxMV9zdGFydF9zY2FuICkuCiAJICoKIAkgKiBSZWdhcmRpbmcgaGFyZHdhcmUgc2NhbjoKQEAgLTgzNiwyMyArODM2LDMwIEBACiAJICogLSB3ZSBjYW4gbm90IGNhbmNlbCBzY2FuX3dvcmsgc2luY2UgZHJpdmVyIGNhbiBzY2hlZHVsZSBpdAogCSAqICAgYnkgaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKC4uLiwgdHJ1ZSkgdG8gZmluaXNoIHNjYW4KIAkgKgotCSAqIEhlbmNlIGxvdyBsZXZlciBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbmNlbGluZyBIVyBzY2FuLgorCSAqIEhlbmNlIHdlIG9ubHkgY2FsbCB0aGUgY2FuY2VsX2h3X3NjYW4oKSBjYWxsYmFjaywgYnV0IHRoZSBsb3ctbGV2ZWwKKwkgKiBkcml2ZXIgaXMgc3RpbGwgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKCkKKwkgKiBhZnRlciB0aGUgc2NhbiB3YXMgY29tcGxldGVkL2Fib3J0ZWQuCiAJICovCiAKIAltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKLQlhYm9ydHNjYW4gPSBsb2NhbC0+c2Nhbl9yZXEgJiYgIXRlc3RfYml0KFNDQU5fSFdfU0NBTk5JTkcsICZsb2NhbC0+c2Nhbm5pbmcpOwotCWlmIChhYm9ydHNjYW4pIHsKLQkJLyoKLQkJICogVGhlIHNjYW4gaXMgY2FuY2VsZWQsIGJ1dCBzdG9wIHdvcmsgZnJvbSBiZWluZyBwZW5kaW5nLgotCQkgKgotCQkgKiBJZiB0aGUgd29yayBpcyBjdXJyZW50bHkgcnVubmluZywgaXQgbXVzdCBiZSBibG9ja2VkIG9uCi0JCSAqIHRoZSBtdXRleCwgYnV0IHdlJ2xsIHNldCBzY2FuX3NkYXRhID0gTlVMTCBhbmQgaXQnbGwKLQkJICogc2ltcGx5IGV4aXQgb25jZSBpdCBhY3F1aXJlcyB0aGUgbXV0ZXguCi0JCSAqLwotCQljYW5jZWxfZGVsYXllZF93b3JrKCZsb2NhbC0+c2Nhbl93b3JrKTsKLQkJLyogYW5kIGNsZWFuIHVwICovCi0JCV9faWVlZTgwMjExX3NjYW5fY29tcGxldGVkKCZsb2NhbC0+aHcsIHRydWUsIGZhbHNlKTsKKwlpZiAoIWxvY2FsLT5zY2FuX3JlcSkKKwkJZ290byBvdXQ7CisKKwlpZiAodGVzdF9iaXQoU0NBTl9IV19TQ0FOTklORywgJmxvY2FsLT5zY2FubmluZykpIHsKKwkJaWYgKGxvY2FsLT5vcHMtPmNhbmNlbF9od19zY2FuKQorCQkJZHJ2X2NhbmNlbF9od19zY2FuKGxvY2FsLCBsb2NhbC0+c2Nhbl9zZGF0YSk7CisJCWdvdG8gb3V0OwogCX0KKworCS8qCisJICogSWYgdGhlIHdvcmsgaXMgY3VycmVudGx5IHJ1bm5pbmcsIGl0IG11c3QgYmUgYmxvY2tlZCBvbgorCSAqIHRoZSBtdXRleCwgYnV0IHdlJ2xsIHNldCBzY2FuX3NkYXRhID0gTlVMTCBhbmQgaXQnbGwKKwkgKiBzaW1wbHkgZXhpdCBvbmNlIGl0IGFjcXVpcmVzIHRoZSBtdXRleC4KKwkgKi8KKwljYW5jZWxfZGVsYXllZF93b3JrKCZsb2NhbC0+c2Nhbl93b3JrKTsKKwkvKiBhbmQgY2xlYW4gdXAgKi8KKwlfX2llZWU4MDIxMV9zY2FuX2NvbXBsZXRlZCgmbG9jYWwtPmh3LCB0cnVlLCBmYWxzZSk7CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIH0KIApAQCAtODc3LDcgKzg4NCw4IEBACiAJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGkrKykgewogCQlsb2NhbC0+c2NoZWRfc2Nhbl9pZXMuaWVbaV0gPSBremFsbG9jKDIgKwogCQkJCQkJICAgICAgSUVFRTgwMjExX01BWF9TU0lEX0xFTiArCi0JCQkJCQkgICAgICBsb2NhbC0+c2Nhbl9pZXNfbGVuLAorCQkJCQkJICAgICAgbG9jYWwtPnNjYW5faWVzX2xlbiArCisJCQkJCQkgICAgICByZXEtPmllX2xlbiwKIAkJCQkJCSAgICAgIEdGUF9LRVJORUwpOwogCQlpZiAoIWxvY2FsLT5zY2hlZF9zY2FuX2llcy5pZVtpXSkgewogCQkJcmV0ID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jIGIvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMKaW5kZXggYjgzODcwYi4uM2RiNzhiNiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMKKysrIGIvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMKQEAgLTk3LDcgKzk3LDYgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAogCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhsb2NhbC0+c3RhX2hhc2hbU1RBX0hBU0goYWRkcildLAotCQkJCSAgICByY3VfcmVhZF9sb2NrX2hlbGQoKSB8fAogCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbG9jaykgfHwKIAkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX210eCkpOwogCXdoaWxlIChzdGEpIHsKQEAgLTEwNSw3ICsxMDQsNiBAQAogCQkgICAgbWVtY21wKHN0YS0+c3RhLmFkZHIsIGFkZHIsIEVUSF9BTEVOKSA9PSAwKQogCQkJYnJlYWs7CiAJCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhzdGEtPmhuZXh0LAotCQkJCQkgICAgcmN1X3JlYWRfbG9ja19oZWxkKCkgfHwKIAkJCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9sb2NrKSB8fAogCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX210eCkpOwogCX0KQEAgLTEyMyw3ICsxMjEsNiBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCiAJc3RhID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChhZGRyKV0sCi0JCQkJICAgIHJjdV9yZWFkX2xvY2tfaGVsZCgpIHx8CiAJCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9sb2NrKSB8fAogCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7CiAJd2hpbGUgKHN0YSkgewpAQCAtMTMyLDcgKzEyOSw2IEBACiAJCSAgICBtZW1jbXAoc3RhLT5zdGEuYWRkciwgYWRkciwgRVRIX0FMRU4pID09IDApCiAJCQlicmVhazsKIAkJc3RhID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHN0YS0+aG5leHQsCi0JCQkJCSAgICByY3VfcmVhZF9sb2NrX2hlbGQoKSB8fAogCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX2xvY2spIHx8CiAJCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmggYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uaAppbmRleCBjNmFlODcxLi4yOGJlYjc4IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uaAorKysgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uaApAQCAtMTU4LDYgKzE1OCw4IEBACiAgKiBAd29yazogd29yayBzdHJ1Y3QgZm9yIHN0YXJ0aW5nL3N0b3BwaW5nIGFnZ3JlZ2F0aW9uCiAgKiBAdGlkX3J4X3RpbWVyX2V4cGlyZWQ6IGJpdG1hcCBpbmRpY2F0aW5nIG9uIHdoaWNoIFRJRHMgdGhlCiAgKglSWCB0aW1lciBleHBpcmVkIHVudGlsIHRoZSB3b3JrIGZvciBpdCBydW5zCisgKiBAdGlkX3J4X3N0b3BfcmVxdWVzdGVkOiAgYml0bWFwIGluZGljYXRpbmcgd2hpY2ggQkEgc2Vzc2lvbnMgcGVyIFRJRCB0aGUKKyAqCWRyaXZlciByZXF1ZXN0ZWQgdG8gY2xvc2UgdW50aWwgdGhlIHdvcmsgZm9yIGl0IHJ1bnMKICAqIEBtdHg6IG11dGV4IHRvIHByb3RlY3QgYWxsIFRYIGRhdGEgKGV4Y2VwdCBub24tTlVMTCBhc3NpZ25tZW50cwogICoJdG8gdGlkX3R4W2lkeF0sIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIHN0YSBzcGlubG9jaykKICAqLwpAQCAtMTY2LDYgKzE2OCw3IEBACiAJLyogcnggKi8KIAlzdHJ1Y3QgdGlkX2FtcGR1X3J4IF9fcmN1ICp0aWRfcnhbU1RBX1RJRF9OVU1dOwogCXVuc2lnbmVkIGxvbmcgdGlkX3J4X3RpbWVyX2V4cGlyZWRbQklUU19UT19MT05HUyhTVEFfVElEX05VTSldOworCXVuc2lnbmVkIGxvbmcgdGlkX3J4X3N0b3BfcmVxdWVzdGVkW0JJVFNfVE9fTE9OR1MoU1RBX1RJRF9OVU0pXTsKIAkvKiB0eCAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXN0cnVjdCB0aWRfYW1wZHVfdHggX19yY3UgKnRpZF90eFtTVEFfVElEX05VTV07CkBAIC0yODQsNyArMjg3LDggQEAKIAl1bnNpZ25lZCBsb25nIHJ4X2Ryb3BwZWQ7CiAJaW50IGxhc3Rfc2lnbmFsOwogCXN0cnVjdCBld21hIGF2Z19zaWduYWw7Ci0JX19sZTE2IGxhc3Rfc2VxX2N0cmxbTlVNX1JYX0RBVEFfUVVFVUVTXTsKKwkvKiBQbHVzIDEgZm9yIG5vbi1Rb1MgZnJhbWVzICovCisJX19sZTE2IGxhc3Rfc2VxX2N0cmxbTlVNX1JYX0RBVEFfUVVFVUVTICsgMV07CiAKIAkvKiBVcGRhdGVkIGZyb20gVFggc3RhdHVzIHBhdGggb25seSwgbm8gbG9ja2luZyByZXF1aXJlbWVudHMgKi8KIAl1bnNpZ25lZCBsb25nIHR4X2ZpbHRlcmVkX2NvdW50OwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3RraXAuYyBiL25ldC9tYWM4MDIxMS90a2lwLmMKaW5kZXggNzU3ZTRlYi4uZjQ5ZDAwYSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3RraXAuYworKysgYi9uZXQvbWFjODAyMTEvdGtpcC5jCkBAIC0xMDEsNiArMTAxLDcgQEAKIAkJcDFrWzRdICs9IHRraXBTKHAxa1szXSBeIGdldF91bmFsaWduZWRfbGUxNih0ayArIDAgKyBqKSkgKyBpOwogCX0KIAljdHgtPnN0YXRlID0gVEtJUF9TVEFURV9QSEFTRTFfRE9ORTsKKwljdHgtPnAxa19pdjMyID0gdHNjX0lWMzI7CiB9CiAKIHN0YXRpYyB2b2lkIHRraXBfbWl4aW5nX3BoYXNlMihjb25zdCB1OCAqdGssIHN0cnVjdCB0a2lwX2N0eCAqY3R4LApAQCAtMTQwLDYwICsxNDEsODAgQEAKIC8qIEFkZCBUS0lQIElWIGFuZCBFeHQuIElWIGF0IEBwb3MuIEBpdjAsIEBpdjEsIGFuZCBAaXYyIGFyZSB0aGUgZmlyc3Qgb2N0ZXRzCiAgKiBvZiB0aGUgSVYuIFJldHVybnMgcG9pbnRlciB0byB0aGUgb2N0ZXQgZm9sbG93aW5nIElWcyAoaS5lLiwgYmVnaW5uaW5nIG9mCiAgKiB0aGUgcGFja2V0IHBheWxvYWQpLiAqLwotdTggKmllZWU4MDIxMV90a2lwX2FkZF9pdih1OCAqcG9zLCBzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5LCB1MTYgaXYxNikKK3U4ICppZWVlODAyMTFfdGtpcF9hZGRfaXYodTggKnBvcywgc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSkKIHsKLQlwb3MgPSB3cml0ZV90a2lwX2l2KHBvcywgaXYxNik7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgma2V5LT51LnRraXAudHhsb2NrKTsKKworCXBvcyA9IHdyaXRlX3RraXBfaXYocG9zLCBrZXktPnUudGtpcC50eC5pdjE2KTsKIAkqcG9zKysgPSAoa2V5LT5jb25mLmtleWlkeCA8PCA2KSB8ICgxIDw8IDUpIC8qIEV4dCBJViAqLzsKIAlwdXRfdW5hbGlnbmVkX2xlMzIoa2V5LT51LnRraXAudHguaXYzMiwgcG9zKTsKIAlyZXR1cm4gcG9zICsgNDsKIH0KIAotdm9pZCBpZWVlODAyMTFfZ2V0X3RraXBfa2V5KHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIGllZWU4MDIxMV90a2lwX2tleV90eXBlIHR5cGUsCi0JCQl1OCAqb3V0a2V5KQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2NvbXB1dGVfdGtpcF9wMWsoc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSwgdTMyIGl2MzIpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBrZXktPnNkYXRhOworCXN0cnVjdCB0a2lwX2N0eCAqY3R4ID0gJmtleS0+dS50a2lwLnR4OworCWNvbnN0IHU4ICp0ayA9ICZrZXktPmNvbmYua2V5W05MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9FTkNSX0tFWV07CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZrZXktPnUudGtpcC50eGxvY2spOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIFAxSyB3aGVuIHRoZSBJVjMyIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZSBpdAorCSAqIGhhZCB3aGVuIHdlIGxhc3QgY29tcHV0ZWQgaXQgKG9yIHdoZW4gbm90IGluaXRpYWxpc2VkIHlldCkuCisJICogVGhpcyBtaWdodCBmbGlwLWZsb3AgYmFjayBhbmQgZm9ydGggaWYgcGFja2V0cyBhcmUgcHJvY2Vzc2VkCisJICogb3V0LW9mLW9yZGVyIGR1ZSB0byB0aGUgZGlmZmVyZW50IEFDcywgYnV0IHRoZW4gd2UgaGF2ZSB0bworCSAqIGp1c3QgY29tcHV0ZSB0aGUgUDFLIG1vcmUgb2Z0ZW4uCisJICovCisJaWYgKGN0eC0+cDFrX2l2MzIgIT0gaXYzMiB8fCBjdHgtPnN0YXRlID09IFRLSVBfU1RBVEVfTk9UX0lOSVQpCisJCXRraXBfbWl4aW5nX3BoYXNlMSh0aywgY3R4LCBzZGF0YS0+dmlmLmFkZHIsIGl2MzIpOworfQorCit2b2lkIGllZWU4MDIxMV9nZXRfdGtpcF9wMWtfaXYoc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKKwkJCSAgICAgICB1MzIgaXYzMiwgdTE2ICpwMWspCiB7CiAJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSA9IChzdHJ1Y3QgaWVlZTgwMjExX2tleSAqKQogCQkJY29udGFpbmVyX29mKGtleWNvbmYsIHN0cnVjdCBpZWVlODAyMTFfa2V5LCBjb25mKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwotCXU4ICpkYXRhOwotCWNvbnN0IHU4ICp0azsKLQlzdHJ1Y3QgdGtpcF9jdHggKmN0eDsKLQl1MTYgaXYxNjsKLQl1MzIgaXYzMjsKKwlzdHJ1Y3QgdGtpcF9jdHggKmN0eCA9ICZrZXktPnUudGtpcC50eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGF0YSA9ICh1OCAqKWhkciArIGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKLQlpdjE2ID0gZGF0YVsyXSB8IChkYXRhWzBdIDw8IDgpOwotCWl2MzIgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJmRhdGFbNF0pOwotCi0JdGsgPSAma2V5LT5jb25mLmtleVtOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfRU5DUl9LRVldOwotCWN0eCA9ICZrZXktPnUudGtpcC50eDsKLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9US0lQX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIlRLSVAgZW5jcnlwdDogaXYxNiA9IDB4JTA0eCwgaXYzMiA9IDB4JTA4eFxuIiwKLQkJCWl2MTYsIGl2MzIpOwotCi0JaWYgKGl2MzIgIT0gY3R4LT5pdjMyKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJza2I6IGl2MzIgPSAweCUwOHgga2V5OiBpdjMyID0gMHglMDh4XG4iLAotCQkJaXYzMiwgY3R4LT5pdjMyKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIldyYXAgYXJvdW5kIG9mIGl2MTYgaW4gdGhlIG1pZGRsZSBvZiBhICIKLQkJCSJmcmFnbWVudGVkIHBhY2tldFxuIik7Ci0JfQotI2VuZGlmCi0KLQkvKiBVcGRhdGUgdGhlIHAxayBvbmx5IHdoZW4gdGhlIGl2MTYgaW4gdGhlIHBhY2tldCB3cmFwcyBhcm91bmQsIHRoaXMKLQkgKiBtaWdodCBvY2N1ciBhZnRlciB0aGUgd3JhcCBhcm91bmQgb2YgaXYxNiBpbiB0aGUga2V5IGluIGNhc2Ugb2YKLQkgKiBmcmFnbWVudGVkIHBhY2tldHMuICovCi0JaWYgKGl2MTYgPT0gMCB8fCBjdHgtPnN0YXRlID09IFRLSVBfU1RBVEVfTk9UX0lOSVQpCi0JCXRraXBfbWl4aW5nX3BoYXNlMSh0aywgY3R4LCBoZHItPmFkZHIyLCBpdjMyKTsKLQotCWlmICh0eXBlID09IElFRUU4MDIxMV9US0lQX1AxX0tFWSkgewotCQltZW1jcHkob3V0a2V5LCBjdHgtPnAxaywgc2l6ZW9mKHUxNikgKiA1KTsKLQkJcmV0dXJuOwotCX0KLQotCXRraXBfbWl4aW5nX3BoYXNlMih0aywgY3R4LCBpdjE2LCBvdXRrZXkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZrZXktPnUudGtpcC50eGxvY2ssIGZsYWdzKTsKKwlpZWVlODAyMTFfY29tcHV0ZV90a2lwX3AxayhrZXksIGl2MzIpOworCW1lbWNweShwMWssIGN0eC0+cDFrLCBzaXplb2YoY3R4LT5wMWspKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZXktPnUudGtpcC50eGxvY2ssIGZsYWdzKTsKIH0KLUVYUE9SVF9TWU1CT0woaWVlZTgwMjExX2dldF90a2lwX2tleSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9nZXRfdGtpcF9wMWtfaXYpOworCit2b2lkIGllZWU4MDIxMV9nZXRfdGtpcF9yeF9wMWsoc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqdGEsIHUzMiBpdjMyLCB1MTYgKnAxaykKK3sKKwljb25zdCB1OCAqdGsgPSAma2V5Y29uZi0+a2V5W05MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9FTkNSX0tFWV07CisJc3RydWN0IHRraXBfY3R4IGN0eDsKKworCXRraXBfbWl4aW5nX3BoYXNlMSh0aywgJmN0eCwgdGEsIGl2MzIpOworCW1lbWNweShwMWssIGN0eC5wMWssIHNpemVvZihjdHgucDFrKSk7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9nZXRfdGtpcF9yeF9wMWspOworCit2b2lkIGllZWU4MDIxMV9nZXRfdGtpcF9wMmsoc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqcDJrKQoreworCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXkgPSAoc3RydWN0IGllZWU4MDIxMV9rZXkgKikKKwkJCWNvbnRhaW5lcl9vZihrZXljb25mLCBzdHJ1Y3QgaWVlZTgwMjExX2tleSwgY29uZik7CisJY29uc3QgdTggKnRrID0gJmtleS0+Y29uZi5rZXlbTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX0VOQ1JfS0VZXTsKKwlzdHJ1Y3QgdGtpcF9jdHggKmN0eCA9ICZrZXktPnUudGtpcC50eDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCWNvbnN0IHU4ICpkYXRhID0gKHU4ICopaGRyICsgaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOworCXUzMiBpdjMyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZkYXRhWzRdKTsKKwl1MTYgaXYxNiA9IGRhdGFbMl0gfCAoZGF0YVswXSA8PCA4KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmtleS0+dS50a2lwLnR4bG9jaywgZmxhZ3MpOworCWllZWU4MDIxMV9jb21wdXRlX3RraXBfcDFrKGtleSwgaXYzMik7CisJdGtpcF9taXhpbmdfcGhhc2UyKHRrLCBjdHgsIGl2MTYsIHAyayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2V5LT51LnRraXAudHhsb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9nZXRfdGtpcF9wMmspOwogCiAvKgogICogRW5jcnlwdCBwYWNrZXQgcGF5bG9hZCB3aXRoIFRLSVAgdXNpbmcgQGtleS4gQHBvcyBpcyBhIHBvaW50ZXIgdG8gdGhlCkBAIC0yMDQsMTkgKzIyNSwxNSBAQAogICovCiBpbnQgaWVlZTgwMjExX3RraXBfZW5jcnlwdF9kYXRhKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0sCiAJCQkJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSwKLQkJCQl1OCAqcG9zLCBzaXplX3QgcGF5bG9hZF9sZW4sIHU4ICp0YSkKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXU4ICpwYXlsb2FkLCBzaXplX3QgcGF5bG9hZF9sZW4pCiB7CiAJdTggcmM0a2V5WzE2XTsKLQlzdHJ1Y3QgdGtpcF9jdHggKmN0eCA9ICZrZXktPnUudGtpcC50eDsKLQljb25zdCB1OCAqdGsgPSAma2V5LT5jb25mLmtleVtOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfRU5DUl9LRVldOwogCi0JLyogQ2FsY3VsYXRlIHBlci1wYWNrZXQga2V5ICovCi0JaWYgKGN0eC0+aXYxNiA9PSAwIHx8IGN0eC0+c3RhdGUgPT0gVEtJUF9TVEFURV9OT1RfSU5JVCkKLQkJdGtpcF9taXhpbmdfcGhhc2UxKHRrLCBjdHgsIHRhLCBjdHgtPml2MzIpOworCWllZWU4MDIxMV9nZXRfdGtpcF9wMmsoJmtleS0+Y29uZiwgc2tiLCByYzRrZXkpOwogCi0JdGtpcF9taXhpbmdfcGhhc2UyKHRrLCBjdHgsIGN0eC0+aXYxNiwgcmM0a2V5KTsKLQotCXJldHVybiBpZWVlODAyMTFfd2VwX2VuY3J5cHRfZGF0YSh0Zm0sIHJjNGtleSwgMTYsIHBvcywgcGF5bG9hZF9sZW4pOworCXJldHVybiBpZWVlODAyMTFfd2VwX2VuY3J5cHRfZGF0YSh0Zm0sIHJjNGtleSwgMTYsCisJCQkJCSAgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOwogfQogCiAvKiBEZWNyeXB0IHBhY2tldCBwYXlsb2FkIHdpdGggVEtJUCB1c2luZyBAa2V5LiBAcG9zIGlzIGEgcG9pbnRlciB0byB0aGUKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90a2lwLmggYi9uZXQvbWFjODAyMTEvdGtpcC5oCmluZGV4IDFjYWI5YzguLmUzZWNiNjUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90a2lwLmgKKysrIGIvbmV0L21hYzgwMjExL3RraXAuaApAQCAtMTMsMTEgKzEzLDEzIEBACiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSAia2V5LmgiCiAKLXU4ICppZWVlODAyMTFfdGtpcF9hZGRfaXYodTggKnBvcywgc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSwgdTE2IGl2MTYpOwordTggKmllZWU4MDIxMV90a2lwX2FkZF9pdih1OCAqcG9zLCBzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5KTsKIAogaW50IGllZWU4MDIxMV90a2lwX2VuY3J5cHRfZGF0YShzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5LAotCQkJCSB1OCAqcG9zLCBzaXplX3QgcGF5bG9hZF9sZW4sIHU4ICp0YSk7CisJCQkJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXU4ICpwYXlsb2FkLCBzaXplX3QgcGF5bG9hZF9sZW4pOworCiBlbnVtIHsKIAlUS0lQX0RFQ1JZUFRfT0sgPSAwLAogCVRLSVBfREVDUllQVF9OT19FWFRfSVYgPSAtMSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90eC5jIGIvbmV0L21hYzgwMjExL3R4LmMKaW5kZXggNjRlMGY3NS4uOGNiMGQyZCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3R4LmMKKysrIGIvbmV0L21hYzgwMjExL3R4LmMKQEAgLTU4OSw2ICs1ODksOSBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQlpZiAodW5saWtlbHkodHgtPmtleSAmJiB0eC0+a2V5LT5mbGFncyAmIEtFWV9GTEFHX1RBSU5URUQpKQorCQkJcmV0dXJuIFRYX0RST1A7CisKIAkJaWYgKCFza2lwX2h3ICYmIHR4LT5rZXkgJiYKIAkJICAgIHR4LT5rZXktPmZsYWdzICYgS0VZX0ZMQUdfVVBMT0FERURfVE9fSEFSRFdBUkUpCiAJCQlpbmZvLT5jb250cm9sLmh3X2tleSA9ICZ0eC0+a2V5LT5jb25mOwpAQCAtMTQ3NCwxMyArMTQ3NywxNCBAQAogCiAvKiBkZXZpY2UgeG1pdCBoYW5kbGVycyAqLwogCi1zdGF0aWMgaW50IGllZWU4MDIxMV9za2JfcmVzaXplKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorc3RhdGljIGludCBpZWVlODAyMTFfc2tiX3Jlc2l6ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCWludCBoZWFkX25lZWQsIGJvb2wgbWF5X2VuY3J5cHQpCiB7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJaW50IHRhaWxfbmVlZCA9IDA7CiAKLQlpZiAobWF5X2VuY3J5cHQgJiYgbG9jYWwtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250KSB7CisJaWYgKG1heV9lbmNyeXB0ICYmIHNkYXRhLT5jcnlwdG9fdHhfdGFpbHJvb21fbmVlZGVkX2NudCkgewogCQl0YWlsX25lZWQgPSBJRUVFODAyMTFfRU5DUllQVF9UQUlMUk9PTTsKIAkJdGFpbF9uZWVkIC09IHNrYl90YWlscm9vbShza2IpOwogCQl0YWlsX25lZWQgPSBtYXhfdChpbnQsIHRhaWxfbmVlZCwgMCk7CkBAIC0xNTczLDcgKzE1NzcsNyBAQAogCWhlYWRyb29tIC09IHNrYl9oZWFkcm9vbShza2IpOwogCWhlYWRyb29tID0gbWF4X3QoaW50LCAwLCBoZWFkcm9vbSk7CiAKLQlpZiAoaWVlZTgwMjExX3NrYl9yZXNpemUobG9jYWwsIHNrYiwgaGVhZHJvb20sIG1heV9lbmNyeXB0KSkgeworCWlmIChpZWVlODAyMTFfc2tiX3Jlc2l6ZShzZGF0YSwgc2tiLCBoZWFkcm9vbSwgbWF5X2VuY3J5cHQpKSB7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybjsKQEAgLTE5NDAsNyArMTk0NCw3IEBACiAJCWhlYWRfbmVlZCArPSBJRUVFODAyMTFfRU5DUllQVF9IRUFEUk9PTTsKIAkJaGVhZF9uZWVkICs9IGxvY2FsLT50eF9oZWFkcm9vbTsKIAkJaGVhZF9uZWVkID0gbWF4X3QoaW50LCAwLCBoZWFkX25lZWQpOwotCQlpZiAoaWVlZTgwMjExX3NrYl9yZXNpemUobG9jYWwsIHNrYiwgaGVhZF9uZWVkLCB0cnVlKSkKKwkJaWYgKGllZWU4MDIxMV9za2JfcmVzaXplKHNkYXRhLCBza2IsIGhlYWRfbmVlZCwgdHJ1ZSkpCiAJCQlnb3RvIGZhaWw7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdXRpbC5jIGIvbmV0L21hYzgwMjExL3V0aWwuYwppbmRleCBkM2ZlMmQyLi5kZGViMWI5IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdXRpbC5jCisrKyBiL25ldC9tYWM4MDIxMS91dGlsLmMKQEAgLTc5OSw2ICs3OTksNyBAQAogCiAJCXFwYXJhbS51YXBzZCA9IGZhbHNlOwogCisJCWxvY2FsLT50eF9jb25mW3F1ZXVlXSA9IHFwYXJhbTsKIAkJZHJ2X2NvbmZfdHgobG9jYWwsIHF1ZXVlLCAmcXBhcmFtKTsKIAl9CiAKQEAgLTEwMTYsOSArMTAxNywxMCBAQAogfQogCiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2J1aWxkX3Byb2JlX3JlcShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkJICB1OCAqZHN0LAorCQkJCQkgIHU4ICpkc3QsIHUzMiByYXRlbWFzaywKIAkJCQkJICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAotCQkJCQkgIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbikKKwkJCQkJICBjb25zdCB1OCAqaWUsIHNpemVfdCBpZV9sZW4sCisJCQkJCSAgYm9vbCBkaXJlY3RlZCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTAzNSwxNCArMTAzNywyMCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQljaGFuID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKAotCQlsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5jZW50ZXJfZnJlcSk7CisJLyoKKwkgKiBEbyBub3Qgc2VuZCBEUyBDaGFubmVsIHBhcmFtZXRlciBmb3IgZGlyZWN0ZWQgcHJvYmUgcmVxdWVzdHMKKwkgKiBpbiBvcmRlciB0byBtYXhpbWl6ZSB0aGUgY2hhbmNlIHRoYXQgd2UgZ2V0IGEgcmVzcG9uc2UuICBTb21lCisJICogYmFkbHktYmVoYXZlZCBBUHMgZG9uJ3QgcmVzcG9uZCB3aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGluY2x1ZGVkLgorCSAqLworCWlmIChkaXJlY3RlZCkKKwkJY2hhbiA9IDA7CisJZWxzZQorCQljaGFuID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKAorCQkJbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOwogCiAJYnVmX2xlbiA9IGllZWU4MDIxMV9idWlsZF9wcmVxX2llcyhsb2NhbCwgYnVmLCBpZSwgaWVfbGVuLAogCQkJCQkgICBsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kLAotCQkJCQkgICBzZGF0YS0+cmNfcmF0ZWlkeF9tYXNrCi0JCQkJCSAgIFtsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXSwKLQkJCQkJICAgY2hhbik7CisJCQkJCSAgIHJhdGVtYXNrLCBjaGFuKTsKIAogCXNrYiA9IGllZWU4MDIxMV9wcm9iZXJlcV9nZXQoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsCiAJCQkJICAgICBzc2lkLCBzc2lkX2xlbiwKQEAgLTEwNjIsMTEgKzEwNzAsMTMgQEAKIAogdm9pZCBpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHU4ICpkc3QsCiAJCQkgICAgICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAotCQkJICAgICAgY29uc3QgdTggKmllLCBzaXplX3QgaWVfbGVuKQorCQkJICAgICAgY29uc3QgdTggKmllLCBzaXplX3QgaWVfbGVuLAorCQkJICAgICAgdTMyIHJhdGVtYXNrLCBib29sIGRpcmVjdGVkKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQlza2IgPSBpZWVlODAyMTFfYnVpbGRfcHJvYmVfcmVxKHNkYXRhLCBkc3QsIHNzaWQsIHNzaWRfbGVuLCBpZSwgaWVfbGVuKTsKKwlza2IgPSBpZWVlODAyMTFfYnVpbGRfcHJvYmVfcmVxKHNkYXRhLCBkc3QsIHJhdGVtYXNrLCBzc2lkLCBzc2lkX2xlbiwKKwkJCQkJaWUsIGllX2xlbiwgZGlyZWN0ZWQpOwogCWlmIChza2IpCiAJCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYik7CiB9CkBAIC0xMTIzLDcgKzExMzMsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gJmxvY2FsLT5odzsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQlpbnQgcmVzOworCWludCByZXMsIGk7CiAKICNpZmRlZiBDT05GSUdfUE0KIAlpZiAobG9jYWwtPnN1c3BlbmRlZCkKQEAgLTExNDYsMjcgKzExNTYsMzcgQEAKIAl9CiAjZW5kaWYKIAotCS8qIHJlc3RhcnQgaGFyZHdhcmUgKi8KLQlpZiAobG9jYWwtPm9wZW5fY291bnQpIHsKLQkJLyoKLQkJICogVXBvbiByZXN1bWUgaGFyZHdhcmUgY2FuIHNvbWV0aW1lcyBiZSBnb29meSBkdWUgdG8KLQkJICogdmFyaW91cyBwbGF0Zm9ybSAvIGRyaXZlciAvIGJ1cyBpc3N1ZXMsIHNvIHJlc3RhcnRpbmcKLQkJICogdGhlIGRldmljZSBtYXkgYXQgdGltZXMgbm90IHdvcmsgaW1tZWRpYXRlbHkuIFByb3BhZ2F0ZQotCQkgKiB0aGUgZXJyb3IuCi0JCSAqLwotCQlyZXMgPSBkcnZfc3RhcnQobG9jYWwpOwotCQlpZiAocmVzKSB7Ci0JCQlXQVJOKGxvY2FsLT5zdXNwZW5kZWQsICJIYXJkd2FyZSBiZWNhbWUgdW5hdmFpbGFibGUgIgotCQkJICAgICAidXBvbiByZXN1bWUuIFRoaXMgY291bGQgYmUgYSBzb2Z0d2FyZSBpc3N1ZSAiCi0JCQkgICAgICJwcmlvciB0byBzdXNwZW5kIG9yIGEgaGFyZHdhcmUgaXNzdWUuXG4iKTsKLQkJCXJldHVybiByZXM7Ci0JCX0KKwkvKiBzZXR1cCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAqLworCWRydl9zZXRfZnJhZ190aHJlc2hvbGQobG9jYWwsIGh3LT53aXBoeS0+ZnJhZ190aHJlc2hvbGQpOwogCi0JCWllZWU4MDIxMV9sZWRfcmFkaW8obG9jYWwsIHRydWUpOwotCQlpZWVlODAyMTFfbW9kX3RwdF9sZWRfdHJpZyhsb2NhbCwKLQkJCQkJICAgSUVFRTgwMjExX1RQVF9MRURUUklHX0ZMX1JBRElPLCAwKTsKKwkvKiBzZXR1cCBSVFMgdGhyZXNob2xkICovCisJZHJ2X3NldF9ydHNfdGhyZXNob2xkKGxvY2FsLCBody0+d2lwaHktPnJ0c190aHJlc2hvbGQpOworCisJLyogcmVzZXQgY292ZXJhZ2UgY2xhc3MgKi8KKwlkcnZfc2V0X2NvdmVyYWdlX2NsYXNzKGxvY2FsLCBody0+d2lwaHktPmNvdmVyYWdlX2NsYXNzKTsKKworCS8qIGV2ZXJ5dGhpbmcgZWxzZSBoYXBwZW5zIG9ubHkgaWYgSFcgd2FzIHVwICYgcnVubmluZyAqLworCWlmICghbG9jYWwtPm9wZW5fY291bnQpCisJCWdvdG8gd2FrZV91cDsKKworCS8qCisJICogVXBvbiByZXN1bWUgaGFyZHdhcmUgY2FuIHNvbWV0aW1lcyBiZSBnb29meSBkdWUgdG8KKwkgKiB2YXJpb3VzIHBsYXRmb3JtIC8gZHJpdmVyIC8gYnVzIGlzc3Vlcywgc28gcmVzdGFydGluZworCSAqIHRoZSBkZXZpY2UgbWF5IGF0IHRpbWVzIG5vdCB3b3JrIGltbWVkaWF0ZWx5LiBQcm9wYWdhdGUKKwkgKiB0aGUgZXJyb3IuCisJICovCisJcmVzID0gZHJ2X3N0YXJ0KGxvY2FsKTsKKwlpZiAocmVzKSB7CisJCVdBUk4obG9jYWwtPnN1c3BlbmRlZCwgIkhhcmR3YXJlIGJlY2FtZSB1bmF2YWlsYWJsZSAiCisJCSAgICAgInVwb24gcmVzdW1lLiBUaGlzIGNvdWxkIGJlIGEgc29mdHdhcmUgaXNzdWUgIgorCQkgICAgICJwcmlvciB0byBzdXNwZW5kIG9yIGEgaGFyZHdhcmUgaXNzdWUuXG4iKTsKKwkJcmV0dXJuIHJlczsKIAl9CiAKKwlpZWVlODAyMTFfbGVkX3JhZGlvKGxvY2FsLCB0cnVlKTsKKwlpZWVlODAyMTFfbW9kX3RwdF9sZWRfdHJpZyhsb2NhbCwKKwkJCQkgICBJRUVFODAyMTFfVFBUX0xFRFRSSUdfRkxfUkFESU8sIDApOworCiAJLyogYWRkIGludGVyZmFjZXMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpIHsKIAkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOICYmCkBAIC0xMTkwLDExICsxMjEwLDkgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c3RhX210eCk7CiAKLQkvKiBzZXR1cCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAqLwotCWRydl9zZXRfZnJhZ190aHJlc2hvbGQobG9jYWwsIGh3LT53aXBoeS0+ZnJhZ190aHJlc2hvbGQpOwotCi0JLyogc2V0dXAgUlRTIHRocmVzaG9sZCAqLwotCWRydl9zZXRfcnRzX3RocmVzaG9sZChsb2NhbCwgaHctPndpcGh5LT5ydHNfdGhyZXNob2xkKTsKKwkvKiByZWNvbmZpZ3VyZSB0eCBjb25mICovCisJZm9yIChpID0gMDsgaSA8IGh3LT5xdWV1ZXM7IGkrKykKKwkJZHJ2X2NvbmZfdHgobG9jYWwsIGksICZsb2NhbC0+dHhfY29uZltpXSk7CiAKIAkvKiByZWNvbmZpZ3VyZSBoYXJkd2FyZSAqLwogCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIH4wKTsKQEAgLTEzMjEsNiArMTMzOSwzMyBAQAogCXJldHVybiAwOwogfQogCit2b2lkIGllZWU4MDIxMV9yZXN1bWVfZGlzY29ubmVjdChzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXk7CisKKwlpZiAoV0FSTl9PTighdmlmKSkKKwkJcmV0dXJuOworCisJc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKKwlsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKworCWlmIChXQVJOX09OKCFsb2NhbC0+cmVzdW1pbmcpKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTih2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikpCisJCXJldHVybjsKKworCXNkYXRhLT5mbGFncyB8PSBJRUVFODAyMTFfU0RBVEFfRElTQ09OTkVDVF9SRVNVTUU7CisKKwltdXRleF9sb2NrKCZsb2NhbC0+a2V5X210eCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrZXksICZzZGF0YS0+a2V5X2xpc3QsIGxpc3QpCisJCWtleS0+ZmxhZ3MgfD0gS0VZX0ZMQUdfVEFJTlRFRDsKKwltdXRleF91bmxvY2soJmxvY2FsLT5rZXlfbXR4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMV9yZXN1bWVfZGlzY29ubmVjdCk7CisKIHN0YXRpYyBpbnQgY2hlY2tfbWdkX3NtcHMoc3RydWN0IGllZWU4MDIxMV9pZl9tYW5hZ2VkICppZm1nZCwKIAkJCSAgZW51bSBpZWVlODAyMTFfc21wc19tb2RlICpzbXBzX21vZGUpCiB7CkBAIC0xNDM3LDMgKzE0ODIsNDMgQEAKIAogCXJldHVybiBwb3M7CiB9CisKK3N0YXRpYyB2b2lkIF9pZWVlODAyMTFfZW5hYmxlX3Jzc2lfcmVwb3J0cyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkJICAgIGludCByc3NpX21pbl90aG9sZCwKKwkJCQkJICAgIGludCByc3NpX21heF90aG9sZCkKK3sKKwl0cmFjZV9hcGlfZW5hYmxlX3Jzc2lfcmVwb3J0cyhzZGF0YSwgcnNzaV9taW5fdGhvbGQsIHJzc2lfbWF4X3Rob2xkKTsKKworCWlmIChXQVJOX09OKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTY2FsZSB1cCB0aHJlc2hvbGQgdmFsdWVzIGJlZm9yZSBzdG9yaW5nIGl0LCBhcyB0aGUgUlNTSSBhdmVyYWdpbmcKKwkgKiBhbGdvcml0aG0gdXNlcyBhIHNjYWxlZCB1cCB2YWx1ZSBhcyB3ZWxsLiBDaGFuZ2UgdGhpcyBzY2FsaW5nCisJICogZmFjdG9yIGlmIHRoZSBSU1NJIGF2ZXJhZ2luZyBhbGdvcml0aG0gY2hhbmdlcy4KKwkgKi8KKwlzZGF0YS0+dS5tZ2QucnNzaV9taW5fdGhvbGQgPSByc3NpX21pbl90aG9sZCoxNjsKKwlzZGF0YS0+dS5tZ2QucnNzaV9tYXhfdGhvbGQgPSByc3NpX21heF90aG9sZCoxNjsKK30KKwordm9pZCBpZWVlODAyMTFfZW5hYmxlX3Jzc2lfcmVwb3J0cyhzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICBpbnQgcnNzaV9taW5fdGhvbGQsCisJCQkJICAgIGludCByc3NpX21heF90aG9sZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHZpZl90b19zZGF0YSh2aWYpOworCisJV0FSTl9PTihyc3NpX21pbl90aG9sZCA9PSByc3NpX21heF90aG9sZCB8fAorCQlyc3NpX21pbl90aG9sZCA+IHJzc2lfbWF4X3Rob2xkKTsKKworCV9pZWVlODAyMTFfZW5hYmxlX3Jzc2lfcmVwb3J0cyhzZGF0YSwgcnNzaV9taW5fdGhvbGQsCisJCQkJICAgICAgIHJzc2lfbWF4X3Rob2xkKTsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2VuYWJsZV9yc3NpX3JlcG9ydHMpOworCit2b2lkIGllZWU4MDIxMV9kaXNhYmxlX3Jzc2lfcmVwb3J0cyhzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CisKKwlfaWVlZTgwMjExX2VuYWJsZV9yc3NpX3JlcG9ydHMoc2RhdGEsIDAsIDApOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZGlzYWJsZV9yc3NpX3JlcG9ydHMpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dtZS5jIGIvbmV0L21hYzgwMjExL3dtZS5jCmluZGV4IDI4YmMwODQuLjdhNDk1MzIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93bWUuYworKysgYi9uZXQvbWFjODAyMTEvd21lLmMKQEAgLTE1MSw4ICsxNTEsNyBAQAogCQl0aWQgPSBza2ItPnByaW9yaXR5ICYgSUVFRTgwMjExX1FPU19DVExfVEFHMURfTUFTSzsKIAogCQlpZiAodW5saWtlbHkobG9jYWwtPndpZmlfd21lX25vYWNrX3Rlc3QpKQotCQkJYWNrX3BvbGljeSB8PSBRT1NfQ09OVFJPTF9BQ0tfUE9MSUNZX05PQUNLIDw8Ci0JCQkJCVFPU19DT05UUk9MX0FDS19QT0xJQ1lfU0hJRlQ7CisJCQlhY2tfcG9saWN5IHw9IElFRUU4MDIxMV9RT1NfQ1RMX0FDS19QT0xJQ1lfTk9BQ0s7CiAJCS8qIHFvcyBoZWFkZXIgaXMgMiBieXRlcywgc2Vjb25kIHJlc2VydmVkICovCiAJCSpwKysgPSBhY2tfcG9saWN5IHwgdGlkOwogCQkqcCA9IDA7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd21lLmggYi9uZXQvbWFjODAyMTEvd21lLmgKaW5kZXggNjA1M2IxYy4uZmFlYWQ2ZCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3dtZS5oCisrKyBiL25ldC9tYWM4MDIxMS93bWUuaApAQCAtMTMsMTEgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlICJpZWVlODAyMTFfaS5oIgogCi0jZGVmaW5lIFFPU19DT05UUk9MX0FDS19QT0xJQ1lfTk9STUFMIDAKLSNkZWZpbmUgUU9TX0NPTlRST0xfQUNLX1BPTElDWV9OT0FDSyAxCi0KLSNkZWZpbmUgUU9TX0NPTlRST0xfQUNLX1BPTElDWV9TSElGVCA1Ci0KIGV4dGVybiBjb25zdCBpbnQgaWVlZTgwMl8xZF90b19hY1s4XTsKIAogdTE2IGllZWU4MDIxMV9zZWxlY3RfcXVldWUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd29yay5jIGIvbmV0L21hYzgwMjExL3dvcmsuYwppbmRleCBkMmU3ZjBlLi4zODBiOWE3IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvd29yay5jCisrKyBiL25ldC9tYWM4MDIxMS93b3JrLmMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCiAjaW5jbHVkZSAicmF0ZS5oIgorI2luY2x1ZGUgImRyaXZlci1vcHMuaCIKIAogI2RlZmluZSBJRUVFODAyMTFfQVVUSF9USU1FT1VUIChIWiAvIDUpCiAjZGVmaW5lIElFRUU4MDIxMV9BVVRIX01BWF9UUklFUyAzCkBAIC00MjcsNiArNDI4LDE0IEBACiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB3ay0+c2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAKKwlpZiAoIXdrLT5wcm9iZV9hdXRoLnN5bmNlZCkgeworCQlpbnQgcmV0ID0gZHJ2X3R4X3N5bmMobG9jYWwsIHNkYXRhLCB3ay0+ZmlsdGVyX3RhLAorCQkJCSAgICAgIElFRUU4MDIxMV9UWF9TWU5DX0FVVEgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIFdPUktfQUNUX1RJTUVPVVQ7CisJfQorCXdrLT5wcm9iZV9hdXRoLnN5bmNlZCA9IHRydWU7CisKIAl3ay0+cHJvYmVfYXV0aC50cmllcysrOwogCWlmICh3ay0+cHJvYmVfYXV0aC50cmllcyA+IElFRUU4MDIxMV9BVVRIX01BWF9UUklFUykgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRpcmVjdCBwcm9iZSB0byAlcE0gdGltZWQgb3V0XG4iLApAQCAtNDUwLDcgKzQ1OSw4IEBACiAJICogd2lsbCBub3QgYW5zd2VyIHRvIGRpcmVjdCBwYWNrZXQgaW4gdW5hc3NvY2lhdGVkIHN0YXRlLgogCSAqLwogCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcShzZGF0YSwgTlVMTCwgd2stPnByb2JlX2F1dGguc3NpZCwKLQkJCQkgd2stPnByb2JlX2F1dGguc3NpZF9sZW4sIE5VTEwsIDApOworCQkJCSB3ay0+cHJvYmVfYXV0aC5zc2lkX2xlbiwgTlVMTCwgMCwKKwkJCQkgKHUzMikgLTEsIHRydWUpOwogCiAJd2stPnRpbWVvdXQgPSBqaWZmaWVzICsgSUVFRTgwMjExX0FVVEhfVElNRU9VVDsKIAlydW5fYWdhaW4obG9jYWwsIHdrLT50aW1lb3V0KTsKQEAgLTQ2NSw2ICs0NzUsMTQgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHdrLT5zZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAorCWlmICghd2stPnByb2JlX2F1dGguc3luY2VkKSB7CisJCWludCByZXQgPSBkcnZfdHhfc3luYyhsb2NhbCwgc2RhdGEsIHdrLT5maWx0ZXJfdGEsCisJCQkJICAgICAgSUVFRTgwMjExX1RYX1NZTkNfQVVUSCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gV09SS19BQ1RfVElNRU9VVDsKKwl9CisJd2stPnByb2JlX2F1dGguc3luY2VkID0gdHJ1ZTsKKwogCXdrLT5wcm9iZV9hdXRoLnRyaWVzKys7CiAJaWYgKHdrLT5wcm9iZV9hdXRoLnRyaWVzID4gSUVFRTgwMjExX0FVVEhfTUFYX1RSSUVTKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogYXV0aGVudGljYXRpb24gd2l0aCAlcE0iCkBAIC00OTgsNiArNTE2LDE0IEBACiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB3ay0+c2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAKKwlpZiAoIXdrLT5hc3NvYy5zeW5jZWQpIHsKKwkJaW50IHJldCA9IGRydl90eF9zeW5jKGxvY2FsLCBzZGF0YSwgd2stPmZpbHRlcl90YSwKKwkJCQkgICAgICBJRUVFODAyMTFfVFhfU1lOQ19BU1NPQyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gV09SS19BQ1RfVElNRU9VVDsKKwl9CisJd2stPmFzc29jLnN5bmNlZCA9IHRydWU7CisKIAl3ay0+YXNzb2MudHJpZXMrKzsKIAlpZiAod2stPmFzc29jLnRyaWVzID4gSUVFRTgwMjExX0FTU09DX01BWF9UUklFUykgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGFzc29jaWF0aW9uIHdpdGggJXBNIgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dwYS5jIGIvbmV0L21hYzgwMjExL3dwYS5jCmluZGV4IDlkYzNiNWYuLjdiYzg3MDIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93cGEuYworKysgYi9uZXQvbWFjODAyMTEvd3BhLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2Flcy5oPgogCiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKICNpbmNsdWRlICJtaWNoYWVsLmgiCkBAIC0xNDgsMTMgKzE0OSwxOSBAQAogCiB1cGRhdGVfaXY6CiAJLyogdXBkYXRlIElWIGluIGtleSBpbmZvcm1hdGlvbiB0byBiZSBhYmxlIHRvIGRldGVjdCByZXBsYXlzICovCi0JcngtPmtleS0+dS50a2lwLnJ4W3J4LT5xdWV1ZV0uaXYzMiA9IHJ4LT50a2lwX2l2MzI7Ci0JcngtPmtleS0+dS50a2lwLnJ4W3J4LT5xdWV1ZV0uaXYxNiA9IHJ4LT50a2lwX2l2MTY7CisJcngtPmtleS0+dS50a2lwLnJ4W3J4LT5zZWN1cml0eV9pZHhdLml2MzIgPSByeC0+dGtpcF9pdjMyOworCXJ4LT5rZXktPnUudGtpcC5yeFtyeC0+c2VjdXJpdHlfaWR4XS5pdjE2ID0gcngtPnRraXBfaXYxNjsKIAogCXJldHVybiBSWF9DT05USU5VRTsKIAogbWljX2ZhaWw6Ci0JbWFjODAyMTFfZXZfbWljaGFlbF9taWNfZmFpbHVyZShyeC0+c2RhdGEsIHJ4LT5rZXktPmNvbmYua2V5aWR4LAorCS8qCisJICogSW4gc29tZSBjYXNlcyB0aGUga2V5IGNhbiBiZSB1bnNldCAtIGUuZy4gYSBtdWx0aWNhc3QgcGFja2V0LCBpbgorCSAqIGEgZHJpdmVyIHRoYXQgc3VwcG9ydHMgSFcgZW5jcnlwdGlvbi4gU2VuZCB1cCB0aGUga2V5IGlkeCBvbmx5IGlmCisJICogdGhlIGtleSBpcyBzZXQuCisJICovCisJbWFjODAyMTFfZXZfbWljaGFlbF9taWNfZmFpbHVyZShyeC0+c2RhdGEsCisJCQkJCXJ4LT5rZXkgPyByeC0+a2V5LT5jb25mLmtleWlkeCA6IC0xLAogCQkJCQkodm9pZCAqKSBza2ItPmRhdGEsIE5VTEwsIEdGUF9BVE9NSUMpOwogCXJldHVybiBSWF9EUk9QX1VOVVNBQkxFOwogfQpAQCAtMTY1LDYgKzE3Miw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSA9IHR4LT5rZXk7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGhkcmxlbjsKIAlpbnQgbGVuLCB0YWlsOwogCXU4ICpwb3M7CkBAIC0xOTIsMTEgKzIwMCwxMiBAQAogCXBvcyArPSBoZHJsZW47CiAKIAkvKiBJbmNyZWFzZSBJViBmb3IgdGhlIGZyYW1lICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmtleS0+dS50a2lwLnR4bG9jaywgZmxhZ3MpOwogCWtleS0+dS50a2lwLnR4Lml2MTYrKzsKIAlpZiAoa2V5LT51LnRraXAudHguaXYxNiA9PSAwKQogCQlrZXktPnUudGtpcC50eC5pdjMyKys7Ci0KLQlwb3MgPSBpZWVlODAyMTFfdGtpcF9hZGRfaXYocG9zLCBrZXksIGtleS0+dS50a2lwLnR4Lml2MTYpOworCXBvcyA9IGllZWU4MDIxMV90a2lwX2FkZF9pdihwb3MsIGtleSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2V5LT51LnRraXAudHhsb2NrLCBmbGFncyk7CiAKIAkvKiBod2FjY2VsIC0gd2l0aCBzb2Z0d2FyZSBJViAqLwogCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSkKQEAgLTIwNSw5ICsyMTQsOCBAQAogCS8qIEFkZCByb29tIGZvciBJQ1YgKi8KIAlza2JfcHV0KHNrYiwgVEtJUF9JQ1ZfTEVOKTsKIAotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJcmV0dXJuIGllZWU4MDIxMV90a2lwX2VuY3J5cHRfZGF0YSh0eC0+bG9jYWwtPndlcF90eF90Zm0sCi0JCQkJCSAgIGtleSwgcG9zLCBsZW4sIGhkci0+YWRkcjIpOworCQkJCQkgICBrZXksIHNrYiwgcG9zLCBsZW4pOwogfQogCiAKQEAgLTI1NSw3ICsyNjMsNyBAQAogCXJlcyA9IGllZWU4MDIxMV90a2lwX2RlY3J5cHRfZGF0YShyeC0+bG9jYWwtPndlcF9yeF90Zm0sCiAJCQkJCSAga2V5LCBza2ItPmRhdGEgKyBoZHJsZW4sCiAJCQkJCSAgc2tiLT5sZW4gLSBoZHJsZW4sIHJ4LT5zdGEtPnN0YS5hZGRyLAotCQkJCQkgIGhkci0+YWRkcjEsIGh3YWNjZWwsIHJ4LT5xdWV1ZSwKKwkJCQkJICBoZHItPmFkZHIxLCBod2FjY2VsLCByeC0+c2VjdXJpdHlfaWR4LAogCQkJCQkgICZyeC0+dGtpcF9pdjMyLAogCQkJCQkgICZyeC0+dGtpcF9pdjE2KTsKIAlpZiAocmVzICE9IFRLSVBfREVDUllQVF9PSykKQEAgLTI4Myw4ICsyOTEsMTAgQEAKIAl1bnNpZ25lZCBpbnQgaGRybGVuOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAKLQliXzAgPSBzY3JhdGNoICsgMyAqIEFFU19CTE9DS19MRU47Ci0JYWFkID0gc2NyYXRjaCArIDQgKiBBRVNfQkxPQ0tfTEVOOworCW1lbXNldChzY3JhdGNoLCAwLCA2ICogQUVTX0JMT0NLX1NJWkUpOworCisJYl8wID0gc2NyYXRjaCArIDMgKiBBRVNfQkxPQ0tfU0laRTsKKwlhYWQgPSBzY3JhdGNoICsgNCAqIEFFU19CTE9DS19TSVpFOwogCiAJLyoKIAkgKiBNYXNrIEZDOiB6ZXJvIHN1YnR5cGUgYjQgYjUgYjYgKGlmIG5vdCBtZ210KQpAQCAtMzczLDggKzM4MywxMCBAQAogCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXkgPSB0eC0+a2V5OwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlpbnQgaGRybGVuLCBsZW4sIHRhaWw7Ci0JdTggKnBvcywgKnBuOwotCWludCBpOworCXU4ICpwb3M7CisJdTggcG5bNl07CisJdTY0IHBuNjQ7CisJdTggc2NyYXRjaFs2ICogQUVTX0JMT0NLX1NJWkVdOwogCiAJaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5ICYmCiAJICAgICEoaW5mby0+Y29udHJvbC5od19rZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWKSkgewpAQCAtNDAyLDE0ICs0MTQsMTQgQEAKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgcG9zOwogCXBvcyArPSBoZHJsZW47CiAKLQkvKiBQTiA9IFBOICsgMSAqLwotCXBuID0ga2V5LT51LmNjbXAudHhfcG47CisJcG42NCA9IGF0b21pYzY0X2luY19yZXR1cm4oJmtleS0+dS5jY21wLnR4X3BuKTsKIAotCWZvciAoaSA9IENDTVBfUE5fTEVOIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJcG5baV0rKzsKLQkJaWYgKHBuW2ldKQotCQkJYnJlYWs7Ci0JfQorCXBuWzVdID0gcG42NDsKKwlwbls0XSA9IHBuNjQgPj4gODsKKwlwblszXSA9IHBuNjQgPj4gMTY7CisJcG5bMl0gPSBwbjY0ID4+IDI0OworCXBuWzFdID0gcG42NCA+PiAzMjsKKwlwblswXSA9IHBuNjQgPj4gNDA7CiAKIAljY21wX3BuMmhkcihwb3MsIHBuLCBrZXktPmNvbmYua2V5aWR4KTsKIApAQCAtNDE4LDggKzQzMCw4IEBACiAJCXJldHVybiAwOwogCiAJcG9zICs9IENDTVBfSERSX0xFTjsKLQljY21wX3NwZWNpYWxfYmxvY2tzKHNrYiwgcG4sIGtleS0+dS5jY21wLnR4X2NyeXB0b19idWYsIDApOwotCWllZWU4MDIxMV9hZXNfY2NtX2VuY3J5cHQoa2V5LT51LmNjbXAudGZtLCBrZXktPnUuY2NtcC50eF9jcnlwdG9fYnVmLCBwb3MsIGxlbiwKKwljY21wX3NwZWNpYWxfYmxvY2tzKHNrYiwgcG4sIHNjcmF0Y2gsIDApOworCWllZWU4MDIxMV9hZXNfY2NtX2VuY3J5cHQoa2V5LT51LmNjbXAudGZtLCBzY3JhdGNoLCBwb3MsIGxlbiwKIAkJCQkgIHBvcywgc2tiX3B1dChza2IsIENDTVBfTUlDX0xFTikpOwogCiAJcmV0dXJuIDA7CkBAIC00NjYsOCArNDc4LDcgQEAKIAogCWNjbXBfaGRyMnBuKHBuLCBza2ItPmRhdGEgKyBoZHJsZW4pOwogCi0JcXVldWUgPSBpZWVlODAyMTFfaXNfbWdtdChoZHItPmZyYW1lX2NvbnRyb2wpID8KLQkJTlVNX1JYX0RBVEFfUVVFVUVTIDogcngtPnF1ZXVlOworCXF1ZXVlID0gcngtPnNlY3VyaXR5X2lkeDsKIAogCWlmIChtZW1jbXAocG4sIGtleS0+dS5jY21wLnJ4X3BuW3F1ZXVlXSwgQ0NNUF9QTl9MRU4pIDw9IDApIHsKIAkJa2V5LT51LmNjbXAucmVwbGF5cysrOwpAQCAtNDc1LDExICs0ODYsMTIgQEAKIAl9CiAKIAlpZiAoIShzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX0RFQ1JZUFRFRCkpIHsKKwkJdTggc2NyYXRjaFs2ICogQUVTX0JMT0NLX1NJWkVdOwogCQkvKiBoYXJkd2FyZSBkaWRuJ3QgZGVjcnlwdC92ZXJpZnkgTUlDICovCi0JCWNjbXBfc3BlY2lhbF9ibG9ja3Moc2tiLCBwbiwga2V5LT51LmNjbXAucnhfY3J5cHRvX2J1ZiwgMSk7CisJCWNjbXBfc3BlY2lhbF9ibG9ja3Moc2tiLCBwbiwgc2NyYXRjaCwgMSk7CiAKIAkJaWYgKGllZWU4MDIxMV9hZXNfY2NtX2RlY3J5cHQoCi0JCQkgICAga2V5LT51LmNjbXAudGZtLCBrZXktPnUuY2NtcC5yeF9jcnlwdG9fYnVmLAorCQkJICAgIGtleS0+dS5jY21wLnRmbSwgc2NyYXRjaCwKIAkJCSAgICBza2ItPmRhdGEgKyBoZHJsZW4gKyBDQ01QX0hEUl9MRU4sIGRhdGFfbGVuLAogCQkJICAgIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gQ0NNUF9NSUNfTEVOLAogCQkJICAgIHNrYi0+ZGF0YSArIGhkcmxlbiArIENDTVBfSERSX0xFTikpCkBAIC01MTAsNiArNTIyLDE2IEBACiB9CiAKIAorc3RhdGljIGlubGluZSB2b2lkIGJpcF9pcG5fc2V0NjQodTggKmQsIHU2NCBwbikKK3sKKwkqZCsrID0gcG47CisJKmQrKyA9IHBuID4+IDg7CisJKmQrKyA9IHBuID4+IDE2OworCSpkKysgPSBwbiA+PiAyNDsKKwkqZCsrID0gcG4gPj4gMzI7CisJKmQgPSBwbiA+PiA0MDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGJpcF9pcG5fc3dhcCh1OCAqZCwgY29uc3QgdTggKnMpCiB7CiAJKmQrKyA9IHNbNV07CkBAIC01MjgsOCArNTUwLDggQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSA9IHR4LT5rZXk7CiAJc3RydWN0IGllZWU4MDIxMV9tbWllICptbWllOwotCXU4ICpwbiwgYWFkWzIwXTsKLQlpbnQgaTsKKwl1OCBhYWRbMjBdOworCXU2NCBwbjY0OwogCiAJaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5KQogCQlyZXR1cm4gMDsKQEAgLTU0MywyMiArNTY1LDE3IEBACiAJbW1pZS0+a2V5X2lkID0gY3B1X3RvX2xlMTYoa2V5LT5jb25mLmtleWlkeCk7CiAKIAkvKiBQTiA9IFBOICsgMSAqLwotCXBuID0ga2V5LT51LmFlc19jbWFjLnR4X3BuOworCXBuNjQgPSBhdG9taWM2NF9pbmNfcmV0dXJuKCZrZXktPnUuYWVzX2NtYWMudHhfcG4pOwogCi0JZm9yIChpID0gc2l6ZW9mKGtleS0+dS5hZXNfY21hYy50eF9wbikgLSAxOyBpID49IDA7IGktLSkgewotCQlwbltpXSsrOwotCQlpZiAocG5baV0pCi0JCQlicmVhazsKLQl9Ci0JYmlwX2lwbl9zd2FwKG1taWUtPnNlcXVlbmNlX251bWJlciwgcG4pOworCWJpcF9pcG5fc2V0NjQobW1pZS0+c2VxdWVuY2VfbnVtYmVyLCBwbjY0KTsKIAogCWJpcF9hYWQoc2tiLCBhYWQpOwogCiAJLyoKIAkgKiBNSUMgPSBBRVMtMTI4LUNNQUMoSUdUSywgQUFEIHx8IE1hbmFnZW1lbnQgRnJhbWUgQm9keSB8fCBNTUlFLCA2NCkKIAkgKi8KLQlpZWVlODAyMTFfYWVzX2NtYWMoa2V5LT51LmFlc19jbWFjLnRmbSwga2V5LT51LmFlc19jbWFjLnR4X2NyeXB0b19idWYsCi0JCQkgICBhYWQsIHNrYi0+ZGF0YSArIDI0LCBza2ItPmxlbiAtIDI0LCBtbWllLT5taWMpOworCWllZWU4MDIxMV9hZXNfY21hYyhrZXktPnUuYWVzX2NtYWMudGZtLCBhYWQsCisJCQkgICBza2ItPmRhdGEgKyAyNCwgc2tiLT5sZW4gLSAyNCwgbW1pZS0+bWljKTsKIAogCXJldHVybiBUWF9DT05USU5VRTsKIH0KQEAgLTU5Niw4ICs2MTMsNyBAQAogCWlmICghKHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfREVDUllQVEVEKSkgewogCQkvKiBoYXJkd2FyZSBkaWRuJ3QgZGVjcnlwdC92ZXJpZnkgTUlDICovCiAJCWJpcF9hYWQoc2tiLCBhYWQpOwotCQlpZWVlODAyMTFfYWVzX2NtYWMoa2V5LT51LmFlc19jbWFjLnRmbSwKLQkJCQkgICBrZXktPnUuYWVzX2NtYWMucnhfY3J5cHRvX2J1ZiwgYWFkLAorCQlpZWVlODAyMTFfYWVzX2NtYWMoa2V5LT51LmFlc19jbWFjLnRmbSwgYWFkLAogCQkJCSAgIHNrYi0+ZGF0YSArIDI0LCBza2ItPmxlbiAtIDI0LCBtaWMpOwogCQlpZiAobWVtY21wKG1pYywgbW1pZS0+bWljLCBzaXplb2YobW1pZS0+bWljKSkgIT0gMCkgewogCQkJa2V5LT51LmFlc19jbWFjLmljdmVycm9ycysrOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9LY29uZmlnIGIvbmV0L25ldGZpbHRlci9pcHNldC9LY29uZmlnCmluZGV4IDJjNWIzNDguLmJhMzZjMjggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvS2NvbmZpZworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L0tjb25maWcKQEAgLTEwOSw2ICsxMDksMTYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBJUF9TRVRfSEFTSF9ORVRJRkFDRQorCXRyaXN0YXRlICJoYXNoOm5ldCxpZmFjZSBzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX1NFVAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIGhhc2g6bmV0LGlmYWNlIHNldCB0eXBlIHN1cHBvcnQsIGJ5IHdoaWNoCisJICBvbmUgY2FuIHN0b3JlIElQdjQvSVB2NiBuZXR3b3JrIGFkZHJlc3MvcHJlZml4IGFuZAorCSAgaW50ZXJmYWNlIG5hbWUgcGFpcnMgYXMgZWxlbWVudHMgaW4gYSBzZXQuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgSVBfU0VUX0xJU1RfU0VUCiAJdHJpc3RhdGUgImxpc3Q6c2V0IHNldCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVBfU0VUCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L01ha2VmaWxlIGIvbmV0L25ldGZpbHRlci9pcHNldC9NYWtlZmlsZQppbmRleCA1YWRiZGFiLi42ZTk2NWVjIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L01ha2VmaWxlCisrKyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvTWFrZWZpbGUKQEAgLTE5LDYgKzE5LDcgQEAKIG9iai0kKENPTkZJR19JUF9TRVRfSEFTSF9JUFBPUlRORVQpICs9IGlwX3NldF9oYXNoX2lwcG9ydG5ldC5vCiBvYmotJChDT05GSUdfSVBfU0VUX0hBU0hfTkVUKSArPSBpcF9zZXRfaGFzaF9uZXQubwogb2JqLSQoQ09ORklHX0lQX1NFVF9IQVNIX05FVFBPUlQpICs9IGlwX3NldF9oYXNoX25ldHBvcnQubworb2JqLSQoQ09ORklHX0lQX1NFVF9IQVNIX05FVElGQUNFKSArPSBpcF9zZXRfaGFzaF9uZXRpZmFjZS5vCiAKICMgbGlzdCB0eXBlcwogb2JqLSQoQ09ORklHX0lQX1NFVF9MSVNUX1NFVCkgKz0gaXBfc2V0X2xpc3Rfc2V0Lm8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2JpdG1hcF9pcC5jIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYml0bWFwX2lwLmMKaW5kZXggYmEyZDE2Ni4uZTNlNzM5OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYml0bWFwX2lwLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYml0bWFwX2lwLmMKQEAgLTU0LDcgKzU0LDcgQEAKIH0KIAogc3RhdGljIGludAotYml0bWFwX2lwX3Rlc3Qoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQpCitiaXRtYXBfaXBfdGVzdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCwgdTMyIGZsYWdzKQogewogCWNvbnN0IHN0cnVjdCBiaXRtYXBfaXAgKm1hcCA9IHNldC0+ZGF0YTsKIAl1MTYgaWQgPSAqKHUxNiAqKXZhbHVlOwpAQCAtNjMsNyArNjMsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1iaXRtYXBfaXBfYWRkKHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0KQorYml0bWFwX2lwX2FkZChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCwgdTMyIGZsYWdzKQogewogCXN0cnVjdCBiaXRtYXBfaXAgKm1hcCA9IHNldC0+ZGF0YTsKIAl1MTYgaWQgPSAqKHUxNiAqKXZhbHVlOwpAQCAtNzUsNyArNzUsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1iaXRtYXBfaXBfZGVsKHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0KQorYml0bWFwX2lwX2RlbChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCwgdTMyIGZsYWdzKQogewogCXN0cnVjdCBiaXRtYXBfaXAgKm1hcCA9IHNldC0+ZGF0YTsKIAl1MTYgaWQgPSAqKHUxNiAqKXZhbHVlOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAvKiBUaW1lb3V0IHZhcmlhbnQgKi8KIAogc3RhdGljIGludAotYml0bWFwX2lwX3R0ZXN0KHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0KQorYml0bWFwX2lwX3R0ZXN0KHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0LCB1MzIgZmxhZ3MpCiB7CiAJY29uc3Qgc3RydWN0IGJpdG1hcF9pcCAqbWFwID0gc2V0LT5kYXRhOwogCWNvbnN0IHVuc2lnbmVkIGxvbmcgKm1lbWJlcnMgPSBtYXAtPm1lbWJlcnM7CkBAIC0xNDEsMTMgKzE0MSwxMyBAQAogfQogCiBzdGF0aWMgaW50Ci1iaXRtYXBfaXBfdGFkZChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCkKK2JpdG1hcF9pcF90YWRkKHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0LCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGJpdG1hcF9pcCAqbWFwID0gc2V0LT5kYXRhOwogCXVuc2lnbmVkIGxvbmcgKm1lbWJlcnMgPSBtYXAtPm1lbWJlcnM7CiAJdTE2IGlkID0gKih1MTYgKil2YWx1ZTsKIAotCWlmIChpcF9zZXRfdGltZW91dF90ZXN0KG1lbWJlcnNbaWRdKSkKKwlpZiAoaXBfc2V0X3RpbWVvdXRfdGVzdChtZW1iZXJzW2lkXSkgJiYgIShmbGFncyAmIElQU0VUX0ZMQUdfRVhJU1QpKQogCQlyZXR1cm4gLUlQU0VUX0VSUl9FWElTVDsKIAogCW1lbWJlcnNbaWRdID0gaXBfc2V0X3RpbWVvdXRfc2V0KHRpbWVvdXQpOwpAQCAtMTU2LDcgKzE1Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWJpdG1hcF9pcF90ZGVsKHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0KQorYml0bWFwX2lwX3RkZWwoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQsIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgYml0bWFwX2lwICptYXAgPSBzZXQtPmRhdGE7CiAJdW5zaWduZWQgbG9uZyAqbWVtYmVycyA9IG1hcC0+bWVtYmVyczsKQEAgLTIxOSwyNCArMjE5LDI1IEBACiAKIHN0YXRpYyBpbnQKIGJpdG1hcF9pcF9rYWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1OCBwZiwgdTggZGltLCB1OCBmbGFncykKKwkgICAgICAgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCSAgICAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIGNvbnN0IHN0cnVjdCBpcF9zZXRfYWR0X29wdCAqb3B0KQogewogCXN0cnVjdCBiaXRtYXBfaXAgKm1hcCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CiAJdTMyIGlwOwogCi0JaXAgPSBudG9obChpcDRhZGRyKHNrYiwgZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQykpOworCWlwID0gbnRvaGwoaXA0YWRkcihza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQykpOwogCWlmIChpcCA8IG1hcC0+Zmlyc3RfaXAgfHwgaXAgPiBtYXAtPmxhc3RfaXApCiAJCXJldHVybiAtSVBTRVRfRVJSX0JJVE1BUF9SQU5HRTsKIAogCWlwID0gaXBfdG9faWQobWFwLCBpcCk7CiAKLQlyZXR1cm4gYWR0Zm4oc2V0LCAmaXAsIG1hcC0+dGltZW91dCk7CisJcmV0dXJuIGFkdGZuKHNldCwgJmlwLCBvcHRfdGltZW91dChvcHQsIG1hcCksIG9wdC0+Y21kZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CiBiaXRtYXBfaXBfdWFkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHN0cnVjdCBubGF0dHIgKnRiW10sCi0JICAgICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTMyICpsaW5lbm8sIHUzMiBmbGFncykKKwkgICAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzLCBib29sIHJldHJpZWQpCiB7CiAJc3RydWN0IGJpdG1hcF9pcCAqbWFwID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKQEAgLTI2Niw3ICsyNjcsNyBAQAogCiAJaWYgKGFkdCA9PSBJUFNFVF9URVNUKSB7CiAJCWlkID0gaXBfdG9faWQobWFwLCBpcCk7Ci0JCXJldHVybiBhZHRmbihzZXQsICZpZCwgdGltZW91dCk7CisJCXJldHVybiBhZHRmbihzZXQsICZpZCwgdGltZW91dCwgZmxhZ3MpOwogCX0KIAogCWlmICh0YltJUFNFVF9BVFRSX0lQX1RPXSkgewpAQCAtMjgzLDggKzI4NCw3IEBACiAKIAkJaWYgKGNpZHIgPiAzMikKIAkJCXJldHVybiAtSVBTRVRfRVJSX0lOVkFMSURfQ0lEUjsKLQkJaXAgJj0gaXBfc2V0X2hvc3RtYXNrKGNpZHIpOwotCQlpcF90byA9IGlwIHwgfmlwX3NldF9ob3N0bWFzayhjaWRyKTsKKwkJaXBfc2V0X21hc2tfZnJvbV90byhpcCwgaXBfdG8sIGNpZHIpOwogCX0gZWxzZQogCQlpcF90byA9IGlwOwogCkBAIC0yOTMsNyArMjkzLDcgQEAKIAogCWZvciAoOyAhYmVmb3JlKGlwX3RvLCBpcCk7IGlwICs9IG1hcC0+aG9zdHMpIHsKIAkJaWQgPSBpcF90b19pZChtYXAsIGlwKTsKLQkJcmV0ID0gYWR0Zm4oc2V0LCAmaWQsIHRpbWVvdXQpOworCQlyZXQgPSBhZHRmbihzZXQsICZpZCwgdGltZW91dCwgZmxhZ3MpOwogCiAJCWlmIChyZXQgJiYgIWlwX3NldF9lZXhpc3QocmV0LCBmbGFncykpCiAJCQlyZXR1cm4gcmV0OwpAQCAtNDc4LDcgKzQ3OCw3IEBACiAKIAkJaWYgKGNpZHIgPj0gMzIpCiAJCQlyZXR1cm4gLUlQU0VUX0VSUl9JTlZBTElEX0NJRFI7Ci0JCWxhc3RfaXAgPSBmaXJzdF9pcCB8IH5pcF9zZXRfaG9zdG1hc2soY2lkcik7CisJCWlwX3NldF9tYXNrX2Zyb21fdG8oZmlyc3RfaXAsIGxhc3RfaXAsIGNpZHIpOwogCX0gZWxzZQogCQlyZXR1cm4gLUlQU0VUX0VSUl9QUk9UT0NPTDsKIApAQCAtNTUxLDcgKzU1MSw4IEBACiAJLmZlYXR1cmVzCT0gSVBTRVRfVFlQRV9JUCwKIAkuZGltZW5zaW9uCT0gSVBTRVRfRElNX09ORSwKIAkuZmFtaWx5CQk9IEFGX0lORVQsCi0JLnJldmlzaW9uCT0gMCwKKwkucmV2aXNpb25fbWluCT0gMCwKKwkucmV2aXNpb25fbWF4CT0gMCwKIAkuY3JlYXRlCQk9IGJpdG1hcF9pcF9jcmVhdGUsCiAJLmNyZWF0ZV9wb2xpY3kJPSB7CiAJCVtJUFNFVF9BVFRSX0lQXQkJPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYml0bWFwX2lwbWFjLmMgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9iaXRtYXBfaXBtYWMuYwppbmRleCBhMjc0MzAwLi41NjA5NmY1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9iaXRtYXBfaXBtYWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9iaXRtYXBfaXBtYWMuYwpAQCAtOTksNyArOTksNyBAQAogLyogQmFzZSB2YXJpYW50ICovCiAKIHN0YXRpYyBpbnQKLWJpdG1hcF9pcG1hY190ZXN0KHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0KQorYml0bWFwX2lwbWFjX3Rlc3Qoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQsIHUzMiBmbGFncykKIHsKIAljb25zdCBzdHJ1Y3QgYml0bWFwX2lwbWFjICptYXAgPSBzZXQtPmRhdGE7CiAJY29uc3Qgc3RydWN0IGlwbWFjICpkYXRhID0gdmFsdWU7CkBAIC0xMTcsNyArMTE3LDcgQEAKIH0KIAogc3RhdGljIGludAotYml0bWFwX2lwbWFjX2FkZChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCkKK2JpdG1hcF9pcG1hY19hZGQoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQsIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgYml0bWFwX2lwbWFjICptYXAgPSBzZXQtPmRhdGE7CiAJY29uc3Qgc3RydWN0IGlwbWFjICpkYXRhID0gdmFsdWU7CkBAIC0xNDYsNyArMTQ2LDcgQEAKIH0KIAogc3RhdGljIGludAotYml0bWFwX2lwbWFjX2RlbChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCkKK2JpdG1hcF9pcG1hY19kZWwoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQsIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgYml0bWFwX2lwbWFjICptYXAgPSBzZXQtPmRhdGE7CiAJY29uc3Qgc3RydWN0IGlwbWFjICpkYXRhID0gdmFsdWU7CkBAIC0yMTIsNyArMjEyLDcgQEAKIC8qIFRpbWVvdXQgdmFyaWFudCAqLwogCiBzdGF0aWMgaW50Ci1iaXRtYXBfaXBtYWNfdHRlc3Qoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQpCitiaXRtYXBfaXBtYWNfdHRlc3Qoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQsIHUzMiBmbGFncykKIHsKIAljb25zdCBzdHJ1Y3QgYml0bWFwX2lwbWFjICptYXAgPSBzZXQtPmRhdGE7CiAJY29uc3Qgc3RydWN0IGlwbWFjICpkYXRhID0gdmFsdWU7CkBAIC0yMzEsMTUgKzIzMSwxNiBAQAogfQogCiBzdGF0aWMgaW50Ci1iaXRtYXBfaXBtYWNfdGFkZChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCkKK2JpdG1hcF9pcG1hY190YWRkKHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0LCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGJpdG1hcF9pcG1hYyAqbWFwID0gc2V0LT5kYXRhOwogCWNvbnN0IHN0cnVjdCBpcG1hYyAqZGF0YSA9IHZhbHVlOwogCXN0cnVjdCBpcG1hY190ZWxlbSAqZWxlbSA9IGJpdG1hcF9pcG1hY19lbGVtKG1hcCwgZGF0YS0+aWQpOworCWJvb2wgZmxhZ19leGlzdCA9IGZsYWdzICYgSVBTRVRfRkxBR19FWElTVDsKIAogCXN3aXRjaCAoZWxlbS0+bWF0Y2gpIHsKIAljYXNlIE1BQ19VTlNFVDoKLQkJaWYgKCFkYXRhLT5ldGhlcikKKwkJaWYgKCEoZGF0YS0+ZXRoZXIgfHwgZmxhZ19leGlzdCkpCiAJCQkvKiBBbHJlYWR5IGFkZGVkIHdpdGhvdXQgZXRoZXJuZXQgYWRkcmVzcyAqLwogCQkJcmV0dXJuIC1JUFNFVF9FUlJfRVhJU1Q7CiAJCS8qIEZpbGwgdGhlIE1BQyBhZGRyZXNzIGFuZCBhY3RpdmF0ZSB0aGUgdGltZXIgKi8KQEAgLTI1MSw3ICsyNTIsNyBAQAogCQllbGVtLT50aW1lb3V0ID0gaXBfc2V0X3RpbWVvdXRfc2V0KHRpbWVvdXQpOwogCQlicmVhazsKIAljYXNlIE1BQ19GSUxMRUQ6Ci0JCWlmICghYml0bWFwX2V4cGlyZWQobWFwLCBkYXRhLT5pZCkpCisJCWlmICghKGJpdG1hcF9leHBpcmVkKG1hcCwgZGF0YS0+aWQpIHx8IGZsYWdfZXhpc3QpKQogCQkJcmV0dXJuIC1JUFNFVF9FUlJfRVhJU1Q7CiAJCS8qIEZhbGwgdGhyb3VnaCAqLwogCWNhc2UgTUFDX0VNUFRZOgpAQCAtMjczLDcgKzI3NCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWJpdG1hcF9pcG1hY190ZGVsKHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0KQorYml0bWFwX2lwbWFjX3RkZWwoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQsIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgYml0bWFwX2lwbWFjICptYXAgPSBzZXQtPmRhdGE7CiAJY29uc3Qgc3RydWN0IGlwbWFjICpkYXRhID0gdmFsdWU7CkBAIC0zMzcsMTcgKzMzOCwxOCBAQAogCiBzdGF0aWMgaW50CiBiaXRtYXBfaXBtYWNfa2FkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgZW51bSBpcHNldF9hZHQgYWR0LCB1OCBwZiwgdTggZGltLCB1OCBmbGFncykKKwkJICBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIsCisJCSAgZW51bSBpcHNldF9hZHQgYWR0LCBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCkKIHsKIAlzdHJ1Y3QgYml0bWFwX2lwbWFjICptYXAgPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwogCXN0cnVjdCBpcG1hYyBkYXRhOwogCiAJLyogTUFDIGNhbiBiZSBzcmMgb25seSAqLwotCWlmICghKGZsYWdzICYgSVBTRVRfRElNX1RXT19TUkMpKQorCWlmICghKG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fVFdPX1NSQykpCiAJCXJldHVybiAwOwogCi0JZGF0YS5pZCA9IG50b2hsKGlwNGFkZHIoc2tiLCBmbGFncyAmIElQU0VUX0RJTV9PTkVfU1JDKSk7CisJZGF0YS5pZCA9IG50b2hsKGlwNGFkZHIoc2tiLCBvcHQtPmZsYWdzICYgSVBTRVRfRElNX09ORV9TUkMpKTsKIAlpZiAoZGF0YS5pZCA8IG1hcC0+Zmlyc3RfaXAgfHwgZGF0YS5pZCA+IG1hcC0+bGFzdF9pcCkKIAkJcmV0dXJuIC1JUFNFVF9FUlJfQklUTUFQX1JBTkdFOwogCkBAIC0zNTksMTIgKzM2MSwxMiBAQAogCWRhdGEuaWQgLT0gbWFwLT5maXJzdF9pcDsKIAlkYXRhLmV0aGVyID0gZXRoX2hkcihza2IpLT5oX3NvdXJjZTsKIAotCXJldHVybiBhZHRmbihzZXQsICZkYXRhLCBtYXAtPnRpbWVvdXQpOworCXJldHVybiBhZHRmbihzZXQsICZkYXRhLCBvcHRfdGltZW91dChvcHQsIG1hcCksIG9wdC0+Y21kZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CiBiaXRtYXBfaXBtYWNfdWFkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCSAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzKQorCQkgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTMyICpsaW5lbm8sIHUzMiBmbGFncywgYm9vbCByZXRyaWVkKQogewogCWNvbnN0IHN0cnVjdCBiaXRtYXBfaXBtYWMgKm1hcCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CkBAIC0zOTksNyArNDAxLDcgQEAKIAogCWRhdGEuaWQgLT0gbWFwLT5maXJzdF9pcDsKIAotCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQpOworCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQsIGZsYWdzKTsKIAogCXJldHVybiBpcF9zZXRfZWV4aXN0KHJldCwgZmxhZ3MpID8gMCA6IHJldDsKIH0KQEAgLTU3Nyw3ICs1NzksNyBAQAogCiAJCWlmIChjaWRyID49IDMyKQogCQkJcmV0dXJuIC1JUFNFVF9FUlJfSU5WQUxJRF9DSURSOwotCQlsYXN0X2lwID0gZmlyc3RfaXAgfCB+aXBfc2V0X2hvc3RtYXNrKGNpZHIpOworCQlpcF9zZXRfbWFza19mcm9tX3RvKGZpcnN0X2lwLCBsYXN0X2lwLCBjaWRyKTsKIAl9IGVsc2UKIAkJcmV0dXJuIC1JUFNFVF9FUlJfUFJPVE9DT0w7CiAKQEAgLTYyMiw3ICs2MjQsOCBAQAogCS5mZWF0dXJlcwk9IElQU0VUX1RZUEVfSVAgfCBJUFNFVF9UWVBFX01BQywKIAkuZGltZW5zaW9uCT0gSVBTRVRfRElNX1RXTywKIAkuZmFtaWx5CQk9IEFGX0lORVQsCi0JLnJldmlzaW9uCT0gMCwKKwkucmV2aXNpb25fbWluCT0gMCwKKwkucmV2aXNpb25fbWF4CT0gMCwKIAkuY3JlYXRlCQk9IGJpdG1hcF9pcG1hY19jcmVhdGUsCiAJLmNyZWF0ZV9wb2xpY3kJPSB7CiAJCVtJUFNFVF9BVFRSX0lQXQkJPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LApAQCAtNjMyLDcgKzYzNSw4IEBACiAJfSwKIAkuYWR0X3BvbGljeQk9IHsKIAkJW0lQU0VUX0FUVFJfSVBdCQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCi0JCVtJUFNFVF9BVFRSX0VUSEVSXQk9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCAubGVuICA9IEVUSF9BTEVOIH0sCisJCVtJUFNFVF9BVFRSX0VUSEVSXQk9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAorCQkJCQkgICAgLmxlbiAgPSBFVEhfQUxFTiB9LAogCQlbSVBTRVRfQVRUUl9USU1FT1VUXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJCVtJUFNFVF9BVFRSX0xJTkVOT10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCX0sCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9iaXRtYXBfcG9ydC5jIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYml0bWFwX3BvcnQuYwppbmRleCA2YjM4ZWI4Li4yOWJhOTNiIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9iaXRtYXBfcG9ydC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2JpdG1hcF9wb3J0LmMKQEAgLTQwLDcgKzQwLDcgQEAKIC8qIEJhc2UgdmFyaWFudCAqLwogCiBzdGF0aWMgaW50Ci1iaXRtYXBfcG9ydF90ZXN0KHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0KQorYml0bWFwX3BvcnRfdGVzdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCwgdTMyIGZsYWdzKQogewogCWNvbnN0IHN0cnVjdCBiaXRtYXBfcG9ydCAqbWFwID0gc2V0LT5kYXRhOwogCXUxNiBpZCA9ICoodTE2ICopdmFsdWU7CkBAIC00OSw3ICs0OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWJpdG1hcF9wb3J0X2FkZChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCkKK2JpdG1hcF9wb3J0X2FkZChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCwgdTMyIGZsYWdzKQogewogCXN0cnVjdCBiaXRtYXBfcG9ydCAqbWFwID0gc2V0LT5kYXRhOwogCXUxNiBpZCA9ICoodTE2ICopdmFsdWU7CkBAIC02MSw3ICs2MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWJpdG1hcF9wb3J0X2RlbChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCkKK2JpdG1hcF9wb3J0X2RlbChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCwgdTMyIGZsYWdzKQogewogCXN0cnVjdCBiaXRtYXBfcG9ydCAqbWFwID0gc2V0LT5kYXRhOwogCXUxNiBpZCA9ICoodTE2ICopdmFsdWU7CkBAIC0xMTksNyArMTE5LDcgQEAKIC8qIFRpbWVvdXQgdmFyaWFudCAqLwogCiBzdGF0aWMgaW50Ci1iaXRtYXBfcG9ydF90dGVzdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCkKK2JpdG1hcF9wb3J0X3R0ZXN0KHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0LCB1MzIgZmxhZ3MpCiB7CiAJY29uc3Qgc3RydWN0IGJpdG1hcF9wb3J0ICptYXAgPSBzZXQtPmRhdGE7CiAJY29uc3QgdW5zaWduZWQgbG9uZyAqbWVtYmVycyA9IG1hcC0+bWVtYmVyczsKQEAgLTEyOSwxMyArMTI5LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQKLWJpdG1hcF9wb3J0X3RhZGQoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQpCitiaXRtYXBfcG9ydF90YWRkKHN0cnVjdCBpcF9zZXQgKnNldCwgdm9pZCAqdmFsdWUsIHUzMiB0aW1lb3V0LCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGJpdG1hcF9wb3J0ICptYXAgPSBzZXQtPmRhdGE7CiAJdW5zaWduZWQgbG9uZyAqbWVtYmVycyA9IG1hcC0+bWVtYmVyczsKIAl1MTYgaWQgPSAqKHUxNiAqKXZhbHVlOwogCi0JaWYgKGlwX3NldF90aW1lb3V0X3Rlc3QobWVtYmVyc1tpZF0pKQorCWlmIChpcF9zZXRfdGltZW91dF90ZXN0KG1lbWJlcnNbaWRdKSAmJiAhKGZsYWdzICYgSVBTRVRfRkxBR19FWElTVCkpCiAJCXJldHVybiAtSVBTRVRfRVJSX0VYSVNUOwogCiAJbWVtYmVyc1tpZF0gPSBpcF9zZXRfdGltZW91dF9zZXQodGltZW91dCk7CkBAIC0xNDQsNyArMTQ0LDcgQEAKIH0KIAogc3RhdGljIGludAotYml0bWFwX3BvcnRfdGRlbChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHZvaWQgKnZhbHVlLCB1MzIgdGltZW91dCkKK2JpdG1hcF9wb3J0X3RkZWwoc3RydWN0IGlwX3NldCAqc2V0LCB2b2lkICp2YWx1ZSwgdTMyIHRpbWVvdXQsIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgYml0bWFwX3BvcnQgKm1hcCA9IHNldC0+ZGF0YTsKIAl1bnNpZ25lZCBsb25nICptZW1iZXJzID0gbWFwLT5tZW1iZXJzOwpAQCAtMjA4LDE0ICsyMDgsMTYgQEAKIAogc3RhdGljIGludAogYml0bWFwX3BvcnRfa2FkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSBlbnVtIGlwc2V0X2FkdCBhZHQsIHU4IHBmLCB1OCBkaW0sIHU4IGZsYWdzKQorCQkgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCQkgZW51bSBpcHNldF9hZHQgYWR0LCBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCkKIHsKIAlzdHJ1Y3QgYml0bWFwX3BvcnQgKm1hcCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CiAJX19iZTE2IF9fcG9ydDsKIAl1MTYgcG9ydCA9IDA7CiAKLQlpZiAoIWlwX3NldF9nZXRfaXBfcG9ydChza2IsIHBmLCBmbGFncyAmIElQU0VUX0RJTV9PTkVfU1JDLCAmX19wb3J0KSkKKwlpZiAoIWlwX3NldF9nZXRfaXBfcG9ydChza2IsIG9wdC0+ZmFtaWx5LAorCQkJCW9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQywgJl9fcG9ydCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcG9ydCA9IG50b2hzKF9fcG9ydCk7CkBAIC0yMjUsMTIgKzIyNywxMiBAQAogCiAJcG9ydCAtPSBtYXAtPmZpcnN0X3BvcnQ7CiAKLQlyZXR1cm4gYWR0Zm4oc2V0LCAmcG9ydCwgbWFwLT50aW1lb3V0KTsKKwlyZXR1cm4gYWR0Zm4oc2V0LCAmcG9ydCwgb3B0X3RpbWVvdXQob3B0LCBtYXApLCBvcHQtPmNtZGZsYWdzKTsKIH0KIAogc3RhdGljIGludAogYml0bWFwX3BvcnRfdWFkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCSBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MpCisJCSBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MsIGJvb2wgcmV0cmllZCkKIHsKIAlzdHJ1Y3QgYml0bWFwX3BvcnQgKm1hcCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CkBAIC0yNTksNyArMjYxLDcgQEAKIAogCWlmIChhZHQgPT0gSVBTRVRfVEVTVCkgewogCQlpZCA9IHBvcnQgLSBtYXAtPmZpcnN0X3BvcnQ7Ci0JCXJldHVybiBhZHRmbihzZXQsICZpZCwgdGltZW91dCk7CisJCXJldHVybiBhZHRmbihzZXQsICZpZCwgdGltZW91dCwgZmxhZ3MpOwogCX0KIAogCWlmICh0YltJUFNFVF9BVFRSX1BPUlRfVE9dKSB7CkBAIC0yNzcsNyArMjc5LDcgQEAKIAogCWZvciAoOyBwb3J0IDw9IHBvcnRfdG87IHBvcnQrKykgewogCQlpZCA9IHBvcnQgLSBtYXAtPmZpcnN0X3BvcnQ7Ci0JCXJldCA9IGFkdGZuKHNldCwgJmlkLCB0aW1lb3V0KTsKKwkJcmV0ID0gYWR0Zm4oc2V0LCAmaWQsIHRpbWVvdXQsIGZsYWdzKTsKIAogCQlpZiAocmV0ICYmICFpcF9zZXRfZWV4aXN0KHJldCwgZmxhZ3MpKQogCQkJcmV0dXJuIHJldDsKQEAgLTQ4Miw3ICs0ODQsOCBAQAogCS5mZWF0dXJlcwk9IElQU0VUX1RZUEVfUE9SVCwKIAkuZGltZW5zaW9uCT0gSVBTRVRfRElNX09ORSwKIAkuZmFtaWx5CQk9IEFGX1VOU1BFQywKLQkucmV2aXNpb24JPSAwLAorCS5yZXZpc2lvbl9taW4JPSAwLAorCS5yZXZpc2lvbl9tYXgJPSAwLAogCS5jcmVhdGUJCT0gYml0bWFwX3BvcnRfY3JlYXRlLAogCS5jcmVhdGVfcG9saWN5CT0gewogCQlbSVBTRVRfQVRUUl9QT1JUXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9jb3JlLmMKaW5kZXggODA0MWJlZi4uZDdlODZlZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2NvcmUuYwpAQCAtMTcsMTAgKzE3LDEwIEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXQuaD4KIApAQCAtNzAsNyArNzAsOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHR5cGUsICZpcF9zZXRfdHlwZV9saXN0LCBsaXN0KQogCQlpZiAoU1RSRVEodHlwZS0+bmFtZSwgbmFtZSkgJiYKIAkJICAgICh0eXBlLT5mYW1pbHkgPT0gZmFtaWx5IHx8IHR5cGUtPmZhbWlseSA9PSBBRl9VTlNQRUMpICYmCi0JCSAgICB0eXBlLT5yZXZpc2lvbiA9PSByZXZpc2lvbikKKwkJICAgIHJldmlzaW9uID49IHR5cGUtPnJldmlzaW9uX21pbiAmJgorCQkgICAgcmV2aXNpb24gPD0gdHlwZS0+cmV2aXNpb25fbWF4KQogCQkJcmV0dXJuIHR5cGU7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xMzUsMTAgKzEzNiwxMCBAQAogCQlpZiAoU1RSRVEodHlwZS0+bmFtZSwgbmFtZSkgJiYKIAkJICAgICh0eXBlLT5mYW1pbHkgPT0gZmFtaWx5IHx8IHR5cGUtPmZhbWlseSA9PSBBRl9VTlNQRUMpKSB7CiAJCQlmb3VuZCA9IHRydWU7Ci0JCQlpZiAodHlwZS0+cmV2aXNpb24gPCAqbWluKQotCQkJCSptaW4gPSB0eXBlLT5yZXZpc2lvbjsKLQkJCWlmICh0eXBlLT5yZXZpc2lvbiA+ICptYXgpCi0JCQkJKm1heCA9IHR5cGUtPnJldmlzaW9uOworCQkJaWYgKHR5cGUtPnJldmlzaW9uX21pbiA8ICptaW4pCisJCQkJKm1pbiA9IHR5cGUtPnJldmlzaW9uX21pbjsKKwkJCWlmICh0eXBlLT5yZXZpc2lvbl9tYXggPiAqbWF4KQorCQkJCSptYXggPSB0eXBlLT5yZXZpc2lvbl9tYXg7CiAJCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAoZm91bmQpCkBAIC0xNTksMjUgKzE2MCwyNyBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKHR5cGUtPnByb3RvY29sICE9IElQU0VUX1BST1RPQ09MKSB7Ci0JCXByX3dhcm5pbmcoImlwX3NldCB0eXBlICVzLCBmYW1pbHkgJXMsIHJldmlzaW9uICV1IHVzZXMgIgorCQlwcl93YXJuaW5nKCJpcF9zZXQgdHlwZSAlcywgZmFtaWx5ICVzLCByZXZpc2lvbiAldToldSB1c2VzICIKIAkJCSAgICJ3cm9uZyBwcm90b2NvbCB2ZXJzaW9uICV1ICh3YW50ICV1KVxuIiwKIAkJCSAgIHR5cGUtPm5hbWUsIGZhbWlseV9uYW1lKHR5cGUtPmZhbWlseSksCi0JCQkgICB0eXBlLT5yZXZpc2lvbiwgdHlwZS0+cHJvdG9jb2wsIElQU0VUX1BST1RPQ09MKTsKKwkJCSAgIHR5cGUtPnJldmlzaW9uX21pbiwgdHlwZS0+cmV2aXNpb25fbWF4LAorCQkJICAgdHlwZS0+cHJvdG9jb2wsIElQU0VUX1BST1RPQ09MKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaXBfc2V0X3R5cGVfbG9jaygpOwotCWlmIChmaW5kX3NldF90eXBlKHR5cGUtPm5hbWUsIHR5cGUtPmZhbWlseSwgdHlwZS0+cmV2aXNpb24pKSB7CisJaWYgKGZpbmRfc2V0X3R5cGUodHlwZS0+bmFtZSwgdHlwZS0+ZmFtaWx5LCB0eXBlLT5yZXZpc2lvbl9taW4pKSB7CiAJCS8qIER1cGxpY2F0ZSEgKi8KLQkJcHJfd2FybmluZygiaXBfc2V0IHR5cGUgJXMsIGZhbWlseSAlcywgcmV2aXNpb24gJXUgIgorCQlwcl93YXJuaW5nKCJpcF9zZXQgdHlwZSAlcywgZmFtaWx5ICVzIHdpdGggcmV2aXNpb24gbWluICV1ICIKIAkJCSAgICJhbHJlYWR5IHJlZ2lzdGVyZWQhXG4iLCB0eXBlLT5uYW1lLAotCQkJICAgZmFtaWx5X25hbWUodHlwZS0+ZmFtaWx5KSwgdHlwZS0+cmV2aXNpb24pOworCQkJICAgZmFtaWx5X25hbWUodHlwZS0+ZmFtaWx5KSwgdHlwZS0+cmV2aXNpb25fbWluKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byB1bmxvY2s7CiAJfQogCWxpc3RfYWRkX3JjdSgmdHlwZS0+bGlzdCwgJmlwX3NldF90eXBlX2xpc3QpOwotCXByX2RlYnVnKCJ0eXBlICVzLCBmYW1pbHkgJXMsIHJldmlzaW9uICV1IHJlZ2lzdGVyZWQuXG4iLAotCQkgdHlwZS0+bmFtZSwgZmFtaWx5X25hbWUodHlwZS0+ZmFtaWx5KSwgdHlwZS0+cmV2aXNpb24pOworCXByX2RlYnVnKCJ0eXBlICVzLCBmYW1pbHkgJXMsIHJldmlzaW9uICV1OiV1IHJlZ2lzdGVyZWQuXG4iLAorCQkgdHlwZS0+bmFtZSwgZmFtaWx5X25hbWUodHlwZS0+ZmFtaWx5KSwKKwkJIHR5cGUtPnJldmlzaW9uX21pbiwgdHlwZS0+cmV2aXNpb25fbWF4KTsKIHVubG9jazoKIAlpcF9zZXRfdHlwZV91bmxvY2soKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTg5LDE1ICsxOTIsMTUgQEAKIGlwX3NldF90eXBlX3VucmVnaXN0ZXIoc3RydWN0IGlwX3NldF90eXBlICp0eXBlKQogewogCWlwX3NldF90eXBlX2xvY2soKTsKLQlpZiAoIWZpbmRfc2V0X3R5cGUodHlwZS0+bmFtZSwgdHlwZS0+ZmFtaWx5LCB0eXBlLT5yZXZpc2lvbikpIHsKLQkJcHJfd2FybmluZygiaXBfc2V0IHR5cGUgJXMsIGZhbWlseSAlcywgcmV2aXNpb24gJXUgIgorCWlmICghZmluZF9zZXRfdHlwZSh0eXBlLT5uYW1lLCB0eXBlLT5mYW1pbHksIHR5cGUtPnJldmlzaW9uX21pbikpIHsKKwkJcHJfd2FybmluZygiaXBfc2V0IHR5cGUgJXMsIGZhbWlseSAlcyB3aXRoIHJldmlzaW9uIG1pbiAldSAiCiAJCQkgICAibm90IHJlZ2lzdGVyZWRcbiIsIHR5cGUtPm5hbWUsCi0JCQkgICBmYW1pbHlfbmFtZSh0eXBlLT5mYW1pbHkpLCB0eXBlLT5yZXZpc2lvbik7CisJCQkgICBmYW1pbHlfbmFtZSh0eXBlLT5mYW1pbHkpLCB0eXBlLT5yZXZpc2lvbl9taW4pOwogCQlnb3RvIHVubG9jazsKIAl9CiAJbGlzdF9kZWxfcmN1KCZ0eXBlLT5saXN0KTsKLQlwcl9kZWJ1ZygidHlwZSAlcywgZmFtaWx5ICVzLCByZXZpc2lvbiAldSB1bnJlZ2lzdGVyZWQuXG4iLAotCQkgdHlwZS0+bmFtZSwgZmFtaWx5X25hbWUodHlwZS0+ZmFtaWx5KSwgdHlwZS0+cmV2aXNpb24pOworCXByX2RlYnVnKCJ0eXBlICVzLCBmYW1pbHkgJXMgd2l0aCByZXZpc2lvbiBtaW4gJXUgdW5yZWdpc3RlcmVkLlxuIiwKKwkJIHR5cGUtPm5hbWUsIGZhbWlseV9uYW1lKHR5cGUtPmZhbWlseSksIHR5cGUtPnJldmlzaW9uX21pbik7CiB1bmxvY2s6CiAJaXBfc2V0X3R5cGVfdW5sb2NrKCk7CiAKQEAgLTMyNSw3ICszMjgsOCBAQAogCiBpbnQKIGlwX3NldF90ZXN0KGlwX3NldF9pZF90IGluZGV4LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICB1OCBmYW1pbHksIHU4IGRpbSwgdTggZmxhZ3MpCisJICAgIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKKwkgICAgY29uc3Qgc3RydWN0IGlwX3NldF9hZHRfb3B0ICpvcHQpCiB7CiAJc3RydWN0IGlwX3NldCAqc2V0ID0gaXBfc2V0X2xpc3RbaW5kZXhdOwogCWludCByZXQgPSAwOwpAQCAtMzMzLDE5ICszMzcsMTkgQEAKIAlCVUdfT04oc2V0ID09IE5VTEwpOwogCXByX2RlYnVnKCJzZXQgJXMsIGluZGV4ICV1XG4iLCBzZXQtPm5hbWUsIGluZGV4KTsKIAotCWlmIChkaW0gPCBzZXQtPnR5cGUtPmRpbWVuc2lvbiB8fAotCSAgICAhKGZhbWlseSA9PSBzZXQtPmZhbWlseSB8fCBzZXQtPmZhbWlseSA9PSBBRl9VTlNQRUMpKQorCWlmIChvcHQtPmRpbSA8IHNldC0+dHlwZS0+ZGltZW5zaW9uIHx8CisJICAgICEob3B0LT5mYW1pbHkgPT0gc2V0LT5mYW1pbHkgfHwgc2V0LT5mYW1pbHkgPT0gQUZfVU5TUEVDKSkKIAkJcmV0dXJuIDA7CiAKIAlyZWFkX2xvY2tfYmgoJnNldC0+bG9jayk7Ci0JcmV0ID0gc2V0LT52YXJpYW50LT5rYWR0KHNldCwgc2tiLCBJUFNFVF9URVNULCBmYW1pbHksIGRpbSwgZmxhZ3MpOworCXJldCA9IHNldC0+dmFyaWFudC0+a2FkdChzZXQsIHNrYiwgcGFyLCBJUFNFVF9URVNULCBvcHQpOwogCXJlYWRfdW5sb2NrX2JoKCZzZXQtPmxvY2spOwogCiAJaWYgKHJldCA9PSAtRUFHQUlOKSB7CiAJCS8qIFR5cGUgcmVxdWVzdHMgZWxlbWVudCB0byBiZSBjb21wbGV0ZWQgKi8KIAkJcHJfZGVidWcoImVsZW1lbnQgbXVzdCBiZSBjb21wZXRlZCwgQUREIGlzIHRyaWdnZXJlZFxuIik7CiAJCXdyaXRlX2xvY2tfYmgoJnNldC0+bG9jayk7Ci0JCXNldC0+dmFyaWFudC0+a2FkdChzZXQsIHNrYiwgSVBTRVRfQURELCBmYW1pbHksIGRpbSwgZmxhZ3MpOworCQlzZXQtPnZhcmlhbnQtPmthZHQoc2V0LCBza2IsIHBhciwgSVBTRVRfQURELCBvcHQpOwogCQl3cml0ZV91bmxvY2tfYmgoJnNldC0+bG9jayk7CiAJCXJldCA9IDE7CiAJfQpAQCAtMzU3LDcgKzM2MSw4IEBACiAKIGludAogaXBfc2V0X2FkZChpcF9zZXRfaWRfdCBpbmRleCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICB1OCBmYW1pbHksIHU4IGRpbSwgdTggZmxhZ3MpCisJICAgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCSAgIGNvbnN0IHN0cnVjdCBpcF9zZXRfYWR0X29wdCAqb3B0KQogewogCXN0cnVjdCBpcF9zZXQgKnNldCA9IGlwX3NldF9saXN0W2luZGV4XTsKIAlpbnQgcmV0OwpAQCAtMzY1LDEyICszNzAsMTIgQEAKIAlCVUdfT04oc2V0ID09IE5VTEwpOwogCXByX2RlYnVnKCJzZXQgJXMsIGluZGV4ICV1XG4iLCBzZXQtPm5hbWUsIGluZGV4KTsKIAotCWlmIChkaW0gPCBzZXQtPnR5cGUtPmRpbWVuc2lvbiB8fAotCSAgICAhKGZhbWlseSA9PSBzZXQtPmZhbWlseSB8fCBzZXQtPmZhbWlseSA9PSBBRl9VTlNQRUMpKQorCWlmIChvcHQtPmRpbSA8IHNldC0+dHlwZS0+ZGltZW5zaW9uIHx8CisJICAgICEob3B0LT5mYW1pbHkgPT0gc2V0LT5mYW1pbHkgfHwgc2V0LT5mYW1pbHkgPT0gQUZfVU5TUEVDKSkKIAkJcmV0dXJuIDA7CiAKIAl3cml0ZV9sb2NrX2JoKCZzZXQtPmxvY2spOwotCXJldCA9IHNldC0+dmFyaWFudC0+a2FkdChzZXQsIHNrYiwgSVBTRVRfQURELCBmYW1pbHksIGRpbSwgZmxhZ3MpOworCXJldCA9IHNldC0+dmFyaWFudC0+a2FkdChzZXQsIHNrYiwgcGFyLCBJUFNFVF9BREQsIG9wdCk7CiAJd3JpdGVfdW5sb2NrX2JoKCZzZXQtPmxvY2spOwogCiAJcmV0dXJuIHJldDsKQEAgLTM3OSw3ICszODQsOCBAQAogCiBpbnQKIGlwX3NldF9kZWwoaXBfc2V0X2lkX3QgaW5kZXgsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICAgdTggZmFtaWx5LCB1OCBkaW0sIHU4IGZsYWdzKQorCSAgIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKKwkgICBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCkKIHsKIAlzdHJ1Y3QgaXBfc2V0ICpzZXQgPSBpcF9zZXRfbGlzdFtpbmRleF07CiAJaW50IHJldCA9IDA7CkBAIC0zODcsMTIgKzM5MywxMiBAQAogCUJVR19PTihzZXQgPT0gTlVMTCk7CiAJcHJfZGVidWcoInNldCAlcywgaW5kZXggJXVcbiIsIHNldC0+bmFtZSwgaW5kZXgpOwogCi0JaWYgKGRpbSA8IHNldC0+dHlwZS0+ZGltZW5zaW9uIHx8Ci0JICAgICEoZmFtaWx5ID09IHNldC0+ZmFtaWx5IHx8IHNldC0+ZmFtaWx5ID09IEFGX1VOU1BFQykpCisJaWYgKG9wdC0+ZGltIDwgc2V0LT50eXBlLT5kaW1lbnNpb24gfHwKKwkgICAgIShvcHQtPmZhbWlseSA9PSBzZXQtPmZhbWlseSB8fCBzZXQtPmZhbWlseSA9PSBBRl9VTlNQRUMpKQogCQlyZXR1cm4gMDsKIAogCXdyaXRlX2xvY2tfYmgoJnNldC0+bG9jayk7Ci0JcmV0ID0gc2V0LT52YXJpYW50LT5rYWR0KHNldCwgc2tiLCBJUFNFVF9ERUwsIGZhbWlseSwgZGltLCBmbGFncyk7CisJcmV0ID0gc2V0LT52YXJpYW50LT5rYWR0KHNldCwgc2tiLCBwYXIsIElQU0VUX0RFTCwgb3B0KTsKIAl3cml0ZV91bmxvY2tfYmgoJnNldC0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNjU2LDYgKzY2Miw3IEBACiAJcndsb2NrX2luaXQoJnNldC0+bG9jayk7CiAJc3RybGNweShzZXQtPm5hbWUsIG5hbWUsIElQU0VUX01BWE5BTUVMRU4pOwogCXNldC0+ZmFtaWx5ID0gZmFtaWx5OworCXNldC0+cmV2aXNpb24gPSByZXZpc2lvbjsKIAogCS8qCiAJICogTmV4dCwgY2hlY2sgdGhhdCB3ZSBrbm93IHRoZSB0eXBlLCBhbmQgdGFrZQpAQCAtNjc1LDggKzY4Miw4IEBACiAJaWYgKGF0dHJbSVBTRVRfQVRUUl9EQVRBXSAmJgogCSAgICBubGFfcGFyc2VfbmVzdGVkKHRiLCBJUFNFVF9BVFRSX0NSRUFURV9NQVgsIGF0dHJbSVBTRVRfQVRUUl9EQVRBXSwKIAkJCSAgICAgc2V0LT50eXBlLT5jcmVhdGVfcG9saWN5KSkgewotCSAgICAJcmV0ID0gLUlQU0VUX0VSUl9QUk9UT0NPTDsKLQkgICAgCWdvdG8gcHV0X291dDsKKwkJcmV0ID0gLUlQU0VUX0VSUl9QUk9UT0NPTDsKKwkJZ290byBwdXRfb3V0OwogCX0KIAogCXJldCA9IHNldC0+dHlwZS0+Y3JlYXRlKHNldCwgdGIsIGZsYWdzKTsKQEAgLTY5Niw3ICs3MDMsOCBAQAogCQkgICAgKGZsYWdzICYgSVBTRVRfRkxBR19FWElTVCkgJiYKIAkJICAgIFNUUkVRKHNldC0+dHlwZS0+bmFtZSwgY2xhc2gtPnR5cGUtPm5hbWUpICYmCiAJCSAgICBzZXQtPnR5cGUtPmZhbWlseSA9PSBjbGFzaC0+dHlwZS0+ZmFtaWx5ICYmCi0JCSAgICBzZXQtPnR5cGUtPnJldmlzaW9uID09IGNsYXNoLT50eXBlLT5yZXZpc2lvbiAmJgorCQkgICAgc2V0LT50eXBlLT5yZXZpc2lvbl9taW4gPT0gY2xhc2gtPnR5cGUtPnJldmlzaW9uX21pbiAmJgorCQkgICAgc2V0LT50eXBlLT5yZXZpc2lvbl9tYXggPT0gY2xhc2gtPnR5cGUtPnJldmlzaW9uX21heCAmJgogCQkgICAgc2V0LT52YXJpYW50LT5zYW1lX3NldChzZXQsIGNsYXNoKSkKIAkJCXJldCA9IDA7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTc2Nyw3ICs3NzUsNyBAQAogCWlmICghYXR0cltJUFNFVF9BVFRSX1NFVE5BTUVdKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBpcF9zZXRfbWF4OyBpKyspIHsKIAkJCWlmIChpcF9zZXRfbGlzdFtpXSAhPSBOVUxMICYmIGlwX3NldF9saXN0W2ldLT5yZWYpIHsKLQkJCQlyZXQgPSBJUFNFVF9FUlJfQlVTWTsKKwkJCQlyZXQgPSAtSVBTRVRfRVJSX0JVU1k7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KQEAgLTkzOSwxMCArOTQ3LDEzIEBACiAKIC8qIExpc3Qvc2F2ZSBzZXQgZGF0YSAqLwogCi0jZGVmaW5lIERVTVBfSU5JVAkwTAotI2RlZmluZSBEVU1QX0FMTAkxTAotI2RlZmluZSBEVU1QX09ORQkyTAotI2RlZmluZSBEVU1QX0xBU1QJM0wKKyNkZWZpbmUgRFVNUF9JTklUCTAKKyNkZWZpbmUgRFVNUF9BTEwJMQorI2RlZmluZSBEVU1QX09ORQkyCisjZGVmaW5lIERVTVBfTEFTVAkzCisKKyNkZWZpbmUgRFVNUF9UWVBFKGFyZykJCSgoKHUzMikoYXJnKSkgJiAweDAwMDBGRkZGKQorI2RlZmluZSBEVU1QX0ZMQUdTKGFyZykJCSgoKHUzMikoYXJnKSkgPj4gMTYpCiAKIHN0YXRpYyBpbnQKIGlwX3NldF9kdW1wX2RvbmUoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQpAQCAtOTczLDYgKzk4NCw3IEBACiAJaW50IG1pbl9sZW4gPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSk7CiAJc3RydWN0IG5sYXR0ciAqY2RhW0lQU0VUX0FUVFJfQ01EX01BWCsxXTsKIAlzdHJ1Y3QgbmxhdHRyICphdHRyID0gKHZvaWQgKilubGggKyBtaW5fbGVuOworCXUzMiBkdW1wX3R5cGU7CiAJaXBfc2V0X2lkX3QgaW5kZXg7CiAKIAkvKiBTZWNvbmQgcGFzcywgc28gcGFyc2VyIGNhbid0IGZhaWwgKi8KQEAgLTk4NCwxNyArOTk2LDIyIEBACiAJICogICAgICAgICBbLi5dOiB0eXBlIHNwZWNpZmljCiAJICovCiAKLQlpZiAoIWNkYVtJUFNFVF9BVFRSX1NFVE5BTUVdKSB7Ci0JCWNiLT5hcmdzWzBdID0gRFVNUF9BTEw7Ci0JCXJldHVybiAwOworCWlmIChjZGFbSVBTRVRfQVRUUl9TRVROQU1FXSkgeworCQlpbmRleCA9IGZpbmRfc2V0X2lkKG5sYV9kYXRhKGNkYVtJUFNFVF9BVFRSX1NFVE5BTUVdKSk7CisJCWlmIChpbmRleCA9PSBJUFNFVF9JTlZBTElEX0lEKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisKKwkJZHVtcF90eXBlID0gRFVNUF9PTkU7CisJCWNiLT5hcmdzWzFdID0gaW5kZXg7CisJfSBlbHNlCisJCWR1bXBfdHlwZSA9IERVTVBfQUxMOworCisJaWYgKGNkYVtJUFNFVF9BVFRSX0ZMQUdTXSkgeworCQl1MzIgZiA9IGlwX3NldF9nZXRfaDMyKGNkYVtJUFNFVF9BVFRSX0ZMQUdTXSk7CisJCWR1bXBfdHlwZSB8PSAoZiA8PCAxNik7CiAJfQorCWNiLT5hcmdzWzBdID0gZHVtcF90eXBlOwogCi0JaW5kZXggPSBmaW5kX3NldF9pZChubGFfZGF0YShjZGFbSVBTRVRfQVRUUl9TRVROQU1FXSkpOwotCWlmIChpbmRleCA9PSBJUFNFVF9JTlZBTElEX0lEKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWNiLT5hcmdzWzBdID0gRFVNUF9PTkU7Ci0JY2ItPmFyZ3NbMV0gPSBpbmRleDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAwNSw5ICsxMDIyLDEwIEBACiAJc3RydWN0IGlwX3NldCAqc2V0ID0gTlVMTDsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gTkVUTElOS19DQihjYi0+c2tiKS5waWQgPyBOTE1fRl9NVUxUSSA6IDA7CisJdTMyIGR1bXBfdHlwZSwgZHVtcF9mbGFnczsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChjYi0+YXJnc1swXSA9PSBEVU1QX0lOSVQpIHsKKwlpZiAoIWNiLT5hcmdzWzBdKSB7CiAJCXJldCA9IGR1bXBfaW5pdChjYik7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlubGggPSBubG1zZ19oZHIoY2ItPnNrYik7CkBAIC0xMDIyLDE0ICsxMDQwLDE3IEBACiAJaWYgKGNiLT5hcmdzWzFdID49IGlwX3NldF9tYXgpCiAJCWdvdG8gb3V0OwogCi0JbWF4ID0gY2ItPmFyZ3NbMF0gPT0gRFVNUF9PTkUgPyBjYi0+YXJnc1sxXSArIDEgOiBpcF9zZXRfbWF4OworCWR1bXBfdHlwZSA9IERVTVBfVFlQRShjYi0+YXJnc1swXSk7CisJZHVtcF9mbGFncyA9IERVTVBfRkxBR1MoY2ItPmFyZ3NbMF0pOworCW1heCA9IGR1bXBfdHlwZSA9PSBEVU1QX09ORSA/IGNiLT5hcmdzWzFdICsgMSA6IGlwX3NldF9tYXg7CiBkdW1wX2xhc3Q6Ci0JcHJfZGVidWcoImFyZ3NbMF06ICVsZCBhcmdzWzFdOiAlbGRcbiIsIGNiLT5hcmdzWzBdLCBjYi0+YXJnc1sxXSk7CisJcHJfZGVidWcoImFyZ3NbMF06ICV1ICV1IGFyZ3NbMV06ICVsZFxuIiwKKwkJIGR1bXBfdHlwZSwgZHVtcF9mbGFncywgY2ItPmFyZ3NbMV0pOwogCWZvciAoOyBjYi0+YXJnc1sxXSA8IG1heDsgY2ItPmFyZ3NbMV0rKykgewogCQlpbmRleCA9IChpcF9zZXRfaWRfdCkgY2ItPmFyZ3NbMV07CiAJCXNldCA9IGlwX3NldF9saXN0W2luZGV4XTsKIAkJaWYgKHNldCA9PSBOVUxMKSB7Ci0JCQlpZiAoY2ItPmFyZ3NbMF0gPT0gRFVNUF9PTkUpIHsKKwkJCWlmIChkdW1wX3R5cGUgPT0gRFVNUF9PTkUpIHsKIAkJCQlyZXQgPSAtRU5PRU5UOwogCQkJCWdvdG8gb3V0OwogCQkJfQpAQCAtMTAzOCw4ICsxMDU5LDggQEAKIAkJLyogV2hlbiBkdW1waW5nIGFsbCBzZXRzLCB3ZSBtdXN0IGR1bXAgInNvcnRlZCIKIAkJICogc28gdGhhdCBsaXN0cyAodW5pb25zIG9mIHNldHMpIGFyZSBkdW1wZWQgbGFzdC4KIAkJICovCi0JCWlmIChjYi0+YXJnc1swXSAhPSBEVU1QX09ORSAmJgotCQkgICAgKChjYi0+YXJnc1swXSA9PSBEVU1QX0FMTCkgPT0KKwkJaWYgKGR1bXBfdHlwZSAhPSBEVU1QX09ORSAmJgorCQkgICAgKChkdW1wX3R5cGUgPT0gRFVNUF9BTEwpID09CiAJCSAgICAgISEoc2V0LT50eXBlLT5mZWF0dXJlcyAmIElQU0VUX0RVTVBfTEFTVCkpKQogCQkJY29udGludWU7CiAJCXByX2RlYnVnKCJMaXN0IHNldDogJXNcbiIsIHNldC0+bmFtZSk7CkBAIC0xMDU3LDYgKzEwNzgsOCBAQAogCQl9CiAJCU5MQV9QVVRfVTgoc2tiLCBJUFNFVF9BVFRSX1BST1RPQ09MLCBJUFNFVF9QUk9UT0NPTCk7CiAJCU5MQV9QVVRfU1RSSU5HKHNrYiwgSVBTRVRfQVRUUl9TRVROQU1FLCBzZXQtPm5hbWUpOworCQlpZiAoZHVtcF9mbGFncyAmIElQU0VUX0ZMQUdfTElTVF9TRVROQU1FKQorCQkJZ290byBuZXh0X3NldDsKIAkJc3dpdGNoIChjYi0+YXJnc1syXSkgewogCQljYXNlIDA6CiAJCQkvKiBDb3JlIGhlYWRlciBkYXRhICovCkBAIC0xMDY1LDI4ICsxMDg4LDI3IEBACiAJCQlOTEFfUFVUX1U4KHNrYiwgSVBTRVRfQVRUUl9GQU1JTFksCiAJCQkJICAgc2V0LT5mYW1pbHkpOwogCQkJTkxBX1BVVF9VOChza2IsIElQU0VUX0FUVFJfUkVWSVNJT04sCi0JCQkJICAgc2V0LT50eXBlLT5yZXZpc2lvbik7CisJCQkJICAgc2V0LT5yZXZpc2lvbik7CiAJCQlyZXQgPSBzZXQtPnZhcmlhbnQtPmhlYWQoc2V0LCBza2IpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byByZWxlYXNlX3JlZmNvdW50OworCQkJaWYgKGR1bXBfZmxhZ3MgJiBJUFNFVF9GTEFHX0xJU1RfSEVBREVSKQorCQkJCWdvdG8gbmV4dF9zZXQ7CiAJCQkvKiBGYWxsIHRocm91Z2ggYW5kIGFkZCBlbGVtZW50cyAqLwogCQlkZWZhdWx0OgogCQkJcmVhZF9sb2NrX2JoKCZzZXQtPmxvY2spOwogCQkJcmV0ID0gc2V0LT52YXJpYW50LT5saXN0KHNldCwgc2tiLCBjYik7CiAJCQlyZWFkX3VubG9ja19iaCgmc2V0LT5sb2NrKTsKLQkJCWlmICghY2ItPmFyZ3NbMl0pIHsKKwkJCWlmICghY2ItPmFyZ3NbMl0pCiAJCQkJLyogU2V0IGlzIGRvbmUsIHByb2NlZWQgd2l0aCBuZXh0IG9uZSAqLwotCQkJCWlmIChjYi0+YXJnc1swXSA9PSBEVU1QX09ORSkKLQkJCQkJY2ItPmFyZ3NbMV0gPSBJUFNFVF9JTlZBTElEX0lEOwotCQkJCWVsc2UKLQkJCQkJY2ItPmFyZ3NbMV0rKzsKLQkJCX0KKwkJCQlnb3RvIG5leHRfc2V0OwogCQkJZ290byByZWxlYXNlX3JlZmNvdW50OwogCQl9CiAJfQogCS8qIElmIHdlIGR1bXAgYWxsIHNldHMsIGNvbnRpbnVlIHdpdGggZHVtcGluZyBsYXN0IG9uZXMgKi8KLQlpZiAoY2ItPmFyZ3NbMF0gPT0gRFVNUF9BTEwpIHsKLQkJY2ItPmFyZ3NbMF0gPSBEVU1QX0xBU1Q7CisJaWYgKGR1bXBfdHlwZSA9PSBEVU1QX0FMTCkgeworCQlkdW1wX3R5cGUgPSBEVU1QX0xBU1Q7CisJCWNiLT5hcmdzWzBdID0gZHVtcF90eXBlIHwgKGR1bXBfZmxhZ3MgPDwgMTYpOwogCQljYi0+YXJnc1sxXSA9IDA7CiAJCWdvdG8gZHVtcF9sYXN0OwogCX0KQEAgLTEwOTQsNiArMTExNiwxMSBAQAogCiBubGFfcHV0X2ZhaWx1cmU6CiAJcmV0ID0gLUVGQVVMVDsKK25leHRfc2V0OgorCWlmIChkdW1wX3R5cGUgPT0gRFVNUF9PTkUpCisJCWNiLT5hcmdzWzFdID0gSVBTRVRfSU5WQUxJRF9JRDsKKwllbHNlCisJCWNiLT5hcmdzWzFdKys7CiByZWxlYXNlX3JlZmNvdW50OgogCS8qIElmIHRoZXJlIHdhcyBhbiBlcnJvciBvciBzZXQgaXMgZG9uZSwgcmVsZWFzZSBzZXQgKi8KIAlpZiAocmV0IHx8ICFjYi0+YXJnc1syXSkgewpAQCAtMTEyMCw3ICsxMTQ3LDcgQEAKIAogCXJldHVybiBuZXRsaW5rX2R1bXBfc3RhcnQoY3RubCwgc2tiLCBubGgsCiAJCQkJICBpcF9zZXRfZHVtcF9zdGFydCwKLQkJCQkgIGlwX3NldF9kdW1wX2RvbmUpOworCQkJCSAgaXBfc2V0X2R1bXBfZG9uZSwgMCk7CiB9CiAKIC8qIEFkZCwgZGVsIGFuZCB0ZXN0ICovCkBAIC0xMTM5LDE3ICsxMTY2LDE4IEBACiAJc3RydWN0IG5sYXR0ciAqdGJbXSwgZW51bSBpcHNldF9hZHQgYWR0LAogCXUzMiBmbGFncywgYm9vbCB1c2VfbGluZW5vKQogewotCWludCByZXQsIHJldHJpZWQgPSAwOworCWludCByZXQ7CiAJdTMyIGxpbmVubyA9IDA7Ci0JYm9vbCBlZXhpc3QgPSBmbGFncyAmIElQU0VUX0ZMQUdfRVhJU1Q7CisJYm9vbCBlZXhpc3QgPSBmbGFncyAmIElQU0VUX0ZMQUdfRVhJU1QsIHJldHJpZWQgPSBmYWxzZTsKIAogCWRvIHsKIAkJd3JpdGVfbG9ja19iaCgmc2V0LT5sb2NrKTsKLQkJcmV0ID0gc2V0LT52YXJpYW50LT51YWR0KHNldCwgdGIsIGFkdCwgJmxpbmVubywgZmxhZ3MpOworCQlyZXQgPSBzZXQtPnZhcmlhbnQtPnVhZHQoc2V0LCB0YiwgYWR0LCAmbGluZW5vLCBmbGFncywgcmV0cmllZCk7CiAJCXdyaXRlX3VubG9ja19iaCgmc2V0LT5sb2NrKTsKKwkJcmV0cmllZCA9IHRydWU7CiAJfSB3aGlsZSAocmV0ID09IC1FQUdBSU4gJiYKIAkJIHNldC0+dmFyaWFudC0+cmVzaXplICYmCi0JCSAocmV0ID0gc2V0LT52YXJpYW50LT5yZXNpemUoc2V0LCByZXRyaWVkKyspKSA9PSAwKTsKKwkJIChyZXQgPSBzZXQtPnZhcmlhbnQtPnJlc2l6ZShzZXQsIHJldHJpZWQpKSA9PSAwKTsKIAogCWlmICghcmV0IHx8IChyZXQgPT0gLUlQU0VUX0VSUl9FWElTVCAmJiBlZXhpc3QpKQogCQlyZXR1cm4gMDsKQEAgLTEzMjIsNyArMTM1MCw3IEBACiAJCXJldHVybiAtSVBTRVRfRVJSX1BST1RPQ09MOwogCiAJcmVhZF9sb2NrX2JoKCZzZXQtPmxvY2spOwotCXJldCA9IHNldC0+dmFyaWFudC0+dWFkdChzZXQsIHRiLCBJUFNFVF9URVNULCBOVUxMLCAwKTsKKwlyZXQgPSBzZXQtPnZhcmlhbnQtPnVhZHQoc2V0LCB0YiwgSVBTRVRfVEVTVCwgTlVMTCwgMCwgMCk7CiAJcmVhZF91bmxvY2tfYmgoJnNldC0+bG9jayk7CiAJLyogVXNlcnNwYWNlIGNhbid0IHRyaWdnZXIgZWxlbWVudCB0byBiZSByZS1hZGRlZCAqLwogCWlmIChyZXQgPT0gLUVBR0FJTikKQEAgLTEzNjUsNyArMTM5Myw3IEBACiAJTkxBX1BVVF9TVFJJTkcoc2tiMiwgSVBTRVRfQVRUUl9TRVROQU1FLCBzZXQtPm5hbWUpOwogCU5MQV9QVVRfU1RSSU5HKHNrYjIsIElQU0VUX0FUVFJfVFlQRU5BTUUsIHNldC0+dHlwZS0+bmFtZSk7CiAJTkxBX1BVVF9VOChza2IyLCBJUFNFVF9BVFRSX0ZBTUlMWSwgc2V0LT5mYW1pbHkpOwotCU5MQV9QVVRfVTgoc2tiMiwgSVBTRVRfQVRUUl9SRVZJU0lPTiwgc2V0LT50eXBlLT5yZXZpc2lvbik7CisJTkxBX1BVVF9VOChza2IyLCBJUFNFVF9BVFRSX1JFVklTSU9OLCBzZXQtPnJldmlzaW9uKTsKIAlubG1zZ19lbmQoc2tiMiwgbmxoMik7CiAKIAlyZXQgPSBuZXRsaW5rX3VuaWNhc3QoY3RubCwgc2tiMiwgTkVUTElOS19DQihza2IpLnBpZCwgTVNHX0RPTlRXQUlUKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXAuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXAuYwppbmRleCA0M2JjY2UyLi5mMmQ1NzZlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX2lwLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcC5jCkBAIC01Myw3ICs1Myw4IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbAogaGFzaF9pcDRfZGF0YV9lcXVhbChjb25zdCBzdHJ1Y3QgaGFzaF9pcDRfZWxlbSAqaXAxLAotCQkgICAgY29uc3Qgc3RydWN0IGhhc2hfaXA0X2VsZW0gKmlwMikKKwkJICAgIGNvbnN0IHN0cnVjdCBoYXNoX2lwNF9lbGVtICppcDIsCisJCSAgICB1MzIgKm11bHRpKQogewogCXJldHVybiBpcDEtPmlwID09IGlwMi0+aXA7CiB9CkBAIC0xMDgsMjUgKzEwOSwzMiBAQAogI2RlZmluZSBIT1NUX01BU0sJMzIKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2FoYXNoLmg+CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAoraGFzaF9pcDRfZGF0YV9uZXh0KHN0cnVjdCBpcF9zZXRfaGFzaCAqaCwgY29uc3Qgc3RydWN0IGhhc2hfaXA0X2VsZW0gKmQpCit7CisJaC0+bmV4dC5pcCA9IG50b2hsKGQtPmlwKTsKK30KKwogc3RhdGljIGludAogaGFzaF9pcDRfa2FkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1OCBwZiwgdTggZGltLCB1OCBmbGFncykKKwkgICAgICBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIsCisJICAgICAgZW51bSBpcHNldF9hZHQgYWR0LCBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCkKIHsKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwogCV9fYmUzMiBpcDsKIAotCWlwNGFkZHJwdHIoc2tiLCBmbGFncyAmIElQU0VUX0RJTV9PTkVfU1JDLCAmaXApOworCWlwNGFkZHJwdHIoc2tiLCBvcHQtPmZsYWdzICYgSVBTRVRfRElNX09ORV9TUkMsICZpcCk7CiAJaXAgJj0gaXBfc2V0X25ldG1hc2soaC0+bmV0bWFzayk7CiAJaWYgKGlwID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIGFkdGZuKHNldCwgJmlwLCBoLT50aW1lb3V0KTsKKwlyZXR1cm4gYWR0Zm4oc2V0LCAmaXAsIG9wdF90aW1lb3V0KG9wdCwgaCksIG9wdC0+Y21kZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CiBoYXNoX2lwNF91YWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgc3RydWN0IG5sYXR0ciAqdGJbXSwKLQkgICAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MpCisJICAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzLCBib29sIHJldHJpZWQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKQEAgLTE1Nyw3ICsxNjUsNyBAQAogCQluaXAgPSBodG9ubChpcCk7CiAJCWlmIChuaXAgPT0gMCkKIAkJCXJldHVybiAtSVBTRVRfRVJSX0hBU0hfRUxFTTsKLQkJcmV0dXJuIGFkdGZuKHNldCwgJm5pcCwgdGltZW91dCk7CisJCXJldHVybiBhZHRmbihzZXQsICZuaXAsIHRpbWVvdXQsIGZsYWdzKTsKIAl9CiAKIAlpZiAodGJbSVBTRVRfQVRUUl9JUF9UT10pIHsKQEAgLTE3MSwxOCArMTc5LDE5IEBACiAKIAkJaWYgKGNpZHIgPiAzMikKIAkJCXJldHVybiAtSVBTRVRfRVJSX0lOVkFMSURfQ0lEUjsKLQkJaXAgJj0gaXBfc2V0X2hvc3RtYXNrKGNpZHIpOwotCQlpcF90byA9IGlwIHwgfmlwX3NldF9ob3N0bWFzayhjaWRyKTsKKwkJaXBfc2V0X21hc2tfZnJvbV90byhpcCwgaXBfdG8sIGNpZHIpOwogCX0gZWxzZQogCQlpcF90byA9IGlwOwogCiAJaG9zdHMgPSBoLT5uZXRtYXNrID09IDMyID8gMSA6IDIgPDwgKDMyIC0gaC0+bmV0bWFzayAtIDEpOwogCisJaWYgKHJldHJpZWQpCisJCWlwID0gaC0+bmV4dC5pcDsKIAlmb3IgKDsgIWJlZm9yZShpcF90bywgaXApOyBpcCArPSBob3N0cykgewogCQluaXAgPSBodG9ubChpcCk7CiAJCWlmIChuaXAgPT0gMCkKIAkJCXJldHVybiAtSVBTRVRfRVJSX0hBU0hfRUxFTTsKLQkJcmV0ID0gYWR0Zm4oc2V0LCAmbmlwLCB0aW1lb3V0KTsKKwkJcmV0ID0gYWR0Zm4oc2V0LCAmbmlwLCB0aW1lb3V0LCBmbGFncyk7CiAKIAkJaWYgKHJldCAmJiAhaXBfc2V0X2VleGlzdChyZXQsIGZsYWdzKSkKIAkJCXJldHVybiByZXQ7CkBAIC0yMTcsNyArMjI2LDggQEAKIAogc3RhdGljIGlubGluZSBib29sCiBoYXNoX2lwNl9kYXRhX2VxdWFsKGNvbnN0IHN0cnVjdCBoYXNoX2lwNl9lbGVtICppcDEsCi0JCSAgICBjb25zdCBzdHJ1Y3QgaGFzaF9pcDZfZWxlbSAqaXAyKQorCQkgICAgY29uc3Qgc3RydWN0IGhhc2hfaXA2X2VsZW0gKmlwMiwKKwkJICAgIHUzMiAqbXVsdGkpCiB7CiAJcmV0dXJuIGlwdjZfYWRkcl9jbXAoJmlwMS0+aXAuaW42LCAmaXAyLT5pcC5pbjYpID09IDA7CiB9CkBAIC0yODEsMjAgKzI5MSwyNiBAQAogI2RlZmluZSBIT1NUX01BU0sJMTI4CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9haGFzaC5oPgogCitzdGF0aWMgaW5saW5lIHZvaWQKK2hhc2hfaXA2X2RhdGFfbmV4dChzdHJ1Y3QgaXBfc2V0X2hhc2ggKmgsIGNvbnN0IHN0cnVjdCBoYXNoX2lwNl9lbGVtICpkKQoreworfQorCiBzdGF0aWMgaW50CiBoYXNoX2lwNl9rYWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIHU4IHBmLCB1OCBkaW0sIHU4IGZsYWdzKQorCSAgICAgIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKKwkgICAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIGNvbnN0IHN0cnVjdCBpcF9zZXRfYWR0X29wdCAqb3B0KQogewogCWNvbnN0IHN0cnVjdCBpcF9zZXRfaGFzaCAqaCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CiAJdW5pb24gbmZfaW5ldF9hZGRyIGlwOwogCi0JaXA2YWRkcnB0cihza2IsIGZsYWdzICYgSVBTRVRfRElNX09ORV9TUkMsICZpcC5pbjYpOworCWlwNmFkZHJwdHIoc2tiLCBvcHQtPmZsYWdzICYgSVBTRVRfRElNX09ORV9TUkMsICZpcC5pbjYpOwogCWlwNl9uZXRtYXNrKCZpcCwgaC0+bmV0bWFzayk7CiAJaWYgKGlwdjZfYWRkcl9hbnkoJmlwLmluNikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIGFkdGZuKHNldCwgJmlwLCBoLT50aW1lb3V0KTsKKwlyZXR1cm4gYWR0Zm4oc2V0LCAmaXAsIG9wdF90aW1lb3V0KG9wdCwgaCksIG9wdC0+Y21kZmxhZ3MpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgaGFzaF9pcDZfYWR0X3BvbGljeVtJUFNFVF9BVFRSX0FEVF9NQVggKyAxXSA9IHsKQEAgLTMwNSw3ICszMjEsNyBAQAogCiBzdGF0aWMgaW50CiBoYXNoX2lwNl91YWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgc3RydWN0IG5sYXR0ciAqdGJbXSwKLQkgICAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MpCisJICAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzLCBib29sIHJldHJpZWQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKQEAgLTMzNiw3ICszNTIsNyBAQAogCQl0aW1lb3V0ID0gaXBfc2V0X3RpbWVvdXRfdWdldCh0YltJUFNFVF9BVFRSX1RJTUVPVVRdKTsKIAl9CiAKLQlyZXQgPSBhZHRmbihzZXQsICZpcCwgdGltZW91dCk7CisJcmV0ID0gYWR0Zm4oc2V0LCAmaXAsIHRpbWVvdXQsIGZsYWdzKTsKIAogCXJldHVybiBpcF9zZXRfZWV4aXN0KHJldCwgZmxhZ3MpID8gMCA6IHJldDsKIH0KQEAgLTQyOCw3ICs0NDQsOCBAQAogCS5mZWF0dXJlcwk9IElQU0VUX1RZUEVfSVAsCiAJLmRpbWVuc2lvbgk9IElQU0VUX0RJTV9PTkUsCiAJLmZhbWlseQkJPSBBRl9VTlNQRUMsCi0JLnJldmlzaW9uCT0gMCwKKwkucmV2aXNpb25fbWluCT0gMCwKKwkucmV2aXNpb25fbWF4CT0gMCwKIAkuY3JlYXRlCQk9IGhhc2hfaXBfY3JlYXRlLAogCS5jcmVhdGVfcG9saWN5CT0gewogCQlbSVBTRVRfQVRUUl9IQVNIU0laRV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnQuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXBwb3J0LmMKaW5kZXggMTQyODFiNi4uNmVlMTBmNSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnQuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX2lwcG9ydC5jCkBAIC02MCw3ICs2MCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbAogaGFzaF9pcHBvcnQ0X2RhdGFfZXF1YWwoY29uc3Qgc3RydWN0IGhhc2hfaXBwb3J0NF9lbGVtICppcDEsCi0JCQljb25zdCBzdHJ1Y3QgaGFzaF9pcHBvcnQ0X2VsZW0gKmlwMikKKwkJCWNvbnN0IHN0cnVjdCBoYXNoX2lwcG9ydDRfZWxlbSAqaXAyLAorCQkJdTMyICptdWx0aSkKIHsKIAlyZXR1cm4gaXAxLT5pcCA9PSBpcDItPmlwICYmCiAJICAgICAgIGlwMS0+cG9ydCA9PSBpcDItPnBvcnQgJiYKQEAgLTEyNCwzMSArMTI1LDQwIEBACiAjZGVmaW5lIEhPU1RfTUFTSwkzMgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYWhhc2guaD4KIAorc3RhdGljIGlubGluZSB2b2lkCitoYXNoX2lwcG9ydDRfZGF0YV9uZXh0KHN0cnVjdCBpcF9zZXRfaGFzaCAqaCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBoYXNoX2lwcG9ydDRfZWxlbSAqZCkKK3sKKwloLT5uZXh0LmlwID0gbnRvaGwoZC0+aXApOworCWgtPm5leHQucG9ydCA9IG50b2hzKGQtPnBvcnQpOworfQorCiBzdGF0aWMgaW50CiBoYXNoX2lwcG9ydDRfa2FkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgZW51bSBpcHNldF9hZHQgYWR0LCB1OCBwZiwgdTggZGltLCB1OCBmbGFncykKKwkJICBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIsCisJCSAgZW51bSBpcHNldF9hZHQgYWR0LCBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCkKIHsKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwogCXN0cnVjdCBoYXNoX2lwcG9ydDRfZWxlbSBkYXRhID0geyB9OwogCi0JaWYgKCFpcF9zZXRfZ2V0X2lwNF9wb3J0KHNrYiwgZmxhZ3MgJiBJUFNFVF9ESU1fVFdPX1NSQywKKwlpZiAoIWlwX3NldF9nZXRfaXA0X3BvcnQoc2tiLCBvcHQtPmZsYWdzICYgSVBTRVRfRElNX1RXT19TUkMsCiAJCQkJICZkYXRhLnBvcnQsICZkYXRhLnByb3RvKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpcDRhZGRycHRyKHNrYiwgZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQywgJmRhdGEuaXApOworCWlwNGFkZHJwdHIoc2tiLCBvcHQtPmZsYWdzICYgSVBTRVRfRElNX09ORV9TUkMsICZkYXRhLmlwKTsKIAotCXJldHVybiBhZHRmbihzZXQsICZkYXRhLCBoLT50aW1lb3V0KTsKKwlyZXR1cm4gYWR0Zm4oc2V0LCAmZGF0YSwgb3B0X3RpbWVvdXQob3B0LCBoKSwgb3B0LT5jbWRmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIGhhc2hfaXBwb3J0NF91YWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgc3RydWN0IG5sYXR0ciAqdGJbXSwKLQkJICBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MpCisJCSAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzLCBib29sIHJldHJpZWQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKIAlzdHJ1Y3QgaGFzaF9pcHBvcnQ0X2VsZW0gZGF0YSA9IHsgfTsKLQl1MzIgaXAsIGlwX3RvLCBwLCBwb3J0LCBwb3J0X3RvOworCXUzMiBpcCwgaXBfdG8sIHAgPSAwLCBwb3J0LCBwb3J0X3RvOwogCXUzMiB0aW1lb3V0ID0gaC0+dGltZW91dDsKIAlib29sIHdpdGhfcG9ydHMgPSBmYWxzZTsKIAlpbnQgcmV0OwpAQCAtMTkyLDcgKzIwMiw3IEBACiAJaWYgKGFkdCA9PSBJUFNFVF9URVNUIHx8CiAJICAgICEodGJbSVBTRVRfQVRUUl9JUF9UT10gfHwgdGJbSVBTRVRfQVRUUl9DSURSXSB8fAogCSAgICAgIHRiW0lQU0VUX0FUVFJfUE9SVF9UT10pKSB7Ci0JCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQpOworCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0LCBmbGFncyk7CiAJCXJldHVybiBpcF9zZXRfZWV4aXN0KHJldCwgZmxhZ3MpID8gMCA6IHJldDsKIAl9CiAKQEAgLTIwOCw4ICsyMTgsNyBAQAogCiAJCWlmIChjaWRyID4gMzIpCiAJCQlyZXR1cm4gLUlQU0VUX0VSUl9JTlZBTElEX0NJRFI7Ci0JCWlwICY9IGlwX3NldF9ob3N0bWFzayhjaWRyKTsKLQkJaXBfdG8gPSBpcCB8IH5pcF9zZXRfaG9zdG1hc2soY2lkcik7CisJCWlwX3NldF9tYXNrX2Zyb21fdG8oaXAsIGlwX3RvLCBjaWRyKTsKIAl9IGVsc2UKIAkJaXBfdG8gPSBpcDsKIApAQCAtMjIwLDE3ICsyMjksMjEgQEAKIAkJCXN3YXAocG9ydCwgcG9ydF90byk7CiAJfQogCi0JZm9yICg7ICFiZWZvcmUoaXBfdG8sIGlwKTsgaXArKykKLQkJZm9yIChwID0gcG9ydDsgcCA8PSBwb3J0X3RvOyBwKyspIHsKKwlpZiAocmV0cmllZCkKKwkJaXAgPSBoLT5uZXh0LmlwOworCWZvciAoOyAhYmVmb3JlKGlwX3RvLCBpcCk7IGlwKyspIHsKKwkJcCA9IHJldHJpZWQgJiYgaXAgPT0gaC0+bmV4dC5pcCA/IGgtPm5leHQucG9ydCA6IHBvcnQ7CisJCWZvciAoOyBwIDw9IHBvcnRfdG87IHArKykgewogCQkJZGF0YS5pcCA9IGh0b25sKGlwKTsKIAkJCWRhdGEucG9ydCA9IGh0b25zKHApOwotCQkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCk7CisJCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0LCBmbGFncyk7CiAKIAkJCWlmIChyZXQgJiYgIWlwX3NldF9lZXhpc3QocmV0LCBmbGFncykpCiAJCQkJcmV0dXJuIHJldDsKIAkJCWVsc2UKIAkJCQlyZXQgPSAwOwogCQl9CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI2NCw3ICsyNzcsOCBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wKIGhhc2hfaXBwb3J0Nl9kYXRhX2VxdWFsKGNvbnN0IHN0cnVjdCBoYXNoX2lwcG9ydDZfZWxlbSAqaXAxLAotCQkJY29uc3Qgc3RydWN0IGhhc2hfaXBwb3J0Nl9lbGVtICppcDIpCisJCQljb25zdCBzdHJ1Y3QgaGFzaF9pcHBvcnQ2X2VsZW0gKmlwMiwKKwkJCXUzMiAqbXVsdGkpCiB7CiAJcmV0dXJuIGlwdjZfYWRkcl9jbXAoJmlwMS0+aXAuaW42LCAmaXAyLT5pcC5pbjYpID09IDAgJiYKIAkgICAgICAgaXAxLT5wb3J0ID09IGlwMi0+cG9ydCAmJgpAQCAtMzI4LDI2ICszNDIsMzQgQEAKICNkZWZpbmUgSE9TVF9NQVNLCTEyOAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYWhhc2guaD4KIAorc3RhdGljIGlubGluZSB2b2lkCitoYXNoX2lwcG9ydDZfZGF0YV9uZXh0KHN0cnVjdCBpcF9zZXRfaGFzaCAqaCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBoYXNoX2lwcG9ydDZfZWxlbSAqZCkKK3sKKwloLT5uZXh0LnBvcnQgPSBudG9ocyhkLT5wb3J0KTsKK30KKwogc3RhdGljIGludAogaGFzaF9pcHBvcnQ2X2thZHQoc3RydWN0IGlwX3NldCAqc2V0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTggcGYsIHU4IGRpbSwgdTggZmxhZ3MpCisJCSAgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCQkgIGVudW0gaXBzZXRfYWR0IGFkdCwgY29uc3Qgc3RydWN0IGlwX3NldF9hZHRfb3B0ICpvcHQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKIAlzdHJ1Y3QgaGFzaF9pcHBvcnQ2X2VsZW0gZGF0YSA9IHsgfTsKIAotCWlmICghaXBfc2V0X2dldF9pcDZfcG9ydChza2IsIGZsYWdzICYgSVBTRVRfRElNX1RXT19TUkMsCisJaWYgKCFpcF9zZXRfZ2V0X2lwNl9wb3J0KHNrYiwgb3B0LT5mbGFncyAmIElQU0VUX0RJTV9UV09fU1JDLAogCQkJCSAmZGF0YS5wb3J0LCAmZGF0YS5wcm90bykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaXA2YWRkcnB0cihza2IsIGZsYWdzICYgSVBTRVRfRElNX09ORV9TUkMsICZkYXRhLmlwLmluNik7CisJaXA2YWRkcnB0cihza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQywgJmRhdGEuaXAuaW42KTsKIAotCXJldHVybiBhZHRmbihzZXQsICZkYXRhLCBoLT50aW1lb3V0KTsKKwlyZXR1cm4gYWR0Zm4oc2V0LCAmZGF0YSwgb3B0X3RpbWVvdXQob3B0LCBoKSwgb3B0LT5jbWRmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIGhhc2hfaXBwb3J0Nl91YWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgc3RydWN0IG5sYXR0ciAqdGJbXSwKLQkJICBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MpCisJCSAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzLCBib29sIHJldHJpZWQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKQEAgLTM5Niw3ICs0MTgsNyBAQAogCX0KIAogCWlmIChhZHQgPT0gSVBTRVRfVEVTVCB8fCAhd2l0aF9wb3J0cyB8fCAhdGJbSVBTRVRfQVRUUl9QT1JUX1RPXSkgewotCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0KTsKKwkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCwgZmxhZ3MpOwogCQlyZXR1cm4gaXBfc2V0X2VleGlzdChyZXQsIGZsYWdzKSA/IDAgOiByZXQ7CiAJfQogCkBAIC00MDUsOSArNDI3LDExIEBACiAJaWYgKHBvcnQgPiBwb3J0X3RvKQogCQlzd2FwKHBvcnQsIHBvcnRfdG8pOwogCisJaWYgKHJldHJpZWQpCisJCXBvcnQgPSBoLT5uZXh0LnBvcnQ7CiAJZm9yICg7IHBvcnQgPD0gcG9ydF90bzsgcG9ydCsrKSB7CiAJCWRhdGEucG9ydCA9IGh0b25zKHBvcnQpOwotCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0KTsKKwkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCwgZmxhZ3MpOwogCiAJCWlmIChyZXQgJiYgIWlwX3NldF9lZXhpc3QocmV0LCBmbGFncykpCiAJCQlyZXR1cm4gcmV0OwpAQCAtNDkxLDcgKzUxNSw4IEBACiAJLmZlYXR1cmVzCT0gSVBTRVRfVFlQRV9JUCB8IElQU0VUX1RZUEVfUE9SVCwKIAkuZGltZW5zaW9uCT0gSVBTRVRfRElNX1RXTywKIAkuZmFtaWx5CQk9IEFGX1VOU1BFQywKLQkucmV2aXNpb24JPSAxLAorCS5yZXZpc2lvbl9taW4JPSAwLAorCS5yZXZpc2lvbl9tYXgJPSAxLAkvKiBTQ1RQIGFuZCBVRFBMSVRFIHN1cHBvcnQgYWRkZWQgKi8KIAkuY3JlYXRlCQk9IGhhc2hfaXBwb3J0X2NyZWF0ZSwKIAkuY3JlYXRlX3BvbGljeQk9IHsKIAkJW0lQU0VUX0FUVFJfSEFTSFNJWkVdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXBwb3J0aXAuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXBwb3J0aXAuYwppbmRleCA0MDFjOGEyLi5mYjkwZTM0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX2lwcG9ydGlwLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnRpcC5jCkBAIC02Miw3ICs2Miw4IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbAogaGFzaF9pcHBvcnRpcDRfZGF0YV9lcXVhbChjb25zdCBzdHJ1Y3QgaGFzaF9pcHBvcnRpcDRfZWxlbSAqaXAxLAotCQkJICBjb25zdCBzdHJ1Y3QgaGFzaF9pcHBvcnRpcDRfZWxlbSAqaXAyKQorCQkJICBjb25zdCBzdHJ1Y3QgaGFzaF9pcHBvcnRpcDRfZWxlbSAqaXAyLAorCQkJICB1MzIgKm11bHRpKQogewogCXJldHVybiBpcDEtPmlwID09IGlwMi0+aXAgJiYKIAkgICAgICAgaXAxLT5pcDIgPT0gaXAyLT5pcDIgJiYKQEAgLTEyNywzMiArMTI4LDQxIEBACiAjZGVmaW5lIEhPU1RfTUFTSwkzMgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYWhhc2guaD4KIAorc3RhdGljIGlubGluZSB2b2lkCitoYXNoX2lwcG9ydGlwNF9kYXRhX25leHQoc3RydWN0IGlwX3NldF9oYXNoICpoLAorCQkJIGNvbnN0IHN0cnVjdCBoYXNoX2lwcG9ydGlwNF9lbGVtICpkKQoreworCWgtPm5leHQuaXAgPSBudG9obChkLT5pcCk7CisJaC0+bmV4dC5wb3J0ID0gbnRvaHMoZC0+cG9ydCk7Cit9CisKIHN0YXRpYyBpbnQKIGhhc2hfaXBwb3J0aXA0X2thZHQoc3RydWN0IGlwX3NldCAqc2V0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1OCBwZiwgdTggZGltLCB1OCBmbGFncykKKwkJICAgIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKKwkJICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgY29uc3Qgc3RydWN0IGlwX3NldF9hZHRfb3B0ICpvcHQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKIAlzdHJ1Y3QgaGFzaF9pcHBvcnRpcDRfZWxlbSBkYXRhID0geyB9OwogCi0JaWYgKCFpcF9zZXRfZ2V0X2lwNF9wb3J0KHNrYiwgZmxhZ3MgJiBJUFNFVF9ESU1fVFdPX1NSQywKKwlpZiAoIWlwX3NldF9nZXRfaXA0X3BvcnQoc2tiLCBvcHQtPmZsYWdzICYgSVBTRVRfRElNX1RXT19TUkMsCiAJCQkJICZkYXRhLnBvcnQsICZkYXRhLnByb3RvKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpcDRhZGRycHRyKHNrYiwgZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQywgJmRhdGEuaXApOwotCWlwNGFkZHJwdHIoc2tiLCBmbGFncyAmIElQU0VUX0RJTV9USFJFRV9TUkMsICZkYXRhLmlwMik7CisJaXA0YWRkcnB0cihza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQywgJmRhdGEuaXApOworCWlwNGFkZHJwdHIoc2tiLCBvcHQtPmZsYWdzICYgSVBTRVRfRElNX1RIUkVFX1NSQywgJmRhdGEuaXAyKTsKIAotCXJldHVybiBhZHRmbihzZXQsICZkYXRhLCBoLT50aW1lb3V0KTsKKwlyZXR1cm4gYWR0Zm4oc2V0LCAmZGF0YSwgb3B0X3RpbWVvdXQob3B0LCBoKSwgb3B0LT5jbWRmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIGhhc2hfaXBwb3J0aXA0X3VhZHQoc3RydWN0IGlwX3NldCAqc2V0LCBzdHJ1Y3QgbmxhdHRyICp0YltdLAotCQkgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzKQorCQkgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzLCBib29sIHJldHJpZWQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKIAlzdHJ1Y3QgaGFzaF9pcHBvcnRpcDRfZWxlbSBkYXRhID0geyB9OwotCXUzMiBpcCwgaXBfdG8sIHAsIHBvcnQsIHBvcnRfdG87CisJdTMyIGlwLCBpcF90bywgcCA9IDAsIHBvcnQsIHBvcnRfdG87CiAJdTMyIHRpbWVvdXQgPSBoLT50aW1lb3V0OwogCWJvb2wgd2l0aF9wb3J0cyA9IGZhbHNlOwogCWludCByZXQ7CkBAIC0yMDAsNyArMjEwLDcgQEAKIAlpZiAoYWR0ID09IElQU0VUX1RFU1QgfHwKIAkgICAgISh0YltJUFNFVF9BVFRSX0lQX1RPXSB8fCB0YltJUFNFVF9BVFRSX0NJRFJdIHx8CiAJICAgICAgdGJbSVBTRVRfQVRUUl9QT1JUX1RPXSkpIHsKLQkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCk7CisJCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQsIGZsYWdzKTsKIAkJcmV0dXJuIGlwX3NldF9lZXhpc3QocmV0LCBmbGFncykgPyAwIDogcmV0OwogCX0KIApAQCAtMjE2LDggKzIyNiw3IEBACiAKIAkJaWYgKGNpZHIgPiAzMikKIAkJCXJldHVybiAtSVBTRVRfRVJSX0lOVkFMSURfQ0lEUjsKLQkJaXAgJj0gaXBfc2V0X2hvc3RtYXNrKGNpZHIpOwotCQlpcF90byA9IGlwIHwgfmlwX3NldF9ob3N0bWFzayhjaWRyKTsKKwkJaXBfc2V0X21hc2tfZnJvbV90byhpcCwgaXBfdG8sIGNpZHIpOwogCX0gZWxzZQogCQlpcF90byA9IGlwOwogCkBAIC0yMjgsMTcgKzIzNywyMSBAQAogCQkJc3dhcChwb3J0LCBwb3J0X3RvKTsKIAl9CiAKLQlmb3IgKDsgIWJlZm9yZShpcF90bywgaXApOyBpcCsrKQotCQlmb3IgKHAgPSBwb3J0OyBwIDw9IHBvcnRfdG87IHArKykgeworCWlmIChyZXRyaWVkKQorCQlpcCA9IGgtPm5leHQuaXA7CisJZm9yICg7ICFiZWZvcmUoaXBfdG8sIGlwKTsgaXArKykgeworCQlwID0gcmV0cmllZCAmJiBpcCA9PSBoLT5uZXh0LmlwID8gaC0+bmV4dC5wb3J0IDogcG9ydDsKKwkJZm9yICg7IHAgPD0gcG9ydF90bzsgcCsrKSB7CiAJCQlkYXRhLmlwID0gaHRvbmwoaXApOwogCQkJZGF0YS5wb3J0ID0gaHRvbnMocCk7Ci0JCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0KTsKKwkJCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQsIGZsYWdzKTsKIAogCQkJaWYgKHJldCAmJiAhaXBfc2V0X2VleGlzdChyZXQsIGZsYWdzKSkKIAkJCQlyZXR1cm4gcmV0OwogCQkJZWxzZQogCQkJCXJldCA9IDA7CiAJCX0KKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjc0LDcgKzI4Nyw4IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbAogaGFzaF9pcHBvcnRpcDZfZGF0YV9lcXVhbChjb25zdCBzdHJ1Y3QgaGFzaF9pcHBvcnRpcDZfZWxlbSAqaXAxLAotCQkJICBjb25zdCBzdHJ1Y3QgaGFzaF9pcHBvcnRpcDZfZWxlbSAqaXAyKQorCQkJICBjb25zdCBzdHJ1Y3QgaGFzaF9pcHBvcnRpcDZfZWxlbSAqaXAyLAorCQkJICB1MzIgKm11bHRpKQogewogCXJldHVybiBpcHY2X2FkZHJfY21wKCZpcDEtPmlwLmluNiwgJmlwMi0+aXAuaW42KSA9PSAwICYmCiAJICAgICAgIGlwdjZfYWRkcl9jbXAoJmlwMS0+aXAyLmluNiwgJmlwMi0+aXAyLmluNikgPT0gMCAmJgpAQCAtMzQxLDI3ICszNTUsMzUgQEAKICNkZWZpbmUgSE9TVF9NQVNLCTEyOAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYWhhc2guaD4KIAorc3RhdGljIGlubGluZSB2b2lkCitoYXNoX2lwcG9ydGlwNl9kYXRhX25leHQoc3RydWN0IGlwX3NldF9oYXNoICpoLAorCQkJIGNvbnN0IHN0cnVjdCBoYXNoX2lwcG9ydGlwNl9lbGVtICpkKQoreworCWgtPm5leHQucG9ydCA9IG50b2hzKGQtPnBvcnQpOworfQorCiBzdGF0aWMgaW50CiBoYXNoX2lwcG9ydGlwNl9rYWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTggcGYsIHU4IGRpbSwgdTggZmxhZ3MpCisJCSAgICBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIsCisJCSAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIGNvbnN0IHN0cnVjdCBpcF9zZXRfYWR0X29wdCAqb3B0KQogewogCWNvbnN0IHN0cnVjdCBpcF9zZXRfaGFzaCAqaCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CiAJc3RydWN0IGhhc2hfaXBwb3J0aXA2X2VsZW0gZGF0YSA9IHsgfTsKIAotCWlmICghaXBfc2V0X2dldF9pcDZfcG9ydChza2IsIGZsYWdzICYgSVBTRVRfRElNX1RXT19TUkMsCisJaWYgKCFpcF9zZXRfZ2V0X2lwNl9wb3J0KHNrYiwgb3B0LT5mbGFncyAmIElQU0VUX0RJTV9UV09fU1JDLAogCQkJCSAmZGF0YS5wb3J0LCAmZGF0YS5wcm90bykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaXA2YWRkcnB0cihza2IsIGZsYWdzICYgSVBTRVRfRElNX09ORV9TUkMsICZkYXRhLmlwLmluNik7Ci0JaXA2YWRkcnB0cihza2IsIGZsYWdzICYgSVBTRVRfRElNX1RIUkVFX1NSQywgJmRhdGEuaXAyLmluNik7CisJaXA2YWRkcnB0cihza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQywgJmRhdGEuaXAuaW42KTsKKwlpcDZhZGRycHRyKHNrYiwgb3B0LT5mbGFncyAmIElQU0VUX0RJTV9USFJFRV9TUkMsICZkYXRhLmlwMi5pbjYpOwogCi0JcmV0dXJuIGFkdGZuKHNldCwgJmRhdGEsIGgtPnRpbWVvdXQpOworCXJldHVybiBhZHRmbihzZXQsICZkYXRhLCBvcHRfdGltZW91dChvcHQsIGgpLCBvcHQtPmNtZGZsYWdzKTsKIH0KIAogc3RhdGljIGludAogaGFzaF9pcHBvcnRpcDZfdWFkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCSAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MpCisJCSAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MsIGJvb2wgcmV0cmllZCkKIHsKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwpAQCAtNDE0LDcgKzQzNiw3IEBACiAJfQogCiAJaWYgKGFkdCA9PSBJUFNFVF9URVNUIHx8ICF3aXRoX3BvcnRzIHx8ICF0YltJUFNFVF9BVFRSX1BPUlRfVE9dKSB7Ci0JCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQpOworCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0LCBmbGFncyk7CiAJCXJldHVybiBpcF9zZXRfZWV4aXN0KHJldCwgZmxhZ3MpID8gMCA6IHJldDsKIAl9CiAKQEAgLTQyMyw5ICs0NDUsMTEgQEAKIAlpZiAocG9ydCA+IHBvcnRfdG8pCiAJCXN3YXAocG9ydCwgcG9ydF90byk7CiAKKwlpZiAocmV0cmllZCkKKwkJcG9ydCA9IGgtPm5leHQucG9ydDsKIAlmb3IgKDsgcG9ydCA8PSBwb3J0X3RvOyBwb3J0KyspIHsKIAkJZGF0YS5wb3J0ID0gaHRvbnMocG9ydCk7Ci0JCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQpOworCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0LCBmbGFncyk7CiAKIAkJaWYgKHJldCAmJiAhaXBfc2V0X2VleGlzdChyZXQsIGZsYWdzKSkKIAkJCXJldHVybiByZXQ7CkBAIC01MDksNyArNTMzLDggQEAKIAkuZmVhdHVyZXMJPSBJUFNFVF9UWVBFX0lQIHwgSVBTRVRfVFlQRV9QT1JUIHwgSVBTRVRfVFlQRV9JUDIsCiAJLmRpbWVuc2lvbgk9IElQU0VUX0RJTV9USFJFRSwKIAkuZmFtaWx5CQk9IEFGX1VOU1BFQywKLQkucmV2aXNpb24JPSAxLAorCS5yZXZpc2lvbl9taW4JPSAwLAorCS5yZXZpc2lvbl9tYXgJPSAxLAkvKiBTQ1RQIGFuZCBVRFBMSVRFIHN1cHBvcnQgYWRkZWQgKi8KIAkuY3JlYXRlCQk9IGhhc2hfaXBwb3J0aXBfY3JlYXRlLAogCS5jcmVhdGVfcG9saWN5CT0gewogCQlbSVBTRVRfQVRUUl9IQVNIU0laRV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnRuZXQuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXBwb3J0bmV0LmMKaW5kZXggNDc0M2U1NC4uZGViM2UzZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnRuZXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX2lwcG9ydG5ldC5jCkBAIC02Miw3ICs2Miw4IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbAogaGFzaF9pcHBvcnRuZXQ0X2RhdGFfZXF1YWwoY29uc3Qgc3RydWN0IGhhc2hfaXBwb3J0bmV0NF9lbGVtICppcDEsCi0JCQkgICBjb25zdCBzdHJ1Y3QgaGFzaF9pcHBvcnRuZXQ0X2VsZW0gKmlwMikKKwkJCSAgIGNvbnN0IHN0cnVjdCBoYXNoX2lwcG9ydG5ldDRfZWxlbSAqaXAyLAorCQkJICAgdTMyICptdWx0aSkKIHsKIAlyZXR1cm4gaXAxLT5pcCA9PSBpcDItPmlwICYmCiAJICAgICAgIGlwMS0+aXAyID09IGlwMi0+aXAyICYmCkBAIC0xNDAsMzkgKzE0MSw1MSBAQAogI2RlZmluZSBIT1NUX01BU0sJMzIKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2FoYXNoLmg+CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAoraGFzaF9pcHBvcnRuZXQ0X2RhdGFfbmV4dChzdHJ1Y3QgaXBfc2V0X2hhc2ggKmgsCisJCQkgIGNvbnN0IHN0cnVjdCBoYXNoX2lwcG9ydG5ldDRfZWxlbSAqZCkKK3sKKwloLT5uZXh0LmlwID0gbnRvaGwoZC0+aXApOworCWgtPm5leHQucG9ydCA9IG50b2hzKGQtPnBvcnQpOworCWgtPm5leHQuaXAyID0gbnRvaGwoZC0+aXAyKTsKK30KKwogc3RhdGljIGludAogaGFzaF9pcHBvcnRuZXQ0X2thZHQoc3RydWN0IGlwX3NldCAqc2V0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTggcGYsIHU4IGRpbSwgdTggZmxhZ3MpCisJCSAgICAgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCQkgICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgY29uc3Qgc3RydWN0IGlwX3NldF9hZHRfb3B0ICpvcHQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKLQlzdHJ1Y3QgaGFzaF9pcHBvcnRuZXQ0X2VsZW0gZGF0YSA9Ci0JCXsgLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgfHwgSE9TVF9NQVNLIH07CisJc3RydWN0IGhhc2hfaXBwb3J0bmV0NF9lbGVtIGRhdGEgPSB7CisJCS5jaWRyID0gaC0+bmV0c1swXS5jaWRyID8gaC0+bmV0c1swXS5jaWRyIDogSE9TVF9NQVNLCisJfTsKIAogCWlmIChkYXRhLmNpZHIgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGFkdCA9PSBJUFNFVF9URVNUKQogCQlkYXRhLmNpZHIgPSBIT1NUX01BU0s7CiAKLQlpZiAoIWlwX3NldF9nZXRfaXA0X3BvcnQoc2tiLCBmbGFncyAmIElQU0VUX0RJTV9UV09fU1JDLAorCWlmICghaXBfc2V0X2dldF9pcDRfcG9ydChza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fVFdPX1NSQywKIAkJCQkgJmRhdGEucG9ydCwgJmRhdGEucHJvdG8pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlwNGFkZHJwdHIoc2tiLCBmbGFncyAmIElQU0VUX0RJTV9PTkVfU1JDLCAmZGF0YS5pcCk7Ci0JaXA0YWRkcnB0cihza2IsIGZsYWdzICYgSVBTRVRfRElNX1RIUkVFX1NSQywgJmRhdGEuaXAyKTsKKwlpcDRhZGRycHRyKHNrYiwgb3B0LT5mbGFncyAmIElQU0VUX0RJTV9PTkVfU1JDLCAmZGF0YS5pcCk7CisJaXA0YWRkcnB0cihza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fVEhSRUVfU1JDLCAmZGF0YS5pcDIpOwogCWRhdGEuaXAyICY9IGlwX3NldF9uZXRtYXNrKGRhdGEuY2lkcik7CiAKLQlyZXR1cm4gYWR0Zm4oc2V0LCAmZGF0YSwgaC0+dGltZW91dCk7CisJcmV0dXJuIGFkdGZuKHNldCwgJmRhdGEsIG9wdF90aW1lb3V0KG9wdCwgaCksIG9wdC0+Y21kZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CiBoYXNoX2lwcG9ydG5ldDRfdWFkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCSAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzKQorCQkgICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTMyICpsaW5lbm8sIHUzMiBmbGFncywgYm9vbCByZXRyaWVkKQogewogCWNvbnN0IHN0cnVjdCBpcF9zZXRfaGFzaCAqaCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CiAJc3RydWN0IGhhc2hfaXBwb3J0bmV0NF9lbGVtIGRhdGEgPSB7IC5jaWRyID0gSE9TVF9NQVNLIH07Ci0JdTMyIGlwLCBpcF90bywgcCwgcG9ydCwgcG9ydF90bzsKKwl1MzIgaXAsIGlwX3RvLCBwID0gMCwgcG9ydCwgcG9ydF90bzsKKwl1MzIgaXAyX2Zyb20gPSAwLCBpcDJfdG8sIGlwMl9sYXN0LCBpcDI7CiAJdTMyIHRpbWVvdXQgPSBoLT50aW1lb3V0OwogCWJvb2wgd2l0aF9wb3J0cyA9IGZhbHNlOwogCWludCByZXQ7CkBAIC0xODYsMjEgKzE5OSwxOSBAQAogCWlmICh0YltJUFNFVF9BVFRSX0xJTkVOT10pCiAJCSpsaW5lbm8gPSBubGFfZ2V0X3UzMih0YltJUFNFVF9BVFRSX0xJTkVOT10pOwogCi0JcmV0ID0gaXBfc2V0X2dldF9pcGFkZHI0KHRiW0lQU0VUX0FUVFJfSVBdLCAmZGF0YS5pcCk7CisJcmV0ID0gaXBfc2V0X2dldF9ob3N0aXBhZGRyNCh0YltJUFNFVF9BVFRSX0lQXSwgJmlwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gaXBfc2V0X2dldF9pcGFkZHI0KHRiW0lQU0VUX0FUVFJfSVAyXSwgJmRhdGEuaXAyKTsKKwlyZXQgPSBpcF9zZXRfZ2V0X2hvc3RpcGFkZHI0KHRiW0lQU0VUX0FUVFJfSVAyXSwgJmlwMl9mcm9tKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHRiW0lQU0VUX0FUVFJfQ0lEUjJdKQorCWlmICh0YltJUFNFVF9BVFRSX0NJRFIyXSkgewogCQlkYXRhLmNpZHIgPSBubGFfZ2V0X3U4KHRiW0lQU0VUX0FUVFJfQ0lEUjJdKTsKLQotCWlmICghZGF0YS5jaWRyKQotCQlyZXR1cm4gLUlQU0VUX0VSUl9JTlZBTElEX0NJRFI7Ci0KLQlkYXRhLmlwMiAmPSBpcF9zZXRfbmV0bWFzayhkYXRhLmNpZHIpOworCQlpZiAoIWRhdGEuY2lkcikKKwkJCXJldHVybiAtSVBTRVRfRVJSX0lOVkFMSURfQ0lEUjsKKwl9CiAKIAlpZiAodGJbSVBTRVRfQVRUUl9QT1JUXSkKIAkJZGF0YS5wb3J0ID0gbmxhX2dldF9iZTE2KHRiW0lQU0VUX0FUVFJfUE9SVF0pOwpAQCAtMjI1LDE0ICsyMzYsMTYgQEAKIAkJdGltZW91dCA9IGlwX3NldF90aW1lb3V0X3VnZXQodGJbSVBTRVRfQVRUUl9USU1FT1VUXSk7CiAJfQogCisJd2l0aF9wb3J0cyA9IHdpdGhfcG9ydHMgJiYgdGJbSVBTRVRfQVRUUl9QT1JUX1RPXTsKIAlpZiAoYWR0ID09IElQU0VUX1RFU1QgfHwKLQkgICAgISh0YltJUFNFVF9BVFRSX0lQX1RPXSB8fCB0YltJUFNFVF9BVFRSX0NJRFJdIHx8Ci0JICAgICAgdGJbSVBTRVRfQVRUUl9QT1JUX1RPXSkpIHsKLQkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCk7CisJICAgICEodGJbSVBTRVRfQVRUUl9DSURSXSB8fCB0YltJUFNFVF9BVFRSX0lQX1RPXSB8fCB3aXRoX3BvcnRzIHx8CisJICAgICAgdGJbSVBTRVRfQVRUUl9JUDJfVE9dKSkgeworCQlkYXRhLmlwID0gaHRvbmwoaXApOworCQlkYXRhLmlwMiA9IGh0b25sKGlwMl9mcm9tICYgaXBfc2V0X2hvc3RtYXNrKGRhdGEuY2lkcikpOworCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0LCBmbGFncyk7CiAJCXJldHVybiBpcF9zZXRfZWV4aXN0KHJldCwgZmxhZ3MpID8gMCA6IHJldDsKIAl9CiAKLQlpcCA9IG50b2hsKGRhdGEuaXApOwogCWlmICh0YltJUFNFVF9BVFRSX0lQX1RPXSkgewogCQlyZXQgPSBpcF9zZXRfZ2V0X2hvc3RpcGFkZHI0KHRiW0lQU0VUX0FUVFJfSVBfVE9dLCAmaXBfdG8pOwogCQlpZiAocmV0KQpAQCAtMjQ0LDI5ICsyNTcsNTAgQEAKIAogCQlpZiAoY2lkciA+IDMyKQogCQkJcmV0dXJuIC1JUFNFVF9FUlJfSU5WQUxJRF9DSURSOwotCQlpcCAmPSBpcF9zZXRfaG9zdG1hc2soY2lkcik7Ci0JCWlwX3RvID0gaXAgfCB+aXBfc2V0X2hvc3RtYXNrKGNpZHIpOwotCX0gZWxzZQotCQlpcF90byA9IGlwOworCQlpcF9zZXRfbWFza19mcm9tX3RvKGlwLCBpcF90bywgY2lkcik7CisJfQogCiAJcG9ydF90byA9IHBvcnQgPSBudG9ocyhkYXRhLnBvcnQpOwotCWlmICh3aXRoX3BvcnRzICYmIHRiW0lQU0VUX0FUVFJfUE9SVF9UT10pIHsKKwlpZiAodGJbSVBTRVRfQVRUUl9QT1JUX1RPXSkgewogCQlwb3J0X3RvID0gaXBfc2V0X2dldF9oMTYodGJbSVBTRVRfQVRUUl9QT1JUX1RPXSk7CiAJCWlmIChwb3J0ID4gcG9ydF90bykKIAkJCXN3YXAocG9ydCwgcG9ydF90byk7CiAJfQorCWlmICh0YltJUFNFVF9BVFRSX0lQMl9UT10pIHsKKwkJcmV0ID0gaXBfc2V0X2dldF9ob3N0aXBhZGRyNCh0YltJUFNFVF9BVFRSX0lQMl9UT10sICZpcDJfdG8pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGlwMl9mcm9tID4gaXAyX3RvKQorCQkJc3dhcChpcDJfZnJvbSwgaXAyX3RvKTsKKwkJaWYgKGlwMl9mcm9tICsgVUlOVF9NQVggPT0gaXAyX3RvKQorCQkJcmV0dXJuIC1JUFNFVF9FUlJfSEFTSF9SQU5HRTsKKwl9IGVsc2UgeworCQlpcF9zZXRfbWFza19mcm9tX3RvKGlwMl9mcm9tLCBpcDJfdG8sIGRhdGEuY2lkcik7CisJfQogCi0JZm9yICg7ICFiZWZvcmUoaXBfdG8sIGlwKTsgaXArKykKLQkJZm9yIChwID0gcG9ydDsgcCA8PSBwb3J0X3RvOyBwKyspIHsKLQkJCWRhdGEuaXAgPSBodG9ubChpcCk7CisJaWYgKHJldHJpZWQpCisJCWlwID0gaC0+bmV4dC5pcDsKKwlmb3IgKDsgIWJlZm9yZShpcF90bywgaXApOyBpcCsrKSB7CisJCWRhdGEuaXAgPSBodG9ubChpcCk7CisJCXAgPSByZXRyaWVkICYmIGlwID09IGgtPm5leHQuaXAgPyBoLT5uZXh0LnBvcnQgOiBwb3J0OworCQlmb3IgKDsgcCA8PSBwb3J0X3RvOyBwKyspIHsKIAkJCWRhdGEucG9ydCA9IGh0b25zKHApOwotCQkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCk7CisJCQlpcDIgPSByZXRyaWVkICYmIGlwID09IGgtPm5leHQuaXAgJiYgcCA9PSBoLT5uZXh0LnBvcnQKKwkJCQk/IGgtPm5leHQuaXAyIDogaXAyX2Zyb207CisJCQl3aGlsZSAoIWFmdGVyKGlwMiwgaXAyX3RvKSkgeworCQkJCWRhdGEuaXAyID0gaHRvbmwoaXAyKTsKKwkJCQlpcDJfbGFzdCA9IGlwX3NldF9yYW5nZV90b19jaWRyKGlwMiwgaXAyX3RvLAorCQkJCQkJCQkmZGF0YS5jaWRyKTsKKwkJCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0LCBmbGFncyk7CiAKLQkJCWlmIChyZXQgJiYgIWlwX3NldF9lZXhpc3QocmV0LCBmbGFncykpCi0JCQkJcmV0dXJuIHJldDsKLQkJCWVsc2UKLQkJCQlyZXQgPSAwOworCQkJCWlmIChyZXQgJiYgIWlwX3NldF9lZXhpc3QocmV0LCBmbGFncykpCisJCQkJCXJldHVybiByZXQ7CisJCQkJZWxzZQorCQkJCQlyZXQgPSAwOworCQkJCWlwMiA9IGlwMl9sYXN0ICsgMTsKKwkJCX0KIAkJfQorCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zMDIsNyArMzM2LDggQEAKIAogc3RhdGljIGlubGluZSBib29sCiBoYXNoX2lwcG9ydG5ldDZfZGF0YV9lcXVhbChjb25zdCBzdHJ1Y3QgaGFzaF9pcHBvcnRuZXQ2X2VsZW0gKmlwMSwKLQkJCSAgIGNvbnN0IHN0cnVjdCBoYXNoX2lwcG9ydG5ldDZfZWxlbSAqaXAyKQorCQkJICAgY29uc3Qgc3RydWN0IGhhc2hfaXBwb3J0bmV0Nl9lbGVtICppcDIsCisJCQkgICB1MzIgKm11bHRpKQogewogCXJldHVybiBpcHY2X2FkZHJfY21wKCZpcDEtPmlwLmluNiwgJmlwMi0+aXAuaW42KSA9PSAwICYmCiAJICAgICAgIGlwdjZfYWRkcl9jbXAoJmlwMS0+aXAyLmluNiwgJmlwMi0+aXAyLmluNikgPT0gMCAmJgpAQCAtMzg4LDM0ICs0MjMsNDMgQEAKICNkZWZpbmUgSE9TVF9NQVNLCTEyOAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYWhhc2guaD4KIAorc3RhdGljIGlubGluZSB2b2lkCitoYXNoX2lwcG9ydG5ldDZfZGF0YV9uZXh0KHN0cnVjdCBpcF9zZXRfaGFzaCAqaCwKKwkJCSAgY29uc3Qgc3RydWN0IGhhc2hfaXBwb3J0bmV0Nl9lbGVtICpkKQoreworCWgtPm5leHQucG9ydCA9IG50b2hzKGQtPnBvcnQpOworfQorCiBzdGF0aWMgaW50CiBoYXNoX2lwcG9ydG5ldDZfa2FkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1OCBwZiwgdTggZGltLCB1OCBmbGFncykKKwkJICAgICBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIsCisJCSAgICAgZW51bSBpcHNldF9hZHQgYWR0LCBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCkKIHsKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwotCXN0cnVjdCBoYXNoX2lwcG9ydG5ldDZfZWxlbSBkYXRhID0KLQkJeyAuY2lkciA9IGgtPm5ldHNbMF0uY2lkciB8fCBIT1NUX01BU0sgfTsKKwlzdHJ1Y3QgaGFzaF9pcHBvcnRuZXQ2X2VsZW0gZGF0YSA9IHsKKwkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgPyBoLT5uZXRzWzBdLmNpZHIgOiBIT1NUX01BU0sKKwl9OwogCiAJaWYgKGRhdGEuY2lkciA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoYWR0ID09IElQU0VUX1RFU1QpCiAJCWRhdGEuY2lkciA9IEhPU1RfTUFTSzsKIAotCWlmICghaXBfc2V0X2dldF9pcDZfcG9ydChza2IsIGZsYWdzICYgSVBTRVRfRElNX1RXT19TUkMsCisJaWYgKCFpcF9zZXRfZ2V0X2lwNl9wb3J0KHNrYiwgb3B0LT5mbGFncyAmIElQU0VUX0RJTV9UV09fU1JDLAogCQkJCSAmZGF0YS5wb3J0LCAmZGF0YS5wcm90bykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaXA2YWRkcnB0cihza2IsIGZsYWdzICYgSVBTRVRfRElNX09ORV9TUkMsICZkYXRhLmlwLmluNik7Ci0JaXA2YWRkcnB0cihza2IsIGZsYWdzICYgSVBTRVRfRElNX1RIUkVFX1NSQywgJmRhdGEuaXAyLmluNik7CisJaXA2YWRkcnB0cihza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQywgJmRhdGEuaXAuaW42KTsKKwlpcDZhZGRycHRyKHNrYiwgb3B0LT5mbGFncyAmIElQU0VUX0RJTV9USFJFRV9TUkMsICZkYXRhLmlwMi5pbjYpOwogCWlwNl9uZXRtYXNrKCZkYXRhLmlwMiwgZGF0YS5jaWRyKTsKIAotCXJldHVybiBhZHRmbihzZXQsICZkYXRhLCBoLT50aW1lb3V0KTsKKwlyZXR1cm4gYWR0Zm4oc2V0LCAmZGF0YSwgb3B0X3RpbWVvdXQob3B0LCBoKSwgb3B0LT5jbWRmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIGhhc2hfaXBwb3J0bmV0Nl91YWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgc3RydWN0IG5sYXR0ciAqdGJbXSwKLQkJICAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MpCisJCSAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzLCBib29sIHJldHJpZWQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKQEAgLTQzMiw2ICs0NzYsOCBAQAogCQkgICAgIHRiW0lQU0VUX0FUVFJfSVBfVE9dIHx8CiAJCSAgICAgdGJbSVBTRVRfQVRUUl9DSURSXSkpCiAJCXJldHVybiAtSVBTRVRfRVJSX1BST1RPQ09MOworCWlmICh1bmxpa2VseSh0YltJUFNFVF9BVFRSX0lQX1RPXSkpCisJCXJldHVybiAtSVBTRVRfRVJSX0hBU0hfUkFOR0VfVU5TVVBQT1JURUQ7CiAKIAlpZiAodGJbSVBTRVRfQVRUUl9MSU5FTk9dKQogCQkqbGluZW5vID0gbmxhX2dldF91MzIodGJbSVBTRVRfQVRUUl9MSU5FTk9dKTsKQEAgLTQ3Niw3ICs1MjIsNyBAQAogCX0KIAogCWlmIChhZHQgPT0gSVBTRVRfVEVTVCB8fCAhd2l0aF9wb3J0cyB8fCAhdGJbSVBTRVRfQVRUUl9QT1JUX1RPXSkgewotCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0KTsKKwkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCwgZmxhZ3MpOwogCQlyZXR1cm4gaXBfc2V0X2VleGlzdChyZXQsIGZsYWdzKSA/IDAgOiByZXQ7CiAJfQogCkBAIC00ODUsOSArNTMxLDExIEBACiAJaWYgKHBvcnQgPiBwb3J0X3RvKQogCQlzd2FwKHBvcnQsIHBvcnRfdG8pOwogCisJaWYgKHJldHJpZWQpCisJCXBvcnQgPSBoLT5uZXh0LnBvcnQ7CiAJZm9yICg7IHBvcnQgPD0gcG9ydF90bzsgcG9ydCsrKSB7CiAJCWRhdGEucG9ydCA9IGh0b25zKHBvcnQpOwotCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0KTsKKwkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCwgZmxhZ3MpOwogCiAJCWlmIChyZXQgJiYgIWlwX3NldF9lZXhpc3QocmV0LCBmbGFncykpCiAJCQlyZXR1cm4gcmV0OwpAQCAtNTc0LDcgKzYyMiw5IEBACiAJLmZlYXR1cmVzCT0gSVBTRVRfVFlQRV9JUCB8IElQU0VUX1RZUEVfUE9SVCB8IElQU0VUX1RZUEVfSVAyLAogCS5kaW1lbnNpb24JPSBJUFNFVF9ESU1fVEhSRUUsCiAJLmZhbWlseQkJPSBBRl9VTlNQRUMsCi0JLnJldmlzaW9uCT0gMSwKKwkucmV2aXNpb25fbWluCT0gMCwKKwkvKgkJICAxCSAgIFNDVFAgYW5kIFVEUExJVEUgc3VwcG9ydCBhZGRlZCAqLworCS5yZXZpc2lvbl9tYXgJPSAyLAkvKiBSYW5nZSBhcyBpbnB1dCBzdXBwb3J0IGZvciBJUHY0IGFkZGVkICovCiAJLmNyZWF0ZQkJPSBoYXNoX2lwcG9ydG5ldF9jcmVhdGUsCiAJLmNyZWF0ZV9wb2xpY3kJPSB7CiAJCVtJUFNFVF9BVFRSX0hBU0hTSVpFXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCkBAIC01ODcsNiArNjM3LDcgQEAKIAkJW0lQU0VUX0FUVFJfSVBdCQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCiAJCVtJUFNFVF9BVFRSX0lQX1RPXQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCiAJCVtJUFNFVF9BVFRSX0lQMl0JPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCQlbSVBTRVRfQVRUUl9JUDJfVE9dCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKIAkJW0lQU0VUX0FUVFJfUE9SVF0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCQlbSVBTRVRfQVRUUl9QT1JUX1RPXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJCVtJUFNFVF9BVFRSX0NJRFJdCT0geyAudHlwZSA9IE5MQV9VOCB9LApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXQuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfbmV0LmMKaW5kZXggYzRkYjIwMi4uNjBkMDE2NSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX25ldC5jCkBAIC01OCw3ICs1OCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbAogaGFzaF9uZXQ0X2RhdGFfZXF1YWwoY29uc3Qgc3RydWN0IGhhc2hfbmV0NF9lbGVtICppcDEsCi0JCSAgICBjb25zdCBzdHJ1Y3QgaGFzaF9uZXQ0X2VsZW0gKmlwMikKKwkJICAgICBjb25zdCBzdHJ1Y3QgaGFzaF9uZXQ0X2VsZW0gKmlwMiwKKwkJICAgICB1MzIgKm11bHRpKQogewogCXJldHVybiBpcDEtPmlwID09IGlwMi0+aXAgJiYgaXAxLT5jaWRyID09IGlwMi0+Y2lkcjsKIH0KQEAgLTEyNSwzMyArMTI2LDQ0IEBACiAjZGVmaW5lIEhPU1RfTUFTSwkzMgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYWhhc2guaD4KIAorc3RhdGljIGlubGluZSB2b2lkCitoYXNoX25ldDRfZGF0YV9uZXh0KHN0cnVjdCBpcF9zZXRfaGFzaCAqaCwKKwkJICAgIGNvbnN0IHN0cnVjdCBoYXNoX25ldDRfZWxlbSAqZCkKK3sKKwloLT5uZXh0LmlwID0gbnRvaGwoZC0+aXApOworfQorCiBzdGF0aWMgaW50CiBoYXNoX25ldDRfa2FkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICAgICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTggcGYsIHU4IGRpbSwgdTggZmxhZ3MpCisJICAgICAgIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKKwkgICAgICAgZW51bSBpcHNldF9hZHQgYWR0LCBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCkKIHsKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwotCXN0cnVjdCBoYXNoX25ldDRfZWxlbSBkYXRhID0geyAuY2lkciA9IGgtPm5ldHNbMF0uY2lkciB8fCBIT1NUX01BU0sgfTsKKwlzdHJ1Y3QgaGFzaF9uZXQ0X2VsZW0gZGF0YSA9IHsKKwkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgPyBoLT5uZXRzWzBdLmNpZHIgOiBIT1NUX01BU0sKKwl9OwogCiAJaWYgKGRhdGEuY2lkciA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoYWR0ID09IElQU0VUX1RFU1QpCiAJCWRhdGEuY2lkciA9IEhPU1RfTUFTSzsKIAotCWlwNGFkZHJwdHIoc2tiLCBmbGFncyAmIElQU0VUX0RJTV9PTkVfU1JDLCAmZGF0YS5pcCk7CisJaXA0YWRkcnB0cihza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQywgJmRhdGEuaXApOwogCWRhdGEuaXAgJj0gaXBfc2V0X25ldG1hc2soZGF0YS5jaWRyKTsKIAotCXJldHVybiBhZHRmbihzZXQsICZkYXRhLCBoLT50aW1lb3V0KTsKKwlyZXR1cm4gYWR0Zm4oc2V0LCAmZGF0YSwgb3B0X3RpbWVvdXQob3B0LCBoKSwgb3B0LT5jbWRmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIGhhc2hfbmV0NF91YWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgc3RydWN0IG5sYXR0ciAqdGJbXSwKLQkgICAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzKQorCSAgICAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MsIGJvb2wgcmV0cmllZCkKIHsKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwogCXN0cnVjdCBoYXNoX25ldDRfZWxlbSBkYXRhID0geyAuY2lkciA9IEhPU1RfTUFTSyB9OwogCXUzMiB0aW1lb3V0ID0gaC0+dGltZW91dDsKKwl1MzIgaXAgPSAwLCBpcF90bywgbGFzdDsKIAlpbnQgcmV0OwogCiAJaWYgKHVubGlrZWx5KCF0YltJUFNFVF9BVFRSX0lQXSB8fApAQCAtMTYxLDE3ICsxNzMsMTUgQEAKIAlpZiAodGJbSVBTRVRfQVRUUl9MSU5FTk9dKQogCQkqbGluZW5vID0gbmxhX2dldF91MzIodGJbSVBTRVRfQVRUUl9MSU5FTk9dKTsKIAotCXJldCA9IGlwX3NldF9nZXRfaXBhZGRyNCh0YltJUFNFVF9BVFRSX0lQXSwgJmRhdGEuaXApOworCXJldCA9IGlwX3NldF9nZXRfaG9zdGlwYWRkcjQodGJbSVBTRVRfQVRUUl9JUF0sICZpcCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICh0YltJUFNFVF9BVFRSX0NJRFJdKQorCWlmICh0YltJUFNFVF9BVFRSX0NJRFJdKSB7CiAJCWRhdGEuY2lkciA9IG5sYV9nZXRfdTgodGJbSVBTRVRfQVRUUl9DSURSXSk7Ci0KLQlpZiAoIWRhdGEuY2lkcikKLQkJcmV0dXJuIC1JUFNFVF9FUlJfSU5WQUxJRF9DSURSOwotCi0JZGF0YS5pcCAmPSBpcF9zZXRfbmV0bWFzayhkYXRhLmNpZHIpOworCQlpZiAoIWRhdGEuY2lkcikKKwkJCXJldHVybiAtSVBTRVRfRVJSX0lOVkFMSURfQ0lEUjsKKwl9CiAKIAlpZiAodGJbSVBTRVRfQVRUUl9USU1FT1VUXSkgewogCQlpZiAoIXdpdGhfdGltZW91dChoLT50aW1lb3V0KSkKQEAgLTE3OSw5ICsxODksMzUgQEAKIAkJdGltZW91dCA9IGlwX3NldF90aW1lb3V0X3VnZXQodGJbSVBTRVRfQVRUUl9USU1FT1VUXSk7CiAJfQogCi0JcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCk7CisJaWYgKGFkdCA9PSBJUFNFVF9URVNUIHx8ICF0YltJUFNFVF9BVFRSX0lQX1RPXSkgeworCQlkYXRhLmlwID0gaHRvbmwoaXAgJiBpcF9zZXRfaG9zdG1hc2soZGF0YS5jaWRyKSk7CisJCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQsIGZsYWdzKTsKKwkJcmV0dXJuIGlwX3NldF9lZXhpc3QocmV0LCBmbGFncykgPyAwIDogcmV0OworCX0KIAotCXJldHVybiBpcF9zZXRfZWV4aXN0KHJldCwgZmxhZ3MpID8gMCA6IHJldDsKKwlpcF90byA9IGlwOworCWlmICh0YltJUFNFVF9BVFRSX0lQX1RPXSkgeworCQlyZXQgPSBpcF9zZXRfZ2V0X2hvc3RpcGFkZHI0KHRiW0lQU0VUX0FUVFJfSVBfVE9dLCAmaXBfdG8pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGlwX3RvIDwgaXApCisJCQlzd2FwKGlwLCBpcF90byk7CisJCWlmIChpcCArIFVJTlRfTUFYID09IGlwX3RvKQorCQkJcmV0dXJuIC1JUFNFVF9FUlJfSEFTSF9SQU5HRTsKKwl9CisJaWYgKHJldHJpZWQpCisJCWlwID0gaC0+bmV4dC5pcDsKKwl3aGlsZSAoIWFmdGVyKGlwLCBpcF90bykpIHsKKwkJZGF0YS5pcCA9IGh0b25sKGlwKTsKKwkJbGFzdCA9IGlwX3NldF9yYW5nZV90b19jaWRyKGlwLCBpcF90bywgJmRhdGEuY2lkcik7CisJCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQsIGZsYWdzKTsKKwkJaWYgKHJldCAmJiAhaXBfc2V0X2VleGlzdChyZXQsIGZsYWdzKSkKKwkJCXJldHVybiByZXQ7CisJCWVsc2UKKwkJCXJldCA9IDA7CisJCWlwID0gbGFzdCArIDE7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBib29sCkBAIC0yMTQsNyArMjUwLDggQEAKIAogc3RhdGljIGlubGluZSBib29sCiBoYXNoX25ldDZfZGF0YV9lcXVhbChjb25zdCBzdHJ1Y3QgaGFzaF9uZXQ2X2VsZW0gKmlwMSwKLQkJICAgICBjb25zdCBzdHJ1Y3QgaGFzaF9uZXQ2X2VsZW0gKmlwMikKKwkJICAgICBjb25zdCBzdHJ1Y3QgaGFzaF9uZXQ2X2VsZW0gKmlwMiwKKwkJICAgICB1MzIgKm11bHRpKQogewogCXJldHVybiBpcHY2X2FkZHJfY21wKCZpcDEtPmlwLmluNiwgJmlwMi0+aXAuaW42KSA9PSAwICYmCiAJICAgICAgIGlwMS0+Y2lkciA9PSBpcDItPmNpZHI7CkBAIC0yOTAsMjggKzMyNywzNyBAQAogI2RlZmluZSBIT1NUX01BU0sJMTI4CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9haGFzaC5oPgogCitzdGF0aWMgaW5saW5lIHZvaWQKK2hhc2hfbmV0Nl9kYXRhX25leHQoc3RydWN0IGlwX3NldF9oYXNoICpoLAorCQkgICAgY29uc3Qgc3RydWN0IGhhc2hfbmV0Nl9lbGVtICpkKQoreworfQorCiBzdGF0aWMgaW50CiBoYXNoX25ldDZfa2FkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICAgICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTggcGYsIHU4IGRpbSwgdTggZmxhZ3MpCisJICAgICAgIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKKwkgICAgICAgZW51bSBpcHNldF9hZHQgYWR0LCBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCkKIHsKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwotCXN0cnVjdCBoYXNoX25ldDZfZWxlbSBkYXRhID0geyAuY2lkciA9IGgtPm5ldHNbMF0uY2lkciB8fCBIT1NUX01BU0sgfTsKKwlzdHJ1Y3QgaGFzaF9uZXQ2X2VsZW0gZGF0YSA9IHsKKwkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgPyBoLT5uZXRzWzBdLmNpZHIgOiBIT1NUX01BU0sKKwl9OwogCiAJaWYgKGRhdGEuY2lkciA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoYWR0ID09IElQU0VUX1RFU1QpCiAJCWRhdGEuY2lkciA9IEhPU1RfTUFTSzsKIAotCWlwNmFkZHJwdHIoc2tiLCBmbGFncyAmIElQU0VUX0RJTV9PTkVfU1JDLCAmZGF0YS5pcC5pbjYpOworCWlwNmFkZHJwdHIoc2tiLCBvcHQtPmZsYWdzICYgSVBTRVRfRElNX09ORV9TUkMsICZkYXRhLmlwLmluNik7CiAJaXA2X25ldG1hc2soJmRhdGEuaXAsIGRhdGEuY2lkcik7CiAKLQlyZXR1cm4gYWR0Zm4oc2V0LCAmZGF0YSwgaC0+dGltZW91dCk7CisJcmV0dXJuIGFkdGZuKHNldCwgJmRhdGEsIG9wdF90aW1lb3V0KG9wdCwgaCksIG9wdC0+Y21kZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CiBoYXNoX25ldDZfdWFkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHN0cnVjdCBubGF0dHIgKnRiW10sCi0JICAgICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTMyICpsaW5lbm8sIHUzMiBmbGFncykKKwkgICAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzLCBib29sIHJldHJpZWQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKQEAgLTMyMiw2ICszNjgsOCBAQAogCWlmICh1bmxpa2VseSghdGJbSVBTRVRfQVRUUl9JUF0gfHwKIAkJICAgICAhaXBfc2V0X29wdGF0dHJfbmV0b3JkZXIodGIsIElQU0VUX0FUVFJfVElNRU9VVCkpKQogCQlyZXR1cm4gLUlQU0VUX0VSUl9QUk9UT0NPTDsKKwlpZiAodW5saWtlbHkodGJbSVBTRVRfQVRUUl9JUF9UT10pKQorCQlyZXR1cm4gLUlQU0VUX0VSUl9IQVNIX1JBTkdFX1VOU1VQUE9SVEVEOwogCiAJaWYgKHRiW0lQU0VUX0FUVFJfTElORU5PXSkKIAkJKmxpbmVubyA9IG5sYV9nZXRfdTMyKHRiW0lQU0VUX0FUVFJfTElORU5PXSk7CkBAIC0zNDQsNyArMzkyLDcgQEAKIAkJdGltZW91dCA9IGlwX3NldF90aW1lb3V0X3VnZXQodGJbSVBTRVRfQVRUUl9USU1FT1VUXSk7CiAJfQogCi0JcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCk7CisJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCwgZmxhZ3MpOwogCiAJcmV0dXJuIGlwX3NldF9lZXhpc3QocmV0LCBmbGFncykgPyAwIDogcmV0OwogfQpAQCAtNDI1LDcgKzQ3Myw4IEBACiAJLmZlYXR1cmVzCT0gSVBTRVRfVFlQRV9JUCwKIAkuZGltZW5zaW9uCT0gSVBTRVRfRElNX09ORSwKIAkuZmFtaWx5CQk9IEFGX1VOU1BFQywKLQkucmV2aXNpb24JPSAwLAorCS5yZXZpc2lvbl9taW4JPSAwLAorCS5yZXZpc2lvbl9tYXgJPSAxLAkvKiBSYW5nZSBhcyBpbnB1dCBzdXBwb3J0IGZvciBJUHY0IGFkZGVkICovCiAJLmNyZWF0ZQkJPSBoYXNoX25ldF9jcmVhdGUsCiAJLmNyZWF0ZV9wb2xpY3kJPSB7CiAJCVtJUFNFVF9BVFRSX0hBU0hTSVpFXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCkBAIC00MzYsNiArNDg1LDcgQEAKIAl9LAogCS5hZHRfcG9saWN5CT0gewogCQlbSVBTRVRfQVRUUl9JUF0JCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKKwkJW0lQU0VUX0FUVFJfSVBfVE9dCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKIAkJW0lQU0VUX0FUVFJfQ0lEUl0JPSB7IC50eXBlID0gTkxBX1U4IH0sCiAJCVtJUFNFVF9BVFRSX1RJTUVPVVRdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAl9LApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXRpZmFjZS5jIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXRpZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzA5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX25ldGlmYWNlLmMKQEAgLTAsMCArMSw3ODYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMSBKb3pzZWYgS2FkbGVjc2lrIDxrYWRsZWNAYmxhY2tob2xlLmtma2kuaHU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKiBLZXJuZWwgbW9kdWxlIGltcGxlbWVudGluZyBhbiBJUCBzZXQgdHlwZTogdGhlIGhhc2g6bmV0LGlmYWNlIHR5cGUgKi8KKworI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9wZnhsZW4uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF90aW1lb3V0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkpvenNlZiBLYWRsZWNzaWsgPGthZGxlY0BibGFja2hvbGUua2ZraS5odT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaGFzaDpuZXQsaWZhY2UgdHlwZSBvZiBJUCBzZXRzIik7CitNT0RVTEVfQUxJQVMoImlwX3NldF9oYXNoOm5ldCxpZmFjZSIpOworCisvKiBJbnRlcmZhY2UgbmFtZSByYnRyZWUgKi8KKworc3RydWN0IGlmYWNlX25vZGUgeworCXN0cnVjdCByYl9ub2RlIG5vZGU7CisJY2hhciBpZmFjZVtJRk5BTVNJWl07Cit9OworCisjZGVmaW5lIGlmYWNlX2RhdGEobikJKHJiX2VudHJ5KG4sIHN0cnVjdCBpZmFjZV9ub2RlLCBub2RlKS0+aWZhY2UpCisKK3N0YXRpYyBpbmxpbmUgbG9uZworaWZuYW1lX2NvbXBhcmUoY29uc3QgY2hhciAqX2EsIGNvbnN0IGNoYXIgKl9iKQoreworCWNvbnN0IGxvbmcgKmEgPSAoY29uc3QgbG9uZyAqKV9hOworCWNvbnN0IGxvbmcgKmIgPSAoY29uc3QgbG9uZyAqKV9iOworCisJQlVJTERfQlVHX09OKElGTkFNU0laID4gNCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJaWYgKGFbMF0gIT0gYlswXSkKKwkJcmV0dXJuIGFbMF0gLSBiWzBdOworCWlmIChJRk5BTVNJWiA+IHNpemVvZihsb25nKSkgeworCQlpZiAoYVsxXSAhPSBiWzFdKQorCQkJcmV0dXJuIGFbMV0gLSBiWzFdOworCX0KKwlpZiAoSUZOQU1TSVogPiAyICogc2l6ZW9mKGxvbmcpKSB7CisJCWlmIChhWzJdICE9IGJbMl0pCisJCQlyZXR1cm4gYVsyXSAtIGJbMl07CisJfQorCWlmIChJRk5BTVNJWiA+IDMgKiBzaXplb2YobG9uZykpIHsKKwkJaWYgKGFbM10gIT0gYlszXSkKKwkJCXJldHVybiBhWzNdIC0gYlszXTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCityYnRyZWVfZGVzdHJveShzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcCwgKm4gPSByb290LT5yYl9ub2RlOworCXN0cnVjdCBpZmFjZV9ub2RlICpub2RlOworCisJLyogTm9uLXJlY3Vyc2l2ZSBkZXN0cm95LCBsaWtlIGluIGV4dDMgKi8KKwl3aGlsZSAobikgeworCQlpZiAobi0+cmJfbGVmdCkgeworCQkJbiA9IG4tPnJiX2xlZnQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobi0+cmJfcmlnaHQpIHsKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJCWNvbnRpbnVlOworCQl9CisJCXAgPSByYl9wYXJlbnQobik7CisJCW5vZGUgPSByYl9lbnRyeShuLCBzdHJ1Y3QgaWZhY2Vfbm9kZSwgbm9kZSk7CisJCWlmICghcCkKKwkJCSpyb290ID0gUkJfUk9PVDsKKwkJZWxzZSBpZiAocC0+cmJfbGVmdCA9PSBuKQorCQkJcC0+cmJfbGVmdCA9IE5VTEw7CisJCWVsc2UgaWYgKHAtPnJiX3JpZ2h0ID09IG4pCisJCQlwLT5yYl9yaWdodCA9IE5VTEw7CisKKwkJa2ZyZWUobm9kZSk7CisJCW4gPSBwOworCX0KK30KKworc3RhdGljIGludAoraWZhY2VfdGVzdChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgY29uc3QgY2hhciAqKmlmYWNlKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcm9vdC0+cmJfbm9kZTsKKworCXdoaWxlIChuKSB7CisJCWNvbnN0IGNoYXIgKmQgPSBpZmFjZV9kYXRhKG4pOworCQlsb25nIHJlcyA9IGlmbmFtZV9jb21wYXJlKCppZmFjZSwgZCk7CisKKwkJaWYgKHJlcyA8IDApCisJCQluID0gbi0+cmJfbGVmdDsKKwkJZWxzZSBpZiAocmVzID4gMCkKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJZWxzZSB7CisJCQkqaWZhY2UgPSBkOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lmYWNlX2FkZChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgY29uc3QgY2hhciAqKmlmYWNlKQoreworCXN0cnVjdCByYl9ub2RlICoqbiA9ICYocm9vdC0+cmJfbm9kZSksICpwID0gTlVMTDsKKwlzdHJ1Y3QgaWZhY2Vfbm9kZSAqZDsKKworCXdoaWxlICgqbikgeworCQljaGFyICppZm5hbWUgPSBpZmFjZV9kYXRhKCpuKTsKKwkJbG9uZyByZXMgPSBpZm5hbWVfY29tcGFyZSgqaWZhY2UsIGlmbmFtZSk7CisKKwkJcCA9ICpuOworCQlpZiAocmVzIDwgMCkKKwkJCW4gPSAmKCgqbiktPnJiX2xlZnQpOworCQllbHNlIGlmIChyZXMgPiAwKQorCQkJbiA9ICYoKCpuKS0+cmJfcmlnaHQpOworCQllbHNlIHsKKwkJCSppZmFjZSA9IGlmbmFtZTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJZCA9IGt6YWxsb2Moc2l6ZW9mKCpkKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFkKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzdHJjcHkoZC0+aWZhY2UsICppZmFjZSk7CisKKwlyYl9saW5rX25vZGUoJmQtPm5vZGUsIHAsIG4pOworCXJiX2luc2VydF9jb2xvcigmZC0+bm9kZSwgcm9vdCk7CisKKwkqaWZhY2UgPSBkLT5pZmFjZTsKKwlyZXR1cm4gMDsKK30KKworLyogVHlwZSBzcGVjaWZpYyBmdW5jdGlvbiBwcmVmaXggKi8KKyNkZWZpbmUgVFlQRQkJaGFzaF9uZXRpZmFjZQorCitzdGF0aWMgYm9vbAoraGFzaF9uZXRpZmFjZV9zYW1lX3NldChjb25zdCBzdHJ1Y3QgaXBfc2V0ICphLCBjb25zdCBzdHJ1Y3QgaXBfc2V0ICpiKTsKKworI2RlZmluZSBoYXNoX25ldGlmYWNlNF9zYW1lX3NldAloYXNoX25ldGlmYWNlX3NhbWVfc2V0CisjZGVmaW5lIGhhc2hfbmV0aWZhY2U2X3NhbWVfc2V0CWhhc2hfbmV0aWZhY2Vfc2FtZV9zZXQKKworI2RlZmluZSBTVFJFUShhLCBiKQkoc3RyY21wKGEsIGIpID09IDApCisKKy8qIFRoZSB0eXBlIHZhcmlhbnQgZnVuY3Rpb25zOiBJUHY0ICovCisKK3N0cnVjdCBoYXNoX25ldGlmYWNlNF9lbGVtX2hhc2hlZCB7CisJX19iZTMyIGlwOworCXU4IHBoeXNkZXY7CisJdTggY2lkcjsKKwl1MTYgcGFkZGluZzsKK307CisKKyNkZWZpbmUgSEtFWV9EQVRBTEVOCXNpemVvZihzdHJ1Y3QgaGFzaF9uZXRpZmFjZTRfZWxlbV9oYXNoZWQpCisKKy8qIE1lbWJlciBlbGVtZW50cyB3aXRob3V0IHRpbWVvdXQgKi8KK3N0cnVjdCBoYXNoX25ldGlmYWNlNF9lbGVtIHsKKwlfX2JlMzIgaXA7CisJdTggcGh5c2RldjsKKwl1OCBjaWRyOworCXUxNiBwYWRkaW5nOworCWNvbnN0IGNoYXIgKmlmYWNlOworfTsKKworLyogTWVtYmVyIGVsZW1lbnRzIHdpdGggdGltZW91dCBzdXBwb3J0ICovCitzdHJ1Y3QgaGFzaF9uZXRpZmFjZTRfdGVsZW0geworCV9fYmUzMiBpcDsKKwl1OCBwaHlzZGV2OworCXU4IGNpZHI7CisJdTE2IHBhZGRpbmc7CisJY29uc3QgY2hhciAqaWZhY2U7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworfTsKKworc3RhdGljIGlubGluZSBib29sCitoYXNoX25ldGlmYWNlNF9kYXRhX2VxdWFsKGNvbnN0IHN0cnVjdCBoYXNoX25ldGlmYWNlNF9lbGVtICppcDEsCisJCQkgIGNvbnN0IHN0cnVjdCBoYXNoX25ldGlmYWNlNF9lbGVtICppcDIsCisJCQkgIHUzMiAqbXVsdGkpCit7CisJcmV0dXJuIGlwMS0+aXAgPT0gaXAyLT5pcCAmJgorCSAgICAgICBpcDEtPmNpZHIgPT0gaXAyLT5jaWRyICYmCisJICAgICAgICgrKyptdWx0aSkgJiYKKwkgICAgICAgaXAxLT5waHlzZGV2ID09IGlwMi0+cGh5c2RldiAmJgorCSAgICAgICBpcDEtPmlmYWNlID09IGlwMi0+aWZhY2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraGFzaF9uZXRpZmFjZTRfZGF0YV9pc251bGwoY29uc3Qgc3RydWN0IGhhc2hfbmV0aWZhY2U0X2VsZW0gKmVsZW0pCit7CisJcmV0dXJuIGVsZW0tPmNpZHIgPT0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitoYXNoX25ldGlmYWNlNF9kYXRhX2NvcHkoc3RydWN0IGhhc2hfbmV0aWZhY2U0X2VsZW0gKmRzdCwKKwkJCSBjb25zdCBzdHJ1Y3QgaGFzaF9uZXRpZmFjZTRfZWxlbSAqc3JjKSB7CisJZHN0LT5pcCA9IHNyYy0+aXA7CisJZHN0LT5jaWRyID0gc3JjLT5jaWRyOworCWRzdC0+cGh5c2RldiA9IHNyYy0+cGh5c2RldjsKKwlkc3QtPmlmYWNlID0gc3JjLT5pZmFjZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitoYXNoX25ldGlmYWNlNF9kYXRhX25ldG1hc2soc3RydWN0IGhhc2hfbmV0aWZhY2U0X2VsZW0gKmVsZW0sIHU4IGNpZHIpCit7CisJZWxlbS0+aXAgJj0gaXBfc2V0X25ldG1hc2soY2lkcik7CisJZWxlbS0+Y2lkciA9IGNpZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraGFzaF9uZXRpZmFjZTRfZGF0YV96ZXJvX291dChzdHJ1Y3QgaGFzaF9uZXRpZmFjZTRfZWxlbSAqZWxlbSkKK3sKKwllbGVtLT5jaWRyID0gMDsKK30KKworc3RhdGljIGJvb2wKK2hhc2hfbmV0aWZhY2U0X2RhdGFfbGlzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIGNvbnN0IHN0cnVjdCBoYXNoX25ldGlmYWNlNF9lbGVtICpkYXRhKQoreworCXUzMiBmbGFncyA9IGRhdGEtPnBoeXNkZXYgPyBJUFNFVF9GTEFHX1BIWVNERVYgOiAwOworCisJTkxBX1BVVF9JUEFERFI0KHNrYiwgSVBTRVRfQVRUUl9JUCwgZGF0YS0+aXApOworCU5MQV9QVVRfVTgoc2tiLCBJUFNFVF9BVFRSX0NJRFIsIGRhdGEtPmNpZHIpOworCU5MQV9QVVRfU1RSSU5HKHNrYiwgSVBTRVRfQVRUUl9JRkFDRSwgZGF0YS0+aWZhY2UpOworCWlmIChmbGFncykKKwkJTkxBX1BVVF9ORVQzMihza2IsIElQU0VUX0FUVFJfQ0FEVF9GTEFHUywgZmxhZ3MpOworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBib29sCitoYXNoX25ldGlmYWNlNF9kYXRhX3RsaXN0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIGNvbnN0IHN0cnVjdCBoYXNoX25ldGlmYWNlNF9lbGVtICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBoYXNoX25ldGlmYWNlNF90ZWxlbSAqdGRhdGEgPQorCQkoY29uc3Qgc3RydWN0IGhhc2hfbmV0aWZhY2U0X3RlbGVtICopZGF0YTsKKwl1MzIgZmxhZ3MgPSBkYXRhLT5waHlzZGV2ID8gSVBTRVRfRkxBR19QSFlTREVWIDogMDsKKworCU5MQV9QVVRfSVBBRERSNChza2IsIElQU0VUX0FUVFJfSVAsIGRhdGEtPmlwKTsKKwlOTEFfUFVUX1U4KHNrYiwgSVBTRVRfQVRUUl9DSURSLCBkYXRhLT5jaWRyKTsKKwlOTEFfUFVUX1NUUklORyhza2IsIElQU0VUX0FUVFJfSUZBQ0UsIGRhdGEtPmlmYWNlKTsKKwlpZiAoZmxhZ3MpCisJCU5MQV9QVVRfTkVUMzIoc2tiLCBJUFNFVF9BVFRSX0NBRFRfRkxBR1MsIGZsYWdzKTsKKwlOTEFfUFVUX05FVDMyKHNrYiwgSVBTRVRfQVRUUl9USU1FT1VULAorCQkgICAgICBodG9ubChpcF9zZXRfdGltZW91dF9nZXQodGRhdGEtPnRpbWVvdXQpKSk7CisKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAxOworfQorCisjZGVmaW5lIElQX1NFVF9IQVNIX1dJVEhfTkVUUworI2RlZmluZSBJUF9TRVRfSEFTSF9XSVRIX1JCVFJFRQorI2RlZmluZSBJUF9TRVRfSEFTSF9XSVRIX01VTFRJCisKKyNkZWZpbmUgUEYJCTQKKyNkZWZpbmUgSE9TVF9NQVNLCTMyCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9haGFzaC5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQKK2hhc2hfbmV0aWZhY2U0X2RhdGFfbmV4dChzdHJ1Y3QgaXBfc2V0X2hhc2ggKmgsCisJCQkgY29uc3Qgc3RydWN0IGhhc2hfbmV0aWZhY2U0X2VsZW0gKmQpCit7CisJaC0+bmV4dC5pcCA9IG50b2hsKGQtPmlwKTsKK30KKworc3RhdGljIGludAoraGFzaF9uZXRpZmFjZTRfa2FkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIsCisJCSAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIGNvbnN0IHN0cnVjdCBpcF9zZXRfYWR0X29wdCAqb3B0KQoreworCXN0cnVjdCBpcF9zZXRfaGFzaCAqaCA9IHNldC0+ZGF0YTsKKwlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CisJc3RydWN0IGhhc2hfbmV0aWZhY2U0X2VsZW0gZGF0YSA9IHsKKwkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgPyBoLT5uZXRzWzBdLmNpZHIgOiBIT1NUX01BU0sKKwl9OworCWludCByZXQ7CisKKwlpZiAoZGF0YS5jaWRyID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChhZHQgPT0gSVBTRVRfVEVTVCkKKwkJZGF0YS5jaWRyID0gSE9TVF9NQVNLOworCisJaXA0YWRkcnB0cihza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQywgJmRhdGEuaXApOworCWRhdGEuaXAgJj0gaXBfc2V0X25ldG1hc2soZGF0YS5jaWRyKTsKKworI2RlZmluZSBJRkFDRShkaXIpCShwYXItPmRpciA/IHBhci0+ZGlyLT5uYW1lIDogTlVMTCkKKyNkZWZpbmUgUEhZU0RFVihkaXIpCShuZl9icmlkZ2UtPmRpciA/IG5mX2JyaWRnZS0+ZGlyLT5uYW1lIDogTlVMTCkKKyNkZWZpbmUgU1JDRElSCQkob3B0LT5mbGFncyAmIElQU0VUX0RJTV9UV09fU1JDKQorCisJaWYgKG9wdC0+Y21kZmxhZ3MgJiBJUFNFVF9GTEFHX1BIWVNERVYpIHsKKyNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgorCQljb25zdCBzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZSA9IHNrYi0+bmZfYnJpZGdlOworCisJCWlmICghbmZfYnJpZGdlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRhdGEuaWZhY2UgPSBTUkNESVIgPyBQSFlTREVWKHBoeXNpbmRldikgOiBQSFlTREVWKHBoeXNvdXRkZXYpOworCQlkYXRhLnBoeXNkZXYgPSAxOworI2Vsc2UKKwkJZGF0YS5pZmFjZSA9IE5VTEw7CisjZW5kaWYKKwl9IGVsc2UKKwkJZGF0YS5pZmFjZSA9IFNSQ0RJUiA/IElGQUNFKGluKSA6IElGQUNFKG91dCk7CisKKwlpZiAoIWRhdGEuaWZhY2UpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IGlmYWNlX3Rlc3QoJmgtPnJidHJlZSwgJmRhdGEuaWZhY2UpOworCWlmIChhZHQgPT0gSVBTRVRfQUREKSB7CisJCWlmICghcmV0KSB7CisJCQlyZXQgPSBpZmFjZV9hZGQoJmgtPnJidHJlZSwgJmRhdGEuaWZhY2UpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIGlmICghcmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGFkdGZuKHNldCwgJmRhdGEsIG9wdF90aW1lb3V0KG9wdCwgaCksIG9wdC0+Y21kZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitoYXNoX25ldGlmYWNlNF91YWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgc3RydWN0IG5sYXR0ciAqdGJbXSwKKwkJICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTMyICpsaW5lbm8sIHUzMiBmbGFncywgYm9vbCByZXRyaWVkKQoreworCXN0cnVjdCBpcF9zZXRfaGFzaCAqaCA9IHNldC0+ZGF0YTsKKwlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CisJc3RydWN0IGhhc2hfbmV0aWZhY2U0X2VsZW0gZGF0YSA9IHsgLmNpZHIgPSBIT1NUX01BU0sgfTsKKwl1MzIgaXAgPSAwLCBpcF90bywgbGFzdDsKKwl1MzIgdGltZW91dCA9IGgtPnRpbWVvdXQ7CisJY2hhciBpZmFjZVtJRk5BTVNJWl0gPSB7fTsKKwlpbnQgcmV0OworCisJaWYgKHVubGlrZWx5KCF0YltJUFNFVF9BVFRSX0lQXSB8fAorCQkgICAgICF0YltJUFNFVF9BVFRSX0lGQUNFXSB8fAorCQkgICAgICFpcF9zZXRfb3B0YXR0cl9uZXRvcmRlcih0YiwgSVBTRVRfQVRUUl9USU1FT1VUKSB8fAorCQkgICAgICFpcF9zZXRfb3B0YXR0cl9uZXRvcmRlcih0YiwgSVBTRVRfQVRUUl9DQURUX0ZMQUdTKSkpCisJCXJldHVybiAtSVBTRVRfRVJSX1BST1RPQ09MOworCisJaWYgKHRiW0lQU0VUX0FUVFJfTElORU5PXSkKKwkJKmxpbmVubyA9IG5sYV9nZXRfdTMyKHRiW0lQU0VUX0FUVFJfTElORU5PXSk7CisKKwlyZXQgPSBpcF9zZXRfZ2V0X2hvc3RpcGFkZHI0KHRiW0lQU0VUX0FUVFJfSVBdLCAmaXApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodGJbSVBTRVRfQVRUUl9DSURSXSkgeworCQlkYXRhLmNpZHIgPSBubGFfZ2V0X3U4KHRiW0lQU0VUX0FUVFJfQ0lEUl0pOworCQlpZiAoIWRhdGEuY2lkcikKKwkJCXJldHVybiAtSVBTRVRfRVJSX0lOVkFMSURfQ0lEUjsKKwl9CisKKwlpZiAodGJbSVBTRVRfQVRUUl9USU1FT1VUXSkgeworCQlpZiAoIXdpdGhfdGltZW91dChoLT50aW1lb3V0KSkKKwkJCXJldHVybiAtSVBTRVRfRVJSX1RJTUVPVVQ7CisJCXRpbWVvdXQgPSBpcF9zZXRfdGltZW91dF91Z2V0KHRiW0lQU0VUX0FUVFJfVElNRU9VVF0pOworCX0KKworCXN0cmNweShpZmFjZSwgbmxhX2RhdGEodGJbSVBTRVRfQVRUUl9JRkFDRV0pKTsKKwlkYXRhLmlmYWNlID0gaWZhY2U7CisJcmV0ID0gaWZhY2VfdGVzdCgmaC0+cmJ0cmVlLCAmZGF0YS5pZmFjZSk7CisJaWYgKGFkdCA9PSBJUFNFVF9BREQpIHsKKwkJaWYgKCFyZXQpIHsKKwkJCXJldCA9IGlmYWNlX2FkZCgmaC0+cmJ0cmVlLCAmZGF0YS5pZmFjZSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgaWYgKCFyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodGJbSVBTRVRfQVRUUl9DQURUX0ZMQUdTXSkgeworCQl1MzIgY2FkdF9mbGFncyA9IGlwX3NldF9nZXRfaDMyKHRiW0lQU0VUX0FUVFJfQ0FEVF9GTEFHU10pOworCQlpZiAoY2FkdF9mbGFncyAmIElQU0VUX0ZMQUdfUEhZU0RFVikKKwkJCWRhdGEucGh5c2RldiA9IDE7CisJfQorCisJaWYgKGFkdCA9PSBJUFNFVF9URVNUIHx8ICF0YltJUFNFVF9BVFRSX0lQX1RPXSkgeworCQlkYXRhLmlwID0gaHRvbmwoaXAgJiBpcF9zZXRfaG9zdG1hc2soZGF0YS5jaWRyKSk7CisJCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQsIGZsYWdzKTsKKwkJcmV0dXJuIGlwX3NldF9lZXhpc3QocmV0LCBmbGFncykgPyAwIDogcmV0OworCX0KKworCWlmICh0YltJUFNFVF9BVFRSX0lQX1RPXSkgeworCQlyZXQgPSBpcF9zZXRfZ2V0X2hvc3RpcGFkZHI0KHRiW0lQU0VUX0FUVFJfSVBfVE9dLCAmaXBfdG8pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGlwX3RvIDwgaXApCisJCQlzd2FwKGlwLCBpcF90byk7CisJCWlmIChpcCArIFVJTlRfTUFYID09IGlwX3RvKQorCQkJcmV0dXJuIC1JUFNFVF9FUlJfSEFTSF9SQU5HRTsKKwl9IGVsc2UgeworCQlpcF9zZXRfbWFza19mcm9tX3RvKGlwLCBpcF90bywgZGF0YS5jaWRyKTsKKwl9CisKKwlpZiAocmV0cmllZCkKKwkJaXAgPSBoLT5uZXh0LmlwOworCXdoaWxlICghYWZ0ZXIoaXAsIGlwX3RvKSkgeworCQlkYXRhLmlwID0gaHRvbmwoaXApOworCQlsYXN0ID0gaXBfc2V0X3JhbmdlX3RvX2NpZHIoaXAsIGlwX3RvLCAmZGF0YS5jaWRyKTsKKwkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCwgZmxhZ3MpOworCisJCWlmIChyZXQgJiYgIWlwX3NldF9lZXhpc3QocmV0LCBmbGFncykpCisJCQlyZXR1cm4gcmV0OworCQllbHNlCisJCQlyZXQgPSAwOworCQlpcCA9IGxhc3QgKyAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbAoraGFzaF9uZXRpZmFjZV9zYW1lX3NldChjb25zdCBzdHJ1Y3QgaXBfc2V0ICphLCBjb25zdCBzdHJ1Y3QgaXBfc2V0ICpiKQoreworCWNvbnN0IHN0cnVjdCBpcF9zZXRfaGFzaCAqeCA9IGEtPmRhdGE7CisJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICp5ID0gYi0+ZGF0YTsKKworCS8qIFJlc2l6aW5nIGNoYW5nZXMgaHRhYmxlX2JpdHMsIHNvIHdlIGlnbm9yZSBpdCAqLworCXJldHVybiB4LT5tYXhlbGVtID09IHktPm1heGVsZW0gJiYKKwkgICAgICAgeC0+dGltZW91dCA9PSB5LT50aW1lb3V0OworfQorCisvKiBUaGUgdHlwZSB2YXJpYW50IGZ1bmN0aW9uczogSVB2NiAqLworCitzdHJ1Y3QgaGFzaF9uZXRpZmFjZTZfZWxlbV9oYXNoZWQgeworCXVuaW9uIG5mX2luZXRfYWRkciBpcDsKKwl1OCBwaHlzZGV2OworCXU4IGNpZHI7CisJdTE2IHBhZGRpbmc7Cit9OworCisjZGVmaW5lIEhLRVlfREFUQUxFTglzaXplb2Yoc3RydWN0IGhhc2hfbmV0aWZhY2U2X2VsZW1faGFzaGVkKQorCitzdHJ1Y3QgaGFzaF9uZXRpZmFjZTZfZWxlbSB7CisJdW5pb24gbmZfaW5ldF9hZGRyIGlwOworCXU4IHBoeXNkZXY7CisJdTggY2lkcjsKKwl1MTYgcGFkZGluZzsKKwljb25zdCBjaGFyICppZmFjZTsKK307CisKK3N0cnVjdCBoYXNoX25ldGlmYWNlNl90ZWxlbSB7CisJdW5pb24gbmZfaW5ldF9hZGRyIGlwOworCXU4IHBoeXNkZXY7CisJdTggY2lkcjsKKwl1MTYgcGFkZGluZzsKKwljb25zdCBjaGFyICppZmFjZTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Cit9OworCitzdGF0aWMgaW5saW5lIGJvb2wKK2hhc2hfbmV0aWZhY2U2X2RhdGFfZXF1YWwoY29uc3Qgc3RydWN0IGhhc2hfbmV0aWZhY2U2X2VsZW0gKmlwMSwKKwkJCSAgY29uc3Qgc3RydWN0IGhhc2hfbmV0aWZhY2U2X2VsZW0gKmlwMiwKKwkJCSAgdTMyICptdWx0aSkKK3sKKwlyZXR1cm4gaXB2Nl9hZGRyX2NtcCgmaXAxLT5pcC5pbjYsICZpcDItPmlwLmluNikgPT0gMCAmJgorCSAgICAgICBpcDEtPmNpZHIgPT0gaXAyLT5jaWRyICYmCisJICAgICAgICgrKyptdWx0aSkgJiYKKwkgICAgICAgaXAxLT5waHlzZGV2ID09IGlwMi0+cGh5c2RldiAmJgorCSAgICAgICBpcDEtPmlmYWNlID09IGlwMi0+aWZhY2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraGFzaF9uZXRpZmFjZTZfZGF0YV9pc251bGwoY29uc3Qgc3RydWN0IGhhc2hfbmV0aWZhY2U2X2VsZW0gKmVsZW0pCit7CisJcmV0dXJuIGVsZW0tPmNpZHIgPT0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitoYXNoX25ldGlmYWNlNl9kYXRhX2NvcHkoc3RydWN0IGhhc2hfbmV0aWZhY2U2X2VsZW0gKmRzdCwKKwkJCSBjb25zdCBzdHJ1Y3QgaGFzaF9uZXRpZmFjZTZfZWxlbSAqc3JjKQoreworCW1lbWNweShkc3QsIHNyYywgc2l6ZW9mKCpkc3QpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitoYXNoX25ldGlmYWNlNl9kYXRhX3plcm9fb3V0KHN0cnVjdCBoYXNoX25ldGlmYWNlNl9lbGVtICplbGVtKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lwNl9uZXRtYXNrKHVuaW9uIG5mX2luZXRfYWRkciAqaXAsIHU4IHByZWZpeCkKK3sKKwlpcC0+aXA2WzBdICY9IGlwX3NldF9uZXRtYXNrNihwcmVmaXgpWzBdOworCWlwLT5pcDZbMV0gJj0gaXBfc2V0X25ldG1hc2s2KHByZWZpeClbMV07CisJaXAtPmlwNlsyXSAmPSBpcF9zZXRfbmV0bWFzazYocHJlZml4KVsyXTsKKwlpcC0+aXA2WzNdICY9IGlwX3NldF9uZXRtYXNrNihwcmVmaXgpWzNdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2hhc2hfbmV0aWZhY2U2X2RhdGFfbmV0bWFzayhzdHJ1Y3QgaGFzaF9uZXRpZmFjZTZfZWxlbSAqZWxlbSwgdTggY2lkcikKK3sKKwlpcDZfbmV0bWFzaygmZWxlbS0+aXAsIGNpZHIpOworCWVsZW0tPmNpZHIgPSBjaWRyOworfQorCitzdGF0aWMgYm9vbAoraGFzaF9uZXRpZmFjZTZfZGF0YV9saXN0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgY29uc3Qgc3RydWN0IGhhc2hfbmV0aWZhY2U2X2VsZW0gKmRhdGEpCit7CisJdTMyIGZsYWdzID0gZGF0YS0+cGh5c2RldiA/IElQU0VUX0ZMQUdfUEhZU0RFViA6IDA7CisKKwlOTEFfUFVUX0lQQUREUjYoc2tiLCBJUFNFVF9BVFRSX0lQLCAmZGF0YS0+aXApOworCU5MQV9QVVRfVTgoc2tiLCBJUFNFVF9BVFRSX0NJRFIsIGRhdGEtPmNpZHIpOworCU5MQV9QVVRfU1RSSU5HKHNrYiwgSVBTRVRfQVRUUl9JRkFDRSwgZGF0YS0+aWZhY2UpOworCWlmIChmbGFncykKKwkJTkxBX1BVVF9ORVQzMihza2IsIElQU0VUX0FUVFJfQ0FEVF9GTEFHUywgZmxhZ3MpOworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBib29sCitoYXNoX25ldGlmYWNlNl9kYXRhX3RsaXN0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIGNvbnN0IHN0cnVjdCBoYXNoX25ldGlmYWNlNl9lbGVtICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBoYXNoX25ldGlmYWNlNl90ZWxlbSAqZSA9CisJCShjb25zdCBzdHJ1Y3QgaGFzaF9uZXRpZmFjZTZfdGVsZW0gKilkYXRhOworCXUzMiBmbGFncyA9IGRhdGEtPnBoeXNkZXYgPyBJUFNFVF9GTEFHX1BIWVNERVYgOiAwOworCisJTkxBX1BVVF9JUEFERFI2KHNrYiwgSVBTRVRfQVRUUl9JUCwgJmUtPmlwKTsKKwlOTEFfUFVUX1U4KHNrYiwgSVBTRVRfQVRUUl9DSURSLCBkYXRhLT5jaWRyKTsKKwlOTEFfUFVUX1NUUklORyhza2IsIElQU0VUX0FUVFJfSUZBQ0UsIGRhdGEtPmlmYWNlKTsKKwlpZiAoZmxhZ3MpCisJCU5MQV9QVVRfTkVUMzIoc2tiLCBJUFNFVF9BVFRSX0NBRFRfRkxBR1MsIGZsYWdzKTsKKwlOTEFfUFVUX05FVDMyKHNrYiwgSVBTRVRfQVRUUl9USU1FT1VULAorCQkgICAgICBodG9ubChpcF9zZXRfdGltZW91dF9nZXQoZS0+dGltZW91dCkpKTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAxOworfQorCisjdW5kZWYgUEYKKyN1bmRlZiBIT1NUX01BU0sKKworI2RlZmluZSBQRgkJNgorI2RlZmluZSBIT1NUX01BU0sJMTI4CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9haGFzaC5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQKK2hhc2hfbmV0aWZhY2U2X2RhdGFfbmV4dChzdHJ1Y3QgaXBfc2V0X2hhc2ggKmgsCisJCQkgY29uc3Qgc3RydWN0IGhhc2hfbmV0aWZhY2U2X2VsZW0gKmQpCit7Cit9CisKK3N0YXRpYyBpbnQKK2hhc2hfbmV0aWZhY2U2X2thZHQoc3RydWN0IGlwX3NldCAqc2V0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCQkgICAgZW51bSBpcHNldF9hZHQgYWR0LCBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCkKK3sKKwlzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CisJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOworCXN0cnVjdCBoYXNoX25ldGlmYWNlNl9lbGVtIGRhdGEgPSB7CisJCS5jaWRyID0gaC0+bmV0c1swXS5jaWRyID8gaC0+bmV0c1swXS5jaWRyIDogSE9TVF9NQVNLCisJfTsKKwlpbnQgcmV0OworCisJaWYgKGRhdGEuY2lkciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYWR0ID09IElQU0VUX1RFU1QpCisJCWRhdGEuY2lkciA9IEhPU1RfTUFTSzsKKworCWlwNmFkZHJwdHIoc2tiLCBvcHQtPmZsYWdzICYgSVBTRVRfRElNX09ORV9TUkMsICZkYXRhLmlwLmluNik7CisJaXA2X25ldG1hc2soJmRhdGEuaXAsIGRhdGEuY2lkcik7CisKKwlpZiAob3B0LT5jbWRmbGFncyAmIElQU0VUX0ZMQUdfUEhZU0RFVikgeworI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCisJCWNvbnN0IHN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7CisKKwkJaWYgKCFuZl9icmlkZ2UpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZGF0YS5pZmFjZSA9IFNSQ0RJUiA/IFBIWVNERVYocGh5c2luZGV2KSA6IFBIWVNERVYocGh5c291dGRldik7CisJCWRhdGEucGh5c2RldiA9IDE7CisjZWxzZQorCQlkYXRhLmlmYWNlID0gTlVMTDsKKyNlbmRpZgorCX0gZWxzZQorCQlkYXRhLmlmYWNlID0gU1JDRElSID8gSUZBQ0UoaW4pIDogSUZBQ0Uob3V0KTsKKworCWlmICghZGF0YS5pZmFjZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gaWZhY2VfdGVzdCgmaC0+cmJ0cmVlLCAmZGF0YS5pZmFjZSk7CisJaWYgKGFkdCA9PSBJUFNFVF9BREQpIHsKKwkJaWYgKCFyZXQpIHsKKwkJCXJldCA9IGlmYWNlX2FkZCgmaC0+cmJ0cmVlLCAmZGF0YS5pZmFjZSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgaWYgKCFyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gYWR0Zm4oc2V0LCAmZGF0YSwgb3B0X3RpbWVvdXQob3B0LCBoKSwgb3B0LT5jbWRmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK2hhc2hfbmV0aWZhY2U2X3VhZHQoc3RydWN0IGlwX3NldCAqc2V0LCBzdHJ1Y3QgbmxhdHRyICp0YltdLAorCQkgICBlbnVtIGlwc2V0X2FkdCBhZHQsIHUzMiAqbGluZW5vLCB1MzIgZmxhZ3MsIGJvb2wgcmV0cmllZCkKK3sKKwlzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CisJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOworCXN0cnVjdCBoYXNoX25ldGlmYWNlNl9lbGVtIGRhdGEgPSB7IC5jaWRyID0gSE9TVF9NQVNLIH07CisJdTMyIHRpbWVvdXQgPSBoLT50aW1lb3V0OworCWNoYXIgaWZhY2VbSUZOQU1TSVpdID0ge307CisJaW50IHJldDsKKworCWlmICh1bmxpa2VseSghdGJbSVBTRVRfQVRUUl9JUF0gfHwKKwkJICAgICAhdGJbSVBTRVRfQVRUUl9JRkFDRV0gfHwKKwkJICAgICAhaXBfc2V0X29wdGF0dHJfbmV0b3JkZXIodGIsIElQU0VUX0FUVFJfVElNRU9VVCkgfHwKKwkJICAgICAhaXBfc2V0X29wdGF0dHJfbmV0b3JkZXIodGIsIElQU0VUX0FUVFJfQ0FEVF9GTEFHUykpKQorCQlyZXR1cm4gLUlQU0VUX0VSUl9QUk9UT0NPTDsKKwlpZiAodW5saWtlbHkodGJbSVBTRVRfQVRUUl9JUF9UT10pKQorCQlyZXR1cm4gLUlQU0VUX0VSUl9IQVNIX1JBTkdFX1VOU1VQUE9SVEVEOworCisJaWYgKHRiW0lQU0VUX0FUVFJfTElORU5PXSkKKwkJKmxpbmVubyA9IG5sYV9nZXRfdTMyKHRiW0lQU0VUX0FUVFJfTElORU5PXSk7CisKKwlyZXQgPSBpcF9zZXRfZ2V0X2lwYWRkcjYodGJbSVBTRVRfQVRUUl9JUF0sICZkYXRhLmlwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHRiW0lQU0VUX0FUVFJfQ0lEUl0pCisJCWRhdGEuY2lkciA9IG5sYV9nZXRfdTgodGJbSVBTRVRfQVRUUl9DSURSXSk7CisJaWYgKCFkYXRhLmNpZHIpCisJCXJldHVybiAtSVBTRVRfRVJSX0lOVkFMSURfQ0lEUjsKKwlpcDZfbmV0bWFzaygmZGF0YS5pcCwgZGF0YS5jaWRyKTsKKworCWlmICh0YltJUFNFVF9BVFRSX1RJTUVPVVRdKSB7CisJCWlmICghd2l0aF90aW1lb3V0KGgtPnRpbWVvdXQpKQorCQkJcmV0dXJuIC1JUFNFVF9FUlJfVElNRU9VVDsKKwkJdGltZW91dCA9IGlwX3NldF90aW1lb3V0X3VnZXQodGJbSVBTRVRfQVRUUl9USU1FT1VUXSk7CisJfQorCisJc3RyY3B5KGlmYWNlLCBubGFfZGF0YSh0YltJUFNFVF9BVFRSX0lGQUNFXSkpOworCWRhdGEuaWZhY2UgPSBpZmFjZTsKKwlyZXQgPSBpZmFjZV90ZXN0KCZoLT5yYnRyZWUsICZkYXRhLmlmYWNlKTsKKwlpZiAoYWR0ID09IElQU0VUX0FERCkgeworCQlpZiAoIXJldCkgeworCQkJcmV0ID0gaWZhY2VfYWRkKCZoLT5yYnRyZWUsICZkYXRhLmlmYWNlKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0gZWxzZSBpZiAoIXJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh0YltJUFNFVF9BVFRSX0NBRFRfRkxBR1NdKSB7CisJCXUzMiBjYWR0X2ZsYWdzID0gaXBfc2V0X2dldF9oMzIodGJbSVBTRVRfQVRUUl9DQURUX0ZMQUdTXSk7CisJCWlmIChjYWR0X2ZsYWdzICYgSVBTRVRfRkxBR19QSFlTREVWKQorCQkJZGF0YS5waHlzZGV2ID0gMTsKKwl9CisKKwlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0LCBmbGFncyk7CisKKwlyZXR1cm4gaXBfc2V0X2VleGlzdChyZXQsIGZsYWdzKSA/IDAgOiByZXQ7Cit9CisKKy8qIENyZWF0ZSBoYXNoOmlwIHR5cGUgb2Ygc2V0cyAqLworCitzdGF0aWMgaW50CitoYXNoX25ldGlmYWNlX2NyZWF0ZShzdHJ1Y3QgaXBfc2V0ICpzZXQsIHN0cnVjdCBubGF0dHIgKnRiW10sIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgaXBfc2V0X2hhc2ggKmg7CisJdTMyIGhhc2hzaXplID0gSVBTRVRfREVGQVVMVF9IQVNIU0laRSwgbWF4ZWxlbSA9IElQU0VUX0RFRkFVTFRfTUFYRUxFTTsKKwl1OCBoYml0czsKKworCWlmICghKHNldC0+ZmFtaWx5ID09IEFGX0lORVQgfHwgc2V0LT5mYW1pbHkgPT0gQUZfSU5FVDYpKQorCQlyZXR1cm4gLUlQU0VUX0VSUl9JTlZBTElEX0ZBTUlMWTsKKworCWlmICh1bmxpa2VseSghaXBfc2V0X29wdGF0dHJfbmV0b3JkZXIodGIsIElQU0VUX0FUVFJfSEFTSFNJWkUpIHx8CisJCSAgICAgIWlwX3NldF9vcHRhdHRyX25ldG9yZGVyKHRiLCBJUFNFVF9BVFRSX01BWEVMRU0pIHx8CisJCSAgICAgIWlwX3NldF9vcHRhdHRyX25ldG9yZGVyKHRiLCBJUFNFVF9BVFRSX1RJTUVPVVQpKSkKKwkJcmV0dXJuIC1JUFNFVF9FUlJfUFJPVE9DT0w7CisKKwlpZiAodGJbSVBTRVRfQVRUUl9IQVNIU0laRV0pIHsKKwkJaGFzaHNpemUgPSBpcF9zZXRfZ2V0X2gzMih0YltJUFNFVF9BVFRSX0hBU0hTSVpFXSk7CisJCWlmIChoYXNoc2l6ZSA8IElQU0VUX01JTUlOQUxfSEFTSFNJWkUpCisJCQloYXNoc2l6ZSA9IElQU0VUX01JTUlOQUxfSEFTSFNJWkU7CisJfQorCisJaWYgKHRiW0lQU0VUX0FUVFJfTUFYRUxFTV0pCisJCW1heGVsZW0gPSBpcF9zZXRfZ2V0X2gzMih0YltJUFNFVF9BVFRSX01BWEVMRU1dKTsKKworCWggPSBremFsbG9jKHNpemVvZigqaCkKKwkJICAgICsgc2l6ZW9mKHN0cnVjdCBpcF9zZXRfaGFzaF9uZXRzKQorCQkgICAgICAqIChzZXQtPmZhbWlseSA9PSBBRl9JTkVUID8gMzIgOiAxMjgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWgpCisJCXJldHVybiAtRU5PTUVNOworCisJaC0+bWF4ZWxlbSA9IG1heGVsZW07CisJZ2V0X3JhbmRvbV9ieXRlcygmaC0+aW5pdHZhbCwgc2l6ZW9mKGgtPmluaXR2YWwpKTsKKwloLT50aW1lb3V0ID0gSVBTRVRfTk9fVElNRU9VVDsKKwloLT5haGFzaF9tYXggPSBBSEFTSF9NQVhfU0laRTsKKworCWhiaXRzID0gaHRhYmxlX2JpdHMoaGFzaHNpemUpOworCWgtPnRhYmxlID0gaXBfc2V0X2FsbG9jKAorCQkJc2l6ZW9mKHN0cnVjdCBodGFibGUpCisJCQkrIGpoYXNoX3NpemUoaGJpdHMpICogc2l6ZW9mKHN0cnVjdCBoYnVja2V0KSk7CisJaWYgKCFoLT50YWJsZSkgeworCQlrZnJlZShoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWgtPnRhYmxlLT5odGFibGVfYml0cyA9IGhiaXRzOworCWgtPnJidHJlZSA9IFJCX1JPT1Q7CisKKwlzZXQtPmRhdGEgPSBoOworCisJaWYgKHRiW0lQU0VUX0FUVFJfVElNRU9VVF0pIHsKKwkJaC0+dGltZW91dCA9IGlwX3NldF90aW1lb3V0X3VnZXQodGJbSVBTRVRfQVRUUl9USU1FT1VUXSk7CisKKwkJc2V0LT52YXJpYW50ID0gc2V0LT5mYW1pbHkgPT0gQUZfSU5FVAorCQkJPyAmaGFzaF9uZXRpZmFjZTRfdHZhcmlhbnQgOiAmaGFzaF9uZXRpZmFjZTZfdHZhcmlhbnQ7CisKKwkJaWYgKHNldC0+ZmFtaWx5ID09IEFGX0lORVQpCisJCQloYXNoX25ldGlmYWNlNF9nY19pbml0KHNldCk7CisJCWVsc2UKKwkJCWhhc2hfbmV0aWZhY2U2X2djX2luaXQoc2V0KTsKKwl9IGVsc2UgeworCQlzZXQtPnZhcmlhbnQgPSBzZXQtPmZhbWlseSA9PSBBRl9JTkVUCisJCQk/ICZoYXNoX25ldGlmYWNlNF92YXJpYW50IDogJmhhc2hfbmV0aWZhY2U2X3ZhcmlhbnQ7CisJfQorCisJcHJfZGVidWcoImNyZWF0ZSAlcyBoYXNoc2l6ZSAldSAoJXUpIG1heGVsZW0gJXU6ICVwKCVwKVxuIiwKKwkJIHNldC0+bmFtZSwgamhhc2hfc2l6ZShoLT50YWJsZS0+aHRhYmxlX2JpdHMpLAorCQkgaC0+dGFibGUtPmh0YWJsZV9iaXRzLCBoLT5tYXhlbGVtLCBzZXQtPmRhdGEsIGgtPnRhYmxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlwX3NldF90eXBlIGhhc2hfbmV0aWZhY2VfdHlwZSBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJoYXNoOm5ldCxpZmFjZSIsCisJLnByb3RvY29sCT0gSVBTRVRfUFJPVE9DT0wsCisJLmZlYXR1cmVzCT0gSVBTRVRfVFlQRV9JUCB8IElQU0VUX1RZUEVfSUZBQ0UsCisJLmRpbWVuc2lvbgk9IElQU0VUX0RJTV9UV08sCisJLmZhbWlseQkJPSBBRl9VTlNQRUMsCisJLnJldmlzaW9uX21pbgk9IDAsCisJLmNyZWF0ZQkJPSBoYXNoX25ldGlmYWNlX2NyZWF0ZSwKKwkuY3JlYXRlX3BvbGljeQk9IHsKKwkJW0lQU0VUX0FUVFJfSEFTSFNJWkVdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwkJW0lQU0VUX0FUVFJfTUFYRUxFTV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCQlbSVBTRVRfQVRUUl9QUk9CRVNdCT0geyAudHlwZSA9IE5MQV9VOCB9LAorCQlbSVBTRVRfQVRUUl9SRVNJWkVdCT0geyAudHlwZSA9IE5MQV9VOCAgfSwKKwkJW0lQU0VUX0FUVFJfUFJPVE9dCT0geyAudHlwZSA9IE5MQV9VOCB9LAorCQlbSVBTRVRfQVRUUl9USU1FT1VUXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJfSwKKwkuYWR0X3BvbGljeQk9IHsKKwkJW0lQU0VUX0FUVFJfSVBdCQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCisJCVtJUFNFVF9BVFRSX0lQX1RPXQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCisJCVtJUFNFVF9BVFRSX0lGQUNFXQk9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywKKwkJCQkJICAgIC5sZW4gPSBJUFNFVF9NQVhOQU1FTEVOIC0gMSB9LAorCQlbSVBTRVRfQVRUUl9DQURUX0ZMQUdTXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJCVtJUFNFVF9BVFRSX0NJRFJdCT0geyAudHlwZSA9IE5MQV9VOCB9LAorCQlbSVBTRVRfQVRUUl9USU1FT1VUXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJCVtJUFNFVF9BVFRSX0xJTkVOT10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCX0sCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2hhc2hfbmV0aWZhY2VfaW5pdCh2b2lkKQoreworCXJldHVybiBpcF9zZXRfdHlwZV9yZWdpc3RlcigmaGFzaF9uZXRpZmFjZV90eXBlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitoYXNoX25ldGlmYWNlX2Zpbmkodm9pZCkKK3sKKwlpcF9zZXRfdHlwZV91bnJlZ2lzdGVyKCZoYXNoX25ldGlmYWNlX3R5cGUpOworfQorCittb2R1bGVfaW5pdChoYXNoX25ldGlmYWNlX2luaXQpOworbW9kdWxlX2V4aXQoaGFzaF9uZXRpZmFjZV9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfbmV0cG9ydC5jIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXRwb3J0LmMKaW5kZXggZDJhNDAzNi4uOGY5ZGU3MiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXRwb3J0LmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXRwb3J0LmMKQEAgLTU5LDcgKzU5LDggQEAKIAogc3RhdGljIGlubGluZSBib29sCiBoYXNoX25ldHBvcnQ0X2RhdGFfZXF1YWwoY29uc3Qgc3RydWN0IGhhc2hfbmV0cG9ydDRfZWxlbSAqaXAxLAotCQkJIGNvbnN0IHN0cnVjdCBoYXNoX25ldHBvcnQ0X2VsZW0gKmlwMikKKwkJCSBjb25zdCBzdHJ1Y3QgaGFzaF9uZXRwb3J0NF9lbGVtICppcDIsCisJCQkgdTMyICptdWx0aSkKIHsKIAlyZXR1cm4gaXAxLT5pcCA9PSBpcDItPmlwICYmCiAJICAgICAgIGlwMS0+cG9ydCA9PSBpcDItPnBvcnQgJiYKQEAgLTEzNywzOCArMTM4LDQ4IEBACiAjZGVmaW5lIEhPU1RfTUFTSwkzMgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfYWhhc2guaD4KIAorc3RhdGljIGlubGluZSB2b2lkCitoYXNoX25ldHBvcnQ0X2RhdGFfbmV4dChzdHJ1Y3QgaXBfc2V0X2hhc2ggKmgsCisJCQljb25zdCBzdHJ1Y3QgaGFzaF9uZXRwb3J0NF9lbGVtICpkKQoreworCWgtPm5leHQuaXAgPSBudG9obChkLT5pcCk7CisJaC0+bmV4dC5wb3J0ID0gbnRvaHMoZC0+cG9ydCk7Cit9CisKIHN0YXRpYyBpbnQKIGhhc2hfbmV0cG9ydDRfa2FkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTggcGYsIHU4IGRpbSwgdTggZmxhZ3MpCisJCSAgIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKKwkJICAgZW51bSBpcHNldF9hZHQgYWR0LCBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCkKIHsKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwogCXN0cnVjdCBoYXNoX25ldHBvcnQ0X2VsZW0gZGF0YSA9IHsKLQkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgfHwgSE9TVF9NQVNLIH07CisJCS5jaWRyID0gaC0+bmV0c1swXS5jaWRyID8gaC0+bmV0c1swXS5jaWRyIDogSE9TVF9NQVNLCisJfTsKIAogCWlmIChkYXRhLmNpZHIgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGFkdCA9PSBJUFNFVF9URVNUKQogCQlkYXRhLmNpZHIgPSBIT1NUX01BU0s7CiAKLQlpZiAoIWlwX3NldF9nZXRfaXA0X3BvcnQoc2tiLCBmbGFncyAmIElQU0VUX0RJTV9UV09fU1JDLAorCWlmICghaXBfc2V0X2dldF9pcDRfcG9ydChza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fVFdPX1NSQywKIAkJCQkgJmRhdGEucG9ydCwgJmRhdGEucHJvdG8pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlwNGFkZHJwdHIoc2tiLCBmbGFncyAmIElQU0VUX0RJTV9PTkVfU1JDLCAmZGF0YS5pcCk7CisJaXA0YWRkcnB0cihza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQywgJmRhdGEuaXApOwogCWRhdGEuaXAgJj0gaXBfc2V0X25ldG1hc2soZGF0YS5jaWRyKTsKIAotCXJldHVybiBhZHRmbihzZXQsICZkYXRhLCBoLT50aW1lb3V0KTsKKwlyZXR1cm4gYWR0Zm4oc2V0LCAmZGF0YSwgb3B0X3RpbWVvdXQob3B0LCBoKSwgb3B0LT5jbWRmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIGhhc2hfbmV0cG9ydDRfdWFkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCSAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTMyICpsaW5lbm8sIHUzMiBmbGFncykKKwkJICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzLCBib29sIHJldHJpZWQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKIAlzdHJ1Y3QgaGFzaF9uZXRwb3J0NF9lbGVtIGRhdGEgPSB7IC5jaWRyID0gSE9TVF9NQVNLIH07Ci0JdTMyIHBvcnQsIHBvcnRfdG87CisJdTMyIHBvcnQsIHBvcnRfdG8sIHAgPSAwLCBpcCA9IDAsIGlwX3RvLCBsYXN0OwogCXUzMiB0aW1lb3V0ID0gaC0+dGltZW91dDsKIAlib29sIHdpdGhfcG9ydHMgPSBmYWxzZTsKIAlpbnQgcmV0OwpAQCAtMTgyLDE1ICsxOTMsMTUgQEAKIAlpZiAodGJbSVBTRVRfQVRUUl9MSU5FTk9dKQogCQkqbGluZW5vID0gbmxhX2dldF91MzIodGJbSVBTRVRfQVRUUl9MSU5FTk9dKTsKIAotCXJldCA9IGlwX3NldF9nZXRfaXBhZGRyNCh0YltJUFNFVF9BVFRSX0lQXSwgJmRhdGEuaXApOworCXJldCA9IGlwX3NldF9nZXRfaG9zdGlwYWRkcjQodGJbSVBTRVRfQVRUUl9JUF0sICZpcCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICh0YltJUFNFVF9BVFRSX0NJRFJdKQorCWlmICh0YltJUFNFVF9BVFRSX0NJRFJdKSB7CiAJCWRhdGEuY2lkciA9IG5sYV9nZXRfdTgodGJbSVBTRVRfQVRUUl9DSURSXSk7Ci0JaWYgKCFkYXRhLmNpZHIpCi0JCXJldHVybiAtSVBTRVRfRVJSX0lOVkFMSURfQ0lEUjsKLQlkYXRhLmlwICY9IGlwX3NldF9uZXRtYXNrKGRhdGEuY2lkcik7CisJCWlmICghZGF0YS5jaWRyKQorCQkJcmV0dXJuIC1JUFNFVF9FUlJfSU5WQUxJRF9DSURSOworCX0KIAogCWlmICh0YltJUFNFVF9BVFRSX1BPUlRdKQogCQlkYXRhLnBvcnQgPSBubGFfZ2V0X2JlMTYodGJbSVBTRVRfQVRUUl9QT1JUXSk7CkBAIC0yMTUsMjQgKzIyNiw0NyBAQAogCQl0aW1lb3V0ID0gaXBfc2V0X3RpbWVvdXRfdWdldCh0YltJUFNFVF9BVFRSX1RJTUVPVVRdKTsKIAl9CiAKLQlpZiAoYWR0ID09IElQU0VUX1RFU1QgfHwgIXdpdGhfcG9ydHMgfHwgIXRiW0lQU0VUX0FUVFJfUE9SVF9UT10pIHsKLQkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCk7CisJd2l0aF9wb3J0cyA9IHdpdGhfcG9ydHMgJiYgdGJbSVBTRVRfQVRUUl9QT1JUX1RPXTsKKwlpZiAoYWR0ID09IElQU0VUX1RFU1QgfHwgISh3aXRoX3BvcnRzIHx8IHRiW0lQU0VUX0FUVFJfSVBfVE9dKSkgeworCQlkYXRhLmlwID0gaHRvbmwoaXAgJiBpcF9zZXRfaG9zdG1hc2soZGF0YS5jaWRyKSk7CisJCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQsIGZsYWdzKTsKIAkJcmV0dXJuIGlwX3NldF9lZXhpc3QocmV0LCBmbGFncykgPyAwIDogcmV0OwogCX0KIAotCXBvcnQgPSBudG9ocyhkYXRhLnBvcnQpOwotCXBvcnRfdG8gPSBpcF9zZXRfZ2V0X2gxNih0YltJUFNFVF9BVFRSX1BPUlRfVE9dKTsKLQlpZiAocG9ydCA+IHBvcnRfdG8pCi0JCXN3YXAocG9ydCwgcG9ydF90byk7Ci0KLQlmb3IgKDsgcG9ydCA8PSBwb3J0X3RvOyBwb3J0KyspIHsKLQkJZGF0YS5wb3J0ID0gaHRvbnMocG9ydCk7Ci0JCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQpOwotCi0JCWlmIChyZXQgJiYgIWlwX3NldF9lZXhpc3QocmV0LCBmbGFncykpCisJcG9ydCA9IHBvcnRfdG8gPSBudG9ocyhkYXRhLnBvcnQpOworCWlmICh0YltJUFNFVF9BVFRSX1BPUlRfVE9dKSB7CisJCXBvcnRfdG8gPSBpcF9zZXRfZ2V0X2gxNih0YltJUFNFVF9BVFRSX1BPUlRfVE9dKTsKKwkJaWYgKHBvcnRfdG8gPCBwb3J0KQorCQkJc3dhcChwb3J0LCBwb3J0X3RvKTsKKwl9CisJaWYgKHRiW0lQU0VUX0FUVFJfSVBfVE9dKSB7CisJCXJldCA9IGlwX3NldF9nZXRfaG9zdGlwYWRkcjQodGJbSVBTRVRfQVRUUl9JUF9UT10sICZpcF90byk7CisJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCQllbHNlCi0JCQlyZXQgPSAwOworCQlpZiAoaXBfdG8gPCBpcCkKKwkJCXN3YXAoaXAsIGlwX3RvKTsKKwkJaWYgKGlwICsgVUlOVF9NQVggPT0gaXBfdG8pCisJCQlyZXR1cm4gLUlQU0VUX0VSUl9IQVNIX1JBTkdFOworCX0gZWxzZSB7CisJCWlwX3NldF9tYXNrX2Zyb21fdG8oaXAsIGlwX3RvLCBkYXRhLmNpZHIpOworCX0KKworCWlmIChyZXRyaWVkKQorCQlpcCA9IGgtPm5leHQuaXA7CisJd2hpbGUgKCFhZnRlcihpcCwgaXBfdG8pKSB7CisJCWRhdGEuaXAgPSBodG9ubChpcCk7CisJCWxhc3QgPSBpcF9zZXRfcmFuZ2VfdG9fY2lkcihpcCwgaXBfdG8sICZkYXRhLmNpZHIpOworCQlwID0gcmV0cmllZCAmJiBpcCA9PSBoLT5uZXh0LmlwID8gaC0+bmV4dC5wb3J0IDogcG9ydDsKKwkJZm9yICg7IHAgPD0gcG9ydF90bzsgcCsrKSB7CisJCQlkYXRhLnBvcnQgPSBodG9ucyhwKTsKKwkJCXJldCA9IGFkdGZuKHNldCwgJmRhdGEsIHRpbWVvdXQsIGZsYWdzKTsKKworCQkJaWYgKHJldCAmJiAhaXBfc2V0X2VleGlzdChyZXQsIGZsYWdzKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJZWxzZQorCQkJCXJldCA9IDA7CisJCX0KKwkJaXAgPSBsYXN0ICsgMTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTI2Nyw3ICszMDEsOCBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wKIGhhc2hfbmV0cG9ydDZfZGF0YV9lcXVhbChjb25zdCBzdHJ1Y3QgaGFzaF9uZXRwb3J0Nl9lbGVtICppcDEsCi0JCQkgY29uc3Qgc3RydWN0IGhhc2hfbmV0cG9ydDZfZWxlbSAqaXAyKQorCQkJIGNvbnN0IHN0cnVjdCBoYXNoX25ldHBvcnQ2X2VsZW0gKmlwMiwKKwkJCSB1MzIgKm11bHRpKQogewogCXJldHVybiBpcHY2X2FkZHJfY21wKCZpcDEtPmlwLmluNiwgJmlwMi0+aXAuaW42KSA9PSAwICYmCiAJICAgICAgIGlwMS0+cG9ydCA9PSBpcDItPnBvcnQgJiYKQEAgLTM1MCwzMyArMzg1LDQyIEBACiAjZGVmaW5lIEhPU1RfTUFTSwkxMjgKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2FoYXNoLmg+CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAoraGFzaF9uZXRwb3J0Nl9kYXRhX25leHQoc3RydWN0IGlwX3NldF9oYXNoICpoLAorCQkJY29uc3Qgc3RydWN0IGhhc2hfbmV0cG9ydDZfZWxlbSAqZCkKK3sKKwloLT5uZXh0LnBvcnQgPSBudG9ocyhkLT5wb3J0KTsKK30KKwogc3RhdGljIGludAogaGFzaF9uZXRwb3J0Nl9rYWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgZW51bSBpcHNldF9hZHQgYWR0LCB1OCBwZiwgdTggZGltLCB1OCBmbGFncykKKwkJICAgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCQkgICBlbnVtIGlwc2V0X2FkdCBhZHQsIGNvbnN0IHN0cnVjdCBpcF9zZXRfYWR0X29wdCAqb3B0KQogewogCWNvbnN0IHN0cnVjdCBpcF9zZXRfaGFzaCAqaCA9IHNldC0+ZGF0YTsKIAlpcHNldF9hZHRmbiBhZHRmbiA9IHNldC0+dmFyaWFudC0+YWR0W2FkdF07CiAJc3RydWN0IGhhc2hfbmV0cG9ydDZfZWxlbSBkYXRhID0gewotCQkuY2lkciA9IGgtPm5ldHNbMF0uY2lkciB8fCBIT1NUX01BU0sgfTsKKwkJLmNpZHIgPSBoLT5uZXRzWzBdLmNpZHIgPyBoLT5uZXRzWzBdLmNpZHIgOiBIT1NUX01BU0sKKwl9OwogCiAJaWYgKGRhdGEuY2lkciA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoYWR0ID09IElQU0VUX1RFU1QpCiAJCWRhdGEuY2lkciA9IEhPU1RfTUFTSzsKIAotCWlmICghaXBfc2V0X2dldF9pcDZfcG9ydChza2IsIGZsYWdzICYgSVBTRVRfRElNX1RXT19TUkMsCisJaWYgKCFpcF9zZXRfZ2V0X2lwNl9wb3J0KHNrYiwgb3B0LT5mbGFncyAmIElQU0VUX0RJTV9UV09fU1JDLAogCQkJCSAmZGF0YS5wb3J0LCAmZGF0YS5wcm90bykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaXA2YWRkcnB0cihza2IsIGZsYWdzICYgSVBTRVRfRElNX09ORV9TUkMsICZkYXRhLmlwLmluNik7CisJaXA2YWRkcnB0cihza2IsIG9wdC0+ZmxhZ3MgJiBJUFNFVF9ESU1fT05FX1NSQywgJmRhdGEuaXAuaW42KTsKIAlpcDZfbmV0bWFzaygmZGF0YS5pcCwgZGF0YS5jaWRyKTsKIAotCXJldHVybiBhZHRmbihzZXQsICZkYXRhLCBoLT50aW1lb3V0KTsKKwlyZXR1cm4gYWR0Zm4oc2V0LCAmZGF0YSwgb3B0X3RpbWVvdXQob3B0LCBoKSwgb3B0LT5jbWRmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIGhhc2hfbmV0cG9ydDZfdWFkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCSAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTMyICpsaW5lbm8sIHUzMiBmbGFncykKKwkJICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzLCBib29sIHJldHJpZWQpCiB7CiAJY29uc3Qgc3RydWN0IGlwX3NldF9oYXNoICpoID0gc2V0LT5kYXRhOwogCWlwc2V0X2FkdGZuIGFkdGZuID0gc2V0LT52YXJpYW50LT5hZHRbYWR0XTsKQEAgLTM5MSw2ICs0MzUsOCBAQAogCQkgICAgICFpcF9zZXRfb3B0YXR0cl9uZXRvcmRlcih0YiwgSVBTRVRfQVRUUl9QT1JUX1RPKSB8fAogCQkgICAgICFpcF9zZXRfb3B0YXR0cl9uZXRvcmRlcih0YiwgSVBTRVRfQVRUUl9USU1FT1VUKSkpCiAJCXJldHVybiAtSVBTRVRfRVJSX1BST1RPQ09MOworCWlmICh1bmxpa2VseSh0YltJUFNFVF9BVFRSX0lQX1RPXSkpCisJCXJldHVybiAtSVBTRVRfRVJSX0hBU0hfUkFOR0VfVU5TVVBQT1JURUQ7CiAKIAlpZiAodGJbSVBTRVRfQVRUUl9MSU5FTk9dKQogCQkqbGluZW5vID0gbmxhX2dldF91MzIodGJbSVBTRVRfQVRUUl9MSU5FTk9dKTsKQEAgLTQyOSw3ICs0NzUsNyBAQAogCX0KIAogCWlmIChhZHQgPT0gSVBTRVRfVEVTVCB8fCAhd2l0aF9wb3J0cyB8fCAhdGJbSVBTRVRfQVRUUl9QT1JUX1RPXSkgewotCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0KTsKKwkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCwgZmxhZ3MpOwogCQlyZXR1cm4gaXBfc2V0X2VleGlzdChyZXQsIGZsYWdzKSA/IDAgOiByZXQ7CiAJfQogCkBAIC00MzgsOSArNDg0LDExIEBACiAJaWYgKHBvcnQgPiBwb3J0X3RvKQogCQlzd2FwKHBvcnQsIHBvcnRfdG8pOwogCisJaWYgKHJldHJpZWQpCisJCXBvcnQgPSBoLT5uZXh0LnBvcnQ7CiAJZm9yICg7IHBvcnQgPD0gcG9ydF90bzsgcG9ydCsrKSB7CiAJCWRhdGEucG9ydCA9IGh0b25zKHBvcnQpOwotCQlyZXQgPSBhZHRmbihzZXQsICZkYXRhLCB0aW1lb3V0KTsKKwkJcmV0ID0gYWR0Zm4oc2V0LCAmZGF0YSwgdGltZW91dCwgZmxhZ3MpOwogCiAJCWlmIChyZXQgJiYgIWlwX3NldF9lZXhpc3QocmV0LCBmbGFncykpCiAJCQlyZXR1cm4gcmV0OwpAQCAtNTI2LDcgKzU3NCw5IEBACiAJLmZlYXR1cmVzCT0gSVBTRVRfVFlQRV9JUCB8IElQU0VUX1RZUEVfUE9SVCwKIAkuZGltZW5zaW9uCT0gSVBTRVRfRElNX1RXTywKIAkuZmFtaWx5CQk9IEFGX1VOU1BFQywKLQkucmV2aXNpb24JPSAxLAorCS5yZXZpc2lvbl9taW4JPSAwLAorCS8qCQkgIDEJICAgU0NUUCBhbmQgVURQTElURSBzdXBwb3J0IGFkZGVkICovCisJLnJldmlzaW9uX21heAk9IDIsCS8qIFJhbmdlIGFzIGlucHV0IHN1cHBvcnQgZm9yIElQdjQgYWRkZWQgKi8KIAkuY3JlYXRlCQk9IGhhc2hfbmV0cG9ydF9jcmVhdGUsCiAJLmNyZWF0ZV9wb2xpY3kJPSB7CiAJCVtJUFNFVF9BVFRSX0hBU0hTSVpFXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCkBAIC01MzgsNiArNTg4LDcgQEAKIAl9LAogCS5hZHRfcG9saWN5CT0gewogCQlbSVBTRVRfQVRUUl9JUF0JCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKKwkJW0lQU0VUX0FUVFJfSVBfVE9dCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKIAkJW0lQU0VUX0FUVFJfUE9SVF0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCQlbSVBTRVRfQVRUUl9QT1JUX1RPXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJCVtJUFNFVF9BVFRSX1BST1RPXQk9IHsgLnR5cGUgPSBOTEFfVTggfSwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2xpc3Rfc2V0LmMgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9saXN0X3NldC5jCmluZGV4IGU5MTU5ZTkuLjRkMTA4MTkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2xpc3Rfc2V0LmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfbGlzdF9zZXQuYwpAQCAtNzIsNyArNzIsOCBAQAogCiBzdGF0aWMgaW50CiBsaXN0X3NldF9rYWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIHU4IHBmLCB1OCBkaW0sIHU4IGZsYWdzKQorCSAgICAgIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKKwkgICAgICBlbnVtIGlwc2V0X2FkdCBhZHQsIGNvbnN0IHN0cnVjdCBpcF9zZXRfYWR0X29wdCAqb3B0KQogewogCXN0cnVjdCBsaXN0X3NldCAqbWFwID0gc2V0LT5kYXRhOwogCXN0cnVjdCBzZXRfZWxlbSAqZWxlbTsKQEAgLTg3LDE3ICs4OCwxNyBAQAogCQkJY29udGludWU7CiAJCXN3aXRjaCAoYWR0KSB7CiAJCWNhc2UgSVBTRVRfVEVTVDoKLQkJCXJldCA9IGlwX3NldF90ZXN0KGVsZW0tPmlkLCBza2IsIHBmLCBkaW0sIGZsYWdzKTsKKwkJCXJldCA9IGlwX3NldF90ZXN0KGVsZW0tPmlkLCBza2IsIHBhciwgb3B0KTsKIAkJCWlmIChyZXQgPiAwKQogCQkJCXJldHVybiByZXQ7CiAJCQlicmVhazsKIAkJY2FzZSBJUFNFVF9BREQ6Ci0JCQlyZXQgPSBpcF9zZXRfYWRkKGVsZW0tPmlkLCBza2IsIHBmLCBkaW0sIGZsYWdzKTsKKwkJCXJldCA9IGlwX3NldF9hZGQoZWxlbS0+aWQsIHNrYiwgcGFyLCBvcHQpOwogCQkJaWYgKHJldCA9PSAwKQogCQkJCXJldHVybiByZXQ7CiAJCQlicmVhazsKIAkJY2FzZSBJUFNFVF9ERUw6Ci0JCQlyZXQgPSBpcF9zZXRfZGVsKGVsZW0tPmlkLCBza2IsIHBmLCBkaW0sIGZsYWdzKTsKKwkJCXJldCA9IGlwX3NldF9kZWwoZWxlbS0+aWQsIHNrYiwgcGFyLCBvcHQpOwogCQkJaWYgKHJldCA9PSAwKQogCQkJCXJldHVybiByZXQ7CiAJCQlicmVhazsKQEAgLTEwOSwxNSArMTEwLDI4IEBACiB9CiAKIHN0YXRpYyBib29sCi1uZXh0X2lkX2VxKGNvbnN0IHN0cnVjdCBsaXN0X3NldCAqbWFwLCB1MzIgaSwgaXBfc2V0X2lkX3QgaWQpCitpZF9lcShjb25zdCBzdHJ1Y3QgbGlzdF9zZXQgKm1hcCwgdTMyIGksIGlwX3NldF9pZF90IGlkKQogewogCWNvbnN0IHN0cnVjdCBzZXRfZWxlbSAqZWxlbTsKIAotCWlmIChpICsgMSA8IG1hcC0+c2l6ZSkgewotCQllbGVtID0gbGlzdF9zZXRfZWxlbShtYXAsIGkgKyAxKTsKKwlpZiAoaSA8IG1hcC0+c2l6ZSkgeworCQllbGVtID0gbGlzdF9zZXRfZWxlbShtYXAsIGkpOworCQlyZXR1cm4gZWxlbS0+aWQgPT0gaWQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sCitpZF9lcV90aW1lb3V0KGNvbnN0IHN0cnVjdCBsaXN0X3NldCAqbWFwLCB1MzIgaSwgaXBfc2V0X2lkX3QgaWQpCit7CisJY29uc3Qgc3RydWN0IHNldF9lbGVtICplbGVtOworCisJaWYgKGkgPCBtYXAtPnNpemUpIHsKKwkJZWxlbSA9IGxpc3Rfc2V0X2VsZW0obWFwLCBpKTsKIAkJcmV0dXJuICEhKGVsZW0tPmlkID09IGlkICYmCiAJCQkgICEod2l0aF90aW1lb3V0KG1hcC0+dGltZW91dCkgJiYKLQkJCSAgICBsaXN0X3NldF9leHBpcmVkKG1hcCwgaSArIDEpKSk7CisJCQkgICAgbGlzdF9zZXRfZXhwaXJlZChtYXAsIGkpKSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xOTAsMTIgKzIwNCwyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZAorY2xlYW51cF9lbnRyaWVzKHN0cnVjdCBsaXN0X3NldCAqbWFwKQoreworCXN0cnVjdCBzZXRfdGVsZW0gKmU7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFwLT5zaXplOyBpKyspIHsKKwkJZSA9IGxpc3Rfc2V0X3RlbGVtKG1hcCwgaSk7CisJCWlmIChlLT5pZCAhPSBJUFNFVF9JTlZBTElEX0lEICYmIGxpc3Rfc2V0X2V4cGlyZWQobWFwLCBpKSkKKwkJCWxpc3Rfc2V0X2RlbChtYXAsIGkpOworCX0KK30KKwogc3RhdGljIGludAogbGlzdF9zZXRfdWFkdChzdHJ1Y3QgaXBfc2V0ICpzZXQsIHN0cnVjdCBubGF0dHIgKnRiW10sCi0JICAgICAgZW51bSBpcHNldF9hZHQgYWR0LCB1MzIgKmxpbmVubywgdTMyIGZsYWdzKQorCSAgICAgIGVudW0gaXBzZXRfYWR0IGFkdCwgdTMyICpsaW5lbm8sIHUzMiBmbGFncywgYm9vbCByZXRyaWVkKQogewogCXN0cnVjdCBsaXN0X3NldCAqbWFwID0gc2V0LT5kYXRhOwogCWJvb2wgd2l0aF90aW1lb3V0ID0gd2l0aF90aW1lb3V0KG1hcC0+dGltZW91dCk7CisJYm9vbCBmbGFnX2V4aXN0ID0gZmxhZ3MgJiBJUFNFVF9GTEFHX0VYSVNUOwogCWludCBiZWZvcmUgPSAwOwogCXUzMiB0aW1lb3V0ID0gbWFwLT50aW1lb3V0OwogCWlwX3NldF9pZF90IGlkLCByZWZpZCA9IElQU0VUX0lOVkFMSURfSUQ7CkBAIC0yNDgsNiArMjc2LDggQEAKIAkJfQogCQl0aW1lb3V0ID0gaXBfc2V0X3RpbWVvdXRfdWdldCh0YltJUFNFVF9BVFRSX1RJTUVPVVRdKTsKIAl9CisJaWYgKHdpdGhfdGltZW91dCAmJiBhZHQgIT0gSVBTRVRfVEVTVCkKKwkJY2xlYW51cF9lbnRyaWVzKG1hcCk7CiAKIAlzd2l0Y2ggKGFkdCkgewogCWNhc2UgSVBTRVRfVEVTVDoKQEAgLTI1OSwyMiArMjg5LDM3IEBACiAJCQllbHNlIGlmICh3aXRoX3RpbWVvdXQgJiYgbGlzdF9zZXRfZXhwaXJlZChtYXAsIGkpKQogCQkJCWNvbnRpbnVlOwogCQkJZWxzZSBpZiAoYmVmb3JlID4gMCAmJiBlbGVtLT5pZCA9PSBpZCkKLQkJCQlyZXQgPSBuZXh0X2lkX2VxKG1hcCwgaSwgcmVmaWQpOworCQkJCXJldCA9IGlkX2VxX3RpbWVvdXQobWFwLCBpICsgMSwgcmVmaWQpOwogCQkJZWxzZSBpZiAoYmVmb3JlIDwgMCAmJiBlbGVtLT5pZCA9PSByZWZpZCkKLQkJCQlyZXQgPSBuZXh0X2lkX2VxKG1hcCwgaSwgaWQpOworCQkJCXJldCA9IGlkX2VxX3RpbWVvdXQobWFwLCBpICsgMSwgaWQpOwogCQkJZWxzZSBpZiAoYmVmb3JlID09IDAgJiYgZWxlbS0+aWQgPT0gaWQpCiAJCQkJcmV0ID0gMTsKIAkJfQogCQlicmVhazsKIAljYXNlIElQU0VUX0FERDoKLQkJZm9yIChpID0gMDsgaSA8IG1hcC0+c2l6ZSAmJiAhcmV0OyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IG1hcC0+c2l6ZTsgaSsrKSB7CiAJCQllbGVtID0gbGlzdF9zZXRfZWxlbShtYXAsIGkpOwotCQkJaWYgKGVsZW0tPmlkID09IGlkICYmCi0JCQkgICAgISh3aXRoX3RpbWVvdXQgJiYgbGlzdF9zZXRfZXhwaXJlZChtYXAsIGkpKSkKKwkJCWlmIChlbGVtLT5pZCAhPSBpZCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghKHdpdGhfdGltZW91dCAmJiBmbGFnX2V4aXN0KSkgewogCQkJCXJldCA9IC1JUFNFVF9FUlJfRVhJU1Q7CisJCQkJZ290byBmaW5pc2g7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBzZXRfdGVsZW0gKmUgPSBsaXN0X3NldF90ZWxlbShtYXAsIGkpOworCisJCQkJaWYgKChiZWZvcmUgPiAxICYmCisJCQkJICAgICAhaWRfZXEobWFwLCBpICsgMSwgcmVmaWQpKSB8fAorCQkJCSAgICAoYmVmb3JlIDwgMCAmJgorCQkJCSAgICAgKGkgPT0gMCB8fCAhaWRfZXEobWFwLCBpIC0gMSwgcmVmaWQpKSkpIHsKKwkJCQkJcmV0ID0gLUlQU0VUX0VSUl9FWElTVDsKKwkJCQkJZ290byBmaW5pc2g7CisJCQkJfQorCQkJCWUtPnRpbWVvdXQgPSBpcF9zZXRfdGltZW91dF9zZXQodGltZW91dCk7CisJCQkJaXBfc2V0X3B1dF9ieWluZGV4KGlkKTsKKwkJCQlyZXQgPSAwOworCQkJCWdvdG8gZmluaXNoOworCQkJfQogCQl9Ci0JCWlmIChyZXQgPT0gLUlQU0VUX0VSUl9FWElTVCkKLQkJCWJyZWFrOwogCQlyZXQgPSAtSVBTRVRfRVJSX0xJU1RfRlVMTDsKIAkJZm9yIChpID0gMDsgaSA8IG1hcC0+c2l6ZSAmJiByZXQgPT0gLUlQU0VUX0VSUl9MSVNUX0ZVTEw7IGkrKykgewogCQkJZWxlbSA9IGxpc3Rfc2V0X2VsZW0obWFwLCBpKTsKQEAgLTI4Myw5ICszMjgsNyBAQAogCQkJCQk6IGxpc3Rfc2V0X2FkZChtYXAsIGksIGlkLCB0aW1lb3V0KTsKIAkJCWVsc2UgaWYgKGVsZW0tPmlkICE9IHJlZmlkKQogCQkJCWNvbnRpbnVlOwotCQkJZWxzZSBpZiAod2l0aF90aW1lb3V0ICYmIGxpc3Rfc2V0X2V4cGlyZWQobWFwLCBpKSkKLQkJCQlyZXQgPSAtSVBTRVRfRVJSX1JFRl9FWElTVDsKLQkJCWVsc2UgaWYgKGJlZm9yZSkKKwkJCWVsc2UgaWYgKGJlZm9yZSA+IDApCiAJCQkJcmV0ID0gbGlzdF9zZXRfYWRkKG1hcCwgaSwgaWQsIHRpbWVvdXQpOwogCQkJZWxzZSBpZiAoaSArIDEgPCBtYXAtPnNpemUpCiAJCQkJcmV0ID0gbGlzdF9zZXRfYWRkKG1hcCwgaSArIDEsIGlkLCB0aW1lb3V0KTsKQEAgLTI5OSwxNiArMzQyLDEyIEBACiAJCQkJcmV0ID0gYmVmb3JlICE9IDAgPyAtSVBTRVRfRVJSX1JFRl9FWElTVAogCQkJCQkJICA6IC1JUFNFVF9FUlJfRVhJU1Q7CiAJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHdpdGhfdGltZW91dCAmJiBsaXN0X3NldF9leHBpcmVkKG1hcCwgaSkpCi0JCQkJY29udGludWU7Ci0JCQllbHNlIGlmIChlbGVtLT5pZCA9PSBpZCAmJgotCQkJCSAoYmVmb3JlID09IDAgfHwKLQkJCQkgIChiZWZvcmUgPiAwICYmCi0JCQkJICAgbmV4dF9pZF9lcShtYXAsIGksIHJlZmlkKSkpKQorCQkJfSBlbHNlIGlmIChlbGVtLT5pZCA9PSBpZCAmJgorCQkJCSAgIChiZWZvcmUgPT0gMCB8fAorCQkJCSAgICAoYmVmb3JlID4gMCAmJiBpZF9lcShtYXAsIGkgKyAxLCByZWZpZCkpKSkKIAkJCQlyZXQgPSBsaXN0X3NldF9kZWwobWFwLCBpKTsKLQkJCWVsc2UgaWYgKGJlZm9yZSA8IDAgJiYKLQkJCQkgZWxlbS0+aWQgPT0gcmVmaWQgJiYKLQkJCQkgbmV4dF9pZF9lcShtYXAsIGksIGlkKSkKKwkJCWVsc2UgaWYgKGVsZW0tPmlkID09IHJlZmlkICYmCisJCQkJIGJlZm9yZSA8IDAgJiYgaWRfZXEobWFwLCBpICsgMSwgaWQpKQogCQkJCXJldCA9IGxpc3Rfc2V0X2RlbChtYXAsIGkgKyAxKTsKIAkJfQogCQlicmVhazsKQEAgLTQ1NCwxNSArNDkzLDkgQEAKIHsKIAlzdHJ1Y3QgaXBfc2V0ICpzZXQgPSAoc3RydWN0IGlwX3NldCAqKSB1bF9zZXQ7CiAJc3RydWN0IGxpc3Rfc2V0ICptYXAgPSBzZXQtPmRhdGE7Ci0Jc3RydWN0IHNldF90ZWxlbSAqZTsKLQl1MzIgaTsKIAogCXdyaXRlX2xvY2tfYmgoJnNldC0+bG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IG1hcC0+c2l6ZTsgaSsrKSB7Ci0JCWUgPSBsaXN0X3NldF90ZWxlbShtYXAsIGkpOwotCQlpZiAoZS0+aWQgIT0gSVBTRVRfSU5WQUxJRF9JRCAmJiBsaXN0X3NldF9leHBpcmVkKG1hcCwgaSkpCi0JCQlsaXN0X3NldF9kZWwobWFwLCBpKTsKLQl9CisJY2xlYW51cF9lbnRyaWVzKG1hcCk7CiAJd3JpdGVfdW5sb2NrX2JoKCZzZXQtPmxvY2spOwogCiAJbWFwLT5nYy5leHBpcmVzID0gamlmZmllcyArIElQU0VUX0dDX1BFUklPRChtYXAtPnRpbWVvdXQpICogSFo7CkBAIC01NDMsNyArNTc2LDggQEAKIAkuZmVhdHVyZXMJPSBJUFNFVF9UWVBFX05BTUUgfCBJUFNFVF9EVU1QX0xBU1QsCiAJLmRpbWVuc2lvbgk9IElQU0VUX0RJTV9PTkUsCiAJLmZhbWlseQkJPSBBRl9VTlNQRUMsCi0JLnJldmlzaW9uCT0gMCwKKwkucmV2aXNpb25fbWluCT0gMCwKKwkucmV2aXNpb25fbWF4CT0gMCwKIAkuY3JlYXRlCQk9IGxpc3Rfc2V0X2NyZWF0ZSwKIAkuY3JlYXRlX3BvbGljeQk9IHsKIAkJW0lQU0VUX0FUVFJfU0laRV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9wZnhsZW4uYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvcGZ4bGVuLmMKaW5kZXggMjNmOGM4MS4uYmQxM2Q2NiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9wZnhsZW4uYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L3BmeGxlbi5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGlwX3NldF9uZXRtYXNrX21hcCk7CiAKICN1bmRlZiAgRQotI2RlZmluZSBFKGEsIGIsIGMsIGQpIAkJCQkJCVwKKyNkZWZpbmUgRShhLCBiLCBjLCBkKQkJCQkJCVwKIAl7LmlwNiA9IHsgKF9fZm9yY2UgX19iZTMyKSBhLCAoX19mb3JjZSBfX2JlMzIpIGIsCVwKIAkJICAoX19mb3JjZSBfX2JlMzIpIGMsIChfX2ZvcmNlIF9fYmUzMikgZCwJXAogCX0gfQpAQCAtMjg5LDMgKzI4OSwyNCBAQAogCUUoMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiksCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoaXBfc2V0X2hvc3RtYXNrX21hcCk7CisKKy8qIEZpbmQgdGhlIGxhcmdlc3QgbmV0d29yayB3aGljaCBtYXRjaGVzIHRoZSByYW5nZSBmcm9tIGxlZnQsIGluIGhvc3Qgb3JkZXIuICovCit1MzIKK2lwX3NldF9yYW5nZV90b19jaWRyKHUzMiBmcm9tLCB1MzIgdG8sIHU4ICpjaWRyKQoreworCXUzMiBsYXN0OworCXU4IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgMzI7IGkrKykgeworCQlpZiAoKGZyb20gJiBpcF9zZXRfaG9zdG1hc2soaSkpICE9IGZyb20pCisJCQljb250aW51ZTsKKwkJbGFzdCA9IGZyb20gfCB+aXBfc2V0X2hvc3RtYXNrKGkpOworCQlpZiAoIWFmdGVyKGxhc3QsIHRvKSkgeworCQkJKmNpZHIgPSBpOworCQkJcmV0dXJuIGxhc3Q7CisJCX0KKwl9CisJKmNpZHIgPSAzMjsKKwlyZXR1cm4gZnJvbTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlwX3NldF9yYW5nZV90b19jaWRyKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19hcHAuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19hcHAuYwppbmRleCAwNTlhZjMxLi5mZTZjYjQzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfYXBwLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2FwcC5jCkBAIC01NzYsNyArNTc2LDcgQEAKIH07CiAjZW5kaWYKIAotaW50IF9fbmV0X2luaXQgX19pcF92c19hcHBfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCitpbnQgX19uZXRfaW5pdCBpcF92c19hcHBfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQogewogCXN0cnVjdCBuZXRuc19pcHZzICppcHZzID0gbmV0X2lwdnMobmV0KTsKIApAQCAtNTg1LDE3ICs1ODUsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9fbmV0X2V4aXQgX19pcF92c19hcHBfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpCit2b2lkIF9fbmV0X2V4aXQgaXBfdnNfYXBwX25ldF9jbGVhbnVwKHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlwcm9jX25ldF9yZW1vdmUobmV0LCAiaXBfdnNfYXBwIik7CiB9Ci0KLWludCBfX2luaXQgaXBfdnNfYXBwX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi12b2lkIGlwX3ZzX2FwcF9jbGVhbnVwKHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Nvbm4uYwppbmRleCBiZjI4YWMyLi4xMjU3MWZiIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb25uLmMKQEAgLTc3Niw4ICs3NzYsMTYgQEAKIAkJaWYgKGNwLT5jb250cm9sKQogCQkJaXBfdnNfY29udHJvbF9kZWwoY3ApOwogCi0JCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfTkZDVCkKKwkJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9ORkNUKSB7CiAJCQlpcF92c19jb25uX2Ryb3BfY29ubnRyYWNrKGNwKTsKKwkJCS8qIERvIG5vdCBhY2Nlc3MgY29ubnRyYWNrcyBkdXJpbmcgc3Vic3lzIGNsZWFudXAKKwkJCSAqIGJlY2F1c2UgbmZfY29ubnRyYWNrX2ZpbmRfZ2V0IGNhbiBub3QgYmUgdXNlZCBhZnRlcgorCQkJICogY29ubnRyYWNrIGNsZWFudXAgZm9yIHRoZSBuZXQuCisJCQkgKi8KKwkJCXNtcF9ybWIoKTsKKwkJCWlmIChpcHZzLT5lbmFibGUpCisJCQkJaXBfdnNfY29ubl9kcm9wX2Nvbm50cmFjayhjcCk7CisJCX0KIAogCQlpcF92c19wZV9wdXQoY3AtPnBlKTsKIAkJa2ZyZWUoY3AtPnBlX2RhdGEpOwpAQCAtMTI0Nyw3ICsxMjU1LDcgQEAKIC8qCiAgKiBwZXIgbmV0bnMgaW5pdCBhbmQgZXhpdAogICovCi1pbnQgX19uZXRfaW5pdCBfX2lwX3ZzX2Nvbm5faW5pdChzdHJ1Y3QgbmV0ICpuZXQpCitpbnQgX19uZXRfaW5pdCBpcF92c19jb25uX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3QgbmV0bnNfaXB2cyAqaXB2cyA9IG5ldF9pcHZzKG5ldCk7CiAKQEAgLTEyNTgsNyArMTI2Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19uZXRfZXhpdCBfX2lwX3ZzX2Nvbm5fY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpCit2b2lkIF9fbmV0X2V4aXQgaXBfdnNfY29ubl9uZXRfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJLyogZmx1c2ggYWxsIHRoZSBjb25uZWN0aW9uIGVudHJpZXMgZmlyc3QgKi8KIAlpcF92c19jb25uX2ZsdXNoKG5ldCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2NvcmUuYwppbmRleCBiZmE4MDhmLi40Zjc3YmIxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMKQEAgLTg1Miw3ICs4NTIsNyBAQAogCSpyZWxhdGVkID0gMTsKIAogCS8qIHJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzICovCi0JaWYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkgeworCWlmIChpcF9pc19mcmFnbWVudChpcF9oZHIoc2tiKSkpIHsKIAkJaWYgKGlwX3ZzX2dhdGhlcl9mcmFncyhza2IsIGlwX3ZzX2RlZnJhZ191c2VyKGhvb2tudW0pKSkKIAkJCXJldHVybiBORl9TVE9MRU47CiAJfQpAQCAtMTE1Niw4ICsxMTU2LDcgQEAKIAkJaXBfdnNfZmlsbF9pcGhkcihhZiwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksICZpcGgpOwogCX0gZWxzZQogI2VuZGlmCi0JCWlmICh1bmxpa2VseShpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRnxJUF9PRkZTRVQpICYmCi0JCQkgICAgICFwcC0+ZG9udF9kZWZyYWcpKSB7CisJCWlmICh1bmxpa2VseShpcF9pc19mcmFnbWVudChpcF9oZHIoc2tiKSkgJiYgIXBwLT5kb250X2RlZnJhZykpIHsKIAkJCWlmIChpcF92c19nYXRoZXJfZnJhZ3Moc2tiLAogCQkJCQkgICAgICAgaXBfdnNfZGVmcmFnX3VzZXIoaG9va251bSkpKQogCQkJCXJldHVybiBORl9TVE9MRU47CkBAIC0xMzEwLDcgKzEzMDksNyBAQAogCSpyZWxhdGVkID0gMTsKIAogCS8qIHJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzICovCi0JaWYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkgeworCWlmIChpcF9pc19mcmFnbWVudChpcF9oZHIoc2tiKSkpIHsKIAkJaWYgKGlwX3ZzX2dhdGhlcl9mcmFncyhza2IsIGlwX3ZzX2RlZnJhZ191c2VyKGhvb2tudW0pKSkKIAkJCXJldHVybiBORl9TVE9MRU47CiAJfQpAQCAtMTM4NCw3ICsxMzgzLDcgQEAKIAkJb2Zmc2V0ICs9IDIgKiBzaXplb2YoX191MTYpOwogCXZlcmRpY3QgPSBpcF92c19pY21wX3htaXQoc2tiLCBjcCwgcHAsIG9mZnNldCwgaG9va251bSk7CiAKLSAgb3V0Ogorb3V0OgogCV9faXBfdnNfY29ubl9wdXQoY3ApOwogCiAJcmV0dXJuIHZlcmRpY3Q7CkBAIC0xNzcyLDcgKzE3NzEsNyBAQAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVULAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfSU4sCi0JCS5wcmlvcml0eQk9IDk5LAorCQkucHJpb3JpdHkJPSBORl9JUF9QUklfTkFUX1NSQyAtIDIsCiAJfSwKIAkvKiBBZnRlciBwYWNrZXQgZmlsdGVyaW5nLCBmb3J3YXJkIHBhY2tldCB0aHJvdWdoIFZTL0RSLCBWUy9UVU4sCiAJICogb3IgVlMvTkFUKGNoYW5nZSBkZXN0aW5hdGlvbiksIHNvIHRoYXQgZmlsdGVyaW5nIHJ1bGVzIGNhbiBiZQpAQCAtMTc4Miw3ICsxNzgxLDcgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkucGYJCT0gUEZfSU5FVCwKIAkJLmhvb2tudW0JPSBORl9JTkVUX0xPQ0FMX0lOLAotCQkucHJpb3JpdHkJPSAxMDEsCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfU1JDIC0gMSwKIAl9LAogCS8qIEJlZm9yZSBpcF92c19pbiwgY2hhbmdlIHNvdXJjZSBvbmx5IGZvciBWUy9OQVQgKi8KIAl7CkBAIC0xNzkwLDcgKzE3ODksNyBAQAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVULAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfT1VULAotCQkucHJpb3JpdHkJPSAtOTksCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfRFNUICsgMSwKIAl9LAogCS8qIEFmdGVyIG1hbmdsZSwgc2NoZWR1bGUgYW5kIGZvcndhcmQgbG9jYWwgcmVxdWVzdHMgKi8KIAl7CkBAIC0xNzk4LDcgKzE3OTcsNyBAQAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVULAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfT1VULAotCQkucHJpb3JpdHkJPSAtOTgsCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfRFNUICsgMiwKIAl9LAogCS8qIEFmdGVyIHBhY2tldCBmaWx0ZXJpbmcgKGJ1dCBiZWZvcmUgaXBfdnNfb3V0X2ljbXApLCBjYXRjaCBpY21wCiAJICogZGVzdGluZWQgZm9yIDAuMC4wLjAvMCwgd2hpY2ggaXMgZm9yIGluY29taW5nIElQVlMgY29ubmVjdGlvbnMgKi8KQEAgLTE4MjQsNyArMTgyMyw3IEBACiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLnBmCQk9IFBGX0lORVQ2LAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfSU4sCi0JCS5wcmlvcml0eQk9IDk5LAorCQkucHJpb3JpdHkJPSBORl9JUDZfUFJJX05BVF9TUkMgLSAyLAogCX0sCiAJLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZywgZm9yd2FyZCBwYWNrZXQgdGhyb3VnaCBWUy9EUiwgVlMvVFVOLAogCSAqIG9yIFZTL05BVChjaGFuZ2UgZGVzdGluYXRpb24pLCBzbyB0aGF0IGZpbHRlcmluZyBydWxlcyBjYW4gYmUKQEAgLTE4MzQsNyArMTgzMyw3IEBACiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLnBmCQk9IFBGX0lORVQ2LAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfSU4sCi0JCS5wcmlvcml0eQk9IDEwMSwKKwkJLnByaW9yaXR5CT0gTkZfSVA2X1BSSV9OQVRfU1JDIC0gMSwKIAl9LAogCS8qIEJlZm9yZSBpcF92c19pbiwgY2hhbmdlIHNvdXJjZSBvbmx5IGZvciBWUy9OQVQgKi8KIAl7CkBAIC0xODQyLDcgKzE4NDEsNyBAQAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVULAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfT1VULAotCQkucHJpb3JpdHkJPSAtOTksCisJCS5wcmlvcml0eQk9IE5GX0lQNl9QUklfTkFUX0RTVCArIDEsCiAJfSwKIAkvKiBBZnRlciBtYW5nbGUsIHNjaGVkdWxlIGFuZCBmb3J3YXJkIGxvY2FsIHJlcXVlc3RzICovCiAJewpAQCAtMTg1MCw3ICsxODQ5LDcgQEAKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkucGYJCT0gUEZfSU5FVDYsCiAJCS5ob29rbnVtCT0gTkZfSU5FVF9MT0NBTF9PVVQsCi0JCS5wcmlvcml0eQk9IC05OCwKKwkJLnByaW9yaXR5CT0gTkZfSVA2X1BSSV9OQVRfRFNUICsgMiwKIAl9LAogCS8qIEFmdGVyIHBhY2tldCBmaWx0ZXJpbmcgKGJ1dCBiZWZvcmUgaXBfdnNfb3V0X2ljbXApLCBjYXRjaCBpY21wCiAJICogZGVzdGluZWQgZm9yIDAuMC4wLjAvMCwgd2hpY2ggaXMgZm9yIGluY29taW5nIElQVlMgY29ubmVjdGlvbnMgKi8KQEAgLTE4OTEsMjIgKzE4OTAsMjIgQEAKIAlhdG9taWNfaW5jKCZpcHZzX25ldG5zX2NudCk7CiAJbmV0LT5pcHZzID0gaXB2czsKIAotCWlmIChfX2lwX3ZzX2VzdGltYXRvcl9pbml0KG5ldCkgPCAwKQorCWlmIChpcF92c19lc3RpbWF0b3JfbmV0X2luaXQobmV0KSA8IDApCiAJCWdvdG8gZXN0aW1hdG9yX2ZhaWw7CiAKLQlpZiAoX19pcF92c19jb250cm9sX2luaXQobmV0KSA8IDApCisJaWYgKGlwX3ZzX2NvbnRyb2xfbmV0X2luaXQobmV0KSA8IDApCiAJCWdvdG8gY29udHJvbF9mYWlsOwogCi0JaWYgKF9faXBfdnNfcHJvdG9jb2xfaW5pdChuZXQpIDwgMCkKKwlpZiAoaXBfdnNfcHJvdG9jb2xfbmV0X2luaXQobmV0KSA8IDApCiAJCWdvdG8gcHJvdG9jb2xfZmFpbDsKIAotCWlmIChfX2lwX3ZzX2FwcF9pbml0KG5ldCkgPCAwKQorCWlmIChpcF92c19hcHBfbmV0X2luaXQobmV0KSA8IDApCiAJCWdvdG8gYXBwX2ZhaWw7CiAKLQlpZiAoX19pcF92c19jb25uX2luaXQobmV0KSA8IDApCisJaWYgKGlwX3ZzX2Nvbm5fbmV0X2luaXQobmV0KSA8IDApCiAJCWdvdG8gY29ubl9mYWlsOwogCi0JaWYgKF9faXBfdnNfc3luY19pbml0KG5ldCkgPCAwKQorCWlmIChpcF92c19zeW5jX25ldF9pbml0KG5ldCkgPCAwKQogCQlnb3RvIHN5bmNfZmFpbDsKIAogCXByaW50ayhLRVJOX0lORk8gIklQVlM6IENyZWF0aW5nIG5ldG5zIHNpemU9JXp1IGlkPSVkXG4iLApAQCAtMTkxNywyNyArMTkxNiwyNyBAQAogICovCiAKIHN5bmNfZmFpbDoKLQlfX2lwX3ZzX2Nvbm5fY2xlYW51cChuZXQpOworCWlwX3ZzX2Nvbm5fbmV0X2NsZWFudXAobmV0KTsKIGNvbm5fZmFpbDoKLQlfX2lwX3ZzX2FwcF9jbGVhbnVwKG5ldCk7CisJaXBfdnNfYXBwX25ldF9jbGVhbnVwKG5ldCk7CiBhcHBfZmFpbDoKLQlfX2lwX3ZzX3Byb3RvY29sX2NsZWFudXAobmV0KTsKKwlpcF92c19wcm90b2NvbF9uZXRfY2xlYW51cChuZXQpOwogcHJvdG9jb2xfZmFpbDoKLQlfX2lwX3ZzX2NvbnRyb2xfY2xlYW51cChuZXQpOworCWlwX3ZzX2NvbnRyb2xfbmV0X2NsZWFudXAobmV0KTsKIGNvbnRyb2xfZmFpbDoKLQlfX2lwX3ZzX2VzdGltYXRvcl9jbGVhbnVwKG5ldCk7CisJaXBfdnNfZXN0aW1hdG9yX25ldF9jbGVhbnVwKG5ldCk7CiBlc3RpbWF0b3JfZmFpbDoKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgX19uZXRfZXhpdCBfX2lwX3ZzX2NsZWFudXAoc3RydWN0IG5ldCAqbmV0KQogewotCV9faXBfdnNfc2VydmljZV9jbGVhbnVwKG5ldCk7CS8qIGlwX3ZzX2ZsdXNoKCkgd2l0aCBsb2NrcyAqLwotCV9faXBfdnNfY29ubl9jbGVhbnVwKG5ldCk7Ci0JX19pcF92c19hcHBfY2xlYW51cChuZXQpOwotCV9faXBfdnNfcHJvdG9jb2xfY2xlYW51cChuZXQpOwotCV9faXBfdnNfY29udHJvbF9jbGVhbnVwKG5ldCk7Ci0JX19pcF92c19lc3RpbWF0b3JfY2xlYW51cChuZXQpOworCWlwX3ZzX3NlcnZpY2VfbmV0X2NsZWFudXAobmV0KTsJLyogaXBfdnNfZmx1c2goKSB3aXRoIGxvY2tzICovCisJaXBfdnNfY29ubl9uZXRfY2xlYW51cChuZXQpOworCWlwX3ZzX2FwcF9uZXRfY2xlYW51cChuZXQpOworCWlwX3ZzX3Byb3RvY29sX25ldF9jbGVhbnVwKG5ldCk7CisJaXBfdnNfY29udHJvbF9uZXRfY2xlYW51cChuZXQpOworCWlwX3ZzX2VzdGltYXRvcl9uZXRfY2xlYW51cChuZXQpOwogCUlQX1ZTX0RCRygyLCAiaXB2cyBuZXRucyAlZCByZWxlYXNlZFxuIiwgbmV0X2lwdnMobmV0KS0+Z2VuKTsKIH0KIApAQCAtMTk0NSw3ICsxOTQ0LDggQEAKIHsKIAlFbnRlckZ1bmN0aW9uKDIpOwogCW5ldF9pcHZzKG5ldCktPmVuYWJsZSA9IDA7CS8qIERpc2FibGUgcGFja2V0IHJlY2VwdGlvbiAqLwotCV9faXBfdnNfc3luY19jbGVhbnVwKG5ldCk7CisJc21wX3dtYigpOworCWlwX3ZzX3N5bmNfbmV0X2NsZWFudXAobmV0KTsKIAlMZWF2ZUZ1bmN0aW9uKDIpOwogfQogCkBAIC0xOTY3LDM2ICsxOTY3LDIzIEBACiB7CiAJaW50IHJldDsKIAotCWlwX3ZzX2VzdGltYXRvcl9pbml0KCk7CiAJcmV0ID0gaXBfdnNfY29udHJvbF9pbml0KCk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfZXJyKCJjYW4ndCBzZXR1cCBjb250cm9sLlxuIik7Ci0JCWdvdG8gY2xlYW51cF9lc3RpbWF0b3I7CisJCWdvdG8gZXhpdDsKIAl9CiAKIAlpcF92c19wcm90b2NvbF9pbml0KCk7CiAKLQlyZXQgPSBpcF92c19hcHBfaW5pdCgpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiY2FuJ3Qgc2V0dXAgYXBwbGljYXRpb24gaGVscGVyLlxuIik7Ci0JCWdvdG8gY2xlYW51cF9wcm90b2NvbDsKLQl9Ci0KIAlyZXQgPSBpcF92c19jb25uX2luaXQoKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcl9lcnIoImNhbid0IHNldHVwIGNvbm5lY3Rpb24gdGFibGUuXG4iKTsKLQkJZ290byBjbGVhbnVwX2FwcDsKLQl9Ci0KLQlyZXQgPSBpcF92c19zeW5jX2luaXQoKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoImNhbid0IHNldHVwIHN5bmMgZGF0YS5cbiIpOwotCQlnb3RvIGNsZWFudXBfY29ubjsKKwkJZ290byBjbGVhbnVwX3Byb3RvY29sOwogCX0KIAogCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmlwdnNfY29yZV9vcHMpOwkvKiBBbGxvYyBpcF92cyBzdHJ1Y3QgKi8KIAlpZiAocmV0IDwgMCkKLQkJZ290byBjbGVhbnVwX3N5bmM7CisJCWdvdG8gY2xlYW51cF9jb25uOwogCiAJcmV0ID0gcmVnaXN0ZXJfcGVybmV0X2RldmljZSgmaXB2c19jb3JlX2Rldl9vcHMpOwogCWlmIChyZXQgPCAwKQpAQCAtMjAxNiwxNyArMjAwMywxMiBAQAogCXVucmVnaXN0ZXJfcGVybmV0X2RldmljZSgmaXB2c19jb3JlX2Rldl9vcHMpOwogY2xlYW51cF9zdWI6CiAJdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZpcHZzX2NvcmVfb3BzKTsKLWNsZWFudXBfc3luYzoKLQlpcF92c19zeW5jX2NsZWFudXAoKTsKLSAgY2xlYW51cF9jb25uOgorY2xlYW51cF9jb25uOgogCWlwX3ZzX2Nvbm5fY2xlYW51cCgpOwotICBjbGVhbnVwX2FwcDoKLQlpcF92c19hcHBfY2xlYW51cCgpOwotICBjbGVhbnVwX3Byb3RvY29sOgorY2xlYW51cF9wcm90b2NvbDoKIAlpcF92c19wcm90b2NvbF9jbGVhbnVwKCk7CiAJaXBfdnNfY29udHJvbF9jbGVhbnVwKCk7Ci0gIGNsZWFudXBfZXN0aW1hdG9yOgotCWlwX3ZzX2VzdGltYXRvcl9jbGVhbnVwKCk7CitleGl0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIwMzUsMTIgKzIwMTcsOSBAQAogCW5mX3VucmVnaXN0ZXJfaG9va3MoaXBfdnNfb3BzLCBBUlJBWV9TSVpFKGlwX3ZzX29wcykpOwogCXVucmVnaXN0ZXJfcGVybmV0X2RldmljZSgmaXB2c19jb3JlX2Rldl9vcHMpOwogCXVucmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmaXB2c19jb3JlX29wcyk7CS8qIGZyZWUgaXBfdnMgc3RydWN0ICovCi0JaXBfdnNfc3luY19jbGVhbnVwKCk7CiAJaXBfdnNfY29ubl9jbGVhbnVwKCk7Ci0JaXBfdnNfYXBwX2NsZWFudXAoKTsKIAlpcF92c19wcm90b2NvbF9jbGVhbnVwKCk7CiAJaXBfdnNfY29udHJvbF9jbGVhbnVwKCk7Ci0JaXBfdnNfZXN0aW1hdG9yX2NsZWFudXAoKTsKIAlwcl9pbmZvKCJpcHZzIHVubG9hZGVkLlxuIik7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYwppbmRleCA2OTljNzlhLi5iZTQzZmQ4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2N0bC5jCkBAIC0xMzM0LDkgKzEzMzQsOSBAQAogCQlpcF92c19iaW5kX3BlKHN2YywgcGUpOwogCX0KIAotICBvdXRfdW5sb2NrOgorb3V0X3VubG9jazoKIAl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOwotICBvdXQ6CitvdXQ6CiAJaXBfdnNfc2NoZWR1bGVyX3B1dChvbGRfc2NoZWQpOwogCWlwX3ZzX3BlX3B1dChvbGRfcGUpOwogCXJldHVybiByZXQ7CkBAIC0xNDgzLDcgKzE0ODMsNyBAQAogICoJRGVsZXRlIHNlcnZpY2UgYnkge25ldG5zfSBpbiB0aGUgc2VydmljZSB0YWJsZS4KICAqCUNhbGxlZCBieSBfX2lwX3ZzX2NsZWFudXAoKQogICovCi12b2lkIF9faXBfdnNfc2VydmljZV9jbGVhbnVwKHN0cnVjdCBuZXQgKm5ldCkKK3ZvaWQgaXBfdnNfc2VydmljZV9uZXRfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJRW50ZXJGdW5jdGlvbigyKTsKIAkvKiBDaGVjayBmb3IgImZ1bGwiIGFkZHJlc3NlZCBlbnRyaWVzICovCkBAIC0xNjYyLDcgKzE2NjIsNyBAQAogLyoKICAqCUlQVlMgc3lzY3RsIHRhYmxlICh1bmRlciB0aGUgL3Byb2Mvc3lzL25ldC9pcHY0L3ZzLykKICAqCURvIG5vdCBjaGFuZ2Ugb3JkZXIgb3IgaW5zZXJ0IG5ldyBlbnRyaWVzIHdpdGhvdXQKLSAqCWFsaWduIHdpdGggbmV0bnMgaW5pdCBpbiBfX2lwX3ZzX2NvbnRyb2xfaW5pdCgpCisgKglhbGlnbiB3aXRoIG5ldG5zIGluaXQgaW4gaXBfdnNfY29udHJvbF9uZXRfaW5pdCgpCiAgKi8KIAogc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgdnNfdmFyc1tdID0gewpAQCAtMjQ2OSw3ICsyNDY5LDcgQEAKIAkJCWNvdW50Kys7CiAJCX0KIAl9Ci0gIG91dDoKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNzA3LDcgKzI3MDcsNyBAQAogCQlyZXQgPSAtRUlOVkFMOwogCX0KIAotICBvdXQ6CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZfX2lwX3ZzX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzU5NSw3ICszNTk1LDcgQEAKICAqIHBlciBuZXRucyBpbnRpdC9leGl0IGZ1bmMuCiAgKi8KICNpZmRlZiBDT05GSUdfU1lTQ1RMCi1pbnQgX19uZXRfaW5pdCBfX2lwX3ZzX2NvbnRyb2xfaW5pdF9zeXNjdGwoc3RydWN0IG5ldCAqbmV0KQoraW50IF9fbmV0X2luaXQgaXBfdnNfY29udHJvbF9uZXRfaW5pdF9zeXNjdGwoc3RydWN0IG5ldCAqbmV0KQogewogCWludCBpZHg7CiAJc3RydWN0IG5ldG5zX2lwdnMgKmlwdnMgPSBuZXRfaXB2cyhuZXQpOwpAQCAtMzY1NCw3ICszNjU0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX25ldF9pbml0IF9faXBfdnNfY29udHJvbF9jbGVhbnVwX3N5c2N0bChzdHJ1Y3QgbmV0ICpuZXQpCit2b2lkIF9fbmV0X2luaXQgaXBfdnNfY29udHJvbF9uZXRfY2xlYW51cF9zeXNjdGwoc3RydWN0IG5ldCAqbmV0KQogewogCXN0cnVjdCBuZXRuc19pcHZzICppcHZzID0gbmV0X2lwdnMobmV0KTsKIApAQCAtMzY2NSw4ICszNjY1LDggQEAKIAogI2Vsc2UKIAotaW50IF9fbmV0X2luaXQgX19pcF92c19jb250cm9sX2luaXRfc3lzY3RsKHN0cnVjdCBuZXQgKm5ldCkgeyByZXR1cm4gMDsgfQotdm9pZCBfX25ldF9pbml0IF9faXBfdnNfY29udHJvbF9jbGVhbnVwX3N5c2N0bChzdHJ1Y3QgbmV0ICpuZXQpIHsgfQoraW50IF9fbmV0X2luaXQgaXBfdnNfY29udHJvbF9uZXRfaW5pdF9zeXNjdGwoc3RydWN0IG5ldCAqbmV0KSB7IHJldHVybiAwOyB9Cit2b2lkIF9fbmV0X2luaXQgaXBfdnNfY29udHJvbF9uZXRfY2xlYW51cF9zeXNjdGwoc3RydWN0IG5ldCAqbmV0KSB7IH0KIAogI2VuZGlmCiAKQEAgLTM2NzQsNyArMzY3NCw3IEBACiAJLm5vdGlmaWVyX2NhbGwgPSBpcF92c19kc3RfZXZlbnQsCiB9OwogCi1pbnQgX19uZXRfaW5pdCBfX2lwX3ZzX2NvbnRyb2xfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCitpbnQgX19uZXRfaW5pdCBpcF92c19jb250cm9sX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlpbnQgaWR4OwogCXN0cnVjdCBuZXRuc19pcHZzICppcHZzID0gbmV0X2lwdnMobmV0KTsKQEAgLTM3MDIsNyArMzcwMiw3IEBACiAJcHJvY19uZXRfZm9wc19jcmVhdGUobmV0LCAiaXBfdnNfc3RhdHNfcGVyY3B1IiwgMCwKIAkJCSAgICAgJmlwX3ZzX3N0YXRzX3BlcmNwdV9mb3BzKTsKIAotCWlmIChfX2lwX3ZzX2NvbnRyb2xfaW5pdF9zeXNjdGwobmV0KSkKKwlpZiAoaXBfdnNfY29udHJvbF9uZXRfaW5pdF9zeXNjdGwobmV0KSkKIAkJZ290byBlcnI7CiAKIAlyZXR1cm4gMDsKQEAgLTM3MTIsMTMgKzM3MTIsMTMgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotdm9pZCBfX25ldF9leGl0IF9faXBfdnNfY29udHJvbF9jbGVhbnVwKHN0cnVjdCBuZXQgKm5ldCkKK3ZvaWQgX19uZXRfZXhpdCBpcF92c19jb250cm9sX25ldF9jbGVhbnVwKHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3QgbmV0bnNfaXB2cyAqaXB2cyA9IG5ldF9pcHZzKG5ldCk7CiAKIAlpcF92c190cmFzaF9jbGVhbnVwKG5ldCk7CiAJaXBfdnNfc3RvcF9lc3RpbWF0b3IobmV0LCAmaXB2cy0+dG90X3N0YXRzKTsKLQlfX2lwX3ZzX2NvbnRyb2xfY2xlYW51cF9zeXNjdGwobmV0KTsKKwlpcF92c19jb250cm9sX25ldF9jbGVhbnVwX3N5c2N0bChuZXQpOwogCXByb2NfbmV0X3JlbW92ZShuZXQsICJpcF92c19zdGF0c19wZXJjcHUiKTsKIAlwcm9jX25ldF9yZW1vdmUobmV0LCAiaXBfdnNfc3RhdHMiKTsKIAlwcm9jX25ldF9yZW1vdmUobmV0LCAiaXBfdnMiKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19lc3QuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19lc3QuYwppbmRleCA1MDhjY2U5Li4wZmFjNjAxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZXN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2VzdC5jCkBAIC0xOTIsNyArMTkyLDcgQEAKIAlkc3QtPm91dGJwcyA9IChlLT5vdXRicHMgKyAweEYpID4+IDU7CiB9CiAKLWludCBfX25ldF9pbml0IF9faXBfdnNfZXN0aW1hdG9yX2luaXQoc3RydWN0IG5ldCAqbmV0KQoraW50IF9fbmV0X2luaXQgaXBfdnNfZXN0aW1hdG9yX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3QgbmV0bnNfaXB2cyAqaXB2cyA9IG5ldF9pcHZzKG5ldCk7CiAKQEAgLTIwMywxNiArMjAzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX25ldF9leGl0IF9faXBfdnNfZXN0aW1hdG9yX2NsZWFudXAoc3RydWN0IG5ldCAqbmV0KQordm9pZCBfX25ldF9leGl0IGlwX3ZzX2VzdGltYXRvcl9uZXRfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJZGVsX3RpbWVyX3N5bmMoJm5ldF9pcHZzKG5ldCktPmVzdF90aW1lcik7CiB9Ci0KLWludCBfX2luaXQgaXBfdnNfZXN0aW1hdG9yX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBpcF92c19lc3RpbWF0b3JfY2xlYW51cCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Z0cC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Z0cC5jCmluZGV4IGFmNjM1NTMuLjQ0OTBhMzIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19mdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZnRwLmMKQEAgLTQ0LDggKzQ0LDggQEAKICNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KIAogCi0jZGVmaW5lIFNFUlZFUl9TVFJJTkcgIjIyNyBFbnRlcmluZyBQYXNzaXZlIE1vZGUgKCIKLSNkZWZpbmUgQ0xJRU5UX1NUUklORyAiUE9SVCAiCisjZGVmaW5lIFNFUlZFUl9TVFJJTkcgIjIyNyAiCisjZGVmaW5lIENMSUVOVF9TVFJJTkcgIlBPUlQiCiAKIAogLyoKQEAgLTc5LDE0ICs3OSwxNyBAQAogCiAvKgogICogR2V0IDxhZGRyLHBvcnQ+IGZyb20gdGhlIHN0cmluZyAieHh4Lnh4eC54eHgueHh4LHBwcCxwcHAiLCBzdGFydGVkCi0gKiB3aXRoIHRoZSAicGF0dGVybiIgYW5kIHRlcm1pbmF0ZWQgd2l0aCB0aGUgInRlcm0iIGNoYXJhY3Rlci4KKyAqIHdpdGggdGhlICJwYXR0ZXJuIiwgaWdub3JpbmcgYmVmb3JlICJza2lwIiBhbmQgdGVybWluYXRlZCB3aXRoCisgKiB0aGUgInRlcm0iIGNoYXJhY3Rlci4KICAqIDxhZGRyLHBvcnQ+IGlzIGluIG5ldHdvcmsgb3JkZXIuCiAgKi8KIHN0YXRpYyBpbnQgaXBfdnNfZnRwX2dldF9hZGRycG9ydChjaGFyICpkYXRhLCBjaGFyICpkYXRhX2xpbWl0LAotCQkJCSAgY29uc3QgY2hhciAqcGF0dGVybiwgc2l6ZV90IHBsZW4sIGNoYXIgdGVybSwKKwkJCQkgIGNvbnN0IGNoYXIgKnBhdHRlcm4sIHNpemVfdCBwbGVuLAorCQkJCSAgY2hhciBza2lwLCBjaGFyIHRlcm0sCiAJCQkJICBfX2JlMzIgKmFkZHIsIF9fYmUxNiAqcG9ydCwKIAkJCQkgIGNoYXIgKipzdGFydCwgY2hhciAqKmVuZCkKIHsKKwljaGFyICpzLCBjOwogCXVuc2lnbmVkIGNoYXIgcFs2XTsKIAlpbnQgaSA9IDA7CiAKQEAgLTEwMSwxOSArMTA0LDM4IEBACiAJaWYgKHN0cm5pY21wKGRhdGEsIHBhdHRlcm4sIHBsZW4pICE9IDApIHsKIAkJcmV0dXJuIDA7CiAJfQotCSpzdGFydCA9IGRhdGEgKyBwbGVuOworCXMgPSBkYXRhICsgcGxlbjsKKwlpZiAoc2tpcCkgeworCQlpbnQgZm91bmQgPSAwOwogCi0JZm9yIChkYXRhID0gKnN0YXJ0OyAqZGF0YSAhPSB0ZXJtOyBkYXRhKyspIHsKKwkJZm9yICg7OyBzKyspIHsKKwkJCWlmIChzID09IGRhdGFfbGltaXQpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKCFmb3VuZCkgeworCQkJCWlmICgqcyA9PSBza2lwKQorCQkJCQlmb3VuZCA9IDE7CisJCQl9IGVsc2UgaWYgKCpzICE9IHNraXApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoZGF0YSA9IHM7IDsgZGF0YSsrKSB7CiAJCWlmIChkYXRhID09IGRhdGFfbGltaXQpCiAJCQlyZXR1cm4gLTE7CisJCWlmICgqZGF0YSA9PSB0ZXJtKQorCQkJYnJlYWs7CiAJfQogCSplbmQgPSBkYXRhOwogCiAJbWVtc2V0KHAsIDAsIHNpemVvZihwKSk7Ci0JZm9yIChkYXRhID0gKnN0YXJ0OyBkYXRhICE9ICplbmQ7IGRhdGErKykgewotCQlpZiAoKmRhdGEgPj0gJzAnICYmICpkYXRhIDw9ICc5JykgewotCQkJcFtpXSA9IHBbaV0qMTAgKyAqZGF0YSAtICcwJzsKLQkJfSBlbHNlIGlmICgqZGF0YSA9PSAnLCcgJiYgaSA8IDUpIHsKKwlmb3IgKGRhdGEgPSBzOyA7IGRhdGErKykgeworCQljID0gKmRhdGE7CisJCWlmIChjID09IHRlcm0pCisJCQlicmVhazsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisJCQlwW2ldID0gcFtpXSoxMCArIGMgLSAnMCc7CisJCX0gZWxzZSBpZiAoYyA9PSAnLCcgJiYgaSA8IDUpIHsKIAkJCWkrKzsKIAkJfSBlbHNlIHsKIAkJCS8qIHVuZXhwZWN0ZWQgY2hhcmFjdGVyICovCkBAIC0xMjQsOCArMTQ2LDkgQEAKIAlpZiAoaSAhPSA1KQogCQlyZXR1cm4gLTE7CiAKLQkqYWRkciA9IGdldF91bmFsaWduZWQoKF9fYmUzMiAqKXApOwotCSpwb3J0ID0gZ2V0X3VuYWxpZ25lZCgoX19iZTE2ICopKHAgKyA0KSk7CisJKnN0YXJ0ID0gczsKKwkqYWRkciA9IGdldF91bmFsaWduZWQoKF9fYmUzMiAqKSBwKTsKKwkqcG9ydCA9IGdldF91bmFsaWduZWQoKF9fYmUxNiAqKSAocCArIDQpKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTg1LDcgKzIwOCw4IEBACiAKIAkJaWYgKGlwX3ZzX2Z0cF9nZXRfYWRkcnBvcnQoZGF0YSwgZGF0YV9saW1pdCwKIAkJCQkJICAgU0VSVkVSX1NUUklORywKLQkJCQkJICAgc2l6ZW9mKFNFUlZFUl9TVFJJTkcpLTEsICcpJywKKwkJCQkJICAgc2l6ZW9mKFNFUlZFUl9TVFJJTkcpLTEsCisJCQkJCSAgICcoJywgJyknLAogCQkJCQkgICAmZnJvbS5pcCwgJnBvcnQsCiAJCQkJCSAgICZzdGFydCwgJmVuZCkgIT0gMSkKIAkJCXJldHVybiAxOwpAQCAtMzQ1LDcgKzM2OSw3IEBACiAJICovCiAJaWYgKGlwX3ZzX2Z0cF9nZXRfYWRkcnBvcnQoZGF0YV9zdGFydCwgZGF0YV9saW1pdCwKIAkJCQkgICBDTElFTlRfU1RSSU5HLCBzaXplb2YoQ0xJRU5UX1NUUklORyktMSwKLQkJCQkgICAnXHInLCAmdG8uaXAsICZwb3J0LAorCQkJCSAgICcgJywgJ1xyJywgJnRvLmlwLCAmcG9ydCwKIAkJCQkgICAmc3RhcnQsICZlbmQpICE9IDEpCiAJCXJldHVybiAxOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG8uYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCmluZGV4IGViODYwMjguLjUyZDA3M2MgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCkBAIC0zMTYsNyArMzE2LDcgQEAKIC8qCiAgKiBwZXIgbmV0d29yayBuYW1lLXNwYWNlIGluaXQKICAqLwotaW50IF9fbmV0X2luaXQgX19pcF92c19wcm90b2NvbF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKK2ludCBfX25ldF9pbml0IGlwX3ZzX3Byb3RvY29sX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKICNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fVENQCiAJcmVnaXN0ZXJfaXBfdnNfcHJvdG9fbmV0bnMobmV0LCAmaXBfdnNfcHJvdG9jb2xfdGNwKTsKQEAgLTMzNiw3ICszMzYsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9fbmV0X2V4aXQgX19pcF92c19wcm90b2NvbF9jbGVhbnVwKHN0cnVjdCBuZXQgKm5ldCkKK3ZvaWQgX19uZXRfZXhpdCBpcF92c19wcm90b2NvbF9uZXRfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJc3RydWN0IG5ldG5zX2lwdnMgKmlwdnMgPSBuZXRfaXB2cyhuZXQpOwogCXN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zeW5jLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc3luYy5jCmluZGV4IGUyOTJlNWIuLjdlZTcyMTUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zeW5jLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3N5bmMuYwpAQCAtMTY2Myw3ICsxNjYzLDcgQEAKIC8qCiAgKiBJbml0aWFsaXplIGRhdGEgc3RydWN0IGZvciBlYWNoIG5ldG5zCiAgKi8KLWludCBfX25ldF9pbml0IF9faXBfdnNfc3luY19pbml0KHN0cnVjdCBuZXQgKm5ldCkKK2ludCBfX25ldF9pbml0IGlwX3ZzX3N5bmNfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQogewogCXN0cnVjdCBuZXRuc19pcHZzICppcHZzID0gbmV0X2lwdnMobmV0KTsKIApAQCAtMTY3Nyw3ICsxNjc3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2lwX3ZzX3N5bmNfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpCit2b2lkIGlwX3ZzX3N5bmNfbmV0X2NsZWFudXAoc3RydWN0IG5ldCAqbmV0KQogewogCWludCByZXRjOwogCkBAIC0xNjg5LDEyICsxNjg5LDMgQEAKIAlpZiAocmV0YyAmJiByZXRjICE9IC1FU1JDSCkKIAkJcHJfZXJyKCJGYWlsZWQgdG8gc3RvcCBCYWNrdXAgRGFlbW9uXG4iKTsKIH0KLQotaW50IF9faW5pdCBpcF92c19zeW5jX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBpcF92c19zeW5jX2NsZWFudXAodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwppbmRleCAyZTFjMTFmLi5mN2FmOGI4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCkBAIC04NTAsNyArODUwLDcgQEAKIAogCS8qIEl0IGV4aXN0czsgd2UgaGF2ZSAobm9uLWV4Y2x1c2l2ZSkgcmVmZXJlbmNlLiAqLwogCWlmIChORl9DVF9ESVJFQ1RJT04oaCkgPT0gSVBfQ1RfRElSX1JFUExZKSB7Ci0JCSpjdGluZm8gPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZOworCQkqY3RpbmZvID0gSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFk7CiAJCS8qIFBsZWFzZSBzZXQgcmVwbHkgYml0IGlmIHRoaXMgcGFja2V0IE9LICovCiAJCSpzZXRfcmVwbHkgPSAxOwogCX0gZWxzZSB7CkBAIC05MjIsNiArOTIyLDkgQEAKIAkJCXJldCA9IC1yZXQ7CiAJCQlnb3RvIG91dDsKIAkJfQorCQkvKiBJQ01QW3Y2XSBwcm90b2NvbCB0cmFja2VycyBtYXkgYXNzaWduIG9uZSBjb25udHJhY2suICovCisJCWlmIChza2ItPm5mY3QpCisJCQlnb3RvIG91dDsKIAl9CiAKIAljdCA9IHJlc29sdmVfbm9ybWFsX2N0KG5ldCwgdG1wbCwgc2tiLCBkYXRhb2ZmLCBwZiwgcHJvdG9udW0sCkBAIC0xMTQzLDcgKzExNDYsNyBAQAogCS8qIFRoaXMgSUNNUCBpcyBpbiByZXZlcnNlIGRpcmVjdGlvbiB0byB0aGUgcGFja2V0IHdoaWNoIGNhdXNlZCBpdCAqLwogCWN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CiAJaWYgKENUSU5GTzJESVIoY3RpbmZvKSA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpCi0JCWN0aW5mbyA9IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWTsKKwkJY3RpbmZvID0gSVBfQ1RfUkVMQVRFRF9SRVBMWTsKIAllbHNlCiAJCWN0aW5mbyA9IElQX0NUX1JFTEFURUQ7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKaW5kZXggZTE3Y2I3Yy4uNmY1ODAxZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKQEAgLTM2OCw3ICszNjgsNyBAQAogCiAJLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCiAJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJgotCSAgICBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgKyBJUF9DVF9JU19SRVBMWSkgeworCSAgICBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkpIHsKIAkJcHJfZGVidWcoImZ0cDogQ29ubnRyYWNraW5mbyA9ICV1XG4iLCBjdGluZm8pOwogCQlyZXR1cm4gTkZfQUNDRVBUOwogCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfbWFpbi5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKaW5kZXggMThiMmNlNS4uZjAzYzJkNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKQEAgLTU3MSwxMCArNTcxLDkgQEAKIAlpbnQgcmV0OwogCiAJLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCi0JaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJgotCSAgICBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgKyBJUF9DVF9JU19SRVBMWSkgeworCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEX1JFUExZKQogCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KKwogCXByX2RlYnVnKCJuZl9jdF9oMjQ1OiBza2JsZW4gPSAldVxuIiwgc2tiLT5sZW4pOwogCiAJc3Bpbl9sb2NrX2JoKCZuZl9oMzIzX2xvY2spOwpAQCAtMTEyNSwxMCArMTEyNCw5IEBACiAJaW50IHJldDsKIAogCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLwotCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYKLQkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFkpIHsKKwlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKLQl9CisKIAlwcl9kZWJ1ZygibmZfY3RfcTkzMTogc2tibGVuID0gJXVcbiIsIHNrYi0+bGVuKTsKIAogCXNwaW5fbG9ja19iaCgmbmZfaDMyM19sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2lyYy5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaXJjLmMKaW5kZXggYjM5NGFhMy4uNGY5MzkwYiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaXJjLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaXJjLmMKQEAgLTEyNSw4ICsxMjUsNyBAQAogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCi0JaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJgotCSAgICBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgKyBJUF9DVF9JU19SRVBMWSkKKwlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCS8qIE5vdCBhIGZ1bGwgdGNwIGhlYWRlcj8gKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYwppbmRleCA0ODJlOTBjLi43ZGVjODhhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCkBAIC05NzAsNyArOTcwLDcgQEAKIAogCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkKIAkJcmV0dXJuIG5ldGxpbmtfZHVtcF9zdGFydChjdG5sLCBza2IsIG5saCwgY3RuZXRsaW5rX2R1bXBfdGFibGUsCi0JCQkJCSAgY3RuZXRsaW5rX2RvbmUpOworCQkJCQkgIGN0bmV0bGlua19kb25lLCAwKTsKIAogCWVyciA9IGN0bmV0bGlua19wYXJzZV96b25lKGNkYVtDVEFfWk9ORV0sICZ6b25lKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTE4NDAsNyArMTg0MCw3IEBACiAJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKSB7CiAJCXJldHVybiBuZXRsaW5rX2R1bXBfc3RhcnQoY3RubCwgc2tiLCBubGgsCiAJCQkJCSAgY3RuZXRsaW5rX2V4cF9kdW1wX3RhYmxlLAotCQkJCQkgIGN0bmV0bGlua19leHBfZG9uZSk7CisJCQkJCSAgY3RuZXRsaW5rX2V4cF9kb25lLCAwKTsKIAl9CiAKIAllcnIgPSBjdG5ldGxpbmtfcGFyc2Vfem9uZShjZGFbQ1RBX0VYUEVDVF9aT05FXSwgJnpvbmUpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jCmluZGV4IDA4ODk0NDguLjJmZDQ1NjUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMKQEAgLTUxOSw4ICs1MTksNyBAQAogCXVfaW50MTZfdCBtc2c7CiAKIAkvKiBkb24ndCBkbyBhbnkgdHJhY2tpbmcgYmVmb3JlIHRjcCBoYW5kc2hha2UgY29tcGxldGUgKi8KLQlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCi0JICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKQorCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEX1JFUExZKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJbmV4dGhkcl9vZmYgPSBwcm90b2ZmOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5jCmluZGV4IGQ5ZTI3NzMuLjg1MDE4MjMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NhbmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zYW5lLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAljdF9zYW5lX2luZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9zYW5lX2luZm87CiAJLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCiAJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJgotCSAgICBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQrSVBfQ1RfSVNfUkVQTFkpCisJICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCS8qIE5vdCBhIGZ1bGwgdGNwIGhlYWRlcj8gKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMKaW5kZXggY2I1YTI4NS4uOTNmYWY2YSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMKQEAgLTE0MjMsNyArMTQyMyw3IEBACiAJdHlwZW9mKG5mX25hdF9zaXBfc2VxX2FkanVzdF9ob29rKSBuZl9uYXRfc2lwX3NlcV9hZGp1c3Q7CiAKIAlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCi0JICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKQorCSAgICBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAkvKiBObyBEYXRhID8gKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGluay5jCmluZGV4IGI0YTQ1MzIuLjE5MDU5NzYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmsuYwpAQCAtMzcsNyArMzcsNyBAQAogCiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIG5mdmVyc2lvbltdID0gIjAuMzAiOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5mbmV0bGlua19zdWJzeXN0ZW0gKnN1YnN5c190YWJsZVtORk5MX1NVQlNZU19DT1VOVF07CitzdGF0aWMgY29uc3Qgc3RydWN0IG5mbmV0bGlua19zdWJzeXN0ZW0gX19yY3UgKnN1YnN5c190YWJsZVtORk5MX1NVQlNZU19DT1VOVF07CiBzdGF0aWMgREVGSU5FX01VVEVYKG5mbmxfbXV0ZXgpOwogCiB2b2lkIG5mbmxfbG9jayh2b2lkKQpAQCAtNTksNyArNTksNyBAQAogCQluZm5sX3VubG9jaygpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KLQlzdWJzeXNfdGFibGVbbi0+c3Vic3lzX2lkXSA9IG47CisJcmN1X2Fzc2lnbl9wb2ludGVyKHN1YnN5c190YWJsZVtuLT5zdWJzeXNfaWRdLCBuKTsKIAluZm5sX3VubG9jaygpOwogCiAJcmV0dXJuIDA7CkBAIC03MSw3ICs3MSw3IEBACiAJbmZubF9sb2NrKCk7CiAJc3Vic3lzX3RhYmxlW24tPnN1YnN5c19pZF0gPSBOVUxMOwogCW5mbmxfdW5sb2NrKCk7Ci0KKwlzeW5jaHJvbml6ZV9yY3UoKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mbmV0bGlua19zdWJzeXNfdW5yZWdpc3Rlcik7CkBAIC04Myw3ICs4Myw3IEBACiAJaWYgKHN1YnN5c19pZCA+PSBORk5MX1NVQlNZU19DT1VOVCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gc3Vic3lzX3RhYmxlW3N1YnN5c19pZF07CisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZShzdWJzeXNfdGFibGVbc3Vic3lzX2lkXSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IG5mbmxfY2FsbGJhY2sgKgpAQCAtMTM5LDIxICsxMzksMjcgQEAKIAogCXR5cGUgPSBubGgtPm5sbXNnX3R5cGU7CiByZXBsYXk6CisJcmN1X3JlYWRfbG9jaygpOwogCXNzID0gbmZuZXRsaW5rX2dldF9zdWJzeXModHlwZSk7CiAJaWYgKCFzcykgewogI2lmZGVmIENPTkZJR19NT0RVTEVTCi0JCW5mbmxfdW5sb2NrKCk7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXF1ZXN0X21vZHVsZSgibmZuZXRsaW5rLXN1YnN5cy0lZCIsIE5GTkxfU1VCU1lTX0lEKHR5cGUpKTsKLQkJbmZubF9sb2NrKCk7CisJCXJjdV9yZWFkX2xvY2soKTsKIAkJc3MgPSBuZm5ldGxpbmtfZ2V0X3N1YnN5cyh0eXBlKTsKIAkJaWYgKCFzcykKICNlbmRpZgorCQl7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCiAJbmMgPSBuZm5ldGxpbmtfZmluZF9jbGllbnQodHlwZSwgc3MpOwotCWlmICghbmMpCisJaWYgKCFuYykgeworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJewogCQlpbnQgbWluX2xlbiA9IE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgbmZnZW5tc2cpKTsKQEAgLTE2Nyw3ICsxNzMsMjMgQEAKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCi0JCWVyciA9IG5jLT5jYWxsKG5ldC0+bmZubCwgc2tiLCBubGgsIChjb25zdCBzdHJ1Y3QgbmxhdHRyICoqKWNkYSk7CisJCWlmIChuYy0+Y2FsbF9yY3UpIHsKKwkJCWVyciA9IG5jLT5jYWxsX3JjdShuZXQtPm5mbmwsIHNrYiwgbmxoLAorCQkJCQkgICAoY29uc3Qgc3RydWN0IG5sYXR0ciAqKiljZGEpOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCX0gZWxzZSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCW5mbmxfbG9jaygpOworCQkJaWYgKHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoCisJCQkJCXN1YnN5c190YWJsZVtORk5MX1NVQlNZU19JRCh0eXBlKV0sCisJCQkJCWxvY2tkZXBfaXNfaGVsZCgmbmZubF9tdXRleCkpICE9IHNzIHx8CisJCQkgICAgbmZuZXRsaW5rX2ZpbmRfY2xpZW50KHR5cGUsIHNzKSAhPSBuYykKKwkJCQllcnIgPSAtRUFHQUlOOworCQkJZWxzZQorCQkJCWVyciA9IG5jLT5jYWxsKG5ldC0+bmZubCwgc2tiLCBubGgsCisJCQkJCQkgICAoY29uc3Qgc3RydWN0IG5sYXR0ciAqKiljZGEpOworCQkJbmZubF91bmxvY2soKTsKKwkJfQogCQlpZiAoZXJyID09IC1FQUdBSU4pCiAJCQlnb3RvIHJlcGxheTsKIAkJcmV0dXJuIGVycjsKQEAgLTE3Niw5ICsxOTgsNyBAQAogCiBzdGF0aWMgdm9pZCBuZm5ldGxpbmtfcmN2KHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JbmZubF9sb2NrKCk7CiAJbmV0bGlua19yY3Zfc2tiKHNrYiwgJm5mbmV0bGlua19yY3ZfbXNnKTsKLQluZm5sX3VubG9jaygpOwogfQogCiBzdGF0aWMgaW50IF9fbmV0X2luaXQgbmZuZXRsaW5rX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKaW5kZXggZTBlZTAxMC4uMmU3Y2NiYiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKQEAgLTQ1Niw3ICs0NTYsOCBAQAogCWlmIChza2ItPm1hcmspCiAJCU5MQV9QVVRfQkUzMihpbnN0LT5za2IsIE5GVUxBX01BUkssIGh0b25sKHNrYi0+bWFyaykpOwogCi0JaWYgKGluZGV2ICYmIHNrYi0+ZGV2KSB7CisJaWYgKGluZGV2ICYmIHNrYi0+ZGV2ICYmCisJICAgIHNrYi0+bWFjX2hlYWRlciAhPSBza2ItPm5ldHdvcmtfaGVhZGVyKSB7CiAJCXN0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF9odyBwaHc7CiAJCWludCBsZW4gPSBkZXZfcGFyc2VfaGVhZGVyKHNrYiwgcGh3Lmh3X2FkZHIpOwogCQlpZiAobGVuID4gMCkgewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKaW5kZXggYjgzMTIzZi4uNDkxMzJiZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCkBAIC01OCw3ICs1OCw3IEBACiAgKi8KIAlzcGlubG9ja190CWxvY2s7CiAJdW5zaWduZWQgaW50CXF1ZXVlX3RvdGFsOwotCWF0b21pY190CWlkX3NlcXVlbmNlOwkJLyogJ3NlcXVlbmNlJyBvZiBwa3QgaWRzICovCisJdW5zaWduZWQgaW50CWlkX3NlcXVlbmNlOwkJLyogJ3NlcXVlbmNlJyBvZiBwa3QgaWRzICovCiAJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZV9saXN0OwkJLyogcGFja2V0cyBpbiBxdWV1ZSAqLwogfTsKIApAQCAtMTcxLDYgKzE3MSwxMyBAQAogICAgICAgIHF1ZXVlLT5xdWV1ZV90b3RhbCsrOwogfQogCitzdGF0aWMgdm9pZAorX19kZXF1ZXVlX2VudHJ5KHN0cnVjdCBuZnFubF9pbnN0YW5jZSAqcXVldWUsIHN0cnVjdCBuZl9xdWV1ZV9lbnRyeSAqZW50cnkpCit7CisJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwlxdWV1ZS0+cXVldWVfdG90YWwtLTsKK30KKwogc3RhdGljIHN0cnVjdCBuZl9xdWV1ZV9lbnRyeSAqCiBmaW5kX2RlcXVldWVfZW50cnkoc3RydWN0IG5mcW5sX2luc3RhbmNlICpxdWV1ZSwgdW5zaWduZWQgaW50IGlkKQogewpAQCAtMTg1LDEwICsxOTIsOCBAQAogCQl9CiAJfQogCi0JaWYgKGVudHJ5KSB7Ci0JCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0JCXF1ZXVlLT5xdWV1ZV90b3RhbC0tOwotCX0KKwlpZiAoZW50cnkpCisJCV9fZGVxdWV1ZV9lbnRyeShxdWV1ZSwgZW50cnkpOwogCiAJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKIApAQCAtMjEzLDEzICsyMTgsMTUgQEAKIAogc3RhdGljIHN0cnVjdCBza19idWZmICoKIG5mcW5sX2J1aWxkX3BhY2tldF9tZXNzYWdlKHN0cnVjdCBuZnFubF9pbnN0YW5jZSAqcXVldWUsCi0JCQkgICBzdHJ1Y3QgbmZfcXVldWVfZW50cnkgKmVudHJ5KQorCQkJICAgc3RydWN0IG5mX3F1ZXVlX2VudHJ5ICplbnRyeSwKKwkJCSAgIF9fYmUzMiAqKnBhY2tldF9pZF9wdHIpCiB7CiAJc2tfYnVmZl9kYXRhX3Qgb2xkX3RhaWw7CiAJc2l6ZV90IHNpemU7CiAJc2l6ZV90IGRhdGFfbGVuID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBuZnFubF9tc2dfcGFja2V0X2hkciBwbXNnOworCXN0cnVjdCBubGF0dHIgKm5sYTsKKwlzdHJ1Y3QgbmZxbmxfbXNnX3BhY2tldF9oZHIgKnBtc2c7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IG5mZ2VubXNnICpuZm1zZzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqZW50c2tiID0gZW50cnktPnNrYjsKQEAgLTI3MiwxMiArMjc5LDExIEBACiAJbmZtc2ctPnZlcnNpb24gPSBORk5FVExJTktfVjA7CiAJbmZtc2ctPnJlc19pZCA9IGh0b25zKHF1ZXVlLT5xdWV1ZV9udW0pOwogCi0JZW50cnktPmlkID0gYXRvbWljX2luY19yZXR1cm4oJnF1ZXVlLT5pZF9zZXF1ZW5jZSk7Ci0JcG1zZy5wYWNrZXRfaWQgCQk9IGh0b25sKGVudHJ5LT5pZCk7Ci0JcG1zZy5od19wcm90b2NvbAk9IGVudHNrYi0+cHJvdG9jb2w7Ci0JcG1zZy5ob29rCQk9IGVudHJ5LT5ob29rOwotCi0JTkxBX1BVVChza2IsIE5GUUFfUEFDS0VUX0hEUiwgc2l6ZW9mKHBtc2cpLCAmcG1zZyk7CisJbmxhID0gX19ubGFfcmVzZXJ2ZShza2IsIE5GUUFfUEFDS0VUX0hEUiwgc2l6ZW9mKCpwbXNnKSk7CisJcG1zZyA9IG5sYV9kYXRhKG5sYSk7CisJcG1zZy0+aHdfcHJvdG9jb2wJPSBlbnRza2ItPnByb3RvY29sOworCXBtc2ctPmhvb2sJCT0gZW50cnktPmhvb2s7CisJKnBhY2tldF9pZF9wdHIJCT0gJnBtc2ctPnBhY2tldF9pZDsKIAogCWluZGV2ID0gZW50cnktPmluZGV2OwogCWlmIChpbmRldikgewpAQCAtMzM1LDcgKzM0MSw4IEBACiAJaWYgKGVudHNrYi0+bWFyaykKIAkJTkxBX1BVVF9CRTMyKHNrYiwgTkZRQV9NQVJLLCBodG9ubChlbnRza2ItPm1hcmspKTsKIAotCWlmIChpbmRldiAmJiBlbnRza2ItPmRldikgeworCWlmIChpbmRldiAmJiBlbnRza2ItPmRldiAmJgorCSAgICBlbnRza2ItPm1hY19oZWFkZXIgIT0gZW50c2tiLT5uZXR3b3JrX2hlYWRlcikgewogCQlzdHJ1Y3QgbmZxbmxfbXNnX3BhY2tldF9odyBwaHc7CiAJCWludCBsZW4gPSBkZXZfcGFyc2VfaGVhZGVyKGVudHNrYiwgcGh3Lmh3X2FkZHIpOwogCQlpZiAobGVuKSB7CkBAIC0zODgsNiArMzk1LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAlzdHJ1Y3QgbmZxbmxfaW5zdGFuY2UgKnF1ZXVlOwogCWludCBlcnIgPSAtRU5PQlVGUzsKKwlfX2JlMzIgKnBhY2tldF9pZF9wdHI7CiAKIAkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3coKSAqLwogCXF1ZXVlID0gaW5zdGFuY2VfbG9va3VwKHF1ZXVlbnVtKTsKQEAgLTQwMSw3ICs0MDksNyBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JbnNrYiA9IG5mcW5sX2J1aWxkX3BhY2tldF9tZXNzYWdlKHF1ZXVlLCBlbnRyeSk7CisJbnNrYiA9IG5mcW5sX2J1aWxkX3BhY2tldF9tZXNzYWdlKHF1ZXVlLCBlbnRyeSwgJnBhY2tldF9pZF9wdHIpOwogCWlmIChuc2tiID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0OwpAQCAtNDIwLDYgKzQyOCw4IEBACiAJCQkJIHF1ZXVlLT5xdWV1ZV90b3RhbCk7CiAJCWdvdG8gZXJyX291dF9mcmVlX25za2I7CiAJfQorCWVudHJ5LT5pZCA9ICsrcXVldWUtPmlkX3NlcXVlbmNlOworCSpwYWNrZXRfaWRfcHRyID0gaHRvbmwoZW50cnktPmlkKTsKIAogCS8qIG5mbmV0bGlua191bmljYXN0IHdpbGwgZWl0aGVyIGZyZWUgdGhlIG5za2Igb3IgYWRkIGl0IHRvIGEgc29ja2V0ICovCiAJZXJyID0gbmZuZXRsaW5rX3VuaWNhc3QobnNrYiwgJmluaXRfbmV0LCBxdWV1ZS0+cGVlcl9waWQsIE1TR19ET05UV0FJVCk7CkBAIC02MDcsNiArNjE3LDkyIEBACiAJW05GUUFfUEFZTE9BRF0JCT0geyAudHlwZSA9IE5MQV9VTlNQRUMgfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnFhX3ZlcmRpY3RfYmF0Y2hfcG9saWN5W05GUUFfTUFYKzFdID0geworCVtORlFBX1ZFUkRJQ1RfSERSXQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgbmZxbmxfbXNnX3ZlcmRpY3RfaGRyKSB9LAorCVtORlFBX01BUktdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCit9OworCitzdGF0aWMgc3RydWN0IG5mcW5sX2luc3RhbmNlICp2ZXJkaWN0X2luc3RhbmNlX2xvb2t1cCh1MTYgcXVldWVfbnVtLCBpbnQgbmxwaWQpCit7CisJc3RydWN0IG5mcW5sX2luc3RhbmNlICpxdWV1ZTsKKworCXF1ZXVlID0gaW5zdGFuY2VfbG9va3VwKHF1ZXVlX251bSk7CisJaWYgKCFxdWV1ZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlpZiAocXVldWUtPnBlZXJfcGlkICE9IG5scGlkKQorCQlyZXR1cm4gRVJSX1BUUigtRVBFUk0pOworCisJcmV0dXJuIHF1ZXVlOworfQorCitzdGF0aWMgc3RydWN0IG5mcW5sX21zZ192ZXJkaWN0X2hkcioKK3ZlcmRpY3RoZHJfZ2V0KGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBuZnFhW10pCit7CisJc3RydWN0IG5mcW5sX21zZ192ZXJkaWN0X2hkciAqdmhkcjsKKwl1bnNpZ25lZCBpbnQgdmVyZGljdDsKKworCWlmICghbmZxYVtORlFBX1ZFUkRJQ1RfSERSXSkKKwkJcmV0dXJuIE5VTEw7CisKKwl2aGRyID0gbmxhX2RhdGEobmZxYVtORlFBX1ZFUkRJQ1RfSERSXSk7CisJdmVyZGljdCA9IG50b2hsKHZoZHItPnZlcmRpY3QpOworCWlmICgodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgPiBORl9NQVhfVkVSRElDVCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHZoZHI7Cit9CisKK3N0YXRpYyBpbnQgbmZxX2lkX2FmdGVyKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IG1heCkKK3sKKwlyZXR1cm4gKGludCkoaWQgLSBtYXgpID4gMDsKK30KKworc3RhdGljIGludAorbmZxbmxfcmVjdl92ZXJkaWN0X2JhdGNoKHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5mcWFbXSkKK3sKKwlzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCBuZl9xdWV1ZV9lbnRyeSAqZW50cnksICp0bXA7CisJdW5zaWduZWQgaW50IHZlcmRpY3QsIG1heGlkOworCXN0cnVjdCBuZnFubF9tc2dfdmVyZGljdF9oZHIgKnZoZHI7CisJc3RydWN0IG5mcW5sX2luc3RhbmNlICpxdWV1ZTsKKwlMSVNUX0hFQUQoYmF0Y2hfbGlzdCk7CisJdTE2IHF1ZXVlX251bSA9IG50b2hzKG5mbXNnLT5yZXNfaWQpOworCisJcXVldWUgPSB2ZXJkaWN0X2luc3RhbmNlX2xvb2t1cChxdWV1ZV9udW0sIE5FVExJTktfQ0Ioc2tiKS5waWQpOworCWlmIChJU19FUlIocXVldWUpKQorCQlyZXR1cm4gUFRSX0VSUihxdWV1ZSk7CisKKwl2aGRyID0gdmVyZGljdGhkcl9nZXQobmZxYSk7CisJaWYgKCF2aGRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZlcmRpY3QgPSBudG9obCh2aGRyLT52ZXJkaWN0KTsKKwltYXhpZCA9IG50b2hsKHZoZHItPmlkKTsKKworCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCB0bXAsICZxdWV1ZS0+cXVldWVfbGlzdCwgbGlzdCkgeworCQlpZiAobmZxX2lkX2FmdGVyKGVudHJ5LT5pZCwgbWF4aWQpKQorCQkJYnJlYWs7CisJCV9fZGVxdWV1ZV9lbnRyeShxdWV1ZSwgZW50cnkpOworCQlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgJmJhdGNoX2xpc3QpOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CisKKwlpZiAobGlzdF9lbXB0eSgmYmF0Y2hfbGlzdCkpCisJCXJldHVybiAtRU5PRU5UOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCB0bXAsICZiYXRjaF9saXN0LCBsaXN0KSB7CisJCWlmIChuZnFhW05GUUFfTUFSS10pCisJCQllbnRyeS0+c2tiLT5tYXJrID0gbnRvaGwobmxhX2dldF9iZTMyKG5mcWFbTkZRQV9NQVJLXSkpOworCQluZl9yZWluamVjdChlbnRyeSwgdmVyZGljdCk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50CiBuZnFubF9yZWN2X3ZlcmRpY3Qoc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLApAQCAtNjE5LDM5ICs3MTUsMjMgQEAKIAlzdHJ1Y3QgbmZxbmxfaW5zdGFuY2UgKnF1ZXVlOwogCXVuc2lnbmVkIGludCB2ZXJkaWN0OwogCXN0cnVjdCBuZl9xdWV1ZV9lbnRyeSAqZW50cnk7Ci0JaW50IGVycjsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlxdWV1ZSA9IGluc3RhbmNlX2xvb2t1cChxdWV1ZV9udW0pOwotCWlmICghcXVldWUpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBlcnJfb3V0X3VubG9jazsKLQl9CisJaWYgKCFxdWV1ZSkKIAotCWlmIChxdWV1ZS0+cGVlcl9waWQgIT0gTkVUTElOS19DQihza2IpLnBpZCkgewotCQllcnIgPSAtRVBFUk07Ci0JCWdvdG8gZXJyX291dF91bmxvY2s7Ci0JfQorCXF1ZXVlID0gdmVyZGljdF9pbnN0YW5jZV9sb29rdXAocXVldWVfbnVtLCBORVRMSU5LX0NCKHNrYikucGlkKTsKKwlpZiAoSVNfRVJSKHF1ZXVlKSkKKwkJcmV0dXJuIFBUUl9FUlIocXVldWUpOwogCi0JaWYgKCFuZnFhW05GUUFfVkVSRElDVF9IRFJdKSB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX291dF91bmxvY2s7Ci0JfQorCXZoZHIgPSB2ZXJkaWN0aGRyX2dldChuZnFhKTsKKwlpZiAoIXZoZHIpCisJCXJldHVybiAtRUlOVkFMOwogCi0JdmhkciA9IG5sYV9kYXRhKG5mcWFbTkZRQV9WRVJESUNUX0hEUl0pOwogCXZlcmRpY3QgPSBudG9obCh2aGRyLT52ZXJkaWN0KTsKIAotCWlmICgodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgPiBORl9NQVhfVkVSRElDVCkgewotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9vdXRfdW5sb2NrOwotCX0KLQogCWVudHJ5ID0gZmluZF9kZXF1ZXVlX2VudHJ5KHF1ZXVlLCBudG9obCh2aGRyLT5pZCkpOwotCWlmIChlbnRyeSA9PSBOVUxMKSB7Ci0JCWVyciA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyX291dF91bmxvY2s7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOworCWlmIChlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogCWlmIChuZnFhW05GUUFfUEFZTE9BRF0pIHsKIAkJaWYgKG5mcW5sX21hbmdsZShubGFfZGF0YShuZnFhW05GUUFfUEFZTE9BRF0pLApAQCAtNjY0LDEwICs3NDQsNiBAQAogCiAJbmZfcmVpbmplY3QoZW50cnksIHZlcmRpY3QpOwogCXJldHVybiAwOwotCi1lcnJfb3V0X3VubG9jazoKLQlyY3VfcmVhZF91bmxvY2soKTsKLQlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50CkBAIC03ODAsMTQgKzg1NiwxNyBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5mbmxfY2FsbGJhY2sgbmZxbmxfY2JbTkZRTkxfTVNHX01BWF0gPSB7Ci0JW05GUU5MX01TR19QQUNLRVRdCT0geyAuY2FsbCA9IG5mcW5sX3JlY3ZfdW5zdXBwLAorCVtORlFOTF9NU0dfUEFDS0VUXQk9IHsgLmNhbGxfcmN1ID0gbmZxbmxfcmVjdl91bnN1cHAsCiAJCQkJICAgIC5hdHRyX2NvdW50ID0gTkZRQV9NQVgsIH0sCi0JW05GUU5MX01TR19WRVJESUNUXQk9IHsgLmNhbGwgPSBuZnFubF9yZWN2X3ZlcmRpY3QsCisJW05GUU5MX01TR19WRVJESUNUXQk9IHsgLmNhbGxfcmN1ID0gbmZxbmxfcmVjdl92ZXJkaWN0LAogCQkJCSAgICAuYXR0cl9jb3VudCA9IE5GUUFfTUFYLAogCQkJCSAgICAucG9saWN5ID0gbmZxYV92ZXJkaWN0X3BvbGljeSB9LAogCVtORlFOTF9NU0dfQ09ORklHXQk9IHsgLmNhbGwgPSBuZnFubF9yZWN2X2NvbmZpZywKIAkJCQkgICAgLmF0dHJfY291bnQgPSBORlFBX0NGR19NQVgsCiAJCQkJICAgIC5wb2xpY3kgPSBuZnFhX2NmZ19wb2xpY3kgfSwKKwlbTkZRTkxfTVNHX1ZFUkRJQ1RfQkFUQ0hdPXsgLmNhbGxfcmN1ID0gbmZxbmxfcmVjdl92ZXJkaWN0X2JhdGNoLAorCQkJCSAgICAuYXR0cl9jb3VudCA9IE5GUUFfTUFYLAorCQkJCSAgICAucG9saWN5ID0gbmZxYV92ZXJkaWN0X2JhdGNoX3BvbGljeSB9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZm5ldGxpbmtfc3Vic3lzdGVtIG5mcW5sX3N1YnN5cyA9IHsKQEAgLTg2OSw3ICs5NDgsNyBAQAogCQkJICBpbnN0LT5wZWVyX3BpZCwgaW5zdC0+cXVldWVfdG90YWwsCiAJCQkgIGluc3QtPmNvcHlfbW9kZSwgaW5zdC0+Y29weV9yYW5nZSwKIAkJCSAgaW5zdC0+cXVldWVfZHJvcHBlZCwgaW5zdC0+cXVldWVfdXNlcl9kcm9wcGVkLAotCQkJICBhdG9taWNfcmVhZCgmaW5zdC0+aWRfc2VxdWVuY2UpLCAxKTsKKwkJCSAgaW5zdC0+aWRfc2VxdWVuY2UsIDEpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIG5mcW5sX3NlcV9vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0FVRElULmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0FVRElULmMKaW5kZXggMzYzYTk5ZS4uNGJjYTE1YSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9BVURJVC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQVVESVQuYwpAQCAtMTYzLDYgKzE2MywxMSBAQAogCQlicmVhazsKIAl9CiAKKyNpZmRlZiBDT05GSUdfTkVUV09SS19TRUNNQVJLCisJaWYgKHNrYi0+c2VjbWFyaykKKwkJYXVkaXRfbG9nX3NlY2N0eChhYiwgc2tiLT5zZWNtYXJrKTsKKyNlbmRpZgorCiAJYXVkaXRfbG9nX2VuZChhYik7CiAKIGVycm91dDoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfQ1QuYyBiL25ldC9uZXRmaWx0ZXIveHRfQ1QuYwppbmRleCA3ODJlNTE5Li4wMjIxZDEwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X0NULmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9DVC5jCkBAIC01LDcgKzUsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTk1LDggKzk1LDExIEBACiAJaWYgKGluZm8tPmhlbHBlclswXSkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlwcm90byA9IHh0X2N0X2ZpbmRfcHJvdG8ocGFyKTsKLQkJaWYgKCFwcm90bykKKwkJaWYgKCFwcm90bykgeworCQkJcHJfaW5mbygiWW91IG11c3Qgc3BlY2lmeSBhIEw0IHByb3RvY29sLCAiCisJCQkJImFuZCBub3QgdXNlIGludmVyc2lvbnMgb24gaXQuXG4iKTsKIAkJCWdvdG8gZXJyMzsKKwkJfQogCiAJCXJldCA9IC1FTk9NRU07CiAJCWhlbHAgPSBuZl9jdF9oZWxwZXJfZXh0X2FkZChjdCwgR0ZQX0tFUk5FTCk7CkBAIC0xMDcsOCArMTEwLDEwIEBACiAJCWhlbHAtPmhlbHBlciA9IG5mX2Nvbm50cmFja19oZWxwZXJfdHJ5X21vZHVsZV9nZXQoaW5mby0+aGVscGVyLAogCQkJCQkJCQkgIHBhci0+ZmFtaWx5LAogCQkJCQkJCQkgIHByb3RvKTsKLQkJaWYgKGhlbHAtPmhlbHBlciA9PSBOVUxMKQorCQlpZiAoaGVscC0+aGVscGVyID09IE5VTEwpIHsKKwkJCXByX2luZm8oIk5vIHN1Y2ggaGVscGVyIFwiJXNcIlxuIiwgaW5mby0+aGVscGVyKTsKIAkJCWdvdG8gZXJyMzsKKwkJfQogCX0KIAogCV9fc2V0X2JpdChJUFNfVEVNUExBVEVfQklULCAmY3QtPnN0YXR1cyk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0hMLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0hMLmMKaW5kZXggOTViMDg0ODAuLjE1MzVlODcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfSEwuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0hMLmMKQEAgLTM4LDIyICszOCwyMiBAQAogCWlwaCA9IGlwX2hkcihza2IpOwogCiAJc3dpdGNoIChpbmZvLT5tb2RlKSB7Ci0JCWNhc2UgSVBUX1RUTF9TRVQ6Ci0JCQluZXdfdHRsID0gaW5mby0+dHRsOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX1RUTF9JTkM6Ci0JCQluZXdfdHRsID0gaXBoLT50dGwgKyBpbmZvLT50dGw7Ci0JCQlpZiAobmV3X3R0bCA+IDI1NSkKLQkJCQluZXdfdHRsID0gMjU1OwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX1RUTF9ERUM6Ci0JCQluZXdfdHRsID0gaXBoLT50dGwgLSBpbmZvLT50dGw7Ci0JCQlpZiAobmV3X3R0bCA8IDApCi0JCQkJbmV3X3R0bCA9IDA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCW5ld190dGwgPSBpcGgtPnR0bDsKLQkJCWJyZWFrOworCWNhc2UgSVBUX1RUTF9TRVQ6CisJCW5ld190dGwgPSBpbmZvLT50dGw7CisJCWJyZWFrOworCWNhc2UgSVBUX1RUTF9JTkM6CisJCW5ld190dGwgPSBpcGgtPnR0bCArIGluZm8tPnR0bDsKKwkJaWYgKG5ld190dGwgPiAyNTUpCisJCQluZXdfdHRsID0gMjU1OworCQlicmVhazsKKwljYXNlIElQVF9UVExfREVDOgorCQluZXdfdHRsID0gaXBoLT50dGwgLSBpbmZvLT50dGw7CisJCWlmIChuZXdfdHRsIDwgMCkKKwkJCW5ld190dGwgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluZXdfdHRsID0gaXBoLT50dGw7CisJCWJyZWFrOwogCX0KIAogCWlmIChuZXdfdHRsICE9IGlwaC0+dHRsKSB7CkBAIC03OCwyMiArNzgsMjIgQEAKIAlpcDZoID0gaXB2Nl9oZHIoc2tiKTsKIAogCXN3aXRjaCAoaW5mby0+bW9kZSkgewotCQljYXNlIElQNlRfSExfU0VUOgotCQkJbmV3X2hsID0gaW5mby0+aG9wX2xpbWl0OwotCQkJYnJlYWs7Ci0JCWNhc2UgSVA2VF9ITF9JTkM6Ci0JCQluZXdfaGwgPSBpcDZoLT5ob3BfbGltaXQgKyBpbmZvLT5ob3BfbGltaXQ7Ci0JCQlpZiAobmV3X2hsID4gMjU1KQotCQkJCW5ld19obCA9IDI1NTsKLQkJCWJyZWFrOwotCQljYXNlIElQNlRfSExfREVDOgotCQkJbmV3X2hsID0gaXA2aC0+aG9wX2xpbWl0IC0gaW5mby0+aG9wX2xpbWl0OwotCQkJaWYgKG5ld19obCA8IDApCi0JCQkJbmV3X2hsID0gMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbmV3X2hsID0gaXA2aC0+aG9wX2xpbWl0OwotCQkJYnJlYWs7CisJY2FzZSBJUDZUX0hMX1NFVDoKKwkJbmV3X2hsID0gaW5mby0+aG9wX2xpbWl0OworCQlicmVhazsKKwljYXNlIElQNlRfSExfSU5DOgorCQluZXdfaGwgPSBpcDZoLT5ob3BfbGltaXQgKyBpbmZvLT5ob3BfbGltaXQ7CisJCWlmIChuZXdfaGwgPiAyNTUpCisJCQluZXdfaGwgPSAyNTU7CisJCWJyZWFrOworCWNhc2UgSVA2VF9ITF9ERUM6CisJCW5ld19obCA9IGlwNmgtPmhvcF9saW1pdCAtIGluZm8tPmhvcF9saW1pdDsKKwkJaWYgKG5ld19obCA8IDApCisJCQluZXdfaGwgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluZXdfaGwgPSBpcDZoLT5ob3BfbGltaXQ7CisJCWJyZWFrOwogCX0KIAogCWlwNmgtPmhvcF9saW1pdCA9IG5ld19obDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfUkFURUVTVC5jIGIvbmV0L25ldGZpbHRlci94dF9SQVRFRVNULmMKaW5kZXggZGUwNzlhYmQuLmYyNjQwMzIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfUkFURUVTVC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfUkFURUVTVC5jCkBAIC02MCwxMSArNjAsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoeHRfcmF0ZWVzdF9sb29rdXApOwogCi1zdGF0aWMgdm9pZCB4dF9yYXRlZXN0X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlrZnJlZShjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHh0X3JhdGVlc3QsIHJjdSkpOwotfQotCiB2b2lkIHh0X3JhdGVlc3RfcHV0KHN0cnVjdCB4dF9yYXRlZXN0ICplc3QpCiB7CiAJbXV0ZXhfbG9jaygmeHRfcmF0ZWVzdF9tdXRleCk7CkBAIC03NSw3ICs3MCw3IEBACiAJCSAqIGdlbl9lc3RpbWF0b3IgZXN0X3RpbWVyKCkgbWlnaHQgYWNjZXNzIGVzdC0+bG9jayBvciBic3RhdHMsCiAJCSAqIHdhaXQgYSBSQ1UgZ3JhY2UgcGVyaW9kIGJlZm9yZSBmcmVlaW5nICdlc3QnCiAJCSAqLwotCQljYWxsX3JjdSgmZXN0LT5yY3UsIHh0X3JhdGVlc3RfZnJlZV9yY3UpOworCQlrZnJlZV9yY3UoZXN0LCByY3UpOwogCX0KIAltdXRleF91bmxvY2soJnh0X3JhdGVlc3RfbXV0ZXgpOwogfQpAQCAtMTg4LDcgKzE4Myw2IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgeHRfcmF0ZWVzdF90Z19maW5pKHZvaWQpCiB7CiAJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJnh0X3JhdGVlc3RfdGdfcmVnKTsKLQlyY3VfYmFycmllcigpOyAvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIGNhbGxfcmN1KCkncyAoeHRfcmF0ZWVzdF9mcmVlX3JjdSkgKi8KIH0KIAogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2hsLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2hsLmMKaW5kZXggN2QxMjIyMS4uMDAzOTUxMSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9obC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfaGwuYwpAQCAtMzEsMTQgKzMxLDE0IEBACiAJY29uc3QgdTggdHRsID0gaXBfaGRyKHNrYiktPnR0bDsKIAogCXN3aXRjaCAoaW5mby0+bW9kZSkgewotCQljYXNlIElQVF9UVExfRVE6Ci0JCQlyZXR1cm4gdHRsID09IGluZm8tPnR0bDsKLQkJY2FzZSBJUFRfVFRMX05FOgotCQkJcmV0dXJuIHR0bCAhPSBpbmZvLT50dGw7Ci0JCWNhc2UgSVBUX1RUTF9MVDoKLQkJCXJldHVybiB0dGwgPCBpbmZvLT50dGw7Ci0JCWNhc2UgSVBUX1RUTF9HVDoKLQkJCXJldHVybiB0dGwgPiBpbmZvLT50dGw7CisJY2FzZSBJUFRfVFRMX0VROgorCQlyZXR1cm4gdHRsID09IGluZm8tPnR0bDsKKwljYXNlIElQVF9UVExfTkU6CisJCXJldHVybiB0dGwgIT0gaW5mby0+dHRsOworCWNhc2UgSVBUX1RUTF9MVDoKKwkJcmV0dXJuIHR0bCA8IGluZm8tPnR0bDsKKwljYXNlIElQVF9UVExfR1Q6CisJCXJldHVybiB0dGwgPiBpbmZvLT50dGw7CiAJfQogCiAJcmV0dXJuIGZhbHNlOwpAQCAtNTAsMTQgKzUwLDE0IEBACiAJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmggPSBpcHY2X2hkcihza2IpOwogCiAJc3dpdGNoIChpbmZvLT5tb2RlKSB7Ci0JCWNhc2UgSVA2VF9ITF9FUToKLQkJCXJldHVybiBpcDZoLT5ob3BfbGltaXQgPT0gaW5mby0+aG9wX2xpbWl0OwotCQljYXNlIElQNlRfSExfTkU6Ci0JCQlyZXR1cm4gaXA2aC0+aG9wX2xpbWl0ICE9IGluZm8tPmhvcF9saW1pdDsKLQkJY2FzZSBJUDZUX0hMX0xUOgotCQkJcmV0dXJuIGlwNmgtPmhvcF9saW1pdCA8IGluZm8tPmhvcF9saW1pdDsKLQkJY2FzZSBJUDZUX0hMX0dUOgotCQkJcmV0dXJuIGlwNmgtPmhvcF9saW1pdCA+IGluZm8tPmhvcF9saW1pdDsKKwljYXNlIElQNlRfSExfRVE6CisJCXJldHVybiBpcDZoLT5ob3BfbGltaXQgPT0gaW5mby0+aG9wX2xpbWl0OworCWNhc2UgSVA2VF9ITF9ORToKKwkJcmV0dXJuIGlwNmgtPmhvcF9saW1pdCAhPSBpbmZvLT5ob3BfbGltaXQ7CisJY2FzZSBJUDZUX0hMX0xUOgorCQlyZXR1cm4gaXA2aC0+aG9wX2xpbWl0IDwgaW5mby0+aG9wX2xpbWl0OworCWNhc2UgSVA2VF9ITF9HVDoKKwkJcmV0dXJuIGlwNmgtPmhvcF9saW1pdCA+IGluZm8tPmhvcF9saW1pdDsKIAl9CiAKIAlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3NldC5jIGIvbmV0L25ldGZpbHRlci94dF9zZXQuYwppbmRleCBiM2JhYmFlLi4wZWM4MTM4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3NldC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfc2V0LmMKQEAgLTEzLDcgKzEzLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9zZXQuaD4KQEAgLTI5LDIzICsyOCwzMyBAQAogCiBzdGF0aWMgaW5saW5lIGludAogbWF0Y2hfc2V0KGlwX3NldF9pZF90IGluZGV4LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgdTggcGYsIHU4IGRpbSwgdTggZmxhZ3MsIGludCBpbnYpCisJICBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIsCisJICBjb25zdCBzdHJ1Y3QgaXBfc2V0X2FkdF9vcHQgKm9wdCwgaW50IGludikKIHsKLQlpZiAoaXBfc2V0X3Rlc3QoaW5kZXgsIHNrYiwgcGYsIGRpbSwgZmxhZ3MpKQorCWlmIChpcF9zZXRfdGVzdChpbmRleCwgc2tiLCBwYXIsIG9wdCkpCiAJCWludiA9ICFpbnY7CiAJcmV0dXJuIGludjsKIH0KIAorI2RlZmluZSBBRFRfT1BUKG4sIGYsIGQsIGZzLCBjZnMsIHQpCVwKK2NvbnN0IHN0cnVjdCBpcF9zZXRfYWR0X29wdCBuID0gewlcCisJLmZhbWlseQk9IGYsCQkJXAorCS5kaW0gPSBkLAkJCVwKKwkuZmxhZ3MgPSBmcywJCQlcCisJLmNtZGZsYWdzID0gY2ZzLAkJXAorCS50aW1lb3V0ID0gdCwJCQlcCit9CisKIC8qIFJldmlzaW9uIDAgaW50ZXJmYWNlOiBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggbmV0ZmlsdGVyL2lwdGFibGVzICovCiAKIHN0YXRpYyBib29sCiBzZXRfbWF0Y2hfdjAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQogewogCWNvbnN0IHN0cnVjdCB4dF9zZXRfaW5mb19tYXRjaF92MCAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCUFEVF9PUFQob3B0LCBwYXItPmZhbWlseSwgaW5mby0+bWF0Y2hfc2V0LnUuY29tcGF0LmRpbSwKKwkJaW5mby0+bWF0Y2hfc2V0LnUuY29tcGF0LmZsYWdzLCAwLCBVSU5UX01BWCk7CiAKLQlyZXR1cm4gbWF0Y2hfc2V0KGluZm8tPm1hdGNoX3NldC5pbmRleCwgc2tiLCBwYXItPmZhbWlseSwKLQkJCSBpbmZvLT5tYXRjaF9zZXQudS5jb21wYXQuZGltLAotCQkJIGluZm8tPm1hdGNoX3NldC51LmNvbXBhdC5mbGFncywKKwlyZXR1cm4gbWF0Y2hfc2V0KGluZm8tPm1hdGNoX3NldC5pbmRleCwgc2tiLCBwYXIsICZvcHQsCiAJCQkgaW5mby0+bWF0Y2hfc2V0LnUuY29tcGF0LmZsYWdzICYgSVBTRVRfSU5WX01BVENIKTsKIH0KIApAQCAtMTAzLDE1ICsxMTIsMTUgQEAKIHNldF90YXJnZXRfdjAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQogewogCWNvbnN0IHN0cnVjdCB4dF9zZXRfaW5mb190YXJnZXRfdjAgKmluZm8gPSBwYXItPnRhcmdpbmZvOworCUFEVF9PUFQoYWRkX29wdCwgcGFyLT5mYW1pbHksIGluZm8tPmFkZF9zZXQudS5jb21wYXQuZGltLAorCQlpbmZvLT5hZGRfc2V0LnUuY29tcGF0LmZsYWdzLCAwLCBVSU5UX01BWCk7CisJQURUX09QVChkZWxfb3B0LCBwYXItPmZhbWlseSwgaW5mby0+ZGVsX3NldC51LmNvbXBhdC5kaW0sCisJCWluZm8tPmRlbF9zZXQudS5jb21wYXQuZmxhZ3MsIDAsIFVJTlRfTUFYKTsKIAogCWlmIChpbmZvLT5hZGRfc2V0LmluZGV4ICE9IElQU0VUX0lOVkFMSURfSUQpCi0JCWlwX3NldF9hZGQoaW5mby0+YWRkX3NldC5pbmRleCwgc2tiLCBwYXItPmZhbWlseSwKLQkJCSAgIGluZm8tPmFkZF9zZXQudS5jb21wYXQuZGltLAotCQkJICAgaW5mby0+YWRkX3NldC51LmNvbXBhdC5mbGFncyk7CisJCWlwX3NldF9hZGQoaW5mby0+YWRkX3NldC5pbmRleCwgc2tiLCBwYXIsICZhZGRfb3B0KTsKIAlpZiAoaW5mby0+ZGVsX3NldC5pbmRleCAhPSBJUFNFVF9JTlZBTElEX0lEKQotCQlpcF9zZXRfZGVsKGluZm8tPmRlbF9zZXQuaW5kZXgsIHNrYiwgcGFyLT5mYW1pbHksCi0JCQkgICBpbmZvLT5kZWxfc2V0LnUuY29tcGF0LmRpbSwKLQkJCSAgIGluZm8tPmRlbF9zZXQudS5jb21wYXQuZmxhZ3MpOworCQlpcF9zZXRfZGVsKGluZm8tPmRlbF9zZXQuaW5kZXgsIHNrYiwgcGFyLCAmZGVsX29wdCk7CiAKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CkBAIC0xNzAsMjMgKzE3OSwyMyBAQAogCQlpcF9zZXRfbmZubF9wdXQoaW5mby0+ZGVsX3NldC5pbmRleCk7CiB9CiAKLS8qIFJldmlzaW9uIDE6IGN1cnJlbnQgaW50ZXJmYWNlIHRvIG5ldGZpbHRlci9pcHRhYmxlcyAqLworLyogUmV2aXNpb24gMSBtYXRjaCBhbmQgdGFyZ2V0ICovCiAKIHN0YXRpYyBib29sCi1zZXRfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQorc2V0X21hdGNoX3YxKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfc2V0X2luZm9fbWF0Y2ggKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfc2V0X2luZm9fbWF0Y2hfdjEgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwlBRFRfT1BUKG9wdCwgcGFyLT5mYW1pbHksIGluZm8tPm1hdGNoX3NldC5kaW0sCisJCWluZm8tPm1hdGNoX3NldC5mbGFncywgMCwgVUlOVF9NQVgpOwogCi0JcmV0dXJuIG1hdGNoX3NldChpbmZvLT5tYXRjaF9zZXQuaW5kZXgsIHNrYiwgcGFyLT5mYW1pbHksCi0JCQkgaW5mby0+bWF0Y2hfc2V0LmRpbSwKLQkJCSBpbmZvLT5tYXRjaF9zZXQuZmxhZ3MsCisJcmV0dXJuIG1hdGNoX3NldChpbmZvLT5tYXRjaF9zZXQuaW5kZXgsIHNrYiwgcGFyLCAmb3B0LAogCQkJIGluZm8tPm1hdGNoX3NldC5mbGFncyAmIElQU0VUX0lOVl9NQVRDSCk7CiB9CiAKIHN0YXRpYyBpbnQKLXNldF9tYXRjaF9jaGVja2VudHJ5KGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQorc2V0X21hdGNoX3YxX2NoZWNrZW50cnkoY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0Jc3RydWN0IHh0X3NldF9pbmZvX21hdGNoICppbmZvID0gcGFyLT5tYXRjaGluZm87CisJc3RydWN0IHh0X3NldF9pbmZvX21hdGNoX3YxICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJaXBfc2V0X2lkX3QgaW5kZXg7CiAKIAlpbmRleCA9IGlwX3NldF9uZm5sX2dldF9ieWluZGV4KGluZm8tPm1hdGNoX3NldC5pbmRleCk7CkBAIC0yMDcsMzYgKzIxNiwzNCBAQAogfQogCiBzdGF0aWMgdm9pZAotc2V0X21hdGNoX2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQorc2V0X21hdGNoX3YxX2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQogewotCXN0cnVjdCB4dF9zZXRfaW5mb19tYXRjaCAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCXN0cnVjdCB4dF9zZXRfaW5mb19tYXRjaF92MSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJaXBfc2V0X25mbmxfcHV0KGluZm8tPm1hdGNoX3NldC5pbmRleCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLXNldF90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQorc2V0X3RhcmdldF92MShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X3NldF9pbmZvX3RhcmdldCAqaW5mbyA9IHBhci0+dGFyZ2luZm87CisJY29uc3Qgc3RydWN0IHh0X3NldF9pbmZvX3RhcmdldF92MSAqaW5mbyA9IHBhci0+dGFyZ2luZm87CisJQURUX09QVChhZGRfb3B0LCBwYXItPmZhbWlseSwgaW5mby0+YWRkX3NldC5kaW0sCisJCWluZm8tPmFkZF9zZXQuZmxhZ3MsIDAsIFVJTlRfTUFYKTsKKwlBRFRfT1BUKGRlbF9vcHQsIHBhci0+ZmFtaWx5LCBpbmZvLT5kZWxfc2V0LmRpbSwKKwkJaW5mby0+ZGVsX3NldC5mbGFncywgMCwgVUlOVF9NQVgpOwogCiAJaWYgKGluZm8tPmFkZF9zZXQuaW5kZXggIT0gSVBTRVRfSU5WQUxJRF9JRCkKLQkJaXBfc2V0X2FkZChpbmZvLT5hZGRfc2V0LmluZGV4LAotCQkJICAgc2tiLCBwYXItPmZhbWlseSwKLQkJCSAgIGluZm8tPmFkZF9zZXQuZGltLAotCQkJICAgaW5mby0+YWRkX3NldC5mbGFncyk7CisJCWlwX3NldF9hZGQoaW5mby0+YWRkX3NldC5pbmRleCwgc2tiLCBwYXIsICZhZGRfb3B0KTsKIAlpZiAoaW5mby0+ZGVsX3NldC5pbmRleCAhPSBJUFNFVF9JTlZBTElEX0lEKQotCQlpcF9zZXRfZGVsKGluZm8tPmRlbF9zZXQuaW5kZXgsCi0JCQkgICBza2IsIHBhci0+ZmFtaWx5LAotCQkJICAgaW5mby0+ZGVsX3NldC5kaW0sCi0JCQkgICBpbmZvLT5kZWxfc2V0LmZsYWdzKTsKKwkJaXBfc2V0X2RlbChpbmZvLT5kZWxfc2V0LmluZGV4LCBza2IsIHBhciwgJmRlbF9vcHQpOwogCiAJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50Ci1zZXRfdGFyZ2V0X2NoZWNrZW50cnkoY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCitzZXRfdGFyZ2V0X3YxX2NoZWNrZW50cnkoY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X3NldF9pbmZvX3RhcmdldCAqaW5mbyA9IHBhci0+dGFyZ2luZm87CisJY29uc3Qgc3RydWN0IHh0X3NldF9pbmZvX3RhcmdldF92MSAqaW5mbyA9IHBhci0+dGFyZ2luZm87CiAJaXBfc2V0X2lkX3QgaW5kZXg7CiAKIAlpZiAoaW5mby0+YWRkX3NldC5pbmRleCAhPSBJUFNFVF9JTlZBTElEX0lEKSB7CkBAIC0yNzMsOSArMjgwLDkgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNldF90YXJnZXRfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfdGdkdG9yX3BhcmFtICpwYXIpCitzZXRfdGFyZ2V0X3YxX2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X3RnZHRvcl9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9zZXRfaW5mb190YXJnZXQgKmluZm8gPSBwYXItPnRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9zZXRfaW5mb190YXJnZXRfdjEgKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCiAJaWYgKGluZm8tPmFkZF9zZXQuaW5kZXggIT0gSVBTRVRfSU5WQUxJRF9JRCkKIAkJaXBfc2V0X25mbmxfcHV0KGluZm8tPmFkZF9zZXQuaW5kZXgpOwpAQCAtMjgzLDYgKzI5MCwyOCBAQAogCQlpcF9zZXRfbmZubF9wdXQoaW5mby0+ZGVsX3NldC5pbmRleCk7CiB9CiAKKy8qIFJldmlzaW9uIDIgdGFyZ2V0ICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NldF90YXJnZXRfdjIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9zZXRfaW5mb190YXJnZXRfdjIgKmluZm8gPSBwYXItPnRhcmdpbmZvOworCUFEVF9PUFQoYWRkX29wdCwgcGFyLT5mYW1pbHksIGluZm8tPmFkZF9zZXQuZGltLAorCQlpbmZvLT5hZGRfc2V0LmZsYWdzLCBpbmZvLT5mbGFncywgaW5mby0+dGltZW91dCk7CisJQURUX09QVChkZWxfb3B0LCBwYXItPmZhbWlseSwgaW5mby0+ZGVsX3NldC5kaW0sCisJCWluZm8tPmRlbF9zZXQuZmxhZ3MsIDAsIFVJTlRfTUFYKTsKKworCWlmIChpbmZvLT5hZGRfc2V0LmluZGV4ICE9IElQU0VUX0lOVkFMSURfSUQpCisJCWlwX3NldF9hZGQoaW5mby0+YWRkX3NldC5pbmRleCwgc2tiLCBwYXIsICZhZGRfb3B0KTsKKwlpZiAoaW5mby0+ZGVsX3NldC5pbmRleCAhPSBJUFNFVF9JTlZBTElEX0lEKQorCQlpcF9zZXRfZGVsKGluZm8tPmRlbF9zZXQuaW5kZXgsIHNrYiwgcGFyLCAmZGVsX29wdCk7CisKKwlyZXR1cm4gWFRfQ09OVElOVUU7Cit9CisKKyNkZWZpbmUgc2V0X3RhcmdldF92Ml9jaGVja2VudHJ5CXNldF90YXJnZXRfdjFfY2hlY2tlbnRyeQorI2RlZmluZSBzZXRfdGFyZ2V0X3YyX2Rlc3Ryb3kJCXNldF90YXJnZXRfdjFfZGVzdHJveQorCiBzdGF0aWMgc3RydWN0IHh0X21hdGNoIHNldF9tYXRjaGVzW10gX19yZWFkX21vc3RseSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJzZXQiLApAQCAtMjk4LDIwICszMjcsMjAgQEAKIAkJLm5hbWUJCT0gInNldCIsCiAJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCQkucmV2aXNpb24JPSAxLAotCQkubWF0Y2gJCT0gc2V0X21hdGNoLAotCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9zZXRfaW5mb19tYXRjaCksCi0JCS5jaGVja2VudHJ5CT0gc2V0X21hdGNoX2NoZWNrZW50cnksCi0JCS5kZXN0cm95CT0gc2V0X21hdGNoX2Rlc3Ryb3ksCisJCS5tYXRjaAkJPSBzZXRfbWF0Y2hfdjEsCisJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3NldF9pbmZvX21hdGNoX3YxKSwKKwkJLmNoZWNrZW50cnkJPSBzZXRfbWF0Y2hfdjFfY2hlY2tlbnRyeSwKKwkJLmRlc3Ryb3kJPSBzZXRfbWF0Y2hfdjFfZGVzdHJveSwKIAkJLm1lCQk9IFRISVNfTU9EVUxFCiAJfSwKIAl7CiAJCS5uYW1lCQk9ICJzZXQiLAogCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkJLnJldmlzaW9uCT0gMSwKLQkJLm1hdGNoCQk9IHNldF9tYXRjaCwKLQkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfc2V0X2luZm9fbWF0Y2gpLAotCQkuY2hlY2tlbnRyeQk9IHNldF9tYXRjaF9jaGVja2VudHJ5LAotCQkuZGVzdHJveQk9IHNldF9tYXRjaF9kZXN0cm95LAorCQkubWF0Y2gJCT0gc2V0X21hdGNoX3YxLAorCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9zZXRfaW5mb19tYXRjaF92MSksCisJCS5jaGVja2VudHJ5CT0gc2V0X21hdGNoX3YxX2NoZWNrZW50cnksCisJCS5kZXN0cm95CT0gc2V0X21hdGNoX3YxX2Rlc3Ryb3ksCiAJCS5tZQkJPSBUSElTX01PRFVMRQogCX0sCiB9OwpAQCAtMzMxLDIwICszNjAsNDAgQEAKIAkJLm5hbWUJCT0gIlNFVCIsCiAJCS5yZXZpc2lvbgk9IDEsCiAJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAotCQkudGFyZ2V0CQk9IHNldF90YXJnZXQsCi0JCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9zZXRfaW5mb190YXJnZXQpLAotCQkuY2hlY2tlbnRyeQk9IHNldF90YXJnZXRfY2hlY2tlbnRyeSwKLQkJLmRlc3Ryb3kJPSBzZXRfdGFyZ2V0X2Rlc3Ryb3ksCisJCS50YXJnZXQJCT0gc2V0X3RhcmdldF92MSwKKwkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3NldF9pbmZvX3RhcmdldF92MSksCisJCS5jaGVja2VudHJ5CT0gc2V0X3RhcmdldF92MV9jaGVja2VudHJ5LAorCQkuZGVzdHJveQk9IHNldF90YXJnZXRfdjFfZGVzdHJveSwKIAkJLm1lCQk9IFRISVNfTU9EVUxFCiAJfSwKIAl7CiAJCS5uYW1lCQk9ICJTRVQiLAogCQkucmV2aXNpb24JPSAxLAogCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKLQkJLnRhcmdldAkJPSBzZXRfdGFyZ2V0LAotCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfc2V0X2luZm9fdGFyZ2V0KSwKLQkJLmNoZWNrZW50cnkJPSBzZXRfdGFyZ2V0X2NoZWNrZW50cnksCi0JCS5kZXN0cm95CT0gc2V0X3RhcmdldF9kZXN0cm95LAorCQkudGFyZ2V0CQk9IHNldF90YXJnZXRfdjEsCisJCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9zZXRfaW5mb190YXJnZXRfdjEpLAorCQkuY2hlY2tlbnRyeQk9IHNldF90YXJnZXRfdjFfY2hlY2tlbnRyeSwKKwkJLmRlc3Ryb3kJPSBzZXRfdGFyZ2V0X3YxX2Rlc3Ryb3ksCisJCS5tZQkJPSBUSElTX01PRFVMRQorCX0sCisJeworCQkubmFtZQkJPSAiU0VUIiwKKwkJLnJldmlzaW9uCT0gMiwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCisJCS50YXJnZXQJCT0gc2V0X3RhcmdldF92MiwKKwkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3NldF9pbmZvX3RhcmdldF92MiksCisJCS5jaGVja2VudHJ5CT0gc2V0X3RhcmdldF92Ml9jaGVja2VudHJ5LAorCQkuZGVzdHJveQk9IHNldF90YXJnZXRfdjJfZGVzdHJveSwKKwkJLm1lCQk9IFRISVNfTU9EVUxFCisJfSwKKwl7CisJCS5uYW1lCQk9ICJTRVQiLAorCQkucmV2aXNpb24JPSAyLAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKKwkJLnRhcmdldAkJPSBzZXRfdGFyZ2V0X3YyLAorCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfc2V0X2luZm9fdGFyZ2V0X3YyKSwKKwkJLmNoZWNrZW50cnkJPSBzZXRfdGFyZ2V0X3YyX2NoZWNrZW50cnksCisJCS5kZXN0cm95CT0gc2V0X3RhcmdldF92Ml9kZXN0cm95LAogCQkubWUJCT0gVEhJU19NT0RVTEUKIAl9LAogfTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3NvY2tldC5jCmluZGV4IDljYzQ2MzUuLmZlMzlmN2UgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zb2NrZXQuYwpAQCAtMTQzLDkgKzE0Myw5IEBACiAJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKIAlpZiAoY3QgJiYgIW5mX2N0X2lzX3VudHJhY2tlZChjdCkgJiYKIAkgICAgKChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fSUNNUCAmJgotCSAgICAgIGN0aW5mbyA9PSBJUF9DVF9JU19SRVBMWSArIElQX0NUX0VTVEFCTElTSEVEKSB8fAorCSAgICAgIGN0aW5mbyA9PSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSkgfHwKIAkgICAgIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUCAmJgotCSAgICAgIGN0aW5mbyA9PSBJUF9DVF9JU19SRVBMWSArIElQX0NUX1JFTEFURUQpKSAmJgorCSAgICAgIGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEX1JFUExZKSkgJiYKIAkgICAgKGN0LT5zdGF0dXMgJiBJUFNfU1JDX05BVF9ET05FKSkgewogCiAJCWRhZGRyID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy51My5pcDsKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5jCmluZGV4IGRlMGQ4ZTQuLjJhYTk3NWUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYwpAQCAtNTUsOCArNTUsNyBAQAogICogc2hvdWxkIGJlIG9rYXkgKi8KIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmV0bGJsX2RvbWhzaF9sb2NrKTsKICNkZWZpbmUgbmV0bGJsX2RvbWhzaF9yY3VfZGVyZWYocCkgXAotCXJjdV9kZXJlZmVyZW5jZV9jaGVjayhwLCByY3VfcmVhZF9sb2NrX2hlbGQoKSB8fCBcCi0JCQkJIGxvY2tkZXBfaXNfaGVsZCgmbmV0bGJsX2RvbWhzaF9sb2NrKSkKKwlyY3VfZGVyZWZlcmVuY2VfY2hlY2socCwgbG9ja2RlcF9pc19oZWxkKCZuZXRsYmxfZG9taHNoX2xvY2spKQogc3RhdGljIHN0cnVjdCBuZXRsYmxfZG9taHNoX3RibCAqbmV0bGJsX2RvbWhzaCA9IE5VTEw7CiBzdGF0aWMgc3RydWN0IG5ldGxibF9kb21fbWFwICpuZXRsYmxfZG9taHNoX2RlZiA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYwppbmRleCA5YzM4NjU4Li45YTI5MGVmIDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5jCkBAIC0xMTYsOCArMTE2LDcgQEAKICAqIGhhc2ggdGFibGUgc2hvdWxkIGJlIG9rYXkgKi8KIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmV0bGJsX3VubGhzaF9sb2NrKTsKICNkZWZpbmUgbmV0bGJsX3VubGhzaF9yY3VfZGVyZWYocCkgXAotCXJjdV9kZXJlZmVyZW5jZV9jaGVjayhwLCByY3VfcmVhZF9sb2NrX2hlbGQoKSB8fCBcCi0JCQkJIGxvY2tkZXBfaXNfaGVsZCgmbmV0bGJsX3VubGhzaF9sb2NrKSkKKwlyY3VfZGVyZWZlcmVuY2VfY2hlY2socCwgbG9ja2RlcF9pc19oZWxkKCZuZXRsYmxfdW5saHNoX2xvY2spKQogc3RhdGljIHN0cnVjdCBuZXRsYmxfdW5saHNoX3RibCAqbmV0bGJsX3VubGhzaCA9IE5VTEw7CiBzdGF0aWMgc3RydWN0IG5ldGxibF91bmxoc2hfaWZhY2UgKm5ldGxibF91bmxoc2hfZGVmID0gTlVMTDsKIApAQCAtNDI2LDEwICs0MjUsOSBAQAogCQkJCQkgICAgICBhdWRpdF9pbmZvKTsKIAlzd2l0Y2ggKGFkZHJfbGVuKSB7CiAJY2FzZSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOiB7Ci0JCXN0cnVjdCBpbl9hZGRyICphZGRyNCwgKm1hc2s0OworCQljb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkcjQgPSBhZGRyOworCQljb25zdCBzdHJ1Y3QgaW5fYWRkciAqbWFzazQgPSBtYXNrOwogCi0JCWFkZHI0ID0gKHN0cnVjdCBpbl9hZGRyICopYWRkcjsKLQkJbWFzazQgPSAoc3RydWN0IGluX2FkZHIgKiltYXNrOwogCQlyZXRfdmFsID0gbmV0bGJsX3VubGhzaF9hZGRfYWRkcjQoaWZhY2UsIGFkZHI0LCBtYXNrNCwgc2VjaWQpOwogCQlpZiAoYXVkaXRfYnVmICE9IE5VTEwpCiAJCQluZXRsYmxfYWY0bGlzdF9hdWRpdF9hZGRyKGF1ZGl0X2J1ZiwgMSwKQEAgLTQ0MCwxMCArNDM4LDkgQEAKIAl9CiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCiAJY2FzZSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTogewotCQlzdHJ1Y3QgaW42X2FkZHIgKmFkZHI2LCAqbWFzazY7CisJCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcjYgPSBhZGRyOworCQljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKm1hc2s2ID0gbWFzazsKIAotCQlhZGRyNiA9IChzdHJ1Y3QgaW42X2FkZHIgKilhZGRyOwotCQltYXNrNiA9IChzdHJ1Y3QgaW42X2FkZHIgKiltYXNrOwogCQlyZXRfdmFsID0gbmV0bGJsX3VubGhzaF9hZGRfYWRkcjYoaWZhY2UsIGFkZHI2LCBtYXNrNiwgc2VjaWQpOwogCQlpZiAoYXVkaXRfYnVmICE9IE5VTEwpCiAJCQluZXRsYmxfYWY2bGlzdF9hdWRpdF9hZGRyKGF1ZGl0X2J1ZiwgMSwKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwppbmRleCA2ZWY2NGFkLi4wYTRkYjAyIDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCkBAIC0xNjU5LDEzICsxNjU5LDEwIEBACiB7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKIAlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2I7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlpbnQgbGVuLCBlcnIgPSAtRU5PQlVGUzsKLQotCXNrYiA9IHNvY2tfcm1hbGxvYyhzaywgTkxNU0dfR09PRFNJWkUsIDAsIEdGUF9LRVJORUwpOwotCWlmICghc2tiKQotCQlnb3RvIGVycm91dDsKKwlpbnQgYWxsb2Nfc2l6ZTsKIAogCW11dGV4X2xvY2sobmxrLT5jYl9tdXRleCk7CiAKQEAgLTE2NzUsNiArMTY3MiwxMiBAQAogCQlnb3RvIGVycm91dF9za2I7CiAJfQogCisJYWxsb2Nfc2l6ZSA9IG1heF90KGludCwgY2ItPm1pbl9kdW1wX2FsbG9jLCBOTE1TR19HT09EU0laRSk7CisKKwlza2IgPSBzb2NrX3JtYWxsb2Moc2ssIGFsbG9jX3NpemUsIDAsIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlnb3RvIGVycm91dF9za2I7CisKIAlsZW4gPSBjYi0+ZHVtcChza2IsIGNiKTsKIAogCWlmIChsZW4gPiAwKSB7CkBAIC0xNjkzLDYgKzE2OTYsOCBAQAogCWlmICghbmxoKQogCQlnb3RvIGVycm91dF9za2I7CiAKKwlubF9kdW1wX2NoZWNrX2NvbnNpc3RlbnQoY2IsIG5saCk7CisKIAltZW1jcHkobmxtc2dfZGF0YShubGgpLCAmbGVuLCBzaXplb2YobGVuKSk7CiAKIAlpZiAoc2tfZmlsdGVyKHNrLCBza2IpKQpAQCAtMTcxMyw3ICsxNzE4LDYgQEAKIGVycm91dF9za2I6CiAJbXV0ZXhfdW5sb2NrKG5say0+Y2JfbXV0ZXgpOwogCWtmcmVlX3NrYihza2IpOwotZXJyb3V0OgogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE3MjEsNyArMTcyNSw4IEBACiAJCSAgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKIAkJICAgICAgIGludCAoKmR1bXApKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKiksCi0JCSAgICAgICBpbnQgKCpkb25lKShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqKSkKKwkJICAgICAgIGludCAoKmRvbmUpKHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICopLAorCQkgICAgICAgdTE2IG1pbl9kdW1wX2FsbG9jKQogewogCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYjsKIAlzdHJ1Y3Qgc29jayAqc2s7CkBAIC0xNzM1LDYgKzE3NDAsNyBAQAogCWNiLT5kdW1wID0gZHVtcDsKIAljYi0+ZG9uZSA9IGRvbmU7CiAJY2ItPm5saCA9IG5saDsKKwljYi0+bWluX2R1bXBfYWxsb2MgPSBtaW5fZHVtcF9hbGxvYzsKIAlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKIAljYi0+c2tiID0gc2tiOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCmluZGV4IDE3ODFkOTkuLjQ4MmZhNTcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCisrKyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCkBAIC01MjUsNyArNTI1LDcgQEAKIAogCQlnZW5sX3VubG9jaygpOwogCQllcnIgPSBuZXRsaW5rX2R1bXBfc3RhcnQobmV0LT5nZW5sX3NvY2ssIHNrYiwgbmxoLAotCQkJCQkgb3BzLT5kdW1waXQsIG9wcy0+ZG9uZSk7CisJCQkJCSBvcHMtPmR1bXBpdCwgb3BzLT5kb25lLCAwKTsKIAkJZ2VubF9sb2NrKCk7CiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L25ldHJvbS9ucl9yb3V0ZS5jIGIvbmV0L25ldHJvbS9ucl9yb3V0ZS5jCmluZGV4IDQ0MDU5ZDAuLmNkNWRkYjIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRyb20vbnJfcm91dGUuYworKysgYi9uZXQvbmV0cm9tL25yX3JvdXRlLmMKQEAgLTI1Nyw5ICsyNTcsMTIgQEAKIAljYXNlIDM6CiAJCWlmIChucl9ub2RlLT5yb3V0ZXNbMV0ucXVhbGl0eSA+IG5yX25vZGUtPnJvdXRlc1swXS5xdWFsaXR5KSB7CiAJCQlzd2l0Y2ggKG5yX25vZGUtPndoaWNoKSB7Ci0JCQkJY2FzZSAwOiAgbnJfbm9kZS0+d2hpY2ggPSAxOyBicmVhazsKLQkJCQljYXNlIDE6ICBucl9ub2RlLT53aGljaCA9IDA7IGJyZWFrOwotCQkJCWRlZmF1bHQ6IGJyZWFrOworCQkJY2FzZSAwOgorCQkJCW5yX25vZGUtPndoaWNoID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlucl9ub2RlLT53aGljaCA9IDA7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlucl9yb3V0ZSAgICAgICAgICAgPSBucl9ub2RlLT5yb3V0ZXNbMF07CiAJCQlucl9ub2RlLT5yb3V0ZXNbMF0gPSBucl9ub2RlLT5yb3V0ZXNbMV07CkBAIC01MDUsMTIgKzUwOCwxMyBAQAogCQkJCXMtPmNvdW50LS07CiAKIAkJCQlzd2l0Y2ggKGkpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJcy0+cm91dGVzWzBdID0gcy0+cm91dGVzWzFdOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlzLT5yb3V0ZXNbMV0gPSBzLT5yb3V0ZXNbMl07Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCWJyZWFrOworCQkJCWNhc2UgMDoKKwkJCQkJcy0+cm91dGVzWzBdID0gcy0+cm91dGVzWzFdOworCQkJCQkvKiBGYWxsdGhyb3VnaCAqLworCQkJCWNhc2UgMToKKwkJCQkJcy0+cm91dGVzWzFdID0gcy0+cm91dGVzWzJdOworCQkJCWNhc2UgMjoKKwkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9uZXQvbmZjL0tjb25maWcgYi9uZXQvbmZjL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlMDk1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmZjL0tjb25maWcKQEAgLTAsMCArMSwxNiBAQAorIworIyBORkMgc3lic3lzdGVtIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudWNvbmZpZyBORkMKKwlkZXBlbmRzIG9uIE5FVCAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiTkZDIHN1YnN5c3RlbSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgTkZDIChOZWFyIGZpZWxkCisJICBjb21tdW5pY2F0aW9uKSBkZXZpY2VzLgorCisJICBUbyBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbmZjLgorCitzb3VyY2UgImRyaXZlcnMvbmZjL0tjb25maWciCmRpZmYgLS1naXQgYS9uZXQvbmZjL01ha2VmaWxlIGIvbmV0L25mYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjI1MGMzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25mYy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBORkMgc3Vic3lzdGVtLgorIworCitvYmotJChDT05GSUdfTkZDKSArPSBuZmMubworCituZmMtb2JqcyA6PSBjb3JlLm8gbmV0bGluay5vIGFmX25mYy5vIHJhd3NvY2subwpkaWZmIC0tZ2l0IGEvbmV0L25mYy9hZl9uZmMuYyBiL25ldC9uZmMvYWZfbmZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4MmNlZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZmMvYWZfbmZjLmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBJbnN0aXR1dG8gTm9raWEgZGUgVGVjbm9sb2dpYQorICoKKyAqIEF1dGhvcnM6CisgKiAgICBBbG9pc2lvIEFsbWVpZGEgSnIgPGFsb2lzaW8uYWxtZWlkYUBvcGVuYm9zc2Eub3JnPgorICogICAgTGF1cm8gUmFtb3MgVmVuYW5jaW8gPGxhdXJvLnZlbmFuY2lvQG9wZW5ib3NzYS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmZjLmg+CisKKyNpbmNsdWRlICJuZmMuaCIKKworc3RhdGljIERFRklORV9SV0xPQ0socHJvdG9fdGFiX2xvY2spOworc3RhdGljIGNvbnN0IHN0cnVjdCBuZmNfcHJvdG9jb2wgKnByb3RvX3RhYltORkNfU09DS1BST1RPX01BWF07CisKK3N0YXRpYyBpbnQgbmZjX3NvY2tfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvLAorCQkJCQkJCQlpbnQga2VybikKK3sKKwlpbnQgcmMgPSAtRVBST1RPTk9TVVBQT1JUOworCisJaWYgKG5ldCAhPSAmaW5pdF9uZXQpCisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCisJaWYgKHByb3RvIDwgMCB8fCBwcm90byA+PSBORkNfU09DS1BST1RPX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWFkX2xvY2soJnByb3RvX3RhYl9sb2NrKTsKKwlpZiAocHJvdG9fdGFiW3Byb3RvXSAmJgl0cnlfbW9kdWxlX2dldChwcm90b190YWJbcHJvdG9dLT5vd25lcikpIHsKKwkJcmMgPSBwcm90b190YWJbcHJvdG9dLT5jcmVhdGUobmV0LCBzb2NrLCBwcm90b190YWJbcHJvdG9dKTsKKwkJbW9kdWxlX3B1dChwcm90b190YWJbcHJvdG9dLT5vd25lcik7CisJfQorCXJlYWRfdW5sb2NrKCZwcm90b190YWJfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBuZmNfc29ja19mYW1pbHlfb3BzID0geworCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwkuZmFtaWx5ID0gUEZfTkZDLAorCS5jcmVhdGUgPSBuZmNfc29ja19jcmVhdGUsCit9OworCitpbnQgbmZjX3Byb3RvX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBuZmNfcHJvdG9jb2wgKm5mY19wcm90bykKK3sKKwlpbnQgcmM7CisKKwlpZiAobmZjX3Byb3RvLT5pZCA8IDAgfHwgbmZjX3Byb3RvLT5pZCA+PSBORkNfU09DS1BST1RPX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyYyA9IHByb3RvX3JlZ2lzdGVyKG5mY19wcm90by0+cHJvdG8sIDApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJd3JpdGVfbG9jaygmcHJvdG9fdGFiX2xvY2spOworCWlmIChwcm90b190YWJbbmZjX3Byb3RvLT5pZF0pCisJCXJjID0gLUVCVVNZOworCWVsc2UKKwkJcHJvdG9fdGFiW25mY19wcm90by0+aWRdID0gbmZjX3Byb3RvOworCXdyaXRlX3VubG9jaygmcHJvdG9fdGFiX2xvY2spOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChuZmNfcHJvdG9fcmVnaXN0ZXIpOworCit2b2lkIG5mY19wcm90b191bnJlZ2lzdGVyKGNvbnN0IHN0cnVjdCBuZmNfcHJvdG9jb2wgKm5mY19wcm90bykKK3sKKwl3cml0ZV9sb2NrKCZwcm90b190YWJfbG9jayk7CisJcHJvdG9fdGFiW25mY19wcm90by0+aWRdID0gTlVMTDsKKwl3cml0ZV91bmxvY2soJnByb3RvX3RhYl9sb2NrKTsKKworCXByb3RvX3VucmVnaXN0ZXIobmZjX3Byb3RvLT5wcm90byk7Cit9CitFWFBPUlRfU1lNQk9MKG5mY19wcm90b191bnJlZ2lzdGVyKTsKKworaW50IF9faW5pdCBhZl9uZmNfaW5pdCh2b2lkKQoreworCXJldHVybiBzb2NrX3JlZ2lzdGVyKCZuZmNfc29ja19mYW1pbHlfb3BzKTsKK30KKwordm9pZCBhZl9uZmNfZXhpdCh2b2lkKQoreworCXNvY2tfdW5yZWdpc3RlcihQRl9ORkMpOworfQpkaWZmIC0tZ2l0IGEvbmV0L25mYy9jb3JlLmMgYi9uZXQvbmZjL2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmZkNGUxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25mYy9jb3JlLmMKQEAgLTAsMCArMSw0NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSW5zdGl0dXRvIE5va2lhIGRlIFRlY25vbG9naWEKKyAqCisgKiBBdXRob3JzOgorICogICAgTGF1cm8gUmFtb3MgVmVuYW5jaW8gPGxhdXJvLnZlbmFuY2lvQG9wZW5ib3NzYS5vcmc+CisgKiAgICBBbG9pc2lvIEFsbWVpZGEgSnIgPGFsb2lzaW8uYWxtZWlkYUBvcGVuYm9zc2Eub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJuZmMuaCIKKworI2RlZmluZSBWRVJTSU9OICIwLjEiCisKK2ludCBuZmNfZGV2bGlzdF9nZW5lcmF0aW9uOworREVGSU5FX01VVEVYKG5mY19kZXZsaXN0X211dGV4KTsKKworaW50IG5mY19wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOworCXZhX2xpc3QgYXJnczsKKwlpbnQgcjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisKKwl2YWYuZm10ID0gZm9ybWF0OworCXZhZi52YSA9ICZhcmdzOworCisJciA9IHByaW50aygiJXNORkM6ICVwVlxuIiwgbGV2ZWwsICZ2YWYpOworCisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKG5mY19wcmludGspOworCisvKioKKyAqIG5mY19zdGFydF9wb2xsIC0gc3RhcnQgcG9sbGluZyBmb3IgbmZjIHRhcmdldHMKKyAqCisgKiBAZGV2OiBUaGUgbmZjIGRldmljZSB0aGF0IG11c3Qgc3RhcnQgcG9sbGluZworICogQHByb3RvY29sczogYml0c2V0IG9mIG5mYyBwcm90b2NvbHMgdGhhdCBtdXN0IGJlIHVzZWQgZm9yIHBvbGxpbmcKKyAqCisgKiBUaGUgZGV2aWNlIHJlbWFpbnMgcG9sbGluZyBmb3IgdGFyZ2V0cyB1bnRpbCBhIHRhcmdldCBpcyBmb3VuZCBvcgorICogdGhlIG5mY19zdG9wX3BvbGwgZnVuY3Rpb24gaXMgY2FsbGVkLgorICovCitpbnQgbmZjX3N0YXJ0X3BvbGwoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHByb3RvY29scykKK3sKKwlpbnQgcmM7CisKKwluZmNfZGJnKCJkZXZfbmFtZT0lcyBwcm90b2NvbHM9MHgleCIsIGRldl9uYW1lKCZkZXYtPmRldiksIHByb3RvY29scyk7CisKKwlpZiAoIXByb3RvY29scykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOworCisJaWYgKCFkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmZGV2LT5kZXYpKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoZGV2LT5wb2xsaW5nKSB7CisJCXJjID0gLUVCVVNZOworCQlnb3RvIGVycm9yOworCX0KKworCXJjID0gZGV2LT5vcHMtPnN0YXJ0X3BvbGwoZGV2LCBwcm90b2NvbHMpOworCWlmICghcmMpCisJCWRldi0+cG9sbGluZyA9IHRydWU7CisKK2Vycm9yOgorCWRldmljZV91bmxvY2soJmRldi0+ZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogbmZjX3N0b3BfcG9sbCAtIHN0b3AgcG9sbGluZyBmb3IgbmZjIHRhcmdldHMKKyAqCisgKiBAZGV2OiBUaGUgbmZjIGRldmljZSB0aGF0IG11c3Qgc3RvcCBwb2xsaW5nCisgKi8KK2ludCBuZmNfc3RvcF9wb2xsKHN0cnVjdCBuZmNfZGV2ICpkZXYpCit7CisJaW50IHJjID0gMDsKKworCW5mY19kYmcoImRldl9uYW1lPSVzIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisKKwlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOworCisJaWYgKCFkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmZGV2LT5kZXYpKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoIWRldi0+cG9sbGluZykgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2LT5vcHMtPnN0b3BfcG9sbChkZXYpOworCWRldi0+cG9sbGluZyA9IGZhbHNlOworCitlcnJvcjoKKwlkZXZpY2VfdW5sb2NrKCZkZXYtPmRldik7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIG5mY19hY3RpdmF0ZV90YXJnZXQgLSBwcmVwYXJlIHRoZSB0YXJnZXQgZm9yIGRhdGEgZXhjaGFuZ2UKKyAqCisgKiBAZGV2OiBUaGUgbmZjIGRldmljZSB0aGF0IGZvdW5kIHRoZSB0YXJnZXQKKyAqIEB0YXJnZXRfaWR4OiBpbmRleCBvZiB0aGUgdGFyZ2V0IHRoYXQgbXVzdCBiZSBhY3RpdmF0ZWQKKyAqIEBwcm90b2NvbDogbmZjIHByb3RvY29sIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBkYXRhIGV4Y2hhbmdlCisgKi8KK2ludCBuZmNfYWN0aXZhdGVfdGFyZ2V0KHN0cnVjdCBuZmNfZGV2ICpkZXYsIHUzMiB0YXJnZXRfaWR4LCB1MzIgcHJvdG9jb2wpCit7CisJaW50IHJjOworCisJbmZjX2RiZygiZGV2X25hbWU9JXMgdGFyZ2V0X2lkeD0ldSBwcm90b2NvbD0ldSIsIGRldl9uYW1lKCZkZXYtPmRldiksCisJCQkJCQkJdGFyZ2V0X2lkeCwgcHJvdG9jb2wpOworCisJZGV2aWNlX2xvY2soJmRldi0+ZGV2KTsKKworCWlmICghZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmRldi0+ZGV2KSkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmMgPSBkZXYtPm9wcy0+YWN0aXZhdGVfdGFyZ2V0KGRldiwgdGFyZ2V0X2lkeCwgcHJvdG9jb2wpOworCitlcnJvcjoKKwlkZXZpY2VfdW5sb2NrKCZkZXYtPmRldik7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIG5mY19kZWFjdGl2YXRlX3RhcmdldCAtIGRlYWN0aXZhdGUgYSBuZmMgdGFyZ2V0CisgKgorICogQGRldjogVGhlIG5mYyBkZXZpY2UgdGhhdCBmb3VuZCB0aGUgdGFyZ2V0CisgKiBAdGFyZ2V0X2lkeDogaW5kZXggb2YgdGhlIHRhcmdldCB0aGF0IG11c3QgYmUgZGVhY3RpdmF0ZWQKKyAqLworaW50IG5mY19kZWFjdGl2YXRlX3RhcmdldChzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgdGFyZ2V0X2lkeCkKK3sKKwlpbnQgcmMgPSAwOworCisJbmZjX2RiZygiZGV2X25hbWU9JXMgdGFyZ2V0X2lkeD0ldSIsIGRldl9uYW1lKCZkZXYtPmRldiksIHRhcmdldF9pZHgpOworCisJZGV2aWNlX2xvY2soJmRldi0+ZGV2KTsKKworCWlmICghZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmRldi0+ZGV2KSkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2LT5vcHMtPmRlYWN0aXZhdGVfdGFyZ2V0KGRldiwgdGFyZ2V0X2lkeCk7CisKK2Vycm9yOgorCWRldmljZV91bmxvY2soJmRldi0+ZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogbmZjX2RhdGFfZXhjaGFuZ2UgLSB0cmFuc2NlaXZlIGRhdGEKKyAqCisgKiBAZGV2OiBUaGUgbmZjIGRldmljZSB0aGF0IGZvdW5kIHRoZSB0YXJnZXQKKyAqIEB0YXJnZXRfaWR4OiBpbmRleCBvZiB0aGUgdGFyZ2V0CisgKiBAc2tiOiBkYXRhIHRvIGJlIHNlbnQKKyAqIEBjYjogY2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkCisgKiBAY2JfY29udGV4dDogcGFyYW1ldGVyIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBUaGUgdXNlciBtdXN0IHdhaXQgZm9yIHRoZSBjYWxsYmFjayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFnYWluLgorICovCitpbnQgbmZjX2RhdGFfZXhjaGFuZ2Uoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IsCisJCQkJCWRhdGFfZXhjaGFuZ2VfY2JfdCBjYiwKKwkJCQkJdm9pZCAqY2JfY29udGV4dCkKK3sKKwlpbnQgcmM7CisKKwluZmNfZGJnKCJkZXZfbmFtZT0lcyB0YXJnZXRfaWR4PSV1IHNrYi0+bGVuPSV1IiwgZGV2X25hbWUoJmRldi0+ZGV2KSwKKwkJCQkJCQl0YXJnZXRfaWR4LCBza2ItPmxlbik7CisKKwlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOworCisJaWYgKCFkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmZGV2LT5kZXYpKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmMgPSBkZXYtPm9wcy0+ZGF0YV9leGNoYW5nZShkZXYsIHRhcmdldF9pZHgsIHNrYiwgY2IsIGNiX2NvbnRleHQpOworCitlcnJvcjoKKwlkZXZpY2VfdW5sb2NrKCZkZXYtPmRldik7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIG5mY19hbGxvY19za2IgLSBhbGxvY2F0ZSBhIHNrYiBmb3IgZGF0YSBleGNoYW5nZSByZXNwb25zZXMKKyAqCisgKiBAc2l6ZTogc2l6ZSB0byBhbGxvY2F0ZQorICogQGdmcDogZ2ZwIGZsYWdzCisgKi8KK3N0cnVjdCBza19idWZmICpuZmNfYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLCBnZnBfdCBnZnApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZTsKKworCXRvdGFsX3NpemUgPSBzaXplICsgMTsKKwlza2IgPSBhbGxvY19za2IodG90YWxfc2l6ZSwgZ2ZwKTsKKworCWlmIChza2IpCisJCXNrYl9yZXNlcnZlKHNrYiwgMSk7CisKKwlyZXR1cm4gc2tiOworfQorRVhQT1JUX1NZTUJPTChuZmNfYWxsb2Nfc2tiKTsKKworLyoqCisgKiBuZmNfdGFyZ2V0c19mb3VuZCAtIGluZm9ybSB0aGF0IHRhcmdldHMgd2VyZSBmb3VuZAorICoKKyAqIEBkZXY6IFRoZSBuZmMgZGV2aWNlIHRoYXQgZm91bmQgdGhlIHRhcmdldHMKKyAqIEB0YXJnZXRzOiBhcnJheSBvZiBuZmMgdGFyZ2V0cyBmb3VuZAorICogQG50YXJnZXRzOiB0YXJnZXRzIGFycmF5IHNpemUKKyAqCisgKiBUaGUgZGV2aWNlIGRyaXZlciBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIG9uZSBvciBtYW55IG5mYyB0YXJnZXRzCisgKiBhcmUgZm91bmQuIEFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdGhlIGRldmljZSBkcml2ZXIgbXVzdCBzdG9wCisgKiBwb2xsaW5nIGZvciB0YXJnZXRzLgorICovCitpbnQgbmZjX3RhcmdldHNfZm91bmQoc3RydWN0IG5mY19kZXYgKmRldiwgc3RydWN0IG5mY190YXJnZXQgKnRhcmdldHMsCisJCQkJCQkJaW50IG5fdGFyZ2V0cykKK3sKKwlpbnQgaTsKKworCW5mY19kYmcoImRldl9uYW1lPSVzIG5fdGFyZ2V0cz0lZCIsIGRldl9uYW1lKCZkZXYtPmRldiksIG5fdGFyZ2V0cyk7CisKKwlkZXYtPnBvbGxpbmcgPSBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBuX3RhcmdldHM7IGkrKykKKwkJdGFyZ2V0c1tpXS5pZHggPSBkZXYtPnRhcmdldF9pZHgrKzsKKworCXNwaW5fbG9ja19iaCgmZGV2LT50YXJnZXRzX2xvY2spOworCisJZGV2LT50YXJnZXRzX2dlbmVyYXRpb24rKzsKKworCWtmcmVlKGRldi0+dGFyZ2V0cyk7CisJZGV2LT50YXJnZXRzID0ga21lbWR1cCh0YXJnZXRzLCBuX3RhcmdldHMgKiBzaXplb2Yoc3RydWN0IG5mY190YXJnZXQpLAorCQkJCQkJCQlHRlBfQVRPTUlDKTsKKworCWlmICghZGV2LT50YXJnZXRzKSB7CisJCWRldi0+bl90YXJnZXRzID0gMDsKKwkJc3Bpbl91bmxvY2tfYmgoJmRldi0+dGFyZ2V0c19sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGV2LT5uX3RhcmdldHMgPSBuX3RhcmdldHM7CisJc3Bpbl91bmxvY2tfYmgoJmRldi0+dGFyZ2V0c19sb2NrKTsKKworCW5mY19nZW5sX3RhcmdldHNfZm91bmQoZGV2KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChuZmNfdGFyZ2V0c19mb3VuZCk7CisKK3N0YXRpYyB2b2lkIG5mY19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmQpCit7CisJc3RydWN0IG5mY19kZXYgKmRldiA9IHRvX25mY19kZXYoZCk7CisKKwluZmNfZGJnKCJkZXZfbmFtZT0lcyIsIGRldl9uYW1lKCZkZXYtPmRldikpOworCisJbmZjX2dlbmxfZGF0YV9leGl0KCZkZXYtPmdlbmxfZGF0YSk7CisJa2ZyZWUoZGV2LT50YXJnZXRzKTsKKwlrZnJlZShkZXYpOworfQorCitzdHJ1Y3QgY2xhc3MgbmZjX2NsYXNzID0geworCS5uYW1lID0gIm5mYyIsCisJLmRldl9yZWxlYXNlID0gbmZjX3JlbGVhc2UsCit9OworRVhQT1JUX1NZTUJPTChuZmNfY2xhc3MpOworCitzdGF0aWMgaW50IG1hdGNoX2lkeChzdHJ1Y3QgZGV2aWNlICpkLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZmNfZGV2ICpkZXYgPSB0b19uZmNfZGV2KGQpOworCXVuc2lnbmVkICppZHggPSBkYXRhOworCisJcmV0dXJuIGRldi0+aWR4ID09ICppZHg7Cit9CisKK3N0cnVjdCBuZmNfZGV2ICpuZmNfZ2V0X2RldmljZSh1bnNpZ25lZCBpZHgpCit7CisJc3RydWN0IGRldmljZSAqZDsKKworCWQgPSBjbGFzc19maW5kX2RldmljZSgmbmZjX2NsYXNzLCBOVUxMLCAmaWR4LCBtYXRjaF9pZHgpOworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdG9fbmZjX2RldihkKTsKK30KKworLyoqCisgKiBuZmNfYWxsb2NhdGVfZGV2aWNlIC0gYWxsb2NhdGUgYSBuZXcgbmZjIGRldmljZQorICoKKyAqIEBvcHM6IGRldmljZSBvcGVyYXRpb25zCisgKiBAc3VwcG9ydGVkX3Byb3RvY29sczogTkZDIHByb3RvY29scyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZQorICovCitzdHJ1Y3QgbmZjX2RldiAqbmZjX2FsbG9jYXRlX2RldmljZShzdHJ1Y3QgbmZjX29wcyAqb3BzLAorCQkJCQl1MzIgc3VwcG9ydGVkX3Byb3RvY29scykKK3sKKwlzdGF0aWMgYXRvbWljX3QgZGV2X25vID0gQVRPTUlDX0lOSVQoMCk7CisJc3RydWN0IG5mY19kZXYgKmRldjsKKworCWlmICghb3BzLT5zdGFydF9wb2xsIHx8ICFvcHMtPnN0b3BfcG9sbCB8fCAhb3BzLT5hY3RpdmF0ZV90YXJnZXQgfHwKKwkJIW9wcy0+ZGVhY3RpdmF0ZV90YXJnZXQgfHwgIW9wcy0+ZGF0YV9leGNoYW5nZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXN1cHBvcnRlZF9wcm90b2NvbHMpCisJCXJldHVybiBOVUxMOworCisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5mY19kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXYtPmRldi5jbGFzcyA9ICZuZmNfY2xhc3M7CisJZGV2LT5pZHggPSBhdG9taWNfaW5jX3JldHVybigmZGV2X25vKSAtIDE7CisJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIm5mYyVkIiwgZGV2LT5pZHgpOworCWRldmljZV9pbml0aWFsaXplKCZkZXYtPmRldik7CisKKwlkZXYtPm9wcyA9IG9wczsKKwlkZXYtPnN1cHBvcnRlZF9wcm90b2NvbHMgPSBzdXBwb3J0ZWRfcHJvdG9jb2xzOworCisJc3Bpbl9sb2NrX2luaXQoJmRldi0+dGFyZ2V0c19sb2NrKTsKKwluZmNfZ2VubF9kYXRhX2luaXQoJmRldi0+Z2VubF9kYXRhKTsKKworCS8qIGZpcnN0IGdlbmVyYXRpb24gbXVzdCBub3QgYmUgMCAqLworCWRldi0+dGFyZ2V0c19nZW5lcmF0aW9uID0gMTsKKworCXJldHVybiBkZXY7Cit9CitFWFBPUlRfU1lNQk9MKG5mY19hbGxvY2F0ZV9kZXZpY2UpOworCisvKioKKyAqIG5mY19yZWdpc3Rlcl9kZXZpY2UgLSByZWdpc3RlciBhIG5mYyBkZXZpY2UgaW4gdGhlIG5mYyBzdWJzeXN0ZW0KKyAqCisgKiBAZGV2OiBUaGUgbmZjIGRldmljZSB0byByZWdpc3RlcgorICovCitpbnQgbmZjX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCWludCByYzsKKworCW5mY19kYmcoImRldl9uYW1lPSVzIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisKKwltdXRleF9sb2NrKCZuZmNfZGV2bGlzdF9tdXRleCk7CisJbmZjX2Rldmxpc3RfZ2VuZXJhdGlvbisrOworCXJjID0gZGV2aWNlX2FkZCgmZGV2LT5kZXYpOworCW11dGV4X3VubG9jaygmbmZjX2Rldmxpc3RfbXV0ZXgpOworCisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmMgPSBuZmNfZ2VubF9kZXZpY2VfYWRkZWQoZGV2KTsKKwlpZiAocmMpCisJCW5mY19kYmcoIlRoZSB1c2Vyc3BhY2Ugd29uJ3QgYmUgbm90aWZpZWQgdGhhdCB0aGUgZGV2aWNlICVzIHdhcyIKKwkJCQkJCSIgYWRkZWQiLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG5mY19yZWdpc3Rlcl9kZXZpY2UpOworCisvKioKKyAqIG5mY191bnJlZ2lzdGVyX2RldmljZSAtIHVucmVnaXN0ZXIgYSBuZmMgZGV2aWNlIGluIHRoZSBuZmMgc3Vic3lzdGVtCisgKgorICogQGRldjogVGhlIG5mYyBkZXZpY2UgdG8gdW5yZWdpc3RlcgorICovCit2b2lkIG5mY191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCWludCByYzsKKworCW5mY19kYmcoImRldl9uYW1lPSVzIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisKKwltdXRleF9sb2NrKCZuZmNfZGV2bGlzdF9tdXRleCk7CisJbmZjX2Rldmxpc3RfZ2VuZXJhdGlvbisrOworCisJLyogbG9jayB0byBhdm9pZCB1bnJlZ2lzdGVyaW5nIGEgZGV2aWNlIHdoaWxlIGFuIG9wZXJhdGlvbgorCSAgIGlzIGluIHByb2dyZXNzICovCisJZGV2aWNlX2xvY2soJmRldi0+ZGV2KTsKKwlkZXZpY2VfZGVsKCZkZXYtPmRldik7CisJZGV2aWNlX3VubG9jaygmZGV2LT5kZXYpOworCisJbXV0ZXhfdW5sb2NrKCZuZmNfZGV2bGlzdF9tdXRleCk7CisKKwlyYyA9IG5mY19nZW5sX2RldmljZV9yZW1vdmVkKGRldik7CisJaWYgKHJjKQorCQluZmNfZGJnKCJUaGUgdXNlcnNwYWNlIHdvbid0IGJlIG5vdGlmaWVkIHRoYXQgdGhlIGRldmljZSAlcyIKKwkJCQkJIiB3YXMgcmVtb3ZlZCIsIGRldl9uYW1lKCZkZXYtPmRldikpOworCit9CitFWFBPUlRfU1lNQk9MKG5mY191bnJlZ2lzdGVyX2RldmljZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IG5mY19pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJbmZjX2luZm8oIk5GQyBDb3JlIHZlciAlcyIsIFZFUlNJT04pOworCisJcmMgPSBjbGFzc19yZWdpc3RlcigmbmZjX2NsYXNzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gbmZjX2dlbmxfaW5pdCgpOworCWlmIChyYykKKwkJZ290byBlcnJfZ2VubDsKKworCS8qIHRoZSBmaXJzdCBnZW5lcmF0aW9uIG11c3Qgbm90IGJlIDAgKi8KKwluZmNfZGV2bGlzdF9nZW5lcmF0aW9uID0gMTsKKworCXJjID0gcmF3c29ja19pbml0KCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9yYXdzb2NrOworCisJcmMgPSBhZl9uZmNfaW5pdCgpOworCWlmIChyYykKKwkJZ290byBlcnJfYWZfbmZjOworCisJcmV0dXJuIDA7CisKK2Vycl9hZl9uZmM6CisJcmF3c29ja19leGl0KCk7CitlcnJfcmF3c29jazoKKwluZmNfZ2VubF9leGl0KCk7CitlcnJfZ2VubDoKKwljbGFzc191bnJlZ2lzdGVyKCZuZmNfY2xhc3MpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mY19leGl0KHZvaWQpCit7CisJYWZfbmZjX2V4aXQoKTsKKwlyYXdzb2NrX2V4aXQoKTsKKwluZmNfZ2VubF9leGl0KCk7CisJY2xhc3NfdW5yZWdpc3RlcigmbmZjX2NsYXNzKTsKK30KKworc3Vic3lzX2luaXRjYWxsKG5mY19pbml0KTsKK21vZHVsZV9leGl0KG5mY19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTGF1cm8gUmFtb3MgVmVuYW5jaW8gPGxhdXJvLnZlbmFuY2lvQG9wZW5ib3NzYS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5GQyBDb3JlIHZlciAiIFZFUlNJT04pOworTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvbmZjL25ldGxpbmsuYyBiL25ldC9uZmMvbmV0bGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZGZmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmZjL25ldGxpbmsuYwpAQCAtMCwwICsxLDUzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBJbnN0aXR1dG8gTm9raWEgZGUgVGVjbm9sb2dpYQorICoKKyAqIEF1dGhvcnM6CisgKiAgICBMYXVybyBSYW1vcyBWZW5hbmNpbyA8bGF1cm8udmVuYW5jaW9Ab3BlbmJvc3NhLm9yZz4KKyAqICAgIEFsb2lzaW8gQWxtZWlkYSBKciA8YWxvaXNpby5hbG1laWRhQG9wZW5ib3NzYS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25mYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm5mYy5oIgorCitzdGF0aWMgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwIG5mY19nZW5sX2V2ZW50X21jZ3JwID0geworCS5uYW1lID0gTkZDX0dFTkxfTUNBU1RfRVZFTlRfTkFNRSwKK307CisKK3N0cnVjdCBnZW5sX2ZhbWlseSBuZmNfZ2VubF9mYW1pbHkgPSB7CisJLmlkID0gR0VOTF9JRF9HRU5FUkFURSwKKwkuaGRyc2l6ZSA9IDAsCisJLm5hbWUgPSBORkNfR0VOTF9OQU1FLAorCS52ZXJzaW9uID0gTkZDX0dFTkxfVkVSU0lPTiwKKwkubWF4YXR0ciA9IE5GQ19BVFRSX01BWCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZmNfZ2VubF9wb2xpY3lbTkZDX0FUVFJfTUFYICsgMV0gPSB7CisJW05GQ19BVFRSX0RFVklDRV9JTkRFWF0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORkNfQVRUUl9ERVZJQ0VfTkFNRV0gPSB7IC50eXBlID0gTkxBX1NUUklORywKKwkJCQkubGVuID0gTkZDX0RFVklDRV9OQU1FX01BWFNJWkUgfSwKKwlbTkZDX0FUVFJfUFJPVE9DT0xTXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCit9OworCitzdGF0aWMgaW50IG5mY19nZW5sX3NlbmRfdGFyZ2V0KHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZmNfdGFyZ2V0ICp0YXJnZXQsCisJCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwgaW50IGZsYWdzKQoreworCXZvaWQgKmhkcjsKKworCW5mY19kYmcoImVudHJ5Iik7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLCBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJJm5mY19nZW5sX2ZhbWlseSwgZmxhZ3MsIE5GQ19DTURfR0VUX1RBUkdFVCk7CisJaWYgKCFoZHIpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlnZW5sX2R1bXBfY2hlY2tfY29uc2lzdGVudChjYiwgaGRyLCAmbmZjX2dlbmxfZmFtaWx5KTsKKworCU5MQV9QVVRfVTMyKG1zZywgTkZDX0FUVFJfVEFSR0VUX0lOREVYLCB0YXJnZXQtPmlkeCk7CisJTkxBX1BVVF9VMzIobXNnLCBORkNfQVRUUl9QUk9UT0NPTFMsCisJCQkJdGFyZ2V0LT5zdXBwb3J0ZWRfcHJvdG9jb2xzKTsKKwlOTEFfUFVUX1UxNihtc2csIE5GQ19BVFRSX1RBUkdFVF9TRU5TX1JFUywgdGFyZ2V0LT5zZW5zX3Jlcyk7CisJTkxBX1BVVF9VOChtc2csIE5GQ19BVFRSX1RBUkdFVF9TRUxfUkVTLCB0YXJnZXQtPnNlbF9yZXMpOworCisJcmV0dXJuIGdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKworbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgc3RydWN0IG5mY19kZXYgKl9fZ2V0X2RldmljZV9mcm9tX2NiKHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgbmZjX2RldiAqZGV2OworCWludCByYzsKKwl1MzIgaWR4OworCisJcmMgPSBubG1zZ19wYXJzZShjYi0+bmxoLCBHRU5MX0hEUkxFTiArIG5mY19nZW5sX2ZhbWlseS5oZHJzaXplLAorCQkJCQkJbmZjX2dlbmxfZmFtaWx5LmF0dHJidWYsCisJCQkJCQluZmNfZ2VubF9mYW1pbHkubWF4YXR0ciwKKwkJCQkJCW5mY19nZW5sX3BvbGljeSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIocmMpOworCisJaWYgKCFuZmNfZ2VubF9mYW1pbHkuYXR0cmJ1ZltORkNfQVRUUl9ERVZJQ0VfSU5ERVhdKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWlkeCA9IG5sYV9nZXRfdTMyKG5mY19nZW5sX2ZhbWlseS5hdHRyYnVmW05GQ19BVFRSX0RFVklDRV9JTkRFWF0pOworCisJZGV2ID0gbmZjX2dldF9kZXZpY2UoaWR4KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgaW50IG5mY19nZW5sX2R1bXBfdGFyZ2V0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlpbnQgaSA9IGNiLT5hcmdzWzBdOworCXN0cnVjdCBuZmNfZGV2ICpkZXYgPSAoc3RydWN0IG5mY19kZXYgKikgY2ItPmFyZ3NbMV07CisJaW50IHJjOworCisJbmZjX2RiZygiZW50cnkiKTsKKworCWlmICghZGV2KSB7CisJCWRldiA9IF9fZ2V0X2RldmljZV9mcm9tX2NiKGNiKTsKKwkJaWYgKElTX0VSUihkZXYpKQorCQkJcmV0dXJuIFBUUl9FUlIoZGV2KTsKKworCQljYi0+YXJnc1sxXSA9IChsb25nKSBkZXY7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZkZXYtPnRhcmdldHNfbG9jayk7CisKKwljYi0+c2VxID0gZGV2LT50YXJnZXRzX2dlbmVyYXRpb247CisKKwl3aGlsZSAoaSA8IGRldi0+bl90YXJnZXRzKSB7CisJCXJjID0gbmZjX2dlbmxfc2VuZF90YXJnZXQoc2tiLCAmZGV2LT50YXJnZXRzW2ldLCBjYiwKKwkJCQkJCQkJTkxNX0ZfTVVMVEkpOworCQlpZiAocmMgPCAwKQorCQkJYnJlYWs7CisKKwkJaSsrOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZkZXYtPnRhcmdldHNfbG9jayk7CisKKwljYi0+YXJnc1swXSA9IGk7CisKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK3N0YXRpYyBpbnQgbmZjX2dlbmxfZHVtcF90YXJnZXRzX2RvbmUoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBuZmNfZGV2ICpkZXYgPSAoc3RydWN0IG5mY19kZXYgKikgY2ItPmFyZ3NbMV07CisKKwluZmNfZGJnKCJlbnRyeSIpOworCisJaWYgKGRldikKKwkJbmZjX3B1dF9kZXZpY2UoZGV2KTsKKworCXJldHVybiAwOworfQorCitpbnQgbmZjX2dlbmxfdGFyZ2V0c19mb3VuZChzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCXN0cnVjdCBza19idWZmICptc2c7CisJdm9pZCAqaGRyOworCisJbmZjX2RiZygiZW50cnkiKTsKKworCWRldi0+Z2VubF9kYXRhLnBvbGxfcmVxX3BpZCA9IDA7CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9BVE9NSUMpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgMCwgMCwgJm5mY19nZW5sX2ZhbWlseSwgMCwKKwkJCQlORkNfRVZFTlRfVEFSR0VUU19GT1VORCk7CisJaWYgKCFoZHIpCisJCWdvdG8gZnJlZV9tc2c7CisKKwlOTEFfUFVUX1UzMihtc2csIE5GQ19BVFRSX0RFVklDRV9JTkRFWCwgZGV2LT5pZHgpOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCisJcmV0dXJuIGdlbmxtc2dfbXVsdGljYXN0KG1zZywgMCwgbmZjX2dlbmxfZXZlbnRfbWNncnAuaWQsIEdGUF9BVE9NSUMpOworCitubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworZnJlZV9tc2c6CisJbmxtc2dfZnJlZShtc2cpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK2ludCBuZmNfZ2VubF9kZXZpY2VfYWRkZWQoc3RydWN0IG5mY19kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXZvaWQgKmhkcjsKKworCW5mY19kYmcoImVudHJ5Iik7CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgMCwgMCwgJm5mY19nZW5sX2ZhbWlseSwgMCwKKwkJCQlORkNfRVZFTlRfREVWSUNFX0FEREVEKTsKKwlpZiAoIWhkcikKKwkJZ290byBmcmVlX21zZzsKKworCU5MQV9QVVRfU1RSSU5HKG1zZywgTkZDX0FUVFJfREVWSUNFX05BTUUsIG5mY19kZXZpY2VfbmFtZShkZXYpKTsKKwlOTEFfUFVUX1UzMihtc2csIE5GQ19BVFRSX0RFVklDRV9JTkRFWCwgZGV2LT5pZHgpOworCU5MQV9QVVRfVTMyKG1zZywgTkZDX0FUVFJfUFJPVE9DT0xTLCBkZXYtPnN1cHBvcnRlZF9wcm90b2NvbHMpOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCisJZ2VubG1zZ19tdWx0aWNhc3QobXNnLCAwLCBuZmNfZ2VubF9ldmVudF9tY2dycC5pZCwgR0ZQX0tFUk5FTCk7CisKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKK2ZyZWVfbXNnOgorCW5sbXNnX2ZyZWUobXNnKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitpbnQgbmZjX2dlbmxfZGV2aWNlX3JlbW92ZWQoc3RydWN0IG5mY19kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXZvaWQgKmhkcjsKKworCW5mY19kYmcoImVudHJ5Iik7CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgMCwgMCwgJm5mY19nZW5sX2ZhbWlseSwgMCwKKwkJCQlORkNfRVZFTlRfREVWSUNFX1JFTU9WRUQpOworCWlmICghaGRyKQorCQlnb3RvIGZyZWVfbXNnOworCisJTkxBX1BVVF9VMzIobXNnLCBORkNfQVRUUl9ERVZJQ0VfSU5ERVgsIGRldi0+aWR4KTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKworCWdlbmxtc2dfbXVsdGljYXN0KG1zZywgMCwgbmZjX2dlbmxfZXZlbnRfbWNncnAuaWQsIEdGUF9LRVJORUwpOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CitmcmVlX21zZzoKKwlubG1zZ19mcmVlKG1zZyk7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCBuZmNfZ2VubF9zZW5kX2RldmljZShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmZjX2RldiAqZGV2LAorCQkJCQkJdTMyIHBpZCwgdTMyIHNlcSwKKwkJCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCQkJCWludCBmbGFncykKK3sKKwl2b2lkICpoZHI7CisKKwluZmNfZGJnKCJlbnRyeSIpOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwaWQsIHNlcSwgJm5mY19nZW5sX2ZhbWlseSwgZmxhZ3MsCisJCQkJCQkJTkZDX0NNRF9HRVRfREVWSUNFKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmIChjYikKKwkJZ2VubF9kdW1wX2NoZWNrX2NvbnNpc3RlbnQoY2IsIGhkciwgJm5mY19nZW5sX2ZhbWlseSk7CisKKwlOTEFfUFVUX1NUUklORyhtc2csIE5GQ19BVFRSX0RFVklDRV9OQU1FLCBuZmNfZGV2aWNlX25hbWUoZGV2KSk7CisJTkxBX1BVVF9VMzIobXNnLCBORkNfQVRUUl9ERVZJQ0VfSU5ERVgsIGRldi0+aWR4KTsKKwlOTEFfUFVUX1UzMihtc2csIE5GQ19BVFRSX1BST1RPQ09MUywgZGV2LT5zdXBwb3J0ZWRfcHJvdG9jb2xzKTsKKworCXJldHVybiBnZW5sbXNnX2VuZChtc2csIGhkcik7CisKK25sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCBuZmNfZ2VubF9kdW1wX2RldmljZXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IGNsYXNzX2Rldl9pdGVyICppdGVyID0gKHN0cnVjdCBjbGFzc19kZXZfaXRlciAqKSBjYi0+YXJnc1swXTsKKwlzdHJ1Y3QgbmZjX2RldiAqZGV2ID0gKHN0cnVjdCBuZmNfZGV2ICopIGNiLT5hcmdzWzFdOworCWJvb2wgZmlyc3RfY2FsbCA9IGZhbHNlOworCisJbmZjX2RiZygiZW50cnkiKTsKKworCWlmICghaXRlcikgeworCQlmaXJzdF9jYWxsID0gdHJ1ZTsKKwkJaXRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbGFzc19kZXZfaXRlciksIEdGUF9LRVJORUwpOworCQlpZiAoIWl0ZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJY2ItPmFyZ3NbMF0gPSAobG9uZykgaXRlcjsKKwl9CisKKwltdXRleF9sb2NrKCZuZmNfZGV2bGlzdF9tdXRleCk7CisKKwljYi0+c2VxID0gbmZjX2Rldmxpc3RfZ2VuZXJhdGlvbjsKKworCWlmIChmaXJzdF9jYWxsKSB7CisJCW5mY19kZXZpY2VfaXRlcl9pbml0KGl0ZXIpOworCQlkZXYgPSBuZmNfZGV2aWNlX2l0ZXJfbmV4dChpdGVyKTsKKwl9CisKKwl3aGlsZSAoZGV2KSB7CisJCWludCByYzsKKworCQlyYyA9IG5mY19nZW5sX3NlbmRfZGV2aWNlKHNrYiwgZGV2LCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKKwkJCQkJCQljYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCQkJY2IsIE5MTV9GX01VTFRJKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCisJCWRldiA9IG5mY19kZXZpY2VfaXRlcl9uZXh0KGl0ZXIpOworCX0KKworCW11dGV4X3VubG9jaygmbmZjX2Rldmxpc3RfbXV0ZXgpOworCisJY2ItPmFyZ3NbMV0gPSAobG9uZykgZGV2OworCisJcmV0dXJuIHNrYi0+bGVuOworfQorCitzdGF0aWMgaW50IG5mY19nZW5sX2R1bXBfZGV2aWNlc19kb25lKHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgKml0ZXIgPSAoc3RydWN0IGNsYXNzX2Rldl9pdGVyICopIGNiLT5hcmdzWzBdOworCisJbmZjX2RiZygiZW50cnkiKTsKKworCW5mY19kZXZpY2VfaXRlcl9leGl0KGl0ZXIpOworCWtmcmVlKGl0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZjX2dlbmxfZ2V0X2RldmljZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBza19idWZmICptc2c7CisJc3RydWN0IG5mY19kZXYgKmRldjsKKwl1MzIgaWR4OworCWludCByYyA9IC1FTk9CVUZTOworCisJbmZjX2RiZygiZW50cnkiKTsKKworCWlmICghaW5mby0+YXR0cnNbTkZDX0FUVFJfREVWSUNFX0lOREVYXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZHggPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tORkNfQVRUUl9ERVZJQ0VfSU5ERVhdKTsKKworCWRldiA9IG5mY19nZXRfZGV2aWNlKGlkeCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJbXNnID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3B1dGRldjsKKwl9CisKKwlyYyA9IG5mY19nZW5sX3NlbmRfZGV2aWNlKG1zZywgZGV2LCBpbmZvLT5zbmRfcGlkLCBpbmZvLT5zbmRfc2VxLAorCQkJCQkJCQlOVUxMLCAwKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJbmZjX3B1dF9kZXZpY2UoZGV2KTsKKworCXJldHVybiBnZW5sbXNnX3JlcGx5KG1zZywgaW5mbyk7CisKK291dF9mcmVlOgorCW5sbXNnX2ZyZWUobXNnKTsKK291dF9wdXRkZXY6CisJbmZjX3B1dF9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbmZjX2dlbmxfc3RhcnRfcG9sbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBuZmNfZGV2ICpkZXY7CisJaW50IHJjOworCXUzMiBpZHg7CisJdTMyIHByb3RvY29sczsKKworCW5mY19kYmcoImVudHJ5Iik7CisKKwlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0gfHwKKwkJIWluZm8tPmF0dHJzW05GQ19BVFRSX1BST1RPQ09MU10pCisJCXJldHVybiAtRUlOVkFMOworCisJaWR4ID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkZDX0FUVFJfREVWSUNFX0lOREVYXSk7CisJcHJvdG9jb2xzID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkZDX0FUVFJfUFJPVE9DT0xTXSk7CisKKwlkZXYgPSBuZmNfZ2V0X2RldmljZShpZHgpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW11dGV4X2xvY2soJmRldi0+Z2VubF9kYXRhLmdlbmxfZGF0YV9tdXRleCk7CisKKwlyYyA9IG5mY19zdGFydF9wb2xsKGRldiwgcHJvdG9jb2xzKTsKKwlpZiAoIXJjKQorCQlkZXYtPmdlbmxfZGF0YS5wb2xsX3JlcV9waWQgPSBpbmZvLT5zbmRfcGlkOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmdlbmxfZGF0YS5nZW5sX2RhdGFfbXV0ZXgpOworCisJbmZjX3B1dF9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbmZjX2dlbmxfc3RvcF9wb2xsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5mY19kZXYgKmRldjsKKwlpbnQgcmM7CisJdTMyIGlkeDsKKworCW5mY19kYmcoImVudHJ5Iik7CisKKwlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWR4ID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkZDX0FUVFJfREVWSUNFX0lOREVYXSk7CisKKwlkZXYgPSBuZmNfZ2V0X2RldmljZShpZHgpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW11dGV4X2xvY2soJmRldi0+Z2VubF9kYXRhLmdlbmxfZGF0YV9tdXRleCk7CisKKwlpZiAoZGV2LT5nZW5sX2RhdGEucG9sbF9yZXFfcGlkICE9IGluZm8tPnNuZF9waWQpIHsKKwkJcmMgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gbmZjX3N0b3BfcG9sbChkZXYpOworCWRldi0+Z2VubF9kYXRhLnBvbGxfcmVxX3BpZCA9IDA7CisKK291dDoKKwltdXRleF91bmxvY2soJmRldi0+Z2VubF9kYXRhLmdlbmxfZGF0YV9tdXRleCk7CisJbmZjX3B1dF9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9vcHMgbmZjX2dlbmxfb3BzW10gPSB7CisJeworCQkuY21kID0gTkZDX0NNRF9HRVRfREVWSUNFLAorCQkuZG9pdCA9IG5mY19nZW5sX2dldF9kZXZpY2UsCisJCS5kdW1waXQgPSBuZmNfZ2VubF9kdW1wX2RldmljZXMsCisJCS5kb25lID0gbmZjX2dlbmxfZHVtcF9kZXZpY2VzX2RvbmUsCisJCS5wb2xpY3kgPSBuZmNfZ2VubF9wb2xpY3ksCisJfSwKKwl7CisJCS5jbWQgPSBORkNfQ01EX1NUQVJUX1BPTEwsCisJCS5kb2l0ID0gbmZjX2dlbmxfc3RhcnRfcG9sbCwKKwkJLnBvbGljeSA9IG5mY19nZW5sX3BvbGljeSwKKwl9LAorCXsKKwkJLmNtZCA9IE5GQ19DTURfU1RPUF9QT0xMLAorCQkuZG9pdCA9IG5mY19nZW5sX3N0b3BfcG9sbCwKKwkJLnBvbGljeSA9IG5mY19nZW5sX3BvbGljeSwKKwl9LAorCXsKKwkJLmNtZCA9IE5GQ19DTURfR0VUX1RBUkdFVCwKKwkJLmR1bXBpdCA9IG5mY19nZW5sX2R1bXBfdGFyZ2V0cywKKwkJLmRvbmUgPSBuZmNfZ2VubF9kdW1wX3RhcmdldHNfZG9uZSwKKwkJLnBvbGljeSA9IG5mY19nZW5sX3BvbGljeSwKKwl9LAorfTsKKworc3RhdGljIGludCBuZmNfZ2VubF9yY3ZfbmxfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJCQkJdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRsaW5rX25vdGlmeSAqbiA9IHB0cjsKKwlzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjsKKwlzdHJ1Y3QgbmZjX2RldiAqZGV2OworCisJaWYgKGV2ZW50ICE9IE5FVExJTktfVVJFTEVBU0UgfHwgbi0+cHJvdG9jb2wgIT0gTkVUTElOS19HRU5FUklDKQorCQlnb3RvIG91dDsKKworCW5mY19kYmcoIk5FVExJTktfVVJFTEVBU0UgZXZlbnQgZnJvbSBpZCAlZCIsIG4tPnBpZCk7CisKKwluZmNfZGV2aWNlX2l0ZXJfaW5pdCgmaXRlcik7CisJZGV2ID0gbmZjX2RldmljZV9pdGVyX25leHQoJml0ZXIpOworCisJd2hpbGUgKGRldikgeworCQltdXRleF9sb2NrKCZkZXYtPmdlbmxfZGF0YS5nZW5sX2RhdGFfbXV0ZXgpOworCQlpZiAoZGV2LT5nZW5sX2RhdGEucG9sbF9yZXFfcGlkID09IG4tPnBpZCkgeworCQkJbmZjX3N0b3BfcG9sbChkZXYpOworCQkJZGV2LT5nZW5sX2RhdGEucG9sbF9yZXFfcGlkID0gMDsKKwkJfQorCQltdXRleF91bmxvY2soJmRldi0+Z2VubF9kYXRhLmdlbmxfZGF0YV9tdXRleCk7CisJCWRldiA9IG5mY19kZXZpY2VfaXRlcl9uZXh0KCZpdGVyKTsKKwl9CisKKwluZmNfZGV2aWNlX2l0ZXJfZXhpdCgmaXRlcik7CisKK291dDoKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3ZvaWQgbmZjX2dlbmxfZGF0YV9pbml0KHN0cnVjdCBuZmNfZ2VubF9kYXRhICpnZW5sX2RhdGEpCit7CisJZ2VubF9kYXRhLT5wb2xsX3JlcV9waWQgPSAwOworCW11dGV4X2luaXQoJmdlbmxfZGF0YS0+Z2VubF9kYXRhX211dGV4KTsKK30KKwordm9pZCBuZmNfZ2VubF9kYXRhX2V4aXQoc3RydWN0IG5mY19nZW5sX2RhdGEgKmdlbmxfZGF0YSkKK3sKKwltdXRleF9kZXN0cm95KCZnZW5sX2RhdGEtPmdlbmxfZGF0YV9tdXRleCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbmxfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgID0gbmZjX2dlbmxfcmN2X25sX2V2ZW50LAorfTsKKworLyoqCisgKiBuZmNfZ2VubF9pbml0KCkgLSBJbml0aWFsaXplIG5ldGxpbmsgaW50ZXJmYWNlCisgKgorICogVGhpcyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIG5mYyBuZXRsaW5rIGZhbWlseS4KKyAqLworaW50IF9faW5pdCBuZmNfZ2VubF9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJcmMgPSBnZW5sX3JlZ2lzdGVyX2ZhbWlseV93aXRoX29wcygmbmZjX2dlbmxfZmFtaWx5LCBuZmNfZ2VubF9vcHMsCisJCQkJCUFSUkFZX1NJWkUobmZjX2dlbmxfb3BzKSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGdlbmxfcmVnaXN0ZXJfbWNfZ3JvdXAoJm5mY19nZW5sX2ZhbWlseSwgJm5mY19nZW5sX2V2ZW50X21jZ3JwKTsKKworCW5ldGxpbmtfcmVnaXN0ZXJfbm90aWZpZXIoJm5sX25vdGlmaWVyKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBuZmNfZ2VubF9leGl0KCkgLSBEZWluaXRpYWxpemUgbmV0bGluayBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIGV4aXQgZnVuY3Rpb24gdW5yZWdpc3RlcnMgdGhlIG5mYyBuZXRsaW5rIGZhbWlseS4KKyAqLwordm9pZCBuZmNfZ2VubF9leGl0KHZvaWQpCit7CisJbmV0bGlua191bnJlZ2lzdGVyX25vdGlmaWVyKCZubF9ub3RpZmllcik7CisJZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmbmZjX2dlbmxfZmFtaWx5KTsKK30KZGlmZiAtLWdpdCBhL25ldC9uZmMvbmZjLmggYi9uZXQvbmZjL25mYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZjk4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmZjL25mYy5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhCisgKgorICogQXV0aG9yczoKKyAqICAgIExhdXJvIFJhbW9zIFZlbmFuY2lvIDxsYXVyby52ZW5hbmNpb0BvcGVuYm9zc2Eub3JnPgorICogICAgQWxvaXNpbyBBbG1laWRhIEpyIDxhbG9pc2lvLmFsbWVpZGFAb3BlbmJvc3NhLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19MT0NBTF9ORkNfSAorI2RlZmluZSBfX0xPQ0FMX05GQ19ICisKKyNpbmNsdWRlIDxuZXQvbmZjLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKK2ludCBuZmNfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKyNkZWZpbmUgbmZjX2luZm8oZm10LCBhcmcuLi4pIG5mY19wcmludGsoS0VSTl9JTkZPLCBmbXQsICMjYXJnKQorI2RlZmluZSBuZmNfZXJyKGZtdCwgYXJnLi4uKSBuZmNfcHJpbnRrKEtFUk5fRVJSLCBmbXQsICMjYXJnKQorI2RlZmluZSBuZmNfZGJnKGZtdCwgYXJnLi4uKSBwcl9kZWJ1ZyhmbXQgIlxuIiwgIyNhcmcpCisKK3N0cnVjdCBuZmNfcHJvdG9jb2wgeworCWludCBpZDsKKwlzdHJ1Y3QgcHJvdG8gKnByb3RvOworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCWludCAoKmNyZWF0ZSkoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJY29uc3Qgc3RydWN0IG5mY19wcm90b2NvbCAqbmZjX3Byb3RvKTsKK307CisKK3N0cnVjdCBuZmNfcmF3c29jayB7CisJc3RydWN0IHNvY2sgc2s7CisJc3RydWN0IG5mY19kZXYgKmRldjsKKwl1MzIgdGFyZ2V0X2lkeDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfd29yazsKKwlib29sIHR4X3dvcmtfc2NoZWR1bGVkOworfTsKKyNkZWZpbmUgbmZjX3Jhd3NvY2soc2spICgoc3RydWN0IG5mY19yYXdzb2NrICopIHNrKQorI2RlZmluZSB0b19yYXdzb2NrX3NrKF90eF93b3JrKSBcCisJKChzdHJ1Y3Qgc29jayAqKSBjb250YWluZXJfb2YoX3R4X3dvcmssIHN0cnVjdCBuZmNfcmF3c29jaywgdHhfd29yaykpCisKK2ludCBfX2luaXQgcmF3c29ja19pbml0KHZvaWQpOwordm9pZCByYXdzb2NrX2V4aXQodm9pZCk7CisKK2ludCBfX2luaXQgYWZfbmZjX2luaXQodm9pZCk7Cit2b2lkIGFmX25mY19leGl0KHZvaWQpOworaW50IG5mY19wcm90b19yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgbmZjX3Byb3RvY29sICpuZmNfcHJvdG8pOwordm9pZCBuZmNfcHJvdG9fdW5yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgbmZjX3Byb3RvY29sICpuZmNfcHJvdG8pOworCitleHRlcm4gaW50IG5mY19kZXZsaXN0X2dlbmVyYXRpb247CitleHRlcm4gc3RydWN0IG11dGV4IG5mY19kZXZsaXN0X211dGV4OworCitpbnQgX19pbml0IG5mY19nZW5sX2luaXQodm9pZCk7Cit2b2lkIG5mY19nZW5sX2V4aXQodm9pZCk7CisKK3ZvaWQgbmZjX2dlbmxfZGF0YV9pbml0KHN0cnVjdCBuZmNfZ2VubF9kYXRhICpnZW5sX2RhdGEpOwordm9pZCBuZmNfZ2VubF9kYXRhX2V4aXQoc3RydWN0IG5mY19nZW5sX2RhdGEgKmdlbmxfZGF0YSk7CisKK2ludCBuZmNfZ2VubF90YXJnZXRzX2ZvdW5kKHN0cnVjdCBuZmNfZGV2ICpkZXYpOworCitpbnQgbmZjX2dlbmxfZGV2aWNlX2FkZGVkKHN0cnVjdCBuZmNfZGV2ICpkZXYpOworaW50IG5mY19nZW5sX2RldmljZV9yZW1vdmVkKHN0cnVjdCBuZmNfZGV2ICpkZXYpOworCitzdHJ1Y3QgbmZjX2RldiAqbmZjX2dldF9kZXZpY2UodW5zaWduZWQgaWR4KTsKKworc3RhdGljIGlubGluZSB2b2lkIG5mY19wdXRfZGV2aWNlKHN0cnVjdCBuZmNfZGV2ICpkZXYpCit7CisJcHV0X2RldmljZSgmZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmZjX2RldmljZV9pdGVyX2luaXQoc3RydWN0IGNsYXNzX2Rldl9pdGVyICppdGVyKQoreworCWNsYXNzX2Rldl9pdGVyX2luaXQoaXRlciwgJm5mY19jbGFzcywgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5mY19kZXYgKm5mY19kZXZpY2VfaXRlcl9uZXh0KHN0cnVjdCBjbGFzc19kZXZfaXRlciAqaXRlcikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkID0gY2xhc3NfZGV2X2l0ZXJfbmV4dChpdGVyKTsKKwlpZiAoIWQpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHRvX25mY19kZXYoZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZmNfZGV2aWNlX2l0ZXJfZXhpdChzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgKml0ZXIpCit7CisJY2xhc3NfZGV2X2l0ZXJfZXhpdChpdGVyKTsKK30KKworaW50IG5mY19zdGFydF9wb2xsKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHUzMiBwcm90b2NvbHMpOworCitpbnQgbmZjX3N0b3BfcG9sbChzdHJ1Y3QgbmZjX2RldiAqZGV2KTsKKworaW50IG5mY19hY3RpdmF0ZV90YXJnZXQoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgsIHUzMiBwcm90b2NvbCk7CisKK2ludCBuZmNfZGVhY3RpdmF0ZV90YXJnZXQoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgpOworCitpbnQgbmZjX2RhdGFfZXhjaGFuZ2Uoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IsCisJCQkJCWRhdGFfZXhjaGFuZ2VfY2JfdCBjYiwKKwkJCQkJdm9pZCAqY2JfY29udGV4dCk7CisKKyNlbmRpZiAvKiBfX0xPQ0FMX05GQ19IICovCmRpZmYgLS1naXQgYS9uZXQvbmZjL3Jhd3NvY2suYyBiL25ldC9uZmMvcmF3c29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZGU4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmZjL3Jhd3NvY2suYwpAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBJbnN0aXR1dG8gTm9raWEgZGUgVGVjbm9sb2dpYQorICoKKyAqIEF1dGhvcnM6CisgKiAgICBBbG9pc2lvIEFsbWVpZGEgSnIgPGFsb2lzaW8uYWxtZWlkYUBvcGVuYm9zc2Eub3JnPgorICogICAgTGF1cm8gUmFtb3MgVmVuYW5jaW8gPGxhdXJvLnZlbmFuY2lvQG9wZW5ib3NzYS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bmV0L3RjcF9zdGF0ZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZmMuaD4KKworI2luY2x1ZGUgIm5mYy5oIgorCitzdGF0aWMgdm9pZCByYXdzb2NrX3dyaXRlX3F1ZXVlX3B1cmdlKHN0cnVjdCBzb2NrICpzaykKK3sKKwluZmNfZGJnKCJzaz0lcCIsIHNrKTsKKworCXNwaW5fbG9ja19iaCgmc2stPnNrX3dyaXRlX3F1ZXVlLmxvY2spOworCV9fc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfd3JpdGVfcXVldWUpOworCW5mY19yYXdzb2NrKHNrKS0+dHhfd29ya19zY2hlZHVsZWQgPSBmYWxzZTsKKwlzcGluX3VubG9ja19iaCgmc2stPnNrX3dyaXRlX3F1ZXVlLmxvY2spOworfQorCitzdGF0aWMgdm9pZCByYXdzb2NrX3JlcG9ydF9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIGludCBlcnIpCit7CisJbmZjX2RiZygic2s9JXAgZXJyPSVkIiwgc2ssIGVycik7CisKKwlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOworCXNrLT5za19lcnIgPSAtZXJyOworCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOworCisJcmF3c29ja193cml0ZV9xdWV1ZV9wdXJnZShzayk7Cit9CisKK3N0YXRpYyBpbnQgcmF3c29ja19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwluZmNfZGJnKCJzb2NrPSVwIiwgc29jayk7CisKKwlzb2NrX29ycGhhbihzayk7CisJc29ja19wdXQoc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmF3c29ja19jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqX2FkZHIsCisJCQkJCQkJaW50IGxlbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBzb2NrYWRkcl9uZmMgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX25mYyAqKV9hZGRyOworCXN0cnVjdCBuZmNfZGV2ICpkZXY7CisJaW50IHJjID0gMDsKKworCW5mY19kYmcoInNvY2s9JXAgc2s9JXAgZmxhZ3M9JWQiLCBzb2NrLCBzaywgZmxhZ3MpOworCisJaWYgKCFhZGRyIHx8IGxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbmZjKSB8fAorCQlhZGRyLT5zYV9mYW1pbHkgIT0gQUZfTkZDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5mY19kYmcoImFkZHIgZGV2X2lkeD0ldSB0YXJnZXRfaWR4PSV1IHByb3RvY29sPSV1IiwgYWRkci0+ZGV2X2lkeCwKKwkJCQkJYWRkci0+dGFyZ2V0X2lkeCwgYWRkci0+bmZjX3Byb3RvY29sKTsKKworCWxvY2tfc29jayhzayk7CisKKwlpZiAoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVEVEKSB7CisJCXJjID0gLUVJU0NPTk47CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2ID0gbmZjX2dldF9kZXZpY2UoYWRkci0+ZGV2X2lkeCk7CisJaWYgKCFkZXYpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChhZGRyLT50YXJnZXRfaWR4ID4gZGV2LT50YXJnZXRfaWR4IC0gMSB8fAorCQlhZGRyLT50YXJnZXRfaWR4IDwgZGV2LT50YXJnZXRfaWR4IC0gZGV2LT5uX3RhcmdldHMpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChhZGRyLT50YXJnZXRfaWR4ID4gZGV2LT50YXJnZXRfaWR4IC0gMSB8fAorCQlhZGRyLT50YXJnZXRfaWR4IDwgZGV2LT50YXJnZXRfaWR4IC0gZGV2LT5uX3RhcmdldHMpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCXJjID0gbmZjX2FjdGl2YXRlX3RhcmdldChkZXYsIGFkZHItPnRhcmdldF9pZHgsIGFkZHItPm5mY19wcm90b2NvbCk7CisJaWYgKHJjKQorCQlnb3RvIHB1dF9kZXY7CisKKwluZmNfcmF3c29jayhzayktPmRldiA9IGRldjsKKwluZmNfcmF3c29jayhzayktPnRhcmdldF9pZHggPSBhZGRyLT50YXJnZXRfaWR4OworCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVEVEOworCXNrLT5za19zdGF0ZSA9IFRDUF9FU1RBQkxJU0hFRDsKKwlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIDA7CisKK3B1dF9kZXY6CisJbmZjX3B1dF9kZXZpY2UoZGV2KTsKK2Vycm9yOgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJhd3NvY2tfYWRkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCisJaWYgKHNrYl9jb3dfaGVhZChza2IsIDEpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCSpza2JfcHVzaChza2IsIDEpID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByYXdzb2NrX2RhdGFfZXhjaGFuZ2VfY29tcGxldGUodm9pZCAqY29udGV4dCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJCQkJaW50IGVycikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKikgY29udGV4dDsKKworCUJVR19PTihpbl9pcnEoKSk7CisKKwluZmNfZGJnKCJzaz0lcCBlcnI9JWQiLCBzaywgZXJyKTsKKworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwllcnIgPSByYXdzb2NrX2FkZF9oZWFkZXIoc2tiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJZXJyID0gc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwlzcGluX2xvY2tfYmgoJnNrLT5za193cml0ZV9xdWV1ZS5sb2NrKTsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkKKwkJc2NoZWR1bGVfd29yaygmbmZjX3Jhd3NvY2soc2spLT50eF93b3JrKTsKKwllbHNlCisJCW5mY19yYXdzb2NrKHNrKS0+dHhfd29ya19zY2hlZHVsZWQgPSBmYWxzZTsKKwlzcGluX3VubG9ja19iaCgmc2stPnNrX3dyaXRlX3F1ZXVlLmxvY2spOworCisJc29ja19wdXQoc2spOworCXJldHVybjsKKworZXJyb3I6CisJcmF3c29ja19yZXBvcnRfZXJyb3Ioc2ssIGVycik7CisJc29ja19wdXQoc2spOworfQorCitzdGF0aWMgdm9pZCByYXdzb2NrX3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHRvX3Jhd3NvY2tfc2sod29yayk7CisJc3RydWN0IG5mY19kZXYgKmRldiA9IG5mY19yYXdzb2NrKHNrKS0+ZGV2OworCXUzMiB0YXJnZXRfaWR4ID0gbmZjX3Jhd3NvY2soc2spLT50YXJnZXRfaWR4OworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJjOworCisJbmZjX2RiZygic2s9JXAgdGFyZ2V0X2lkeD0ldSIsIHNrLCB0YXJnZXRfaWR4KTsKKworCWlmIChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSB7CisJCXJhd3NvY2tfd3JpdGVfcXVldWVfcHVyZ2Uoc2spOworCQlyZXR1cm47CisJfQorCisJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za193cml0ZV9xdWV1ZSk7CisKKwlzb2NrX2hvbGQoc2spOworCXJjID0gbmZjX2RhdGFfZXhjaGFuZ2UoZGV2LCB0YXJnZXRfaWR4LCBza2IsCisJCQkJcmF3c29ja19kYXRhX2V4Y2hhbmdlX2NvbXBsZXRlLCBzayk7CisJaWYgKHJjKSB7CisJCXJhd3NvY2tfcmVwb3J0X2Vycm9yKHNrLCByYyk7CisJCXNvY2tfcHV0KHNrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmF3c29ja19zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJjOworCisJbmZjX2RiZygic29jaz0lcCBzaz0lcCBsZW49JXp1Iiwgc29jaywgc2ssIGxlbik7CisKKwlpZiAobXNnLT5tc2dfbmFtZWxlbikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHNvY2stPnN0YXRlICE9IFNTX0NPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIGxlbiwgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsCisJCQkJCQkJCQkmcmMpOworCWlmICghc2tiKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKKwlpZiAocmMgPCAwKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gcmM7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZzay0+c2tfd3JpdGVfcXVldWUubG9jayk7CisJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOworCWlmICghbmZjX3Jhd3NvY2soc2spLT50eF93b3JrX3NjaGVkdWxlZCkgeworCQlzY2hlZHVsZV93b3JrKCZuZmNfcmF3c29jayhzayktPnR4X3dvcmspOworCQluZmNfcmF3c29jayhzayktPnR4X3dvcmtfc2NoZWR1bGVkID0gdHJ1ZTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnNrLT5za193cml0ZV9xdWV1ZS5sb2NrKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcmF3c29ja19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK3sKKwlpbnQgbm9ibG9jayA9IGZsYWdzICYgTVNHX0RPTlRXQUlUOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGNvcGllZDsKKwlpbnQgcmM7CisKKwluZmNfZGJnKCJzb2NrPSVwIHNrPSVwIGxlbj0lenUgZmxhZ3M9JWQiLCBzb2NrLCBzaywgbGVuLCBmbGFncyk7CisKKwlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MsIG5vYmxvY2ssICZyYyk7CisJaWYgKCFza2IpCisJCXJldHVybiByYzsKKworCW1zZy0+bXNnX25hbWVsZW4gPSAwOworCisJY29waWVkID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IGNvcGllZCkgeworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJCWNvcGllZCA9IGxlbjsKKwl9CisKKwlyYyA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOworCisJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CisKKwlyZXR1cm4gcmMgPyA6IGNvcGllZDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyByYXdzb2NrX29wcyA9IHsKKwkuZmFtaWx5ICAgICAgICAgPSBQRl9ORkMsCisJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UgICAgICAgID0gcmF3c29ja19yZWxlYXNlLAorCS5iaW5kICAgICAgICAgICA9IHNvY2tfbm9fYmluZCwKKwkuY29ubmVjdCAgICAgICAgPSByYXdzb2NrX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgICAgID0gc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgICAgICAgICA9IHNvY2tfbm9fYWNjZXB0LAorCS5nZXRuYW1lICAgICAgICA9IHNvY2tfbm9fZ2V0bmFtZSwKKwkucG9sbCAgICAgICAgICAgPSBkYXRhZ3JhbV9wb2xsLAorCS5pb2N0bCAgICAgICAgICA9IHNvY2tfbm9faW9jdGwsCisJLmxpc3RlbiAgICAgICAgID0gc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duICAgICAgID0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdCAgICAgPSBzb2NrX25vX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgICAgID0gc29ja19ub19nZXRzb2Nrb3B0LAorCS5zZW5kbXNnICAgICAgICA9IHJhd3NvY2tfc2VuZG1zZywKKwkucmVjdm1zZyAgICAgICAgPSByYXdzb2NrX3JlY3Ztc2csCisJLm1tYXAgICAgICAgICAgID0gc29ja19ub19tbWFwLAorfTsKKworc3RhdGljIHZvaWQgcmF3c29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJbmZjX2RiZygic2s9JXAiLCBzayk7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCkgeworCQluZmNfZGVhY3RpdmF0ZV90YXJnZXQobmZjX3Jhd3NvY2soc2spLT5kZXYsCisJCQkJCW5mY19yYXdzb2NrKHNrKS0+dGFyZ2V0X2lkeCk7CisJCW5mY19wdXRfZGV2aWNlKG5mY19yYXdzb2NrKHNrKS0+ZGV2KTsKKwl9CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CisJCW5mY19lcnIoIkZyZWVpbmcgYWxpdmUgTkZDIHJhdyBzb2NrZXQgJXAiLCBzayk7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmF3c29ja19jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCWNvbnN0IHN0cnVjdCBuZmNfcHJvdG9jb2wgKm5mY19wcm90bykKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwluZmNfZGJnKCJzb2NrPSVwIiwgc29jayk7CisKKwlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisKKwlzb2NrLT5vcHMgPSAmcmF3c29ja19vcHM7CisKKwlzayA9IHNrX2FsbG9jKG5ldCwgUEZfTkZDLCBHRlBfS0VSTkVMLCBuZmNfcHJvdG8tPnByb3RvKTsKKwlpZiAoIXNrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNvY2tfaW5pdF9kYXRhKHNvY2ssIHNrKTsKKwlzay0+c2tfcHJvdG9jb2wgPSBuZmNfcHJvdG8tPmlkOworCXNrLT5za19kZXN0cnVjdCA9IHJhd3NvY2tfZGVzdHJ1Y3Q7CisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKworCUlOSVRfV09SSygmbmZjX3Jhd3NvY2soc2spLT50eF93b3JrLCByYXdzb2NrX3R4X3dvcmspOworCW5mY19yYXdzb2NrKHNrKS0+dHhfd29ya19zY2hlZHVsZWQgPSBmYWxzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvIHJhd3NvY2tfcHJvdG8gPSB7CisJLm5hbWUgICAgID0gIk5GQ19SQVciLAorCS5vd25lciAgICA9IFRISVNfTU9EVUxFLAorCS5vYmpfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZjX3Jhd3NvY2spLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZmNfcHJvdG9jb2wgcmF3c29ja19uZmNfcHJvdG8gPSB7CisJLmlkCSAgPSBORkNfU09DS1BST1RPX1JBVywKKwkucHJvdG8gICAgPSAmcmF3c29ja19wcm90bywKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkuY3JlYXRlICAgPSByYXdzb2NrX2NyZWF0ZQorfTsKKworaW50IF9faW5pdCByYXdzb2NrX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IG5mY19wcm90b19yZWdpc3RlcigmcmF3c29ja19uZmNfcHJvdG8pOworCisJcmV0dXJuIHJjOworfQorCit2b2lkIHJhd3NvY2tfZXhpdCh2b2lkKQoreworCW5mY19wcm90b191bnJlZ2lzdGVyKCZyYXdzb2NrX25mY19wcm90byk7Cit9CmRpZmYgLS1naXQgYS9uZXQvcGFja2V0L2FmX3BhY2tldC5jIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwppbmRleCBiYTI0OGQ5Li5jNjk4Y2VjIDEwMDY0NAotLS0gYS9uZXQvcGFja2V0L2FmX3BhY2tldC5jCisrKyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKQEAgLTE4Nyw5ICsxODcsMTEgQEAKIAogc3RhdGljIHZvaWQgcGFja2V0X2ZsdXNoX21jbGlzdChzdHJ1Y3Qgc29jayAqc2spOwogCitzdHJ1Y3QgcGFja2V0X2Zhbm91dDsKIHN0cnVjdCBwYWNrZXRfc29jayB7CiAJLyogc3RydWN0IHNvY2sgaGFzIHRvIGJlIHRoZSBmaXJzdCBtZW1iZXIgb2YgcGFja2V0X3NvY2sgKi8KIAlzdHJ1Y3Qgc29jawkJc2s7CisJc3RydWN0IHBhY2tldF9mYW5vdXQJKmZhbm91dDsKIAlzdHJ1Y3QgdHBhY2tldF9zdGF0cwlzdGF0czsKIAlzdHJ1Y3QgcGFja2V0X3JpbmdfYnVmZmVyCXJ4X3Jpbmc7CiAJc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlcgl0eF9yaW5nOwpAQCAtMjEyLDYgKzIxNCwyNCBAQAogCXN0cnVjdCBwYWNrZXRfdHlwZQlwcm90X2hvb2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIH07CiAKKyNkZWZpbmUgUEFDS0VUX0ZBTk9VVF9NQVgJMjU2CisKK3N0cnVjdCBwYWNrZXRfZmFub3V0IHsKKyNpZmRlZiBDT05GSUdfTkVUX05TCisJc3RydWN0IG5ldAkJKm5ldDsKKyNlbmRpZgorCXVuc2lnbmVkIGludAkJbnVtX21lbWJlcnM7CisJdTE2CQkJaWQ7CisJdTgJCQl0eXBlOworCXU4CQkJZGVmcmFnOworCWF0b21pY190CQlycl9jdXI7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXN0cnVjdCBzb2NrCQkqYXJyW1BBQ0tFVF9GQU5PVVRfTUFYXTsKKwlzcGlubG9ja190CQlsb2NrOworCWF0b21pY190CQlza19yZWY7CisJc3RydWN0IHBhY2tldF90eXBlCXByb3RfaG9vayBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworfTsKKwogc3RydWN0IHBhY2tldF9za2JfY2IgewogCXVuc2lnbmVkIGludCBvcmlnbGVuOwogCXVuaW9uIHsKQEAgLTIyMiw2ICsyNDIsNjQgQEAKIAogI2RlZmluZSBQQUNLRVRfU0tCX0NCKF9fc2tiKQkoKHN0cnVjdCBwYWNrZXRfc2tiX2NiICopKChfX3NrYiktPmNiKSkKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFja2V0X3NvY2sgKnBrdF9zayhzdHJ1Y3Qgc29jayAqc2spCit7CisJcmV0dXJuIChzdHJ1Y3QgcGFja2V0X3NvY2sgKilzazsKK30KKworc3RhdGljIHZvaWQgX19mYW5vdXRfdW5saW5rKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBhY2tldF9zb2NrICpwbyk7CitzdGF0aWMgdm9pZCBfX2Zhbm91dF9saW5rKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBhY2tldF9zb2NrICpwbyk7CisKKy8qIHJlZ2lzdGVyX3Byb3RfaG9vayBtdXN0IGJlIGludm9rZWQgd2l0aCB0aGUgcG8tPmJpbmRfbG9jayBoZWxkLAorICogb3IgZnJvbSBhIGNvbnRleHQgaW4gd2hpY2ggYXN5bmNocm9ub3VzIGFjY2Vzc2VzIHRvIHRoZSBwYWNrZXQKKyAqIHNvY2tldCBpcyBub3QgcG9zc2libGUgKHBhY2tldF9jcmVhdGUoKSkuCisgKi8KK3N0YXRpYyB2b2lkIHJlZ2lzdGVyX3Byb3RfaG9vayhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CisJaWYgKCFwby0+cnVubmluZykgeworCQlpZiAocG8tPmZhbm91dCkKKwkJCV9fZmFub3V0X2xpbmsoc2ssIHBvKTsKKwkJZWxzZQorCQkJZGV2X2FkZF9wYWNrKCZwby0+cHJvdF9ob29rKTsKKwkJc29ja19ob2xkKHNrKTsKKwkJcG8tPnJ1bm5pbmcgPSAxOworCX0KK30KKworLyogeyxfX311bnJlZ2lzdGVyX3Byb3RfaG9vaygpIG11c3QgYmUgaW52b2tlZCB3aXRoIHRoZSBwby0+YmluZF9sb2NrCisgKiBoZWxkLiAgIElmIHRoZSBzeW5jIHBhcmFtZXRlciBpcyB0cnVlLCB3ZSB3aWxsIHRlbXBvcmFyaWx5IGRyb3AKKyAqIHRoZSBwby0+YmluZF9sb2NrIGFuZCBkbyBhIHN5bmNocm9uaXplX25ldCB0byBtYWtlIHN1cmUgbm8KKyAqIGFzeW5jaHJvbm91cyBwYWNrZXQgcHJvY2Vzc2luZyBwYXRocyBzdGlsbCByZWZlciB0byB0aGUgZWxlbWVudHMKKyAqIG9mIHBvLT5wcm90X2hvb2suICBJZiB0aGUgc3luYyBwYXJhbWV0ZXIgaXMgZmFsc2UsIGl0IGlzIHRoZQorICogY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byB0YWtlIGNhcmUgb2YgdGhpcy4KKyAqLworc3RhdGljIHZvaWQgX191bnJlZ2lzdGVyX3Byb3RfaG9vayhzdHJ1Y3Qgc29jayAqc2ssIGJvb2wgc3luYykKK3sKKwlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvID0gcGt0X3NrKHNrKTsKKworCXBvLT5ydW5uaW5nID0gMDsKKwlpZiAocG8tPmZhbm91dCkKKwkJX19mYW5vdXRfdW5saW5rKHNrLCBwbyk7CisJZWxzZQorCQlfX2Rldl9yZW1vdmVfcGFjaygmcG8tPnByb3RfaG9vayk7CisJX19zb2NrX3B1dChzayk7CisKKwlpZiAoc3luYykgeworCQlzcGluX3VubG9jaygmcG8tPmJpbmRfbG9jayk7CisJCXN5bmNocm9uaXplX25ldCgpOworCQlzcGluX2xvY2soJnBvLT5iaW5kX2xvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9wcm90X2hvb2soc3RydWN0IHNvY2sgKnNrLCBib29sIHN5bmMpCit7CisJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CisKKwlpZiAocG8tPnJ1bm5pbmcpCisJCV9fdW5yZWdpc3Rlcl9wcm90X2hvb2soc2ssIHN5bmMpOworfQorCiBzdGF0aWMgaW5saW5lIF9fcHVyZSBzdHJ1Y3QgcGFnZSAqcGd2X3RvX3BhZ2Uodm9pZCAqYWRkcikKIHsKIAlpZiAoaXNfdm1hbGxvY19hZGRyKGFkZHIpKQpAQCAtMzI0LDExICs0MDIsNiBAQAogCWJ1ZmYtPmhlYWQgPSBidWZmLT5oZWFkICE9IGJ1ZmYtPmZyYW1lX21heCA/IGJ1ZmYtPmhlYWQrMSA6IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhY2tldF9zb2NrICpwa3Rfc2soc3RydWN0IHNvY2sgKnNrKQotewotCXJldHVybiAoc3RydWN0IHBhY2tldF9zb2NrICopc2s7Ci19Ci0KIHN0YXRpYyB2b2lkIHBhY2tldF9zb2NrX2Rlc3RydWN0KHN0cnVjdCBzb2NrICpzaykKIHsKIAlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19lcnJvcl9xdWV1ZSk7CkBAIC0zNDQsNiArNDE3LDI0MCBAQAogCXNrX3JlZmNudF9kZWJ1Z19kZWMoc2spOwogfQogCitzdGF0aWMgaW50IGZhbm91dF9ycl9uZXh0KHN0cnVjdCBwYWNrZXRfZmFub3V0ICpmLCB1bnNpZ25lZCBpbnQgbnVtKQoreworCWludCB4ID0gYXRvbWljX3JlYWQoJmYtPnJyX2N1cikgKyAxOworCisJaWYgKHggPj0gbnVtKQorCQl4ID0gMDsKKworCXJldHVybiB4OworfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKmZhbm91dF9kZW11eF9oYXNoKHN0cnVjdCBwYWNrZXRfZmFub3V0ICpmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbnVtKQoreworCXUzMiBpZHgsIGhhc2ggPSBza2ItPnJ4aGFzaDsKKworCWlkeCA9ICgodTY0KWhhc2ggKiBudW0pID4+IDMyOworCisJcmV0dXJuIGYtPmFycltpZHhdOworfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKmZhbm91dF9kZW11eF9sYihzdHJ1Y3QgcGFja2V0X2Zhbm91dCAqZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG51bSkKK3sKKwlpbnQgY3VyLCBvbGQ7CisKKwljdXIgPSBhdG9taWNfcmVhZCgmZi0+cnJfY3VyKTsKKwl3aGlsZSAoKG9sZCA9IGF0b21pY19jbXB4Y2hnKCZmLT5ycl9jdXIsIGN1ciwKKwkJCQkgICAgIGZhbm91dF9ycl9uZXh0KGYsIG51bSkpKSAhPSBjdXIpCisJCWN1ciA9IG9sZDsKKwlyZXR1cm4gZi0+YXJyW2N1cl07Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqZmFub3V0X2RlbXV4X2NwdShzdHJ1Y3QgcGFja2V0X2Zhbm91dCAqZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG51bSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJcmV0dXJuIGYtPmFycltjcHUgJSBudW1dOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmZhbm91dF9jaGVja19kZWZyYWcoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNpZmRlZiBDT05GSUdfSU5FVAorCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOworCXUzMiBsZW47CisKKwlpZiAoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkpCisJCXJldHVybiBza2I7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCisJCXJldHVybiBza2I7CisKKwlpcGggPSBpcF9oZHIoc2tiKTsKKwlpZiAoaXBoLT5paGwgPCA1IHx8IGlwaC0+dmVyc2lvbiAhPSA0KQorCQlyZXR1cm4gc2tiOworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGlwaC0+aWhsKjQpKQorCQlyZXR1cm4gc2tiOworCWlwaCA9IGlwX2hkcihza2IpOworCWxlbiA9IG50b2hzKGlwaC0+dG90X2xlbik7CisJaWYgKHNrYi0+bGVuIDwgbGVuIHx8IGxlbiA8IChpcGgtPmlobCAqIDQpKQorCQlyZXR1cm4gc2tiOworCisJaWYgKGlwX2lzX2ZyYWdtZW50KGlwX2hkcihza2IpKSkgeworCQlza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHNrYikgeworCQkJaWYgKHBza2JfdHJpbV9yY3N1bShza2IsIGxlbikpCisJCQkJcmV0dXJuIHNrYjsKKwkJCW1lbXNldChJUENCKHNrYiksIDAsIHNpemVvZihzdHJ1Y3QgaW5ldF9za2JfcGFybSkpOworCQkJaWYgKGlwX2RlZnJhZyhza2IsIElQX0RFRlJBR19BRl9QQUNLRVQpKQorCQkJCXJldHVybiBOVUxMOworCQkJc2tiLT5yeGhhc2ggPSAwOworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludCBwYWNrZXRfcmN2X2Zhbm91dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCit7CisJc3RydWN0IHBhY2tldF9mYW5vdXQgKmYgPSBwdC0+YWZfcGFja2V0X3ByaXY7CisJdW5zaWduZWQgaW50IG51bSA9IGYtPm51bV9tZW1iZXJzOworCXN0cnVjdCBwYWNrZXRfc29jayAqcG87CisJc3RydWN0IHNvY2sgKnNrOworCisJaWYgKCFuZXRfZXEoZGV2X25ldChkZXYpLCByZWFkX3BuZXQoJmYtPm5ldCkpIHx8CisJICAgICFudW0pIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoZi0+dHlwZSkgeworCWNhc2UgUEFDS0VUX0ZBTk9VVF9IQVNIOgorCWRlZmF1bHQ6CisJCWlmIChmLT5kZWZyYWcpIHsKKwkJCXNrYiA9IGZhbm91dF9jaGVja19kZWZyYWcoc2tiKTsKKwkJCWlmICghc2tiKQorCQkJCXJldHVybiAwOworCQl9CisJCXNrYl9nZXRfcnhoYXNoKHNrYik7CisJCXNrID0gZmFub3V0X2RlbXV4X2hhc2goZiwgc2tiLCBudW0pOworCQlicmVhazsKKwljYXNlIFBBQ0tFVF9GQU5PVVRfTEI6CisJCXNrID0gZmFub3V0X2RlbXV4X2xiKGYsIHNrYiwgbnVtKTsKKwkJYnJlYWs7CisJY2FzZSBQQUNLRVRfRkFOT1VUX0NQVToKKwkJc2sgPSBmYW5vdXRfZGVtdXhfY3B1KGYsIHNrYiwgbnVtKTsKKwkJYnJlYWs7CisJfQorCisJcG8gPSBwa3Rfc2soc2spOworCisJcmV0dXJuIHBvLT5wcm90X2hvb2suZnVuYyhza2IsIGRldiwgJnBvLT5wcm90X2hvb2ssIG9yaWdfZGV2KTsKK30KKworc3RhdGljIERFRklORV9NVVRFWChmYW5vdXRfbXV0ZXgpOworc3RhdGljIExJU1RfSEVBRChmYW5vdXRfbGlzdCk7CisKK3N0YXRpYyB2b2lkIF9fZmFub3V0X2xpbmsoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvKQoreworCXN0cnVjdCBwYWNrZXRfZmFub3V0ICpmID0gcG8tPmZhbm91dDsKKworCXNwaW5fbG9jaygmZi0+bG9jayk7CisJZi0+YXJyW2YtPm51bV9tZW1iZXJzXSA9IHNrOworCXNtcF93bWIoKTsKKwlmLT5udW1fbWVtYmVycysrOworCXNwaW5fdW5sb2NrKCZmLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19mYW5vdXRfdW5saW5rKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBhY2tldF9zb2NrICpwbykKK3sKKwlzdHJ1Y3QgcGFja2V0X2Zhbm91dCAqZiA9IHBvLT5mYW5vdXQ7CisJaW50IGk7CisKKwlzcGluX2xvY2soJmYtPmxvY2spOworCWZvciAoaSA9IDA7IGkgPCBmLT5udW1fbWVtYmVyczsgaSsrKSB7CisJCWlmIChmLT5hcnJbaV0gPT0gc2spCisJCQlicmVhazsKKwl9CisJQlVHX09OKGkgPj0gZi0+bnVtX21lbWJlcnMpOworCWYtPmFycltpXSA9IGYtPmFycltmLT5udW1fbWVtYmVycyAtIDFdOworCWYtPm51bV9tZW1iZXJzLS07CisJc3Bpbl91bmxvY2soJmYtPmxvY2spOworfQorCitzdGF0aWMgaW50IGZhbm91dF9hZGQoc3RydWN0IHNvY2sgKnNrLCB1MTYgaWQsIHUxNiB0eXBlX2ZsYWdzKQoreworCXN0cnVjdCBwYWNrZXRfc29jayAqcG8gPSBwa3Rfc2soc2spOworCXN0cnVjdCBwYWNrZXRfZmFub3V0ICpmLCAqbWF0Y2g7CisJdTggdHlwZSA9IHR5cGVfZmxhZ3MgJiAweGZmOworCXU4IGRlZnJhZyA9ICh0eXBlX2ZsYWdzICYgUEFDS0VUX0ZBTk9VVF9GTEFHX0RFRlJBRykgPyAxIDogMDsKKwlpbnQgZXJyOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBQQUNLRVRfRkFOT1VUX0hBU0g6CisJY2FzZSBQQUNLRVRfRkFOT1VUX0xCOgorCWNhc2UgUEFDS0VUX0ZBTk9VVF9DUFU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcG8tPnJ1bm5pbmcpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvLT5mYW5vdXQpCisJCXJldHVybiAtRUFMUkVBRFk7CisKKwltdXRleF9sb2NrKCZmYW5vdXRfbXV0ZXgpOworCW1hdGNoID0gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZmYW5vdXRfbGlzdCwgbGlzdCkgeworCQlpZiAoZi0+aWQgPT0gaWQgJiYKKwkJICAgIHJlYWRfcG5ldCgmZi0+bmV0KSA9PSBzb2NrX25ldChzaykpIHsKKwkJCW1hdGNoID0gZjsKKwkJCWJyZWFrOworCQl9CisJfQorCWVyciA9IC1FSU5WQUw7CisJaWYgKG1hdGNoICYmIG1hdGNoLT5kZWZyYWcgIT0gZGVmcmFnKQorCQlnb3RvIG91dDsKKwlpZiAoIW1hdGNoKSB7CisJCWVyciA9IC1FTk9NRU07CisJCW1hdGNoID0ga3phbGxvYyhzaXplb2YoKm1hdGNoKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbWF0Y2gpCisJCQlnb3RvIG91dDsKKwkJd3JpdGVfcG5ldCgmbWF0Y2gtPm5ldCwgc29ja19uZXQoc2spKTsKKwkJbWF0Y2gtPmlkID0gaWQ7CisJCW1hdGNoLT50eXBlID0gdHlwZTsKKwkJbWF0Y2gtPmRlZnJhZyA9IGRlZnJhZzsKKwkJYXRvbWljX3NldCgmbWF0Y2gtPnJyX2N1ciwgMCk7CisJCUlOSVRfTElTVF9IRUFEKCZtYXRjaC0+bGlzdCk7CisJCXNwaW5fbG9ja19pbml0KCZtYXRjaC0+bG9jayk7CisJCWF0b21pY19zZXQoJm1hdGNoLT5za19yZWYsIDApOworCQltYXRjaC0+cHJvdF9ob29rLnR5cGUgPSBwby0+cHJvdF9ob29rLnR5cGU7CisJCW1hdGNoLT5wcm90X2hvb2suZGV2ID0gcG8tPnByb3RfaG9vay5kZXY7CisJCW1hdGNoLT5wcm90X2hvb2suZnVuYyA9IHBhY2tldF9yY3ZfZmFub3V0OworCQltYXRjaC0+cHJvdF9ob29rLmFmX3BhY2tldF9wcml2ID0gbWF0Y2g7CisJCWRldl9hZGRfcGFjaygmbWF0Y2gtPnByb3RfaG9vayk7CisJCWxpc3RfYWRkKCZtYXRjaC0+bGlzdCwgJmZhbm91dF9saXN0KTsKKwl9CisJZXJyID0gLUVJTlZBTDsKKwlpZiAobWF0Y2gtPnR5cGUgPT0gdHlwZSAmJgorCSAgICBtYXRjaC0+cHJvdF9ob29rLnR5cGUgPT0gcG8tPnByb3RfaG9vay50eXBlICYmCisJICAgIG1hdGNoLT5wcm90X2hvb2suZGV2ID09IHBvLT5wcm90X2hvb2suZGV2KSB7CisJCWVyciA9IC1FTk9TUEM7CisJCWlmIChhdG9taWNfcmVhZCgmbWF0Y2gtPnNrX3JlZikgPCBQQUNLRVRfRkFOT1VUX01BWCkgeworCQkJX19kZXZfcmVtb3ZlX3BhY2soJnBvLT5wcm90X2hvb2spOworCQkJcG8tPmZhbm91dCA9IG1hdGNoOworCQkJYXRvbWljX2luYygmbWF0Y2gtPnNrX3JlZik7CisJCQlfX2Zhbm91dF9saW5rKHNrLCBwbyk7CisJCQllcnIgPSAwOworCQl9CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmZmFub3V0X211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBmYW5vdXRfcmVsZWFzZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CisJc3RydWN0IHBhY2tldF9mYW5vdXQgKmY7CisKKwlmID0gcG8tPmZhbm91dDsKKwlpZiAoIWYpCisJCXJldHVybjsKKworCXBvLT5mYW5vdXQgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmZmFub3V0X211dGV4KTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZi0+c2tfcmVmKSkgeworCQlsaXN0X2RlbCgmZi0+bGlzdCk7CisJCWRldl9yZW1vdmVfcGFjaygmZi0+cHJvdF9ob29rKTsKKwkJa2ZyZWUoZik7CisJfQorCW11dGV4X3VubG9jaygmZmFub3V0X211dGV4KTsKK30KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgcGFja2V0X29wczsKIApAQCAtODA0LDYgKzExMTEsNyBAQAogCQl9IGVsc2UgewogCQkJaC5oMi0+dHBfdmxhbl90Y2kgPSAwOwogCQl9CisJCWguaDItPnRwX3BhZGRpbmcgPSAwOwogCQloZHJsZW4gPSBzaXplb2YoKmguaDIpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtODIxLDcgKzExMjksNiBAQAogCWVsc2UKIAkJc2xsLT5zbGxfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKIAotCV9fcGFja2V0X3NldF9zdGF0dXMocG8sIGgucmF3LCBzdGF0dXMpOwogCXNtcF9tYigpOwogI2lmIEFSQ0hfSU1QTEVNRU5UU19GTFVTSF9EQ0FDSEVfUEFHRSA9PSAxCiAJewpAQCAtODMwLDggKzExMzcsMTAgQEAKIAkJZW5kID0gKHU4ICopUEFHRV9BTElHTigodW5zaWduZWQgbG9uZyloLnJhdyArIG1hY29mZiArIHNuYXBsZW4pOwogCQlmb3IgKHN0YXJ0ID0gaC5yYXc7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSBQQUdFX1NJWkUpCiAJCQlmbHVzaF9kY2FjaGVfcGFnZShwZ3ZfdG9fcGFnZShzdGFydCkpOworCQlzbXBfd21iKCk7CiAJfQogI2VuZGlmCisJX19wYWNrZXRfc2V0X3N0YXR1cyhwbywgaC5yYXcsIHN0YXR1cyk7CiAKIAlzay0+c2tfZGF0YV9yZWFkeShzaywgMCk7CiAKQEAgLTk3NCw3ICsxMjgzLDggQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJX19iZTE2IHByb3RvOwotCWludCBpZmluZGV4LCBlcnIsIHJlc2VydmUgPSAwOworCWJvb2wgbmVlZF9ybHNfZGV2ID0gZmFsc2U7CisJaW50IGVyciwgcmVzZXJ2ZSA9IDA7CiAJdm9pZCAqcGg7CiAJc3RydWN0IHNvY2thZGRyX2xsICpzYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbGwgKiltc2ctPm1zZ19uYW1lOwogCWludCB0cF9sZW4sIHNpemVfbWF4OwpAQCAtOTg2LDcgKzEyOTYsNyBAQAogCiAJZXJyID0gLUVCVVNZOwogCWlmIChzYWRkciA9PSBOVUxMKSB7Ci0JCWlmaW5kZXgJPSBwby0+aWZpbmRleDsKKwkJZGV2ID0gcG8tPnByb3RfaG9vay5kZXY7CiAJCXByb3RvCT0gcG8tPm51bTsKIAkJYWRkcgk9IE5VTEw7CiAJfSBlbHNlIHsKQEAgLTk5NywxMiArMTMwNywxMiBAQAogCQkJCQkrIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9sbCwKIAkJCQkJCXNsbF9hZGRyKSkpCiAJCQlnb3RvIG91dDsKLQkJaWZpbmRleAk9IHNhZGRyLT5zbGxfaWZpbmRleDsKIAkJcHJvdG8JPSBzYWRkci0+c2xsX3Byb3RvY29sOwogCQlhZGRyCT0gc2FkZHItPnNsbF9hZGRyOworCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KHNvY2tfbmV0KCZwby0+c2spLCBzYWRkci0+c2xsX2lmaW5kZXgpOworCQluZWVkX3Jsc19kZXYgPSB0cnVlOwogCX0KIAotCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoc29ja19uZXQoJnBvLT5zayksIGlmaW5kZXgpOwogCWVyciA9IC1FTlhJTzsKIAlpZiAodW5saWtlbHkoZGV2ID09IE5VTEwpKQogCQlnb3RvIG91dDsKQEAgLTEwODgsNyArMTM5OCw4IEBACiAJX19wYWNrZXRfc2V0X3N0YXR1cyhwbywgcGgsIHN0YXR1cyk7CiAJa2ZyZWVfc2tiKHNrYik7CiBvdXRfcHV0OgotCWRldl9wdXQoZGV2KTsKKwlpZiAobmVlZF9ybHNfZGV2KQorCQlkZXZfcHV0KGRldik7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwby0+cGdfdmVjX2xvY2spOwogCXJldHVybiBlcnI7CkBAIC0xMTI2LDggKzE0MzcsOSBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlfX2JlMTYgcHJvdG87CisJYm9vbCBuZWVkX3Jsc19kZXYgPSBmYWxzZTsKIAl1bnNpZ25lZCBjaGFyICphZGRyOwotCWludCBpZmluZGV4LCBlcnIsIHJlc2VydmUgPSAwOworCWludCBlcnIsIHJlc2VydmUgPSAwOwogCXN0cnVjdCB2aXJ0aW9fbmV0X2hkciB2bmV0X2hkciA9IHsgMCB9OwogCWludCBvZmZzZXQgPSAwOwogCWludCB2bmV0X2hkcl9sZW47CkBAIC0xMTM5LDcgKzE0NTEsNyBAQAogCSAqLwogCiAJaWYgKHNhZGRyID09IE5VTEwpIHsKLQkJaWZpbmRleAk9IHBvLT5pZmluZGV4OworCQlkZXYgPSBwby0+cHJvdF9ob29rLmRldjsKIAkJcHJvdG8JPSBwby0+bnVtOwogCQlhZGRyCT0gTlVMTDsKIAl9IGVsc2UgewpAQCAtMTE0OCwxMyArMTQ2MCwxMiBAQAogCQkJZ290byBvdXQ7CiAJCWlmIChtc2ctPm1zZ19uYW1lbGVuIDwgKHNhZGRyLT5zbGxfaGFsZW4gKyBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfbGwsIHNsbF9hZGRyKSkpCiAJCQlnb3RvIG91dDsKLQkJaWZpbmRleAk9IHNhZGRyLT5zbGxfaWZpbmRleDsKIAkJcHJvdG8JPSBzYWRkci0+c2xsX3Byb3RvY29sOwogCQlhZGRyCT0gc2FkZHItPnNsbF9hZGRyOworCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KHNvY2tfbmV0KHNrKSwgc2FkZHItPnNsbF9pZmluZGV4KTsKKwkJbmVlZF9ybHNfZGV2ID0gdHJ1ZTsKIAl9CiAKLQotCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoc29ja19uZXQoc2spLCBpZmluZGV4KTsKIAllcnIgPSAtRU5YSU87CiAJaWYgKGRldiA9PSBOVUxMKQogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0xMjg1LDE0ICsxNTk2LDE1IEBACiAJaWYgKGVyciA+IDAgJiYgKGVyciA9IG5ldF94bWl0X2Vycm5vKGVycikpICE9IDApCiAJCWdvdG8gb3V0X3VubG9jazsKIAotCWRldl9wdXQoZGV2KTsKKwlpZiAobmVlZF9ybHNfZGV2KQorCQlkZXZfcHV0KGRldik7CiAKIAlyZXR1cm4gbGVuOwogCiBvdXRfZnJlZToKIAlrZnJlZV9za2Ioc2tiKTsKIG91dF91bmxvY2s6Ci0JaWYgKGRldikKKwlpZiAoZGV2ICYmIG5lZWRfcmxzX2RldikKIAkJZGV2X3B1dChkZXYpOwogb3V0OgogCXJldHVybiBlcnI7CkBAIC0xMzMzLDE0ICsxNjQ1LDEwIEBACiAJc3Bpbl91bmxvY2tfYmgoJm5ldC0+cGFja2V0LnNrbGlzdF9sb2NrKTsKIAogCXNwaW5fbG9jaygmcG8tPmJpbmRfbG9jayk7Ci0JaWYgKHBvLT5ydW5uaW5nKSB7Ci0JCS8qCi0JCSAqIFJlbW92ZSBmcm9tIHByb3RvY29sIHRhYmxlCi0JCSAqLwotCQlwby0+cnVubmluZyA9IDA7Ci0JCXBvLT5udW0gPSAwOwotCQlfX2Rldl9yZW1vdmVfcGFjaygmcG8tPnByb3RfaG9vayk7Ci0JCV9fc29ja19wdXQoc2spOworCXVucmVnaXN0ZXJfcHJvdF9ob29rKHNrLCBmYWxzZSk7CisJaWYgKHBvLT5wcm90X2hvb2suZGV2KSB7CisJCWRldl9wdXQocG8tPnByb3RfaG9vay5kZXYpOworCQlwby0+cHJvdF9ob29rLmRldiA9IE5VTEw7CiAJfQogCXNwaW5fdW5sb2NrKCZwby0+YmluZF9sb2NrKTsKIApAQCAtMTM1NCw2ICsxNjYyLDggQEAKIAlpZiAocG8tPnR4X3JpbmcucGdfdmVjKQogCQlwYWNrZXRfc2V0X3Jpbmcoc2ssICZyZXEsIDEsIDEpOwogCisJZmFub3V0X3JlbGVhc2Uoc2spOworCiAJc3luY2hyb25pemVfbmV0KCk7CiAJLyoKIAkgKglOb3cgdGhlIHNvY2tldCBpcyBkZWFkLiBObyBtb3JlIGlucHV0IHdpbGwgYXBwZWFyLgpAQCAtMTM3NywyNCArMTY4NywxOCBAQAogc3RhdGljIGludCBwYWNrZXRfZG9fYmluZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUxNiBwcm90b2NvbCkKIHsKIAlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvID0gcGt0X3NrKHNrKTsKLQkvKgotCSAqCURldGFjaCBhbiBleGlzdGluZyBob29rIGlmIHByZXNlbnQuCi0JICovCisKKwlpZiAocG8tPmZhbm91dCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlsb2NrX3NvY2soc2spOwogCiAJc3Bpbl9sb2NrKCZwby0+YmluZF9sb2NrKTsKLQlpZiAocG8tPnJ1bm5pbmcpIHsKLQkJX19zb2NrX3B1dChzayk7Ci0JCXBvLT5ydW5uaW5nID0gMDsKLQkJcG8tPm51bSA9IDA7Ci0JCXNwaW5fdW5sb2NrKCZwby0+YmluZF9sb2NrKTsKLQkJZGV2X3JlbW92ZV9wYWNrKCZwby0+cHJvdF9ob29rKTsKLQkJc3Bpbl9sb2NrKCZwby0+YmluZF9sb2NrKTsKLQl9Ci0KKwl1bnJlZ2lzdGVyX3Byb3RfaG9vayhzaywgdHJ1ZSk7CiAJcG8tPm51bSA9IHByb3RvY29sOwogCXBvLT5wcm90X2hvb2sudHlwZSA9IHByb3RvY29sOworCWlmIChwby0+cHJvdF9ob29rLmRldikKKwkJZGV2X3B1dChwby0+cHJvdF9ob29rLmRldik7CiAJcG8tPnByb3RfaG9vay5kZXYgPSBkZXY7CiAKIAlwby0+aWZpbmRleCA9IGRldiA/IGRldi0+aWZpbmRleCA6IDA7CkBAIC0xNDAzLDkgKzE3MDcsNyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAKIAlpZiAoIWRldiB8fCAoZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKLQkJZGV2X2FkZF9wYWNrKCZwby0+cHJvdF9ob29rKTsKLQkJc29ja19ob2xkKHNrKTsKLQkJcG8tPnJ1bm5pbmcgPSAxOworCQlyZWdpc3Rlcl9wcm90X2hvb2soc2spOwogCX0gZWxzZSB7CiAJCXNrLT5za19lcnIgPSBFTkVURE9XTjsKIAkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCkBAIC0xNDM5LDEwICsxNzQxLDggQEAKIAlzdHJsY3B5KG5hbWUsIHVhZGRyLT5zYV9kYXRhLCBzaXplb2YobmFtZSkpOwogCiAJZGV2ID0gZGV2X2dldF9ieV9uYW1lKHNvY2tfbmV0KHNrKSwgbmFtZSk7Ci0JaWYgKGRldikgeworCWlmIChkZXYpCiAJCWVyciA9IHBhY2tldF9kb19iaW5kKHNrLCBkZXYsIHBrdF9zayhzayktPm51bSk7Ci0JCWRldl9wdXQoZGV2KTsKLQl9CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTQ3MCw4ICsxNzcwLDYgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAllcnIgPSBwYWNrZXRfZG9fYmluZChzaywgZGV2LCBzbGwtPnNsbF9wcm90b2NvbCA/IDogcGt0X3NrKHNrKS0+bnVtKTsKLQlpZiAoZGV2KQotCQlkZXZfcHV0KGRldik7CiAKIG91dDoKIAlyZXR1cm4gZXJyOwpAQCAtMTUzNiw5ICsxODM0LDcgQEAKIAogCWlmIChwcm90bykgewogCQlwby0+cHJvdF9ob29rLnR5cGUgPSBwcm90bzsKLQkJZGV2X2FkZF9wYWNrKCZwby0+cHJvdF9ob29rKTsKLQkJc29ja19ob2xkKHNrKTsKLQkJcG8tPnJ1bm5pbmcgPSAxOworCQlyZWdpc3Rlcl9wcm90X2hvb2soc2spOwogCX0KIAogCXNwaW5fbG9ja19iaCgmbmV0LT5wYWNrZXQuc2tsaXN0X2xvY2spOwpAQCAtMTY4MCw2ICsxOTc2LDggQEAKIAkJCXZuZXRfaGRyLmZsYWdzID0gVklSVElPX05FVF9IRFJfRl9ORUVEU19DU1VNOwogCQkJdm5ldF9oZHIuY3N1bV9zdGFydCA9IHNrYl9jaGVja3N1bV9zdGFydF9vZmZzZXQoc2tiKTsKIAkJCXZuZXRfaGRyLmNzdW1fb2Zmc2V0ID0gc2tiLT5jc3VtX29mZnNldDsKKwkJfSBlbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgeworCQkJdm5ldF9oZHIuZmxhZ3MgPSBWSVJUSU9fTkVUX0hEUl9GX0RBVEFfVkFMSUQ7CiAJCX0gLyogZWxzZSBldmVyeXRoaW5nIGlzIHplcm8gKi8KIAogCQllcnIgPSBtZW1jcHlfdG9pb3ZlYyhtc2ctPm1zZ19pb3YsICh2b2lkICopJnZuZXRfaGRyLApAQCAtMTczNiw2ICsyMDM0LDcgQEAKIAkJfSBlbHNlIHsKIAkJCWF1eC50cF92bGFuX3RjaSA9IDA7CiAJCX0KKwkJYXV4LnRwX3BhZGRpbmcgPSAwOwogCQlwdXRfY21zZyhtc2csIFNPTF9QQUNLRVQsIFBBQ0tFVF9BVVhEQVRBLCBzaXplb2YoYXV4KSwgJmF1eCk7CiAJfQogCkBAIC0yMTAwLDYgKzIzOTksMTcgQEAKIAkJcG8tPnRwX3RzdGFtcCA9IHZhbDsKIAkJcmV0dXJuIDA7CiAJfQorCWNhc2UgUEFDS0VUX0ZBTk9VVDoKKwl7CisJCWludCB2YWw7CisKKwkJaWYgKG9wdGxlbiAhPSBzaXplb2YodmFsKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgb3B0dmFsLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gZmFub3V0X2FkZChzaywgdmFsICYgMHhmZmZmLCB2YWwgPj4gMTYpOworCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KQEAgLTIxOTgsNiArMjUwOCwxNSBAQAogCQl2YWwgPSBwby0+dHBfdHN0YW1wOwogCQlkYXRhID0gJnZhbDsKIAkJYnJlYWs7CisJY2FzZSBQQUNLRVRfRkFOT1VUOgorCQlpZiAobGVuID4gc2l6ZW9mKGludCkpCisJCQlsZW4gPSBzaXplb2YoaW50KTsKKwkJdmFsID0gKHBvLT5mYW5vdXQgPworCQkgICAgICAgKCh1MzIpcG8tPmZhbm91dC0+aWQgfAorCQkJKCh1MzIpcG8tPmZhbm91dC0+dHlwZSA8PCAxNikpIDoKKwkJICAgICAgIDApOworCQlkYXRhID0gJnZhbDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9CkBAIC0yMjMxLDE1ICsyNTUwLDE1IEBACiAJCQlpZiAoZGV2LT5pZmluZGV4ID09IHBvLT5pZmluZGV4KSB7CiAJCQkJc3Bpbl9sb2NrKCZwby0+YmluZF9sb2NrKTsKIAkJCQlpZiAocG8tPnJ1bm5pbmcpIHsKLQkJCQkJX19kZXZfcmVtb3ZlX3BhY2soJnBvLT5wcm90X2hvb2spOwotCQkJCQlfX3NvY2tfcHV0KHNrKTsKLQkJCQkJcG8tPnJ1bm5pbmcgPSAwOworCQkJCQlfX3VucmVnaXN0ZXJfcHJvdF9ob29rKHNrLCBmYWxzZSk7CiAJCQkJCXNrLT5za19lcnIgPSBFTkVURE9XTjsKIAkJCQkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCiAJCQkJCQlzay0+c2tfZXJyb3JfcmVwb3J0KHNrKTsKIAkJCQl9CiAJCQkJaWYgKG1zZyA9PSBORVRERVZfVU5SRUdJU1RFUikgewogCQkJCQlwby0+aWZpbmRleCA9IC0xOworCQkJCQlpZiAocG8tPnByb3RfaG9vay5kZXYpCisJCQkJCQlkZXZfcHV0KHBvLT5wcm90X2hvb2suZGV2KTsKIAkJCQkJcG8tPnByb3RfaG9vay5kZXYgPSBOVUxMOwogCQkJCX0KIAkJCQlzcGluX3VubG9jaygmcG8tPmJpbmRfbG9jayk7CkBAIC0yMjQ4LDExICsyNTY3LDggQEAKIAkJY2FzZSBORVRERVZfVVA6CiAJCQlpZiAoZGV2LT5pZmluZGV4ID09IHBvLT5pZmluZGV4KSB7CiAJCQkJc3Bpbl9sb2NrKCZwby0+YmluZF9sb2NrKTsKLQkJCQlpZiAocG8tPm51bSAmJiAhcG8tPnJ1bm5pbmcpIHsKLQkJCQkJZGV2X2FkZF9wYWNrKCZwby0+cHJvdF9ob29rKTsKLQkJCQkJc29ja19ob2xkKHNrKTsKLQkJCQkJcG8tPnJ1bm5pbmcgPSAxOwotCQkJCX0KKwkJCQlpZiAocG8tPm51bSkKKwkJCQkJcmVnaXN0ZXJfcHJvdF9ob29rKHNrKTsKIAkJCQlzcGluX3VubG9jaygmcG8tPmJpbmRfbG9jayk7CiAJCQl9CiAJCQlicmVhazsKQEAgLTI1MTksMTAgKzI4MzUsOCBAQAogCXdhc19ydW5uaW5nID0gcG8tPnJ1bm5pbmc7CiAJbnVtID0gcG8tPm51bTsKIAlpZiAod2FzX3J1bm5pbmcpIHsKLQkJX19kZXZfcmVtb3ZlX3BhY2soJnBvLT5wcm90X2hvb2spOwogCQlwby0+bnVtID0gMDsKLQkJcG8tPnJ1bm5pbmcgPSAwOwotCQlfX3NvY2tfcHV0KHNrKTsKKwkJX191bnJlZ2lzdGVyX3Byb3RfaG9vayhzaywgZmFsc2UpOwogCX0KIAlzcGluX3VubG9jaygmcG8tPmJpbmRfbG9jayk7CiAKQEAgLTI1NTMsMTEgKzI4NjcsOSBAQAogCW11dGV4X3VubG9jaygmcG8tPnBnX3ZlY19sb2NrKTsKIAogCXNwaW5fbG9jaygmcG8tPmJpbmRfbG9jayk7Ci0JaWYgKHdhc19ydW5uaW5nICYmICFwby0+cnVubmluZykgewotCQlzb2NrX2hvbGQoc2spOwotCQlwby0+cnVubmluZyA9IDE7CisJaWYgKHdhc19ydW5uaW5nKSB7CiAJCXBvLT5udW0gPSBudW07Ci0JCWRldl9hZGRfcGFjaygmcG8tPnByb3RfaG9vayk7CisJCXJlZ2lzdGVyX3Byb3RfaG9vayhzayk7CiAJfQogCXNwaW5fdW5sb2NrKCZwby0+YmluZF9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvbmV0L3Bob25ldC9wbl9uZXRsaW5rLmMgYi9uZXQvcGhvbmV0L3BuX25ldGxpbmsuYwppbmRleCA0MzhhY2NiLi5kNjFmNjc2IDEwMDY0NAotLS0gYS9uZXQvcGhvbmV0L3BuX25ldGxpbmsuYworKysgYi9uZXQvcGhvbmV0L3BuX25ldGxpbmsuYwpAQCAtMjg5LDE1ICsyODksMTYgQEAKIAogaW50IF9faW5pdCBwaG9uZXRfbmV0bGlua19yZWdpc3Rlcih2b2lkKQogewotCWludCBlcnIgPSBfX3J0bmxfcmVnaXN0ZXIoUEZfUEhPTkVULCBSVE1fTkVXQUREUiwgYWRkcl9kb2l0LCBOVUxMKTsKKwlpbnQgZXJyID0gX19ydG5sX3JlZ2lzdGVyKFBGX1BIT05FVCwgUlRNX05FV0FERFIsIGFkZHJfZG9pdCwKKwkJCQkgIE5VTEwsIE5VTEwpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAkvKiBGdXJ0aGVyIF9fcnRubF9yZWdpc3RlcigpIGNhbm5vdCBmYWlsICovCi0JX19ydG5sX3JlZ2lzdGVyKFBGX1BIT05FVCwgUlRNX0RFTEFERFIsIGFkZHJfZG9pdCwgTlVMTCk7Ci0JX19ydG5sX3JlZ2lzdGVyKFBGX1BIT05FVCwgUlRNX0dFVEFERFIsIE5VTEwsIGdldGFkZHJfZHVtcGl0KTsKLQlfX3J0bmxfcmVnaXN0ZXIoUEZfUEhPTkVULCBSVE1fTkVXUk9VVEUsIHJvdXRlX2RvaXQsIE5VTEwpOwotCV9fcnRubF9yZWdpc3RlcihQRl9QSE9ORVQsIFJUTV9ERUxST1VURSwgcm91dGVfZG9pdCwgTlVMTCk7Ci0JX19ydG5sX3JlZ2lzdGVyKFBGX1BIT05FVCwgUlRNX0dFVFJPVVRFLCBOVUxMLCByb3V0ZV9kdW1waXQpOworCV9fcnRubF9yZWdpc3RlcihQRl9QSE9ORVQsIFJUTV9ERUxBRERSLCBhZGRyX2RvaXQsIE5VTEwsIE5VTEwpOworCV9fcnRubF9yZWdpc3RlcihQRl9QSE9ORVQsIFJUTV9HRVRBRERSLCBOVUxMLCBnZXRhZGRyX2R1bXBpdCwgTlVMTCk7CisJX19ydG5sX3JlZ2lzdGVyKFBGX1BIT05FVCwgUlRNX05FV1JPVVRFLCByb3V0ZV9kb2l0LCBOVUxMLCBOVUxMKTsKKwlfX3J0bmxfcmVnaXN0ZXIoUEZfUEhPTkVULCBSVE1fREVMUk9VVEUsIHJvdXRlX2RvaXQsIE5VTEwsIE5VTEwpOworCV9fcnRubF9yZWdpc3RlcihQRl9QSE9ORVQsIFJUTV9HRVRST1VURSwgTlVMTCwgcm91dGVfZHVtcGl0LCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9yZHMvYmluZC5jIGIvbmV0L3Jkcy9iaW5kLmMKaW5kZXggMmY2YjNmYy4uNjM3YmRlNSAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9iaW5kLmMKKysrIGIvbmV0L3Jkcy9iaW5kLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaW5jbHVkZSAicmRzLmgiCiAKICNkZWZpbmUgQklORF9IQVNIX1NJWkUgMTAyNApAQCAtMTg1LDggKzE4Niw3IEBACiAJaWYgKCF0cmFucykgewogCQlyZXQgPSAtRUFERFJOT1RBVkFJTDsKIAkJcmRzX3JlbW92ZV9ib3VuZChycyk7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9JTkZPICJSRFM6IHJkc19iaW5kKCkgY291bGQgbm90IGZpbmQgYSB0cmFuc3BvcnQsICIKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fSU5GTyAiUkRTOiByZHNfYmluZCgpIGNvdWxkIG5vdCBmaW5kIGEgdHJhbnNwb3J0LCAiCiAJCQkJImxvYWQgcmRzX3RjcCBvciByZHNfcmRtYT9cbiIpOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvcmRzL2liLmggYi9uZXQvcmRzL2liLmgKaW5kZXggNDI5N2Q5Mi4uZWRmYWFhZiAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9pYi5oCisrKyBiL25ldC9yZHMvaWIuaApAQCAtMyw2ICszLDcgQEAKIAogI2luY2x1ZGUgPHJkbWEvaWJfdmVyYnMuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWFfY20uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAicmRzLmgiCmRpZmYgLS1naXQgYS9uZXQvcmRzL2liX2NtLmMgYi9uZXQvcmRzL2liX2NtLmMKaW5kZXggZmQ0NTNkZC4uY2Q2NzAyNiAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9pYl9jbS5jCisrKyBiL25ldC9yZHMvaWJfY20uYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogI2luY2x1ZGUgImliLmgiCkBAIC00MzUsMTMgKzQzNiwxMiBAQAogCQl2ZXJzaW9uID0gUkRTX1BST1RPQ09MXzNfMDsKIAkJd2hpbGUgKChjb21tb24gPj49IDEpICE9IDApCiAJCQl2ZXJzaW9uKys7Ci0JfSBlbHNlIGlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJSRFM6IENvbm5lY3Rpb24gZnJvbSAlcEk0IHVzaW5nICIKKwl9CisJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fTk9USUNFICJSRFM6IENvbm5lY3Rpb24gZnJvbSAlcEk0IHVzaW5nICIKIAkJCSJpbmNvbXBhdGlibGUgcHJvdG9jb2wgdmVyc2lvbiAldS4ldVxuIiwKIAkJCSZkcC0+ZHBfc2FkZHIsCiAJCQlkcC0+ZHBfcHJvdG9jb2xfbWFqb3IsCiAJCQlkcC0+ZHBfcHJvdG9jb2xfbWlub3IpOwotCX0KIAlyZXR1cm4gdmVyc2lvbjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9pYl9zZW5kLmMgYi9uZXQvcmRzL2liX3NlbmQuYwppbmRleCA3YzRkY2U4Li5lNTkwOTQ5IDEwMDY0NAotLS0gYS9uZXQvcmRzL2liX3NlbmQuYworKysgYi9uZXQvcmRzL2liX3NlbmQuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSAicmRzLmgiCiAjaW5jbHVkZSAiaWIuaCIKQEAgLTIwNyw4ICsyMDgsNyBAQAogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fTk9USUNFCiAJCQkgICAgICAgIlJEUy9JQjogJXM6IHVuZXhwZWN0ZWQgb3Bjb2RlIDB4JXggaW4gV1IhXG4iLAogCQkJICAgICAgIF9fZnVuY19fLCBzZW5kLT5zX3dyLm9wY29kZSk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9pdy5oIGIvbmV0L3Jkcy9pdy5oCmluZGV4IDkwMTUxOTIuLjA0Y2UzYjEgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvaXcuaAorKysgYi9uZXQvcmRzL2l3LmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9SRFNfSVdfSAogI2RlZmluZSBfUkRTX0lXX0gKIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPHJkbWEvaWJfdmVyYnMuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWFfY20uaD4KICNpbmNsdWRlICJyZHMuaCIKZGlmZiAtLWdpdCBhL25ldC9yZHMvaXdfY20uYyBiL25ldC9yZHMvaXdfY20uYwppbmRleCBjMTJkYjY2Li45NTU2ZDI4IDEwMDY0NAotLS0gYS9uZXQvcmRzL2l3X2NtLmMKKysrIGIvbmV0L3Jkcy9pd19jbS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSAicmRzLmgiCiAjaW5jbHVkZSAiaXcuaCIKQEAgLTI1OCw4ICsyNTksNyBAQAogCSAqLwogCXJkc19pd2RldiA9IGliX2dldF9jbGllbnRfZGF0YShkZXYsICZyZHNfaXdfY2xpZW50KTsKIAlpZiAoIXJkc19pd2RldikgewotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJSRFMvSVc6IE5vIGNsaWVudF9kYXRhIGZvciBkZXZpY2UgJXNcbiIsCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX05PVElDRSAiUkRTL0lXOiBObyBjbGllbnRfZGF0YSBmb3IgZGV2aWNlICVzXG4iLAogCQkJCQlkZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQpAQCAtMzY1LDEzICszNjUsMTIgQEAKIAkJdmVyc2lvbiA9IFJEU19QUk9UT0NPTF8zXzA7CiAJCXdoaWxlICgoY29tbW9uID4+PSAxKSAhPSAwKQogCQkJdmVyc2lvbisrOwotCX0gZWxzZSBpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiUkRTOiBDb25uZWN0aW9uIGZyb20gJXBJNCB1c2luZyAiCisJfQorCXByaW50a19yYXRlbGltaXRlZChLRVJOX05PVElDRSAiUkRTOiBDb25uZWN0aW9uIGZyb20gJXBJNCB1c2luZyAiCiAJCQkiaW5jb21wYXRpYmxlIHByb3RvY29sIHZlcnNpb24gJXUuJXVcbiIsCiAJCQkmZHAtPmRwX3NhZGRyLAogCQkJZHAtPmRwX3Byb3RvY29sX21ham9yLAogCQkJZHAtPmRwX3Byb3RvY29sX21pbm9yKTsKLQl9CiAJcmV0dXJuIHZlcnNpb247CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9yZHMvaXdfcmRtYS5jIGIvbmV0L3Jkcy9pd19yZG1hLmMKaW5kZXggNmRlYWE3Ny4uOGI3N2VkYiAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9pd19yZG1hLmMKKysrIGIvbmV0L3Jkcy9pd19yZG1hLmMKQEAgLTMyLDYgKzMyLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogI2luY2x1ZGUgIml3LmgiCkBAIC03MjksOCArNzMwLDggQEAKIAlmYWlsZWRfd3IgPSAmZl93cjsKIAlyZXQgPSBpYl9wb3N0X3NlbmQoaWJtci0+Y21faWQtPnFwLCAmZl93ciwgJmZhaWxlZF93cik7CiAJQlVHX09OKGZhaWxlZF93ciAhPSAmZl93cik7Ci0JaWYgKHJldCAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlJEUy9JVzogJXM6JWQgaWJfcG9zdF9zZW5kIHJldHVybmVkICVkXG4iLAorCWlmIChyZXQpCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcgIlJEUy9JVzogJXM6JWQgaWJfcG9zdF9zZW5kIHJldHVybmVkICVkXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCByZXQpOwogCXJldHVybiByZXQ7CiB9CkBAIC03NTEsOCArNzUyLDggQEAKIAogCWZhaWxlZF93ciA9ICZzX3dyOwogCXJldCA9IGliX3Bvc3Rfc2VuZChpYm1yLT5jbV9pZC0+cXAsICZzX3dyLCAmZmFpbGVkX3dyKTsKLQlpZiAocmV0ICYmIHByaW50a19yYXRlbGltaXQoKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJSRFMvSVc6ICVzOiVkIGliX3Bvc3Rfc2VuZCByZXR1cm5lZCAlZFxuIiwKKwlpZiAocmV0KSB7CisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcgIlJEUy9JVzogJXM6JWQgaWJfcG9zdF9zZW5kIHJldHVybmVkICVkXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCByZXQpOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvcmRzL2l3X3NlbmQuYyBiL25ldC9yZHMvaXdfc2VuZC5jCmluZGV4IDU0NWQ4ZWUuLmU0MGMzYzUgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvaXdfc2VuZC5jCisrKyBiL25ldC9yZHMvaXdfc2VuZC5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAKICNpbmNsdWRlICJyZHMuaCIKICNpbmNsdWRlICJpdy5oIgpAQCAtMjU4LDggKzI1OSw3IEBACiAJCQkJICogd2hlbiB0aGUgU0VORCBjb21wbGV0ZXMuICovCiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQkJCXByaW50ayhLRVJOX05PVElDRQorCQkJCXByaW50a19yYXRlbGltaXRlZChLRVJOX05PVElDRQogCQkJCQkJIlJEUy9JVzogJXM6IHVuZXhwZWN0ZWQgb3Bjb2RlIDB4JXggaW4gV1IhXG4iLAogCQkJCQkJX19mdW5jX18sIHNlbmQtPnNfd3Iub3Bjb2RlKTsKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9yZHMvcGFnZS5jIGIvbmV0L3Jkcy9wYWdlLmMKaW5kZXggZDhhY2RlYi4uYjgyZDYzZSAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9wYWdlLmMKKysrIGIvbmV0L3Jkcy9wYWdlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogCmRpZmYgLS1naXQgYS9uZXQvcmRzL3NlbmQuYyBiL25ldC9yZHMvc2VuZC5jCmluZGV4IGQ1OGFlNWYuLmFhNTdlMjIgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvc2VuZC5jCisrKyBiL25ldC9yZHMvc2VuZC5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogCkBAIC0xMDA2LDE2ICsxMDA3LDE0IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKHJtLT5yZG1hLm9wX2FjdGl2ZSAmJiAhY29ubi0+Y190cmFucy0+eG1pdF9yZG1hKSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UgInJkbWFfb3AgJXAgY29ubiB4bWl0X3JkbWEgJXBcbiIsCisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX05PVElDRSAicmRtYV9vcCAlcCBjb25uIHhtaXRfcmRtYSAlcFxuIiwKIAkJCSAgICAgICAmcm0tPnJkbWEsIGNvbm4tPmNfdHJhbnMtPnhtaXRfcmRtYSk7CiAJCXJldCA9IC1FT1BOT1RTVVBQOwogCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAocm0tPmF0b21pYy5vcF9hY3RpdmUgJiYgIWNvbm4tPmNfdHJhbnMtPnhtaXRfYXRvbWljKSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UgImF0b21pY19vcCAlcCBjb25uIHhtaXRfYXRvbWljICVwXG4iLAorCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9OT1RJQ0UgImF0b21pY19vcCAlcCBjb25uIHhtaXRfYXRvbWljICVwXG4iLAogCQkJICAgICAgICZybS0+YXRvbWljLCBjb25uLT5jX3RyYW5zLT54bWl0X2F0b21pYyk7CiAJCXJldCA9IC1FT1BOT1RTVVBQOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL25ldC9yZHMvdGNwX3N0YXRzLmMgYi9uZXQvcmRzL3RjcF9zdGF0cy5jCmluZGV4IGQ1ODk4ZDAuLmY4YTc5NTQgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvdGNwX3N0YXRzLmMKKysrIGIvbmV0L3Jkcy90Y3Bfc3RhdHMuYwpAQCAtNDAsNyArNDAsNyBAQAogREVGSU5FX1BFUl9DUFUoc3RydWN0IHJkc190Y3Bfc3RhdGlzdGljcywgcmRzX3RjcF9zdGF0cykKIAlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKLXN0YXRpYyBjb25zdCBjaGFyIGNvbnN0ICpyZHNfdGNwX3N0YXRfbmFtZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmRzX3RjcF9zdGF0X25hbWVzW10gPSB7CiAJInRjcF9kYXRhX3JlYWR5X2NhbGxzIiwKIAkidGNwX3dyaXRlX3NwYWNlX2NhbGxzIiwKIAkidGNwX3NuZGJ1Zl9mdWxsIiwKZGlmZiAtLWdpdCBhL25ldC9yb3NlL3Jvc2VfbGluay5jIGIvbmV0L3Jvc2Uvcm9zZV9saW5rLmMKaW5kZXggZmE1ZjU2NC4uN2EwMmJkMSAxMDA2NDQKLS0tIGEvbmV0L3Jvc2Uvcm9zZV9saW5rLmMKKysrIGIvbmV0L3Jvc2Uvcm9zZV9saW5rLmMKQEAgLTI2NiwxMyArMjY2LDYgQEAKIHsKIAl1bnNpZ25lZCBjaGFyICpkcHRyOwogCi0jaWYgMAotCWlmIChjYWxsX2Z3X2ZpcmV3YWxsKFBGX1JPU0UsIHNrYi0+ZGV2LCBza2ItPmRhdGEsIE5VTEwsICZza2IpICE9IEZXX0FDQ0VQVCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCiAJaWYgKG5laWdoLT5sb29wYmFjaykgewogCQlyb3NlX2xvb3BiYWNrX3F1ZXVlKHNrYiwgbmVpZ2gpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9uZXQvcm9zZS9yb3NlX3JvdXRlLmMgYi9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKaW5kZXggNDc5Y2FlNS4uZDM4OWRlMSAxMDA2NDQKLS0tIGEvbmV0L3Jvc2Uvcm9zZV9yb3V0ZS5jCisrKyBiL25ldC9yb3NlL3Jvc2Vfcm91dGUuYwpAQCAtODY0LDExICs4NjQsNiBAQAogCWludCByZXMgPSAwOwogCWNoYXIgYnVmWzExXTsKIAotI2lmIDAKLQlpZiAoY2FsbF9pbl9maXJld2FsbChQRl9ST1NFLCBza2ItPmRldiwgc2tiLT5kYXRhLCBOVUxMLCAmc2tiKSAhPSBGV19BQ0NFUFQpCi0JCXJldHVybiByZXM7Ci0jZW5kaWYKLQogCWlmIChza2ItPmxlbiA8IFJPU0VfTUlOX0xFTikKIAkJcmV0dXJuIHJlczsKIAlmcmFtZXR5cGUgPSBza2ItPmRhdGFbMl07CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2FwaS5jIGIvbmV0L3NjaGVkL2FjdF9hcGkuYwppbmRleCBhNjA2MDI1Li5mMmZiNjdlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2FwaS5jCisrKyBiL25ldC9zY2hlZC9hY3RfYXBpLmMKQEAgLTM2NSwxMCArMzY1LDEwIEBACiB9CiAjZW5kaWYKIAotaW50IHRjZl9hY3Rpb25fZXhlYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphY3QsCitpbnQgdGNmX2FjdGlvbl9leGVjKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmFjdCwKIAkJICAgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCiB7Ci0Jc3RydWN0IHRjX2FjdGlvbiAqYTsKKwljb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphOwogCWludCByZXQgPSAtMTsKIAogCWlmIChza2ItPnRjX3ZlcmQgJiBUQ19OQ0xTKSB7CkBAIC0xMTE1LDkgKzExMTUsMTAgQEAKIAogc3RhdGljIGludCBfX2luaXQgdGNfYWN0aW9uX2luaXQodm9pZCkKIHsKLQlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX05FV0FDVElPTiwgdGNfY3RsX2FjdGlvbiwgTlVMTCk7Ci0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxBQ1RJT04sIHRjX2N0bF9hY3Rpb24sIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUQUNUSU9OLCB0Y19jdGxfYWN0aW9uLCB0Y19kdW1wX2FjdGlvbik7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdBQ1RJT04sIHRjX2N0bF9hY3Rpb24sIE5VTEwsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fREVMQUNUSU9OLCB0Y19jdGxfYWN0aW9uLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVEFDVElPTiwgdGNfY3RsX2FjdGlvbiwgdGNfZHVtcF9hY3Rpb24sCisJCSAgICAgIE5VTEwpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2NzdW0uYyBiL25ldC9zY2hlZC9hY3RfY3N1bS5jCmluZGV4IDZjZGY5YWIuLjQ1M2E3MzQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfY3N1bS5jCisrKyBiL25ldC9zY2hlZC9hY3RfY3N1bS5jCkBAIC01MDAsNyArNTAwLDcgQEAKIH0KIAogc3RhdGljIGludCB0Y2ZfY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgc3RydWN0IHRjX2FjdGlvbiAqYSwgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKKwkJICAgIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCiB7CiAJc3RydWN0IHRjZl9jc3VtICpwID0gYS0+cHJpdjsKIAlpbnQgYWN0aW9uOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9nYWN0LmMgYi9uZXQvc2NoZWQvYWN0X2dhY3QuYwppbmRleCAyYjRhYjRiLi5iNzdmNWEwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2dhY3QuYworKysgYi9uZXQvc2NoZWQvYWN0X2dhY3QuYwpAQCAtMTI1LDcgKzEyNSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2dhY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKK3N0YXRpYyBpbnQgdGNmX2dhY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYSwKKwkJICAgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCiB7CiAJc3RydWN0IHRjZl9nYWN0ICpnYWN0ID0gYS0+cHJpdjsKIAlpbnQgYWN0aW9uID0gVENfQUNUX1NIT1Q7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2lwdC5jIGIvbmV0L3NjaGVkL2FjdF9pcHQuYwppbmRleCA5ZmMyMTFhLi42MGY4ZjYxIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2lwdC5jCisrKyBiL25ldC9zY2hlZC9hY3RfaXB0LmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXJldHVybiB0Y2ZfaXB0X3JlbGVhc2UoaXB0LCBiaW5kKTsKIH0KIAotc3RhdGljIGludCB0Y2ZfaXB0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCitzdGF0aWMgaW50IHRjZl9pcHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYSwKIAkJICAgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKIAlpbnQgcmV0ID0gMCwgcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfbWlycmVkLmMgYi9uZXQvc2NoZWQvYWN0X21pcnJlZC5jCmluZGV4IDk2MTM4NmUuLjEwMmZjMjEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfbWlycmVkLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9taXJyZWQuYwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX21pcnJlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorc3RhdGljIGludCB0Y2ZfbWlycmVkKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsCiAJCSAgICAgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCiB7CiAJc3RydWN0IHRjZl9taXJyZWQgKm0gPSBhLT5wcml2OwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9uYXQuYyBiL25ldC9zY2hlZC9hY3RfbmF0LmMKaW5kZXggNzYyYjAyNy4uMDAxZDFiMyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9uYXQuYworKysgYi9uZXQvc2NoZWQvYWN0X25hdC5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlyZXR1cm4gdGNmX2hhc2hfcmVsZWFzZSgmcC0+Y29tbW9uLCBiaW5kLCAmbmF0X2hhc2hfaW5mbyk7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX25hdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorc3RhdGljIGludCB0Y2ZfbmF0KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsCiAJCSAgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCiB7CiAJc3RydWN0IHRjZl9uYXQgKnAgPSBhLT5wcml2OwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9wZWRpdC5jIGIvbmV0L3NjaGVkL2FjdF9wZWRpdC5jCmluZGV4IDdhZmZlOWEuLjEwZDNhZWQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfcGVkaXQuYworKysgYi9uZXQvc2NoZWQvYWN0X3BlZGl0LmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRjZl9wZWRpdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorc3RhdGljIGludCB0Y2ZfcGVkaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYSwKIAkJICAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogCXN0cnVjdCB0Y2ZfcGVkaXQgKnAgPSBhLT5wcml2OwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYyBiL25ldC9zY2hlZC9hY3RfcG9saWNlLmMKaW5kZXggYjNiOWIzMi4uNmZiM2Y1YSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYworKysgYi9uZXQvc2NoZWQvYWN0X3BvbGljZS5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHRjZl9hY3RfcG9saWNlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCitzdGF0aWMgaW50IHRjZl9hY3RfcG9saWNlKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsCiAJCQkgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCiB7CiAJc3RydWN0IHRjZl9wb2xpY2UgKnBvbGljZSA9IGEtPnByaXY7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jIGIvbmV0L3NjaGVkL2FjdF9zaW1wbGUuYwppbmRleCBhMzRhMjJkLi43M2UwYTNhIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jCisrKyBiL25ldC9zY2hlZC9hY3Rfc2ltcGxlLmMKQEAgLTM2LDcgKzM2LDggQEAKIH07CiAKICNkZWZpbmUgU0lNUF9NQVhfREFUQQkzMgotc3RhdGljIGludCB0Y2Zfc2ltcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQorc3RhdGljIGludCB0Y2Zfc2ltcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorCQkgICAgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKIAlzdHJ1Y3QgdGNmX2RlZmFjdCAqZCA9IGEtPnByaXY7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3Rfc2tiZWRpdC5jIGIvbmV0L3NjaGVkL2FjdF9za2JlZGl0LmMKaW5kZXggNWY2ZjBjNy4uMzVkYmJlOSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9za2JlZGl0LmMKKysrIGIvbmV0L3NjaGVkL2FjdF9za2JlZGl0LmMKQEAgLTM5LDcgKzM5LDcgQEAKIAkubG9jawk9CSZza2JlZGl0X2xvY2ssCiB9OwogCi1zdGF0aWMgaW50IHRjZl9za2JlZGl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCitzdGF0aWMgaW50IHRjZl9za2JlZGl0KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsCiAJCSAgICAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogCXN0cnVjdCB0Y2Zfc2tiZWRpdCAqZCA9IGEtPnByaXY7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2FwaS5jIGIvbmV0L3NjaGVkL2Nsc19hcGkuYwppbmRleCBiYjJjNTIzLi5hNjlkNDRmIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2FwaS5jCisrKyBiL25ldC9zY2hlZC9jbHNfYXBpLmMKQEAgLTQwLDkgKzQwLDkgQEAKIAogLyogRmluZCBjbGFzc2lmaWVyIHR5cGUgYnkgc3RyaW5nIG5hbWUgKi8KIAotc3RhdGljIHN0cnVjdCB0Y2ZfcHJvdG9fb3BzICp0Y2ZfcHJvdG9fbG9va3VwX29wcyhzdHJ1Y3QgbmxhdHRyICpraW5kKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0Y2ZfcHJvdG9fb3BzICp0Y2ZfcHJvdG9fbG9va3VwX29wcyhzdHJ1Y3QgbmxhdHRyICpraW5kKQogewotCXN0cnVjdCB0Y2ZfcHJvdG9fb3BzICp0ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgdGNmX3Byb3RvX29wcyAqdCA9IE5VTEw7CiAKIAlpZiAoa2luZCkgewogCQlyZWFkX2xvY2soJmNsc19tb2RfbG9jayk7CkBAIC0xMzIsNyArMTMyLDcgQEAKIAlzdHJ1Y3QgUWRpc2MgICpxOwogCXN0cnVjdCB0Y2ZfcHJvdG8gKipiYWNrLCAqKmNoYWluOwogCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwOwotCXN0cnVjdCB0Y2ZfcHJvdG9fb3BzICp0cF9vcHM7CisJY29uc3Qgc3RydWN0IHRjZl9wcm90b19vcHMgKnRwX29wczsKIAljb25zdCBzdHJ1Y3QgUWRpc2NfY2xhc3Nfb3BzICpjb3BzOwogCXVuc2lnbmVkIGxvbmcgY2w7CiAJdW5zaWduZWQgbG9uZyBmaDsKQEAgLTYxMCwxMCArNjEwLDEwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHRjX2ZpbHRlcl9pbml0KHZvaWQpCiB7Ci0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdURklMVEVSLCB0Y19jdGxfdGZpbHRlciwgTlVMTCk7Ci0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxURklMVEVSLCB0Y19jdGxfdGZpbHRlciwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdURklMVEVSLCB0Y19jdGxfdGZpbHRlciwgTlVMTCwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxURklMVEVSLCB0Y19jdGxfdGZpbHRlciwgTlVMTCwgTlVMTCk7CiAJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRURklMVEVSLCB0Y19jdGxfdGZpbHRlciwKLQkJCQkJCSB0Y19kdW1wX3RmaWx0ZXIpOworCQkgICAgICB0Y19kdW1wX3RmaWx0ZXIsIE5VTEwpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMgYi9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMKaW5kZXggOGJlODg3Mi4uZWExZjcwYiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19iYXNpYy5jCisrKyBiL25ldC9zY2hlZC9jbHNfYmFzaWMuYwpAQCAtMzksNyArMzksNyBAQAogCS5wb2xpY2UgPSBUQ0FfQkFTSUNfUE9MSUNFCiB9OwogCi1zdGF0aWMgaW50IGJhc2ljX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAorc3RhdGljIGludCBiYXNpY19jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKIAkJCSAgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKIAlpbnQgcjsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMgYi9uZXQvc2NoZWQvY2xzX2Nncm91cC5jCmluZGV4IDMyYTMzNTEuLmY4NGZkYzMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMKKysrIGIvbmV0L3NjaGVkL2Nsc19jZ3JvdXAuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJc3RydWN0IHRjZl9lbWF0Y2hfdHJlZQllbWF0Y2hlczsKIH07CiAKLXN0YXRpYyBpbnQgY2xzX2Nncm91cF9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKK3N0YXRpYyBpbnQgY2xzX2Nncm91cF9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKIAkJCSAgICAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogCXN0cnVjdCBjbHNfY2dyb3VwX2hlYWQgKmhlYWQgPSB0cC0+cm9vdDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfZmxvdy5jIGIvbmV0L3NjaGVkL2Nsc19mbG93LmMKaW5kZXggOGVjMDEzOS4uNjk5NDIxNCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19mbG93LmMKKysrIGIvbmV0L3NjaGVkL2Nsc19mbG93LmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQlpZiAoIXBza2JfbmV0d29ya19tYXlfcHVsbChza2IsIHNpemVvZigqaXBoKSkpCiAJCQlicmVhazsKIAkJaXBoID0gaXBfaGRyKHNrYik7Ci0JCWlmIChpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKQorCQlpZiAoaXBfaXNfZnJhZ21lbnQoaXBoKSkKIAkJCWJyZWFrOwogCQlwb2ZmID0gcHJvdG9fcG9ydHNfb2Zmc2V0KGlwaC0+cHJvdG9jb2wpOwogCQlpZiAocG9mZiA+PSAwICYmCkBAIC0xNjMsNyArMTYzLDcgQEAKIAkJaWYgKCFwc2tiX25ldHdvcmtfbWF5X3B1bGwoc2tiLCBzaXplb2YoKmlwaCkpKQogCQkJYnJlYWs7CiAJCWlwaCA9IGlwX2hkcihza2IpOwotCQlpZiAoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkKKwkJaWYgKGlwX2lzX2ZyYWdtZW50KGlwaCkpCiAJCQlicmVhazsKIAkJcG9mZiA9IHByb3RvX3BvcnRzX29mZnNldChpcGgtPnByb3RvY29sKTsKIAkJaWYgKHBvZmYgPj0gMCAmJgpAQCAtMzU2LDcgKzM1Niw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGZsb3dfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9wcm90byAqdHAsCitzdGF0aWMgaW50IGZsb3dfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjZl9wcm90byAqdHAsCiAJCQkgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKIAlzdHJ1Y3QgZmxvd19oZWFkICpoZWFkID0gdHAtPnJvb3Q7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Z3LmMgYi9uZXQvc2NoZWQvY2xzX2Z3LmMKaW5kZXggMjZlN2JjNC4uMzg5YWYxNSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19mdy5jCisrKyBiL25ldC9zY2hlZC9jbHNfZncuYwpAQCAtNzcsNyArNzcsNyBAQAogCQlyZXR1cm4gaGFuZGxlICYgKEhUU0laRSAtIDEpOwogfQogCi1zdGF0aWMgaW50IGZ3X2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAorc3RhdGljIGludCBmd19jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKIAkJCSAgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKIAlzdHJ1Y3QgZndfaGVhZCAqaGVhZCA9IChzdHJ1Y3QgZndfaGVhZCAqKXRwLT5yb290OwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jIGIvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jCmluZGV4IGE5MDc5MDUzLi4xM2FiNjZlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3JvdXRlLmMKKysrIGIvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAlyZXR1cm4gMDsJCQkJCQlcCiB9CiAKLXN0YXRpYyBpbnQgcm91dGU0X2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAorc3RhdGljIGludCByb3V0ZTRfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjZl9wcm90byAqdHAsCiAJCQkgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogCXN0cnVjdCByb3V0ZTRfaGVhZCAqaGVhZCA9IChzdHJ1Y3Qgcm91dGU0X2hlYWQgKil0cC0+cm9vdDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfcnN2cC5oIGIvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKaW5kZXggNDAyYzQ0Yi4uYmU0NTA1ZSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKKysrIGIvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKQEAgLTEzMCw3ICsxMzAsNyBAQAogCQlyZXR1cm4gcjsJCQkJXAogfQogCi1zdGF0aWMgaW50IHJzdnBfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9wcm90byAqdHAsCitzdGF0aWMgaW50IHJzdnBfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjZl9wcm90byAqdHAsCiAJCQkgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKIAlzdHJ1Y3QgcnN2cF9zZXNzaW9uICoqc2h0ID0gKChzdHJ1Y3QgcnN2cF9oZWFkICopdHAtPnJvb3QpLT5odDsKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCWRzdCA9ICZuaHB0ci0+ZGFkZHI7CiAJcHJvdG9jb2wgPSBuaHB0ci0+cHJvdG9jb2w7CiAJeHBydCA9ICgodTggKiluaHB0cikgKyAobmhwdHItPmlobDw8Mik7Ci0JaWYgKG5ocHRyLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkKKwlpZiAoaXBfaXNfZnJhZ21lbnQobmhwdHIpKQogCQlyZXR1cm4gLTE7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMgYi9uZXQvc2NoZWQvY2xzX3RjaW5kZXguYwppbmRleCAzNjY2N2ZhLi5kYmUxOTkyIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3RjaW5kZXguYworKysgYi9uZXQvc2NoZWQvY2xzX3RjaW5kZXguYwpAQCAtNzksNyArNzksNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgdGNpbmRleF9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKK3N0YXRpYyBpbnQgdGNpbmRleF9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKIAkJCSAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogCXN0cnVjdCB0Y2luZGV4X2RhdGEgKnAgPSBQUklWKHRwKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdTMyLmMgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCmluZGV4IDNiOTNmYzAuLjkzOWI2MjcgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfdTMyLmMKKysrIGIvbmV0L3NjaGVkL2Nsc191MzIuYwpAQCAtOTMsNyArOTMsNyBAQAogCXJldHVybiBoOwogfQogCi1zdGF0aWMgaW50IHUzMl9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKK3N0YXRpYyBpbnQgdTMyX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogCXN0cnVjdCB7CiAJCXN0cnVjdCB0Y191X2tub2RlICprbm9kZTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9lbV9tZXRhLmMgYi9uZXQvc2NoZWQvZW1fbWV0YS5jCmluZGV4IDQ5MTMwZTguLjEzNjNiZjEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9lbV9tZXRhLmMKKysrIGIvbmV0L3NjaGVkL2VtX21ldGEuYwpAQCAtNDA0LDEyICs0MDQsNiBAQAogCWRzdC0+dmFsdWUgPSAoX19mb3JjZSBpbnQpIHNrYi0+c2stPnNrX2FsbG9jYXRpb247CiB9CiAKLU1FVEFfQ09MTEVDVE9SKGludF9za19yb3V0ZV9jYXBzKQotewotCVNLSVBfTk9OTE9DQUwoc2tiKTsKLQlkc3QtPnZhbHVlID0gc2tiLT5zay0+c2tfcm91dGVfY2FwczsKLX0KLQogTUVUQV9DT0xMRUNUT1IoaW50X3NrX2hhc2gpCiB7CiAJU0tJUF9OT05MT0NBTChza2IpOwpAQCAtNTMwLDcgKzUyNCw2IEBACiAJCVtNRVRBX0lEKFNLX0VSUl9RTEVOKV0JCT0gTUVUQV9GVU5DKGludF9za19lcnJfcWxlbiksCiAJCVtNRVRBX0lEKFNLX0ZPUldBUkRfQUxMT0NTKV0JPSBNRVRBX0ZVTkMoaW50X3NrX2Z3ZF9hbGxvYyksCiAJCVtNRVRBX0lEKFNLX0FMTE9DUyldCQk9IE1FVEFfRlVOQyhpbnRfc2tfYWxsb2MpLAotCQlbTUVUQV9JRChTS19ST1VURV9DQVBTKV0JPSBNRVRBX0ZVTkMoaW50X3NrX3JvdXRlX2NhcHMpLAogCQlbTUVUQV9JRChTS19IQVNIKV0JCT0gTUVUQV9GVU5DKGludF9za19oYXNoKSwKIAkJW01FVEFfSUQoU0tfTElOR0VSVElNRSldCT0gTUVUQV9GVU5DKGludF9za19saW5nZXJ0aW1lKSwKIAkJW01FVEFfSUQoU0tfQUNLX0JBQ0tMT0cpXQk9IE1FVEFfRlVOQyhpbnRfc2tfYWNrX2JsKSwKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfYXBpLmMgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCmluZGV4IDZiODYyNzYuLmRjYTZjMWEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfYXBpLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9hcGkuYwpAQCAtMTY0NCw3ICsxNjQ0LDcgQEAKICAqIHRvIHRoaXMgcWRpc2MsIChvcHRpb25hbGx5KSB0ZXN0cyBmb3IgcHJvdG9jb2wgYW5kIGFza3MKICAqIHNwZWNpZmljIGNsYXNzaWZpZXJzLgogICovCi1pbnQgdGNfY2xhc3NpZnlfY29tcGF0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAoraW50IHRjX2NsYXNzaWZ5X2NvbXBhdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKIAkJICAgICAgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCiB7CiAJX19iZTE2IHByb3RvY29sID0gc2tiLT5wcm90b2NvbDsKQEAgLTE2NjgsMTIgKzE2NjgsMTIgQEAKIH0KIEVYUE9SVF9TWU1CT0wodGNfY2xhc3NpZnlfY29tcGF0KTsKIAotaW50IHRjX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAoraW50IHRjX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAogCQlzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogCWludCBlcnIgPSAwOwogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAotCXN0cnVjdCB0Y2ZfcHJvdG8gKm90cCA9IHRwOworCWNvbnN0IHN0cnVjdCB0Y2ZfcHJvdG8gKm90cCA9IHRwOwogcmVjbGFzc2lmeToKICNlbmRpZgogCkBAIC0xNzkyLDEyICsxNzkyLDEyIEBACiAJcmVnaXN0ZXJfcWRpc2MoJnBmaWZvX2hlYWRfZHJvcF9xZGlzY19vcHMpOwogCXJlZ2lzdGVyX3FkaXNjKCZtcV9xZGlzY19vcHMpOwogCi0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdRRElTQywgdGNfbW9kaWZ5X3FkaXNjLCBOVUxMKTsKLQlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0RFTFFESVNDLCB0Y19nZXRfcWRpc2MsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUUURJU0MsIHRjX2dldF9xZGlzYywgdGNfZHVtcF9xZGlzYyk7Ci0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdUQ0xBU1MsIHRjX2N0bF90Y2xhc3MsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fREVMVENMQVNTLCB0Y19jdGxfdGNsYXNzLCBOVUxMKTsKLQlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVFRDTEFTUywgdGNfY3RsX3RjbGFzcywgdGNfZHVtcF90Y2xhc3MpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fTkVXUURJU0MsIHRjX21vZGlmeV9xZGlzYywgTlVMTCwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxRRElTQywgdGNfZ2V0X3FkaXNjLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVFFESVNDLCB0Y19nZXRfcWRpc2MsIHRjX2R1bXBfcWRpc2MsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fTkVXVENMQVNTLCB0Y19jdGxfdGNsYXNzLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0RFTFRDTEFTUywgdGNfY3RsX3RjbGFzcywgTlVMTCwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRUQ0xBU1MsIHRjX2N0bF90Y2xhc3MsIHRjX2R1bXBfdGNsYXNzLCBOVUxMKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9hdG0uYyBiL25ldC9zY2hlZC9zY2hfYXRtLmMKaW5kZXggM2YwODE1OC4uZTI1ZTQ5MCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9hdG0uYworKysgYi9uZXQvc2NoZWQvc2NoX2F0bS5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfY2hva2UuYyBiL25ldC9zY2hlZC9zY2hfY2hva2UuYwppbmRleCAwNmFmYmFlLi4zNDIyYjI1IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2Nob2tlLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9jaG9rZS5jCkBAIC0xODEsNyArMTgxLDcgQEAKIAkJICAgIGlwMS0+c2FkZHIgIT0gaXAyLT5zYWRkciB8fCBpcDEtPmRhZGRyICE9IGlwMi0+ZGFkZHIpCiAJCQlyZXR1cm4gZmFsc2U7CiAKLQkJaWYgKChpcDEtPmZyYWdfb2ZmIHwgaXAyLT5mcmFnX29mZikgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpCisJCWlmIChpcF9pc19mcmFnbWVudChpcDEpIHwgaXBfaXNfZnJhZ21lbnQoaXAyKSkKIAkJCWlwX3Byb3RvID0gMDsKIAkJb2ZmMSArPSBpcDEtPmlobCAqIDQ7CiAJCW9mZjIgKz0gaXAyLT5paGwgKiA0OwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwppbmRleCBiMTcyMWQ3Li42OWZjYTI3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYworKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtMTg5LDE1ICsxODksMTUgQEAKIAogdm9pZCBfX3FkaXNjX3J1bihzdHJ1Y3QgUWRpc2MgKnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gamlmZmllczsKKwlpbnQgcXVvdGEgPSB3ZWlnaHRfcDsKIAogCXdoaWxlIChxZGlzY19yZXN0YXJ0KHEpKSB7CiAJCS8qCi0JCSAqIFBvc3Rwb25lIHByb2Nlc3NpbmcgaWYKLQkJICogMS4gYW5vdGhlciBwcm9jZXNzIG5lZWRzIHRoZSBDUFU7Ci0JCSAqIDIuIHdlJ3ZlIGJlZW4gZG9pbmcgaXQgZm9yIHRvbyBsb25nLgorCQkgKiBPcmRlcmVkIGJ5IHBvc3NpYmxlIG9jY3VycmVuY2U6IFBvc3Rwb25lIHByb2Nlc3NpbmcgaWYKKwkJICogMS4gd2UndmUgZXhjZWVkZWQgcGFja2V0IHF1b3RhCisJCSAqIDIuIGFub3RoZXIgcHJvY2VzcyBuZWVkcyB0aGUgQ1BVOwogCQkgKi8KLQkJaWYgKG5lZWRfcmVzY2hlZCgpIHx8IGppZmZpZXMgIT0gc3RhcnRfdGltZSkgeworCQlpZiAoLS1xdW90YSA8PSAwIHx8IG5lZWRfcmVzY2hlZCgpKSB7CiAJCQlfX25ldGlmX3NjaGVkdWxlKHEpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTI1MSw5ICsyNTEsOCBAQAogCQkJfQogCiAJCQlpZiAoc29tZV9xdWV1ZV90aW1lZG91dCkgewotCQkJCWNoYXIgZHJpdmVybmFtZVs2NF07CiAJCQkJV0FSTl9PTkNFKDEsIEtFUk5fSU5GTyAiTkVUREVWIFdBVENIRE9HOiAlcyAoJXMpOiB0cmFuc21pdCBxdWV1ZSAldSB0aW1lZCBvdXRcbiIsCi0JCQkJICAgICAgIGRldi0+bmFtZSwgbmV0ZGV2X2RyaXZlcm5hbWUoZGV2LCBkcml2ZXJuYW1lLCA2NCksIGkpOworCQkJCSAgICAgICBkZXYtPm5hbWUsIG5ldGRldl9kcml2ZXJuYW1lKGRldiksIGkpOwogCQkJCWRldi0+bmV0ZGV2X29wcy0+bmRvX3R4X3RpbWVvdXQoZGV2KTsKIAkJCX0KIAkJCWlmICghbW9kX3RpbWVyKCZkZXYtPndhdGNoZG9nX3RpbWVyLApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9uZXRlbS5jIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCmluZGV4IDY5YzM1ZjYuLmViM2I5YTggMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfbmV0ZW0uYworKysgYi9uZXQvc2NoZWQvc2NoX25ldGVtLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqCQlDYXRhbGluKHV4IGFrYSBEaW5vKSBCT0lFIDxjYXRhYiBhdCB1bWJyZWxsYSBkb3Qgcm8+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3NmcS5jIGIvbmV0L3NjaGVkL3NjaF9zZnEuYwppbmRleCBiNmVhNmFmLi40NTM2ZWU2IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3NmcS5jCisrKyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCQlpcGggPSBpcF9oZHIoc2tiKTsKIAkJaCA9IChfX2ZvcmNlIHUzMilpcGgtPmRhZGRyOwogCQloMiA9IChfX2ZvcmNlIHUzMilpcGgtPnNhZGRyIF4gaXBoLT5wcm90b2NvbDsKLQkJaWYgKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpCisJCWlmIChpcF9pc19mcmFnbWVudChpcGgpKQogCQkJYnJlYWs7CiAJCXBvZmYgPSBwcm90b19wb3J0c19vZmZzZXQoaXBoLT5wcm90b2NvbCk7CiAJCWlmIChwb2ZmID49IDAgJiYKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfdGVxbC5jIGIvbmV0L3NjaGVkL3NjaF90ZXFsLmMKaW5kZXggNDVjZDMwMC4uYTNiNzEyMCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF90ZXFsLmMKKysrIGIvbmV0L3NjaGVkL3NjaF90ZXFsLmMKQEAgLTIyOSw3ICsyMjksNyBAQAogewogCXN0cnVjdCBuZXRkZXZfcXVldWUgKmRldl9xdWV1ZSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCAwKTsKIAlzdHJ1Y3QgdGVxbF9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihkZXZfcXVldWUtPnFkaXNjKTsKLQlzdHJ1Y3QgbmVpZ2hib3VyICptbiA9IHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyOworCXN0cnVjdCBuZWlnaGJvdXIgKm1uID0gZHN0X2dldF9uZWlnaGJvdXIoc2tiX2RzdChza2IpKTsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gcS0+bmNhY2hlOwogCiAJaWYgKG1uLT50YmwgPT0gTlVMTCkKQEAgLTI3MCw3ICsyNzAsNyBAQAogCiAJaWYgKGRldi0+aGVhZGVyX29wcyA9PSBOVUxMIHx8CiAJICAgIHNrYl9kc3Qoc2tiKSA9PSBOVUxMIHx8Ci0JICAgIHNrYl9kc3Qoc2tiKS0+bmVpZ2hib3VyID09IE5VTEwpCisJICAgIGRzdF9nZXRfbmVpZ2hib3VyKHNrYl9kc3Qoc2tiKSkgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIF9fdGVxbF9yZXNvbHZlKHNrYiwgc2tiX3JlcywgZGV2KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY3RwL2Fzc29jaW9sYS5jIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKaW5kZXggNGE2Mjg4OC4uZGMxNmI5MCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYXNzb2Npb2xhLmMKKysrIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKQEAgLTI4MCw2ICsyODAsOCBAQAogCWFzb2MtPnBlZXIuYXNjb25mX2NhcGFibGUgPSAwOwogCWlmIChzY3RwX2FkZGlwX25vYXV0aCkKIAkJYXNvYy0+cGVlci5hc2NvbmZfY2FwYWJsZSA9IDE7CisJYXNvYy0+YXNjb25mX2FkZHJfZGVsX3BlbmRpbmcgPSBOVUxMOworCWFzb2MtPnNyY19vdXRfb2ZfYXNvY19vayA9IDA7CiAKIAkvKiBDcmVhdGUgYW4gaW5wdXQgcXVldWUuICAqLwogCXNjdHBfaW5xX2luaXQoJmFzb2MtPmJhc2UuaW5xdWV1ZSk7CkBAIC00NDYsNiArNDQ4LDEwIEBACiAKIAlzY3RwX2FzY29uZl9xdWV1ZV90ZWFyZG93bihhc29jKTsKIAorCS8qIEZyZWUgcGVuZGluZyBhZGRyZXNzIHNwYWNlIGJlaW5nIGRlbGV0ZWQgKi8KKwlpZiAoYXNvYy0+YXNjb25mX2FkZHJfZGVsX3BlbmRpbmcgIT0gTlVMTCkKKwkJa2ZyZWUoYXNvYy0+YXNjb25mX2FkZHJfZGVsX3BlbmRpbmcpOworCiAJLyogQVVUSCAtIEZyZWUgdGhlIGVuZHBvaW50IHNoYXJlZCBrZXlzICovCiAJc2N0cF9hdXRoX2Rlc3Ryb3lfa2V5cygmYXNvYy0+ZW5kcG9pbnRfc2hhcmVkX2tleXMpOwogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9iaW5kX2FkZHIuYyBiL25ldC9zY3RwL2JpbmRfYWRkci5jCmluZGV4IDgzZTMwMTEuLjRlY2U0NTEgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2JpbmRfYWRkci5jCisrKyBiL25ldC9zY3RwL2JpbmRfYWRkci5jCkBAIC00MzAsNyArNDMwLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxhZGRyLCAmYnAtPmFkZHJlc3NfbGlzdCwgbGlzdCkgewogCQlhZGRyX2J1ZiA9ICh1bmlvbiBzY3RwX2FkZHIgKilhZGRyczsKIAkJZm9yIChpID0gMDsgaSA8IGFkZHJjbnQ7IGkrKykgewotCQkJYWRkciA9ICh1bmlvbiBzY3RwX2FkZHIgKilhZGRyX2J1ZjsKKwkJCWFkZHIgPSBhZGRyX2J1ZjsKIAkJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkci0+djQuc2luX2ZhbWlseSk7CiAJCQlpZiAoIWFmKQogCQkJCWJyZWFrOwpAQCAtNTM0LDYgKzUzNCwyMSBAQAogCXJldHVybiAwOwogfQogCitpbnQgc2N0cF9pc19lcF9ib3VuZGFsbChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNjdHBfYmluZF9hZGRyICpicDsKKwlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqYWRkcjsKKworCWJwID0gJnNjdHBfc2soc2spLT5lcC0+YmFzZS5iaW5kX2FkZHI7CisJaWYgKHNjdHBfbGlzdF9zaW5nbGVfZW50cnkoJmJwLT5hZGRyZXNzX2xpc3QpKSB7CisJCWFkZHIgPSBsaXN0X2VudHJ5KGJwLT5hZGRyZXNzX2xpc3QubmV4dCwKKwkJCQkgIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKKwkJaWYgKHNjdHBfaXNfYW55KHNrLCAmYWRkci0+YSkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogM3JkIExldmVsIEFic3RyYWN0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvaW5wdXQuYyBiL25ldC9zY3RwL2lucHV0LmMKaW5kZXggNzQxZWQxNi4uYjc2OTJhYSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaW5wdXQuYworKysgYi9uZXQvc2N0cC9pbnB1dC5jCkBAIC01MTAsOCArNTEwLDcgQEAKIAkgKiBkaXNjYXJkIHRoZSBwYWNrZXQuCiAJICovCiAJaWYgKHZ0YWcgPT0gMCkgewotCQljaHVua2hkciA9IChzdHJ1Y3Qgc2N0cF9pbml0X2NodW5rICopKCh2b2lkICopc2N0cGhkcgotCQkJCSsgc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSk7CisJCWNodW5raGRyID0gKHZvaWQgKilzY3RwaGRyICsgc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKTsKIAkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3Qgc2N0cGhkcikgKyBzaXplb2Yoc2N0cF9jaHVua2hkcl90KQogCQkJICArIHNpemVvZihfX2JlMzIpIHx8CiAJCSAgICBjaHVua2hkci0+Y2h1bmtfaGRyLnR5cGUgIT0gU0NUUF9DSURfSU5JVCB8fApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvaXB2Ni5jIGIvbmV0L3NjdHAvaXB2Ni5jCmluZGV4IDBiYjBkN2MuLmFhYmFlZTQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lwdjYuYworKysgYi9uZXQvc2N0cC9pcHY2LmMKQEAgLTExMiw2ICsxMTIsNyBAQAogCQkJYWRkci0+dmFsaWQgPSAxOwogCQkJc3Bpbl9sb2NrX2JoKCZzY3RwX2xvY2FsX2FkZHJfbG9jayk7CiAJCQlsaXN0X2FkZF90YWlsX3JjdSgmYWRkci0+bGlzdCwgJnNjdHBfbG9jYWxfYWRkcl9saXN0KTsKKwkJCXNjdHBfYWRkcl93cV9tZ210KGFkZHIsIFNDVFBfQUREUl9ORVcpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnNjdHBfbG9jYWxfYWRkcl9sb2NrKTsKIAkJfQogCQlicmVhazsKQEAgLTEyMiw2ICsxMjMsNyBAQAogCQkJaWYgKGFkZHItPmEuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2ICYmCiAJCQkJCWlwdjZfYWRkcl9lcXVhbCgmYWRkci0+YS52Ni5zaW42X2FkZHIsCiAJCQkJCQkmaWZhLT5hZGRyKSkgeworCQkJCXNjdHBfYWRkcl93cV9tZ210KGFkZHIsIFNDVFBfQUREUl9ERUwpOwogCQkJCWZvdW5kID0gMTsKIAkJCQlhZGRyLT52YWxpZCA9IDA7CiAJCQkJbGlzdF9kZWxfcmN1KCZhZGRyLT5saXN0KTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL291dHB1dC5jIGIvbmV0L3NjdHAvb3V0cHV0LmMKaW5kZXggYjRmM2NmMC4uMDhiM2NlYSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvb3V0cHV0LmMKKysrIGIvbmV0L3NjdHAvb3V0cHV0LmMKQEAgLTUwMCwyMyArNTAwLDIwIEBACiAJICogTm90ZTogQWRsZXItMzIgaXMgbm8gbG9uZ2VyIGFwcGxpY2FibGUsIGFzIGhhcyBiZWVuIHJlcGxhY2VkCiAJICogYnkgQ1JDMzItQyBhcyBkZXNjcmliZWQgaW4gPGRyYWZ0LWlldGYtdHN2d2ctc2N0cGNzdW0tMDIudHh0Pi4KIAkgKi8KLQlpZiAoIXNjdHBfY2hlY2tzdW1fZGlzYWJsZSAmJgotCSAgICAhKGRzdC0+ZGV2LT5mZWF0dXJlcyAmIChORVRJRl9GX05PX0NTVU0gfCBORVRJRl9GX1NDVFBfQ1NVTSkpKSB7Ci0JCV9fdTMyIGNyYzMyID0gc2N0cF9zdGFydF9ja3N1bSgoX191OCAqKXNoLCBja3N1bV9idWZfbGVuKTsKKwlpZiAoIXNjdHBfY2hlY2tzdW1fZGlzYWJsZSkgeworCQlpZiAoIShkc3QtPmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NDVFBfQ1NVTSkpIHsKKwkJCV9fdTMyIGNyYzMyID0gc2N0cF9zdGFydF9ja3N1bSgoX191OCAqKXNoLCBja3N1bV9idWZfbGVuKTsKIAotCQkvKiAzKSBQdXQgdGhlIHJlc3VsdGFudCB2YWx1ZSBpbnRvIHRoZSBjaGVja3N1bSBmaWVsZCBpbiB0aGUKLQkJICogICAgY29tbW9uIGhlYWRlciwgYW5kIGxlYXZlIHRoZSByZXN0IG9mIHRoZSBiaXRzIHVuY2hhbmdlZC4KLQkJICovCi0JCXNoLT5jaGVja3N1bSA9IHNjdHBfZW5kX2Nrc3VtKGNyYzMyKTsKLQl9IGVsc2UgewotCQlpZiAoZHN0LT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9TQ1RQX0NTVU0pIHsKKwkJCS8qIDMpIFB1dCB0aGUgcmVzdWx0YW50IHZhbHVlIGludG8gdGhlIGNoZWNrc3VtIGZpZWxkIGluIHRoZQorCQkJICogICAgY29tbW9uIGhlYWRlciwgYW5kIGxlYXZlIHRoZSByZXN0IG9mIHRoZSBiaXRzIHVuY2hhbmdlZC4KKwkJCSAqLworCQkJc2gtPmNoZWNrc3VtID0gc2N0cF9lbmRfY2tzdW0oY3JjMzIpOworCQl9IGVsc2UgewogCQkJLyogbm8gbmVlZCB0byBzZWVkIHBzZXVkbyBjaGVja3N1bSBmb3IgU0NUUCAqLwogCQkJbnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKIAkJCW5za2ItPmNzdW1fc3RhcnQgPSAoc2tiX3RyYW5zcG9ydF9oZWFkZXIobnNrYikgLQogCQkJICAgICAgICAgICAgICAgICAgICBuc2tiLT5oZWFkKTsKIAkJCW5za2ItPmNzdW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjdHBoZHIsIGNoZWNrc3VtKTsKLQkJfSBlbHNlIHsKLQkJCW5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRxdWV1ZS5jIGIvbmV0L3NjdHAvb3V0cXVldWUuYwppbmRleCAxYzg4Yzg5Li5hNmQyN2JmIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRxdWV1ZS5jCisrKyBiL25ldC9zY3RwL291dHF1ZXVlLmMKQEAgLTc1NCw2ICs3NTQsMTYgQEAKIAkgKi8KIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaHVuaywgdG1wLCAmcS0+Y29udHJvbF9jaHVua19saXN0LCBsaXN0KSB7CisJCS8qIFJGQyA1MDYxLCA1LjMKKwkJICogRjEpIFRoaXMgbWVhbnMgdGhhdCB1bnRpbCBzdWNoIHRpbWUgYXMgdGhlIEFTQ09ORgorCQkgKiBjb250YWluaW5nIHRoZSBhZGQgaXMgYWNrbm93bGVkZ2VkLCB0aGUgc2VuZGVyIE1VU1QKKwkJICogTk9UIHVzZSB0aGUgbmV3IElQIGFkZHJlc3MgYXMgYSBzb3VyY2UgZm9yIEFOWSBTQ1RQCisJCSAqIHBhY2tldCBleGNlcHQgb24gY2FycnlpbmcgYW4gQVNDT05GIENodW5rLgorCQkgKi8KKwkJaWYgKGFzb2MtPnNyY19vdXRfb2ZfYXNvY19vayAmJgorCQkgICAgY2h1bmstPmNodW5rX2hkci0+dHlwZSAhPSBTQ1RQX0NJRF9BU0NPTkYpCisJCQljb250aW51ZTsKKwogCQlsaXN0X2RlbF9pbml0KCZjaHVuay0+bGlzdCk7CiAKIAkJLyogUGljayB0aGUgcmlnaHQgdHJhbnNwb3J0IHRvIHVzZS4gKi8KQEAgLTg4MSw2ICs4OTEsOSBAQAogCQl9CiAJfQogCisJaWYgKHEtPmFzb2MtPnNyY19vdXRfb2ZfYXNvY19vaykKKwkJZ290byBzY3RwX2ZsdXNoX291dDsKKwogCS8qIElzIGl0IE9LIHRvIHNlbmQgZGF0YSBjaHVua3M/ICAqLwogCXN3aXRjaCAoYXNvYy0+c3RhdGUpIHsKIAljYXNlIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRDoKQEAgLTE1ODIsNiArMTU5NSw4IEBACiAjZW5kaWYgLyogU0NUUF9ERUJVRyAqLwogCWlmICh0cmFuc3BvcnQpIHsKIAkJaWYgKGJ5dGVzX2Fja2VkKSB7CisJCQlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IHRyYW5zcG9ydC0+YXNvYzsKKwogCQkJLyogV2UgbWF5IGhhdmUgY291bnRlZCBEQVRBIHRoYXQgd2FzIG1pZ3JhdGVkCiAJCQkgKiB0byB0aGlzIHRyYW5zcG9ydCBkdWUgdG8gREVMLUlQIG9wZXJhdGlvbi4KIAkJCSAqIFN1YnRyYWN0IHRob3NlIGJ5dGVzLCBzaW5jZSB0aGUgd2VyZSBuZXZlcgpAQCAtMTYwMCw2ICsxNjE1LDE3IEBACiAJCQl0cmFuc3BvcnQtPmVycm9yX2NvdW50ID0gMDsKIAkJCXRyYW5zcG9ydC0+YXNvYy0+b3ZlcmFsbF9lcnJvcl9jb3VudCA9IDA7CiAKKwkJCS8qCisJCQkgKiBXaGlsZSBpbiBTSFVURE9XTiBQRU5ESU5HLCB3ZSBtYXkgaGF2ZSBzdGFydGVkCisJCQkgKiB0aGUgVDUgc2h1dGRvd24gZ3VhcmQgdGltZXIgYWZ0ZXIgcmVhY2hpbmcgdGhlCisJCQkgKiByZXRyYW5zbWlzc2lvbiBsaW1pdC4gU3RvcCB0aGF0IHRpbWVyIGFzIHNvb24KKwkJCSAqIGFzIHRoZSByZWNlaXZlciBhY2tub3dsZWRnZWQgYW55IGRhdGEuCisJCQkgKi8KKwkJCWlmIChhc29jLT5zdGF0ZSA9PSBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgJiYKKwkJCSAgICBkZWxfdGltZXIoJmFzb2MtPnRpbWVycworCQkJCVtTQ1RQX0VWRU5UX1RJTUVPVVRfVDVfU0hVVERPV05fR1VBUkRdKSkKKwkJCQkJc2N0cF9hc3NvY2lhdGlvbl9wdXQoYXNvYyk7CisKIAkJCS8qIE1hcmsgdGhlIGRlc3RpbmF0aW9uIHRyYW5zcG9ydCBhZGRyZXNzIGFzCiAJCQkgKiBhY3RpdmUgaWYgaXQgaXMgbm90IHNvIG1hcmtlZC4KIAkJCSAqLwpAQCAtMTYyOSwxMCArMTY1NSwxNSBAQAogCQkJICogQSBzZW5kZXIgaXMgZG9pbmcgemVybyB3aW5kb3cgcHJvYmluZyB3aGVuIHRoZQogCQkJICogcmVjZWl2ZXIncyBhZHZlcnRpc2VkIHdpbmRvdyBpcyB6ZXJvLCBhbmQgdGhlcmUgaXMKIAkJCSAqIG9ubHkgb25lIGRhdGEgY2h1bmsgaW4gZmxpZ2h0IHRvIHRoZSByZWNlaXZlci4KKwkJCSAqCisJCQkgKiBBbGxvdyB0aGUgYXNzb2NpYXRpb24gdG8gdGltZW91dCB3aGlsZSBpbiBTSFVURE9XTgorCQkJICogUEVORElORyBvciBTSFVURE9XTiBSRUNFSVZFRCBpbiBjYXNlIHRoZSByZWNlaXZlcgorCQkJICogc3RheXMgaW4gemVybyB3aW5kb3cgbW9kZSBmb3JldmVyLgogCQkJICovCiAJCQlpZiAoIXEtPmFzb2MtPnBlZXIucnduZCAmJgogCQkJICAgICFsaXN0X2VtcHR5KCZ0bGlzdCkgJiYKLQkJCSAgICAoc2Fja19jdHNuKzIgPT0gcS0+YXNvYy0+bmV4dF90c24pKSB7CisJCQkgICAgKHNhY2tfY3RzbisyID09IHEtPmFzb2MtPm5leHRfdHNuKSAmJgorCQkJICAgIHEtPmFzb2MtPnN0YXRlIDwgU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HKSB7CiAJCQkJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBTQUNLIHJlY2VpdmVkIGZvciB6ZXJvICIKIAkJCQkJCSAgIndpbmRvdyBwcm9iZTogJXVcbiIsCiAJCQkJCQkgIF9fZnVuY19fLCBzYWNrX2N0c24pOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvdG9jb2wuYyBiL25ldC9zY3RwL3Byb3RvY29sLmMKaW5kZXggNjczODBhMi4uOTE3ODRmNCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvcHJvdG9jb2wuYworKysgYi9uZXQvc2N0cC9wcm90b2NvbC5jCkBAIC01MDMsNyArNTAzLDkgQEAKIAkJc2N0cF92NF9kc3Rfc2FkZHIoJmRzdF9zYWRkciwgZmw0LCBodG9ucyhicC0+cG9ydCkpOwogCQlyY3VfcmVhZF9sb2NrKCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGxhZGRyLCAmYnAtPmFkZHJlc3NfbGlzdCwgbGlzdCkgewotCQkJaWYgKCFsYWRkci0+dmFsaWQgfHwgKGxhZGRyLT5zdGF0ZSAhPSBTQ1RQX0FERFJfU1JDKSkKKwkJCWlmICghbGFkZHItPnZhbGlkIHx8IChsYWRkci0+c3RhdGUgPT0gU0NUUF9BRERSX0RFTCkgfHwKKwkJCSAgICAobGFkZHItPnN0YXRlICE9IFNDVFBfQUREUl9TUkMgJiYKKwkJCSAgICAhYXNvYy0+c3JjX291dF9vZl9hc29jX29rKSkKIAkJCQljb250aW51ZTsKIAkJCWlmIChzY3RwX3Y0X2NtcF9hZGRyKCZkc3Rfc2FkZHIsICZsYWRkci0+YSkpCiAJCQkJZ290byBvdXRfdW5sb2NrOwpAQCAtNjIzLDYgKzYyNSwxNDMgQEAKIAlJTkVUX0VDTl94bWl0KHNrKTsKIH0KIAordm9pZCBzY3RwX2FkZHJfd3FfdGltZW91dF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRydywgKnRlbXA7CisJc3RydWN0IHNjdHBfc29jayAqc3A7CisKKwlzcGluX2xvY2tfYmgoJnNjdHBfYWRkcl93cV9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhZGRydywgdGVtcCwgJnNjdHBfYWRkcl93YWl0cSwgbGlzdCkgeworCQlTQ1RQX0RFQlVHX1BSSU5US19JUEFERFIoInNjdHBfYWRkcndxX3RpbW9faGFuZGxlcjogdGhlIGZpcnN0IGVudCBpbiB3cSAlcCBpcyAiLAorCQkgICAgIiBmb3IgY21kICVkIGF0IGVudHJ5ICVwXG4iLCAmc2N0cF9hZGRyX3dhaXRxLCAmYWRkcnctPmEsIGFkZHJ3LT5zdGF0ZSwKKwkJICAgIGFkZHJ3KTsKKworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKKwkJLyogTm93IHdlIHNlbmQgYW4gQVNDT05GIGZvciBlYWNoIGFzc29jaWF0aW9uICovCisJCS8qIE5vdGUuIHdlIGN1cnJlbnRseSBkb24ndCBoYW5kbGUgbGluayBsb2NhbCBJUHY2IGFkZHJlc3NlZXMgKi8KKwkJaWYgKGFkZHJ3LT5hLnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkJc3RydWN0IGluNl9hZGRyICppbjY7CisKKwkJCWlmIChpcHY2X2FkZHJfdHlwZSgmYWRkcnctPmEudjYuc2luNl9hZGRyKSAmCisJCQkgICAgSVBWNl9BRERSX0xJTktMT0NBTCkKKwkJCQlnb3RvIGZyZWVfbmV4dDsKKworCQkJaW42ID0gKHN0cnVjdCBpbjZfYWRkciAqKSZhZGRydy0+YS52Ni5zaW42X2FkZHI7CisJCQlpZiAoaXB2Nl9jaGtfYWRkcigmaW5pdF9uZXQsIGluNiwgTlVMTCwgMCkgPT0gMCAmJgorCQkJICAgIGFkZHJ3LT5zdGF0ZSA9PSBTQ1RQX0FERFJfTkVXKSB7CisJCQkJdW5zaWduZWQgbG9uZyB0aW1lb192YWw7CisKKwkJCQlTQ1RQX0RFQlVHX1BSSU5USygic2N0cF90aW1vX2hhbmRsZXI6IHRoaXMgaXMgb24gREFELCB0cnlpbmcgJWQgc2VjIGxhdGVyXG4iLAorCQkJCSAgICBTQ1RQX0FERFJFU1NfVElDS19ERUxBWSk7CisJCQkJdGltZW9fdmFsID0gamlmZmllczsKKwkJCQl0aW1lb192YWwgKz0gbXNlY3NfdG9famlmZmllcyhTQ1RQX0FERFJFU1NfVElDS19ERUxBWSk7CisJCQkJbW9kX3RpbWVyKCZzY3RwX2FkZHJfd3FfdGltZXIsIHRpbWVvX3ZhbCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNlbmRpZgorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwLCAmc2N0cF9hdXRvX2FzY29uZl9zcGxpc3QsIGF1dG9fYXNjb25mX2xpc3QpIHsKKwkJCXN0cnVjdCBzb2NrICpzazsKKworCQkJc2sgPSBzY3RwX29wdDJzayhzcCk7CisJCQkvKiBpZ25vcmUgYm91bmQtc3BlY2lmaWMgZW5kcG9pbnRzICovCisJCQlpZiAoIXNjdHBfaXNfZXBfYm91bmRhbGwoc2spKQorCQkJCWNvbnRpbnVlOworCQkJc2N0cF9iaF9sb2NrX3NvY2soc2spOworCQkJaWYgKHNjdHBfYXNjb25mX21nbXQoc3AsIGFkZHJ3KSA8IDApCisJCQkJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfYWRkcndxX3RpbW9faGFuZGxlcjogc2N0cF9hc2NvbmZfbWdtdCBmYWlsZWRcbiIpOworCQkJc2N0cF9iaF91bmxvY2tfc29jayhzayk7CisJCX0KK2ZyZWVfbmV4dDoKKwkJbGlzdF9kZWwoJmFkZHJ3LT5saXN0KTsKKwkJa2ZyZWUoYWRkcncpOworCX0KKwlzcGluX3VubG9ja19iaCgmc2N0cF9hZGRyX3dxX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzY3RwX2ZyZWVfYWRkcl93cSh2b2lkKQoreworCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRydzsKKwlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqdGVtcDsKKworCXNwaW5fbG9ja19iaCgmc2N0cF9hZGRyX3dxX2xvY2spOworCWRlbF90aW1lcigmc2N0cF9hZGRyX3dxX3RpbWVyKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWRkcncsIHRlbXAsICZzY3RwX2FkZHJfd2FpdHEsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmFkZHJ3LT5saXN0KTsKKwkJa2ZyZWUoYWRkcncpOworCX0KKwlzcGluX3VubG9ja19iaCgmc2N0cF9hZGRyX3dxX2xvY2spOworfQorCisvKiBsb29rdXAgdGhlIGVudHJ5IGZvciB0aGUgc2FtZSBhZGRyZXNzIGluIHRoZSBhZGRyX3dhaXRxCisgKiBzY3RwX2FkZHJfd3EgTVVTVCBiZSBsb2NrZWQKKyAqLworc3RhdGljIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICpzY3RwX2FkZHJfd3FfbG9va3VwKHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRyKQoreworCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRydzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRkcncsICZzY3RwX2FkZHJfd2FpdHEsIGxpc3QpIHsKKwkJaWYgKGFkZHJ3LT5hLnNhLnNhX2ZhbWlseSAhPSBhZGRyLT5hLnNhLnNhX2ZhbWlseSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYWRkcnctPmEuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJCWlmIChhZGRydy0+YS52NC5zaW5fYWRkci5zX2FkZHIgPT0KKwkJCSAgICBhZGRyLT5hLnY0LnNpbl9hZGRyLnNfYWRkcikKKwkJCQlyZXR1cm4gYWRkcnc7CisJCX0gZWxzZSBpZiAoYWRkcnctPmEuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZhZGRydy0+YS52Ni5zaW42X2FkZHIsCisJCQkgICAgJmFkZHItPmEudjYuc2luNl9hZGRyKSkKKwkJCQlyZXR1cm4gYWRkcnc7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgc2N0cF9hZGRyX3dxX21nbXQoc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHIsIGludCBjbWQpCit7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHJ3OworCXVuc2lnbmVkIGxvbmcgdGltZW9fdmFsOworCisJLyogZmlyc3QsIHdlIGNoZWNrIGlmIGFuIG9wcG9zaXRlIG1lc3NhZ2UgYWxyZWFkeSBleGlzdCBpbiB0aGUgcXVldWUuCisJICogSWYgd2UgZm91bmQgc3VjaCBtZXNzYWdlLCBpdCBpcyByZW1vdmVkLgorCSAqIFRoaXMgb3BlcmF0aW9uIGlzIGEgYml0IHN0dXBpZCwgYnV0IHRoZSBESENQIGNsaWVudCBhdHRhY2hlcyB0aGUKKwkgKiBuZXcgYWRkcmVzcyBhZnRlciBhIGNvdXBsZSBvZiBhZGRpdGlvbiBhbmQgZGVsZXRpb24gb2YgdGhhdCBhZGRyZXNzCisJICovCisKKwlzcGluX2xvY2tfYmgoJnNjdHBfYWRkcl93cV9sb2NrKTsKKwkvKiBPZmZzZXRzIGV4aXN0aW5nIGV2ZW50cyBpbiBhZGRyX3dxICovCisJYWRkcncgPSBzY3RwX2FkZHJfd3FfbG9va3VwKGFkZHIpOworCWlmIChhZGRydykgeworCQlpZiAoYWRkcnctPnN0YXRlICE9IGNtZCkgeworCQkJU0NUUF9ERUJVR19QUklOVEtfSVBBRERSKCJzY3RwX2FkZHJfd3FfbWdtdCBvZmZzZXRzIGV4aXN0aW5nIGVudHJ5IGZvciAlZCAiLAorCQkJICAgICIgaW4gd3EgJXBcbiIsIGFkZHJ3LT5zdGF0ZSwgJmFkZHJ3LT5hLAorCQkJICAgICZzY3RwX2FkZHJfd2FpdHEpOworCQkJbGlzdF9kZWwoJmFkZHJ3LT5saXN0KTsKKwkJCWtmcmVlKGFkZHJ3KTsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmc2N0cF9hZGRyX3dxX2xvY2spOworCQlyZXR1cm47CisJfQorCisJLyogT0ssIHdlIGhhdmUgdG8gYWRkIHRoZSBuZXcgYWRkcmVzcyB0byB0aGUgd2FpdCBxdWV1ZSAqLworCWFkZHJ3ID0ga21lbWR1cChhZGRyLCBzaXplb2Yoc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoYWRkcncgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19iaCgmc2N0cF9hZGRyX3dxX2xvY2spOworCQlyZXR1cm47CisJfQorCWFkZHJ3LT5zdGF0ZSA9IGNtZDsKKwlsaXN0X2FkZF90YWlsKCZhZGRydy0+bGlzdCwgJnNjdHBfYWRkcl93YWl0cSk7CisJU0NUUF9ERUJVR19QUklOVEtfSVBBRERSKCJzY3RwX2FkZHJfd3FfbWdtdCBhZGQgbmV3IGVudHJ5IGZvciBjbWQ6JWQgIiwKKwkgICAgIiBpbiB3cSAlcFxuIiwgYWRkcnctPnN0YXRlLCAmYWRkcnctPmEsICZzY3RwX2FkZHJfd2FpdHEpOworCisJaWYgKCF0aW1lcl9wZW5kaW5nKCZzY3RwX2FkZHJfd3FfdGltZXIpKSB7CisJCXRpbWVvX3ZhbCA9IGppZmZpZXM7CisJCXRpbWVvX3ZhbCArPSBtc2Vjc190b19qaWZmaWVzKFNDVFBfQUREUkVTU19USUNLX0RFTEFZKTsKKwkJbW9kX3RpbWVyKCZzY3RwX2FkZHJfd3FfdGltZXIsIHRpbWVvX3ZhbCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZzY3RwX2FkZHJfd3FfbG9jayk7Cit9CisKIC8qIEV2ZW50IGhhbmRsZXIgZm9yIGluZXQgYWRkcmVzcyBhZGRpdGlvbi9kZWxldGlvbiBldmVudHMuCiAgKiBUaGUgc2N0cF9sb2NhbF9hZGRyX2xpc3QgbmVlZHMgdG8gYmUgcHJvdG9jdGVkIGJ5IGEgc3BpbiBsb2NrIHNpbmNlCiAgKiBtdWx0aXBsZSBub3RpZmllcnMgKHNheSBJUHY0IGFuZCBJUHY2KSBtYXkgYmUgcnVubmluZyBhdCB0aGUgc2FtZQpAQCAtNjUwLDYgKzc4OSw3IEBACiAJCQlhZGRyLT52YWxpZCA9IDE7CiAJCQlzcGluX2xvY2tfYmgoJnNjdHBfbG9jYWxfYWRkcl9sb2NrKTsKIAkJCWxpc3RfYWRkX3RhaWxfcmN1KCZhZGRyLT5saXN0LCAmc2N0cF9sb2NhbF9hZGRyX2xpc3QpOworCQkJc2N0cF9hZGRyX3dxX21nbXQoYWRkciwgU0NUUF9BRERSX05FVyk7CiAJCQlzcGluX3VubG9ja19iaCgmc2N0cF9sb2NhbF9hZGRyX2xvY2spOwogCQl9CiAJCWJyZWFrOwpAQCAtNjYwLDYgKzgwMCw3IEBACiAJCQlpZiAoYWRkci0+YS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCAmJgogCQkJCQlhZGRyLT5hLnY0LnNpbl9hZGRyLnNfYWRkciA9PQogCQkJCQlpZmEtPmlmYV9sb2NhbCkgeworCQkJCXNjdHBfYWRkcl93cV9tZ210KGFkZHIsIFNDVFBfQUREUl9ERUwpOwogCQkJCWZvdW5kID0gMTsKIAkJCQlhZGRyLT52YWxpZCA9IDA7CiAJCQkJbGlzdF9kZWxfcmN1KCZhZGRyLT5saXN0KTsKQEAgLTEwNTgsNyArMTE5OSw2IEBACiAJaW50IHN0YXR1cyA9IC1FSU5WQUw7CiAJdW5zaWduZWQgbG9uZyBnb2FsOwogCXVuc2lnbmVkIGxvbmcgbGltaXQ7Ci0JdW5zaWduZWQgbG9uZyBucl9wYWdlczsKIAlpbnQgbWF4X3NoYXJlOwogCWludCBvcmRlcjsKIApAQCAtMTE0OCwxNSArMTI4OCw3IEBACiAJLyogSW5pdGlhbGl6ZSBoYW5kbGUgdXNlZCBmb3IgYXNzb2NpYXRpb24gaWRzLiAqLwogCWlkcl9pbml0KCZzY3RwX2Fzc29jc19pZCk7CiAKLQkvKiBTZXQgdGhlIHByZXNzdXJlIHRocmVzaG9sZCB0byBiZSBhIGZyYWN0aW9uIG9mIGdsb2JhbCBtZW1vcnkgdGhhdAotCSAqIGlzIHVwIHRvIDEvMiBhdCAyNTYgTUIsIGRlY3JlYXNpbmcgdG93YXJkIHplcm8gd2l0aCB0aGUgYW1vdW50IG9mCi0JICogbWVtb3J5LCB3aXRoIGEgZmxvb3Igb2YgMTI4IHBhZ2VzLgotCSAqIE5vdGUgdGhpcyBpbml0aWFsaXplcyB0aGUgZGF0YSBpbiBzY3RwdjZfcHJvdCB0b28KLQkgKiBVbmFiYXNoZWRseSBzdG9sZW4gZnJvbSB0Y3BfaW5pdAotCSAqLwotCW5yX3BhZ2VzID0gdG90YWxyYW1fcGFnZXMgLSB0b3RhbGhpZ2hfcGFnZXM7Ci0JbGltaXQgPSBtaW4obnJfcGFnZXMsIDFVTDw8KDI4LVBBR0VfU0hJRlQpKSA+PiAoMjAtUEFHRV9TSElGVCk7Ci0JbGltaXQgPSAobGltaXQgKiAobnJfcGFnZXMgPj4gKDIwLVBBR0VfU0hJRlQpKSkgPj4gKFBBR0VfU0hJRlQtMTEpOworCWxpbWl0ID0gbnJfZnJlZV9idWZmZXJfcGFnZXMoKSAvIDg7CiAJbGltaXQgPSBtYXgobGltaXQsIDEyOFVMKTsKIAlzeXNjdGxfc2N0cF9tZW1bMF0gPSBsaW1pdCAvIDQgKiAzOwogCXN5c2N0bF9zY3RwX21lbVsxXSA9IGxpbWl0OwpAQCAtMTI0Miw2ICsxMzc0LDcgQEAKIAkvKiBEaXNhYmxlIEFERElQIGJ5IGRlZmF1bHQuICovCiAJc2N0cF9hZGRpcF9lbmFibGUgPSAwOwogCXNjdHBfYWRkaXBfbm9hdXRoID0gMDsKKwlzY3RwX2RlZmF1bHRfYXV0b19hc2NvbmYgPSAwOwogCiAJLyogRW5hYmxlIFBSLVNDVFAgYnkgZGVmYXVsdC4gKi8KIAlzY3RwX3Byc2N0cF9lbmFibGUgPSAxOwpAQCAtMTI2Niw2ICsxMzk5LDEzIEBACiAJc3Bpbl9sb2NrX2luaXQoJnNjdHBfbG9jYWxfYWRkcl9sb2NrKTsKIAlzY3RwX2dldF9sb2NhbF9hZGRyX2xpc3QoKTsKIAorCS8qIEluaXRpYWxpemUgdGhlIGFkZHJlc3MgZXZlbnQgbGlzdCAqLworCUlOSVRfTElTVF9IRUFEKCZzY3RwX2FkZHJfd2FpdHEpOworCUlOSVRfTElTVF9IRUFEKCZzY3RwX2F1dG9fYXNjb25mX3NwbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJnNjdHBfYWRkcl93cV9sb2NrKTsKKwlzY3RwX2FkZHJfd3FfdGltZXIuZXhwaXJlcyA9IDA7CisJc2V0dXBfdGltZXIoJnNjdHBfYWRkcl93cV90aW1lciwgc2N0cF9hZGRyX3dxX3RpbWVvdXRfaGFuZGxlciwgMCk7CisKIAlzdGF0dXMgPSBzY3RwX3Y0X3Byb3Rvc3dfaW5pdCgpOwogCiAJaWYgKHN0YXR1cykKQEAgLTEzMzcsNiArMTQ3Nyw3IEBACiAJLyogVW5yZWdpc3RlciB3aXRoIGluZXQ2L2luZXQgbGF5ZXJzLiAqLwogCXNjdHBfdjZfZGVsX3Byb3RvY29sKCk7CiAJc2N0cF92NF9kZWxfcHJvdG9jb2woKTsKKwlzY3RwX2ZyZWVfYWRkcl93cSgpOwogCiAJLyogRnJlZSB0aGUgY29udHJvbCBlbmRwb2ludC4gICovCiAJaW5ldF9jdGxfc29ja19kZXN0cm95KHNjdHBfY3RsX3NvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jIGIvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCmluZGV4IDU4ZWIyN2YuLjgxZGI0ZTMgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYworKysgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKQEAgLTI3NjgsMTEgKzI3NjgsMTIgQEAKIAlpbnQJCQlhZGRyX3BhcmFtX2xlbiA9IDA7CiAJaW50IAkJCXRvdGFsbGVuID0gMDsKIAlpbnQgCQkJaTsKKwlpbnQJCQlkZWxfcGlja3VwID0gMDsKIAogCS8qIEdldCB0b3RhbCBsZW5ndGggb2YgYWxsIHRoZSBhZGRyZXNzIHBhcmFtZXRlcnMuICovCiAJYWRkcl9idWYgPSBhZGRyczsKIAlmb3IgKGkgPSAwOyBpIDwgYWRkcmNudDsgaSsrKSB7Ci0JCWFkZHIgPSAodW5pb24gc2N0cF9hZGRyICopYWRkcl9idWY7CisJCWFkZHIgPSBhZGRyX2J1ZjsKIAkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT52NC5zaW5fZmFtaWx5KTsKIAkJYWRkcl9wYXJhbV9sZW4gPSBhZi0+dG9fYWRkcl9wYXJhbShhZGRyLCAmYWRkcl9wYXJhbSk7CiAKQEAgLTI3ODAsNiArMjc4MSwxMyBAQAogCQl0b3RhbGxlbiArPSBhZGRyX3BhcmFtX2xlbjsKIAogCQlhZGRyX2J1ZiArPSBhZi0+c29ja2FkZHJfbGVuOworCQlpZiAoYXNvYy0+YXNjb25mX2FkZHJfZGVsX3BlbmRpbmcgJiYgIWRlbF9waWNrdXApIHsKKwkJCS8qIHJldXNlIHRoZSBwYXJhbWV0ZXIgbGVuZ3RoIGZyb20gdGhlIHNhbWUgc2NvcGUgb25lICovCisJCQl0b3RhbGxlbiArPSBwYXJhbWxlbjsKKwkJCXRvdGFsbGVuICs9IGFkZHJfcGFyYW1fbGVuOworCQkJZGVsX3BpY2t1cCA9IDE7CisJCQlTQ1RQX0RFQlVHX1BSSU5USygibWthc2NvbmZfdXBkYXRlX2lwOiBwaWNrZWQgc2FtZS1zY29wZSBkZWxfcGVuZGluZyBhZGRyLCB0b3RhbGxlbiBmb3IgYWxsIGFkZHJlc3NlcyBpcyAlZFxuIiwgdG90YWxsZW4pOworCQl9CiAJfQogCiAJLyogQ3JlYXRlIGFuIGFzY29uZiBjaHVuayB3aXRoIHRoZSByZXF1aXJlZCBsZW5ndGguICovCkBAIC0yNzkwLDcgKzI3OTgsNyBAQAogCS8qIEFkZCB0aGUgYWRkcmVzcyBwYXJhbWV0ZXJzIHRvIHRoZSBhc2NvbmYgY2h1bmsuICovCiAJYWRkcl9idWYgPSBhZGRyczsKIAlmb3IgKGkgPSAwOyBpIDwgYWRkcmNudDsgaSsrKSB7Ci0JCWFkZHIgPSAodW5pb24gc2N0cF9hZGRyICopYWRkcl9idWY7CisJCWFkZHIgPSBhZGRyX2J1ZjsKIAkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT52NC5zaW5fZmFtaWx5KTsKIAkJYWRkcl9wYXJhbV9sZW4gPSBhZi0+dG9fYWRkcl9wYXJhbShhZGRyLCAmYWRkcl9wYXJhbSk7CiAJCXBhcmFtLnBhcmFtX2hkci50eXBlID0gZmxhZ3M7CkBAIC0yODAyLDYgKzI4MTAsMTcgQEAKIAogCQlhZGRyX2J1ZiArPSBhZi0+c29ja2FkZHJfbGVuOwogCX0KKwlpZiAoZmxhZ3MgPT0gU0NUUF9QQVJBTV9BRERfSVAgJiYgZGVsX3BpY2t1cCkgeworCQlhZGRyID0gYXNvYy0+YXNjb25mX2FkZHJfZGVsX3BlbmRpbmc7CisJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkci0+djQuc2luX2ZhbWlseSk7CisJCWFkZHJfcGFyYW1fbGVuID0gYWYtPnRvX2FkZHJfcGFyYW0oYWRkciwgJmFkZHJfcGFyYW0pOworCQlwYXJhbS5wYXJhbV9oZHIudHlwZSA9IFNDVFBfUEFSQU1fREVMX0lQOworCQlwYXJhbS5wYXJhbV9oZHIubGVuZ3RoID0gaHRvbnMocGFyYW1sZW4gKyBhZGRyX3BhcmFtX2xlbik7CisJCXBhcmFtLmNycl9pZCA9IGk7CisKKwkJc2N0cF9hZGR0b19jaHVuayhyZXR2YWwsIHBhcmFtbGVuLCAmcGFyYW0pOworCQlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgYWRkcl9wYXJhbV9sZW4sICZhZGRyX3BhcmFtKTsKKwl9CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMjkzOSw4ICsyOTU4LDcgQEAKIAl1bmlvbiBzY3RwX2FkZHIJYWRkcjsKIAl1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKmFkZHJfcGFyYW07CiAKLQlhZGRyX3BhcmFtID0gKHVuaW9uIHNjdHBfYWRkcl9wYXJhbSAqKQotCQkJKCh2b2lkICopYXNjb25mX3BhcmFtICsgc2l6ZW9mKHNjdHBfYWRkaXBfcGFyYW1fdCkpOworCWFkZHJfcGFyYW0gPSAodm9pZCAqKWFzY29uZl9wYXJhbSArIHNpemVvZihzY3RwX2FkZGlwX3BhcmFtX3QpOwogCiAJaWYgKGFzY29uZl9wYXJhbS0+cGFyYW1faGRyLnR5cGUgIT0gU0NUUF9QQVJBTV9BRERfSVAgJiYKIAkgICAgYXNjb25mX3BhcmFtLT5wYXJhbV9oZHIudHlwZSAhPSBTQ1RQX1BBUkFNX0RFTF9JUCAmJgpAQCAtMzAxNCw3ICszMDMyLDcgQEAKIAkJICogYW4gRXJyb3IgQ2F1c2UgVExWIHNldCB0byB0aGUgbmV3IGVycm9yIGNvZGUgJ1JlcXVlc3QgdG8KIAkJICogRGVsZXRlIFNvdXJjZSBJUCBBZGRyZXNzJwogCQkgKi8KLQkJaWYgKHNjdHBfY21wX2FkZHJfZXhhY3Qoc2N0cF9zb3VyY2UoYXNjb25mKSwgJmFkZHIpKQorCQlpZiAoc2N0cF9jbXBfYWRkcl9leGFjdCgmYXNjb25mLT5zb3VyY2UsICZhZGRyKSkKIAkJCXJldHVybiBTQ1RQX0VSUk9SX0RFTF9TUkNfSVA7CiAKIAkJLyogU2VjdGlvbiA0LjIuMgpAQCAtMzEyNSw3ICszMTQzLDcgQEAKIAkgKiBhc2NvbmYgcGFyYW1ldGVyLgogCSAqLwogCWxlbmd0aCA9IG50b2hzKGFkZHJfcGFyYW0tPnAubGVuZ3RoKTsKLQlhc2NvbmZfcGFyYW0gPSAoc2N0cF9hZGRpcF9wYXJhbV90ICopKCh2b2lkICopYWRkcl9wYXJhbSArIGxlbmd0aCk7CisJYXNjb25mX3BhcmFtID0gKHZvaWQgKilhZGRyX3BhcmFtICsgbGVuZ3RoOwogCWNodW5rX2xlbiAtPSBsZW5ndGg7CiAKIAkvKiBjcmVhdGUgYW4gQVNDT05GX0FDSyBjaHVuay4KQEAgLTMxNjYsOCArMzE4NCw3IEBACiAKIAkJLyogTW92ZSB0byB0aGUgbmV4dCBBU0NPTkYgcGFyYW0uICovCiAJCWxlbmd0aCA9IG50b2hzKGFzY29uZl9wYXJhbS0+cGFyYW1faGRyLmxlbmd0aCk7Ci0JCWFzY29uZl9wYXJhbSA9IChzY3RwX2FkZGlwX3BhcmFtX3QgKikoKHZvaWQgKilhc2NvbmZfcGFyYW0gKwotCQkJCQkJICAgICAgbGVuZ3RoKTsKKwkJYXNjb25mX3BhcmFtID0gKHZvaWQgKilhc2NvbmZfcGFyYW0gKyBsZW5ndGg7CiAJCWNodW5rX2xlbiAtPSBsZW5ndGg7CiAJfQogCkBAIC0zMTk3LDggKzMyMTQsNyBAQAogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwogCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICpzYWRkcjsKIAotCWFkZHJfcGFyYW0gPSAodW5pb24gc2N0cF9hZGRyX3BhcmFtICopCi0JCQkoKHZvaWQgKilhc2NvbmZfcGFyYW0gKyBzaXplb2Yoc2N0cF9hZGRpcF9wYXJhbV90KSk7CisJYWRkcl9wYXJhbSA9ICh2b2lkICopYXNjb25mX3BhcmFtICsgc2l6ZW9mKHNjdHBfYWRkaXBfcGFyYW1fdCk7CiAKIAkvKiBXZSBoYXZlIGNoZWNrZWQgdGhlIHBhY2tldCBiZWZvcmUsIHNvIHdlIGRvIG5vdCBjaGVjayBhZ2Fpbi4JKi8KIAlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHBhcmFtX3R5cGUyYWYoYWRkcl9wYXJhbS0+cC50eXBlKSk7CkBAIC0zMjI0LDYgKzMyNDAsMTEgQEAKIAljYXNlIFNDVFBfUEFSQU1fREVMX0lQOgogCQlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJCXNjdHBfZGVsX2JpbmRfYWRkcihicCwgJmFkZHIpOworCQlpZiAoYXNvYy0+YXNjb25mX2FkZHJfZGVsX3BlbmRpbmcgIT0gTlVMTCAmJgorCQkgICAgc2N0cF9jbXBfYWRkcl9leGFjdChhc29jLT5hc2NvbmZfYWRkcl9kZWxfcGVuZGluZywgJmFkZHIpKSB7CisJCQlrZnJlZShhc29jLT5hc2NvbmZfYWRkcl9kZWxfcGVuZGluZyk7CisJCQlhc29jLT5hc2NvbmZfYWRkcl9kZWxfcGVuZGluZyA9IE5VTEw7CisJCX0KIAkJbG9jYWxfYmhfZW5hYmxlKCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnNwb3J0LCAmYXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0LAogCQkJCXRyYW5zcG9ydHMpIHsKQEAgLTMyNzgsOCArMzI5OSw3IEBACiAJCQkJcmV0dXJuIFNDVFBfRVJST1JfTk9fRVJST1I7CiAJCQljYXNlIFNDVFBfUEFSQU1fRVJSX0NBVVNFOgogCQkJCWxlbmd0aCA9IHNpemVvZihzY3RwX2FkZGlwX3BhcmFtX3QpOwotCQkJCWVycl9wYXJhbSA9IChzY3RwX2Vycmhkcl90ICopCi0JCQkJCSAgICgodm9pZCAqKWFzY29uZl9hY2tfcGFyYW0gKyBsZW5ndGgpOworCQkJCWVycl9wYXJhbSA9ICh2b2lkICopYXNjb25mX2Fja19wYXJhbSArIGxlbmd0aDsKIAkJCQlhc2NvbmZfYWNrX2xlbiAtPSBsZW5ndGg7CiAJCQkJaWYgKGFzY29uZl9hY2tfbGVuID4gMCkKIAkJCQkJcmV0dXJuIGVycl9wYXJhbS0+Y2F1c2U7CkBAIC0zMjkyLDggKzMzMTIsNyBAQAogCQl9CiAKIAkJbGVuZ3RoID0gbnRvaHMoYXNjb25mX2Fja19wYXJhbS0+cGFyYW1faGRyLmxlbmd0aCk7Ci0JCWFzY29uZl9hY2tfcGFyYW0gPSAoc2N0cF9hZGRpcF9wYXJhbV90ICopCi0JCQkJCSgodm9pZCAqKWFzY29uZl9hY2tfcGFyYW0gKyBsZW5ndGgpOworCQlhc2NvbmZfYWNrX3BhcmFtID0gKHZvaWQgKilhc2NvbmZfYWNrX3BhcmFtICsgbGVuZ3RoOwogCQlhc2NvbmZfYWNrX2xlbiAtPSBsZW5ndGg7CiAJfQogCkBAIC0zMzI1LDcgKzMzNDQsNyBAQAogCSAqIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGFzY29uZiBwYXJhbWV0ZXIuCiAJICovCiAJbGVuZ3RoID0gbnRvaHMoYWRkcl9wYXJhbS0+cC5sZW5ndGgpOwotCWFzY29uZl9wYXJhbSA9IChzY3RwX2FkZGlwX3BhcmFtX3QgKikoKHZvaWQgKilhZGRyX3BhcmFtICsgbGVuZ3RoKTsKKwlhc2NvbmZfcGFyYW0gPSAodm9pZCAqKWFkZHJfcGFyYW0gKyBsZW5ndGg7CiAJYXNjb25mX2xlbiAtPSBsZW5ndGg7CiAKIAkvKiBBRERJUCA0LjEKQEAgLTMzNzYsMTEgKzMzOTUsMTMgQEAKIAkJICogb25lLgogCQkgKi8KIAkJbGVuZ3RoID0gbnRvaHMoYXNjb25mX3BhcmFtLT5wYXJhbV9oZHIubGVuZ3RoKTsKLQkJYXNjb25mX3BhcmFtID0gKHNjdHBfYWRkaXBfcGFyYW1fdCAqKSgodm9pZCAqKWFzY29uZl9wYXJhbSArCi0JCQkJCQkgICAgICBsZW5ndGgpOworCQlhc2NvbmZfcGFyYW0gPSAodm9pZCAqKWFzY29uZl9wYXJhbSArIGxlbmd0aDsKIAkJYXNjb25mX2xlbiAtPSBsZW5ndGg7CiAJfQogCisJaWYgKG5vX2VyciAmJiBhc29jLT5zcmNfb3V0X29mX2Fzb2Nfb2spCisJCWFzb2MtPnNyY19vdXRfb2ZfYXNvY19vayA9IDA7CisKIAkvKiBGcmVlIHRoZSBjYWNoZWQgbGFzdCBzZW50IGFzY29uZiBjaHVuay4gKi8KIAlsaXN0X2RlbF9pbml0KCZhc2NvbmYtPnRyYW5zbWl0dGVkX2xpc3QpOwogCXNjdHBfY2h1bmtfZnJlZShhc2NvbmYpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCmluZGV4IDUzNGMyZTUuLjE2N2M4ODAgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYworKysgYi9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKQEAgLTY3MCwxMCArNjcwLDE5IEBACiAJLyogOC4zIFVwb24gdGhlIHJlY2VpcHQgb2YgdGhlIEhFQVJUQkVBVCBBQ0ssIHRoZSBzZW5kZXIgb2YgdGhlCiAJICogSEVBUlRCRUFUIHNob3VsZCBjbGVhciB0aGUgZXJyb3IgY291bnRlciBvZiB0aGUgZGVzdGluYXRpb24KIAkgKiB0cmFuc3BvcnQgYWRkcmVzcyB0byB3aGljaCB0aGUgSEVBUlRCRUFUIHdhcyBzZW50LgotCSAqIFRoZSBhc3NvY2lhdGlvbidzIG92ZXJhbGwgZXJyb3IgY291bnQgaXMgYWxzbyBjbGVhcmVkLgogCSAqLwogCXQtPmVycm9yX2NvdW50ID0gMDsKLQl0LT5hc29jLT5vdmVyYWxsX2Vycm9yX2NvdW50ID0gMDsKKworCS8qCisJICogQWx0aG91Z2ggUkZDNDk2MCBzcGVjaWZpZXMgdGhhdCB0aGUgb3ZlcmFsbCBlcnJvciBjb3VudCBtdXN0CisJICogYmUgY2xlYXJlZCB3aGVuIGEgSEVBUlRCRUFUIEFDSyBpcyByZWNlaXZlZCwgd2UgbWFrZSBhbgorCSAqIGV4Y2VwdGlvbiB3aGlsZSBpbiBTSFVURE9XTiBQRU5ESU5HLiBJZiB0aGUgcGVlciBrZWVwcyBpdHMKKwkgKiB3aW5kb3cgc2h1dCBmb3JldmVyLCB3ZSBtYXkgbmV2ZXIgYmUgYWJsZSB0byB0cmFuc21pdCBvdXIKKwkgKiBvdXRzdGFuZGluZyBkYXRhIGFuZCByZWx5IG9uIHRoZSByZXRyYW5zbWlzc2lvbiBsaW1pdCBiZSByZWFjaGVkCisJICogdG8gc2h1dGRvd24gdGhlIGFzc29jaWF0aW9uLgorCSAqLworCWlmICh0LT5hc29jLT5zdGF0ZSAhPSBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcpCisJCXQtPmFzb2MtPm92ZXJhbGxfZXJyb3JfY291bnQgPSAwOwogCiAJLyogQ2xlYXIgdGhlIGhiX3NlbnQgZmxhZyB0byBzaWduYWwgdGhhdCB3ZSBoYWQgYSBnb29kCiAJICogYWNrbm93bGVkZ2VtZW50LgpAQCAtMTIwMSw3ICsxMjEwLDcgQEAKIAlpbnQgbG9jYWxfY29yayA9IDA7CiAKIAlpZiAoU0NUUF9FVkVOVF9UX1RJTUVPVVQgIT0gZXZlbnRfdHlwZSkKLQkJY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKikgZXZlbnRfYXJnOworCQljaHVuayA9IGV2ZW50X2FyZzsKIAogCS8qIE5vdGU6ICBUaGlzIHdob2xlIGZpbGUgaXMgYSBodWdlIGNhbmRpZGF0ZSBmb3IgcmV3b3JrLgogCSAqIEZvciBleGFtcGxlLCBlYWNoIGNvbW1hbmQgY291bGQgZWl0aGVyIGhhdmUgaXRzIG93biBoYW5kbGVyLCBzbwpAQCAtMTQzNyw2ICsxNDQ2LDEzIEBACiAJCQlzY3RwX2NtZF9zZXR1cF90Mihjb21tYW5kcywgYXNvYywgY21kLT5vYmoucHRyKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgU0NUUF9DTURfVElNRVJfU1RBUlRfT05DRToKKwkJCXRpbWVyID0gJmFzb2MtPnRpbWVyc1tjbWQtPm9iai50b107CisKKwkJCWlmICh0aW1lcl9wZW5kaW5nKHRpbWVyKSkKKwkJCQlicmVhazsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCiAJCWNhc2UgU0NUUF9DTURfVElNRVJfU1RBUlQ6CiAJCQl0aW1lciA9ICZhc29jLT50aW1lcnNbY21kLT5vYmoudG9dOwogCQkJdGltZW91dCA9IGFzb2MtPnRpbWVvdXRzW2NtZC0+b2JqLnRvXTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKaW5kZXggYTI5NzI4My4uNDliODQ3YiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKKysrIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKQEAgLTQwMDgsMzEgKzQwMDgsMzIgQEAKIAlhdXRoX2hkciA9IChzdHJ1Y3Qgc2N0cF9hdXRoaGRyICopY2h1bmstPnNrYi0+ZGF0YTsKIAllcnJvciA9IHNjdHBfc2ZfYXV0aGVudGljYXRlKGVwLCBhc29jLCB0eXBlLCBjaHVuayk7CiAJc3dpdGNoIChlcnJvcikgewotCQljYXNlIFNDVFBfSUVSUk9SX0FVVEhfQkFEX0hNQUM6Ci0JCQkvKiBHZW5lcmF0ZSB0aGUgRVJST1IgY2h1bmsgYW5kIGRpc2NhcmQgdGhlIHJlc3QKLQkJCSAqIG9mIHRoZSBwYWNrZXQKLQkJCSAqLwotCQkJZXJyX2NodW5rID0gc2N0cF9tYWtlX29wX2Vycm9yKGFzb2MsIGNodW5rLAotCQkJCQkJCVNDVFBfRVJST1JfVU5TVVBfSE1BQywKLQkJCQkJCQkmYXV0aF9oZHItPmhtYWNfaWQsCi0JCQkJCQkJc2l6ZW9mKF9fdTE2KSwgMCk7Ci0JCQlpZiAoZXJyX2NodW5rKSB7Ci0JCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwKLQkJCQkJCVNDVFBfQ0hVTksoZXJyX2NodW5rKSk7Ci0JCQl9Ci0JCQkvKiBGYWxsIFRocm91Z2ggKi8KLQkJY2FzZSBTQ1RQX0lFUlJPUl9BVVRIX0JBRF9LRVlJRDoKLQkJY2FzZSBTQ1RQX0lFUlJPUl9CQURfU0lHOgotCQkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0NUUF9JRVJST1JfUFJPVE9fVklPTEFUSU9OOgotCQkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKGVwLCBhc29jLCB0eXBlLCBhcmcsCi0JCQkJCQkJICBjb21tYW5kcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBTQ1RQX0lFUlJPUl9OT01FTToKLQkJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7CisJY2FzZSBTQ1RQX0lFUlJPUl9BVVRIX0JBRF9ITUFDOgorCQkvKiBHZW5lcmF0ZSB0aGUgRVJST1IgY2h1bmsgYW5kIGRpc2NhcmQgdGhlIHJlc3QKKwkJICogb2YgdGhlIHBhY2tldAorCQkgKi8KKwkJZXJyX2NodW5rID0gc2N0cF9tYWtlX29wX2Vycm9yKGFzb2MsIGNodW5rLAorCQkJCQkgICAgICAgU0NUUF9FUlJPUl9VTlNVUF9ITUFDLAorCQkJCQkgICAgICAgJmF1dGhfaGRyLT5obWFjX2lkLAorCQkJCQkgICAgICAgc2l6ZW9mKF9fdTE2KSwgMCk7CisJCWlmIChlcnJfY2h1bmspIHsKKwkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksCisJCQkJCVNDVFBfQ0hVTksoZXJyX2NodW5rKSk7CisJCX0KKwkJLyogRmFsbCBUaHJvdWdoICovCisJY2FzZSBTQ1RQX0lFUlJPUl9BVVRIX0JBRF9LRVlJRDoKKwljYXNlIFNDVFBfSUVSUk9SX0JBRF9TSUc6CisJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKworCWNhc2UgU0NUUF9JRVJST1JfUFJPVE9fVklPTEFUSU9OOgorCQlyZXR1cm4gc2N0cF9zZl92aW9sYXRpb25fY2h1bmtsZW4oZXAsIGFzb2MsIHR5cGUsIGFyZywKKwkJCQkJCSAgY29tbWFuZHMpOworCisJY2FzZSBTQ1RQX0lFUlJPUl9OT01FTToKKwkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07CisKKwlkZWZhdWx0OgkJCS8qIFByZXZlbnQgZ2NjIHdhcm5pbmdzICovCisJCWJyZWFrOwogCX0KIAogCWlmIChhc29jLT5hY3RpdmVfa2V5X2lkICE9IG50b2hzKGF1dGhfaGRyLT5zaGtleV9pZCkpIHsKQEAgLTUxNTQsNyArNTE1NSw3IEBACiAJICogVGhlIHNlbmRlciBvZiB0aGUgU0hVVERPV04gTUFZIGFsc28gc3RhcnQgYW4gb3ZlcmFsbCBndWFyZCB0aW1lcgogCSAqICdUNS1zaHV0ZG93bi1ndWFyZCcgdG8gYm91bmQgdGhlIG92ZXJhbGwgdGltZSBmb3Igc2h1dGRvd24gc2VxdWVuY2UuCiAJICovCi0Jc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVEFSVCwKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1JFU1RBUlQsCiAJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRCkpOwogCiAJaWYgKGFzb2MtPmF1dG9jbG9zZSkKQEAgLTUyOTksMTQgKzUzMDAsMjggQEAKIAlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9UM19SVFhfRVhQSVJFRFMpOwogCiAJaWYgKGFzb2MtPm92ZXJhbGxfZXJyb3JfY291bnQgPj0gYXNvYy0+bWF4X3JldHJhbnMpIHsKLQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLAotCQkJCVNDVFBfRVJST1IoRVRJTUVET1VUKSk7Ci0JCS8qIENNRF9BU1NPQ19GQUlMRUQgY2FsbHMgQ01EX0RFTEVURV9UQ0IuICovCi0JCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQVNTT0NfRkFJTEVELAotCQkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX05PX0VSUk9SKSk7Ci0JCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FCT1JURURTKTsKLQkJU0NUUF9ERUNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKLQkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fREVMRVRFX1RDQjsKKwkJaWYgKGFzb2MtPnN0YXRlID09IFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORykgeworCQkJLyoKKwkJCSAqIFdlIGFyZSBoZXJlIGxpa2VseSBiZWNhdXNlIHRoZSByZWNlaXZlciBoYWQgaXRzIHJ3bmQKKwkJCSAqIGNsb3NlZCBmb3IgYSB3aGlsZSBhbmQgd2UgaGF2ZSBub3QgYmVlbiBhYmxlIHRvCisJCQkgKiB0cmFuc21pdCB0aGUgbG9jYWxseSBxdWV1ZWQgZGF0YSB3aXRoaW4gdGhlIG1heGltdW0KKwkJCSAqIHJldHJhbnNtaXNzaW9uIGF0dGVtcHRzIGxpbWl0LiAgU3RhcnQgdGhlIFQ1CisJCQkgKiBzaHV0ZG93biBndWFyZCB0aW1lciB0byBnaXZlIHRoZSByZWNlaXZlciBvbmUgbGFzdAorCQkJICogY2hhbmNlIGFuZCBzb21lIGFkZGl0aW9uYWwgdGltZSB0byByZWNvdmVyIGJlZm9yZQorCQkJICogYWJvcnRpbmcuCisJCQkgKi8KKwkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RBUlRfT05DRSwKKwkJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRCkpOworCQl9IGVsc2UgeworCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLAorCQkJCQlTQ1RQX0VSUk9SKEVUSU1FRE9VVCkpOworCQkJLyogQ01EX0FTU09DX0ZBSUxFRCBjYWxscyBDTURfREVMRVRFX1RDQi4gKi8KKwkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQVNTT0NfRkFJTEVELAorCQkJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9OT19FUlJPUikpOworCQkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOworCQkJU0NUUF9ERUNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKKwkJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RFTEVURV9UQ0I7CisJCX0KIAl9CiAKIAkvKiBFMSkgRm9yIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciB3aGljaCB0aGUgdGltZXIKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYyBiL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYwppbmRleCAwMzM4ZGM2Li43YzIxMWE3IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zdGF0ZXRhYmxlLmMKKysrIGIvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jCkBAIC04MjcsNyArODI3LDcgQEAKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKIAlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdDVfdGltZXJfZXhwaXJlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCiAJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90NV90aW1lcl9leHBpcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jCmluZGV4IDY3NjY5MTMuLjgzNmFhNjMgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NvY2tldC5jCisrKyBiL25ldC9zY3RwL3NvY2tldC5jCkBAIC00NzYsNyArNDc2LDcgQEAKIAkJLyogVGhlIGxpc3QgbWF5IGNvbnRhaW4gZWl0aGVyIElQdjQgb3IgSVB2NiBhZGRyZXNzOwogCQkgKiBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgbGVuZ3RoIGZvciB3YWxraW5nIHRocnUgdGhlIGxpc3QuCiAJCSAqLwotCQlzYV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJfYnVmOworCQlzYV9hZGRyID0gYWRkcl9idWY7CiAJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoc2FfYWRkci0+c2FfZmFtaWx5KTsKIAkJaWYgKCFhZikgewogCQkJcmV0dmFsID0gLUVJTlZBTDsKQEAgLTU1NSw3ICs1NTUsNyBAQAogCQkgKi8KIAkJYWRkcl9idWYgPSBhZGRyczsKIAkJZm9yIChpID0gMDsgaSA8IGFkZHJjbnQ7IGkrKykgewotCQkJYWRkciA9ICh1bmlvbiBzY3RwX2FkZHIgKilhZGRyX2J1ZjsKKwkJCWFkZHIgPSBhZGRyX2J1ZjsKIAkJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkci0+djQuc2luX2ZhbWlseSk7CiAJCQlpZiAoIWFmKSB7CiAJCQkJcmV0dmFsID0gLUVJTlZBTDsKQEAgLTU4MywyMiArNTgzLDM1IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXJldHZhbCA9IHNjdHBfc2VuZF9hc2NvbmYoYXNvYywgY2h1bmspOwotCQlpZiAocmV0dmFsKQotCQkJZ290byBvdXQ7Ci0KIAkJLyogQWRkIHRoZSBuZXcgYWRkcmVzc2VzIHRvIHRoZSBiaW5kIGFkZHJlc3MgbGlzdCB3aXRoCiAJCSAqIHVzZV9hc19zcmMgc2V0IHRvIDAuCiAJCSAqLwogCQlhZGRyX2J1ZiA9IGFkZHJzOwogCQlmb3IgKGkgPSAwOyBpIDwgYWRkcmNudDsgaSsrKSB7Ci0JCQlhZGRyID0gKHVuaW9uIHNjdHBfYWRkciAqKWFkZHJfYnVmOworCQkJYWRkciA9IGFkZHJfYnVmOwogCQkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT52NC5zaW5fZmFtaWx5KTsKIAkJCW1lbWNweSgmc2F2ZWFkZHIsIGFkZHIsIGFmLT5zb2NrYWRkcl9sZW4pOwogCQkJcmV0dmFsID0gc2N0cF9hZGRfYmluZF9hZGRyKGJwLCAmc2F2ZWFkZHIsCiAJCQkJCQkgICAgU0NUUF9BRERSX05FVywgR0ZQX0FUT01JQyk7CiAJCQlhZGRyX2J1ZiArPSBhZi0+c29ja2FkZHJfbGVuOwogCQl9CisJCWlmIChhc29jLT5zcmNfb3V0X29mX2Fzb2Nfb2spIHsKKwkJCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnM7CisKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsCisJCQkgICAgJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCwgdHJhbnNwb3J0cykgeworCQkJCS8qIENsZWFyIHRoZSBzb3VyY2UgYW5kIHJvdXRlIGNhY2hlICovCisJCQkJZHN0X3JlbGVhc2UodHJhbnMtPmRzdCk7CisJCQkJdHJhbnMtPmN3bmQgPSBtaW4oNCphc29jLT5wYXRobXR1LCBtYXhfdChfX3UzMiwKKwkJCQkgICAgMiphc29jLT5wYXRobXR1LCA0MzgwKSk7CisJCQkJdHJhbnMtPnNzdGhyZXNoID0gYXNvYy0+cGVlci5pLmFfcnduZDsKKwkJCQl0cmFucy0+cnRvID0gYXNvYy0+cnRvX2luaXRpYWw7CisJCQkJdHJhbnMtPnJ0dCA9IHRyYW5zLT5zcnR0ID0gdHJhbnMtPnJ0dHZhciA9IDA7CisJCQkJc2N0cF90cmFuc3BvcnRfcm91dGUodHJhbnMsIE5VTEwsCisJCQkJICAgIHNjdHBfc2soYXNvYy0+YmFzZS5zaykpOworCQkJfQorCQl9CisJCXJldHZhbCA9IHNjdHBfc2VuZF9hc2NvbmYoYXNvYywgY2h1bmspOwogCX0KIAogb3V0OgpAQCAtNjQ2LDcgKzY1OSw3IEBACiAJCQlnb3RvIGVycl9iaW5keF9yZW07CiAJCX0KIAotCQlzYV9hZGRyID0gKHVuaW9uIHNjdHBfYWRkciAqKWFkZHJfYnVmOworCQlzYV9hZGRyID0gYWRkcl9idWY7CiAJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoc2FfYWRkci0+c2Euc2FfZmFtaWx5KTsKIAkJaWYgKCFhZikgewogCQkJcmV0dmFsID0gLUVJTlZBTDsKQEAgLTcxNSw3ICs3MjgsOSBAQAogCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICpzYWRkcjsKIAlpbnQgCQkJaTsKIAlpbnQgCQkJcmV0dmFsID0gMDsKKwlpbnQJCQlzdG9yZWQgPSAwOwogCisJY2h1bmsgPSBOVUxMOwogCWlmICghc2N0cF9hZGRpcF9lbmFibGUpCiAJCXJldHVybiByZXR2YWw7CiAKQEAgLTc0Myw3ICs3NTgsNyBAQAogCQkgKi8KIAkJYWRkcl9idWYgPSBhZGRyczsKIAkJZm9yIChpID0gMDsgaSA8IGFkZHJjbnQ7IGkrKykgewotCQkJbGFkZHIgPSAodW5pb24gc2N0cF9hZGRyICopYWRkcl9idWY7CisJCQlsYWRkciA9IGFkZHJfYnVmOwogCQkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhsYWRkci0+djQuc2luX2ZhbWlseSk7CiAJCQlpZiAoIWFmKSB7CiAJCQkJcmV0dmFsID0gLUVJTlZBTDsKQEAgLTc2Niw4ICs3ODEsMzcgQEAKIAkJYnAgPSAmYXNvYy0+YmFzZS5iaW5kX2FkZHI7CiAJCWxhZGRyID0gc2N0cF9maW5kX3VubWF0Y2hfYWRkcihicCwgKHVuaW9uIHNjdHBfYWRkciAqKWFkZHJzLAogCQkJCQkgICAgICAgYWRkcmNudCwgc3ApOwotCQlpZiAoIWxhZGRyKQotCQkJY29udGludWU7CisJCWlmICgobGFkZHIgPT0gTlVMTCkgJiYgKGFkZHJjbnQgPT0gMSkpIHsKKwkJCWlmIChhc29jLT5hc2NvbmZfYWRkcl9kZWxfcGVuZGluZykKKwkJCQljb250aW51ZTsKKwkJCWFzb2MtPmFzY29uZl9hZGRyX2RlbF9wZW5kaW5nID0KKwkJCSAgICBremFsbG9jKHNpemVvZih1bmlvbiBzY3RwX2FkZHIpLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChhc29jLT5hc2NvbmZfYWRkcl9kZWxfcGVuZGluZyA9PSBOVUxMKSB7CisJCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWFzb2MtPmFzY29uZl9hZGRyX2RlbF9wZW5kaW5nLT5zYS5zYV9mYW1pbHkgPQorCQkJCSAgICBhZGRycy0+c2FfZmFtaWx5OworCQkJYXNvYy0+YXNjb25mX2FkZHJfZGVsX3BlbmRpbmctPnY0LnNpbl9wb3J0ID0KKwkJCQkgICAgaHRvbnMoYnAtPnBvcnQpOworCQkJaWYgKGFkZHJzLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgeworCQkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworCisJCQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHJzOworCQkJCWFzb2MtPmFzY29uZl9hZGRyX2RlbF9wZW5kaW5nLT52NC5zaW5fYWRkci5zX2FkZHIgPSBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKKwkJCX0gZWxzZSBpZiAoYWRkcnMtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisKKwkJCQlzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyczsKKwkJCQlpcHY2X2FkZHJfY29weSgmYXNvYy0+YXNjb25mX2FkZHJfZGVsX3BlbmRpbmctPnY2LnNpbjZfYWRkciwgJnNpbjYtPnNpbjZfYWRkcik7CisJCQl9CisJCQlTQ1RQX0RFQlVHX1BSSU5US19JUEFERFIoInNlbmRfYXNjb25mX2RlbF9pcDoga2VlcCB0aGUgbGFzdCBhZGRyZXNzIGFzb2M6ICVwICIsCisJCQkgICAgIiBhdCAlcFxuIiwgYXNvYywgYXNvYy0+YXNjb25mX2FkZHJfZGVsX3BlbmRpbmcsCisJCQkgICAgYXNvYy0+YXNjb25mX2FkZHJfZGVsX3BlbmRpbmcpOworCQkJYXNvYy0+c3JjX291dF9vZl9hc29jX29rID0gMTsKKwkJCXN0b3JlZCA9IDE7CisJCQlnb3RvIHNraXBfbWthc2NvbmY7CisJCX0KIAogCQkvKiBXZSBkbyBub3QgbmVlZCBSQ1UgcHJvdGVjdGlvbiB0aHJvdWdob3V0IHRoaXMgbG9vcAogCQkgKiBiZWNhdXNlIHRoaXMgaXMgZG9uZSB1bmRlciBhIHNvY2tldCBsb2NrIGZyb20gdGhlCkBAIC03ODAsMTIgKzgyNCwxMyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAorc2tpcF9ta2FzY29uZjoKIAkJLyogUmVzZXQgdXNlX2FzX3NyYyBmbGFnIGZvciB0aGUgYWRkcmVzc2VzIGluIHRoZSBiaW5kIGFkZHJlc3MKIAkJICogbGlzdCB0aGF0IGFyZSB0byBiZSBkZWxldGVkLgogCQkgKi8KIAkJYWRkcl9idWYgPSBhZGRyczsKIAkJZm9yIChpID0gMDsgaSA8IGFkZHJjbnQ7IGkrKykgewotCQkJbGFkZHIgPSAodW5pb24gc2N0cF9hZGRyICopYWRkcl9idWY7CisJCQlsYWRkciA9IGFkZHJfYnVmOwogCQkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhsYWRkci0+djQuc2luX2ZhbWlseSk7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNhZGRyLCAmYnAtPmFkZHJlc3NfbGlzdCwgbGlzdCkgewogCQkJCWlmIChzY3RwX2NtcF9hZGRyX2V4YWN0KCZzYWRkci0+YSwgbGFkZHIpKQpAQCAtODA1LDEyICs4NTAsMzcgQEAKIAkJCQkJICAgICBzY3RwX3NrKGFzb2MtPmJhc2Uuc2spKTsKIAkJfQogCisJCWlmIChzdG9yZWQpCisJCQkvKiBXZSBkb24ndCBuZWVkIHRvIHRyYW5zbWl0IEFTQ09ORiAqLworCQkJY29udGludWU7CiAJCXJldHZhbCA9IHNjdHBfc2VuZF9hc2NvbmYoYXNvYywgY2h1bmspOwogCX0KIG91dDoKIAlyZXR1cm4gcmV0dmFsOwogfQogCisvKiBzZXQgYWRkciBldmVudHMgdG8gYXNzb2NzIGluIHRoZSBlbmRwb2ludC4gIGVwIGFuZCBhZGRyX3dxIG11c3QgYmUgbG9ja2VkICovCitpbnQgc2N0cF9hc2NvbmZfbWdtdChzdHJ1Y3Qgc2N0cF9zb2NrICpzcCwgc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHJ3KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNjdHBfb3B0MnNrKHNwKTsKKwl1bmlvbiBzY3RwX2FkZHIgKmFkZHI7CisJc3RydWN0IHNjdHBfYWYgKmFmOworCisJLyogSXQgaXMgc2FmZSB0byB3cml0ZSBwb3J0IHNwYWNlIGluIGNhbGxlci4gKi8KKwlhZGRyID0gJmFkZHJ3LT5hOworCWFkZHItPnY0LnNpbl9wb3J0ID0gaHRvbnMoc3AtPmVwLT5iYXNlLmJpbmRfYWRkci5wb3J0KTsKKwlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGFkZHItPnNhLnNhX2ZhbWlseSk7CisJaWYgKCFhZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNjdHBfdmVyaWZ5X2FkZHIoc2ssIGFkZHIsIGFmLT5zb2NrYWRkcl9sZW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhZGRydy0+c3RhdGUgPT0gU0NUUF9BRERSX05FVykKKwkJcmV0dXJuIHNjdHBfc2VuZF9hc2NvbmZfYWRkX2lwKHNrLCAoc3RydWN0IHNvY2thZGRyICopYWRkciwgMSk7CisJZWxzZQorCQlyZXR1cm4gc2N0cF9zZW5kX2FzY29uZl9kZWxfaXAoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLCAxKTsKK30KKwogLyogSGVscGVyIGZvciB0dW5uZWxpbmcgc2N0cF9iaW5keCgpIHJlcXVlc3RzIHRocm91Z2ggc2N0cF9zZXRzb2Nrb3B0KCkKICAqCiAgKiBBUEkgOC4xCkBAIC05MjcsNyArOTk3LDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJc2FfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyX2J1ZjsKKwkJc2FfYWRkciA9IGFkZHJfYnVmOwogCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHNhX2FkZHItPnNhX2ZhbWlseSk7CiAKIAkJLyogSWYgdGhlIGFkZHJlc3MgZmFtaWx5IGlzIG5vdCBzdXBwb3J0ZWQgb3IgaWYgdGhpcyBhZGRyZXNzCkBAIC0xMDE4LDcgKzEwODgsNyBAQAogCQkJZ290byBvdXRfZnJlZTsKIAkJfQogCi0JCXNhX2FkZHIgPSAodW5pb24gc2N0cF9hZGRyICopYWRkcl9idWY7CisJCXNhX2FkZHIgPSBhZGRyX2J1ZjsKIAkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhzYV9hZGRyLT5zYS5zYV9mYW1pbHkpOwogCiAJCS8qIElmIHRoZSBhZGRyZXNzIGZhbWlseSBpcyBub3Qgc3VwcG9ydGVkIG9yIGlmIHRoaXMgYWRkcmVzcwpAQCAtMTM4NCw2ICsxNDU0LDcgQEAKIAlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXA7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKKwl1bnNpZ25lZCBpbnQgZGF0YV93YXNfdW5yZWFkOwogCiAJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfY2xvc2Uoc2s6IDB4JXAsIHRpbWVvdXQ6JWxkKVxuIiwgc2ssIHRpbWVvdXQpOwogCkBAIC0xMzkzLDYgKzE0NjQsMTAgQEAKIAogCWVwID0gc2N0cF9zayhzayktPmVwOwogCisJLyogQ2xlYW4gdXAgYW55IHNrYnMgc2l0dGluZyBvbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gICovCisJZGF0YV93YXNfdW5yZWFkID0gc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlkYXRhX3dhc191bnJlYWQgKz0gc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoJnNjdHBfc2soc2spLT5wZF9sb2JieSk7CisKIAkvKiBXYWxrIGFsbCBhc3NvY2lhdGlvbnMgb24gYW4gZW5kcG9pbnQuICAqLwogCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZlcC0+YXNvY3MpIHsKIAkJYXNvYyA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiwgYXNvY3MpOwpAQCAtMTQxMCw3ICsxNDg1LDkgQEAKIAkJCX0KIAkJfQogCi0JCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfTElOR0VSKSAmJiAhc2stPnNrX2xpbmdlcnRpbWUpIHsKKwkJaWYgKGRhdGFfd2FzX3VucmVhZCB8fCAhc2tiX3F1ZXVlX2VtcHR5KCZhc29jLT51bHBxLmxvYmJ5KSB8fAorCQkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmYXNvYy0+dWxwcS5yZWFzbSkgfHwKKwkJICAgIChzb2NrX2ZsYWcoc2ssIFNPQ0tfTElOR0VSKSAmJiAhc2stPnNrX2xpbmdlcnRpbWUpKSB7CiAJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CiAKIAkJCWNodW5rID0gc2N0cF9tYWtlX2Fib3J0X3VzZXIoYXNvYywgTlVMTCwgMCk7CkBAIC0xNDIwLDEwICsxNDk3LDYgQEAKIAkJCXNjdHBfcHJpbWl0aXZlX1NIVVRET1dOKGFzb2MsIE5VTEwpOwogCX0KIAotCS8qIENsZWFuIHVwIGFueSBza2JzIHNpdHRpbmcgb24gdGhlIHJlY2VpdmUgcXVldWUuICAqLwotCXNjdHBfcXVldWVfcHVyZ2VfdWxwZXZlbnRzKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7Ci0Jc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoJnNjdHBfc2soc2spLT5wZF9sb2JieSk7Ci0KIAkvKiBPbiBhIFRDUC1zdHlsZSBzb2NrZXQsIGJsb2NrIGZvciBhdCBtb3N0IGxpbmdlcl90aW1lIGlmIHNldC4gKi8KIAlpZiAoc2N0cF9zdHlsZShzaywgVENQKSAmJiB0aW1lb3V0KQogCQlzY3RwX3dhaXRfZm9yX2Nsb3NlKHNrLCB0aW1lb3V0KTsKQEAgLTIwNzMsMTAgKzIxNDYsMzMgQEAKIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2V2ZW50cyhzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsCiAJCQkJICB1bnNpZ25lZCBpbnQgb3B0bGVuKQogeworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKKwogCWlmIChvcHRsZW4gPiBzaXplb2Yoc3RydWN0IHNjdHBfZXZlbnRfc3Vic2NyaWJlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGNvcHlfZnJvbV91c2VyKCZzY3RwX3NrKHNrKS0+c3Vic2NyaWJlLCBvcHR2YWwsIG9wdGxlbikpCiAJCXJldHVybiAtRUZBVUxUOworCisJLyoKKwkgKiBBdCB0aGUgdGltZSB3aGVuIGEgdXNlciBhcHAgc3Vic2NyaWJlcyB0byBTQ1RQX1NFTkRFUl9EUllfRVZFTlQsCisJICogaWYgdGhlcmUgaXMgbm8gZGF0YSB0byBiZSBzZW50IG9yIHJldHJhbnNtaXQsIHRoZSBzdGFjayB3aWxsCisJICogaW1tZWRpYXRlbHkgc2VuZCB1cCB0aGlzIG5vdGlmaWNhdGlvbi4KKwkgKi8KKwlpZiAoc2N0cF91bHBldmVudF90eXBlX2VuYWJsZWQoU0NUUF9TRU5ERVJfRFJZX0VWRU5ULAorCQkJCSAgICAgICAmc2N0cF9zayhzayktPnN1YnNjcmliZSkpIHsKKwkJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIDApOworCisJCWlmIChhc29jICYmIHNjdHBfb3V0cV9pc19lbXB0eSgmYXNvYy0+b3V0cXVldWUpKSB7CisJCQlldmVudCA9IHNjdHBfdWxwZXZlbnRfbWFrZV9zZW5kZXJfZHJ5X2V2ZW50KGFzb2MsCisJCQkJCUdGUF9BVE9NSUMpOworCQkJaWYgKCFldmVudCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJc2N0cF91bHBxX3RhaWxfZXZlbnQoJmFzb2MtPnVscHEsIGV2ZW50KTsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0zMTg3LDExICszMjgzLDExIEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJc3dpdGNoICh2YWwuc2F1dGhfY2h1bmspIHsKLQkJY2FzZSBTQ1RQX0NJRF9JTklUOgotCQljYXNlIFNDVFBfQ0lEX0lOSVRfQUNLOgotCQljYXNlIFNDVFBfQ0lEX1NIVVRET1dOX0NPTVBMRVRFOgotCQljYXNlIFNDVFBfQ0lEX0FVVEg6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFNDVFBfQ0lEX0lOSVQ6CisJY2FzZSBTQ1RQX0NJRF9JTklUX0FDSzoKKwljYXNlIFNDVFBfQ0lEX1NIVVRET1dOX0NPTVBMRVRFOgorCWNhc2UgU0NUUF9DSURfQVVUSDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogYWRkIHRoaXMgY2h1bmsgaWQgdG8gdGhlIGVuZHBvaW50ICovCkBAIC0zMzM0LDYgKzM0MzAsNDYgQEAKIAogfQogCisvKgorICogOC4xLjIzIFNDVFBfQVVUT19BU0NPTkYKKyAqCisgKiBUaGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBvciBkaXNhYmxlIHRoZSB1c2Ugb2YgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mCisgKiBBU0NPTkYgY2h1bmtzIHRvIGFkZCBhbmQgZGVsZXRlIGFkZHJlc3NlcyB0byBhbiBleGlzdGluZyBhc3NvY2lhdGlvbi4gIE5vdGUKKyAqIHRoYXQgdGhpcyBvcHRpb24gaGFzIHR3byBjYXZlYXRzIG5hbWVseTogYSkgaXQgb25seSBhZmZlY3RzIHNvY2tldHMgdGhhdAorICogYXJlIGJvdW5kIHRvIGFsbCBhZGRyZXNzZXMgYXZhaWxhYmxlIHRvIHRoZSBTQ1RQIHN0YWNrLCBhbmQgYikgdGhlIHN5c3RlbQorICogYWRtaW5pc3RyYXRvciBtYXkgaGF2ZSBhbiBvdmVycmlkaW5nIGNvbnRyb2wgdGhhdCB0dXJucyB0aGUgQVNDT05GIGZlYXR1cmUKKyAqIG9mZiBubyBtYXR0ZXIgd2hhdCBzZXR0aW5nIHRoZSBzb2NrZXQgb3B0aW9uIG1heSBoYXZlLgorICogVGhpcyBvcHRpb24gZXhwZWN0cyBhbiBpbnRlZ2VyIGJvb2xlYW4gZmxhZywgd2hlcmUgYSBub24temVybyB2YWx1ZSB0dXJucyBvbgorICogdGhlIG9wdGlvbiwgYW5kIGEgemVybyB2YWx1ZSB0dXJucyBvZmYgdGhlIG9wdGlvbi4KKyAqIE5vdGUuIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIHNvY2tldCBvcGVyYXRpb24gb3ZlcnJpZGVzIGRlZmF1bHQgcGFyYW1ldGVyCisgKiBiZWluZyBzZXQgYnkgc3lzY3RsIGFzIHdlbGwgYXMgRnJlZUJTRCBpbXBsZW1lbnRhdGlvbgorICovCitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hdXRvX2FzY29uZihzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJCXVuc2lnbmVkIGludCBvcHRsZW4pCit7CisJaW50IHZhbDsKKwlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOworCisJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICghc2N0cF9pc19lcF9ib3VuZGFsbChzaykgJiYgdmFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKHZhbCAmJiBzcC0+ZG9fYXV0b19hc2NvbmYpIHx8ICghdmFsICYmICFzcC0+ZG9fYXV0b19hc2NvbmYpKQorCQlyZXR1cm4gMDsKKworCWlmICh2YWwgPT0gMCAmJiBzcC0+ZG9fYXV0b19hc2NvbmYpIHsKKwkJbGlzdF9kZWwoJnNwLT5hdXRvX2FzY29uZl9saXN0KTsKKwkJc3AtPmRvX2F1dG9fYXNjb25mID0gMDsKKwl9IGVsc2UgaWYgKHZhbCAmJiAhc3AtPmRvX2F1dG9fYXNjb25mKSB7CisJCWxpc3RfYWRkX3RhaWwoJnNwLT5hdXRvX2FzY29uZl9saXN0LAorCQkgICAgJnNjdHBfYXV0b19hc2NvbmZfc3BsaXN0KTsKKwkJc3AtPmRvX2F1dG9fYXNjb25mID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIAogLyogQVBJIDYuMiBzZXRzb2Nrb3B0KCksIGdldHNvY2tvcHQoKQogICoKQEAgLTM0ODEsNiArMzYxNyw5IEBACiAJY2FzZSBTQ1RQX0FVVEhfREVMRVRFX0tFWToKIAkJcmV0dmFsID0gc2N0cF9zZXRzb2Nrb3B0X2RlbF9rZXkoc2ssIG9wdHZhbCwgb3B0bGVuKTsKIAkJYnJlYWs7CisJY2FzZSBTQ1RQX0FVVE9fQVNDT05GOgorCQlyZXR2YWwgPSBzY3RwX3NldHNvY2tvcHRfYXV0b19hc2NvbmYoc2ssIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dmFsID0gLUVOT1BST1RPT1BUOwogCQlicmVhazsKQEAgLTM3NjMsNiArMzkwMiwxMiBAQAogCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAlwZXJjcHVfY291bnRlcl9pbmMoJnNjdHBfc29ja2V0c19hbGxvY2F0ZWQpOwogCXNvY2tfcHJvdF9pbnVzZV9hZGQoc29ja19uZXQoc2spLCBzay0+c2tfcHJvdCwgMSk7CisJaWYgKHNjdHBfZGVmYXVsdF9hdXRvX2FzY29uZikgeworCQlsaXN0X2FkZF90YWlsKCZzcC0+YXV0b19hc2NvbmZfbGlzdCwKKwkJICAgICZzY3RwX2F1dG9fYXNjb25mX3NwbGlzdCk7CisJCXNwLT5kb19hdXRvX2FzY29uZiA9IDE7CisJfSBlbHNlCisJCXNwLT5kb19hdXRvX2FzY29uZiA9IDA7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CiAKIAlyZXR1cm4gMDsKQEAgLTM3NzEsMTMgKzM5MTYsMTcgQEAKIC8qIENsZWFudXAgYW55IFNDVFAgcGVyIHNvY2tldCByZXNvdXJjZXMuICAqLwogU0NUUF9TVEFUSUMgdm9pZCBzY3RwX2Rlc3Ryb3lfc29jayhzdHJ1Y3Qgc29jayAqc2spCiB7Ci0Jc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwOworCXN0cnVjdCBzY3RwX3NvY2sgKnNwOwogCiAJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfZGVzdHJveV9zb2NrKHNrOiAlcClcbiIsIHNrKTsKIAogCS8qIFJlbGVhc2Ugb3VyIGhvbGQgb24gdGhlIGVuZHBvaW50LiAqLwotCWVwID0gc2N0cF9zayhzayktPmVwOwotCXNjdHBfZW5kcG9pbnRfZnJlZShlcCk7CisJc3AgPSBzY3RwX3NrKHNrKTsKKwlpZiAoc3AtPmRvX2F1dG9fYXNjb25mKSB7CisJCXNwLT5kb19hdXRvX2FzY29uZiA9IDA7CisJCWxpc3RfZGVsKCZzcC0+YXV0b19hc2NvbmZfbGlzdCk7CisJfQorCXNjdHBfZW5kcG9pbnRfZnJlZShzcC0+ZXApOwogCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAlwZXJjcHVfY291bnRlcl9kZWMoJnNjdHBfc29ja2V0c19hbGxvY2F0ZWQpOwogCXNvY2tfcHJvdF9pbnVzZV9hZGQoc29ja19uZXQoc2spLCBzay0+c2tfcHJvdCwgLTEpOwpAQCAtNTI3Nyw2ICs1NDI2LDI4IEBACiB9CiAKIC8qCisgKiA4LjEuMjMgU0NUUF9BVVRPX0FTQ09ORgorICogU2VlIHRoZSBjb3JyZXNwb25kaW5nIHNldHNvY2tvcHQgZW50cnkgYXMgZGVzY3JpcHRpb24KKyAqLworc3RhdGljIGludCBzY3RwX2dldHNvY2tvcHRfYXV0b19hc2NvbmYoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlpbnQgdmFsID0gMDsKKworCWlmIChsZW4gPCBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZW4gPSBzaXplb2YoaW50KTsKKwlpZiAoc2N0cF9zayhzayktPmRvX2F1dG9fYXNjb25mICYmIHNjdHBfaXNfZXBfYm91bmRhbGwoc2spKQorCQl2YWwgPSAxOworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmdmFsLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIDguMi42LiBHZXQgdGhlIEN1cnJlbnQgSWRlbnRpZmllcnMgb2YgQXNzb2NpYXRpb25zCiAgKiAgICAgICAgKFNDVFBfR0VUX0FTU09DX0lEX0xJU1QpCiAgKgpAQCAtNTQ2MCw2ICs1NjMxLDkgQEAKIAljYXNlIFNDVFBfR0VUX0FTU09DX0lEX0xJU1Q6CiAJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9hc3NvY19pZHMoc2ssIGxlbiwgb3B0dmFsLCBvcHRsZW4pOwogCQlicmVhazsKKwljYXNlIFNDVFBfQVVUT19BU0NPTkY6CisJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9hdXRvX2FzY29uZihzaywgbGVuLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHZhbCA9IC1FTk9QUk9UT09QVDsKIAkJYnJlYWs7CkBAIC02NTEyLDYgKzY2ODYsNyBAQAogCXN0cnVjdCBza19idWZmICpza2IsICp0bXA7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzY3RwX2JpbmRfaGFzaGJ1Y2tldCAqaGVhZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcGxpc3Q7CiAKIAkvKiBNaWdyYXRlIHNvY2tldCBidWZmZXIgc2l6ZXMgYW5kIGFsbCB0aGUgc29ja2V0IGxldmVsIG9wdGlvbnMgdG8gdGhlCiAJICogbmV3IHNvY2tldC4KQEAgLTY1MTksNyArNjY5NCwxMiBAQAogCW5ld3NrLT5za19zbmRidWYgPSBvbGRzay0+c2tfc25kYnVmOwogCW5ld3NrLT5za19yY3ZidWYgPSBvbGRzay0+c2tfcmN2YnVmOwogCS8qIEJydXRlIGZvcmNlIGNvcHkgb2xkIHNjdHAgb3B0LiAqLwotCWluZXRfc2tfY29weV9kZXNjZW5kYW50KG5ld3NrLCBvbGRzayk7CisJaWYgKG9sZHNwLT5kb19hdXRvX2FzY29uZikgeworCQltZW1jcHkoJnRtcGxpc3QsICZuZXdzcC0+YXV0b19hc2NvbmZfbGlzdCwgc2l6ZW9mKHRtcGxpc3QpKTsKKwkJaW5ldF9za19jb3B5X2Rlc2NlbmRhbnQobmV3c2ssIG9sZHNrKTsKKwkJbWVtY3B5KCZuZXdzcC0+YXV0b19hc2NvbmZfbGlzdCwgJnRtcGxpc3QsIHNpemVvZih0bXBsaXN0KSk7CisJfSBlbHNlCisJCWluZXRfc2tfY29weV9kZXNjZW5kYW50KG5ld3NrLCBvbGRzayk7CiAKIAkvKiBSZXN0b3JlIHRoZSBlcCB2YWx1ZSB0aGF0IHdhcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBhYm92ZSBzdHJ1Y3R1cmUKIAkgKiBjb3B5LgpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc3lzY3RsLmMgYi9uZXQvc2N0cC9zeXNjdGwuYwppbmRleCA1MGNiNTdmLi42YjM5NTI5IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zeXNjdGwuYworKysgYi9uZXQvc2N0cC9zeXNjdGwuYwpAQCAtMTgzLDYgKzE4MywxMyBAQAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAl9LAogCXsKKwkJLnByb2NuYW1lCT0gImRlZmF1bHRfYXV0b19hc2NvbmYiLAorCQkuZGF0YQkJPSAmc2N0cF9kZWZhdWx0X2F1dG9fYXNjb25mLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKKwl9LAorCXsKIAkJLnByb2NuYW1lCT0gInByc2N0cF9lbmFibGUiLAogCQkuZGF0YQkJPSAmc2N0cF9wcnNjdHBfZW5hYmxlLAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvdWxwZXZlbnQuYyBiL25ldC9zY3RwL3VscGV2ZW50LmMKaW5kZXggZTcwZTVmYy4uOGE4NDAxNyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdWxwZXZlbnQuYworKysgYi9uZXQvc2N0cC91bHBldmVudC5jCkBAIC0xMDgxLDkgKzEwODEsMTkgQEAKIH0KIAogLyogUHVyZ2UgdGhlIHNrYiBsaXN0cyBob2xkaW5nIHVscGV2ZW50cy4gKi8KLXZvaWQgc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKK3Vuc2lnbmVkIGludCBzY3RwX3F1ZXVlX3B1cmdlX3VscGV2ZW50cyhzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZShsaXN0KSkgIT0gTlVMTCkKLQkJc2N0cF91bHBldmVudF9mcmVlKHNjdHBfc2tiMmV2ZW50KHNrYikpOworCXVuc2lnbmVkIGludCBkYXRhX3VucmVhZCA9IDA7CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKGxpc3QpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCA9IHNjdHBfc2tiMmV2ZW50KHNrYik7CisKKwkJaWYgKCFzY3RwX3VscGV2ZW50X2lzX25vdGlmaWNhdGlvbihldmVudCkpCisJCQlkYXRhX3VucmVhZCArPSBza2ItPmxlbjsKKworCQlzY3RwX3VscGV2ZW50X2ZyZWUoZXZlbnQpOworCX0KKworCXJldHVybiBkYXRhX3VucmVhZDsKIH0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aC5jIGIvbmV0L3N1bnJwYy9hdXRoLmMKaW5kZXggY2Q2ZTRhYS4uNzI3ZTUwNiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoLmMKQEAgLTYyNiw3ICs2MjYsNyBAQAogCQlpZiAoZXJyIDwgMCkKIAkJCWdvdG8gb3V0OwogCQljcmVkID0gdGFzay0+dGtfcnFzdHAtPnJxX2NyZWQ7Ci0JfTsKKwl9CiAJZHByaW50aygiUlBDOiAlNXUgcmVmcmVzaGluZyAlcyBjcmVkICVwXG4iLAogCQl0YXNrLT50a19waWQsIGNyZWQtPmNyX2F1dGgtPmF1X29wcy0+YXVfbmFtZSwgY3JlZCk7CiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYwppbmRleCAzMzliYTY0Li4zNjRlYjQ1IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCkBAIC01NzcsMTMgKzU3NywxMyBAQAogCX0KIAlpbm9kZSA9ICZnc3NfbXNnLT5pbm9kZS0+dmZzX2lub2RlOwogCWZvciAoOzspIHsKLQkJcHJlcGFyZV90b193YWl0KCZnc3NfbXNnLT53YWl0cXVldWUsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQlwcmVwYXJlX3RvX3dhaXQoJmdzc19tc2ctPndhaXRxdWV1ZSwgJndhaXQsIFRBU0tfS0lMTEFCTEUpOwogCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCQlpZiAoZ3NzX21zZy0+Y3R4ICE9IE5VTEwgfHwgZ3NzX21zZy0+bXNnLmVycm5vIDwgMCkgewogCQkJYnJlYWs7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwotCQlpZiAoc2lnbmFsbGVkKCkpIHsKKwkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQllcnIgPSAtRVJFU1RBUlRTWVM7CiAJCQlnb3RvIG91dF9pbnRyOwogCQl9CkBAIC0xNDIxLDE4ICsxNDIxLDE2IEBACiAJCWdvdG8gb3V0OwogCX0KIAlzd2l0Y2ggKGdzc19jcmVkLT5nY19zZXJ2aWNlKSB7Ci0JCWNhc2UgUlBDX0dTU19TVkNfTk9ORToKLQkJCWdzc193cmFwX3JlcV9lbmNvZGUoZW5jb2RlLCBycXN0cCwgcCwgb2JqKTsKLQkJCXN0YXR1cyA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBSUENfR1NTX1NWQ19JTlRFR1JJVFk6Ci0JCQlzdGF0dXMgPSBnc3Nfd3JhcF9yZXFfaW50ZWcoY3JlZCwgY3R4LCBlbmNvZGUsCi0JCQkJCQkJCXJxc3RwLCBwLCBvYmopOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlBDX0dTU19TVkNfUFJJVkFDWToKLQkJCXN0YXR1cyA9IGdzc193cmFwX3JlcV9wcml2KGNyZWQsIGN0eCwgZW5jb2RlLAotCQkJCQlycXN0cCwgcCwgb2JqKTsKLQkJCWJyZWFrOworCWNhc2UgUlBDX0dTU19TVkNfTk9ORToKKwkJZ3NzX3dyYXBfcmVxX2VuY29kZShlbmNvZGUsIHJxc3RwLCBwLCBvYmopOworCQlzdGF0dXMgPSAwOworCQlicmVhazsKKwljYXNlIFJQQ19HU1NfU1ZDX0lOVEVHUklUWToKKwkJc3RhdHVzID0gZ3NzX3dyYXBfcmVxX2ludGVnKGNyZWQsIGN0eCwgZW5jb2RlLCBycXN0cCwgcCwgb2JqKTsKKwkJYnJlYWs7CisJY2FzZSBSUENfR1NTX1NWQ19QUklWQUNZOgorCQlzdGF0dXMgPSBnc3Nfd3JhcF9yZXFfcHJpdihjcmVkLCBjdHgsIGVuY29kZSwgcnFzdHAsIHAsIG9iaik7CisJCWJyZWFrOwogCX0KIG91dDoKIAlnc3NfcHV0X2N0eChjdHgpOwpAQCAtMTUzMSwxOCArMTUyOSwxOCBAQAogCWlmIChjdHgtPmdjX3Byb2MgIT0gUlBDX0dTU19QUk9DX0RBVEEpCiAJCWdvdG8gb3V0X2RlY29kZTsKIAlzd2l0Y2ggKGdzc19jcmVkLT5nY19zZXJ2aWNlKSB7Ci0JCWNhc2UgUlBDX0dTU19TVkNfTk9ORToKLQkJCWJyZWFrOwotCQljYXNlIFJQQ19HU1NfU1ZDX0lOVEVHUklUWToKLQkJCXN0YXR1cyA9IGdzc191bndyYXBfcmVzcF9pbnRlZyhjcmVkLCBjdHgsIHJxc3RwLCAmcCk7Ci0JCQlpZiAoc3RhdHVzKQotCQkJCWdvdG8gb3V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgUlBDX0dTU19TVkNfUFJJVkFDWToKLQkJCXN0YXR1cyA9IGdzc191bndyYXBfcmVzcF9wcml2KGNyZWQsIGN0eCwgcnFzdHAsICZwKTsKLQkJCWlmIChzdGF0dXMpCi0JCQkJZ290byBvdXQ7Ci0JCQlicmVhazsKKwljYXNlIFJQQ19HU1NfU1ZDX05PTkU6CisJCWJyZWFrOworCWNhc2UgUlBDX0dTU19TVkNfSU5URUdSSVRZOgorCQlzdGF0dXMgPSBnc3NfdW53cmFwX3Jlc3BfaW50ZWcoY3JlZCwgY3R4LCBycXN0cCwgJnApOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCWNhc2UgUlBDX0dTU19TVkNfUFJJVkFDWToKKwkJc3RhdHVzID0gZ3NzX3Vud3JhcF9yZXNwX3ByaXYoY3JlZCwgY3R4LCBycXN0cCwgJnApOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOwogCX0KIAkvKiB0YWtlIGludG8gYWNjb3VudCBleHRyYSBzbGFjayBmb3IgaW50ZWdyaXR5IGFuZCBwcml2YWN5IGNhc2VzOiAqLwogCWNyZWQtPmNyX2F1dGgtPmF1X3JzbGFjayA9IGNyZWQtPmNyX2F1dGgtPmF1X3ZlcmZzaXplICsgKHAgLSBzYXZlZHApCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCmluZGV4IDBhOWEyZWMuLjhjNjc4OTAgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19rcmI1Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3Nfa3JiNV9lbmN0eXBlcy5oPgogCiAjaWZkZWYgUlBDX0RFQlVHCiAjIGRlZmluZSBSUENEQkdfRkFDSUxJVFkJUlBDREJHX0FVVEgKQEAgLTc0Myw2ICs3NDQsMTMgQEAKIAl9LAogfTsKIAorTU9EVUxFX0FMSUFTKCJycGMtYXV0aC1nc3Mta3JiNSIpOworTU9EVUxFX0FMSUFTKCJycGMtYXV0aC1nc3Mta3JiNWkiKTsKK01PRFVMRV9BTElBUygicnBjLWF1dGgtZ3NzLWtyYjVwIik7CitNT0RVTEVfQUxJQVMoInJwYy1hdXRoLWdzcy0zOTAwMDMiKTsKK01PRFVMRV9BTElBUygicnBjLWF1dGgtZ3NzLTM5MDAwNCIpOworTU9EVUxFX0FMSUFTKCJycGMtYXV0aC1nc3MtMzkwMDA1Iik7CisKIHN0YXRpYyBzdHJ1Y3QgZ3NzX2FwaV9tZWNoIGdzc19rZXJiZXJvc19tZWNoID0gewogCS5nbV9uYW1lCT0gImtyYjUiLAogCS5nbV9vd25lcgk9IFRISVNfTU9EVUxFLApAQCAtNzUwLDcgKzc1OCw3IEBACiAJLmdtX29wcwkJPSAmZ3NzX2tlcmJlcm9zX29wcywKIAkuZ21fcGZfbnVtCT0gQVJSQVlfU0laRShnc3Nfa2VyYmVyb3NfcGZzKSwKIAkuZ21fcGZzCQk9IGdzc19rZXJiZXJvc19wZnMsCi0JLmdtX3VwY2FsbF9lbmN0eXBlcyA9ICIxOCwxNywxNiwyMywzLDEsMiIsCisJLmdtX3VwY2FsbF9lbmN0eXBlcyA9IEtSQjVfU1VQUE9SVEVEX0VOQ1RZUEVTLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9rZXJiZXJvc19tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX21lY2hfc3dpdGNoLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19tZWNoX3N3aXRjaC5jCmluZGV4IGUzYzM2YTIuLmNhOGNhZDggMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX21lY2hfc3dpdGNoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfbWVjaF9zd2l0Y2guYwpAQCAtMTQxLDcgKzE0MSw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChnc3NfbWVjaF9nZXQpOwogCiBzdHJ1Y3QgZ3NzX2FwaV9tZWNoICoKLWdzc19tZWNoX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCitfZ3NzX21lY2hfZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgZ3NzX2FwaV9tZWNoCSpwb3MsICpnbSA9IE5VTEw7CiAKQEAgLTE1OCw2ICsxNTgsMTcgQEAKIAogfQogCitzdHJ1Y3QgZ3NzX2FwaV9tZWNoICogZ3NzX21lY2hfZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZ3NzX2FwaV9tZWNoICpnbSA9IE5VTEw7CisKKwlnbSA9IF9nc3NfbWVjaF9nZXRfYnlfbmFtZShuYW1lKTsKKwlpZiAoIWdtKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJycGMtYXV0aC1nc3MtJXMiLCBuYW1lKTsKKwkJZ20gPSBfZ3NzX21lY2hfZ2V0X2J5X25hbWUobmFtZSk7CisJfQorCXJldHVybiBnbTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKGdzc19tZWNoX2dldF9ieV9uYW1lKTsKIAogc3RydWN0IGdzc19hcGlfbWVjaCAqCkBAIC0xOTQsMTAgKzIwNSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBnc3NfYXBpX21lY2ggKgotZ3NzX21lY2hfZ2V0X2J5X3BzZXVkb2ZsYXZvcih1MzIgcHNldWRvZmxhdm9yKQorc3RydWN0IGdzc19hcGlfbWVjaCAqX2dzc19tZWNoX2dldF9ieV9wc2V1ZG9mbGF2b3IodTMyIHBzZXVkb2ZsYXZvcikKIHsKLQlzdHJ1Y3QgZ3NzX2FwaV9tZWNoICpwb3MsICpnbSA9IE5VTEw7CisJc3RydWN0IGdzc19hcGlfbWVjaCAqZ20gPSBOVUxMLCAqcG9zOwogCiAJc3Bpbl9sb2NrKCZyZWdpc3RlcmVkX21lY2hzX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmcmVnaXN0ZXJlZF9tZWNocywgZ21fbGlzdCkgewpAQCAtMjEzLDYgKzIyMywyMCBAQAogCXJldHVybiBnbTsKIH0KIAorc3RydWN0IGdzc19hcGlfbWVjaCAqCitnc3NfbWVjaF9nZXRfYnlfcHNldWRvZmxhdm9yKHUzMiBwc2V1ZG9mbGF2b3IpCit7CisJc3RydWN0IGdzc19hcGlfbWVjaCAqZ207CisKKwlnbSA9IF9nc3NfbWVjaF9nZXRfYnlfcHNldWRvZmxhdm9yKHBzZXVkb2ZsYXZvcik7CisKKwlpZiAoIWdtKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJycGMtYXV0aC1nc3MtJXUiLCBwc2V1ZG9mbGF2b3IpOworCQlnbSA9IF9nc3NfbWVjaF9nZXRfYnlfcHNldWRvZmxhdm9yKHBzZXVkb2ZsYXZvcik7CisJfQorCXJldHVybiBnbTsKK30KKwogRVhQT1JUX1NZTUJPTF9HUEwoZ3NzX21lY2hfZ2V0X2J5X3BzZXVkb2ZsYXZvcik7CiAKIGludCBnc3NfbWVjaF9saXN0X3BzZXVkb2ZsYXZvcnMocnBjX2F1dGhmbGF2b3JfdCAqYXJyYXlfcHRyKQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jbG50LmMgYi9uZXQvc3VucnBjL2NsbnQuYwppbmRleCBiODRkNzM5Li5jNTA4MThmIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2NsbnQuYworKysgYi9uZXQvc3VucnBjL2NsbnQuYwpAQCAtOTcsOCArOTcsNyBAQAogcnBjX3NldHVwX3BpcGVkaXIoc3RydWN0IHJwY19jbG50ICpjbG50LCBjaGFyICpkaXJfbmFtZSkKIHsKIAlzdGF0aWMgdWludDMyX3QgY2xudGlkOwotCXN0cnVjdCBuYW1laWRhdGEgbmQ7Ci0Jc3RydWN0IHBhdGggcGF0aDsKKwlzdHJ1Y3QgcGF0aCBwYXRoLCBkaXI7CiAJY2hhciBuYW1lWzE1XTsKIAlzdHJ1Y3QgcXN0ciBxID0gewogCQkubmFtZSA9IG5hbWUsCkBAIC0xMTMsNyArMTEyLDcgQEAKIAlwYXRoLm1udCA9IHJwY19nZXRfbW91bnQoKTsKIAlpZiAoSVNfRVJSKHBhdGgubW50KSkKIAkJcmV0dXJuIFBUUl9FUlIocGF0aC5tbnQpOwotCWVycm9yID0gdmZzX3BhdGhfbG9va3VwKHBhdGgubW50LT5tbnRfcm9vdCwgcGF0aC5tbnQsIGRpcl9uYW1lLCAwLCAmbmQpOworCWVycm9yID0gdmZzX3BhdGhfbG9va3VwKHBhdGgubW50LT5tbnRfcm9vdCwgcGF0aC5tbnQsIGRpcl9uYW1lLCAwLCAmZGlyKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyOwogCkBAIC0xMjEsNyArMTIwLDcgQEAKIAkJcS5sZW4gPSBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJjbG50JXgiLCAodW5zaWduZWQgaW50KWNsbnRpZCsrKTsKIAkJbmFtZVtzaXplb2YobmFtZSkgLSAxXSA9ICdcMCc7CiAJCXEuaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKHEubmFtZSwgcS5sZW4pOwotCQlwYXRoLmRlbnRyeSA9IHJwY19jcmVhdGVfY2xpZW50X2RpcihuZC5wYXRoLmRlbnRyeSwgJnEsIGNsbnQpOworCQlwYXRoLmRlbnRyeSA9IHJwY19jcmVhdGVfY2xpZW50X2RpcihkaXIuZGVudHJ5LCAmcSwgY2xudCk7CiAJCWlmICghSVNfRVJSKHBhdGguZGVudHJ5KSkKIAkJCWJyZWFrOwogCQllcnJvciA9IFBUUl9FUlIocGF0aC5kZW50cnkpOwpAQCAtMTMyLDExICsxMzEsMTEgQEAKIAkJCWdvdG8gZXJyX3BhdGhfcHV0OwogCQl9CiAJfQotCXBhdGhfcHV0KCZuZC5wYXRoKTsKKwlwYXRoX3B1dCgmZGlyKTsKIAljbG50LT5jbF9wYXRoID0gcGF0aDsKIAlyZXR1cm4gMDsKIGVycl9wYXRoX3B1dDoKLQlwYXRoX3B1dCgmbmQucGF0aCk7CisJcGF0aF9wdXQoJmRpcik7CiBlcnI6CiAJcnBjX3B1dF9tb3VudCgpOwogCXJldHVybiBlcnJvcjsKQEAgLTEwNjEsNyArMTA2MCw3IEBACiAKIAlkcHJpbnRrKCJSUEM6ICU1dSBycGNfYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iLCB0YXNrLT50a19waWQpOwogCi0JaWYgKFJQQ19JU19BU1lOQyh0YXNrKSB8fCAhc2lnbmFsbGVkKCkpIHsKKwlpZiAoUlBDX0lTX0FTWU5DKHRhc2spIHx8ICFmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQl0YXNrLT50a19hY3Rpb24gPSBjYWxsX2FsbG9jYXRlOwogCQlycGNfZGVsYXkodGFzaywgSFo+PjQpOwogCQlyZXR1cm47CkBAIC0xMTc1LDYgKzExNzQsOSBAQAogCQkJc3RhdHVzID0gLUVPUE5PVFNVUFA7CiAJCQlicmVhazsKIAkJfQorCQlpZiAodGFzay0+dGtfcmViaW5kX3JldHJ5ID09IDApCisJCQlicmVhazsKKwkJdGFzay0+dGtfcmViaW5kX3JldHJ5LS07CiAJCXJwY19kZWxheSh0YXNrLCAzKkhaKTsKIAkJZ290byByZXRyeV90aW1lb3V0OwogCWNhc2UgLUVUSU1FRE9VVDoKQEAgLTE2NjMsMTkgKzE2NjUsMTggQEAKIAkJaWYgKC0tbGVuIDwgMCkKIAkJCWdvdG8gb3V0X292ZXJmbG93OwogCQlzd2l0Y2ggKChuID0gbnRvaGwoKnArKykpKSB7Ci0JCQljYXNlIFJQQ19BVVRIX0VSUk9SOgotCQkJCWJyZWFrOwotCQkJY2FzZSBSUENfTUlTTUFUQ0g6Ci0JCQkJZHByaW50aygiUlBDOiAlNXUgJXM6IFJQQyBjYWxsIHZlcnNpb24gIgotCQkJCQkJIm1pc21hdGNoIVxuIiwKLQkJCQkJCXRhc2stPnRrX3BpZCwgX19mdW5jX18pOwotCQkJCWVycm9yID0gLUVQUk9UT05PU1VQUE9SVDsKLQkJCQlnb3RvIG91dF9lcnI7Ci0JCQlkZWZhdWx0OgotCQkJCWRwcmludGsoIlJQQzogJTV1ICVzOiBSUEMgY2FsbCByZWplY3RlZCwgIgotCQkJCQkJInVua25vd24gZXJyb3I6ICV4XG4iLAotCQkJCQkJdGFzay0+dGtfcGlkLCBfX2Z1bmNfXywgbik7Ci0JCQkJZ290byBvdXRfZWlvOworCQljYXNlIFJQQ19BVVRIX0VSUk9SOgorCQkJYnJlYWs7CisJCWNhc2UgUlBDX01JU01BVENIOgorCQkJZHByaW50aygiUlBDOiAlNXUgJXM6IFJQQyBjYWxsIHZlcnNpb24gbWlzbWF0Y2ghXG4iLAorCQkJCXRhc2stPnRrX3BpZCwgX19mdW5jX18pOworCQkJZXJyb3IgPSAtRVBST1RPTk9TVVBQT1JUOworCQkJZ290byBvdXRfZXJyOworCQlkZWZhdWx0OgorCQkJZHByaW50aygiUlBDOiAlNXUgJXM6IFJQQyBjYWxsIHJlamVjdGVkLCAiCisJCQkJInVua25vd24gZXJyb3I6ICV4XG4iLAorCQkJCXRhc2stPnRrX3BpZCwgX19mdW5jX18sIG4pOworCQkJZ290byBvdXRfZWlvOwogCQl9CiAJCWlmICgtLWxlbiA8IDApCiAJCQlnb3RvIG91dF9vdmVyZmxvdzsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvcnBjX3BpcGUuYyBiL25ldC9zdW5ycGMvcnBjX3BpcGUuYwppbmRleCA3MmJjNTM2Li5iMTgxZTM0IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY19waXBlLmMKKysrIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCkBAIC00NTYsMTMgKzQ1NiwxMyBAQAogCWlub2RlLT5pX2lubyA9IGdldF9uZXh0X2lubygpOwogCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQlzd2l0Y2gobW9kZSAmIFNfSUZNVCkgewotCQljYXNlIFNfSUZESVI6Ci0JCQlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwotCQkJaW5vZGUtPmlfb3AgPSAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwotCQkJaW5jX25saW5rKGlub2RlKTsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOworCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgeworCWNhc2UgU19JRkRJUjoKKwkJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfb3AgPSAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbmNfbmxpbmsoaW5vZGUpOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAlyZXR1cm4gaW5vZGU7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwppbmRleCA5YTgwYTkyLi5lNDVkMmZiIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCisrKyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTU5Nyw3ICs1OTcsNyBAQAogCXUzMiBiaW5kX3ZlcnNpb247CiAJc3RydWN0IHJwY194cHJ0ICp4cHJ0OwogCXN0cnVjdCBycGNfY2xudAkqcnBjYl9jbG50OwotCXN0YXRpYyBzdHJ1Y3QgcnBjYmluZF9hcmdzICptYXA7CisJc3RydWN0IHJwY2JpbmRfYXJncyAqbWFwOwogCXN0cnVjdCBycGNfdGFzawkqY2hpbGQ7CiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKIAlzdHJ1Y3Qgc29ja2FkZHIgKnNhcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc2NoZWQuYyBiL25ldC9zdW5ycGMvc2NoZWQuYwppbmRleCA2YjQzZWU3Li40ODE0ZTI0IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3NjaGVkLmMKKysrIGIvbmV0L3N1bnJwYy9zY2hlZC5jCkBAIC02MTYsMzAgKzYxNiwyNSBAQAogCUJVR19PTihSUENfSVNfUVVFVUVEKHRhc2spKTsKIAogCWZvciAoOzspIHsKKwkJdm9pZCAoKmRvX2FjdGlvbikoc3RydWN0IHJwY190YXNrICopOwogCiAJCS8qCi0JCSAqIEV4ZWN1dGUgYW55IHBlbmRpbmcgY2FsbGJhY2suCisJCSAqIEV4ZWN1dGUgYW55IHBlbmRpbmcgY2FsbGJhY2sgZmlyc3QuCiAJCSAqLwotCQlpZiAodGFzay0+dGtfY2FsbGJhY2spIHsKLQkJCXZvaWQgKCpzYXZlX2NhbGxiYWNrKShzdHJ1Y3QgcnBjX3Rhc2sgKik7Ci0KLQkJCS8qCi0JCQkgKiBXZSBzZXQgdGtfY2FsbGJhY2sgdG8gTlVMTCBiZWZvcmUgY2FsbGluZyBpdCwKLQkJCSAqIGluIGNhc2UgaXQgc2V0cyB0aGUgdGtfY2FsbGJhY2sgZmllbGQgaXRzZWxmOgotCQkJICovCi0JCQlzYXZlX2NhbGxiYWNrID0gdGFzay0+dGtfY2FsbGJhY2s7Ci0JCQl0YXNrLT50a19jYWxsYmFjayA9IE5VTEw7Ci0JCQlzYXZlX2NhbGxiYWNrKHRhc2spOwotCQl9IGVsc2UgeworCQlkb19hY3Rpb24gPSB0YXNrLT50a19jYWxsYmFjazsKKwkJdGFzay0+dGtfY2FsbGJhY2sgPSBOVUxMOworCQlpZiAoZG9fYWN0aW9uID09IE5VTEwpIHsKIAkJCS8qCiAJCQkgKiBQZXJmb3JtIHRoZSBuZXh0IEZTTSBzdGVwLgotCQkJICogdGtfYWN0aW9uIG1heSBiZSBOVUxMIHdoZW4gdGhlIHRhc2sgaGFzIGJlZW4ga2lsbGVkCi0JCQkgKiBieSBzb21lb25lIGVsc2UuCisJCQkgKiB0a19hY3Rpb24gbWF5IGJlIE5VTEwgaWYgdGhlIHRhc2sgaGFzIGJlZW4ga2lsbGVkLgorCQkJICogSW4gcGFydGljdWxhciwgbm90ZSB0aGF0IHJwY19raWxsYWxsX3Rhc2tzIG1heQorCQkJICogZG8gdGhpcyBhdCBhbnkgdGltZSwgc28gYmV3YXJlIHdoZW4gZGVyZWZlcmVuY2luZy4KIAkJCSAqLwotCQkJaWYgKHRhc2stPnRrX2FjdGlvbiA9PSBOVUxMKQorCQkJZG9fYWN0aW9uID0gdGFzay0+dGtfYWN0aW9uOworCQkJaWYgKGRvX2FjdGlvbiA9PSBOVUxMKQogCQkJCWJyZWFrOwotCQkJdGFzay0+dGtfYWN0aW9uKHRhc2spOwogCQl9CisJCWRvX2FjdGlvbih0YXNrKTsKIAogCQkvKgogCQkgKiBMb2NrbGVzcyBjaGVjayBmb3Igd2hldGhlciB0YXNrIGlzIHNsZWVwaW5nIG9yIG5vdC4KQEAgLTc5Miw2ICs3ODcsNyBAQAogCS8qIEluaXRpYWxpemUgcmV0cnkgY291bnRlcnMgKi8KIAl0YXNrLT50a19nYXJiX3JldHJ5ID0gMjsKIAl0YXNrLT50a19jcmVkX3JldHJ5ID0gMjsKKwl0YXNrLT50a19yZWJpbmRfcmV0cnkgPSAyOwogCiAJdGFzay0+dGtfcHJpb3JpdHkgPSB0YXNrX3NldHVwX2RhdGEtPnByaW9yaXR5IC0gUlBDX1BSSU9SSVRZX0xPVzsKIAl0YXNrLT50a19vd25lciA9IGN1cnJlbnQtPnRnaWQ7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y194cHJ0LmMgYi9uZXQvc3VucnBjL3N2Y194cHJ0LmMKaW5kZXggYWI4NmI3OS4uYmQzMTIwOCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNfeHBydC5jCisrKyBiL25ldC9zdW5ycGMvc3ZjX3hwcnQuYwpAQCAtOTAyLDEyICs5MDIsMTMgQEAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoWFBUX0RFVEFDSEVELCAmeHBydC0+eHB0X2ZsYWdzKSkKIAkJbGlzdF9kZWxfaW5pdCgmeHBydC0+eHB0X2xpc3QpOwogCS8qCi0JICogV2UgdXNlZCB0byBkZWxldGUgdGhlIHRyYW5zcG9ydCBmcm9tIHdoaWNoZXZlciBsaXN0Ci0JICogaXQncyBza194cHJ0LnhwdF9yZWFkeSBub2RlIHdhcyBvbiwgYnV0IHdlIGRvbid0IGFjdHVhbGx5Ci0JICogbmVlZCB0by4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgb25seSB0aW1lIHdlJ3JlIGNhbGxlZAotCSAqIHdoaWxlIHN0aWxsIGF0dGFjaGVkIHRvIGEgcXVldWUsIHRoZSBxdWV1ZSBpdHNlbGYKLQkgKiBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQgKGluIHN2Y19kZXN0cm95KS4KKwkgKiBUaGUgb25seSB0aW1lIHdlJ3JlIGNhbGxlZCB3aGlsZSB4cHRfcmVhZHkgaXMgc3RpbGwgb24gYSBsaXN0CisJICogaXMgd2hpbGUgdGhlIGxpc3QgaXRzZWxmIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZCAoaW4KKwkgKiBzdmNfZGVzdHJveSkuICBCVVQgc3ZjX3hwcnRfZW5xdWV1ZSBjb3VsZCBzdGlsbCBiZSBhdHRlbXB0aW5nCisJICogdG8gYWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBzcF9zb2NrZXRzIGxpc3QsIHNvIHdlIGNhbid0IGxlYXZlCisJICogYSBmcmVlZCB4cHJ0IG9uIGl0LgogCSAqLworCWxpc3RfZGVsX2luaXQoJnhwcnQtPnhwdF9yZWFkeSk7CiAJaWYgKHRlc3RfYml0KFhQVF9URU1QLCAmeHBydC0+eHB0X2ZsYWdzKSkKIAkJc2Vydi0+c3ZfdG1wY250LS07CiAJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYyBiL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKaW5kZXggYzhlMTAyMS4uY2UxMzYzMiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYworKysgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCkBAIC0zMCwxMiArMzAsMTAgQEAKIAogc3RydWN0IHVuaXhfZG9tYWluIHsKIAlzdHJ1Y3QgYXV0aF9kb21haW4JaDsKLSNpZmRlZiBDT05GSUdfTkZTRF9ERVBSRUNBVEVECi0JaW50CWFkZHJfY2hhbmdlczsKLSNlbmRpZiAvKiBDT05GSUdfTkZTRF9ERVBSRUNBVEVEICovCiAJLyogb3RoZXIgc3R1ZmYgbGF0ZXIgKi8KIH07CiAKK2V4dGVybiBzdHJ1Y3QgYXV0aF9vcHMgc3ZjYXV0aF9udWxsOwogZXh0ZXJuIHN0cnVjdCBhdXRoX29wcyBzdmNhdXRoX3VuaXg7CiAKIHN0YXRpYyB2b2lkIHN2Y2F1dGhfdW5peF9kb21haW5fcmVsZWFzZShzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbSkKQEAgLTc0LDkgKzcyLDYgQEAKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCW5ldy0+aC5mbGF2b3VyID0gJnN2Y2F1dGhfdW5peDsKLSNpZmRlZiBDT05GSUdfTkZTRF9ERVBSRUNBVEVECi0JCW5ldy0+YWRkcl9jaGFuZ2VzID0gMDsKLSNlbmRpZiAvKiBDT05GSUdfTkZTRF9ERVBSRUNBVEVEICovCiAJCXJ2ID0gYXV0aF9kb21haW5fbG9va3VwKG5hbWUsICZuZXctPmgpOwogCX0KIH0KQEAgLTk1LDkgKzkwLDYgQEAKIAljaGFyCQkJbV9jbGFzc1s4XTsgLyogZS5nLiAibmZzZCIgKi8KIAlzdHJ1Y3QgaW42X2FkZHIJCW1fYWRkcjsKIAlzdHJ1Y3QgdW5peF9kb21haW4JKm1fY2xpZW50OwotI2lmZGVmIENPTkZJR19ORlNEX0RFUFJFQ0FURUQKLQlpbnQJCQltX2FkZF9jaGFuZ2U7Ci0jZW5kaWYgLyogQ09ORklHX05GU0RfREVQUkVDQVRFRCAqLwogfTsKIAogc3RhdGljIHZvaWQgaXBfbWFwX3B1dChzdHJ1Y3Qga3JlZiAqa3JlZikKQEAgLTE1MSw5ICsxNDMsNiBAQAogCiAJa3JlZl9nZXQoJml0ZW0tPm1fY2xpZW50LT5oLnJlZik7CiAJbmV3LT5tX2NsaWVudCA9IGl0ZW0tPm1fY2xpZW50OwotI2lmZGVmIENPTkZJR19ORlNEX0RFUFJFQ0FURUQKLQluZXctPm1fYWRkX2NoYW5nZSA9IGl0ZW0tPm1fYWRkX2NoYW5nZTsKLSNlbmRpZiAvKiBDT05GSUdfTkZTRF9ERVBSRUNBVEVEICovCiB9CiBzdGF0aWMgc3RydWN0IGNhY2hlX2hlYWQgKmlwX21hcF9hbGxvYyh2b2lkKQogewpAQCAtMzM4LDE2ICszMjcsNiBAQAogCWlwLmguZmxhZ3MgPSAwOwogCWlmICghdWRvbSkKIAkJc2V0X2JpdChDQUNIRV9ORUdBVElWRSwgJmlwLmguZmxhZ3MpOwotI2lmZGVmIENPTkZJR19ORlNEX0RFUFJFQ0FURUQKLQllbHNlIHsKLQkJaXAubV9hZGRfY2hhbmdlID0gdWRvbS0+YWRkcl9jaGFuZ2VzOwotCQkvKiBpZiB0aGlzIGlzIGZyb20gdGhlIGxlZ2FjeSBzZXRfY2xpZW50IHN5c3RlbSBjYWxsLAotCQkgKiB3ZSBuZWVkIG1fYWRkX2NoYW5nZSB0byBiZSBvbmUgaGlnaGVyCi0JCSAqLwotCQlpZiAoZXhwaXJ5ID09IE5FVkVSKQotCQkJaXAubV9hZGRfY2hhbmdlKys7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19ORlNEX0RFUFJFQ0FURUQgKi8KIAlpcC5oLmV4cGlyeV90aW1lID0gZXhwaXJ5OwogCWNoID0gc3VucnBjX2NhY2hlX3VwZGF0ZShjZCwgJmlwLmgsICZpcG0tPmgsCiAJCQkJIGhhc2hfc3RyKGlwbS0+bV9jbGFzcywgSVBfSEFTSEJJVFMpIF4KQEAgLTM2Nyw2MiArMzQ2LDYgQEAKIAlyZXR1cm4gX19pcF9tYXBfdXBkYXRlKHNuLT5pcF9tYXBfY2FjaGUsIGlwbSwgdWRvbSwgZXhwaXJ5KTsKIH0KIAotI2lmZGVmIENPTkZJR19ORlNEX0RFUFJFQ0FURUQKLWludCBhdXRoX3VuaXhfYWRkX2FkZHIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsIHN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tKQotewotCXN0cnVjdCB1bml4X2RvbWFpbiAqdWRvbTsKLQlzdHJ1Y3QgaXBfbWFwICppcG1wOwotCi0JaWYgKGRvbS0+Zmxhdm91ciAhPSAmc3ZjYXV0aF91bml4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQl1ZG9tID0gY29udGFpbmVyX29mKGRvbSwgc3RydWN0IHVuaXhfZG9tYWluLCBoKTsKLQlpcG1wID0gaXBfbWFwX2xvb2t1cChuZXQsICJuZnNkIiwgYWRkcik7Ci0KLQlpZiAoaXBtcCkKLQkJcmV0dXJuIGlwX21hcF91cGRhdGUobmV0LCBpcG1wLCB1ZG9tLCBORVZFUik7Ci0JZWxzZQotCQlyZXR1cm4gLUVOT01FTTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGF1dGhfdW5peF9hZGRfYWRkcik7Ci0KLWludCBhdXRoX3VuaXhfZm9yZ2V0X29sZChzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbSkKLXsKLQlzdHJ1Y3QgdW5peF9kb21haW4gKnVkb207Ci0KLQlpZiAoZG9tLT5mbGF2b3VyICE9ICZzdmNhdXRoX3VuaXgpCi0JCXJldHVybiAtRUlOVkFMOwotCXVkb20gPSBjb250YWluZXJfb2YoZG9tLCBzdHJ1Y3QgdW5peF9kb21haW4sIGgpOwotCXVkb20tPmFkZHJfY2hhbmdlcysrOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYXV0aF91bml4X2ZvcmdldF9vbGQpOwotCi1zdHJ1Y3QgYXV0aF9kb21haW4gKmF1dGhfdW5peF9sb29rdXAoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCi17Ci0Jc3RydWN0IGlwX21hcCAqaXBtOwotCXN0cnVjdCBhdXRoX2RvbWFpbiAqcnY7Ci0Jc3RydWN0IHN1bnJwY19uZXQgKnNuOwotCi0Jc24gPSBuZXRfZ2VuZXJpYyhuZXQsIHN1bnJwY19uZXRfaWQpOwotCWlwbSA9IGlwX21hcF9sb29rdXAobmV0LCAibmZzZCIsIGFkZHIpOwotCi0JaWYgKCFpcG0pCi0JCXJldHVybiBOVUxMOwotCWlmIChjYWNoZV9jaGVjayhzbi0+aXBfbWFwX2NhY2hlLCAmaXBtLT5oLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoKGlwbS0+bV9jbGllbnQtPmFkZHJfY2hhbmdlcyAtIGlwbS0+bV9hZGRfY2hhbmdlKSA+MCkgewotCQlzdW5ycGNfaW52YWxpZGF0ZSgmaXBtLT5oLCBzbi0+aXBfbWFwX2NhY2hlKTsKLQkJcnYgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXJ2ID0gJmlwbS0+bV9jbGllbnQtPmg7Ci0JCWtyZWZfZ2V0KCZydi0+cmVmKTsKLQl9Ci0JY2FjaGVfcHV0KCZpcG0tPmgsIHNuLT5pcF9tYXBfY2FjaGUpOwotCXJldHVybiBydjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGF1dGhfdW5peF9sb29rdXApOwotI2VuZGlmIC8qIENPTkZJR19ORlNEX0RFUFJFQ0FURUQgKi8KIAogdm9pZCBzdmNhdXRoX3VuaXhfcHVyZ2Uodm9pZCkKIHsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3Zjc29jay5jIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKaW5kZXggYWYwNGY3Ny4uZjJjYjViOCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKQEAgLTUxLDYgKzUxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3RhdHMuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMveHBydC5oPgogCisjaW5jbHVkZSAic3VucnBjLmgiCisKICNkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19TVkNYUFJUCiAKIApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYV90cmFuc3BvcnQuYyBiL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfdHJhbnNwb3J0LmMKaW5kZXggYzNjMjMyYS4uYTM4NTQzMCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYV90cmFuc3BvcnQuYworKysgYi9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3RyYW5zcG9ydC5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y194cHJ0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3JwY19yZG1hLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYyBiL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYwppbmRleCA4MGY4ZGEzLi4yODIzNmJhIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3ZlcmJzLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS92ZXJicy5jCkBAIC00Nyw2ICs0Nyw3IEBACiAgKiAgbyBidWZmZXIgbWVtb3J5CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgkvKiBmb3IgVGF2b3IgaGFjayBiZWxvdyAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmNhc3QuYyBiL25ldC90aXBjL2JjYXN0LmMKaW5kZXggZmE2OGQxZS4uNzU5YjMxOCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvYmNhc3QuYworKysgYi9uZXQvdGlwYy9iY2FzdC5jCkBAIC01NTIsMTIgKzU1MiwxNiBAQAogCWlmIChsaWtlbHkoIW1zZ19ub25fc2VxKGJ1Zl9tc2coYnVmKSkpKSB7CiAJCXN0cnVjdCB0aXBjX21zZyAqbXNnOwogCi0JCWFzc2VydCh0aXBjX2JjYXN0X25tYXAuY291bnQgIT0gMCk7CiAJCWJjYnVmX3NldF9hY2tzKGJ1ZiwgdGlwY19iY2FzdF9ubWFwLmNvdW50KTsKIAkJbXNnID0gYnVmX21zZyhidWYpOwogCQltc2dfc2V0X25vbl9zZXEobXNnLCAxKTsKIAkJbXNnX3NldF9tY19uZXRpZChtc2csIHRpcGNfbmV0X2lkKTsKIAkJYmNsLT5zdGF0cy5zZW50X2luZm8rKzsKKworCQlpZiAoV0FSTl9PTighdGlwY19iY2FzdF9ubWFwLmNvdW50KSkgeworCQkJZHVtcF9zdGFjaygpOworCQkJcmV0dXJuIDA7CisJCX0KIAl9CiAKIAkvKiBTZW5kIGJ1ZmZlciBvdmVyIGJlYXJlcnMgdW50aWwgYWxsIHRhcmdldHMgcmVhY2hlZCAqLwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmVhcmVyLmMgYi9uZXQvdGlwYy9iZWFyZXIuYwppbmRleCA4NTIwOWVhLi44NWViYTljIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iZWFyZXIuYworKysgYi9uZXQvdGlwYy9iZWFyZXIuYwpAQCAtNDAyLDcgKzQwMiw2IEBACiB2b2lkIHRpcGNfY29udGludWUoc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cikKIHsKIAlzcGluX2xvY2tfYmgoJmJfcHRyLT5sb2NrKTsKLQliX3B0ci0+Y29udGludWVfY291bnQrKzsKIAlpZiAoIWxpc3RfZW1wdHkoJmJfcHRyLT5jb25nX2xpbmtzKSkKIAkJdGlwY19rX3NpZ25hbCgoSGFuZGxlcil0aXBjX2JlYXJlcl9sb2NrX3B1c2gsICh1bnNpZ25lZCBsb25nKWJfcHRyKTsKIAliX3B0ci0+YmxvY2tlZCA9IDA7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuaCBiL25ldC90aXBjL2JlYXJlci5oCmluZGV4IDMxZDYxNzIuLjVhZDcwZWYgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JlYXJlci5oCisrKyBiL25ldC90aXBjL2JlYXJlci5oCkBAIC0xMDcsNyArMTA3LDYgQEAKICAqIEBsaW5rX3JlcTogcHRyIHRvIChvcHRpb25hbCkgc3RydWN0dXJlIG1ha2luZyBwZXJpb2RpYyBsaW5rIHNldHVwIHJlcXVlc3RzCiAgKiBAbGlua3M6IGxpc3Qgb2Ygbm9uLWNvbmdlc3RlZCBsaW5rcyBhc3NvY2lhdGVkIHdpdGggYmVhcmVyCiAgKiBAY29uZ19saW5rczogbGlzdCBvZiBjb25nZXN0ZWQgbGlua3MgYXNzb2NpYXRlZCB3aXRoIGJlYXJlcgotICogQGNvbnRpbnVlX2NvdW50OiAjIG9mIHRpbWVzIGJlYXJlciBoYXMgcmVzdW1lZCBhZnRlciBjb25nZXN0aW9uIG9yIGJsb2NraW5nCiAgKiBAYWN0aXZlOiBub24temVybyBpZiBiZWFyZXIgc3RydWN0dXJlIGlzIHJlcHJlc2VudHMgYSBiZWFyZXIKICAqIEBuZXRfcGxhbmU6IG5ldHdvcmsgcGxhbmUgKCdBJyB0aHJvdWdoICdIJykgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCBiZWFyZXIKICAqIEBub2RlczogaW5kaWNhdGVzIHdoaWNoIG5vZGVzIGluIGNsdXN0ZXIgY2FuIGJlIHJlYWNoZWQgdGhyb3VnaCBiZWFyZXIKQEAgLTEyOSw3ICsxMjgsNiBAQAogCXN0cnVjdCBsaW5rX3JlcSAqbGlua19yZXE7CiAJc3RydWN0IGxpc3RfaGVhZCBsaW5rczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNvbmdfbGlua3M7Ci0JdTMyIGNvbnRpbnVlX2NvdW50OwogCWludCBhY3RpdmU7CiAJY2hhciBuZXRfcGxhbmU7CiAJc3RydWN0IHRpcGNfbm9kZV9tYXAgbm9kZXM7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jb3JlLmggYi9uZXQvdGlwYy9jb3JlLmgKaW5kZXggNDM2ZGRhMS4uZDIzNGE5OCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvY29yZS5oCisrKyBiL25ldC90aXBjL2NvcmUuaApAQCAtNjIsMTIgKzYyLDYgQEAKIHN0cnVjdCBwcmludF9idWY7CS8qIGxvZy5oICovCiAKIC8qCi0gKiBUSVBDIHNhbml0eSB0ZXN0IG1hY3JvcwotICovCi0KLSNkZWZpbmUgYXNzZXJ0KGkpICBCVUdfT04oIShpKSkKLQotLyoKICAqIFRJUEMgc3lzdGVtIG1vbml0b3JpbmcgY29kZQogICovCiAKZGlmZiAtLWdpdCBhL25ldC90aXBjL2xpbmsuYyBiL25ldC90aXBjL2xpbmsuYwppbmRleCA1ZWQ0YjRmLi5mODk1NzBjIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9saW5rLmMKKysrIGIvbmV0L3RpcGMvbGluay5jCkBAIC0xNTcyLDcgKzE1NzIsNyBAQAogc3RhdGljIGludCBsaW5rX3JlY3ZfYnVmX3ZhbGlkYXRlKHN0cnVjdCBza19idWZmICpidWYpCiB7CiAJc3RhdGljIHUzMiBtaW5fZGF0YV9oZHJfc2l6ZVs4XSA9IHsKLQkJU0hPUlRfSF9TSVpFLCBNQ0FTVF9IX1NJWkUsIExPTkdfSF9TSVpFLCBESVJfTVNHX0hfU0laRSwKKwkJU0hPUlRfSF9TSVpFLCBNQ0FTVF9IX1NJWkUsIE5BTUVEX0hfU0laRSwgQkFTSUNfSF9TSVpFLAogCQlNQVhfSF9TSVpFLCBNQVhfSF9TSVpFLCBNQVhfSF9TSVpFLCBNQVhfSF9TSVpFCiAJCX07CiAKQEAgLTI1NTMsNyArMjU1Myw3IEBACiAJCXUzMiBtc2dfc3ogPSBtc2dfc2l6ZShpbXNnKTsKIAkJdTMyIGZyYWdtX3N6ID0gbXNnX2RhdGFfc3ooZnJhZ20pOwogCQl1MzIgZXhwX2ZyYWdtX2NudCA9IG1zZ19zei9mcmFnbV9zeiArICEhKG1zZ19zeiAlIGZyYWdtX3N6KTsKLQkJdTMyIG1heCA9ICBUSVBDX01BWF9VU0VSX01TR19TSVpFICsgTE9OR19IX1NJWkU7CisJCXUzMiBtYXggPSAgVElQQ19NQVhfVVNFUl9NU0dfU0laRSArIE5BTUVEX0hfU0laRTsKIAkJaWYgKG1zZ190eXBlKGltc2cpID09IFRJUENfTUNBU1RfTVNHKQogCQkJbWF4ID0gVElQQ19NQVhfVVNFUl9NU0dfU0laRSArIE1DQVNUX0hfU0laRTsKIAkJaWYgKG1zZ19zaXplKGltc2cpID4gbWF4KSB7CkBAIC0yODgyLDcgKzI4ODIsNyBAQAogCQlwcm9maWxlX3RvdGFsID0gMTsKIAl0aXBjX3ByaW50ZigmcGIsICIgIFRYIHByb2ZpbGUgc2FtcGxlOiV1IHBhY2tldHMgIGF2ZXJhZ2U6JXUgb2N0ZXRzXG4iCiAJCQkgIiAgMC02NDoldSUlIC0yNTY6JXUlJSAtMTAyNDoldSUlIC00MDk2OiV1JSUgIgotCQkJICItMTYzNTQ6JXUlJSAtMzI3Njg6JXUlJSAtNjYwMDA6JXUlJVxuIiwKKwkJCSAiLTE2Mzg0OiV1JSUgLTMyNzY4OiV1JSUgLTY2MDAwOiV1JSVcbiIsCiAJCSAgICBsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9jb3VudHMsCiAJCSAgICBsX3B0ci0+c3RhdHMubXNnX2xlbmd0aHNfdG90YWwgLyBwcm9maWxlX3RvdGFsLAogCQkgICAgcGVyY2VudChsX3B0ci0+c3RhdHMubXNnX2xlbmd0aF9wcm9maWxlWzBdLCBwcm9maWxlX3RvdGFsKSwKZGlmZiAtLWdpdCBhL25ldC90aXBjL21zZy5jIGIvbmV0L3RpcGMvbXNnLmMKaW5kZXggMDNlNTdiZi4uODNkNTA5NiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbXNnLmMKKysrIGIvbmV0L3RpcGMvbXNnLmMKQEAgLTYxLDEwICs2MSw4IEBACiAJbXNnX3NldF9zaXplKG0sIGhzaXplKTsKIAltc2dfc2V0X3ByZXZub2RlKG0sIHRpcGNfb3duX2FkZHIpOwogCW1zZ19zZXRfdHlwZShtLCB0eXBlKTsKLQlpZiAoIW1zZ19zaG9ydChtKSkgewotCQltc2dfc2V0X29yaWdub2RlKG0sIHRpcGNfb3duX2FkZHIpOwotCQltc2dfc2V0X2Rlc3Rub2RlKG0sIGRlc3Rub2RlKTsKLQl9CisJbXNnX3NldF9vcmlnbm9kZShtLCB0aXBjX293bl9hZGRyKTsKKwltc2dfc2V0X2Rlc3Rub2RlKG0sIGRlc3Rub2RlKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9tc2cuaCBiL25ldC90aXBjL21zZy5oCmluZGV4IDg0NTI0NTQuLmQ5MzE3OGYgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL21zZy5oCisrKyBiL25ldC90aXBjL21zZy5oCkBAIC02OCwxMCArNjgsMTAgQEAKICAqIE1lc3NhZ2UgaGVhZGVyIHNpemVzCiAgKi8KIAotI2RlZmluZSBTSE9SVF9IX1NJWkUgICAgICAgICAgICAgIDI0CS8qIENvbm5lY3RlZCwgaW4tY2x1c3RlciBtZXNzYWdlcyAqLwotI2RlZmluZSBESVJfTVNHX0hfU0laRSAgICAgICAgICAgIDMyCS8qIERpcmVjdGx5IGFkZHJlc3NlZCBtZXNzYWdlcyAqLwotI2RlZmluZSBMT05HX0hfU0laRSAgICAgICAgICAgICAgIDQwCS8qIE5hbWVkIG1lc3NhZ2VzICovCi0jZGVmaW5lIE1DQVNUX0hfU0laRSAgICAgICAgICAgICAgNDQJLyogTXVsdGljYXN0IG1lc3NhZ2VzICovCisjZGVmaW5lIFNIT1JUX0hfU0laRSAgICAgICAgICAgICAgMjQJLyogSW4tY2x1c3RlciBiYXNpYyBwYXlsb2FkIG1lc3NhZ2UgKi8KKyNkZWZpbmUgQkFTSUNfSF9TSVpFICAgICAgICAgICAgICAzMgkvKiBCYXNpYyBwYXlsb2FkIG1lc3NhZ2UgKi8KKyNkZWZpbmUgTkFNRURfSF9TSVpFICAgICAgICAgICAgICA0MAkvKiBOYW1lZCBwYXlsb2FkIG1lc3NhZ2UgKi8KKyNkZWZpbmUgTUNBU1RfSF9TSVpFICAgICAgICAgICAgICA0NAkvKiBNdWx0aWNhc3QgcGF5bG9hZCBtZXNzYWdlICovCiAjZGVmaW5lIElOVF9IX1NJWkUgICAgICAgICAgICAgICAgNDAJLyogSW50ZXJuYWwgbWVzc2FnZXMgKi8KICNkZWZpbmUgTUlOX0hfU0laRSAgICAgICAgICAgICAgICAyNAkvKiBTbWFsbGVzdCBsZWdhbCBUSVBDIGhlYWRlciBzaXplICovCiAjZGVmaW5lIE1BWF9IX1NJWkUgICAgICAgICAgICAgICAgNjAJLyogTGFyZ2VzdCBwb3NzaWJsZSBUSVBDIGhlYWRlciBzaXplICovCkBAIC0zMTEsMjYgKzMxMSw2IEBACiB9CiAKIC8qCi0gKiBUSVBDIG1heSB1dGlsaXplIHRoZSAibGluayBhY2sgIyIgYW5kICJsaW5rIHNlcSAjIiBmaWVsZHMgb2YgYSBzaG9ydAotICogbWVzc2FnZSBoZWFkZXIgdG8gaG9sZCB0aGUgZGVzdGluYXRpb24gbm9kZSBmb3IgdGhlIG1lc3NhZ2UsIHNpbmNlIHRoZQotICogbm9ybWFsICJkZXN0IG5vZGUiIGZpZWxkIGlzbid0IHByZXNlbnQuICBUaGlzIGNhY2hlIGlzIG9ubHkgcmVmZXJlbmNlZAotICogd2hlbiByZXF1aXJlZCwgc28gcG9wdWxhdGluZyB0aGUgY2FjaGUgb2YgYSBsb25nZXIgbWVzc2FnZSBoZWFkZXIgaXMKLSAqIGhhcm1sZXNzIChhcyBsb25nIGFzIHRoZSBoZWFkZXIgaGFzIHRoZSB0d28gbGluayBzZXF1ZW5jZSBmaWVsZHMgcHJlc2VudCkuCi0gKgotICogTm90ZTogSG9zdCBieXRlIG9yZGVyIGlzIE9LIGhlcmUsIHNpbmNlIHRoZSBpbmZvIG5ldmVyIGdvZXMgb2ZmLWNhcmQuCi0gKi8KLQotc3RhdGljIGlubGluZSB1MzIgbXNnX2Rlc3Rub2RlX2NhY2hlKHN0cnVjdCB0aXBjX21zZyAqbSkKLXsKLQlyZXR1cm4gbS0+aGRyWzJdOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9kZXN0bm9kZV9jYWNoZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBkbm9kZSkKLXsKLQltLT5oZHJbMl0gPSBkbm9kZTsKLX0KLQotLyoKICAqIFdvcmRzIDMtMTAKICAqLwogCkBAIC0zNzcsNyArMzU3LDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgbXNnX3Nob3J0KHN0cnVjdCB0aXBjX21zZyAqbSkKIHsKLQlyZXR1cm4gbXNnX2hkcl9zeihtKSA9PSAyNDsKKwlyZXR1cm4gbXNnX2hkcl9zeihtKSA9PSBTSE9SVF9IX1NJWkU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIG1zZ19vcmlnbm9kZShzdHJ1Y3QgdGlwY19tc2cgKm0pCkBAIC02MzUsNyArNjE1LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbGlua19zZWxlY3RvcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBuKQogewotCW1zZ19zZXRfYml0cyhtLCA0LCAwLCAxLCAobiAmIDEpKTsKKwltc2dfc2V0X2JpdHMobSwgNCwgMCwgMSwgbik7CiB9CiAKIC8qCkBAIC02NTksNyArNjM5LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfcHJvYmUoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgdmFsKQogewotCW1zZ19zZXRfYml0cyhtLCA1LCAwLCAxLCAodmFsICYgMSkpOworCW1zZ19zZXRfYml0cyhtLCA1LCAwLCAxLCB2YWwpOwogfQogCiBzdGF0aWMgaW5saW5lIGNoYXIgbXNnX25ldF9wbGFuZShzdHJ1Y3QgdGlwY19tc2cgKm0pCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMgYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKaW5kZXggODAwMjVhMS4uY2QzNTZlNSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCisrKyBiL25ldC90aXBjL25hbWVfZGlzdHIuYwpAQCAtOTQsMTMgKzk0LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbmFtZWRfcHJlcGFyZV9idWYodTMyIHR5cGUsIHUzMiBzaXplLCB1MzIgZGVzdCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gdGlwY19idWZfYWNxdWlyZShMT05HX0hfU0laRSArIHNpemUpOworCXN0cnVjdCBza19idWZmICpidWYgPSB0aXBjX2J1Zl9hY3F1aXJlKElOVF9IX1NJWkUgKyBzaXplKTsKIAlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKIAogCWlmIChidWYgIT0gTlVMTCkgewogCQltc2cgPSBidWZfbXNnKGJ1Zik7Ci0JCXRpcGNfbXNnX2luaXQobXNnLCBOQU1FX0RJU1RSSUJVVE9SLCB0eXBlLCBMT05HX0hfU0laRSwgZGVzdCk7Ci0JCW1zZ19zZXRfc2l6ZShtc2csIExPTkdfSF9TSVpFICsgc2l6ZSk7CisJCXRpcGNfbXNnX2luaXQobXNnLCBOQU1FX0RJU1RSSUJVVE9SLCB0eXBlLCBJTlRfSF9TSVpFLCBkZXN0KTsKKwkJbXNnX3NldF9zaXplKG1zZywgSU5UX0hfU0laRSArIHNpemUpOwogCX0KIAlyZXR1cm4gYnVmOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmFtZV90YWJsZS5jIGIvbmV0L3RpcGMvbmFtZV90YWJsZS5jCmluZGV4IDIwNWVkNGEuLjQ2ZTZiNmMgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25hbWVfdGFibGUuYworKysgYi9uZXQvdGlwYy9uYW1lX3RhYmxlLmMKQEAgLTIsNyArMiw3IEBACiAgKiBuZXQvdGlwYy9uYW1lX3RhYmxlLmM6IFRJUEMgbmFtZSB0YWJsZSBjb2RlCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCwgMjAxMC0yMDExLCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00NCw5ICs0NCw3IEBACiBzdGF0aWMgaW50IHRpcGNfbmFtZXRibF9zaXplID0gMTAyNDsJCS8qIG11c3QgYmUgYSBwb3dlciBvZiAyICovCiAKIC8qKgotICogc3RydWN0IHN1Yl9zZXEgLSBjb250YWluZXIgZm9yIGFsbCBwdWJsaXNoZWQgaW5zdGFuY2VzIG9mIGEgbmFtZSBzZXF1ZW5jZQotICogQGxvd2VyOiBuYW1lIHNlcXVlbmNlIGxvd2VyIGJvdW5kCi0gKiBAdXBwZXI6IG5hbWUgc2VxdWVuY2UgdXBwZXIgYm91bmQKKyAqIHN0cnVjdCBuYW1lX2luZm8gLSBuYW1lIHNlcXVlbmNlIHB1YmxpY2F0aW9uIGluZm8KICAqIEBub2RlX2xpc3Q6IGNpcmN1bGFyIGxpc3Qgb2YgcHVibGljYXRpb25zIG1hZGUgYnkgb3duIG5vZGUKICAqIEBjbHVzdGVyX2xpc3Q6IGNpcmN1bGFyIGxpc3Qgb2YgcHVibGljYXRpb25zIG1hZGUgYnkgb3duIGNsdXN0ZXIKICAqIEB6b25lX2xpc3Q6IGNpcmN1bGFyIGxpc3Qgb2YgcHVibGljYXRpb25zIG1hZGUgYnkgb3duIHpvbmUKQEAgLTU5LDE4ICs1NywyOSBAQAogICogICAgICAgKFRoZSBjbHVzdGVyIGFuZCBub2RlIGxpc3RzIG1heSBiZSBlbXB0eS4pCiAgKi8KIAotc3RydWN0IHN1Yl9zZXEgewotCXUzMiBsb3dlcjsKLQl1MzIgdXBwZXI7Ci0Jc3RydWN0IHB1YmxpY2F0aW9uICpub2RlX2xpc3Q7Ci0Jc3RydWN0IHB1YmxpY2F0aW9uICpjbHVzdGVyX2xpc3Q7Ci0Jc3RydWN0IHB1YmxpY2F0aW9uICp6b25lX2xpc3Q7CitzdHJ1Y3QgbmFtZV9pbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNsdXN0ZXJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHpvbmVfbGlzdDsKIAl1MzIgbm9kZV9saXN0X3NpemU7CiAJdTMyIGNsdXN0ZXJfbGlzdF9zaXplOwogCXUzMiB6b25lX2xpc3Rfc2l6ZTsKIH07CiAKIC8qKgorICogc3RydWN0IHN1Yl9zZXEgLSBjb250YWluZXIgZm9yIGFsbCBwdWJsaXNoZWQgaW5zdGFuY2VzIG9mIGEgbmFtZSBzZXF1ZW5jZQorICogQGxvd2VyOiBuYW1lIHNlcXVlbmNlIGxvd2VyIGJvdW5kCisgKiBAdXBwZXI6IG5hbWUgc2VxdWVuY2UgdXBwZXIgYm91bmQKKyAqIEBpbmZvOiBwb2ludGVyIHRvIG5hbWUgc2VxdWVuY2UgcHVibGljYXRpb24gaW5mbworICovCisKK3N0cnVjdCBzdWJfc2VxIHsKKwl1MzIgbG93ZXI7CisJdTMyIHVwcGVyOworCXN0cnVjdCBuYW1lX2luZm8gKmluZm87Cit9OworCisvKioKICAqIHN0cnVjdCBuYW1lX3NlcSAtIGNvbnRhaW5lciBmb3IgYWxsIHB1Ymxpc2hlZCBpbnN0YW5jZXMgb2YgYSBuYW1lIHR5cGUKICAqIEB0eXBlOiAzMiBiaXQgJ3R5cGUnIHZhbHVlIGZvciBuYW1lIHNlcXVlbmNlCiAgKiBAc3NlcTogcG9pbnRlciB0byBkeW5hbWljYWxseS1zaXplZCBhcnJheSBvZiBzdWItc2VxdWVuY2VzIG9mIHRoaXMgJ3R5cGUnOwpAQCAtMjQ2LDYgKzI1NSw3IEBACiAJc3RydWN0IHN1YnNjcmlwdGlvbiAqc3Q7CiAJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOwogCXN0cnVjdCBzdWJfc2VxICpzc2VxOworCXN0cnVjdCBuYW1lX2luZm8gKmluZm87CiAJaW50IGNyZWF0ZWRfc3Vic2VxID0gMDsKIAogCXNzZXEgPSBuYW1lc2VxX2ZpbmRfc3Vic2VxKG5zZXEsIGxvd2VyKTsKQEAgLTI1OCw2ICsyNjgsOCBAQAogCQkJICAgICB0eXBlLCBsb3dlciwgdXBwZXIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KKworCQlpbmZvID0gc3NlcS0+aW5mbzsKIAl9IGVsc2UgewogCQl1MzIgaW5zcG9zOwogCQlzdHJ1Y3Qgc3ViX3NlcSAqZnJlZXNzZXE7CkBAIC0yOTIsNiArMzA0LDE3IEBACiAJCQluc2VxLT5hbGxvYyAqPSAyOwogCQl9CiAKKwkJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0FUT01JQyk7CisJCWlmICghaW5mbykgeworCQkJd2FybigiQ2Fubm90IHB1Ymxpc2ggeyV1LCV1LCV1fSwgbm8gbWVtb3J5XG4iLAorCQkJICAgICB0eXBlLCBsb3dlciwgdXBwZXIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlJTklUX0xJU1RfSEVBRCgmaW5mby0+bm9kZV9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmluZm8tPmNsdXN0ZXJfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZpbmZvLT56b25lX2xpc3QpOworCiAJCS8qIEluc2VydCBuZXcgc3ViLXNlcXVlbmNlICovCiAKIAkJc3NlcSA9ICZuc2VxLT5zc2Vxc1tpbnNwb3NdOwpAQCAtMzAxLDYgKzMyNCw3IEBACiAJCW5zZXEtPmZpcnN0X2ZyZWUrKzsKIAkJc3NlcS0+bG93ZXIgPSBsb3dlcjsKIAkJc3NlcS0+dXBwZXIgPSB1cHBlcjsKKwkJc3NlcS0+aW5mbyA9IGluZm87CiAJCWNyZWF0ZWRfc3Vic2VxID0gMTsKIAl9CiAKQEAgLTMxMCwzMyArMzM0LDE3IEBACiAJaWYgKCFwdWJsKQogCQlyZXR1cm4gTlVMTDsKIAotCXNzZXEtPnpvbmVfbGlzdF9zaXplKys7Ci0JaWYgKCFzc2VxLT56b25lX2xpc3QpCi0JCXNzZXEtPnpvbmVfbGlzdCA9IHB1YmwtPnpvbmVfbGlzdF9uZXh0ID0gcHVibDsKLQllbHNlIHsKLQkJcHVibC0+em9uZV9saXN0X25leHQgPSBzc2VxLT56b25lX2xpc3QtPnpvbmVfbGlzdF9uZXh0OwotCQlzc2VxLT56b25lX2xpc3QtPnpvbmVfbGlzdF9uZXh0ID0gcHVibDsKLQl9CisJbGlzdF9hZGQoJnB1YmwtPnpvbmVfbGlzdCwgJmluZm8tPnpvbmVfbGlzdCk7CisJaW5mby0+em9uZV9saXN0X3NpemUrKzsKIAogCWlmIChpbl9vd25fY2x1c3Rlcihub2RlKSkgewotCQlzc2VxLT5jbHVzdGVyX2xpc3Rfc2l6ZSsrOwotCQlpZiAoIXNzZXEtPmNsdXN0ZXJfbGlzdCkKLQkJCXNzZXEtPmNsdXN0ZXJfbGlzdCA9IHB1YmwtPmNsdXN0ZXJfbGlzdF9uZXh0ID0gcHVibDsKLQkJZWxzZSB7Ci0JCQlwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dCA9Ci0JCQlzc2VxLT5jbHVzdGVyX2xpc3QtPmNsdXN0ZXJfbGlzdF9uZXh0OwotCQkJc3NlcS0+Y2x1c3Rlcl9saXN0LT5jbHVzdGVyX2xpc3RfbmV4dCA9IHB1Ymw7Ci0JCX0KKwkJbGlzdF9hZGQoJnB1YmwtPmNsdXN0ZXJfbGlzdCwgJmluZm8tPmNsdXN0ZXJfbGlzdCk7CisJCWluZm8tPmNsdXN0ZXJfbGlzdF9zaXplKys7CiAJfQogCiAJaWYgKG5vZGUgPT0gdGlwY19vd25fYWRkcikgewotCQlzc2VxLT5ub2RlX2xpc3Rfc2l6ZSsrOwotCQlpZiAoIXNzZXEtPm5vZGVfbGlzdCkKLQkJCXNzZXEtPm5vZGVfbGlzdCA9IHB1YmwtPm5vZGVfbGlzdF9uZXh0ID0gcHVibDsKLQkJZWxzZSB7Ci0JCQlwdWJsLT5ub2RlX2xpc3RfbmV4dCA9IHNzZXEtPm5vZGVfbGlzdC0+bm9kZV9saXN0X25leHQ7Ci0JCQlzc2VxLT5ub2RlX2xpc3QtPm5vZGVfbGlzdF9uZXh0ID0gcHVibDsKLQkJfQorCQlsaXN0X2FkZCgmcHVibC0+bm9kZV9saXN0LCAmaW5mby0+bm9kZV9saXN0KTsKKwkJaW5mby0+bm9kZV9saXN0X3NpemUrKzsKIAl9CiAKIAkvKgpAQCAtMzcwLDkgKzM3OCw4IEBACiAJCQkJCQkgICAgdTMyIG5vZGUsIHUzMiByZWYsIHUzMiBrZXkpCiB7CiAJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOwotCXN0cnVjdCBwdWJsaWNhdGlvbiAqY3VycjsKLQlzdHJ1Y3QgcHVibGljYXRpb24gKnByZXY7CiAJc3RydWN0IHN1Yl9zZXEgKnNzZXEgPSBuYW1lc2VxX2ZpbmRfc3Vic2VxKG5zZXEsIGluc3QpOworCXN0cnVjdCBuYW1lX2luZm8gKmluZm87CiAJc3RydWN0IHN1Yl9zZXEgKmZyZWU7CiAJc3RydWN0IHN1YnNjcmlwdGlvbiAqcywgKnN0OwogCWludCByZW1vdmVkX3N1YnNlcSA9IDA7CkBAIC0zODAsOTYgKzM4Nyw0MSBAQAogCWlmICghc3NlcSkKIAkJcmV0dXJuIE5VTEw7CiAKKwlpbmZvID0gc3NlcS0+aW5mbzsKKworCS8qIExvY2F0ZSBwdWJsaWNhdGlvbiwgaWYgaXQgZXhpc3RzICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB1YmwsICZpbmZvLT56b25lX2xpc3QsIHpvbmVfbGlzdCkgeworCQlpZiAoKHB1YmwtPmtleSA9PSBrZXkpICYmIChwdWJsLT5yZWYgPT0gcmVmKSAmJgorCQkgICAgKCFwdWJsLT5ub2RlIHx8IChwdWJsLT5ub2RlID09IG5vZGUpKSkKKwkJCWdvdG8gZm91bmQ7CisJfQorCXJldHVybiBOVUxMOworCitmb3VuZDoKIAkvKiBSZW1vdmUgcHVibGljYXRpb24gZnJvbSB6b25lIHNjb3BlIGxpc3QgKi8KIAotCXByZXYgPSBzc2VxLT56b25lX2xpc3Q7Ci0JcHVibCA9IHNzZXEtPnpvbmVfbGlzdC0+em9uZV9saXN0X25leHQ7Ci0Jd2hpbGUgKChwdWJsLT5rZXkgIT0ga2V5KSB8fCAocHVibC0+cmVmICE9IHJlZikgfHwKLQkgICAgICAgKHB1YmwtPm5vZGUgJiYgKHB1YmwtPm5vZGUgIT0gbm9kZSkpKSB7Ci0JCXByZXYgPSBwdWJsOwotCQlwdWJsID0gcHVibC0+em9uZV9saXN0X25leHQ7Ci0JCWlmIChwcmV2ID09IHNzZXEtPnpvbmVfbGlzdCkgewotCi0JCQkvKiBQcmV2ZW50IGVuZGxlc3MgbG9vcCBpZiBwdWJsaWNhdGlvbiBub3QgZm91bmQgKi8KLQotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKHB1YmwgIT0gc3NlcS0+em9uZV9saXN0KQotCQlwcmV2LT56b25lX2xpc3RfbmV4dCA9IHB1YmwtPnpvbmVfbGlzdF9uZXh0OwotCWVsc2UgaWYgKHB1YmwtPnpvbmVfbGlzdF9uZXh0ICE9IHB1YmwpIHsKLQkJcHJldi0+em9uZV9saXN0X25leHQgPSBwdWJsLT56b25lX2xpc3RfbmV4dDsKLQkJc3NlcS0+em9uZV9saXN0ID0gcHVibC0+em9uZV9saXN0X25leHQ7Ci0JfSBlbHNlIHsKLQkJc3NlcS0+em9uZV9saXN0ID0gTlVMTDsKLQl9Ci0Jc3NlcS0+em9uZV9saXN0X3NpemUtLTsKKwlsaXN0X2RlbCgmcHVibC0+em9uZV9saXN0KTsKKwlpbmZvLT56b25lX2xpc3Rfc2l6ZS0tOwogCiAJLyogUmVtb3ZlIHB1YmxpY2F0aW9uIGZyb20gY2x1c3RlciBzY29wZSBsaXN0LCBpZiBwcmVzZW50ICovCiAKIAlpZiAoaW5fb3duX2NsdXN0ZXIobm9kZSkpIHsKLQkJcHJldiA9IHNzZXEtPmNsdXN0ZXJfbGlzdDsKLQkJY3VyciA9IHNzZXEtPmNsdXN0ZXJfbGlzdC0+Y2x1c3Rlcl9saXN0X25leHQ7Ci0JCXdoaWxlIChjdXJyICE9IHB1YmwpIHsKLQkJCXByZXYgPSBjdXJyOwotCQkJY3VyciA9IGN1cnItPmNsdXN0ZXJfbGlzdF9uZXh0OwotCQkJaWYgKHByZXYgPT0gc3NlcS0+Y2x1c3Rlcl9saXN0KSB7Ci0KLQkJCQkvKiBQcmV2ZW50IGVuZGxlc3MgbG9vcCBmb3IgbWFsZm9ybWVkIGxpc3QgKi8KLQotCQkJCWVycigiVW5hYmxlIHRvIGRlLWxpc3QgY2x1c3RlciBwdWJsaWNhdGlvblxuIgotCQkJCSAgICAieyV1JXV9LCBub2RlPTB4JXgsIHJlZj0ldSwga2V5PSV1KVxuIiwKLQkJCQkgICAgcHVibC0+dHlwZSwgcHVibC0+bG93ZXIsIHB1YmwtPm5vZGUsCi0JCQkJICAgIHB1YmwtPnJlZiwgcHVibC0+a2V5KTsKLQkJCQlnb3RvIGVuZF9jbHVzdGVyOwotCQkJfQotCQl9Ci0JCWlmIChwdWJsICE9IHNzZXEtPmNsdXN0ZXJfbGlzdCkKLQkJCXByZXYtPmNsdXN0ZXJfbGlzdF9uZXh0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7Ci0JCWVsc2UgaWYgKHB1YmwtPmNsdXN0ZXJfbGlzdF9uZXh0ICE9IHB1YmwpIHsKLQkJCXByZXYtPmNsdXN0ZXJfbGlzdF9uZXh0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7Ci0JCQlzc2VxLT5jbHVzdGVyX2xpc3QgPSBwdWJsLT5jbHVzdGVyX2xpc3RfbmV4dDsKLQkJfSBlbHNlIHsKLQkJCXNzZXEtPmNsdXN0ZXJfbGlzdCA9IE5VTEw7Ci0JCX0KLQkJc3NlcS0+Y2x1c3Rlcl9saXN0X3NpemUtLTsKKwkJbGlzdF9kZWwoJnB1YmwtPmNsdXN0ZXJfbGlzdCk7CisJCWluZm8tPmNsdXN0ZXJfbGlzdF9zaXplLS07CiAJfQotZW5kX2NsdXN0ZXI6CiAKIAkvKiBSZW1vdmUgcHVibGljYXRpb24gZnJvbSBub2RlIHNjb3BlIGxpc3QsIGlmIHByZXNlbnQgKi8KIAogCWlmIChub2RlID09IHRpcGNfb3duX2FkZHIpIHsKLQkJcHJldiA9IHNzZXEtPm5vZGVfbGlzdDsKLQkJY3VyciA9IHNzZXEtPm5vZGVfbGlzdC0+bm9kZV9saXN0X25leHQ7Ci0JCXdoaWxlIChjdXJyICE9IHB1YmwpIHsKLQkJCXByZXYgPSBjdXJyOwotCQkJY3VyciA9IGN1cnItPm5vZGVfbGlzdF9uZXh0OwotCQkJaWYgKHByZXYgPT0gc3NlcS0+bm9kZV9saXN0KSB7Ci0KLQkJCQkvKiBQcmV2ZW50IGVuZGxlc3MgbG9vcCBmb3IgbWFsZm9ybWVkIGxpc3QgKi8KLQotCQkJCWVycigiVW5hYmxlIHRvIGRlLWxpc3Qgbm9kZSBwdWJsaWNhdGlvblxuIgotCQkJCSAgICAieyV1JXV9LCBub2RlPTB4JXgsIHJlZj0ldSwga2V5PSV1KVxuIiwKLQkJCQkgICAgcHVibC0+dHlwZSwgcHVibC0+bG93ZXIsIHB1YmwtPm5vZGUsCi0JCQkJICAgIHB1YmwtPnJlZiwgcHVibC0+a2V5KTsKLQkJCQlnb3RvIGVuZF9ub2RlOwotCQkJfQotCQl9Ci0JCWlmIChwdWJsICE9IHNzZXEtPm5vZGVfbGlzdCkKLQkJCXByZXYtPm5vZGVfbGlzdF9uZXh0ID0gcHVibC0+bm9kZV9saXN0X25leHQ7Ci0JCWVsc2UgaWYgKHB1YmwtPm5vZGVfbGlzdF9uZXh0ICE9IHB1YmwpIHsKLQkJCXByZXYtPm5vZGVfbGlzdF9uZXh0ID0gcHVibC0+bm9kZV9saXN0X25leHQ7Ci0JCQlzc2VxLT5ub2RlX2xpc3QgPSBwdWJsLT5ub2RlX2xpc3RfbmV4dDsKLQkJfSBlbHNlIHsKLQkJCXNzZXEtPm5vZGVfbGlzdCA9IE5VTEw7Ci0JCX0KLQkJc3NlcS0+bm9kZV9saXN0X3NpemUtLTsKKwkJbGlzdF9kZWwoJnB1YmwtPm5vZGVfbGlzdCk7CisJCWluZm8tPm5vZGVfbGlzdF9zaXplLS07CiAJfQotZW5kX25vZGU6CiAKIAkvKiBDb250cmFjdCBzdWJzZXEgbGlzdCBpZiBubyBtb3JlIHB1YmxpY2F0aW9ucyBmb3IgdGhhdCBzdWJzZXEgKi8KIAotCWlmICghc3NlcS0+em9uZV9saXN0KSB7CisJaWYgKGxpc3RfZW1wdHkoJmluZm8tPnpvbmVfbGlzdCkpIHsKKwkJa2ZyZWUoaW5mbyk7CiAJCWZyZWUgPSAmbnNlcS0+c3NlcXNbbnNlcS0+Zmlyc3RfZnJlZS0tXTsKIAkJbWVtbW92ZShzc2VxLCBzc2VxICsgMSwgKGZyZWUgLSAoc3NlcSArIDEpKSAqIHNpemVvZigqc3NlcSkpOwogCQlyZW1vdmVkX3N1YnNlcSA9IDE7CkBAIC01MDYsMTIgKzQ1OCwxMiBAQAogCQlyZXR1cm47CiAKIAl3aGlsZSAoc3NlcSAhPSAmbnNlcS0+c3NlcXNbbnNlcS0+Zmlyc3RfZnJlZV0pIHsKLQkJc3RydWN0IHB1YmxpY2F0aW9uICp6bCA9IHNzZXEtPnpvbmVfbGlzdDsKLQkJaWYgKHpsICYmIHRpcGNfc3Vic2NyX292ZXJsYXAocywgc3NlcS0+bG93ZXIsIHNzZXEtPnVwcGVyKSkgewotCQkJc3RydWN0IHB1YmxpY2F0aW9uICpjcnMgPSB6bDsKKwkJaWYgKHRpcGNfc3Vic2NyX292ZXJsYXAocywgc3NlcS0+bG93ZXIsIHNzZXEtPnVwcGVyKSkgeworCQkJc3RydWN0IHB1YmxpY2F0aW9uICpjcnM7CisJCQlzdHJ1Y3QgbmFtZV9pbmZvICppbmZvID0gc3NlcS0+aW5mbzsKIAkJCWludCBtdXN0X3JlcG9ydCA9IDE7CiAKLQkJCWRvIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3JzLCAmaW5mby0+em9uZV9saXN0LCB6b25lX2xpc3QpIHsKIAkJCQl0aXBjX3N1YnNjcl9yZXBvcnRfb3ZlcmxhcChzLAogCQkJCQkJCSAgIHNzZXEtPmxvd2VyLAogCQkJCQkJCSAgIHNzZXEtPnVwcGVyLApAQCAtNTIwLDggKzQ3Miw3IEBACiAJCQkJCQkJICAgY3JzLT5ub2RlLAogCQkJCQkJCSAgIG11c3RfcmVwb3J0KTsKIAkJCQltdXN0X3JlcG9ydCA9IDA7Ci0JCQkJY3JzID0gY3JzLT56b25lX2xpc3RfbmV4dDsKLQkJCX0gd2hpbGUgKGNycyAhPSB6bCk7CisJCQl9CiAJCX0KIAkJc3NlcSsrOwogCX0KQEAgLTU5MSw5ICs1NDIsMTAgQEAKIHUzMiB0aXBjX25hbWV0YmxfdHJhbnNsYXRlKHUzMiB0eXBlLCB1MzIgaW5zdGFuY2UsIHUzMiAqZGVzdG5vZGUpCiB7CiAJc3RydWN0IHN1Yl9zZXEgKnNzZXE7Ci0Jc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsID0gTlVMTDsKKwlzdHJ1Y3QgbmFtZV9pbmZvICppbmZvOworCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKIAlzdHJ1Y3QgbmFtZV9zZXEgKnNlcTsKLQl1MzIgcmVmOworCXUzMiByZWYgPSAwOwogCiAJaWYgKCF0aXBjX2luX3Njb3BlKCpkZXN0bm9kZSwgdGlwY19vd25fYWRkcikpCiAJCXJldHVybiAwOwpAQCAtNjA2LDU1ICs1NTgsNTcgQEAKIAlpZiAodW5saWtlbHkoIXNzZXEpKQogCQlnb3RvIG5vdF9mb3VuZDsKIAlzcGluX2xvY2tfYmgoJnNlcS0+bG9jayk7CisJaW5mbyA9IHNzZXEtPmluZm87CiAKIAkvKiBDbG9zZXN0LUZpcnN0IEFsZ29yaXRobTogKi8KIAlpZiAobGlrZWx5KCEqZGVzdG5vZGUpKSB7Ci0JCXB1YmwgPSBzc2VxLT5ub2RlX2xpc3Q7Ci0JCWlmIChwdWJsKSB7Ci0JCQlzc2VxLT5ub2RlX2xpc3QgPSBwdWJsLT5ub2RlX2xpc3RfbmV4dDsKLWZvdW5kOgotCQkJcmVmID0gcHVibC0+cmVmOwotCQkJKmRlc3Rub2RlID0gcHVibC0+bm9kZTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZzZXEtPmxvY2spOwotCQkJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmFtZXRibF9sb2NrKTsKLQkJCXJldHVybiByZWY7Ci0JCX0KLQkJcHVibCA9IHNzZXEtPmNsdXN0ZXJfbGlzdDsKLQkJaWYgKHB1YmwpIHsKLQkJCXNzZXEtPmNsdXN0ZXJfbGlzdCA9IHB1YmwtPmNsdXN0ZXJfbGlzdF9uZXh0OwotCQkJZ290byBmb3VuZDsKLQkJfQotCQlwdWJsID0gc3NlcS0+em9uZV9saXN0OwotCQlpZiAocHVibCkgewotCQkJc3NlcS0+em9uZV9saXN0ID0gcHVibC0+em9uZV9saXN0X25leHQ7Ci0JCQlnb3RvIGZvdW5kOworCQlpZiAoIWxpc3RfZW1wdHkoJmluZm8tPm5vZGVfbGlzdCkpIHsKKwkJCXB1YmwgPSBsaXN0X2ZpcnN0X2VudHJ5KCZpbmZvLT5ub2RlX2xpc3QsCisJCQkJCQlzdHJ1Y3QgcHVibGljYXRpb24sCisJCQkJCQlub2RlX2xpc3QpOworCQkJbGlzdF9tb3ZlX3RhaWwoJnB1YmwtPm5vZGVfbGlzdCwKKwkJCQkgICAgICAgJmluZm8tPm5vZGVfbGlzdCk7CisJCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmluZm8tPmNsdXN0ZXJfbGlzdCkpIHsKKwkJCXB1YmwgPSBsaXN0X2ZpcnN0X2VudHJ5KCZpbmZvLT5jbHVzdGVyX2xpc3QsCisJCQkJCQlzdHJ1Y3QgcHVibGljYXRpb24sCisJCQkJCQljbHVzdGVyX2xpc3QpOworCQkJbGlzdF9tb3ZlX3RhaWwoJnB1YmwtPmNsdXN0ZXJfbGlzdCwKKwkJCQkgICAgICAgJmluZm8tPmNsdXN0ZXJfbGlzdCk7CisJCX0gZWxzZSB7CisJCQlwdWJsID0gbGlzdF9maXJzdF9lbnRyeSgmaW5mby0+em9uZV9saXN0LAorCQkJCQkJc3RydWN0IHB1YmxpY2F0aW9uLAorCQkJCQkJem9uZV9saXN0KTsKKwkJCWxpc3RfbW92ZV90YWlsKCZwdWJsLT56b25lX2xpc3QsCisJCQkJICAgICAgICZpbmZvLT56b25lX2xpc3QpOwogCQl9CiAJfQogCiAJLyogUm91bmQtUm9iaW4gQWxnb3JpdGhtOiAqLwogCWVsc2UgaWYgKCpkZXN0bm9kZSA9PSB0aXBjX293bl9hZGRyKSB7Ci0JCXB1YmwgPSBzc2VxLT5ub2RlX2xpc3Q7Ci0JCWlmIChwdWJsKSB7Ci0JCQlzc2VxLT5ub2RlX2xpc3QgPSBwdWJsLT5ub2RlX2xpc3RfbmV4dDsKLQkJCWdvdG8gZm91bmQ7Ci0JCX0KKwkJaWYgKGxpc3RfZW1wdHkoJmluZm8tPm5vZGVfbGlzdCkpCisJCQlnb3RvIG5vX21hdGNoOworCQlwdWJsID0gbGlzdF9maXJzdF9lbnRyeSgmaW5mby0+bm9kZV9saXN0LCBzdHJ1Y3QgcHVibGljYXRpb24sCisJCQkJCW5vZGVfbGlzdCk7CisJCWxpc3RfbW92ZV90YWlsKCZwdWJsLT5ub2RlX2xpc3QsICZpbmZvLT5ub2RlX2xpc3QpOwogCX0gZWxzZSBpZiAoaW5fb3duX2NsdXN0ZXIoKmRlc3Rub2RlKSkgewotCQlwdWJsID0gc3NlcS0+Y2x1c3Rlcl9saXN0OwotCQlpZiAocHVibCkgewotCQkJc3NlcS0+Y2x1c3Rlcl9saXN0ID0gcHVibC0+Y2x1c3Rlcl9saXN0X25leHQ7Ci0JCQlnb3RvIGZvdW5kOwotCQl9CisJCWlmIChsaXN0X2VtcHR5KCZpbmZvLT5jbHVzdGVyX2xpc3QpKQorCQkJZ290byBub19tYXRjaDsKKwkJcHVibCA9IGxpc3RfZmlyc3RfZW50cnkoJmluZm8tPmNsdXN0ZXJfbGlzdCwgc3RydWN0IHB1YmxpY2F0aW9uLAorCQkJCQljbHVzdGVyX2xpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmcHVibC0+Y2x1c3Rlcl9saXN0LCAmaW5mby0+Y2x1c3Rlcl9saXN0KTsKIAl9IGVsc2UgewotCQlwdWJsID0gc3NlcS0+em9uZV9saXN0OwotCQlpZiAocHVibCkgewotCQkJc3NlcS0+em9uZV9saXN0ID0gcHVibC0+em9uZV9saXN0X25leHQ7Ci0JCQlnb3RvIGZvdW5kOwotCQl9CisJCXB1YmwgPSBsaXN0X2ZpcnN0X2VudHJ5KCZpbmZvLT56b25lX2xpc3QsIHN0cnVjdCBwdWJsaWNhdGlvbiwKKwkJCQkJem9uZV9saXN0KTsKKwkJbGlzdF9tb3ZlX3RhaWwoJnB1YmwtPnpvbmVfbGlzdCwgJmluZm8tPnpvbmVfbGlzdCk7CiAJfQorCisJcmVmID0gcHVibC0+cmVmOworCSpkZXN0bm9kZSA9IHB1YmwtPm5vZGU7Citub19tYXRjaDoKIAlzcGluX3VubG9ja19iaCgmc2VxLT5sb2NrKTsKIG5vdF9mb3VuZDoKIAlyZWFkX3VubG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOwotCXJldHVybiAwOworCXJldHVybiByZWY7CiB9CiAKIC8qKgpAQCAtNjc2LDYgKzYzMCw3IEBACiAJc3RydWN0IG5hbWVfc2VxICpzZXE7CiAJc3RydWN0IHN1Yl9zZXEgKnNzZXE7CiAJc3RydWN0IHN1Yl9zZXEgKnNzZXFfc3RvcDsKKwlzdHJ1Y3QgbmFtZV9pbmZvICppbmZvOwogCWludCByZXMgPSAwOwogCiAJcmVhZF9sb2NrX2JoKCZ0aXBjX25hbWV0YmxfbG9jayk7CkBAIC02OTMsMTYgKzY0OCwxMyBAQAogCQlpZiAoc3NlcS0+bG93ZXIgPiB1cHBlcikKIAkJCWJyZWFrOwogCi0JCXB1YmwgPSBzc2VxLT5ub2RlX2xpc3Q7Ci0JCWlmIChwdWJsKSB7Ci0JCQlkbyB7Ci0JCQkJaWYgKHB1YmwtPnNjb3BlIDw9IGxpbWl0KQotCQkJCQl0aXBjX3BvcnRfbGlzdF9hZGQoZHBvcnRzLCBwdWJsLT5yZWYpOwotCQkJCXB1YmwgPSBwdWJsLT5ub2RlX2xpc3RfbmV4dDsKLQkJCX0gd2hpbGUgKHB1YmwgIT0gc3NlcS0+bm9kZV9saXN0KTsKKwkJaW5mbyA9IHNzZXEtPmluZm87CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocHVibCwgJmluZm8tPm5vZGVfbGlzdCwgbm9kZV9saXN0KSB7CisJCQlpZiAocHVibC0+c2NvcGUgPD0gbGltaXQpCisJCQkJdGlwY19wb3J0X2xpc3RfYWRkKGRwb3J0cywgcHVibC0+cmVmKTsKIAkJfQogCi0JCWlmIChzc2VxLT5jbHVzdGVyX2xpc3Rfc2l6ZSAhPSBzc2VxLT5ub2RlX2xpc3Rfc2l6ZSkKKwkJaWYgKGluZm8tPmNsdXN0ZXJfbGlzdF9zaXplICE9IGluZm8tPm5vZGVfbGlzdF9zaXplKQogCQkJcmVzID0gMTsKIAl9CiAKQEAgLTg0MCwxNiArNzkyLDE5IEBACiB7CiAJY2hhciBwb3J0SWRTdHJbMjddOwogCWNvbnN0IGNoYXIgKnNjb3BlX3N0cltdID0geyIiLCAiIHpvbmUiLCAiIGNsdXN0ZXIiLCAiIG5vZGUifTsKLQlzdHJ1Y3QgcHVibGljYXRpb24gKnB1YmwgPSBzc2VxLT56b25lX2xpc3Q7CisJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOworCXN0cnVjdCBuYW1lX2luZm8gKmluZm87CiAKIAl0aXBjX3ByaW50ZihidWYsICIlLTEwdSAlLTEwdSAiLCBzc2VxLT5sb3dlciwgc3NlcS0+dXBwZXIpOwogCi0JaWYgKGRlcHRoID09IDIgfHwgIXB1YmwpIHsKKwlpZiAoZGVwdGggPT0gMikgewogCQl0aXBjX3ByaW50ZihidWYsICJcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JZG8geworCWluZm8gPSBzc2VxLT5pbmZvOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwdWJsLCAmaW5mby0+em9uZV9saXN0LCB6b25lX2xpc3QpIHsKIAkJc3ByaW50Zihwb3J0SWRTdHIsICI8JXUuJXUuJXU6JXU+IiwKIAkJCSB0aXBjX3pvbmUocHVibC0+bm9kZSksIHRpcGNfY2x1c3RlcihwdWJsLT5ub2RlKSwKIAkJCSB0aXBjX25vZGUocHVibC0+bm9kZSksIHB1YmwtPnJlZik7CkBAIC04NTgsMTMgKzgxMyw5IEBACiAJCQl0aXBjX3ByaW50ZihidWYsICIlLTEwdSAlcyIsIHB1YmwtPmtleSwKIAkJCQkgICAgc2NvcGVfc3RyW3B1YmwtPnNjb3BlXSk7CiAJCX0KLQotCQlwdWJsID0gcHVibC0+em9uZV9saXN0X25leHQ7Ci0JCWlmIChwdWJsID09IHNzZXEtPnpvbmVfbGlzdCkKLQkJCWJyZWFrOwotCi0JCXRpcGNfcHJpbnRmKGJ1ZiwgIlxuJTMzcyIsICIgIik7Ci0JfSB3aGlsZSAoMSk7CisJCWlmICghbGlzdF9pc19sYXN0KCZwdWJsLT56b25lX2xpc3QsICZpbmZvLT56b25lX2xpc3QpKQorCQkJdGlwY19wcmludGYoYnVmLCAiXG4lMzNzIiwgIiAiKTsKKwl9OwogCiAJdGlwY19wcmludGYoYnVmLCAiXG4iKTsKIH0KZGlmZiAtLWdpdCBhL25ldC90aXBjL25hbWVfdGFibGUuaCBiL25ldC90aXBjL25hbWVfdGFibGUuaAppbmRleCBkMjI4YmQ2Li42MmQ3N2U1IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9uYW1lX3RhYmxlLmgKKysrIGIvbmV0L3RpcGMvbmFtZV90YWJsZS5oCkBAIC0yLDcgKzIsNyBAQAogICogbmV0L3RpcGMvbmFtZV90YWJsZS5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgbmFtZSB0YWJsZSBjb2RlCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIEVyaWNzc29uIEFCCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgMjAxMC0yMDExLCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02MSw5ICs2MSw5IEBACiAgKiBAc3Vic2NyOiBzdWJzY3JpcHRpb24gdG8gIm5vZGUgZG93biIgZXZlbnQgKGZvciBvZmYtbm9kZSBwdWJsaWNhdGlvbnMgb25seSkKICAqIEBsb2NhbF9saXN0OiBhZGphY2VudCBlbnRyaWVzIGluIGxpc3Qgb2YgcHVibGljYXRpb25zIG1hZGUgYnkgdGhpcyBub2RlCiAgKiBAcHBvcnRfbGlzdDogYWRqYWNlbnQgZW50cmllcyBpbiBsaXN0IG9mIHB1YmxpY2F0aW9ucyBtYWRlIGJ5IHRoaXMgcG9ydAotICogQG5vZGVfbGlzdDogbmV4dCBtYXRjaGluZyBuYW1lIHNlcSBwdWJsaWNhdGlvbiB3aXRoID49IG5vZGUgc2NvcGUKLSAqIEBjbHVzdGVyX2xpc3Q6IG5leHQgbWF0Y2hpbmcgbmFtZSBzZXEgcHVibGljYXRpb24gd2l0aCA+PSBjbHVzdGVyIHNjb3BlCi0gKiBAem9uZV9saXN0OiBuZXh0IG1hdGNoaW5nIG5hbWUgc2VxIHB1YmxpY2F0aW9uIHdpdGggPj0gem9uZSBzY29wZQorICogQG5vZGVfbGlzdDogYWRqYWNlbnQgbWF0Y2hpbmcgbmFtZSBzZXEgcHVibGljYXRpb25zIHdpdGggPj0gbm9kZSBzY29wZQorICogQGNsdXN0ZXJfbGlzdDogYWRqYWNlbnQgbWF0Y2hpbmcgbmFtZSBzZXEgcHVibGljYXRpb25zIHdpdGggPj0gY2x1c3RlciBzY29wZQorICogQHpvbmVfbGlzdDogYWRqYWNlbnQgbWF0Y2hpbmcgbmFtZSBzZXEgcHVibGljYXRpb25zIHdpdGggPj0gem9uZSBzY29wZQogICoKICAqIE5vdGUgdGhhdCB0aGUgbm9kZSBsaXN0LCBjbHVzdGVyIGxpc3QsIGFuZCB6b25lIGxpc3QgYXJlIGNpcmN1bGFyIGxpc3RzLgogICovCkBAIC03OSw5ICs3OSw5IEBACiAJc3RydWN0IHRpcGNfbm9kZV9zdWJzY3Igc3Vic2NyOwogCXN0cnVjdCBsaXN0X2hlYWQgbG9jYWxfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBwb3J0X2xpc3Q7Ci0Jc3RydWN0IHB1YmxpY2F0aW9uICpub2RlX2xpc3RfbmV4dDsKLQlzdHJ1Y3QgcHVibGljYXRpb24gKmNsdXN0ZXJfbGlzdF9uZXh0OwotCXN0cnVjdCBwdWJsaWNhdGlvbiAqem9uZV9saXN0X25leHQ7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBjbHVzdGVyX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCB6b25lX2xpc3Q7CiB9OwogCiAKZGlmZiAtLWdpdCBhL25ldC90aXBjL3BvcnQuYyBiL25ldC90aXBjL3BvcnQuYwppbmRleCBjNjhkYzk1Li41NGQ4MTJhIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9wb3J0LmMKKysrIGIvbmV0L3RpcGMvcG9ydC5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlwX3B0ci0+bWF4X3BrdCA9IE1BWF9QS1RfREVGQVVMVDsKIAlwX3B0ci0+cmVmID0gcmVmOwogCW1zZyA9ICZwX3B0ci0+cGhkcjsKLQl0aXBjX21zZ19pbml0KG1zZywgaW1wb3J0YW5jZSwgVElQQ19OQU1FRF9NU0csIExPTkdfSF9TSVpFLCAwKTsKKwl0aXBjX21zZ19pbml0KG1zZywgaW1wb3J0YW5jZSwgVElQQ19OQU1FRF9NU0csIE5BTUVEX0hfU0laRSwgMCk7CiAJbXNnX3NldF9vcmlncG9ydChtc2csIHJlZik7CiAJSU5JVF9MSVNUX0hFQUQoJnBfcHRyLT53YWl0X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZwX3B0ci0+c3Vic2NyaXB0aW9uLm5vZGVzdWJfbGlzdCk7CkBAIC0zMjcsMjYgKzMyNywyMyBAQAogfQogCiAvKgotICogcG9ydF9idWlsZF9wcm90b19tc2coKTogYnVpbGQgYSBwb3J0IGxldmVsIHByb3RvY29sCi0gKiBvciBhIGNvbm5lY3Rpb24gYWJvcnRpb24gbWVzc2FnZS4gQ2FsbGVkIHdpdGgKLSAqIHRpcGNfcG9ydCBsb2NrIG9uLgorICogcG9ydF9idWlsZF9wcm90b19tc2coKTogY3JlYXRlIGNvbm5lY3Rpb24gcHJvdG9jb2wgbWVzc2FnZSBmb3IgcG9ydAorICoKKyAqIE9uIGVudHJ5IHRoZSBwb3J0IG11c3QgYmUgbG9ja2VkIGFuZCBjb25uZWN0ZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcG9ydF9idWlsZF9wcm90b19tc2codTMyIGRlc3Rwb3J0LCB1MzIgZGVzdG5vZGUsCi0JCQkJCSAgICB1MzIgb3JpZ3BvcnQsIHUzMiBvcmlnbm9kZSwKLQkJCQkJICAgIHUzMiB1c3IsIHUzMiB0eXBlLCB1MzIgZXJyLAotCQkJCQkgICAgdTMyIGFjaykKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcG9ydF9idWlsZF9wcm90b19tc2coc3RydWN0IHRpcGNfcG9ydCAqcF9wdHIsCisJCQkJCSAgICB1MzIgdHlwZSwgdTMyIGFjaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOwogCXN0cnVjdCB0aXBjX21zZyAqbXNnOwogCi0JYnVmID0gdGlwY19idWZfYWNxdWlyZShMT05HX0hfU0laRSk7CisJYnVmID0gdGlwY19idWZfYWNxdWlyZShJTlRfSF9TSVpFKTsKIAlpZiAoYnVmKSB7CiAJCW1zZyA9IGJ1Zl9tc2coYnVmKTsKLQkJdGlwY19tc2dfaW5pdChtc2csIHVzciwgdHlwZSwgTE9OR19IX1NJWkUsIGRlc3Rub2RlKTsKLQkJbXNnX3NldF9lcnJjb2RlKG1zZywgZXJyKTsKLQkJbXNnX3NldF9kZXN0cG9ydChtc2csIGRlc3Rwb3J0KTsKLQkJbXNnX3NldF9vcmlncG9ydChtc2csIG9yaWdwb3J0KTsKLQkJbXNnX3NldF9vcmlnbm9kZShtc2csIG9yaWdub2RlKTsKKwkJdGlwY19tc2dfaW5pdChtc2csIENPTk5fTUFOQUdFUiwgdHlwZSwgSU5UX0hfU0laRSwKKwkJCSAgICAgIHBvcnRfcGVlcm5vZGUocF9wdHIpKTsKKwkJbXNnX3NldF9kZXN0cG9ydChtc2csIHBvcnRfcGVlcnBvcnQocF9wdHIpKTsKKwkJbXNnX3NldF9vcmlncG9ydChtc2csIHBfcHRyLT5yZWYpOwogCQltc2dfc2V0X21zZ2NudChtc2csIGFjayk7CiAJfQogCXJldHVybiBidWY7CkBAIC0zNTgsNDUgKzM1NSw0OCBAQAogCXN0cnVjdCBza19idWZmICpyYnVmOwogCXN0cnVjdCB0aXBjX21zZyAqcm1zZzsKIAlpbnQgaGRyX3N6OwotCXUzMiBpbXAgPSBtc2dfaW1wb3J0YW5jZShtc2cpOworCXUzMiBpbXA7CiAJdTMyIGRhdGFfc3ogPSBtc2dfZGF0YV9zeihtc2cpOwotCi0JaWYgKGRhdGFfc3ogPiBNQVhfUkVKRUNUX1NJWkUpCi0JCWRhdGFfc3ogPSBNQVhfUkVKRUNUX1NJWkU7Ci0JaWYgKG1zZ19jb25uZWN0ZWQobXNnKSAmJiAoaW1wIDwgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKSkKLQkJaW1wKys7CisJdTMyIHNyY19ub2RlOworCXUzMiBybXNnX3N6OwogCiAJLyogZGlzY2FyZCByZWplY3RlZCBtZXNzYWdlIGlmIGl0IHNob3VsZG4ndCBiZSByZXR1cm5lZCB0byBzZW5kZXIgKi8KLQlpZiAobXNnX2VycmNvZGUobXNnKSB8fCBtc2dfZGVzdF9kcm9wcGFibGUobXNnKSkgewotCQlidWZfZGlzY2FyZChidWYpOwotCQlyZXR1cm4gZGF0YV9zejsKLQl9CiAKLQkvKiBjb25zdHJ1Y3QgcmVqZWN0ZWQgbWVzc2FnZSAqLwotCWlmIChtc2dfbWNhc3QobXNnKSkKLQkJaGRyX3N6ID0gTUNBU1RfSF9TSVpFOwotCWVsc2UKLQkJaGRyX3N6ID0gTE9OR19IX1NJWkU7Ci0JcmJ1ZiA9IHRpcGNfYnVmX2FjcXVpcmUoZGF0YV9zeiArIGhkcl9zeik7Ci0JaWYgKHJidWYgPT0gTlVMTCkgewotCQlidWZfZGlzY2FyZChidWYpOwotCQlyZXR1cm4gZGF0YV9zejsKKwlpZiAoV0FSTighbXNnX2lzZGF0YShtc2cpLAorCQkgImF0dGVtcHQgdG8gcmVqZWN0IG1lc3NhZ2Ugd2l0aCB1c2VyPSV1IiwgbXNnX3VzZXIobXNnKSkpIHsKKwkJZHVtcF9zdGFjaygpOworCQlnb3RvIGV4aXQ7CiAJfQorCWlmIChtc2dfZXJyY29kZShtc2cpIHx8IG1zZ19kZXN0X2Ryb3BwYWJsZShtc2cpKQorCQlnb3RvIGV4aXQ7CisKKwkvKgorCSAqIGNvbnN0cnVjdCByZXR1cm5lZCBtZXNzYWdlIGJ5IGNvcHlpbmcgcmVqZWN0ZWQgbWVzc2FnZSBoZWFkZXIgYW5kCisJICogZGF0YSAob3Igc3Vic2V0KSwgdGhlbiB1cGRhdGluZyBoZWFkZXIgZmllbGRzIHRoYXQgbmVlZCBhZGp1c3RpbmcKKwkgKi8KKworCWhkcl9zeiA9IG1zZ19oZHJfc3oobXNnKTsKKwlybXNnX3N6ID0gaGRyX3N6ICsgbWluX3QodTMyLCBkYXRhX3N6LCBNQVhfUkVKRUNUX1NJWkUpOworCisJcmJ1ZiA9IHRpcGNfYnVmX2FjcXVpcmUocm1zZ19zeik7CisJaWYgKHJidWYgPT0gTlVMTCkKKwkJZ290byBleGl0OworCiAJcm1zZyA9IGJ1Zl9tc2cocmJ1Zik7Ci0JdGlwY19tc2dfaW5pdChybXNnLCBpbXAsIG1zZ190eXBlKG1zZyksIGhkcl9zeiwgbXNnX29yaWdub2RlKG1zZykpOwotCW1zZ19zZXRfZXJyY29kZShybXNnLCBlcnIpOwotCW1zZ19zZXRfZGVzdHBvcnQocm1zZywgbXNnX29yaWdwb3J0KG1zZykpOwotCW1zZ19zZXRfb3JpZ3BvcnQocm1zZywgbXNnX2Rlc3Rwb3J0KG1zZykpOwotCWlmIChtc2dfc2hvcnQobXNnKSkgewotCQltc2dfc2V0X29yaWdub2RlKHJtc2csIHRpcGNfb3duX2FkZHIpOwotCQkvKiBsZWF2ZSBuYW1lIHR5cGUgJiBpbnN0YW5jZSBhcyB6ZXJvZXMgKi8KLQl9IGVsc2UgewotCQltc2dfc2V0X29yaWdub2RlKHJtc2csIG1zZ19kZXN0bm9kZShtc2cpKTsKLQkJbXNnX3NldF9uYW1ldHlwZShybXNnLCBtc2dfbmFtZXR5cGUobXNnKSk7Ci0JCW1zZ19zZXRfbmFtZWluc3Qocm1zZywgbXNnX25hbWVpbnN0KG1zZykpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHJidWYsIG1zZywgcm1zZ19zeik7CisKKwlpZiAobXNnX2Nvbm5lY3RlZChybXNnKSkgeworCQlpbXAgPSBtc2dfaW1wb3J0YW5jZShybXNnKTsKKwkJaWYgKGltcCA8IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkKKwkJCW1zZ19zZXRfaW1wb3J0YW5jZShybXNnLCArK2ltcCk7CiAJfQotCW1zZ19zZXRfc2l6ZShybXNnLCBkYXRhX3N6ICsgaGRyX3N6KTsKLQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQocmJ1ZiwgaGRyX3N6LCBtc2dfZGF0YShtc2cpLCBkYXRhX3N6KTsKKwltc2dfc2V0X25vbl9zZXEocm1zZywgMCk7CisJbXNnX3NldF9zaXplKHJtc2csIHJtc2dfc3opOworCW1zZ19zZXRfZXJyY29kZShybXNnLCBlcnIpOworCW1zZ19zZXRfcHJldm5vZGUocm1zZywgdGlwY19vd25fYWRkcik7CisJbXNnX3N3YXBfd29yZHMocm1zZywgNCwgNSk7CisJaWYgKCFtc2dfc2hvcnQocm1zZykpCisJCW1zZ19zd2FwX3dvcmRzKHJtc2csIDYsIDcpOwogCiAJLyogc2VuZCBzZWxmLWFib3J0IG1lc3NhZ2Ugd2hlbiByZWplY3Rpbmcgb24gYSBjb25uZWN0ZWQgcG9ydCAqLwogCWlmIChtc2dfY29ubmVjdGVkKG1zZykpIHsKQEAgLTQxMSw5ICs0MTEsMTUgQEAKIAkJdGlwY19uZXRfcm91dGVfbXNnKGFidWYpOwogCX0KIAotCS8qIHNlbmQgcmVqZWN0ZWQgbWVzc2FnZSAqLworCS8qIHNlbmQgcmV0dXJuZWQgbWVzc2FnZSAmIGRpc3Bvc2Ugb2YgcmVqZWN0ZWQgbWVzc2FnZSAqLworCisJc3JjX25vZGUgPSBtc2dfcHJldm5vZGUobXNnKTsKKwlpZiAoc3JjX25vZGUgPT0gdGlwY19vd25fYWRkcikKKwkJdGlwY19wb3J0X3JlY3ZfbXNnKHJidWYpOworCWVsc2UKKwkJdGlwY19saW5rX3NlbmQocmJ1Ziwgc3JjX25vZGUsIG1zZ19saW5rX3NlbGVjdG9yKHJtc2cpKTsKK2V4aXQ6CiAJYnVmX2Rpc2NhcmQoYnVmKTsKLQl0aXBjX25ldF9yb3V0ZV9tc2cocmJ1Zik7CiAJcmV0dXJuIGRhdGFfc3o7CiB9CiAKQEAgLTQ0OSwxNCArNDU1LDcgQEAKIAlpZiAocF9wdHItPnByb2Jpbmdfc3RhdGUgPT0gUFJPQklORykgewogCQlidWYgPSBwb3J0X2J1aWxkX3NlbGZfYWJvcnRfbXNnKHBfcHRyLCBUSVBDX0VSUl9OT19QT1JUKTsKIAl9IGVsc2UgewotCQlidWYgPSBwb3J0X2J1aWxkX3Byb3RvX21zZyhwb3J0X3BlZXJwb3J0KHBfcHRyKSwKLQkJCQkJICAgcG9ydF9wZWVybm9kZShwX3B0ciksCi0JCQkJCSAgIHBfcHRyLT5yZWYsCi0JCQkJCSAgIHRpcGNfb3duX2FkZHIsCi0JCQkJCSAgIENPTk5fTUFOQUdFUiwKLQkJCQkJICAgQ09OTl9QUk9CRSwKLQkJCQkJICAgVElQQ19PSywKLQkJCQkJICAgMCk7CisJCWJ1ZiA9IHBvcnRfYnVpbGRfcHJvdG9fbXNnKHBfcHRyLCBDT05OX1BST0JFLCAwKTsKIAkJcF9wdHItPnByb2Jpbmdfc3RhdGUgPSBQUk9CSU5HOwogCQlrX3N0YXJ0X3RpbWVyKCZwX3B0ci0+dGltZXIsIHBfcHRyLT5wcm9iaW5nX2ludGVydmFsKTsKIAl9CkBAIC00ODAsMTAwICs0NzksOTQgQEAKIAogc3RhdGljIHN0cnVjdCBza19idWZmICpwb3J0X2J1aWxkX3NlbGZfYWJvcnRfbXNnKHN0cnVjdCB0aXBjX3BvcnQgKnBfcHRyLCB1MzIgZXJyKQogewotCXUzMiBpbXAgPSBtc2dfaW1wb3J0YW5jZSgmcF9wdHItPnBoZHIpOworCXN0cnVjdCBza19idWZmICpidWYgPSBwb3J0X2J1aWxkX3BlZXJfYWJvcnRfbXNnKHBfcHRyLCBlcnIpOwogCi0JaWYgKCFwX3B0ci0+Y29ubmVjdGVkKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoaW1wIDwgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKQotCQlpbXArKzsKLQlyZXR1cm4gcG9ydF9idWlsZF9wcm90b19tc2cocF9wdHItPnJlZiwKLQkJCQkgICAgdGlwY19vd25fYWRkciwKLQkJCQkgICAgcG9ydF9wZWVycG9ydChwX3B0ciksCi0JCQkJICAgIHBvcnRfcGVlcm5vZGUocF9wdHIpLAotCQkJCSAgICBpbXAsCi0JCQkJICAgIFRJUENfQ09OTl9NU0csCi0JCQkJICAgIGVyciwKLQkJCQkgICAgMCk7CisJaWYgKGJ1ZikgeworCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKKwkJbXNnX3N3YXBfd29yZHMobXNnLCA0LCA1KTsKKwkJbXNnX3N3YXBfd29yZHMobXNnLCA2LCA3KTsKKwl9CisJcmV0dXJuIGJ1ZjsKIH0KIAogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnBvcnRfYnVpbGRfcGVlcl9hYm9ydF9tc2coc3RydWN0IHRpcGNfcG9ydCAqcF9wdHIsIHUzMiBlcnIpCiB7Ci0JdTMyIGltcCA9IG1zZ19pbXBvcnRhbmNlKCZwX3B0ci0+cGhkcik7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwl1MzIgaW1wOwogCiAJaWYgKCFwX3B0ci0+Y29ubmVjdGVkKQogCQlyZXR1cm4gTlVMTDsKLQlpZiAoaW1wIDwgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKQotCQlpbXArKzsKLQlyZXR1cm4gcG9ydF9idWlsZF9wcm90b19tc2cocG9ydF9wZWVycG9ydChwX3B0ciksCi0JCQkJICAgIHBvcnRfcGVlcm5vZGUocF9wdHIpLAotCQkJCSAgICBwX3B0ci0+cmVmLAotCQkJCSAgICB0aXBjX293bl9hZGRyLAotCQkJCSAgICBpbXAsCi0JCQkJICAgIFRJUENfQ09OTl9NU0csCi0JCQkJICAgIGVyciwKLQkJCQkgICAgMCk7CisKKwlidWYgPSB0aXBjX2J1Zl9hY3F1aXJlKEJBU0lDX0hfU0laRSk7CisJaWYgKGJ1ZikgeworCQltc2cgPSBidWZfbXNnKGJ1Zik7CisJCW1lbWNweShtc2csICZwX3B0ci0+cGhkciwgQkFTSUNfSF9TSVpFKTsKKwkJbXNnX3NldF9oZHJfc3oobXNnLCBCQVNJQ19IX1NJWkUpOworCQltc2dfc2V0X3NpemUobXNnLCBCQVNJQ19IX1NJWkUpOworCQlpbXAgPSBtc2dfaW1wb3J0YW5jZShtc2cpOworCQlpZiAoaW1wIDwgVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKQorCQkJbXNnX3NldF9pbXBvcnRhbmNlKG1zZywgKytpbXApOworCQltc2dfc2V0X2VycmNvZGUobXNnLCBlcnIpOworCX0KKwlyZXR1cm4gYnVmOwogfQogCiB2b2lkIHRpcGNfcG9ydF9yZWN2X3Byb3RvX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQogewogCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOwotCXN0cnVjdCB0aXBjX3BvcnQgKnBfcHRyID0gdGlwY19wb3J0X2xvY2sobXNnX2Rlc3Rwb3J0KG1zZykpOwotCXUzMiBlcnIgPSBUSVBDX09LOworCXN0cnVjdCB0aXBjX3BvcnQgKnBfcHRyOwogCXN0cnVjdCBza19idWZmICpyX2J1ZiA9IE5VTEw7Ci0Jc3RydWN0IHNrX2J1ZmYgKmFib3J0X2J1ZiA9IE5VTEw7CisJdTMyIG9yaWdub2RlID0gbXNnX29yaWdub2RlKG1zZyk7CisJdTMyIG9yaWdwb3J0ID0gbXNnX29yaWdwb3J0KG1zZyk7CisJdTMyIGRlc3Rwb3J0ID0gbXNnX2Rlc3Rwb3J0KG1zZyk7CisJaW50IHdha2VhYmxlOwogCi0JaWYgKCFwX3B0cikgewotCQllcnIgPSBUSVBDX0VSUl9OT19QT1JUOwotCX0gZWxzZSBpZiAocF9wdHItPmNvbm5lY3RlZCkgewotCQlpZiAoKHBvcnRfcGVlcm5vZGUocF9wdHIpICE9IG1zZ19vcmlnbm9kZShtc2cpKSB8fAotCQkgICAgKHBvcnRfcGVlcnBvcnQocF9wdHIpICE9IG1zZ19vcmlncG9ydChtc2cpKSkgewotCQkJZXJyID0gVElQQ19FUlJfTk9fUE9SVDsKLQkJfSBlbHNlIGlmIChtc2dfdHlwZShtc2cpID09IENPTk5fQUNLKSB7Ci0JCQlpbnQgd2FrZXVwID0gdGlwY19wb3J0X2Nvbmdlc3RlZChwX3B0cikgJiYKLQkJCQkgICAgIHBfcHRyLT5jb25nZXN0ZWQgJiYKLQkJCQkgICAgIHBfcHRyLT53YWtldXA7Ci0JCQlwX3B0ci0+YWNrZWQgKz0gbXNnX21zZ2NudChtc2cpOwotCQkJaWYgKHRpcGNfcG9ydF9jb25nZXN0ZWQocF9wdHIpKQotCQkJCWdvdG8gZXhpdDsKLQkJCXBfcHRyLT5jb25nZXN0ZWQgPSAwOwotCQkJaWYgKCF3YWtldXApCi0JCQkJZ290byBleGl0OwotCQkJcF9wdHItPndha2V1cChwX3B0cik7Ci0JCQlnb3RvIGV4aXQ7CisJLyogVmFsaWRhdGUgY29ubmVjdGlvbiAqLworCisJcF9wdHIgPSB0aXBjX3BvcnRfbG9jayhkZXN0cG9ydCk7CisJaWYgKCFwX3B0ciB8fCAhcF9wdHItPmNvbm5lY3RlZCB8fAorCSAgICAocG9ydF9wZWVybm9kZShwX3B0cikgIT0gb3JpZ25vZGUpIHx8CisJICAgIChwb3J0X3BlZXJwb3J0KHBfcHRyKSAhPSBvcmlncG9ydCkpIHsKKwkJcl9idWYgPSB0aXBjX2J1Zl9hY3F1aXJlKEJBU0lDX0hfU0laRSk7CisJCWlmIChyX2J1ZikgeworCQkJbXNnID0gYnVmX21zZyhyX2J1Zik7CisJCQl0aXBjX21zZ19pbml0KG1zZywgVElQQ19ISUdIX0lNUE9SVEFOQ0UsIFRJUENfQ09OTl9NU0csCisJCQkJICAgICAgQkFTSUNfSF9TSVpFLCBvcmlnbm9kZSk7CisJCQltc2dfc2V0X2VycmNvZGUobXNnLCBUSVBDX0VSUl9OT19QT1JUKTsKKwkJCW1zZ19zZXRfb3JpZ3BvcnQobXNnLCBkZXN0cG9ydCk7CisJCQltc2dfc2V0X2Rlc3Rwb3J0KG1zZywgb3JpZ3BvcnQpOwogCQl9Ci0JfSBlbHNlIGlmIChwX3B0ci0+cHVibGlzaGVkKSB7Ci0JCWVyciA9IFRJUENfRVJSX05PX1BPUlQ7Ci0JfQotCWlmIChlcnIpIHsKLQkJcl9idWYgPSBwb3J0X2J1aWxkX3Byb3RvX21zZyhtc2dfb3JpZ3BvcnQobXNnKSwKLQkJCQkJICAgICBtc2dfb3JpZ25vZGUobXNnKSwKLQkJCQkJICAgICBtc2dfZGVzdHBvcnQobXNnKSwKLQkJCQkJICAgICB0aXBjX293bl9hZGRyLAotCQkJCQkgICAgIFRJUENfSElHSF9JTVBPUlRBTkNFLAotCQkJCQkgICAgIFRJUENfQ09OTl9NU0csCi0JCQkJCSAgICAgZXJyLAotCQkJCQkgICAgIDApOworCQlpZiAocF9wdHIpCisJCQl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKIAkJZ290byBleGl0OwogCX0KIAotCS8qIEFsbCBpcyBmaW5lICovCi0JaWYgKG1zZ190eXBlKG1zZykgPT0gQ09OTl9QUk9CRSkgewotCQlyX2J1ZiA9IHBvcnRfYnVpbGRfcHJvdG9fbXNnKG1zZ19vcmlncG9ydChtc2cpLAotCQkJCQkgICAgIG1zZ19vcmlnbm9kZShtc2cpLAotCQkJCQkgICAgIG1zZ19kZXN0cG9ydChtc2cpLAotCQkJCQkgICAgIHRpcGNfb3duX2FkZHIsCi0JCQkJCSAgICAgQ09OTl9NQU5BR0VSLAotCQkJCQkgICAgIENPTk5fUFJPQkVfUkVQTFksCi0JCQkJCSAgICAgVElQQ19PSywKLQkJCQkJICAgICAwKTsKKwkvKiBQcm9jZXNzIHByb3RvY29sIG1lc3NhZ2Ugc2VudCBieSBwZWVyICovCisKKwlzd2l0Y2ggKG1zZ190eXBlKG1zZykpIHsKKwljYXNlIENPTk5fQUNLOgorCQl3YWtlYWJsZSA9IHRpcGNfcG9ydF9jb25nZXN0ZWQocF9wdHIpICYmIHBfcHRyLT5jb25nZXN0ZWQgJiYKKwkJCXBfcHRyLT53YWtldXA7CisJCXBfcHRyLT5hY2tlZCArPSBtc2dfbXNnY250KG1zZyk7CisJCWlmICghdGlwY19wb3J0X2Nvbmdlc3RlZChwX3B0cikpIHsKKwkJCXBfcHRyLT5jb25nZXN0ZWQgPSAwOworCQkJaWYgKHdha2VhYmxlKQorCQkJCXBfcHRyLT53YWtldXAocF9wdHIpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ09OTl9QUk9CRToKKwkJcl9idWYgPSBwb3J0X2J1aWxkX3Byb3RvX21zZyhwX3B0ciwgQ09OTl9QUk9CRV9SRVBMWSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIENPTk5fUFJPQkVfUkVQTFkgb3IgdW5yZWNvZ25pemVkIC0gbm8gYWN0aW9uIHJlcXVpcmVkICovCisJCWJyZWFrOwogCX0KIAlwX3B0ci0+cHJvYmluZ19zdGF0ZSA9IENPTkZJUk1FRDsKKwl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKIGV4aXQ6Ci0JaWYgKHBfcHRyKQotCQl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKIAl0aXBjX25ldF9yb3V0ZV9tc2cocl9idWYpOwotCXRpcGNfbmV0X3JvdXRlX21zZyhhYm9ydF9idWYpOwogCWJ1Zl9kaXNjYXJkKGJ1Zik7CiB9CiAKQEAgLTg4OSwxNCArODgyLDcgQEAKIAkJcmV0dXJuOwogCWlmIChwX3B0ci0+Y29ubmVjdGVkKSB7CiAJCXBfcHRyLT5jb25uX3VuYWNrZWQgLT0gYWNrOwotCQlidWYgPSBwb3J0X2J1aWxkX3Byb3RvX21zZyhwb3J0X3BlZXJwb3J0KHBfcHRyKSwKLQkJCQkJICAgcG9ydF9wZWVybm9kZShwX3B0ciksCi0JCQkJCSAgIHJlZiwKLQkJCQkJICAgdGlwY19vd25fYWRkciwKLQkJCQkJICAgQ09OTl9NQU5BR0VSLAotCQkJCQkgICBDT05OX0FDSywKLQkJCQkJICAgVElQQ19PSywKLQkJCQkJICAgYWNrKTsKKwkJYnVmID0gcG9ydF9idWlsZF9wcm90b19tc2cocF9wdHIsIENPTk5fQUNLLCBhY2spOwogCX0KIAl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKIAl0aXBjX25ldF9yb3V0ZV9tc2coYnVmKTsKQEAgLTExNDAsMTkgKzExMjYsNyBAQAogCWlmICghcF9wdHIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHBfcHRyLT5jb25uZWN0ZWQpIHsKLQkJdTMyIGltcCA9IG1zZ19pbXBvcnRhbmNlKCZwX3B0ci0+cGhkcik7Ci0JCWlmIChpbXAgPCBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UpCi0JCQlpbXArKzsKLQkJYnVmID0gcG9ydF9idWlsZF9wcm90b19tc2cocG9ydF9wZWVycG9ydChwX3B0ciksCi0JCQkJCSAgIHBvcnRfcGVlcm5vZGUocF9wdHIpLAotCQkJCQkgICByZWYsCi0JCQkJCSAgIHRpcGNfb3duX2FkZHIsCi0JCQkJCSAgIGltcCwKLQkJCQkJICAgVElQQ19DT05OX01TRywKLQkJCQkJICAgVElQQ19DT05OX1NIVVRET1dOLAotCQkJCQkgICAwKTsKLQl9CisJYnVmID0gcG9ydF9idWlsZF9wZWVyX2Fib3J0X21zZyhwX3B0ciwgVElQQ19DT05OX1NIVVRET1dOKTsKIAl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKIAl0aXBjX25ldF9yb3V0ZV9tc2coYnVmKTsKIAlyZXR1cm4gdGlwY19kaXNjb25uZWN0KHJlZik7CkBAIC0xMjM4LDcgKzEyMTIsNyBAQAogCW1zZ19zZXRfdHlwZShtc2csIFRJUENfTkFNRURfTVNHKTsKIAltc2dfc2V0X29yaWdub2RlKG1zZywgdGlwY19vd25fYWRkcik7CiAJbXNnX3NldF9vcmlncG9ydChtc2csIHJlZik7Ci0JbXNnX3NldF9oZHJfc3oobXNnLCBMT05HX0hfU0laRSk7CisJbXNnX3NldF9oZHJfc3oobXNnLCBOQU1FRF9IX1NJWkUpOwogCW1zZ19zZXRfbmFtZXR5cGUobXNnLCBuYW1lLT50eXBlKTsKIAltc2dfc2V0X25hbWVpbnN0KG1zZywgbmFtZS0+aW5zdGFuY2UpOwogCW1zZ19zZXRfbG9va3VwX3Njb3BlKG1zZywgdGlwY19hZGRyX3Njb3BlKGRvbWFpbikpOwpAQCAtMTI5MSw3ICsxMjY1LDcgQEAKIAltc2dfc2V0X29yaWdwb3J0KG1zZywgcmVmKTsKIAltc2dfc2V0X2Rlc3Rub2RlKG1zZywgZGVzdC0+bm9kZSk7CiAJbXNnX3NldF9kZXN0cG9ydChtc2csIGRlc3QtPnJlZik7Ci0JbXNnX3NldF9oZHJfc3oobXNnLCBESVJfTVNHX0hfU0laRSk7CisJbXNnX3NldF9oZHJfc3oobXNnLCBCQVNJQ19IX1NJWkUpOwogCiAJaWYgKGRlc3QtPm5vZGUgPT0gdGlwY19vd25fYWRkcikKIAkJcmVzID0gIHRpcGNfcG9ydF9yZWN2X3NlY3Rpb25zKHBfcHRyLCBudW1fc2VjdCwgbXNnX3NlY3QsCkBAIC0xMzMxLDEzICsxMzA1LDEzIEBACiAJbXNnX3NldF9vcmlncG9ydChtc2csIHJlZik7CiAJbXNnX3NldF9kZXN0bm9kZShtc2csIGRlc3QtPm5vZGUpOwogCW1zZ19zZXRfZGVzdHBvcnQobXNnLCBkZXN0LT5yZWYpOwotCW1zZ19zZXRfaGRyX3N6KG1zZywgRElSX01TR19IX1NJWkUpOwotCW1zZ19zZXRfc2l6ZShtc2csIERJUl9NU0dfSF9TSVpFICsgZHN6KTsKLQlpZiAoc2tiX2NvdyhidWYsIERJUl9NU0dfSF9TSVpFKSkKKwltc2dfc2V0X2hkcl9zeihtc2csIEJBU0lDX0hfU0laRSk7CisJbXNnX3NldF9zaXplKG1zZywgQkFTSUNfSF9TSVpFICsgZHN6KTsKKwlpZiAoc2tiX2NvdyhidWYsIEJBU0lDX0hfU0laRSkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2tiX3B1c2goYnVmLCBESVJfTVNHX0hfU0laRSk7Ci0Jc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoYnVmLCBtc2csIERJUl9NU0dfSF9TSVpFKTsKKwlza2JfcHVzaChidWYsIEJBU0lDX0hfU0laRSk7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoYnVmLCBtc2csIEJBU0lDX0hfU0laRSk7CiAKIAlpZiAoZGVzdC0+bm9kZSA9PSB0aXBjX293bl9hZGRyKQogCQlyZXMgPSB0aXBjX3BvcnRfcmVjdl9tc2coYnVmKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL3NvY2tldC5jIGIvbmV0L3RpcGMvc29ja2V0LmMKaW5kZXggMzM4ODM3My4uYWRiMmVmZiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvc29ja2V0LmMKKysrIGIvbmV0L3RpcGMvc29ja2V0LmMKQEAgLTM2LDkgKzM2LDYgQEAKIAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKLSNpbmNsdWRlIDxsaW51eC90aXBjLmg+Ci0jaW5jbHVkZSA8bGludXgvdGlwY19jb25maWcuaD4KLQogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJwb3J0LmgiCiAKZGlmZiAtLWdpdCBhL25ldC91bml4L2FmX3VuaXguYyBiL25ldC91bml4L2FmX3VuaXguYwppbmRleCAwNzIyYTI1Li5lYzY4ZTFjIDEwMDY0NAotLS0gYS9uZXQvdW5peC9hZl91bml4LmMKKysrIGIvbmV0L3VuaXgvYWZfdW5peC5jCkBAIC04MDgsOCArODA4LDkgQEAKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJc3RydWN0IHVuaXhfc29jayAqdSA9IHVuaXhfc2soc2spOwogCXN0cnVjdCBzb2NrYWRkcl91biAqc3VuYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4gKil1YWRkcjsKKwljaGFyICpzdW5fcGF0aCA9IHN1bmFkZHItPnN1bl9wYXRoOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IE5VTEw7Ci0Jc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3QgcGF0aCBwYXRoOwogCWludCBlcnI7CiAJdW5zaWduZWQgaGFzaDsKIAlzdHJ1Y3QgdW5peF9hZGRyZXNzICphZGRyOwpAQCAtODQ1LDQ4ICs4NDYsNDQgQEAKIAlhZGRyLT5oYXNoID0gaGFzaCBeIHNrLT5za190eXBlOwogCWF0b21pY19zZXQoJmFkZHItPnJlZmNudCwgMSk7CiAKLQlpZiAoc3VuYWRkci0+c3VuX3BhdGhbMF0pIHsKKwlpZiAoc3VuX3BhdGhbMF0pIHsKIAkJdW5zaWduZWQgaW50IG1vZGU7CiAJCWVyciA9IDA7CiAJCS8qCiAJCSAqIEdldCB0aGUgcGFyZW50IGRpcmVjdG9yeSwgY2FsY3VsYXRlIHRoZSBoYXNoIGZvciBsYXN0CiAJCSAqIGNvbXBvbmVudC4KIAkJICovCi0JCWVyciA9IGtlcm5fcGF0aF9wYXJlbnQoc3VuYWRkci0+c3VuX3BhdGgsICZuZCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dF9ta25vZF9wYXJlbnQ7Ci0KLQkJZGVudHJ5ID0gbG9va3VwX2NyZWF0ZSgmbmQsIDApOworCQlkZW50cnkgPSBrZXJuX3BhdGhfY3JlYXRlKEFUX0ZEQ1dELCBzdW5fcGF0aCwgJnBhdGgsIDApOwogCQllcnIgPSBQVFJfRVJSKGRlbnRyeSk7CiAJCWlmIChJU19FUlIoZGVudHJ5KSkKLQkJCWdvdG8gb3V0X21rbm9kX3VubG9jazsKKwkJCWdvdG8gb3V0X21rbm9kX3BhcmVudDsKIAogCQkvKgogCQkgKiBBbGwgcmlnaHQsIGxldCdzIGNyZWF0ZSBpdC4KIAkJICovCiAJCW1vZGUgPSBTX0lGU09DSyB8CiAJCSAgICAgICAoU09DS19JTk9ERShzb2NrKS0+aV9tb2RlICYgfmN1cnJlbnRfdW1hc2soKSk7Ci0JCWVyciA9IG1udF93YW50X3dyaXRlKG5kLnBhdGgubW50KTsKKwkJZXJyID0gbW50X3dhbnRfd3JpdGUocGF0aC5tbnQpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfbWtub2RfZHB1dDsKLQkJZXJyID0gc2VjdXJpdHlfcGF0aF9ta25vZCgmbmQucGF0aCwgZGVudHJ5LCBtb2RlLCAwKTsKKwkJZXJyID0gc2VjdXJpdHlfcGF0aF9ta25vZCgmcGF0aCwgZGVudHJ5LCBtb2RlLCAwKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0X21rbm9kX2Ryb3Bfd3JpdGU7Ci0JCWVyciA9IHZmc19ta25vZChuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5LCBtb2RlLCAwKTsKKwkJZXJyID0gdmZzX21rbm9kKHBhdGguZGVudHJ5LT5kX2lub2RlLCBkZW50cnksIG1vZGUsIDApOwogb3V0X21rbm9kX2Ryb3Bfd3JpdGU6Ci0JCW1udF9kcm9wX3dyaXRlKG5kLnBhdGgubW50KTsKKwkJbW50X2Ryb3Bfd3JpdGUocGF0aC5tbnQpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfbWtub2RfZHB1dDsKLQkJbXV0ZXhfdW5sb2NrKCZuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JCWRwdXQobmQucGF0aC5kZW50cnkpOwotCQluZC5wYXRoLmRlbnRyeSA9IGRlbnRyeTsKKwkJbXV0ZXhfdW5sb2NrKCZwYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJCWRwdXQocGF0aC5kZW50cnkpOworCQlwYXRoLmRlbnRyeSA9IGRlbnRyeTsKIAogCQlhZGRyLT5oYXNoID0gVU5JWF9IQVNIX1NJWkU7CiAJfQogCiAJc3Bpbl9sb2NrKCZ1bml4X3RhYmxlX2xvY2spOwogCi0JaWYgKCFzdW5hZGRyLT5zdW5fcGF0aFswXSkgeworCWlmICghc3VuX3BhdGhbMF0pIHsKIAkJZXJyID0gLUVBRERSSU5VU0U7CiAJCWlmIChfX3VuaXhfZmluZF9zb2NrZXRfYnluYW1lKG5ldCwgc3VuYWRkciwgYWRkcl9sZW4sCiAJCQkJCSAgICAgIHNrLT5za190eXBlLCBoYXNoKSkgewpAQCAtODk3LDggKzg5NCw4IEBACiAJCWxpc3QgPSAmdW5peF9zb2NrZXRfdGFibGVbYWRkci0+aGFzaF07CiAJfSBlbHNlIHsKIAkJbGlzdCA9ICZ1bml4X3NvY2tldF90YWJsZVtkZW50cnktPmRfaW5vZGUtPmlfaW5vICYgKFVOSVhfSEFTSF9TSVpFLTEpXTsKLQkJdS0+ZGVudHJ5ID0gbmQucGF0aC5kZW50cnk7Ci0JCXUtPm1udCAgICA9IG5kLnBhdGgubW50OworCQl1LT5kZW50cnkgPSBwYXRoLmRlbnRyeTsKKwkJdS0+bW50ICAgID0gcGF0aC5tbnQ7CiAJfQogCiAJZXJyID0gMDsKQEAgLTkxNSw5ICs5MTIsOCBAQAogCiBvdXRfbWtub2RfZHB1dDoKIAlkcHV0KGRlbnRyeSk7Ci1vdXRfbWtub2RfdW5sb2NrOgotCW11dGV4X3VubG9jaygmbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwotCXBhdGhfcHV0KCZuZC5wYXRoKTsKKwltdXRleF91bmxvY2soJnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwlwYXRoX3B1dCgmcGF0aCk7CiBvdXRfbWtub2RfcGFyZW50OgogCWlmIChlcnIgPT0gLUVFWElTVCkKIAkJZXJyID0gLUVBRERSSU5VU0U7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvY29yZS5jIGIvbmV0L3dpcmVsZXNzL2NvcmUuYwppbmRleCBjMjJlZjM0Li42NDU0MzdjIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvY29yZS5jCisrKyBiL25ldC93aXJlbGVzcy9jb3JlLmMKQEAgLTM2Niw2ICszNjYsNyBAQAogCiAJbXV0ZXhfaW5pdCgmcmRldi0+bXR4KTsKIAltdXRleF9pbml0KCZyZGV2LT5kZXZsaXN0X210eCk7CisJbXV0ZXhfaW5pdCgmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOwogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5uZXRkZXZfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnJkZXYtPmJzc19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmcmRldi0+YnNzX2xpc3QpOwpAQCAtNDg3LDYgKzQ4OCwxMCBAQAogCWludCBpOwogCXUxNiBpZm1vZGVzID0gd2lwaHktPmludGVyZmFjZV9tb2RlczsKIAorCWlmIChXQVJOX09OKCh3aXBoeS0+d293bGFuLmZsYWdzICYgV0lQSFlfV09XTEFOX0dUS19SRUtFWV9GQUlMVVJFKSAmJgorCQkgICAgISh3aXBoeS0+d293bGFuLmZsYWdzICYgV0lQSFlfV09XTEFOX1NVUFBPUlRTX0dUS19SRUtFWSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChXQVJOX09OKHdpcGh5LT5hZGRyZXNzZXMgJiYgIXdpcGh5LT5uX2FkZHJlc3NlcykpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC03MDEsNiArNzA2LDcgQEAKIAlyZmtpbGxfZGVzdHJveShyZGV2LT5yZmtpbGwpOwogCW11dGV4X2Rlc3Ryb3koJnJkZXYtPm10eCk7CiAJbXV0ZXhfZGVzdHJveSgmcmRldi0+ZGV2bGlzdF9tdHgpOworCW11dGV4X2Rlc3Ryb3koJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2NhbiwgdG1wLCAmcmRldi0+YnNzX2xpc3QsIGxpc3QpCiAJCWNmZzgwMjExX3B1dF9ic3MoJnNjYW4tPnB1Yik7CiAJY2ZnODAyMTFfcmRldl9mcmVlX3dvd2xhbihyZGV2KTsKQEAgLTczNywxMiArNzQzLDE2IEBACiAJCV9fX2NmZzgwMjExX3NjYW5fZG9uZShyZGV2LCB0cnVlKTsKIAl9CiAKKwljZmc4MDIxMV91bmxvY2tfcmRldihyZGV2KTsKKworCW11dGV4X2xvY2soJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKKwogCWlmIChXQVJOX09OKHJkZXYtPnNjaGVkX3NjYW5fcmVxICYmCiAJCSAgICByZGV2LT5zY2hlZF9zY2FuX3JlcS0+ZGV2ID09IHdkZXYtPm5ldGRldikpIHsKIAkJX19jZmc4MDIxMV9zdG9wX3NjaGVkX3NjYW4ocmRldiwgZmFsc2UpOwogCX0KIAotCWNmZzgwMjExX3VubG9ja19yZGV2KHJkZXYpOworCW11dGV4X3VubG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOwogCiAJbXV0ZXhfbG9jaygmcmRldi0+ZGV2bGlzdF9tdHgpOwogCXJkZXYtPm9wZW5jb3VudC0tOwpAQCAtODMwLDkgKzg0MCw5IEBACiAJCQlicmVhazsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgogCQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JCQljZmc4MDIxMV9sb2NrX3JkZXYocmRldik7CisJCQltdXRleF9sb2NrKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CiAJCQlfX2NmZzgwMjExX3N0b3Bfc2NoZWRfc2NhbihyZGV2LCBmYWxzZSk7Ci0JCQljZmc4MDIxMV91bmxvY2tfcmRldihyZGV2KTsKKwkJCW11dGV4X3VubG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOwogCiAJCQl3ZGV2X2xvY2sod2Rldik7CiAjaWZkZWYgQ09ORklHX0NGRzgwMjExX1dFWFQKQEAgLTkxMiw3ICs5MjIsOCBAQAogCQkgKiBDb25maWd1cmUgcG93ZXIgbWFuYWdlbWVudCB0byB0aGUgZHJpdmVyIGhlcmUgc28gdGhhdCBpdHMKIAkJICogY29ycmVjdGx5IHNldCBhbHNvIGFmdGVyIGludGVyZmFjZSB0eXBlIGNoYW5nZXMgZXRjLgogCQkgKi8KLQkJaWYgKHdkZXYtPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCisJCWlmICgod2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkJICAgICB3ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkgJiYKIAkJICAgIHJkZXYtPm9wcy0+c2V0X3Bvd2VyX21nbXQpCiAJCQlpZiAocmRldi0+b3BzLT5zZXRfcG93ZXJfbWdtdCh3ZGV2LT53aXBoeSwgZGV2LAogCQkJCQkJICAgICAgd2Rldi0+cHMsCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvY29yZS5oIGIvbmV0L3dpcmVsZXNzL2NvcmUuaAppbmRleCAzZGNlMWYxLi44NjcyZTAyIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvY29yZS5oCisrKyBiL25ldC93aXJlbGVzcy9jb3JlLmgKQEAgLTY1LDYgKzY1LDggQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2Nhbl9kb25lX3drOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBzY2hlZF9zY2FuX3Jlc3VsdHNfd2s7CiAKKwlzdHJ1Y3QgbXV0ZXggc2NoZWRfc2Nhbl9tdHg7CisKICNpZmRlZiBDT05GSUdfTkw4MDIxMV9URVNUTU9ERQogCXN0cnVjdCBnZW5sX2luZm8gKnRlc3Rtb2RlX2luZm87CiAjZW5kaWYKQEAgLTQ0NSw2ICs0NDcsMTAgQEAKIAogdTE2IGNmZzgwMjExX2NhbGN1bGF0ZV9iaXRyYXRlKHN0cnVjdCByYXRlX2luZm8gKnJhdGUpOwogCitpbnQgaWVlZTgwMjExX2dldF9yYXRlbWFzayhzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSAgIGNvbnN0IHU4ICpyYXRlcywgdW5zaWduZWQgaW50IG5fcmF0ZXMsCisJCQkgICB1MzIgKm1hc2spOworCiBpbnQgY2ZnODAyMTFfdmFsaWRhdGVfYmVhY29uX2ludChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkJIHUzMiBiZWFjb25faW50KTsKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL21sbWUuYyBiL25ldC93aXJlbGVzcy9tbG1lLmMKaW5kZXggNDkzYjkzOS4uODMyZjY1NyAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL21sbWUuYworKysgYi9uZXQvd2lyZWxlc3MvbWxtZS5jCkBAIC0xNzAsNyArMTcwLDkgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWlmICh3ZGV2LT5hdXRodHJ5X2Jzc2VzW2ldICYmCi0JCSAgICBtZW1jbXAod2Rldi0+YXV0aHRyeV9ic3Nlc1tpXS0+cHViLmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pID09IDApIHsKKwkJICAgIG1lbWNtcCh3ZGV2LT5hdXRodHJ5X2Jzc2VzW2ldLT5wdWIuYnNzaWQsIGJzc2lkLAorCQkJICAgRVRIX0FMRU4pID09IDAgJiYKKwkJICAgIG1lbWNtcChtZ210LT5zYSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApIHsKIAkJCWNmZzgwMjExX3VuaG9sZF9ic3Mod2Rldi0+YXV0aHRyeV9ic3Nlc1tpXSk7CiAJCQljZmc4MDIxMV9wdXRfYnNzKCZ3ZGV2LT5hdXRodHJ5X2Jzc2VzW2ldLT5wdWIpOwogCQkJd2Rldi0+YXV0aHRyeV9ic3Nlc1tpXSA9IE5VTEw7CkBAIC0xMDgyLDMgKzEwODQsMTQgQEAKIAlubDgwMjExX3NlbmRfY3FtX3BrdGxvc3Nfbm90aWZ5KHJkZXYsIGRldiwgcGVlciwgbnVtX3BhY2tldHMsIGdmcCk7CiB9CiBFWFBPUlRfU1lNQk9MKGNmZzgwMjExX2NxbV9wa3Rsb3NzX25vdGlmeSk7CisKK3ZvaWQgY2ZnODAyMTFfZ3RrX3Jla2V5X25vdGlmeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqYnNzaWQsCisJCQkgICAgICAgY29uc3QgdTggKnJlcGxheV9jdHIsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOworCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCisJbmw4MDIxMV9ndGtfcmVrZXlfbm90aWZ5KHJkZXYsIGRldiwgYnNzaWQsIHJlcGxheV9jdHIsIGdmcCk7Cit9CitFWFBPUlRfU1lNQk9MKGNmZzgwMjExX2d0a19yZWtleV9ub3RpZnkpOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKaW5kZXggODhhNTY1Zi4uMjhkMmFhMSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYworKysgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCkBAIC0xNzYsNiArMTc2LDggQEAKIAlbTkw4MDIxMV9BVFRSX1dPV0xBTl9UUklHR0VSU10gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogCVtOTDgwMjExX0FUVFJfU1RBX1BMSU5LX1NUQVRFXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKIAlbTkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fSU5URVJWQUxdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkw4MDIxMV9BVFRSX1JFS0VZX0RBVEFdID0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKKwlbTkw4MDIxMV9BVFRSX1NDQU5fU1VQUF9SQVRFU10gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogfTsKIAogLyogcG9saWN5IGZvciB0aGUga2V5IGF0dHJpYnV0ZXMgKi8KQEAgLTIwNCw2ICsyMDYsMTggQEAKIAlbTkw4MDIxMV9XT1dMQU5fVFJJR19ESVNDT05ORUNUXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAogCVtOTDgwMjExX1dPV0xBTl9UUklHX01BR0lDX1BLVF0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKIAlbTkw4MDIxMV9XT1dMQU5fVFJJR19QS1RfUEFUVEVSTl0gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtOTDgwMjExX1dPV0xBTl9UUklHX0dUS19SRUtFWV9GQUlMVVJFXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtOTDgwMjExX1dPV0xBTl9UUklHX0VBUF9JREVOVF9SRVFVRVNUXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtOTDgwMjExX1dPV0xBTl9UUklHXzRXQVlfSEFORFNIQUtFXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtOTDgwMjExX1dPV0xBTl9UUklHX1JGS0lMTF9SRUxFQVNFXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorfTsKKworLyogcG9saWN5IGZvciBHVEsgcmVrZXkgb2ZmbG9hZCBhdHRyaWJ1dGVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kKK25sODAyMTFfcmVrZXlfcG9saWN5W05VTV9OTDgwMjExX1JFS0VZX0RBVEFdID0geworCVtOTDgwMjExX1JFS0VZX0RBVEFfS0VLXSA9IHsgLmxlbiA9IE5MODAyMTFfS0VLX0xFTiB9LAorCVtOTDgwMjExX1JFS0VZX0RBVEFfS0NLXSA9IHsgLmxlbiA9IE5MODAyMTFfS0NLX0xFTiB9LAorCVtOTDgwMjExX1JFS0VZX0RBVEFfUkVQTEFZX0NUUl0gPSB7IC5sZW4gPSBOTDgwMjExX1JFUExBWV9DVFJfTEVOIH0sCiB9OwogCiAvKiBpZmlkeCBnZXQgaGVscGVyICovCkBAIC02ODMsOCArNjk3LDEyIEBACiAJCSAgICBkZXYtPndpcGh5LmNvdmVyYWdlX2NsYXNzKTsKIAlOTEFfUFVUX1U4KG1zZywgTkw4MDIxMV9BVFRSX01BWF9OVU1fU0NBTl9TU0lEUywKIAkJICAgZGV2LT53aXBoeS5tYXhfc2Nhbl9zc2lkcyk7CisJTkxBX1BVVF9VOChtc2csIE5MODAyMTFfQVRUUl9NQVhfTlVNX1NDSEVEX1NDQU5fU1NJRFMsCisJCSAgIGRldi0+d2lwaHkubWF4X3NjaGVkX3NjYW5fc3NpZHMpOwogCU5MQV9QVVRfVTE2KG1zZywgTkw4MDIxMV9BVFRSX01BWF9TQ0FOX0lFX0xFTiwKIAkJICAgIGRldi0+d2lwaHkubWF4X3NjYW5faWVfbGVuKTsKKwlOTEFfUFVUX1UxNihtc2csIE5MODAyMTFfQVRUUl9NQVhfU0NIRURfU0NBTl9JRV9MRU4sCisJCSAgICBkZXYtPndpcGh5Lm1heF9zY2hlZF9zY2FuX2llX2xlbik7CiAKIAlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSUJTU19SU04pCiAJCU5MQV9QVVRfRkxBRyhtc2csIE5MODAyMTFfQVRUUl9TVVBQT1JUX0lCU1NfUlNOKTsKQEAgLTkyMCw2ICs5MzgsMTYgQEAKIAkJCU5MQV9QVVRfRkxBRyhtc2csIE5MODAyMTFfV09XTEFOX1RSSUdfRElTQ09OTkVDVCk7CiAJCWlmIChkZXYtPndpcGh5Lndvd2xhbi5mbGFncyAmIFdJUEhZX1dPV0xBTl9NQUdJQ19QS1QpCiAJCQlOTEFfUFVUX0ZMQUcobXNnLCBOTDgwMjExX1dPV0xBTl9UUklHX01BR0lDX1BLVCk7CisJCWlmIChkZXYtPndpcGh5Lndvd2xhbi5mbGFncyAmIFdJUEhZX1dPV0xBTl9TVVBQT1JUU19HVEtfUkVLRVkpCisJCQlOTEFfUFVUX0ZMQUcobXNnLCBOTDgwMjExX1dPV0xBTl9UUklHX0dUS19SRUtFWV9TVVBQT1JURUQpOworCQlpZiAoZGV2LT53aXBoeS53b3dsYW4uZmxhZ3MgJiBXSVBIWV9XT1dMQU5fR1RLX1JFS0VZX0ZBSUxVUkUpCisJCQlOTEFfUFVUX0ZMQUcobXNnLCBOTDgwMjExX1dPV0xBTl9UUklHX0dUS19SRUtFWV9GQUlMVVJFKTsKKwkJaWYgKGRldi0+d2lwaHkud293bGFuLmZsYWdzICYgV0lQSFlfV09XTEFOX0VBUF9JREVOVElUWV9SRVEpCisJCQlOTEFfUFVUX0ZMQUcobXNnLCBOTDgwMjExX1dPV0xBTl9UUklHX0VBUF9JREVOVF9SRVFVRVNUKTsKKwkJaWYgKGRldi0+d2lwaHkud293bGFuLmZsYWdzICYgV0lQSFlfV09XTEFOXzRXQVlfSEFORFNIQUtFKQorCQkJTkxBX1BVVF9GTEFHKG1zZywgTkw4MDIxMV9XT1dMQU5fVFJJR180V0FZX0hBTkRTSEFLRSk7CisJCWlmIChkZXYtPndpcGh5Lndvd2xhbi5mbGFncyAmIFdJUEhZX1dPV0xBTl9SRktJTExfUkVMRUFTRSkKKwkJCU5MQV9QVVRfRkxBRyhtc2csIE5MODAyMTFfV09XTEFOX1RSSUdfUkZLSUxMX1JFTEVBU0UpOwogCQlpZiAoZGV2LT53aXBoeS53b3dsYW4ubl9wYXR0ZXJucykgewogCQkJc3RydWN0IG5sODAyMTFfd293bGFuX3BhdHRlcm5fc3VwcG9ydCBwYXQgPSB7CiAJCQkJLm1heF9wYXR0ZXJucyA9IGRldi0+d2lwaHkud293bGFuLm5fcGF0dGVybnMsCkBAIC0zMjk3LDcgKzMzMjUsNiBAQAogCXN0cnVjdCBubGF0dHIgKmF0dHI7CiAJc3RydWN0IHdpcGh5ICp3aXBoeTsKIAlpbnQgZXJyLCB0bXAsIG5fc3NpZHMgPSAwLCBuX2NoYW5uZWxzLCBpOwotCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKIAlzaXplX3QgaWVfbGVuOwogCiAJaWYgKCFpc192YWxpZF9pZV9hdHRyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9JRV0pKQpAQCAtMzMxNyw2ICszMzQ0LDcgQEAKIAkJaWYgKCFuX2NoYW5uZWxzKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKKwkJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwogCQluX2NoYW5uZWxzID0gMDsKIAogCQlmb3IgKGJhbmQgPSAwOyBiYW5kIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgYmFuZCsrKQpAQCAtMzM3Nyw2ICszNDA1LDggQEAKIAkJCWkrKzsKIAkJfQogCX0gZWxzZSB7CisJCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKKwogCQkvKiBhbGwgY2hhbm5lbHMgKi8KIAkJZm9yIChiYW5kID0gMDsgYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGJhbmQrKykgewogCQkJaW50IGo7CkBAIC0zNDA2LDExICszNDM2LDExIEBACiAJaSA9IDA7CiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TQ0FOX1NTSURTXSkgewogCQlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TQ0FOX1NTSURTXSwgdG1wKSB7Ci0JCQlyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbiA9IG5sYV9sZW4oYXR0cik7Ci0JCQlpZiAocmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4gPiBJRUVFODAyMTFfTUFYX1NTSURfTEVOKSB7CisJCQlpZiAobmxhX2xlbihhdHRyKSA+IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJCWdvdG8gb3V0X2ZyZWU7CiAJCQl9CisJCQlyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbiA9IG5sYV9sZW4oYXR0cik7CiAJCQltZW1jcHkocmVxdWVzdC0+c3NpZHNbaV0uc3NpZCwgbmxhX2RhdGEoYXR0ciksIG5sYV9sZW4oYXR0cikpOwogCQkJaSsrOwogCQl9CkBAIC0zNDIzLDYgKzM0NTMsMzAgQEAKIAkJICAgICAgIHJlcXVlc3QtPmllX2xlbik7CiAJfQogCisJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGkrKykKKwkJaWYgKHdpcGh5LT5iYW5kc1tpXSkKKwkJCXJlcXVlc3QtPnJhdGVzW2ldID0KKwkJCQkoMSA8PCB3aXBoeS0+YmFuZHNbaV0tPm5fYml0cmF0ZXMpIC0gMTsKKworCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU0NBTl9TVVBQX1JBVEVTXSkgeworCQlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsCisJCQkJICAgIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TQ0FOX1NVUFBfUkFURVNdLAorCQkJCSAgICB0bXApIHsKKwkJCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCA9IG5sYV90eXBlKGF0dHIpOworCisJCQlpZiAoYmFuZCA8IDAgfHwgYmFuZCA+IElFRUU4MDIxMV9OVU1fQkFORFMpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCQllcnIgPSBpZWVlODAyMTFfZ2V0X3JhdGVtYXNrKHdpcGh5LT5iYW5kc1tiYW5kXSwKKwkJCQkJCSAgICAgbmxhX2RhdGEoYXR0ciksCisJCQkJCQkgICAgIG5sYV9sZW4oYXR0ciksCisJCQkJCQkgICAgICZyZXF1ZXN0LT5yYXRlc1tiYW5kXSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwl9CisKIAlyZXF1ZXN0LT5kZXYgPSBkZXY7CiAJcmVxdWVzdC0+d2lwaHkgPSAmcmRldi0+d2lwaHk7CiAKQEAgLTM0NjEsOSArMzUxNSw2IEBACiAJaWYgKCFpc192YWxpZF9pZV9hdHRyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9JRV0pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChyZGV2LT5zY2hlZF9zY2FuX3JlcSkKLQkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKLQogCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fSU5URVJWQUxdKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMzQ5MSw3ICszNTQyLDcgQEAKIAkJCQkgICAgdG1wKQogCQkJbl9zc2lkcysrOwogCi0JaWYgKG5fc3NpZHMgPiB3aXBoeS0+bWF4X3NjYW5fc3NpZHMpCisJaWYgKG5fc3NpZHMgPiB3aXBoeS0+bWF4X3NjaGVkX3NjYW5fc3NpZHMpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9JRV0pCkBAIC0zNDk5LDE1ICszNTUwLDI0IEBACiAJZWxzZQogCQlpZV9sZW4gPSAwOwogCi0JaWYgKGllX2xlbiA+IHdpcGh5LT5tYXhfc2Nhbl9pZV9sZW4pCisJaWYgKGllX2xlbiA+IHdpcGh5LT5tYXhfc2NoZWRfc2Nhbl9pZV9sZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCisJbXV0ZXhfbG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOworCisJaWYgKHJkZXYtPnNjaGVkX3NjYW5fcmVxKSB7CisJCWVyciA9IC1FSU5QUk9HUkVTUzsKKwkJZ290byBvdXQ7CisJfQorCiAJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KQogCQkJKyBzaXplb2YoKnJlcXVlc3QtPnNzaWRzKSAqIG5fc3NpZHMKIAkJCSsgc2l6ZW9mKCpyZXF1ZXN0LT5jaGFubmVscykgKiBuX2NoYW5uZWxzCiAJCQkrIGllX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXF1ZXN0KQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIXJlcXVlc3QpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQogCiAJaWYgKG5fc3NpZHMpCiAJCXJlcXVlc3QtPnNzaWRzID0gKHZvaWQgKikmcmVxdWVzdC0+Y2hhbm5lbHNbbl9jaGFubmVsc107CkBAIC0zNTcyLDEyICszNjMyLDExIEBACiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TQ0FOX1NTSURTXSkgewogCQlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TQ0FOX1NTSURTXSwKIAkJCQkgICAgdG1wKSB7Ci0JCQlyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbiA9IG5sYV9sZW4oYXR0cik7Ci0JCQlpZiAocmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4gPgotCQkJICAgIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKKwkJCWlmIChubGFfbGVuKGF0dHIpID4gSUVFRTgwMjExX01BWF9TU0lEX0xFTikgewogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJZ290byBvdXRfZnJlZTsKIAkJCX0KKwkJCXJlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuID0gbmxhX2xlbihhdHRyKTsKIAkJCW1lbWNweShyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLCBubGFfZGF0YShhdHRyKSwKIAkJCSAgICAgICBubGFfbGVuKGF0dHIpKTsKIAkJCWkrKzsKQEAgLTM2MDYsNiArMzY2NSw3IEBACiBvdXRfZnJlZToKIAlrZnJlZShyZXF1ZXN0KTsKIG91dDoKKwltdXRleF91bmxvY2soJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zNjEzLDE1ICszNjczLDIxIEBACiAJCQkJICAgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKKwlpbnQgZXJyOwogCiAJaWYgKCEocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX1NVUFBPUlRTX1NDSEVEX1NDQU4pIHx8CiAJICAgICFyZGV2LT5vcHMtPnNjaGVkX3NjYW5fc3RvcCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JcmV0dXJuIF9fY2ZnODAyMTFfc3RvcF9zY2hlZF9zY2FuKHJkZXYsIGZhbHNlKTsKKwltdXRleF9sb2NrKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CisJZXJyID0gX19jZmc4MDIxMV9zdG9wX3NjaGVkX3NjYW4ocmRldiwgZmFsc2UpOworCW11dGV4X3VubG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOworCisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBubDgwMjExX3NlbmRfYnNzKHN0cnVjdCBza19idWZmICptc2csIHUzMiBwaWQsIHUzMiBzZXEsIGludCBmbGFncywKK3N0YXRpYyBpbnQgbmw4MDIxMV9zZW5kX2JzcyhzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQkgICAgdTMyIHNlcSwgaW50IGZsYWdzLAogCQkJICAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCSAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAogCQkJICAgIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKmludGJzcykKQEAgLTM2MzMsMTEgKzM2OTksMTMgQEAKIAogCUFTU0VSVF9XREVWX0xPQ0sod2Rldik7CiAKLQloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIHBpZCwgc2VxLCBmbGFncywKKwloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLCBzZXEsIGZsYWdzLAogCQkJICAgICBOTDgwMjExX0NNRF9ORVdfU0NBTl9SRVNVTFRTKTsKIAlpZiAoIWhkcikKIAkJcmV0dXJuIC0xOwogCisJZ2VubF9kdW1wX2NoZWNrX2NvbnNpc3RlbnQoY2IsIGhkciwgJm5sODAyMTFfZmFtKTsKKwogCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0dFTkVSQVRJT04sIHJkZXYtPmJzc19nZW5lcmF0aW9uKTsKIAlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCB3ZGV2LT5uZXRkZXYtPmlmaW5kZXgpOwogCkBAIC0zNzI2LDExICszNzk0LDEyIEBACiAJc3Bpbl9sb2NrX2JoKCZyZGV2LT5ic3NfbG9jayk7CiAJY2ZnODAyMTFfYnNzX2V4cGlyZShyZGV2KTsKIAorCWNiLT5zZXEgPSByZGV2LT5ic3NfZ2VuZXJhdGlvbjsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2NhbiwgJnJkZXYtPmJzc19saXN0LCBsaXN0KSB7CiAJCWlmICgrK2lkeCA8PSBzdGFydCkKIAkJCWNvbnRpbnVlOwotCQlpZiAobmw4MDIxMV9zZW5kX2Jzcyhza2IsCi0JCQkJTkVUTElOS19DQihjYi0+c2tiKS5waWQsCisJCWlmIChubDgwMjExX3NlbmRfYnNzKHNrYiwgY2IsCiAJCQkJY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwKIAkJCQlyZGV2LCB3ZGV2LCBzY2FuKSA8IDApIHsKIAkJCWlkeC0tOwpAQCAtMzc1NCwxMCArMzgyMyw2IEBACiAJdm9pZCAqaGRyOwogCXN0cnVjdCBubGF0dHIgKmluZm9hdHRyOwogCi0JLyogU3VydmV5IHdpdGhvdXQgYSBjaGFubmVsIGRvZXNuJ3QgbWFrZSBzZW5zZSAqLwotCWlmICghc3VydmV5LT5jaGFubmVsKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWhkciA9IG5sODAyMTFoZHJfcHV0KG1zZywgcGlkLCBzZXEsIGZsYWdzLAogCQkJICAgICBOTDgwMjExX0NNRF9ORVdfU1VSVkVZX1JFU1VMVFMpOwogCWlmICghaGRyKQpAQCAtMzgyMCw2ICszODg1LDggQEAKIAl9CiAKIAl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CisKIAkJcmVzID0gZGV2LT5vcHMtPmR1bXBfc3VydmV5KCZkZXYtPndpcGh5LCBuZXRkZXYsIHN1cnZleV9pZHgsCiAJCQkJCSAgICAmc3VydmV5KTsKIAkJaWYgKHJlcyA9PSAtRU5PRU5UKQpAQCAtMzgyNyw2ICszODk0LDE5IEBACiAJCWlmIChyZXMpCiAJCQlnb3RvIG91dF9lcnI7CiAKKwkJLyogU3VydmV5IHdpdGhvdXQgYSBjaGFubmVsIGRvZXNuJ3QgbWFrZSBzZW5zZSAqLworCQlpZiAoIXN1cnZleS5jaGFubmVsKSB7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQljaGFuID0gaWVlZTgwMjExX2dldF9jaGFubmVsKCZkZXYtPndpcGh5LAorCQkJCQkgICAgIHN1cnZleS5jaGFubmVsLT5jZW50ZXJfZnJlcSk7CisJCWlmICghY2hhbiB8fCBjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSB7CisJCQlzdXJ2ZXlfaWR4Kys7CisJCQljb250aW51ZTsKKwkJfQorCiAJCWlmIChubDgwMjExX3NlbmRfc3VydmV5KHNrYiwKIAkJCQlORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKIAkJCQljYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLApAQCAtNDI4MywyNSArNDM2MywxMiBAQAogCQkJbmxhX2xlbihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQlNTX0JBU0lDX1JBVEVTXSk7CiAJCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kID0KIAkJCXdpcGh5LT5iYW5kc1tpYnNzLmNoYW5uZWwtPmJhbmRdOwotCQlpbnQgaSwgajsKKwkJaW50IGVycjsKIAotCQlpZiAobl9yYXRlcyA9PSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG5fcmF0ZXM7IGkrKykgewotCQkJaW50IHJhdGUgPSAocmF0ZXNbaV0gJiAweDdmKSAqIDU7Ci0JCQlib29sIGZvdW5kID0gZmFsc2U7Ci0KLQkJCWZvciAoaiA9IDA7IGogPCBzYmFuZC0+bl9iaXRyYXRlczsgaisrKSB7Ci0JCQkJaWYgKHNiYW5kLT5iaXRyYXRlc1tqXS5iaXRyYXRlID09IHJhdGUpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlpYnNzLmJhc2ljX3JhdGVzIHw9IEJJVChqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQorCQllcnIgPSBpZWVlODAyMTFfZ2V0X3JhdGVtYXNrKHNiYW5kLCByYXRlcywgbl9yYXRlcywKKwkJCQkJICAgICAmaWJzcy5iYXNpY19yYXRlcyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUNBU1RfUkFURV0gJiYKQEAgLTQzNjEsNiArNDQyOCw5MyBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgbmw4MDIxMV90ZXN0bW9kZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCWxvbmcgcGh5X2lkeDsKKwl2b2lkICpkYXRhID0gTlVMTDsKKwlpbnQgZGF0YV9sZW4gPSAwOworCisJaWYgKGNiLT5hcmdzWzBdKSB7CisJCS8qCisJCSAqIDAgaXMgYSB2YWxpZCBpbmRleCwgYnV0IG5vdCB2YWxpZCBmb3IgYXJnc1swXSwKKwkJICogc28gd2UgbmVlZCB0byBvZmZzZXQgYnkgMS4KKwkJICovCisJCXBoeV9pZHggPSBjYi0+YXJnc1swXSAtIDE7CisJfSBlbHNlIHsKKwkJZXJyID0gbmxtc2dfcGFyc2UoY2ItPm5saCwgR0VOTF9IRFJMRU4gKyBubDgwMjExX2ZhbS5oZHJzaXplLAorCQkJCSAgbmw4MDIxMV9mYW0uYXR0cmJ1Ziwgbmw4MDIxMV9mYW0ubWF4YXR0ciwKKwkJCQkgIG5sODAyMTFfcG9saWN5KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWlmICghbmw4MDIxMV9mYW0uYXR0cmJ1ZltOTDgwMjExX0FUVFJfV0lQSFldKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXBoeV9pZHggPSBubGFfZ2V0X3UzMihubDgwMjExX2ZhbS5hdHRyYnVmW05MODAyMTFfQVRUUl9XSVBIWV0pOworCQlpZiAobmw4MDIxMV9mYW0uYXR0cmJ1ZltOTDgwMjExX0FUVFJfVEVTVERBVEFdKQorCQkJY2ItPmFyZ3NbMV0gPQorCQkJCShsb25nKW5sODAyMTFfZmFtLmF0dHJidWZbTkw4MDIxMV9BVFRSX1RFU1REQVRBXTsKKwl9CisKKwlpZiAoY2ItPmFyZ3NbMV0pIHsKKwkJZGF0YSA9IG5sYV9kYXRhKCh2b2lkICopY2ItPmFyZ3NbMV0pOworCQlkYXRhX2xlbiA9IG5sYV9sZW4oKHZvaWQgKiljYi0+YXJnc1sxXSk7CisJfQorCisJbXV0ZXhfbG9jaygmY2ZnODAyMTFfbXV0ZXgpOworCWRldiA9IGNmZzgwMjExX3JkZXZfYnlfd2lwaHlfaWR4KHBoeV9pZHgpOworCWlmICghZGV2KSB7CisJCW11dGV4X3VubG9jaygmY2ZnODAyMTFfbXV0ZXgpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJY2ZnODAyMTFfbG9ja19yZGV2KGRldik7CisJbXV0ZXhfdW5sb2NrKCZjZmc4MDIxMV9tdXRleCk7CisKKwlpZiAoIWRldi0+b3BzLT50ZXN0bW9kZV9kdW1wKSB7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJdm9pZCAqaGRyID0gbmw4MDIxMWhkcl9wdXQoc2tiLCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKKwkJCQkJICAgY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwKKwkJCQkJICAgTkw4MDIxMV9DTURfVEVTVE1PREUpOworCQlzdHJ1Y3QgbmxhdHRyICp0bWRhdGE7CisKKwkJaWYgKG5sYV9wdXRfdTMyKHNrYiwgTkw4MDIxMV9BVFRSX1dJUEhZLCBkZXYtPndpcGh5X2lkeCkgPCAwKSB7CisJCQlnZW5sbXNnX2NhbmNlbChza2IsIGhkcik7CisJCQlicmVhazsKKwkJfQorCisJCXRtZGF0YSA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgTkw4MDIxMV9BVFRSX1RFU1REQVRBKTsKKwkJaWYgKCF0bWRhdGEpIHsKKwkJCWdlbmxtc2dfY2FuY2VsKHNrYiwgaGRyKTsKKwkJCWJyZWFrOworCQl9CisJCWVyciA9IGRldi0+b3BzLT50ZXN0bW9kZV9kdW1wKCZkZXYtPndpcGh5LCBza2IsIGNiLAorCQkJCQkgICAgICBkYXRhLCBkYXRhX2xlbik7CisJCW5sYV9uZXN0X2VuZChza2IsIHRtZGF0YSk7CisKKwkJaWYgKGVyciA9PSAtRU5PQlVGUyB8fCBlcnIgPT0gLUVOT0VOVCkgeworCQkJZ2VubG1zZ19jYW5jZWwoc2tiLCBoZHIpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoZXJyKSB7CisJCQlnZW5sbXNnX2NhbmNlbChza2IsIGhkcik7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQlnZW5sbXNnX2VuZChza2IsIGhkcik7CisJfQorCisJZXJyID0gc2tiLT5sZW47CisJLyogc2VlIGFib3ZlICovCisJY2ItPmFyZ3NbMF0gPSBwaHlfaWR4ICsgMTsKKyBvdXRfZXJyOgorCWNmZzgwMjExX3VubG9ja19yZGV2KGRldik7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIHN0cnVjdCBza19idWZmICoKIF9fY2ZnODAyMTFfdGVzdG1vZGVfYWxsb2Nfc2tiKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCSAgICAgIGludCBhcHByb3hsZW4sIHUzMiBwaWQsIHUzMiBzZXEsIGdmcF90IGdmcCkKQEAgLTUxNTAsNiArNTMwNCwxNCBAQAogCQkJTkxBX1BVVF9GTEFHKG1zZywgTkw4MDIxMV9XT1dMQU5fVFJJR19ESVNDT05ORUNUKTsKIAkJaWYgKHJkZXYtPndvd2xhbi0+bWFnaWNfcGt0KQogCQkJTkxBX1BVVF9GTEFHKG1zZywgTkw4MDIxMV9XT1dMQU5fVFJJR19NQUdJQ19QS1QpOworCQlpZiAocmRldi0+d293bGFuLT5ndGtfcmVrZXlfZmFpbHVyZSkKKwkJCU5MQV9QVVRfRkxBRyhtc2csIE5MODAyMTFfV09XTEFOX1RSSUdfR1RLX1JFS0VZX0ZBSUxVUkUpOworCQlpZiAocmRldi0+d293bGFuLT5lYXBfaWRlbnRpdHlfcmVxKQorCQkJTkxBX1BVVF9GTEFHKG1zZywgTkw4MDIxMV9XT1dMQU5fVFJJR19FQVBfSURFTlRfUkVRVUVTVCk7CisJCWlmIChyZGV2LT53b3dsYW4tPmZvdXJfd2F5X2hhbmRzaGFrZSkKKwkJCU5MQV9QVVRfRkxBRyhtc2csIE5MODAyMTFfV09XTEFOX1RSSUdfNFdBWV9IQU5EU0hBS0UpOworCQlpZiAocmRldi0+d293bGFuLT5yZmtpbGxfcmVsZWFzZSkKKwkJCU5MQV9QVVRfRkxBRyhtc2csIE5MODAyMTFfV09XTEFOX1RSSUdfUkZLSUxMX1JFTEVBU0UpOwogCQlpZiAocmRldi0+d293bGFuLT5uX3BhdHRlcm5zKSB7CiAJCQlzdHJ1Y3QgbmxhdHRyICpubF9wYXRzLCAqbmxfcGF0OwogCQkJaW50IGksIHBhdF9sZW47CkBAIC01MjI2LDYgKzUzODgsMzMgQEAKIAkJbmV3X3RyaWdnZXJzLm1hZ2ljX3BrdCA9IHRydWU7CiAJfQogCisJaWYgKHRiW05MODAyMTFfV09XTEFOX1RSSUdfR1RLX1JFS0VZX1NVUFBPUlRFRF0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW05MODAyMTFfV09XTEFOX1RSSUdfR1RLX1JFS0VZX0ZBSUxVUkVdKSB7CisJCWlmICghKHdvd2xhbi0+ZmxhZ3MgJiBXSVBIWV9XT1dMQU5fR1RLX1JFS0VZX0ZBSUxVUkUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW5ld190cmlnZ2Vycy5ndGtfcmVrZXlfZmFpbHVyZSA9IHRydWU7CisJfQorCisJaWYgKHRiW05MODAyMTFfV09XTEFOX1RSSUdfRUFQX0lERU5UX1JFUVVFU1RdKSB7CisJCWlmICghKHdvd2xhbi0+ZmxhZ3MgJiBXSVBIWV9XT1dMQU5fRUFQX0lERU5USVRZX1JFUSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbmV3X3RyaWdnZXJzLmVhcF9pZGVudGl0eV9yZXEgPSB0cnVlOworCX0KKworCWlmICh0YltOTDgwMjExX1dPV0xBTl9UUklHXzRXQVlfSEFORFNIQUtFXSkgeworCQlpZiAoISh3b3dsYW4tPmZsYWdzICYgV0lQSFlfV09XTEFOXzRXQVlfSEFORFNIQUtFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQluZXdfdHJpZ2dlcnMuZm91cl93YXlfaGFuZHNoYWtlID0gdHJ1ZTsKKwl9CisKKwlpZiAodGJbTkw4MDIxMV9XT1dMQU5fVFJJR19SRktJTExfUkVMRUFTRV0pIHsKKwkJaWYgKCEod293bGFuLT5mbGFncyAmIFdJUEhZX1dPV0xBTl9SRktJTExfUkVMRUFTRSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbmV3X3RyaWdnZXJzLnJma2lsbF9yZWxlYXNlID0gdHJ1ZTsKKwl9CisKIAlpZiAodGJbTkw4MDIxMV9XT1dMQU5fVFJJR19QS1RfUEFUVEVSTl0pIHsKIAkJc3RydWN0IG5sYXR0ciAqcGF0OwogCQlpbnQgbl9wYXR0ZXJucyA9IDA7CkBAIC01MzA3LDYgKzU0OTYsNTcgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IG5sODAyMTFfc2V0X3Jla2V5X2RhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+dXNlcl9wdHJbMV07CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKKwlzdHJ1Y3QgbmxhdHRyICp0YltOVU1fTkw4MDIxMV9SRUtFWV9EQVRBXTsKKwlzdHJ1Y3QgY2ZnODAyMTFfZ3RrX3Jla2V5X2RhdGEgcmVrZXlfZGF0YTsKKwlpbnQgZXJyOworCisJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUkVLRVlfREFUQV0pCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gbmxhX3BhcnNlKHRiLCBNQVhfTkw4MDIxMV9SRUtFWV9EQVRBLAorCQkJbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFS0VZX0RBVEFdKSwKKwkJCW5sYV9sZW4oaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFS0VZX0RBVEFdKSwKKwkJCW5sODAyMTFfcmVrZXlfcG9saWN5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKG5sYV9sZW4odGJbTkw4MDIxMV9SRUtFWV9EQVRBX1JFUExBWV9DVFJdKSAhPSBOTDgwMjExX1JFUExBWV9DVFJfTEVOKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlpZiAobmxhX2xlbih0YltOTDgwMjExX1JFS0VZX0RBVEFfS0VLXSkgIT0gTkw4MDIxMV9LRUtfTEVOKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlpZiAobmxhX2xlbih0YltOTDgwMjExX1JFS0VZX0RBVEFfS0NLXSkgIT0gTkw4MDIxMV9LQ0tfTEVOKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCW1lbWNweShyZWtleV9kYXRhLmtlaywgbmxhX2RhdGEodGJbTkw4MDIxMV9SRUtFWV9EQVRBX0tFS10pLAorCSAgICAgICBOTDgwMjExX0tFS19MRU4pOworCW1lbWNweShyZWtleV9kYXRhLmtjaywgbmxhX2RhdGEodGJbTkw4MDIxMV9SRUtFWV9EQVRBX0tDS10pLAorCSAgICAgICBOTDgwMjExX0tDS19MRU4pOworCW1lbWNweShyZWtleV9kYXRhLnJlcGxheV9jdHIsCisJICAgICAgIG5sYV9kYXRhKHRiW05MODAyMTFfUkVLRVlfREFUQV9SRVBMQVlfQ1RSXSksCisJICAgICAgIE5MODAyMTFfUkVQTEFZX0NUUl9MRU4pOworCisJd2Rldl9sb2NrKHdkZXYpOworCWlmICghd2Rldi0+Y3VycmVudF9ic3MpIHsKKwkJZXJyID0gLUVOT1RDT05OOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXJkZXYtPm9wcy0+c2V0X3Jla2V5X2RhdGEpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHJkZXYtPm9wcy0+c2V0X3Jla2V5X2RhdGEoJnJkZXYtPndpcGh5LCBkZXYsICZyZWtleV9kYXRhKTsKKyBvdXQ6CisJd2Rldl91bmxvY2sod2Rldik7CisJcmV0dXJuIGVycjsKK30KKwogI2RlZmluZSBOTDgwMjExX0ZMQUdfTkVFRF9XSVBIWQkJMHgwMQogI2RlZmluZSBOTDgwMjExX0ZMQUdfTkVFRF9ORVRERVYJMHgwMgogI2RlZmluZSBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MCQkweDA0CkBAIC01NjU4LDYgKzU4OTgsNyBAQAogCXsKIAkJLmNtZCA9IE5MODAyMTFfQ01EX1RFU1RNT0RFLAogCQkuZG9pdCA9IG5sODAyMTFfdGVzdG1vZGVfZG8sCisJCS5kdW1waXQgPSBubDgwMjExX3Rlc3Rtb2RlX2R1bXAsCiAJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKIAkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAogCQkuaW50ZXJuYWxfZmxhZ3MgPSBOTDgwMjExX0ZMQUdfTkVFRF9XSVBIWSB8CkBAIC01ODM3LDYgKzYwNzgsMTQgQEAKIAkJLmludGVybmFsX2ZsYWdzID0gTkw4MDIxMV9GTEFHX05FRURfV0lQSFkgfAogCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKIAl9LAorCXsKKwkJLmNtZCA9IE5MODAyMTFfQ01EX1NFVF9SRUtFWV9PRkZMT0FELAorCQkuZG9pdCA9IG5sODAyMTFfc2V0X3Jla2V5X2RhdGEsCisJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkuaW50ZXJuYWxfZmxhZ3MgPSBOTDgwMjExX0ZMQUdfTkVFRF9ORVRERVZfVVAgfAorCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBubDgwMjExX21sbWVfbWNncnAgPSB7CkBAIC02NDY0LDcgKzY3MTMsOCBAQAogCWlmIChhZGRyKQogCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIGFkZHIpOwogCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0tFWV9UWVBFLCBrZXlfdHlwZSk7Ci0JTkxBX1BVVF9VOChtc2csIE5MODAyMTFfQVRUUl9LRVlfSURYLCBrZXlfaWQpOworCWlmIChrZXlfaWQgIT0gLTEpCisJCU5MQV9QVVRfVTgobXNnLCBOTDgwMjExX0FUVFJfS0VZX0lEWCwga2V5X2lkKTsKIAlpZiAodHNjKQogCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX0tFWV9TRVEsIDYsIHRzYyk7CiAKQEAgLTY3ODAsNiArNzAzMCw1MSBAQAogCW5sbXNnX2ZyZWUobXNnKTsKIH0KIAordm9pZCBubDgwMjExX2d0a19yZWtleV9ub3RpZnkoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAorCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgY29uc3QgdTggKmJzc2lkLAorCQkJICAgICAgY29uc3QgdTggKnJlcGxheV9jdHIsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXN0cnVjdCBubGF0dHIgKnJla2V5X2F0dHI7CisJdm9pZCAqaGRyOworCisJbXNnID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBnZnApOworCWlmICghbXNnKQorCQlyZXR1cm47CisKKwloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIDAsIDAsIDAsIE5MODAyMTFfQ01EX1NFVF9SRUtFWV9PRkZMT0FEKTsKKwlpZiAoIWhkcikgeworCQlubG1zZ19mcmVlKG1zZyk7CisJCXJldHVybjsKKwl9CisKKwlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWSwgcmRldi0+d2lwaHlfaWR4KTsKKwlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCBuZXRkZXYtPmlmaW5kZXgpOworCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfTUFDLCBFVEhfQUxFTiwgYnNzaWQpOworCisJcmVrZXlfYXR0ciA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX1JFS0VZX0RBVEEpOworCWlmICghcmVrZXlfYXR0cikKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlOTEFfUFVUKG1zZywgTkw4MDIxMV9SRUtFWV9EQVRBX1JFUExBWV9DVFIsCisJCU5MODAyMTFfUkVQTEFZX0NUUl9MRU4sIHJlcGxheV9jdHIpOworCisJbmxhX25lc3RfZW5kKG1zZywgcmVrZXlfYXR0cik7CisKKwlpZiAoZ2VubG1zZ19lbmQobXNnLCBoZHIpIDwgMCkgeworCQlubG1zZ19mcmVlKG1zZyk7CisJCXJldHVybjsKKwl9CisKKwlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAorCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKKwlyZXR1cm47CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCW5sbXNnX2ZyZWUobXNnKTsKK30KKwogdm9pZAogbmw4MDIxMV9zZW5kX2NxbV9wa3Rsb3NzX25vdGlmeShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgY29uc3QgdTggKnBlZXIsCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuaAppbmRleCAyZjFiZmI4Li41ZDY5YzU2IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmgKQEAgLTEwOSw0ICsxMDksOCBAQAogCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGNvbnN0IHU4ICpwZWVyLAogCQkJCXUzMiBudW1fcGFja2V0cywgZ2ZwX3QgZ2ZwKTsKIAordm9pZCBubDgwMjExX2d0a19yZWtleV9ub3RpZnkoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAorCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgY29uc3QgdTggKmJzc2lkLAorCQkJICAgICAgY29uc3QgdTggKnJlcGxheV9jdHIsIGdmcF90IGdmcCk7CisKICNlbmRpZiAvKiBfX05FVF9XSVJFTEVTU19OTDgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zY2FuLmMgYi9uZXQvd2lyZWxlc3Mvc2Nhbi5jCmluZGV4IDdhNmM2NzYuLjI5MzZjYjggMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zY2FuLmMKKysrIGIvbmV0L3dpcmVsZXNzL3NjYW4uYwpAQCAtMTAwLDE0ICsxMDAsMTQgQEAKIAlyZGV2ID0gY29udGFpbmVyX29mKHdrLCBzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UsCiAJCQkgICAgc2NoZWRfc2Nhbl9yZXN1bHRzX3drKTsKIAotCWNmZzgwMjExX2xvY2tfcmRldihyZGV2KTsKKwltdXRleF9sb2NrKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CiAKIAkvKiB3ZSBkb24ndCBoYXZlIHNjaGVkX3NjYW5fcmVxIGFueW1vcmUgaWYgdGhlIHNjYW4gaXMgc3RvcHBpbmcgKi8KIAlpZiAocmRldi0+c2NoZWRfc2Nhbl9yZXEpCiAJCW5sODAyMTFfc2VuZF9zY2hlZF9zY2FuX3Jlc3VsdHMocmRldiwKIAkJCQkJCXJkZXYtPnNjaGVkX3NjYW5fcmVxLT5kZXYpOwogCi0JY2ZnODAyMTFfdW5sb2NrX3JkZXYocmRldik7CisJbXV0ZXhfdW5sb2NrKCZyZGV2LT5zY2hlZF9zY2FuX210eCk7CiB9CiAKIHZvaWQgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXN1bHRzKHN0cnVjdCB3aXBoeSAqd2lwaHkpCkBAIC0xMjMsMjcgKzEyMywyNiBAQAogewogCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CiAKLQljZmc4MDIxMV9sb2NrX3JkZXYocmRldik7CisJbXV0ZXhfbG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOwogCV9fY2ZnODAyMTFfc3RvcF9zY2hlZF9zY2FuKHJkZXYsIHRydWUpOwotCWNmZzgwMjExX3VubG9ja19yZGV2KHJkZXYpOworCW11dGV4X3VubG9jaygmcmRldi0+c2NoZWRfc2Nhbl9tdHgpOwogfQogRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWQpOwogCiBpbnQgX19jZmc4MDIxMV9zdG9wX3NjaGVkX3NjYW4oc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkJICAgICAgIGJvb2wgZHJpdmVyX2luaXRpYXRlZCkKIHsKLQlpbnQgZXJyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAKLQlBU1NFUlRfUkRFVl9MT0NLKHJkZXYpOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnJkZXYtPnNjaGVkX3NjYW5fbXR4KTsKIAogCWlmICghcmRldi0+c2NoZWRfc2Nhbl9yZXEpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVOT0VOVDsKIAogCWRldiA9IHJkZXYtPnNjaGVkX3NjYW5fcmVxLT5kZXY7CiAKIAlpZiAoIWRyaXZlcl9pbml0aWF0ZWQpIHsKLQkJZXJyID0gcmRldi0+b3BzLT5zY2hlZF9zY2FuX3N0b3AoJnJkZXYtPndpcGh5LCBkZXYpOworCQlpbnQgZXJyID0gcmRldi0+b3BzLT5zY2hlZF9zY2FuX3N0b3AoJnJkZXYtPndpcGh5LCBkZXYpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0xNTMsNyArMTUyLDcgQEAKIAlrZnJlZShyZGV2LT5zY2hlZF9zY2FuX3JlcSk7CiAJcmRldi0+c2NoZWRfc2Nhbl9yZXEgPSBOVUxMOwogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYnNzX3JlbGVhc2Uoc3RydWN0IGtyZWYgKnJlZikKQEAgLTg2Myw2ICs4NjIsMTAgQEAKIAkJCWNyZXEtPm5fc3NpZHMgPSAwOwogCX0KIAorCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTlVNX0JBTkRTOyBpKyspCisJCWlmICh3aXBoeS0+YmFuZHNbaV0pCisJCQljcmVxLT5yYXRlc1tpXSA9ICgxIDw8IHdpcGh5LT5iYW5kc1tpXS0+bl9iaXRyYXRlcykgLSAxOworCiAJcmRldi0+c2Nhbl9yZXEgPSBjcmVxOwogCWVyciA9IHJkZXYtPm9wcy0+c2Nhbih3aXBoeSwgZGV2LCBjcmVxKTsKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvdXRpbC5jIGIvbmV0L3dpcmVsZXNzL3V0aWwuYwppbmRleCA0ZDdiODNmLi5iZTc1YTNhIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvdXRpbC5jCisrKyBiL25ldC93aXJlbGVzcy91dGlsLmMKQEAgLTEwMDYsMyArMTAwNiw0MSBAQAogCiAJcmV0dXJuIC1FQlVTWTsKIH0KKworaW50IGllZWU4MDIxMV9nZXRfcmF0ZW1hc2soc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkgICBjb25zdCB1OCAqcmF0ZXMsIHVuc2lnbmVkIGludCBuX3JhdGVzLAorCQkJICAgdTMyICptYXNrKQoreworCWludCBpLCBqOworCisJaWYgKCFzYmFuZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobl9yYXRlcyA9PSAwIHx8IG5fcmF0ZXMgPiBOTDgwMjExX01BWF9TVVBQX1JBVEVTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSptYXNrID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBuX3JhdGVzOyBpKyspIHsKKwkJaW50IHJhdGUgPSAocmF0ZXNbaV0gJiAweDdmKSAqIDU7CisJCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCQlmb3IgKGogPSAwOyBqIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGorKykgeworCQkJaWYgKHNiYW5kLT5iaXRyYXRlc1tqXS5iaXRyYXRlID09IHJhdGUpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJKm1hc2sgfD0gQklUKGopOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghZm91bmQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIG1hc2sgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBiaXQgc2V0IGhlcmUgc2luY2Ugd2UKKwkgKiBkaWRuJ3QgYWNjZXB0IGEgMC1sZW5ndGggcmF0ZXMgYXJyYXkgbm9yIGFsbG93ZWQKKwkgKiBlbnRyaWVzIGluIHRoZSBhcnJheSB0aGF0IGRpZG4ndCBleGlzdAorCSAqLworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQveDI1L2FmX3gyNS5jIGIvbmV0L3gyNS9hZl94MjUuYwppbmRleCA0NjgwYjFlLi5kMzA2MTU0IDEwMDY0NAotLS0gYS9uZXQveDI1L2FmX3gyNS5jCisrKyBiL25ldC94MjUvYWZfeDI1LmMKQEAgLTIzNywyMSArMjM3LDIxIEBACiAjZW5kaWYKIAkgKSB7CiAJCXN3aXRjaCAoZXZlbnQpIHsKLQkJCWNhc2UgTkVUREVWX1VQOgotCQkJCXgyNV9saW5rX2RldmljZV91cChkZXYpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKLQkJCQluYiA9IHgyNV9nZXRfbmVpZ2goZGV2KTsKLQkJCQlpZiAobmIpIHsKLQkJCQkJeDI1X3Rlcm1pbmF0ZV9saW5rKG5iKTsKLQkJCQkJeDI1X25laWdoX3B1dChuYik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBORVRERVZfRE9XTjoKLQkJCQl4MjVfa2lsbF9ieV9kZXZpY2UoZGV2KTsKLQkJCQl4MjVfcm91dGVfZGV2aWNlX2Rvd24oZGV2KTsKLQkJCQl4MjVfbGlua19kZXZpY2VfZG93bihkZXYpOwotCQkJCWJyZWFrOworCQljYXNlIE5FVERFVl9VUDoKKwkJCXgyNV9saW5rX2RldmljZV91cChkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgTkVUREVWX0dPSU5HX0RPV046CisJCQluYiA9IHgyNV9nZXRfbmVpZ2goZGV2KTsKKwkJCWlmIChuYikgeworCQkJCXgyNV90ZXJtaW5hdGVfbGluayhuYik7CisJCQkJeDI1X25laWdoX3B1dChuYik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBORVRERVZfRE9XTjoKKwkJCXgyNV9raWxsX2J5X2RldmljZShkZXYpOworCQkJeDI1X3JvdXRlX2RldmljZV9kb3duKGRldik7CisJCQl4MjVfbGlua19kZXZpY2VfZG93bihkZXYpOworCQkJYnJlYWs7CiAJCX0KIAl9CiAKQEAgLTEzMzYsMjU2ICsxMzM2LDI1MyBAQAogCWludCByYzsKIAogCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgVElPQ09VVFE6IHsKLQkJCWludCBhbW91bnQ7CisJY2FzZSBUSU9DT1VUUTogeworCQlpbnQgYW1vdW50OwogCi0JCQlhbW91bnQgPSBzay0+c2tfc25kYnVmIC0gc2tfd21lbV9hbGxvY19nZXQoc2spOwotCQkJaWYgKGFtb3VudCA8IDApCi0JCQkJYW1vdW50ID0gMDsKLQkJCXJjID0gcHV0X3VzZXIoYW1vdW50LCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZ3ApOwotCQkJYnJlYWs7Ci0JCX0KKwkJYW1vdW50ID0gc2stPnNrX3NuZGJ1ZiAtIHNrX3dtZW1fYWxsb2NfZ2V0KHNrKTsKKwkJaWYgKGFtb3VudCA8IDApCisJCQlhbW91bnQgPSAwOworCQlyYyA9IHB1dF91c2VyKGFtb3VudCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmdwKTsKKwkJYnJlYWs7CisJfQogCi0JCWNhc2UgVElPQ0lOUTogewotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJCWludCBhbW91bnQgPSAwOwotCQkJLyoKLQkJCSAqIFRoZXNlIHR3byBhcmUgc2FmZSBvbiBhIHNpbmdsZSBDUFUgc3lzdGVtIGFzCi0JCQkgKiBvbmx5IHVzZXIgdGFza3MgZmlkZGxlIGhlcmUKLQkJCSAqLwotCQkJbG9ja19zb2NrKHNrKTsKLQkJCWlmICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgIT0gTlVMTCkKLQkJCQlhbW91bnQgPSBza2ItPmxlbjsKLQkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCQlyYyA9IHB1dF91c2VyKGFtb3VudCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmdwKTsKLQkJCWJyZWFrOwotCQl9CisJY2FzZSBUSU9DSU5ROiB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCBhbW91bnQgPSAwOworCQkvKgorCQkgKiBUaGVzZSB0d28gYXJlIHNhZmUgb24gYSBzaW5nbGUgQ1BVIHN5c3RlbSBhcworCQkgKiBvbmx5IHVzZXIgdGFza3MgZmlkZGxlIGhlcmUKKwkJICovCisJCWxvY2tfc29jayhzayk7CisJCWlmICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgIT0gTlVMTCkKKwkJCWFtb3VudCA9IHNrYi0+bGVuOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyYyA9IHB1dF91c2VyKGFtb3VudCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmdwKTsKKwkJYnJlYWs7CisJfQogCi0JCWNhc2UgU0lPQ0dTVEFNUDoKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWlmIChzaykKLQkJCQlyYyA9IHNvY2tfZ2V0X3RpbWVzdGFtcChzaywKKwljYXNlIFNJT0NHU1RBTVA6CisJCXJjID0gLUVJTlZBTDsKKwkJaWYgKHNrKQorCQkJcmMgPSBzb2NrX2dldF90aW1lc3RhbXAoc2ssCiAJCQkJCQkoc3RydWN0IHRpbWV2YWwgX191c2VyICopYXJncCk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dTVEFNUE5TOgorCQlyYyA9IC1FSU5WQUw7CisJCWlmIChzaykKKwkJCXJjID0gc29ja19nZXRfdGltZXN0YW1wbnMoc2ssCisJCQkJCShzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopYXJncCk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dJRkFERFI6CisJY2FzZSBTSU9DU0lGQUREUjoKKwljYXNlIFNJT0NHSUZEU1RBRERSOgorCWNhc2UgU0lPQ1NJRkRTVEFERFI6CisJY2FzZSBTSU9DR0lGQlJEQUREUjoKKwljYXNlIFNJT0NTSUZCUkRBRERSOgorCWNhc2UgU0lPQ0dJRk5FVE1BU0s6CisJY2FzZSBTSU9DU0lGTkVUTUFTSzoKKwljYXNlIFNJT0NHSUZNRVRSSUM6CisJY2FzZSBTSU9DU0lGTUVUUklDOgorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgU0lPQ0FERFJUOgorCWNhc2UgU0lPQ0RFTFJUOgorCQlyYyA9IC1FUEVSTTsKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ0dTVEFNUE5TOgotCQkJcmMgPSAtRUlOVkFMOwotCQkJaWYgKHNrKQotCQkJCXJjID0gc29ja19nZXRfdGltZXN0YW1wbnMoc2ssCi0JCQkJCQkoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKWFyZ3ApOworCQlyYyA9IHgyNV9yb3V0ZV9pb2N0bChjbWQsIGFyZ3ApOworCQlicmVhazsKKwljYXNlIFNJT0NYMjVHU1VCU0NSSVA6CisJCXJjID0geDI1X3N1YnNjcl9pb2N0bChjbWQsIGFyZ3ApOworCQlicmVhazsKKwljYXNlIFNJT0NYMjVTU1VCU0NSSVA6CisJCXJjID0gLUVQRVJNOworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCQlicmVhazsKLQkJY2FzZSBTSU9DR0lGQUREUjoKLQkJY2FzZSBTSU9DU0lGQUREUjoKLQkJY2FzZSBTSU9DR0lGRFNUQUREUjoKLQkJY2FzZSBTSU9DU0lGRFNUQUREUjoKLQkJY2FzZSBTSU9DR0lGQlJEQUREUjoKLQkJY2FzZSBTSU9DU0lGQlJEQUREUjoKLQkJY2FzZSBTSU9DR0lGTkVUTUFTSzoKLQkJY2FzZSBTSU9DU0lGTkVUTUFTSzoKLQkJY2FzZSBTSU9DR0lGTUVUUklDOgotCQljYXNlIFNJT0NTSUZNRVRSSUM6Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJY2FzZSBTSU9DQUREUlQ6Ci0JCWNhc2UgU0lPQ0RFTFJUOgotCQkJcmMgPSAtRVBFUk07Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQkJYnJlYWs7Ci0JCQlyYyA9IHgyNV9yb3V0ZV9pb2N0bChjbWQsIGFyZ3ApOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ1gyNUdTVUJTQ1JJUDoKLQkJCXJjID0geDI1X3N1YnNjcl9pb2N0bChjbWQsIGFyZ3ApOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ1gyNVNTVUJTQ1JJUDoKLQkJCXJjID0gLUVQRVJNOwotCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQkJCWJyZWFrOwotCQkJcmMgPSB4MjVfc3Vic2NyX2lvY3RsKGNtZCwgYXJncCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTSU9DWDI1R0ZBQ0lMSVRJRVM6IHsKLQkJCWxvY2tfc29jayhzayk7Ci0JCQlyYyA9IGNvcHlfdG9fdXNlcihhcmdwLCAmeDI1LT5mYWNpbGl0aWVzLAotCQkJCQkJc2l6ZW9mKHgyNS0+ZmFjaWxpdGllcykpCi0JCQkJCQk/IC1FRkFVTFQgOiAwOwotCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJCWJyZWFrOwotCQl9CisJCXJjID0geDI1X3N1YnNjcl9pb2N0bChjbWQsIGFyZ3ApOworCQlicmVhazsKKwljYXNlIFNJT0NYMjVHRkFDSUxJVElFUzogeworCQlsb2NrX3NvY2soc2spOworCQlyYyA9IGNvcHlfdG9fdXNlcihhcmdwLCAmeDI1LT5mYWNpbGl0aWVzLAorCQkJCSAgc2l6ZW9mKHgyNS0+ZmFjaWxpdGllcykpCisJCQk/IC1FRkFVTFQgOiAwOworCQlyZWxlYXNlX3NvY2soc2spOworCQlicmVhazsKKwl9CiAKLQkJY2FzZSBTSU9DWDI1U0ZBQ0lMSVRJRVM6IHsKLQkJCXN0cnVjdCB4MjVfZmFjaWxpdGllcyBmYWNpbGl0aWVzOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmYWNpbGl0aWVzLCBhcmdwLAotCQkJCQkgICBzaXplb2YoZmFjaWxpdGllcykpKQotCQkJCWJyZWFrOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJbG9ja19zb2NrKHNrKTsKLQkJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTiAmJgotCQkJICAgIHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpCisJY2FzZSBTSU9DWDI1U0ZBQ0lMSVRJRVM6IHsKKwkJc3RydWN0IHgyNV9mYWNpbGl0aWVzIGZhY2lsaXRpZXM7CisJCXJjID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmYWNpbGl0aWVzLCBhcmdwLCBzaXplb2YoZmFjaWxpdGllcykpKQorCQkJYnJlYWs7CisJCXJjID0gLUVJTlZBTDsKKwkJbG9ja19zb2NrKHNrKTsKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOICYmCisJCSAgICBzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKQorCQkJZ290byBvdXRfZmFjX3JlbGVhc2U7CisJCWlmIChmYWNpbGl0aWVzLnBhY3NpemVfaW4gPCBYMjVfUFMxNiB8fAorCQkgICAgZmFjaWxpdGllcy5wYWNzaXplX2luID4gWDI1X1BTNDA5NikKKwkJCWdvdG8gb3V0X2ZhY19yZWxlYXNlOworCQlpZiAoZmFjaWxpdGllcy5wYWNzaXplX291dCA8IFgyNV9QUzE2IHx8CisJCSAgICBmYWNpbGl0aWVzLnBhY3NpemVfb3V0ID4gWDI1X1BTNDA5NikKKwkJCWdvdG8gb3V0X2ZhY19yZWxlYXNlOworCQlpZiAoZmFjaWxpdGllcy53aW5zaXplX2luIDwgMSB8fAorCQkgICAgZmFjaWxpdGllcy53aW5zaXplX2luID4gMTI3KQorCQkJZ290byBvdXRfZmFjX3JlbGVhc2U7CisJCWlmIChmYWNpbGl0aWVzLnRocm91Z2hwdXQpIHsKKwkJCWludCBvdXQgPSBmYWNpbGl0aWVzLnRocm91Z2hwdXQgJiAweGYwOworCQkJaW50IGluICA9IGZhY2lsaXRpZXMudGhyb3VnaHB1dCAmIDB4MGY7CisJCQlpZiAoIW91dCkKKwkJCQlmYWNpbGl0aWVzLnRocm91Z2hwdXQgfD0KKwkJCQkJWDI1X0RFRkFVTFRfVEhST1VHSFBVVCA8PCA0OworCQkJZWxzZSBpZiAob3V0IDwgMHgzMCB8fCBvdXQgPiAweEQwKQogCQkJCWdvdG8gb3V0X2ZhY19yZWxlYXNlOwotCQkJaWYgKGZhY2lsaXRpZXMucGFjc2l6ZV9pbiA8IFgyNV9QUzE2IHx8Ci0JCQkgICAgZmFjaWxpdGllcy5wYWNzaXplX2luID4gWDI1X1BTNDA5NikKKwkJCWlmICghaW4pCisJCQkJZmFjaWxpdGllcy50aHJvdWdocHV0IHw9CisJCQkJCVgyNV9ERUZBVUxUX1RIUk9VR0hQVVQ7CisJCQllbHNlIGlmIChpbiA8IDB4MDMgfHwgaW4gPiAweDBEKQogCQkJCWdvdG8gb3V0X2ZhY19yZWxlYXNlOwotCQkJaWYgKGZhY2lsaXRpZXMucGFjc2l6ZV9vdXQgPCBYMjVfUFMxNiB8fAotCQkJICAgIGZhY2lsaXRpZXMucGFjc2l6ZV9vdXQgPiBYMjVfUFM0MDk2KQotCQkJCWdvdG8gb3V0X2ZhY19yZWxlYXNlOwotCQkJaWYgKGZhY2lsaXRpZXMud2luc2l6ZV9pbiA8IDEgfHwKLQkJCSAgICBmYWNpbGl0aWVzLndpbnNpemVfaW4gPiAxMjcpCi0JCQkJZ290byBvdXRfZmFjX3JlbGVhc2U7Ci0JCQlpZiAoZmFjaWxpdGllcy50aHJvdWdocHV0KSB7Ci0JCQkJaW50IG91dCA9IGZhY2lsaXRpZXMudGhyb3VnaHB1dCAmIDB4ZjA7Ci0JCQkJaW50IGluICA9IGZhY2lsaXRpZXMudGhyb3VnaHB1dCAmIDB4MGY7Ci0JCQkJaWYgKCFvdXQpCi0JCQkJCWZhY2lsaXRpZXMudGhyb3VnaHB1dCB8PQotCQkJCQkJWDI1X0RFRkFVTFRfVEhST1VHSFBVVCA8PCA0OwotCQkJCWVsc2UgaWYgKG91dCA8IDB4MzAgfHwgb3V0ID4gMHhEMCkKLQkJCQkJZ290byBvdXRfZmFjX3JlbGVhc2U7Ci0JCQkJaWYgKCFpbikKLQkJCQkJZmFjaWxpdGllcy50aHJvdWdocHV0IHw9Ci0JCQkJCQlYMjVfREVGQVVMVF9USFJPVUdIUFVUOwotCQkJCWVsc2UgaWYgKGluIDwgMHgwMyB8fCBpbiA+IDB4MEQpCi0JCQkJCWdvdG8gb3V0X2ZhY19yZWxlYXNlOwotCQkJfQotCQkJaWYgKGZhY2lsaXRpZXMucmV2ZXJzZSAmJgotCQkJCShmYWNpbGl0aWVzLnJldmVyc2UgJiAweDgxKSAhPSAweDgxKQotCQkJCWdvdG8gb3V0X2ZhY19yZWxlYXNlOwotCQkJeDI1LT5mYWNpbGl0aWVzID0gZmFjaWxpdGllczsKLQkJCXJjID0gMDsKKwkJfQorCQlpZiAoZmFjaWxpdGllcy5yZXZlcnNlICYmCisJCSAgICAoZmFjaWxpdGllcy5yZXZlcnNlICYgMHg4MSkgIT0gMHg4MSkKKwkJCWdvdG8gb3V0X2ZhY19yZWxlYXNlOworCQl4MjUtPmZhY2lsaXRpZXMgPSBmYWNpbGl0aWVzOworCQlyYyA9IDA7CiBvdXRfZmFjX3JlbGVhc2U6Ci0JCQlyZWxlYXNlX3NvY2soc2spOwotCQkJYnJlYWs7Ci0JCX0KKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJYnJlYWs7CisJfQogCi0JCWNhc2UgU0lPQ1gyNUdEVEVGQUNJTElUSUVTOiB7Ci0JCQlsb2NrX3NvY2soc2spOwotCQkJcmMgPSBjb3B5X3RvX3VzZXIoYXJncCwgJngyNS0+ZHRlX2ZhY2lsaXRpZXMsCi0JCQkJCQlzaXplb2YoeDI1LT5kdGVfZmFjaWxpdGllcykpOwotCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJCWlmIChyYykKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNhc2UgU0lPQ1gyNVNEVEVGQUNJTElUSUVTOiB7Ci0JCQlzdHJ1Y3QgeDI1X2R0ZV9mYWNpbGl0aWVzIGR0ZWZhY3M7CisJY2FzZSBTSU9DWDI1R0RURUZBQ0lMSVRJRVM6IHsKKwkJbG9ja19zb2NrKHNrKTsKKwkJcmMgPSBjb3B5X3RvX3VzZXIoYXJncCwgJngyNS0+ZHRlX2ZhY2lsaXRpZXMsCisJCQkJICBzaXplb2YoeDI1LT5kdGVfZmFjaWxpdGllcykpOworCQlyZWxlYXNlX3NvY2soc2spOworCQlpZiAocmMpCiAJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmR0ZWZhY3MsIGFyZ3AsIHNpemVvZihkdGVmYWNzKSkpCi0JCQkJYnJlYWs7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlsb2NrX3NvY2soc2spOwotCQkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOICYmCi0JCQkJCXNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpCi0JCQkJZ290byBvdXRfZHRlZmFjX3JlbGVhc2U7Ci0JCQlpZiAoZHRlZmFjcy5jYWxsaW5nX2xlbiA+IFgyNV9NQVhfQUVfTEVOKQotCQkJCWdvdG8gb3V0X2R0ZWZhY19yZWxlYXNlOwotCQkJaWYgKGR0ZWZhY3MuY2FsbGluZ19hZSA9PSBOVUxMKQotCQkJCWdvdG8gb3V0X2R0ZWZhY19yZWxlYXNlOwotCQkJaWYgKGR0ZWZhY3MuY2FsbGVkX2xlbiA+IFgyNV9NQVhfQUVfTEVOKQotCQkJCWdvdG8gb3V0X2R0ZWZhY19yZWxlYXNlOwotCQkJaWYgKGR0ZWZhY3MuY2FsbGVkX2FlID09IE5VTEwpCi0JCQkJZ290byBvdXRfZHRlZmFjX3JlbGVhc2U7Ci0JCQl4MjUtPmR0ZV9mYWNpbGl0aWVzID0gZHRlZmFjczsKLQkJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBTSU9DWDI1U0RURUZBQ0lMSVRJRVM6IHsKKwkJc3RydWN0IHgyNV9kdGVfZmFjaWxpdGllcyBkdGVmYWNzOworCQlyYyA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZHRlZmFjcywgYXJncCwgc2l6ZW9mKGR0ZWZhY3MpKSkKKwkJCWJyZWFrOworCQlyYyA9IC1FSU5WQUw7CisJCWxvY2tfc29jayhzayk7CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTiAmJgorCQkgICAgc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSkKKwkJCWdvdG8gb3V0X2R0ZWZhY19yZWxlYXNlOworCQlpZiAoZHRlZmFjcy5jYWxsaW5nX2xlbiA+IFgyNV9NQVhfQUVfTEVOKQorCQkJZ290byBvdXRfZHRlZmFjX3JlbGVhc2U7CisJCWlmIChkdGVmYWNzLmNhbGxpbmdfYWUgPT0gTlVMTCkKKwkJCWdvdG8gb3V0X2R0ZWZhY19yZWxlYXNlOworCQlpZiAoZHRlZmFjcy5jYWxsZWRfbGVuID4gWDI1X01BWF9BRV9MRU4pCisJCQlnb3RvIG91dF9kdGVmYWNfcmVsZWFzZTsKKwkJaWYgKGR0ZWZhY3MuY2FsbGVkX2FlID09IE5VTEwpCisJCQlnb3RvIG91dF9kdGVmYWNfcmVsZWFzZTsKKwkJeDI1LT5kdGVfZmFjaWxpdGllcyA9IGR0ZWZhY3M7CisJCXJjID0gMDsKIG91dF9kdGVmYWNfcmVsZWFzZToKLQkJCXJlbGVhc2Vfc29jayhzayk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWJyZWFrOworCX0KKworCWNhc2UgU0lPQ1gyNUdDQUxMVVNFUkRBVEE6IHsKKwkJbG9ja19zb2NrKHNrKTsKKwkJcmMgPSBjb3B5X3RvX3VzZXIoYXJncCwgJngyNS0+Y2FsbHVzZXJkYXRhLAorCQkJCSAgc2l6ZW9mKHgyNS0+Y2FsbHVzZXJkYXRhKSkKKwkJCT8gLUVGQVVMVCA6IDA7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWJyZWFrOworCX0KKworCWNhc2UgU0lPQ1gyNVNDQUxMVVNFUkRBVEE6IHsKKwkJc3RydWN0IHgyNV9jYWxsdXNlcmRhdGEgY2FsbHVzZXJkYXRhOworCisJCXJjID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjYWxsdXNlcmRhdGEsIGFyZ3AsIHNpemVvZihjYWxsdXNlcmRhdGEpKSkKIAkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBTSU9DWDI1R0NBTExVU0VSREFUQTogewotCQkJbG9ja19zb2NrKHNrKTsKLQkJCXJjID0gY29weV90b191c2VyKGFyZ3AsICZ4MjUtPmNhbGx1c2VyZGF0YSwKLQkJCQkJc2l6ZW9mKHgyNS0+Y2FsbHVzZXJkYXRhKSkKLQkJCQkJPyAtRUZBVUxUIDogMDsKLQkJCXJlbGVhc2Vfc29jayhzayk7CisJCXJjID0gLUVJTlZBTDsKKwkJaWYgKGNhbGx1c2VyZGF0YS5jdWRsZW5ndGggPiBYMjVfTUFYX0NVRF9MRU4pCiAJCQlicmVhazsKLQkJfQorCQlsb2NrX3NvY2soc2spOworCQl4MjUtPmNhbGx1c2VyZGF0YSA9IGNhbGx1c2VyZGF0YTsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwl9CiAKLQkJY2FzZSBTSU9DWDI1U0NBTExVU0VSREFUQTogewotCQkJc3RydWN0IHgyNV9jYWxsdXNlcmRhdGEgY2FsbHVzZXJkYXRhOworCWNhc2UgU0lPQ1gyNUdDQVVTRURJQUc6IHsKKwkJbG9ja19zb2NrKHNrKTsKKwkJcmMgPSBjb3B5X3RvX3VzZXIoYXJncCwgJngyNS0+Y2F1c2VkaWFnLCBzaXplb2YoeDI1LT5jYXVzZWRpYWcpKQorCQkJPyAtRUZBVUxUIDogMDsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJYnJlYWs7CisJfQogCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmNhbGx1c2VyZGF0YSwgYXJncCwKLQkJCQkJICAgc2l6ZW9mKGNhbGx1c2VyZGF0YSkpKQotCQkJCWJyZWFrOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJaWYgKGNhbGx1c2VyZGF0YS5jdWRsZW5ndGggPiBYMjVfTUFYX0NVRF9MRU4pCi0JCQkJYnJlYWs7Ci0JCQlsb2NrX3NvY2soc2spOwotCQkJeDI1LT5jYWxsdXNlcmRhdGEgPSBjYWxsdXNlcmRhdGE7Ci0JCQlyZWxlYXNlX3NvY2soc2spOwotCQkJcmMgPSAwOworCWNhc2UgU0lPQ1gyNVNDQVVTRURJQUc6IHsKKwkJc3RydWN0IHgyNV9jYXVzZWRpYWcgY2F1c2VkaWFnOworCQlyYyA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2F1c2VkaWFnLCBhcmdwLCBzaXplb2YoY2F1c2VkaWFnKSkpCiAJCQlicmVhazsKLQkJfQorCQlsb2NrX3NvY2soc2spOworCQl4MjUtPmNhdXNlZGlhZyA9IGNhdXNlZGlhZzsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmMgPSAwOworCQlicmVhazsKIAotCQljYXNlIFNJT0NYMjVHQ0FVU0VESUFHOiB7Ci0JCQlsb2NrX3NvY2soc2spOwotCQkJcmMgPSBjb3B5X3RvX3VzZXIoYXJncCwgJngyNS0+Y2F1c2VkaWFnLAotCQkJCQlzaXplb2YoeDI1LT5jYXVzZWRpYWcpKQotCQkJCQk/IC1FRkFVTFQgOiAwOwotCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJCWJyZWFrOwotCQl9CisJfQogCi0JCWNhc2UgU0lPQ1gyNVNDQVVTRURJQUc6IHsKLQkJCXN0cnVjdCB4MjVfY2F1c2VkaWFnIGNhdXNlZGlhZzsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmY2F1c2VkaWFnLCBhcmdwLCBzaXplb2YoY2F1c2VkaWFnKSkpCi0JCQkJYnJlYWs7Ci0JCQlsb2NrX3NvY2soc2spOwotCQkJeDI1LT5jYXVzZWRpYWcgPSBjYXVzZWRpYWc7Ci0JCQlyZWxlYXNlX3NvY2soc2spOwotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0KLQkJfQotCi0JCWNhc2UgU0lPQ1gyNVNDVURNQVRDSExFTjogewotCQkJc3RydWN0IHgyNV9zdWJhZGRyIHN1Yl9hZGRyOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJbG9ja19zb2NrKHNrKTsKLQkJCWlmKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpCi0JCQkJZ290byBvdXRfY3VkX3JlbGVhc2U7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnN1Yl9hZGRyLCBhcmdwLAotCQkJCQlzaXplb2Yoc3ViX2FkZHIpKSkKLQkJCQlnb3RvIG91dF9jdWRfcmVsZWFzZTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWlmKHN1Yl9hZGRyLmN1ZG1hdGNobGVuZ3RoID4gWDI1X01BWF9DVURfTEVOKQotCQkJCWdvdG8gb3V0X2N1ZF9yZWxlYXNlOwotCQkJeDI1LT5jdWRtYXRjaGxlbmd0aCA9IHN1Yl9hZGRyLmN1ZG1hdGNobGVuZ3RoOwotCQkJcmMgPSAwOworCWNhc2UgU0lPQ1gyNVNDVURNQVRDSExFTjogeworCQlzdHJ1Y3QgeDI1X3N1YmFkZHIgc3ViX2FkZHI7CisJCXJjID0gLUVJTlZBTDsKKwkJbG9ja19zb2NrKHNrKTsKKwkJaWYoc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSkKKwkJCWdvdG8gb3V0X2N1ZF9yZWxlYXNlOworCQlyYyA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3ViX2FkZHIsIGFyZ3AsCisJCQkJICAgc2l6ZW9mKHN1Yl9hZGRyKSkpCisJCQlnb3RvIG91dF9jdWRfcmVsZWFzZTsKKwkJcmMgPSAtRUlOVkFMOworCQlpZiAoc3ViX2FkZHIuY3VkbWF0Y2hsZW5ndGggPiBYMjVfTUFYX0NVRF9MRU4pCisJCQlnb3RvIG91dF9jdWRfcmVsZWFzZTsKKwkJeDI1LT5jdWRtYXRjaGxlbmd0aCA9IHN1Yl9hZGRyLmN1ZG1hdGNobGVuZ3RoOworCQlyYyA9IDA7CiBvdXRfY3VkX3JlbGVhc2U6Ci0JCQlyZWxlYXNlX3NvY2soc2spOwotCQkJYnJlYWs7Ci0JCX0KKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJYnJlYWs7CisJfQogCi0JCWNhc2UgU0lPQ1gyNUNBTExBQ0NQVEFQUFJWOiB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlsb2NrX3NvY2soc2spOwotCQkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpCi0JCQkJYnJlYWs7Ci0JCQljbGVhcl9iaXQoWDI1X0FDQ1BUX0FQUFJWX0ZMQUcsICZ4MjUtPmZsYWdzKTsKLQkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCQlyYyA9IDA7CisJY2FzZSBTSU9DWDI1Q0FMTEFDQ1BUQVBQUlY6IHsKKwkJcmMgPSAtRUlOVkFMOworCQlsb2NrX3NvY2soc2spOworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSkKIAkJCWJyZWFrOwotCQl9CisJCWNsZWFyX2JpdChYMjVfQUNDUFRfQVBQUlZfRkxBRywgJngyNS0+ZmxhZ3MpOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyYyA9IDA7CisJCWJyZWFrOworCX0KIAotCQljYXNlIFNJT0NYMjVTRU5EQ0FMTEFDQ1BUOiAgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJbG9ja19zb2NrKHNrKTsKLQkJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQotCQkJCWJyZWFrOwotCQkJLyogbXVzdCBjYWxsIGFjY3B0YXBwcnYgYWJvdmUgKi8KLQkJCWlmICh0ZXN0X2JpdChYMjVfQUNDUFRfQVBQUlZfRkxBRywgJngyNS0+ZmxhZ3MpKQotCQkJCWJyZWFrOwotCQkJeDI1X3dyaXRlX2ludGVybmFsKHNrLCBYMjVfQ0FMTF9BQ0NFUFRFRCk7Ci0JCQl4MjUtPnN0YXRlID0gWDI1X1NUQVRFXzM7Ci0JCQlyZWxlYXNlX3NvY2soc2spOwotCQkJcmMgPSAwOworCWNhc2UgU0lPQ1gyNVNFTkRDQUxMQUNDUFQ6ICB7CisJCXJjID0gLUVJTlZBTDsKKwkJbG9ja19zb2NrKHNrKTsKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCiAJCQlicmVhazsKLQkJfQorCQkvKiBtdXN0IGNhbGwgYWNjcHRhcHBydiBhYm92ZSAqLworCQlpZiAodGVzdF9iaXQoWDI1X0FDQ1BUX0FQUFJWX0ZMQUcsICZ4MjUtPmZsYWdzKSkKKwkJCWJyZWFrOworCQl4MjVfd3JpdGVfaW50ZXJuYWwoc2ssIFgyNV9DQUxMX0FDQ0VQVEVEKTsKKwkJeDI1LT5zdGF0ZSA9IFgyNV9TVEFURV8zOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyYyA9IDA7CisJCWJyZWFrOworCX0KIAotCQlkZWZhdWx0OgotCQkJcmMgPSAtRU5PSU9DVExDTUQ7Ci0JCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvbmV0L3gyNS94MjVfZGV2LmMgYi9uZXQveDI1L3gyNV9kZXYuYwppbmRleCA5MDA1ZjZkLi5lNTQ3Y2ExIDEwMDY0NAotLS0gYS9uZXQveDI1L3gyNV9kZXYuYworKysgYi9uZXQveDI1L3gyNV9kZXYuYwpAQCAtMTQ2LDIxICsxNDYsMjEgQEAKIAl1bnNpZ25lZCBjaGFyICpwdHI7CiAKIAlzd2l0Y2ggKG5iLT5kZXYtPnR5cGUpIHsKLQkJY2FzZSBBUlBIUkRfWDI1OgotCQkJaWYgKChza2IgPSBhbGxvY19za2IoMSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIngyNV9kZXY6IG91dCBvZiBtZW1vcnlcbiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXB0ciAgPSBza2JfcHV0KHNrYiwgMSk7Ci0JCQkqcHRyID0gWDI1X0lGQUNFX0NPTk5FQ1Q7Ci0JCQlicmVhazsKKwljYXNlIEFSUEhSRF9YMjU6CisJCWlmICgoc2tiID0gYWxsb2Nfc2tiKDEsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIngyNV9kZXY6IG91dCBvZiBtZW1vcnlcbiIpOworCQkJcmV0dXJuOworCQl9CisJCXB0ciAgPSBza2JfcHV0KHNrYiwgMSk7CisJCSpwdHIgPSBYMjVfSUZBQ0VfQ09OTkVDVDsKKwkJYnJlYWs7CiAKICNpZiBkZWZpbmVkKENPTkZJR19MTEMpIHx8IGRlZmluZWQoQ09ORklHX0xMQ19NT0RVTEUpCi0JCWNhc2UgQVJQSFJEX0VUSEVSOgotCQkJcmV0dXJuOworCWNhc2UgQVJQSFJEX0VUSEVSOgorCQlyZXR1cm47CiAjZW5kaWYKLQkJZGVmYXVsdDoKLQkJCXJldHVybjsKKwlkZWZhdWx0OgorCQlyZXR1cm47CiAJfQogCiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1gyNSk7CkBAIC0yMDIsMTkgKzIwMiwxOSBAQAogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJc3dpdGNoIChuYi0+ZGV2LT50eXBlKSB7Ci0JCWNhc2UgQVJQSFJEX1gyNToKLQkJCWRwdHIgID0gc2tiX3B1c2goc2tiLCAxKTsKLQkJCSpkcHRyID0gWDI1X0lGQUNFX0RBVEE7Ci0JCQlicmVhazsKKwljYXNlIEFSUEhSRF9YMjU6CisJCWRwdHIgID0gc2tiX3B1c2goc2tiLCAxKTsKKwkJKmRwdHIgPSBYMjVfSUZBQ0VfREFUQTsKKwkJYnJlYWs7CiAKICNpZiBkZWZpbmVkKENPTkZJR19MTEMpIHx8IGRlZmluZWQoQ09ORklHX0xMQ19NT0RVTEUpCi0JCWNhc2UgQVJQSFJEX0VUSEVSOgotCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCQlyZXR1cm47CisJY2FzZSBBUlBIUkRfRVRIRVI6CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CiAjZW5kaWYKLQkJZGVmYXVsdDoKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CiAJfQogCiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1gyNSk7CmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9pbi5jIGIvbmV0L3gyNS94MjVfaW4uYwppbmRleCAxNWRlNjVmLi4wYjA3M2I1IDEwMDY0NAotLS0gYS9uZXQveDI1L3gyNV9pbi5jCisrKyBiL25ldC94MjUveDI1X2luLmMKQEAgLTk0LDU1ICs5NCw1NSBAQAogCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKIAogCXN3aXRjaCAoZnJhbWV0eXBlKSB7Ci0JCWNhc2UgWDI1X0NBTExfQUNDRVBURUQ6IHsKKwljYXNlIFgyNV9DQUxMX0FDQ0VQVEVEOiB7CiAKLQkJCXgyNV9zdG9wX3RpbWVyKHNrKTsKLQkJCXgyNS0+Y29uZGl0aW9uID0gMHgwMDsKLQkJCXgyNS0+dnMgICAgICAgID0gMDsKLQkJCXgyNS0+dmEgICAgICAgID0gMDsKLQkJCXgyNS0+dnIgICAgICAgID0gMDsKLQkJCXgyNS0+dmwgICAgICAgID0gMDsKLQkJCXgyNS0+c3RhdGUgICAgID0gWDI1X1NUQVRFXzM7Ci0JCQlzay0+c2tfc3RhdGUgICA9IFRDUF9FU1RBQkxJU0hFRDsKLQkJCS8qCi0JCQkgKglQYXJzZSB0aGUgZGF0YSBpbiB0aGUgZnJhbWUuCi0JCQkgKi8KLQkJCXNrYl9wdWxsKHNrYiwgWDI1X1NURF9NSU5fTEVOKTsKKwkJeDI1X3N0b3BfdGltZXIoc2spOworCQl4MjUtPmNvbmRpdGlvbiA9IDB4MDA7CisJCXgyNS0+dnMgICAgICAgID0gMDsKKwkJeDI1LT52YSAgICAgICAgPSAwOworCQl4MjUtPnZyICAgICAgICA9IDA7CisJCXgyNS0+dmwgICAgICAgID0gMDsKKwkJeDI1LT5zdGF0ZSAgICAgPSBYMjVfU1RBVEVfMzsKKwkJc2stPnNrX3N0YXRlICAgPSBUQ1BfRVNUQUJMSVNIRUQ7CisJCS8qCisJCSAqCVBhcnNlIHRoZSBkYXRhIGluIHRoZSBmcmFtZS4KKwkJICovCisJCXNrYl9wdWxsKHNrYiwgWDI1X1NURF9NSU5fTEVOKTsKIAotCQkJbGVuID0geDI1X3BhcnNlX2FkZHJlc3NfYmxvY2soc2tiLCAmc291cmNlX2FkZHIsCi0JCQkJCQkmZGVzdF9hZGRyKTsKLQkJCWlmIChsZW4gPiAwKQotCQkJCXNrYl9wdWxsKHNrYiwgbGVuKTsKLQkJCWVsc2UgaWYgKGxlbiA8IDApCi0JCQkJZ290byBvdXRfY2xlYXI7CisJCWxlbiA9IHgyNV9wYXJzZV9hZGRyZXNzX2Jsb2NrKHNrYiwgJnNvdXJjZV9hZGRyLAorCQkJCQkgICAgICAmZGVzdF9hZGRyKTsKKwkJaWYgKGxlbiA+IDApCisJCQlza2JfcHVsbChza2IsIGxlbik7CisJCWVsc2UgaWYgKGxlbiA8IDApCisJCQlnb3RvIG91dF9jbGVhcjsKIAotCQkJbGVuID0geDI1X3BhcnNlX2ZhY2lsaXRpZXMoc2tiLCAmeDI1LT5mYWNpbGl0aWVzLAotCQkJCQkJJngyNS0+ZHRlX2ZhY2lsaXRpZXMsCi0JCQkJCQkmeDI1LT52Y19mYWNpbF9tYXNrKTsKLQkJCWlmIChsZW4gPiAwKQotCQkJCXNrYl9wdWxsKHNrYiwgbGVuKTsKLQkJCWVsc2UgaWYgKGxlbiA8IDApCi0JCQkJZ290byBvdXRfY2xlYXI7Ci0JCQkvKgotCQkJICoJQ29weSBhbnkgQ2FsbCBVc2VyIERhdGEuCi0JCQkgKi8KLQkJCWlmIChza2ItPmxlbiA+IDApIHsKLQkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKLQkJCQkJICAgICAgeDI1LT5jYWxsdXNlcmRhdGEuY3VkZGF0YSwKLQkJCQkJICAgICAgc2tiLT5sZW4pOwotCQkJCXgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGxlbmd0aCA9IHNrYi0+bGVuOwotCQkJfQotCQkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCi0JCQkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7Ci0JCQlicmVhazsKKwkJbGVuID0geDI1X3BhcnNlX2ZhY2lsaXRpZXMoc2tiLCAmeDI1LT5mYWNpbGl0aWVzLAorCQkJCQkgICAmeDI1LT5kdGVfZmFjaWxpdGllcywKKwkJCQkJICAgJngyNS0+dmNfZmFjaWxfbWFzayk7CisJCWlmIChsZW4gPiAwKQorCQkJc2tiX3B1bGwoc2tiLCBsZW4pOworCQllbHNlIGlmIChsZW4gPCAwKQorCQkJZ290byBvdXRfY2xlYXI7CisJCS8qCisJCSAqCUNvcHkgYW55IENhbGwgVXNlciBEYXRhLgorCQkgKi8KKwkJaWYgKHNrYi0+bGVuID4gMCkgeworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsCisJCQkJCQkgIHgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGRhdGEsCisJCQkJCQkgIHNrYi0+bGVuKTsKKwkJCXgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGxlbmd0aCA9IHNrYi0+bGVuOwogCQl9Ci0JCWNhc2UgWDI1X0NMRUFSX1JFUVVFU1Q6Ci0JCQl4MjVfd3JpdGVfaW50ZXJuYWwoc2ssIFgyNV9DTEVBUl9DT05GSVJNQVRJT04pOwotCQkJeDI1X2Rpc2Nvbm5lY3Qoc2ssIEVDT05OUkVGVVNFRCwgc2tiLT5kYXRhWzNdLCBza2ItPmRhdGFbNF0pOwotCQkJYnJlYWs7CisJCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKQorCQkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCWJyZWFrOworCX0KKwljYXNlIFgyNV9DTEVBUl9SRVFVRVNUOgorCQl4MjVfd3JpdGVfaW50ZXJuYWwoc2ssIFgyNV9DTEVBUl9DT05GSVJNQVRJT04pOworCQl4MjVfZGlzY29ubmVjdChzaywgRUNPTk5SRUZVU0VELCBza2ItPmRhdGFbM10sIHNrYi0+ZGF0YVs0XSk7CisJCWJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTM1NCwxOCArMzU0LDE4IEBACiAJZnJhbWV0eXBlID0geDI1X2RlY29kZShzaywgc2tiLCAmbnMsICZuciwgJnEsICZkLCAmbSk7CiAKIAlzd2l0Y2ggKHgyNS0+c3RhdGUpIHsKLQkJY2FzZSBYMjVfU1RBVEVfMToKLQkJCXF1ZXVlZCA9IHgyNV9zdGF0ZTFfbWFjaGluZShzaywgc2tiLCBmcmFtZXR5cGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgWDI1X1NUQVRFXzI6Ci0JCQlxdWV1ZWQgPSB4MjVfc3RhdGUyX21hY2hpbmUoc2ssIHNrYiwgZnJhbWV0eXBlKTsKLQkJCWJyZWFrOwotCQljYXNlIFgyNV9TVEFURV8zOgotCQkJcXVldWVkID0geDI1X3N0YXRlM19tYWNoaW5lKHNrLCBza2IsIGZyYW1ldHlwZSwgbnMsIG5yLCBxLCBkLCBtKTsKLQkJCWJyZWFrOwotCQljYXNlIFgyNV9TVEFURV80OgotCQkJcXVldWVkID0geDI1X3N0YXRlNF9tYWNoaW5lKHNrLCBza2IsIGZyYW1ldHlwZSk7Ci0JCQlicmVhazsKKwljYXNlIFgyNV9TVEFURV8xOgorCQlxdWV1ZWQgPSB4MjVfc3RhdGUxX21hY2hpbmUoc2ssIHNrYiwgZnJhbWV0eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfU1RBVEVfMjoKKwkJcXVldWVkID0geDI1X3N0YXRlMl9tYWNoaW5lKHNrLCBza2IsIGZyYW1ldHlwZSk7CisJCWJyZWFrOworCWNhc2UgWDI1X1NUQVRFXzM6CisJCXF1ZXVlZCA9IHgyNV9zdGF0ZTNfbWFjaGluZShzaywgc2tiLCBmcmFtZXR5cGUsIG5zLCBuciwgcSwgZCwgbSk7CisJCWJyZWFrOworCWNhc2UgWDI1X1NUQVRFXzQ6CisJCXF1ZXVlZCA9IHgyNV9zdGF0ZTRfbWFjaGluZShzaywgc2tiLCBmcmFtZXR5cGUpOworCQlicmVhazsKIAl9CiAKIAl4MjVfa2ljayhzayk7CmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9saW5rLmMgYi9uZXQveDI1L3gyNV9saW5rLmMKaW5kZXggMjEzMDY5Mi4uMDM3OTU4ZiAxMDA2NDQKLS0tIGEvbmV0L3gyNS94MjVfbGluay5jCisrKyBiL25ldC94MjUveDI1X2xpbmsuYwpAQCAtNzYsMzAgKzc2LDI5IEBACiAJaW50IGNvbmZpcm07CiAKIAlzd2l0Y2ggKGZyYW1ldHlwZSkgewotCQljYXNlIFgyNV9SRVNUQVJUX1JFUVVFU1Q6Ci0JCQljb25maXJtID0gIXgyNV90MjB0aW1lcl9wZW5kaW5nKG5iKTsKLQkJCXgyNV9zdG9wX3QyMHRpbWVyKG5iKTsKLQkJCW5iLT5zdGF0ZSA9IFgyNV9MSU5LX1NUQVRFXzM7Ci0JCQlpZiAoY29uZmlybSkKLQkJCQl4MjVfdHJhbnNtaXRfcmVzdGFydF9jb25maXJtYXRpb24obmIpOwotCQkJYnJlYWs7CisJY2FzZSBYMjVfUkVTVEFSVF9SRVFVRVNUOgorCQljb25maXJtID0gIXgyNV90MjB0aW1lcl9wZW5kaW5nKG5iKTsKKwkJeDI1X3N0b3BfdDIwdGltZXIobmIpOworCQluYi0+c3RhdGUgPSBYMjVfTElOS19TVEFURV8zOworCQlpZiAoY29uZmlybSkKKwkJCXgyNV90cmFuc21pdF9yZXN0YXJ0X2NvbmZpcm1hdGlvbihuYik7CisJCWJyZWFrOwogCi0JCWNhc2UgWDI1X1JFU1RBUlRfQ09ORklSTUFUSU9OOgotCQkJeDI1X3N0b3BfdDIwdGltZXIobmIpOwotCQkJbmItPnN0YXRlID0gWDI1X0xJTktfU1RBVEVfMzsKLQkJCWJyZWFrOworCWNhc2UgWDI1X1JFU1RBUlRfQ09ORklSTUFUSU9OOgorCQl4MjVfc3RvcF90MjB0aW1lcihuYik7CisJCW5iLT5zdGF0ZSA9IFgyNV9MSU5LX1NUQVRFXzM7CisJCWJyZWFrOwogCi0JCWNhc2UgWDI1X0RJQUdOT1NUSUM6Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4MjU6IGRpYWdub3N0aWMgIyVkIC0gIgotCQkJICAgICAgICIlMDJYICUwMlggJTAyWFxuIiwKLQkJCSAgICAgICBza2ItPmRhdGFbM10sIHNrYi0+ZGF0YVs0XSwKLQkJCSAgICAgICBza2ItPmRhdGFbNV0sIHNrYi0+ZGF0YVs2XSk7Ci0JCQlicmVhazsKKwljYXNlIFgyNV9ESUFHTk9TVElDOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4MjU6IGRpYWdub3N0aWMgIyVkIC0gJTAyWCAlMDJYICUwMlhcbiIsCisJCSAgICAgICBza2ItPmRhdGFbM10sIHNrYi0+ZGF0YVs0XSwKKwkJICAgICAgIHNrYi0+ZGF0YVs1XSwgc2tiLT5kYXRhWzZdKTsKKwkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIngyNTogcmVjZWl2ZWQgdW5rbm93biAlMDJYICIKLQkJCSAgICAgICAid2l0aCBMQ0kgMDAwXG4iLCBmcmFtZXR5cGUpOwotCQkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAieDI1OiByZWNlaXZlZCB1bmtub3duICUwMlggd2l0aCBMQ0kgMDAwXG4iLAorCQkgICAgICAgZnJhbWV0eXBlKTsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKG5iLT5zdGF0ZSA9PSBYMjVfTElOS19TVEFURV8zKQpAQCAtMTkzLDE4ICsxOTIsMTggQEAKIHZvaWQgeDI1X3RyYW5zbWl0X2xpbmsoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHgyNV9uZWlnaCAqbmIpCiB7CiAJc3dpdGNoIChuYi0+c3RhdGUpIHsKLQkJY2FzZSBYMjVfTElOS19TVEFURV8wOgotCQkJc2tiX3F1ZXVlX3RhaWwoJm5iLT5xdWV1ZSwgc2tiKTsKLQkJCW5iLT5zdGF0ZSA9IFgyNV9MSU5LX1NUQVRFXzE7Ci0JCQl4MjVfZXN0YWJsaXNoX2xpbmsobmIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgWDI1X0xJTktfU1RBVEVfMToKLQkJY2FzZSBYMjVfTElOS19TVEFURV8yOgotCQkJc2tiX3F1ZXVlX3RhaWwoJm5iLT5xdWV1ZSwgc2tiKTsKLQkJCWJyZWFrOwotCQljYXNlIFgyNV9MSU5LX1NUQVRFXzM6Ci0JCQl4MjVfc2VuZF9mcmFtZShza2IsIG5iKTsKLQkJCWJyZWFrOworCWNhc2UgWDI1X0xJTktfU1RBVEVfMDoKKwkJc2tiX3F1ZXVlX3RhaWwoJm5iLT5xdWV1ZSwgc2tiKTsKKwkJbmItPnN0YXRlID0gWDI1X0xJTktfU1RBVEVfMTsKKwkJeDI1X2VzdGFibGlzaF9saW5rKG5iKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfTElOS19TVEFURV8xOgorCWNhc2UgWDI1X0xJTktfU1RBVEVfMjoKKwkJc2tiX3F1ZXVlX3RhaWwoJm5iLT5xdWV1ZSwgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfTElOS19TVEFURV8zOgorCQl4MjVfc2VuZF9mcmFtZShza2IsIG5iKTsKKwkJYnJlYWs7CiAJfQogfQogCkBAIC0yMTQsMTQgKzIxMywxNCBAQAogdm9pZCB4MjVfbGlua19lc3RhYmxpc2hlZChzdHJ1Y3QgeDI1X25laWdoICpuYikKIHsKIAlzd2l0Y2ggKG5iLT5zdGF0ZSkgewotCQljYXNlIFgyNV9MSU5LX1NUQVRFXzA6Ci0JCQluYi0+c3RhdGUgPSBYMjVfTElOS19TVEFURV8yOwotCQkJYnJlYWs7Ci0JCWNhc2UgWDI1X0xJTktfU1RBVEVfMToKLQkJCXgyNV90cmFuc21pdF9yZXN0YXJ0X3JlcXVlc3QobmIpOwotCQkJbmItPnN0YXRlID0gWDI1X0xJTktfU1RBVEVfMjsKLQkJCXgyNV9zdGFydF90MjB0aW1lcihuYik7Ci0JCQlicmVhazsKKwljYXNlIFgyNV9MSU5LX1NUQVRFXzA6CisJCW5iLT5zdGF0ZSA9IFgyNV9MSU5LX1NUQVRFXzI7CisJCWJyZWFrOworCWNhc2UgWDI1X0xJTktfU1RBVEVfMToKKwkJeDI1X3RyYW5zbWl0X3Jlc3RhcnRfcmVxdWVzdChuYik7CisJCW5iLT5zdGF0ZSA9IFgyNV9MSU5LX1NUQVRFXzI7CisJCXgyNV9zdGFydF90MjB0aW1lcihuYik7CisJCWJyZWFrOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3gyNS94MjVfc3Vici5jIGIvbmV0L3gyNS94MjVfc3Vici5jCmluZGV4IGRjMjBjZjEuLjI0YTM0MmUgMTAwNjQ0Ci0tLSBhL25ldC94MjUveDI1X3N1YnIuYworKysgYi9uZXQveDI1L3gyNV9zdWJyLmMKQEAgLTEyNiwzMiArMTI2LDMwIEBACiAJICoJQWRqdXN0IGZyYW1lIHNpemUuCiAJICovCiAJc3dpdGNoIChmcmFtZXR5cGUpIHsKLQkJY2FzZSBYMjVfQ0FMTF9SRVFVRVNUOgotCQkJbGVuICs9IDEgKyBYMjVfQUREUl9MRU4gKyBYMjVfTUFYX0ZBQ19MRU4gKwotCQkJICAgICAgIFgyNV9NQVhfQ1VEX0xFTjsKLQkJCWJyZWFrOwotCQljYXNlIFgyNV9DQUxMX0FDQ0VQVEVEOiAvKiBmYXN0IHNlbCB3aXRoIG5vIHJlc3RyIG9uIHJlc3AgKi8KLQkJCWlmKHgyNS0+ZmFjaWxpdGllcy5yZXZlcnNlICYgMHg4MCkgewotCQkJCWxlbiArPSAxICsgWDI1X01BWF9GQUNfTEVOICsgWDI1X01BWF9DVURfTEVOOwotCQkJfSBlbHNlIHsKLQkJCQlsZW4gKz0gMSArIFgyNV9NQVhfRkFDX0xFTjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFgyNV9DTEVBUl9SRVFVRVNUOgotCQljYXNlIFgyNV9SRVNFVF9SRVFVRVNUOgotCQkJbGVuICs9IDI7Ci0JCQlicmVhazsKLQkJY2FzZSBYMjVfUlI6Ci0JCWNhc2UgWDI1X1JOUjoKLQkJY2FzZSBYMjVfUkVKOgotCQljYXNlIFgyNV9DTEVBUl9DT05GSVJNQVRJT046Ci0JCWNhc2UgWDI1X0lOVEVSUlVQVF9DT05GSVJNQVRJT046Ci0JCWNhc2UgWDI1X1JFU0VUX0NPTkZJUk1BVElPTjoKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJYLjI1OiBpbnZhbGlkIGZyYW1lIHR5cGUgJTAyWFxuIiwKLQkJCSAgICAgICBmcmFtZXR5cGUpOwotCQkJcmV0dXJuOworCWNhc2UgWDI1X0NBTExfUkVRVUVTVDoKKwkJbGVuICs9IDEgKyBYMjVfQUREUl9MRU4gKyBYMjVfTUFYX0ZBQ19MRU4gKyBYMjVfTUFYX0NVRF9MRU47CisJCWJyZWFrOworCWNhc2UgWDI1X0NBTExfQUNDRVBURUQ6IC8qIGZhc3Qgc2VsIHdpdGggbm8gcmVzdHIgb24gcmVzcCAqLworCQlpZiAoeDI1LT5mYWNpbGl0aWVzLnJldmVyc2UgJiAweDgwKSB7CisJCQlsZW4gKz0gMSArIFgyNV9NQVhfRkFDX0xFTiArIFgyNV9NQVhfQ1VEX0xFTjsKKwkJfSBlbHNlIHsKKwkJCWxlbiArPSAxICsgWDI1X01BWF9GQUNfTEVOOworCQl9CisJCWJyZWFrOworCWNhc2UgWDI1X0NMRUFSX1JFUVVFU1Q6CisJY2FzZSBYMjVfUkVTRVRfUkVRVUVTVDoKKwkJbGVuICs9IDI7CisJCWJyZWFrOworCWNhc2UgWDI1X1JSOgorCWNhc2UgWDI1X1JOUjoKKwljYXNlIFgyNV9SRUo6CisJY2FzZSBYMjVfQ0xFQVJfQ09ORklSTUFUSU9OOgorCWNhc2UgWDI1X0lOVEVSUlVQVF9DT05GSVJNQVRJT046CisJY2FzZSBYMjVfUkVTRVRfQ09ORklSTUFUSU9OOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIlguMjU6IGludmFsaWQgZnJhbWUgdHlwZSAlMDJYXG4iLCBmcmFtZXR5cGUpOworCQlyZXR1cm47CiAJfQogCiAJaWYgKChza2IgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKQEAgLTI3NiwyMCArMjc0LDIwIEBACiAJKm5zID0gKm5yID0gKnEgPSAqZCA9ICptID0gMDsKIAogCXN3aXRjaCAoZnJhbWVbMl0pIHsKLQkJY2FzZSBYMjVfQ0FMTF9SRVFVRVNUOgotCQljYXNlIFgyNV9DQUxMX0FDQ0VQVEVEOgotCQljYXNlIFgyNV9DTEVBUl9SRVFVRVNUOgotCQljYXNlIFgyNV9DTEVBUl9DT05GSVJNQVRJT046Ci0JCWNhc2UgWDI1X0lOVEVSUlVQVDoKLQkJY2FzZSBYMjVfSU5URVJSVVBUX0NPTkZJUk1BVElPTjoKLQkJY2FzZSBYMjVfUkVTRVRfUkVRVUVTVDoKLQkJY2FzZSBYMjVfUkVTRVRfQ09ORklSTUFUSU9OOgotCQljYXNlIFgyNV9SRVNUQVJUX1JFUVVFU1Q6Ci0JCWNhc2UgWDI1X1JFU1RBUlRfQ09ORklSTUFUSU9OOgotCQljYXNlIFgyNV9SRUdJU1RSQVRJT05fUkVRVUVTVDoKLQkJY2FzZSBYMjVfUkVHSVNUUkFUSU9OX0NPTkZJUk1BVElPTjoKLQkJY2FzZSBYMjVfRElBR05PU1RJQzoKLQkJCXJldHVybiBmcmFtZVsyXTsKKwljYXNlIFgyNV9DQUxMX1JFUVVFU1Q6CisJY2FzZSBYMjVfQ0FMTF9BQ0NFUFRFRDoKKwljYXNlIFgyNV9DTEVBUl9SRVFVRVNUOgorCWNhc2UgWDI1X0NMRUFSX0NPTkZJUk1BVElPTjoKKwljYXNlIFgyNV9JTlRFUlJVUFQ6CisJY2FzZSBYMjVfSU5URVJSVVBUX0NPTkZJUk1BVElPTjoKKwljYXNlIFgyNV9SRVNFVF9SRVFVRVNUOgorCWNhc2UgWDI1X1JFU0VUX0NPTkZJUk1BVElPTjoKKwljYXNlIFgyNV9SRVNUQVJUX1JFUVVFU1Q6CisJY2FzZSBYMjVfUkVTVEFSVF9DT05GSVJNQVRJT046CisJY2FzZSBYMjVfUkVHSVNUUkFUSU9OX1JFUVVFU1Q6CisJY2FzZSBYMjVfUkVHSVNUUkFUSU9OX0NPTkZJUk1BVElPTjoKKwljYXNlIFgyNV9ESUFHTk9TVElDOgorCQlyZXR1cm4gZnJhbWVbMl07CiAJfQogCiAJaWYgKHgyNS0+bmVpZ2hib3VyLT5leHRlbmRlZCkgewpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKaW5kZXggOWJlYzJlOC4uOTRmZGNjNyAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYworKysgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCkBAIC01MCw3ICs1MCw3IEBACiBzdGF0aWMgdm9pZCB4ZnJtX3BvbGljeV9wdXRfYWZpbmZvKHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbyk7CiBzdGF0aWMgdm9pZCB4ZnJtX2luaXRfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogc3RhdGljIGludCBzdGFsZV9idW5kbGUoc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKLXN0YXRpYyBpbnQgeGZybV9idW5kbGVfb2soc3RydWN0IHhmcm1fZHN0ICp4ZHN0LCBpbnQgZmFtaWx5KTsKK3N0YXRpYyBpbnQgeGZybV9idW5kbGVfb2soc3RydWN0IHhmcm1fZHN0ICp4ZHN0KTsKIAogCiBzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5ICpfX3hmcm1fcG9saWN5X3VubGluayhzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwKQEAgLTE0OTcsNyArMTQ5Nyw3IEBACiAJCWdvdG8gZnJlZV9kc3Q7CiAKIAkvKiBDb3B5IG5laWdoYm91ciBmb3IgcmVhY2hhYmlsaXR5IGNvbmZpcm1hdGlvbiAqLwotCWRzdDAtPm5laWdoYm91ciA9IG5laWdoX2Nsb25lKGRzdC0+bmVpZ2hib3VyKTsKKwlkc3Rfc2V0X25laWdoYm91cihkc3QwLCBuZWlnaF9jbG9uZShkc3RfZ2V0X25laWdoYm91cihkc3QpKSk7CiAKIAl4ZnJtX2luaXRfcGF0aCgoc3RydWN0IHhmcm1fZHN0ICopZHN0MCwgZHN0LCBuZmhlYWRlcl9sZW4pOwogCXhmcm1faW5pdF9wbXR1KGRzdF9wcmV2KTsKQEAgLTIyNDEsNyArMjI0MSw3IEBACiAKIHN0YXRpYyBpbnQgc3RhbGVfYnVuZGxlKHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKLQlyZXR1cm4gIXhmcm1fYnVuZGxlX29rKChzdHJ1Y3QgeGZybV9kc3QgKilkc3QsIEFGX1VOU1BFQyk7CisJcmV0dXJuICF4ZnJtX2J1bmRsZV9vaygoc3RydWN0IHhmcm1fZHN0ICopZHN0KTsKIH0KIAogdm9pZCB4ZnJtX2RzdF9pZmRvd24oc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjMxMyw3ICsyMzEzLDcgQEAKICAqIHN0aWxsIHZhbGlkLgogICovCiAKLXN0YXRpYyBpbnQgeGZybV9idW5kbGVfb2soc3RydWN0IHhmcm1fZHN0ICpmaXJzdCwgaW50IGZhbWlseSkKK3N0YXRpYyBpbnQgeGZybV9idW5kbGVfb2soc3RydWN0IHhmcm1fZHN0ICpmaXJzdCkKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSAmZmlyc3QtPnUuZHN0OwogCXN0cnVjdCB4ZnJtX2RzdCAqbGFzdDsKQEAgLTIzODUsNiArMjM4NSwxMSBAQAogCXJldHVybiBkc3RfbXR1KGRzdC0+cGF0aCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hib3VyICp4ZnJtX25laWdoX2xvb2t1cChjb25zdCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIGNvbnN0IHZvaWQgKmRhZGRyKQoreworCXJldHVybiBkc3RfbmVpZ2hfbG9va3VwKGRzdC0+cGF0aCwgZGFkZHIpOworfQorCiBpbnQgeGZybV9wb2xpY3lfcmVnaXN0ZXJfYWZpbmZvKHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbykKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CkBAIC0yNDEwLDYgKzI0MTUsOCBAQAogCQkJZHN0X29wcy0+bmVnYXRpdmVfYWR2aWNlID0geGZybV9uZWdhdGl2ZV9hZHZpY2U7CiAJCWlmIChsaWtlbHkoZHN0X29wcy0+bGlua19mYWlsdXJlID09IE5VTEwpKQogCQkJZHN0X29wcy0+bGlua19mYWlsdXJlID0geGZybV9saW5rX2ZhaWx1cmU7CisJCWlmIChsaWtlbHkoZHN0X29wcy0+bmVpZ2hfbG9va3VwID09IE5VTEwpKQorCQkJZHN0X29wcy0+bmVpZ2hfbG9va3VwID0geGZybV9uZWlnaF9sb29rdXA7CiAJCWlmIChsaWtlbHkoYWZpbmZvLT5nYXJiYWdlX2NvbGxlY3QgPT0gTlVMTCkpCiAJCQlhZmluZm8tPmdhcmJhZ2VfY29sbGVjdCA9IF9feGZybV9nYXJiYWdlX2NvbGxlY3Q7CiAJCXhmcm1fcG9saWN5X2FmaW5mb1thZmluZm8tPmZhbWlseV0gPSBhZmluZm87CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3JlcGxheS5jIGIvbmV0L3hmcm0veGZybV9yZXBsYXkuYwppbmRleCA0N2YxYjg2Li5iMTFlYTY5IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3JlcGxheS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogCQkJYml0bnIgPSBiaXRuciAmIDB4MUY7CiAJCQlyZXBsYXlfZXNuLT5ibXBbbnJdIHw9ICgxVSA8PCBiaXRucik7CiAJCX0gZWxzZSB7Ci0JCQluciA9IHJlcGxheV9lc24tPnJlcGxheV93aW5kb3cgPj4gNTsKKwkJCW5yID0gKHJlcGxheV9lc24tPnJlcGxheV93aW5kb3cgLSAxKSA+PiA1OwogCQkJZm9yIChpID0gMDsgaSA8PSBucjsgaSsrKQogCQkJCXJlcGxheV9lc24tPmJtcFtpXSA9IDA7CiAKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCQkJYml0bnIgPSBiaXRuciAmIDB4MUY7CiAJCQlyZXBsYXlfZXNuLT5ibXBbbnJdIHw9ICgxVSA8PCBiaXRucik7CiAJCX0gZWxzZSB7Ci0JCQluciA9IHJlcGxheV9lc24tPnJlcGxheV93aW5kb3cgPj4gNTsKKwkJCW5yID0gKHJlcGxheV9lc24tPnJlcGxheV93aW5kb3cgLSAxKSA+PiA1OwogCQkJZm9yIChpID0gMDsgaSA8PSBucjsgaSsrKQogCQkJCXJlcGxheV9lc24tPmJtcFtpXSA9IDA7CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwppbmRleCBkNzBmODVlLi45NDE0YjljIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3N0YXRlLmMKKysrIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCkBAIC0xMzQ1LDYgKzEzNDUsOCBAQAogCQkJeGZybV9zdGF0ZV9jaGVja19leHBpcmUoeDEpOwogCiAJCWVyciA9IDA7CisJCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9ERUFEOworCQlfX3hmcm1fc3RhdGVfcHV0KHgpOwogCX0KIAlzcGluX3VubG9ja19iaCgmeDEtPmxvY2spOwogCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3VzZXIuYyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCmluZGV4IGM2NThjYjMuLjAyNTZiOGEgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fdXNlci5jCisrKyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCkBAIC0yMjk5LDcgKzIyOTksOCBAQAogCQlpZiAobGluay0+ZHVtcCA9PSBOVUxMKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJcmV0dXJuIG5ldGxpbmtfZHVtcF9zdGFydChuZXQtPnhmcm0ubmxzaywgc2tiLCBubGgsIGxpbmstPmR1bXAsIGxpbmstPmRvbmUpOworCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KG5ldC0+eGZybS5ubHNrLCBza2IsIG5saCwKKwkJCQkJICBsaW5rLT5kdW1wLCBsaW5rLT5kb25lLCAwKTsKIAl9CiAKIAllcnIgPSBubG1zZ19wYXJzZShubGgsIHhmcm1fbXNnX21pblt0eXBlXSwgYXR0cnMsIFhGUk1BX01BWCwKZGlmZiAtLWdpdCBhL3NhbXBsZXMvaHdfYnJlYWtwb2ludC9kYXRhX2JyZWFrcG9pbnQuYyBiL3NhbXBsZXMvaHdfYnJlYWtwb2ludC9kYXRhX2JyZWFrcG9pbnQuYwppbmRleCAwNjM2NTM5Li5lZjdmMzIyIDEwMDY0NAotLS0gYS9zYW1wbGVzL2h3X2JyZWFrcG9pbnQvZGF0YV9icmVha3BvaW50LmMKKysrIGIvc2FtcGxlcy9od19icmVha3BvaW50L2RhdGFfYnJlYWtwb2ludC5jCkBAIC00MSw3ICs0MSw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGtzeW0sICJLZXJuZWwgc3ltYm9sIHRvIG1vbml0b3I7IHRoaXMgbW9kdWxlIHdpbGwgcmVwb3J0IGFueSIKIAkJCSIgd3JpdGUgb3BlcmF0aW9ucyBvbiB0aGUga2VybmVsIHN5bWJvbCIpOwogCi1zdGF0aWMgdm9pZCBzYW1wbGVfaGJwX2hhbmRsZXIoc3RydWN0IHBlcmZfZXZlbnQgKmJwLCBpbnQgbm1pLAorc3RhdGljIHZvaWQgc2FtcGxlX2hicF9oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpicCwKIAkJCSAgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwKIAkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTYwLDcgKzYwLDcgQEAKIAlhdHRyLmJwX2xlbiA9IEhXX0JSRUFLUE9JTlRfTEVOXzQ7CiAJYXR0ci5icF90eXBlID0gSFdfQlJFQUtQT0lOVF9XIHwgSFdfQlJFQUtQT0lOVF9SOwogCi0Jc2FtcGxlX2hicCA9IHJlZ2lzdGVyX3dpZGVfaHdfYnJlYWtwb2ludCgmYXR0ciwgc2FtcGxlX2hicF9oYW5kbGVyKTsKKwlzYW1wbGVfaGJwID0gcmVnaXN0ZXJfd2lkZV9od19icmVha3BvaW50KCZhdHRyLCBzYW1wbGVfaGJwX2hhbmRsZXIsIE5VTEwpOwogCWlmIChJU19FUlIoKHZvaWQgX19mb3JjZSAqKXNhbXBsZV9oYnApKSB7CiAJCXJldCA9IFBUUl9FUlIoKHZvaWQgX19mb3JjZSAqKXNhbXBsZV9oYnApOwogCQlnb3RvIGZhaWw7CmRpZmYgLS1naXQgYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQppbmRleCBiZTM5Y2QxLi5kODk3Mjc4IDEwMDY0NAotLS0gYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCisrKyBiL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKQEAgLTIxLDYgKzIxLDEwIEBACiBiYXNldGFyZ2V0ID0gJChiYXNlbmFtZSAkKG5vdGRpciAkQCkpCiAKICMjIworIyBmaWxlbmFtZSBvZiBmaXJzdCBwcmVyZXF1aXNpdGUgd2l0aCBkaXJlY3RvcnkgYW5kIGV4dGVuc2lvbiBzdHJpcHBlZAorYmFzZXByZXJlcSA9ICQoYmFzZW5hbWUgJChub3RkaXIgJDwpKQorCisjIyMKICMgRXNjYXBlIHNpbmdsZSBxdW90ZSBmb3IgdXNlIGluIGVjaG8gc3RhdGVtZW50cwogZXNjc3EgPSAkKHN1YnN0ICQoc3F1b3RlKSwnXCQoc3F1b3RlKScsJDEpCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuYXNtLWdlbmVyaWMgYi9zY3JpcHRzL01ha2VmaWxlLmFzbS1nZW5lcmljCmluZGV4IDQ5MDEyMmMuLjQwY2FmM2MgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUuYXNtLWdlbmVyaWMKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5hc20tZ2VuZXJpYwpAQCAtMTcsNiArMTcsNyBAQAogY21kX3dyYXAgPSBlY2hvICJcI2luY2x1ZGUgPGFzbS1nZW5lcmljLyQqLmg+IiA+JEAKIAogYWxsOiAkKHBhdHN1YnN0ICUsICQob2JqKS8lLCAkKGdlbmVyaWMteSkpCisJQDoKIAogJChvYmopLyUuaDoKIAkkKGNhbGwgY21kLHdyYXApCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmxpYiBiL3NjcmlwdHMvTWFrZWZpbGUubGliCmluZGV4IDkzYjJiNTkuLmFlZWE4NGEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUubGliCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubGliCkBAIC0xNjAsMTMgKzE2MCw1MSBAQAogbW9kbmFtZS1tdWx0aSA9ICQoc29ydCAkKGZvcmVhY2ggbSwkKG11bHRpLXVzZWQpLFwKIAkJJChpZiAkKGZpbHRlciAkKHN1YnN0ICQob2JqKS8sLCQqLm8pLCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpLCQobToubz0pKSkpCiAKK2lmZGVmIFJFR0VORVJBVEVfUEFSU0VSUworCisjIEdQRVJGCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcXVpZXRfY21kX2dwZXJmID0gR1BFUkYgJEAKKyAgICAgIGNtZF9ncGVyZiA9IGdwZXJmIC10IC0tb3V0cHV0LWZpbGUgJEAgLWEgLUMgLUUgLWcgLWsgMSwzLCQkIC1wIC10ICQ8CisKKyQoc3JjKS8lLmhhc2guY19zaGlwcGVkOiAkKHNyYykvJS5ncGVyZgorCSQoY2FsbCBjbWQsZ3BlcmYpCisKKyMgTEVYCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTEVYX1BSRUZJWCA9ICQoaWYgJChMRVhfUFJFRklYXyR7YmFzZXByZXJlcX0pLCQoTEVYX1BSRUZJWF8ke2Jhc2VwcmVyZXF9KSx5eSkKKworcXVpZXRfY21kX2ZsZXggPSBMRVggICAgICRACisgICAgICBjbWRfZmxleCA9IGZsZXggLW8kQCAtTCAtUCAkKExFWF9QUkVGSVgpICQ8CisKKyQoc3JjKS8lLmxleC5jX3NoaXBwZWQ6ICQoc3JjKS8lLmwKKwkkKGNhbGwgY21kLGZsZXgpCisKKyMgWUFDQworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1lBQ0NfUFJFRklYID0gJChpZiAkKFlBQ0NfUFJFRklYXyR7YmFzZXByZXJlcX0pLCQoWUFDQ19QUkVGSVhfJHtiYXNlcHJlcmVxfSkseXkpCisKK3F1aWV0X2NtZF9iaXNvbiA9IFlBQ0MgICAgJEAKKyAgICAgIGNtZF9iaXNvbiA9IGJpc29uIC1vJEAgLXQgLWwgLXAgJChZQUNDX1BSRUZJWCkgJDwKKworJChzcmMpLyUudGFiLmNfc2hpcHBlZDogJChzcmMpLyUueQorCSQoY2FsbCBjbWQsYmlzb24pCisKK3F1aWV0X2NtZF9iaXNvbl9oID0gWUFDQyAgICAkQAorICAgICAgY21kX2Jpc29uX2ggPSBiaXNvbiAtby9kZXYvbnVsbCAtLWRlZmluZXM9JEAgLXQgLWwgLXAgJChZQUNDX1BSRUZJWCkgJDwKKworJChzcmMpLyUudGFiLmhfc2hpcHBlZDogJChzcmMpLyUueQorCSQoY2FsbCBjbWQsYmlzb25faCkKKworZW5kaWYKKwogIyBTaGlwcGVkIGZpbGVzCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBxdWlldF9jbWRfc2hpcHBlZCA9IFNISVBQRUQgJEAKIGNtZF9zaGlwcGVkID0gY2F0ICQ8ID4gJEAKIAotJChvYmopLyU6OiAkKHNyYykvJV9zaGlwcGVkCiskKG9iaikvJTogJChzcmMpLyVfc2hpcHBlZAogCSQoY2FsbCBjbWQsc2hpcHBlZCkKIAogIyBDb21tYW5kcyB1c2VmdWwgZm9yIGJ1aWxkaW5nIGEgYm9vdCBpbWFnZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0IGIvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CmluZGV4IDU2ZGZhZmMuLjA4ZGNlMTQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdAorKysgYi9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKQEAgLTE4LDcgKzE4LDcgQEAKIAogIyBTdGVwIDMgaXMgdXNlZCB0byBwbGFjZSBjZXJ0YWluIGluZm9ybWF0aW9uIGluIHRoZSBtb2R1bGUncyBFTEYKICMgc2VjdGlvbiwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIHN1Y2ggYXM6Ci0jICAgVmVyc2lvbiBtYWdpYyAoc2VlIGluY2x1ZGUvdmVybWFnaWMuaCBmb3IgZnVsbCBkZXRhaWxzKQorIyAgIFZlcnNpb24gbWFnaWMgKHNlZSBpbmNsdWRlL2xpbnV4L3Zlcm1hZ2ljLmggZm9yIGZ1bGwgZGV0YWlscykKICMgICAgIC0gS2VybmVsIHJlbGVhc2UKICMgICAgIC0gU01QIGlzIENPTkZJR19TTVAKICMgICAgIC0gUFJFRU1QVCBpcyBDT05GSUdfUFJFRU1QVApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ib290Z3JhcGgucGwgYi9zY3JpcHRzL2Jvb3RncmFwaC5wbAppbmRleCAxMmNhYTgyLi5iNzhmY2E5IDEwMDY0NAotLS0gYS9zY3JpcHRzL2Jvb3RncmFwaC5wbAorKysgYi9zY3JpcHRzL2Jvb3RncmFwaC5wbApAQCAtNDQsNyArNDQsNyBAQAogbXkgJXR5cGU7CiBteSAkZG9uZSA9IDA7CiBteSAkbWF4dGltZSA9IDA7Ci1teSAkZmlyc3R0aW1lID0gMTAwOworbXkgJGZpcnN0dGltZSA9IDk5OTk5OwogbXkgJGNvdW50ID0gMDsKIG15ICVwaWRzOwogbXkgJXBpZGN0cjsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbCBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbAppbmRleCA4NjU3Zjk5Li45ZDc2MWM5IDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKKysrIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCkBAIC0xMCw3ICsxMCw3IEBACiBteSAkUCA9ICQwOwogJFAgPX4gc0AuKi9AQGc7CiAKLW15ICRWID0gJzAuMzEnOworbXkgJFYgPSAnMC4zMic7CiAKIHVzZSBHZXRvcHQ6OkxvbmcgcXcoOmNvbmZpZyBub19hdXRvX2FiYnJldik7CiAKQEAgLTI2LDkgKzI2LDEzIEBACiBteSAkc3VtbWFyeSA9IDE7CiBteSAkbWFpbGJhY2sgPSAwOwogbXkgJHN1bW1hcnlfZmlsZSA9IDA7CitteSAkc2hvd190eXBlcyA9IDA7CiBteSAkcm9vdDsKIG15ICVkZWJ1ZzsKK215ICVpZ25vcmVfdHlwZSA9ICgpOworbXkgQGlnbm9yZSA9ICgpOwogbXkgJGhlbHAgPSAwOworbXkgJGNvbmZpZ3VyYXRpb25fZmlsZSA9ICIuY2hlY2twYXRjaC5jb25mIjsKIAogc3ViIGhlbHAgewogCW15ICgkZXhpdGNvZGUpID0gQF87CkBAIC00Niw2ICs1MCw4IEBACiAgIC0tdGVyc2UgICAgICAgICAgICAgICAgICAgIG9uZSBsaW5lIHBlciByZXBvcnQKICAgLWYsIC0tZmlsZSAgICAgICAgICAgICAgICAgdHJlYXQgRklMRSBhcyByZWd1bGFyIHNvdXJjZSBmaWxlCiAgIC0tc3ViamVjdGl2ZSwgLS1zdHJpY3QgICAgIGVuYWJsZSBtb3JlIHN1YmplY3RpdmUgdGVzdHMKKyAgLS1pZ25vcmUgVFlQRSgsVFlQRTIuLi4pICAgaWdub3JlIHZhcmlvdXMgY29tbWEgc2VwYXJhdGVkIG1lc3NhZ2UgdHlwZXMKKyAgLS1zaG93LXR5cGVzICAgICAgICAgICAgICAgc2hvdyB0aGUgbWVzc2FnZSAidHlwZXMiIGluIHRoZSBvdXRwdXQKICAgLS1yb290PVBBVEggICAgICAgICAgICAgICAgUEFUSCB0byB0aGUga2VybmVsIHRyZWUgcm9vdAogICAtLW5vLXN1bW1hcnkgICAgICAgICAgICAgICBzdXBwcmVzcyB0aGUgcGVyLWZpbGUgc3VtbWFyeQogICAtLW1haWxiYWNrICAgICAgICAgICAgICAgICBvbmx5IHByb2R1Y2UgYSByZXBvcnQgaW4gY2FzZSBvZiB3YXJuaW5ncy9lcnJvcnMKQEAgLTYzLDYgKzY5LDMyIEBACiAJZXhpdCgkZXhpdGNvZGUpOwogfQogCitteSAkY29uZiA9IHdoaWNoX2NvbmYoJGNvbmZpZ3VyYXRpb25fZmlsZSk7CitpZiAoLWYgJGNvbmYpIHsKKwlteSBAY29uZl9hcmdzOworCW9wZW4obXkgJGNvbmZmaWxlLCAnPCcsICIkY29uZiIpCisJICAgIG9yIHdhcm4gIiRQOiBDYW4ndCBmaW5kIGEgcmVhZGFibGUgJGNvbmZpZ3VyYXRpb25fZmlsZSBmaWxlICQhXG4iOworCisJd2hpbGUgKDwkY29uZmZpbGU+KSB7CisJCW15ICRsaW5lID0gJF87CisKKwkJJGxpbmUgPX4gcy9ccypcbj8kLy9nOworCQkkbGluZSA9fiBzL15ccyovL2c7CisJCSRsaW5lID1+IHMvXHMrLyAvZzsKKworCQluZXh0IGlmICgkbGluZSA9fiBtL15ccyojLyk7CisJCW5leHQgaWYgKCRsaW5lID1+IG0vXlxzKiQvKTsKKworCQlteSBAd29yZHMgPSBzcGxpdCgiICIsICRsaW5lKTsKKwkJZm9yZWFjaCBteSAkd29yZCAoQHdvcmRzKSB7CisJCQlsYXN0IGlmICgkd29yZCA9fiBtL14jLyk7CisJCQlwdXNoIChAY29uZl9hcmdzLCAkd29yZCk7CisJCX0KKwl9CisJY2xvc2UoJGNvbmZmaWxlKTsKKwl1bnNoaWZ0KEBBUkdWLCBAY29uZl9hcmdzKSBpZiBAY29uZl9hcmdzOworfQorCiBHZXRPcHRpb25zKAogCSdxfHF1aWV0KycJPT4gXCRxdWlldCwKIAkndHJlZSEnCQk9PiBcJHRyZWUsCkBAIC03Myw2ICsxMDUsOCBAQAogCSdmfGZpbGUhJwk9PiBcJGZpbGUsCiAJJ3N1YmplY3RpdmUhJwk9PiBcJGNoZWNrLAogCSdzdHJpY3QhJwk9PiBcJGNoZWNrLAorCSdpZ25vcmU9cycJPT4gXEBpZ25vcmUsCisJJ3Nob3ctdHlwZXMhJwk9PiBcJHNob3dfdHlwZXMsCiAJJ3Jvb3Q9cycJPT4gXCRyb290LAogCSdzdW1tYXJ5IScJPT4gXCRzdW1tYXJ5LAogCSdtYWlsYmFjayEnCT0+IFwkbWFpbGJhY2ssCkBAIC05Myw2ICsxMjcsMTkgQEAKIAlleGl0KDEpOwogfQogCitAaWdub3JlID0gc3BsaXQoLywvLCBqb2luKCcsJyxAaWdub3JlKSk7Citmb3JlYWNoIG15ICR3b3JkIChAaWdub3JlKSB7CisJJHdvcmQgPX4gcy9ccypcbj8kLy9nOworCSR3b3JkID1+IHMvXlxzKi8vZzsKKwkkd29yZCA9fiBzL1xzKy8gL2c7CisJJHdvcmQgPX4gdHIvW2Etel0vW0EtWl0vOworCisJbmV4dCBpZiAoJHdvcmQgPX4gbS9eXHMqIy8pOworCW5leHQgaWYgKCR3b3JkID1+IG0vXlxzKiQvKTsKKworCSRpZ25vcmVfdHlwZXskd29yZH0rKzsKK30KKwogbXkgJGRiZ192YWx1ZXMgPSAwOwogbXkgJGRiZ19wb3NzaWJsZSA9IDA7CiBteSAkZGJnX3R5cGUgPSAwOwpAQCAtMTQ1LDcgKzE5Miw4IEBACiAJCQlfX211c3RfY2hlY2t8CiAJCQlfX2luaXRfcmVmb2t8CiAJCQlfX2twcm9iZXN8Ci0JCQlfX3JlZgorCQkJX19yZWZ8CisJCQlfX3JjdQogCQl9eDsKIAogIyBOb3RlcyB0byAkQXR0cmlidXRlOgpAQCAtMjA5LDEzICsyNTcsMjMgQEAKICl9OwogCiBvdXIgJGxvZ0Z1bmN0aW9ucyA9IHFyeyg/eDoKLQlwcmludGt8Ci0JW2Etel0rXyhlbWVyZ3xhbGVydHxjcml0fGVycnx3YXJuaW5nfHdhcm58bm90aWNlfGluZm98ZGVidWd8ZGJnfHZkYmd8ZGV2ZWx8Y29udHxXQVJOKXwKLQlXQVJOfAorCXByaW50ayg/Ol9yYXRlbGltaXRlZHxfb25jZXwpfAorCVthLXowLTldK18oPzpwcmludGt8ZW1lcmd8YWxlcnR8Y3JpdHxlcnJ8d2FybmluZ3x3YXJufG5vdGljZXxpbmZvfGRlYnVnfGRiZ3x2ZGJnfGRldmVsfGNvbnR8V0FSTikoPzpfcmF0ZWxpbWl0ZWR8X29uY2V8KXwKKwlXQVJOKD86X1JBVEVMSU1JVHxfT05DRXwpfAogCXBhbmljfAogCU1PRFVMRV9bQS1aX10rCiApfTsKIAorb3VyICRzaWduYXR1cmVfdGFncyA9IHFyeyg/eGk6CisJU2lnbmVkLW9mZi1ieTp8CisJQWNrZWQtYnk6fAorCVRlc3RlZC1ieTp8CisJUmV2aWV3ZWQtYnk6fAorCVJlcG9ydGVkLWJ5OnwKKwlUbzp8CisJQ2M6CispfTsKKwogb3VyIEB0eXBlTGlzdCA9ICgKIAlxcnt2b2lkfSwKIAlxcnsoPzp1bnNpZ25lZFxzKyk/Y2hhcn0sCkBAIC0yNjgsNiArMzI2LDIwIEBACiB9CiBidWlsZF90eXBlcygpOwogCitvdXIgJG1hdGNoX2JhbGFuY2VkX3BhcmVudGhlc2VzID0gcXIvKFwoKD86W15cKFwpXSt8KC0xKSkqXCkpLzsKKworb3VyICRUeXBlY2FzdAk9IHFye1xzKihcKFxzKiROb25wdHJUeXBlXHMqXCkpezAsMX1ccyp9Oworb3VyICRMdmFsT3JGdW5jCT0gcXJ7KCRMdmFsKVxzKigkbWF0Y2hfYmFsYW5jZWRfcGFyZW50aGVzZXN7MCwxfSlccyp9OworCitzdWIgZGVwYXJlbnRoZXNpemUgeworCW15ICgkc3RyaW5nKSA9IEBfOworCXJldHVybiAiIiBpZiAoIWRlZmluZWQoJHN0cmluZykpOworCSRzdHJpbmcgPX4gc0BeXHMqXChccypAQGc7CisJJHN0cmluZyA9fiBzQFxzKlwpXHMqJEBAZzsKKwkkc3RyaW5nID1+IHNAXHMrQCBAZzsKKwlyZXR1cm4gJHN0cmluZzsKK30KKwogJGNoa19zaWdub2ZmID0gMCBpZiAoJGZpbGUpOwogCiBteSBAZGVwX2luY2x1ZGVzID0gKCk7CkBAIC0zMzksNiArNDExLDg4IEBACiAJCX0KIAl9CiAJcmV0dXJuIDE7CisgICAgfQorCitzdWIgcGFyc2VfZW1haWwgeworCW15ICgkZm9ybWF0dGVkX2VtYWlsKSA9IEBfOworCisJbXkgJG5hbWUgPSAiIjsKKwlteSAkYWRkcmVzcyA9ICIiOworCW15ICRjb21tZW50ID0gIiI7CisKKwlpZiAoJGZvcm1hdHRlZF9lbWFpbCA9fiAvXiguKik8KFxTK1xAXFMrKT4oLiopJC8pIHsKKwkJJG5hbWUgPSAkMTsKKwkJJGFkZHJlc3MgPSAkMjsKKwkJJGNvbW1lbnQgPSAkMyBpZiBkZWZpbmVkICQzOworCX0gZWxzaWYgKCRmb3JtYXR0ZWRfZW1haWwgPX4gL15ccyo8KFxTK1xAXFMrKT4oLiopJC8pIHsKKwkJJGFkZHJlc3MgPSAkMTsKKwkJJGNvbW1lbnQgPSAkMiBpZiBkZWZpbmVkICQyOworCX0gZWxzaWYgKCRmb3JtYXR0ZWRfZW1haWwgPX4gLyhcUytcQFxTKykoLiopJC8pIHsKKwkJJGFkZHJlc3MgPSAkMTsKKwkJJGNvbW1lbnQgPSAkMiBpZiBkZWZpbmVkICQyOworCQkkZm9ybWF0dGVkX2VtYWlsID1+IHMvJGFkZHJlc3MuKiQvLzsKKwkJJG5hbWUgPSAkZm9ybWF0dGVkX2VtYWlsOworCQkkbmFtZSA9fiBzL15ccyt8XHMrJC8vZzsKKwkJJG5hbWUgPX4gcy9eXCJ8XCIkLy9nOworCQkjIElmIHRoZXJlJ3MgYSBuYW1lIGxlZnQgYWZ0ZXIgc3RyaXBwaW5nIHNwYWNlcyBhbmQKKwkJIyBsZWFkaW5nIHF1b3RlcywgYW5kIHRoZSBhZGRyZXNzIGRvZXNuJ3QgaGF2ZSBib3RoCisJCSMgbGVhZGluZyBhbmQgdHJhaWxpbmcgYW5nbGUgYnJhY2tldHMsIHRoZSBhZGRyZXNzCisJCSMgaXMgaW52YWxpZC4gaWU6CisJCSMgICAiam9lIHNtaXRoIGpvZUBzbWl0aC5jb20iIGJhZAorCQkjICAgImpvZSBzbWl0aCA8am9lQHNtaXRoLmNvbSIgYmFkCisJCWlmICgkbmFtZSBuZSAiIiAmJiAkYWRkcmVzcyAhfiAvXjxbXj5dKz4kLykgeworCQkJJG5hbWUgPSAiIjsKKwkJCSRhZGRyZXNzID0gIiI7CisJCQkkY29tbWVudCA9ICIiOworCQl9CisJfQorCisJJG5hbWUgPX4gcy9eXHMrfFxzKyQvL2c7CisJJG5hbWUgPX4gcy9eXCJ8XCIkLy9nOworCSRhZGRyZXNzID1+IHMvXlxzK3xccyskLy9nOworCSRhZGRyZXNzID1+IHMvXlw8fFw+JC8vZzsKKworCWlmICgkbmFtZSA9fiAvW15cdyBcLV0vaSkgeyAjI2hhcyAibXVzdCBxdW90ZSIgY2hhcnMKKwkJJG5hbWUgPX4gcy8oPzwhXFwpIi9cXCIvZzsgIyNlc2NhcGUgcXVvdGVzCisJCSRuYW1lID0gIlwiJG5hbWVcIiI7CisJfQorCisJcmV0dXJuICgkbmFtZSwgJGFkZHJlc3MsICRjb21tZW50KTsKK30KKworc3ViIGZvcm1hdF9lbWFpbCB7CisJbXkgKCRuYW1lLCAkYWRkcmVzcykgPSBAXzsKKworCW15ICRmb3JtYXR0ZWRfZW1haWw7CisKKwkkbmFtZSA9fiBzL15ccyt8XHMrJC8vZzsKKwkkbmFtZSA9fiBzL15cInxcIiQvL2c7CisJJGFkZHJlc3MgPX4gcy9eXHMrfFxzKyQvL2c7CisKKwlpZiAoJG5hbWUgPX4gL1teXHcgXC1dL2kpIHsgIyNoYXMgIm11c3QgcXVvdGUiIGNoYXJzCisJCSRuYW1lID1+IHMvKD88IVxcKSIvXFwiL2c7ICMjZXNjYXBlIHF1b3RlcworCQkkbmFtZSA9ICJcIiRuYW1lXCIiOworCX0KKworCWlmICgiJG5hbWUiIGVxICIiKSB7CisJCSRmb3JtYXR0ZWRfZW1haWwgPSAiJGFkZHJlc3MiOworCX0gZWxzZSB7CisJCSRmb3JtYXR0ZWRfZW1haWwgPSAiJG5hbWUgPCRhZGRyZXNzPiI7CisJfQorCisJcmV0dXJuICRmb3JtYXR0ZWRfZW1haWw7Cit9CisKK3N1YiB3aGljaF9jb25mIHsKKwlteSAoJGNvbmYpID0gQF87CisKKwlmb3JlYWNoIG15ICRwYXRoIChzcGxpdCgvOi8sICIuOiRFTlZ7SE9NRX06LnNjcmlwdHMiKSkgeworCQlpZiAoLWUgIiRwYXRoLyRjb25mIikgeworCQkJcmV0dXJuICIkcGF0aC8kY29uZiI7CisJCX0KKwl9CisKKwlyZXR1cm4gIiI7CiB9CiAKIHN1YiBleHBhbmRfdGFicyB7CkBAIC0xMDg2LDEyICsxMjQwLDIxIEBACiAKIG15ICRwcmVmaXggPSAnJzsKIAorc3ViIHNob3dfdHlwZSB7CisgICAgICAgcmV0dXJuICFkZWZpbmVkICRpZ25vcmVfdHlwZXskX1swXX07Cit9CisKIHN1YiByZXBvcnQgewotCWlmIChkZWZpbmVkICR0c3Rfb25seSAmJiAkX1swXSAhfiAvXFEkdHN0X29ubHlcRS8pIHsKKwlpZiAoIXNob3dfdHlwZSgkX1sxXSkgfHwKKwkgICAgKGRlZmluZWQgJHRzdF9vbmx5ICYmICRfWzJdICF+IC9cUSR0c3Rfb25seVxFLykpIHsKIAkJcmV0dXJuIDA7CiAJfQotCW15ICRsaW5lID0gJHByZWZpeCAuICRfWzBdOwotCisJbXkgJGxpbmU7CisJaWYgKCRzaG93X3R5cGVzKSB7CisJCSRsaW5lID0gIiRwcmVmaXgkX1swXTokX1sxXTogJF9bMl1cbiI7CisJfSBlbHNlIHsKKwkJJGxpbmUgPSAiJHByZWZpeCRfWzBdOiAkX1syXVxuIjsKKwl9CiAJJGxpbmUgPSAoc3BsaXQoJ1xuJywgJGxpbmUpKVswXSAuICJcbiIgaWYgKCR0ZXJzZSk7CiAKIAlwdXNoKG91ciBAcmVwb3J0LCAkbGluZSk7CkBAIC0xMTAxLDIwICsxMjY0LDIxIEBACiBzdWIgcmVwb3J0X2R1bXAgewogCW91ciBAcmVwb3J0OwogfQorCiBzdWIgRVJST1IgewotCWlmIChyZXBvcnQoIkVSUk9SOiAkX1swXVxuIikpIHsKKwlpZiAocmVwb3J0KCJFUlJPUiIsICRfWzBdLCAkX1sxXSkpIHsKIAkJb3VyICRjbGVhbiA9IDA7CiAJCW91ciAkY250X2Vycm9yKys7CiAJfQogfQogc3ViIFdBUk4gewotCWlmIChyZXBvcnQoIldBUk5JTkc6ICRfWzBdXG4iKSkgeworCWlmIChyZXBvcnQoIldBUk5JTkciLCAkX1swXSwgJF9bMV0pKSB7CiAJCW91ciAkY2xlYW4gPSAwOwogCQlvdXIgJGNudF93YXJuKys7CiAJfQogfQogc3ViIENISyB7Ci0JaWYgKCRjaGVjayAmJiByZXBvcnQoIkNIRUNLOiAkX1swXVxuIikpIHsKKwlpZiAoJGNoZWNrICYmIHJlcG9ydCgiQ0hFQ0siLCAkX1swXSwgJF9bMV0pKSB7CiAJCW91ciAkY2xlYW4gPSAwOwogCQlvdXIgJGNudF9jaGsrKzsKIAl9CkBAIC0xMTQzLDcgKzEzMDcsOCBAQAogCiAJIyNwcmludCAicHJlZml4PCRwcmVmaXg+XG4iOwogCWlmICgkcHJlZml4IG5lICIuLi4vIikgewotCQlXQVJOKCJ1c2UgcmVsYXRpdmUgcGF0aG5hbWUgaW5zdGVhZCBvZiBhYnNvbHV0ZSBpbiBjaGFuZ2Vsb2cgdGV4dFxuIiAuICRoZXJlY3Vycik7CisJCVdBUk4oIlVTRV9SRUxBVElWRV9QQVRIIiwKKwkJICAgICAidXNlIHJlbGF0aXZlIHBhdGhuYW1lIGluc3RlYWQgb2YgYWJzb2x1dGUgaW4gY2hhbmdlbG9nIHRleHRcbiIgLiAkaGVyZWN1cnIpOwogCX0KIH0KIApAQCAtMTM0MCwxMSArMTUwNSwxMyBAQAogCQkJJHAxX3ByZWZpeCA9ICQxOwogCQkJaWYgKCEkZmlsZSAmJiAkdHJlZSAmJiAkcDFfcHJlZml4IG5lICcnICYmCiAJCQkgICAgLWUgIiRyb290LyRwMV9wcmVmaXgiKSB7Ci0JCQkJV0FSTigicGF0Y2ggcHJlZml4ICckcDFfcHJlZml4JyBleGlzdHMsIGFwcGVhcnMgdG8gYmUgYSAtcDAgcGF0Y2hcbiIpOworCQkJCVdBUk4oIlBBVENIX1BSRUZJWCIsCisJCQkJICAgICAicGF0Y2ggcHJlZml4ICckcDFfcHJlZml4JyBleGlzdHMsIGFwcGVhcnMgdG8gYmUgYSAtcDAgcGF0Y2hcbiIpOwogCQkJfQogCiAJCQlpZiAoJHJlYWxmaWxlID1+IG1AXmluY2x1ZGUvYXNtL0ApIHsKLQkJCQlFUlJPUigiZG8gbm90IG1vZGlmeSBmaWxlcyBpbiBpbmNsdWRlL2FzbSwgY2hhbmdlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmaWxlcyBpbiBpbmNsdWRlL2FzbS08YXJjaGl0ZWN0dXJlPlxuIiAuICIkaGVyZSRyYXdsaW5lXG4iKTsKKwkJCQlFUlJPUigiTU9ESUZJRURfSU5DTFVERV9BU00iLAorCQkJCSAgICAgICJkbyBub3QgbW9kaWZ5IGZpbGVzIGluIGluY2x1ZGUvYXNtLCBjaGFuZ2UgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZpbGVzIGluIGluY2x1ZGUvYXNtLTxhcmNoaXRlY3R1cmU+XG4iIC4gIiRoZXJlJHJhd2xpbmVcbiIpOwogCQkJfQogCQkJbmV4dDsKIAkJfQpAQCAtMTM2MSwyNyArMTUyOCw2MSBAQAogCQlpZiAoJGxpbmUgPX4gL15uZXcgKGZpbGUgKT9tb2RlLipbNzUzMV1cZHswLDJ9JC8pIHsKIAkJCW15ICRwZXJtaGVyZSA9ICRoZXJlIC4gIkZJTEU6ICRyZWFsZmlsZVxuIjsKIAkJCWlmICgkcmVhbGZpbGUgPX4gLyhNYWtlZmlsZXxLY29uZmlnfFwuY3xcLmh8XC5TfFwudG1wbCkkLykgewotCQkJCUVSUk9SKCJkbyBub3Qgc2V0IGV4ZWN1dGUgcGVybWlzc2lvbnMgZm9yIHNvdXJjZSBmaWxlc1xuIiAuICRwZXJtaGVyZSk7CisJCQkJRVJST1IoIkVYRUNVVEVfUEVSTUlTU0lPTlMiLAorCQkJCSAgICAgICJkbyBub3Qgc2V0IGV4ZWN1dGUgcGVybWlzc2lvbnMgZm9yIHNvdXJjZSBmaWxlc1xuIiAuICRwZXJtaGVyZSk7CiAJCQl9CiAJCX0KIAotI2NoZWNrIHRoZSBwYXRjaCBmb3IgYSBzaWdub2ZmOgorIyBDaGVjayB0aGUgcGF0Y2ggZm9yIGEgc2lnbm9mZjoKIAkJaWYgKCRsaW5lID1+IC9eXHMqc2lnbmVkLW9mZi1ieTovaSkgewotCQkJIyBUaGlzIGlzIGEgc2lnbm9mZiwgaWYgdWdseSwgc28gZG8gbm90IGRvdWJsZSByZXBvcnQuCiAJCQkkc2lnbm9mZisrOwotCQkJaWYgKCEoJGxpbmUgPX4gL15ccypTaWduZWQtb2ZmLWJ5Oi8pKSB7Ci0JCQkJV0FSTigiU2lnbmVkLW9mZi1ieTogaXMgdGhlIHByZWZlcnJlZCBmb3JtXG4iIC4KLQkJCQkJJGhlcmVjdXJyKTsKKwkJfQorCisjIENoZWNrIHNpZ25hdHVyZSBzdHlsZXMKKwkJaWYgKCRsaW5lID1+IC9eKFxzKikoJHNpZ25hdHVyZV90YWdzKShccyopKC4qKS8pIHsKKwkJCW15ICRzcGFjZV9iZWZvcmUgPSAkMTsKKwkJCW15ICRzaWduX29mZiA9ICQyOworCQkJbXkgJHNwYWNlX2FmdGVyID0gJDM7CisJCQlteSAkZW1haWwgPSAkNDsKKwkJCW15ICR1Y2ZpcnN0X3NpZ25fb2ZmID0gdWNmaXJzdChsYygkc2lnbl9vZmYpKTsKKworCQkJaWYgKGRlZmluZWQgJHNwYWNlX2JlZm9yZSAmJiAkc3BhY2VfYmVmb3JlIG5lICIiKSB7CisJCQkJV0FSTigiQkFEX1NJR05fT0ZGIiwKKwkJCQkgICAgICJEbyBub3QgdXNlIHdoaXRlc3BhY2UgYmVmb3JlICR1Y2ZpcnN0X3NpZ25fb2ZmXG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KLQkJCWlmICgkbGluZSA9fiAvXlxzKnNpZ25lZC1vZmYtYnk6XFMvaSkgewotCQkJCVdBUk4oInNwYWNlIHJlcXVpcmVkIGFmdGVyIFNpZ25lZC1vZmYtYnk6XG4iIC4KLQkJCQkJJGhlcmVjdXJyKTsKKwkJCWlmICgkc2lnbl9vZmYgPX4gLy1ieTokL2kgJiYgJHNpZ25fb2ZmIG5lICR1Y2ZpcnN0X3NpZ25fb2ZmKSB7CisJCQkJV0FSTigiQkFEX1NJR05fT0ZGIiwKKwkJCQkgICAgICInJHVjZmlyc3Rfc2lnbl9vZmYnIGlzIHRoZSBwcmVmZXJyZWQgc2lnbmF0dXJlIGZvcm1cbiIgLiAkaGVyZWN1cnIpOworCQkJfQorCQkJaWYgKCFkZWZpbmVkICRzcGFjZV9hZnRlciB8fCAkc3BhY2VfYWZ0ZXIgbmUgIiAiKSB7CisJCQkJV0FSTigiQkFEX1NJR05fT0ZGIiwKKwkJCQkgICAgICJVc2UgYSBzaW5nbGUgc3BhY2UgYWZ0ZXIgJHVjZmlyc3Rfc2lnbl9vZmZcbiIgLiAkaGVyZWN1cnIpOworCQkJfQorCisJCQlteSAoJGVtYWlsX25hbWUsICRlbWFpbF9hZGRyZXNzLCAkY29tbWVudCkgPSBwYXJzZV9lbWFpbCgkZW1haWwpOworCQkJbXkgJHN1Z2dlc3RlZF9lbWFpbCA9IGZvcm1hdF9lbWFpbCgoJGVtYWlsX25hbWUsICRlbWFpbF9hZGRyZXNzKSk7CisJCQlpZiAoJHN1Z2dlc3RlZF9lbWFpbCBlcSAiIikgeworCQkJCUVSUk9SKCJCQURfU0lHTl9PRkYiLAorCQkJCSAgICAgICJVbnJlY29nbml6ZWQgZW1haWwgYWRkcmVzczogJyRlbWFpbCdcbiIgLiAkaGVyZWN1cnIpOworCQkJfSBlbHNlIHsKKwkJCQlteSAkZGVxdW90ZWQgPSAkc3VnZ2VzdGVkX2VtYWlsOworCQkJCSRkZXF1b3RlZCA9fiBzL14iLy87CisJCQkJJGRlcXVvdGVkID1+IHMvIiA8LyA8LzsKKwkJCQkjIERvbid0IGZvcmNlIGVtYWlsIHRvIGhhdmUgcXVvdGVzCisJCQkJIyBBbGxvdyBqdXN0IGFuIGFuZ2xlIGJyYWNrZXRlZCBhZGRyZXNzCisJCQkJaWYgKCIkZGVxdW90ZWQkY29tbWVudCIgbmUgJGVtYWlsICYmCisJCQkJICAgICI8JGVtYWlsX2FkZHJlc3M+JGNvbW1lbnQiIG5lICRlbWFpbCAmJgorCQkJCSAgICAiJHN1Z2dlc3RlZF9lbWFpbCRjb21tZW50IiBuZSAkZW1haWwpIHsKKwkJCQkJV0FSTigiQkFEX1NJR05fT0ZGIiwKKwkJCQkJICAgICAiZW1haWwgYWRkcmVzcyAnJGVtYWlsJyBtaWdodCBiZSBiZXR0ZXIgYXMgJyRzdWdnZXN0ZWRfZW1haWwkY29tbWVudCdcbiIgLiAkaGVyZWN1cnIpOworCQkJCX0KIAkJCX0KIAkJfQogCiAjIENoZWNrIGZvciB3cmFwcGFnZSB3aXRoaW4gYSB2YWxpZCBodW5rIG9mIHRoZSBmaWxlCiAJCWlmICgkcmVhbGNudCAhPSAwICYmICRsaW5lICF+IG17Xig/OlwrfC18IHxcXCBObyBuZXdsaW5lfCQpfSkgewotCQkJRVJST1IoInBhdGNoIHNlZW1zIHRvIGJlIGNvcnJ1cHQgKGxpbmUgd3JhcHBlZD8pXG4iIC4KKwkJCUVSUk9SKCJDT1JSVVBURURfUEFUQ0giLAorCQkJICAgICAgInBhdGNoIHNlZW1zIHRvIGJlIGNvcnJ1cHQgKGxpbmUgd3JhcHBlZD8pXG4iIC4KIAkJCQkkaGVyZWN1cnIpIGlmICghJGVtaXR0ZWRfY29ycnVwdCsrKTsKIAkJfQogCkBAIC0xNDA4LDcgKzE2MDksOCBAQAogCQkJbXkgJHB0ciA9IHN1YnN0cigkYmxhbmssIDAsIGxlbmd0aCgkdXRmOF9wcmVmaXgpKSAuICJeIjsKIAkJCW15ICRoZXJlcHRyID0gIiRoZXJlbGluZSRwdHJcbiI7CiAKLQkJCUVSUk9SKCJJbnZhbGlkIFVURi04LCBwYXRjaCBhbmQgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIGJlIGVuY29kZWQgaW4gVVRGLThcbiIgLiAkaGVyZXB0cik7CisJCQlDSEsoIklOVkFMSURfVVRGOCIsCisJCQkgICAgIkludmFsaWQgVVRGLTgsIHBhdGNoIGFuZCBjb21taXQgbWVzc2FnZSBzaG91bGQgYmUgZW5jb2RlZCBpbiBVVEYtOFxuIiAuICRoZXJlcHRyKTsKIAkJfQogCiAjIGlnbm9yZSBub24taHVuayBsaW5lcyBhbmQgbGluZXMgYmVpbmcgcmVtb3ZlZApAQCAtMTQxNywxMSArMTYxOSwxMyBAQAogI3RyYWlsaW5nIHdoaXRlc3BhY2UKIAkJaWYgKCRsaW5lID1+IC9eXCsuKlwwMTUvKSB7CiAJCQlteSAkaGVyZXZldCA9ICIkaGVyZVxuIiAuIGNhdF92ZXQoJHJhd2xpbmUpIC4gIlxuIjsKLQkJCUVSUk9SKCJET1MgbGluZSBlbmRpbmdzXG4iIC4gJGhlcmV2ZXQpOworCQkJRVJST1IoIkRPU19MSU5FX0VORElOR1MiLAorCQkJICAgICAgIkRPUyBsaW5lIGVuZGluZ3NcbiIgLiAkaGVyZXZldCk7CiAKIAkJfSBlbHNpZiAoJHJhd2xpbmUgPX4gL15cKy4qXFNccyskLyB8fCAkcmF3bGluZSA9fiAvXlwrXHMrJC8pIHsKIAkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkcmF3bGluZSkgLiAiXG4iOwotCQkJRVJST1IoInRyYWlsaW5nIHdoaXRlc3BhY2VcbiIgLiAkaGVyZXZldCk7CisJCQlFUlJPUigiVFJBSUxJTkdfV0hJVEVTUEFDRSIsCisJCQkgICAgICAidHJhaWxpbmcgd2hpdGVzcGFjZVxuIiAuICRoZXJldmV0KTsKIAkJCSRycHRfY2xlYW5lcnMgPSAxOwogCQl9CiAKQEAgLTE0NTIsNyArMTY1Niw4IEBACiAJCQkJfQogCQkJCSRsZW5ndGgrKzsKIAkJCX0KLQkJCVdBUk4oInBsZWFzZSB3cml0ZSBhIHBhcmFncmFwaCB0aGF0IGRlc2NyaWJlcyB0aGUgY29uZmlnIHN5bWJvbCBmdWxseVxuIiAuICRoZXJlY3VycikgaWYgKCRpc19lbmQgJiYgJGxlbmd0aCA8IDQpOworCQkJV0FSTigiQ09ORklHX0RFU0NSSVBUSU9OIiwKKwkJCSAgICAgInBsZWFzZSB3cml0ZSBhIHBhcmFncmFwaCB0aGF0IGRlc2NyaWJlcyB0aGUgY29uZmlnIHN5bWJvbCBmdWxseVxuIiAuICRoZXJlY3VycikgaWYgKCRpc19lbmQgJiYgJGxlbmd0aCA8IDQpOwogCQkJI3ByaW50ICJpc19lbmQ8JGlzX2VuZD4gbGVuZ3RoPCRsZW5ndGg+XG4iOwogCQl9CiAKQEAgLTE0NjYsMjggKzE2NzEsMzMgQEAKIAkJICAgICRsaW5lID1+IC9eXCtccyoiW14iXSoiXHMqKD86XHMqfCx8XClccyo7KVxzKiQvKSAmJgogCQkgICAgJGxlbmd0aCA+IDgwKQogCQl7Ci0JCQlXQVJOKCJsaW5lIG92ZXIgODAgY2hhcmFjdGVyc1xuIiAuICRoZXJlY3Vycik7CisJCQlXQVJOKCJMT05HX0xJTkUiLAorCQkJICAgICAibGluZSBvdmVyIDgwIGNoYXJhY3RlcnNcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgY2hlY2sgZm9yIHNwYWNlcyBiZWZvcmUgYSBxdW90ZWQgbmV3bGluZQogCQlpZiAoJHJhd2xpbmUgPX4gL14uKlwiLipcc1xcbi8pIHsKLQkJCVdBUk4oInVubmVjZXNzYXJ5IHdoaXRlc3BhY2UgYmVmb3JlIGEgcXVvdGVkIG5ld2xpbmVcbiIgLiAkaGVyZWN1cnIpOworCQkJV0FSTigiUVVPVEVEX1dISVRFU1BBQ0VfQkVGT1JFX05FV0xJTkUiLAorCQkJICAgICAidW5uZWNlc3Nhcnkgd2hpdGVzcGFjZSBiZWZvcmUgYSBxdW90ZWQgbmV3bGluZVxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBjaGVjayBmb3IgYWRkaW5nIGxpbmVzIHdpdGhvdXQgYSBuZXdsaW5lLgogCQlpZiAoJGxpbmUgPX4gL15cKy8gJiYgZGVmaW5lZCAkbGluZXNbJGxpbmVucl0gJiYgJGxpbmVzWyRsaW5lbnJdID1+IC9eXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZS8pIHsKLQkJCVdBUk4oImFkZGluZyBhIGxpbmUgd2l0aG91dCBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlXG4iIC4gJGhlcmVjdXJyKTsKKwkJCVdBUk4oIk1JU1NJTkdfRU9GX05FV0xJTkUiLAorCQkJICAgICAiYWRkaW5nIGEgbGluZSB3aXRob3V0IG5ld2xpbmUgYXQgZW5kIG9mIGZpbGVcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgQmxhY2tmaW46IHVzZSBoaS9sbyBtYWNyb3MKIAkJaWYgKCRyZWFsZmlsZSA9fiBtQGFyY2gvYmxhY2tmaW4vLipcLlMkQCkgewogCQkJaWYgKCRsaW5lID1+IC9cLltsTF1bWzpzcGFjZTpdXSo9LiomW1s6c3BhY2U6XV0qMHhbZkZdW2ZGXVtmRl1bZkZdLykgewogCQkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkbGluZSkgLiAiXG4iOwotCQkJCUVSUk9SKCJ1c2UgdGhlIExPKCkgbWFjcm8sIG5vdCAoLi4uICYgMHhGRkZGKVxuIiAuICRoZXJldmV0KTsKKwkJCQlFUlJPUigiTE9fTUFDUk8iLAorCQkJCSAgICAgICJ1c2UgdGhlIExPKCkgbWFjcm8sIG5vdCAoLi4uICYgMHhGRkZGKVxuIiAuICRoZXJldmV0KTsKIAkJCX0KIAkJCWlmICgkbGluZSA9fiAvXC5baEhdW1s6c3BhY2U6XV0qPS4qPj5bWzpzcGFjZTpdXSoxNi8pIHsKIAkJCQlteSAkaGVyZXZldCA9ICIkaGVyZVxuIiAuIGNhdF92ZXQoJGxpbmUpIC4gIlxuIjsKLQkJCQlFUlJPUigidXNlIHRoZSBISSgpIG1hY3JvLCBub3QgKC4uLiA+PiAxNilcbiIgLiAkaGVyZXZldCk7CisJCQkJRVJST1IoIkhJX01BQ1JPIiwKKwkJCQkgICAgICAidXNlIHRoZSBISSgpIG1hY3JvLCBub3QgKC4uLiA+PiAxNilcbiIgLiAkaGVyZXZldCk7CiAJCQl9CiAJCX0KIApAQCAtMTQ5OSwxNCArMTcwOSwxNiBAQAogCQlpZiAoJHJhd2xpbmUgPX4gL15cK1xzKiBcdFxzKlxTLyB8fAogCQkgICAgJHJhd2xpbmUgPX4gL15cK1xzKiAgICAgICAgXHMqLykgewogCQkJbXkgJGhlcmV2ZXQgPSAiJGhlcmVcbiIgLiBjYXRfdmV0KCRyYXdsaW5lKSAuICJcbiI7Ci0JCQlFUlJPUigiY29kZSBpbmRlbnQgc2hvdWxkIHVzZSB0YWJzIHdoZXJlIHBvc3NpYmxlXG4iIC4gJGhlcmV2ZXQpOworCQkJRVJST1IoIkNPREVfSU5ERU5UIiwKKwkJCSAgICAgICJjb2RlIGluZGVudCBzaG91bGQgdXNlIHRhYnMgd2hlcmUgcG9zc2libGVcbiIgLiAkaGVyZXZldCk7CiAJCQkkcnB0X2NsZWFuZXJzID0gMTsKIAkJfQogCiAjIGNoZWNrIGZvciBzcGFjZSBiZWZvcmUgdGFicy4KIAkJaWYgKCRyYXdsaW5lID1+IC9eXCsvICYmICRyYXdsaW5lID1+IC8gXHQvKSB7CiAJCQlteSAkaGVyZXZldCA9ICIkaGVyZVxuIiAuIGNhdF92ZXQoJHJhd2xpbmUpIC4gIlxuIjsKLQkJCVdBUk4oInBsZWFzZSwgbm8gc3BhY2UgYmVmb3JlIHRhYnNcbiIgLiAkaGVyZXZldCk7CisJCQlXQVJOKCJTUEFDRV9CRUZPUkVfVEFCIiwKKwkJCSAgICAgInBsZWFzZSwgbm8gc3BhY2UgYmVmb3JlIHRhYnNcbiIgLiAkaGVyZXZldCk7CiAJCX0KIAogIyBjaGVjayBmb3Igc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgpAQCAtMTUxNiw3ICsxNzI4LDggQEAKICMgIDMpIGhhbmdpbmcgbGFiZWxzCiAJCWlmICgkcmF3bGluZSA9fiAvXlwrIC8gJiYgJGxpbmUgIX4gL1wrICooPzokO3wjfCRJZGVudDopLykgIHsKIAkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkcmF3bGluZSkgLiAiXG4iOwotCQkJV0FSTigicGxlYXNlLCBubyBzcGFjZXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZVxuIiAuICRoZXJldmV0KTsKKwkJCVdBUk4oIkxFQURJTkdfU1BBQ0UiLAorCQkJICAgICAicGxlYXNlLCBubyBzcGFjZXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZVxuIiAuICRoZXJldmV0KTsKIAkJfQogCiAjIGNoZWNrIHdlIGFyZSBpbiBhIHZhbGlkIEMgc291cmNlIGZpbGUgaWYgbm90IHRoZW4gaWdub3JlIHRoaXMgaHVuawpAQCAtMTUyNCwxNyArMTczNywyMCBAQAogCiAjIGNoZWNrIGZvciBSQ1MvQ1ZTIHJldmlzaW9uIG1hcmtlcnMKIAkJaWYgKCRyYXdsaW5lID1+IC9eXCsuKlwkKFJldmlzaW9ufExvZ3xJZCkoPzpcJHwpLykgewotCQkJV0FSTigiQ1ZTIHN0eWxlIGtleXdvcmQgbWFya2VycywgdGhlc2Ugd2lsbCBfbm90XyBiZSB1cGRhdGVkXG4iLiAkaGVyZWN1cnIpOworCQkJV0FSTigiQ1ZTX0tFWVdPUkQiLAorCQkJICAgICAiQ1ZTIHN0eWxlIGtleXdvcmQgbWFya2VycywgdGhlc2Ugd2lsbCBfbm90XyBiZSB1cGRhdGVkXG4iLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgQmxhY2tmaW46IGRvbid0IHVzZSBfX2J1aWx0aW5fYmZpbl9bY3Ndc3luYwogCQlpZiAoJGxpbmUgPX4gL19fYnVpbHRpbl9iZmluX2NzeW5jLykgewogCQkJbXkgJGhlcmV2ZXQgPSAiJGhlcmVcbiIgLiBjYXRfdmV0KCRsaW5lKSAuICJcbiI7Ci0JCQlFUlJPUigidXNlIHRoZSBDU1lOQygpIG1hY3JvIGluIGFzbS9ibGFja2Zpbi5oXG4iIC4gJGhlcmV2ZXQpOworCQkJRVJST1IoIkNTWU5DIiwKKwkJCSAgICAgICJ1c2UgdGhlIENTWU5DKCkgbWFjcm8gaW4gYXNtL2JsYWNrZmluLmhcbiIgLiAkaGVyZXZldCk7CiAJCX0KIAkJaWYgKCRsaW5lID1+IC9fX2J1aWx0aW5fYmZpbl9zc3luYy8pIHsKIAkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkbGluZSkgLiAiXG4iOwotCQkJRVJST1IoInVzZSB0aGUgU1NZTkMoKSBtYWNybyBpbiBhc20vYmxhY2tmaW4uaFxuIiAuICRoZXJldmV0KTsKKwkJCUVSUk9SKCJTU1lOQyIsCisJCQkgICAgICAidXNlIHRoZSBTU1lOQygpIG1hY3JvIGluIGFzbS9ibGFja2Zpbi5oXG4iIC4gJGhlcmV2ZXQpOwogCQl9CiAKICMgQ2hlY2sgZm9yIHBvdGVudGlhbCAnYmFyZScgdHlwZXMKQEAgLTE2MjMsNyArMTgzOSw4IEBACiAJCQkJfQogCQkJfQogCQkJaWYgKCRlcnIgbmUgJycpIHsKLQkJCQlFUlJPUigic3dpdGNoIGFuZCBjYXNlIHNob3VsZCBiZSBhdCB0aGUgc2FtZSBpbmRlbnRcbiRoZXJlbGluZSRlcnIiKTsKKwkJCQlFUlJPUigiU1dJVENIX0NBU0VfSU5ERU5UX0xFVkVMIiwKKwkJCQkgICAgICAic3dpdGNoIGFuZCBjYXNlIHNob3VsZCBiZSBhdCB0aGUgc2FtZSBpbmRlbnRcbiRoZXJlbGluZSRlcnIiKTsKIAkJCX0KIAkJfQogCkBAIC0xNjUxLDcgKzE4NjgsOCBAQAogCQkJI3ByaW50ICJwcmU8JHByZV9jdHg+XG5saW5lPCRsaW5lPlxuY3R4PCRjdHg+XG5uZXh0PCRsaW5lc1skY3R4X2xuIC0gMV0+XG4iOwogCiAJCQlpZiAoJGN0eCAhfiAve1xzKi8gJiYgZGVmaW5lZCgkbGluZXNbJGN0eF9sbiAtMV0pICYmICRsaW5lc1skY3R4X2xuIC0gMV0gPX4gL15cK1xzKnsvKSB7Ci0JCQkJRVJST1IoInRoYXQgb3BlbiBicmFjZSB7IHNob3VsZCBiZSBvbiB0aGUgcHJldmlvdXMgbGluZVxuIiAuCisJCQkJRVJST1IoIk9QRU5fQlJBQ0UiLAorCQkJCSAgICAgICJ0aGF0IG9wZW4gYnJhY2UgeyBzaG91bGQgYmUgb24gdGhlIHByZXZpb3VzIGxpbmVcbiIgLgogCQkJCQkiJGhlcmVcbiRjdHhcbiRyYXdsaW5lc1skY3R4X2xuIC0gMV1cbiIpOwogCQkJfQogCQkJaWYgKCRsZXZlbCA9PSAwICYmICRwcmVfY3R4ICF+IC99XHMqd2hpbGVccypcKCQvICYmCkBAIC0xNjYwLDcgKzE4NzgsOCBAQAogCQkJewogCQkJCW15ICgkbmxlbmd0aCwgJG5pbmRlbnQpID0gbGluZV9zdGF0cygkbGluZXNbJGN0eF9sbiAtIDFdKTsKIAkJCQlpZiAoJG5pbmRlbnQgPiAkaW5kZW50KSB7Ci0JCQkJCVdBUk4oInRyYWlsaW5nIHNlbWljb2xvbiBpbmRpY2F0ZXMgbm8gc3RhdGVtZW50cywgaW5kZW50IGltcGxpZXMgb3RoZXJ3aXNlXG4iIC4KKwkJCQkJV0FSTigiVFJBSUxJTkdfU0VNSUNPTE9OIiwKKwkJCQkJICAgICAidHJhaWxpbmcgc2VtaWNvbG9uIGluZGljYXRlcyBubyBzdGF0ZW1lbnRzLCBpbmRlbnQgaW1wbGllcyBvdGhlcndpc2VcbiIgLgogCQkJCQkJIiRoZXJlXG4kY3R4XG4kcmF3bGluZXNbJGN0eF9sbiAtIDFdXG4iKTsKIAkJCQl9CiAJCQl9CkBAIC0xNzQ4LDcgKzE5NjcsOCBAQAogCiAJCQlpZiAoJGNoZWNrICYmICgoJHNpbmRlbnQgJSA4KSAhPSAwIHx8CiAJCQkgICAgKCRzaW5kZW50IDw9ICRpbmRlbnQgJiYgJHMgbmUgJycpKSkgewotCQkJCVdBUk4oInN1c3BlY3QgY29kZSBpbmRlbnQgZm9yIGNvbmRpdGlvbmFsIHN0YXRlbWVudHMgKCRpbmRlbnQsICRzaW5kZW50KVxuIiAuICRoZXJlY3VyciAuICIkc3RhdF9yZWFsXG4iKTsKKwkJCQlXQVJOKCJTVVNQRUNUX0NPREVfSU5ERU5UIiwKKwkJCQkgICAgICJzdXNwZWN0IGNvZGUgaW5kZW50IGZvciBjb25kaXRpb25hbCBzdGF0ZW1lbnRzICgkaW5kZW50LCAkc2luZGVudClcbiIgLiAkaGVyZWN1cnIgLiAiJHN0YXRfcmVhbFxuIik7CiAJCQl9CiAJCX0KIApAQCAtMTc3MSwxOCArMTk5MSwyMiBAQAogIyBURVNUOiBhbGxvdyBkaXJlY3QgdGVzdGluZyBvZiB0aGUgdHlwZSBtYXRjaGVyLgogCQlpZiAoJGRiZ190eXBlKSB7CiAJCQlpZiAoJGxpbmUgPX4gL14uXHMqJERlY2xhcmVccyokLykgewotCQkJCUVSUk9SKCJURVNUOiBpcyB0eXBlXG4iIC4gJGhlcmVjdXJyKTsKKwkJCQlFUlJPUigiVEVTVF9UWVBFIiwKKwkJCQkgICAgICAiVEVTVDogaXMgdHlwZVxuIiAuICRoZXJlY3Vycik7CiAJCQl9IGVsc2lmICgkZGJnX3R5cGUgPiAxICYmICRsaW5lID1+IC9eLisoJERlY2xhcmUpLykgewotCQkJCUVSUk9SKCJURVNUOiBpcyBub3QgdHlwZSAoJDEgaXMpXG4iLiAkaGVyZWN1cnIpOworCQkJCUVSUk9SKCJURVNUX05PVF9UWVBFIiwKKwkJCQkgICAgICAiVEVTVDogaXMgbm90IHR5cGUgKCQxIGlzKVxuIi4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJCW5leHQ7CiAJCX0KICMgVEVTVDogYWxsb3cgZGlyZWN0IHRlc3Rpbmcgb2YgdGhlIGF0dHJpYnV0ZSBtYXRjaGVyLgogCQlpZiAoJGRiZ19hdHRyKSB7CiAJCQlpZiAoJGxpbmUgPX4gL14uXHMqJE1vZGlmaWVyXHMqJC8pIHsKLQkJCQlFUlJPUigiVEVTVDogaXMgYXR0clxuIiAuICRoZXJlY3Vycik7CisJCQkJRVJST1IoIlRFU1RfQVRUUiIsCisJCQkJICAgICAgIlRFU1Q6IGlzIGF0dHJcbiIgLiAkaGVyZWN1cnIpOwogCQkJfSBlbHNpZiAoJGRiZ19hdHRyID4gMSAmJiAkbGluZSA9fiAvXi4rKCRNb2RpZmllcikvKSB7Ci0JCQkJRVJST1IoIlRFU1Q6IGlzIG5vdCBhdHRyICgkMSBpcylcbiIuICRoZXJlY3Vycik7CisJCQkJRVJST1IoIlRFU1RfTk9UX0FUVFIiLAorCQkJCSAgICAgICJURVNUOiBpcyBub3QgYXR0ciAoJDEgaXMpXG4iLiAkaGVyZWN1cnIpOwogCQkJfQogCQkJbmV4dDsKIAkJfQpAQCAtMTc5MCw3ICsyMDE0LDggQEAKICMgY2hlY2sgZm9yIGluaXRpYWxpc2F0aW9uIHRvIGFnZ3JlZ2F0ZXMgb3BlbiBicmFjZSBvbiB0aGUgbmV4dCBsaW5lCiAJCWlmICgkbGluZSA9fiAvXi5ccyp7LyAmJgogCQkgICAgJHByZXZsaW5lID1+IC8oPzpefFtePV0pPVxzKiQvKSB7Ci0JCQlFUlJPUigidGhhdCBvcGVuIGJyYWNlIHsgc2hvdWxkIGJlIG9uIHRoZSBwcmV2aW91cyBsaW5lXG4iIC4gJGhlcmVwcmV2KTsKKwkJCUVSUk9SKCJPUEVOX0JSQUNFIiwKKwkJCSAgICAgICJ0aGF0IG9wZW4gYnJhY2UgeyBzaG91bGQgYmUgb24gdGhlIHByZXZpb3VzIGxpbmVcbiIgLiAkaGVyZXByZXYpOwogCQl9CiAKICMKQEAgLTE4MDEsMTQgKzIwMjYsMTYgQEAKIAkJaWYgKCRyYXdsaW5lID1+IG17Xi5ccypcI1xzKmluY2x1ZGVccytbPCJdKC4qKVsiPl19KSB7CiAJCQlteSAkcGF0aCA9ICQxOwogCQkJaWYgKCRwYXRoID1+IG17Ly99KSB7Ci0JCQkJRVJST1IoIm1hbGZvcm1lZCAjaW5jbHVkZSBmaWxlbmFtZVxuIiAuCisJCQkJRVJST1IoIk1BTEZPUk1FRF9JTkNMVURFIiwKKwkJCQkgICAgICAibWFsZm9ybWVkICNpbmNsdWRlIGZpbGVuYW1lXG4iIC4KIAkJCQkJJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCiAjIG5vIEM5OSAvLyBjb21tZW50cwogCQlpZiAoJGxpbmUgPX4gbXsvL30pIHsKLQkJCUVSUk9SKCJkbyBub3QgdXNlIEM5OSAvLyBjb21tZW50c1xuIiAuICRoZXJlY3Vycik7CisJCQlFUlJPUigiQzk5X0NPTU1FTlRTIiwKKwkJCSAgICAgICJkbyBub3QgdXNlIEM5OSAvLyBjb21tZW50c1xuIiAuICRoZXJlY3Vycik7CiAJCX0KIAkJIyBSZW1vdmUgQzk5IGNvbW1lbnRzLgogCQkkbGluZSA9fiBzQC8vLipAQDsKQEAgLTE4NTUsMzUgKzIwODIsNDEgQEAKIAkJfQogCQlpZiAoZGVmaW5lZCAkc3VwcHJlc3NfZXhwb3J0eyRsaW5lbnJ9ICYmCiAJCSAgICAkc3VwcHJlc3NfZXhwb3J0eyRsaW5lbnJ9ID09IDIpIHsKLQkJCVdBUk4oIkVYUE9SVF9TWU1CT0woZm9vKTsgc2hvdWxkIGltbWVkaWF0ZWx5IGZvbGxvdyBpdHMgZnVuY3Rpb24vdmFyaWFibGVcbiIgLiAkaGVyZWN1cnIpOworCQkJV0FSTigiRVhQT1JUX1NZTUJPTCIsCisJCQkgICAgICJFWFBPUlRfU1lNQk9MKGZvbyk7IHNob3VsZCBpbW1lZGlhdGVseSBmb2xsb3cgaXRzIGZ1bmN0aW9uL3ZhcmlhYmxlXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIGNoZWNrIGZvciBnbG9iYWwgaW5pdGlhbGlzZXJzLgogCQlpZiAoJGxpbmUgPX4gL14uJFR5cGVccyokSWRlbnRccyooPzpccyskTW9kaWZpZXIpKlxzKj1ccyooMHxOVUxMfGZhbHNlKVxzKjsvKSB7Ci0JCQlFUlJPUigiZG8gbm90IGluaXRpYWxpc2UgZ2xvYmFscyB0byAwIG9yIE5VTExcbiIgLgorCQkJRVJST1IoIkdMT0JBTF9JTklUSUFMSVNFUlMiLAorCQkJICAgICAgImRvIG5vdCBpbml0aWFsaXNlIGdsb2JhbHMgdG8gMCBvciBOVUxMXG4iIC4KIAkJCQkkaGVyZWN1cnIpOwogCQl9CiAjIGNoZWNrIGZvciBzdGF0aWMgaW5pdGlhbGlzZXJzLgogCQlpZiAoJGxpbmUgPX4gL1xic3RhdGljXHMuKj1ccyooMHxOVUxMfGZhbHNlKVxzKjsvKSB7Ci0JCQlFUlJPUigiZG8gbm90IGluaXRpYWxpc2Ugc3RhdGljcyB0byAwIG9yIE5VTExcbiIgLgorCQkJRVJST1IoIklOSVRJQUxJU0VEX1NUQVRJQyIsCisJCQkgICAgICAiZG8gbm90IGluaXRpYWxpc2Ugc3RhdGljcyB0byAwIG9yIE5VTExcbiIgLgogCQkJCSRoZXJlY3Vycik7CiAJCX0KIAogIyBjaGVjayBmb3Igc3RhdGljIGNvbnN0IGNoYXIgKiBhcnJheXMuCiAJCWlmICgkbGluZSA9fiAvXGJzdGF0aWNccytjb25zdFxzK2NoYXJccypcKlxzKihcdyspXHMqXFtccypcXVxzKj1ccyovKSB7Ci0JCQlXQVJOKCJzdGF0aWMgY29uc3QgY2hhciAqIGFycmF5IHNob3VsZCBwcm9iYWJseSBiZSBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0XG4iIC4KKwkJCVdBUk4oIlNUQVRJQ19DT05TVF9DSEFSX0FSUkFZIiwKKwkJCSAgICAgInN0YXRpYyBjb25zdCBjaGFyICogYXJyYXkgc2hvdWxkIHByb2JhYmx5IGJlIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3RcbiIgLgogCQkJCSRoZXJlY3Vycik7CiAgICAgICAgICAgICAgICB9CiAKICMgY2hlY2sgZm9yIHN0YXRpYyBjaGFyIGZvb1tdID0gImJhciIgZGVjbGFyYXRpb25zLgogCQlpZiAoJGxpbmUgPX4gL1xic3RhdGljXHMrY2hhclxzKyhcdyspXHMqXFtccypcXVxzKj1ccyoiLykgewotCQkJV0FSTigic3RhdGljIGNoYXIgYXJyYXkgZGVjbGFyYXRpb24gc2hvdWxkIHByb2JhYmx5IGJlIHN0YXRpYyBjb25zdCBjaGFyXG4iIC4KKwkJCVdBUk4oIlNUQVRJQ19DT05TVF9DSEFSX0FSUkFZIiwKKwkJCSAgICAgInN0YXRpYyBjaGFyIGFycmF5IGRlY2xhcmF0aW9uIHNob3VsZCBwcm9iYWJseSBiZSBzdGF0aWMgY29uc3QgY2hhclxuIiAuCiAJCQkJJGhlcmVjdXJyKTsKICAgICAgICAgICAgICAgIH0KIAogIyBjaGVjayBmb3IgZGVjbGFyYXRpb25zIG9mIHN0cnVjdCBwY2lfZGV2aWNlX2lkCiAJCWlmICgkbGluZSA9fiAvXGJzdHJ1Y3RccytwY2lfZGV2aWNlX2lkXHMrXHcrXHMqXFtccypcXVxzKlw9XHMqXHsvKSB7Ci0JCQlXQVJOKCJVc2UgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUgZm9yIHN0cnVjdCBwY2lfZGV2aWNlX2lkXG4iIC4gJGhlcmVjdXJyKTsKKwkJCVdBUk4oIkRFRklORV9QQ0lfREVWSUNFX1RBQkxFIiwKKwkJCSAgICAgIlVzZSBERUZJTkVfUENJX0RFVklDRV9UQUJMRSBmb3Igc3RydWN0IHBjaV9kZXZpY2VfaWRcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgY2hlY2sgZm9yIG5ldyB0eXBlZGVmcywgb25seSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCBzcGFyc2UgYW5ub3RhdGlvbnMKQEAgLTE4OTMsNyArMjEyNiw4IEBACiAJCSAgICAkbGluZSAhfiAvXGJ0eXBlZGVmXHMrJFR5cGVccyskSWRlbnRccypcKC8gJiYKIAkJICAgICRsaW5lICF+IC9cYiR0eXBlVHlwZWRlZnNcYi8gJiYKIAkJICAgICRsaW5lICF+IC9cYl9fYml0d2lzZSg/Ol9ffClcYi8pIHsKLQkJCVdBUk4oImRvIG5vdCBhZGQgbmV3IHR5cGVkZWZzXG4iIC4gJGhlcmVjdXJyKTsKKwkJCVdBUk4oIk5FV19UWVBFREVGUyIsCisJCQkgICAgICJkbyBub3QgYWRkIG5ldyB0eXBlZGVmc1xuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyAqIGdvZXMgb24gdmFyaWFibGUgbm90IG9uIHR5cGUKQEAgLTE5MTEsNyArMjE0NSw4IEBACiAKIAkJCSNwcmludCAiZnJvbTwkZnJvbT4gdG88JHRvPlxuIjsKIAkJCWlmICgkZnJvbSBuZSAkdG8pIHsKLQkJCQlFUlJPUigiXCIoZm9vJGZyb20pXCIgc2hvdWxkIGJlIFwiKGZvbyR0bylcIlxuIiAuICAkaGVyZWN1cnIpOworCQkJCUVSUk9SKCJQT0lOVEVSX0xPQ0FUSU9OIiwKKwkJCQkgICAgICAiXCIoZm9vJGZyb20pXCIgc2hvdWxkIGJlIFwiKGZvbyR0bylcIlxuIiAuICAkaGVyZWN1cnIpOwogCQkJfQogCQl9IGVsc2lmICgkbGluZSA9fiBte1xiJE5vbnB0clR5cGUoXHMqKD86JE1vZGlmaWVyXGJccyp8XCpccyopKykoJElkZW50KX0pIHsKIAkJCW15ICgkZnJvbSwgJHRvLCAkaWRlbnQpID0gKCQxLCAkMSwgJDIpOwpAQCAtMTkyOCw3ICsyMTYzLDggQEAKIAogCQkJI3ByaW50ICJmcm9tPCRmcm9tPiB0bzwkdG8+IGlkZW50PCRpZGVudD5cbiI7CiAJCQlpZiAoJGZyb20gbmUgJHRvICYmICRpZGVudCAhfiAvXiRNb2RpZmllciQvKSB7Ci0JCQkJRVJST1IoIlwiZm9vJHtmcm9tfWJhclwiIHNob3VsZCBiZSBcImZvbyR7dG99YmFyXCJcbiIgLiAgJGhlcmVjdXJyKTsKKwkJCQlFUlJPUigiUE9JTlRFUl9MT0NBVElPTiIsCisJCQkJICAgICAgIlwiZm9vJHtmcm9tfWJhclwiIHNob3VsZCBiZSBcImZvbyR7dG99YmFyXCJcbiIgLiAgJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCkBAIC0xOTQwLDcgKzIxNzYsMTQgQEAKICMgCQl9CiAKIAkJaWYgKCRsaW5lID1+IC9cYkxJTlVYX1ZFUlNJT05fQ09ERVxiLykgewotCQkJV0FSTigiTElOVVhfVkVSU0lPTl9DT0RFIHNob3VsZCBiZSBhdm9pZGVkLCBjb2RlIHNob3VsZCBiZSBmb3IgdGhlIHZlcnNpb24gdG8gd2hpY2ggaXQgaXMgbWVyZ2VkXG4iIC4gJGhlcmVjdXJyKTsKKwkJCVdBUk4oIkxJTlVYX1ZFUlNJT05fQ09ERSIsCisJCQkgICAgICJMSU5VWF9WRVJTSU9OX0NPREUgc2hvdWxkIGJlIGF2b2lkZWQsIGNvZGUgc2hvdWxkIGJlIGZvciB0aGUgdmVyc2lvbiB0byB3aGljaCBpdCBpcyBtZXJnZWRcbiIgLiAkaGVyZWN1cnIpOworCQl9CisKKyMgY2hlY2sgZm9yIHVzZXMgb2YgcHJpbnRrX3JhdGVsaW1pdAorCQlpZiAoJGxpbmUgPX4gL1xicHJpbnRrX3JhdGVsaW1pdFxzKlwoLykgeworCQkJV0FSTigiUFJJTlRLX1JBVEVMSU1JVEVEIiwKKyJQcmVmZXIgcHJpbnRrX3JhdGVsaW1pdGVkIG9yIHByXzxsZXZlbD5fcmF0ZWxpbWl0ZWQgdG8gcHJpbnRrX3JhdGVsaW1pdFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBwcmludGsgc2hvdWxkIHVzZSBLRVJOXyogbGV2ZWxzLiAgTm90ZSB0aGF0IGZvbGxvdyBvbiBwcmludGsncyBvbiB0aGUKQEAgLTE5NjIsNyArMjIwNSw4IEBACiAJCQkJfQogCQkJfQogCQkJaWYgKCRvayA9PSAwKSB7Ci0JCQkJV0FSTigicHJpbnRrKCkgc2hvdWxkIGluY2x1ZGUgS0VSTl8gZmFjaWxpdHkgbGV2ZWxcbiIgLiAkaGVyZWN1cnIpOworCQkJCVdBUk4oIlBSSU5US19XSVRIT1VUX0tFUk5fTEVWRUwiLAorCQkJCSAgICAgInByaW50aygpIHNob3VsZCBpbmNsdWRlIEtFUk5fIGZhY2lsaXR5IGxldmVsXG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCkBAIC0xOTcwLDE4ICsyMjE0LDIxIEBACiAjIG9yIGlmIGNsb3NlZCBvbiBzYW1lIGxpbmUKIAkJaWYgKCgkbGluZT1+LyRUeXBlXHMqJElkZW50XCguKlwpLipcc3svKSBhbmQKIAkJICAgICEoJGxpbmU9fi9cI1xzKmRlZmluZS4qZG9cc3svKSBhbmQgISgkbGluZT1+L30vKSkgewotCQkJRVJST1IoIm9wZW4gYnJhY2UgJ3snIGZvbGxvd2luZyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgZ28gb24gdGhlIG5leHQgbGluZVxuIiAuICRoZXJlY3Vycik7CisJCQlFUlJPUigiT1BFTl9CUkFDRSIsCisJCQkgICAgICAib3BlbiBicmFjZSAneycgZm9sbG93aW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBnbyBvbiB0aGUgbmV4dCBsaW5lXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIG9wZW4gYnJhY2VzIGZvciBlbnVtLCB1bmlvbiBhbmQgc3RydWN0IGdvIG9uIHRoZSBzYW1lIGxpbmUuCiAJCWlmICgkbGluZSA9fiAvXi5ccyp7LyAmJgogCQkgICAgJHByZXZsaW5lID1+IC9eLlxzKig/OnR5cGVkZWZccyspPyhlbnVtfHVuaW9ufHN0cnVjdCkoPzpccyskSWRlbnQpP1xzKiQvKSB7Ci0JCQlFUlJPUigib3BlbiBicmFjZSAneycgZm9sbG93aW5nICQxIGdvIG9uIHRoZSBzYW1lIGxpbmVcbiIgLiAkaGVyZXByZXYpOworCQkJRVJST1IoIk9QRU5fQlJBQ0UiLAorCQkJICAgICAgIm9wZW4gYnJhY2UgJ3snIGZvbGxvd2luZyAkMSBnbyBvbiB0aGUgc2FtZSBsaW5lXG4iIC4gJGhlcmVwcmV2KTsKIAkJfQogCiAjIG1pc3Npbmcgc3BhY2UgYWZ0ZXIgdW5pb24sIHN0cnVjdCBvciBlbnVtIGRlZmluaXRpb24KIAkJaWYgKCRsaW5lID1+IC9eLlxzKig/OnR5cGVkZWZccyspPyhlbnVtfHVuaW9ufHN0cnVjdCkoPzpccyskSWRlbnQpPyg/OlxzKyRJZGVudCk/Wz1ce10vKSB7Ci0JCSAgICBXQVJOKCJtaXNzaW5nIHNwYWNlIGFmdGVyICQxIGRlZmluaXRpb25cbiIgLiAkaGVyZWN1cnIpOworCQkgICAgV0FSTigiU1BBQ0lORyIsCisJCQkgIm1pc3Npbmcgc3BhY2UgYWZ0ZXIgJDEgZGVmaW5pdGlvblxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBjaGVjayBmb3Igc3BhY2luZyByb3VuZCBzcXVhcmUgYnJhY2tldHM7IGFsbG93ZWQ6CkBAIC0xOTkzLDcgKzIyNDAsOCBAQAogCQkJaWYgKCRwcmVmaXggIX4gLyRUeXBlXHMrJC8gJiYKIAkJCSAgICAoJHdoZXJlICE9IDAgfHwgJHByZWZpeCAhfiAvXi5ccyskLykgJiYKIAkJCSAgICAkcHJlZml4ICF+IC97XHMrJC8pIHsKLQkJCQlFUlJPUigic3BhY2UgcHJvaGliaXRlZCBiZWZvcmUgb3BlbiBzcXVhcmUgYnJhY2tldCAnWydcbiIgLiAkaGVyZWN1cnIpOworCQkJCUVSUk9SKCJCUkFDS0VUX1NQQUNFIiwKKwkJCQkgICAgICAic3BhY2UgcHJvaGliaXRlZCBiZWZvcmUgb3BlbiBzcXVhcmUgYnJhY2tldCAnWydcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKQEAgLTIwMjQsNyArMjI3Miw4IEBACiAJCQl9IGVsc2lmICgkY3R4ID1+IC8kVHlwZSQvKSB7CiAKIAkJCX0gZWxzZSB7Ci0JCQkJV0FSTigic3BhY2UgcHJvaGliaXRlZCBiZXR3ZWVuIGZ1bmN0aW9uIG5hbWUgYW5kIG9wZW4gcGFyZW50aGVzaXMgJygnXG4iIC4gJGhlcmVjdXJyKTsKKwkJCQlXQVJOKCJTUEFDSU5HIiwKKwkJCQkgICAgICJzcGFjZSBwcm9oaWJpdGVkIGJldHdlZW4gZnVuY3Rpb24gbmFtZSBhbmQgb3BlbiBwYXJlbnRoZXNpcyAnKCdcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAjIENoZWNrIG9wZXJhdG9yIHNwYWNpbmcuCkBAIC0yMDk4LDcgKzIzNDcsOCBAQAogCQkJCX0gZWxzaWYgKCRvcCBlcSAnOycpIHsKIAkJCQkJaWYgKCRjdHggIX4gLy54W1dFQkNdLyAmJgogCQkJCQkgICAgJGNjICF+IC9eXFwvICYmICRjYyAhfiAvXjsvKSB7Ci0JCQkJCQlFUlJPUigic3BhY2UgcmVxdWlyZWQgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CisJCQkJCQlFUlJPUigiU1BBQ0lORyIsCisJCQkJCQkgICAgICAic3BhY2UgcmVxdWlyZWQgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgLy8gaXMgYSBjb21tZW50CkBAIC0yMTA5LDEzICsyMzU5LDE1IEBACiAJCQkJIyAgIDogICB3aGVuIHBhcnQgb2YgYSBiaXRmaWVsZAogCQkJCX0gZWxzaWYgKCRvcCBlcSAnLT4nIHx8ICRvcHYgZXEgJzpCJykgewogCQkJCQlpZiAoJGN0eCA9fiAvV3gufC54Vy8pIHsKLQkJCQkJCUVSUk9SKCJzcGFjZXMgcHJvaGliaXRlZCBhcm91bmQgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CisJCQkJCQlFUlJPUigiU1BBQ0lORyIsCisJCQkJCQkgICAgICAic3BhY2VzIHByb2hpYml0ZWQgYXJvdW5kIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjICwgbXVzdCBoYXZlIGEgc3BhY2Ugb24gdGhlIHJpZ2h0LgogCQkJCX0gZWxzaWYgKCRvcCBlcSAnLCcpIHsKIAkJCQkJaWYgKCRjdHggIX4gLy54W1dFQ10vICYmICRjYyAhfiAvXn0vKSB7Ci0JCQkJCQlFUlJPUigic3BhY2UgcmVxdWlyZWQgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CisJCQkJCQlFUlJPUigiU1BBQ0lORyIsCisJCQkJCQkgICAgICAic3BhY2UgcmVxdWlyZWQgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgJyonIGFzIHBhcnQgb2YgYSB0eXBlIGRlZmluaXRpb24gLS0gcmVwb3J0ZWQgYWxyZWFkeS4KQEAgLTIxMjksMjYgKzIzODEsMzEgQEAKIAkJCQkJICRvcHYgZXEgJypVJyB8fCAkb3B2IGVxICctVScgfHwKIAkJCQkJICRvcHYgZXEgJyZVJyB8fCAkb3B2IGVxICcmJlUnKSB7CiAJCQkJCWlmICgkY3R4ICF+IC9bV0VCQ114Li8gJiYgJGNhICF+IC8oPzpcKXwhfH58XCp8LXxcJnxcfHxcK1wrfFwtXC18XHspJC8pIHsKLQkJCQkJCUVSUk9SKCJzcGFjZSByZXF1aXJlZCBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CisJCQkJCQlFUlJPUigiU1BBQ0lORyIsCisJCQkJCQkgICAgICAic3BhY2UgcmVxdWlyZWQgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAJCQkJCWlmICgkb3AgZXEgJyonICYmICRjYyA9fi9ccyokTW9kaWZpZXJcYi8pIHsKIAkJCQkJCSMgQSB1bmFyeSAnKicgbWF5IGJlIGNvbnN0CiAKIAkJCQkJfSBlbHNpZiAoJGN0eCA9fiAvLnhXLykgewotCQkJCQkJRVJST1IoInNwYWNlIHByb2hpYml0ZWQgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CisJCQkJCQlFUlJPUigiU1BBQ0lORyIsCisJCQkJCQkgICAgICAic3BhY2UgcHJvaGliaXRlZCBhZnRlciB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCiAJCQkJIyB1bmFyeSArKyBhbmQgdW5hcnkgLS0gYXJlIGFsbG93ZWQgbm8gc3BhY2Ugb24gb25lIHNpZGUuCiAJCQkJfSBlbHNpZiAoJG9wIGVxICcrKycgb3IgJG9wIGVxICctLScpIHsKIAkJCQkJaWYgKCRjdHggIX4gL1tXRU9CQ114W15XXS8gJiYgJGN0eCAhfiAvW15XXXhbV09CRUNdLykgewotCQkJCQkJRVJST1IoInNwYWNlIHJlcXVpcmVkIG9uZSBzaWRlIG9mIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOworCQkJCQkJRVJST1IoIlNQQUNJTkciLAorCQkJCQkJICAgICAgInNwYWNlIHJlcXVpcmVkIG9uZSBzaWRlIG9mIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAJCQkJCWlmICgkY3R4ID1+IC9XeFtCRV0vIHx8CiAJCQkJCSAgICAoJGN0eCA9fiAvV3guLyAmJiAkY2MgPX4gL147LykpIHsKLQkJCQkJCUVSUk9SKCJzcGFjZSBwcm9oaWJpdGVkIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKKwkJCQkJCUVSUk9SKCJTUEFDSU5HIiwKKwkJCQkJCSAgICAgICJzcGFjZSBwcm9oaWJpdGVkIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCQkJCQlpZiAoJGN0eCA9fiAvRXhXLykgewotCQkJCQkJRVJST1IoInNwYWNlIHByb2hpYml0ZWQgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CisJCQkJCQlFUlJPUigiU1BBQ0lORyIsCisJCQkJCQkgICAgICAic3BhY2UgcHJvaGliaXRlZCBhZnRlciB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCiAKQEAgLTIxNjAsNyArMjQxNyw4IEBACiAJCQkJCSAkb3AgZXEgJyUnKQogCQkJCXsKIAkJCQkJaWYgKCRjdHggPX4gL1d4W15XQ0VdfFteV0NFXXhXLykgewotCQkJCQkJRVJST1IoIm5lZWQgY29uc2lzdGVudCBzcGFjaW5nIGFyb3VuZCAnJG9wJyAkYXRcbiIgLgorCQkJCQkJRVJST1IoIlNQQUNJTkciLAorCQkJCQkJICAgICAgIm5lZWQgY29uc2lzdGVudCBzcGFjaW5nIGFyb3VuZCAnJG9wJyAkYXRcbiIgLgogCQkJCQkJCSRoZXJlcHRyKTsKIAkJCQkJfQogCkBAIC0yMTY4LDcgKzI0MjYsOCBAQAogCQkJCSMgdGVybWluYXRpbmcgYSBjYXNlIHZhbHVlIG9yIGEgbGFiZWwuCiAJCQkJfSBlbHNpZiAoJG9wdiBlcSAnOkMnIHx8ICRvcHYgZXEgJzpMJykgewogCQkJCQlpZiAoJGN0eCA9fiAvV3guLykgewotCQkJCQkJRVJST1IoInNwYWNlIHByb2hpYml0ZWQgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOworCQkJCQkJRVJST1IoIlNQQUNJTkciLAorCQkJCQkJICAgICAgInNwYWNlIHByb2hpYml0ZWQgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjIEFsbCB0aGUgb3RoZXJzIG5lZWQgc3BhY2VzIGJvdGggc2lkZXMuCkBAIC0yMTkxLDcgKzI0NTAsOCBAQAogCQkJCQl9CiAKIAkJCQkJaWYgKCRvayA9PSAwKSB7Ci0JCQkJCQlFUlJPUigic3BhY2VzIHJlcXVpcmVkIGFyb3VuZCB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKKwkJCQkJCUVSUk9SKCJTUEFDSU5HIiwKKwkJCQkJCSAgICAgICJzcGFjZXMgcmVxdWlyZWQgYXJvdW5kIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAJCQkJfQogCQkJCSRvZmYgKz0gbGVuZ3RoKCRlbGVtZW50c1skbiArIDFdKTsKQEAgLTIyMDAsNyArMjQ2MCw4IEBACiAKICMgY2hlY2sgZm9yIG11bHRpcGxlIGFzc2lnbm1lbnRzCiAJCWlmICgkbGluZSA9fiAvXi5ccyokTHZhbFxzKj1ccyokTHZhbFxzKj0oPyE9KS8pIHsKLQkJCUNISygibXVsdGlwbGUgYXNzaWdubWVudHMgc2hvdWxkIGJlIGF2b2lkZWRcbiIgLiAkaGVyZWN1cnIpOworCQkJQ0hLKCJNVUxUSVBMRV9BU1NJR05NRU5UUyIsCisJCQkgICAgIm11bHRpcGxlIGFzc2lnbm1lbnRzIHNob3VsZCBiZSBhdm9pZGVkXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIyAjIGNoZWNrIGZvciBtdWx0aXBsZSBkZWNsYXJhdGlvbnMsIGFsbG93aW5nIGZvciBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uCkBAIC0yMjE0LDQ1ICsyNDc1LDUzIEBACiAjIyAJCQl3aGlsZSAoJGxuID1+IHMvXChbXlwoXCldKlwpLy9nKSB7CiAjIyAJCQl9CiAjIyAJCQlpZiAoJGxuID1+IC8sLykgewotIyMgCQkJCVdBUk4oImRlY2xhcmluZyBtdWx0aXBsZSB2YXJpYWJsZXMgdG9nZXRoZXIgc2hvdWxkIGJlIGF2b2lkZWRcbiIgLiAkaGVyZWN1cnIpOworIyMgCQkJCVdBUk4oIk1VTFRJUExFX0RFQ0xBUkFUSU9OIiwKKyMjCQkJCSAgICAgImRlY2xhcmluZyBtdWx0aXBsZSB2YXJpYWJsZXMgdG9nZXRoZXIgc2hvdWxkIGJlIGF2b2lkZWRcbiIgLiAkaGVyZWN1cnIpOwogIyMgCQkJfQogIyMgCQl9CiAKICNuZWVkIHNwYWNlIGJlZm9yZSBicmFjZSBmb2xsb3dpbmcgaWYsIHdoaWxlLCBldGMKIAkJaWYgKCgkbGluZSA9fiAvXCguKlwpey8gJiYgJGxpbmUgIX4gL1woJFR5cGVcKXsvKSB8fAogCQkgICAgJGxpbmUgPX4gL2Rvey8pIHsKLQkJCUVSUk9SKCJzcGFjZSByZXF1aXJlZCBiZWZvcmUgdGhlIG9wZW4gYnJhY2UgJ3snXG4iIC4gJGhlcmVjdXJyKTsKKwkJCUVSUk9SKCJTUEFDSU5HIiwKKwkJCSAgICAgICJzcGFjZSByZXF1aXJlZCBiZWZvcmUgdGhlIG9wZW4gYnJhY2UgJ3snXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIGNsb3NpbmcgYnJhY2Ugc2hvdWxkIGhhdmUgYSBzcGFjZSBmb2xsb3dpbmcgaXQgd2hlbiBpdCBoYXMgYW55dGhpbmcKICMgb24gdGhlIGxpbmUKIAkJaWYgKCRsaW5lID1+IC99KD8hKD86LHw7fFwpKSlcUy8pIHsKLQkJCUVSUk9SKCJzcGFjZSByZXF1aXJlZCBhZnRlciB0aGF0IGNsb3NlIGJyYWNlICd9J1xuIiAuICRoZXJlY3Vycik7CisJCQlFUlJPUigiU1BBQ0lORyIsCisJCQkgICAgICAic3BhY2UgcmVxdWlyZWQgYWZ0ZXIgdGhhdCBjbG9zZSBicmFjZSAnfSdcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgY2hlY2sgc3BhY2luZyBvbiBzcXVhcmUgYnJhY2tldHMKIAkJaWYgKCRsaW5lID1+IC9cW1xzLyAmJiAkbGluZSAhfiAvXFtccyokLykgewotCQkJRVJST1IoInNwYWNlIHByb2hpYml0ZWQgYWZ0ZXIgdGhhdCBvcGVuIHNxdWFyZSBicmFja2V0ICdbJ1xuIiAuICRoZXJlY3Vycik7CisJCQlFUlJPUigiU1BBQ0lORyIsCisJCQkgICAgICAic3BhY2UgcHJvaGliaXRlZCBhZnRlciB0aGF0IG9wZW4gc3F1YXJlIGJyYWNrZXQgJ1snXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCQlpZiAoJGxpbmUgPX4gL1xzXF0vKSB7Ci0JCQlFUlJPUigic3BhY2UgcHJvaGliaXRlZCBiZWZvcmUgdGhhdCBjbG9zZSBzcXVhcmUgYnJhY2tldCAnXSdcbiIgLiAkaGVyZWN1cnIpOworCQkJRVJST1IoIlNQQUNJTkciLAorCQkJICAgICAgInNwYWNlIHByb2hpYml0ZWQgYmVmb3JlIHRoYXQgY2xvc2Ugc3F1YXJlIGJyYWNrZXQgJ10nXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIGNoZWNrIHNwYWNpbmcgb24gcGFyZW50aGVzZXMKIAkJaWYgKCRsaW5lID1+IC9cKFxzLyAmJiAkbGluZSAhfiAvXChccyooPzpcXCk/JC8gJiYKIAkJICAgICRsaW5lICF+IC9mb3JccypcKFxzKzsvKSB7Ci0JCQlFUlJPUigic3BhY2UgcHJvaGliaXRlZCBhZnRlciB0aGF0IG9wZW4gcGFyZW50aGVzaXMgJygnXG4iIC4gJGhlcmVjdXJyKTsKKwkJCUVSUk9SKCJTUEFDSU5HIiwKKwkJCSAgICAgICJzcGFjZSBwcm9oaWJpdGVkIGFmdGVyIHRoYXQgb3BlbiBwYXJlbnRoZXNpcyAnKCdcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAJCWlmICgkbGluZSA9fiAvKFxzKylcKS8gJiYgJGxpbmUgIX4gL14uXHMqXCkvICYmCiAJCSAgICAkbGluZSAhfiAvZm9yXHMqXCguKjtccytcKS8gJiYKIAkJICAgICRsaW5lICF+IC86XHMrXCkvKSB7Ci0JCQlFUlJPUigic3BhY2UgcHJvaGliaXRlZCBiZWZvcmUgdGhhdCBjbG9zZSBwYXJlbnRoZXNpcyAnKSdcbiIgLiAkaGVyZWN1cnIpOworCQkJRVJST1IoIlNQQUNJTkciLAorCQkJICAgICAgInNwYWNlIHByb2hpYml0ZWQgYmVmb3JlIHRoYXQgY2xvc2UgcGFyZW50aGVzaXMgJyknXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjZ290byBsYWJlbHMgYXJlbid0IGluZGVudGVkLCBhbGxvdyBhIHNpbmdsZSBzcGFjZSBob3dldmVyCiAJCWlmICgkbGluZT1+L14uXHMrW0EtWmEtelxkX10rOig/IVswLTldKykvIGFuZAogCQkgICAhKCRsaW5lPX4vXi4gW0EtWmEtelxkX10rOi8pIGFuZCAhKCRsaW5lPX4vXi5ccytkZWZhdWx0Oi8pKSB7Ci0JCQlXQVJOKCJsYWJlbHMgc2hvdWxkIG5vdCBiZSBpbmRlbnRlZFxuIiAuICRoZXJlY3Vycik7CisJCQlXQVJOKCJJTkRFTlRFRF9MQUJFTCIsCisJCQkgICAgICJsYWJlbHMgc2hvdWxkIG5vdCBiZSBpbmRlbnRlZFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBSZXR1cm4gaXMgbm90IGEgZnVuY3Rpb24uCkBAIC0yMjcxLDIzICsyNTQwLDQ3IEBACiAJCQl9CiAjcHJpbnQgInZhbHVlPCR2YWx1ZT5cbiI7CiAJCQlpZiAoJHZhbHVlID1+IC9eXHMqKD86JElkZW50fC0/JENvbnN0YW50KVxzKiQvKSB7Ci0JCQkJRVJST1IoInJldHVybiBpcyBub3QgYSBmdW5jdGlvbiwgcGFyZW50aGVzZXMgYXJlIG5vdCByZXF1aXJlZFxuIiAuICRoZXJlY3Vycik7CisJCQkJRVJST1IoIlJFVFVSTl9QQVJFTlRIRVNFUyIsCisJCQkJICAgICAgInJldHVybiBpcyBub3QgYSBmdW5jdGlvbiwgcGFyZW50aGVzZXMgYXJlIG5vdCByZXF1aXJlZFxuIiAuICRoZXJlY3Vycik7CiAKIAkJCX0gZWxzaWYgKCRzcGFjaW5nICF+IC9ccysvKSB7Ci0JCQkJRVJST1IoInNwYWNlIHJlcXVpcmVkIGJlZm9yZSB0aGUgb3BlbiBwYXJlbnRoZXNpcyAnKCdcbiIgLiAkaGVyZWN1cnIpOworCQkJCUVSUk9SKCJTUEFDSU5HIiwKKwkJCQkgICAgICAic3BhY2UgcmVxdWlyZWQgYmVmb3JlIHRoZSBvcGVuIHBhcmVudGhlc2lzICcoJ1xuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KICMgUmV0dXJuIG9mIHdoYXQgYXBwZWFycyB0byBiZSBhbiBlcnJubyBzaG91bGQgbm9ybWFsbHkgYmUgLSd2ZQogCQlpZiAoJGxpbmUgPX4gL14uXHMqcmV0dXJuXHMqKEVbQS1aXSopXHMqOy8pIHsKIAkJCW15ICRuYW1lID0gJDE7CiAJCQlpZiAoJG5hbWUgbmUgJ0VPRicgJiYgJG5hbWUgbmUgJ0VSUk9SJykgewotCQkJCVdBUk4oInJldHVybiBvZiBhbiBlcnJubyBzaG91bGQgdHlwaWNhbGx5IGJlIC12ZSAocmV0dXJuIC0kMSlcbiIgLiAkaGVyZWN1cnIpOworCQkJCVdBUk4oIlVTRV9ORUdBVElWRV9FUlJOTyIsCisJCQkJICAgICAicmV0dXJuIG9mIGFuIGVycm5vIHNob3VsZCB0eXBpY2FsbHkgYmUgLXZlIChyZXR1cm4gLSQxKVxuIiAuICRoZXJlY3Vycik7CisJCQl9CisJCX0KKworIyB0eXBlY2FzdHMgb24gbWluL21heCBjb3VsZCBiZSBtaW5fdC9tYXhfdAorCQlpZiAoJGxpbmUgPX4gL15cKyg/Oi4qPylcYihtaW58bWF4KVxzKlwoJFR5cGVjYXN0ezAsMX0oJEx2YWxPckZ1bmMpXHMqLFxzKiRUeXBlY2FzdHswLDF9KCRMdmFsT3JGdW5jKVxzKlwpLykgeworCQkJaWYgKGRlZmluZWQgJDIgfHwgZGVmaW5lZCAkOCkgeworCQkJCW15ICRjYWxsID0gJDE7CisJCQkJbXkgJGNhc3QxID0gZGVwYXJlbnRoZXNpemUoJDIpOworCQkJCW15ICRhcmcxID0gJDM7CisJCQkJbXkgJGNhc3QyID0gZGVwYXJlbnRoZXNpemUoJDgpOworCQkJCW15ICRhcmcyID0gJDk7CisJCQkJbXkgJGNhc3Q7CisKKwkJCQlpZiAoJGNhc3QxIG5lICIiICYmICRjYXN0MiBuZSAiIikgeworCQkJCQkkY2FzdCA9ICIkY2FzdDEgb3IgJGNhc3QyIjsKKwkJCQl9IGVsc2lmICgkY2FzdDEgbmUgIiIpIHsKKwkJCQkJJGNhc3QgPSAkY2FzdDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJJGNhc3QgPSAkY2FzdDI7CisJCQkJfQorCQkJCVdBUk4oIiRjYWxsKCkgc2hvdWxkIHByb2JhYmx5IGJlICR7Y2FsbH1fdCgkY2FzdCwgJGFyZzEsICRhcmcyKVxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KIAogIyBOZWVkIGEgc3BhY2UgYmVmb3JlIG9wZW4gcGFyZW50aGVzaXMgYWZ0ZXIgaWYsIHdoaWxlIGV0YwogCQlpZiAoJGxpbmU9fi9cYihpZnx3aGlsZXxmb3J8c3dpdGNoKVwoLykgewotCQkJRVJST1IoInNwYWNlIHJlcXVpcmVkIGJlZm9yZSB0aGUgb3BlbiBwYXJlbnRoZXNpcyAnKCdcbiIgLiAkaGVyZWN1cnIpOworCQkJRVJST1IoIlNQQUNJTkciLCAic3BhY2UgcmVxdWlyZWQgYmVmb3JlIHRoZSBvcGVuIHBhcmVudGhlc2lzICcoJ1xuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBDaGVjayBmb3IgaWxsZWdhbCBhc3NpZ25tZW50IGluIGlmIGNvbmRpdGlvbmFsIC0tIGFuZCBjaGVjayBmb3IgdHJhaWxpbmcKQEAgLTIzMTUsNyArMjYwOCw4IEBACiAJCQlteSAoJHMsICRjKSA9ICgkc3RhdCwgJGNvbmQpOwogCiAJCQlpZiAoJGMgPX4gL1xiaWZccypcKC4qW148PiE9XT1bXj1dLiovcykgewotCQkJCUVSUk9SKCJkbyBub3QgdXNlIGFzc2lnbm1lbnQgaW4gaWYgY29uZGl0aW9uXG4iIC4gJGhlcmVjdXJyKTsKKwkJCQlFUlJPUigiQVNTSUdOX0lOX0lGIiwKKwkJCQkgICAgICAiZG8gbm90IHVzZSBhc3NpZ25tZW50IGluIGlmIGNvbmRpdGlvblxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAKIAkJCSMgRmluZCBvdXQgd2hhdCBpcyBvbiB0aGUgZW5kIG9mIHRoZSBsaW5lIGFmdGVyIHRoZQpAQCAtMjMzNyw3ICsyNjMxLDggQEAKIAkJCQkJJHN0YXRfcmVhbCA9ICJbLi4uXVxuJHN0YXRfcmVhbCI7CiAJCQkJfQogCi0JCQkJRVJST1IoInRyYWlsaW5nIHN0YXRlbWVudHMgc2hvdWxkIGJlIG9uIG5leHQgbGluZVxuIiAuICRoZXJlY3VyciAuICRzdGF0X3JlYWwpOworCQkJCUVSUk9SKCJUUkFJTElOR19TVEFURU1FTlRTIiwKKwkJCQkgICAgICAidHJhaWxpbmcgc3RhdGVtZW50cyBzaG91bGQgYmUgb24gbmV4dCBsaW5lXG4iIC4gJGhlcmVjdXJyIC4gJHN0YXRfcmVhbCk7CiAJCQl9CiAJCX0KIApAQCAtMjM1Myw3ICsyNjQ4LDggQEAKIAkJCQkoPzpcJlwmfFx8XHx8XCl8XF0pCiAJCQkpL3gpCiAJCXsKLQkJCVdBUk4oImJvb2xlYW4gdGVzdCB3aXRoIGhleGFkZWNpbWFsLCBwZXJoYXBzIGp1c3QgMSBcJiBvciBcfD9cbiIgLiAkaGVyZWN1cnIpOworCQkJV0FSTigiSEVYQURFQ0lNQUxfQk9PTEVBTl9URVNUIiwKKwkJCSAgICAgImJvb2xlYW4gdGVzdCB3aXRoIGhleGFkZWNpbWFsLCBwZXJoYXBzIGp1c3QgMSBcJiBvciBcfD9cbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgaWYgYW5kIGVsc2Ugc2hvdWxkIG5vdCBoYXZlIGdlbmVyYWwgc3RhdGVtZW50cyBhZnRlciBpdApAQCAtMjM2MSwxMiArMjY1NywxNCBAQAogCQkJbXkgJHMgPSAkMTsKIAkJCSRzID1+IHMvJDsvL2c7IAkjIFJlbW92ZSBhbnkgY29tbWVudHMKIAkJCWlmICgkcyAhfiAvXlxzKig/OlxzaWZ8KD86e3wpXHMqXFw/XHMqJCkvKSB7Ci0JCQkJRVJST1IoInRyYWlsaW5nIHN0YXRlbWVudHMgc2hvdWxkIGJlIG9uIG5leHQgbGluZVxuIiAuICRoZXJlY3Vycik7CisJCQkJRVJST1IoIlRSQUlMSU5HX1NUQVRFTUVOVFMiLAorCQkJCSAgICAgICJ0cmFpbGluZyBzdGF0ZW1lbnRzIHNob3VsZCBiZSBvbiBuZXh0IGxpbmVcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAjIGlmIHNob3VsZCBub3QgY29udGludWUgYSBicmFjZQogCQlpZiAoJGxpbmUgPX4gL31ccyppZlxiLykgewotCQkJRVJST1IoInRyYWlsaW5nIHN0YXRlbWVudHMgc2hvdWxkIGJlIG9uIG5leHQgbGluZVxuIiAuCisJCQlFUlJPUigiVFJBSUxJTkdfU1RBVEVNRU5UUyIsCisJCQkgICAgICAidHJhaWxpbmcgc3RhdGVtZW50cyBzaG91bGQgYmUgb24gbmV4dCBsaW5lXG4iIC4KIAkJCQkkaGVyZWN1cnIpOwogCQl9CiAjIGNhc2UgYW5kIGRlZmF1bHQgc2hvdWxkIG5vdCBoYXZlIGdlbmVyYWwgc3RhdGVtZW50cyBhZnRlciB0aGVtCkBAIC0yMzc2LDE0ICsyNjc0LDE2IEBACiAJCQlccypyZXR1cm5ccysKIAkJICAgICkveGcpCiAJCXsKLQkJCUVSUk9SKCJ0cmFpbGluZyBzdGF0ZW1lbnRzIHNob3VsZCBiZSBvbiBuZXh0IGxpbmVcbiIgLiAkaGVyZWN1cnIpOworCQkJRVJST1IoIlRSQUlMSU5HX1NUQVRFTUVOVFMiLAorCQkJICAgICAgInRyYWlsaW5nIHN0YXRlbWVudHMgc2hvdWxkIGJlIG9uIG5leHQgbGluZVxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogCQkjIENoZWNrIGZvciB9PG5sPmVsc2UgeywgdGhlc2UgbXVzdCBiZSBhdCB0aGUgc2FtZQogCQkjIGluZGVudCBsZXZlbCB0byBiZSByZWxldmFudCB0byBlYWNoIG90aGVyLgogCQlpZiAoJHByZXZsaW5lPX4vfVxzKiQvIGFuZCAkbGluZT1+L14uXHMqZWxzZVxzKi8gYW5kCiAJCQkJCQkkcHJldmluZGVudCA9PSAkaW5kZW50KSB7Ci0JCQlFUlJPUigiZWxzZSBzaG91bGQgZm9sbG93IGNsb3NlIGJyYWNlICd9J1xuIiAuICRoZXJlcHJldik7CisJCQlFUlJPUigiRUxTRV9BRlRFUl9CUkFDRSIsCisJCQkgICAgICAiZWxzZSBzaG91bGQgZm9sbG93IGNsb3NlIGJyYWNlICd9J1xuIiAuICRoZXJlcHJldik7CiAJCX0KIAogCQlpZiAoJHByZXZsaW5lPX4vfVxzKiQvIGFuZCAkbGluZT1+L14uXHMqd2hpbGVccyovIGFuZApAQCAtMjM5Niw3ICsyNjk2LDggQEAKIAkJCSRzID1+IHMvXG4uKi8vZzsKIAogCQkJaWYgKCRzID1+IC9eXHMqOy8pIHsKLQkJCQlFUlJPUigid2hpbGUgc2hvdWxkIGZvbGxvdyBjbG9zZSBicmFjZSAnfSdcbiIgLiAkaGVyZXByZXYpOworCQkJCUVSUk9SKCJXSElMRV9BRlRFUl9CUkFDRSIsCisJCQkJICAgICAgIndoaWxlIHNob3VsZCBmb2xsb3cgY2xvc2UgYnJhY2UgJ30nXG4iIC4gJGhlcmVwcmV2KTsKIAkJCX0KIAkJfQogCkBAIC0yNDA5LDcgKzI3MTAsOCBAQAogCiAjbm8gc3BhY2VzIGFsbG93ZWQgYWZ0ZXIgXCBpbiBkZWZpbmUKIAkJaWYgKCRsaW5lPX4vXCNccypkZWZpbmUuKlxcXHMkLykgewotCQkJV0FSTigiV2hpdGVwc3BhY2UgYWZ0ZXIgXFwgbWFrZXMgbmV4dCBsaW5lcyB1c2VsZXNzXG4iIC4gJGhlcmVjdXJyKTsKKwkJCVdBUk4oIldISVRFU1BBQ0VfQUZURVJfTElORV9DT05USU5VQVRJT04iLAorCQkJICAgICAiV2hpdGVwc3BhY2UgYWZ0ZXIgXFwgbWFrZXMgbmV4dCBsaW5lcyB1c2VsZXNzXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjd2FybiBpZiA8YXNtL2Zvby5oPiBpcyAjaW5jbHVkZWQgYW5kIDxsaW51eC9mb28uaD4gaXMgYXZhaWxhYmxlICh1c2VzIFJBVyBsaW5lKQpAQCAtMjQyMSw5ICsyNzIzLDExIEBACiAJCQkgICAgJDEgIX4gLyRhbGxvd2VkX2FzbV9pbmNsdWRlcy8pCiAJCQl7CiAJCQkJaWYgKCRyZWFsZmlsZSA9fiBte15hcmNoL30pIHsKLQkJCQkJQ0hLKCJDb25zaWRlciB1c2luZyAjaW5jbHVkZSA8bGludXgvJGZpbGU+IGluc3RlYWQgb2YgPGFzbS8kZmlsZT5cbiIgLiAkaGVyZWN1cnIpOworCQkJCQlDSEsoIkFSQ0hfSU5DTFVERV9MSU5VWCIsCisJCQkJCSAgICAiQ29uc2lkZXIgdXNpbmcgI2luY2x1ZGUgPGxpbnV4LyRmaWxlPiBpbnN0ZWFkIG9mIDxhc20vJGZpbGU+XG4iIC4gJGhlcmVjdXJyKTsKIAkJCQl9IGVsc2UgewotCQkJCQlXQVJOKCJVc2UgI2luY2x1ZGUgPGxpbnV4LyRmaWxlPiBpbnN0ZWFkIG9mIDxhc20vJGZpbGU+XG4iIC4gJGhlcmVjdXJyKTsKKwkJCQkJV0FSTigiSU5DTFVERV9MSU5VWCIsCisJCQkJCSAgICAgIlVzZSAjaW5jbHVkZSA8bGludXgvJGZpbGU+IGluc3RlYWQgb2YgPGFzbS8kZmlsZT5cbiIgLiAkaGVyZWN1cnIpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjUwNyw3ICsyODExLDggQEAKIAkJCQlpZiAoJHJlc3QgIX4gL3doaWxlXHMqXCgvICYmCiAJCQkJICAgICRkc3RhdCAhfiAvJGV4Y2VwdGlvbnMvKQogCQkJCXsKLQkJCQkJRVJST1IoIk1hY3JvcyB3aXRoIG11bHRpcGxlIHN0YXRlbWVudHMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIGEgZG8gLSB3aGlsZSBsb29wXG4iIC4gIiRoZXJlXG4kY3R4XG4iKTsKKwkJCQkJRVJST1IoIk1VTFRJU1RBVEVNRU5UX01BQ1JPX1VTRV9ET19XSElMRSIsCisJCQkJCSAgICAgICJNYWNyb3Mgd2l0aCBtdWx0aXBsZSBzdGF0ZW1lbnRzIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBhIGRvIC0gd2hpbGUgbG9vcFxuIiAuICIkaGVyZVxuJGN0eFxuIik7CiAJCQkJfQogCiAJCQl9IGVsc2lmICgkY3R4ICF+IC87LykgewpAQCAtMjUxNyw3ICsyODIyLDggQEAKIAkJCQkgICAgJGRzdGF0ICF+IC9eXC4kSWRlbnRccyo9LyAmJgogCQkJCSAgICAkZHN0YXQgPX4gLyRPcGVyYXRvcnMvKQogCQkJCXsKLQkJCQkJRVJST1IoIk1hY3JvcyB3aXRoIGNvbXBsZXggdmFsdWVzIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNpc1xuIiAuICIkaGVyZVxuJGN0eFxuIik7CisJCQkJCUVSUk9SKCJDT01QTEVYX01BQ1JPIiwKKwkJCQkJICAgICAgIk1hY3JvcyB3aXRoIGNvbXBsZXggdmFsdWVzIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNpc1xuIiAuICIkaGVyZVxuJGN0eFxuIik7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0yNTI4LDcgKzI4MzQsOCBAQAogIwlBTElHTiguLi4pCiAjCVZNTElOVVhfU1lNQk9MKC4uLikKIAkJaWYgKCRyZWFsZmlsZSBlcSAndm1saW51eC5sZHMuaCcgJiYgJGxpbmUgPX4gLyg/Oig/Ol58XHMpJElkZW50XHMqPXw9XHMqJElkZW50KD86XHN8JCkpLykgewotCQkJV0FSTigidm1saW51eC5sZHMuaCBuZWVkcyBWTUxJTlVYX1NZTUJPTCgpIGFyb3VuZCBDLXZpc2libGUgc3ltYm9sc1xuIiAuICRoZXJlY3Vycik7CisJCQlXQVJOKCJNSVNTSU5HX1ZNTElOVVhfU1lNQk9MIiwKKwkJCSAgICAgInZtbGludXgubGRzLmggbmVlZHMgVk1MSU5VWF9TWU1CT0woKSBhcm91bmQgQy12aXNpYmxlIHN5bWJvbHNcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgY2hlY2sgZm9yIHJlZHVuZGFudCBicmFjaW5nIHJvdW5kIGlmIGV0YwpAQCAtMjU3Niw3ICsyODgzLDggQEAKIAkJCQkJfQogCQkJCX0KIAkJCQlpZiAoJHNlZW4gJiYgISRhbGxvd2VkKSB7Ci0JCQkJCVdBUk4oImJyYWNlcyB7fSBhcmUgbm90IG5lY2Vzc2FyeSBmb3IgYW55IGFybSBvZiB0aGlzIHN0YXRlbWVudFxuIiAuICRoZXJlY3R4KTsKKwkJCQkJV0FSTigiQlJBQ0VTIiwKKwkJCQkJICAgICAiYnJhY2VzIHt9IGFyZSBub3QgbmVjZXNzYXJ5IGZvciBhbnkgYXJtIG9mIHRoaXMgc3RhdGVtZW50XG4iIC4gJGhlcmVjdHgpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjYzMCwzMyArMjkzOCwzOCBAQAogCQkJCQkkaGVyZWN0eCAuPSByYXdfbGluZSgkbGluZW5yLCAkbikgLiAiXG4iOzsKIAkJCQl9CiAKLQkJCQlXQVJOKCJicmFjZXMge30gYXJlIG5vdCBuZWNlc3NhcnkgZm9yIHNpbmdsZSBzdGF0ZW1lbnQgYmxvY2tzXG4iIC4gJGhlcmVjdHgpOworCQkJCVdBUk4oIkJSQUNFUyIsCisJCQkJICAgICAiYnJhY2VzIHt9IGFyZSBub3QgbmVjZXNzYXJ5IGZvciBzaW5nbGUgc3RhdGVtZW50IGJsb2Nrc1xuIiAuICRoZXJlY3R4KTsKIAkJCX0KIAkJfQogCiAjIGRvbid0IGluY2x1ZGUgZGVwcmVjYXRlZCBpbmNsdWRlIGZpbGVzICh1c2VzIFJBVyBsaW5lKQogCQlmb3IgbXkgJGluYyAoQGRlcF9pbmNsdWRlcykgewogCQkJaWYgKCRyYXdsaW5lID1+IG1AXi5ccypcI1xzKmluY2x1ZGVccypcPCRpbmM+QCkgewotCQkJCUVSUk9SKCJEb24ndCB1c2UgPCRpbmM+OiBzZWUgRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0XG4iIC4gJGhlcmVjdXJyKTsKKwkJCQlFUlJPUigiREVQUkVDQVRFRF9JTkNMVURFIiwKKwkJCQkgICAgICAiRG9uJ3QgdXNlIDwkaW5jPjogc2VlIERvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dFxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KIAogIyBkb24ndCB1c2UgZGVwcmVjYXRlZCBmdW5jdGlvbnMKIAkJZm9yIG15ICRmdW5jIChAZGVwX2Z1bmN0aW9ucykgewogCQkJaWYgKCRsaW5lID1+IC9cYiRmdW5jXGIvKSB7Ci0JCQkJRVJST1IoIkRvbid0IHVzZSAkZnVuYygpOiBzZWUgRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0XG4iIC4gJGhlcmVjdXJyKTsKKwkJCQlFUlJPUigiREVQUkVDQVRFRF9GVU5DVElPTiIsCisJCQkJICAgICAgIkRvbid0IHVzZSAkZnVuYygpOiBzZWUgRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0XG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCiAjIG5vIHZvbGF0aWxlcyBwbGVhc2UKIAkJbXkgJGFzbV92b2xhdGlsZSA9IHFye1xiKF9fYXNtX198YXNtKVxzKyhfX3ZvbGF0aWxlX198dm9sYXRpbGUpXGJ9OwogCQlpZiAoJGxpbmUgPX4gL1xidm9sYXRpbGVcYi8gJiYgJGxpbmUgIX4gLyRhc21fdm9sYXRpbGUvKSB7Ci0JCQlXQVJOKCJVc2Ugb2Ygdm9sYXRpbGUgaXMgdXN1YWxseSB3cm9uZzogc2VlIERvY3VtZW50YXRpb24vdm9sYXRpbGUtY29uc2lkZXJlZC1oYXJtZnVsLnR4dFxuIiAuICRoZXJlY3Vycik7CisJCQlXQVJOKCJWT0xBVElMRSIsCisJCQkgICAgICJVc2Ugb2Ygdm9sYXRpbGUgaXMgdXN1YWxseSB3cm9uZzogc2VlIERvY3VtZW50YXRpb24vdm9sYXRpbGUtY29uc2lkZXJlZC1oYXJtZnVsLnR4dFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyB3YXJuIGFib3V0ICNpZiAwCiAJCWlmICgkbGluZSA9fiAvXi5ccypcI1xzKmlmXHMrMFxiLykgewotCQkJQ0hLKCJpZiB0aGlzIGNvZGUgaXMgcmVkdW5kYW50IGNvbnNpZGVyIHJlbW92aW5nIGl0XG4iIC4KKwkJCUNISygiUkVEVU5EQU5UX0NPREUiLAorCQkJICAgICJpZiB0aGlzIGNvZGUgaXMgcmVkdW5kYW50IGNvbnNpZGVyIHJlbW92aW5nIGl0XG4iIC4KIAkJCQkkaGVyZWN1cnIpOwogCQl9CiAKQEAgLTI2NjQsMTQgKzI5NzcsMTYgQEAKIAkJaWYgKCRwcmV2bGluZSA9fiAvXGJpZlxzKlwoKFteXCldKilcKS8pIHsKIAkJCW15ICRleHByID0gJDE7CiAJCQlpZiAoJGxpbmUgPX4gL1xia2ZyZWVcKFxRJGV4cHJcRVwpOy8pIHsKLQkJCQlXQVJOKCJrZnJlZShOVUxMKSBpcyBzYWZlIHRoaXMgY2hlY2sgaXMgcHJvYmFibHkgbm90IHJlcXVpcmVkXG4iIC4gJGhlcmVwcmV2KTsKKwkJCQlXQVJOKCJORUVETEVTU19LRlJFRSIsCisJCQkJICAgICAia2ZyZWUoTlVMTCkgaXMgc2FmZSB0aGlzIGNoZWNrIGlzIHByb2JhYmx5IG5vdCByZXF1aXJlZFxuIiAuICRoZXJlcHJldik7CiAJCQl9CiAJCX0KICMgY2hlY2sgZm9yIG5lZWRsZXNzIHVzYl9mcmVlX3VyYigpIGNoZWNrcwogCQlpZiAoJHByZXZsaW5lID1+IC9cYmlmXHMqXCgoW15cKV0qKVwpLykgewogCQkJbXkgJGV4cHIgPSAkMTsKIAkJCWlmICgkbGluZSA9fiAvXGJ1c2JfZnJlZV91cmJcKFxRJGV4cHJcRVwpOy8pIHsKLQkJCQlXQVJOKCJ1c2JfZnJlZV91cmIoTlVMTCkgaXMgc2FmZSB0aGlzIGNoZWNrIGlzIHByb2JhYmx5IG5vdCByZXF1aXJlZFxuIiAuICRoZXJlcHJldik7CisJCQkJV0FSTigiTkVFRExFU1NfVVNCX0ZSRUVfVVJCIiwKKwkJCQkgICAgICJ1c2JfZnJlZV91cmIoTlVMTCkgaXMgc2FmZSB0aGlzIGNoZWNrIGlzIHByb2JhYmx5IG5vdCByZXF1aXJlZFxuIiAuICRoZXJlcHJldik7CiAJCQl9CiAJCX0KIApAQCAtMjY3OSwxNCArMjk5NCwxNiBAQAogCQlpZiAoJGxpbmUgPX4gL1xidWRlbGF5XHMqXChccyooXHcrKVxzKlwpLykgewogCQkJIyBpZ25vcmUgdWRlbGF5J3MgPCAxMCwgaG93ZXZlcgogCQkJaWYgKCEgKCgkMSA9fiAvKFxkKykvKSAmJiAoJDEgPCAxMCkpICkgewotCQkJCUNISygidXNsZWVwX3JhbmdlIGlzIHByZWZlcnJlZCBvdmVyIHVkZWxheTsgc2VlIERvY3VtZW50YXRpb24vdGltZXJzL3RpbWVycy1ob3d0by50eHRcbiIgLiAkbGluZSk7CisJCQkJQ0hLKCJVU0xFRVBfUkFOR0UiLAorCQkJCSAgICAidXNsZWVwX3JhbmdlIGlzIHByZWZlcnJlZCBvdmVyIHVkZWxheTsgc2VlIERvY3VtZW50YXRpb24vdGltZXJzL3RpbWVycy1ob3d0by50eHRcbiIgLiAkbGluZSk7CiAJCQl9CiAJCX0KIAogIyB3YXJuIGFib3V0IHVuZXhwZWN0ZWRseSBsb25nIG1zbGVlcCdzCiAJCWlmICgkbGluZSA9fiAvXGJtc2xlZXBccypcKChcZCspXCk7LykgewogCQkJaWYgKCQxIDwgMjApIHsKLQkJCQlXQVJOKCJtc2xlZXAgPCAyMG1zIGNhbiBzbGVlcCBmb3IgdXAgdG8gMjBtczsgc2VlIERvY3VtZW50YXRpb24vdGltZXJzL3RpbWVycy1ob3d0by50eHRcbiIgLiAkbGluZSk7CisJCQkJV0FSTigiTVNMRUVQIiwKKwkJCQkgICAgICJtc2xlZXAgPCAyMG1zIGNhbiBzbGVlcCBmb3IgdXAgdG8gMjBtczsgc2VlIERvY3VtZW50YXRpb24vdGltZXJzL3RpbWVycy1ob3d0by50eHRcbiIgLiAkbGluZSk7CiAJCQl9CiAJCX0KIApAQCAtMjY5OSw3ICszMDE2LDggQEAKIAogIyB3YXJuIGFib3V0IHNwYWNpbmcgaW4gI2lmZGVmcwogCQlpZiAoJGxpbmUgPX4gL14uXHMqXCNccyooaWZkZWZ8aWZuZGVmfGVsaWYpXHNccysvKSB7Ci0JCQlFUlJPUigiZXhhY3RseSBvbmUgc3BhY2UgcmVxdWlyZWQgYWZ0ZXIgdGhhdCAjJDFcbiIgLiAkaGVyZWN1cnIpOworCQkJRVJST1IoIlNQQUNJTkciLAorCQkJICAgICAgImV4YWN0bHkgb25lIHNwYWNlIHJlcXVpcmVkIGFmdGVyIHRoYXQgIyQxXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIGNoZWNrIGZvciBzcGlubG9ja190IGRlZmluaXRpb25zIHdpdGhvdXQgYSBjb21tZW50LgpAQCAtMjcwNyw1MCArMzAyNSw2NSBAQAogCQkgICAgJGxpbmUgPX4gL14uXHMqKERFRklORV9NVVRFWClccypcKC8pIHsKIAkJCW15ICR3aGljaCA9ICQxOwogCQkJaWYgKCFjdHhfaGFzX2NvbW1lbnQoJGZpcnN0X2xpbmUsICRsaW5lbnIpKSB7Ci0JCQkJQ0hLKCIkMSBkZWZpbml0aW9uIHdpdGhvdXQgY29tbWVudFxuIiAuICRoZXJlY3Vycik7CisJCQkJQ0hLKCJVTkNPTU1FTlRFRF9ERUZJTklUSU9OIiwKKwkJCQkgICAgIiQxIGRlZmluaXRpb24gd2l0aG91dCBjb21tZW50XG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogIyBjaGVjayBmb3IgbWVtb3J5IGJhcnJpZXJzIHdpdGhvdXQgYSBjb21tZW50LgogCQlpZiAoJGxpbmUgPX4gL1xiKG1ifHJtYnx3bWJ8cmVhZF9iYXJyaWVyX2RlcGVuZHN8c21wX21ifHNtcF9ybWJ8c21wX3dtYnxzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMpXCgvKSB7CiAJCQlpZiAoIWN0eF9oYXNfY29tbWVudCgkZmlyc3RfbGluZSwgJGxpbmVucikpIHsKLQkJCQlDSEsoIm1lbW9yeSBiYXJyaWVyIHdpdGhvdXQgY29tbWVudFxuIiAuICRoZXJlY3Vycik7CisJCQkJQ0hLKCJNRU1PUllfQkFSUklFUiIsCisJCQkJICAgICJtZW1vcnkgYmFycmllciB3aXRob3V0IGNvbW1lbnRcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAjIGNoZWNrIG9mIGhhcmR3YXJlIHNwZWNpZmljIGRlZmluZXMKIAkJaWYgKCRsaW5lID1+IG1AXi5ccypcI1xzKmlmLipcYihfX2kzODZfX3xfX3Bvd2VycGM2NF9ffF9fc3VuX198X19zMzkweF9fKVxiQCAmJiAkcmVhbGZpbGUgIX4gbUBpbmNsdWRlL2FzbS1AKSB7Ci0JCQlDSEsoImFyY2hpdGVjdHVyZSBzcGVjaWZpYyBkZWZpbmVzIHNob3VsZCBiZSBhdm9pZGVkXG4iIC4gICRoZXJlY3Vycik7CisJCQlDSEsoIkFSQ0hfREVGSU5FUyIsCisJCQkgICAgImFyY2hpdGVjdHVyZSBzcGVjaWZpYyBkZWZpbmVzIHNob3VsZCBiZSBhdm9pZGVkXG4iIC4gICRoZXJlY3Vycik7CiAJCX0KIAogIyBDaGVjayB0aGF0IHRoZSBzdG9yYWdlIGNsYXNzIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBkZWNsYXJhdGlvbgogCQlpZiAoJGxpbmUgPX4gL1xiJFN0b3JhZ2VcYi8gJiYgJGxpbmUgIX4gL14uXHMqJFN0b3JhZ2VcYi8pIHsKLQkJCVdBUk4oInN0b3JhZ2UgY2xhc3Mgc2hvdWxkIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlY2xhcmF0aW9uXG4iIC4gJGhlcmVjdXJyKQorCQkJV0FSTigiU1RPUkFHRV9DTEFTUyIsCisJCQkgICAgICJzdG9yYWdlIGNsYXNzIHNob3VsZCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkZWNsYXJhdGlvblxuIiAuICRoZXJlY3VycikKIAkJfQogCiAjIGNoZWNrIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5saW5lIGF0dHJpYnV0ZSwgdGhhdCBpdCBpcyBiZXR3ZWVuCiAjIHN0b3JhZ2UgY2xhc3MgYW5kIHR5cGUuCiAJCWlmICgkbGluZSA9fiAvXGIkVHlwZVxzKyRJbmxpbmVcYi8gfHwKIAkJICAgICRsaW5lID1+IC9cYiRJbmxpbmVccyskU3RvcmFnZVxiLykgewotCQkJRVJST1IoImlubGluZSBrZXl3b3JkIHNob3VsZCBzaXQgYmV0d2VlbiBzdG9yYWdlIGNsYXNzIGFuZCB0eXBlXG4iIC4gJGhlcmVjdXJyKTsKKwkJCUVSUk9SKCJJTkxJTkVfTE9DQVRJT04iLAorCQkJICAgICAgImlubGluZSBrZXl3b3JkIHNob3VsZCBzaXQgYmV0d2VlbiBzdG9yYWdlIGNsYXNzIGFuZCB0eXBlXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIENoZWNrIGZvciBfX2lubGluZV9fIGFuZCBfX2lubGluZSwgcHJlZmVyIGlubGluZQogCQlpZiAoJGxpbmUgPX4gL1xiKF9faW5saW5lX198X19pbmxpbmUpXGIvKSB7Ci0JCQlXQVJOKCJwbGFpbiBpbmxpbmUgaXMgcHJlZmVycmVkIG92ZXIgJDFcbiIgLiAkaGVyZWN1cnIpOworCQkJV0FSTigiSU5MSU5FIiwKKwkJCSAgICAgInBsYWluIGlubGluZSBpcyBwcmVmZXJyZWQgb3ZlciAkMVxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBDaGVjayBmb3IgX19hdHRyaWJ1dGVfXyBwYWNrZWQsIHByZWZlciBfX3BhY2tlZAogCQlpZiAoJGxpbmUgPX4gL1xiX19hdHRyaWJ1dGVfX1xzKlwoXHMqXCguKlxicGFja2VkXGIvKSB7Ci0JCQlXQVJOKCJfX3BhY2tlZCBpcyBwcmVmZXJyZWQgb3ZlciBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKVxuIiAuICRoZXJlY3Vycik7CisJCQlXQVJOKCJQUkVGRVJfUEFDS0VEIiwKKwkJCSAgICAgIl9fcGFja2VkIGlzIHByZWZlcnJlZCBvdmVyIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpXG4iIC4gJGhlcmVjdXJyKTsKKwkJfQorCisjIENoZWNrIGZvciBfX2F0dHJpYnV0ZV9fIGFsaWduZWQsIHByZWZlciBfX2FsaWduZWQKKwkJaWYgKCRsaW5lID1+IC9cYl9fYXR0cmlidXRlX19ccypcKFxzKlwoLiphbGlnbmVkLykgeworCQkJV0FSTigiUFJFRkVSX0FMSUdORUQiLAorCQkJICAgICAiX19hbGlnbmVkKHNpemUpIGlzIHByZWZlcnJlZCBvdmVyIF9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZSkpKVxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBjaGVjayBmb3Igc2l6ZW9mKCYpCiAJCWlmICgkbGluZSA9fiAvXGJzaXplb2ZccypcKFxzKlwmLykgewotCQkJV0FSTigic2l6ZW9mKCYgc2hvdWxkIGJlIGF2b2lkZWRcbiIgLiAkaGVyZWN1cnIpOworCQkJV0FSTigiU0laRU9GX0FERFJFU1MiLAorCQkJICAgICAic2l6ZW9mKCYgc2hvdWxkIGJlIGF2b2lkZWRcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgY2hlY2sgZm9yIGxpbmUgY29udGludWF0aW9ucyBpbiBxdW90ZWQgc3RyaW5ncyB3aXRoIG9kZCBjb3VudHMgb2YgIgogCQlpZiAoJHJhd2xpbmUgPX4gL1xcJC8gJiYgJHJhd2xpbmUgPX4gdHIvIi8iLyAlIDIpIHsKLQkJCVdBUk4oIkF2b2lkIGxpbmUgY29udGludWF0aW9ucyBpbiBxdW90ZWQgc3RyaW5nc1xuIiAuICRoZXJlY3Vycik7CisJCQlXQVJOKCJMSU5FX0NPTlRJTlVBVElPTlMiLAorCQkJICAgICAiQXZvaWQgbGluZSBjb250aW51YXRpb25zIGluIHF1b3RlZCBzdHJpbmdzXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIGNoZWNrIGZvciBuZXcgZXh0ZXJucyBpbiAuYyBmaWxlcy4KQEAgLTI3NjcsMTcgKzMxMDAsMjAgQEAKIAkJCWlmICgkcyA9fiAvXlxzKjsvICYmCiAJCQkgICAgJGZ1bmN0aW9uX25hbWUgbmUgJ3VuaW5pdGlhbGl6ZWRfdmFyJykKIAkJCXsKLQkJCQlXQVJOKCJleHRlcm5zIHNob3VsZCBiZSBhdm9pZGVkIGluIC5jIGZpbGVzXG4iIC4gICRoZXJlY3Vycik7CisJCQkJV0FSTigiQVZPSURfRVhURVJOUyIsCisJCQkJICAgICAiZXh0ZXJucyBzaG91bGQgYmUgYXZvaWRlZCBpbiAuYyBmaWxlc1xuIiAuICAkaGVyZWN1cnIpOwogCQkJfQogCiAJCQlpZiAoJHBhcmVuX3NwYWNlID1+IC9cbi8pIHsKLQkJCQlXQVJOKCJhcmd1bWVudHMgZm9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBzaG91bGQgZm9sbG93IGlkZW50aWZpZXJcbiIgLiAkaGVyZWN1cnIpOworCQkJCVdBUk4oIkZVTkNUSU9OX0FSR1VNRU5UUyIsCisJCQkJICAgICAiYXJndW1lbnRzIGZvciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgc2hvdWxkIGZvbGxvdyBpZGVudGlmaWVyXG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAogCQl9IGVsc2lmICgkcmVhbGZpbGUgPX4gL1wuYyQvICYmIGRlZmluZWQgJHN0YXQgJiYKIAkJICAgICRzdGF0ID1+IC9eLlxzKmV4dGVyblxzKy8pCiAJCXsKLQkJCVdBUk4oImV4dGVybnMgc2hvdWxkIGJlIGF2b2lkZWQgaW4gLmMgZmlsZXNcbiIgLiAgJGhlcmVjdXJyKTsKKwkJCVdBUk4oIkFWT0lEX0VYVEVSTlMiLAorCQkJICAgICAiZXh0ZXJucyBzaG91bGQgYmUgYXZvaWRlZCBpbiAuYyBmaWxlc1xuIiAuICAkaGVyZWN1cnIpOwogCQl9CiAKICMgY2hlY2tzIGZvciBuZXcgX19zZXR1cCdzCkBAIC0yNzg1LDM3ICszMTIxLDQ0IEBACiAJCQlteSAkbmFtZSA9ICQxOwogCiAJCQlpZiAoIWdyZXAoLyRuYW1lLywgQHNldHVwX2RvY3MpKSB7Ci0JCQkJQ0hLKCJfX3NldHVwIGFwcGVhcnMgdW4tZG9jdW1lbnRlZCAtLSBjaGVjayBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dFxuIiAuICRoZXJlY3Vycik7CisJCQkJQ0hLKCJVTkRPQ1VNRU5URURfU0VUVVAiLAorCQkJCSAgICAiX19zZXR1cCBhcHBlYXJzIHVuLWRvY3VtZW50ZWQgLS0gY2hlY2sgRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHRcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKICMgY2hlY2sgZm9yIHBvaW50bGVzcyBjYXN0aW5nIG9mIGttYWxsb2MgcmV0dXJuCiAJCWlmICgkbGluZSA9fiAvXCpccypcKVxzKltrdl1bY3ptXWFsbG9jKF9ub2RlKXswLDF9XGIvKSB7Ci0JCQlXQVJOKCJ1bm5lY2Vzc2FyeSBjYXN0IG1heSBoaWRlIGJ1Z3MsIHNlZSBodHRwOi8vYy1mYXEuY29tL21hbGxvYy9tYWxsb2Nub2Nhc3QuaHRtbFxuIiAuICRoZXJlY3Vycik7CisJCQlXQVJOKCJVTk5FQ0VTU0FSWV9DQVNUUyIsCisJCQkgICAgICJ1bm5lY2Vzc2FyeSBjYXN0IG1heSBoaWRlIGJ1Z3MsIHNlZSBodHRwOi8vYy1mYXEuY29tL21hbGxvYy9tYWxsb2Nub2Nhc3QuaHRtbFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBjaGVjayBmb3IgbXVsdGlwbGUgc2VtaWNvbG9ucwogCQlpZiAoJGxpbmUgPX4gLztccyo7XHMqJC8pIHsKLQkJICAgIFdBUk4oIlN0YXRlbWVudHMgdGVybWluYXRpb25zIHVzZSAxIHNlbWljb2xvblxuIiAuICRoZXJlY3Vycik7CisJCSAgICBXQVJOKCJPTkVfU0VNSUNPTE9OIiwKKwkJCSAiU3RhdGVtZW50cyB0ZXJtaW5hdGlvbnMgdXNlIDEgc2VtaWNvbG9uXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIGNoZWNrIGZvciBnY2Mgc3BlY2lmaWMgX19GVU5DVElPTl9fCiAJCWlmICgkbGluZSA9fiAvX19GVU5DVElPTl9fLykgewotCQkJV0FSTigiX19mdW5jX18gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBnY2Mgc3BlY2lmaWMgX19GVU5DVElPTl9fXG4iICAuICRoZXJlY3Vycik7CisJCQlXQVJOKCJVU0VfRlVOQyIsCisJCQkgICAgICJfX2Z1bmNfXyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGdjYyBzcGVjaWZpYyBfX0ZVTkNUSU9OX19cbiIgIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIGNoZWNrIGZvciBzZW1hcGhvcmVzIGluaXRpYWxpemVkIGxvY2tlZAogCQlpZiAoJGxpbmUgPX4gL14uXHMqc2VtYV9pbml0LissXFc/MFxXP1wpLykgewotCQkJV0FSTigiY29uc2lkZXIgdXNpbmcgYSBjb21wbGV0aW9uXG4iIC4gJGhlcmVjdXJyKTsKKwkJCVdBUk4oIkNPTlNJREVSX0NPTVBMRVRJT04iLAorCQkJICAgICAiY29uc2lkZXIgdXNpbmcgYSBjb21wbGV0aW9uXG4iIC4gJGhlcmVjdXJyKTsKIAogCQl9CiAjIHJlY29tbWVuZCBrc3RydG8qIG92ZXIgc2ltcGxlX3N0cnRvKgogCQlpZiAoJGxpbmUgPX4gL1xic2ltcGxlXyhzdHJ0by4qPylccypcKC8pIHsKLQkJCVdBUk4oImNvbnNpZGVyIHVzaW5nIGtzdHJ0byogaW4gcHJlZmVyZW5jZSB0byBzaW1wbGVfJDFcbiIgLiAkaGVyZWN1cnIpOworCQkJV0FSTigiQ09OU0lERVJfS1NUUlRPIiwKKwkJCSAgICAgImNvbnNpZGVyIHVzaW5nIGtzdHJ0byogaW4gcHJlZmVyZW5jZSB0byBzaW1wbGVfJDFcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAjIGNoZWNrIGZvciBfX2luaXRjYWxsKCksIHVzZSBkZXZpY2VfaW5pdGNhbGwoKSBleHBsaWNpdGx5IHBsZWFzZQogCQlpZiAoJGxpbmUgPX4gL14uXHMqX19pbml0Y2FsbFxzKlwoLykgewotCQkJV0FSTigicGxlYXNlIHVzZSBkZXZpY2VfaW5pdGNhbGwoKSBpbnN0ZWFkIG9mIF9faW5pdGNhbGwoKVxuIiAuICRoZXJlY3Vycik7CisJCQlXQVJOKCJVU0VfREVWSUNFX0lOSVRDQUxMIiwKKwkJCSAgICAgInBsZWFzZSB1c2UgZGV2aWNlX2luaXRjYWxsKCkgaW5zdGVhZCBvZiBfX2luaXRjYWxsKClcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAjIGNoZWNrIGZvciB2YXJpb3VzIG9wcyBzdHJ1Y3RzLCBlbnN1cmUgdGhleSBhcmUgY29uc3QuCiAJCW15ICRzdHJ1Y3Rfb3BzID0gcXJ7YWNwaV9kb2NrX29wc3wKQEAgLTI4NTcsNyArMzIwMCw4IEBACiAJCQkJd2Rfb3BzfXg7CiAJCWlmICgkbGluZSAhfiAvXGJjb25zdFxiLyAmJgogCQkgICAgJGxpbmUgPX4gL1xic3RydWN0XHMrKCRzdHJ1Y3Rfb3BzKVxiLykgewotCQkJV0FSTigic3RydWN0ICQxIHNob3VsZCBub3JtYWxseSBiZSBjb25zdFxuIiAuCisJCQlXQVJOKCJDT05TVF9TVFJVQ1QiLAorCQkJICAgICAic3RydWN0ICQxIHNob3VsZCBub3JtYWxseSBiZSBjb25zdFxuIiAuCiAJCQkJJGhlcmVjdXJyKTsKIAkJfQogCkBAIC0yODcwLDcgKzMyMTQsOCBAQAogCQkgICAgJGxpbmUgIX4gL1xbW15cXV0qXC5cLlwuW15cXV0qTlJfQ1BVU1teXF1dKlxdLyAmJgogCQkgICAgJGxpbmUgIX4gL1xbW15cXV0qTlJfQ1BVU1teXF1dKlwuXC5cLlteXF1dKlxdLykKIAkJewotCQkJV0FSTigidXNhZ2Ugb2YgTlJfQ1BVUyBpcyBvZnRlbiB3cm9uZyAtIGNvbnNpZGVyIHVzaW5nIGNwdV9wb3NzaWJsZSgpLCBudW1fcG9zc2libGVfY3B1cygpLCBmb3JfZWFjaF9wb3NzaWJsZV9jcHUoKSwgZXRjXG4iIC4gJGhlcmVjdXJyKTsKKwkJCVdBUk4oIk5SX0NQVVMiLAorCQkJICAgICAidXNhZ2Ugb2YgTlJfQ1BVUyBpcyBvZnRlbiB3cm9uZyAtIGNvbnNpZGVyIHVzaW5nIGNwdV9wb3NzaWJsZSgpLCBudW1fcG9zc2libGVfY3B1cygpLCBmb3JfZWFjaF9wb3NzaWJsZV9jcHUoKSwgZXRjXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIGNoZWNrIGZvciAlTHt1LGQsaX0gaW4gc3RyaW5ncwpAQCAtMjg3OSw3ICszMjI0LDggQEAKIAkJCSRzdHJpbmcgPSBzdWJzdHIoJHJhd2xpbmUsICQtWzFdLCAkK1sxXSAtICQtWzFdKTsKIAkJCSRzdHJpbmcgPX4gcy8lJS9fXy9nOwogCQkJaWYgKCRzdHJpbmcgPX4gLyg/PCElKSVMW3VkaV0vKSB7Ci0JCQkJV0FSTigiXCVMZC8lTHUgYXJlIG5vdC1zdGFuZGFyZCBDLCB1c2UgJWxsZC8lbGx1XG4iIC4gJGhlcmVjdXJyKTsKKwkJCQlXQVJOKCJQUklOVEZfTCIsCisJCQkJICAgICAiXCVMZC8lTHUgYXJlIG5vdC1zdGFuZGFyZCBDLCB1c2UgJWxsZC8lbGx1XG4iIC4gJGhlcmVjdXJyKTsKIAkJCQlsYXN0OwogCQkJfQogCQl9CkBAIC0yODg3LDkgKzMyMzMsMTEgQEAKICMgd2hpbmUgbWlnaHRseSBhYm91dCBpbl9hdG9taWMKIAkJaWYgKCRsaW5lID1+IC9cYmluX2F0b21pY1xzKlwoLykgewogCQkJaWYgKCRyZWFsZmlsZSA9fiBtQF5kcml2ZXJzL0ApIHsKLQkJCQlFUlJPUigiZG8gbm90IHVzZSBpbl9hdG9taWMgaW4gZHJpdmVyc1xuIiAuICRoZXJlY3Vycik7CisJCQkJRVJST1IoIklOX0FUT01JQyIsCisJCQkJICAgICAgImRvIG5vdCB1c2UgaW5fYXRvbWljIGluIGRyaXZlcnNcbiIgLiAkaGVyZWN1cnIpOwogCQkJfSBlbHNpZiAoJHJlYWxmaWxlICF+IG1AXmtlcm5lbC9AKSB7Ci0JCQkJV0FSTigidXNlIG9mIGluX2F0b21pYygpIGlzIGluY29ycmVjdCBvdXRzaWRlIGNvcmUga2VybmVsIGNvZGVcbiIgLiAkaGVyZWN1cnIpOworCQkJCVdBUk4oIklOX0FUT01JQyIsCisJCQkJICAgICAidXNlIG9mIGluX2F0b21pYygpIGlzIGluY29ycmVjdCBvdXRzaWRlIGNvcmUga2VybmVsIGNvZGVcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKQEAgLTI4OTksMTggKzMyNDcsMjEgQEAKIAkJCWlmICgkcmVhbGZpbGUgIX4gbUBea2VybmVsL2xvY2tkZXBAICYmCiAJCQkgICAgJHJlYWxmaWxlICF+IG1AXmluY2x1ZGUvbGludXgvbG9ja2RlcEAgJiYKIAkJCSAgICAkcmVhbGZpbGUgIX4gbUBeZHJpdmVycy9iYXNlL2NvcmVAKSB7Ci0JCQkJRVJST1IoImxvY2tkZXBfbm9fdmFsaWRhdGUgY2xhc3MgaXMgcmVzZXJ2ZWQgZm9yIGRldmljZS0+bXV0ZXguXG4iIC4gJGhlcmVjdXJyKTsKKwkJCQlFUlJPUigiTE9DS0RFUCIsCisJCQkJICAgICAgImxvY2tkZXBfbm9fdmFsaWRhdGUgY2xhc3MgaXMgcmVzZXJ2ZWQgZm9yIGRldmljZS0+bXV0ZXguXG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCiAJCWlmICgkbGluZSA9fiAvZGVidWdmc19jcmVhdGVfZmlsZS4qU19JV1VHTy8gfHwKIAkJICAgICRsaW5lID1+IC9ERVZJQ0VfQVRUUi4qU19JV1VHTy8gKSB7Ci0JCQlXQVJOKCJFeHBvcnRpbmcgd29ybGQgd3JpdGFibGUgZmlsZXMgaXMgdXN1YWxseSBhbiBlcnJvci4gQ29uc2lkZXIgbW9yZSByZXN0cmljdGl2ZSBwZXJtaXNzaW9ucy5cbiIgLiAkaGVyZWN1cnIpOworCQkJV0FSTigiRVhQT1JURURfV09STERfV1JJVEFCTEUiLAorCQkJICAgICAiRXhwb3J0aW5nIHdvcmxkIHdyaXRhYmxlIGZpbGVzIGlzIHVzdWFsbHkgYW4gZXJyb3IuIENvbnNpZGVyIG1vcmUgcmVzdHJpY3RpdmUgcGVybWlzc2lvbnMuXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAJCSMgQ2hlY2sgZm9yIG1lbXNldCB3aXRoIHN3YXBwZWQgYXJndW1lbnRzCiAJCWlmICgkbGluZSA9fiAvbWVtc2V0LipcLChcIHwpKDB4fCkwKFwgfDB8KVwpOy8pIHsKLQkJCUVSUk9SKCJtZW1zZXQgc2l6ZSBpcyAzcmQgYXJndW1lbnQsIG5vdCB0aGUgc2Vjb25kLlxuIiAuICRoZXJlY3Vycik7CisJCQlFUlJPUigiTUVNU0VUIiwKKwkJCSAgICAgICJtZW1zZXQgc2l6ZSBpcyAzcmQgYXJndW1lbnQsIG5vdCB0aGUgc2Vjb25kLlxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAl9CiAKQEAgLTI5MzMsMTAgKzMyODQsMTIgQEAKIAl9CiAKIAlpZiAoISRpc19wYXRjaCkgewotCQlFUlJPUigiRG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdW5pZmllZC1kaWZmIGZvcm1hdCBwYXRjaFxuIik7CisJCUVSUk9SKCJOT1RfVU5JRklFRF9ESUZGIiwKKwkJICAgICAgIkRvZXMgbm90IGFwcGVhciB0byBiZSBhIHVuaWZpZWQtZGlmZiBmb3JtYXQgcGF0Y2hcbiIpOwogCX0KIAlpZiAoJGlzX3BhdGNoICYmICRjaGtfc2lnbm9mZiAmJiAkc2lnbm9mZiA9PSAwKSB7Ci0JCUVSUk9SKCJNaXNzaW5nIFNpZ25lZC1vZmYtYnk6IGxpbmUocylcbiIpOworCQlFUlJPUigiTUlTU0lOR19TSUdOX09GRiIsCisJCSAgICAgICJNaXNzaW5nIFNpZ25lZC1vZmYtYnk6IGxpbmUocylcbiIpOwogCX0KIAogCXByaW50IHJlcG9ydF9kdW1wKCk7CkBAIC0yOTU4LDEzICszMzExLDI1IEBACiAJCX0KIAl9CiAKKwlpZiAoa2V5cyAlaWdub3JlX3R5cGUpIHsKKwkgICAgcHJpbnQgIk5PVEU6IElnbm9yZWQgbWVzc2FnZSB0eXBlczoiOworCSAgICBmb3JlYWNoIG15ICRpZ25vcmUgKHNvcnQga2V5cyAlaWdub3JlX3R5cGUpIHsKKwkJcHJpbnQgIiAkaWdub3JlIjsKKwkgICAgfQorCSAgICBwcmludCAiXG4iOworCSAgICBwcmludCAiXG4iIGlmICgkcXVpZXQgPT0gMCk7CisJfQorCiAJaWYgKCRjbGVhbiA9PSAxICYmICRxdWlldCA9PSAwKSB7CiAJCXByaW50ICIkdm5hbWUgaGFzIG5vIG9idmlvdXMgc3R5bGUgcHJvYmxlbXMgYW5kIGlzIHJlYWR5IGZvciBzdWJtaXNzaW9uLlxuIgogCX0KIAlpZiAoJGNsZWFuID09IDAgJiYgJHF1aWV0ID09IDApIHsKLQkJcHJpbnQgIiR2bmFtZSBoYXMgc3R5bGUgcHJvYmxlbXMsIHBsZWFzZSByZXZpZXcuICBJZiBhbnkgb2YgdGhlc2UgZXJyb3JzXG4iOwotCQlwcmludCAiYXJlIGZhbHNlIHBvc2l0aXZlcyByZXBvcnQgdGhlbSB0byB0aGUgbWFpbnRhaW5lciwgc2VlXG4iOwotCQlwcmludCAiQ0hFQ0tQQVRDSCBpbiBNQUlOVEFJTkVSUy5cbiI7CisJCXByaW50IDw8ICJFT00iOworJHZuYW1lIGhhcyBzdHlsZSBwcm9ibGVtcywgcGxlYXNlIHJldmlldy4KKworSWYgYW55IG9mIHRoZXNlIGVycm9ycyBhcmUgZmFsc2UgcG9zaXRpdmVzLCBwbGVhc2UgcmVwb3J0Cit0aGVtIHRvIHRoZSBtYWludGFpbmVyLCBzZWUgQ0hFQ0tQQVRDSCBpbiBNQUlOVEFJTkVSUy4KK0VPTQogCX0KIAogCXJldHVybiAkY2xlYW47CmRpZmYgLS1naXQgYS9zY3JpcHRzL2RlcG1vZC5zaCBiL3NjcmlwdHMvZGVwbW9kLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEyNzIzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2RlcG1vZC5zaApAQCAtMCwwICsxLDUwIEBACisjIS9iaW4vc2gKKyMKKyMgQSBkZXBtb2Qgd3JhcHBlciB1c2VkIGJ5IHRoZSB0b3BsZXZlbCBNYWtlZmlsZQorCitpZiB0ZXN0ICQjIC1uZSAyOyB0aGVuCisJZWNobyAiVXNhZ2U6ICQwIC9zYmluL2RlcG1vZCA8a2VybmVscmVsZWFzZT4iID4mMgorCWV4aXQgMQorZmkKK0RFUE1PRD0kMQorS0VSTkVMUkVMRUFTRT0kMgorCitpZiAhICIkREVQTU9EIiAtViAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgbW9kdWxlLWluaXQtdG9vbHM7IHRoZW4KKwllY2hvICJXYXJuaW5nOiB5b3UgbWF5IG5lZWQgdG8gaW5zdGFsbCBtb2R1bGUtaW5pdC10b29scyIgPiYyCisJZWNobyAiU2VlIGh0dHA6Ly93d3cuY29kZW1vbmtleS5vcmcudWsvZG9jcy9wb3N0LWhhbGxvd2Vlbi0yLjYudHh0IiA+JjIKKwlzbGVlcCAxCitmaQorCitpZiAhIHRlc3QgLXIgU3lzdGVtLm1hcCAtYSAteCAiJERFUE1PRCI7IHRoZW4KKwlleGl0IDAKK2ZpCisjIG9sZGVyIHZlcnNpb25zIG9mIGRlcG1vZCByZXF1aXJlIHRoZSB2ZXJzaW9uIHN0cmluZyB0byBzdGFydCB3aXRoIHRocmVlCisjIG51bWJlcnMsIHNvIHdlIGNoZWF0IHdpdGggYSBzeW1saW5rIGhlcmUKK2RlcG1vZF9oYWNrX25lZWRlZD10cnVlCit0bXBfZGlyPSQobWt0ZW1wIC1kICR7VE1QRElSOi0vdG1wfS9kZXBtb2QuWFhYWFhYKQorbWtkaXIgLXAgIiR0bXBfZGlyL2xpYi9tb2R1bGVzLyRLRVJORUxSRUxFQVNFIgoraWYgIiRERVBNT0QiIC1iICIkdG1wX2RpciIgJEtFUk5FTFJFTEVBU0UgMj4vZGV2L251bGw7IHRoZW4KKwlpZiB0ZXN0IC1lICIkdG1wX2Rpci9saWIvbW9kdWxlcy8kS0VSTkVMUkVMRUFTRS9tb2R1bGVzLmRlcCIgLW8gXAorCQktZSAiJHRtcF9kaXIvbGliL21vZHVsZXMvJEtFUk5FTFJFTEVBU0UvbW9kdWxlcy5kZXAuYmluIjsgdGhlbgorCQlkZXBtb2RfaGFja19uZWVkZWQ9ZmFsc2UKKwlmaQorZmkKK3JtIC1yZiAiJHRtcF9kaXIiCitpZiAkZGVwbW9kX2hhY2tfbmVlZGVkOyB0aGVuCisJc3ltbGluaz0iJElOU1RBTExfTU9EX1BBVEgvbGliL21vZHVsZXMvOTkuOTguJEtFUk5FTFJFTEVBU0UiCisJbG4gLXMgIiRLRVJORUxSRUxFQVNFIiAiJHN5bWxpbmsiCisJS0VSTkVMUkVMRUFTRT05OS45OC4kS0VSTkVMUkVMRUFTRQorZmkKKworc2V0IC0tIC1hZSAtRiBTeXN0ZW0ubWFwCitpZiB0ZXN0IC1uICIkSU5TVEFMTF9NT0RfUEFUSCI7IHRoZW4KKwlzZXQgLS0gIiRAIiAtYiAiJElOU1RBTExfTU9EX1BBVEgiCitmaQorIiRERVBNT0QiICIkQCIgIiRLRVJORUxSRUxFQVNFIgorcmV0PSQ/CisKK2lmICRkZXBtb2RfaGFja19uZWVkZWQ7IHRoZW4KKwlybSAtZiAiJHN5bWxpbmsiCitmaQorCitleGl0ICRyZXQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZG9jcHJvYy5jIGIvc2NyaXB0cy9kb2Nwcm9jLmMKaW5kZXggOThkZWM4Ny4uNGNmZGMxNyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kb2Nwcm9jLmMKKysrIGIvc2NyaXB0cy9kb2Nwcm9jLmMKQEAgLTIwNSw4ICsyMDUsNyBAQAogCQkJCVBBVEhfTUFYIC0gc3RybGVuKHJlYWxfZmlsZW5hbWUpKTsKIAkJc3ltID0gYWRkX25ld19maWxlKGZpbGVuYW1lKTsKIAkJZnAgPSBmb3BlbihyZWFsX2ZpbGVuYW1lLCAiciIpOwotCQlpZiAoZnAgPT0gTlVMTCkKLQkJeworCQlpZiAoZnAgPT0gTlVMTCkJewogCQkJZnByaW50ZihzdGRlcnIsICJkb2Nwcm9jOiAiKTsKIAkJCXBlcnJvcihyZWFsX2ZpbGVuYW1lKTsKIAkJCWV4aXQoMSk7CkBAIC00ODcsOCArNDg2LDcgQEAKIAkJCQlkZWZhdWx0OgogCQkJCQlkZWZhdWx0bGluZShsaW5lKTsKIAkJCX0KLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCWRlZmF1bHRsaW5lKGxpbmUpOwogCQl9CiAJfQpAQCAtNTE5LDggKzUxNyw3IEBACiAgICAgICAgICAgICAgICAgZXhpdCgyKTsKICAgICAgICAgfQogCi0JaWYgKHN0cmNtcCgiZG9jIiwgYXJndlsxXSkgPT0gMCkKLQl7CisJaWYgKHN0cmNtcCgiZG9jIiwgYXJndlsxXSkgPT0gMCkgewogCQkvKiBOZWVkIHRvIGRvIHRoaXMgaW4gdHdvIHBhc3Nlcy4KIAkJICogRmlyc3QgcGFzcyBpcyB1c2VkIHRvIGNvbGxlY3QgYWxsIHN5bWJvbHMgZXhwb3J0ZWQKIAkJICogaW4gdGhlIHZhcmlvdXMgZmlsZXM7CkBAIC01NTYsOSArNTUzLDcgQEAKIAkJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogZGlkbid0IHVzZSBkb2NzIGZvciAlc1xuIiwKIAkJCQlhbGxfbGlzdFtpXSk7CiAJCX0KLQl9Ci0JZWxzZSBpZiAoc3RyY21wKCJkZXBlbmQiLCBhcmd2WzFdKSA9PSAwKQotCXsKKwl9IGVsc2UgaWYgKHN0cmNtcCgiZGVwZW5kIiwgYXJndlsxXSkgPT0gMCkgewogCQkvKiBDcmVhdGUgZmlyc3QgcGFydCBvZiBkZXBlbmRlbmN5IGNoYWluCiAJCSAqIGZpbGUudG1wbCAqLwogCQlwcmludGYoIiVzXHQiLCBhcmd2WzJdKTsKQEAgLTU3MSw5ICs1NjYsNyBAQAogCQlmaW5kYWxsICAgICAgICAgICA9IGFkZGRlcDsKIAkJcGFyc2VfZmlsZShpbmZpbGUpOwogCQlwcmludGYoIlxuIik7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIG9wdGlvbjogJXNcbiIsIGFyZ3ZbMV0pOwogCQlleGl0KDEpOwogCX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL01ha2VmaWxlIGIvc2NyaXB0cy9kdGMvTWFrZWZpbGUKaW5kZXggMDRhMzFjMS4uNmQxYzZiYiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9kdGMvTWFrZWZpbGUKQEAgLTI1LDMxICsyNSw1IEBACiBIT1NUQ0ZMQUdTX2R0Yy1wYXJzZXIudGFiLm8gOj0gJChIT1NUQ0ZMQUdTX0RUQykKIAogIyBkZXBlbmRlbmNpZXMgb24gZ2VuZXJhdGVkIGZpbGVzIG5lZWQgdG8gYmUgbGlzdGVkIGV4cGxpY2l0bHkKLSQob2JqKS9kdGMtcGFyc2VyLnRhYi5vOiAkKG9iaikvZHRjLXBhcnNlci50YWIuYyAkKG9iaikvZHRjLXBhcnNlci50YWIuaAotJChvYmopL2R0Yy1sZXhlci5sZXgubzogICQob2JqKS9kdGMtbGV4ZXIubGV4LmMgJChvYmopL2R0Yy1wYXJzZXIudGFiLmgKKyQob2JqKS9kdGMtbGV4ZXIubGV4Lm86ICQob2JqKS9kdGMtcGFyc2VyLnRhYi5oCiAKLXRhcmdldHMgKz0gZHRjLXBhcnNlci50YWIuYyBkdGMtbGV4ZXIubGV4LmMKLQotY2xlYW4tZmlsZXMgKz0gZHRjLXBhcnNlci50YWIuaAotCi0jIEdFTkVSQVRFX1BBUlNFUiA6PSAxCQkjIFVuY29tbWVudCB0byByZWJ1aWxkIGZsZXgvYmlzb24gb3V0cHV0Ci0KLWlmZGVmIEdFTkVSQVRFX1BBUlNFUgotCi1CSVNPTiA9IGJpc29uCi1GTEVYID0gZmxleAotCi1xdWlldF9jbWRfYmlzb24gPSBCSVNPTiAgICRACi0gICAgICBjbWRfYmlzb24gPSAkKEJJU09OKSAtbyRAIC1kICQ8OyBjcCAkQCAkQF9zaGlwcGVkCi1xdWlldF9jbWRfZmxleCA9IEZMRVggICAgJEAKLSAgICAgIGNtZF9mbGV4ID0gJChGTEVYKSAtbyRAICQ8OyBjcCAkQCAkQF9zaGlwcGVkCi0KLSQob2JqKS9kdGMtcGFyc2VyLnRhYi5jOiAkKHNyYykvZHRjLXBhcnNlci55IEZPUkNFCi0gICAgICAgICQoY2FsbCBpZl9jaGFuZ2VkLGJpc29uKQotCi0kKG9iaikvZHRjLXBhcnNlci50YWIuaDogJChvYmopL2R0Yy1wYXJzZXIudGFiLmMKLQotJChvYmopL2R0Yy1sZXhlci5sZXguYzogJChzcmMpL2R0Yy1sZXhlci5sIEZPUkNFCi0gICAgICAgICQoY2FsbCBpZl9jaGFuZ2VkLGZsZXgpCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9kdGMtbGV4ZXIubGV4LmNfc2hpcHBlZCBiL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sZXguY19zaGlwcGVkCmluZGV4IDUwYzQ0MjAuLjhiYmUxMjggMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sZXguY19zaGlwcGVkCisrKyBiL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sZXguY19zaGlwcGVkCkBAIC0xLDYgKzEsNSBAQAotI2xpbmUgMiAiZHRjLWxleGVyLmxleC5jIgogCi0jbGluZSA0ICJkdGMtbGV4ZXIubGV4LmMiCisjbGluZSAzICJzY3JpcHRzL2R0Yy9kdGMtbGV4ZXIubGV4LmNfc2hpcHBlZCIKIAogI2RlZmluZSAgWVlfSU5UX0FMSUdORUQgc2hvcnQgaW50CiAKQEAgLTU0LDYgKzUzLDcgQEAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciBmbGV4X3VpbnQ4X3Q7IAogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgZmxleF91aW50MTZfdDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IGZsZXhfdWludDMyX3Q7CisjZW5kaWYgLyogISBDOTkgKi8KIAogLyogTGltaXRzIG9mIGludGVncmFsIHR5cGVzLiAqLwogI2lmbmRlZiBJTlQ4X01JTgpAQCAtODQsOCArODQsNiBAQAogI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VSkKICNlbmRpZgogCi0jZW5kaWYgLyogISBDOTkgKi8KLQogI2VuZGlmIC8qICEgRkxFWElOVF9IICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtMTQyLDE1ICsxNDAsNyBAQAogCiAvKiBTaXplIG9mIGRlZmF1bHQgaW5wdXQgYnVmZmVyLiAqLwogI2lmbmRlZiBZWV9CVUZfU0laRQotI2lmZGVmIF9faWE2NF9fCi0vKiBPbiBJQS02NCwgdGhlIGJ1ZmZlciBzaXplIGlzIDE2aywgbm90IDhrLgotICogTW9yZW92ZXIsIFlZX0JVRl9TSVpFIGlzIDIqWVlfUkVBRF9CVUZfU0laRSBpbiB0aGUgZ2VuZXJhbCBjYXNlLgotICogRGl0dG8gZm9yIHRoZSBfX2lhNjRfXyBjYXNlIGFjY29yZGluZ2x5LgotICovCi0jZGVmaW5lIFlZX0JVRl9TSVpFIDMyNzY4Ci0jZWxzZQogI2RlZmluZSBZWV9CVUZfU0laRSAxNjM4NAotI2VuZGlmIC8qIF9faWE2NF9fICovCiAjZW5kaWYKIAogLyogVGhlIHN0YXRlIGJ1ZiBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIG9uZSBzdGF0ZSBwZXIgY2hhcmFjdGVyIGluIHRoZSBtYWluIGJ1ZmZlci4KQEAgLTU1MCw3ICs1NDAsNiBAQAogI2RlZmluZSBZWV9NT1JFX0FESiAwCiAjZGVmaW5lIFlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKIGNoYXIgKnl5dGV4dDsKLSNsaW5lIDEgImR0Yy1sZXhlci5sIgogLyoKICAqIChDKSBDb3B5cmlnaHQgRGF2aWQgR2lic29uIDxkd2dAYXUxLmlibS5jb20+LCBJQk0gQ29ycG9yYXRpb24uICAyMDA1LgogICoKQEAgLTU3MiwxMCArNTYxLDYgQEAKICAqLwogI2RlZmluZSBZWV9OT19JTlBVVCAxCiAKLQotCi0KLSNsaW5lIDM3ICJkdGMtbGV4ZXIubCIKICNpbmNsdWRlICJkdGMuaCIKICNpbmNsdWRlICJzcmNwb3MuaCIKICNpbmNsdWRlICJkdGMtcGFyc2VyLnRhYi5oIgpAQCAtNjAzLDcgKzU4OCw2IEBACiAKIHN0YXRpYyB2b2lkIHB1c2hfaW5wdXRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CiBzdGF0aWMgaW50IHBvcF9pbnB1dF9maWxlKHZvaWQpOwotI2xpbmUgNjA3ICJkdGMtbGV4ZXIubGV4LmMiCiAKICNkZWZpbmUgSU5JVElBTCAwCiAjZGVmaW5lIElOQ0xVREUgMQpAQCAtNjg2LDEyICs2NzAsNyBAQAogCiAvKiBBbW91bnQgb2Ygc3R1ZmYgdG8gc2x1cnAgdXAgd2l0aCBlYWNoIHJlYWQuICovCiAjaWZuZGVmIFlZX1JFQURfQlVGX1NJWkUKLSNpZmRlZiBfX2lhNjRfXwotLyogT24gSUEtNjQsIHRoZSBidWZmZXIgc2l6ZSBpcyAxNmssIG5vdCA4ayAqLwotI2RlZmluZSBZWV9SRUFEX0JVRl9TSVpFIDE2Mzg0Ci0jZWxzZQogI2RlZmluZSBZWV9SRUFEX0JVRl9TSVpFIDgxOTIKLSNlbmRpZiAvKiBfX2lhNjRfXyAqLwogI2VuZGlmCiAKIC8qIENvcHkgd2hhdGV2ZXIgdGhlIGxhc3QgcnVsZSBtYXRjaGVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuICovCkBAIC03MTAsNyArNjg5LDcgQEAKIAlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaXNfaW50ZXJhY3RpdmUgKSBcCiAJCXsgXAogCQlpbnQgYyA9ICcqJzsgXAotCQlzaXplX3QgbjsgXAorCQl1bnNpZ25lZCBuOyBcCiAJCWZvciAoIG4gPSAwOyBuIDwgbWF4X3NpemUgJiYgXAogCQkJICAgICAoYyA9IGdldGMoIHl5aW4gKSkgIT0gRU9GICYmIGMgIT0gJ1xuJzsgKytuICkgXAogCQkJYnVmW25dID0gKGNoYXIpIGM7IFwKQEAgLTc5MiwxMCArNzcxLDYgQEAKIAlyZWdpc3RlciBjaGFyICp5eV9jcCwgKnl5X2JwOwogCXJlZ2lzdGVyIGludCB5eV9hY3Q7CiAgICAgCi0jbGluZSA2NiAiZHRjLWxleGVyLmwiCi0KLSNsaW5lIDc5OCAiZHRjLWxleGVyLmxleC5jIgotCiAJaWYgKCAhKHl5X2luaXQpICkKIAkJewogCQkoeXlfaW5pdCkgPSAxOwpAQCAtODc2LDcgKzg1MSw2IEBACiBjYXNlIDE6CiAvKiBydWxlIDEgY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAotI2xpbmUgNjcgImR0Yy1sZXhlci5sIgogewogCQkJY2hhciAqbmFtZSA9IHN0cmNocih5eXRleHQsICdcIicpICsgMTsKIAkJCXl5dGV4dFt5eWxlbmctMV0gPSAnXDAnOwpAQCAtODg4LDcgKzg2Miw2IEBACiBjYXNlIFlZX1NUQVRFX0VPRihCWVRFU1RSSU5HKToKIGNhc2UgWVlfU1RBVEVfRU9GKFBST1BOT0RFTkFNRSk6CiBjYXNlIFlZX1NUQVRFX0VPRihWMSk6Ci0jbGluZSA3MyAiZHRjLWxleGVyLmwiCiB7CiAJCQlpZiAoIXBvcF9pbnB1dF9maWxlKCkpIHsKIAkJCQl5eXRlcm1pbmF0ZSgpOwpAQCAtODk4LDcgKzg3MSw2IEBACiBjYXNlIDI6CiAvKiBydWxlIDIgY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAotI2xpbmUgNzkgImR0Yy1sZXhlci5sIgogewogCQkJRFBSSU5UKCJTdHJpbmc6ICVzXG4iLCB5eXRleHQpOwogCQkJeXlsdmFsLmRhdGEgPSBkYXRhX2NvcHlfZXNjYXBlX3N0cmluZyh5eXRleHQrMSwKQEAgLTkwOCw3ICs4ODAsNiBAQAogCVlZX0JSRUFLCiBjYXNlIDM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSA4NiAiZHRjLWxleGVyLmwiCiB7CiAJCQlEUFJJTlQoIktleXdvcmQ6IC9kdHMtdjEvXG4iKTsKIAkJCWR0c192ZXJzaW9uID0gMTsKQEAgLTkxOCw3ICs4ODksNiBAQAogCVlZX0JSRUFLCiBjYXNlIDQ6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSA5MyAiZHRjLWxleGVyLmwiCiB7CiAJCQlEUFJJTlQoIktleXdvcmQ6IC9tZW1yZXNlcnZlL1xuIik7CiAJCQlCRUdJTl9ERUZBVUxUKCk7CkBAIC05MjcsNyArODk3LDYgQEAKIAlZWV9CUkVBSwogY2FzZSA1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgOTkgImR0Yy1sZXhlci5sIgogewogCQkJRFBSSU5UKCJMYWJlbDogJXNcbiIsIHl5dGV4dCk7CiAJCQl5eWx2YWwubGFiZWxyZWYgPSB4c3RyZHVwKHl5dGV4dCk7CkBAIC05MzcsNyArOTA2LDYgQEAKIAlZWV9CUkVBSwogY2FzZSA2OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTA2ICJkdGMtbGV4ZXIubCIKIHsKIAkJCXl5bHZhbC5saXRlcmFsID0geHN0cmR1cCh5eXRleHQpOwogCQkJRFBSSU5UKCJMaXRlcmFsOiAnJXMnXG4iLCB5eWx2YWwubGl0ZXJhbCk7CkBAIC05NDYsNyArOTE0LDYgQEAKIAlZWV9CUkVBSwogY2FzZSA3OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTEyICJkdGMtbGV4ZXIubCIKIHsJLyogbGFiZWwgcmVmZXJlbmNlICovCiAJCQlEUFJJTlQoIlJlZjogJXNcbiIsIHl5dGV4dCsxKTsKIAkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KzEpOwpAQCAtOTU1LDcgKzkyMiw2IEBACiAJWVlfQlJFQUsKIGNhc2UgODoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDExOCAiZHRjLWxleGVyLmwiCiB7CS8qIG5ldy1zdHlsZSBwYXRoIHJlZmVyZW5jZSAqLwogCQkJeXl0ZXh0W3l5bGVuZy0xXSA9ICdcMCc7CiAJCQlEUFJJTlQoIlJlZjogJXNcbiIsIHl5dGV4dCsyKTsKQEAgLTk2NSw3ICs5MzEsNiBAQAogCVlZX0JSRUFLCiBjYXNlIDk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxMjUgImR0Yy1sZXhlci5sIgogewogCQkJeXlsdmFsLmJ5dGUgPSBzdHJ0b2woeXl0ZXh0LCBOVUxMLCAxNik7CiAJCQlEUFJJTlQoIkJ5dGU6ICUwMnhcbiIsIChpbnQpeXlsdmFsLmJ5dGUpOwpAQCAtOTc0LDcgKzkzOSw2IEBACiAJWVlfQlJFQUsKIGNhc2UgMTA6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxMzEgImR0Yy1sZXhlci5sIgogewogCQkJRFBSSU5UKCIvQllURVNUUklOR1xuIik7CiAJCQlCRUdJTl9ERUZBVUxUKCk7CkBAIC05ODMsNyArOTQ3LDYgQEAKIAlZWV9CUkVBSwogY2FzZSAxMToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDEzNyAiZHRjLWxleGVyLmwiCiB7CiAJCQlEUFJJTlQoIlByb3BOb2RlTmFtZTogJXNcbiIsIHl5dGV4dCk7CiAJCQl5eWx2YWwucHJvcG5vZGVuYW1lID0geHN0cmR1cCh5eXRleHQpOwpAQCAtOTkzLDcgKzk1Niw2IEBACiAJWVlfQlJFQUsKIGNhc2UgMTI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNDQgImR0Yy1sZXhlci5sIgogewogCQkJRFBSSU5UKCJCaW5hcnkgSW5jbHVkZVxuIik7CiAJCQlyZXR1cm4gRFRfSU5DQklOOwpAQCAtMTAwMiwyNCArOTY0LDIwIEBACiBjYXNlIDEzOgogLyogcnVsZSAxMyBjYW4gbWF0Y2ggZW9sICovCiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNDkgImR0Yy1sZXhlci5sIgogLyogZWF0IHdoaXRlc3BhY2UgKi8KIAlZWV9CUkVBSwogY2FzZSAxNDoKIC8qIHJ1bGUgMTQgY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTUwICJkdGMtbGV4ZXIubCIKIC8qIGVhdCBDLXN0eWxlIGNvbW1lbnRzICovCiAJWVlfQlJFQUsKIGNhc2UgMTU6CiAvKiBydWxlIDE1IGNhbiBtYXRjaCBlb2wgKi8KIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE1MSAiZHRjLWxleGVyLmwiCiAvKiBlYXQgQysrLXN0eWxlIGNvbW1lbnRzICovCiAJWVlfQlJFQUsKIGNhc2UgMTY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNTMgImR0Yy1sZXhlci5sIgogewogCQkJRFBSSU5UKCJDaGFyOiAlYyAoXFx4JTAyeClcbiIsIHl5dGV4dFswXSwKIAkJCQkodW5zaWduZWQpeXl0ZXh0WzBdKTsKQEAgLTEwMzcsMTAgKzk5NSw4IEBACiAJWVlfQlJFQUsKIGNhc2UgMTc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNjggImR0Yy1sZXhlci5sIgogRUNITzsKIAlZWV9CUkVBSwotI2xpbmUgMTA0NCAiZHRjLWxleGVyLmxleC5jIgogCiAJY2FzZSBZWV9FTkRfT0ZfQlVGRkVSOgogCQl7CkBAIC0xNzU2LDggKzE3MTIsOCBAQAogCiAvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIHRoZSBnaXZlbiBieXRlcy4gVGhlIG5leHQgY2FsbCB0byB5eWxleCgpIHdpbGwKICAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgYnl0ZXMuCi0gKiBAcGFyYW0geXlieXRlcyB0aGUgYnl0ZSBidWZmZXIgdG8gc2NhbgotICogQHBhcmFtIF95eWJ5dGVzX2xlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBAYSBieXRlcy4KKyAqIEBwYXJhbSBieXRlcyB0aGUgYnl0ZSBidWZmZXIgdG8gc2NhbgorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBAYSBieXRlcy4KICAqIAogICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuCiAgKi8KQEAgLTE5OTYsMTAgKzE5NTIsNiBAQAogCiAjZGVmaW5lIFlZVEFCTEVTX05BTUUgInl5dGFibGVzIgogCi0jbGluZSAxNjggImR0Yy1sZXhlci5sIgotCi0KLQogc3RhdGljIHZvaWQgcHVzaF9pbnB1dF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewogCWFzc2VydChmaWxlbmFtZSk7CkBAIC0yMDExLDcgKzE5NjMsNiBAQAogCXl5cHVzaF9idWZmZXJfc3RhdGUoeXlfY3JlYXRlX2J1ZmZlcih5eWluLFlZX0JVRl9TSVpFKSk7CiB9CiAKLQogc3RhdGljIGludCBwb3BfaW5wdXRfZmlsZSh2b2lkKQogewogCWlmIChzcmNmaWxlX3BvcCgpID09IDApCmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnRhYi5jX3NoaXBwZWQgYi9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnRhYi5jX3NoaXBwZWQKaW5kZXggOWJlMmVlYS4uYjA1OTIxZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci50YWIuY19zaGlwcGVkCisrKyBiL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIudGFiLmNfc2hpcHBlZApAQCAtMSwxMCArMSw5IEBACi0KLS8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjQuMS4gICovCisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjMuICAqLwogCiAvKiBTa2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCiAgICAKLSAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisgICAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICAgCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ2LDcgKzQ1LDcgQEAKICNkZWZpbmUgWVlCSVNPTiAxCiAKIC8qIEJpc29uIHZlcnNpb24uICAqLwotI2RlZmluZSBZWUJJU09OX1ZFUlNJT04gIjIuNC4xIgorI2RlZmluZSBZWUJJU09OX1ZFUlNJT04gIjIuNC4zIgogCiAvKiBTa2VsZXRvbiBuYW1lLiAgKi8KICNkZWZpbmUgWVlTS0VMRVRPTl9OQU1FICJ5YWNjLmMiCkBAIC02Nyw4ICs2Niw2IEBACiAKIC8qIENvcHkgdGhlIGZpcnN0IHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLwogCi0vKiBMaW5lIDE4OSBvZiB5YWNjLmMgICovCi0jbGluZSAyMSAiZHRjLXBhcnNlci55IgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIApAQCAtODcsMTIgKzg0LDEwIEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGV2YWxfbGl0ZXJhbChjb25zdCBjaGFyICpzLCBpbnQgYmFzZSwgaW50IGJpdHMpOwogCiAKLS8qIExpbmUgMTg5IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDkyICJkdGMtcGFyc2VyLnRhYi5jIgogCiAvKiBFbmFibGluZyB0cmFjZXMuICAqLwogI2lmbmRlZiBZWURFQlVHCi0jIGRlZmluZSBZWURFQlVHIDAKKyMgZGVmaW5lIFlZREVCVUcgMQogI2VuZGlmCiAKIC8qIEVuYWJsaW5nIHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMuICAqLwpAQCAtMTM0LDggKzEyOSw2IEBACiB0eXBlZGVmIHVuaW9uIFlZU1RZUEUKIHsKIAotLyogTGluZSAyMTQgb2YgeWFjYy5jICAqLwotI2xpbmUgMzkgImR0Yy1wYXJzZXIueSIKIAogCWNoYXIgKnByb3Bub2RlbmFtZTsKIAljaGFyICpsaXRlcmFsOwpAQCAtMTU0LDggKzE0Nyw2IEBACiAKIAogCi0vKiBMaW5lIDIxNCBvZiB5YWNjLmMgICovCi0jbGluZSAxNTkgImR0Yy1wYXJzZXIudGFiLmMiCiB9IFlZU1RZUEU7CiAjIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQogIyBkZWZpbmUgeXlzdHlwZSBZWVNUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLwpAQCAtMTY2LDggKzE1Nyw2IEBACiAvKiBDb3B5IHRoZSBzZWNvbmQgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCiAKIAotLyogTGluZSAyNjQgb2YgeWFjYy5jICAqLwotI2xpbmUgMTcxICJkdGMtcGFyc2VyLnRhYi5jIgogCiAjaWZkZWYgc2hvcnQKICMgdW5kZWYgc2hvcnQKQEAgLTIxNyw3ICsyMDYsNyBAQAogI2RlZmluZSBZWVNJWkVfTUFYSU1VTSAoKFlZU0laRV9UKSAtMSkKIAogI2lmbmRlZiBZWV8KLSMgaWYgWVlFTkFCTEVfTkxTCisjIGlmIGRlZmluZWQgWVlFTkFCTEVfTkxTICYmIFlZRU5BQkxFX05MUwogIyAgaWYgRU5BQkxFX05MUwogIyAgIGluY2x1ZGUgPGxpYmludGwuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwogIyAgIGRlZmluZSBZWV8obXNnaWQpIGRnZXR0ZXh0ICgiYmlzb24tcnVudGltZSIsIG1zZ2lkKQpAQCAtNjA3LDkgKzU5NiwxOCBAQAogCiAvKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4gIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5CiAgICB0byBlYXNlIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgotICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLworICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICBIb3dldmVyLAorICAgWVlGQUlMIGFwcGVhcnMgdG8gYmUgaW4gdXNlLiAgTmV2ZXJ0aGVsZXNzLCBpdCBpcyBmb3JtYWxseSBkZXByZWNhdGVkCisgICBpbiBCaXNvbiAyLjQuMidzIE5FV1MgZW50cnksIHdoZXJlIGEgcGxhbiB0byBwaGFzZSBpdCBvdXQgaXMKKyAgIGRpc2N1c3NlZC4gICovCiAKICNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCisjaWYgZGVmaW5lZCBZWUZBSUwKKyAgLyogVGhpcyBpcyBoZXJlIHRvIHN1cHByZXNzIHdhcm5pbmdzIGZyb20gdGhlIEdDQyBjcHAncworICAgICAtV3VudXNlZC1tYWNyb3MuICBOb3JtYWxseSB3ZSBkb24ndCB3b3JyeSBhYm91dCB0aGF0IHdhcm5pbmcsIGJ1dAorICAgICBzb21lIHVzZXJzIGRvLCBhbmQgd2Ugd2FudCB0byBtYWtlIGl0IGVhc3kgZm9yIHVzZXJzIHRvIHJlbW92ZQorICAgICBZWUZBSUwgdXNlcywgd2hpY2ggd2lsbCBwcm9kdWNlIHdhcm5pbmdzIGZyb20gQmlzb24gMi41LiAgKi8KKyNlbmRpZgogCiAjZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKIApAQCAtNjY2LDcgKzY2NCw3IEBACiAgICB3ZSB3b24ndCBicmVhayB1c2VyIGNvZGU6IHdoZW4gdGhlc2UgYXJlIHRoZSBsb2NhdGlvbnMgd2Uga25vdy4gICovCiAKICNpZm5kZWYgWVlfTE9DQVRJT05fUFJJTlQKLSMgaWYgWVlMVFlQRV9JU19UUklWSUFMCisjIGlmIGRlZmluZWQgWVlMVFlQRV9JU19UUklWSUFMICYmIFlZTFRZUEVfSVNfVFJJVklBTAogIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykJCQlcCiAgICAgIGZwcmludGYgKEZpbGUsICIlZC4lZC0lZC4lZCIsCQkJXAogCSAgICAgIChMb2MpLmZpcnN0X2xpbmUsIChMb2MpLmZpcnN0X2NvbHVtbiwJXApAQCAtMTQwNSw4ICsxNDAzLDYgQEAKICAgICB7CiAgICAgICAgIGNhc2UgMjoKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDg3ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJdGhlX2Jvb3RfaW5mbyA9IGJ1aWxkX2Jvb3RfaW5mbygoeXl2c3BbKDMpIC0gKDQpXS5yZSksICh5eXZzcFsoNCkgLSAoNCldLm5vZGUpLAogCQkJCQkJCWd1ZXNzX2Jvb3RfY3B1aWQoKHl5dnNwWyg0KSAtICg0KV0ubm9kZSkpKTsKQEAgLTE0MTUsOCArMTQxMSw2IEBACiAKICAgY2FzZSAzOgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgOTUgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwucmUpID0gTlVMTDsKIAkJO30KQEAgLTE0MjQsOCArMTQxOCw2IEBACiAKICAgY2FzZSA0OgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgOTkgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwucmUpID0gY2hhaW5fcmVzZXJ2ZV9lbnRyeSgoeXl2c3BbKDEpIC0gKDIpXS5yZSksICh5eXZzcFsoMikgLSAoMildLnJlKSk7CiAJCTt9CkBAIC0xNDMzLDggKzE0MjUsNiBAQAogCiAgIGNhc2UgNToKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDEwNiAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5yZSkgPSBidWlsZF9yZXNlcnZlX2VudHJ5KCh5eXZzcFsoMikgLSAoNCldLmFkZHIpLCAoeXl2c3BbKDMpIC0gKDQpXS5hZGRyKSk7CiAJCTt9CkBAIC0xNDQyLDggKzE0MzIsNiBAQAogCiAgIGNhc2UgNjoKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDExMCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCWFkZF9sYWJlbCgmKHl5dnNwWygyKSAtICgyKV0ucmUpLT5sYWJlbHMsICh5eXZzcFsoMSkgLSAoMildLmxhYmVscmVmKSk7CiAJCQkoeXl2YWwucmUpID0gKHl5dnNwWygyKSAtICgyKV0ucmUpOwpAQCAtMTQ1Miw4ICsxNDQwLDYgQEAKIAogICBjYXNlIDc6CiAKLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxMTggImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuYWRkcikgPSBldmFsX2xpdGVyYWwoKHl5dnNwWygxKSAtICgxKV0ubGl0ZXJhbCksIDAsIDY0KTsKIAkJO30KQEAgLTE0NjEsOCArMTQ0Nyw2IEBACiAKICAgY2FzZSA4OgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMTI1ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLm5vZGUpID0gbmFtZV9ub2RlKCh5eXZzcFsoMikgLSAoMildLm5vZGUpLCAiIik7CiAJCTt9CkBAIC0xNDcwLDggKzE0NTQsNiBAQAogCiAgIGNhc2UgOToKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDEyOSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5ub2RlKSA9IG1lcmdlX25vZGVzKCh5eXZzcFsoMSkgLSAoMyldLm5vZGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5ub2RlKSk7CiAJCTt9CkBAIC0xNDc5LDggKzE0NjEsNiBAQAogCiAgIGNhc2UgMTA6CiAKLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxMzMgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQlzdHJ1Y3Qgbm9kZSAqdGFyZ2V0ID0gZ2V0X25vZGVfYnlfcmVmKCh5eXZzcFsoMSkgLSAoMyldLm5vZGUpLCAoeXl2c3BbKDIpIC0gKDMpXS5sYWJlbHJlZikpOwogCkBAIC0xNDk0LDggKzE0NzQsNiBAQAogCiAgIGNhc2UgMTE6CiAKLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxNDYgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwubm9kZSkgPSBidWlsZF9ub2RlKCh5eXZzcFsoMikgLSAoNSldLnByb3BsaXN0KSwgKHl5dnNwWygzKSAtICg1KV0ubm9kZWxpc3QpKTsKIAkJO30KQEAgLTE1MDMsOCArMTQ4MSw2IEBACiAKICAgY2FzZSAxMjoKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDE1MyAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5wcm9wbGlzdCkgPSBOVUxMOwogCQk7fQpAQCAtMTUxMiw4ICsxNDg4LDYgQEAKIAogICBjYXNlIDEzOgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMTU3ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLnByb3BsaXN0KSA9IGNoYWluX3Byb3BlcnR5KCh5eXZzcFsoMikgLSAoMildLnByb3ApLCAoeXl2c3BbKDEpIC0gKDIpXS5wcm9wbGlzdCkpOwogCQk7fQpAQCAtMTUyMSw4ICsxNDk1LDYgQEAKIAogICBjYXNlIDE0OgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMTY0ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLnByb3ApID0gYnVpbGRfcHJvcGVydHkoKHl5dnNwWygxKSAtICg0KV0ucHJvcG5vZGVuYW1lKSwgKHl5dnNwWygzKSAtICg0KV0uZGF0YSkpOwogCQk7fQpAQCAtMTUzMCw4ICsxNTAyLDYgQEAKIAogICBjYXNlIDE1OgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMTY4ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLnByb3ApID0gYnVpbGRfcHJvcGVydHkoKHl5dnNwWygxKSAtICgyKV0ucHJvcG5vZGVuYW1lKSwgZW1wdHlfZGF0YSk7CiAJCTt9CkBAIC0xNTM5LDggKzE1MDksNiBAQAogCiAgIGNhc2UgMTY6CiAKLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxNzIgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQlhZGRfbGFiZWwoJih5eXZzcFsoMikgLSAoMildLnByb3ApLT5sYWJlbHMsICh5eXZzcFsoMSkgLSAoMildLmxhYmVscmVmKSk7CiAJCQkoeXl2YWwucHJvcCkgPSAoeXl2c3BbKDIpIC0gKDIpXS5wcm9wKTsKQEAgLTE1NDksOCArMTUxNyw2IEBACiAKICAgY2FzZSAxNzoKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDE4MCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfbWVyZ2UoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksICh5eXZzcFsoMikgLSAoMildLmRhdGEpKTsKIAkJO30KQEAgLTE1NTgsOCArMTUyNCw2IEBACiAKICAgY2FzZSAxODoKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDE4NCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfbWVyZ2UoKHl5dnNwWygxKSAtICg0KV0uZGF0YSksICh5eXZzcFsoMykgLSAoNCldLmRhdGEpKTsKIAkJO30KQEAgLTE1NjcsOCArMTUzMSw2IEBACiAKICAgY2FzZSAxOToKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDE4OCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfbWVyZ2UoKHl5dnNwWygxKSAtICg0KV0uZGF0YSksICh5eXZzcFsoMykgLSAoNCldLmRhdGEpKTsKIAkJO30KQEAgLTE1NzYsOCArMTUzOCw2IEBACiAKICAgY2FzZSAyMDoKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDE5MiAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYWRkX21hcmtlcigoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgUkVGX1BBVEgsICh5eXZzcFsoMikgLSAoMildLmxhYmVscmVmKSk7CiAJCTt9CkBAIC0xNTg1LDggKzE1NDUsNiBAQAogCiAgIGNhc2UgMjE6CiAKLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxOTYgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQlGSUxFICpmID0gc3JjZmlsZV9yZWxhdGl2ZV9vcGVuKCh5eXZzcFsoNCkgLSAoOSldLmRhdGEpLnZhbCwgTlVMTCk7CiAJCQlzdHJ1Y3QgZGF0YSBkOwpAQCAtMTYwNyw4ICsxNTY1LDYgQEAKIAogICBjYXNlIDIyOgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjEzICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJRklMRSAqZiA9IHNyY2ZpbGVfcmVsYXRpdmVfb3BlbigoeXl2c3BbKDQpIC0gKDUpXS5kYXRhKS52YWwsIE5VTEwpOwogCQkJc3RydWN0IGRhdGEgZCA9IGVtcHR5X2RhdGE7CkBAIC0xNjIyLDggKzE1NzgsNiBAQAogCiAgIGNhc2UgMjM6CiAKLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAyMjMgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FkZF9tYXJrZXIoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksIExBQkVMLCAoeXl2c3BbKDIpIC0gKDIpXS5sYWJlbHJlZikpOwogCQk7fQpAQCAtMTYzMSw4ICsxNTg1LDYgQEAKIAogICBjYXNlIDI0OgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjMwICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZW1wdHlfZGF0YTsKIAkJO30KQEAgLTE2NDAsOCArMTU5Miw2IEBACiAKICAgY2FzZSAyNToKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDIzNCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9ICh5eXZzcFsoMSkgLSAoMildLmRhdGEpOwogCQk7fQpAQCAtMTY0OSw4ICsxNTk5LDYgQEAKIAogICBjYXNlIDI2OgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjM4ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBMQUJFTCwgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKTsKIAkJO30KQEAgLTE2NTgsOCArMTYwNiw2IEBACiAKICAgY2FzZSAyNzoKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDI0NSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGVtcHR5X2RhdGE7CiAJCTt9CkBAIC0xNjY3LDggKzE2MTMsNiBAQAogCiAgIGNhc2UgMjg6CiAKLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAyNDkgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FwcGVuZF9jZWxsKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCAoeXl2c3BbKDIpIC0gKDIpXS5jZWxsKSk7CiAJCTt9CkBAIC0xNjc2LDggKzE2MjAsNiBAQAogCiAgIGNhc2UgMjk6CiAKLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAyNTMgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FwcGVuZF9jZWxsKGRhdGFfYWRkX21hcmtlcigoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgUkVGX1BIQU5ETEUsCiAJCQkJCQkJICAgICAgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKSwgLTEpOwpAQCAtMTY4Niw4ICsxNjI4LDYgQEAKIAogICBjYXNlIDMwOgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjU4ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBMQUJFTCwgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKTsKIAkJO30KQEAgLTE2OTUsOCArMTYzNSw2IEBACiAKICAgY2FzZSAzMToKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDI2NSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5jZWxsKSA9IGV2YWxfbGl0ZXJhbCgoeXl2c3BbKDEpIC0gKDEpXS5saXRlcmFsKSwgMCwgMzIpOwogCQk7fQpAQCAtMTcwNCw4ICsxNjQyLDYgQEAKIAogICBjYXNlIDMyOgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjcyICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZW1wdHlfZGF0YTsKIAkJO30KQEAgLTE3MTMsOCArMTY0OSw2IEBACiAKICAgY2FzZSAzMzoKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDI3NiAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYXBwZW5kX2J5dGUoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksICh5eXZzcFsoMikgLSAoMildLmJ5dGUpKTsKIAkJO30KQEAgLTE3MjIsOCArMTY1Niw2IEBACiAKICAgY2FzZSAzNDoKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDI4MCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYWRkX21hcmtlcigoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgTEFCRUwsICh5eXZzcFsoMikgLSAoMildLmxhYmVscmVmKSk7CiAJCTt9CkBAIC0xNzMxLDggKzE2NjMsNiBAQAogCiAgIGNhc2UgMzU6CiAKLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAyODcgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwubm9kZWxpc3QpID0gTlVMTDsKIAkJO30KQEAgLTE3NDAsOCArMTY3MCw2IEBACiAKICAgY2FzZSAzNjoKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDI5MSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5ub2RlbGlzdCkgPSBjaGFpbl9ub2RlKCh5eXZzcFsoMSkgLSAoMildLm5vZGUpLCAoeXl2c3BbKDIpIC0gKDIpXS5ub2RlbGlzdCkpOwogCQk7fQpAQCAtMTc0OSw4ICsxNjc3LDYgQEAKIAogICBjYXNlIDM3OgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjk1ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJcHJpbnRfZXJyb3IoInN5bnRheCBlcnJvcjogcHJvcGVydGllcyBtdXN0IHByZWNlZGUgc3Vibm9kZXMiKTsKIAkJCVlZRVJST1I7CkBAIC0xNzU5LDggKzE2ODUsNiBAQAogCiAgIGNhc2UgMzg6CiAKLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAzMDMgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwubm9kZSkgPSBuYW1lX25vZGUoKHl5dnNwWygyKSAtICgyKV0ubm9kZSksICh5eXZzcFsoMSkgLSAoMildLnByb3Bub2RlbmFtZSkpOwogCQk7fQpAQCAtMTc2OCw4ICsxNjkyLDYgQEAKIAogICBjYXNlIDM5OgogCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMzA3ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJYWRkX2xhYmVsKCYoeXl2c3BbKDIpIC0gKDIpXS5ub2RlKS0+bGFiZWxzLCAoeXl2c3BbKDEpIC0gKDIpXS5sYWJlbHJlZikpOwogCQkJKHl5dmFsLm5vZGUpID0gKHl5dnNwWygyKSAtICgyKV0ubm9kZSk7CkBAIC0xNzc4LDggKzE3MDAsNiBAQAogCiAKIAotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDE3ODMgImR0Yy1wYXJzZXIudGFiLmMiCiAgICAgICBkZWZhdWx0OiBicmVhazsKICAgICB9CiAgIFlZX1NZTUJPTF9QUklOVCAoIi0+ICQkID0iLCB5eXIxW3l5bl0sICZ5eXZhbCwgJnl5bG9jKTsKQEAgLTE5OTAsOCArMTkxMCw2IEBACiAKIAogCi0vKiBMaW5lIDE2NzUgb2YgeWFjYy5jICAqLwotI2xpbmUgMzEzICJkdGMtcGFyc2VyLnkiCiAKIAogdm9pZCBwcmludF9lcnJvcihjaGFyIGNvbnN0ICpmbXQsIC4uLikKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIudGFiLmhfc2hpcHBlZCBiL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIudGFiLmhfc2hpcHBlZAppbmRleCA5NWM5NTQ3Li40ZWU2ODJiIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnRhYi5oX3NoaXBwZWQKKysrIGIvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci50YWIuaF9zaGlwcGVkCkBAIC0xLDEwICsxLDkgQEAKLQotLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuNC4xLiAgKi8KKy8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjQuMy4gICovCiAKIC8qIFNrZWxldG9uIGludGVyZmFjZSBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCiAgICAKLSAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisgICAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICAgCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTU4LDggKzU3LDYgQEAKIHR5cGVkZWYgdW5pb24gWVlTVFlQRQogewogCi0vKiBMaW5lIDE2NzYgb2YgeWFjYy5jICAqLwotI2xpbmUgMzkgImR0Yy1wYXJzZXIueSIKIAogCWNoYXIgKnByb3Bub2RlbmFtZTsKIAljaGFyICpsaXRlcmFsOwpAQCAtNzgsOCArNzUsNiBAQAogCiAKIAotLyogTGluZSAxNjc2IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDgzICJkdGMtcGFyc2VyLnRhYi5oIgogfSBZWVNUWVBFOwogIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKICMgZGVmaW5lIHl5c3R5cGUgWVlTVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2NjLWdvdG8uc2ggYi9zY3JpcHRzL2djYy1nb3RvLnNoCmluZGV4IDUyMGQxNmIuLjk4Y2ZmY2IgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2NjLWdvdG8uc2gKKysrIGIvc2NyaXB0cy9nY2MtZ290by5zaApAQCAtMSw1ICsxLDUgQEAKICMhL2Jpbi9zaAotIyBUZXN0IGZvciBnY2MgJ2FzbSBnb3RvJyBzdXBvcnQKKyMgVGVzdCBmb3IgZ2NjICdhc20gZ290bycgc3VwcG9ydAogIyBDb3B5cmlnaHQgKEMpIDIwMTAsIEphc29uIEJhcm9uIDxqYmFyb25AcmVkaGF0LmNvbT4KIAogZWNobyAiaW50IG1haW4odm9pZCkgeyBlbnRyeTogYXNtIGdvdG8gKFwiXCI6Ojo6ZW50cnkpOyByZXR1cm4gMDsgfSIgfCAkQCAteCBjIC0gLWMgLW8gL2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmJiBlY2hvICJ5IgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy8uZ2l0aWdub3JlIGIvc2NyaXB0cy9nZW5rc3ltcy8uZ2l0aWdub3JlCmluZGV4IGJlNWNhZGIuLjg2ZGMwN2EgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvLmdpdGlnbm9yZQorKysgYi9zY3JpcHRzL2dlbmtzeW1zLy5naXRpZ25vcmUKQEAgLTEsNCArMSw1IEBACi1rZXl3b3Jkcy5jCi1sZXguYwotcGFyc2UuW2NoXQorKi5oYXNoLmMKKyoubGV4LmMKKyoudGFiLmMKKyoudGFiLmgKIGdlbmtzeW1zCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL01ha2VmaWxlIGIvc2NyaXB0cy9nZW5rc3ltcy9NYWtlZmlsZQppbmRleCAxM2QwM2NmLi5hNTUxMDkwIDEwMDY0NAotLS0gYS9zY3JpcHRzL2dlbmtzeW1zL01ha2VmaWxlCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvTWFrZWZpbGUKQEAgLTIsNTIgKzIsMTIgQEAKIGhvc3Rwcm9ncy15CTo9IGdlbmtzeW1zCiBhbHdheXMJCTo9ICQoaG9zdHByb2dzLXkpCiAKLWdlbmtzeW1zLW9ianMJOj0gZ2Vua3N5bXMubyBwYXJzZS5vIGxleC5vCitnZW5rc3ltcy1vYmpzCTo9IGdlbmtzeW1zLm8gcGFyc2UudGFiLm8gbGV4LmxleC5vCiAKICMgLUkgbmVlZGVkIGZvciBnZW5lcmF0ZWQgQyBzb3VyY2UgKHNoaXBwZWQgc291cmNlKQotSE9TVENGTEFHU19wYXJzZS5vIDo9IC1Xbm8tdW5pbml0aWFsaXplZCAtSSQoc3JjKQorSE9TVENGTEFHU19wYXJzZS50YWIubyA6PSAtSSQoc3JjKQorSE9TVENGTEFHU19sZXgubGV4Lm8gOj0gLUkkKHNyYykKIAogIyBkZXBlbmRlbmNpZXMgb24gZ2VuZXJhdGVkIGZpbGVzIG5lZWQgdG8gYmUgbGlzdGVkIGV4cGxpY2l0bHkKLSQob2JqKS9sZXgubzogJChvYmopL3BhcnNlLmggJChvYmopL2tleXdvcmRzLmMKKyQob2JqKS9sZXgubGV4Lm86ICQob2JqKS9rZXl3b3Jkcy5oYXNoLmMgJChvYmopL3BhcnNlLnRhYi5oCiAKLSMgLUkgbmVlZGVkIGZvciBnZW5lcmF0ZWQgQyBzb3VyY2UgKHNoaXBwZWQgc291cmNlKQotSE9TVENGTEFHU19sZXgubyA6PSAtSSQoc3JjKQotCi1pZmRlZiBHRU5FUkFURV9QQVJTRVIKLQotIyBncGVyZgotCi1xdWlldF9jbWRfa2V5d29yZHMuYyA9IEdQRVJGICAgJEAKLSAgICAgIGNtZF9rZXl3b3Jkcy5jID0gZ3BlcmYgLUwgQU5TSS1DIC1hIC1DIC1FIC1nIC1IIGlzX3Jlc2VydmVkX2hhc2gJXAotCQkgICAgICAgLWsgMSwzLCQkIC1OIGlzX3Jlc2VydmVkX3dvcmQgLXAgLXQgJDwgPiAkQAotCi0kKG9iaikva2V5d29yZHMuYzogJChvYmopL2tleXdvcmRzLmdwZXJmIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsa2V5d29yZHMuYykKLQljcCAkQCAkQF9zaGlwcGVkCi0KLSMgZmxleAotCi1xdWlldF9jbWRfbGV4LmMgPSBGTEVYICAgICRACi0gICAgICBjbWRfbGV4LmMgPSBmbGV4IC1vJEAgLWQgJDwKLQotJChvYmopL2xleC5jOiAkKG9iaikvbGV4LmwgJChvYmopL2tleXdvcmRzLmMgRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCxsZXguYykKLQljcCAkQCAkQF9zaGlwcGVkCi0KLSMgYmlzb24KLQotcXVpZXRfY21kX3BhcnNlLmMgPSBCSVNPTiAgICRACi0gICAgICBjbWRfcGFyc2UuYyA9IGJpc29uIC1vJEAgLWR0diAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pCi0KLSQob2JqKS9wYXJzZS5jOiAkKG9iaikvcGFyc2UueSBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLHBhcnNlLmMpCi0JY3AgJEAgJEBfc2hpcHBlZAotCWNwICQoQDouYz0uaCkgJChAOi5jPS5oKV9zaGlwcGVkCi0KLSQob2JqKS9wYXJzZS5oOiAkKG9iaikvcGFyc2UuYyA7Ci0KLWNsZWFuLWZpbGVzCSs9IHBhcnNlLm91dHB1dAotCi1lbmRpZgotCi10YXJnZXRzICs9IGtleXdvcmRzLmMgbGV4LmMgcGFyc2UuYyBwYXJzZS5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmMgYi9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmMKaW5kZXggZjllNzU1My4uNmQzZmRhMCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5jCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuYwpAQCAtNDQ4LDcgKzQ0OCw3IEBACiAJbm9kZS5zdHJpbmcgPSBidWZmZXI7CiAKIAlpZiAobm9kZS5zdHJpbmdbMV0gPT0gJyMnKSB7Ci0JCWludCBuOworCQlzaXplX3QgbjsKIAogCQlmb3IgKG4gPSAwOyBuIDwgQVJSQVlfU0laRShzeW1ib2xfdHlwZXMpOyBuKyspIHsKIAkJCWlmIChub2RlLnN0cmluZ1swXSA9PSBzeW1ib2xfdHlwZXNbbl0ubikgewpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5jX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmNfc2hpcHBlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA2MGUwNi4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmNfc2hpcHBlZAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKiBBTlNJLUMgY29kZSBwcm9kdWNlZCBieSBncGVyZiB2ZXJzaW9uIDMuMC40ICovCi0vKiBDb21tYW5kLWxpbmU6IGdwZXJmIC1MIEFOU0ktQyAtYSAtQyAtRSAtZyAtSCBpc19yZXNlcnZlZF9oYXNoIC1rICcxLDMsJCcgLU4gaXNfcmVzZXJ2ZWRfd29yZCAtcCAtdCBzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmICAqLwotCi0jaWYgISgoJyAnID09IDMyKSAmJiAoJyEnID09IDMzKSAmJiAoJyInID09IDM0KSAmJiAoJyMnID09IDM1KSBcCi0gICAgICAmJiAoJyUnID09IDM3KSAmJiAoJyYnID09IDM4KSAmJiAoJ1wnJyA9PSAzOSkgJiYgKCcoJyA9PSA0MCkgXAotICAgICAgJiYgKCcpJyA9PSA0MSkgJiYgKCcqJyA9PSA0MikgJiYgKCcrJyA9PSA0MykgJiYgKCcsJyA9PSA0NCkgXAotICAgICAgJiYgKCctJyA9PSA0NSkgJiYgKCcuJyA9PSA0NikgJiYgKCcvJyA9PSA0NykgJiYgKCcwJyA9PSA0OCkgXAotICAgICAgJiYgKCcxJyA9PSA0OSkgJiYgKCcyJyA9PSA1MCkgJiYgKCczJyA9PSA1MSkgJiYgKCc0JyA9PSA1MikgXAotICAgICAgJiYgKCc1JyA9PSA1MykgJiYgKCc2JyA9PSA1NCkgJiYgKCc3JyA9PSA1NSkgJiYgKCc4JyA9PSA1NikgXAotICAgICAgJiYgKCc5JyA9PSA1NykgJiYgKCc6JyA9PSA1OCkgJiYgKCc7JyA9PSA1OSkgJiYgKCc8JyA9PSA2MCkgXAotICAgICAgJiYgKCc9JyA9PSA2MSkgJiYgKCc+JyA9PSA2MikgJiYgKCc/JyA9PSA2MykgJiYgKCdBJyA9PSA2NSkgXAotICAgICAgJiYgKCdCJyA9PSA2NikgJiYgKCdDJyA9PSA2NykgJiYgKCdEJyA9PSA2OCkgJiYgKCdFJyA9PSA2OSkgXAotICAgICAgJiYgKCdGJyA9PSA3MCkgJiYgKCdHJyA9PSA3MSkgJiYgKCdIJyA9PSA3MikgJiYgKCdJJyA9PSA3MykgXAotICAgICAgJiYgKCdKJyA9PSA3NCkgJiYgKCdLJyA9PSA3NSkgJiYgKCdMJyA9PSA3NikgJiYgKCdNJyA9PSA3NykgXAotICAgICAgJiYgKCdOJyA9PSA3OCkgJiYgKCdPJyA9PSA3OSkgJiYgKCdQJyA9PSA4MCkgJiYgKCdRJyA9PSA4MSkgXAotICAgICAgJiYgKCdSJyA9PSA4MikgJiYgKCdTJyA9PSA4MykgJiYgKCdUJyA9PSA4NCkgJiYgKCdVJyA9PSA4NSkgXAotICAgICAgJiYgKCdWJyA9PSA4NikgJiYgKCdXJyA9PSA4NykgJiYgKCdYJyA9PSA4OCkgJiYgKCdZJyA9PSA4OSkgXAotICAgICAgJiYgKCdaJyA9PSA5MCkgJiYgKCdbJyA9PSA5MSkgJiYgKCdcXCcgPT0gOTIpICYmICgnXScgPT0gOTMpIFwKLSAgICAgICYmICgnXicgPT0gOTQpICYmICgnXycgPT0gOTUpICYmICgnYScgPT0gOTcpICYmICgnYicgPT0gOTgpIFwKLSAgICAgICYmICgnYycgPT0gOTkpICYmICgnZCcgPT0gMTAwKSAmJiAoJ2UnID09IDEwMSkgJiYgKCdmJyA9PSAxMDIpIFwKLSAgICAgICYmICgnZycgPT0gMTAzKSAmJiAoJ2gnID09IDEwNCkgJiYgKCdpJyA9PSAxMDUpICYmICgnaicgPT0gMTA2KSBcCi0gICAgICAmJiAoJ2snID09IDEwNykgJiYgKCdsJyA9PSAxMDgpICYmICgnbScgPT0gMTA5KSAmJiAoJ24nID09IDExMCkgXAotICAgICAgJiYgKCdvJyA9PSAxMTEpICYmICgncCcgPT0gMTEyKSAmJiAoJ3EnID09IDExMykgJiYgKCdyJyA9PSAxMTQpIFwKLSAgICAgICYmICgncycgPT0gMTE1KSAmJiAoJ3QnID09IDExNikgJiYgKCd1JyA9PSAxMTcpICYmICgndicgPT0gMTE4KSBcCi0gICAgICAmJiAoJ3cnID09IDExOSkgJiYgKCd4JyA9PSAxMjApICYmICgneScgPT0gMTIxKSAmJiAoJ3onID09IDEyMikgXAotICAgICAgJiYgKCd7JyA9PSAxMjMpICYmICgnfCcgPT0gMTI0KSAmJiAoJ30nID09IDEyNSkgJiYgKCd+JyA9PSAxMjYpKQotLyogVGhlIGNoYXJhY3RlciBzZXQgaXMgbm90IGJhc2VkIG9uIElTTy02NDYuICAqLwotI2Vycm9yICJncGVyZiBnZW5lcmF0ZWQgdGFibGVzIGRvbid0IHdvcmsgd2l0aCB0aGlzIGV4ZWN1dGlvbiBjaGFyYWN0ZXIgc2V0LiBQbGVhc2UgcmVwb3J0IGEgYnVnIHRvIDxidWctZ251LWdwZXJmQGdudS5vcmc+LiIKLSNlbmRpZgotCi0jbGluZSAxICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotCi1zdHJ1Y3QgcmVzd29yZDsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzd29yZCAqaXNfcmVzZXJ2ZWRfd29yZChyZWdpc3RlciBjb25zdCBjaGFyICpzdHIsIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZW4pOwotI2xpbmUgNSAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLXN0cnVjdCByZXN3b3JkIHsgY29uc3QgY2hhciAqbmFtZTsgaW50IHRva2VuOyB9OwotLyogbWF4aW11bSBrZXkgcmFuZ2UgPSA2NCwgZHVwbGljYXRlcyA9IDAgKi8KLQotI2lmZGVmIF9fR05VQ19fCi1fX2lubGluZQotI2Vsc2UKLSNpZmRlZiBfX2NwbHVzcGx1cwotaW5saW5lCi0jZW5kaWYKLSNlbmRpZgotc3RhdGljIHVuc2lnbmVkIGludAotaXNfcmVzZXJ2ZWRfaGFzaCAocmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyLCByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGVuKQotewotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhc3NvX3ZhbHVlc1tdID0KLSAgICB7Ci0gICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKLSAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAotICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCi0gICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKLSAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAotICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCi0gICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCAgMCwKLSAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDE1LCA2NywgNjcsIDY3LAotICAgICAgIDAsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCi0gICAgICA2NywgNjcsIDY3LCA2NywgNjcsICAwLCA2NywgIDAsIDY3LCAgNSwKLSAgICAgIDI1LCAyMCwgMTUsIDMwLCA2NywgMTUsIDY3LCA2NywgMTAsICAwLAotICAgICAgMTAsIDQwLCAyMCwgNjcsIDEwLCAgNSwgIDAsIDEwLCAxNSwgNjcsCi0gICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKLSAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAotICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCi0gICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKLSAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAotICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCi0gICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKLSAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAotICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCi0gICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKLSAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAotICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCi0gICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKLSAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcKLSAgICB9OwotICByZXR1cm4gbGVuICsgYXNzb192YWx1ZXNbKHVuc2lnbmVkIGNoYXIpc3RyWzJdXSArIGFzc29fdmFsdWVzWyh1bnNpZ25lZCBjaGFyKXN0clswXV0gKyBhc3NvX3ZhbHVlc1sodW5zaWduZWQgY2hhcilzdHJbbGVuIC0gMV1dOwotfQotCi0jaWZkZWYgX19HTlVDX18KLV9faW5saW5lCi0jaWYgZGVmaW5lZCBfX0dOVUNfU1REQ19JTkxJTkVfXyB8fCBkZWZpbmVkIF9fR05VQ19HTlVfSU5MSU5FX18KLV9fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXykpCi0jZW5kaWYKLSNlbmRpZgotY29uc3Qgc3RydWN0IHJlc3dvcmQgKgotaXNfcmVzZXJ2ZWRfd29yZCAocmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyLCByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGVuKQotewotICBlbnVtCi0gICAgewotICAgICAgVE9UQUxfS0VZV09SRFMgPSA0NSwKLSAgICAgIE1JTl9XT1JEX0xFTkdUSCA9IDMsCi0gICAgICBNQVhfV09SRF9MRU5HVEggPSAyNCwKLSAgICAgIE1JTl9IQVNIX1ZBTFVFID0gMywKLSAgICAgIE1BWF9IQVNIX1ZBTFVFID0gNjYKLSAgICB9OwotCi0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzd29yZCB3b3JkbGlzdFtdID0KLSAgICB7Ci0gICAgICB7IiJ9LCB7IiJ9LCB7IiJ9LAotI2xpbmUgMzAgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7ImFzbSIsIEFTTV9LRVlXfSwKLSAgICAgIHsiIn0sCi0jbGluZSAxMiAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsiX19hc20iLCBBU01fS0VZV30sCi0gICAgICB7IiJ9LAotI2xpbmUgMTMgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7Il9fYXNtX18iLCBBU01fS0VZV30sCi0gICAgICB7IiJ9LCB7IiJ9LAotI2xpbmUgNTYgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7Il9fdHlwZW9mX18iLCBUWVBFT0ZfS0VZV30sCi0gICAgICB7IiJ9LAotI2xpbmUgMTYgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7Il9fY29uc3QiLCBDT05TVF9LRVlXfSwKLSNsaW5lIDE1ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJfX2F0dHJpYnV0ZV9fIiwgQVRUUklCVVRFX0tFWVd9LAotI2xpbmUgMTcgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7Il9fY29uc3RfXyIsIENPTlNUX0tFWVd9LAotI2xpbmUgMjIgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7Il9fc2lnbmVkX18iLCBTSUdORURfS0VZV30sCi0jbGluZSA0OCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsic3RhdGljIiwgU1RBVElDX0tFWVd9LAotICAgICAgeyIifSwKLSNsaW5lIDQzICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJpbnQiLCBJTlRfS0VZV30sCi0jbGluZSAzNiAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsiY2hhciIsIENIQVJfS0VZV30sCi0jbGluZSAzNyAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsiY29uc3QiLCBDT05TVF9LRVlXfSwKLSNsaW5lIDQ5ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJzdHJ1Y3QiLCBTVFJVQ1RfS0VZV30sCi0jbGluZSAyOCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsiX19yZXN0cmljdF9fIiwgUkVTVFJJQ1RfS0VZV30sCi0jbGluZSAyOSAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsicmVzdHJpY3QiLCBSRVNUUklDVF9LRVlXfSwKLSNsaW5lIDkgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7IkVYUE9SVF9TWU1CT0xfR1BMX0ZVVFVSRSIsIEVYUE9SVF9TWU1CT0xfS0VZV30sCi0jbGluZSAyMCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsiX19pbmxpbmVfXyIsIElOTElORV9LRVlXfSwKLSAgICAgIHsiIn0sCi0jbGluZSAyNCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsiX192b2xhdGlsZV9fIiwgVk9MQVRJTEVfS0VZV30sCi0jbGluZSA3ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJFWFBPUlRfU1lNQk9MIiwgRVhQT1JUX1NZTUJPTF9LRVlXfSwKLSNsaW5lIDI3ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJfcmVzdHJpY3QiLCBSRVNUUklDVF9LRVlXfSwKLSAgICAgIHsiIn0sCi0jbGluZSAxNCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsiX19hdHRyaWJ1dGUiLCBBVFRSSUJVVEVfS0VZV30sCi0jbGluZSA4ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJFWFBPUlRfU1lNQk9MX0dQTCIsIEVYUE9SVF9TWU1CT0xfS0VZV30sCi0jbGluZSAxOCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsiX19leHRlbnNpb25fXyIsIEVYVEVOU0lPTl9LRVlXfSwKLSNsaW5lIDM5ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJlbnVtIiwgRU5VTV9LRVlXfSwKLSNsaW5lIDEwICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJFWFBPUlRfVU5VU0VEX1NZTUJPTCIsIEVYUE9SVF9TWU1CT0xfS0VZV30sCi0jbGluZSA0MCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsiZXh0ZXJuIiwgRVhURVJOX0tFWVd9LAotICAgICAgeyIifSwKLSNsaW5lIDIxICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJfX3NpZ25lZCIsIFNJR05FRF9LRVlXfSwKLSNsaW5lIDExICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJFWFBPUlRfVU5VU0VEX1NZTUJPTF9HUEwiLCBFWFBPUlRfU1lNQk9MX0tFWVd9LAotI2xpbmUgNTEgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7InVuaW9uIiwgVU5JT05fS0VZV30sCi0jbGluZSA1NSAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsidHlwZW9mIiwgVFlQRU9GX0tFWVd9LAotI2xpbmUgNTAgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7InR5cGVkZWYiLCBUWVBFREVGX0tFWVd9LAotI2xpbmUgMTkgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7Il9faW5saW5lIiwgSU5MSU5FX0tFWVd9LAotI2xpbmUgMzUgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7ImF1dG8iLCBBVVRPX0tFWVd9LAotI2xpbmUgMjMgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7Il9fdm9sYXRpbGUiLCBWT0xBVElMRV9LRVlXfSwKLSAgICAgIHsiIn0sIHsiIn0sCi0jbGluZSA1MiAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsidW5zaWduZWQiLCBVTlNJR05FRF9LRVlXfSwKLSAgICAgIHsiIn0sCi0jbGluZSA0NiAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsic2hvcnQiLCBTSE9SVF9LRVlXfSwKLSNsaW5lIDQyICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJpbmxpbmUiLCBJTkxJTkVfS0VZV30sCi0gICAgICB7IiJ9LAotI2xpbmUgNTQgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7InZvbGF0aWxlIiwgVk9MQVRJTEVfS0VZV30sCi0jbGluZSA0NCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsibG9uZyIsIExPTkdfS0VZV30sCi0jbGluZSAyNiAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsiX0Jvb2wiLCBCT09MX0tFWVd9LAotICAgICAgeyIifSwgeyIifSwKLSNsaW5lIDQ1ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJyZWdpc3RlciIsIFJFR0lTVEVSX0tFWVd9LAotI2xpbmUgNTMgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7InZvaWQiLCBWT0lEX0tFWVd9LAotI2xpbmUgNDEgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCi0gICAgICB7ImZsb2F0IiwgRkxPQVRfS0VZV30sCi0jbGluZSAzOCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKLSAgICAgIHsiZG91YmxlIiwgRE9VQkxFX0tFWVd9LAotICAgICAgeyIifSwgeyIifSwgeyIifSwgeyIifSwKLSNsaW5lIDQ3ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgotICAgICAgeyJzaWduZWQiLCBTSUdORURfS0VZV30KLSAgICB9OwotCi0gIGlmIChsZW4gPD0gTUFYX1dPUkRfTEVOR1RIICYmIGxlbiA+PSBNSU5fV09SRF9MRU5HVEgpCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGtleSA9IGlzX3Jlc2VydmVkX2hhc2ggKHN0ciwgbGVuKTsKLQotICAgICAgaWYgKGtleSA8PSBNQVhfSEFTSF9WQUxVRSAmJiBrZXkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSB3b3JkbGlzdFtrZXldLm5hbWU7Ci0KLSAgICAgICAgICBpZiAoKnN0ciA9PSAqcyAmJiAhc3RyY21wIChzdHIgKyAxLCBzICsgMSkpCi0gICAgICAgICAgICByZXR1cm4gJndvcmRsaXN0W2tleV07Ci0gICAgICAgIH0KLSAgICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiBiL3NjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYKaW5kZXggZTYzNDlhYy4uM2U3N2E5NCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZgorKysgYi9zY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmCkBAIC0xLDMgKzEsNiBAQAorJWxhbmd1YWdlPUFOU0ktQworJWRlZmluZSBoYXNoLWZ1bmN0aW9uLW5hbWUgaXNfcmVzZXJ2ZWRfaGFzaAorJWRlZmluZSBsb29rdXAtZnVuY3Rpb24tbmFtZSBpc19yZXNlcnZlZF93b3JkCiAlewogc3RydWN0IHJlc3dvcmQ7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlc3dvcmQgKmlzX3Jlc2VydmVkX3dvcmQocmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyLCByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGVuKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuaGFzaC5jX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmhhc2guY19zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDYyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmhhc2guY19zaGlwcGVkCkBAIC0wLDAgKzEsMjIwIEBACisvKiBBTlNJLUMgY29kZSBwcm9kdWNlZCBieSBncGVyZiB2ZXJzaW9uIDMuMC40ICovCisvKiBDb21tYW5kLWxpbmU6IGdwZXJmIC10IC0tb3V0cHV0LWZpbGUgc2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5oYXNoLmNfc2hpcHBlZCAtYSAtQyAtRSAtZyAtayAnMSwzLCQnIC1wIC10IHNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYgICovCisKKyNpZiAhKCgnICcgPT0gMzIpICYmICgnIScgPT0gMzMpICYmICgnIicgPT0gMzQpICYmICgnIycgPT0gMzUpIFwKKyAgICAgICYmICgnJScgPT0gMzcpICYmICgnJicgPT0gMzgpICYmICgnXCcnID09IDM5KSAmJiAoJygnID09IDQwKSBcCisgICAgICAmJiAoJyknID09IDQxKSAmJiAoJyonID09IDQyKSAmJiAoJysnID09IDQzKSAmJiAoJywnID09IDQ0KSBcCisgICAgICAmJiAoJy0nID09IDQ1KSAmJiAoJy4nID09IDQ2KSAmJiAoJy8nID09IDQ3KSAmJiAoJzAnID09IDQ4KSBcCisgICAgICAmJiAoJzEnID09IDQ5KSAmJiAoJzInID09IDUwKSAmJiAoJzMnID09IDUxKSAmJiAoJzQnID09IDUyKSBcCisgICAgICAmJiAoJzUnID09IDUzKSAmJiAoJzYnID09IDU0KSAmJiAoJzcnID09IDU1KSAmJiAoJzgnID09IDU2KSBcCisgICAgICAmJiAoJzknID09IDU3KSAmJiAoJzonID09IDU4KSAmJiAoJzsnID09IDU5KSAmJiAoJzwnID09IDYwKSBcCisgICAgICAmJiAoJz0nID09IDYxKSAmJiAoJz4nID09IDYyKSAmJiAoJz8nID09IDYzKSAmJiAoJ0EnID09IDY1KSBcCisgICAgICAmJiAoJ0InID09IDY2KSAmJiAoJ0MnID09IDY3KSAmJiAoJ0QnID09IDY4KSAmJiAoJ0UnID09IDY5KSBcCisgICAgICAmJiAoJ0YnID09IDcwKSAmJiAoJ0cnID09IDcxKSAmJiAoJ0gnID09IDcyKSAmJiAoJ0knID09IDczKSBcCisgICAgICAmJiAoJ0onID09IDc0KSAmJiAoJ0snID09IDc1KSAmJiAoJ0wnID09IDc2KSAmJiAoJ00nID09IDc3KSBcCisgICAgICAmJiAoJ04nID09IDc4KSAmJiAoJ08nID09IDc5KSAmJiAoJ1AnID09IDgwKSAmJiAoJ1EnID09IDgxKSBcCisgICAgICAmJiAoJ1InID09IDgyKSAmJiAoJ1MnID09IDgzKSAmJiAoJ1QnID09IDg0KSAmJiAoJ1UnID09IDg1KSBcCisgICAgICAmJiAoJ1YnID09IDg2KSAmJiAoJ1cnID09IDg3KSAmJiAoJ1gnID09IDg4KSAmJiAoJ1knID09IDg5KSBcCisgICAgICAmJiAoJ1onID09IDkwKSAmJiAoJ1snID09IDkxKSAmJiAoJ1xcJyA9PSA5MikgJiYgKCddJyA9PSA5MykgXAorICAgICAgJiYgKCdeJyA9PSA5NCkgJiYgKCdfJyA9PSA5NSkgJiYgKCdhJyA9PSA5NykgJiYgKCdiJyA9PSA5OCkgXAorICAgICAgJiYgKCdjJyA9PSA5OSkgJiYgKCdkJyA9PSAxMDApICYmICgnZScgPT0gMTAxKSAmJiAoJ2YnID09IDEwMikgXAorICAgICAgJiYgKCdnJyA9PSAxMDMpICYmICgnaCcgPT0gMTA0KSAmJiAoJ2knID09IDEwNSkgJiYgKCdqJyA9PSAxMDYpIFwKKyAgICAgICYmICgnaycgPT0gMTA3KSAmJiAoJ2wnID09IDEwOCkgJiYgKCdtJyA9PSAxMDkpICYmICgnbicgPT0gMTEwKSBcCisgICAgICAmJiAoJ28nID09IDExMSkgJiYgKCdwJyA9PSAxMTIpICYmICgncScgPT0gMTEzKSAmJiAoJ3InID09IDExNCkgXAorICAgICAgJiYgKCdzJyA9PSAxMTUpICYmICgndCcgPT0gMTE2KSAmJiAoJ3UnID09IDExNykgJiYgKCd2JyA9PSAxMTgpIFwKKyAgICAgICYmICgndycgPT0gMTE5KSAmJiAoJ3gnID09IDEyMCkgJiYgKCd5JyA9PSAxMjEpICYmICgneicgPT0gMTIyKSBcCisgICAgICAmJiAoJ3snID09IDEyMykgJiYgKCd8JyA9PSAxMjQpICYmICgnfScgPT0gMTI1KSAmJiAoJ34nID09IDEyNikpCisvKiBUaGUgY2hhcmFjdGVyIHNldCBpcyBub3QgYmFzZWQgb24gSVNPLTY0Ni4gICovCisjZXJyb3IgImdwZXJmIGdlbmVyYXRlZCB0YWJsZXMgZG9uJ3Qgd29yayB3aXRoIHRoaXMgZXhlY3V0aW9uIGNoYXJhY3RlciBzZXQuIFBsZWFzZSByZXBvcnQgYSBidWcgdG8gPGJ1Zy1nbnUtZ3BlcmZAZ251Lm9yZz4uIgorI2VuZGlmCisKKyNsaW5lIDQgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisKK3N0cnVjdCByZXN3b3JkOworc3RhdGljIGNvbnN0IHN0cnVjdCByZXN3b3JkICppc19yZXNlcnZlZF93b3JkKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0ciwgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxlbik7CisjbGluZSA4ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorc3RydWN0IHJlc3dvcmQgeyBjb25zdCBjaGFyICpuYW1lOyBpbnQgdG9rZW47IH07CisvKiBtYXhpbXVtIGtleSByYW5nZSA9IDY0LCBkdXBsaWNhdGVzID0gMCAqLworCisjaWZkZWYgX19HTlVDX18KK19faW5saW5lCisjZWxzZQorI2lmZGVmIF9fY3BsdXNwbHVzCitpbmxpbmUKKyNlbmRpZgorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50Citpc19yZXNlcnZlZF9oYXNoIChyZWdpc3RlciBjb25zdCBjaGFyICpzdHIsIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZW4pCit7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFzc29fdmFsdWVzW10gPQorICAgIHsKKyAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAorICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCisgICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKKyAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAorICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCisgICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKKyAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsICAwLAorICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgMTUsIDY3LCA2NywgNjcsCisgICAgICAgMCwgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKKyAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgIDAsIDY3LCAgMCwgNjcsICA1LAorICAgICAgMjUsIDIwLCAxNSwgMzAsIDY3LCAxNSwgNjcsIDY3LCAxMCwgIDAsCisgICAgICAxMCwgNDAsIDIwLCA2NywgMTAsICA1LCAgMCwgMTAsIDE1LCA2NywKKyAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAorICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCisgICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKKyAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAorICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCisgICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKKyAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAorICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCisgICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKKyAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAorICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsCisgICAgICA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywKKyAgICAgIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LCA2NywgNjcsIDY3LAorICAgICAgNjcsIDY3LCA2NywgNjcsIDY3LCA2NworICAgIH07CisgIHJldHVybiBsZW4gKyBhc3NvX3ZhbHVlc1sodW5zaWduZWQgY2hhcilzdHJbMl1dICsgYXNzb192YWx1ZXNbKHVuc2lnbmVkIGNoYXIpc3RyWzBdXSArIGFzc29fdmFsdWVzWyh1bnNpZ25lZCBjaGFyKXN0cltsZW4gLSAxXV07Cit9CisKKyNpZmRlZiBfX0dOVUNfXworX19pbmxpbmUKKyNpZiBkZWZpbmVkIF9fR05VQ19TVERDX0lOTElORV9fIHx8IGRlZmluZWQgX19HTlVDX0dOVV9JTkxJTkVfXworX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fKSkKKyNlbmRpZgorI2VuZGlmCitjb25zdCBzdHJ1Y3QgcmVzd29yZCAqCitpc19yZXNlcnZlZF93b3JkIChyZWdpc3RlciBjb25zdCBjaGFyICpzdHIsIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZW4pCit7CisgIGVudW0KKyAgICB7CisgICAgICBUT1RBTF9LRVlXT1JEUyA9IDQ1LAorICAgICAgTUlOX1dPUkRfTEVOR1RIID0gMywKKyAgICAgIE1BWF9XT1JEX0xFTkdUSCA9IDI0LAorICAgICAgTUlOX0hBU0hfVkFMVUUgPSAzLAorICAgICAgTUFYX0hBU0hfVkFMVUUgPSA2NgorICAgIH07CisKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCByZXN3b3JkIHdvcmRsaXN0W10gPQorICAgIHsKKyAgICAgIHsiIn0sIHsiIn0sIHsiIn0sCisjbGluZSAzMyAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiYXNtIiwgQVNNX0tFWVd9LAorICAgICAgeyIifSwKKyNsaW5lIDE1ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJfX2FzbSIsIEFTTV9LRVlXfSwKKyAgICAgIHsiIn0sCisjbGluZSAxNiAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiX19hc21fXyIsIEFTTV9LRVlXfSwKKyAgICAgIHsiIn0sIHsiIn0sCisjbGluZSA1OSAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiX190eXBlb2ZfXyIsIFRZUEVPRl9LRVlXfSwKKyAgICAgIHsiIn0sCisjbGluZSAxOSAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiX19jb25zdCIsIENPTlNUX0tFWVd9LAorI2xpbmUgMTggInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7Il9fYXR0cmlidXRlX18iLCBBVFRSSUJVVEVfS0VZV30sCisjbGluZSAyMCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiX19jb25zdF9fIiwgQ09OU1RfS0VZV30sCisjbGluZSAyNSAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiX19zaWduZWRfXyIsIFNJR05FRF9LRVlXfSwKKyNsaW5lIDUxICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJzdGF0aWMiLCBTVEFUSUNfS0VZV30sCisgICAgICB7IiJ9LAorI2xpbmUgNDYgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7ImludCIsIElOVF9LRVlXfSwKKyNsaW5lIDM5ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJjaGFyIiwgQ0hBUl9LRVlXfSwKKyNsaW5lIDQwICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJjb25zdCIsIENPTlNUX0tFWVd9LAorI2xpbmUgNTIgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7InN0cnVjdCIsIFNUUlVDVF9LRVlXfSwKKyNsaW5lIDMxICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJfX3Jlc3RyaWN0X18iLCBSRVNUUklDVF9LRVlXfSwKKyNsaW5lIDMyICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJyZXN0cmljdCIsIFJFU1RSSUNUX0tFWVd9LAorI2xpbmUgMTIgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7IkVYUE9SVF9TWU1CT0xfR1BMX0ZVVFVSRSIsIEVYUE9SVF9TWU1CT0xfS0VZV30sCisjbGluZSAyMyAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiX19pbmxpbmVfXyIsIElOTElORV9LRVlXfSwKKyAgICAgIHsiIn0sCisjbGluZSAyNyAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiX192b2xhdGlsZV9fIiwgVk9MQVRJTEVfS0VZV30sCisjbGluZSAxMCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiRVhQT1JUX1NZTUJPTCIsIEVYUE9SVF9TWU1CT0xfS0VZV30sCisjbGluZSAzMCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiX3Jlc3RyaWN0IiwgUkVTVFJJQ1RfS0VZV30sCisgICAgICB7IiJ9LAorI2xpbmUgMTcgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7Il9fYXR0cmlidXRlIiwgQVRUUklCVVRFX0tFWVd9LAorI2xpbmUgMTEgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7IkVYUE9SVF9TWU1CT0xfR1BMIiwgRVhQT1JUX1NZTUJPTF9LRVlXfSwKKyNsaW5lIDIxICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJfX2V4dGVuc2lvbl9fIiwgRVhURU5TSU9OX0tFWVd9LAorI2xpbmUgNDIgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7ImVudW0iLCBFTlVNX0tFWVd9LAorI2xpbmUgMTMgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7IkVYUE9SVF9VTlVTRURfU1lNQk9MIiwgRVhQT1JUX1NZTUJPTF9LRVlXfSwKKyNsaW5lIDQzICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJleHRlcm4iLCBFWFRFUk5fS0VZV30sCisgICAgICB7IiJ9LAorI2xpbmUgMjQgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7Il9fc2lnbmVkIiwgU0lHTkVEX0tFWVd9LAorI2xpbmUgMTQgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7IkVYUE9SVF9VTlVTRURfU1lNQk9MX0dQTCIsIEVYUE9SVF9TWU1CT0xfS0VZV30sCisjbGluZSA1NCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsidW5pb24iLCBVTklPTl9LRVlXfSwKKyNsaW5lIDU4ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJ0eXBlb2YiLCBUWVBFT0ZfS0VZV30sCisjbGluZSA1MyAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsidHlwZWRlZiIsIFRZUEVERUZfS0VZV30sCisjbGluZSAyMiAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiX19pbmxpbmUiLCBJTkxJTkVfS0VZV30sCisjbGluZSAzOCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiYXV0byIsIEFVVE9fS0VZV30sCisjbGluZSAyNiAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiX192b2xhdGlsZSIsIFZPTEFUSUxFX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwKKyNsaW5lIDU1ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJ1bnNpZ25lZCIsIFVOU0lHTkVEX0tFWVd9LAorICAgICAgeyIifSwKKyNsaW5lIDQ5ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJzaG9ydCIsIFNIT1JUX0tFWVd9LAorI2xpbmUgNDUgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7ImlubGluZSIsIElOTElORV9LRVlXfSwKKyAgICAgIHsiIn0sCisjbGluZSA1NyAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsidm9sYXRpbGUiLCBWT0xBVElMRV9LRVlXfSwKKyNsaW5lIDQ3ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJsb25nIiwgTE9OR19LRVlXfSwKKyNsaW5lIDI5ICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJfQm9vbCIsIEJPT0xfS0VZV30sCisgICAgICB7IiJ9LCB7IiJ9LAorI2xpbmUgNDggInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7InJlZ2lzdGVyIiwgUkVHSVNURVJfS0VZV30sCisjbGluZSA1NiAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsidm9pZCIsIFZPSURfS0VZV30sCisjbGluZSA0NCAic2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZiIKKyAgICAgIHsiZmxvYXQiLCBGTE9BVF9LRVlXfSwKKyNsaW5lIDQxICJzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIgorICAgICAgeyJkb3VibGUiLCBET1VCTEVfS0VZV30sCisgICAgICB7IiJ9LCB7IiJ9LCB7IiJ9LCB7IiJ9LAorI2xpbmUgNTAgInNjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuZ3BlcmYiCisgICAgICB7InNpZ25lZCIsIFNJR05FRF9LRVlXfQorICAgIH07CisKKyAgaWYgKGxlbiA8PSBNQVhfV09SRF9MRU5HVEggJiYgbGVuID49IE1JTl9XT1JEX0xFTkdUSCkKKyAgICB7CisgICAgICByZWdpc3RlciBpbnQga2V5ID0gaXNfcmVzZXJ2ZWRfaGFzaCAoc3RyLCBsZW4pOworCisgICAgICBpZiAoa2V5IDw9IE1BWF9IQVNIX1ZBTFVFICYmIGtleSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IHdvcmRsaXN0W2tleV0ubmFtZTsKKworICAgICAgICAgIGlmICgqc3RyID09ICpzICYmICFzdHJjbXAgKHN0ciArIDEsIHMgKyAxKSkKKyAgICAgICAgICAgIHJldHVybiAmd29yZGxpc3Rba2V5XTsKKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL2xleC5jX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL2xleC5jX3NoaXBwZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDkzOTAuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9nZW5rc3ltcy9sZXguY19zaGlwcGVkCisrKyAvZGV2L251bGwKQEAgLTEsMjU4MiArMCwwIEBACi0jbGluZSAyICJzY3JpcHRzL2dlbmtzeW1zL2xleC5jIgotCi0jbGluZSA0ICJzY3JpcHRzL2dlbmtzeW1zL2xleC5jIgotCi0jZGVmaW5lICBZWV9JTlRfQUxJR05FRCBzaG9ydCBpbnQKLQotLyogQSBsZXhpY2FsIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IGZsZXggKi8KLQotLyogJW5vdC1mb3ItaGVhZGVyICovCi0KLS8qICVpZi1jLW9ubHkgKi8KLS8qICVpZi1ub3QtcmVlbnRyYW50ICovCi0KLS8qICVlbmRpZiAqLwotLyogJWVuZGlmICovCi0vKiAlb2stZm9yLWhlYWRlciAqLwotCi0jZGVmaW5lIEZMRVhfU0NBTk5FUgotI2RlZmluZSBZWV9GTEVYX01BSk9SX1ZFUlNJT04gMgotI2RlZmluZSBZWV9GTEVYX01JTk9SX1ZFUlNJT04gNQotI2RlZmluZSBZWV9GTEVYX1NVQk1JTk9SX1ZFUlNJT04gMzUKLSNpZiBZWV9GTEVYX1NVQk1JTk9SX1ZFUlNJT04gPiAwCi0jZGVmaW5lIEZMRVhfQkVUQQotI2VuZGlmCi0KLS8qICVpZi1jKystb25seSAqLwotLyogJWVuZGlmICovCi0KLS8qICVpZi1jLW9ubHkgKi8KLSAgICAKLS8qICVlbmRpZiAqLwotCi0vKiAlaWYtYy1vbmx5ICovCi0KLS8qICVlbmRpZiAqLwotCi0vKiBGaXJzdCwgd2UgZGVhbCB3aXRoICBwbGF0Zm9ybS1zcGVjaWZpYyBvciBjb21waWxlci1zcGVjaWZpYyBpc3N1ZXMuICovCi0KLS8qIGJlZ2luIHN0YW5kYXJkIEMgaGVhZGVycy4gKi8KLS8qICVpZi1jLW9ubHkgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0vKiAlZW5kaWYgKi8KLQotLyogJWlmLXRhYmxlcy1zZXJpYWxpemF0aW9uICovCi0vKiAlZW5kaWYgKi8KLS8qIGVuZCBzdGFuZGFyZCBDIGhlYWRlcnMuICovCi0KLS8qICVpZi1jLW9yLWMrKyAqLwotLyogZmxleCBpbnRlZ2VyIHR5cGUgZGVmaW5pdGlvbnMgKi8KLQotI2lmbmRlZiBGTEVYSU5UX0gKLSNkZWZpbmUgRkxFWElOVF9ICi0KLS8qIEM5OSBzeXN0ZW1zIGhhdmUgPGludHR5cGVzLmg+LiBOb24tQzk5IHN5c3RlbXMgbWF5IG9yIG1heSBub3QuICovCi0KLSNpZiBkZWZpbmVkIChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKLQotLyogQzk5IHNheXMgdG8gZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MgYmVmb3JlIGluY2x1ZGluZyBzdGRpbnQuaCwKLSAqIGlmIHlvdSB3YW50IHRoZSBsaW1pdCAobWF4L21pbikgbWFjcm9zIGZvciBpbnQgdHlwZXMuIAotICovCi0jaWZuZGVmIF9fU1REQ19MSU1JVF9NQUNST1MKLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUyAxCi0jZW5kaWYKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci10eXBlZGVmIGludDhfdCBmbGV4X2ludDhfdDsKLXR5cGVkZWYgdWludDhfdCBmbGV4X3VpbnQ4X3Q7Ci10eXBlZGVmIGludDE2X3QgZmxleF9pbnQxNl90OwotdHlwZWRlZiB1aW50MTZfdCBmbGV4X3VpbnQxNl90OwotdHlwZWRlZiBpbnQzMl90IGZsZXhfaW50MzJfdDsKLXR5cGVkZWYgdWludDMyX3QgZmxleF91aW50MzJfdDsKLSNlbHNlCi10eXBlZGVmIHNpZ25lZCBjaGFyIGZsZXhfaW50OF90OwotdHlwZWRlZiBzaG9ydCBpbnQgZmxleF9pbnQxNl90OwotdHlwZWRlZiBpbnQgZmxleF9pbnQzMl90OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGZsZXhfdWludDhfdDsgCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBmbGV4X3VpbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgZmxleF91aW50MzJfdDsKLSNlbmRpZiAvKiAhIEM5OSAqLwotCi0vKiBMaW1pdHMgb2YgaW50ZWdyYWwgdHlwZXMuICovCi0jaWZuZGVmIElOVDhfTUlOCi0jZGVmaW5lIElOVDhfTUlOICAgICAgICAgICAgICAgKC0xMjgpCi0jZW5kaWYKLSNpZm5kZWYgSU5UMTZfTUlOCi0jZGVmaW5lIElOVDE2X01JTiAgICAgICAgICAgICAgKC0zMjc2Ny0xKQotI2VuZGlmCi0jaWZuZGVmIElOVDMyX01JTgotI2RlZmluZSBJTlQzMl9NSU4gICAgICAgICAgICAgICgtMjE0NzQ4MzY0Ny0xKQotI2VuZGlmCi0jaWZuZGVmIElOVDhfTUFYCi0jZGVmaW5lIElOVDhfTUFYICAgICAgICAgICAgICAgKDEyNykKLSNlbmRpZgotI2lmbmRlZiBJTlQxNl9NQVgKLSNkZWZpbmUgSU5UMTZfTUFYICAgICAgICAgICAgICAoMzI3NjcpCi0jZW5kaWYKLSNpZm5kZWYgSU5UMzJfTUFYCi0jZGVmaW5lIElOVDMyX01BWCAgICAgICAgICAgICAgKDIxNDc0ODM2NDcpCi0jZW5kaWYKLSNpZm5kZWYgVUlOVDhfTUFYCi0jZGVmaW5lIFVJTlQ4X01BWCAgICAgICAgICAgICAgKDI1NVUpCi0jZW5kaWYKLSNpZm5kZWYgVUlOVDE2X01BWAotI2RlZmluZSBVSU5UMTZfTUFYICAgICAgICAgICAgICg2NTUzNVUpCi0jZW5kaWYKLSNpZm5kZWYgVUlOVDMyX01BWAotI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VSkKLSNlbmRpZgotCi0jZW5kaWYgLyogISBGTEVYSU5UX0ggKi8KLQotLyogJWVuZGlmICovCi0KLS8qICVpZi1jKystb25seSAqLwotLyogJWVuZGlmICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBUaGUgImNvbnN0IiBzdG9yYWdlLWNsYXNzLW1vZGlmaWVyIGlzIHZhbGlkLiAqLwotI2RlZmluZSBZWV9VU0VfQ09OU1QKLQotI2Vsc2UJLyogISBfX2NwbHVzcGx1cyAqLwotCi0vKiBDOTkgcmVxdWlyZXMgX19TVERDX18gdG8gYmUgZGVmaW5lZCBhcyAxLiAqLwotI2lmIGRlZmluZWQgKF9fU1REQ19fKQotCi0jZGVmaW5lIFlZX1VTRV9DT05TVAotCi0jZW5kaWYJLyogZGVmaW5lZCAoX19TVERDX18pICovCi0jZW5kaWYJLyogISBfX2NwbHVzcGx1cyAqLwotCi0jaWZkZWYgWVlfVVNFX0NPTlNUCi0jZGVmaW5lIHl5Y29uc3QgY29uc3QKLSNlbHNlCi0jZGVmaW5lIHl5Y29uc3QKLSNlbmRpZgotCi0vKiAlbm90LWZvci1oZWFkZXIgKi8KLQotLyogUmV0dXJuZWQgdXBvbiBlbmQtb2YtZmlsZS4gKi8KLSNkZWZpbmUgWVlfTlVMTCAwCi0vKiAlb2stZm9yLWhlYWRlciAqLwotCi0vKiAlbm90LWZvci1oZWFkZXIgKi8KLQotLyogUHJvbW90ZXMgYSBwb3NzaWJseSBuZWdhdGl2ZSwgcG9zc2libHkgc2lnbmVkIGNoYXIgdG8gYW4gdW5zaWduZWQKLSAqIGludGVnZXIgZm9yIHVzZSBhcyBhbiBhcnJheSBpbmRleC4gIElmIHRoZSBzaWduZWQgY2hhciBpcyBuZWdhdGl2ZSwKLSAqIHdlIHdhbnQgdG8gaW5zdGVhZCB0cmVhdCBpdCBhcyBhbiA4LWJpdCB1bnNpZ25lZCBjaGFyLCBoZW5jZSB0aGUKLSAqIGRvdWJsZSBjYXN0LgotICovCi0jZGVmaW5lIFlZX1NDX1RPX1VJKGMpICgodW5zaWduZWQgaW50KSAodW5zaWduZWQgY2hhcikgYykKLS8qICVvay1mb3ItaGVhZGVyICovCi0KLS8qICVpZi1yZWVudHJhbnQgKi8KLS8qICVlbmRpZiAqLwotCi0vKiAlaWYtbm90LXJlZW50cmFudCAqLwotCi0vKiAlZW5kaWYgKi8KLQotLyogRW50ZXIgYSBzdGFydCBjb25kaXRpb24uICBUaGlzIG1hY3JvIHJlYWxseSBvdWdodCB0byB0YWtlIGEgcGFyYW1ldGVyLAotICogYnV0IHdlIGRvIGl0IHRoZSBkaXNndXN0aW5nIGNydWZ0eSB3YXkgZm9yY2VkIG9uIHVzIGJ5IHRoZSAoKS1sZXNzCi0gKiBkZWZpbml0aW9uIG9mIEJFR0lOLgotICovCi0jZGVmaW5lIEJFR0lOICh5eV9zdGFydCkgPSAxICsgMiAqCi0KLS8qIFRyYW5zbGF0ZSB0aGUgY3VycmVudCBzdGFydCBzdGF0ZSBpbnRvIGEgdmFsdWUgdGhhdCBjYW4gYmUgbGF0ZXIgaGFuZGVkCi0gKiB0byBCRUdJTiB0byByZXR1cm4gdG8gdGhlIHN0YXRlLiAgVGhlIFlZU1RBVEUgYWxpYXMgaXMgZm9yIGxleAotICogY29tcGF0aWJpbGl0eS4KLSAqLwotI2RlZmluZSBZWV9TVEFSVCAoKCh5eV9zdGFydCkgLSAxKSAvIDIpCi0jZGVmaW5lIFlZU1RBVEUgWVlfU1RBUlQKLQotLyogQWN0aW9uIG51bWJlciBmb3IgRU9GIHJ1bGUgb2YgYSBnaXZlbiBzdGFydCBzdGF0ZS4gKi8KLSNkZWZpbmUgWVlfU1RBVEVfRU9GKHN0YXRlKSAoWVlfRU5EX09GX0JVRkZFUiArIHN0YXRlICsgMSkKLQotLyogU3BlY2lhbCBhY3Rpb24gbWVhbmluZyAic3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBmaWxlIi4gKi8KLSNkZWZpbmUgWVlfTkVXX0ZJTEUgeXlyZXN0YXJ0KHl5aW4gICkKLQotI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgMAotCi0vKiBTaXplIG9mIGRlZmF1bHQgaW5wdXQgYnVmZmVyLiAqLwotI2lmbmRlZiBZWV9CVUZfU0laRQotI2RlZmluZSBZWV9CVUZfU0laRSAxNjM4NAotI2VuZGlmCi0KLS8qIFRoZSBzdGF0ZSBidWYgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvbmUgc3RhdGUgcGVyIGNoYXJhY3RlciBpbiB0aGUgbWFpbiBidWZmZXIuCi0gKi8KLSNkZWZpbmUgWVlfU1RBVEVfQlVGX1NJWkUgICAoKFlZX0JVRl9TSVpFICsgMikgKiBzaXplb2YoeXlfc3RhdGVfdHlwZSkpCi0KLSNpZm5kZWYgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKLSNkZWZpbmUgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKLXR5cGVkZWYgc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSAqWVlfQlVGRkVSX1NUQVRFOwotI2VuZGlmCi0KLS8qICVpZi1ub3QtcmVlbnRyYW50ICovCi1leHRlcm4gaW50IHl5bGVuZzsKLS8qICVlbmRpZiAqLwotCi0vKiAlaWYtYy1vbmx5ICovCi0vKiAlaWYtbm90LXJlZW50cmFudCAqLwotZXh0ZXJuIEZJTEUgKnl5aW4sICp5eW91dDsKLS8qICVlbmRpZiAqLwotLyogJWVuZGlmICovCi0KLSNkZWZpbmUgRU9CX0FDVF9DT05USU5VRV9TQ0FOIDAKLSNkZWZpbmUgRU9CX0FDVF9FTkRfT0ZfRklMRSAxCi0jZGVmaW5lIEVPQl9BQ1RfTEFTVF9NQVRDSCAyCi0KLSAgICAjZGVmaW5lIFlZX0xFU1NfTElORU5PKG4pCi0gICAgCi0vKiBSZXR1cm4gYWxsIGJ1dCB0aGUgZmlyc3QgIm4iIG1hdGNoZWQgY2hhcmFjdGVycyBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW0uICovCi0jZGVmaW5lIHl5bGVzcyhuKSBcCi0JZG8gXAotCQl7IFwKLQkJLyogVW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgeXl0ZXh0LiAqLyBcCi0gICAgICAgIGludCB5eWxlc3NfbWFjcm9fYXJnID0gKG4pOyBcCi0gICAgICAgIFlZX0xFU1NfTElORU5PKHl5bGVzc19tYWNyb19hcmcpO1wKLQkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IFwKLQkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVCBcCi0JCSh5eV9jX2J1Zl9wKSA9IHl5X2NwID0geXlfYnAgKyB5eWxlc3NfbWFjcm9fYXJnIC0gWVlfTU9SRV9BREo7IFwKLQkJWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHl5dGV4dCBhZ2FpbiAqLyBcCi0JCX0gXAotCXdoaWxlICggMCApCi0KLSNkZWZpbmUgdW5wdXQoYykgeXl1bnB1dCggYywgKHl5dGV4dF9wdHIpICApCi0KLSNpZm5kZWYgWVlfVFlQRURFRl9ZWV9TSVpFX1QKLSNkZWZpbmUgWVlfVFlQRURFRl9ZWV9TSVpFX1QKLXR5cGVkZWYgc2l6ZV90IHl5X3NpemVfdDsKLSNlbmRpZgotCi0jaWZuZGVmIFlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUKLSNkZWZpbmUgWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURQotc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZQotCXsKLS8qICVpZi1jLW9ubHkgKi8KLQlGSUxFICp5eV9pbnB1dF9maWxlOwotLyogJWVuZGlmICovCi0KLS8qICVpZi1jKystb25seSAqLwotLyogJWVuZGlmICovCi0KLQljaGFyICp5eV9jaF9idWY7CQkvKiBpbnB1dCBidWZmZXIgKi8KLQljaGFyICp5eV9idWZfcG9zOwkJLyogY3VycmVudCBwb3NpdGlvbiBpbiBpbnB1dCBidWZmZXIgKi8KLQotCS8qIFNpemUgb2YgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBub3QgaW5jbHVkaW5nIHJvb20gZm9yIEVPQgotCSAqIGNoYXJhY3RlcnMuCi0JICovCi0JeXlfc2l6ZV90IHl5X2J1Zl9zaXplOwotCi0JLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1Ziwgbm90IGluY2x1ZGluZyBFT0IKLQkgKiBjaGFyYWN0ZXJzLgotCSAqLwotCWludCB5eV9uX2NoYXJzOwotCi0JLyogV2hldGhlciB3ZSAib3duIiB0aGUgYnVmZmVyIC0gaS5lLiwgd2Uga25vdyB3ZSBjcmVhdGVkIGl0LAotCSAqIGFuZCBjYW4gcmVhbGxvYygpIGl0IHRvIGdyb3cgaXQsIGFuZCBzaG91bGQgZnJlZSgpIGl0IHRvCi0JICogZGVsZXRlIGl0LgotCSAqLwotCWludCB5eV9pc19vdXJfYnVmZmVyOwotCi0JLyogV2hldGhlciB0aGlzIGlzIGFuICJpbnRlcmFjdGl2ZSIgaW5wdXQgc291cmNlOyBpZiBzbywgYW5kCi0JICogaWYgd2UncmUgdXNpbmcgc3RkaW8gZm9yIGlucHV0LCB0aGVuIHdlIHdhbnQgdG8gdXNlIGdldGMoKQotCSAqIGluc3RlYWQgb2YgZnJlYWQoKSwgdG8gbWFrZSBzdXJlIHdlIHN0b3AgZmV0Y2hpbmcgaW5wdXQgYWZ0ZXIKLQkgKiBlYWNoIG5ld2xpbmUuCi0JICovCi0JaW50IHl5X2lzX2ludGVyYWN0aXZlOwotCi0JLyogV2hldGhlciB3ZSdyZSBjb25zaWRlcmVkIHRvIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgotCSAqIElmIHNvLCAnXicgcnVsZXMgd2lsbCBiZSBhY3RpdmUgb24gdGhlIG5leHQgbWF0Y2gsIG90aGVyd2lzZQotCSAqIG5vdC4KLQkgKi8KLQlpbnQgeXlfYXRfYm9sOwotCi0gICAgaW50IHl5X2JzX2xpbmVubzsgLyoqPCBUaGUgbGluZSBjb3VudC4gKi8KLSAgICBpbnQgeXlfYnNfY29sdW1uOyAvKio8IFRoZSBjb2x1bW4gY291bnQuICovCi0gICAgCi0JLyogV2hldGhlciB0byB0cnkgdG8gZmlsbCB0aGUgaW5wdXQgYnVmZmVyIHdoZW4gd2UgcmVhY2ggdGhlCi0JICogZW5kIG9mIGl0LgotCSAqLwotCWludCB5eV9maWxsX2J1ZmZlcjsKLQotCWludCB5eV9idWZmZXJfc3RhdHVzOwotCi0jZGVmaW5lIFlZX0JVRkZFUl9ORVcgMAotI2RlZmluZSBZWV9CVUZGRVJfTk9STUFMIDEKLQkvKiBXaGVuIGFuIEVPRidzIGJlZW4gc2VlbiBidXQgdGhlcmUncyBzdGlsbCBzb21lIHRleHQgdG8gcHJvY2VzcwotCSAqIHRoZW4gd2UgbWFyayB0aGUgYnVmZmVyIGFzIFlZX0VPRl9QRU5ESU5HLCB0byBpbmRpY2F0ZSB0aGF0IHdlCi0JICogc2hvdWxkbid0IHRyeSByZWFkaW5nIGZyb20gdGhlIGlucHV0IHNvdXJjZSBhbnkgbW9yZS4gIFdlIG1pZ2h0Ci0JICogc3RpbGwgaGF2ZSBhIGJ1bmNoIG9mIHRva2VucyB0byBtYXRjaCwgdGhvdWdoLCBiZWNhdXNlIG9mCi0JICogcG9zc2libGUgYmFja2luZy11cC4KLQkgKgotCSAqIFdoZW4gd2UgYWN0dWFsbHkgc2VlIHRoZSBFT0YsIHdlIGNoYW5nZSB0aGUgc3RhdHVzIHRvICJuZXciCi0JICogKHZpYSB5eXJlc3RhcnQoKSksIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNvbnRpbnVlIHNjYW5uaW5nIGJ5Ci0JICoganVzdCBwb2ludGluZyB5eWluIGF0IGEgbmV3IGlucHV0IGZpbGUuCi0JICovCi0jZGVmaW5lIFlZX0JVRkZFUl9FT0ZfUEVORElORyAyCi0KLQl9OwotI2VuZGlmIC8qICFZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFICovCi0KLS8qICVpZi1jLW9ubHkgU3RhbmRhcmQgKG5vbi1DKyspIGRlZmluaXRpb24gKi8KLS8qICVub3QtZm9yLWhlYWRlciAqLwotCi0vKiAlaWYtbm90LXJlZW50cmFudCAqLwotCi0vKiBTdGFjayBvZiBpbnB1dCBidWZmZXJzLiAqLwotc3RhdGljIHNpemVfdCB5eV9idWZmZXJfc3RhY2tfdG9wID0gMDsgLyoqPCBpbmRleCBvZiB0b3Agb2Ygc3RhY2suICovCi1zdGF0aWMgc2l6ZV90IHl5X2J1ZmZlcl9zdGFja19tYXggPSAwOyAvKio8IGNhcGFjaXR5IG9mIHN0YWNrLiAqLwotc3RhdGljIFlZX0JVRkZFUl9TVEFURSAqIHl5X2J1ZmZlcl9zdGFjayA9IDA7IC8qKjwgU3RhY2sgYXMgYW4gYXJyYXkuICovCi0vKiAlZW5kaWYgKi8KLS8qICVvay1mb3ItaGVhZGVyICovCi0KLS8qICVlbmRpZiAqLwotCi0vKiBXZSBwcm92aWRlIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGJ1ZmZlciBzdGF0ZXMgaW4gY2FzZSBpbiB0aGUKLSAqIGZ1dHVyZSB3ZSB3YW50IHRvIHB1dCB0aGUgYnVmZmVyIHN0YXRlcyBpbiBhIG1vcmUgZ2VuZXJhbAotICogInNjYW5uZXIgc3RhdGUiLgotICoKLSAqIFJldHVybnMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG9yIE5VTEwuCi0gKi8KLSNkZWZpbmUgWVlfQ1VSUkVOVF9CVUZGRVIgKCAoeXlfYnVmZmVyX3N0YWNrKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gKHl5X2J1ZmZlcl9zdGFjaylbKHl5X2J1ZmZlcl9zdGFja190b3ApXSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCkKLQotLyogU2FtZSBhcyBwcmV2aW91cyBtYWNybywgYnV0IHVzZWZ1bCB3aGVuIHdlIGtub3cgdGhhdCB0aGUgYnVmZmVyIHN0YWNrIGlzIG5vdAotICogTlVMTCBvciB3aGVuIHdlIG5lZWQgYW4gbHZhbHVlLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCi0gKi8KLSNkZWZpbmUgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFICh5eV9idWZmZXJfc3RhY2spWyh5eV9idWZmZXJfc3RhY2tfdG9wKV0KLQotLyogJWlmLWMtb25seSBTdGFuZGFyZCAobm9uLUMrKykgZGVmaW5pdGlvbiAqLwotCi0vKiAlaWYtbm90LXJlZW50cmFudCAqLwotLyogJW5vdC1mb3ItaGVhZGVyICovCi0KLS8qIHl5X2hvbGRfY2hhciBob2xkcyB0aGUgY2hhcmFjdGVyIGxvc3Qgd2hlbiB5eXRleHQgaXMgZm9ybWVkLiAqLwotc3RhdGljIGNoYXIgeXlfaG9sZF9jaGFyOwotc3RhdGljIGludCB5eV9uX2NoYXJzOwkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1ZiAqLwotaW50IHl5bGVuZzsKLQotLyogUG9pbnRzIHRvIGN1cnJlbnQgY2hhcmFjdGVyIGluIGJ1ZmZlci4gKi8KLXN0YXRpYyBjaGFyICp5eV9jX2J1Zl9wID0gKGNoYXIgKikgMDsKLXN0YXRpYyBpbnQgeXlfaW5pdCA9IDA7CQkvKiB3aGV0aGVyIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSAqLwotc3RhdGljIGludCB5eV9zdGFydCA9IDA7CS8qIHN0YXJ0IHN0YXRlIG51bWJlciAqLwotCi0vKiBGbGFnIHdoaWNoIGlzIHVzZWQgdG8gYWxsb3cgeXl3cmFwKCkncyB0byBkbyBidWZmZXIgc3dpdGNoZXMKLSAqIGluc3RlYWQgb2Ygc2V0dGluZyB1cCBhIGZyZXNoIHl5aW4uICBBIGJpdCBvZiBhIGhhY2sgLi4uCi0gKi8KLXN0YXRpYyBpbnQgeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mOwotLyogJW9rLWZvci1oZWFkZXIgKi8KLQotLyogJWVuZGlmICovCi0KLXZvaWQgeXlyZXN0YXJ0IChGSUxFICppbnB1dF9maWxlICApOwotdm9pZCB5eV9zd2l0Y2hfdG9fYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAgKTsKLVlZX0JVRkZFUl9TVEFURSB5eV9jcmVhdGVfYnVmZmVyIChGSUxFICpmaWxlLGludCBzaXplICApOwotdm9pZCB5eV9kZWxldGVfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYiAgKTsKLXZvaWQgeXlfZmx1c2hfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYiAgKTsKLXZvaWQgeXlwdXNoX2J1ZmZlcl9zdGF0ZSAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgICk7Ci12b2lkIHl5cG9wX2J1ZmZlcl9zdGF0ZSAodm9pZCApOwotCi1zdGF0aWMgdm9pZCB5eWVuc3VyZV9idWZmZXJfc3RhY2sgKHZvaWQgKTsKLXN0YXRpYyB2b2lkIHl5X2xvYWRfYnVmZmVyX3N0YXRlICh2b2lkICk7Ci1zdGF0aWMgdm9pZCB5eV9pbml0X2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIsRklMRSAqZmlsZSAgKTsKLQotI2RlZmluZSBZWV9GTFVTSF9CVUZGRVIgeXlfZmx1c2hfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSICkKLQotWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnVmZmVyIChjaGFyICpiYXNlLHl5X3NpemVfdCBzaXplICApOwotWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKnl5X3N0ciAgKTsKLVlZX0JVRkZFUl9TVEFURSB5eV9zY2FuX2J5dGVzICh5eWNvbnN0IGNoYXIgKmJ5dGVzLGludCBsZW4gICk7Ci0KLS8qICVlbmRpZiAqLwotCi12b2lkICp5eWFsbG9jICh5eV9zaXplX3QgICk7Ci12b2lkICp5eXJlYWxsb2MgKHZvaWQgKix5eV9zaXplX3QgICk7Ci12b2lkIHl5ZnJlZSAodm9pZCAqICApOwotCi0jZGVmaW5lIHl5X25ld19idWZmZXIgeXlfY3JlYXRlX2J1ZmZlcgotCi0jZGVmaW5lIHl5X3NldF9pbnRlcmFjdGl2ZShpc19pbnRlcmFjdGl2ZSkgXAotCXsgXAotCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApeyBcCi0gICAgICAgIHl5ZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsgXAotCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSAgICBcCi0gICAgICAgICAgICB5eV9jcmVhdGVfYnVmZmVyKHl5aW4sWVlfQlVGX1NJWkUgKTsgXAotCX0gXAotCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaXNfaW50ZXJhY3RpdmUgPSBpc19pbnRlcmFjdGl2ZTsgXAotCX0KLQotI2RlZmluZSB5eV9zZXRfYm9sKGF0X2JvbCkgXAotCXsgXAotCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApe1wKLSAgICAgICAgeXllbnN1cmVfYnVmZmVyX3N0YWNrICgpOyBcCi0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9ICAgIFwKLSAgICAgICAgICAgIHl5X2NyZWF0ZV9idWZmZXIoeXlpbixZWV9CVUZfU0laRSApOyBcCi0JfSBcCi0JWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9hdF9ib2wgPSBhdF9ib2w7IFwKLQl9Ci0KLSNkZWZpbmUgWVlfQVRfQk9MKCkgKFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sKQotCi0vKiAlJSBbMS4wXSB5eXRleHQveXlpbi95eW91dC95eV9zdGF0ZV90eXBlL3l5bGluZW5vIGV0Yy4gZGVmJ3MgJiBpbml0IGdvIGhlcmUgKi8KLS8qIEJlZ2luIHVzZXIgc2VjdDMgKi8KLQotI2RlZmluZSB5eXdyYXAobikgMQotI2RlZmluZSBZWV9TS0lQX1lZV1JBUAotCi0jZGVmaW5lIEZMRVhfREVCVUcKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFlZX0NIQVI7Ci0KLUZJTEUgKnl5aW4gPSAoRklMRSAqKSAwLCAqeXlvdXQgPSAoRklMRSAqKSAwOwotCi10eXBlZGVmIGludCB5eV9zdGF0ZV90eXBlOwotCi1leHRlcm4gaW50IHl5bGluZW5vOwotCi1pbnQgeXlsaW5lbm8gPSAxOwotCi1leHRlcm4gY2hhciAqeXl0ZXh0OwotI2RlZmluZSB5eXRleHRfcHRyIHl5dGV4dAotCi0vKiAlaWYtYy1vbmx5IFN0YW5kYXJkIChub24tQysrKSBkZWZpbml0aW9uICovCi0KLXN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSAodm9pZCApOwotc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyAoeXlfc3RhdGVfdHlwZSBjdXJyZW50X3N0YXRlICApOwotc3RhdGljIGludCB5eV9nZXRfbmV4dF9idWZmZXIgKHZvaWQgKTsKLXN0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yICh5eWNvbnN0IGNoYXIgbXNnW10gICk7Ci0KLS8qICVlbmRpZiAqLwotCi0vKiBEb25lIGFmdGVyIHRoZSBjdXJyZW50IHBhdHRlcm4gaGFzIGJlZW4gbWF0Y2hlZCBhbmQgYmVmb3JlIHRoZQotICogY29ycmVzcG9uZGluZyBhY3Rpb24gLSBzZXRzIHVwIHl5dGV4dC4KLSAqLwotI2RlZmluZSBZWV9ET19CRUZPUkVfQUNUSU9OIFwKLQkoeXl0ZXh0X3B0cikgPSB5eV9icDsgXAotLyogJSUgWzIuMF0gY29kZSB0byBmaWRkbGUgeXl0ZXh0IGFuZCB5eWxlbmcgZm9yIHl5bW9yZSgpIGdvZXMgaGVyZSBcICovXAotCXl5bGVuZyA9IChzaXplX3QpICh5eV9jcCAtIHl5X2JwKTsgXAotCSh5eV9ob2xkX2NoYXIpID0gKnl5X2NwOyBcCi0JKnl5X2NwID0gJ1wwJzsgXAotLyogJSUgWzMuMF0gY29kZSB0byBjb3B5IHl5dGV4dF9wdHIgdG8geXl0ZXh0W10gZ29lcyBoZXJlLCBpZiAlYXJyYXkgXCAqL1wKLQkoeXlfY19idWZfcCkgPSB5eV9jcDsKLQotLyogJSUgWzQuMF0gZGF0YSB0YWJsZXMgZm9yIHRoZSBERkEgYW5kIHRoZSB1c2VyJ3Mgc2VjdGlvbiAxIGRlZmluaXRpb25zIGdvIGhlcmUgKi8KLSNkZWZpbmUgWVlfTlVNX1JVTEVTIDEzCi0jZGVmaW5lIFlZX0VORF9PRl9CVUZGRVIgMTQKLS8qIFRoaXMgc3RydWN0IGlzIG5vdCB1c2VkIGluIHRoaXMgc2Nhbm5lciwKLSAgIGJ1dCBpdHMgcHJlc2VuY2UgaXMgbmVjZXNzYXJ5LiAqLwotc3RydWN0IHl5X3RyYW5zX2luZm8KLQl7Ci0JZmxleF9pbnQzMl90IHl5X3ZlcmlmeTsKLQlmbGV4X2ludDMyX3QgeXlfbnh0OwotCX07Ci1zdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfYWNjZXB0WzczXSA9Ci0gICAgeyAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgMTQsICAgMTIsICAgIDQsICAgIDMsICAgMTIsICAgIDcsICAgMTIsICAgMTIsCi0gICAgICAgMTIsICAgMTIsICAgMTIsICAgIDksICAgIDksICAgMTIsICAgMTIsICAgIDcsICAgMTIsICAgMTIsCi0gICAgICAgIDQsICAgIDAsICAgIDUsICAgIDAsICAgIDcsICAgIDgsICAgIDAsICAgIDYsICAgIDAsICAgIDAsCi0gICAgICAgMTAsICAgMTAsICAgIDksICAgIDAsICAgIDAsICAgIDksICAgIDksICAgIDAsICAgIDksICAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAgIDIsICAgIDAsICAgIDAsICAgMTEsICAgIDAsICAgMTAsICAgIDAsCi0gICAgICAgMTAsICAgIDksICAgIDksICAgIDAsICAgIDAsICAgIDAsICAgMTAsICAgMTAsICAgIDAsICAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgICAgIDEsICAgIDAKLSAgICB9IDsKLQotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X2VjWzI1Nl0gPQotICAgIHsgICAwLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAzLAotICAgICAgICA0LCAgICA0LCAgICA0LCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgICAgICAxLCAgICAyLCAgICAxLCAgICA1LCAgICA2LCAgICA3LCAgICA4LCAgICA5LCAgIDEwLCAgICAxLAotICAgICAgICAxLCAgICA4LCAgIDExLCAgICAxLCAgIDEyLCAgIDEzLCAgICA4LCAgIDE0LCAgIDE1LCAgIDE1LAotICAgICAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE2LCAgIDE2LCAgICAxLCAgICAxLCAgIDE3LAotICAgICAgIDE4LCAgIDE5LCAgICAxLCAgICAxLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIxLCAgIDIyLAotICAgICAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgIDIzLCAgICA3LCAgICA3LCAgICA3LCAgICA3LAotICAgICAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgIDI0LCAgICA3LCAgICA3LCAgIDI1LCAgICA3LCAgICA3LAotICAgICAgICAxLCAgIDI2LCAgICAxLCAgICA4LCAgICA3LCAgICAxLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLAotCi0gICAgICAgMjEsICAgMjIsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgMjcsICAgIDcsICAgIDcsCi0gICAgICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgMjQsICAgIDcsICAgIDcsICAgMjUsCi0gICAgICAgIDcsICAgIDcsICAgIDEsICAgMjgsICAgIDEsICAgIDgsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0KLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMQotICAgIH0gOwotCi1zdGF0aWMgeXljb25zdCBmbGV4X2ludDMyX3QgeXlfbWV0YVsyOV0gPQotICAgIHsgICAwLAotICAgICAgICAxLCAgICAxLCAgICAyLCAgICAxLCAgICAxLCAgICAxLCAgICAzLCAgICAxLCAgICAxLCAgICAxLAotICAgICAgICA0LCAgICA0LCAgICA1LCAgICA2LCAgICA2LCAgICA2LCAgICAxLCAgICAxLCAgICAxLCAgICA3LAotICAgICAgICA4LCAgICA3LCAgICAzLCAgICAzLCAgICAzLCAgICAxLCAgICAzLCAgICAxCi0gICAgfSA7Ci0KLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9iYXNlWzg1XSA9Ci0gICAgeyAgIDAsCi0gICAgICAgIDAsICAxNDUsICAxNTAsICAyNjYsICAgMjcsICAyNjYsICAgMjUsICAgIDAsICAxMzEsICAgMjMsCi0gICAgICAgMjMsICAgMTYsICAgMjMsICAgMzksICAgMzEsICAgMjUsICAgMzksICAgNjAsICAgMjIsICAgNjUsCi0gICAgICAgNTcsICAgNDMsICAyNjYsICAgIDAsICAgIDAsICAyNjYsICAgNjEsICAyNjYsICAgIDAsICAxMjgsCi0gICAgICAgNzQsICAgIDAsICAxMTMsICAgNTksICAgNjIsICAxMTMsICAgNTIsICAgIDAsICAgIDAsICAgNzIsCi0gICAgICAgNjYsICAxMTAsICAxMDAsICAyNjYsICAgNzMsICAgNzQsICAyNjYsICAgNzAsICAyNjYsICAgOTAsCi0gICAgICAxMDMsICAyNjYsICAgODQsICAxMjksICAxMDgsICAxMTMsICAxNDMsICAyNjYsICAxMDcsICAgNjYsCi0gICAgICAxMTgsICAxMzcsICAxNjgsICAxMjAsICAgODAsICAgOTEsICAxNDUsICAxNDMsICAgODMsICAgNDEsCi0gICAgICAyNjYsICAyNjYsICAxOTAsICAxOTYsICAyMDQsICAyMTIsICAyMjAsICAyMjgsICAyMzIsICAyMzcsCi0gICAgICAyMzgsICAyNDMsICAyNDksICAyNTcKLSAgICB9IDsKLQotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2RlZls4NV0gPQotICAgIHsgICAwLAotICAgICAgIDcyLCAgICAxLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDczLCAgIDc0LCAgIDcyLCAgIDcyLAotICAgICAgIDc1LCAgIDcyLCAgIDcyLCAgIDcyLCAgIDE0LCAgIDcyLCAgIDcyLCAgIDc0LCAgIDcyLCAgIDc2LAotICAgICAgIDcyLCAgIDczLCAgIDcyLCAgIDc3LCAgIDc0LCAgIDcyLCAgIDc1LCAgIDcyLCAgIDc4LCAgIDcyLAotICAgICAgIDcyLCAgIDMxLCAgIDE0LCAgIDc5LCAgIDgwLCAgIDcyLCAgIDcyLCAgIDgxLCAgIDE1LCAgIDczLAotICAgICAgIDc1LCAgIDc2LCAgIDc2LCAgIDcyLCAgIDczLCAgIDc1LCAgIDcyLCAgIDgyLCAgIDcyLCAgIDcyLAotICAgICAgIDcyLCAgIDcyLCAgIDgxLCAgIDc2LCAgIDU0LCAgIDcyLCAgIDcyLCAgIDcyLCAgIDc2LCAgIDU0LAotICAgICAgIDc2LCAgIDc2LCAgIDc2LCAgIDU0LCAgIDgzLCAgIDc2LCAgIDYzLCAgIDgzLCAgIDg0LCAgIDg0LAotICAgICAgIDcyLCAgICAwLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLAotICAgICAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyCi0gICAgfSA7Ci0KLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9ueHRbMjk1XSA9Ci0gICAgeyAgIDAsCi0gICAgICAgIDQsICAgIDUsICAgIDYsICAgIDUsICAgIDcsICAgIDQsICAgIDgsICAgIDksICAgMTAsICAgMTEsCi0gICAgICAgIDksICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTUsICAgMTYsICAgIDksICAgMTcsICAgIDgsCi0gICAgICAgIDgsICAgIDgsICAgMTgsICAgIDgsICAgIDgsICAgIDQsICAgIDgsICAgMTksICAgMjEsICAgMjMsCi0gICAgICAgMjEsICAgMjYsICAgMjgsICAgMjYsICAgMjYsICAgMzAsICAgMzEsICAgMzEsICAgMzEsICAgMjYsCi0gICAgICAgMjYsICAgMjYsICAgMjYsICAgNzEsICAgMzksICAgMzksICAgMzksICAgMjMsICAgMjksICAgMjYsCi0gICAgICAgMjQsICAgMzIsICAgMzMsICAgMzMsICAgMzQsICAgNzIsICAgMjYsICAgMjYsICAgMjEsICAgMzUsCi0gICAgICAgMjEsICAgMzYsICAgMzcsICAgMzgsICAgNDAsICAgMzYsICAgNDMsICAgNDQsICAgMjQsICAgNDEsCi0gICAgICAgMjgsICAgMzIsICAgNTAsICAgNTAsICAgNTIsICAgMjgsICAgMjMsICAgMjMsICAgNTIsICAgMzUsCi0gICAgICAgNTYsICAgNTYsICAgNDQsICAgMjgsICAgNDIsICAgNzEsICAgMjksICAgMzEsICAgMzEsICAgMzEsCi0gICAgICAgNDIsICAgMjksICAgNTksICAgNDQsICAgNDgsICAgNDksICAgNDksICAgMjQsICAgMjQsICAgMjksCi0KLSAgICAgICA0OSwgICA0MywgICA0NCwgICA1MSwgICA1MSwgICA1MSwgICAzNiwgICAzNywgICA1OSwgICA0NCwKLSAgICAgICAzNiwgICA2NSwgICA0NCwgICA1NCwgICA1NSwgICA1NSwgICA1MSwgICA1MSwgICA1MSwgICA1OSwKLSAgICAgICA0NCwgICA2NCwgICA2NCwgICA2NCwgICA1OCwgICA1OCwgICA1NywgICA1NywgICA1NywgICA1OCwKLSAgICAgICA1OSwgICA0NCwgICA0MiwgICA2NCwgICA2NCwgICA2NCwgICA1MiwgICA3MiwgICA1OSwgICA0NCwKLSAgICAgICA0NywgICA2NiwgICA2MCwgICA2MCwgICA0MiwgICA0NCwgICA1OSwgICA2OSwgICAyNiwgICA3MiwKLSAgICAgICAyMCwgICA2MSwgICA2MiwgICA2MywgICA3MiwgICA2MSwgICA1NywgICA1NywgICA1NywgICA2NiwKLSAgICAgICA3MiwgICA3MiwgICA3MiwgICA2NiwgICA0OSwgICA0OSwgICA3MiwgICA2MSwgICA2MiwgICA0OSwKLSAgICAgICA0NCwgICA2MSwgICA3MiwgICA3MiwgICA3MiwgICA3MiwgICA3MiwgICA3MiwgICA3MiwgICA3MiwKLSAgICAgICA3MiwgICA2NywgICA2NywgICA2NywgICA3MiwgICA3MiwgICA3MiwgICA2NywgICA2NywgICA2NywKLSAgICAgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyNSwgICA3MiwKLQotICAgICAgIDcyLCAgIDI1LCAgIDI1LCAgIDI1LCAgIDI3LCAgIDI3LCAgIDI3LCAgIDI3LCAgIDI3LCAgIDI3LAotICAgICAgIDI3LCAgIDI3LCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLAotICAgICAgIDQ1LCAgIDcyLCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ2LCAgIDcyLAotICAgICAgIDQ2LCAgIDQ2LCAgIDQ2LCAgIDQ2LCAgIDQ2LCAgIDQ2LCAgIDM0LCAgIDM0LCAgIDcyLCAgIDM0LAotICAgICAgIDUxLCAgIDcyLCAgIDUxLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDU3LCAgIDcyLCAgIDU3LCAgIDY4LAotICAgICAgIDY4LCAgIDY4LCAgIDY4LCAgIDY4LCAgIDY4LCAgIDY4LCAgIDY4LCAgIDcwLCAgIDcwLCAgIDcwLAotICAgICAgIDcwLCAgIDcwLCAgIDcwLCAgIDcwLCAgIDcwLCAgICAzLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLAotICAgICAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLAotICAgICAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLAotICAgICAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyCi0KLSAgICB9IDsKLQotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2Noa1syOTVdID0KLSAgICB7ICAgMCwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgNSwgICAgNywKLSAgICAgICAgNSwgICAxMCwgICAxMSwgICAxMiwgICAxMiwgICAxMywgICAxMywgICAxMywgICAxMywgICAxOSwKLSAgICAgICAxMCwgICAxNiwgICAxNiwgICA3MCwgICAxNSwgICAxNSwgICAxNSwgICAyMiwgICAxMSwgICAxOSwKLSAgICAgICAgNywgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNSwgICAxNywgICAxNywgICAyMSwgICAxNCwKLSAgICAgICAyMSwgICAxNCwgICAxNCwgICAxNCwgICAxOCwgICAxNCwgICAyMCwgICAyMCwgICAyMiwgICAxOCwKLSAgICAgICAyNywgICAzNCwgICAzNSwgICAzNSwgICAzNywgICA0MSwgICA0MCwgICA0NSwgICAzNywgICAzNCwKLSAgICAgICA0OCwgICA0OCwgICA2NSwgICA0NiwgICA2NSwgICA2OSwgICAyNywgICAzMSwgICAzMSwgICAzMSwKLSAgICAgICA2MCwgICA0MSwgICA2NiwgICA2NiwgICAzMSwgICAzMSwgICAzMSwgICA0MCwgICA0NSwgICA0NiwKLQotICAgICAgIDMxLCAgIDQzLCAgIDQzLCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUzLCAgIDUzLCAgIDU5LCAgIDU5LAotICAgICAgIDUzLCAgIDU5LCAgIDQyLCAgIDQzLCAgIDQzLCAgIDQzLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDYxLAotICAgICAgIDYxLCAgIDU1LCAgIDU1LCAgIDU1LCAgIDUxLCAgIDUxLCAgIDU2LCAgIDU2LCAgIDU2LCAgIDUxLAotICAgICAgIDU0LCAgIDU0LCAgIDU1LCAgIDY0LCAgIDY0LCAgIDY0LCAgIDM2LCAgIDMzLCAgIDYyLCAgIDYyLAotICAgICAgIDMwLCAgIDYxLCAgIDU0LCAgIDU0LCAgIDY0LCAgIDY4LCAgIDY3LCAgIDY4LCAgICA5LCAgICAzLAotICAgICAgICAyLCAgIDU0LCAgIDU0LCAgIDU0LCAgICAwLCAgIDU0LCAgIDU3LCAgIDU3LCAgIDU3LCAgIDYyLAotICAgICAgICAwLCAgICAwLCAgICAwLCAgIDYyLCAgIDU3LCAgIDU3LCAgICAwLCAgIDY3LCAgIDY3LCAgIDU3LAotICAgICAgIDYzLCAgIDY3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgIDYzLCAgIDYzLCAgIDYzLCAgICAwLCAgICAwLCAgICAwLCAgIDYzLCAgIDYzLCAgIDYzLAotICAgICAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDc0LCAgICAwLAotCi0gICAgICAgIDAsICAgNzQsICAgNzQsICAgNzQsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsCi0gICAgICAgNzUsICAgNzUsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsCi0gICAgICAgNzcsICAgIDAsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzgsICAgIDAsCi0gICAgICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzksICAgNzksICAgIDAsICAgNzksCi0gICAgICAgODAsICAgIDAsICAgODAsICAgODEsICAgODEsICAgODEsICAgODIsICAgIDAsICAgODIsICAgODMsCi0gICAgICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODQsICAgODQsICAgODQsCi0gICAgICAgODQsICAgODQsICAgODQsICAgODQsICAgODQsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsCi0gICAgICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsCi0gICAgICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsCi0gICAgICAgNzIsICAgNzIsICAgNzIsICAgNzIKLQotICAgIH0gOwotCi1zdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKLXN0YXRpYyBjaGFyICp5eV9sYXN0X2FjY2VwdGluZ19jcG9zOwotCi1leHRlcm4gaW50IHl5X2ZsZXhfZGVidWc7Ci1pbnQgeXlfZmxleF9kZWJ1ZyA9IDE7Ci0KLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9ydWxlX2xpbmVudW1bMTNdID0KLSAgICB7ICAgMCwKLSAgICAgICA2NywgICA2OCwgICA2OSwgICA3MiwgICA3NSwgICA3NiwgICA3NywgICA4MywgICA4NCwgICA4NSwKLSAgICAgICA4NywgICA5MAotICAgIH0gOwotCi0vKiBUaGUgaW50ZW50IGJlaGluZCB0aGlzIGRlZmluaXRpb24gaXMgdGhhdCBpdCdsbCBjYXRjaAotICogYW55IHVzZXMgb2YgUkVKRUNUIHdoaWNoIGZsZXggbWlzc2VkLgotICovCi0jZGVmaW5lIFJFSkVDVCByZWplY3RfdXNlZF9idXRfbm90X2RldGVjdGVkCi0jZGVmaW5lIHl5bW9yZSgpIHl5bW9yZV91c2VkX2J1dF9ub3RfZGV0ZWN0ZWQKLSNkZWZpbmUgWVlfTU9SRV9BREogMAotI2RlZmluZSBZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUCi1jaGFyICp5eXRleHQ7Ci0jbGluZSAxICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgotLyogTGV4aWNhbCBhbmFseXNpcyBmb3IgZ2Vua3N5bXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgotCi0gICBOZXcgaW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4KLSAgIEJhc2VkIG9uIG9yaWdpbmFsIHdvcmsgYnkgQmpvcm4gRWt3YWxsIDxiajBybkBibG94LnNlPgotCi0gICBUYWtlbiBmcm9tIExpbnV4IG1vZHV0aWxzIDIuNC4yMi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLSNsaW5lIDI1ICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImdlbmtzeW1zLmgiCi0jaW5jbHVkZSAicGFyc2UuaCIKLQotLyogV2UndmUgZ290IGEgdHdvLWxldmVsIGxleGVyIGhlcmUuICBXZSBsZXQgZmxleCBkbyBiYXNpYyB0b2tlbml6YXRpb24KLSAgIGFuZCB0aGVuIHdlIGNhdGVnb3JpemUgdGhvc2UgYmFzaWMgdG9rZW5zIGluIHRoZSBzZWNvbmQgc3RhZ2UuICAqLwotI2RlZmluZSBZWV9ERUNMCQlzdGF0aWMgaW50IHl5bGV4MSh2b2lkKQotCi0vKiBXZSBkb24ndCBkbyBtdWx0aXBsZSBpbnB1dCBmaWxlcy4gICovCi0jZGVmaW5lIFlZX05PX0lOUFVUIDEKLSNsaW5lIDY2OCAic2NyaXB0cy9nZW5rc3ltcy9sZXguYyIKLQotI2RlZmluZSBJTklUSUFMIDAKLQotI2lmbmRlZiBZWV9OT19VTklTVERfSAotLyogU3BlY2lhbCBjYXNlIGZvciAidW5pc3RkLmgiLCBzaW5jZSBpdCBpcyBub24tQU5TSS4gV2UgaW5jbHVkZSBpdCB3YXkKLSAqIGRvd24gaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhlIHVzZXIncyBzZWN0aW9uIDEgdG8gaGF2ZSBiZWVuIHNjYW5uZWQgZmlyc3QuCi0gKiBUaGUgdXNlciBoYXMgYSBjaGFuY2UgdG8gb3ZlcnJpZGUgaXQgd2l0aCBhbiBvcHRpb24uCi0gKi8KLS8qICVpZi1jLW9ubHkgKi8KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLS8qICVlbmRpZiAqLwotLyogJWlmLWMrKy1vbmx5ICovCi0vKiAlZW5kaWYgKi8KLSNlbmRpZgotCi0jaWZuZGVmIFlZX0VYVFJBX1RZUEUKLSNkZWZpbmUgWVlfRVhUUkFfVFlQRSB2b2lkICoKLSNlbmRpZgotCi0vKiAlaWYtYy1vbmx5IFJlZW50cmFudCBzdHJ1Y3R1cmUgYW5kIG1hY3JvcyAobm9uLUMrKykuICovCi0vKiAlaWYtcmVlbnRyYW50ICovCi0vKiAlaWYtYy1vbmx5ICovCi0KLXN0YXRpYyBpbnQgeXlfaW5pdF9nbG9iYWxzICh2b2lkICk7Ci0KLS8qICVlbmRpZiAqLwotLyogJWlmLXJlZW50cmFudCAqLwotLyogJWVuZGlmICovCi0vKiAlZW5kaWYgRW5kIHJlZW50cmFudCBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MuICovCi0KLS8qIEFjY2Vzc29yIG1ldGhvZHMgdG8gZ2xvYmFscy4KLSAgIFRoZXNlIGFyZSBtYWRlIHZpc2libGUgdG8gbm9uLXJlZW50cmFudCBzY2FubmVycyBmb3IgY29udmVuaWVuY2UuICovCi0KLWludCB5eWxleF9kZXN0cm95ICh2b2lkICk7Ci0KLWludCB5eWdldF9kZWJ1ZyAodm9pZCApOwotCi12b2lkIHl5c2V0X2RlYnVnIChpbnQgZGVidWdfZmxhZyAgKTsKLQotWVlfRVhUUkFfVFlQRSB5eWdldF9leHRyYSAodm9pZCApOwotCi12b2lkIHl5c2V0X2V4dHJhIChZWV9FWFRSQV9UWVBFIHVzZXJfZGVmaW5lZCAgKTsKLQotRklMRSAqeXlnZXRfaW4gKHZvaWQgKTsKLQotdm9pZCB5eXNldF9pbiAgKEZJTEUgKiBpbl9zdHIgICk7Ci0KLUZJTEUgKnl5Z2V0X291dCAodm9pZCApOwotCi12b2lkIHl5c2V0X291dCAgKEZJTEUgKiBvdXRfc3RyICApOwotCi1pbnQgeXlnZXRfbGVuZyAodm9pZCApOwotCi1jaGFyICp5eWdldF90ZXh0ICh2b2lkICk7Ci0KLWludCB5eWdldF9saW5lbm8gKHZvaWQgKTsKLQotdm9pZCB5eXNldF9saW5lbm8gKGludCBsaW5lX251bWJlciAgKTsKLQotLyogJWlmLWJpc29uLWJyaWRnZSAqLwotLyogJWVuZGlmICovCi0KLS8qIE1hY3JvcyBhZnRlciB0aGlzIHBvaW50IGNhbiBhbGwgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIGRlZmluaXRpb25zIGluCi0gKiBzZWN0aW9uIDEuCi0gKi8KLQotI2lmbmRlZiBZWV9TS0lQX1lZV1JBUAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIGludCB5eXdyYXAgKHZvaWQgKTsKLSNlbHNlCi1leHRlcm4gaW50IHl5d3JhcCAodm9pZCApOwotI2VuZGlmCi0jZW5kaWYKLQotLyogJW5vdC1mb3ItaGVhZGVyICovCi0KLSAgICBzdGF0aWMgdm9pZCB5eXVucHV0IChpbnQgYyxjaGFyICpidWZfcHRyICApOwotICAgIAotLyogJW9rLWZvci1oZWFkZXIgKi8KLQotLyogJWVuZGlmICovCi0KLSNpZm5kZWYgeXl0ZXh0X3B0cgotc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5IChjaGFyICoseXljb25zdCBjaGFyICosaW50ICk7Ci0jZW5kaWYKLQotI2lmZGVmIFlZX05FRURfU1RSTEVOCi1zdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuICh5eWNvbnN0IGNoYXIgKiApOwotI2VuZGlmCi0KLSNpZm5kZWYgWVlfTk9fSU5QVVQKLS8qICVpZi1jLW9ubHkgU3RhbmRhcmQgKG5vbi1DKyspIGRlZmluaXRpb24gKi8KLS8qICVub3QtZm9yLWhlYWRlciAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLXN0YXRpYyBpbnQgeXlpbnB1dCAodm9pZCApOwotI2Vsc2UKLXN0YXRpYyBpbnQgaW5wdXQgKHZvaWQgKTsKLSNlbmRpZgotLyogJW9rLWZvci1oZWFkZXIgKi8KLQotLyogJWVuZGlmICovCi0jZW5kaWYKLQotLyogJWlmLWMtb25seSAqLwotCi0vKiAlZW5kaWYgKi8KLQotLyogQW1vdW50IG9mIHN0dWZmIHRvIHNsdXJwIHVwIHdpdGggZWFjaCByZWFkLiAqLwotI2lmbmRlZiBZWV9SRUFEX0JVRl9TSVpFCi0jZGVmaW5lIFlZX1JFQURfQlVGX1NJWkUgODE5MgotI2VuZGlmCi0KLS8qIENvcHkgd2hhdGV2ZXIgdGhlIGxhc3QgcnVsZSBtYXRjaGVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuICovCi0jaWZuZGVmIEVDSE8KLS8qICVpZi1jLW9ubHkgU3RhbmRhcmQgKG5vbi1DKyspIGRlZmluaXRpb24gKi8KLS8qIFRoaXMgdXNlZCB0byBiZSBhbiBmcHV0cygpLCBidXQgc2luY2UgdGhlIHN0cmluZyBtaWdodCBjb250YWluIE5VTCdzLAotICogd2Ugbm93IHVzZSBmd3JpdGUoKS4KLSAqLwotI2RlZmluZSBFQ0hPIGZ3cml0ZSggeXl0ZXh0LCB5eWxlbmcsIDEsIHl5b3V0ICkKLS8qICVlbmRpZiAqLwotLyogJWlmLWMrKy1vbmx5IEMrKyBkZWZpbml0aW9uICovCi0vKiAlZW5kaWYgKi8KLSNlbmRpZgotCi0vKiBHZXRzIGlucHV0IGFuZCBzdHVmZnMgaXQgaW50byAiYnVmIi4gIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIFlZX05VTEwsCi0gKiBpcyByZXR1cm5lZCBpbiAicmVzdWx0Ii4KLSAqLwotI2lmbmRlZiBZWV9JTlBVVAotI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSBcCi0vKiAlJSBbNS4wXSBmcmVhZCgpL3JlYWQoKSBkZWZpbml0aW9uIG9mIFlZX0lOUFVUIGdvZXMgaGVyZSB1bmxlc3Mgd2UncmUgZG9pbmcgQysrIFwgKi9cCi0JaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lzX2ludGVyYWN0aXZlICkgXAotCQl7IFwKLQkJaW50IGMgPSAnKic7IFwKLQkJaW50IG47IFwKLQkJZm9yICggbiA9IDA7IG4gPCBtYXhfc2l6ZSAmJiBcCi0JCQkgICAgIChjID0gZ2V0YyggeXlpbiApKSAhPSBFT0YgJiYgYyAhPSAnXG4nOyArK24gKSBcCi0JCQlidWZbbl0gPSAoY2hhcikgYzsgXAotCQlpZiAoIGMgPT0gJ1xuJyApIFwKLQkJCWJ1ZltuKytdID0gKGNoYXIpIGM7IFwKLQkJaWYgKCBjID09IEVPRiAmJiBmZXJyb3IoIHl5aW4gKSApIFwKLQkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAotCQlyZXN1bHQgPSBuOyBcCi0JCX0gXAotCWVsc2UgXAotCQl7IFwKLQkJZXJybm89MDsgXAotCQl3aGlsZSAoIChyZXN1bHQgPSBmcmVhZChidWYsIDEsIG1heF9zaXplLCB5eWluKSk9PTAgJiYgZmVycm9yKHl5aW4pKSBcCi0JCQl7IFwKLQkJCWlmKCBlcnJubyAhPSBFSU5UUikgXAotCQkJCXsgXAotCQkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAotCQkJCWJyZWFrOyBcCi0JCQkJfSBcCi0JCQllcnJubz0wOyBcCi0JCQljbGVhcmVycih5eWluKTsgXAotCQkJfSBcCi0JCX1cCi1cCi0vKiAlaWYtYysrLW9ubHkgQysrIGRlZmluaXRpb24gXCAqL1wKLS8qICVlbmRpZiAqLwotCi0jZW5kaWYKLQotLyogTm8gc2VtaS1jb2xvbiBhZnRlciByZXR1cm47IGNvcnJlY3QgdXNhZ2UgaXMgdG8gd3JpdGUgInl5dGVybWluYXRlKCk7IiAtCi0gKiB3ZSBkb24ndCB3YW50IGFuIGV4dHJhICc7JyBhZnRlciB0aGUgInJldHVybiIgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UKLSAqIHNvbWUgY29tcGlsZXJzIHRvIGNvbXBsYWluIGFib3V0IHVucmVhY2hhYmxlIHN0YXRlbWVudHMuCi0gKi8KLSNpZm5kZWYgeXl0ZXJtaW5hdGUKLSNkZWZpbmUgeXl0ZXJtaW5hdGUoKSByZXR1cm4gWVlfTlVMTAotI2VuZGlmCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGJ5IHdoaWNoIHN0YXJ0LWNvbmRpdGlvbiBzdGFjayBncm93cy4gKi8KLSNpZm5kZWYgWVlfU1RBUlRfU1RBQ0tfSU5DUgotI2RlZmluZSBZWV9TVEFSVF9TVEFDS19JTkNSIDI1Ci0jZW5kaWYKLQotLyogUmVwb3J0IGEgZmF0YWwgZXJyb3IuICovCi0jaWZuZGVmIFlZX0ZBVEFMX0VSUk9SCi0vKiAlaWYtYy1vbmx5ICovCi0jZGVmaW5lIFlZX0ZBVEFMX0VSUk9SKG1zZykgeXlfZmF0YWxfZXJyb3IoIG1zZyApCi0vKiAlZW5kaWYgKi8KLS8qICVpZi1jKystb25seSAqLwotLyogJWVuZGlmICovCi0jZW5kaWYKLQotLyogJWlmLXRhYmxlcy1zZXJpYWxpemF0aW9uIHN0cnVjdHVyZXMgYW5kIHByb3RvdHlwZXMgKi8KLS8qICVub3QtZm9yLWhlYWRlciAqLwotCi0vKiAlb2stZm9yLWhlYWRlciAqLwotCi0vKiAlbm90LWZvci1oZWFkZXIgKi8KLQotLyogJXRhYmxlcy15eWRtYXAgZ2VuZXJhdGVkIGVsZW1lbnRzICovCi0vKiAlZW5kaWYgKi8KLS8qIGVuZCB0YWJsZXMgc2VyaWFsaXphdGlvbiBzdHJ1Y3R1cmVzIGFuZCBwcm90b3R5cGVzICovCi0KLS8qICVvay1mb3ItaGVhZGVyICovCi0KLS8qIERlZmF1bHQgZGVjbGFyYXRpb24gb2YgZ2VuZXJhdGVkIHNjYW5uZXIgLSBhIGRlZmluZSBzbyB0aGUgdXNlciBjYW4KLSAqIGVhc2lseSBhZGQgcGFyYW1ldGVycy4KLSAqLwotI2lmbmRlZiBZWV9ERUNMCi0jZGVmaW5lIFlZX0RFQ0xfSVNfT1VSUyAxCi0vKiAlaWYtYy1vbmx5IFN0YW5kYXJkIChub24tQysrKSBkZWZpbml0aW9uICovCi0KLWV4dGVybiBpbnQgeXlsZXggKHZvaWQpOwotCi0jZGVmaW5lIFlZX0RFQ0wgaW50IHl5bGV4ICh2b2lkKQotLyogJWVuZGlmICovCi0vKiAlaWYtYysrLW9ubHkgQysrIGRlZmluaXRpb24gKi8KLS8qICVlbmRpZiAqLwotI2VuZGlmIC8qICFZWV9ERUNMICovCi0KLS8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bGUsIGFmdGVyIHl5dGV4dCBhbmQgeXlsZW5nCi0gKiBoYXZlIGJlZW4gc2V0IHVwLgotICovCi0jaWZuZGVmIFlZX1VTRVJfQUNUSU9OCi0jZGVmaW5lIFlZX1VTRVJfQUNUSU9OCi0jZW5kaWYKLQotLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggcnVsZS4gKi8KLSNpZm5kZWYgWVlfQlJFQUsKLSNkZWZpbmUgWVlfQlJFQUsgYnJlYWs7Ci0jZW5kaWYKLQotLyogJSUgWzYuMF0gWVlfUlVMRV9TRVRVUCBkZWZpbml0aW9uIGdvZXMgaGVyZSAqLwotI2RlZmluZSBZWV9SVUxFX1NFVFVQIFwKLQlpZiAoIHl5bGVuZyA+IDAgKSBcCi0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sID0gXAotCQkJCSh5eXRleHRbeXlsZW5nIC0gMV0gPT0gJ1xuJyk7IFwKLQlZWV9VU0VSX0FDVElPTgotCi0vKiAlbm90LWZvci1oZWFkZXIgKi8KLQotLyoqIFRoZSBtYWluIHNjYW5uZXIgZnVuY3Rpb24gd2hpY2ggZG9lcyBhbGwgdGhlIHdvcmsuCi0gKi8KLVlZX0RFQ0wKLXsKLQlyZWdpc3RlciB5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGU7Ci0JcmVnaXN0ZXIgY2hhciAqeXlfY3AsICp5eV9icDsKLQlyZWdpc3RlciBpbnQgeXlfYWN0OwotICAgIAotLyogJSUgWzcuMF0gdXNlcidzIGRlY2xhcmF0aW9ucyBnbyBoZXJlICovCi0jbGluZSA2MyAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKLQotCi0KLSAvKiBLZWVwIHRyYWNrIG9mIG91ciBsb2NhdGlvbiBpbiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLiAgKi8KLSNsaW5lIDkxOCAic2NyaXB0cy9nZW5rc3ltcy9sZXguYyIKLQotCWlmICggISh5eV9pbml0KSApCi0JCXsKLQkJKHl5X2luaXQpID0gMTsKLQotI2lmZGVmIFlZX1VTRVJfSU5JVAotCQlZWV9VU0VSX0lOSVQ7Ci0jZW5kaWYKLQotCQlpZiAoICEgKHl5X3N0YXJ0KSApCi0JCQkoeXlfc3RhcnQpID0gMTsJLyogZmlyc3Qgc3RhcnQgc3RhdGUgKi8KLQotCQlpZiAoICEgeXlpbiApCi0vKiAlaWYtYy1vbmx5ICovCi0JCQl5eWluID0gc3RkaW47Ci0vKiAlZW5kaWYgKi8KLS8qICVpZi1jKystb25seSAqLwotLyogJWVuZGlmICovCi0KLQkJaWYgKCAhIHl5b3V0ICkKLS8qICVpZi1jLW9ubHkgKi8KLQkJCXl5b3V0ID0gc3Rkb3V0OwotLyogJWVuZGlmICovCi0vKiAlaWYtYysrLW9ubHkgKi8KLS8qICVlbmRpZiAqLwotCi0JCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApIHsKLQkJCXl5ZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsKLQkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9Ci0JCQkJeXlfY3JlYXRlX2J1ZmZlcih5eWluLFlZX0JVRl9TSVpFICk7Ci0JCX0KLQotCQl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKLQkJfQotCi0Jd2hpbGUgKCAxICkJCS8qIGxvb3BzIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQgKi8KLQkJewotLyogJSUgWzguMF0geXltb3JlKCktcmVsYXRlZCBjb2RlIGdvZXMgaGVyZSAqLwotCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKLQotCQkvKiBTdXBwb3J0IG9mIHl5dGV4dC4gKi8KLQkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7Ci0KLQkJLyogeXlfYnAgcG9pbnRzIHRvIHRoZSBwb3NpdGlvbiBpbiB5eV9jaF9idWYgb2YgdGhlIHN0YXJ0IG9mCi0JCSAqIHRoZSBjdXJyZW50IHJ1bi4KLQkJICovCi0JCXl5X2JwID0geXlfY3A7Ci0KLS8qICUlIFs5LjBdIGNvZGUgdG8gc2V0IHVwIGFuZCBmaW5kIG5leHQgbWF0Y2ggZ29lcyBoZXJlICovCi0JCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfc3RhcnQpOwotCQl5eV9jdXJyZW50X3N0YXRlICs9IFlZX0FUX0JPTCgpOwoteXlfbWF0Y2g6Ci0JCWRvCi0JCQl7Ci0JCQlyZWdpc3RlciBZWV9DSEFSIHl5X2MgPSB5eV9lY1tZWV9TQ19UT19VSSgqeXlfY3ApXTsKLQkJCWlmICggeXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdICkKLQkJCQl7Ci0JCQkJKHl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlKSA9IHl5X2N1cnJlbnRfc3RhdGU7Ci0JCQkJKHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MpID0geXlfY3A7Ci0JCQkJfQotCQkJd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQotCQkJCXsKLQkJCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOwotCQkJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA3MyApCi0JCQkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOwotCQkJCX0KLQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOwotCQkJKyt5eV9jcDsKLQkJCX0KLQkJd2hpbGUgKCB5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICE9IDI2NiApOwotCi15eV9maW5kX2FjdGlvbjoKLS8qICUlIFsxMC4wXSBjb2RlIHRvIGZpbmQgdGhlIGFjdGlvbiBudW1iZXIgZ29lcyBoZXJlICovCi0JCXl5X2FjdCA9IHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXTsKLQkJaWYgKCB5eV9hY3QgPT0gMCApCi0JCQl7IC8qIGhhdmUgdG8gYmFjayB1cCAqLwotCQkJeXlfY3AgPSAoeXlfbGFzdF9hY2NlcHRpbmdfY3Bvcyk7Ci0JCQl5eV9jdXJyZW50X3N0YXRlID0gKHl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlKTsKLQkJCXl5X2FjdCA9IHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXTsKLQkJCX0KLQotCQlZWV9ET19CRUZPUkVfQUNUSU9OOwotCi0vKiAlJSBbMTEuMF0gY29kZSBmb3IgeXlsaW5lbm8gdXBkYXRlIGdvZXMgaGVyZSAqLwotCi1kb19hY3Rpb246CS8qIFRoaXMgbGFiZWwgaXMgdXNlZCBvbmx5IHRvIGFjY2VzcyBFT0YgYWN0aW9ucy4gKi8KLQotLyogJSUgWzEyLjBdIGRlYnVnIGNvZGUgZ29lcyBoZXJlICovCi0JCWlmICggeXlfZmxleF9kZWJ1ZyApCi0JCQl7Ci0JCQlpZiAoIHl5X2FjdCA9PSAwICkKLQkJCQlmcHJpbnRmKCBzdGRlcnIsICItLXNjYW5uZXIgYmFja2luZyB1cFxuIiApOwotCQkJZWxzZSBpZiAoIHl5X2FjdCA8IDEzICkKLQkJCQlmcHJpbnRmKCBzdGRlcnIsICItLWFjY2VwdGluZyBydWxlIGF0IGxpbmUgJWxkIChcIiVzXCIpXG4iLAotCQkJCSAgICAgICAgIChsb25nKXl5X3J1bGVfbGluZW51bVt5eV9hY3RdLCB5eXRleHQgKTsKLQkJCWVsc2UgaWYgKCB5eV9hY3QgPT0gMTMgKQotCQkJCWZwcmludGYoIHN0ZGVyciwgIi0tYWNjZXB0aW5nIGRlZmF1bHQgcnVsZSAoXCIlc1wiKVxuIiwKLQkJCQkgICAgICAgICB5eXRleHQgKTsKLQkJCWVsc2UgaWYgKCB5eV9hY3QgPT0gMTQgKQotCQkJCWZwcmludGYoIHN0ZGVyciwgIi0tKGVuZCBvZiBidWZmZXIgb3IgYSBOVUwpXG4iICk7Ci0JCQllbHNlCi0JCQkJZnByaW50Ziggc3RkZXJyLCAiLS1FT0YgKHN0YXJ0IGNvbmRpdGlvbiAlZClcbiIsIFlZX1NUQVJUICk7Ci0JCQl9Ci0KLQkJc3dpdGNoICggeXlfYWN0ICkKLQl7IC8qIGJlZ2lubmluZyBvZiBhY3Rpb24gc3dpdGNoICovCi0vKiAlJSBbMTMuMF0gYWN0aW9ucyBnbyBoZXJlICovCi0JCQljYXNlIDA6IC8qIG11c3QgYmFjayB1cCAqLwotCQkJLyogdW5kbyB0aGUgZWZmZWN0cyBvZiBZWV9ET19CRUZPUkVfQUNUSU9OICovCi0JCQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsKLQkJCXl5X2NwID0gKHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MpOwotCQkJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSk7Ci0JCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOwotCi1jYXNlIDE6Ci0vKiBydWxlIDEgY2FuIG1hdGNoIGVvbCAqLwotWVlfUlVMRV9TRVRVUAotI2xpbmUgNjcgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCi1yZXR1cm4gRklMRU5BTUU7Ci0JWVlfQlJFQUsKLWNhc2UgMjoKLS8qIHJ1bGUgMiBjYW4gbWF0Y2ggZW9sICovCi1ZWV9SVUxFX1NFVFVQCi0jbGluZSA2OCAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKLWN1cl9saW5lKys7Ci0JWVlfQlJFQUsKLWNhc2UgMzoKLS8qIHJ1bGUgMyBjYW4gbWF0Y2ggZW9sICovCi1ZWV9SVUxFX1NFVFVQCi0jbGluZSA2OSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKLWN1cl9saW5lKys7Ci0JWVlfQlJFQUsKLS8qIElnbm9yZSBhbGwgb3RoZXIgd2hpdGVzcGFjZS4gICovCi1jYXNlIDQ6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSA3MiAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKLTsKLQlZWV9CUkVBSwotY2FzZSA1OgotLyogcnVsZSA1IGNhbiBtYXRjaCBlb2wgKi8KLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDc1ICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgotcmV0dXJuIFNUUklORzsKLQlZWV9CUkVBSwotY2FzZSA2OgotLyogcnVsZSA2IGNhbiBtYXRjaCBlb2wgKi8KLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDc2ICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgotcmV0dXJuIENIQVI7Ci0JWVlfQlJFQUsKLWNhc2UgNzoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDc3ICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgotcmV0dXJuIElERU5UOwotCVlZX0JSRUFLCi0vKiBUaGUgUGVkYW50IHJlcXVpcmVzIHRoYXQgdGhlIG90aGVyIEMgbXVsdGktY2hhcmFjdGVyIHRva2VucyBiZQotICAgIHJlY29nbml6ZWQgYXMgdG9rZW5zLiAgV2UgZG9uJ3QgYWN0dWFsbHkgdXNlIHRoZW0gc2luY2Ugd2UgZG9uJ3QKLSAgICBwYXJzZSBleHByZXNzaW9ucywgYnV0IHdlIGRvIHdhbnQgd2hpdGVzcGFjZSB0byBiZSBhcnJhbmdlZAotICAgIGFyb3VuZCB0aGVtIHByb3Blcmx5LiAgKi8KLWNhc2UgODoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDgzICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgotcmV0dXJuIE9USEVSOwotCVlZX0JSRUFLCi1jYXNlIDk6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSA4NCAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKLXJldHVybiBJTlQ7Ci0JWVlfQlJFQUsKLWNhc2UgMTA6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSA4NSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKLXJldHVybiBSRUFMOwotCVlZX0JSRUFLCi1jYXNlIDExOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgODcgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCi1yZXR1cm4gRE9UUzsKLQlZWV9CUkVBSwotLyogQWxsIG90aGVyIHRva2VucyBhcmUgc2luZ2xlIGNoYXJhY3RlcnMuICAqLwotY2FzZSAxMjoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDkwICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgotcmV0dXJuIHl5dGV4dFswXTsKLQlZWV9CUkVBSwotY2FzZSAxMzoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDkzICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgotRUNITzsKLQlZWV9CUkVBSwotI2xpbmUgMTEwOSAic2NyaXB0cy9nZW5rc3ltcy9sZXguYyIKLWNhc2UgWVlfU1RBVEVfRU9GKElOSVRJQUwpOgotCXl5dGVybWluYXRlKCk7Ci0KLQljYXNlIFlZX0VORF9PRl9CVUZGRVI6Ci0JCXsKLQkJLyogQW1vdW50IG9mIHRleHQgbWF0Y2hlZCBub3QgaW5jbHVkaW5nIHRoZSBFT0IgY2hhci4gKi8KLQkJaW50IHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQgPSAoaW50KSAoeXlfY3AgLSAoeXl0ZXh0X3B0cikpIC0gMTsKLQotCQkvKiBVbmRvIHRoZSBlZmZlY3RzIG9mIFlZX0RPX0JFRk9SRV9BQ1RJT04uICovCi0JCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOwotCQlZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUCi0KLQkJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPT0gWVlfQlVGRkVSX05FVyApCi0JCQl7Ci0JCQkvKiBXZSdyZSBzY2FubmluZyBhIG5ldyBmaWxlIG9yIGlucHV0IHNvdXJjZS4gIEl0J3MKLQkJCSAqIHBvc3NpYmxlIHRoYXQgdGhpcyBoYXBwZW5lZCBiZWNhdXNlIHRoZSB1c2VyCi0JCQkgKiBqdXN0IHBvaW50ZWQgeXlpbiBhdCBhIG5ldyBzb3VyY2UgYW5kIGNhbGxlZAotCQkJICogeXlsZXgoKS4gIElmIHNvLCB0aGVuIHdlIGhhdmUgdG8gYXNzdXJlCi0JCQkgKiBjb25zaXN0ZW5jeSBiZXR3ZWVuIFlZX0NVUlJFTlRfQlVGRkVSIGFuZCBvdXIKLQkJCSAqIGdsb2JhbHMuICBIZXJlIGlzIHRoZSByaWdodCBwbGFjZSB0byBkbyBzbywgYmVjYXVzZQotCQkJICogdGhpcyBpcyB0aGUgZmlyc3QgYWN0aW9uIChvdGhlciB0aGFuIHBvc3NpYmx5IGEKLQkJCSAqIGJhY2stdXApIHRoYXQgd2lsbCBtYXRjaCBmb3IgdGhlIG5ldyBpbnB1dCBzb3VyY2UuCi0JCQkgKi8KLQkJCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFyczsKLQkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaW5wdXRfZmlsZSA9IHl5aW47Ci0JCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTk9STUFMOwotCQkJfQotCi0JCS8qIE5vdGUgdGhhdCBoZXJlIHdlIHRlc3QgZm9yIHl5X2NfYnVmX3AgIjw9IiB0byB0aGUgcG9zaXRpb24KLQkJICogb2YgdGhlIGZpcnN0IEVPQiBpbiB0aGUgYnVmZmVyLCBzaW5jZSB5eV9jX2J1Zl9wIHdpbGwKLQkJICogYWxyZWFkeSBoYXZlIGJlZW4gaW5jcmVtZW50ZWQgcGFzdCB0aGUgTlVMIGNoYXJhY3RlcgotCQkgKiAoc2luY2UgYWxsIHN0YXRlcyBtYWtlIHRyYW5zaXRpb25zIG9uIEVPQiB0byB0aGUKLQkJICogZW5kLW9mLWJ1ZmZlciBzdGF0ZSkuICBDb250cmFzdCB0aGlzIHdpdGggdGhlIHRlc3QKLQkJICogaW4gaW5wdXQoKS4KLQkJICovCi0JCWlmICggKHl5X2NfYnVmX3ApIDw9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldICkKLQkJCXsgLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLwotCQkJeXlfc3RhdGVfdHlwZSB5eV9uZXh0X3N0YXRlOwotCi0JCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0OwotCi0JCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCAgKTsKLQotCQkJLyogT2theSwgd2UncmUgbm93IHBvc2l0aW9uZWQgdG8gbWFrZSB0aGUgTlVMCi0JCQkgKiB0cmFuc2l0aW9uLiAgV2UgY291bGRuJ3QgaGF2ZQotCQkJICogeXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCkgZ28gYWhlYWQgYW5kIGRvIGl0Ci0JCQkgKiBmb3IgdXMgYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgaG93IHRvIGRlYWwKLQkJCSAqIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mIGphbW1pbmcgKGFuZCB3ZSBkb24ndAotCQkJICogd2FudCB0byBidWlsZCBqYW1taW5nIGludG8gaXQgYmVjYXVzZSB0aGVuIGl0Ci0JCQkgKiB3aWxsIHJ1biBtb3JlIHNsb3dseSkuCi0JCQkgKi8KLQotCQkJeXlfbmV4dF9zdGF0ZSA9IHl5X3RyeV9OVUxfdHJhbnMoIHl5X2N1cnJlbnRfc3RhdGUgKTsKLQotCQkJeXlfYnAgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKLQotCQkJaWYgKCB5eV9uZXh0X3N0YXRlICkKLQkJCQl7Ci0JCQkJLyogQ29uc3VtZSB0aGUgTlVMLiAqLwotCQkJCXl5X2NwID0gKysoeXlfY19idWZfcCk7Ci0JCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X25leHRfc3RhdGU7Ci0JCQkJZ290byB5eV9tYXRjaDsKLQkJCQl9Ci0KLQkJCWVsc2UKLQkJCQl7Ci0vKiAlJSBbMTQuMF0gY29kZSB0byBkbyBiYWNrLXVwIGZvciBjb21wcmVzc2VkIHRhYmxlcyBhbmQgc2V0IHVwIHl5X2NwIGdvZXMgaGVyZSAqLwotCQkJCXl5X2NwID0gKHl5X2NfYnVmX3ApOwotCQkJCWdvdG8geXlfZmluZF9hY3Rpb247Ci0JCQkJfQotCQkJfQotCi0JCWVsc2Ugc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCAgKSApCi0JCQl7Ci0JCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6Ci0JCQkJewotCQkJCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMDsKLQotCQkJCWlmICggeXl3cmFwKCApICkKLQkJCQkJewotCQkJCQkvKiBOb3RlOiBiZWNhdXNlIHdlJ3ZlIHRha2VuIGNhcmUgaW4KLQkJCQkJICogeXlfZ2V0X25leHRfYnVmZmVyKCkgdG8gaGF2ZSBzZXQgdXAKLQkJCQkJICogeXl0ZXh0LCB3ZSBjYW4gbm93IHNldCB1cAotCQkJCQkgKiB5eV9jX2J1Zl9wIHNvIHRoYXQgaWYgc29tZSB0b3RhbAotCQkJCQkgKiBob3NlciAobGlrZSBmbGV4IGl0c2VsZikgd2FudHMgdG8KLQkJCQkJICogY2FsbCB0aGUgc2Nhbm5lciBhZnRlciB3ZSByZXR1cm4gdGhlCi0JCQkJCSAqIFlZX05VTEwsIGl0J2xsIHN0aWxsIHdvcmsgLSBhbm90aGVyCi0JCQkJCSAqIFlZX05VTEwgd2lsbCBnZXQgcmV0dXJuZWQuCi0JCQkJCSAqLwotCQkJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKLQotCQkJCQl5eV9hY3QgPSBZWV9TVEFURV9FT0YoWVlfU1RBUlQpOwotCQkJCQlnb3RvIGRvX2FjdGlvbjsKLQkJCQkJfQotCi0JCQkJZWxzZQotCQkJCQl7Ci0JCQkJCWlmICggISAoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSApCi0JCQkJCQlZWV9ORVdfRklMRTsKLQkJCQkJfQotCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46Ci0JCQkJKHl5X2NfYnVmX3ApID0KLQkJCQkJKHl5dGV4dF9wdHIpICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKLQotCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoICApOwotCi0JCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7Ci0JCQkJeXlfYnAgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKLQkJCQlnb3RvIHl5X21hdGNoOwotCi0JCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKLQkJCQkoeXlfY19idWZfcCkgPQotCQkJCSZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldOwotCi0JCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7Ci0KLQkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKLQkJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOwotCQkJCWdvdG8geXlfZmluZF9hY3Rpb247Ci0JCQl9Ci0JCWJyZWFrOwotCQl9Ci0KLQlkZWZhdWx0OgotCQlZWV9GQVRBTF9FUlJPUigKLQkJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLW5vIGFjdGlvbiBmb3VuZCIgKTsKLQl9IC8qIGVuZCBvZiBhY3Rpb24gc3dpdGNoICovCi0JCX0gLyogZW5kIG9mIHNjYW5uaW5nIG9uZSB0b2tlbiAqLwotfSAvKiBlbmQgb2YgeXlsZXggKi8KLS8qICVvay1mb3ItaGVhZGVyICovCi0KLS8qICVpZi1jKystb25seSAqLwotLyogJW5vdC1mb3ItaGVhZGVyICovCi0KLS8qICVvay1mb3ItaGVhZGVyICovCi0KLS8qICVlbmRpZiAqLwotCi0vKiB5eV9nZXRfbmV4dF9idWZmZXIgLSB0cnkgdG8gcmVhZCBpbiBhIG5ldyBidWZmZXIKLSAqCi0gKiBSZXR1cm5zIGEgY29kZSByZXByZXNlbnRpbmcgYW4gYWN0aW9uOgotICoJRU9CX0FDVF9MQVNUX01BVENIIC0KLSAqCUVPQl9BQ1RfQ09OVElOVUVfU0NBTiAtIGNvbnRpbnVlIHNjYW5uaW5nIGZyb20gY3VycmVudCBwb3NpdGlvbgotICoJRU9CX0FDVF9FTkRfT0ZfRklMRSAtIGVuZCBvZiBmaWxlCi0gKi8KLS8qICVpZi1jLW9ubHkgKi8KLXN0YXRpYyBpbnQgeXlfZ2V0X25leHRfYnVmZmVyICh2b2lkKQotLyogJWVuZGlmICovCi0vKiAlaWYtYysrLW9ubHkgKi8KLS8qICVlbmRpZiAqLwotewotICAgIAlyZWdpc3RlciBjaGFyICpkZXN0ID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWY7Ci0JcmVnaXN0ZXIgY2hhciAqc291cmNlID0gKHl5dGV4dF9wdHIpOwotCXJlZ2lzdGVyIGludCBudW1iZXJfdG9fbW92ZSwgaTsKLQlpbnQgcmV0X3ZhbDsKLQotCWlmICggKHl5X2NfYnVmX3ApID4gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKSArIDFdICkKLQkJWVlfRkFUQUxfRVJST1IoCi0JCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkIiApOwotCi0JaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2ZpbGxfYnVmZmVyID09IDAgKQotCQl7IC8qIERvbid0IHRyeSB0byBmaWxsIHRoZSBidWZmZXIsIHNvIHRoaXMgaXMgYW4gRU9GLiAqLwotCQlpZiAoICh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKSAtIFlZX01PUkVfQURKID09IDEgKQotCQkJewotCQkJLyogV2UgbWF0Y2hlZCBhIHNpbmdsZSBjaGFyYWN0ZXIsIHRoZSBFT0IsIHNvCi0JCQkgKiB0cmVhdCB0aGlzIGFzIGEgZmluYWwgRU9GLgotCQkJICovCi0JCQlyZXR1cm4gRU9CX0FDVF9FTkRfT0ZfRklMRTsKLQkJCX0KLQotCQllbHNlCi0JCQl7Ci0JCQkvKiBXZSBtYXRjaGVkIHNvbWUgdGV4dCBwcmlvciB0byB0aGUgRU9CLCBmaXJzdAotCQkJICogcHJvY2VzcyBpdC4KLQkJCSAqLwotCQkJcmV0dXJuIEVPQl9BQ1RfTEFTVF9NQVRDSDsKLQkJCX0KLQkJfQotCi0JLyogVHJ5IHRvIHJlYWQgbW9yZSBkYXRhLiAqLwotCi0JLyogRmlyc3QgbW92ZSBsYXN0IGNoYXJzIHRvIHN0YXJ0IG9mIGJ1ZmZlci4gKi8KLQludW1iZXJfdG9fbW92ZSA9IChpbnQpICgoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cikpIC0gMTsKLQotCWZvciAoIGkgPSAwOyBpIDwgbnVtYmVyX3RvX21vdmU7ICsraSApCi0JCSooZGVzdCsrKSA9ICooc291cmNlKyspOwotCi0JaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPT0gWVlfQlVGRkVSX0VPRl9QRU5ESU5HICkKLQkJLyogZG9uJ3QgZG8gdGhlIHJlYWQsIGl0J3Mgbm90IGd1YXJhbnRlZWQgdG8gcmV0dXJuIGFuIEVPRiwKLQkJICoganVzdCBmb3JjZSBhbiBFT0YKLQkJICovCi0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKSA9IDA7Ci0KLQllbHNlCi0JCXsKLQkJCWludCBudW1fdG9fcmVhZCA9Ci0JCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplIC0gbnVtYmVyX3RvX21vdmUgLSAxOwotCi0JCXdoaWxlICggbnVtX3RvX3JlYWQgPD0gMCApCi0JCQl7IC8qIE5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgYnVmZmVyIC0gZ3JvdyBpdC4gKi8KLQotCQkJLyoganVzdCBhIHNob3J0ZXIgbmFtZSBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyICovCi0JCQlZWV9CVUZGRVJfU1RBVEUgYiA9IFlZX0NVUlJFTlRfQlVGRkVSOwotCi0JCQlpbnQgeXlfY19idWZfcF9vZmZzZXQgPQotCQkJCShpbnQpICgoeXlfY19idWZfcCkgLSBiLT55eV9jaF9idWYpOwotCi0JCQlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQotCQkJCXsKLQkJCQlpbnQgbmV3X3NpemUgPSBiLT55eV9idWZfc2l6ZSAqIDI7Ci0KLQkJCQlpZiAoIG5ld19zaXplIDw9IDAgKQotCQkJCQliLT55eV9idWZfc2l6ZSArPSBiLT55eV9idWZfc2l6ZSAvIDg7Ci0JCQkJZWxzZQotCQkJCQliLT55eV9idWZfc2l6ZSAqPSAyOwotCi0JCQkJYi0+eXlfY2hfYnVmID0gKGNoYXIgKikKLQkJCQkJLyogSW5jbHVkZSByb29tIGluIGZvciAyIEVPQiBjaGFycy4gKi8KLQkJCQkJeXlyZWFsbG9jKCh2b2lkICopIGItPnl5X2NoX2J1ZixiLT55eV9idWZfc2l6ZSArIDIgICk7Ci0JCQkJfQotCQkJZWxzZQotCQkJCS8qIENhbid0IGdyb3cgaXQsIHdlIGRvbid0IG93biBpdC4gKi8KLQkJCQliLT55eV9jaF9idWYgPSAwOwotCi0JCQlpZiAoICEgYi0+eXlfY2hfYnVmICkKLQkJCQlZWV9GQVRBTF9FUlJPUigKLQkJCQkiZmF0YWwgZXJyb3IgLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdyIgKTsKLQotCQkJKHl5X2NfYnVmX3ApID0gJmItPnl5X2NoX2J1Zlt5eV9jX2J1Zl9wX29mZnNldF07Ci0KLQkJCW51bV90b19yZWFkID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSAtCi0JCQkJCQludW1iZXJfdG9fbW92ZSAtIDE7Ci0KLQkJCX0KLQotCQlpZiAoIG51bV90b19yZWFkID4gWVlfUkVBRF9CVUZfU0laRSApCi0JCQludW1fdG9fcmVhZCA9IFlZX1JFQURfQlVGX1NJWkU7Ci0KLQkJLyogUmVhZCBpbiBtb3JlIGRhdGEuICovCi0JCVlZX0lOUFVUKCAoJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW251bWJlcl90b19tb3ZlXSksCi0JCQkoeXlfbl9jaGFycyksIChzaXplX3QpIG51bV90b19yZWFkICk7Ci0KLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOwotCQl9Ci0KLQlpZiAoICh5eV9uX2NoYXJzKSA9PSAwICkKLQkJewotCQlpZiAoIG51bWJlcl90b19tb3ZlID09IFlZX01PUkVfQURKICkKLQkJCXsKLQkJCXJldF92YWwgPSBFT0JfQUNUX0VORF9PRl9GSUxFOwotCQkJeXlyZXN0YXJ0KHl5aW4gICk7Ci0JCQl9Ci0KLQkJZWxzZQotCQkJewotCQkJcmV0X3ZhbCA9IEVPQl9BQ1RfTEFTVF9NQVRDSDsKLQkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9Ci0JCQkJWVlfQlVGRkVSX0VPRl9QRU5ESU5HOwotCQkJfQotCQl9Ci0KLQllbHNlCi0JCXJldF92YWwgPSBFT0JfQUNUX0NPTlRJTlVFX1NDQU47Ci0KLQlpZiAoKHl5X3NpemVfdCkgKCh5eV9uX2NoYXJzKSArIG51bWJlcl90b19tb3ZlKSA+IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUpIHsKLQkJLyogRXh0ZW5kIHRoZSBhcnJheSBieSA1MCUsIHBsdXMgdGhlIG51bWJlciB3ZSByZWFsbHkgbmVlZC4gKi8KLQkJeXlfc2l6ZV90IG5ld19zaXplID0gKHl5X25fY2hhcnMpICsgbnVtYmVyX3RvX21vdmUgKyAoKHl5X25fY2hhcnMpID4+IDEpOwotCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiA9IChjaGFyICopIHl5cmVhbGxvYygodm9pZCAqKSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZixuZXdfc2l6ZSAgKTsKLQkJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICkKLQkJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X2dldF9uZXh0X2J1ZmZlcigpIiApOwotCX0KLQotCSh5eV9uX2NoYXJzKSArPSBudW1iZXJfdG9fbW92ZTsKLQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwotCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKSArIDFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwotCi0JKHl5dGV4dF9wdHIpID0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWzBdOwotCi0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLS8qIHl5X2dldF9wcmV2aW91c19zdGF0ZSAtIGdldCB0aGUgc3RhdGUganVzdCBiZWZvcmUgdGhlIEVPQiBjaGFyIHdhcyByZWFjaGVkICovCi0KLS8qICVpZi1jLW9ubHkgKi8KLS8qICVub3QtZm9yLWhlYWRlciAqLwotCi0gICAgc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh2b2lkKQotLyogJWVuZGlmICovCi0vKiAlaWYtYysrLW9ubHkgKi8KLS8qICVlbmRpZiAqLwotewotCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKLQlyZWdpc3RlciBjaGFyICp5eV9jcDsKLSAgICAKLS8qICUlIFsxNS4wXSBjb2RlIHRvIGdldCB0aGUgc3RhcnQgc3RhdGUgaW50byB5eV9jdXJyZW50X3N0YXRlIGdvZXMgaGVyZSAqLwotCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfc3RhcnQpOwotCXl5X2N1cnJlbnRfc3RhdGUgKz0gWVlfQVRfQk9MKCk7Ci0KLQlmb3IgKCB5eV9jcCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOyB5eV9jcCA8ICh5eV9jX2J1Zl9wKTsgKyt5eV9jcCApCi0JCXsKLS8qICUlIFsxNi4wXSBjb2RlIHRvIGZpbmQgdGhlIG5leHQgc3RhdGUgZ29lcyBoZXJlICovCi0JCXJlZ2lzdGVyIFlZX0NIQVIgeXlfYyA9ICgqeXlfY3AgPyB5eV9lY1tZWV9TQ19UT19VSSgqeXlfY3ApXSA6IDEpOwotCQlpZiAoIHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXSApCi0JCQl7Ci0JCQkoeXlfbGFzdF9hY2NlcHRpbmdfc3RhdGUpID0geXlfY3VycmVudF9zdGF0ZTsKLQkJCSh5eV9sYXN0X2FjY2VwdGluZ19jcG9zKSA9IHl5X2NwOwotCQkJfQotCQl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCi0JCQl7Ci0JCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOwotCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDczICkKLQkJCQl5eV9jID0geXlfbWV0YVsodW5zaWduZWQgaW50KSB5eV9jXTsKLQkJCX0KLQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgKHVuc2lnbmVkIGludCkgeXlfY107Ci0JCX0KLQotCXJldHVybiB5eV9jdXJyZW50X3N0YXRlOwotfQotCi0vKiB5eV90cnlfTlVMX3RyYW5zIC0gdHJ5IHRvIG1ha2UgYSB0cmFuc2l0aW9uIG9uIHRoZSBOVUwgY2hhcmFjdGVyCi0gKgotICogc3lub3BzaXMKLSAqCW5leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCBjdXJyZW50X3N0YXRlICk7Ci0gKi8KLS8qICVpZi1jLW9ubHkgKi8KLSAgICBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zICAoeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlICkKLS8qICVlbmRpZiAqLwotLyogJWlmLWMrKy1vbmx5ICovCi0vKiAlZW5kaWYgKi8KLXsKLQlyZWdpc3RlciBpbnQgeXlfaXNfamFtOwotICAgIC8qICUlIFsxNy4wXSBjb2RlIHRvIGZpbmQgdGhlIG5leHQgc3RhdGUsIGFuZCBwZXJoYXBzIGRvIGJhY2tpbmcgdXAsIGdvZXMgaGVyZSAqLwotCXJlZ2lzdGVyIGNoYXIgKnl5X2NwID0gKHl5X2NfYnVmX3ApOwotCi0JcmVnaXN0ZXIgWVlfQ0hBUiB5eV9jID0gMTsKLQlpZiAoIHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXSApCi0JCXsKLQkJKHl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlKSA9IHl5X2N1cnJlbnRfc3RhdGU7Ci0JCSh5eV9sYXN0X2FjY2VwdGluZ19jcG9zKSA9IHl5X2NwOwotCQl9Ci0Jd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQotCQl7Ci0JCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07Ci0JCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA3MyApCi0JCQl5eV9jID0geXlfbWV0YVsodW5zaWduZWQgaW50KSB5eV9jXTsKLQkJfQotCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOwotCXl5X2lzX2phbSA9ICh5eV9jdXJyZW50X3N0YXRlID09IDcyKTsKLQotCXJldHVybiB5eV9pc19qYW0gPyAwIDogeXlfY3VycmVudF9zdGF0ZTsKLX0KLQotLyogJWlmLWMtb25seSAqLwotCi0gICAgc3RhdGljIHZvaWQgeXl1bnB1dCAoaW50IGMsIHJlZ2lzdGVyIGNoYXIgKiB5eV9icCApCi0vKiAlZW5kaWYgKi8KLS8qICVpZi1jKystb25seSAqLwotLyogJWVuZGlmICovCi17Ci0JcmVnaXN0ZXIgY2hhciAqeXlfY3A7Ci0gICAgCi0gICAgeXlfY3AgPSAoeXlfY19idWZfcCk7Ci0KLQkvKiB1bmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB5eXRleHQgKi8KLQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsKLQotCWlmICggeXlfY3AgPCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiArIDIgKQotCQl7IC8qIG5lZWQgdG8gc2hpZnQgdGhpbmdzIHVwIHRvIG1ha2Ugcm9vbSAqLwotCQkvKiArMiBmb3IgRU9CIGNoYXJzLiAqLwotCQlyZWdpc3RlciBpbnQgbnVtYmVyX3RvX21vdmUgPSAoeXlfbl9jaGFycykgKyAyOwotCQlyZWdpc3RlciBjaGFyICpkZXN0ID0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWwotCQkJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplICsgMl07Ci0JCXJlZ2lzdGVyIGNoYXIgKnNvdXJjZSA9Ci0JCQkJJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW251bWJlcl90b19tb3ZlXTsKLQotCQl3aGlsZSAoIHNvdXJjZSA+IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICkKLQkJCSotLWRlc3QgPSAqLS1zb3VyY2U7Ci0KLQkJeXlfY3AgKz0gKGludCkgKGRlc3QgLSBzb3VyY2UpOwotCQl5eV9icCArPSAoaW50KSAoZGVzdCAtIHNvdXJjZSk7Ci0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9Ci0JCQkoeXlfbl9jaGFycykgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplOwotCi0JCWlmICggeXlfY3AgPCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiArIDIgKQotCQkJWVlfRkFUQUxfRVJST1IoICJmbGV4IHNjYW5uZXIgcHVzaC1iYWNrIG92ZXJmbG93IiApOwotCQl9Ci0KLQkqLS15eV9jcCA9IChjaGFyKSBjOwotCi0vKiAlJSBbMTguMF0gdXBkYXRlIHl5bGluZW5vIGhlcmUgKi8KLQotCSh5eXRleHRfcHRyKSA9IHl5X2JwOwotCSh5eV9ob2xkX2NoYXIpID0gKnl5X2NwOwotCSh5eV9jX2J1Zl9wKSA9IHl5X2NwOwotfQotLyogJWlmLWMtb25seSAqLwotCi0vKiAlZW5kaWYgKi8KLQotLyogJWlmLWMtb25seSAqLwotI2lmbmRlZiBZWV9OT19JTlBVVAotI2lmZGVmIF9fY3BsdXNwbHVzCi0gICAgc3RhdGljIGludCB5eWlucHV0ICh2b2lkKQotI2Vsc2UKLSAgICBzdGF0aWMgaW50IGlucHV0ICAodm9pZCkKLSNlbmRpZgotCi0vKiAlZW5kaWYgKi8KLS8qICVpZi1jKystb25seSAqLwotLyogJWVuZGlmICovCi17Ci0JaW50IGM7Ci0gICAgCi0JKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOwotCi0JaWYgKCAqKHl5X2NfYnVmX3ApID09IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCi0JCXsKLQkJLyogeXlfY19idWZfcCBub3cgcG9pbnRzIHRvIHRoZSBjaGFyYWN0ZXIgd2Ugd2FudCB0byByZXR1cm4uCi0JCSAqIElmIHRoaXMgb2NjdXJzICpiZWZvcmUqIHRoZSBFT0IgY2hhcmFjdGVycywgdGhlbiBpdCdzIGEKLQkJICogdmFsaWQgTlVMOyBpZiBub3QsIHRoZW4gd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLQkJICovCi0JCWlmICggKHl5X2NfYnVmX3ApIDwgJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV0gKQotCQkJLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLwotCQkJKih5eV9jX2J1Zl9wKSA9ICdcMCc7Ci0KLQkJZWxzZQotCQkJeyAvKiBuZWVkIG1vcmUgaW5wdXQgKi8KLQkJCWludCBvZmZzZXQgPSAoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cik7Ci0JCQkrKyh5eV9jX2J1Zl9wKTsKLQotCQkJc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCAgKSApCi0JCQkJewotCQkJCWNhc2UgRU9CX0FDVF9MQVNUX01BVENIOgotCQkJCQkvKiBUaGlzIGhhcHBlbnMgYmVjYXVzZSB5eV9nX25fYigpCi0JCQkJCSAqIHNlZXMgdGhhdCB3ZSd2ZSBhY2N1bXVsYXRlZCBhCi0JCQkJCSAqIHRva2VuIGFuZCBmbGFncyB0aGF0IHdlIG5lZWQgdG8KLQkJCQkJICogdHJ5IG1hdGNoaW5nIHRoZSB0b2tlbiBiZWZvcmUKLQkJCQkJICogcHJvY2VlZGluZy4gIEJ1dCBmb3IgaW5wdXQoKSwKLQkJCQkJICogdGhlcmUncyBubyBtYXRjaGluZyB0byBjb25zaWRlci4KLQkJCQkJICogU28gY29udmVydCB0aGUgRU9CX0FDVF9MQVNUX01BVENICi0JCQkJCSAqIHRvIEVPQl9BQ1RfRU5EX09GX0ZJTEUuCi0JCQkJCSAqLwotCi0JCQkJCS8qIFJlc2V0IGJ1ZmZlciBzdGF0dXMuICovCi0JCQkJCXl5cmVzdGFydCh5eWluICk7Ci0KLQkJCQkJLypGQUxMVEhST1VHSCovCi0KLQkJCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6Ci0JCQkJCXsKLQkJCQkJaWYgKCB5eXdyYXAoICkgKQotCQkJCQkJcmV0dXJuIEVPRjsKLQotCQkJCQlpZiAoICEgKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgKQotCQkJCQkJWVlfTkVXX0ZJTEU7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLQkJCQkJcmV0dXJuIHl5aW5wdXQoKTsKLSNlbHNlCi0JCQkJCXJldHVybiBpbnB1dCgpOwotI2VuZGlmCi0JCQkJCX0KLQotCQkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgotCQkJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyBvZmZzZXQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JYyA9ICoodW5zaWduZWQgY2hhciAqKSAoeXlfY19idWZfcCk7CS8qIGNhc3QgZm9yIDgtYml0IGNoYXIncyAqLwotCSooeXlfY19idWZfcCkgPSAnXDAnOwkvKiBwcmVzZXJ2ZSB5eXRleHQgKi8KLQkoeXlfaG9sZF9jaGFyKSA9ICorKyh5eV9jX2J1Zl9wKTsKLQotLyogJSUgWzE5LjBdIHVwZGF0ZSBCT0wgYW5kIHl5bGluZW5vICovCi0JWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9hdF9ib2wgPSAoYyA9PSAnXG4nKTsKLQotCXJldHVybiBjOwotfQotLyogJWlmLWMtb25seSAqLwotI2VuZGlmCS8qIGlmbmRlZiBZWV9OT19JTlBVVCAqLwotLyogJWVuZGlmICovCi0KLS8qKiBJbW1lZGlhdGVseSBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgaW5wdXQgc3RyZWFtLgotICogQHBhcmFtIGlucHV0X2ZpbGUgQSByZWFkYWJsZSBzdHJlYW0uCi0gKiAKLSAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVzZXQgdGhlIHN0YXJ0IGNvbmRpdGlvbiB0byBAYyBJTklUSUFMIC4KLSAqLwotLyogJWlmLWMtb25seSAqLwotICAgIHZvaWQgeXlyZXN0YXJ0ICAoRklMRSAqIGlucHV0X2ZpbGUgKQotLyogJWVuZGlmICovCi0vKiAlaWYtYysrLW9ubHkgKi8KLS8qICVlbmRpZiAqLwotewotICAgIAotCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApewotICAgICAgICB5eWVuc3VyZV9idWZmZXJfc3RhY2sgKCk7Ci0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9Ci0gICAgICAgICAgICB5eV9jcmVhdGVfYnVmZmVyKHl5aW4sWVlfQlVGX1NJWkUgKTsKLQl9Ci0KLQl5eV9pbml0X2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUixpbnB1dF9maWxlICk7Ci0JeXlfbG9hZF9idWZmZXJfc3RhdGUoICk7Ci19Ci0KLS8qKiBTd2l0Y2ggdG8gYSBkaWZmZXJlbnQgaW5wdXQgYnVmZmVyLgotICogQHBhcmFtIG5ld19idWZmZXIgVGhlIG5ldyBpbnB1dCBidWZmZXIuCi0gKiAKLSAqLwotLyogJWlmLWMtb25seSAqLwotICAgIHZvaWQgeXlfc3dpdGNoX3RvX2J1ZmZlciAgKFlZX0JVRkZFUl9TVEFURSAgbmV3X2J1ZmZlciApCi0vKiAlZW5kaWYgKi8KLS8qICVpZi1jKystb25seSAqLwotLyogJWVuZGlmICovCi17Ci0gICAgCi0JLyogVE9ETy4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVwbGFjZSB0aGlzIGVudGlyZSBmdW5jdGlvbiBib2R5Ci0JICogd2l0aAotCSAqCQl5eXBvcF9idWZmZXJfc3RhdGUoKTsKLQkgKgkJeXlwdXNoX2J1ZmZlcl9zdGF0ZShuZXdfYnVmZmVyKTsKLSAgICAgKi8KLQl5eWVuc3VyZV9idWZmZXJfc3RhY2sgKCk7Ci0JaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiA9PSBuZXdfYnVmZmVyICkKLQkJcmV0dXJuOwotCi0JaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiApCi0JCXsKLQkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLwotCQkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7Ci0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9ICh5eV9jX2J1Zl9wKTsKLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOwotCQl9Ci0KLQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBuZXdfYnVmZmVyOwotCXl5X2xvYWRfYnVmZmVyX3N0YXRlKCApOwotCi0JLyogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyB3aGV0aGVyIHdlIGRpZCB0aGlzIHN3aXRjaCBkdXJpbmcKLQkgKiBFT0YgKHl5d3JhcCgpKSBwcm9jZXNzaW5nLCBidXQgdGhlIG9ubHkgdGltZSB0aGlzIGZsYWcKLQkgKiBpcyBsb29rZWQgYXQgaXMgYWZ0ZXIgeXl3cmFwKCkgaXMgY2FsbGVkLCBzbyBpdCdzIHNhZmUKLQkgKiB0byBnbyBhaGVhZCBhbmQgYWx3YXlzIHNldCBpdC4KLQkgKi8KLQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7Ci19Ci0KLS8qICVpZi1jLW9ubHkgKi8KLXN0YXRpYyB2b2lkIHl5X2xvYWRfYnVmZmVyX3N0YXRlICAodm9pZCkKLS8qICVlbmRpZiAqLwotLyogJWlmLWMrKy1vbmx5ICovCi0vKiAlZW5kaWYgKi8KLXsKLSAgICAJKHl5X25fY2hhcnMpID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzOwotCSh5eXRleHRfcHRyKSA9ICh5eV9jX2J1Zl9wKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvczsKLQl5eWluID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pbnB1dF9maWxlOwotCSh5eV9ob2xkX2NoYXIpID0gKih5eV9jX2J1Zl9wKTsKLX0KLQotLyoqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGlucHV0IGJ1ZmZlciBzdGF0ZS4KLSAqIEBwYXJhbSBmaWxlIEEgcmVhZGFibGUgc3RyZWFtLgotICogQHBhcmFtIHNpemUgVGhlIGNoYXJhY3RlciBidWZmZXIgc2l6ZSBpbiBieXRlcy4gV2hlbiBpbiBkb3VidCwgdXNlIEBjIFlZX0JVRl9TSVpFLgotICogCi0gKiBAcmV0dXJuIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlLgotICovCi0vKiAlaWYtYy1vbmx5ICovCi0gICAgWVlfQlVGRkVSX1NUQVRFIHl5X2NyZWF0ZV9idWZmZXIgIChGSUxFICogZmlsZSwgaW50ICBzaXplICkKLS8qICVlbmRpZiAqLwotLyogJWlmLWMrKy1vbmx5ICovCi0vKiAlZW5kaWYgKi8KLXsKLQlZWV9CVUZGRVJfU1RBVEUgYjsKLSAgICAKLQliID0gKFlZX0JVRkZFUl9TVEFURSkgeXlhbGxvYyhzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSAgKTsKLQlpZiAoICEgYiApCi0JCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X2NyZWF0ZV9idWZmZXIoKSIgKTsKLQotCWItPnl5X2J1Zl9zaXplID0gc2l6ZTsKLQotCS8qIHl5X2NoX2J1ZiBoYXMgdG8gYmUgMiBjaGFyYWN0ZXJzIGxvbmdlciB0aGFuIHRoZSBzaXplIGdpdmVuIGJlY2F1c2UKLQkgKiB3ZSBuZWVkIHRvIHB1dCBpbiAyIGVuZC1vZi1idWZmZXIgY2hhcmFjdGVycy4KLQkgKi8KLQliLT55eV9jaF9idWYgPSAoY2hhciAqKSB5eWFsbG9jKGItPnl5X2J1Zl9zaXplICsgMiAgKTsKLQlpZiAoICEgYi0+eXlfY2hfYnVmICkKLQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpIiApOwotCi0JYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7Ci0KLQl5eV9pbml0X2J1ZmZlcihiLGZpbGUgKTsKLQotCXJldHVybiBiOwotfQotCi0vKiogRGVzdHJveSB0aGUgYnVmZmVyLgotICogQHBhcmFtIGIgYSBidWZmZXIgY3JlYXRlZCB3aXRoIHl5X2NyZWF0ZV9idWZmZXIoKQotICogCi0gKi8KLS8qICVpZi1jLW9ubHkgKi8KLSAgICB2b2lkIHl5X2RlbGV0ZV9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSAgYiApCi0vKiAlZW5kaWYgKi8KLS8qICVpZi1jKystb25seSAqLwotLyogJWVuZGlmICovCi17Ci0gICAgCi0JaWYgKCAhIGIgKQotCQlyZXR1cm47Ci0KLQlpZiAoIGIgPT0gWVlfQ1VSUkVOVF9CVUZGRVIgKSAvKiBOb3Qgc3VyZSBpZiB3ZSBzaG91bGQgcG9wIGhlcmUuICovCi0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IChZWV9CVUZGRVJfU1RBVEUpIDA7Ci0KLQlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQotCQl5eWZyZWUoKHZvaWQgKikgYi0+eXlfY2hfYnVmICApOwotCi0JeXlmcmVlKCh2b2lkICopIGIgICk7Ci19Ci0KLS8qICVpZi1jLW9ubHkgKi8KLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuIGludCBpc2F0dHkgKGludCApOwotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0gICAgCi0vKiAlZW5kaWYgKi8KLQotLyogJWlmLWMrKy1vbmx5ICovCi0vKiAlZW5kaWYgKi8KLQotLyogSW5pdGlhbGl6ZXMgb3IgcmVpbml0aWFsaXplcyBhIGJ1ZmZlci4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgc29tZXRpbWVzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBidWZmZXIsCi0gKiBzdWNoIGFzIGR1cmluZyBhIHl5cmVzdGFydCgpIG9yIGF0IEVPRi4KLSAqLwotLyogJWlmLWMtb25seSAqLwotICAgIHN0YXRpYyB2b2lkIHl5X2luaXRfYnVmZmVyICAoWVlfQlVGRkVSX1NUQVRFICBiLCBGSUxFICogZmlsZSApCi0vKiAlZW5kaWYgKi8KLS8qICVpZi1jKystb25seSAqLwotLyogJWVuZGlmICovCi0KLXsKLQlpbnQgb2Vycm5vID0gZXJybm87Ci0gICAgCi0JeXlfZmx1c2hfYnVmZmVyKGIgKTsKLQotCWItPnl5X2lucHV0X2ZpbGUgPSBmaWxlOwotCWItPnl5X2ZpbGxfYnVmZmVyID0gMTsKLQotICAgIC8qIElmIGIgaXMgdGhlIGN1cnJlbnQgYnVmZmVyLCB0aGVuIHl5X2luaXRfYnVmZmVyIHdhcyBfcHJvYmFibHlfCi0gICAgICogY2FsbGVkIGZyb20geXlyZXN0YXJ0KCkgb3IgdGhyb3VnaCB5eV9nZXRfbmV4dF9idWZmZXIuCi0gICAgICogSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHJlc2V0IHRoZSBsaW5lbm8gb3IgY29sdW1uLgotICAgICAqLwotICAgIGlmIChiICE9IFlZX0NVUlJFTlRfQlVGRkVSKXsKLSAgICAgICAgYi0+eXlfYnNfbGluZW5vID0gMTsKLSAgICAgICAgYi0+eXlfYnNfY29sdW1uID0gMDsKLSAgICB9Ci0KLS8qICVpZi1jLW9ubHkgKi8KLQotICAgICAgICBiLT55eV9pc19pbnRlcmFjdGl2ZSA9IGZpbGUgPyAoaXNhdHR5KCBmaWxlbm8oZmlsZSkgKSA+IDApIDogMDsKLSAgICAKLS8qICVlbmRpZiAqLwotLyogJWlmLWMrKy1vbmx5ICovCi0vKiAlZW5kaWYgKi8KLQllcnJubyA9IG9lcnJubzsKLX0KLQotLyoqIERpc2NhcmQgYWxsIGJ1ZmZlcmVkIGNoYXJhY3RlcnMuIE9uIHRoZSBuZXh0IHNjYW4sIFlZX0lOUFVUIHdpbGwgYmUgY2FsbGVkLgotICogQHBhcmFtIGIgdGhlIGJ1ZmZlciBzdGF0ZSB0byBiZSBmbHVzaGVkLCB1c3VhbGx5IEBjIFlZX0NVUlJFTlRfQlVGRkVSLgotICogCi0gKi8KLS8qICVpZi1jLW9ubHkgKi8KLSAgICB2b2lkIHl5X2ZsdXNoX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFICBiICkKLS8qICVlbmRpZiAqLwotLyogJWlmLWMrKy1vbmx5ICovCi0vKiAlZW5kaWYgKi8KLXsKLSAgICAJaWYgKCAhIGIgKQotCQlyZXR1cm47Ci0KLQliLT55eV9uX2NoYXJzID0gMDsKLQotCS8qIFdlIGFsd2F5cyBuZWVkIHR3byBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuICBUaGUgZmlyc3QgY2F1c2VzCi0JICogYSB0cmFuc2l0aW9uIHRvIHRoZSBlbmQtb2YtYnVmZmVyIHN0YXRlLiAgVGhlIHNlY29uZCBjYXVzZXMKLQkgKiBhIGphbSBpbiB0aGF0IHN0YXRlLgotCSAqLwotCWItPnl5X2NoX2J1ZlswXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKLQliLT55eV9jaF9idWZbMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7Ci0KLQliLT55eV9idWZfcG9zID0gJmItPnl5X2NoX2J1ZlswXTsKLQotCWItPnl5X2F0X2JvbCA9IDE7Ci0JYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7Ci0KLQlpZiAoIGIgPT0gWVlfQ1VSUkVOVF9CVUZGRVIgKQotCQl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKLX0KLQotLyogJWlmLWMtb3ItYysrICovCi0vKiogUHVzaGVzIHRoZSBuZXcgc3RhdGUgb250byB0aGUgc3RhY2suIFRoZSBuZXcgc3RhdGUgYmVjb21lcwotICogIHRoZSBjdXJyZW50IHN0YXRlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgdGhlIHN0YWNrCi0gKiAgaWYgbmVjZXNzYXJ5LgotICogIEBwYXJhbSBuZXdfYnVmZmVyIFRoZSBuZXcgc3RhdGUuCi0gKiAgCi0gKi8KLS8qICVpZi1jLW9ubHkgKi8KLXZvaWQgeXlwdXNoX2J1ZmZlcl9zdGF0ZSAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgKQotLyogJWVuZGlmICovCi0vKiAlaWYtYysrLW9ubHkgKi8KLS8qICVlbmRpZiAqLwotewotICAgIAlpZiAobmV3X2J1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQl5eWVuc3VyZV9idWZmZXJfc3RhY2soKTsKLQotCS8qIFRoaXMgYmxvY2sgaXMgY29waWVkIGZyb20geXlfc3dpdGNoX3RvX2J1ZmZlci4gKi8KLQlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSICkKLQkJewotCQkvKiBGbHVzaCBvdXQgaW5mb3JtYXRpb24gZm9yIG9sZCBidWZmZXIuICovCi0JCSooeXlfY19idWZfcCkgPSAoeXlfaG9sZF9jaGFyKTsKLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zID0gKHl5X2NfYnVmX3ApOwotCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycyk7Ci0JCX0KLQotCS8qIE9ubHkgcHVzaCBpZiB0b3AgZXhpc3RzLiBPdGhlcndpc2UsIHJlcGxhY2UgdG9wLiAqLwotCWlmIChZWV9DVVJSRU5UX0JVRkZFUikKLQkJKHl5X2J1ZmZlcl9zdGFja190b3ApKys7Ci0JWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gbmV3X2J1ZmZlcjsKLQotCS8qIGNvcGllZCBmcm9tIHl5X3N3aXRjaF90b19idWZmZXIuICovCi0JeXlfbG9hZF9idWZmZXJfc3RhdGUoICk7Ci0JKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAxOwotfQotLyogJWVuZGlmICovCi0KLS8qICVpZi1jLW9yLWMrKyAqLwotLyoqIFJlbW92ZXMgYW5kIGRlbGV0ZXMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIGlmIHByZXNlbnQuCi0gKiAgVGhlIG5leHQgZWxlbWVudCBiZWNvbWVzIHRoZSBuZXcgdG9wLgotICogIAotICovCi0vKiAlaWYtYy1vbmx5ICovCi12b2lkIHl5cG9wX2J1ZmZlcl9zdGF0ZSAodm9pZCkKLS8qICVlbmRpZiAqLwotLyogJWlmLWMrKy1vbmx5ICovCi0vKiAlZW5kaWYgKi8KLXsKLSAgICAJaWYgKCFZWV9DVVJSRU5UX0JVRkZFUikKLQkJcmV0dXJuOwotCi0JeXlfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiApOwotCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IE5VTEw7Ci0JaWYgKCh5eV9idWZmZXJfc3RhY2tfdG9wKSA+IDApCi0JCS0tKHl5X2J1ZmZlcl9zdGFja190b3ApOwotCi0JaWYgKFlZX0NVUlJFTlRfQlVGRkVSKSB7Ci0JCXl5X2xvYWRfYnVmZmVyX3N0YXRlKCApOwotCQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7Ci0JfQotfQotLyogJWVuZGlmICovCi0KLS8qICVpZi1jLW9yLWMrKyAqLwotLyogQWxsb2NhdGVzIHRoZSBzdGFjayBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAqICBHdWFyYW50ZWVzIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgcHVzaC4KLSAqLwotLyogJWlmLWMtb25seSAqLwotc3RhdGljIHZvaWQgeXllbnN1cmVfYnVmZmVyX3N0YWNrICh2b2lkKQotLyogJWVuZGlmICovCi0vKiAlaWYtYysrLW9ubHkgKi8KLS8qICVlbmRpZiAqLwotewotCWludCBudW1fdG9fYWxsb2M7Ci0gICAgCi0JaWYgKCEoeXlfYnVmZmVyX3N0YWNrKSkgewotCi0JCS8qIEZpcnN0IGFsbG9jYXRpb24gaXMganVzdCBmb3IgMiBlbGVtZW50cywgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGlzCi0JCSAqIHNjYW5uZXIgd2lsbCBldmVuIG5lZWQgYSBzdGFjay4gV2UgdXNlIDIgaW5zdGVhZCBvZiAxIHRvIGF2b2lkIGFuCi0JCSAqIGltbWVkaWF0ZSByZWFsbG9jIG9uIHRoZSBuZXh0IGNhbGwuCi0gICAgICAgICAqLwotCQludW1fdG9fYWxsb2MgPSAxOwotCQkoeXlfYnVmZmVyX3N0YWNrKSA9IChzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKiopeXlhbGxvYwotCQkJCQkJCQkobnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKQotCQkJCQkJCQkpOwotCQlpZiAoICEgKHl5X2J1ZmZlcl9zdGFjaykgKQotCQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXllbnN1cmVfYnVmZmVyX3N0YWNrKCkiICk7Ci0JCQkJCQkJCSAgCi0JCW1lbXNldCgoeXlfYnVmZmVyX3N0YWNrKSwgMCwgbnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7Ci0JCQkJCi0JCSh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IG51bV90b19hbGxvYzsKLQkJKHl5X2J1ZmZlcl9zdGFja190b3ApID0gMDsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPj0gKCh5eV9idWZmZXJfc3RhY2tfbWF4KSkgLSAxKXsKLQotCQkvKiBJbmNyZWFzZSB0aGUgYnVmZmVyIHRvIHByZXBhcmUgZm9yIGEgcG9zc2libGUgcHVzaC4gKi8KLQkJaW50IGdyb3dfc2l6ZSA9IDggLyogYXJiaXRyYXJ5IGdyb3cgc2l6ZSAqLzsKLQotCQludW1fdG9fYWxsb2MgPSAoeXlfYnVmZmVyX3N0YWNrX21heCkgKyBncm93X3NpemU7Ci0JCSh5eV9idWZmZXJfc3RhY2spID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKil5eXJlYWxsb2MKLQkJCQkJCQkJKCh5eV9idWZmZXJfc3RhY2spLAotCQkJCQkJCQludW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCi0JCQkJCQkJCSk7Ci0JCWlmICggISAoeXlfYnVmZmVyX3N0YWNrKSApCi0JCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eWVuc3VyZV9idWZmZXJfc3RhY2soKSIgKTsKLQotCQkvKiB6ZXJvIG9ubHkgdGhlIG5ldyBzbG90cy4qLwotCQltZW1zZXQoKHl5X2J1ZmZlcl9zdGFjaykgKyAoeXlfYnVmZmVyX3N0YWNrX21heCksIDAsIGdyb3dfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikpOwotCQkoeXlfYnVmZmVyX3N0YWNrX21heCkgPSBudW1fdG9fYWxsb2M7Ci0JfQotfQotLyogJWVuZGlmICovCi0KLS8qICVpZi1jLW9ubHkgKi8KLS8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gZGlyZWN0bHkgZnJvbSBhIHVzZXItc3BlY2lmaWVkIGNoYXJhY3RlciBidWZmZXIuCi0gKiBAcGFyYW0gYmFzZSB0aGUgY2hhcmFjdGVyIGJ1ZmZlcgotICogQHBhcmFtIHNpemUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNoYXJhY3RlciBidWZmZXIKLSAqIAotICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuIAotICovCi1ZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9idWZmZXIgIChjaGFyICogYmFzZSwgeXlfc2l6ZV90ICBzaXplICkKLXsKLQlZWV9CVUZGRVJfU1RBVEUgYjsKLSAgICAKLQlpZiAoIHNpemUgPCAyIHx8Ci0JICAgICBiYXNlW3NpemUtMl0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSIHx8Ci0JICAgICBiYXNlW3NpemUtMV0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSICkKLQkJLyogVGhleSBmb3Jnb3QgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIEVPQidzLiAqLwotCQlyZXR1cm4gMDsKLQotCWIgPSAoWVlfQlVGRkVSX1NUQVRFKSB5eWFsbG9jKHNpemVvZiggc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSApICApOwotCWlmICggISBiICkKLQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfc2Nhbl9idWZmZXIoKSIgKTsKLQotCWItPnl5X2J1Zl9zaXplID0gc2l6ZSAtIDI7CS8qICItIDIiIHRvIHRha2UgY2FyZSBvZiBFT0IncyAqLwotCWItPnl5X2J1Zl9wb3MgPSBiLT55eV9jaF9idWYgPSBiYXNlOwotCWItPnl5X2lzX291cl9idWZmZXIgPSAwOwotCWItPnl5X2lucHV0X2ZpbGUgPSAwOwotCWItPnl5X25fY2hhcnMgPSBiLT55eV9idWZfc2l6ZTsKLQliLT55eV9pc19pbnRlcmFjdGl2ZSA9IDA7Ci0JYi0+eXlfYXRfYm9sID0gMTsKLQliLT55eV9maWxsX2J1ZmZlciA9IDA7Ci0JYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7Ci0KLQl5eV9zd2l0Y2hfdG9fYnVmZmVyKGIgICk7Ci0KLQlyZXR1cm4gYjsKLX0KLS8qICVlbmRpZiAqLwotCi0vKiAlaWYtYy1vbmx5ICovCi0vKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIGEgc3RyaW5nLiBUaGUgbmV4dCBjYWxsIHRvIHl5bGV4KCkgd2lsbAotICogc2NhbiBmcm9tIGEgQGUgY29weSBvZiBAYSBzdHIuCi0gKiBAcGFyYW0geXlzdHIgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdG8gc2NhbgotICogCi0gKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4KLSAqIEBub3RlIElmIHlvdSB3YW50IHRvIHNjYW4gYnl0ZXMgdGhhdCBtYXkgY29udGFpbiBOVUwgdmFsdWVzLCB0aGVuIHVzZQotICogICAgICAgeXlfc2Nhbl9ieXRlcygpIGluc3RlYWQuCi0gKi8KLVlZX0JVRkZFUl9TVEFURSB5eV9zY2FuX3N0cmluZyAoeXljb25zdCBjaGFyICogeXlzdHIgKQotewotICAgIAotCXJldHVybiB5eV9zY2FuX2J5dGVzKHl5c3RyLHN0cmxlbih5eXN0cikgKTsKLX0KLS8qICVlbmRpZiAqLwotCi0vKiAlaWYtYy1vbmx5ICovCi0vKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIHRoZSBnaXZlbiBieXRlcy4gVGhlIG5leHQgY2FsbCB0byB5eWxleCgpIHdpbGwKLSAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgYnl0ZXMuCi0gKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHNjYW4KLSAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgQGEgYnl0ZXMuCi0gKiAKLSAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgotICovCi1ZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9ieXRlcyAgKHl5Y29uc3QgY2hhciAqIHl5Ynl0ZXMsIGludCAgX3l5Ynl0ZXNfbGVuICkKLXsKLQlZWV9CVUZGRVJfU1RBVEUgYjsKLQljaGFyICpidWY7Ci0JeXlfc2l6ZV90IG47Ci0JaW50IGk7Ci0gICAgCi0JLyogR2V0IG1lbW9yeSBmb3IgZnVsbCBidWZmZXIsIGluY2x1ZGluZyBzcGFjZSBmb3IgdHJhaWxpbmcgRU9CJ3MuICovCi0JbiA9IF95eWJ5dGVzX2xlbiArIDI7Ci0JYnVmID0gKGNoYXIgKikgeXlhbGxvYyhuICApOwotCWlmICggISBidWYgKQotCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9zY2FuX2J5dGVzKCkiICk7Ci0KLQlmb3IgKCBpID0gMDsgaSA8IF95eWJ5dGVzX2xlbjsgKytpICkKLQkJYnVmW2ldID0geXlieXRlc1tpXTsKLQotCWJ1ZltfeXlieXRlc19sZW5dID0gYnVmW195eWJ5dGVzX2xlbisxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKLQotCWIgPSB5eV9zY2FuX2J1ZmZlcihidWYsbiApOwotCWlmICggISBiICkKLQkJWVlfRkFUQUxfRVJST1IoICJiYWQgYnVmZmVyIGluIHl5X3NjYW5fYnl0ZXMoKSIgKTsKLQotCS8qIEl0J3Mgb2theSB0byBncm93IGV0Yy4gdGhpcyBidWZmZXIsIGFuZCB3ZSBzaG91bGQgdGhyb3cgaXQKLQkgKiBhd2F5IHdoZW4gd2UncmUgZG9uZS4KLQkgKi8KLQliLT55eV9pc19vdXJfYnVmZmVyID0gMTsKLQotCXJldHVybiBiOwotfQotLyogJWVuZGlmICovCi0KLSNpZm5kZWYgWVlfRVhJVF9GQUlMVVJFCi0jZGVmaW5lIFlZX0VYSVRfRkFJTFVSRSAyCi0jZW5kaWYKLQotLyogJWlmLWMtb25seSAqLwotc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IgKHl5Y29uc3QgY2hhciogbXNnICkKLXsKLSAgICAJKHZvaWQpIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtc2cgKTsKLQlleGl0KCBZWV9FWElUX0ZBSUxVUkUgKTsKLX0KLS8qICVlbmRpZiAqLwotLyogJWlmLWMrKy1vbmx5ICovCi0vKiAlZW5kaWYgKi8KLQotLyogUmVkZWZpbmUgeXlsZXNzKCkgc28gaXQgd29ya3MgaW4gc2VjdGlvbiAzIGNvZGUuICovCi0KLSN1bmRlZiB5eWxlc3MKLSNkZWZpbmUgeXlsZXNzKG4pIFwKLQlkbyBcCi0JCXsgXAotCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB5eXRleHQuICovIFwKLSAgICAgICAgaW50IHl5bGVzc19tYWNyb19hcmcgPSAobik7IFwKLSAgICAgICAgWVlfTEVTU19MSU5FTk8oeXlsZXNzX21hY3JvX2FyZyk7XAotCQl5eXRleHRbeXlsZW5nXSA9ICh5eV9ob2xkX2NoYXIpOyBcCi0JCSh5eV9jX2J1Zl9wKSA9IHl5dGV4dCArIHl5bGVzc19tYWNyb19hcmc7IFwKLQkJKHl5X2hvbGRfY2hhcikgPSAqKHl5X2NfYnVmX3ApOyBcCi0JCSooeXlfY19idWZfcCkgPSAnXDAnOyBcCi0JCXl5bGVuZyA9IHl5bGVzc19tYWNyb19hcmc7IFwKLQkJfSBcCi0Jd2hpbGUgKCAwICkKLQotLyogQWNjZXNzb3IgIG1ldGhvZHMgKGdldC9zZXQgZnVuY3Rpb25zKSB0byBzdHJ1Y3QgbWVtYmVycy4gKi8KLQotLyogJWlmLWMtb25seSAqLwotLyogJWlmLXJlZW50cmFudCAqLwotLyogJWVuZGlmICovCi0KLS8qKiBHZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCi0gKiAKLSAqLwotaW50IHl5Z2V0X2xpbmVubyAgKHZvaWQpCi17Ci0gICAgICAgIAotICAgIHJldHVybiB5eWxpbmVubzsKLX0KLQotLyoqIEdldCB0aGUgaW5wdXQgc3RyZWFtLgotICogCi0gKi8KLUZJTEUgKnl5Z2V0X2luICAodm9pZCkKLXsKLSAgICAgICAgcmV0dXJuIHl5aW47Ci19Ci0KLS8qKiBHZXQgdGhlIG91dHB1dCBzdHJlYW0uCi0gKiAKLSAqLwotRklMRSAqeXlnZXRfb3V0ICAodm9pZCkKLXsKLSAgICAgICAgcmV0dXJuIHl5b3V0OwotfQotCi0vKiogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgdG9rZW4uCi0gKiAKLSAqLwotaW50IHl5Z2V0X2xlbmcgICh2b2lkKQotewotICAgICAgICByZXR1cm4geXlsZW5nOwotfQotCi0vKiogR2V0IHRoZSBjdXJyZW50IHRva2VuLgotICogCi0gKi8KLQotY2hhciAqeXlnZXRfdGV4dCAgKHZvaWQpCi17Ci0gICAgICAgIHJldHVybiB5eXRleHQ7Ci19Ci0KLS8qICVpZi1yZWVudHJhbnQgKi8KLS8qICVlbmRpZiAqLwotCi0vKiogU2V0IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgotICogQHBhcmFtIGxpbmVfbnVtYmVyCi0gKiAKLSAqLwotdm9pZCB5eXNldF9saW5lbm8gKGludCAgbGluZV9udW1iZXIgKQotewotICAgIAotICAgIHl5bGluZW5vID0gbGluZV9udW1iZXI7Ci19Ci0KLS8qKiBTZXQgdGhlIGlucHV0IHN0cmVhbS4gVGhpcyBkb2VzIG5vdCBkaXNjYXJkIHRoZSBjdXJyZW50Ci0gKiBpbnB1dCBidWZmZXIuCi0gKiBAcGFyYW0gaW5fc3RyIEEgcmVhZGFibGUgc3RyZWFtLgotICogCi0gKiBAc2VlIHl5X3N3aXRjaF90b19idWZmZXIKLSAqLwotdm9pZCB5eXNldF9pbiAoRklMRSAqICBpbl9zdHIgKQotewotICAgICAgICB5eWluID0gaW5fc3RyIDsKLX0KLQotdm9pZCB5eXNldF9vdXQgKEZJTEUgKiAgb3V0X3N0ciApCi17Ci0gICAgICAgIHl5b3V0ID0gb3V0X3N0ciA7Ci19Ci0KLWludCB5eWdldF9kZWJ1ZyAgKHZvaWQpCi17Ci0gICAgICAgIHJldHVybiB5eV9mbGV4X2RlYnVnOwotfQotCi12b2lkIHl5c2V0X2RlYnVnIChpbnQgIGJkZWJ1ZyApCi17Ci0gICAgICAgIHl5X2ZsZXhfZGVidWcgPSBiZGVidWcgOwotfQotCi0vKiAlZW5kaWYgKi8KLQotLyogJWlmLXJlZW50cmFudCAqLwotLyogJWlmLWJpc29uLWJyaWRnZSAqLwotLyogJWVuZGlmICovCi0vKiAlZW5kaWYgaWYtYy1vbmx5ICovCi0KLS8qICVpZi1jLW9ubHkgKi8KLXN0YXRpYyBpbnQgeXlfaW5pdF9nbG9iYWxzICh2b2lkKQotewotICAgICAgICAvKiBJbml0aWFsaXphdGlvbiBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIG5vbi1yZWVudHJhbnQgc2Nhbm5lci4KLSAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHl5bGV4X2Rlc3Ryb3koKSwgc28gZG9uJ3QgYWxsb2NhdGUgaGVyZS4KLSAgICAgKi8KLQotICAgICh5eV9idWZmZXJfc3RhY2spID0gMDsKLSAgICAoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPSAwOwotICAgICh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IDA7Ci0gICAgKHl5X2NfYnVmX3ApID0gKGNoYXIgKikgMDsKLSAgICAoeXlfaW5pdCkgPSAwOwotICAgICh5eV9zdGFydCkgPSAwOwotCi0vKiBEZWZpbmVkIGluIG1haW4uYyAqLwotI2lmZGVmIFlZX1NURElOSVQKLSAgICB5eWluID0gc3RkaW47Ci0gICAgeXlvdXQgPSBzdGRvdXQ7Ci0jZWxzZQotICAgIHl5aW4gPSAoRklMRSAqKSAwOwotICAgIHl5b3V0ID0gKEZJTEUgKikgMDsKLSNlbmRpZgotCi0gICAgLyogRm9yIGZ1dHVyZSByZWZlcmVuY2U6IFNldCBlcnJubyBvbiBlcnJvciwgc2luY2Ugd2UgYXJlIGNhbGxlZCBieQotICAgICAqIHl5bGV4X2luaXQoKQotICAgICAqLwotICAgIHJldHVybiAwOwotfQotLyogJWVuZGlmICovCi0KLS8qICVpZi1jLW9ubHkgU05JUCEgdGhpcyBjdXJyZW50bHkgY2F1c2VzIGNvbmZsaWN0cyB3aXRoIHRoZSBjKysgc2Nhbm5lciAqLwotLyogeXlsZXhfZGVzdHJveSBpcyBmb3IgYm90aCByZWVudHJhbnQgYW5kIG5vbi1yZWVudHJhbnQgc2Nhbm5lcnMuICovCi1pbnQgeXlsZXhfZGVzdHJveSAgKHZvaWQpCi17Ci0gICAgCi0gICAgLyogUG9wIHRoZSBidWZmZXIgc3RhY2ssIGRlc3Ryb3lpbmcgZWFjaCBlbGVtZW50LiAqLwotCXdoaWxlKFlZX0NVUlJFTlRfQlVGRkVSKXsKLQkJeXlfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiAgKTsKLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gTlVMTDsKLQkJeXlwb3BfYnVmZmVyX3N0YXRlKCk7Ci0JfQotCi0JLyogRGVzdHJveSB0aGUgc3RhY2sgaXRzZWxmLiAqLwotCXl5ZnJlZSgoeXlfYnVmZmVyX3N0YWNrKSApOwotCSh5eV9idWZmZXJfc3RhY2spID0gTlVMTDsKLQotICAgIC8qIFJlc2V0IHRoZSBnbG9iYWxzLiBUaGlzIGlzIGltcG9ydGFudCBpbiBhIG5vbi1yZWVudHJhbnQgc2Nhbm5lciBzbyB0aGUgbmV4dCB0aW1lCi0gICAgICogeXlsZXgoKSBpcyBjYWxsZWQsIGluaXRpYWxpemF0aW9uIHdpbGwgb2NjdXIuICovCi0gICAgeXlfaW5pdF9nbG9iYWxzKCApOwotCi0vKiAlaWYtcmVlbnRyYW50ICovCi0vKiAlZW5kaWYgKi8KLSAgICByZXR1cm4gMDsKLX0KLS8qICVlbmRpZiAqLwotCi0vKgotICogSW50ZXJuYWwgdXRpbGl0eSByb3V0aW5lcy4KLSAqLwotCi0jaWZuZGVmIHl5dGV4dF9wdHIKLXN0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciogczEsIHl5Y29uc3QgY2hhciAqIHMyLCBpbnQgbiApCi17Ci0JcmVnaXN0ZXIgaW50IGk7Ci0JZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQotCQlzMVtpXSA9IHMyW2ldOwotfQotI2VuZGlmCi0KLSNpZmRlZiBZWV9ORUVEX1NUUkxFTgotc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiAoeXljb25zdCBjaGFyICogcyApCi17Ci0JcmVnaXN0ZXIgaW50IG47Ci0JZm9yICggbiA9IDA7IHNbbl07ICsrbiApCi0JCTsKLQotCXJldHVybiBuOwotfQotI2VuZGlmCi0KLXZvaWQgKnl5YWxsb2MgKHl5X3NpemVfdCAgc2l6ZSApCi17Ci0JcmV0dXJuICh2b2lkICopIG1hbGxvYyggc2l6ZSApOwotfQotCi12b2lkICp5eXJlYWxsb2MgICh2b2lkICogcHRyLCB5eV9zaXplX3QgIHNpemUgKQotewotCS8qIFRoZSBjYXN0IHRvIChjaGFyICopIGluIHRoZSBmb2xsb3dpbmcgYWNjb21tb2RhdGVzIGJvdGgKLQkgKiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB1c2UgY2hhciogZ2VuZXJpYyBwb2ludGVycywgYW5kIHRob3NlCi0JICogdGhhdCB1c2Ugdm9pZCogZ2VuZXJpYyBwb2ludGVycy4gIEl0IHdvcmtzIHdpdGggdGhlIGxhdHRlcgotCSAqIGJlY2F1c2UgYm90aCBBTlNJIEMgYW5kIEMrKyBhbGxvdyBjYXN0bGVzcyBhc3NpZ25tZW50IGZyb20KLQkgKiBhbnkgcG9pbnRlciB0eXBlIHRvIHZvaWQqLCBhbmQgZGVhbCB3aXRoIGFyZ3VtZW50IGNvbnZlcnNpb25zCi0JICogYXMgdGhvdWdoIGRvaW5nIGFuIGFzc2lnbm1lbnQuCi0JICovCi0JcmV0dXJuICh2b2lkICopIHJlYWxsb2MoIChjaGFyICopIHB0ciwgc2l6ZSApOwotfQotCi12b2lkIHl5ZnJlZSAodm9pZCAqIHB0ciApCi17Ci0JZnJlZSggKGNoYXIgKikgcHRyICk7CS8qIHNlZSB5eXJlYWxsb2MoKSBmb3IgKGNoYXIgKikgY2FzdCAqLwotfQotCi0vKiAlaWYtdGFibGVzLXNlcmlhbGl6YXRpb24gZGVmaW5pdGlvbnMgKi8KLS8qICVkZWZpbmUteXl0YWJsZXMgICBUaGUgbmFtZSBmb3IgdGhpcyBzcGVjaWZpYyBzY2FubmVyJ3MgdGFibGVzLiAqLwotI2RlZmluZSBZWVRBQkxFU19OQU1FICJ5eXRhYmxlcyIKLS8qICVlbmRpZiAqLwotCi0vKiAlb2stZm9yLWhlYWRlciAqLwotCi0jbGluZSA5MyAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKLQotCi0KLS8qIEJyaW5nIGluIHRoZSBrZXl3b3JkIHJlY29nbml6ZXIuICAqLwotCi0jaW5jbHVkZSAia2V5d29yZHMuYyIKLQotCi0vKiBNYWNyb3MgdG8gYXBwZW5kIHRvIG91ciBwaHJhc2UgY29sbGVjdGlvbiBsaXN0LiAgKi8KLQotLyoKLSAqIFdlIG1hcmsgYW55IHRva2VuLCB0aGF0IHRoYXQgZXF1YWxzIHRvIGEga25vd24gZW51bWVyYXRvciwgYXMKLSAqIFNZTV9FTlVNX0NPTlNULiBUaGUgcGFyc2VyIHdpbGwgY2hhbmdlIHRoaXMgZm9yIHN0cnVjdCBhbmQgdW5pb24gdGFncyBsYXRlciwKLSAqIHRoZSBvbmx5IHByb2JsZW0gaXMgc3RydWN0IGFuZCB1bmlvbiBtZW1iZXJzOgotICogICAgZW51bSBlIHsgYSwgYiB9OyBzdHJ1Y3QgcyB7IGludCBhLCBiOyB9Ci0gKiBidXQgaW4gdGhpcyBjYXNlLCB0aGUgb25seSBlZmZlY3Qgd2lsbCBiZSwgdGhhdCB0aGUgQUJJIGNoZWNrc3VtcyBiZWNvbWUKLSAqIG1vcmUgdm9sYXRpbGUsIHdoaWNoIGlzIGFjY2VwdGFibGUuIEFsc28sIHN1Y2ggY29sbGlzaW9ucyBhcmUgcXVpdGUgcmFyZSwKLSAqIHNvIGZhciBpdCB3YXMgb25seSBvYnNlcnZlZCBpbiBpbmNsdWRlL2xpbnV4L3RlbGVwaG9ueS5oLgotICovCi0jZGVmaW5lIF9BUFAoVCxMKQlkbyB7CQkJCQkJICAgXAotCQkJICBjdXJfbm9kZSA9IG5leHRfbm9kZTsJCQkJICAgXAotCQkJICBuZXh0X25vZGUgPSB4bWFsbG9jKHNpemVvZigqbmV4dF9ub2RlKSk7CSAgIFwKLQkJCSAgbmV4dF9ub2RlLT5uZXh0ID0gY3VyX25vZGU7CQkJICAgXAotCQkJICBjdXJfbm9kZS0+c3RyaW5nID0gbWVtY3B5KHhtYWxsb2MoTCsxKSwgVCwgTCsxKTsgXAotCQkJICBjdXJfbm9kZS0+dGFnID0JCQkJICAgXAotCQkJICAgIGZpbmRfc3ltYm9sKGN1cl9ub2RlLT5zdHJpbmcsIFNZTV9FTlVNX0NPTlNULCAxKT9cCi0JCQkgICAgU1lNX0VOVU1fQ09OU1QgOiBTWU1fTk9STUFMIDsJCSAgIFwKLQkJCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQVBQCQlfQVBQKHl5dGV4dCwgeXlsZW5nKQotCi0KLS8qIFRoZSBzZWNvbmQgc3RhZ2UgbGV4ZXIuICBIZXJlIHdlIGluY29ycG9yYXRlIGtub3dsZWRnZSBvZiB0aGUgc3RhdGUKLSAgIG9mIHRoZSBwYXJzZXIgdG8gdGFpbG9yIHRoZSB0b2tlbnMgdGhhdCBhcmUgcmV0dXJuZWQuICAqLwotCi1pbnQKLXl5bGV4KHZvaWQpCi17Ci0gIHN0YXRpYyBlbnVtIHsKLSAgICBTVF9OT1RTVEFSVEVELCBTVF9OT1JNQUwsIFNUX0FUVFJJQlVURSwgU1RfQVNNLCBTVF9CUkFDS0VULCBTVF9CUkFDRSwKLSAgICBTVF9FWFBSRVNTSU9OLCBTVF9UQUJMRV8xLCBTVF9UQUJMRV8yLCBTVF9UQUJMRV8zLCBTVF9UQUJMRV80LAotICAgIFNUX1RBQkxFXzUsIFNUX1RBQkxFXzYKLSAgfSBsZXhzdGF0ZSA9IFNUX05PVFNUQVJURUQ7Ci0KLSAgc3RhdGljIGludCBzdXBwcmVzc190eXBlX2xvb2t1cCwgZG9udF93YW50X2JyYWNlX3BocmFzZTsKLSAgc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqbmV4dF9ub2RlOwotCi0gIGludCB0b2tlbiwgY291bnQgPSAwOwotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmN1cl9ub2RlOwotCi0gIGlmIChsZXhzdGF0ZSA9PSBTVF9OT1RTVEFSVEVEKQotICAgIHsKLSAgICAgIG5leHRfbm9kZSA9IHhtYWxsb2Moc2l6ZW9mKCpuZXh0X25vZGUpKTsKLSAgICAgIG5leHRfbm9kZS0+bmV4dCA9IE5VTEw7Ci0gICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKLSAgICB9Ci0KLXJlcGVhdDoKLSAgdG9rZW4gPSB5eWxleDEoKTsKLQotICBpZiAodG9rZW4gPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgZWxzZSBpZiAodG9rZW4gPT0gRklMRU5BTUUpCi0gICAgewotICAgICAgY2hhciAqZmlsZSwgKmU7Ci0KLSAgICAgIC8qIFNhdmUgdGhlIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciBmb3IgbGF0ZXIgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0gICAgICBpZiAoY3VyX2ZpbGVuYW1lKQotCWZyZWUoY3VyX2ZpbGVuYW1lKTsKLQotICAgICAgZmlsZSA9IHN0cmNocih5eXRleHQsICdcIicpKzE7Ci0gICAgICBlID0gc3RyY2hyKGZpbGUsICdcIicpOwotICAgICAgKmUgPSAnXDAnOwotICAgICAgY3VyX2ZpbGVuYW1lID0gbWVtY3B5KHhtYWxsb2MoZS1maWxlKzEpLCBmaWxlLCBlLWZpbGUrMSk7Ci0gICAgICBjdXJfbGluZSA9IGF0b2koeXl0ZXh0KzIpOwotCi0gICAgICBnb3RvIHJlcGVhdDsKLSAgICB9Ci0KLSAgc3dpdGNoIChsZXhzdGF0ZSkKLSAgICB7Ci0gICAgY2FzZSBTVF9OT1JNQUw6Ci0gICAgICBzd2l0Y2ggKHRva2VuKQotCXsKLQljYXNlIElERU5UOgotCSAgQVBQOwotCSAgewotCSAgICBjb25zdCBzdHJ1Y3QgcmVzd29yZCAqciA9IGlzX3Jlc2VydmVkX3dvcmQoeXl0ZXh0LCB5eWxlbmcpOwotCSAgICBpZiAocikKLQkgICAgICB7Ci0JCXN3aXRjaCAodG9rZW4gPSByLT50b2tlbikKLQkJICB7Ci0JCSAgY2FzZSBBVFRSSUJVVEVfS0VZVzoKLQkJICAgIGxleHN0YXRlID0gU1RfQVRUUklCVVRFOwotCQkgICAgY291bnQgPSAwOwotCQkgICAgZ290byByZXBlYXQ7Ci0JCSAgY2FzZSBBU01fS0VZVzoKLQkJICAgIGxleHN0YXRlID0gU1RfQVNNOwotCQkgICAgY291bnQgPSAwOwotCQkgICAgZ290byByZXBlYXQ7Ci0KLQkJICBjYXNlIFNUUlVDVF9LRVlXOgotCQkgIGNhc2UgVU5JT05fS0VZVzoKLQkJICBjYXNlIEVOVU1fS0VZVzoKLQkJICAgIGRvbnRfd2FudF9icmFjZV9waHJhc2UgPSAzOwotCQkgICAgc3VwcHJlc3NfdHlwZV9sb29rdXAgPSAyOwotCQkgICAgZ290byBmaW5pOwotCi0JCSAgY2FzZSBFWFBPUlRfU1lNQk9MX0tFWVc6Ci0JCSAgICAgIGdvdG8gZmluaTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBpZiAoIXN1cHByZXNzX3R5cGVfbG9va3VwKQotCSAgICAgIHsKLQkJaWYgKGZpbmRfc3ltYm9sKHl5dGV4dCwgU1lNX1RZUEVERUYsIDEpKQotCQkgIHRva2VuID0gVFlQRTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ1snOgotCSAgQVBQOwotCSAgbGV4c3RhdGUgPSBTVF9CUkFDS0VUOwotCSAgY291bnQgPSAxOwotCSAgZ290byByZXBlYXQ7Ci0KLQljYXNlICd7JzoKLQkgIEFQUDsKLQkgIGlmIChkb250X3dhbnRfYnJhY2VfcGhyYXNlKQotCSAgICBicmVhazsKLQkgIGxleHN0YXRlID0gU1RfQlJBQ0U7Ci0JICBjb3VudCA9IDE7Ci0JICBnb3RvIHJlcGVhdDsKLQotCWNhc2UgJz0nOiBjYXNlICc6JzoKLQkgIEFQUDsKLQkgIGxleHN0YXRlID0gU1RfRVhQUkVTU0lPTjsKLQkgIGJyZWFrOwotCi0JY2FzZSBET1RTOgotCWRlZmF1bHQ6Ci0JICBBUFA7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU1RfQVRUUklCVVRFOgotICAgICAgQVBQOwotICAgICAgc3dpdGNoICh0b2tlbikKLQl7Ci0JY2FzZSAnKCc6Ci0JICArK2NvdW50OwotCSAgZ290byByZXBlYXQ7Ci0JY2FzZSAnKSc6Ci0JICBpZiAoLS1jb3VudCA9PSAwKQotCSAgICB7Ci0JICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7Ci0JICAgICAgdG9rZW4gPSBBVFRSSUJVVEVfUEhSQVNFOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBnb3RvIHJlcGVhdDsKLQlkZWZhdWx0OgotCSAgZ290byByZXBlYXQ7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNUX0FTTToKLSAgICAgIEFQUDsKLSAgICAgIHN3aXRjaCAodG9rZW4pCi0JewotCWNhc2UgJygnOgotCSAgKytjb3VudDsKLQkgIGdvdG8gcmVwZWF0OwotCWNhc2UgJyknOgotCSAgaWYgKC0tY291bnQgPT0gMCkKLQkgICAgewotCSAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOwotCSAgICAgIHRva2VuID0gQVNNX1BIUkFTRTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgZ290byByZXBlYXQ7Ci0JZGVmYXVsdDoKLQkgIGdvdG8gcmVwZWF0OwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTVF9CUkFDS0VUOgotICAgICAgQVBQOwotICAgICAgc3dpdGNoICh0b2tlbikKLQl7Ci0JY2FzZSAnWyc6Ci0JICArK2NvdW50OwotCSAgZ290byByZXBlYXQ7Ci0JY2FzZSAnXSc6Ci0JICBpZiAoLS1jb3VudCA9PSAwKQotCSAgICB7Ci0JICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7Ci0JICAgICAgdG9rZW4gPSBCUkFDS0VUX1BIUkFTRTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgZ290byByZXBlYXQ7Ci0JZGVmYXVsdDoKLQkgIGdvdG8gcmVwZWF0OwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTVF9CUkFDRToKLSAgICAgIEFQUDsKLSAgICAgIHN3aXRjaCAodG9rZW4pCi0JewotCWNhc2UgJ3snOgotCSAgKytjb3VudDsKLQkgIGdvdG8gcmVwZWF0OwotCWNhc2UgJ30nOgotCSAgaWYgKC0tY291bnQgPT0gMCkKLQkgICAgewotCSAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOwotCSAgICAgIHRva2VuID0gQlJBQ0VfUEhSQVNFOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBnb3RvIHJlcGVhdDsKLQlkZWZhdWx0OgotCSAgZ290byByZXBlYXQ7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNUX0VYUFJFU1NJT046Ci0gICAgICBzd2l0Y2ggKHRva2VuKQotCXsKLQljYXNlICcoJzogY2FzZSAnWyc6IGNhc2UgJ3snOgotCSAgKytjb3VudDsKLQkgIEFQUDsKLQkgIGdvdG8gcmVwZWF0OwotCWNhc2UgJ30nOgotCSAgLyogaXMgdGhpcyB0aGUgbGFzdCBsaW5lIG9mIGFuIGVudW0gZGVjbGFyYXRpb24/ICovCi0JICBpZiAoY291bnQgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFB1dCBiYWNrIHRoZSB0b2tlbiB3ZSBqdXN0IHJlYWQgc28ncyB3ZSBjYW4gZmluZCBpdCBhZ2FpbgotCQkgYWZ0ZXIgcmVnaXN0ZXJpbmcgdGhlIGV4cHJlc3Npb24uICAqLwotCSAgICAgIHVucHV0KHRva2VuKTsKLQotCSAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOwotCSAgICAgIHRva2VuID0gRVhQUkVTU0lPTl9QSFJBU0U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZBTExUSFJVICovCi0JY2FzZSAnKSc6IGNhc2UgJ10nOgotCSAgLS1jb3VudDsKLQkgIEFQUDsKLQkgIGdvdG8gcmVwZWF0OwotCWNhc2UgJywnOiBjYXNlICc7JzoKLQkgIGlmIChjb3VudCA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogUHV0IGJhY2sgdGhlIHRva2VuIHdlIGp1c3QgcmVhZCBzbydzIHdlIGNhbiBmaW5kIGl0IGFnYWluCi0JCSBhZnRlciByZWdpc3RlcmluZyB0aGUgZXhwcmVzc2lvbi4gICovCi0JICAgICAgdW5wdXQodG9rZW4pOwotCi0JICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7Ci0JICAgICAgdG9rZW4gPSBFWFBSRVNTSU9OX1BIUkFTRTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgQVBQOwotCSAgZ290byByZXBlYXQ7Ci0JZGVmYXVsdDoKLQkgIEFQUDsKLQkgIGdvdG8gcmVwZWF0OwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTVF9UQUJMRV8xOgotICAgICAgZ290byByZXBlYXQ7Ci0KLSAgICBjYXNlIFNUX1RBQkxFXzI6Ci0gICAgICBpZiAodG9rZW4gPT0gSURFTlQgJiYgeXlsZW5nID09IDEgJiYgeXl0ZXh0WzBdID09ICdYJykKLQl7Ci0JICB0b2tlbiA9IEVYUE9SVF9TWU1CT0xfS0VZVzsKLQkgIGxleHN0YXRlID0gU1RfVEFCTEVfNTsKLQkgIEFQUDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGxleHN0YXRlID0gU1RfVEFCTEVfNjsKLSAgICAgIC8qIEZBTExUSFJVICovCi0KLSAgICBjYXNlIFNUX1RBQkxFXzY6Ci0gICAgICBzd2l0Y2ggKHRva2VuKQotCXsKLQljYXNlICd7JzogY2FzZSAnWyc6IGNhc2UgJygnOgotCSAgKytjb3VudDsKLQkgIGJyZWFrOwotCWNhc2UgJ30nOiBjYXNlICddJzogY2FzZSAnKSc6Ci0JICAtLWNvdW50OwotCSAgYnJlYWs7Ci0JY2FzZSAnLCc6Ci0JICBpZiAoY291bnQgPT0gMCkKLQkgICAgbGV4c3RhdGUgPSBTVF9UQUJMRV8yOwotCSAgYnJlYWs7Ci0JfTsKLSAgICAgIGdvdG8gcmVwZWF0OwotCi0gICAgY2FzZSBTVF9UQUJMRV8zOgotICAgICAgZ290byByZXBlYXQ7Ci0KLSAgICBjYXNlIFNUX1RBQkxFXzQ6Ci0gICAgICBpZiAodG9rZW4gPT0gJzsnKQotCWxleHN0YXRlID0gU1RfTk9STUFMOwotICAgICAgZ290byByZXBlYXQ7Ci0KLSAgICBjYXNlIFNUX1RBQkxFXzU6Ci0gICAgICBzd2l0Y2ggKHRva2VuKQotCXsKLQljYXNlICcsJzoKLQkgIHRva2VuID0gJzsnOwotCSAgbGV4c3RhdGUgPSBTVF9UQUJMRV8yOwotCSAgQVBQOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIEFQUDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGV4aXQoMSk7Ci0gICAgfQotZmluaToKLQotICBpZiAoc3VwcHJlc3NfdHlwZV9sb29rdXAgPiAwKQotICAgIC0tc3VwcHJlc3NfdHlwZV9sb29rdXA7Ci0gIGlmIChkb250X3dhbnRfYnJhY2VfcGhyYXNlID4gMCkKLSAgICAtLWRvbnRfd2FudF9icmFjZV9waHJhc2U7Ci0KLSAgeXlsdmFsID0gJm5leHRfbm9kZS0+bmV4dDsKLQotICByZXR1cm4gdG9rZW47Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmwgYi9zY3JpcHRzL2dlbmtzeW1zL2xleC5sCmluZGV4IGU0ZGRkNDkuLjQwMGFlMDYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9sZXgubApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAKICNpbmNsdWRlICJnZW5rc3ltcy5oIgotI2luY2x1ZGUgInBhcnNlLmgiCisjaW5jbHVkZSAicGFyc2UudGFiLmgiCiAKIC8qIFdlJ3ZlIGdvdCBhIHR3by1sZXZlbCBsZXhlciBoZXJlLiAgV2UgbGV0IGZsZXggZG8gYmFzaWMgdG9rZW5pemF0aW9uCiAgICBhbmQgdGhlbiB3ZSBjYXRlZ29yaXplIHRob3NlIGJhc2ljIHRva2VucyBpbiB0aGUgc2Vjb25kIHN0YWdlLiAgKi8KQEAgLTk0LDcgKzk0LDcgQEAKIAogLyogQnJpbmcgaW4gdGhlIGtleXdvcmQgcmVjb2duaXplci4gICovCiAKLSNpbmNsdWRlICJrZXl3b3Jkcy5jIgorI2luY2x1ZGUgImtleXdvcmRzLmhhc2guYyIKIAogCiAvKiBNYWNyb3MgdG8gYXBwZW5kIHRvIG91ciBwaHJhc2UgY29sbGVjdGlvbiBsaXN0LiAgKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmxleC5jX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL2xleC5sZXguY19zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4M2NmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2dlbmtzeW1zL2xleC5sZXguY19zaGlwcGVkCkBAIC0wLDAgKzEsMjIzNyBAQAorCisjbGluZSAzICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sZXguY19zaGlwcGVkIgorCisjZGVmaW5lICBZWV9JTlRfQUxJR05FRCBzaG9ydCBpbnQKKworLyogQSBsZXhpY2FsIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IGZsZXggKi8KKworI2RlZmluZSBGTEVYX1NDQU5ORVIKKyNkZWZpbmUgWVlfRkxFWF9NQUpPUl9WRVJTSU9OIDIKKyNkZWZpbmUgWVlfRkxFWF9NSU5PUl9WRVJTSU9OIDUKKyNkZWZpbmUgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OIDM1CisjaWYgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OID4gMAorI2RlZmluZSBGTEVYX0JFVEEKKyNlbmRpZgorCisvKiBGaXJzdCwgd2UgZGVhbCB3aXRoICBwbGF0Zm9ybS1zcGVjaWZpYyBvciBjb21waWxlci1zcGVjaWZpYyBpc3N1ZXMuICovCisKKy8qIGJlZ2luIHN0YW5kYXJkIEMgaGVhZGVycy4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIGVuZCBzdGFuZGFyZCBDIGhlYWRlcnMuICovCisKKy8qIGZsZXggaW50ZWdlciB0eXBlIGRlZmluaXRpb25zICovCisKKyNpZm5kZWYgRkxFWElOVF9ICisjZGVmaW5lIEZMRVhJTlRfSAorCisvKiBDOTkgc3lzdGVtcyBoYXZlIDxpbnR0eXBlcy5oPi4gTm9uLUM5OSBzeXN0ZW1zIG1heSBvciBtYXkgbm90LiAqLworCisjaWYgZGVmaW5lZCAoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisKKy8qIEM5OSBzYXlzIHRvIGRlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIGJlZm9yZSBpbmNsdWRpbmcgc3RkaW50LmgsCisgKiBpZiB5b3Ugd2FudCB0aGUgbGltaXQgKG1heC9taW4pIG1hY3JvcyBmb3IgaW50IHR5cGVzLiAKKyAqLworI2lmbmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgordHlwZWRlZiBpbnQ4X3QgZmxleF9pbnQ4X3Q7Cit0eXBlZGVmIHVpbnQ4X3QgZmxleF91aW50OF90OwordHlwZWRlZiBpbnQxNl90IGZsZXhfaW50MTZfdDsKK3R5cGVkZWYgdWludDE2X3QgZmxleF91aW50MTZfdDsKK3R5cGVkZWYgaW50MzJfdCBmbGV4X2ludDMyX3Q7Cit0eXBlZGVmIHVpbnQzMl90IGZsZXhfdWludDMyX3Q7CisjZWxzZQordHlwZWRlZiBzaWduZWQgY2hhciBmbGV4X2ludDhfdDsKK3R5cGVkZWYgc2hvcnQgaW50IGZsZXhfaW50MTZfdDsKK3R5cGVkZWYgaW50IGZsZXhfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBmbGV4X3VpbnQ4X3Q7IAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgZmxleF91aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IGZsZXhfdWludDMyX3Q7CisjZW5kaWYgLyogISBDOTkgKi8KKworLyogTGltaXRzIG9mIGludGVncmFsIHR5cGVzLiAqLworI2lmbmRlZiBJTlQ4X01JTgorI2RlZmluZSBJTlQ4X01JTiAgICAgICAgICAgICAgICgtMTI4KQorI2VuZGlmCisjaWZuZGVmIElOVDE2X01JTgorI2RlZmluZSBJTlQxNl9NSU4gICAgICAgICAgICAgICgtMzI3NjctMSkKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NSU4KKyNkZWZpbmUgSU5UMzJfTUlOICAgICAgICAgICAgICAoLTIxNDc0ODM2NDctMSkKKyNlbmRpZgorI2lmbmRlZiBJTlQ4X01BWAorI2RlZmluZSBJTlQ4X01BWCAgICAgICAgICAgICAgICgxMjcpCisjZW5kaWYKKyNpZm5kZWYgSU5UMTZfTUFYCisjZGVmaW5lIElOVDE2X01BWCAgICAgICAgICAgICAgKDMyNzY3KQorI2VuZGlmCisjaWZuZGVmIElOVDMyX01BWAorI2RlZmluZSBJTlQzMl9NQVggICAgICAgICAgICAgICgyMTQ3NDgzNjQ3KQorI2VuZGlmCisjaWZuZGVmIFVJTlQ4X01BWAorI2RlZmluZSBVSU5UOF9NQVggICAgICAgICAgICAgICgyNTVVKQorI2VuZGlmCisjaWZuZGVmIFVJTlQxNl9NQVgKKyNkZWZpbmUgVUlOVDE2X01BWCAgICAgICAgICAgICAoNjU1MzVVKQorI2VuZGlmCisjaWZuZGVmIFVJTlQzMl9NQVgKKyNkZWZpbmUgVUlOVDMyX01BWCAgICAgICAgICAgICAoNDI5NDk2NzI5NVUpCisjZW5kaWYKKworI2VuZGlmIC8qICEgRkxFWElOVF9IICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisvKiBUaGUgImNvbnN0IiBzdG9yYWdlLWNsYXNzLW1vZGlmaWVyIGlzIHZhbGlkLiAqLworI2RlZmluZSBZWV9VU0VfQ09OU1QKKworI2Vsc2UJLyogISBfX2NwbHVzcGx1cyAqLworCisvKiBDOTkgcmVxdWlyZXMgX19TVERDX18gdG8gYmUgZGVmaW5lZCBhcyAxLiAqLworI2lmIGRlZmluZWQgKF9fU1REQ19fKQorCisjZGVmaW5lIFlZX1VTRV9DT05TVAorCisjZW5kaWYJLyogZGVmaW5lZCAoX19TVERDX18pICovCisjZW5kaWYJLyogISBfX2NwbHVzcGx1cyAqLworCisjaWZkZWYgWVlfVVNFX0NPTlNUCisjZGVmaW5lIHl5Y29uc3QgY29uc3QKKyNlbHNlCisjZGVmaW5lIHl5Y29uc3QKKyNlbmRpZgorCisvKiBSZXR1cm5lZCB1cG9uIGVuZC1vZi1maWxlLiAqLworI2RlZmluZSBZWV9OVUxMIDAKKworLyogUHJvbW90ZXMgYSBwb3NzaWJseSBuZWdhdGl2ZSwgcG9zc2libHkgc2lnbmVkIGNoYXIgdG8gYW4gdW5zaWduZWQKKyAqIGludGVnZXIgZm9yIHVzZSBhcyBhbiBhcnJheSBpbmRleC4gIElmIHRoZSBzaWduZWQgY2hhciBpcyBuZWdhdGl2ZSwKKyAqIHdlIHdhbnQgdG8gaW5zdGVhZCB0cmVhdCBpdCBhcyBhbiA4LWJpdCB1bnNpZ25lZCBjaGFyLCBoZW5jZSB0aGUKKyAqIGRvdWJsZSBjYXN0LgorICovCisjZGVmaW5lIFlZX1NDX1RPX1VJKGMpICgodW5zaWduZWQgaW50KSAodW5zaWduZWQgY2hhcikgYykKKworLyogRW50ZXIgYSBzdGFydCBjb25kaXRpb24uICBUaGlzIG1hY3JvIHJlYWxseSBvdWdodCB0byB0YWtlIGEgcGFyYW1ldGVyLAorICogYnV0IHdlIGRvIGl0IHRoZSBkaXNndXN0aW5nIGNydWZ0eSB3YXkgZm9yY2VkIG9uIHVzIGJ5IHRoZSAoKS1sZXNzCisgKiBkZWZpbml0aW9uIG9mIEJFR0lOLgorICovCisjZGVmaW5lIEJFR0lOICh5eV9zdGFydCkgPSAxICsgMiAqCisKKy8qIFRyYW5zbGF0ZSB0aGUgY3VycmVudCBzdGFydCBzdGF0ZSBpbnRvIGEgdmFsdWUgdGhhdCBjYW4gYmUgbGF0ZXIgaGFuZGVkCisgKiB0byBCRUdJTiB0byByZXR1cm4gdG8gdGhlIHN0YXRlLiAgVGhlIFlZU1RBVEUgYWxpYXMgaXMgZm9yIGxleAorICogY29tcGF0aWJpbGl0eS4KKyAqLworI2RlZmluZSBZWV9TVEFSVCAoKCh5eV9zdGFydCkgLSAxKSAvIDIpCisjZGVmaW5lIFlZU1RBVEUgWVlfU1RBUlQKKworLyogQWN0aW9uIG51bWJlciBmb3IgRU9GIHJ1bGUgb2YgYSBnaXZlbiBzdGFydCBzdGF0ZS4gKi8KKyNkZWZpbmUgWVlfU1RBVEVfRU9GKHN0YXRlKSAoWVlfRU5EX09GX0JVRkZFUiArIHN0YXRlICsgMSkKKworLyogU3BlY2lhbCBhY3Rpb24gbWVhbmluZyAic3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBmaWxlIi4gKi8KKyNkZWZpbmUgWVlfTkVXX0ZJTEUgeXlyZXN0YXJ0KHl5aW4gICkKKworI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgMAorCisvKiBTaXplIG9mIGRlZmF1bHQgaW5wdXQgYnVmZmVyLiAqLworI2lmbmRlZiBZWV9CVUZfU0laRQorI2RlZmluZSBZWV9CVUZfU0laRSAxNjM4NAorI2VuZGlmCisKKy8qIFRoZSBzdGF0ZSBidWYgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvbmUgc3RhdGUgcGVyIGNoYXJhY3RlciBpbiB0aGUgbWFpbiBidWZmZXIuCisgKi8KKyNkZWZpbmUgWVlfU1RBVEVfQlVGX1NJWkUgICAoKFlZX0JVRl9TSVpFICsgMikgKiBzaXplb2YoeXlfc3RhdGVfdHlwZSkpCisKKyNpZm5kZWYgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKKyNkZWZpbmUgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKK3R5cGVkZWYgc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSAqWVlfQlVGRkVSX1NUQVRFOworI2VuZGlmCisKK2V4dGVybiBpbnQgeXlsZW5nOworCitleHRlcm4gRklMRSAqeXlpbiwgKnl5b3V0OworCisjZGVmaW5lIEVPQl9BQ1RfQ09OVElOVUVfU0NBTiAwCisjZGVmaW5lIEVPQl9BQ1RfRU5EX09GX0ZJTEUgMQorI2RlZmluZSBFT0JfQUNUX0xBU1RfTUFUQ0ggMgorCisgICAgI2RlZmluZSBZWV9MRVNTX0xJTkVOTyhuKQorICAgIAorLyogUmV0dXJuIGFsbCBidXQgdGhlIGZpcnN0ICJuIiBtYXRjaGVkIGNoYXJhY3RlcnMgYmFjayB0byB0aGUgaW5wdXQgc3RyZWFtLiAqLworI2RlZmluZSB5eWxlc3MobikgXAorCWRvIFwKKwkJeyBcCisJCS8qIFVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHl5dGV4dC4gKi8gXAorICAgICAgICBpbnQgeXlsZXNzX21hY3JvX2FyZyA9IChuKTsgXAorICAgICAgICBZWV9MRVNTX0xJTkVOTyh5eWxlc3NfbWFjcm9fYXJnKTtcCisJCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOyBcCisJCVlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQgXAorCQkoeXlfY19idWZfcCkgPSB5eV9jcCA9IHl5X2JwICsgeXlsZXNzX21hY3JvX2FyZyAtIFlZX01PUkVfQURKOyBcCisJCVlZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB5eXRleHQgYWdhaW4gKi8gXAorCQl9IFwKKwl3aGlsZSAoIDAgKQorCisjZGVmaW5lIHVucHV0KGMpIHl5dW5wdXQoIGMsICh5eXRleHRfcHRyKSAgKQorCisjaWZuZGVmIFlZX1RZUEVERUZfWVlfU0laRV9UCisjZGVmaW5lIFlZX1RZUEVERUZfWVlfU0laRV9UCit0eXBlZGVmIHNpemVfdCB5eV9zaXplX3Q7CisjZW5kaWYKKworI2lmbmRlZiBZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFCisjZGVmaW5lIFlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUKK3N0cnVjdCB5eV9idWZmZXJfc3RhdGUKKwl7CisJRklMRSAqeXlfaW5wdXRfZmlsZTsKKworCWNoYXIgKnl5X2NoX2J1ZjsJCS8qIGlucHV0IGJ1ZmZlciAqLworCWNoYXIgKnl5X2J1Zl9wb3M7CQkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGlucHV0IGJ1ZmZlciAqLworCisJLyogU2l6ZSBvZiBpbnB1dCBidWZmZXIgaW4gYnl0ZXMsIG5vdCBpbmNsdWRpbmcgcm9vbSBmb3IgRU9CCisJICogY2hhcmFjdGVycy4KKwkgKi8KKwl5eV9zaXplX3QgeXlfYnVmX3NpemU7CisKKwkvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGludG8geXlfY2hfYnVmLCBub3QgaW5jbHVkaW5nIEVPQgorCSAqIGNoYXJhY3RlcnMuCisJICovCisJaW50IHl5X25fY2hhcnM7CisKKwkvKiBXaGV0aGVyIHdlICJvd24iIHRoZSBidWZmZXIgLSBpLmUuLCB3ZSBrbm93IHdlIGNyZWF0ZWQgaXQsCisJICogYW5kIGNhbiByZWFsbG9jKCkgaXQgdG8gZ3JvdyBpdCwgYW5kIHNob3VsZCBmcmVlKCkgaXQgdG8KKwkgKiBkZWxldGUgaXQuCisJICovCisJaW50IHl5X2lzX291cl9idWZmZXI7CisKKwkvKiBXaGV0aGVyIHRoaXMgaXMgYW4gImludGVyYWN0aXZlIiBpbnB1dCBzb3VyY2U7IGlmIHNvLCBhbmQKKwkgKiBpZiB3ZSdyZSB1c2luZyBzdGRpbyBmb3IgaW5wdXQsIHRoZW4gd2Ugd2FudCB0byB1c2UgZ2V0YygpCisJICogaW5zdGVhZCBvZiBmcmVhZCgpLCB0byBtYWtlIHN1cmUgd2Ugc3RvcCBmZXRjaGluZyBpbnB1dCBhZnRlcgorCSAqIGVhY2ggbmV3bGluZS4KKwkgKi8KKwlpbnQgeXlfaXNfaW50ZXJhY3RpdmU7CisKKwkvKiBXaGV0aGVyIHdlJ3JlIGNvbnNpZGVyZWQgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCisJICogSWYgc28sICdeJyBydWxlcyB3aWxsIGJlIGFjdGl2ZSBvbiB0aGUgbmV4dCBtYXRjaCwgb3RoZXJ3aXNlCisJICogbm90LgorCSAqLworCWludCB5eV9hdF9ib2w7CisKKyAgICBpbnQgeXlfYnNfbGluZW5vOyAvKio8IFRoZSBsaW5lIGNvdW50LiAqLworICAgIGludCB5eV9ic19jb2x1bW47IC8qKjwgVGhlIGNvbHVtbiBjb3VudC4gKi8KKyAgICAKKwkvKiBXaGV0aGVyIHRvIHRyeSB0byBmaWxsIHRoZSBpbnB1dCBidWZmZXIgd2hlbiB3ZSByZWFjaCB0aGUKKwkgKiBlbmQgb2YgaXQuCisJICovCisJaW50IHl5X2ZpbGxfYnVmZmVyOworCisJaW50IHl5X2J1ZmZlcl9zdGF0dXM7CisKKyNkZWZpbmUgWVlfQlVGRkVSX05FVyAwCisjZGVmaW5lIFlZX0JVRkZFUl9OT1JNQUwgMQorCS8qIFdoZW4gYW4gRU9GJ3MgYmVlbiBzZWVuIGJ1dCB0aGVyZSdzIHN0aWxsIHNvbWUgdGV4dCB0byBwcm9jZXNzCisJICogdGhlbiB3ZSBtYXJrIHRoZSBidWZmZXIgYXMgWVlfRU9GX1BFTkRJTkcsIHRvIGluZGljYXRlIHRoYXQgd2UKKwkgKiBzaG91bGRuJ3QgdHJ5IHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc291cmNlIGFueSBtb3JlLiAgV2UgbWlnaHQKKwkgKiBzdGlsbCBoYXZlIGEgYnVuY2ggb2YgdG9rZW5zIHRvIG1hdGNoLCB0aG91Z2gsIGJlY2F1c2Ugb2YKKwkgKiBwb3NzaWJsZSBiYWNraW5nLXVwLgorCSAqCisJICogV2hlbiB3ZSBhY3R1YWxseSBzZWUgdGhlIEVPRiwgd2UgY2hhbmdlIHRoZSBzdGF0dXMgdG8gIm5ldyIKKwkgKiAodmlhIHl5cmVzdGFydCgpKSwgc28gdGhhdCB0aGUgdXNlciBjYW4gY29udGludWUgc2Nhbm5pbmcgYnkKKwkgKiBqdXN0IHBvaW50aW5nIHl5aW4gYXQgYSBuZXcgaW5wdXQgZmlsZS4KKwkgKi8KKyNkZWZpbmUgWVlfQlVGRkVSX0VPRl9QRU5ESU5HIDIKKworCX07CisjZW5kaWYgLyogIVlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUgKi8KKworLyogU3RhY2sgb2YgaW5wdXQgYnVmZmVycy4gKi8KK3N0YXRpYyBzaXplX3QgeXlfYnVmZmVyX3N0YWNrX3RvcCA9IDA7IC8qKjwgaW5kZXggb2YgdG9wIG9mIHN0YWNrLiAqLworc3RhdGljIHNpemVfdCB5eV9idWZmZXJfc3RhY2tfbWF4ID0gMDsgLyoqPCBjYXBhY2l0eSBvZiBzdGFjay4gKi8KK3N0YXRpYyBZWV9CVUZGRVJfU1RBVEUgKiB5eV9idWZmZXJfc3RhY2sgPSAwOyAvKio8IFN0YWNrIGFzIGFuIGFycmF5LiAqLworCisvKiBXZSBwcm92aWRlIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGJ1ZmZlciBzdGF0ZXMgaW4gY2FzZSBpbiB0aGUKKyAqIGZ1dHVyZSB3ZSB3YW50IHRvIHB1dCB0aGUgYnVmZmVyIHN0YXRlcyBpbiBhIG1vcmUgZ2VuZXJhbAorICogInNjYW5uZXIgc3RhdGUiLgorICoKKyAqIFJldHVybnMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG9yIE5VTEwuCisgKi8KKyNkZWZpbmUgWVlfQ1VSUkVOVF9CVUZGRVIgKCAoeXlfYnVmZmVyX3N0YWNrKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gKHl5X2J1ZmZlcl9zdGFjaylbKHl5X2J1ZmZlcl9zdGFja190b3ApXSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCkKKworLyogU2FtZSBhcyBwcmV2aW91cyBtYWNybywgYnV0IHVzZWZ1bCB3aGVuIHdlIGtub3cgdGhhdCB0aGUgYnVmZmVyIHN0YWNrIGlzIG5vdAorICogTlVMTCBvciB3aGVuIHdlIG5lZWQgYW4gbHZhbHVlLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgKi8KKyNkZWZpbmUgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFICh5eV9idWZmZXJfc3RhY2spWyh5eV9idWZmZXJfc3RhY2tfdG9wKV0KKworLyogeXlfaG9sZF9jaGFyIGhvbGRzIHRoZSBjaGFyYWN0ZXIgbG9zdCB3aGVuIHl5dGV4dCBpcyBmb3JtZWQuICovCitzdGF0aWMgY2hhciB5eV9ob2xkX2NoYXI7CitzdGF0aWMgaW50IHl5X25fY2hhcnM7CQkvKiBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGludG8geXlfY2hfYnVmICovCitpbnQgeXlsZW5nOworCisvKiBQb2ludHMgdG8gY3VycmVudCBjaGFyYWN0ZXIgaW4gYnVmZmVyLiAqLworc3RhdGljIGNoYXIgKnl5X2NfYnVmX3AgPSAoY2hhciAqKSAwOworc3RhdGljIGludCB5eV9pbml0ID0gMDsJCS8qIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplICovCitzdGF0aWMgaW50IHl5X3N0YXJ0ID0gMDsJLyogc3RhcnQgc3RhdGUgbnVtYmVyICovCisKKy8qIEZsYWcgd2hpY2ggaXMgdXNlZCB0byBhbGxvdyB5eXdyYXAoKSdzIHRvIGRvIGJ1ZmZlciBzd2l0Y2hlcworICogaW5zdGVhZCBvZiBzZXR0aW5nIHVwIGEgZnJlc2ggeXlpbi4gIEEgYml0IG9mIGEgaGFjayAuLi4KKyAqLworc3RhdGljIGludCB5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2Y7CisKK3ZvaWQgeXlyZXN0YXJ0IChGSUxFICppbnB1dF9maWxlICApOwordm9pZCB5eV9zd2l0Y2hfdG9fYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAgKTsKK1lZX0JVRkZFUl9TVEFURSB5eV9jcmVhdGVfYnVmZmVyIChGSUxFICpmaWxlLGludCBzaXplICApOwordm9pZCB5eV9kZWxldGVfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYiAgKTsKK3ZvaWQgeXlfZmx1c2hfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYiAgKTsKK3ZvaWQgeXlwdXNoX2J1ZmZlcl9zdGF0ZSAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgICk7Cit2b2lkIHl5cG9wX2J1ZmZlcl9zdGF0ZSAodm9pZCApOworCitzdGF0aWMgdm9pZCB5eWVuc3VyZV9idWZmZXJfc3RhY2sgKHZvaWQgKTsKK3N0YXRpYyB2b2lkIHl5X2xvYWRfYnVmZmVyX3N0YXRlICh2b2lkICk7CitzdGF0aWMgdm9pZCB5eV9pbml0X2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIsRklMRSAqZmlsZSAgKTsKKworI2RlZmluZSBZWV9GTFVTSF9CVUZGRVIgeXlfZmx1c2hfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSICkKKworWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnVmZmVyIChjaGFyICpiYXNlLHl5X3NpemVfdCBzaXplICApOworWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKnl5X3N0ciAgKTsKK1lZX0JVRkZFUl9TVEFURSB5eV9zY2FuX2J5dGVzICh5eWNvbnN0IGNoYXIgKmJ5dGVzLGludCBsZW4gICk7CisKK3ZvaWQgKnl5YWxsb2MgKHl5X3NpemVfdCAgKTsKK3ZvaWQgKnl5cmVhbGxvYyAodm9pZCAqLHl5X3NpemVfdCAgKTsKK3ZvaWQgeXlmcmVlICh2b2lkICogICk7CisKKyNkZWZpbmUgeXlfbmV3X2J1ZmZlciB5eV9jcmVhdGVfYnVmZmVyCisKKyNkZWZpbmUgeXlfc2V0X2ludGVyYWN0aXZlKGlzX2ludGVyYWN0aXZlKSBcCisJeyBcCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7IFwKKyAgICAgICAgeXllbnN1cmVfYnVmZmVyX3N0YWNrICgpOyBcCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9ICAgIFwKKyAgICAgICAgICAgIHl5X2NyZWF0ZV9idWZmZXIoeXlpbixZWV9CVUZfU0laRSApOyBcCisJfSBcCisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pc19pbnRlcmFjdGl2ZSA9IGlzX2ludGVyYWN0aXZlOyBcCisJfQorCisjZGVmaW5lIHl5X3NldF9ib2woYXRfYm9sKSBcCisJeyBcCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7XAorICAgICAgICB5eWVuc3VyZV9idWZmZXJfc3RhY2sgKCk7IFwKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gICAgXAorICAgICAgICAgICAgeXlfY3JlYXRlX2J1ZmZlcih5eWluLFlZX0JVRl9TSVpFICk7IFwKKwl9IFwKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2F0X2JvbCA9IGF0X2JvbDsgXAorCX0KKworI2RlZmluZSBZWV9BVF9CT0woKSAoWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9hdF9ib2wpCisKKy8qIEJlZ2luIHVzZXIgc2VjdDMgKi8KKworI2RlZmluZSB5eXdyYXAobikgMQorI2RlZmluZSBZWV9TS0lQX1lZV1JBUAorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgWVlfQ0hBUjsKKworRklMRSAqeXlpbiA9IChGSUxFICopIDAsICp5eW91dCA9IChGSUxFICopIDA7CisKK3R5cGVkZWYgaW50IHl5X3N0YXRlX3R5cGU7CisKK2V4dGVybiBpbnQgeXlsaW5lbm87CisKK2ludCB5eWxpbmVubyA9IDE7CisKK2V4dGVybiBjaGFyICp5eXRleHQ7CisjZGVmaW5lIHl5dGV4dF9wdHIgeXl0ZXh0CisKK3N0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSAodm9pZCApOworc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyAoeXlfc3RhdGVfdHlwZSBjdXJyZW50X3N0YXRlICApOworc3RhdGljIGludCB5eV9nZXRfbmV4dF9idWZmZXIgKHZvaWQgKTsKK3N0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yICh5eWNvbnN0IGNoYXIgbXNnW10gICk7CisKKy8qIERvbmUgYWZ0ZXIgdGhlIGN1cnJlbnQgcGF0dGVybiBoYXMgYmVlbiBtYXRjaGVkIGFuZCBiZWZvcmUgdGhlCisgKiBjb3JyZXNwb25kaW5nIGFjdGlvbiAtIHNldHMgdXAgeXl0ZXh0LgorICovCisjZGVmaW5lIFlZX0RPX0JFRk9SRV9BQ1RJT04gXAorCSh5eXRleHRfcHRyKSA9IHl5X2JwOyBcCisJeXlsZW5nID0gKHNpemVfdCkgKHl5X2NwIC0geXlfYnApOyBcCisJKHl5X2hvbGRfY2hhcikgPSAqeXlfY3A7IFwKKwkqeXlfY3AgPSAnXDAnOyBcCisJKHl5X2NfYnVmX3ApID0geXlfY3A7CisKKyNkZWZpbmUgWVlfTlVNX1JVTEVTIDEzCisjZGVmaW5lIFlZX0VORF9PRl9CVUZGRVIgMTQKKy8qIFRoaXMgc3RydWN0IGlzIG5vdCB1c2VkIGluIHRoaXMgc2Nhbm5lciwKKyAgIGJ1dCBpdHMgcHJlc2VuY2UgaXMgbmVjZXNzYXJ5LiAqLworc3RydWN0IHl5X3RyYW5zX2luZm8KKwl7CisJZmxleF9pbnQzMl90IHl5X3ZlcmlmeTsKKwlmbGV4X2ludDMyX3QgeXlfbnh0OworCX07CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfYWNjZXB0WzczXSA9CisgICAgeyAgIDAsCisgICAgICAgIDAsICAgIDAsICAgMTQsICAgMTIsICAgIDQsICAgIDMsICAgMTIsICAgIDcsICAgMTIsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgIDksICAgIDksICAgMTIsICAgMTIsICAgIDcsICAgMTIsICAgMTIsCisgICAgICAgIDQsICAgIDAsICAgIDUsICAgIDAsICAgIDcsICAgIDgsICAgIDAsICAgIDYsICAgIDAsICAgIDAsCisgICAgICAgMTAsICAgMTAsICAgIDksICAgIDAsICAgIDAsICAgIDksICAgIDksICAgIDAsICAgIDksICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDIsICAgIDAsICAgIDAsICAgMTEsICAgIDAsICAgMTAsICAgIDAsCisgICAgICAgMTAsICAgIDksICAgIDksICAgIDAsICAgIDAsICAgIDAsICAgMTAsICAgMTAsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDEsICAgIDAKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X2VjWzI1Nl0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAzLAorICAgICAgICA0LCAgICA0LCAgICA0LCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAyLCAgICAxLCAgICA1LCAgICA2LCAgICA3LCAgICA4LCAgICA5LCAgIDEwLCAgICAxLAorICAgICAgICAxLCAgICA4LCAgIDExLCAgICAxLCAgIDEyLCAgIDEzLCAgICA4LCAgIDE0LCAgIDE1LCAgIDE1LAorICAgICAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE2LCAgIDE2LCAgICAxLCAgICAxLCAgIDE3LAorICAgICAgIDE4LCAgIDE5LCAgICAxLCAgICAxLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIxLCAgIDIyLAorICAgICAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgIDIzLCAgICA3LCAgICA3LCAgICA3LCAgICA3LAorICAgICAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgIDI0LCAgICA3LCAgICA3LCAgIDI1LCAgICA3LCAgICA3LAorICAgICAgICAxLCAgIDI2LCAgICAxLCAgICA4LCAgICA3LCAgICAxLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLAorCisgICAgICAgMjEsICAgMjIsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgMjcsICAgIDcsICAgIDcsCisgICAgICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgMjQsICAgIDcsICAgIDcsICAgMjUsCisgICAgICAgIDcsICAgIDcsICAgIDEsICAgMjgsICAgIDEsICAgIDgsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMQorICAgIH0gOworCitzdGF0aWMgeXljb25zdCBmbGV4X2ludDMyX3QgeXlfbWV0YVsyOV0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAyLCAgICAxLCAgICAxLCAgICAxLCAgICAzLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICA0LCAgICA0LCAgICA1LCAgICA2LCAgICA2LCAgICA2LCAgICAxLCAgICAxLCAgICAxLCAgICA3LAorICAgICAgICA4LCAgICA3LCAgICAzLCAgICAzLCAgICAzLCAgICAxLCAgICAzLCAgICAxCisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9iYXNlWzg1XSA9CisgICAgeyAgIDAsCisgICAgICAgIDAsICAxNDUsICAxNTAsICAyNjYsICAgMjcsICAyNjYsICAgMjUsICAgIDAsICAxMzEsICAgMjMsCisgICAgICAgMjMsICAgMTYsICAgMjMsICAgMzksICAgMzEsICAgMjUsICAgMzksICAgNjAsICAgMjIsICAgNjUsCisgICAgICAgNTcsICAgNDMsICAyNjYsICAgIDAsICAgIDAsICAyNjYsICAgNjEsICAyNjYsICAgIDAsICAxMjgsCisgICAgICAgNzQsICAgIDAsICAxMTMsICAgNTksICAgNjIsICAxMTMsICAgNTIsICAgIDAsICAgIDAsICAgNzIsCisgICAgICAgNjYsICAxMTAsICAxMDAsICAyNjYsICAgNzMsICAgNzQsICAyNjYsICAgNzAsICAyNjYsICAgOTAsCisgICAgICAxMDMsICAyNjYsICAgODQsICAxMjksICAxMDgsICAxMTMsICAxNDMsICAyNjYsICAxMDcsICAgNjYsCisgICAgICAxMTgsICAxMzcsICAxNjgsICAxMjAsICAgODAsICAgOTEsICAxNDUsICAxNDMsICAgODMsICAgNDEsCisgICAgICAyNjYsICAyNjYsICAxOTAsICAxOTYsICAyMDQsICAyMTIsICAyMjAsICAyMjgsICAyMzIsICAyMzcsCisgICAgICAyMzgsICAyNDMsICAyNDksICAyNTcKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2RlZls4NV0gPQorICAgIHsgICAwLAorICAgICAgIDcyLCAgICAxLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDczLCAgIDc0LCAgIDcyLCAgIDcyLAorICAgICAgIDc1LCAgIDcyLCAgIDcyLCAgIDcyLCAgIDE0LCAgIDcyLCAgIDcyLCAgIDc0LCAgIDcyLCAgIDc2LAorICAgICAgIDcyLCAgIDczLCAgIDcyLCAgIDc3LCAgIDc0LCAgIDcyLCAgIDc1LCAgIDcyLCAgIDc4LCAgIDcyLAorICAgICAgIDcyLCAgIDMxLCAgIDE0LCAgIDc5LCAgIDgwLCAgIDcyLCAgIDcyLCAgIDgxLCAgIDE1LCAgIDczLAorICAgICAgIDc1LCAgIDc2LCAgIDc2LCAgIDcyLCAgIDczLCAgIDc1LCAgIDcyLCAgIDgyLCAgIDcyLCAgIDcyLAorICAgICAgIDcyLCAgIDcyLCAgIDgxLCAgIDc2LCAgIDU0LCAgIDcyLCAgIDcyLCAgIDcyLCAgIDc2LCAgIDU0LAorICAgICAgIDc2LCAgIDc2LCAgIDc2LCAgIDU0LCAgIDgzLCAgIDc2LCAgIDYzLCAgIDgzLCAgIDg0LCAgIDg0LAorICAgICAgIDcyLCAgICAwLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLAorICAgICAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyCisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9ueHRbMjk1XSA9CisgICAgeyAgIDAsCisgICAgICAgIDQsICAgIDUsICAgIDYsICAgIDUsICAgIDcsICAgIDQsICAgIDgsICAgIDksICAgMTAsICAgMTEsCisgICAgICAgIDksICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTUsICAgMTYsICAgIDksICAgMTcsICAgIDgsCisgICAgICAgIDgsICAgIDgsICAgMTgsICAgIDgsICAgIDgsICAgIDQsICAgIDgsICAgMTksICAgMjEsICAgMjMsCisgICAgICAgMjEsICAgMjYsICAgMjgsICAgMjYsICAgMjYsICAgMzAsICAgMzEsICAgMzEsICAgMzEsICAgMjYsCisgICAgICAgMjYsICAgMjYsICAgMjYsICAgNzEsICAgMzksICAgMzksICAgMzksICAgMjMsICAgMjksICAgMjYsCisgICAgICAgMjQsICAgMzIsICAgMzMsICAgMzMsICAgMzQsICAgNzIsICAgMjYsICAgMjYsICAgMjEsICAgMzUsCisgICAgICAgMjEsICAgMzYsICAgMzcsICAgMzgsICAgNDAsICAgMzYsICAgNDMsICAgNDQsICAgMjQsICAgNDEsCisgICAgICAgMjgsICAgMzIsICAgNTAsICAgNTAsICAgNTIsICAgMjgsICAgMjMsICAgMjMsICAgNTIsICAgMzUsCisgICAgICAgNTYsICAgNTYsICAgNDQsICAgMjgsICAgNDIsICAgNzEsICAgMjksICAgMzEsICAgMzEsICAgMzEsCisgICAgICAgNDIsICAgMjksICAgNTksICAgNDQsICAgNDgsICAgNDksICAgNDksICAgMjQsICAgMjQsICAgMjksCisKKyAgICAgICA0OSwgICA0MywgICA0NCwgICA1MSwgICA1MSwgICA1MSwgICAzNiwgICAzNywgICA1OSwgICA0NCwKKyAgICAgICAzNiwgICA2NSwgICA0NCwgICA1NCwgICA1NSwgICA1NSwgICA1MSwgICA1MSwgICA1MSwgICA1OSwKKyAgICAgICA0NCwgICA2NCwgICA2NCwgICA2NCwgICA1OCwgICA1OCwgICA1NywgICA1NywgICA1NywgICA1OCwKKyAgICAgICA1OSwgICA0NCwgICA0MiwgICA2NCwgICA2NCwgICA2NCwgICA1MiwgICA3MiwgICA1OSwgICA0NCwKKyAgICAgICA0NywgICA2NiwgICA2MCwgICA2MCwgICA0MiwgICA0NCwgICA1OSwgICA2OSwgICAyNiwgICA3MiwKKyAgICAgICAyMCwgICA2MSwgICA2MiwgICA2MywgICA3MiwgICA2MSwgICA1NywgICA1NywgICA1NywgICA2NiwKKyAgICAgICA3MiwgICA3MiwgICA3MiwgICA2NiwgICA0OSwgICA0OSwgICA3MiwgICA2MSwgICA2MiwgICA0OSwKKyAgICAgICA0NCwgICA2MSwgICA3MiwgICA3MiwgICA3MiwgICA3MiwgICA3MiwgICA3MiwgICA3MiwgICA3MiwKKyAgICAgICA3MiwgICA2NywgICA2NywgICA2NywgICA3MiwgICA3MiwgICA3MiwgICA2NywgICA2NywgICA2NywKKyAgICAgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyNSwgICA3MiwKKworICAgICAgIDcyLCAgIDI1LCAgIDI1LCAgIDI1LCAgIDI3LCAgIDI3LCAgIDI3LCAgIDI3LCAgIDI3LCAgIDI3LAorICAgICAgIDI3LCAgIDI3LCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLAorICAgICAgIDQ1LCAgIDcyLCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ2LCAgIDcyLAorICAgICAgIDQ2LCAgIDQ2LCAgIDQ2LCAgIDQ2LCAgIDQ2LCAgIDQ2LCAgIDM0LCAgIDM0LCAgIDcyLCAgIDM0LAorICAgICAgIDUxLCAgIDcyLCAgIDUxLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDU3LCAgIDcyLCAgIDU3LCAgIDY4LAorICAgICAgIDY4LCAgIDY4LCAgIDY4LCAgIDY4LCAgIDY4LCAgIDY4LCAgIDY4LCAgIDcwLCAgIDcwLCAgIDcwLAorICAgICAgIDcwLCAgIDcwLCAgIDcwLCAgIDcwLCAgIDcwLCAgICAzLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLAorICAgICAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLAorICAgICAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyLAorICAgICAgIDcyLCAgIDcyLCAgIDcyLCAgIDcyCisKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2Noa1syOTVdID0KKyAgICB7ICAgMCwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgNSwgICAgNywKKyAgICAgICAgNSwgICAxMCwgICAxMSwgICAxMiwgICAxMiwgICAxMywgICAxMywgICAxMywgICAxMywgICAxOSwKKyAgICAgICAxMCwgICAxNiwgICAxNiwgICA3MCwgICAxNSwgICAxNSwgICAxNSwgICAyMiwgICAxMSwgICAxOSwKKyAgICAgICAgNywgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNSwgICAxNywgICAxNywgICAyMSwgICAxNCwKKyAgICAgICAyMSwgICAxNCwgICAxNCwgICAxNCwgICAxOCwgICAxNCwgICAyMCwgICAyMCwgICAyMiwgICAxOCwKKyAgICAgICAyNywgICAzNCwgICAzNSwgICAzNSwgICAzNywgICA0MSwgICA0MCwgICA0NSwgICAzNywgICAzNCwKKyAgICAgICA0OCwgICA0OCwgICA2NSwgICA0NiwgICA2NSwgICA2OSwgICAyNywgICAzMSwgICAzMSwgICAzMSwKKyAgICAgICA2MCwgICA0MSwgICA2NiwgICA2NiwgICAzMSwgICAzMSwgICAzMSwgICA0MCwgICA0NSwgICA0NiwKKworICAgICAgIDMxLCAgIDQzLCAgIDQzLCAgIDUwLCAgIDUwLCAgIDUwLCAgIDUzLCAgIDUzLCAgIDU5LCAgIDU5LAorICAgICAgIDUzLCAgIDU5LCAgIDQyLCAgIDQzLCAgIDQzLCAgIDQzLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDYxLAorICAgICAgIDYxLCAgIDU1LCAgIDU1LCAgIDU1LCAgIDUxLCAgIDUxLCAgIDU2LCAgIDU2LCAgIDU2LCAgIDUxLAorICAgICAgIDU0LCAgIDU0LCAgIDU1LCAgIDY0LCAgIDY0LCAgIDY0LCAgIDM2LCAgIDMzLCAgIDYyLCAgIDYyLAorICAgICAgIDMwLCAgIDYxLCAgIDU0LCAgIDU0LCAgIDY0LCAgIDY4LCAgIDY3LCAgIDY4LCAgICA5LCAgICAzLAorICAgICAgICAyLCAgIDU0LCAgIDU0LCAgIDU0LCAgICAwLCAgIDU0LCAgIDU3LCAgIDU3LCAgIDU3LCAgIDYyLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgIDYyLCAgIDU3LCAgIDU3LCAgICAwLCAgIDY3LCAgIDY3LCAgIDU3LAorICAgICAgIDYzLCAgIDY3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgIDYzLCAgIDYzLCAgIDYzLCAgICAwLCAgICAwLCAgICAwLCAgIDYzLCAgIDYzLCAgIDYzLAorICAgICAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDc0LCAgICAwLAorCisgICAgICAgIDAsICAgNzQsICAgNzQsICAgNzQsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsCisgICAgICAgNzUsICAgNzUsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsCisgICAgICAgNzcsICAgIDAsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzgsICAgIDAsCisgICAgICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzksICAgNzksICAgIDAsICAgNzksCisgICAgICAgODAsICAgIDAsICAgODAsICAgODEsICAgODEsICAgODEsICAgODIsICAgIDAsICAgODIsICAgODMsCisgICAgICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODQsICAgODQsICAgODQsCisgICAgICAgODQsICAgODQsICAgODQsICAgODQsICAgODQsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsCisgICAgICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsCisgICAgICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsICAgNzIsCisgICAgICAgNzIsICAgNzIsICAgNzIsICAgNzIKKworICAgIH0gOworCitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKK3N0YXRpYyBjaGFyICp5eV9sYXN0X2FjY2VwdGluZ19jcG9zOworCitleHRlcm4gaW50IHl5X2ZsZXhfZGVidWc7CitpbnQgeXlfZmxleF9kZWJ1ZyA9IDA7CisKKy8qIFRoZSBpbnRlbnQgYmVoaW5kIHRoaXMgZGVmaW5pdGlvbiBpcyB0aGF0IGl0J2xsIGNhdGNoCisgKiBhbnkgdXNlcyBvZiBSRUpFQ1Qgd2hpY2ggZmxleCBtaXNzZWQuCisgKi8KKyNkZWZpbmUgUkVKRUNUIHJlamVjdF91c2VkX2J1dF9ub3RfZGV0ZWN0ZWQKKyNkZWZpbmUgeXltb3JlKCkgeXltb3JlX3VzZWRfYnV0X25vdF9kZXRlY3RlZAorI2RlZmluZSBZWV9NT1JFX0FESiAwCisjZGVmaW5lIFlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKK2NoYXIgKnl5dGV4dDsKKy8qIExleGljYWwgYW5hbHlzaXMgZm9yIGdlbmtzeW1zLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKworICAgTmV3IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CisgICBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IEJqb3JuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4KKworICAgVGFrZW4gZnJvbSBMaW51eCBtb2R1dGlscyAyLjQuMjIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiZ2Vua3N5bXMuaCIKKyNpbmNsdWRlICJwYXJzZS50YWIuaCIKKworLyogV2UndmUgZ290IGEgdHdvLWxldmVsIGxleGVyIGhlcmUuICBXZSBsZXQgZmxleCBkbyBiYXNpYyB0b2tlbml6YXRpb24KKyAgIGFuZCB0aGVuIHdlIGNhdGVnb3JpemUgdGhvc2UgYmFzaWMgdG9rZW5zIGluIHRoZSBzZWNvbmQgc3RhZ2UuICAqLworI2RlZmluZSBZWV9ERUNMCQlzdGF0aWMgaW50IHl5bGV4MSh2b2lkKQorCisvKiBXZSBkb24ndCBkbyBtdWx0aXBsZSBpbnB1dCBmaWxlcy4gICovCisjZGVmaW5lIFlZX05PX0lOUFVUIDEKKworI2RlZmluZSBJTklUSUFMIDAKKworI2lmbmRlZiBZWV9OT19VTklTVERfSAorLyogU3BlY2lhbCBjYXNlIGZvciAidW5pc3RkLmgiLCBzaW5jZSBpdCBpcyBub24tQU5TSS4gV2UgaW5jbHVkZSBpdCB3YXkKKyAqIGRvd24gaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhlIHVzZXIncyBzZWN0aW9uIDEgdG8gaGF2ZSBiZWVuIHNjYW5uZWQgZmlyc3QuCisgKiBUaGUgdXNlciBoYXMgYSBjaGFuY2UgdG8gb3ZlcnJpZGUgaXQgd2l0aCBhbiBvcHRpb24uCisgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZuZGVmIFlZX0VYVFJBX1RZUEUKKyNkZWZpbmUgWVlfRVhUUkFfVFlQRSB2b2lkICoKKyNlbmRpZgorCitzdGF0aWMgaW50IHl5X2luaXRfZ2xvYmFscyAodm9pZCApOworCisvKiBBY2Nlc3NvciBtZXRob2RzIHRvIGdsb2JhbHMuCisgICBUaGVzZSBhcmUgbWFkZSB2aXNpYmxlIHRvIG5vbi1yZWVudHJhbnQgc2Nhbm5lcnMgZm9yIGNvbnZlbmllbmNlLiAqLworCitpbnQgeXlsZXhfZGVzdHJveSAodm9pZCApOworCitpbnQgeXlnZXRfZGVidWcgKHZvaWQgKTsKKwordm9pZCB5eXNldF9kZWJ1ZyAoaW50IGRlYnVnX2ZsYWcgICk7CisKK1lZX0VYVFJBX1RZUEUgeXlnZXRfZXh0cmEgKHZvaWQgKTsKKwordm9pZCB5eXNldF9leHRyYSAoWVlfRVhUUkFfVFlQRSB1c2VyX2RlZmluZWQgICk7CisKK0ZJTEUgKnl5Z2V0X2luICh2b2lkICk7CisKK3ZvaWQgeXlzZXRfaW4gIChGSUxFICogaW5fc3RyICApOworCitGSUxFICp5eWdldF9vdXQgKHZvaWQgKTsKKwordm9pZCB5eXNldF9vdXQgIChGSUxFICogb3V0X3N0ciAgKTsKKworaW50IHl5Z2V0X2xlbmcgKHZvaWQgKTsKKworY2hhciAqeXlnZXRfdGV4dCAodm9pZCApOworCitpbnQgeXlnZXRfbGluZW5vICh2b2lkICk7CisKK3ZvaWQgeXlzZXRfbGluZW5vIChpbnQgbGluZV9udW1iZXIgICk7CisKKy8qIE1hY3JvcyBhZnRlciB0aGlzIHBvaW50IGNhbiBhbGwgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIGRlZmluaXRpb25zIGluCisgKiBzZWN0aW9uIDEuCisgKi8KKworI2lmbmRlZiBZWV9TS0lQX1lZV1JBUAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIGludCB5eXdyYXAgKHZvaWQgKTsKKyNlbHNlCitleHRlcm4gaW50IHl5d3JhcCAodm9pZCApOworI2VuZGlmCisjZW5kaWYKKworICAgIHN0YXRpYyB2b2lkIHl5dW5wdXQgKGludCBjLGNoYXIgKmJ1Zl9wdHIgICk7CisgICAgCisjaWZuZGVmIHl5dGV4dF9wdHIKK3N0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciAqLHl5Y29uc3QgY2hhciAqLGludCApOworI2VuZGlmCisKKyNpZmRlZiBZWV9ORUVEX1NUUkxFTgorc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiAoeXljb25zdCBjaGFyICogKTsKKyNlbmRpZgorCisjaWZuZGVmIFlZX05PX0lOUFVUCisKKyNpZmRlZiBfX2NwbHVzcGx1cworc3RhdGljIGludCB5eWlucHV0ICh2b2lkICk7CisjZWxzZQorc3RhdGljIGludCBpbnB1dCAodm9pZCApOworI2VuZGlmCisKKyNlbmRpZgorCisvKiBBbW91bnQgb2Ygc3R1ZmYgdG8gc2x1cnAgdXAgd2l0aCBlYWNoIHJlYWQuICovCisjaWZuZGVmIFlZX1JFQURfQlVGX1NJWkUKKyNkZWZpbmUgWVlfUkVBRF9CVUZfU0laRSA4MTkyCisjZW5kaWYKKworLyogQ29weSB3aGF0ZXZlciB0aGUgbGFzdCBydWxlIG1hdGNoZWQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gKi8KKyNpZm5kZWYgRUNITworLyogVGhpcyB1c2VkIHRvIGJlIGFuIGZwdXRzKCksIGJ1dCBzaW5jZSB0aGUgc3RyaW5nIG1pZ2h0IGNvbnRhaW4gTlVMJ3MsCisgKiB3ZSBub3cgdXNlIGZ3cml0ZSgpLgorICovCisjZGVmaW5lIEVDSE8gZG8geyBpZiAoZndyaXRlKCB5eXRleHQsIHl5bGVuZywgMSwgeXlvdXQgKSkge30gfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBHZXRzIGlucHV0IGFuZCBzdHVmZnMgaXQgaW50byAiYnVmIi4gIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIFlZX05VTEwsCisgKiBpcyByZXR1cm5lZCBpbiAicmVzdWx0Ii4KKyAqLworI2lmbmRlZiBZWV9JTlBVVAorI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSBcCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lzX2ludGVyYWN0aXZlICkgXAorCQl7IFwKKwkJaW50IGMgPSAnKic7IFwKKwkJdW5zaWduZWQgbjsgXAorCQlmb3IgKCBuID0gMDsgbiA8IG1heF9zaXplICYmIFwKKwkJCSAgICAgKGMgPSBnZXRjKCB5eWluICkpICE9IEVPRiAmJiBjICE9ICdcbic7ICsrbiApIFwKKwkJCWJ1ZltuXSA9IChjaGFyKSBjOyBcCisJCWlmICggYyA9PSAnXG4nICkgXAorCQkJYnVmW24rK10gPSAoY2hhcikgYzsgXAorCQlpZiAoIGMgPT0gRU9GICYmIGZlcnJvciggeXlpbiApICkgXAorCQkJWVlfRkFUQUxfRVJST1IoICJpbnB1dCBpbiBmbGV4IHNjYW5uZXIgZmFpbGVkIiApOyBcCisJCXJlc3VsdCA9IG47IFwKKwkJfSBcCisJZWxzZSBcCisJCXsgXAorCQllcnJubz0wOyBcCisJCXdoaWxlICggKHJlc3VsdCA9IGZyZWFkKGJ1ZiwgMSwgbWF4X3NpemUsIHl5aW4pKT09MCAmJiBmZXJyb3IoeXlpbikpIFwKKwkJCXsgXAorCQkJaWYoIGVycm5vICE9IEVJTlRSKSBcCisJCQkJeyBcCisJCQkJWVlfRkFUQUxfRVJST1IoICJpbnB1dCBpbiBmbGV4IHNjYW5uZXIgZmFpbGVkIiApOyBcCisJCQkJYnJlYWs7IFwKKwkJCQl9IFwKKwkJCWVycm5vPTA7IFwKKwkJCWNsZWFyZXJyKHl5aW4pOyBcCisJCQl9IFwKKwkJfVwKK1wKKworI2VuZGlmCisKKy8qIE5vIHNlbWktY29sb24gYWZ0ZXIgcmV0dXJuOyBjb3JyZWN0IHVzYWdlIGlzIHRvIHdyaXRlICJ5eXRlcm1pbmF0ZSgpOyIgLQorICogd2UgZG9uJ3Qgd2FudCBhbiBleHRyYSAnOycgYWZ0ZXIgdGhlICJyZXR1cm4iIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlCisgKiBzb21lIGNvbXBpbGVycyB0byBjb21wbGFpbiBhYm91dCB1bnJlYWNoYWJsZSBzdGF0ZW1lbnRzLgorICovCisjaWZuZGVmIHl5dGVybWluYXRlCisjZGVmaW5lIHl5dGVybWluYXRlKCkgcmV0dXJuIFlZX05VTEwKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgZW50cmllcyBieSB3aGljaCBzdGFydC1jb25kaXRpb24gc3RhY2sgZ3Jvd3MuICovCisjaWZuZGVmIFlZX1NUQVJUX1NUQUNLX0lOQ1IKKyNkZWZpbmUgWVlfU1RBUlRfU1RBQ0tfSU5DUiAyNQorI2VuZGlmCisKKy8qIFJlcG9ydCBhIGZhdGFsIGVycm9yLiAqLworI2lmbmRlZiBZWV9GQVRBTF9FUlJPUgorI2RlZmluZSBZWV9GQVRBTF9FUlJPUihtc2cpIHl5X2ZhdGFsX2Vycm9yKCBtc2cgKQorI2VuZGlmCisKKy8qIGVuZCB0YWJsZXMgc2VyaWFsaXphdGlvbiBzdHJ1Y3R1cmVzIGFuZCBwcm90b3R5cGVzICovCisKKy8qIERlZmF1bHQgZGVjbGFyYXRpb24gb2YgZ2VuZXJhdGVkIHNjYW5uZXIgLSBhIGRlZmluZSBzbyB0aGUgdXNlciBjYW4KKyAqIGVhc2lseSBhZGQgcGFyYW1ldGVycy4KKyAqLworI2lmbmRlZiBZWV9ERUNMCisjZGVmaW5lIFlZX0RFQ0xfSVNfT1VSUyAxCisKK2V4dGVybiBpbnQgeXlsZXggKHZvaWQpOworCisjZGVmaW5lIFlZX0RFQ0wgaW50IHl5bGV4ICh2b2lkKQorI2VuZGlmIC8qICFZWV9ERUNMICovCisKKy8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bGUsIGFmdGVyIHl5dGV4dCBhbmQgeXlsZW5nCisgKiBoYXZlIGJlZW4gc2V0IHVwLgorICovCisjaWZuZGVmIFlZX1VTRVJfQUNUSU9OCisjZGVmaW5lIFlZX1VTRVJfQUNUSU9OCisjZW5kaWYKKworLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggcnVsZS4gKi8KKyNpZm5kZWYgWVlfQlJFQUsKKyNkZWZpbmUgWVlfQlJFQUsgYnJlYWs7CisjZW5kaWYKKworI2RlZmluZSBZWV9SVUxFX1NFVFVQIFwKKwlpZiAoIHl5bGVuZyA+IDAgKSBcCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sID0gXAorCQkJCSh5eXRleHRbeXlsZW5nIC0gMV0gPT0gJ1xuJyk7IFwKKwlZWV9VU0VSX0FDVElPTgorCisvKiogVGhlIG1haW4gc2Nhbm5lciBmdW5jdGlvbiB3aGljaCBkb2VzIGFsbCB0aGUgd29yay4KKyAqLworWVlfREVDTAoreworCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKKwlyZWdpc3RlciBjaGFyICp5eV9jcCwgKnl5X2JwOworCXJlZ2lzdGVyIGludCB5eV9hY3Q7CisgICAgCisgLyogS2VlcCB0cmFjayBvZiBvdXIgbG9jYXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy4gICovCisKKwlpZiAoICEoeXlfaW5pdCkgKQorCQl7CisJCSh5eV9pbml0KSA9IDE7CisKKyNpZmRlZiBZWV9VU0VSX0lOSVQKKwkJWVlfVVNFUl9JTklUOworI2VuZGlmCisKKwkJaWYgKCAhICh5eV9zdGFydCkgKQorCQkJKHl5X3N0YXJ0KSA9IDE7CS8qIGZpcnN0IHN0YXJ0IHN0YXRlICovCisKKwkJaWYgKCAhIHl5aW4gKQorCQkJeXlpbiA9IHN0ZGluOworCisJCWlmICggISB5eW91dCApCisJCQl5eW91dCA9IHN0ZG91dDsKKworCQlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKSB7CisJCQl5eWVuc3VyZV9idWZmZXJfc3RhY2sgKCk7CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPQorCQkJCXl5X2NyZWF0ZV9idWZmZXIoeXlpbixZWV9CVUZfU0laRSApOworCQl9CisKKwkJeXlfbG9hZF9idWZmZXJfc3RhdGUoICk7CisJCX0KKworCXdoaWxlICggMSApCQkvKiBsb29wcyB1bnRpbCBlbmQtb2YtZmlsZSBpcyByZWFjaGVkICovCisJCXsKKwkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisKKwkJLyogU3VwcG9ydCBvZiB5eXRleHQuICovCisJCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOworCisJCS8qIHl5X2JwIHBvaW50cyB0byB0aGUgcG9zaXRpb24gaW4geXlfY2hfYnVmIG9mIHRoZSBzdGFydCBvZgorCQkgKiB0aGUgY3VycmVudCBydW4uCisJCSAqLworCQl5eV9icCA9IHl5X2NwOworCisJCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfc3RhcnQpOworCQl5eV9jdXJyZW50X3N0YXRlICs9IFlZX0FUX0JPTCgpOworeXlfbWF0Y2g6CisJCWRvCisJCQl7CisJCQlyZWdpc3RlciBZWV9DSEFSIHl5X2MgPSB5eV9lY1tZWV9TQ19UT19VSSgqeXlfY3ApXTsKKwkJCWlmICggeXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdICkKKwkJCQl7CisJCQkJKHl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlKSA9IHl5X2N1cnJlbnRfc3RhdGU7CisJCQkJKHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MpID0geXlfY3A7CisJCQkJfQorCQkJd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQorCQkJCXsKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOworCQkJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA3MyApCisJCQkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQkJCX0KKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQkJKyt5eV9jcDsKKwkJCX0KKwkJd2hpbGUgKCB5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICE9IDI2NiApOworCit5eV9maW5kX2FjdGlvbjoKKwkJeXlfYWN0ID0geXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdOworCQlpZiAoIHl5X2FjdCA9PSAwICkKKwkJCXsgLyogaGF2ZSB0byBiYWNrIHVwICovCisJCQl5eV9jcCA9ICh5eV9sYXN0X2FjY2VwdGluZ19jcG9zKTsKKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfbGFzdF9hY2NlcHRpbmdfc3RhdGUpOworCQkJeXlfYWN0ID0geXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdOworCQkJfQorCisJCVlZX0RPX0JFRk9SRV9BQ1RJT047CisKK2RvX2FjdGlvbjoJLyogVGhpcyBsYWJlbCBpcyB1c2VkIG9ubHkgdG8gYWNjZXNzIEVPRiBhY3Rpb25zLiAqLworCisJCXN3aXRjaCAoIHl5X2FjdCApCisJeyAvKiBiZWdpbm5pbmcgb2YgYWN0aW9uIHN3aXRjaCAqLworCQkJY2FzZSAwOiAvKiBtdXN0IGJhY2sgdXAgKi8KKwkJCS8qIHVuZG8gdGhlIGVmZmVjdHMgb2YgWVlfRE9fQkVGT1JFX0FDVElPTiAqLworCQkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7CisJCQl5eV9jcCA9ICh5eV9sYXN0X2FjY2VwdGluZ19jcG9zKTsKKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfbGFzdF9hY2NlcHRpbmdfc3RhdGUpOworCQkJZ290byB5eV9maW5kX2FjdGlvbjsKKworY2FzZSAxOgorLyogcnVsZSAxIGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3JldHVybiBGSUxFTkFNRTsKKwlZWV9CUkVBSworY2FzZSAyOgorLyogcnVsZSAyIGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK2N1cl9saW5lKys7CisJWVlfQlJFQUsKK2Nhc2UgMzoKKy8qIHJ1bGUgMyBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCitjdXJfbGluZSsrOworCVlZX0JSRUFLCisvKiBJZ25vcmUgYWxsIG90aGVyIHdoaXRlc3BhY2UuICAqLworY2FzZSA0OgorWVlfUlVMRV9TRVRVUAorOworCVlZX0JSRUFLCitjYXNlIDU6CisvKiBydWxlIDUgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAorcmV0dXJuIFNUUklORzsKKwlZWV9CUkVBSworY2FzZSA2OgorLyogcnVsZSA2IGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3JldHVybiBDSEFSOworCVlZX0JSRUFLCitjYXNlIDc6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gSURFTlQ7CisJWVlfQlJFQUsKKy8qIFRoZSBQZWRhbnQgcmVxdWlyZXMgdGhhdCB0aGUgb3RoZXIgQyBtdWx0aS1jaGFyYWN0ZXIgdG9rZW5zIGJlCisgICAgcmVjb2duaXplZCBhcyB0b2tlbnMuICBXZSBkb24ndCBhY3R1YWxseSB1c2UgdGhlbSBzaW5jZSB3ZSBkb24ndAorICAgIHBhcnNlIGV4cHJlc3Npb25zLCBidXQgd2UgZG8gd2FudCB3aGl0ZXNwYWNlIHRvIGJlIGFycmFuZ2VkCisgICAgYXJvdW5kIHRoZW0gcHJvcGVybHkuICAqLworY2FzZSA4OgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIE9USEVSOworCVlZX0JSRUFLCitjYXNlIDk6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gSU5UOworCVlZX0JSRUFLCitjYXNlIDEwOgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFJFQUw7CisJWVlfQlJFQUsKK2Nhc2UgMTE6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gRE9UUzsKKwlZWV9CUkVBSworLyogQWxsIG90aGVyIHRva2VucyBhcmUgc2luZ2xlIGNoYXJhY3RlcnMuICAqLworY2FzZSAxMjoKK1lZX1JVTEVfU0VUVVAKK3JldHVybiB5eXRleHRbMF07CisJWVlfQlJFQUsKK2Nhc2UgMTM6CitZWV9SVUxFX1NFVFVQCitFQ0hPOworCVlZX0JSRUFLCitjYXNlIFlZX1NUQVRFX0VPRihJTklUSUFMKToKKwl5eXRlcm1pbmF0ZSgpOworCisJY2FzZSBZWV9FTkRfT0ZfQlVGRkVSOgorCQl7CisJCS8qIEFtb3VudCBvZiB0ZXh0IG1hdGNoZWQgbm90IGluY2x1ZGluZyB0aGUgRU9CIGNoYXIuICovCisJCWludCB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0ID0gKGludCkgKHl5X2NwIC0gKHl5dGV4dF9wdHIpKSAtIDE7CisKKwkJLyogVW5kbyB0aGUgZWZmZWN0cyBvZiBZWV9ET19CRUZPUkVfQUNUSU9OLiAqLworCQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsKKwkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVAorCisJCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID09IFlZX0JVRkZFUl9ORVcgKQorCQkJeworCQkJLyogV2UncmUgc2Nhbm5pbmcgYSBuZXcgZmlsZSBvciBpbnB1dCBzb3VyY2UuICBJdCdzCisJCQkgKiBwb3NzaWJsZSB0aGF0IHRoaXMgaGFwcGVuZWQgYmVjYXVzZSB0aGUgdXNlcgorCQkJICoganVzdCBwb2ludGVkIHl5aW4gYXQgYSBuZXcgc291cmNlIGFuZCBjYWxsZWQKKwkJCSAqIHl5bGV4KCkuICBJZiBzbywgdGhlbiB3ZSBoYXZlIHRvIGFzc3VyZQorCQkJICogY29uc2lzdGVuY3kgYmV0d2VlbiBZWV9DVVJSRU5UX0JVRkZFUiBhbmQgb3VyCisJCQkgKiBnbG9iYWxzLiAgSGVyZSBpcyB0aGUgcmlnaHQgcGxhY2UgdG8gZG8gc28sIGJlY2F1c2UKKwkJCSAqIHRoaXMgaXMgdGhlIGZpcnN0IGFjdGlvbiAob3RoZXIgdGhhbiBwb3NzaWJseSBhCisJCQkgKiBiYWNrLXVwKSB0aGF0IHdpbGwgbWF0Y2ggZm9yIHRoZSBuZXcgaW5wdXQgc291cmNlLgorCQkJICovCisJCQkoeXlfbl9jaGFycykgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnM7CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lucHV0X2ZpbGUgPSB5eWluOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05PUk1BTDsKKwkJCX0KKworCQkvKiBOb3RlIHRoYXQgaGVyZSB3ZSB0ZXN0IGZvciB5eV9jX2J1Zl9wICI8PSIgdG8gdGhlIHBvc2l0aW9uCisJCSAqIG9mIHRoZSBmaXJzdCBFT0IgaW4gdGhlIGJ1ZmZlciwgc2luY2UgeXlfY19idWZfcCB3aWxsCisJCSAqIGFscmVhZHkgaGF2ZSBiZWVuIGluY3JlbWVudGVkIHBhc3QgdGhlIE5VTCBjaGFyYWN0ZXIKKwkJICogKHNpbmNlIGFsbCBzdGF0ZXMgbWFrZSB0cmFuc2l0aW9ucyBvbiBFT0IgdG8gdGhlCisJCSAqIGVuZC1vZi1idWZmZXIgc3RhdGUpLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZSB0ZXN0CisJCSAqIGluIGlucHV0KCkuCisJCSAqLworCQlpZiAoICh5eV9jX2J1Zl9wKSA8PSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSApCisJCQl7IC8qIFRoaXMgd2FzIHJlYWxseSBhIE5VTC4gKi8KKwkJCXl5X3N0YXRlX3R5cGUgeXlfbmV4dF9zdGF0ZTsKKworCQkJKHl5X2NfYnVmX3ApID0gKHl5dGV4dF9wdHIpICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKKworCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7CisKKwkJCS8qIE9rYXksIHdlJ3JlIG5vdyBwb3NpdGlvbmVkIHRvIG1ha2UgdGhlIE5VTAorCQkJICogdHJhbnNpdGlvbi4gIFdlIGNvdWxkbid0IGhhdmUKKwkJCSAqIHl5X2dldF9wcmV2aW91c19zdGF0ZSgpIGdvIGFoZWFkIGFuZCBkbyBpdAorCQkJICogZm9yIHVzIGJlY2F1c2UgaXQgZG9lc24ndCBrbm93IGhvdyB0byBkZWFsCisJCQkgKiB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiBqYW1taW5nIChhbmQgd2UgZG9uJ3QKKwkJCSAqIHdhbnQgdG8gYnVpbGQgamFtbWluZyBpbnRvIGl0IGJlY2F1c2UgdGhlbiBpdAorCQkJICogd2lsbCBydW4gbW9yZSBzbG93bHkpLgorCQkJICovCisKKwkJCXl5X25leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCB5eV9jdXJyZW50X3N0YXRlICk7CisKKwkJCXl5X2JwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisKKwkJCWlmICggeXlfbmV4dF9zdGF0ZSApCisJCQkJeworCQkJCS8qIENvbnN1bWUgdGhlIE5VTC4gKi8KKwkJCQl5eV9jcCA9ICsrKHl5X2NfYnVmX3ApOworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9uZXh0X3N0YXRlOworCQkJCWdvdG8geXlfbWF0Y2g7CisJCQkJfQorCisJCQllbHNlCisJCQkJeworCQkJCXl5X2NwID0gKHl5X2NfYnVmX3ApOworCQkJCWdvdG8geXlfZmluZF9hY3Rpb247CisJCQkJfQorCQkJfQorCisJCWVsc2Ugc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCAgKSApCisJCQl7CisJCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6CisJCQkJeworCQkJCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMDsKKworCQkJCWlmICggeXl3cmFwKCApICkKKwkJCQkJeworCQkJCQkvKiBOb3RlOiBiZWNhdXNlIHdlJ3ZlIHRha2VuIGNhcmUgaW4KKwkJCQkJICogeXlfZ2V0X25leHRfYnVmZmVyKCkgdG8gaGF2ZSBzZXQgdXAKKwkJCQkJICogeXl0ZXh0LCB3ZSBjYW4gbm93IHNldCB1cAorCQkJCQkgKiB5eV9jX2J1Zl9wIHNvIHRoYXQgaWYgc29tZSB0b3RhbAorCQkJCQkgKiBob3NlciAobGlrZSBmbGV4IGl0c2VsZikgd2FudHMgdG8KKwkJCQkJICogY2FsbCB0aGUgc2Nhbm5lciBhZnRlciB3ZSByZXR1cm4gdGhlCisJCQkJCSAqIFlZX05VTEwsIGl0J2xsIHN0aWxsIHdvcmsgLSBhbm90aGVyCisJCQkJCSAqIFlZX05VTEwgd2lsbCBnZXQgcmV0dXJuZWQuCisJCQkJCSAqLworCQkJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKKworCQkJCQl5eV9hY3QgPSBZWV9TVEFURV9FT0YoWVlfU1RBUlQpOworCQkJCQlnb3RvIGRvX2FjdGlvbjsKKwkJCQkJfQorCisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmICggISAoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSApCisJCQkJCQlZWV9ORVdfRklMRTsKKwkJCQkJfQorCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46CisJCQkJKHl5X2NfYnVmX3ApID0KKwkJCQkJKHl5dGV4dF9wdHIpICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoICApOworCisJCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisJCQkJeXlfYnAgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X21hdGNoOworCisJCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKKwkJCQkoeXlfY19idWZfcCkgPQorCQkJCSZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldOworCisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7CisKKwkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKwkJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCQkJCWdvdG8geXlfZmluZF9hY3Rpb247CisJCQl9CisJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlZWV9GQVRBTF9FUlJPUigKKwkJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLW5vIGFjdGlvbiBmb3VuZCIgKTsKKwl9IC8qIGVuZCBvZiBhY3Rpb24gc3dpdGNoICovCisJCX0gLyogZW5kIG9mIHNjYW5uaW5nIG9uZSB0b2tlbiAqLworfSAvKiBlbmQgb2YgeXlsZXggKi8KKworLyogeXlfZ2V0X25leHRfYnVmZmVyIC0gdHJ5IHRvIHJlYWQgaW4gYSBuZXcgYnVmZmVyCisgKgorICogUmV0dXJucyBhIGNvZGUgcmVwcmVzZW50aW5nIGFuIGFjdGlvbjoKKyAqCUVPQl9BQ1RfTEFTVF9NQVRDSCAtCisgKglFT0JfQUNUX0NPTlRJTlVFX1NDQU4gLSBjb250aW51ZSBzY2FubmluZyBmcm9tIGN1cnJlbnQgcG9zaXRpb24KKyAqCUVPQl9BQ1RfRU5EX09GX0ZJTEUgLSBlbmQgb2YgZmlsZQorICovCitzdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlciAodm9pZCkKK3sKKyAgICAJcmVnaXN0ZXIgY2hhciAqZGVzdCA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmOworCXJlZ2lzdGVyIGNoYXIgKnNvdXJjZSA9ICh5eXRleHRfcHRyKTsKKwlyZWdpc3RlciBpbnQgbnVtYmVyX3RvX21vdmUsIGk7CisJaW50IHJldF92YWw7CisKKwlpZiAoICh5eV9jX2J1Zl9wKSA+ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycykgKyAxXSApCisJCVlZX0ZBVEFMX0VSUk9SKAorCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1lbmQgb2YgYnVmZmVyIG1pc3NlZCIgKTsKKworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9maWxsX2J1ZmZlciA9PSAwICkKKwkJeyAvKiBEb24ndCB0cnkgdG8gZmlsbCB0aGUgYnVmZmVyLCBzbyB0aGlzIGlzIGFuIEVPRi4gKi8KKwkJaWYgKCAoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cikgLSBZWV9NT1JFX0FESiA9PSAxICkKKwkJCXsKKwkJCS8qIFdlIG1hdGNoZWQgYSBzaW5nbGUgY2hhcmFjdGVyLCB0aGUgRU9CLCBzbworCQkJICogdHJlYXQgdGhpcyBhcyBhIGZpbmFsIEVPRi4KKwkJCSAqLworCQkJcmV0dXJuIEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl9CisKKwkJZWxzZQorCQkJeworCQkJLyogV2UgbWF0Y2hlZCBzb21lIHRleHQgcHJpb3IgdG8gdGhlIEVPQiwgZmlyc3QKKwkJCSAqIHByb2Nlc3MgaXQuCisJCQkgKi8KKwkJCXJldHVybiBFT0JfQUNUX0xBU1RfTUFUQ0g7CisJCQl9CisJCX0KKworCS8qIFRyeSB0byByZWFkIG1vcmUgZGF0YS4gKi8KKworCS8qIEZpcnN0IG1vdmUgbGFzdCBjaGFycyB0byBzdGFydCBvZiBidWZmZXIuICovCisJbnVtYmVyX3RvX21vdmUgPSAoaW50KSAoKHl5X2NfYnVmX3ApIC0gKHl5dGV4dF9wdHIpKSAtIDE7CisKKwlmb3IgKCBpID0gMDsgaSA8IG51bWJlcl90b19tb3ZlOyArK2kgKQorCQkqKGRlc3QrKykgPSAqKHNvdXJjZSsrKTsKKworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID09IFlZX0JVRkZFUl9FT0ZfUEVORElORyApCisJCS8qIGRvbid0IGRvIHRoZSByZWFkLCBpdCdzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybiBhbiBFT0YsCisJCSAqIGp1c3QgZm9yY2UgYW4gRU9GCisJCSAqLworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycykgPSAwOworCisJZWxzZQorCQl7CisJCQlpbnQgbnVtX3RvX3JlYWQgPQorCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSAtIG51bWJlcl90b19tb3ZlIC0gMTsKKworCQl3aGlsZSAoIG51bV90b19yZWFkIDw9IDAgKQorCQkJeyAvKiBOb3QgZW5vdWdoIHJvb20gaW4gdGhlIGJ1ZmZlciAtIGdyb3cgaXQuICovCisKKwkJCS8qIGp1c3QgYSBzaG9ydGVyIG5hbWUgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciAqLworCQkJWVlfQlVGRkVSX1NUQVRFIGIgPSBZWV9DVVJSRU5UX0JVRkZFUjsKKworCQkJaW50IHl5X2NfYnVmX3Bfb2Zmc2V0ID0KKwkJCQkoaW50KSAoKHl5X2NfYnVmX3ApIC0gYi0+eXlfY2hfYnVmKTsKKworCQkJaWYgKCBiLT55eV9pc19vdXJfYnVmZmVyICkKKwkJCQl7CisJCQkJaW50IG5ld19zaXplID0gYi0+eXlfYnVmX3NpemUgKiAyOworCisJCQkJaWYgKCBuZXdfc2l6ZSA8PSAwICkKKwkJCQkJYi0+eXlfYnVmX3NpemUgKz0gYi0+eXlfYnVmX3NpemUgLyA4OworCQkJCWVsc2UKKwkJCQkJYi0+eXlfYnVmX3NpemUgKj0gMjsKKworCQkJCWItPnl5X2NoX2J1ZiA9IChjaGFyICopCisJCQkJCS8qIEluY2x1ZGUgcm9vbSBpbiBmb3IgMiBFT0IgY2hhcnMuICovCisJCQkJCXl5cmVhbGxvYygodm9pZCAqKSBiLT55eV9jaF9idWYsYi0+eXlfYnVmX3NpemUgKyAyICApOworCQkJCX0KKwkJCWVsc2UKKwkJCQkvKiBDYW4ndCBncm93IGl0LCB3ZSBkb24ndCBvd24gaXQuICovCisJCQkJYi0+eXlfY2hfYnVmID0gMDsKKworCQkJaWYgKCAhIGItPnl5X2NoX2J1ZiApCisJCQkJWVlfRkFUQUxfRVJST1IoCisJCQkJImZhdGFsIGVycm9yIC0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3ciICk7CisKKwkJCSh5eV9jX2J1Zl9wKSA9ICZiLT55eV9jaF9idWZbeXlfY19idWZfcF9vZmZzZXRdOworCisJCQludW1fdG9fcmVhZCA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgLQorCQkJCQkJbnVtYmVyX3RvX21vdmUgLSAxOworCisJCQl9CisKKwkJaWYgKCBudW1fdG9fcmVhZCA+IFlZX1JFQURfQlVGX1NJWkUgKQorCQkJbnVtX3RvX3JlYWQgPSBZWV9SRUFEX0JVRl9TSVpFOworCisJCS8qIFJlYWQgaW4gbW9yZSBkYXRhLiAqLworCQlZWV9JTlBVVCggKCZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV0pLAorCQkJKHl5X25fY2hhcnMpLCAoc2l6ZV90KSBudW1fdG9fcmVhZCApOworCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKKwkJfQorCisJaWYgKCAoeXlfbl9jaGFycykgPT0gMCApCisJCXsKKwkJaWYgKCBudW1iZXJfdG9fbW92ZSA9PSBZWV9NT1JFX0FESiApCisJCQl7CisJCQlyZXRfdmFsID0gRU9CX0FDVF9FTkRfT0ZfRklMRTsKKwkJCXl5cmVzdGFydCh5eWluICApOworCQkJfQorCisJCWVsc2UKKwkJCXsKKwkJCXJldF92YWwgPSBFT0JfQUNUX0xBU1RfTUFUQ0g7CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPQorCQkJCVlZX0JVRkZFUl9FT0ZfUEVORElORzsKKwkJCX0KKwkJfQorCisJZWxzZQorCQlyZXRfdmFsID0gRU9CX0FDVF9DT05USU5VRV9TQ0FOOworCisJaWYgKCh5eV9zaXplX3QpICgoeXlfbl9jaGFycykgKyBudW1iZXJfdG9fbW92ZSkgPiBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplKSB7CisJCS8qIEV4dGVuZCB0aGUgYXJyYXkgYnkgNTAlLCBwbHVzIHRoZSBudW1iZXIgd2UgcmVhbGx5IG5lZWQuICovCisJCXl5X3NpemVfdCBuZXdfc2l6ZSA9ICh5eV9uX2NoYXJzKSArIG51bWJlcl90b19tb3ZlICsgKCh5eV9uX2NoYXJzKSA+PiAxKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgPSAoY2hhciAqKSB5eXJlYWxsb2MoKHZvaWQgKikgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYsbmV3X3NpemUgICk7CisJCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiApCisJCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9nZXRfbmV4dF9idWZmZXIoKSIgKTsKKwl9CisKKwkoeXlfbl9jaGFycykgKz0gbnVtYmVyX3RvX21vdmU7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycykgKyAxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCSh5eXRleHRfcHRyKSA9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlswXTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKiB5eV9nZXRfcHJldmlvdXNfc3RhdGUgLSBnZXQgdGhlIHN0YXRlIGp1c3QgYmVmb3JlIHRoZSBFT0IgY2hhciB3YXMgcmVhY2hlZCAqLworCisgICAgc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh2b2lkKQoreworCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKKwlyZWdpc3RlciBjaGFyICp5eV9jcDsKKyAgICAKKwl5eV9jdXJyZW50X3N0YXRlID0gKHl5X3N0YXJ0KTsKKwl5eV9jdXJyZW50X3N0YXRlICs9IFlZX0FUX0JPTCgpOworCisJZm9yICggeXlfY3AgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsgeXlfY3AgPCAoeXlfY19idWZfcCk7ICsreXlfY3AgKQorCQl7CisJCXJlZ2lzdGVyIFlZX0NIQVIgeXlfYyA9ICgqeXlfY3AgPyB5eV9lY1tZWV9TQ19UT19VSSgqeXlfY3ApXSA6IDEpOworCQlpZiAoIHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXSApCisJCQl7CisJCQkoeXlfbGFzdF9hY2NlcHRpbmdfc3RhdGUpID0geXlfY3VycmVudF9zdGF0ZTsKKwkJCSh5eV9sYXN0X2FjY2VwdGluZ19jcG9zKSA9IHl5X2NwOworCQkJfQorCQl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCisJCQl7CisJCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOworCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDczICkKKwkJCQl5eV9jID0geXlfbWV0YVsodW5zaWduZWQgaW50KSB5eV9jXTsKKwkJCX0KKwkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgKHVuc2lnbmVkIGludCkgeXlfY107CisJCX0KKworCXJldHVybiB5eV9jdXJyZW50X3N0YXRlOworfQorCisvKiB5eV90cnlfTlVMX3RyYW5zIC0gdHJ5IHRvIG1ha2UgYSB0cmFuc2l0aW9uIG9uIHRoZSBOVUwgY2hhcmFjdGVyCisgKgorICogc3lub3BzaXMKKyAqCW5leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCBjdXJyZW50X3N0YXRlICk7CisgKi8KKyAgICBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zICAoeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlICkKK3sKKwlyZWdpc3RlciBpbnQgeXlfaXNfamFtOworICAgIAlyZWdpc3RlciBjaGFyICp5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKworCXJlZ2lzdGVyIFlZX0NIQVIgeXlfYyA9IDE7CisJaWYgKCB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV0gKQorCQl7CisJCSh5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSkgPSB5eV9jdXJyZW50X3N0YXRlOworCQkoeXlfbGFzdF9hY2NlcHRpbmdfY3BvcykgPSB5eV9jcDsKKwkJfQorCXdoaWxlICggeXlfY2hrW3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyB5eV9jXSAhPSB5eV9jdXJyZW50X3N0YXRlICkKKwkJeworCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOworCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gNzMgKQorCQkJeXlfYyA9IHl5X21ldGFbKHVuc2lnbmVkIGludCkgeXlfY107CisJCX0KKwl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyAodW5zaWduZWQgaW50KSB5eV9jXTsKKwl5eV9pc19qYW0gPSAoeXlfY3VycmVudF9zdGF0ZSA9PSA3Mik7CisKKwlyZXR1cm4geXlfaXNfamFtID8gMCA6IHl5X2N1cnJlbnRfc3RhdGU7Cit9CisKKyAgICBzdGF0aWMgdm9pZCB5eXVucHV0IChpbnQgYywgcmVnaXN0ZXIgY2hhciAqIHl5X2JwICkKK3sKKwlyZWdpc3RlciBjaGFyICp5eV9jcDsKKyAgICAKKyAgICB5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKworCS8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHl5dGV4dCAqLworCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOworCisJaWYgKCB5eV9jcCA8IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICsgMiApCisJCXsgLyogbmVlZCB0byBzaGlmdCB0aGluZ3MgdXAgdG8gbWFrZSByb29tICovCisJCS8qICsyIGZvciBFT0IgY2hhcnMuICovCisJCXJlZ2lzdGVyIGludCBudW1iZXJfdG9fbW92ZSA9ICh5eV9uX2NoYXJzKSArIDI7CisJCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbCisJCQkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgKyAyXTsKKwkJcmVnaXN0ZXIgY2hhciAqc291cmNlID0KKwkJCQkmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbbnVtYmVyX3RvX21vdmVdOworCisJCXdoaWxlICggc291cmNlID4gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKQorCQkJKi0tZGVzdCA9ICotLXNvdXJjZTsKKworCQl5eV9jcCArPSAoaW50KSAoZGVzdCAtIHNvdXJjZSk7CisJCXl5X2JwICs9IChpbnQpIChkZXN0IC0gc291cmNlKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0KKwkJCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemU7CisKKwkJaWYgKCB5eV9jcCA8IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICsgMiApCisJCQlZWV9GQVRBTF9FUlJPUiggImZsZXggc2Nhbm5lciBwdXNoLWJhY2sgb3ZlcmZsb3ciICk7CisJCX0KKworCSotLXl5X2NwID0gKGNoYXIpIGM7CisKKwkoeXl0ZXh0X3B0cikgPSB5eV9icDsKKwkoeXlfaG9sZF9jaGFyKSA9ICp5eV9jcDsKKwkoeXlfY19idWZfcCkgPSB5eV9jcDsKK30KKworI2lmbmRlZiBZWV9OT19JTlBVVAorI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgc3RhdGljIGludCB5eWlucHV0ICh2b2lkKQorI2Vsc2UKKyAgICBzdGF0aWMgaW50IGlucHV0ICAodm9pZCkKKyNlbmRpZgorCit7CisJaW50IGM7CisgICAgCisJKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOworCisJaWYgKCAqKHl5X2NfYnVmX3ApID09IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCXsKKwkJLyogeXlfY19idWZfcCBub3cgcG9pbnRzIHRvIHRoZSBjaGFyYWN0ZXIgd2Ugd2FudCB0byByZXR1cm4uCisJCSAqIElmIHRoaXMgb2NjdXJzICpiZWZvcmUqIHRoZSBFT0IgY2hhcmFjdGVycywgdGhlbiBpdCdzIGEKKwkJICogdmFsaWQgTlVMOyBpZiBub3QsIHRoZW4gd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJICovCisJCWlmICggKHl5X2NfYnVmX3ApIDwgJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV0gKQorCQkJLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLworCQkJKih5eV9jX2J1Zl9wKSA9ICdcMCc7CisKKwkJZWxzZQorCQkJeyAvKiBuZWVkIG1vcmUgaW5wdXQgKi8KKwkJCWludCBvZmZzZXQgPSAoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cik7CisJCQkrKyh5eV9jX2J1Zl9wKTsKKworCQkJc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCAgKSApCisJCQkJeworCQkJCWNhc2UgRU9CX0FDVF9MQVNUX01BVENIOgorCQkJCQkvKiBUaGlzIGhhcHBlbnMgYmVjYXVzZSB5eV9nX25fYigpCisJCQkJCSAqIHNlZXMgdGhhdCB3ZSd2ZSBhY2N1bXVsYXRlZCBhCisJCQkJCSAqIHRva2VuIGFuZCBmbGFncyB0aGF0IHdlIG5lZWQgdG8KKwkJCQkJICogdHJ5IG1hdGNoaW5nIHRoZSB0b2tlbiBiZWZvcmUKKwkJCQkJICogcHJvY2VlZGluZy4gIEJ1dCBmb3IgaW5wdXQoKSwKKwkJCQkJICogdGhlcmUncyBubyBtYXRjaGluZyB0byBjb25zaWRlci4KKwkJCQkJICogU28gY29udmVydCB0aGUgRU9CX0FDVF9MQVNUX01BVENICisJCQkJCSAqIHRvIEVPQl9BQ1RfRU5EX09GX0ZJTEUuCisJCQkJCSAqLworCisJCQkJCS8qIFJlc2V0IGJ1ZmZlciBzdGF0dXMuICovCisJCQkJCXl5cmVzdGFydCh5eWluICk7CisKKwkJCQkJLypGQUxMVEhST1VHSCovCisKKwkJCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6CisJCQkJCXsKKwkJCQkJaWYgKCB5eXdyYXAoICkgKQorCQkJCQkJcmV0dXJuIEVPRjsKKworCQkJCQlpZiAoICEgKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgKQorCQkJCQkJWVlfTkVXX0ZJTEU7CisjaWZkZWYgX19jcGx1c3BsdXMKKwkJCQkJcmV0dXJuIHl5aW5wdXQoKTsKKyNlbHNlCisJCQkJCXJldHVybiBpbnB1dCgpOworI2VuZGlmCisJCQkJCX0KKworCQkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgorCQkJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyBvZmZzZXQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJYyA9ICoodW5zaWduZWQgY2hhciAqKSAoeXlfY19idWZfcCk7CS8qIGNhc3QgZm9yIDgtYml0IGNoYXIncyAqLworCSooeXlfY19idWZfcCkgPSAnXDAnOwkvKiBwcmVzZXJ2ZSB5eXRleHQgKi8KKwkoeXlfaG9sZF9jaGFyKSA9ICorKyh5eV9jX2J1Zl9wKTsKKworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sID0gKGMgPT0gJ1xuJyk7CisKKwlyZXR1cm4gYzsKK30KKyNlbmRpZgkvKiBpZm5kZWYgWVlfTk9fSU5QVVQgKi8KKworLyoqIEltbWVkaWF0ZWx5IHN3aXRjaCB0byBhIGRpZmZlcmVudCBpbnB1dCBzdHJlYW0uCisgKiBAcGFyYW0gaW5wdXRfZmlsZSBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIAorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXNldCB0aGUgc3RhcnQgY29uZGl0aW9uIHRvIEBjIElOSVRJQUwgLgorICovCisgICAgdm9pZCB5eXJlc3RhcnQgIChGSUxFICogaW5wdXRfZmlsZSApCit7CisgICAgCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7CisgICAgICAgIHl5ZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0KKyAgICAgICAgICAgIHl5X2NyZWF0ZV9idWZmZXIoeXlpbixZWV9CVUZfU0laRSApOworCX0KKworCXl5X2luaXRfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSLGlucHV0X2ZpbGUgKTsKKwl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKK30KKworLyoqIFN3aXRjaCB0byBhIGRpZmZlcmVudCBpbnB1dCBidWZmZXIuCisgKiBAcGFyYW0gbmV3X2J1ZmZlciBUaGUgbmV3IGlucHV0IGJ1ZmZlci4KKyAqIAorICovCisgICAgdm9pZCB5eV9zd2l0Y2hfdG9fYnVmZmVyICAoWVlfQlVGRkVSX1NUQVRFICBuZXdfYnVmZmVyICkKK3sKKyAgICAKKwkvKiBUT0RPLiBXZSBzaG91bGQgYmUgYWJsZSB0byByZXBsYWNlIHRoaXMgZW50aXJlIGZ1bmN0aW9uIGJvZHkKKwkgKiB3aXRoCisJICoJCXl5cG9wX2J1ZmZlcl9zdGF0ZSgpOworCSAqCQl5eXB1c2hfYnVmZmVyX3N0YXRlKG5ld19idWZmZXIpOworICAgICAqLworCXl5ZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSID09IG5ld19idWZmZXIgKQorCQlyZXR1cm47CisKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSICkKKwkJeworCQkvKiBGbHVzaCBvdXQgaW5mb3JtYXRpb24gZm9yIG9sZCBidWZmZXIuICovCisJCSooeXlfY19idWZfcCkgPSAoeXlfaG9sZF9jaGFyKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zID0gKHl5X2NfYnVmX3ApOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycyk7CisJCX0KKworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IG5ld19idWZmZXI7CisJeXlfbG9hZF9idWZmZXJfc3RhdGUoICk7CisKKwkvKiBXZSBkb24ndCBhY3R1YWxseSBrbm93IHdoZXRoZXIgd2UgZGlkIHRoaXMgc3dpdGNoIGR1cmluZworCSAqIEVPRiAoeXl3cmFwKCkpIHByb2Nlc3NpbmcsIGJ1dCB0aGUgb25seSB0aW1lIHRoaXMgZmxhZworCSAqIGlzIGxvb2tlZCBhdCBpcyBhZnRlciB5eXdyYXAoKSBpcyBjYWxsZWQsIHNvIGl0J3Mgc2FmZQorCSAqIHRvIGdvIGFoZWFkIGFuZCBhbHdheXMgc2V0IGl0LgorCSAqLworCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMTsKK30KKworc3RhdGljIHZvaWQgeXlfbG9hZF9idWZmZXJfc3RhdGUgICh2b2lkKQoreworICAgIAkoeXlfbl9jaGFycykgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnM7CisJKHl5dGV4dF9wdHIpID0gKHl5X2NfYnVmX3ApID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zOworCXl5aW4gPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lucHV0X2ZpbGU7CisJKHl5X2hvbGRfY2hhcikgPSAqKHl5X2NfYnVmX3ApOworfQorCisvKiogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gaW5wdXQgYnVmZmVyIHN0YXRlLgorICogQHBhcmFtIGZpbGUgQSByZWFkYWJsZSBzdHJlYW0uCisgKiBAcGFyYW0gc2l6ZSBUaGUgY2hhcmFjdGVyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLiBXaGVuIGluIGRvdWJ0LCB1c2UgQGMgWVlfQlVGX1NJWkUuCisgKiAKKyAqIEByZXR1cm4gdGhlIGFsbG9jYXRlZCBidWZmZXIgc3RhdGUuCisgKi8KKyAgICBZWV9CVUZGRVJfU1RBVEUgeXlfY3JlYXRlX2J1ZmZlciAgKEZJTEUgKiBmaWxlLCBpbnQgIHNpemUgKQoreworCVlZX0JVRkZFUl9TVEFURSBiOworICAgIAorCWIgPSAoWVlfQlVGRkVSX1NUQVRFKSB5eWFsbG9jKHNpemVvZiggc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSApICApOworCWlmICggISBiICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpIiApOworCisJYi0+eXlfYnVmX3NpemUgPSBzaXplOworCisJLyogeXlfY2hfYnVmIGhhcyB0byBiZSAyIGNoYXJhY3RlcnMgbG9uZ2VyIHRoYW4gdGhlIHNpemUgZ2l2ZW4gYmVjYXVzZQorCSAqIHdlIG5lZWQgdG8gcHV0IGluIDIgZW5kLW9mLWJ1ZmZlciBjaGFyYWN0ZXJzLgorCSAqLworCWItPnl5X2NoX2J1ZiA9IChjaGFyICopIHl5YWxsb2MoYi0+eXlfYnVmX3NpemUgKyAyICApOworCWlmICggISBiLT55eV9jaF9idWYgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9jcmVhdGVfYnVmZmVyKCkiICk7CisKKwliLT55eV9pc19vdXJfYnVmZmVyID0gMTsKKworCXl5X2luaXRfYnVmZmVyKGIsZmlsZSApOworCisJcmV0dXJuIGI7Cit9CisKKy8qKiBEZXN0cm95IHRoZSBidWZmZXIuCisgKiBAcGFyYW0gYiBhIGJ1ZmZlciBjcmVhdGVkIHdpdGggeXlfY3JlYXRlX2J1ZmZlcigpCisgKiAKKyAqLworICAgIHZvaWQgeXlfZGVsZXRlX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFICBiICkKK3sKKyAgICAKKwlpZiAoICEgYiApCisJCXJldHVybjsKKworCWlmICggYiA9PSBZWV9DVVJSRU5UX0JVRkZFUiApIC8qIE5vdCBzdXJlIGlmIHdlIHNob3VsZCBwb3AgaGVyZS4gKi8KKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gKFlZX0JVRkZFUl9TVEFURSkgMDsKKworCWlmICggYi0+eXlfaXNfb3VyX2J1ZmZlciApCisJCXl5ZnJlZSgodm9pZCAqKSBiLT55eV9jaF9idWYgICk7CisKKwl5eWZyZWUoKHZvaWQgKikgYiAgKTsKK30KKworI2lmbmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuIGludCBpc2F0dHkgKGludCApOworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisgICAgCisvKiBJbml0aWFsaXplcyBvciByZWluaXRpYWxpemVzIGEgYnVmZmVyLgorICogVGhpcyBmdW5jdGlvbiBpcyBzb21ldGltZXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGJ1ZmZlciwKKyAqIHN1Y2ggYXMgZHVyaW5nIGEgeXlyZXN0YXJ0KCkgb3IgYXQgRU9GLgorICovCisgICAgc3RhdGljIHZvaWQgeXlfaW5pdF9idWZmZXIgIChZWV9CVUZGRVJfU1RBVEUgIGIsIEZJTEUgKiBmaWxlICkKKworeworCWludCBvZXJybm8gPSBlcnJubzsKKyAgICAKKwl5eV9mbHVzaF9idWZmZXIoYiApOworCisJYi0+eXlfaW5wdXRfZmlsZSA9IGZpbGU7CisJYi0+eXlfZmlsbF9idWZmZXIgPSAxOworCisgICAgLyogSWYgYiBpcyB0aGUgY3VycmVudCBidWZmZXIsIHRoZW4geXlfaW5pdF9idWZmZXIgd2FzIF9wcm9iYWJseV8KKyAgICAgKiBjYWxsZWQgZnJvbSB5eXJlc3RhcnQoKSBvciB0aHJvdWdoIHl5X2dldF9uZXh0X2J1ZmZlci4KKyAgICAgKiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gcmVzZXQgdGhlIGxpbmVubyBvciBjb2x1bW4uCisgICAgICovCisgICAgaWYgKGIgIT0gWVlfQ1VSUkVOVF9CVUZGRVIpeworICAgICAgICBiLT55eV9ic19saW5lbm8gPSAxOworICAgICAgICBiLT55eV9ic19jb2x1bW4gPSAwOworICAgIH0KKworICAgICAgICBiLT55eV9pc19pbnRlcmFjdGl2ZSA9IGZpbGUgPyAoaXNhdHR5KCBmaWxlbm8oZmlsZSkgKSA+IDApIDogMDsKKyAgICAKKwllcnJubyA9IG9lcnJubzsKK30KKworLyoqIERpc2NhcmQgYWxsIGJ1ZmZlcmVkIGNoYXJhY3RlcnMuIE9uIHRoZSBuZXh0IHNjYW4sIFlZX0lOUFVUIHdpbGwgYmUgY2FsbGVkLgorICogQHBhcmFtIGIgdGhlIGJ1ZmZlciBzdGF0ZSB0byBiZSBmbHVzaGVkLCB1c3VhbGx5IEBjIFlZX0NVUlJFTlRfQlVGRkVSLgorICogCisgKi8KKyAgICB2b2lkIHl5X2ZsdXNoX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFICBiICkKK3sKKyAgICAJaWYgKCAhIGIgKQorCQlyZXR1cm47CisKKwliLT55eV9uX2NoYXJzID0gMDsKKworCS8qIFdlIGFsd2F5cyBuZWVkIHR3byBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuICBUaGUgZmlyc3QgY2F1c2VzCisJICogYSB0cmFuc2l0aW9uIHRvIHRoZSBlbmQtb2YtYnVmZmVyIHN0YXRlLiAgVGhlIHNlY29uZCBjYXVzZXMKKwkgKiBhIGphbSBpbiB0aGF0IHN0YXRlLgorCSAqLworCWItPnl5X2NoX2J1ZlswXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKwliLT55eV9jaF9idWZbMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwliLT55eV9idWZfcG9zID0gJmItPnl5X2NoX2J1ZlswXTsKKworCWItPnl5X2F0X2JvbCA9IDE7CisJYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7CisKKwlpZiAoIGIgPT0gWVlfQ1VSUkVOVF9CVUZGRVIgKQorCQl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKK30KKworLyoqIFB1c2hlcyB0aGUgbmV3IHN0YXRlIG9udG8gdGhlIHN0YWNrLiBUaGUgbmV3IHN0YXRlIGJlY29tZXMKKyAqICB0aGUgY3VycmVudCBzdGF0ZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZSBzdGFjaworICogIGlmIG5lY2Vzc2FyeS4KKyAqICBAcGFyYW0gbmV3X2J1ZmZlciBUaGUgbmV3IHN0YXRlLgorICogIAorICovCit2b2lkIHl5cHVzaF9idWZmZXJfc3RhdGUgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICkKK3sKKyAgICAJaWYgKG5ld19idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJeXllbnN1cmVfYnVmZmVyX3N0YWNrKCk7CisKKwkvKiBUaGlzIGJsb2NrIGlzIGNvcGllZCBmcm9tIHl5X3N3aXRjaF90b19idWZmZXIuICovCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiApCisJCXsKKwkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLworCQkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9ICh5eV9jX2J1Zl9wKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOworCQl9CisKKwkvKiBPbmx5IHB1c2ggaWYgdG9wIGV4aXN0cy4gT3RoZXJ3aXNlLCByZXBsYWNlIHRvcC4gKi8KKwlpZiAoWVlfQ1VSUkVOVF9CVUZGRVIpCisJCSh5eV9idWZmZXJfc3RhY2tfdG9wKSsrOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IG5ld19idWZmZXI7CisKKwkvKiBjb3BpZWQgZnJvbSB5eV9zd2l0Y2hfdG9fYnVmZmVyLiAqLworCXl5X2xvYWRfYnVmZmVyX3N0YXRlKCApOworCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMTsKK30KKworLyoqIFJlbW92ZXMgYW5kIGRlbGV0ZXMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIGlmIHByZXNlbnQuCisgKiAgVGhlIG5leHQgZWxlbWVudCBiZWNvbWVzIHRoZSBuZXcgdG9wLgorICogIAorICovCit2b2lkIHl5cG9wX2J1ZmZlcl9zdGF0ZSAodm9pZCkKK3sKKyAgICAJaWYgKCFZWV9DVVJSRU5UX0JVRkZFUikKKwkJcmV0dXJuOworCisJeXlfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiApOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IE5VTEw7CisJaWYgKCh5eV9idWZmZXJfc3RhY2tfdG9wKSA+IDApCisJCS0tKHl5X2J1ZmZlcl9zdGFja190b3ApOworCisJaWYgKFlZX0NVUlJFTlRfQlVGRkVSKSB7CisJCXl5X2xvYWRfYnVmZmVyX3N0YXRlKCApOworCQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7CisJfQorfQorCisvKiBBbGxvY2F0ZXMgdGhlIHN0YWNrIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICogIEd1YXJhbnRlZXMgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBwdXNoLgorICovCitzdGF0aWMgdm9pZCB5eWVuc3VyZV9idWZmZXJfc3RhY2sgKHZvaWQpCit7CisJaW50IG51bV90b19hbGxvYzsKKyAgICAKKwlpZiAoISh5eV9idWZmZXJfc3RhY2spKSB7CisKKwkJLyogRmlyc3QgYWxsb2NhdGlvbiBpcyBqdXN0IGZvciAyIGVsZW1lbnRzLCBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoaXMKKwkJICogc2Nhbm5lciB3aWxsIGV2ZW4gbmVlZCBhIHN0YWNrLiBXZSB1c2UgMiBpbnN0ZWFkIG9mIDEgdG8gYXZvaWQgYW4KKwkJICogaW1tZWRpYXRlIHJlYWxsb2Mgb24gdGhlIG5leHQgY2FsbC4KKyAgICAgICAgICovCisJCW51bV90b19hbGxvYyA9IDE7CisJCSh5eV9idWZmZXJfc3RhY2spID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKil5eWFsbG9jCisJCQkJCQkJCShudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCisJCQkJCQkJCSk7CisJCWlmICggISAoeXlfYnVmZmVyX3N0YWNrKSApCisJCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eWVuc3VyZV9idWZmZXJfc3RhY2soKSIgKTsKKwkJCQkJCQkJICAKKwkJbWVtc2V0KCh5eV9idWZmZXJfc3RhY2spLCAwLCBudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopKTsKKwkJCQkKKwkJKHl5X2J1ZmZlcl9zdGFja19tYXgpID0gbnVtX3RvX2FsbG9jOworCQkoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKCh5eV9idWZmZXJfc3RhY2tfdG9wKSA+PSAoKHl5X2J1ZmZlcl9zdGFja19tYXgpKSAtIDEpeworCisJCS8qIEluY3JlYXNlIHRoZSBidWZmZXIgdG8gcHJlcGFyZSBmb3IgYSBwb3NzaWJsZSBwdXNoLiAqLworCQlpbnQgZ3Jvd19zaXplID0gOCAvKiBhcmJpdHJhcnkgZ3JvdyBzaXplICovOworCisJCW51bV90b19hbGxvYyA9ICh5eV9idWZmZXJfc3RhY2tfbWF4KSArIGdyb3dfc2l6ZTsKKwkJKHl5X2J1ZmZlcl9zdGFjaykgPSAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSoqKXl5cmVhbGxvYworCQkJCQkJCQkoKHl5X2J1ZmZlcl9zdGFjayksCisJCQkJCQkJCW51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikKKwkJCQkJCQkJKTsKKwkJaWYgKCAhICh5eV9idWZmZXJfc3RhY2spICkKKwkJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5ZW5zdXJlX2J1ZmZlcl9zdGFjaygpIiApOworCisJCS8qIHplcm8gb25seSB0aGUgbmV3IHNsb3RzLiovCisJCW1lbXNldCgoeXlfYnVmZmVyX3N0YWNrKSArICh5eV9idWZmZXJfc3RhY2tfbWF4KSwgMCwgZ3Jvd19zaXplICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7CisJCSh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IG51bV90b19hbGxvYzsKKwl9Cit9CisKKy8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gZGlyZWN0bHkgZnJvbSBhIHVzZXItc3BlY2lmaWVkIGNoYXJhY3RlciBidWZmZXIuCisgKiBAcGFyYW0gYmFzZSB0aGUgY2hhcmFjdGVyIGJ1ZmZlcgorICogQHBhcmFtIHNpemUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNoYXJhY3RlciBidWZmZXIKKyAqIAorICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuIAorICovCitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9idWZmZXIgIChjaGFyICogYmFzZSwgeXlfc2l6ZV90ICBzaXplICkKK3sKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKyAgICAKKwlpZiAoIHNpemUgPCAyIHx8CisJICAgICBiYXNlW3NpemUtMl0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSIHx8CisJICAgICBiYXNlW3NpemUtMV0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSICkKKwkJLyogVGhleSBmb3Jnb3QgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIEVPQidzLiAqLworCQlyZXR1cm4gMDsKKworCWIgPSAoWVlfQlVGRkVSX1NUQVRFKSB5eWFsbG9jKHNpemVvZiggc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSApICApOworCWlmICggISBiICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfc2Nhbl9idWZmZXIoKSIgKTsKKworCWItPnl5X2J1Zl9zaXplID0gc2l6ZSAtIDI7CS8qICItIDIiIHRvIHRha2UgY2FyZSBvZiBFT0IncyAqLworCWItPnl5X2J1Zl9wb3MgPSBiLT55eV9jaF9idWYgPSBiYXNlOworCWItPnl5X2lzX291cl9idWZmZXIgPSAwOworCWItPnl5X2lucHV0X2ZpbGUgPSAwOworCWItPnl5X25fY2hhcnMgPSBiLT55eV9idWZfc2l6ZTsKKwliLT55eV9pc19pbnRlcmFjdGl2ZSA9IDA7CisJYi0+eXlfYXRfYm9sID0gMTsKKwliLT55eV9maWxsX2J1ZmZlciA9IDA7CisJYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7CisKKwl5eV9zd2l0Y2hfdG9fYnVmZmVyKGIgICk7CisKKwlyZXR1cm4gYjsKK30KKworLyoqIFNldHVwIHRoZSBpbnB1dCBidWZmZXIgc3RhdGUgdG8gc2NhbiBhIHN0cmluZy4gVGhlIG5leHQgY2FsbCB0byB5eWxleCgpIHdpbGwKKyAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgc3RyLgorICogQHBhcmFtIHl5c3RyIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHNjYW4KKyAqIAorICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuCisgKiBAbm90ZSBJZiB5b3Ugd2FudCB0byBzY2FuIGJ5dGVzIHRoYXQgbWF5IGNvbnRhaW4gTlVMIHZhbHVlcywgdGhlbiB1c2UKKyAqICAgICAgIHl5X3NjYW5fYnl0ZXMoKSBpbnN0ZWFkLgorICovCitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9zdHJpbmcgKHl5Y29uc3QgY2hhciAqIHl5c3RyICkKK3sKKyAgICAKKwlyZXR1cm4geXlfc2Nhbl9ieXRlcyh5eXN0cixzdHJsZW4oeXlzdHIpICk7Cit9CisKKy8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gdGhlIGdpdmVuIGJ5dGVzLiBUaGUgbmV4dCBjYWxsIHRvIHl5bGV4KCkgd2lsbAorICogc2NhbiBmcm9tIGEgQGUgY29weSBvZiBAYSBieXRlcy4KKyAqIEBwYXJhbSBieXRlcyB0aGUgYnl0ZSBidWZmZXIgdG8gc2NhbgorICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBAYSBieXRlcy4KKyAqIAorICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuCisgKi8KK1lZX0JVRkZFUl9TVEFURSB5eV9zY2FuX2J5dGVzICAoeXljb25zdCBjaGFyICogeXlieXRlcywgaW50ICBfeXlieXRlc19sZW4gKQoreworCVlZX0JVRkZFUl9TVEFURSBiOworCWNoYXIgKmJ1ZjsKKwl5eV9zaXplX3QgbjsKKwlpbnQgaTsKKyAgICAKKwkvKiBHZXQgbWVtb3J5IGZvciBmdWxsIGJ1ZmZlciwgaW5jbHVkaW5nIHNwYWNlIGZvciB0cmFpbGluZyBFT0Incy4gKi8KKwluID0gX3l5Ynl0ZXNfbGVuICsgMjsKKwlidWYgPSAoY2hhciAqKSB5eWFsbG9jKG4gICk7CisJaWYgKCAhIGJ1ZiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X3NjYW5fYnl0ZXMoKSIgKTsKKworCWZvciAoIGkgPSAwOyBpIDwgX3l5Ynl0ZXNfbGVuOyArK2kgKQorCQlidWZbaV0gPSB5eWJ5dGVzW2ldOworCisJYnVmW195eWJ5dGVzX2xlbl0gPSBidWZbX3l5Ynl0ZXNfbGVuKzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJYiA9IHl5X3NjYW5fYnVmZmVyKGJ1ZixuICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggImJhZCBidWZmZXIgaW4geXlfc2Nhbl9ieXRlcygpIiApOworCisJLyogSXQncyBva2F5IHRvIGdyb3cgZXRjLiB0aGlzIGJ1ZmZlciwgYW5kIHdlIHNob3VsZCB0aHJvdyBpdAorCSAqIGF3YXkgd2hlbiB3ZSdyZSBkb25lLgorCSAqLworCWItPnl5X2lzX291cl9idWZmZXIgPSAxOworCisJcmV0dXJuIGI7Cit9CisKKyNpZm5kZWYgWVlfRVhJVF9GQUlMVVJFCisjZGVmaW5lIFlZX0VYSVRfRkFJTFVSRSAyCisjZW5kaWYKKworc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IgKHl5Y29uc3QgY2hhciogbXNnICkKK3sKKyAgICAJKHZvaWQpIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtc2cgKTsKKwlleGl0KCBZWV9FWElUX0ZBSUxVUkUgKTsKK30KKworLyogUmVkZWZpbmUgeXlsZXNzKCkgc28gaXQgd29ya3MgaW4gc2VjdGlvbiAzIGNvZGUuICovCisKKyN1bmRlZiB5eWxlc3MKKyNkZWZpbmUgeXlsZXNzKG4pIFwKKwlkbyBcCisJCXsgXAorCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB5eXRleHQuICovIFwKKyAgICAgICAgaW50IHl5bGVzc19tYWNyb19hcmcgPSAobik7IFwKKyAgICAgICAgWVlfTEVTU19MSU5FTk8oeXlsZXNzX21hY3JvX2FyZyk7XAorCQl5eXRleHRbeXlsZW5nXSA9ICh5eV9ob2xkX2NoYXIpOyBcCisJCSh5eV9jX2J1Zl9wKSA9IHl5dGV4dCArIHl5bGVzc19tYWNyb19hcmc7IFwKKwkJKHl5X2hvbGRfY2hhcikgPSAqKHl5X2NfYnVmX3ApOyBcCisJCSooeXlfY19idWZfcCkgPSAnXDAnOyBcCisJCXl5bGVuZyA9IHl5bGVzc19tYWNyb19hcmc7IFwKKwkJfSBcCisJd2hpbGUgKCAwICkKKworLyogQWNjZXNzb3IgIG1ldGhvZHMgKGdldC9zZXQgZnVuY3Rpb25zKSB0byBzdHJ1Y3QgbWVtYmVycy4gKi8KKworLyoqIEdldCB0aGUgY3VycmVudCBsaW5lIG51bWJlci4KKyAqIAorICovCitpbnQgeXlnZXRfbGluZW5vICAodm9pZCkKK3sKKyAgICAgICAgCisgICAgcmV0dXJuIHl5bGluZW5vOworfQorCisvKiogR2V0IHRoZSBpbnB1dCBzdHJlYW0uCisgKiAKKyAqLworRklMRSAqeXlnZXRfaW4gICh2b2lkKQoreworICAgICAgICByZXR1cm4geXlpbjsKK30KKworLyoqIEdldCB0aGUgb3V0cHV0IHN0cmVhbS4KKyAqIAorICovCitGSUxFICp5eWdldF9vdXQgICh2b2lkKQoreworICAgICAgICByZXR1cm4geXlvdXQ7Cit9CisKKy8qKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCB0b2tlbi4KKyAqIAorICovCitpbnQgeXlnZXRfbGVuZyAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB5eWxlbmc7Cit9CisKKy8qKiBHZXQgdGhlIGN1cnJlbnQgdG9rZW4uCisgKiAKKyAqLworCitjaGFyICp5eWdldF90ZXh0ICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHl5dGV4dDsKK30KKworLyoqIFNldCB0aGUgY3VycmVudCBsaW5lIG51bWJlci4KKyAqIEBwYXJhbSBsaW5lX251bWJlcgorICogCisgKi8KK3ZvaWQgeXlzZXRfbGluZW5vIChpbnQgIGxpbmVfbnVtYmVyICkKK3sKKyAgICAKKyAgICB5eWxpbmVubyA9IGxpbmVfbnVtYmVyOworfQorCisvKiogU2V0IHRoZSBpbnB1dCBzdHJlYW0uIFRoaXMgZG9lcyBub3QgZGlzY2FyZCB0aGUgY3VycmVudAorICogaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIGluX3N0ciBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIAorICogQHNlZSB5eV9zd2l0Y2hfdG9fYnVmZmVyCisgKi8KK3ZvaWQgeXlzZXRfaW4gKEZJTEUgKiAgaW5fc3RyICkKK3sKKyAgICAgICAgeXlpbiA9IGluX3N0ciA7Cit9CisKK3ZvaWQgeXlzZXRfb3V0IChGSUxFICogIG91dF9zdHIgKQoreworICAgICAgICB5eW91dCA9IG91dF9zdHIgOworfQorCitpbnQgeXlnZXRfZGVidWcgICh2b2lkKQoreworICAgICAgICByZXR1cm4geXlfZmxleF9kZWJ1ZzsKK30KKwordm9pZCB5eXNldF9kZWJ1ZyAoaW50ICBiZGVidWcgKQoreworICAgICAgICB5eV9mbGV4X2RlYnVnID0gYmRlYnVnIDsKK30KKworc3RhdGljIGludCB5eV9pbml0X2dsb2JhbHMgKHZvaWQpCit7CisgICAgICAgIC8qIEluaXRpYWxpemF0aW9uIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgbm9uLXJlZW50cmFudCBzY2FubmVyLgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20geXlsZXhfZGVzdHJveSgpLCBzbyBkb24ndCBhbGxvY2F0ZSBoZXJlLgorICAgICAqLworCisgICAgKHl5X2J1ZmZlcl9zdGFjaykgPSAwOworICAgICh5eV9idWZmZXJfc3RhY2tfdG9wKSA9IDA7CisgICAgKHl5X2J1ZmZlcl9zdGFja19tYXgpID0gMDsKKyAgICAoeXlfY19idWZfcCkgPSAoY2hhciAqKSAwOworICAgICh5eV9pbml0KSA9IDA7CisgICAgKHl5X3N0YXJ0KSA9IDA7CisKKy8qIERlZmluZWQgaW4gbWFpbi5jICovCisjaWZkZWYgWVlfU1RESU5JVAorICAgIHl5aW4gPSBzdGRpbjsKKyAgICB5eW91dCA9IHN0ZG91dDsKKyNlbHNlCisgICAgeXlpbiA9IChGSUxFICopIDA7CisgICAgeXlvdXQgPSAoRklMRSAqKSAwOworI2VuZGlmCisKKyAgICAvKiBGb3IgZnV0dXJlIHJlZmVyZW5jZTogU2V0IGVycm5vIG9uIGVycm9yLCBzaW5jZSB3ZSBhcmUgY2FsbGVkIGJ5CisgICAgICogeXlsZXhfaW5pdCgpCisgICAgICovCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHl5bGV4X2Rlc3Ryb3kgaXMgZm9yIGJvdGggcmVlbnRyYW50IGFuZCBub24tcmVlbnRyYW50IHNjYW5uZXJzLiAqLworaW50IHl5bGV4X2Rlc3Ryb3kgICh2b2lkKQoreworICAgIAorICAgIC8qIFBvcCB0aGUgYnVmZmVyIHN0YWNrLCBkZXN0cm95aW5nIGVhY2ggZWxlbWVudC4gKi8KKwl3aGlsZShZWV9DVVJSRU5UX0JVRkZFUil7CisJCXl5X2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgICk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IE5VTEw7CisJCXl5cG9wX2J1ZmZlcl9zdGF0ZSgpOworCX0KKworCS8qIERlc3Ryb3kgdGhlIHN0YWNrIGl0c2VsZi4gKi8KKwl5eWZyZWUoKHl5X2J1ZmZlcl9zdGFjaykgKTsKKwkoeXlfYnVmZmVyX3N0YWNrKSA9IE5VTEw7CisKKyAgICAvKiBSZXNldCB0aGUgZ2xvYmFscy4gVGhpcyBpcyBpbXBvcnRhbnQgaW4gYSBub24tcmVlbnRyYW50IHNjYW5uZXIgc28gdGhlIG5leHQgdGltZQorICAgICAqIHl5bGV4KCkgaXMgY2FsbGVkLCBpbml0aWFsaXphdGlvbiB3aWxsIG9jY3VyLiAqLworICAgIHl5X2luaXRfZ2xvYmFscyggKTsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogSW50ZXJuYWwgdXRpbGl0eSByb3V0aW5lcy4KKyAqLworCisjaWZuZGVmIHl5dGV4dF9wdHIKK3N0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciogczEsIHl5Y29uc3QgY2hhciAqIHMyLCBpbnQgbiApCit7CisJcmVnaXN0ZXIgaW50IGk7CisJZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQorCQlzMVtpXSA9IHMyW2ldOworfQorI2VuZGlmCisKKyNpZmRlZiBZWV9ORUVEX1NUUkxFTgorc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiAoeXljb25zdCBjaGFyICogcyApCit7CisJcmVnaXN0ZXIgaW50IG47CisJZm9yICggbiA9IDA7IHNbbl07ICsrbiApCisJCTsKKworCXJldHVybiBuOworfQorI2VuZGlmCisKK3ZvaWQgKnl5YWxsb2MgKHl5X3NpemVfdCAgc2l6ZSApCit7CisJcmV0dXJuICh2b2lkICopIG1hbGxvYyggc2l6ZSApOworfQorCit2b2lkICp5eXJlYWxsb2MgICh2b2lkICogcHRyLCB5eV9zaXplX3QgIHNpemUgKQoreworCS8qIFRoZSBjYXN0IHRvIChjaGFyICopIGluIHRoZSBmb2xsb3dpbmcgYWNjb21tb2RhdGVzIGJvdGgKKwkgKiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB1c2UgY2hhciogZ2VuZXJpYyBwb2ludGVycywgYW5kIHRob3NlCisJICogdGhhdCB1c2Ugdm9pZCogZ2VuZXJpYyBwb2ludGVycy4gIEl0IHdvcmtzIHdpdGggdGhlIGxhdHRlcgorCSAqIGJlY2F1c2UgYm90aCBBTlNJIEMgYW5kIEMrKyBhbGxvdyBjYXN0bGVzcyBhc3NpZ25tZW50IGZyb20KKwkgKiBhbnkgcG9pbnRlciB0eXBlIHRvIHZvaWQqLCBhbmQgZGVhbCB3aXRoIGFyZ3VtZW50IGNvbnZlcnNpb25zCisJICogYXMgdGhvdWdoIGRvaW5nIGFuIGFzc2lnbm1lbnQuCisJICovCisJcmV0dXJuICh2b2lkICopIHJlYWxsb2MoIChjaGFyICopIHB0ciwgc2l6ZSApOworfQorCit2b2lkIHl5ZnJlZSAodm9pZCAqIHB0ciApCit7CisJZnJlZSggKGNoYXIgKikgcHRyICk7CS8qIHNlZSB5eXJlYWxsb2MoKSBmb3IgKGNoYXIgKikgY2FzdCAqLworfQorCisjZGVmaW5lIFlZVEFCTEVTX05BTUUgInl5dGFibGVzIgorCisvKiBCcmluZyBpbiB0aGUga2V5d29yZCByZWNvZ25pemVyLiAgKi8KKworI2luY2x1ZGUgImtleXdvcmRzLmhhc2guYyIKKworLyogTWFjcm9zIHRvIGFwcGVuZCB0byBvdXIgcGhyYXNlIGNvbGxlY3Rpb24gbGlzdC4gICovCisKKy8qCisgKiBXZSBtYXJrIGFueSB0b2tlbiwgdGhhdCB0aGF0IGVxdWFscyB0byBhIGtub3duIGVudW1lcmF0b3IsIGFzCisgKiBTWU1fRU5VTV9DT05TVC4gVGhlIHBhcnNlciB3aWxsIGNoYW5nZSB0aGlzIGZvciBzdHJ1Y3QgYW5kIHVuaW9uIHRhZ3MgbGF0ZXIsCisgKiB0aGUgb25seSBwcm9ibGVtIGlzIHN0cnVjdCBhbmQgdW5pb24gbWVtYmVyczoKKyAqICAgIGVudW0gZSB7IGEsIGIgfTsgc3RydWN0IHMgeyBpbnQgYSwgYjsgfQorICogYnV0IGluIHRoaXMgY2FzZSwgdGhlIG9ubHkgZWZmZWN0IHdpbGwgYmUsIHRoYXQgdGhlIEFCSSBjaGVja3N1bXMgYmVjb21lCisgKiBtb3JlIHZvbGF0aWxlLCB3aGljaCBpcyBhY2NlcHRhYmxlLiBBbHNvLCBzdWNoIGNvbGxpc2lvbnMgYXJlIHF1aXRlIHJhcmUsCisgKiBzbyBmYXIgaXQgd2FzIG9ubHkgb2JzZXJ2ZWQgaW4gaW5jbHVkZS9saW51eC90ZWxlcGhvbnkuaC4KKyAqLworI2RlZmluZSBfQVBQKFQsTCkJZG8gewkJCQkJCSAgIFwKKwkJCSAgY3VyX25vZGUgPSBuZXh0X25vZGU7CQkJCSAgIFwKKwkJCSAgbmV4dF9ub2RlID0geG1hbGxvYyhzaXplb2YoKm5leHRfbm9kZSkpOwkgICBcCisJCQkgIG5leHRfbm9kZS0+bmV4dCA9IGN1cl9ub2RlOwkJCSAgIFwKKwkJCSAgY3VyX25vZGUtPnN0cmluZyA9IG1lbWNweSh4bWFsbG9jKEwrMSksIFQsIEwrMSk7IFwKKwkJCSAgY3VyX25vZGUtPnRhZyA9CQkJCSAgIFwKKwkJCSAgICBmaW5kX3N5bWJvbChjdXJfbm9kZS0+c3RyaW5nLCBTWU1fRU5VTV9DT05TVCwgMSk/XAorCQkJICAgIFNZTV9FTlVNX0NPTlNUIDogU1lNX05PUk1BTCA7CQkgICBcCisJCQl9IHdoaWxlICgwKQorCisjZGVmaW5lIEFQUAkJX0FQUCh5eXRleHQsIHl5bGVuZykKKworLyogVGhlIHNlY29uZCBzdGFnZSBsZXhlci4gIEhlcmUgd2UgaW5jb3Jwb3JhdGUga25vd2xlZGdlIG9mIHRoZSBzdGF0ZQorICAgb2YgdGhlIHBhcnNlciB0byB0YWlsb3IgdGhlIHRva2VucyB0aGF0IGFyZSByZXR1cm5lZC4gICovCisKK2ludAoreXlsZXgodm9pZCkKK3sKKyAgc3RhdGljIGVudW0geworICAgIFNUX05PVFNUQVJURUQsIFNUX05PUk1BTCwgU1RfQVRUUklCVVRFLCBTVF9BU00sIFNUX0JSQUNLRVQsIFNUX0JSQUNFLAorICAgIFNUX0VYUFJFU1NJT04sIFNUX1RBQkxFXzEsIFNUX1RBQkxFXzIsIFNUX1RBQkxFXzMsIFNUX1RBQkxFXzQsCisgICAgU1RfVEFCTEVfNSwgU1RfVEFCTEVfNgorICB9IGxleHN0YXRlID0gU1RfTk9UU1RBUlRFRDsKKworICBzdGF0aWMgaW50IHN1cHByZXNzX3R5cGVfbG9va3VwLCBkb250X3dhbnRfYnJhY2VfcGhyYXNlOworICBzdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICpuZXh0X25vZGU7CisKKyAgaW50IHRva2VuLCBjb3VudCA9IDA7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqY3VyX25vZGU7CisKKyAgaWYgKGxleHN0YXRlID09IFNUX05PVFNUQVJURUQpCisgICAgeworICAgICAgbmV4dF9ub2RlID0geG1hbGxvYyhzaXplb2YoKm5leHRfbm9kZSkpOworICAgICAgbmV4dF9ub2RlLT5uZXh0ID0gTlVMTDsKKyAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOworICAgIH0KKworcmVwZWF0OgorICB0b2tlbiA9IHl5bGV4MSgpOworCisgIGlmICh0b2tlbiA9PSAwKQorICAgIHJldHVybiAwOworICBlbHNlIGlmICh0b2tlbiA9PSBGSUxFTkFNRSkKKyAgICB7CisgICAgICBjaGFyICpmaWxlLCAqZTsKKworICAgICAgLyogU2F2ZSB0aGUgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBsYXRlciBlcnJvciBtZXNzYWdlcy4gICovCisKKyAgICAgIGlmIChjdXJfZmlsZW5hbWUpCisJZnJlZShjdXJfZmlsZW5hbWUpOworCisgICAgICBmaWxlID0gc3RyY2hyKHl5dGV4dCwgJ1wiJykrMTsKKyAgICAgIGUgPSBzdHJjaHIoZmlsZSwgJ1wiJyk7CisgICAgICAqZSA9ICdcMCc7CisgICAgICBjdXJfZmlsZW5hbWUgPSBtZW1jcHkoeG1hbGxvYyhlLWZpbGUrMSksIGZpbGUsIGUtZmlsZSsxKTsKKyAgICAgIGN1cl9saW5lID0gYXRvaSh5eXRleHQrMik7CisKKyAgICAgIGdvdG8gcmVwZWF0OworICAgIH0KKworICBzd2l0Y2ggKGxleHN0YXRlKQorICAgIHsKKyAgICBjYXNlIFNUX05PUk1BTDoKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgSURFTlQ6CisJICBBUFA7CisJICB7CisJICAgIGNvbnN0IHN0cnVjdCByZXN3b3JkICpyID0gaXNfcmVzZXJ2ZWRfd29yZCh5eXRleHQsIHl5bGVuZyk7CisJICAgIGlmIChyKQorCSAgICAgIHsKKwkJc3dpdGNoICh0b2tlbiA9IHItPnRva2VuKQorCQkgIHsKKwkJICBjYXNlIEFUVFJJQlVURV9LRVlXOgorCQkgICAgbGV4c3RhdGUgPSBTVF9BVFRSSUJVVEU7CisJCSAgICBjb3VudCA9IDA7CisJCSAgICBnb3RvIHJlcGVhdDsKKwkJICBjYXNlIEFTTV9LRVlXOgorCQkgICAgbGV4c3RhdGUgPSBTVF9BU007CisJCSAgICBjb3VudCA9IDA7CisJCSAgICBnb3RvIHJlcGVhdDsKKworCQkgIGNhc2UgU1RSVUNUX0tFWVc6CisJCSAgY2FzZSBVTklPTl9LRVlXOgorCQkgIGNhc2UgRU5VTV9LRVlXOgorCQkgICAgZG9udF93YW50X2JyYWNlX3BocmFzZSA9IDM7CisJCSAgICBzdXBwcmVzc190eXBlX2xvb2t1cCA9IDI7CisJCSAgICBnb3RvIGZpbmk7CisKKwkJICBjYXNlIEVYUE9SVF9TWU1CT0xfS0VZVzoKKwkJICAgICAgZ290byBmaW5pOworCQkgIH0KKwkgICAgICB9CisJICAgIGlmICghc3VwcHJlc3NfdHlwZV9sb29rdXApCisJICAgICAgeworCQlpZiAoZmluZF9zeW1ib2woeXl0ZXh0LCBTWU1fVFlQRURFRiwgMSkpCisJCSAgdG9rZW4gPSBUWVBFOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnWyc6CisJICBBUFA7CisJICBsZXhzdGF0ZSA9IFNUX0JSQUNLRVQ7CisJICBjb3VudCA9IDE7CisJICBnb3RvIHJlcGVhdDsKKworCWNhc2UgJ3snOgorCSAgQVBQOworCSAgaWYgKGRvbnRfd2FudF9icmFjZV9waHJhc2UpCisJICAgIGJyZWFrOworCSAgbGV4c3RhdGUgPSBTVF9CUkFDRTsKKwkgIGNvdW50ID0gMTsKKwkgIGdvdG8gcmVwZWF0OworCisJY2FzZSAnPSc6IGNhc2UgJzonOgorCSAgQVBQOworCSAgbGV4c3RhdGUgPSBTVF9FWFBSRVNTSU9OOworCSAgYnJlYWs7CisKKwljYXNlIERPVFM6CisJZGVmYXVsdDoKKwkgIEFQUDsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVF9BVFRSSUJVVEU6CisgICAgICBBUFA7CisgICAgICBzd2l0Y2ggKHRva2VuKQorCXsKKwljYXNlICcoJzoKKwkgICsrY291bnQ7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICcpJzoKKwkgIGlmICgtLWNvdW50ID09IDApCisJICAgIHsKKwkgICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKwkgICAgICB0b2tlbiA9IEFUVFJJQlVURV9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfQVNNOgorICAgICAgQVBQOworICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAnKCc6CisJICArK2NvdW50OworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnKSc6CisJICBpZiAoLS1jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisJICAgICAgdG9rZW4gPSBBU01fUEhSQVNFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBnb3RvIHJlcGVhdDsKKwlkZWZhdWx0OgorCSAgZ290byByZXBlYXQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUX0JSQUNLRVQ6CisgICAgICBBUFA7CisgICAgICBzd2l0Y2ggKHRva2VuKQorCXsKKwljYXNlICdbJzoKKwkgICsrY291bnQ7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICddJzoKKwkgIGlmICgtLWNvdW50ID09IDApCisJICAgIHsKKwkgICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKwkgICAgICB0b2tlbiA9IEJSQUNLRVRfUEhSQVNFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBnb3RvIHJlcGVhdDsKKwlkZWZhdWx0OgorCSAgZ290byByZXBlYXQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUX0JSQUNFOgorICAgICAgQVBQOworICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAneyc6CisJICArK2NvdW50OworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnfSc6CisJICBpZiAoLS1jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisJICAgICAgdG9rZW4gPSBCUkFDRV9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfRVhQUkVTU0lPTjoKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgJygnOiBjYXNlICdbJzogY2FzZSAneyc6CisJICArK2NvdW50OworCSAgQVBQOworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnfSc6CisJICAvKiBpcyB0aGlzIHRoZSBsYXN0IGxpbmUgb2YgYW4gZW51bSBkZWNsYXJhdGlvbj8gKi8KKwkgIGlmIChjb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgLyogUHV0IGJhY2sgdGhlIHRva2VuIHdlIGp1c3QgcmVhZCBzbydzIHdlIGNhbiBmaW5kIGl0IGFnYWluCisJCSBhZnRlciByZWdpc3RlcmluZyB0aGUgZXhwcmVzc2lvbi4gICovCisJICAgICAgdW5wdXQodG9rZW4pOworCisJICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisJICAgICAgdG9rZW4gPSBFWFBSRVNTSU9OX1BIUkFTRTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgLyogRkFMTFRIUlUgKi8KKwljYXNlICcpJzogY2FzZSAnXSc6CisJICAtLWNvdW50OworCSAgQVBQOworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnLCc6IGNhc2UgJzsnOgorCSAgaWYgKGNvdW50ID09IDApCisJICAgIHsKKwkgICAgICAvKiBQdXQgYmFjayB0aGUgdG9rZW4gd2UganVzdCByZWFkIHNvJ3Mgd2UgY2FuIGZpbmQgaXQgYWdhaW4KKwkJIGFmdGVyIHJlZ2lzdGVyaW5nIHRoZSBleHByZXNzaW9uLiAgKi8KKwkgICAgICB1bnB1dCh0b2tlbik7CisKKwkgICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKwkgICAgICB0b2tlbiA9IEVYUFJFU1NJT05fUEhSQVNFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBBUFA7CisJICBnb3RvIHJlcGVhdDsKKwlkZWZhdWx0OgorCSAgQVBQOworCSAgZ290byByZXBlYXQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUX1RBQkxFXzE6CisgICAgICBnb3RvIHJlcGVhdDsKKworICAgIGNhc2UgU1RfVEFCTEVfMjoKKyAgICAgIGlmICh0b2tlbiA9PSBJREVOVCAmJiB5eWxlbmcgPT0gMSAmJiB5eXRleHRbMF0gPT0gJ1gnKQorCXsKKwkgIHRva2VuID0gRVhQT1JUX1NZTUJPTF9LRVlXOworCSAgbGV4c3RhdGUgPSBTVF9UQUJMRV81OworCSAgQVBQOworCSAgYnJlYWs7CisJfQorICAgICAgbGV4c3RhdGUgPSBTVF9UQUJMRV82OworICAgICAgLyogRkFMTFRIUlUgKi8KKworICAgIGNhc2UgU1RfVEFCTEVfNjoKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgJ3snOiBjYXNlICdbJzogY2FzZSAnKCc6CisJICArK2NvdW50OworCSAgYnJlYWs7CisJY2FzZSAnfSc6IGNhc2UgJ10nOiBjYXNlICcpJzoKKwkgIC0tY291bnQ7CisJICBicmVhazsKKwljYXNlICcsJzoKKwkgIGlmIChjb3VudCA9PSAwKQorCSAgICBsZXhzdGF0ZSA9IFNUX1RBQkxFXzI7CisJICBicmVhazsKKwl9OworICAgICAgZ290byByZXBlYXQ7CisKKyAgICBjYXNlIFNUX1RBQkxFXzM6CisgICAgICBnb3RvIHJlcGVhdDsKKworICAgIGNhc2UgU1RfVEFCTEVfNDoKKyAgICAgIGlmICh0b2tlbiA9PSAnOycpCisJbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisgICAgICBnb3RvIHJlcGVhdDsKKworICAgIGNhc2UgU1RfVEFCTEVfNToKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgJywnOgorCSAgdG9rZW4gPSAnOyc7CisJICBsZXhzdGF0ZSA9IFNUX1RBQkxFXzI7CisJICBBUFA7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgQVBQOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXhpdCgxKTsKKyAgICB9CitmaW5pOgorCisgIGlmIChzdXBwcmVzc190eXBlX2xvb2t1cCA+IDApCisgICAgLS1zdXBwcmVzc190eXBlX2xvb2t1cDsKKyAgaWYgKGRvbnRfd2FudF9icmFjZV9waHJhc2UgPiAwKQorICAgIC0tZG9udF93YW50X2JyYWNlX3BocmFzZTsKKworICB5eWx2YWwgPSAmbmV4dF9ub2RlLT5uZXh0OworCisgIHJldHVybiB0b2tlbjsKK30KKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5jX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLmNfc2hpcHBlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwYjg2MC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLmNfc2hpcHBlZAorKysgL2Rldi9udWxsCkBAIC0xLDI1MjAgKzAsMCBAQAotCi0vKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjEuICAqLwotCi0vKiBTa2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCi0gICAKLSAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLS8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgY3JlYXRlIGEgbGFyZ2VyIHdvcmsgdGhhdCBjb250YWlucwotICAgcGFydCBvciBhbGwgb2YgdGhlIEJpc29uIHBhcnNlciBza2VsZXRvbiBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKLSAgIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBzbyBsb25nIGFzIHRoYXQgd29yayBpc24ndCBpdHNlbGYgYQotICAgcGFyc2VyIGdlbmVyYXRvciB1c2luZyB0aGUgc2tlbGV0b24gb3IgYSBtb2RpZmllZCB2ZXJzaW9uIHRoZXJlb2YKLSAgIGFzIGEgcGFyc2VyIHNrZWxldG9uLiAgQWx0ZXJuYXRpdmVseSwgaWYgeW91IG1vZGlmeSBvciByZWRpc3RyaWJ1dGUKLSAgIHRoZSBwYXJzZXIgc2tlbGV0b24gaXRzZWxmLCB5b3UgbWF5IChhdCB5b3VyIG9wdGlvbikgcmVtb3ZlIHRoaXMKLSAgIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBza2VsZXRvbiBhbmQgdGhlIHJlc3VsdGluZwotICAgQmlzb24gb3V0cHV0IGZpbGVzIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2Ugd2l0aG91dCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uLgotICAgCi0gICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluCi0gICB2ZXJzaW9uIDIuMiBvZiBCaXNvbi4gICovCi0KLS8qIEMgTEFMUigxKSBwYXJzZXIgc2tlbGV0b24gd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuLCBieQotICAgc2ltcGxpZnlpbmcgdGhlIG9yaWdpbmFsIHNvLWNhbGxlZCAic2VtYW50aWMiIHBhcnNlci4gICovCi0KLS8qIEFsbCBzeW1ib2xzIGRlZmluZWQgYmVsb3cgc2hvdWxkIGJlZ2luIHdpdGggeXkgb3IgWVksIHRvIGF2b2lkCi0gICBpbmZyaW5naW5nIG9uIHVzZXIgbmFtZSBzcGFjZS4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgZXZlbiBmb3IgbG9jYWwKLSAgIHZhcmlhYmxlcywgYXMgdGhleSBtaWdodCBvdGhlcndpc2UgYmUgZXhwYW5kZWQgYnkgdXNlciBtYWNyb3MuCi0gICBUaGVyZSBhcmUgc29tZSB1bmF2b2lkYWJsZSBleGNlcHRpb25zIHdpdGhpbiBpbmNsdWRlIGZpbGVzIHRvCi0gICBkZWZpbmUgbmVjZXNzYXJ5IGxpYnJhcnkgc3ltYm9sczsgdGhleSBhcmUgbm90ZWQgIklORlJJTkdFUyBPTgotICAgVVNFUiBOQU1FIFNQQUNFIiBiZWxvdy4gICovCi0KLS8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCi0jZGVmaW5lIFlZQklTT04gMQotCi0vKiBCaXNvbiB2ZXJzaW9uLiAgKi8KLSNkZWZpbmUgWVlCSVNPTl9WRVJTSU9OICIyLjQuMSIKLQotLyogU2tlbGV0b24gbmFtZS4gICovCi0jZGVmaW5lIFlZU0tFTEVUT05fTkFNRSAieWFjYy5jIgotCi0vKiBQdXJlIHBhcnNlcnMuICAqLwotI2RlZmluZSBZWVBVUkUgMAotCi0vKiBQdXNoIHBhcnNlcnMuICAqLwotI2RlZmluZSBZWVBVU0ggMAotCi0vKiBQdWxsIHBhcnNlcnMuICAqLwotI2RlZmluZSBZWVBVTEwgMQotCi0vKiBVc2luZyBsb2NhdGlvbnMuICAqLwotI2RlZmluZSBZWUxTUF9ORUVERUQgMAotCi0KLQotLyogQ29weSB0aGUgZmlyc3QgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCi0KLS8qIExpbmUgMTg5IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDI0ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImdlbmtzeW1zLmgiCi0KLXN0YXRpYyBpbnQgaXNfdHlwZWRlZjsKLXN0YXRpYyBpbnQgaXNfZXh0ZXJuOwotc3RhdGljIGNoYXIgKmN1cnJlbnRfbmFtZTsKLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2xfc3BlYzsKLQotc3RhdGljIHZvaWQgeXllcnJvcihjb25zdCBjaGFyICopOwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJlbW92ZV9ub2RlKHN0cnVjdCBzdHJpbmdfbGlzdCAqKnApCi17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqbm9kZSA9ICpwOwotICAqcCA9IG5vZGUtPm5leHQ7Ci0gIGZyZWVfbm9kZShub2RlKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1yZW1vdmVfbGlzdChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipwYiwgc3RydWN0IHN0cmluZ19saXN0ICoqcGUpCi17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqYiA9ICpwYiwgKmUgPSAqcGU7Ci0gICpwYiA9IGU7Ci0gIGZyZWVfbGlzdChiLCBlKTsKLX0KLQotCi0KLS8qIExpbmUgMTg5IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDEwNiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5jIgotCi0vKiBFbmFibGluZyB0cmFjZXMuICAqLwotI2lmbmRlZiBZWURFQlVHCi0jIGRlZmluZSBZWURFQlVHIDEKLSNlbmRpZgotCi0vKiBFbmFibGluZyB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzLiAgKi8KLSNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKLSMgdW5kZWYgWVlFUlJPUl9WRVJCT1NFCi0jIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMQotI2Vsc2UKLSMgZGVmaW5lIFlZRVJST1JfVkVSQk9TRSAwCi0jZW5kaWYKLQotLyogRW5hYmxpbmcgdGhlIHRva2VuIHRhYmxlLiAgKi8KLSNpZm5kZWYgWVlUT0tFTl9UQUJMRQotIyBkZWZpbmUgWVlUT0tFTl9UQUJMRSAwCi0jZW5kaWYKLQotCi0vKiBUb2tlbnMuICAqLwotI2lmbmRlZiBZWVRPS0VOVFlQRQotIyBkZWZpbmUgWVlUT0tFTlRZUEUKLSAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycwotICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KLSAgIGVudW0geXl0b2tlbnR5cGUgewotICAgICBBU01fS0VZVyA9IDI1OCwKLSAgICAgQVRUUklCVVRFX0tFWVcgPSAyNTksCi0gICAgIEFVVE9fS0VZVyA9IDI2MCwKLSAgICAgQk9PTF9LRVlXID0gMjYxLAotICAgICBDSEFSX0tFWVcgPSAyNjIsCi0gICAgIENPTlNUX0tFWVcgPSAyNjMsCi0gICAgIERPVUJMRV9LRVlXID0gMjY0LAotICAgICBFTlVNX0tFWVcgPSAyNjUsCi0gICAgIEVYVEVSTl9LRVlXID0gMjY2LAotICAgICBFWFRFTlNJT05fS0VZVyA9IDI2NywKLSAgICAgRkxPQVRfS0VZVyA9IDI2OCwKLSAgICAgSU5MSU5FX0tFWVcgPSAyNjksCi0gICAgIElOVF9LRVlXID0gMjcwLAotICAgICBMT05HX0tFWVcgPSAyNzEsCi0gICAgIFJFR0lTVEVSX0tFWVcgPSAyNzIsCi0gICAgIFJFU1RSSUNUX0tFWVcgPSAyNzMsCi0gICAgIFNIT1JUX0tFWVcgPSAyNzQsCi0gICAgIFNJR05FRF9LRVlXID0gMjc1LAotICAgICBTVEFUSUNfS0VZVyA9IDI3NiwKLSAgICAgU1RSVUNUX0tFWVcgPSAyNzcsCi0gICAgIFRZUEVERUZfS0VZVyA9IDI3OCwKLSAgICAgVU5JT05fS0VZVyA9IDI3OSwKLSAgICAgVU5TSUdORURfS0VZVyA9IDI4MCwKLSAgICAgVk9JRF9LRVlXID0gMjgxLAotICAgICBWT0xBVElMRV9LRVlXID0gMjgyLAotICAgICBUWVBFT0ZfS0VZVyA9IDI4MywKLSAgICAgRVhQT1JUX1NZTUJPTF9LRVlXID0gMjg0LAotICAgICBBU01fUEhSQVNFID0gMjg1LAotICAgICBBVFRSSUJVVEVfUEhSQVNFID0gMjg2LAotICAgICBCUkFDRV9QSFJBU0UgPSAyODcsCi0gICAgIEJSQUNLRVRfUEhSQVNFID0gMjg4LAotICAgICBFWFBSRVNTSU9OX1BIUkFTRSA9IDI4OSwKLSAgICAgQ0hBUiA9IDI5MCwKLSAgICAgRE9UUyA9IDI5MSwKLSAgICAgSURFTlQgPSAyOTIsCi0gICAgIElOVCA9IDI5MywKLSAgICAgUkVBTCA9IDI5NCwKLSAgICAgU1RSSU5HID0gMjk1LAotICAgICBUWVBFID0gMjk2LAotICAgICBPVEhFUiA9IDI5NywKLSAgICAgRklMRU5BTUUgPSAyOTgKLSAgIH07Ci0jZW5kaWYKLQotCi0KLSNpZiAhIGRlZmluZWQgWVlTVFlQRSAmJiAhIGRlZmluZWQgWVlTVFlQRV9JU19ERUNMQVJFRAotdHlwZWRlZiBpbnQgWVlTVFlQRTsKLSMgZGVmaW5lIFlZU1RZUEVfSVNfVFJJVklBTCAxCi0jIGRlZmluZSB5eXN0eXBlIFlZU1RZUEUgLyogb2Jzb2xlc2NlbnQ7IHdpbGwgYmUgd2l0aGRyYXduICovCi0jIGRlZmluZSBZWVNUWVBFX0lTX0RFQ0xBUkVEIDEKLSNlbmRpZgotCi0KLS8qIENvcHkgdGhlIHNlY29uZCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KLQotCi0vKiBMaW5lIDI2NCBvZiB5YWNjLmMgICovCi0jbGluZSAxOTEgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UuYyIKLQotI2lmZGVmIHNob3J0Ci0jIHVuZGVmIHNob3J0Ci0jZW5kaWYKLQotI2lmZGVmIFlZVFlQRV9VSU5UOAotdHlwZWRlZiBZWVRZUEVfVUlOVDggeXl0eXBlX3VpbnQ4OwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgY2hhciB5eXR5cGVfdWludDg7Ci0jZW5kaWYKLQotI2lmZGVmIFlZVFlQRV9JTlQ4Ci10eXBlZGVmIFlZVFlQRV9JTlQ4IHl5dHlwZV9pbnQ4OwotI2VsaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotdHlwZWRlZiBzaWduZWQgY2hhciB5eXR5cGVfaW50ODsKLSNlbHNlCi10eXBlZGVmIHNob3J0IGludCB5eXR5cGVfaW50ODsKLSNlbmRpZgotCi0jaWZkZWYgWVlUWVBFX1VJTlQxNgotdHlwZWRlZiBZWVRZUEVfVUlOVDE2IHl5dHlwZV91aW50MTY7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgeXl0eXBlX3VpbnQxNjsKLSNlbmRpZgotCi0jaWZkZWYgWVlUWVBFX0lOVDE2Ci10eXBlZGVmIFlZVFlQRV9JTlQxNiB5eXR5cGVfaW50MTY7Ci0jZWxzZQotdHlwZWRlZiBzaG9ydCBpbnQgeXl0eXBlX2ludDE2OwotI2VuZGlmCi0KLSNpZm5kZWYgWVlTSVpFX1QKLSMgaWZkZWYgX19TSVpFX1RZUEVfXwotIyAgZGVmaW5lIFlZU0laRV9UIF9fU0laRV9UWVBFX18KLSMgZWxpZiBkZWZpbmVkIHNpemVfdAotIyAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAotIyBlbGlmICEgZGVmaW5lZCBZWVNJWkVfVCAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi0jICBpbmNsdWRlIDxzdGRkZWYuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotIyAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAotIyBlbHNlCi0jICBkZWZpbmUgWVlTSVpFX1QgdW5zaWduZWQgaW50Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBZWVNJWkVfTUFYSU1VTSAoKFlZU0laRV9UKSAtMSkKLQotI2lmbmRlZiBZWV8KLSMgaWYgWVlFTkFCTEVfTkxTCi0jICBpZiBFTkFCTEVfTkxTCi0jICAgaW5jbHVkZSA8bGliaW50bC5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICAgZGVmaW5lIFlZXyhtc2dpZCkgZGdldHRleHQgKCJiaXNvbi1ydW50aW1lIiwgbXNnaWQpCi0jICBlbmRpZgotIyBlbmRpZgotIyBpZm5kZWYgWVlfCi0jICBkZWZpbmUgWVlfKG1zZ2lkKSBtc2dpZAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFN1cHByZXNzIHVudXNlZC12YXJpYWJsZSB3YXJuaW5ncyBieSAidXNpbmciIEUuICAqLwotI2lmICEgZGVmaW5lZCBsaW50IHx8IGRlZmluZWQgX19HTlVDX18KLSMgZGVmaW5lIFlZVVNFKGUpICgodm9pZCkgKGUpKQotI2Vsc2UKLSMgZGVmaW5lIFlZVVNFKGUpIC8qIGVtcHR5ICovCi0jZW5kaWYKLQotLyogSWRlbnRpdHkgZnVuY3Rpb24sIHVzZWQgdG8gc3VwcHJlc3Mgd2FybmluZ3MgYWJvdXQgY29uc3RhbnQgY29uZGl0aW9ucy4gICovCi0jaWZuZGVmIGxpbnQKLSMgZGVmaW5lIFlZSUQobikgKG4pCi0jZWxzZQotI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLXN0YXRpYyBpbnQKLVlZSUQgKGludCB5eWkpCi0jZWxzZQotc3RhdGljIGludAotWVlJRCAoeXlpKQotICAgIGludCB5eWk7Ci0jZW5kaWYKLXsKLSAgcmV0dXJuIHl5aTsKLX0KLSNlbmRpZgotCi0jaWYgISBkZWZpbmVkIHl5b3ZlcmZsb3cgfHwgWVlFUlJPUl9WRVJCT1NFCi0KLS8qIFRoZSBwYXJzZXIgaW52b2tlcyBhbGxvY2Egb3IgbWFsbG9jOyBkZWZpbmUgdGhlIG5lY2Vzc2FyeSBzeW1ib2xzLiAgKi8KLQotIyBpZmRlZiBZWVNUQUNLX1VTRV9BTExPQ0EKLSMgIGlmIFlZU1RBQ0tfVVNFX0FMTE9DQQotIyAgIGlmZGVmIF9fR05VQ19fCi0jICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIF9fYnVpbHRpbl9hbGxvY2EKLSMgICBlbGlmIGRlZmluZWQgX19CVUlMVElOX1ZBX0FSR19JTkNSCi0jICAgIGluY2x1ZGUgPGFsbG9jYS5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICAgZWxpZiBkZWZpbmVkIF9BSVgKLSMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19hbGxvY2EKLSMgICBlbGlmIGRlZmluZWQgX01TQ19WRVIKLSMgICAgaW5jbHVkZSA8bWFsbG9jLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLSMgICAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jICAgZWxzZQotIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBhbGxvY2EKLSMgICAgaWYgISBkZWZpbmVkIF9BTExPQ0FfSCAmJiAhIGRlZmluZWQgX1NURExJQl9IICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLSMgICAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICAgICBpZm5kZWYgX1NURExJQl9ICi0jICAgICAgZGVmaW5lIF9TVERMSUJfSCAxCi0jICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotCi0jIGlmZGVmIFlZU1RBQ0tfQUxMT0MKLSAgIC8qIFBhY2lmeSBHQ0MncyBgZW1wdHkgaWYtYm9keScgd2FybmluZy4gICovCi0jICBkZWZpbmUgWVlTVEFDS19GUkVFKFB0cikgZG8geyAvKiBlbXB0eSAqLzsgfSB3aGlsZSAoWVlJRCAoMCkpCi0jICBpZm5kZWYgWVlTVEFDS19BTExPQ19NQVhJTVVNCi0gICAgLyogVGhlIE9TIG1pZ2h0IGd1YXJhbnRlZSBvbmx5IG9uZSBndWFyZCBwYWdlIGF0IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLAotICAgICAgIGFuZCBhIHBhZ2Ugc2l6ZSBjYW4gYmUgYXMgc21hbGwgYXMgNDA5NiBieXRlcy4gIFNvIHdlIGNhbm5vdCBzYWZlbHkKLSAgICAgICBpbnZva2UgYWxsb2NhIChOKSBpZiBOIGV4Y2VlZHMgNDA5Ni4gIFVzZSBhIHNsaWdodGx5IHNtYWxsZXIgbnVtYmVyCi0gICAgICAgdG8gYWxsb3cgZm9yIGEgZmV3IGNvbXBpbGVyLWFsbG9jYXRlZCB0ZW1wb3Jhcnkgc3RhY2sgc2xvdHMuICAqLwotIyAgIGRlZmluZSBZWVNUQUNLX0FMTE9DX01BWElNVU0gNDAzMiAvKiByZWFzb25hYmxlIGNpcmNhIDIwMDYgKi8KLSMgIGVuZGlmCi0jIGVsc2UKLSMgIGRlZmluZSBZWVNUQUNLX0FMTE9DIFlZTUFMTE9DCi0jICBkZWZpbmUgWVlTVEFDS19GUkVFIFlZRlJFRQotIyAgaWZuZGVmIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTQotIyAgIGRlZmluZSBZWVNUQUNLX0FMTE9DX01BWElNVU0gWVlTSVpFX01BWElNVU0KLSMgIGVuZGlmCi0jICBpZiAoZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiAhIGRlZmluZWQgX1NURExJQl9IIFwKLSAgICAgICAmJiAhICgoZGVmaW5lZCBZWU1BTExPQyB8fCBkZWZpbmVkIG1hbGxvYykgXAotCSAgICAgJiYgKGRlZmluZWQgWVlGUkVFIHx8IGRlZmluZWQgZnJlZSkpKQotIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICAgaWZuZGVmIF9TVERMSUJfSAotIyAgICBkZWZpbmUgX1NURExJQl9IIDEKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgIGlmbmRlZiBZWU1BTExPQwotIyAgIGRlZmluZSBZWU1BTExPQyBtYWxsb2MKLSMgICBpZiAhIGRlZmluZWQgbWFsbG9jICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotdm9pZCAqbWFsbG9jIChZWVNJWkVfVCk7IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgIGlmbmRlZiBZWUZSRUUKLSMgICBkZWZpbmUgWVlGUkVFIGZyZWUKLSMgICBpZiAhIGRlZmluZWQgZnJlZSAmJiAhIGRlZmluZWQgX1NURExJQl9IICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLXZvaWQgZnJlZSAodm9pZCAqKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmIC8qICEgZGVmaW5lZCB5eW92ZXJmbG93IHx8IFlZRVJST1JfVkVSQk9TRSAqLwotCi0KLSNpZiAoISBkZWZpbmVkIHl5b3ZlcmZsb3cgXAotICAgICAmJiAoISBkZWZpbmVkIF9fY3BsdXNwbHVzIFwKLQkgfHwgKGRlZmluZWQgWVlTVFlQRV9JU19UUklWSUFMICYmIFlZU1RZUEVfSVNfVFJJVklBTCkpKQotCi0vKiBBIHR5cGUgdGhhdCBpcyBwcm9wZXJseSBhbGlnbmVkIGZvciBhbnkgc3RhY2sgbWVtYmVyLiAgKi8KLXVuaW9uIHl5YWxsb2MKLXsKLSAgeXl0eXBlX2ludDE2IHl5c3NfYWxsb2M7Ci0gIFlZU1RZUEUgeXl2c19hbGxvYzsKLX07Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBtYXhpbXVtIGdhcCBiZXR3ZWVuIG9uZSBhbGlnbmVkIHN0YWNrIGFuZCB0aGUgbmV4dC4gICovCi0jIGRlZmluZSBZWVNUQUNLX0dBUF9NQVhJTVVNIChzaXplb2YgKHVuaW9uIHl5YWxsb2MpIC0gMSkKLQotLyogVGhlIHNpemUgb2YgYW4gYXJyYXkgbGFyZ2UgdG8gZW5vdWdoIHRvIGhvbGQgYWxsIHN0YWNrcywgZWFjaCB3aXRoCi0gICBOIGVsZW1lbnRzLiAgKi8KLSMgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAotICAgICAoKE4pICogKHNpemVvZiAoeXl0eXBlX2ludDE2KSArIHNpemVvZiAoWVlTVFlQRSkpIFwKLSAgICAgICsgWVlTVEFDS19HQVBfTUFYSU1VTSkKLQotLyogQ29weSBDT1VOVCBvYmplY3RzIGZyb20gRlJPTSB0byBUTy4gIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRvCi0gICBub3Qgb3ZlcmxhcC4gICovCi0jIGlmbmRlZiBZWUNPUFkKLSMgIGlmIGRlZmluZWQgX19HTlVDX18gJiYgMSA8IF9fR05VQ19fCi0jICAgZGVmaW5lIFlZQ09QWShUbywgRnJvbSwgQ291bnQpIFwKLSAgICAgIF9fYnVpbHRpbl9tZW1jcHkgKFRvLCBGcm9tLCAoQ291bnQpICogc2l6ZW9mICgqKEZyb20pKSkKLSMgIGVsc2UKLSMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkJCVwKLSAgICAgIGRvCQkJCQlcCi0JewkJCQkJXAotCSAgWVlTSVpFX1QgeXlpOwkJCQlcCi0JICBmb3IgKHl5aSA9IDA7IHl5aSA8IChDb3VudCk7IHl5aSsrKQlcCi0JICAgIChUbylbeXlpXSA9IChGcm9tKVt5eWldOwkJXAotCX0JCQkJCVwKLSAgICAgIHdoaWxlIChZWUlEICgwKSkKLSMgIGVuZGlmCi0jIGVuZGlmCi0KLS8qIFJlbG9jYXRlIFNUQUNLIGZyb20gaXRzIG9sZCBsb2NhdGlvbiB0byB0aGUgbmV3IG9uZS4gIFRoZQotICAgbG9jYWwgdmFyaWFibGVzIFlZU0laRSBhbmQgWVlTVEFDS1NJWkUgZ2l2ZSB0aGUgb2xkIGFuZCBuZXcgbnVtYmVyIG9mCi0gICBlbGVtZW50cyBpbiB0aGUgc3RhY2ssIGFuZCBZWVBUUiBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZQotICAgc3RhY2suICBBZHZhbmNlIFlZUFRSIHRvIGEgcHJvcGVybHkgYWxpZ25lZCBsb2NhdGlvbiBmb3IgdGhlIG5leHQKLSAgIHN0YWNrLiAgKi8KLSMgZGVmaW5lIFlZU1RBQ0tfUkVMT0NBVEUoU3RhY2tfYWxsb2MsIFN0YWNrKQkJCQlcCi0gICAgZG8JCQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCVlZU0laRV9UIHl5bmV3Ynl0ZXM7CQkJCQkJXAotCVlZQ09QWSAoJnl5cHRyLT5TdGFja19hbGxvYywgU3RhY2ssIHl5c2l6ZSk7CQkJXAotCVN0YWNrID0gJnl5cHRyLT5TdGFja19hbGxvYzsJCQkJCVwKLQl5eW5ld2J5dGVzID0geXlzdGFja3NpemUgKiBzaXplb2YgKCpTdGFjaykgKyBZWVNUQUNLX0dBUF9NQVhJTVVNOyBcCi0JeXlwdHIgKz0geXluZXdieXRlcyAvIHNpemVvZiAoKnl5cHRyKTsJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICB3aGlsZSAoWVlJRCAoMCkpCi0KLSNlbmRpZgotCi0vKiBZWUZJTkFMIC0tIFN0YXRlIG51bWJlciBvZiB0aGUgdGVybWluYXRpb24gc3RhdGUuICAqLwotI2RlZmluZSBZWUZJTkFMICA0Ci0vKiBZWUxBU1QgLS0gTGFzdCBpbmRleCBpbiBZWVRBQkxFLiAgKi8KLSNkZWZpbmUgWVlMQVNUICAgNTMyCi0KLS8qIFlZTlRPS0VOUyAtLSBOdW1iZXIgb2YgdGVybWluYWxzLiAgKi8KLSNkZWZpbmUgWVlOVE9LRU5TICA1MwotLyogWVlOTlRTIC0tIE51bWJlciBvZiBub250ZXJtaW5hbHMuICAqLwotI2RlZmluZSBZWU5OVFMgIDQ5Ci0vKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2YgcnVsZXMuICAqLwotI2RlZmluZSBZWU5SVUxFUyAgMTMyCi0vKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2Ygc3RhdGVzLiAgKi8KLSNkZWZpbmUgWVlOU1RBVEVTICAxODgKLQotLyogWVlUUkFOU0xBVEUoWVlMRVgpIC0tIEJpc29uIHN5bWJvbCBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gICovCi0jZGVmaW5lIFlZVU5ERUZUT0sgIDIKLSNkZWZpbmUgWVlNQVhVVE9LICAgMjk4Ci0KLSNkZWZpbmUgWVlUUkFOU0xBVEUoWVlYKQkJCQkJCVwKLSAgKCh1bnNpZ25lZCBpbnQpIChZWVgpIDw9IFlZTUFYVVRPSyA/IHl5dHJhbnNsYXRlW1lZWF0gOiBZWVVOREVGVE9LKQotCi0vKiBZWVRSQU5TTEFURVtZWUxFWF0gLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXl0cmFuc2xhdGVbXSA9Ci17Ci0gICAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgIDQ3LCAgICA0OSwgICAgNDgsICAgICAyLCAgICA0NiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICA1MiwgICAgNDQsCi0gICAgICAgMiwgICAgNTAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICA1MSwgICAgIDIsICAgIDQ1LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LAotICAgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsCi0gICAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwKLSAgICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LAotICAgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MwotfTsKLQotI2lmIFlZREVCVUcKLS8qIFlZUFJIU1tZWU5dIC0tIEluZGV4IG9mIHRoZSBmaXJzdCBSSFMgc3ltYm9sIG9mIHJ1bGUgbnVtYmVyIFlZTiBpbgotICAgWVlSSFMuICAqLwotc3RhdGljIGNvbnN0IHl5dHlwZV91aW50MTYgeXlwcmhzW10gPQotewotICAgICAgIDAsICAgICAwLCAgICAgMywgICAgIDUsICAgICA4LCAgICAgOSwgICAgMTIsICAgIDEzLCAgICAxOCwgICAgMTksCi0gICAgICAyMywgICAgMjUsICAgIDI3LCAgICAyOSwgICAgMzEsICAgIDM0LCAgICAzNywgICAgNDEsICAgIDQyLCAgICA0NCwKLSAgICAgIDQ2LCAgICA1MCwgICAgNTUsICAgIDU2LCAgICA1OCwgICAgNjAsICAgIDYzLCAgICA2NSwgICAgNjcsICAgIDY5LAotICAgICAgNzEsICAgIDczLCAgICA3NSwgICAgNzcsICAgIDc5LCAgICA4MSwgICAgODcsICAgIDkyLCAgICA5NSwgICAgOTgsCi0gICAgIDEwMSwgICAxMDUsICAgMTA5LCAgIDExMywgICAxMTYsICAgMTE5LCAgIDEyMiwgICAxMjQsICAgMTI2LCAgIDEyOCwKLSAgICAgMTMwLCAgIDEzMiwgICAxMzQsICAgMTM2LCAgIDEzOCwgICAxNDAsICAgMTQyLCAgIDE0NCwgICAxNDcsICAgMTQ4LAotICAgICAxNTAsICAgMTUyLCAgIDE1NSwgICAxNTcsICAgMTU5LCAgIDE2MSwgICAxNjMsICAgMTY2LCAgIDE2OCwgICAxNzAsCi0gICAgIDE3NSwgICAxODAsICAgMTgzLCAgIDE4NywgICAxOTEsICAgMTk0LCAgIDE5NiwgICAxOTgsICAgMjAwLCAgIDIwNSwKLSAgICAgMjEwLCAgIDIxMywgICAyMTcsICAgMjIxLCAgIDIyNCwgICAyMjYsICAgMjMwLCAgIDIzMSwgICAyMzMsICAgMjM1LAotICAgICAyMzksICAgMjQyLCAgIDI0NSwgICAyNDcsICAgMjQ4LCAgIDI1MCwgICAyNTIsICAgMjU3LCAgIDI2MiwgICAyNjUsCi0gICAgIDI2OSwgICAyNzMsICAgMjc3LCAgIDI3OCwgICAyODAsICAgMjgzLCAgIDI4NywgICAyOTEsICAgMjkyLCAgIDI5NCwKLSAgICAgMjk2LCAgIDI5OSwgICAzMDMsICAgMzA2LCAgIDMwNywgICAzMDksICAgMzExLCAgIDMxNSwgICAzMTgsICAgMzIxLAotICAgICAzMjMsICAgMzI2LCAgIDMyNywgICAzMzAsICAgMzM0LCAgIDMzOSwgICAzNDEsICAgMzQ1LCAgIDM0NywgICAzNTEsCi0gICAgIDM1NCwgICAzNTUsICAgMzU3Ci19OwotCi0vKiBZWVJIUyAtLSBBIGAtMSctc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHJ1bGVzJyBSSFMuICAqLwotc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5cmhzW10gPQotewotICAgICAgNTQsICAgICAwLCAgICAtMSwgICAgNTUsICAgIC0xLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICAtMSwgICAgNTYsCi0gICAgICA1NywgICAgLTEsICAgIC0xLCAgICAxMiwgICAgMjMsICAgIDU4LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAyMywKLSAgICAgIDU5LCAgICA2MCwgICAgLTEsICAgIDYwLCAgICAtMSwgICAgODQsICAgIC0xLCAgICA5OSwgICAgLTEsICAgMTAxLAotICAgICAgLTEsICAgICAxLCAgICA0NCwgICAgLTEsICAgICAxLCAgICA0NSwgICAgLTEsICAgIDY0LCAgICA2MSwgICAgNDQsCi0gICAgICAtMSwgICAgLTEsICAgIDYyLCAgICAtMSwgICAgNjMsICAgIC0xLCAgICA2MiwgICAgNDYsICAgIDYzLCAgICAtMSwKLSAgICAgIDc0LCAgIDEwMCwgICAgOTUsICAgIDg1LCAgICAtMSwgICAgLTEsICAgIDY1LCAgICAtMSwgICAgNjYsICAgIC0xLAotICAgICAgNjUsICAgIDY2LCAgICAtMSwgICAgNjcsICAgIC0xLCAgICA2OCwgICAgLTEsICAgICA1LCAgICAtMSwgICAgMTcsCi0gICAgICAtMSwgICAgMjEsICAgIC0xLCAgICAxMSwgICAgLTEsICAgIDE0LCAgICAtMSwgICAgNjksICAgIC0xLCAgICA3MywKLSAgICAgIC0xLCAgICAyOCwgICAgNDcsICAgIDY1LCAgICA0OCwgICAgNDksICAgIC0xLCAgICAyOCwgICAgNDcsICAgIDY1LAotICAgICAgNDksICAgIC0xLCAgICAyMiwgICAgMzcsICAgIC0xLCAgICAyNCwgICAgMzcsICAgIC0xLCAgICAxMCwgICAgMzcsCi0gICAgICAtMSwgICAgMjIsICAgIDM3LCAgICA4NywgICAgLTEsICAgIDI0LCAgICAzNywgICAgODcsICAgIC0xLCAgICAxMCwKLSAgICAgIDM3LCAgICA5NiwgICAgLTEsICAgIDEwLCAgICA5NiwgICAgLTEsICAgIDIyLCAgICA4NywgICAgLTEsICAgIDI0LAotICAgICAgODcsICAgIC0xLCAgICAgNywgICAgLTEsICAgIDE5LCAgICAtMSwgICAgMTUsICAgIC0xLCAgICAxNiwgICAgLTEsCi0gICAgICAyMCwgICAgLTEsICAgIDI1LCAgICAtMSwgICAgMTMsICAgIC0xLCAgICAgOSwgICAgLTEsICAgIDI2LCAgICAtMSwKLSAgICAgICA2LCAgICAtMSwgICAgNDEsICAgIC0xLCAgICA0OCwgICAgNzEsICAgIC0xLCAgICAtMSwgICAgNzIsICAgIC0xLAotICAgICAgNzMsICAgIC0xLCAgICA3MiwgICAgNzMsICAgIC0xLCAgICAgOCwgICAgLTEsICAgIDI3LCAgICAtMSwgICAgMzEsCi0gICAgICAtMSwgICAgMTgsICAgIC0xLCAgICA3MCwgICAgNzQsICAgIC0xLCAgICA3NSwgICAgLTEsICAgIDM3LCAgICAtMSwKLSAgICAgIDc1LCAgICA0NywgICAgNzgsICAgIDQ5LCAgICAtMSwgICAgNzUsICAgIDQ3LCAgICAgMSwgICAgNDksICAgIC0xLAotICAgICAgNzUsICAgIDMzLCAgICAtMSwgICAgNDcsICAgIDc0LCAgICA0OSwgICAgLTEsICAgIDQ3LCAgICAgMSwgICAgNDksCi0gICAgICAtMSwgICAgNzAsICAgIDc2LCAgICAtMSwgICAgNzcsICAgIC0xLCAgICAzNywgICAgLTEsICAgIDQxLCAgICAtMSwKLSAgICAgIDc3LCAgICA0NywgICAgNzgsICAgIDQ5LCAgICAtMSwgICAgNzcsICAgIDQ3LCAgICAgMSwgICAgNDksICAgIC0xLAotICAgICAgNzcsICAgIDMzLCAgICAtMSwgICAgNDcsICAgIDc2LCAgICA0OSwgICAgLTEsICAgIDQ3LCAgICAgMSwgICAgNDksCi0gICAgICAtMSwgICAgNzksICAgIDM2LCAgICAtMSwgICAgNzksICAgIC0xLCAgICA4MCwgICAgNDYsICAgIDM2LCAgICAtMSwKLSAgICAgIC0xLCAgICA4MCwgICAgLTEsICAgIDgxLCAgICAtMSwgICAgODAsICAgIDQ2LCAgICA4MSwgICAgLTEsICAgIDY1LAotICAgICAgODIsICAgIC0xLCAgICA3MCwgICAgODIsICAgIC0xLCAgICA4MywgICAgLTEsICAgIC0xLCAgICAzNywgICAgLTEsCi0gICAgICA0MSwgICAgLTEsICAgIDgzLCAgICA0NywgICAgNzgsICAgIDQ5LCAgICAtMSwgICAgODMsICAgIDQ3LCAgICAgMSwKLSAgICAgIDQ5LCAgICAtMSwgICAgODMsICAgIDMzLCAgICAtMSwgICAgNDcsICAgIDgyLCAgICA0OSwgICAgLTEsICAgIDQ3LAotICAgICAgIDEsICAgIDQ5LCAgICAtMSwgICAgNjQsICAgIDc0LCAgICAzMiwgICAgLTEsICAgIC0xLCAgICA4NiwgICAgLTEsCi0gICAgICA1MCwgICAgMzQsICAgIC0xLCAgICA1MSwgICAgODgsICAgIDQ1LCAgICAtMSwgICAgNTEsICAgICAxLCAgICA0NSwKLSAgICAgIC0xLCAgICAtMSwgICAgODksICAgIC0xLCAgICA5MCwgICAgLTEsICAgIDg5LCAgICA5MCwgICAgLTEsICAgIDY0LAotICAgICAgOTEsICAgIDQ0LCAgICAtMSwgICAgIDEsICAgIDQ0LCAgICAtMSwgICAgLTEsICAgIDkyLCAgICAtMSwgICAgOTMsCi0gICAgICAtMSwgICAgOTIsICAgIDQ2LCAgICA5MywgICAgLTEsICAgIDc2LCAgICA5NSwgICAgLTEsICAgIDM3LCAgICA5NCwKLSAgICAgIC0xLCAgICA5NCwgICAgLTEsICAgIDUyLCAgICAzNCwgICAgLTEsICAgIC0xLCAgICA5NSwgICAgMzEsICAgIC0xLAotICAgICAgNTEsICAgIDk3LCAgICA0NSwgICAgLTEsICAgIDUxLCAgICA5NywgICAgNDYsICAgIDQ1LCAgICAtMSwgICAgOTgsCi0gICAgICAtMSwgICAgOTcsICAgIDQ2LCAgICA5OCwgICAgLTEsICAgIDM3LCAgICAtMSwgICAgMzcsICAgIDUwLCAgICAzNCwKLSAgICAgIC0xLCAgICAzMCwgICAgNDQsICAgIC0xLCAgICAtMSwgICAgMzAsICAgIC0xLCAgICAyOSwgICAgNDcsICAgIDM3LAotICAgICAgNDksICAgIDQ0LCAgICAtMQotfTsKLQotLyogWVlSTElORVtZWU5dIC0tIHNvdXJjZSBsaW5lIHdoZXJlIHJ1bGUgbnVtYmVyIFlZTiB3YXMgZGVmaW5lZC4gICovCi1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQxNiB5eXJsaW5lW10gPQotewotICAgICAgIDAsICAgMTA0LCAgIDEwNCwgICAxMDUsICAgMTA5LCAgIDEwOSwgICAxMTUsICAgMTE1LCAgIDExNywgICAxMTcsCi0gICAgIDExOSwgICAxMjAsICAgMTIxLCAgIDEyMiwgICAxMjMsICAgMTI0LCAgIDEyOCwgICAxNDIsICAgMTQzLCAgIDE0NywKLSAgICAgMTU1LCAgIDE2OCwgICAxNzQsICAgMTc1LCAgIDE3OSwgICAxODAsICAgMTg0LCAgIDE5MCwgICAxOTQsICAgMTk1LAotICAgICAxOTYsICAgMTk3LCAgIDE5OCwgICAyMDIsICAgMjAzLCAgIDIwNCwgICAyMDUsICAgMjA5LCAgIDIxMSwgICAyMTMsCi0gICAgIDIxNywgICAyMjQsICAgMjMxLCAgIDI0MSwgICAyNDQsICAgMjQ1LCAgIDI0OSwgICAyNTAsICAgMjUxLCAgIDI1MiwKLSAgICAgMjUzLCAgIDI1NCwgICAyNTUsICAgMjU2LCAgIDI1NywgICAyNTgsICAgMjU5LCAgIDI2MywgICAyNjgsICAgMjY5LAotICAgICAyNzMsICAgMjc0LCAgIDI3OCwgICAyNzgsICAgMjc4LCAgIDI3OSwgICAyODcsICAgMjg4LCAgIDI5MiwgICAzMDEsCi0gICAgIDMwMywgICAzMDUsICAgMzA3LCAgIDMwOSwgICAzMTYsICAgMzE3LCAgIDMyMSwgICAzMjIsICAgMzIzLCAgIDMyNSwKLSAgICAgMzI3LCAgIDMyOSwgICAzMzEsICAgMzM2LCAgIDMzNywgICAzMzgsICAgMzQyLCAgIDM0MywgICAzNDcsICAgMzQ4LAotICAgICAzNTMsICAgMzU4LCAgIDM2MCwgICAzNjQsICAgMzY1LCAgIDM3MywgICAzNzcsICAgMzc5LCAgIDM4MSwgICAzODMsCi0gICAgIDM4NSwgICAzOTAsICAgMzk5LCAgIDQwMCwgICA0MDUsICAgNDEwLCAgIDQxMSwgICA0MTUsICAgNDE2LCAgIDQyMCwKLSAgICAgNDIxLCAgIDQyNSwgICA0MjcsICAgNDMyLCAgIDQzMywgICA0MzcsICAgNDM4LCAgIDQ0MiwgICA0NDMsICAgNDQ0LAotICAgICA0NDgsICAgNDUyLCAgIDQ1MywgICA0NTcsICAgNDU4LCAgIDQ2MiwgICA0NjMsICAgNDY2LCAgIDQ3MSwgICA0NzksCi0gICAgIDQ4MywgICA0ODQsICAgNDg4Ci19OwotI2VuZGlmCi0KLSNpZiBZWURFQlVHIHx8IFlZRVJST1JfVkVSQk9TRSB8fCBZWVRPS0VOX1RBQkxFCi0vKiBZWVROQU1FW1NZTUJPTC1OVU1dIC0tIFN0cmluZyBuYW1lIG9mIHRoZSBzeW1ib2wgU1lNQk9MLU5VTS4KLSAgIEZpcnN0LCB0aGUgdGVybWluYWxzLCB0aGVuLCBzdGFydGluZyBhdCBZWU5UT0tFTlMsIG5vbnRlcm1pbmFscy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgeXl0bmFtZVtdID0KLXsKLSAgIiRlbmQiLCAiZXJyb3IiLCAiJHVuZGVmaW5lZCIsICJBU01fS0VZVyIsICJBVFRSSUJVVEVfS0VZVyIsCi0gICJBVVRPX0tFWVciLCAiQk9PTF9LRVlXIiwgIkNIQVJfS0VZVyIsICJDT05TVF9LRVlXIiwgIkRPVUJMRV9LRVlXIiwKLSAgIkVOVU1fS0VZVyIsICJFWFRFUk5fS0VZVyIsICJFWFRFTlNJT05fS0VZVyIsICJGTE9BVF9LRVlXIiwKLSAgIklOTElORV9LRVlXIiwgIklOVF9LRVlXIiwgIkxPTkdfS0VZVyIsICJSRUdJU1RFUl9LRVlXIiwgIlJFU1RSSUNUX0tFWVciLAotICAiU0hPUlRfS0VZVyIsICJTSUdORURfS0VZVyIsICJTVEFUSUNfS0VZVyIsICJTVFJVQ1RfS0VZVyIsCi0gICJUWVBFREVGX0tFWVciLCAiVU5JT05fS0VZVyIsICJVTlNJR05FRF9LRVlXIiwgIlZPSURfS0VZVyIsCi0gICJWT0xBVElMRV9LRVlXIiwgIlRZUEVPRl9LRVlXIiwgIkVYUE9SVF9TWU1CT0xfS0VZVyIsICJBU01fUEhSQVNFIiwKLSAgIkFUVFJJQlVURV9QSFJBU0UiLCAiQlJBQ0VfUEhSQVNFIiwgIkJSQUNLRVRfUEhSQVNFIiwKLSAgIkVYUFJFU1NJT05fUEhSQVNFIiwgIkNIQVIiLCAiRE9UUyIsICJJREVOVCIsICJJTlQiLCAiUkVBTCIsICJTVFJJTkciLAotICAiVFlQRSIsICJPVEhFUiIsICJGSUxFTkFNRSIsICInOyciLCAiJ30nIiwgIicsJyIsICInKCciLCAiJyonIiwgIicpJyIsCi0gICInPSciLCAiJ3snIiwgIic6JyIsICIkYWNjZXB0IiwgImRlY2xhcmF0aW9uX3NlcSIsICJkZWNsYXJhdGlvbiIsICIkQDEiLAotICAiZGVjbGFyYXRpb24xIiwgIiRAMiIsICIkQDMiLCAic2ltcGxlX2RlY2xhcmF0aW9uIiwKLSAgImluaXRfZGVjbGFyYXRvcl9saXN0X29wdCIsICJpbml0X2RlY2xhcmF0b3JfbGlzdCIsICJpbml0X2RlY2xhcmF0b3IiLAotICAiZGVjbF9zcGVjaWZpZXJfc2VxX29wdCIsICJkZWNsX3NwZWNpZmllcl9zZXEiLCAiZGVjbF9zcGVjaWZpZXIiLAotICAic3RvcmFnZV9jbGFzc19zcGVjaWZpZXIiLCAidHlwZV9zcGVjaWZpZXIiLCAic2ltcGxlX3R5cGVfc3BlY2lmaWVyIiwKLSAgInB0cl9vcGVyYXRvciIsICJjdmFyX3F1YWxpZmllcl9zZXFfb3B0IiwgImN2YXJfcXVhbGlmaWVyX3NlcSIsCi0gICJjdmFyX3F1YWxpZmllciIsICJkZWNsYXJhdG9yIiwgImRpcmVjdF9kZWNsYXJhdG9yIiwgIm5lc3RlZF9kZWNsYXJhdG9yIiwKLSAgImRpcmVjdF9uZXN0ZWRfZGVjbGFyYXRvciIsICJwYXJhbWV0ZXJfZGVjbGFyYXRpb25fY2xhdXNlIiwKLSAgInBhcmFtZXRlcl9kZWNsYXJhdGlvbl9saXN0X29wdCIsICJwYXJhbWV0ZXJfZGVjbGFyYXRpb25fbGlzdCIsCi0gICJwYXJhbWV0ZXJfZGVjbGFyYXRpb24iLCAibV9hYnN0cmFjdF9kZWNsYXJhdG9yIiwKLSAgImRpcmVjdF9tX2Fic3RyYWN0X2RlY2xhcmF0b3IiLCAiZnVuY3Rpb25fZGVmaW5pdGlvbiIsICJpbml0aWFsaXplcl9vcHQiLAotICAiaW5pdGlhbGl6ZXIiLCAiY2xhc3NfYm9keSIsICJtZW1iZXJfc3BlY2lmaWNhdGlvbl9vcHQiLAotICAibWVtYmVyX3NwZWNpZmljYXRpb24iLCAibWVtYmVyX2RlY2xhcmF0aW9uIiwKLSAgIm1lbWJlcl9kZWNsYXJhdG9yX2xpc3Rfb3B0IiwgIm1lbWJlcl9kZWNsYXJhdG9yX2xpc3QiLAotICAibWVtYmVyX2RlY2xhcmF0b3IiLCAibWVtYmVyX2JpdGZpZWxkX2RlY2xhcmF0b3IiLCAiYXR0cmlidXRlX29wdCIsCi0gICJlbnVtX2JvZHkiLCAiZW51bWVyYXRvcl9saXN0IiwgImVudW1lcmF0b3IiLCAiYXNtX2RlZmluaXRpb24iLAotICAiYXNtX3BocmFzZV9vcHQiLCAiZXhwb3J0X2RlZmluaXRpb24iLCAwCi19OwotI2VuZGlmCi0KLSMgaWZkZWYgWVlQUklOVAotLyogWVlUT0tOVU1bWVlMRVgtTlVNXSAtLSBJbnRlcm5hbCB0b2tlbiBudW1iZXIgY29ycmVzcG9uZGluZyB0bwotICAgdG9rZW4gWVlMRVgtTlVNLiAgKi8KLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5dG9rbnVtW10gPQotewotICAgICAgIDAsICAgMjU2LCAgIDI1NywgICAyNTgsICAgMjU5LCAgIDI2MCwgICAyNjEsICAgMjYyLCAgIDI2MywgICAyNjQsCi0gICAgIDI2NSwgICAyNjYsICAgMjY3LCAgIDI2OCwgICAyNjksICAgMjcwLCAgIDI3MSwgICAyNzIsICAgMjczLCAgIDI3NCwKLSAgICAgMjc1LCAgIDI3NiwgICAyNzcsICAgMjc4LCAgIDI3OSwgICAyODAsICAgMjgxLCAgIDI4MiwgICAyODMsICAgMjg0LAotICAgICAyODUsICAgMjg2LCAgIDI4NywgICAyODgsICAgMjg5LCAgIDI5MCwgICAyOTEsICAgMjkyLCAgIDI5MywgICAyOTQsCi0gICAgIDI5NSwgICAyOTYsICAgMjk3LCAgIDI5OCwgICAgNTksICAgMTI1LCAgICA0NCwgICAgNDAsICAgIDQyLCAgICA0MSwKLSAgICAgIDYxLCAgIDEyMywgICAgNTgKLX07Ci0jIGVuZGlmCi0KLS8qIFlZUjFbWVlOXSAtLSBTeW1ib2wgbnVtYmVyIG9mIHN5bWJvbCB0aGF0IHJ1bGUgWVlOIGRlcml2ZXMuICAqLwotc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXIxW10gPQotewotICAgICAgIDAsICAgIDUzLCAgICA1NCwgICAgNTQsICAgIDU2LCAgICA1NSwgICAgNTgsICAgIDU3LCAgICA1OSwgICAgNTcsCi0gICAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA2MCwgICAgNjEsICAgIDYxLCAgICA2MiwKLSAgICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY0LCAgICA2NSwgICAgNjUsICAgIDY2LCAgICA2NiwgICAgNjcsICAgIDY3LAotICAgICAgNjcsICAgIDY3LCAgICA2NywgICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsCi0gICAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OSwgICAgNjksICAgIDY5LCAgICA2OSwKLSAgICAgIDY5LCAgICA2OSwgICAgNjksICAgIDY5LCAgICA2OSwgICAgNjksICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcxLAotICAgICAgNzIsICAgIDcyLCAgICA3MywgICAgNzMsICAgIDczLCAgICA3MywgICAgNzQsICAgIDc0LCAgICA3NSwgICAgNzUsCi0gICAgICA3NSwgICAgNzUsICAgIDc1LCAgICA3NSwgICAgNzYsICAgIDc2LCAgICA3NywgICAgNzcsICAgIDc3LCAgICA3NywKLSAgICAgIDc3LCAgICA3NywgICAgNzcsICAgIDc4LCAgICA3OCwgICAgNzgsICAgIDc5LCAgICA3OSwgICAgODAsICAgIDgwLAotICAgICAgODEsICAgIDgyLCAgICA4MiwgICAgODMsICAgIDgzLCAgICA4MywgICAgODMsICAgIDgzLCAgICA4MywgICAgODMsCi0gICAgICA4MywgICAgODQsICAgIDg1LCAgICA4NSwgICAgODYsICAgIDg3LCAgICA4NywgICAgODgsICAgIDg4LCAgICA4OSwKLSAgICAgIDg5LCAgICA5MCwgICAgOTAsICAgIDkxLCAgICA5MSwgICAgOTIsICAgIDkyLCAgICA5MywgICAgOTMsICAgIDkzLAotICAgICAgOTQsICAgIDk1LCAgICA5NSwgICAgOTYsICAgIDk2LCAgICA5NywgICAgOTcsICAgIDk4LCAgICA5OCwgICAgOTksCi0gICAgIDEwMCwgICAxMDAsICAgMTAxCi19OwotCi0vKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gICovCi1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjJbXSA9Ci17Ci0gICAgICAgMCwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMCwgICAgIDQsICAgICAwLCAgICAgMywKLSAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMCwgICAgIDEsICAgICAxLAotICAgICAgIDMsICAgICA0LCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCi0gICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICA1LCAgICAgNCwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAzLCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAotICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMCwgICAgIDEsCi0gICAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgNCwKLSAgICAgICA0LCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDQsICAgICA0LAotICAgICAgIDIsICAgICAzLCAgICAgMywgICAgIDIsICAgICAxLCAgICAgMywgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDMsCi0gICAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgNCwgICAgIDQsICAgICAyLCAgICAgMywKLSAgICAgICAzLCAgICAgMywgICAgIDAsICAgICAxLCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgMCwgICAgIDEsICAgICAxLAotICAgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDEsCi0gICAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMywgICAgIDQsICAgICAxLCAgICAgMywgICAgIDEsICAgICAzLCAgICAgMiwKLSAgICAgICAwLCAgICAgMSwgICAgIDUKLX07Ci0KLS8qIFlZREVGQUNUW1NUQVRFLU5BTUVdIC0tIERlZmF1bHQgcnVsZSB0byByZWR1Y2Ugd2l0aCBpbiBzdGF0ZQotICAgU1RBVEUtTlVNIHdoZW4gWVlUQUJMRSBkb2Vzbid0IHNwZWNpZnkgc29tZXRoaW5nIGVsc2UgdG8gZG8uICBaZXJvCi0gICBtZWFucyB0aGUgZGVmYXVsdCBpcyBhbiBlcnJvci4gICovCi1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5ZGVmYWN0W10gPQotewotICAgICAgIDQsICAgICA0LCAgICAgMiwgICAgIDAsICAgICAxLCAgICAgMywgICAgIDAsICAgIDI4LCAgICA1NSwgICAgNDYsCi0gICAgICA2MiwgICAgNTMsICAgICAwLCAgICAzMSwgICAgIDAsICAgIDUyLCAgICAzMiwgICAgNDgsICAgIDQ5LCAgICAyOSwKLSAgICAgIDY1LCAgICA0NywgICAgNTAsICAgIDMwLCAgICAgMCwgICAgIDgsICAgICAwLCAgICA1MSwgICAgNTQsICAgIDYzLAotICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgNjQsICAgIDU2LCAgICAgNSwgICAgMTAsICAgIDE3LCAgICAyMywgICAgMjQsCi0gICAgICAyNiwgICAgMjcsICAgIDMzLCAgICAzNCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAzOSwKLSAgICAgICAwLCAgICA0MywgICAgIDYsICAgIDM3LCAgICAgMCwgICAgNDQsICAgIDIyLCAgICAzOCwgICAgNDUsICAgICAwLAotICAgICAgIDAsICAgMTI5LCAgICA2OCwgICAgIDAsICAgIDU4LCAgICAgMCwgICAgMTgsICAgIDE5LCAgICAgMCwgICAxMzAsCi0gICAgICA2NywgICAgMjUsICAgIDQyLCAgIDEyNywgICAgIDAsICAgMTI1LCAgICAyMiwgICAgNDAsICAgICAwLCAgIDExMywKLSAgICAgICAwLCAgICAgMCwgICAxMDksICAgICA5LCAgICAxNywgICAgNDEsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAgNTcsICAgIDU5LCAgICA2MCwgICAgMTYsICAgICAwLCAgICA2NiwgICAxMzEsICAgMTAxLCAgIDEyMSwgICAgNzEsCi0gICAgICAgMCwgICAgIDAsICAgMTIzLCAgICAgMCwgICAgIDcsICAgMTEyLCAgIDEwNiwgICAgNzYsICAgIDc3LCAgICAgMCwKLSAgICAgICAwLCAgICAgMCwgICAxMjEsICAgIDc1LCAgICAgMCwgICAxMTQsICAgMTE1LCAgIDExOSwgICAxMDUsICAgICAwLAotICAgICAxMTAsICAgMTMwLCAgICAgMCwgICAgMzYsICAgICAwLCAgICA3MywgICAgNzIsICAgIDYxLCAgICAyMCwgICAxMDIsCi0gICAgICAgMCwgICAgOTMsICAgICAwLCAgICA4NCwgICAgODcsICAgIDg4LCAgIDEyOCwgICAxMjQsICAgMTI2LCAgIDExOCwKLSAgICAgICAwLCAgICA3NiwgICAgIDAsICAgMTIwLCAgICA3NCwgICAxMTcsICAgIDgwLCAgICAgMCwgICAxMTEsICAgICAwLAotICAgICAgMzUsICAgMTMyLCAgIDEyMiwgICAgIDAsICAgIDIxLCAgIDEwMywgICAgNzAsICAgIDk0LCAgICA1NiwgICAgIDAsCi0gICAgICA5MywgICAgOTAsICAgIDkyLCAgICA2OSwgICAgODMsICAgICAwLCAgICA4MiwgICAgODEsICAgICAwLCAgICAgMCwKLSAgICAgMTE2LCAgIDEwNCwgICAgIDAsICAgIDk1LCAgICAgMCwgICAgOTEsICAgIDk4LCAgICAgMCwgICAgODUsICAgIDg5LAotICAgICAgNzksICAgIDc4LCAgIDEwMCwgICAgOTksICAgICAwLCAgICAgMCwgICAgOTcsICAgIDk2Ci19OwotCi0vKiBZWURFRkdPVE9bTlRFUk0tTlVNXS4gICovCi1zdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5ZGVmZ290b1tdID0KLXsKLSAgICAgIC0xLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAzNSwgICAgNzYsICAgIDU2LCAgICAzNiwgICAgNjUsICAgIDY2LAotICAgICAgNjcsICAgIDc5LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDY4LCAgICA5MCwgICAgOTEsCi0gICAgICA0MywgICAxMjEsICAgIDcwLCAgIDExMiwgICAxMTMsICAgMTMyLCAgIDEzMywgICAxMzQsICAgMTM1LCAgIDE2MSwKLSAgICAgMTYyLCAgICA0NCwgICAxNTQsICAgMTU1LCAgICA1NSwgICAgODAsICAgIDgxLCAgICA4MiwgICAxMTQsICAgMTE1LAotICAgICAxMTYsICAgMTE3LCAgIDEyOSwgICAgNTEsICAgIDc0LCAgICA3NSwgICAgNDUsICAgIDk4LCAgICA0NgotfTsKLQotLyogWVlQQUNUW1NUQVRFLU5VTV0gLS0gSW5kZXggaW4gWVlUQUJMRSBvZiB0aGUgcG9ydGlvbiBkZXNjcmliaW5nCi0gICBTVEFURS1OVU0uICAqLwotI2RlZmluZSBZWVBBQ1RfTklORiAtMTM1Ci1zdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5cGFjdFtdID0KLXsKLSAgICAtMTM1LCAgICAyMCwgIC0xMzUsICAgMzIxLCAgLTEzNSwgIC0xMzUsICAgIDMwLCAgLTEzNSwgIC0xMzUsICAtMTM1LAotICAgIC0xMzUsICAtMTM1LCAgIC0yOCwgIC0xMzUsICAgICAyLCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsCi0gICAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgICAgLTYsICAtMTM1LCAgICAgOSwgIC0xMzUsICAtMTM1LCAgLTEzNSwKLSAgICAgIC01LCAgICAxNSwgICAtMTcsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgICAxOCwgICA0OTEsICAtMTM1LAotICAgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgICAtMjIsCi0gICAgICAzMSwgIC0xMzUsICAtMTM1LCAgICAxOSwgICAxMDYsICAtMTM1LCAgIDQ5MSwgICAgMTksICAtMTM1LCAgIDQ5MSwKLSAgICAgIDUwLCAgLTEzNSwgIC0xMzUsICAgIDExLCAgICAtMywgICAgNTEsICAgIDU3LCAgLTEzNSwgICAgMTgsICAgLTE0LAotICAgICAgMTQsICAtMTM1LCAgLTEzNSwgICAgNDgsICAgIDQ2LCAgLTEzNSwgICA0OTEsICAtMTM1LCAgICAzMywgICAgMzIsCi0gICAgICA1OSwgICAxNTQsICAtMTM1LCAgLTEzNSwgICAgMTgsICAtMTM1LCAgIDM2NSwgICAgNTYsICAgIDYwLCAgICA2MSwKLSAgICAtMTM1LCAgICAtMywgIC0xMzUsICAtMTM1LCAgICAxOCwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LAotICAgICAyMDIsICAgIDc0LCAgLTEzNSwgICAtMjMsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgIDc3LCAgLTEzNSwgICAgMTYsCi0gICAgIDEwMSwgICAgNDksICAtMTM1LCAgICAzNCwgICAgOTIsICAgIDkzLCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgICA5NCwKLSAgICAtMTM1LCAgIDExMCwgICAgOTUsICAtMTM1LCAgICA5NywgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgLTIwLAotICAgICAgOTYsICAgNDEwLCAgICA5OSwgICAxMTMsICAgMTAwLCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsCi0gICAgIDEwMywgIC0xMzUsICAgMTA3LCAgLTEzNSwgIC0xMzUsICAgMTExLCAgLTEzNSwgICAyMzksICAtMTM1LCAgICAzMiwKLSAgICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgMTIzLCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgICAzLAotICAgICAgNTIsICAtMTM1LCAgICAzOCwgIC0xMzUsICAtMTM1LCAgIDQ1NCwgIC0xMzUsICAtMTM1LCAgIDExNywgICAxMjgsCi0gICAgLTEzNSwgIC0xMzUsICAgMTM0LCAgLTEzNSwgICAxMzUsICAtMTM1LCAgLTEzNSwgICAyNzYsICAtMTM1LCAgLTEzNSwKLSAgICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIDEzNywgICAxMzgsICAtMTM1LCAgLTEzNQotfTsKLQotLyogWVlQR09UT1tOVEVSTS1OVU1dLiAgKi8KLXN0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXlwZ290b1tdID0KLXsKLSAgICAtMTM1LCAgLTEzNSwgICAxODcsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIC01MCwgIC0xMzUsICAtMTM1LAotICAgICAgOTgsICAgICAwLCAgIC01OSwgICAtMzcsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgLTc3LCAgLTEzNSwgIC0xMzUsCi0gICAgIC01NCwgICAtMzAsICAtMTM1LCAgIC05MCwgIC0xMzUsICAtMTM0LCAgLTEzNSwgIC0xMzUsICAgIDI0LCAgIC01OCwKLSAgICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIC0xOCwgIC0xMzUsICAtMTM1LCAgIDEwOSwgIC0xMzUsICAtMTM1LAotICAgICAgNDQsICAgIDg3LCAgICA4NCwgICAxNDgsICAtMTM1LCAgIDEwMiwgIC0xMzUsICAtMTM1LCAgLTEzNQotfTsKLQotLyogWVlUQUJMRVtZWVBBQ1RbU1RBVEUtTlVNXV0uICBXaGF0IHRvIGRvIGluIHN0YXRlIFNUQVRFLU5VTS4gIElmCi0gICBwb3NpdGl2ZSwgc2hpZnQgdGhhdCB0b2tlbi4gIElmIG5lZ2F0aXZlLCByZWR1Y2UgdGhlIHJ1bGUgd2hpY2gKLSAgIG51bWJlciBpcyB0aGUgb3Bwb3NpdGUuICBJZiB6ZXJvLCBkbyB3aGF0IFlZREVGQUNUIHNheXMuCi0gICBJZiBZWVRBQkxFX05JTkYsIHN5bnRheCBlcnJvci4gICovCi0jZGVmaW5lIFlZVEFCTEVfTklORiAtMTA5Ci1zdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5dGFibGVbXSA9Ci17Ci0gICAgICA4NiwgICAgNzEsICAgMTExLCAgICAzNywgICAxNzIsICAgIDEwLCAgICA4MywgICAgNjksICAgIDU4LCAgICA0OSwKLSAgICAgIDkyLCAgIDE1MiwgICAgODgsICAgMTY5LCAgICA3MywgICAgMjAsICAgIDk2LCAgIDE0MCwgICAgOTcsICAgMTQyLAotICAgICAgIDQsICAgMTQ0LCAgIDEzNywgICAgNTAsICAgIDI5LCAgICA1MiwgICAxMDQsICAgIDYxLCAgICAzMywgICAgNTAsCi0gICAgIDE1MywgICAgNTMsICAgMTExLCAgICA4OSwgICAxMTEsICAgIDc3LCAgIC05MywgICAxMjcsICAgIDk1LCAgICA4NSwKLSAgICAgMTU3LCAgIDEzMSwgICAgNTksICAgMTg1LCAgIDE3MywgICAgNTQsICAgIDU3LCAgICA5OSwgICAgNjIsICAgIDcxLAotICAgICAxNTksICAgIDY0LCAgIC05MywgICAxNDEsICAgMTYwLCAgICA2MiwgICAgODQsICAgMTA4LCAgICA2MywgICAgNjQsCi0gICAgICA1NCwgICAxMDAsICAgIDYwLCAgIDEwOSwgICAgNjQsICAgIDYzLCAgICA2NCwgICAxNDYsICAgIDczLCAgIDEwNywKLSAgICAgIDU0LCAgIDE3NiwgICAxMTEsICAgMTA4LCAgICA0NywgICAgNDgsICAgIDg0LCAgIDEwNSwgICAxMDYsICAgMTA5LAotICAgICAgNjQsICAgMTQ3LCAgIDE2MCwgICAxNjAsICAgMTEwLCAgIDE3NywgICAxNDEsICAgIDg3LCAgIDEzMSwgICAxNTcsCi0gICAgIDEwOCwgICAxMDIsICAgMTAzLCAgIDE3MywgICAgNzEsICAgIDkzLCAgIDEwOSwgICAgNjQsICAgMTAxLCAgIDE1OSwKLSAgICAgIDY0LCAgIDE3NCwgICAxNzUsICAgIDk0LCAgIDExOCwgICAxMjQsICAgMTMxLCAgICA3OCwgICAxMzYsICAgMTI1LAotICAgICAxMjYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgIDEzMSwgICAgMTUsCi0gICAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgIDExMCwKLSAgICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAxNDMsICAgMTQ4LCAgICAzMywgICAxMDUsICAgMTQ5LAotICAgICAgOTYsICAgMTUxLCAgIDE1MiwgICAtMjIsICAgMTUwLCAgIDE1NiwgICAxNjUsICAgIDM0LCAgIDE2MywgICAxNjQsCi0gICAgIC0yMiwgIC0xMDcsICAgMTY2LCAgIC0yMiwgICAtMjIsICAgMTE5LCAgIDE2NywgICAxNzEsICAgLTIyLCAgICAgNywKLSAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgMTgwLCAgICAxNSwgICAgMTYsICAgIDE3LAotICAgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgMTgxLCAgICAyNiwgICAgMjcsCi0gICAgICAyOCwgICAgMjksICAgIDMwLCAgIDE4MiwgICAxODMsICAgIDMzLCAgIDE4NiwgICAxODcsICAgICA1LCAgIDE3OSwKLSAgICAgMTIwLCAgIC0yMiwgICAxMjgsICAgMTcwLCAgIDEzOSwgICAgMzQsICAgMTQ1LCAgICA3MiwgICAtMjIsICAtMTA4LAotICAgICAgIDAsICAgLTIyLCAgIC0yMiwgICAxMzAsICAgICAwLCAgIDEzOCwgICAtMjIsICAgICA3LCAgICAgOCwgICAgIDksCi0gICAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgIDAsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKLSAgICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgIDAsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LAotICAgICAgMzAsICAgICAwLCAgICAgMCwgICAgMzMsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIC04NiwgICAgIDAsCi0gICAgIDE2OCwgICAgIDAsICAgICAwLCAgICAzNCwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwKLSAgICAgIDEzLCAgIC04NiwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLAotICAgICAgMjMsICAgIDI0LCAgICAgMCwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAgMCwgICAgIDAsCi0gICAgICAzMywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgLTg2LCAgICAgMCwgICAxODQsICAgICAwLCAgICAgMCwKLSAgICAgIDM0LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAtODYsICAgIDE1LAotICAgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgIDAsCi0gICAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgICAwLCAgICAgMCwgICAgMzMsICAgICAwLCAgICAgMCwKLSAgICAgICAwLCAgICAgMCwgICAtODYsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAzNCwgICAgIDAsICAgICAwLAotICAgICAgIDAsICAgICAwLCAgICAgNiwgICAgIDAsICAgICAwLCAgIC04NiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsCi0gICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwKLSAgICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLAotICAgICAgMzEsICAgIDMyLCAgICAzMywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIC0yMiwgICAgIDAsCi0gICAgICAgMCwgICAgIDAsICAgIDM0LCAgICAgMCwgICAgIDAsICAgLTIyLCAgICAgMCwgICAgIDAsICAgLTIyLCAgIC0yMiwKLSAgICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAgMCwgICAgMTUsICAgIDE2LAotICAgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAgMCwgICAgMjYsCi0gICAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgIDAsICAgICAwLCAgICAzMywgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDM0LCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAgIDAsICAgICAwLCAgICAgMCwgICAxMjIsICAgMTIzLCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsCi0gICAgICAxMiwgICAgMTMsICAgICAwLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwKLSAgICAgIDIyLCAgICAyMywgICAgMjQsICAgICAwLCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgICAwLAotICAgICAgIDAsICAgIDMzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTU3LCAgICAgMCwgICAgIDAsCi0gICAgICAgMCwgICAxNTgsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxNTksICAgIDY0LCAgICAgNywKLSAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgICAwLCAgICAxNSwgICAgMTYsICAgIDE3LAotICAgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgICAwLCAgICAyNiwgICAgMjcsCi0gICAgICAyOCwgICAgMjksICAgIDMwLCAgICAgMCwgICAgIDAsICAgIDMzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMTc4LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzQsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAotICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgIDAsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsCi0gICAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgIDAsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwKLSAgICAgICAwLCAgICAgMCwgICAgMzMsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAgIDAsICAgICAwLCAgICAzNAotfTsKLQotc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQxNiB5eWNoZWNrW10gPQotewotICAgICAgNTksICAgIDM4LCAgICA3OSwgICAgIDMsICAgICAxLCAgICAgOCwgICAgNTYsICAgIDM3LCAgICAyNiwgICAgMzcsCi0gICAgICA2NCwgICAgMzEsICAgICAxLCAgIDE0NywgICAgMzcsICAgIDE4LCAgICAzMCwgICAgIDEsICAgIDMyLCAgIDEwOSwKLSAgICAgICAwLCAgIDExMSwgICAgNDUsICAgIDUxLCAgICAyNywgICAgMjMsICAgIDc2LCAgICA0NCwgICAgMzEsICAgIDUxLAotICAgICAgNTAsICAgIDM3LCAgIDEwOSwgICAgNjMsICAgMTExLCAgICA1MywgICAgMzMsICAgIDkxLCAgICA2OCwgICAgNTcsCi0gICAgICAzNywgICAxMDAsICAgIDQ3LCAgIDE3NywgICAgNDEsICAgIDUxLCAgICAzNywgICAgMzMsICAgIDM3LCAgICA4NiwKLSAgICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDM3LCAgIDEzMSwgICAgMzcsICAgIDU2LCAgICA0MSwgICAgNDcsICAgIDQ4LAotICAgICAgNTEsICAgIDQ3LCAgICA0NywgICAgNDcsICAgIDQ4LCAgICA0NywgICAgNDgsICAgIDMzLCAgICAzNywgICAgMzcsCi0gICAgICA1MSwgICAgMzMsICAgMTQ5LCAgICA0MSwgICAgNDQsICAgIDQ1LCAgICA3NiwgICAgNDQsICAgIDQ1LCAgICA0NywKLSAgICAgIDQ4LCAgICA0NywgICAxNTksICAgMTYwLCAgICA1MiwgICAgNDcsICAgIDM3LCAgICAzNywgICAxNDcsICAgIDM3LAotICAgICAgNDEsICAgIDQ1LCAgICA0NiwgICAgNDEsICAgMTMxLCAgICA0NCwgICAgNDcsICAgIDQ4LCAgICA1MCwgICAgNDcsCi0gICAgICA0OCwgICAxNTksICAgMTYwLCAgICA0NiwgICAgNDUsICAgIDQ5LCAgIDE2NSwgICAgIDEsICAgIDM0LCAgICA0OSwKLSAgICAgIDQ5LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAxNzcsICAgIDEzLAotICAgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgNTIsCi0gICAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDM0LCAgICA0NCwgICAgMzEsICAgIDQ0LCAgICA0NiwKLSAgICAgIDMwLCAgICA0NCwgICAgMzEsICAgIDM3LCAgICA0OSwgICAgNDksICAgIDQ2LCAgICA0MSwgICAgNDksICAgIDM2LAotICAgICAgNDQsICAgIDQ1LCAgICA0OSwgICAgNDcsICAgIDQ4LCAgICAgMSwgICAgNDksICAgIDM0LCAgICA1MiwgICAgIDUsCi0gICAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICA0OSwgICAgMTMsICAgIDE0LCAgICAxNSwKLSAgICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICA0OSwgICAgMjQsICAgIDI1LAotICAgICAgMjYsICAgIDI3LCAgICAyOCwgICAgNDksICAgIDQ5LCAgICAzMSwgICAgNDksICAgIDQ5LCAgICAgMSwgICAxNjUsCi0gICAgICA4MSwgICAgMzcsICAgIDk0LCAgIDE0OSwgICAxMDcsICAgIDQxLCAgIDExMiwgICAgNDksICAgIDQ0LCAgICA0NSwKLSAgICAgIC0xLCAgICA0NywgICAgNDgsICAgICAxLCAgICAtMSwgICAxMDMsICAgIDUyLCAgICAgNSwgICAgIDYsICAgICA3LAotICAgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIC0xLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsCi0gICAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIC0xLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywKLSAgICAgIDI4LCAgICAtMSwgICAgLTEsICAgIDMxLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzYsICAgIC0xLAotICAgICAgIDEsICAgIC0xLCAgICAtMSwgICAgNDEsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsCi0gICAgICAxMSwgICAgNDksICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwKLSAgICAgIDIxLCAgICAyMiwgICAgLTEsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgLTEsICAgIC0xLAotICAgICAgMzEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzNiwgICAgLTEsICAgICAxLCAgICAtMSwgICAgLTEsCi0gICAgICA0MSwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDQ5LCAgICAxMywKLSAgICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIC0xLAotICAgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAtMSwgICAgLTEsICAgIDMxLCAgICAtMSwgICAgLTEsCi0gICAgICAtMSwgICAgLTEsICAgIDM2LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNDEsICAgIC0xLCAgICAtMSwKLSAgICAgIC0xLCAgICAtMSwgICAgIDEsICAgIC0xLCAgICAtMSwgICAgNDksICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LAotICAgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsCi0gICAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwKLSAgICAgIDI5LCAgICAzMCwgICAgMzEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzcsICAgIC0xLAotICAgICAgLTEsICAgIC0xLCAgICA0MSwgICAgLTEsICAgIC0xLCAgICA0NCwgICAgLTEsICAgIC0xLCAgICA0NywgICAgNDgsCi0gICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgLTEsICAgIDEzLCAgICAxNCwKLSAgICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgLTEsICAgIDI0LAotICAgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIC0xLCAgICAtMSwgICAgMzEsICAgIC0xLCAgICAtMSwgICAgLTEsCi0gICAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA0MSwgICAgLTEsICAgIC0xLCAgICAtMSwKLSAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQ4LCAgICA0OSwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LAotICAgICAgMTAsICAgIDExLCAgICAtMSwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksCi0gICAgICAyMCwgICAgMjEsICAgIDIyLCAgICAtMSwgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAtMSwKLSAgICAgIC0xLCAgICAzMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzNywgICAgLTEsICAgIC0xLAotICAgICAgLTEsICAgIDQxLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQ3LCAgICA0OCwgICAgIDUsCi0gICAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAtMSwgICAgMTMsICAgIDE0LCAgICAxNSwKLSAgICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAtMSwgICAgMjQsICAgIDI1LAotICAgICAgMjYsICAgIDI3LCAgICAyOCwgICAgLTEsICAgIC0xLCAgICAzMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCi0gICAgICAzNiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQxLCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwKLSAgICAgICA5LCAgICAxMCwgICAgMTEsICAgIC0xLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LAotICAgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIC0xLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsCi0gICAgICAtMSwgICAgLTEsICAgIDMxLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKLSAgICAgIC0xLCAgICAtMSwgICAgNDEKLX07Ci0KLS8qIFlZU1RPU1tTVEFURS1OVU1dIC0tIFRoZSAoaW50ZXJuYWwgbnVtYmVyIG9mIHRoZSkgYWNjZXNzaW5nCi0gICBzeW1ib2wgb2Ygc3RhdGUgU1RBVEUtTlVNLiAgKi8KLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlzdG9zW10gPQotewotICAgICAgIDAsICAgIDU0LCAgICA1NSwgICAgNTYsICAgICAwLCAgICA1NSwgICAgIDEsICAgICA1LCAgICAgNiwgICAgIDcsCi0gICAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywKLSAgICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LAotICAgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDQxLCAgICA1NywgICAgNjAsICAgIDY0LCAgICA2NSwgICAgNjYsCi0gICAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MywgICAgODQsICAgIDk5LCAgIDEwMSwgICAgNDQsICAgIDQ1LCAgICAzNywKLSAgICAgIDUxLCAgICA5NiwgICAgMjMsICAgIDM3LCAgICA1MSwgICAgODcsICAgIDU5LCAgICAzNywgICAgODcsICAgIDQ3LAotICAgICAgNDcsICAgIDQ0LCAgICAzNywgICAgNDcsICAgIDQ4LCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA3MCwgICAgNzQsCi0gICAgICA3NSwgICAgNjYsICAgIDk2LCAgICAzNywgICAgOTcsICAgIDk4LCAgICA1OCwgICAgODcsICAgICAxLCAgICA2NCwKLSAgICAgIDg4LCAgICA4OSwgICAgOTAsICAgIDYwLCAgICA2NCwgICAgODcsICAgIDY1LCAgICAzNywgICAgIDEsICAgIDc0LAotICAgICAgNzEsICAgIDcyLCAgICA3MywgICAgNDQsICAgIDQ2LCAgICA3NCwgICAgMzAsICAgIDMyLCAgIDEwMCwgICAgMzMsCi0gICAgICA0NywgICAgNTAsICAgIDQ1LCAgICA0NiwgICAgNjAsICAgIDQ0LCAgICA0NSwgICAgMzcsICAgIDQxLCAgICA0NywKLSAgICAgIDUyLCAgICA3MCwgICAgNzYsICAgIDc3LCAgICA5MSwgICAgOTIsICAgIDkzLCAgICA5NCwgICAgNDUsICAgICAxLAotICAgICAgOTAsICAgIDc0LCAgICA0OCwgICAgNDksICAgIDQ5LCAgICA0OSwgICAgNDksICAgIDczLCAgICA2MywgICAgOTUsCi0gICAgICAgMSwgICAgNjUsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICAzNCwgICAgNDUsICAgIDk4LCAgICA5NCwKLSAgICAgICAxLCAgICAzNywgICAgNzYsICAgIDM0LCAgICA3NiwgICAgOTUsICAgIDMzLCAgICA0NywgICAgNDQsICAgIDQ2LAotICAgICAgNDksICAgIDQ0LCAgICAzMSwgICAgNTAsICAgIDg1LCAgICA4NiwgICAgNDksICAgIDM3LCAgICA0MSwgICAgNDcsCi0gICAgICA3MCwgICAgODIsICAgIDgzLCAgICA0OSwgICAgMzYsICAgIDQ2LCAgICA0OSwgICAgNDksICAgICAxLCAgICA3OCwKLSAgICAgIDkzLCAgICAzNCwgICAgIDEsICAgIDQxLCAgICA4MiwgICAgODIsICAgIDMzLCAgICA0NywgICAgMzYsICAgIDgxLAotICAgICAgNDksICAgIDQ5LCAgICA0OSwgICAgNDksICAgICAxLCAgICA3OCwgICAgNDksICAgIDQ5Ci19OwotCi0jZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCi0jZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKLSNkZWZpbmUgWVlFTVBUWQkJKC0yKQotI2RlZmluZSBZWUVPRgkJMAotCi0jZGVmaW5lIFlZQUNDRVBUCWdvdG8geXlhY2NlcHRsYWIKLSNkZWZpbmUgWVlBQk9SVAkJZ290byB5eWFib3J0bGFiCi0jZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJvcmxhYgotCi0KLS8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLiAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkKLSAgIHRvIGVhc2UgdGhlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCi0gICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gICovCi0KLSNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCi0KLSNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQotCi0jZGVmaW5lIFlZQkFDS1VQKFRva2VuLCBWYWx1ZSkJCQkJCVwKLWRvCQkJCQkJCQlcCi0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCi0gICAgewkJCQkJCQkJXAotICAgICAgeXljaGFyID0gKFRva2VuKTsJCQkJCQlcCi0gICAgICB5eWx2YWwgPSAoVmFsdWUpOwkJCQkJCVwKLSAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAotICAgICAgWVlQT1BTVEFDSyAoMSk7CQkJCQkJXAotICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCi0gICAgfQkJCQkJCQkJXAotICBlbHNlCQkJCQkJCQlcCi0gICAgewkJCQkJCQkJXAotICAgICAgeXllcnJvciAoWVlfKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIikpOyBcCi0gICAgICBZWUVSUk9SOwkJCQkJCQlcCi0gICAgfQkJCQkJCQkJXAotd2hpbGUgKFlZSUQgKDApKQotCi0KLSNkZWZpbmUgWVlURVJST1IJMQotI2RlZmluZSBZWUVSUkNPREUJMjU2Ci0KLQotLyogWVlMTE9DX0RFRkFVTFQgLS0gU2V0IENVUlJFTlQgdG8gc3BhbiBmcm9tIFJIU1sxXSB0byBSSFNbTl0uCi0gICBJZiBOIGlzIDAsIHRoZW4gc2V0IENVUlJFTlQgdG8gdGhlIGVtcHR5IGxvY2F0aW9uIHdoaWNoIGVuZHMKLSAgIHRoZSBwcmV2aW91cyBzeW1ib2w6IFJIU1swXSAoYWx3YXlzIGRlZmluZWQpLiAgKi8KLQotI2RlZmluZSBZWVJIU0xPQyhSaHMsIEspICgoUmhzKVtLXSkKLSNpZm5kZWYgWVlMTE9DX0RFRkFVTFQKLSMgZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikJCQkJXAotICAgIGRvCQkJCQkJCQkJXAotICAgICAgaWYgKFlZSUQgKE4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JewkJCQkJCQkJXAotCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2xpbmU7CVwKLQkgIChDdXJyZW50KS5maXJzdF9jb2x1bW4gPSBZWVJIU0xPQyAoUmhzLCAxKS5maXJzdF9jb2x1bW47CVwKLQkgIChDdXJyZW50KS5sYXN0X2xpbmUgICAgPSBZWVJIU0xPQyAoUmhzLCBOKS5sYXN0X2xpbmU7CQlcCi0JICAoQ3VycmVudCkubGFzdF9jb2x1bW4gID0gWVlSSFNMT0MgKFJocywgTikubGFzdF9jb2x1bW47CVwKLQl9CQkJCQkJCQlcCi0gICAgICBlbHNlCQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IChDdXJyZW50KS5sYXN0X2xpbmUgICA9CQlcCi0JICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfbGluZTsJCQkJXAotCSAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IChDdXJyZW50KS5sYXN0X2NvbHVtbiA9CQlcCi0JICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfY29sdW1uOwkJCQlcCi0JfQkJCQkJCQkJXAotICAgIHdoaWxlIChZWUlEICgwKSkKLSNlbmRpZgotCi0KLS8qIFlZX0xPQ0FUSU9OX1BSSU5UIC0tIFByaW50IHRoZSBsb2NhdGlvbiBvbiB0aGUgc3RyZWFtLgotICAgVGhpcyBtYWNybyB3YXMgbm90IG1hbmRhdGVkIG9yaWdpbmFsbHk6IGRlZmluZSBvbmx5IGlmIHdlIGtub3cKLSAgIHdlIHdvbid0IGJyZWFrIHVzZXIgY29kZTogd2hlbiB0aGVzZSBhcmUgdGhlIGxvY2F0aW9ucyB3ZSBrbm93LiAgKi8KLQotI2lmbmRlZiBZWV9MT0NBVElPTl9QUklOVAotIyBpZiBZWUxUWVBFX0lTX1RSSVZJQUwKLSMgIGRlZmluZSBZWV9MT0NBVElPTl9QUklOVChGaWxlLCBMb2MpCQkJXAotICAgICBmcHJpbnRmIChGaWxlLCAiJWQuJWQtJWQuJWQiLAkJCVwKLQkgICAgICAoTG9jKS5maXJzdF9saW5lLCAoTG9jKS5maXJzdF9jb2x1bW4sCVwKLQkgICAgICAoTG9jKS5sYXN0X2xpbmUsICAoTG9jKS5sYXN0X2NvbHVtbikKLSMgZWxzZQotIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykgKCh2b2lkKSAwKQotIyBlbmRpZgotI2VuZGlmCi0KLQotLyogWVlMRVggLS0gY2FsbGluZyBgeXlsZXgnIHdpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cy4gICovCi0KLSNpZmRlZiBZWUxFWF9QQVJBTQotIyBkZWZpbmUgWVlMRVggeXlsZXggKFlZTEVYX1BBUkFNKQotI2Vsc2UKLSMgZGVmaW5lIFlZTEVYIHl5bGV4ICgpCi0jZW5kaWYKLQotLyogRW5hYmxlIGRlYnVnZ2luZyBpZiByZXF1ZXN0ZWQuICAqLwotI2lmIFlZREVCVUcKLQotIyBpZm5kZWYgWVlGUFJJTlRGCi0jICBpbmNsdWRlIDxzdGRpby5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICBkZWZpbmUgWVlGUFJJTlRGIGZwcmludGYKLSMgZW5kaWYKLQotIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCQkJXAotZG8gewkJCQkJCVwKLSAgaWYgKHl5ZGVidWcpCQkJCQlcCi0gICAgWVlGUFJJTlRGIEFyZ3M7CQkJCVwKLX0gd2hpbGUgKFlZSUQgKDApKQotCi0jIGRlZmluZSBZWV9TWU1CT0xfUFJJTlQoVGl0bGUsIFR5cGUsIFZhbHVlLCBMb2NhdGlvbikJCQkgIFwKLWRvIHsJCQkJCQkJCQkgIFwKLSAgaWYgKHl5ZGVidWcpCQkJCQkJCQkgIFwKLSAgICB7CQkJCQkJCQkJICBcCi0gICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIFRpdGxlKTsJCQkJCSAgXAotICAgICAgeXlfc3ltYm9sX3ByaW50IChzdGRlcnIsCQkJCQkJICBcCi0JCSAgVHlwZSwgVmFsdWUpOyBcCi0gICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CQkJCQkJICBcCi0gICAgfQkJCQkJCQkJCSAgXAotfSB3aGlsZSAoWVlJRCAoMCkpCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLXwgUHJpbnQgdGhpcyBzeW1ib2wgb24gWVlPVVRQVVQuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKkFSR1NVU0VEKi8KLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi1zdGF0aWMgdm9pZAoteXlfc3ltYm9sX3ZhbHVlX3ByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwKQotI2Vsc2UKLXN0YXRpYyB2b2lkCi15eV9zeW1ib2xfdmFsdWVfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwKQotICAgIEZJTEUgKnl5b3V0cHV0OwotICAgIGludCB5eXR5cGU7Ci0gICAgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwOwotI2VuZGlmCi17Ci0gIGlmICgheXl2YWx1ZXApCi0gICAgcmV0dXJuOwotIyBpZmRlZiBZWVBSSU5UCi0gIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCi0gICAgWVlQUklOVCAoeXlvdXRwdXQsIHl5dG9rbnVtW3l5dHlwZV0sICp5eXZhbHVlcCk7Ci0jIGVsc2UKLSAgWVlVU0UgKHl5b3V0cHV0KTsKLSMgZW5kaWYKLSAgc3dpdGNoICh5eXR5cGUpCi0gICAgewotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICB9Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLXwgUHJpbnQgdGhpcyBzeW1ib2wgb24gWVlPVVRQVVQuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotc3RhdGljIHZvaWQKLXl5X3N5bWJvbF9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCkKLSNlbHNlCi1zdGF0aWMgdm9pZAoteXlfc3ltYm9sX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKLSAgICBGSUxFICp5eW91dHB1dDsKLSAgICBpbnQgeXl0eXBlOwotICAgIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcDsKLSNlbmRpZgotewotICBpZiAoeXl0eXBlIDwgWVlOVE9LRU5TKQotICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJ0b2tlbiAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKLSAgZWxzZQotICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJudGVybSAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKLQotICB5eV9zeW1ib2xfdmFsdWVfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwKTsKLSAgWVlGUFJJTlRGICh5eW91dHB1dCwgIikiKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5X3N0YWNrX3ByaW50IC0tIFByaW50IHRoZSBzdGF0ZSBzdGFjayBmcm9tIGl0cyBCT1RUT00gdXAgdG8gaXRzIHwKLXwgVE9QIChpbmNsdWRlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi1zdGF0aWMgdm9pZAoteXlfc3RhY2tfcHJpbnQgKHl5dHlwZV9pbnQxNiAqeXlib3R0b20sIHl5dHlwZV9pbnQxNiAqeXl0b3ApCi0jZWxzZQotc3RhdGljIHZvaWQKLXl5X3N0YWNrX3ByaW50ICh5eWJvdHRvbSwgeXl0b3ApCi0gICAgeXl0eXBlX2ludDE2ICp5eWJvdHRvbTsKLSAgICB5eXR5cGVfaW50MTYgKnl5dG9wOwotI2VuZGlmCi17Ci0gIFlZRlBSSU5URiAoc3RkZXJyLCAiU3RhY2sgbm93Iik7Ci0gIGZvciAoOyB5eWJvdHRvbSA8PSB5eXRvcDsgeXlib3R0b20rKykKLSAgICB7Ci0gICAgICBpbnQgeXlib3QgPSAqeXlib3R0b207Ci0gICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsIHl5Ym90KTsKLSAgICB9Ci0gIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCQkJCVwKLWRvIHsJCQkJCQkJCVwKLSAgaWYgKHl5ZGVidWcpCQkJCQkJCVwKLSAgICB5eV9zdGFja19wcmludCAoKEJvdHRvbSksIChUb3ApKTsJCQkJXAotfSB3aGlsZSAoWVlJRCAoMCkpCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IFJlcG9ydCB0aGF0IHRoZSBZWVJVTEUgaXMgZ29pbmcgdG8gYmUgcmVkdWNlZC4gIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotc3RhdGljIHZvaWQKLXl5X3JlZHVjZV9wcmludCAoWVlTVFlQRSAqeXl2c3AsIGludCB5eXJ1bGUpCi0jZWxzZQotc3RhdGljIHZvaWQKLXl5X3JlZHVjZV9wcmludCAoeXl2c3AsIHl5cnVsZSkKLSAgICBZWVNUWVBFICp5eXZzcDsKLSAgICBpbnQgeXlydWxlOwotI2VuZGlmCi17Ci0gIGludCB5eW5yaHMgPSB5eXIyW3l5cnVsZV07Ci0gIGludCB5eWk7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHl5bG5vID0geXlybGluZVt5eXJ1bGVdOwotICBZWUZQUklOVEYgKHN0ZGVyciwgIlJlZHVjaW5nIHN0YWNrIGJ5IHJ1bGUgJWQgKGxpbmUgJWx1KTpcbiIsCi0JICAgICB5eXJ1bGUgLSAxLCB5eWxubyk7Ci0gIC8qIFRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQuICAqLwotICBmb3IgKHl5aSA9IDA7IHl5aSA8IHl5bnJoczsgeXlpKyspCi0gICAgewotICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgICAkJWQgPSAiLCB5eWkgKyAxKTsKLSAgICAgIHl5X3N5bWJvbF9wcmludCAoc3RkZXJyLCB5eXJoc1t5eXByaHNbeXlydWxlXSArIHl5aV0sCi0JCSAgICAgICAmKHl5dnNwWyh5eWkgKyAxKSAtICh5eW5yaHMpXSkKLQkJICAgICAgIAkJICAgICAgICk7Ci0gICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotfQotCi0jIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkJCVwKLWRvIHsJCQkJCVwKLSAgaWYgKHl5ZGVidWcpCQkJCVwKLSAgICB5eV9yZWR1Y2VfcHJpbnQgKHl5dnNwLCBSdWxlKTsgXAotfSB3aGlsZSAoWVlJRCAoMCkpCi0KLS8qIE5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UuICBJdCBpcyBsZWZ0IHVuaW5pdGlhbGl6ZWQgc28gdGhhdAotICAgbXVsdGlwbGUgcGFyc2VycyBjYW4gY29leGlzdC4gICovCi1pbnQgeXlkZWJ1ZzsKLSNlbHNlIC8qICFZWURFQlVHICovCi0jIGRlZmluZSBZWURQUklOVEYoQXJncykKLSMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQotIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCi0jIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkKLSNlbmRpZiAvKiAhWVlERUJVRyAqLwotCi0KLS8qIFlZSU5JVERFUFRIIC0tIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzLiAgKi8KLSNpZm5kZWYJWVlJTklUREVQVEgKLSMgZGVmaW5lIFlZSU5JVERFUFRIIDIwMAotI2VuZGlmCi0KLS8qIFlZTUFYREVQVEggLS0gbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8gKGVmZmVjdGl2ZSBvbmx5Ci0gICBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4KLQotICAgRG8gbm90IG1ha2UgdGhpcyB2YWx1ZSB0b28gbGFyZ2U7IHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgaWYKLSAgIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSA8IFlZU1RBQ0tfQllURVMgKFlZTUFYREVQVEgpCi0gICBldmFsdWF0ZWQgd2l0aCBpbmZpbml0ZS1wcmVjaXNpb24gaW50ZWdlciBhcml0aG1ldGljLiAgKi8KLQotI2lmbmRlZiBZWU1BWERFUFRICi0jIGRlZmluZSBZWU1BWERFUFRIIDEwMDAwCi0jZW5kaWYKLQotDAotCi0jaWYgWVlFUlJPUl9WRVJCT1NFCi0KLSMgaWZuZGVmIHl5c3RybGVuCi0jICBpZiBkZWZpbmVkIF9fR0xJQkNfXyAmJiBkZWZpbmVkIF9TVFJJTkdfSAotIyAgIGRlZmluZSB5eXN0cmxlbiBzdHJsZW4KLSMgIGVsc2UKLS8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIFlZU1RSLiAgKi8KLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi1zdGF0aWMgWVlTSVpFX1QKLXl5c3RybGVuIChjb25zdCBjaGFyICp5eXN0cikKLSNlbHNlCi1zdGF0aWMgWVlTSVpFX1QKLXl5c3RybGVuICh5eXN0cikKLSAgICBjb25zdCBjaGFyICp5eXN0cjsKLSNlbmRpZgotewotICBZWVNJWkVfVCB5eWxlbjsKLSAgZm9yICh5eWxlbiA9IDA7IHl5c3RyW3l5bGVuXTsgeXlsZW4rKykKLSAgICBjb250aW51ZTsKLSAgcmV0dXJuIHl5bGVuOwotfQotIyAgZW5kaWYKLSMgZW5kaWYKLQotIyBpZm5kZWYgeXlzdHBjcHkKLSMgIGlmIGRlZmluZWQgX19HTElCQ19fICYmIGRlZmluZWQgX1NUUklOR19IICYmIGRlZmluZWQgX0dOVV9TT1VSQ0UKLSMgICBkZWZpbmUgeXlzdHBjcHkgc3RwY3B5Ci0jICBlbHNlCi0vKiBDb3B5IFlZU1JDIHRvIFlZREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyAnXDAnIGluCi0gICBZWURFU1QuICAqLwotI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLXN0YXRpYyBjaGFyICoKLXl5c3RwY3B5IChjaGFyICp5eWRlc3QsIGNvbnN0IGNoYXIgKnl5c3JjKQotI2Vsc2UKLXN0YXRpYyBjaGFyICoKLXl5c3RwY3B5ICh5eWRlc3QsIHl5c3JjKQotICAgIGNoYXIgKnl5ZGVzdDsKLSAgICBjb25zdCBjaGFyICp5eXNyYzsKLSNlbmRpZgotewotICBjaGFyICp5eWQgPSB5eWRlc3Q7Ci0gIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3JjOwotCi0gIHdoaWxlICgoKnl5ZCsrID0gKnl5cysrKSAhPSAnXDAnKQotICAgIGNvbnRpbnVlOwotCi0gIHJldHVybiB5eWQgLSAxOwotfQotIyAgZW5kaWYKLSMgZW5kaWYKLQotIyBpZm5kZWYgeXl0bmFtZXJyCi0vKiBDb3B5IHRvIFlZUkVTIHRoZSBjb250ZW50cyBvZiBZWVNUUiBhZnRlciBzdHJpcHBpbmcgYXdheSB1bm5lY2Vzc2FyeQotICAgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcywgc28gdGhhdCBpdCdzIHN1aXRhYmxlIGZvciB5eWVycm9yLiAgVGhlCi0gICBoZXVyaXN0aWMgaXMgdGhhdCBkb3VibGUtcXVvdGluZyBpcyB1bm5lY2Vzc2FyeSB1bmxlc3MgdGhlIHN0cmluZwotICAgY29udGFpbnMgYW4gYXBvc3Ryb3BoZSwgYSBjb21tYSwgb3IgYmFja3NsYXNoIChvdGhlciB0aGFuCi0gICBiYWNrc2xhc2gtYmFja3NsYXNoKS4gIFlZU1RSIGlzIHRha2VuIGZyb20geXl0bmFtZS4gIElmIFlZUkVTIGlzCi0gICBudWxsLCBkbyBub3QgY29weTsgaW5zdGVhZCwgcmV0dXJuIHRoZSBsZW5ndGggb2Ygd2hhdCB0aGUgcmVzdWx0Ci0gICB3b3VsZCBoYXZlIGJlZW4uICAqLwotc3RhdGljIFlZU0laRV9UCi15eXRuYW1lcnIgKGNoYXIgKnl5cmVzLCBjb25zdCBjaGFyICp5eXN0cikKLXsKLSAgaWYgKCp5eXN0ciA9PSAnIicpCi0gICAgewotICAgICAgWVlTSVpFX1QgeXluID0gMDsKLSAgICAgIGNoYXIgY29uc3QgKnl5cCA9IHl5c3RyOwotCi0gICAgICBmb3IgKDs7KQotCXN3aXRjaCAoKisreXlwKQotCSAgewotCSAgY2FzZSAnXCcnOgotCSAgY2FzZSAnLCc6Ci0JICAgIGdvdG8gZG9fbm90X3N0cmlwX3F1b3RlczsKLQotCSAgY2FzZSAnXFwnOgotCSAgICBpZiAoKisreXlwICE9ICdcXCcpCi0JICAgICAgZ290byBkb19ub3Rfc3RyaXBfcXVvdGVzOwotCSAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgZGVmYXVsdDoKLQkgICAgaWYgKHl5cmVzKQotCSAgICAgIHl5cmVzW3l5bl0gPSAqeXlwOwotCSAgICB5eW4rKzsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgJyInOgotCSAgICBpZiAoeXlyZXMpCi0JICAgICAgeXlyZXNbeXluXSA9ICdcMCc7Ci0JICAgIHJldHVybiB5eW47Ci0JICB9Ci0gICAgZG9fbm90X3N0cmlwX3F1b3RlczogOwotICAgIH0KLQotICBpZiAoISB5eXJlcykKLSAgICByZXR1cm4geXlzdHJsZW4gKHl5c3RyKTsKLQotICByZXR1cm4geXlzdHBjcHkgKHl5cmVzLCB5eXN0cikgLSB5eXJlczsKLX0KLSMgZW5kaWYKLQotLyogQ29weSBpbnRvIFlZUkVTVUxUIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIHVuZXhwZWN0ZWQgdG9rZW4KLSAgIFlZQ0hBUiB3aGlsZSBpbiBzdGF0ZSBZWVNUQVRFLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLAotICAgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUuICBJZiBZWVJFU1VMVCBpcyBudWxsLCBkbyBub3QKLSAgIGNvcHkgYW55dGhpbmc7IGp1c3QgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZQotICAgY29waWVkLiAgQXMgYSBzcGVjaWFsIGNhc2UsIHJldHVybiAwIGlmIGFuIG9yZGluYXJ5ICJzeW50YXggZXJyb3IiCi0gICBtZXNzYWdlIHdpbGwgZG8uICBSZXR1cm4gWVlTSVpFX01BWElNVU0gaWYgb3ZlcmZsb3cgb2NjdXJzIGR1cmluZwotICAgc2l6ZSBjYWxjdWxhdGlvbi4gICovCi1zdGF0aWMgWVlTSVpFX1QKLXl5c3ludGF4X2Vycm9yIChjaGFyICp5eXJlc3VsdCwgaW50IHl5c3RhdGUsIGludCB5eWNoYXIpCi17Ci0gIGludCB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0KLSAgaWYgKCEgKFlZUEFDVF9OSU5GIDwgeXluICYmIHl5biA8PSBZWUxBU1QpKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgewotICAgICAgaW50IHl5dHlwZSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwotICAgICAgWVlTSVpFX1QgeXlzaXplMCA9IHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXR5cGVdKTsKLSAgICAgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c2l6ZTA7Ci0gICAgICBZWVNJWkVfVCB5eXNpemUxOwotICAgICAgaW50IHl5c2l6ZV9vdmVyZmxvdyA9IDA7Ci0gICAgICBlbnVtIHsgWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSA9IDUgfTsKLSAgICAgIGNoYXIgY29uc3QgKnl5YXJnW1lZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU1dOwotICAgICAgaW50IHl5eDsKLQotIyBpZiAwCi0gICAgICAvKiBUaGlzIGlzIHNvIHhnZXR0ZXh0IHNlZXMgdGhlIHRyYW5zbGF0YWJsZSBmb3JtYXRzIHRoYXQgYXJlCi0JIGNvbnN0cnVjdGVkIG9uIHRoZSBmbHkuICAqLwotICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMiKTsKLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMiKTsKLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMiKTsKLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMiKTsKLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMgb3IgJXMiKTsKLSMgZW5kaWYKLSAgICAgIGNoYXIgKnl5Zm10OwotICAgICAgY2hhciBjb25zdCAqeXlmOwotICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXl1bmV4cGVjdGVkW10gPSAic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIjsKLSAgICAgIHN0YXRpYyBjaGFyIGNvbnN0IHl5ZXhwZWN0aW5nW10gPSAiLCBleHBlY3RpbmcgJXMiOwotICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXlvcltdID0gIiBvciAlcyI7Ci0gICAgICBjaGFyIHl5Zm9ybWF0W3NpemVvZiB5eXVuZXhwZWN0ZWQKLQkJICAgICsgc2l6ZW9mIHl5ZXhwZWN0aW5nIC0gMQotCQkgICAgKyAoKFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0gLSAyKQotCQkgICAgICAgKiAoc2l6ZW9mIHl5b3IgLSAxKSldOwotICAgICAgY2hhciBjb25zdCAqeXlwcmVmaXggPSB5eWV4cGVjdGluZzsKLQotICAgICAgLyogU3RhcnQgWVlYIGF0IC1ZWU4gaWYgbmVnYXRpdmUgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbgotCSBZWUNIRUNLLiAgKi8KLSAgICAgIGludCB5eXhiZWdpbiA9IHl5biA8IDAgPyAteXluIDogMDsKLQotICAgICAgLyogU3RheSB3aXRoaW4gYm91bmRzIG9mIGJvdGggeXljaGVjayBhbmQgeXl0bmFtZS4gICovCi0gICAgICBpbnQgeXljaGVja2xpbSA9IFlZTEFTVCAtIHl5biArIDE7Ci0gICAgICBpbnQgeXl4ZW5kID0geXljaGVja2xpbSA8IFlZTlRPS0VOUyA/IHl5Y2hlY2tsaW0gOiBZWU5UT0tFTlM7Ci0gICAgICBpbnQgeXljb3VudCA9IDE7Ci0KLSAgICAgIHl5YXJnWzBdID0geXl0bmFtZVt5eXR5cGVdOwotICAgICAgeXlmbXQgPSB5eXN0cGNweSAoeXlmb3JtYXQsIHl5dW5leHBlY3RlZCk7Ci0KLSAgICAgIGZvciAoeXl4ID0geXl4YmVnaW47IHl5eCA8IHl5eGVuZDsgKyt5eXgpCi0JaWYgKHl5Y2hlY2tbeXl4ICsgeXluXSA9PSB5eXggJiYgeXl4ICE9IFlZVEVSUk9SKQotCSAgewotCSAgICBpZiAoeXljb3VudCA9PSBZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNKQotCSAgICAgIHsKLQkJeXljb3VudCA9IDE7Ci0JCXl5c2l6ZSA9IHl5c2l6ZTA7Ci0JCXl5Zm9ybWF0W3NpemVvZiB5eXVuZXhwZWN0ZWQgLSAxXSA9ICdcMCc7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgeXlhcmdbeXljb3VudCsrXSA9IHl5dG5hbWVbeXl4XTsKLQkgICAgeXlzaXplMSA9IHl5c2l6ZSArIHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXhdKTsKLQkgICAgeXlzaXplX292ZXJmbG93IHw9ICh5eXNpemUxIDwgeXlzaXplKTsKLQkgICAgeXlzaXplID0geXlzaXplMTsKLQkgICAgeXlmbXQgPSB5eXN0cGNweSAoeXlmbXQsIHl5cHJlZml4KTsKLQkgICAgeXlwcmVmaXggPSB5eW9yOwotCSAgfQotCi0gICAgICB5eWYgPSBZWV8oeXlmb3JtYXQpOwotICAgICAgeXlzaXplMSA9IHl5c2l6ZSArIHl5c3RybGVuICh5eWYpOwotICAgICAgeXlzaXplX292ZXJmbG93IHw9ICh5eXNpemUxIDwgeXlzaXplKTsKLSAgICAgIHl5c2l6ZSA9IHl5c2l6ZTE7Ci0KLSAgICAgIGlmICh5eXNpemVfb3ZlcmZsb3cpCi0JcmV0dXJuIFlZU0laRV9NQVhJTVVNOwotCi0gICAgICBpZiAoeXlyZXN1bHQpCi0JewotCSAgLyogQXZvaWQgc3ByaW50ZiwgYXMgdGhhdCBpbmZyaW5nZXMgb24gdGhlIHVzZXIncyBuYW1lIHNwYWNlLgotCSAgICAgRG9uJ3QgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgZXZlbiBpZiB0aGUgdHJhbnNsYXRpb24KLQkgICAgIHByb2R1Y2VkIGEgc3RyaW5nIHdpdGggdGhlIHdyb25nIG51bWJlciBvZiAiJXMicy4gICovCi0JICBjaGFyICp5eXAgPSB5eXJlc3VsdDsKLQkgIGludCB5eWkgPSAwOwotCSAgd2hpbGUgKCgqeXlwID0gKnl5ZikgIT0gJ1wwJykKLQkgICAgewotCSAgICAgIGlmICgqeXlwID09ICclJyAmJiB5eWZbMV0gPT0gJ3MnICYmIHl5aSA8IHl5Y291bnQpCi0JCXsKLQkJICB5eXAgKz0geXl0bmFtZXJyICh5eXAsIHl5YXJnW3l5aSsrXSk7Ci0JCSAgeXlmICs9IDI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB5eXArKzsKLQkJICB5eWYrKzsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIHl5c2l6ZTsKLSAgICB9Ci19Ci0jZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCi0MCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IFJlbGVhc2UgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIHRoaXMgc3ltYm9sLiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLypBUkdTVVNFRCovCi0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotc3RhdGljIHZvaWQKLXl5ZGVzdHJ1Y3QgKGNvbnN0IGNoYXIgKnl5bXNnLCBpbnQgeXl0eXBlLCBZWVNUWVBFICp5eXZhbHVlcCkKLSNlbHNlCi1zdGF0aWMgdm9pZAoteXlkZXN0cnVjdCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXApCi0gICAgY29uc3QgY2hhciAqeXltc2c7Ci0gICAgaW50IHl5dHlwZTsKLSAgICBZWVNUWVBFICp5eXZhbHVlcDsKLSNlbmRpZgotewotICBZWVVTRSAoeXl2YWx1ZXApOwotCi0gIGlmICgheXltc2cpCi0gICAgeXltc2cgPSAiRGVsZXRpbmciOwotICBZWV9TWU1CT0xfUFJJTlQgKHl5bXNnLCB5eXR5cGUsIHl5dmFsdWVwLCB5eWxvY2F0aW9ucCk7Ci0KLSAgc3dpdGNoICh5eXR5cGUpCi0gICAgewotCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgIH0KLX0KLQotLyogUHJldmVudCB3YXJuaW5ncyBmcm9tIC1XbWlzc2luZy1wcm90b3R5cGVzLiAgKi8KLSNpZmRlZiBZWVBBUlNFX1BBUkFNCi0jaWYgZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCi1pbnQgeXlwYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSk7Ci0jZWxzZQotaW50IHl5cGFyc2UgKCk7Ci0jZW5kaWYKLSNlbHNlIC8qICEgWVlQQVJTRV9QQVJBTSAqLwotI2lmIGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cwotaW50IHl5cGFyc2UgKHZvaWQpOwotI2Vsc2UKLWludCB5eXBhcnNlICgpOwotI2VuZGlmCi0jZW5kaWYgLyogISBZWVBBUlNFX1BBUkFNICovCi0KLQotLyogVGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLwotaW50IHl5Y2hhcjsKLQotLyogVGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8KLVlZU1RZUEUgeXlsdmFsOwotCi0vKiBOdW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzbyBmYXIuICAqLwotaW50IHl5bmVycnM7Ci0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5cGFyc2Ugb3IgeXlwdXNoX3BhcnNlLiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgWVlQQVJTRV9QQVJBTQotI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLWludAoteXlwYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSkKLSNlbHNlCi1pbnQKLXl5cGFyc2UgKFlZUEFSU0VfUEFSQU0pCi0gICAgdm9pZCAqWVlQQVJTRV9QQVJBTTsKLSNlbmRpZgotI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCi0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotaW50Ci15eXBhcnNlICh2b2lkKQotI2Vsc2UKLWludAoteXlwYXJzZSAoKQotCi0jZW5kaWYKLSNlbmRpZgotewotCi0KLSAgICBpbnQgeXlzdGF0ZTsKLSAgICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KLSAgICBpbnQgeXllcnJzdGF0dXM7Ci0KLSAgICAvKiBUaGUgc3RhY2tzIGFuZCB0aGVpciB0b29sczoKLSAgICAgICBgeXlzcyc6IHJlbGF0ZWQgdG8gc3RhdGVzLgotICAgICAgIGB5eXZzJzogcmVsYXRlZCB0byBzZW1hbnRpYyB2YWx1ZXMuCi0KLSAgICAgICBSZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMsIHRvIGFsbG93IHl5b3ZlcmZsb3cKLSAgICAgICB0byByZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlLiAgKi8KLQotICAgIC8qIFRoZSBzdGF0ZSBzdGFjay4gICovCi0gICAgeXl0eXBlX2ludDE2IHl5c3NhW1lZSU5JVERFUFRIXTsKLSAgICB5eXR5cGVfaW50MTYgKnl5c3M7Ci0gICAgeXl0eXBlX2ludDE2ICp5eXNzcDsKLQotICAgIC8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjay4gICovCi0gICAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07Ci0gICAgWVlTVFlQRSAqeXl2czsKLSAgICBZWVNUWVBFICp5eXZzcDsKLQotICAgIFlZU0laRV9UIHl5c3RhY2tzaXplOwotCi0gIGludCB5eW47Ci0gIGludCB5eXJlc3VsdDsKLSAgLyogTG9va2FoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIuICAqLwotICBpbnQgeXl0b2tlbjsKLSAgLyogVGhlIHZhcmlhYmxlcyB1c2VkIHRvIHJldHVybiBzZW1hbnRpYyB2YWx1ZSBhbmQgbG9jYXRpb24gZnJvbSB0aGUKLSAgICAgYWN0aW9uIHJvdXRpbmVzLiAgKi8KLSAgWVlTVFlQRSB5eXZhbDsKLQotI2lmIFlZRVJST1JfVkVSQk9TRQotICAvKiBCdWZmZXIgZm9yIGVycm9yIG1lc3NhZ2VzLCBhbmQgaXRzIGFsbG9jYXRlZCBzaXplLiAgKi8KLSAgY2hhciB5eW1zZ2J1ZlsxMjhdOwotICBjaGFyICp5eW1zZyA9IHl5bXNnYnVmOwotICBZWVNJWkVfVCB5eW1zZ19hbGxvYyA9IHNpemVvZiB5eW1zZ2J1ZjsKLSNlbmRpZgotCi0jZGVmaW5lIFlZUE9QU1RBQ0soTikgICAoeXl2c3AgLT0gKE4pLCB5eXNzcCAtPSAoTikpCi0KLSAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIG9uIHRoZSBSSFMgb2YgdGhlIHJlZHVjZWQgcnVsZS4KLSAgICAgS2VlcCB0byB6ZXJvIHdoZW4gbm8gc3ltYm9sIHNob3VsZCBiZSBwb3BwZWQuICAqLwotICBpbnQgeXlsZW4gPSAwOwotCi0gIHl5dG9rZW4gPSAwOwotICB5eXNzID0geXlzc2E7Ci0gIHl5dnMgPSB5eXZzYTsKLSAgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKLQotICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFydGluZyBwYXJzZVxuIikpOwotCi0gIHl5c3RhdGUgPSAwOwotICB5eWVycnN0YXR1cyA9IDA7Ci0gIHl5bmVycnMgPSAwOwotICB5eWNoYXIgPSBZWUVNUFRZOyAvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLwotCi0gIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCi0gICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjawotICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCi0gICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KLSAgeXlzc3AgPSB5eXNzOwotICB5eXZzcCA9IHl5dnM7Ci0KLSAgZ290byB5eXNldHN0YXRlOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLXwgeXluZXdzdGF0ZSAtLSBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiB5eXN0YXRlLiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0geXluZXdzdGF0ZToKLSAgLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKLSAgICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiAgU28gcHVzaGluZyBhIHN0YXRlIGhlcmUgZXZlbnMgdGhlIHN0YWNrcy4gICovCi0gIHl5c3NwKys7Ci0KLSB5eXNldHN0YXRlOgotICAqeXlzc3AgPSB5eXN0YXRlOwotCi0gIGlmICh5eXNzICsgeXlzdGFja3NpemUgLSAxIDw9IHl5c3NwKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgY3VycmVudCB1c2VkIHNpemUgb2YgdGhlIHRocmVlIHN0YWNrcywgaW4gZWxlbWVudHMuICAqLwotICAgICAgWVlTSVpFX1QgeXlzaXplID0geXlzc3AgLSB5eXNzICsgMTsKLQotI2lmZGVmIHl5b3ZlcmZsb3cKLSAgICAgIHsKLQkvKiBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gcmVhbGxvY2F0ZSB0aGUgc3RhY2suICBVc2UgY29waWVzIG9mCi0JICAgdGhlc2Ugc28gdGhhdCB0aGUgJidzIGRvbid0IGZvcmNlIHRoZSByZWFsIG9uZXMgaW50bwotCSAgIG1lbW9yeS4gICovCi0JWVlTVFlQRSAqeXl2czEgPSB5eXZzOwotCXl5dHlwZV9pbnQxNiAqeXlzczEgPSB5eXNzOwotCi0JLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YgdGhlCi0JICAgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICBUaGlzIHVzZWQgdG8gYmUgYQotCSAgIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywgYnV0IHRoYXQgbWlnaHQKLQkgICBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KLQl5eW92ZXJmbG93IChZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSwKLQkJICAgICZ5eXNzMSwgeXlzaXplICogc2l6ZW9mICgqeXlzc3ApLAotCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0JCSAgICAmeXlzdGFja3NpemUpOwotCi0JeXlzcyA9IHl5c3MxOwotCXl5dnMgPSB5eXZzMTsKLSAgICAgIH0KLSNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLSMgaWZuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKLSAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7Ci0jIGVsc2UKLSAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLwotICAgICAgaWYgKFlZTUFYREVQVEggPD0geXlzdGFja3NpemUpCi0JZ290byB5eWV4aGF1c3RlZGxhYjsKLSAgICAgIHl5c3RhY2tzaXplICo9IDI7Ci0gICAgICBpZiAoWVlNQVhERVBUSCA8IHl5c3RhY2tzaXplKQotCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKLQotICAgICAgewotCXl5dHlwZV9pbnQxNiAqeXlzczEgPSB5eXNzOwotCXVuaW9uIHl5YWxsb2MgKnl5cHRyID0KLQkgICh1bmlvbiB5eWFsbG9jICopIFlZU1RBQ0tfQUxMT0MgKFlZU1RBQ0tfQllURVMgKHl5c3RhY2tzaXplKSk7Ci0JaWYgKCEgeXlwdHIpCi0JICBnb3RvIHl5ZXhoYXVzdGVkbGFiOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5c3NfYWxsb2MsIHl5c3MpOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5dnNfYWxsb2MsIHl5dnMpOwotIyAgdW5kZWYgWVlTVEFDS19SRUxPQ0FURQotCWlmICh5eXNzMSAhPSB5eXNzYSkKLQkgIFlZU1RBQ0tfRlJFRSAoeXlzczEpOwotICAgICAgfQotIyBlbmRpZgotI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLQotICAgICAgeXlzc3AgPSB5eXNzICsgeXlzaXplIC0gMTsKLSAgICAgIHl5dnNwID0geXl2cyArIHl5c2l6ZSAtIDE7Ci0KLSAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YWNrIHNpemUgaW5jcmVhc2VkIHRvICVsdVxuIiwKLQkJICAodW5zaWduZWQgbG9uZyBpbnQpIHl5c3RhY2tzaXplKSk7Ci0KLSAgICAgIGlmICh5eXNzICsgeXlzdGFja3NpemUgLSAxIDw9IHl5c3NwKQotCVlZQUJPUlQ7Ci0gICAgfQotCi0gIFlZRFBSSU5URiAoKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKSk7Ci0KLSAgaWYgKHl5c3RhdGUgPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQotICBnb3RvIHl5YmFja3VwOwotCi0vKi0tLS0tLS0tLS0tLgotfCB5eWJhY2t1cC4gIHwKLWAtLS0tLS0tLS0tLSovCi15eWJhY2t1cDoKLQotICAvKiBEbyBhcHByb3ByaWF0ZSBwcm9jZXNzaW5nIGdpdmVuIHRoZSBjdXJyZW50IHN0YXRlLiAgUmVhZCBhCi0gICAgIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCi0KLSAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2thaGVhZCB0b2tlbi4gICovCi0gIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSBZWVBBQ1RfTklORikKLSAgICBnb3RvIHl5ZGVmYXVsdDsKLQotICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9va2FoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwotCi0gIC8qIFlZQ0hBUiBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRiBvciBhIHZhbGlkIGxvb2thaGVhZCBzeW1ib2wuICAqLwotICBpZiAoeXljaGFyID09IFlZRU1QVFkpCi0gICAgewotICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKSk7Ci0gICAgICB5eWNoYXIgPSBZWUxFWDsKLSAgICB9Ci0KLSAgaWYgKHl5Y2hhciA8PSBZWUVPRikKLSAgICB7Ci0gICAgICB5eWNoYXIgPSB5eXRva2VuID0gWVlFT0Y7Ci0gICAgICBZWURQUklOVEYgKChzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKLSAgICAgIFlZX1NZTUJPTF9QUklOVCAoIk5leHQgdG9rZW4gaXMiLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIHByb3BlciBhY3Rpb24gb24gc2VlaW5nIHRva2VuIFlZVE9LRU4gaXMgdG8gcmVkdWNlIG9yIHRvCi0gICAgIGRldGVjdCBhbiBlcnJvciwgdGFrZSB0aGF0IGFjdGlvbi4gICovCi0gIHl5biArPSB5eXRva2VuOwotICBpZiAoeXluIDwgMCB8fCBZWUxBU1QgPCB5eW4gfHwgeXljaGVja1t5eW5dICE9IHl5dG9rZW4pCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0gIHl5biA9IHl5dGFibGVbeXluXTsKLSAgaWYgKHl5biA8PSAwKQotICAgIHsKLSAgICAgIGlmICh5eW4gPT0gMCB8fCB5eW4gPT0gWVlUQUJMRV9OSU5GKQotCWdvdG8geXllcnJsYWI7Ci0gICAgICB5eW4gPSAteXluOwotICAgICAgZ290byB5eXJlZHVjZTsKLSAgICB9Ci0KLSAgLyogQ291bnQgdG9rZW5zIHNoaWZ0ZWQgc2luY2UgZXJyb3I7IGFmdGVyIHRocmVlLCB0dXJuIG9mZiBlcnJvcgotICAgICBzdGF0dXMuICAqLwotICBpZiAoeXllcnJzdGF0dXMpCi0gICAgeXllcnJzdGF0dXMtLTsKLQotICAvKiBTaGlmdCB0aGUgbG9va2FoZWFkIHRva2VuLiAgKi8KLSAgWVlfU1lNQk9MX1BSSU5UICgiU2hpZnRpbmciLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKLQotICAvKiBEaXNjYXJkIHRoZSBzaGlmdGVkIHRva2VuLiAgKi8KLSAgeXljaGFyID0gWVlFTVBUWTsKLQotICB5eXN0YXRlID0geXluOwotICAqKyt5eXZzcCA9IHl5bHZhbDsKLQotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLXwgeXlkZWZhdWx0IC0tIGRvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXlkZWZhdWx0OgotICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJsYWI7Ci0gIGdvdG8geXlyZWR1Y2U7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLXwgeXlyZWR1Y2UgLS0gRG8gYSByZWR1Y3Rpb24uICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXlyZWR1Y2U6Ci0gIC8qIHl5biBpcyB0aGUgbnVtYmVyIG9mIGEgcnVsZSB0byByZWR1Y2Ugd2l0aC4gICovCi0gIHl5bGVuID0geXlyMlt5eW5dOwotCi0gIC8qIElmIFlZTEVOIGlzIG5vbnplcm8sIGltcGxlbWVudCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYWN0aW9uOgotICAgICBgJCQgPSAkMScuCi0KLSAgICAgT3RoZXJ3aXNlLCB0aGUgZm9sbG93aW5nIGxpbmUgc2V0cyBZWVZBTCB0byBnYXJiYWdlLgotICAgICBUaGlzIGJlaGF2aW9yIGlzIHVuZG9jdW1lbnRlZCBhbmQgQmlzb24KLSAgICAgdXNlcnMgc2hvdWxkIG5vdCByZWx5IHVwb24gaXQuICBBc3NpZ25pbmcgdG8gWVlWQUwKLSAgICAgdW5jb25kaXRpb25hbGx5IG1ha2VzIHRoZSBwYXJzZXIgYSBiaXQgc21hbGxlciwgYW5kIGl0IGF2b2lkcyBhCi0gICAgIEdDQyB3YXJuaW5nIHRoYXQgWVlWQUwgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZC4gICovCi0gIHl5dmFsID0geXl2c3BbMS15eWxlbl07Ci0KLQotICBZWV9SRURVQ0VfUFJJTlQgKHl5bik7Ci0gIHN3aXRjaCAoeXluKQotICAgIHsKLSAgICAgICAgY2FzZSA0OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMTA5ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyBpc190eXBlZGVmID0gMDsgaXNfZXh0ZXJuID0gMDsgY3VycmVudF9uYW1lID0gTlVMTDsgZGVjbF9zcGVjID0gTlVMTDsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDU6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxMTEgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7IGZyZWVfbGlzdCgqKHl5dnNwWygyKSAtICgyKV0pLCBOVUxMKTsgKih5eXZzcFsoMikgLSAoMildKSA9IE5VTEw7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA2OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMTE1ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyBpc190eXBlZGVmID0gMTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDc6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxMTYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA4OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMTE3ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyBpc190eXBlZGVmID0gMTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDk6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxMTggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxNDoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDEyMyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDE1OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMTI0ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTY6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxMjkgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7IGlmIChjdXJyZW50X25hbWUpIHsKLQkJICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqZGVjbCA9ICgqKHl5dnNwWygzKSAtICgzKV0pKS0+bmV4dDsKLQkJICAgICgqKHl5dnNwWygzKSAtICgzKV0pKS0+bmV4dCA9IE5VTEw7Ci0JCSAgICBhZGRfc3ltYm9sKGN1cnJlbnRfbmFtZSwKLQkJCSAgICAgICBpc190eXBlZGVmID8gU1lNX1RZUEVERUYgOiBTWU1fTk9STUFMLAotCQkJICAgICAgIGRlY2wsIGlzX2V4dGVybik7Ci0JCSAgICBjdXJyZW50X25hbWUgPSBOVUxMOwotCQkgIH0KLQkJICAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTc6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxNDIgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTk6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxNDggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7IHN0cnVjdCBzdHJpbmdfbGlzdCAqZGVjbCA9ICooeXl2c3BbKDEpIC0gKDEpXSk7Ci0JCSAgKih5eXZzcFsoMSkgLSAoMSldKSA9IE5VTEw7Ci0JCSAgYWRkX3N5bWJvbChjdXJyZW50X25hbWUsCi0JCQkgICAgIGlzX3R5cGVkZWYgPyBTWU1fVFlQRURFRiA6IFNZTV9OT1JNQUwsIGRlY2wsIGlzX2V4dGVybik7Ci0JCSAgY3VycmVudF9uYW1lID0gTlVMTDsKLQkJICAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMjA6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxNTYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7IHN0cnVjdCBzdHJpbmdfbGlzdCAqZGVjbCA9ICooeXl2c3BbKDMpIC0gKDMpXSk7Ci0JCSAgKih5eXZzcFsoMykgLSAoMyldKSA9IE5VTEw7Ci0JCSAgZnJlZV9saXN0KCooeXl2c3BbKDIpIC0gKDMpXSksIE5VTEwpOwotCQkgICooeXl2c3BbKDIpIC0gKDMpXSkgPSBkZWNsX3NwZWM7Ci0JCSAgYWRkX3N5bWJvbChjdXJyZW50X25hbWUsCi0JCQkgICAgIGlzX3R5cGVkZWYgPyBTWU1fVFlQRURFRiA6IFNZTV9OT1JNQUwsIGRlY2wsIGlzX2V4dGVybik7Ci0JCSAgY3VycmVudF9uYW1lID0gTlVMTDsKLQkJICAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMjE6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxNjkgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSkgPyAoeXl2c3BbKDQpIC0gKDQpXSkgOiAoeXl2c3BbKDMpIC0gKDQpXSkgPyAoeXl2c3BbKDMpIC0gKDQpXSkgOiAoeXl2c3BbKDIpIC0gKDQpXSkgPyAoeXl2c3BbKDIpIC0gKDQpXSkgOiAoeXl2c3BbKDEpIC0gKDQpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAyMjoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDE3NCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgZGVjbF9zcGVjID0gTlVMTDsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDI0OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMTc5ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyBkZWNsX3NwZWMgPSAqKHl5dnNwWygxKSAtICgxKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMjU6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxODAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7IGRlY2xfc3BlYyA9ICooeXl2c3BbKDIpIC0gKDIpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAyNjoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDE4NSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgLyogVmVyc2lvbiAyIGNoZWNrc3VtbWluZyBpZ25vcmVzIHN0b3JhZ2UgY2xhc3MsIGFzIHRoYXQKLQkJICAgICBpcyByZWFsbHkgaXJyZWxldmFudCB0byB0aGUgbGlua2FnZS4gICovCi0JCSAgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgxKV0pKTsKLQkJICAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMzE6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAxOTcgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7IGlzX2V4dGVybiA9IDE7ICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAzMjoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDE5OCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgaXNfZXh0ZXJuID0gMDsgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDM3OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjEwICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDIpXSkpOyAoKih5eXZzcFsoMikgLSAoMildKSktPnRhZyA9IFNZTV9TVFJVQ1Q7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAzODoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDIxMiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgyKV0pKTsgKCooeXl2c3BbKDIpIC0gKDIpXSkpLT50YWcgPSBTWU1fVU5JT047ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAzOToKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDIxNCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgyKV0pKTsgKCooeXl2c3BbKDIpIC0gKDIpXSkpLT50YWcgPSBTWU1fRU5VTTsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDQwOgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjE4ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqKHl5dnNwWygzKSAtICgzKV0pLCAqaSA9ICooeXl2c3BbKDIpIC0gKDMpXSksICpyOwotCQkgIHIgPSBjb3B5X25vZGUoaSk7IHItPnRhZyA9IFNZTV9TVFJVQ1Q7Ci0JCSAgci0+bmV4dCA9ICgqKHl5dnNwWygxKSAtICgzKV0pKS0+bmV4dDsgKih5eXZzcFsoMykgLSAoMyldKSA9IHI7ICgqKHl5dnNwWygxKSAtICgzKV0pKS0+bmV4dCA9IE5VTEw7Ci0JCSAgYWRkX3N5bWJvbChpLT5zdHJpbmcsIFNZTV9TVFJVQ1QsIHMsIGlzX2V4dGVybik7Ci0JCSAgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsKLQkJO30KLSAgICBicmVhazsKLQotICBjYXNlIDQxOgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjI1ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqKHl5dnNwWygzKSAtICgzKV0pLCAqaSA9ICooeXl2c3BbKDIpIC0gKDMpXSksICpyOwotCQkgIHIgPSBjb3B5X25vZGUoaSk7IHItPnRhZyA9IFNZTV9VTklPTjsKLQkJICByLT5uZXh0ID0gKCooeXl2c3BbKDEpIC0gKDMpXSkpLT5uZXh0OyAqKHl5dnNwWygzKSAtICgzKV0pID0gcjsgKCooeXl2c3BbKDEpIC0gKDMpXSkpLT5uZXh0ID0gTlVMTDsKLQkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX1VOSU9OLCBzLCBpc19leHRlcm4pOwotCQkgICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7Ci0JCTt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA0MjoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDIzMiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgc3RydWN0IHN0cmluZ19saXN0ICpzID0gKih5eXZzcFsoMykgLSAoMyldKSwgKmkgPSAqKHl5dnNwWygyKSAtICgzKV0pLCAqcjsKLQkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fRU5VTTsKLQkJICByLT5uZXh0ID0gKCooeXl2c3BbKDEpIC0gKDMpXSkpLT5uZXh0OyAqKHl5dnNwWygzKSAtICgzKV0pID0gcjsgKCooeXl2c3BbKDEpIC0gKDMpXSkpLT5uZXh0ID0gTlVMTDsKLQkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX0VOVU0sIHMsIGlzX2V4dGVybik7Ci0JCSAgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsKLQkJO30KLSAgICBicmVhazsKLQotICBjYXNlIDQzOgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjQyICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyBhZGRfc3ltYm9sKE5VTEwsIFNZTV9FTlVNLCBOVUxMLCAwKTsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDQ0OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjQ0ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgNDU6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAyNDUgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA1NjoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDI1OSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKCooeXl2c3BbKDEpIC0gKDEpXSkpLT50YWcgPSBTWU1fVFlQRURFRjsgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDU3OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjY0ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pID8gKHl5dnNwWygyKSAtICgyKV0pIDogKHl5dnNwWygxKSAtICgyKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgNTg6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAyNjggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgNjE6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAyNzQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA2NToKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDI4MCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgLyogcmVzdHJpY3QgaGFzIG5vIGVmZmVjdCBpbiBwcm90b3R5cGVzIHNvIGlnbm9yZSBpdCAqLwotCQkgIHJlbW92ZV9ub2RlKCh5eXZzcFsoMSkgLSAoMSldKSk7Ci0JCSAgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsKLQkJO30KLSAgICBicmVhazsKLQotICBjYXNlIDY2OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMjg3ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgNjg6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAyOTMgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7IGlmIChjdXJyZW50X25hbWUgIT0gTlVMTCkgewotCQkgICAgZXJyb3Jfd2l0aF9wb3MoInVuZXhwZWN0ZWQgc2Vjb25kIGRlY2xhcmF0aW9uIG5hbWUiKTsKLQkJICAgIFlZRVJST1I7Ci0JCSAgfSBlbHNlIHsKLQkJICAgIGN1cnJlbnRfbmFtZSA9ICgqKHl5dnNwWygxKSAtICgxKV0pKS0+c3RyaW5nOwotCQkgICAgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsKLQkJICB9Ci0JCTt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA2OToKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDMwMiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDcwOgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMzA0ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgNzE6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAzMDYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA3MjoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDMwOCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDczOgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMzEwICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgNzQ6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAzMTYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA3ODoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDMyNCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDc5OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMzI2ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgODA6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAzMjggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA4MToKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDMzMCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDgyOgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMzMyICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgODM6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAzMzYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA4NToKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDMzOCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDg2OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMzQyICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gTlVMTDsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDg5OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMzQ5ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgOTA6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAzNTQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSkgPyAoeXl2c3BbKDIpIC0gKDIpXSkgOiAoeXl2c3BbKDEpIC0gKDIpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA5MToKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDM1OSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKSA/ICh5eXZzcFsoMikgLSAoMildKSA6ICh5eXZzcFsoMSkgLSAoMildKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDkzOgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMzY0ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gTlVMTDsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDk0OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMzY2ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAvKiBGb3IgdmVyc2lvbiAyIGNoZWNrc3Vtcywgd2UgZG9uJ3Qgd2FudCB0byByZW1lbWJlcgotCQkgICAgIHByaXZhdGUgcGFyYW1ldGVyIG5hbWVzLiAgKi8KLQkJICByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDEpXSkpOwotCQkgICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7Ci0JCTt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA5NToKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDM3NCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgxKV0pKTsKLQkJICAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgOTY6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAzNzggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA5NzoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDM4MCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDk4OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgMzgyICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgOTk6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAzODQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMDA6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAzODYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMDE6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSAzOTEgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7IHN0cnVjdCBzdHJpbmdfbGlzdCAqZGVjbCA9ICooeXl2c3BbKDIpIC0gKDMpXSk7Ci0JCSAgKih5eXZzcFsoMikgLSAoMyldKSA9IE5VTEw7Ci0JCSAgYWRkX3N5bWJvbChjdXJyZW50X25hbWUsIFNZTV9OT1JNQUwsIGRlY2wsIGlzX2V4dGVybik7Ci0JCSAgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsKLQkJO30KLSAgICBicmVhazsKLQotICBjYXNlIDEwMjoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDM5OSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMDQ6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSA0MDYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7IHJlbW92ZV9saXN0KCh5eXZzcFsoMikgLSAoMildKSwgJigqKHl5dnNwWygxKSAtICgyKV0pKS0+bmV4dCk7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMDU6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSA0MTAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMDY6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSA0MTEgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMDc6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSA0MTUgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTEwOgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgNDIxICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTExOgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgNDI2ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTEyOgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgNDI4ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTEzOgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgNDMyICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgeyAoeXl2YWwpID0gTlVMTDsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDExNjoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDQzOCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDExNzoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDQ0MiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKSA/ICh5eXZzcFsoMikgLSAoMildKSA6ICh5eXZzcFsoMSkgLSAoMildKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDExODoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDQ0MyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDEyMDoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDQ0OCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDEyMToKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDQ1MiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMjM6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSA0NTcgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMjQ6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSA0NTggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMjc6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSA0NjcgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7Ci0JCQljb25zdCBjaGFyICpuYW1lID0gc3RyZHVwKCgqKHl5dnNwWygxKSAtICgxKV0pKS0+c3RyaW5nKTsKLQkJCWFkZF9zeW1ib2wobmFtZSwgU1lNX0VOVU1fQ09OU1QsIE5VTEwsIDApOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTI4OgotCi0vKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwotI2xpbmUgNDcyICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0gICAgewotCQkJY29uc3QgY2hhciAqbmFtZSA9IHN0cmR1cCgoKih5eXZzcFsoMSkgLSAoMyldKSktPnN0cmluZyk7Ci0JCQlzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmV4cHIgPSBjb3B5X2xpc3RfcmFuZ2UoKih5eXZzcFsoMykgLSAoMyldKSwgKih5eXZzcFsoMikgLSAoMyldKSk7Ci0JCQlhZGRfc3ltYm9sKG5hbWUsIFNZTV9FTlVNX0NPTlNULCBleHByLCAwKTsKLQkJO30KLSAgICBicmVhazsKLQotICBjYXNlIDEyOToKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDQ3OSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KLSAgICBicmVhazsKLQotICBjYXNlIDEzMDoKLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDQ4MyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgotICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMzI6Ci0KLS8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCi0jbGluZSA0ODkgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKLSAgICB7IGV4cG9ydF9zeW1ib2woKCooeXl2c3BbKDMpIC0gKDUpXSkpLT5zdHJpbmcpOyAoeXl2YWwpID0gKHl5dnNwWyg1KSAtICg1KV0pOyA7fQotICAgIGJyZWFrOwotCi0KLQotLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KLSNsaW5lIDIzMDEgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UuYyIKLSAgICAgIGRlZmF1bHQ6IGJyZWFrOwotICAgIH0KLSAgWVlfU1lNQk9MX1BSSU5UICgiLT4gJCQgPSIsIHl5cjFbeXluXSwgJnl5dmFsLCAmeXlsb2MpOwotCi0gIFlZUE9QU1RBQ0sgKHl5bGVuKTsKLSAgeXlsZW4gPSAwOwotICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOwotCi0gICorK3l5dnNwID0geXl2YWw7Ci0KLSAgLyogTm93IGBzaGlmdCcgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLiAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUKLSAgICAgdGhhdCBnb2VzIHRvLCBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8gYW5kIHRoZSBydWxlCi0gICAgIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KLQotICB5eW4gPSB5eXIxW3l5bl07Ci0KLSAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVE9LRU5TXSArICp5eXNzcDsKLSAgaWYgKDAgPD0geXlzdGF0ZSAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKLSAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKLSAgZWxzZQotICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVE9LRU5TXTsKLQotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXllcnJsYWI6Ci0gIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLwotICBpZiAoIXl5ZXJyc3RhdHVzKQotICAgIHsKLSAgICAgICsreXluZXJyczsKLSNpZiAhIFlZRVJST1JfVkVSQk9TRQotICAgICAgeXllcnJvciAoWVlfKCJzeW50YXggZXJyb3IiKSk7Ci0jZWxzZQotICAgICAgewotCVlZU0laRV9UIHl5c2l6ZSA9IHl5c3ludGF4X2Vycm9yICgwLCB5eXN0YXRlLCB5eWNoYXIpOwotCWlmICh5eW1zZ19hbGxvYyA8IHl5c2l6ZSAmJiB5eW1zZ19hbGxvYyA8IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkKLQkgIHsKLQkgICAgWVlTSVpFX1QgeXlhbGxvYyA9IDIgKiB5eXNpemU7Ci0JICAgIGlmICghICh5eXNpemUgPD0geXlhbGxvYyAmJiB5eWFsbG9jIDw9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkpCi0JICAgICAgeXlhbGxvYyA9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTTsKLQkgICAgaWYgKHl5bXNnICE9IHl5bXNnYnVmKQotCSAgICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOwotCSAgICB5eW1zZyA9IChjaGFyICopIFlZU1RBQ0tfQUxMT0MgKHl5YWxsb2MpOwotCSAgICBpZiAoeXltc2cpCi0JICAgICAgeXltc2dfYWxsb2MgPSB5eWFsbG9jOwotCSAgICBlbHNlCi0JICAgICAgewotCQl5eW1zZyA9IHl5bXNnYnVmOwotCQl5eW1zZ19hbGxvYyA9IHNpemVvZiB5eW1zZ2J1ZjsKLQkgICAgICB9Ci0JICB9Ci0KLQlpZiAoMCA8IHl5c2l6ZSAmJiB5eXNpemUgPD0geXltc2dfYWxsb2MpCi0JICB7Ci0JICAgICh2b2lkKSB5eXN5bnRheF9lcnJvciAoeXltc2csIHl5c3RhdGUsIHl5Y2hhcik7Ci0JICAgIHl5ZXJyb3IgKHl5bXNnKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHl5ZXJyb3IgKFlZXygic3ludGF4IGVycm9yIikpOwotCSAgICBpZiAoeXlzaXplICE9IDApCi0JICAgICAgZ290byB5eWV4aGF1c3RlZGxhYjsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotCi0KLSAgaWYgKHl5ZXJyc3RhdHVzID09IDMpCi0gICAgewotICAgICAgLyogSWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBhbgotCSBlcnJvciwgZGlzY2FyZCBpdC4gICovCi0KLSAgICAgIGlmICh5eWNoYXIgPD0gWVlFT0YpCi0JewotCSAgLyogUmV0dXJuIGZhaWx1cmUgaWYgYXQgZW5kIG9mIGlucHV0LiAgKi8KLQkgIGlmICh5eWNoYXIgPT0gWVlFT0YpCi0JICAgIFlZQUJPUlQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogZGlzY2FyZGluZyIsCi0JCSAgICAgIHl5dG9rZW4sICZ5eWx2YWwpOwotCSAgeXljaGFyID0gWVlFTVBUWTsKLQl9Ci0gICAgfQotCi0gIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIHNoaWZ0aW5nIHRoZSBlcnJvcgotICAgICB0b2tlbi4gICovCi0gIGdvdG8geXllcnJsYWIxOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eWVycm9ybGFiIC0tIGVycm9yIHJhaXNlZCBleHBsaWNpdGx5IGJ5IFlZRVJST1IuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXl5ZXJyb3JsYWI6Ci0KLSAgLyogUGFjaWZ5IGNvbXBpbGVycyBsaWtlIEdDQyB3aGVuIHRoZSB1c2VyIGNvZGUgbmV2ZXIgaW52b2tlcwotICAgICBZWUVSUk9SIGFuZCB0aGUgbGFiZWwgeXllcnJvcmxhYiB0aGVyZWZvcmUgbmV2ZXIgYXBwZWFycyBpbiB1c2VyCi0gICAgIGNvZGUuICAqLwotICBpZiAoLypDT05TVENPTkQqLyAwKQotICAgICBnb3RvIHl5ZXJyb3JsYWI7Ci0KLSAgLyogRG8gbm90IHJlY2xhaW0gdGhlIHN5bWJvbHMgb2YgdGhlIHJ1bGUgd2hpY2ggYWN0aW9uIHRyaWdnZXJlZAotICAgICB0aGlzIFlZRVJST1IuICAqLwotICBZWVBPUFNUQUNLICh5eWxlbik7Ci0gIHl5bGVuID0gMDsKLSAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKLSAgeXlzdGF0ZSA9ICp5eXNzcDsKLSAgZ290byB5eWVycmxhYjE7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eWVycmxhYjEgLS0gY29tbW9uIGNvZGUgZm9yIGJvdGggc3ludGF4IGVycm9yIGFuZCBZWUVSUk9SLiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXllcnJsYWIxOgotICB5eWVycnN0YXR1cyA9IDM7CS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcy4gICovCi0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gICAgICBpZiAoeXluICE9IFlZUEFDVF9OSU5GKQotCXsKLQkgIHl5biArPSBZWVRFUlJPUjsKLQkgIGlmICgwIDw9IHl5biAmJiB5eW4gPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXluXSA9PSBZWVRFUlJPUikKLQkgICAgewotCSAgICAgIHl5biA9IHl5dGFibGVbeXluXTsKLQkgICAgICBpZiAoMCA8IHl5bikKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFBvcCB0aGUgY3VycmVudCBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBoYW5kbGUgdGhlIGVycm9yIHRva2VuLiAgKi8KLSAgICAgIGlmICh5eXNzcCA9PSB5eXNzKQotCVlZQUJPUlQ7Ci0KLQotICAgICAgeXlkZXN0cnVjdCAoIkVycm9yOiBwb3BwaW5nIiwKLQkJICB5eXN0b3NbeXlzdGF0ZV0sIHl5dnNwKTsKLSAgICAgIFlZUE9QU1RBQ0sgKDEpOwotICAgICAgeXlzdGF0ZSA9ICp5eXNzcDsKLSAgICAgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7Ci0gICAgfQotCi0gICorK3l5dnNwID0geXlsdmFsOwotCi0KLSAgLyogU2hpZnQgdGhlIGVycm9yIHRva2VuLiAgKi8KLSAgWVlfU1lNQk9MX1BSSU5UICgiU2hpZnRpbmciLCB5eXN0b3NbeXluXSwgeXl2c3AsIHl5bHNwKTsKLQotICB5eXN0YXRlID0geXluOwotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eWFjY2VwdGxhYiAtLSBZWUFDQ0VQVCBjb21lcyBoZXJlLiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXlhY2NlcHRsYWI6Ci0gIHl5cmVzdWx0ID0gMDsKLSAgZ290byB5eXJldHVybjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLXwgeXlhYm9ydGxhYiAtLSBZWUFCT1JUIGNvbWVzIGhlcmUuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXlhYm9ydGxhYjoKLSAgeXlyZXN1bHQgPSAxOwotICBnb3RvIHl5cmV0dXJuOwotCi0jaWYgIWRlZmluZWQoeXlvdmVyZmxvdykgfHwgWVlFUlJPUl9WRVJCT1NFCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5ZXhoYXVzdGVkbGFiIC0tIG1lbW9yeSBleGhhdXN0aW9uIGNvbWVzIGhlcmUuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi15eWV4aGF1c3RlZGxhYjoKLSAgeXllcnJvciAoWVlfKCJtZW1vcnkgZXhoYXVzdGVkIikpOwotICB5eXJlc3VsdCA9IDI7Ci0gIC8qIEZhbGwgdGhyb3VnaC4gICovCi0jZW5kaWYKLQoteXlyZXR1cm46Ci0gIGlmICh5eWNoYXIgIT0gWVlFTVBUWSkKLSAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IGRpc2NhcmRpbmcgbG9va2FoZWFkIiwKLQkJIHl5dG9rZW4sICZ5eWx2YWwpOwotICAvKiBEbyBub3QgcmVjbGFpbSB0aGUgc3ltYm9scyBvZiB0aGUgcnVsZSB3aGljaCBhY3Rpb24gdHJpZ2dlcmVkCi0gICAgIHRoaXMgWVlBQk9SVCBvciBZWUFDQ0VQVC4gICovCi0gIFlZUE9QU1RBQ0sgKHl5bGVuKTsKLSAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKLSAgd2hpbGUgKHl5c3NwICE9IHl5c3MpCi0gICAgewotICAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IHBvcHBpbmciLAotCQkgIHl5c3Rvc1sqeXlzc3BdLCB5eXZzcCk7Ci0gICAgICBZWVBPUFNUQUNLICgxKTsKLSAgICB9Ci0jaWZuZGVmIHl5b3ZlcmZsb3cKLSAgaWYgKHl5c3MgIT0geXlzc2EpCi0gICAgWVlTVEFDS19GUkVFICh5eXNzKTsKLSNlbmRpZgotI2lmIFlZRVJST1JfVkVSQk9TRQotICBpZiAoeXltc2cgIT0geXltc2didWYpCi0gICAgWVlTVEFDS19GUkVFICh5eW1zZyk7Ci0jZW5kaWYKLSAgLyogTWFrZSBzdXJlIFlZSUQgaXMgdXNlZC4gICovCi0gIHJldHVybiBZWUlEICh5eXJlc3VsdCk7Ci19Ci0KLQotCi0vKiBMaW5lIDE2NzUgb2YgeWFjYy5jICAqLwotI2xpbmUgNDkzICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCi0KLQotc3RhdGljIHZvaWQKLXl5ZXJyb3IoY29uc3QgY2hhciAqZSkKLXsKLSAgZXJyb3Jfd2l0aF9wb3MoIiVzIiwgZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UuaF9zaGlwcGVkIGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5oX3NoaXBwZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzUyMzYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5oX3NoaXBwZWQKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0KLS8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjQuMS4gICovCi0KLS8qIFNrZWxldG9uIGludGVyZmFjZSBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCi0gICAKLSAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCi0KLS8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgY3JlYXRlIGEgbGFyZ2VyIHdvcmsgdGhhdCBjb250YWlucwotICAgcGFydCBvciBhbGwgb2YgdGhlIEJpc29uIHBhcnNlciBza2VsZXRvbiBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKLSAgIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBzbyBsb25nIGFzIHRoYXQgd29yayBpc24ndCBpdHNlbGYgYQotICAgcGFyc2VyIGdlbmVyYXRvciB1c2luZyB0aGUgc2tlbGV0b24gb3IgYSBtb2RpZmllZCB2ZXJzaW9uIHRoZXJlb2YKLSAgIGFzIGEgcGFyc2VyIHNrZWxldG9uLiAgQWx0ZXJuYXRpdmVseSwgaWYgeW91IG1vZGlmeSBvciByZWRpc3RyaWJ1dGUKLSAgIHRoZSBwYXJzZXIgc2tlbGV0b24gaXRzZWxmLCB5b3UgbWF5IChhdCB5b3VyIG9wdGlvbikgcmVtb3ZlIHRoaXMKLSAgIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBza2VsZXRvbiBhbmQgdGhlIHJlc3VsdGluZwotICAgQmlzb24gb3V0cHV0IGZpbGVzIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2Ugd2l0aG91dCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uLgotICAgCi0gICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluCi0gICB2ZXJzaW9uIDIuMiBvZiBCaXNvbi4gICovCi0KLQotLyogVG9rZW5zLiAgKi8KLSNpZm5kZWYgWVlUT0tFTlRZUEUKLSMgZGVmaW5lIFlZVE9LRU5UWVBFCi0gICAvKiBQdXQgdGhlIHRva2VucyBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoYXQgR0RCIGFuZCBvdGhlciBkZWJ1Z2dlcnMKLSAgICAgIGtub3cgYWJvdXQgdGhlbS4gICovCi0gICBlbnVtIHl5dG9rZW50eXBlIHsKLSAgICAgQVNNX0tFWVcgPSAyNTgsCi0gICAgIEFUVFJJQlVURV9LRVlXID0gMjU5LAotICAgICBBVVRPX0tFWVcgPSAyNjAsCi0gICAgIEJPT0xfS0VZVyA9IDI2MSwKLSAgICAgQ0hBUl9LRVlXID0gMjYyLAotICAgICBDT05TVF9LRVlXID0gMjYzLAotICAgICBET1VCTEVfS0VZVyA9IDI2NCwKLSAgICAgRU5VTV9LRVlXID0gMjY1LAotICAgICBFWFRFUk5fS0VZVyA9IDI2NiwKLSAgICAgRVhURU5TSU9OX0tFWVcgPSAyNjcsCi0gICAgIEZMT0FUX0tFWVcgPSAyNjgsCi0gICAgIElOTElORV9LRVlXID0gMjY5LAotICAgICBJTlRfS0VZVyA9IDI3MCwKLSAgICAgTE9OR19LRVlXID0gMjcxLAotICAgICBSRUdJU1RFUl9LRVlXID0gMjcyLAotICAgICBSRVNUUklDVF9LRVlXID0gMjczLAotICAgICBTSE9SVF9LRVlXID0gMjc0LAotICAgICBTSUdORURfS0VZVyA9IDI3NSwKLSAgICAgU1RBVElDX0tFWVcgPSAyNzYsCi0gICAgIFNUUlVDVF9LRVlXID0gMjc3LAotICAgICBUWVBFREVGX0tFWVcgPSAyNzgsCi0gICAgIFVOSU9OX0tFWVcgPSAyNzksCi0gICAgIFVOU0lHTkVEX0tFWVcgPSAyODAsCi0gICAgIFZPSURfS0VZVyA9IDI4MSwKLSAgICAgVk9MQVRJTEVfS0VZVyA9IDI4MiwKLSAgICAgVFlQRU9GX0tFWVcgPSAyODMsCi0gICAgIEVYUE9SVF9TWU1CT0xfS0VZVyA9IDI4NCwKLSAgICAgQVNNX1BIUkFTRSA9IDI4NSwKLSAgICAgQVRUUklCVVRFX1BIUkFTRSA9IDI4NiwKLSAgICAgQlJBQ0VfUEhSQVNFID0gMjg3LAotICAgICBCUkFDS0VUX1BIUkFTRSA9IDI4OCwKLSAgICAgRVhQUkVTU0lPTl9QSFJBU0UgPSAyODksCi0gICAgIENIQVIgPSAyOTAsCi0gICAgIERPVFMgPSAyOTEsCi0gICAgIElERU5UID0gMjkyLAotICAgICBJTlQgPSAyOTMsCi0gICAgIFJFQUwgPSAyOTQsCi0gICAgIFNUUklORyA9IDI5NSwKLSAgICAgVFlQRSA9IDI5NiwKLSAgICAgT1RIRVIgPSAyOTcsCi0gICAgIEZJTEVOQU1FID0gMjk4Ci0gICB9OwotI2VuZGlmCi0KLQotCi0jaWYgISBkZWZpbmVkIFlZU1RZUEUgJiYgISBkZWZpbmVkIFlZU1RZUEVfSVNfREVDTEFSRUQKLXR5cGVkZWYgaW50IFlZU1RZUEU7Ci0jIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQotIyBkZWZpbmUgeXlzdHlwZSBZWVNUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLwotIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCi0jZW5kaWYKLQotZXh0ZXJuIFlZU1RZUEUgeXlsdmFsOwotCi0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UudGFiLmNfc2hpcHBlZCBiL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UudGFiLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQ0YTVkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS50YWIuY19zaGlwcGVkCkBAIC0wLDAgKzEsMjM1NCBAQAorLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuNC4zLiAgKi8KKworLyogU2tlbGV0b24gaW1wbGVtZW50YXRpb24gZm9yIEJpc29uJ3MgWWFjYy1saWtlIHBhcnNlcnMgaW4gQworICAgCisgICAgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisgICAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IGNyZWF0ZSBhIGxhcmdlciB3b3JrIHRoYXQgY29udGFpbnMKKyAgIHBhcnQgb3IgYWxsIG9mIHRoZSBCaXNvbiBwYXJzZXIgc2tlbGV0b24gYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCisgICB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgc28gbG9uZyBhcyB0aGF0IHdvcmsgaXNuJ3QgaXRzZWxmIGEKKyAgIHBhcnNlciBnZW5lcmF0b3IgdXNpbmcgdGhlIHNrZWxldG9uIG9yIGEgbW9kaWZpZWQgdmVyc2lvbiB0aGVyZW9mCisgICBhcyBhIHBhcnNlciBza2VsZXRvbi4gIEFsdGVybmF0aXZlbHksIGlmIHlvdSBtb2RpZnkgb3IgcmVkaXN0cmlidXRlCisgICB0aGUgcGFyc2VyIHNrZWxldG9uIGl0c2VsZiwgeW91IG1heSAoYXQgeW91ciBvcHRpb24pIHJlbW92ZSB0aGlzCisgICBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgc2tlbGV0b24gYW5kIHRoZSByZXN1bHRpbmcKKyAgIEJpc29uIG91dHB1dCBmaWxlcyB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIHdpdGhvdXQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbi4KKyAgIAorICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbgorICAgdmVyc2lvbiAyLjIgb2YgQmlzb24uICAqLworCisvKiBDIExBTFIoMSkgcGFyc2VyIHNrZWxldG9uIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiwgYnkKKyAgIHNpbXBsaWZ5aW5nIHRoZSBvcmlnaW5hbCBzby1jYWxsZWQgInNlbWFudGljIiBwYXJzZXIuICAqLworCisvKiBBbGwgc3ltYm9scyBkZWZpbmVkIGJlbG93IHNob3VsZCBiZWdpbiB3aXRoIHl5IG9yIFlZLCB0byBhdm9pZAorICAgaW5mcmluZ2luZyBvbiB1c2VyIG5hbWUgc3BhY2UuICBUaGlzIHNob3VsZCBiZSBkb25lIGV2ZW4gZm9yIGxvY2FsCisgICB2YXJpYWJsZXMsIGFzIHRoZXkgbWlnaHQgb3RoZXJ3aXNlIGJlIGV4cGFuZGVkIGJ5IHVzZXIgbWFjcm9zLgorICAgVGhlcmUgYXJlIHNvbWUgdW5hdm9pZGFibGUgZXhjZXB0aW9ucyB3aXRoaW4gaW5jbHVkZSBmaWxlcyB0bworICAgZGVmaW5lIG5lY2Vzc2FyeSBsaWJyYXJ5IHN5bWJvbHM7IHRoZXkgYXJlIG5vdGVkICJJTkZSSU5HRVMgT04KKyAgIFVTRVIgTkFNRSBTUEFDRSIgYmVsb3cuICAqLworCisvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLworI2RlZmluZSBZWUJJU09OIDEKKworLyogQmlzb24gdmVyc2lvbi4gICovCisjZGVmaW5lIFlZQklTT05fVkVSU0lPTiAiMi40LjMiCisKKy8qIFNrZWxldG9uIG5hbWUuICAqLworI2RlZmluZSBZWVNLRUxFVE9OX05BTUUgInlhY2MuYyIKKworLyogUHVyZSBwYXJzZXJzLiAgKi8KKyNkZWZpbmUgWVlQVVJFIDAKKworLyogUHVzaCBwYXJzZXJzLiAgKi8KKyNkZWZpbmUgWVlQVVNIIDAKKworLyogUHVsbCBwYXJzZXJzLiAgKi8KKyNkZWZpbmUgWVlQVUxMIDEKKworLyogVXNpbmcgbG9jYXRpb25zLiAgKi8KKyNkZWZpbmUgWVlMU1BfTkVFREVEIDAKKworCisKKy8qIENvcHkgdGhlIGZpcnN0IHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLworCisKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdlbmtzeW1zLmgiCisKK3N0YXRpYyBpbnQgaXNfdHlwZWRlZjsKK3N0YXRpYyBpbnQgaXNfZXh0ZXJuOworc3RhdGljIGNoYXIgKmN1cnJlbnRfbmFtZTsKK3N0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2xfc3BlYzsKKworc3RhdGljIHZvaWQgeXllcnJvcihjb25zdCBjaGFyICopOworCitzdGF0aWMgaW5saW5lIHZvaWQKK3JlbW92ZV9ub2RlKHN0cnVjdCBzdHJpbmdfbGlzdCAqKnApCit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbm9kZSA9ICpwOworICAqcCA9IG5vZGUtPm5leHQ7CisgIGZyZWVfbm9kZShub2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdmVfbGlzdChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipwYiwgc3RydWN0IHN0cmluZ19saXN0ICoqcGUpCit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqYiA9ICpwYiwgKmUgPSAqcGU7CisgICpwYiA9IGU7CisgIGZyZWVfbGlzdChiLCBlKTsKK30KKworCisKKworLyogRW5hYmxpbmcgdHJhY2VzLiAgKi8KKyNpZm5kZWYgWVlERUJVRworIyBkZWZpbmUgWVlERUJVRyAxCisjZW5kaWYKKworLyogRW5hYmxpbmcgdmVyYm9zZSBlcnJvciBtZXNzYWdlcy4gICovCisjaWZkZWYgWVlFUlJPUl9WRVJCT1NFCisjIHVuZGVmIFlZRVJST1JfVkVSQk9TRQorIyBkZWZpbmUgWVlFUlJPUl9WRVJCT1NFIDEKKyNlbHNlCisjIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMAorI2VuZGlmCisKKy8qIEVuYWJsaW5nIHRoZSB0b2tlbiB0YWJsZS4gICovCisjaWZuZGVmIFlZVE9LRU5fVEFCTEUKKyMgZGVmaW5lIFlZVE9LRU5fVEFCTEUgMAorI2VuZGlmCisKKworLyogVG9rZW5zLiAgKi8KKyNpZm5kZWYgWVlUT0tFTlRZUEUKKyMgZGVmaW5lIFlZVE9LRU5UWVBFCisgICAvKiBQdXQgdGhlIHRva2VucyBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoYXQgR0RCIGFuZCBvdGhlciBkZWJ1Z2dlcnMKKyAgICAgIGtub3cgYWJvdXQgdGhlbS4gICovCisgICBlbnVtIHl5dG9rZW50eXBlIHsKKyAgICAgQVNNX0tFWVcgPSAyNTgsCisgICAgIEFUVFJJQlVURV9LRVlXID0gMjU5LAorICAgICBBVVRPX0tFWVcgPSAyNjAsCisgICAgIEJPT0xfS0VZVyA9IDI2MSwKKyAgICAgQ0hBUl9LRVlXID0gMjYyLAorICAgICBDT05TVF9LRVlXID0gMjYzLAorICAgICBET1VCTEVfS0VZVyA9IDI2NCwKKyAgICAgRU5VTV9LRVlXID0gMjY1LAorICAgICBFWFRFUk5fS0VZVyA9IDI2NiwKKyAgICAgRVhURU5TSU9OX0tFWVcgPSAyNjcsCisgICAgIEZMT0FUX0tFWVcgPSAyNjgsCisgICAgIElOTElORV9LRVlXID0gMjY5LAorICAgICBJTlRfS0VZVyA9IDI3MCwKKyAgICAgTE9OR19LRVlXID0gMjcxLAorICAgICBSRUdJU1RFUl9LRVlXID0gMjcyLAorICAgICBSRVNUUklDVF9LRVlXID0gMjczLAorICAgICBTSE9SVF9LRVlXID0gMjc0LAorICAgICBTSUdORURfS0VZVyA9IDI3NSwKKyAgICAgU1RBVElDX0tFWVcgPSAyNzYsCisgICAgIFNUUlVDVF9LRVlXID0gMjc3LAorICAgICBUWVBFREVGX0tFWVcgPSAyNzgsCisgICAgIFVOSU9OX0tFWVcgPSAyNzksCisgICAgIFVOU0lHTkVEX0tFWVcgPSAyODAsCisgICAgIFZPSURfS0VZVyA9IDI4MSwKKyAgICAgVk9MQVRJTEVfS0VZVyA9IDI4MiwKKyAgICAgVFlQRU9GX0tFWVcgPSAyODMsCisgICAgIEVYUE9SVF9TWU1CT0xfS0VZVyA9IDI4NCwKKyAgICAgQVNNX1BIUkFTRSA9IDI4NSwKKyAgICAgQVRUUklCVVRFX1BIUkFTRSA9IDI4NiwKKyAgICAgQlJBQ0VfUEhSQVNFID0gMjg3LAorICAgICBCUkFDS0VUX1BIUkFTRSA9IDI4OCwKKyAgICAgRVhQUkVTU0lPTl9QSFJBU0UgPSAyODksCisgICAgIENIQVIgPSAyOTAsCisgICAgIERPVFMgPSAyOTEsCisgICAgIElERU5UID0gMjkyLAorICAgICBJTlQgPSAyOTMsCisgICAgIFJFQUwgPSAyOTQsCisgICAgIFNUUklORyA9IDI5NSwKKyAgICAgVFlQRSA9IDI5NiwKKyAgICAgT1RIRVIgPSAyOTcsCisgICAgIEZJTEVOQU1FID0gMjk4CisgICB9OworI2VuZGlmCisKKworCisjaWYgISBkZWZpbmVkIFlZU1RZUEUgJiYgISBkZWZpbmVkIFlZU1RZUEVfSVNfREVDTEFSRUQKK3R5cGVkZWYgaW50IFlZU1RZUEU7CisjIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQorIyBkZWZpbmUgeXlzdHlwZSBZWVNUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLworIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCisjZW5kaWYKKworCisvKiBDb3B5IHRoZSBzZWNvbmQgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCisKKworCisjaWZkZWYgc2hvcnQKKyMgdW5kZWYgc2hvcnQKKyNlbmRpZgorCisjaWZkZWYgWVlUWVBFX1VJTlQ4Cit0eXBlZGVmIFlZVFlQRV9VSU5UOCB5eXR5cGVfdWludDg7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHl5dHlwZV91aW50ODsKKyNlbmRpZgorCisjaWZkZWYgWVlUWVBFX0lOVDgKK3R5cGVkZWYgWVlUWVBFX0lOVDggeXl0eXBlX2ludDg7CisjZWxpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCit0eXBlZGVmIHNpZ25lZCBjaGFyIHl5dHlwZV9pbnQ4OworI2Vsc2UKK3R5cGVkZWYgc2hvcnQgaW50IHl5dHlwZV9pbnQ4OworI2VuZGlmCisKKyNpZmRlZiBZWVRZUEVfVUlOVDE2Cit0eXBlZGVmIFlZVFlQRV9VSU5UMTYgeXl0eXBlX3VpbnQxNjsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCB5eXR5cGVfdWludDE2OworI2VuZGlmCisKKyNpZmRlZiBZWVRZUEVfSU5UMTYKK3R5cGVkZWYgWVlUWVBFX0lOVDE2IHl5dHlwZV9pbnQxNjsKKyNlbHNlCit0eXBlZGVmIHNob3J0IGludCB5eXR5cGVfaW50MTY7CisjZW5kaWYKKworI2lmbmRlZiBZWVNJWkVfVAorIyBpZmRlZiBfX1NJWkVfVFlQRV9fCisjICBkZWZpbmUgWVlTSVpFX1QgX19TSVpFX1RZUEVfXworIyBlbGlmIGRlZmluZWQgc2l6ZV90CisjICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjIGVsaWYgISBkZWZpbmVkIFlZU0laRV9UICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKKyMgIGluY2x1ZGUgPHN0ZGRlZi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjIGVsc2UKKyMgIGRlZmluZSBZWVNJWkVfVCB1bnNpZ25lZCBpbnQKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFlZU0laRV9NQVhJTVVNICgoWVlTSVpFX1QpIC0xKQorCisjaWZuZGVmIFlZXworIyBpZiBkZWZpbmVkIFlZRU5BQkxFX05MUyAmJiBZWUVOQUJMRV9OTFMKKyMgIGlmIEVOQUJMRV9OTFMKKyMgICBpbmNsdWRlIDxsaWJpbnRsLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICBkZWZpbmUgWVlfKG1zZ2lkKSBkZ2V0dGV4dCAoImJpc29uLXJ1bnRpbWUiLCBtc2dpZCkKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmbmRlZiBZWV8KKyMgIGRlZmluZSBZWV8obXNnaWQpIG1zZ2lkCisjIGVuZGlmCisjZW5kaWYKKworLyogU3VwcHJlc3MgdW51c2VkLXZhcmlhYmxlIHdhcm5pbmdzIGJ5ICJ1c2luZyIgRS4gICovCisjaWYgISBkZWZpbmVkIGxpbnQgfHwgZGVmaW5lZCBfX0dOVUNfXworIyBkZWZpbmUgWVlVU0UoZSkgKCh2b2lkKSAoZSkpCisjZWxzZQorIyBkZWZpbmUgWVlVU0UoZSkgLyogZW1wdHkgKi8KKyNlbmRpZgorCisvKiBJZGVudGl0eSBmdW5jdGlvbiwgdXNlZCB0byBzdXBwcmVzcyB3YXJuaW5ncyBhYm91dCBjb25zdGFudCBjb25kaXRpb25zLiAgKi8KKyNpZm5kZWYgbGludAorIyBkZWZpbmUgWVlJRChuKSAobikKKyNlbHNlCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIGludAorWVlJRCAoaW50IHl5aSkKKyNlbHNlCitzdGF0aWMgaW50CitZWUlEICh5eWkpCisgICAgaW50IHl5aTsKKyNlbmRpZgoreworICByZXR1cm4geXlpOworfQorI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgeXlvdmVyZmxvdyB8fCBZWUVSUk9SX1ZFUkJPU0UKKworLyogVGhlIHBhcnNlciBpbnZva2VzIGFsbG9jYSBvciBtYWxsb2M7IGRlZmluZSB0aGUgbmVjZXNzYXJ5IHN5bWJvbHMuICAqLworCisjIGlmZGVmIFlZU1RBQ0tfVVNFX0FMTE9DQQorIyAgaWYgWVlTVEFDS19VU0VfQUxMT0NBCisjICAgaWZkZWYgX19HTlVDX18KKyMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19idWlsdGluX2FsbG9jYQorIyAgIGVsaWYgZGVmaW5lZCBfX0JVSUxUSU5fVkFfQVJHX0lOQ1IKKyMgICAgaW5jbHVkZSA8YWxsb2NhLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICBlbGlmIGRlZmluZWQgX0FJWAorIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBfX2FsbG9jYQorIyAgIGVsaWYgZGVmaW5lZCBfTVNDX1ZFUgorIyAgICBpbmNsdWRlIDxtYWxsb2MuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgICBlbHNlCisjICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQorIyAgICBpZiAhIGRlZmluZWQgX0FMTE9DQV9IICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorIyAgICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICAgIGlmbmRlZiBfU1RETElCX0gKKyMgICAgICBkZWZpbmUgX1NURExJQl9IIDEKKyMgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgWVlTVEFDS19BTExPQworICAgLyogUGFjaWZ5IEdDQydzIGBlbXB0eSBpZi1ib2R5JyB3YXJuaW5nLiAgKi8KKyMgIGRlZmluZSBZWVNUQUNLX0ZSRUUoUHRyKSBkbyB7IC8qIGVtcHR5ICovOyB9IHdoaWxlIChZWUlEICgwKSkKKyMgIGlmbmRlZiBZWVNUQUNLX0FMTE9DX01BWElNVU0KKyAgICAvKiBUaGUgT1MgbWlnaHQgZ3VhcmFudGVlIG9ubHkgb25lIGd1YXJkIHBhZ2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2ssCisgICAgICAgYW5kIGEgcGFnZSBzaXplIGNhbiBiZSBhcyBzbWFsbCBhcyA0MDk2IGJ5dGVzLiAgU28gd2UgY2Fubm90IHNhZmVseQorICAgICAgIGludm9rZSBhbGxvY2EgKE4pIGlmIE4gZXhjZWVkcyA0MDk2LiAgVXNlIGEgc2xpZ2h0bHkgc21hbGxlciBudW1iZXIKKyAgICAgICB0byBhbGxvdyBmb3IgYSBmZXcgY29tcGlsZXItYWxsb2NhdGVkIHRlbXBvcmFyeSBzdGFjayBzbG90cy4gICovCisjICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSA0MDMyIC8qIHJlYXNvbmFibGUgY2lyY2EgMjAwNiAqLworIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgWVlNQUxMT0MKKyMgIGRlZmluZSBZWVNUQUNLX0ZSRUUgWVlGUkVFCisjICBpZm5kZWYgWVlTVEFDS19BTExPQ19NQVhJTVVNCisjICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSBZWVNJWkVfTUFYSU1VTQorIyAgZW5kaWYKKyMgIGlmIChkZWZpbmVkIF9fY3BsdXNwbHVzICYmICEgZGVmaW5lZCBfU1RETElCX0ggXAorICAgICAgICYmICEgKChkZWZpbmVkIFlZTUFMTE9DIHx8IGRlZmluZWQgbWFsbG9jKSBcCisJICAgICAmJiAoZGVmaW5lZCBZWUZSRUUgfHwgZGVmaW5lZCBmcmVlKSkpCisjICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICBpZm5kZWYgX1NURExJQl9ICisjICAgIGRlZmluZSBfU1RETElCX0ggMQorIyAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZuZGVmIFlZTUFMTE9DCisjICAgZGVmaW5lIFlZTUFMTE9DIG1hbGxvYworIyAgIGlmICEgZGVmaW5lZCBtYWxsb2MgJiYgISBkZWZpbmVkIF9TVERMSUJfSCAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCit2b2lkICptYWxsb2MgKFlZU0laRV9UKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZuZGVmIFlZRlJFRQorIyAgIGRlZmluZSBZWUZSRUUgZnJlZQorIyAgIGlmICEgZGVmaW5lZCBmcmVlICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQordm9pZCBmcmVlICh2b2lkICopOyAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYgLyogISBkZWZpbmVkIHl5b3ZlcmZsb3cgfHwgWVlFUlJPUl9WRVJCT1NFICovCisKKworI2lmICghIGRlZmluZWQgeXlvdmVyZmxvdyBcCisgICAgICYmICghIGRlZmluZWQgX19jcGx1c3BsdXMgXAorCSB8fCAoZGVmaW5lZCBZWVNUWVBFX0lTX1RSSVZJQUwgJiYgWVlTVFlQRV9JU19UUklWSUFMKSkpCisKKy8qIEEgdHlwZSB0aGF0IGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIGFueSBzdGFjayBtZW1iZXIuICAqLwordW5pb24geXlhbGxvYworeworICB5eXR5cGVfaW50MTYgeXlzc19hbGxvYzsKKyAgWVlTVFlQRSB5eXZzX2FsbG9jOworfTsKKworLyogVGhlIHNpemUgb2YgdGhlIG1heGltdW0gZ2FwIGJldHdlZW4gb25lIGFsaWduZWQgc3RhY2sgYW5kIHRoZSBuZXh0LiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfR0FQX01BWElNVU0gKHNpemVvZiAodW5pb24geXlhbGxvYykgLSAxKQorCisvKiBUaGUgc2l6ZSBvZiBhbiBhcnJheSBsYXJnZSB0byBlbm91Z2ggdG8gaG9sZCBhbGwgc3RhY2tzLCBlYWNoIHdpdGgKKyAgIE4gZWxlbWVudHMuICAqLworIyBkZWZpbmUgWVlTVEFDS19CWVRFUyhOKSBcCisgICAgICgoTikgKiAoc2l6ZW9mICh5eXR5cGVfaW50MTYpICsgc2l6ZW9mIChZWVNUWVBFKSkgXAorICAgICAgKyBZWVNUQUNLX0dBUF9NQVhJTVVNKQorCisvKiBDb3B5IENPVU5UIG9iamVjdHMgZnJvbSBGUk9NIHRvIFRPLiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG8KKyAgIG5vdCBvdmVybGFwLiAgKi8KKyMgaWZuZGVmIFlZQ09QWQorIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAxIDwgX19HTlVDX18KKyMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkgXAorICAgICAgX19idWlsdGluX21lbWNweSAoVG8sIEZyb20sIChDb3VudCkgKiBzaXplb2YgKCooRnJvbSkpKQorIyAgZWxzZQorIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAorICAgICAgZG8JCQkJCVwKKwl7CQkJCQlcCisJICBZWVNJWkVfVCB5eWk7CQkJCVwKKwkgIGZvciAoeXlpID0gMDsgeXlpIDwgKENvdW50KTsgeXlpKyspCVwKKwkgICAgKFRvKVt5eWldID0gKEZyb20pW3l5aV07CQlcCisJfQkJCQkJXAorICAgICAgd2hpbGUgKFlZSUQgKDApKQorIyAgZW5kaWYKKyMgZW5kaWYKKworLyogUmVsb2NhdGUgU1RBQ0sgZnJvbSBpdHMgb2xkIGxvY2F0aW9uIHRvIHRoZSBuZXcgb25lLiAgVGhlCisgICBsb2NhbCB2YXJpYWJsZXMgWVlTSVpFIGFuZCBZWVNUQUNLU0laRSBnaXZlIHRoZSBvbGQgYW5kIG5ldyBudW1iZXIgb2YKKyAgIGVsZW1lbnRzIGluIHRoZSBzdGFjaywgYW5kIFlZUFRSIGdpdmVzIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlCisgICBzdGFjay4gIEFkdmFuY2UgWVlQVFIgdG8gYSBwcm9wZXJseSBhbGlnbmVkIGxvY2F0aW9uIGZvciB0aGUgbmV4dAorICAgc3RhY2suICAqLworIyBkZWZpbmUgWVlTVEFDS19SRUxPQ0FURShTdGFja19hbGxvYywgU3RhY2spCQkJCVwKKyAgICBkbwkJCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJWVlTSVpFX1QgeXluZXdieXRlczsJCQkJCQlcCisJWVlDT1BZICgmeXlwdHItPlN0YWNrX2FsbG9jLCBTdGFjaywgeXlzaXplKTsJCQlcCisJU3RhY2sgPSAmeXlwdHItPlN0YWNrX2FsbG9jOwkJCQkJXAorCXl5bmV3Ynl0ZXMgPSB5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKlN0YWNrKSArIFlZU1RBQ0tfR0FQX01BWElNVU07IFwKKwl5eXB0ciArPSB5eW5ld2J5dGVzIC8gc2l6ZW9mICgqeXlwdHIpOwkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIHdoaWxlIChZWUlEICgwKSkKKworI2VuZGlmCisKKy8qIFlZRklOQUwgLS0gU3RhdGUgbnVtYmVyIG9mIHRoZSB0ZXJtaW5hdGlvbiBzdGF0ZS4gICovCisjZGVmaW5lIFlZRklOQUwgIDQKKy8qIFlZTEFTVCAtLSBMYXN0IGluZGV4IGluIFlZVEFCTEUuICAqLworI2RlZmluZSBZWUxBU1QgICA1MzIKKworLyogWVlOVE9LRU5TIC0tIE51bWJlciBvZiB0ZXJtaW5hbHMuICAqLworI2RlZmluZSBZWU5UT0tFTlMgIDUzCisvKiBZWU5OVFMgLS0gTnVtYmVyIG9mIG5vbnRlcm1pbmFscy4gICovCisjZGVmaW5lIFlZTk5UUyAgNDkKKy8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBydWxlcy4gICovCisjZGVmaW5lIFlZTlJVTEVTICAxMzIKKy8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBzdGF0ZXMuICAqLworI2RlZmluZSBZWU5TVEFURVMgIDE4OAorCisvKiBZWVRSQU5TTEFURShZWUxFWCkgLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KKyNkZWZpbmUgWVlVTkRFRlRPSyAgMgorI2RlZmluZSBZWU1BWFVUT0sgICAyOTgKKworI2RlZmluZSBZWVRSQU5TTEFURShZWVgpCQkJCQkJXAorICAoKHVuc2lnbmVkIGludCkgKFlZWCkgPD0gWVlNQVhVVE9LID8geXl0cmFuc2xhdGVbWVlYXSA6IFlZVU5ERUZUT0spCisKKy8qIFlZVFJBTlNMQVRFW1lZTEVYXSAtLSBCaXNvbiBzeW1ib2wgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXRyYW5zbGF0ZVtdID0KK3sKKyAgICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgNDcsICAgIDQ5LCAgICA0OCwgICAgIDIsICAgIDQ2LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDUyLCAgICA0NCwKKyAgICAgICAyLCAgICA1MCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgIDUxLCAgICAgMiwgICAgNDUsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsCisgICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwKKyAgICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LAorICAgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzQsCisgICAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzCit9OworCisjaWYgWVlERUJVRworLyogWVlQUkhTW1lZTl0gLS0gSW5kZXggb2YgdGhlIGZpcnN0IFJIUyBzeW1ib2wgb2YgcnVsZSBudW1iZXIgWVlOIGluCisgICBZWVJIUy4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQxNiB5eXByaHNbXSA9Cit7CisgICAgICAgMCwgICAgIDAsICAgICAzLCAgICAgNSwgICAgIDgsICAgICA5LCAgICAxMiwgICAgMTMsICAgIDE4LCAgICAxOSwKKyAgICAgIDIzLCAgICAyNSwgICAgMjcsICAgIDI5LCAgICAzMSwgICAgMzQsICAgIDM3LCAgICA0MSwgICAgNDIsICAgIDQ0LAorICAgICAgNDYsICAgIDUwLCAgICA1NSwgICAgNTYsICAgIDU4LCAgICA2MCwgICAgNjMsICAgIDY1LCAgICA2NywgICAgNjksCisgICAgICA3MSwgICAgNzMsICAgIDc1LCAgICA3NywgICAgNzksICAgIDgxLCAgICA4NywgICAgOTIsICAgIDk1LCAgICA5OCwKKyAgICAgMTAxLCAgIDEwNSwgICAxMDksICAgMTEzLCAgIDExNiwgICAxMTksICAgMTIyLCAgIDEyNCwgICAxMjYsICAgMTI4LAorICAgICAxMzAsICAgMTMyLCAgIDEzNCwgICAxMzYsICAgMTM4LCAgIDE0MCwgICAxNDIsICAgMTQ0LCAgIDE0NywgICAxNDgsCisgICAgIDE1MCwgICAxNTIsICAgMTU1LCAgIDE1NywgICAxNTksICAgMTYxLCAgIDE2MywgICAxNjYsICAgMTY4LCAgIDE3MCwKKyAgICAgMTc1LCAgIDE4MCwgICAxODMsICAgMTg3LCAgIDE5MSwgICAxOTQsICAgMTk2LCAgIDE5OCwgICAyMDAsICAgMjA1LAorICAgICAyMTAsICAgMjEzLCAgIDIxNywgICAyMjEsICAgMjI0LCAgIDIyNiwgICAyMzAsICAgMjMxLCAgIDIzMywgICAyMzUsCisgICAgIDIzOSwgICAyNDIsICAgMjQ1LCAgIDI0NywgICAyNDgsICAgMjUwLCAgIDI1MiwgICAyNTcsICAgMjYyLCAgIDI2NSwKKyAgICAgMjY5LCAgIDI3MywgICAyNzcsICAgMjc4LCAgIDI4MCwgICAyODMsICAgMjg3LCAgIDI5MSwgICAyOTIsICAgMjk0LAorICAgICAyOTYsICAgMjk5LCAgIDMwMywgICAzMDYsICAgMzA3LCAgIDMwOSwgICAzMTEsICAgMzE1LCAgIDMxOCwgICAzMjEsCisgICAgIDMyMywgICAzMjYsICAgMzI3LCAgIDMzMCwgICAzMzQsICAgMzM5LCAgIDM0MSwgICAzNDUsICAgMzQ3LCAgIDM1MSwKKyAgICAgMzU0LCAgIDM1NSwgICAzNTcKK307CisKKy8qIFlZUkhTIC0tIEEgYC0xJy1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgcnVsZXMnIFJIUy4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlyaHNbXSA9Cit7CisgICAgICA1NCwgICAgIDAsICAgIC0xLCAgICA1NSwgICAgLTEsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIC0xLCAgICA1NiwKKyAgICAgIDU3LCAgICAtMSwgICAgLTEsICAgIDEyLCAgICAyMywgICAgNTgsICAgIDYwLCAgICAtMSwgICAgLTEsICAgIDIzLAorICAgICAgNTksICAgIDYwLCAgICAtMSwgICAgNjAsICAgIC0xLCAgICA4NCwgICAgLTEsICAgIDk5LCAgICAtMSwgICAxMDEsCisgICAgICAtMSwgICAgIDEsICAgIDQ0LCAgICAtMSwgICAgIDEsICAgIDQ1LCAgICAtMSwgICAgNjQsICAgIDYxLCAgICA0NCwKKyAgICAgIC0xLCAgICAtMSwgICAgNjIsICAgIC0xLCAgICA2MywgICAgLTEsICAgIDYyLCAgICA0NiwgICAgNjMsICAgIC0xLAorICAgICAgNzQsICAgMTAwLCAgICA5NSwgICAgODUsICAgIC0xLCAgICAtMSwgICAgNjUsICAgIC0xLCAgICA2NiwgICAgLTEsCisgICAgICA2NSwgICAgNjYsICAgIC0xLCAgICA2NywgICAgLTEsICAgIDY4LCAgICAtMSwgICAgIDUsICAgIC0xLCAgICAxNywKKyAgICAgIC0xLCAgICAyMSwgICAgLTEsICAgIDExLCAgICAtMSwgICAgMTQsICAgIC0xLCAgICA2OSwgICAgLTEsICAgIDczLAorICAgICAgLTEsICAgIDI4LCAgICA0NywgICAgNjUsICAgIDQ4LCAgICA0OSwgICAgLTEsICAgIDI4LCAgICA0NywgICAgNjUsCisgICAgICA0OSwgICAgLTEsICAgIDIyLCAgICAzNywgICAgLTEsICAgIDI0LCAgICAzNywgICAgLTEsICAgIDEwLCAgICAzNywKKyAgICAgIC0xLCAgICAyMiwgICAgMzcsICAgIDg3LCAgICAtMSwgICAgMjQsICAgIDM3LCAgICA4NywgICAgLTEsICAgIDEwLAorICAgICAgMzcsICAgIDk2LCAgICAtMSwgICAgMTAsICAgIDk2LCAgICAtMSwgICAgMjIsICAgIDg3LCAgICAtMSwgICAgMjQsCisgICAgICA4NywgICAgLTEsICAgICA3LCAgICAtMSwgICAgMTksICAgIC0xLCAgICAxNSwgICAgLTEsICAgIDE2LCAgICAtMSwKKyAgICAgIDIwLCAgICAtMSwgICAgMjUsICAgIC0xLCAgICAxMywgICAgLTEsICAgICA5LCAgICAtMSwgICAgMjYsICAgIC0xLAorICAgICAgIDYsICAgIC0xLCAgICA0MSwgICAgLTEsICAgIDQ4LCAgICA3MSwgICAgLTEsICAgIC0xLCAgICA3MiwgICAgLTEsCisgICAgICA3MywgICAgLTEsICAgIDcyLCAgICA3MywgICAgLTEsICAgICA4LCAgICAtMSwgICAgMjcsICAgIC0xLCAgICAzMSwKKyAgICAgIC0xLCAgICAxOCwgICAgLTEsICAgIDcwLCAgICA3NCwgICAgLTEsICAgIDc1LCAgICAtMSwgICAgMzcsICAgIC0xLAorICAgICAgNzUsICAgIDQ3LCAgICA3OCwgICAgNDksICAgIC0xLCAgICA3NSwgICAgNDcsICAgICAxLCAgICA0OSwgICAgLTEsCisgICAgICA3NSwgICAgMzMsICAgIC0xLCAgICA0NywgICAgNzQsICAgIDQ5LCAgICAtMSwgICAgNDcsICAgICAxLCAgICA0OSwKKyAgICAgIC0xLCAgICA3MCwgICAgNzYsICAgIC0xLCAgICA3NywgICAgLTEsICAgIDM3LCAgICAtMSwgICAgNDEsICAgIC0xLAorICAgICAgNzcsICAgIDQ3LCAgICA3OCwgICAgNDksICAgIC0xLCAgICA3NywgICAgNDcsICAgICAxLCAgICA0OSwgICAgLTEsCisgICAgICA3NywgICAgMzMsICAgIC0xLCAgICA0NywgICAgNzYsICAgIDQ5LCAgICAtMSwgICAgNDcsICAgICAxLCAgICA0OSwKKyAgICAgIC0xLCAgICA3OSwgICAgMzYsICAgIC0xLCAgICA3OSwgICAgLTEsICAgIDgwLCAgICA0NiwgICAgMzYsICAgIC0xLAorICAgICAgLTEsICAgIDgwLCAgICAtMSwgICAgODEsICAgIC0xLCAgICA4MCwgICAgNDYsICAgIDgxLCAgICAtMSwgICAgNjUsCisgICAgICA4MiwgICAgLTEsICAgIDcwLCAgICA4MiwgICAgLTEsICAgIDgzLCAgICAtMSwgICAgLTEsICAgIDM3LCAgICAtMSwKKyAgICAgIDQxLCAgICAtMSwgICAgODMsICAgIDQ3LCAgICA3OCwgICAgNDksICAgIC0xLCAgICA4MywgICAgNDcsICAgICAxLAorICAgICAgNDksICAgIC0xLCAgICA4MywgICAgMzMsICAgIC0xLCAgICA0NywgICAgODIsICAgIDQ5LCAgICAtMSwgICAgNDcsCisgICAgICAgMSwgICAgNDksICAgIC0xLCAgICA2NCwgICAgNzQsICAgIDMyLCAgICAtMSwgICAgLTEsICAgIDg2LCAgICAtMSwKKyAgICAgIDUwLCAgICAzNCwgICAgLTEsICAgIDUxLCAgICA4OCwgICAgNDUsICAgIC0xLCAgICA1MSwgICAgIDEsICAgIDQ1LAorICAgICAgLTEsICAgIC0xLCAgICA4OSwgICAgLTEsICAgIDkwLCAgICAtMSwgICAgODksICAgIDkwLCAgICAtMSwgICAgNjQsCisgICAgICA5MSwgICAgNDQsICAgIC0xLCAgICAgMSwgICAgNDQsICAgIC0xLCAgICAtMSwgICAgOTIsICAgIC0xLCAgICA5MywKKyAgICAgIC0xLCAgICA5MiwgICAgNDYsICAgIDkzLCAgICAtMSwgICAgNzYsICAgIDk1LCAgICAtMSwgICAgMzcsICAgIDk0LAorICAgICAgLTEsICAgIDk0LCAgICAtMSwgICAgNTIsICAgIDM0LCAgICAtMSwgICAgLTEsICAgIDk1LCAgICAzMSwgICAgLTEsCisgICAgICA1MSwgICAgOTcsICAgIDQ1LCAgICAtMSwgICAgNTEsICAgIDk3LCAgICA0NiwgICAgNDUsICAgIC0xLCAgICA5OCwKKyAgICAgIC0xLCAgICA5NywgICAgNDYsICAgIDk4LCAgICAtMSwgICAgMzcsICAgIC0xLCAgICAzNywgICAgNTAsICAgIDM0LAorICAgICAgLTEsICAgIDMwLCAgICA0NCwgICAgLTEsICAgIC0xLCAgICAzMCwgICAgLTEsICAgIDI5LCAgICA0NywgICAgMzcsCisgICAgICA0OSwgICAgNDQsICAgIC0xCit9OworCisvKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5cmxpbmVbXSA9Cit7CisgICAgICAgMCwgICAxMDQsICAgMTA0LCAgIDEwNSwgICAxMDksICAgMTA5LCAgIDExNSwgICAxMTUsICAgMTE3LCAgIDExNywKKyAgICAgMTE5LCAgIDEyMCwgICAxMjEsICAgMTIyLCAgIDEyMywgICAxMjQsICAgMTI4LCAgIDE0MiwgICAxNDMsICAgMTQ3LAorICAgICAxNTUsICAgMTY4LCAgIDE3NCwgICAxNzUsICAgMTc5LCAgIDE4MCwgICAxODQsICAgMTkwLCAgIDE5NCwgICAxOTUsCisgICAgIDE5NiwgICAxOTcsICAgMTk4LCAgIDIwMiwgICAyMDMsICAgMjA0LCAgIDIwNSwgICAyMDksICAgMjExLCAgIDIxMywKKyAgICAgMjE3LCAgIDIyNCwgICAyMzEsICAgMjQxLCAgIDI0NCwgICAyNDUsICAgMjQ5LCAgIDI1MCwgICAyNTEsICAgMjUyLAorICAgICAyNTMsICAgMjU0LCAgIDI1NSwgICAyNTYsICAgMjU3LCAgIDI1OCwgICAyNTksICAgMjYzLCAgIDI2OCwgICAyNjksCisgICAgIDI3MywgICAyNzQsICAgMjc4LCAgIDI3OCwgICAyNzgsICAgMjc5LCAgIDI4NywgICAyODgsICAgMjkyLCAgIDMwMSwKKyAgICAgMzAzLCAgIDMwNSwgICAzMDcsICAgMzA5LCAgIDMxNiwgICAzMTcsICAgMzIxLCAgIDMyMiwgICAzMjMsICAgMzI1LAorICAgICAzMjcsICAgMzI5LCAgIDMzMSwgICAzMzYsICAgMzM3LCAgIDMzOCwgICAzNDIsICAgMzQzLCAgIDM0NywgICAzNDgsCisgICAgIDM1MywgICAzNTgsICAgMzYwLCAgIDM2NCwgICAzNjUsICAgMzczLCAgIDM3NywgICAzNzksICAgMzgxLCAgIDM4MywKKyAgICAgMzg1LCAgIDM5MCwgICAzOTksICAgNDAwLCAgIDQwNSwgICA0MTAsICAgNDExLCAgIDQxNSwgICA0MTYsICAgNDIwLAorICAgICA0MjEsICAgNDI1LCAgIDQyNywgICA0MzIsICAgNDMzLCAgIDQzNywgICA0MzgsICAgNDQyLCAgIDQ0MywgICA0NDQsCisgICAgIDQ0OCwgICA0NTIsICAgNDUzLCAgIDQ1NywgICA0NTgsICAgNDYyLCAgIDQ2MywgICA0NjYsICAgNDcxLCAgIDQ3OSwKKyAgICAgNDgzLCAgIDQ4NCwgICA0ODgKK307CisjZW5kaWYKKworI2lmIFlZREVCVUcgfHwgWVlFUlJPUl9WRVJCT1NFIHx8IFlZVE9LRU5fVEFCTEUKKy8qIFlZVE5BTUVbU1lNQk9MLU5VTV0gLS0gU3RyaW5nIG5hbWUgb2YgdGhlIHN5bWJvbCBTWU1CT0wtTlVNLgorICAgRmlyc3QsIHRoZSB0ZXJtaW5hbHMsIHRoZW4sIHN0YXJ0aW5nIGF0IFlZTlRPS0VOUywgbm9udGVybWluYWxzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB5eXRuYW1lW10gPQoreworICAiJGVuZCIsICJlcnJvciIsICIkdW5kZWZpbmVkIiwgIkFTTV9LRVlXIiwgIkFUVFJJQlVURV9LRVlXIiwKKyAgIkFVVE9fS0VZVyIsICJCT09MX0tFWVciLCAiQ0hBUl9LRVlXIiwgIkNPTlNUX0tFWVciLCAiRE9VQkxFX0tFWVciLAorICAiRU5VTV9LRVlXIiwgIkVYVEVSTl9LRVlXIiwgIkVYVEVOU0lPTl9LRVlXIiwgIkZMT0FUX0tFWVciLAorICAiSU5MSU5FX0tFWVciLCAiSU5UX0tFWVciLCAiTE9OR19LRVlXIiwgIlJFR0lTVEVSX0tFWVciLCAiUkVTVFJJQ1RfS0VZVyIsCisgICJTSE9SVF9LRVlXIiwgIlNJR05FRF9LRVlXIiwgIlNUQVRJQ19LRVlXIiwgIlNUUlVDVF9LRVlXIiwKKyAgIlRZUEVERUZfS0VZVyIsICJVTklPTl9LRVlXIiwgIlVOU0lHTkVEX0tFWVciLCAiVk9JRF9LRVlXIiwKKyAgIlZPTEFUSUxFX0tFWVciLCAiVFlQRU9GX0tFWVciLCAiRVhQT1JUX1NZTUJPTF9LRVlXIiwgIkFTTV9QSFJBU0UiLAorICAiQVRUUklCVVRFX1BIUkFTRSIsICJCUkFDRV9QSFJBU0UiLCAiQlJBQ0tFVF9QSFJBU0UiLAorICAiRVhQUkVTU0lPTl9QSFJBU0UiLCAiQ0hBUiIsICJET1RTIiwgIklERU5UIiwgIklOVCIsICJSRUFMIiwgIlNUUklORyIsCisgICJUWVBFIiwgIk9USEVSIiwgIkZJTEVOQU1FIiwgIic7JyIsICInfSciLCAiJywnIiwgIicoJyIsICInKiciLCAiJyknIiwKKyAgIic9JyIsICIneyciLCAiJzonIiwgIiRhY2NlcHQiLCAiZGVjbGFyYXRpb25fc2VxIiwgImRlY2xhcmF0aW9uIiwgIiRAMSIsCisgICJkZWNsYXJhdGlvbjEiLCAiJEAyIiwgIiRAMyIsICJzaW1wbGVfZGVjbGFyYXRpb24iLAorICAiaW5pdF9kZWNsYXJhdG9yX2xpc3Rfb3B0IiwgImluaXRfZGVjbGFyYXRvcl9saXN0IiwgImluaXRfZGVjbGFyYXRvciIsCisgICJkZWNsX3NwZWNpZmllcl9zZXFfb3B0IiwgImRlY2xfc3BlY2lmaWVyX3NlcSIsICJkZWNsX3NwZWNpZmllciIsCisgICJzdG9yYWdlX2NsYXNzX3NwZWNpZmllciIsICJ0eXBlX3NwZWNpZmllciIsICJzaW1wbGVfdHlwZV9zcGVjaWZpZXIiLAorICAicHRyX29wZXJhdG9yIiwgImN2YXJfcXVhbGlmaWVyX3NlcV9vcHQiLCAiY3Zhcl9xdWFsaWZpZXJfc2VxIiwKKyAgImN2YXJfcXVhbGlmaWVyIiwgImRlY2xhcmF0b3IiLCAiZGlyZWN0X2RlY2xhcmF0b3IiLCAibmVzdGVkX2RlY2xhcmF0b3IiLAorICAiZGlyZWN0X25lc3RlZF9kZWNsYXJhdG9yIiwgInBhcmFtZXRlcl9kZWNsYXJhdGlvbl9jbGF1c2UiLAorICAicGFyYW1ldGVyX2RlY2xhcmF0aW9uX2xpc3Rfb3B0IiwgInBhcmFtZXRlcl9kZWNsYXJhdGlvbl9saXN0IiwKKyAgInBhcmFtZXRlcl9kZWNsYXJhdGlvbiIsICJtX2Fic3RyYWN0X2RlY2xhcmF0b3IiLAorICAiZGlyZWN0X21fYWJzdHJhY3RfZGVjbGFyYXRvciIsICJmdW5jdGlvbl9kZWZpbml0aW9uIiwgImluaXRpYWxpemVyX29wdCIsCisgICJpbml0aWFsaXplciIsICJjbGFzc19ib2R5IiwgIm1lbWJlcl9zcGVjaWZpY2F0aW9uX29wdCIsCisgICJtZW1iZXJfc3BlY2lmaWNhdGlvbiIsICJtZW1iZXJfZGVjbGFyYXRpb24iLAorICAibWVtYmVyX2RlY2xhcmF0b3JfbGlzdF9vcHQiLCAibWVtYmVyX2RlY2xhcmF0b3JfbGlzdCIsCisgICJtZW1iZXJfZGVjbGFyYXRvciIsICJtZW1iZXJfYml0ZmllbGRfZGVjbGFyYXRvciIsICJhdHRyaWJ1dGVfb3B0IiwKKyAgImVudW1fYm9keSIsICJlbnVtZXJhdG9yX2xpc3QiLCAiZW51bWVyYXRvciIsICJhc21fZGVmaW5pdGlvbiIsCisgICJhc21fcGhyYXNlX29wdCIsICJleHBvcnRfZGVmaW5pdGlvbiIsIDAKK307CisjZW5kaWYKKworIyBpZmRlZiBZWVBSSU5UCisvKiBZWVRPS05VTVtZWUxFWC1OVU1dIC0tIEludGVybmFsIHRva2VuIG51bWJlciBjb3JyZXNwb25kaW5nIHRvCisgICB0b2tlbiBZWUxFWC1OVU0uICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV91aW50MTYgeXl0b2tudW1bXSA9Cit7CisgICAgICAgMCwgICAyNTYsICAgMjU3LCAgIDI1OCwgICAyNTksICAgMjYwLCAgIDI2MSwgICAyNjIsICAgMjYzLCAgIDI2NCwKKyAgICAgMjY1LCAgIDI2NiwgICAyNjcsICAgMjY4LCAgIDI2OSwgICAyNzAsICAgMjcxLCAgIDI3MiwgICAyNzMsICAgMjc0LAorICAgICAyNzUsICAgMjc2LCAgIDI3NywgICAyNzgsICAgMjc5LCAgIDI4MCwgICAyODEsICAgMjgyLCAgIDI4MywgICAyODQsCisgICAgIDI4NSwgICAyODYsICAgMjg3LCAgIDI4OCwgICAyODksICAgMjkwLCAgIDI5MSwgICAyOTIsICAgMjkzLCAgIDI5NCwKKyAgICAgMjk1LCAgIDI5NiwgICAyOTcsICAgMjk4LCAgICA1OSwgICAxMjUsICAgIDQ0LCAgICA0MCwgICAgNDIsICAgIDQxLAorICAgICAgNjEsICAgMTIzLCAgICA1OAorfTsKKyMgZW5kaWYKKworLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gICovCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjFbXSA9Cit7CisgICAgICAgMCwgICAgNTMsICAgIDU0LCAgICA1NCwgICAgNTYsICAgIDU1LCAgICA1OCwgICAgNTcsICAgIDU5LCAgICA1NywKKyAgICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDYwLCAgICA2MSwgICAgNjEsICAgIDYyLAorICAgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjQsICAgIDY1LCAgICA2NSwgICAgNjYsICAgIDY2LCAgICA2NywgICAgNjcsCisgICAgICA2NywgICAgNjcsICAgIDY3LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwKKyAgICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY5LCAgICA2OSwgICAgNjksICAgIDY5LAorICAgICAgNjksICAgIDY5LCAgICA2OSwgICAgNjksICAgIDY5LCAgICA2OSwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzEsCisgICAgICA3MiwgICAgNzIsICAgIDczLCAgICA3MywgICAgNzMsICAgIDczLCAgICA3NCwgICAgNzQsICAgIDc1LCAgICA3NSwKKyAgICAgIDc1LCAgICA3NSwgICAgNzUsICAgIDc1LCAgICA3NiwgICAgNzYsICAgIDc3LCAgICA3NywgICAgNzcsICAgIDc3LAorICAgICAgNzcsICAgIDc3LCAgICA3NywgICAgNzgsICAgIDc4LCAgICA3OCwgICAgNzksICAgIDc5LCAgICA4MCwgICAgODAsCisgICAgICA4MSwgICAgODIsICAgIDgyLCAgICA4MywgICAgODMsICAgIDgzLCAgICA4MywgICAgODMsICAgIDgzLCAgICA4MywKKyAgICAgIDgzLCAgICA4NCwgICAgODUsICAgIDg1LCAgICA4NiwgICAgODcsICAgIDg3LCAgICA4OCwgICAgODgsICAgIDg5LAorICAgICAgODksICAgIDkwLCAgICA5MCwgICAgOTEsICAgIDkxLCAgICA5MiwgICAgOTIsICAgIDkzLCAgICA5MywgICAgOTMsCisgICAgICA5NCwgICAgOTUsICAgIDk1LCAgICA5NiwgICAgOTYsICAgIDk3LCAgICA5NywgICAgOTgsICAgIDk4LCAgICA5OSwKKyAgICAgMTAwLCAgIDEwMCwgICAxMDEKK307CisKKy8qIFlZUjJbWVlOXSAtLSBOdW1iZXIgb2Ygc3ltYm9scyBjb21wb3NpbmcgcmlnaHQgaGFuZCBzaWRlIG9mIHJ1bGUgWVlOLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlyMltdID0KK3sKKyAgICAgICAwLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMCwgICAgIDIsICAgICAwLCAgICAgNCwgICAgIDAsICAgICAzLAorICAgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMiwgICAgIDMsICAgICAwLCAgICAgMSwgICAgIDEsCisgICAgICAgMywgICAgIDQsICAgICAwLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDUsICAgICA0LCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDMsICAgICAzLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsCisgICAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAwLCAgICAgMSwKKyAgICAgICAxLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDEsICAgICA0LAorICAgICAgIDQsICAgICAyLCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgNCwgICAgIDQsCisgICAgICAgMiwgICAgIDMsICAgICAzLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMywKKyAgICAgICAyLCAgICAgMiwgICAgIDEsICAgICAwLCAgICAgMSwgICAgIDEsICAgICA0LCAgICAgNCwgICAgIDIsICAgICAzLAorICAgICAgIDMsICAgICAzLCAgICAgMCwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDMsICAgICAwLCAgICAgMSwgICAgIDEsCisgICAgICAgMiwgICAgIDMsICAgICAyLCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMSwKKyAgICAgICAyLCAgICAgMCwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAyLAorICAgICAgIDAsICAgICAxLCAgICAgNQorfTsKKworLyogWVlERUZBQ1RbU1RBVEUtTkFNRV0gLS0gRGVmYXVsdCBydWxlIHRvIHJlZHVjZSB3aXRoIGluIHN0YXRlCisgICBTVEFURS1OVU0gd2hlbiBZWVRBQkxFIGRvZXNuJ3Qgc3BlY2lmeSBzb21ldGhpbmcgZWxzZSB0byBkby4gIFplcm8KKyAgIG1lYW5zIHRoZSBkZWZhdWx0IGlzIGFuIGVycm9yLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlkZWZhY3RbXSA9Cit7CisgICAgICAgNCwgICAgIDQsICAgICAyLCAgICAgMCwgICAgIDEsICAgICAzLCAgICAgMCwgICAgMjgsICAgIDU1LCAgICA0NiwKKyAgICAgIDYyLCAgICA1MywgICAgIDAsICAgIDMxLCAgICAgMCwgICAgNTIsICAgIDMyLCAgICA0OCwgICAgNDksICAgIDI5LAorICAgICAgNjUsICAgIDQ3LCAgICA1MCwgICAgMzAsICAgICAwLCAgICAgOCwgICAgIDAsICAgIDUxLCAgICA1NCwgICAgNjMsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICA2NCwgICAgNTYsICAgICA1LCAgICAxMCwgICAgMTcsICAgIDIzLCAgICAyNCwKKyAgICAgIDI2LCAgICAyNywgICAgMzMsICAgIDM0LCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDM5LAorICAgICAgIDAsICAgIDQzLCAgICAgNiwgICAgMzcsICAgICAwLCAgICA0NCwgICAgMjIsICAgIDM4LCAgICA0NSwgICAgIDAsCisgICAgICAgMCwgICAxMjksICAgIDY4LCAgICAgMCwgICAgNTgsICAgICAwLCAgICAxOCwgICAgMTksICAgICAwLCAgIDEzMCwKKyAgICAgIDY3LCAgICAyNSwgICAgNDIsICAgMTI3LCAgICAgMCwgICAxMjUsICAgIDIyLCAgICA0MCwgICAgIDAsICAgMTEzLAorICAgICAgIDAsICAgICAwLCAgIDEwOSwgICAgIDksICAgIDE3LCAgICA0MSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICA1NywgICAgNTksICAgIDYwLCAgICAxNiwgICAgIDAsICAgIDY2LCAgIDEzMSwgICAxMDEsICAgMTIxLCAgICA3MSwKKyAgICAgICAwLCAgICAgMCwgICAxMjMsICAgICAwLCAgICAgNywgICAxMTIsICAgMTA2LCAgICA3NiwgICAgNzcsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgIDEyMSwgICAgNzUsICAgICAwLCAgIDExNCwgICAxMTUsICAgMTE5LCAgIDEwNSwgICAgIDAsCisgICAgIDExMCwgICAxMzAsICAgICAwLCAgICAzNiwgICAgIDAsICAgIDczLCAgICA3MiwgICAgNjEsICAgIDIwLCAgIDEwMiwKKyAgICAgICAwLCAgICA5MywgICAgIDAsICAgIDg0LCAgICA4NywgICAgODgsICAgMTI4LCAgIDEyNCwgICAxMjYsICAgMTE4LAorICAgICAgIDAsICAgIDc2LCAgICAgMCwgICAxMjAsICAgIDc0LCAgIDExNywgICAgODAsICAgICAwLCAgIDExMSwgICAgIDAsCisgICAgICAzNSwgICAxMzIsICAgMTIyLCAgICAgMCwgICAgMjEsICAgMTAzLCAgICA3MCwgICAgOTQsICAgIDU2LCAgICAgMCwKKyAgICAgIDkzLCAgICA5MCwgICAgOTIsICAgIDY5LCAgICA4MywgICAgIDAsICAgIDgyLCAgICA4MSwgICAgIDAsICAgICAwLAorICAgICAxMTYsICAgMTA0LCAgICAgMCwgICAgOTUsICAgICAwLCAgICA5MSwgICAgOTgsICAgICAwLCAgICA4NSwgICAgODksCisgICAgICA3OSwgICAgNzgsICAgMTAwLCAgICA5OSwgICAgIDAsICAgICAwLCAgICA5NywgICAgOTYKK307CisKKy8qIFlZREVGR09UT1tOVEVSTS1OVU1dLiAgKi8KK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXlkZWZnb3RvW10gPQoreworICAgICAgLTEsICAgICAxLCAgICAgMiwgICAgIDMsICAgIDM1LCAgICA3NiwgICAgNTYsICAgIDM2LCAgICA2NSwgICAgNjYsCisgICAgICA2NywgICAgNzksICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNjgsICAgIDkwLCAgICA5MSwKKyAgICAgIDQzLCAgIDEyMSwgICAgNzAsICAgMTEyLCAgIDExMywgICAxMzIsICAgMTMzLCAgIDEzNCwgICAxMzUsICAgMTYxLAorICAgICAxNjIsICAgIDQ0LCAgIDE1NCwgICAxNTUsICAgIDU1LCAgICA4MCwgICAgODEsICAgIDgyLCAgIDExNCwgICAxMTUsCisgICAgIDExNiwgICAxMTcsICAgMTI5LCAgICA1MSwgICAgNzQsICAgIDc1LCAgICA0NSwgICAgOTgsICAgIDQ2Cit9OworCisvKiBZWVBBQ1RbU1RBVEUtTlVNXSAtLSBJbmRleCBpbiBZWVRBQkxFIG9mIHRoZSBwb3J0aW9uIGRlc2NyaWJpbmcKKyAgIFNUQVRFLU5VTS4gICovCisjZGVmaW5lIFlZUEFDVF9OSU5GIC0xMzUKK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXlwYWN0W10gPQoreworICAgIC0xMzUsICAgIDIwLCAgLTEzNSwgICAzMjEsICAtMTM1LCAgLTEzNSwgICAgMzAsICAtMTM1LCAgLTEzNSwgIC0xMzUsCisgICAgLTEzNSwgIC0xMzUsICAgLTI4LCAgLTEzNSwgICAgIDIsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwKKyAgICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgICAtNiwgIC0xMzUsICAgICA5LCAgLTEzNSwgIC0xMzUsICAtMTM1LAorICAgICAgLTUsICAgIDE1LCAgIC0xNywgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgIDE4LCAgIDQ5MSwgIC0xMzUsCisgICAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgIC0yMiwKKyAgICAgIDMxLCAgLTEzNSwgIC0xMzUsICAgIDE5LCAgIDEwNiwgIC0xMzUsICAgNDkxLCAgICAxOSwgIC0xMzUsICAgNDkxLAorICAgICAgNTAsICAtMTM1LCAgLTEzNSwgICAgMTEsICAgIC0zLCAgICA1MSwgICAgNTcsICAtMTM1LCAgICAxOCwgICAtMTQsCisgICAgICAxNCwgIC0xMzUsICAtMTM1LCAgICA0OCwgICAgNDYsICAtMTM1LCAgIDQ5MSwgIC0xMzUsICAgIDMzLCAgICAzMiwKKyAgICAgIDU5LCAgIDE1NCwgIC0xMzUsICAtMTM1LCAgICAxOCwgIC0xMzUsICAgMzY1LCAgICA1NiwgICAgNjAsICAgIDYxLAorICAgIC0xMzUsICAgIC0zLCAgLTEzNSwgIC0xMzUsICAgIDE4LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsCisgICAgIDIwMiwgICAgNzQsICAtMTM1LCAgIC0yMywgIC0xMzUsICAtMTM1LCAgLTEzNSwgICAgNzcsICAtMTM1LCAgICAxNiwKKyAgICAgMTAxLCAgICA0OSwgIC0xMzUsICAgIDM0LCAgICA5MiwgICAgOTMsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgIDk0LAorICAgIC0xMzUsICAgMTEwLCAgICA5NSwgIC0xMzUsICAgIDk3LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgICAtMjAsCisgICAgICA5NiwgICA0MTAsICAgIDk5LCAgIDExMywgICAxMDAsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwKKyAgICAgMTAzLCAgLTEzNSwgICAxMDcsICAtMTM1LCAgLTEzNSwgICAxMTEsICAtMTM1LCAgIDIzOSwgIC0xMzUsICAgIDMyLAorICAgIC0xMzUsICAtMTM1LCAgLTEzNSwgICAxMjMsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAtMTM1LCAgLTEzNSwgICAgIDMsCisgICAgICA1MiwgIC0xMzUsICAgIDM4LCAgLTEzNSwgIC0xMzUsICAgNDU0LCAgLTEzNSwgIC0xMzUsICAgMTE3LCAgIDEyOCwKKyAgICAtMTM1LCAgLTEzNSwgICAxMzQsICAtMTM1LCAgIDEzNSwgIC0xMzUsICAtMTM1LCAgIDI3NiwgIC0xMzUsICAtMTM1LAorICAgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgMTM3LCAgIDEzOCwgIC0xMzUsICAtMTM1Cit9OworCisvKiBZWVBHT1RPW05URVJNLU5VTV0uICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQxNiB5eXBnb3RvW10gPQoreworICAgIC0xMzUsICAtMTM1LCAgIDE4NywgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgLTUwLCAgLTEzNSwgIC0xMzUsCisgICAgICA5OCwgICAgIDAsICAgLTU5LCAgIC0zNywgIC0xMzUsICAtMTM1LCAgLTEzNSwgICAtNzcsICAtMTM1LCAgLTEzNSwKKyAgICAgLTU0LCAgIC0zMCwgIC0xMzUsICAgLTkwLCAgLTEzNSwgIC0xMzQsICAtMTM1LCAgLTEzNSwgICAgMjQsICAgLTU4LAorICAgIC0xMzUsICAtMTM1LCAgLTEzNSwgIC0xMzUsICAgLTE4LCAgLTEzNSwgIC0xMzUsICAgMTA5LCAgLTEzNSwgIC0xMzUsCisgICAgICA0NCwgICAgODcsICAgIDg0LCAgIDE0OCwgIC0xMzUsICAgMTAyLCAgLTEzNSwgIC0xMzUsICAtMTM1Cit9OworCisvKiBZWVRBQkxFW1lZUEFDVFtTVEFURS1OVU1dXS4gIFdoYXQgdG8gZG8gaW4gc3RhdGUgU1RBVEUtTlVNLiAgSWYKKyAgIHBvc2l0aXZlLCBzaGlmdCB0aGF0IHRva2VuLiAgSWYgbmVnYXRpdmUsIHJlZHVjZSB0aGUgcnVsZSB3aGljaAorICAgbnVtYmVyIGlzIHRoZSBvcHBvc2l0ZS4gIElmIHplcm8sIGRvIHdoYXQgWVlERUZBQ1Qgc2F5cy4KKyAgIElmIFlZVEFCTEVfTklORiwgc3ludGF4IGVycm9yLiAgKi8KKyNkZWZpbmUgWVlUQUJMRV9OSU5GIC0xMDkKK3N0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXl0YWJsZVtdID0KK3sKKyAgICAgIDg2LCAgICA3MSwgICAxMTEsICAgIDM3LCAgIDE3MiwgICAgMTAsICAgIDgzLCAgICA2OSwgICAgNTgsICAgIDQ5LAorICAgICAgOTIsICAgMTUyLCAgICA4OCwgICAxNjksICAgIDczLCAgICAyMCwgICAgOTYsICAgMTQwLCAgICA5NywgICAxNDIsCisgICAgICAgNCwgICAxNDQsICAgMTM3LCAgICA1MCwgICAgMjksICAgIDUyLCAgIDEwNCwgICAgNjEsICAgIDMzLCAgICA1MCwKKyAgICAgMTUzLCAgICA1MywgICAxMTEsICAgIDg5LCAgIDExMSwgICAgNzcsICAgLTkzLCAgIDEyNywgICAgOTUsICAgIDg1LAorICAgICAxNTcsICAgMTMxLCAgICA1OSwgICAxODUsICAgMTczLCAgICA1NCwgICAgNTcsICAgIDk5LCAgICA2MiwgICAgNzEsCisgICAgIDE1OSwgICAgNjQsICAgLTkzLCAgIDE0MSwgICAxNjAsICAgIDYyLCAgICA4NCwgICAxMDgsICAgIDYzLCAgICA2NCwKKyAgICAgIDU0LCAgIDEwMCwgICAgNjAsICAgMTA5LCAgICA2NCwgICAgNjMsICAgIDY0LCAgIDE0NiwgICAgNzMsICAgMTA3LAorICAgICAgNTQsICAgMTc2LCAgIDExMSwgICAxMDgsICAgIDQ3LCAgICA0OCwgICAgODQsICAgMTA1LCAgIDEwNiwgICAxMDksCisgICAgICA2NCwgICAxNDcsICAgMTYwLCAgIDE2MCwgICAxMTAsICAgMTc3LCAgIDE0MSwgICAgODcsICAgMTMxLCAgIDE1NywKKyAgICAgMTA4LCAgIDEwMiwgICAxMDMsICAgMTczLCAgICA3MSwgICAgOTMsICAgMTA5LCAgICA2NCwgICAxMDEsICAgMTU5LAorICAgICAgNjQsICAgMTc0LCAgIDE3NSwgICAgOTQsICAgMTE4LCAgIDEyNCwgICAxMzEsICAgIDc4LCAgIDEzNiwgICAxMjUsCisgICAgIDEyNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgMTMxLCAgICAxNSwKKyAgICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgMTEwLAorICAgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgIDE0MywgICAxNDgsICAgIDMzLCAgIDEwNSwgICAxNDksCisgICAgICA5NiwgICAxNTEsICAgMTUyLCAgIC0yMiwgICAxNTAsICAgMTU2LCAgIDE2NSwgICAgMzQsICAgMTYzLCAgIDE2NCwKKyAgICAgLTIyLCAgLTEwNywgICAxNjYsICAgLTIyLCAgIC0yMiwgICAxMTksICAgMTY3LCAgIDE3MSwgICAtMjIsICAgICA3LAorICAgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAxODAsICAgIDE1LCAgICAxNiwgICAgMTcsCisgICAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAxODEsICAgIDI2LCAgICAyNywKKyAgICAgIDI4LCAgICAyOSwgICAgMzAsICAgMTgyLCAgIDE4MywgICAgMzMsICAgMTg2LCAgIDE4NywgICAgIDUsICAgMTc5LAorICAgICAxMjAsICAgLTIyLCAgIDEyOCwgICAxNzAsICAgMTM5LCAgICAzNCwgICAxNDUsICAgIDcyLCAgIC0yMiwgIC0xMDgsCisgICAgICAgMCwgICAtMjIsICAgLTIyLCAgIDEzMCwgICAgIDAsICAgMTM4LCAgIC0yMiwgICAgIDcsICAgICA4LCAgICAgOSwKKyAgICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAgMCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAorICAgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAgMCwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksCisgICAgICAzMCwgICAgIDAsICAgICAwLCAgICAzMywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgLTg2LCAgICAgMCwKKyAgICAgMTY4LCAgICAgMCwgICAgIDAsICAgIDM0LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLAorICAgICAgMTMsICAgLTg2LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsCisgICAgICAyMywgICAgMjQsICAgICAwLCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgICAwLCAgICAgMCwKKyAgICAgIDMzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAtODYsICAgICAwLCAgIDE4NCwgICAgIDAsICAgICAwLAorICAgICAgMzQsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgIC04NiwgICAgMTUsCisgICAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAgMCwKKyAgICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgIDAsICAgICAwLCAgICAzMywgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgIC04NiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDM0LCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICA2LCAgICAgMCwgICAgIDAsICAgLTg2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKKyAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsCisgICAgICAzMSwgICAgMzIsICAgIDMzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgLTIyLCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgMzQsICAgICAwLCAgICAgMCwgICAtMjIsICAgICAwLCAgICAgMCwgICAtMjIsICAgLTIyLAorICAgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgICAwLCAgICAxNSwgICAgMTYsCisgICAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgICAwLCAgICAyNiwKKyAgICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAgMCwgICAgIDAsICAgIDMzLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzQsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgIDEyMiwgICAxMjMsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwKKyAgICAgIDEyLCAgICAxMywgICAgIDAsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLAorICAgICAgMjIsICAgIDIzLCAgICAyNCwgICAgIDAsICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgIDAsCisgICAgICAgMCwgICAgMzMsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxNTcsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgIDE1OCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE1OSwgICAgNjQsICAgICA3LAorICAgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgIDAsICAgIDE1LCAgICAxNiwgICAgMTcsCisgICAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgIDAsICAgIDI2LCAgICAyNywKKyAgICAgIDI4LCAgICAyOSwgICAgMzAsICAgICAwLCAgICAgMCwgICAgMzMsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAxNzgsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAzNCwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsCisgICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAgMCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwKKyAgICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAgMCwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLAorICAgICAgIDAsICAgICAwLCAgICAzMywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgIDM0Cit9OworCitzdGF0aWMgY29uc3QgeXl0eXBlX2ludDE2IHl5Y2hlY2tbXSA9Cit7CisgICAgICA1OSwgICAgMzgsICAgIDc5LCAgICAgMywgICAgIDEsICAgICA4LCAgICA1NiwgICAgMzcsICAgIDI2LCAgICAzNywKKyAgICAgIDY0LCAgICAzMSwgICAgIDEsICAgMTQ3LCAgICAzNywgICAgMTgsICAgIDMwLCAgICAgMSwgICAgMzIsICAgMTA5LAorICAgICAgIDAsICAgMTExLCAgICA0NSwgICAgNTEsICAgIDI3LCAgICAyMywgICAgNzYsICAgIDQ0LCAgICAzMSwgICAgNTEsCisgICAgICA1MCwgICAgMzcsICAgMTA5LCAgICA2MywgICAxMTEsICAgIDUzLCAgICAzMywgICAgOTEsICAgIDY4LCAgICA1NywKKyAgICAgIDM3LCAgIDEwMCwgICAgNDcsICAgMTc3LCAgICA0MSwgICAgNTEsICAgIDM3LCAgICAzMywgICAgMzcsICAgIDg2LAorICAgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgMzcsICAgMTMxLCAgICAzNywgICAgNTYsICAgIDQxLCAgICA0NywgICAgNDgsCisgICAgICA1MSwgICAgNDcsICAgIDQ3LCAgICA0NywgICAgNDgsICAgIDQ3LCAgICA0OCwgICAgMzMsICAgIDM3LCAgICAzNywKKyAgICAgIDUxLCAgICAzMywgICAxNDksICAgIDQxLCAgICA0NCwgICAgNDUsICAgIDc2LCAgICA0NCwgICAgNDUsICAgIDQ3LAorICAgICAgNDgsICAgIDQ3LCAgIDE1OSwgICAxNjAsICAgIDUyLCAgICA0NywgICAgMzcsICAgIDM3LCAgIDE0NywgICAgMzcsCisgICAgICA0MSwgICAgNDUsICAgIDQ2LCAgICA0MSwgICAxMzEsICAgIDQ0LCAgICA0NywgICAgNDgsICAgIDUwLCAgICA0NywKKyAgICAgIDQ4LCAgIDE1OSwgICAxNjAsICAgIDQ2LCAgICA0NSwgICAgNDksICAgMTY1LCAgICAgMSwgICAgMzQsICAgIDQ5LAorICAgICAgNDksICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgIDE3NywgICAgMTMsCisgICAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICA1MiwKKyAgICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMzQsICAgIDQ0LCAgICAzMSwgICAgNDQsICAgIDQ2LAorICAgICAgMzAsICAgIDQ0LCAgICAzMSwgICAgMzcsICAgIDQ5LCAgICA0OSwgICAgNDYsICAgIDQxLCAgICA0OSwgICAgMzYsCisgICAgICA0NCwgICAgNDUsICAgIDQ5LCAgICA0NywgICAgNDgsICAgICAxLCAgICA0OSwgICAgMzQsICAgIDUyLCAgICAgNSwKKyAgICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDQ5LCAgICAxMywgICAgMTQsICAgIDE1LAorICAgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDQ5LCAgICAyNCwgICAgMjUsCisgICAgICAyNiwgICAgMjcsICAgIDI4LCAgICA0OSwgICAgNDksICAgIDMxLCAgICA0OSwgICAgNDksICAgICAxLCAgIDE2NSwKKyAgICAgIDgxLCAgICAzNywgICAgOTQsICAgMTQ5LCAgIDEwNywgICAgNDEsICAgMTEyLCAgICA0OSwgICAgNDQsICAgIDQ1LAorICAgICAgLTEsICAgIDQ3LCAgICA0OCwgICAgIDEsICAgIC0xLCAgIDEwMywgICAgNTIsICAgICA1LCAgICAgNiwgICAgIDcsCisgICAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgLTEsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywKKyAgICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgLTEsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LAorICAgICAgMjgsICAgIC0xLCAgICAtMSwgICAgMzEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzNiwgICAgLTEsCisgICAgICAgMSwgICAgLTEsICAgIC0xLCAgICA0MSwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKKyAgICAgIDExLCAgICA0OSwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgICAgMjEsICAgIDIyLCAgICAtMSwgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAtMSwgICAgLTEsCisgICAgICAzMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDM2LCAgICAtMSwgICAgIDEsICAgIC0xLCAgICAtMSwKKyAgICAgIDQxLCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgNDksICAgIDEzLAorICAgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgLTEsCisgICAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIC0xLCAgICAtMSwgICAgMzEsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgMzYsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA0MSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAgMSwgICAgLTEsICAgIC0xLCAgICA0OSwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsCisgICAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwKKyAgICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LAorICAgICAgMjksICAgIDMwLCAgICAzMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzNywgICAgLTEsCisgICAgICAtMSwgICAgLTEsICAgIDQxLCAgICAtMSwgICAgLTEsICAgIDQ0LCAgICAtMSwgICAgLTEsICAgIDQ3LCAgICA0OCwKKyAgICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAtMSwgICAgMTMsICAgIDE0LAorICAgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAtMSwgICAgMjQsCisgICAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgLTEsICAgIC0xLCAgICAzMSwgICAgLTEsICAgIC0xLCAgICAtMSwKKyAgICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQxLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNDgsICAgIDQ5LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksCisgICAgICAxMCwgICAgMTEsICAgIC0xLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKKyAgICAgIDIwLCAgICAyMSwgICAgMjIsICAgIC0xLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgIC0xLAorICAgICAgLTEsICAgIDMxLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDM3LCAgICAtMSwgICAgLTEsCisgICAgICAtMSwgICAgNDEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNDcsICAgIDQ4LCAgICAgNSwKKyAgICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIC0xLCAgICAxMywgICAgMTQsICAgIDE1LAorICAgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIC0xLCAgICAyNCwgICAgMjUsCisgICAgICAyNiwgICAgMjcsICAgIDI4LCAgICAtMSwgICAgLTEsICAgIDMxLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwKKyAgICAgIDM2LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNDEsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LAorICAgICAgIDksICAgIDEwLCAgICAxMSwgICAgLTEsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsCisgICAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgLTEsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwKKyAgICAgIC0xLCAgICAtMSwgICAgMzEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICA0MQorfTsKKworLyogWVlTVE9TW1NUQVRFLU5VTV0gLS0gVGhlIChpbnRlcm5hbCBudW1iZXIgb2YgdGhlKSBhY2Nlc3NpbmcKKyAgIHN5bWJvbCBvZiBzdGF0ZSBTVEFURS1OVU0uICAqLworc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXN0b3NbXSA9Cit7CisgICAgICAgMCwgICAgNTQsICAgIDU1LCAgICA1NiwgICAgIDAsICAgIDU1LCAgICAgMSwgICAgIDUsICAgICA2LCAgICAgNywKKyAgICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsCisgICAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgNDEsICAgIDU3LCAgICA2MCwgICAgNjQsICAgIDY1LCAgICA2NiwKKyAgICAgIDY3LCAgICA2OCwgICAgNjksICAgIDczLCAgICA4NCwgICAgOTksICAgMTAxLCAgICA0NCwgICAgNDUsICAgIDM3LAorICAgICAgNTEsICAgIDk2LCAgICAyMywgICAgMzcsICAgIDUxLCAgICA4NywgICAgNTksICAgIDM3LCAgICA4NywgICAgNDcsCisgICAgICA0NywgICAgNDQsICAgIDM3LCAgICA0NywgICAgNDgsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDcwLCAgICA3NCwKKyAgICAgIDc1LCAgICA2NiwgICAgOTYsICAgIDM3LCAgICA5NywgICAgOTgsICAgIDU4LCAgICA4NywgICAgIDEsICAgIDY0LAorICAgICAgODgsICAgIDg5LCAgICA5MCwgICAgNjAsICAgIDY0LCAgICA4NywgICAgNjUsICAgIDM3LCAgICAgMSwgICAgNzQsCisgICAgICA3MSwgICAgNzIsICAgIDczLCAgICA0NCwgICAgNDYsICAgIDc0LCAgICAzMCwgICAgMzIsICAgMTAwLCAgICAzMywKKyAgICAgIDQ3LCAgICA1MCwgICAgNDUsICAgIDQ2LCAgICA2MCwgICAgNDQsICAgIDQ1LCAgICAzNywgICAgNDEsICAgIDQ3LAorICAgICAgNTIsICAgIDcwLCAgICA3NiwgICAgNzcsICAgIDkxLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA0NSwgICAgIDEsCisgICAgICA5MCwgICAgNzQsICAgIDQ4LCAgICA0OSwgICAgNDksICAgIDQ5LCAgICA0OSwgICAgNzMsICAgIDYzLCAgICA5NSwKKyAgICAgICAxLCAgICA2NSwgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDM0LCAgICA0NSwgICAgOTgsICAgIDk0LAorICAgICAgIDEsICAgIDM3LCAgICA3NiwgICAgMzQsICAgIDc2LCAgICA5NSwgICAgMzMsICAgIDQ3LCAgICA0NCwgICAgNDYsCisgICAgICA0OSwgICAgNDQsICAgIDMxLCAgICA1MCwgICAgODUsICAgIDg2LCAgICA0OSwgICAgMzcsICAgIDQxLCAgICA0NywKKyAgICAgIDcwLCAgICA4MiwgICAgODMsICAgIDQ5LCAgICAzNiwgICAgNDYsICAgIDQ5LCAgICA0OSwgICAgIDEsICAgIDc4LAorICAgICAgOTMsICAgIDM0LCAgICAgMSwgICAgNDEsICAgIDgyLCAgICA4MiwgICAgMzMsICAgIDQ3LCAgICAzNiwgICAgODEsCisgICAgICA0OSwgICAgNDksICAgIDQ5LCAgICA0OSwgICAgIDEsICAgIDc4LCAgICA0OSwgICAgNDkKK307CisKKyNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKKyNkZWZpbmUgeXljbGVhcmluCSh5eWNoYXIgPSBZWUVNUFRZKQorI2RlZmluZSBZWUVNUFRZCQkoLTIpCisjZGVmaW5lIFlZRU9GCQkwCisKKyNkZWZpbmUgWVlBQ0NFUFQJZ290byB5eWFjY2VwdGxhYgorI2RlZmluZSBZWUFCT1JUCQlnb3RvIHl5YWJvcnRsYWIKKyNkZWZpbmUgWVlFUlJPUgkJZ290byB5eWVycm9ybGFiCisKKworLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseQorICAgdG8gZWFzZSB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1lYW5pbmcgb2YgWVlFUlJPUiwgZm9yIEdDQy4KKyAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgSG93ZXZlciwKKyAgIFlZRkFJTCBhcHBlYXJzIHRvIGJlIGluIHVzZS4gIE5ldmVydGhlbGVzcywgaXQgaXMgZm9ybWFsbHkgZGVwcmVjYXRlZAorICAgaW4gQmlzb24gMi40LjIncyBORVdTIGVudHJ5LCB3aGVyZSBhIHBsYW4gdG8gcGhhc2UgaXQgb3V0IGlzCisgICBkaXNjdXNzZWQuICAqLworCisjZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgorI2lmIGRlZmluZWQgWVlGQUlMCisgIC8qIFRoaXMgaXMgaGVyZSB0byBzdXBwcmVzcyB3YXJuaW5ncyBmcm9tIHRoZSBHQ0MgY3BwJ3MKKyAgICAgLVd1bnVzZWQtbWFjcm9zLiAgTm9ybWFsbHkgd2UgZG9uJ3Qgd29ycnkgYWJvdXQgdGhhdCB3YXJuaW5nLCBidXQKKyAgICAgc29tZSB1c2VycyBkbywgYW5kIHdlIHdhbnQgdG8gbWFrZSBpdCBlYXN5IGZvciB1c2VycyB0byByZW1vdmUKKyAgICAgWVlGQUlMIHVzZXMsIHdoaWNoIHdpbGwgcHJvZHVjZSB3YXJuaW5ncyBmcm9tIEJpc29uIDIuNS4gICovCisjZW5kaWYKKworI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCisKKyNkZWZpbmUgWVlCQUNLVVAoVG9rZW4sIFZhbHVlKQkJCQkJXAorZG8JCQkJCQkJCVwKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZICYmIHl5bGVuID09IDEpCQkJCVwKKyAgICB7CQkJCQkJCQlcCisgICAgICB5eWNoYXIgPSAoVG9rZW4pOwkJCQkJCVwKKyAgICAgIHl5bHZhbCA9IChWYWx1ZSk7CQkJCQkJXAorICAgICAgeXl0b2tlbiA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCisgICAgICBZWVBPUFNUQUNLICgxKTsJCQkJCQlcCisgICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCisgIGVsc2UJCQkJCQkJCVwKKyAgICB7CQkJCQkJCQlcCisgICAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKSk7IFwKKyAgICAgIFlZRVJST1I7CQkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCit3aGlsZSAoWVlJRCAoMCkpCisKKworI2RlZmluZSBZWVRFUlJPUgkxCisjZGVmaW5lIFlZRVJSQ09ERQkyNTYKKworCisvKiBZWUxMT0NfREVGQVVMVCAtLSBTZXQgQ1VSUkVOVCB0byBzcGFuIGZyb20gUkhTWzFdIHRvIFJIU1tOXS4KKyAgIElmIE4gaXMgMCwgdGhlbiBzZXQgQ1VSUkVOVCB0byB0aGUgZW1wdHkgbG9jYXRpb24gd2hpY2ggZW5kcworICAgdGhlIHByZXZpb3VzIHN5bWJvbDogUkhTWzBdIChhbHdheXMgZGVmaW5lZCkuICAqLworCisjZGVmaW5lIFlZUkhTTE9DKFJocywgSykgKChSaHMpW0tdKQorI2lmbmRlZiBZWUxMT0NfREVGQVVMVAorIyBkZWZpbmUgWVlMTE9DX0RFRkFVTFQoQ3VycmVudCwgUmhzLCBOKQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICBpZiAoWVlJRCAoTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7CQkJCQkJCQlcCisJICAoQ3VycmVudCkuZmlyc3RfbGluZSAgID0gWVlSSFNMT0MgKFJocywgMSkuZmlyc3RfbGluZTsJXAorCSAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2NvbHVtbjsJXAorCSAgKEN1cnJlbnQpLmxhc3RfbGluZSAgICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfbGluZTsJCVwKKwkgIChDdXJyZW50KS5sYXN0X2NvbHVtbiAgPSBZWVJIU0xPQyAoUmhzLCBOKS5sYXN0X2NvbHVtbjsJXAorCX0JCQkJCQkJCVwKKyAgICAgIGVsc2UJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJICAoQ3VycmVudCkuZmlyc3RfbGluZSAgID0gKEN1cnJlbnQpLmxhc3RfbGluZSAgID0JCVwKKwkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9saW5lOwkJCQlcCisJICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gKEN1cnJlbnQpLmxhc3RfY29sdW1uID0JCVwKKwkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9jb2x1bW47CQkJCVwKKwl9CQkJCQkJCQlcCisgICAgd2hpbGUgKFlZSUQgKDApKQorI2VuZGlmCisKKworLyogWVlfTE9DQVRJT05fUFJJTlQgLS0gUHJpbnQgdGhlIGxvY2F0aW9uIG9uIHRoZSBzdHJlYW0uCisgICBUaGlzIG1hY3JvIHdhcyBub3QgbWFuZGF0ZWQgb3JpZ2luYWxseTogZGVmaW5lIG9ubHkgaWYgd2Uga25vdworICAgd2Ugd29uJ3QgYnJlYWsgdXNlciBjb2RlOiB3aGVuIHRoZXNlIGFyZSB0aGUgbG9jYXRpb25zIHdlIGtub3cuICAqLworCisjaWZuZGVmIFlZX0xPQ0FUSU9OX1BSSU5UCisjIGlmIGRlZmluZWQgWVlMVFlQRV9JU19UUklWSUFMICYmIFlZTFRZUEVfSVNfVFJJVklBTAorIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykJCQlcCisgICAgIGZwcmludGYgKEZpbGUsICIlZC4lZC0lZC4lZCIsCQkJXAorCSAgICAgIChMb2MpLmZpcnN0X2xpbmUsIChMb2MpLmZpcnN0X2NvbHVtbiwJXAorCSAgICAgIChMb2MpLmxhc3RfbGluZSwgIChMb2MpLmxhc3RfY29sdW1uKQorIyBlbHNlCisjICBkZWZpbmUgWVlfTE9DQVRJT05fUFJJTlQoRmlsZSwgTG9jKSAoKHZvaWQpIDApCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBZWUxFWCAtLSBjYWxsaW5nIGB5eWxleCcgd2l0aCB0aGUgcmlnaHQgYXJndW1lbnRzLiAgKi8KKworI2lmZGVmIFlZTEVYX1BBUkFNCisjIGRlZmluZSBZWUxFWCB5eWxleCAoWVlMRVhfUEFSQU0pCisjZWxzZQorIyBkZWZpbmUgWVlMRVggeXlsZXggKCkKKyNlbmRpZgorCisvKiBFbmFibGUgZGVidWdnaW5nIGlmIHJlcXVlc3RlZC4gICovCisjaWYgWVlERUJVRworCisjIGlmbmRlZiBZWUZQUklOVEYKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgIGRlZmluZSBZWUZQUklOVEYgZnByaW50ZgorIyBlbmRpZgorCisjIGRlZmluZSBZWURQUklOVEYoQXJncykJCQlcCitkbyB7CQkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJCVwKKyAgICBZWUZQUklOVEYgQXJnczsJCQkJXAorfSB3aGlsZSAoWVlJRCAoMCkpCisKKyMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQkJCSAgXAorZG8gewkJCQkJCQkJCSAgXAorICBpZiAoeXlkZWJ1ZykJCQkJCQkJCSAgXAorICAgIHsJCQkJCQkJCQkgIFwKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgVGl0bGUpOwkJCQkJICBcCisgICAgICB5eV9zeW1ib2xfcHJpbnQgKHN0ZGVyciwJCQkJCQkgIFwKKwkJICBUeXBlLCBWYWx1ZSk7IFwKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsJCQkJCQkgIFwKKyAgICB9CQkJCQkJCQkJICBcCit9IHdoaWxlIChZWUlEICgwKSkKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBQcmludCB0aGlzIHN5bWJvbCBvbiBZWU9VVFBVVC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qQVJHU1VTRUQqLworI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3N0YXRpYyB2b2lkCit5eV9zeW1ib2xfdmFsdWVfcHJpbnQgKEZJTEUgKnl5b3V0cHV0LCBpbnQgeXl0eXBlLCBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXApCisjZWxzZQorc3RhdGljIHZvaWQKK3l5X3N5bWJvbF92YWx1ZV9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXApCisgICAgRklMRSAqeXlvdXRwdXQ7CisgICAgaW50IHl5dHlwZTsKKyAgICBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXA7CisjZW5kaWYKK3sKKyAgaWYgKCF5eXZhbHVlcCkKKyAgICByZXR1cm47CisjIGlmZGVmIFlZUFJJTlQKKyAgaWYgKHl5dHlwZSA8IFlZTlRPS0VOUykKKyAgICBZWVBSSU5UICh5eW91dHB1dCwgeXl0b2tudW1beXl0eXBlXSwgKnl5dmFsdWVwKTsKKyMgZWxzZQorICBZWVVTRSAoeXlvdXRwdXQpOworIyBlbmRpZgorICBzd2l0Y2ggKHl5dHlwZSkKKyAgICB7CisgICAgICBkZWZhdWx0OgorCWJyZWFrOworICAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBQcmludCB0aGlzIHN5bWJvbCBvbiBZWU9VVFBVVC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgdm9pZAoreXlfc3ltYm9sX3ByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eV9zeW1ib2xfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwKQorICAgIEZJTEUgKnl5b3V0cHV0OworICAgIGludCB5eXR5cGU7CisgICAgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwOworI2VuZGlmCit7CisgIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCisgICAgWVlGUFJJTlRGICh5eW91dHB1dCwgInRva2VuICVzICgiLCB5eXRuYW1lW3l5dHlwZV0pOworICBlbHNlCisgICAgWVlGUFJJTlRGICh5eW91dHB1dCwgIm50ZXJtICVzICgiLCB5eXRuYW1lW3l5dHlwZV0pOworCisgIHl5X3N5bWJvbF92YWx1ZV9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXApOworICBZWUZQUklOVEYgKHl5b3V0cHV0LCAiKSIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlfc3RhY2tfcHJpbnQgLS0gUHJpbnQgdGhlIHN0YXRlIHN0YWNrIGZyb20gaXRzIEJPVFRPTSB1cCB0byBpdHMgfAorfCBUT1AgKGluY2x1ZGVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3N0YXRpYyB2b2lkCit5eV9zdGFja19wcmludCAoeXl0eXBlX2ludDE2ICp5eWJvdHRvbSwgeXl0eXBlX2ludDE2ICp5eXRvcCkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlfc3RhY2tfcHJpbnQgKHl5Ym90dG9tLCB5eXRvcCkKKyAgICB5eXR5cGVfaW50MTYgKnl5Ym90dG9tOworICAgIHl5dHlwZV9pbnQxNiAqeXl0b3A7CisjZW5kaWYKK3sKKyAgWVlGUFJJTlRGIChzdGRlcnIsICJTdGFjayBub3ciKTsKKyAgZm9yICg7IHl5Ym90dG9tIDw9IHl5dG9wOyB5eWJvdHRvbSsrKQorICAgIHsKKyAgICAgIGludCB5eWJvdCA9ICp5eWJvdHRvbTsKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgeXlib3QpOworICAgIH0KKyAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOworfQorCisjIGRlZmluZSBZWV9TVEFDS19QUklOVChCb3R0b20sIFRvcCkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJCQkJXAorICAgIHl5X3N0YWNrX3ByaW50ICgoQm90dG9tKSwgKFRvcCkpOwkJCQlcCit9IHdoaWxlIChZWUlEICgwKSkKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgUmVwb3J0IHRoYXQgdGhlIFlZUlVMRSBpcyBnb2luZyB0byBiZSByZWR1Y2VkLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgdm9pZAoreXlfcmVkdWNlX3ByaW50IChZWVNUWVBFICp5eXZzcCwgaW50IHl5cnVsZSkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlfcmVkdWNlX3ByaW50ICh5eXZzcCwgeXlydWxlKQorICAgIFlZU1RZUEUgKnl5dnNwOworICAgIGludCB5eXJ1bGU7CisjZW5kaWYKK3sKKyAgaW50IHl5bnJocyA9IHl5cjJbeXlydWxlXTsKKyAgaW50IHl5aTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgeXlsbm8gPSB5eXJsaW5lW3l5cnVsZV07CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiUmVkdWNpbmcgc3RhY2sgYnkgcnVsZSAlZCAobGluZSAlbHUpOlxuIiwKKwkgICAgIHl5cnVsZSAtIDEsIHl5bG5vKTsKKyAgLyogVGhlIHN5bWJvbHMgYmVpbmcgcmVkdWNlZC4gICovCisgIGZvciAoeXlpID0gMDsgeXlpIDwgeXlucmhzOyB5eWkrKykKKyAgICB7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAgICQlZCA9ICIsIHl5aSArIDEpOworICAgICAgeXlfc3ltYm9sX3ByaW50IChzdGRlcnIsIHl5cmhzW3l5cHJoc1t5eXJ1bGVdICsgeXlpXSwKKwkJICAgICAgICYoeXl2c3BbKHl5aSArIDEpIC0gKHl5bnJocyldKQorCQkgICAgICAgCQkgICAgICAgKTsKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKKyAgICB9Cit9CisKKyMgZGVmaW5lIFlZX1JFRFVDRV9QUklOVChSdWxlKQkJXAorZG8gewkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJXAorICAgIHl5X3JlZHVjZV9wcmludCAoeXl2c3AsIFJ1bGUpOyBcCit9IHdoaWxlIChZWUlEICgwKSkKKworLyogTm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZS4gIEl0IGlzIGxlZnQgdW5pbml0aWFsaXplZCBzbyB0aGF0CisgICBtdWx0aXBsZSBwYXJzZXJzIGNhbiBjb2V4aXN0LiAgKi8KK2ludCB5eWRlYnVnOworI2Vsc2UgLyogIVlZREVCVUcgKi8KKyMgZGVmaW5lIFlZRFBSSU5URihBcmdzKQorIyBkZWZpbmUgWVlfU1lNQk9MX1BSSU5UKFRpdGxlLCBUeXBlLCBWYWx1ZSwgTG9jYXRpb24pCisjIGRlZmluZSBZWV9TVEFDS19QUklOVChCb3R0b20sIFRvcCkKKyMgZGVmaW5lIFlZX1JFRFVDRV9QUklOVChSdWxlKQorI2VuZGlmIC8qICFZWURFQlVHICovCisKKworLyogWVlJTklUREVQVEggLS0gaW5pdGlhbCBzaXplIG9mIHRoZSBwYXJzZXIncyBzdGFja3MuICAqLworI2lmbmRlZglZWUlOSVRERVBUSAorIyBkZWZpbmUgWVlJTklUREVQVEggMjAwCisjZW5kaWYKKworLyogWVlNQVhERVBUSCAtLSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrcyBjYW4gZ3JvdyB0byAoZWZmZWN0aXZlIG9ubHkKKyAgIGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLgorCisgICBEbyBub3QgbWFrZSB0aGlzIHZhbHVlIHRvbyBsYXJnZTsgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCBpZgorICAgWVlTVEFDS19BTExPQ19NQVhJTVVNIDwgWVlTVEFDS19CWVRFUyAoWVlNQVhERVBUSCkKKyAgIGV2YWx1YXRlZCB3aXRoIGluZmluaXRlLXByZWNpc2lvbiBpbnRlZ2VyIGFyaXRobWV0aWMuICAqLworCisjaWZuZGVmIFlZTUFYREVQVEgKKyMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKKyNlbmRpZgorCisMCisKKyNpZiBZWUVSUk9SX1ZFUkJPU0UKKworIyBpZm5kZWYgeXlzdHJsZW4KKyMgIGlmIGRlZmluZWQgX19HTElCQ19fICYmIGRlZmluZWQgX1NUUklOR19ICisjICAgZGVmaW5lIHl5c3RybGVuIHN0cmxlbgorIyAgZWxzZQorLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgWVlTVFIuICAqLworI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKK3N0YXRpYyBZWVNJWkVfVAoreXlzdHJsZW4gKGNvbnN0IGNoYXIgKnl5c3RyKQorI2Vsc2UKK3N0YXRpYyBZWVNJWkVfVAoreXlzdHJsZW4gKHl5c3RyKQorICAgIGNvbnN0IGNoYXIgKnl5c3RyOworI2VuZGlmCit7CisgIFlZU0laRV9UIHl5bGVuOworICBmb3IgKHl5bGVuID0gMDsgeXlzdHJbeXlsZW5dOyB5eWxlbisrKQorICAgIGNvbnRpbnVlOworICByZXR1cm4geXlsZW47Cit9CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmbmRlZiB5eXN0cGNweQorIyAgaWYgZGVmaW5lZCBfX0dMSUJDX18gJiYgZGVmaW5lZCBfU1RSSU5HX0ggJiYgZGVmaW5lZCBfR05VX1NPVVJDRQorIyAgIGRlZmluZSB5eXN0cGNweSBzdHBjcHkKKyMgIGVsc2UKKy8qIENvcHkgWVlTUkMgdG8gWVlERVNULCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHRlcm1pbmF0aW5nICdcMCcgaW4KKyAgIFlZREVTVC4gICovCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQorc3RhdGljIGNoYXIgKgoreXlzdHBjcHkgKGNoYXIgKnl5ZGVzdCwgY29uc3QgY2hhciAqeXlzcmMpCisjZWxzZQorc3RhdGljIGNoYXIgKgoreXlzdHBjcHkgKHl5ZGVzdCwgeXlzcmMpCisgICAgY2hhciAqeXlkZXN0OworICAgIGNvbnN0IGNoYXIgKnl5c3JjOworI2VuZGlmCit7CisgIGNoYXIgKnl5ZCA9IHl5ZGVzdDsKKyAgY29uc3QgY2hhciAqeXlzID0geXlzcmM7CisKKyAgd2hpbGUgKCgqeXlkKysgPSAqeXlzKyspICE9ICdcMCcpCisgICAgY29udGludWU7CisKKyAgcmV0dXJuIHl5ZCAtIDE7Cit9CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmbmRlZiB5eXRuYW1lcnIKKy8qIENvcHkgdG8gWVlSRVMgdGhlIGNvbnRlbnRzIG9mIFlZU1RSIGFmdGVyIHN0cmlwcGluZyBhd2F5IHVubmVjZXNzYXJ5CisgICBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzLCBzbyB0aGF0IGl0J3Mgc3VpdGFibGUgZm9yIHl5ZXJyb3IuICBUaGUKKyAgIGhldXJpc3RpYyBpcyB0aGF0IGRvdWJsZS1xdW90aW5nIGlzIHVubmVjZXNzYXJ5IHVubGVzcyB0aGUgc3RyaW5nCisgICBjb250YWlucyBhbiBhcG9zdHJvcGhlLCBhIGNvbW1hLCBvciBiYWNrc2xhc2ggKG90aGVyIHRoYW4KKyAgIGJhY2tzbGFzaC1iYWNrc2xhc2gpLiAgWVlTVFIgaXMgdGFrZW4gZnJvbSB5eXRuYW1lLiAgSWYgWVlSRVMgaXMKKyAgIG51bGwsIGRvIG5vdCBjb3B5OyBpbnN0ZWFkLCByZXR1cm4gdGhlIGxlbmd0aCBvZiB3aGF0IHRoZSByZXN1bHQKKyAgIHdvdWxkIGhhdmUgYmVlbi4gICovCitzdGF0aWMgWVlTSVpFX1QKK3l5dG5hbWVyciAoY2hhciAqeXlyZXMsIGNvbnN0IGNoYXIgKnl5c3RyKQoreworICBpZiAoKnl5c3RyID09ICciJykKKyAgICB7CisgICAgICBZWVNJWkVfVCB5eW4gPSAwOworICAgICAgY2hhciBjb25zdCAqeXlwID0geXlzdHI7CisKKyAgICAgIGZvciAoOzspCisJc3dpdGNoICgqKyt5eXApCisJICB7CisJICBjYXNlICdcJyc6CisJICBjYXNlICcsJzoKKwkgICAgZ290byBkb19ub3Rfc3RyaXBfcXVvdGVzOworCisJICBjYXNlICdcXCc6CisJICAgIGlmICgqKyt5eXAgIT0gJ1xcJykKKwkgICAgICBnb3RvIGRvX25vdF9zdHJpcF9xdW90ZXM7CisJICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJICBkZWZhdWx0OgorCSAgICBpZiAoeXlyZXMpCisJICAgICAgeXlyZXNbeXluXSA9ICp5eXA7CisJICAgIHl5bisrOworCSAgICBicmVhazsKKworCSAgY2FzZSAnIic6CisJICAgIGlmICh5eXJlcykKKwkgICAgICB5eXJlc1t5eW5dID0gJ1wwJzsKKwkgICAgcmV0dXJuIHl5bjsKKwkgIH0KKyAgICBkb19ub3Rfc3RyaXBfcXVvdGVzOiA7CisgICAgfQorCisgIGlmICghIHl5cmVzKQorICAgIHJldHVybiB5eXN0cmxlbiAoeXlzdHIpOworCisgIHJldHVybiB5eXN0cGNweSAoeXlyZXMsIHl5c3RyKSAtIHl5cmVzOworfQorIyBlbmRpZgorCisvKiBDb3B5IGludG8gWVlSRVNVTFQgYW4gZXJyb3IgbWVzc2FnZSBhYm91dCB0aGUgdW5leHBlY3RlZCB0b2tlbgorICAgWVlDSEFSIHdoaWxlIGluIHN0YXRlIFlZU1RBVEUuICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQsCisgICBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bGwgYnl0ZS4gIElmIFlZUkVTVUxUIGlzIG51bGwsIGRvIG5vdAorICAgY29weSBhbnl0aGluZzsganVzdCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlCisgICBjb3BpZWQuICBBcyBhIHNwZWNpYWwgY2FzZSwgcmV0dXJuIDAgaWYgYW4gb3JkaW5hcnkgInN5bnRheCBlcnJvciIKKyAgIG1lc3NhZ2Ugd2lsbCBkby4gIFJldHVybiBZWVNJWkVfTUFYSU1VTSBpZiBvdmVyZmxvdyBvY2N1cnMgZHVyaW5nCisgICBzaXplIGNhbGN1bGF0aW9uLiAgKi8KK3N0YXRpYyBZWVNJWkVfVAoreXlzeW50YXhfZXJyb3IgKGNoYXIgKnl5cmVzdWx0LCBpbnQgeXlzdGF0ZSwgaW50IHl5Y2hhcikKK3sKKyAgaW50IHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKworICBpZiAoISAoWVlQQUNUX05JTkYgPCB5eW4gJiYgeXluIDw9IFlZTEFTVCkpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgeXl0eXBlID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisgICAgICBZWVNJWkVfVCB5eXNpemUwID0geXl0bmFtZXJyICgwLCB5eXRuYW1lW3l5dHlwZV0pOworICAgICAgWVlTSVpFX1QgeXlzaXplID0geXlzaXplMDsKKyAgICAgIFlZU0laRV9UIHl5c2l6ZTE7CisgICAgICBpbnQgeXlzaXplX292ZXJmbG93ID0gMDsKKyAgICAgIGVudW0geyBZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNID0gNSB9OworICAgICAgY2hhciBjb25zdCAqeXlhcmdbWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTV07CisgICAgICBpbnQgeXl4OworCisjIGlmIDAKKyAgICAgIC8qIFRoaXMgaXMgc28geGdldHRleHQgc2VlcyB0aGUgdHJhbnNsYXRhYmxlIGZvcm1hdHMgdGhhdCBhcmUKKwkgY29uc3RydWN0ZWQgb24gdGhlIGZseS4gICovCisgICAgICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcyIpOworICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyIpOworICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyIpOworICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyBvciAlcyIpOworICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyBvciAlcyBvciAlcyIpOworIyBlbmRpZgorICAgICAgY2hhciAqeXlmbXQ7CisgICAgICBjaGFyIGNvbnN0ICp5eWY7CisgICAgICBzdGF0aWMgY2hhciBjb25zdCB5eXVuZXhwZWN0ZWRbXSA9ICJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMiOworICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXlleHBlY3RpbmdbXSA9ICIsIGV4cGVjdGluZyAlcyI7CisgICAgICBzdGF0aWMgY2hhciBjb25zdCB5eW9yW10gPSAiIG9yICVzIjsKKyAgICAgIGNoYXIgeXlmb3JtYXRbc2l6ZW9mIHl5dW5leHBlY3RlZAorCQkgICAgKyBzaXplb2YgeXlleHBlY3RpbmcgLSAxCisJCSAgICArICgoWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSAtIDIpCisJCSAgICAgICAqIChzaXplb2YgeXlvciAtIDEpKV07CisgICAgICBjaGFyIGNvbnN0ICp5eXByZWZpeCA9IHl5ZXhwZWN0aW5nOworCisgICAgICAvKiBTdGFydCBZWVggYXQgLVlZTiBpZiBuZWdhdGl2ZSB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluCisJIFlZQ0hFQ0suICAqLworICAgICAgaW50IHl5eGJlZ2luID0geXluIDwgMCA/IC15eW4gOiAwOworCisgICAgICAvKiBTdGF5IHdpdGhpbiBib3VuZHMgb2YgYm90aCB5eWNoZWNrIGFuZCB5eXRuYW1lLiAgKi8KKyAgICAgIGludCB5eWNoZWNrbGltID0gWVlMQVNUIC0geXluICsgMTsKKyAgICAgIGludCB5eXhlbmQgPSB5eWNoZWNrbGltIDwgWVlOVE9LRU5TID8geXljaGVja2xpbSA6IFlZTlRPS0VOUzsKKyAgICAgIGludCB5eWNvdW50ID0gMTsKKworICAgICAgeXlhcmdbMF0gPSB5eXRuYW1lW3l5dHlwZV07CisgICAgICB5eWZtdCA9IHl5c3RwY3B5ICh5eWZvcm1hdCwgeXl1bmV4cGVjdGVkKTsKKworICAgICAgZm9yICh5eXggPSB5eXhiZWdpbjsgeXl4IDwgeXl4ZW5kOyArK3l5eCkKKwlpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IpCisJICB7CisJICAgIGlmICh5eWNvdW50ID09IFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0pCisJICAgICAgeworCQl5eWNvdW50ID0gMTsKKwkJeXlzaXplID0geXlzaXplMDsKKwkJeXlmb3JtYXRbc2l6ZW9mIHl5dW5leHBlY3RlZCAtIDFdID0gJ1wwJzsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICB5eWFyZ1t5eWNvdW50KytdID0geXl0bmFtZVt5eXhdOworCSAgICB5eXNpemUxID0geXlzaXplICsgeXl0bmFtZXJyICgwLCB5eXRuYW1lW3l5eF0pOworCSAgICB5eXNpemVfb3ZlcmZsb3cgfD0gKHl5c2l6ZTEgPCB5eXNpemUpOworCSAgICB5eXNpemUgPSB5eXNpemUxOworCSAgICB5eWZtdCA9IHl5c3RwY3B5ICh5eWZtdCwgeXlwcmVmaXgpOworCSAgICB5eXByZWZpeCA9IHl5b3I7CisJICB9CisKKyAgICAgIHl5ZiA9IFlZXyh5eWZvcm1hdCk7CisgICAgICB5eXNpemUxID0geXlzaXplICsgeXlzdHJsZW4gKHl5Zik7CisgICAgICB5eXNpemVfb3ZlcmZsb3cgfD0gKHl5c2l6ZTEgPCB5eXNpemUpOworICAgICAgeXlzaXplID0geXlzaXplMTsKKworICAgICAgaWYgKHl5c2l6ZV9vdmVyZmxvdykKKwlyZXR1cm4gWVlTSVpFX01BWElNVU07CisKKyAgICAgIGlmICh5eXJlc3VsdCkKKwl7CisJICAvKiBBdm9pZCBzcHJpbnRmLCBhcyB0aGF0IGluZnJpbmdlcyBvbiB0aGUgdXNlcidzIG5hbWUgc3BhY2UuCisJICAgICBEb24ndCBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvciBldmVuIGlmIHRoZSB0cmFuc2xhdGlvbgorCSAgICAgcHJvZHVjZWQgYSBzdHJpbmcgd2l0aCB0aGUgd3JvbmcgbnVtYmVyIG9mICIlcyJzLiAgKi8KKwkgIGNoYXIgKnl5cCA9IHl5cmVzdWx0OworCSAgaW50IHl5aSA9IDA7CisJICB3aGlsZSAoKCp5eXAgPSAqeXlmKSAhPSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKCp5eXAgPT0gJyUnICYmIHl5ZlsxXSA9PSAncycgJiYgeXlpIDwgeXljb3VudCkKKwkJeworCQkgIHl5cCArPSB5eXRuYW1lcnIgKHl5cCwgeXlhcmdbeXlpKytdKTsKKwkJICB5eWYgKz0gMjsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHl5cCsrOworCQkgIHl5ZisrOworCQl9CisJICAgIH0KKwl9CisgICAgICByZXR1cm4geXlzaXplOworICAgIH0KK30KKyNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KKwwKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgUmVsZWFzZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgdG8gdGhpcyBzeW1ib2wuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKkFSR1NVU0VEKi8KKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitzdGF0aWMgdm9pZAoreXlkZXN0cnVjdCAoY29uc3QgY2hhciAqeXltc2csIGludCB5eXR5cGUsIFlZU1RZUEUgKnl5dmFsdWVwKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eWRlc3RydWN0ICh5eW1zZywgeXl0eXBlLCB5eXZhbHVlcCkKKyAgICBjb25zdCBjaGFyICp5eW1zZzsKKyAgICBpbnQgeXl0eXBlOworICAgIFlZU1RZUEUgKnl5dmFsdWVwOworI2VuZGlmCit7CisgIFlZVVNFICh5eXZhbHVlcCk7CisKKyAgaWYgKCF5eW1zZykKKyAgICB5eW1zZyA9ICJEZWxldGluZyI7CisgIFlZX1NZTUJPTF9QUklOVCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wKTsKKworICBzd2l0Y2ggKHl5dHlwZSkKKyAgICB7CisKKyAgICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgfQorfQorCisvKiBQcmV2ZW50IHdhcm5pbmdzIGZyb20gLVdtaXNzaW5nLXByb3RvdHlwZXMuICAqLworI2lmZGVmIFlZUEFSU0VfUEFSQU0KKyNpZiBkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19jcGx1c3BsdXMKK2ludCB5eXBhcnNlICh2b2lkICpZWVBBUlNFX1BBUkFNKTsKKyNlbHNlCitpbnQgeXlwYXJzZSAoKTsKKyNlbmRpZgorI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCisjaWYgZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCitpbnQgeXlwYXJzZSAodm9pZCk7CisjZWxzZQoraW50IHl5cGFyc2UgKCk7CisjZW5kaWYKKyNlbmRpZiAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KKworCisvKiBUaGUgbG9va2FoZWFkIHN5bWJvbC4gICovCitpbnQgeXljaGFyOworCisvKiBUaGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLworWVlTVFlQRSB5eWx2YWw7CisKKy8qIE51bWJlciBvZiBzeW50YXggZXJyb3JzIHNvIGZhci4gICovCitpbnQgeXluZXJyczsKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlwYXJzZSBvciB5eXB1c2hfcGFyc2UuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBZWVBBUlNFX1BBUkFNCisjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQoraW50Cit5eXBhcnNlICh2b2lkICpZWVBBUlNFX1BBUkFNKQorI2Vsc2UKK2ludAoreXlwYXJzZSAoWVlQQVJTRV9QQVJBTSkKKyAgICB2b2lkICpZWVBBUlNFX1BBUkFNOworI2VuZGlmCisjZWxzZSAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KKyNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCitpbnQKK3l5cGFyc2UgKHZvaWQpCisjZWxzZQoraW50Cit5eXBhcnNlICgpCisKKyNlbmRpZgorI2VuZGlmCit7CisKKworICAgIGludCB5eXN0YXRlOworICAgIC8qIE51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQuICAqLworICAgIGludCB5eWVycnN0YXR1czsKKworICAgIC8qIFRoZSBzdGFja3MgYW5kIHRoZWlyIHRvb2xzOgorICAgICAgIGB5eXNzJzogcmVsYXRlZCB0byBzdGF0ZXMuCisgICAgICAgYHl5dnMnOiByZWxhdGVkIHRvIHNlbWFudGljIHZhbHVlcy4KKworICAgICAgIFJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycywgdG8gYWxsb3cgeXlvdmVyZmxvdworICAgICAgIHRvIHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUuICAqLworCisgICAgLyogVGhlIHN0YXRlIHN0YWNrLiAgKi8KKyAgICB5eXR5cGVfaW50MTYgeXlzc2FbWVlJTklUREVQVEhdOworICAgIHl5dHlwZV9pbnQxNiAqeXlzczsKKyAgICB5eXR5cGVfaW50MTYgKnl5c3NwOworCisgICAgLyogVGhlIHNlbWFudGljIHZhbHVlIHN0YWNrLiAgKi8KKyAgICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsKKyAgICBZWVNUWVBFICp5eXZzOworICAgIFlZU1RZUEUgKnl5dnNwOworCisgICAgWVlTSVpFX1QgeXlzdGFja3NpemU7CisKKyAgaW50IHl5bjsKKyAgaW50IHl5cmVzdWx0OworICAvKiBMb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlci4gICovCisgIGludCB5eXRva2VuOworICAvKiBUaGUgdmFyaWFibGVzIHVzZWQgdG8gcmV0dXJuIHNlbWFudGljIHZhbHVlIGFuZCBsb2NhdGlvbiBmcm9tIHRoZQorICAgICBhY3Rpb24gcm91dGluZXMuICAqLworICBZWVNUWVBFIHl5dmFsOworCisjaWYgWVlFUlJPUl9WRVJCT1NFCisgIC8qIEJ1ZmZlciBmb3IgZXJyb3IgbWVzc2FnZXMsIGFuZCBpdHMgYWxsb2NhdGVkIHNpemUuICAqLworICBjaGFyIHl5bXNnYnVmWzEyOF07CisgIGNoYXIgKnl5bXNnID0geXltc2didWY7CisgIFlZU0laRV9UIHl5bXNnX2FsbG9jID0gc2l6ZW9mIHl5bXNnYnVmOworI2VuZGlmCisKKyNkZWZpbmUgWVlQT1BTVEFDSyhOKSAgICh5eXZzcCAtPSAoTiksIHl5c3NwIC09IChOKSkKKworICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgb24gdGhlIFJIUyBvZiB0aGUgcmVkdWNlZCBydWxlLgorICAgICBLZWVwIHRvIHplcm8gd2hlbiBubyBzeW1ib2wgc2hvdWxkIGJlIHBvcHBlZC4gICovCisgIGludCB5eWxlbiA9IDA7CisKKyAgeXl0b2tlbiA9IDA7CisgIHl5c3MgPSB5eXNzYTsKKyAgeXl2cyA9IHl5dnNhOworICB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOworCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKSk7CisKKyAgeXlzdGF0ZSA9IDA7CisgIHl5ZXJyc3RhdHVzID0gMDsKKyAgeXluZXJycyA9IDA7CisgIHl5Y2hhciA9IFlZRU1QVFk7IC8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCisKKyAgLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVycy4KKyAgICAgV2FzdGUgb25lIGVsZW1lbnQgb2YgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrCisgICAgIHNvIHRoYXQgdGhleSBzdGF5IG9uIHRoZSBzYW1lIGxldmVsIGFzIHRoZSBzdGF0ZSBzdGFjay4KKyAgICAgVGhlIHdhc3RlZCBlbGVtZW50cyBhcmUgbmV2ZXIgaW5pdGlhbGl6ZWQuICAqLworICB5eXNzcCA9IHl5c3M7CisgIHl5dnNwID0geXl2czsKKworICBnb3RvIHl5c2V0c3RhdGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eW5ld3N0YXRlIC0tIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluIHl5c3RhdGUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyB5eW5ld3N0YXRlOgorICAvKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcworICAgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuICBTbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLiAgKi8KKyAgeXlzc3ArKzsKKworIHl5c2V0c3RhdGU6CisgICp5eXNzcCA9IHl5c3RhdGU7CisKKyAgaWYgKHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEgPD0geXlzc3ApCisgICAgeworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCisgICAgICBZWVNJWkVfVCB5eXNpemUgPSB5eXNzcCAtIHl5c3MgKyAxOworCisjaWZkZWYgeXlvdmVyZmxvdworICAgICAgeworCS8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byByZWFsbG9jYXRlIHRoZSBzdGFjay4gIFVzZSBjb3BpZXMgb2YKKwkgICB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvCisJICAgbWVtb3J5LiAgKi8KKwlZWVNUWVBFICp5eXZzMSA9IHl5dnM7CisJeXl0eXBlX2ludDE2ICp5eXNzMSA9IHl5c3M7CisKKwkvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZiB0aGUKKwkgICBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gIFRoaXMgdXNlZCB0byBiZSBhCisJICAgY29uZGl0aW9uYWwgYXJvdW5kIGp1c3QgdGhlIHR3byBleHRyYSBhcmdzLCBidXQgdGhhdCBtaWdodAorCSAgIGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLworCXl5b3ZlcmZsb3cgKFlZXygibWVtb3J5IGV4aGF1c3RlZCIpLAorCQkgICAgJnl5c3MxLCB5eXNpemUgKiBzaXplb2YgKCp5eXNzcCksCisJCSAgICAmeXl2czEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKwkJICAgICZ5eXN0YWNrc2l6ZSk7CisKKwl5eXNzID0geXlzczE7CisJeXl2cyA9IHl5dnMxOworICAgICAgfQorI2Vsc2UgLyogbm8geXlvdmVyZmxvdyAqLworIyBpZm5kZWYgWVlTVEFDS19SRUxPQ0FURQorICAgICAgZ290byB5eWV4aGF1c3RlZGxhYjsKKyMgZWxzZQorICAgICAgLyogRXh0ZW5kIHRoZSBzdGFjayBvdXIgb3duIHdheS4gICovCisgICAgICBpZiAoWVlNQVhERVBUSCA8PSB5eXN0YWNrc2l6ZSkKKwlnb3RvIHl5ZXhoYXVzdGVkbGFiOworICAgICAgeXlzdGFja3NpemUgKj0gMjsKKyAgICAgIGlmIChZWU1BWERFUFRIIDwgeXlzdGFja3NpemUpCisJeXlzdGFja3NpemUgPSBZWU1BWERFUFRIOworCisgICAgICB7CisJeXl0eXBlX2ludDE2ICp5eXNzMSA9IHl5c3M7CisJdW5pb24geXlhbGxvYyAqeXlwdHIgPQorCSAgKHVuaW9uIHl5YWxsb2MgKikgWVlTVEFDS19BTExPQyAoWVlTVEFDS19CWVRFUyAoeXlzdGFja3NpemUpKTsKKwlpZiAoISB5eXB0cikKKwkgIGdvdG8geXlleGhhdXN0ZWRsYWI7CisJWVlTVEFDS19SRUxPQ0FURSAoeXlzc19hbGxvYywgeXlzcyk7CisJWVlTVEFDS19SRUxPQ0FURSAoeXl2c19hbGxvYywgeXl2cyk7CisjICB1bmRlZiBZWVNUQUNLX1JFTE9DQVRFCisJaWYgKHl5c3MxICE9IHl5c3NhKQorCSAgWVlTVEFDS19GUkVFICh5eXNzMSk7CisgICAgICB9CisjIGVuZGlmCisjZW5kaWYgLyogbm8geXlvdmVyZmxvdyAqLworCisgICAgICB5eXNzcCA9IHl5c3MgKyB5eXNpemUgLSAxOworICAgICAgeXl2c3AgPSB5eXZzICsgeXlzaXplIC0gMTsKKworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWx1XG4iLAorCQkgICh1bnNpZ25lZCBsb25nIGludCkgeXlzdGFja3NpemUpKTsKKworICAgICAgaWYgKHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEgPD0geXlzc3ApCisJWVlBQk9SVDsKKyAgICB9CisKKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiRW50ZXJpbmcgc3RhdGUgJWRcbiIsIHl5c3RhdGUpKTsKKworICBpZiAoeXlzdGF0ZSA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgIGdvdG8geXliYWNrdXA7CisKKy8qLS0tLS0tLS0tLS0uCit8IHl5YmFja3VwLiAgfAorYC0tLS0tLS0tLS0tKi8KK3l5YmFja3VwOgorCisgIC8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICBSZWFkIGEKKyAgICAgbG9va2FoZWFkIHRva2VuIGlmIHdlIG5lZWQgb25lIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KKworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KKyAgeXluID0geXlwYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IFlZUEFDVF9OSU5GKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogWVlDSEFSIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GIG9yIGEgdmFsaWQgbG9va2FoZWFkIHN5bWJvbC4gICovCisgIGlmICh5eWNoYXIgPT0gWVlFTVBUWSkKKyAgICB7CisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJSZWFkaW5nIGEgdG9rZW46ICIpKTsKKyAgICAgIHl5Y2hhciA9IFlZTEVYOworICAgIH0KKworICBpZiAoeXljaGFyIDw9IFlZRU9GKQorICAgIHsKKyAgICAgIHl5Y2hhciA9IHl5dG9rZW4gPSBZWUVPRjsKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIk5vdyBhdCBlbmQgb2YgaW5wdXQuXG4iKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgeXl0b2tlbiA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOworICAgICAgWVlfU1lNQk9MX1BSSU5UICgiTmV4dCB0b2tlbiBpcyIsIHl5dG9rZW4sICZ5eWx2YWwsICZ5eWxsb2MpOworICAgIH0KKworICAvKiBJZiB0aGUgcHJvcGVyIGFjdGlvbiBvbiBzZWVpbmcgdG9rZW4gWVlUT0tFTiBpcyB0byByZWR1Y2Ugb3IgdG8KKyAgICAgZGV0ZWN0IGFuIGVycm9yLCB0YWtlIHRoYXQgYWN0aW9uLiAgKi8KKyAgeXluICs9IHl5dG9rZW47CisgIGlmICh5eW4gPCAwIHx8IFlZTEFTVCA8IHl5biB8fCB5eWNoZWNrW3l5bl0gIT0geXl0b2tlbikKKyAgICBnb3RvIHl5ZGVmYXVsdDsKKyAgeXluID0geXl0YWJsZVt5eW5dOworICBpZiAoeXluIDw9IDApCisgICAgeworICAgICAgaWYgKHl5biA9PSAwIHx8IHl5biA9PSBZWVRBQkxFX05JTkYpCisJZ290byB5eWVycmxhYjsKKyAgICAgIHl5biA9IC15eW47CisgICAgICBnb3RvIHl5cmVkdWNlOworICAgIH0KKworICAvKiBDb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yCisgICAgIHN0YXR1cy4gICovCisgIGlmICh5eWVycnN0YXR1cykKKyAgICB5eWVycnN0YXR1cy0tOworCisgIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLworICBZWV9TWU1CT0xfUFJJTlQgKCJTaGlmdGluZyIsIHl5dG9rZW4sICZ5eWx2YWwsICZ5eWxsb2MpOworCisgIC8qIERpc2NhcmQgdGhlIHNoaWZ0ZWQgdG9rZW4uICAqLworICB5eWNoYXIgPSBZWUVNUFRZOworCisgIHl5c3RhdGUgPSB5eW47CisgICorK3l5dnNwID0geXlsdmFsOworCisgIGdvdG8geXluZXdzdGF0ZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWRlZmF1bHQgLS0gZG8gdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWRlZmF1bHQ6CisgIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycmxhYjsKKyAgZ290byB5eXJlZHVjZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eXJlZHVjZSAtLSBEbyBhIHJlZHVjdGlvbi4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eXJlZHVjZToKKyAgLyogeXluIGlzIHRoZSBudW1iZXIgb2YgYSBydWxlIHRvIHJlZHVjZSB3aXRoLiAgKi8KKyAgeXlsZW4gPSB5eXIyW3l5bl07CisKKyAgLyogSWYgWVlMRU4gaXMgbm9uemVybywgaW1wbGVtZW50IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb246CisgICAgIGAkJCA9ICQxJy4KKworICAgICBPdGhlcndpc2UsIHRoZSBmb2xsb3dpbmcgbGluZSBzZXRzIFlZVkFMIHRvIGdhcmJhZ2UuCisgICAgIFRoaXMgYmVoYXZpb3IgaXMgdW5kb2N1bWVudGVkIGFuZCBCaXNvbgorICAgICB1c2VycyBzaG91bGQgbm90IHJlbHkgdXBvbiBpdC4gIEFzc2lnbmluZyB0byBZWVZBTAorICAgICB1bmNvbmRpdGlvbmFsbHkgbWFrZXMgdGhlIHBhcnNlciBhIGJpdCBzbWFsbGVyLCBhbmQgaXQgYXZvaWRzIGEKKyAgICAgR0NDIHdhcm5pbmcgdGhhdCBZWVZBTCBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkLiAgKi8KKyAgeXl2YWwgPSB5eXZzcFsxLXl5bGVuXTsKKworCisgIFlZX1JFRFVDRV9QUklOVCAoeXluKTsKKyAgc3dpdGNoICh5eW4pCisgICAgeworICAgICAgICBjYXNlIDQ6CisKKyAgICB7IGlzX3R5cGVkZWYgPSAwOyBpc19leHRlcm4gPSAwOyBjdXJyZW50X25hbWUgPSBOVUxMOyBkZWNsX3NwZWMgPSBOVUxMOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNToKKworICAgIHsgZnJlZV9saXN0KCooeXl2c3BbKDIpIC0gKDIpXSksIE5VTEwpOyAqKHl5dnNwWygyKSAtICgyKV0pID0gTlVMTDsgO30KKyAgICBicmVhazsKKworICBjYXNlIDY6CisKKyAgICB7IGlzX3R5cGVkZWYgPSAxOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzoKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDg6CisKKyAgICB7IGlzX3R5cGVkZWYgPSAxOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOToKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE0OgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTU6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNjoKKworICAgIHsgaWYgKGN1cnJlbnRfbmFtZSkgeworCQkgICAgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsID0gKCooeXl2c3BbKDMpIC0gKDMpXSkpLT5uZXh0OworCQkgICAgKCooeXl2c3BbKDMpIC0gKDMpXSkpLT5uZXh0ID0gTlVMTDsKKwkJICAgIGFkZF9zeW1ib2woY3VycmVudF9uYW1lLAorCQkJICAgICAgIGlzX3R5cGVkZWYgPyBTWU1fVFlQRURFRiA6IFNZTV9OT1JNQUwsCisJCQkgICAgICAgZGVjbCwgaXNfZXh0ZXJuKTsKKwkJICAgIGN1cnJlbnRfbmFtZSA9IE5VTEw7CisJCSAgfQorCQkgICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7CisJCTt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNzoKKworICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxOToKKworICAgIHsgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsID0gKih5eXZzcFsoMSkgLSAoMSldKTsKKwkJICAqKHl5dnNwWygxKSAtICgxKV0pID0gTlVMTDsKKwkJICBhZGRfc3ltYm9sKGN1cnJlbnRfbmFtZSwKKwkJCSAgICAgaXNfdHlwZWRlZiA/IFNZTV9UWVBFREVGIDogU1lNX05PUk1BTCwgZGVjbCwgaXNfZXh0ZXJuKTsKKwkJICBjdXJyZW50X25hbWUgPSBOVUxMOworCQkgICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7CisJCTt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMDoKKworICAgIHsgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsID0gKih5eXZzcFsoMykgLSAoMyldKTsKKwkJICAqKHl5dnNwWygzKSAtICgzKV0pID0gTlVMTDsKKwkJICBmcmVlX2xpc3QoKih5eXZzcFsoMikgLSAoMyldKSwgTlVMTCk7CisJCSAgKih5eXZzcFsoMikgLSAoMyldKSA9IGRlY2xfc3BlYzsKKwkJICBhZGRfc3ltYm9sKGN1cnJlbnRfbmFtZSwKKwkJCSAgICAgaXNfdHlwZWRlZiA/IFNZTV9UWVBFREVGIDogU1lNX05PUk1BTCwgZGVjbCwgaXNfZXh0ZXJuKTsKKwkJICBjdXJyZW50X25hbWUgPSBOVUxMOworCQkgICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7CisJCTt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMToKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKSA/ICh5eXZzcFsoNCkgLSAoNCldKSA6ICh5eXZzcFsoMykgLSAoNCldKSA/ICh5eXZzcFsoMykgLSAoNCldKSA6ICh5eXZzcFsoMikgLSAoNCldKSA/ICh5eXZzcFsoMikgLSAoNCldKSA6ICh5eXZzcFsoMSkgLSAoNCldKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDIyOgorCisgICAgeyBkZWNsX3NwZWMgPSBOVUxMOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjQ6CisKKyAgICB7IGRlY2xfc3BlYyA9ICooeXl2c3BbKDEpIC0gKDEpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyNToKKworICAgIHsgZGVjbF9zcGVjID0gKih5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDI2OgorCisgICAgeyAvKiBWZXJzaW9uIDIgY2hlY2tzdW1taW5nIGlnbm9yZXMgc3RvcmFnZSBjbGFzcywgYXMgdGhhdAorCQkgICAgIGlzIHJlYWxseSBpcnJlbGV2YW50IHRvIHRoZSBsaW5rYWdlLiAgKi8KKwkJICByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDEpXSkpOworCQkgICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7CisJCTt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzMToKKworICAgIHsgaXNfZXh0ZXJuID0gMTsgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDMyOgorCisgICAgeyBpc19leHRlcm4gPSAwOyAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzc6CisKKyAgICB7IHJlbW92ZV9ub2RlKCh5eXZzcFsoMSkgLSAoMildKSk7ICgqKHl5dnNwWygyKSAtICgyKV0pKS0+dGFnID0gU1lNX1NUUlVDVDsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDM4OgorCisgICAgeyByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDIpXSkpOyAoKih5eXZzcFsoMikgLSAoMildKSktPnRhZyA9IFNZTV9VTklPTjsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDM5OgorCisgICAgeyByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDIpXSkpOyAoKih5eXZzcFsoMikgLSAoMildKSktPnRhZyA9IFNZTV9FTlVNOyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDA6CisKKyAgICB7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICooeXl2c3BbKDMpIC0gKDMpXSksICppID0gKih5eXZzcFsoMikgLSAoMyldKSwgKnI7CisJCSAgciA9IGNvcHlfbm9kZShpKTsgci0+dGFnID0gU1lNX1NUUlVDVDsKKwkJICByLT5uZXh0ID0gKCooeXl2c3BbKDEpIC0gKDMpXSkpLT5uZXh0OyAqKHl5dnNwWygzKSAtICgzKV0pID0gcjsgKCooeXl2c3BbKDEpIC0gKDMpXSkpLT5uZXh0ID0gTlVMTDsKKwkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX1NUUlVDVCwgcywgaXNfZXh0ZXJuKTsKKwkJICAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOworCQk7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDE6CisKKyAgICB7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICooeXl2c3BbKDMpIC0gKDMpXSksICppID0gKih5eXZzcFsoMikgLSAoMyldKSwgKnI7CisJCSAgciA9IGNvcHlfbm9kZShpKTsgci0+dGFnID0gU1lNX1VOSU9OOworCQkgIHItPm5leHQgPSAoKih5eXZzcFsoMSkgLSAoMyldKSktPm5leHQ7ICooeXl2c3BbKDMpIC0gKDMpXSkgPSByOyAoKih5eXZzcFsoMSkgLSAoMyldKSktPm5leHQgPSBOVUxMOworCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fVU5JT04sIHMsIGlzX2V4dGVybik7CisJCSAgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsKKwkJO30KKyAgICBicmVhazsKKworICBjYXNlIDQyOgorCisgICAgeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqKHl5dnNwWygzKSAtICgzKV0pLCAqaSA9ICooeXl2c3BbKDIpIC0gKDMpXSksICpyOworCQkgIHIgPSBjb3B5X25vZGUoaSk7IHItPnRhZyA9IFNZTV9FTlVNOworCQkgIHItPm5leHQgPSAoKih5eXZzcFsoMSkgLSAoMyldKSktPm5leHQ7ICooeXl2c3BbKDMpIC0gKDMpXSkgPSByOyAoKih5eXZzcFsoMSkgLSAoMyldKSktPm5leHQgPSBOVUxMOworCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fRU5VTSwgcywgaXNfZXh0ZXJuKTsKKwkJICAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOworCQk7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDM6CisKKyAgICB7IGFkZF9zeW1ib2woTlVMTCwgU1lNX0VOVU0sIE5VTEwsIDApOyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDQ6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0NToKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDU2OgorCisgICAgeyAoKih5eXZzcFsoMSkgLSAoMSldKSktPnRhZyA9IFNZTV9UWVBFREVGOyAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTc6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSkgPyAoeXl2c3BbKDIpIC0gKDIpXSkgOiAoeXl2c3BbKDEpIC0gKDIpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1ODoKKworICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2MToKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDY1OgorCisgICAgeyAvKiByZXN0cmljdCBoYXMgbm8gZWZmZWN0IGluIHByb3RvdHlwZXMgc28gaWdub3JlIGl0ICovCisJCSAgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgxKV0pKTsKKwkJICAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOworCQk7fQorICAgIGJyZWFrOworCisgIGNhc2UgNjY6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2ODoKKworICAgIHsgaWYgKGN1cnJlbnRfbmFtZSAhPSBOVUxMKSB7CisJCSAgICBlcnJvcl93aXRoX3BvcygidW5leHBlY3RlZCBzZWNvbmQgZGVjbGFyYXRpb24gbmFtZSIpOworCQkgICAgWVlFUlJPUjsKKwkJICB9IGVsc2UgeworCQkgICAgY3VycmVudF9uYW1lID0gKCooeXl2c3BbKDEpIC0gKDEpXSkpLT5zdHJpbmc7CisJCSAgICAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOworCQkgIH0KKwkJO30KKyAgICBicmVhazsKKworICBjYXNlIDY5OgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzA6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3MToKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDcyOgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzM6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3NDoKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDc4OgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzk6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4MDoKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDgxOgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgODI6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4MzoKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDg1OgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgODY6CisKKyAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgODk6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5MDoKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKSA/ICh5eXZzcFsoMikgLSAoMildKSA6ICh5eXZzcFsoMSkgLSAoMildKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDkxOgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pID8gKHl5dnNwWygyKSAtICgyKV0pIDogKHl5dnNwWygxKSAtICgyKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTM6CisKKyAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTQ6CisKKyAgICB7IC8qIEZvciB2ZXJzaW9uIDIgY2hlY2tzdW1zLCB3ZSBkb24ndCB3YW50IHRvIHJlbWVtYmVyCisJCSAgICAgcHJpdmF0ZSBwYXJhbWV0ZXIgbmFtZXMuICAqLworCQkgIHJlbW92ZV9ub2RlKCh5eXZzcFsoMSkgLSAoMSldKSk7CisJCSAgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsKKwkJO30KKyAgICBicmVhazsKKworICBjYXNlIDk1OgorCisgICAgeyByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDEpXSkpOworCQkgICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7CisJCTt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5NjoKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDk3OgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTg6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5OToKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMDoKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMToKKworICAgIHsgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsID0gKih5eXZzcFsoMikgLSAoMyldKTsKKwkJICAqKHl5dnNwWygyKSAtICgzKV0pID0gTlVMTDsKKwkJICBhZGRfc3ltYm9sKGN1cnJlbnRfbmFtZSwgU1lNX05PUk1BTCwgZGVjbCwgaXNfZXh0ZXJuKTsKKwkJICAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOworCQk7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTAyOgorCisgICAgeyAoeXl2YWwpID0gTlVMTDsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwNDoKKworICAgIHsgcmVtb3ZlX2xpc3QoKHl5dnNwWygyKSAtICgyKV0pLCAmKCooeXl2c3BbKDEpIC0gKDIpXSkpLT5uZXh0KTsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwNToKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwNjoKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwNzoKKworICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTA6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTE6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTI6CisKKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMTM6CisKKyAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTE2OgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTE3OgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pID8gKHl5dnNwWygyKSAtICgyKV0pIDogKHl5dnNwWygxKSAtICgyKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTE4OgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTIwOgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTIxOgorCisgICAgeyAoeXl2YWwpID0gTlVMTDsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEyMzoKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEyNDoKKworICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEyNzoKKworICAgIHsKKwkJCWNvbnN0IGNoYXIgKm5hbWUgPSBzdHJkdXAoKCooeXl2c3BbKDEpIC0gKDEpXSkpLT5zdHJpbmcpOworCQkJYWRkX3N5bWJvbChuYW1lLCBTWU1fRU5VTV9DT05TVCwgTlVMTCwgMCk7CisJCTt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMjg6CisKKyAgICB7CisJCQljb25zdCBjaGFyICpuYW1lID0gc3RyZHVwKCgqKHl5dnNwWygxKSAtICgzKV0pKS0+c3RyaW5nKTsKKwkJCXN0cnVjdCBzdHJpbmdfbGlzdCAqZXhwciA9IGNvcHlfbGlzdF9yYW5nZSgqKHl5dnNwWygzKSAtICgzKV0pLCAqKHl5dnNwWygyKSAtICgzKV0pKTsKKwkJCWFkZF9zeW1ib2wobmFtZSwgU1lNX0VOVU1fQ09OU1QsIGV4cHIsIDApOworCQk7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTI5OgorCisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTMwOgorCisgICAgeyAoeXl2YWwpID0gTlVMTDsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEzMjoKKworICAgIHsgZXhwb3J0X3N5bWJvbCgoKih5eXZzcFsoMykgLSAoNSldKSktPnN0cmluZyk7ICh5eXZhbCkgPSAoeXl2c3BbKDUpIC0gKDUpXSk7IDt9CisgICAgYnJlYWs7CisKKworCisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgIFlZX1NZTUJPTF9QUklOVCAoIi0+ICQkID0iLCB5eXIxW3l5bl0sICZ5eXZhbCwgJnl5bG9jKTsKKworICBZWVBPUFNUQUNLICh5eWxlbik7CisgIHl5bGVuID0gMDsKKyAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKKworICAqKyt5eXZzcCA9IHl5dmFsOworCisgIC8qIE5vdyBgc2hpZnQnIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4gIERldGVybWluZSB3aGF0IHN0YXRlCisgICAgIHRoYXQgZ29lcyB0bywgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvIGFuZCB0aGUgcnVsZQorICAgICBudW1iZXIgcmVkdWNlZCBieS4gICovCisKKyAgeXluID0geXlyMVt5eW5dOworCisgIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRPS0VOU10gKyAqeXlzc3A7CisgIGlmICgwIDw9IHl5c3RhdGUgJiYgeXlzdGF0ZSA8PSBZWUxBU1QgJiYgeXljaGVja1t5eXN0YXRlXSA9PSAqeXlzc3ApCisgICAgeXlzdGF0ZSA9IHl5dGFibGVbeXlzdGF0ZV07CisgIGVsc2UKKyAgICB5eXN0YXRlID0geXlkZWZnb3RvW3l5biAtIFlZTlRPS0VOU107CisKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWVycmxhYiAtLSBoZXJlIG9uIGRldGVjdGluZyBlcnJvciB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJybGFiOgorICAvKiBJZiBub3QgYWxyZWFkeSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlcG9ydCB0aGlzIGVycm9yLiAgKi8KKyAgaWYgKCF5eWVycnN0YXR1cykKKyAgICB7CisgICAgICArK3l5bmVycnM7CisjaWYgISBZWUVSUk9SX1ZFUkJPU0UKKyAgICAgIHl5ZXJyb3IgKFlZXygic3ludGF4IGVycm9yIikpOworI2Vsc2UKKyAgICAgIHsKKwlZWVNJWkVfVCB5eXNpemUgPSB5eXN5bnRheF9lcnJvciAoMCwgeXlzdGF0ZSwgeXljaGFyKTsKKwlpZiAoeXltc2dfYWxsb2MgPCB5eXNpemUgJiYgeXltc2dfYWxsb2MgPCBZWVNUQUNLX0FMTE9DX01BWElNVU0pCisJICB7CisJICAgIFlZU0laRV9UIHl5YWxsb2MgPSAyICogeXlzaXplOworCSAgICBpZiAoISAoeXlzaXplIDw9IHl5YWxsb2MgJiYgeXlhbGxvYyA8PSBZWVNUQUNLX0FMTE9DX01BWElNVU0pKQorCSAgICAgIHl5YWxsb2MgPSBZWVNUQUNLX0FMTE9DX01BWElNVU07CisJICAgIGlmICh5eW1zZyAhPSB5eW1zZ2J1ZikKKwkgICAgICBZWVNUQUNLX0ZSRUUgKHl5bXNnKTsKKwkgICAgeXltc2cgPSAoY2hhciAqKSBZWVNUQUNLX0FMTE9DICh5eWFsbG9jKTsKKwkgICAgaWYgKHl5bXNnKQorCSAgICAgIHl5bXNnX2FsbG9jID0geXlhbGxvYzsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJeXltc2cgPSB5eW1zZ2J1ZjsKKwkJeXltc2dfYWxsb2MgPSBzaXplb2YgeXltc2didWY7CisJICAgICAgfQorCSAgfQorCisJaWYgKDAgPCB5eXNpemUgJiYgeXlzaXplIDw9IHl5bXNnX2FsbG9jKQorCSAgeworCSAgICAodm9pZCkgeXlzeW50YXhfZXJyb3IgKHl5bXNnLCB5eXN0YXRlLCB5eWNoYXIpOworCSAgICB5eWVycm9yICh5eW1zZyk7CisJICB9CisJZWxzZQorCSAgeworCSAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvciIpKTsKKwkgICAgaWYgKHl5c2l6ZSAhPSAwKQorCSAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7CisJICB9CisgICAgICB9CisjZW5kaWYKKyAgICB9CisKKworCisgIGlmICh5eWVycnN0YXR1cyA9PSAzKQorICAgIHsKKyAgICAgIC8qIElmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgYW4KKwkgZXJyb3IsIGRpc2NhcmQgaXQuICAqLworCisgICAgICBpZiAoeXljaGFyIDw9IFlZRU9GKQorCXsKKwkgIC8qIFJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dC4gICovCisJICBpZiAoeXljaGFyID09IFlZRU9GKQorCSAgICBZWUFCT1JUOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB5eWRlc3RydWN0ICgiRXJyb3I6IGRpc2NhcmRpbmciLAorCQkgICAgICB5eXRva2VuLCAmeXlsdmFsKTsKKwkgIHl5Y2hhciA9IFlZRU1QVFk7CisJfQorICAgIH0KKworICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IKKyAgICAgdG9rZW4uICAqLworICBnb3RvIHl5ZXJybGFiMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJvcmxhYiAtLSBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBZWUVSUk9SLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycm9ybGFiOgorCisgIC8qIFBhY2lmeSBjb21waWxlcnMgbGlrZSBHQ0Mgd2hlbiB0aGUgdXNlciBjb2RlIG5ldmVyIGludm9rZXMKKyAgICAgWVlFUlJPUiBhbmQgdGhlIGxhYmVsIHl5ZXJyb3JsYWIgdGhlcmVmb3JlIG5ldmVyIGFwcGVhcnMgaW4gdXNlcgorICAgICBjb2RlLiAgKi8KKyAgaWYgKC8qQ09OU1RDT05EKi8gMCkKKyAgICAgZ290byB5eWVycm9ybGFiOworCisgIC8qIERvIG5vdCByZWNsYWltIHRoZSBzeW1ib2xzIG9mIHRoZSBydWxlIHdoaWNoIGFjdGlvbiB0cmlnZ2VyZWQKKyAgICAgdGhpcyBZWUVSUk9SLiAgKi8KKyAgWVlQT1BTVEFDSyAoeXlsZW4pOworICB5eWxlbiA9IDA7CisgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CisgIHl5c3RhdGUgPSAqeXlzc3A7CisgIGdvdG8geXllcnJsYWIxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJsYWIxIC0tIGNvbW1vbiBjb2RlIGZvciBib3RoIHN5bnRheCBlcnJvciBhbmQgWVlFUlJPUi4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJybGFiMToKKyAgeXllcnJzdGF0dXMgPSAzOwkvKiBFYWNoIHJlYWwgdG9rZW4gc2hpZnRlZCBkZWNyZW1lbnRzIHRoaXMuICAqLworCisgIGZvciAoOzspCisgICAgeworICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOworICAgICAgaWYgKHl5biAhPSBZWVBBQ1RfTklORikKKwl7CisJICB5eW4gKz0gWVlURVJST1I7CisJICBpZiAoMCA8PSB5eW4gJiYgeXluIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5bl0gPT0gWVlURVJST1IpCisJICAgIHsKKwkgICAgICB5eW4gPSB5eXRhYmxlW3l5bl07CisJICAgICAgaWYgKDAgPCB5eW4pCisJCWJyZWFrOworCSAgICB9CisJfQorCisgICAgICAvKiBQb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSBlcnJvciB0b2tlbi4gICovCisgICAgICBpZiAoeXlzc3AgPT0geXlzcykKKwlZWUFCT1JUOworCisKKyAgICAgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogcG9wcGluZyIsCisJCSAgeXlzdG9zW3l5c3RhdGVdLCB5eXZzcCk7CisgICAgICBZWVBPUFNUQUNLICgxKTsKKyAgICAgIHl5c3RhdGUgPSAqeXlzc3A7CisgICAgICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOworICAgIH0KKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKworCisgIC8qIFNoaWZ0IHRoZSBlcnJvciB0b2tlbi4gICovCisgIFlZX1NZTUJPTF9QUklOVCAoIlNoaWZ0aW5nIiwgeXlzdG9zW3l5bl0sIHl5dnNwLCB5eWxzcCk7CisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlhY2NlcHRsYWIgLS0gWVlBQ0NFUFQgY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5YWNjZXB0bGFiOgorICB5eXJlc3VsdCA9IDA7CisgIGdvdG8geXlyZXR1cm47CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5YWJvcnRsYWIgLS0gWVlBQk9SVCBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5YWJvcnRsYWI6CisgIHl5cmVzdWx0ID0gMTsKKyAgZ290byB5eXJldHVybjsKKworI2lmICFkZWZpbmVkKHl5b3ZlcmZsb3cpIHx8IFlZRVJST1JfVkVSQk9TRQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWV4aGF1c3RlZGxhYiAtLSBtZW1vcnkgZXhoYXVzdGlvbiBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlleGhhdXN0ZWRsYWI6CisgIHl5ZXJyb3IgKFlZXygibWVtb3J5IGV4aGF1c3RlZCIpKTsKKyAgeXlyZXN1bHQgPSAyOworICAvKiBGYWxsIHRocm91Z2guICAqLworI2VuZGlmCisKK3l5cmV0dXJuOgorICBpZiAoeXljaGFyICE9IFlZRU1QVFkpCisgICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBkaXNjYXJkaW5nIGxvb2thaGVhZCIsCisJCSB5eXRva2VuLCAmeXlsdmFsKTsKKyAgLyogRG8gbm90IHJlY2xhaW0gdGhlIHN5bWJvbHMgb2YgdGhlIHJ1bGUgd2hpY2ggYWN0aW9uIHRyaWdnZXJlZAorICAgICB0aGlzIFlZQUJPUlQgb3IgWVlBQ0NFUFQuICAqLworICBZWVBPUFNUQUNLICh5eWxlbik7CisgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CisgIHdoaWxlICh5eXNzcCAhPSB5eXNzKQorICAgIHsKKyAgICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBwb3BwaW5nIiwKKwkJICB5eXN0b3NbKnl5c3NwXSwgeXl2c3ApOworICAgICAgWVlQT1BTVEFDSyAoMSk7CisgICAgfQorI2lmbmRlZiB5eW92ZXJmbG93CisgIGlmICh5eXNzICE9IHl5c3NhKQorICAgIFlZU1RBQ0tfRlJFRSAoeXlzcyk7CisjZW5kaWYKKyNpZiBZWUVSUk9SX1ZFUkJPU0UKKyAgaWYgKHl5bXNnICE9IHl5bXNnYnVmKQorICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOworI2VuZGlmCisgIC8qIE1ha2Ugc3VyZSBZWUlEIGlzIHVzZWQuICAqLworICByZXR1cm4gWVlJRCAoeXlyZXN1bHQpOworfQorCisKKworCisKK3N0YXRpYyB2b2lkCit5eWVycm9yKGNvbnN0IGNoYXIgKmUpCit7CisgIGVycm9yX3dpdGhfcG9zKCIlcyIsIGUpOworfQorCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnRhYi5oX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnRhYi5oX3NoaXBwZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwYzJiNAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UudGFiLmhfc2hpcHBlZApAQCAtMCwwICsxLDk2IEBACisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjMuICAqLworCisvKiBTa2VsZXRvbiBpbnRlcmZhY2UgZm9yIEJpc29uJ3MgWWFjYy1saWtlIHBhcnNlcnMgaW4gQworICAgCisgICAgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisgICAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IGNyZWF0ZSBhIGxhcmdlciB3b3JrIHRoYXQgY29udGFpbnMKKyAgIHBhcnQgb3IgYWxsIG9mIHRoZSBCaXNvbiBwYXJzZXIgc2tlbGV0b24gYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCisgICB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgc28gbG9uZyBhcyB0aGF0IHdvcmsgaXNuJ3QgaXRzZWxmIGEKKyAgIHBhcnNlciBnZW5lcmF0b3IgdXNpbmcgdGhlIHNrZWxldG9uIG9yIGEgbW9kaWZpZWQgdmVyc2lvbiB0aGVyZW9mCisgICBhcyBhIHBhcnNlciBza2VsZXRvbi4gIEFsdGVybmF0aXZlbHksIGlmIHlvdSBtb2RpZnkgb3IgcmVkaXN0cmlidXRlCisgICB0aGUgcGFyc2VyIHNrZWxldG9uIGl0c2VsZiwgeW91IG1heSAoYXQgeW91ciBvcHRpb24pIHJlbW92ZSB0aGlzCisgICBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgc2tlbGV0b24gYW5kIHRoZSByZXN1bHRpbmcKKyAgIEJpc29uIG91dHB1dCBmaWxlcyB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIHdpdGhvdXQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbi4KKyAgIAorICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbgorICAgdmVyc2lvbiAyLjIgb2YgQmlzb24uICAqLworCisKKy8qIFRva2Vucy4gICovCisjaWZuZGVmIFlZVE9LRU5UWVBFCisjIGRlZmluZSBZWVRPS0VOVFlQRQorICAgLyogUHV0IHRoZSB0b2tlbnMgaW50byB0aGUgc3ltYm9sIHRhYmxlLCBzbyB0aGF0IEdEQiBhbmQgb3RoZXIgZGVidWdnZXJzCisgICAgICBrbm93IGFib3V0IHRoZW0uICAqLworICAgZW51bSB5eXRva2VudHlwZSB7CisgICAgIEFTTV9LRVlXID0gMjU4LAorICAgICBBVFRSSUJVVEVfS0VZVyA9IDI1OSwKKyAgICAgQVVUT19LRVlXID0gMjYwLAorICAgICBCT09MX0tFWVcgPSAyNjEsCisgICAgIENIQVJfS0VZVyA9IDI2MiwKKyAgICAgQ09OU1RfS0VZVyA9IDI2MywKKyAgICAgRE9VQkxFX0tFWVcgPSAyNjQsCisgICAgIEVOVU1fS0VZVyA9IDI2NSwKKyAgICAgRVhURVJOX0tFWVcgPSAyNjYsCisgICAgIEVYVEVOU0lPTl9LRVlXID0gMjY3LAorICAgICBGTE9BVF9LRVlXID0gMjY4LAorICAgICBJTkxJTkVfS0VZVyA9IDI2OSwKKyAgICAgSU5UX0tFWVcgPSAyNzAsCisgICAgIExPTkdfS0VZVyA9IDI3MSwKKyAgICAgUkVHSVNURVJfS0VZVyA9IDI3MiwKKyAgICAgUkVTVFJJQ1RfS0VZVyA9IDI3MywKKyAgICAgU0hPUlRfS0VZVyA9IDI3NCwKKyAgICAgU0lHTkVEX0tFWVcgPSAyNzUsCisgICAgIFNUQVRJQ19LRVlXID0gMjc2LAorICAgICBTVFJVQ1RfS0VZVyA9IDI3NywKKyAgICAgVFlQRURFRl9LRVlXID0gMjc4LAorICAgICBVTklPTl9LRVlXID0gMjc5LAorICAgICBVTlNJR05FRF9LRVlXID0gMjgwLAorICAgICBWT0lEX0tFWVcgPSAyODEsCisgICAgIFZPTEFUSUxFX0tFWVcgPSAyODIsCisgICAgIFRZUEVPRl9LRVlXID0gMjgzLAorICAgICBFWFBPUlRfU1lNQk9MX0tFWVcgPSAyODQsCisgICAgIEFTTV9QSFJBU0UgPSAyODUsCisgICAgIEFUVFJJQlVURV9QSFJBU0UgPSAyODYsCisgICAgIEJSQUNFX1BIUkFTRSA9IDI4NywKKyAgICAgQlJBQ0tFVF9QSFJBU0UgPSAyODgsCisgICAgIEVYUFJFU1NJT05fUEhSQVNFID0gMjg5LAorICAgICBDSEFSID0gMjkwLAorICAgICBET1RTID0gMjkxLAorICAgICBJREVOVCA9IDI5MiwKKyAgICAgSU5UID0gMjkzLAorICAgICBSRUFMID0gMjk0LAorICAgICBTVFJJTkcgPSAyOTUsCisgICAgIFRZUEUgPSAyOTYsCisgICAgIE9USEVSID0gMjk3LAorICAgICBGSUxFTkFNRSA9IDI5OAorICAgfTsKKyNlbmRpZgorCisKKworI2lmICEgZGVmaW5lZCBZWVNUWVBFICYmICEgZGVmaW5lZCBZWVNUWVBFX0lTX0RFQ0xBUkVECit0eXBlZGVmIGludCBZWVNUWVBFOworIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKKyMgZGVmaW5lIHl5c3R5cGUgWVlTVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KKyMgZGVmaW5lIFlZU1RZUEVfSVNfREVDTEFSRUQgMQorI2VuZGlmCisKK2V4dGVybiBZWVNUWVBFIHl5bHZhbDsKKworCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsIGIvc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbAppbmRleCBkMjlhOGQ3Li5lYjJmMWU2IDEwMDc1NQotLS0gYS9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsCisrKyBiL3NjcmlwdHMvZ2V0X21haW50YWluZXIucGwKQEAgLTMyOCw3ICszMjgsOCBAQAogCSMgbmFtZTEgPG1haWwxPiA8bWFpbDI+CiAJIyBuYW1lMSA8bWFpbDE+IG5hbWUyIDxtYWlsMj4KIAkjIChzZWUgbWFuIGdpdC1zaG9ydGxvZykKLQlpZiAoL14oLispPCguKyk+JC8pIHsKKworCWlmICgvXihbXjxdKyk8KFtePl0rKT4kLykgewogCSAgICBteSAkcmVhbF9uYW1lID0gJDE7CiAJICAgIG15ICRhZGRyZXNzID0gJDI7CiAKQEAgLTMzNiwxMyArMzM3LDEzIEBACiAJICAgICgkcmVhbF9uYW1lLCAkYWRkcmVzcykgPSBwYXJzZV9lbWFpbCgiJHJlYWxfbmFtZSA8JGFkZHJlc3M+Iik7CiAJICAgICRtYWlsbWFwLT57bmFtZXN9LT57JGFkZHJlc3N9ID0gJHJlYWxfbmFtZTsKIAotCX0gZWxzaWYgKC9ePChbXlxzXSspPlxzKjwoW15cc10rKT4kLykgeworCX0gZWxzaWYgKC9ePChbXj5dKyk+XHMqPChbXj5dKyk+JC8pIHsKIAkgICAgbXkgJHJlYWxfYWRkcmVzcyA9ICQxOwogCSAgICBteSAkd3JvbmdfYWRkcmVzcyA9ICQyOwogCiAJICAgICRtYWlsbWFwLT57YWRkcmVzc2VzfS0+eyR3cm9uZ19hZGRyZXNzfSA9ICRyZWFsX2FkZHJlc3M7CiAKLQl9IGVsc2lmICgvXiguKyk8KFteXHNdKyk+XHMqPChbXlxzXSspPiQvKSB7CisJfSBlbHNpZiAoL14oLispPChbXj5dKyk+XHMqPChbXj5dKyk+JC8pIHsKIAkgICAgbXkgJHJlYWxfbmFtZSA9ICQxOwogCSAgICBteSAkcmVhbF9hZGRyZXNzID0gJDI7CiAJICAgIG15ICR3cm9uZ19hZGRyZXNzID0gJDM7CkBAIC0zNTMsNyArMzU0LDcgQEAKIAkgICAgJG1haWxtYXAtPntuYW1lc30tPnskd3JvbmdfYWRkcmVzc30gPSAkcmVhbF9uYW1lOwogCSAgICAkbWFpbG1hcC0+e2FkZHJlc3Nlc30tPnskd3JvbmdfYWRkcmVzc30gPSAkcmVhbF9hZGRyZXNzOwogCi0JfSBlbHNpZiAoL14oLispPChbXlxzXSspPlxzKihbXlxzXS4qKTwoW15cc10rKT4kLykgeworCX0gZWxzaWYgKC9eKC4rKTwoW14+XSspPlxzKiguKylccyo8KFtePl0rKT4kLykgewogCSAgICBteSAkcmVhbF9uYW1lID0gJDE7CiAJICAgIG15ICRyZWFsX2FkZHJlc3MgPSAkMjsKIAkgICAgbXkgJHdyb25nX25hbWUgPSAkMzsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvaGVhZGVyc19pbnN0YWxsLnBsIGIvc2NyaXB0cy9oZWFkZXJzX2luc3RhbGwucGwKaW5kZXggZWZiM2JlMS4uNDg0NjJiZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9oZWFkZXJzX2luc3RhbGwucGwKKysrIGIvc2NyaXB0cy9oZWFkZXJzX2luc3RhbGwucGwKQEAgLTM1LDYgKzM1LDcgQEAKIAkJJGxpbmUgPX4gcy8oW1xzKF0pX19pb21lbVxzLyQxL2c7CiAJCSRsaW5lID1+IHMvXHNfX2F0dHJpYnV0ZV9jb25zdF9fXHMvIC9nOwogCQkkbGluZSA9fiBzL1xzX19hdHRyaWJ1dGVfY29uc3RfXyQvL2c7CisJCSRsaW5lID1+IHMvXGJfX3BhY2tlZFxiL19fYXR0cmlidXRlX18oKHBhY2tlZCkpL2c7CiAJCSRsaW5lID1+IHMvXiNpbmNsdWRlIDxsaW51eFwvY29tcGlsZXIuaD4vLzsKIAkJJGxpbmUgPX4gcy8oXnxccykoaW5saW5lKVxiLyQxX18kMl9fL2c7CiAJCSRsaW5lID1+IHMvKF58XHMpKGFzbSlcYihcc3xbKF18JCkvJDFfXyQyX18kMy9nOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnLy5naXRpZ25vcmUgYi9zY3JpcHRzL2tjb25maWcvLmdpdGlnbm9yZQppbmRleCA2MjRmNjUwLi5lZTEyMGQ0IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvLmdpdGlnbm9yZQorKysgYi9zY3JpcHRzL2tjb25maWcvLmdpdGlnbm9yZQpAQCAtMiw3ICsyLDcgQEAKICMgR2VuZXJhdGVkIGZpbGVzCiAjCiBjb25maWcqCi1sZXguKi5jCisqLmxleC5jCiAqLnRhYi5jCiAqLnRhYi5oCiB6Y29uZi5oYXNoLmMKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZSBiL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQppbmRleCBmYWE5YTQ3Li4wYjQyNzZjIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCkBAIC0yMDQsNyArMjA0LDcgQEAKIGVuZGlmCiAKIGNsZWFuLWZpbGVzCTo9IGxrY19kZWZzLmggcWNvbmYubW9jIC50bXBfcXRjaGVjayAudG1wX2d0a2NoZWNrCi1jbGVhbi1maWxlcwkrPSB6Y29uZi50YWIuYyBsZXguemNvbmYuYyB6Y29uZi5oYXNoLmMgZ2NvbmYuZ2xhZGUuaAorY2xlYW4tZmlsZXMJKz0gemNvbmYudGFiLmMgemNvbmYubGV4LmMgemNvbmYuaGFzaC5jIGdjb25mLmdsYWRlLmgKIGNsZWFuLWZpbGVzICAgICArPSBtY29uZiBxY29uZiBnY29uZiBuY29uZgogY2xlYW4tZmlsZXMgICAgICs9IGNvbmZpZy5wb3QgbGludXgucG90CiAKQEAgLTIyMCw5ICsyMjAsMTIgQEAKIEhPU1RfRVhUUkFDRkxBR1MgKz0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS8kKHNyYykvY2hlY2suc2ggJChIT1NUQ0MpICQoSE9TVENGTEFHUykpCiAKICMgZ2VuZXJhdGVkIGZpbGVzIHNlZW0gdG8gbmVlZCB0aGlzIHRvIGZpbmQgbG9jYWwgaW5jbHVkZSBmaWxlcwotSE9TVENGTEFHU19sZXguemNvbmYubwk6PSAtSSQoc3JjKQorSE9TVENGTEFHU196Y29uZi5sZXgubwk6PSAtSSQoc3JjKQogSE9TVENGTEFHU196Y29uZi50YWIubwk6PSAtSSQoc3JjKQogCitMRVhfUFJFRklYX3pjb25mCTo9IHpjb25mCitZQUNDX1BSRUZJWF96Y29uZgk6PSB6Y29uZgorCiBIT1NUTE9BRExJQkVTX3Fjb25mCT0gJChLQ19RVF9MSUJTKSAtbGRsCiBIT1NUQ1hYRkxBR1NfcWNvbmYubwk9ICQoS0NfUVRfQ0ZMQUdTKSAtRCBMS0NfRElSRUNUX0xJTksKIApAQCAtMzE2LDcgKzMxOSw3IEBACiAJZmkKIGVuZGlmCiAKLSQob2JqKS96Y29uZi50YWIubzogJChvYmopL2xleC56Y29uZi5jICQob2JqKS96Y29uZi5oYXNoLmMKKyQob2JqKS96Y29uZi50YWIubzogJChvYmopL3pjb25mLmxleC5jICQob2JqKS96Y29uZi5oYXNoLmMKIAogJChvYmopL2tjb25maWdfbG9hZC5vOiAkKG9iaikvbGtjX2RlZnMuaAogCkBAIC0zMzUsMjggKzMzOCwzIEBACiAJJChRKWludGx0b29sLWV4dHJhY3QgLS10eXBlPWdldHRleHQvZ2xhZGUgLS1zcmNkaXI9JChzcmN0cmVlKSBcCiAJJChvYmopL2djb25mLmdsYWRlCiAKLSMjIwotIyBUaGUgZm9sbG93aW5nIHJlcXVpcmVzIGZsZXgvYmlzb24vZ3BlcmYKLSMgQnkgZGVmYXVsdCB3ZSB1c2UgdGhlIF9zaGlwcGVkIHZlcnNpb25zLCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIGlmCi0jIHlvdSBhcmUgbW9kaWZ5aW5nIHRoZSBmbGV4L2Jpc29uIHNyYy4KLSMgTEtDX0dFTlBBUlNFUiA6PSAxCi0KLWlmZGVmIExLQ19HRU5QQVJTRVIKLQotJChvYmopL3pjb25mLnRhYi5jOiAkKHNyYykvemNvbmYueQotJChvYmopL2xleC56Y29uZi5jOiAkKHNyYykvemNvbmYubAotJChvYmopL3pjb25mLmhhc2guYzogJChzcmMpL3pjb25mLmdwZXJmCi0KLSUudGFiLmM6ICUueQotCWJpc29uIC1sIC1iICQqIC1wICQobm90ZGlyICQqKSAkPAotCWNwICRAICRAX3NoaXBwZWQKLQotbGV4LiUuYzogJS5sCi0JZmxleCAtTCAtUCQobm90ZGlyICQqKSAtbyRAICQ8Ci0JY3AgJEAgJEBfc2hpcHBlZAotCi0lLmhhc2guYzogJS5ncGVyZgotCWdwZXJmIDwgJDwgPiAkQAotCWNwICRAICRAX3NoaXBwZWQKLQotZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sZXguemNvbmYuY19zaGlwcGVkIGIvc2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jX3NoaXBwZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MTgyOTEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jX3NoaXBwZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNDM1ICswLDAgQEAKLQotI2xpbmUgMyAic2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jIgotCi0jZGVmaW5lICBZWV9JTlRfQUxJR05FRCBzaG9ydCBpbnQKLQotLyogQSBsZXhpY2FsIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IGZsZXggKi8KLQotI2RlZmluZSB5eV9jcmVhdGVfYnVmZmVyIHpjb25mX2NyZWF0ZV9idWZmZXIKLSNkZWZpbmUgeXlfZGVsZXRlX2J1ZmZlciB6Y29uZl9kZWxldGVfYnVmZmVyCi0jZGVmaW5lIHl5X2ZsZXhfZGVidWcgemNvbmZfZmxleF9kZWJ1ZwotI2RlZmluZSB5eV9pbml0X2J1ZmZlciB6Y29uZl9pbml0X2J1ZmZlcgotI2RlZmluZSB5eV9mbHVzaF9idWZmZXIgemNvbmZfZmx1c2hfYnVmZmVyCi0jZGVmaW5lIHl5X2xvYWRfYnVmZmVyX3N0YXRlIHpjb25mX2xvYWRfYnVmZmVyX3N0YXRlCi0jZGVmaW5lIHl5X3N3aXRjaF90b19idWZmZXIgemNvbmZfc3dpdGNoX3RvX2J1ZmZlcgotI2RlZmluZSB5eWluIHpjb25maW4KLSNkZWZpbmUgeXlsZW5nIHpjb25mbGVuZwotI2RlZmluZSB5eWxleCB6Y29uZmxleAotI2RlZmluZSB5eWxpbmVubyB6Y29uZmxpbmVubwotI2RlZmluZSB5eW91dCB6Y29uZm91dAotI2RlZmluZSB5eXJlc3RhcnQgemNvbmZyZXN0YXJ0Ci0jZGVmaW5lIHl5dGV4dCB6Y29uZnRleHQKLSNkZWZpbmUgeXl3cmFwIHpjb25md3JhcAotI2RlZmluZSB5eWFsbG9jIHpjb25mYWxsb2MKLSNkZWZpbmUgeXlyZWFsbG9jIHpjb25mcmVhbGxvYwotI2RlZmluZSB5eWZyZWUgemNvbmZmcmVlCi0KLSNkZWZpbmUgRkxFWF9TQ0FOTkVSCi0jZGVmaW5lIFlZX0ZMRVhfTUFKT1JfVkVSU0lPTiAyCi0jZGVmaW5lIFlZX0ZMRVhfTUlOT1JfVkVSU0lPTiA1Ci0jZGVmaW5lIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiAzNQotI2lmIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiA+IDAKLSNkZWZpbmUgRkxFWF9CRVRBCi0jZW5kaWYKLQotLyogRmlyc3QsIHdlIGRlYWwgd2l0aCAgcGxhdGZvcm0tc3BlY2lmaWMgb3IgY29tcGlsZXItc3BlY2lmaWMgaXNzdWVzLiAqLwotCi0vKiBiZWdpbiBzdGFuZGFyZCBDIGhlYWRlcnMuICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0vKiBlbmQgc3RhbmRhcmQgQyBoZWFkZXJzLiAqLwotCi0vKiBmbGV4IGludGVnZXIgdHlwZSBkZWZpbml0aW9ucyAqLwotCi0jaWZuZGVmIEZMRVhJTlRfSAotI2RlZmluZSBGTEVYSU5UX0gKLQotLyogQzk5IHN5c3RlbXMgaGF2ZSA8aW50dHlwZXMuaD4uIE5vbi1DOTkgc3lzdGVtcyBtYXkgb3IgbWF5IG5vdC4gKi8KLQotI2lmIGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAotCi0vKiBDOTkgc2F5cyB0byBkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUyBiZWZvcmUgaW5jbHVkaW5nIHN0ZGludC5oLAotICogaWYgeW91IHdhbnQgdGhlIGxpbWl0IChtYXgvbWluKSBtYWNyb3MgZm9yIGludCB0eXBlcy4gCi0gKi8KLSNpZm5kZWYgX19TVERDX0xJTUlUX01BQ1JPUwotI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIDEKLSNlbmRpZgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLXR5cGVkZWYgaW50OF90IGZsZXhfaW50OF90OwotdHlwZWRlZiB1aW50OF90IGZsZXhfdWludDhfdDsKLXR5cGVkZWYgaW50MTZfdCBmbGV4X2ludDE2X3Q7Ci10eXBlZGVmIHVpbnQxNl90IGZsZXhfdWludDE2X3Q7Ci10eXBlZGVmIGludDMyX3QgZmxleF9pbnQzMl90OwotdHlwZWRlZiB1aW50MzJfdCBmbGV4X3VpbnQzMl90OwotI2Vsc2UKLXR5cGVkZWYgc2lnbmVkIGNoYXIgZmxleF9pbnQ4X3Q7Ci10eXBlZGVmIHNob3J0IGludCBmbGV4X2ludDE2X3Q7Ci10eXBlZGVmIGludCBmbGV4X2ludDMyX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgZmxleF91aW50OF90OyAKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGZsZXhfdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBmbGV4X3VpbnQzMl90OwotCi0vKiBMaW1pdHMgb2YgaW50ZWdyYWwgdHlwZXMuICovCi0jaWZuZGVmIElOVDhfTUlOCi0jZGVmaW5lIElOVDhfTUlOICAgICAgICAgICAgICAgKC0xMjgpCi0jZW5kaWYKLSNpZm5kZWYgSU5UMTZfTUlOCi0jZGVmaW5lIElOVDE2X01JTiAgICAgICAgICAgICAgKC0zMjc2Ny0xKQotI2VuZGlmCi0jaWZuZGVmIElOVDMyX01JTgotI2RlZmluZSBJTlQzMl9NSU4gICAgICAgICAgICAgICgtMjE0NzQ4MzY0Ny0xKQotI2VuZGlmCi0jaWZuZGVmIElOVDhfTUFYCi0jZGVmaW5lIElOVDhfTUFYICAgICAgICAgICAgICAgKDEyNykKLSNlbmRpZgotI2lmbmRlZiBJTlQxNl9NQVgKLSNkZWZpbmUgSU5UMTZfTUFYICAgICAgICAgICAgICAoMzI3NjcpCi0jZW5kaWYKLSNpZm5kZWYgSU5UMzJfTUFYCi0jZGVmaW5lIElOVDMyX01BWCAgICAgICAgICAgICAgKDIxNDc0ODM2NDcpCi0jZW5kaWYKLSNpZm5kZWYgVUlOVDhfTUFYCi0jZGVmaW5lIFVJTlQ4X01BWCAgICAgICAgICAgICAgKDI1NVUpCi0jZW5kaWYKLSNpZm5kZWYgVUlOVDE2X01BWAotI2RlZmluZSBVSU5UMTZfTUFYICAgICAgICAgICAgICg2NTUzNVUpCi0jZW5kaWYKLSNpZm5kZWYgVUlOVDMyX01BWAotI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VSkKLSNlbmRpZgotCi0jZW5kaWYgLyogISBDOTkgKi8KLQotI2VuZGlmIC8qICEgRkxFWElOVF9IICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBUaGUgImNvbnN0IiBzdG9yYWdlLWNsYXNzLW1vZGlmaWVyIGlzIHZhbGlkLiAqLwotI2RlZmluZSBZWV9VU0VfQ09OU1QKLQotI2Vsc2UJLyogISBfX2NwbHVzcGx1cyAqLwotCi0vKiBDOTkgcmVxdWlyZXMgX19TVERDX18gdG8gYmUgZGVmaW5lZCBhcyAxLiAqLwotI2lmIGRlZmluZWQgKF9fU1REQ19fKQotCi0jZGVmaW5lIFlZX1VTRV9DT05TVAotCi0jZW5kaWYJLyogZGVmaW5lZCAoX19TVERDX18pICovCi0jZW5kaWYJLyogISBfX2NwbHVzcGx1cyAqLwotCi0jaWZkZWYgWVlfVVNFX0NPTlNUCi0jZGVmaW5lIHl5Y29uc3QgY29uc3QKLSNlbHNlCi0jZGVmaW5lIHl5Y29uc3QKLSNlbmRpZgotCi0vKiBSZXR1cm5lZCB1cG9uIGVuZC1vZi1maWxlLiAqLwotI2RlZmluZSBZWV9OVUxMIDAKLQotLyogUHJvbW90ZXMgYSBwb3NzaWJseSBuZWdhdGl2ZSwgcG9zc2libHkgc2lnbmVkIGNoYXIgdG8gYW4gdW5zaWduZWQKLSAqIGludGVnZXIgZm9yIHVzZSBhcyBhbiBhcnJheSBpbmRleC4gIElmIHRoZSBzaWduZWQgY2hhciBpcyBuZWdhdGl2ZSwKLSAqIHdlIHdhbnQgdG8gaW5zdGVhZCB0cmVhdCBpdCBhcyBhbiA4LWJpdCB1bnNpZ25lZCBjaGFyLCBoZW5jZSB0aGUKLSAqIGRvdWJsZSBjYXN0LgotICovCi0jZGVmaW5lIFlZX1NDX1RPX1VJKGMpICgodW5zaWduZWQgaW50KSAodW5zaWduZWQgY2hhcikgYykKLQotLyogRW50ZXIgYSBzdGFydCBjb25kaXRpb24uICBUaGlzIG1hY3JvIHJlYWxseSBvdWdodCB0byB0YWtlIGEgcGFyYW1ldGVyLAotICogYnV0IHdlIGRvIGl0IHRoZSBkaXNndXN0aW5nIGNydWZ0eSB3YXkgZm9yY2VkIG9uIHVzIGJ5IHRoZSAoKS1sZXNzCi0gKiBkZWZpbml0aW9uIG9mIEJFR0lOLgotICovCi0jZGVmaW5lIEJFR0lOICh5eV9zdGFydCkgPSAxICsgMiAqCi0KLS8qIFRyYW5zbGF0ZSB0aGUgY3VycmVudCBzdGFydCBzdGF0ZSBpbnRvIGEgdmFsdWUgdGhhdCBjYW4gYmUgbGF0ZXIgaGFuZGVkCi0gKiB0byBCRUdJTiB0byByZXR1cm4gdG8gdGhlIHN0YXRlLiAgVGhlIFlZU1RBVEUgYWxpYXMgaXMgZm9yIGxleAotICogY29tcGF0aWJpbGl0eS4KLSAqLwotI2RlZmluZSBZWV9TVEFSVCAoKCh5eV9zdGFydCkgLSAxKSAvIDIpCi0jZGVmaW5lIFlZU1RBVEUgWVlfU1RBUlQKLQotLyogQWN0aW9uIG51bWJlciBmb3IgRU9GIHJ1bGUgb2YgYSBnaXZlbiBzdGFydCBzdGF0ZS4gKi8KLSNkZWZpbmUgWVlfU1RBVEVfRU9GKHN0YXRlKSAoWVlfRU5EX09GX0JVRkZFUiArIHN0YXRlICsgMSkKLQotLyogU3BlY2lhbCBhY3Rpb24gbWVhbmluZyAic3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBmaWxlIi4gKi8KLSNkZWZpbmUgWVlfTkVXX0ZJTEUgemNvbmZyZXN0YXJ0KHpjb25maW4gICkKLQotI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgMAotCi0vKiBTaXplIG9mIGRlZmF1bHQgaW5wdXQgYnVmZmVyLiAqLwotI2lmbmRlZiBZWV9CVUZfU0laRQotI2lmZGVmIF9faWE2NF9fCi0vKiBPbiBJQS02NCwgdGhlIGJ1ZmZlciBzaXplIGlzIDE2aywgbm90IDhrLgotICogTW9yZW92ZXIsIFlZX0JVRl9TSVpFIGlzIDIqWVlfUkVBRF9CVUZfU0laRSBpbiB0aGUgZ2VuZXJhbCBjYXNlLgotICogRGl0dG8gZm9yIHRoZSBfX2lhNjRfXyBjYXNlIGFjY29yZGluZ2x5LgotICovCi0jZGVmaW5lIFlZX0JVRl9TSVpFIDMyNzY4Ci0jZWxzZQotI2RlZmluZSBZWV9CVUZfU0laRSAxNjM4NAotI2VuZGlmIC8qIF9faWE2NF9fICovCi0jZW5kaWYKLQotLyogVGhlIHN0YXRlIGJ1ZiBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIG9uZSBzdGF0ZSBwZXIgY2hhcmFjdGVyIGluIHRoZSBtYWluIGJ1ZmZlci4KLSAqLwotI2RlZmluZSBZWV9TVEFURV9CVUZfU0laRSAgICgoWVlfQlVGX1NJWkUgKyAyKSAqIHNpemVvZih5eV9zdGF0ZV90eXBlKSkKLQotI2lmbmRlZiBZWV9UWVBFREVGX1lZX0JVRkZFUl9TVEFURQotI2RlZmluZSBZWV9UWVBFREVGX1lZX0JVRkZFUl9TVEFURQotdHlwZWRlZiBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICpZWV9CVUZGRVJfU1RBVEU7Ci0jZW5kaWYKLQotZXh0ZXJuIGludCB6Y29uZmxlbmc7Ci0KLWV4dGVybiBGSUxFICp6Y29uZmluLCAqemNvbmZvdXQ7Ci0KLSNkZWZpbmUgRU9CX0FDVF9DT05USU5VRV9TQ0FOIDAKLSNkZWZpbmUgRU9CX0FDVF9FTkRfT0ZfRklMRSAxCi0jZGVmaW5lIEVPQl9BQ1RfTEFTVF9NQVRDSCAyCi0KLSAgICAjZGVmaW5lIFlZX0xFU1NfTElORU5PKG4pCi0gICAgCi0vKiBSZXR1cm4gYWxsIGJ1dCB0aGUgZmlyc3QgIm4iIG1hdGNoZWQgY2hhcmFjdGVycyBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW0uICovCi0jZGVmaW5lIHl5bGVzcyhuKSBcCi0JZG8gXAotCQl7IFwKLQkJLyogVW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0LiAqLyBcCi0gICAgICAgIGludCB5eWxlc3NfbWFjcm9fYXJnID0gKG4pOyBcCi0gICAgICAgIFlZX0xFU1NfTElORU5PKHl5bGVzc19tYWNyb19hcmcpO1wKLQkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IFwKLQkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVCBcCi0JCSh5eV9jX2J1Zl9wKSA9IHl5X2NwID0geXlfYnAgKyB5eWxlc3NfbWFjcm9fYXJnIC0gWVlfTU9SRV9BREo7IFwKLQkJWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHpjb25mdGV4dCBhZ2FpbiAqLyBcCi0JCX0gXAotCXdoaWxlICggMCApCi0KLSNkZWZpbmUgdW5wdXQoYykgeXl1bnB1dCggYywgKHl5dGV4dF9wdHIpICApCi0KLSNpZm5kZWYgWVlfVFlQRURFRl9ZWV9TSVpFX1QKLSNkZWZpbmUgWVlfVFlQRURFRl9ZWV9TSVpFX1QKLXR5cGVkZWYgc2l6ZV90IHl5X3NpemVfdDsKLSNlbmRpZgotCi0jaWZuZGVmIFlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUKLSNkZWZpbmUgWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURQotc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZQotCXsKLQlGSUxFICp5eV9pbnB1dF9maWxlOwotCi0JY2hhciAqeXlfY2hfYnVmOwkJLyogaW5wdXQgYnVmZmVyICovCi0JY2hhciAqeXlfYnVmX3BvczsJCS8qIGN1cnJlbnQgcG9zaXRpb24gaW4gaW5wdXQgYnVmZmVyICovCi0KLQkvKiBTaXplIG9mIGlucHV0IGJ1ZmZlciBpbiBieXRlcywgbm90IGluY2x1ZGluZyByb29tIGZvciBFT0IKLQkgKiBjaGFyYWN0ZXJzLgotCSAqLwotCXl5X3NpemVfdCB5eV9idWZfc2l6ZTsKLQotCS8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgaW50byB5eV9jaF9idWYsIG5vdCBpbmNsdWRpbmcgRU9CCi0JICogY2hhcmFjdGVycy4KLQkgKi8KLQlpbnQgeXlfbl9jaGFyczsKLQotCS8qIFdoZXRoZXIgd2UgIm93biIgdGhlIGJ1ZmZlciAtIGkuZS4sIHdlIGtub3cgd2UgY3JlYXRlZCBpdCwKLQkgKiBhbmQgY2FuIHJlYWxsb2MoKSBpdCB0byBncm93IGl0LCBhbmQgc2hvdWxkIGZyZWUoKSBpdCB0bwotCSAqIGRlbGV0ZSBpdC4KLQkgKi8KLQlpbnQgeXlfaXNfb3VyX2J1ZmZlcjsKLQotCS8qIFdoZXRoZXIgdGhpcyBpcyBhbiAiaW50ZXJhY3RpdmUiIGlucHV0IHNvdXJjZTsgaWYgc28sIGFuZAotCSAqIGlmIHdlJ3JlIHVzaW5nIHN0ZGlvIGZvciBpbnB1dCwgdGhlbiB3ZSB3YW50IHRvIHVzZSBnZXRjKCkKLQkgKiBpbnN0ZWFkIG9mIGZyZWFkKCksIHRvIG1ha2Ugc3VyZSB3ZSBzdG9wIGZldGNoaW5nIGlucHV0IGFmdGVyCi0JICogZWFjaCBuZXdsaW5lLgotCSAqLwotCWludCB5eV9pc19pbnRlcmFjdGl2ZTsKLQotCS8qIFdoZXRoZXIgd2UncmUgY29uc2lkZXJlZCB0byBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4KLQkgKiBJZiBzbywgJ14nIHJ1bGVzIHdpbGwgYmUgYWN0aXZlIG9uIHRoZSBuZXh0IG1hdGNoLCBvdGhlcndpc2UKLQkgKiBub3QuCi0JICovCi0JaW50IHl5X2F0X2JvbDsKLQotICAgIGludCB5eV9ic19saW5lbm87IC8qKjwgVGhlIGxpbmUgY291bnQuICovCi0gICAgaW50IHl5X2JzX2NvbHVtbjsgLyoqPCBUaGUgY29sdW1uIGNvdW50LiAqLwotICAgIAotCS8qIFdoZXRoZXIgdG8gdHJ5IHRvIGZpbGwgdGhlIGlucHV0IGJ1ZmZlciB3aGVuIHdlIHJlYWNoIHRoZQotCSAqIGVuZCBvZiBpdC4KLQkgKi8KLQlpbnQgeXlfZmlsbF9idWZmZXI7Ci0KLQlpbnQgeXlfYnVmZmVyX3N0YXR1czsKLQotI2RlZmluZSBZWV9CVUZGRVJfTkVXIDAKLSNkZWZpbmUgWVlfQlVGRkVSX05PUk1BTCAxCi0JLyogV2hlbiBhbiBFT0YncyBiZWVuIHNlZW4gYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSB0ZXh0IHRvIHByb2Nlc3MKLQkgKiB0aGVuIHdlIG1hcmsgdGhlIGJ1ZmZlciBhcyBZWV9FT0ZfUEVORElORywgdG8gaW5kaWNhdGUgdGhhdCB3ZQotCSAqIHNob3VsZG4ndCB0cnkgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzb3VyY2UgYW55IG1vcmUuICBXZSBtaWdodAotCSAqIHN0aWxsIGhhdmUgYSBidW5jaCBvZiB0b2tlbnMgdG8gbWF0Y2gsIHRob3VnaCwgYmVjYXVzZSBvZgotCSAqIHBvc3NpYmxlIGJhY2tpbmctdXAuCi0JICoKLQkgKiBXaGVuIHdlIGFjdHVhbGx5IHNlZSB0aGUgRU9GLCB3ZSBjaGFuZ2UgdGhlIHN0YXR1cyB0byAibmV3IgotCSAqICh2aWEgemNvbmZyZXN0YXJ0KCkpLCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBjb250aW51ZSBzY2FubmluZyBieQotCSAqIGp1c3QgcG9pbnRpbmcgemNvbmZpbiBhdCBhIG5ldyBpbnB1dCBmaWxlLgotCSAqLwotI2RlZmluZSBZWV9CVUZGRVJfRU9GX1BFTkRJTkcgMgotCi0JfTsKLSNlbmRpZiAvKiAhWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURSAqLwotCi0vKiBTdGFjayBvZiBpbnB1dCBidWZmZXJzLiAqLwotc3RhdGljIHNpemVfdCB5eV9idWZmZXJfc3RhY2tfdG9wID0gMDsgLyoqPCBpbmRleCBvZiB0b3Agb2Ygc3RhY2suICovCi1zdGF0aWMgc2l6ZV90IHl5X2J1ZmZlcl9zdGFja19tYXggPSAwOyAvKio8IGNhcGFjaXR5IG9mIHN0YWNrLiAqLwotc3RhdGljIFlZX0JVRkZFUl9TVEFURSAqIHl5X2J1ZmZlcl9zdGFjayA9IDA7IC8qKjwgU3RhY2sgYXMgYW4gYXJyYXkuICovCi0KLS8qIFdlIHByb3ZpZGUgbWFjcm9zIGZvciBhY2Nlc3NpbmcgYnVmZmVyIHN0YXRlcyBpbiBjYXNlIGluIHRoZQotICogZnV0dXJlIHdlIHdhbnQgdG8gcHV0IHRoZSBidWZmZXIgc3RhdGVzIGluIGEgbW9yZSBnZW5lcmFsCi0gKiAic2Nhbm5lciBzdGF0ZSIuCi0gKgotICogUmV0dXJucyB0aGUgdG9wIG9mIHRoZSBzdGFjaywgb3IgTlVMTC4KLSAqLwotI2RlZmluZSBZWV9DVVJSRU5UX0JVRkZFUiAoICh5eV9idWZmZXJfc3RhY2spIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoeXlfYnVmZmVyX3N0YWNrKVsoeXlfYnVmZmVyX3N0YWNrX3RvcCldIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMKQotCi0vKiBTYW1lIGFzIHByZXZpb3VzIG1hY3JvLCBidXQgdXNlZnVsIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBidWZmZXIgc3RhY2sgaXMgbm90Ci0gKiBOVUxMIG9yIHdoZW4gd2UgbmVlZCBhbiBsdmFsdWUuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KLSAqLwotI2RlZmluZSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgKHl5X2J1ZmZlcl9zdGFjaylbKHl5X2J1ZmZlcl9zdGFja190b3ApXQotCi0vKiB5eV9ob2xkX2NoYXIgaG9sZHMgdGhlIGNoYXJhY3RlciBsb3N0IHdoZW4gemNvbmZ0ZXh0IGlzIGZvcm1lZC4gKi8KLXN0YXRpYyBjaGFyIHl5X2hvbGRfY2hhcjsKLXN0YXRpYyBpbnQgeXlfbl9jaGFyczsJCS8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgaW50byB5eV9jaF9idWYgKi8KLWludCB6Y29uZmxlbmc7Ci0KLS8qIFBvaW50cyB0byBjdXJyZW50IGNoYXJhY3RlciBpbiBidWZmZXIuICovCi1zdGF0aWMgY2hhciAqeXlfY19idWZfcCA9IChjaGFyICopIDA7Ci1zdGF0aWMgaW50IHl5X2luaXQgPSAwOwkJLyogd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgKi8KLXN0YXRpYyBpbnQgeXlfc3RhcnQgPSAwOwkvKiBzdGFydCBzdGF0ZSBudW1iZXIgKi8KLQotLyogRmxhZyB3aGljaCBpcyB1c2VkIHRvIGFsbG93IHpjb25md3JhcCgpJ3MgdG8gZG8gYnVmZmVyIHN3aXRjaGVzCi0gKiBpbnN0ZWFkIG9mIHNldHRpbmcgdXAgYSBmcmVzaCB6Y29uZmluLiAgQSBiaXQgb2YgYSBoYWNrIC4uLgotICovCi1zdGF0aWMgaW50IHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZjsKLQotdm9pZCB6Y29uZnJlc3RhcnQgKEZJTEUgKmlucHV0X2ZpbGUgICk7Ci12b2lkIHpjb25mX3N3aXRjaF90b19idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICApOwotWVlfQlVGRkVSX1NUQVRFIHpjb25mX2NyZWF0ZV9idWZmZXIgKEZJTEUgKmZpbGUsaW50IHNpemUgICk7Ci12b2lkIHpjb25mX2RlbGV0ZV9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiICApOwotdm9pZCB6Y29uZl9mbHVzaF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiICApOwotdm9pZCB6Y29uZnB1c2hfYnVmZmVyX3N0YXRlIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAgKTsKLXZvaWQgemNvbmZwb3BfYnVmZmVyX3N0YXRlICh2b2lkICk7Ci0KLXN0YXRpYyB2b2lkIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAodm9pZCApOwotc3RhdGljIHZvaWQgemNvbmZfbG9hZF9idWZmZXJfc3RhdGUgKHZvaWQgKTsKLXN0YXRpYyB2b2lkIHpjb25mX2luaXRfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYixGSUxFICpmaWxlICApOwotCi0jZGVmaW5lIFlZX0ZMVVNIX0JVRkZFUiB6Y29uZl9mbHVzaF9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgKQotCi1ZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9idWZmZXIgKGNoYXIgKmJhc2UseXlfc2l6ZV90IHNpemUgICk7Ci1ZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9zdHJpbmcgKHl5Y29uc3QgY2hhciAqeXlfc3RyICApOwotWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnl0ZXMgKHl5Y29uc3QgY2hhciAqYnl0ZXMsaW50IGxlbiAgKTsKLQotdm9pZCAqemNvbmZhbGxvYyAoeXlfc2l6ZV90ICApOwotdm9pZCAqemNvbmZyZWFsbG9jICh2b2lkICoseXlfc2l6ZV90ICApOwotdm9pZCB6Y29uZmZyZWUgKHZvaWQgKiAgKTsKLQotI2RlZmluZSB5eV9uZXdfYnVmZmVyIHpjb25mX2NyZWF0ZV9idWZmZXIKLQotI2RlZmluZSB5eV9zZXRfaW50ZXJhY3RpdmUoaXNfaW50ZXJhY3RpdmUpIFwKLQl7IFwKLQlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXsgXAotICAgICAgICB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7IFwKLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gICAgXAotICAgICAgICAgICAgemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFICk7IFwKLQl9IFwKLQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lzX2ludGVyYWN0aXZlID0gaXNfaW50ZXJhY3RpdmU7IFwKLQl9Ci0KLSNkZWZpbmUgeXlfc2V0X2JvbChhdF9ib2wpIFwKLQl7IFwKLQlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXtcCi0gICAgICAgIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsgXAotCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSAgICBcCi0gICAgICAgICAgICB6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUgKTsgXAotCX0gXAotCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sID0gYXRfYm9sOyBcCi0JfQotCi0jZGVmaW5lIFlZX0FUX0JPTCgpIChZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2F0X2JvbCkKLQotLyogQmVnaW4gdXNlciBzZWN0MyAqLwotCi0jZGVmaW5lIHpjb25md3JhcChuKSAxCi0jZGVmaW5lIFlZX1NLSVBfWVlXUkFQCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBZWV9DSEFSOwotCi1GSUxFICp6Y29uZmluID0gKEZJTEUgKikgMCwgKnpjb25mb3V0ID0gKEZJTEUgKikgMDsKLQotdHlwZWRlZiBpbnQgeXlfc3RhdGVfdHlwZTsKLQotZXh0ZXJuIGludCB6Y29uZmxpbmVubzsKLQotaW50IHpjb25mbGluZW5vID0gMTsKLQotZXh0ZXJuIGNoYXIgKnpjb25mdGV4dDsKLSNkZWZpbmUgeXl0ZXh0X3B0ciB6Y29uZnRleHQKLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9ueHRbXVsxN10gPQotICAgIHsKLSAgICB7Ci0gICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDEyLCAgIDEyLCAgIDE1LCAgIDEyLCAgIDEyLCAgIDEyLAotICAgICAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgICAxMiwgICAxMywgICAxNCwgICAxMiwgICAxMiwgICAxNSwgICAxMiwgICAxMiwgICAxMiwKLSAgICAgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMgotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAgMTYsICAgMTYsICAgMTcsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsCi0gICAgICAgMTYsICAgMTYsICAgMTYsICAgMTgsICAgMTYsICAgMTYsICAgMTYKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgIDE2LCAgIDE2LCAgIDE3LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LAotICAgICAgIDE2LCAgIDE2LCAgIDE2LCAgIDE4LCAgIDE2LCAgIDE2LCAgIDE2Ci0KLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgIDE5LCAgIDIwLCAgIDIxLCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LAotICAgICAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5Ci0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgICAxOSwgICAyMCwgICAyMSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwKLSAgICAgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOQotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAgMjIsICAgMjIsICAgMjMsICAgMjIsICAgMjQsICAgMjIsICAgMjIsICAgMjQsICAgMjIsCi0gICAgICAgMjIsICAgMjIsICAgMjIsICAgMjIsICAgMjIsICAgMjUsICAgMjIKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgIDIyLCAgIDIyLCAgIDIzLCAgIDIyLCAgIDI0LCAgIDIyLCAgIDIyLCAgIDI0LCAgIDIyLAotICAgICAgIDIyLCAgIDIyLCAgIDIyLCAgIDIyLCAgIDIyLCAgIDI1LCAgIDIyCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgICAyNiwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAyOSwgICAzMiwKLSAgICAgICAzMywgICAzNCwgICAzNSwgICAzNSwgICAzNiwgICAzNywgICAzOAotCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgICAyNiwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAyOSwgICAzMiwKLSAgICAgICAzMywgICAzNCwgICAzNSwgICAzNSwgICAzNiwgICAzNywgICAzOAotICAgIH0sCi0KLSAgICB7Ci0gICAgICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsCi0gICAgICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLAotICAgICAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC0xMywgICAzOSwgICA0MCwgIC0xMywgIC0xMywgICA0MSwgIC0xMywgIC0xMywgIC0xMywKLSAgICAgIC0xMywgIC0xMywgIC0xMywgIC0xMywgIC0xMywgIC0xMywgIC0xMwotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsCi0gICAgICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQsICAtMTQKLQotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAgNDIsICAgNDIsICAgNDMsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsCi0gICAgICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LAotICAgICAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2LCAgLTE2Ci0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywKLSAgICAgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNwotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsCi0gICAgICAtMTgsICAtMTgsICAtMTgsICAgNDQsICAtMTgsICAtMTgsICAtMTgKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgIDQ1LCAgIDQ1LCAgLTE5LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LAotICAgICAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1Ci0KLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTIwLCAgIDQ2LCAgIDQ3LCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLAotICAgICAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgICA0OCwgIC0yMSwgIC0yMSwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwKLSAgICAgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OAotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAgNDksICAgNDksICAgNTAsICAgNDksICAtMjIsICAgNDksICAgNDksICAtMjIsICAgNDksCi0gICAgICAgNDksICAgNDksICAgNDksICAgNDksICAgNDksICAtMjIsICAgNDkKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLAotICAgICAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwKLSAgICAgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNAotCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgICA1MSwgICA1MSwgICA1MiwgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MSwKLSAgICAgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MQotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsCi0gICAgICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LAotICAgICAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3Ci0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwKLSAgICAgIC0yOCwgIC0yOCwgIC0yOCwgIC0yOCwgICA1MywgIC0yOCwgIC0yOAotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksCi0gICAgICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjksICAtMjkKLQotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAgNTQsICAgNTQsICAtMzAsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsCi0gICAgICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQsICAgNTQKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgIDU1LCAgLTMxLCAgLTMxLAotICAgICAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxLCAgLTMxCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwKLSAgICAgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMgotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsCi0gICAgICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMsICAtMzMKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LCAgLTM0LAotICAgICAgLTM0LCAgIDU2LCAgIDU3LCAgIDU3LCAgLTM0LCAgLTM0LCAgLTM0Ci0KLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LAotICAgICAgLTM1LCAgIDU3LCAgIDU3LCAgIDU3LCAgLTM1LCAgLTM1LCAgLTM1Ci0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwKLSAgICAgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNgotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtMzcsICAtMzcsICAgNTgsICAtMzcsICAtMzcsICAtMzcsICAtMzcsICAtMzcsICAtMzcsCi0gICAgICAtMzcsICAtMzcsICAtMzcsICAtMzcsICAtMzcsICAtMzcsICAtMzcKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LAotICAgICAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgIDU5Ci0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC0zOSwgICAzOSwgICA0MCwgIC0zOSwgIC0zOSwgICA0MSwgIC0zOSwgIC0zOSwgIC0zOSwKLSAgICAgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOQotCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwKLSAgICAgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MAotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAgNDIsICAgNDIsICAgNDMsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsCi0gICAgICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgIDQyLCAgIDQyLCAgIDQzLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLAotICAgICAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyLCAgIDQyCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywKLSAgICAgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MywgIC00MwotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtNDQsICAtNDQsICAtNDQsICAtNDQsICAtNDQsICAtNDQsICAtNDQsICAtNDQsICAtNDQsCi0gICAgICAtNDQsICAtNDQsICAtNDQsICAgNDQsICAtNDQsICAtNDQsICAtNDQKLQotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAgNDUsICAgNDUsICAtNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsCi0gICAgICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTQ2LCAgIDQ2LCAgIDQ3LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LAotICAgICAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2LCAgLTQ2Ci0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgICA0OCwgIC00NywgIC00NywgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwKLSAgICAgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OCwgICA0OAotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsCi0gICAgICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgIDQ5LCAgIDQ5LCAgIDUwLCAgIDQ5LCAgLTQ5LCAgIDQ5LCAgIDQ5LCAgLTQ5LCAgIDQ5LAotICAgICAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgLTQ5LCAgIDQ5Ci0KLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLAotICAgICAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC01MSwgIC01MSwgICA1MiwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwKLSAgICAgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MQotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsCi0gICAgICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLAotICAgICAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgICA1NCwgICA1NCwgIC01NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwKLSAgICAgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NAotCi0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwKLSAgICAgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NSwgIC01NQotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtNTYsICAtNTYsICAtNTYsICAtNTYsICAtNTYsICAtNTYsICAtNTYsICAtNTYsICAtNTYsCi0gICAgICAtNTYsICAgNjAsICAgNTcsICAgNTcsICAtNTYsICAtNTYsICAtNTYKLSAgICB9LAotCi0gICAgewotICAgICAgIDExLCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LAotICAgICAgLTU3LCAgIDU3LCAgIDU3LCAgIDU3LCAgLTU3LCAgLTU3LCAgLTU3Ci0gICAgfSwKLQotICAgIHsKLSAgICAgICAxMSwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwKLSAgICAgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OCwgIC01OAotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksCi0gICAgICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTksICAtNTkKLQotICAgIH0sCi0KLSAgICB7Ci0gICAgICAgMTEsICAtNjAsICAtNjAsICAtNjAsICAtNjAsICAtNjAsICAtNjAsICAtNjAsICAtNjAsICAtNjAsCi0gICAgICAtNjAsICAgNTcsICAgNTcsICAgNTcsICAtNjAsICAtNjAsICAtNjAKLSAgICB9LAotCi0gICAgfSA7Ci0KLXN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSAodm9pZCApOwotc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyAoeXlfc3RhdGVfdHlwZSBjdXJyZW50X3N0YXRlICApOwotc3RhdGljIGludCB5eV9nZXRfbmV4dF9idWZmZXIgKHZvaWQgKTsKLXN0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yICh5eWNvbnN0IGNoYXIgbXNnW10gICk7Ci0KLS8qIERvbmUgYWZ0ZXIgdGhlIGN1cnJlbnQgcGF0dGVybiBoYXMgYmVlbiBtYXRjaGVkIGFuZCBiZWZvcmUgdGhlCi0gKiBjb3JyZXNwb25kaW5nIGFjdGlvbiAtIHNldHMgdXAgemNvbmZ0ZXh0LgotICovCi0jZGVmaW5lIFlZX0RPX0JFRk9SRV9BQ1RJT04gXAotCSh5eXRleHRfcHRyKSA9IHl5X2JwOyBcCi0JemNvbmZsZW5nID0gKHNpemVfdCkgKHl5X2NwIC0geXlfYnApOyBcCi0JKHl5X2hvbGRfY2hhcikgPSAqeXlfY3A7IFwKLQkqeXlfY3AgPSAnXDAnOyBcCi0JKHl5X2NfYnVmX3ApID0geXlfY3A7Ci0KLSNkZWZpbmUgWVlfTlVNX1JVTEVTIDMzCi0jZGVmaW5lIFlZX0VORF9PRl9CVUZGRVIgMzQKLS8qIFRoaXMgc3RydWN0IGlzIG5vdCB1c2VkIGluIHRoaXMgc2Nhbm5lciwKLSAgIGJ1dCBpdHMgcHJlc2VuY2UgaXMgbmVjZXNzYXJ5LiAqLwotc3RydWN0IHl5X3RyYW5zX2luZm8KLQl7Ci0JZmxleF9pbnQzMl90IHl5X3ZlcmlmeTsKLQlmbGV4X2ludDMyX3QgeXlfbnh0OwotCX07Ci1zdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfYWNjZXB0WzYxXSA9Ci0gICAgeyAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgICAgMzQsICAgIDUsICAgIDQsICAgIDIsICAgIDMsICAgIDcsICAgIDgsICAgIDYsICAgMzIsICAgMjksCi0gICAgICAgMzEsICAgMjQsICAgMjgsICAgMjcsICAgMjYsICAgMjIsICAgMTcsICAgMTMsICAgMTYsICAgMjAsCi0gICAgICAgMjIsICAgMTEsICAgMTIsICAgMTksICAgMTksICAgMTQsICAgMjIsICAgMjIsICAgIDQsICAgIDIsCi0gICAgICAgIDMsICAgIDMsICAgIDEsICAgIDYsICAgMzIsICAgMjksICAgMzEsICAgMzAsICAgMjQsICAgMjMsCi0gICAgICAgMjYsICAgMjUsICAgMTUsICAgMjAsICAgIDksICAgMTksICAgMTksICAgMjEsICAgMTAsICAgMTgKLSAgICB9IDsKLQotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X2VjWzI1Nl0gPQotICAgIHsgICAwLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAzLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgICAgICAxLCAgICAyLCAgICA0LCAgICA1LCAgICA2LCAgICAxLCAgICAxLCAgICA3LCAgICA4LCAgICA5LAotICAgICAgIDEwLCAgICAxLCAgICAxLCAgICAxLCAgIDExLCAgIDEyLCAgIDEyLCAgIDEzLCAgIDEzLCAgIDEzLAotICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgICAxLCAgICAxLCAgICAxLAotICAgICAgIDE0LCAgICAxLCAgICAxLCAgICAxLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAotICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAotICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAotICAgICAgICAxLCAgIDE1LCAgICAxLCAgICAxLCAgIDEzLCAgICAxLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAotCi0gICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCi0gICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCi0gICAgICAgMTMsICAgMTMsICAgIDEsICAgMTYsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0KLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMQotICAgIH0gOwotCi1leHRlcm4gaW50IHpjb25mX2ZsZXhfZGVidWc7Ci1pbnQgemNvbmZfZmxleF9kZWJ1ZyA9IDA7Ci0KLS8qIFRoZSBpbnRlbnQgYmVoaW5kIHRoaXMgZGVmaW5pdGlvbiBpcyB0aGF0IGl0J2xsIGNhdGNoCi0gKiBhbnkgdXNlcyBvZiBSRUpFQ1Qgd2hpY2ggZmxleCBtaXNzZWQuCi0gKi8KLSNkZWZpbmUgUkVKRUNUIHJlamVjdF91c2VkX2J1dF9ub3RfZGV0ZWN0ZWQKLSNkZWZpbmUgeXltb3JlKCkgeXltb3JlX3VzZWRfYnV0X25vdF9kZXRlY3RlZAotI2RlZmluZSBZWV9NT1JFX0FESiAwCi0jZGVmaW5lIFlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKLWNoYXIgKnpjb25mdGV4dDsKLSNkZWZpbmUgWVlfTk9fSU5QVVQgMQotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgotICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCi0gKi8KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCi0jaW5jbHVkZSAibGtjLmgiCi0KLSNkZWZpbmUgU1RBUlRfU1RSU0laRQkxNgotCi1zdGF0aWMgc3RydWN0IHsKLQlzdHJ1Y3QgZmlsZSAqZmlsZTsKLQlpbnQgbGluZW5vOwotfSBjdXJyZW50X3BvczsKLQotc3RhdGljIGNoYXIgKnRleHQ7Ci1zdGF0aWMgaW50IHRleHRfc2l6ZSwgdGV4dF9hc2l6ZTsKLQotc3RydWN0IGJ1ZmZlciB7Ci0gICAgICAgIHN0cnVjdCBidWZmZXIgKnBhcmVudDsKLSAgICAgICAgWVlfQlVGRkVSX1NUQVRFIHN0YXRlOwotfTsKLQotc3RydWN0IGJ1ZmZlciAqY3VycmVudF9idWY7Ci0KLXN0YXRpYyBpbnQgbGFzdF90cywgZmlyc3RfdHM7Ci0KLXN0YXRpYyB2b2lkIHpjb25mX2VuZGhlbHAodm9pZCk7Ci1zdGF0aWMgdm9pZCB6Y29uZl9lbmRmaWxlKHZvaWQpOwotCi1zdGF0aWMgdm9pZCBuZXdfc3RyaW5nKHZvaWQpCi17Ci0JdGV4dCA9IG1hbGxvYyhTVEFSVF9TVFJTSVpFKTsKLQl0ZXh0X2FzaXplID0gU1RBUlRfU1RSU0laRTsKLQl0ZXh0X3NpemUgPSAwOwotCSp0ZXh0ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYXBwZW5kX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzaXplKQotewotCWludCBuZXdfc2l6ZSA9IHRleHRfc2l6ZSArIHNpemUgKyAxOwotCWlmIChuZXdfc2l6ZSA+IHRleHRfYXNpemUpIHsKLQkJbmV3X3NpemUgKz0gU1RBUlRfU1RSU0laRSAtIDE7Ci0JCW5ld19zaXplICY9IC1TVEFSVF9TVFJTSVpFOwotCQl0ZXh0ID0gcmVhbGxvYyh0ZXh0LCBuZXdfc2l6ZSk7Ci0JCXRleHRfYXNpemUgPSBuZXdfc2l6ZTsKLQl9Ci0JbWVtY3B5KHRleHQgKyB0ZXh0X3NpemUsIHN0ciwgc2l6ZSk7Ci0JdGV4dF9zaXplICs9IHNpemU7Ci0JdGV4dFt0ZXh0X3NpemVdID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYWxsb2Nfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNpemUpCi17Ci0JdGV4dCA9IG1hbGxvYyhzaXplICsgMSk7Ci0JbWVtY3B5KHRleHQsIHN0ciwgc2l6ZSk7Ci0JdGV4dFtzaXplXSA9IDA7Ci19Ci0KLSNkZWZpbmUgSU5JVElBTCAwCi0jZGVmaW5lIENPTU1BTkQgMQotI2RlZmluZSBIRUxQIDIKLSNkZWZpbmUgU1RSSU5HIDMKLSNkZWZpbmUgUEFSQU0gNAotCi0jaWZuZGVmIFlZX05PX1VOSVNURF9ICi0vKiBTcGVjaWFsIGNhc2UgZm9yICJ1bmlzdGQuaCIsIHNpbmNlIGl0IGlzIG5vbi1BTlNJLiBXZSBpbmNsdWRlIGl0IHdheQotICogZG93biBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdXNlcidzIHNlY3Rpb24gMSB0byBoYXZlIGJlZW4gc2Nhbm5lZCBmaXJzdC4KLSAqIFRoZSB1c2VyIGhhcyBhIGNoYW5jZSB0byBvdmVycmlkZSBpdCB3aXRoIGFuIG9wdGlvbi4KLSAqLwotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZm5kZWYgWVlfRVhUUkFfVFlQRQotI2RlZmluZSBZWV9FWFRSQV9UWVBFIHZvaWQgKgotI2VuZGlmCi0KLXN0YXRpYyBpbnQgeXlfaW5pdF9nbG9iYWxzICh2b2lkICk7Ci0KLS8qIEFjY2Vzc29yIG1ldGhvZHMgdG8gZ2xvYmFscy4KLSAgIFRoZXNlIGFyZSBtYWRlIHZpc2libGUgdG8gbm9uLXJlZW50cmFudCBzY2FubmVycyBmb3IgY29udmVuaWVuY2UuICovCi0KLWludCB6Y29uZmxleF9kZXN0cm95ICh2b2lkICk7Ci0KLWludCB6Y29uZmdldF9kZWJ1ZyAodm9pZCApOwotCi12b2lkIHpjb25mc2V0X2RlYnVnIChpbnQgZGVidWdfZmxhZyAgKTsKLQotWVlfRVhUUkFfVFlQRSB6Y29uZmdldF9leHRyYSAodm9pZCApOwotCi12b2lkIHpjb25mc2V0X2V4dHJhIChZWV9FWFRSQV9UWVBFIHVzZXJfZGVmaW5lZCAgKTsKLQotRklMRSAqemNvbmZnZXRfaW4gKHZvaWQgKTsKLQotdm9pZCB6Y29uZnNldF9pbiAgKEZJTEUgKiBpbl9zdHIgICk7Ci0KLUZJTEUgKnpjb25mZ2V0X291dCAodm9pZCApOwotCi12b2lkIHpjb25mc2V0X291dCAgKEZJTEUgKiBvdXRfc3RyICApOwotCi1pbnQgemNvbmZnZXRfbGVuZyAodm9pZCApOwotCi1jaGFyICp6Y29uZmdldF90ZXh0ICh2b2lkICk7Ci0KLWludCB6Y29uZmdldF9saW5lbm8gKHZvaWQgKTsKLQotdm9pZCB6Y29uZnNldF9saW5lbm8gKGludCBsaW5lX251bWJlciAgKTsKLQotLyogTWFjcm9zIGFmdGVyIHRoaXMgcG9pbnQgY2FuIGFsbCBiZSBvdmVycmlkZGVuIGJ5IHVzZXIgZGVmaW5pdGlvbnMgaW4KLSAqIHNlY3Rpb24gMS4KLSAqLwotCi0jaWZuZGVmIFlZX1NLSVBfWVlXUkFQCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgaW50IHpjb25md3JhcCAodm9pZCApOwotI2Vsc2UKLWV4dGVybiBpbnQgemNvbmZ3cmFwICh2b2lkICk7Ci0jZW5kaWYKLSNlbmRpZgotCi0gICAgc3RhdGljIHZvaWQgeXl1bnB1dCAoaW50IGMsY2hhciAqYnVmX3B0ciAgKTsKLSAgICAKLSNpZm5kZWYgeXl0ZXh0X3B0cgotc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5IChjaGFyICoseXljb25zdCBjaGFyICosaW50ICk7Ci0jZW5kaWYKLQotI2lmZGVmIFlZX05FRURfU1RSTEVOCi1zdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuICh5eWNvbnN0IGNoYXIgKiApOwotI2VuZGlmCi0KLSNpZm5kZWYgWVlfTk9fSU5QVVQKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1zdGF0aWMgaW50IHl5aW5wdXQgKHZvaWQgKTsKLSNlbHNlCi1zdGF0aWMgaW50IGlucHV0ICh2b2lkICk7Ci0jZW5kaWYKLQotI2VuZGlmCi0KLS8qIEFtb3VudCBvZiBzdHVmZiB0byBzbHVycCB1cCB3aXRoIGVhY2ggcmVhZC4gKi8KLSNpZm5kZWYgWVlfUkVBRF9CVUZfU0laRQotI2lmZGVmIF9faWE2NF9fCi0vKiBPbiBJQS02NCwgdGhlIGJ1ZmZlciBzaXplIGlzIDE2aywgbm90IDhrICovCi0jZGVmaW5lIFlZX1JFQURfQlVGX1NJWkUgMTYzODQKLSNlbHNlCi0jZGVmaW5lIFlZX1JFQURfQlVGX1NJWkUgODE5MgotI2VuZGlmIC8qIF9faWE2NF9fICovCi0jZW5kaWYKLQotLyogQ29weSB3aGF0ZXZlciB0aGUgbGFzdCBydWxlIG1hdGNoZWQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gKi8KLSNpZm5kZWYgRUNITwotLyogVGhpcyB1c2VkIHRvIGJlIGFuIGZwdXRzKCksIGJ1dCBzaW5jZSB0aGUgc3RyaW5nIG1pZ2h0IGNvbnRhaW4gTlVMJ3MsCi0gKiB3ZSBub3cgdXNlIGZ3cml0ZSgpLgotICovCi0jZGVmaW5lIEVDSE8gZG8geyBpZiAoZndyaXRlKCB6Y29uZnRleHQsIHpjb25mbGVuZywgMSwgemNvbmZvdXQgKSkge30gfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0vKiBHZXRzIGlucHV0IGFuZCBzdHVmZnMgaXQgaW50byAiYnVmIi4gIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIFlZX05VTEwsCi0gKiBpcyByZXR1cm5lZCBpbiAicmVzdWx0Ii4KLSAqLwotI2lmbmRlZiBZWV9JTlBVVAotI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSBcCi0JZXJybm89MDsgXAotCXdoaWxlICggKHJlc3VsdCA9IHJlYWQoIGZpbGVubyh6Y29uZmluKSwgKGNoYXIgKikgYnVmLCBtYXhfc2l6ZSApKSA8IDAgKSBcCi0JeyBcCi0JCWlmKCBlcnJubyAhPSBFSU5UUikgXAotCQl7IFwKLQkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAotCQkJYnJlYWs7IFwKLQkJfSBcCi0JCWVycm5vPTA7IFwKLQkJY2xlYXJlcnIoemNvbmZpbik7IFwKLQl9XAotXAotCi0jZW5kaWYKLQotLyogTm8gc2VtaS1jb2xvbiBhZnRlciByZXR1cm47IGNvcnJlY3QgdXNhZ2UgaXMgdG8gd3JpdGUgInl5dGVybWluYXRlKCk7IiAtCi0gKiB3ZSBkb24ndCB3YW50IGFuIGV4dHJhICc7JyBhZnRlciB0aGUgInJldHVybiIgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UKLSAqIHNvbWUgY29tcGlsZXJzIHRvIGNvbXBsYWluIGFib3V0IHVucmVhY2hhYmxlIHN0YXRlbWVudHMuCi0gKi8KLSNpZm5kZWYgeXl0ZXJtaW5hdGUKLSNkZWZpbmUgeXl0ZXJtaW5hdGUoKSByZXR1cm4gWVlfTlVMTAotI2VuZGlmCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGJ5IHdoaWNoIHN0YXJ0LWNvbmRpdGlvbiBzdGFjayBncm93cy4gKi8KLSNpZm5kZWYgWVlfU1RBUlRfU1RBQ0tfSU5DUgotI2RlZmluZSBZWV9TVEFSVF9TVEFDS19JTkNSIDI1Ci0jZW5kaWYKLQotLyogUmVwb3J0IGEgZmF0YWwgZXJyb3IuICovCi0jaWZuZGVmIFlZX0ZBVEFMX0VSUk9SCi0jZGVmaW5lIFlZX0ZBVEFMX0VSUk9SKG1zZykgeXlfZmF0YWxfZXJyb3IoIG1zZyApCi0jZW5kaWYKLQotLyogZW5kIHRhYmxlcyBzZXJpYWxpemF0aW9uIHN0cnVjdHVyZXMgYW5kIHByb3RvdHlwZXMgKi8KLQotLyogRGVmYXVsdCBkZWNsYXJhdGlvbiBvZiBnZW5lcmF0ZWQgc2Nhbm5lciAtIGEgZGVmaW5lIHNvIHRoZSB1c2VyIGNhbgotICogZWFzaWx5IGFkZCBwYXJhbWV0ZXJzLgotICovCi0jaWZuZGVmIFlZX0RFQ0wKLSNkZWZpbmUgWVlfREVDTF9JU19PVVJTIDEKLQotZXh0ZXJuIGludCB6Y29uZmxleCAodm9pZCk7Ci0KLSNkZWZpbmUgWVlfREVDTCBpbnQgemNvbmZsZXggKHZvaWQpCi0jZW5kaWYgLyogIVlZX0RFQ0wgKi8KLQotLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcnVsZSwgYWZ0ZXIgemNvbmZ0ZXh0IGFuZCB6Y29uZmxlbmcKLSAqIGhhdmUgYmVlbiBzZXQgdXAuCi0gKi8KLSNpZm5kZWYgWVlfVVNFUl9BQ1RJT04KLSNkZWZpbmUgWVlfVVNFUl9BQ1RJT04KLSNlbmRpZgotCi0vKiBDb2RlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBydWxlLiAqLwotI2lmbmRlZiBZWV9CUkVBSwotI2RlZmluZSBZWV9CUkVBSyBicmVhazsKLSNlbmRpZgotCi0jZGVmaW5lIFlZX1JVTEVfU0VUVVAgXAotCVlZX1VTRVJfQUNUSU9OCi0KLS8qKiBUaGUgbWFpbiBzY2FubmVyIGZ1bmN0aW9uIHdoaWNoIGRvZXMgYWxsIHRoZSB3b3JrLgotICovCi1ZWV9ERUNMCi17Ci0JcmVnaXN0ZXIgeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOwotCXJlZ2lzdGVyIGNoYXIgKnl5X2NwLCAqeXlfYnA7Ci0JcmVnaXN0ZXIgaW50IHl5X2FjdDsKLSAgICAKLQlpbnQgc3RyID0gMDsKLQlpbnQgdHMsIGk7Ci0KLQlpZiAoICEoeXlfaW5pdCkgKQotCQl7Ci0JCSh5eV9pbml0KSA9IDE7Ci0KLSNpZmRlZiBZWV9VU0VSX0lOSVQKLQkJWVlfVVNFUl9JTklUOwotI2VuZGlmCi0KLQkJaWYgKCAhICh5eV9zdGFydCkgKQotCQkJKHl5X3N0YXJ0KSA9IDE7CS8qIGZpcnN0IHN0YXJ0IHN0YXRlICovCi0KLQkJaWYgKCAhIHpjb25maW4gKQotCQkJemNvbmZpbiA9IHN0ZGluOwotCi0JCWlmICggISB6Y29uZm91dCApCi0JCQl6Y29uZm91dCA9IHN0ZG91dDsKLQotCQlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKSB7Ci0JCQl6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7Ci0JCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPQotCQkJCXpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSApOwotCQl9Ci0KLQkJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7Ci0JCX0KLQotCXdoaWxlICggMSApCQkvKiBsb29wcyB1bnRpbCBlbmQtb2YtZmlsZSBpcyByZWFjaGVkICovCi0JCXsKLQkJeXlfY3AgPSAoeXlfY19idWZfcCk7Ci0KLQkJLyogU3VwcG9ydCBvZiB6Y29uZnRleHQuICovCi0JCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOwotCi0JCS8qIHl5X2JwIHBvaW50cyB0byB0aGUgcG9zaXRpb24gaW4geXlfY2hfYnVmIG9mIHRoZSBzdGFydCBvZgotCQkgKiB0aGUgY3VycmVudCBydW4uCi0JCSAqLwotCQl5eV9icCA9IHl5X2NwOwotCi0JCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfc3RhcnQpOwoteXlfbWF0Y2g6Ci0JCXdoaWxlICggKHl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfY3VycmVudF9zdGF0ZV1bIHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldICBdKSA+IDAgKQotCQkJKyt5eV9jcDsKLQotCQl5eV9jdXJyZW50X3N0YXRlID0gLXl5X2N1cnJlbnRfc3RhdGU7Ci0KLXl5X2ZpbmRfYWN0aW9uOgotCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07Ci0KLQkJWVlfRE9fQkVGT1JFX0FDVElPTjsKLQotZG9fYWN0aW9uOgkvKiBUaGlzIGxhYmVsIGlzIHVzZWQgb25seSB0byBhY2Nlc3MgRU9GIGFjdGlvbnMuICovCi0KLQkJc3dpdGNoICggeXlfYWN0ICkKLQl7IC8qIGJlZ2lubmluZyBvZiBhY3Rpb24gc3dpdGNoICovCi1jYXNlIDE6Ci0vKiBydWxlIDEgY2FuIG1hdGNoIGVvbCAqLwotY2FzZSAyOgotLyogcnVsZSAyIGNhbiBtYXRjaCBlb2wgKi8KLVlZX1JVTEVfU0VUVVAKLXsKLQljdXJyZW50X2ZpbGUtPmxpbmVubysrOwotCXJldHVybiBUX0VPTDsKLX0KLQlZWV9CUkVBSwotY2FzZSAzOgotWVlfUlVMRV9TRVRVUAotCi0JWVlfQlJFQUsKLWNhc2UgNDoKLVlZX1JVTEVfU0VUVVAKLXsKLQlCRUdJTihDT01NQU5EKTsKLX0KLQlZWV9CUkVBSwotY2FzZSA1OgotWVlfUlVMRV9TRVRVUAotewotCXVucHV0KHpjb25mdGV4dFswXSk7Ci0JQkVHSU4oQ09NTUFORCk7Ci19Ci0JWVlfQlJFQUsKLQotY2FzZSA2OgotWVlfUlVMRV9TRVRVUAotewotCQlzdHJ1Y3Qga2NvbmZfaWQgKmlkID0ga2NvbmZfaWRfbG9va3VwKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKLQkJQkVHSU4oUEFSQU0pOwotCQljdXJyZW50X3Bvcy5maWxlID0gY3VycmVudF9maWxlOwotCQljdXJyZW50X3Bvcy5saW5lbm8gPSBjdXJyZW50X2ZpbGUtPmxpbmVubzsKLQkJaWYgKGlkICYmIGlkLT5mbGFncyAmIFRGX0NPTU1BTkQpIHsKLQkJCXpjb25mbHZhbC5pZCA9IGlkOwotCQkJcmV0dXJuIGlkLT50b2tlbjsKLQkJfQotCQlhbGxvY19zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOwotCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKLQkJcmV0dXJuIFRfV09SRDsKLQl9Ci0JWVlfQlJFQUsKLWNhc2UgNzoKLVlZX1JVTEVfU0VUVVAKLQotCVlZX0JSRUFLCi1jYXNlIDg6Ci0vKiBydWxlIDggY2FuIG1hdGNoIGVvbCAqLwotWVlfUlVMRV9TRVRVUAotewotCQlCRUdJTihJTklUSUFMKTsKLQkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKLQkJcmV0dXJuIFRfRU9MOwotCX0KLQlZWV9CUkVBSwotCi1jYXNlIDk6Ci1ZWV9SVUxFX1NFVFVQCi1yZXR1cm4gVF9BTkQ7Ci0JWVlfQlJFQUsKLWNhc2UgMTA6Ci1ZWV9SVUxFX1NFVFVQCi1yZXR1cm4gVF9PUjsKLQlZWV9CUkVBSwotY2FzZSAxMToKLVlZX1JVTEVfU0VUVVAKLXJldHVybiBUX09QRU5fUEFSRU47Ci0JWVlfQlJFQUsKLWNhc2UgMTI6Ci1ZWV9SVUxFX1NFVFVQCi1yZXR1cm4gVF9DTE9TRV9QQVJFTjsKLQlZWV9CUkVBSwotY2FzZSAxMzoKLVlZX1JVTEVfU0VUVVAKLXJldHVybiBUX05PVDsKLQlZWV9CUkVBSwotY2FzZSAxNDoKLVlZX1JVTEVfU0VUVVAKLXJldHVybiBUX0VRVUFMOwotCVlZX0JSRUFLCi1jYXNlIDE1OgotWVlfUlVMRV9TRVRVUAotcmV0dXJuIFRfVU5FUVVBTDsKLQlZWV9CUkVBSwotY2FzZSAxNjoKLVlZX1JVTEVfU0VUVVAKLXsKLQkJc3RyID0gemNvbmZ0ZXh0WzBdOwotCQluZXdfc3RyaW5nKCk7Ci0JCUJFR0lOKFNUUklORyk7Ci0JfQotCVlZX0JSRUFLCi1jYXNlIDE3OgotLyogcnVsZSAxNyBjYW4gbWF0Y2ggZW9sICovCi1ZWV9SVUxFX1NFVFVQCi1CRUdJTihJTklUSUFMKTsgY3VycmVudF9maWxlLT5saW5lbm8rKzsgcmV0dXJuIFRfRU9MOwotCVlZX0JSRUFLCi1jYXNlIDE4OgotWVlfUlVMRV9TRVRVUAotLyogaWdub3JlICovCi0JWVlfQlJFQUsKLWNhc2UgMTk6Ci1ZWV9SVUxFX1NFVFVQCi17Ci0JCXN0cnVjdCBrY29uZl9pZCAqaWQgPSBrY29uZl9pZF9sb29rdXAoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOwotCQlpZiAoaWQgJiYgaWQtPmZsYWdzICYgVEZfUEFSQU0pIHsKLQkJCXpjb25mbHZhbC5pZCA9IGlkOwotCQkJcmV0dXJuIGlkLT50b2tlbjsKLQkJfQotCQlhbGxvY19zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOwotCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKLQkJcmV0dXJuIFRfV09SRDsKLQl9Ci0JWVlfQlJFQUsKLWNhc2UgMjA6Ci1ZWV9SVUxFX1NFVFVQCi0vKiBjb21tZW50ICovCi0JWVlfQlJFQUsKLWNhc2UgMjE6Ci0vKiBydWxlIDIxIGNhbiBtYXRjaCBlb2wgKi8KLVlZX1JVTEVfU0VUVVAKLWN1cnJlbnRfZmlsZS0+bGluZW5vKys7Ci0JWVlfQlJFQUsKLWNhc2UgMjI6Ci1ZWV9SVUxFX1NFVFVQCi0KLQlZWV9CUkVBSwotY2FzZSBZWV9TVEFURV9FT0YoUEFSQU0pOgotewotCQlCRUdJTihJTklUSUFMKTsKLQl9Ci0JWVlfQlJFQUsKLQotY2FzZSAyMzoKLS8qIHJ1bGUgMjMgY2FuIG1hdGNoIGVvbCAqLwotKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IC8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLwotKHl5X2NfYnVmX3ApID0geXlfY3AgLT0gMTsKLVlZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8KLVlZX1JVTEVfU0VUVVAKLXsKLQkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7Ci0JCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OwotCQlyZXR1cm4gVF9XT1JEX1FVT1RFOwotCX0KLQlZWV9CUkVBSwotY2FzZSAyNDoKLVlZX1JVTEVfU0VUVVAKLXsKLQkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7Ci0JfQotCVlZX0JSRUFLCi1jYXNlIDI1OgotLyogcnVsZSAyNSBjYW4gbWF0Y2ggZW9sICovCi0qeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsgLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0ICovCi0oeXlfY19idWZfcCkgPSB5eV9jcCAtPSAxOwotWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHpjb25mdGV4dCBhZ2FpbiAqLwotWVlfUlVMRV9TRVRVUAotewotCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCArIDEsIHpjb25mbGVuZyAtIDEpOwotCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKLQkJcmV0dXJuIFRfV09SRF9RVU9URTsKLQl9Ci0JWVlfQlJFQUsKLWNhc2UgMjY6Ci1ZWV9SVUxFX1NFVFVQCi17Ci0JCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0ICsgMSwgemNvbmZsZW5nIC0gMSk7Ci0JfQotCVlZX0JSRUFLCi1jYXNlIDI3OgotWVlfUlVMRV9TRVRVUAotewotCQlpZiAoc3RyID09IHpjb25mdGV4dFswXSkgewotCQkJQkVHSU4oUEFSQU0pOwotCQkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7Ci0JCQlyZXR1cm4gVF9XT1JEX1FVT1RFOwotCQl9IGVsc2UKLQkJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCAxKTsKLQl9Ci0JWVlfQlJFQUsKLWNhc2UgMjg6Ci0vKiBydWxlIDI4IGNhbiBtYXRjaCBlb2wgKi8KLVlZX1JVTEVfU0VUVVAKLXsKLQkJcHJpbnRmKCIlczolZDp3YXJuaW5nOiBtdWx0aS1saW5lIHN0cmluZ3Mgbm90IHN1cHBvcnRlZFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Ci0JCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7Ci0JCUJFR0lOKElOSVRJQUwpOwotCQlyZXR1cm4gVF9FT0w7Ci0JfQotCVlZX0JSRUFLCi1jYXNlIFlZX1NUQVRFX0VPRihTVFJJTkcpOgotewotCQlCRUdJTihJTklUSUFMKTsKLQl9Ci0JWVlfQlJFQUsKLQotY2FzZSAyOToKLVlZX1JVTEVfU0VUVVAKLXsKLQkJdHMgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgemNvbmZsZW5nOyBpKyspIHsKLQkJCWlmICh6Y29uZnRleHRbaV0gPT0gJ1x0JykKLQkJCQl0cyA9ICh0cyAmIH43KSArIDg7Ci0JCQllbHNlCi0JCQkJdHMrKzsKLQkJfQotCQlsYXN0X3RzID0gdHM7Ci0JCWlmIChmaXJzdF90cykgewotCQkJaWYgKHRzIDwgZmlyc3RfdHMpIHsKLQkJCQl6Y29uZl9lbmRoZWxwKCk7Ci0JCQkJcmV0dXJuIFRfSEVMUFRFWFQ7Ci0JCQl9Ci0JCQl0cyAtPSBmaXJzdF90czsKLQkJCXdoaWxlICh0cyA+IDgpIHsKLQkJCQlhcHBlbmRfc3RyaW5nKCIgICAgICAgICIsIDgpOwotCQkJCXRzIC09IDg7Ci0JCQl9Ci0JCQlhcHBlbmRfc3RyaW5nKCIgICAgICAgICIsIHRzKTsKLQkJfQotCX0KLQlZWV9CUkVBSwotY2FzZSAzMDoKLS8qIHJ1bGUgMzAgY2FuIG1hdGNoIGVvbCAqLwotKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IC8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLwotKHl5X2NfYnVmX3ApID0geXlfY3AgLT0gMTsKLVlZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8KLVlZX1JVTEVfU0VUVVAKLXsKLQkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKLQkJemNvbmZfZW5kaGVscCgpOwotCQlyZXR1cm4gVF9IRUxQVEVYVDsKLQl9Ci0JWVlfQlJFQUsKLWNhc2UgMzE6Ci0vKiBydWxlIDMxIGNhbiBtYXRjaCBlb2wgKi8KLVlZX1JVTEVfU0VUVVAKLXsKLQkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKLQkJYXBwZW5kX3N0cmluZygiXG4iLCAxKTsKLQl9Ci0JWVlfQlJFQUsKLWNhc2UgMzI6Ci1ZWV9SVUxFX1NFVFVQCi17Ci0JCXdoaWxlICh6Y29uZmxlbmcpIHsKLQkJCWlmICgoemNvbmZ0ZXh0W3pjb25mbGVuZy0xXSAhPSAnICcpICYmICh6Y29uZnRleHRbemNvbmZsZW5nLTFdICE9ICdcdCcpKQotCQkJCWJyZWFrOwotCQkJemNvbmZsZW5nLS07Ci0JCX0KLQkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7Ci0JCWlmICghZmlyc3RfdHMpCi0JCQlmaXJzdF90cyA9IGxhc3RfdHM7Ci0JfQotCVlZX0JSRUFLCi1jYXNlIFlZX1NUQVRFX0VPRihIRUxQKToKLXsKLQkJemNvbmZfZW5kaGVscCgpOwotCQlyZXR1cm4gVF9IRUxQVEVYVDsKLQl9Ci0JWVlfQlJFQUsKLQotY2FzZSBZWV9TVEFURV9FT0YoSU5JVElBTCk6Ci1jYXNlIFlZX1NUQVRFX0VPRihDT01NQU5EKToKLXsKLQlpZiAoY3VycmVudF9maWxlKSB7Ci0JCXpjb25mX2VuZGZpbGUoKTsKLQkJcmV0dXJuIFRfRU9MOwotCX0KLQlmY2xvc2UoemNvbmZpbik7Ci0JeXl0ZXJtaW5hdGUoKTsKLX0KLQlZWV9CUkVBSwotY2FzZSAzMzoKLVlZX1JVTEVfU0VUVVAKLVlZX0ZBVEFMX0VSUk9SKCAiZmxleCBzY2FubmVyIGphbW1lZCIgKTsKLQlZWV9CUkVBSwotCi0JY2FzZSBZWV9FTkRfT0ZfQlVGRkVSOgotCQl7Ci0JCS8qIEFtb3VudCBvZiB0ZXh0IG1hdGNoZWQgbm90IGluY2x1ZGluZyB0aGUgRU9CIGNoYXIuICovCi0JCWludCB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0ID0gKGludCkgKHl5X2NwIC0gKHl5dGV4dF9wdHIpKSAtIDE7Ci0KLQkJLyogVW5kbyB0aGUgZWZmZWN0cyBvZiBZWV9ET19CRUZPUkVfQUNUSU9OLiAqLwotCQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsKLQkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVAotCi0JCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID09IFlZX0JVRkZFUl9ORVcgKQotCQkJewotCQkJLyogV2UncmUgc2Nhbm5pbmcgYSBuZXcgZmlsZSBvciBpbnB1dCBzb3VyY2UuICBJdCdzCi0JCQkgKiBwb3NzaWJsZSB0aGF0IHRoaXMgaGFwcGVuZWQgYmVjYXVzZSB0aGUgdXNlcgotCQkJICoganVzdCBwb2ludGVkIHpjb25maW4gYXQgYSBuZXcgc291cmNlIGFuZCBjYWxsZWQKLQkJCSAqIHpjb25mbGV4KCkuICBJZiBzbywgdGhlbiB3ZSBoYXZlIHRvIGFzc3VyZQotCQkJICogY29uc2lzdGVuY3kgYmV0d2VlbiBZWV9DVVJSRU5UX0JVRkZFUiBhbmQgb3VyCi0JCQkgKiBnbG9iYWxzLiAgSGVyZSBpcyB0aGUgcmlnaHQgcGxhY2UgdG8gZG8gc28sIGJlY2F1c2UKLQkJCSAqIHRoaXMgaXMgdGhlIGZpcnN0IGFjdGlvbiAob3RoZXIgdGhhbiBwb3NzaWJseSBhCi0JCQkgKiBiYWNrLXVwKSB0aGF0IHdpbGwgbWF0Y2ggZm9yIHRoZSBuZXcgaW5wdXQgc291cmNlLgotCQkJICovCi0JCQkoeXlfbl9jaGFycykgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnM7Ci0JCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lucHV0X2ZpbGUgPSB6Y29uZmluOwotCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05PUk1BTDsKLQkJCX0KLQotCQkvKiBOb3RlIHRoYXQgaGVyZSB3ZSB0ZXN0IGZvciB5eV9jX2J1Zl9wICI8PSIgdG8gdGhlIHBvc2l0aW9uCi0JCSAqIG9mIHRoZSBmaXJzdCBFT0IgaW4gdGhlIGJ1ZmZlciwgc2luY2UgeXlfY19idWZfcCB3aWxsCi0JCSAqIGFscmVhZHkgaGF2ZSBiZWVuIGluY3JlbWVudGVkIHBhc3QgdGhlIE5VTCBjaGFyYWN0ZXIKLQkJICogKHNpbmNlIGFsbCBzdGF0ZXMgbWFrZSB0cmFuc2l0aW9ucyBvbiBFT0IgdG8gdGhlCi0JCSAqIGVuZC1vZi1idWZmZXIgc3RhdGUpLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZSB0ZXN0Ci0JCSAqIGluIGlucHV0KCkuCi0JCSAqLwotCQlpZiAoICh5eV9jX2J1Zl9wKSA8PSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSApCi0JCQl7IC8qIFRoaXMgd2FzIHJlYWxseSBhIE5VTC4gKi8KLQkJCXl5X3N0YXRlX3R5cGUgeXlfbmV4dF9zdGF0ZTsKLQotCQkJKHl5X2NfYnVmX3ApID0gKHl5dGV4dF9wdHIpICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKLQotCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7Ci0KLQkJCS8qIE9rYXksIHdlJ3JlIG5vdyBwb3NpdGlvbmVkIHRvIG1ha2UgdGhlIE5VTAotCQkJICogdHJhbnNpdGlvbi4gIFdlIGNvdWxkbid0IGhhdmUKLQkJCSAqIHl5X2dldF9wcmV2aW91c19zdGF0ZSgpIGdvIGFoZWFkIGFuZCBkbyBpdAotCQkJICogZm9yIHVzIGJlY2F1c2UgaXQgZG9lc24ndCBrbm93IGhvdyB0byBkZWFsCi0JCQkgKiB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiBqYW1taW5nIChhbmQgd2UgZG9uJ3QKLQkJCSAqIHdhbnQgdG8gYnVpbGQgamFtbWluZyBpbnRvIGl0IGJlY2F1c2UgdGhlbiBpdAotCQkJICogd2lsbCBydW4gbW9yZSBzbG93bHkpLgotCQkJICovCi0KLQkJCXl5X25leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCB5eV9jdXJyZW50X3N0YXRlICk7Ci0KLQkJCXl5X2JwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7Ci0KLQkJCWlmICggeXlfbmV4dF9zdGF0ZSApCi0JCQkJewotCQkJCS8qIENvbnN1bWUgdGhlIE5VTC4gKi8KLQkJCQl5eV9jcCA9ICsrKHl5X2NfYnVmX3ApOwotCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9uZXh0X3N0YXRlOwotCQkJCWdvdG8geXlfbWF0Y2g7Ci0JCQkJfQotCi0JCQllbHNlCi0JCQkJewotCQkJCXl5X2NwID0gKHl5X2NfYnVmX3ApOwotCQkJCWdvdG8geXlfZmluZF9hY3Rpb247Ci0JCQkJfQotCQkJfQotCi0JCWVsc2Ugc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCAgKSApCi0JCQl7Ci0JCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6Ci0JCQkJewotCQkJCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMDsKLQotCQkJCWlmICggemNvbmZ3cmFwKCApICkKLQkJCQkJewotCQkJCQkvKiBOb3RlOiBiZWNhdXNlIHdlJ3ZlIHRha2VuIGNhcmUgaW4KLQkJCQkJICogeXlfZ2V0X25leHRfYnVmZmVyKCkgdG8gaGF2ZSBzZXQgdXAKLQkJCQkJICogemNvbmZ0ZXh0LCB3ZSBjYW4gbm93IHNldCB1cAotCQkJCQkgKiB5eV9jX2J1Zl9wIHNvIHRoYXQgaWYgc29tZSB0b3RhbAotCQkJCQkgKiBob3NlciAobGlrZSBmbGV4IGl0c2VsZikgd2FudHMgdG8KLQkJCQkJICogY2FsbCB0aGUgc2Nhbm5lciBhZnRlciB3ZSByZXR1cm4gdGhlCi0JCQkJCSAqIFlZX05VTEwsIGl0J2xsIHN0aWxsIHdvcmsgLSBhbm90aGVyCi0JCQkJCSAqIFlZX05VTEwgd2lsbCBnZXQgcmV0dXJuZWQuCi0JCQkJCSAqLwotCQkJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKLQotCQkJCQl5eV9hY3QgPSBZWV9TVEFURV9FT0YoWVlfU1RBUlQpOwotCQkJCQlnb3RvIGRvX2FjdGlvbjsKLQkJCQkJfQotCi0JCQkJZWxzZQotCQkJCQl7Ci0JCQkJCWlmICggISAoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSApCi0JCQkJCQlZWV9ORVdfRklMRTsKLQkJCQkJfQotCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46Ci0JCQkJKHl5X2NfYnVmX3ApID0KLQkJCQkJKHl5dGV4dF9wdHIpICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKLQotCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoICApOwotCi0JCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7Ci0JCQkJeXlfYnAgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKLQkJCQlnb3RvIHl5X21hdGNoOwotCi0JCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKLQkJCQkoeXlfY19idWZfcCkgPQotCQkJCSZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldOwotCi0JCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7Ci0KLQkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKLQkJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOwotCQkJCWdvdG8geXlfZmluZF9hY3Rpb247Ci0JCQl9Ci0JCWJyZWFrOwotCQl9Ci0KLQlkZWZhdWx0OgotCQlZWV9GQVRBTF9FUlJPUigKLQkJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLW5vIGFjdGlvbiBmb3VuZCIgKTsKLQl9IC8qIGVuZCBvZiBhY3Rpb24gc3dpdGNoICovCi0JCX0gLyogZW5kIG9mIHNjYW5uaW5nIG9uZSB0b2tlbiAqLwotfSAvKiBlbmQgb2YgemNvbmZsZXggKi8KLQotLyogeXlfZ2V0X25leHRfYnVmZmVyIC0gdHJ5IHRvIHJlYWQgaW4gYSBuZXcgYnVmZmVyCi0gKgotICogUmV0dXJucyBhIGNvZGUgcmVwcmVzZW50aW5nIGFuIGFjdGlvbjoKLSAqCUVPQl9BQ1RfTEFTVF9NQVRDSCAtCi0gKglFT0JfQUNUX0NPTlRJTlVFX1NDQU4gLSBjb250aW51ZSBzY2FubmluZyBmcm9tIGN1cnJlbnQgcG9zaXRpb24KLSAqCUVPQl9BQ1RfRU5EX09GX0ZJTEUgLSBlbmQgb2YgZmlsZQotICovCi1zdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlciAodm9pZCkKLXsKLSAgICAJcmVnaXN0ZXIgY2hhciAqZGVzdCA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmOwotCXJlZ2lzdGVyIGNoYXIgKnNvdXJjZSA9ICh5eXRleHRfcHRyKTsKLQlyZWdpc3RlciBpbnQgbnVtYmVyX3RvX21vdmUsIGk7Ci0JaW50IHJldF92YWw7Ci0KLQlpZiAoICh5eV9jX2J1Zl9wKSA+ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycykgKyAxXSApCi0JCVlZX0ZBVEFMX0VSUk9SKAotCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1lbmQgb2YgYnVmZmVyIG1pc3NlZCIgKTsKLQotCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9maWxsX2J1ZmZlciA9PSAwICkKLQkJeyAvKiBEb24ndCB0cnkgdG8gZmlsbCB0aGUgYnVmZmVyLCBzbyB0aGlzIGlzIGFuIEVPRi4gKi8KLQkJaWYgKCAoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cikgLSBZWV9NT1JFX0FESiA9PSAxICkKLQkJCXsKLQkJCS8qIFdlIG1hdGNoZWQgYSBzaW5nbGUgY2hhcmFjdGVyLCB0aGUgRU9CLCBzbwotCQkJICogdHJlYXQgdGhpcyBhcyBhIGZpbmFsIEVPRi4KLQkJCSAqLwotCQkJcmV0dXJuIEVPQl9BQ1RfRU5EX09GX0ZJTEU7Ci0JCQl9Ci0KLQkJZWxzZQotCQkJewotCQkJLyogV2UgbWF0Y2hlZCBzb21lIHRleHQgcHJpb3IgdG8gdGhlIEVPQiwgZmlyc3QKLQkJCSAqIHByb2Nlc3MgaXQuCi0JCQkgKi8KLQkJCXJldHVybiBFT0JfQUNUX0xBU1RfTUFUQ0g7Ci0JCQl9Ci0JCX0KLQotCS8qIFRyeSB0byByZWFkIG1vcmUgZGF0YS4gKi8KLQotCS8qIEZpcnN0IG1vdmUgbGFzdCBjaGFycyB0byBzdGFydCBvZiBidWZmZXIuICovCi0JbnVtYmVyX3RvX21vdmUgPSAoaW50KSAoKHl5X2NfYnVmX3ApIC0gKHl5dGV4dF9wdHIpKSAtIDE7Ci0KLQlmb3IgKCBpID0gMDsgaSA8IG51bWJlcl90b19tb3ZlOyArK2kgKQotCQkqKGRlc3QrKykgPSAqKHNvdXJjZSsrKTsKLQotCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID09IFlZX0JVRkZFUl9FT0ZfUEVORElORyApCi0JCS8qIGRvbid0IGRvIHRoZSByZWFkLCBpdCdzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybiBhbiBFT0YsCi0JCSAqIGp1c3QgZm9yY2UgYW4gRU9GCi0JCSAqLwotCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycykgPSAwOwotCi0JZWxzZQotCQl7Ci0JCQlpbnQgbnVtX3RvX3JlYWQgPQotCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSAtIG51bWJlcl90b19tb3ZlIC0gMTsKLQotCQl3aGlsZSAoIG51bV90b19yZWFkIDw9IDAgKQotCQkJeyAvKiBOb3QgZW5vdWdoIHJvb20gaW4gdGhlIGJ1ZmZlciAtIGdyb3cgaXQuICovCi0KLQkJCS8qIGp1c3QgYSBzaG9ydGVyIG5hbWUgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciAqLwotCQkJWVlfQlVGRkVSX1NUQVRFIGIgPSBZWV9DVVJSRU5UX0JVRkZFUjsKLQotCQkJaW50IHl5X2NfYnVmX3Bfb2Zmc2V0ID0KLQkJCQkoaW50KSAoKHl5X2NfYnVmX3ApIC0gYi0+eXlfY2hfYnVmKTsKLQotCQkJaWYgKCBiLT55eV9pc19vdXJfYnVmZmVyICkKLQkJCQl7Ci0JCQkJaW50IG5ld19zaXplID0gYi0+eXlfYnVmX3NpemUgKiAyOwotCi0JCQkJaWYgKCBuZXdfc2l6ZSA8PSAwICkKLQkJCQkJYi0+eXlfYnVmX3NpemUgKz0gYi0+eXlfYnVmX3NpemUgLyA4OwotCQkJCWVsc2UKLQkJCQkJYi0+eXlfYnVmX3NpemUgKj0gMjsKLQotCQkJCWItPnl5X2NoX2J1ZiA9IChjaGFyICopCi0JCQkJCS8qIEluY2x1ZGUgcm9vbSBpbiBmb3IgMiBFT0IgY2hhcnMuICovCi0JCQkJCXpjb25mcmVhbGxvYygodm9pZCAqKSBiLT55eV9jaF9idWYsYi0+eXlfYnVmX3NpemUgKyAyICApOwotCQkJCX0KLQkJCWVsc2UKLQkJCQkvKiBDYW4ndCBncm93IGl0LCB3ZSBkb24ndCBvd24gaXQuICovCi0JCQkJYi0+eXlfY2hfYnVmID0gMDsKLQotCQkJaWYgKCAhIGItPnl5X2NoX2J1ZiApCi0JCQkJWVlfRkFUQUxfRVJST1IoCi0JCQkJImZhdGFsIGVycm9yIC0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3ciICk7Ci0KLQkJCSh5eV9jX2J1Zl9wKSA9ICZiLT55eV9jaF9idWZbeXlfY19idWZfcF9vZmZzZXRdOwotCi0JCQludW1fdG9fcmVhZCA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgLQotCQkJCQkJbnVtYmVyX3RvX21vdmUgLSAxOwotCi0JCQl9Ci0KLQkJaWYgKCBudW1fdG9fcmVhZCA+IFlZX1JFQURfQlVGX1NJWkUgKQotCQkJbnVtX3RvX3JlYWQgPSBZWV9SRUFEX0JVRl9TSVpFOwotCi0JCS8qIFJlYWQgaW4gbW9yZSBkYXRhLiAqLwotCQlZWV9JTlBVVCggKCZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV0pLAotCQkJKHl5X25fY2hhcnMpLCAoc2l6ZV90KSBudW1fdG9fcmVhZCApOwotCi0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKLQkJfQotCi0JaWYgKCAoeXlfbl9jaGFycykgPT0gMCApCi0JCXsKLQkJaWYgKCBudW1iZXJfdG9fbW92ZSA9PSBZWV9NT1JFX0FESiApCi0JCQl7Ci0JCQlyZXRfdmFsID0gRU9CX0FDVF9FTkRfT0ZfRklMRTsKLQkJCXpjb25mcmVzdGFydCh6Y29uZmluICApOwotCQkJfQotCi0JCWVsc2UKLQkJCXsKLQkJCXJldF92YWwgPSBFT0JfQUNUX0xBU1RfTUFUQ0g7Ci0JCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPQotCQkJCVlZX0JVRkZFUl9FT0ZfUEVORElORzsKLQkJCX0KLQkJfQotCi0JZWxzZQotCQlyZXRfdmFsID0gRU9CX0FDVF9DT05USU5VRV9TQ0FOOwotCi0JaWYgKCh5eV9zaXplX3QpICgoeXlfbl9jaGFycykgKyBudW1iZXJfdG9fbW92ZSkgPiBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplKSB7Ci0JCS8qIEV4dGVuZCB0aGUgYXJyYXkgYnkgNTAlLCBwbHVzIHRoZSBudW1iZXIgd2UgcmVhbGx5IG5lZWQuICovCi0JCXl5X3NpemVfdCBuZXdfc2l6ZSA9ICh5eV9uX2NoYXJzKSArIG51bWJlcl90b19tb3ZlICsgKCh5eV9uX2NoYXJzKSA+PiAxKTsKLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgPSAoY2hhciAqKSB6Y29uZnJlYWxsb2MoKHZvaWQgKikgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYsbmV3X3NpemUgICk7Ci0JCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiApCi0JCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9nZXRfbmV4dF9idWZmZXIoKSIgKTsKLQl9Ci0KLQkoeXlfbl9jaGFycykgKz0gbnVtYmVyX3RvX21vdmU7Ci0JWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKLQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycykgKyAxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKLQotCSh5eXRleHRfcHRyKSA9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlswXTsKLQotCXJldHVybiByZXRfdmFsOwotfQotCi0vKiB5eV9nZXRfcHJldmlvdXNfc3RhdGUgLSBnZXQgdGhlIHN0YXRlIGp1c3QgYmVmb3JlIHRoZSBFT0IgY2hhciB3YXMgcmVhY2hlZCAqLwotCi0gICAgc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh2b2lkKQotewotCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKLQlyZWdpc3RlciBjaGFyICp5eV9jcDsKLSAgICAKLQl5eV9jdXJyZW50X3N0YXRlID0gKHl5X3N0YXJ0KTsKLQotCWZvciAoIHl5X2NwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7IHl5X2NwIDwgKHl5X2NfYnVmX3ApOyArK3l5X2NwICkKLQkJewotCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2N1cnJlbnRfc3RhdGVdWygqeXlfY3AgPyB5eV9lY1tZWV9TQ19UT19VSSgqeXlfY3ApXSA6IDEpXTsKLQkJfQotCi0JcmV0dXJuIHl5X2N1cnJlbnRfc3RhdGU7Ci19Ci0KLS8qIHl5X3RyeV9OVUxfdHJhbnMgLSB0cnkgdG8gbWFrZSBhIHRyYW5zaXRpb24gb24gdGhlIE5VTCBjaGFyYWN0ZXIKLSAqCi0gKiBzeW5vcHNpcwotICoJbmV4dF9zdGF0ZSA9IHl5X3RyeV9OVUxfdHJhbnMoIGN1cnJlbnRfc3RhdGUgKTsKLSAqLwotICAgIHN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X3RyeV9OVUxfdHJhbnMgICh5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGUgKQotewotCXJlZ2lzdGVyIGludCB5eV9pc19qYW07Ci0gICAgCi0JeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9jdXJyZW50X3N0YXRlXVsxXTsKLQl5eV9pc19qYW0gPSAoeXlfY3VycmVudF9zdGF0ZSA8PSAwKTsKLQotCXJldHVybiB5eV9pc19qYW0gPyAwIDogeXlfY3VycmVudF9zdGF0ZTsKLX0KLQotICAgIHN0YXRpYyB2b2lkIHl5dW5wdXQgKGludCBjLCByZWdpc3RlciBjaGFyICogeXlfYnAgKQotewotCXJlZ2lzdGVyIGNoYXIgKnl5X2NwOwotICAgIAotICAgIHl5X2NwID0gKHl5X2NfYnVmX3ApOwotCi0JLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0ICovCi0JKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7Ci0KLQlpZiAoIHl5X2NwIDwgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKyAyICkKLQkJeyAvKiBuZWVkIHRvIHNoaWZ0IHRoaW5ncyB1cCB0byBtYWtlIHJvb20gKi8KLQkJLyogKzIgZm9yIEVPQiBjaGFycy4gKi8KLQkJcmVnaXN0ZXIgaW50IG51bWJlcl90b19tb3ZlID0gKHl5X25fY2hhcnMpICsgMjsKLQkJcmVnaXN0ZXIgY2hhciAqZGVzdCA9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsKLQkJCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSArIDJdOwotCQlyZWdpc3RlciBjaGFyICpzb3VyY2UgPQotCQkJCSZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV07Ci0KLQkJd2hpbGUgKCBzb3VyY2UgPiBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiApCi0JCQkqLS1kZXN0ID0gKi0tc291cmNlOwotCi0JCXl5X2NwICs9IChpbnQpIChkZXN0IC0gc291cmNlKTsKLQkJeXlfYnAgKz0gKGludCkgKGRlc3QgLSBzb3VyY2UpOwotCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPQotCQkJKHl5X25fY2hhcnMpID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZTsKLQotCQlpZiAoIHl5X2NwIDwgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKyAyICkKLQkJCVlZX0ZBVEFMX0VSUk9SKCAiZmxleCBzY2FubmVyIHB1c2gtYmFjayBvdmVyZmxvdyIgKTsKLQkJfQotCi0JKi0teXlfY3AgPSAoY2hhcikgYzsKLQotCSh5eXRleHRfcHRyKSA9IHl5X2JwOwotCSh5eV9ob2xkX2NoYXIpID0gKnl5X2NwOwotCSh5eV9jX2J1Zl9wKSA9IHl5X2NwOwotfQotCi0jaWZuZGVmIFlZX05PX0lOUFVUCi0jaWZkZWYgX19jcGx1c3BsdXMKLSAgICBzdGF0aWMgaW50IHl5aW5wdXQgKHZvaWQpCi0jZWxzZQotICAgIHN0YXRpYyBpbnQgaW5wdXQgICh2b2lkKQotI2VuZGlmCi0KLXsKLQlpbnQgYzsKLSAgICAKLQkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7Ci0KLQlpZiAoICooeXlfY19idWZfcCkgPT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSICkKLQkJewotCQkvKiB5eV9jX2J1Zl9wIG5vdyBwb2ludHMgdG8gdGhlIGNoYXJhY3RlciB3ZSB3YW50IHRvIHJldHVybi4KLQkJICogSWYgdGhpcyBvY2N1cnMgKmJlZm9yZSogdGhlIEVPQiBjaGFyYWN0ZXJzLCB0aGVuIGl0J3MgYQotCQkgKiB2YWxpZCBOVUw7IGlmIG5vdCwgdGhlbiB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotCQkgKi8KLQkJaWYgKCAoeXlfY19idWZfcCkgPCAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSApCi0JCQkvKiBUaGlzIHdhcyByZWFsbHkgYSBOVUwuICovCi0JCQkqKHl5X2NfYnVmX3ApID0gJ1wwJzsKLQotCQllbHNlCi0JCQl7IC8qIG5lZWQgbW9yZSBpbnB1dCAqLwotCQkJaW50IG9mZnNldCA9ICh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKTsKLQkJCSsrKHl5X2NfYnVmX3ApOwotCi0JCQlzd2l0Y2ggKCB5eV9nZXRfbmV4dF9idWZmZXIoICApICkKLQkJCQl7Ci0JCQkJY2FzZSBFT0JfQUNUX0xBU1RfTUFUQ0g6Ci0JCQkJCS8qIFRoaXMgaGFwcGVucyBiZWNhdXNlIHl5X2dfbl9iKCkKLQkJCQkJICogc2VlcyB0aGF0IHdlJ3ZlIGFjY3VtdWxhdGVkIGEKLQkJCQkJICogdG9rZW4gYW5kIGZsYWdzIHRoYXQgd2UgbmVlZCB0bwotCQkJCQkgKiB0cnkgbWF0Y2hpbmcgdGhlIHRva2VuIGJlZm9yZQotCQkJCQkgKiBwcm9jZWVkaW5nLiAgQnV0IGZvciBpbnB1dCgpLAotCQkJCQkgKiB0aGVyZSdzIG5vIG1hdGNoaW5nIHRvIGNvbnNpZGVyLgotCQkJCQkgKiBTbyBjb252ZXJ0IHRoZSBFT0JfQUNUX0xBU1RfTUFUQ0gKLQkJCQkJICogdG8gRU9CX0FDVF9FTkRfT0ZfRklMRS4KLQkJCQkJICovCi0KLQkJCQkJLyogUmVzZXQgYnVmZmVyIHN0YXR1cy4gKi8KLQkJCQkJemNvbmZyZXN0YXJ0KHpjb25maW4gKTsKLQotCQkJCQkvKkZBTExUSFJPVUdIKi8KLQotCQkJCWNhc2UgRU9CX0FDVF9FTkRfT0ZfRklMRToKLQkJCQkJewotCQkJCQlpZiAoIHpjb25md3JhcCggKSApCi0JCQkJCQlyZXR1cm4gRU9GOwotCi0JCQkJCWlmICggISAoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSApCi0JCQkJCQlZWV9ORVdfRklMRTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotCQkJCQlyZXR1cm4geXlpbnB1dCgpOwotI2Vsc2UKLQkJCQkJcmV0dXJuIGlucHV0KCk7Ci0jZW5kaWYKLQkJCQkJfQotCi0JCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46Ci0JCQkJCSh5eV9jX2J1Zl9wKSA9ICh5eXRleHRfcHRyKSArIG9mZnNldDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQljID0gKih1bnNpZ25lZCBjaGFyICopICh5eV9jX2J1Zl9wKTsJLyogY2FzdCBmb3IgOC1iaXQgY2hhcidzICovCi0JKih5eV9jX2J1Zl9wKSA9ICdcMCc7CS8qIHByZXNlcnZlIHpjb25mdGV4dCAqLwotCSh5eV9ob2xkX2NoYXIpID0gKisrKHl5X2NfYnVmX3ApOwotCi0JcmV0dXJuIGM7Ci19Ci0jZW5kaWYJLyogaWZuZGVmIFlZX05PX0lOUFVUICovCi0KLS8qKiBJbW1lZGlhdGVseSBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgaW5wdXQgc3RyZWFtLgotICogQHBhcmFtIGlucHV0X2ZpbGUgQSByZWFkYWJsZSBzdHJlYW0uCi0gKiAKLSAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVzZXQgdGhlIHN0YXJ0IGNvbmRpdGlvbiB0byBAYyBJTklUSUFMIC4KLSAqLwotICAgIHZvaWQgemNvbmZyZXN0YXJ0ICAoRklMRSAqIGlucHV0X2ZpbGUgKQotewotICAgIAotCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApewotICAgICAgICB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7Ci0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9Ci0gICAgICAgICAgICB6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUgKTsKLQl9Ci0KLQl6Y29uZl9pbml0X2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUixpbnB1dF9maWxlICk7Ci0JemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7Ci19Ci0KLS8qKiBTd2l0Y2ggdG8gYSBkaWZmZXJlbnQgaW5wdXQgYnVmZmVyLgotICogQHBhcmFtIG5ld19idWZmZXIgVGhlIG5ldyBpbnB1dCBidWZmZXIuCi0gKiAKLSAqLwotICAgIHZvaWQgemNvbmZfc3dpdGNoX3RvX2J1ZmZlciAgKFlZX0JVRkZFUl9TVEFURSAgbmV3X2J1ZmZlciApCi17Ci0gICAgCi0JLyogVE9ETy4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVwbGFjZSB0aGlzIGVudGlyZSBmdW5jdGlvbiBib2R5Ci0JICogd2l0aAotCSAqCQl6Y29uZnBvcF9idWZmZXJfc3RhdGUoKTsKLQkgKgkJemNvbmZwdXNoX2J1ZmZlcl9zdGF0ZShuZXdfYnVmZmVyKTsKLSAgICAgKi8KLQl6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7Ci0JaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiA9PSBuZXdfYnVmZmVyICkKLQkJcmV0dXJuOwotCi0JaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiApCi0JCXsKLQkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLwotCQkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7Ci0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9ICh5eV9jX2J1Zl9wKTsKLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOwotCQl9Ci0KLQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBuZXdfYnVmZmVyOwotCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOwotCi0JLyogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyB3aGV0aGVyIHdlIGRpZCB0aGlzIHN3aXRjaCBkdXJpbmcKLQkgKiBFT0YgKHpjb25md3JhcCgpKSBwcm9jZXNzaW5nLCBidXQgdGhlIG9ubHkgdGltZSB0aGlzIGZsYWcKLQkgKiBpcyBsb29rZWQgYXQgaXMgYWZ0ZXIgemNvbmZ3cmFwKCkgaXMgY2FsbGVkLCBzbyBpdCdzIHNhZmUKLQkgKiB0byBnbyBhaGVhZCBhbmQgYWx3YXlzIHNldCBpdC4KLQkgKi8KLQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIHpjb25mX2xvYWRfYnVmZmVyX3N0YXRlICAodm9pZCkKLXsKLSAgICAJKHl5X25fY2hhcnMpID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzOwotCSh5eXRleHRfcHRyKSA9ICh5eV9jX2J1Zl9wKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvczsKLQl6Y29uZmluID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pbnB1dF9maWxlOwotCSh5eV9ob2xkX2NoYXIpID0gKih5eV9jX2J1Zl9wKTsKLX0KLQotLyoqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGlucHV0IGJ1ZmZlciBzdGF0ZS4KLSAqIEBwYXJhbSBmaWxlIEEgcmVhZGFibGUgc3RyZWFtLgotICogQHBhcmFtIHNpemUgVGhlIGNoYXJhY3RlciBidWZmZXIgc2l6ZSBpbiBieXRlcy4gV2hlbiBpbiBkb3VidCwgdXNlIEBjIFlZX0JVRl9TSVpFLgotICogCi0gKiBAcmV0dXJuIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlLgotICovCi0gICAgWVlfQlVGRkVSX1NUQVRFIHpjb25mX2NyZWF0ZV9idWZmZXIgIChGSUxFICogZmlsZSwgaW50ICBzaXplICkKLXsKLQlZWV9CVUZGRVJfU1RBVEUgYjsKLSAgICAKLQliID0gKFlZX0JVRkZFUl9TVEFURSkgemNvbmZhbGxvYyhzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSAgKTsKLQlpZiAoICEgYiApCi0JCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mX2NyZWF0ZV9idWZmZXIoKSIgKTsKLQotCWItPnl5X2J1Zl9zaXplID0gc2l6ZTsKLQotCS8qIHl5X2NoX2J1ZiBoYXMgdG8gYmUgMiBjaGFyYWN0ZXJzIGxvbmdlciB0aGFuIHRoZSBzaXplIGdpdmVuIGJlY2F1c2UKLQkgKiB3ZSBuZWVkIHRvIHB1dCBpbiAyIGVuZC1vZi1idWZmZXIgY2hhcmFjdGVycy4KLQkgKi8KLQliLT55eV9jaF9idWYgPSAoY2hhciAqKSB6Y29uZmFsbG9jKGItPnl5X2J1Zl9zaXplICsgMiAgKTsKLQlpZiAoICEgYi0+eXlfY2hfYnVmICkKLQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfY3JlYXRlX2J1ZmZlcigpIiApOwotCi0JYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7Ci0KLQl6Y29uZl9pbml0X2J1ZmZlcihiLGZpbGUgKTsKLQotCXJldHVybiBiOwotfQotCi0vKiogRGVzdHJveSB0aGUgYnVmZmVyLgotICogQHBhcmFtIGIgYSBidWZmZXIgY3JlYXRlZCB3aXRoIHpjb25mX2NyZWF0ZV9idWZmZXIoKQotICogCi0gKi8KLSAgICB2b2lkIHpjb25mX2RlbGV0ZV9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSAgYiApCi17Ci0gICAgCi0JaWYgKCAhIGIgKQotCQlyZXR1cm47Ci0KLQlpZiAoIGIgPT0gWVlfQ1VSUkVOVF9CVUZGRVIgKSAvKiBOb3Qgc3VyZSBpZiB3ZSBzaG91bGQgcG9wIGhlcmUuICovCi0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IChZWV9CVUZGRVJfU1RBVEUpIDA7Ci0KLQlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQotCQl6Y29uZmZyZWUoKHZvaWQgKikgYi0+eXlfY2hfYnVmICApOwotCi0JemNvbmZmcmVlKCh2b2lkICopIGIgICk7Ci19Ci0KLS8qIEluaXRpYWxpemVzIG9yIHJlaW5pdGlhbGl6ZXMgYSBidWZmZXIuCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHNvbWV0aW1lcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgYnVmZmVyLAotICogc3VjaCBhcyBkdXJpbmcgYSB6Y29uZnJlc3RhcnQoKSBvciBhdCBFT0YuCi0gKi8KLSAgICBzdGF0aWMgdm9pZCB6Y29uZl9pbml0X2J1ZmZlciAgKFlZX0JVRkZFUl9TVEFURSAgYiwgRklMRSAqIGZpbGUgKQotCi17Ci0JaW50IG9lcnJubyA9IGVycm5vOwotICAgIAotCXpjb25mX2ZsdXNoX2J1ZmZlcihiICk7Ci0KLQliLT55eV9pbnB1dF9maWxlID0gZmlsZTsKLQliLT55eV9maWxsX2J1ZmZlciA9IDE7Ci0KLSAgICAvKiBJZiBiIGlzIHRoZSBjdXJyZW50IGJ1ZmZlciwgdGhlbiB6Y29uZl9pbml0X2J1ZmZlciB3YXMgX3Byb2JhYmx5XwotICAgICAqIGNhbGxlZCBmcm9tIHpjb25mcmVzdGFydCgpIG9yIHRocm91Z2ggeXlfZ2V0X25leHRfYnVmZmVyLgotICAgICAqIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byByZXNldCB0aGUgbGluZW5vIG9yIGNvbHVtbi4KLSAgICAgKi8KLSAgICBpZiAoYiAhPSBZWV9DVVJSRU5UX0JVRkZFUil7Ci0gICAgICAgIGItPnl5X2JzX2xpbmVubyA9IDE7Ci0gICAgICAgIGItPnl5X2JzX2NvbHVtbiA9IDA7Ci0gICAgfQotCi0gICAgICAgIGItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKLSAgICAKLQllcnJubyA9IG9lcnJubzsKLX0KLQotLyoqIERpc2NhcmQgYWxsIGJ1ZmZlcmVkIGNoYXJhY3RlcnMuIE9uIHRoZSBuZXh0IHNjYW4sIFlZX0lOUFVUIHdpbGwgYmUgY2FsbGVkLgotICogQHBhcmFtIGIgdGhlIGJ1ZmZlciBzdGF0ZSB0byBiZSBmbHVzaGVkLCB1c3VhbGx5IEBjIFlZX0NVUlJFTlRfQlVGRkVSLgotICogCi0gKi8KLSAgICB2b2lkIHpjb25mX2ZsdXNoX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFICBiICkKLXsKLSAgICAJaWYgKCAhIGIgKQotCQlyZXR1cm47Ci0KLQliLT55eV9uX2NoYXJzID0gMDsKLQotCS8qIFdlIGFsd2F5cyBuZWVkIHR3byBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuICBUaGUgZmlyc3QgY2F1c2VzCi0JICogYSB0cmFuc2l0aW9uIHRvIHRoZSBlbmQtb2YtYnVmZmVyIHN0YXRlLiAgVGhlIHNlY29uZCBjYXVzZXMKLQkgKiBhIGphbSBpbiB0aGF0IHN0YXRlLgotCSAqLwotCWItPnl5X2NoX2J1ZlswXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKLQliLT55eV9jaF9idWZbMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7Ci0KLQliLT55eV9idWZfcG9zID0gJmItPnl5X2NoX2J1ZlswXTsKLQotCWItPnl5X2F0X2JvbCA9IDE7Ci0JYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7Ci0KLQlpZiAoIGIgPT0gWVlfQ1VSUkVOVF9CVUZGRVIgKQotCQl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKLX0KLQotLyoqIFB1c2hlcyB0aGUgbmV3IHN0YXRlIG9udG8gdGhlIHN0YWNrLiBUaGUgbmV3IHN0YXRlIGJlY29tZXMKLSAqICB0aGUgY3VycmVudCBzdGF0ZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZSBzdGFjawotICogIGlmIG5lY2Vzc2FyeS4KLSAqICBAcGFyYW0gbmV3X2J1ZmZlciBUaGUgbmV3IHN0YXRlLgotICogIAotICovCi12b2lkIHpjb25mcHVzaF9idWZmZXJfc3RhdGUgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICkKLXsKLSAgICAJaWYgKG5ld19idWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrKCk7Ci0KLQkvKiBUaGlzIGJsb2NrIGlzIGNvcGllZCBmcm9tIHpjb25mX3N3aXRjaF90b19idWZmZXIuICovCi0JaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiApCi0JCXsKLQkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLwotCQkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7Ci0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9ICh5eV9jX2J1Zl9wKTsKLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOwotCQl9Ci0KLQkvKiBPbmx5IHB1c2ggaWYgdG9wIGV4aXN0cy4gT3RoZXJ3aXNlLCByZXBsYWNlIHRvcC4gKi8KLQlpZiAoWVlfQ1VSUkVOVF9CVUZGRVIpCi0JCSh5eV9idWZmZXJfc3RhY2tfdG9wKSsrOwotCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IG5ld19idWZmZXI7Ci0KLQkvKiBjb3BpZWQgZnJvbSB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyLiAqLwotCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOwotCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMTsKLX0KLQotLyoqIFJlbW92ZXMgYW5kIGRlbGV0ZXMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIGlmIHByZXNlbnQuCi0gKiAgVGhlIG5leHQgZWxlbWVudCBiZWNvbWVzIHRoZSBuZXcgdG9wLgotICogIAotICovCi12b2lkIHpjb25mcG9wX2J1ZmZlcl9zdGF0ZSAodm9pZCkKLXsKLSAgICAJaWYgKCFZWV9DVVJSRU5UX0JVRkZFUikKLQkJcmV0dXJuOwotCi0JemNvbmZfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiApOwotCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IE5VTEw7Ci0JaWYgKCh5eV9idWZmZXJfc3RhY2tfdG9wKSA+IDApCi0JCS0tKHl5X2J1ZmZlcl9zdGFja190b3ApOwotCi0JaWYgKFlZX0NVUlJFTlRfQlVGRkVSKSB7Ci0JCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOwotCQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7Ci0JfQotfQotCi0vKiBBbGxvY2F0ZXMgdGhlIHN0YWNrIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICogIEd1YXJhbnRlZXMgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBwdXNoLgotICovCi1zdGF0aWMgdm9pZCB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKHZvaWQpCi17Ci0JaW50IG51bV90b19hbGxvYzsKLSAgICAKLQlpZiAoISh5eV9idWZmZXJfc3RhY2spKSB7Ci0KLQkJLyogRmlyc3QgYWxsb2NhdGlvbiBpcyBqdXN0IGZvciAyIGVsZW1lbnRzLCBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoaXMKLQkJICogc2Nhbm5lciB3aWxsIGV2ZW4gbmVlZCBhIHN0YWNrLiBXZSB1c2UgMiBpbnN0ZWFkIG9mIDEgdG8gYXZvaWQgYW4KLQkJICogaW1tZWRpYXRlIHJlYWxsb2Mgb24gdGhlIG5leHQgY2FsbC4KLSAgICAgICAgICovCi0JCW51bV90b19hbGxvYyA9IDE7Ci0JCSh5eV9idWZmZXJfc3RhY2spID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKil6Y29uZmFsbG9jCi0JCQkJCQkJCShudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCi0JCQkJCQkJCSk7Ci0JCWlmICggISAoeXlfYnVmZmVyX3N0YWNrKSApCi0JCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2soKSIgKTsKLQkJCQkJCQkJICAKLQkJbWVtc2V0KCh5eV9idWZmZXJfc3RhY2spLCAwLCBudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopKTsKLQkJCQkKLQkJKHl5X2J1ZmZlcl9zdGFja19tYXgpID0gbnVtX3RvX2FsbG9jOwotCQkoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPSAwOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCh5eV9idWZmZXJfc3RhY2tfdG9wKSA+PSAoKHl5X2J1ZmZlcl9zdGFja19tYXgpKSAtIDEpewotCi0JCS8qIEluY3JlYXNlIHRoZSBidWZmZXIgdG8gcHJlcGFyZSBmb3IgYSBwb3NzaWJsZSBwdXNoLiAqLwotCQlpbnQgZ3Jvd19zaXplID0gOCAvKiBhcmJpdHJhcnkgZ3JvdyBzaXplICovOwotCi0JCW51bV90b19hbGxvYyA9ICh5eV9idWZmZXJfc3RhY2tfbWF4KSArIGdyb3dfc2l6ZTsKLQkJKHl5X2J1ZmZlcl9zdGFjaykgPSAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSoqKXpjb25mcmVhbGxvYwotCQkJCQkJCQkoKHl5X2J1ZmZlcl9zdGFjayksCi0JCQkJCQkJCW51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikKLQkJCQkJCQkJKTsKLQkJaWYgKCAhICh5eV9idWZmZXJfc3RhY2spICkKLQkJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjaygpIiApOwotCi0JCS8qIHplcm8gb25seSB0aGUgbmV3IHNsb3RzLiovCi0JCW1lbXNldCgoeXlfYnVmZmVyX3N0YWNrKSArICh5eV9idWZmZXJfc3RhY2tfbWF4KSwgMCwgZ3Jvd19zaXplICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7Ci0JCSh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IG51bV90b19hbGxvYzsKLQl9Ci19Ci0KLS8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gZGlyZWN0bHkgZnJvbSBhIHVzZXItc3BlY2lmaWVkIGNoYXJhY3RlciBidWZmZXIuCi0gKiBAcGFyYW0gYmFzZSB0aGUgY2hhcmFjdGVyIGJ1ZmZlcgotICogQHBhcmFtIHNpemUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNoYXJhY3RlciBidWZmZXIKLSAqIAotICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuIAotICovCi1ZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9idWZmZXIgIChjaGFyICogYmFzZSwgeXlfc2l6ZV90ICBzaXplICkKLXsKLQlZWV9CVUZGRVJfU1RBVEUgYjsKLSAgICAKLQlpZiAoIHNpemUgPCAyIHx8Ci0JICAgICBiYXNlW3NpemUtMl0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSIHx8Ci0JICAgICBiYXNlW3NpemUtMV0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSICkKLQkJLyogVGhleSBmb3Jnb3QgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIEVPQidzLiAqLwotCQlyZXR1cm4gMDsKLQotCWIgPSAoWVlfQlVGRkVSX1NUQVRFKSB6Y29uZmFsbG9jKHNpemVvZiggc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSApICApOwotCWlmICggISBiICkKLQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfc2Nhbl9idWZmZXIoKSIgKTsKLQotCWItPnl5X2J1Zl9zaXplID0gc2l6ZSAtIDI7CS8qICItIDIiIHRvIHRha2UgY2FyZSBvZiBFT0IncyAqLwotCWItPnl5X2J1Zl9wb3MgPSBiLT55eV9jaF9idWYgPSBiYXNlOwotCWItPnl5X2lzX291cl9idWZmZXIgPSAwOwotCWItPnl5X2lucHV0X2ZpbGUgPSAwOwotCWItPnl5X25fY2hhcnMgPSBiLT55eV9idWZfc2l6ZTsKLQliLT55eV9pc19pbnRlcmFjdGl2ZSA9IDA7Ci0JYi0+eXlfYXRfYm9sID0gMTsKLQliLT55eV9maWxsX2J1ZmZlciA9IDA7Ci0JYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7Ci0KLQl6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyKGIgICk7Ci0KLQlyZXR1cm4gYjsKLX0KLQotLyoqIFNldHVwIHRoZSBpbnB1dCBidWZmZXIgc3RhdGUgdG8gc2NhbiBhIHN0cmluZy4gVGhlIG5leHQgY2FsbCB0byB6Y29uZmxleCgpIHdpbGwKLSAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgc3RyLgotICogQHBhcmFtIHl5c3RyIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHNjYW4KLSAqIAotICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuCi0gKiBAbm90ZSBJZiB5b3Ugd2FudCB0byBzY2FuIGJ5dGVzIHRoYXQgbWF5IGNvbnRhaW4gTlVMIHZhbHVlcywgdGhlbiB1c2UKLSAqICAgICAgIHpjb25mX3NjYW5fYnl0ZXMoKSBpbnN0ZWFkLgotICovCi1ZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9zdHJpbmcgKHl5Y29uc3QgY2hhciAqIHl5c3RyICkKLXsKLSAgICAKLQlyZXR1cm4gemNvbmZfc2Nhbl9ieXRlcyh5eXN0cixzdHJsZW4oeXlzdHIpICk7Ci19Ci0KLS8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gdGhlIGdpdmVuIGJ5dGVzLiBUaGUgbmV4dCBjYWxsIHRvIHpjb25mbGV4KCkgd2lsbAotICogc2NhbiBmcm9tIGEgQGUgY29weSBvZiBAYSBieXRlcy4KLSAqIEBwYXJhbSB5eWJ5dGVzIHRoZSBieXRlIGJ1ZmZlciB0byBzY2FuCi0gKiBAcGFyYW0gX3l5Ynl0ZXNfbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IEBhIGJ5dGVzLgotICogCi0gKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4KLSAqLwotWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnl0ZXMgICh5eWNvbnN0IGNoYXIgKiB5eWJ5dGVzLCBpbnQgIF95eWJ5dGVzX2xlbiApCi17Ci0JWVlfQlVGRkVSX1NUQVRFIGI7Ci0JY2hhciAqYnVmOwotCXl5X3NpemVfdCBuOwotCWludCBpOwotICAgIAotCS8qIEdldCBtZW1vcnkgZm9yIGZ1bGwgYnVmZmVyLCBpbmNsdWRpbmcgc3BhY2UgZm9yIHRyYWlsaW5nIEVPQidzLiAqLwotCW4gPSBfeXlieXRlc19sZW4gKyAyOwotCWJ1ZiA9IChjaGFyICopIHpjb25mYWxsb2MobiAgKTsKLQlpZiAoICEgYnVmICkKLQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfc2Nhbl9ieXRlcygpIiApOwotCi0JZm9yICggaSA9IDA7IGkgPCBfeXlieXRlc19sZW47ICsraSApCi0JCWJ1ZltpXSA9IHl5Ynl0ZXNbaV07Ci0KLQlidWZbX3l5Ynl0ZXNfbGVuXSA9IGJ1ZltfeXlieXRlc19sZW4rMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7Ci0KLQliID0gemNvbmZfc2Nhbl9idWZmZXIoYnVmLG4gKTsKLQlpZiAoICEgYiApCi0JCVlZX0ZBVEFMX0VSUk9SKCAiYmFkIGJ1ZmZlciBpbiB6Y29uZl9zY2FuX2J5dGVzKCkiICk7Ci0KLQkvKiBJdCdzIG9rYXkgdG8gZ3JvdyBldGMuIHRoaXMgYnVmZmVyLCBhbmQgd2Ugc2hvdWxkIHRocm93IGl0Ci0JICogYXdheSB3aGVuIHdlJ3JlIGRvbmUuCi0JICovCi0JYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7Ci0KLQlyZXR1cm4gYjsKLX0KLQotI2lmbmRlZiBZWV9FWElUX0ZBSUxVUkUKLSNkZWZpbmUgWVlfRVhJVF9GQUlMVVJFIDIKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCB5eV9mYXRhbF9lcnJvciAoeXljb25zdCBjaGFyKiBtc2cgKQotewotICAgIAkodm9pZCkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZyApOwotCWV4aXQoIFlZX0VYSVRfRkFJTFVSRSApOwotfQotCi0vKiBSZWRlZmluZSB5eWxlc3MoKSBzbyBpdCB3b3JrcyBpbiBzZWN0aW9uIDMgY29kZS4gKi8KLQotI3VuZGVmIHl5bGVzcwotI2RlZmluZSB5eWxlc3MobikgXAotCWRvIFwKLQkJeyBcCi0JCS8qIFVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dC4gKi8gXAotICAgICAgICBpbnQgeXlsZXNzX21hY3JvX2FyZyA9IChuKTsgXAotICAgICAgICBZWV9MRVNTX0xJTkVOTyh5eWxlc3NfbWFjcm9fYXJnKTtcCi0JCXpjb25mdGV4dFt6Y29uZmxlbmddID0gKHl5X2hvbGRfY2hhcik7IFwKLQkJKHl5X2NfYnVmX3ApID0gemNvbmZ0ZXh0ICsgeXlsZXNzX21hY3JvX2FyZzsgXAotCQkoeXlfaG9sZF9jaGFyKSA9ICooeXlfY19idWZfcCk7IFwKLQkJKih5eV9jX2J1Zl9wKSA9ICdcMCc7IFwKLQkJemNvbmZsZW5nID0geXlsZXNzX21hY3JvX2FyZzsgXAotCQl9IFwKLQl3aGlsZSAoIDAgKQotCi0vKiBBY2Nlc3NvciAgbWV0aG9kcyAoZ2V0L3NldCBmdW5jdGlvbnMpIHRvIHN0cnVjdCBtZW1iZXJzLiAqLwotCi0vKiogR2V0IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgotICogCi0gKi8KLWludCB6Y29uZmdldF9saW5lbm8gICh2b2lkKQotewotICAgICAgICAKLSAgICByZXR1cm4gemNvbmZsaW5lbm87Ci19Ci0KLS8qKiBHZXQgdGhlIGlucHV0IHN0cmVhbS4KLSAqIAotICovCi1GSUxFICp6Y29uZmdldF9pbiAgKHZvaWQpCi17Ci0gICAgICAgIHJldHVybiB6Y29uZmluOwotfQotCi0vKiogR2V0IHRoZSBvdXRwdXQgc3RyZWFtLgotICogCi0gKi8KLUZJTEUgKnpjb25mZ2V0X291dCAgKHZvaWQpCi17Ci0gICAgICAgIHJldHVybiB6Y29uZm91dDsKLX0KLQotLyoqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHRva2VuLgotICogCi0gKi8KLWludCB6Y29uZmdldF9sZW5nICAodm9pZCkKLXsKLSAgICAgICAgcmV0dXJuIHpjb25mbGVuZzsKLX0KLQotLyoqIEdldCB0aGUgY3VycmVudCB0b2tlbi4KLSAqIAotICovCi0KLWNoYXIgKnpjb25mZ2V0X3RleHQgICh2b2lkKQotewotICAgICAgICByZXR1cm4gemNvbmZ0ZXh0OwotfQotCi0vKiogU2V0IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgotICogQHBhcmFtIGxpbmVfbnVtYmVyCi0gKiAKLSAqLwotdm9pZCB6Y29uZnNldF9saW5lbm8gKGludCAgbGluZV9udW1iZXIgKQotewotICAgIAotICAgIHpjb25mbGluZW5vID0gbGluZV9udW1iZXI7Ci19Ci0KLS8qKiBTZXQgdGhlIGlucHV0IHN0cmVhbS4gVGhpcyBkb2VzIG5vdCBkaXNjYXJkIHRoZSBjdXJyZW50Ci0gKiBpbnB1dCBidWZmZXIuCi0gKiBAcGFyYW0gaW5fc3RyIEEgcmVhZGFibGUgc3RyZWFtLgotICogCi0gKiBAc2VlIHpjb25mX3N3aXRjaF90b19idWZmZXIKLSAqLwotdm9pZCB6Y29uZnNldF9pbiAoRklMRSAqICBpbl9zdHIgKQotewotICAgICAgICB6Y29uZmluID0gaW5fc3RyIDsKLX0KLQotdm9pZCB6Y29uZnNldF9vdXQgKEZJTEUgKiAgb3V0X3N0ciApCi17Ci0gICAgICAgIHpjb25mb3V0ID0gb3V0X3N0ciA7Ci19Ci0KLWludCB6Y29uZmdldF9kZWJ1ZyAgKHZvaWQpCi17Ci0gICAgICAgIHJldHVybiB6Y29uZl9mbGV4X2RlYnVnOwotfQotCi12b2lkIHpjb25mc2V0X2RlYnVnIChpbnQgIGJkZWJ1ZyApCi17Ci0gICAgICAgIHpjb25mX2ZsZXhfZGVidWcgPSBiZGVidWcgOwotfQotCi1zdGF0aWMgaW50IHl5X2luaXRfZ2xvYmFscyAodm9pZCkKLXsKLSAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBub24tcmVlbnRyYW50IHNjYW5uZXIuCi0gICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB6Y29uZmxleF9kZXN0cm95KCksIHNvIGRvbid0IGFsbG9jYXRlIGhlcmUuCi0gICAgICovCi0KLSAgICAoeXlfYnVmZmVyX3N0YWNrKSA9IDA7Ci0gICAgKHl5X2J1ZmZlcl9zdGFja190b3ApID0gMDsKLSAgICAoeXlfYnVmZmVyX3N0YWNrX21heCkgPSAwOwotICAgICh5eV9jX2J1Zl9wKSA9IChjaGFyICopIDA7Ci0gICAgKHl5X2luaXQpID0gMDsKLSAgICAoeXlfc3RhcnQpID0gMDsKLQotLyogRGVmaW5lZCBpbiBtYWluLmMgKi8KLSNpZmRlZiBZWV9TVERJTklUCi0gICAgemNvbmZpbiA9IHN0ZGluOwotICAgIHpjb25mb3V0ID0gc3Rkb3V0OwotI2Vsc2UKLSAgICB6Y29uZmluID0gKEZJTEUgKikgMDsKLSAgICB6Y29uZm91dCA9IChGSUxFICopIDA7Ci0jZW5kaWYKLQotICAgIC8qIEZvciBmdXR1cmUgcmVmZXJlbmNlOiBTZXQgZXJybm8gb24gZXJyb3IsIHNpbmNlIHdlIGFyZSBjYWxsZWQgYnkKLSAgICAgKiB6Y29uZmxleF9pbml0KCkKLSAgICAgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyogemNvbmZsZXhfZGVzdHJveSBpcyBmb3IgYm90aCByZWVudHJhbnQgYW5kIG5vbi1yZWVudHJhbnQgc2Nhbm5lcnMuICovCi1pbnQgemNvbmZsZXhfZGVzdHJveSAgKHZvaWQpCi17Ci0gICAgCi0gICAgLyogUG9wIHRoZSBidWZmZXIgc3RhY2ssIGRlc3Ryb3lpbmcgZWFjaCBlbGVtZW50LiAqLwotCXdoaWxlKFlZX0NVUlJFTlRfQlVGRkVSKXsKLQkJemNvbmZfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiAgKTsKLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gTlVMTDsKLQkJemNvbmZwb3BfYnVmZmVyX3N0YXRlKCk7Ci0JfQotCi0JLyogRGVzdHJveSB0aGUgc3RhY2sgaXRzZWxmLiAqLwotCXpjb25mZnJlZSgoeXlfYnVmZmVyX3N0YWNrKSApOwotCSh5eV9idWZmZXJfc3RhY2spID0gTlVMTDsKLQotICAgIC8qIFJlc2V0IHRoZSBnbG9iYWxzLiBUaGlzIGlzIGltcG9ydGFudCBpbiBhIG5vbi1yZWVudHJhbnQgc2Nhbm5lciBzbyB0aGUgbmV4dCB0aW1lCi0gICAgICogemNvbmZsZXgoKSBpcyBjYWxsZWQsIGluaXRpYWxpemF0aW9uIHdpbGwgb2NjdXIuICovCi0gICAgeXlfaW5pdF9nbG9iYWxzKCApOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBJbnRlcm5hbCB1dGlsaXR5IHJvdXRpbmVzLgotICovCi0KLSNpZm5kZWYgeXl0ZXh0X3B0cgotc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5IChjaGFyKiBzMSwgeXljb25zdCBjaGFyICogczIsIGludCBuICkKLXsKLQlyZWdpc3RlciBpbnQgaTsKLQlmb3IgKCBpID0gMDsgaSA8IG47ICsraSApCi0JCXMxW2ldID0gczJbaV07Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFlZX05FRURfU1RSTEVOCi1zdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuICh5eWNvbnN0IGNoYXIgKiBzICkKLXsKLQlyZWdpc3RlciBpbnQgbjsKLQlmb3IgKCBuID0gMDsgc1tuXTsgKytuICkKLQkJOwotCi0JcmV0dXJuIG47Ci19Ci0jZW5kaWYKLQotdm9pZCAqemNvbmZhbGxvYyAoeXlfc2l6ZV90ICBzaXplICkKLXsKLQlyZXR1cm4gKHZvaWQgKikgbWFsbG9jKCBzaXplICk7Ci19Ci0KLXZvaWQgKnpjb25mcmVhbGxvYyAgKHZvaWQgKiBwdHIsIHl5X3NpemVfdCAgc2l6ZSApCi17Ci0JLyogVGhlIGNhc3QgdG8gKGNoYXIgKikgaW4gdGhlIGZvbGxvd2luZyBhY2NvbW1vZGF0ZXMgYm90aAotCSAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHVzZSBjaGFyKiBnZW5lcmljIHBvaW50ZXJzLCBhbmQgdGhvc2UKLQkgKiB0aGF0IHVzZSB2b2lkKiBnZW5lcmljIHBvaW50ZXJzLiAgSXQgd29ya3Mgd2l0aCB0aGUgbGF0dGVyCi0JICogYmVjYXVzZSBib3RoIEFOU0kgQyBhbmQgQysrIGFsbG93IGNhc3RsZXNzIGFzc2lnbm1lbnQgZnJvbQotCSAqIGFueSBwb2ludGVyIHR5cGUgdG8gdm9pZCosIGFuZCBkZWFsIHdpdGggYXJndW1lbnQgY29udmVyc2lvbnMKLQkgKiBhcyB0aG91Z2ggZG9pbmcgYW4gYXNzaWdubWVudC4KLQkgKi8KLQlyZXR1cm4gKHZvaWQgKikgcmVhbGxvYyggKGNoYXIgKikgcHRyLCBzaXplICk7Ci19Ci0KLXZvaWQgemNvbmZmcmVlICh2b2lkICogcHRyICkKLXsKLQlmcmVlKCAoY2hhciAqKSBwdHIgKTsJLyogc2VlIHpjb25mcmVhbGxvYygpIGZvciAoY2hhciAqKSBjYXN0ICovCi19Ci0KLSNkZWZpbmUgWVlUQUJMRVNfTkFNRSAieXl0YWJsZXMiCi0KLXZvaWQgemNvbmZfc3RhcnRoZWxwKHZvaWQpCi17Ci0JbmV3X3N0cmluZygpOwotCWxhc3RfdHMgPSBmaXJzdF90cyA9IDA7Ci0JQkVHSU4oSEVMUCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHpjb25mX2VuZGhlbHAodm9pZCkKLXsKLQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKLQlCRUdJTihJTklUSUFMKTsKLX0KLQotLyoKLSAqIFRyeSB0byBvcGVuIHNwZWNpZmllZCBmaWxlIHdpdGggZm9sbG93aW5nIG5hbWVzOgotICogLi9uYW1lCi0gKiAkKHNyY3RyZWUpL25hbWUKLSAqIFRoZSBsYXR0ZXIgaXMgdXNlZCB3aGVuIHNyY3RyZWUgaXMgc2VwYXJhdGUgZnJvbSBvYmp0cmVlCi0gKiB3aGVuIGNvbXBpbGluZyB0aGUga2VybmVsLgotICogUmV0dXJuIE5VTEwgaWYgZmlsZSBpcyBub3QgZm91bmQuCi0gKi8KLUZJTEUgKnpjb25mX2ZvcGVuKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JY2hhciAqZW52LCBmdWxsbmFtZVtQQVRIX01BWCsxXTsKLQlGSUxFICpmOwotCi0JZiA9IGZvcGVuKG5hbWUsICJyIik7Ci0JaWYgKCFmICYmIG5hbWUgIT0gTlVMTCAmJiBuYW1lWzBdICE9ICcvJykgewotCQllbnYgPSBnZXRlbnYoU1JDVFJFRSk7Ci0JCWlmIChlbnYpIHsKLQkJCXNwcmludGYoZnVsbG5hbWUsICIlcy8lcyIsIGVudiwgbmFtZSk7Ci0JCQlmID0gZm9wZW4oZnVsbG5hbWUsICJyIik7Ci0JCX0KLQl9Ci0JcmV0dXJuIGY7Ci19Ci0KLXZvaWQgemNvbmZfaW5pdHNjYW4oY29uc3QgY2hhciAqbmFtZSkKLXsKLQl6Y29uZmluID0gemNvbmZfZm9wZW4obmFtZSk7Ci0JaWYgKCF6Y29uZmluKSB7Ci0JCXByaW50ZigiY2FuJ3QgZmluZCBmaWxlICVzXG4iLCBuYW1lKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQljdXJyZW50X2J1ZiA9IG1hbGxvYyhzaXplb2YoKmN1cnJlbnRfYnVmKSk7Ci0JbWVtc2V0KGN1cnJlbnRfYnVmLCAwLCBzaXplb2YoKmN1cnJlbnRfYnVmKSk7Ci0KLQljdXJyZW50X2ZpbGUgPSBmaWxlX2xvb2t1cChuYW1lKTsKLQljdXJyZW50X2ZpbGUtPmxpbmVubyA9IDE7Ci19Ci0KLXZvaWQgemNvbmZfbmV4dGZpbGUoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgZmlsZSAqaXRlcjsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZpbGVfbG9va3VwKG5hbWUpOwotCXN0cnVjdCBidWZmZXIgKmJ1ZiA9IG1hbGxvYyhzaXplb2YoKmJ1ZikpOwotCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7Ci0KLQljdXJyZW50X2J1Zi0+c3RhdGUgPSBZWV9DVVJSRU5UX0JVRkZFUjsKLQl6Y29uZmluID0gemNvbmZfZm9wZW4oZmlsZS0+bmFtZSk7Ci0JaWYgKCF6Y29uZmluKSB7Ci0JCXByaW50ZigiJXM6JWQ6IGNhbid0IG9wZW4gZmlsZSBcIiVzXCJcbiIsCi0JCSAgICB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCBmaWxlLT5uYW1lKTsKLQkJZXhpdCgxKTsKLQl9Ci0JemNvbmZfc3dpdGNoX3RvX2J1ZmZlcih6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUpKTsKLQlidWYtPnBhcmVudCA9IGN1cnJlbnRfYnVmOwotCWN1cnJlbnRfYnVmID0gYnVmOwotCi0JZm9yIChpdGVyID0gY3VycmVudF9maWxlLT5wYXJlbnQ7IGl0ZXI7IGl0ZXIgPSBpdGVyLT5wYXJlbnQgKSB7Ci0JCWlmICghc3RyY21wKGN1cnJlbnRfZmlsZS0+bmFtZSxpdGVyLT5uYW1lKSApIHsKLQkJCXByaW50ZigiJXM6JWQ6IHJlY3Vyc2l2ZSBpbmNsdXNpb24gZGV0ZWN0ZWQuICIKLQkJCSAgICAgICAiSW5jbHVzaW9uIHBhdGg6XG4gIGN1cnJlbnQgZmlsZSA6ICclcydcbiIsCi0JCQkgICAgICAgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwKLQkJCSAgICAgICB6Y29uZl9jdXJuYW1lKCkpOwotCQkJaXRlciA9IGN1cnJlbnRfZmlsZS0+cGFyZW50OwotCQkJd2hpbGUgKGl0ZXIgJiYgXAotCQkJICAgICAgIHN0cmNtcChpdGVyLT5uYW1lLGN1cnJlbnRfZmlsZS0+bmFtZSkpIHsKLQkJCQlwcmludGYoIiAgaW5jbHVkZWQgZnJvbTogJyVzOiVkJ1xuIiwKLQkJCQkgICAgICAgaXRlci0+bmFtZSwgaXRlci0+bGluZW5vLTEpOwotCQkJCWl0ZXIgPSBpdGVyLT5wYXJlbnQ7Ci0JCQl9Ci0JCQlpZiAoaXRlcikKLQkJCQlwcmludGYoIiAgaW5jbHVkZWQgZnJvbTogJyVzOiVkJ1xuIiwKLQkJCQkgICAgICAgaXRlci0+bmFtZSwgaXRlci0+bGluZW5vKzEpOwotCQkJZXhpdCgxKTsKLQkJfQotCX0KLQlmaWxlLT5saW5lbm8gPSAxOwotCWZpbGUtPnBhcmVudCA9IGN1cnJlbnRfZmlsZTsKLQljdXJyZW50X2ZpbGUgPSBmaWxlOwotfQotCi1zdGF0aWMgdm9pZCB6Y29uZl9lbmRmaWxlKHZvaWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqcGFyZW50OwotCi0JY3VycmVudF9maWxlID0gY3VycmVudF9maWxlLT5wYXJlbnQ7Ci0KLQlwYXJlbnQgPSBjdXJyZW50X2J1Zi0+cGFyZW50OwotCWlmIChwYXJlbnQpIHsKLQkJZmNsb3NlKHpjb25maW4pOwotCQl6Y29uZl9kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSKTsKLQkJemNvbmZfc3dpdGNoX3RvX2J1ZmZlcihwYXJlbnQtPnN0YXRlKTsKLQl9Ci0JZnJlZShjdXJyZW50X2J1Zik7Ci0JY3VycmVudF9idWYgPSBwYXJlbnQ7Ci19Ci0KLWludCB6Y29uZl9saW5lbm8odm9pZCkKLXsKLQlyZXR1cm4gY3VycmVudF9wb3MubGluZW5vOwotfQotCi1jb25zdCBjaGFyICp6Y29uZl9jdXJuYW1lKHZvaWQpCi17Ci0JcmV0dXJuIGN1cnJlbnRfcG9zLmZpbGUgPyBjdXJyZW50X3Bvcy5maWxlLT5uYW1lIDogIjxub25lPiI7Ci19Ci0KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sa2MuaCBiL3NjcmlwdHMva2NvbmZpZy9sa2MuaAppbmRleCBmZWJmMGM5Li5mMzRhMGE5IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbGtjLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCkBAIC02OCw5ICs2OCw3IEBACiAJZW51bSBzeW1ib2xfdHlwZSBzdHlwZTsKIH07CiAKLSNpZmRlZiBZWURFQlVHCiBleHRlcm4gaW50IHpjb25mZGVidWc7Ci0jZW5kaWYKIAogaW50IHpjb25mcGFyc2Uodm9pZCk7CiB2b2lkIHpjb25mZHVtcChGSUxFICpvdXQpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmCmluZGV4IGM5ZTY5MGUuLmYxNGFiNDEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZgorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYKQEAgLTksNyArOSw3IEBACiAKIHN0cnVjdCBrY29uZl9pZDsKIAotc3RhdGljIHN0cnVjdCBrY29uZl9pZCAqa2NvbmZfaWRfbG9va3VwKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0ciwgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxlbik7CitzdGF0aWMgY29uc3Qgc3RydWN0IGtjb25mX2lkICprY29uZl9pZF9sb29rdXAocmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyLCByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGVuKTsKIAogJSUKIG1haW5tZW51LAlUX01BSU5NRU5VLAlURl9DT01NQU5ECmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYuaGFzaC5jX3NoaXBwZWQgYi9zY3JpcHRzL2tjb25maWcvemNvbmYuaGFzaC5jX3NoaXBwZWQKaW5kZXggNDA1NWQ1ZC4uNDBkZjAwMCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLmhhc2guY19zaGlwcGVkCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5oYXNoLmNfc2hpcHBlZApAQCAtMSw2ICsxLDUgQEAKLS8qIEFOU0ktQyBjb2RlIHByb2R1Y2VkIGJ5IGdwZXJmIHZlcnNpb24gMy4wLjMgKi8KLS8qIENvbW1hbmQtbGluZTogZ3BlcmYgICovCi0vKiBDb21wdXRlZCBwb3NpdGlvbnM6IC1rJzEsMycgKi8KKy8qIEFOU0ktQyBjb2RlIHByb2R1Y2VkIGJ5IGdwZXJmIHZlcnNpb24gMy4wLjQgKi8KKy8qIENvbW1hbmQtbGluZTogZ3BlcmYgLXQgLS1vdXRwdXQtZmlsZSBzY3JpcHRzL2tjb25maWcvemNvbmYuaGFzaC5jX3NoaXBwZWQgLWEgLUMgLUUgLWcgLWsgJzEsMywkJyAtcCAtdCBzY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYgICovCiAKICNpZiAhKCgnICcgPT0gMzIpICYmICgnIScgPT0gMzMpICYmICgnIicgPT0gMzQpICYmICgnIycgPT0gMzUpIFwKICAgICAgICYmICgnJScgPT0gMzcpICYmICgnJicgPT0gMzgpICYmICgnXCcnID09IDM5KSAmJiAoJygnID09IDQwKSBcCkBAIC0yOSwxMCArMjgsMTEgQEAKICNlcnJvciAiZ3BlcmYgZ2VuZXJhdGVkIHRhYmxlcyBkb24ndCB3b3JrIHdpdGggdGhpcyBleGVjdXRpb24gY2hhcmFjdGVyIHNldC4gUGxlYXNlIHJlcG9ydCBhIGJ1ZyB0byA8YnVnLWdudS1ncGVyZkBnbnUub3JnPi4iCiAjZW5kaWYKIAorI2xpbmUgMTAgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKIHN0cnVjdCBrY29uZl9pZDsKIAotc3RhdGljIHN0cnVjdCBrY29uZl9pZCAqa2NvbmZfaWRfbG9va3VwKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0ciwgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxlbik7Ci0vKiBtYXhpbXVtIGtleSByYW5nZSA9IDUwLCBkdXBsaWNhdGVzID0gMCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBrY29uZl9pZCAqa2NvbmZfaWRfbG9va3VwKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0ciwgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxlbik7CisvKiBtYXhpbXVtIGtleSByYW5nZSA9IDcxLCBkdXBsaWNhdGVzID0gMCAqLwogCiAjaWZkZWYgX19HTlVDX18KIF9faW5saW5lCkBAIC00NCwzNCArNDQsMzQgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGtjb25mX2lkX2hhc2ggKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0ciwgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxlbikKIHsKLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNzb192YWx1ZXNbXSA9CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFzc29fdmFsdWVzW10gPQogICAgIHsKLSAgICAgIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLAotICAgICAgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsCi0gICAgICA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwKLSAgICAgIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLAotICAgICAgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsCi0gICAgICA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwKLSAgICAgIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLAotICAgICAgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsCi0gICAgICA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwKLSAgICAgIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNDAsICA1LAotICAgICAgIDAsICAwLCAgNSwgNTIsICAwLCAyMCwgNTIsIDUyLCAxMCwgMjAsCi0gICAgICAgNSwgIDAsIDM1LCA1MiwgIDAsIDMwLCAgMCwgMTUsICAwLCA1MiwKLSAgICAgIDE1LCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLAotICAgICAgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsCi0gICAgICA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwKLSAgICAgIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLAotICAgICAgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsCi0gICAgICA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwKLSAgICAgIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLAotICAgICAgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsCi0gICAgICA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwKLSAgICAgIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLAotICAgICAgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsCi0gICAgICA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwKLSAgICAgIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLAotICAgICAgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MgorICAgICAgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsCisgICAgICA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywKKyAgICAgIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLAorICAgICAgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsCisgICAgICA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywKKyAgICAgIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLAorICAgICAgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsCisgICAgICA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywKKyAgICAgIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLAorICAgICAgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCAyNSwgMjUsCisgICAgICAgMCwgIDAsICAwLCAgNSwgIDAsICAwLCA3MywgNzMsICA1LCAgMCwKKyAgICAgIDEwLCAgNSwgNDUsIDczLCAyMCwgMjAsICAwLCAxNSwgMTUsIDczLAorICAgICAgMjAsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsCisgICAgICA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywKKyAgICAgIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLAorICAgICAgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsCisgICAgICA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywKKyAgICAgIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLAorICAgICAgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsCisgICAgICA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywKKyAgICAgIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLAorICAgICAgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsCisgICAgICA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywKKyAgICAgIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLAorICAgICAgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsIDczLCA3MywgNzMsCisgICAgICA3MywgNzMsIDczLCA3MywgNzMsIDczCiAgICAgfTsKICAgcmVnaXN0ZXIgaW50IGh2YWwgPSBsZW47CiAKQEAgLTg1LDg3ICs4NSw4NyBAQAogICAgICAgICBodmFsICs9IGFzc29fdmFsdWVzWyh1bnNpZ25lZCBjaGFyKXN0clswXV07CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgcmV0dXJuIGh2YWw7CisgIHJldHVybiBodmFsICsgYXNzb192YWx1ZXNbKHVuc2lnbmVkIGNoYXIpc3RyW2xlbiAtIDFdXTsKIH0KIAogc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdAogICB7Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjJbc2l6ZW9mKCJvbiIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyM1tzaXplb2YoImVudiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMltzaXplb2YoImlmIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzW3NpemVvZigiaW50IildOwogICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI1W3NpemVvZigiZW5kaWYiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjZbc2l6ZW9mKCJvcHRpb24iKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjdbc2l6ZW9mKCJlbmRtZW51IildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI4W3NpemVvZigib3B0aW9uYWwiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjdbc2l6ZW9mKCJkZWZhdWx0IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI4W3NpemVvZigidHJpc3RhdGUiKV07CiAgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjlbc2l6ZW9mKCJlbmRjaG9pY2UiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjEwW3NpemVvZigicmFuZ2UiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjExW3NpemVvZigiY2hvaWNlIildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxMltzaXplb2YoImRlZmF1bHQiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjEyW3NpemVvZigiZGVmX3RyaXN0YXRlIildOwogICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxM1tzaXplb2YoImRlZl9ib29sIildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxNFtzaXplb2YoImhlbHAiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjE2W3NpemVvZigiY29uZmlnIildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxN1tzaXplb2YoImRlZl90cmlzdGF0ZSIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMThbc2l6ZW9mKCJoZXgiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjE5W3NpemVvZigiZGVmY29uZmlnX2xpc3QiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjIyW3NpemVvZigiaWYiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjIzW3NpemVvZigiaW50IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxNFtzaXplb2YoImRlZmNvbmZpZ19saXN0IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxN1tzaXplb2YoIm9uIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIxOFtzaXplb2YoIm9wdGlvbmFsIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyMVtzaXplb2YoIm9wdGlvbiIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjJbc2l6ZW9mKCJlbmRtZW51IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyM1tzaXplb2YoIm1haW5tZW51IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIyNVtzaXplb2YoIm1lbnVjb25maWciKV07CiAgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjI3W3NpemVvZigibW9kdWxlcyIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjhbc2l6ZW9mKCJ0cmlzdGF0ZSIpXTsKICAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMjlbc2l6ZW9mKCJtZW51IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzMVtzaXplb2YoInNlbGVjdCIpXTsKICAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMzJbc2l6ZW9mKCJjb21tZW50IildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzNVtzaXplb2YoIm1lbnVjb25maWciKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjM2W3NpemVvZigic3RyaW5nIildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzN1tzaXplb2YoInZpc2libGUiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjQxW3NpemVvZigicHJvbXB0IildOwotICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI0MltzaXplb2YoImRlcGVuZHMiKV07Ci0gICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjQ0W3NpemVvZigiYm9vbCIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNDZbc2l6ZW9mKCJzZWxlY3QiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjMzW3NpemVvZigiZW52IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzNVtzaXplb2YoInJhbmdlIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHIzNltzaXplb2YoImNob2ljZSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyMzlbc2l6ZW9mKCJib29sIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI0MVtzaXplb2YoInNvdXJjZSIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNDJbc2l6ZW9mKCJ2aXNpYmxlIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI0M1tzaXplb2YoImhleCIpXTsKKyAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNDZbc2l6ZW9mKCJjb25maWciKV07CiAgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjQ3W3NpemVvZigiYm9vbGVhbiIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNDhbc2l6ZW9mKCJtYWlubWVudSIpXTsKLSAgICBjaGFyIGtjb25mX2lkX3N0cmluZ3Nfc3RyNTFbc2l6ZW9mKCJzb3VyY2UiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjUxW3NpemVvZigic3RyaW5nIildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI1NFtzaXplb2YoImhlbHAiKV07CisgICAgY2hhciBrY29uZl9pZF9zdHJpbmdzX3N0cjU2W3NpemVvZigicHJvbXB0IildOworICAgIGNoYXIga2NvbmZfaWRfc3RyaW5nc19zdHI3MltzaXplb2YoImRlcGVuZHMiKV07CiAgIH07Ci1zdGF0aWMgc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCBrY29uZl9pZF9zdHJpbmdzX2NvbnRlbnRzID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190IGtjb25mX2lkX3N0cmluZ3NfY29udGVudHMgPQogICB7Ci0gICAgIm9uIiwKLSAgICAiZW52IiwKLSAgICAiZW5kaWYiLAotICAgICJvcHRpb24iLAotICAgICJlbmRtZW51IiwKLSAgICAib3B0aW9uYWwiLAotICAgICJlbmRjaG9pY2UiLAotICAgICJyYW5nZSIsCi0gICAgImNob2ljZSIsCi0gICAgImRlZmF1bHQiLAotICAgICJkZWZfYm9vbCIsCi0gICAgImhlbHAiLAotICAgICJjb25maWciLAotICAgICJkZWZfdHJpc3RhdGUiLAotICAgICJoZXgiLAotICAgICJkZWZjb25maWdfbGlzdCIsCiAgICAgImlmIiwKICAgICAiaW50IiwKLSAgICAibW9kdWxlcyIsCisgICAgImVuZGlmIiwKKyAgICAiZGVmYXVsdCIsCiAgICAgInRyaXN0YXRlIiwKLSAgICAibWVudSIsCi0gICAgImNvbW1lbnQiLAotICAgICJtZW51Y29uZmlnIiwKLSAgICAic3RyaW5nIiwKLSAgICAidmlzaWJsZSIsCi0gICAgInByb21wdCIsCi0gICAgImRlcGVuZHMiLAotICAgICJib29sIiwKLSAgICAic2VsZWN0IiwKLSAgICAiYm9vbGVhbiIsCisgICAgImVuZGNob2ljZSIsCisgICAgImRlZl90cmlzdGF0ZSIsCisgICAgImRlZl9ib29sIiwKKyAgICAiZGVmY29uZmlnX2xpc3QiLAorICAgICJvbiIsCisgICAgIm9wdGlvbmFsIiwKKyAgICAib3B0aW9uIiwKKyAgICAiZW5kbWVudSIsCiAgICAgIm1haW5tZW51IiwKLSAgICAic291cmNlIgorICAgICJtZW51Y29uZmlnIiwKKyAgICAibW9kdWxlcyIsCisgICAgIm1lbnUiLAorICAgICJzZWxlY3QiLAorICAgICJjb21tZW50IiwKKyAgICAiZW52IiwKKyAgICAicmFuZ2UiLAorICAgICJjaG9pY2UiLAorICAgICJib29sIiwKKyAgICAic291cmNlIiwKKyAgICAidmlzaWJsZSIsCisgICAgImhleCIsCisgICAgImNvbmZpZyIsCisgICAgImJvb2xlYW4iLAorICAgICJzdHJpbmciLAorICAgICJoZWxwIiwKKyAgICAicHJvbXB0IiwKKyAgICAiZGVwZW5kcyIKICAgfTsKICNkZWZpbmUga2NvbmZfaWRfc3RyaW5ncyAoKGNvbnN0IGNoYXIgKikgJmtjb25mX2lkX3N0cmluZ3NfY29udGVudHMpCiAjaWZkZWYgX19HTlVDX18KIF9faW5saW5lCi0jaWZkZWYgX19HTlVDX1NURENfSU5MSU5FX18KKyNpZiBkZWZpbmVkIF9fR05VQ19TVERDX0lOTElORV9fIHx8IGRlZmluZWQgX19HTlVDX0dOVV9JTkxJTkVfXwogX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fKSkKICNlbmRpZgogI2VuZGlmCi1zdHJ1Y3Qga2NvbmZfaWQgKgorY29uc3Qgc3RydWN0IGtjb25mX2lkICoKIGtjb25mX2lkX2xvb2t1cCAocmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyLCByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGVuKQogewogICBlbnVtCkBAIC0xNzQsNTQgKzE3NCw5NCBAQAogICAgICAgTUlOX1dPUkRfTEVOR1RIID0gMiwKICAgICAgIE1BWF9XT1JEX0xFTkdUSCA9IDE0LAogICAgICAgTUlOX0hBU0hfVkFMVUUgPSAyLAotICAgICAgTUFYX0hBU0hfVkFMVUUgPSA1MQorICAgICAgTUFYX0hBU0hfVkFMVUUgPSA3MgogICAgIH07CiAKLSAgc3RhdGljIHN0cnVjdCBrY29uZl9pZCB3b3JkbGlzdFtdID0KKyAgc3RhdGljIGNvbnN0IHN0cnVjdCBrY29uZl9pZCB3b3JkbGlzdFtdID0KICAgICB7CiAgICAgICB7LTF9LCB7LTF9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIsCQlUX09OLAkJVEZfUEFSQU19LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjMsCQlUX09QVF9FTlYsCVRGX09QVElPTn0sCisjbGluZSAyNSAic2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmIgorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIsCQlUX0lGLAkJVEZfQ09NTUFORHxURl9QQVJBTX0sCisjbGluZSAzNiAic2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmIgorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjMsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX0lOVH0sCiAgICAgICB7LTF9LAorI2xpbmUgMjYgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKICAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI1LAkJVF9FTkRJRiwJVEZfQ09NTUFORH0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNiwJCVRfT1BUSU9OLAlURl9DT01NQU5EfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI3LAlUX0VORE1FTlUsCVRGX0NPTU1BTkR9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjgsCVRfT1BUSU9OQUwsCVRGX0NPTU1BTkR9LAorICAgICAgey0xfSwKKyNsaW5lIDI5ICJzY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYiCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNywJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX1VOS05PV059LAorI2xpbmUgMzEgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI4LAlUX1RZUEUsCQlURl9DT01NQU5ELCBTX1RSSVNUQVRFfSwKKyNsaW5lIDIwICJzY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYiCiAgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyOSwJVF9FTkRDSE9JQ0UsCVRGX0NPTU1BTkR9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjEwLAkJVF9SQU5HRSwJVEZfQ09NTUFORH0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTEsCQlUX0NIT0lDRSwJVEZfQ09NTUFORH0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMTIsCVRfREVGQVVMVCwJVEZfQ09NTUFORCwgU19VTktOT1dOfSwKKyAgICAgIHstMX0sIHstMX0sCisjbGluZSAzMiAic2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmIgorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjEyLAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfVFJJU1RBVEV9LAorI2xpbmUgMzUgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKICAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxMywJVF9ERUZBVUxULAlURl9DT01NQU5ELCBTX0JPT0xFQU59LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE0LAkJVF9IRUxQLAkJVEZfQ09NTUFORH0sCi0gICAgICB7LTF9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE2LAkJVF9DT05GSUcsCVRGX0NPTU1BTkR9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE3LAlUX0RFRkFVTFQsCVRGX0NPTU1BTkQsIFNfVFJJU1RBVEV9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE4LAkJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19IRVh9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE5LAlUX09QVF9ERUZDT05GSUdfTElTVCxURl9PUFRJT059LAorI2xpbmUgNDUgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxNCwJVF9PUFRfREVGQ09ORklHX0xJU1QsVEZfT1BUSU9OfSwKICAgICAgIHstMX0sIHstMX0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjIsCQlUX0lGLAkJVEZfQ09NTUFORHxURl9QQVJBTX0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjMsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX0lOVH0sCi0gICAgICB7LTF9LCB7LTF9LCB7LTF9LAorI2xpbmUgNDMgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIxNywJCVRfT04sCQlURl9QQVJBTX0sCisjbGluZSAyOCAic2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmIgorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjE4LAlUX09QVElPTkFMLAlURl9DT01NQU5EfSwKKyAgICAgIHstMX0sIHstMX0sCisjbGluZSA0MiAic2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmIgorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjIxLAkJVF9PUFRJT04sCVRGX0NPTU1BTkR9LAorI2xpbmUgMTcgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyMiwJVF9FTkRNRU5VLAlURl9DT01NQU5EfSwKKyNsaW5lIDE1ICJzY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYiCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjMsCVRfTUFJTk1FTlUsCVRGX0NPTU1BTkR9LAorICAgICAgey0xfSwKKyNsaW5lIDIzICJzY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYiCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMjUsCVRfTUVOVUNPTkZJRywJVEZfQ09NTUFORH0sCisgICAgICB7LTF9LAorI2xpbmUgNDQgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKICAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyNywJVF9PUFRfTU9EVUxFUywJVEZfT1BUSU9OfSwKLSAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyOCwJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19UUklTVEFURX0sCisgICAgICB7LTF9LAorI2xpbmUgMTYgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKICAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIyOSwJCVRfTUVOVSwJCVRGX0NPTU1BTkR9LAotICAgICAgey0xfSwgey0xfSwKKyAgICAgIHstMX0sCisjbGluZSAzOSAic2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmIgorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjMxLAkJVF9TRUxFQ1QsCVRGX0NPTU1BTkR9LAorI2xpbmUgMjEgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKICAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzMiwJVF9DT01NRU5ULAlURl9DT01NQU5EfSwKKyNsaW5lIDQ2ICJzY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYiCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzMsCQlUX09QVF9FTlYsCVRGX09QVElPTn0sCisgICAgICB7LTF9LAorI2xpbmUgNDAgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzNSwJCVRfUkFOR0UsCVRGX0NPTU1BTkR9LAorI2xpbmUgMTkgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzNiwJCVRfQ0hPSUNFLAlURl9DT01NQU5EfSwKICAgICAgIHstMX0sIHstMX0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzUsCVRfTUVOVUNPTkZJRywJVEZfQ09NTUFORH0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzYsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX1NUUklOR30sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyMzcsCVRfVklTSUJMRSwJVEZfQ09NTUFORH0sCi0gICAgICB7LTF9LCB7LTF9LCB7LTF9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjQxLAkJVF9QUk9NUFQsCVRGX0NPTU1BTkR9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjQyLAlUX0RFUEVORFMsCVRGX0NPTU1BTkR9LAorI2xpbmUgMzMgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHIzOSwJCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfQk9PTEVBTn0sCiAgICAgICB7LTF9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjQ0LAkJVF9UWVBFLAkJVEZfQ09NTUFORCwgU19CT09MRUFOfSwKLSAgICAgIHstMX0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNDYsCQlUX1NFTEVDVCwJVEZfQ09NTUFORH0sCisjbGluZSAxOCAic2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmIgorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjQxLAkJVF9TT1VSQ0UsCVRGX0NPTU1BTkR9LAorI2xpbmUgNDEgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI0MiwJVF9WSVNJQkxFLAlURl9DT01NQU5EfSwKKyNsaW5lIDM3ICJzY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYiCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNDMsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX0hFWH0sCisgICAgICB7LTF9LCB7LTF9LAorI2xpbmUgMjIgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI0NiwJCVRfQ09ORklHLAlURl9DT01NQU5EfSwKKyNsaW5lIDM0ICJzY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYiCiAgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNDcsCVRfVFlQRSwJCVRGX0NPTU1BTkQsIFNfQk9PTEVBTn0sCi0gICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNDgsCVRfTUFJTk1FTlUsCVRGX0NPTU1BTkR9LAorICAgICAgey0xfSwgey0xfSwgey0xfSwKKyNsaW5lIDM4ICJzY3JpcHRzL2tjb25maWcvemNvbmYuZ3BlcmYiCisgICAgICB7KGludCkobG9uZykmKChzdHJ1Y3Qga2NvbmZfaWRfc3RyaW5nc190ICopMCktPmtjb25mX2lkX3N0cmluZ3Nfc3RyNTEsCQlUX1RZUEUsCQlURl9DT01NQU5ELCBTX1NUUklOR30sCiAgICAgICB7LTF9LCB7LTF9LAotICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjUxLAkJVF9TT1VSQ0UsCVRGX0NPTU1BTkR9CisjbGluZSAyNCAic2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmIgorICAgICAgeyhpbnQpKGxvbmcpJigoc3RydWN0IGtjb25mX2lkX3N0cmluZ3NfdCAqKTApLT5rY29uZl9pZF9zdHJpbmdzX3N0cjU0LAkJVF9IRUxQLAkJVEZfQ09NTUFORH0sCisgICAgICB7LTF9LAorI2xpbmUgMzAgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI1NiwJCVRfUFJPTVBULAlURl9DT01NQU5EfSwKKyAgICAgIHstMX0sIHstMX0sIHstMX0sIHstMX0sIHstMX0sIHstMX0sIHstMX0sIHstMX0sIHstMX0sCisgICAgICB7LTF9LCB7LTF9LCB7LTF9LCB7LTF9LCB7LTF9LCB7LTF9LAorI2xpbmUgMjcgInNjcmlwdHMva2NvbmZpZy96Y29uZi5ncGVyZiIKKyAgICAgIHsoaW50KShsb25nKSYoKHN0cnVjdCBrY29uZl9pZF9zdHJpbmdzX3QgKikwKS0+a2NvbmZfaWRfc3RyaW5nc19zdHI3MiwJVF9ERVBFTkRTLAlURl9DT01NQU5EfQogICAgIH07CiAKICAgaWYgKGxlbiA8PSBNQVhfV09SRF9MRU5HVEggJiYgbGVuID49IE1JTl9XT1JEX0xFTkdUSCkKQEAgLTI0Miw0ICsyODIsNSBAQAogICAgIH0KICAgcmV0dXJuIDA7CiB9CisjbGluZSA0NyAic2NyaXB0cy9rY29uZmlnL3pjb25mLmdwZXJmIgogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYubCBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sCmluZGV4IGIyMmY4ODQuLmRkZWU1ZmMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sCkBAIC0xLDUgKzEsNSBAQAotJW9wdGlvbiBiYWNrdXAgbm9zdGRpbml0IG5veXl3cmFwIG5ldmVyLWludGVyYWN0aXZlIGZ1bGwgZWNzCi0lb3B0aW9uIDhiaXQgYmFja3VwIG5vZGVmYXVsdCBwZXJmLXJlcG9ydCBwZXJmLXJlcG9ydAorJW9wdGlvbiBub3N0ZGluaXQgbm95eXdyYXAgbmV2ZXItaW50ZXJhY3RpdmUgZnVsbCBlY3MKKyVvcHRpb24gOGJpdCBub2RlZmF1bHQgcGVyZi1yZXBvcnQgcGVyZi1yZXBvcnQKICVvcHRpb24gbm9pbnB1dAogJXggQ09NTUFORCBIRUxQIFNUUklORyBQQVJBTQogJXsKQEAgLTk2LDcgKzk2LDcgQEAKIAogPENPTU1BTkQ+ewogCXtufSsJewotCQlzdHJ1Y3Qga2NvbmZfaWQgKmlkID0ga2NvbmZfaWRfbG9va3VwKHl5dGV4dCwgeXlsZW5nKTsKKwkJY29uc3Qgc3RydWN0IGtjb25mX2lkICppZCA9IGtjb25mX2lkX2xvb2t1cCh5eXRleHQsIHl5bGVuZyk7CiAJCUJFR0lOKFBBUkFNKTsKIAkJY3VycmVudF9wb3MuZmlsZSA9IGN1cnJlbnRfZmlsZTsKIAkJY3VycmVudF9wb3MubGluZW5vID0gY3VycmVudF9maWxlLT5saW5lbm87CkBAIC0xMzIsNyArMTMyLDcgQEAKIAlcbglCRUdJTihJTklUSUFMKTsgY3VycmVudF9maWxlLT5saW5lbm8rKzsgcmV0dXJuIFRfRU9MOwogCS0tLQkvKiBpZ25vcmUgKi8KIAkoe259fFstLy5dKSsJewotCQlzdHJ1Y3Qga2NvbmZfaWQgKmlkID0ga2NvbmZfaWRfbG9va3VwKHl5dGV4dCwgeXlsZW5nKTsKKwkJY29uc3Qgc3RydWN0IGtjb25mX2lkICppZCA9IGtjb25mX2lkX2xvb2t1cCh5eXRleHQsIHl5bGVuZyk7CiAJCWlmIChpZCAmJiBpZC0+ZmxhZ3MgJiBURl9QQVJBTSkgewogCQkJemNvbmZsdmFsLmlkID0gaWQ7CiAJCQlyZXR1cm4gaWQtPnRva2VuOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLmxleC5jX3NoaXBwZWQgYi9zY3JpcHRzL2tjb25maWcvemNvbmYubGV4LmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDZjMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmxleC5jX3NoaXBwZWQKQEAgLTAsMCArMSwyNDIxIEBACisKKyNsaW5lIDMgInNjcmlwdHMva2NvbmZpZy96Y29uZi5sZXguY19zaGlwcGVkIgorCisjZGVmaW5lICBZWV9JTlRfQUxJR05FRCBzaG9ydCBpbnQKKworLyogQSBsZXhpY2FsIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IGZsZXggKi8KKworI2RlZmluZSB5eV9jcmVhdGVfYnVmZmVyIHpjb25mX2NyZWF0ZV9idWZmZXIKKyNkZWZpbmUgeXlfZGVsZXRlX2J1ZmZlciB6Y29uZl9kZWxldGVfYnVmZmVyCisjZGVmaW5lIHl5X2ZsZXhfZGVidWcgemNvbmZfZmxleF9kZWJ1ZworI2RlZmluZSB5eV9pbml0X2J1ZmZlciB6Y29uZl9pbml0X2J1ZmZlcgorI2RlZmluZSB5eV9mbHVzaF9idWZmZXIgemNvbmZfZmx1c2hfYnVmZmVyCisjZGVmaW5lIHl5X2xvYWRfYnVmZmVyX3N0YXRlIHpjb25mX2xvYWRfYnVmZmVyX3N0YXRlCisjZGVmaW5lIHl5X3N3aXRjaF90b19idWZmZXIgemNvbmZfc3dpdGNoX3RvX2J1ZmZlcgorI2RlZmluZSB5eWluIHpjb25maW4KKyNkZWZpbmUgeXlsZW5nIHpjb25mbGVuZworI2RlZmluZSB5eWxleCB6Y29uZmxleAorI2RlZmluZSB5eWxpbmVubyB6Y29uZmxpbmVubworI2RlZmluZSB5eW91dCB6Y29uZm91dAorI2RlZmluZSB5eXJlc3RhcnQgemNvbmZyZXN0YXJ0CisjZGVmaW5lIHl5dGV4dCB6Y29uZnRleHQKKyNkZWZpbmUgeXl3cmFwIHpjb25md3JhcAorI2RlZmluZSB5eWFsbG9jIHpjb25mYWxsb2MKKyNkZWZpbmUgeXlyZWFsbG9jIHpjb25mcmVhbGxvYworI2RlZmluZSB5eWZyZWUgemNvbmZmcmVlCisKKyNkZWZpbmUgRkxFWF9TQ0FOTkVSCisjZGVmaW5lIFlZX0ZMRVhfTUFKT1JfVkVSU0lPTiAyCisjZGVmaW5lIFlZX0ZMRVhfTUlOT1JfVkVSU0lPTiA1CisjZGVmaW5lIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiAzNQorI2lmIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiA+IDAKKyNkZWZpbmUgRkxFWF9CRVRBCisjZW5kaWYKKworLyogRmlyc3QsIHdlIGRlYWwgd2l0aCAgcGxhdGZvcm0tc3BlY2lmaWMgb3IgY29tcGlsZXItc3BlY2lmaWMgaXNzdWVzLiAqLworCisvKiBiZWdpbiBzdGFuZGFyZCBDIGhlYWRlcnMuICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBlbmQgc3RhbmRhcmQgQyBoZWFkZXJzLiAqLworCisvKiBmbGV4IGludGVnZXIgdHlwZSBkZWZpbml0aW9ucyAqLworCisjaWZuZGVmIEZMRVhJTlRfSAorI2RlZmluZSBGTEVYSU5UX0gKKworLyogQzk5IHN5c3RlbXMgaGF2ZSA8aW50dHlwZXMuaD4uIE5vbi1DOTkgc3lzdGVtcyBtYXkgb3IgbWF5IG5vdC4gKi8KKworI2lmIGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorCisvKiBDOTkgc2F5cyB0byBkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUyBiZWZvcmUgaW5jbHVkaW5nIHN0ZGludC5oLAorICogaWYgeW91IHdhbnQgdGhlIGxpbWl0IChtYXgvbWluKSBtYWNyb3MgZm9yIGludCB0eXBlcy4gCisgKi8KKyNpZm5kZWYgX19TVERDX0xJTUlUX01BQ1JPUworI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KK3R5cGVkZWYgaW50OF90IGZsZXhfaW50OF90OwordHlwZWRlZiB1aW50OF90IGZsZXhfdWludDhfdDsKK3R5cGVkZWYgaW50MTZfdCBmbGV4X2ludDE2X3Q7Cit0eXBlZGVmIHVpbnQxNl90IGZsZXhfdWludDE2X3Q7Cit0eXBlZGVmIGludDMyX3QgZmxleF9pbnQzMl90OwordHlwZWRlZiB1aW50MzJfdCBmbGV4X3VpbnQzMl90OworI2Vsc2UKK3R5cGVkZWYgc2lnbmVkIGNoYXIgZmxleF9pbnQ4X3Q7Cit0eXBlZGVmIHNob3J0IGludCBmbGV4X2ludDE2X3Q7Cit0eXBlZGVmIGludCBmbGV4X2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgZmxleF91aW50OF90OyAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGZsZXhfdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBmbGV4X3VpbnQzMl90OworI2VuZGlmIC8qICEgQzk5ICovCisKKy8qIExpbWl0cyBvZiBpbnRlZ3JhbCB0eXBlcy4gKi8KKyNpZm5kZWYgSU5UOF9NSU4KKyNkZWZpbmUgSU5UOF9NSU4gICAgICAgICAgICAgICAoLTEyOCkKKyNlbmRpZgorI2lmbmRlZiBJTlQxNl9NSU4KKyNkZWZpbmUgSU5UMTZfTUlOICAgICAgICAgICAgICAoLTMyNzY3LTEpCisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUlOCisjZGVmaW5lIElOVDMyX01JTiAgICAgICAgICAgICAgKC0yMTQ3NDgzNjQ3LTEpCisjZW5kaWYKKyNpZm5kZWYgSU5UOF9NQVgKKyNkZWZpbmUgSU5UOF9NQVggICAgICAgICAgICAgICAoMTI3KQorI2VuZGlmCisjaWZuZGVmIElOVDE2X01BWAorI2RlZmluZSBJTlQxNl9NQVggICAgICAgICAgICAgICgzMjc2NykKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UMzJfTUFYICAgICAgICAgICAgICAoMjE0NzQ4MzY0NykKKyNlbmRpZgorI2lmbmRlZiBVSU5UOF9NQVgKKyNkZWZpbmUgVUlOVDhfTUFYICAgICAgICAgICAgICAoMjU1VSkKKyNlbmRpZgorI2lmbmRlZiBVSU5UMTZfTUFYCisjZGVmaW5lIFVJTlQxNl9NQVggICAgICAgICAgICAgKDY1NTM1VSkKKyNlbmRpZgorI2lmbmRlZiBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlQzMl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVKQorI2VuZGlmCisKKyNlbmRpZiAvKiAhIEZMRVhJTlRfSCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKworLyogVGhlICJjb25zdCIgc3RvcmFnZS1jbGFzcy1tb2RpZmllciBpcyB2YWxpZC4gKi8KKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisKKyNlbHNlCS8qICEgX19jcGx1c3BsdXMgKi8KKworLyogQzk5IHJlcXVpcmVzIF9fU1REQ19fIHRvIGJlIGRlZmluZWQgYXMgMS4gKi8KKyNpZiBkZWZpbmVkIChfX1NURENfXykKKworI2RlZmluZSBZWV9VU0VfQ09OU1QKKworI2VuZGlmCS8qIGRlZmluZWQgKF9fU1REQ19fKSAqLworI2VuZGlmCS8qICEgX19jcGx1c3BsdXMgKi8KKworI2lmZGVmIFlZX1VTRV9DT05TVAorI2RlZmluZSB5eWNvbnN0IGNvbnN0CisjZWxzZQorI2RlZmluZSB5eWNvbnN0CisjZW5kaWYKKworLyogUmV0dXJuZWQgdXBvbiBlbmQtb2YtZmlsZS4gKi8KKyNkZWZpbmUgWVlfTlVMTCAwCisKKy8qIFByb21vdGVzIGEgcG9zc2libHkgbmVnYXRpdmUsIHBvc3NpYmx5IHNpZ25lZCBjaGFyIHRvIGFuIHVuc2lnbmVkCisgKiBpbnRlZ2VyIGZvciB1c2UgYXMgYW4gYXJyYXkgaW5kZXguICBJZiB0aGUgc2lnbmVkIGNoYXIgaXMgbmVnYXRpdmUsCisgKiB3ZSB3YW50IHRvIGluc3RlYWQgdHJlYXQgaXQgYXMgYW4gOC1iaXQgdW5zaWduZWQgY2hhciwgaGVuY2UgdGhlCisgKiBkb3VibGUgY2FzdC4KKyAqLworI2RlZmluZSBZWV9TQ19UT19VSShjKSAoKHVuc2lnbmVkIGludCkgKHVuc2lnbmVkIGNoYXIpIGMpCisKKy8qIEVudGVyIGEgc3RhcnQgY29uZGl0aW9uLiAgVGhpcyBtYWNybyByZWFsbHkgb3VnaHQgdG8gdGFrZSBhIHBhcmFtZXRlciwKKyAqIGJ1dCB3ZSBkbyBpdCB0aGUgZGlzZ3VzdGluZyBjcnVmdHkgd2F5IGZvcmNlZCBvbiB1cyBieSB0aGUgKCktbGVzcworICogZGVmaW5pdGlvbiBvZiBCRUdJTi4KKyAqLworI2RlZmluZSBCRUdJTiAoeXlfc3RhcnQpID0gMSArIDIgKgorCisvKiBUcmFuc2xhdGUgdGhlIGN1cnJlbnQgc3RhcnQgc3RhdGUgaW50byBhIHZhbHVlIHRoYXQgY2FuIGJlIGxhdGVyIGhhbmRlZAorICogdG8gQkVHSU4gdG8gcmV0dXJuIHRvIHRoZSBzdGF0ZS4gIFRoZSBZWVNUQVRFIGFsaWFzIGlzIGZvciBsZXgKKyAqIGNvbXBhdGliaWxpdHkuCisgKi8KKyNkZWZpbmUgWVlfU1RBUlQgKCgoeXlfc3RhcnQpIC0gMSkgLyAyKQorI2RlZmluZSBZWVNUQVRFIFlZX1NUQVJUCisKKy8qIEFjdGlvbiBudW1iZXIgZm9yIEVPRiBydWxlIG9mIGEgZ2l2ZW4gc3RhcnQgc3RhdGUuICovCisjZGVmaW5lIFlZX1NUQVRFX0VPRihzdGF0ZSkgKFlZX0VORF9PRl9CVUZGRVIgKyBzdGF0ZSArIDEpCisKKy8qIFNwZWNpYWwgYWN0aW9uIG1lYW5pbmcgInN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgZmlsZSIuICovCisjZGVmaW5lIFlZX05FV19GSUxFIHpjb25mcmVzdGFydCh6Y29uZmluICApCisKKyNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUl9DSEFSIDAKKworLyogU2l6ZSBvZiBkZWZhdWx0IGlucHV0IGJ1ZmZlci4gKi8KKyNpZm5kZWYgWVlfQlVGX1NJWkUKKyNkZWZpbmUgWVlfQlVGX1NJWkUgMTYzODQKKyNlbmRpZgorCisvKiBUaGUgc3RhdGUgYnVmIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb25lIHN0YXRlIHBlciBjaGFyYWN0ZXIgaW4gdGhlIG1haW4gYnVmZmVyLgorICovCisjZGVmaW5lIFlZX1NUQVRFX0JVRl9TSVpFICAgKChZWV9CVUZfU0laRSArIDIpICogc2l6ZW9mKHl5X3N0YXRlX3R5cGUpKQorCisjaWZuZGVmIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCisjZGVmaW5lIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCit0eXBlZGVmIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKllZX0JVRkZFUl9TVEFURTsKKyNlbmRpZgorCitleHRlcm4gaW50IHpjb25mbGVuZzsKKworZXh0ZXJuIEZJTEUgKnpjb25maW4sICp6Y29uZm91dDsKKworI2RlZmluZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU4gMAorI2RlZmluZSBFT0JfQUNUX0VORF9PRl9GSUxFIDEKKyNkZWZpbmUgRU9CX0FDVF9MQVNUX01BVENIIDIKKworICAgICNkZWZpbmUgWVlfTEVTU19MSU5FTk8obikKKyAgICAKKy8qIFJldHVybiBhbGwgYnV0IHRoZSBmaXJzdCAibiIgbWF0Y2hlZCBjaGFyYWN0ZXJzIGJhY2sgdG8gdGhlIGlucHV0IHN0cmVhbS4gKi8KKyNkZWZpbmUgeXlsZXNzKG4pIFwKKwlkbyBcCisJCXsgXAorCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQuICovIFwKKyAgICAgICAgaW50IHl5bGVzc19tYWNyb19hcmcgPSAobik7IFwKKyAgICAgICAgWVlfTEVTU19MSU5FTk8oeXlsZXNzX21hY3JvX2FyZyk7XAorCQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsgXAorCQlZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUIFwKKwkJKHl5X2NfYnVmX3ApID0geXlfY3AgPSB5eV9icCArIHl5bGVzc19tYWNyb19hcmcgLSBZWV9NT1JFX0FESjsgXAorCQlZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgemNvbmZ0ZXh0IGFnYWluICovIFwKKwkJfSBcCisJd2hpbGUgKCAwICkKKworI2RlZmluZSB1bnB1dChjKSB5eXVucHV0KCBjLCAoeXl0ZXh0X3B0cikgICkKKworI2lmbmRlZiBZWV9UWVBFREVGX1lZX1NJWkVfVAorI2RlZmluZSBZWV9UWVBFREVGX1lZX1NJWkVfVAordHlwZWRlZiBzaXplX3QgeXlfc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURQorI2RlZmluZSBZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFCitzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlCisJeworCUZJTEUgKnl5X2lucHV0X2ZpbGU7CisKKwljaGFyICp5eV9jaF9idWY7CQkvKiBpbnB1dCBidWZmZXIgKi8KKwljaGFyICp5eV9idWZfcG9zOwkJLyogY3VycmVudCBwb3NpdGlvbiBpbiBpbnB1dCBidWZmZXIgKi8KKworCS8qIFNpemUgb2YgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBub3QgaW5jbHVkaW5nIHJvb20gZm9yIEVPQgorCSAqIGNoYXJhY3RlcnMuCisJICovCisJeXlfc2l6ZV90IHl5X2J1Zl9zaXplOworCisJLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1Ziwgbm90IGluY2x1ZGluZyBFT0IKKwkgKiBjaGFyYWN0ZXJzLgorCSAqLworCWludCB5eV9uX2NoYXJzOworCisJLyogV2hldGhlciB3ZSAib3duIiB0aGUgYnVmZmVyIC0gaS5lLiwgd2Uga25vdyB3ZSBjcmVhdGVkIGl0LAorCSAqIGFuZCBjYW4gcmVhbGxvYygpIGl0IHRvIGdyb3cgaXQsIGFuZCBzaG91bGQgZnJlZSgpIGl0IHRvCisJICogZGVsZXRlIGl0LgorCSAqLworCWludCB5eV9pc19vdXJfYnVmZmVyOworCisJLyogV2hldGhlciB0aGlzIGlzIGFuICJpbnRlcmFjdGl2ZSIgaW5wdXQgc291cmNlOyBpZiBzbywgYW5kCisJICogaWYgd2UncmUgdXNpbmcgc3RkaW8gZm9yIGlucHV0LCB0aGVuIHdlIHdhbnQgdG8gdXNlIGdldGMoKQorCSAqIGluc3RlYWQgb2YgZnJlYWQoKSwgdG8gbWFrZSBzdXJlIHdlIHN0b3AgZmV0Y2hpbmcgaW5wdXQgYWZ0ZXIKKwkgKiBlYWNoIG5ld2xpbmUuCisJICovCisJaW50IHl5X2lzX2ludGVyYWN0aXZlOworCisJLyogV2hldGhlciB3ZSdyZSBjb25zaWRlcmVkIHRvIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgorCSAqIElmIHNvLCAnXicgcnVsZXMgd2lsbCBiZSBhY3RpdmUgb24gdGhlIG5leHQgbWF0Y2gsIG90aGVyd2lzZQorCSAqIG5vdC4KKwkgKi8KKwlpbnQgeXlfYXRfYm9sOworCisgICAgaW50IHl5X2JzX2xpbmVubzsgLyoqPCBUaGUgbGluZSBjb3VudC4gKi8KKyAgICBpbnQgeXlfYnNfY29sdW1uOyAvKio8IFRoZSBjb2x1bW4gY291bnQuICovCisgICAgCisJLyogV2hldGhlciB0byB0cnkgdG8gZmlsbCB0aGUgaW5wdXQgYnVmZmVyIHdoZW4gd2UgcmVhY2ggdGhlCisJICogZW5kIG9mIGl0LgorCSAqLworCWludCB5eV9maWxsX2J1ZmZlcjsKKworCWludCB5eV9idWZmZXJfc3RhdHVzOworCisjZGVmaW5lIFlZX0JVRkZFUl9ORVcgMAorI2RlZmluZSBZWV9CVUZGRVJfTk9STUFMIDEKKwkvKiBXaGVuIGFuIEVPRidzIGJlZW4gc2VlbiBidXQgdGhlcmUncyBzdGlsbCBzb21lIHRleHQgdG8gcHJvY2VzcworCSAqIHRoZW4gd2UgbWFyayB0aGUgYnVmZmVyIGFzIFlZX0VPRl9QRU5ESU5HLCB0byBpbmRpY2F0ZSB0aGF0IHdlCisJICogc2hvdWxkbid0IHRyeSByZWFkaW5nIGZyb20gdGhlIGlucHV0IHNvdXJjZSBhbnkgbW9yZS4gIFdlIG1pZ2h0CisJICogc3RpbGwgaGF2ZSBhIGJ1bmNoIG9mIHRva2VucyB0byBtYXRjaCwgdGhvdWdoLCBiZWNhdXNlIG9mCisJICogcG9zc2libGUgYmFja2luZy11cC4KKwkgKgorCSAqIFdoZW4gd2UgYWN0dWFsbHkgc2VlIHRoZSBFT0YsIHdlIGNoYW5nZSB0aGUgc3RhdHVzIHRvICJuZXciCisJICogKHZpYSB6Y29uZnJlc3RhcnQoKSksIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNvbnRpbnVlIHNjYW5uaW5nIGJ5CisJICoganVzdCBwb2ludGluZyB6Y29uZmluIGF0IGEgbmV3IGlucHV0IGZpbGUuCisJICovCisjZGVmaW5lIFlZX0JVRkZFUl9FT0ZfUEVORElORyAyCisKKwl9OworI2VuZGlmIC8qICFZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFICovCisKKy8qIFN0YWNrIG9mIGlucHV0IGJ1ZmZlcnMuICovCitzdGF0aWMgc2l6ZV90IHl5X2J1ZmZlcl9zdGFja190b3AgPSAwOyAvKio8IGluZGV4IG9mIHRvcCBvZiBzdGFjay4gKi8KK3N0YXRpYyBzaXplX3QgeXlfYnVmZmVyX3N0YWNrX21heCA9IDA7IC8qKjwgY2FwYWNpdHkgb2Ygc3RhY2suICovCitzdGF0aWMgWVlfQlVGRkVSX1NUQVRFICogeXlfYnVmZmVyX3N0YWNrID0gMDsgLyoqPCBTdGFjayBhcyBhbiBhcnJheS4gKi8KKworLyogV2UgcHJvdmlkZSBtYWNyb3MgZm9yIGFjY2Vzc2luZyBidWZmZXIgc3RhdGVzIGluIGNhc2UgaW4gdGhlCisgKiBmdXR1cmUgd2Ugd2FudCB0byBwdXQgdGhlIGJ1ZmZlciBzdGF0ZXMgaW4gYSBtb3JlIGdlbmVyYWwKKyAqICJzY2FubmVyIHN0YXRlIi4KKyAqCisgKiBSZXR1cm5zIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBvciBOVUxMLgorICovCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSICggKHl5X2J1ZmZlcl9zdGFjaykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh5eV9idWZmZXJfc3RhY2spWyh5eV9idWZmZXJfc3RhY2tfdG9wKV0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwpCisKKy8qIFNhbWUgYXMgcHJldmlvdXMgbWFjcm8sIGJ1dCB1c2VmdWwgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIGJ1ZmZlciBzdGFjayBpcyBub3QKKyAqIE5VTEwgb3Igd2hlbiB3ZSBuZWVkIGFuIGx2YWx1ZS4gRm9yIGludGVybmFsIHVzZSBvbmx5LgorICovCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSAoeXlfYnVmZmVyX3N0YWNrKVsoeXlfYnVmZmVyX3N0YWNrX3RvcCldCisKKy8qIHl5X2hvbGRfY2hhciBob2xkcyB0aGUgY2hhcmFjdGVyIGxvc3Qgd2hlbiB6Y29uZnRleHQgaXMgZm9ybWVkLiAqLworc3RhdGljIGNoYXIgeXlfaG9sZF9jaGFyOworc3RhdGljIGludCB5eV9uX2NoYXJzOwkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1ZiAqLworaW50IHpjb25mbGVuZzsKKworLyogUG9pbnRzIHRvIGN1cnJlbnQgY2hhcmFjdGVyIGluIGJ1ZmZlci4gKi8KK3N0YXRpYyBjaGFyICp5eV9jX2J1Zl9wID0gKGNoYXIgKikgMDsKK3N0YXRpYyBpbnQgeXlfaW5pdCA9IDA7CQkvKiB3aGV0aGVyIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSAqLworc3RhdGljIGludCB5eV9zdGFydCA9IDA7CS8qIHN0YXJ0IHN0YXRlIG51bWJlciAqLworCisvKiBGbGFnIHdoaWNoIGlzIHVzZWQgdG8gYWxsb3cgemNvbmZ3cmFwKCkncyB0byBkbyBidWZmZXIgc3dpdGNoZXMKKyAqIGluc3RlYWQgb2Ygc2V0dGluZyB1cCBhIGZyZXNoIHpjb25maW4uICBBIGJpdCBvZiBhIGhhY2sgLi4uCisgKi8KK3N0YXRpYyBpbnQgeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mOworCit2b2lkIHpjb25mcmVzdGFydCAoRklMRSAqaW5wdXRfZmlsZSAgKTsKK3ZvaWQgemNvbmZfc3dpdGNoX3RvX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgICk7CitZWV9CVUZGRVJfU1RBVEUgemNvbmZfY3JlYXRlX2J1ZmZlciAoRklMRSAqZmlsZSxpbnQgc2l6ZSAgKTsKK3ZvaWQgemNvbmZfZGVsZXRlX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIgICk7Cit2b2lkIHpjb25mX2ZsdXNoX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIgICk7Cit2b2lkIHpjb25mcHVzaF9idWZmZXJfc3RhdGUgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICApOwordm9pZCB6Y29uZnBvcF9idWZmZXJfc3RhdGUgKHZvaWQgKTsKKworc3RhdGljIHZvaWQgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICh2b2lkICk7CitzdGF0aWMgdm9pZCB6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSAodm9pZCApOworc3RhdGljIHZvaWQgemNvbmZfaW5pdF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiLEZJTEUgKmZpbGUgICk7CisKKyNkZWZpbmUgWVlfRkxVU0hfQlVGRkVSIHpjb25mX2ZsdXNoX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiApCisKK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX2J1ZmZlciAoY2hhciAqYmFzZSx5eV9zaXplX3Qgc2l6ZSAgKTsKK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX3N0cmluZyAoeXljb25zdCBjaGFyICp5eV9zdHIgICk7CitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9ieXRlcyAoeXljb25zdCBjaGFyICpieXRlcyxpbnQgbGVuICApOworCit2b2lkICp6Y29uZmFsbG9jICh5eV9zaXplX3QgICk7Cit2b2lkICp6Y29uZnJlYWxsb2MgKHZvaWQgKix5eV9zaXplX3QgICk7Cit2b2lkIHpjb25mZnJlZSAodm9pZCAqICApOworCisjZGVmaW5lIHl5X25ld19idWZmZXIgemNvbmZfY3JlYXRlX2J1ZmZlcgorCisjZGVmaW5lIHl5X3NldF9pbnRlcmFjdGl2ZShpc19pbnRlcmFjdGl2ZSkgXAorCXsgXAorCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApeyBcCisgICAgICAgIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsgXAorCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSAgICBcCisgICAgICAgICAgICB6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUgKTsgXAorCX0gXAorCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaXNfaW50ZXJhY3RpdmUgPSBpc19pbnRlcmFjdGl2ZTsgXAorCX0KKworI2RlZmluZSB5eV9zZXRfYm9sKGF0X2JvbCkgXAorCXsgXAorCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApe1wKKyAgICAgICAgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOyBcCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9ICAgIFwKKyAgICAgICAgICAgIHpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSApOyBcCisJfSBcCisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9hdF9ib2wgPSBhdF9ib2w7IFwKKwl9CisKKyNkZWZpbmUgWVlfQVRfQk9MKCkgKFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sKQorCisvKiBCZWdpbiB1c2VyIHNlY3QzICovCisKKyNkZWZpbmUgemNvbmZ3cmFwKG4pIDEKKyNkZWZpbmUgWVlfU0tJUF9ZWVdSQVAKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFlZX0NIQVI7CisKK0ZJTEUgKnpjb25maW4gPSAoRklMRSAqKSAwLCAqemNvbmZvdXQgPSAoRklMRSAqKSAwOworCit0eXBlZGVmIGludCB5eV9zdGF0ZV90eXBlOworCitleHRlcm4gaW50IHpjb25mbGluZW5vOworCitpbnQgemNvbmZsaW5lbm8gPSAxOworCitleHRlcm4gY2hhciAqemNvbmZ0ZXh0OworI2RlZmluZSB5eXRleHRfcHRyIHpjb25mdGV4dAorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X254dFtdWzE3XSA9CisgICAgeworICAgIHsKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTIsICAgMTIsICAgMTUsICAgMTIsICAgMTIsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDEyLCAgIDEyLCAgIDE1LCAgIDEyLCAgIDEyLCAgIDEyLAorICAgICAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAxNiwgICAxNiwgICAxNywgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwKKyAgICAgICAxNiwgICAxNiwgICAxNiwgICAxOCwgICAxNiwgICAxNiwgICAxNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTYsICAgMTYsICAgMTcsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsCisgICAgICAgMTYsICAgMTYsICAgMTYsICAgMTgsICAgMTYsICAgMTYsICAgMTYKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTksICAgMjAsICAgMjEsICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksCisgICAgICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTkKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDE5LCAgIDIwLCAgIDIxLCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LAorICAgICAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAyMiwgICAyMiwgICAyMywgICAyMiwgICAyNCwgICAyMiwgICAyMiwgICAyNCwgICAyMiwKKyAgICAgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyNSwgICAyMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMjIsICAgMjIsICAgMjMsICAgMjIsICAgMjQsICAgMjIsICAgMjIsICAgMjQsICAgMjIsCisgICAgICAgMjIsICAgMjIsICAgMjIsICAgMjIsICAgMjIsICAgMjUsICAgMjIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDI2LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDI5LCAgIDMyLAorICAgICAgIDMzLCAgIDM0LCAgIDM1LCAgIDM1LCAgIDM2LCAgIDM3LCAgIDM4CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDI2LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDI5LCAgIDMyLAorICAgICAgIDMzLCAgIDM0LCAgIDM1LCAgIDM1LCAgIDM2LCAgIDM3LCAgIDM4CisgICAgfSwKKworICAgIHsKKyAgICAgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwKKyAgICAgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsCisgICAgICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTEzLCAgIDM5LCAgIDQwLCAgLTEzLCAgLTEzLCAgIDQxLCAgLTEzLCAgLTEzLCAgLTEzLAorICAgICAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwKKyAgICAgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0MiwgICA0MiwgICA0MywgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwKKyAgICAgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsCisgICAgICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LAorICAgICAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwKKyAgICAgIC0xOCwgIC0xOCwgIC0xOCwgICA0NCwgIC0xOCwgIC0xOCwgIC0xOAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDUsICAgNDUsICAtMTksICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsCisgICAgICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjAsICAgNDYsICAgNDcsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsCisgICAgICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQ4LCAgLTIxLCAgLTIxLCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LAorICAgICAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0OSwgICA0OSwgICA1MCwgICA0OSwgIC0yMiwgICA0OSwgICA0OSwgIC0yMiwgICA0OSwKKyAgICAgICA0OSwgICA0OSwgICA0OSwgICA0OSwgICA0OSwgIC0yMiwgICA0OQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsCisgICAgICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LAorICAgICAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDUxLCAgIDUxLCAgIDUyLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLAorICAgICAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwKKyAgICAgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsCisgICAgICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LAorICAgICAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgIDUzLCAgLTI4LCAgLTI4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwKKyAgICAgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA1NCwgICA1NCwgIC0zMCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwKKyAgICAgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAgNTUsICAtMzEsICAtMzEsCisgICAgICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLAorICAgICAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywKKyAgICAgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsCisgICAgICAtMzQsICAgNTYsICAgNTcsICAgNTcsICAtMzQsICAtMzQsICAtMzQKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsCisgICAgICAtMzUsICAgNTcsICAgNTcsICAgNTcsICAtMzUsICAtMzUsICAtMzUKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LAorICAgICAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zNywgIC0zNywgICA1OCwgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywKKyAgICAgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsCisgICAgICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAgNTkKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM5LCAgIDM5LCAgIDQwLCAgLTM5LCAgLTM5LCAgIDQxLCAgLTM5LCAgLTM5LCAgLTM5LAorICAgICAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLAorICAgICAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0MiwgICA0MiwgICA0MywgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwKKyAgICAgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDIsICAgNDIsICAgNDMsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsCisgICAgICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLAorICAgICAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwKKyAgICAgIC00NCwgIC00NCwgIC00NCwgICA0NCwgIC00NCwgIC00NCwgIC00NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0NSwgICA0NSwgIC00NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwKKyAgICAgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDYsICAgNDYsICAgNDcsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsCisgICAgICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQ4LCAgLTQ3LCAgLTQ3LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LAorICAgICAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwKKyAgICAgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDksICAgNDksICAgNTAsICAgNDksICAtNDksICAgNDksICAgNDksICAtNDksICAgNDksCisgICAgICAgNDksICAgNDksICAgNDksICAgNDksICAgNDksICAtNDksICAgNDkKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsCisgICAgICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTUxLCAgLTUxLCAgIDUyLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLAorICAgICAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwKKyAgICAgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsCisgICAgICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDU0LCAgIDU0LCAgLTU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LAorICAgICAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LAorICAgICAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwKKyAgICAgIC01NiwgICA2MCwgICA1NywgICA1NywgIC01NiwgIC01NiwgIC01NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsCisgICAgICAtNTcsICAgNTcsICAgNTcsICAgNTcsICAtNTcsICAtNTcsICAtNTcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LAorICAgICAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwKKyAgICAgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwKKyAgICAgIC02MCwgICA1NywgICA1NywgICA1NywgIC02MCwgIC02MCwgIC02MAorICAgIH0sCisKKyAgICB9IDsKKworc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh2b2lkICk7CitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zICh5eV9zdGF0ZV90eXBlIGN1cnJlbnRfc3RhdGUgICk7CitzdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlciAodm9pZCApOworc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IgKHl5Y29uc3QgY2hhciBtc2dbXSAgKTsKKworLyogRG9uZSBhZnRlciB0aGUgY3VycmVudCBwYXR0ZXJuIGhhcyBiZWVuIG1hdGNoZWQgYW5kIGJlZm9yZSB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgYWN0aW9uIC0gc2V0cyB1cCB6Y29uZnRleHQuCisgKi8KKyNkZWZpbmUgWVlfRE9fQkVGT1JFX0FDVElPTiBcCisJKHl5dGV4dF9wdHIpID0geXlfYnA7IFwKKwl6Y29uZmxlbmcgPSAoc2l6ZV90KSAoeXlfY3AgLSB5eV9icCk7IFwKKwkoeXlfaG9sZF9jaGFyKSA9ICp5eV9jcDsgXAorCSp5eV9jcCA9ICdcMCc7IFwKKwkoeXlfY19idWZfcCkgPSB5eV9jcDsKKworI2RlZmluZSBZWV9OVU1fUlVMRVMgMzMKKyNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUiAzNAorLyogVGhpcyBzdHJ1Y3QgaXMgbm90IHVzZWQgaW4gdGhpcyBzY2FubmVyLAorICAgYnV0IGl0cyBwcmVzZW5jZSBpcyBuZWNlc3NhcnkuICovCitzdHJ1Y3QgeXlfdHJhbnNfaW5mbworCXsKKwlmbGV4X2ludDMyX3QgeXlfdmVyaWZ5OworCWZsZXhfaW50MzJfdCB5eV9ueHQ7CisJfTsKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9hY2NlcHRbNjFdID0KKyAgICB7ICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAzNCwgICAgNSwgICAgNCwgICAgMiwgICAgMywgICAgNywgICAgOCwgICAgNiwgICAzMiwgICAyOSwKKyAgICAgICAzMSwgICAyNCwgICAyOCwgICAyNywgICAyNiwgICAyMiwgICAxNywgICAxMywgICAxNiwgICAyMCwKKyAgICAgICAyMiwgICAxMSwgICAxMiwgICAxOSwgICAxOSwgICAxNCwgICAyMiwgICAyMiwgICAgNCwgICAgMiwKKyAgICAgICAgMywgICAgMywgICAgMSwgICAgNiwgICAzMiwgICAyOSwgICAzMSwgICAzMCwgICAyNCwgICAyMywKKyAgICAgICAyNiwgICAyNSwgICAxNSwgICAyMCwgICAgOSwgICAxOSwgICAxOSwgICAyMSwgICAxMCwgICAxOAorICAgIH0gOworCitzdGF0aWMgeXljb25zdCBmbGV4X2ludDMyX3QgeXlfZWNbMjU2XSA9CisgICAgeyAgIDAsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDIsICAgIDMsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDIsICAgIDQsICAgIDUsICAgIDYsICAgIDEsICAgIDEsICAgIDcsICAgIDgsICAgIDksCisgICAgICAgMTAsICAgIDEsICAgIDEsICAgIDEsICAgMTEsICAgMTIsICAgMTIsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgMTQsICAgIDEsICAgIDEsICAgIDEsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgIDEsICAgMTUsICAgIDEsICAgIDEsICAgMTMsICAgIDEsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAgMSwgICAxNiwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKworICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxCisgICAgfSA7CisKK2V4dGVybiBpbnQgemNvbmZfZmxleF9kZWJ1ZzsKK2ludCB6Y29uZl9mbGV4X2RlYnVnID0gMDsKKworLyogVGhlIGludGVudCBiZWhpbmQgdGhpcyBkZWZpbml0aW9uIGlzIHRoYXQgaXQnbGwgY2F0Y2gKKyAqIGFueSB1c2VzIG9mIFJFSkVDVCB3aGljaCBmbGV4IG1pc3NlZC4KKyAqLworI2RlZmluZSBSRUpFQ1QgcmVqZWN0X3VzZWRfYnV0X25vdF9kZXRlY3RlZAorI2RlZmluZSB5eW1vcmUoKSB5eW1vcmVfdXNlZF9idXRfbm90X2RldGVjdGVkCisjZGVmaW5lIFlZX01PUkVfQURKIDAKKyNkZWZpbmUgWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVAorY2hhciAqemNvbmZ0ZXh0OworI2RlZmluZSBZWV9OT19JTlBVVCAxCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworI2RlZmluZSBTVEFSVF9TVFJTSVpFCTE2CisKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBmaWxlICpmaWxlOworCWludCBsaW5lbm87Cit9IGN1cnJlbnRfcG9zOworCitzdGF0aWMgY2hhciAqdGV4dDsKK3N0YXRpYyBpbnQgdGV4dF9zaXplLCB0ZXh0X2FzaXplOworCitzdHJ1Y3QgYnVmZmVyIHsKKyAgICAgICAgc3RydWN0IGJ1ZmZlciAqcGFyZW50OworICAgICAgICBZWV9CVUZGRVJfU1RBVEUgc3RhdGU7Cit9OworCitzdHJ1Y3QgYnVmZmVyICpjdXJyZW50X2J1ZjsKKworc3RhdGljIGludCBsYXN0X3RzLCBmaXJzdF90czsKKworc3RhdGljIHZvaWQgemNvbmZfZW5kaGVscCh2b2lkKTsKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGZpbGUodm9pZCk7CisKK3N0YXRpYyB2b2lkIG5ld19zdHJpbmcodm9pZCkKK3sKKwl0ZXh0ID0gbWFsbG9jKFNUQVJUX1NUUlNJWkUpOworCXRleHRfYXNpemUgPSBTVEFSVF9TVFJTSVpFOworCXRleHRfc2l6ZSA9IDA7CisJKnRleHQgPSAwOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNpemUpCit7CisJaW50IG5ld19zaXplID0gdGV4dF9zaXplICsgc2l6ZSArIDE7CisJaWYgKG5ld19zaXplID4gdGV4dF9hc2l6ZSkgeworCQluZXdfc2l6ZSArPSBTVEFSVF9TVFJTSVpFIC0gMTsKKwkJbmV3X3NpemUgJj0gLVNUQVJUX1NUUlNJWkU7CisJCXRleHQgPSByZWFsbG9jKHRleHQsIG5ld19zaXplKTsKKwkJdGV4dF9hc2l6ZSA9IG5ld19zaXplOworCX0KKwltZW1jcHkodGV4dCArIHRleHRfc2l6ZSwgc3RyLCBzaXplKTsKKwl0ZXh0X3NpemUgKz0gc2l6ZTsKKwl0ZXh0W3RleHRfc2l6ZV0gPSAwOworfQorCitzdGF0aWMgdm9pZCBhbGxvY19zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwl0ZXh0ID0gbWFsbG9jKHNpemUgKyAxKTsKKwltZW1jcHkodGV4dCwgc3RyLCBzaXplKTsKKwl0ZXh0W3NpemVdID0gMDsKK30KKworI2RlZmluZSBJTklUSUFMIDAKKyNkZWZpbmUgQ09NTUFORCAxCisjZGVmaW5lIEhFTFAgMgorI2RlZmluZSBTVFJJTkcgMworI2RlZmluZSBQQVJBTSA0CisKKyNpZm5kZWYgWVlfTk9fVU5JU1REX0gKKy8qIFNwZWNpYWwgY2FzZSBmb3IgInVuaXN0ZC5oIiwgc2luY2UgaXQgaXMgbm9uLUFOU0kuIFdlIGluY2x1ZGUgaXQgd2F5CisgKiBkb3duIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoZSB1c2VyJ3Mgc2VjdGlvbiAxIHRvIGhhdmUgYmVlbiBzY2FubmVkIGZpcnN0LgorICogVGhlIHVzZXIgaGFzIGEgY2hhbmNlIHRvIG92ZXJyaWRlIGl0IHdpdGggYW4gb3B0aW9uLgorICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmbmRlZiBZWV9FWFRSQV9UWVBFCisjZGVmaW5lIFlZX0VYVFJBX1RZUEUgdm9pZCAqCisjZW5kaWYKKworc3RhdGljIGludCB5eV9pbml0X2dsb2JhbHMgKHZvaWQgKTsKKworLyogQWNjZXNzb3IgbWV0aG9kcyB0byBnbG9iYWxzLgorICAgVGhlc2UgYXJlIG1hZGUgdmlzaWJsZSB0byBub24tcmVlbnRyYW50IHNjYW5uZXJzIGZvciBjb252ZW5pZW5jZS4gKi8KKworaW50IHpjb25mbGV4X2Rlc3Ryb3kgKHZvaWQgKTsKKworaW50IHpjb25mZ2V0X2RlYnVnICh2b2lkICk7CisKK3ZvaWQgemNvbmZzZXRfZGVidWcgKGludCBkZWJ1Z19mbGFnICApOworCitZWV9FWFRSQV9UWVBFIHpjb25mZ2V0X2V4dHJhICh2b2lkICk7CisKK3ZvaWQgemNvbmZzZXRfZXh0cmEgKFlZX0VYVFJBX1RZUEUgdXNlcl9kZWZpbmVkICApOworCitGSUxFICp6Y29uZmdldF9pbiAodm9pZCApOworCit2b2lkIHpjb25mc2V0X2luICAoRklMRSAqIGluX3N0ciAgKTsKKworRklMRSAqemNvbmZnZXRfb3V0ICh2b2lkICk7CisKK3ZvaWQgemNvbmZzZXRfb3V0ICAoRklMRSAqIG91dF9zdHIgICk7CisKK2ludCB6Y29uZmdldF9sZW5nICh2b2lkICk7CisKK2NoYXIgKnpjb25mZ2V0X3RleHQgKHZvaWQgKTsKKworaW50IHpjb25mZ2V0X2xpbmVubyAodm9pZCApOworCit2b2lkIHpjb25mc2V0X2xpbmVubyAoaW50IGxpbmVfbnVtYmVyICApOworCisvKiBNYWNyb3MgYWZ0ZXIgdGhpcyBwb2ludCBjYW4gYWxsIGJlIG92ZXJyaWRkZW4gYnkgdXNlciBkZWZpbml0aW9ucyBpbgorICogc2VjdGlvbiAxLgorICovCisKKyNpZm5kZWYgWVlfU0tJUF9ZWVdSQVAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBpbnQgemNvbmZ3cmFwICh2b2lkICk7CisjZWxzZQorZXh0ZXJuIGludCB6Y29uZndyYXAgKHZvaWQgKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICBzdGF0aWMgdm9pZCB5eXVucHV0IChpbnQgYyxjaGFyICpidWZfcHRyICApOworICAgIAorI2lmbmRlZiB5eXRleHRfcHRyCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgKGNoYXIgKix5eWNvbnN0IGNoYXIgKixpbnQgKTsKKyNlbmRpZgorCisjaWZkZWYgWVlfTkVFRF9TVFJMRU4KK3N0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4gKHl5Y29uc3QgY2hhciAqICk7CisjZW5kaWYKKworI2lmbmRlZiBZWV9OT19JTlBVVAorCisjaWZkZWYgX19jcGx1c3BsdXMKK3N0YXRpYyBpbnQgeXlpbnB1dCAodm9pZCApOworI2Vsc2UKK3N0YXRpYyBpbnQgaW5wdXQgKHZvaWQgKTsKKyNlbmRpZgorCisjZW5kaWYKKworLyogQW1vdW50IG9mIHN0dWZmIHRvIHNsdXJwIHVwIHdpdGggZWFjaCByZWFkLiAqLworI2lmbmRlZiBZWV9SRUFEX0JVRl9TSVpFCisjZGVmaW5lIFlZX1JFQURfQlVGX1NJWkUgODE5MgorI2VuZGlmCisKKy8qIENvcHkgd2hhdGV2ZXIgdGhlIGxhc3QgcnVsZSBtYXRjaGVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuICovCisjaWZuZGVmIEVDSE8KKy8qIFRoaXMgdXNlZCB0byBiZSBhbiBmcHV0cygpLCBidXQgc2luY2UgdGhlIHN0cmluZyBtaWdodCBjb250YWluIE5VTCdzLAorICogd2Ugbm93IHVzZSBmd3JpdGUoKS4KKyAqLworI2RlZmluZSBFQ0hPIGRvIHsgaWYgKGZ3cml0ZSggemNvbmZ0ZXh0LCB6Y29uZmxlbmcsIDEsIHpjb25mb3V0ICkpIHt9IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogR2V0cyBpbnB1dCBhbmQgc3R1ZmZzIGl0IGludG8gImJ1ZiIuICBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciBZWV9OVUxMLAorICogaXMgcmV0dXJuZWQgaW4gInJlc3VsdCIuCisgKi8KKyNpZm5kZWYgWVlfSU5QVVQKKyNkZWZpbmUgWVlfSU5QVVQoYnVmLHJlc3VsdCxtYXhfc2l6ZSkgXAorCWVycm5vPTA7IFwKKwl3aGlsZSAoIChyZXN1bHQgPSByZWFkKCBmaWxlbm8oemNvbmZpbiksIChjaGFyICopIGJ1ZiwgbWF4X3NpemUgKSkgPCAwICkgXAorCXsgXAorCQlpZiggZXJybm8gIT0gRUlOVFIpIFwKKwkJeyBcCisJCQlZWV9GQVRBTF9FUlJPUiggImlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQiICk7IFwKKwkJCWJyZWFrOyBcCisJCX0gXAorCQllcnJubz0wOyBcCisJCWNsZWFyZXJyKHpjb25maW4pOyBcCisJfVwKK1wKKworI2VuZGlmCisKKy8qIE5vIHNlbWktY29sb24gYWZ0ZXIgcmV0dXJuOyBjb3JyZWN0IHVzYWdlIGlzIHRvIHdyaXRlICJ5eXRlcm1pbmF0ZSgpOyIgLQorICogd2UgZG9uJ3Qgd2FudCBhbiBleHRyYSAnOycgYWZ0ZXIgdGhlICJyZXR1cm4iIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlCisgKiBzb21lIGNvbXBpbGVycyB0byBjb21wbGFpbiBhYm91dCB1bnJlYWNoYWJsZSBzdGF0ZW1lbnRzLgorICovCisjaWZuZGVmIHl5dGVybWluYXRlCisjZGVmaW5lIHl5dGVybWluYXRlKCkgcmV0dXJuIFlZX05VTEwKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgZW50cmllcyBieSB3aGljaCBzdGFydC1jb25kaXRpb24gc3RhY2sgZ3Jvd3MuICovCisjaWZuZGVmIFlZX1NUQVJUX1NUQUNLX0lOQ1IKKyNkZWZpbmUgWVlfU1RBUlRfU1RBQ0tfSU5DUiAyNQorI2VuZGlmCisKKy8qIFJlcG9ydCBhIGZhdGFsIGVycm9yLiAqLworI2lmbmRlZiBZWV9GQVRBTF9FUlJPUgorI2RlZmluZSBZWV9GQVRBTF9FUlJPUihtc2cpIHl5X2ZhdGFsX2Vycm9yKCBtc2cgKQorI2VuZGlmCisKKy8qIGVuZCB0YWJsZXMgc2VyaWFsaXphdGlvbiBzdHJ1Y3R1cmVzIGFuZCBwcm90b3R5cGVzICovCisKKy8qIERlZmF1bHQgZGVjbGFyYXRpb24gb2YgZ2VuZXJhdGVkIHNjYW5uZXIgLSBhIGRlZmluZSBzbyB0aGUgdXNlciBjYW4KKyAqIGVhc2lseSBhZGQgcGFyYW1ldGVycy4KKyAqLworI2lmbmRlZiBZWV9ERUNMCisjZGVmaW5lIFlZX0RFQ0xfSVNfT1VSUyAxCisKK2V4dGVybiBpbnQgemNvbmZsZXggKHZvaWQpOworCisjZGVmaW5lIFlZX0RFQ0wgaW50IHpjb25mbGV4ICh2b2lkKQorI2VuZGlmIC8qICFZWV9ERUNMICovCisKKy8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bGUsIGFmdGVyIHpjb25mdGV4dCBhbmQgemNvbmZsZW5nCisgKiBoYXZlIGJlZW4gc2V0IHVwLgorICovCisjaWZuZGVmIFlZX1VTRVJfQUNUSU9OCisjZGVmaW5lIFlZX1VTRVJfQUNUSU9OCisjZW5kaWYKKworLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggcnVsZS4gKi8KKyNpZm5kZWYgWVlfQlJFQUsKKyNkZWZpbmUgWVlfQlJFQUsgYnJlYWs7CisjZW5kaWYKKworI2RlZmluZSBZWV9SVUxFX1NFVFVQIFwKKwlZWV9VU0VSX0FDVElPTgorCisvKiogVGhlIG1haW4gc2Nhbm5lciBmdW5jdGlvbiB3aGljaCBkb2VzIGFsbCB0aGUgd29yay4KKyAqLworWVlfREVDTAoreworCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKKwlyZWdpc3RlciBjaGFyICp5eV9jcCwgKnl5X2JwOworCXJlZ2lzdGVyIGludCB5eV9hY3Q7CisgICAgCisJaW50IHN0ciA9IDA7CisJaW50IHRzLCBpOworCisJaWYgKCAhKHl5X2luaXQpICkKKwkJeworCQkoeXlfaW5pdCkgPSAxOworCisjaWZkZWYgWVlfVVNFUl9JTklUCisJCVlZX1VTRVJfSU5JVDsKKyNlbmRpZgorCisJCWlmICggISAoeXlfc3RhcnQpICkKKwkJCSh5eV9zdGFydCkgPSAxOwkvKiBmaXJzdCBzdGFydCBzdGF0ZSAqLworCisJCWlmICggISB6Y29uZmluICkKKwkJCXpjb25maW4gPSBzdGRpbjsKKworCQlpZiAoICEgemNvbmZvdXQgKQorCQkJemNvbmZvdXQgPSBzdGRvdXQ7CisKKwkJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICkgeworCQkJemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0KKwkJCQl6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUgKTsKKwkJfQorCisJCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworCQl9CisKKwl3aGlsZSAoIDEgKQkJLyogbG9vcHMgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCAqLworCQl7CisJCXl5X2NwID0gKHl5X2NfYnVmX3ApOworCisJCS8qIFN1cHBvcnQgb2YgemNvbmZ0ZXh0LiAqLworCQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsKKworCQkvKiB5eV9icCBwb2ludHMgdG8gdGhlIHBvc2l0aW9uIGluIHl5X2NoX2J1ZiBvZiB0aGUgc3RhcnQgb2YKKwkJICogdGhlIGN1cnJlbnQgcnVuLgorCQkgKi8KKwkJeXlfYnAgPSB5eV9jcDsKKworCQl5eV9jdXJyZW50X3N0YXRlID0gKHl5X3N0YXJ0KTsKK3l5X21hdGNoOgorCQl3aGlsZSAoICh5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2N1cnJlbnRfc3RhdGVdWyB5eV9lY1tZWV9TQ19UT19VSSgqeXlfY3ApXSAgXSkgPiAwICkKKwkJCSsreXlfY3A7CisKKwkJeXlfY3VycmVudF9zdGF0ZSA9IC15eV9jdXJyZW50X3N0YXRlOworCit5eV9maW5kX2FjdGlvbjoKKwkJeXlfYWN0ID0geXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdOworCisJCVlZX0RPX0JFRk9SRV9BQ1RJT047CisKK2RvX2FjdGlvbjoJLyogVGhpcyBsYWJlbCBpcyB1c2VkIG9ubHkgdG8gYWNjZXNzIEVPRiBhY3Rpb25zLiAqLworCisJCXN3aXRjaCAoIHl5X2FjdCApCisJeyAvKiBiZWdpbm5pbmcgb2YgYWN0aW9uIHN3aXRjaCAqLworY2FzZSAxOgorLyogcnVsZSAxIGNhbiBtYXRjaCBlb2wgKi8KK2Nhc2UgMjoKKy8qIHJ1bGUgMiBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCit7CisJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwlyZXR1cm4gVF9FT0w7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMzoKK1lZX1JVTEVfU0VUVVAKKworCVlZX0JSRUFLCitjYXNlIDQ6CitZWV9SVUxFX1NFVFVQCit7CisJQkVHSU4oQ09NTUFORCk7Cit9CisJWVlfQlJFQUsKK2Nhc2UgNToKK1lZX1JVTEVfU0VUVVAKK3sKKwl1bnB1dCh6Y29uZnRleHRbMF0pOworCUJFR0lOKENPTU1BTkQpOworfQorCVlZX0JSRUFLCisKK2Nhc2UgNjoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJY29uc3Qgc3RydWN0IGtjb25mX2lkICppZCA9IGtjb25mX2lkX2xvb2t1cCh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJCUJFR0lOKFBBUkFNKTsKKwkJY3VycmVudF9wb3MuZmlsZSA9IGN1cnJlbnRfZmlsZTsKKwkJY3VycmVudF9wb3MubGluZW5vID0gY3VycmVudF9maWxlLT5saW5lbm87CisJCWlmIChpZCAmJiBpZC0+ZmxhZ3MgJiBURl9DT01NQU5EKSB7CisJCQl6Y29uZmx2YWwuaWQgPSBpZDsKKwkJCXJldHVybiBpZC0+dG9rZW47CisJCX0KKwkJYWxsb2Nfc3RyaW5nKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkQ7CisJfQorCVlZX0JSRUFLCitjYXNlIDc6CitZWV9SVUxFX1NFVFVQCisKKwlZWV9CUkVBSworY2FzZSA4OgorLyogcnVsZSA4IGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJQkVHSU4oSU5JVElBTCk7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCXJldHVybiBUX0VPTDsKKwl9CisJWVlfQlJFQUsKKworY2FzZSA5OgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfQU5EOworCVlZX0JSRUFLCitjYXNlIDEwOgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfT1I7CisJWVlfQlJFQUsKK2Nhc2UgMTE6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9PUEVOX1BBUkVOOworCVlZX0JSRUFLCitjYXNlIDEyOgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfQ0xPU0VfUEFSRU47CisJWVlfQlJFQUsKK2Nhc2UgMTM6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9OT1Q7CisJWVlfQlJFQUsKK2Nhc2UgMTQ6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9FUVVBTDsKKwlZWV9CUkVBSworY2FzZSAxNToKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX1VORVFVQUw7CisJWVlfQlJFQUsKK2Nhc2UgMTY6CitZWV9SVUxFX1NFVFVQCit7CisJCXN0ciA9IHpjb25mdGV4dFswXTsKKwkJbmV3X3N0cmluZygpOworCQlCRUdJTihTVFJJTkcpOworCX0KKwlZWV9CUkVBSworY2FzZSAxNzoKKy8qIHJ1bGUgMTcgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAorQkVHSU4oSU5JVElBTCk7IGN1cnJlbnRfZmlsZS0+bGluZW5vKys7IHJldHVybiBUX0VPTDsKKwlZWV9CUkVBSworY2FzZSAxODoKK1lZX1JVTEVfU0VUVVAKKy8qIGlnbm9yZSAqLworCVlZX0JSRUFLCitjYXNlIDE5OgorWVlfUlVMRV9TRVRVUAoreworCQljb25zdCBzdHJ1Y3Qga2NvbmZfaWQgKmlkID0ga2NvbmZfaWRfbG9va3VwKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJaWYgKGlkICYmIGlkLT5mbGFncyAmIFRGX1BBUkFNKSB7CisJCQl6Y29uZmx2YWwuaWQgPSBpZDsKKwkJCXJldHVybiBpZC0+dG9rZW47CisJCX0KKwkJYWxsb2Nfc3RyaW5nKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkQ7CisJfQorCVlZX0JSRUFLCitjYXNlIDIwOgorWVlfUlVMRV9TRVRVUAorLyogY29tbWVudCAqLworCVlZX0JSRUFLCitjYXNlIDIxOgorLyogcnVsZSAyMSBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCitjdXJyZW50X2ZpbGUtPmxpbmVubysrOworCVlZX0JSRUFLCitjYXNlIDIyOgorWVlfUlVMRV9TRVRVUAorCisJWVlfQlJFQUsKK2Nhc2UgWVlfU1RBVEVfRU9GKFBBUkFNKToKK3sKKwkJQkVHSU4oSU5JVElBTCk7CisJfQorCVlZX0JSRUFLCisKK2Nhc2UgMjM6CisvKiBydWxlIDIzIGNhbiBtYXRjaCBlb2wgKi8KKyp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOyAvKiB1bmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQgKi8KKyh5eV9jX2J1Zl9wKSA9IHl5X2NwIC09IDE7CitZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgemNvbmZ0ZXh0IGFnYWluICovCitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRF9RVU9URTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMjQ6CitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCX0KKwlZWV9CUkVBSworY2FzZSAyNToKKy8qIHJ1bGUgMjUgY2FuIG1hdGNoIGVvbCAqLworKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IC8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLworKHl5X2NfYnVmX3ApID0geXlfY3AgLT0gMTsKK1lZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQgKyAxLCB6Y29uZmxlbmcgLSAxKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkRfUVVPVEU7CisJfQorCVlZX0JSRUFLCitjYXNlIDI2OgorWVlfUlVMRV9TRVRVUAoreworCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCArIDEsIHpjb25mbGVuZyAtIDEpOworCX0KKwlZWV9CUkVBSworY2FzZSAyNzoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJaWYgKHN0ciA9PSB6Y29uZnRleHRbMF0pIHsKKwkJCUJFR0lOKFBBUkFNKTsKKwkJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQkJcmV0dXJuIFRfV09SRF9RVU9URTsKKwkJfSBlbHNlCisJCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCwgMSk7CisJfQorCVlZX0JSRUFLCitjYXNlIDI4OgorLyogcnVsZSAyOCBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCit7CisJCXByaW50ZigiJXM6JWQ6d2FybmluZzogbXVsdGktbGluZSBzdHJpbmdzIG5vdCBzdXBwb3J0ZWRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCQljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCQlCRUdJTihJTklUSUFMKTsKKwkJcmV0dXJuIFRfRU9MOworCX0KKwlZWV9CUkVBSworY2FzZSBZWV9TVEFURV9FT0YoU1RSSU5HKToKK3sKKwkJQkVHSU4oSU5JVElBTCk7CisJfQorCVlZX0JSRUFLCisKK2Nhc2UgMjk6CitZWV9SVUxFX1NFVFVQCit7CisJCXRzID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IHpjb25mbGVuZzsgaSsrKSB7CisJCQlpZiAoemNvbmZ0ZXh0W2ldID09ICdcdCcpCisJCQkJdHMgPSAodHMgJiB+NykgKyA4OworCQkJZWxzZQorCQkJCXRzKys7CisJCX0KKwkJbGFzdF90cyA9IHRzOworCQlpZiAoZmlyc3RfdHMpIHsKKwkJCWlmICh0cyA8IGZpcnN0X3RzKSB7CisJCQkJemNvbmZfZW5kaGVscCgpOworCQkJCXJldHVybiBUX0hFTFBURVhUOworCQkJfQorCQkJdHMgLT0gZmlyc3RfdHM7CisJCQl3aGlsZSAodHMgPiA4KSB7CisJCQkJYXBwZW5kX3N0cmluZygiICAgICAgICAiLCA4KTsKKwkJCQl0cyAtPSA4OworCQkJfQorCQkJYXBwZW5kX3N0cmluZygiICAgICAgICAiLCB0cyk7CisJCX0KKwl9CisJWVlfQlJFQUsKK2Nhc2UgMzA6CisvKiBydWxlIDMwIGNhbiBtYXRjaCBlb2wgKi8KKyp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOyAvKiB1bmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQgKi8KKyh5eV9jX2J1Zl9wKSA9IHl5X2NwIC09IDE7CitZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgemNvbmZ0ZXh0IGFnYWluICovCitZWV9SVUxFX1NFVFVQCit7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCXpjb25mX2VuZGhlbHAoKTsKKwkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJfQorCVlZX0JSRUFLCitjYXNlIDMxOgorLyogcnVsZSAzMSBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCit7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCWFwcGVuZF9zdHJpbmcoIlxuIiwgMSk7CisJfQorCVlZX0JSRUFLCitjYXNlIDMyOgorWVlfUlVMRV9TRVRVUAoreworCQl3aGlsZSAoemNvbmZsZW5nKSB7CisJCQlpZiAoKHpjb25mdGV4dFt6Y29uZmxlbmctMV0gIT0gJyAnKSAmJiAoemNvbmZ0ZXh0W3pjb25mbGVuZy0xXSAhPSAnXHQnKSkKKwkJCQlicmVhazsKKwkJCXpjb25mbGVuZy0tOworCQl9CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQlpZiAoIWZpcnN0X3RzKQorCQkJZmlyc3RfdHMgPSBsYXN0X3RzOworCX0KKwlZWV9CUkVBSworY2FzZSBZWV9TVEFURV9FT0YoSEVMUCk6Cit7CisJCXpjb25mX2VuZGhlbHAoKTsKKwkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJfQorCVlZX0JSRUFLCisKK2Nhc2UgWVlfU1RBVEVfRU9GKElOSVRJQUwpOgorY2FzZSBZWV9TVEFURV9FT0YoQ09NTUFORCk6Cit7CisJaWYgKGN1cnJlbnRfZmlsZSkgeworCQl6Y29uZl9lbmRmaWxlKCk7CisJCXJldHVybiBUX0VPTDsKKwl9CisJZmNsb3NlKHpjb25maW4pOworCXl5dGVybWluYXRlKCk7Cit9CisJWVlfQlJFQUsKK2Nhc2UgMzM6CitZWV9SVUxFX1NFVFVQCitZWV9GQVRBTF9FUlJPUiggImZsZXggc2Nhbm5lciBqYW1tZWQiICk7CisJWVlfQlJFQUsKKworCWNhc2UgWVlfRU5EX09GX0JVRkZFUjoKKwkJeworCQkvKiBBbW91bnQgb2YgdGV4dCBtYXRjaGVkIG5vdCBpbmNsdWRpbmcgdGhlIEVPQiBjaGFyLiAqLworCQlpbnQgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dCA9IChpbnQpICh5eV9jcCAtICh5eXRleHRfcHRyKSkgLSAxOworCisJCS8qIFVuZG8gdGhlIGVmZmVjdHMgb2YgWVlfRE9fQkVGT1JFX0FDVElPTi4gKi8KKwkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7CisJCVlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKKworCQlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfTkVXICkKKwkJCXsKKwkJCS8qIFdlJ3JlIHNjYW5uaW5nIGEgbmV3IGZpbGUgb3IgaW5wdXQgc291cmNlLiAgSXQncworCQkJICogcG9zc2libGUgdGhhdCB0aGlzIGhhcHBlbmVkIGJlY2F1c2UgdGhlIHVzZXIKKwkJCSAqIGp1c3QgcG9pbnRlZCB6Y29uZmluIGF0IGEgbmV3IHNvdXJjZSBhbmQgY2FsbGVkCisJCQkgKiB6Y29uZmxleCgpLiAgSWYgc28sIHRoZW4gd2UgaGF2ZSB0byBhc3N1cmUKKwkJCSAqIGNvbnNpc3RlbmN5IGJldHdlZW4gWVlfQ1VSUkVOVF9CVUZGRVIgYW5kIG91cgorCQkJICogZ2xvYmFscy4gIEhlcmUgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGRvIHNvLCBiZWNhdXNlCisJCQkgKiB0aGlzIGlzIHRoZSBmaXJzdCBhY3Rpb24gKG90aGVyIHRoYW4gcG9zc2libHkgYQorCQkJICogYmFjay11cCkgdGhhdCB3aWxsIG1hdGNoIGZvciB0aGUgbmV3IGlucHV0IHNvdXJjZS4KKwkJCSAqLworCQkJKHl5X25fY2hhcnMpID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pbnB1dF9maWxlID0gemNvbmZpbjsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9OT1JNQUw7CisJCQl9CisKKwkJLyogTm90ZSB0aGF0IGhlcmUgd2UgdGVzdCBmb3IgeXlfY19idWZfcCAiPD0iIHRvIHRoZSBwb3NpdGlvbgorCQkgKiBvZiB0aGUgZmlyc3QgRU9CIGluIHRoZSBidWZmZXIsIHNpbmNlIHl5X2NfYnVmX3Agd2lsbAorCQkgKiBhbHJlYWR5IGhhdmUgYmVlbiBpbmNyZW1lbnRlZCBwYXN0IHRoZSBOVUwgY2hhcmFjdGVyCisJCSAqIChzaW5jZSBhbGwgc3RhdGVzIG1ha2UgdHJhbnNpdGlvbnMgb24gRU9CIHRvIHRoZQorCQkgKiBlbmQtb2YtYnVmZmVyIHN0YXRlKS4gIENvbnRyYXN0IHRoaXMgd2l0aCB0aGUgdGVzdAorCQkgKiBpbiBpbnB1dCgpLgorCQkgKi8KKwkJaWYgKCAoeXlfY19idWZfcCkgPD0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV0gKQorCQkJeyAvKiBUaGlzIHdhcyByZWFsbHkgYSBOVUwuICovCisJCQl5eV9zdGF0ZV90eXBlIHl5X25leHRfc3RhdGU7CisKKwkJCSh5eV9jX2J1Zl9wKSA9ICh5eXRleHRfcHRyKSArIHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQ7CisKKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoICApOworCisJCQkvKiBPa2F5LCB3ZSdyZSBub3cgcG9zaXRpb25lZCB0byBtYWtlIHRoZSBOVUwKKwkJCSAqIHRyYW5zaXRpb24uICBXZSBjb3VsZG4ndCBoYXZlCisJCQkgKiB5eV9nZXRfcHJldmlvdXNfc3RhdGUoKSBnbyBhaGVhZCBhbmQgZG8gaXQKKwkJCSAqIGZvciB1cyBiZWNhdXNlIGl0IGRvZXNuJ3Qga25vdyBob3cgdG8gZGVhbAorCQkJICogd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YgamFtbWluZyAoYW5kIHdlIGRvbid0CisJCQkgKiB3YW50IHRvIGJ1aWxkIGphbW1pbmcgaW50byBpdCBiZWNhdXNlIHRoZW4gaXQKKwkJCSAqIHdpbGwgcnVuIG1vcmUgc2xvd2x5KS4KKwkJCSAqLworCisJCQl5eV9uZXh0X3N0YXRlID0geXlfdHJ5X05VTF90cmFucyggeXlfY3VycmVudF9zdGF0ZSApOworCisJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCisJCQlpZiAoIHl5X25leHRfc3RhdGUgKQorCQkJCXsKKwkJCQkvKiBDb25zdW1lIHRoZSBOVUwuICovCisJCQkJeXlfY3AgPSArKyh5eV9jX2J1Zl9wKTsKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbmV4dF9zdGF0ZTsKKwkJCQlnb3RvIHl5X21hdGNoOworCQkJCX0KKworCQkJZWxzZQorCQkJCXsKKwkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKwkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCQkJCX0KKwkJCX0KKworCQllbHNlIHN3aXRjaCAoIHl5X2dldF9uZXh0X2J1ZmZlciggICkgKQorCQkJeworCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCXsKKwkJCQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDA7CisKKwkJCQlpZiAoIHpjb25md3JhcCggKSApCisJCQkJCXsKKwkJCQkJLyogTm90ZTogYmVjYXVzZSB3ZSd2ZSB0YWtlbiBjYXJlIGluCisJCQkJCSAqIHl5X2dldF9uZXh0X2J1ZmZlcigpIHRvIGhhdmUgc2V0IHVwCisJCQkJCSAqIHpjb25mdGV4dCwgd2UgY2FuIG5vdyBzZXQgdXAKKwkJCQkJICogeXlfY19idWZfcCBzbyB0aGF0IGlmIHNvbWUgdG90YWwKKwkJCQkJICogaG9zZXIgKGxpa2UgZmxleCBpdHNlbGYpIHdhbnRzIHRvCisJCQkJCSAqIGNhbGwgdGhlIHNjYW5uZXIgYWZ0ZXIgd2UgcmV0dXJuIHRoZQorCQkJCQkgKiBZWV9OVUxMLCBpdCdsbCBzdGlsbCB3b3JrIC0gYW5vdGhlcgorCQkJCQkgKiBZWV9OVUxMIHdpbGwgZ2V0IHJldHVybmVkLgorCQkJCQkgKi8KKwkJCQkJKHl5X2NfYnVmX3ApID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisKKwkJCQkJeXlfYWN0ID0gWVlfU1RBVEVfRU9GKFlZX1NUQVJUKTsKKwkJCQkJZ290byBkb19hY3Rpb247CisJCQkJCX0KKworCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoICEgKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgKQorCQkJCQkJWVlfTkVXX0ZJTEU7CisJCQkJCX0KKwkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgorCQkJCSh5eV9jX2J1Zl9wKSA9CisJCQkJCSh5eXRleHRfcHRyKSArIHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQ7CisKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCAgKTsKKworCQkJCXl5X2NwID0gKHl5X2NfYnVmX3ApOworCQkJCXl5X2JwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisJCQkJZ290byB5eV9tYXRjaDsKKworCQkJY2FzZSBFT0JfQUNUX0xBU1RfTUFUQ0g6CisJCQkJKHl5X2NfYnVmX3ApID0KKwkJCQkmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXTsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoICApOworCisJCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisJCQkJeXlfYnAgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCQkJfQorCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJWVlfRkFUQUxfRVJST1IoCisJCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1ubyBhY3Rpb24gZm91bmQiICk7CisJfSAvKiBlbmQgb2YgYWN0aW9uIHN3aXRjaCAqLworCQl9IC8qIGVuZCBvZiBzY2FubmluZyBvbmUgdG9rZW4gKi8KK30gLyogZW5kIG9mIHpjb25mbGV4ICovCisKKy8qIHl5X2dldF9uZXh0X2J1ZmZlciAtIHRyeSB0byByZWFkIGluIGEgbmV3IGJ1ZmZlcgorICoKKyAqIFJldHVybnMgYSBjb2RlIHJlcHJlc2VudGluZyBhbiBhY3Rpb246CisgKglFT0JfQUNUX0xBU1RfTUFUQ0ggLQorICoJRU9CX0FDVF9DT05USU5VRV9TQ0FOIC0gY29udGludWUgc2Nhbm5pbmcgZnJvbSBjdXJyZW50IHBvc2l0aW9uCisgKglFT0JfQUNUX0VORF9PRl9GSUxFIC0gZW5kIG9mIGZpbGUKKyAqLworc3RhdGljIGludCB5eV9nZXRfbmV4dF9idWZmZXIgKHZvaWQpCit7CisgICAgCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZjsKKwlyZWdpc3RlciBjaGFyICpzb3VyY2UgPSAoeXl0ZXh0X3B0cik7CisJcmVnaXN0ZXIgaW50IG51bWJlcl90b19tb3ZlLCBpOworCWludCByZXRfdmFsOworCisJaWYgKCAoeXlfY19idWZfcCkgPiAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpICsgMV0gKQorCQlZWV9GQVRBTF9FUlJPUigKKwkJImZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tZW5kIG9mIGJ1ZmZlciBtaXNzZWQiICk7CisKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfZmlsbF9idWZmZXIgPT0gMCApCisJCXsgLyogRG9uJ3QgdHJ5IHRvIGZpbGwgdGhlIGJ1ZmZlciwgc28gdGhpcyBpcyBhbiBFT0YuICovCisJCWlmICggKHl5X2NfYnVmX3ApIC0gKHl5dGV4dF9wdHIpIC0gWVlfTU9SRV9BREogPT0gMSApCisJCQl7CisJCQkvKiBXZSBtYXRjaGVkIGEgc2luZ2xlIGNoYXJhY3RlciwgdGhlIEVPQiwgc28KKwkJCSAqIHRyZWF0IHRoaXMgYXMgYSBmaW5hbCBFT0YuCisJCQkgKi8KKwkJCXJldHVybiBFT0JfQUNUX0VORF9PRl9GSUxFOworCQkJfQorCisJCWVsc2UKKwkJCXsKKwkJCS8qIFdlIG1hdGNoZWQgc29tZSB0ZXh0IHByaW9yIHRvIHRoZSBFT0IsIGZpcnN0CisJCQkgKiBwcm9jZXNzIGl0LgorCQkJICovCisJCQlyZXR1cm4gRU9CX0FDVF9MQVNUX01BVENIOworCQkJfQorCQl9CisKKwkvKiBUcnkgdG8gcmVhZCBtb3JlIGRhdGEuICovCisKKwkvKiBGaXJzdCBtb3ZlIGxhc3QgY2hhcnMgdG8gc3RhcnQgb2YgYnVmZmVyLiAqLworCW51bWJlcl90b19tb3ZlID0gKGludCkgKCh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKSkgLSAxOworCisJZm9yICggaSA9IDA7IGkgPCBudW1iZXJfdG9fbW92ZTsgKytpICkKKwkJKihkZXN0KyspID0gKihzb3VyY2UrKyk7CisKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfRU9GX1BFTkRJTkcgKQorCQkvKiBkb24ndCBkbyB0aGUgcmVhZCwgaXQncyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYW4gRU9GLAorCQkgKiBqdXN0IGZvcmNlIGFuIEVPRgorCQkgKi8KKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpID0gMDsKKworCWVsc2UKKwkJeworCQkJaW50IG51bV90b19yZWFkID0KKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgLSBudW1iZXJfdG9fbW92ZSAtIDE7CisKKwkJd2hpbGUgKCBudW1fdG9fcmVhZCA8PSAwICkKKwkJCXsgLyogTm90IGVub3VnaCByb29tIGluIHRoZSBidWZmZXIgLSBncm93IGl0LiAqLworCisJCQkvKiBqdXN0IGEgc2hvcnRlciBuYW1lIGZvciB0aGUgY3VycmVudCBidWZmZXIgKi8KKwkJCVlZX0JVRkZFUl9TVEFURSBiID0gWVlfQ1VSUkVOVF9CVUZGRVI7CisKKwkJCWludCB5eV9jX2J1Zl9wX29mZnNldCA9CisJCQkJKGludCkgKCh5eV9jX2J1Zl9wKSAtIGItPnl5X2NoX2J1Zik7CisKKwkJCWlmICggYi0+eXlfaXNfb3VyX2J1ZmZlciApCisJCQkJeworCQkJCWludCBuZXdfc2l6ZSA9IGItPnl5X2J1Zl9zaXplICogMjsKKworCQkJCWlmICggbmV3X3NpemUgPD0gMCApCisJCQkJCWItPnl5X2J1Zl9zaXplICs9IGItPnl5X2J1Zl9zaXplIC8gODsKKwkJCQllbHNlCisJCQkJCWItPnl5X2J1Zl9zaXplICo9IDI7CisKKwkJCQliLT55eV9jaF9idWYgPSAoY2hhciAqKQorCQkJCQkvKiBJbmNsdWRlIHJvb20gaW4gZm9yIDIgRU9CIGNoYXJzLiAqLworCQkJCQl6Y29uZnJlYWxsb2MoKHZvaWQgKikgYi0+eXlfY2hfYnVmLGItPnl5X2J1Zl9zaXplICsgMiAgKTsKKwkJCQl9CisJCQllbHNlCisJCQkJLyogQ2FuJ3QgZ3JvdyBpdCwgd2UgZG9uJ3Qgb3duIGl0LiAqLworCQkJCWItPnl5X2NoX2J1ZiA9IDA7CisKKwkJCWlmICggISBiLT55eV9jaF9idWYgKQorCQkJCVlZX0ZBVEFMX0VSUk9SKAorCQkJCSJmYXRhbCBlcnJvciAtIHNjYW5uZXIgaW5wdXQgYnVmZmVyIG92ZXJmbG93IiApOworCisJCQkoeXlfY19idWZfcCkgPSAmYi0+eXlfY2hfYnVmW3l5X2NfYnVmX3Bfb2Zmc2V0XTsKKworCQkJbnVtX3RvX3JlYWQgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplIC0KKwkJCQkJCW51bWJlcl90b19tb3ZlIC0gMTsKKworCQkJfQorCisJCWlmICggbnVtX3RvX3JlYWQgPiBZWV9SRUFEX0JVRl9TSVpFICkKKwkJCW51bV90b19yZWFkID0gWVlfUkVBRF9CVUZfU0laRTsKKworCQkvKiBSZWFkIGluIG1vcmUgZGF0YS4gKi8KKwkJWVlfSU5QVVQoICgmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbbnVtYmVyX3RvX21vdmVdKSwKKwkJCSh5eV9uX2NoYXJzKSwgKHNpemVfdCkgbnVtX3RvX3JlYWQgKTsKKworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycyk7CisJCX0KKworCWlmICggKHl5X25fY2hhcnMpID09IDAgKQorCQl7CisJCWlmICggbnVtYmVyX3RvX21vdmUgPT0gWVlfTU9SRV9BREogKQorCQkJeworCQkJcmV0X3ZhbCA9IEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl6Y29uZnJlc3RhcnQoemNvbmZpbiAgKTsKKwkJCX0KKworCQllbHNlCisJCQl7CisJCQlyZXRfdmFsID0gRU9CX0FDVF9MQVNUX01BVENIOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID0KKwkJCQlZWV9CVUZGRVJfRU9GX1BFTkRJTkc7CisJCQl9CisJCX0KKworCWVsc2UKKwkJcmV0X3ZhbCA9IEVPQl9BQ1RfQ09OVElOVUVfU0NBTjsKKworCWlmICgoeXlfc2l6ZV90KSAoKHl5X25fY2hhcnMpICsgbnVtYmVyX3RvX21vdmUpID4gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSkgeworCQkvKiBFeHRlbmQgdGhlIGFycmF5IGJ5IDUwJSwgcGx1cyB0aGUgbnVtYmVyIHdlIHJlYWxseSBuZWVkLiAqLworCQl5eV9zaXplX3QgbmV3X3NpemUgPSAoeXlfbl9jaGFycykgKyBudW1iZXJfdG9fbW92ZSArICgoeXlfbl9jaGFycykgPj4gMSk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmID0gKGNoYXIgKikgemNvbmZyZWFsbG9jKCh2b2lkICopIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmLG5ld19zaXplICApOworCQlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKQorCQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfZ2V0X25leHRfYnVmZmVyKCkiICk7CisJfQorCisJKHl5X25fY2hhcnMpICs9IG51bWJlcl90b19tb3ZlOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpICsgMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwkoeXl0ZXh0X3B0cikgPSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbMF07CisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyogeXlfZ2V0X3ByZXZpb3VzX3N0YXRlIC0gZ2V0IHRoZSBzdGF0ZSBqdXN0IGJlZm9yZSB0aGUgRU9CIGNoYXIgd2FzIHJlYWNoZWQgKi8KKworICAgIHN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSAodm9pZCkKK3sKKwlyZWdpc3RlciB5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGU7CisJcmVnaXN0ZXIgY2hhciAqeXlfY3A7CisgICAgCisJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9zdGFydCk7CisKKwlmb3IgKCB5eV9jcCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOyB5eV9jcCA8ICh5eV9jX2J1Zl9wKTsgKyt5eV9jcCApCisJCXsKKwkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9jdXJyZW50X3N0YXRlXVsoKnl5X2NwID8geXlfZWNbWVlfU0NfVE9fVUkoKnl5X2NwKV0gOiAxKV07CisJCX0KKworCXJldHVybiB5eV9jdXJyZW50X3N0YXRlOworfQorCisvKiB5eV90cnlfTlVMX3RyYW5zIC0gdHJ5IHRvIG1ha2UgYSB0cmFuc2l0aW9uIG9uIHRoZSBOVUwgY2hhcmFjdGVyCisgKgorICogc3lub3BzaXMKKyAqCW5leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCBjdXJyZW50X3N0YXRlICk7CisgKi8KKyAgICBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zICAoeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlICkKK3sKKwlyZWdpc3RlciBpbnQgeXlfaXNfamFtOworICAgIAorCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfY3VycmVudF9zdGF0ZV1bMV07CisJeXlfaXNfamFtID0gKHl5X2N1cnJlbnRfc3RhdGUgPD0gMCk7CisKKwlyZXR1cm4geXlfaXNfamFtID8gMCA6IHl5X2N1cnJlbnRfc3RhdGU7Cit9CisKKyAgICBzdGF0aWMgdm9pZCB5eXVucHV0IChpbnQgYywgcmVnaXN0ZXIgY2hhciAqIHl5X2JwICkKK3sKKwlyZWdpc3RlciBjaGFyICp5eV9jcDsKKyAgICAKKyAgICB5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKworCS8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLworCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOworCisJaWYgKCB5eV9jcCA8IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICsgMiApCisJCXsgLyogbmVlZCB0byBzaGlmdCB0aGluZ3MgdXAgdG8gbWFrZSByb29tICovCisJCS8qICsyIGZvciBFT0IgY2hhcnMuICovCisJCXJlZ2lzdGVyIGludCBudW1iZXJfdG9fbW92ZSA9ICh5eV9uX2NoYXJzKSArIDI7CisJCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbCisJCQkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgKyAyXTsKKwkJcmVnaXN0ZXIgY2hhciAqc291cmNlID0KKwkJCQkmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbbnVtYmVyX3RvX21vdmVdOworCisJCXdoaWxlICggc291cmNlID4gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKQorCQkJKi0tZGVzdCA9ICotLXNvdXJjZTsKKworCQl5eV9jcCArPSAoaW50KSAoZGVzdCAtIHNvdXJjZSk7CisJCXl5X2JwICs9IChpbnQpIChkZXN0IC0gc291cmNlKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0KKwkJCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemU7CisKKwkJaWYgKCB5eV9jcCA8IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICsgMiApCisJCQlZWV9GQVRBTF9FUlJPUiggImZsZXggc2Nhbm5lciBwdXNoLWJhY2sgb3ZlcmZsb3ciICk7CisJCX0KKworCSotLXl5X2NwID0gKGNoYXIpIGM7CisKKwkoeXl0ZXh0X3B0cikgPSB5eV9icDsKKwkoeXlfaG9sZF9jaGFyKSA9ICp5eV9jcDsKKwkoeXlfY19idWZfcCkgPSB5eV9jcDsKK30KKworI2lmbmRlZiBZWV9OT19JTlBVVAorI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgc3RhdGljIGludCB5eWlucHV0ICh2b2lkKQorI2Vsc2UKKyAgICBzdGF0aWMgaW50IGlucHV0ICAodm9pZCkKKyNlbmRpZgorCit7CisJaW50IGM7CisgICAgCisJKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOworCisJaWYgKCAqKHl5X2NfYnVmX3ApID09IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCXsKKwkJLyogeXlfY19idWZfcCBub3cgcG9pbnRzIHRvIHRoZSBjaGFyYWN0ZXIgd2Ugd2FudCB0byByZXR1cm4uCisJCSAqIElmIHRoaXMgb2NjdXJzICpiZWZvcmUqIHRoZSBFT0IgY2hhcmFjdGVycywgdGhlbiBpdCdzIGEKKwkJICogdmFsaWQgTlVMOyBpZiBub3QsIHRoZW4gd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJICovCisJCWlmICggKHl5X2NfYnVmX3ApIDwgJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV0gKQorCQkJLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLworCQkJKih5eV9jX2J1Zl9wKSA9ICdcMCc7CisKKwkJZWxzZQorCQkJeyAvKiBuZWVkIG1vcmUgaW5wdXQgKi8KKwkJCWludCBvZmZzZXQgPSAoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cik7CisJCQkrKyh5eV9jX2J1Zl9wKTsKKworCQkJc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCAgKSApCisJCQkJeworCQkJCWNhc2UgRU9CX0FDVF9MQVNUX01BVENIOgorCQkJCQkvKiBUaGlzIGhhcHBlbnMgYmVjYXVzZSB5eV9nX25fYigpCisJCQkJCSAqIHNlZXMgdGhhdCB3ZSd2ZSBhY2N1bXVsYXRlZCBhCisJCQkJCSAqIHRva2VuIGFuZCBmbGFncyB0aGF0IHdlIG5lZWQgdG8KKwkJCQkJICogdHJ5IG1hdGNoaW5nIHRoZSB0b2tlbiBiZWZvcmUKKwkJCQkJICogcHJvY2VlZGluZy4gIEJ1dCBmb3IgaW5wdXQoKSwKKwkJCQkJICogdGhlcmUncyBubyBtYXRjaGluZyB0byBjb25zaWRlci4KKwkJCQkJICogU28gY29udmVydCB0aGUgRU9CX0FDVF9MQVNUX01BVENICisJCQkJCSAqIHRvIEVPQl9BQ1RfRU5EX09GX0ZJTEUuCisJCQkJCSAqLworCisJCQkJCS8qIFJlc2V0IGJ1ZmZlciBzdGF0dXMuICovCisJCQkJCXpjb25mcmVzdGFydCh6Y29uZmluICk7CisKKwkJCQkJLypGQUxMVEhST1VHSCovCisKKwkJCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6CisJCQkJCXsKKwkJCQkJaWYgKCB6Y29uZndyYXAoICkgKQorCQkJCQkJcmV0dXJuIEVPRjsKKworCQkJCQlpZiAoICEgKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgKQorCQkJCQkJWVlfTkVXX0ZJTEU7CisjaWZkZWYgX19jcGx1c3BsdXMKKwkJCQkJcmV0dXJuIHl5aW5wdXQoKTsKKyNlbHNlCisJCQkJCXJldHVybiBpbnB1dCgpOworI2VuZGlmCisJCQkJCX0KKworCQkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgorCQkJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyBvZmZzZXQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJYyA9ICoodW5zaWduZWQgY2hhciAqKSAoeXlfY19idWZfcCk7CS8qIGNhc3QgZm9yIDgtYml0IGNoYXIncyAqLworCSooeXlfY19idWZfcCkgPSAnXDAnOwkvKiBwcmVzZXJ2ZSB6Y29uZnRleHQgKi8KKwkoeXlfaG9sZF9jaGFyKSA9ICorKyh5eV9jX2J1Zl9wKTsKKworCXJldHVybiBjOworfQorI2VuZGlmCS8qIGlmbmRlZiBZWV9OT19JTlBVVCAqLworCisvKiogSW1tZWRpYXRlbHkgc3dpdGNoIHRvIGEgZGlmZmVyZW50IGlucHV0IHN0cmVhbS4KKyAqIEBwYXJhbSBpbnB1dF9maWxlIEEgcmVhZGFibGUgc3RyZWFtLgorICogCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlc2V0IHRoZSBzdGFydCBjb25kaXRpb24gdG8gQGMgSU5JVElBTCAuCisgKi8KKyAgICB2b2lkIHpjb25mcmVzdGFydCAgKEZJTEUgKiBpbnB1dF9maWxlICkKK3sKKyAgICAKKwlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXsKKyAgICAgICAgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPQorICAgICAgICAgICAgemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFICk7CisJfQorCisJemNvbmZfaW5pdF9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIsaW5wdXRfZmlsZSApOworCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworfQorCisvKiogU3dpdGNoIHRvIGEgZGlmZmVyZW50IGlucHV0IGJ1ZmZlci4KKyAqIEBwYXJhbSBuZXdfYnVmZmVyIFRoZSBuZXcgaW5wdXQgYnVmZmVyLgorICogCisgKi8KKyAgICB2b2lkIHpjb25mX3N3aXRjaF90b19idWZmZXIgIChZWV9CVUZGRVJfU1RBVEUgIG5ld19idWZmZXIgKQoreworICAgIAorCS8qIFRPRE8uIFdlIHNob3VsZCBiZSBhYmxlIHRvIHJlcGxhY2UgdGhpcyBlbnRpcmUgZnVuY3Rpb24gYm9keQorCSAqIHdpdGgKKwkgKgkJemNvbmZwb3BfYnVmZmVyX3N0YXRlKCk7CisJICoJCXpjb25mcHVzaF9idWZmZXJfc3RhdGUobmV3X2J1ZmZlcik7CisgICAgICovCisJemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVIgPT0gbmV3X2J1ZmZlciApCisJCXJldHVybjsKKworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVIgKQorCQl7CisJCS8qIEZsdXNoIG91dCBpbmZvcm1hdGlvbiBmb3Igb2xkIGJ1ZmZlci4gKi8KKwkJKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3MgPSAoeXlfY19idWZfcCk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKKwkJfQorCisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gbmV3X2J1ZmZlcjsKKwl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKworCS8qIFdlIGRvbid0IGFjdHVhbGx5IGtub3cgd2hldGhlciB3ZSBkaWQgdGhpcyBzd2l0Y2ggZHVyaW5nCisJICogRU9GICh6Y29uZndyYXAoKSkgcHJvY2Vzc2luZywgYnV0IHRoZSBvbmx5IHRpbWUgdGhpcyBmbGFnCisJICogaXMgbG9va2VkIGF0IGlzIGFmdGVyIHpjb25md3JhcCgpIGlzIGNhbGxlZCwgc28gaXQncyBzYWZlCisJICogdG8gZ28gYWhlYWQgYW5kIGFsd2F5cyBzZXQgaXQuCisJICovCisJKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAxOworfQorCitzdGF0aWMgdm9pZCB6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSAgKHZvaWQpCit7CisgICAgCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFyczsKKwkoeXl0ZXh0X3B0cikgPSAoeXlfY19idWZfcCkgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3M7CisJemNvbmZpbiA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaW5wdXRfZmlsZTsKKwkoeXlfaG9sZF9jaGFyKSA9ICooeXlfY19idWZfcCk7Cit9CisKKy8qKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBpbnB1dCBidWZmZXIgc3RhdGUuCisgKiBAcGFyYW0gZmlsZSBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIEBwYXJhbSBzaXplIFRoZSBjaGFyYWN0ZXIgYnVmZmVyIHNpemUgaW4gYnl0ZXMuIFdoZW4gaW4gZG91YnQsIHVzZSBAYyBZWV9CVUZfU0laRS4KKyAqIAorICogQHJldHVybiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZS4KKyAqLworICAgIFlZX0JVRkZFUl9TVEFURSB6Y29uZl9jcmVhdGVfYnVmZmVyICAoRklMRSAqIGZpbGUsIGludCAgc2l6ZSApCit7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisgICAgCisJYiA9IChZWV9CVUZGRVJfU1RBVEUpIHpjb25mYWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZl9jcmVhdGVfYnVmZmVyKCkiICk7CisKKwliLT55eV9idWZfc2l6ZSA9IHNpemU7CisKKwkvKiB5eV9jaF9idWYgaGFzIHRvIGJlIDIgY2hhcmFjdGVycyBsb25nZXIgdGhhbiB0aGUgc2l6ZSBnaXZlbiBiZWNhdXNlCisJICogd2UgbmVlZCB0byBwdXQgaW4gMiBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuCisJICovCisJYi0+eXlfY2hfYnVmID0gKGNoYXIgKikgemNvbmZhbGxvYyhiLT55eV9idWZfc2l6ZSArIDIgICk7CisJaWYgKCAhIGItPnl5X2NoX2J1ZiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mX2NyZWF0ZV9idWZmZXIoKSIgKTsKKworCWItPnl5X2lzX291cl9idWZmZXIgPSAxOworCisJemNvbmZfaW5pdF9idWZmZXIoYixmaWxlICk7CisKKwlyZXR1cm4gYjsKK30KKworLyoqIERlc3Ryb3kgdGhlIGJ1ZmZlci4KKyAqIEBwYXJhbSBiIGEgYnVmZmVyIGNyZWF0ZWQgd2l0aCB6Y29uZl9jcmVhdGVfYnVmZmVyKCkKKyAqIAorICovCisgICAgdm9pZCB6Y29uZl9kZWxldGVfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgIGIgKQoreworICAgIAorCWlmICggISBiICkKKwkJcmV0dXJuOworCisJaWYgKCBiID09IFlZX0NVUlJFTlRfQlVGRkVSICkgLyogTm90IHN1cmUgaWYgd2Ugc2hvdWxkIHBvcCBoZXJlLiAqLworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSAoWVlfQlVGRkVSX1NUQVRFKSAwOworCisJaWYgKCBiLT55eV9pc19vdXJfYnVmZmVyICkKKwkJemNvbmZmcmVlKCh2b2lkICopIGItPnl5X2NoX2J1ZiAgKTsKKworCXpjb25mZnJlZSgodm9pZCAqKSBiICApOworfQorCisvKiBJbml0aWFsaXplcyBvciByZWluaXRpYWxpemVzIGEgYnVmZmVyLgorICogVGhpcyBmdW5jdGlvbiBpcyBzb21ldGltZXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGJ1ZmZlciwKKyAqIHN1Y2ggYXMgZHVyaW5nIGEgemNvbmZyZXN0YXJ0KCkgb3IgYXQgRU9GLgorICovCisgICAgc3RhdGljIHZvaWQgemNvbmZfaW5pdF9idWZmZXIgIChZWV9CVUZGRVJfU1RBVEUgIGIsIEZJTEUgKiBmaWxlICkKKworeworCWludCBvZXJybm8gPSBlcnJubzsKKyAgICAKKwl6Y29uZl9mbHVzaF9idWZmZXIoYiApOworCisJYi0+eXlfaW5wdXRfZmlsZSA9IGZpbGU7CisJYi0+eXlfZmlsbF9idWZmZXIgPSAxOworCisgICAgLyogSWYgYiBpcyB0aGUgY3VycmVudCBidWZmZXIsIHRoZW4gemNvbmZfaW5pdF9idWZmZXIgd2FzIF9wcm9iYWJseV8KKyAgICAgKiBjYWxsZWQgZnJvbSB6Y29uZnJlc3RhcnQoKSBvciB0aHJvdWdoIHl5X2dldF9uZXh0X2J1ZmZlci4KKyAgICAgKiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gcmVzZXQgdGhlIGxpbmVubyBvciBjb2x1bW4uCisgICAgICovCisgICAgaWYgKGIgIT0gWVlfQ1VSUkVOVF9CVUZGRVIpeworICAgICAgICBiLT55eV9ic19saW5lbm8gPSAxOworICAgICAgICBiLT55eV9ic19jb2x1bW4gPSAwOworICAgIH0KKworICAgICAgICBiLT55eV9pc19pbnRlcmFjdGl2ZSA9IDA7CisgICAgCisJZXJybm8gPSBvZXJybm87Cit9CisKKy8qKiBEaXNjYXJkIGFsbCBidWZmZXJlZCBjaGFyYWN0ZXJzLiBPbiB0aGUgbmV4dCBzY2FuLCBZWV9JTlBVVCB3aWxsIGJlIGNhbGxlZC4KKyAqIEBwYXJhbSBiIHRoZSBidWZmZXIgc3RhdGUgdG8gYmUgZmx1c2hlZCwgdXN1YWxseSBAYyBZWV9DVVJSRU5UX0JVRkZFUi4KKyAqIAorICovCisgICAgdm9pZCB6Y29uZl9mbHVzaF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSAgYiApCit7CisgICAgCWlmICggISBiICkKKwkJcmV0dXJuOworCisJYi0+eXlfbl9jaGFycyA9IDA7CisKKwkvKiBXZSBhbHdheXMgbmVlZCB0d28gZW5kLW9mLWJ1ZmZlciBjaGFyYWN0ZXJzLiAgVGhlIGZpcnN0IGNhdXNlcworCSAqIGEgdHJhbnNpdGlvbiB0byB0aGUgZW5kLW9mLWJ1ZmZlciBzdGF0ZS4gIFRoZSBzZWNvbmQgY2F1c2VzCisJICogYSBqYW0gaW4gdGhhdCBzdGF0ZS4KKwkgKi8KKwliLT55eV9jaF9idWZbMF0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisJYi0+eXlfY2hfYnVmWzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJYi0+eXlfYnVmX3BvcyA9ICZiLT55eV9jaF9idWZbMF07CisKKwliLT55eV9hdF9ib2wgPSAxOworCWItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTkVXOworCisJaWYgKCBiID09IFlZX0NVUlJFTlRfQlVGRkVSICkKKwkJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7Cit9CisKKy8qKiBQdXNoZXMgdGhlIG5ldyBzdGF0ZSBvbnRvIHRoZSBzdGFjay4gVGhlIG5ldyBzdGF0ZSBiZWNvbWVzCisgKiAgdGhlIGN1cnJlbnQgc3RhdGUuIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSB0aGUgc3RhY2sKKyAqICBpZiBuZWNlc3NhcnkuCisgKiAgQHBhcmFtIG5ld19idWZmZXIgVGhlIG5ldyBzdGF0ZS4KKyAqICAKKyAqLwordm9pZCB6Y29uZnB1c2hfYnVmZmVyX3N0YXRlIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciApCit7CisgICAgCWlmIChuZXdfYnVmZmVyID09IE5VTEwpCisJCXJldHVybjsKKworCXpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjaygpOworCisJLyogVGhpcyBibG9jayBpcyBjb3BpZWQgZnJvbSB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyLiAqLworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVIgKQorCQl7CisJCS8qIEZsdXNoIG91dCBpbmZvcm1hdGlvbiBmb3Igb2xkIGJ1ZmZlci4gKi8KKwkJKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3MgPSAoeXlfY19idWZfcCk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKKwkJfQorCisJLyogT25seSBwdXNoIGlmIHRvcCBleGlzdHMuIE90aGVyd2lzZSwgcmVwbGFjZSB0b3AuICovCisJaWYgKFlZX0NVUlJFTlRfQlVGRkVSKQorCQkoeXlfYnVmZmVyX3N0YWNrX3RvcCkrKzsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBuZXdfYnVmZmVyOworCisJLyogY29waWVkIGZyb20gemNvbmZfc3dpdGNoX3RvX2J1ZmZlci4gKi8KKwl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKwkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7Cit9CisKKy8qKiBSZW1vdmVzIGFuZCBkZWxldGVzIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBpZiBwcmVzZW50LgorICogIFRoZSBuZXh0IGVsZW1lbnQgYmVjb21lcyB0aGUgbmV3IHRvcC4KKyAqICAKKyAqLwordm9pZCB6Y29uZnBvcF9idWZmZXJfc3RhdGUgKHZvaWQpCit7CisgICAgCWlmICghWVlfQ1VSUkVOVF9CVUZGRVIpCisJCXJldHVybjsKKworCXpjb25mX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgKTsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBOVUxMOworCWlmICgoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPiAwKQorCQktLSh5eV9idWZmZXJfc3RhY2tfdG9wKTsKKworCWlmIChZWV9DVVJSRU5UX0JVRkZFUikgeworCQl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKwkJKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAxOworCX0KK30KKworLyogQWxsb2NhdGVzIHRoZSBzdGFjayBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAqICBHdWFyYW50ZWVzIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgcHVzaC4KKyAqLworc3RhdGljIHZvaWQgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICh2b2lkKQoreworCWludCBudW1fdG9fYWxsb2M7CisgICAgCisJaWYgKCEoeXlfYnVmZmVyX3N0YWNrKSkgeworCisJCS8qIEZpcnN0IGFsbG9jYXRpb24gaXMganVzdCBmb3IgMiBlbGVtZW50cywgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGlzCisJCSAqIHNjYW5uZXIgd2lsbCBldmVuIG5lZWQgYSBzdGFjay4gV2UgdXNlIDIgaW5zdGVhZCBvZiAxIHRvIGF2b2lkIGFuCisJCSAqIGltbWVkaWF0ZSByZWFsbG9jIG9uIHRoZSBuZXh0IGNhbGwuCisgICAgICAgICAqLworCQludW1fdG9fYWxsb2MgPSAxOworCQkoeXlfYnVmZmVyX3N0YWNrKSA9IChzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKiopemNvbmZhbGxvYworCQkJCQkJCQkobnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKQorCQkJCQkJCQkpOworCQlpZiAoICEgKHl5X2J1ZmZlcl9zdGFjaykgKQorCQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrKCkiICk7CisJCQkJCQkJCSAgCisJCW1lbXNldCgoeXlfYnVmZmVyX3N0YWNrKSwgMCwgbnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7CisJCQkJCisJCSh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IG51bV90b19hbGxvYzsKKwkJKHl5X2J1ZmZlcl9zdGFja190b3ApID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmICgoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPj0gKCh5eV9idWZmZXJfc3RhY2tfbWF4KSkgLSAxKXsKKworCQkvKiBJbmNyZWFzZSB0aGUgYnVmZmVyIHRvIHByZXBhcmUgZm9yIGEgcG9zc2libGUgcHVzaC4gKi8KKwkJaW50IGdyb3dfc2l6ZSA9IDggLyogYXJiaXRyYXJ5IGdyb3cgc2l6ZSAqLzsKKworCQludW1fdG9fYWxsb2MgPSAoeXlfYnVmZmVyX3N0YWNrX21heCkgKyBncm93X3NpemU7CisJCSh5eV9idWZmZXJfc3RhY2spID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKil6Y29uZnJlYWxsb2MKKwkJCQkJCQkJKCh5eV9idWZmZXJfc3RhY2spLAorCQkJCQkJCQludW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCisJCQkJCQkJCSk7CisJCWlmICggISAoeXlfYnVmZmVyX3N0YWNrKSApCisJCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2soKSIgKTsKKworCQkvKiB6ZXJvIG9ubHkgdGhlIG5ldyBzbG90cy4qLworCQltZW1zZXQoKHl5X2J1ZmZlcl9zdGFjaykgKyAoeXlfYnVmZmVyX3N0YWNrX21heCksIDAsIGdyb3dfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikpOworCQkoeXlfYnVmZmVyX3N0YWNrX21heCkgPSBudW1fdG9fYWxsb2M7CisJfQorfQorCisvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIGRpcmVjdGx5IGZyb20gYSB1c2VyLXNwZWNpZmllZCBjaGFyYWN0ZXIgYnVmZmVyLgorICogQHBhcmFtIGJhc2UgdGhlIGNoYXJhY3RlciBidWZmZXIKKyAqIEBwYXJhbSBzaXplIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBjaGFyYWN0ZXIgYnVmZmVyCisgKiAKKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LiAKKyAqLworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnVmZmVyICAoY2hhciAqIGJhc2UsIHl5X3NpemVfdCAgc2l6ZSApCit7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisgICAgCisJaWYgKCBzaXplIDwgMiB8fAorCSAgICAgYmFzZVtzaXplLTJdICE9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiB8fAorCSAgICAgYmFzZVtzaXplLTFdICE9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCS8qIFRoZXkgZm9yZ290IHRvIGxlYXZlIHJvb20gZm9yIHRoZSBFT0Incy4gKi8KKwkJcmV0dXJuIDA7CisKKwliID0gKFlZX0JVRkZFUl9TVEFURSkgemNvbmZhbGxvYyhzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSAgKTsKKwlpZiAoICEgYiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mX3NjYW5fYnVmZmVyKCkiICk7CisKKwliLT55eV9idWZfc2l6ZSA9IHNpemUgLSAyOwkvKiAiLSAyIiB0byB0YWtlIGNhcmUgb2YgRU9CJ3MgKi8KKwliLT55eV9idWZfcG9zID0gYi0+eXlfY2hfYnVmID0gYmFzZTsKKwliLT55eV9pc19vdXJfYnVmZmVyID0gMDsKKwliLT55eV9pbnB1dF9maWxlID0gMDsKKwliLT55eV9uX2NoYXJzID0gYi0+eXlfYnVmX3NpemU7CisJYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSAwOworCWItPnl5X2F0X2JvbCA9IDE7CisJYi0+eXlfZmlsbF9idWZmZXIgPSAwOworCWItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTkVXOworCisJemNvbmZfc3dpdGNoX3RvX2J1ZmZlcihiICApOworCisJcmV0dXJuIGI7Cit9CisKKy8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gYSBzdHJpbmcuIFRoZSBuZXh0IGNhbGwgdG8gemNvbmZsZXgoKSB3aWxsCisgKiBzY2FuIGZyb20gYSBAZSBjb3B5IG9mIEBhIHN0ci4KKyAqIEBwYXJhbSB5eXN0ciBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyB0byBzY2FuCisgKiAKKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgorICogQG5vdGUgSWYgeW91IHdhbnQgdG8gc2NhbiBieXRlcyB0aGF0IG1heSBjb250YWluIE5VTCB2YWx1ZXMsIHRoZW4gdXNlCisgKiAgICAgICB6Y29uZl9zY2FuX2J5dGVzKCkgaW5zdGVhZC4KKyAqLworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKiB5eXN0ciApCit7CisgICAgCisJcmV0dXJuIHpjb25mX3NjYW5fYnl0ZXMoeXlzdHIsc3RybGVuKHl5c3RyKSApOworfQorCisvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIHRoZSBnaXZlbiBieXRlcy4gVGhlIG5leHQgY2FsbCB0byB6Y29uZmxleCgpIHdpbGwKKyAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgYnl0ZXMuCisgKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHNjYW4KKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgQGEgYnl0ZXMuCisgKiAKKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgorICovCitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9ieXRlcyAgKHl5Y29uc3QgY2hhciAqIHl5Ynl0ZXMsIGludCAgX3l5Ynl0ZXNfbGVuICkKK3sKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKwljaGFyICpidWY7CisJeXlfc2l6ZV90IG47CisJaW50IGk7CisgICAgCisJLyogR2V0IG1lbW9yeSBmb3IgZnVsbCBidWZmZXIsIGluY2x1ZGluZyBzcGFjZSBmb3IgdHJhaWxpbmcgRU9CJ3MuICovCisJbiA9IF95eWJ5dGVzX2xlbiArIDI7CisJYnVmID0gKGNoYXIgKikgemNvbmZhbGxvYyhuICApOworCWlmICggISBidWYgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZl9zY2FuX2J5dGVzKCkiICk7CisKKwlmb3IgKCBpID0gMDsgaSA8IF95eWJ5dGVzX2xlbjsgKytpICkKKwkJYnVmW2ldID0geXlieXRlc1tpXTsKKworCWJ1ZltfeXlieXRlc19sZW5dID0gYnVmW195eWJ5dGVzX2xlbisxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCWIgPSB6Y29uZl9zY2FuX2J1ZmZlcihidWYsbiApOworCWlmICggISBiICkKKwkJWVlfRkFUQUxfRVJST1IoICJiYWQgYnVmZmVyIGluIHpjb25mX3NjYW5fYnl0ZXMoKSIgKTsKKworCS8qIEl0J3Mgb2theSB0byBncm93IGV0Yy4gdGhpcyBidWZmZXIsIGFuZCB3ZSBzaG91bGQgdGhyb3cgaXQKKwkgKiBhd2F5IHdoZW4gd2UncmUgZG9uZS4KKwkgKi8KKwliLT55eV9pc19vdXJfYnVmZmVyID0gMTsKKworCXJldHVybiBiOworfQorCisjaWZuZGVmIFlZX0VYSVRfRkFJTFVSRQorI2RlZmluZSBZWV9FWElUX0ZBSUxVUkUgMgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yICh5eWNvbnN0IGNoYXIqIG1zZyApCit7CisgICAgCSh2b2lkKSBmcHJpbnRmKCBzdGRlcnIsICIlc1xuIiwgbXNnICk7CisJZXhpdCggWVlfRVhJVF9GQUlMVVJFICk7Cit9CisKKy8qIFJlZGVmaW5lIHl5bGVzcygpIHNvIGl0IHdvcmtzIGluIHNlY3Rpb24gMyBjb2RlLiAqLworCisjdW5kZWYgeXlsZXNzCisjZGVmaW5lIHl5bGVzcyhuKSBcCisJZG8gXAorCQl7IFwKKwkJLyogVW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0LiAqLyBcCisgICAgICAgIGludCB5eWxlc3NfbWFjcm9fYXJnID0gKG4pOyBcCisgICAgICAgIFlZX0xFU1NfTElORU5PKHl5bGVzc19tYWNyb19hcmcpO1wKKwkJemNvbmZ0ZXh0W3pjb25mbGVuZ10gPSAoeXlfaG9sZF9jaGFyKTsgXAorCQkoeXlfY19idWZfcCkgPSB6Y29uZnRleHQgKyB5eWxlc3NfbWFjcm9fYXJnOyBcCisJCSh5eV9ob2xkX2NoYXIpID0gKih5eV9jX2J1Zl9wKTsgXAorCQkqKHl5X2NfYnVmX3ApID0gJ1wwJzsgXAorCQl6Y29uZmxlbmcgPSB5eWxlc3NfbWFjcm9fYXJnOyBcCisJCX0gXAorCXdoaWxlICggMCApCisKKy8qIEFjY2Vzc29yICBtZXRob2RzIChnZXQvc2V0IGZ1bmN0aW9ucykgdG8gc3RydWN0IG1lbWJlcnMuICovCisKKy8qKiBHZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCisgKiAKKyAqLworaW50IHpjb25mZ2V0X2xpbmVubyAgKHZvaWQpCit7CisgICAgICAgIAorICAgIHJldHVybiB6Y29uZmxpbmVubzsKK30KKworLyoqIEdldCB0aGUgaW5wdXQgc3RyZWFtLgorICogCisgKi8KK0ZJTEUgKnpjb25mZ2V0X2luICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25maW47Cit9CisKKy8qKiBHZXQgdGhlIG91dHB1dCBzdHJlYW0uCisgKiAKKyAqLworRklMRSAqemNvbmZnZXRfb3V0ICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25mb3V0OworfQorCisvKiogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgdG9rZW4uCisgKiAKKyAqLworaW50IHpjb25mZ2V0X2xlbmcgICh2b2lkKQoreworICAgICAgICByZXR1cm4gemNvbmZsZW5nOworfQorCisvKiogR2V0IHRoZSBjdXJyZW50IHRva2VuLgorICogCisgKi8KKworY2hhciAqemNvbmZnZXRfdGV4dCAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB6Y29uZnRleHQ7Cit9CisKKy8qKiBTZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCisgKiBAcGFyYW0gbGluZV9udW1iZXIKKyAqIAorICovCit2b2lkIHpjb25mc2V0X2xpbmVubyAoaW50ICBsaW5lX251bWJlciApCit7CisgICAgCisgICAgemNvbmZsaW5lbm8gPSBsaW5lX251bWJlcjsKK30KKworLyoqIFNldCB0aGUgaW5wdXQgc3RyZWFtLiBUaGlzIGRvZXMgbm90IGRpc2NhcmQgdGhlIGN1cnJlbnQKKyAqIGlucHV0IGJ1ZmZlci4KKyAqIEBwYXJhbSBpbl9zdHIgQSByZWFkYWJsZSBzdHJlYW0uCisgKiAKKyAqIEBzZWUgemNvbmZfc3dpdGNoX3RvX2J1ZmZlcgorICovCit2b2lkIHpjb25mc2V0X2luIChGSUxFICogIGluX3N0ciApCit7CisgICAgICAgIHpjb25maW4gPSBpbl9zdHIgOworfQorCit2b2lkIHpjb25mc2V0X291dCAoRklMRSAqICBvdXRfc3RyICkKK3sKKyAgICAgICAgemNvbmZvdXQgPSBvdXRfc3RyIDsKK30KKworaW50IHpjb25mZ2V0X2RlYnVnICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25mX2ZsZXhfZGVidWc7Cit9CisKK3ZvaWQgemNvbmZzZXRfZGVidWcgKGludCAgYmRlYnVnICkKK3sKKyAgICAgICAgemNvbmZfZmxleF9kZWJ1ZyA9IGJkZWJ1ZyA7Cit9CisKK3N0YXRpYyBpbnQgeXlfaW5pdF9nbG9iYWxzICh2b2lkKQoreworICAgICAgICAvKiBJbml0aWFsaXphdGlvbiBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIG5vbi1yZWVudHJhbnQgc2Nhbm5lci4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHpjb25mbGV4X2Rlc3Ryb3koKSwgc28gZG9uJ3QgYWxsb2NhdGUgaGVyZS4KKyAgICAgKi8KKworICAgICh5eV9idWZmZXJfc3RhY2spID0gMDsKKyAgICAoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPSAwOworICAgICh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IDA7CisgICAgKHl5X2NfYnVmX3ApID0gKGNoYXIgKikgMDsKKyAgICAoeXlfaW5pdCkgPSAwOworICAgICh5eV9zdGFydCkgPSAwOworCisvKiBEZWZpbmVkIGluIG1haW4uYyAqLworI2lmZGVmIFlZX1NURElOSVQKKyAgICB6Y29uZmluID0gc3RkaW47CisgICAgemNvbmZvdXQgPSBzdGRvdXQ7CisjZWxzZQorICAgIHpjb25maW4gPSAoRklMRSAqKSAwOworICAgIHpjb25mb3V0ID0gKEZJTEUgKikgMDsKKyNlbmRpZgorCisgICAgLyogRm9yIGZ1dHVyZSByZWZlcmVuY2U6IFNldCBlcnJubyBvbiBlcnJvciwgc2luY2Ugd2UgYXJlIGNhbGxlZCBieQorICAgICAqIHpjb25mbGV4X2luaXQoKQorICAgICAqLworICAgIHJldHVybiAwOworfQorCisvKiB6Y29uZmxleF9kZXN0cm95IGlzIGZvciBib3RoIHJlZW50cmFudCBhbmQgbm9uLXJlZW50cmFudCBzY2FubmVycy4gKi8KK2ludCB6Y29uZmxleF9kZXN0cm95ICAodm9pZCkKK3sKKyAgICAKKyAgICAvKiBQb3AgdGhlIGJ1ZmZlciBzdGFjaywgZGVzdHJveWluZyBlYWNoIGVsZW1lbnQuICovCisJd2hpbGUoWVlfQ1VSUkVOVF9CVUZGRVIpeworCQl6Y29uZl9kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSICApOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBOVUxMOworCQl6Y29uZnBvcF9idWZmZXJfc3RhdGUoKTsKKwl9CisKKwkvKiBEZXN0cm95IHRoZSBzdGFjayBpdHNlbGYuICovCisJemNvbmZmcmVlKCh5eV9idWZmZXJfc3RhY2spICk7CisJKHl5X2J1ZmZlcl9zdGFjaykgPSBOVUxMOworCisgICAgLyogUmVzZXQgdGhlIGdsb2JhbHMuIFRoaXMgaXMgaW1wb3J0YW50IGluIGEgbm9uLXJlZW50cmFudCBzY2FubmVyIHNvIHRoZSBuZXh0IHRpbWUKKyAgICAgKiB6Y29uZmxleCgpIGlzIGNhbGxlZCwgaW5pdGlhbGl6YXRpb24gd2lsbCBvY2N1ci4gKi8KKyAgICB5eV9pbml0X2dsb2JhbHMoICk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEludGVybmFsIHV0aWxpdHkgcm91dGluZXMuCisgKi8KKworI2lmbmRlZiB5eXRleHRfcHRyCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgKGNoYXIqIHMxLCB5eWNvbnN0IGNoYXIgKiBzMiwgaW50IG4gKQoreworCXJlZ2lzdGVyIGludCBpOworCWZvciAoIGkgPSAwOyBpIDwgbjsgKytpICkKKwkJczFbaV0gPSBzMltpXTsKK30KKyNlbmRpZgorCisjaWZkZWYgWVlfTkVFRF9TVFJMRU4KK3N0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4gKHl5Y29uc3QgY2hhciAqIHMgKQoreworCXJlZ2lzdGVyIGludCBuOworCWZvciAoIG4gPSAwOyBzW25dOyArK24gKQorCQk7CisKKwlyZXR1cm4gbjsKK30KKyNlbmRpZgorCit2b2lkICp6Y29uZmFsbG9jICh5eV9zaXplX3QgIHNpemUgKQoreworCXJldHVybiAodm9pZCAqKSBtYWxsb2MoIHNpemUgKTsKK30KKwordm9pZCAqemNvbmZyZWFsbG9jICAodm9pZCAqIHB0ciwgeXlfc2l6ZV90ICBzaXplICkKK3sKKwkvKiBUaGUgY2FzdCB0byAoY2hhciAqKSBpbiB0aGUgZm9sbG93aW5nIGFjY29tbW9kYXRlcyBib3RoCisJICogaW1wbGVtZW50YXRpb25zIHRoYXQgdXNlIGNoYXIqIGdlbmVyaWMgcG9pbnRlcnMsIGFuZCB0aG9zZQorCSAqIHRoYXQgdXNlIHZvaWQqIGdlbmVyaWMgcG9pbnRlcnMuICBJdCB3b3JrcyB3aXRoIHRoZSBsYXR0ZXIKKwkgKiBiZWNhdXNlIGJvdGggQU5TSSBDIGFuZCBDKysgYWxsb3cgY2FzdGxlc3MgYXNzaWdubWVudCBmcm9tCisJICogYW55IHBvaW50ZXIgdHlwZSB0byB2b2lkKiwgYW5kIGRlYWwgd2l0aCBhcmd1bWVudCBjb252ZXJzaW9ucworCSAqIGFzIHRob3VnaCBkb2luZyBhbiBhc3NpZ25tZW50LgorCSAqLworCXJldHVybiAodm9pZCAqKSByZWFsbG9jKCAoY2hhciAqKSBwdHIsIHNpemUgKTsKK30KKwordm9pZCB6Y29uZmZyZWUgKHZvaWQgKiBwdHIgKQoreworCWZyZWUoIChjaGFyICopIHB0ciApOwkvKiBzZWUgemNvbmZyZWFsbG9jKCkgZm9yIChjaGFyICopIGNhc3QgKi8KK30KKworI2RlZmluZSBZWVRBQkxFU19OQU1FICJ5eXRhYmxlcyIKKwordm9pZCB6Y29uZl9zdGFydGhlbHAodm9pZCkKK3sKKwluZXdfc3RyaW5nKCk7CisJbGFzdF90cyA9IGZpcnN0X3RzID0gMDsKKwlCRUdJTihIRUxQKTsKK30KKworc3RhdGljIHZvaWQgemNvbmZfZW5kaGVscCh2b2lkKQoreworCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCUJFR0lOKElOSVRJQUwpOworfQorCisvKgorICogVHJ5IHRvIG9wZW4gc3BlY2lmaWVkIGZpbGUgd2l0aCBmb2xsb3dpbmcgbmFtZXM6CisgKiAuL25hbWUKKyAqICQoc3JjdHJlZSkvbmFtZQorICogVGhlIGxhdHRlciBpcyB1c2VkIHdoZW4gc3JjdHJlZSBpcyBzZXBhcmF0ZSBmcm9tIG9ianRyZWUKKyAqIHdoZW4gY29tcGlsaW5nIHRoZSBrZXJuZWwuCisgKiBSZXR1cm4gTlVMTCBpZiBmaWxlIGlzIG5vdCBmb3VuZC4KKyAqLworRklMRSAqemNvbmZfZm9wZW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICplbnYsIGZ1bGxuYW1lW1BBVEhfTUFYKzFdOworCUZJTEUgKmY7CisKKwlmID0gZm9wZW4obmFtZSwgInIiKTsKKwlpZiAoIWYgJiYgbmFtZSAhPSBOVUxMICYmIG5hbWVbMF0gIT0gJy8nKSB7CisJCWVudiA9IGdldGVudihTUkNUUkVFKTsKKwkJaWYgKGVudikgeworCQkJc3ByaW50ZihmdWxsbmFtZSwgIiVzLyVzIiwgZW52LCBuYW1lKTsKKwkJCWYgPSBmb3BlbihmdWxsbmFtZSwgInIiKTsKKwkJfQorCX0KKwlyZXR1cm4gZjsKK30KKwordm9pZCB6Y29uZl9pbml0c2Nhbihjb25zdCBjaGFyICpuYW1lKQoreworCXpjb25maW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwlpZiAoIXpjb25maW4pIHsKKwkJcHJpbnRmKCJjYW4ndCBmaW5kIGZpbGUgJXNcbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KKworCWN1cnJlbnRfYnVmID0gbWFsbG9jKHNpemVvZigqY3VycmVudF9idWYpKTsKKwltZW1zZXQoY3VycmVudF9idWYsIDAsIHNpemVvZigqY3VycmVudF9idWYpKTsKKworCWN1cnJlbnRfZmlsZSA9IGZpbGVfbG9va3VwKG5hbWUpOworCWN1cnJlbnRfZmlsZS0+bGluZW5vID0gMTsKK30KKwordm9pZCB6Y29uZl9uZXh0ZmlsZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICppdGVyOworCXN0cnVjdCBmaWxlICpmaWxlID0gZmlsZV9sb29rdXAobmFtZSk7CisJc3RydWN0IGJ1ZmZlciAqYnVmID0gbWFsbG9jKHNpemVvZigqYnVmKSk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKKworCWN1cnJlbnRfYnVmLT5zdGF0ZSA9IFlZX0NVUlJFTlRfQlVGRkVSOworCXpjb25maW4gPSB6Y29uZl9mb3BlbihmaWxlLT5uYW1lKTsKKwlpZiAoIXpjb25maW4pIHsKKwkJcHJpbnRmKCIlczolZDogY2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIlxuIiwKKwkJICAgIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksIGZpbGUtPm5hbWUpOworCQlleGl0KDEpOworCX0KKwl6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyKHpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSkpOworCWJ1Zi0+cGFyZW50ID0gY3VycmVudF9idWY7CisJY3VycmVudF9idWYgPSBidWY7CisKKwlmb3IgKGl0ZXIgPSBjdXJyZW50X2ZpbGUtPnBhcmVudDsgaXRlcjsgaXRlciA9IGl0ZXItPnBhcmVudCApIHsKKwkJaWYgKCFzdHJjbXAoY3VycmVudF9maWxlLT5uYW1lLGl0ZXItPm5hbWUpICkgeworCQkJcHJpbnRmKCIlczolZDogcmVjdXJzaXZlIGluY2x1c2lvbiBkZXRlY3RlZC4gIgorCQkJICAgICAgICJJbmNsdXNpb24gcGF0aDpcbiAgY3VycmVudCBmaWxlIDogJyVzJ1xuIiwKKwkJCSAgICAgICB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLAorCQkJICAgICAgIHpjb25mX2N1cm5hbWUoKSk7CisJCQlpdGVyID0gY3VycmVudF9maWxlLT5wYXJlbnQ7CisJCQl3aGlsZSAoaXRlciAmJiBcCisJCQkgICAgICAgc3RyY21wKGl0ZXItPm5hbWUsY3VycmVudF9maWxlLT5uYW1lKSkgeworCQkJCXByaW50ZigiICBpbmNsdWRlZCBmcm9tOiAnJXM6JWQnXG4iLAorCQkJCSAgICAgICBpdGVyLT5uYW1lLCBpdGVyLT5saW5lbm8tMSk7CisJCQkJaXRlciA9IGl0ZXItPnBhcmVudDsKKwkJCX0KKwkJCWlmIChpdGVyKQorCQkJCXByaW50ZigiICBpbmNsdWRlZCBmcm9tOiAnJXM6JWQnXG4iLAorCQkJCSAgICAgICBpdGVyLT5uYW1lLCBpdGVyLT5saW5lbm8rMSk7CisJCQlleGl0KDEpOworCQl9CisJfQorCWZpbGUtPmxpbmVubyA9IDE7CisJZmlsZS0+cGFyZW50ID0gY3VycmVudF9maWxlOworCWN1cnJlbnRfZmlsZSA9IGZpbGU7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGZpbGUodm9pZCkKK3sKKwlzdHJ1Y3QgYnVmZmVyICpwYXJlbnQ7CisKKwljdXJyZW50X2ZpbGUgPSBjdXJyZW50X2ZpbGUtPnBhcmVudDsKKworCXBhcmVudCA9IGN1cnJlbnRfYnVmLT5wYXJlbnQ7CisJaWYgKHBhcmVudCkgeworCQlmY2xvc2UoemNvbmZpbik7CisJCXpjb25mX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIpOworCQl6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyKHBhcmVudC0+c3RhdGUpOworCX0KKwlmcmVlKGN1cnJlbnRfYnVmKTsKKwljdXJyZW50X2J1ZiA9IHBhcmVudDsKK30KKworaW50IHpjb25mX2xpbmVubyh2b2lkKQoreworCXJldHVybiBjdXJyZW50X3Bvcy5saW5lbm87Cit9CisKK2NvbnN0IGNoYXIgKnpjb25mX2N1cm5hbWUodm9pZCkKK3sKKwlyZXR1cm4gY3VycmVudF9wb3MuZmlsZSA/IGN1cnJlbnRfcG9zLmZpbGUtPm5hbWUgOiAiPG5vbmU+IjsKK30KKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQgYi9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZAppbmRleCA0YzU0OTVlLi4yMTFlMWEyIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZAorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZApAQCAtMSwxMCArMSw5IEBACi0KLS8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjQuMS4gICovCisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjMuICAqLwogCiAvKiBTa2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCiAgICAKLSAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisgICAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICAgCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ2LDcgKzQ1LDcgQEAKICNkZWZpbmUgWVlCSVNPTiAxCiAKIC8qIEJpc29uIHZlcnNpb24uICAqLwotI2RlZmluZSBZWUJJU09OX1ZFUlNJT04gIjIuNC4xIgorI2RlZmluZSBZWUJJU09OX1ZFUlNJT04gIjIuNC4zIgogCiAvKiBTa2VsZXRvbiBuYW1lLiAgKi8KICNkZWZpbmUgWVlTS0VMRVRPTl9OQU1FICJ5YWNjLmMiCkBAIC0xMDIsMjIgKzEwMSwxOCBAQAogc3RhdGljIHZvaWQgemNvbmZwcmludChjb25zdCBjaGFyICplcnIsIC4uLik7CiBzdGF0aWMgdm9pZCB6Y29uZl9lcnJvcihjb25zdCBjaGFyICplcnIsIC4uLik7CiBzdGF0aWMgdm9pZCB6Y29uZmVycm9yKGNvbnN0IGNoYXIgKmVycik7Ci1zdGF0aWMgYm9vbCB6Y29uZl9lbmR0b2tlbihzdHJ1Y3Qga2NvbmZfaWQgKmlkLCBpbnQgc3RhcnR0b2tlbiwgaW50IGVuZHRva2VuKTsKK3N0YXRpYyBib29sIHpjb25mX2VuZHRva2VuKGNvbnN0IHN0cnVjdCBrY29uZl9pZCAqaWQsIGludCBzdGFydHRva2VuLCBpbnQgZW5kdG9rZW4pOwogCiBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xfaGFzaFtTWU1CT0xfSEFTSFNJWkVdOwogCiBzdGF0aWMgc3RydWN0IG1lbnUgKmN1cnJlbnRfbWVudSwgKmN1cnJlbnRfZW50cnk7CiAKLSNkZWZpbmUgWVlERUJVRyAwCi0jaWYgWVlERUJVRwotI2RlZmluZSBZWUVSUk9SX1ZFUkJPU0UKLSNlbmRpZgogCiAKIAogLyogRW5hYmxpbmcgdHJhY2VzLiAgKi8KICNpZm5kZWYgWVlERUJVRwotIyBkZWZpbmUgWVlERUJVRyAwCisjIGRlZmluZSBZWURFQlVHIDEKICNlbmRpZgogCiAvKiBFbmFibGluZyB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzLiAgKi8KQEAgLTE4OCw3ICsxODMsNyBAQAogCXN0cnVjdCBzeW1ib2wgKnN5bWJvbDsKIAlzdHJ1Y3QgZXhwciAqZXhwcjsKIAlzdHJ1Y3QgbWVudSAqbWVudTsKLQlzdHJ1Y3Qga2NvbmZfaWQgKmlkOworCWNvbnN0IHN0cnVjdCBrY29uZl9pZCAqaWQ7CiAKIAogCkBAIC0yNTUsNyArMjUwLDcgQEAKICNkZWZpbmUgWVlTSVpFX01BWElNVU0gKChZWVNJWkVfVCkgLTEpCiAKICNpZm5kZWYgWVlfCi0jIGlmIFlZRU5BQkxFX05MUworIyBpZiBkZWZpbmVkIFlZRU5BQkxFX05MUyAmJiBZWUVOQUJMRV9OTFMKICMgIGlmIEVOQUJMRV9OTFMKICMgICBpbmNsdWRlIDxsaWJpbnRsLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KICMgICBkZWZpbmUgWVlfKG1zZ2lkKSBkZ2V0dGV4dCAoImJpc29uLXJ1bnRpbWUiLCBtc2dpZCkKQEAgLTUzNSwxOCArNTMwLDE4IEBACiAvKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5cmxpbmVbXSA9CiB7Ci0gICAgICAgMCwgICAxMDgsICAgMTA4LCAgIDEwOCwgICAxMTAsICAgMTEwLCAgIDExMiwgICAxMTQsICAgMTE1LCAgIDExNiwKLSAgICAgMTE3LCAgIDExOCwgICAxMTksICAgMTIzLCAgIDEyNywgICAxMjcsICAgMTI3LCAgIDEyNywgICAxMjcsICAgMTI3LAotICAgICAxMjcsICAgMTI3LCAgIDEzMSwgICAxMzIsICAgMTMzLCAgIDEzNCwgICAxMzUsICAgMTM2LCAgIDE0MCwgICAxNDEsCi0gICAgIDE0NywgICAxNTUsICAgMTYxLCAgIDE2OSwgICAxNzksICAgMTgxLCAgIDE4MiwgICAxODMsICAgMTg0LCAgIDE4NSwKLSAgICAgMTg2LCAgIDE4OSwgICAxOTcsICAgMjAzLCAgIDIxMywgICAyMTksICAgMjI1LCAgIDIyOCwgICAyMzAsICAgMjQxLAotICAgICAyNDIsICAgMjQ3LCAgIDI1NiwgICAyNjEsICAgMjY5LCAgIDI3MiwgICAyNzQsICAgMjc1LCAgIDI3NiwgICAyNzcsCi0gICAgIDI3OCwgICAyODEsICAgMjg3LCAgIDI5OCwgICAzMDQsICAgMzE0LCAgIDMxNiwgICAzMjEsICAgMzI5LCAgIDMzNywKLSAgICAgMzQwLCAgIDM0MiwgICAzNDMsICAgMzQ0LCAgIDM0OSwgICAzNTYsICAgMzYzLCAgIDM2OCwgICAzNzYsICAgMzc5LAotICAgICAzODEsICAgMzgyLCAgIDM4MywgICAzODYsICAgMzk0LCAgIDQwMSwgICA0MDgsICAgNDE0LCAgIDQyMSwgICA0MjMsCi0gICAgIDQyNCwgICA0MjUsICAgNDI4LCAgIDQzNiwgICA0MzgsICAgNDM5LCAgIDQ0MiwgICA0NDksICAgNDUxLCAgIDQ1NiwKLSAgICAgNDU3LCAgIDQ2MCwgICA0NjEsICAgNDYyLCAgIDQ2NiwgICA0NjcsICAgNDcwLCAgIDQ3MSwgICA0NzQsICAgNDc1LAotICAgICA0NzYsICAgNDc3LCAgIDQ3OCwgICA0NzksICAgNDgwLCAgIDQ4MywgICA0ODQsICAgNDg3LCAgIDQ4OAorICAgICAgIDAsICAgMTA0LCAgIDEwNCwgICAxMDQsICAgMTA2LCAgIDEwNiwgICAxMDgsICAgMTEwLCAgIDExMSwgICAxMTIsCisgICAgIDExMywgICAxMTQsICAgMTE1LCAgIDExOSwgICAxMjMsICAgMTIzLCAgIDEyMywgICAxMjMsICAgMTIzLCAgIDEyMywKKyAgICAgMTIzLCAgIDEyMywgICAxMjcsICAgMTI4LCAgIDEyOSwgICAxMzAsICAgMTMxLCAgIDEzMiwgICAxMzYsICAgMTM3LAorICAgICAxNDMsICAgMTUxLCAgIDE1NywgICAxNjUsICAgMTc1LCAgIDE3NywgICAxNzgsICAgMTc5LCAgIDE4MCwgICAxODEsCisgICAgIDE4MiwgICAxODUsICAgMTkzLCAgIDE5OSwgICAyMDksICAgMjE1LCAgIDIyMSwgICAyMjQsICAgMjI2LCAgIDIzNywKKyAgICAgMjM4LCAgIDI0MywgICAyNTIsICAgMjU3LCAgIDI2NSwgICAyNjgsICAgMjcwLCAgIDI3MSwgICAyNzIsICAgMjczLAorICAgICAyNzQsICAgMjc3LCAgIDI4MywgICAyOTQsICAgMzAwLCAgIDMxMCwgICAzMTIsICAgMzE3LCAgIDMyNSwgICAzMzMsCisgICAgIDMzNiwgICAzMzgsICAgMzM5LCAgIDM0MCwgICAzNDUsICAgMzUyLCAgIDM1OSwgICAzNjQsICAgMzcyLCAgIDM3NSwKKyAgICAgMzc3LCAgIDM3OCwgICAzNzksICAgMzgyLCAgIDM5MCwgICAzOTcsICAgNDA0LCAgIDQxMCwgICA0MTcsICAgNDE5LAorICAgICA0MjAsICAgNDIxLCAgIDQyNCwgICA0MzIsICAgNDM0LCAgIDQzNSwgICA0MzgsICAgNDQ1LCAgIDQ0NywgICA0NTIsCisgICAgIDQ1MywgICA0NTYsICAgNDU3LCAgIDQ1OCwgICA0NjIsICAgNDYzLCAgIDQ2NiwgICA0NjcsICAgNDcwLCAgIDQ3MSwKKyAgICAgNDcyLCAgIDQ3MywgICA0NzQsICAgNDc1LCAgIDQ3NiwgICA0NzksICAgNDgwLCAgIDQ4MywgICA0ODQKIH07CiAjZW5kaWYKIApAQCAtODA2LDkgKzgwMSwxOCBAQAogCiAvKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4gIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5CiAgICB0byBlYXNlIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgotICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLworICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICBIb3dldmVyLAorICAgWVlGQUlMIGFwcGVhcnMgdG8gYmUgaW4gdXNlLiAgTmV2ZXJ0aGVsZXNzLCBpdCBpcyBmb3JtYWxseSBkZXByZWNhdGVkCisgICBpbiBCaXNvbiAyLjQuMidzIE5FV1MgZW50cnksIHdoZXJlIGEgcGxhbiB0byBwaGFzZSBpdCBvdXQgaXMKKyAgIGRpc2N1c3NlZC4gICovCiAKICNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCisjaWYgZGVmaW5lZCBZWUZBSUwKKyAgLyogVGhpcyBpcyBoZXJlIHRvIHN1cHByZXNzIHdhcm5pbmdzIGZyb20gdGhlIEdDQyBjcHAncworICAgICAtV3VudXNlZC1tYWNyb3MuICBOb3JtYWxseSB3ZSBkb24ndCB3b3JyeSBhYm91dCB0aGF0IHdhcm5pbmcsIGJ1dAorICAgICBzb21lIHVzZXJzIGRvLCBhbmQgd2Ugd2FudCB0byBtYWtlIGl0IGVhc3kgZm9yIHVzZXJzIHRvIHJlbW92ZQorICAgICBZWUZBSUwgdXNlcywgd2hpY2ggd2lsbCBwcm9kdWNlIHdhcm5pbmdzIGZyb20gQmlzb24gMi41LiAgKi8KKyNlbmRpZgogCiAjZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKIApAQCAtODY1LDcgKzg2OSw3IEBACiAgICB3ZSB3b24ndCBicmVhayB1c2VyIGNvZGU6IHdoZW4gdGhlc2UgYXJlIHRoZSBsb2NhdGlvbnMgd2Uga25vdy4gICovCiAKICNpZm5kZWYgWVlfTE9DQVRJT05fUFJJTlQKLSMgaWYgWVlMVFlQRV9JU19UUklWSUFMCisjIGlmIGRlZmluZWQgWVlMVFlQRV9JU19UUklWSUFMICYmIFlZTFRZUEVfSVNfVFJJVklBTAogIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykJCQlcCiAgICAgIGZwcmludGYgKEZpbGUsICIlZC4lZC0lZC4lZCIsCQkJXAogCSAgICAgIChMb2MpLmZpcnN0X2xpbmUsIChMb2MpLmZpcnN0X2NvbHVtbiwJXApAQCAtMTc1Myw3ICsxNzU3LDcgQEAKICAgY2FzZSA0ODoKIAogICAgIHsKLQlzdHJ1Y3Qga2NvbmZfaWQgKmlkID0ga2NvbmZfaWRfbG9va3VwKCh5eXZzcFsoMikgLSAoMyldLnN0cmluZyksIHN0cmxlbigoeXl2c3BbKDIpIC0gKDMpXS5zdHJpbmcpKSk7CisJY29uc3Qgc3RydWN0IGtjb25mX2lkICppZCA9IGtjb25mX2lkX2xvb2t1cCgoeXl2c3BbKDIpIC0gKDMpXS5zdHJpbmcpLCBzdHJsZW4oKHl5dnNwWygyKSAtICgzKV0uc3RyaW5nKSkpOwogCWlmIChpZCAmJiBpZC0+ZmxhZ3MgJiBURl9PUFRJT04pCiAJCW1lbnVfYWRkX29wdGlvbihpZC0+dG9rZW4sICh5eXZzcFsoMykgLSAoMyldLnN0cmluZykpOwogCWVsc2UKQEAgLTIyNTgsMTAgKzIyNjIsOCBAQAogCW1vZHVsZXNfc3ltLT5mbGFncyB8PSBTWU1CT0xfQVVUTzsKIAlyb290bWVudS5wcm9tcHQgPSBtZW51X2FkZF9wcm9tcHQoUF9NRU5VLCAiTGludXggS2VybmVsIENvbmZpZ3VyYXRpb24iLCBOVUxMKTsKIAotI2lmIFlZREVCVUcKIAlpZiAoZ2V0ZW52KCJaQ09ORl9ERUJVRyIpKQogCQl6Y29uZmRlYnVnID0gMTsKLSNlbmRpZgogCXpjb25mcGFyc2UoKTsKIAlpZiAoemNvbmZuZXJycykKIAkJZXhpdCgxKTsKQEAgLTIzMDAsNyArMjMwMiw3IEBACiAJcmV0dXJuICI8dG9rZW4+IjsKIH0KIAotc3RhdGljIGJvb2wgemNvbmZfZW5kdG9rZW4oc3RydWN0IGtjb25mX2lkICppZCwgaW50IHN0YXJ0dG9rZW4sIGludCBlbmR0b2tlbikKK3N0YXRpYyBib29sIHpjb25mX2VuZHRva2VuKGNvbnN0IHN0cnVjdCBrY29uZl9pZCAqaWQsIGludCBzdGFydHRva2VuLCBpbnQgZW5kdG9rZW4pCiB7CiAJaWYgKGlkLT50b2tlbiAhPSBlbmR0b2tlbikgewogCQl6Y29uZl9lcnJvcigidW5leHBlY3RlZCAnJXMnIHdpdGhpbiAlcyBibG9jayIsCkBAIC0yMzQ1LDkgKzIzNDcsNyBAQAogCiBzdGF0aWMgdm9pZCB6Y29uZmVycm9yKGNvbnN0IGNoYXIgKmVycikKIHsKLSNpZiBZWURFQlVHCiAJZnByaW50ZihzdGRlcnIsICIlczolZDogJXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkgKyAxLCBlcnIpOwotI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIHByaW50X3F1b3RlZF9zdHJpbmcoRklMRSAqb3V0LCBjb25zdCBjaGFyICpzdHIpCkBAIC0yNDk2LDcgKzI0OTYsNyBAQAogCX0KIH0KIAotI2luY2x1ZGUgImxleC56Y29uZi5jIgorI2luY2x1ZGUgInpjb25mLmxleC5jIgogI2luY2x1ZGUgInV0aWwuYyIKICNpbmNsdWRlICJjb25mZGF0YS5jIgogI2luY2x1ZGUgImV4cHIuYyIKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi55IGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkKaW5kZXggNDlmYjRhYi4uYzM4Y2M1YSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkKQEAgLTI1LDE2ICsyNSwxMiBAQAogc3RhdGljIHZvaWQgemNvbmZwcmludChjb25zdCBjaGFyICplcnIsIC4uLik7CiBzdGF0aWMgdm9pZCB6Y29uZl9lcnJvcihjb25zdCBjaGFyICplcnIsIC4uLik7CiBzdGF0aWMgdm9pZCB6Y29uZmVycm9yKGNvbnN0IGNoYXIgKmVycik7Ci1zdGF0aWMgYm9vbCB6Y29uZl9lbmR0b2tlbihzdHJ1Y3Qga2NvbmZfaWQgKmlkLCBpbnQgc3RhcnR0b2tlbiwgaW50IGVuZHRva2VuKTsKK3N0YXRpYyBib29sIHpjb25mX2VuZHRva2VuKGNvbnN0IHN0cnVjdCBrY29uZl9pZCAqaWQsIGludCBzdGFydHRva2VuLCBpbnQgZW5kdG9rZW4pOwogCiBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xfaGFzaFtTWU1CT0xfSEFTSFNJWkVdOwogCiBzdGF0aWMgc3RydWN0IG1lbnUgKmN1cnJlbnRfbWVudSwgKmN1cnJlbnRfZW50cnk7CiAKLSNkZWZpbmUgWVlERUJVRyAwCi0jaWYgWVlERUJVRwotI2RlZmluZSBZWUVSUk9SX1ZFUkJPU0UKLSNlbmRpZgogJX0KICVleHBlY3QgMzAKIApAQCAtNDUsNyArNDEsNyBAQAogCXN0cnVjdCBzeW1ib2wgKnN5bWJvbDsKIAlzdHJ1Y3QgZXhwciAqZXhwcjsKIAlzdHJ1Y3QgbWVudSAqbWVudTsKLQlzdHJ1Y3Qga2NvbmZfaWQgKmlkOworCWNvbnN0IHN0cnVjdCBrY29uZl9pZCAqaWQ7CiB9CiAKICV0b2tlbiA8aWQ+VF9NQUlOTUVOVQpAQCAtMjI5LDcgKzIyNSw3IEBACiAJICAvKiBlbXB0eSAqLwogCXwgc3ltYm9sX29wdGlvbl9saXN0IFRfV09SRCBzeW1ib2xfb3B0aW9uX2FyZwogewotCXN0cnVjdCBrY29uZl9pZCAqaWQgPSBrY29uZl9pZF9sb29rdXAoJDIsIHN0cmxlbigkMikpOworCWNvbnN0IHN0cnVjdCBrY29uZl9pZCAqaWQgPSBrY29uZl9pZF9sb29rdXAoJDIsIHN0cmxlbigkMikpOwogCWlmIChpZCAmJiBpZC0+ZmxhZ3MgJiBURl9PUFRJT04pCiAJCW1lbnVfYWRkX29wdGlvbihpZC0+dG9rZW4sICQzKTsKIAllbHNlCkBAIC01MDMsMTAgKzQ5OSw4IEBACiAJbW9kdWxlc19zeW0tPmZsYWdzIHw9IFNZTUJPTF9BVVRPOwogCXJvb3RtZW51LnByb21wdCA9IG1lbnVfYWRkX3Byb21wdChQX01FTlUsICJMaW51eCBLZXJuZWwgQ29uZmlndXJhdGlvbiIsIE5VTEwpOwogCi0jaWYgWVlERUJVRwogCWlmIChnZXRlbnYoIlpDT05GX0RFQlVHIikpCiAJCXpjb25mZGVidWcgPSAxOwotI2VuZGlmCiAJemNvbmZwYXJzZSgpOwogCWlmICh6Y29uZm5lcnJzKQogCQlleGl0KDEpOwpAQCAtNTQ1LDcgKzUzOSw3IEBACiAJcmV0dXJuICI8dG9rZW4+IjsKIH0KIAotc3RhdGljIGJvb2wgemNvbmZfZW5kdG9rZW4oc3RydWN0IGtjb25mX2lkICppZCwgaW50IHN0YXJ0dG9rZW4sIGludCBlbmR0b2tlbikKK3N0YXRpYyBib29sIHpjb25mX2VuZHRva2VuKGNvbnN0IHN0cnVjdCBrY29uZl9pZCAqaWQsIGludCBzdGFydHRva2VuLCBpbnQgZW5kdG9rZW4pCiB7CiAJaWYgKGlkLT50b2tlbiAhPSBlbmR0b2tlbikgewogCQl6Y29uZl9lcnJvcigidW5leHBlY3RlZCAnJXMnIHdpdGhpbiAlcyBibG9jayIsCkBAIC01OTAsOSArNTg0LDcgQEAKIAogc3RhdGljIHZvaWQgemNvbmZlcnJvcihjb25zdCBjaGFyICplcnIpCiB7Ci0jaWYgWVlERUJVRwogCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpICsgMSwgZXJyKTsKLSNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBwcmludF9xdW90ZWRfc3RyaW5nKEZJTEUgKm91dCwgY29uc3QgY2hhciAqc3RyKQpAQCAtNzQxLDcgKzczMyw3IEBACiAJfQogfQogCi0jaW5jbHVkZSAibGV4Lnpjb25mLmMiCisjaW5jbHVkZSAiemNvbmYubGV4LmMiCiAjaW5jbHVkZSAidXRpbC5jIgogI2luY2x1ZGUgImNvbmZkYXRhLmMiCiAjaW5jbHVkZSAiZXhwci5jIgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta21ha2VmaWxlIGIvc2NyaXB0cy9ta21ha2VmaWxlCmluZGV4IDUzMjU0MjMuLjBjYzA0NDIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbWttYWtlZmlsZQorKysgYi9zY3JpcHRzL21rbWFrZWZpbGUKQEAgLTMwLDYgKzMwLDEzIEBACiBsYXN0d29yZCA9IFwkKHdvcmQgXCQod29yZHMgXCQoMSkpLFwkKDEpKQogbWFrZWRpciA6PSBcJChkaXIgXCQoY2FsbCBsYXN0d29yZCxcJChNQUtFRklMRV9MSVNUKSkpCiAKK2lmZXEgKCJcJChvcmlnaW4gVikiLCAiY29tbWFuZCBsaW5lIikKK1ZFUkJPU0UgOj0gXCQoVikKK2VuZGlmCitpZm5lcSAoXCQoVkVSQk9TRSksMSkKK1EgOj0gQAorZW5kaWYKKwogTUFLRUFSR1MgOj0gLUMgJDEKIE1BS0VBUkdTICs9IE89XCQoaWYgXCQocGF0c3Vic3QgLyUsLFwkKG1ha2VkaXIpKSxcJChDVVJESVIpLylcJChwYXRzdWJzdCAlLywlLFwkKG1ha2VkaXIpKQogCkBAIC00MCw3ICs0Nyw3IEBACiBhbGwJOj0gXCQoZmlsdGVyLW91dCBhbGwgTWFrZWZpbGUsXCQoTUFLRUNNREdPQUxTKSkKIAogYWxsOgotCVwkKE1BS0UpIFwkKE1BS0VBUkdTKSBcJChhbGwpCisJXCQoUSlcJChNQUtFKSBcJChNQUtFQVJHUykgXCQoYWxsKQogCiBNYWtlZmlsZTo7CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCA0MTNjNTM2Li5hNTA5ZmY4IDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC0yNTQsNiArMjU0LDI4IEBACiAJcmV0dXJuIGV4cG9ydF91bmtub3duOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqc2VjX25hbWUoc3RydWN0IGVsZl9pbmZvICplbGYsIGludCBzZWNpbmRleCk7CisKKyNkZWZpbmUgc3Ryc3RhcnRzKHN0ciwgcHJlZml4KSAoc3RybmNtcChzdHIsIHByZWZpeCwgc3RybGVuKHByZWZpeCkpID09IDApCisKK3N0YXRpYyBlbnVtIGV4cG9ydCBleHBvcnRfZnJvbV9zZWNuYW1lKHN0cnVjdCBlbGZfaW5mbyAqZWxmLCB1bnNpZ25lZCBpbnQgc2VjKQoreworCWNvbnN0IGNoYXIgKnNlY25hbWUgPSBzZWNfbmFtZShlbGYsIHNlYyk7CisKKwlpZiAoc3Ryc3RhcnRzKHNlY25hbWUsICJfX19rc3ltdGFiKyIpKQorCQlyZXR1cm4gZXhwb3J0X3BsYWluOworCWVsc2UgaWYgKHN0cnN0YXJ0cyhzZWNuYW1lLCAiX19fa3N5bXRhYl91bnVzZWQrIikpCisJCXJldHVybiBleHBvcnRfdW51c2VkOworCWVsc2UgaWYgKHN0cnN0YXJ0cyhzZWNuYW1lLCAiX19fa3N5bXRhYl9ncGwrIikpCisJCXJldHVybiBleHBvcnRfZ3BsOworCWVsc2UgaWYgKHN0cnN0YXJ0cyhzZWNuYW1lLCAiX19fa3N5bXRhYl91bnVzZWRfZ3BsKyIpKQorCQlyZXR1cm4gZXhwb3J0X3VudXNlZF9ncGw7CisJZWxzZSBpZiAoc3Ryc3RhcnRzKHNlY25hbWUsICJfX19rc3ltdGFiX2dwbF9mdXR1cmUrIikpCisJCXJldHVybiBleHBvcnRfZ3BsX2Z1dHVyZTsKKwllbHNlCisJCXJldHVybiBleHBvcnRfdW5rbm93bjsKK30KKwogc3RhdGljIGVudW0gZXhwb3J0IGV4cG9ydF9mcm9tX3NlYyhzdHJ1Y3QgZWxmX2luZm8gKmVsZiwgdW5zaWduZWQgaW50IHNlYykKIHsKIAlpZiAoc2VjID09IGVsZi0+ZXhwb3J0X3NlYykKQEAgLTU2Myw3ICs1ODUsMTIgQEAKIAkJCSAgICAgICBFbGZfU3ltICpzeW0sIGNvbnN0IGNoYXIgKnN5bW5hbWUpCiB7CiAJdW5zaWduZWQgaW50IGNyYzsKLQllbnVtIGV4cG9ydCBleHBvcnQgPSBleHBvcnRfZnJvbV9zZWMoaW5mbywgZ2V0X3NlY2luZGV4KGluZm8sIHN5bSkpOworCWVudW0gZXhwb3J0IGV4cG9ydDsKKworCWlmICghaXNfdm1saW51eChtb2QtPm5hbWUpICYmIHN0cm5jbXAoc3ltbmFtZSwgIl9fa3N5bXRhYiIsIDkpID09IDApCisJCWV4cG9ydCA9IGV4cG9ydF9mcm9tX3NlY25hbWUoaW5mbywgZ2V0X3NlY2luZGV4KGluZm8sIHN5bSkpOworCWVsc2UKKwkJZXhwb3J0ID0gZXhwb3J0X2Zyb21fc2VjKGluZm8sIGdldF9zZWNpbmRleChpbmZvLCBzeW0pKTsKIAogCXN3aXRjaCAoc3ltLT5zdF9zaG5keCkgewogCWNhc2UgU0hOX0NPTU1PTjoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGFja2FnZS9NYWtlZmlsZSBiL3NjcmlwdHMvcGFja2FnZS9NYWtlZmlsZQppbmRleCAwMDY5NjBlLi5iYzZhYTAwIDEwMDY0NAotLS0gYS9zY3JpcHRzL3BhY2thZ2UvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9wYWNrYWdlL01ha2VmaWxlCkBAIC0xMTgsMTAgKzExOCwxMiBAQAogCiBxdWlldF9jbWRfcGVyZl90YXIgPSBUQVIKICAgICAgIGNtZF9wZXJmX3RhciA9IFwKLWdpdCBhcmNoaXZlIC0tcHJlZml4PSQocGVyZi10YXIpLyBIRUFEXnt0cmVlfSAgICAgICAgICAgICAgICAgICAgICAgXAotCSQkKGNhdCAkKHNyY3RyZWUpL3Rvb2xzL3BlcmYvTUFOSUZFU1QpIC1vICQocGVyZi10YXIpLnRhcjsgIFwKK2dpdCAtLWdpdC1kaXI9JChzcmN0cmVlKS8uZ2l0IGFyY2hpdmUgLS1wcmVmaXg9JChwZXJmLXRhcikvICAgICAgICAgXAorCUhFQURee3RyZWV9ICQkKGNkICQoc3JjdHJlZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgICAgIGVjaG8gJCQoY2F0ICQoc3JjdHJlZSkvdG9vbHMvcGVyZi9NQU5JRkVTVCkpIFwKKwktbyAkKHBlcmYtdGFyKS50YXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiBta2RpciAtcCAkKHBlcmYtdGFyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWdpdCByZXYtcGFyc2UgSEVBRCA+ICQocGVyZi10YXIpL0hFQUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ2l0IC0tZ2l0LWRpcj0kKHNyY3RyZWUpLy5naXQgcmV2LXBhcnNlIEhFQUQgPiAkKHBlcmYtdGFyKS9IRUFEOyAgICBcCiB0YXIgcmYgJChwZXJmLXRhcikudGFyICQocGVyZi10YXIpL0hFQUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHJtIC1yICQocGVyZi10YXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogJChpZiAkKGZpbmRzdHJpbmcgdGFyLXNyYywkQCksLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9kb21haW4uYyBiL3NlY3VyaXR5L2FwcGFybW9yL2RvbWFpbi5jCmluZGV4IGM4MjVjNmUuLjczMTJiZjkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2FwcGFybW9yL2RvbWFpbi5jCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2RvbWFpbi5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJaW50IGVycm9yID0gMDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQl0cmFjZXIgPSB0cmFjZWhvb2tfdHJhY2VyX3Rhc2sodGFzayk7CisJdHJhY2VyID0gcHRyYWNlX3BhcmVudCh0YXNrKTsKIAlpZiAodHJhY2VyKSB7CiAJCS8qIHJlbGVhc2VkIGJlbG93ICovCiAJCWNyZWQgPSBnZXRfdGFza19jcmVkKHRyYWNlcik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9saWIuYyBiL3NlY3VyaXR5L2FwcGFybW9yL2xpYi5jCmluZGV4IDUwNmQyYmEuLmI4MmUzODMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2FwcGFybW9yL2xpYi5jCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2xpYi5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKiBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9sc20uYyBiL3NlY3VyaXR5L2FwcGFybW9yL2xzbS5jCmluZGV4IGVjMWJjZWMuLjNkMmZkMTQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2FwcGFybW9yL2xzbS5jCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2xzbS5jCkBAIC02MTIsNyArNjEyLDcgQEAKIHN0YXRpYyBpbnQgYXBwYXJtb3JfdGFza19zZXRybGltaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAogCQl1bnNpZ25lZCBpbnQgcmVzb3VyY2UsIHN0cnVjdCBybGltaXQgKm5ld19ybGltKQogewotCXN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlID0gYWFfY3VycmVudF9wcm9maWxlKCk7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUgPSBfX2FhX2N1cnJlbnRfcHJvZmlsZSgpOwogCWludCBlcnJvciA9IDA7CiAKIAlpZiAoIXVuY29uZmluZWQocHJvZmlsZSkpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9jYXBhYmlsaXR5LmMgYi9zZWN1cml0eS9jYXBhYmlsaXR5LmMKaW5kZXggYmJiNTExNS4uMjk4NGVhNCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvY2FwYWJpbGl0eS5jCisrKyBiL3NlY3VyaXR5L2NhcGFiaWxpdHkuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2FwX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGZsYWdzKQorc3RhdGljIGludCBjYXBfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2RldmljZV9jZ3JvdXAuYyBiL3NlY3VyaXR5L2RldmljZV9jZ3JvdXAuYwppbmRleCBjZDFmNzc5Li40NDUwZmJlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9kZXZpY2VfY2dyb3VwLmMKKysrIGIvc2VjdXJpdHkvZGV2aWNlX2Nncm91cC5jCkBAIC0xMjUsMTQgKzEyNSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHdoaXRlbGlzdF9pdGVtX2ZyZWUoc3RydWN0IHJjdV9oZWFkICpyY3UpCi17Ci0Jc3RydWN0IGRldl93aGl0ZWxpc3RfaXRlbSAqaXRlbTsKLQotCWl0ZW0gPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgZGV2X3doaXRlbGlzdF9pdGVtLCByY3UpOwotCWtmcmVlKGl0ZW0pOwotfQotCiAvKgogICogY2FsbGVkIHVuZGVyIGRldmNncm91cF9tdXRleAogICovCkBAIC0xNTUsNyArMTQ3LDcgQEAKIAkJd2Fsay0+YWNjZXNzICY9IH53aC0+YWNjZXNzOwogCQlpZiAoIXdhbGstPmFjY2VzcykgewogCQkJbGlzdF9kZWxfcmN1KCZ3YWxrLT5saXN0KTsKLQkJCWNhbGxfcmN1KCZ3YWxrLT5yY3UsIHdoaXRlbGlzdF9pdGVtX2ZyZWUpOworCQkJa2ZyZWVfcmN1KHdhbGssIHJjdSk7CiAJCX0KIAl9CiB9CkBAIC00NzQsMTcgKzQ2NiwxMSBAQAogCS5zdWJzeXNfaWQgPSBkZXZpY2VzX3N1YnN5c19pZCwKIH07CiAKLWludCBkZXZjZ3JvdXBfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKK2ludCBfX2RldmNncm91cF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCXN0cnVjdCBkZXZfY2dyb3VwICpkZXZfY2dyb3VwOwogCXN0cnVjdCBkZXZfd2hpdGVsaXN0X2l0ZW0gKndoOwogCi0JZGV2X3QgZGV2aWNlID0gaW5vZGUtPmlfcmRldjsKLQlpZiAoIWRldmljZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFTX0lTQkxLKGlub2RlLT5pX21vZGUpICYmICFTX0lTQ0hSKGlub2RlLT5pX21vZGUpKQotCQlyZXR1cm4gMDsKLQogCXJjdV9yZWFkX2xvY2soKTsKIAogCWRldl9jZ3JvdXAgPSB0YXNrX2RldmNncm91cChjdXJyZW50KTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMva2V5cmluZy5jIGIvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMKaW5kZXggYTA2ZmZhYi4uMzBlMjQyZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMKKysrIGIvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMKQEAgLTE1NSw3ICsxNTUsNiBAQAogCX0KIAogCWtsaXN0ID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGtleXJpbmctPnBheWxvYWQuc3Vic2NyaXB0aW9ucywKLQkJCQkgICAgICByY3VfcmVhZF9sb2NrX2hlbGQoKSB8fAogCQkJCSAgICAgIGF0b21pY19yZWFkKCZrZXlyaW5nLT51c2FnZSkgPT0gMCk7CiAJaWYgKGtsaXN0KSB7CiAJCWZvciAobG9vcCA9IGtsaXN0LT5ua2V5cyAtIDE7IGxvb3AgPj0gMDsgbG9vcC0tKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jIGIvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jCmluZGV4IGQzMTg2MmUuLjgyNDY1MzIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYworKysgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMKQEAgLTcxLDkgKzcxLDggQEAKICAqIFRoaXMgaXMgY2FsbGVkIGluIGNvbnRleHQgb2YgZnJlc2hseSBmb3JrZWQga3RocmVhZCBiZWZvcmUga2VybmVsX2V4ZWN2ZSgpLAogICogc28gd2UgY2FuIHNpbXBseSBpbnN0YWxsIHRoZSBkZXNpcmVkIHNlc3Npb25fa2V5cmluZyBhdCB0aGlzIHBvaW50LgogICovCi1zdGF0aWMgaW50IHVtaF9rZXlzX2luaXQoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgdW1oX2tleXNfaW5pdChzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvLCBzdHJ1Y3QgY3JlZCAqY3JlZCkKIHsKLQlzdHJ1Y3QgY3JlZCAqY3JlZCA9IChzdHJ1Y3QgY3JlZCopY3VycmVudF9jcmVkKCk7CiAJc3RydWN0IGtleSAqa2V5cmluZyA9IGluZm8tPmRhdGE7CiAKIAlyZXR1cm4gaW5zdGFsbF9zZXNzaW9uX2tleXJpbmdfdG9fY3JlZChjcmVkLCBrZXlyaW5nKTsKQEAgLTQ3MCw3ICs0NjksNyBAQAogCX0gZWxzZSBpZiAocmV0ID09IC1FSU5QUk9HUkVTUykgewogCQlyZXQgPSAwOwogCX0gZWxzZSB7Ci0JCWtleSA9IEVSUl9QVFIocmV0KTsKKwkJZ290byBjb3VsZG50X2FsbG9jX2tleTsKIAl9CiAKIAlrZXlfcHV0KGRlc3Rfa2V5cmluZyk7CkBAIC00ODAsNiArNDc5LDcgQEAKIGNvbnN0cnVjdGlvbl9mYWlsZWQ6CiAJa2V5X25lZ2F0ZV9hbmRfbGluayhrZXksIGtleV9uZWdhdGl2ZV90aW1lb3V0LCBOVUxMLCBOVUxMKTsKIAlrZXlfcHV0KGtleSk7Citjb3VsZG50X2FsbG9jX2tleToKIAlrZXlfcHV0KGRlc3Rfa2V5cmluZyk7CiAJa2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlY3VyaXR5LmMgYi9zZWN1cml0eS9zZWN1cml0eS5jCmluZGV4IDRiYTZkNGMuLjBlNGZjY2YgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlY3VyaXR5LmMKKysrIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwpAQCAtNTE4LDE0ICs1MTgsNyBAQAogewogCWlmICh1bmxpa2VseShJU19QUklWQVRFKGlub2RlKSkpCiAJCXJldHVybiAwOwotCXJldHVybiBzZWN1cml0eV9vcHMtPmlub2RlX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIDApOwotfQotCi1pbnQgc2VjdXJpdHlfaW5vZGVfZXhlY19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlpZiAodW5saWtlbHkoSVNfUFJJVkFURShpbm9kZSkpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gc2VjdXJpdHlfb3BzLT5pbm9kZV9wZXJtaXNzaW9uKGlub2RlLCBNQVlfRVhFQywgZmxhZ3MpOworCXJldHVybiBzZWN1cml0eV9vcHMtPmlub2RlX3Blcm1pc3Npb24oaW5vZGUsIG1hc2spOwogfQogCiBpbnQgc2VjdXJpdHlfaW5vZGVfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvYXZjLmMgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCmluZGV4IGQ1MTViMjEuLmRjYTFjMjIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9hdmMuYwpAQCAtNTI3LDcgKzUyNyw3IEBACiAJICogaGFwcGVuZWQgYSBsaXR0bGUgbGF0ZXIuCiAJICovCiAJaWYgKChhLT50eXBlID09IExTTV9BVURJVF9EQVRBX0lOT0RFKSAmJgotCSAgICAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkpCisJICAgIChmbGFncyAmIE1BWV9OT1RfQkxPQ0spKQogCQlyZXR1cm4gLUVDSElMRDsKIAogCWEtPnNlbGludXhfYXVkaXRfZGF0YS50Y2xhc3MgPSB0Y2xhc3M7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggYTBkMzg0NS4uOWY0Yzc3ZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtMTQ3Niw3ICsxNDc2LDYgQEAKIAkJCSAgdW5zaWduZWQgZmxhZ3MpCiB7CiAJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYzsKLQlzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgYWQ7CiAJdTMyIHNpZDsKIAogCXZhbGlkYXRlX2NyZWRzKGNyZWQpOwpAQCAtMTQ4NywxNSArMTQ4NiwyMSBAQAogCXNpZCA9IGNyZWRfc2lkKGNyZWQpOwogCWlzZWMgPSBpbm9kZS0+aV9zZWN1cml0eTsKIAotCWlmICghYWRwKSB7Ci0JCWFkcCA9ICZhZDsKLQkJQ09NTU9OX0FVRElUX0RBVEFfSU5JVCgmYWQsIElOT0RFKTsKLQkJYWQudS5pbm9kZSA9IGlub2RlOwotCX0KLQogCXJldHVybiBhdmNfaGFzX3Blcm1fZmxhZ3Moc2lkLCBpc2VjLT5zaWQsIGlzZWMtPnNjbGFzcywgcGVybXMsIGFkcCwgZmxhZ3MpOwogfQogCitzdGF0aWMgaW50IGlub2RlX2hhc19wZXJtX25vYWRwKGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJdTMyIHBlcm1zLAorCQkJCXVuc2lnbmVkIGZsYWdzKQoreworCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSBhZDsKKworCUNPTU1PTl9BVURJVF9EQVRBX0lOSVQoJmFkLCBJTk9ERSk7CisJYWQudS5pbm9kZSA9IGlub2RlOworCXJldHVybiBpbm9kZV9oYXNfcGVybShjcmVkLCBpbm9kZSwgcGVybXMsICZhZCwgZmxhZ3MpOworfQorCiAvKiBTYW1lIGFzIGlub2RlX2hhc19wZXJtLCBidXQgcGFzcyBleHBsaWNpdCBhdWRpdCBkYXRhIGNvbnRhaW5pbmcKICAgIHRoZSBkZW50cnkgdG8gaGVscCB0aGUgYXVkaXRpbmcgY29kZSB0byBtb3JlIGVhc2lseSBnZW5lcmF0ZSB0aGUKICAgIHBhdGhuYW1lIGlmIG5lZWRlZC4gKi8KQEAgLTIwNDgsNyArMjA1Myw3IEBACiAJCQl1MzIgcHRzaWQgPSAwOwogCiAJCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCQl0cmFjZXIgPSB0cmFjZWhvb2tfdHJhY2VyX3Rhc2soY3VycmVudCk7CisJCQl0cmFjZXIgPSBwdHJhY2VfcGFyZW50KGN1cnJlbnQpOwogCQkJaWYgKGxpa2VseSh0cmFjZXIgIT0gTlVMTCkpIHsKIAkJCQlzZWMgPSBfX3Rhc2tfY3JlZCh0cmFjZXIpLT5zZWN1cml0eTsKIAkJCQlwdHNpZCA9IHNlYy0+c2lkOwpAQCAtMjEyMiw4ICsyMTI3LDggQEAKIAkJCQkJCXN0cnVjdCB0dHlfZmlsZV9wcml2YXRlLCBsaXN0KTsKIAkJCWZpbGUgPSBmaWxlX3ByaXYtPmZpbGU7CiAJCQlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JCQlpZiAoaW5vZGVfaGFzX3Blcm0oY3JlZCwgaW5vZGUsCi0JCQkJCSAgIEZJTEVfX1JFQUQgfCBGSUxFX19XUklURSwgTlVMTCwgMCkpIHsKKwkJCWlmIChpbm9kZV9oYXNfcGVybV9ub2FkcChjcmVkLCBpbm9kZSwKKwkJCQkJICAgRklMRV9fUkVBRCB8IEZJTEVfX1dSSVRFLCAwKSkgewogCQkJCWRyb3BfdHR5ID0gMTsKIAkJCX0KIAkJfQpAQCAtMjY1NCwxMiArMjY1OSwxMyBAQAogCXJldHVybiBkZW50cnlfaGFzX3Blcm0oY3JlZCwgZGVudHJ5LCBGSUxFX19SRUFEKTsKIH0KIAotc3RhdGljIGludCBzZWxpbnV4X2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGZsYWdzKQorc3RhdGljIGludCBzZWxpbnV4X2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCiB7CiAJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQgPSBjdXJyZW50X2NyZWQoKTsKIAlzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgYWQ7CiAJdTMyIHBlcm1zOwogCWJvb2wgZnJvbV9hY2Nlc3M7CisJdW5zaWduZWQgZmxhZ3MgPSBtYXNrICYgTUFZX05PVF9CTE9DSzsKIAogCWZyb21fYWNjZXNzID0gbWFzayAmIE1BWV9BQ0NFU1M7CiAJbWFzayAmPSAoTUFZX1JFQUR8TUFZX1dSSVRFfE1BWV9FWEVDfE1BWV9BUFBFTkQpOwpAQCAtMzIyOCw3ICszMjM0LDcgQEAKIAkgKiBuZXcgaW5vZGUgbGFiZWwgb3IgbmV3IHBvbGljeS4KIAkgKiBUaGlzIGNoZWNrIGlzIG5vdCByZWR1bmRhbnQgLSBkbyBub3QgcmVtb3ZlLgogCSAqLwotCXJldHVybiBpbm9kZV9oYXNfcGVybShjcmVkLCBpbm9kZSwgb3Blbl9maWxlX3RvX2F2KGZpbGUpLCBOVUxMLCAwKTsKKwlyZXR1cm4gaW5vZGVfaGFzX3Blcm1fbm9hZHAoY3JlZCwgaW5vZGUsIG9wZW5fZmlsZV90b19hdihmaWxlKSwgMCk7CiB9CiAKIC8qIHRhc2sgc2VjdXJpdHkgb3BlcmF0aW9ucyAqLwpAQCAtNTMxNCw3ICs1MzIwLDcgQEAKIAkJICAgT3RoZXJ3aXNlLCBsZWF2ZSBTSUQgdW5jaGFuZ2VkIGFuZCBmYWlsLiAqLwogCQlwdHNpZCA9IDA7CiAJCXRhc2tfbG9jayhwKTsKLQkJdHJhY2VyID0gdHJhY2Vob29rX3RyYWNlcl90YXNrKHApOworCQl0cmFjZXIgPSBwdHJhY2VfcGFyZW50KHApOwogCQlpZiAodHJhY2VyKQogCQkJcHRzaWQgPSB0YXNrX3NpZCh0cmFjZXIpOwogCQl0YXNrX3VubG9jayhwKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvbmV0bm9kZS5jIGIvc2VjdXJpdHkvc2VsaW51eC9uZXRub2RlLmMKaW5kZXggMzYxODI1MS4uOGI2OTFhOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9uZXRub2RlLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9uZXRub2RlLmMKQEAgLTY5LDIyICs2OSw2IEBACiBzdGF0aWMgc3RydWN0IHNlbF9uZXRub2RlX2JrdCBzZWxfbmV0bm9kZV9oYXNoW1NFTF9ORVROT0RFX0hBU0hfU0laRV07CiAKIC8qKgotICogc2VsX25ldG5vZGVfZnJlZSAtIEZyZWVzIGEgbm9kZSBlbnRyeQotICogQHA6IHRoZSBlbnRyeSdzIFJDVSBmaWVsZAotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIGEgY2FsbGJhY2sgdG8gdGhlIGNhbGxfcmN1KCkKLSAqIGZ1bmN0aW9uIHNvIHRoYXQgbWVtb3J5IGFsbG9jYXRlZCB0byBhIGhhc2ggdGFibGUgbm9kZSBlbnRyeSBjYW4gYmUKLSAqIHJlbGVhc2VkIHNhZmVseS4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIHNlbF9uZXRub2RlX2ZyZWUoc3RydWN0IHJjdV9oZWFkICpwKQotewotCXN0cnVjdCBzZWxfbmV0bm9kZSAqbm9kZSA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3Qgc2VsX25ldG5vZGUsIHJjdSk7Ci0Ja2ZyZWUobm9kZSk7Ci19Ci0KLS8qKgogICogc2VsX25ldG5vZGVfaGFzaGZuX2lwdjQgLSBJUHY0IGhhc2hpbmcgZnVuY3Rpb24gZm9yIHRoZSBub2RlIHRhYmxlCiAgKiBAYWRkcjogSVB2NCBhZGRyZXNzCiAgKgpAQCAtMTkzLDcgKzE3Nyw3IEBACiAJCQlyY3VfZGVyZWZlcmVuY2Uoc2VsX25ldG5vZGVfaGFzaFtpZHhdLmxpc3QucHJldiksCiAJCQlzdHJ1Y3Qgc2VsX25ldG5vZGUsIGxpc3QpOwogCQlsaXN0X2RlbF9yY3UoJnRhaWwtPmxpc3QpOwotCQljYWxsX3JjdSgmdGFpbC0+cmN1LCBzZWxfbmV0bm9kZV9mcmVlKTsKKwkJa2ZyZWVfcmN1KHRhaWwsIHJjdSk7CiAJfSBlbHNlCiAJCXNlbF9uZXRub2RlX2hhc2hbaWR4XS5zaXplKys7CiB9CkBAIC0zMDYsNyArMjkwLDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5vZGUsIG5vZGVfdG1wLAogCQkJCQkgJnNlbF9uZXRub2RlX2hhc2hbaWR4XS5saXN0LCBsaXN0KSB7CiAJCQkJbGlzdF9kZWxfcmN1KCZub2RlLT5saXN0KTsKLQkJCQljYWxsX3JjdSgmbm9kZS0+cmN1LCBzZWxfbmV0bm9kZV9mcmVlKTsKKwkJCQlrZnJlZV9yY3Uobm9kZSwgcmN1KTsKIAkJfQogCQlzZWxfbmV0bm9kZV9oYXNoW2lkeF0uc2l6ZSA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9uZXRwb3J0LmMgYi9zZWN1cml0eS9zZWxpbnV4L25ldHBvcnQuYwppbmRleCBjZmUyZDcyLi5hZTc2ZTI5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L25ldHBvcnQuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L25ldHBvcnQuYwpAQCAtNjgsMjIgKzY4LDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2VsX25ldHBvcnRfYmt0IHNlbF9uZXRwb3J0X2hhc2hbU0VMX05FVFBPUlRfSEFTSF9TSVpFXTsKIAogLyoqCi0gKiBzZWxfbmV0cG9ydF9mcmVlIC0gRnJlZXMgYSBwb3J0IGVudHJ5Ci0gKiBAcDogdGhlIGVudHJ5J3MgUkNVIGZpZWxkCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgYSBjYWxsYmFjayB0byB0aGUgY2FsbF9yY3UoKQotICogZnVuY3Rpb24gc28gdGhhdCBtZW1vcnkgYWxsb2NhdGVkIHRvIGEgaGFzaCB0YWJsZSBwb3J0IGVudHJ5IGNhbiBiZQotICogcmVsZWFzZWQgc2FmZWx5LgotICoKLSAqLwotc3RhdGljIHZvaWQgc2VsX25ldHBvcnRfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKnApCi17Ci0Jc3RydWN0IHNlbF9uZXRwb3J0ICpwb3J0ID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBzZWxfbmV0cG9ydCwgcmN1KTsKLQlrZnJlZShwb3J0KTsKLX0KLQotLyoqCiAgKiBzZWxfbmV0cG9ydF9oYXNoZm4gLSBIYXNoaW5nIGZ1bmN0aW9uIGZvciB0aGUgcG9ydCB0YWJsZQogICogQHBudW06IHBvcnQgbnVtYmVyCiAgKgpAQCAtMTQyLDcgKzEyNiw3IEBACiAJCQlyY3VfZGVyZWZlcmVuY2Uoc2VsX25ldHBvcnRfaGFzaFtpZHhdLmxpc3QucHJldiksCiAJCQlzdHJ1Y3Qgc2VsX25ldHBvcnQsIGxpc3QpOwogCQlsaXN0X2RlbF9yY3UoJnRhaWwtPmxpc3QpOwotCQljYWxsX3JjdSgmdGFpbC0+cmN1LCBzZWxfbmV0cG9ydF9mcmVlKTsKKwkJa2ZyZWVfcmN1KHRhaWwsIHJjdSk7CiAJfSBlbHNlCiAJCXNlbF9uZXRwb3J0X2hhc2hbaWR4XS5zaXplKys7CiB9CkBAIC0yNDEsNyArMjI1LDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcnQsIHBvcnRfdG1wLAogCQkJCQkgJnNlbF9uZXRwb3J0X2hhc2hbaWR4XS5saXN0LCBsaXN0KSB7CiAJCQlsaXN0X2RlbF9yY3UoJnBvcnQtPmxpc3QpOwotCQkJY2FsbF9yY3UoJnBvcnQtPnJjdSwgc2VsX25ldHBvcnRfZnJlZSk7CisJCQlrZnJlZV9yY3UocG9ydCwgcmN1KTsKIAkJfQogCQlzZWxfbmV0cG9ydF9oYXNoW2lkeF0uc2l6ZSA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKaW5kZXggNzdkNDQxMy4uZGU3OTAwZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKIC8qIHNlbGludXhmcyBwc2V1ZG8gZmlsZXN5c3RlbSBmb3IgZXhwb3J0aW5nIHRoZSBzZWN1cml0eSBwb2xpY3kgQVBJLgogICAgQmFzZWQgb24gdGhlIHByb2MgY29kZSBhbmQgdGhlIGZzL25mc2QvbmZzY3RsLmMgY29kZS4gKi8KQEAgLTc1MSw2ICs3NTIsMTQgQEAKIAlyZXR1cm4gbGVuZ3RoOwogfQogCitzdGF0aWMgaW5saW5lIGludCBoZXhjb2RlX3RvX2ludChpbnQgY29kZSkgeworCWlmIChjb2RlID09ICdcMCcgfHwgIWlzeGRpZ2l0KGNvZGUpKQorCQlyZXR1cm4gLTE7CisJaWYgKGlzZGlnaXQoY29kZSkpCisJCXJldHVybiBjb2RlIC0gJzAnOworCXJldHVybiB0b2xvd2VyKGNvZGUpIC0gJ2EnICsgMTA7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV9jcmVhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJY2hhciAqc2NvbiA9IE5VTEwsICp0Y29uID0gTlVMTDsKQEAgLTc4NSw4ICs3OTQsMzQgQEAKIAluYXJncyA9IHNzY2FuZihidWYsICIlcyAlcyAlaHUgJXMiLCBzY29uLCB0Y29uLCAmdGNsYXNzLCBuYW1lYnVmKTsKIAlpZiAobmFyZ3MgPCAzIHx8IG5hcmdzID4gNCkKIAkJZ290byBvdXQ7Ci0JaWYgKG5hcmdzID09IDQpCisJaWYgKG5hcmdzID09IDQpIHsKKwkJLyoKKwkJICogSWYgYW5kIHdoZW4gdGhlIG5hbWUgb2YgbmV3IG9iamVjdCB0byBiZSBxdWVyaWVkIGNvbnRhaW5zCisJCSAqIGVpdGhlciB3aGl0ZXNwYWNlIG9yIG11bHRpYnl0ZSBjaGFyYWN0ZXJzLCB0aGV5IHNoYWxsIGJlCisJCSAqIGVuY29kZWQgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2UtZW5jb2RpbmcgcnVsZS4KKwkJICogSWYgbm90IGVuY29kZWQsIHRoZSBzc2NhbmYgbG9naWMgcGlja3MgdXAgb25seSBsZWZ0LWhhbGYKKwkJICogb2YgdGhlIHN1cHBsaWVkIG5hbWU7IHNwbGl0dGVkIGJ5IGEgd2hpdGVzcGFjZSB1bmV4cGVjdGVkbHkuCisJCSAqLworCQljaGFyICAgKnIsICp3OworCQlpbnQgICAgIGMxLCBjMjsKKworCQlyID0gdyA9IG5hbWVidWY7CisJCWRvIHsKKwkJCWMxID0gKnIrKzsKKwkJCWlmIChjMSA9PSAnKycpCisJCQkJYzEgPSAnICc7CisJCQllbHNlIGlmIChjMSA9PSAnJScpIHsKKwkJCQlpZiAoKGMxID0gaGV4Y29kZV90b19pbnQoKnIrKykpIDwgMCkKKwkJCQkJZ290byBvdXQ7CisJCQkJaWYgKChjMiA9IGhleGNvZGVfdG9faW50KCpyKyspKSA8IDApCisJCQkJCWdvdG8gb3V0OworCQkJCWMxID0gKGMxIDw8IDQpIHwgYzI7CisJCQl9CisJCQkqdysrID0gYzE7CisJCX0gd2hpbGUgKGMxICE9ICdcMCcpOworCiAJCW9iam5hbWUgPSBuYW1lYnVmOworCX0KIAogCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHNjb24sIHN0cmxlbihzY29uKSArIDEsICZzc2lkKTsKIAlpZiAobGVuZ3RoKQpAQCAtMTk0OSw2ICsxOTg0LDcgQEAKIHZvaWQgZXhpdF9zZWxfZnModm9pZCkKIHsKIAlrb2JqZWN0X3B1dChzZWxpbnV4ZnNfa29iaik7CisJa2Vybl91bm1vdW50KHNlbGludXhmc19tb3VudCk7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzZWxfZnNfdHlwZSk7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYwppbmRleCAxMDJlOWVjLi5kMjQ2YWNhIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCkBAIC0zMjIyLDYgKzMyMjIsOSBAQAogCV9fbGUzMiBidWZbMV07CiAJaW50IHJjOwogCisJaWYgKHAtPnBvbGljeXZlcnMgPCBQT0xJQ1lEQl9WRVJTSU9OX0ZJTEVOQU1FX1RSQU5TKQorCQlyZXR1cm4gMDsKKwogCW5lbCA9IDA7CiAJcmMgPSBoYXNodGFiX21hcChwLT5maWxlbmFtZV90cmFucywgaGFzaHRhYl9jbnQsICZuZWwpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKaW5kZXggOTgzMWEzOS4uZjM3NWViMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKQEAgLTY4OSw5ICs2ODksMTAgQEAKICAqCiAgKiBSZXR1cm5zIDAgaWYgYWNjZXNzIGlzIHBlcm1pdHRlZCwgLUVBQ0NFUyBvdGhlcndpc2UKICAqLwotc3RhdGljIGludCBzbWFja19pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBmbGFncykKK3N0YXRpYyBpbnQgc21hY2tfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKIHsKIAlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisJaW50IG5vX2Jsb2NrID0gbWFzayAmIE1BWV9OT1RfQkxPQ0s7CiAKIAltYXNrICY9IChNQVlfUkVBRHxNQVlfV1JJVEV8TUFZX0VYRUN8TUFZX0FQUEVORCk7CiAJLyoKQEAgLTcwMSw3ICs3MDIsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIE1heSBiZSBkcm9wcGFibGUgYWZ0ZXIgYXVkaXQgKi8KLQlpZiAoZmxhZ3MgJiBJUEVSTV9GTEFHX1JDVSkKKwlpZiAobm9fYmxvY2spCiAJCXJldHVybiAtRUNISUxEOwogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX0lOT0RFKTsKIAlzbWtfYWRfc2V0ZmllbGRfdV9mc19pbm9kZSgmYWQsIGlub2RlKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9tb3VudC5jIGIvc2VjdXJpdHkvdG9tb3lvL21vdW50LmMKaW5kZXggMTYyYTg2NC4uOWZjMmUxNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL21vdW50LmMKKysrIGIvc2VjdXJpdHkvdG9tb3lvL21vdW50LmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCX0KIAlpZiAobmVlZF9kZXYpIHsKIAkJLyogR2V0IG1vdW50IHBvaW50IG9yIGRldmljZSBmaWxlLiAqLwotCQlpZiAoa2Vybl9wYXRoKGRldl9uYW1lLCBMT09LVVBfRk9MTE9XLCAmcGF0aCkpIHsKKwkJaWYgKCFkZXZfbmFtZSB8fCBrZXJuX3BhdGgoZGV2X25hbWUsIExPT0tVUF9GT0xMT1csICZwYXRoKSkgewogCQkJZXJyb3IgPSAtRU5PRU5UOwogCQkJZ290byBvdXQ7CiAJCX0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9yZWFscGF0aC5jIGIvc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMKaW5kZXggZDFlMDViMC4uOGQ5NWU5MSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMKKysrIGIvc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQlpZiAoIWJ1ZikKIAkJCWJyZWFrOwogCQkvKiBHZXQgYmV0dGVyIG5hbWUgZm9yIHNvY2tldC4gKi8KLQkJaWYgKGRlbnRyeS0+ZF9zYiAmJiBkZW50cnktPmRfc2ItPnNfbWFnaWMgPT0gU09DS0ZTX01BR0lDKSB7CisJCWlmIChkZW50cnktPmRfc2ItPnNfbWFnaWMgPT0gU09DS0ZTX01BR0lDKSB7CiAJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCQkJc3RydWN0IHNvY2tldCAqc29jayA9IGlub2RlID8gU09DS0VUX0koaW5vZGUpIDogTlVMTDsKIAkJCXN0cnVjdCBzb2NrICpzayA9IHNvY2sgPyBzb2NrLT5zayA6IE5VTEw7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2NvcmUuYyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvY29yZS5jCmluZGV4IDNmZjhjYzUuLjAxMDY1ODMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvY29yZS5jCisrKyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvY29yZS5jCkBAIC0yNjIsOCArMjYyLDcgQEAKIAkJICovCiAJCWRldi0+YWxsb2NhdGVkX3Jlc291cmNlW2ldID0KIAkJCXJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPnJlc291cmNlc1tpXS5zdGFydCwKLQkJCQkJICAgZGV2LT5yZXNvdXJjZXNbaV0uZW5kIC0KLQkJCQkJICAgZGV2LT5yZXNvdXJjZXNbaV0uc3RhcnQgKyAxLAorCQkJCQkgICByZXNvdXJjZV9zaXplKCZkZXYtPnJlc291cmNlc1tpXSksCiAJCQkJCSAgIGRldi0+cm5hbWVzW2ldKTsKIAkJaWYgKCFkZXYtPmFsbG9jYXRlZF9yZXNvdXJjZVtpXSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJpMnNidXM6IGZhaWxlZCB0byBjbGFpbSByZXNvdXJjZSAlZCFcbiIsIGkpOwpAQCAtMjcyLDE5ICsyNzEsMTkgQEAKIAl9CiAKIAlyID0gJmRldi0+cmVzb3VyY2VzW2FvYV9yZXNvdXJjZV9pMnNtbWlvXTsKLQlybGVuID0gci0+ZW5kIC0gci0+c3RhcnQgKyAxOworCXJsZW4gPSByZXNvdXJjZV9zaXplKHIpOwogCWlmIChybGVuIDwgc2l6ZW9mKHN0cnVjdCBpMnNfaW50ZXJmYWNlX3JlZ3MpKQogCQlnb3RvIGVycjsKIAlkZXYtPmludGZyZWdzID0gaW9yZW1hcChyLT5zdGFydCwgcmxlbik7CiAKIAlyID0gJmRldi0+cmVzb3VyY2VzW2FvYV9yZXNvdXJjZV90eGRiZG1hXTsKLQlybGVuID0gci0+ZW5kIC0gci0+c3RhcnQgKyAxOworCXJsZW4gPSByZXNvdXJjZV9zaXplKHIpOwogCWlmIChybGVuIDwgc2l6ZW9mKHN0cnVjdCBkYmRtYV9yZWdzKSkKIAkJZ290byBlcnI7CiAJZGV2LT5vdXQuZGJkbWEgPSBpb3JlbWFwKHItPnN0YXJ0LCBybGVuKTsKIAogCXIgPSAmZGV2LT5yZXNvdXJjZXNbYW9hX3Jlc291cmNlX3J4ZGJkbWFdOwotCXJsZW4gPSByLT5lbmQgLSByLT5zdGFydCArIDE7CisJcmxlbiA9IHJlc291cmNlX3NpemUocik7CiAJaWYgKHJsZW4gPCBzaXplb2Yoc3RydWN0IGRiZG1hX3JlZ3MpKQogCQlnb3RvIGVycjsKIAlkZXYtPmluLmRiZG1hID0gaW9yZW1hcChyLT5zdGFydCwgcmxlbik7CmRpZmYgLS1naXQgYS9zb3VuZC9hdG1lbC9hYmRhYy5jIGIvc291bmQvYXRtZWwvYWJkYWMuYwppbmRleCA2ZTI0MDkxLi42ZmQ5MzkxIDEwMDY0NAotLS0gYS9zb3VuZC9hdG1lbC9hYmRhYy5jCisrKyBiL3NvdW5kL2F0bWVsL2FiZGFjLmMKQEAgLTQ0OCw3ICs0NDgsNyBAQAogCQlnb3RvIG91dF9mcmVlX2NhcmQ7CiAJfQogCi0JZGFjLT5yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVncy0+ZW5kIC0gcmVncy0+c3RhcnQgKyAxKTsKKwlkYWMtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKIAlpZiAoIWRhYy0+cmVncykgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgcmVtYXAgcmVnaXN0ZXIgbWVtb3J5XG4iKTsKIAkJZ290byBvdXRfZnJlZV9jYXJkOwpAQCAtNTk5LDQgKzU5OSw0IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBBdG1lbCBBdWRpbyBCaXRzdHJlYW0gREFDIChBQkRBQykiKTsKLU1PRFVMRV9BVVRIT1IoIkhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGhhbnMtY2hyaXN0aWFuLmVndHZlZHRAYXRtZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8ZWd0dmVkdEBzYW1mdW5kZXQubm8+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9hdG1lbC9hYzk3Yy5jIGIvc291bmQvYXRtZWwvYWM5N2MuYwppbmRleCBiMzEwNzAyLi42ZTVhZGRlIDEwMDY0NAotLS0gYS9zb3VuZC9hdG1lbC9hYzk3Yy5jCisrKyBiL3NvdW5kL2F0bWVsL2FjOTdjLmMKQEAgLTk3MSw3ICs5NzEsNyBAQAogCWNoaXAtPmNhcmQgPSBjYXJkOwogCWNoaXAtPnBjbGsgPSBwY2xrOwogCWNoaXAtPnBkZXYgPSBwZGV2OwotCWNoaXAtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCWNoaXAtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKIAogCWlmICghY2hpcC0+cmVncykgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgcmVtYXAgcmVnaXN0ZXIgbWVtb3J5XG4iKTsKQEAgLTExOTksNCArMTE5OSw0IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBBdG1lbCBBQzk3IGNvbnRyb2xsZXIiKTsKLU1PRFVMRV9BVVRIT1IoIkhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGhhbnMtY2hyaXN0aWFuLmVndHZlZHRAYXRtZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8ZWd0dmVkdEBzYW1mdW5kZXQubm8+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2luZm8uYyBiL3NvdW5kL2NvcmUvaW5mby5jCmluZGV4IDcwNzdmNjAuLjYwMWYwZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaW5mby5jCisrKyBiL3NvdW5kL2NvcmUvaW5mby5jCkBAIC01MzEsNyArNTMxLDcgQEAKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CiAKLQlwID0gY3JlYXRlX3Byb2NfZW50cnkoImFzb3VuZCIsIFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTywgTlVMTCk7CisJcCA9IHByb2NfbWtkaXIoImFzb3VuZCIsIE5VTEwpOwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCXNuZF9wcm9jX3Jvb3QgPSBwOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9taXNjLmMgYi9zb3VuZC9jb3JlL21pc2MuYwppbmRleCAyYzQxODI1Li5lYjlmZTJlIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL21pc2MuYworKysgYi9zb3VuZC9jb3JlL21pc2MuYwpAQCAtNTgsMjYgKzU4LDYgQEAKIAllbHNlCiAJCXJldHVybiBwYXRoOwogfQotCi0vKiBwcmludCBmaWxlIGFuZCBsaW5lIHdpdGggYSBjZXJ0YWluIHByaW50ayBwcmVmaXggKi8KLXN0YXRpYyBpbnQgcHJpbnRfc25kX3BmeCh1bnNpZ25lZCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBsaW5lLAotCQkJIGNvbnN0IGNoYXIgKmZvcm1hdCkKLXsKLQljb25zdCBjaGFyICpmaWxlID0gc2FuaXR5X2ZpbGVfbmFtZShwYXRoKTsKLQljaGFyIHRtcFtdID0gIjwwPiI7Ci0JY29uc3QgY2hhciAqcGZ4ID0gbGV2ZWwgPyBLRVJOX0RFQlVHIDogS0VSTl9ERUZBVUxUOwotCWludCByZXQgPSAwOwotCi0JaWYgKGZvcm1hdFswXSA9PSAnPCcgJiYgZm9ybWF0WzJdID09ICc+JykgewotCQl0bXBbMV0gPSBmb3JtYXRbMV07Ci0JCXBmeCA9IHRtcDsKLQkJcmV0ID0gMTsKLQl9Ci0JcHJpbnRrKCIlc0FMU0EgJXM6JWQ6ICIsIHBmeCwgZmlsZSwgbGluZSk7Ci0JcmV0dXJuIHJldDsKLX0KLSNlbHNlCi0jZGVmaW5lIHByaW50X3NuZF9wZngobGV2ZWwsIHBhdGgsIGxpbmUsIGZvcm1hdCkJMAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USykKQEAgLTg1LDE1ICs2NSwyOSBAQAogCQkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKLQkKKyNpZmRlZiBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLCisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CisJY2hhciB2ZXJib3NlX2ZtdFtdID0gS0VSTl9ERUZBVUxUICJBTFNBICVzOiVkICVwViI7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcJCiAJaWYgKGRlYnVnIDwgbGV2ZWwpCiAJCXJldHVybjsKICNlbmRpZgorCiAJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLQlpZiAocHJpbnRfc25kX3BmeChsZXZlbCwgcGF0aCwgbGluZSwgZm9ybWF0KSkKLQkJZm9ybWF0ICs9IDM7IC8qIHNraXAgdGhlIHByaW50ayBsZXZlbC1wcmVmaXggKi8KKyNpZmRlZiBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLCisJdmFmLmZtdCA9IGZvcm1hdDsKKwl2YWYudmEgPSAmYXJnczsKKwlpZiAoZm9ybWF0WzBdID09ICc8JyAmJiBmb3JtYXRbMl0gPT0gJz4nKSB7CisJCW1lbWNweSh2ZXJib3NlX2ZtdCwgZm9ybWF0LCAzKTsKKwkJdmFmLmZtdCA9IGZvcm1hdCArIDM7CisJfSBlbHNlIGlmIChsZXZlbCkKKwkJbWVtY3B5KHZlcmJvc2VfZm10LCBLRVJOX0RFQlVHLCAzKTsKKwlwcmludGsodmVyYm9zZV9mbXQsIHNhbml0eV9maWxlX25hbWUocGF0aCksIGxpbmUsICZ2YWYpOworI2Vsc2UKIAl2cHJpbnRrKGZvcm1hdCwgYXJncyk7CisjZW5kaWYKIAl2YV9lbmQoYXJncyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX3NuZF9wcmludGspOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9yYXdtaWRpLmMgYi9zb3VuZC9jb3JlL3Jhd21pZGkuYwppbmRleCBjYmJlZDBkLi44NDlhMGVkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3Jhd21pZGkuYworKysgYi9zb3VuZC9jb3JlL3Jhd21pZGkuYwpAQCAtOTIsMTYgKzkyLDEyIEBACiAJICAgICAgICghc3Vic3RyZWFtLT5hcHBlbmQgfHwgcnVudGltZS0+YXZhaWwgPj0gY291bnQpOwogfQogCi1zdGF0aWMgdm9pZCBzbmRfcmF3bWlkaV9pbnB1dF9ldmVudF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIHNuZF9yYXdtaWRpX2lucHV0X2V2ZW50X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IChzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICopZGF0YTsKLQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmV2ZW50KHN1YnN0cmVhbSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNuZF9yYXdtaWRpX291dHB1dF90cmlnZ2VyX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IChzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICopZGF0YTsKLQlzdWJzdHJlYW0tPm9wcy0+dHJpZ2dlcihzdWJzdHJlYW0sIDEpOworCXN0cnVjdCBzbmRfcmF3bWlkaV9ydW50aW1lICpydW50aW1lID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbmRfcmF3bWlkaV9ydW50aW1lLCBldmVudF93b3JrKTsKKwlpZiAocnVudGltZS0+ZXZlbnQpCisJCXJ1bnRpbWUtPmV2ZW50KHJ1bnRpbWUtPnN1YnN0cmVhbSk7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3Jhd21pZGlfcnVudGltZV9jcmVhdGUoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQpAQCAtMTEwLDE2ICsxMDYsMTAgQEAKIAogCWlmICgocnVudGltZSA9IGt6YWxsb2Moc2l6ZW9mKCpydW50aW1lKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOworCXJ1bnRpbWUtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAlzcGluX2xvY2tfaW5pdCgmcnVudGltZS0+bG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcnVudGltZS0+c2xlZXApOwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVCkKLQkJdGFza2xldF9pbml0KCZydW50aW1lLT50YXNrbGV0LAotCQkJICAgICBzbmRfcmF3bWlkaV9pbnB1dF9ldmVudF90YXNrbGV0LAotCQkJICAgICAodW5zaWduZWQgbG9uZylzdWJzdHJlYW0pOwotCWVsc2UKLQkJdGFza2xldF9pbml0KCZydW50aW1lLT50YXNrbGV0LAotCQkJICAgICBzbmRfcmF3bWlkaV9vdXRwdXRfdHJpZ2dlcl90YXNrbGV0LAotCQkJICAgICAodW5zaWduZWQgbG9uZylzdWJzdHJlYW0pOworCUlOSVRfV09SSygmcnVudGltZS0+ZXZlbnRfd29yaywgc25kX3Jhd21pZGlfaW5wdXRfZXZlbnRfd29yayk7CiAJcnVudGltZS0+ZXZlbnQgPSBOVUxMOwogCXJ1bnRpbWUtPmJ1ZmZlcl9zaXplID0gUEFHRV9TSVpFOwogCXJ1bnRpbWUtPmF2YWlsX21pbiA9IDE7CkBAIC0xNTAsMTIgKzE0MCw3IEBACiB7CiAJaWYgKCFzdWJzdHJlYW0tPm9wZW5lZCkKIAkJcmV0dXJuOwotCWlmICh1cCkgewotCQl0YXNrbGV0X3NjaGVkdWxlKCZzdWJzdHJlYW0tPnJ1bnRpbWUtPnRhc2tsZXQpOwotCX0gZWxzZSB7Ci0JCXRhc2tsZXRfa2lsbCgmc3Vic3RyZWFtLT5ydW50aW1lLT50YXNrbGV0KTsKLQkJc3Vic3RyZWFtLT5vcHMtPnRyaWdnZXIoc3Vic3RyZWFtLCAwKTsKLQl9CisJc3Vic3RyZWFtLT5vcHMtPnRyaWdnZXIoc3Vic3RyZWFtLCB1cCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNuZF9yYXdtaWRpX2lucHV0X3RyaWdnZXIoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgdXApCkBAIC0xNjMsOCArMTQ4LDggQEAKIAlpZiAoIXN1YnN0cmVhbS0+b3BlbmVkKQogCQlyZXR1cm47CiAJc3Vic3RyZWFtLT5vcHMtPnRyaWdnZXIoc3Vic3RyZWFtLCB1cCk7Ci0JaWYgKCF1cCAmJiBzdWJzdHJlYW0tPnJ1bnRpbWUtPmV2ZW50KQotCQl0YXNrbGV0X2tpbGwoJnN1YnN0cmVhbS0+cnVudGltZS0+dGFza2xldCk7CisJaWYgKCF1cCkKKwkJY2FuY2VsX3dvcmtfc3luYygmc3Vic3RyZWFtLT5ydW50aW1lLT5ldmVudF93b3JrKTsKIH0KIAogaW50IHNuZF9yYXdtaWRpX2Ryb3Bfb3V0cHV0KHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKQEAgLTY0MSwxMCArNjI2LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAocGFyYW1zLT5idWZmZXJfc2l6ZSAhPSBydW50aW1lLT5idWZmZXJfc2l6ZSkgewotCQluZXdidWYgPSBrbWFsbG9jKHBhcmFtcy0+YnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworCQluZXdidWYgPSBrcmVhbGxvYyhydW50aW1lLT5idWZmZXIsIHBhcmFtcy0+YnVmZmVyX3NpemUsCisJCQkJICBHRlBfS0VSTkVMKTsKIAkJaWYgKCFuZXdidWYpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJa2ZyZWUocnVudGltZS0+YnVmZmVyKTsKIAkJcnVudGltZS0+YnVmZmVyID0gbmV3YnVmOwogCQlydW50aW1lLT5idWZmZXJfc2l6ZSA9IHBhcmFtcy0+YnVmZmVyX3NpemU7CiAJCXJ1bnRpbWUtPmF2YWlsID0gcnVudGltZS0+YnVmZmVyX3NpemU7CkBAIC02NjgsMTAgKzY1MywxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHBhcmFtcy0+YnVmZmVyX3NpemUgIT0gcnVudGltZS0+YnVmZmVyX3NpemUpIHsKLQkJbmV3YnVmID0ga21hbGxvYyhwYXJhbXMtPmJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJbmV3YnVmID0ga3JlYWxsb2MocnVudGltZS0+YnVmZmVyLCBwYXJhbXMtPmJ1ZmZlcl9zaXplLAorCQkJCSAgR0ZQX0tFUk5FTCk7CiAJCWlmICghbmV3YnVmKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWtmcmVlKHJ1bnRpbWUtPmJ1ZmZlcik7CiAJCXJ1bnRpbWUtPmJ1ZmZlciA9IG5ld2J1ZjsKIAkJcnVudGltZS0+YnVmZmVyX3NpemUgPSBwYXJhbXMtPmJ1ZmZlcl9zaXplOwogCX0KQEAgLTkyNiw3ICs5MTEsNyBAQAogCX0KIAlpZiAocmVzdWx0ID4gMCkgewogCQlpZiAocnVudGltZS0+ZXZlbnQpCi0JCQl0YXNrbGV0X3NjaGVkdWxlKCZydW50aW1lLT50YXNrbGV0KTsKKwkJCXNjaGVkdWxlX3dvcmsoJnJ1bnRpbWUtPmV2ZW50X3dvcmspOwogCQllbHNlIGlmIChzbmRfcmF3bWlkaV9yZWFkeShzdWJzdHJlYW0pKQogCQkJd2FrZV91cCgmcnVudGltZS0+c2xlZXApOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmggYi9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcC5oCmluZGV4IDRmZjZjOGMuLmZjN2EyZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmgKKysrIGIvc291bmQvZHJpdmVycy9wY3NwL3Bjc3AuaApAQCAtMTAsMTQgKzEwLDggQEAKICNkZWZpbmUgX19QQ1NQX0hfXwogCiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2k4MjUzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTKSB8fCBkZWZpbmVkKENPTkZJR19YODYpCi0vKiBVc2UgdGhlIGdsb2JhbCBQSVQgbG9jayAhICovCi0jaW5jbHVkZSA8YXNtL2k4MjUzLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGFzbS84MjUzcGl0Lmg+Ci1zdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhpODI1M19sb2NrKTsKLSNlbmRpZgogCiAjZGVmaW5lIFBDU1BfU09VTkRfVkVSU0lPTiAweDQwMAkvKiByZWFkIDQuMDAgKi8KICNkZWZpbmUgUENTUF9ERUJVRyAwCmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9pc2lnaHQuYyBiL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCmluZGV4IDg2ZWUxNmMuLjQ0MDAzMDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCkBAIC0yMDksNiArMjA5LDcgQEAKIAkJaXNpZ2h0LT5wYWNrZXRfaW5kZXggPSAtMTsKIAkJcmV0dXJuOwogCX0KKwlmd19pc29fY29udGV4dF9xdWV1ZV9mbHVzaChpc2lnaHQtPmNvbnRleHQpOwogCiAJaWYgKCsraW5kZXggPj0gUVVFVUVfTEVOR1RIKQogCQlpbmRleCA9IDA7CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9zcGVha2Vycy5jIGIvc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYwppbmRleCA1NDY2ZGU4Li4zZmMyNTdkIDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9zcGVha2Vycy5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL3NwZWFrZXJzLmMKQEAgLTE3MSw3ICsxNzEsNyBAQAogCiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAogCQkJCQkgICBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1RJTUUsCi0JCQkJCSAgIDUwMDAsIDgxOTIwMDApOworCQkJCQkgICA1MDAwLCBVSU5UX01BWCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hZDE4ODkuYyBiL3NvdW5kL3BjaS9hZDE4ODkuYwppbmRleCBkOGY2ZmQ2Li4yMDE1MDM2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWQxODg5LmMKKysrIGIvc291bmQvcGNpL2FkMTg4OS5jCkBAIC05NDQsNyArOTQ0LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmY2hpcC0+bG9jayk7CS8qIG9ubHkgbm93IGNhbiB3ZSBjYWxsIGFkMTg4OV9mcmVlICovCiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9hZDE4ODlfaW50ZXJydXB0LAotCQkJSVJRRl9TSEFSRUQsIGNhcmQtPmRyaXZlciwgY2hpcCkpIHsKKwkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IG9idGFpbiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2FkMTg4OV9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTA1NSw3ICsxMDU1LDcgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbmRfYWQxODg5X2lkcyk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZDE4ODlfcGNpX2RyaXZlciA9IHsKLQkubmFtZSA9ICJBRDE4ODkgQXVkaW8iLAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX2FkMTg4OV9pZHMsCiAJLnByb2JlID0gc25kX2FkMTg4OV9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2FkMTg4OV9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jIGIvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCmluZGV4IDVjNmUzMjIuLmI0NDRiNzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYworKysgYi9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKQEAgLTIwOTAsNyArMjA5MCw3IEBACiAJY29kZWMtPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoY29kZWMtPnBjaSwgMCk7CiAKIAlpZiAocmVxdWVzdF9pcnEoY29kZWMtPnBjaS0+aXJxLCBzbmRfYWxpX2NhcmRfaW50ZXJydXB0LAotCQkJSVJRRl9TSEFSRUQsICJBTEkgNTQ1MSIsIGNvZGVjKSkgeworCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjb2RlYykpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlcXVlc3QgaXJxLlxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMjI5NSw3ICsyMjk1LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICJBTEkgNTQ1MSIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfYWxpX2lkcywKIAkucHJvYmUgPSBzbmRfYWxpX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfYWxpX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzMzAwLmMgYi9zb3VuZC9wY2kvYWxzMzAwLmMKaW5kZXggZDc2NTNjYi4uNzM2YzhlOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsczMwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHMzMDAuYwpAQCAtNzIyLDcgKzcyMiw3IEBACiAJCWlycV9oYW5kbGVyID0gc25kX2FsczMwMF9pbnRlcnJ1cHQ7CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIGlycV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKLQkJCWNhcmQtPnNob3J0bmFtZSwgY2hpcCkpIHsKKwkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2FsczMwMF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtODQ2LDcgKzg0Niw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiQUxTMzAwIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9hbHMzMDBfaWRzLAogCS5wcm9iZSA9IHNuZF9hbHMzMDBfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9hbHMzMDBfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbHM0MDAwLmMgYi9zb3VuZC9wY2kvYWxzNDAwMC5jCmluZGV4IDBlMjQ3Y2IuLmE5YzFhZjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hbHM0MDAwLmMKKysrIGIvc291bmQvcGNpL2FsczQwMDAuYwpAQCAtMTAzNiw3ICsxMDM2LDcgQEAKIAogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIkFMUzQwMDAiLAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX2FsczQwMDBfaWRzLAogCS5wcm9iZSA9IHNuZF9jYXJkX2FsczQwMDBfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jYXJkX2FsczQwMDBfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMgYi9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCmluZGV4IDJjYTZmNGYuLmI5NDFkMjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgImhwaW9jdGwuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTUwLDE5ICs0OSwyMSBAQAogI2lmIGRlZmluZWQgQ09ORklHX1NORF9ERUJVRwogLyogY29waWVkIGZyb20gcGNtX2xpYi5jLCBob3BlIGxhdGVyIHBhdGNoIHdpbGwgbWFrZSB0aGF0IHZlcnNpb24gcHVibGljCiBhbmQgdGhpcyBjb3B5IGNhbiBiZSByZW1vdmVkICovCi1zdGF0aWMgdm9pZCBwY21fZGVidWdfbmFtZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgIGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pCitzdGF0aWMgaW5saW5lIHZvaWQKK3NuZF9wY21fZGVidWdfbmFtZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQlzbnByaW50ZihuYW1lLCBsZW4sICJwY21DJWREJWQlYzolZCIsCisJc25wcmludGYoYnVmLCBzaXplLCAicGNtQyVkRCVkJWM6JWQiLAogCQkgc3Vic3RyZWFtLT5wY20tPmNhcmQtPm51bWJlciwKIAkJIHN1YnN0cmVhbS0+cGNtLT5kZXZpY2UsCiAJCSBzdWJzdHJlYW0tPnN0cmVhbSA/ICdjJyA6ICdwJywKIAkJIHN1YnN0cmVhbS0+bnVtYmVyKTsKIH0KLSNkZWZpbmUgREVCVUdfTkFNRShzdWJzdHJlYW0sIG5hbWUpIGNoYXIgbmFtZVsxNl07IHBjbV9kZWJ1Z19uYW1lKHN1YnN0cmVhbSwgbmFtZSwgc2l6ZW9mKG5hbWUpKQogI2Vsc2UKLSNkZWZpbmUgcGNtX2RlYnVnX25hbWUocywgbiwgbCkgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVR19OQU1FKG5hbWUsIHN1YnN0cmVhbSkgZG8geyB9IHdoaWxlICgwKQorc3RhdGljIGlubGluZSB2b2lkCitzbmRfcGNtX2RlYnVnX25hbWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJKmJ1ZiA9IDA7Cit9CiAjZW5kaWYKIAogI2lmIGRlZmluZWQgQ09ORklHX1NORF9ERUJVR19WRVJCT1NFCkBAIC0zMDUsNyArMzA2LDggQEAKIHN0YXRpYyB2b2lkIHByaW50X2h3cGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcCkKIHsKLQlERUJVR19OQU1FKHN1YnN0cmVhbSwgbmFtZSk7CisJY2hhciBuYW1lWzE2XTsKKwlzbmRfcGNtX2RlYnVnX25hbWUoc3Vic3RyZWFtLCBuYW1lLCBzaXplb2YobmFtZSkpOwogCXNuZF9wcmludGQoIiVzIEhXUEFSQU1TXG4iLCBuYW1lKTsKIAlzbmRfcHJpbnRkKCIgc2FtcGxlcmF0ZSAlZCBIelxuIiwgcGFyYW1zX3JhdGUocCkpOwogCXNuZF9wcmludGQoIiBjaGFubmVscyAlZFxuIiwgcGFyYW1zX2NoYW5uZWxzKHApKTsKQEAgLTU3Nyw4ICs1NzksOSBAQAogCXN0cnVjdCBzbmRfY2FyZF9hc2locGkgKmNhcmQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzOwogCXUxNiBlOwotCURFQlVHX05BTUUoc3Vic3RyZWFtLCBuYW1lKTsKKwljaGFyIG5hbWVbMTZdOwogCisJc25kX3BjbV9kZWJ1Z19uYW1lKHN1YnN0cmVhbSwgbmFtZSwgc2l6ZW9mKG5hbWUpKTsKIAlzbmRfcHJpbnRkZCgiJXMgdHJpZ2dlclxuIiwgbmFtZSk7CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtNzQyLDcgKzc0NSw5IEBACiAJaW50IGxvb3BzID0gMDsKIAl1MTYgc3RhdGU7CiAJdTMyIGJ1ZmZlcl9zaXplLCBieXRlc19hdmFpbCwgc2FtcGxlc19wbGF5ZWQsIG9uX2NhcmRfYnl0ZXM7Ci0JREVCVUdfTkFNRShzdWJzdHJlYW0sIG5hbWUpOworCWNoYXIgbmFtZVsxNl07CisKKwlzbmRfcGNtX2RlYnVnX25hbWUoc3Vic3RyZWFtLCBuYW1lLCBzaXplb2YobmFtZSkpOwogCiAJc25kX3ByaW50ZGQoIiVzIHNuZF9jYXJkX2FzaWhwaV90aW1lcl9mdW5jdGlvblxuIiwgbmFtZSk7CiAKQEAgLTEzMjQsMTAgKzEzMjksMTIgQEAKIAkiUkYiLAogCSJDbG9jayIsCiAJIkJpdHN0cmVhbSIsCi0JIk1pY3JvcGhvbmUiLAotCSJDb2JyYW5ldCIsCisJIk1pYyIsCisJIk5ldCIsCiAJIkFuYWxvZyIsCiAJIkFkYXB0ZXIiLAorCSJSVFAiLAorCSJHUEkiLAogfTsKIAogY29tcGlsZV90aW1lX2Fzc2VydCgKQEAgLTEzNDIsOCArMTM0OSwxMCBAQAogCSJEaWdpdGFsIiwKIAkiUkYiLAogCSJTcGVha2VyIiwKLQkiQ29icmFuZXQgT3V0IiwKLQkiQW5hbG9nIgorCSJOZXQiLAorCSJBbmFsb2ciLAorCSJSVFAiLAorCSJHUE8iLAogfTsKIAogY29tcGlsZV90aW1lX2Fzc2VydCgKQEAgLTE0NzcsMTEgKzE0ODYsNDAgQEAKIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzEwMCwgLTEwMDAwLCBWT0xfU1RFUF9tQiwgMCk7CiAKKyNkZWZpbmUgc25kX2FzaWhwaV92b2x1bWVfbXV0ZV9pbmZvCXNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8KKworc3RhdGljIGludCBzbmRfYXNpaHBpX3ZvbHVtZV9tdXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdTMyIGhfY29udHJvbCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXUzMiBtdXRlOworCisJaHBpX2hhbmRsZV9lcnJvcihocGlfdm9sdW1lX2dldF9tdXRlKGhfY29udHJvbCwgJm11dGUpKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG11dGUgPyAwIDogMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hc2locGlfdm9sdW1lX211dGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1MzIgaF9jb250cm9sID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW50IGNoYW5nZSA9IDE7CisJLyogSFBJIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIGFsbCBvciBub25lIG11dGluZyBvZiBtdWx0aWNoYW5uZWwgdm9sdW1lCisJQUxTQSBTd2l0Y2ggZWxlbWVudCBoYXMgb3Bwb3NpdGUgc2Vuc2UgdG8gSFBJIG11dGU6IG9uPT11bm11dGVkLCBvZmY9bXV0ZWQKKwkqLworCWludCBtdXRlID0gIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMCA6IEhQSV9CSVRNQVNLX0FMTF9DSEFOTkVMUzsKKwlocGlfaGFuZGxlX2Vycm9yKGhwaV92b2x1bWVfc2V0X211dGUoaF9jb250cm9sLCBtdXRlKSk7CisJcmV0dXJuIGNoYW5nZTsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgc25kX2FzaWhwaV92b2x1bWVfYWRkKHN0cnVjdCBzbmRfY2FyZF9hc2locGkgKmFzaWhwaSwKIAkJCQkJc3RydWN0IGhwaV9jb250cm9sICpocGlfY3RsKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGFzaWhwaS0+Y2FyZDsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfY29udHJvbDsKKwlpbnQgZXJyOworCXUzMiBtdXRlOwogCiAJYXNpaHBpX2N0bF9pbml0KCZzbmRfY29udHJvbCwgaHBpX2N0bCwgIlZvbHVtZSIpOwogCXNuZF9jb250cm9sLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfApAQCAtMTQ5MSw3ICsxNTI5LDE5IEBACiAJc25kX2NvbnRyb2wucHV0ID0gc25kX2FzaWhwaV92b2x1bWVfcHV0OwogCXNuZF9jb250cm9sLnRsdi5wID0gZGJfc2NhbGVfMTAwOwogCi0JcmV0dXJuIGN0bF9hZGQoY2FyZCwgJnNuZF9jb250cm9sLCBhc2locGkpOworCWVyciA9IGN0bF9hZGQoY2FyZCwgJnNuZF9jb250cm9sLCBhc2locGkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoaHBpX3ZvbHVtZV9nZXRfbXV0ZShocGlfY3RsLT5oX2NvbnRyb2wsICZtdXRlKSA9PSAwKSB7CisJCWFzaWhwaV9jdGxfaW5pdCgmc25kX2NvbnRyb2wsIGhwaV9jdGwsICJTd2l0Y2giKTsKKwkJc25kX2NvbnRyb2wuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURTsKKwkJc25kX2NvbnRyb2wuaW5mbyA9IHNuZF9hc2locGlfdm9sdW1lX211dGVfaW5mbzsKKwkJc25kX2NvbnRyb2wuZ2V0ID0gc25kX2FzaWhwaV92b2x1bWVfbXV0ZV9nZXQ7CisJCXNuZF9jb250cm9sLnB1dCA9IHNuZF9hc2locGlfdm9sdW1lX211dGVfcHV0OworCQllcnIgPSBjdGxfYWRkKGNhcmQsICZzbmRfY29udHJvbCwgYXNpaHBpKTsKKwl9CisJcmV0dXJuIGVycjsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI5MjQsNyArMjk3NCw3IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYXNpaHBpX3BjaV90YmwpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gImFzaWhwaSIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBhc2locGlfcGNpX3RibCwKIAkucHJvYmUgPSBzbmRfYXNpaHBpX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfYXNpaHBpX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXNpaHBpL2hwaS5oIGIvc291bmQvcGNpL2FzaWhwaS9ocGkuaAppbmRleCAyNTU0MjljLi5mMjA3MjcyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXNpaHBpL2hwaS5oCisrKyBiL3NvdW5kL3BjaS9hc2locGkvaHBpLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBBdWRpb1NjaWVuY2UgSFBJIGRyaXZlcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEwICBBdWRpb1NjaWVuY2UgSW5jLiA8c3VwcG9ydEBhdWRpb3NjaWVuY2UuY29tPgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDExICBBdWRpb1NjaWVuY2UgSW5jLiA8c3VwcG9ydEBhdWRpb3NjaWVuY2UuY29tPgogCiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtNDIsMTIgKzQyLDExIEBACiAjZGVmaW5lIEhQSV9WRVJfTUlOT1IodikgKChpbnQpKCh2ID4+IDgpICYgMHhGRikpCiAjZGVmaW5lIEhQSV9WRVJfUkVMRUFTRSh2KSAoKGludCkodiAmIDB4RkYpKQogCi0vKiBVc2Ugc2luZ2xlIGRpZ2l0cyBmb3IgdmVyc2lvbnMgbGVzcyB0aGF0IDEwIHRvIGF2b2lkIG9jdGFsLiAqLwotI2RlZmluZSBIUElfVkVSIEhQSV9WRVJTSU9OX0NPTlNUUlVDVE9SKDRMLCA2LCAwKQotI2RlZmluZSBIUElfVkVSX1NUUklORyAiNC4wNi4wMCIKKyNkZWZpbmUgSFBJX1ZFUiBIUElfVkVSU0lPTl9DT05TVFJVQ1RPUig0TCwgOCwgMCkKKyNkZWZpbmUgSFBJX1ZFUl9TVFJJTkcgIjQuMDguMDAiCiAKIC8qIExpYnJhcnkgdmVyc2lvbiBhcyBkb2N1bWVudGVkIGluIGhwaS1hcGktdmVyc2lvbnMudHh0ICovCi0jZGVmaW5lIEhQSV9MSUJfVkVSICBIUElfVkVSU0lPTl9DT05TVFJVQ1RPUig5LCAwLCAwKQorI2RlZmluZSBIUElfTElCX1ZFUiAgSFBJX1ZFUlNJT05fQ09OU1RSVUNUT1IoMTAsIDAsIDApCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2RlZmluZSBIUElfQlVJTERfRVhDTFVERV9ERVBSRUNBVEVECkBAIC0yMTEsOCArMjEwLDEyIEBACiAJSFBJX1NPVVJDRU5PREVfQ09CUkFORVQgPSAxMDksCiAJSFBJX1NPVVJDRU5PREVfQU5BTE9HID0gMTEwLAkgICAgIC8qKjwgYW5hbG9nIGlucHV0IG5vZGUuICovCiAJSFBJX1NPVVJDRU5PREVfQURBUFRFUiA9IDExMSwJICAgICAvKio8IGFkYXB0ZXIgbm9kZS4gKi8KKwkvKiogUlRQIHN0cmVhbSBpbnB1dCBub2RlIC0gVGhpcyBub2RlIGlzIGEgZGVzdGluYXRpb24gZm9yCisJICAgIHBhY2tldHMgb2YgUlRQIGF1ZGlvIHNhbXBsZXMgZnJvbSBvdGhlciBkZXZpY2VzLiAqLworCUhQSV9TT1VSQ0VOT0RFX1JUUF9ERVNUSU5BVElPTiA9IDExMiwKKwlIUElfU09VUkNFTk9ERV9HUF9JTiA9IDExMywJICAgICAvKio8IGdlbmVyYWwgcHVycG9zZSBpbnB1dC4gKi8KIAkvKiAhISFVcGRhdGUgdGhpcyAgQU5EIGhwaWRlYnVnLmggaWYgeW91IGFkZCBhIG5ldyBzb3VyY2Vub2RlIHR5cGUhISEgKi8KLQlIUElfU09VUkNFTk9ERV9MQVNUX0lOREVYID0gMTExCSAgICAgLyoqPCBsYXJnZXN0IElEICovCisJSFBJX1NPVVJDRU5PREVfTEFTVF9JTkRFWCA9IDExMwkgICAgIC8qKjwgbGFyZ2VzdCBJRCAqLwogCQkvKiBBWDYgbWF4IHNvdXJjZW5vZGUgdHlwZXMgPSAxNSAqLwogfTsKIApAQCAtMjI4LDcgKzIzMSw3IEBACiAJSFBJX0RFU1ROT0RFX05PTkUgPSAyMDAsCiAJLyoqIEluIFN0cmVhbSAoUmVjb3JkKSBub2RlLiAqLwogCUhQSV9ERVNUTk9ERV9JU1RSRUFNID0gMjAxLAotCUhQSV9ERVNUTk9ERV9MSU5FT1VUID0gMjAyLAkgICAgLyoqPCBsaW5lIG91dCBub2RlLiAqLworCUhQSV9ERVNUTk9ERV9MSU5FT1VUID0gMjAyLAkgICAgIC8qKjwgbGluZSBvdXQgbm9kZS4gKi8KIAlIUElfREVTVE5PREVfQUVTRUJVX09VVCA9IDIwMywJICAgICAvKio8IEFFUy9FQlUgb3V0cHV0IG5vZGUuICovCiAJSFBJX0RFU1ROT0RFX1JGID0gMjA0LAkJICAgICAvKio8IFJGIG91dHB1dCBub2RlLiAqLwogCUhQSV9ERVNUTk9ERV9TUEVBS0VSID0gMjA1LAkgICAgIC8qKjwgc3BlYWtlciBvdXRwdXQgbm9kZS4gKi8KQEAgLTIzNiw5ICsyMzksMTIgQEAKIAkgICAgQXVkaW8gc2FtcGxlcyBmcm9tIHRoZSBkZXZpY2UgYXJlIHNlbnQgb3V0IG9uIHRoZSBDb2JyYW5ldCBuZXR3b3JrLiovCiAJSFBJX0RFU1ROT0RFX0NPQlJBTkVUID0gMjA2LAogCUhQSV9ERVNUTk9ERV9BTkFMT0cgPSAyMDcsCSAgICAgLyoqPCBhbmFsb2cgb3V0cHV0IG5vZGUuICovCi0KKwkvKiogUlRQIHN0cmVhbSBvdXRwdXQgbm9kZSAtIFRoaXMgbm9kZSBpcyBhIHNvdXJjZSBmb3IKKwkgICAgcGFja2V0cyBvZiBSVFAgYXVkaW8gc2FtcGxlcyB0aGF0IGFyZSBzZW50IHRvIG90aGVyIGRldmljZXMuICovCisJSFBJX0RFU1ROT0RFX1JUUF9TT1VSQ0UgPSAyMDgsCisJSFBJX0RFU1ROT0RFX0dQX09VVCA9IDIwOSwJICAgICAvKio8IGdlbmVyYWwgcHVycG9zZSBvdXRwdXQgbm9kZS4gKi8KIAkvKiAhISFVcGRhdGUgdGhpcyBBTkQgaHBpZGVidWcuaCBpZiB5b3UgYWRkIGEgbmV3IGRlc3Rub2RlIHR5cGUhISEgKi8KLQlIUElfREVTVE5PREVfTEFTVF9JTkRFWCA9IDIwNwkgICAgIC8qKjwgbGFyZ2VzdCBJRCAqLworCUhQSV9ERVNUTk9ERV9MQVNUX0lOREVYID0gMjA5CSAgICAgLyoqPCBsYXJnZXN0IElEICovCiAJCS8qIEFYNiBtYXggZGVzdG5vZGUgdHlwZXMgPSAxNSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9ocGk2MDAwLmMgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaTYwMDAuYwppbmRleCBkZjRhZWQ1Li4zY2M2ZjExIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXNpaHBpL2hwaTYwMDAuYworKysgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaTYwMDAuYwpAQCAtMzU5LDcgKzM1OSw3IEBACiAJCQlIUElfRVJST1JfUFJPQ0VTU0lOR19NRVNTQUdFKTsKIAogCXN3aXRjaCAocGhtLT50eXBlKSB7Ci0JY2FzZSBIUElfVFlQRV9NRVNTQUdFOgorCWNhc2UgSFBJX1RZUEVfUkVRVUVTVDoKIAkJc3dpdGNoIChwaG0tPm9iamVjdCkgewogCQljYXNlIEhQSV9PQkpfU1VCU1lTVEVNOgogCQkJc3Vic3lzX21lc3NhZ2UocGhtLCBwaHIpOwpAQCAtNTM4LDcgKzUzOCw3IEBACiAKIAkJSFBJX0RFQlVHX0xPRyhWRVJCT1NFLCAic2VuZCBBREFQVEVSX0dFVF9JTkZPXG4iKTsKIAkJbWVtc2V0KCZobSwgMCwgc2l6ZW9mKGhtKSk7Ci0JCWhtLnR5cGUgPSBIUElfVFlQRV9NRVNTQUdFOworCQlobS50eXBlID0gSFBJX1RZUEVfUkVRVUVTVDsKIAkJaG0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaHBpX21lc3NhZ2UpOwogCQlobS5vYmplY3QgPSBIUElfT0JKX0FEQVBURVI7CiAJCWhtLmZ1bmN0aW9uID0gSFBJX0FEQVBURVJfR0VUX0lORk87CkBAIC05NDYsMTEgKzk0Niw4IEBACiAJCX0KIAogCQkvKiB3cml0ZSB0aGUgRFNQIGNvZGUgZG93biBpbnRvIHRoZSBEU1BzIG1lbW9yeSAqLwotCQkvKkhwaURzcENvZGVfT3BlbihuQm9vdExvYWRGYW1pbHksJkRzcENvZGUscGR3T3NFcnJvckNvZGUpOyAqLwotCQlkc3BfY29kZS5wc19kZXYgPSBwYW8tPnBjaS5wY2lfZGV2OwotCi0JCWVycm9yID0gaHBpX2RzcF9jb2RlX29wZW4oYm9vdF9sb2FkX2ZhbWlseSwgJmRzcF9jb2RlLAotCQkJcG9zX2Vycm9yX2NvZGUpOworCQllcnJvciA9IGhwaV9kc3BfY29kZV9vcGVuKGJvb3RfbG9hZF9mYW1pbHksIHBhby0+cGNpLnBjaV9kZXYsCisJCQkmZHNwX2NvZGUsIHBvc19lcnJvcl9jb2RlKTsKIAogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXNpaHBpL2hwaTYyMDUuYyBiL3NvdW5kL3BjaS9hc2locGkvaHBpNjIwNS5jCmluZGV4IDlkNWRmNTQuLmUwNDFhNmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvaHBpNjIwNS5jCisrKyBiL3NvdW5kL3BjaS9hc2locGkvaHBpNjIwNS5jCkBAIC0zNzMsNiArMzczLDcgQEAKIC8qKiBFbnRyeSBwb2ludCB0byB0aGlzIEhQSSBiYWNrZW5kCiAgKiBBbGwgY2FsbHMgdG8gdGhlIEhQSSBzdGFydCBoZXJlCiAgKi8KK3N0YXRpYwogdm9pZCBfSFBJXzYyMDUoc3RydWN0IGhwaV9hZGFwdGVyX29iaiAqcGFvLCBzdHJ1Y3QgaHBpX21lc3NhZ2UgKnBobSwKIAlzdHJ1Y3QgaHBpX3Jlc3BvbnNlICpwaHIpCiB7CkBAIC0zOTIsNyArMzkzLDcgQEAKIAogCUhQSV9ERUJVR19MT0coVkVSQk9TRSwgInN0YXJ0IG9mIHN3aXRjaFxuIik7CiAJc3dpdGNoIChwaG0tPnR5cGUpIHsKLQljYXNlIEhQSV9UWVBFX01FU1NBR0U6CisJY2FzZSBIUElfVFlQRV9SRVFVRVNUOgogCQlzd2l0Y2ggKHBobS0+b2JqZWN0KSB7CiAJCWNhc2UgSFBJX09CSl9TVUJTWVNURU06CiAJCQlzdWJzeXNfbWVzc2FnZShwYW8sIHBobSwgcGhyKTsKQEAgLTQwMiw3ICs0MDMsNiBAQAogCQkJYWRhcHRlcl9tZXNzYWdlKHBhbywgcGhtLCBwaHIpOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBIUElfT0JKX0NPTlRST0xFWDoKIAkJY2FzZSBIUElfT0JKX0NPTlRST0w6CiAJCQljb250cm9sX21lc3NhZ2UocGFvLCBwaG0sIHBocik7CiAJCQlicmVhazsKQEAgLTYzNCwxMSArNjM0LDEyIEBACiAKIAkJSFBJX0RFQlVHX0xPRyhWRVJCT1NFLCAiaW5pdCBBREFQVEVSX0dFVF9JTkZPXG4iKTsKIAkJbWVtc2V0KCZobSwgMCwgc2l6ZW9mKGhtKSk7Ci0JCWhtLnR5cGUgPSBIUElfVFlQRV9NRVNTQUdFOworCQkvKiB3QWRhcHRlckluZGV4ID09IHZlcnNpb24gPT0gMCAqLworCQlobS50eXBlID0gSFBJX1RZUEVfUkVRVUVTVDsKIAkJaG0uc2l6ZSA9IHNpemVvZihobSk7CiAJCWhtLm9iamVjdCA9IEhQSV9PQkpfQURBUFRFUjsKIAkJaG0uZnVuY3Rpb24gPSBIUElfQURBUFRFUl9HRVRfSU5GTzsKLQkJaG0uYWRhcHRlcl9pbmRleCA9IDA7CisKIAkJbWVtc2V0KCZociwgMCwgc2l6ZW9mKGhyKSk7CiAJCWhyLnNpemUgPSBzaXplb2YoaHIpOwogCkBAIC02NTgsOSArNjU5LDYgQEAKIAkJCWhyLnUuYXguaW5mby5udW1fb3V0c3RyZWFtcyArCiAJCQloci51LmF4LmluZm8ubnVtX2luc3RyZWFtczsKIAotCQlocGlvc19sb2NrZWRfbWVtX3ByZXBhcmUoKG1heF9zdHJlYW1zICogNikgLyAxMCwgbWF4X3N0cmVhbXMsCi0JCQk2NTUzNiwgcGFvLT5wY2kucGNpX2Rldik7Ci0KIAkJSFBJX0RFQlVHX0xPRyhWRVJCT1NFLAogCQkJImdvdCBhZGFwdGVyIGluZm8gdHlwZSAleCBpbmRleCAlZCBzZXJpYWwgJWRcbiIsCiAJCQloci51LmF4LmluZm8uYWRhcHRlcl90eXBlLCBoci51LmF4LmluZm8uYWRhcHRlcl9pbmRleCwKQEAgLTcwOSw5ICs3MDcsNiBAQAogCQkJCVtpXSk7CiAJCQlwaHctPm91dHN0cmVhbV9ob3N0X2J1ZmZlcl9zaXplW2ldID0gMDsKIAkJfQotCi0JaHBpb3NfbG9ja2VkX21lbV91bnByZXBhcmUocGFvLT5wY2kucGNpX2Rldik7Ci0KIAlrZnJlZShwaHcpOwogfQogCkBAIC0xMzcxLDkgKzEzNjYsOCBAQAogCQkJcmV0dXJuIGVycjsKIAogCQkvKiB3cml0ZSB0aGUgRFNQIGNvZGUgZG93biBpbnRvIHRoZSBEU1BzIG1lbW9yeSAqLwotCQlkc3BfY29kZS5wc19kZXYgPSBwYW8tPnBjaS5wY2lfZGV2OwotCQllcnIgPSBocGlfZHNwX2NvZGVfb3Blbihib290X2NvZGVfaWRbZHNwXSwgJmRzcF9jb2RlLAotCQkJcG9zX2Vycm9yX2NvZGUpOworCQllcnIgPSBocGlfZHNwX2NvZGVfb3Blbihib290X2NvZGVfaWRbZHNwXSwgcGFvLT5wY2kucGNpX2RldiwKKwkJCSZkc3BfY29kZSwgcG9zX2Vycm9yX2NvZGUpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIApAQCAtMjA4NCwxMyArMjA3OCwxMyBAQAogCXUxNiBlcnIgPSAwOwogCiAJbWVzc2FnZV9jb3VudCsrOwotCWlmIChwaG0tPnNpemUgPiBzaXplb2YoaW50ZXJmYWNlLT51KSkgeworCWlmIChwaG0tPnNpemUgPiBzaXplb2YoaW50ZXJmYWNlLT51Lm1lc3NhZ2VfYnVmZmVyKSkgewogCQlwaHItPmVycm9yID0gSFBJX0VSUk9SX01FU1NBR0VfQlVGRkVSX1RPT19TTUFMTDsKLQkJcGhyLT5zcGVjaWZpY19lcnJvciA9IHNpemVvZihpbnRlcmZhY2UtPnUpOworCQlwaHItPnNwZWNpZmljX2Vycm9yID0gc2l6ZW9mKGludGVyZmFjZS0+dS5tZXNzYWdlX2J1ZmZlcik7CiAJCXBoci0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgaHBpX3Jlc3BvbnNlX2hlYWRlcik7CiAJCUhQSV9ERUJVR19MT0coRVJST1IsCiAJCQkibWVzc2FnZSBsZW4gJWQgdG9vIGJpZyBmb3IgYnVmZmVyICV6ZCBcbiIsIHBobS0+c2l6ZSwKLQkJCXNpemVvZihpbnRlcmZhY2UtPnUpKTsKKwkJCXNpemVvZihpbnRlcmZhY2UtPnUubWVzc2FnZV9idWZmZXIpKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMTIyLDE4ICsyMTE2LDE5IEBACiAKIAkvKiByZWFkIHRoZSByZXN1bHQgKi8KIAlpZiAodGltZV9vdXQpIHsKLQkJaWYgKGludGVyZmFjZS0+dS5yZXNwb25zZV9idWZmZXIuc2l6ZSA8PSBwaHItPnNpemUpCisJCWlmIChpbnRlcmZhY2UtPnUucmVzcG9uc2VfYnVmZmVyLnJlc3BvbnNlLnNpemUgPD0gcGhyLT5zaXplKQogCQkJbWVtY3B5KHBociwgJmludGVyZmFjZS0+dS5yZXNwb25zZV9idWZmZXIsCi0JCQkJaW50ZXJmYWNlLT51LnJlc3BvbnNlX2J1ZmZlci5zaXplKTsKKwkJCQlpbnRlcmZhY2UtPnUucmVzcG9uc2VfYnVmZmVyLnJlc3BvbnNlLnNpemUpOwogCQllbHNlIHsKIAkJCUhQSV9ERUJVR19MT0coRVJST1IsCiAJCQkJInJlc3BvbnNlIGxlbiAlZCB0b28gYmlnIGZvciBidWZmZXIgJWRcbiIsCi0JCQkJaW50ZXJmYWNlLT51LnJlc3BvbnNlX2J1ZmZlci5zaXplLCBwaHItPnNpemUpOworCQkJCWludGVyZmFjZS0+dS5yZXNwb25zZV9idWZmZXIucmVzcG9uc2Uuc2l6ZSwKKwkJCQlwaHItPnNpemUpOwogCQkJbWVtY3B5KHBociwgJmludGVyZmFjZS0+dS5yZXNwb25zZV9idWZmZXIsCiAJCQkJc2l6ZW9mKHN0cnVjdCBocGlfcmVzcG9uc2VfaGVhZGVyKSk7CiAJCQlwaHItPmVycm9yID0gSFBJX0VSUk9SX1JFU1BPTlNFX0JVRkZFUl9UT09fU01BTEw7CiAJCQlwaHItPnNwZWNpZmljX2Vycm9yID0KLQkJCQlpbnRlcmZhY2UtPnUucmVzcG9uc2VfYnVmZmVyLnNpemU7CisJCQkJaW50ZXJmYWNlLT51LnJlc3BvbnNlX2J1ZmZlci5yZXNwb25zZS5zaXplOwogCQkJcGhyLT5zaXplID0gc2l6ZW9mKHN0cnVjdCBocGlfcmVzcG9uc2VfaGVhZGVyKTsKIAkJfQogCX0KQEAgLTIyMDIsMjMgKzIxOTcsNiBAQAogCQkJcGhtLT51LmQudS5kYXRhLmRhdGFfc2l6ZSwgSDYyMF9ISUZfR0VUX0RBVEEpOwogCQlicmVhazsKIAotCWNhc2UgSFBJX0NPTlRST0xfU0VUX1NUQVRFOgotCQlpZiAocGhtLT5vYmplY3QgPT0gSFBJX09CSl9DT05UUk9MRVgKLQkJCSYmIHBobS0+dS5jeC5hdHRyaWJ1dGUgPT0gSFBJX0NPQlJBTkVUX1NFVF9EQVRBKQotCQkJZXJyID0gaHBpNjIwNV90cmFuc2Zlcl9kYXRhKHBhbywKLQkJCQlwaG0tPnUuY3gudS5jb2JyYW5ldF9iaWdkYXRhLnBiX2RhdGEsCi0JCQkJcGhtLT51LmN4LnUuY29icmFuZXRfYmlnZGF0YS5ieXRlX2NvdW50LAotCQkJCUg2MjBfSElGX1NFTkRfREFUQSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBIUElfQ09OVFJPTF9HRVRfU1RBVEU6Ci0JCWlmIChwaG0tPm9iamVjdCA9PSBIUElfT0JKX0NPTlRST0xFWAotCQkJJiYgcGhtLT51LmN4LmF0dHJpYnV0ZSA9PSBIUElfQ09CUkFORVRfR0VUX0RBVEEpCi0JCQllcnIgPSBocGk2MjA1X3RyYW5zZmVyX2RhdGEocGFvLAotCQkJCXBobS0+dS5jeC51LmNvYnJhbmV0X2JpZ2RhdGEucGJfZGF0YSwKLQkJCQlwaHItPnUuY3gudS5jb2JyYW5ldF9kYXRhLmJ5dGVfY291bnQsCi0JCQkJSDYyMF9ISUZfR0VUX0RBVEEpOwotCQlicmVhazsKIAl9CiAJcGhyLT5lcnJvciA9IGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9ocGk2MjA1LmggYi9zb3VuZC9wY2kvYXNpaHBpL2hwaTYyMDUuaAppbmRleCBkZjJmMDJjLi5lYzA4MjdiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXNpaHBpL2hwaTYyMDUuaAorKysgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaTYyMDUuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgQXVkaW9TY2llbmNlIEhQSSBkcml2ZXIKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMCAgQXVkaW9TY2llbmNlIEluYy4gPHN1cHBvcnRAYXVkaW9zY2llbmNlLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxMSAgQXVkaW9TY2llbmNlIEluYy4gPHN1cHBvcnRAYXVkaW9zY2llbmNlLmNvbT4KIAogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTcwLDE1ICs3MCwyOCBAQAogaW4gYW5kIG91dCBvZi4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgSFBJNjIwNV9TSVpFT0ZfREFUQSAoMTYqMTAyNCkKKworc3RydWN0IG1lc3NhZ2VfYnVmZmVyXzYyMDUgeworCXN0cnVjdCBocGlfbWVzc2FnZSBtZXNzYWdlOworCWNoYXIgZGF0YVsyNTZdOworfTsKKworc3RydWN0IHJlc3BvbnNlX2J1ZmZlcl82MjA1IHsKKwlzdHJ1Y3QgaHBpX3Jlc3BvbnNlIHJlc3BvbnNlOworCWNoYXIgZGF0YVsyNTZdOworfTsKKwordW5pb24gYnVmZmVyXzYyMDUgeworCXN0cnVjdCBtZXNzYWdlX2J1ZmZlcl82MjA1IG1lc3NhZ2VfYnVmZmVyOworCXN0cnVjdCByZXNwb25zZV9idWZmZXJfNjIwNSByZXNwb25zZV9idWZmZXI7CisJdTggYl9kYXRhW0hQSTYyMDVfU0laRU9GX0RBVEFdOworfTsKKwogc3RydWN0IGJ1c19tYXN0ZXJfaW50ZXJmYWNlIHsKIAl1MzIgaG9zdF9jbWQ7CiAJdTMyIGRzcF9hY2s7CiAJdTMyIHRyYW5zZmVyX3NpemVfaW5fYnl0ZXM7Ci0JdW5pb24gewotCQlzdHJ1Y3QgaHBpX21lc3NhZ2VfaGVhZGVyIG1lc3NhZ2VfYnVmZmVyOwotCQlzdHJ1Y3QgaHBpX3Jlc3BvbnNlX2hlYWRlciByZXNwb25zZV9idWZmZXI7Ci0JCXU4IGJfZGF0YVtIUEk2MjA1X1NJWkVPRl9EQVRBXTsKLQl9IHU7CisJdW5pb24gYnVmZmVyXzYyMDUgdTsKIAlzdHJ1Y3QgY29udHJvbGNhY2hlXzYyMDUgY29udHJvbF9jYWNoZTsKIAlzdHJ1Y3QgYXN5bmNfZXZlbnRfYnVmZmVyXzYyMDUgYXN5bmNfYnVmZmVyOwogCXN0cnVjdCBocGlfaG9zdGJ1ZmZlcl9zdGF0dXMKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvaHBpX2ludGVybmFsLmggYi9zb3VuZC9wY2kvYXNpaHBpL2hwaV9pbnRlcm5hbC5oCmluZGV4IGJmNWVjZWQuLmQ0OTcwMzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvaHBpX2ludGVybmFsLmgKKysrIGIvc291bmQvcGNpL2FzaWhwaS9ocGlfaW50ZXJuYWwuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIEF1ZGlvU2NpZW5jZSBIUEkgZHJpdmVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTAgIEF1ZGlvU2NpZW5jZSBJbmMuIDxzdXBwb3J0QGF1ZGlvc2NpZW5jZS5jb20+CisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTEgIEF1ZGlvU2NpZW5jZSBJbmMuIDxzdXBwb3J0QGF1ZGlvc2NpZW5jZS5jb20+CiAKICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC0zMiwxMiArMzIsNiBAQAogI2luY2x1ZGUgImhwaW9zLmgiCiAKIC8qIHBoeXNpY2FsIG1lbW9yeSBhbGxvY2F0aW9uICovCi12b2lkIGhwaW9zX2xvY2tlZF9tZW1faW5pdCh2b2lkCi0JKTsKLXZvaWQgaHBpb3NfbG9ja2VkX21lbV9mcmVlX2FsbCh2b2lkCi0JKTsKLSNkZWZpbmUgaHBpb3NfbG9ja2VkX21lbV9wcmVwYXJlKGEsIGIsIGMsIGQpOwotI2RlZmluZSBocGlvc19sb2NrZWRfbWVtX3VucHJlcGFyZShhKQogCiAvKiogQWxsb2NhdGUgYW5kIG1hcCBhbiBhcmVhIG9mIGxvY2tlZCBtZW1vcnkgZm9yIGJ1cyBtYXN0ZXIgRE1BIG9wZXJhdGlvbnMuCiAKQEAgLTIyNiw4ICsyMjAsOCBAQAogCiAJSFBJX0NPQlJBTkVUX1NFVCA9IEhQSV9DVExfQVRUUihDT0JSQU5FVCwgMSksCiAJSFBJX0NPQlJBTkVUX0dFVCA9IEhQSV9DVExfQVRUUihDT0JSQU5FVCwgMiksCi0JSFBJX0NPQlJBTkVUX1NFVF9EQVRBID0gSFBJX0NUTF9BVFRSKENPQlJBTkVULCAzKSwKLQlIUElfQ09CUkFORVRfR0VUX0RBVEEgPSBIUElfQ1RMX0FUVFIoQ09CUkFORVQsIDQpLAorCS8qSFBJX0NPQlJBTkVUX1NFVF9EQVRBICAgICAgICAgPSBIUElfQ1RMX0FUVFIoQ09CUkFORVQsIDMpLCAqLworCS8qSFBJX0NPQlJBTkVUX0dFVF9EQVRBICAgICAgICAgPSBIUElfQ1RMX0FUVFIoQ09CUkFORVQsIDQpLCAqLwogCUhQSV9DT0JSQU5FVF9HRVRfU1RBVFVTID0gSFBJX0NUTF9BVFRSKENPQlJBTkVULCA1KSwKIAlIUElfQ09CUkFORVRfU0VORF9QQUNLRVQgPSBIUElfQ1RMX0FUVFIoQ09CUkFORVQsIDYpLAogCUhQSV9DT0JSQU5FVF9HRVRfUEFDS0VUID0gSFBJX0NUTF9BVFRSKENPQlJBTkVULCA3KSwKQEAgLTM2NCwxMCArMzU4LDEyIEBACiAjZGVmaW5lIEhQSV9BREFQVEVSX0FTSShmKSAgIChmKQogCiBlbnVtIEhQSV9NRVNTQUdFX1RZUEVTIHsKLQlIUElfVFlQRV9NRVNTQUdFID0gMSwKKwlIUElfVFlQRV9SRVFVRVNUID0gMSwKIAlIUElfVFlQRV9SRVNQT05TRSA9IDIsCiAJSFBJX1RZUEVfREFUQSA9IDMsCi0JSFBJX1RZUEVfU1NYMkJZUEFTU19NRVNTQUdFID0gNAorCUhQSV9UWVBFX1NTWDJCWVBBU1NfTUVTU0FHRSA9IDQsCisJSFBJX1RZUEVfQ09NTUFORCA9IDUsCisJSFBJX1RZUEVfTk9USUZJQ0FUSU9OID0gNgogfTsKIAogZW51bSBIUElfT0JKRUNUX1RZUEVTIHsKQEAgLTM4Myw3ICszNzksNyBAQAogCUhQSV9PQkpfV0FUQ0hET0cgPSAxMCwKIAlIUElfT0JKX0NMT0NLID0gMTEsCiAJSFBJX09CSl9QUk9GSUxFID0gMTIsCi0JSFBJX09CSl9DT05UUk9MRVggPSAxMywKKwkvKiBIUElfIE9CSl8gQ09OVFJPTEVYICA9IDEzLCAqLwogCUhQSV9PQkpfQVNZTkNFVkVOVCA9IDE0CiAjZGVmaW5lIEhQSV9PQkpfTUFYSU5ERVggMTQKIH07CkBAIC02MDgsNyArNjA0LDcgQEAKICNlbmRpZgogCiBzdHJ1Y3QgaHBpX2J1ZmZlciB7Ci0gIC8qKiBwbGFjZWhvZGVyIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IChzZWUgZHdCdWZmZXJTaXplKSAqLworICAvKiogcGxhY2Vob2xkZXIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKHNlZSBkd0J1ZmZlclNpemUpICovCiAJc3RydWN0IGhwaV9tc2dfZm9ybWF0IHJlc2VydmVkOwogCXUzMiBjb21tYW5kOyAvKio8IEhQSV9CVUZGRVJfQ01EX3h4eCovCiAJdTMyIHBjaV9hZGRyZXNzOyAvKio8IFBDSSBwaHlzaWNhbCBhZGRyZXNzIG9mIGJ1ZmZlciBmb3IgRFNQIERNQSAqLwpAQCAtOTEyLDk1ICs5MDgsMTMgQEAKIAkJdTMyIHJlbWFpbmluZ19jaGFyczsKIAl9IGNoYXJzODsKIAljaGFyIGNfZGF0YTEyWzEyXTsKLX07Ci0KLS8qIEhQSV9DT05UUk9MWF9TVFJVQ1RVUkVTICovCi0KLS8qIE1lc3NhZ2UgKi8KLQotLyoqIFVzZWQgZm9yIGFsbCBITUkgdmFyaWFibGVzIHdoZXJlIG1heCBsZW5ndGggPD0gOCBieXRlcwotKi8KLXN0cnVjdCBocGlfY29udHJvbHhfbXNnX2NvYnJhbmV0X2RhdGEgewotCXUzMiBobWlfYWRkcmVzczsKLQl1MzIgYnl0ZV9jb3VudDsKLQl1MzIgZGF0YVsyXTsKLX07Ci0KLS8qKiBVc2VkIGZvciBzdHJpbmcgZGF0YSwgYW5kIGZvciBwYWNrZXQgYnJpZGdlCi0qLwotc3RydWN0IGhwaV9jb250cm9seF9tc2dfY29icmFuZXRfYmlnZGF0YSB7Ci0JdTMyIGhtaV9hZGRyZXNzOwotCXUzMiBieXRlX2NvdW50OwotCXU4ICpwYl9kYXRhOwotI2lmbmRlZiBIUEk2NEJJVAotCXUzMiBwYWRkaW5nOwotI2VuZGlmCi19OwotCi0vKiogVXNlZCBmb3IgUEFEUyBjb250cm9sIHJlYWRpbmcgb2Ygc3RyaW5nIGZpZWxkcy4KLSovCi1zdHJ1Y3QgaHBpX2NvbnRyb2x4X21zZ19wYWRfZGF0YSB7Ci0JdTMyIGZpZWxkOwotCXUzMiBieXRlX2NvdW50OwotCXU4ICpwYl9kYXRhOwotI2lmbmRlZiBIUEk2NEJJVAotCXUzMiBwYWRkaW5nOwotI2VuZGlmCi19OwotCi0vKiogVXNlZCBmb3IgZ2VuZXJpYyBkYXRhCi0qLwotCi1zdHJ1Y3QgaHBpX2NvbnRyb2x4X21zZ19nZW5lcmljIHsKLQl1MzIgcGFyYW0xOwotCXUzMiBwYXJhbTI7Ci19OwotCi1zdHJ1Y3QgaHBpX2NvbnRyb2x4X21zZyB7Ci0JdTE2IGF0dHJpYnV0ZTsJCS8qIGNvbnRyb2wgYXR0cmlidXRlIG9yIHByb3BlcnR5ICovCi0JdTE2IHNhdmVkX2luZGV4OwogCXVuaW9uIHsKLQkJc3RydWN0IGhwaV9jb250cm9seF9tc2dfY29icmFuZXRfZGF0YSBjb2JyYW5ldF9kYXRhOwotCQlzdHJ1Y3QgaHBpX2NvbnRyb2x4X21zZ19jb2JyYW5ldF9iaWdkYXRhIGNvYnJhbmV0X2JpZ2RhdGE7Ci0JCXN0cnVjdCBocGlfY29udHJvbHhfbXNnX2dlbmVyaWMgZ2VuZXJpYzsKLQkJc3RydWN0IGhwaV9jb250cm9seF9tc2dfcGFkX2RhdGEgcGFkX2RhdGE7Ci0JCS8qc3RydWN0IHBhcmFtX3ZhbHVlIHVuaXZlcnNhbF92YWx1ZTsgKi8KLQkJLyogbm90aGluZyBleHRyYSB0byBzZW5kIGZvciBzdGF0dXMgcmVhZCAqLwotCX0gdTsKLX07Ci0KLS8qIFJlc3BvbnNlICovCi0vKioKLSovCi1zdHJ1Y3QgaHBpX2NvbnRyb2x4X3Jlc19jb2JyYW5ldF9kYXRhIHsKLQl1MzIgYnl0ZV9jb3VudDsKLQl1MzIgZGF0YVsyXTsKLX07Ci0KLXN0cnVjdCBocGlfY29udHJvbHhfcmVzX2NvYnJhbmV0X2JpZ2RhdGEgewotCXUzMiBieXRlX2NvdW50OwotfTsKLQotc3RydWN0IGhwaV9jb250cm9seF9yZXNfY29icmFuZXRfc3RhdHVzIHsKLQl1MzIgc3RhdHVzOwotCXUzMiByZWFkYWJsZV9zaXplOwotCXUzMiB3cml0ZWFibGVfc2l6ZTsKLX07Ci0KLXN0cnVjdCBocGlfY29udHJvbHhfcmVzX2dlbmVyaWMgewotCXUzMiBwYXJhbTE7Ci0JdTMyIHBhcmFtMjsKLX07Ci0KLXN0cnVjdCBocGlfY29udHJvbHhfcmVzIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBocGlfY29udHJvbHhfcmVzX2NvYnJhbmV0X2JpZ2RhdGEgY29icmFuZXRfYmlnZGF0YTsKLQkJc3RydWN0IGhwaV9jb250cm9seF9yZXNfY29icmFuZXRfZGF0YSBjb2JyYW5ldF9kYXRhOwotCQlzdHJ1Y3QgaHBpX2NvbnRyb2x4X3Jlc19jb2JyYW5ldF9zdGF0dXMgY29icmFuZXRfc3RhdHVzOwotCQlzdHJ1Y3QgaHBpX2NvbnRyb2x4X3Jlc19nZW5lcmljIGdlbmVyaWM7Ci0JCS8qc3RydWN0IHBhcmFtX2luZm8gdW5pdmVyc2FsX2luZm87ICovCi0JCS8qc3RydWN0IHBhcmFtX3ZhbHVlIHVuaXZlcnNhbF92YWx1ZTsgKi8KLQl9IHU7CisJCXN0cnVjdCB7CisJCQl1MzIgc3RhdHVzOworCQkJdTMyIHJlYWRhYmxlX3NpemU7CisJCQl1MzIgd3JpdGVhYmxlX3NpemU7CisJCX0gc3RhdHVzOworCX0gY29icmFuZXQ7CiB9OwogCiBzdHJ1Y3QgaHBpX252bWVtb3J5X21zZyB7CkBAIC0xMTI2LDcgKzEwNDAsNiBAQAogCQkvKiBpZGVudGljYWwgdG8gc3RydWN0IGhwaV9jb250cm9sX21zZywKIAkJICAgYnV0IGZpZWxkIG5hbWluZyBpcyBpbXByb3ZlZCAqLwogCQlzdHJ1Y3QgaHBpX2NvbnRyb2xfdW5pb25fbXNnIGN1OwotCQlzdHJ1Y3QgaHBpX2NvbnRyb2x4X21zZyBjeDsJLyogZXh0ZW5kZWQgbWl4ZXIgY29udHJvbDsgKi8KIAkJc3RydWN0IGhwaV9udm1lbW9yeV9tc2cgbjsKIAkJc3RydWN0IGhwaV9ncGlvX21zZyBsOwkvKiBkaWdpdGFsIGkvbyAqLwogCQlzdHJ1Y3QgaHBpX3dhdGNoZG9nX21zZyB3OwpAQCAtMTE1MSw3ICsxMDY0LDcgQEAKIAlzaXplb2Yoc3RydWN0IGhwaV9tZXNzYWdlX2hlYWRlcikgKyBzaXplb2Yoc3RydWN0IGhwaV93YXRjaGRvZ19tc2cpLFwKIAlzaXplb2Yoc3RydWN0IGhwaV9tZXNzYWdlX2hlYWRlcikgKyBzaXplb2Yoc3RydWN0IGhwaV9jbG9ja19tc2cpLFwKIAlzaXplb2Yoc3RydWN0IGhwaV9tZXNzYWdlX2hlYWRlcikgKyBzaXplb2Yoc3RydWN0IGhwaV9wcm9maWxlX21zZyksXAotCXNpemVvZihzdHJ1Y3QgaHBpX21lc3NhZ2VfaGVhZGVyKSArIHNpemVvZihzdHJ1Y3QgaHBpX2NvbnRyb2x4X21zZyksXAorCXNpemVvZihzdHJ1Y3QgaHBpX21lc3NhZ2VfaGVhZGVyKSwgLyogY29udHJvbHggb2JqIHJlbW92ZWQgKi8gXAogCXNpemVvZihzdHJ1Y3QgaHBpX21lc3NhZ2VfaGVhZGVyKSArIHNpemVvZihzdHJ1Y3QgaHBpX2FzeW5jX21zZykgXAogfQogCkBAIC0xMTg4LDcgKzExMDEsNiBAQAogCQlzdHJ1Y3QgaHBpX2NvbnRyb2xfcmVzIGM7CS8qIG1peGVyIGNvbnRyb2w7ICovCiAJCS8qIGlkZW50aWNhbCB0byBocGlfY29udHJvbF9yZXMsIGJ1dCBmaWVsZCBuYW1pbmcgaXMgaW1wcm92ZWQgKi8KIAkJdW5pb24gaHBpX2NvbnRyb2xfdW5pb25fcmVzIGN1OwotCQlzdHJ1Y3QgaHBpX2NvbnRyb2x4X3JlcyBjeDsJLyogZXh0ZW5kZWQgbWl4ZXIgY29udHJvbDsgKi8KIAkJc3RydWN0IGhwaV9udm1lbW9yeV9yZXMgbjsKIAkJc3RydWN0IGhwaV9ncGlvX3JlcyBsOwkvKiBkaWdpdGFsIGkvbyAqLwogCQlzdHJ1Y3QgaHBpX3dhdGNoZG9nX3JlcyB3OwpAQCAtMTIxMyw3ICsxMTI1LDcgQEAKIAlzaXplb2Yoc3RydWN0IGhwaV9yZXNwb25zZV9oZWFkZXIpICsgc2l6ZW9mKHN0cnVjdCBocGlfd2F0Y2hkb2dfcmVzKSxcCiAJc2l6ZW9mKHN0cnVjdCBocGlfcmVzcG9uc2VfaGVhZGVyKSArIHNpemVvZihzdHJ1Y3QgaHBpX2Nsb2NrX3JlcyksXAogCXNpemVvZihzdHJ1Y3QgaHBpX3Jlc3BvbnNlX2hlYWRlcikgKyBzaXplb2Yoc3RydWN0IGhwaV9wcm9maWxlX3JlcyksXAotCXNpemVvZihzdHJ1Y3QgaHBpX3Jlc3BvbnNlX2hlYWRlcikgKyBzaXplb2Yoc3RydWN0IGhwaV9jb250cm9seF9yZXMpLFwKKwlzaXplb2Yoc3RydWN0IGhwaV9yZXNwb25zZV9oZWFkZXIpLCAvKiBjb250cm9seCBvYmogcmVtb3ZlZCAqLyBcCiAJc2l6ZW9mKHN0cnVjdCBocGlfcmVzcG9uc2VfaGVhZGVyKSArIHNpemVvZihzdHJ1Y3QgaHBpX2FzeW5jX3JlcykgXAogfQogCkBAIC0xMzA4LDYgKzEyMjAsMzAgQEAKIAl1OCBieXRlc1syNTZdOwogfTsKIAorc3RydWN0IGhwaV9tc2dfY29icmFuZXRfaG1pIHsKKwl1MTYgYXR0cmlidXRlOworCXUxNiBwYWRkaW5nOworCXUzMiBobWlfYWRkcmVzczsKKwl1MzIgYnl0ZV9jb3VudDsKK307CisKK3N0cnVjdCBocGlfbXNnX2NvYnJhbmV0X2htaXdyaXRlIHsKKwlzdHJ1Y3QgaHBpX21lc3NhZ2VfaGVhZGVyIGg7CisJc3RydWN0IGhwaV9tc2dfY29icmFuZXRfaG1pIHA7CisJdTggYnl0ZXNbMjU2XTsKK307CisKK3N0cnVjdCBocGlfbXNnX2NvYnJhbmV0X2htaXJlYWQgeworCXN0cnVjdCBocGlfbWVzc2FnZV9oZWFkZXIgaDsKKwlzdHJ1Y3QgaHBpX21zZ19jb2JyYW5ldF9obWkgcDsKK307CisKK3N0cnVjdCBocGlfcmVzX2NvYnJhbmV0X2htaXJlYWQgeworCXN0cnVjdCBocGlfcmVzcG9uc2VfaGVhZGVyIGg7CisJdTMyIGJ5dGVfY291bnQ7CisJdTggYnl0ZXNbMjU2XTsKK307CisKICNpZiAxCiAjZGVmaW5lIGhwaV9tZXNzYWdlX2hlYWRlcl92MSBocGlfbWVzc2FnZV9oZWFkZXIKICNkZWZpbmUgaHBpX3Jlc3BvbnNlX2hlYWRlcl92MSBocGlfcmVzcG9uc2VfaGVhZGVyCkBAIC0xMzM4LDcgKzEyNzQsNiBAQAogCQl1bmlvbiBocGlfbWl4ZXJ4X21zZyBteDsKIAkJc3RydWN0IGhwaV9jb250cm9sX21zZyBjOwogCQlzdHJ1Y3QgaHBpX2NvbnRyb2xfdW5pb25fbXNnIGN1OwotCQlzdHJ1Y3QgaHBpX2NvbnRyb2x4X21zZyBjeDsKIAkJc3RydWN0IGhwaV9udm1lbW9yeV9tc2cgbjsKIAkJc3RydWN0IGhwaV9ncGlvX21zZyBsOwogCQlzdHJ1Y3QgaHBpX3dhdGNoZG9nX21zZyB3OwpAQCAtMTM1OCw3ICsxMjkzLDYgQEAKIAkJdW5pb24gaHBpX21peGVyeF9yZXMgbXg7CiAJCXN0cnVjdCBocGlfY29udHJvbF9yZXMgYzsKIAkJdW5pb24gaHBpX2NvbnRyb2xfdW5pb25fcmVzIGN1OwotCQlzdHJ1Y3QgaHBpX2NvbnRyb2x4X3JlcyBjeDsKIAkJc3RydWN0IGhwaV9udm1lbW9yeV9yZXMgbjsKIAkJc3RydWN0IGhwaV9ncGlvX3JlcyBsOwogCQlzdHJ1Y3QgaHBpX3dhdGNoZG9nX3JlcyB3OwpAQCAtMTQ5MywxMiArMTQyNyw2IEBACiAJY2hhciB0ZW1wX3BhZGRpbmdbNl07CiB9OwogCi1zdHJ1Y3QgaHBpX2NvbnRyb2xfY2FjaGVfZ2VuZXJpYyB7Ci0Jc3RydWN0IGhwaV9jb250cm9sX2NhY2hlX2luZm8gaTsKLQl1MzIgZHcxOwotCXUzMiBkdzI7Ci19OwotCiBzdHJ1Y3QgaHBpX2NvbnRyb2xfY2FjaGVfc2luZ2xlIHsKIAl1bmlvbiB7CiAJCXN0cnVjdCBocGlfY29udHJvbF9jYWNoZV9pbmZvIGk7CkBAIC0xNTE0LDcgKzE0NDIsNiBAQAogCQlzdHJ1Y3QgaHBpX2NvbnRyb2xfY2FjaGVfc2lsZW5jZWRldGVjdG9yIHNpbGVuY2U7CiAJCXN0cnVjdCBocGlfY29udHJvbF9jYWNoZV9zYW1wbGVjbG9jayBjbGs7CiAJCXN0cnVjdCBocGlfY29udHJvbF9jYWNoZV9taWNyb3Bob25lIG1pY3JvcGhvbmU7Ci0JCXN0cnVjdCBocGlfY29udHJvbF9jYWNoZV9nZW5lcmljIGdlbmVyaWM7CiAJfSB1OwogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9ocGljbW4uYyBiL3NvdW5kL3BjaS9hc2locGkvaHBpY21uLmMKaW5kZXggYjE1YTAyZS4uNjViN2NhMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9ocGljbW4uYworKysgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaWNtbi5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJfQogCiAJaWYgKHBoci0+ZnVuY3Rpb24gIT0gcGhtLT5mdW5jdGlvbikgewotCQlIUElfREVCVUdfTE9HKEVSUk9SLCAiaGVhZGVyIHR5cGUgJWQgaW52YWxpZFxuIiwKKwkJSFBJX0RFQlVHX0xPRyhFUlJPUiwgImhlYWRlciBmdW5jdGlvbiAlZCBpbnZhbGlkXG4iLAogCQkJcGhyLT5mdW5jdGlvbik7CiAJCXJldHVybiBIUElfRVJST1JfSU5WQUxJRF9SRVNQT05TRTsKIAl9CkBAIC0zMTUsOCArMzE1LDcgQEAKIAlzaG9ydCBmb3VuZCA9IDE7CiAJc3RydWN0IGhwaV9jb250cm9sX2NhY2hlX2luZm8gKnBJOwogCXN0cnVjdCBocGlfY29udHJvbF9jYWNoZV9zaW5nbGUgKnBDOwotCXN0cnVjdCBocGlfY29udHJvbF9jYWNoZV9wYWQgKnBfcGFkOwotCisJc2l6ZV90IHJlc3BvbnNlX3NpemU7CiAJaWYgKCFmaW5kX2NvbnRyb2wocGhtLT5vYmpfaW5kZXgsIHBfY2FjaGUsICZwSSkpIHsKIAkJSFBJX0RFQlVHX0xPRyhWRVJCT1NFLAogCQkJIkhQSUNNTiBmaW5kX2NvbnRyb2woKSBmYWlsZWQgZm9yIGFkYXAgJWRcbiIsCkBAIC0zMjYsMTEgKzMyNSwxNSBAQAogCiAJcGhyLT5lcnJvciA9IDA7CiAKKwkvKiBzZXQgdGhlIGRlZmF1bHQgcmVzcG9uc2Ugc2l6ZSAqLworCXJlc3BvbnNlX3NpemUgPQorCQlzaXplb2Yoc3RydWN0IGhwaV9yZXNwb25zZV9oZWFkZXIpICsKKwkJc2l6ZW9mKHN0cnVjdCBocGlfY29udHJvbF9yZXMpOworCiAJLyogcEMgaXMgdGhlIGRlZmF1bHQgY2FjaGVkIGNvbnRyb2wgc3RydWN1cmUuIE1heSBiZSBjYXN0IHRvCiAJICAgc29tZXRoaW5nIGVsc2UgaW4gdGhlIGZvbGxvd2luZyBzd2l0Y2ggc3RhdGVtZW50LgogCSAqLwogCXBDID0gKHN0cnVjdCBocGlfY29udHJvbF9jYWNoZV9zaW5nbGUgKilwSTsKLQlwX3BhZCA9IChzdHJ1Y3QgaHBpX2NvbnRyb2xfY2FjaGVfcGFkICopcEk7CiAKIAlzd2l0Y2ggKHBJLT5jb250cm9sX3R5cGUpIHsKIApAQCAtNTI5LDkgKzUzMiw3IEBACiAJCXBJLT5jb250cm9sX2luZGV4LCBwSS0+Y29udHJvbF90eXBlLCBwaG0tPnUuYy5hdHRyaWJ1dGUpOwogCiAJaWYgKGZvdW5kKQotCQlwaHItPnNpemUgPQotCQkJc2l6ZW9mKHN0cnVjdCBocGlfcmVzcG9uc2VfaGVhZGVyKSArCi0JCQlzaXplb2Yoc3RydWN0IGhwaV9jb250cm9sX3Jlcyk7CisJCXBoci0+c2l6ZSA9ICh1MTYpcmVzcG9uc2Vfc2l6ZTsKIAogCXJldHVybiBmb3VuZDsKIH0KQEAgLTY4Miw3ICs2ODMsNyBAQAogdm9pZCBIUElfQ09NTU9OKHN0cnVjdCBocGlfbWVzc2FnZSAqcGhtLCBzdHJ1Y3QgaHBpX3Jlc3BvbnNlICpwaHIpCiB7CiAJc3dpdGNoIChwaG0tPnR5cGUpIHsKLQljYXNlIEhQSV9UWVBFX01FU1NBR0U6CisJY2FzZSBIUElfVFlQRV9SRVFVRVNUOgogCQlzd2l0Y2ggKHBobS0+b2JqZWN0KSB7CiAJCWNhc2UgSFBJX09CSl9TVUJTWVNURU06CiAJCQlzdWJzeXNfbWVzc2FnZShwaG0sIHBocik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXNpaHBpL2hwaWRzcGNkLmMgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaWRzcGNkLmMKaW5kZXggNWM2ZWExMS4uM2E3YWZhMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9ocGlkc3BjZC5jCisrKyBiL3NvdW5kL3BjaS9hc2locGkvaHBpZHNwY2QuYwpAQCAtMSw4ICsxLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIQorLyoqCiAKICAgICBBdWRpb1NjaWVuY2UgSFBJIGRyaXZlcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEwICBBdWRpb1NjaWVuY2UgSW5jLiA8c3VwcG9ydEBhdWRpb3NjaWVuY2UuY29tPgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDExICBBdWRpb1NjaWVuY2UgSW5jLiA8c3VwcG9ydEBhdWRpb3NjaWVuY2UuY29tPgogCiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtMTgsOTAgKzE4LDU5IEBACiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogCiBcZmlsZQotRnVuY3Rpb25zIGZvciByZWFkaW5nIERTUCBjb2RlIHRvIGxvYWQgaW50byBEU1AKLQotKExpbnV4IG9ubHk6KSBJZiBEU1BDT0RFX0ZJUk1XQVJFX0xPQURFUiBpcyBkZWZpbmVkLCBjb2RlIGlzIHJlYWQgdXNpbmcKK0Z1bmN0aW9ucyBmb3IgcmVhZGluZyBEU1AgY29kZSB1c2luZwogaG90cGx1ZyBmaXJtd2FyZSBsb2FkZXIgZnJvbSBpbmRpdmlkdWFsIGRzcCBjb2RlIGZpbGVzCi0KLUlmIG5laXRoZXIgb2YgdGhlIGFib3ZlIGlzIGRlZmluZWQsIGNvZGUgaXMgcmVhZCBmcm9tIGxpbmtlZCBhcnJheXMuCi1EU1BDT0RFX0FSUkFZIGlzIGRlZmluZWQuCi0KLUhQSV9JTkNMVURFXyoqKiogbXVzdCBiZSBkZWZpbmVkCi1hbmQgdGhlIGFwcHJvcHJpYXRlIGh6ej8/Pz8/LmMgb3IgaGV4Pz8/Pz8uYyBsaW5rZWQgaW4KLQotICovCisqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBTT1VSQ0VGSUxFX05BTUUgImhwaWRzcGNkLmMiCiAjaW5jbHVkZSAiaHBpZHNwY2QuaCIKICNpbmNsdWRlICJocGlkZWJ1Zy5oIgogCi0vKioKLSBIZWFkZXIgc3RydWN0dXJlIGZvciBiaW5hcnkgZHNwIGNvZGUgZmlsZSAoc2VlIGFzaWRzcC5kb2MpCi0gVGhpcyBzdHJ1Y3R1cmUgbXVzdCBtYXRjaCB0aGF0IHVzZWQgaW4gczJiaW4uYyBmb3IgZ2VuZXJhdGlvbiBvZiBhc2lkc3AuYmluCi0gKi8KLQotI2lmbmRlZiBESVNBQkxFX1BSQUdNQV9QQUNLMQotI3ByYWdtYSBwYWNrKHB1c2gsIDEpCi0jZW5kaWYKLQotc3RydWN0IGNvZGVfaGVhZGVyIHsKLQl1MzIgc2l6ZTsKLQljaGFyIHR5cGVbNF07Ci0JdTMyIGFkYXB0ZXI7Ci0JdTMyIHZlcnNpb247Ci0JdTMyIGNyYzsKK3N0cnVjdCBkc3BfY29kZV9wcml2YXRlIHsKKwkvKiogIEZpcm13YXJlIGRlc2NyaXB0b3IgKi8KKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiB9OwogCi0jaWZuZGVmIERJU0FCTEVfUFJBR01BX1BBQ0sxCi0jcHJhZ21hIHBhY2socG9wKQotI2VuZGlmCi0KICNkZWZpbmUgSFBJX1ZFUl9ERUNJTUFMICgoaW50KShIUElfVkVSX01BSk9SKEhQSV9WRVIpICogMTAwMDAgKyBcCiAJICAgIEhQSV9WRVJfTUlOT1IoSFBJX1ZFUikgKiAxMDAgKyBIUElfVkVSX1JFTEVBU0UoSFBJX1ZFUikpKQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc2hvcnQgaHBpX2RzcF9jb2RlX29wZW4odTMyIGFkYXB0ZXIsIHN0cnVjdCBkc3BfY29kZSAqcHNfZHNwX2NvZGUsCi0JdTMyICpwb3NfZXJyb3JfY29kZSkKK3Nob3J0IGhwaV9kc3BfY29kZV9vcGVuKHUzMiBhZGFwdGVyLCB2b2lkICpvc19kYXRhLCBzdHJ1Y3QgZHNwX2NvZGUgKmRzcF9jb2RlLAorCXUzMiAqb3NfZXJyb3JfY29kZSkKIHsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnBzX2Zpcm13YXJlID0gcHNfZHNwX2NvZGUtPnBzX2Zpcm13YXJlOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmU7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IG9zX2RhdGE7CiAJc3RydWN0IGNvZGVfaGVhZGVyIGhlYWRlcjsKIAljaGFyIGZ3X25hbWVbMjBdOwogCWludCBlcnI7CiAKIAlzcHJpbnRmKGZ3X25hbWUsICJhc2locGkvZHNwJTA0eC5iaW4iLCBhZGFwdGVyKTsKIAotCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJnBzX2Zpcm13YXJlLCBmd19uYW1lLAotCQkmcHNfZHNwX2NvZGUtPnBzX2Rldi0+ZGV2KTsKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZmaXJtd2FyZSwgZndfbmFtZSwgJmRldi0+ZGV2KTsKIAotCWlmIChlcnIgIT0gMCkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcHNfZHNwX2NvZGUtPnBzX2Rldi0+ZGV2LAorCWlmIChlcnIgfHwgIWZpcm13YXJlKSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZkZXYtPmRldiwKIAkJCSIlZCwgcmVxdWVzdF9maXJtd2FyZSBmYWlsZWQgZm9yICAlc1xuIiwgZXJyLAogCQkJZndfbmFtZSk7CiAJCWdvdG8gZXJyb3IxOwogCX0KLQlpZiAocHNfZmlybXdhcmUtPnNpemUgPCBzaXplb2YoaGVhZGVyKSkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcHNfZHNwX2NvZGUtPnBzX2Rldi0+ZGV2LAotCQkJIkhlYWRlciBzaXplIHRvbyBzbWFsbCAlc1xuIiwgZndfbmFtZSk7CisJaWYgKGZpcm13YXJlLT5zaXplIDwgc2l6ZW9mKGhlYWRlcikpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmRldi0+ZGV2LCAiSGVhZGVyIHNpemUgdG9vIHNtYWxsICVzXG4iLAorCQkJZndfbmFtZSk7CiAJCWdvdG8gZXJyb3IyOwogCX0KLQltZW1jcHkoJmhlYWRlciwgcHNfZmlybXdhcmUtPmRhdGEsIHNpemVvZihoZWFkZXIpKTsKLQlpZiAoaGVhZGVyLmFkYXB0ZXIgIT0gYWRhcHRlcikgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcHNfZHNwX2NvZGUtPnBzX2Rldi0+ZGV2LAotCQkJIkFkYXB0ZXIgdHlwZSBpbmNvcnJlY3QgJTR4ICE9ICU0eFxuIiwgaGVhZGVyLmFkYXB0ZXIsCi0JCQlhZGFwdGVyKTsKLQkJZ290byBlcnJvcjI7Ci0JfQotCWlmIChoZWFkZXIuc2l6ZSAhPSBwc19maXJtd2FyZS0+c2l6ZSkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcHNfZHNwX2NvZGUtPnBzX2Rldi0+ZGV2LAotCQkJIkNvZGUgc2l6ZSB3cm9uZyAgJWQgIT0gJWxkXG4iLCBoZWFkZXIuc2l6ZSwKLQkJCSh1bnNpZ25lZCBsb25nKXBzX2Zpcm13YXJlLT5zaXplKTsKKwltZW1jcHkoJmhlYWRlciwgZmlybXdhcmUtPmRhdGEsIHNpemVvZihoZWFkZXIpKTsKKworCWlmICgoaGVhZGVyLnR5cGUgIT0gMHg0NTQ0NEY0MykgfHwJLyogIkNPREUiICovCisJCShoZWFkZXIuYWRhcHRlciAhPSBhZGFwdGVyKQorCQl8fCAoaGVhZGVyLnNpemUgIT0gZmlybXdhcmUtPnNpemUpKSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZkZXYtPmRldiwgIkludmFsaWQgZmlybXdhcmUgZmlsZVxuIik7CiAJCWdvdG8gZXJyb3IyOwogCX0KIAotCWlmIChoZWFkZXIudmVyc2lvbiAvIDEwMCAhPSBIUElfVkVSX0RFQ0lNQUwgLyAxMDApIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBzX2RzcF9jb2RlLT5wc19kZXYtPmRldiwKKwlpZiAoKGhlYWRlci52ZXJzaW9uIC8gMTAwICYgfjEpICE9IChIUElfVkVSX0RFQ0lNQUwgLyAxMDAgJiB+MSkpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmRldi0+ZGV2LAogCQkJIkluY29tcGF0aWJsZSBmaXJtd2FyZSB2ZXJzaW9uICIKIAkJCSJEU1AgaW1hZ2UgJWQgIT0gRHJpdmVyICVkXG4iLCBoZWFkZXIudmVyc2lvbiwKIAkJCUhQSV9WRVJfREVDSU1BTCk7CkBAIC0xMDksNjcgKzc4LDcwIEBACiAJfQogCiAJaWYgKGhlYWRlci52ZXJzaW9uICE9IEhQSV9WRVJfREVDSU1BTCkgewotCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJnBzX2RzcF9jb2RlLT5wc19kZXYtPmRldiwKKwkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZkZXYtPmRldiwKIAkJCSJGaXJtd2FyZTogcmVsZWFzZSB2ZXJzaW9uIG1pc21hdGNoICBEU1AgaW1hZ2UgJWQgIT0gRHJpdmVyICVkXG4iLAogCQkJaGVhZGVyLnZlcnNpb24sIEhQSV9WRVJfREVDSU1BTCk7CiAJfQogCiAJSFBJX0RFQlVHX0xPRyhERUJVRywgImRzcCBjb2RlICVzIG9wZW5lZFxuIiwgZndfbmFtZSk7Ci0JcHNfZHNwX2NvZGUtPnBzX2Zpcm13YXJlID0gcHNfZmlybXdhcmU7Ci0JcHNfZHNwX2NvZGUtPmJsb2NrX2xlbmd0aCA9IGhlYWRlci5zaXplIC8gc2l6ZW9mKHUzMik7Ci0JcHNfZHNwX2NvZGUtPndvcmRfY291bnQgPSBzaXplb2YoaGVhZGVyKSAvIHNpemVvZih1MzIpOwotCXBzX2RzcF9jb2RlLT52ZXJzaW9uID0gaGVhZGVyLnZlcnNpb247Ci0JcHNfZHNwX2NvZGUtPmNyYyA9IGhlYWRlci5jcmM7CisJZHNwX2NvZGUtPnB2dCA9IGttYWxsb2Moc2l6ZW9mKCpkc3BfY29kZS0+cHZ0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkc3BfY29kZS0+cHZ0KQorCQlyZXR1cm4gSFBJX0VSUk9SX01FTU9SWV9BTExPQzsKKworCWRzcF9jb2RlLT5wdnQtPmRldiA9IGRldjsKKwlkc3BfY29kZS0+cHZ0LT5maXJtd2FyZSA9IGZpcm13YXJlOworCWRzcF9jb2RlLT5oZWFkZXIgPSBoZWFkZXI7CisJZHNwX2NvZGUtPmJsb2NrX2xlbmd0aCA9IGhlYWRlci5zaXplIC8gc2l6ZW9mKHUzMik7CisJZHNwX2NvZGUtPndvcmRfY291bnQgPSBzaXplb2YoaGVhZGVyKSAvIHNpemVvZih1MzIpOwogCXJldHVybiAwOwogCiBlcnJvcjI6Ci0JcmVsZWFzZV9maXJtd2FyZShwc19maXJtd2FyZSk7CisJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CiBlcnJvcjE6Ci0JcHNfZHNwX2NvZGUtPnBzX2Zpcm13YXJlID0gTlVMTDsKLQlwc19kc3BfY29kZS0+YmxvY2tfbGVuZ3RoID0gMDsKKwlkc3BfY29kZS0+YmxvY2tfbGVuZ3RoID0gMDsKIAlyZXR1cm4gSFBJX0VSUk9SX0RTUF9GSUxFX05PVF9GT1VORDsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaHBpX2RzcF9jb2RlX2Nsb3NlKHN0cnVjdCBkc3BfY29kZSAqcHNfZHNwX2NvZGUpCit2b2lkIGhwaV9kc3BfY29kZV9jbG9zZShzdHJ1Y3QgZHNwX2NvZGUgKmRzcF9jb2RlKQogewotCWlmIChwc19kc3BfY29kZS0+cHNfZmlybXdhcmUgIT0gTlVMTCkgeworCWlmIChkc3BfY29kZS0+cHZ0LT5maXJtd2FyZSkgewogCQlIUElfREVCVUdfTE9HKERFQlVHLCAiZHNwIGNvZGUgY2xvc2VkXG4iKTsKLQkJcmVsZWFzZV9maXJtd2FyZShwc19kc3BfY29kZS0+cHNfZmlybXdhcmUpOwotCQlwc19kc3BfY29kZS0+cHNfZmlybXdhcmUgPSBOVUxMOworCQlyZWxlYXNlX2Zpcm13YXJlKGRzcF9jb2RlLT5wdnQtPmZpcm13YXJlKTsKKwkJZHNwX2NvZGUtPnB2dC0+ZmlybXdhcmUgPSBOVUxMOwogCX0KKwlrZnJlZShkc3BfY29kZS0+cHZ0KTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaHBpX2RzcF9jb2RlX3Jld2luZChzdHJ1Y3QgZHNwX2NvZGUgKnBzX2RzcF9jb2RlKQordm9pZCBocGlfZHNwX2NvZGVfcmV3aW5kKHN0cnVjdCBkc3BfY29kZSAqZHNwX2NvZGUpCiB7CiAJLyogR28gYmFjayB0byBzdGFydCBvZiAgZGF0YSwgYWZ0ZXIgaGVhZGVyICovCi0JcHNfZHNwX2NvZGUtPndvcmRfY291bnQgPSBzaXplb2Yoc3RydWN0IGNvZGVfaGVhZGVyKSAvIHNpemVvZih1MzIpOworCWRzcF9jb2RlLT53b3JkX2NvdW50ID0gc2l6ZW9mKHN0cnVjdCBjb2RlX2hlYWRlcikgLyBzaXplb2YodTMyKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXNob3J0IGhwaV9kc3BfY29kZV9yZWFkX3dvcmQoc3RydWN0IGRzcF9jb2RlICpwc19kc3BfY29kZSwgdTMyICpwd29yZCkKK3Nob3J0IGhwaV9kc3BfY29kZV9yZWFkX3dvcmQoc3RydWN0IGRzcF9jb2RlICpkc3BfY29kZSwgdTMyICpwd29yZCkKIHsKLQlpZiAocHNfZHNwX2NvZGUtPndvcmRfY291bnQgKyAxID4gcHNfZHNwX2NvZGUtPmJsb2NrX2xlbmd0aCkKKwlpZiAoZHNwX2NvZGUtPndvcmRfY291bnQgKyAxID4gZHNwX2NvZGUtPmJsb2NrX2xlbmd0aCkKIAkJcmV0dXJuIEhQSV9FUlJPUl9EU1BfRklMRV9GT1JNQVQ7CiAKLQkqcHdvcmQgPSAoKHUzMiAqKShwc19kc3BfY29kZS0+cHNfZmlybXdhcmUtPmRhdGEpKVtwc19kc3BfY29kZS0+CisJKnB3b3JkID0gKCh1MzIgKikoZHNwX2NvZGUtPnB2dC0+ZmlybXdhcmUtPmRhdGEpKVtkc3BfY29kZS0+CiAJCXdvcmRfY291bnRdOwotCXBzX2RzcF9jb2RlLT53b3JkX2NvdW50Kys7CisJZHNwX2NvZGUtPndvcmRfY291bnQrKzsKIAlyZXR1cm4gMDsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHNob3J0IGhwaV9kc3BfY29kZV9yZWFkX2Jsb2NrKHNpemVfdCB3b3Jkc19yZXF1ZXN0ZWQsCi0Jc3RydWN0IGRzcF9jb2RlICpwc19kc3BfY29kZSwgdTMyICoqcHBibG9jaykKKwlzdHJ1Y3QgZHNwX2NvZGUgKmRzcF9jb2RlLCB1MzIgKipwcGJsb2NrKQogewotCWlmIChwc19kc3BfY29kZS0+d29yZF9jb3VudCArIHdvcmRzX3JlcXVlc3RlZCA+Ci0JCXBzX2RzcF9jb2RlLT5ibG9ja19sZW5ndGgpCisJaWYgKGRzcF9jb2RlLT53b3JkX2NvdW50ICsgd29yZHNfcmVxdWVzdGVkID4gZHNwX2NvZGUtPmJsb2NrX2xlbmd0aCkKIAkJcmV0dXJuIEhQSV9FUlJPUl9EU1BfRklMRV9GT1JNQVQ7CiAKIAkqcHBibG9jayA9Ci0JCSgodTMyICopKHBzX2RzcF9jb2RlLT5wc19maXJtd2FyZS0+ZGF0YSkpICsKLQkJcHNfZHNwX2NvZGUtPndvcmRfY291bnQ7Ci0JcHNfZHNwX2NvZGUtPndvcmRfY291bnQgKz0gd29yZHNfcmVxdWVzdGVkOworCQkoKHUzMiAqKShkc3BfY29kZS0+cHZ0LT5maXJtd2FyZS0+ZGF0YSkpICsKKwkJZHNwX2NvZGUtPndvcmRfY291bnQ7CisJZHNwX2NvZGUtPndvcmRfY291bnQgKz0gd29yZHNfcmVxdWVzdGVkOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9ocGlkc3BjZC5oIGIvc291bmQvcGNpL2FzaWhwaS9ocGlkc3BjZC5oCmluZGV4IDY1ZjBjYTcuLmIyMjg4MTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvaHBpZHNwY2QuaAorKysgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaWRzcGNkLmgKQEAgLTIsNyArMiw3IEBACiAvKioKIAogICAgIEF1ZGlvU2NpZW5jZSBIUEkgZHJpdmVyCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTAgIEF1ZGlvU2NpZW5jZSBJbmMuIDxzdXBwb3J0QGF1ZGlvc2NpZW5jZS5jb20+CisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTEgIEF1ZGlvU2NpZW5jZSBJbmMuIDxzdXBwb3J0QGF1ZGlvc2NpZW5jZS5jb20+CiAKICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC0yMCwxOSArMjAsNiBAQAogXGZpbGUKIEZ1bmN0aW9ucyBmb3IgcmVhZGluZyBEU1AgY29kZSB0byBsb2FkIGludG8gRFNQCiAKLSBocGlfZHNwY29kZV9kZWZpbmVzIEhQSSBEU1AgY29kZSBsb2FkaW5nIG1ldGhvZAotRGVmaW5lIGV4YWN0bHkgb25lIG9mIHRoZXNlIHRvIHNlbGVjdCBob3cgdGhlIERTUCBjb2RlIGlzIHN1cHBsaWVkIHRvCi10aGUgYWRhcHRlci4KLQotRW5kIHVzZXJzIHdyaXRpbmcgYXBwbGljYXRpb25zIHRoYXQgdXNlIHRoZSBIUEkgaW50ZXJmYWNlIGRvIG5vdCBoYXZlIHRvCi11c2UgYW55IG9mIHRoZSBiZWxvdyBkZWZpbmVzOyB0aGV5IGFyZSBvbmx5IG5lY2Vzc2FyeSBmb3IgYnVpbGRpbmcgZHJpdmVycwotCi1IUElfRFNQQ09ERV9GSUxFOgotRFNQIGNvZGUgaXMgc3VwcGxpZWQgYXMgYSBmaWxlIHRoYXQgaXMgb3BlbmVkIGFuZCByZWFkIGZyb20gYnkgdGhlIGRyaXZlci4KLQotSFBJX0RTUENPREVfRklSTVdBUkU6Ci1EU1AgY29kZSBpcyByZWFkIHVzaW5nIHRoZSBob3RwbHVnIGZpcm13YXJlIGxvYWRlciBtb2R1bGUuCi0gICAgIE9ubHkgdmFsaWQgd2hlbiBjb21waWxpbmcgdGhlIEhQSSBrZXJuZWwgZHJpdmVyIHVuZGVyIExpbnV4LgogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX0hQSURTUENEX0hfCkBAIC00MCwzNyArMjcsNTYgQEAKIAogI2luY2x1ZGUgImhwaV9pbnRlcm5hbC5oIgogCi0jaWZuZGVmIERJU0FCTEVfUFJBR01BX1BBQ0sxCi0jcHJhZ21hIHBhY2socHVzaCwgMSkKLSNlbmRpZgorLyoqIENvZGUgaGVhZGVyIHZlcnNpb24gaXMgZGVjaW1hbCBlbmNvZGVkIGUuZy4gNC4wNi4xMCBpcyA0MDYwMSAqLworI2RlZmluZSBIUElfVkVSX0RFQ0lNQUwgKChpbnQpKEhQSV9WRVJfTUFKT1IoSFBJX1ZFUikgKiAxMDAwMCArIFwKK0hQSV9WRVJfTUlOT1IoSFBJX1ZFUikgKiAxMDAgKyBIUElfVkVSX1JFTEVBU0UoSFBJX1ZFUikpKQorCisvKiogSGVhZGVyIHN0cnVjdHVyZSBmb3IgZHNwIGZpcm13YXJlIGZpbGUKKyBUaGlzIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoYXQgdXNlZCBpbiBzMmJpbi5jIGZvciBnZW5lcmF0aW9uIG9mIGFzaWRzcC5iaW4KKyAqLworLyojaWZuZGVmIERJU0FCTEVfUFJBR01BX1BBQ0sxICovCisvKiNwcmFnbWEgcGFjayhwdXNoLCAxKSAqLworLyojZW5kaWYgKi8KK3N0cnVjdCBjb2RlX2hlYWRlciB7CisJLyoqIFNpemUgaW4gYnl0ZXMgaW5jbHVkaW5nIGhlYWRlciAqLworCXUzMiBzaXplOworCS8qKiBGaWxlIHR5cGUgdGFnICJDT0RFIiA9PSAweDQ1NDQ0RjQzICovCisJdTMyIHR5cGU7CisJLyoqIEFkYXB0ZXIgbW9kZWwgbnVtYmVyICovCisJdTMyIGFkYXB0ZXI7CisJLyoqIEZpcm13YXJlIHZlcnNpb24qLworCXUzMiB2ZXJzaW9uOworCS8qKiBEYXRhIGNoZWNrc3VtICovCisJdTMyIGNoZWNrc3VtOworfTsKKy8qI2lmbmRlZiBESVNBQkxFX1BSQUdNQV9QQUNLMSAqLworLyojcHJhZ21hIHBhY2socG9wKSAqLworLyojZW5kaWYgKi8KKworLyo/IERvbid0IG5lZWQgdGhlIHByYWdtYXM/ICovCitjb21waWxlX3RpbWVfYXNzZXJ0KChzaXplb2Yoc3RydWN0IGNvZGVfaGVhZGVyKSA9PSAyMCksIGNvZGVfaGVhZGVyX3NpemUpOwogCiAvKiogRGVzY3JpcHRvciBmb3IgZHNwY29kZSBmcm9tIGZpcm13YXJlIGxvYWRlciAqLwogc3RydWN0IGRzcF9jb2RlIHsKLQkvKiogIEZpcm13YXJlIGRlc2NyaXB0b3IgKi8KLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnBzX2Zpcm13YXJlOwotCXN0cnVjdCBwY2lfZGV2ICpwc19kZXY7CisJLyoqIGNvcHkgb2YgIGZpbGUgaGVhZGVyICovCisJc3RydWN0IGNvZGVfaGVhZGVyIGhlYWRlcjsKIAkvKiogRXhwZWN0ZWQgbnVtYmVyIG9mIHdvcmRzIGluIHRoZSB3aG9sZSBkc3AgY29kZSxJTkNMIGhlYWRlciAqLwotCWxvbmcgaW50IGJsb2NrX2xlbmd0aDsKKwl1MzIgYmxvY2tfbGVuZ3RoOwogCS8qKiBOdW1iZXIgb2Ygd29yZHMgcmVhZCBzbyBmYXIgKi8KLQlsb25nIGludCB3b3JkX2NvdW50OwotCS8qKiBWZXJzaW9uIHJlYWQgZnJvbSBkc3AgY29kZSBmaWxlICovCi0JdTMyIHZlcnNpb247Ci0JLyoqIENSQyByZWFkIGZyb20gZHNwIGNvZGUgZmlsZSAqLwotCXUzMiBjcmM7CisJdTMyIHdvcmRfY291bnQ7CisKKwkvKiogaW50ZXJuYWwgc3RhdGUgb2YgRFNQIGNvZGUgcmVhZGVyICovCisJc3RydWN0IGRzcF9jb2RlX3ByaXZhdGUgKnB2dDsKIH07CiAKLSNpZm5kZWYgRElTQUJMRV9QUkFHTUFfUEFDSzEKLSNwcmFnbWEgcGFjayhwb3ApCi0jZW5kaWYKLQotLyoqIFByZXBhcmUgKnBzRHNwQ29kZSB0byByZWZlciB0byB0aGUgcmVxdXVlc3RlZCBhZGFwdGVyLgotIFNlYXJjaGVzIHRoZSBmaWxlLCBvciBzZWxlY3RzIHRoZSBhcHByb3ByaWF0ZSBsaW5rZWQgYXJyYXkKKy8qKiBQcmVwYXJlICpwc0RzcENvZGUgdG8gcmVmZXIgdG8gdGhlIHJlcXVlc3RlZCBhZGFwdGVyJ3MgZmlybXdhcmUuCitDb2RlIGZpbGUgbmFtZSBpcyBvYnRhaW5lZCBmcm9tIEhwaU9zX0dldERzcENvZGVQYXRoCiAKIFxyZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3IgZXJyb3IgY29kZSBpZiByZXF1ZXN0ZWQgY29kZSBpcyBub3QgYXZhaWxhYmxlCiAqLwogc2hvcnQgaHBpX2RzcF9jb2RlX29wZW4oCiAJLyoqIENvZGUgaWRlbnRpZmllciwgdXN1YWxseSBhZGFwdGVyIGZhbWlseSAqLwotCXUzMiBhZGFwdGVyLAorCXUzMiBhZGFwdGVyLCB2b2lkICpwY2lfZGV2LAogCS8qKiBQb2ludGVyIHRvIERTUCBjb2RlIGNvbnRyb2wgc3RydWN0dXJlICovCiAJc3RydWN0IGRzcF9jb2RlICpwc19kc3BfY29kZSwKIAkvKiogUG9pbnRlciB0byBkd29yZCB0byByZWNlaXZlIE9TIHNwZWNpZmljIGVycm9yIGNvZGUgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvaHBpZnVuYy5jIGIvc291bmQvcGNpL2FzaWhwaS9ocGlmdW5jLmMKaW5kZXggNzM5N2IxNi4uZWJiNTY4ZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9ocGlmdW5jLmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9ocGlmdW5jLmMKQEAgLTE2NjMsNjggKzE2NjMsNjQgQEAKIHUxNiBocGlfY29icmFuZXRfaG1pX3dyaXRlKHUzMiBoX2NvbnRyb2wsIHUzMiBobWlfYWRkcmVzcywgdTMyIGJ5dGVfY291bnQsCiAJdTggKnBiX2RhdGEpCiB7Ci0Jc3RydWN0IGhwaV9tZXNzYWdlIGhtOwotCXN0cnVjdCBocGlfcmVzcG9uc2UgaHI7CisJc3RydWN0IGhwaV9tc2dfY29icmFuZXRfaG1pd3JpdGUgaG07CisJc3RydWN0IGhwaV9yZXNwb25zZV9oZWFkZXIgaHI7CiAKLQlocGlfaW5pdF9tZXNzYWdlX3Jlc3BvbnNlKCZobSwgJmhyLCBIUElfT0JKX0NPTlRST0xFWCwKLQkJSFBJX0NPTlRST0xfU0VUX1NUQVRFKTsKLQlpZiAoaHBpX2hhbmRsZV9pbmRleGVzKGhfY29udHJvbCwgJmhtLmFkYXB0ZXJfaW5kZXgsICZobS5vYmpfaW5kZXgpKQorCWhwaV9pbml0X21lc3NhZ2VfcmVzcG9uc2VWMSgmaG0uaCwgc2l6ZW9mKGhtKSwgJmhyLCBzaXplb2YoaHIpLAorCQlIUElfT0JKX0NPTlRST0wsIEhQSV9DT05UUk9MX1NFVF9TVEFURSk7CisKKwlpZiAoaHBpX2hhbmRsZV9pbmRleGVzKGhfY29udHJvbCwgJmhtLmguYWRhcHRlcl9pbmRleCwKKwkJCSZobS5oLm9ial9pbmRleCkpCiAJCXJldHVybiBIUElfRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAKLQlobS51LmN4LnUuY29icmFuZXRfZGF0YS5ieXRlX2NvdW50ID0gYnl0ZV9jb3VudDsKLQlobS51LmN4LnUuY29icmFuZXRfZGF0YS5obWlfYWRkcmVzcyA9IGhtaV9hZGRyZXNzOworCWlmIChieXRlX2NvdW50ID4gc2l6ZW9mKGhtLmJ5dGVzKSkKKwkJcmV0dXJuIEhQSV9FUlJPUl9NRVNTQUdFX0JVRkZFUl9UT09fU01BTEw7CiAKLQlpZiAoYnl0ZV9jb3VudCA8PSA4KSB7Ci0JCW1lbWNweShobS51LmN4LnUuY29icmFuZXRfZGF0YS5kYXRhLCBwYl9kYXRhLCBieXRlX2NvdW50KTsKLQkJaG0udS5jeC5hdHRyaWJ1dGUgPSBIUElfQ09CUkFORVRfU0VUOwotCX0gZWxzZSB7Ci0JCWhtLnUuY3gudS5jb2JyYW5ldF9iaWdkYXRhLnBiX2RhdGEgPSBwYl9kYXRhOwotCQlobS51LmN4LmF0dHJpYnV0ZSA9IEhQSV9DT0JSQU5FVF9TRVRfREFUQTsKLQl9CisJaG0ucC5hdHRyaWJ1dGUgPSBIUElfQ09CUkFORVRfU0VUOworCWhtLnAuYnl0ZV9jb3VudCA9IGJ5dGVfY291bnQ7CisJaG0ucC5obWlfYWRkcmVzcyA9IGhtaV9hZGRyZXNzOworCW1lbWNweShobS5ieXRlcywgcGJfZGF0YSwgYnl0ZV9jb3VudCk7CisJaG0uaC5zaXplID0gKHUxNikoc2l6ZW9mKGhtLmgpICsgc2l6ZW9mKGhtLnApICsgYnl0ZV9jb3VudCk7CiAKLQlocGlfc2VuZF9yZWN2KCZobSwgJmhyKTsKLQorCWhwaV9zZW5kX3JlY3ZWMSgmaG0uaCwgJmhyKTsKIAlyZXR1cm4gaHIuZXJyb3I7CiB9CiAKIHUxNiBocGlfY29icmFuZXRfaG1pX3JlYWQodTMyIGhfY29udHJvbCwgdTMyIGhtaV9hZGRyZXNzLCB1MzIgbWF4X2J5dGVfY291bnQsCiAJdTMyICpwYnl0ZV9jb3VudCwgdTggKnBiX2RhdGEpCiB7Ci0Jc3RydWN0IGhwaV9tZXNzYWdlIGhtOwotCXN0cnVjdCBocGlfcmVzcG9uc2UgaHI7CisJc3RydWN0IGhwaV9tc2dfY29icmFuZXRfaG1pcmVhZCBobTsKKwlzdHJ1Y3QgaHBpX3Jlc19jb2JyYW5ldF9obWlyZWFkIGhyOwogCi0JaHBpX2luaXRfbWVzc2FnZV9yZXNwb25zZSgmaG0sICZociwgSFBJX09CSl9DT05UUk9MRVgsCi0JCUhQSV9DT05UUk9MX0dFVF9TVEFURSk7Ci0JaWYgKGhwaV9oYW5kbGVfaW5kZXhlcyhoX2NvbnRyb2wsICZobS5hZGFwdGVyX2luZGV4LCAmaG0ub2JqX2luZGV4KSkKKwlocGlfaW5pdF9tZXNzYWdlX3Jlc3BvbnNlVjEoJmhtLmgsIHNpemVvZihobSksICZoci5oLCBzaXplb2YoaHIpLAorCQlIUElfT0JKX0NPTlRST0wsIEhQSV9DT05UUk9MX0dFVF9TVEFURSk7CisKKwlpZiAoaHBpX2hhbmRsZV9pbmRleGVzKGhfY29udHJvbCwgJmhtLmguYWRhcHRlcl9pbmRleCwKKwkJCSZobS5oLm9ial9pbmRleCkpCiAJCXJldHVybiBIUElfRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAKLQlobS51LmN4LnUuY29icmFuZXRfZGF0YS5ieXRlX2NvdW50ID0gbWF4X2J5dGVfY291bnQ7Ci0JaG0udS5jeC51LmNvYnJhbmV0X2RhdGEuaG1pX2FkZHJlc3MgPSBobWlfYWRkcmVzczsKKwlpZiAobWF4X2J5dGVfY291bnQgPiBzaXplb2YoaHIuYnl0ZXMpKQorCQlyZXR1cm4gSFBJX0VSUk9SX1JFU1BPTlNFX0JVRkZFUl9UT09fU01BTEw7CiAKLQlpZiAobWF4X2J5dGVfY291bnQgPD0gOCkgewotCQlobS51LmN4LmF0dHJpYnV0ZSA9IEhQSV9DT0JSQU5FVF9HRVQ7Ci0JfSBlbHNlIHsKLQkJaG0udS5jeC51LmNvYnJhbmV0X2JpZ2RhdGEucGJfZGF0YSA9IHBiX2RhdGE7Ci0JCWhtLnUuY3guYXR0cmlidXRlID0gSFBJX0NPQlJBTkVUX0dFVF9EQVRBOwotCX0KKwlobS5wLmF0dHJpYnV0ZSA9IEhQSV9DT0JSQU5FVF9HRVQ7CisJaG0ucC5ieXRlX2NvdW50ID0gbWF4X2J5dGVfY291bnQ7CisJaG0ucC5obWlfYWRkcmVzcyA9IGhtaV9hZGRyZXNzOwogCi0JaHBpX3NlbmRfcmVjdigmaG0sICZocik7Ci0JaWYgKCFoci5lcnJvciAmJiBwYl9kYXRhKSB7CisJaHBpX3NlbmRfcmVjdlYxKCZobS5oLCAmaHIuaCk7CiAKLQkJKnBieXRlX2NvdW50ID0gaHIudS5jeC51LmNvYnJhbmV0X2RhdGEuYnl0ZV9jb3VudDsKKwlpZiAoIWhyLmguZXJyb3IgJiYgcGJfZGF0YSkgeworCQlpZiAoaHIuYnl0ZV9jb3VudCA+IHNpemVvZihoci5ieXRlcykpCiAKLQkJaWYgKCpwYnl0ZV9jb3VudCA8IG1heF9ieXRlX2NvdW50KQorCQkJcmV0dXJuIEhQSV9FUlJPUl9SRVNQT05TRV9CVUZGRVJfVE9PX1NNQUxMOworCisJCSpwYnl0ZV9jb3VudCA9IGhyLmJ5dGVfY291bnQ7CisKKwkJaWYgKGhyLmJ5dGVfY291bnQgPCBtYXhfYnl0ZV9jb3VudCkKIAkJCW1heF9ieXRlX2NvdW50ID0gKnBieXRlX2NvdW50OwogCi0JCWlmIChobS51LmN4LmF0dHJpYnV0ZSA9PSBIUElfQ09CUkFORVRfR0VUKSB7Ci0JCQltZW1jcHkocGJfZGF0YSwgaHIudS5jeC51LmNvYnJhbmV0X2RhdGEuZGF0YSwKLQkJCQltYXhfYnl0ZV9jb3VudCk7Ci0JCX0gZWxzZSB7Ci0KLQkJfQotCisJCW1lbWNweShwYl9kYXRhLCBoci5ieXRlcywgbWF4X2J5dGVfY291bnQpOwogCX0KLQlyZXR1cm4gaHIuZXJyb3I7CisJcmV0dXJuIGhyLmguZXJyb3I7CiB9CiAKIHUxNiBocGlfY29icmFuZXRfaG1pX2dldF9zdGF0dXModTMyIGhfY29udHJvbCwgdTMyICpwc3RhdHVzLApAQCAtMTczMywyMyArMTcyOSwyMyBAQAogCXN0cnVjdCBocGlfbWVzc2FnZSBobTsKIAlzdHJ1Y3QgaHBpX3Jlc3BvbnNlIGhyOwogCi0JaHBpX2luaXRfbWVzc2FnZV9yZXNwb25zZSgmaG0sICZociwgSFBJX09CSl9DT05UUk9MRVgsCisJaHBpX2luaXRfbWVzc2FnZV9yZXNwb25zZSgmaG0sICZociwgSFBJX09CSl9DT05UUk9MLAogCQlIUElfQ09OVFJPTF9HRVRfU1RBVEUpOwogCWlmIChocGlfaGFuZGxlX2luZGV4ZXMoaF9jb250cm9sLCAmaG0uYWRhcHRlcl9pbmRleCwgJmhtLm9ial9pbmRleCkpCiAJCXJldHVybiBIUElfRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAKLQlobS51LmN4LmF0dHJpYnV0ZSA9IEhQSV9DT0JSQU5FVF9HRVRfU1RBVFVTOworCWhtLnUuYy5hdHRyaWJ1dGUgPSBIUElfQ09CUkFORVRfR0VUX1NUQVRVUzsKIAogCWhwaV9zZW5kX3JlY3YoJmhtLCAmaHIpOwogCWlmICghaHIuZXJyb3IpIHsKIAkJaWYgKHBzdGF0dXMpCi0JCQkqcHN0YXR1cyA9IGhyLnUuY3gudS5jb2JyYW5ldF9zdGF0dXMuc3RhdHVzOworCQkJKnBzdGF0dXMgPSBoci51LmN1LmNvYnJhbmV0LnN0YXR1cy5zdGF0dXM7CiAJCWlmIChwcmVhZGFibGVfc2l6ZSkKIAkJCSpwcmVhZGFibGVfc2l6ZSA9Ci0JCQkJaHIudS5jeC51LmNvYnJhbmV0X3N0YXR1cy5yZWFkYWJsZV9zaXplOworCQkJCWhyLnUuY3UuY29icmFuZXQuc3RhdHVzLnJlYWRhYmxlX3NpemU7CiAJCWlmIChwd3JpdGVhYmxlX3NpemUpCiAJCQkqcHdyaXRlYWJsZV9zaXplID0KLQkJCQloci51LmN4LnUuY29icmFuZXRfc3RhdHVzLndyaXRlYWJsZV9zaXplOworCQkJCWhyLnUuY3UuY29icmFuZXQuc3RhdHVzLndyaXRlYWJsZV9zaXplOwogCX0KIAlyZXR1cm4gaHIuZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXNpaHBpL2hwaW1zZ2luaXQuYyBiL3NvdW5kL3BjaS9hc2locGkvaHBpbXNnaW5pdC5jCmluZGV4IDYyODM3NmMuLjUyNDAwYTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvaHBpbXNnaW5pdC5jCisrKyBiL3NvdW5kL3BjaS9hc2locGkvaHBpbXNnaW5pdC5jCkBAIC00Niw3ICs0Niw3IEBACiAJaWYgKGd3U1NYMl9ieXBhc3MpCiAJCXBobS0+dHlwZSA9IEhQSV9UWVBFX1NTWDJCWVBBU1NfTUVTU0FHRTsKIAllbHNlCi0JCXBobS0+dHlwZSA9IEhQSV9UWVBFX01FU1NBR0U7CisJCXBobS0+dHlwZSA9IEhQSV9UWVBFX1JFUVVFU1Q7CiAJcGhtLT5vYmplY3QgPSBvYmplY3Q7CiAJcGhtLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOwogCXBobS0+dmVyc2lvbiA9IDA7CkBAIC04OSw3ICs4OSw3IEBACiAJbWVtc2V0KHBobSwgMCwgc2l6ZW9mKCpwaG0pKTsKIAlpZiAoKG9iamVjdCA+IDApICYmIChvYmplY3QgPD0gSFBJX09CSl9NQVhJTkRFWCkpIHsKIAkJcGhtLT5zaXplID0gc2l6ZTsKLQkJcGhtLT50eXBlID0gSFBJX1RZUEVfTUVTU0FHRTsKKwkJcGhtLT50eXBlID0gSFBJX1RZUEVfUkVRVUVTVDsKIAkJcGhtLT5vYmplY3QgPSBvYmplY3Q7CiAJCXBobS0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKIAkJcGhtLT52ZXJzaW9uID0gMTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvaHBpbXNneC5jIGIvc291bmQvcGNpL2FzaWhwaS9ocGltc2d4LmMKaW5kZXggNzM1MmE1Zi4uMmU3Nzk0MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9ocGltc2d4LmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9ocGltc2d4LmMKQEAgLTE2LDcgKzE2LDcgQEAKICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIAotRXh0ZW5kZWQgTWVzc2FnZSBGdW5jdGlvbiBXaXRoIFJlc3BvbnNlIENhY2hlaW5nCitFeHRlbmRlZCBNZXNzYWdlIEZ1bmN0aW9uIFdpdGggUmVzcG9uc2UgQ2FjaGluZwogCiAoQykgQ29weXJpZ2h0IEF1ZGlvU2NpZW5jZSBJbmMuIDIwMDIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTg2LDcgKzE4Niw2IEBACiAJCS8qIEluaXRpYWxpemUgdGhpcyBtb2R1bGUncyBpbnRlcm5hbCBzdGF0ZSAqLwogCQlocGlvc19tc2d4bG9ja19pbml0KCZtc2d4X2xvY2spOwogCQltZW1zZXQoJmhwaV9lbnRyeV9wb2ludHMsIDAsIHNpemVvZihocGlfZW50cnlfcG9pbnRzKSk7Ci0JCWhwaW9zX2xvY2tlZF9tZW1faW5pdCgpOwogCQkvKiBJbml0IHN1YnN5c19maW5kYWRhcHRlcnMgcmVzcG9uc2UgdG8gbm8tYWRhcHRlcnMgKi8KIAkJSFBJTVNHWF9fcmVzZXQoSFBJTVNHWF9BTExBREFQVEVSUyk7CiAJCWhwaV9pbml0X3Jlc3BvbnNlKHBociwgSFBJX09CSl9TVUJTWVNURU0sCkBAIC0xOTcsNyArMTk2LDYgQEAKIAljYXNlIEhQSV9TVUJTWVNfRFJJVkVSX1VOTE9BRDoKIAkJSFBJX0NPTU1PTihwaG0sIHBocik7CiAJCUhQSU1TR1hfX2NsZWFudXAoSFBJTVNHWF9BTExBREFQVEVSUywgaF9vd25lcik7Ci0JCWhwaW9zX2xvY2tlZF9tZW1fZnJlZV9hbGwoKTsKIAkJaHBpX2luaXRfcmVzcG9uc2UocGhyLCBIUElfT0JKX1NVQlNZU1RFTSwKIAkJCUhQSV9TVUJTWVNfRFJJVkVSX1VOTE9BRCwgMCk7CiAJCXJldHVybjsKQEAgLTMxNSw3ICszMTMsNyBAQAogewogCUhQSV9ERUJVR19NRVNTQUdFKERFQlVHLCBwaG0pOwogCi0JaWYgKHBobS0+dHlwZSAhPSBIUElfVFlQRV9NRVNTQUdFKSB7CisJaWYgKHBobS0+dHlwZSAhPSBIUElfVFlQRV9SRVFVRVNUKSB7CiAJCWhwaV9pbml0X3Jlc3BvbnNlKHBociwgcGhtLT5vYmplY3QsIHBobS0+ZnVuY3Rpb24sCiAJCQlIUElfRVJST1JfSU5WQUxJRF9UWVBFKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9ocGlvY3RsLmMgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaW9jdGwuYwppbmRleCBkOGU3MDQ3Li42NWZjZjQ3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXNpaHBpL2hwaW9jdGwuYworKysgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaW9jdGwuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBBdWRpb1NjaWVuY2UgSFBJIGRyaXZlcgotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDEwICBBdWRpb1NjaWVuY2UgSW5jLiA8c3VwcG9ydEBhdWRpb3NjaWVuY2UuY29tPgorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDExICBBdWRpb1NjaWVuY2UgSW5jLiA8c3VwcG9ydEBhdWRpb3NjaWVuY2UuY29tPgogCiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtMTU3LDExICsxNTcsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoaG0tPmguYWRhcHRlcl9pbmRleCA+PSBIUElfTUFYX0FEQVBURVJTKSB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQogCXN3aXRjaCAoaG0tPmguZnVuY3Rpb24pIHsKIAljYXNlIEhQSV9TVUJTWVNfQ1JFQVRFX0FEQVBURVI6CiAJY2FzZSBIUElfQURBUFRFUl9ERUxFVEU6CkBAIC0xODcsNyArMTgyLDYgQEAKIAkJLyogLTE9bm8gZGF0YSAwPXJlYWQgZnJvbSB1c2VyIG1lbSwgMT13cml0ZSB0byB1c2VyIG1lbSAqLwogCQlpbnQgd3JmbGFnID0gLTE7CiAJCXUzMiBhZGFwdGVyID0gaG0tPmguYWRhcHRlcl9pbmRleDsKLQkJcGEgPSAmYWRhcHRlcnNbYWRhcHRlcl07CiAKIAkJaWYgKChhZGFwdGVyID4gSFBJX01BWF9BREFQVEVSUykgfHwgKCFwYS0+dHlwZSkpIHsKIAkJCWhwaV9pbml0X3Jlc3BvbnNlKCZoci0+cjAsIEhQSV9PQkpfQURBUFRFUiwKQEAgLTIwMyw2ICsxOTcsOCBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAorCQlwYSA9ICZhZGFwdGVyc1thZGFwdGVyXTsKKwogCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwdGVyc1thZGFwdGVyXS5tdXRleCkpIHsKIAkJCWVyciA9IC1FSU5UUjsKIAkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9ocGlvcy5jIGIvc291bmQvcGNpL2FzaWhwaS9ocGlvcy5jCmluZGV4IDc0MmVlMTIuLmZmMmExOWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvaHBpb3MuYworKysgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaW9zLmMKQEAgLTM5LDEwICszOSw2IEBACiAKIH0KIAotdm9pZCBocGlvc19sb2NrZWRfbWVtX2luaXQodm9pZCkKLXsKLX0KLQogLyoqIEFsbG9jYXRlZCBhbiBhcmVhIG9mIGxvY2tlZCBtZW1vcnkgZm9yIGJ1cyBtYXN0ZXIgRE1BIG9wZXJhdGlvbnMuCiAKIE9uIGVycm9yLCByZXR1cm4gLUVOT01FTSwgYW5kICpwTWVtQXJlYS5zaXplID0gMApAQCAtODUsNyArODEsMyBAQAogCQlyZXR1cm4gMTsKIAl9CiB9Ci0KLXZvaWQgaHBpb3NfbG9ja2VkX21lbV9mcmVlX2FsbCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9ocGlvcy5oIGIvc291bmQvcGNpL2FzaWhwaS9ocGlvcy5oCmluZGV4IDAzMjczZTcuLjJmNjA1ZTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvaHBpb3MuaAorKysgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaW9zLmgKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNkZWZpbmUgSFBJX05PX09TX0ZJTEVfT1BTCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdGlpeHAuYyBiL3NvdW5kL3BjaS9hdGlpeHAuYwppbmRleCAzMTE5Y2Q5Li41MzdlMGEyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXRpaXhwLmMKKysrIGIvc291bmQvcGNpL2F0aWl4cC5jCkBAIC0xNjI0LDcgKzE2MjQsNyBAQAogCX0KIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2F0aWl4cF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgeworCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfYXRpaXhwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0xNzAxLDcgKzE3MDEsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIkFUSSBJWFAgQUM5NyBjb250cm9sbGVyIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9hdGlpeHBfaWRzLAogCS5wcm9iZSA9IHNuZF9hdGlpeHBfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9hdGlpeHBfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYyBiL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYwppbmRleCAyZjc0YzJmLi40NWRmMjc1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKKysrIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCkBAIC0xMjYwLDcgKzEyNjAsNyBAQAogCX0KIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2F0aWl4cF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgeworCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfYXRpaXhwX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0xMzMyLDcgKzEzMzIsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIkFUSSBJWFAgTUM5NyBjb250cm9sbGVyIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9hdGlpeHBfaWRzLAogCS5wcm9iZSA9IHNuZF9hdGlpeHBfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9hdGlpeHBfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5jCmluZGV4IDdiNzJjODguLmEzODQ2OTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmMKKysrIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDAuYwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJfQogCiAJaWYgKChlcnIgPSByZXF1ZXN0X2lycShwY2ktPmlycSwgdm9ydGV4X2ludGVycnVwdCwKLQkgICAgICAgICAgICAgICAgICAgICAgIElSUUZfU0hBUkVELCBDQVJEX05BTUVfU0hPUlQsCisJCQkgICAgICAgSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLAogCSAgICAgICAgICAgICAgICAgICAgICAgY2hpcCkpICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZ3JhYiBpcnFcbiIpOwogCQlnb3RvIGlycV9vdXQ7CkBAIC0zNzUsNyArMzc1LDcgQEAKIAogLy8gcGNpX2RyaXZlciBkZWZpbml0aW9uCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gQ0FSRF9OQU1FX1NIT1JULAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX3ZvcnRleF9pZHMsCiAJLnByb2JlID0gc25kX3ZvcnRleF9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX3ZvcnRleF9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jIGIvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jCmluZGV4IGMxNTAwMjIuLmY4NTY5YjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdzIvYXcyLWFsc2EuYworKysgYi9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMKQEAgLTE3MSw3ICsxNzEsNyBAQAogCiAvKiBwY2lfZHJpdmVyIGRlZmluaXRpb24gKi8KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiRW1hZ2ljIEF1ZGlvd2VyayAyIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9hdzJfaWRzLAogCS5wcm9iZSA9IHNuZF9hdzJfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9hdzJfcmVtb3ZlKSwKQEAgLTMxNyw3ICszMTcsNyBAQAogCXNuZF9hdzJfc2FhNzE0Nl9zZXR1cCgmY2hpcC0+c2FhNzE0NiwgY2hpcC0+aW9iYXNlX3ZpcnQpOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXcyX3NhYTcxNDZfaW50ZXJydXB0LAotCQkJSVJRRl9TSEFSRUQsICJBdWRpb3dlcmsyIiwgY2hpcCkpIHsKKwkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhdzI6IENhbm5vdCBncmFiIGlycSAlZFxuIiwgcGNpLT5pcnEpOwogCiAJCWlvdW5tYXAoY2hpcC0+aW9iYXNlX3ZpcnQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F6dDMzMjguYyBiL3NvdW5kL3BjaS9henQzMzI4LmMKaW5kZXggOWI3YTYzNC4uZTRkNzZhMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F6dDMzMjguYworKysgYi9zb3VuZC9wY2kvYXp0MzMyOC5jCkBAIC0yNTU5LDcgKzI1NTksNyBAQAogCWNvZGVjX3NldHVwLT5uYW1lID0gIkkyU19PVVQiOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXpmMzMyOF9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCwgY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgeworCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIG91dF9lcnI7CkBAIC0yODYwLDcgKzI4NjAsNyBAQAogCiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiQVpGMzMyOCIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfYXpmMzMyOF9pZHMsCiAJLnByb2JlID0gc25kX2F6ZjMzMjhfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9hemYzMzI4X3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYnQ4N3guYyBiL3NvdW5kL3BjaS9idDg3eC5jCmluZGV4IDI5NThhMDUuLjM5MTgwMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9idDg3eC5jCisrKyBiL3NvdW5kL3BjaS9idDg3eC5jCkBAIC03NjAsNyArNzYwLDcgQEAKIAlzbmRfYnQ4N3hfd3JpdGVsKGNoaXAsIFJFR19JTlRfU1RBVCwgTVlfSU5URVJSVVBUUyk7CiAKIAllcnIgPSByZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2J0ODd4X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQkgICJCdDg3eCBhdWRpbyIsIGNoaXApOworCQkJICBLQlVJTERfTU9ETkFNRSwgY2hpcCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGdyYWIgaXJxICVkXG4iLCBwY2ktPmlycSk7CiAJCWdvdG8gZmFpbDsKQEAgLTk2NSw3ICs5NjUsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICJCdDg3eCIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfYnQ4N3hfaWRzLAogCS5wcm9iZSA9IHNuZF9idDg3eF9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2J0ODd4X3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKaW5kZXggNDM3NzU5Mi4uMDYxYjdlNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYwpAQCAtMTY2Niw3ICsxNjY2LDcgQEAKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9jYTAxMDZfaW50ZXJydXB0LAotCQkJSVJRRl9TSEFSRUQsICJzbmRfY2EwMTA2IiwgY2hpcCkpIHsKKwkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKIAkJc25kX2NhMDEwNl9mcmVlKGNoaXApOwogCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCBncmFiIGlycVxuIik7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0xOTMzLDcgKzE5MzMsNyBAQAogCiAvLyBwY2lfZHJpdmVyIGRlZmluaXRpb24KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiQ0EwMTA2IiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9jYTAxMDZfaWRzLAogCS5wcm9iZSA9IHNuZF9jYTAxMDZfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jYTAxMDZfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jbWlwY2kuYyBiL3NvdW5kL3BjaS9jbWlwY2kuYwppbmRleCBmNGU1NzM1Li45Y2Y5OWZiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY21pcGNpLmMKKysrIGIvc291bmQvcGNpL2NtaXBjaS5jCkBAIC0zMDUzLDcgKzMwNTMsNyBAQAogCWNtLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2NtaXBjaV9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCwgY2FyZC0+ZHJpdmVyLCBjbSkpIHsKKwkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgY20pKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfY21pcGNpX2ZyZWUoY20pOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMzM5OCw3ICszMzk4LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICJDLU1lZGlhIFBDSSIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfY21pcGNpX2lkcywKIAkucHJvYmUgPSBzbmRfY21pcGNpX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfY21pcGNpX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0MjgxLmMgYi9zb3VuZC9wY2kvY3M0MjgxLmMKaW5kZXggNjc3MjA3MC4uMDdmMDRlMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDI4MS5jCisrKyBiL3NvdW5kL3BjaS9jczQyODEuYwpAQCAtMTM4Miw3ICsxMzgyLDcgQEAKIAl9CiAJCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfY3M0MjgxX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQkiQ1M0MjgxIiwgY2hpcCkpIHsKKwkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2NzNDI4MV9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIwODUsNyArMjA4NSw3IEBACiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiQ1M0MjgxIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9jczQyODFfaWRzLAogCS5wcm9iZSA9IHNuZF9jczQyODFfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jczQyODFfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jCmluZGV4IDc2N2ZhN2YuLjFhZjk1NTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHguYwpAQCAtMTYyLDcgKzE2Miw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiU291bmQgRnVzaW9uIENTNDZ4eCIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfY3M0Nnh4X2lkcywKIAkucHJvYmUgPSBzbmRfY2FyZF9jczQ2eHhfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jYXJkX2NzNDZ4eF9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwppbmRleCBhYWQzNzA4Li45NTQ2YmYwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwpAQCAtMzgzNSw3ICszODM1LDcgQEAKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9jczQ2eHhfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCSJDUzQ2WFgiLCBjaGlwKSkgeworCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfY3M0Nnh4X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M1NTMwLmMgYi9zb3VuZC9wY2kvY3M1NTMwLmMKaW5kZXggYmMwN2UyNy4uYTQ2NjkzNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzMC5jCisrKyBiL3NvdW5kL3BjaS9jczU1MzAuYwpAQCAtMjg1LDcgKzI4NSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiQ1M1NTMwX0F1ZGlvIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9jczU1MzBfaWRzLAogCS5wcm9iZSA9IHNuZF9jczU1MzBfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jczU1MzBfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMKaW5kZXggYWZiODAzNy4uMTBkMjJlZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMKQEAgLTMxMSw3ICszMTEsNyBAQAogCWNzNTUzNWF1LT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9jczU1MzVhdWRpb19pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCwgIkNTNTUzNSBBdWRpbyIsIGNzNTUzNWF1KSkgeworCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjczU1MzVhdSkpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBzbmRmYWlsOwpAQCAtMzk1LDcgKzM5NSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9jczU1MzVhdWRpb19pZHMsCiAJLnByb2JlID0gc25kX2NzNTUzNWF1ZGlvX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfY3M1NTM1YXVkaW9fcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYwppbmRleCBmMTZiYzhhLi5lMDgzMTIyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJCSYoKHN0cnVjdCBjczU1MzVhdWRpb19kbWFfZGVzYyAqKSBkbWEtPmRlc2NfYnVmLmFyZWEpW2ldOwogCQlkZXNjLT5hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7CiAJCWRlc2MtPnNpemUgPSBjcHVfdG9fbGUzMihwZXJpb2RfYnl0ZXMpOwotCQlkZXNjLT5jdGxyZXNlcnZlZCA9IGNwdV90b19sZTMyKFBSRF9FT1ApOworCQlkZXNjLT5jdGxyZXNlcnZlZCA9IGNwdV90b19sZTE2KFBSRF9FT1ApOwogCQlkZXNjX2FkZHIgKz0gc2l6ZW9mKHN0cnVjdCBjczU1MzVhdWRpb19kbWFfZGVzYyk7CiAJCWFkZHIgKz0gcGVyaW9kX2J5dGVzOwogCX0KQEAgLTE1Nyw3ICsxNTcsNyBAQAogCWxhc3RkZXNjID0gJigoc3RydWN0IGNzNTUzNWF1ZGlvX2RtYV9kZXNjICopIGRtYS0+ZGVzY19idWYuYXJlYSlbcGVyaW9kc107CiAJbGFzdGRlc2MtPmFkZHIgPSBjcHVfdG9fbGUzMigodTMyKSBkbWEtPmRlc2NfYnVmLmFkZHIpOwogCWxhc3RkZXNjLT5zaXplID0gMDsKLQlsYXN0ZGVzYy0+Y3RscmVzZXJ2ZWQgPSBjcHVfdG9fbGUzMihQUkRfSk1QKTsKKwlsYXN0ZGVzYy0+Y3RscmVzZXJ2ZWQgPSBjcHVfdG9fbGUxNihQUkRfSk1QKTsKIAlqbXBwcmRfYWRkciA9IGNwdV90b19sZTMyKGxhc3RkZXNjLT5hZGRyICsKIAkJCQkgIChzaXplb2Yoc3RydWN0IGNzNTUzNWF1ZGlvX2RtYV9kZXNjKSpwZXJpb2RzKSk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jdHhmaS9jdDIwazJyZWcuaCBiL3NvdW5kL3BjaS9jdHhmaS9jdDIwazJyZWcuaAppbmRleCBlMDM5NGUzLi5jYTUwMWJhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3R4ZmkvY3QyMGsycmVnLmgKKysrIGIvc291bmQvcGNpL2N0eGZpL2N0MjBrMnJlZy5oCkBAIC01NSw2ICs1NSw3IEBACiAvKiBHUElPIFJlZ2lzdGVycyAqLwogI2RlZmluZSBHUElPX0RBVEEgICAgICAgICAgIDB4MUI3MDIwCiAjZGVmaW5lIEdQSU9fQ1RSTCAgICAgICAgICAgMHgxQjcwMjQKKyNkZWZpbmUgR1BJT19FWFRfREFUQSAgICAgICAweDFCNzBBMAogCiAvKiBWaXJ0dWFsIG1lbW9yeSByZWdpc3RlcnMgKi8KICNkZWZpbmUgVk1FTV9QVFBBTCAgICAgICAgICAweDFDNjMwMCAvKiAweDFDNjMwMCArICgxNiAqIENobikgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5jIGIvc291bmQvcGNpL2N0eGZpL2N0YXRjLmMKaW5kZXggMTNmMzNjMC4uZDhhNDQyMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2N0eGZpL2N0YXRjLmMKKysrIGIvc291bmQvcGNpL2N0eGZpL2N0YXRjLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlICJjdGF0Yy5oIgogI2luY2x1ZGUgImN0cGNtLmgiCiAjaW5jbHVkZSAiY3RtaXhlci5oIgotI2luY2x1ZGUgImN0aGFyZHdhcmUuaCIKICNpbmNsdWRlICJjdHNyYy5oIgogI2luY2x1ZGUgImN0YW1peGVyLmgiCiAjaW5jbHVkZSAiY3RkYWlvLmgiCkBAIC0zMCw3ICsyOSw2IEBACiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KIAogI2RlZmluZSBNT05PX1NVTV9TQ0FMRQkweDE5YTgJLyogMl4oLTAuNSkgaW4gMTQtYml0IGZsb2F0aW5nIGZvcm1hdCAqLwotI2RlZmluZSBEQUlPTlVNCQk3CiAjZGVmaW5lIE1BWF9NVUxUSV9DSE4JOAogCiAjZGVmaW5lIElFQzk1OF9ERUZBVUxUX0NPTiAoKElFQzk1OF9BRVMwX05PTkFVRElPIFwKQEAgLTUzLDYgKzUxLDggQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBfX2RldmluaXRkYXRhIHN1YnN5c18yMGsyX2xpc3RbXSA9IHsKIAlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfQ1JFQVRJVkUsIFBDSV9TVUJERVZJQ0VfSURfQ1JFQVRJVkVfU0IwNzYwLAogCQkgICAgICAiU0IwNzYwIiwgQ1RTQjA3NjApLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9DUkVBVElWRSwgUENJX1NVQkRFVklDRV9JRF9DUkVBVElWRV9TQjEyNzAsCisJCSAgICAgICJTQjEyNzAiLCBDVFNCMTI3MCksCiAJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0NSRUFUSVZFLCBQQ0lfU1VCREVWSUNFX0lEX0NSRUFUSVZFX1NCMDg4MDEsCiAJCSAgICAgICJTQjA4ODAiLCBDVFNCMDg4MCksCiAJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0NSRUFUSVZFLCBQQ0lfU1VCREVWSUNFX0lEX0NSRUFUSVZFX1NCMDg4MDIsCkBAIC03NSw2ICs3NSw3IEBACiAJW0NUU0IwNzYwXQk9ICJTQjA3NngiLAogCVtDVEhFTkRSSVhdCT0gIkhlbmRyaXgiLAogCVtDVFNCMDg4MF0JPSAiU0IwODgwIiwKKwlbQ1RTQjEyNzBdICAgICAgPSAiU0IxMjcwIiwKIAlbQ1QyMEsyX1VOS05PV05dID0gIlVua25vd24iLAogfTsKIApAQCAtNDU5LDEyICs0NjAsMTIgQEAKIAkJCQlhcGNtLT5zdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUpOwogCSpuX3NyY2MgPSAwOwogCi0JaWYgKDEgPT0gYXRjLT5tc3IpIHsKKwlpZiAoMSA9PSBhdGMtPm1zcikgeyAvKiBGSVhNRTogZG8gd2UgcmVhbGx5IG5lZWQgU1JDIGhlcmUgaWYgcGl0Y2g9PTEgKi8KIAkJKm5fc3JjYyA9IGFwY20tPnN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CiAJCWNvbmZbMF0ucGl0Y2ggPSBwaXRjaDsKIAkJY29uZlswXS5taXhfbXNyID0gY29uZlswXS5pbXBfbXNyID0gY29uZlswXS5tc3IgPSAxOwogCQljb25mWzBdLnZvID0gMTsKLQl9IGVsc2UgaWYgKDIgPT0gYXRjLT5tc3IpIHsKKwl9IGVsc2UgaWYgKDIgPD0gYXRjLT5tc3IpIHsKIAkJaWYgKDB4ODAwMDAwMCA8IHBpdGNoKSB7CiAJCQkvKiBOZWVkIHR3by1zdGFnZSBTUkNzLCBTUkNJTVBzIGFuZAogCQkJICogQU1JWEVScyBmb3IgY29udmVydGluZyBmb3JtYXQgKi8KQEAgLTk3MCwxMSArOTcxLDM5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRjX2hhdmVfZGlnaXRfaW9fc3dpdGNoKHN0cnVjdCBjdF9hdGMgKmF0YykKK3N0YXRpYyBzdHJ1Y3QgY2FwYWJpbGl0aWVzIGF0Y19jYXBhYmlsaXRpZXMoc3RydWN0IGN0X2F0YyAqYXRjKQogewogCXN0cnVjdCBodyAqaHcgPSBhdGMtPmh3OwogCi0JcmV0dXJuIGh3LT5oYXZlX2RpZ2l0X2lvX3N3aXRjaChodyk7CisJcmV0dXJuIGh3LT5jYXBhYmlsaXRpZXMoaHcpOworfQorCitzdGF0aWMgaW50IGF0Y19vdXRwdXRfc3dpdGNoX2dldChzdHJ1Y3QgY3RfYXRjICphdGMpCit7CisJc3RydWN0IGh3ICpodyA9IGF0Yy0+aHc7CisKKwlyZXR1cm4gaHctPm91dHB1dF9zd2l0Y2hfZ2V0KGh3KTsKK30KKworc3RhdGljIGludCBhdGNfb3V0cHV0X3N3aXRjaF9wdXQoc3RydWN0IGN0X2F0YyAqYXRjLCBpbnQgcG9zaXRpb24pCit7CisJc3RydWN0IGh3ICpodyA9IGF0Yy0+aHc7CisKKwlyZXR1cm4gaHctPm91dHB1dF9zd2l0Y2hfcHV0KGh3LCBwb3NpdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgYXRjX21pY19zb3VyY2Vfc3dpdGNoX2dldChzdHJ1Y3QgY3RfYXRjICphdGMpCit7CisJc3RydWN0IGh3ICpodyA9IGF0Yy0+aHc7CisKKwlyZXR1cm4gaHctPm1pY19zb3VyY2Vfc3dpdGNoX2dldChodyk7Cit9CisKK3N0YXRpYyBpbnQgYXRjX21pY19zb3VyY2Vfc3dpdGNoX3B1dChzdHJ1Y3QgY3RfYXRjICphdGMsIGludCBwb3NpdGlvbikKK3sKKwlzdHJ1Y3QgaHcgKmh3ID0gYXRjLT5odzsKKworCXJldHVybiBody0+bWljX3NvdXJjZV9zd2l0Y2hfcHV0KGh3LCBwb3NpdGlvbik7CiB9CiAKIHN0YXRpYyBpbnQgYXRjX3NlbGVjdF9kaWdpdF9pbyhzdHJ1Y3QgY3RfYXRjICphdGMpCkBAIC0xMDQ1LDYgKzEwNzQsMTEgQEAKIAlyZXR1cm4gYXRjX2RhaW9fdW5tdXRlKGF0Yywgc3RhdGUsIExJTkVJTSk7CiB9CiAKK3N0YXRpYyBpbnQgYXRjX21pY191bm11dGUoc3RydWN0IGN0X2F0YyAqYXRjLCB1bnNpZ25lZCBjaGFyIHN0YXRlKQoreworCXJldHVybiBhdGNfZGFpb191bm11dGUoYXRjLCBzdGF0ZSwgTUlDKTsKK30KKwogc3RhdGljIGludCBhdGNfc3BkaWZfb3V0X3VubXV0ZShzdHJ1Y3QgY3RfYXRjICphdGMsIHVuc2lnbmVkIGNoYXIgc3RhdGUpCiB7CiAJcmV0dXJuIGF0Y19kYWlvX3VubXV0ZShhdGMsIHN0YXRlLCBTUERJRk9PKTsKQEAgLTEzMzEsMTcgKzEzNjUsMjAgQEAKIAlzdHJ1Y3Qgc3JjaW1wX21nciAqc3JjaW1wX21ncjsKIAlzdHJ1Y3Qgc3VtX2Rlc2Mgc3VtX2RzYyA9IHswfTsKIAlzdHJ1Y3Qgc3VtX21nciAqc3VtX21ncjsKLQlpbnQgZXJyLCBpOworCWludCBlcnIsIGksIG51bV9zcmNzLCBudW1fZGFpb3M7CiAKLQlhdGMtPmRhaW9zID0ga3phbGxvYyhzaXplb2Yodm9pZCAqKSooREFJT05VTSksIEdGUF9LRVJORUwpOworCW51bV9kYWlvcyA9ICgoYXRjLT5tb2RlbCA9PSBDVFNCMTI3MCkgPyA4IDogNyk7CisJbnVtX3NyY3MgPSAoKGF0Yy0+bW9kZWwgPT0gQ1RTQjEyNzApID8gNiA6IDQpOworCisJYXRjLT5kYWlvcyA9IGt6YWxsb2Moc2l6ZW9mKHZvaWQgKikqbnVtX2RhaW9zLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWF0Yy0+ZGFpb3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JYXRjLT5zcmNzID0ga3phbGxvYyhzaXplb2Yodm9pZCAqKSooMioyKSwgR0ZQX0tFUk5FTCk7CisJYXRjLT5zcmNzID0ga3phbGxvYyhzaXplb2Yodm9pZCAqKSpudW1fc3JjcywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhdGMtPnNyY3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JYXRjLT5zcmNpbXBzID0ga3phbGxvYyhzaXplb2Yodm9pZCAqKSooMioyKSwgR0ZQX0tFUk5FTCk7CisJYXRjLT5zcmNpbXBzID0ga3phbGxvYyhzaXplb2Yodm9pZCAqKSpudW1fc3JjcywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhdGMtPnNyY2ltcHMpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMzUxLDggKzEzODgsOSBAQAogCiAJZGFpb19tZ3IgPSAoc3RydWN0IGRhaW9fbWdyICopYXRjLT5yc2NfbWdyc1tEQUlPXTsKIAlkYV9kZXNjLm1zciA9IGF0Yy0+bXNyOwotCWZvciAoaSA9IDAsIGF0Yy0+bl9kYWlvID0gMDsgaSA8IERBSU9OVU0tMTsgaSsrKSB7Ci0JCWRhX2Rlc2MudHlwZSA9IGk7CisJZm9yIChpID0gMCwgYXRjLT5uX2RhaW8gPSAwOyBpIDwgbnVtX2RhaW9zOyBpKyspIHsKKwkJZGFfZGVzYy50eXBlID0gKGF0Yy0+bW9kZWwgIT0gQ1RTQjA3M1gpID8gaSA6CisJCQkgICAgICgoaSA9PSBTUERJRklPKSA/IFNQRElGSTEgOiBpKTsKIAkJZXJyID0gZGFpb19tZ3ItPmdldF9kYWlvKGRhaW9fbWdyLCAmZGFfZGVzYywKIAkJCQkJKHN0cnVjdCBkYWlvICoqKSZhdGMtPmRhaW9zW2ldKTsKIAkJaWYgKGVycikgewpAQCAtMTM2MiwyMyArMTQwMCwxMiBAQAogCQl9CiAJCWF0Yy0+bl9kYWlvKys7CiAJfQotCWlmIChhdGMtPm1vZGVsID09IENUU0IwNzNYKQotCQlkYV9kZXNjLnR5cGUgPSBTUERJRkkxOwotCWVsc2UKLQkJZGFfZGVzYy50eXBlID0gU1BESUZJTzsKLQllcnIgPSBkYWlvX21nci0+Z2V0X2RhaW8oZGFpb19tZ3IsICZkYV9kZXNjLAotCQkJCShzdHJ1Y3QgZGFpbyAqKikmYXRjLT5kYWlvc1tpXSk7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgImN0eGZpOiBGYWlsZWQgdG8gZ2V0IFMvUERJRi1pbiByZXNvdXJjZSEhIVxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCWF0Yy0+bl9kYWlvKys7CiAKIAlzcmNfbWdyID0gYXRjLT5yc2NfbWdyc1tTUkNdOwogCXNyY19kc2MubXVsdGkgPSAxOwogCXNyY19kc2MubXNyID0gYXRjLT5tc3I7CiAJc3JjX2RzYy5tb2RlID0gQVJDUlc7Ci0JZm9yIChpID0gMCwgYXRjLT5uX3NyYyA9IDA7IGkgPCAoMioyKTsgaSsrKSB7CisJZm9yIChpID0gMCwgYXRjLT5uX3NyYyA9IDA7IGkgPCBudW1fc3JjczsgaSsrKSB7CiAJCWVyciA9IHNyY19tZ3ItPmdldF9zcmMoc3JjX21nciwgJnNyY19kc2MsCiAJCQkJCShzdHJ1Y3Qgc3JjICoqKSZhdGMtPnNyY3NbaV0pOwogCQlpZiAoZXJyKQpAQCAtMTM4OCw4ICsxNDE1LDggQEAKIAl9CiAKIAlzcmNpbXBfbWdyID0gYXRjLT5yc2NfbWdyc1tTUkNJTVBdOwotCXNyY2ltcF9kc2MubXNyID0gODsgLyogU1JDSU1QcyBmb3IgUy9QRElGSW4gU1JUICovCi0JZm9yIChpID0gMCwgYXRjLT5uX3NyY2ltcCA9IDA7IGkgPCAoMioxKTsgaSsrKSB7CisJc3JjaW1wX2RzYy5tc3IgPSA4OworCWZvciAoaSA9IDAsIGF0Yy0+bl9zcmNpbXAgPSAwOyBpIDwgbnVtX3NyY3M7IGkrKykgewogCQllcnIgPSBzcmNpbXBfbWdyLT5nZXRfc3JjaW1wKHNyY2ltcF9tZ3IsICZzcmNpbXBfZHNjLAogCQkJCQkoc3RydWN0IHNyY2ltcCAqKikmYXRjLT5zcmNpbXBzW2ldKTsKIAkJaWYgKGVycikKQEAgLTEzOTcsMTUgKzE0MjQsNiBAQAogCiAJCWF0Yy0+bl9zcmNpbXArKzsKIAl9Ci0Jc3JjaW1wX2RzYy5tc3IgPSA4OyAvKiBTUkNJTVBzIGZvciBMSU5FL01JQ0luIFNSVCAqLwotCWZvciAoaSA9IDA7IGkgPCAoMioxKTsgaSsrKSB7Ci0JCWVyciA9IHNyY2ltcF9tZ3ItPmdldF9zcmNpbXAoc3JjaW1wX21nciwgJnNyY2ltcF9kc2MsCi0JCQkJKHN0cnVjdCBzcmNpbXAgKiopJmF0Yy0+c3JjaW1wc1syKjEraV0pOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQlhdGMtPm5fc3JjaW1wKys7Ci0JfQogCiAJc3VtX21nciA9IGF0Yy0+cnNjX21ncnNbU1VNXTsKIAlzdW1fZHNjLm1zciA9IGF0Yy0+bXNyOwpAQCAtMTQ4OCw2ICsxNTA2LDE4IEBACiAJc3JjID0gYXRjLT5zcmNzWzNdOwogCW1peGVyLT5zZXRfaW5wdXRfcmlnaHQobWl4ZXIsIE1JWF9MSU5FX0lOLCAmc3JjLT5yc2MpOwogCisJaWYgKGF0Yy0+bW9kZWwgPT0gQ1RTQjEyNzApIHsKKwkJLyogVGl0YW5pdW0gSEQgaGFzIGEgZGVkaWNhdGVkIEFEQyBmb3IgdGhlIE1pYy4gKi8KKwkJZGFpID0gY29udGFpbmVyX29mKGF0Yy0+ZGFpb3NbTUlDXSwgc3RydWN0IGRhaSwgZGFpbyk7CisJCWF0Y19jb25uZWN0X2RhaShhdGMtPnJzY19tZ3JzW1NSQ10sIGRhaSwKKwkJCShzdHJ1Y3Qgc3JjICoqKSZhdGMtPnNyY3NbNF0sCisJCQkoc3RydWN0IHNyY2ltcCAqKikmYXRjLT5zcmNpbXBzWzRdKTsKKwkJc3JjID0gYXRjLT5zcmNzWzRdOworCQltaXhlci0+c2V0X2lucHV0X2xlZnQobWl4ZXIsIE1JWF9NSUNfSU4sICZzcmMtPnJzYyk7CisJCXNyYyA9IGF0Yy0+c3Jjc1s1XTsKKwkJbWl4ZXItPnNldF9pbnB1dF9yaWdodChtaXhlciwgTUlYX01JQ19JTiwgJnNyYy0+cnNjKTsKKwl9CisKIAlkYWkgPSBjb250YWluZXJfb2YoYXRjLT5kYWlvc1tTUERJRklPXSwgc3RydWN0IGRhaSwgZGFpbyk7CiAJYXRjX2Nvbm5lY3RfZGFpKGF0Yy0+cnNjX21ncnNbU1JDXSwgZGFpLAogCQkJKHN0cnVjdCBzcmMgKiopJmF0Yy0+c3Jjc1swXSwKQEAgLTE2MDYsMTIgKzE2MzYsMTcgQEAKIAkubGluZV9jbGZlX3VubXV0ZSA9IGF0Y19saW5lX2NsZmVfdW5tdXRlLAogCS5saW5lX3JlYXJfdW5tdXRlID0gYXRjX2xpbmVfcmVhcl91bm11dGUsCiAJLmxpbmVfaW5fdW5tdXRlID0gYXRjX2xpbmVfaW5fdW5tdXRlLAorCS5taWNfdW5tdXRlID0gYXRjX21pY191bm11dGUsCiAJLnNwZGlmX291dF91bm11dGUgPSBhdGNfc3BkaWZfb3V0X3VubXV0ZSwKIAkuc3BkaWZfaW5fdW5tdXRlID0gYXRjX3NwZGlmX2luX3VubXV0ZSwKIAkuc3BkaWZfb3V0X2dldF9zdGF0dXMgPSBhdGNfc3BkaWZfb3V0X2dldF9zdGF0dXMsCiAJLnNwZGlmX291dF9zZXRfc3RhdHVzID0gYXRjX3NwZGlmX291dF9zZXRfc3RhdHVzLAogCS5zcGRpZl9vdXRfcGFzc3RocnUgPSBhdGNfc3BkaWZfb3V0X3Bhc3N0aHJ1LAotCS5oYXZlX2RpZ2l0X2lvX3N3aXRjaCA9IGF0Y19oYXZlX2RpZ2l0X2lvX3N3aXRjaCwKKwkuY2FwYWJpbGl0aWVzID0gYXRjX2NhcGFiaWxpdGllcywKKwkub3V0cHV0X3N3aXRjaF9nZXQgPSBhdGNfb3V0cHV0X3N3aXRjaF9nZXQsCisJLm91dHB1dF9zd2l0Y2hfcHV0ID0gYXRjX291dHB1dF9zd2l0Y2hfcHV0LAorCS5taWNfc291cmNlX3N3aXRjaF9nZXQgPSBhdGNfbWljX3NvdXJjZV9zd2l0Y2hfZ2V0LAorCS5taWNfc291cmNlX3N3aXRjaF9wdXQgPSBhdGNfbWljX3NvdXJjZV9zd2l0Y2hfcHV0LAogI2lmZGVmIENPTkZJR19QTQogCS5zdXNwZW5kID0gYXRjX3N1c3BlbmQsCiAJLnJlc3VtZSA9IGF0Y19yZXN1bWUsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuaCBiL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5oCmluZGV4IDcxNjdjMDEuLjNhMGRlZjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5oCisrKyBiL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogCiAjaW5jbHVkZSAiY3R2bWVtLmgiCisjaW5jbHVkZSAiY3RoYXJkd2FyZS5oIgogI2luY2x1ZGUgImN0cmVzb3VyY2UuaCIKIAogZW51bSBDVEFMU0FERVZTIHsJCS8qIFR5cGVzIG9mIGFsc2EgZGV2aWNlcyAqLwpAQCAtMTE1LDEyICsxMTYsMTcgQEAKIAlpbnQgKCpsaW5lX2NsZmVfdW5tdXRlKShzdHJ1Y3QgY3RfYXRjICphdGMsIHVuc2lnbmVkIGNoYXIgc3RhdGUpOwogCWludCAoKmxpbmVfcmVhcl91bm11dGUpKHN0cnVjdCBjdF9hdGMgKmF0YywgdW5zaWduZWQgY2hhciBzdGF0ZSk7CiAJaW50ICgqbGluZV9pbl91bm11dGUpKHN0cnVjdCBjdF9hdGMgKmF0YywgdW5zaWduZWQgY2hhciBzdGF0ZSk7CisJaW50ICgqbWljX3VubXV0ZSkoc3RydWN0IGN0X2F0YyAqYXRjLCB1bnNpZ25lZCBjaGFyIHN0YXRlKTsKIAlpbnQgKCpzcGRpZl9vdXRfdW5tdXRlKShzdHJ1Y3QgY3RfYXRjICphdGMsIHVuc2lnbmVkIGNoYXIgc3RhdGUpOwogCWludCAoKnNwZGlmX2luX3VubXV0ZSkoc3RydWN0IGN0X2F0YyAqYXRjLCB1bnNpZ25lZCBjaGFyIHN0YXRlKTsKIAlpbnQgKCpzcGRpZl9vdXRfZ2V0X3N0YXR1cykoc3RydWN0IGN0X2F0YyAqYXRjLCB1bnNpZ25lZCBpbnQgKnN0YXR1cyk7CiAJaW50ICgqc3BkaWZfb3V0X3NldF9zdGF0dXMpKHN0cnVjdCBjdF9hdGMgKmF0YywgdW5zaWduZWQgaW50IHN0YXR1cyk7CiAJaW50ICgqc3BkaWZfb3V0X3Bhc3N0aHJ1KShzdHJ1Y3QgY3RfYXRjICphdGMsIHVuc2lnbmVkIGNoYXIgc3RhdGUpOwotCWludCAoKmhhdmVfZGlnaXRfaW9fc3dpdGNoKShzdHJ1Y3QgY3RfYXRjICphdGMpOworCXN0cnVjdCBjYXBhYmlsaXRpZXMgKCpjYXBhYmlsaXRpZXMpKHN0cnVjdCBjdF9hdGMgKmF0Yyk7CisJaW50ICgqb3V0cHV0X3N3aXRjaF9nZXQpKHN0cnVjdCBjdF9hdGMgKmF0Yyk7CisJaW50ICgqb3V0cHV0X3N3aXRjaF9wdXQpKHN0cnVjdCBjdF9hdGMgKmF0YywgaW50IHBvc2l0aW9uKTsKKwlpbnQgKCptaWNfc291cmNlX3N3aXRjaF9nZXQpKHN0cnVjdCBjdF9hdGMgKmF0Yyk7CisJaW50ICgqbWljX3NvdXJjZV9zd2l0Y2hfcHV0KShzdHJ1Y3QgY3RfYXRjICphdGMsIGludCBwb3NpdGlvbik7CiAKIAkvKiBEb24ndCB0b3VjaCEgVXNlZCBmb3IgaW50ZXJuYWwgb2JqZWN0LiAqLwogCXZvaWQgKnJzY19tZ3JzW05VTV9SU0NUWVBdOyAvKiBjaGlwIHJlc291cmNlIG1hbmFnZXJzICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkvY3RkYWlvLmMgYi9zb3VuZC9wY2kvY3R4ZmkvY3RkYWlvLmMKaW5kZXggNDdkOWVhOS4uMGMwMGViNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2N0eGZpL2N0ZGFpby5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS9jdGRhaW8uYwpAQCAtMjIsMjAgKzIyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKLSNkZWZpbmUgREFJT19SRVNPVVJDRV9OVU0JTlVNX0RBSU9UWVAKICNkZWZpbmUgREFJT19PVVRfTUFYCQlTUERJRk9PCiAKLXVuaW9uIGRhaW9fdXNhZ2UgewotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIHNob3J0IGxpbmVvMToxOwotCQl1bnNpZ25lZCBzaG9ydCBsaW5lbzI6MTsKLQkJdW5zaWduZWQgc2hvcnQgbGluZW8zOjE7Ci0JCXVuc2lnbmVkIHNob3J0IGxpbmVvNDoxOwotCQl1bnNpZ25lZCBzaG9ydCBzcGRpZm9vOjE7Ci0JCXVuc2lnbmVkIHNob3J0IGxpbmVpbToxOwotCQl1bnNpZ25lZCBzaG9ydCBzcGRpZmlvOjE7Ci0JCXVuc2lnbmVkIHNob3J0IHNwZGlmaTE6MTsKLQl9IGJmOworc3RydWN0IGRhaW9fdXNhZ2UgewogCXVuc2lnbmVkIHNob3J0IGRhdGE7CiB9OwogCkBAIC02MSw2ICs1MCw3IEBACiAJW0xJTkVPM10gPSB7LmxlZnQgPSAweDUwLCAucmlnaHQgPSAweDUxfSwKIAlbTElORU80XSA9IHsubGVmdCA9IDB4NzAsIC5yaWdodCA9IDB4NzF9LAogCVtMSU5FSU1dID0gey5sZWZ0ID0gMHg0NSwgLnJpZ2h0ID0gMHhjNX0sCisJW01JQ10JID0gey5sZWZ0ID0gMHg1NSwgLnJpZ2h0ID0gMHhkNX0sCiAJW1NQRElGT09dID0gey5sZWZ0ID0gMHgwMCwgLnJpZ2h0ID0gMHgwMX0sCiAJW1NQRElGSU9dID0gey5sZWZ0ID0gMHgwNSwgLnJpZ2h0ID0gMHg4NX0sCiB9OwpAQCAtMTM4LDYgKzEyOCw3IEBACiAJCWNhc2UgTElORU8zOglyZXR1cm4gNTsKIAkJY2FzZSBMSU5FTzQ6CXJldHVybiA2OwogCQljYXNlIExJTkVJTToJcmV0dXJuIDQ7CisJCWNhc2UgTUlDOglyZXR1cm4gNTsKIAkJZGVmYXVsdDoJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAlkZWZhdWx0OgpAQCAtNTE5LDE3ICs1MTAsMTcgQEAKIAogc3RhdGljIGludCBkYWlvX21ncl9nZXRfcnNjKHN0cnVjdCByc2NfbWdyICptZ3IsIGVudW0gREFJT1RZUCB0eXBlKQogewotCWlmICgoKHVuaW9uIGRhaW9fdXNhZ2UgKiltZ3ItPnJzY3MpLT5kYXRhICYgKDB4MSA8PCB0eXBlKSkKKwlpZiAoKChzdHJ1Y3QgZGFpb191c2FnZSAqKW1nci0+cnNjcyktPmRhdGEgJiAoMHgxIDw8IHR5cGUpKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCSgodW5pb24gZGFpb191c2FnZSAqKW1nci0+cnNjcyktPmRhdGEgfD0gKDB4MSA8PCB0eXBlKTsKKwkoKHN0cnVjdCBkYWlvX3VzYWdlICopbWdyLT5yc2NzKS0+ZGF0YSB8PSAoMHgxIDw8IHR5cGUpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZGFpb19tZ3JfcHV0X3JzYyhzdHJ1Y3QgcnNjX21nciAqbWdyLCBlbnVtIERBSU9UWVAgdHlwZSkKIHsKLQkoKHVuaW9uIGRhaW9fdXNhZ2UgKiltZ3ItPnJzY3MpLT5kYXRhICY9IH4oMHgxIDw8IHR5cGUpOworCSgoc3RydWN0IGRhaW9fdXNhZ2UgKiltZ3ItPnJzY3MpLT5kYXRhICY9IH4oMHgxIDw8IHR5cGUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MTIsNyArNzAzLDcgQEAKIAlpZiAoIWRhaW9fbWdyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVyciA9IHJzY19tZ3JfaW5pdCgmZGFpb19tZ3ItPm1nciwgREFJTywgREFJT19SRVNPVVJDRV9OVU0sIGh3KTsKKwllcnIgPSByc2NfbWdyX2luaXQoJmRhaW9fbWdyLT5tZ3IsIERBSU8sIE5VTV9EQUlPVFlQLCBodyk7CiAJaWYgKGVycikKIAkJZ290byBlcnJvcjE7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jdHhmaS9jdGRhaW8uaCBiL3NvdW5kL3BjaS9jdHhmaS9jdGRhaW8uaAppbmRleCAwZjUyY2U1Li44NWNjYjZlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3R4ZmkvY3RkYWlvLmgKKysrIGIvc291bmQvcGNpL2N0eGZpL2N0ZGFpby5oCkBAIC0zMyw2ICszMyw3IEBACiAJU1BESUZPTywJLyogUy9QRElGIE91dCAoRmxleGlqYWNrL09wdGljYWwpICovCiAJTElORUlNLAogCVNQRElGSU8sCS8qIFMvUERJRiBJbiAoRmxleGlqYWNrL09wdGljYWwpIG9uIHRoZSBjYXJkICovCisJTUlDLAkJLyogRGVkaWNhdGVkIG1pYyBvbiBUaXRhbml1bSBIRCAqLwogCVNQRElGSTEsCS8qIFMvUERJRiBJbiBvbiBpbnRlcm5hbCBEcml2ZSBCYXkgKi8KIAlOVU1fREFJT1RZUAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jdHhmaS9jdGhhcmR3YXJlLmggYi9zb3VuZC9wY2kvY3R4ZmkvY3RoYXJkd2FyZS5oCmluZGV4IGFmNTU0MDUuLjkwODMxNWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdGhhcmR3YXJlLmgKKysrIGIvc291bmQvcGNpL2N0eGZpL2N0aGFyZHdhcmUuaApAQCAtMzksNiArMzksNyBAQAogCUNUMjBLMl9NT0RFTF9GSVJTVCA9IENUU0IwNzYwLAogCUNUSEVORFJJWCwKIAlDVFNCMDg4MCwKKwlDVFNCMTI3MCwKIAlDVDIwSzJfVU5LTk9XTiwKIAlOVU1fQ1RDQVJEUwkJLyogVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBsYXN0ICovCiB9OwpAQCAtNjAsNiArNjEsMTMgQEAKIAl1bnNpZ25lZCBpbnQgbXNyOwkvKiBtYXN0ZXIgc2FtcGxlIHJhdGUgaW4gcnNycyAqLwogfTsKIAorc3RydWN0IGNhcGFiaWxpdGllcyB7CisJdW5zaWduZWQgaW50IGRpZ2l0X2lvX3N3aXRjaDoxOworCXVuc2lnbmVkIGludCBkZWRpY2F0ZWRfbWljOjE7CisJdW5zaWduZWQgaW50IG91dHB1dF9zd2l0Y2g6MTsKKwl1bnNpZ25lZCBpbnQgbWljX3NvdXJjZV9zd2l0Y2g6MTsKK307CisKIHN0cnVjdCBodyB7CiAJaW50ICgqY2FyZF9pbml0KShzdHJ1Y3QgaHcgKmh3LCBzdHJ1Y3QgY2FyZF9jb25mICppbmZvKTsKIAlpbnQgKCpjYXJkX3N0b3ApKHN0cnVjdCBodyAqaHcpOwpAQCAtNzAsNyArNzgsMTEgQEAKICNlbmRpZgogCWludCAoKmlzX2FkY19zb3VyY2Vfc2VsZWN0ZWQpKHN0cnVjdCBodyAqaHcsIGVudW0gQURDU1JDIHNvdXJjZSk7CiAJaW50ICgqc2VsZWN0X2FkY19zb3VyY2UpKHN0cnVjdCBodyAqaHcsIGVudW0gQURDU1JDIHNvdXJjZSk7Ci0JaW50ICgqaGF2ZV9kaWdpdF9pb19zd2l0Y2gpKHN0cnVjdCBodyAqaHcpOworCXN0cnVjdCBjYXBhYmlsaXRpZXMgKCpjYXBhYmlsaXRpZXMpKHN0cnVjdCBodyAqaHcpOworCWludCAoKm91dHB1dF9zd2l0Y2hfZ2V0KShzdHJ1Y3QgaHcgKmh3KTsKKwlpbnQgKCpvdXRwdXRfc3dpdGNoX3B1dCkoc3RydWN0IGh3ICpodywgaW50IHBvc2l0aW9uKTsKKwlpbnQgKCptaWNfc291cmNlX3N3aXRjaF9nZXQpKHN0cnVjdCBodyAqaHcpOworCWludCAoKm1pY19zb3VyY2Vfc3dpdGNoX3B1dCkoc3RydWN0IGh3ICpodywgaW50IHBvc2l0aW9uKTsKIAogCS8qIFNSQyBvcGVyYXRpb25zICovCiAJaW50ICgqc3JjX3JzY19nZXRfY3RybF9ibGspKHZvaWQgKipyYmxrKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jdHhmaS9jdGh3MjBrMS5jIGIvc291bmQvcGNpL2N0eGZpL2N0aHcyMGsxLmMKaW5kZXggYTVjOTU3ZC4uYTdkZjE5NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2N0eGZpL2N0aHcyMGsxLmMKKysrIGIvc291bmQvcGNpL2N0eGZpL2N0aHcyMGsxLmMKQEAgLTE3NzcsMTAgKzE3NzcsMTcgQEAKIAkJcmV0dXJuIGFkY19pbml0X1NCeChodywgaW5mby0+aW5wdXQsIGluZm8tPm1pYzIwZGIpOwogfQogCi1zdGF0aWMgaW50IGh3X2hhdmVfZGlnaXRfaW9fc3dpdGNoKHN0cnVjdCBodyAqaHcpCitzdGF0aWMgc3RydWN0IGNhcGFiaWxpdGllcyBod19jYXBhYmlsaXRpZXMoc3RydWN0IGh3ICpodykKIHsKKwlzdHJ1Y3QgY2FwYWJpbGl0aWVzIGNhcDsKKwogCS8qIFNCMDczeCBhbmQgVmlzdGEgY29tcGF0aWJsZSBjYXJkcyBoYXZlIG5vIGRpZ2l0IElPIHN3aXRjaCAqLwotCXJldHVybiAhKGh3LT5tb2RlbCA9PSBDVFNCMDczWCB8fCBody0+bW9kZWwgPT0gQ1RVQUEpOworCWNhcC5kaWdpdF9pb19zd2l0Y2ggPSAhKGh3LT5tb2RlbCA9PSBDVFNCMDczWCB8fCBody0+bW9kZWwgPT0gQ1RVQUEpOworCWNhcC5kZWRpY2F0ZWRfbWljID0gMDsKKwljYXAub3V0cHV0X3N3aXRjaCA9IDA7CisJY2FwLm1pY19zb3VyY2Vfc3dpdGNoID0gMDsKKworCXJldHVybiBjYXA7CiB9CiAKICNkZWZpbmUgQ1RMQklUUyhhLCBiLCBjLCBkKQkoKChhKSA8PCAyNCkgfCAoKGIpIDw8IDE2KSB8ICgoYykgPDwgOCkgfCAoZCkpCkBAIC0xOTMzLDcgKzE5NDAsNyBAQAogCiAJaWYgKGh3LT5pcnEgPCAwKSB7CiAJCWVyciA9IHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBjdF8yMGsxX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQkJICAiY3R4ZmkiLCBodyk7CisJCQkJICBLQlVJTERfTU9ETkFNRSwgaHcpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJYRmk6IENhbm5vdCBnZXQgaXJxICVkXG4iLCBwY2ktPmlycSk7CiAJCQlnb3RvIGVycm9yMjsKQEAgLTIxNzIsNyArMjE3OSw3IEBACiAJLnBsbF9pbml0ID0gaHdfcGxsX2luaXQsCiAJLmlzX2FkY19zb3VyY2Vfc2VsZWN0ZWQgPSBod19pc19hZGNfaW5wdXRfc2VsZWN0ZWQsCiAJLnNlbGVjdF9hZGNfc291cmNlID0gaHdfYWRjX2lucHV0X3NlbGVjdCwKLQkuaGF2ZV9kaWdpdF9pb19zd2l0Y2ggPSBod19oYXZlX2RpZ2l0X2lvX3N3aXRjaCwKKwkuY2FwYWJpbGl0aWVzID0gaHdfY2FwYWJpbGl0aWVzLAogI2lmZGVmIENPTkZJR19QTQogCS5zdXNwZW5kID0gaHdfc3VzcGVuZCwKIAkucmVzdW1lID0gaHdfcmVzdW1lLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL2N0aHcyMGsyLmMgYi9zb3VuZC9wY2kvY3R4ZmkvY3RodzIwazIuYwppbmRleCA1MzY0MTY0Li5kNmM1NGI1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3R4ZmkvY3RodzIwazIuYworKysgYi9zb3VuZC9wY2kvY3R4ZmkvY3RodzIwazIuYwpAQCAtOCw3ICs4LDcgQEAKICAqIEBGaWxlCWN0aHcyMGsyLmMKICAqCiAgKiBAQnJpZWYKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgaGFyZHdhcmUgYWNjZXNzIG1ldGhvcmQgZm9yIDIwazIuCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGhhcmR3YXJlIGFjY2VzcyBtZXRob2QgZm9yIDIwazIuCiAgKgogICogQEF1dGhvcglMaXUgQ2h1bgogICogQERhdGUgCU1heSAxNCAyMDA4CkBAIC0zOCw2ICszOCw4IEBACiAJdW5zaWduZWQgY2hhciBkZXZfaWQ7CiAJdW5zaWduZWQgY2hhciBhZGRyX3NpemU7CiAJdW5zaWduZWQgY2hhciBkYXRhX3NpemU7CisKKwlpbnQgbWljX3NvdXJjZTsKIH07CiAKIHN0YXRpYyB1MzIgaHdfcmVhZF8yMGt4KHN0cnVjdCBodyAqaHcsIHUzMiByZWcpOwpAQCAtMTE2Myw3ICsxMTY1LDEyIEBACiAJCWh3X3dyaXRlXzIwa3goaHcsIEFVRElPX0lPX1RYX0JMUkNMSywgMHgwMTAxMDEwMSk7CiAJCWh3X3dyaXRlXzIwa3goaHcsIEFVRElPX0lPX1JYX0JMUkNMSywgMCk7CiAJfSBlbHNlIGlmICgyID09IGluZm8tPm1zcikgewotCQlod193cml0ZV8yMGt4KGh3LCBBVURJT19JT19NQ0xLLCAweDExMTExMTExKTsKKwkJaWYgKGh3LT5tb2RlbCAhPSBDVFNCMTI3MCkgeworCQkJaHdfd3JpdGVfMjBreChodywgQVVESU9fSU9fTUNMSywgMHgxMTExMTExMSk7CisJCX0gZWxzZSB7CisJCQkvKiBQQ000MjIwIG9uIFRpdGFuaXVtIEhEIGlzIGRpZmZlcmVudC4gKi8KKwkJCWh3X3dyaXRlXzIwa3goaHcsIEFVRElPX0lPX01DTEssIDB4MTEwMTExMTEpOworCQl9CiAJCS8qIFNwZWNpZnkgYWxsIHBsYXlpbmcgOTZraHoKIAkJICogRUEgWzBdCS0gRW5hYmxlZAogCQkgKiBSVEEgWzQ6NV0JLSA5NmtIegpAQCAtMTE3NSw2ICsxMTgyLDEwIEBACiAJCSAqIFJURCBbMjg6MjldCS0gOTZrSHogKi8KIAkJaHdfd3JpdGVfMjBreChodywgQVVESU9fSU9fVFhfQkxSQ0xLLCAweDExMTExMTExKTsKIAkJaHdfd3JpdGVfMjBreChodywgQVVESU9fSU9fUlhfQkxSQ0xLLCAwKTsKKwl9IGVsc2UgaWYgKCg0ID09IGluZm8tPm1zcikgJiYgKGh3LT5tb2RlbCA9PSBDVFNCMTI3MCkpIHsKKwkJaHdfd3JpdGVfMjBreChodywgQVVESU9fSU9fTUNMSywgMHgyMTAxMTExMSk7CisJCWh3X3dyaXRlXzIwa3goaHcsIEFVRElPX0lPX1RYX0JMUkNMSywgMHgyMTIxMjEyMSk7CisJCWh3X3dyaXRlXzIwa3goaHcsIEFVRElPX0lPX1JYX0JMUkNMSywgMCk7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fQUxFUlQgImN0eGZpOiBFUlJPUiEhISBJbnZhbGlkIHNhbXBsaW5nIHJhdGUhISFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExODIsNiArMTE5Myw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCWlmIChpIDw9IDMpIHsKKwkJCS8qIFRoaXMgY29tbWVudCBsb29rcyB3cm9uZyBzaW5jZSBsb29wIGlzIG92ZXIgNCAgKi8KKwkJCS8qIGNoYW5uZWxzIGFuZCBlbXUyMGsyIHN1cHBvcnRzIDQgc3BkaWYgSU9zLiAgICAgKi8KIAkJCS8qIDFzdCAzIGNoYW5uZWxzIGFyZSBTUERJRnMgKFNCMDk2MCkgKi8KIAkJCWlmIChpID09IDMpCiAJCQkJZGF0YSA9IDB4MTAwMTAwMTsKQEAgLTEyMDYsMTIgKzEyMTksMTYgQEAKIAogCQkJaHdfd3JpdGVfMjBreChodywgQVVESU9fSU9fVFhfQ1NUQVRfSCsoMHg0MCppKSwgMHgwQik7CiAJCX0gZWxzZSB7CisJCQkvKiBBZ2FpbiwgbG9vcCBpcyBvdmVyIDQgY2hhbm5lbHMgbm90IDUuICovCiAJCQkvKiBOZXh0IDUgY2hhbm5lbHMgYXJlIEkyUyAoU0IwOTYwKSAqLwogCQkJZGF0YSA9IDB4MTE7CiAJCQlod193cml0ZV8yMGt4KGh3LCBBVURJT19JT19SWF9DVEwrKDB4NDAqaSksIGRhdGEpOwogCQkJaWYgKDIgPT0gaW5mby0+bXNyKSB7CiAJCQkJLyogRm91ciBjaGFubmVscyBwZXIgc2FtcGxlIHBlcmlvZCAqLwogCQkJCWRhdGEgfD0gMHgxMDAwOworCQkJfSBlbHNlIGlmICg0ID09IGluZm8tPm1zcikgeworCQkJCS8qIEZJWE1FOiBjaGVjayB0aGlzIGFnYWluc3QgdGhlIGNoaXAgc3BlYyAqLworCQkJCWRhdGEgfD0gMHgyMDAwOwogCQkJfQogCQkJaHdfd3JpdGVfMjBreChodywgQVVESU9fSU9fVFhfQ1RMKygweDQwKmkpLCBkYXRhKTsKIAkJfQpAQCAtMTI5OSwyMSArMTMxNiwxOCBAQAogCiAJcGxsZW5iID0gMHhCOwogCWh3X3dyaXRlXzIwa3goaHcsIFBMTF9FTkIsIHBsbGVuYik7Ci0JcGxsY3RsID0gMHgyMEQwMDAwMDsKLQlzZXRfZmllbGQoJnBsbGN0bCwgUExMQ1RMX0ZELCAxNiAtIDQpOwotCWh3X3dyaXRlXzIwa3goaHcsIFBMTF9DVEwsIHBsbGN0bCk7Ci0JbWRlbGF5KDQwKTsKLQlwbGxjdGwgPSBod19yZWFkXzIwa3goaHcsIFBMTF9DVEwpOworCXBsbGN0bCA9IDB4MjBDMDAwMDA7CiAJc2V0X2ZpZWxkKCZwbGxjdGwsIFBMTENUTF9CLCAwKTsKLQlpZiAoNDgwMDAgPT0gcnNyKSB7Ci0JCXNldF9maWVsZCgmcGxsY3RsLCBQTExDVExfRkQsIDE2IC0gMik7Ci0JCXNldF9maWVsZCgmcGxsY3RsLCBQTExDVExfUkQsIDEgLSAxKTsgLyogMzAwMCoxNi8xID0gNDgwMDAgKi8KLQl9IGVsc2UgeyAvKiA0NDEwMCAqLwotCQlzZXRfZmllbGQoJnBsbGN0bCwgUExMQ1RMX0ZELCAxNDcgLSAyKTsKLQkJc2V0X2ZpZWxkKCZwbGxjdGwsIFBMTENUTF9SRCwgMTAgLSAxKTsgLyogMzAwMCoxNDcvMTAgPSA0NDEwMCAqLwotCX0KKwlzZXRfZmllbGQoJnBsbGN0bCwgUExMQ1RMX0ZELCA0ODAwMCA9PSByc3IgPyAxNiAtIDQgOiAxNDcgLSA0KTsKKwlzZXRfZmllbGQoJnBsbGN0bCwgUExMQ1RMX1JELCA0ODAwMCA9PSByc3IgPyAxIC0gMSA6IDEwIC0gMSk7CiAJaHdfd3JpdGVfMjBreChodywgUExMX0NUTCwgcGxsY3RsKTsKIAltZGVsYXkoNDApOworCisJcGxsY3RsID0gaHdfcmVhZF8yMGt4KGh3LCBQTExfQ1RMKTsKKwlzZXRfZmllbGQoJnBsbGN0bCwgUExMQ1RMX0ZELCA0ODAwMCA9PSByc3IgPyAxNiAtIDIgOiAxNDcgLSAyKTsKKwlod193cml0ZV8yMGt4KGh3LCBQTExfQ1RMLCBwbGxjdGwpOworCW1kZWxheSg0MCk7CisKIAlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CiAJCXBsbHN0YXQgPSBod19yZWFkXzIwa3goaHcsIFBMTF9TVEFUKTsKIAkJaWYgKGdldF9maWVsZChwbGxzdGF0LCBQTExTVEFUX1BEKSkKQEAgLTE1NTcsNyArMTU3MSw3IEBACiAKIAlod193cml0ZV8yMGt4KGh3LCBJMkNfSUZfU1RBVFVTLCBpMmNfc3RhdHVzKTsKIAlodzIwazJfaTJjX3dhaXRfZGF0YV9yZWFkeShodyk7Ci0JLyogRHVtbXkgd3JpdGUgdG8gdHJpZ2dlciB0aGUgd3JpdGUgb3BydGF0aW9uICovCisJLyogRHVtbXkgd3JpdGUgdG8gdHJpZ2dlciB0aGUgd3JpdGUgb3BlcmF0aW9uICovCiAJaHdfd3JpdGVfMjBreChodywgSTJDX0lGX1dEQVRBLCAwKTsKIAlodzIwazJfaTJjX3dhaXRfZGF0YV9yZWFkeShodyk7CiAKQEAgLTE1NjgsNiArMTU4MiwzMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBod19kYWNfc3RvcChzdHJ1Y3QgaHcgKmh3KQoreworCXUzMiBkYXRhOworCWRhdGEgPSBod19yZWFkXzIwa3goaHcsIEdQSU9fREFUQSk7CisJZGF0YSAmPSAweEZGRkZGRkZEOworCWh3X3dyaXRlXzIwa3goaHcsIEdQSU9fREFUQSwgZGF0YSk7CisJbWRlbGF5KDEwKTsKK30KKworc3RhdGljIHZvaWQgaHdfZGFjX3N0YXJ0KHN0cnVjdCBodyAqaHcpCit7CisJdTMyIGRhdGE7CisJZGF0YSA9IGh3X3JlYWRfMjBreChodywgR1BJT19EQVRBKTsKKwlkYXRhIHw9IDB4MjsKKwlod193cml0ZV8yMGt4KGh3LCBHUElPX0RBVEEsIGRhdGEpOworCW1kZWxheSg1MCk7Cit9CisKK3N0YXRpYyB2b2lkIGh3X2RhY19yZXNldChzdHJ1Y3QgaHcgKmh3KQoreworCWh3X2RhY19zdG9wKGh3KTsKKwlod19kYWNfc3RhcnQoaHcpOworfQorCiBzdGF0aWMgaW50IGh3X2RhY19pbml0KHN0cnVjdCBodyAqaHcsIGNvbnN0IHN0cnVjdCBkYWNfY29uZiAqaW5mbykKIHsKIAlpbnQgZXJyOwpAQCAtMTU5NCw2ICsxNjMyLDIxIEBACiAJCQkJICAgMHgwMDAwMDAwMCAgIC8qIFZvbCBDb250cm9sIEI0ICovCiAJCQkJIH07CiAKKwlpZiAoaHctPm1vZGVsID09IENUU0IxMjcwKSB7CisJCWh3X2RhY19zdG9wKGh3KTsKKwkJZGF0YSA9IGh3X3JlYWRfMjBreChodywgR1BJT19EQVRBKTsKKwkJZGF0YSAmPSB+MHgwNjAwOworCQlpZiAoMSA9PSBpbmZvLT5tc3IpCisJCQlkYXRhIHw9IDB4MDAwMDsgLyogU2luZ2xlIFNwZWVkIE1vZGUgMC01MGtIeiAqLworCQllbHNlIGlmICgyID09IGluZm8tPm1zcikKKwkJCWRhdGEgfD0gMHgwMjAwOyAvKiBEb3VibGUgU3BlZWQgTW9kZSA1MC0xMDBrSHogKi8KKwkJZWxzZQorCQkJZGF0YSB8PSAweDA2MDA7IC8qIFF1YWQgU3BlZWQgTW9kZSAxMDAtMjAwa0h6ICovCisJCWh3X3dyaXRlXzIwa3goaHcsIEdQSU9fREFUQSwgZGF0YSk7CisJCWh3X2RhY19zdGFydChodyk7CisJCXJldHVybiAwOworCX0KKwogCS8qIFNldCBEQUMgcmVzZXQgYml0IGFzIG91dHB1dCAqLwogCWRhdGEgPSBod19yZWFkXzIwa3goaHcsIEdQSU9fQ1RSTCk7CiAJZGF0YSB8PSAweDAyOwpAQCAtMTYwNiwyMiArMTY1OSw4IEBACiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQkvKiBSZXNldCBEQUMgdHdpY2UganVzdCBpbi1jYXNlIHRoZSBjaGlwCiAJCSAqIGRpZG4ndCBpbml0aWFsaXplZCBwcm9wZXJseSAqLwotCQlkYXRhID0gaHdfcmVhZF8yMGt4KGh3LCBHUElPX0RBVEEpOwotCQkvKiBHUElPIGRhdGEgYml0IDEgKi8KLQkJZGF0YSAmPSAweEZGRkZGRkZEOwotCQlod193cml0ZV8yMGt4KGh3LCBHUElPX0RBVEEsIGRhdGEpOwotCQltZGVsYXkoMTApOwotCQlkYXRhIHw9IDB4MjsKLQkJaHdfd3JpdGVfMjBreChodywgR1BJT19EQVRBLCBkYXRhKTsKLQkJbWRlbGF5KDUwKTsKLQotCQkvKiBSZXNldCB0aGUgMm5kIHRpbWUgKi8KLQkJZGF0YSAmPSAweEZGRkZGRkZEOwotCQlod193cml0ZV8yMGt4KGh3LCBHUElPX0RBVEEsIGRhdGEpOwotCQltZGVsYXkoMTApOwotCQlkYXRhIHw9IDB4MjsKLQkJaHdfd3JpdGVfMjBreChodywgR1BJT19EQVRBLCBkYXRhKTsKLQkJbWRlbGF5KDUwKTsKKwkJaHdfZGFjX3Jlc2V0KGh3KTsKKwkJaHdfZGFjX3Jlc2V0KGh3KTsKIAogCQlpZiAoaHcyMGsyX2kyY19yZWFkKGh3LCBDUzQzODJfTUMxLCAgJmNzX3JlYWQubW9kZV9jb250cm9sXzEpKQogCQkJY29udGludWU7CkBAIC0xNzI1LDcgKzE3NjQsMTEgQEAKIHN0YXRpYyBpbnQgaHdfaXNfYWRjX2lucHV0X3NlbGVjdGVkKHN0cnVjdCBodyAqaHcsIGVudW0gQURDU1JDIHR5cGUpCiB7CiAJdTMyIGRhdGE7Ci0KKwlpZiAoaHctPm1vZGVsID09IENUU0IxMjcwKSB7CisJCS8qIFRpdGFuaXVtIEhEIGhhcyB0d28gQURDIGNoaXBzLCBvbmUgZm9yIGxpbmUgaW4gYW5kIG9uZSAqLworCQkvKiBmb3IgTUlDLiBXZSBkb24ndCBuZWVkIHRvIHN3aXRjaCB0aGUgQURDIGlucHV0LiAqLworCQlyZXR1cm4gMTsKKwl9CiAJZGF0YSA9IGh3X3JlYWRfMjBreChodywgR1BJT19EQVRBKTsKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFEQ19NSUNJTjoKQEAgLTE3NDIsMzUgKzE3ODUsNDcgQEAKIAogI2RlZmluZSBNSUNfQk9PU1RfMERCIDB4Q0YKICNkZWZpbmUgTUlDX0JPT1NUX1NURVBTX1BFUl9EQiAyCi0jZGVmaW5lIE1JQ19CT09TVF8yMERCIChNSUNfQk9PU1RfMERCICsgMjAgKiBNSUNfQk9PU1RfU1RFUFNfUEVSX0RCKQorCitzdGF0aWMgdm9pZCBod193bTg3NzVfaW5wdXRfc2VsZWN0KHN0cnVjdCBodyAqaHcsIHU4IGlucHV0LCBzOCBnYWluX2luX2RiKQoreworCXUzMiBhZGNtYywgZ2FpbjsKKworCWlmIChpbnB1dCA+IDMpCisJCWlucHV0ID0gMzsKKworCWFkY21jID0gKCh1MzIpMSA8PCBpbnB1dCkgfCAweDEwMDsgLyogTGluayBMK1IgZ2Fpbi4uLiAqLworCisJaHcyMGsyX2kyY193cml0ZShodywgTUFLRV9XTTg3NzVfQUREUihXTTg3NzVfQURDTUMsIGFkY21jKSwKKwkJCQlNQUtFX1dNODc3NV9EQVRBKGFkY21jKSk7CisKKwlpZiAoZ2Fpbl9pbl9kYiA8IC0xMDMpCisJCWdhaW5faW5fZGIgPSAtMTAzOworCWlmIChnYWluX2luX2RiID4gMjQpCisJCWdhaW5faW5fZGIgPSAyNDsKKworCWdhaW4gPSBnYWluX2luX2RiICogTUlDX0JPT1NUX1NURVBTX1BFUl9EQiArIE1JQ19CT09TVF8wREI7CisKKwlodzIwazJfaTJjX3dyaXRlKGh3LCBNQUtFX1dNODc3NV9BRERSKFdNODc3NV9BQURDTCwgZ2FpbiksCisJCQkJTUFLRV9XTTg3NzVfREFUQShnYWluKSk7CisJLyogLi4uc28gdGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgZm9yIHRoZSBmb2xsb3dpbmcuICovCisJaHcyMGsyX2kyY193cml0ZShodywgTUFLRV9XTTg3NzVfQUREUihXTTg3NzVfQUFEQ1IsIGdhaW4pLAorCQkJCU1BS0VfV004Nzc1X0RBVEEoZ2FpbikpOworfQogCiBzdGF0aWMgaW50IGh3X2FkY19pbnB1dF9zZWxlY3Qoc3RydWN0IGh3ICpodywgZW51bSBBRENTUkMgdHlwZSkKIHsKIAl1MzIgZGF0YTsKLQogCWRhdGEgPSBod19yZWFkXzIwa3goaHcsIEdQSU9fREFUQSk7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBBRENfTUlDSU46CiAJCWRhdGEgfD0gKDB4MSA8PCAxNCk7CiAJCWh3X3dyaXRlXzIwa3goaHcsIEdQSU9fREFUQSwgZGF0YSk7Ci0JCWh3MjBrMl9pMmNfd3JpdGUoaHcsIE1BS0VfV004Nzc1X0FERFIoV004Nzc1X0FEQ01DLCAweDEwMSksCi0JCQkJTUFLRV9XTTg3NzVfREFUQSgweDEwMSkpOyAvKiBNaWMtaW4gKi8KLQkJaHcyMGsyX2kyY193cml0ZShodywKLQkJCQlNQUtFX1dNODc3NV9BRERSKFdNODc3NV9BQURDTCwgTUlDX0JPT1NUXzIwREIpLAotCQkJCU1BS0VfV004Nzc1X0RBVEEoTUlDX0JPT1NUXzIwREIpKTsgLyogKzIwZEIgKi8KLQkJaHcyMGsyX2kyY193cml0ZShodywKLQkJCQlNQUtFX1dNODc3NV9BRERSKFdNODc3NV9BQURDUiwgTUlDX0JPT1NUXzIwREIpLAotCQkJCU1BS0VfV004Nzc1X0RBVEEoTUlDX0JPT1NUXzIwREIpKTsgLyogKzIwZEIgKi8KKwkJaHdfd204Nzc1X2lucHV0X3NlbGVjdChodywgMCwgMjApOyAvKiBNaWMsIDIwZEIgKi8KIAkJYnJlYWs7CiAJY2FzZSBBRENfTElORUlOOgogCQlkYXRhICY9IH4oMHgxIDw8IDE0KTsKIAkJaHdfd3JpdGVfMjBreChodywgR1BJT19EQVRBLCBkYXRhKTsKLQkJaHcyMGsyX2kyY193cml0ZShodywgTUFLRV9XTTg3NzVfQUREUihXTTg3NzVfQURDTUMsIDB4MTAyKSwKLQkJCQlNQUtFX1dNODc3NV9EQVRBKDB4MTAyKSk7IC8qIExpbmUtaW4gKi8KLQkJaHcyMGsyX2kyY193cml0ZShodywgTUFLRV9XTTg3NzVfQUREUihXTTg3NzVfQUFEQ0wsIDB4Q0YpLAotCQkJCU1BS0VfV004Nzc1X0RBVEEoMHhDRikpOyAvKiBObyBib29zdCAqLwotCQlodzIwazJfaTJjX3dyaXRlKGh3LCBNQUtFX1dNODc3NV9BRERSKFdNODc3NV9BQURDUiwgMHhDRiksCi0JCQkJTUFLRV9XTTg3NzVfREFUQSgweENGKSk7IC8qIE5vIGJvb3N0ICovCisJCWh3X3dtODc3NV9pbnB1dF9zZWxlY3QoaHcsIDEsIDApOyAvKiBMaW5lLWluLCAwZEIgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC0xNzgyLDcgKzE4MzcsNyBAQAogc3RhdGljIGludCBod19hZGNfaW5pdChzdHJ1Y3QgaHcgKmh3LCBjb25zdCBzdHJ1Y3QgYWRjX2NvbmYgKmluZm8pCiB7CiAJaW50IGVycjsKLQl1MzIgbXV4ID0gMiwgZGF0YSwgY3RsOworCXUzMiBkYXRhLCBjdGw7CiAKIAkvKiAgU2V0IEFEQyByZXNldCBiaXQgYXMgb3V0cHV0ICovCiAJZGF0YSA9IGh3X3JlYWRfMjBreChodywgR1BJT19DVFJMKTsKQEAgLTE3OTYsMTkgKzE4NTEsNDIgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQkvKiBNYWtlIEFEQyBpbiBub3JtYWwgb3BlcmF0aW9uICovCisJLyogUmVzZXQgdGhlIEFEQyAocmVzZXQgaXMgYWN0aXZlIGxvdykuICovCiAJZGF0YSA9IGh3X3JlYWRfMjBreChodywgR1BJT19EQVRBKTsKIAlkYXRhICY9IH4oMHgxIDw8IDE1KTsKKwlod193cml0ZV8yMGt4KGh3LCBHUElPX0RBVEEsIGRhdGEpOworCisJaWYgKGh3LT5tb2RlbCA9PSBDVFNCMTI3MCkgeworCQkvKiBTZXQgdXAgdGhlIFBDTTQyMjAgQURDIG9uIFRpdGFuaXVtIEhEICovCisJCWRhdGEgJj0gfjB4MEM7CisJCWlmICgxID09IGluZm8tPm1zcikKKwkJCWRhdGEgfD0gMHgwMDsgLyogU2luZ2xlIFNwZWVkIE1vZGUgMzItNTBrSHogKi8KKwkJZWxzZSBpZiAoMiA9PSBpbmZvLT5tc3IpCisJCQlkYXRhIHw9IDB4MDg7IC8qIERvdWJsZSBTcGVlZCBNb2RlIDUwLTEwOGtIeiAqLworCQllbHNlCisJCQlkYXRhIHw9IDB4MDQ7IC8qIFF1YWQgU3BlZWQgTW9kZSAxMDhrSHotMjE2a0h6ICovCisJCWh3X3dyaXRlXzIwa3goaHcsIEdQSU9fREFUQSwgZGF0YSk7CisJfQorCiAJbWRlbGF5KDEwKTsKKwkvKiBSZXR1cm4gdGhlIEFEQyB0byBub3JtYWwgb3BlcmF0aW9uLiAqLwogCWRhdGEgfD0gKDB4MSA8PCAxNSk7CiAJaHdfd3JpdGVfMjBreChodywgR1BJT19EQVRBLCBkYXRhKTsKIAltZGVsYXkoNTApOwogCisJLyogSTJDIHdyaXRlIHRvIHJlZ2lzdGVyIG9mZnNldCAweDBCIHRvIHNldCBBREMgTFJDTEsgcG9sYXJpdHkgKi8KKwkvKiBpbnZlcnQgYml0LCBpbnRlcmZhY2UgZm9ybWF0IHRvIEkyUywgd29yZCBsZW5ndGggdG8gMjQtYml0LCAqLworCS8qIGVuYWJsZSBBREMgaGlnaCBwYXNzIGZpbHRlci4gRml4ZXMgYnVnIDUzMjM/CQkqLworCWh3MjBrMl9pMmNfd3JpdGUoaHcsIE1BS0VfV004Nzc1X0FERFIoV004Nzc1X0lDLCAweDI2KSwKKwkJCSBNQUtFX1dNODc3NV9EQVRBKDB4MjYpKTsKKwogCS8qIFNldCB0aGUgbWFzdGVyIG1vZGUgKDI1NmZzKSAqLwogCWlmICgxID09IGluZm8tPm1zcikgeworCQkvKiBzbGF2ZSBtb2RlLCAxMjh4IG92ZXJzYW1wbGluZyAyNTZmcyAqLwogCQlodzIwazJfaTJjX3dyaXRlKGh3LCBNQUtFX1dNODc3NV9BRERSKFdNODc3NV9NTUMsIDB4MDIpLAogCQkJCQkJTUFLRV9XTTg3NzVfREFUQSgweDAyKSk7Ci0JfSBlbHNlIGlmICgyID09IGluZm8tPm1zcikgeworCX0gZWxzZSBpZiAoKDIgPT0gaW5mby0+bXNyKSB8fCAoNCA9PSBpbmZvLT5tc3IpKSB7CisJCS8qIHNsYXZlIG1vZGUsIDY0eCBvdmVyc2FtcGxpbmcsIDI1NmZzICovCiAJCWh3MjBrMl9pMmNfd3JpdGUoaHcsIE1BS0VfV004Nzc1X0FERFIoV004Nzc1X01NQywgMHgwQSksCiAJCQkJCQlNQUtFX1dNODc3NV9EQVRBKDB4MEEpKTsKIAl9IGVsc2UgewpAQCAtMTgxOCw1NSArMTg5NiwxMTMgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQkvKiBDb25maWd1cmUgR1BJTyBiaXQgMTQgY2hhbmdlIHRvIGxpbmUtaW4vbWljLWluICovCi0JY3RsID0gaHdfcmVhZF8yMGt4KGh3LCBHUElPX0NUUkwpOwotCWN0bCB8PSAweDEgPDwgMTQ7Ci0JaHdfd3JpdGVfMjBreChodywgR1BJT19DVFJMLCBjdGwpOwotCi0JLyogQ2hlY2sgdXNpbmcgTWljLWluIG9yIExpbmUtaW4gKi8KLQlkYXRhID0gaHdfcmVhZF8yMGt4KGh3LCBHUElPX0RBVEEpOwotCi0JaWYgKG11eCA9PSAxKSB7Ci0JCS8qIENvbmZpZ3VyZXMgR1BJTyBkYXRhIHRvIHNlbGVjdCBNaWMtaW4gKi8KLQkJZGF0YSB8PSAweDEgPDwgMTQ7Ci0JCWh3X3dyaXRlXzIwa3goaHcsIEdQSU9fREFUQSwgZGF0YSk7Ci0KLQkJaHcyMGsyX2kyY193cml0ZShodywgTUFLRV9XTTg3NzVfQUREUihXTTg3NzVfQURDTUMsIDB4MTAxKSwKLQkJCQlNQUtFX1dNODc3NV9EQVRBKDB4MTAxKSk7IC8qIE1pYy1pbiAqLwotCQlodzIwazJfaTJjX3dyaXRlKGh3LAotCQkJCU1BS0VfV004Nzc1X0FERFIoV004Nzc1X0FBRENMLCBNSUNfQk9PU1RfMjBEQiksCi0JCQkJTUFLRV9XTTg3NzVfREFUQShNSUNfQk9PU1RfMjBEQikpOyAvKiArMjBkQiAqLwotCQlodzIwazJfaTJjX3dyaXRlKGh3LAotCQkJCU1BS0VfV004Nzc1X0FERFIoV004Nzc1X0FBRENSLCBNSUNfQk9PU1RfMjBEQiksCi0JCQkJTUFLRV9XTTg3NzVfREFUQShNSUNfQk9PU1RfMjBEQikpOyAvKiArMjBkQiAqLwotCX0gZWxzZSBpZiAobXV4ID09IDIpIHsKLQkJLyogQ29uZmlndXJlcyBHUElPIGRhdGEgdG8gc2VsZWN0IExpbmUtaW4gKi8KLQkJZGF0YSAmPSB+KDB4MSA8PCAxNCk7Ci0JCWh3X3dyaXRlXzIwa3goaHcsIEdQSU9fREFUQSwgZGF0YSk7Ci0KLQkJLyogU2V0dXAgQURDICovCi0JCWh3MjBrMl9pMmNfd3JpdGUoaHcsIE1BS0VfV004Nzc1X0FERFIoV004Nzc1X0FEQ01DLCAweDEwMiksCi0JCQkJTUFLRV9XTTg3NzVfREFUQSgweDEwMikpOyAvKiBMaW5lLWluICovCi0JCWh3MjBrMl9pMmNfd3JpdGUoaHcsIE1BS0VfV004Nzc1X0FERFIoV004Nzc1X0FBRENMLCAweENGKSwKLQkJCQlNQUtFX1dNODc3NV9EQVRBKDB4Q0YpKTsgLyogTm8gYm9vc3QgKi8KLQkJaHcyMGsyX2kyY193cml0ZShodywgTUFLRV9XTTg3NzVfQUREUihXTTg3NzVfQUFEQ1IsIDB4Q0YpLAotCQkJCU1BS0VfV004Nzc1X0RBVEEoMHhDRikpOyAvKiBObyBib29zdCAqLworCWlmIChody0+bW9kZWwgIT0gQ1RTQjEyNzApIHsKKwkJLyogQ29uZmlndXJlIEdQSU8gYml0IDE0IGNoYW5nZSB0byBsaW5lLWluL21pYy1pbiAqLworCQljdGwgPSBod19yZWFkXzIwa3goaHcsIEdQSU9fQ1RSTCk7CisJCWN0bCB8PSAweDEgPDwgMTQ7CisJCWh3X3dyaXRlXzIwa3goaHcsIEdQSU9fQ1RSTCwgY3RsKTsKKwkJaHdfYWRjX2lucHV0X3NlbGVjdChodywgQURDX0xJTkVJTik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgImN0eGZpOiBFUlJPUiEhISBJbnZhbGlkIGlucHV0IG11eCEhIVxuIik7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyb3I7CisJCWh3X3dtODc3NV9pbnB1dF9zZWxlY3QoaHcsIDAsIDApOwogCX0KIAogCXJldHVybiAwOwotCiBlcnJvcjoKIAlodzIwazJfaTJjX3VuaW5pdChodyk7CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBod19oYXZlX2RpZ2l0X2lvX3N3aXRjaChzdHJ1Y3QgaHcgKmh3KQorc3RhdGljIHN0cnVjdCBjYXBhYmlsaXRpZXMgaHdfY2FwYWJpbGl0aWVzKHN0cnVjdCBodyAqaHcpCiB7Ci0JcmV0dXJuIDA7CisJc3RydWN0IGNhcGFiaWxpdGllcyBjYXA7CisKKwljYXAuZGlnaXRfaW9fc3dpdGNoID0gMDsKKwljYXAuZGVkaWNhdGVkX21pYyA9IGh3LT5tb2RlbCA9PSBDVFNCMTI3MDsKKwljYXAub3V0cHV0X3N3aXRjaCA9IGh3LT5tb2RlbCA9PSBDVFNCMTI3MDsKKwljYXAubWljX3NvdXJjZV9zd2l0Y2ggPSBody0+bW9kZWwgPT0gQ1RTQjEyNzA7CisKKwlyZXR1cm4gY2FwOworfQorCitzdGF0aWMgaW50IGh3X291dHB1dF9zd2l0Y2hfZ2V0KHN0cnVjdCBodyAqaHcpCit7CisJdTMyIGRhdGEgPSBod19yZWFkXzIwa3goaHcsIEdQSU9fRVhUX0RBVEEpOworCisJc3dpdGNoIChkYXRhICYgMHgzMCkgeworCWNhc2UgMHgwMDoKKwkgICAgIHJldHVybiAwOworCWNhc2UgMHgxMDoKKwkgICAgIHJldHVybiAxOworCWNhc2UgMHgyMDoKKwkgICAgIHJldHVybiAyOworCWRlZmF1bHQ6CisJICAgICByZXR1cm4gMzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHdfb3V0cHV0X3N3aXRjaF9wdXQoc3RydWN0IGh3ICpodywgaW50IHBvc2l0aW9uKQoreworCXUzMiBkYXRhOworCisJaWYgKHBvc2l0aW9uID09IGh3X291dHB1dF9zd2l0Y2hfZ2V0KGh3KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBNdXRlIGxpbmUgYW5kIGhlYWRwaG9uZXMgKGludGVuZGVkIGZvciBhbnRpLXBvcCkuICovCisJZGF0YSA9IGh3X3JlYWRfMjBreChodywgR1BJT19EQVRBKTsKKwlkYXRhIHw9ICgweDAzIDw8IDExKTsKKwlod193cml0ZV8yMGt4KGh3LCBHUElPX0RBVEEsIGRhdGEpOworCisJZGF0YSA9IGh3X3JlYWRfMjBreChodywgR1BJT19FWFRfREFUQSkgJiB+MHgzMDsKKwlzd2l0Y2ggKHBvc2l0aW9uKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDE6CisJCWRhdGEgfD0gMHgxMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGF0YSB8PSAweDIwOworCX0KKwlod193cml0ZV8yMGt4KGh3LCBHUElPX0VYVF9EQVRBLCBkYXRhKTsKKworCS8qIFVubXV0ZSBsaW5lIGFuZCBoZWFkcGhvbmVzLiAqLworCWRhdGEgPSBod19yZWFkXzIwa3goaHcsIEdQSU9fREFUQSk7CisJZGF0YSAmPSB+KDB4MDMgPDwgMTEpOworCWh3X3dyaXRlXzIwa3goaHcsIEdQSU9fREFUQSwgZGF0YSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBod19taWNfc291cmNlX3N3aXRjaF9nZXQoc3RydWN0IGh3ICpodykKK3sKKwlzdHJ1Y3QgaHcyMGsyICpodzIwazIgPSAoc3RydWN0IGh3MjBrMiAqKWh3OworCisJcmV0dXJuIGh3MjBrMi0+bWljX3NvdXJjZTsKK30KKworc3RhdGljIGludCBod19taWNfc291cmNlX3N3aXRjaF9wdXQoc3RydWN0IGh3ICpodywgaW50IHBvc2l0aW9uKQoreworCXN0cnVjdCBodzIwazIgKmh3MjBrMiA9IChzdHJ1Y3QgaHcyMGsyICopaHc7CisKKwlpZiAocG9zaXRpb24gPT0gaHcyMGsyLT5taWNfc291cmNlKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocG9zaXRpb24pIHsKKwljYXNlIDA6CisJCWh3X3dtODc3NV9pbnB1dF9zZWxlY3QoaHcsIDAsIDApOyAvKiBNaWMsIDBkQiAqLworCQlicmVhazsKKwljYXNlIDE6CisJCWh3X3dtODc3NV9pbnB1dF9zZWxlY3QoaHcsIDEsIDApOyAvKiBGUCBNaWMsIDBkQiAqLworCQlicmVhazsKKwljYXNlIDI6CisJCWh3X3dtODc3NV9pbnB1dF9zZWxlY3QoaHcsIDMsIDApOyAvKiBBdXggRXh0LCAwZEIgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJaHcyMGsyLT5taWNfc291cmNlID0gcG9zaXRpb247CisKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGN0XzIwazJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTE5MjUsNyArMjA2MSw3IEBACiAKIAlpZiAoaHctPmlycSA8IDApIHsKIAkJZXJyID0gcmVxdWVzdF9pcnEocGNpLT5pcnEsIGN0XzIwazJfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCQkgICJjdHhmaSIsIGh3KTsKKwkJCQkgIEtCVUlMRF9NT0ROQU1FLCBodyk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlhGaTogQ2Fubm90IGdldCBpcnEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJCWdvdG8gZXJyb3IyOwpAQCAtMjAyMywxMyArMjE1OSwxNiBAQAogCS8qIFJlc2V0IGFsbCBTUkMgcGVuZGluZyBpbnRlcnJ1cHRzICovCiAJaHdfd3JpdGVfMjBreChodywgU1JDX0lQLCAwKTsKIAotCS8qIFRPRE86IGRldGVjdCB0aGUgY2FyZCBJRCBhbmQgY29uZmlndXJlIEdQSU8gYWNjb3JkaW5nbHkuICovCi0JLyogQ29uZmlndXJlcyBHUElPICgweEQ4MDIgMHg5ODAyOCkgKi8KLQkvKmh3X3dyaXRlXzIwa3goaHcsIEdQSU9fQ1RSTCwgMHg3RjA3KTsqLwotCS8qIENvbmZpZ3VyZXMgR1BJTyAoU0IwODgwKSAqLwotCS8qaHdfd3JpdGVfMjBreChodywgR1BJT19DVFJMLCAweEZGMDcpOyovCi0JaHdfd3JpdGVfMjBreChodywgR1BJT19DVFJMLCAweEQ4MDIpOwotCisJaWYgKGh3LT5tb2RlbCAhPSBDVFNCMTI3MCkgeworCQkvKiBUT0RPOiBkZXRlY3QgdGhlIGNhcmQgSUQgYW5kIGNvbmZpZ3VyZSBHUElPIGFjY29yZGluZ2x5LiAqLworCQkvKiBDb25maWd1cmVzIEdQSU8gKDB4RDgwMiAweDk4MDI4KSAqLworCQkvKmh3X3dyaXRlXzIwa3goaHcsIEdQSU9fQ1RSTCwgMHg3RjA3KTsqLworCQkvKiBDb25maWd1cmVzIEdQSU8gKFNCMDg4MCkgKi8KKwkJLypod193cml0ZV8yMGt4KGh3LCBHUElPX0NUUkwsIDB4RkYwNyk7Ki8KKwkJaHdfd3JpdGVfMjBreChodywgR1BJT19DVFJMLCAweEQ4MDIpOworCX0gZWxzZSB7CisJCWh3X3dyaXRlXzIwa3goaHcsIEdQSU9fQ1RSTCwgMHg5RTVGKTsKKwl9CiAJLyogRW5hYmxlIGF1ZGlvIHJpbmcgKi8KIAlod193cml0ZV8yMGt4KGh3LCBNSVhFUl9BUl9FTkFCTEUsIDB4MDEpOwogCkBAIC0yMTA2LDcgKzIyNDUsMTEgQEAKIAkucGxsX2luaXQgPSBod19wbGxfaW5pdCwKIAkuaXNfYWRjX3NvdXJjZV9zZWxlY3RlZCA9IGh3X2lzX2FkY19pbnB1dF9zZWxlY3RlZCwKIAkuc2VsZWN0X2FkY19zb3VyY2UgPSBod19hZGNfaW5wdXRfc2VsZWN0LAotCS5oYXZlX2RpZ2l0X2lvX3N3aXRjaCA9IGh3X2hhdmVfZGlnaXRfaW9fc3dpdGNoLAorCS5jYXBhYmlsaXRpZXMgPSBod19jYXBhYmlsaXRpZXMsCisJLm91dHB1dF9zd2l0Y2hfZ2V0ID0gaHdfb3V0cHV0X3N3aXRjaF9nZXQsCisJLm91dHB1dF9zd2l0Y2hfcHV0ID0gaHdfb3V0cHV0X3N3aXRjaF9wdXQsCisJLm1pY19zb3VyY2Vfc3dpdGNoX2dldCA9IGh3X21pY19zb3VyY2Vfc3dpdGNoX2dldCwKKwkubWljX3NvdXJjZV9zd2l0Y2hfcHV0ID0gaHdfbWljX3NvdXJjZV9zd2l0Y2hfcHV0LAogI2lmZGVmIENPTkZJR19QTQogCS5zdXNwZW5kID0gaHdfc3VzcGVuZCwKIAkucmVzdW1lID0gaHdfcmVzdW1lLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL2N0bWl4ZXIuYyBiL3NvdW5kL3BjaS9jdHhmaS9jdG1peGVyLmMKaW5kZXggYzM1MTlmZi4uMGNjMTNlZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2N0eGZpL2N0bWl4ZXIuYworKysgYi9zb3VuZC9wY2kvY3R4ZmkvY3RtaXhlci5jCkBAIC04Niw5ICs4Niw3IEBACiAJTUlYRVJfTElORUlOX0NfUywKIAlNSVhFUl9NSUNfQ19TLAogCU1JWEVSX1NQRElGSV9DX1MsCi0JTUlYRVJfTElORUlOX1BfUywKIAlNSVhFUl9TUERJRk9fUF9TLAotCU1JWEVSX1NQRElGSV9QX1MsCiAJTUlYRVJfV0FWRUZfUF9TLAogCU1JWEVSX1dBVkVSX1BfUywKIAlNSVhFUl9XQVZFQ19QX1MsCkBAIC0xMzcsMTEgKzEzNSwxMSBAQAogCX0sCiAJW01JWEVSX0xJTkVJTl9QXSA9IHsKIAkJLmN0bCA9IDEsCi0JCS5uYW1lID0gIkxpbmUtaW4gUGxheWJhY2sgVm9sdW1lIiwKKwkJLm5hbWUgPSAiTGluZSBQbGF5YmFjayBWb2x1bWUiLAogCX0sCiAJW01JWEVSX0xJTkVJTl9DXSA9IHsKIAkJLmN0bCA9IDEsCi0JCS5uYW1lID0gIkxpbmUtaW4gQ2FwdHVyZSBWb2x1bWUiLAorCQkubmFtZSA9ICJMaW5lIENhcHR1cmUgVm9sdW1lIiwKIAl9LAogCVtNSVhFUl9NSUNfUF0gPSB7CiAJCS5jdGwgPSAxLApAQCAtMTUzLDE1ICsxNTEsMTUgQEAKIAl9LAogCVtNSVhFUl9TUERJRklfUF0gPSB7CiAJCS5jdGwgPSAxLAotCQkubmFtZSA9ICJTL1BESUYtaW4gUGxheWJhY2sgVm9sdW1lIiwKKwkJLm5hbWUgPSAiSUVDOTU4IFBsYXliYWNrIFZvbHVtZSIsCiAJfSwKIAlbTUlYRVJfU1BESUZJX0NdID0gewogCQkuY3RsID0gMSwKLQkJLm5hbWUgPSAiUy9QRElGLWluIENhcHR1cmUgVm9sdW1lIiwKKwkJLm5hbWUgPSAiSUVDOTU4IENhcHR1cmUgVm9sdW1lIiwKIAl9LAogCVtNSVhFUl9TUERJRk9fUF0gPSB7CiAJCS5jdGwgPSAxLAotCQkubmFtZSA9ICJTL1BESUYtb3V0IFBsYXliYWNrIFZvbHVtZSIsCisJCS5uYW1lID0gIkRpZ2l0YWwgUGxheWJhY2sgVm9sdW1lIiwKIAl9LAogCVtNSVhFUl9XQVZFRl9QXSA9IHsKIAkJLmN0bCA9IDEsCkBAIC0xNzksMTQgKzE3NywxMyBAQAogCQkuY3RsID0gMSwKIAkJLm5hbWUgPSAiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwKIAl9LAotCiAJW01JWEVSX1BDTV9DX1NdID0gewogCQkuY3RsID0gMSwKIAkJLm5hbWUgPSAiUENNIENhcHR1cmUgU3dpdGNoIiwKIAl9LAogCVtNSVhFUl9MSU5FSU5fQ19TXSA9IHsKIAkJLmN0bCA9IDEsCi0JCS5uYW1lID0gIkxpbmUtaW4gQ2FwdHVyZSBTd2l0Y2giLAorCQkubmFtZSA9ICJMaW5lIENhcHR1cmUgU3dpdGNoIiwKIAl9LAogCVtNSVhFUl9NSUNfQ19TXSA9IHsKIAkJLmN0bCA9IDEsCkBAIC0xOTQsMTkgKzE5MSwxMSBAQAogCX0sCiAJW01JWEVSX1NQRElGSV9DX1NdID0gewogCQkuY3RsID0gMSwKLQkJLm5hbWUgPSAiUy9QRElGLWluIENhcHR1cmUgU3dpdGNoIiwKLQl9LAotCVtNSVhFUl9MSU5FSU5fUF9TXSA9IHsKLQkJLmN0bCA9IDEsCi0JCS5uYW1lID0gIkxpbmUtaW4gUGxheWJhY2sgU3dpdGNoIiwKKwkJLm5hbWUgPSAiSUVDOTU4IENhcHR1cmUgU3dpdGNoIiwKIAl9LAogCVtNSVhFUl9TUERJRk9fUF9TXSA9IHsKIAkJLmN0bCA9IDEsCi0JCS5uYW1lID0gIlMvUERJRi1vdXQgUGxheWJhY2sgU3dpdGNoIiwKLQl9LAotCVtNSVhFUl9TUERJRklfUF9TXSA9IHsKLQkJLmN0bCA9IDEsCi0JCS5uYW1lID0gIlMvUERJRi1pbiBQbGF5YmFjayBTd2l0Y2giLAorCQkubmFtZSA9ICJEaWdpdGFsIFBsYXliYWNrIFN3aXRjaCIsCiAJfSwKIAlbTUlYRVJfV0FWRUZfUF9TXSA9IHsKIAkJLmN0bCA9IDEsCkBAIC0yMzYsNiArMjI1LDggQEAKIHN0YXRpYyB2b2lkCiBjdF9taXhlcl9yZWNvcmRpbmdfdW5zZWxlY3Qoc3RydWN0IGN0X21peGVyICptaXhlciwgZW51bSBDVF9BTUlYRVJfQ1RMIHR5cGUpOwogCisvKiBGSVhNRTogdGhpcyBzdGF0aWMgbG9va3MgbGlrZSBpdCB3b3VsZCBmYWlsIGlmIG1vcmUgdGhhbiBvbmUgY2FyZCB3YXMgKi8KKy8qIGluc3RhbGxlZC4gKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sICprY3Rsc1syXSA9IHtOVUxMfTsKIAogc3RhdGljIGVudW0gQ1RfQU1JWEVSX0NUTCBnZXRfYW1peGVyX2luZGV4KGVudW0gQ1RBTFNBX01JWEVSX0NUTCBhbHNhX2luZGV4KQpAQCAtNDIwLDYgKzQxMSw3NyBAQAogCS50bHYJCT0geyAucCA9ICBjdF92b2xfZGJfc2NhbGUgfSwKIH07CiAKK3N0YXRpYyBpbnQgb3V0cHV0X3N3aXRjaF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICppbmZvKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBuYW1lc1szXSA9IHsKKwkgICJGUCBIZWFkcGhvbmVzIiwgIkhlYWRwaG9uZXMiLCAiU3BlYWtlcnMiCisJfTsKKworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAzLCBuYW1lcyk7Cit9CisKK3N0YXRpYyBpbnQgb3V0cHV0X3N3aXRjaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBjdF9hdGMgKmF0YyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gYXRjLT5vdXRwdXRfc3dpdGNoX2dldChhdGMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG91dHB1dF9zd2l0Y2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgY3RfYXRjICphdGMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gYXRjLT5vdXRwdXRfc3dpdGNoX3B1dChhdGMsIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgb3V0cHV0X2N0bCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJBbmFsb2cgT3V0cHV0IFBsYXliYWNrIEVudW0iLAorCS5pbmZvID0gb3V0cHV0X3N3aXRjaF9pbmZvLAorCS5nZXQgPSBvdXRwdXRfc3dpdGNoX2dldCwKKwkucHV0ID0gb3V0cHV0X3N3aXRjaF9wdXQsCit9OworCitzdGF0aWMgaW50IG1pY19zb3VyY2Vfc3dpdGNoX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKmluZm8pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzWzNdID0geworCSAgIk1pYyIsICJGUCBNaWMiLCAiQXV4IgorCX07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8oaW5mbywgMSwgMywgbmFtZXMpOworfQorCitzdGF0aWMgaW50IG1pY19zb3VyY2Vfc3dpdGNoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGN0X2F0YyAqYXRjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBhdGMtPm1pY19zb3VyY2Vfc3dpdGNoX2dldChhdGMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1pY19zb3VyY2Vfc3dpdGNoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGN0X2F0YyAqYXRjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGF0Yy0+bWljX3NvdXJjZV9zd2l0Y2hfcHV0KGF0YywKKwkJCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtaWNfc291cmNlX2N0bCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJNaWMgU291cmNlIENhcHR1cmUgRW51bSIsCisJLmluZm8gPSBtaWNfc291cmNlX3N3aXRjaF9pbmZvLAorCS5nZXQgPSBtaWNfc291cmNlX3N3aXRjaF9nZXQsCisJLnB1dCA9IG1pY19zb3VyY2Vfc3dpdGNoX3B1dCwKK307CisKIHN0YXRpYyB2b2lkCiBkb19saW5lX21pY19zd2l0Y2goc3RydWN0IGN0X2F0YyAqYXRjLCBlbnVtIENUQUxTQV9NSVhFUl9DVEwgdHlwZSkKIHsKQEAgLTQ2NSw2ICs1MjcsNyBAQAogc3RhdGljIHZvaWQgZG9fc3dpdGNoKHN0cnVjdCBjdF9hdGMgKmF0YywgZW51bSBDVEFMU0FfTUlYRVJfQ1RMIHR5cGUsIGludCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgY3RfbWl4ZXIgKm1peGVyID0gYXRjLT5taXhlcjsKKwlzdHJ1Y3QgY2FwYWJpbGl0aWVzIGNhcCA9IGF0Yy0+Y2FwYWJpbGl0aWVzKGF0Yyk7CiAKIAkvKiBEbyBjaGFuZ2VzIGluIG1peGVyLiAqLwogCWlmICgoU1dIX0NBUFRVUkVfU1RBUlQgPD0gdHlwZSkgJiYgKFNXSF9DQVBUVVJFX0VORCA+PSB0eXBlKSkgewpAQCAtNDc3LDggKzU0MCwxNyBAQAogCQl9CiAJfQogCS8qIERvIGNoYW5nZXMgb3V0IG9mIG1peGVyLiAqLwotCWlmIChzdGF0ZSAmJiAoTUlYRVJfTElORUlOX0NfUyA9PSB0eXBlIHx8IE1JWEVSX01JQ19DX1MgPT0gdHlwZSkpCi0JCWRvX2xpbmVfbWljX3N3aXRjaChhdGMsIHR5cGUpOworCWlmICghY2FwLmRlZGljYXRlZF9taWMgJiYKKwkgICAgKE1JWEVSX0xJTkVJTl9DX1MgPT0gdHlwZSB8fCBNSVhFUl9NSUNfQ19TID09IHR5cGUpKSB7CisJCWlmIChzdGF0ZSkKKwkJCWRvX2xpbmVfbWljX3N3aXRjaChhdGMsIHR5cGUpOworCQlhdGMtPmxpbmVfaW5fdW5tdXRlKGF0Yywgc3RhdGUpOworCX0gZWxzZSBpZiAoY2FwLmRlZGljYXRlZF9taWMgJiYgKE1JWEVSX0xJTkVJTl9DX1MgPT0gdHlwZSkpCisJCWF0Yy0+bGluZV9pbl91bm11dGUoYXRjLCBzdGF0ZSk7CisJZWxzZSBpZiAoY2FwLmRlZGljYXRlZF9taWMgJiYgKE1JWEVSX01JQ19DX1MgPT0gdHlwZSkpCisJCWF0Yy0+bWljX3VubXV0ZShhdGMsIHN0YXRlKTsKKwllbHNlIGlmIChNSVhFUl9TUERJRklfQ19TID09IHR5cGUpCisJCWF0Yy0+c3BkaWZfaW5fdW5tdXRlKGF0Yywgc3RhdGUpOwogCWVsc2UgaWYgKE1JWEVSX1dBVkVGX1BfUyA9PSB0eXBlKQogCQlhdGMtPmxpbmVfZnJvbnRfdW5tdXRlKGF0Yywgc3RhdGUpOwogCWVsc2UgaWYgKE1JWEVSX1dBVkVTX1BfUyA9PSB0eXBlKQpAQCAtNDg3LDEyICs1NTksOCBAQAogCQlhdGMtPmxpbmVfY2xmZV91bm11dGUoYXRjLCBzdGF0ZSk7CiAJZWxzZSBpZiAoTUlYRVJfV0FWRVJfUF9TID09IHR5cGUpCiAJCWF0Yy0+bGluZV9yZWFyX3VubXV0ZShhdGMsIHN0YXRlKTsKLQllbHNlIGlmIChNSVhFUl9MSU5FSU5fUF9TID09IHR5cGUpCi0JCWF0Yy0+bGluZV9pbl91bm11dGUoYXRjLCBzdGF0ZSk7CiAJZWxzZSBpZiAoTUlYRVJfU1BESUZPX1BfUyA9PSB0eXBlKQogCQlhdGMtPnNwZGlmX291dF91bm11dGUoYXRjLCBzdGF0ZSk7Ci0JZWxzZSBpZiAoTUlYRVJfU1BESUZJX1BfUyA9PSB0eXBlKQotCQlhdGMtPnNwZGlmX2luX3VubXV0ZShhdGMsIHN0YXRlKTsKIAllbHNlIGlmIChNSVhFUl9ESUdJVEFMX0lPX1MgPT0gdHlwZSkKIAkJZG9fZGlnaXRfaW9fc3dpdGNoKGF0Yywgc3RhdGUpOwogCkBAIC02NzEsNiArNzM5LDcgQEAKIHsKIAllbnVtIENUQUxTQV9NSVhFUl9DVEwgdHlwZTsKIAlzdHJ1Y3QgY3RfYXRjICphdGMgPSBtaXhlci0+YXRjOworCXN0cnVjdCBjYXBhYmlsaXRpZXMgY2FwID0gYXRjLT5jYXBhYmlsaXRpZXMoYXRjKTsKIAlpbnQgZXJyOwogCiAJLyogQ3JlYXRlIHNuZCBrY29udHJvbCBpbnN0YW5jZXMgb24gZGVtYW5kICovCkBAIC02ODQsOCArNzUzLDggQEAKIAkJfQogCX0KIAotCWN0X2tjb250cm9sX2luaXRfdGFibGVbTUlYRVJfRElHSVRBTF9JT19TXS5jdGwgPQotCQkJCQlhdGMtPmhhdmVfZGlnaXRfaW9fc3dpdGNoKGF0Yyk7CisJY3Rfa2NvbnRyb2xfaW5pdF90YWJsZVtNSVhFUl9ESUdJVEFMX0lPX1NdLmN0bCA9IGNhcC5kaWdpdF9pb19zd2l0Y2g7CisKIAlmb3IgKHR5cGUgPSBTV0hfTUlYRVJfU1RBUlQ7IHR5cGUgPD0gU1dIX01JWEVSX0VORDsgdHlwZSsrKSB7CiAJCWlmIChjdF9rY29udHJvbF9pbml0X3RhYmxlW3R5cGVdLmN0bCkgewogCQkJc3doX2N0bC5uYW1lID0gY3Rfa2NvbnRyb2xfaW5pdF90YWJsZVt0eXBlXS5uYW1lOwpAQCAtNzA4LDYgKzc3NywxNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwlpZiAoY2FwLm91dHB1dF9zd2l0Y2gpIHsKKwkJZXJyID0gY3RfbWl4ZXJfa2NvbnRyb2xfbmV3KG1peGVyLCAmb3V0cHV0X2N0bCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChjYXAubWljX3NvdXJjZV9zd2l0Y2gpIHsKKwkJZXJyID0gY3RfbWl4ZXJfa2NvbnRyb2xfbmV3KG1peGVyLCAmbWljX3NvdXJjZV9jdGwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CiAJYXRjLT5saW5lX2Zyb250X3VubXV0ZShhdGMsIDEpOwogCXNldF9zd2l0Y2hfc3RhdGUobWl4ZXIsIE1JWEVSX1dBVkVGX1BfUywgMSk7CiAJYXRjLT5saW5lX3N1cnJvdW5kX3VubXV0ZShhdGMsIDApOwpAQCAtNzE5LDEzICs3OTksMTIgQEAKIAlhdGMtPnNwZGlmX291dF91bm11dGUoYXRjLCAwKTsKIAlzZXRfc3dpdGNoX3N0YXRlKG1peGVyLCBNSVhFUl9TUERJRk9fUF9TLCAwKTsKIAlhdGMtPmxpbmVfaW5fdW5tdXRlKGF0YywgMCk7Ci0Jc2V0X3N3aXRjaF9zdGF0ZShtaXhlciwgTUlYRVJfTElORUlOX1BfUywgMCk7CisJaWYgKGNhcC5kZWRpY2F0ZWRfbWljKQorCQlhdGMtPm1pY191bm11dGUoYXRjLCAwKTsKIAlhdGMtPnNwZGlmX2luX3VubXV0ZShhdGMsIDApOwotCXNldF9zd2l0Y2hfc3RhdGUobWl4ZXIsIE1JWEVSX1NQRElGSV9QX1MsIDApOwotCi0Jc2V0X3N3aXRjaF9zdGF0ZShtaXhlciwgTUlYRVJfUENNX0NfUywgMSk7Ci0Jc2V0X3N3aXRjaF9zdGF0ZShtaXhlciwgTUlYRVJfTElORUlOX0NfUywgMSk7Ci0Jc2V0X3N3aXRjaF9zdGF0ZShtaXhlciwgTUlYRVJfU1BESUZJX0NfUywgMSk7CisJc2V0X3N3aXRjaF9zdGF0ZShtaXhlciwgTUlYRVJfUENNX0NfUywgMCk7CisJc2V0X3N3aXRjaF9zdGF0ZShtaXhlciwgTUlYRVJfTElORUlOX0NfUywgMCk7CisJc2V0X3N3aXRjaF9zdGF0ZShtaXhlciwgTUlYRVJfU1BESUZJX0NfUywgMCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jdHhmaS94ZmkuYyBiL3NvdW5kL3BjaS9jdHhmaS94ZmkuYwppbmRleCBmNDJlN2UxLi5iMjU5YWEwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3R4ZmkveGZpLmMKKysrIGIvc291bmQvcGNpL2N0eGZpL3hmaS5jCkBAIC04MCwxMSArODAsMTEgQEAKIAkJICAgICAgICJhcmUgNDgwMDAgYW5kIDQ0MTAwLCBWYWx1ZSA0ODAwMCBpcyBhc3N1bWVkLlxuIik7CiAJCXJlZmVyZW5jZV9yYXRlID0gNDgwMDA7CiAJfQotCWlmICgobXVsdGlwbGUgIT0gMSkgJiYgKG11bHRpcGxlICE9IDIpKSB7CisJaWYgKChtdWx0aXBsZSAhPSAxKSAmJiAobXVsdGlwbGUgIT0gMikgJiYgKG11bHRpcGxlICE9IDQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY3R4Zmk6IEludmFsaWQgbXVsdGlwbGUgdmFsdWUgJXUhISFcbiIsCiAJCSAgICAgICBtdWx0aXBsZSk7CiAJCXByaW50ayhLRVJOX0VSUiAiY3R4Zmk6IFRoZSB2YWxpZCB2YWx1ZXMgZm9yIG11bHRpcGxlIGFyZSAiCi0JCSAgICAgICAiMSBhbmQgMiwgVmFsdWUgMiBpcyBhc3N1bWVkLlxuIik7CisJCSAgICAgICAiMSwgMiBhbmQgNCwgVmFsdWUgMiBpcyBhc3N1bWVkLlxuIik7CiAJCW11bHRpcGxlID0gMjsKIAl9CiAJZXJyID0gY3RfYXRjX2NyZWF0ZShjYXJkLCBwY2ksIHJlZmVyZW5jZV9yYXRlLCBtdWx0aXBsZSwKQEAgLTE0Myw3ICsxNDMsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjdF9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAiU0ItWEZpIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IGN0X3BjaV9kZXZfaWRzLAogCS5wcm9iZSA9IGN0X2NhcmRfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGN0X2NhcmRfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCmluZGV4IDIwNzYzZGQuLmQ3MzA2OTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYwpAQCAtMTk5NSw3ICsxOTk1LDcgQEAKIAkJaW9yZW1hcF9ub2NhY2hlKGNoaXAtPmRzcF9yZWdpc3RlcnNfcGh5cywgc3opOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZWNob19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJRUNIT0NBUkRfTkFNRSwgY2hpcCkpIHsKKwkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlzbmRfZWNob19mcmVlKGNoaXApOwogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZ3JhYiBpcnFcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMjI4Niw3ICsyMjg2LDcgQEAKIAlrZnJlZShjb21tcGFnZV9iYWspOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZWNob19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJRUNIT0NBUkRfTkFNRSwgY2hpcCkpIHsKKwkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlzbmRfZWNob19mcmVlKGNoaXApOwogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZ3JhYiBpcnFcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMjMyNyw3ICsyMzI3LDcgQEAKIAogLyogcGNpX2RyaXZlciBkZWZpbml0aW9uICovCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIkVjaG9hdWRpbyAiIEVDSE9DQVJEX05BTUUsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfZWNob19pZHMsCiAJLnByb2JlID0gc25kX2VjaG9fcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9lY2hvX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMKaW5kZXggYWZmODM4Ny4uYTljNDVkMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYwpAQCAtMjY0LDcgKzI2NCw3IEBACiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICJFTVUxMEsxX0F1ZGlneSIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfZW11MTBrMV9pZHMsCiAJLnByb2JlID0gc25kX2NhcmRfZW11MTBrMV9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2NhcmRfZW11MTBrMV9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYwppbmRleCA1ZTYxOWE4Li5mY2Q0OTM1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYwpAQCAtMTQ0MCw2ICsxNDQwLDE0IEBACiAJIC5jYTAxMDJfY2hpcCA9IDEsCiAJIC5zcGs3MSA9IDEsCiAJIC5lbXVfbW9kZWwgPSBFTVVfTU9ERUxfRU1VMDQwNH0sIC8qIEVNVSAwNDA0ICovCisJLyogRU1VMDQwNCBQQ0llICovCisJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDgsIC5zdWJzeXN0ZW0gPSAweDQwMDUxMTAyLAorCSAuZHJpdmVyID0gIkF1ZGlneTIiLCAubmFtZSA9ICJFLW11IDA0MDQgUENJZSBbTUFFTTg5ODRdIiwKKwkgLmlkID0gIkVNVTA0MDQiLAorCSAuZW11MTBrMl9jaGlwID0gMSwKKwkgLmNhMDEwOF9jaGlwID0gMSwKKwkgLnNwazcxID0gMSwKKwkgLmVtdV9tb2RlbCA9IEVNVV9NT0RFTF9FTVUwNDA0fSwgLyogRU1VIDA0MDQgUENJZSB2ZXJfMDMgKi8KIAkvKiBOb3RlIHRoYXQgYWxsIEUtbXUgY2FyZHMgcmVxdWlyZSBrZXJuZWwgMi42IG9yIG5ld2VyLiAqLwogCXsudmVuZG9yID0gMHgxMTAyLCAuZGV2aWNlID0gMHgwMDA4LAogCSAuZHJpdmVyID0gIkF1ZGlneTIiLCAubmFtZSA9ICJTQiBBdWRpZ3kgMiBWYWx1ZSBbVW5rbm93bl0iLApAQCAtMTkwNCw3ICsxOTEyLDcgQEAKIAogCS8qIGlycSBoYW5kbGVyIG11c3QgYmUgcmVnaXN0ZXJlZCBhZnRlciBJL08gcG9ydHMgYXJlIGFjdGl2YXRlZCAqLwogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2VtdTEwazFfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCSJFTVUxMEsxIiwgZW11KSkgeworCQkJS0JVSUxEX01PRE5BTUUsIGVtdSkpIHsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCmluZGV4IDBjNzAxZTQuLmQ0ZmRlMWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwpAQCAtOTI1LDcgKzkyNSw3IEBACiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZW11MTBrMXhfaW50ZXJydXB0LAotCQkJSVJRRl9TSEFSRUQsICJFTVUxMEsxWCIsIGNoaXApKSB7CisJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImVtdTEwazF4OiBjYW5ub3QgZ3JhYiBpcnEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2VtdTEwazF4X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0xNjEzLDcgKzE2MTMsNyBAQAogCiAvLyBwY2lfZHJpdmVyIGRlZmluaXRpb24KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiRU1VMTBLMVgiLAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX2VtdTEwazF4X2lkcywKIAkucHJvYmUgPSBzbmRfZW11MTBrMXhfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9lbXUxMGsxeF9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VuczEzNzAuYyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKaW5kZXggODYzZWFmZS4uZjAyZTJmOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VuczEzNzAuYworKysgYi9zb3VuZC9wY2kvZW5zMTM3MC5jCkBAIC0yMTIwLDcgKzIxMjAsNyBAQAogCX0KIAllbnNvbmlxLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfYXVkaW9wY2lfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCSJFbnNvbmlxIEF1ZGlvUENJIiwgZW5zb25pcSkpIHsKKwkJCUtCVUlMRF9NT0ROQU1FLCBlbnNvbmlxKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2Vuc29uaXFfZnJlZShlbnNvbmlxKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTI0ODksNyArMjQ4OSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9hdWRpb3BjaV9pZHMsCiAJLnByb2JlID0gc25kX2F1ZGlvcGNpX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfYXVkaW9wY2lfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lczE5MzguYyBiL3NvdW5kL3BjaS9lczE5MzguYwppbmRleCA1NTNiNzUyLi4yNmE1YTJmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTM4LmMKKysrIGIvc291bmQvcGNpL2VzMTkzOC5jCkBAIC0xNTE0LDcgKzE1MTQsNyBAQAogCX0KIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2VzMTkzOF9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCwgIkVTMTkzOCIsIGNoaXApKSB7CisJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZXMxOTM4OiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKIAkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CkBAIC0xNjM2LDcgKzE2MzYsNyBAQAogCWNoaXAtPm1wdV9wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMyk7CiAJY2hpcC0+Z2FtZV9wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgNCk7CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfZXMxOTM4X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQkiRVMxOTM4IiwgY2hpcCkpIHsKKwkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2VzMTkzOF9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTg4Miw3ICsxODgyLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICJFU1MgRVMxOTM4IChTb2xvLTEpIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9lczE5MzhfaWRzLAogCS5wcm9iZSA9IHNuZF9lczE5MzhfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9lczE5MzhfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lczE5NjguYyBiL3NvdW5kL3BjaS9lczE5NjguYwppbmRleCBhYjBhNjE1Li45OWVhOTMyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTY4LmMKKysrIGIvc291bmQvcGNpL2VzMTk2OC5jCkBAIC01NTQsOSArNTU0LDggQEAKICNlbHNlCiAJc3RydWN0IHNuZF9rY29udHJvbCAqbWFzdGVyX3N3aXRjaDsgLyogZm9yIGgvdyB2b2x1bWUgY29udHJvbCAqLwogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKm1hc3Rlcl92b2x1bWU7Ci0Jc3BpbmxvY2tfdCBhYzk3X2xvY2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IGh3dm9sX3RxOwogI2VuZGlmCisJc3RydWN0IHdvcmtfc3RydWN0IGh3dm9sX3dvcms7CiAKICNpZmRlZiBDT05GSUdfU05EX0VTMTk2OF9SQURJTwogCXN0cnVjdCBzbmRfdGVhNTc1eCB0ZWE7CkBAIC02NDYsMzggKzY0NSwyMyBAQAogc3RhdGljIHZvaWQgc25kX2VzMTk2OF9hYzk3X3dyaXRlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWwpCiB7CiAJc3RydWN0IGVzMTk2OCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKLSNpZm5kZWYgQ09ORklHX1NORF9FUzE5NjhfSU5QVVQKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2VuZGlmCiAKIAlzbmRfZXMxOTY4X2FjOTdfd2FpdChjaGlwKTsKIAogCS8qIFdyaXRlIHRoZSBidXMgKi8KLSNpZm5kZWYgQ09ORklHX1NORF9FUzE5NjhfSU5QVVQKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+YWM5N19sb2NrLCBmbGFncyk7Ci0jZW5kaWYKIAlvdXR3KHZhbCwgY2hpcC0+aW9fcG9ydCArIEVTTV9BQzk3X0RBVEEpOwogCS8qbXNsZWVwKDEpOyovCiAJb3V0YihyZWcsIGNoaXAtPmlvX3BvcnQgKyBFU01fQUM5N19JTkRFWCk7CiAJLyptc2xlZXAoMSk7Ki8KLSNpZm5kZWYgQ09ORklHX1NORF9FUzE5NjhfSU5QVVQKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5hYzk3X2xvY2ssIGZsYWdzKTsKLSNlbmRpZgogfQogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2VzMTk2OF9hYzk3X3JlYWQoc3RydWN0IHNuZF9hYzk3ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcpCiB7CiAJdTE2IGRhdGEgPSAwOwogCXN0cnVjdCBlczE5NjggKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7Ci0jaWZuZGVmIENPTkZJR19TTkRfRVMxOTY4X0lOUFVUCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLSNlbmRpZgogCiAJc25kX2VzMTk2OF9hYzk3X3dhaXQoY2hpcCk7CiAKLSNpZm5kZWYgQ09ORklHX1NORF9FUzE5NjhfSU5QVVQKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+YWM5N19sb2NrLCBmbGFncyk7Ci0jZW5kaWYKIAlvdXRiKHJlZyB8IDB4ODAsIGNoaXAtPmlvX3BvcnQgKyBFU01fQUM5N19JTkRFWCk7CiAJLyptc2xlZXAoMSk7Ki8KIApAQCAtNjg1LDkgKzY2OSw2IEBACiAJCWRhdGEgPSBpbncoY2hpcC0+aW9fcG9ydCArIEVTTV9BQzk3X0RBVEEpOwogCQkvKm1zbGVlcCgxKTsqLwogCX0KLSNpZm5kZWYgQ09ORklHX1NORF9FUzE5NjhfSU5QVVQKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5hYzk3X2xvY2ssIGZsYWdzKTsKLSNlbmRpZgogCiAJcmV0dXJuIGRhdGE7CiB9CkBAIC0xOTA0LDEzICsxODg1LDEwIEBACiAgICAod2l0aG91dCB3cmFwIGFyb3VuZCkgaW4gcmVzcG9uc2UgdG8gdm9sdW1lIGJ1dHRvbiBwcmVzc2VzIGFuZCB0aGVuCiAgICBnZW5lcmF0aW5nIGFuIGludGVycnVwdC4gVGhlIHBhaXIgb2YgY291bnRlcnMgaXMgc3RvcmVkIGluIGJpdHMgMS0zIGFuZCA1LTcKICAgIG9mIGEgYnl0ZSB3aWRlIHJlZ2lzdGVyLiBUaGUgbWVhbmluZyBvZiBiaXRzIDAgYW5kIDQgaXMgdW5rbm93bi4gKi8KLXN0YXRpYyB2b2lkIGVzMTk2OF91cGRhdGVfaHdfdm9sdW1lKHVuc2lnbmVkIGxvbmcgcHJpdmF0ZV9kYXRhKQorc3RhdGljIHZvaWQgZXMxOTY4X3VwZGF0ZV9od192b2x1bWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBlczE5NjggKmNoaXAgPSAoc3RydWN0IGVzMTk2OCAqKSBwcml2YXRlX2RhdGE7CisJc3RydWN0IGVzMTk2OCAqY2hpcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZXMxOTY4LCBod3ZvbF93b3JrKTsKIAlpbnQgeCwgdmFsOwotI2lmbmRlZiBDT05GSUdfU05EX0VTMTk2OF9JTlBVVAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jZW5kaWYKIAogCS8qIEZpZ3VyZSBvdXQgd2hpY2ggdm9sdW1lIGNvbnRyb2wgYnV0dG9uIHdhcyBwdXNoZWQsCiAJICAgYmFzZWQgb24gZGlmZmVyZW5jZXMgZnJvbSB0aGUgZGVmYXVsdCByZWdpc3RlcgpAQCAtMTkyOSwxOCArMTkwNywxMSBAQAogCWlmICghIGNoaXAtPm1hc3Rlcl9zd2l0Y2ggfHwgISBjaGlwLT5tYXN0ZXJfdm9sdW1lKQogCQlyZXR1cm47CiAKLQkvKiBGSVhNRTogd2UgY2FuJ3QgY2FsbCBzbmRfYWM5N18qIGZ1bmN0aW9ucyBzaW5jZSBoZXJlIGlzIGluIHRhc2tsZXQuICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmFjOTdfbG9jaywgZmxhZ3MpOwotCXZhbCA9IGNoaXAtPmFjOTctPnJlZ3NbQUM5N19NQVNURVJdOworCXZhbCA9IHNuZF9hYzk3X3JlYWQoY2hpcC0+YWM5NywgQUM5N19NQVNURVIpOwogCXN3aXRjaCAoeCkgewogCWNhc2UgMHg4ODoKIAkJLyogbXV0ZSAqLwogCQl2YWwgXj0gMHg4MDAwOwotCQljaGlwLT5hYzk3LT5yZWdzW0FDOTdfTUFTVEVSXSA9IHZhbDsKLQkJb3V0dyh2YWwsIGNoaXAtPmlvX3BvcnQgKyBFU01fQUM5N19EQVRBKTsKLQkJb3V0YihBQzk3X01BU1RFUiwgY2hpcC0+aW9fcG9ydCArIEVTTV9BQzk3X0lOREVYKTsKLQkJc25kX2N0bF9ub3RpZnkoY2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCi0JCQkgICAgICAgJmNoaXAtPm1hc3Rlcl9zd2l0Y2gtPmlkKTsKIAkJYnJlYWs7CiAJY2FzZSAweGFhOgogCQkvKiB2b2x1bWUgdXAgKi8KQEAgLTE5NDgsMTEgKzE5MTksNiBAQAogCQkJdmFsLS07CiAJCWlmICgodmFsICYgMHg3ZjAwKSA+IDApCiAJCQl2YWwgLT0gMHgwMTAwOwotCQljaGlwLT5hYzk3LT5yZWdzW0FDOTdfTUFTVEVSXSA9IHZhbDsKLQkJb3V0dyh2YWwsIGNoaXAtPmlvX3BvcnQgKyBFU01fQUM5N19EQVRBKTsKLQkJb3V0YihBQzk3X01BU1RFUiwgY2hpcC0+aW9fcG9ydCArIEVTTV9BQzk3X0lOREVYKTsKLQkJc25kX2N0bF9ub3RpZnkoY2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCi0JCQkgICAgICAgJmNoaXAtPm1hc3Rlcl92b2x1bWUtPmlkKTsKIAkJYnJlYWs7CiAJY2FzZSAweDY2OgogCQkvKiB2b2x1bWUgZG93biAqLwpAQCAtMTk2MCwxNCArMTkyNiwxMSBAQAogCQkJdmFsKys7CiAJCWlmICgodmFsICYgMHg3ZjAwKSA8IDB4MWYwMCkKIAkJCXZhbCArPSAweDAxMDA7Ci0JCWNoaXAtPmFjOTctPnJlZ3NbQUM5N19NQVNURVJdID0gdmFsOwotCQlvdXR3KHZhbCwgY2hpcC0+aW9fcG9ydCArIEVTTV9BQzk3X0RBVEEpOwotCQlvdXRiKEFDOTdfTUFTVEVSLCBjaGlwLT5pb19wb3J0ICsgRVNNX0FDOTdfSU5ERVgpOwotCQlzbmRfY3RsX25vdGlmeShjaGlwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwKLQkJCSAgICAgICAmY2hpcC0+bWFzdGVyX3ZvbHVtZS0+aWQpOwogCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+YWM5N19sb2NrLCBmbGFncyk7CisJaWYgKHNuZF9hYzk3X3VwZGF0ZShjaGlwLT5hYzk3LCBBQzk3X01BU1RFUiwgdmFsKSkKKwkJc25kX2N0bF9ub3RpZnkoY2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCisJCQkgICAgICAgJmNoaXAtPm1hc3Rlcl92b2x1bWUtPmlkKTsKICNlbHNlCiAJaWYgKCFjaGlwLT5pbnB1dF9kZXYpCiAJCXJldHVybjsKQEAgLTIwMTMsMTEgKzE5NzYsNyBAQAogCW91dHcoaW53KGNoaXAtPmlvX3BvcnQgKyA0KSAmIDEsIGNoaXAtPmlvX3BvcnQgKyA0KTsKIAogCWlmIChldmVudCAmIEVTTV9IV1ZPTF9JUlEpCi0jaWZkZWYgQ09ORklHX1NORF9FUzE5NjhfSU5QVVQKLQkJZXMxOTY4X3VwZGF0ZV9od192b2x1bWUoKHVuc2lnbmVkIGxvbmcpY2hpcCk7Ci0jZWxzZQotCQl0YXNrbGV0X3NjaGVkdWxlKCZjaGlwLT5od3ZvbF90cSk7IC8qIHdlJ2xsIGRvIHRoaXMgbGF0ZXIgKi8KLSNlbmRpZgorCQlzY2hlZHVsZV93b3JrKCZjaGlwLT5od3ZvbF93b3JrKTsKIAogCS8qIGVsc2UgYWNrICdlbSBhbGwsIGkgaW1hZ2luZSAqLwogCW91dGIoMHhGRiwgY2hpcC0+aW9fcG9ydCArIDB4MUEpOwpAQCAtMjQyNiw2ICsyMzg1LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAljaGlwLT5pbl9zdXNwZW5kID0gMTsKKwljYW5jZWxfd29ya19zeW5jKCZjaGlwLT5od3ZvbF93b3JrKTsKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CiAJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY20pOwogCXNuZF9hYzk3X3N1c3BlbmQoY2hpcC0+YWM5Nyk7CkBAIC0yNjM4LDYgKzI1OTgsNyBAQAogCiBzdGF0aWMgaW50IHNuZF9lczE5NjhfZnJlZShzdHJ1Y3QgZXMxOTY4ICpjaGlwKQogeworCWNhbmNlbF93b3JrX3N5bmMoJmNoaXAtPmh3dm9sX3dvcmspOwogI2lmZGVmIENPTkZJR19TTkRfRVMxOTY4X0lOUFVUCiAJaWYgKGNoaXAtPmlucHV0X2RldikKIAkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoY2hpcC0+aW5wdXRfZGV2KTsKQEAgLTI3MjgsMTAgKzI2ODksNyBAQAogCUlOSVRfTElTVF9IRUFEKCZjaGlwLT5idWZfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNoaXAtPnN1YnN0cmVhbV9saXN0KTsKIAltdXRleF9pbml0KCZjaGlwLT5tZW1vcnlfbXV0ZXgpOwotI2lmbmRlZiBDT05GSUdfU05EX0VTMTk2OF9JTlBVVAotCXNwaW5fbG9ja19pbml0KCZjaGlwLT5hYzk3X2xvY2spOwotCXRhc2tsZXRfaW5pdCgmY2hpcC0+aHd2b2xfdHEsIGVzMTk2OF91cGRhdGVfaHdfdm9sdW1lLCAodW5zaWduZWQgbG9uZyljaGlwKTsKLSNlbmRpZgorCUlOSVRfV09SSygmY2hpcC0+aHd2b2xfd29yaywgZXMxOTY4X3VwZGF0ZV9od192b2x1bWUpOwogCWNoaXAtPmNhcmQgPSBjYXJkOwogCWNoaXAtPnBjaSA9IHBjaTsKIAljaGlwLT5pcnEgPSAtMTsKQEAgLTI3NDYsNyArMjcwNCw3IEBACiAJfQogCWNoaXAtPmlvX3BvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9lczE5NjhfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCSJFU1MgTWFlc3RybyIsIGNoaXApKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9lczE5NjhfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTI5MjUsNyArMjg4Myw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiRVMxOTY4IChFU1MgTWFlc3RybykiLAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX2VzMTk2OF9pZHMsCiAJLnByb2JlID0gc25kX2VzMTk2OF9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2VzMTk2OF9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ZtODAxLmMgYi9zb3VuZC9wY2kvZm04MDEuYwppbmRleCBhN2VjNzAzLi5mOTEyM2YwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZm04MDEuYworKysgYi9zb3VuZC9wY2kvZm04MDEuYwpAQCAtMTE5OSw3ICsxMTk5LDcgQEAKIAljaGlwLT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJaWYgKCh0ZWE1NzV4X3R1bmVyICYgVFVORVJfT05MWSkgPT0gMCkgewogCQlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9mbTgwMV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJCSJGTTgwMSIsIGNoaXApKSB7CisJCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIGNoaXAtPmlycSk7CiAJCQlzbmRfZm04MDFfZnJlZShjaGlwKTsKIAkJCXJldHVybiAtRUJVU1k7CkBAIC0xMzk0LDcgKzEzOTQsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiRk04MDEiLAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX2ZtODAxX2lkcywKIAkucHJvYmUgPSBzbmRfY2FyZF9mbTgwMV9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2NhcmRfZm04MDFfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvS2NvbmZpZyBiL3NvdW5kL3BjaS9oZGEvS2NvbmZpZwppbmRleCAwZWE1Y2M2Li43NDg5YjQ2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL0tjb25maWcKKysrIGIvc291bmQvcGNpL2hkYS9LY29uZmlnCkBAIC0xNCw2ICsxNCwxOSBAQAogCiBpZiBTTkRfSERBX0lOVEVMCiAKK2NvbmZpZyBTTkRfSERBX1BSRUFMTE9DX1NJWkUKKwlpbnQgIlByZS1hbGxvY2F0ZWQgYnVmZmVyIHNpemUgZm9yIEhELWF1ZGlvIGRyaXZlciIKKwlyYW5nZSAwIDMyNzY4CisJZGVmYXVsdCA2NAorCWhlbHAKKwkgIFNwZWNpZmllcyB0aGUgZGVmYXVsdCBwcmUtYWxsb2NhdGVkIGJ1ZmZlci1zaXplIGluIGtCIGZvciB0aGUKKwkgIEhELWF1ZGlvIGRyaXZlci4gIEEgbGFyZ2VyIGJ1ZmZlciAoZS5nLiAyMDQ4KSBpcyBwcmVmZXJyZWQKKwkgIGZvciBzeXN0ZW1zIHVzaW5nIFB1bHNlQXVkaW8uICBUaGUgZGVmYXVsdCA2NCBpcyBjaG9zZW4ganVzdAorCSAgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KKworCSAgTm90ZSB0aGF0IHRoZSBwcmUtYWxsb2NhdGlvbiBzaXplIGNhbiBiZSBjaGFuZ2VkIGR5bmFtaWNhbGx5CisJICB2aWEgYSBwcm9jIGZpbGUgKC9wcm9jL2Fzb3VuZC9jYXJkKi9wY20qL3N1YiovcHJlYWxsb2MpLCB0b28uCisKIGNvbmZpZyBTTkRfSERBX0hXREVQCiAJYm9vbCAiQnVpbGQgaHdkZXAgaW50ZXJmYWNlIGZvciBIRC1hdWRpbyBkcml2ZXIiCiAJc2VsZWN0IFNORF9IV0RFUApAQCAtODMsNiArOTYsMTkgQEAKIAkgIHNuZC1oZGEtY29kZWMtcmVhbHRlay4KIAkgIFRoaXMgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgbG9hZGVkIGF0IHByb2JpbmcuCiAKK2NvbmZpZyBTTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUworCWJvb2wgIkJ1aWxkIHN0YXRpYyBxdWlya3MgZm9yIFJlYWx0ZWsgY29kZWNzIgorCWRlcGVuZHMgb24gU05EX0hEQV9DT0RFQ19SRUFMVEVLCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBidWlsZCB0aGUgc3RhdGljIHF1aXJrcyBjb2RlcyBmb3IgUmVhbHRlayBjb2RlY3MuCisJICBJZiB5b3UgbmVlZCB0aGUgIm1vZGVsIiBwcmVzZXQgdGhhdCB0aGUgZGVmYXVsdCBCSU9TIGF1dG8tcGFyc2VyCisJICBjYW4ndCBoYW5kbGUsIHR1cm4gdGhpcyBvcHRpb24gb24uCisKKwkgIElmIHlvdXIgZGV2aWNlIHdvcmtzIHdpdGggbW9kZWw9YXV0byBvcHRpb24sIGJhc2ljYWxseSB5b3UgZG9uJ3QKKwkgIG5lZWQgdGhlIHF1aXJrIGNvZGUuICBCeSB0dXJuaW5nIHRoaXMgb2ZmLCB5b3UgY2FuIHJlZHVjZSB0aGUKKwkgIG1vZHVsZSBzaXplIHF1aXRlIGEgbG90LgorCiBjb25maWcgU05EX0hEQV9DT0RFQ19BTkFMT0cKIAlib29sICJCdWlsZCBBbmFsb2cgRGV2aWNlIEhELWF1ZGlvIGNvZGVjIHN1cHBvcnQiCiAJZGVmYXVsdCB5CkBAIC0xNzEsNiArMTk3LDE5IEBACiAJICBzbmQtaGRhLWNvZGVjLWNhMDExMC4KIAkgIFRoaXMgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgbG9hZGVkIGF0IHByb2JpbmcuCiAKK2NvbmZpZyBTTkRfSERBX0NPREVDX0NBMDEzMgorCWJvb2wgIkJ1aWxkIENyZWF0aXZlIENBMDEzMiBjb2RlYyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU05EX0hEQV9JTlRFTAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBDcmVhdGl2ZSBDQTAxMzIgY29kZWMgc3VwcG9ydCBpbgorCSAgc25kLWhkYS1pbnRlbCBkcml2ZXIuCisKKwkgIFdoZW4gdGhlIEhELWF1ZGlvIGRyaXZlciBpcyBidWlsdCBhcyBhIG1vZHVsZSwgdGhlIGNvZGVjCisJICBzdXBwb3J0IGNvZGUgaXMgYWxzbyBidWlsdCBhcyBhbm90aGVyIG1vZHVsZSwKKwkgIHNuZC1oZGEtY29kZWMtY2EwMTMyLgorCSAgVGhpcyBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBsb2FkZWQgYXQgcHJvYmluZy4KKwogY29uZmlnIFNORF9IREFfQ09ERUNfQ01FRElBCiAJYm9vbCAiQnVpbGQgQy1NZWRpYSBIRC1hdWRpbyBjb2RlYyBzdXBwb3J0IgogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZSBiL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKaW5kZXggMTdlZjM2NS4uODczNjVkNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZQorKysgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCkBAIC0xMyw2ICsxMyw3IEBACiBzbmQtaGRhLWNvZGVjLXNpMzA1NC1vYmpzIDo9CXBhdGNoX3NpMzA1NC5vCiBzbmQtaGRhLWNvZGVjLWNpcnJ1cy1vYmpzIDo9CXBhdGNoX2NpcnJ1cy5vCiBzbmQtaGRhLWNvZGVjLWNhMDExMC1vYmpzIDo9CXBhdGNoX2NhMDExMC5vCitzbmQtaGRhLWNvZGVjLWNhMDEzMi1vYmpzIDo9CXBhdGNoX2NhMDEzMi5vCiBzbmQtaGRhLWNvZGVjLWNvbmV4YW50LW9ianMgOj0JcGF0Y2hfY29uZXhhbnQubwogc25kLWhkYS1jb2RlYy12aWEtb2JqcyA6PQlwYXRjaF92aWEubwogc25kLWhkYS1jb2RlYy1oZG1pLW9ianMgOj0JcGF0Y2hfaGRtaS5vIGhkYV9lbGQubwpAQCAtNDIsNiArNDMsOSBAQAogaWZkZWYgQ09ORklHX1NORF9IREFfQ09ERUNfQ0EwMTEwCiBvYmotJChDT05GSUdfU05EX0hEQV9JTlRFTCkgKz0gc25kLWhkYS1jb2RlYy1jYTAxMTAubwogZW5kaWYKK2lmZGVmIENPTkZJR19TTkRfSERBX0NPREVDX0NBMDEzMgorb2JqLSQoQ09ORklHX1NORF9IREFfSU5URUwpICs9IHNuZC1oZGEtY29kZWMtY2EwMTMyLm8KK2VuZGlmCiBpZmRlZiBDT05GSUdfU05EX0hEQV9DT0RFQ19DT05FWEFOVAogb2JqLSQoQ09ORklHX1NORF9IREFfSU5URUwpICs9IHNuZC1oZGEtY29kZWMtY29uZXhhbnQubwogZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjMjYwX3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGMyNjBfcXVpcmtzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlYzJjYgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvYWxjMjYwX3F1aXJrcy5jCkBAIC0wLDAgKzEsMTI3MiBAQAorLyoKKyAqIEFMQzI2MCBxdWlyayBtb2RlbHMKKyAqIGluY2x1ZGVkIGJ5IHBhdGNoX3JlYWx0ZWsuYworICovCisKKy8qIEFMQzI2MCBtb2RlbHMgKi8KK2VudW0geworCUFMQzI2MF9BVVRPLAorCUFMQzI2MF9CQVNJQywKKwlBTEMyNjBfSFAsCisJQUxDMjYwX0hQX0RDNzYwMCwKKwlBTEMyNjBfSFBfMzAxMywKKwlBTEMyNjBfRlVKSVRTVV9TNzAyWCwKKwlBTEMyNjBfQUNFUiwKKwlBTEMyNjBfV0lMTCwKKwlBTEMyNjBfUkVQTEFDRVJfNjcyViwKKwlBTEMyNjBfRkFWT1JJVDEwMCwKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJQUxDMjYwX1RFU1QsCisjZW5kaWYKKwlBTEMyNjBfTU9ERUxfTEFTVCAvKiBsYXN0IHRhZyAqLworfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjBfZGFjX25pZHNbMV0gPSB7CisJLyogZnJvbnQgKi8KKwkweDAyLAorfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjBfYWRjX25pZHNbMV0gPSB7CisJLyogQURDMCAqLworCTB4MDQsCit9OworCitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2MF9hZGNfbmlkc19hbHRbMV0gPSB7CisJLyogQURDMSAqLworCTB4MDUsCit9OworCisvKiBOSURzIHVzZWQgd2hlbiBzaW11bHRhbmVvdXMgYWNjZXNzIHRvIGJvdGggQURDcyBtYWtlcyBzZW5zZS4gIE5vdGUgdGhhdAorICogYWxjMjYwX2NhcHR1cmVfbWl4ZXIgYXNzdW1lcyBBREMwIChuaWQgMHgwNCkgaXMgdGhlIGZpcnN0IEFEQy4KKyAqLworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjBfZHVhbF9hZGNfbmlkc1syXSA9IHsKKwkvKiBBREMwLCBBREMxICovCisJMHgwNCwgMHgwNQorfTsKKworI2RlZmluZSBBTEMyNjBfRElHT1VUX05JRAkweDAzCisjZGVmaW5lIEFMQzI2MF9ESUdJTl9OSUQJMHgwNgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjYwX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA0LAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkZyb250IE1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJCXsgIkNEIiwgMHg0IH0sCisJfSwKK307CisKKy8qIE9uIEZ1aml0c3UgUzcwMnggbGFwdG9wcyBjYXB0dXJlIG9ubHkgbWFrZXMgc2Vuc2UgZnJvbSBNaWMvTGluZUluIGphY2ssCisgKiBoZWFkcGhvbmUgamFjayBhbmQgdGhlIGludGVybmFsIENEIGxpbmVzIHNpbmNlIHRoZXNlIGFyZSB0aGUgb25seSBwaW5zIGF0CisgKiB3aGljaCBhdWRpbyBjYW4gYXBwZWFyLiAgRm9yIGZsZXhpYmlsaXR5LCBhbHNvIGFsbG93IHRoZSBvcHRpb24gb2YKKyAqIHJlY29yZGluZyB0aGUgbWl4ZXIgb3V0cHV0IG9uIHRoZSBzZWNvbmQgQURDIChBREMwIGRvZXNuJ3QgaGF2ZSBhCisgKiBjb25uZWN0aW9uIHRvIHRoZSBtaXhlciBvdXRwdXQpLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjYwX2Z1aml0c3VfY2FwdHVyZV9zb3VyY2VzWzJdID0geworCXsKKwkJLm51bV9pdGVtcyA9IDMsCisJCS5pdGVtcyA9IHsKKwkJCXsgIk1pYy9MaW5lIiwgMHgwIH0sCisJCQl7ICJDRCIsIDB4NCB9LAorCQkJeyAiSGVhZHBob25lIiwgMHgyIH0sCisJCX0sCisJfSwKKwl7CisJCS5udW1faXRlbXMgPSA0LAorCQkuaXRlbXMgPSB7CisJCQl7ICJNaWMvTGluZSIsIDB4MCB9LAorCQkJeyAiQ0QiLCAweDQgfSwKKwkJCXsgIkhlYWRwaG9uZSIsIDB4MiB9LAorCQkJeyAiTWl4ZXIiLCAweDUgfSwKKwkJfSwKKwl9LAorCit9OworCisvKiBBY2VyIFRyYXZlbE1hdGUoL0V4dGVuc2EvQXNwaXJlKSBub3RlYm9va3MgaGF2ZSBzaW1pbGFyIGNvbmZpZ3VyYXRpb24gdG8KKyAqIHRoZSBGdWppdHN1IFM3MDJ4LCBidXQgamFja3MgYXJlIG1hcmtlZCBkaWZmZXJlbnRseS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2MF9hY2VyX2NhcHR1cmVfc291cmNlc1syXSA9IHsKKwl7CisJCS5udW1faXRlbXMgPSA0LAorCQkuaXRlbXMgPSB7CisJCQl7ICJNaWMiLCAweDAgfSwKKwkJCXsgIkxpbmUiLCAweDIgfSwKKwkJCXsgIkNEIiwgMHg0IH0sCisJCQl7ICJIZWFkcGhvbmUiLCAweDUgfSwKKwkJfSwKKwl9LAorCXsKKwkJLm51bV9pdGVtcyA9IDUsCisJCS5pdGVtcyA9IHsKKwkJCXsgIk1pYyIsIDB4MCB9LAorCQkJeyAiTGluZSIsIDB4MiB9LAorCQkJeyAiQ0QiLCAweDQgfSwKKwkJCXsgIkhlYWRwaG9uZSIsIDB4NiB9LAorCQkJeyAiTWl4ZXIiLCAweDUgfSwKKwkJfSwKKwl9LAorfTsKKworLyogTWF4ZGF0YSBGYXZvcml0IDEwMFhTICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjYwX2Zhdm9yaXQxMDBfY2FwdHVyZV9zb3VyY2VzWzJdID0geworCXsKKwkJLm51bV9pdGVtcyA9IDIsCisJCS5pdGVtcyA9IHsKKwkJCXsgIkxpbmUvTWljIiwgMHgwIH0sCisJCQl7ICJDRCIsIDB4NCB9LAorCQl9LAorCX0sCisJeworCQkubnVtX2l0ZW1zID0gMywKKwkJLml0ZW1zID0geworCQkJeyAiTGluZS9NaWMiLCAweDAgfSwKKwkJCXsgIkNEIiwgMHg0IH0sCisJCQl7ICJNaXhlciIsIDB4NSB9LAorCQl9LAorCX0sCit9OworCisvKgorICogVGhpcyBpcyBqdXN0IHBsYWNlLWhvbGRlciwgc28gdGhlcmUncyBzb21ldGhpbmcgZm9yIGFsY19idWlsZF9wY21zIHRvIGxvb2sKKyAqIGF0IHdoZW4gaXQgY2FsY3VsYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMuIEFMQzI2MCBoYXMgbm8gbWl4ZXIKKyAqIGVsZW1lbnQgd2hpY2ggYWxsb3dzIGNoYW5naW5nIHRoZSBjaGFubmVsIG1vZGUsIHNvIHRoZSB2ZXJiIGxpc3QgaXMKKyAqIG5ldmVyIHVzZWQuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGMyNjBfbW9kZXNbMV0gPSB7CisJeyAyLCBOVUxMIH0sCit9OworCisKKy8qIE1peGVyIGNvbWJpbmF0aW9ucworICoKKyAqIGJhc2ljOiBiYXNlX291dHB1dCArIGlucHV0ICsgcGNfYmVlcCArIGNhcHR1cmUKKyAqIEhQOiBiYXNlX291dHB1dCArIGlucHV0ICsgY2FwdHVyZV9hbHQKKyAqIEhQXzMwMTM6IGhwXzMwMTMgKyBpbnB1dCArIGNhcHR1cmUKKyAqIGZ1aml0c3U6IGZ1aml0c3UgKyBjYXB0dXJlCisgKiBhY2VyOiBhY2VyICsgY2FwdHVyZQorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfYmFzZV9vdXRwdXRfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDksIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MDksIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJNb25vIFBsYXliYWNrIFZvbHVtZSIsIDB4MGEsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJNb25vIFBsYXliYWNrIFN3aXRjaCIsIDB4MGEsIDEsIDIsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9pbnB1dF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogdXBkYXRlIEhQLCBsaW5lIGFuZCBtb25vIG91dCBwaW5zIGFjY29yZGluZyB0byB0aGUgbWFzdGVyIHN3aXRjaCAqLworc3RhdGljIHZvaWQgYWxjMjYwX2hwX21hc3Rlcl91cGRhdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdXBkYXRlX3NwZWFrZXJzKGNvZGVjKTsKK30KKworc3RhdGljIGludCBhbGMyNjBfaHBfbWFzdGVyX3N3X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwkqdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWUgPSAhc3BlYy0+bWFzdGVyX211dGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxjMjYwX2hwX21hc3Rlcl9zd19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IHZhbCA9ICEqdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWU7CisKKwlpZiAodmFsID09IHNwZWMtPm1hc3Rlcl9tdXRlKQorCQlyZXR1cm4gMDsKKwlzcGVjLT5tYXN0ZXJfbXV0ZSA9IHZhbDsKKwlhbGMyNjBfaHBfbWFzdGVyX3VwZGF0ZShjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfaHBfb3V0cHV0X21peGVyW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX05JRF9GTEFHIHwgMHgxMSwKKwkJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAorCQkuZ2V0ID0gYWxjMjYwX2hwX21hc3Rlcl9zd19nZXQsCisJCS5wdXQgPSBhbGMyNjBfaHBfbWFzdGVyX3N3X3B1dCwKKwl9LAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwOCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwOSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYSwgMSwgMHgwLAorCQkJICAgICAgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGEsIDEsIDIsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfdW5zb2xfdmVyYnNbXSA9IHsKKwl7MHgxMCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJe30sCit9OworCitzdGF0aWMgdm9pZCBhbGMyNjBfaHBfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDBmOworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxMDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTE7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYwX2hwXzMwMTNfbWl4ZXJbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCAweDExLAorCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCisJCS5nZXQgPSBhbGMyNjBfaHBfbWFzdGVyX3N3X2dldCwKKwkJLnB1dCA9IGFsYzI2MF9ocF9tYXN0ZXJfc3dfcHV0LAorCX0sCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJBdXgtSW4gUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwNiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQXV4LUluIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDYsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBhLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxMSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgdm9pZCBhbGMyNjBfaHBfMzAxM19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDEwOworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxMTsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGMyNjBfZGM3NjAwX2JpbmRfbWFzdGVyX3ZvbCA9IHsKKwkub3BzID0gJnNuZF9oZGFfYmluZF92b2wsCisJLnZhbHVlcyA9IHsKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA4LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA5LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBhLCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJMAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjMjYwX2RjNzYwMF9iaW5kX3N3aXRjaCA9IHsKKwkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTEsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTUsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfaHBfZGM3NjAwX21peGVyW10gPSB7CisJSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2MF9kYzc2MDBfYmluZF9tYXN0ZXJfdm9sKSwKKwlIREFfQklORF9TVygiTGluZU91dCBQbGF5YmFjayBTd2l0Y2giLCAmYWxjMjYwX2RjNzYwMF9iaW5kX3N3aXRjaCksCisJSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MCwgSERBX09VVFBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfMzAxM191bnNvbF92ZXJic1tdID0geworCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwl7fSwKK307CisKK3N0YXRpYyB2b2lkIGFsYzI2MF9ocF8zMDEyX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxMDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MGY7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDExOworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxNTsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Cit9CisKKy8qIEZ1aml0c3UgUzcwMnggc2VyaWVzIGxhcHRvcHMuICBBTEMyNjAgcGluIHVzYWdlOiBNaWMvTGluZSBqYWNrID0gMHgxMiwKKyAqIEhQIGphY2sgPSAweDE0LCBDRCBhdWRpbyA9ICAweDE2LCBpbnRlcm5hbCBzcGVha2VyID0gMHgxMC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9mdWppdHN1X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDIsIEhEQV9JTlBVVCksCisJQUxDX1BJTl9NT0RFKCJIZWFkcGhvbmUgSmFjayBNb2RlIiwgMHgxNCwgQUxDX1BJTl9ESVJfSU5PVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljL0xpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMvTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCisJQUxDX1BJTl9NT0RFKCJNaWMvTGluZSBKYWNrIE1vZGUiLCAweDEyLCBBTENfUElOX0RJUl9JTiksCisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwOSwgMiwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCisvKiBNaXhlciBmb3IgQWNlciBUcmF2ZWxNYXRlKC9FeHRlbnNhL0FzcGlyZSkgbm90ZWJvb2tzLiAgTm90ZSB0aGF0IGN1cnJlbnQKKyAqIHZlcnNpb25zIG9mIHRoZSBBTEMyNjAgZG9uJ3QgYWN0IG9uIHJlcXVlc3RzIHRvIGVuYWJsZSBtaWMgYmlhcyBmcm9tIE5JRAorICogMHgwZiAodXNlZCB0byBkcml2ZSB0aGUgaGVhZHBob25lIGphY2sgaW4gdGhlc2UgbGFwdG9wcykuICBUaGUgQUxDMjYwCisgKiBkYXRhc2hlZXQgZG9lc24ndCBtZW50aW9uIHRoaXMgcmVzdHJpY3Rpb24uICBBdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGNsZWFyCisgKiB3aGV0aGVyIHRoaXMgYmVoYXZpb3VyIGlzIGludGVudGlvbmFsIG9yIGlzIGEgaGFyZHdhcmUgYnVnIGluIGNoaXAKKyAqIHJldmlzaW9ucyBhdmFpbGFibGUgaW4gZWFybHkgMjAwNi4gIFRoZXJlZm9yZSBmb3Igbm93IGFsbG93IHRoZQorICogIkhlYWRwaG9uZSBKYWNrIE1vZGUiIGNvbnRyb2wgdG8gc3BhbiBhbGwgY2hvaWNlcywgYnV0IGlmIGl0IHR1cm5zIG91dAorICogdGhhdCB0aGUgbGFjayBvZiBtaWMgYmlhcyBmb3IgdGhpcyBOSUQgaXMgaW50ZW50aW9uYWwgd2UgY291bGQgY2hhbmdlIHRoZQorICogbW9kZSBmcm9tIEFMQ19QSU5fRElSX0lOT1VUIHRvIEFMQ19QSU5fRElSX0lOT1VUX05PTUlDQklBUy4KKyAqCisgKiBJbiBhZGRpdGlvbiwgQWNlciBUcmF2ZWxNYXRlKC9FeHRlbnNhL0FzcGlyZSkgbm90ZWJvb2tzIGluIGVhcmx5IDIwMDYKKyAqIGRvbid0IGFwcGVhciB0byBtYWtlIHRoZSBtaWMgYmlhcyBhdmFpbGFibGUgZnJvbSB0aGUgImxpbmUiIGphY2ssIGV2ZW4KKyAqIHRob3VnaCB0aGUgTklEIHVzZWQgZm9yIHRoaXMgamFjayAoMHgxNCkgY2FuIHN1cHBseSBpdC4gIFRoZSB0aGVvcnkgaXMKKyAqIHRoYXQgcGVyaGFwcyBBY2VyIGhhdmUgaW5jbHVkZWQgYmxvY2tpbmcgY2FwYWNpdG9ycyBiZXR3ZWVuIHRoZSBBTEMyNjAKKyAqIGFuZCB0aGUgb3V0cHV0IGphY2suICBJZiB0aGlzIHR1cm5zIG91dCB0byBiZSB0aGUgY2FzZSBmb3IgYWxsIHN1Y2gKKyAqIG1vZGVscyB0aGUgIkxpbmUgSmFjayBNb2RlIiBtb2RlIGNvdWxkIGJlIGNoYW5nZWQgZnJvbSBBTENfUElOX0RJUl9JTk9VVAorICogdG8gQUxDX1BJTl9ESVJfSU5PVVRfTk9NSUNCSUFTLgorICoKKyAqIFRoZSBDMjB4IFRhYmxldCBzZXJpZXMgaGF2ZSBhIG1vbm8gaW50ZXJuYWwgc3BlYWtlciB3aGljaCBpcyBjb250cm9sbGVkCisgKiB2aWEgdGhlIGNoaXAncyBNb25vIHN1bSB3aWRnZXQgYW5kIHBpbiBjb21wbGV4LCBzbyBpbmNsdWRlIHRoZSBuZWNlc3NhcnkKKyAqIGNvbnRyb2xzIGZvciBzdWNoIG1vZGVscy4gIE9uIG1vZGVscyB3aXRob3V0IGEgIm1vbm8gc3BlYWtlciIgdGhlIGNvbnRyb2wKKyAqIHdvbid0IGRvIGFueXRoaW5nLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYwX2FjZXJfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwOCwgMiwgSERBX0lOUFVUKSwKKwlBTENfUElOX01PREUoIkhlYWRwaG9uZSBKYWNrIE1vZGUiLCAweDBmLCBBTENfUElOX0RJUl9JTk9VVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGEsIDEsIDB4MCwKKwkJCSAgICAgIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBhLCAxLCAyLAorCQkJICAgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCisJQUxDX1BJTl9NT0RFKCJNaWMgSmFjayBNb2RlIiwgMHgxMiwgQUxDX1BJTl9ESVJfSU4pLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAorCUFMQ19QSU5fTU9ERSgiTGluZSBKYWNrIE1vZGUiLCAweDE0LCBBTENfUElOX0RJUl9JTk9VVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogTWF4ZGF0YSBGYXZvcml0IDEwMFhTOiBvbmUgb3V0cHV0IGFuZCBvbmUgaW5wdXQgKDB4MTIpIGphY2sKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9mYXZvcml0MTAwX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDIsIEhEQV9JTlBVVCksCisJQUxDX1BJTl9NT0RFKCJPdXRwdXQgSmFjayBNb2RlIiwgMHgwZiwgQUxDX1BJTl9ESVJfSU5PVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUvTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZS9NaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUFMQ19QSU5fTU9ERSgiTGluZS9NaWMgSmFjayBNb2RlIiwgMHgxMiwgQUxDX1BJTl9ESVJfSU4pLAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIFBhY2thcmQgYmVsbCBWNzkwMCAgQUxDMjYwIHBpbiB1c2FnZTogSFAgPSAweDBmLCBNaWMgamFjayA9IDB4MTIsCisgKiBMaW5lIEluIGphY2sgPSAweDE0LCBDRCBhdWRpbyA9ICAweDE2LCBwYyBiZWVwID0gMHgxNy4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF93aWxsX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDB4MiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUFMQ19QSU5fTU9ERSgiTWljIEphY2sgTW9kZSIsIDB4MTIsIEFMQ19QSU5fRElSX0lOKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwMiwgSERBX0lOUFVUKSwKKwlBTENfUElOX01PREUoIkxpbmUgSmFjayBNb2RlIiwgMHgxNCwgQUxDX1BJTl9ESVJfSU5PVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogUmVwbGFjZXIgNjcyViBBTEMyNjAgcGluIHVzYWdlOiBNaWMgamFjayA9IDB4MTIsCisgKiBMaW5lIEluIGphY2sgPSAweDE0LCBBVEFQSSBNaWMgPSAweDEzLCBzcGVha2VyID0gMHgwZi4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9yZXBsYWNlcl82NzJ2X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDB4MiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUFMQ19QSU5fTU9ERSgiTWljIEphY2sgTW9kZSIsIDB4MTIsIEFMQ19QSU5fRElSX0lOKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJBVEFQSSBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJBVEFUSSBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAorCUFMQ19QSU5fTU9ERSgiTGluZSBKYWNrIE1vZGUiLCAweDE0LCBBTENfUElOX0RJUl9JTk9VVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIGluaXRpYWxpemF0aW9uIHZlcmJzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYwX2luaXRfdmVyYnNbXSA9IHsKKwkvKiBMaW5lIEluIHBpbiB3aWRnZXQgZm9yIGlucHV0ICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJLyogTWljMSAocmVhciBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJLyogTWljMiAoZnJvbnQgcGFuZWwpIHBpbiB3aWRnZXQgZm9yIGlucHV0IGFuZCB2cmVmIGF0IDgwJSAqLworCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCS8qIExJTkUtMiBpcyB1c2VkIGZvciBsaW5lLW91dCBpbiByZWFyICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJLyogc2VsZWN0IGxpbmUtb3V0ICovCisJezB4MGUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBMSU5FLU9VVCBwaW4gKi8KKwl7MHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwkvKiBlbmFibGUgSFAgKi8KKwl7MHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCS8qIGVuYWJsZSBNb25vICovCisJezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJLyogbXV0ZSBjYXB0dXJlIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwkvKiBzZXQgY29ubmVjdGlvbiBzZWxlY3QgdG8gbGluZSBpbiAoZGVmYXVsdCBzZWxlY3QgZm9yIHRoaXMgQURDKSAqLworCXsweDA0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisJLyogbXV0ZSBjYXB0dXJlIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwkvKiBzZXQgY29ubmVjdGlvbiBzZWxlY3QgdG8gbGluZSBpbiAoZGVmYXVsdCBzZWxlY3QgZm9yIHRoaXMgQURDKSAqLworCXsweDA1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisJLyogc2V0IHZvbD0wIExpbmUtT3V0IG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCS8qIHVubXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIHNldCB2b2w9MCBIUCBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwkvKiB1bm11dGUgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIGdhaW4gb24gdGhpcyBhbXApICovCisJezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwkvKiBzZXQgdm9sPTAgTW9ubyBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwkvKiB1bm11dGUgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIGdhaW4gb24gdGhpcyBhbXApICovCisJezB4MTEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwkvKiB1bm11dGUgTElORS0yIG91dCBwaW4gKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIEFtcCBJbmRleGVzOiBDRCA9IDB4MDQsIExpbmUgSW4gMSA9IDB4MDIsIE1pYyAxID0gMHgwMCAmCisJICogTGluZSBJbiAyID0gMHgwMworCSAqLworCS8qIG11dGUgYW5hbG9nIGlucHV0cyAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKwkvKiBBbXAgSW5kZXhlczogREFDID0gMHgwMSAmIG1peGVyID0gMHgwMCAqLworCS8qIG11dGUgRnJvbnQgb3V0IHBhdGggKi8KKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJLyogbXV0ZSBIZWFkcGhvbmUgb3V0IHBhdGggKi8KKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJLyogbXV0ZSBNb25vIG91dCBwYXRoICovCisJezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsgfQorfTsKKworI2lmIDAgLyogc2hvdWxkIGJlIGlkZW50aWNhbCB3aXRoIGFsYzI2MF9pbml0X3ZlcmJzPyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfaW5pdF92ZXJic1tdID0geworCS8qIEhlYWRwaG9uZSBhbmQgb3V0cHV0ICovCisJezB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMH0sCisJLyogbW9ubyBvdXRwdXQgKi8KKwl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKKwkvKiBNaWMxIChyZWFyIHBhbmVsKSBwaW4gd2lkZ2V0IGZvciBpbnB1dCBhbmQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKKwkvKiBNaWMyIChmcm9udCBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCisJezB4MTMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCisJLyogTGluZSBJbiBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAorCS8qIExpbmUtMiBwaW4gd2lkZ2V0IGZvciBvdXRwdXQgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKKwkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAorCS8qIHVubXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwfSwKKwkvKiBzZXQgY29ubmVjdGlvbiBzZWxlY3QgdG8gbGluZSBpbiAoZGVmYXVsdCBzZWxlY3QgZm9yIHRoaXMgQURDKSAqLworCXsweDA0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisJLyogdW5tdXRlIExpbmUtT3V0IG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAorCS8qIHVubXV0ZSBIUCBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCisJLyogbXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KKwl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKKwkvKiBBbXAgSW5kZXhlczogQ0QgPSAweDA0LCBMaW5lIEluIDEgPSAweDAyLCBNaWMgMSA9IDB4MDAgJgorCSAqIExpbmUgSW4gMiA9IDB4MDMKKwkgKi8KKwkvKiBtdXRlIGFuYWxvZyBpbnB1dHMgKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAorCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCisJLyogQW1wIEluZGV4ZXM6IERBQyA9IDB4MDEgJiBtaXhlciA9IDB4MDAgKi8KKwkvKiBVbm11dGUgRnJvbnQgb3V0IHBhdGggKi8KKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCS8qIFVubXV0ZSBIZWFkcGhvbmUgb3V0IHBhdGggKi8KKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCS8qIFVubXV0ZSBNb25vIG91dCBwYXRoICovCisJezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwl7IH0KK307CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfMzAxM19pbml0X3ZlcmJzW10gPSB7CisJLyogTGluZSBvdXQgYW5kIG91dHB1dCAqLworCXsweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorCS8qIG1vbm8gb3V0cHV0ICovCisJezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCisJLyogTWljMSAocmVhciBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCisJLyogTWljMiAoZnJvbnQgcGFuZWwpIHBpbiB3aWRnZXQgZm9yIGlucHV0IGFuZCB2cmVmIGF0IDgwJSAqLworCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAorCS8qIExpbmUgSW4gcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKKwkvKiBIZWFkcGhvbmUgcGluIHdpZGdldCBmb3Igb3V0cHV0ICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMH0sCisJLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKKwkvKiB1bm11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMH0sCisJLyogc2V0IGNvbm5lY3Rpb24gc2VsZWN0IHRvIGxpbmUgaW4gKGRlZmF1bHQgc2VsZWN0IGZvciB0aGlzIEFEQykgKi8KKwl7MHgwNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAorCS8qIHVubXV0ZSBMaW5lLU91dCBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCisJLyogbXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKKwkvKiB1bm11dGUgSFAgbWl4ZXIgYW1wIGxlZnQgYW5kIHJpZ2h0ICh2b2x1bWUgPSAwKSAqLworCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAorCS8qIG11dGUgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIGdhaW4gb24gdGhpcyBhbXApICovCisJezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCisJLyogQW1wIEluZGV4ZXM6IENEID0gMHgwNCwgTGluZSBJbiAxID0gMHgwMiwgTWljIDEgPSAweDAwICYKKwkgKiBMaW5lIEluIDIgPSAweDAzCisJICovCisJLyogbXV0ZSBhbmFsb2cgaW5wdXRzICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAorCS8qIEFtcCBJbmRleGVzOiBEQUMgPSAweDAxICYgbWl4ZXIgPSAweDAwICovCisJLyogVW5tdXRlIEZyb250IG91dCBwYXRoICovCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwkvKiBVbm11dGUgSGVhZHBob25lIG91dCBwYXRoICovCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwkvKiBVbm11dGUgTW9ubyBvdXQgcGF0aCAqLworCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisJeyB9Cit9OworCisvKiBJbml0aWFsaXNhdGlvbiBzZXF1ZW5jZSBmb3IgQUxDMjYwIGFzIGNvbmZpZ3VyZWQgaW4gRnVqaXRzdSBTNzAyeAorICogbGFwdG9wcy4gIEFMQzI2MCBwaW4gdXNhZ2U6IE1pYy9MaW5lIGphY2sgPSAweDEyLCBIUCBqYWNrID0gMHgxNCwgQ0QKKyAqIGF1ZGlvID0gMHgxNiwgaW50ZXJuYWwgc3BlYWtlciA9IDB4MTAuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYwX2Z1aml0c3VfaW5pdF92ZXJic1tdID0geworCS8qIERpc2FibGUgYWxsIEdQSU9zICovCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMH0sCisJLyogSW50ZXJuYWwgc3BlYWtlciBpcyBjb25uZWN0ZWQgdG8gaGVhZHBob25lIHBpbiAqLworCXsweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJLyogSGVhZHBob25lL0xpbmUtb3V0IGphY2sgY29ubmVjdHMgdG8gTGluZTEgcGluOyBtYWtlIGl0IGFuIG91dHB1dCAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCS8qIE1pYy9MaW5lLWluIGphY2sgaXMgY29ubmVjdGVkIHRvIG1pYzEgcGluLCBzbyBtYWtlIGl0IGFuIGlucHV0ICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwkvKiBFbnN1cmUgYWxsIG90aGVyIHVudXNlZCBwaW5zIGFyZSBkaXNhYmxlZCBhbmQgbXV0ZWQuICovCisJezB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKKwl7MHgxMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAorCXsweDEzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKworCS8qIERpc2FibGUgZGlnaXRhbCAoU1BESUYpIHBpbnMgKi8KKwl7MHgwMywgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIDB9LAorCXsweDA2LCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwgMH0sCisKKwkvKiBFbnN1cmUgTGluZTEgcGluIHdpZGdldCB0YWtlcyBpdHMgaW5wdXQgZnJvbSB0aGUgT1VUMSBzdW0gYnVzCisJICogd2hlbiBhY3RpbmcgYXMgYW4gb3V0cHV0LgorCSAqLworCXsweDBkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCisKKwkvKiBTdGFydCB3aXRoIG91dHB1dCBzdW0gd2lkZ2V0cyBtdXRlZCBhbmQgdGhlaXIgb3V0cHV0IGdhaW5zIGF0IG1pbiAqLworCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCisJLyogVW5tdXRlIEhQIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBlcXVpdiBtaXhlciBjdHJsKSAqLworCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogVW5tdXRlIExpbmUxIHBpbiB3aWRnZXQgb3V0cHV0IGJ1ZmZlciBzaW5jZSBpdCBzdGFydHMgYXMgYW4gb3V0cHV0LgorCSAqIElmIHRoZSBwaW4gbW9kZSBpcyBjaGFuZ2VkIGJ5IHRoZSB1c2VyIHRoZSBwaW4gbW9kZSBjb250cm9sIHdpbGwKKwkgKiB0YWtlIGNhcmUgb2YgZW5hYmxpbmcgdGhlIHBpbidzIGlucHV0L291dHB1dCBidWZmZXJzIGFzIG5lZWRlZC4KKwkgKiBUaGVyZWZvcmUgdGhlcmUncyBubyBuZWVkIHRvIGVuYWJsZSB0aGUgaW5wdXQgYnVmZmVyIGF0IHRoaXMKKwkgKiBzdGFnZS4KKwkgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIFVubXV0ZSBpbnB1dCBidWZmZXIgb2YgcGluIHdpZGdldCB1c2VkIGZvciBMaW5lLWluIChubyBlcXVpdgorCSAqIG1peGVyIGN0cmwpCisJICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCisJLyogTXV0ZSBjYXB0dXJlIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJLyogU2V0IEFEQyBjb25uZWN0aW9uIHNlbGVjdCB0byBtYXRjaCBkZWZhdWx0IG1peGVyIHNldHRpbmcgLSBsaW5lCisJICogaW4gKG9uIG1pYzEgcGluKQorCSAqLworCXsweDA0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwkvKiBEbyB0aGUgc2FtZSBmb3IgdGhlIHNlY29uZCBBREM6IG11dGUgY2FwdHVyZSBpbnB1dCBhbXAgYW5kCisJICogc2V0IEFEQyBjb25uZWN0aW9uIHRvIGxpbmUgaW4gKG9uIG1pYzEgcGluKQorCSAqLworCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCS8qIE11dGUgYWxsIGlucHV0cyB0byBtaXhlciB3aWRnZXQgKGV2ZW4gdW5jb25uZWN0ZWQgb25lcykgKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LCAvKiBtaWMxIHBpbiAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sIC8qIG1pYzIgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwgLyogbGluZTEgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwgLyogbGluZTIgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwgLyogQ0QgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwgLyogQmVlcC1nZW4gcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDYpfSwgLyogTGluZS1vdXQgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDcpfSwgLyogSFAtcGluIHBpbiAqLworCisJeyB9Cit9OworCisvKiBJbml0aWFsaXNhdGlvbiBzZXF1ZW5jZSBmb3IgQUxDMjYwIGFzIGNvbmZpZ3VyZWQgaW4gQWNlciBUcmF2ZWxNYXRlIGFuZAorICogc2ltaWxhciBsYXB0b3BzIChhZGFwdGVkIGZyb20gRnVqaXRzdSBpbml0IHZlcmJzKS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfYWNlcl9pbml0X3ZlcmJzW10gPSB7CisJLyogT24gVHJhdmVsTWF0ZSBsYXB0b3BzLCBHUElPIDAgZW5hYmxlcyB0aGUgaW50ZXJuYWwgc3BlYWtlciBhbmQKKwkgKiB0aGUgaGVhZHBob25lIGphY2suICBUdXJuIHRoaXMgb24gYW5kIHJlbHkgb24gdGhlIHN0YW5kYXJkIG11dGUKKwkgKiBtZXRob2RzIHdoZW5ldmVyIHRoZSB1c2VyIHdhbnRzIHRvIHR1cm4gdGhlc2Ugb3V0cHV0cyBvZmYuCisJICovCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwMX0sCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDAxfSwKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAweDAxfSwKKwkvKiBJbnRlcm5hbCBzcGVha2VyL0hlYWRwaG9uZSBqYWNrIGlzIGNvbm5lY3RlZCB0byBMaW5lLW91dCBwaW4gKi8KKwl7MHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCS8qIEludGVybmFsIG1pY3JvcGhvbmUvTWljIGphY2sgaXMgY29ubmVjdGVkIHRvIE1pYzEgcGluICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCisJLyogTGluZSBJbiBqYWNrIGlzIGNvbm5lY3RlZCB0byBMaW5lMSBwaW4gKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCS8qIFNvbWUgQWNlcnMgKGVnOiBDMjB4IFRhYmxldHMpIHVzZSBNb25vIHBpbiBmb3IgaW50ZXJuYWwgc3BlYWtlciAqLworCXsweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJLyogRW5zdXJlIGFsbCBvdGhlciB1bnVzZWQgcGlucyBhcmUgZGlzYWJsZWQgYW5kIG11dGVkLiAqLworCXsweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAorCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MTMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCisJezB4MTMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCS8qIERpc2FibGUgZGlnaXRhbCAoU1BESUYpIHBpbnMgKi8KKwl7MHgwMywgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIDB9LAorCXsweDA2LCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwgMH0sCisKKwkvKiBFbnN1cmUgTWljMSBhbmQgTGluZTEgcGluIHdpZGdldHMgdGFrZSBpbnB1dCBmcm9tIHRoZSBPVVQxIHN1bQorCSAqIGJ1cyB3aGVuIGFjdGluZyBhcyBvdXRwdXRzLgorCSAqLworCXsweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKKworCS8qIFN0YXJ0IHdpdGggb3V0cHV0IHN1bSB3aWRnZXRzIG11dGVkIGFuZCB0aGVpciBvdXRwdXQgZ2FpbnMgYXQgbWluICovCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisKKwkvKiBVbm11dGUgTGluZS1vdXQgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQKKwkgKiAobm8gZXF1aXYgbWl4ZXIgY3RybCkKKwkgKi8KKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIFVubXV0ZSBtb25vIHBpbiB3aWRnZXQgYW1wIG91dHB1dCAobm8gZXF1aXYgbWl4ZXIgY3RybCkgKi8KKwl7MHgxMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIFVubXV0ZSBNaWMxIGFuZCBMaW5lMSBwaW4gd2lkZ2V0IGlucHV0IGJ1ZmZlcnMgc2luY2UgdGhleSBzdGFydCBhcworCSAqIGlucHV0cy4gSWYgdGhlIHBpbiBtb2RlIGlzIGNoYW5nZWQgYnkgdGhlIHVzZXIgdGhlIHBpbiBtb2RlIGNvbnRyb2wKKwkgKiB3aWxsIHRha2UgY2FyZSBvZiBlbmFibGluZyB0aGUgcGluJ3MgaW5wdXQvb3V0cHV0IGJ1ZmZlcnMgYXMgbmVlZGVkLgorCSAqIFRoZXJlZm9yZSB0aGVyZSdzIG5vIG5lZWQgdG8gZW5hYmxlIHRoZSBpbnB1dCBidWZmZXIgYXQgdGhpcworCSAqIHN0YWdlLgorCSAqLworCXsweDEyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisKKwkvKiBNdXRlIGNhcHR1cmUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwkvKiBTZXQgQURDIGNvbm5lY3Rpb24gc2VsZWN0IHRvIG1hdGNoIGRlZmF1bHQgbWl4ZXIgc2V0dGluZyAtIG1pYworCSAqIChvbiBtaWMxIHBpbikKKwkgKi8KKwl7MHgwNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJLyogRG8gc2ltaWxhciB3aXRoIHRoZSBzZWNvbmQgQURDOiBtdXRlIGNhcHR1cmUgaW5wdXQgYW1wIGFuZAorCSAqIHNldCBBREMgY29ubmVjdGlvbiB0byBtaWMgdG8gbWF0Y2ggQUxTQSdzIGRlZmF1bHQgc3RhdGUuCisJICovCisJezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJLyogTXV0ZSBhbGwgaW5wdXRzIHRvIG1peGVyIHdpZGdldCAoZXZlbiB1bmNvbm5lY3RlZCBvbmVzKSAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sIC8qIG1pYzEgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwgLyogbWljMiBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LCAvKiBsaW5lMSBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LCAvKiBsaW5lMiBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LCAvKiBDRCBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNSl9LCAvKiBCZWVwLWdlbiBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNil9LCAvKiBMaW5lLW91dCBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNyl9LCAvKiBIUC1waW4gcGluICovCisKKwl7IH0KK307CisKKy8qIEluaXRpYWxpc2F0aW9uIHNlcXVlbmNlIGZvciBNYXhkYXRhIEZhdm9yaXQgMTAwWFMKKyAqIChhZGFwdGVkIGZyb20gQWNlciBpbml0IHZlcmJzKS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfZmF2b3JpdDEwMF9pbml0X3ZlcmJzW10gPSB7CisJLyogR1BJTyAwIGVuYWJsZXMgdGhlIG91dHB1dCBqYWNrLgorCSAqIFR1cm4gdGhpcyBvbiBhbmQgcmVseSBvbiB0aGUgc3RhbmRhcmQgbXV0ZQorCSAqIG1ldGhvZHMgd2hlbmV2ZXIgdGhlIHVzZXIgd2FudHMgdG8gdHVybiB0aGVzZSBvdXRwdXRzIG9mZi4KKwkgKi8KKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19NQVNLLCAweDAxfSwKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDF9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDF9LAorCS8qIExpbmUvTWljIGlucHV0IGphY2sgaXMgY29ubmVjdGVkIHRvIE1pYzEgcGluICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCisJLyogRW5zdXJlIGFsbCBvdGhlciB1bnVzZWQgcGlucyBhcmUgZGlzYWJsZWQgYW5kIG11dGVkLiAqLworCXsweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAorCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCisJezB4MTEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKKwl7MHgxMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwkvKiBEaXNhYmxlIGRpZ2l0YWwgKFNQRElGKSBwaW5zICovCisJezB4MDMsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCAwfSwKKwl7MHgwNiwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIDB9LAorCisJLyogRW5zdXJlIE1pYzEgYW5kIExpbmUxIHBpbiB3aWRnZXRzIHRha2UgaW5wdXQgZnJvbSB0aGUgT1VUMSBzdW0KKwkgKiBidXMgd2hlbiBhY3RpbmcgYXMgb3V0cHV0cy4KKwkgKi8KKwl7MHgwYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCisKKwkvKiBTdGFydCB3aXRoIG91dHB1dCBzdW0gd2lkZ2V0cyBtdXRlZCBhbmQgdGhlaXIgb3V0cHV0IGdhaW5zIGF0IG1pbiAqLworCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCisJLyogVW5tdXRlIExpbmUtb3V0IHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0CisJICogKG5vIGVxdWl2IG1peGVyIGN0cmwpCisJICovCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwkvKiBVbm11dGUgTWljMSBhbmQgTGluZTEgcGluIHdpZGdldCBpbnB1dCBidWZmZXJzIHNpbmNlIHRoZXkgc3RhcnQgYXMKKwkgKiBpbnB1dHMuIElmIHRoZSBwaW4gbW9kZSBpcyBjaGFuZ2VkIGJ5IHRoZSB1c2VyIHRoZSBwaW4gbW9kZSBjb250cm9sCisJICogd2lsbCB0YWtlIGNhcmUgb2YgZW5hYmxpbmcgdGhlIHBpbidzIGlucHV0L291dHB1dCBidWZmZXJzIGFzIG5lZWRlZC4KKwkgKiBUaGVyZWZvcmUgdGhlcmUncyBubyBuZWVkIHRvIGVuYWJsZSB0aGUgaW5wdXQgYnVmZmVyIGF0IHRoaXMKKwkgKiBzdGFnZS4KKwkgKi8KKwl7MHgxMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisKKwkvKiBNdXRlIGNhcHR1cmUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwkvKiBTZXQgQURDIGNvbm5lY3Rpb24gc2VsZWN0IHRvIG1hdGNoIGRlZmF1bHQgbWl4ZXIgc2V0dGluZyAtIG1pYworCSAqIChvbiBtaWMxIHBpbikKKwkgKi8KKwl7MHgwNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJLyogRG8gc2ltaWxhciB3aXRoIHRoZSBzZWNvbmQgQURDOiBtdXRlIGNhcHR1cmUgaW5wdXQgYW1wIGFuZAorCSAqIHNldCBBREMgY29ubmVjdGlvbiB0byBtaWMgdG8gbWF0Y2ggQUxTQSdzIGRlZmF1bHQgc3RhdGUuCisJICovCisJezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJLyogTXV0ZSBhbGwgaW5wdXRzIHRvIG1peGVyIHdpZGdldCAoZXZlbiB1bmNvbm5lY3RlZCBvbmVzKSAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sIC8qIG1pYzEgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwgLyogbWljMiBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LCAvKiBsaW5lMSBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LCAvKiBsaW5lMiBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LCAvKiBDRCBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNSl9LCAvKiBCZWVwLWdlbiBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNil9LCAvKiBMaW5lLW91dCBwaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNyl9LCAvKiBIUC1waW4gcGluICovCisKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYwX3dpbGxfdmVyYnNbXSA9IHsKKwl7MHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDB4MDJ9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDA3fSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDMwNDB9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9yZXBsYWNlcl82NzJ2X3ZlcmJzW10gPSB7CisJezB4MGYsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAweDAyfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwN30sCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHgzMDUwfSwKKworCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MDF9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgMHgwMX0sCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMH0sCisKKwl7MHgwZiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJe30KK307CisKKy8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzI2MF9yZXBsYWNlcl82NzJ2X2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworICAgICAgICB1bnNpZ25lZCBpbnQgcHJlc2VudDsKKworCS8qIHNwZWFrZXIgLS0+IEdQSU8gRGF0YSAwLCBocCBvciBzcGRpZiAtLT4gR1BJTyBkYXRhIDEgKi8KKwlwcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgwZik7CisJaWYgKHByZXNlbnQpIHsKKwkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgMHgwMSwgMCwKKwkJCQkJICBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDEpOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCAweDBmLCAwLAorCQkJCQkgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCQkJICBQSU5fSFApOworCX0gZWxzZSB7CisJCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIDB4MDEsIDAsCisJCQkJCSAgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAwKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgMHgwZiwgMCwKKwkJCQkJICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkJCSAgUElOX09VVCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbGMyNjBfcmVwbGFjZXJfNjcydl91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByZXMpCit7CisgICAgICAgIGlmICgocmVzID4+IDI2KSA9PSBBTENfSFBfRVZFTlQpCisgICAgICAgICAgICAgICAgYWxjMjYwX3JlcGxhY2VyXzY3MnZfYXV0b211dGUoY29kZWMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9ocF9kYzc2MDBfdmVyYnNbXSA9IHsKKwl7MHgwNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxMCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJezB4MTEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwl7fQorfTsKKworLyogVGVzdCBjb25maWd1cmF0aW9uIGZvciBkZWJ1Z2dpbmcsIG1vZGVsbGVkIGFmdGVyIHRoZSBBTEM4ODAgdGVzdAorICogY29uZmlndXJhdGlvbi4KKyAqLworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjYwX3Rlc3RfZGFjX25pZHNbMV0gPSB7CisJMHgwMiwKK307CitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2MF90ZXN0X2FkY19uaWRzWzJdID0geworCTB4MDQsIDB4MDUsCit9OworLyogRm9yIHRlc3RpbmcgdGhlIEFMQzI2MCwgZWFjaCBpbnB1dCBNVVggbmVlZHMgaXRzIG93biBkZWZpbml0aW9uIHNpbmNlCisgKiB0aGUgc2lnbmFsIGFzc2lnbm1lbnRzIGFyZSBkaWZmZXJlbnQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgZmlyc3QgQURDCisgKiBpcyBOSUQgMHgwNC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2MF90ZXN0X2NhcHR1cmVfc291cmNlc1syXSA9IHsKKwl7CisJCS5udW1faXRlbXMgPSA3LAorCQkuaXRlbXMgPSB7CisJCQl7ICJNSUMxIHBpbiIsIDB4MCB9LAorCQkJeyAiTUlDMiBwaW4iLCAweDEgfSwKKwkJCXsgIkxJTkUxIHBpbiIsIDB4MiB9LAorCQkJeyAiTElORTIgcGluIiwgMHgzIH0sCisJCQl7ICJDRCBwaW4iLCAweDQgfSwKKwkJCXsgIkxJTkUtT1VUIHBpbiIsIDB4NSB9LAorCQkJeyAiSFAtT1VUIHBpbiIsIDB4NiB9LAorCQl9LAorICAgICAgICB9LAorCXsKKwkJLm51bV9pdGVtcyA9IDgsCisJCS5pdGVtcyA9IHsKKwkJCXsgIk1JQzEgcGluIiwgMHgwIH0sCisJCQl7ICJNSUMyIHBpbiIsIDB4MSB9LAorCQkJeyAiTElORTEgcGluIiwgMHgyIH0sCisJCQl7ICJMSU5FMiBwaW4iLCAweDMgfSwKKwkJCXsgIkNEIHBpbiIsIDB4NCB9LAorCQkJeyAiTWl4ZXIiLCAweDUgfSwKKwkJCXsgIkxJTkUtT1VUIHBpbiIsIDB4NiB9LAorCQkJeyAiSFAtT1VUIHBpbiIsIDB4NyB9LAorCQl9LAorICAgICAgICB9LAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfdGVzdF9taXhlcltdID0geworCS8qIE91dHB1dCBkcml2ZXIgd2lkZ2V0cyAqLworCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTW9ubyBQbGF5YmFjayBWb2x1bWUiLCAweDBhLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAweDBhLCAxLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxPVVQyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDksIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiTE9VVDIgUGxheWJhY2sgU3dpdGNoIiwgMHgwOSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMT1VUMSBQbGF5YmFjayBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkxPVVQxIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDIsIEhEQV9JTlBVVCksCisKKwkvKiBNb2RlcyBmb3IgcmV0YXNraW5nIHBpbiB3aWRnZXRzCisJICogTm90ZTogdGhlIEFMQzI2MCBkb2Vzbid0IHNlZW0gdG8gYWN0IG9uIHJlcXVlc3RzIHRvIGVuYWJsZSBtaWMKKyAgICAgICAgICogYmlhcyBmcm9tIE5JRHMgMHgwZiBhbmQgMHgxMC4gIFRoZSBBTEMyNjAgZGF0YXNoZWV0IGRvZXNuJ3QKKyAgICAgICAgICogbWVudGlvbiB0aGlzIHJlc3RyaWN0aW9uLiAgQXQgdGhpcyBzdGFnZSBpdCdzIG5vdCBjbGVhciB3aGV0aGVyCisgICAgICAgICAqIHRoaXMgYmVoYXZpb3VyIGlzIGludGVudGlvbmFsIG9yIGlzIGEgaGFyZHdhcmUgYnVnIGluIGNoaXAKKyAgICAgICAgICogcmV2aXNpb25zIGF2YWlsYWJsZSBhdCBsZWFzdCB1cCB1bnRpbCBlYXJseSAyMDA2LiAgVGhlcmVmb3JlIGZvcgorICAgICAgICAgKiBub3cgYWxsb3cgdGhlICJIUC1PVVQiIGFuZCAiTElORS1PVVQiIE1vZGUgY29udHJvbHMgdG8gc3BhbiBhbGwKKyAgICAgICAgICogY2hvaWNlcywgYnV0IGlmIGl0IHR1cm5zIG91dCB0aGF0IHRoZSBsYWNrIG9mIG1pYyBiaWFzIGZvciB0aGVzZQorICAgICAgICAgKiBOSURzIGlzIGludGVudGlvbmFsIHdlIGNvdWxkIGNoYW5nZSB0aGVpciBtb2RlcyBmcm9tCisgICAgICAgICAqIEFMQ19QSU5fRElSX0lOT1VUIHRvIEFMQ19QSU5fRElSX0lOT1VUX05PTUlDQklBUy4KKwkgKi8KKwlBTENfUElOX01PREUoIkhQLU9VVCBwaW4gbW9kZSIsIDB4MTAsIEFMQ19QSU5fRElSX0lOT1VUKSwKKwlBTENfUElOX01PREUoIkxJTkUtT1VUIHBpbiBtb2RlIiwgMHgwZiwgQUxDX1BJTl9ESVJfSU5PVVQpLAorCUFMQ19QSU5fTU9ERSgiTElORTIgcGluIG1vZGUiLCAweDE1LCBBTENfUElOX0RJUl9JTk9VVCksCisJQUxDX1BJTl9NT0RFKCJMSU5FMSBwaW4gbW9kZSIsIDB4MTQsIEFMQ19QSU5fRElSX0lOT1VUKSwKKwlBTENfUElOX01PREUoIk1JQzIgcGluIG1vZGUiLCAweDEzLCBBTENfUElOX0RJUl9JTk9VVCksCisJQUxDX1BJTl9NT0RFKCJNSUMxIHBpbiBtb2RlIiwgMHgxMiwgQUxDX1BJTl9ESVJfSU5PVVQpLAorCisJLyogTG9vcGJhY2sgbWl4ZXIgY29udHJvbHMgKi8KKwlIREFfQ09ERUNfVk9MVU1FKCJNSUMxIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1JQzEgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNSUMyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1JQzIgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMSU5FMSBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMSU5FMSBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxJTkUyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxJTkUyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMSU5FLU9VVCBsb29wYmFjayBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDA2LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMSU5FLU9VVCBsb29wYmFjayBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDA2LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhQLU9VVCBsb29wYmFjayBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDcsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhQLU9VVCBsb29wYmFjayBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDcsIEhEQV9JTlBVVCksCisKKwkvKiBDb250cm9scyBmb3IgR1BJTyBwaW5zLCBhc3N1bWluZyB0aGV5IGFyZSBjb25maWd1cmVkIGFzIG91dHB1dHMgKi8KKwlBTENfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMCIsIDB4MDEsIDB4MDEpLAorCUFMQ19HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAxIiwgMHgwMSwgMHgwMiksCisJQUxDX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDIiLCAweDAxLCAweDA0KSwKKwlBTENfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMyIsIDB4MDEsIDB4MDgpLAorCisJLyogU3dpdGNoZXMgdG8gYWxsb3cgdGhlIGRpZ2l0YWwgSU8gcGlucyB0byBiZSBlbmFibGVkLiAgVGhlIGRhdGFzaGVldAorCSAqIGlzIGFtYmlnaW91cyBhcyB0byB3aGljaCBOSUQgaXMgd2hpY2g7IHRlc3Rpbmcgb24gbGFwdG9wcyB3aGljaAorCSAqIG1ha2UgdGhpcyBvdXRwdXQgYXZhaWxhYmxlIHNob3VsZCBwcm92aWRlIGNsYXJpZmljYXRpb24uCisJICovCisJQUxDX1NQRElGX0NUUkxfU1dJVENIKCJTUERJRiBQbGF5YmFjayBTd2l0Y2giLCAweDAzLCAweDAxKSwKKwlBTENfU1BESUZfQ1RSTF9TV0lUQ0goIlNQRElGIENhcHR1cmUgU3dpdGNoIiwgMHgwNiwgMHgwMSksCisKKwkvKiBBIHN3aXRjaCBhbGxvd2luZyBFQVBEIHRvIGJlIGVuYWJsZWQuICBTb21lIGxhcHRvcHMgc2VlbSB0byB1c2UKKwkgKiB0aGlzIG91dHB1dCB0byB0dXJuIG9uIGFuIGV4dGVybmFsIGFtcGxpZmllci4KKwkgKi8KKwlBTENfRUFQRF9DVFJMX1NXSVRDSCgiTElORS1PVVQgRUFQRCBFbmFibGUgU3dpdGNoIiwgMHgwZiwgMHgwMiksCisJQUxDX0VBUERfQ1RSTF9TV0lUQ0goIkhQLU9VVCBFQVBEIEVuYWJsZSBTd2l0Y2giLCAweDEwLCAweDAyKSwKKworCXsgfSAvKiBlbmQgKi8KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF90ZXN0X2luaXRfdmVyYnNbXSA9IHsKKwkvKiBFbmFibGUgYWxsIEdQSU9zIGFzIG91dHB1dHMgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIDAgKi8KKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MGZ9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDB9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MGZ9LAorCisJLyogRW5hYmxlIHJldGFza2luZyBwaW5zIGFzIG91dHB1dCwgaW5pdGlhbGx5IHdpdGhvdXQgcG93ZXIgYW1wICovCisJezB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisKKwkvKiBEaXNhYmxlIGRpZ2l0YWwgKFNQRElGKSBwaW5zIGluaXRpYWxseSwgYnV0IHVzZXJzIGNhbiBlbmFibGUKKwkgKiB0aGVtIHZpYSBhIG1peGVyIHN3aXRjaC4gIEluIHRoZSBjYXNlIG9mIFNQRElGLW91dCwgdGhpcyBpbml0dmVyYgorCSAqIHBheWxvYWQgYWxzbyBzZXRzIHRoZSBnZW5lcmF0aW9uIHRvIDAsIG91dHB1dCB0byBiZSBpbiAiY29uc3VtZXIiCisJICogUENNIGZvcm1hdCwgY29weXJpZ2h0IGFzc2VydGVkLCBubyBwcmUtZW1waGFzaXMgYW5kIG5vIHZhbGlkaXR5CisJICogY29udHJvbC4KKwkgKi8KKwl7MHgwMywgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIDB9LAorCXsweDA2LCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwgMH0sCisKKwkvKiBFbnN1cmUgbWljMSwgbWljMiwgbGluZTEgYW5kIGxpbmUyIHBpbiB3aWRnZXRzIHRha2UgaW5wdXQgZnJvbSB0aGUKKwkgKiBPVVQxIHN1bSBidXMgd2hlbiBhY3RpbmcgYXMgYW4gb3V0cHV0LgorCSAqLworCXsweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCisKKwkvKiBTdGFydCB3aXRoIG91dHB1dCBzdW0gd2lkZ2V0cyBtdXRlZCBhbmQgdGhlaXIgb3V0cHV0IGdhaW5zIGF0IG1pbiAqLworCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCisJLyogVW5tdXRlIHJldGFza2luZyBwaW4gd2lkZ2V0IG91dHB1dCBidWZmZXJzIHNpbmNlIHRoZSBkZWZhdWx0CisJICogc3RhdGUgYXBwZWFycyB0byBiZSBvdXRwdXQuICBBcyB0aGUgcGluIG1vZGUgaXMgY2hhbmdlZCBieSB0aGUKKwkgKiB1c2VyIHRoZSBwaW4gbW9kZSBjb250cm9sIHdpbGwgdGFrZSBjYXJlIG9mIGVuYWJsaW5nIHRoZSBwaW4ncworCSAqIGlucHV0L291dHB1dCBidWZmZXJzIGFzIG5lZWRlZC4KKwkgKi8KKwl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDEzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwkvKiBBbHNvIHVubXV0ZSB0aGUgbW9uby1vdXQgcGluIHdpZGdldCAqLworCXsweDExLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisKKwkvKiBNdXRlIGNhcHR1cmUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwkvKiBTZXQgQURDIGNvbm5lY3Rpb24gc2VsZWN0IHRvIG1hdGNoIGRlZmF1bHQgbWl4ZXIgc2V0dGluZyAobWljMQorCSAqIHBpbikKKwkgKi8KKwl7MHgwNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJLyogRG8gdGhlIHNhbWUgZm9yIHRoZSBzZWNvbmQgQURDOiBtdXRlIGNhcHR1cmUgaW5wdXQgYW1wIGFuZAorCSAqIHNldCBBREMgY29ubmVjdGlvbiB0byBtaWMxIHBpbgorCSAqLworCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCS8qIE11dGUgYWxsIGlucHV0cyB0byBtaXhlciB3aWRnZXQgKGV2ZW4gdW5jb25uZWN0ZWQgb25lcykgKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LCAvKiBtaWMxIHBpbiAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sIC8qIG1pYzIgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwgLyogbGluZTEgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwgLyogbGluZTIgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwgLyogQ0QgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwgLyogQmVlcC1nZW4gcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDYpfSwgLyogTGluZS1vdXQgcGluICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDcpfSwgLyogSFAtcGluIHBpbiAqLworCisJeyB9Cit9OworI2VuZGlmCisKKy8qCisgKiBBTEMyNjAgY29uZmlndXJhdGlvbnMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGMyNjBfbW9kZWxzW0FMQzI2MF9NT0RFTF9MQVNUXSA9IHsKKwlbQUxDMjYwX0JBU0lDXQkJPSAiYmFzaWMiLAorCVtBTEMyNjBfSFBdCQk9ICJocCIsCisJW0FMQzI2MF9IUF8zMDEzXQk9ICJocC0zMDEzIiwKKwlbQUxDMjYwX0hQX0RDNzYwMF0JPSAiaHAtZGM3NjAwIiwKKwlbQUxDMjYwX0ZVSklUU1VfUzcwMlhdCT0gImZ1aml0c3UiLAorCVtBTEMyNjBfQUNFUl0JCT0gImFjZXIiLAorCVtBTEMyNjBfV0lMTF0JCT0gIndpbGwiLAorCVtBTEMyNjBfUkVQTEFDRVJfNjcyVl0JPSAicmVwbGFjZXIiLAorCVtBTEMyNjBfRkFWT1JJVDEwMF0JPSAiZmF2b3JpdDEwMCIsCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCVtBTEMyNjBfVEVTVF0JCT0gInRlc3QiLAorI2VuZGlmCisJW0FMQzI2MF9BVVRPXQkJPSAiYXV0byIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjYwX2NmZ190YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMDdiLCAiQWNlciBDMjB4IiwgQUxDMjYwX0FDRVIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwN2YsICJBY2VyIiwgQUxDMjYwX1dJTEwpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwOGYsICJBY2VyIiwgQUxDMjYwX0FDRVIpLAorCVNORF9QQ0lfUVVJUksoMHgxNTA5LCAweDQ1NDAsICJGYXZvcml0IDEwMFhTIiwgQUxDMjYwX0ZBVk9SSVQxMDApLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MDgsICJIUCBkNTcwMCIsIEFMQzI2MF9IUF8zMDEzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODBhLCAiSFAgZDU3NTAiLCBBTEMyNjBfQVVUTyksIC8qIG5vIHF1aXJrICovCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMCwgIkhQIiwgQUxDMjYwX0hQXzMwMTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTEsICJIUCIsIEFMQzI2MF9IUF8zMDEzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDEyLCAiSFAiLCBBTEMyNjBfSFBfREM3NjAwKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDEzLCAiSFAiLCBBTEMyNjBfSFBfMzAxMyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNCwgIkhQIiwgQUxDMjYwX0hQKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDE1LCAiSFAiLCBBTEMyNjBfSFApLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTYsICJIUCIsIEFMQzI2MF9IUCksCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4ODFiYiwgIlNvbnkgVkFJTyIsIEFMQzI2MF9CQVNJQyksCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4ODFjYywgIlNvbnkgVkFJTyIsIEFMQzI2MF9CQVNJQyksCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4ODFjZCwgIlNvbnkgVkFJTyIsIEFMQzI2MF9CQVNJQyksCisJU05EX1BDSV9RVUlSSygweDEwY2YsIDB4MTMyNiwgIkZ1aml0c3UgUzcwMlgiLCBBTEMyNjBfRlVKSVRTVV9TNzAyWCksCisJU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDcyOSwgIkNUTCBVNTUzVyIsIEFMQzI2MF9CQVNJQyksCisJU05EX1BDSV9RVUlSSygweDE2MWYsIDB4MjA1NywgIlJlcGxhY2VyIDY3MlYiLCBBTEMyNjBfUkVQTEFDRVJfNjcyViksCisJU05EX1BDSV9RVUlSSygweDE2MzEsIDB4YzAxNywgIlBCIFY3OTAwIiwgQUxDMjYwX1dJTEwpLAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzI2MF9wcmVzZXRzW10gPSB7CisJW0FMQzI2MF9CQVNJQ10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2MF9iYXNlX291dHB1dF9taXhlciwKKwkJCSAgICBhbGMyNjBfaW5wdXRfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2MF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYwX2RhY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjBfZHVhbF9hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzI2MF9kdWFsX2FkY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjBfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDMjYwX0hQXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYwX2hwX291dHB1dF9taXhlciwKKwkJCSAgICBhbGMyNjBfaW5wdXRfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2MF9pbml0X3ZlcmJzLAorCQkJCWFsYzI2MF9ocF91bnNvbF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2MF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2MF9kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2FkY19uaWRzX2FsdCksCisJCS5hZGNfbmlkcyA9IGFsYzI2MF9hZGNfbmlkc19hbHQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjBfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYwX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2MF9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjMjYwX2hwX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzI2MF9IUF9EQzc2MDBdID0geworCQkubWl4ZXJzID0geyBhbGMyNjBfaHBfZGM3NjAwX21peGVyLAorCQkJICAgIGFsYzI2MF9pbnB1dF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYwX2luaXRfdmVyYnMsCisJCQkJYWxjMjYwX2hwX2RjNzYwMF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2MF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2MF9kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2FkY19uaWRzX2FsdCksCisJCS5hZGNfbmlkcyA9IGFsYzI2MF9hZGNfbmlkc19hbHQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjBfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYwX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2MF9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjMjYwX2hwXzMwMTJfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjYwX0hQXzMwMTNdID0geworCQkubWl4ZXJzID0geyBhbGMyNjBfaHBfMzAxM19taXhlciwKKwkJCSAgICBhbGMyNjBfaW5wdXRfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2MF9ocF8zMDEzX2luaXRfdmVyYnMsCisJCQkJYWxjMjYwX2hwXzMwMTNfdW5zb2xfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9hZGNfbmlkc19hbHQpLAorCQkuYWRjX25pZHMgPSBhbGMyNjBfYWRjX25pZHNfYWx0LAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjBfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzI2MF9ocF8zMDEzX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzI2MF9GVUpJVFNVX1M3MDJYXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYwX2Z1aml0c3VfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2MF9mdWppdHN1X2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9kdWFsX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjMjYwX2R1YWxfYWRjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjBfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYwX21vZGVzLAorCQkubnVtX211eF9kZWZzID0gQVJSQVlfU0laRShhbGMyNjBfZnVqaXRzdV9jYXB0dXJlX3NvdXJjZXMpLAorCQkuaW5wdXRfbXV4ID0gYWxjMjYwX2Z1aml0c3VfY2FwdHVyZV9zb3VyY2VzLAorCX0sCisJW0FMQzI2MF9BQ0VSXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYwX2FjZXJfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2MF9hY2VyX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9kdWFsX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjMjYwX2R1YWxfYWRjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjBfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYwX21vZGVzLAorCQkubnVtX211eF9kZWZzID0gQVJSQVlfU0laRShhbGMyNjBfYWNlcl9jYXB0dXJlX3NvdXJjZXMpLAorCQkuaW5wdXRfbXV4ID0gYWxjMjYwX2FjZXJfY2FwdHVyZV9zb3VyY2VzLAorCX0sCisJW0FMQzI2MF9GQVZPUklUMTAwXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYwX2Zhdm9yaXQxMDBfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2MF9mYXZvcml0MTAwX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9kdWFsX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjMjYwX2R1YWxfYWRjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjBfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYwX21vZGVzLAorCQkubnVtX211eF9kZWZzID0gQVJSQVlfU0laRShhbGMyNjBfZmF2b3JpdDEwMF9jYXB0dXJlX3NvdXJjZXMpLAorCQkuaW5wdXRfbXV4ID0gYWxjMjYwX2Zhdm9yaXQxMDBfY2FwdHVyZV9zb3VyY2VzLAorCX0sCisJW0FMQzI2MF9XSUxMXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYwX3dpbGxfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2MF9pbml0X3ZlcmJzLCBhbGMyNjBfd2lsbF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2MF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2MF9kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjMjYwX2FkY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEMyNjBfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2MF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjBfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYwX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzI2MF9SRVBMQUNFUl82NzJWXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYwX3JlcGxhY2VyXzY3MnZfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2MF9pbml0X3ZlcmJzLCBhbGMyNjBfcmVwbGFjZXJfNjcydl92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2MF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2MF9kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjMjYwX2FkY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEMyNjBfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2MF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjBfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYwX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGMyNjBfcmVwbGFjZXJfNjcydl91bnNvbF9ldmVudCwKKwkJLmluaXRfaG9vayA9IGFsYzI2MF9yZXBsYWNlcl82NzJ2X2F1dG9tdXRlLAorCX0sCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCVtBTEMyNjBfVEVTVF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2MF90ZXN0X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfdGVzdF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYwX3Rlc3RfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjBfdGVzdF9kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjYwX3Rlc3RfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGMyNjBfdGVzdF9hZGNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2MF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjBfbW9kZXMsCisJCS5udW1fbXV4X2RlZnMgPSBBUlJBWV9TSVpFKGFsYzI2MF90ZXN0X2NhcHR1cmVfc291cmNlcyksCisJCS5pbnB1dF9tdXggPSBhbGMyNjBfdGVzdF9jYXB0dXJlX3NvdXJjZXMsCisJfSwKKyNlbmRpZgorfTsKKwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9hbGMyNjJfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzI2Ml9xdWlya3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDIwOTdkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9hbGMyNjJfcXVpcmtzLmMKQEAgLTAsMCArMSwxMzUzIEBACisvKgorICogQUxDMjYyIHF1aXJrIG1vZGVscworICogaW5jbHVkZWQgYnkgcGF0Y2hfcmVhbHRlay5jCisgKi8KKworLyogQUxDMjYyIG1vZGVscyAqLworZW51bSB7CisJQUxDMjYyX0FVVE8sCisJQUxDMjYyX0JBU0lDLAorCUFMQzI2Ml9ISVBQTywKKwlBTEMyNjJfSElQUE9fMSwKKwlBTEMyNjJfRlVKSVRTVSwKKwlBTEMyNjJfSFBfQlBDLAorCUFMQzI2Ml9IUF9CUENfRDcwMDBfV0wsCisJQUxDMjYyX0hQX0JQQ19ENzAwMF9XRiwKKwlBTEMyNjJfSFBfVENfVDU3MzUsCisJQUxDMjYyX0hQX1JQNTcwMCwKKwlBTEMyNjJfQkVOUV9FRDgsCisJQUxDMjYyX1NPTllfQVNTQU1ELAorCUFMQzI2Ml9CRU5RX1QzMSwKKwlBTEMyNjJfVUxUUkEsCisJQUxDMjYyX0xFTk9WT18zMDAwLAorCUFMQzI2Ml9ORUMsCisJQUxDMjYyX1RPU0hJQkFfUzA2LAorCUFMQzI2Ml9UT1NISUJBX1JYMSwKKwlBTEMyNjJfVFlBTiwKKwlBTEMyNjJfTU9ERUxfTEFTVCAvKiBsYXN0IHRhZyAqLworfTsKKworI2RlZmluZSBBTEMyNjJfRElHT1VUX05JRAlBTEM4ODBfRElHT1VUX05JRAorI2RlZmluZSBBTEMyNjJfRElHSU5fTklECUFMQzg4MF9ESUdJTl9OSUQKKworI2RlZmluZSBhbGMyNjJfZGFjX25pZHMJCWFsYzI2MF9kYWNfbmlkcworI2RlZmluZSBhbGMyNjJfYWRjX25pZHMJCWFsYzg4Ml9hZGNfbmlkcworI2RlZmluZSBhbGMyNjJfYWRjX25pZHNfYWx0CWFsYzg4Ml9hZGNfbmlkc19hbHQKKyNkZWZpbmUgYWxjMjYyX2NhcHNyY19uaWRzCWFsYzg4Ml9jYXBzcmNfbmlkcworI2RlZmluZSBhbGMyNjJfY2Fwc3JjX25pZHNfYWx0CWFsYzg4Ml9jYXBzcmNfbmlkc19hbHQKKworI2RlZmluZSBhbGMyNjJfbW9kZXMJCWFsYzI2MF9tb2RlcworI2RlZmluZSBhbGMyNjJfY2FwdHVyZV9zb3VyY2UJYWxjODgyX2NhcHR1cmVfc291cmNlCisKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjYyX2RtaWNfYWRjX25pZHNbMV0gPSB7CisJLyogQURDMCAqLworCTB4MDkKK307CisKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjYyX2RtaWNfY2Fwc3JjX25pZHNbMV0gPSB7IDB4MjIgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9iYXNlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBELCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9NT05PKCJNb25vIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDIsIDB4MCwgSERBX09VVFBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogdXBkYXRlIEhQLCBsaW5lIGFuZCBtb25vLW91dCBwaW5zIGFjY29yZGluZyB0byB0aGUgbWFzdGVyIHN3aXRjaCAqLworI2RlZmluZSBhbGMyNjJfaHBfbWFzdGVyX3VwZGF0ZQkJYWxjMjYwX2hwX21hc3Rlcl91cGRhdGUKKworc3RhdGljIHZvaWQgYWxjMjYyX2hwX2JwY19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE2OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKK30KKworc3RhdGljIHZvaWQgYWxjMjYyX2hwX3dpbGR3ZXN0X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTY7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOworfQorCisjZGVmaW5lIGFsYzI2Ml9ocF9tYXN0ZXJfc3dfZ2V0CQlhbGMyNjBfaHBfbWFzdGVyX3N3X2dldAorI2RlZmluZSBhbGMyNjJfaHBfbWFzdGVyX3N3X3B1dAkJYWxjMjYwX2hwX21hc3Rlcl9zd19wdXQKKworI2RlZmluZSBBTEMyNjJfSFBfTUFTVEVSX1NXSVRDSAkJCQkJXAorCXsJCQkJCQkJXAorCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwJCVwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCQlcCisJCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywJCVwKKwkJLmdldCA9IGFsYzI2Ml9ocF9tYXN0ZXJfc3dfZ2V0LAkJCVwKKwkJLnB1dCA9IGFsYzI2Ml9ocF9tYXN0ZXJfc3dfcHV0LAkJCVwKKwl9LCBcCisJewkJCQkJCQlcCisJCS5pZmFjZSA9IE5JRF9NQVBQSU5HLAkJCQlcCisJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAkJXAorCQkucHJpdmF0ZV92YWx1ZSA9IDB4MTUgfCAoMHgxNiA8PCA4KSB8ICgweDFiIDw8IDE2KSwJXAorCX0KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX0hQX0JQQ19taXhlcltdID0geworCUFMQzI2Ml9IUF9NQVNURVJfU1dJVENILAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsCisJCQkgICAgICBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9NT05PKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDIsIDB4MCwKKwkJCSAgICBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkFVWCBJTiBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA2LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJBVVggSU4gUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNiwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9taXhlcltdID0geworCUFMQzI2Ml9IUF9NQVNURVJfU1dJVENILAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsCisJCQkgICAgICBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9NT05PKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDIsIDB4MCwKKwkJCSAgICBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9vcHRpb25fbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJSZWFyIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIlJlYXIgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJSZWFyIE1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIG11dGUvdW5tdXRlIGludGVybmFsIHNwZWFrZXIgYWNjb3JkaW5nIHRvIHRoZSBocCBqYWNrIGFuZCBtdXRlIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGMyNjJfaHBfdDU3MzVfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfaHBfdDU3MzVfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9ocF90NTczNV92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX2hwX3JwNTcwMF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9ocF9ycDU3MDBfdmVyYnNbXSA9IHsKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDAgPDwgOCkpfSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2Ml9ocF9ycDU3MDBfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDEsCisJLml0ZW1zID0geworCQl7ICJMaW5lIiwgMHgxIH0sCisJfSwKK307CisKKy8qIGJpbmQgaHAgYW5kIGludGVybmFsIHNwZWFrZXIgbXV0ZSAod2l0aCBwbHVnIGNoZWNrKSBhcyBtYXN0ZXIgc3dpdGNoICovCisjZGVmaW5lIGFsYzI2Ml9oaXBwb19tYXN0ZXJfdXBkYXRlCWFsYzI2Ml9ocF9tYXN0ZXJfdXBkYXRlCisjZGVmaW5lIGFsYzI2Ml9oaXBwb19tYXN0ZXJfc3dfZ2V0CWFsYzI2Ml9ocF9tYXN0ZXJfc3dfZ2V0CisjZGVmaW5lIGFsYzI2Ml9oaXBwb19tYXN0ZXJfc3dfcHV0CWFsYzI2Ml9ocF9tYXN0ZXJfc3dfcHV0CisKKyNkZWZpbmUgQUxDMjYyX0hJUFBPX01BU1RFUl9TV0lUQ0gJCQkJXAorCXsJCQkJCQkJXAorCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwJCVwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCQlcCisJCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywJCVwKKwkJLmdldCA9IGFsYzI2Ml9oaXBwb19tYXN0ZXJfc3dfZ2V0LAkJXAorCQkucHV0ID0gYWxjMjYyX2hpcHBvX21hc3Rlcl9zd19wdXQsCQlcCisJfSwJCQkJCQkJXAorCXsJCQkJCQkJXAorCQkuaWZhY2UgPSBOSURfTUFQUElORywJCQkJXAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwJCVwKKwkJLnN1YmRldmljZSA9IFNVQkRFVl9IUCgwKSB8IChTVUJERVZfTElORSgwKSA8PCA4KSB8IFwKKwkJCSAgICAgKFNVQkRFVl9TUEVBS0VSKDApIDw8IDE2KSwgXAorCX0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9oaXBwb19taXhlcltdID0geworCUFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENILAorCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfaGlwcG8xX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJQUxDMjYyX0hJUFBPX01BU1RFUl9TV0lUQ0gsCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCisvKiBtdXRlL3VubXV0ZSBpbnRlcm5hbCBzcGVha2VyIGFjY29yZGluZyB0byB0aGUgaHAgamFjayBhbmQgbXV0ZSBzdGF0ZSAqLworc3RhdGljIHZvaWQgYWxjMjYyX2hpcHBvX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjJfaGlwcG8xX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfc29ueV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENILAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQVRBUEkgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkFUQVBJIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfYmVucV90MzFfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJBVEFQSSBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQVRBUEkgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml90eWFuX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQXV4IFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDYsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA2LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX3R5YW5fdmVyYnNbXSA9IHsKKwkvKiBIZWFkcGhvbmUgYXV0b211dGUgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJLyogUDExIEFVWF9JTiwgd2hpdGUgNC1waW4gY29ubmVjdG9yICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQ09ORklHX0RFRkFVTFRfQllURVNfMSwgMHhlMX0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTkZJR19ERUZBVUxUX0JZVEVTXzIsIDB4OTN9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9DT05GSUdfREVGQVVMVF9CWVRFU18zLCAweDE5fSwKKworCXt9Cit9OworCisvKiB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBzZW5zaW5nICovCitzdGF0aWMgdm9pZCBhbGMyNjJfdHlhbl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworCisjZGVmaW5lIGFsYzI2Ml9jYXB0dXJlX21peGVyCQlhbGM4ODJfY2FwdHVyZV9taXhlcgorI2RlZmluZSBhbGMyNjJfY2FwdHVyZV9hbHRfbWl4ZXIJYWxjODgyX2NhcHR1cmVfYWx0X21peGVyCisKKy8qCisgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIFVubXV0ZSBBREMwLTIgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KKwkgKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKworCS8qIE11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZSBhbmFsb2ctbG9vcGJhY2sKKwkgKiBtaXhlciB3aWRnZXQKKwkgKiBOb3RlOiBQQVNEIG1vdGhlcmJvYXJkcyB1c2VzIHRoZSBMaW5lIEluIDIgYXMgdGhlIGlucHV0IGZvcgorCSAqIGZyb250IHBhbmVsIG1pYyAobWljIDIpCisJICovCisJLyogQW1wIEluZGljZXM6IE1pYzEgPSAwLCBNaWMyID0gMSwgTGluZTEgPSAyLCBMaW5lMiA9IDMsIENEID0gNCAqLworCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKworCS8qCisJICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MGMgLSAweDBlKQorCSAqLworCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJLyogc2V0IHVwIGlucHV0IGFtcHMgZm9yIGFuYWxvZyBsb29wYmFjayAqLworCS8qIEFtcCBJbmRpY2VzOiBEQUMgPSAwLCBtaXhlciA9IDEgKi8KKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzB9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAorCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAorCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisKKwkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KKwkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDE2LCAxNywgMGIgKi8KKwkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA0IDw8IDgpKX0sCisJLyogSW5wdXQgbWl4ZXIyICovCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDMgPDwgOCkpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNCA8PCA4KSl9LAorCS8qIElucHV0IG1peGVyMyAqLworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAzIDw8IDgpKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMiA8PCA4KSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKKworCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfZWFwZF92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX2hpcHBvMV91bnNvbF92ZXJic1tdID0geworCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCisKKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfc29ueV91bnNvbF92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCS8vIEZyb250IE1pYworCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfdG9zaGliYV9zMDZfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml90b3NoaWJhX3MwNl92ZXJic1tdID0geworCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwOX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJe30KK307CisKK3N0YXRpYyB2b2lkIGFsYzI2Ml90b3NoaWJhX3MwNl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKKwlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTI7CisJc3BlYy0+YXV0b19taWMgPSAxOworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKK30KKworLyoKKyAqIG5lYyBtb2RlbAorICogIDB4MTUgPSBoZWFkcGhvbmUKKyAqICAweDE2ID0gaW50ZXJuYWwgc3BlYWtlcgorICogIDB4MTggPSBleHRlcm5hbCBtaWMKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX25lY19taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMCwgMHgwLCBIREFfT1VUUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfbmVjX3ZlcmJzW10gPSB7CisJLyogVW5tdXRlIFNwZWFrZXIgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCisJLyogSGVhZHBob25lICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCisJLyogRXh0ZXJuYWwgbWljIHRvIGhlYWRwaG9uZSAqLworCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwkvKiBFeHRlcm5hbCBtaWMgdG8gc3BlYWtlciAqLworCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7fQorfTsKKworLyoKKyAqIGZ1aml0c3UgbW9kZWwKKyAqICAweDE0ID0gaGVhZHBob25lL3NwZGlmLW91dCwgMHgxNSA9IGludGVybmFsIHNwZWFrZXIsCisgKiAgMHgxYiA9IHBvcnQgcmVwbGljYXRvciBoZWFkcGhvbmUgb3V0CisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfZnVqaXRzdV91bnNvbF92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9sZW5vdm9fMzAwMF91bnNvbF92ZXJic1tdID0geworCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9sZW5vdm9fMzAwMF9pbml0X3ZlcmJzW10gPSB7CisJLyogRnJvbnQgTWljIHBpbjogaW5wdXQgdnJlZiBhdCA1MCUgKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjUwfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2Ml9mdWppdHN1X2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSAzLAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkludGVybmFsIE1pYyIsIDB4MSB9LAorCQl7ICJDRCIsIDB4NCB9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjYyX0hQX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA1LAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkZyb250IE1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJCXsgIkNEIiwgMHg0IH0sCisJCXsgIkFVWCBJTiIsIDB4NiB9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjYyX0hQX0Q3MDAwX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA0LAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkZyb250IE1pYyIsIDB4MiB9LAorCQl7ICJMaW5lIiwgMHgxIH0sCisJCXsgIkNEIiwgMHg0IH0sCisJfSwKK307CisKK3N0YXRpYyB2b2lkIGFsYzI2Ml9mdWppdHN1X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMV0gPSAweDFiOworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKKy8qIGJpbmQgdm9sdW1lcyBvZiBib3RoIE5JRCAweDBjIGFuZCAweDBkICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjMjYyX2Z1aml0c3VfYmluZF9tYXN0ZXJfdm9sID0geworCS5vcHMgPSAmc25kX2hkYV9iaW5kX3ZvbCwKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MGMsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MGQsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfZnVqaXRzdV9taXhlcltdID0geworCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjJfZnVqaXRzdV9iaW5kX21hc3Rlcl92b2wpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAorCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IDB4MTQsCisJCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywKKwkJLmdldCA9IGFsYzI2Ml9ocF9tYXN0ZXJfc3dfZ2V0LAorCQkucHV0ID0gYWxjMjYyX2hwX21hc3Rlcl9zd19wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IE5JRF9NQVBQSU5HLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJLnByaXZhdGVfdmFsdWUgPSAweDFiLAorCX0sCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHZvaWQgYWxjMjYyX2xlbm92b18zMDAwX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9sZW5vdm9fMzAwMF9taXhlcltdID0geworCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjJfZnVqaXRzdV9iaW5kX21hc3Rlcl92b2wpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAorCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IDB4MWIsCisJCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywKKwkJLmdldCA9IGFsYzI2Ml9ocF9tYXN0ZXJfc3dfZ2V0LAorCQkucHV0ID0gYWxjMjYyX2hwX21hc3Rlcl9zd19wdXQsCisJfSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX3Rvc2hpYmFfcngxX21peGVyW10gPSB7CisJSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2Ml9mdWppdHN1X2JpbmRfbWFzdGVyX3ZvbCksCisJQUxDMjYyX0hJUFBPX01BU1RFUl9TV0lUQ0gsCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogYWRkaXRpb25hbCBpbml0IHZlcmJzIGZvciBCZW5xIGxhcHRvcHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX0VBUERfdmVyYnNbXSA9IHsKKwl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwN30sCisJezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgIDB4MzA3MH0sCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX2JlbnFfdDMxX0VBUERfdmVyYnNbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAorCisJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDd9LAorCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsICAweDMwNTB9LAorCXt9Cit9OworCisvKiBTYW1zdW5nIFExIFVsdHJhIFZpc3RhIG1vZGVsIHNldHVwICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX3VsdHJhX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxNSwgMCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml91bHRyYV92ZXJic1tdID0geworCS8qIG91dHB1dCBtaXhlciAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwkvKiBzcGVha2VyICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogSFAgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwkvKiBpbnRlcm5hbCBtaWMgKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCS8qIEFEQywgY2hvb3NlIG1pYyAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNil9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg3KX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDgpfSwKKwl7fQorfTsKKworLyogbXV0ZS91bm11dGUgaW50ZXJuYWwgc3BlYWtlciBhY2NvcmRpbmcgdG8gdGhlIGhwIGphY2sgYW5kIG11dGUgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzI2Ml91bHRyYV9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1bnNpZ25lZCBpbnQgbXV0ZTsKKworCW11dGUgPSAwOworCS8qIGF1dG8tbXV0ZSBvbmx5IHdoZW4gSFAgaXMgdXNlZCBhcyBIUCAqLworCWlmICghc3BlYy0+Y3VyX211eFswXSkgeworCQlzcGVjLT5qYWNrX3ByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDE1KTsKKwkJaWYgKHNwZWMtPmphY2tfcHJlc2VudCkKKwkJCW11dGUgPSBIREFfQU1QX01VVEU7CisJfQorCS8qIG11dGUvdW5tdXRlIGludGVybmFsIHNwZWFrZXIgKi8KKwlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MTQsIEhEQV9PVVRQVVQsIDAsCisJCQkJIEhEQV9BTVBfTVVURSwgbXV0ZSk7CisJLyogbXV0ZS91bm11dGUgSFAgKi8KKwlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MTUsIEhEQV9PVVRQVVQsIDAsCisJCQkJIEhEQV9BTVBfTVVURSwgbXV0ZSA/IDAgOiBIREFfQU1QX01VVEUpOworfQorCisvKiB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBzZW5zaW5nICovCitzdGF0aWMgdm9pZCBhbGMyNjJfdWx0cmFfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCByZXMpCit7CisJaWYgKChyZXMgPj4gMjYpICE9IEFMQ19IUF9FVkVOVCkKKwkJcmV0dXJuOworCWFsYzI2Ml91bHRyYV9hdXRvbXV0ZShjb2RlYyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjJfdWx0cmFfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDIsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDEgfSwKKwkJeyAiSGVhZHBob25lIiwgMHg3IH0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgYWxjMjYyX3VsdHJhX211eF9lbnVtX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCByZXQ7CisKKwlyZXQgPSBhbGNfbXV4X2VudW1fcHV0KGtjb250cm9sLCB1Y29udHJvbCk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCS8qIHJlcHJvZ3JhbSB0aGUgSFAgcGluIGFzIG1pYyBvciBIUCBhY2NvcmRpbmcgdG8gdGhlIGlucHV0IHNvdXJjZSAqLworCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIDB4MTUsIDAsCisJCQkJICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkJICBzcGVjLT5jdXJfbXV4WzBdID8gUElOX1ZSRUY4MCA6IFBJTl9IUCk7CisJYWxjMjYyX3VsdHJhX2F1dG9tdXRlKGNvZGVjKTsgLyogbXV0ZS91bm11dGUgSFAgKi8KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX3VsdHJhX2NhcHR1cmVfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCQkuaW5mbyA9IGFsY19tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFsYzI2Ml91bHRyYV9tdXhfZW51bV9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IE5JRF9NQVBQSU5HLAorCQkubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsCisJCS5wcml2YXRlX3ZhbHVlID0gMHgxNSwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX0hQX0JQQ19pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBVbm11dGUgQURDMC0yIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCisJICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisKKwkvKiBNdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCisJICogbWl4ZXIgd2lkZ2V0CisJICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IKKwkgKiBmcm9udCBwYW5lbCBtaWMgKG1pYyAyKQorCSAqLworCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwKKyAgICAgICAgezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDYpfSwKKworCS8qCisJICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MGMgLSAweDBlKQorCSAqLworCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisKKwkvKiBzZXQgdXAgaW5wdXQgYW1wcyBmb3IgYW5hbG9nIGxvb3BiYWNrICovCisJLyogQW1wIEluZGljZXM6IERBQyA9IDAsIG1peGVyID0gMSAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKKyAgICAgICAgezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCisJezB4MWMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwIH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAorICAgICAgICB7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwIH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAorCXsweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKKwl7MHgxZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwIH0sCisKKworCS8qIEZJWE1FOiB1c2UgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLworCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxYywgMWQsIDE0LCAxNSwgMGIsIDEyICovCisJLyogSW5wdXQgbWl4ZXIxOiBvbmx5IHVubXV0ZSBNaWMgKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMSA8PCA4KSl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAzIDw8IDgpKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNCA8PCA4KSl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDUgPDwgOCkpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA2IDw8IDgpKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNyA8PCA4KSl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDggPDwgOCkpfSwKKwkvKiBJbnB1dCBtaXhlcjIgKi8KKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMSA8PCA4KSl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAzIDw8IDgpKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNCA8PCA4KSl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDUgPDwgOCkpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA2IDw8IDgpKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNyA8PCA4KSl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDggPDwgOCkpfSwKKwkvKiBJbnB1dCBtaXhlcjMgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMSA8PCA4KSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAzIDw8IDgpKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNCA8PCA4KSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDUgPDwgOCkpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA2IDw8IDgpKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNyA8PCA4KSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDggPDwgOCkpfSwKKworCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKworCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIFVubXV0ZSBBREMwLTIgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KKwkgKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKworCS8qIE11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZSBhbmFsb2ctbG9vcGJhY2sKKwkgKiBtaXhlciB3aWRnZXQKKwkgKiBOb3RlOiBQQVNEIG1vdGhlcmJvYXJkcyB1c2VzIHRoZSBMaW5lIEluIDIgYXMgdGhlIGlucHV0IGZvciBmcm9udAorCSAqIHBhbmVsIG1pYyAobWljIDIpCisJICovCisJLyogQW1wIEluZGljZXM6IE1pYzEgPSAwLCBNaWMyID0gMSwgTGluZTEgPSAyLCBMaW5lMiA9IDMsIENEID0gNCAqLworCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNSl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg2KX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDcpfSwKKwkvKgorCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDBjIC0gMHgwZSkKKwkgKi8KKwkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCisJLyogc2V0IHVwIGlucHV0IGFtcHMgZm9yIGFuYWxvZyBsb29wYmFjayAqLworCS8qIEFtcCBJbmRpY2VzOiBEQUMgPSAwLCBtaXhlciA9IDEgKi8KKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKworCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQIH0sCS8qIEhQICovCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAkvKiBNb25vICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAkvKiByZWFyIE1JQyAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAkvKiBMaW5lIGluICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAkvKiBGcm9udCBNSUMgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCS8qIExpbmUgb3V0ICovCisJezB4MWMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCS8qIENEIGluICovCisKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKworCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKworCS8qIHsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMjMgfSwgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwIH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMjMgfSwKKwl7MHgxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwIH0sCisJezB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAorCisJLyogRklYTUU6IHVzZSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCisJLyogTWl4ZXIgZWxlbWVudHM6IDB4MTgsIDE5LCAxYSwgMWIsIDFjLCAxZCwgMTQsIDE1LCAxNiwgMTcsIDBiICovCisJLyogSW5wdXQgbWl4ZXIxOiB1bm11dGUgTWljLCBGLU1pYywgTGluZSwgQ0QgaW5wdXRzICovCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LCAvKnJlYXIgTUlDKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sIC8qTGluZSBpbiovCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMiA8PCA4KSl9LCAvKkYgTUlDKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAzIDw8IDgpKX0sIC8qRnJvbnQqLworCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDQgPDwgOCkpfSwgLypDRCovCisgICAgICAgIC8qIHsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDYgPDwgOCkpfSwgICovCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNyA8PCA4KSl9LCAvKkhQKi8KKwkvKiBJbnB1dCBtaXhlcjIgKi8KKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAzIDw8IDgpKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNCA8PCA4KSl9LAorICAgICAgICAvKiB7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA2IDw8IDgpKX0sICovCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNyA8PCA4KSl9LAorCS8qIElucHV0IG1peGVyMyAqLworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMiA8PCA4KSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDMgPDwgOCkpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA0IDw8IDgpKX0sCisgICAgICAgIC8qIHsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDYgPDwgOCkpfSwgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA3IDw8IDgpKX0sCisKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX3Rvc2hpYmFfcngxX3Vuc29sX3ZlcmJzW10gPSB7CisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCS8qIEZyb250IFNwZWFrZXIgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAkvKiBNSUMgamFjayAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwJLyogRnJvbnQgTUlDICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKSB9LAorCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQIH0sCS8qIEhQICBqYWNrICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJe30KK307CisKKy8qCisgKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGMyNjJfbW9kZWxzW0FMQzI2Ml9NT0RFTF9MQVNUXSA9IHsKKwlbQUxDMjYyX0JBU0lDXQkJPSAiYmFzaWMiLAorCVtBTEMyNjJfSElQUE9dCQk9ICJoaXBwbyIsCisJW0FMQzI2Ml9ISVBQT18xXQk9ICJoaXBwb18xIiwKKwlbQUxDMjYyX0ZVSklUU1VdCT0gImZ1aml0c3UiLAorCVtBTEMyNjJfSFBfQlBDXQkJPSAiaHAtYnBjIiwKKwlbQUxDMjYyX0hQX0JQQ19ENzAwMF9XTF09ICJocC1icGMtZDcwMDAiLAorCVtBTEMyNjJfSFBfVENfVDU3MzVdCT0gImhwLXRjLXQ1NzM1IiwKKwlbQUxDMjYyX0hQX1JQNTcwMF0JPSAiaHAtcnA1NzAwIiwKKwlbQUxDMjYyX0JFTlFfRUQ4XQk9ICJiZW5xIiwKKwlbQUxDMjYyX0JFTlFfVDMxXQk9ICJiZW5xLXQzMSIsCisJW0FMQzI2Ml9TT05ZX0FTU0FNRF0JPSAic29ueS1hc3NhbWQiLAorCVtBTEMyNjJfVE9TSElCQV9TMDZdCT0gInRvc2hpYmEtczA2IiwKKwlbQUxDMjYyX1RPU0hJQkFfUlgxXQk9ICJ0b3NoaWJhLXJ4MSIsCisJW0FMQzI2Ml9VTFRSQV0JCT0gInVsdHJhIiwKKwlbQUxDMjYyX0xFTk9WT18zMDAwXQk9ICJsZW5vdm8tMzAwMCIsCisJW0FMQzI2Ml9ORUNdCQk9ICJuZWMiLAorCVtBTEMyNjJfVFlBTl0JCT0gInR5YW4iLAorCVtBTEMyNjJfQVVUT10JCT0gImF1dG8iLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2Ml9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwMDIsIDB4NDM3YiwgIkhpcHBvIiwgQUxDMjYyX0hJUFBPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzMywgMHg4ODk1LCAiTkVDIFZlcnNhIFM5MTAwIiwgQUxDMjYyX05FQyksCisJU05EX1BDSV9RVUlSS19NQVNLKDB4MTAzYywgMHhmZjAwLCAweDEyMDAsICJIUCB4dyBzZXJpZXMiLAorCQkJICAgQUxDMjYyX0hQX0JQQyksCisJU05EX1BDSV9RVUlSS19NQVNLKDB4MTAzYywgMHhmZjAwLCAweDEzMDAsICJIUCB4dyBzZXJpZXMiLAorCQkJICAgQUxDMjYyX0hQX0JQQyksCisJU05EX1BDSV9RVUlSS19NQVNLKDB4MTAzYywgMHhmZjAwLCAweDE1MDAsICJIUCB6IHNlcmllcyIsCisJCQkgICBBTEMyNjJfSFBfQlBDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgxNzBiLCAiSFAgWjIwMCIsCisJCQkgICBBTEMyNjJfQVVUTyksCisJU05EX1BDSV9RVUlSS19NQVNLKDB4MTAzYywgMHhmZjAwLCAweDE3MDAsICJIUCB4dyBzZXJpZXMiLAorCQkJICAgQUxDMjYyX0hQX0JQQyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwMCwgIkhQIEQ3MDAwIiwgQUxDMjYyX0hQX0JQQ19ENzAwMF9XTCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwMSwgIkhQIEQ3MDAwIiwgQUxDMjYyX0hQX0JQQ19ENzAwMF9XRiksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwMiwgIkhQIEQ3MDAwIiwgQUxDMjYyX0hQX0JQQ19ENzAwMF9XTCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwMywgIkhQIEQ3MDAwIiwgQUxDMjYyX0hQX0JQQ19ENzAwMF9XRiksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwNCwgIkhQIEQ3MDAwIiwgQUxDMjYyX0hQX0JQQ19ENzAwMF9XTCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwNSwgIkhQIEQ3MDAwIiwgQUxDMjYyX0hQX0JQQ19ENzAwMF9XRiksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwNiwgIkhQIEQ3MDAwIiwgQUxDMjYyX0hQX0JQQ19ENzAwMF9XTCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwNywgIkhQIEQ3MDAwIiwgQUxDMjYyX0hQX0JQQ19ENzAwMF9XRiksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwYywgIkhQIHh3NDQwMCIsIEFMQzI2Ml9IUF9CUEMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTQsICJIUCB4dzY0MDAiLCBBTEMyNjJfSFBfQlBDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDE1LCAiSFAgeHc4NDAwIiwgQUxDMjYyX0hQX0JQQyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAyZiwgIkhQIFRoaW4gQ2xpZW50IFQ1NzM1IiwKKwkJICAgICAgQUxDMjYyX0hQX1RDX1Q1NzM1KSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODE3LCAiSFAgUlA1NzAwIiwgQUxDMjYyX0hQX1JQNTcwMCksCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4MWYwMCwgIlNvbnkgQVNTQU1EIiwgQUxDMjYyX1NPTllfQVNTQU1EKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MjAzLCAiU29ueSBVWC05MCIsIEFMQzI2Ml9ISVBQTyksCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4ODIwZiwgIlNvbnkgQVNTQU1EIiwgQUxDMjYyX1NPTllfQVNTQU1EKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDE2LCAiU29ueSBWQUlPIiwgQUxDMjYyX0FVVE8pLCAvKiBkaWctb25seSAqLworCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwMjUsICJTb255IFZBSU8gWjIxTU4iLCBBTEMyNjJfVE9TSElCQV9TMDYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwMzUsICJTb255IFZBSU8gVkdOLUZXMTcwSiIsIEFMQzI2Ml9BVVRPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDQ3LCAiU29ueSBWQUlPIFR5cGUgRyIsIEFMQzI2Ml9BVVRPKSwKKyNpZiAwIC8qIGRpc2FibGUgdGhlIHF1aXJrIHNpbmNlIG1vZGVsPWF1dG8gd29ya3MgYmV0dGVyIGluIHJlY2VudCB2ZXJzaW9ucyAqLworCVNORF9QQ0lfUVVJUktfTUFTSygweDEwNGQsIDB4ZmYwMCwgMHg5MDAwLCAiU29ueSBWQUlPIiwKKwkJCSAgIEFMQzI2Ml9TT05ZX0FTU0FNRCksCisjZW5kaWYKKwlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHgwMDAxLCAiVG9zaGliYSBkeW5hYm9vayBTUyBSWDEiLAorCQkgICAgICBBTEMyNjJfVE9TSElCQV9SWDEpLAorCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmN2IsICJUb3NoaWJhIFMwNiIsIEFMQzI2Ml9UT1NISUJBX1MwNiksCisJU05EX1BDSV9RVUlSSygweDEwY2YsIDB4MTM5NywgIkZ1aml0c3UiLCBBTEMyNjJfRlVKSVRTVSksCisJU05EX1BDSV9RVUlSSygweDEwY2YsIDB4MTQyZCwgIkZ1aml0c3UgTGlmZWJvb2sgRTg0MTAiLCBBTEMyNjJfRlVKSVRTVSksCisJU05EX1BDSV9RVUlSSygweDEwZjEsIDB4MjkxNSwgIlR5YW4gVGh1bmRlciBuNjY1MFciLCBBTEMyNjJfVFlBTiksCisJU05EX1BDSV9RVUlSS19NQVNLKDB4MTQ0ZCwgMHhmZjAwLCAweGMwMzIsICJTYW1zdW5nIFExIiwKKwkJCSAgIEFMQzI2Ml9VTFRSQSksCisJU05EX1BDSV9RVUlSSygweDE0NGQsIDB4YzUxMCwgIlNhbXN1bmcgUTQ1IiwgQUxDMjYyX0hJUFBPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzODRlLCAiTGVub3ZvIDMwMDAgeTQxMCIsIEFMQzI2Ml9MRU5PVk9fMzAwMCksCisJU05EX1BDSV9RVUlSSygweDE3ZmYsIDB4MDU2MCwgIkJlbnEgRUQ4IiwgQUxDMjYyX0JFTlFfRUQ4KSwKKwlTTkRfUENJX1FVSVJLKDB4MTdmZiwgMHgwNThkLCAiQmVucSBUMzEtMTYiLCBBTEMyNjJfQkVOUV9UMzEpLAorCVNORF9QQ0lfUVVJUksoMHgxN2ZmLCAweDA1OGYsICJCZW5xIEhpcHBvIiwgQUxDMjYyX0hJUFBPXzEpLAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzI2Ml9wcmVzZXRzW10gPSB7CisJW0FMQzI2Ml9CQVNJQ10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2Ml9iYXNlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEMyNjJfSElQUE9dID0geworCQkubWl4ZXJzID0geyBhbGMyNjJfaGlwcG9fbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGNfaHAxNV91bnNvbF92ZXJic30sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLmRpZ19vdXRfbmlkID0gQUxDMjYyX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjMjYyX2hpcHBvX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzI2Ml9ISVBQT18xXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX2hpcHBvMV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml9oaXBwbzFfdW5zb2xfdmVyYnN9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDIsCisJCS5kaWdfb3V0X25pZCA9IEFMQzI2Ml9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzI2Ml9oaXBwbzFfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjYyX0ZVSklUU1VdID0geworCQkubWl4ZXJzID0geyBhbGMyNjJfZnVqaXRzdV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml9FQVBEX3ZlcmJzLAorCQkJCWFsYzI2Ml9mdWppdHN1X3Vuc29sX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLmRpZ19vdXRfbmlkID0gQUxDMjYyX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9mdWppdHN1X2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjJfZnVqaXRzdV9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKKwl9LAorCVtBTEMyNjJfSFBfQlBDXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX0hQX0JQQ19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX0hQX0JQQ19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX0hQX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjJfaHBfYnBjX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzI2Ml9IUF9CUENfRDcwMDBfV0ZdID0geworCQkubWl4ZXJzID0geyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCisJCS5ocF9uaWQgPSAweDAzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjJfSFBfRDcwMDBfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzI2Ml9ocF93aWxkd2VzdF9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKKwl9LAorCVtBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9taXhlciwKKwkJCSAgICBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X29wdGlvbl9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX0hQX0Q3MDAwX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjJfaHBfd2lsZHdlc3Rfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjYyX0hQX1RDX1Q1NzM1XSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX2hwX3Q1NzM1X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX2hwX3Q1NzM1X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjJfaHBfdDU3MzVfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjYyX0hQX1JQNTcwMF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2Ml9ocF9ycDU3MDBfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfaHBfcnA1NzAwX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjJfaHBfcnA1NzAwX2NhcHR1cmVfc291cmNlLAorICAgICAgICB9LAorCVtBTEMyNjJfQkVOUV9FRDhdID0geworCQkubWl4ZXJzID0geyBhbGMyNjJfYmFzZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml9FQVBEX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzI2Ml9TT05ZX0FTU0FNRF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2Ml9zb255X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX3NvbnlfdW5zb2xfdmVyYnN9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDIsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjMjYyX2hpcHBvX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzI2Ml9CRU5RX1QzMV0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2Ml9iZW5xX3QzMV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml9iZW5xX3QzMV9FQVBEX3ZlcmJzLAorCQkJCWFsY19ocDE1X3Vuc29sX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjJfaGlwcG9fc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjYyX1VMVFJBXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX3VsdHJhX21peGVyIH0sCisJCS5jYXBfbWl4ZXIgPSBhbGMyNjJfdWx0cmFfY2FwdHVyZV9taXhlciwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml91bHRyYV92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX3VsdHJhX2NhcHR1cmVfc291cmNlLAorCQkuYWRjX25pZHMgPSBhbGMyNjJfYWRjX25pZHMsIC8qIEFEQzAgKi8KKwkJLmNhcHNyY19uaWRzID0gYWxjMjYyX2NhcHNyY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gMSwgLyogc2luZ2xlIEFEQyAqLworCQkudW5zb2xfZXZlbnQgPSBhbGMyNjJfdWx0cmFfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGMyNjJfdWx0cmFfYXV0b211dGUsCisJfSwKKwlbQUxDMjYyX0xFTk9WT18zMDAwXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX2xlbm92b18zMDAwX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX0VBUERfdmVyYnMsCisJCQkJYWxjMjYyX2xlbm92b18zMDAwX3Vuc29sX3ZlcmJzLAorCQkJCWFsYzI2Ml9sZW5vdm9fMzAwMF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLmRpZ19vdXRfbmlkID0gQUxDMjYyX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9mdWppdHN1X2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjJfbGVub3ZvXzMwMDBfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjYyX05FQ10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2Ml9uZWNfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9uZWNfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCisJCS5ocF9uaWQgPSAweDAzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDMjYyX1RPU0hJQkFfUzA2XSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX3Rvc2hpYmFfczA2X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX3Rvc2hpYmFfczA2X3ZlcmJzLAorCQkJCQkJCWFsYzI2Ml9lYXBkX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmNhcHNyY19uaWRzID0gYWxjMjYyX2RtaWNfY2Fwc3JjX25pZHMsCisJCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKKwkJLmFkY19uaWRzID0gYWxjMjYyX2RtaWNfYWRjX25pZHMsIC8qIEFEQzAgKi8KKwkJLm51bV9hZGNfbmlkcyA9IDEsIC8qIHNpbmdsZSBBREMgKi8KKwkJLmRpZ19vdXRfbmlkID0gQUxDMjYyX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjJfdG9zaGliYV9zMDZfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjYyX1RPU0hJQkFfUlgxXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX3Rvc2hpYmFfcngxX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX3Rvc2hpYmFfcngxX3Vuc29sX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjJfaGlwcG9fc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjYyX1RZQU5dID0geworCQkubWl4ZXJzID0geyBhbGMyNjJfdHlhbl9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml90eWFuX3ZlcmJzfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCisJCS5ocF9uaWQgPSAweDAyLAorCQkuZGlnX291dF9uaWQgPSBBTEMyNjJfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjJfdHlhbl9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKKwl9LAorfTsKKwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9hbGMyNjhfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzI2OF9xdWlya3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTU4YmYyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9hbGMyNjhfcXVpcmtzLmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qCisgKiBBTEMyNjcvQUxDMjY4IHF1aXJrIG1vZGVscworICogaW5jbHVkZWQgYnkgcGF0Y2hfcmVhbHRlay5jCisgKi8KKworLyogQUxDMjY4IG1vZGVscyAqLworZW51bSB7CisJQUxDMjY4X0FVVE8sCisJQUxDMjY3X1FVQU5UQV9JTDEsCisJQUxDMjY4XzNTVCwKKwlBTEMyNjhfVE9TSElCQSwKKwlBTEMyNjhfQUNFUiwKKwlBTEMyNjhfQUNFUl9ETUlDLAorCUFMQzI2OF9BQ0VSX0FTUElSRV9PTkUsCisJQUxDMjY4X0RFTEwsCisJQUxDMjY4X1pFUFRPLAorI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKwlBTEMyNjhfVEVTVCwKKyNlbmRpZgorCUFMQzI2OF9NT0RFTF9MQVNUIC8qIGxhc3QgdGFnICovCit9OworCisvKgorICogIEFMQzI2OCBjaGFubmVsIHNvdXJjZSBzZXR0aW5nICgyIGNoYW5uZWwpCisgKi8KKyNkZWZpbmUgQUxDMjY4X0RJR09VVF9OSUQJQUxDODgwX0RJR09VVF9OSUQKKyNkZWZpbmUgYWxjMjY4X21vZGVzCQlhbGMyNjBfbW9kZXMKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjhfZGFjX25pZHNbMl0gPSB7CisJLyogZnJvbnQsIGhwICovCisJMHgwMiwgMHgwMworfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjhfYWRjX25pZHNbMl0gPSB7CisJLyogQURDMC0xICovCisJMHgwOCwgMHgwNworfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjhfYWRjX25pZHNfYWx0WzFdID0geworCS8qIEFEQzAgKi8KKwkweDA4Cit9OworCitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OF9jYXBzcmNfbmlkc1syXSA9IHsgMHgyMywgMHgyNCB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2Jhc2VfbWl4ZXJbXSA9IHsKKwkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X3Rvc2hpYmFfbWl4ZXJbXSA9IHsKKwkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgzLCAweDAsIEhEQV9PVVRQVVQpLAorCUFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENILAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgSW4gQm9vc3QgVm9sdW1lIiwgMHgxYSwgMCwgSERBX0lOUFVUKSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY4X2VhcGRfdmVyYnNbXSA9IHsKKwl7MHgxNCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCisJeyB9Cit9OworCisvKiBUb3NoaWJhIHNwZWNpZmljICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF90b3NoaWJhX3ZlcmJzW10gPSB7CisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIEFjZXIgc3BlY2lmaWMgKi8KKy8qIGJpbmQgdm9sdW1lcyBvZiBib3RoIE5JRCAweDAyIGFuZCAweDAzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjMjY4X2FjZXJfYmluZF9tYXN0ZXJfdm9sID0geworCS5vcHMgPSAmc25kX2hkYV9iaW5kX3ZvbCwKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDIsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDMsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyB2b2lkIGFsYzI2OF9hY2VyX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworfQorCisjZGVmaW5lIGFsYzI2OF9hY2VyX21hc3Rlcl9zd19nZXQJYWxjMjYyX2hwX21hc3Rlcl9zd19nZXQKKyNkZWZpbmUgYWxjMjY4X2FjZXJfbWFzdGVyX3N3X3B1dAlhbGMyNjJfaHBfbWFzdGVyX3N3X3B1dAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2FjZXJfYXNwaXJlX29uZV9taXhlcltdID0geworCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCisJSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX05JRF9GTEFHIHwgMHgxNSwKKwkJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAorCQkuZ2V0ID0gYWxjMjY4X2FjZXJfbWFzdGVyX3N3X2dldCwKKwkJLnB1dCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQsCisJfSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgQ2FwdHVyZSBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9hY2VyX21peGVyW10gPSB7CisJLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KKwlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjMjY4X2FjZXJfYmluZF9tYXN0ZXJfdm9sKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCAweDE0LAorCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCisJCS5nZXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfZ2V0LAorCQkucHV0ID0gYWxjMjY4X2FjZXJfbWFzdGVyX3N3X3B1dCwKKwl9LAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgSW4gQm9vc3QgVm9sdW1lIiwgMHgxYSwgMCwgSERBX0lOUFVUKSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfYWNlcl9kbWljX21peGVyW10gPSB7CisJLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KKwlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjMjY4X2FjZXJfYmluZF9tYXN0ZXJfdm9sKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCAweDE0LAorCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCisJCS5nZXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfZ2V0LAorCQkucHV0ID0gYWxjMjY4X2FjZXJfbWFzdGVyX3N3X3B1dCwKKwl9LAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgSW4gQm9vc3QgVm9sdW1lIiwgMHgxYSwgMCwgSERBX0lOUFVUKSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY4X2FjZXJfYXNwaXJlX29uZV92ZXJic1tdID0geworCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDZ9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGEwMTd9LAorCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjhfYWNlcl92ZXJic1tdID0geworCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sIC8qIGludGVybmFsIGRtaWM/ICovCisJezB4MTMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7IH0KK307CisKKy8qIHVuc29saWNpdGVkIGV2ZW50IGZvciBIUCBqYWNrIHNlbnNpbmcgKi8KKyNkZWZpbmUgYWxjMjY4X3Rvc2hpYmFfc2V0dXAJCWFsYzI2Ml9oaXBwb19zZXR1cAorCitzdGF0aWMgdm9pZCBhbGMyNjhfYWNlcl9sY19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OworCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKKwlzcGVjLT5hdXRvX21pYyA9IDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfZGVsbF9taXhlcltdID0geworCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjhfZGVsbF92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX01JQ19FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7IH0KK307CisKKy8qIG11dGUvdW5tdXRlIGludGVybmFsIHNwZWFrZXIgYWNjb3JkaW5nIHRvIHRoZSBocCBqYWNrIGFuZCBtdXRlIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGMyNjhfZGVsbF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKKwlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTk7CisJc3BlYy0+YXV0b19taWMgPSAxOworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2N19xdWFudGFfaWwxX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQ2FwdHVyZSBWb2x1bWUiLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIk1pYyBDYXB0dXJlIFN3aXRjaCIsIDB4MjMsIDIsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjdfcXVhbnRhX2lsMV92ZXJic1tdID0geworCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfTUlDX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCXsgfQorfTsKKworc3RhdGljIHZvaWQgYWxjMjY3X3F1YW50YV9pbDFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OworCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKKwlzcGVjLT5hdXRvX21pYyA9IDE7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOworfQorCisvKgorICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF9iYXNlX2luaXRfdmVyYnNbXSA9IHsKKwkvKiBVbm11dGUgREFDMC0xIGFuZCBzZXQgdm9sID0gMCAqLworCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCisJLyoKKwkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgwYyAtIDB4MGUpCisJICovCisJLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisgICAgICAgIHsweDBlLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCisJezB4MWMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCisJezB4MWQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKworCS8qIHNldCBQQ0JFRVAgdm9sID0gMCwgbXV0ZSBjb25uZWN0aW9ucyAqLworCXsweDFkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisKKwkvKiBVbm11dGUgU2VsZWN0b3IgMjNoLDI0aCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbiAqLworCisJezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCXsgfQorfTsKKworLyogb25seSBmb3IgbW9kZWw9dGVzdCAqLworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKy8qCisgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY4X3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7CisJLyogc2V0IG91dHB1dCBEQUMgKi8KKwl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAorCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAorCXsweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAorCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7IH0KK307CisjZW5kaWYgLyogQ09ORklHX1NORF9ERUJVRyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2NhcHR1cmVfbm9zcmNfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2NhcHR1cmVfYWx0X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCisJX0RFRklORV9DQVBTUkMoMSksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9jYXB0dXJlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMSwgMHgyNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMSwgMHgyNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlfREVGSU5FX0NBUFNSQygyKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjY4X2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA0LAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkZyb250IE1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJCXsgIkNEIiwgMHgzIH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjhfYWNlcl9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMywKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MCB9LAorCQl7ICJJbnRlcm5hbCBNaWMiLCAweDEgfSwKKwkJeyAiTGluZSIsIDB4MiB9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjY4X2FjZXJfZG1pY19jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMywKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MCB9LAorCQl7ICJJbnRlcm5hbCBNaWMiLCAweDYgfSwKKwkJeyAiTGluZSIsIDB4MiB9LAorCX0sCit9OworCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF90ZXN0X21peGVyW10gPSB7CisJLyogVm9sdW1lIHdpZGdldHMgKi8KKwlIREFfQ09ERUNfVk9MVU1FKCJMT1VUMSBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxPVVQyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJNb25vIHN1bSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX01VVEUoIkxJTkUtT1VUIHN1bSBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAyLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX01VVEUoIkhQLU9VVCBzdW0gUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQklORF9NVVRFKCJMSU5FLU9VVCBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAyLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJIUC1PVVQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMiwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNSUMxIENhcHR1cmUgVm9sdW1lIiwgMHgxOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX01VVEUoIk1JQzEgQ2FwdHVyZSBTd2l0Y2giLCAweDE4LCAyLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNSUMyIENhcHR1cmUgVm9sdW1lIiwgMHgxOSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxJTkUxIENhcHR1cmUgVm9sdW1lIiwgMHgxYSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX01VVEUoIkxJTkUxIENhcHR1cmUgU3dpdGNoIiwgMHgxYSwgMiwgSERBX09VVFBVVCksCisJLyogVGhlIGJlbG93IGFwcGVhcnMgcHJvYmxlbWF0aWMgb24gc29tZSBoYXJkd2FyZXMgKi8KKwkvKkhEQV9DT0RFQ19WT0xVTUUoIlBDQkVFUCBQbGF5YmFjayBWb2x1bWUiLCAweDFkLCAweDAsIEhEQV9JTlBVVCksKi8KKwlIREFfQ09ERUNfVk9MVU1FKCJQQ00tSU4xIENhcHR1cmUgVm9sdW1lIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJQQ00tSU4xIENhcHR1cmUgU3dpdGNoIiwgMHgyMywgMiwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiUENNLUlOMiBDYXB0dXJlIFZvbHVtZSIsIDB4MjQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiUENNLUlOMiBDYXB0dXJlIFN3aXRjaCIsIDB4MjQsIDIsIEhEQV9PVVRQVVQpLAorCisJLyogTW9kZXMgZm9yIHJldGFza2luZyBwaW4gd2lkZ2V0cyAqLworCUFMQ19QSU5fTU9ERSgiTElORS1PVVQgcGluIG1vZGUiLCAweDE0LCBBTENfUElOX0RJUl9JTk9VVCksCisJQUxDX1BJTl9NT0RFKCJIUC1PVVQgcGluIG1vZGUiLCAweDE1LCBBTENfUElOX0RJUl9JTk9VVCksCisJQUxDX1BJTl9NT0RFKCJNSUMxIHBpbiBtb2RlIiwgMHgxOCwgQUxDX1BJTl9ESVJfSU5PVVQpLAorCUFMQ19QSU5fTU9ERSgiTElORTEgcGluIG1vZGUiLCAweDFhLCBBTENfUElOX0RJUl9JTk9VVCksCisKKwkvKiBDb250cm9scyBmb3IgR1BJTyBwaW5zLCBhc3N1bWluZyB0aGV5IGFyZSBjb25maWd1cmVkIGFzIG91dHB1dHMgKi8KKwlBTENfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMCIsIDB4MDEsIDB4MDEpLAorCUFMQ19HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAxIiwgMHgwMSwgMHgwMiksCisJQUxDX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDIiLCAweDAxLCAweDA0KSwKKwlBTENfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMyIsIDB4MDEsIDB4MDgpLAorCisJLyogU3dpdGNoZXMgdG8gYWxsb3cgdGhlIGRpZ2l0YWwgU1BESUYgb3V0cHV0IHBpbiB0byBiZSBlbmFibGVkLgorCSAqIFRoZSBBTEMyNjggZG9lcyBub3QgaGF2ZSBhbiBTUERJRiBpbnB1dC4KKwkgKi8KKwlBTENfU1BESUZfQ1RSTF9TV0lUQ0goIlNQRElGIFBsYXliYWNrIFN3aXRjaCIsIDB4MDYsIDB4MDEpLAorCisJLyogQSBzd2l0Y2ggYWxsb3dpbmcgRUFQRCB0byBiZSBlbmFibGVkLiAgU29tZSBsYXB0b3BzIHNlZW0gdG8gdXNlCisJICogdGhpcyBvdXRwdXQgdG8gdHVybiBvbiBhbiBleHRlcm5hbCBhbXBsaWZpZXIuCisJICovCisJQUxDX0VBUERfQ1RSTF9TV0lUQ0goIkxJTkUtT1VUIEVBUEQgRW5hYmxlIFN3aXRjaCIsIDB4MGYsIDB4MDIpLAorCUFMQ19FQVBEX0NUUkxfU1dJVENIKCJIUC1PVVQgRUFQRCBFbmFibGUgU3dpdGNoIiwgMHgxMCwgMHgwMiksCisKKwl7IH0gLyogZW5kICovCit9OworI2VuZGlmCisKKy8qCisgKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGMyNjhfbW9kZWxzW0FMQzI2OF9NT0RFTF9MQVNUXSA9IHsKKwlbQUxDMjY3X1FVQU5UQV9JTDFdCT0gInF1YW50YS1pbDEiLAorCVtBTEMyNjhfM1NUXQkJPSAiM3N0YWNrIiwKKwlbQUxDMjY4X1RPU0hJQkFdCT0gInRvc2hpYmEiLAorCVtBTEMyNjhfQUNFUl0JCT0gImFjZXIiLAorCVtBTEMyNjhfQUNFUl9ETUlDXQk9ICJhY2VyLWRtaWMiLAorCVtBTEMyNjhfQUNFUl9BU1BJUkVfT05FXQk9ICJhY2VyLWFzcGlyZSIsCisJW0FMQzI2OF9ERUxMXQkJPSAiZGVsbCIsCisJW0FMQzI2OF9aRVBUT10JCT0gInplcHRvIiwKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJW0FMQzI2OF9URVNUXQkJPSAidGVzdCIsCisjZW5kaWYKKwlbQUxDMjY4X0FVVE9dCQk9ICJhdXRvIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjhfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMWUsICJBY2VyIEFzcGlyZSA1NzIweiIsIEFMQzI2OF9BQ0VSKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTI2LCAiQWNlciIsIEFMQzI2OF9BQ0VSKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTJlLCAiQWNlciBBc3BpcmUgNTMxMCIsIEFMQzI2OF9BQ0VSKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTMwLCAiQWNlciBFeHRlbnNhIDUyMTAiLCBBTEMyNjhfQUNFUiksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEzNiwgIkFjZXIgQXNwaXJlIDUzMTUiLCBBTEMyNjhfQUNFUiksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDE1YiwgIkFjZXIgQXNwaXJlIE9uZSIsCisJCQkJCQlBTEMyNjhfQUNFUl9BU1BJUkVfT05FKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMjUzLCAiRGVsbCBPRU0iLCBBTEMyNjhfREVMTCksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDJiMCwgIkRlbGwgSW5zcGlyb24gOTEwIiwgQUxDMjY4X0FVVE8pLAorCVNORF9QQ0lfUVVJUktfTUFTSygweDEwMjgsIDB4ZmZmMCwgMHgwMmIwLAorCQkJIkRlbGwgSW5zcGlyb24gTWluaTkvVm9zdHJvIEE5MCIsIEFMQzI2OF9ERUxMKSwKKwkvKiBhbG1vc3QgY29tcGF0aWJsZSB3aXRoIHRvc2hpYmEgYnV0IHdpdGggb3B0aW9uYWwgZGlnaXRhbCBvdXRzOworCSAqIGF1dG8tcHJvYmluZyBzZWVtcyB3b3JraW5nIGZpbmUKKwkgKi8KKwlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MzAwMCwgIkhQIFRYMjV4eCBzZXJpZXMiLAorCQkJICAgQUxDMjY4X0FVVE8pLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyMDUsICJBU1VTIFc3SiIsIEFMQzI2OF8zU1QpLAorCVNORF9QQ0lfUVVJUksoMHgxMTcwLCAweDAwNDAsICJaRVBUTyIsIEFMQzI2OF9aRVBUTyksCisJU05EX1BDSV9RVUlSSygweDE0YzAsIDB4MDAyNSwgIkNPTVBBTCBJRkw5MC9KRkwtOTIiLCBBTEMyNjhfVE9TSElCQSksCisJU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDc3MSwgIlF1YW50YSBJTDEiLCBBTEMyNjdfUVVBTlRBX0lMMSksCisJe30KK307CisKKy8qIFRvc2hpYmEgbGFwdG9wcyBoYXZlIG5vIHVuaXF1ZSBQQ0kgU1NJRCBidXQgb25seSBjb2RlYyBTU0lEICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjY4X3NzaWRfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMGEsICJUT1NISUJBIFgtMjAwIiwgQUxDMjY4X0FVVE8pLAorCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMGUsICJUT1NISUJBIFgtMjAwIEhETUkiLCBBTEMyNjhfQVVUTyksCisJU05EX1BDSV9RVUlSS19NQVNLKDB4MTE3OSwgMHhmZjAwLCAweGZmMDAsICJUT1NISUJBIEEvTHgwNSIsCisJCQkgICBBTEMyNjhfVE9TSElCQSksCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjMjY4X3ByZXNldHNbXSA9IHsKKwlbQUxDMjY3X1FVQU5UQV9JTDFdID0geworCQkubWl4ZXJzID0geyBhbGMyNjdfcXVhbnRhX2lsMV9taXhlciwgYWxjMjY4X2JlZXBfbWl4ZXIsCisJCQkgICAgYWxjMjY4X2NhcHR1cmVfbm9zcmNfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAorCQkJCWFsYzI2N19xdWFudGFfaWwxX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjY4X2RhY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHNfYWx0KSwKKwkJLmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzX2FsdCwKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjdfcXVhbnRhX2lsMV9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKKwl9LAorCVtBTEMyNjhfM1NUXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjY4X2Jhc2VfbWl4ZXIsIGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKKwkJCSAgICBhbGMyNjhfYmVlcF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2OF9kYWNfbmlkcywKKyAgICAgICAgICAgICAgICAubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHNfYWx0KSwKKyAgICAgICAgICAgICAgICAuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAorCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCisJCS5ocF9uaWQgPSAweDAzLAorCQkuZGlnX291dF9uaWQgPSBBTEMyNjhfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjhfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjY4X2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzI2OF9UT1NISUJBXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjY4X3Rvc2hpYmFfbWl4ZXIsIGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKKwkJCSAgICBhbGMyNjhfYmVlcF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCisJCQkJYWxjMjY4X3Rvc2hpYmFfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAorCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAorCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCisJCS5ocF9uaWQgPSAweDAzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjhfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzI2OF90b3NoaWJhX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzI2OF9BQ0VSXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjY4X2FjZXJfbWl4ZXIsIGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKKwkJCSAgICBhbGMyNjhfYmVlcF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCisJCQkJYWxjMjY4X2FjZXJfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAorCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAorCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCisJCS5ocF9uaWQgPSAweDAyLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjhfYWNlcl9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjMjY4X2FjZXJfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjY4X0FDRVJfRE1JQ10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2OF9hY2VyX2RtaWNfbWl4ZXIsIGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKKwkJCSAgICBhbGMyNjhfYmVlcF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCisJCQkJYWxjMjY4X2FjZXJfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAorCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAorCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCisJCS5ocF9uaWQgPSAweDAyLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjhfYWNlcl9kbWljX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjhfYWNlcl9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKKwl9LAorCVtBTEMyNjhfQUNFUl9BU1BJUkVfT05FXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjY4X2FjZXJfYXNwaXJlX29uZV9taXhlciwKKwkJCSAgICBhbGMyNjhfYmVlcF9taXhlciwKKwkJCSAgICBhbGMyNjhfY2FwdHVyZV9ub3NyY19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCisJCQkJYWxjMjY4X2FjZXJfYXNwaXJlX29uZV92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2OF9kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2FkY19uaWRzX2FsdCksCisJCS5hZGNfbmlkcyA9IGFsYzI2OF9hZGNfbmlkc19hbHQsCisJCS5jYXBzcmNfbmlkcyA9IGFsYzI2OF9jYXBzcmNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjhfYWNlcl9sY19zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKKwl9LAorCVtBTEMyNjhfREVMTF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2OF9kZWxsX21peGVyLCBhbGMyNjhfYmVlcF9taXhlciwKKwkJCSAgICBhbGMyNjhfY2FwdHVyZV9ub3NyY19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCisJCQkJYWxjMjY4X2RlbGxfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAorCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAorCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCisJCS5ocF9uaWQgPSAweDAyLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjMjY4X2RlbGxfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjY4X1pFUFRPXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjY4X2Jhc2VfbWl4ZXIsIGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKKwkJCSAgICBhbGMyNjhfYmVlcF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCisJCQkJYWxjMjY4X3Rvc2hpYmFfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAorCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAorCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCisJCS5ocF9uaWQgPSAweDAzLAorCQkuZGlnX291dF9uaWQgPSBBTEMyNjhfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjhfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjY4X2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjhfdG9zaGliYV9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKKwl9LAorI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKwlbQUxDMjY4X1RFU1RdID0geworCQkubWl4ZXJzID0geyBhbGMyNjhfdGVzdF9taXhlciwgYWxjMjY4X2NhcHR1cmVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAorCQkJCWFsYzI2OF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGMyNjhfYmVlcF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjY4X2RhY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHNfYWx0KSwKKwkJLmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzX2FsdCwKKwkJLmNhcHNyY19uaWRzID0gYWxjMjY4X2NhcHNyY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLmRpZ19vdXRfbmlkID0gQUxDMjY4X0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2OF9jYXB0dXJlX3NvdXJjZSwKKwl9LAorI2VuZGlmCit9OworCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2FsYzI2OV9xdWlya3MuYyBiL3NvdW5kL3BjaS9oZGEvYWxjMjY5X3F1aXJrcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZmRjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2FsYzI2OV9xdWlya3MuYwpAQCAtMCwwICsxLDY4MSBAQAorLyoKKyAqIEFMQzI2OS9BTEMyNzAvQUxDMjc1L0FMQzI3NiBxdWlyayBtb2RlbHMKKyAqIGluY2x1ZGVkIGJ5IHBhdGNoX3JlYWx0ZWsuYworICovCisKKy8qIEFMQzI2OSBtb2RlbHMgKi8KK2VudW0geworCUFMQzI2OV9BVVRPLAorCUFMQzI2OV9CQVNJQywKKwlBTEMyNjlfUVVBTlRBX0ZMMSwKKwlBTEMyNjlfQU1JQywKKwlBTEMyNjlfRE1JQywKKwlBTEMyNjlWQl9BTUlDLAorCUFMQzI2OVZCX0RNSUMsCisJQUxDMjY5X0ZVSklUU1UsCisJQUxDMjY5X0xJRkVCT09LLAorCUFMQzI3MV9BQ0VSLAorCUFMQzI2OV9NT0RFTF9MQVNUIC8qIGxhc3QgdGFnICovCit9OworCisvKgorICogIEFMQzI2OSBjaGFubmVsIHNvdXJjZSBzZXR0aW5nICgyIGNoYW5uZWwpCisgKi8KKyNkZWZpbmUgQUxDMjY5X0RJR09VVF9OSUQJQUxDODgwX0RJR09VVF9OSUQKKworI2RlZmluZSBhbGMyNjlfZGFjX25pZHMJCWFsYzI2MF9kYWNfbmlkcworCitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OV9hZGNfbmlkc1sxXSA9IHsKKwkvKiBBREMxICovCisJMHgwOCwKK307CisKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY5X2NhcHNyY19uaWRzWzFdID0geworCTB4MjMsCit9OworCitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OXZiX2FkY19uaWRzWzFdID0geworCS8qIEFEQzEgKi8KKwkweDA5LAorfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjl2Yl9jYXBzcmNfbmlkc1sxXSA9IHsKKwkweDIyLAorfTsKKworI2RlZmluZSBhbGMyNjlfbW9kZXMJCWFsYzI2MF9tb2RlcworI2RlZmluZSBhbGMyNjlfY2FwdHVyZV9zb3VyY2UJYWxjODgwX2xnX2x3X2NhcHR1cmVfc291cmNlCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfYmFzZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5X3F1YW50YV9mbDFfbWl4ZXJbXSA9IHsKKwkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLworCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjhfYWNlcl9iaW5kX21hc3Rlcl92b2wpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAorCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9BTVBfRkxBRywKKwkJLmluZm8gPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfaW5mbywKKwkJLmdldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQsCisJCS5wdXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCisJfSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfbGlmZWJvb2tfbWl4ZXJbXSA9IHsKKwkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLworCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjhfYWNlcl9iaW5kX21hc3Rlcl92b2wpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAorCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9BTVBfRkxBRywKKwkJLmluZm8gPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfaW5mbywKKwkJLmdldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQsCisJCS5wdXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCisJfSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJEb2NrIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJEb2NrIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkRvY2sgTWljIEJvb3N0IFZvbHVtZSIsIDB4MWIsIDAsIEhEQV9JTlBVVCksCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5X2xhcHRvcF9taXhlcltdID0geworCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5dmJfbGFwdG9wX21peGVyW10gPSB7CisJSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfYXN1c19taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfbGFwdG9wX2FuYWxvZ19jYXB0dXJlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfbGFwdG9wX2RpZ2l0YWxfY2FwdHVyZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5dmJfbGFwdG9wX2FuYWxvZ19jYXB0dXJlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjl2Yl9sYXB0b3BfZGlnaXRhbF9jYXB0dXJlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIEZTQyBhbWlsbyAqLworI2RlZmluZSBhbGMyNjlfZnVqaXRzdV9taXhlcglhbGMyNjlfbGFwdG9wX21peGVyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY5X3F1YW50YV9mbDFfdmVyYnNbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKKwl7MHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjlfbGlmZWJvb2tfdmVyYnNbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCisJezB4MWQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7IH0KK307CisKKy8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzI2OV9xdWFudGFfZmwxX3NwZWFrZXJfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYWxjX2hwX2F1dG9tdXRlKGNvZGVjKTsKKworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjAsIDAsCisJCQlBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDBjKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAorCQkJQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDY4MCk7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAorCQkJQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwYyk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMCwgMCwKKwkJCUFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHg0ODApOworfQorCisjZGVmaW5lIGFsYzI2OV9saWZlYm9va19zcGVha2VyX2F1dG9tdXRlIFwKKwlhbGMyNjlfcXVhbnRhX2ZsMV9zcGVha2VyX2F1dG9tdXRlCisKK3N0YXRpYyB2b2lkIGFsYzI2OV9saWZlYm9va19taWNfYXV0b3N3aXRjaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcHJlc2VudF9sYXB0b3A7CisJdW5zaWduZWQgaW50IHByZXNlbnRfZG9jazsKKworCXByZXNlbnRfbGFwdG9wCT0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxOCk7CisJcHJlc2VudF9kb2NrCT0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxYik7CisKKwkvKiBMYXB0b3AgbWljIHBvcnQgb3ZlcnJpZGVzIGRvY2sgbWljIHBvcnQsIGRlc2lnbiBkZWNpc2lvbiAqLworCWlmIChwcmVzZW50X2RvY2spCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjMsIDAsCisJCQkJQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4Myk7CisJaWYgKHByZXNlbnRfbGFwdG9wKQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIzLCAwLAorCQkJCUFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDApOworCWlmICghcHJlc2VudF9kb2NrICYmICFwcmVzZW50X2xhcHRvcCkKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMywgMCwKKwkJCQlBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgxKTsKK30KKworc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgIHVuc2lnbmVkIGludCByZXMpCit7CisJc3dpdGNoIChyZXMgPj4gMjYpIHsKKwljYXNlIEFMQ19IUF9FVkVOVDoKKwkJYWxjMjY5X3F1YW50YV9mbDFfc3BlYWtlcl9hdXRvbXV0ZShjb2RlYyk7CisJCWJyZWFrOworCWNhc2UgQUxDX01JQ19FVkVOVDoKKwkJYWxjX21pY19hdXRvbXV0ZShjb2RlYyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYWxjMjY5X2xpZmVib29rX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQl1bnNpZ25lZCBpbnQgcmVzKQoreworCWlmICgocmVzID4+IDI2KSA9PSBBTENfSFBfRVZFTlQpCisJCWFsYzI2OV9saWZlYm9va19zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDX01JQ19FVkVOVCkKKwkJYWxjMjY5X2xpZmVib29rX21pY19hdXRvc3dpdGNoKGNvZGVjKTsKK30KKworc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKKwlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7CisJc3BlYy0+aW50X21pY19waW4gPSAweDE5OworCXNwZWMtPmF1dG9fbWljID0gMTsKK30KKworc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsYzI2OV9xdWFudGFfZmwxX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCWFsY19taWNfYXV0b211dGUoY29kZWMpOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjlfbGlmZWJvb2tfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMV0gPSAweDFhOworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjlfbGlmZWJvb2tfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsYzI2OV9saWZlYm9va19zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKKwlhbGMyNjlfbGlmZWJvb2tfbWljX2F1dG9zd2l0Y2goY29kZWMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OV9sYXB0b3BfZG1pY19pbml0X3ZlcmJzW10gPSB7CisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDV9LAorCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMjYgfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAxOSB8ICgweDAwIDw8IDgpKX0sCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjlfbGFwdG9wX2FtaWNfaW5pdF92ZXJic1tdID0geworCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKwl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDI2IH0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMWIgfCAoMHgwMCA8PCA4KSl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OXZiX2xhcHRvcF9kbWljX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwNn0sCisJezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAyNiB9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDE5IHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OXZiX2xhcHRvcF9hbWljX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAyNiB9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDE5IHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI3MV9hY2VyX2RtaWNfdmVyYnNbXSA9IHsKKwl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwZH0sCisJezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHg0MDAwfSwKKwl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgNn0sCisJeyB9Cit9OworCitzdGF0aWMgdm9pZCBhbGMyNjlfbGFwdG9wX2FtaWNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKKwlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7CisJc3BlYy0+aW50X21pY19waW4gPSAweDE5OworCXNwZWMtPmF1dG9fbWljID0gMTsKK30KKworc3RhdGljIHZvaWQgYWxjMjY5X2xhcHRvcF9kbWljX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7CisJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OworCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKKwlzcGVjLT5hdXRvX21pYyA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI2OXZiX2xhcHRvcF9hbWljX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7CisJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OworCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKKwlzcGVjLT5hdXRvX21pYyA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI2OXZiX2xhcHRvcF9kbWljX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7CisJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OworCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKKwlzcGVjLT5hdXRvX21pYyA9IDE7Cit9CisKKy8qCisgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY5X2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCisJICovCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCisJLyoKKwkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgwMiAtIDB4MDMpCisJICovCisJLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KKwl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKworCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KKwkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKworCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCS8qIEZJWE1FOiB1c2UgTXV4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLworCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxZCwgMGIgKi8KKwkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KKwl7MHgyMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJLyogc2V0IEVBUEQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAorCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjl2Yl9pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgorCSAqLworCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKworCS8qCisJICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MDIgLSAweDAzKQorCSAqLworCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCisJezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisKKwkvKiBzZXQgdXAgaW5wdXQgYW1wcyBmb3IgYW5hbG9nIGxvb3BiYWNrICovCisJLyogQW1wIEluZGljZXM6IERBQyA9IDAsIG1peGVyID0gMSAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisKKwkvKiBGSVhNRTogdXNlIE11eC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KKwkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWQsIDBiICovCisJLyogSW5wdXQgbWl4ZXIxOiB1bm11dGUgTWljLCBGLU1pYywgTGluZSwgQ0QgaW5wdXRzICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCS8qIHNldCBFQVBEICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKKwl7IH0KK307CisKKy8qCisgKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGMyNjlfbW9kZWxzW0FMQzI2OV9NT0RFTF9MQVNUXSA9IHsKKwlbQUxDMjY5X0JBU0lDXQkJCT0gImJhc2ljIiwKKwlbQUxDMjY5X1FVQU5UQV9GTDFdCQk9ICJxdWFudGEiLAorCVtBTEMyNjlfQU1JQ10JCQk9ICJsYXB0b3AtYW1pYyIsCisJW0FMQzI2OV9ETUlDXQkJCT0gImxhcHRvcC1kbWljIiwKKwlbQUxDMjY5X0ZVSklUU1VdCQk9ICJmdWppdHN1IiwKKwlbQUxDMjY5X0xJRkVCT09LXQkJPSAibGlmZWJvb2siLAorCVtBTEMyNjlfQVVUT10JCQk9ICJhdXRvIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjlfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNiZjgsICJRdWFudGEgRkwxIiwgQUxDMjY5X1FVQU5UQV9GTDEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDA0N2MsICJBQ0VSIFpHQSIsIEFMQzI3MV9BQ0VSKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MzMwLCAiQVNVUyBFZWVwYyBQNzAzIFA5MDBBIiwKKwkJICAgICAgQUxDMjY5X0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwMTMsICJBU1VTIE42MURhIiwgQUxDMjY5VkJfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTExMywgIkFTVVMgTjYzSm4iLCBBTEMyNjlWQl9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTQzLCAiQVNVUyBCNTNmIiwgQUxDMjY5VkJfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTEzMywgIkFTVVMgVUoyMGZ0IiwgQUxDMjY5X0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExODMsICJBU1VTIEs3MkRSIiwgQUxDMjY5VkJfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFiMywgIkFTVVMgSzUyRFIiLCBBTEMyNjlWQl9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWUzLCAiQVNVUyBVMzNKYyIsIEFMQzI2OVZCX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyNzMsICJBU1VTIFVMODBKdCIsIEFMQzI2OVZCX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyODMsICJBU1VTIFU1M0pjIiwgQUxDMjY5X0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyYjMsICJBU1VTIE44MkpWIiwgQUxDMjY5VkJfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTJkMywgIkFTVVMgTjYxSnYiLCBBTEMyNjlfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTNhMywgIkFTVVMgVUwzMFZ0IiwgQUxDMjY5X0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzNzMsICJBU1VTIEc3M0pYIiwgQUxDMjY5X0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzODMsICJBU1VTIFVKMzBKYyIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2QzLCAiQVNVUyBONjFKQSIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNDEzLCAiQVNVUyBVTDUwIiwgQUxDMjY5X0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE0NDMsICJBU1VTIFVMMzAiLCBBTEMyNjlfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ1MywgIkFTVVMgTTYwSnYiLCBBTEMyNjlfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ4MywgIkFTVVMgVUw4MCIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNGYzLCAiQVNVUyBGODNWZiIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNGUzLCAiQVNVUyBVTDIwIiwgQUxDMjY5X0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1MTMsICJBU1VTIFVYMzAiLCBBTEMyNjlfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTU5MywgIkFTVVMgTjUxVm4iLCBBTEMyNjlfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVhMywgIkFTVVMgTjYwSnYiLCBBTEMyNjlfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTViMywgIkFTVVMgTjYwRHAiLCBBTEMyNjlfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVjMywgIkFTVVMgTjcwRGUiLCBBTEMyNjlfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVlMywgIkFTVVMgRjgzVCIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjQzLCAiQVNVUyBNNjBKIiwgQUxDMjY5X0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2NTMsICJBU1VTIFU1MCIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjkzLCAiQVNVUyBGNTBOIiwgQUxDMjY5X0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2YTMsICJBU1VTIEY1USIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNmUzLCAiQVNVUyBVWDUwIiwgQUxDMjY5X0RNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3MjMsICJBU1VTIFA4MCIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNzQzLCAiQVNVUyBVODAiLCBBTEMyNjlfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc3MywgIkFTVVMgVTIwQSIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODgzLCAiQVNVUyBGODFTZSIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MzFhLCAiQVNVUyBFZWVwYyBQOTAxIiwKKwkJICAgICAgQUxDMjY5X0RNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgzNGEsICJBU1VTIEVlZXBjIFMxMDEiLAorCQkgICAgICBBTEMyNjlfRE1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODM5OCwgIkFTVVMgUDEwMDVIQSIsIEFMQzI2OV9ETUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4M2NlLCAiQVNVUyBQMTAwNUhBIiwgQUxDMjY5X0RNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwNzEsICJTb255IFZBSU8iLCBBTEMyNjlfQVVUTyksCisJU05EX1BDSV9RVUlSSygweDEwY2YsIDB4MTQ3NSwgIkxpZmVib29rIElDSDlNLWJhc2VkIiwgQUxDMjY5X0xJRkVCT09LKSwKKwlTTkRfUENJX1FVSVJLKDB4MTUyZCwgMHgxNzc4LCAiUXVhbnRhIE9OMSIsIEFMQzI2OV9ETUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTczNCwgMHgxMTVkLCAiRlNDIEFtaWxvIiwgQUxDMjY5X0ZVSklUU1UpLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNiZTksICJRdWFudGEgV2lzdHJvbiIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYmY4LCAiUXVhbnRhIEZMMSIsIEFMQzI2OV9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdmZiwgMHgwNTlhLCAiUXVhbnRhIEVMMyIsIEFMQzI2OV9ETUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdmZiwgMHgwNTliLCAiUXVhbnRhIEpSMSIsIEFMQzI2OV9ETUlDKSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfY29uZmlnX3ByZXNldCBhbGMyNjlfcHJlc2V0c1tdID0geworCVtBTEMyNjlfQkFTSUNdID0geworCQkubWl4ZXJzID0geyBhbGMyNjlfYmFzZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY5X2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCisJCS5ocF9uaWQgPSAweDAzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjlfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDMjY5X1FVQU5UQV9GTDFdID0geworCQkubWl4ZXJzID0geyBhbGMyNjlfcXVhbnRhX2ZsMV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY5X2luaXRfdmVyYnMsIGFsYzI2OV9xdWFudGFfZmwxX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjY5X2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OV9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjY5X2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGMyNjlfcXVhbnRhX2ZsMV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjMjY5X3F1YW50YV9mbDFfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGMyNjlfcXVhbnRhX2ZsMV9pbml0X2hvb2ssCisJfSwKKwlbQUxDMjY5X0FNSUNdID0geworCQkubWl4ZXJzID0geyBhbGMyNjlfbGFwdG9wX21peGVyIH0sCisJCS5jYXBfbWl4ZXIgPSBhbGMyNjlfbGFwdG9wX2FuYWxvZ19jYXB0dXJlX21peGVyLAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY5X2luaXRfdmVyYnMsCisJCQkJYWxjMjY5X2xhcHRvcF9hbWljX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCisJCS5ocF9uaWQgPSAweDAzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjMjY5X2xhcHRvcF9hbWljX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzI2OV9ETUlDXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjY5X2xhcHRvcF9taXhlciB9LAorCQkuY2FwX21peGVyID0gYWxjMjY5X2xhcHRvcF9kaWdpdGFsX2NhcHR1cmVfbWl4ZXIsCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjlfaW5pdF92ZXJicywKKwkJCQlhbGMyNjlfbGFwdG9wX2RtaWNfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjlfbGFwdG9wX2RtaWNfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjY5VkJfQU1JQ10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2OXZiX2xhcHRvcF9taXhlciB9LAorCQkuY2FwX21peGVyID0gYWxjMjY5dmJfbGFwdG9wX2FuYWxvZ19jYXB0dXJlX21peGVyLAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY5dmJfaW5pdF92ZXJicywKKwkJCQlhbGMyNjl2Yl9sYXB0b3BfYW1pY19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjY5X2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OV9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzI2OXZiX2xhcHRvcF9hbWljX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzI2OVZCX0RNSUNdID0geworCQkubWl4ZXJzID0geyBhbGMyNjl2Yl9sYXB0b3BfbWl4ZXIgfSwKKwkJLmNhcF9taXhlciA9IGFsYzI2OXZiX2xhcHRvcF9kaWdpdGFsX2NhcHR1cmVfbWl4ZXIsCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjl2Yl9pbml0X3ZlcmJzLAorCQkJCWFsYzI2OXZiX2xhcHRvcF9kbWljX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCisJCS5ocF9uaWQgPSAweDAzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjMjY5dmJfbGFwdG9wX2RtaWNfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjY5X0ZVSklUU1VdID0geworCQkubWl4ZXJzID0geyBhbGMyNjlfZnVqaXRzdV9taXhlciB9LAorCQkuY2FwX21peGVyID0gYWxjMjY5X2xhcHRvcF9kaWdpdGFsX2NhcHR1cmVfbWl4ZXIsCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjlfaW5pdF92ZXJicywKKwkJCQlhbGMyNjlfbGFwdG9wX2RtaWNfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGMyNjlfbGFwdG9wX2RtaWNfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjY5X0xJRkVCT09LXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjY5X2xpZmVib29rX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjlfaW5pdF92ZXJicywgYWxjMjY5X2xpZmVib29rX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjY5X2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OV9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjY5X2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGMyNjlfbGlmZWJvb2tfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzI2OV9saWZlYm9va19zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsYzI2OV9saWZlYm9va19pbml0X2hvb2ssCisJfSwKKwlbQUxDMjcxX0FDRVJdID0geworCQkubWl4ZXJzID0geyBhbGMyNjlfYXN1c19taXhlciB9LAorCQkuY2FwX21peGVyID0gYWxjMjY5dmJfbGFwdG9wX2RpZ2l0YWxfY2FwdHVyZV9taXhlciwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OV9pbml0X3ZlcmJzLCBhbGMyNzFfYWNlcl9kbWljX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjY5X2RhY19uaWRzLAorCQkuYWRjX25pZHMgPSBhbGMyNjJfZG1pY19hZGNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RtaWNfYWRjX25pZHMpLAorCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjJfZG1pY19jYXBzcmNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OV9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjY5X2NhcHR1cmVfc291cmNlLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjMjY5dmJfbGFwdG9wX2RtaWNfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKK307CisKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjNjYyX3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGM2NjJfcXVpcmtzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5YTZlYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvYWxjNjYyX3F1aXJrcy5jCkBAIC0wLDAgKzEsMTQwOCBAQAorLyoKKyAqIEFMQzY2Mi9BTEM2NjMvQUxDNjY1L0FMQzY3MCBxdWlyayBtb2RlbHMKKyAqIGluY2x1ZGVkIGJ5IHBhdGNoX3JlYWx0ZWsuYworICovCisKKy8qIEFMQzY2MiBtb2RlbHMgKi8KK2VudW0geworCUFMQzY2Ml9BVVRPLAorCUFMQzY2Ml8zU1RfMmNoX0RJRywKKwlBTEM2NjJfM1NUXzZjaF9ESUcsCisJQUxDNjYyXzNTVF82Y2gsCisJQUxDNjYyXzVTVF9ESUcsCisJQUxDNjYyX0xFTk9WT18xMDFFLAorCUFMQzY2Ml9BU1VTX0VFRVBDX1A3MDEsCisJQUxDNjYyX0FTVVNfRUVFUENfRVAyMCwKKwlBTEM2NjNfQVNVU19NNTFWQSwKKwlBTEM2NjNfQVNVU19HNzFWLAorCUFMQzY2M19BU1VTX0gxMywKKwlBTEM2NjNfQVNVU19HNTBWLAorCUFMQzY2Ml9FQ1MsCisJQUxDNjYzX0FTVVNfTU9ERTEsCisJQUxDNjYyX0FTVVNfTU9ERTIsCisJQUxDNjYzX0FTVVNfTU9ERTMsCisJQUxDNjYzX0FTVVNfTU9ERTQsCisJQUxDNjYzX0FTVVNfTU9ERTUsCisJQUxDNjYzX0FTVVNfTU9ERTYsCisJQUxDNjYzX0FTVVNfTU9ERTcsCisJQUxDNjYzX0FTVVNfTU9ERTgsCisJQUxDMjcyX0RFTEwsCisJQUxDMjcyX0RFTExfWk0xLAorCUFMQzI3Ml9TQU1TVU5HX05DMTAsCisJQUxDNjYyX01PREVMX0xBU1QsCit9OworCisjZGVmaW5lIEFMQzY2Ml9ESUdPVVRfTklECTB4MDYKKyNkZWZpbmUgQUxDNjYyX0RJR0lOX05JRAkweDBhCisKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjYyX2RhY19uaWRzWzNdID0geworCS8qIGZyb250LCByZWFyLCBjbGZlICovCisJMHgwMiwgMHgwMywgMHgwNAorfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNzJfZGFjX25pZHNbMl0gPSB7CisJMHgwMiwgMHgwMworfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM2NjJfYWRjX25pZHNbMl0gPSB7CisJLyogQURDMS0yICovCisJMHgwOSwgMHgwOAorfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNzJfYWRjX25pZHNbMV0gPSB7CisJLyogQURDMS0yICovCisJMHgwOCwKK307CisKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjYyX2NhcHNyY19uaWRzWzJdID0geyAweDIyLCAweDIzIH07CitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI3Ml9jYXBzcmNfbmlkc1sxXSA9IHsgMHgyMyB9OworCisKKy8qIGlucHV0IE1VWCAqLworLyogRklYTUU6IHNob3VsZCBiZSBhIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM2NjJfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDQsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDAgfSwKKwkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCisJCXsgIkxpbmUiLCAweDIgfSwKKwkJeyAiQ0QiLCAweDQgfSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzY2Ml9sZW5vdm9fMTAxZV9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMiwKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM2NjNfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDMsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDAgfSwKKwkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCisJCXsgIkxpbmUiLCAweDIgfSwKKwl9LAorfTsKKworI2lmIDAgLyogc2V0IHRvIDEgZm9yIHRlc3Rpbmcgb3RoZXIgaW5wdXQgc291cmNlcyBiZWxvdyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI3Ml9uYzEwX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSAxNiwKKwkuaXRlbXMgPSB7CisJCXsgIkF1dG9zZWxlY3QgTWljIiwgMHgwIH0sCisJCXsgIkludGVybmFsIE1pYyIsIDB4MSB9LAorCQl7ICJJbi0weDAyIiwgMHgyIH0sCisJCXsgIkluLTB4MDMiLCAweDMgfSwKKwkJeyAiSW4tMHgwNCIsIDB4NCB9LAorCQl7ICJJbi0weDA1IiwgMHg1IH0sCisJCXsgIkluLTB4MDYiLCAweDYgfSwKKwkJeyAiSW4tMHgwNyIsIDB4NyB9LAorCQl7ICJJbi0weDA4IiwgMHg4IH0sCisJCXsgIkluLTB4MDkiLCAweDkgfSwKKwkJeyAiSW4tMHgwYSIsIDB4MGEgfSwKKwkJeyAiSW4tMHgwYiIsIDB4MGIgfSwKKwkJeyAiSW4tMHgwYyIsIDB4MGMgfSwKKwkJeyAiSW4tMHgwZCIsIDB4MGQgfSwKKwkJeyAiSW4tMHgwZSIsIDB4MGUgfSwKKwkJeyAiSW4tMHgwZiIsIDB4MGYgfSwKKwl9LAorfTsKKyNlbmRpZgorCisvKgorICogMmNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzY2Ml8zU1RfMmNoX21vZGVzWzFdID0geworCXsgMiwgTlVMTCB9Cit9OworCisvKgorICogMmNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfM1NUX2NoMl9pbml0W10gPSB7CisJeyAweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiA2Y2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml8zU1RfY2g2X2luaXRbXSA9IHsKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM2NjJfM1NUXzZjaF9tb2Rlc1syXSA9IHsKKwl7IDIsIGFsYzY2Ml8zU1RfY2gyX2luaXQgfSwKKwl7IDYsIGFsYzY2Ml8zU1RfY2g2X2luaXQgfSwKK307CisKKy8qCisgKiAyY2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9zaXhzdGFja19jaDZfaW5pdFtdID0geworCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCisJeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKKwl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiA2Y2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9zaXhzdGFja19jaDhfaW5pdFtdID0geworCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM2NjJfNXN0YWNrX21vZGVzWzJdID0geworCXsgMiwgYWxjNjYyX3NpeHN0YWNrX2NoNl9pbml0IH0sCisJeyA2LCBhbGM2NjJfc2l4c3RhY2tfY2g4X2luaXQgfSwKK307CisKKy8qIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBSZWFyPTB4MTUsIENMRkU9MHgxNiwgU2lkZT0weDE3CisgKiAgICAgICAgICAgICAgICAgTWljPTB4MTgsIEZyb250IE1pYz0weDE5LCBMaW5lLUluPTB4MWEsIEhQPTB4MWIKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2Jhc2VfbWl4ZXJbXSA9IHsKKwkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCisJLypJbnB1dCBtaXhlciBjb250cm9sICovCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4YiwgMHg0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4YiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHhiLCAweDAxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfM1NUXzJjaF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml8zU1RfNmNoX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2xlbm92b18xMDFlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml9lZWVwY19wNzAxX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCisJQUxDMjYyX0hJUFBPX01BU1RFUl9TV0lUQ0gsCisKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2VlZXBjX2VwMjBfbWl4ZXJbXSA9IHsKKwlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIk11dGVDdHJsIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sID0geworCS5vcHMgPSAmc25kX2hkYV9iaW5kX3ZvbCwKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDIsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDMsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM2NjNfYXN1c19vbmVfYmluZF9zd2l0Y2ggPSB7CisJLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCisJLnZhbHVlcyA9IHsKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDIxLCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJMAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYzX201MXZhX21peGVyW10gPSB7CisJSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzY2M19hc3VzX2JpbmRfbWFzdGVyX3ZvbCksCisJSERBX0JJTkRfU1coIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAmYWxjNjYzX2FzdXNfb25lX2JpbmRfc3dpdGNoKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM2NjNfYXN1c190cmVlX2JpbmRfc3dpdGNoID0geworCS5vcHMgPSAmc25kX2hkYV9iaW5kX3N3LAorCS52YWx1ZXMgPSB7CisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNSwgMywgMCwgSERBX09VVFBVVCksCisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgyMSwgMywgMCwgSERBX09VVFBVVCksCisJCTAKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2M190d29faHBfbTFfbWl4ZXJbXSA9IHsKKwlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sKSwKKwlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190cmVlX2JpbmRfc3dpdGNoKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkYtTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRi1NaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX2ZvdXJfYmluZF9zd2l0Y2ggPSB7CisJLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCisJLnZhbHVlcyA9IHsKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE1LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJMAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYzX3R3b19ocF9tMl9taXhlcltdID0geworCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAorCUhEQV9CSU5EX1NXKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgJmFsYzY2M19hc3VzX2ZvdXJfYmluZF9zd2l0Y2gpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRi1NaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGLU1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml8xYmpkX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRi1NaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGLU1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX3R3b19iaW5kX21hc3Rlcl92b2wgPSB7CisJLm9wcyA9ICZzbmRfaGRhX2JpbmRfdm9sLAorCS52YWx1ZXMgPSB7CisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwMiwgMywgMCwgSERBX09VVFBVVCksCisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwNCwgMywgMCwgSERBX09VVFBVVCksCisJCTAKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX3R3b19iaW5kX3N3aXRjaCA9IHsKKwkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTQsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTYsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfYXN1c18yMWpkX2NsZmVfbWl4ZXJbXSA9IHsKKwlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLAorCQkJCSZhbGM2NjNfYXN1c190d29fYmluZF9tYXN0ZXJfdm9sKSwKKwlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190d29fYmluZF9zd2l0Y2gpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgyMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfYXN1c18xNWpkX2NsZmVfbWl4ZXJbXSA9IHsKKwlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sKSwKKwlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190d29fYmluZF9zd2l0Y2gpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfZzcxdl9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfZzUwdl9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgyMSwgMHgwLCBIREFfT1VUUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfbW9kZTdfOF9hbGxfYmluZF9zd2l0Y2ggPSB7CisJLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCisJLnZhbHVlcyA9IHsKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE1LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE3LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDIxLCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJMAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfbW9kZTdfOF9zcF9iaW5kX3N3aXRjaCA9IHsKKwkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTQsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTcsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfbW9kZTdfbWl4ZXJbXSA9IHsKKwlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X2FsbF9iaW5kX3N3aXRjaCksCisJSERBX0JJTkRfVk9MKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAorCUhEQV9CSU5EX1NXKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X3NwX2JpbmRfc3dpdGNoKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lMSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUyIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50TWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50TWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfbW9kZThfbWl4ZXJbXSA9IHsKKwlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X2FsbF9iaW5kX3N3aXRjaCksCisJSERBX0JJTkRfVk9MKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAorCUhEQV9CSU5EX1NXKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X3NwX2JpbmRfc3dpdGNoKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lMSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUyIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfY2htb2RlX21peGVyW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfaW5pdF92ZXJic1tdID0geworCS8qIEFEQzogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKworCS8qIEZyb250IFBpbjogb3V0cHV0IDAgKDB4MGMpICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCS8qIFJlYXIgUGluOiBvdXRwdXQgMSAoMHgwZCkgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCisJLyogQ0xGRSBQaW46IG91dHB1dCAyICgweDBlKSAqLworCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisKKwkvKiBNaWMgKHJlYXIpIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIExpbmUgSW4gcGluOiBpbnB1dCAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogTGluZS0yIEluOiBIZWFkcGhvbmUgb3V0cHV0IChvdXRwdXQgMCAtIDB4MGMpICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCisJLyogRklYTUU6IHVzZSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCisJLyogTWl4ZXIgZWxlbWVudHM6IDB4MTgsIDE5LCAxYSwgMWIsIDFjLCAxZCwgMTQsIDE1LCAxNiwgMTcsIDBiICovCisJLyogSW5wdXQgbWl4ZXIgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lYXBkX2luaXRfdmVyYnNbXSA9IHsKKwkvKiBhbHdheXMgdHJ1biBvbiBFQVBEICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAorCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfc3VlX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTnxBTENfRlJPTlRfRVZFTlR9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQ19IUF9FVkVOVH0sCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyX2VlZXBjX3N1ZV9pbml0X3ZlcmJzW10gPSB7CisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJe30KK307CisKKy8qIFNldCBVbnNvbGljaXRlZCBFdmVudCovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lZWVwY19lcDIwX3N1ZV9pbml0X3ZlcmJzW10gPSB7CisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19tNTF2YV9pbml0X3ZlcmJzW10gPSB7CisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDkpfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjNfMjFqZF9hbWljX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyXzFiamRfYW1pY19pbml0X3ZlcmJzW10gPSB7CisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwJLyogSGVhZHBob25lICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzXzE1amRfYW1pY19pbml0X3ZlcmJzW10gPSB7CisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCS8qIEhlYWRwaG9uZSAqLworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M190d29faHBfYW1pY19tMV9pbml0X3ZlcmJzW10gPSB7CisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAkvKiBIZWFkcGhvbmUgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAkvKiBIZWFkcGhvbmUgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX3R3b19ocF9hbWljX20yX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19nNzF2X2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCS8qIHsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sICovCisJLyogezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgKi8gLyogSGVhZHBob25lICovCisKKwl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwJLyogSGVhZHBob25lICovCisKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTnxBTENfRlJPTlRfRVZFTlR9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQ19NSUNfRVZFTlR9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQ19IUF9FVkVOVH0sCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX2c1MHZfaW5pdF92ZXJic1tdID0geworCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAkvKiBIZWFkcGhvbmUgKi8KKworCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lY3NfaW5pdF92ZXJic1tdID0geworCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMWZ9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjcyX2RlbGxfem0xX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDkpfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNzJfZGVsbF9pbml0X3ZlcmJzW10gPSB7CisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX21vZGU3X2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCisJezB4MTksIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19tb2RlOF9pbml0X3ZlcmJzW10gPSB7CisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjcyX2F1dG9fY2FwdHVyZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgdm9pZCBhbGM2NjJfbGVub3ZvXzEwMWVfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOworCXNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5kZXRlY3RfbGluZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbGluZXMgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworfQorCitzdGF0aWMgdm9pZCBhbGM2NjJfZWVlcGNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlhbGMyNjJfaGlwcG8xX3NldHVwKGNvZGVjKTsKKwlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7CisJc3BlYy0+aW50X21pY19waW4gPSAweDE5OworCXNwZWMtPmF1dG9fbWljID0gMTsKK30KKworc3RhdGljIHZvaWQgYWxjNjYyX2VlZXBjX2VwMjBfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxYjsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzY2M19tNTF2YV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDIxOworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOworCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKKwlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTI7CisJc3BlYy0+YXV0b19taWMgPSAxOworfQorCisvKiAqKioqKioqKioqKioqKioqKiBNb2RlMSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBhbGM2NjNfbW9kZTFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgyMTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKKwlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7CisJc3BlYy0+aW50X21pY19waW4gPSAweDE5OworCXNwZWMtPmF1dG9fbWljID0gMTsKK30KKworLyogKioqKioqKioqKioqKioqKiogTW9kZTIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWxjNjYyX21vZGUyX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKKwlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7CisJc3BlYy0+aW50X21pY19waW4gPSAweDE5OworCXNwZWMtPmF1dG9fbWljID0gMTsKK30KKworLyogKioqKioqKioqKioqKioqKiogTW9kZTMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWxjNjYzX21vZGUzX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7CisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOworCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKKwlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTk7CisJc3BlYy0+YXV0b19taWMgPSAxOworfQorCisvKiAqKioqKioqKioqKioqKioqKiBNb2RlNCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBhbGM2NjNfbW9kZTRfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgyMTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OworCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7CisJc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzFdID0gMHgwZTsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKKwlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7CisJc3BlYy0+aW50X21pY19waW4gPSAweDE5OworCXNwZWMtPmF1dG9fbWljID0gMTsKK30KKworLyogKioqKioqKioqKioqKioqKiogTW9kZTUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWxjNjYzX21vZGU1X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKKwlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOworCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFsxXSA9IDB4MGU7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7CisJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OworCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKKwlzcGVjLT5hdXRvX21pYyA9IDE7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqIE1vZGU2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFsYzY2M19tb2RlNl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7CisJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OworCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKKwlzcGVjLT5hdXRvX21pYyA9IDE7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqIE1vZGU3ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFsYzY2M19tb2RlN19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNzsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47CisJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OworCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKKwlzcGVjLT5hdXRvX21pYyA9IDE7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqIE1vZGU4ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFsYzY2M19tb2RlOF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDIxOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1sxXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNzsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47CisJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OworCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKKwlzcGVjLT5hdXRvX21pYyA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzY2M19nNzF2X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7CisJc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCXNwZWMtPmRldGVjdF9saW5lID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9saW5lcyA9IDE7CisJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OworCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKKwlzcGVjLT5hdXRvX21pYyA9IDE7Cit9CisKKyNkZWZpbmUgYWxjNjYzX2c1MHZfc2V0dXAJYWxjNjYzX201MXZhX3NldHVwCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfZWNzX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCisJQUxDMjYyX0hJUFBPX01BU1RFUl9TV0lUQ0gsCisKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMvTGluZUluIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljL0xpbmVJbiBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYy9MaW5lSW4gUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjcyX25jMTBfbWl4ZXJbXSA9IHsKKwkvKiBNYXN0ZXIgUGxheWJhY2sgYXV0b21hdGljYWxseSBjcmVhdGVkIGZyb20gU3BlYWtlciBhbmQgSGVhZHBob25lICovCisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworCisvKgorICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0CisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjNjYyX21vZGVsc1tBTEM2NjJfTU9ERUxfTEFTVF0gPSB7CisJW0FMQzY2Ml8zU1RfMmNoX0RJR10JPSAiM3N0YWNrLWRpZyIsCisJW0FMQzY2Ml8zU1RfNmNoX0RJR10JPSAiM3N0YWNrLTZjaC1kaWciLAorCVtBTEM2NjJfM1NUXzZjaF0JPSAiM3N0YWNrLTZjaCIsCisJW0FMQzY2Ml81U1RfRElHXQk9ICI1c3RhY2stZGlnIiwKKwlbQUxDNjYyX0xFTk9WT18xMDFFXQk9ICJsZW5vdm8tMTAxZSIsCisJW0FMQzY2Ml9BU1VTX0VFRVBDX1A3MDFdID0gImVlZXBjLXA3MDEiLAorCVtBTEM2NjJfQVNVU19FRUVQQ19FUDIwXSA9ICJlZWVwYy1lcDIwIiwKKwlbQUxDNjYyX0VDU10gPSAiZWNzIiwKKwlbQUxDNjYzX0FTVVNfTTUxVkFdID0gIm01MXZhIiwKKwlbQUxDNjYzX0FTVVNfRzcxVl0gPSAiZzcxdiIsCisJW0FMQzY2M19BU1VTX0gxM10gPSAiaDEzIiwKKwlbQUxDNjYzX0FTVVNfRzUwVl0gPSAiZzUwdiIsCisJW0FMQzY2M19BU1VTX01PREUxXSA9ICJhc3VzLW1vZGUxIiwKKwlbQUxDNjYyX0FTVVNfTU9ERTJdID0gImFzdXMtbW9kZTIiLAorCVtBTEM2NjNfQVNVU19NT0RFM10gPSAiYXN1cy1tb2RlMyIsCisJW0FMQzY2M19BU1VTX01PREU0XSA9ICJhc3VzLW1vZGU0IiwKKwlbQUxDNjYzX0FTVVNfTU9ERTVdID0gImFzdXMtbW9kZTUiLAorCVtBTEM2NjNfQVNVU19NT0RFNl0gPSAiYXN1cy1tb2RlNiIsCisJW0FMQzY2M19BU1VTX01PREU3XSA9ICJhc3VzLW1vZGU3IiwKKwlbQUxDNjYzX0FTVVNfTU9ERThdID0gImFzdXMtbW9kZTgiLAorCVtBTEMyNzJfREVMTF0JCT0gImRlbGwiLAorCVtBTEMyNzJfREVMTF9aTTFdCT0gImRlbGwtem0xIiwKKwlbQUxDMjcyX1NBTVNVTkdfTkMxMF0JPSAic2Ftc3VuZy1uYzEwIiwKKwlbQUxDNjYyX0FVVE9dCQk9ICJhdXRvIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM2NjJfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweDkwODcsICJFQ1MiLCBBTEM2NjJfRUNTKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMmQ2LCAiREVMTCIsIEFMQzI3Ml9ERUxMKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMmY0LCAiREVMTCBaTTEiLCBBTEMyNzJfREVMTF9aTTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwMDAsICJBU1VTIE41MFZtIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwOTIsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExNzMsICJBU1VTIEs3M0puIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExYzMsICJBU1VTIE03MFYiLCBBTEM2NjNfQVNVU19NT0RFMyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFkMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFmMywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTIwMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMwMywgIkFTVVMgRzYwSiIsIEFMQzY2M19BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzMzLCAiQVNVUyBHNjBKeCIsIEFMQzY2M19BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzM5LCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2UzLCAiQVNVUyBONzFKQSIsIEFMQzY2M19BU1VTX01PREU3KSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNDYzLCAiQVNVUyBONzEiLCBBTEM2NjNfQVNVU19NT0RFNyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTRkMywgIkFTVVMgRzcyIiwgQUxDNjYzX0FTVVNfTU9ERTgpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1NjMsICJBU1VTIE45MCIsIEFMQzY2M19BU1VTX01PREUzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNWQzLCAiQVNVUyBONTBTRiBGNTBTRiIsIEFMQzY2M19BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNmMzLCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNmYzLCAiQVNVUyBLNDBDIEs1MEMiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTczMywgIkFTVVMgTjgxRGUiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc1MywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc2MywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFNiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc2NSwgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFNiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc4MywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc5MywgIkFTVVMgRjUwR1giLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTdiMywgIkFTVVMgRjcwU0wiLCBBTEM2NjNfQVNVU19NT0RFMyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTdjMywgIkFTVVMgVVgyMCIsIEFMQzY2M19BU1VTX001MVZBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxN2YzLCAiQVNVUyBYNThMRSIsIEFMQzY2Ml9BU1VTX01PREUyKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODEzLCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODIzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREU1KSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODMzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREU2KSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODQzLCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODUzLCAiQVNVUyBGNTBaIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NjQsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NzYsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NzgsICJBU1VTIE01MVZBIiwgQUxDNjYzX0FTVVNfTTUxVkEpLAorCS8qU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg3OCwgIkFTVVMgTTUwVnIiLCBBTEM2NjNfQVNVU19NT0RFMSksKi8KKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODkzLCAiQVNVUyBNNTBWbSIsIEFMQzY2M19BU1VTX01PREUzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODk0LCAiQVNVUyBYNTUiLCBBTEM2NjNfQVNVU19NT0RFMyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MThiMywgIkFTVVMgTjgwVmMiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MThjMywgIkFTVVMgVlg1IiwgQUxDNjYzX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4ZDMsICJBU1VTIE44MVRlIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4ZjMsICJBU1VTIE41MDVUcCIsIEFMQzY2M19BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTAzLCAiQVNVUyBGNUdMIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5MTMsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5MzMsICJBU1VTIEY4MFEiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk0MywgIkFTVVMgVngzViIsIEFMQzY2M19BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTUzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTYzLCAiQVNVUyBYNzFDIiwgQUxDNjYzX0FTVVNfTU9ERTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5ODMsICJBU1VTIE41MDUxQSIsIEFMQzY2M19BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTkzLCAiQVNVUyBOMjAiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTlhMywgIkFTVVMgRzUwViIsIEFMQzY2M19BU1VTX0c1MFYpLAorCS8qU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTlhMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksKi8KKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWIzLCAiQVNVUyBGN1oiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTljMywgIkFTVVMgRjVaL0Y2eCIsIEFMQzY2Ml9BU1VTX01PREUyKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWQzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX001MVZBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWUzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWYzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREU0KSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MjkwLCAiQVNVUyBQNUdDLU1YIiwgQUxDNjYyXzNTVF82Y2hfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MmExLCAiQVNVUyBFZWVwYyIsIEFMQzY2Ml9BU1VTX0VFRVBDX1A3MDEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgyZDEsICJBU1VTIEVlZXBjIEVQMjAiLCBBTEM2NjJfQVNVU19FRUVQQ19FUDIwKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA1YiwgMHgwY2Q2LCAiRm94Y29ubiIsIEFMQzY2Ml9FQ1MpLAorCVNORF9QQ0lfUVVJUksoMHgxMDViLCAweDBkNDcsICJGb3hjb25uIDQ1Q01YLzQ1R01YLzQ1Q01YLUsiLAorCQkgICAgICBBTEM2NjJfM1NUXzZjaF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmNmUsICJUb3NoaWJhIE5CMjB4IiwgQUxDNjYyX0FVVE8pLAorCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGNhMDAsICJTYW1zdW5nIE5DMTAiLCBBTEMyNzJfU0FNU1VOR19OQzEwKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ1OCwgMHhhMDAyLCAiR2lnYWJ5dGUgOTQ1R0NNLVMyTCIsCisJCSAgICAgIEFMQzY2Ml8zU1RfNmNoX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MjMwNCwgIlF1YW50YSBXSDEiLCBBTEM2NjNfQVNVU19IMTMpLAorCVNORF9QQ0lfUVVJUksoMHgxNTY1LCAweDgyMGYsICJCaW9zdGFyIFRBNzgwRyBNMisiLCBBTEM2NjJfM1NUXzZjaF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNjMxLCAweGMxMGMsICJQQiBSUzY1IiwgQUxDNjYzX0FTVVNfTTUxVkEpLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDEwMWUsICJMZW5vdm8iLCBBTEM2NjJfTEVOT1ZPXzEwMUUpLAorCVNORF9QQ0lfUVVJUksoMHgxODQ5LCAweDM2NjIsICJBU1JPQ0sgSzEwTjc4RnVsbEhELWhTTEkgUjMuMCIsCisJCQkJCUFMQzY2Ml8zU1RfNmNoX0RJRyksCisJU05EX1BDSV9RVUlSS19NQVNLKDB4MTg1NCwgMHhmMDAwLCAweDIwMDAsICJBU1VTIEgxMy0yMDB4IiwKKwkJCSAgIEFMQzY2M19BU1VTX0gxMyksCisJU05EX1BDSV9RVUlSSygweDE5OTEsIDB4NTYyOCwgIk9yZGlzc2ltbyBFVkUiLCBBTEM2NjJfTEVOT1ZPXzEwMUUpLAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzY2Ml9wcmVzZXRzW10gPSB7CisJW0FMQzY2Ml8zU1RfMmNoX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzY2Ml8zU1RfMmNoX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywgYWxjNjYyX2VhcGRfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCisJCS5kaWdfaW5fbmlkID0gQUxDNjYyX0RJR0lOX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM2NjJfM1NUXzZjaF9ESUddID0geworCQkubWl4ZXJzID0geyBhbGM2NjJfM1NUXzZjaF9taXhlciwgYWxjNjYyX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsIGFsYzY2Ml9lYXBkX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAorCQkuZGlnX2luX25pZCA9IEFMQzY2Ml9ESUdJTl9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzZjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzZjaF9tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5pbnB1dF9tdXggPSAmYWxjNjYyX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzY2Ml8zU1RfNmNoXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYyXzNTVF82Y2hfbWl4ZXIsIGFsYzY2Ml9jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLCBhbGM2NjJfZWFwZF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF82Y2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF82Y2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM2NjJfNVNUX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzY2Ml9iYXNlX21peGVyLCBhbGM2NjJfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywgYWxjNjYyX2VhcGRfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCisJCS5kaWdfaW5fbmlkID0gQUxDNjYyX0RJR0lOX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml81c3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzVzdGFja19tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM2NjJfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDNjYyX0xFTk9WT18xMDFFXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYyX2xlbm92b18xMDFlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKKwkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAorCQkJCWFsYzY2Ml9zdWVfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9sZW5vdm9fMTAxZV9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjNjYyX2xlbm92b18xMDFlX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzY2Ml9BU1VTX0VFRVBDX1A3MDFdID0geworCQkubWl4ZXJzID0geyBhbGM2NjJfZWVlcGNfcDcwMV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCisJCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKKwkJCQlhbGM2NjJfZWVlcGNfc3VlX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjNjYyX2VlZXBjX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzY2Ml9BU1VTX0VFRVBDX0VQMjBdID0geworCQkubWl4ZXJzID0geyBhbGM2NjJfZWVlcGNfZXAyMF9taXhlciwKKwkJCSAgICBhbGM2NjJfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKKwkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAorCQkJCWFsYzY2Ml9lZWVwY19lcDIwX3N1ZV9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF82Y2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF82Y2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjNjYyX2xlbm92b18xMDFlX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM2NjJfZWVlcGNfZXAyMF9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKKwl9LAorCVtBTEM2NjJfRUNTXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYyX2Vjc19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCisJCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKKwkJCQlhbGM2NjJfZWNzX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjNjYyX2VlZXBjX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzY2M19BU1VTX001MVZBXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYzX201MXZhX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKKwkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAorCQkJCWFsYzY2M19tNTF2YV9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM2NjNfbTUxdmFfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDNjYzX0FTVVNfRzcxVl0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzY2M19nNzF2X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKKwkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAorCQkJCWFsYzY2M19nNzF2X2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzY2M19nNzF2X3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzY2M19BU1VTX0gxM10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzY2M19tNTF2YV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCisJCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKKwkJCQlhbGM2NjNfbTUxdmFfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkuc2V0dXAgPSBhbGM2NjNfbTUxdmFfc2V0dXAsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDNjYzX0FTVVNfRzUwVl0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzY2M19nNTB2X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKKwkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAorCQkJCWFsYzY2M19nNTB2X2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF82Y2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF82Y2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjNjYzX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM2NjNfZzUwdl9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKKwl9LAorCVtBTEM2NjNfQVNVU19NT0RFMV0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzY2M19tNTF2YV9taXhlciB9LAorCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAorCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCisJCQkJYWxjNjYzXzIxamRfYW1pY19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjNjYzX21vZGUxX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzY2Ml9BU1VTX01PREUyXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYyXzFiamRfbWl4ZXIgfSwKKwkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCisJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKKwkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAorCQkJCWFsYzY2Ml8xYmpkX2FtaWNfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjNjYyX21vZGUyX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzY2M19BU1VTX01PREUzXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYzX3R3b19ocF9tMV9taXhlciB9LAorCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAorCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCisJCQkJYWxjNjYzX3R3b19ocF9hbWljX20xX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTNfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDNjYzX0FTVVNfTU9ERTRdID0geworCQkubWl4ZXJzID0geyBhbGM2NjNfYXN1c18yMWpkX2NsZmVfbWl4ZXIgfSwKKwkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCisJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKKwkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAorCQkJCWFsYzY2M18yMWpkX2FtaWNfaW5pdF92ZXJic30sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjNjYzX21vZGU0X3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzY2M19BU1VTX01PREU1XSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYzX2FzdXNfMTVqZF9jbGZlX21peGVyIH0sCisJCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCisJCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKKwkJCQlhbGM2NjNfMTVqZF9hbWljX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTVfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDNjYzX0FTVVNfTU9ERTZdID0geworCQkubWl4ZXJzID0geyBhbGM2NjNfdHdvX2hwX20yX21peGVyIH0sCisJCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCisJCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKKwkJCQlhbGM2NjNfdHdvX2hwX2FtaWNfbTJfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCisJCS5ocF9uaWQgPSAweDAzLAorCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzY2M19tb2RlNl9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKKwl9LAorCVtBTEM2NjNfQVNVU19NT0RFN10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzY2M19tb2RlN19taXhlciB9LAorCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAorCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCisJCQkJYWxjNjYzX21vZGU3X2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTdfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDNjYzX0FTVVNfTU9ERThdID0geworCQkubWl4ZXJzID0geyBhbGM2NjNfbW9kZThfbWl4ZXIgfSwKKwkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCisJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKKwkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAorCQkJCWFsYzY2M19tb2RlOF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjNjYzX21vZGU4X3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzI3Ml9ERUxMXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYzX201MXZhX21peGVyIH0sCisJCS5jYXBfbWl4ZXIgPSBhbGMyNzJfYXV0b19jYXB0dXJlX21peGVyLAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCisJCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKKwkJCQlhbGMyNzJfZGVsbF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjcyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjcyX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAorCQkuYWRjX25pZHMgPSBhbGMyNzJfYWRjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI3Ml9hZGNfbmlkcyksCisJCS5jYXBzcmNfbmlkcyA9IGFsYzI3Ml9jYXBzcmNfbmlkcywKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM2NjNfbTUxdmFfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKKwlbQUxDMjcyX0RFTExfWk0xXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYzX201MXZhX21peGVyIH0sCisJCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCisJCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKKwkJCQlhbGMyNzJfZGVsbF96bTFfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI3Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI3Ml9kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmFkY19uaWRzID0gYWxjNjYyX2FkY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gMSwKKwkJLmNhcHNyY19uaWRzID0gYWxjNjYyX2NhcHNyY19uaWRzLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzY2M19tNTF2YV9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKKwl9LAorCVtBTEMyNzJfU0FNU1VOR19OQzEwXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjcyX25jMTBfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAorCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCisJCQkJYWxjNjYzXzIxamRfYW1pY19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjcyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjcyX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCisJCS8qLmlucHV0X211eCA9ICZhbGMyNzJfbmMxMF9jYXB0dXJlX3NvdXJjZSwqLworCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTRfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCisJfSwKK307CisKKwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9hbGM2ODBfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzY4MF9xdWlya3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWViMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9hbGM2ODBfcXVpcmtzLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBBTEM2ODAgcXVpcmsgbW9kZWxzCisgKiBpbmNsdWRlZCBieSBwYXRjaF9yZWFsdGVrLmMKKyAqLworCisvKiBBTEM2ODAgbW9kZWxzICovCitlbnVtIHsKKwlBTEM2ODBfQVVUTywKKwlBTEM2ODBfQkFTRSwKKwlBTEM2ODBfTU9ERUxfTEFTVCwKK307CisKKyNkZWZpbmUgQUxDNjgwX0RJR0lOX05JRAlBTEM4ODBfRElHSU5fTklECisjZGVmaW5lIEFMQzY4MF9ESUdPVVRfTklECUFMQzg4MF9ESUdPVVRfTklECisjZGVmaW5lIGFsYzY4MF9tb2RlcwkJYWxjMjYwX21vZGVzCisKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjgwX2RhY19uaWRzWzNdID0geworCS8qIExvdXQxLCBMb3V0MiwgaHAgKi8KKwkweDAyLCAweDAzLCAweDA0Cit9OworCitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY4MF9hZGNfbmlkc1szXSA9IHsKKwkvKiBBREMwLTIgKi8KKwkvKiBETUlDLCBNSUMsIExpbmUtaW4qLworCTB4MDcsIDB4MDgsIDB4MDkKK307CisKKy8qCisgKiBBbmFsb2cgY2FwdHVyZSBBREMgY2dhbmdlCisgKi8KK3N0YXRpYyBoZGFfbmlkX3QgYWxjNjgwX2dldF9jdXJfYWRjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0YXRpYyBoZGFfbmlkX3QgcGluc1tdID0gezB4MTgsIDB4MTl9OworCXN0YXRpYyBoZGFfbmlkX3QgYWRjc1tdID0gezB4MDgsIDB4MDl9OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGlucyk7IGkrKykgeworCQlpZiAoIWlzX2phY2tfZGV0ZWN0YWJsZShjb2RlYywgcGluc1tpXSkpCisJCQljb250aW51ZTsKKwkJaWYgKHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIHBpbnNbaV0pKQorCQkJcmV0dXJuIGFkY3NbaV07CisJfQorCXJldHVybiAweDA3OworfQorCitzdGF0aWMgdm9pZCBhbGM2ODBfcmVjX2F1dG9zd2l0Y2goc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IG5pZCA9IGFsYzY4MF9nZXRfY3VyX2FkYyhjb2RlYyk7CisJaWYgKHNwZWMtPmN1cl9hZGMgJiYgbmlkICE9IHNwZWMtPmN1cl9hZGMpIHsKKwkJX19zbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5jdXJfYWRjLCAxKTsKKwkJc3BlYy0+Y3VyX2FkYyA9IG5pZDsKKwkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG5pZCwKKwkJCQkJICAgc3BlYy0+Y3VyX2FkY19zdHJlYW1fdGFnLCAwLAorCQkJCQkgICBzcGVjLT5jdXJfYWRjX2Zvcm1hdCk7CisJfQorfQorCitzdGF0aWMgaW50IGFsYzY4MF9jYXB0dXJlX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgbmlkID0gYWxjNjgwX2dldF9jdXJfYWRjKGNvZGVjKTsKKworCXNwZWMtPmN1cl9hZGMgPSBuaWQ7CisJc3BlYy0+Y3VyX2FkY19zdHJlYW1fdGFnID0gc3RyZWFtX3RhZzsKKwlzcGVjLT5jdXJfYWRjX2Zvcm1hdCA9IGZvcm1hdDsKKwlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkLCBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsYzY4MF9jYXB0dXJlX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgc3BlYy0+Y3VyX2FkYyk7CisJc3BlYy0+Y3VyX2FkYyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjNjgwX3BjbV9hbmFsb2dfYXV0b19jYXB0dXJlID0geworCS5zdWJzdHJlYW1zID0gMSwgLyogY2FuIGJlIG92ZXJyaWRkZW4gKi8KKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkvKiBOSUQgaXMgc2V0IGluIGFsY19idWlsZF9wY21zICovCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSBhbGM2ODBfY2FwdHVyZV9wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSBhbGM2ODBfY2FwdHVyZV9wY21fY2xlYW51cAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjgwX2Jhc2VfbWl4ZXJbXSA9IHsKKwkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHg0LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxMiwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjgwX2JpbmRfY2FwX3ZvbCA9IHsKKwkub3BzID0gJnNuZF9oZGFfYmluZF92b2wsCisJLnZhbHVlcyA9IHsKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA3LCAzLCAwLCBIREFfSU5QVVQpLAorCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDgsIDMsIDAsIEhEQV9JTlBVVCksCisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwOSwgMywgMCwgSERBX0lOUFVUKSwKKwkJMAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjgwX2JpbmRfY2FwX3N3aXRjaCA9IHsKKwkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDcsIDMsIDAsIEhEQV9JTlBVVCksCisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwOCwgMywgMCwgSERBX0lOUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA5LCAzLCAwLCBIREFfSU5QVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2ODBfbWFzdGVyX2NhcHR1cmVfbWl4ZXJbXSA9IHsKKwlIREFfQklORF9WT0woIkNhcHR1cmUgVm9sdW1lIiwgJmFsYzY4MF9iaW5kX2NhcF92b2wpLAorCUhEQV9CSU5EX1NXKCJDYXB0dXJlIFN3aXRjaCIsICZhbGM2ODBfYmluZF9jYXBfc3dpdGNoKSwKKwl7IH0gLyogZW5kICovCit9OworCisvKgorICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY4MF9pbml0X3ZlcmJzW10gPSB7CisJezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisKKwl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKworCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCisJezB4MTYsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UICAgfCBBQ19VU1JTUF9FTn0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX01JQ19FVkVOVCAgfCBBQ19VU1JTUF9FTn0sCisJezB4MTksIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX01JQ19FVkVOVCAgfCBBQ19VU1JTUF9FTn0sCisKKwl7IH0KK307CisKKy8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzY4MF9iYXNlX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNjsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE1OworCXNwZWMtPmF1dG9jZmcubnVtX2lucHV0cyA9IDI7CisJc3BlYy0+YXV0b2NmZy5pbnB1dHNbMF0ucGluID0gMHgxODsKKwlzcGVjLT5hdXRvY2ZnLmlucHV0c1swXS50eXBlID0gQVVUT19QSU5fTUlDOworCXNwZWMtPmF1dG9jZmcuaW5wdXRzWzFdLnBpbiA9IDB4MTk7CisJc3BlYy0+YXV0b2NmZy5pbnB1dHNbMV0udHlwZSA9IEFVVE9fUElOX0xJTkVfSU47CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworfQorCitzdGF0aWMgdm9pZCBhbGM2ODBfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgIHVuc2lnbmVkIGludCByZXMpCit7CisJaWYgKChyZXMgPj4gMjYpID09IEFMQ19IUF9FVkVOVCkKKwkJYWxjX2hwX2F1dG9tdXRlKGNvZGVjKTsKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDX01JQ19FVkVOVCkKKwkJYWxjNjgwX3JlY19hdXRvc3dpdGNoKGNvZGVjKTsKK30KKworc3RhdGljIHZvaWQgYWxjNjgwX2luaXRob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7CisJYWxjNjgwX3JlY19hdXRvc3dpdGNoKGNvZGVjKTsKK30KKworLyoKKyAqIGNvbmZpZ3VyYXRpb24gYW5kIHByZXNldAorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFsYzY4MF9tb2RlbHNbQUxDNjgwX01PREVMX0xBU1RdID0geworCVtBTEM2ODBfQkFTRV0JCT0gImJhc2UiLAorCVtBTEM2ODBfQVVUT10JCT0gImF1dG8iLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzY4MF9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTJmMywgIkFTVVMgTlg5MCIsIEFMQzY4MF9CQVNFKSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfY29uZmlnX3ByZXNldCBhbGM2ODBfcHJlc2V0c1tdID0geworCVtBTEM2ODBfQkFTRV0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzY4MF9iYXNlX21peGVyIH0sCisJCS5jYXBfbWl4ZXIgPSAgYWxjNjgwX21hc3Rlcl9jYXB0dXJlX21peGVyLAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjgwX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2ODBfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM2ODBfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzY4MF9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjgwX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY4MF9tb2RlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjNjgwX3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM2ODBfYmFzZV9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsYzY4MF9pbml0aG9vaywKKworCX0sCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9hbGM4NjFfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzg2MV9xdWlya3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzE5ZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9hbGM4NjFfcXVpcmtzLmMKQEAgLTAsMCArMSw3MjUgQEAKKy8qCisgKiBBTEM2NjAvQUxDODYxIHF1aXJrIG1vZGVscworICogaW5jbHVkZWQgYnkgcGF0Y2hfcmVhbHRlay5jCisgKi8KKworLyogQUxDODYxIG1vZGVscyAqLworZW51bSB7CisJQUxDODYxX0FVVE8sCisJQUxDODYxXzNTVCwKKwlBTEM2NjBfM1NULAorCUFMQzg2MV8zU1RfRElHLAorCUFMQzg2MV82U1RfRElHLAorCUFMQzg2MV9VTklXSUxMX00zMSwKKwlBTEM4NjFfVE9TSElCQSwKKwlBTEM4NjFfQVNVUywKKwlBTEM4NjFfQVNVU19MQVBUT1AsCisJQUxDODYxX01PREVMX0xBU1QsCit9OworCisvKgorICogIEFMQzg2MSBjaGFubmVsIHNvdXJjZSBzZXR0aW5nICgyLzYgY2hhbm5lbCBzZWxlY3Rpb24gZm9yIDMtc3RhY2spCisgKi8KKworLyoKKyAqIHNldCB0aGUgcGF0aCB3YXlzIGZvciAyIGNoYW5uZWwgb3V0cHV0CisgKiBuZWVkIHRvIHNldCB0aGUgY29kZWMgbGluZSBvdXQgYW5kIG1pYyAxIHBpbiB3aWRnZXRzIHRvIGlucHV0cworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV90aHJlZXN0YWNrX2NoMl9pbml0W10gPSB7CisJLyogc2V0IHBpbiB3aWRnZXQgMUFoIChsaW5lIGluKSBmb3IgaW5wdXQgKi8KKwl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAorCS8qIHNldCBwaW4gd2lkZ2V0IDE4aCAobWljMS8yKSBmb3IgaW5wdXQsIGZvciBtaWMgYWxzbyBlbmFibGUKKwkgKiB0aGUgdnJlZgorCSAqLworCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCisKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwYyB9LAorI2lmIDAKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSkgfSwgLyptaWMqLworCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAyIDw8IDgpKSB9LCAvKmxpbmUtaW4qLworI2VuZGlmCisJeyB9IC8qIGVuZCAqLworfTsKKy8qCisgKiA2Y2ggbW9kZQorICogbmVlZCB0byBzZXQgdGhlIGNvZGVjIGxpbmUgb3V0IGFuZCBtaWMgMSBwaW4gd2lkZ2V0cyB0byBvdXRwdXRzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX3RocmVlc3RhY2tfY2g2X2luaXRbXSA9IHsKKwkvKiBzZXQgcGluIHdpZGdldCAxQWggKGxpbmUgaW4pIGZvciBvdXRwdXQgKEJhY2sgU3Vycm91bmQpKi8KKwl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAorCS8qIHNldCBwaW4gd2lkZ2V0IDE4aCAobWljMSkgZm9yIG91dHB1dCAoQ0xGRSkqLworCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCisKKwl7IDB4MGMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCisJeyAweDBkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCisJeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODAgfSwKKyNpZiAwCisJeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpIH0sIC8qbWljKi8KKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMiA8PCA4KSkgfSwgLypsaW5lIGluKi8KKyNlbmRpZgorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4NjFfdGhyZWVzdGFja19tb2Rlc1syXSA9IHsKKwl7IDIsIGFsYzg2MV90aHJlZXN0YWNrX2NoMl9pbml0IH0sCisJeyA2LCBhbGM4NjFfdGhyZWVzdGFja19jaDZfaW5pdCB9LAorfTsKKy8qIFNldCBtaWMxIGFzIGlucHV0IGFuZCB1bm11dGUgdGhlIG1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV91bml3aWxsX20zMV9jaDJfaW5pdFtdID0geworCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCisJeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpIH0sIC8qbWljKi8KKwl7IH0gLyogZW5kICovCit9OworLyogU2V0IG1pYzEgYXMgb3V0cHV0IGFuZCBtdXRlIG1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV91bml3aWxsX20zMV9jaDRfaW5pdFtdID0geworCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCisJeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpIH0sIC8qbWljKi8KKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODYxX3VuaXdpbGxfbTMxX21vZGVzWzJdID0geworCXsgMiwgYWxjODYxX3VuaXdpbGxfbTMxX2NoMl9pbml0IH0sCisJeyA0LCBhbGM4NjFfdW5pd2lsbF9tMzFfY2g0X2luaXQgfSwKK307CisKKy8qIFNldCBtaWMxIGFuZCBsaW5lLWluIGFzIGlucHV0IGFuZCB1bm11dGUgdGhlIG1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV9hc3VzX2NoMl9pbml0W10gPSB7CisJLyogc2V0IHBpbiB3aWRnZXQgMUFoIChsaW5lIGluKSBmb3IgaW5wdXQgKi8KKwl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAorCS8qIHNldCBwaW4gd2lkZ2V0IDE4aCAobWljMS8yKSBmb3IgaW5wdXQsIGZvciBtaWMgYWxzbyBlbmFibGUKKwkgKiB0aGUgdnJlZgorCSAqLworCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCisKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwYyB9LAorI2lmIDAKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSkgfSwgLyptaWMqLworCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAyIDw8IDgpKSB9LCAvKmxpbmUtaW4qLworI2VuZGlmCisJeyB9IC8qIGVuZCAqLworfTsKKy8qIFNldCBtaWMxIG5hZCBsaW5lLWluIGFzIG91dHB1dCBhbmQgbXV0ZSBtaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfYXN1c19jaDZfaW5pdFtdID0geworCS8qIHNldCBwaW4gd2lkZ2V0IDFBaCAobGluZSBpbikgZm9yIG91dHB1dCAoQmFjayBTdXJyb3VuZCkqLworCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCisJLyogeyAweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LCAqLworCS8qIHNldCBwaW4gd2lkZ2V0IDE4aCAobWljMSkgZm9yIG91dHB1dCAoQ0xGRSkqLworCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCisJLyogeyAweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LCAqLworCXsgMHgwYywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKKwl7IDB4MGQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCisKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MCB9LAorI2lmIDAKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMSA8PCA4KSkgfSwgLyptaWMqLworCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKSB9LCAvKmxpbmUgaW4qLworI2VuZGlmCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg2MV9hc3VzX21vZGVzWzJdID0geworCXsgMiwgYWxjODYxX2FzdXNfY2gyX2luaXQgfSwKKwl7IDYsIGFsYzg2MV9hc3VzX2NoNl9pbml0IH0sCit9OworCisvKiBwYXRjaC1BTEM4NjEgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV9iYXNlX21peGVyW10gPSB7CisgICAgICAgIC8qIG91dHB1dCBtaXhlciBjb250cm9sICovCisJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MDYsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlNpZGUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNCwgMHgwLCBIREFfT1VUUFVUKSwKKworICAgICAgICAvKklucHV0IG1peGVyIGNvbnRyb2wgKi8KKwkvKiBIREFfQ09ERUNfVk9MVU1FKCJJbnB1dCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCSAgIEhEQV9DT0RFQ19NVVRFKCJJbnB1dCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLCAqLworCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MDEsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwMywgSERBX0lOUFVUKSwKKworCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfM1NUX21peGVyW10gPSB7CisgICAgICAgIC8qIG91dHB1dCBtaXhlciBjb250cm9sICovCisJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MDYsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJLypIREFfQ09ERUNfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDA0LCAweDAsIEhEQV9PVVRQVVQpLCAqLworCisJLyogSW5wdXQgbWl4ZXIgY29udHJvbCAqLworCS8qIEhEQV9DT0RFQ19WT0xVTUUoIklucHV0IFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJICAgSERBX0NPREVDX01VVEUoIklucHV0IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksICovCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMHgwMSwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFhLCAweDAzLCBIREFfSU5QVVQpLAorCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorICAgICAgICAgICAgICAgIC5wcml2YXRlX3ZhbHVlID0gQVJSQVlfU0laRShhbGM4NjFfdGhyZWVzdGFja19tb2RlcyksCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxX3Rvc2hpYmFfbWl4ZXJbXSA9IHsKKyAgICAgICAgLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KKwlIREFfQ09ERUNfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAorCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV91bml3aWxsX20zMV9taXhlcltdID0geworICAgICAgICAvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLworCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDA2LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDA1LCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDA1LCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCS8qSERBX0NPREVDX01VVEUoIlNpZGUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNCwgMHgwLCBIREFfT1VUUFVUKSwgKi8KKworCS8qIElucHV0IG1peGVyIGNvbnRyb2wgKi8KKwkvKiBIREFfQ09ERUNfVk9MVU1FKCJJbnB1dCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCSAgIEhEQV9DT0RFQ19NVVRFKCJJbnB1dCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLCAqLworCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MDEsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwMywgSERBX0lOUFVUKSwKKworCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCisJCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKKwkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKKwkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKKyAgICAgICAgICAgICAgICAucHJpdmF0ZV92YWx1ZSA9IEFSUkFZX1NJWkUoYWxjODYxX3VuaXdpbGxfbTMxX21vZGVzKSwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfYXN1c19taXhlcltdID0geworICAgICAgICAvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLworCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDA2LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDA1LCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDA1LCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MDQsIDB4MCwgSERBX09VVFBVVCksCisKKwkvKiBJbnB1dCBtaXhlciBjb250cm9sICovCisJSERBX0NPREVDX1ZPTFVNRSgiSW5wdXQgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW5wdXQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDEwLCAweDAxLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWEsIDB4MDMsIEhEQV9PVVRQVVQpLAorCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorICAgICAgICAgICAgICAgIC5wcml2YXRlX3ZhbHVlID0gQVJSQVlfU0laRShhbGM4NjFfYXN1c19tb2RlcyksCisJfSwKKwl7IH0KK307CisKKy8qIGFkZGl0aW9uYWwgbWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfYXN1c19sYXB0b3BfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0KK307CisKKy8qCisgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX2Jhc2VfaW5pdF92ZXJic1tdID0geworCS8qCisJICogVW5tdXRlIEFEQzAgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KKwkgKi8KKwkvKiBwb3J0LUEgZm9yIHN1cnJvdW5kIChyZWFyIHBhbmVsKSAqLworCXsgMHgwZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCisJeyAweDBlLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCS8qIHBvcnQtQiBmb3IgbWljLWluIChyZWFyIHBhbmVsKSB3aXRoIHZyZWYgKi8KKwl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAorCS8qIHBvcnQtQyBmb3IgbGluZS1pbiAocmVhciBwYW5lbCkgKi8KKwl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAorCS8qIHBvcnQtRCBmb3IgRnJvbnQgKi8KKwl7IDB4MGIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAorCXsgMHgwYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKKwkvKiBwb3J0LUUgZm9yIEhQIG91dCAoZnJvbnQgcGFuZWwpICovCisJeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzAgfSwKKwkvKiByb3V0ZSBmcm9udCBQQ00gdG8gSFAgKi8KKwl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCisJLyogcG9ydC1GIGZvciBtaWMtaW4gKGZyb250IHBhbmVsKSB3aXRoIHZyZWYgKi8KKwl7IDB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAorCS8qIHBvcnQtRyBmb3IgQ0xGRSAocmVhciBwYW5lbCkgKi8KKwl7IDB4MWYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAorCXsgMHgxZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKKwkvKiBwb3J0LUggZm9yIHNpZGUgKHJlYXIgcGFuZWwpICovCisJeyAweDIwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKKwl7IDB4MjAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCisJLyogQ0QtaW4gKi8KKwl7IDB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAorCS8qIHJvdXRlIGZyb250IG1pYyB0byBBREMxKi8KKwl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKworCS8qIFVubXV0ZSBEQUMwfjMgJiBzcGRpZiBvdXQqLworCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDA2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCS8qIFVubXV0ZSBNaXhlciAxNCAobWljKSAxYyAoTGluZSBpbikqLworCXsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisgICAgICAgIHsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKyAgICAgICAgezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKworCS8qIFVubXV0ZSBTdGVyZW8gTWl4ZXIgMTUgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjfSwgLyogT3V0cHV0IDB+MTIgc3RlcCAqLworCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwkvKiBocCB1c2VkIERBQyAzIChGcm9udCkgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCisgICAgICAgIHsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKworCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfdGhyZWVzdGFja19pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgorCSAqLworCS8qIHBvcnQtQSBmb3Igc3Vycm91bmQgKHJlYXIgcGFuZWwpICovCisJeyAweDBlLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKKwkvKiBwb3J0LUIgZm9yIG1pYy1pbiAocmVhciBwYW5lbCkgd2l0aCB2cmVmICovCisJeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKKwkvKiBwb3J0LUMgZm9yIGxpbmUtaW4gKHJlYXIgcGFuZWwpICovCisJeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKKwkvKiBwb3J0LUQgZm9yIEZyb250ICovCisJeyAweDBiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKKwl7IDB4MGIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCisJLyogcG9ydC1FIGZvciBIUCBvdXQgKGZyb250IHBhbmVsKSAqLworCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwIH0sCisJLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCisJeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCS8qIHBvcnQtRiBmb3IgbWljLWluIChmcm9udCBwYW5lbCkgd2l0aCB2cmVmICovCisJeyAweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKKwkvKiBwb3J0LUcgZm9yIENMRkUgKHJlYXIgcGFuZWwpICovCisJeyAweDFmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKKwkvKiBwb3J0LUggZm9yIHNpZGUgKHJlYXIgcGFuZWwpICovCisJeyAweDIwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKKwkvKiBDRC1pbiAqLworCXsgMHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCisJLyogcm91dGUgZnJvbnQgbWljIHRvIEFEQzEqLworCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCS8qIFVubXV0ZSBEQUMwfjMgJiBzcGRpZiBvdXQqLworCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDA2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCS8qIFVubXV0ZSBNaXhlciAxNCAobWljKSAxYyAoTGluZSBpbikqLworCXsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisgICAgICAgIHsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKyAgICAgICAgezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKworCS8qIFVubXV0ZSBTdGVyZW8gTWl4ZXIgMTUgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjfSwgLyogT3V0cHV0IDB+MTIgc3RlcCAqLworCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwkvKiBocCB1c2VkIERBQyAzIChGcm9udCkgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCisgICAgICAgIHsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX3VuaXdpbGxfbTMxX2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCisJICovCisJLyogcG9ydC1BIGZvciBzdXJyb3VuZCAocmVhciBwYW5lbCkgKi8KKwl7IDB4MGUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAorCS8qIHBvcnQtQiBmb3IgbWljLWluIChyZWFyIHBhbmVsKSB3aXRoIHZyZWYgKi8KKwl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAorCS8qIHBvcnQtQyBmb3IgbGluZS1pbiAocmVhciBwYW5lbCkgKi8KKwl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAorCS8qIHBvcnQtRCBmb3IgRnJvbnQgKi8KKwl7IDB4MGIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAorCXsgMHgwYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKKwkvKiBwb3J0LUUgZm9yIEhQIG91dCAoZnJvbnQgcGFuZWwpICovCisJLyogdGhpcyBoYXMgdG8gYmUgc2V0IHRvIFZSRUY4MCAqLworCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCisJLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCisJeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCS8qIHBvcnQtRiBmb3IgbWljLWluIChmcm9udCBwYW5lbCkgd2l0aCB2cmVmICovCisJeyAweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKKwkvKiBwb3J0LUcgZm9yIENMRkUgKHJlYXIgcGFuZWwpICovCisJeyAweDFmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKKwkvKiBwb3J0LUggZm9yIHNpZGUgKHJlYXIgcGFuZWwpICovCisJeyAweDIwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKKwkvKiBDRC1pbiAqLworCXsgMHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCisJLyogcm91dGUgZnJvbnQgbWljIHRvIEFEQzEqLworCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCS8qIFVubXV0ZSBEQUMwfjMgJiBzcGRpZiBvdXQqLworCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDA2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCS8qIFVubXV0ZSBNaXhlciAxNCAobWljKSAxYyAoTGluZSBpbikqLworCXsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisgICAgICAgIHsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKyAgICAgICAgezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKworCS8qIFVubXV0ZSBTdGVyZW8gTWl4ZXIgMTUgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjfSwgLyogT3V0cHV0IDB+MTIgc3RlcCAqLworCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwkvKiBocCB1c2VkIERBQyAzIChGcm9udCkgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCisgICAgICAgIHsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX2FzdXNfaW5pdF92ZXJic1tdID0geworCS8qCisJICogVW5tdXRlIEFEQzAgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KKwkgKi8KKwkvKiBwb3J0LUEgZm9yIHN1cnJvdW5kIChyZWFyIHBhbmVsKQorCSAqIGFjY29yZGluZyB0byBjb2RlYyMwIHRoaXMgaXMgdGhlIEhQIGphY2sKKwkgKi8KKwl7IDB4MGUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMCB9LCAvKiB3YXMgMHgwMCAqLworCS8qIHJvdXRlIGZyb250IFBDTSB0byBIUCAqLworCXsgMHgwZSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKKwkvKiBwb3J0LUIgZm9yIG1pYy1pbiAocmVhciBwYW5lbCkgd2l0aCB2cmVmICovCisJeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKKwkvKiBwb3J0LUMgZm9yIGxpbmUtaW4gKHJlYXIgcGFuZWwpICovCisJeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKKwkvKiBwb3J0LUQgZm9yIEZyb250ICovCisJeyAweDBiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKKwl7IDB4MGIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCisJLyogcG9ydC1FIGZvciBIUCBvdXQgKGZyb250IHBhbmVsKSAqLworCS8qIHRoaXMgaGFzIHRvIGJlIHNldCB0byBWUkVGODAgKi8KKwl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAorCS8qIHJvdXRlIGZyb250IFBDTSB0byBIUCAqLworCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKKwkvKiBwb3J0LUYgZm9yIG1pYy1pbiAoZnJvbnQgcGFuZWwpIHdpdGggdnJlZiAqLworCXsgMHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCisJLyogcG9ydC1HIGZvciBDTEZFIChyZWFyIHBhbmVsKSAqLworCXsgMHgxZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCisJLyogcG9ydC1IIGZvciBzaWRlIChyZWFyIHBhbmVsKSAqLworCXsgMHgyMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCisJLyogQ0QtaW4gKi8KKwl7IDB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAorCS8qIHJvdXRlIGZyb250IG1pYyB0byBBREMxKi8KKwl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwkvKiBVbm11dGUgREFDMH4zICYgc3BkaWYgb3V0Ki8KKwl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgwNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogVW5tdXRlIE1peGVyIDE0IChtaWMpIDFjIChMaW5lIGluKSovCisJezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKyAgICAgICAgezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorICAgICAgICB7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCisJLyogVW5tdXRlIFN0ZXJlbyBNaXhlciAxNSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGN9LCAvKiBPdXRwdXQgMH4xMiBzdGVwICovCisKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCS8qIGhwIHVzZWQgREFDIDMgKEZyb250KSAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCisJeyB9Cit9OworCisvKiBhZGRpdGlvbmFsIGluaXQgdmVyYnMgZm9yIEFTVVMgbGFwdG9wcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfYXN1c19sYXB0b3BfaW5pdF92ZXJic1tdID0geworCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQ1IH0sIC8qIEhQLW91dCAqLworCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMikgfSwgLyogbXV0ZSBsaW5lLWluICovCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV90b3NoaWJhX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgwZiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisKKwl7IH0KK307CisKKy8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzg2MV90b3NoaWJhX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgwZik7CisKKwlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MTYsIEhEQV9JTlBVVCwgMCwKKwkJCQkgSERBX0FNUF9NVVRFLCBwcmVzZW50ID8gSERBX0FNUF9NVVRFIDogMCk7CisJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDFhLCBIREFfSU5QVVQsIDMsCisJCQkJIEhEQV9BTVBfTVVURSwgcHJlc2VudCA/IDAgOiBIREFfQU1QX01VVEUpOworfQorCitzdGF0aWMgdm9pZCBhbGM4NjFfdG9zaGliYV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDX0hQX0VWRU5UKQorCQlhbGM4NjFfdG9zaGliYV9hdXRvbXV0ZShjb2RlYyk7Cit9CisKKyNkZWZpbmUgQUxDODYxX0RJR09VVF9OSUQJMHgwNworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODYxXzhjaF9tb2Rlc1sxXSA9IHsKKwl7IDgsIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4NjFfZGFjX25pZHNbNF0gPSB7CisJLyogZnJvbnQsIHN1cnJvdW5kLCBjbGZlLCBzaWRlICovCisJMHgwMywgMHgwNiwgMHgwNSwgMHgwNAorfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM2NjBfZGFjX25pZHNbM10gPSB7CisJLyogZnJvbnQsIGNsZmUsIHN1cnJvdW5kICovCisJMHgwMywgMHgwNSwgMHgwNgorfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4NjFfYWRjX25pZHNbMV0gPSB7CisJLyogQURDMC0yICovCisJMHgwOCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4NjFfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDUsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDAgfSwKKwkJeyAiRnJvbnQgTWljIiwgMHgzIH0sCisJCXsgIkxpbmUiLCAweDEgfSwKKwkJeyAiQ0QiLCAweDQgfSwKKwkJeyAiTWl4ZXIiLCAweDUgfSwKKwl9LAorfTsKKworLyoKKyAqIGNvbmZpZ3VyYXRpb24gYW5kIHByZXNldAorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFsYzg2MV9tb2RlbHNbQUxDODYxX01PREVMX0xBU1RdID0geworCVtBTEM4NjFfM1NUXQkJPSAiM3N0YWNrIiwKKwlbQUxDNjYwXzNTVF0JCT0gIjNzdGFjay02NjAiLAorCVtBTEM4NjFfM1NUX0RJR10JPSAiM3N0YWNrLWRpZyIsCisJW0FMQzg2MV82U1RfRElHXQk9ICI2c3RhY2stZGlnIiwKKwlbQUxDODYxX1VOSVdJTExfTTMxXQk9ICJ1bml3aWxsLW0zMSIsCisJW0FMQzg2MV9UT1NISUJBXQk9ICJ0b3NoaWJhIiwKKwlbQUxDODYxX0FTVVNdCQk9ICJhc3VzIiwKKwlbQUxDODYxX0FTVVNfTEFQVE9QXQk9ICJhc3VzLWxhcHRvcCIsCisJW0FMQzg2MV9BVVRPXQkJPSAiYXV0byIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODYxX2NmZ190YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMjA1LCAiQVNVUyBXN0oiLCBBTEM4NjFfM1NUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzM1LCAiQVNVUyBGMi8zIiwgQUxDODYxX0FTVVNfTEFQVE9QKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzM4LCAiQVNVUyBGMi8zIiwgQUxDODYxX0FTVVNfTEFQVE9QKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzkzLCAiQVNVUyIsIEFMQzg2MV9BU1VTKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2Q3LCAiQVNVUyBBOXJwIiwgQUxDODYxX0FTVVNfTEFQVE9QKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MWNiLCAiQVNVUyBQMS1BSDIiLCBBTEM4NjFfM1NUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYwMCwgIlRvc2hpYmEiLCBBTEM4NjFfVE9TSElCQSksCisJLyogRklYTUU6IHRoZSBlbnRyeSBiZWxvdyBicmVha3MgVG9zaGliYSBBMTAwIChtb2RlbD1hdXRvIHdvcmtzISkKKwkgKiAgICAgICAgQW55IG90aGVyIG1vZGVscyB0aGF0IG5lZWQgdGhpcyBwcmVzZXQ/CisJICovCisJLyogU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYxMCwgIlRvc2hpYmEiLCBBTEM4NjFfVE9TSElCQSksICovCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzI1NCwgIkhQIGR4MjIwMCAoTVNJIE1TLTcyNTQpIiwgQUxDODYxXzNTVCksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzI5NywgIkhQIGR4MjI1MCAoTVNJIE1TLTcyOTcpIiwgQUxDODYxXzNTVCksCisJU05EX1BDSV9RVUlSSygweDE1ODQsIDB4MmIwMSwgIlVuaXdpbGwgWDQwQUl4IiwgQUxDODYxX1VOSVdJTExfTTMxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHg5MDcyLCAiVW5pd2lsbCBtMzEiLCBBTEM4NjFfVU5JV0lMTF9NMzEpLAorCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNzUsICJBaXJpcyBQcmF4aXMgTjEyMTIiLCBBTEM4NjFfQVNVU19MQVBUT1ApLAorCS8qIEZJWE1FOiB0aGUgYmVsb3cgc2VlbXMgY29uZmxpY3QgKi8KKwkvKiBTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHg5MDc1LCAiVW5pd2lsbCIsIEFMQzg2MV9VTklXSUxMX00zMSksICovCisJU05EX1BDSV9RVUlSSygweDE4NDksIDB4MDY2MCwgIkFzcm9jayA5MzlTTEkzMiIsIEFMQzY2MF8zU1QpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGQ2MDAsICJJbnRlbCIsIEFMQzg2MV8zU1QpLAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzg2MV9wcmVzZXRzW10gPSB7CisJW0FMQzg2MV8zU1RdID0geworCQkubWl4ZXJzID0geyBhbGM4NjFfM1NUX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfdGhyZWVzdGFja19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODYxX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxX3RocmVlc3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxX3RocmVlc3RhY2tfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4NjFfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4NjFfYWRjX25pZHMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg2MV8zU1RfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODYxX2Jhc2VfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV90aHJlZXN0YWNrX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg2MV9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxX3RocmVlc3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxX3RocmVlc3RhY2tfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4NjFfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4NjFfYWRjX25pZHMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg2MV82U1RfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODYxX2Jhc2VfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV9iYXNlX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg2MV9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxXzhjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfOGNoX21vZGVzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4NjFfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4NjFfYWRjX25pZHMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzY2MF8zU1RdID0geworCQkubWl4ZXJzID0geyBhbGM4NjFfM1NUX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfdGhyZWVzdGFja19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYwX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjNjYwX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxX3RocmVlc3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxX3RocmVlc3RhY2tfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4NjFfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4NjFfYWRjX25pZHMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg2MV9VTklXSUxMX00zMV0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MV91bml3aWxsX20zMV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX3VuaXdpbGxfbTMxX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg2MV9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxX3VuaXdpbGxfbTMxX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MV91bml3aWxsX20zMV9tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKKwkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODYxX1RPU0hJQkFdID0geworCQkubWl4ZXJzID0geyBhbGM4NjFfdG9zaGliYV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX2Jhc2VfaW5pdF92ZXJicywKKwkJCQlhbGM4NjFfdG9zaGliYV9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODYxX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKKwkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg2MV90b3NoaWJhX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjODYxX3Rvc2hpYmFfYXV0b211dGUsCisJfSwKKwlbQUxDODYxX0FTVVNdID0geworCQkubWl4ZXJzID0geyBhbGM4NjFfYXN1c19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX2FzdXNfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfYXN1c19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfYXN1c19tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5ocF9uaWQgPSAweDA2LAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4NjFfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4NjFfYWRjX25pZHMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg2MV9BU1VTX0xBUFRPUF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MV90b3NoaWJhX21peGVyLCBhbGM4NjFfYXN1c19sYXB0b3BfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV9hc3VzX2luaXRfdmVyYnMsCisJCQkJYWxjODYxX2FzdXNfbGFwdG9wX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg2MV9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4NjFfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4NjFfYWRjX25pZHMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxX2NhcHR1cmVfc291cmNlLAorCX0sCit9OworCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2FsYzg2MXZkX3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGM4NjF2ZF9xdWlya3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjI4NDUwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9hbGM4NjF2ZF9xdWlya3MuYwpAQCAtMCwwICsxLDYwNSBAQAorLyoKKyAqIEFMQzY2MC1WRC9BTEM4NjEtVkQgcXVpcmsgbW9kZWxzCisgKiBpbmNsdWRlZCBieSBwYXRjaF9yZWFsdGVrLmMKKyAqLworCisvKiBBTEM4NjEtVkQgbW9kZWxzICovCitlbnVtIHsKKwlBTEM4NjFWRF9BVVRPLAorCUFMQzY2MFZEXzNTVCwKKwlBTEM2NjBWRF8zU1RfRElHLAorCUFMQzY2MFZEX0FTVVNfVjFTLAorCUFMQzg2MVZEXzNTVCwKKwlBTEM4NjFWRF8zU1RfRElHLAorCUFMQzg2MVZEXzZTVF9ESUcsCisJQUxDODYxVkRfTEVOT1ZPLAorCUFMQzg2MVZEX0RBTExBUywKKwlBTEM4NjFWRF9IUCwKKwlBTEM4NjFWRF9NT0RFTF9MQVNULAorfTsKKworI2RlZmluZSBBTEM4NjFWRF9ESUdPVVRfTklECTB4MDYKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4NjF2ZF9kYWNfbmlkc1s0XSA9IHsKKwkvKiBmcm9udCwgc3VyciwgY2xmZSwgc2lkZSBzdXJyICovCisJMHgwMiwgMHgwMywgMHgwNCwgMHgwNQorfTsKKworLyogZGFjX25pZHMgZm9yIEFMQzY2MHZkIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlciAtIGFjY29yZGluZyB0bworICogUmVhbHRlaydzIGRyaXZlci4KKyAqIFRoaXMgc2hvdWxkIHByb2JhYmx5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCBtaXhlciBmb3IgNnN0YWNrIG1vZGVscworICogb2YgQUxDNjYwdmQgY29kZWNzLCBidXQgZm9yIG5vdyB0aGVyZSBpcyBvbmx5IDNzdGFjayBtaXhlcgorICogLSBhbmQgaXQgaXMgdGhlIHNhbWUgYXMgaW4gODYxdmQuCisgKiBhZGNfbmlkcyBpbiBBTEM2NjB2ZCBhcmUgKGlzKSB0aGUgc2FtZSBhcyBpbiA4NjF2ZAorICovCitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY2MHZkX2RhY19uaWRzWzNdID0geworCS8qIGZyb250LCByZWFyLCBjbGZlLCByZWFyX3N1cnIgKi8KKwkweDAyLCAweDA0LCAweDAzCit9OworCitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MXZkX2FkY19uaWRzWzFdID0geworCS8qIEFEQzAgKi8KKwkweDA5LAorfTsKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4NjF2ZF9jYXBzcmNfbmlkc1sxXSA9IHsgMHgyMiB9OworCisvKiBpbnB1dCBNVVggKi8KKy8qIEZJWE1FOiBzaG91bGQgYmUgYSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDQsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDAgfSwKKwkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCisJCXsgIkxpbmUiLCAweDIgfSwKKwkJeyAiQ0QiLCAweDQgfSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg2MXZkX2RhbGxhc19jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMiwKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MCB9LAorCQl7ICJJbnRlcm5hbCBNaWMiLCAweDEgfSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg2MXZkX2hwX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSAyLAorCS5pdGVtcyA9IHsKKwkJeyAiRnJvbnQgTWljIiwgMHgwIH0sCisJCXsgIkFUQVBJIE1pYyIsIDB4MSB9LAorCX0sCit9OworCisvKgorICogMmNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXNbMV0gPSB7CisJeyAyLCBOVUxMIH0KK307CisKKy8qCisgKiA2Y2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkXzZzdGFja19jaDZfaW5pdFtdID0geworCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCisJeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDhjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfNnN0YWNrX2NoOF9pbml0W10gPSB7CisJeyAweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODYxdmRfNnN0YWNrX21vZGVzWzJdID0geworCXsgNiwgYWxjODYxdmRfNnN0YWNrX2NoNl9pbml0IH0sCisJeyA4LCBhbGM4NjF2ZF82c3RhY2tfY2g4X2luaXQgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9jaG1vZGVfbWl4ZXJbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAorCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCisJCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCisJCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKiBQaW4gYXNzaWdubWVudDogRnJvbnQ9MHgxNCwgUmVhcj0weDE1LCBDTEZFPTB4MTYsIFNpZGU9MHgxNworICogICAgICAgICAgICAgICAgIE1pYz0weDE4LCBGcm9udCBNaWM9MHgxOSwgTGluZS1Jbj0weDFhLCBIUD0weDFiCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF82c3RfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAxLCAweDAsCisJCQkJSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMiwgMHgwLAorCQkJCUhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKworCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF8zc3RfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKworCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9sZW5vdm9fbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCS8qSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwqLworCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAorCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogUGluIGFzc2lnbm1lbnQ6IFNwZWFrZXI9MHgxNCwgSFAgPSAweDE1LAorICogICAgICAgICAgICAgICAgIE1pYz0weDE4LCBJbnRlcm5hbCBNaWMgPSAweDE5LCBDRCA9IDB4MWMsIFBDIEJlZXAgPSAweDFkCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9kYWxsYXNfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCisvKiBQaW4gYXNzaWdubWVudDogU3BlYWtlcj0weDE0LCBMaW5lLW91dCA9IDB4MTUsCisgKiAgICAgICAgICAgICAgICAgRnJvbnQgTWljPTB4MTgsIEFUQVBJIE1pYyA9IDB4MTksCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9ocF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkFUQVBJIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkFUQVBJIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisKKwl7IH0gLyogZW5kICovCit9OworCisvKgorICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgorCSAqLworCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCisJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZgorCSAqIHRoZSBhbmFsb2ctbG9vcGJhY2sgbWl4ZXIgd2lkZ2V0CisJICovCisJLyogQW1wIEluZGljZXM6IE1pYzEgPSAwLCBNaWMyID0gMSwgTGluZTEgPSAyLCBMaW5lMiA9IDMsIENEID0gNCAqLworCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKworCS8qIENhcHR1cmUgbWl4ZXI6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCisKKwkvKgorCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDAyIC0gMHgwNSkKKwkgKi8KKwkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLworCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCisJLyogc2V0IHVwIGlucHV0IGFtcHMgZm9yIGFuYWxvZyBsb29wYmFjayAqLworCS8qIEFtcCBJbmRpY2VzOiBEQUMgPSAwLCBtaXhlciA9IDEgKi8KKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisKKwl7IH0KK307CisKKy8qCisgKiAzLXN0YWNrIHBpbiBjb25maWd1cmF0aW9uOgorICogZnJvbnQgPSAweDE0LCBtaWMvY2xmZSA9IDB4MTgsIEhQID0gMHgxOSwgbGluZS9zdXJyID0gMHgxYSwgZi1taWMgPSAweDFiCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIFNldCBwaW4gbW9kZSBhbmQgbXV0aW5nCisJICovCisJLyogc2V0IGZyb250IHBpbiB3aWRnZXRzIDB4MTQgZm9yIG91dHB1dCAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCS8qIE1pYyAocmVhcikgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogTGluZSBJbiBwaW46IGlucHV0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBMaW5lLTIgSW46IEhlYWRwaG9uZSBvdXRwdXQgKG91dHB1dCAwIC0gMHgwYykgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisKKwl7IH0KK307CisKKy8qCisgKiA2LXN0YWNrIHBpbiBjb25maWd1cmF0aW9uOgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkXzZzdGFja19pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBTZXQgcGluIG1vZGUgYW5kIG11dGluZworCSAqLworCS8qIHNldCBmcm9udCBwaW4gd2lkZ2V0cyAweDE0IGZvciBvdXRwdXQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwkvKiBSZWFyIFBpbjogb3V0cHV0IDEgKDB4MGQpICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCS8qIENMRkUgUGluOiBvdXRwdXQgMiAoMHgwZSkgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisJLyogU2lkZSBQaW46IG91dHB1dCAzICgweDBmKSAqLworCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKKworCS8qIE1pYyAocmVhcikgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogTGluZSBJbiBwaW46IGlucHV0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBMaW5lLTIgSW46IEhlYWRwaG9uZSBvdXRwdXQgKG91dHB1dCAwIC0gMHgwYykgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfZWFwZF92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkX2xlbm92b191bnNvbF92ZXJic1tdID0geworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKKwl7fQorfTsKKworc3RhdGljIHZvaWQgYWxjODYxdmRfbGVub3ZvX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIHZvaWQgYWxjODYxdmRfbGVub3ZvX2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlhbGNfaHBfYXV0b211dGUoY29kZWMpOworCWFsYzg4eF9zaW1wbGVfbWljX2F1dG9tdXRlKGNvZGVjKTsKK30KKworc3RhdGljIHZvaWQgYWxjODYxdmRfbGVub3ZvX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQl1bnNpZ25lZCBpbnQgcmVzKQoreworCXN3aXRjaCAocmVzID4+IDI2KSB7CisJY2FzZSBBTENfTUlDX0VWRU5UOgorCQlhbGM4OHhfc2ltcGxlX21pY19hdXRvbXV0ZShjb2RlYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFsY19za3VfdW5zb2xfZXZlbnQoY29kZWMsIHJlcyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjF2ZF9kYWxsYXNfdmVyYnNbXSA9IHsKKwl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKworCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisKKwl7IH0gLyogZW5kICovCit9OworCisvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGM4NjF2ZF9kYWxsYXNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKKy8qCisgKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGM4NjF2ZF9tb2RlbHNbQUxDODYxVkRfTU9ERUxfTEFTVF0gPSB7CisJW0FMQzY2MFZEXzNTVF0JCT0gIjNzdGFjay02NjAiLAorCVtBTEM2NjBWRF8zU1RfRElHXQk9ICIzc3RhY2stNjYwLWRpZ291dCIsCisJW0FMQzY2MFZEX0FTVVNfVjFTXQk9ICJhc3VzLXYxcyIsCisJW0FMQzg2MVZEXzNTVF0JCT0gIjNzdGFjayIsCisJW0FMQzg2MVZEXzNTVF9ESUddCT0gIjNzdGFjay1kaWdvdXQiLAorCVtBTEM4NjFWRF82U1RfRElHXQk9ICI2c3RhY2stZGlnb3V0IiwKKwlbQUxDODYxVkRfTEVOT1ZPXQk9ICJsZW5vdm8iLAorCVtBTEM4NjFWRF9EQUxMQVNdCT0gImRhbGxhcyIsCisJW0FMQzg2MVZEX0hQXQkJPSAiaHAiLAorCVtBTEM4NjFWRF9BVVRPXQkJPSAiYXV0byIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODYxdmRfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweGE4OGQsICJSZWFsdGVrIEFMQzY2MCBkZW1vIiwgQUxDNjYwVkRfM1NUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGJmLCAiSFAgVFgxMDAwIiwgQUxDODYxVkRfSFApLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyZTIsICJBc3VzIHozNW0iLCBBTEM2NjBWRF8zU1QpLAorCS8qU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOSwgIkFzdXMgRzEiLCBBTEM2NjBWRF8zU1QpLCovIC8qIGF1dG8gKi8KKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjMzLCAiQXN1cyBWMVNuIiwgQUxDNjYwVkRfQVNVU19WMVMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxZTcsICJBU1VTIiwgQUxDNjYwVkRfM1NUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwZGUsIDB4MDNmMCwgIlJlYWx0ZWsgQUxDNjYwIGRlbW8iLCBBTEM2NjBWRF8zU1QpLAorCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMDAsICJUb3NoaWJhIEExMzUiLCBBTEM4NjFWRF9MRU5PVk8pLAorCS8qU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYwMCwgIkRBTExBUyIsIEFMQzg2MVZEX0RBTExBUyksKi8gLypsZW5vdm8qLworCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMDEsICJUb3NoaWJhIEExMzUiLCBBTEM4NjFWRF9MRU5PVk8pLAorCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMDMsICJUb3NoaWJhIFAyMDUiLCBBTEM4NjFWRF9MRU5PVk8pLAorCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMzEsICJUb3NoaWJhIEwzMC0xNDkiLCBBTEM4NjFWRF9EQUxMQVMpLAorCVNORF9QQ0lfUVVJUksoMHgxNTY1LCAweDgyMGQsICJCaW9zdGFyIE5GNjFTIFNFIiwgQUxDODYxVkRfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxN2FhLCAiTGVub3ZvIiwgQUxDODYxVkRfTEVOT1ZPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMHgwODYyLCAiQVNSb2NrIEs4TkY2Ry1WU1RBIiwgQUxDODYxVkRfNlNUX0RJRyksCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjODYxdmRfcHJlc2V0c1tdID0geworCVtBTEM2NjBWRF8zU1RdID0geworCQkubWl4ZXJzID0geyBhbGM4NjF2ZF8zc3RfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCSBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2MHZkX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjNjYwdmRfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDNjYwVkRfM1NUX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MXZkXzNzdF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJIGFsYzg2MXZkXzNzdGFja19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYwdmRfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM2NjB2ZF9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODYxVkRfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4NjF2ZF9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4NjFWRF8zU1RdID0geworCQkubWl4ZXJzID0geyBhbGM4NjF2ZF8zc3RfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCSBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODYxVkRfM1NUX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MXZkXzNzdF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCisJCSAJCSBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODYxVkRfNlNUX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MXZkXzZzdF9taXhlciwgYWxjODYxdmRfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4NjF2ZF82c3RhY2tfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF82c3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfNnN0YWNrX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg2MVZEX0xFTk9WT10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MXZkX2xlbm92b19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnMsCisJCQkJYWxjODYxdmRfZWFwZF92ZXJicywKKwkJCQlhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjB2ZF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzY2MHZkX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg2MXZkX2xlbm92b19zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsYzg2MXZkX2xlbm92b19pbml0X2hvb2ssCisJfSwKKwlbQUxDODYxVkRfREFMTEFTXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODYxdmRfZGFsbGFzX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF9kYWxsYXNfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjF2ZF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg2MXZkX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2RhbGxhc19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODYxdmRfZGFsbGFzX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAorCX0sCisJW0FMQzg2MVZEX0hQXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODYxdmRfaHBfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX2RhbGxhc192ZXJicywgYWxjODYxdmRfZWFwZF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfaHBfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg2MXZkX2RhbGxhc19zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM2NjBWRF9BU1VTX1YxU10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MXZkX2xlbm92b19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnMsCisJCQkJYWxjODYxdmRfZWFwZF92ZXJicywKKwkJCQlhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjB2ZF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzY2MHZkX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4NjFWRF9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg2MXZkX2xlbm92b19zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsYzg2MXZkX2xlbm92b19pbml0X2hvb2ssCisJfSwKK307CisKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjODgwX3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGM4ODBfcXVpcmtzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0NGQyYgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvYWxjODgwX3F1aXJrcy5jCkBAIC0wLDAgKzEsMTg5OCBAQAorLyoKKyAqIEFMQzg4MCBxdWlyayBtb2RlbHMKKyAqIGluY2x1ZGVkIGJ5IHBhdGNoX3JlYWx0ZWsuYworICovCisKKy8qIEFMQzg4MCBib2FyZCBjb25maWcgdHlwZSAqLworZW51bSB7CisJQUxDODgwX0FVVE8sCisJQUxDODgwXzNTVCwKKwlBTEM4ODBfM1NUX0RJRywKKwlBTEM4ODBfNVNULAorCUFMQzg4MF81U1RfRElHLAorCUFMQzg4MF9XODEwLAorCUFMQzg4MF9aNzFWLAorCUFMQzg4MF82U1QsCisJQUxDODgwXzZTVF9ESUcsCisJQUxDODgwX0YxNzM0LAorCUFMQzg4MF9BU1VTLAorCUFMQzg4MF9BU1VTX0RJRywKKwlBTEM4ODBfQVNVU19XMVYsCisJQUxDODgwX0FTVVNfRElHMiwKKwlBTEM4ODBfRlVKSVRTVSwKKwlBTEM4ODBfVU5JV0lMTF9ESUcsCisJQUxDODgwX1VOSVdJTEwsCisJQUxDODgwX1VOSVdJTExfUDUzLAorCUFMQzg4MF9DTEVWTywKKwlBTEM4ODBfVENMX1M3MDAsCisJQUxDODgwX0xHLAorCUFMQzg4MF9MR19MVywKKwlBTEM4ODBfTUVESU9OX1JJTSwKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJQUxDODgwX1RFU1QsCisjZW5kaWYKKwlBTEM4ODBfTU9ERUxfTEFTVCAvKiBsYXN0IHRhZyAqLworfTsKKworLyoKKyAqIEFMQzg4MCAzLXN0YWNrIG1vZGVsCisgKgorICogREFDOiBGcm9udCA9IDB4MDIgKDB4MGMpLCBTdXJyID0gMHgwNSAoMHgwZiksIENMRkUgPSAweDA0ICgweDBlKQorICogUGluIGFzc2lnbm1lbnQ6IEZyb250ID0gMHgxNCwgTGluZS1Jbi9TdXJyID0gMHgxYSwgTWljL0NMRkUgPSAweDE4LAorICogICAgICAgICAgICAgICAgIEYtTWljID0gMHgxYiwgSFAgPSAweDE5CisgKi8KKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODBfZGFjX25pZHNbNF0gPSB7CisJLyogZnJvbnQsIHJlYXIsIGNsZmUsIHJlYXJfc3VyciAqLworCTB4MDIsIDB4MDUsIDB4MDQsIDB4MDMKK307CisKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgwX2FkY19uaWRzWzNdID0geworCS8qIEFEQzAtMiAqLworCTB4MDcsIDB4MDgsIDB4MDksCit9OworCisvKiBUaGUgZGF0YXNoZWV0IHNheXMgdGhlIG5vZGUgMHgwNyBpcyBjb25uZWN0ZWQgZnJvbSBpbnB1dHMsCisgKiBidXQgaXQgc2hvd3MgemVybyBjb25uZWN0aW9uIGluIHRoZSByZWFsIGltcGxlbWVudGF0aW9uIG9uIHNvbWUgZGV2aWNlcy4KKyAqIE5vdGU6IHRoaXMgaXMgYSA5MTVHQVYgYnVnLCBmaXhlZCBvbiA5MTVHTFYKKyAqLworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODBfYWRjX25pZHNfYWx0WzJdID0geworCS8qIEFEQzEtMiAqLworCTB4MDgsIDB4MDksCit9OworCisjZGVmaW5lIEFMQzg4MF9ESUdPVVRfTklECTB4MDYKKyNkZWZpbmUgQUxDODgwX0RJR0lOX05JRAkweDBhCisjZGVmaW5lIEFMQzg4MF9QSU5fQ0RfTklECTB4MWMKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4MF9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gNCwKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MCB9LAorCQl7ICJGcm9udCBNaWMiLCAweDMgfSwKKwkJeyAiTGluZSIsIDB4MiB9LAorCQl7ICJDRCIsIDB4NCB9LAorCX0sCit9OworCisvKiBjaGFubmVsIHNvdXJjZSBzZXR0aW5nICgyLzYgY2hhbm5lbCBzZWxlY3Rpb24gZm9yIDMtc3RhY2spICovCisvKiAyY2ggbW9kZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfdGhyZWVzdGFja19jaDJfaW5pdFtdID0geworCS8qIHNldCBsaW5lLWluIHRvIGlucHV0LCBtdXRlIGl0ICovCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCisJLyogc2V0IG1pYy1pbiB0byBpbnB1dCB2cmVmIDgwJSwgbXV0ZSBpdCAqLworCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCisJeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKiA2Y2ggbW9kZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfdGhyZWVzdGFja19jaDZfaW5pdFtdID0geworCS8qIHNldCBsaW5lLWluIHRvIG91dHB1dCwgdW5tdXRlIGl0ICovCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisJLyogc2V0IG1pYy1pbiB0byBvdXRwdXQsIHVubXV0ZSBpdCAqLworCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4ODBfdGhyZWVzdGFja19tb2Rlc1syXSA9IHsKKwl7IDIsIGFsYzg4MF90aHJlZXN0YWNrX2NoMl9pbml0IH0sCisJeyA2LCBhbGM4ODBfdGhyZWVzdGFja19jaDZfaW5pdCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF90aHJlZV9zdGFja19taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTksIDB4MCwgSERBX09VVFBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIEFMQzg4MCA1LXN0YWNrIG1vZGVsCisgKgorICogREFDOiBGcm9udCA9IDB4MDIgKDB4MGMpLCBTdXJyID0gMHgwNSAoMHgwZiksIENMRkUgPSAweDA0ICgweDBkKSwKKyAqICAgICAgU2lkZSA9IDB4MDIgKDB4ZCkKKyAqIFBpbiBhc3NpZ25tZW50OiBGcm9udCA9IDB4MTQsIFN1cnIgPSAweDE3LCBDTEZFID0gMHgxNgorICogICAgICAgICAgICAgICAgIExpbmUtSW4vU2lkZSA9IDB4MWEsIE1pYyA9IDB4MTgsIEYtTWljID0gMHgxYiwgSFAgPSAweDE5CisgKi8KKworLyogYWRkaXRpb25hbCBtaXhlcnMgdG8gYWxjODgwX3RocmVlX3N0YWNrX21peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX2ZpdmVfc3RhY2tfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJTaWRlIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIGNoYW5uZWwgc291cmNlIHNldHRpbmcgKDYvOCBjaGFubmVsIHNlbGVjdGlvbiBmb3IgNS1zdGFjaykgKi8KKy8qIDZjaCBtb2RlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9maXZlc3RhY2tfY2g2X2luaXRbXSA9IHsKKwkvKiBzZXQgbGluZS1pbiB0byBpbnB1dCwgbXV0ZSBpdCAqLworCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIDhjaCBtb2RlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9maXZlc3RhY2tfY2g4X2luaXRbXSA9IHsKKwkvKiBzZXQgbGluZS1pbiB0byBvdXRwdXQsIHVubXV0ZSBpdCAqLworCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4ODBfZml2ZXN0YWNrX21vZGVzWzJdID0geworCXsgNiwgYWxjODgwX2ZpdmVzdGFja19jaDZfaW5pdCB9LAorCXsgOCwgYWxjODgwX2ZpdmVzdGFja19jaDhfaW5pdCB9LAorfTsKKworCisvKgorICogQUxDODgwIDYtc3RhY2sgbW9kZWwKKyAqCisgKiBEQUM6IEZyb250ID0gMHgwMiAoMHgwYyksIFN1cnIgPSAweDAzICgweDBkKSwgQ0xGRSA9IDB4MDQgKDB4MGUpLAorICogICAgICBTaWRlID0gMHgwNSAoMHgwZikKKyAqIFBpbiBhc3NpZ25tZW50OiBGcm9udCA9IDB4MTQsIFN1cnIgPSAweDE1LCBDTEZFID0gMHgxNiwgU2lkZSA9IDB4MTcsCisgKiAgIE1pYyA9IDB4MTgsIEYtTWljID0gMHgxOSwgTGluZSA9IDB4MWEsIEhQID0gMHgxYgorICovCisKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgwXzZzdF9kYWNfbmlkc1s0XSA9IHsKKwkvKiBmcm9udCwgcmVhciwgY2xmZSwgcmVhcl9zdXJyICovCisJMHgwMiwgMHgwMywgMHgwNCwgMHgwNQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4MF82c3RhY2tfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDQsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDAgfSwKKwkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCisJCXsgIkxpbmUiLCAweDIgfSwKKwkJeyAiQ0QiLCAweDQgfSwKKwl9LAorfTsKKworLyogZml4ZWQgOC1jaGFubmVscyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4MF9zaXhzdGFja19tb2Rlc1sxXSA9IHsKKwl7IDgsIE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfc2l4X3N0YWNrX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworCisvKgorICogQUxDODgwIFc4MTAgbW9kZWwKKyAqCisgKiBXODEwIGhhcyByZWFyIElPIGZvcjoKKyAqIEZyb250IChEQUMgMDIpCisgKiBTdXJyb3VuZCAoREFDIDAzKQorICogQ2VudGVyL0xGRSAoREFDIDA0KQorICogRGlnaXRhbCBvdXQgKDA2KQorICoKKyAqIFRoZSBzeXN0ZW0gYWxzbyBoYXMgYSBwYWlyIG9mIGludGVybmFsIHNwZWFrZXJzLCBhbmQgYSBoZWFkcGhvbmUgamFjay4KKyAqIFRoZXNlIGFyZSBib3RoIGNvbm5lY3RlZCB0byBMaW5lMiBvbiB0aGUgY29kZWMsIGhlbmNlIHRvIERBQyAwMi4KKyAqCisgKiBUaGVyZSBpcyBhIHZhcmlhYmxlIHJlc2lzdG9yIHRvIGNvbnRyb2wgdGhlIHNwZWFrZXIgb3IgaGVhZHBob25lCisgKiB2b2x1bWUuIFRoaXMgaXMgYSBoYXJkd2FyZS1vbmx5IGRldmljZSB3aXRob3V0IGEgc29mdHdhcmUgQVBJLgorICoKKyAqIFBsdWdnaW5nIGhlYWRwaG9uZXMgaW4gd2lsbCBkaXNhYmxlIHRoZSBpbnRlcm5hbCBzcGVha2Vycy4gVGhpcyBpcworICogaW1wbGVtZW50ZWQgaW4gaGFyZHdhcmUsIG5vdCB2aWEgdGhlIGRyaXZlciB1c2luZyBqYWNrIHNlbnNlLiBJbgorICogYSBzaW1pbGFyIGZhc2hpb24sIHBsdWdnaW5nIGludG8gdGhlIHJlYXIgc29ja2V0IG1hcmtlZCAiZnJvbnQiIHdpbGwKKyAqIGRpc2FibGUgYm90aCB0aGUgc3BlYWtlcnMgYW5kIGhlYWRwaG9uZXMuCisgKgorICogRm9yIGlucHV0LCB0aGVyZSdzIGEgbWljcm9waG9uZSBqYWNrLCBhbmQgYW4gImF1ZGlvIGluIiBqYWNrLgorICogVGhlc2UgbWF5IG5vdCBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aCB0aGlzIGRyaXZlciB5ZXQsIGJlY2F1c2UgSQorICogaGF2ZW4ndCBzZXR1cCBhbnkgaW5pdGlhbGl6YXRpb24gdmVyYnMgZm9yIHRoZXNlIHlldC4uLgorICovCisKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgwX3c4MTBfZGFjX25pZHNbM10gPSB7CisJLyogZnJvbnQsIHJlYXIvc3Vycm91bmQsIGNsZmUgKi8KKwkweDAyLCAweDAzLCAweDA0Cit9OworCisvKiBmaXhlZCA2IGNoYW5uZWxzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODgwX3c4MTBfbW9kZXNbMV0gPSB7CisJeyA2LCBOVUxMIH0KK307CisKKy8qIFBpbiBhc3NpZ25tZW50OiBGcm9udCA9IDB4MTQsIFN1cnIgPSAweDE1LCBDTEZFID0gMHgxNiwgSFAgPSAweDFiICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX3c4MTBfYmFzZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworCisvKgorICogWjcxMFYgbW9kZWwKKyAqCisgKiBEQUM6IEZyb250ID0gMHgwMiAoMHgwYyksIEhQID0gMHgwMyAoMHgwZCkKKyAqIFBpbiBhc3NpZ25tZW50OiBGcm9udCA9IDB4MTQsIEhQID0gMHgxNSwgTWljID0gMHgxOCwgTWljMiA9IDB4MTkoPyksCisgKiAgICAgICAgICAgICAgICAgTGluZSA9IDB4MWEKKyAqLworCitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg4MF96NzF2X2RhY19uaWRzWzFdID0geworCTB4MDIKK307CisjZGVmaW5lIEFMQzg4MF9aNzFWX0hQX0RBQwkweDAzCisKKy8qIGZpeGVkIDIgY2hhbm5lbHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4ODBfMl9qYWNrX21vZGVzWzFdID0geworCXsgMiwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX3o3MXZfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKworLyoKKyAqIEFMQzg4MCBGMTczNCBtb2RlbAorICoKKyAqIERBQzogSFAgPSAweDAyICgweDBjKSwgRnJvbnQgPSAweDAzICgweDBkKQorICogUGluIGFzc2lnbm1lbnQ6IEhQID0gMHgxNCwgRnJvbnQgPSAweDE1LCBNaWMgPSAweDE4CisgKi8KKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODBfZjE3MzRfZGFjX25pZHNbMV0gPSB7CisJMHgwMworfTsKKyNkZWZpbmUgQUxDODgwX0YxNzM0X0hQX0RBQwkweDAyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfZjE3MzRfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgwX2YxNzM0X2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSAyLAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgxIH0sCisJCXsgIkNEIiwgMHg0IH0sCisJfSwKK307CisKKworLyoKKyAqIEFMQzg4MCBBU1VTIG1vZGVsCisgKgorICogREFDOiBIUC9Gcm9udCA9IDB4MDIgKDB4MGMpLCBTdXJyID0gMHgwMyAoMHgwZCksIENMRkUgPSAweDA0ICgweDBlKQorICogUGluIGFzc2lnbm1lbnQ6IEhQL0Zyb250ID0gMHgxNCwgU3VyciA9IDB4MTUsIENMRkUgPSAweDE2LAorICogIE1pYyA9IDB4MTgsIExpbmUgPSAweDFhCisgKi8KKworI2RlZmluZSBhbGM4ODBfYXN1c19kYWNfbmlkcwlhbGM4ODBfdzgxMF9kYWNfbmlkcwkvKiBpZGVudGljYWwgd2l0aCB3ODEwICovCisjZGVmaW5lIGFsYzg4MF9hc3VzX21vZGVzCWFsYzg4MF90aHJlZXN0YWNrX21vZGVzCS8qIDIvNiBjaGFubmVsIG1vZGUgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF9hc3VzX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAorCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCisJCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCisJCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKgorICogQUxDODgwIEFTVVMgVzFWIG1vZGVsCisgKgorICogREFDOiBIUC9Gcm9udCA9IDB4MDIgKDB4MGMpLCBTdXJyID0gMHgwMyAoMHgwZCksIENMRkUgPSAweDA0ICgweDBlKQorICogUGluIGFzc2lnbm1lbnQ6IEhQL0Zyb250ID0gMHgxNCwgU3VyciA9IDB4MTUsIENMRkUgPSAweDE2LAorICogIE1pYyA9IDB4MTgsIExpbmUgPSAweDFhLCBMaW5lMiA9IDB4MWIKKyAqLworCisvKiBhZGRpdGlvbmFsIG1peGVycyB0byBhbGM4ODBfYXN1c19taXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF9hc3VzX3cxdl9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDMsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogVENMIFM3MDAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfdGNsX3M3MDBfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBCLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBCLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBCLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBCLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIFVuaXdpbGwgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfdW5pd2lsbF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAorCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCisJCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCisJCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX2Z1aml0c3VfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfdW5pd2lsbF9wNTNfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIGluaXRpYWxpemUgdGhlIGNvZGVjIHZvbHVtZXMsIGV0YworICovCisKKy8qCisgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBVbm11dGUgQURDMC0yIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCisJICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisKKwkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZSBhbmFsb2ctbG9vcGJhY2sKKwkgKiBtaXhlciB3aWRnZXQKKwkgKiBOb3RlOiBQQVNEIG1vdGhlcmJvYXJkcyB1c2VzIHRoZSBMaW5lIEluIDIgYXMgdGhlIGlucHV0IGZvciBmcm9udAorCSAqIHBhbmVsIG1pYyAobWljIDIpCisJICovCisJLyogQW1wIEluZGljZXM6IE1pYzEgPSAwLCBNaWMyID0gMSwgTGluZTEgPSAyLCBMaW5lMiA9IDMsIENEID0gNCAqLworCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNil9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg3KX0sCisKKwkvKgorCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDBjIC0gMHgwZikKKwkgKi8KKwkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KKwkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCisJeyB9Cit9OworCisvKgorICogMy1zdGFjayBwaW4gY29uZmlndXJhdGlvbjoKKyAqIGZyb250ID0gMHgxNCwgbWljL2NsZmUgPSAweDE4LCBIUCA9IDB4MTksIGxpbmUvc3VyciA9IDB4MWEsIGYtbWljID0gMHgxYgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9waW5fM3N0YWNrX2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIHByZXNldCBjb25uZWN0aW9uIGxpc3RzIG9mIGlucHV0IHBpbnMKKwkgKiAwID0gZnJvbnQsIDEgPSByZWFyX3N1cnIsIDIgPSBDTEZFLCAzID0gc3Vycm91bmQKKwkgKi8KKwl7MHgxMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LCAvKiBtaWMvY2xmZSAqLworCXsweDExLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwgLyogbGluZS9zdXJyb3VuZCAqLworCisJLyoKKwkgKiBTZXQgcGluIG1vZGUgYW5kIG11dGluZworCSAqLworCS8qIHNldCBmcm9udCBwaW4gd2lkZ2V0cyAweDE0IGZvciBvdXRwdXQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIE1pYzEgKHJlYXIgcGFuZWwpIHBpbiB3aWRnZXQgZm9yIGlucHV0IGFuZCB2cmVmIGF0IDgwJSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIE1pYzIgKGFzIGhlYWRwaG9uZSBvdXQpIGZvciBIUCBvdXRwdXQgKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogTGluZSBJbiBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogTGluZTIgKGFzIGZyb250IG1pYykgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCisJeyB9Cit9OworCisvKgorICogNS1zdGFjayBwaW4gY29uZmlndXJhdGlvbjoKKyAqIGZyb250ID0gMHgxNCwgc3Vycm91bmQgPSAweDE3LCBjbGZlID0gMHgxNiwgbWljID0gMHgxOCwgSFAgPSAweDE5LAorICogbGluZS1pbi9zaWRlID0gMHgxYSwgZi1taWMgPSAweDFiCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3Bpbl81c3RhY2tfaW5pdF92ZXJic1tdID0geworCS8qCisJICogcHJlc2V0IGNvbm5lY3Rpb24gbGlzdHMgb2YgaW5wdXQgcGlucworCSAqIDAgPSBmcm9udCwgMSA9IHJlYXJfc3VyciwgMiA9IENMRkUsIDMgPSBzdXJyb3VuZAorCSAqLworCXsweDExLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgLyogbGluZS9zaWRlICovCisKKwkvKgorCSAqIFNldCBwaW4gbW9kZSBhbmQgbXV0aW5nCisJICovCisJLyogc2V0IHBpbiB3aWRnZXRzIDB4MTQtMHgxNyBmb3Igb3V0cHV0ICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJLyogdW5tdXRlIHBpbnMgZm9yIG91dHB1dCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCisJLyogTWljMSAocmVhciBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogTWljMiAoYXMgaGVhZHBob25lIG91dCkgZm9yIEhQIG91dHB1dCAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwkvKiBMaW5lIEluIHBpbiB3aWRnZXQgZm9yIGlucHV0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBMaW5lMiAoYXMgZnJvbnQgbWljKSBwaW4gd2lkZ2V0IGZvciBpbnB1dCBhbmQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisKKwl7IH0KK307CisKKy8qCisgKiBXODEwIHBpbiBjb25maWd1cmF0aW9uOgorICogZnJvbnQgPSAweDE0LCBzdXJyb3VuZCA9IDB4MTUsIGNsZmUgPSAweDE2LCBIUCA9IDB4MWIKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfcGluX3c4MTBfaW5pdF92ZXJic1tdID0geworCS8qIGhwaG9uZS9zcGVha2VyIGlucHV0IHNlbGVjdG9yOiBmcm9udCBEQUMgKi8KKwl7MHgxMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MH0sCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisKKwl7IH0KK307CisKKy8qCisgKiBaNzFWIHBpbiBjb25maWd1cmF0aW9uOgorICogU3BlYWtlci1vdXQgPSAweDE0LCBIUCA9IDB4MTUsIE1pYyA9IDB4MTgsIExpbmUtaW4gPSAweDFhLCBNaWMyID0gMHgxYiAoPykKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfcGluX3o3MXZfaW5pdF92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCisJeyB9Cit9OworCisvKgorICogNi1zdGFjayBwaW4gY29uZmlndXJhdGlvbjoKKyAqIGZyb250ID0gMHgxNCwgc3VyciA9IDB4MTUsIGNsZmUgPSAweDE2LCBzaWRlID0gMHgxNywgbWljID0gMHgxOCwKKyAqIGYtbWljID0gMHgxOSwgbGluZSA9IDB4MWEsIEhQID0gMHgxYgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9waW5fNnN0YWNrX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLworCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisKKwl7IH0KK307CisKKy8qCisgKiBVbml3aWxsIHBpbiBjb25maWd1cmF0aW9uOgorICogSFAgPSAweDE0LCBJbnRlcm5hbFNwZWFrZXIgPSAweDE1LCBtaWMgPSAweDE4LCBpbnRlcm5hbCBtaWMgPSAweDE5LAorICogbGluZSA9IDB4MWEKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfdW5pd2lsbF9pbml0X3ZlcmJzW10gPSB7CisJezB4MTMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogSFAgKi8KKworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisKKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIHsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sICovCisJLyogezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwgKi8KKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCisJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCisKKwl7IH0KK307CisKKy8qCisqIFVuaXdpbGwgUDUzCisqIEhQID0gMHgxNCwgSW50ZXJuYWxTcGVha2VyID0gMHgxNSwgbWljID0gMHgxOSwKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfdW5pd2lsbF9wNTNfaW5pdF92ZXJic1tdID0geworCXsweDEzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfRENWT0xfRVZFTlR9LAorCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9iZWVwX2luaXRfdmVyYnNbXSA9IHsKKwl7IDB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNSkgfSwKKwl7IH0KK307CisKK3N0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE2OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7CisJYWxjODh4X3NpbXBsZV9taWNfYXV0b211dGUoY29kZWMpOworfQorCitzdGF0aWMgdm9pZCBhbGM4ODBfdW5pd2lsbF91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwkvKiBMb29rcyBsaWtlIHRoZSB1bnNvbCBldmVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKKwkgKiBkZWZpbml0aW9uLiAgNGJpdCB0YWcgaXMgcGxhY2VkIGF0IDI4IGJpdCEKKwkgKi8KKwlzd2l0Y2ggKHJlcyA+PiAyOCkgeworCWNhc2UgQUxDX01JQ19FVkVOVDoKKwkJYWxjODh4X3NpbXBsZV9taWNfYXV0b211dGUoY29kZWMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhbGNfc2t1X3Vuc29sX2V2ZW50KGNvZGVjLCByZXMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX3A1M19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfcDUzX2Rjdm9sX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50OworCisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgyMSwgMCwKKwkJCQkgICAgIEFDX1ZFUkJfR0VUX1ZPTFVNRV9LTk9CX0NPTlRST0wsIDApOworCXByZXNlbnQgJj0gSERBX0FNUF9WT0xNQVNLOworCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwYywgSERBX09VVFBVVCwgMCwKKwkJCQkgSERBX0FNUF9WT0xNQVNLLCBwcmVzZW50KTsKKwlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGQsIEhEQV9PVVRQVVQsIDAsCisJCQkJIEhEQV9BTVBfVk9MTUFTSywgcHJlc2VudCk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX3A1M191bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwkvKiBMb29rcyBsaWtlIHRoZSB1bnNvbCBldmVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKKwkgKiBkZWZpbml0aW9uLiAgNGJpdCB0YWcgaXMgcGxhY2VkIGF0IDI4IGJpdCEKKwkgKi8KKwlpZiAoKHJlcyA+PiAyOCkgPT0gQUxDX0RDVk9MX0VWRU5UKQorCQlhbGM4ODBfdW5pd2lsbF9wNTNfZGN2b2xfYXV0b211dGUoY29kZWMpOworCWVsc2UKKwkJYWxjX3NrdV91bnNvbF9ldmVudChjb2RlYywgcmVzKTsKK30KKworLyoKKyAqIEYxNzM0IHBpbiBjb25maWd1cmF0aW9uOgorICogSFAgPSAweDE0LCBzcGVha2VyLW91dCA9IDB4MTUsIG1pYyA9IDB4MTgKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfcGluX2YxNzM0X2luaXRfdmVyYnNbXSA9IHsKKwl7MHgwNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCXsweDEwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisJezB4MTEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgxMiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCXsweDEzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGNTB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCisJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU58QUxDX0hQX0VWRU5UfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTnxBTENfRENWT0xfRVZFTlR9LAorCisJeyB9Cit9OworCisvKgorICogQVNVUyBwaW4gY29uZmlndXJhdGlvbjoKKyAqIEhQL2Zyb250ID0gMHgxNCwgc3VyciA9IDB4MTUsIGNsZmUgPSAweDE2LCBtaWMgPSAweDE4LCBsaW5lID0gMHgxYQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9waW5fYXN1c19pbml0X3ZlcmJzW10gPSB7CisJezB4MTAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwKKwl7MHgxMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDEyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJezB4MTMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCisJeyB9Cit9OworCisvKiBFbmFibGUgR1BJTyBtYXNrIGFuZCBzZXQgb3V0cHV0ICovCisjZGVmaW5lIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzCWFsY19ncGlvMV9pbml0X3ZlcmJzCisjZGVmaW5lIGFsYzg4MF9ncGlvMl9pbml0X3ZlcmJzCWFsY19ncGlvMl9pbml0X3ZlcmJzCisjZGVmaW5lIGFsYzg4MF9ncGlvM19pbml0X3ZlcmJzCWFsY19ncGlvM19pbml0X3ZlcmJzCisKKy8qIENsZXZvIG01MjBnIGluaXQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3Bpbl9jbGV2b19pbml0X3ZlcmJzW10gPSB7CisJLyogaGVhZHBob25lIG91dHB1dCAqLworCXsweDExLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJLyogbGluZS1vdXQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIExpbmUtaW4gKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogQ0QgKi8KKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogTWljMSAocmVhciBwYW5lbCkgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIE1pYzIgKGZyb250IHBhbmVsKSAqLworCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogaGVhZHBob25lICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorICAgICAgICAvKiBjaGFuZ2UgdG8gRUFQRCBtb2RlICovCisJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDd9LAorCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsICAweDMwNjB9LAorCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9waW5fdGNsX1M3MDBfaW5pdF92ZXJic1tdID0geworCS8qIGNoYW5nZSB0byBFQVBEIG1vZGUgKi8KKwl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwN30sCisJezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgIDB4MzA2MH0sCisKKwkvKiBIZWFkcGhvbmUgb3V0cHV0ICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwkvKiBGcm9udCBvdXRwdXQqLworCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwkvKiBMaW5lIEluIHBpbiB3aWRnZXQgZm9yIGlucHV0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJLyogTWljMSAocmVhciBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisKKwkvKiBjaGFuZ2UgdG8gRUFQRCBtb2RlICovCisJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDd9LAorCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsICAweDMwNzB9LAorCisJeyB9Cit9OworCisvKgorICogTEcgbTEgZXhwcmVzcyBkdWFsCisgKgorICogUGluIGFzc2lnbm1lbnQ6CisgKiAgIFJlYXIgTGluZS1Jbi9PdXQgKGJsdWUpOiAweDE0CisgKiAgIEJ1aWxkLWluIE1pYy1JbjogMHgxNQorICogICBTcGVha2VyLW91dDogMHgxNworICogICBIUC1PdXQgKGdyZWVuKTogMHgxYgorICogICBNaWMtSW4vT3V0IChyZWQpOiAweDE5CisgKiAgIFNQRElGLU91dDogMHgxZQorICovCisKKy8qIFRvIG1ha2UgNS4xIG91dHB1dCB3b3JraW5nIChncmVlbj1Gcm9udCwgYmx1ZT1TdXJyLCByZWQ9Q0xGRSkgKi8KK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgwX2xnX2RhY19uaWRzWzNdID0geworCTB4MDUsIDB4MDIsIDB4MDMKK307CisKKy8qIHNlZW1zIGFuYWxvZyBDRCBpcyBub3Qgd29ya2luZyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4MF9sZ19jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMywKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHg1IH0sCisJCXsgIkludGVybmFsIE1pYyIsIDB4NiB9LAorCX0sCit9OworCisvKiAyLDQsNiBjaGFubmVsIG1vZGVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9sZ19jaDJfaW5pdFtdID0geworCS8qIHNldCBsaW5lLWluIGFuZCBtaWMtaW4gdG8gaW5wdXQgKi8KKwl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCisJeyAweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX2xnX2NoNF9pbml0W10gPSB7CisJLyogc2V0IGxpbmUtaW4gdG8gb3V0IGFuZCBtaWMtaW4gdG8gaW5wdXQgKi8KKwl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQIH0sCisJeyAweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX2xnX2NoNl9pbml0W10gPSB7CisJLyogc2V0IGxpbmUtaW4gYW5kIG1pYy1pbiB0byBvdXRwdXQgKi8KKwl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQIH0sCisJeyAweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUCB9LAorCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4MF9sZ19jaF9tb2Rlc1szXSA9IHsKKwl7IDIsIGFsYzg4MF9sZ19jaDJfaW5pdCB9LAorCXsgNCwgYWxjODgwX2xnX2NoNF9pbml0IH0sCisJeyA2LCBhbGM4ODBfbGdfY2g2X2luaXQgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfbGdfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAxLCAyLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDYsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDcsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfbGdfaW5pdF92ZXJic1tdID0geworCS8qIHNldCBjYXB0dXJlIHNvdXJjZSB0byBtaWMtaW4gKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwkvKiBtdXRlIGFsbCBhbXAgbWl4ZXIgaW5wdXRzICovCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNSl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg2KX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDcpfSwKKwkvKiBsaW5lLWluIHRvIGlucHV0ICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIGJ1aWx0LWluIG1pYyAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogc3BlYWtlci1vdXQgKi8KKwl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogbWljLWluIHRvIGlucHV0ICovCisJezB4MTEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIEhQLW91dCAqLworCXsweDEzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwM30sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIGphY2sgc2Vuc2UgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJeyB9Cit9OworCisvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGM4ODBfbGdfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNzsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKKy8qCisgKiBMRyBMVzIwCisgKgorICogUGluIGFzc2lnbm1lbnQ6CisgKiAgIFNwZWFrZXItb3V0OiAweDE0CisgKiAgIE1pYy1JbjogMHgxOAorICogICBCdWlsdC1pbiBNaWMtSW46IDB4MTkKKyAqICAgTGluZS1JbjogMHgxYgorICogICBIUC1PdXQ6IDB4MWEKKyAqICAgU1BESUYtT3V0OiAweDFlCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4MF9sZ19sd19jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMywKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MCB9LAorCQl7ICJJbnRlcm5hbCBNaWMiLCAweDEgfSwKKwkJeyAiTGluZSBJbiIsIDB4MiB9LAorCX0sCit9OworCisjZGVmaW5lIGFsYzg4MF9sZ19sd19tb2RlcyBhbGM4ODBfdGhyZWVzdGFja19tb2RlcworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX2xnX2x3X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGYsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCisJCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKKwkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKKwkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX2xnX2x3X2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLworCXsweDEwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sIC8qIG1pYy9jbGZlICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwgLyogbGluZS9zdXJyb3VuZCAqLworCisJLyogc2V0IGNhcHR1cmUgc291cmNlIHRvIG1pYy1pbiAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg3KX0sCisJLyogc3BlYWtlci1vdXQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogSFAtb3V0ICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIG1pYy1pbiB0byBpbnB1dCAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogYnVpbHQtaW4gbWljICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwkvKiBqYWNrIHNlbnNlICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAorCXsgfQorfTsKKworLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLworc3RhdGljIHZvaWQgYWxjODgwX2xnX2x3X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX21lZGlvbl9yaW1fbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgwX21lZGlvbl9yaW1fY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDIsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDAgfSwKKwkJeyAiSW50ZXJuYWwgTWljIiwgMHgxIH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX21lZGlvbl9yaW1faW5pdF92ZXJic1tdID0geworCXsweDEzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisKKwkvKiBNaWMxIChyZWFyIHBhbmVsKSBwaW4gd2lkZ2V0IGZvciBpbnB1dCBhbmQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBNaWMyIChhcyBoZWFkcGhvbmUgb3V0KSBmb3IgSFAgb3V0cHV0ICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBJbnRlcm5hbCBTcGVha2VyICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCXsweDIwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDA3fSwKKwl7MHgyMCwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAgMHgzMDYwfSwKKworCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKKwl7IH0KK307CisKKy8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzg4MF9tZWRpb25fcmltX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7CisJLyogdG9nZ2xlIEVBUEQgKi8KKwlpZiAoc3BlYy0+amFja19wcmVzZW50KQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDAxLCAwLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDApOworCWVsc2UKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgwMSwgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAyKTsKK30KKworc3RhdGljIHZvaWQgYWxjODgwX21lZGlvbl9yaW1fdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgdW5zaWduZWQgaW50IHJlcykKK3sKKwkvKiBMb29rcyBsaWtlIHRoZSB1bnNvbCBldmVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKKwkgKiBkZWZpbml0aW9uLiAgNGJpdCB0YWcgaXMgcGxhY2VkIGF0IDI4IGJpdCEKKwkgKi8KKwlpZiAoKHJlcyA+PiAyOCkgPT0gQUxDX0hQX0VWRU5UKQorCQlhbGM4ODBfbWVkaW9uX3JpbV9hdXRvbXV0ZShjb2RlYyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4MF9tZWRpb25fcmltX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MWI7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworfQorCisjaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQorc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYW1wX2xpc3QgYWxjODgwX2xnX2xvb3BiYWNrc1tdID0geworCXsgMHgwYiwgSERBX0lOUFVULCAxIH0sCisJeyAweDBiLCBIREFfSU5QVVQsIDYgfSwKKwl7IDB4MGIsIEhEQV9JTlBVVCwgNyB9LAorCXsgfSAvKiBlbmQgKi8KK307CisjZW5kaWYKKworLyoKKyAqIFRlc3QgY29uZmlndXJhdGlvbiBmb3IgZGVidWdnaW5nCisgKgorICogQWxtb3N0IGFsbCBpbnB1dHMvb3V0cHV0cyBhcmUgZW5hYmxlZC4gIEkvTyBwaW5zIGNhbiBiZSBjb25maWd1cmVkIHZpYQorICogZW51bSBjb250cm9scy4KKyAqLworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgwX3Rlc3RfZGFjX25pZHNbNF0gPSB7CisJMHgwMiwgMHgwMywgMHgwNCwgMHgwNQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4MF90ZXN0X2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA3LAorCS5pdGVtcyA9IHsKKwkJeyAiSW4tMSIsIDB4MCB9LAorCQl7ICJJbi0yIiwgMHgxIH0sCisJCXsgIkluLTMiLCAweDIgfSwKKwkJeyAiSW4tNCIsIDB4MyB9LAorCQl7ICJDRCIsIDB4NCB9LAorCQl7ICJGcm9udCIsIDB4NSB9LAorCQl7ICJTdXJyb3VuZCIsIDB4NiB9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODgwX3Rlc3RfbW9kZXNbNF0gPSB7CisJeyAyLCBOVUxMIH0sCisJeyA0LCBOVUxMIH0sCisJeyA2LCBOVUxMIH0sCisJeyA4LCBOVUxMIH0sCit9OworCitzdGF0aWMgaW50IGFsY190ZXN0X3Bpbl9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRzW10gPSB7CisJCSJOL0EiLCAiTGluZSBPdXQiLCAiSFAgT3V0IiwKKwkJIkluIEhpLVoiLCAiSW4gNTAlIiwgIkluIEdyZCIsICJJbiA4MCUiLCAiSW4gMTAwJSIKKwl9OworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA4OworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IDgpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSA3OworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxjX3Rlc3RfcGluX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IChoZGFfbmlkX3Qpa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IHBpbl9jdGwsIGl0ZW0gPSAwOworCisJcGluX2N0bCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1dJREdFVF9DT05UUk9MLCAwKTsKKwlpZiAocGluX2N0bCAmIEFDX1BJTkNUTF9PVVRfRU4pIHsKKwkJaWYgKHBpbl9jdGwgJiBBQ19QSU5DVExfSFBfRU4pCisJCQlpdGVtID0gMjsKKwkJZWxzZQorCQkJaXRlbSA9IDE7CisJfSBlbHNlIGlmIChwaW5fY3RsICYgQUNfUElOQ1RMX0lOX0VOKSB7CisJCXN3aXRjaCAocGluX2N0bCAmIEFDX1BJTkNUTF9WUkVGRU4pIHsKKwkJY2FzZSBBQ19QSU5DVExfVlJFRl9ISVo6IGl0ZW0gPSAzOyBicmVhazsKKwkJY2FzZSBBQ19QSU5DVExfVlJFRl81MDogIGl0ZW0gPSA0OyBicmVhazsKKwkJY2FzZSBBQ19QSU5DVExfVlJFRl9HUkQ6IGl0ZW0gPSA1OyBicmVhazsKKwkJY2FzZSBBQ19QSU5DVExfVlJFRl84MDogIGl0ZW0gPSA2OyBicmVhazsKKwkJY2FzZSBBQ19QSU5DVExfVlJFRl8xMDA6IGl0ZW0gPSA3OyBicmVhazsKKwkJfQorCX0KKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaXRlbTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGNfdGVzdF9waW5fY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwloZGFfbmlkX3QgbmlkID0gKGhkYV9uaWRfdClrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGN0bHNbXSA9IHsKKwkJMCwgQUNfUElOQ1RMX09VVF9FTiwgQUNfUElOQ1RMX09VVF9FTiB8IEFDX1BJTkNUTF9IUF9FTiwKKwkJQUNfUElOQ1RMX0lOX0VOIHwgQUNfUElOQ1RMX1ZSRUZfSElaLAorCQlBQ19QSU5DVExfSU5fRU4gfCBBQ19QSU5DVExfVlJFRl81MCwKKwkJQUNfUElOQ1RMX0lOX0VOIHwgQUNfUElOQ1RMX1ZSRUZfR1JELAorCQlBQ19QSU5DVExfSU5fRU4gfCBBQ19QSU5DVExfVlJFRl84MCwKKwkJQUNfUElOQ1RMX0lOX0VOIHwgQUNfUElOQ1RMX1ZSRUZfMTAwLAorCX07CisJdW5zaWduZWQgaW50IG9sZF9jdGwsIG5ld19jdGw7CisKKwlvbGRfY3RsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fV0lER0VUX0NPTlRST0wsIDApOworCW5ld19jdGwgPSBjdGxzW3Vjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF1dOworCWlmIChvbGRfY3RsICE9IG5ld19jdGwpIHsKKwkJaW50IHZhbDsKKwkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAorCQkJCQkgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCQkJICBuZXdfY3RsKTsKKwkJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+PSAzID8KKwkJCUhEQV9BTVBfTVVURSA6IDA7CisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgbmlkLCBIREFfT1VUUFVULCAwLAorCQkJCQkgSERBX0FNUF9NVVRFLCB2YWwpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxjX3Rlc3RfcGluX3NyY19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHNbXSA9IHsKKwkJIkZyb250IiwgIlN1cnJvdW5kIiwgIkNMRkUiLCAiU2lkZSIKKwl9OworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA0OworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IDQpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAzOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxjX3Rlc3RfcGluX3NyY19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IChoZGFfbmlkX3Qpa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IHNlbDsKKworCXNlbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9DT05ORUNUX1NFTCwgMCk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNlbCAmIDM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxjX3Rlc3RfcGluX3NyY19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IChoZGFfbmlkX3Qpa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IHNlbDsKKworCXNlbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9DT05ORUNUX1NFTCwgMCkgJiAzOworCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICE9IHNlbCkgeworCQlzZWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICYgMzsKKwkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAorCQkJCQkgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBzZWwpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUElOX0NUTF9URVNUKHhuYW1lLG5pZCkgewkJCVwKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCVwKKwkJCS5uYW1lID0geG5hbWUsCQkgICAgICAgXAorCQkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCBuaWQsIFwKKwkJCS5pbmZvID0gYWxjX3Rlc3RfcGluX2N0bF9pbmZvLCBcCisJCQkuZ2V0ID0gYWxjX3Rlc3RfcGluX2N0bF9nZXQsICAgXAorCQkJLnB1dCA9IGFsY190ZXN0X3Bpbl9jdGxfcHV0LCAgIFwKKwkJCS5wcml2YXRlX3ZhbHVlID0gbmlkCSAgICAgICBcCisJCQl9CisKKyNkZWZpbmUgUElOX1NSQ19URVNUKHhuYW1lLG5pZCkgewkJCVwKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCVwKKwkJCS5uYW1lID0geG5hbWUsCQkgICAgICAgXAorCQkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCBuaWQsIFwKKwkJCS5pbmZvID0gYWxjX3Rlc3RfcGluX3NyY19pbmZvLCBcCisJCQkuZ2V0ID0gYWxjX3Rlc3RfcGluX3NyY19nZXQsICAgXAorCQkJLnB1dCA9IGFsY190ZXN0X3Bpbl9zcmNfcHV0LCAgIFwKKwkJCS5wcml2YXRlX3ZhbHVlID0gbmlkCSAgICAgICBcCisJCQl9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfdGVzdF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU2lkZSBQbGF5YmFjayBWb2x1bWUiLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQklORF9NVVRFKCJDTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAyLCBIREFfSU5QVVQpLAorCVBJTl9DVExfVEVTVCgiRnJvbnQgUGluIE1vZGUiLCAweDE0KSwKKwlQSU5fQ1RMX1RFU1QoIlN1cnJvdW5kIFBpbiBNb2RlIiwgMHgxNSksCisJUElOX0NUTF9URVNUKCJDTEZFIFBpbiBNb2RlIiwgMHgxNiksCisJUElOX0NUTF9URVNUKCJTaWRlIFBpbiBNb2RlIiwgMHgxNyksCisJUElOX0NUTF9URVNUKCJJbi0xIFBpbiBNb2RlIiwgMHgxOCksCisJUElOX0NUTF9URVNUKCJJbi0yIFBpbiBNb2RlIiwgMHgxOSksCisJUElOX0NUTF9URVNUKCJJbi0zIFBpbiBNb2RlIiwgMHgxYSksCisJUElOX0NUTF9URVNUKCJJbi00IFBpbiBNb2RlIiwgMHgxYiksCisJUElOX1NSQ19URVNUKCJJbi0xIFBpbiBTb3VyY2UiLCAweDE4KSwKKwlQSU5fU1JDX1RFU1QoIkluLTIgUGluIFNvdXJjZSIsIDB4MTkpLAorCVBJTl9TUkNfVEVTVCgiSW4tMyBQaW4gU291cmNlIiwgMHgxYSksCisJUElOX1NSQ19URVNUKCJJbi00IFBpbiBTb3VyY2UiLCAweDFiKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbi0xIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW4tMSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW4tMiBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkluLTIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkluLTMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbi0zIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbi00IFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW4tNCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHg0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDQsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfdGVzdF9pbml0X3ZlcmJzW10gPSB7CisJLyogVW5tdXRlIGlucHV0cyBvZiAweDBjIC0gMHgwZiAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJLyogVm9sIG91dHB1dCBmb3IgMHgwYy0weDBmICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJLyogU2V0IG91dHB1dCBwaW5zIDB4MTQtMHgxNyAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCS8qIFVubXV0ZSBvdXRwdXQgcGlucyAweDE0LTB4MTcgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIFNldCBpbnB1dCBwaW5zIDB4MTgtMHgxYyAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCS8qIE11dGUgaW5wdXQgcGlucyAweDE4LTB4MWIgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBBREMgc2V0IHVwICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogQW5hbG9nIGlucHV0L3Bhc3N0aHJ1ICovCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAorCXsgfQorfTsKKyNlbmRpZgorCisvKgorICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjODgwX21vZGVsc1tBTEM4ODBfTU9ERUxfTEFTVF0gPSB7CisJW0FMQzg4MF8zU1RdCQk9ICIzc3RhY2siLAorCVtBTEM4ODBfVENMX1M3MDBdCT0gInRjbCIsCisJW0FMQzg4MF8zU1RfRElHXQk9ICIzc3RhY2stZGlnb3V0IiwKKwlbQUxDODgwX0NMRVZPXQkJPSAiY2xldm8iLAorCVtBTEM4ODBfNVNUXQkJPSAiNXN0YWNrIiwKKwlbQUxDODgwXzVTVF9ESUddCT0gIjVzdGFjay1kaWdvdXQiLAorCVtBTEM4ODBfVzgxMF0JCT0gInc4MTAiLAorCVtBTEM4ODBfWjcxVl0JCT0gIno3MXYiLAorCVtBTEM4ODBfNlNUXQkJPSAiNnN0YWNrIiwKKwlbQUxDODgwXzZTVF9ESUddCT0gIjZzdGFjay1kaWdvdXQiLAorCVtBTEM4ODBfQVNVU10JCT0gImFzdXMiLAorCVtBTEM4ODBfQVNVU19XMVZdCT0gImFzdXMtdzF2IiwKKwlbQUxDODgwX0FTVVNfRElHXQk9ICJhc3VzLWRpZyIsCisJW0FMQzg4MF9BU1VTX0RJRzJdCT0gImFzdXMtZGlnMiIsCisJW0FMQzg4MF9VTklXSUxMX0RJR10JPSAidW5pd2lsbCIsCisJW0FMQzg4MF9VTklXSUxMX1A1M10JPSAidW5pd2lsbC1wNTMiLAorCVtBTEM4ODBfRlVKSVRTVV0JPSAiZnVqaXRzdSIsCisJW0FMQzg4MF9GMTczNF0JCT0gIkYxNzM0IiwKKwlbQUxDODgwX0xHXQkJPSAibGciLAorCVtBTEM4ODBfTEdfTFddCQk9ICJsZy1sdyIsCisJW0FMQzg4MF9NRURJT05fUklNXQk9ICJtZWRpb24iLAorI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKwlbQUxDODgwX1RFU1RdCQk9ICJ0ZXN0IiwKKyNlbmRpZgorCVtBTEM4ODBfQVVUT10JCT0gImF1dG8iLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzg4MF9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MGY2OSwgIkNvZXVzIEc2MTBQIiwgQUxDODgwX1c4MTApLAorCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweGE4ODAsICJFQ1MiLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4YTg4NCwgIkFjZXIgQVBGViIsIEFMQzg4MF82U1QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwNzAsICJVTEkiLCBBTEM4ODBfM1NUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA3NywgIlVMSSIsIEFMQzg4MF82U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMDc4LCAiVUxJIiwgQUxDODgwXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwODcsICJVTEkiLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4ZTMwOSwgIlVMSSIsIEFMQzg4MF8zU1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHhlMzEwLCAiVUxJIiwgQUxDODgwXzNTVCksCisJU05EX1BDSV9RVUlSSygweDEwMzksIDB4MTIzNCwgTlVMTCwgQUxDODgwXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwYjMsICJBU1VTIFcxViIsIEFMQzg4MF9BU1VTX1cxViksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTBjMiwgIkFTVVMgVzZBIiwgQUxDODgwX0FTVVNfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMGMzLCAiQVNVUyBXeHgiLCBBTEM4ODBfQVNVU19ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExMTMsICJBU1VTIiwgQUxDODgwX0FTVVNfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTIzLCAiQVNVUyIsIEFMQzg4MF9BU1VTX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTE3MywgIkFTVVMiLCBBTEM4ODBfQVNVU19ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5NjQsICJBU1VTIFo3MVYiLCBBTEM4ODBfWjcxViksCisJLyogU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk2NCwgIkFTVVMiLCBBTEM4ODBfQVNVU19ESUcpLCAqLworCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5NzMsICJBU1VTIiwgQUxDODgwX0FTVVNfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWIzLCAiQVNVUyIsIEFMQzg4MF9BU1VTX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODE0ZSwgIkFTVVMgUDVHRDEgdy9TUERJRiIsIEFMQzg4MF82U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MTgxLCAiQVNVUyBQNEdQTCIsIEFMQzg4MF9BU1VTX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODE5NiwgIkFTVVMgUDVHRDEiLCBBTEM4ODBfNlNUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MWI0LCAiQVNVUyIsIEFMQzg4MF82U1QpLAorCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTA0MywgIkFTVVMiLCBBTEM4ODBfQVNVUyksIC8qIGRlZmF1bHQgQVNVUyAqLworCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxYTAsICJTb255IiwgQUxDODgwXzNTVCksCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4ODFkNiwgIlNvbnkiLCBBTEM4ODBfM1NUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3YiwgMHgzMDMyLCAiR2F0ZXdheSIsIEFMQzg4MF81U1QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDMwMzMsICJHYXRld2F5IiwgQUxDODgwXzVTVCksCisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4NDAzOSwgIkdhdGV3YXkiLCBBTEM4ODBfNVNUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTI5NywgMHhjNzkwLCAiU2h1dHRsZSBTVDIwRzUiLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NTgsIDB4YTEwMiwgIkdpZ2FieXRlIEs4IiwgQUxDODgwXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDExNTAsICJNU0kiLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE1MDksIDB4OTI1ZCwgIkZJQyBQNE0iLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE1NTgsIDB4MDUyMCwgIkNsZXZvIG01MjBHIiwgQUxDODgwX0NMRVZPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU1OCwgMHgwNjYwLCAiQ2xldm8gbTY1NW4iLCBBTEM4ODBfQ0xFVk8pLAorCVNORF9QQ0lfUVVJUksoMHgxNTU4LCAweDU0MDEsICJBU1VTIiwgQUxDODgwX0FTVVNfRElHMiksCisJU05EX1BDSV9RVUlSSygweDE1NjUsIDB4ODIwMiwgIkJpb3N0YXIiLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE1ODQsIDB4OTA1MCwgIlVuaXdpbGwiLCBBTEM4ODBfVU5JV0lMTF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNTQsICJVbml3aWxsIiwgQUxDODgwX0YxNzM0KSwKKwlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHg5MDcwLCAiVW5pd2lsbCIsIEFMQzg4MF9VTklXSUxMKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHg5MDc3LCAiVW5pd2lsbCBQNTMiLCBBTEM4ODBfVU5JV0lMTF9QNTMpLAorCVNORF9QQ0lfUVVJUksoMHgxNjFmLCAweDIwM2QsICJXODEwIiwgQUxDODgwX1c4MTApLAorCVNORF9QQ0lfUVVJUksoMHgxNjFmLCAweDIwNWQsICJNZWRpb24gUmltIDIxNTAiLCBBTEM4ODBfTUVESU9OX1JJTSksCisJU05EX1BDSV9RVUlSSygweDE2OTUsIDB4NDAwZCwgIkVQb1giLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE2OTUsIDB4NDAxMiwgIkVQb3ggRVAtNUxEQSIsIEFMQzg4MF81U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTczNCwgMHgxMDdjLCAiRlNDIEYxNzM0IiwgQUxDODgwX0YxNzM0KSwKKwlTTkRfUENJX1FVSVJLKDB4MTczNCwgMHgxMDk0LCAiRlNDIEFtaWxvIE0xNDUxRyIsIEFMQzg4MF9GVUpJVFNVKSwKKwlTTkRfUENJX1FVSVJLKDB4MTczNCwgMHgxMGFjLCAiRlNDIEFNSUxPIFhpIDE1MjYiLCBBTEM4ODBfRjE3MzQpLAorCVNORF9QQ0lfUVVJUksoMHgxNzM0LCAweDEwYjAsICJGdWppdHN1IiwgQUxDODgwX0ZVSklUU1UpLAorCVNORF9QQ0lfUVVJUksoMHgxODU0LCAweDAwMTgsICJMRyBMVzIwIiwgQUxDODgwX0xHX0xXKSwKKwlTTkRfUENJX1FVSVJLKDB4MTg1NCwgMHgwMDNiLCAiTEciLCBBTEM4ODBfTEcpLAorCVNORF9QQ0lfUVVJUksoMHgxODU0LCAweDAwNWYsICJMRyBQMSBFeHByZXNzIiwgQUxDODgwX0xHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTg1NCwgMHgwMDY4LCAiTEcgdzEiLCBBTEM4ODBfTEcpLAorCVNORF9QQ0lfUVVJUksoMHgxODU0LCAweDAwNzcsICJMRyBMVzI1IiwgQUxDODgwX0xHX0xXKSwKKwlTTkRfUENJX1FVSVJLKDB4MTlkYiwgMHg0MTg4LCAiVENMIFM3MDAiLCBBTEM4ODBfVENMX1M3MDApLAorCVNORF9QQ0lfUVVJUksoMHgyNjY4LCAweDgwODYsIE5VTEwsIEFMQzg4MF82U1RfRElHKSwgLyogYnJva2VuIEJJT1MgKi8KKwlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHgyNjY4LCBOVUxMLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4YTEwMCwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDQwMCwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDQwMSwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDQwMiwgIkludGVsIG1vYm8iLCBBTEM4ODBfM1NUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTIyNCwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTMwNSwgIkludGVsIG1vYm8iLCBBTEM4ODBfM1NUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTMwOCwgIkludGVsIG1vYm8iLCBBTEM4ODBfM1NUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTQwMCwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTQwMSwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTQwMiwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJLyogZGVmYXVsdCBJbnRlbCAqLworCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4ODA4NiwgIkludGVsIG1vYm8iLCBBTEM4ODBfM1NUKSwKKwlTTkRfUENJX1FVSVJLKDB4YTBhMCwgMHgwNTYwLCAiQU9wZW4gaTkxNUdNbS1IRlMiLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweGU4MDMsIDB4MTAxOSwgTlVMTCwgQUxDODgwXzZTVF9ESUcpLAorCXt9Cit9OworCisvKgorICogQUxDODgwIGNvZGVjIHByZXNldHMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfY29uZmlnX3ByZXNldCBhbGM4ODBfcHJlc2V0c1tdID0geworCVtBTEM4ODBfM1NUXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgwX3RocmVlX3N0YWNrX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl8zc3RhY2tfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF9kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF90aHJlZXN0YWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF90aHJlZXN0YWNrX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODgwXzNTVF9ESUddID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfdGhyZWVfc3RhY2tfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfcGluXzNzdGFja19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF90aHJlZXN0YWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF90aHJlZXN0YWNrX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODgwX1RDTF9TNzAwXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgwX3RjbF9zNzAwX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl90Y2xfUzcwMF9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9ncGlvMl9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwX2RhY19uaWRzLAorCQkuYWRjX25pZHMgPSBhbGM4ODBfYWRjX25pZHNfYWx0LCAvKiBGSVhNRTogY29ycmVjdD8gKi8KKwkJLm51bV9hZGNfbmlkcyA9IDEsIC8qIHNpbmdsZSBBREMgKi8KKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfMl9qYWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF8yX2phY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4MF81U1RdID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfdGhyZWVfc3RhY2tfbWl4ZXIsCisJCQkgICAgYWxjODgwX2ZpdmVfc3RhY2tfbWl4ZXJ9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9waW5fNXN0YWNrX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODBfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfZml2ZXN0YWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF9maXZlc3RhY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4MF81U1RfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgwX3RocmVlX3N0YWNrX21peGVyLAorCQkJICAgIGFsYzg4MF9maXZlX3N0YWNrX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl81c3RhY2tfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgwX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfZml2ZXN0YWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF9maXZlc3RhY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4MF82U1RdID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfc2l4X3N0YWNrX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl82c3RhY2tfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF82c3RfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODBfNnN0X2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3NpeHN0YWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF9zaXhzdGFja19tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODBfNnN0YWNrX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4MF82U1RfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgwX3NpeF9zdGFja19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9waW5fNnN0YWNrX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfNnN0X2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwXzZzdF9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgwX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfc2l4c3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3NpeHN0YWNrX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF82c3RhY2tfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODgwX1c4MTBdID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfdzgxMF9iYXNlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl93ODEwX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX2dwaW8yX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfdzgxMF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF93ODEwX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF93ODEwX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF93ODEwX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4ODBfWjcxVl0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4MF96NzF2X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl96NzF2X2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfejcxdl9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF96NzF2X2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfMl9qYWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF8yX2phY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4MF9GMTczNF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4MF9mMTczNF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9waW5fZjE3MzRfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9mMTczNF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF9mMTczNF9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDIsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfMl9qYWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF8yX2phY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgwX2YxNzM0X2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGM4ODBfdW5pd2lsbF9wNTNfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg4MF91bml3aWxsX3A1M19zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODBfQVNVU10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4MF9hc3VzX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl9hc3VzX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX2dwaW8xX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF9hc3VzX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX2FzdXNfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX2FzdXNfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4ODBfQVNVU19ESUddID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfYXN1c19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9waW5fYXN1c19pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2FzdXNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODBfYXN1c19kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgwX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfYXN1c19tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4MF9BU1VTX0RJRzJdID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfYXN1c19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9waW5fYXN1c19pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9ncGlvMl9pbml0X3ZlcmJzIH0sIC8qIHVzZSBHUElPMiAqLworCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9hc3VzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwX2FzdXNfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX2FzdXNfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX2FzdXNfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4ODBfQVNVU19XMVZdID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfYXN1c19taXhlciwgYWxjODgwX2FzdXNfdzF2X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl9hc3VzX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX2dwaW8xX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF9hc3VzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF9hc3VzX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF9hc3VzX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODgwX1VOSVdJTExfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgwX2FzdXNfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfcGluX2FzdXNfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9hc3VzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwX2FzdXNfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX2FzdXNfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX2FzdXNfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4ODBfVU5JV0lMTF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4MF91bml3aWxsX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3VuaXdpbGxfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9hc3VzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwX2FzdXNfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3RocmVlc3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3RocmVlc3RhY2tfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjODgwX3VuaXdpbGxfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg4MF91bml3aWxsX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjODgwX3VuaXdpbGxfaW5pdF9ob29rLAorCX0sCisJW0FMQzg4MF9VTklXSUxMX1A1M10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4MF91bml3aWxsX3A1M19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF91bml3aWxsX3A1M19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2FzdXNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODBfYXN1c19kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF93ODEwX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF90aHJlZXN0YWNrX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjODgwX3VuaXdpbGxfcDUzX3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM4ODBfdW5pd2lsbF9wNTNfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCisJfSwKKwlbQUxDODgwX0ZVSklUU1VdID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfZnVqaXRzdV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF91bml3aWxsX3A1M19pbml0X3ZlcmJzLAorCSAgICAgICAJCQlhbGM4ODBfYmVlcF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF8yX2phY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwXzJfamFja19tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg4MF91bml3aWxsX3A1M191bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODgwX3VuaXdpbGxfcDUzX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAorCX0sCisJW0FMQzg4MF9DTEVWT10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4MF90aHJlZV9zdGFja19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9waW5fY2xldm9faW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfdGhyZWVzdGFja19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfdGhyZWVzdGFja19tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4MF9MR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4MF9sZ19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9sZ19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2xnX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwX2xnX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF9sZ19jaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfbGdfY2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9sZ19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODgwX2xnX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAorI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKwkJLmxvb3BiYWNrcyA9IGFsYzg4MF9sZ19sb29wYmFja3MsCisjZW5kaWYKKwl9LAorCVtBTEM4ODBfTEdfTFddID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfbGdfbHdfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfbGdfbHdfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgwX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfbGdfbHdfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX2xnX2x3X21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9sZ19sd19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODgwX2xnX2x3X3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAorCX0sCisJW0FMQzg4MF9NRURJT05fUklNXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgwX21lZGlvbl9yaW1fbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfbWVkaW9uX3JpbV9pbml0X3ZlcmJzLAorCQkJCWFsY19ncGlvMl9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF8yX2phY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwXzJfamFja19tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODBfbWVkaW9uX3JpbV9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjODgwX21lZGlvbl9yaW1fdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg4MF9tZWRpb25fcmltX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjODgwX21lZGlvbl9yaW1fYXV0b211dGUsCisJfSwKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJW0FMQzg4MF9URVNUXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgwX3Rlc3RfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF90ZXN0X2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfdGVzdF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF90ZXN0X2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF90ZXN0X21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF90ZXN0X21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF90ZXN0X2NhcHR1cmVfc291cmNlLAorCX0sCisjZW5kaWYKK307CisKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjODgyX3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGM4ODJfcXVpcmtzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3ZDA0NwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvYWxjODgyX3F1aXJrcy5jCkBAIC0wLDAgKzEsMzc1NSBAQAorLyoKKyAqIEFMQzg4Mi9BTEM4ODMvQUxDODg4L0FMQzg4OSBxdWlyayBtb2RlbHMKKyAqIGluY2x1ZGVkIGJ5IHBhdGNoX3JlYWx0ZWsuYworICovCisKKy8qIEFMQzg4MiBtb2RlbHMgKi8KK2VudW0geworCUFMQzg4Ml9BVVRPLAorCUFMQzg4Ml8zU1RfRElHLAorCUFMQzg4Ml82U1RfRElHLAorCUFMQzg4Ml9BUklNQSwKKwlBTEM4ODJfVzJKQywKKwlBTEM4ODJfVEFSR0EsCisJQUxDODgyX0FTVVNfQTdKLAorCUFMQzg4Ml9BU1VTX0E3TSwKKwlBTEM4ODVfTUFDUFJPLAorCUFMQzg4NV9NQkEyMSwKKwlBTEM4ODVfTUJQMywKKwlBTEM4ODVfTUI1LAorCUFMQzg4NV9NQUNNSU5JMywKKwlBTEM4ODVfSU1BQzI0LAorCUFMQzg4NV9JTUFDOTEsCisJQUxDODgzXzNTVF8yY2hfRElHLAorCUFMQzg4M18zU1RfNmNoX0RJRywKKwlBTEM4ODNfM1NUXzZjaCwKKwlBTEM4ODNfNlNUX0RJRywKKwlBTEM4ODNfVEFSR0FfRElHLAorCUFMQzg4M19UQVJHQV8yY2hfRElHLAorCUFMQzg4M19UQVJHQV84Y2hfRElHLAorCUFMQzg4M19BQ0VSLAorCUFMQzg4M19BQ0VSX0FTUElSRSwKKwlBTEM4ODhfQUNFUl9BU1BJUkVfNDkzMEcsCisJQUxDODg4X0FDRVJfQVNQSVJFXzY1MzBHLAorCUFMQzg4OF9BQ0VSX0FTUElSRV84OTMwRywKKwlBTEM4ODhfQUNFUl9BU1BJUkVfNzczMEcsCisJQUxDODgzX01FRElPTiwKKwlBTEM4ODNfTUVESU9OX1dJTTIxNjAsCisJQUxDODgzX0xBUFRPUF9FQVBELAorCUFMQzg4M19MRU5PVk9fMTAxRV8yY2gsCisJQUxDODgzX0xFTk9WT19OQjA3NjMsCisJQUxDODg4X0xFTk9WT19NUzcxOTVfRElHLAorCUFMQzg4OF9MRU5PVk9fU0tZLAorCUFMQzg4M19IQUlFUl9XNjYsCisJQUxDODg4XzNTVF9IUCwKKwlBTEM4ODhfNlNUX0RFTEwsCisJQUxDODgzX01JVEFDLAorCUFMQzg4M19DTEVWT19NNTQwUiwKKwlBTEM4ODNfQ0xFVk9fTTcyMCwKKwlBTEM4ODNfRlVKSVRTVV9QSTI1MTUsCisJQUxDODg4X0ZVSklUU1VfWEEzNTMwLAorCUFMQzg4M18zU1RfNmNoX0lOVEVMLAorCUFMQzg4OUFfSU5URUwsCisJQUxDODg5X0lOVEVMLAorCUFMQzg4OF9BU1VTX005MFYsCisJQUxDODg4X0FTVVNfRUVFMTYwMSwKKwlBTEM4ODlBX01CMzEsCisJQUxDMTIwMF9BU1VTX1A1USwKKwlBTEM4ODNfU09OWV9WQUlPX1RULAorCUFMQzg4Ml9NT0RFTF9MQVNULAorfTsKKworLyoKKyAqIDJjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4XzRTVF9jaDJfaW50ZWxfaW5pdFtdID0geworLyogTWljLWluIGphY2sgYXMgbWljIGluICovCisJeyAweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAorLyogTGluZS1pbiBqYWNrIGFzIExpbmUgaW4gKi8KKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKKy8qIExpbmUtT3V0IGFzIEZyb250ICovCisJeyAweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDRjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4XzRTVF9jaDRfaW50ZWxfaW5pdFtdID0geworLyogTWljLWluIGphY2sgYXMgbWljIGluICovCisJeyAweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAorLyogTGluZS1pbiBqYWNrIGFzIFN1cnJvdW5kICovCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisvKiBMaW5lLU91dCBhcyBGcm9udCAqLworCXsgMHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiA2Y2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF80U1RfY2g2X2ludGVsX2luaXRbXSA9IHsKKy8qIE1pYy1pbiBqYWNrIGFzIENMRkUgKi8KKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKy8qIExpbmUtaW4gamFjayBhcyBTdXJyb3VuZCAqLworCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorLyogTGluZS1PdXQgYXMgQ0xGRSAod29ya2Fyb3VuZCBiZWNhdXNlIE1pYy1pbiBpcyBub3QgbG91ZCBlbm91Z2gpICovCisJeyAweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwM30sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDhjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4XzRTVF9jaDhfaW50ZWxfaW5pdFtdID0geworLyogTWljLWluIGphY2sgYXMgQ0xGRSAqLworCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorLyogTGluZS1pbiBqYWNrIGFzIFN1cnJvdW5kICovCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisvKiBMaW5lLU91dCBhcyBTaWRlICovCisJeyAweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwM30sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4OF80U1RfOGNoX2ludGVsX21vZGVzWzRdID0geworCXsgMiwgYWxjODg4XzRTVF9jaDJfaW50ZWxfaW5pdCB9LAorCXsgNCwgYWxjODg4XzRTVF9jaDRfaW50ZWxfaW5pdCB9LAorCXsgNiwgYWxjODg4XzRTVF9jaDZfaW50ZWxfaW5pdCB9LAorCXsgOCwgYWxjODg4XzRTVF9jaDhfaW50ZWxfaW5pdCB9LAorfTsKKworLyoKKyAqIEFMQzg4OCBGdWppdHN1IFNpZW1lbnMgQW1pbGxvIHhhMzUzMAorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4X2Z1aml0c3VfeGEzNTMwX3ZlcmJzW10gPSB7CisvKiBGcm9udCBNaWM6IHNldCB0byBQSU5fSU4gKGVtcHR5IGJ5IGRlZmF1bHQpICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKy8qIENvbm5lY3QgSW50ZXJuYWwgSFAgdG8gRnJvbnQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisvKiBDb25uZWN0IEJhc3MgSFAgdG8gRnJvbnQgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisvKiBDb25uZWN0IExpbmUtT3V0IHNpZGUgamFjayAoU1BESUYpIHRvIFNpZGUgKi8KKwl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwM30sCisvKiBDb25uZWN0IE1pYyBqYWNrIHRvIENMRkUgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisvKiBDb25uZWN0IExpbmUtaW4gamFjayB0byBTdXJyb3VuZCAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKy8qIENvbm5lY3QgSFAgb3V0IGphY2sgdG8gRnJvbnQgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisvKiBFbmFibGUgdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgYW5kIExpbmUtb3V0IGphY2sgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCXt9Cit9OworCitzdGF0aWMgdm9pZCBhbGM4ODlfYXV0b211dGVfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTY7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE3OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzNdID0gMHgxOTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1s0XSA9IDB4MWE7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworfQorCitzdGF0aWMgdm9pZCBhbGM4ODlfaW50ZWxfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsYzg4OV9jb2VmX2luaXQoY29kZWMpOworCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4OF9mdWppdHN1X3hhMzUzMF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTc7IC8qIGxpbmUtb3V0ICovCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzFdID0gMHgxYjsgLyogaHAgKi8KKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7IC8qIHNwZWFrZXIgKi8KKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTU7IC8qIGJhc3MgKi8KKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKKy8qCisgKiBBTEM4ODggQWNlciBBc3BpcmUgNDkzMEcgbW9kZWwKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF9hY2VyX2FzcGlyZV80OTMwZ192ZXJic1tdID0geworLyogRnJvbnQgTWljOiBzZXQgdG8gUElOX0lOIChlbXB0eSBieSBkZWZhdWx0KSAqLworCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisvKiBVbnNlbGVjdCBGcm9udCBNaWMgYnkgZGVmYXVsdCBpbiBpbnB1dCBtaXhlciAzICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDB4Yil9LAorLyogRW5hYmxlIHVuc29saWNpdGVkIGV2ZW50IGZvciBIUCBqYWNrICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorLyogQ29ubmVjdCBJbnRlcm5hbCBIUCB0byBmcm9udCAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKy8qIENvbm5lY3QgSFAgb3V0IHRvIGZyb250ICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCisJeyB9Cit9OworCisvKgorICogQUxDODg4IEFjZXIgQXNwaXJlIDY1MzBHIG1vZGVsCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfYWNlcl9hc3BpcmVfNjUzMGdfdmVyYnNbXSA9IHsKKy8qIFJvdXRlIHRvIGJ1aWx0LWluIHN1Yndvb2ZlciBhcyB3ZWxsIGFzIHNwZWFrZXJzICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorLyogQmlhcyB2b2x0YWdlIG9uIGZvciBleHRlcm5hbCBtaWMgcG9ydCAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB8IFBJTl9WUkVGODB9LAorLyogRnJvbnQgTWljOiBzZXQgdG8gUElOX0lOIChlbXB0eSBieSBkZWZhdWx0KSAqLworCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisvKiBVbnNlbGVjdCBGcm9udCBNaWMgYnkgZGVmYXVsdCBpbiBpbnB1dCBtaXhlciAzICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDB4Yil9LAorLyogRW5hYmxlIHVuc29saWNpdGVkIGV2ZW50IGZvciBIUCBqYWNrICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorLyogRW5hYmxlIHNwZWFrZXIgb3V0cHV0ICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAorLyogRW5hYmxlIGhlYWRwaG9uZSBvdXRwdXQgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIHwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKKwl7IH0KK307CisKKy8qCisgKkFMQzg4OCBBY2VyIEFzcGlyZSA3NzMwRyBtb2RlbAorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4X2FjZXJfYXNwaXJlXzc3MzBHX3ZlcmJzW10gPSB7CisvKiBCaWFzIHZvbHRhZ2Ugb24gZm9yIGV4dGVybmFsIG1pYyBwb3J0ICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIHwgUElOX1ZSRUY4MH0sCisvKiBGcm9udCBNaWM6IHNldCB0byBQSU5fSU4gKGVtcHR5IGJ5IGRlZmF1bHQpICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKy8qIFVuc2VsZWN0IEZyb250IE1pYyBieSBkZWZhdWx0IGluIGlucHV0IG1peGVyIDMgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMHhiKX0sCisvKiBFbmFibGUgdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisvKiBFbmFibGUgc3BlYWtlciBvdXRwdXQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCisvKiBFbmFibGUgaGVhZHBob25lIG91dHB1dCAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAorLypFbmFibGUgaW50ZXJuYWwgc3Vid29vZmVyICovCisJezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCisJeyB9Cit9OworCisvKgorICogQUxDODg5IEFjZXIgQXNwaXJlIDg5MzBHIG1vZGVsCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODlfYWNlcl9hc3BpcmVfODkzMGdfdmVyYnNbXSA9IHsKKy8qIEZyb250IE1pYzogc2V0IHRvIFBJTl9JTiAoZW1wdHkgYnkgZGVmYXVsdCkgKi8KKwl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorLyogVW5zZWxlY3QgRnJvbnQgTWljIGJ5IGRlZmF1bHQgaW4gaW5wdXQgbWl4ZXIgMyAqLworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgweGIpfSwKKy8qIEVuYWJsZSB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKy8qIENvbm5lY3QgSW50ZXJuYWwgRnJvbnQgdG8gRnJvbnQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisvKiBDb25uZWN0IEludGVybmFsIFJlYXIgdG8gUmVhciAqLworCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKy8qIENvbm5lY3QgSW50ZXJuYWwgQ0xGRSB0byBDTEZFICovCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAorLyogQ29ubmVjdCBIUCBvdXQgdG8gRnJvbnQgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIHwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisvKiBFbmFibGUgYWxsIERBQ3MgKi8KKy8qICBEQUMgRElTQUJMRS9NVVRFIDE/ICovCisvKiAgc2V0dGluZyBiaXRzIDEtNSBkaXNhYmxlcyBEQUMgbmlkcyAweDAyLTB4MDYgYXBwYXJlbnRseS4gSW5pdD0weDM4ICovCisJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDN9LAorCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIDB4MDAwMH0sCisvKiAgREFDIERJU0FCTEUvTVVURSAyPyAqLworLyogIHNvbWUgYml0IGhlcmUgZGlzYWJsZXMgdGhlIG90aGVyIERBQ3MuIEluaXQ9MHg0OTAwICovCisJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDh9LAorCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIDB4MDAwMH0sCisvKiBETUlDIGZpeAorICogVGhpcyBsYXB0b3AgaGFzIGEgc3RlcmVvIGRpZ2l0YWwgbWljcm9waG9uZS4gVGhlIG1pY3MgYXJlIG9ubHkgMWNtIGFwYXJ0CisgKiB3aGljaCBtYWtlcyB0aGUgc3RlcmVvIHVzZWxlc3MuIEhvd2V2ZXIsIGVpdGhlciB0aGUgbWljIG9yIHRoZSBBTEM4ODkKKyAqIG1ha2VzIHRoZSBzaWduYWwgYmVjb21lIGEgZGlmZmVyZW5jZS9zdW0gc2lnbmFsIGluc3RlYWQgb2Ygc3RhbmRhcmQKKyAqIHN0ZXJlbywgd2hpY2ggaXMgYW5ub3lpbmcuIFNvIGluc3RlYWQgd2UgZmxpcCB0aGlzIGJpdCB3aGljaCBtYWtlcyB0aGUKKyAqIGNvZGVjIHJlcGxpY2F0ZSB0aGUgc3VtIHNpZ25hbCB0byBib3RoIGNoYW5uZWxzLCB0dXJuaW5nIGl0IGludG8gYQorICogbm9ybWFsIG1vbm8gbWljLgorICovCisvKiAgRE1JQ19DT05UUk9MPyBJbml0IHZhbHVlID0gMHgwMDAxICovCisJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MGJ9LAorCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIDB4MDAwM30sCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODg4XzJfY2FwdHVyZV9zb3VyY2VzWzJdID0geworCS8qIEZyb250IG1pYyBvbmx5IGF2YWlsYWJsZSBvbiBvbmUgQURDICovCisJeworCQkubnVtX2l0ZW1zID0gNCwKKwkJLml0ZW1zID0geworCQkJeyAiTWljIiwgMHgwIH0sCisJCQl7ICJMaW5lIiwgMHgyIH0sCisJCQl7ICJDRCIsIDB4NCB9LAorCQkJeyAiRnJvbnQgTWljIiwgMHhiIH0sCisJCX0sCisJfSwKKwl7CisJCS5udW1faXRlbXMgPSAzLAorCQkuaXRlbXMgPSB7CisJCQl7ICJNaWMiLCAweDAgfSwKKwkJCXsgIkxpbmUiLCAweDIgfSwKKwkJCXsgIkNEIiwgMHg0IH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4OF9hY2VyX2FzcGlyZV82NTMwX3NvdXJjZXNbMl0gPSB7CisJLyogSW50ZXJhbCBtaWMgb25seSBhdmFpbGFibGUgb24gb25lIEFEQyAqLworCXsKKwkJLm51bV9pdGVtcyA9IDUsCisJCS5pdGVtcyA9IHsKKwkJCXsgIk1pYyIsIDB4MCB9LAorCQkJeyAiTGluZSBJbiIsIDB4MiB9LAorCQkJeyAiQ0QiLCAweDQgfSwKKwkJCXsgIklucHV0IE1peCIsIDB4YSB9LAorCQkJeyAiSW50ZXJuYWwgTWljIiwgMHhiIH0sCisJCX0sCisJfSwKKwl7CisJCS5udW1faXRlbXMgPSA0LAorCQkuaXRlbXMgPSB7CisJCQl7ICJNaWMiLCAweDAgfSwKKwkJCXsgIkxpbmUgSW4iLCAweDIgfSwKKwkJCXsgIkNEIiwgMHg0IH0sCisJCQl7ICJJbnB1dCBNaXgiLCAweGEgfSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODg5X2NhcHR1cmVfc291cmNlc1szXSA9IHsKKwkvKiBEaWdpdGFsIG1pYyBvbmx5IGF2YWlsYWJsZSBvbiBmaXJzdCAiQURDIiAqLworCXsKKwkJLm51bV9pdGVtcyA9IDUsCisJCS5pdGVtcyA9IHsKKwkJCXsgIk1pYyIsIDB4MCB9LAorCQkJeyAiTGluZSIsIDB4MiB9LAorCQkJeyAiQ0QiLCAweDQgfSwKKwkJCXsgIkZyb250IE1pYyIsIDB4YiB9LAorCQkJeyAiSW5wdXQgTWl4IiwgMHhhIH0sCisJCX0sCisJfSwKKwl7CisJCS5udW1faXRlbXMgPSA0LAorCQkuaXRlbXMgPSB7CisJCQl7ICJNaWMiLCAweDAgfSwKKwkJCXsgIkxpbmUiLCAweDIgfSwKKwkJCXsgIkNEIiwgMHg0IH0sCisJCQl7ICJJbnB1dCBNaXgiLCAweGEgfSwKKwkJfSwKKwl9LAorCXsKKwkJLm51bV9pdGVtcyA9IDQsCisJCS5pdGVtcyA9IHsKKwkJCXsgIk1pYyIsIDB4MCB9LAorCQkJeyAiTGluZSIsIDB4MiB9LAorCQkJeyAiQ0QiLCAweDQgfSwKKwkJCXsgIklucHV0IE1peCIsIDB4YSB9LAorCQl9LAorCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODhfYmFzZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLAorCQlIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTaWRlIFBsYXliYWNrIFZvbHVtZSIsIDB4MGYsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODg4X2FjZXJfYXNwaXJlXzQ5MzBnX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsCisJCUhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiSW50ZXJuYWwgTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGYsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJJbnRlcm5hbCBMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4OV9hY2VyX2FzcGlyZV84OTMwZ19taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLAorCQlIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKworc3RhdGljIHZvaWQgYWxjODg4X2FjZXJfYXNwaXJlXzQ5MzBnX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxNzsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4OF9hY2VyX2FzcGlyZV82NTMwZ19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTc7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworfQorCitzdGF0aWMgdm9pZCBhbGM4ODhfYWNlcl9hc3BpcmVfNzczMGdfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTY7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE3OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIHZvaWQgYWxjODg5X2FjZXJfYXNwaXJlXzg5MzBnX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxYjsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKKyNkZWZpbmUgQUxDODgyX0RJR09VVF9OSUQJMHgwNgorI2RlZmluZSBBTEM4ODJfRElHSU5fTklECTB4MGEKKyNkZWZpbmUgQUxDODgzX0RJR09VVF9OSUQJQUxDODgyX0RJR09VVF9OSUQKKyNkZWZpbmUgQUxDODgzX0RJR0lOX05JRAlBTEM4ODJfRElHSU5fTklECisjZGVmaW5lIEFMQzEyMDBfRElHT1VUX05JRAkweDEwCisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4Ml9jaF9tb2Rlc1sxXSA9IHsKKwl7IDgsIE5VTEwgfQorfTsKKworLyogREFDcyAqLworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODJfZGFjX25pZHNbNF0gPSB7CisJLyogZnJvbnQsIHJlYXIsIGNsZmUsIHJlYXJfc3VyciAqLworCTB4MDIsIDB4MDMsIDB4MDQsIDB4MDUKK307CisjZGVmaW5lIGFsYzg4M19kYWNfbmlkcwkJYWxjODgyX2RhY19uaWRzCisKKy8qIEFEQ3MgKi8KKyNkZWZpbmUgYWxjODgyX2FkY19uaWRzCQlhbGM4ODBfYWRjX25pZHMKKyNkZWZpbmUgYWxjODgyX2FkY19uaWRzX2FsdAlhbGM4ODBfYWRjX25pZHNfYWx0CisjZGVmaW5lIGFsYzg4M19hZGNfbmlkcwkJYWxjODgyX2FkY19uaWRzX2FsdAorc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODNfYWRjX25pZHNfYWx0WzFdID0geyAweDA4IH07CitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg4M19hZGNfbmlkc19yZXZbMl0gPSB7IDB4MDksIDB4MDggfTsKKyNkZWZpbmUgYWxjODg5X2FkY19uaWRzCQlhbGM4ODBfYWRjX25pZHMKKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODJfY2Fwc3JjX25pZHNbM10gPSB7IDB4MjQsIDB4MjMsIDB4MjIgfTsKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgyX2NhcHNyY19uaWRzX2FsdFsyXSA9IHsgMHgyMywgMHgyMiB9OworI2RlZmluZSBhbGM4ODNfY2Fwc3JjX25pZHMJYWxjODgyX2NhcHNyY19uaWRzX2FsdAorc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODNfY2Fwc3JjX25pZHNfcmV2WzJdID0geyAweDIyLCAweDIzIH07CisjZGVmaW5lIGFsYzg4OV9jYXBzcmNfbmlkcwlhbGM4ODJfY2Fwc3JjX25pZHMKKworLyogaW5wdXQgTVVYICovCisvKiBGSVhNRTogc2hvdWxkIGJlIGEgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgyX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA0LAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkZyb250IE1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJCXsgIkNEIiwgMHg0IH0sCisJfSwKK307CisKKyNkZWZpbmUgYWxjODgzX2NhcHR1cmVfc291cmNlCWFsYzg4Ml9jYXB0dXJlX3NvdXJjZQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODg5X2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSAzLAorCS5pdGVtcyA9IHsKKwkJeyAiRnJvbnQgTWljIiwgMHgwIH0sCisJCXsgIk1pYyIsIDB4MyB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBtYjVfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDMsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDEgfSwKKwkJeyAiTGluZSIsIDB4NyB9LAorCQl7ICJDRCIsIDB4NCB9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggbWFjbWluaTNfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDIsCisJLml0ZW1zID0geworCQl7ICJMaW5lIiwgMHgyIH0sCisJCXsgIkNEIiwgMHg0IH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODNfM3N0YWNrXzZjaF9pbnRlbCA9IHsKKwkubnVtX2l0ZW1zID0gNCwKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MSB9LAorCQl7ICJGcm9udCBNaWMiLCAweDAgfSwKKwkJeyAiTGluZSIsIDB4MiB9LAorCQl7ICJDRCIsIDB4NCB9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgzX2xlbm92b18xMDFlX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSAyLAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgxIH0sCisJCXsgIkxpbmUiLCAweDIgfSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4M19sZW5vdm9fbmIwNzYzX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA0LAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkludGVybmFsIE1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJCXsgIkNEIiwgMHg0IH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODNfZnVqaXRzdV9waTI1MTVfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDIsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDAgfSwKKwkJeyAiSW50ZXJuYWwgTWljIiwgMHgxIH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODNfbGVub3ZvX3NreV9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMywKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MCB9LAorCQl7ICJGcm9udCBNaWMiLCAweDEgfSwKKwkJeyAiTGluZSIsIDB4NCB9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgzX2FzdXNfZWVlMTYwMV9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMiwKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MCB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODlBX21iMzFfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDIsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDAgfSwKKwkJLyogRnJvbnQgTWljICgweDAxKSB1bnVzZWQgKi8KKwkJeyAiTGluZSIsIDB4MiB9LAorCQkvKiBMaW5lIDIgKDB4MDMpIHVudXNlZCAqLworCQkvKiBDRCAoMHgwNCkgdW51c2VkPyAqLworCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODg5QV9pbWFjOTFfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDIsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDAxIH0sCisJCXsgIkxpbmUiLCAweDIgfSwgLyogTm90IHN1cmUhICovCisJfSwKK307CisKKy8qCisgKiAyY2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODgzXzNTVF8yY2hfbW9kZXNbMV0gPSB7CisJeyAyLCBOVUxMIH0KK307CisKKy8qCisgKiAyY2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml8zU1RfY2gyX2luaXRbXSA9IHsKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDRjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgyXzNTVF9jaDRfaW5pdFtdID0geworCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCisJeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDZjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgyXzNTVF9jaDZfaW5pdFtdID0geworCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDIgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4Ml8zU1RfNmNoX21vZGVzWzNdID0geworCXsgMiwgYWxjODgyXzNTVF9jaDJfaW5pdCB9LAorCXsgNCwgYWxjODgyXzNTVF9jaDRfaW5pdCB9LAorCXsgNiwgYWxjODgyXzNTVF9jaDZfaW5pdCB9LAorfTsKKworI2RlZmluZSBhbGM4ODNfM1NUXzZjaF9tb2RlcwlhbGM4ODJfM1NUXzZjaF9tb2RlcworCisvKgorICogMmNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfM1NUX2NoMl9jbGV2b19pbml0W10gPSB7CisJeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUCB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCisJeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKgorICogNGNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfM1NUX2NoNF9jbGV2b19pbml0W10gPSB7CisJeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiA2Y2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4M18zU1RfY2g2X2NsZXZvX2luaXRbXSA9IHsKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDIgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4M18zU1RfNmNoX2NsZXZvX21vZGVzWzNdID0geworCXsgMiwgYWxjODgzXzNTVF9jaDJfY2xldm9faW5pdCB9LAorCXsgNCwgYWxjODgzXzNTVF9jaDRfY2xldm9faW5pdCB9LAorCXsgNiwgYWxjODgzXzNTVF9jaDZfY2xldm9faW5pdCB9LAorfTsKKworCisvKgorICogNmNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODJfc2l4c3RhY2tfY2g2X2luaXRbXSA9IHsKKwl7IDB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAorCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiA4Y2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml9zaXhzdGFja19jaDhfaW5pdFtdID0geworCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4Ml9zaXhzdGFja19tb2Rlc1syXSA9IHsKKwl7IDYsIGFsYzg4Ml9zaXhzdGFja19jaDZfaW5pdCB9LAorCXsgOCwgYWxjODgyX3NpeHN0YWNrX2NoOF9pbml0IH0sCit9OworCisKKy8qIE1hY2Jvb2sgQWlyIDIsMSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODg1X21iYTIxX2NoX21vZGVzWzFdID0geworICAgICAgeyAyLCBOVUxMIH0sCit9OworCisvKgorICogbWFjYm9vayBwcm8gQUxDODg1IGNhbiBzd2l0Y2ggTGluZUluIHRvIExpbmVPdXQgd2l0aG91dCBsb3NpbmcgTWljCisgKi8KKworLyoKKyAqIDJjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg1X21icF9jaDJfaW5pdFtdID0geworCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKKwl7IDB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7IDB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKgorICogNGNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODVfbWJwX2NoNF9pbml0W10gPSB7CisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCisJeyAweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7IDB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4ODVfbWJwXzRjaF9tb2Rlc1syXSA9IHsKKwl7IDIsIGFsYzg4NV9tYnBfY2gyX2luaXQgfSwKKwl7IDQsIGFsYzg4NV9tYnBfY2g0X2luaXQgfSwKK307CisKKy8qCisgKiAyY2gKKyAqIFNwZWFrZXJzL1dvb2Zlci9IUCA9IEZyb250CisgKiBMaW5lSW4gPSBJbnB1dAorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4NV9tYjVfY2gyX2luaXRbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiA2Y2ggbW9kZQorICogU3BlYWtlcnMvSFAgPSBGcm9udAorICogV29vZmVyID0gTEZFCisgKiBMaW5lSW4gPSBTdXJyb3VuZAorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4NV9tYjVfY2g2X2luaXRbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4NV9tYjVfNmNoX21vZGVzWzJdID0geworCXsgMiwgYWxjODg1X21iNV9jaDJfaW5pdCB9LAorCXsgNiwgYWxjODg1X21iNV9jaDZfaW5pdCB9LAorfTsKKworI2RlZmluZSBhbGM4ODVfbWFjbWluaTNfNmNoX21vZGVzCWFsYzg4NV9tYjVfNmNoX21vZGVzCisKKy8qCisgKiAyY2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4M180U1RfY2gyX2luaXRbXSA9IHsKKwl7IDB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDRjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzXzRTVF9jaDRfaW5pdFtdID0geworCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCisJeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDZjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzXzRTVF9jaDZfaW5pdFtdID0geworCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDIgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDhjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzXzRTVF9jaDhfaW5pdFtdID0geworCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsgMHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDMgfSwKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4ODNfNFNUXzhjaF9tb2Rlc1s0XSA9IHsKKwl7IDIsIGFsYzg4M180U1RfY2gyX2luaXQgfSwKKwl7IDQsIGFsYzg4M180U1RfY2g0X2luaXQgfSwKKwl7IDYsIGFsYzg4M180U1RfY2g2X2luaXQgfSwKKwl7IDgsIGFsYzg4M180U1RfY2g4X2luaXQgfSwKK307CisKKworLyoKKyAqIDJjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzXzNTVF9jaDJfaW50ZWxfaW5pdFtdID0geworCXsgMHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCisJeyAweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKgorICogNGNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfM1NUX2NoNF9pbnRlbF9pbml0W10gPSB7CisJeyAweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKKwl7IDB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKgorICogNmNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfM1NUX2NoNl9pbnRlbF9pbml0W10gPSB7CisJeyAweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisJeyAweDE5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMiB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODgzXzNTVF82Y2hfaW50ZWxfbW9kZXNbM10gPSB7CisJeyAyLCBhbGM4ODNfM1NUX2NoMl9pbnRlbF9pbml0IH0sCisJeyA0LCBhbGM4ODNfM1NUX2NoNF9pbnRlbF9pbml0IH0sCisJeyA2LCBhbGM4ODNfM1NUX2NoNl9pbnRlbF9pbml0IH0sCit9OworCisvKgorICogMmNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODlfY2gyX2ludGVsX2luaXRbXSA9IHsKKwl7IDB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCisJeyAweDE5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCXsgMHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKKwl7IDB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDZjaCBtb2RlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg5X2NoNl9pbnRlbF9pbml0W10gPSB7CisJeyAweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCXsgMHgxOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKKwl7IDB4MTYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyIH0sCisJeyAweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMyB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiA4Y2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OV9jaDhfaW50ZWxfaW5pdFtdID0geworCXsgMHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKKwl7IDB4MTksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCisJeyAweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMiB9LAorCXsgMHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDMgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4OV84Y2hfaW50ZWxfbW9kZXNbM10gPSB7CisJeyAyLCBhbGM4ODlfY2gyX2ludGVsX2luaXQgfSwKKwl7IDYsIGFsYzg4OV9jaDZfaW50ZWxfaW5pdCB9LAorCXsgOCwgYWxjODg5X2NoOF9pbnRlbF9pbml0IH0sCit9OworCisvKgorICogNmNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfc2l4c3RhY2tfY2g2X2luaXRbXSA9IHsKKwl7IDB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAorCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiA4Y2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4M19zaXhzdGFja19jaDhfaW5pdFtdID0geworCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4M19zaXhzdGFja19tb2Rlc1syXSA9IHsKKwl7IDYsIGFsYzg4M19zaXhzdGFja19jaDZfaW5pdCB9LAorCXsgOCwgYWxjODgzX3NpeHN0YWNrX2NoOF9pbml0IH0sCit9OworCisKKy8qIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBSZWFyPTB4MTUsIENMRkU9MHgxNiwgU2lkZT0weDE3CisgKiAgICAgICAgICAgICAgICAgTWljPTB4MTgsIEZyb250IE1pYz0weDE5LCBMaW5lLUluPTB4MWEsIEhQPTB4MWIKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4Ml9iYXNlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIE1hY2Jvb2sgQWlyIDIsMSBzYW1lIGNvbnRyb2wgZm9yIEhQIGFuZCBpbnRlcm5hbCBTcGVha2VyICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODVfbWJhMjFfbWl4ZXJbXSA9IHsKKyAgICAgIEhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwMCwgSERBX09VVFBVVCksCisgICAgICBIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MDIsIEhEQV9PVVRQVVQpLAorICAgICB7IH0KK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4NV9tYnAzX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFICAgKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUgICAoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSAgKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUgICgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBCb29zdCBWb2x1bWUiLCAweDFhLCAweDAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAweDAwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODVfbWI1X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSAgICgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFICAgKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFICAgKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSAgICgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA3LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFICAoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSAgKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEJvb3N0IFZvbHVtZSIsIDB4MTUsIDB4MDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDB4MDAsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4NV9tYWNtaW5pM19taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUgICAoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSAgICgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSAgICgiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGYsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUgICAoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSAgKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDcsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBCb29zdCBWb2x1bWUiLCAweDE1LCAweDAwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODVfaW1hYzkxX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MDIsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgyX3cyamNfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODJfdGFyZ2FfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBIUCA9IDB4MTUsIEZyb250ID0gMHgxNiwgPz8/CisgKiAgICAgICAgICAgICAgICAgRnJvbnQgTWljPTB4MTgsIExpbmUgSW4gPSAweDFhLCBMaW5lIEluID0gMHgxYiwgQ0QgPSAweDFjCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODJfYXN1c19hN2pfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTW9iaWxlIEZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNb2JpbGUgTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNb2JpbGUgTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4Ml9hc3VzX2E3bV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODJfY2htb2RlX21peGVyW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODJfYmFzZV9pbml0X3ZlcmJzW10gPSB7CisJLyogRnJvbnQgbWl4ZXI6IHVubXV0ZSBpbnB1dC9vdXRwdXQgYW1wIGxlZnQgYW5kIHJpZ2h0ICh2b2x1bWUgPSAwKSAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwkvKiBSZWFyIG1peGVyICovCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCS8qIENMRkUgbWl4ZXIgKi8KKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJLyogU2lkZSBtaXhlciAqLworCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKworCS8qIEZyb250IFBpbjogb3V0cHV0IDAgKDB4MGMpICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCS8qIFJlYXIgUGluOiBvdXRwdXQgMSAoMHgwZCkgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJLyogQ0xGRSBQaW46IG91dHB1dCAyICgweDBlKSAqLworCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwKKwkvKiBTaWRlIFBpbjogb3V0cHV0IDMgKDB4MGYpICovCisJezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDN9LAorCS8qIE1pYyAocmVhcikgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogTGluZSBJbiBwaW46IGlucHV0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBMaW5lLTIgSW46IEhlYWRwaG9uZSBvdXRwdXQgKG91dHB1dCAwIC0gMHgwYykgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisKKwkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KKwkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDE2LCAxNywgMGIgKi8KKwkvKiBJbnB1dCBtaXhlcjIgKi8KKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJLyogSW5wdXQgbWl4ZXIzICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCS8qIEFEQzI6IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCS8qIEFEQzM6IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml9hZGMxX2luaXRfdmVyYnNbXSA9IHsKKwkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCisJLyogQURDMTogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml9lYXBkX3ZlcmJzW10gPSB7CisJLyogY2hhbmdlIHRvIEVBUEQgbW9kZSAqLworCXsweDIwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDA3fSwKKwl7MHgyMCwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDMwNjB9LAorCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODlfZWFwZF92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjX2hwMTVfdW5zb2xfdmVyYnNbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODVfaW5pdF92ZXJic1tdID0geworCS8qIEZyb250IG1peGVyOiB1bm11dGUgaW5wdXQvb3V0cHV0IGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCS8qIFJlYXIgbWl4ZXIgKi8KKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCS8qIENMRkUgbWl4ZXIgKi8KKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCS8qIFNpZGUgbWl4ZXIgKi8KKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCisJLyogRnJvbnQgSFAgUGluOiBvdXRwdXQgMCAoMHgwYykgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBGcm9udCBQaW46IG91dHB1dCAwICgweDBjKSAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBSZWFyIFBpbjogb3V0cHV0IDEgKDB4MGQpICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCS8qIENMRkUgUGluOiBvdXRwdXQgMiAoMHgwZSkgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisJLyogU2lkZSBQaW46IG91dHB1dCAzICgweDBmKSAqLworCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKKwkvKiBNaWMgKHJlYXIpIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIExpbmUgSW4gcGluOiBpbnB1dCAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisKKwkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgLCAweDFhLCAweDFiICovCisJLyogSW5wdXQgbWl4ZXIxICovCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCS8qIElucHV0IG1peGVyMiAqLworCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwkvKiBJbnB1dCBtaXhlcjMgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJLyogQURDMjogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCS8qIEFEQzM6IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKworCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODVfaW5pdF9pbnB1dF92ZXJic1tdID0geworCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAorCXsgfQorfTsKKworCisvKiBVbm11dGUgU2VsZWN0b3IgMjRoIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gZnJvbnQgbWljICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OV9pbml0X2lucHV0X3ZlcmJzW10gPSB7CisJezB4MjQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsgfQorfTsKKworCisjZGVmaW5lIGFsYzg4M19pbml0X3ZlcmJzCWFsYzg4Ml9iYXNlX2luaXRfdmVyYnMKKworLyogTWFjIFBybyB0ZXN0ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgyX21hY3Byb19taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTgsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJLyogRklYTUU6IHRoaXMgbG9va3Mgc3VzcGljaW91cy4uLgorCUhEQV9DT0RFQ19WT0xVTUUoIkJlZXAgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQmVlcCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCSovCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODJfbWFjcHJvX2luaXRfdmVyYnNbXSA9IHsKKwkvKiBGcm9udCBtaXhlcjogdW5tdXRlIGlucHV0L291dHB1dCBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCS8qIEZyb250IFBpbjogb3V0cHV0IDAgKDB4MGMpICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogU3BlYWtlcjogIG91dHB1dCAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDA0fSwKKwkvKiBIZWFkcGhvbmUgb3V0cHV0IChvdXRwdXQgMCAtIDB4MGMpICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KKwkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDE2LCAxNywgMGIgKi8KKwkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCisJLyogSW5wdXQgbWl4ZXIyICovCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAorCS8qIElucHV0IG1peGVyMyAqLworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKwkvKiBBREMxOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBBREMyOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBBREMzOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCXsgfQorfTsKKworLyogTWFjYm9vayA1LDEgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg1X21iNV9pbml0X3ZlcmJzW10gPSB7CisJLyogREFDcyAqLworCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogRnJvbnQgbWl4ZXIgKi8KKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJLyogU3Vycm91bmQgbWl4ZXIgKi8KKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJLyogTEZFIG1peGVyICovCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCS8qIEhQIG1peGVyICovCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCS8qIEZyb250IFBpbiAoMHgwYykgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIHwgMHgwMX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCS8qIExGRSBQaW4gKDB4MGUpICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB8IDB4MDF9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwKKwkvKiBIUCBQaW4gKDB4MGYpICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDN9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIExpbmUgSW4gcGluICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKworCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDB4MSl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgweDcpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMHg0KX0sCisJeyB9Cit9OworCisvKiBNYWNtaW5pIDMsMSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODVfbWFjbWluaTNfaW5pdF92ZXJic1tdID0geworCS8qIERBQ3MgKi8KKwl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIEZyb250IG1peGVyICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCS8qIFN1cnJvdW5kIG1peGVyICovCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCS8qIExGRSBtaXhlciAqLworCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwkvKiBIUCBtaXhlciAqLworCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwkvKiBGcm9udCBQaW4gKDB4MGMpICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB8IDB4MDF9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBMRkUgUGluICgweDBlKSAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfCAweDAxfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisJLyogSFAgUGluICgweDBmKSAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJLyogTGluZSBJbiBwaW4gKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAorCXsgfQorfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4NV9tYmEyMV9pbml0X3ZlcmJzW10gPSB7CisJLypJbnRlcm5hbCBhbmQgSFAgU3BlYWtlciBNaXhlciovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwkvKkludGVybmFsIFNwZWFrZXIgUGluICgweDBjKSovCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgKFBJTl9PVVQgfCBBQ19QSU5DVExfVlJFRl81MCkgfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogSFAgUGluOiBvdXRwdXQgMCAoMHgwZSkgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGM0fSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgKEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOKX0sCisJLyogTGluZSBpbiAoaXMgaHAgd2hlbiBqYWNrIGNvbm5lY3RlZCkqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIEFDX1BJTkNUTF9WUkVGXzUwfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKworCXsgfQorIH07CisKKworLyogTWFjYm9vayBQcm8gcmV2MyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODVfbWJwM19pbml0X3ZlcmJzW10gPSB7CisJLyogRnJvbnQgbWl4ZXI6IHVubXV0ZSBpbnB1dC9vdXRwdXQgYW1wIGxlZnQgYW5kIHJpZ2h0ICh2b2x1bWUgPSAwKSAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwkvKiBSZWFyIG1peGVyICovCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCS8qIEhQIG1peGVyICovCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCS8qIEZyb250IFBpbjogb3V0cHV0IDAgKDB4MGMpICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCS8qIEhQIFBpbjogb3V0cHV0IDAgKDB4MGUpICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjNH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwkvKiBNaWMgKHJlYXIpIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIExpbmUgSW4gcGluOiB1c2Ugb3V0cHV0IDEgd2hlbiBpbiBMaW5lT3V0IG1vZGUgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisKKwkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KKwkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDE2LCAxNywgMGIgKi8KKwkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCisJLyogSW5wdXQgbWl4ZXIyICovCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAorCS8qIElucHV0IG1peGVyMyAqLworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKwkvKiBBREMxOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBBREMyOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBBREMzOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLworCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCXsgfQorfTsKKworLyogaU1hYyA5LDEgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg1X2ltYWM5MV9pbml0X3ZlcmJzW10gPSB7CisJLyogSW50ZXJuYWwgU3BlYWtlciBQaW4gKDB4MGMpICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgKFBJTl9PVVQgfCBBQ19QSU5DVExfVlJFRl81MCkgfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgKFBJTl9PVVQgfCBBQ19QSU5DVExfVlJFRl81MCkgfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogSFAgUGluOiBSZWFyICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgKEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOKX0sCisJLyogTGluZSBpbiBSZWFyICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgQUNfUElOQ1RMX1ZSRUZfNTB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogUmVhciBtaXhlciAqLworCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwkvKiBMaW5lLU91dCBtaXhlcjogdW5tdXRlIGlucHV0L291dHB1dCBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCS8qIDB4MjQgW0F1ZGlvIE1peGVyXSB3Y2FwcyAweDIwMDEwYjogU3RlcmVvIEFtcC1JbiAqLworCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKwkvKiAweDIzIFtBdWRpbyBNaXhlcl0gd2NhcHMgMHgyMDAxMGI6IFN0ZXJlbyBBbXAtSW4gKi8KKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCisJLyogMHgyMiBbQXVkaW8gTWl4ZXJdIHdjYXBzIDB4MjAwMTBiOiBTdGVyZW8gQW1wLUluICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAorCS8qIDB4MDcgW0F1ZGlvIElucHV0XSB3Y2FwcyAweDEwMDExYjogU3RlcmVvIEFtcC1JbiAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiAweDA4IFtBdWRpbyBJbnB1dF0gd2NhcHMgMHgxMDAxMWI6IFN0ZXJlbyBBbXAtSW4gKi8KKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogMHgwOSBbQXVkaW8gSW5wdXRdIHdjYXBzIDB4MTAwMTFiOiBTdGVyZW8gQW1wLUluICovCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsgfQorfTsKKworLyogaU1hYyAyNCBtaXhlci4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODVfaW1hYzI0X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwMCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCisvKiBpTWFjIDI0IGluaXQgdmVyYnMuICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4NV9pbWFjMjRfaW5pdF92ZXJic1tdID0geworCS8qIEludGVybmFsIHNwZWFrZXJzOiBvdXRwdXQgMCAoMHgwYykgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogSW50ZXJuYWwgc3BlYWtlcnM6IG91dHB1dCAwICgweDBjKSAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBIZWFkcGhvbmU6IG91dHB1dCAwICgweDBjKSAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwkvKiBGcm9udCBNaWM6IGlucHV0IHZyZWYgYXQgODAlICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJeyB9Cit9OworCisvKiBUb2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGM4ODVfaW1hYzI0X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTg7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDFhOworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworI2RlZmluZSBhbGM4ODVfbWI1X3NldHVwCWFsYzg4NV9pbWFjMjRfc2V0dXAKKyNkZWZpbmUgYWxjODg1X21hY21pbmkzX3NldHVwCWFsYzg4NV9pbWFjMjRfc2V0dXAKKworLyogTWFjYm9vayBBaXIgMiwxICovCitzdGF0aWMgdm9pZCBhbGM4ODVfbWJhMjFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisgICAgICAgc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKyAgICAgICBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OworICAgICAgIHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxODsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKKworCitzdGF0aWMgdm9pZCBhbGM4ODVfbWJwM19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIHZvaWQgYWxjODg1X2ltYWM5MV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE4OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxYTsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgyX3RhcmdhX3ZlcmJzW10gPSB7CisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LCAvKiBtaWMvY2xmZSAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sIC8qIGxpbmUvc3Vycm91bmQgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLworCisJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzg4Ml90YXJnYV9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlhbGNfaHBfYXV0b211dGUoY29kZWMpOworCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIDEsIDAsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwKKwkJCQkgIHNwZWMtPmphY2tfcHJlc2VudCA/IDEgOiAzKTsKK30KKworc3RhdGljIHZvaWQgYWxjODgyX3RhcmdhX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MWI7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworfQorCitzdGF0aWMgdm9pZCBhbGM4ODJfdGFyZ2FfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZXMpCit7CisJaWYgKChyZXMgPj4gMjYpID09IEFMQ19IUF9FVkVOVCkKKwkJYWxjODgyX3RhcmdhX2F1dG9tdXRlKGNvZGVjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODJfYXN1c19hN2pfdmVyYnNbXSA9IHsKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKworCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEZyb250ICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogSFAgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBGcm9udCAqLworCisJezB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwgLyogbWljL2NsZmUgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LCAvKiBsaW5lL3N1cnJvdW5kICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogSFAgKi8KKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml9hc3VzX2E3bV92ZXJic1tdID0geworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCisJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogRnJvbnQgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLworCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEZyb250ICovCisKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LCAvKiBtaWMvY2xmZSAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sIC8qIGxpbmUvc3Vycm91bmQgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLworIAl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgdm9pZCBhbGM4ODJfZ3Bpb19tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgcGluLCBpbnQgbXV0ZWQpCit7CisJdW5zaWduZWQgaW50IGdwaW9zdGF0ZSwgZ3Bpb21hc2ssIGdwaW9kaXI7CisKKwlncGlvc3RhdGUgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJCQkJICAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwgMCk7CisKKwlpZiAoIW11dGVkKQorCQlncGlvc3RhdGUgfD0gKDEgPDwgcGluKTsKKwllbHNlCisJCWdwaW9zdGF0ZSAmPSB+KDEgPDwgcGluKTsKKworCWdwaW9tYXNrID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJCSAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fTUFTSywgMCk7CisJZ3Bpb21hc2sgfD0gKDEgPDwgcGluKTsKKworCWdwaW9kaXIgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9HUElPX0RJUkVDVElPTiwgMCk7CisJZ3Bpb2RpciB8PSAoMSA8PCBwaW4pOworCisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgZ3Bpb21hc2spOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIGdwaW9kaXIpOworCisJbXNsZWVwKDEpOworCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIGdwaW9zdGF0ZSk7Cit9CisKKy8qIHNldCB1cCBHUElPIGF0IGluaXRpYWxpemF0aW9uICovCitzdGF0aWMgdm9pZCBhbGM4ODVfbWFjcHJvX2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlhbGM4ODJfZ3Bpb19tdXRlKGNvZGVjLCAwLCAwKTsKKwlhbGM4ODJfZ3Bpb19tdXRlKGNvZGVjLCAxLCAwKTsKK30KKworLyogc2V0IHVwIEdQSU8gYW5kIHVwZGF0ZSBhdXRvLW11dGluZyBhdCBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIHZvaWQgYWxjODg1X2ltYWMyNF9pbml0X2hvb2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYWxjODg1X21hY3Byb19pbml0X2hvb2soY29kZWMpOworCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7Cit9CisKKy8qIDJjaCBtb2RlIChTcGVha2VyOmZyb250LCBTdWJ3b29mZXI6Q0xGRSwgTGluZTppbnB1dCwgSGVhZHBob25lczpmcm9udCkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg5QV9tYjMxX2NoMl9pbml0W10gPSB7CisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgICAgICAgICAgICAgLyogSFAgYXMgZnJvbnQgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LCAvKiBTdWJ3b29mZXIgb24gKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LCAgICAvKiBMaW5lIGFzIGlucHV0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sICAgLyogTGluZSBvZmYgKi8KKwl7IH0gLyogZW5kICovCit9OworCisvKiA0Y2ggbW9kZSAoU3BlYWtlcjpmcm9udCwgU3Vid29vZmVyOkNMRkUsIExpbmU6Q0xGRSwgSGVhZHBob25lczpmcm9udCkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg5QV9tYjMxX2NoNF9pbml0W10gPSB7CisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgICAgICAgICAgICAgLyogSFAgYXMgZnJvbnQgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LCAvKiBTdWJ3b29mZXIgb24gKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwgICAvKiBMaW5lIGFzIG91dHB1dCAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sIC8qIExpbmUgb24gKi8KKwl7IH0gLyogZW5kICovCit9OworCisvKiA1Y2ggbW9kZSAoU3BlYWtlcjpmcm9udCwgU3Vid29vZmVyOkNMRkUsIExpbmU6aW5wdXQsIEhlYWRwaG9uZXM6cmVhcikgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg5QV9tYjMxX2NoNV9pbml0W10gPSB7CisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgICAgICAgICAgICAgLyogSFAgYXMgcmVhciAqLworCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sIC8qIFN1Yndvb2ZlciBvbiAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sICAgIC8qIExpbmUgYXMgaW5wdXQgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwgICAvKiBMaW5lIG9mZiAqLworCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIDZjaCBtb2RlIChTcGVha2VyOmZyb250LCBTdWJ3b29mZXI6b2ZmLCBMaW5lOkNMRkUsIEhlYWRwaG9uZXM6UmVhcikgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg5QV9tYjMxX2NoNl9pbml0W10gPSB7CisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgICAgICAgICAgICAgLyogSFAgYXMgZnJvbnQgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwgICAvKiBTdWJ3b29mZXIgb2ZmICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sICAgLyogTGluZSBhcyBvdXRwdXQgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LCAvKiBMaW5lIG9uICovCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4OUFfbWIzMV82Y2hfbW9kZXNbNF0gPSB7CisJeyAyLCBhbGM4ODlBX21iMzFfY2gyX2luaXQgfSwKKwl7IDQsIGFsYzg4OUFfbWIzMV9jaDRfaW5pdCB9LAorCXsgNSwgYWxjODg5QV9tYjMxX2NoNV9pbml0IH0sCisJeyA2LCBhbGM4ODlBX21iMzFfY2g2X2luaXQgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX21lZGlvbl9lYXBkX3ZlcmJzW10gPSB7CisgICAgICAgIC8qIGVhbmFibGUgRUFQRCBvbiBtZWRpb24gbGFwdG9wICovCisJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDd9LAorCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIDB4MzA3MH0sCisJeyB9Cit9OworCisjZGVmaW5lIGFsYzg4M19iYXNlX21peGVyCWFsYzg4Ml9iYXNlX21peGVyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfbWl0YWNfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfY2xldm9fbTcyMF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfMmNoX2Z1aml0c3VfcGkyNTE1X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M18zU1RfMmNoX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzXzNTVF82Y2hfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfM1NUXzZjaF9pbnRlbF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLAorCQkJICAgICAgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODVfOGNoX2ludGVsX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsCisJCQkgICAgICBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGYsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDFiLCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M19maXZlc3RhY2tfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfdGFyZ2FfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfdGFyZ2FfMmNoX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfdGFyZ2FfOGNoX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiU2lkZSBQbGF5YmFjayBWb2x1bWUiLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlNpZGUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfbGVub3ZvXzEwMWVfMmNoX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M19sZW5vdm9fbmIwNzYzX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M19tZWRpb25fd2ltMjE2MF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfbWVkaW9uX3dpbTIxNjBfdmVyYnNbXSA9IHsKKwkvKiBVbm11dGUgZnJvbnQgbWl4ZXIgKi8KKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCisJLyogU2V0IHNwZWFrZXIgcGluIHRvIGZyb250IG1peGVyICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCS8qIEluaXQgaGVhZHBob25lIHBpbiAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKworCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzg4M19tZWRpb25fd2ltMjE2MF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWE7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M19hY2VyX2FzcGlyZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODg4X2FjZXJfYXNwaXJlXzY1MzBfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODg4X2xlbm92b19za3lfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCQkweDBkLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4OUFfbWIzMV9taXhlcltdID0geworCS8qIE91dHB1dCBtaXhlcnMgKi8KKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwMCwKKwkJSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAweDAyLCBIREFfSU5QVVQpLAorCS8qIE91dHB1dCBzd2l0Y2hlcyAqLworCUhEQV9DT0RFQ19NVVRFKCJFbmFibGUgU3BlYWtlciIsIDB4MTQsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJFbmFibGUgSGVhZHBob25lcyIsIDB4MTUsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkVuYWJsZSBMRkUiLCAweDE2LCAyLCAweDAwLCBIREFfT1VUUFVUKSwKKwkvKiBCb29zdCBtaXhlcnMgKi8KKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMHgwMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDB4MDAsIEhEQV9JTlBVVCksCisJLyogSW5wdXQgbWl4ZXJzICovCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfdmFpb3R0X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM4ODNfYmluZF9jYXBfdm9sID0geworCS5vcHMgPSAmc25kX2hkYV9iaW5kX3ZvbCwKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDgsIDMsIDAsIEhEQV9JTlBVVCksCisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwOSwgMywgMCwgSERBX0lOUFVUKSwKKwkJMAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjODgzX2JpbmRfY2FwX3N3aXRjaCA9IHsKKwkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDgsIDMsIDAsIEhEQV9JTlBVVCksCisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwOSwgMywgMCwgSERBX0lOUFVUKSwKKwkJMAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX2FzdXNfZWVlMTYwMV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX2FzdXNfZWVlMTYwMV9jYXBfbWl4ZXJbXSA9IHsKKwlIREFfQklORF9WT0woIkNhcHR1cmUgVm9sdW1lIiwgJmFsYzg4M19iaW5kX2NhcF92b2wpLAorCUhEQV9CSU5EX1NXKCJDYXB0dXJlIFN3aXRjaCIsICZhbGM4ODNfYmluZF9jYXBfc3dpdGNoKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gYWxjX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGNfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjX211eF9lbnVtX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfY2htb2RlX21peGVyW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLworc3RhdGljIHZvaWQgYWxjODgzX21pdGFjX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE3OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfbWl0YWNfdmVyYnNbXSA9IHsKKwkvKiBIUCAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwkvKiBTdWJ3b29mZXIgKi8KKwl7MHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCisJLyogZW5hYmxlIHVuc29saWNpdGVkIGV2ZW50ICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCS8qIHsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19NSUNfRVZFTlQgfCBBQ19VU1JTUF9FTn0sICovCisKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4M19jbGV2b19tNTQwcl92ZXJic1tdID0geworCS8qIEhQICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCS8qIEludCBzcGVha2VyICovCisJLyp7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LCovCisKKwkvKiBlbmFibGUgdW5zb2xpY2l0ZWQgZXZlbnQgKi8KKwkvKgorCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfTUlDX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCSovCisKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4M19jbGV2b19tNzIwX3ZlcmJzW10gPSB7CisJLyogSFAgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJLyogSW50IHNwZWFrZXIgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCisJLyogZW5hYmxlIHVuc29saWNpdGVkIGV2ZW50ICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19NSUNfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4M18yY2hfZnVqaXRzdV9waTI1MTVfdmVyYnNbXSA9IHsKKwkvKiBIUCAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwkvKiBTdWJ3b29mZXIgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCisJLyogZW5hYmxlIHVuc29saWNpdGVkIGV2ZW50ICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfdGFyZ2FfdmVyYnNbXSA9IHsKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKworLyogQ29ubmVjdCBMaW5lLU91dCBzaWRlIGphY2sgKFNQRElGKSB0byBTaWRlICovCisJezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDN9LAorLyogQ29ubmVjdCBNaWMgamFjayB0byBDTEZFICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAorLyogQ29ubmVjdCBMaW5lLWluIGphY2sgdG8gU3Vycm91bmQgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisvKiBDb25uZWN0IEhQIG91dCBqYWNrIHRvIEZyb250ICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfbGVub3ZvXzEwMWVfdmVyYnNbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19GUk9OVF9FVkVOVHxBQ19VU1JTUF9FTn0sCisgICAgICAgIHsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVHxBQ19VU1JTUF9FTn0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfbGVub3ZvX25iMDc2M192ZXJic1tdID0geworICAgICAgICB7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisgICAgICAgIHsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKyAgICAgICAgezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF9sZW5vdm9fbXM3MTk1X3ZlcmJzW10gPSB7CisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19GUk9OVF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgICAgfCBBQ19VU1JTUF9FTn0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfaGFpZXJfdzY2X3ZlcmJzW10gPSB7CisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4X2xlbm92b19za3lfdmVyYnNbXSA9IHsKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4XzZzdF9kZWxsX3ZlcmJzW10gPSB7CisJezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfdmFpb3R0X3ZlcmJzW10gPSB7CisJLyogSFAgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisKKwkvKiBlbmFibGUgdW5zb2xpY2l0ZWQgZXZlbnQgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgdm9pZCBhbGM4ODhfM3N0X2hwX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxODsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4XzNzdF9ocF92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCS8qIEZyb250OiBvdXRwdXQgMCAoMHgwYykgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBSZWFyIDogb3V0cHV0IDEgKDB4MGQpICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwJLyogQ0xGRSA6IG91dHB1dCAyICgweDBlKSAqLworCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKgorICogMmNoIG1vZGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfM3N0X2hwXzJjaF9pbml0W10gPSB7CisJeyAweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAorCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKKwl7IDB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiA0Y2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF8zc3RfaHBfNGNoX2luaXRbXSA9IHsKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCisJeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisJeyAweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiA2Y2ggbW9kZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF8zc3RfaHBfNmNoX2luaXRbXSA9IHsKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyIH0sCisJeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisJeyAweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4ODhfM3N0X2hwX21vZGVzWzNdID0geworCXsgMiwgYWxjODg4XzNzdF9ocF8yY2hfaW5pdCB9LAorCXsgNCwgYWxjODg4XzNzdF9ocF80Y2hfaW5pdCB9LAorCXsgNiwgYWxjODg4XzNzdF9ocF82Y2hfaW5pdCB9LAorfTsKKworc3RhdGljIHZvaWQgYWxjODg4X2xlbm92b19tczcxOTVfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOworCXNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLworc3RhdGljIHZvaWQgYWxjODgzX2xlbm92b19uYjA3NjNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKKy8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KKyNkZWZpbmUgYWxjODgzX3RhcmdhX2luaXRfaG9vawkJYWxjODgyX3RhcmdhX2luaXRfaG9vaworI2RlZmluZSBhbGM4ODNfdGFyZ2FfdW5zb2xfZXZlbnQJYWxjODgyX3RhcmdhX3Vuc29sX2V2ZW50CisKK3N0YXRpYyB2b2lkIGFsYzg4M19jbGV2b19tNzIwX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b211dGUgPSAxOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworfQorCitzdGF0aWMgdm9pZCBhbGM4ODNfY2xldm9fbTcyMF9pbml0X2hvb2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYWxjX2hwX2F1dG9tdXRlKGNvZGVjKTsKKwlhbGM4OHhfc2ltcGxlX21pY19hdXRvbXV0ZShjb2RlYyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4M19jbGV2b19tNzIwX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCXN3aXRjaCAocmVzID4+IDI2KSB7CisJY2FzZSBBTENfTUlDX0VWRU5UOgorCQlhbGM4OHhfc2ltcGxlX21pY19hdXRvbXV0ZShjb2RlYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFsY19za3VfdW5zb2xfZXZlbnQoY29kZWMsIHJlcyk7CisJCWJyZWFrOworCX0KK30KKworLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLworc3RhdGljIHZvaWQgYWxjODgzXzJjaF9mdWppdHN1X3BpMjUxNV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIHZvaWQgYWxjODgzX2hhaWVyX3c2Nl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIHZvaWQgYWxjODgzX2xlbm92b18xMDFlX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKKwlzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+ZGV0ZWN0X2xpbmUgPSAxOworCXNwZWMtPmF1dG9tdXRlX2xpbmVzID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLworc3RhdGljIHZvaWQgYWxjODgzX2FjZXJfYXNwaXJlX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfYWNlcl9lYXBkX3ZlcmJzW10gPSB7CisJLyogSFAgUGluOiBvdXRwdXQgMCAoMHgwYykgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBGcm9udCBQaW46IG91dHB1dCAwICgweDBjKSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKyAgICAgICAgLyogZWFuYWJsZSBFQVBEIG9uIG1lZGlvbiBsYXB0b3AgKi8KKwl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwN30sCisJezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHgzMDUwfSwKKwkvKiBlbmFibGUgdW5zb2xpY2l0ZWQgZXZlbnQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJeyB9Cit9OworCitzdGF0aWMgdm9pZCBhbGM4ODhfNnN0X2RlbGxfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE2OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzNdID0gMHgxNzsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4OF9sZW5vdm9fc2t5X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE1OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxNjsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1szXSA9IDB4MTc7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbNF0gPSAweDFhOworCXNwZWMtPmF1dG9tdXRlID0gMTsKKwlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKK30KKworc3RhdGljIHZvaWQgYWxjODgzX3ZhaW90dF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNzsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4X2FzdXNfbTkwdl92ZXJic1tdID0geworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJLyogZW5hYmxlIHVuc29saWNpdGVkIGV2ZW50ICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19NSUNfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHZvaWQgYWxjODgzX21vZGUyX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE1OworCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxNjsKKwlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7CisJc3BlYy0+aW50X21pY19waW4gPSAweDE5OworCXNwZWMtPmF1dG9fbWljID0gMTsKKwlzcGVjLT5hdXRvbXV0ZSA9IDE7CisJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4X2FzdXNfZWVlMTYwMV92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwYn0sCisJezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgIDB4MDgzOH0sCisJLyogZW5hYmxlIHVuc29saWNpdGVkIGV2ZW50ICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyB2b2lkIGFsYzg4M19lZWUxNjAxX2luaXRob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKKwlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MWI7CisJYWxjX2hwX2F1dG9tdXRlKGNvZGVjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODlBX21iMzFfdmVyYnNbXSA9IHsKKwkvKiBJbml0IHJlYXIgcGluICh1c2VkIGFzIGhlYWRwaG9uZSBvdXRwdXQpICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjNH0sICAgIC8qIEFwcGxlIEhlYWRwaG9uZXMgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAgICAgICAgICAgLyogQ29ubmVjdCB0byBmcm9udCAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwkvKiBJbml0IGxpbmUgcGluICh1c2VkIGFzIG91dHB1dCBpbiA0Y2ggYW5kIDZjaCBtb2RlKSAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sICAgICAgICAgICAvKiBDb25uZWN0IHRvIENMRkUgKi8KKwkvKiBJbml0IGxpbmUgMiBwaW4gKHVzZWQgYXMgaGVhZHBob25lIG91dCBieSBkZWZhdWx0KSAqLworCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sICAvKiBVc2UgYXMgaW5wdXQgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwgLyogTXV0ZSBvdXRwdXQgKi8KKwl7IH0gLyogZW5kICovCit9OworCisvKiBNdXRlIHNwZWFrZXJzIGFjY29yZGluZyB0byB0aGUgaGVhZHBob25lIGphY2sgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzg4OUFfbWIzMV9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKworCS8qIE11dGUgb25seSBpbiAyY2ggb3IgNGNoIG1vZGUgKi8KKwlpZiAoc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE1LCAwLCBBQ19WRVJCX0dFVF9DT05ORUNUX1NFTCwgMCkKKwkgICAgPT0gMHgwMCkgeworCQlwcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxNSk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxNCwgIEhEQV9PVVRQVVQsIDAsCisJCQlIREFfQU1QX01VVEUsIHByZXNlbnQgPyBIREFfQU1QX01VVEUgOiAwKTsKKwkJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDE2LCBIREFfT1VUUFVULCAwLAorCQkJSERBX0FNUF9NVVRFLCBwcmVzZW50ID8gSERBX0FNUF9NVVRFIDogMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbGM4ODlBX21iMzFfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZXMpCit7CisJaWYgKChyZXMgPj4gMjYpID09IEFMQ19IUF9FVkVOVCkKKwkJYWxjODg5QV9tYjMxX2F1dG9tdXRlKGNvZGVjKTsKK30KKworc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODNfc2xhdmVfZGlnX291dHNbXSA9IHsKKwlBTEMxMjAwX0RJR09VVF9OSUQsIDAsCit9OworCitzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzEyMDBfc2xhdmVfZGlnX291dHNbXSA9IHsKKwlBTEM4ODNfRElHT1VUX05JRCwgMCwKK307CisKKy8qCisgKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGM4ODJfbW9kZWxzW0FMQzg4Ml9NT0RFTF9MQVNUXSA9IHsKKwlbQUxDODgyXzNTVF9ESUddCT0gIjNzdGFjay1kaWciLAorCVtBTEM4ODJfNlNUX0RJR10JPSAiNnN0YWNrLWRpZyIsCisJW0FMQzg4Ml9BUklNQV0JCT0gImFyaW1hIiwKKwlbQUxDODgyX1cySkNdCQk9ICJ3MmpjIiwKKwlbQUxDODgyX1RBUkdBXQkJPSAidGFyZ2EiLAorCVtBTEM4ODJfQVNVU19BN0pdCT0gImFzdXMtYTdqIiwKKwlbQUxDODgyX0FTVVNfQTdNXQk9ICJhc3VzLWE3bSIsCisJW0FMQzg4NV9NQUNQUk9dCQk9ICJtYWNwcm8iLAorCVtBTEM4ODVfTUI1XQkJPSAibWI1IiwKKwlbQUxDODg1X01BQ01JTkkzXQk9ICJtYWNtaW5pMyIsCisJW0FMQzg4NV9NQkEyMV0JCT0gIm1iYTIxIiwKKwlbQUxDODg1X01CUDNdCQk9ICJtYnAzIiwKKwlbQUxDODg1X0lNQUMyNF0JCT0gImltYWMyNCIsCisJW0FMQzg4NV9JTUFDOTFdCQk9ICJpbWFjOTEiLAorCVtBTEM4ODNfM1NUXzJjaF9ESUddCT0gIjNzdGFjay0yY2gtZGlnIiwKKwlbQUxDODgzXzNTVF82Y2hfRElHXQk9ICIzc3RhY2stNmNoLWRpZyIsCisJW0FMQzg4M18zU1RfNmNoXQk9ICIzc3RhY2stNmNoIiwKKwlbQUxDODgzXzZTVF9ESUddCT0gImFsYzg4My02c3RhY2stZGlnIiwKKwlbQUxDODgzX1RBUkdBX0RJR10JPSAidGFyZ2EtZGlnIiwKKwlbQUxDODgzX1RBUkdBXzJjaF9ESUddCT0gInRhcmdhLTJjaC1kaWciLAorCVtBTEM4ODNfVEFSR0FfOGNoX0RJR10JPSAidGFyZ2EtOGNoLWRpZyIsCisJW0FMQzg4M19BQ0VSXQkJPSAiYWNlciIsCisJW0FMQzg4M19BQ0VSX0FTUElSRV0JPSAiYWNlci1hc3BpcmUiLAorCVtBTEM4ODhfQUNFUl9BU1BJUkVfNDkzMEddCT0gImFjZXItYXNwaXJlLTQ5MzBnIiwKKwlbQUxDODg4X0FDRVJfQVNQSVJFXzY1MzBHXQk9ICJhY2VyLWFzcGlyZS02NTMwZyIsCisJW0FMQzg4OF9BQ0VSX0FTUElSRV84OTMwR10JPSAiYWNlci1hc3BpcmUtODkzMGciLAorCVtBTEM4ODhfQUNFUl9BU1BJUkVfNzczMEddCT0gImFjZXItYXNwaXJlLTc3MzBnIiwKKwlbQUxDODgzX01FRElPTl0JCT0gIm1lZGlvbiIsCisJW0FMQzg4M19NRURJT05fV0lNMjE2MF0JPSAibWVkaW9uLXdpbTIxNjAiLAorCVtBTEM4ODNfTEFQVE9QX0VBUERdCT0gImxhcHRvcC1lYXBkIiwKKwlbQUxDODgzX0xFTk9WT18xMDFFXzJjaF0gPSAibGVub3ZvLTEwMWUiLAorCVtBTEM4ODNfTEVOT1ZPX05CMDc2M10JPSAibGVub3ZvLW5iMDc2MyIsCisJW0FMQzg4OF9MRU5PVk9fTVM3MTk1X0RJR10gPSAibGVub3ZvLW1zNzE5NS1kaWciLAorCVtBTEM4ODhfTEVOT1ZPX1NLWV0gPSAibGVub3ZvLXNreSIsCisJW0FMQzg4M19IQUlFUl9XNjZdIAk9ICJoYWllci13NjYiLAorCVtBTEM4ODhfM1NUX0hQXQkJPSAiM3N0YWNrLWhwIiwKKwlbQUxDODg4XzZTVF9ERUxMXQk9ICI2c3RhY2stZGVsbCIsCisJW0FMQzg4M19NSVRBQ10JCT0gIm1pdGFjIiwKKwlbQUxDODgzX0NMRVZPX001NDBSXQk9ICJjbGV2by1tNTQwciIsCisJW0FMQzg4M19DTEVWT19NNzIwXQk9ICJjbGV2by1tNzIwIiwKKwlbQUxDODgzX0ZVSklUU1VfUEkyNTE1XSA9ICJmdWppdHN1LXBpMjUxNSIsCisJW0FMQzg4OF9GVUpJVFNVX1hBMzUzMF0gPSAiZnVqaXRzdS14YTM1MzAiLAorCVtBTEM4ODNfM1NUXzZjaF9JTlRFTF0JPSAiM3N0YWNrLTZjaC1pbnRlbCIsCisJW0FMQzg4OUFfSU5URUxdCQk9ICJpbnRlbC1hbGM4ODlhIiwKKwlbQUxDODg5X0lOVEVMXQkJPSAiaW50ZWwteDU4IiwKKwlbQUxDMTIwMF9BU1VTX1A1UV0JPSAiYXN1cy1wNXEiLAorCVtBTEM4ODlBX01CMzFdCQk9ICJtYjMxIiwKKwlbQUxDODgzX1NPTllfVkFJT19UVF0JPSAic29ueS12YWlvLXR0IiwKKwlbQUxDODgyX0FVVE9dCQk9ICJhdXRvIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4ODJfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweDY2NjgsICJFQ1MiLCBBTEM4ODJfNlNUX0RJRyksCisKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMDZjLCAiQWNlciBBc3BpcmUgOTgxMCIsIEFMQzg4M19BQ0VSX0FTUElSRSksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA5MCwgIkFjZXIgQXNwaXJlIiwgQUxDODgzX0FDRVJfQVNQSVJFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTBhLCAiQWNlciBGZXJyYXJpIDUwMDAiLCBBTEM4ODNfQUNFUl9BU1BJUkUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMTAsICJBY2VyIEFzcGlyZSIsIEFMQzg4M19BQ0VSX0FTUElSRSksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDExMiwgIkFjZXIgQXNwaXJlIDkzMDMiLCBBTEM4ODNfQUNFUl9BU1BJUkUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMjEsICJBY2VyIEFzcGlyZSA1OTIwRyIsIEFMQzg4M19BQ0VSX0FTUElSRSksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEzZSwgIkFjZXIgQXNwaXJlIDQ5MzBHIiwKKwkJQUxDODg4X0FDRVJfQVNQSVJFXzQ5MzBHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTNmLCAiQWNlciBBc3BpcmUgNTkzMEciLAorCQlBTEM4ODhfQUNFUl9BU1BJUkVfNDkzMEcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxNDUsICJBY2VyIEFzcGlyZSA4OTMwRyIsCisJCUFMQzg4OF9BQ0VSX0FTUElSRV84OTMwRyksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDE0NiwgIkFjZXIgQXNwaXJlIDY5MzVHIiwKKwkJQUxDODg4X0FDRVJfQVNQSVJFXzg5MzBHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTU3LCAiQWNlciBYMzIwMCIsIEFMQzg4Ml9BVVRPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTU4LCAiQWNlciBBWDE3MDAtVTM3MDBBIiwgQUxDODgyX0FVVE8pLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxNWUsICJBY2VyIEFzcGlyZSA2OTMwRyIsCisJCUFMQzg4OF9BQ0VSX0FTUElSRV82NTMwRyksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDE2NiwgIkFjZXIgQXNwaXJlIDY1MzBHIiwKKwkJQUxDODg4X0FDRVJfQVNQSVJFXzY1MzBHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTQyLCAiQWNlciBBc3BpcmUgNzczMEciLAorCQlBTEM4ODhfQUNFUl9BU1BJUkVfNzczMEcpLAorCS8qIGRlZmF1bHQgQWNlciAtLSBkaXNhYmxlZCBhcyBpdCBjYXVzZXMgbW9yZSBwcm9ibGVtcy4KKwkgKiAgICBtb2RlbD1hdXRvIHNob3VsZCB3b3JrIGZpbmUgbm93CisJICovCisJLyogU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxMDI1LCAiQWNlciBsYXB0b3AiLCBBTEM4ODNfQUNFUiksICovCisKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMjBkLCAiRGVsbCBJbnNwaXJvbiA1MzAiLCBBTEM4ODhfNlNUX0RFTEwpLAorCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmEzZCwgIkhQIFBhdmlsaW9uIiwgQUxDODgzXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDJhNGYsICJIUCBTYW1iYSIsIEFMQzg4OF8zU1RfSFApLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDJhNjAsICJIUCBMdWNrbm93IiwgQUxDODg4XzNTVF9IUCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmE2MSwgIkhQIE5ldHRsZSIsIEFMQzg4M182U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyYTY2LCAiSFAgQWNhY2lhIiwgQUxDODg4XzNTVF9IUCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmE3MiwgIkhQIEVkdWMuYXIiLCBBTEM4ODhfM1NUX0hQKSwKKworCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDA2MGQsICJBc3VzIEE3SiIsIEFMQzg4Ml9BU1VTX0E3SiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTI0MywgIkFzdXMgQTdKIiwgQUxDODgyX0FTVVNfQTdKKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2MyLCAiQXN1cyBBN00iLCBBTEM4ODJfQVNVU19BN00pLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NzMsICJBc3VzIE05MFYiLCBBTEM4ODhfQVNVU19NOTBWKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTcxLCAiQXN1cyBXMkpDIiwgQUxDODgyX1cySkMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxN2YsICJBc3VzIFA1TEQyIiwgQUxDODgyXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxZDgsICJBc3VzIFA1V0QiLCBBTEM4ODJfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODI0OSwgIkFzdXMgTTJBLVZNIEhETUkiLCBBTEM4ODNfM1NUXzZjaF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgyODQsICJBc3VzIFozN0UiLCBBTEM4ODNfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODJmZSwgIkFzdXMgUDVRLUVNIEhETUkiLCBBTEMxMjAwX0FTVVNfUDVRKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MzVmLCAiQXN1cyBFZWUgMTYwMSIsIEFMQzg4OF9BU1VTX0VFRTE2MDEpLAorCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTA0NywgIlNvbnkgVmFpbyBUVCIsIEFMQzg4M19TT05ZX1ZBSU9fVFQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDViLCAweDBjZTgsICJGb3hjb25uIFAzNUFYLVMiLCBBTEM4ODNfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNWIsIDB4NjY2OCwgIkZveGNvbm4iLCBBTEM4ODJfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNzEsIDB4ODIyNywgIk1pdGFjIDgyODAxSCIsIEFMQzg4M19NSVRBQyksCisJU05EX1BDSV9RVUlSSygweDEwNzEsIDB4ODI1MywgIk1pdGFjIDgyNTJkIiwgQUxDODgzX01JVEFDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3MSwgMHg4MjU4LCAiRXZlc2hhbSBWb3lhZWdlciIsIEFMQzg4M19MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDEwZjEsIDB4MjM1MCwgIlRZQU4tUzIzNTAiLCBBTEM4ODhfNlNUX0RFTEwpLAorCVNORF9QQ0lfUVVJUksoMHgxMDhlLCAweDUzNGQsIE5VTEwsIEFMQzg4M18zU1RfNmNoKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ1OCwgMHhhMDAyLCAiR2lnYWJ5dGUgUDM1IERTM1IiLCBBTEM4ODJfNlNUX0RJRyksCisKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgwMzQ5LCAiTVNJIiwgQUxDODgzX1RBUkdBXzJjaF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDA0MGQsICJNU0kiLCBBTEM4ODNfVEFSR0FfMmNoX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4MDU3OSwgIk1TSSIsIEFMQzg4M19UQVJHQV8yY2hfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgyOGZiLCAiVGFyZ2EgVDgiLCBBTEM4ODJfVEFSR0EpLCAvKiBNU0ktMTA0OSBUOCAgKi8KKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgyZmIzLCAiTVNJIiwgQUxDODgyX0FVVE8pLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDY2NjgsICJNU0kiLCBBTEM4ODJfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4MzcyOSwgIk1TSSBTNDIwIiwgQUxDODgzX1RBUkdBX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4Mzc4MywgIk5FQyBTOTcwIiwgQUxDODgzX1RBUkdBX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4M2I3ZiwgIk1TSSIsIEFMQzg4M19UQVJHQV8yY2hfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgzZWY5LCAiTVNJIiwgQUxDODgzX1RBUkdBX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4M2ZjMSwgIk1TSSIsIEFMQzg4M19UQVJHQV9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDNmYzMsICJNU0kiLCBBTEM4ODNfVEFSR0FfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgzZmNjLCAiTVNJIiwgQUxDODgzX1RBUkdBX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4M2ZkZiwgIk1TSSIsIEFMQzg4M19UQVJHQV9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDQyY2QsICJNU0kiLCBBTEM4ODNfVEFSR0FfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg0MzE0LCAiTVNJIiwgQUxDODgzX1RBUkdBX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NDMxOSwgIk1TSSIsIEFMQzg4M19UQVJHQV9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDQzMjQsICJNU0kiLCBBTEM4ODNfVEFSR0FfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg0NTcwLCAiTVNJIFdpbmQgVG9wIEFFMjIyMCIsIEFMQzg4M19UQVJHQV9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDY1MTAsICJNU0kgR1g2MjAiLCBBTEM4ODNfVEFSR0FfOGNoX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NjY2OCwgIk1TSSIsIEFMQzg4M182U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3MTg3LCAiTVNJIiwgQUxDODgzXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDcyNTAsICJNU0kiLCBBTEM4ODNfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzI2MCwgIk1TSSA3MjYwIiwgQUxDODgzX1RBUkdBX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzI2NywgIk1TSSIsIEFMQzg4M18zU1RfNmNoX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzI4MCwgIk1TSSIsIEFMQzg4M182U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3MzI3LCAiTVNJIiwgQUxDODgzXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDczNTAsICJNU0kiLCBBTEM4ODNfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzQzNywgIk1TSSBOZXRPbiBBUDE5MDAiLCBBTEM4ODNfVEFSR0FfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHhhNDIyLCAiTVNJIiwgQUxDODgzX1RBUkdBXzJjaF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweGFhMDgsICJNU0kiLCBBTEM4ODNfVEFSR0FfMmNoX0RJRyksCisKKwlTTkRfUENJX1FVSVJLKDB4MTQ3YiwgMHgxMDgzLCAiQWJpdCBJUDM1LVBSTyIsIEFMQzg4M182U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU1OCwgMHgwNTcxLCAiQ2xldm8gbGFwdG9wIE01NzBVIiwgQUxDODgzXzNTVF82Y2hfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU1OCwgMHgwNzIxLCAiQ2xldm8gbGFwdG9wIE03MjBSIiwgQUxDODgzX0NMRVZPX003MjApLAorCVNORF9QQ0lfUVVJUksoMHgxNTU4LCAweDA3MjIsICJDbGV2byBsYXB0b3AgTTcyMFNSIiwgQUxDODgzX0NMRVZPX003MjApLAorCVNORF9QQ0lfUVVJUksoMHgxNTU4LCAweDU0MDksICJDbGV2byBsYXB0b3AgTTU0MFIiLCBBTEM4ODNfQ0xFVk9fTTU0MFIpLAorCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTU1OCwgIkNsZXZvIGxhcHRvcCIsIEFMQzg4M19MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDE1ZDksIDB4ODc4MCwgIlN1cGVybWljcm8gUERTQkEiLCBBTEM4ODNfM1NUXzZjaCksCisJLyogU05EX1BDSV9RVUlSSygweDE2MWYsIDB4MjA1NCwgIkFyaW1hIFc4MjAiLCBBTEM4ODJfQVJJTUEpLCAqLworCVNORF9QQ0lfUVVJUksoMHgxNjFmLCAweDIwNTQsICJNZWRpb24gbGFwdG9wIiwgQUxDODgzX01FRElPTiksCisJU05EX1BDSV9RVUlSS19NQVNLKDB4MTczNCwgMHhmZmYwLCAweDExMDAsICJGU0MgQU1JTE8gWGkvUGkyNXh4IiwKKwkJICAgICAgQUxDODgzX0ZVSklUU1VfUEkyNTE1KSwKKwlTTkRfUENJX1FVSVJLX01BU0soMHgxNzM0LCAweGZmZjAsIDB4MTEzMCwgIkZ1aml0c3UgQU1JTE8gWGEzNXh4IiwKKwkJQUxDODg4X0ZVSklUU1VfWEEzNTMwKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgxMDFlLCAiTGVub3ZvIDEwMWUiLCBBTEM4ODNfTEVOT1ZPXzEwMUVfMmNoKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMDg1LCAiTGVub3ZvIE5CMDc2MyIsIEFMQzg4M19MRU5PVk9fTkIwNzYzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYmZjLCAiTGVub3ZvIE5CMDc2MyIsIEFMQzg4M19MRU5PVk9fTkIwNzYzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYmZkLCAiTGVub3ZvIE5CMDc2MyIsIEFMQzg4M19MRU5PVk9fTkIwNzYzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgxMDFkLCAiTGVub3ZvIFNreSIsIEFMQzg4OF9MRU5PVk9fU0tZKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdjMCwgMHg0MDg1LCAiTUVESU9OIE1EOTY2MzAiLCBBTEM4ODhfTEVOT1ZPX01TNzE5NV9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxN2YyLCAweDUwMDAsICJBbGJhdHJvbiBLSTY5MC1BTTIiLCBBTEM4ODNfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE5OTEsIDB4NTYyNSwgIkhhaWVyIFc2NiIsIEFMQzg4M19IQUlFUl9XNjYpLAorCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4MDAwMSwgIkRHMzNCVUMiLCBBTEM4ODNfM1NUXzZjaF9JTlRFTCksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4MDAwMiwgIkRHMzNGQkMiLCBBTEM4ODNfM1NUXzZjaF9JTlRFTCksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4MjUwMywgIjgyODAxSCIsIEFMQzg4M19NSVRBQyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4MDAyMiwgIkRYNThTTyIsIEFMQzg4OV9JTlRFTCksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4MDAyMSwgIkludGVsIEliZXhQZWFrIiwgQUxDODg5QV9JTlRFTCksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4M2I1NiwgIkludGVsIEliZXhQZWFrIiwgQUxDODg5QV9JTlRFTCksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDYwMSwgIkQxMDJHR0MiLCBBTEM4ODJfNlNUX0RJRyksCisKKwl7fQorfTsKKworLyogY29kZWMgU1NJRCB0YWJsZSBmb3IgSW50ZWwgTWFjICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODgyX3NzaWRfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDAwYTAsICJNYWNCb29rUHJvIDMsMSIsIEFMQzg4NV9NQlAzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgwMGExLCAiTWFjYm9vayIsIEFMQzg4NV9NQlAzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgwMGE0LCAiTWFjYm9va1BybyA0LDEiLCBBTEM4ODVfTUJQMyksCisJU05EX1BDSV9RVUlSSygweDEwNmIsIDB4MGMwMCwgIk1hYyBQcm8iLCBBTEM4ODVfTUFDUFJPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgxMDAwLCAiaU1hYyAyNCIsIEFMQzg4NV9JTUFDMjQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDI4MDAsICJBcHBsZVRWIiwgQUxDODg1X0lNQUMyNCksCisJU05EX1BDSV9RVUlSSygweDEwNmIsIDB4MmMwMCwgIk1hY2Jvb2tQcm8gcmV2MyIsIEFMQzg4NV9NQlAzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzMDAwLCAiaU1hYyIsIEFMQzg4OUFfTUIzMSksCisJU05EX1BDSV9RVUlSSygweDEwNmIsIDB4MzIwMCwgImlNYWMgNywxIEFsdW1pbnVtIiwgQUxDODgyX0FTVVNfQTdNKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzNDAwLCAiTWFjQm9va0FpciAxLDEiLCBBTEM4ODVfTUJQMyksCisJU05EX1BDSV9RVUlSSygweDEwNmIsIDB4MzUwMCwgIk1hY0Jvb2tBaXIgMiwxIiwgQUxDODg1X01CQTIxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzNjAwLCAiTWFjYm9vayAzLDEiLCBBTEM4ODlBX01CMzEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDM4MDAsICJNYWNib29rUHJvIDQsMSIsIEFMQzg4NV9NQlAzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzZTAwLCAiaU1hYyAyNCBBbHVtaW51bSIsIEFMQzg4NV9JTUFDMjQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDQ5MDAsICJpTWFjIDksMSBBbHVtaW51bSIsIEFMQzg4NV9JTUFDOTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDNmMDAsICJNYWNib29rIDUsMSIsIEFMQzg4NV9NQjUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDRhMDAsICJNYWNib29rIDUsMiIsIEFMQzg4NV9NQjUpLAorCS8qIEZJWE1FOiBIUCBqYWNrIHNlbnNlIHNlZW1zIG5vdCB3b3JraW5nIGZvciBNQlAgNSwxIG9yIDUsMiwKKwkgKiBzbyBhcHBhcmVudGx5IG5vIHBlcmZlY3Qgc29sdXRpb24geWV0CisJICovCisJU05EX1BDSV9RVUlSSygweDEwNmIsIDB4NDAwMCwgIk1hY2Jvb2tQcm8gNSwxIiwgQUxDODg1X01CNSksCisJU05EX1BDSV9RVUlSSygweDEwNmIsIDB4NDYwMCwgIk1hY2Jvb2tQcm8gNSwyIiwgQUxDODg1X01CNSksCisJU05EX1BDSV9RVUlSSygweDEwNmIsIDB4NDEwMCwgIk1hY21pbmkgMywxIiwgQUxDODg1X01BQ01JTkkzKSwKKwl7fSAvKiB0ZXJtaW5hdG9yICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzg4Ml9wcmVzZXRzW10gPSB7CisJW0FMQzg4Ml8zU1RfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgyX2Jhc2VfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4Ml9iYXNlX2luaXRfdmVyYnMsCisJCQkJYWxjODgyX2FkYzFfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgyX0RJR09VVF9OSUQsCisJCS5kaWdfaW5fbmlkID0gQUxDODgyX0RJR0lOX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4Ml9jaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODJfY2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4ODJfNlNUX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4Ml9iYXNlX21peGVyLCBhbGM4ODJfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODJfYmFzZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4Ml9hZGMxX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODJfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4Ml9ESUdPVVRfTklELAorCQkuZGlnX2luX25pZCA9IEFMQzg4Ml9ESUdJTl9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODJfc2l4c3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgyX3NpeHN0YWNrX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4ODJfQVJJTUFdID0geworCQkubWl4ZXJzID0geyBhbGM4ODJfYmFzZV9taXhlciwgYWxjODgyX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgyX2Jhc2VfaW5pdF92ZXJicywgYWxjODgyX2FkYzFfaW5pdF92ZXJicywKKwkJCQlhbGM4ODJfZWFwZF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4Ml9zaXhzdGFja19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODJfc2l4c3RhY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgyX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4Ml9XMkpDXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgyX3cyamNfbWl4ZXIsIGFsYzg4Ml9jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4Ml9iYXNlX2luaXRfdmVyYnMsIGFsYzg4Ml9hZGMxX2luaXRfdmVyYnMsCisJCQkJYWxjODgyX2VhcGRfdmVyYnMsIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgyX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3RocmVlc3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3RocmVlc3RhY2tfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgyX0RJR09VVF9OSUQsCisJfSwKKwkgICBbQUxDODg1X01CQTIxXSA9IHsKKwkJCS5taXhlcnMgPSB7IGFsYzg4NV9tYmEyMV9taXhlciB9LAorCQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4NV9tYmEyMV9pbml0X3ZlcmJzLCBhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicyB9LAorCQkJLm51bV9kYWNzID0gMiwKKwkJCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKKwkJCS5jaGFubmVsX21vZGUgPSBhbGM4ODVfbWJhMjFfY2hfbW9kZXMsCisJCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODg1X21iYTIxX2NoX21vZGVzKSwKKwkJCS5pbnB1dF9tdXggPSAmYWxjODgyX2NhcHR1cmVfc291cmNlLAorCQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJCS5zZXR1cCA9IGFsYzg4NV9tYmEyMV9zZXR1cCwKKwkJCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCisgICAgICAgfSwKKwlbQUxDODg1X01CUDNdID0geworCQkubWl4ZXJzID0geyBhbGM4ODVfbWJwM19taXhlciwgYWxjODgyX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODg1X21icDNfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSAyLAorCQkuZGFjX25pZHMgPSBhbGM4ODJfZGFjX25pZHMsCisJCS5ocF9uaWQgPSAweDA0LAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODg1X21icF80Y2hfbW9kZXMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODVfbWJwXzRjaF9tb2RlcyksCisJCS5pbnB1dF9tdXggPSAmYWxjODgyX2NhcHR1cmVfc291cmNlLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODJfRElHT1VUX05JRCwKKwkJLmRpZ19pbl9uaWQgPSBBTEM4ODJfRElHSU5fTklELAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM4ODVfbWJwM19zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODVfTUI1XSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODg1X21iNV9taXhlciwgYWxjODgyX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODg1X21iNV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgyX2RhY19uaWRzLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODg1X21iNV82Y2hfbW9kZXMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODVfbWI1XzZjaF9tb2RlcyksCisJCS5pbnB1dF9tdXggPSAmbWI1X2NhcHR1cmVfc291cmNlLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODJfRElHT1VUX05JRCwKKwkJLmRpZ19pbl9uaWQgPSBBTEM4ODJfRElHSU5fTklELAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM4ODVfbWI1X3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAorCX0sCisJW0FMQzg4NV9NQUNNSU5JM10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4NV9tYWNtaW5pM19taXhlciwgYWxjODgyX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODg1X21hY21pbmkzX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX2dwaW8xX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODJfZGFjX25pZHMsCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODVfbWFjbWluaTNfNmNoX21vZGVzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODg1X21hY21pbmkzXzZjaF9tb2RlcyksCisJCS5pbnB1dF9tdXggPSAmbWFjbWluaTNfY2FwdHVyZV9zb3VyY2UsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4Ml9ESUdPVVRfTklELAorCQkuZGlnX2luX25pZCA9IEFMQzg4Ml9ESUdJTl9OSUQsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg4NV9tYWNtaW5pM19zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODVfTUFDUFJPXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgyX21hY3Byb19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgyX21hY3Byb19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODJfRElHT1VUX05JRCwKKwkJLmRpZ19pbl9uaWQgPSBBTEM4ODJfRElHSU5fTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgyX2NoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4Ml9jaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODJfY2FwdHVyZV9zb3VyY2UsCisJCS5pbml0X2hvb2sgPSBhbGM4ODVfbWFjcHJvX2luaXRfaG9vaywKKwl9LAorCVtBTEM4ODVfSU1BQzI0XSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODg1X2ltYWMyNF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODg1X2ltYWMyNF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODJfRElHT1VUX05JRCwKKwkJLmRpZ19pbl9uaWQgPSBBTEM4ODJfRElHSU5fTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgyX2NoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4Ml9jaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODJfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg4NV9pbWFjMjRfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGM4ODVfaW1hYzI0X2luaXRfaG9vaywKKwl9LAorCVtBTEM4ODVfSU1BQzkxXSA9IHsKKwkJLm1peGVycyA9IHthbGM4ODVfaW1hYzkxX21peGVyfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4NV9pbWFjOTFfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4NV9tYmEyMV9jaF9tb2RlcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4NV9tYmEyMV9jaF9tb2RlcyksCisJCS5pbnB1dF9tdXggPSAmYWxjODg5QV9pbWFjOTFfY2FwdHVyZV9zb3VyY2UsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4Ml9ESUdPVVRfTklELAorCQkuZGlnX2luX25pZCA9IEFMQzg4Ml9ESUdJTl9OSUQsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg4NV9pbWFjOTFfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCisJfSwKKwlbQUxDODgyX1RBUkdBXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgyX3RhcmdhX21peGVyLCBhbGM4ODJfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODJfYmFzZV9pbml0X3ZlcmJzLCBhbGM4ODJfYWRjMV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9ncGlvM19pbml0X3ZlcmJzLCBhbGM4ODJfdGFyZ2FfdmVyYnN9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgyX0RJR09VVF9OSUQsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4Ml9hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg4Ml9hZGNfbmlkcywKKwkJLmNhcHNyY19uaWRzID0gYWxjODgyX2NhcHNyY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgyXzNTVF82Y2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgyXzNTVF82Y2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODgyX3RhcmdhX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjODgyX3RhcmdhX2F1dG9tdXRlLAorCX0sCisJW0FMQzg4Ml9BU1VTX0E3Sl0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4Ml9hc3VzX2E3al9taXhlciwgYWxjODgyX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgyX2Jhc2VfaW5pdF92ZXJicywgYWxjODgyX2FkYzFfaW5pdF92ZXJicywKKwkJCQlhbGM4ODJfYXN1c19hN2pfdmVyYnN9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgyX0RJR09VVF9OSUQsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4Ml9hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg4Ml9hZGNfbmlkcywKKwkJLmNhcHNyY19uaWRzID0gYWxjODgyX2NhcHNyY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgyXzNTVF82Y2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgyXzNTVF82Y2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4ODJfQVNVU19BN01dID0geworCQkubWl4ZXJzID0geyBhbGM4ODJfYXN1c19hN21fbWl4ZXIsIGFsYzg4Ml9jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4Ml9iYXNlX2luaXRfdmVyYnMsIGFsYzg4Ml9hZGMxX2luaXRfdmVyYnMsCisJCQkJYWxjODgyX2VhcGRfdmVyYnMsIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4Ml9hc3VzX2E3bV92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgyX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfdGhyZWVzdGFja19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfdGhyZWVzdGFja19tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5pbnB1dF9tdXggPSAmYWxjODgyX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4M18zU1RfMmNoX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M18zU1RfMmNoX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4ODNfM1NUXzZjaF9ESUddID0geworCQkubWl4ZXJzID0geyBhbGM4ODNfM1NUXzZjaF9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAorCQkuZGlnX2luX25pZCA9IEFMQzg4M19ESUdJTl9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzZjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzZjaF9tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4M18zU1RfNmNoXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzXzNTVF82Y2hfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF82Y2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF82Y2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4ODNfM1NUXzZjaF9JTlRFTF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M18zU1RfNmNoX2ludGVsX21peGVyLCBhbGM4ODNfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKKwkJLnNsYXZlX2RpZ19vdXRzID0gYWxjODgzX3NsYXZlX2RpZ19vdXRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF82Y2hfaW50ZWxfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF82Y2hfaW50ZWxfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M18zc3RhY2tfNmNoX2ludGVsLAorCX0sCisJW0FMQzg4OUFfSU5URUxdID0geworCQkubWl4ZXJzID0geyBhbGM4ODVfOGNoX2ludGVsX21peGVyLCBhbGM4ODNfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODVfaW5pdF92ZXJicywgYWxjODg1X2luaXRfaW5wdXRfdmVyYnMsCisJCQkJYWxjX2hwMTVfdW5zb2xfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4OV9hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg4OV9hZGNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKKwkJLnNsYXZlX2RpZ19vdXRzID0gYWxjODgzX3NsYXZlX2RpZ19vdXRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODg5XzhjaF9pbnRlbF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODlfOGNoX2ludGVsX21vZGVzLAorCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODlfY2Fwc3JjX25pZHMsCisJCS5pbnB1dF9tdXggPSAmYWxjODg5X2NhcHR1cmVfc291cmNlLAorCQkuc2V0dXAgPSBhbGM4ODlfYXV0b211dGVfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5uZWVkX2RhY19maXggPSAxLAorCX0sCisJW0FMQzg4OV9JTlRFTF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4NV84Y2hfaW50ZWxfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4NV9pbml0X3ZlcmJzLCBhbGM4ODlfaW5pdF9pbnB1dF92ZXJicywKKwkJCQlhbGM4ODlfZWFwZF92ZXJicywgYWxjX2hwMTVfdW5zb2xfdmVyYnN9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODg5X2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjODg5X2FkY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLmRpZ19pbl9uaWQgPSBBTEM4ODNfRElHSU5fTklELAorCQkuc2xhdmVfZGlnX291dHMgPSBhbGM4ODNfc2xhdmVfZGlnX291dHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODlfOGNoX2ludGVsX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4OV84Y2hfaW50ZWxfbW9kZXMsCisJCS5jYXBzcmNfbmlkcyA9IGFsYzg4OV9jYXBzcmNfbmlkcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODlfY2FwdHVyZV9zb3VyY2UsCisJCS5zZXR1cCA9IGFsYzg4OV9hdXRvbXV0ZV9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsYzg4OV9pbnRlbF9pbml0X2hvb2ssCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5uZWVkX2RhY19maXggPSAxLAorCX0sCisJW0FMQzg4M182U1RfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX2Jhc2VfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLmRpZ19pbl9uaWQgPSBBTEM4ODNfRElHSU5fTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzX3NpeHN0YWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M19zaXhzdGFja19tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODgzX1RBUkdBX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M190YXJnYV9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4MF9ncGlvM19pbml0X3ZlcmJzLAorCQkJCWFsYzg4M190YXJnYV92ZXJic30sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfNmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfNmNoX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg4M190YXJnYV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODgyX3RhcmdhX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjODgyX3RhcmdhX2F1dG9tdXRlLAorCX0sCisJW0FMQzg4M19UQVJHQV8yY2hfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX3RhcmdhXzJjaF9taXhlcn0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgwX2dwaW8zX2luaXRfdmVyYnMsCisJCQkJYWxjODgzX3RhcmdhX3ZlcmJzfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5hZGNfbmlkcyA9IGFsYzg4M19hZGNfbmlkc19hbHQsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkc19hbHQpLAorCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGM4ODNfdGFyZ2FfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg4Ml90YXJnYV9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsYzg4Ml90YXJnYV9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODNfVEFSR0FfOGNoX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M190YXJnYV9taXhlciwgYWxjODgzX3RhcmdhXzhjaF9taXhlciwKKwkJCSAgICBhbGM4ODNfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgwX2dwaW8zX2luaXRfdmVyYnMsCisJCQkJYWxjODgzX3RhcmdhX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODNfYWRjX25pZHNfcmV2KSwKKwkJLmFkY19uaWRzID0gYWxjODgzX2FkY19uaWRzX3JldiwKKwkJLmNhcHNyY19uaWRzID0gYWxjODgzX2NhcHNyY19uaWRzX3JldiwKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M180U1RfOGNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M180U1RfOGNoX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg4M190YXJnYV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODgyX3RhcmdhX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjODgyX3RhcmdhX2F1dG9tdXRlLAorCX0sCisJW0FMQzg4M19BQ0VSXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX2Jhc2VfbWl4ZXIgfSwKKwkJLyogT24gVHJhdmVsTWF0ZSBsYXB0b3BzLCBHUElPIDAgZW5hYmxlcyB0aGUgaW50ZXJuYWwgc3BlYWtlcgorCQkgKiBhbmQgdGhlIGhlYWRwaG9uZSBqYWNrLiAgVHVybiB0aGlzIG9uIGFuZCByZWx5IG9uIHRoZQorCQkgKiBzdGFuZGFyZCBtdXRlIG1ldGhvZHMgd2hlbmV2ZXIgdGhlIHVzZXIgd2FudHMgdG8gdHVybgorCQkgKiB0aGVzZSBvdXRwdXRzIG9mZi4KKwkJICovCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgwX2dwaW8xX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODgzX0FDRVJfQVNQSVJFXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX2FjZXJfYXNwaXJlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgzX2FjZXJfZWFwZF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg4M19hY2VyX2FzcGlyZV9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODhfQUNFUl9BU1BJUkVfNDkzMEddID0geworCQkubWl4ZXJzID0geyBhbGM4ODhfYWNlcl9hc3BpcmVfNDkzMGdfbWl4ZXIsCisJCQkJYWxjODgzX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4OF9hY2VyX2FzcGlyZV80OTMwZ192ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODgzX2FkY19uaWRzX3JldiksCisJCS5hZGNfbmlkcyA9IGFsYzg4M19hZGNfbmlkc19yZXYsCisJCS5jYXBzcmNfbmlkcyA9IGFsYzg4M19jYXBzcmNfbmlkc19yZXYsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF82Y2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF82Y2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuY29uc3RfY2hhbm5lbF9jb3VudCA9IDYsCisJCS5udW1fbXV4X2RlZnMgPQorCQkJQVJSQVlfU0laRShhbGM4ODhfMl9jYXB0dXJlX3NvdXJjZXMpLAorCQkuaW5wdXRfbXV4ID0gYWxjODg4XzJfY2FwdHVyZV9zb3VyY2VzLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM4ODhfYWNlcl9hc3BpcmVfNDkzMGdfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCisJfSwKKwlbQUxDODg4X0FDRVJfQVNQSVJFXzY1MzBHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODg4X2FjZXJfYXNwaXJlXzY1MzBfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicywKKwkJCQlhbGM4ODhfYWNlcl9hc3BpcmVfNjUzMGdfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkc19yZXYpLAorCQkuYWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHNfcmV2LAorCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHNfcmV2LAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAorCQkubnVtX211eF9kZWZzID0KKwkJCUFSUkFZX1NJWkUoYWxjODg4XzJfY2FwdHVyZV9zb3VyY2VzKSwKKwkJLmlucHV0X211eCA9IGFsYzg4OF9hY2VyX2FzcGlyZV82NTMwX3NvdXJjZXMsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg4OF9hY2VyX2FzcGlyZV82NTMwZ19zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODhfQUNFUl9BU1BJUkVfODkzMEddID0geworCQkubWl4ZXJzID0geyBhbGM4ODlfYWNlcl9hc3BpcmVfODkzMGdfbWl4ZXIsCisJCQkJYWxjODgzX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4OV9hY2VyX2FzcGlyZV84OTMwZ192ZXJicywKKwkJCQlhbGM4ODlfZWFwZF92ZXJic30sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODlfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4ODlfYWRjX25pZHMsCisJCS5jYXBzcmNfbmlkcyA9IGFsYzg4OV9jYXBzcmNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzZjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzZjaF9tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5jb25zdF9jaGFubmVsX2NvdW50ID0gNiwKKwkJLm51bV9tdXhfZGVmcyA9CisJCQlBUlJBWV9TSVpFKGFsYzg4OV9jYXB0dXJlX3NvdXJjZXMpLAorCQkuaW5wdXRfbXV4ID0gYWxjODg5X2NhcHR1cmVfc291cmNlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODg5X2FjZXJfYXNwaXJlXzg5MzBnX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAorI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKwkJLnBvd2VyX2hvb2sgPSBhbGNfcG93ZXJfZWFwZCwKKyNlbmRpZgorCX0sCisJW0FMQzg4OF9BQ0VSX0FTUElSRV83NzMwR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M18zU1RfNmNoX21peGVyLAorCQkJCWFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicywKKwkJCQlhbGM4ODhfYWNlcl9hc3BpcmVfNzczMEdfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkc19yZXYpLAorCQkuYWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHNfcmV2LAorCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHNfcmV2LAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfNmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfNmNoX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmNvbnN0X2NoYW5uZWxfY291bnQgPSA2LAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODg4X2FjZXJfYXNwaXJlXzc3MzBnX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAorCX0sCisJW0FMQzg4M19NRURJT05dID0geworCQkubWl4ZXJzID0geyBhbGM4ODNfZml2ZXN0YWNrX21peGVyLAorCQkJICAgIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLAorCQkJCWFsYzg4M19tZWRpb25fZWFwZF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLmFkY19uaWRzID0gYWxjODgzX2FkY19uaWRzX2FsdCwKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODgzX2FkY19uaWRzX2FsdCksCisJCS5jYXBzcmNfbmlkcyA9IGFsYzg4M19jYXBzcmNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M19zaXhzdGFja19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfc2l4c3RhY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4M19NRURJT05fV0lNMjE2MF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M19tZWRpb25fd2ltMjE2MF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4M19tZWRpb25fd2ltMjE2MF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg4M19hZGNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODgzX21lZGlvbl93aW0yMTYwX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAorCX0sCisJW0FMQzg4M19MQVBUT1BfRUFQRF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M19iYXNlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgyX2VhcGRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODgzX0NMRVZPX001NDBSXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzXzNTVF82Y2hfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODNfY2xldm9fbTU0MHJfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAorCQkuZGlnX2luX25pZCA9IEFMQzg4M19ESUdJTl9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzZjaF9jbGV2b19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzZjaF9jbGV2b19tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAorCQkvKiBUaGlzIG1hY2hpbmUgaGFzIHRoZSBoYXJkd2FyZSBIUCBhdXRvLW11dGluZywgdGh1cworCQkgKiB3ZSBuZWVkIG5vIHNvZnR3YXJlIG11dGUgdmlhIHVuc29sIGV2ZW50CisJCSAqLworCX0sCisJW0FMQzg4M19DTEVWT19NNzIwXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX2NsZXZvX203MjBfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODNfY2xldm9fbTcyMF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg4M19jbGV2b19tNzIwX3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM4ODNfY2xldm9fbTcyMF9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsYzg4M19jbGV2b19tNzIwX2luaXRfaG9vaywKKwl9LAorCVtBTEM4ODNfTEVOT1ZPXzEwMUVfMmNoXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX2xlbm92b18xMDFlXzJjaF9taXhlcn0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgzX2xlbm92b18xMDFlX3ZlcmJzfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5hZGNfbmlkcyA9IGFsYzg4M19hZGNfbmlkc19hbHQsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkc19hbHQpLAorCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfbGVub3ZvXzEwMWVfY2FwdHVyZV9zb3VyY2UsCisJCS5zZXR1cCA9IGFsYzg4M19sZW5vdm9fMTAxZV9zZXR1cCwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKKwl9LAorCVtBTEM4ODNfTEVOT1ZPX05CMDc2M10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M19sZW5vdm9fbmIwNzYzX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgzX2xlbm92b19uYjA3NjNfdmVyYnN9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfbGVub3ZvX25iMDc2M19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODgzX2xlbm92b19uYjA3NjNfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCisJfSwKKwlbQUxDODg4X0xFTk9WT19NUzcxOTVfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzXzNTVF82Y2hfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODhfbGVub3ZvX21zNzE5NV92ZXJic30sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfNmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfNmNoX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg4OF9sZW5vdm9fbXM3MTk1X3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzg4M19IQUlFUl9XNjZdID0geworCQkubWl4ZXJzID0geyBhbGM4ODNfdGFyZ2FfMmNoX21peGVyfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODNfaGFpZXJfdzY2X3ZlcmJzfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM4ODNfaGFpZXJfdzY2X3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAorCX0sCisJW0FMQzg4OF8zU1RfSFBdID0geworCQkubWl4ZXJzID0geyBhbGM4ODNfM1NUXzZjaF9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4OF8zc3RfaHBfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODhfM3N0X2hwX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4OF8zc3RfaHBfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODg4XzNzdF9ocF9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODhfNlNUX0RFTExdID0geworCQkubWl4ZXJzID0geyBhbGM4ODNfYmFzZV9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4OF82c3RfZGVsbF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M19zaXhzdGFja19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfc2l4c3RhY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM4ODhfNnN0X2RlbGxfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCisJfSwKKwlbQUxDODgzX01JVEFDXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX21pdGFjX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgzX21pdGFjX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM4ODNfbWl0YWNfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCisJfSwKKwlbQUxDODgzX0ZVSklUU1VfUEkyNTE1XSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzXzJjaF9mdWppdHN1X3BpMjUxNV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsCisJCQkJYWxjODgzXzJjaF9mdWppdHN1X3BpMjUxNV92ZXJic30sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19mdWppdHN1X3BpMjUxNV9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODgzXzJjaF9mdWppdHN1X3BpMjUxNV9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODhfRlVKSVRTVV9YQTM1MzBdID0geworCQkubWl4ZXJzID0geyBhbGM4ODhfYmFzZV9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsCisJCQlhbGM4ODhfZnVqaXRzdV94YTM1MzBfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkc19yZXYpLAorCQkuYWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHNfcmV2LAorCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHNfcmV2LAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4OF80U1RfOGNoX2ludGVsX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4OF80U1RfOGNoX2ludGVsX21vZGVzLAorCQkubnVtX211eF9kZWZzID0KKwkJCUFSUkFZX1NJWkUoYWxjODg4XzJfY2FwdHVyZV9zb3VyY2VzKSwKKwkJLmlucHV0X211eCA9IGFsYzg4OF8yX2NhcHR1cmVfc291cmNlcywKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODg4X2Z1aml0c3VfeGEzNTMwX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAorCX0sCisJW0FMQzg4OF9MRU5PVk9fU0tZXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODg4X2xlbm92b19za3lfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODhfbGVub3ZvX3NreV92ZXJic30sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M19zaXhzdGFja19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfc2l4c3RhY2tfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19sZW5vdm9fc2t5X2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAorCQkuc2V0dXAgPSBhbGM4ODhfbGVub3ZvX3NreV9zZXR1cCwKKwkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODhfQVNVU19NOTBWXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzXzNTVF82Y2hfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODhfYXN1c19tOTB2X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLmRpZ19pbl9uaWQgPSBBTEM4ODNfRElHSU5fTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF82Y2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF82Y2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19mdWppdHN1X3BpMjUxNV9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKKwkJLnNldHVwID0gYWxjODgzX21vZGUyX3NldHVwLAorCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAorCX0sCisJW0FMQzg4OF9BU1VTX0VFRTE2MDFdID0geworCQkubWl4ZXJzID0geyBhbGM4ODNfYXN1c19lZWUxNjAxX21peGVyIH0sCisJCS5jYXBfbWl4ZXIgPSBhbGM4ODNfYXN1c19lZWUxNjAxX2NhcF9taXhlciwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODhfYXN1c19lZWUxNjAxX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLmRpZ19pbl9uaWQgPSBBTEM4ODNfRElHSU5fTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19hc3VzX2VlZTE2MDFfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGM4ODNfZWVlMTYwMV9pbml0aG9vaywKKwl9LAorCVtBTEMxMjAwX0FTVVNfUDVRXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX2Jhc2VfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEMxMjAwX0RJR09VVF9OSUQsCisJCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKKwkJLnNsYXZlX2RpZ19vdXRzID0gYWxjMTIwMF9zbGF2ZV9kaWdfb3V0cywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M19zaXhzdGFja19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfc2l4c3RhY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4OUFfTUIzMV0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4OUFfbWIzMV9taXhlciwgYWxjODgzX2NobW9kZV9taXhlcn0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODg5QV9tYjMxX3ZlcmJzLAorCQkJYWxjODgwX2dwaW8xX2luaXRfdmVyYnMgfSwKKwkJLmFkY19uaWRzID0gYWxjODgzX2FkY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODNfYWRjX25pZHMpLAorCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHMsCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODg5QV9tYjMxXzZjaF9tb2RlcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4OUFfbWIzMV82Y2hfbW9kZXMpLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4OUFfbWIzMV9jYXB0dXJlX3NvdXJjZSwKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS51bnNvbF9ldmVudCA9IGFsYzg4OUFfbWIzMV91bnNvbF9ldmVudCwKKwkJLmluaXRfaG9vayA9IGFsYzg4OUFfbWIzMV9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODNfU09OWV9WQUlPX1RUXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX3ZhaW90dF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4M192YWlvdHRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCisJCS5zZXR1cCA9IGFsYzg4M192YWlvdHRfc2V0dXAsCisJCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCisJfSwKK307CisKKwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9hbGNfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsY19xdWlya3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmUxMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9hbGNfcXVpcmtzLmMKQEAgLTAsMCArMSw0NjcgQEAKKy8qCisgKiBDb21tb24gY29kZXMgZm9yIFJlYWx0ZWsgY29kZWMgcXVpcmtzCisgKiBpbmNsdWRlZCBieSBwYXRjaF9yZWFsdGVrLmMKKyAqLworCisvKgorICogY29uZmlndXJhdGlvbiB0ZW1wbGF0ZSAtIHRvIGJlIGNvcGllZCB0byB0aGUgc3BlYyBpbnN0YW5jZQorICovCitzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgeworCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICptaXhlcnNbNV07IC8qIHNob3VsZCBiZSBpZGVudGljYWwgc2l6ZQorCQkJCQkgICAgICogd2l0aCBzcGVjCisJCQkJCSAgICAgKi8KKwljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqY2FwX21peGVyOyAvKiBjYXB0dXJlIG1peGVyICovCisJY29uc3Qgc3RydWN0IGhkYV92ZXJiICppbml0X3ZlcmJzWzVdOworCXVuc2lnbmVkIGludCBudW1fZGFjczsKKwljb25zdCBoZGFfbmlkX3QgKmRhY19uaWRzOworCWhkYV9uaWRfdCBkaWdfb3V0X25pZDsJCS8qIG9wdGlvbmFsICovCisJaGRhX25pZF90IGhwX25pZDsJCS8qIG9wdGlvbmFsICovCisJY29uc3QgaGRhX25pZF90ICpzbGF2ZV9kaWdfb3V0czsKKwl1bnNpZ25lZCBpbnQgbnVtX2FkY19uaWRzOworCWNvbnN0IGhkYV9uaWRfdCAqYWRjX25pZHM7CisJY29uc3QgaGRhX25pZF90ICpjYXBzcmNfbmlkczsKKwloZGFfbmlkX3QgZGlnX2luX25pZDsKKwl1bnNpZ25lZCBpbnQgbnVtX2NoYW5uZWxfbW9kZTsKKwljb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSAqY2hhbm5lbF9tb2RlOworCWludCBuZWVkX2RhY19maXg7CisJaW50IGNvbnN0X2NoYW5uZWxfY291bnQ7CisJdW5zaWduZWQgaW50IG51bV9tdXhfZGVmczsKKwljb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW5wdXRfbXV4OworCXZvaWQgKCp1bnNvbF9ldmVudCkoc3RydWN0IGhkYV9jb2RlYyAqLCB1bnNpZ25lZCBpbnQpOworCXZvaWQgKCpzZXR1cCkoc3RydWN0IGhkYV9jb2RlYyAqKTsKKwl2b2lkICgqaW5pdF9ob29rKShzdHJ1Y3QgaGRhX2NvZGVjICopOworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKwljb25zdCBzdHJ1Y3QgaGRhX2FtcF9saXN0ICpsb29wYmFja3M7CisJdm9pZCAoKnBvd2VyX2hvb2spKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKKyNlbmRpZgorfTsKKworLyoKKyAqIGNoYW5uZWwgbW9kZSBzZXR0aW5nCisgKi8KK3N0YXRpYyBpbnQgYWxjX2NoX21vZGVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX2NoX21vZGVfaW5mbyhjb2RlYywgdWluZm8sIHNwZWMtPmNoYW5uZWxfbW9kZSwKKwkJCQkgICAgc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgYWxjX2NoX21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfY2hfbW9kZV9nZXQoY29kZWMsIHVjb250cm9sLCBzcGVjLT5jaGFubmVsX21vZGUsCisJCQkJICAgc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSwKKwkJCQkgICBzcGVjLT5leHRfY2hhbm5lbF9jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgYWxjX2NoX21vZGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGVyciA9IHNuZF9oZGFfY2hfbW9kZV9wdXQoY29kZWMsIHVjb250cm9sLCBzcGVjLT5jaGFubmVsX21vZGUsCisJCQkJICAgICAgc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSwKKwkJCQkgICAgICAmc3BlYy0+ZXh0X2NoYW5uZWxfY291bnQpOworCWlmIChlcnIgPj0gMCAmJiAhc3BlYy0+Y29uc3RfY2hhbm5lbF9jb3VudCkgeworCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5leHRfY2hhbm5lbF9jb3VudDsKKwkJaWYgKHNwZWMtPm5lZWRfZGFjX2ZpeCkKKwkJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzIC8gMjsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENvbnRyb2wgdGhlIG1vZGUgb2YgcGluIHdpZGdldCBzZXR0aW5ncyB2aWEgdGhlIG1peGVyLiAgInBjIiBpcyB1c2VkCisgKiBpbnN0ZWFkIG9mICIlIiB0byBhdm9pZCBjb25zZXF1ZW5jZXMgb2YgYWNjaWRlbnRhbGx5IHRyZWF0aW5nIHRoZSAlIGFzCisgKiBiZWluZyBwYXJ0IG9mIGEgZm9ybWF0IHNwZWNpZmllci4gIE1heGltdW0gYWxsb3dlZCBsZW5ndGggb2YgYSB2YWx1ZSBpcworICogNjMgY2hhcmFjdGVycyBwbHVzIE5VTEwgdGVybWluYXRvci4KKyAqCisgKiBOb3RlOiBzb21lIHJldGFza2luZyBwaW4gY29tcGxleGVzIHNlZW0gdG8gaWdub3JlIHJlcXVlc3RzIGZvciBpbnB1dAorICogc3RhdGVzIG90aGVyIHRoYW4gSGlaIChlZzogUElOX1ZSRUZ4eCkgYW5kIHJldmVydCB0byBIaVogaWYgYW55IG9mIHRoZXNlCisgKiBhcmUgcmVxdWVzdGVkLiAgVGhlcmVmb3JlIG9yZGVyIHRoaXMgbGlzdCBzbyB0aGF0IHRoaXMgYmVoYXZpb3VyIHdpbGwgbm90CisgKiBjYXVzZSBwcm9ibGVtcyB3aGVuIG1peGVyIGNsaWVudHMgbW92ZSB0aHJvdWdoIHRoZSBlbnVtIHNlcXVlbnRpYWxseS4KKyAqIE5JRHMgMHgwZiBhbmQgMHgxMCBoYXZlIGJlZW4gb2JzZXJ2ZWQgdG8gaGF2ZSB0aGlzIGJlaGF2aW91ciBhcyBvZgorICogTWFyY2ggMjAwNi4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGNfcGluX21vZGVfbmFtZXNbXSA9IHsKKwkiTWljIDUwcGMgYmlhcyIsICJNaWMgODBwYyBiaWFzIiwKKwkiTGluZSBpbiIsICJMaW5lIG91dCIsICJIZWFkcGhvbmUgb3V0IiwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhbGNfcGluX21vZGVfdmFsdWVzW10gPSB7CisJUElOX1ZSRUY1MCwgUElOX1ZSRUY4MCwgUElOX0lOLCBQSU5fT1VULCBQSU5fSFAsCit9OworLyogVGhlIGNvbnRyb2wgY2FuIHByZXNlbnQgYWxsIDUgb3B0aW9ucywgb3IgaXQgY2FuIGxpbWl0IHRoZSBvcHRpb25zIGJhc2VkCisgKiBpbiB0aGUgcGluIGJlaW5nIGFzc3VtZWQgdG8gYmUgZXhjbHVzaXZlbHkgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IHBpbi4gIEluCisgKiBhZGRpdGlvbiwgImlucHV0IiBwaW5zIG1heSBvciBtYXkgbm90IHByb2Nlc3MgdGhlIG1pYyBiaWFzIG9wdGlvbgorICogZGVwZW5kaW5nIG9uIGFjdHVhbCB3aWRnZXQgY2FwYWJpbGl0eSAoTklEcyAweDBmIGFuZCAweDEwIGRvbid0IHNlZW0gdG8KKyAqIGFjY2VwdCByZXF1ZXN0cyBmb3IgYmlhcyBhcyBvZiBjaGlwIHZlcnNpb25zIHVwIHRvIE1hcmNoIDIwMDYpIGFuZC9vcgorICogd2lyaW5nIGluIHRoZSBjb21wdXRlci4KKyAqLworI2RlZmluZSBBTENfUElOX0RJUl9JTiAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBBTENfUElOX0RJUl9PVVQgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBTENfUElOX0RJUl9JTk9VVCAgICAgICAgICAgMHgwMgorI2RlZmluZSBBTENfUElOX0RJUl9JTl9OT01JQ0JJQVMgICAgMHgwMworI2RlZmluZSBBTENfUElOX0RJUl9JTk9VVF9OT01JQ0JJQVMgMHgwNAorCisvKiBJbmZvIGFib3V0IHRoZSBwaW4gbW9kZXMgc3VwcG9ydGVkIGJ5IHRoZSBkaWZmZXJlbnQgcGluIGRpcmVjdGlvbiBtb2Rlcy4KKyAqIEZvciBlYWNoIGRpcmVjdGlvbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYXJlIGdpdmVuLgorICovCitzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgYWxjX3Bpbl9tb2RlX2Rpcl9pbmZvWzVdWzJdID0geworCXsgMCwgMiB9LCAgICAvKiBBTENfUElOX0RJUl9JTiAqLworCXsgMywgNCB9LCAgICAvKiBBTENfUElOX0RJUl9PVVQgKi8KKwl7IDAsIDQgfSwgICAgLyogQUxDX1BJTl9ESVJfSU5PVVQgKi8KKwl7IDIsIDIgfSwgICAgLyogQUxDX1BJTl9ESVJfSU5fTk9NSUNCSUFTICovCisJeyAyLCA0IH0sICAgIC8qIEFMQ19QSU5fRElSX0lOT1VUX05PTUlDQklBUyAqLworfTsKKyNkZWZpbmUgYWxjX3Bpbl9tb2RlX21pbihfZGlyKSAoYWxjX3Bpbl9tb2RlX2Rpcl9pbmZvW19kaXJdWzBdKQorI2RlZmluZSBhbGNfcGluX21vZGVfbWF4KF9kaXIpIChhbGNfcGluX21vZGVfZGlyX2luZm9bX2Rpcl1bMV0pCisjZGVmaW5lIGFsY19waW5fbW9kZV9uX2l0ZW1zKF9kaXIpIFwKKwkoYWxjX3Bpbl9tb2RlX21heChfZGlyKS1hbGNfcGluX21vZGVfbWluKF9kaXIpKzEpCisKK3N0YXRpYyBpbnQgYWxjX3Bpbl9tb2RlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdW5zaWduZWQgaW50IGl0ZW1fbnVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbTsKKwl1bnNpZ25lZCBjaGFyIGRpciA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGFsY19waW5fbW9kZV9uX2l0ZW1zKGRpcik7CisKKwlpZiAoaXRlbV9udW08YWxjX3Bpbl9tb2RlX21pbihkaXIpIHx8IGl0ZW1fbnVtPmFsY19waW5fbW9kZV9tYXgoZGlyKSkKKwkJaXRlbV9udW0gPSBhbGNfcGluX21vZGVfbWluKGRpcik7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIGFsY19waW5fbW9kZV9uYW1lc1tpdGVtX251bV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsY19waW5fbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOworCXVuc2lnbmVkIGNoYXIgZGlyID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCXVuc2lnbmVkIGludCBwaW5jdGwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKKwkJCQkJCSBBQ19WRVJCX0dFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkJCQkgMHgwMCk7CisKKwkvKiBGaW5kIGVudW1lcmF0ZWQgdmFsdWUgZm9yIGN1cnJlbnQgcGluY3RsIHNldHRpbmcgKi8KKwlpID0gYWxjX3Bpbl9tb2RlX21pbihkaXIpOworCXdoaWxlIChpIDw9IGFsY19waW5fbW9kZV9tYXgoZGlyKSAmJiBhbGNfcGluX21vZGVfdmFsdWVzW2ldICE9IHBpbmN0bCkKKwkJaSsrOworCSp2YWxwID0gaSA8PSBhbGNfcGluX21vZGVfbWF4KGRpcikgPyBpOiBhbGNfcGluX21vZGVfbWluKGRpcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxjX3Bpbl9tb2RlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzaWduZWQgaW50IGNoYW5nZTsKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7CisJdW5zaWduZWQgY2hhciBkaXIgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlsb25nIHZhbCA9ICp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKwl1bnNpZ25lZCBpbnQgcGluY3RsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJCQkJCQkgQUNfVkVSQl9HRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJCQkJIDB4MDApOworCisJaWYgKHZhbCA8IGFsY19waW5fbW9kZV9taW4oZGlyKSB8fCB2YWwgPiBhbGNfcGluX21vZGVfbWF4KGRpcikpCisJCXZhbCA9IGFsY19waW5fbW9kZV9taW4oZGlyKTsKKworCWNoYW5nZSA9IHBpbmN0bCAhPSBhbGNfcGluX21vZGVfdmFsdWVzW3ZhbF07CisJaWYgKGNoYW5nZSkgeworCQkvKiBTZXQgcGluIG1vZGUgdG8gdGhhdCByZXF1ZXN0ZWQgKi8KKwkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAorCQkJCQkgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCQkJICBhbGNfcGluX21vZGVfdmFsdWVzW3ZhbF0pOworCisJCS8qIEFsc28gZW5hYmxlIHRoZSByZXRhc2tpbmcgcGluJ3MgaW5wdXQvb3V0cHV0IGFzIHJlcXVpcmVkCisJCSAqIGZvciB0aGUgcmVxdWVzdGVkIHBpbiBtb2RlLiAgRW51bSB2YWx1ZXMgb2YgMiBvciBsZXNzIGFyZQorCQkgKiBpbnB1dCBtb2Rlcy4KKwkJICoKKwkJICogRHluYW1pY2FsbHkgc3dpdGNoaW5nIHRoZSBpbnB1dC9vdXRwdXQgYnVmZmVycyBwcm9iYWJseQorCQkgKiByZWR1Y2VzIG5vaXNlIHNsaWdodGx5IChwYXJ0aWN1bGFybHkgb24gaW5wdXQpIHNvIHdlJ2xsCisJCSAqIGRvIGl0LiAgSG93ZXZlciwgaGF2aW5nIGJvdGggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisJCSAqIGVuYWJsZWQgc2ltdWx0YW5lb3VzbHkgZG9lc24ndCBzZWVtIHRvIGJlIHByb2JsZW1hdGljIGlmCisJCSAqIHRoaXMgdHVybnMgb3V0IHRvIGJlIG5lY2Vzc2FyeSBpbiB0aGUgZnV0dXJlLgorCQkgKi8KKwkJaWYgKHZhbCA8PSAyKSB7CisJCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIG5pZCwgSERBX09VVFBVVCwgMCwKKwkJCQkJCSBIREFfQU1QX01VVEUsIEhEQV9BTVBfTVVURSk7CisJCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIG5pZCwgSERBX0lOUFVULCAwLAorCQkJCQkJIEhEQV9BTVBfTVVURSwgMCk7CisJCX0gZWxzZSB7CisJCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIG5pZCwgSERBX0lOUFVULCAwLAorCQkJCQkJIEhEQV9BTVBfTVVURSwgSERBX0FNUF9NVVRFKTsKKwkJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgbmlkLCBIREFfT1VUUFVULCAwLAorCQkJCQkJIEhEQV9BTVBfTVVURSwgMCk7CisJCX0KKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBBTENfUElOX01PREUoeG5hbWUsIG5pZCwgZGlyKSBcCisJeyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0gMCwgIFwKKwkgIC5zdWJkZXZpY2UgPSBIREFfU1VCREVWX05JRF9GTEFHIHwgbmlkLCBcCisJICAuaW5mbyA9IGFsY19waW5fbW9kZV9pbmZvLCBcCisJICAuZ2V0ID0gYWxjX3Bpbl9tb2RlX2dldCwgXAorCSAgLnB1dCA9IGFsY19waW5fbW9kZV9wdXQsIFwKKwkgIC5wcml2YXRlX3ZhbHVlID0gbmlkIHwgKGRpcjw8MTYpIH0KKworLyogQSBzd2l0Y2ggY29udHJvbCBmb3IgQUxDMjYwIEdQSU8gcGlucy4gIE11bHRpcGxlIEdQSU9zIGNhbiBiZSBnYW5nZWQKKyAqIHRvZ2V0aGVyIHVzaW5nIGEgbWFzayB3aXRoIG1vcmUgdGhhbiBvbmUgYml0IHNldC4gIFRoaXMgY29udHJvbCBpcworICogY3VycmVudGx5IHVzZWQgb25seSBieSB0aGUgQUxDMjYwIHRlc3QgbW9kZWwuICBBdCB0aGlzIHN0YWdlIHRoZXkgYXJlIG5vdAorICogbmVlZGVkIGZvciBhbnkgInByb2R1Y3Rpb24iIG1vZGVscy4KKyAqLworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKyNkZWZpbmUgYWxjX2dwaW9fZGF0YV9pbmZvCXNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8KKworc3RhdGljIGludCBhbGNfZ3Bpb19kYXRhX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOworCXVuc2lnbmVkIGNoYXIgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJCQkJCSAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwgMHgwMCk7CisKKwkqdmFscCA9ICh2YWwgJiBtYXNrKSAhPSAwOworCXJldHVybiAwOworfQorc3RhdGljIGludCBhbGNfZ3Bpb19kYXRhX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc2lnbmVkIGludCBjaGFuZ2U7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOworCXVuc2lnbmVkIGNoYXIgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCWxvbmcgdmFsID0gKnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCXVuc2lnbmVkIGludCBncGlvX2RhdGEgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKKwkJCQkJCSAgICBBQ19WRVJCX0dFVF9HUElPX0RBVEEsCisJCQkJCQkgICAgMHgwMCk7CisKKwkvKiBTZXQvdW5zZXQgdGhlIG1hc2tlZCBHUElPIGJpdChzKSBhcyBuZWVkZWQgKi8KKwljaGFuZ2UgPSAodmFsID09IDAgPyAwIDogbWFzaykgIT0gKGdwaW9fZGF0YSAmIG1hc2spOworCWlmICh2YWwgPT0gMCkKKwkJZ3Bpb19kYXRhICY9IH5tYXNrOworCWVsc2UKKwkJZ3Bpb19kYXRhIHw9IG1hc2s7CisJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAorCQkJCSAgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCBncGlvX2RhdGEpOworCisJcmV0dXJuIGNoYW5nZTsKK30KKyNkZWZpbmUgQUxDX0dQSU9fREFUQV9TV0lUQ0goeG5hbWUsIG5pZCwgbWFzaykgXAorCXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IDAsICBcCisJICAuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IG5pZCwgXAorCSAgLmluZm8gPSBhbGNfZ3Bpb19kYXRhX2luZm8sIFwKKwkgIC5nZXQgPSBhbGNfZ3Bpb19kYXRhX2dldCwgXAorCSAgLnB1dCA9IGFsY19ncGlvX2RhdGFfcHV0LCBcCisJICAucHJpdmF0ZV92YWx1ZSA9IG5pZCB8IChtYXNrPDwxNikgfQorI2VuZGlmICAgLyogQ09ORklHX1NORF9ERUJVRyAqLworCisvKiBBIHN3aXRjaCBjb250cm9sIHRvIGFsbG93IHRoZSBlbmFibGluZyBvZiB0aGUgZGlnaXRhbCBJTyBwaW5zIG9uIHRoZQorICogQUxDMjYwLiAgVGhpcyBpcyBpbmNyZWRpYmx5IHNpbXBsaXN0aWM7IHRoZSBpbnRlbnRpb24gb2YgdGhpcyBjb250cm9sIGlzCisgKiB0byBwcm92aWRlIHNvbWV0aGluZyBpbiB0aGUgdGVzdCBtb2RlbCBhbGxvd2luZyBkaWdpdGFsIG91dHB1dHMgdG8gYmUKKyAqIGlkZW50aWZpZWQgaWYgcHJlc2VudC4gIElmIG1vZGVscyBhcmUgZm91bmQgd2hpY2ggY2FuIHV0aWxpc2UgdGhlc2UKKyAqIG91dHB1dHMgYSBtb3JlIGNvbXBsZXRlIG1peGVyIGNvbnRyb2wgY2FuIGJlIGRldmlzZWQgZm9yIHRob3NlIG1vZGVscyBpZgorICogbmVjZXNzYXJ5LgorICovCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworI2RlZmluZSBhbGNfc3BkaWZfY3RybF9pbmZvCXNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8KKworc3RhdGljIGludCBhbGNfc3BkaWZfY3RybF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7CisJdW5zaWduZWQgY2hhciBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCXVuc2lnbmVkIGludCB2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKKwkJCQkJICAgICAgQUNfVkVSQl9HRVRfRElHSV9DT05WRVJUXzEsIDB4MDApOworCisJKnZhbHAgPSAodmFsICYgbWFzaykgIT0gMDsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgYWxjX3NwZGlmX2N0cmxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc2lnbmVkIGludCBjaGFuZ2U7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOworCXVuc2lnbmVkIGNoYXIgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCWxvbmcgdmFsID0gKnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCXVuc2lnbmVkIGludCBjdHJsX2RhdGEgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKKwkJCQkJCSAgICBBQ19WRVJCX0dFVF9ESUdJX0NPTlZFUlRfMSwKKwkJCQkJCSAgICAweDAwKTsKKworCS8qIFNldC91bnNldCB0aGUgbWFza2VkIGNvbnRyb2wgYml0KHMpIGFzIG5lZWRlZCAqLworCWNoYW5nZSA9ICh2YWwgPT0gMCA/IDAgOiBtYXNrKSAhPSAoY3RybF9kYXRhICYgbWFzayk7CisJaWYgKHZhbD09MCkKKwkJY3RybF9kYXRhICY9IH5tYXNrOworCWVsc2UKKwkJY3RybF9kYXRhIHw9IG1hc2s7CisJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwKKwkJCQkgIGN0cmxfZGF0YSk7CisKKwlyZXR1cm4gY2hhbmdlOworfQorI2RlZmluZSBBTENfU1BESUZfQ1RSTF9TV0lUQ0goeG5hbWUsIG5pZCwgbWFzaykgXAorCXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IDAsICBcCisJICAuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IG5pZCwgXAorCSAgLmluZm8gPSBhbGNfc3BkaWZfY3RybF9pbmZvLCBcCisJICAuZ2V0ID0gYWxjX3NwZGlmX2N0cmxfZ2V0LCBcCisJICAucHV0ID0gYWxjX3NwZGlmX2N0cmxfcHV0LCBcCisJICAucHJpdmF0ZV92YWx1ZSA9IG5pZCB8IChtYXNrPDwxNikgfQorI2VuZGlmICAgLyogQ09ORklHX1NORF9ERUJVRyAqLworCisvKiBBIHN3aXRjaCBjb250cm9sIHRvIGFsbG93IHRoZSBlbmFibGluZyBFQVBEIGRpZ2l0YWwgb3V0cHV0cyBvbiB0aGUgQUxDMjZ4LgorICogQWdhaW4sIHRoaXMgaXMgb25seSB1c2VkIGluIHRoZSBBTEMyNnggdGVzdCBtb2RlbHMgdG8gaGVscCBpZGVudGlmeSB3aGVuCisgKiB0aGUgRUFQRCBsaW5lIG11c3QgYmUgYXNzZXJ0ZWQgZm9yIGZlYXR1cmVzIHRvIHdvcmsuCisgKi8KKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisjZGVmaW5lIGFsY19lYXBkX2N0cmxfaW5mbwlzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvCisKK3N0YXRpYyBpbnQgYWxjX2VhcGRfY3RybF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7CisJdW5zaWduZWQgY2hhciBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCXVuc2lnbmVkIGludCB2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKKwkJCQkJICAgICAgQUNfVkVSQl9HRVRfRUFQRF9CVExFTkFCTEUsIDB4MDApOworCisJKnZhbHAgPSAodmFsICYgbWFzaykgIT0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGNfZWFwZF9jdHJsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBjaGFuZ2U7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOworCXVuc2lnbmVkIGNoYXIgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCWxvbmcgdmFsID0gKnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCXVuc2lnbmVkIGludCBjdHJsX2RhdGEgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKKwkJCQkJCSAgICBBQ19WRVJCX0dFVF9FQVBEX0JUTEVOQUJMRSwKKwkJCQkJCSAgICAweDAwKTsKKworCS8qIFNldC91bnNldCB0aGUgbWFza2VkIGNvbnRyb2wgYml0KHMpIGFzIG5lZWRlZCAqLworCWNoYW5nZSA9ICghdmFsID8gMCA6IG1hc2spICE9IChjdHJsX2RhdGEgJiBtYXNrKTsKKwlpZiAoIXZhbCkKKwkJY3RybF9kYXRhICY9IH5tYXNrOworCWVsc2UKKwkJY3RybF9kYXRhIHw9IG1hc2s7CisJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwKKwkJCQkgIGN0cmxfZGF0YSk7CisKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIEFMQ19FQVBEX0NUUkxfU1dJVENIKHhuYW1lLCBuaWQsIG1hc2spIFwKKwl7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSAwLCAgXAorCSAgLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCBuaWQsIFwKKwkgIC5pbmZvID0gYWxjX2VhcGRfY3RybF9pbmZvLCBcCisJICAuZ2V0ID0gYWxjX2VhcGRfY3RybF9nZXQsIFwKKwkgIC5wdXQgPSBhbGNfZWFwZF9jdHJsX3B1dCwgXAorCSAgLnByaXZhdGVfdmFsdWUgPSBuaWQgfCAobWFzazw8MTYpIH0KKyNlbmRpZiAgIC8qIENPTkZJR19TTkRfREVCVUcgKi8KKworc3RhdGljIHZvaWQgYWxjX2ZpeHVwX2F1dG9jZmdfcGluX251bXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CisKKwlpZiAoIWNmZy0+bGluZV9vdXRzKSB7CisJCXdoaWxlIChjZmctPmxpbmVfb3V0cyA8IEFVVE9fQ0ZHX01BWF9PVVRTICYmCisJCSAgICAgICBjZmctPmxpbmVfb3V0X3BpbnNbY2ZnLT5saW5lX291dHNdKQorCQkJY2ZnLT5saW5lX291dHMrKzsKKwl9CisJaWYgKCFjZmctPnNwZWFrZXJfb3V0cykgeworCQl3aGlsZSAoY2ZnLT5zcGVha2VyX291dHMgPCBBVVRPX0NGR19NQVhfT1VUUyAmJgorCQkgICAgICAgY2ZnLT5zcGVha2VyX3BpbnNbY2ZnLT5zcGVha2VyX291dHNdKQorCQkJY2ZnLT5zcGVha2VyX291dHMrKzsKKwl9CisJaWYgKCFjZmctPmhwX291dHMpIHsKKwkJd2hpbGUgKGNmZy0+aHBfb3V0cyA8IEFVVE9fQ0ZHX01BWF9PVVRTICYmCisJCSAgICAgICBjZmctPmhwX3BpbnNbY2ZnLT5ocF9vdXRzXSkKKwkJCWNmZy0+aHBfb3V0cysrOworCX0KK30KKworLyoKKyAqIHNldCB1cCBmcm9tIHRoZSBwcmVzZXQgdGFibGUKKyAqLworc3RhdGljIHZvaWQgc2V0dXBfcHJlc2V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJIGNvbnN0IHN0cnVjdCBhbGNfY29uZmlnX3ByZXNldCAqcHJlc2V0KQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJlc2V0LT5taXhlcnMpICYmIHByZXNldC0+bWl4ZXJzW2ldOyBpKyspCisJCWFkZF9taXhlcihzcGVjLCBwcmVzZXQtPm1peGVyc1tpXSk7CisJc3BlYy0+Y2FwX21peGVyID0gcHJlc2V0LT5jYXBfbWl4ZXI7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJlc2V0LT5pbml0X3ZlcmJzKSAmJiBwcmVzZXQtPmluaXRfdmVyYnNbaV07CisJICAgICBpKyspCisJCWFkZF92ZXJiKHNwZWMsIHByZXNldC0+aW5pdF92ZXJic1tpXSk7CisKKwlzcGVjLT5jaGFubmVsX21vZGUgPSBwcmVzZXQtPmNoYW5uZWxfbW9kZTsKKwlzcGVjLT5udW1fY2hhbm5lbF9tb2RlID0gcHJlc2V0LT5udW1fY2hhbm5lbF9tb2RlOworCXNwZWMtPm5lZWRfZGFjX2ZpeCA9IHByZXNldC0+bmVlZF9kYWNfZml4OworCXNwZWMtPmNvbnN0X2NoYW5uZWxfY291bnQgPSBwcmVzZXQtPmNvbnN0X2NoYW5uZWxfY291bnQ7CisKKwlpZiAocHJlc2V0LT5jb25zdF9jaGFubmVsX2NvdW50KQorCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBwcmVzZXQtPmNvbnN0X2NoYW5uZWxfY291bnQ7CisJZWxzZQorCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5jaGFubmVsX21vZGVbMF0uY2hhbm5lbHM7CisJc3BlYy0+ZXh0X2NoYW5uZWxfY291bnQgPSBzcGVjLT5jaGFubmVsX21vZGVbMF0uY2hhbm5lbHM7CisKKwlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IHByZXNldC0+bnVtX2RhY3M7CisJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBwcmVzZXQtPmRhY19uaWRzOworCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gcHJlc2V0LT5kaWdfb3V0X25pZDsKKwlzcGVjLT5tdWx0aW91dC5zbGF2ZV9kaWdfb3V0cyA9IHByZXNldC0+c2xhdmVfZGlnX291dHM7CisJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gcHJlc2V0LT5ocF9uaWQ7CisKKwlzcGVjLT5udW1fbXV4X2RlZnMgPSBwcmVzZXQtPm51bV9tdXhfZGVmczsKKwlpZiAoIXNwZWMtPm51bV9tdXhfZGVmcykKKwkJc3BlYy0+bnVtX211eF9kZWZzID0gMTsKKwlzcGVjLT5pbnB1dF9tdXggPSBwcmVzZXQtPmlucHV0X211eDsKKworCXNwZWMtPm51bV9hZGNfbmlkcyA9IHByZXNldC0+bnVtX2FkY19uaWRzOworCXNwZWMtPmFkY19uaWRzID0gcHJlc2V0LT5hZGNfbmlkczsKKwlzcGVjLT5jYXBzcmNfbmlkcyA9IHByZXNldC0+Y2Fwc3JjX25pZHM7CisJc3BlYy0+ZGlnX2luX25pZCA9IHByZXNldC0+ZGlnX2luX25pZDsKKworCXNwZWMtPnVuc29sX2V2ZW50ID0gcHJlc2V0LT51bnNvbF9ldmVudDsKKwlzcGVjLT5pbml0X2hvb2sgPSBwcmVzZXQtPmluaXRfaG9vazsKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCisJc3BlYy0+cG93ZXJfaG9vayA9IHByZXNldC0+cG93ZXJfaG9vazsKKwlzcGVjLT5sb29wYmFjay5hbXBsaXN0ID0gcHJlc2V0LT5sb29wYmFja3M7CisjZW5kaWYKKworCWlmIChwcmVzZXQtPnNldHVwKQorCQlwcmVzZXQtPnNldHVwKGNvZGVjKTsKKworCWFsY19maXh1cF9hdXRvY2ZnX3Bpbl9udW1zKGNvZGVjKTsKK30KKworCisvKiBhdXRvLXRvZ2dsZSBmcm9udCBtaWMgKi8KK3N0YXRpYyB2b2lkIGFsYzg4eF9zaW1wbGVfbWljX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisKKwlwcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxOCk7CisJYml0cyA9IHByZXNlbnQgPyBIREFfQU1QX01VVEUgOiAwOworCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwYiwgSERBX0lOUFVULCAxLCBIREFfQU1QX01VVEUsIGJpdHMpOworfQorCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmgKaW5kZXggZjFkZTFiYS4uNTVmMDY0NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuaApAQCAtNTAsNyArNTAsMTIgQEAKIGludCBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG5pZCk7CiB2b2lkIHNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKICNlbHNlCi0jZGVmaW5lIHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKC4uLikJCTAKLSNkZWZpbmUgc25kX2hkYV9kZXRhY2hfYmVlcF9kZXZpY2UoLi4uKQorc3RhdGljIGlubGluZSBpbnQgc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBuaWQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2hkYV9kZXRhY2hfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7Cit9CiAjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKaW5kZXggNDViNGE4ZC4uOWMyN2EzYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCkBAIC0yNDMsNyArMjQzLDggQEAKIHsKIAl1bnNpZ25lZCBjbWQgPSBtYWtlX2NvZGVjX2NtZChjb2RlYywgbmlkLCBkaXJlY3QsIHZlcmIsIHBhcm0pOwogCXVuc2lnbmVkIGludCByZXM7Ci0JY29kZWNfZXhlY192ZXJiKGNvZGVjLCBjbWQsICZyZXMpOworCWlmIChjb2RlY19leGVjX3ZlcmIoY29kZWMsIGNtZCwgJnJlcykpCisJCXJldHVybiAtMTsKIAlyZXR1cm4gcmVzOwogfQogRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9jb2RlY19yZWFkKTsKQEAgLTMwNywxNCArMzA4LDY1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0hEQShzbmRfaGRhX2dldF9zdWJfbm9kZXMpOwogCi1zdGF0aWMgaW50IF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAotCQkJCWhkYV9uaWRfdCAqY29ubl9saXN0LCBpbnQgbWF4X2Nvbm5zKTsKLXN0YXRpYyBib29sIGFkZF9jb25uX2xpc3Qoc3RydWN0IHNuZF9hcnJheSAqYXJyYXksIGhkYV9uaWRfdCBuaWQpOwotc3RhdGljIGludCBjb3B5X2Nvbm5fbGlzdChoZGFfbmlkX3QgbmlkLCBoZGFfbmlkX3QgKmRzdCwgaW50IG1heF9kc3QsCi0JCQkgIGhkYV9uaWRfdCAqc3JjLCBpbnQgbGVuKTsKKy8qIGxvb2sgdXAgdGhlIGNhY2hlZCByZXN1bHRzICovCitzdGF0aWMgaGRhX25pZF90ICpsb29rdXBfY29ubl9saXN0KHN0cnVjdCBzbmRfYXJyYXkgKmFycmF5LCBoZGFfbmlkX3QgbmlkKQoreworCWludCBpLCBsZW47CisJZm9yIChpID0gMDsgaSA8IGFycmF5LT51c2VkOyApIHsKKwkJaGRhX25pZF90ICpwID0gc25kX2FycmF5X2VsZW0oYXJyYXksIGkpOworCQlpZiAobmlkID09ICpwKQorCQkJcmV0dXJuIHA7CisJCWxlbiA9IHBbMV07CisJCWkgKz0gbGVuICsgMjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CiAKIC8qKgotICogc25kX2hkYV9nZXRfY29ubmVjdGlvbnMgLSBnZXQgY29ubmVjdGlvbiBsaXN0CisgKiBzbmRfaGRhX2dldF9jb25uX2xpc3QgLSBnZXQgY29ubmVjdGlvbiBsaXN0CisgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKKyAqIEBuaWQ6IE5JRCB0byBwYXJzZQorICogQGxpc3RwOiB0aGUgcG9pbnRlciB0byBzdG9yZSBOSUQgbGlzdAorICoKKyAqIFBhcnNlcyB0aGUgY29ubmVjdGlvbiBsaXN0IG9mIHRoZSBnaXZlbiB3aWRnZXQgYW5kIHN0b3JlcyB0aGUgbGlzdAorICogb2YgTklEcy4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29ubmVjdGlvbnMsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNuZF9oZGFfZ2V0X2Nvbm5fbGlzdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCSAgY29uc3QgaGRhX25pZF90ICoqbGlzdHApCit7CisJc3RydWN0IHNuZF9hcnJheSAqYXJyYXkgPSAmY29kZWMtPmNvbm5fbGlzdHM7CisJaW50IGxlbiwgZXJyOworCWhkYV9uaWRfdCBsaXN0W0hEQV9NQVhfQ09OTkVDVElPTlNdOworCWhkYV9uaWRfdCAqcDsKKwlib29sIGFkZGVkID0gZmFsc2U7CisKKyBhZ2FpbjoKKwkvKiBpZiB0aGUgY29ubmVjdGlvbi1saXN0IGlzIGFscmVhZHkgY2FjaGVkLCByZWFkIGl0ICovCisJcCA9IGxvb2t1cF9jb25uX2xpc3QoYXJyYXksIG5pZCk7CisJaWYgKHApIHsKKwkJaWYgKGxpc3RwKQorCQkJKmxpc3RwID0gcCArIDI7CisJCXJldHVybiBwWzFdOworCX0KKwlpZiAoc25kX0JVR19PTihhZGRlZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogcmVhZCB0aGUgY29ubmVjdGlvbiBhbmQgYWRkIHRvIHRoZSBjYWNoZSAqLworCWxlbiA9IHNuZF9oZGFfZ2V0X3Jhd19jb25uZWN0aW9ucyhjb2RlYywgbmlkLCBsaXN0LCBIREFfTUFYX0NPTk5FQ1RJT05TKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIGxlbjsKKwllcnIgPSBzbmRfaGRhX292ZXJyaWRlX2Nvbm5fbGlzdChjb2RlYywgbmlkLCBsZW4sIGxpc3QpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWFkZGVkID0gdHJ1ZTsKKwlnb3RvIGFnYWluOworfQorRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9nZXRfY29ubl9saXN0KTsKKworLyoqCisgKiBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyAtIGNvcHkgY29ubmVjdGlvbiBsaXN0CiAgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKICAqIEBuaWQ6IE5JRCB0byBwYXJzZQogICogQGNvbm5fbGlzdDogY29ubmVjdGlvbiBsaXN0IGFycmF5CkBAIC0zMjgsNDIgKzM4MCwzNSBAQAogaW50IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAogCQkJICAgICBoZGFfbmlkX3QgKmNvbm5fbGlzdCwgaW50IG1heF9jb25ucykKIHsKLQlzdHJ1Y3Qgc25kX2FycmF5ICphcnJheSA9ICZjb2RlYy0+Y29ubl9saXN0czsKLQlpbnQgaSwgbGVuLCBvbGRfdXNlZDsKLQloZGFfbmlkX3QgbGlzdFtIREFfTUFYX0NPTk5FQ1RJT05TXTsKKwljb25zdCBoZGFfbmlkX3QgKmxpc3Q7CisJaW50IGxlbiA9IHNuZF9oZGFfZ2V0X2Nvbm5fbGlzdChjb2RlYywgbmlkLCAmbGlzdCk7CiAKLQkvKiBsb29rIHVwIHRoZSBjYWNoZWQgcmVzdWx0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBhcnJheS0+dXNlZDsgKSB7Ci0JCWhkYV9uaWRfdCAqcCA9IHNuZF9hcnJheV9lbGVtKGFycmF5LCBpKTsKLQkJbGVuID0gcFsxXTsKLQkJaWYgKG5pZCA9PSAqcCkKLQkJCXJldHVybiBjb3B5X2Nvbm5fbGlzdChuaWQsIGNvbm5fbGlzdCwgbWF4X2Nvbm5zLAotCQkJCQkgICAgICBwICsgMiwgbGVuKTsKLQkJaSArPSBsZW4gKyAyOwotCX0KLQotCWxlbiA9IF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsIGxpc3QsIEhEQV9NQVhfQ09OTkVDVElPTlMpOwotCWlmIChsZW4gPCAwKQorCWlmIChsZW4gPD0gMCkKIAkJcmV0dXJuIGxlbjsKLQotCS8qIGFkZCB0byB0aGUgY2FjaGUgKi8KLQlvbGRfdXNlZCA9IGFycmF5LT51c2VkOwotCWlmICghYWRkX2Nvbm5fbGlzdChhcnJheSwgbmlkKSB8fCAhYWRkX2Nvbm5fbGlzdChhcnJheSwgbGVuKSkKLQkJZ290byBlcnJvcl9hZGQ7Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQlpZiAoIWFkZF9jb25uX2xpc3QoYXJyYXksIGxpc3RbaV0pKQotCQkJZ290byBlcnJvcl9hZGQ7Ci0KLQlyZXR1cm4gY29weV9jb25uX2xpc3QobmlkLCBjb25uX2xpc3QsIG1heF9jb25ucywgbGlzdCwgbGVuKTsKLQkJCi0gZXJyb3JfYWRkOgotCWFycmF5LT51c2VkID0gb2xkX3VzZWQ7Ci0JcmV0dXJuIC1FTk9NRU07CisJaWYgKGxlbiA+IG1heF9jb25ucykgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6ICIKKwkJCSAgICJUb28gbWFueSBjb25uZWN0aW9ucyAlZCBmb3IgTklEIDB4JXhcbiIsCisJCQkgICBsZW4sIG5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltZW1jcHkoY29ubl9saXN0LCBsaXN0LCBsZW4gKiBzaXplb2YoaGRhX25pZF90KSk7CisJcmV0dXJuIGxlbjsKIH0KIEVYUE9SVF9TWU1CT0xfSERBKHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKTsKIAotc3RhdGljIGludCBfaGRhX2dldF9jb25uZWN0aW9ucyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKLQkJCSAgICAgaGRhX25pZF90ICpjb25uX2xpc3QsIGludCBtYXhfY29ubnMpCisvKioKKyAqIHNuZF9oZGFfZ2V0X3Jhd19jb25uZWN0aW9ucyAtIGNvcHkgY29ubmVjdGlvbiBsaXN0IHdpdGhvdXQgY2FjaGUKKyAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYworICogQG5pZDogTklEIHRvIHBhcnNlCisgKiBAY29ubl9saXN0OiBjb25uZWN0aW9uIGxpc3QgYXJyYXkKKyAqIEBtYXhfY29ubnM6IG1heC4gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRvIHN0b3JlCisgKgorICogTGlrZSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucygpLCBjb3B5IHRoZSBjb25uZWN0aW9uIGxpc3QgYnV0IHdpdGhvdXQKKyAqIGNoZWNraW5nIHRocm91Z2ggdGhlIGNvbm5lY3Rpb24tbGlzdCBjYWNoZS4KKyAqIEN1cnJlbnRseSBjYWxsZWQgb25seSBmcm9tIGhkYV9wcm9jLmMsIHNvIG5vdCBleHBvcnRlZC4KKyAqLworaW50IHNuZF9oZGFfZ2V0X3Jhd19jb25uZWN0aW9ucyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCQloZGFfbmlkX3QgKmNvbm5fbGlzdCwgaW50IG1heF9jb25ucykKIHsKIAl1bnNpZ25lZCBpbnQgcGFybTsKIAlpbnQgaSwgY29ubl9sZW4sIGNvbm5zOwpAQCAtMzc2LDExICs0MjEsOCBAQAogCiAJd2NhcHMgPSBnZXRfd2NhcHMoY29kZWMsIG5pZCk7CiAJaWYgKCEod2NhcHMgJiBBQ19XQ0FQX0NPTk5fTElTVCkgJiYKLQkgICAgZ2V0X3djYXBzX3R5cGUod2NhcHMpICE9IEFDX1dJRF9WT0xfS05CKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6ICIKLQkJCSAgICJjb25uZWN0aW9uIGxpc3Qgbm90IGF2YWlsYWJsZSBmb3IgMHgleFxuIiwgbmlkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCSAgICBnZXRfd2NhcHNfdHlwZSh3Y2FwcykgIT0gQUNfV0lEX1ZPTF9LTkIpCisJCXJldHVybiAwOwogCiAJcGFybSA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfQ09OTkxJU1RfTEVOKTsKIAlpZiAocGFybSAmIEFDX0NMSVNUX0xPTkcpIHsKQEAgLTQ3MCwxOCArNTEyLDc3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgY29weV9jb25uX2xpc3QoaGRhX25pZF90IG5pZCwgaGRhX25pZF90ICpkc3QsIGludCBtYXhfZHN0LAotCQkJICBoZGFfbmlkX3QgKnNyYywgaW50IGxlbikKKy8qKgorICogc25kX2hkYV9vdmVycmlkZV9jb25uX2xpc3QgLSBhZGQvbW9kaWZ5IHRoZSBjb25uZWN0aW9uLWxpc3QgdG8gY2FjaGUKKyAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYworICogQG5pZDogTklEIHRvIHBhcnNlCisgKiBAbGVuOiBudW1iZXIgb2YgY29ubmVjdGlvbiBsaXN0IGVudHJpZXMKKyAqIEBsaXN0OiB0aGUgbGlzdCBvZiBjb25uZWN0aW9uIGVudHJpZXMKKyAqCisgKiBBZGQgb3IgbW9kaWZ5IHRoZSBnaXZlbiBjb25uZWN0aW9uLWxpc3QgdG8gdGhlIGNhY2hlLiAgSWYgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGNhY2hlIGFscmVhZHkgZXhpc3RzLCBpbnZhbGlkYXRlIGl0IGFuZCBhcHBlbmQgYSBuZXcgb25lLgorICoKKyAqIFJldHVybnMgemVybyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBzbmRfaGRhX292ZXJyaWRlX2Nvbm5fbGlzdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGxlbiwKKwkJCSAgICAgICBjb25zdCBoZGFfbmlkX3QgKmxpc3QpCiB7Ci0JaWYgKGxlbiA+IG1heF9kc3QpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiAiCi0JCQkgICAiVG9vIG1hbnkgY29ubmVjdGlvbnMgJWQgZm9yIE5JRCAweCV4XG4iLAotCQkJICAgbGVuLCBuaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbWVtY3B5KGRzdCwgc3JjLCBsZW4gKiBzaXplb2YoaGRhX25pZF90KSk7Ci0JcmV0dXJuIGxlbjsKKwlzdHJ1Y3Qgc25kX2FycmF5ICphcnJheSA9ICZjb2RlYy0+Y29ubl9saXN0czsKKwloZGFfbmlkX3QgKnA7CisJaW50IGksIG9sZF91c2VkOworCisJcCA9IGxvb2t1cF9jb25uX2xpc3QoYXJyYXksIG5pZCk7CisJaWYgKHApCisJCSpwID0gLTE7IC8qIGludmFsaWRhdGUgdGhlIG9sZCBlbnRyeSAqLworCisJb2xkX3VzZWQgPSBhcnJheS0+dXNlZDsKKwlpZiAoIWFkZF9jb25uX2xpc3QoYXJyYXksIG5pZCkgfHwgIWFkZF9jb25uX2xpc3QoYXJyYXksIGxlbikpCisJCWdvdG8gZXJyb3JfYWRkOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJaWYgKCFhZGRfY29ubl9saXN0KGFycmF5LCBsaXN0W2ldKSkKKwkJCWdvdG8gZXJyb3JfYWRkOworCXJldHVybiAwOworCisgZXJyb3JfYWRkOgorCWFycmF5LT51c2VkID0gb2xkX3VzZWQ7CisJcmV0dXJuIC1FTk9NRU07CiB9CitFWFBPUlRfU1lNQk9MX0hEQShzbmRfaGRhX292ZXJyaWRlX2Nvbm5fbGlzdCk7CisKKy8qKgorICogc25kX2hkYV9nZXRfY29ubl9pbmRleCAtIGdldCB0aGUgY29ubmVjdGlvbiBpbmRleCBvZiB0aGUgZ2l2ZW4gTklECisgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKKyAqIEBtdXg6IE5JRCBjb250YWluaW5nIHRoZSBsaXN0CisgKiBAbmlkOiBOSUQgdG8gc2VsZWN0CisgKiBAcmVjdXJzaXZlOiAxIHdoZW4gc2VhcmNoaW5nIE5JRCByZWN1cnNpdmVseSwgb3RoZXJ3aXNlIDAKKyAqCisgKiBQYXJzZXMgdGhlIGNvbm5lY3Rpb24gbGlzdCBvZiB0aGUgd2lkZ2V0IEBtdXggYW5kIGNoZWNrcyB3aGV0aGVyIHRoZQorICogd2lkZ2V0IEBuaWQgaXMgcHJlc2VudC4gIElmIGl0IGlzLCByZXR1cm4gdGhlIGNvbm5lY3Rpb24gaW5kZXguCisgKiBPdGhlcndpc2UgaXQgcmV0dXJucyAtMS4KKyAqLworaW50IHNuZF9oZGFfZ2V0X2Nvbm5faW5kZXgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBtdXgsCisJCQkgICBoZGFfbmlkX3QgbmlkLCBpbnQgcmVjdXJzaXZlKQoreworCWhkYV9uaWRfdCBjb25uW0hEQV9NQVhfTlVNX0lOUFVUU107CisJaW50IGksIG51bXM7CisKKwludW1zID0gc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsIG11eCwgY29ubiwgQVJSQVlfU0laRShjb25uKSk7CisJZm9yIChpID0gMDsgaSA8IG51bXM7IGkrKykKKwkJaWYgKGNvbm5baV0gPT0gbmlkKQorCQkJcmV0dXJuIGk7CisJaWYgKCFyZWN1cnNpdmUpCisJCXJldHVybiAtMTsKKwlpZiAocmVjdXJzaXZlID4gNSkgeworCQlzbmRfcHJpbnRkKCJoZGFfY29kZWM6IHRvbyBkZWVwIGNvbm5lY3Rpb24gZm9yIDB4JXhcbiIsIG5pZCk7CisJCXJldHVybiAtMTsKKwl9CisJcmVjdXJzaXZlKys7CisJZm9yIChpID0gMDsgaSA8IG51bXM7IGkrKykKKwkJaWYgKHNuZF9oZGFfZ2V0X2Nvbm5faW5kZXgoY29kZWMsIGNvbm5baV0sIG5pZCwgcmVjdXJzaXZlKSA+PSAwKQorCQkJcmV0dXJuIGk7CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9nZXRfY29ubl9pbmRleCk7CiAKIC8qKgogICogc25kX2hkYV9xdWV1ZV91bnNvbF9ldmVudCAtIGFkZCBhbiB1bnNvbGljaXRlZCBldmVudCB0byBxdWV1ZQpAQCAtMTA4Myw2ICsxMTg0LDcgQEAKIAlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPm1peGVycyk7CiAJc25kX2FycmF5X2ZyZWUoJmNvZGVjLT5uaWRzKTsKIAlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPmNvbm5fbGlzdHMpOworCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+c3BkaWZfb3V0KTsKIAljb2RlYy0+YnVzLT5jYWRkcl90YmxbY29kZWMtPmFkZHJdID0gTlVMTDsKIAlpZiAoY29kZWMtPnBhdGNoX29wcy5mcmVlKQogCQljb2RlYy0+cGF0Y2hfb3BzLmZyZWUoY29kZWMpOwpAQCAtMTE0NCw2ICsxMjQ2LDcgQEAKIAlzbmRfYXJyYXlfaW5pdCgmY29kZWMtPmRyaXZlcl9waW5zLCBzaXplb2Yoc3RydWN0IGhkYV9waW5jZmcpLCAxNik7CiAJc25kX2FycmF5X2luaXQoJmNvZGVjLT5jdnRfc2V0dXBzLCBzaXplb2Yoc3RydWN0IGhkYV9jdnRfc2V0dXApLCA4KTsKIAlzbmRfYXJyYXlfaW5pdCgmY29kZWMtPmNvbm5fbGlzdHMsIHNpemVvZihoZGFfbmlkX3QpLCA2NCk7CisJc25kX2FycmF5X2luaXQoJmNvZGVjLT5zcGRpZl9vdXQsIHNpemVvZihzdHJ1Y3QgaGRhX3NwZGlmX291dCksIDE2KTsKIAlpZiAoY29kZWMtPmJ1cy0+bW9kZWxuYW1lKSB7CiAJCWNvZGVjLT5tb2RlbG5hbWUgPSBrc3RyZHVwKGNvZGVjLT5idXMtPm1vZGVsbmFtZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghY29kZWMtPm1vZGVsbmFtZSkgewpAQCAtMjU1NSwxMSArMjY1OCwxMyBAQAogCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGlkeCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXN0cnVjdCBoZGFfc3BkaWZfb3V0ICpzcGRpZiA9IHNuZF9hcnJheV9lbGVtKCZjb2RlYy0+c3BkaWZfb3V0LCBpZHgpOwogCi0JdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSBjb2RlYy0+c3BkaWZfc3RhdHVzICYgMHhmZjsKLQl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IChjb2RlYy0+c3BkaWZfc3RhdHVzID4+IDgpICYgMHhmZjsKLQl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9IChjb2RlYy0+c3BkaWZfc3RhdHVzID4+IDE2KSAmIDB4ZmY7Ci0JdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSAoY29kZWMtPnNwZGlmX3N0YXR1cyA+PiAyNCkgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gc3BkaWYtPnN0YXR1cyAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSAoc3BkaWYtPnN0YXR1cyA+PiA4KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPSAoc3BkaWYtPnN0YXR1cyA+PiAxNikgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gKHNwZGlmLT5zdGF0dXMgPj4gMjQpICYgMHhmZjsKIAogCXJldHVybiAwOwogfQpAQCAtMjY0NCwyMyArMjc0OSwyMyBAQAogCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCBpZHggPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3QgaGRhX3NwZGlmX291dCAqc3BkaWYgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPnNwZGlmX291dCwgaWR4KTsKKwloZGFfbmlkX3QgbmlkID0gc3BkaWYtPm5pZDsKIAl1bnNpZ25lZCBzaG9ydCB2YWw7CiAJaW50IGNoYW5nZTsKIAogCW11dGV4X2xvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7Ci0JY29kZWMtPnNwZGlmX3N0YXR1cyA9IHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdIHwKKwlzcGRpZi0+c3RhdHVzID0gdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gfAogCQkoKHVuc2lnbmVkIGludCl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA8PCA4KSB8CiAJCSgodW5zaWduZWQgaW50KXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdIDw8IDE2KSB8CiAJCSgodW5zaWduZWQgaW50KXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdIDw8IDI0KTsKLQl2YWwgPSBjb252ZXJ0X2Zyb21fc3BkaWZfc3RhdHVzKGNvZGVjLT5zcGRpZl9zdGF0dXMpOwotCXZhbCB8PSBjb2RlYy0+c3BkaWZfY3RscyAmIDE7Ci0JY2hhbmdlID0gY29kZWMtPnNwZGlmX2N0bHMgIT0gdmFsOwotCWNvZGVjLT5zcGRpZl9jdGxzID0gdmFsOwotCi0JaWYgKGNoYW5nZSkKKwl2YWwgPSBjb252ZXJ0X2Zyb21fc3BkaWZfc3RhdHVzKHNwZGlmLT5zdGF0dXMpOworCXZhbCB8PSBzcGRpZi0+Y3RscyAmIDE7CisJY2hhbmdlID0gc3BkaWYtPmN0bHMgIT0gdmFsOworCXNwZGlmLT5jdGxzID0gdmFsOworCWlmIChjaGFuZ2UgJiYgbmlkICE9ICh1MTYpLTEpCiAJCXNldF9kaWdfb3V0X2NvbnZlcnQoY29kZWMsIG5pZCwgdmFsICYgMHhmZiwgKHZhbCA+PiA4KSAmIDB4ZmYpOwotCiAJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOwogCXJldHVybiBjaGFuZ2U7CiB9CkBAIC0yNjcxLDMzICsyNzc2LDQyIEBACiAJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpZHggPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3QgaGRhX3NwZGlmX291dCAqc3BkaWYgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPnNwZGlmX291dCwgaWR4KTsKIAotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY29kZWMtPnNwZGlmX2N0bHMgJiBBQ19ESUcxX0VOQUJMRTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNwZGlmLT5jdGxzICYgQUNfRElHMV9FTkFCTEU7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc3BkaWZfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCQkgIGludCBkaWcxLCBpbnQgZGlnMikKK3sKKwlzZXRfZGlnX291dF9jb252ZXJ0KGNvZGVjLCBuaWQsIGRpZzEsIGRpZzIpOworCS8qIHVubXV0ZSBhbXAgc3dpdGNoIChpZiBhbnkpICovCisJaWYgKChnZXRfd2NhcHMoY29kZWMsIG5pZCkgJiBBQ19XQ0FQX09VVF9BTVApICYmCisJICAgIChkaWcxICYgQUNfRElHMV9FTkFCTEUpKQorCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIG5pZCwgSERBX09VVFBVVCwgMCwKKwkJCQkJICAgIEhEQV9BTVBfTVVURSwgMCk7Cit9CisKIHN0YXRpYyBpbnQgc25kX2hkYV9zcGRpZl9vdXRfc3dpdGNoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCBpZHggPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3QgaGRhX3NwZGlmX291dCAqc3BkaWYgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPnNwZGlmX291dCwgaWR4KTsKKwloZGFfbmlkX3QgbmlkID0gc3BkaWYtPm5pZDsKIAl1bnNpZ25lZCBzaG9ydCB2YWw7CiAJaW50IGNoYW5nZTsKIAogCW11dGV4X2xvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7Ci0JdmFsID0gY29kZWMtPnNwZGlmX2N0bHMgJiB+QUNfRElHMV9FTkFCTEU7CisJdmFsID0gc3BkaWYtPmN0bHMgJiB+QUNfRElHMV9FTkFCTEU7CiAJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQogCQl2YWwgfD0gQUNfRElHMV9FTkFCTEU7Ci0JY2hhbmdlID0gY29kZWMtPnNwZGlmX2N0bHMgIT0gdmFsOwotCWlmIChjaGFuZ2UpIHsKLQkJY29kZWMtPnNwZGlmX2N0bHMgPSB2YWw7Ci0JCXNldF9kaWdfb3V0X2NvbnZlcnQoY29kZWMsIG5pZCwgdmFsICYgMHhmZiwgLTEpOwotCQkvKiB1bm11dGUgYW1wIHN3aXRjaCAoaWYgYW55KSAqLwotCQlpZiAoKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmIEFDX1dDQVBfT1VUX0FNUCkgJiYKLQkJICAgICh2YWwgJiBBQ19ESUcxX0VOQUJMRSkpCi0JCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIG5pZCwgSERBX09VVFBVVCwgMCwKLQkJCQkJCSBIREFfQU1QX01VVEUsIDApOwotCX0KKwljaGFuZ2UgPSBzcGRpZi0+Y3RscyAhPSB2YWw7CisJc3BkaWYtPmN0bHMgPSB2YWw7CisJaWYgKGNoYW5nZSAmJiBuaWQgIT0gKHUxNiktMSkKKwkJc2V0X3NwZGlmX2N0bHMoY29kZWMsIG5pZCwgdmFsICYgMHhmZiwgLTEpOwogCW11dGV4X3VubG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKIAlyZXR1cm4gY2hhbmdlOwogfQpAQCAtMjc0NCwzNiArMjg1OCw3OSBAQAogICoKICAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KLWludCBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKK2ludCBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgIGhkYV9uaWRfdCBhc3NvY2lhdGVkX25pZCwKKwkJCQkgIGhkYV9uaWRfdCBjdnRfbmlkKQogewogCWludCBlcnI7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqZGlnX21peDsKIAlpbnQgaWR4OworCXN0cnVjdCBoZGFfc3BkaWZfb3V0ICpzcGRpZjsKIAogCWlkeCA9IGZpbmRfZW1wdHlfbWl4ZXJfY3RsX2lkeChjb2RlYywgIklFQzk1OCBQbGF5YmFjayBTd2l0Y2giKTsKIAlpZiAoaWR4IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogdG9vIG1hbnkgSUVDOTU4IG91dHB1dHNcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KKwlzcGRpZiA9IHNuZF9hcnJheV9uZXcoJmNvZGVjLT5zcGRpZl9vdXQpOwogCWZvciAoZGlnX21peCA9IGRpZ19taXhlczsgZGlnX21peC0+bmFtZTsgZGlnX21peCsrKSB7CiAJCWtjdGwgPSBzbmRfY3RsX25ldzEoZGlnX21peCwgY29kZWMpOwogCQlpZiAoIWtjdGwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJa2N0bC0+aWQuaW5kZXggPSBpZHg7Ci0JCWtjdGwtPnByaXZhdGVfdmFsdWUgPSBuaWQ7Ci0JCWVyciA9IHNuZF9oZGFfY3RsX2FkZChjb2RlYywgbmlkLCBrY3RsKTsKKwkJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9IGNvZGVjLT5zcGRpZl9vdXQudXNlZCAtIDE7CisJCWVyciA9IHNuZF9oZGFfY3RsX2FkZChjb2RlYywgYXNzb2NpYXRlZF9uaWQsIGtjdGwpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQotCWNvZGVjLT5zcGRpZl9jdGxzID0KLQkJc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCi0JCQkJICAgQUNfVkVSQl9HRVRfRElHSV9DT05WRVJUXzEsIDApOwotCWNvZGVjLT5zcGRpZl9zdGF0dXMgPSBjb252ZXJ0X3RvX3NwZGlmX3N0YXR1cyhjb2RlYy0+c3BkaWZfY3Rscyk7CisJc3BkaWYtPm5pZCA9IGN2dF9uaWQ7CisJc3BkaWYtPmN0bHMgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGN2dF9uaWQsIDAsCisJCQkJCSBBQ19WRVJCX0dFVF9ESUdJX0NPTlZFUlRfMSwgMCk7CisJc3BkaWYtPnN0YXR1cyA9IGNvbnZlcnRfdG9fc3BkaWZfc3RhdHVzKHNwZGlmLT5jdGxzKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfSERBKHNuZF9oZGFfY3JlYXRlX3NwZGlmX291dF9jdGxzKTsKIAorc3RydWN0IGhkYV9zcGRpZl9vdXQgKnNuZF9oZGFfc3BkaWZfb3V0X29mX25pZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgICAgIGhkYV9uaWRfdCBuaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGNvZGVjLT5zcGRpZl9vdXQudXNlZDsgaSsrKSB7CisJCXN0cnVjdCBoZGFfc3BkaWZfb3V0ICpzcGRpZiA9CisJCQkJc25kX2FycmF5X2VsZW0oJmNvZGVjLT5zcGRpZl9vdXQsIGkpOworCQlpZiAoc3BkaWYtPm5pZCA9PSBuaWQpCisJCQlyZXR1cm4gc3BkaWY7CisJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9zcGRpZl9vdXRfb2ZfbmlkKTsKKwordm9pZCBzbmRfaGRhX3NwZGlmX2N0bHNfdW5hc3NpZ24oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBpZHgpCit7CisJc3RydWN0IGhkYV9zcGRpZl9vdXQgKnNwZGlmID0gc25kX2FycmF5X2VsZW0oJmNvZGVjLT5zcGRpZl9vdXQsIGlkeCk7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCXNwZGlmLT5uaWQgPSAodTE2KS0xOworCW11dGV4X3VubG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfSERBKHNuZF9oZGFfc3BkaWZfY3Rsc191bmFzc2lnbik7CisKK3ZvaWQgc25kX2hkYV9zcGRpZl9jdGxzX2Fzc2lnbihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IGlkeCwgaGRhX25pZF90IG5pZCkKK3sKKwlzdHJ1Y3QgaGRhX3NwZGlmX291dCAqc3BkaWYgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPnNwZGlmX291dCwgaWR4KTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCWlmIChzcGRpZi0+bmlkICE9IG5pZCkgeworCQlzcGRpZi0+bmlkID0gbmlkOworCQl2YWwgPSBzcGRpZi0+Y3RsczsKKwkJc2V0X3NwZGlmX2N0bHMoY29kZWMsIG5pZCwgdmFsICYgMHhmZiwgKHZhbCA+PiA4KSAmIDB4ZmYpOworCX0KKwltdXRleF91bmxvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0hEQShzbmRfaGRhX3NwZGlmX2N0bHNfYXNzaWduKTsKKwogLyoKICAqIFNQRElGIHNoYXJpbmcgd2l0aCBhbmFsb2cgb3V0cHV0CiAgKi8KQEAgLTMzNTYsNyArMzUxMyw3IEBACiAgKgogICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KLXN0YXRpYyBpbnQgc25kX2hkYV9xdWVyeV9zdXBwb3J0ZWRfcGNtKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAoraW50IHNuZF9oZGFfcXVlcnlfc3VwcG9ydGVkX3BjbShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKIAkJCQl1MzIgKnJhdGVzcCwgdTY0ICpmb3JtYXRzcCwgdW5zaWduZWQgaW50ICpicHNwKQogewogCXVuc2lnbmVkIGludCBpLCB2YWwsIHdjYXBzOwpAQCAtMzQ0OCw2ICszNjA1LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9xdWVyeV9zdXBwb3J0ZWRfcGNtKTsKIAogLyoqCiAgKiBzbmRfaGRhX2lzX3N1cHBvcnRlZF9mb3JtYXQgLSBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGZvcm1hdApAQCAtNDE3NywxMCArNDMzNSwxMiBAQAogc3RhdGljIHZvaWQgc2V0dXBfZGlnX291dF9zdHJlYW0oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCiAJCQkJIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLCB1bnNpZ25lZCBpbnQgZm9ybWF0KQogeworCXN0cnVjdCBoZGFfc3BkaWZfb3V0ICpzcGRpZiA9IHNuZF9oZGFfc3BkaWZfb3V0X29mX25pZChjb2RlYywgbmlkKTsKKwogCS8qIHR1cm4gb2ZmIFNQRElGIG9uY2U7IG90aGVyd2lzZSB0aGUgSUVDOTU4IGJpdHMgd29uJ3QgYmUgdXBkYXRlZCAqLwotCWlmIChjb2RlYy0+c3BkaWZfc3RhdHVzX3Jlc2V0ICYmIChjb2RlYy0+c3BkaWZfY3RscyAmIEFDX0RJRzFfRU5BQkxFKSkKKwlpZiAoY29kZWMtPnNwZGlmX3N0YXR1c19yZXNldCAmJiAoc3BkaWYtPmN0bHMgJiBBQ19ESUcxX0VOQUJMRSkpCiAJCXNldF9kaWdfb3V0X2NvbnZlcnQoY29kZWMsIG5pZCwKLQkJCQkgICAgY29kZWMtPnNwZGlmX2N0bHMgJiB+QUNfRElHMV9FTkFCTEUgJiAweGZmLAorCQkJCSAgICBzcGRpZi0+Y3RscyAmIH5BQ19ESUcxX0VOQUJMRSAmIDB4ZmYsCiAJCQkJICAgIC0xKTsKIAlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkLCBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOwogCWlmIChjb2RlYy0+c2xhdmVfZGlnX291dHMpIHsKQEAgLTQxOTAsOSArNDM1MCw5IEBACiAJCQkJCQkgICBmb3JtYXQpOwogCX0KIAkvKiB0dXJuIG9uIGFnYWluIChpZiBuZWVkZWQpICovCi0JaWYgKGNvZGVjLT5zcGRpZl9zdGF0dXNfcmVzZXQgJiYgKGNvZGVjLT5zcGRpZl9jdGxzICYgQUNfRElHMV9FTkFCTEUpKQorCWlmIChjb2RlYy0+c3BkaWZfc3RhdHVzX3Jlc2V0ICYmIChzcGRpZi0+Y3RscyAmIEFDX0RJRzFfRU5BQkxFKSkKIAkJc2V0X2RpZ19vdXRfY29udmVydChjb2RlYywgbmlkLAotCQkJCSAgICBjb2RlYy0+c3BkaWZfY3RscyAmIDB4ZmYsIC0xKTsKKwkJCQkgICAgc3BkaWYtPmN0bHMgJiAweGZmLCAtMSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFudXBfZGlnX291dF9zdHJlYW0oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCkBAIC00MzQ4LDYgKzQ1MDgsOCBAQAogewogCWNvbnN0IGhkYV9uaWRfdCAqbmlkcyA9IG1vdXQtPmRhY19uaWRzOwogCWludCBjaHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCXN0cnVjdCBoZGFfc3BkaWZfb3V0ICpzcGRpZiA9CisJCQlzbmRfaGRhX3NwZGlmX291dF9vZl9uaWQoY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkKTsKIAlpbnQgaTsKIAogCW11dGV4X2xvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7CkBAIC00MzU2LDcgKzQ1MTgsNyBAQAogCQlpZiAoY2hzID09IDIgJiYKIAkJICAgIHNuZF9oZGFfaXNfc3VwcG9ydGVkX2Zvcm1hdChjb2RlYywgbW91dC0+ZGlnX291dF9uaWQsCiAJCQkJCQlmb3JtYXQpICYmCi0JCSAgICAhKGNvZGVjLT5zcGRpZl9zdGF0dXMgJiBJRUM5NThfQUVTMF9OT05BVURJTykpIHsKKwkJICAgICEoc3BkaWYtPnN0YXR1cyAmIElFQzk1OF9BRVMwX05PTkFVRElPKSkgewogCQkJbW91dC0+ZGlnX291dF91c2VkID0gSERBX0RJR19BTkFMT0dfRFVQOwogCQkJc2V0dXBfZGlnX291dF9zdHJlYW0oY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLAogCQkJCQkgICAgIHN0cmVhbV90YWcsIGZvcm1hdCk7CkBAIC00NTI4LDcgKzQ2OTAsNyBAQAogCQl1bnNpZ25lZCBpbnQgd2lkX2NhcHMgPSBnZXRfd2NhcHMoY29kZWMsIG5pZCk7CiAJCXVuc2lnbmVkIGludCB3aWRfdHlwZSA9IGdldF93Y2Fwc190eXBlKHdpZF9jYXBzKTsKIAkJdW5zaWduZWQgaW50IGRlZl9jb25mOwotCQlzaG9ydCBhc3NvYywgbG9jOworCQlzaG9ydCBhc3NvYywgbG9jLCBjb25uLCBkZXY7CiAKIAkJLyogcmVhZCBhbGwgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBwaW4gY29tcGxleCAqLwogCQlpZiAod2lkX3R5cGUgIT0gQUNfV0lEX1BJTikKQEAgLTQ1MzgsMTAgKzQ3MDAsMTkgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWRlZl9jb25mID0gc25kX2hkYV9jb2RlY19nZXRfcGluY2ZnKGNvZGVjLCBuaWQpOwotCQlpZiAoZ2V0X2RlZmNmZ19jb25uZWN0KGRlZl9jb25mKSA9PSBBQ19KQUNLX1BPUlRfTk9ORSkKKwkJY29ubiA9IGdldF9kZWZjZmdfY29ubmVjdChkZWZfY29uZik7CisJCWlmIChjb25uID09IEFDX0pBQ0tfUE9SVF9OT05FKQogCQkJY29udGludWU7CiAJCWxvYyA9IGdldF9kZWZjZmdfbG9jYXRpb24oZGVmX2NvbmYpOwotCQlzd2l0Y2ggKGdldF9kZWZjZmdfZGV2aWNlKGRlZl9jb25mKSkgeworCQlkZXYgPSBnZXRfZGVmY2ZnX2RldmljZShkZWZfY29uZik7CisKKwkJLyogd29ya2Fyb3VuZCBmb3IgYnVnZ3kgQklPUyBzZXR1cHMgKi8KKwkJaWYgKGRldiA9PSBBQ19KQUNLX0xJTkVfT1VUKSB7CisJCQlpZiAoY29ubiA9PSBBQ19KQUNLX1BPUlRfRklYRUQpCisJCQkJZGV2ID0gQUNfSkFDS19TUEVBS0VSOworCQl9CisKKwkJc3dpdGNoIChkZXYpIHsKIAkJY2FzZSBBQ19KQUNLX0xJTkVfT1VUOgogCQkJc2VxID0gZ2V0X2RlZmNmZ19zZXF1ZW5jZShkZWZfY29uZik7CiAJCQlhc3NvYyA9IGdldF9kZWZjZmdfYXNzb2NpYXRpb24oZGVmX2NvbmYpOwpAQCAtNDk1NywxNyArNTEyOCwxNSBAQAogewogCWlmIChhcnJheS0+dXNlZCA+PSBhcnJheS0+YWxsb2NlZCkgewogCQlpbnQgbnVtID0gYXJyYXktPmFsbG9jZWQgKyBhcnJheS0+YWxsb2NfYWxpZ247CisJCWludCBzaXplID0gKG51bSArIDEpICogYXJyYXktPmVsZW1fc2l6ZTsKKwkJaW50IG9sZHNpemUgPSBhcnJheS0+YWxsb2NlZCAqIGFycmF5LT5lbGVtX3NpemU7CiAJCXZvaWQgKm5saXN0OwogCQlpZiAoc25kX0JVR19PTihudW0gPj0gNDA5NikpCiAJCQlyZXR1cm4gTlVMTDsKLQkJbmxpc3QgPSBrY2FsbG9jKG51bSArIDEsIGFycmF5LT5lbGVtX3NpemUsIEdGUF9LRVJORUwpOworCQlubGlzdCA9IGtyZWFsbG9jKGFycmF5LT5saXN0LCBzaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFubGlzdCkKIAkJCXJldHVybiBOVUxMOwotCQlpZiAoYXJyYXktPmxpc3QpIHsKLQkJCW1lbWNweShubGlzdCwgYXJyYXktPmxpc3QsCi0JCQkgICAgICAgYXJyYXktPmVsZW1fc2l6ZSAqIGFycmF5LT5hbGxvY2VkKTsKLQkJCWtmcmVlKGFycmF5LT5saXN0KTsKLQkJfQorCQltZW1zZXQobmxpc3QgKyBvbGRzaXplLCAwLCBzaXplIC0gb2xkc2l6ZSk7CiAJCWFycmF5LT5saXN0ID0gbmxpc3Q7CiAJCWFycmF5LT5hbGxvY2VkID0gbnVtOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCmluZGV4IDU5Yzk3MzAuLmY0NjVlMDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaApAQCAtODI5LDggKzgyOSw3IEBACiAKIAlzdHJ1Y3QgbXV0ZXggc3BkaWZfbXV0ZXg7CiAJc3RydWN0IG11dGV4IGNvbnRyb2xfbXV0ZXg7Ci0JdW5zaWduZWQgaW50IHNwZGlmX3N0YXR1czsJLyogSUVDOTU4IHN0YXR1cyBiaXRzICovCi0JdW5zaWduZWQgc2hvcnQgc3BkaWZfY3RsczsJLyogU1BESUYgY29udHJvbCBiaXRzICovCisJc3RydWN0IHNuZF9hcnJheSBzcGRpZl9vdXQ7CiAJdW5zaWduZWQgaW50IHNwZGlmX2luX2VuYWJsZTsJLyogU1BESUYgaW5wdXQgZW5hYmxlPyAqLwogCWNvbnN0IGhkYV9uaWRfdCAqc2xhdmVfZGlnX291dHM7IC8qIG9wdGlvbmFsIGRpZ2l0YWwgb3V0IHNsYXZlIHdpZGdldHMgKi8KIAlzdHJ1Y3Qgc25kX2FycmF5IGluaXRfcGluczsJLyogaW5pdGlhbCAoQklPUykgcGluIGNvbmZpZ3VyYXRpb25zICovCkBAIC05MDQsNiArOTAzLDE2IEBACiAJCQkgIGhkYV9uaWRfdCAqc3RhcnRfaWQpOwogaW50IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAogCQkJICAgIGhkYV9uaWRfdCAqY29ubl9saXN0LCBpbnQgbWF4X2Nvbm5zKTsKK2ludCBzbmRfaGRhX2dldF9yYXdfY29ubmVjdGlvbnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgICAgaGRhX25pZF90ICpjb25uX2xpc3QsIGludCBtYXhfY29ubnMpOworaW50IHNuZF9oZGFfZ2V0X2Nvbm5fbGlzdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCSAgY29uc3QgaGRhX25pZF90ICoqbGlzdHApOworaW50IHNuZF9oZGFfb3ZlcnJpZGVfY29ubl9saXN0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBpbnQgbnVtcywKKwkJCSAgY29uc3QgaGRhX25pZF90ICpsaXN0KTsKK2ludCBzbmRfaGRhX2dldF9jb25uX2luZGV4KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbXV4LAorCQkJICAgaGRhX25pZF90IG5pZCwgaW50IHJlY3Vyc2l2ZSk7CitpbnQgc25kX2hkYV9xdWVyeV9zdXBwb3J0ZWRfcGNtKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJCXUzMiAqcmF0ZXNwLCB1NjQgKmZvcm1hdHNwLCB1bnNpZ25lZCBpbnQgKmJwc3ApOwogCiBzdHJ1Y3QgaGRhX3ZlcmIgewogCWhkYV9uaWRfdCBuaWQ7CkBAIC05NDcsNiArOTU2LDE3IEBACiAJCSAgICAgICBoZGFfbmlkX3QgbmlkLCB1bnNpZ25lZCBpbnQgY2ZnKTsgLyogZm9yIGh3ZGVwICovCiB2b2lkIHNuZF9oZGFfc2h1dHVwX3BpbnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogCisvKiBTUERJRiBjb250cm9scyAqLworc3RydWN0IGhkYV9zcGRpZl9vdXQgeworCWhkYV9uaWRfdCBuaWQ7CQkvKiBDb252ZXJ0ZXIgbmlkIHZhbHVlcyByZWxhdGUgdG8gKi8KKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwkvKiBJRUM5NTggc3RhdHVzIGJpdHMgKi8KKwl1bnNpZ25lZCBzaG9ydCBjdGxzOwkvKiBTUERJRiBjb250cm9sIGJpdHMgKi8KK307CitzdHJ1Y3QgaGRhX3NwZGlmX291dCAqc25kX2hkYV9zcGRpZl9vdXRfb2ZfbmlkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICAgICAgaGRhX25pZF90IG5pZCk7Cit2b2lkIHNuZF9oZGFfc3BkaWZfY3Rsc191bmFzc2lnbihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IGlkeCk7Cit2b2lkIHNuZF9oZGFfc3BkaWZfY3Rsc19hc3NpZ24oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBpZHgsIGhkYV9uaWRfdCBuaWQpOworCiAvKgogICogTWl4ZXIKICAqLwpAQCAtOTk3LDE3ICsxMDE3LDE1IEBACiBpbnQgc25kX2hkYV9yZXN1bWUoc3RydWN0IGhkYV9idXMgKmJ1cyk7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKIHN0YXRpYyBpbmxpbmUKIGludCBoZGFfY2FsbF9jaGVja19wb3dlcl9zdGF0dXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCiB7CisjaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQogCWlmIChjb2RlYy0+cGF0Y2hfb3BzLmNoZWNrX3Bvd2VyX3N0YXR1cykKIAkJcmV0dXJuIGNvZGVjLT5wYXRjaF9vcHMuY2hlY2tfcG93ZXJfc3RhdHVzKGNvZGVjLCBuaWQpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci0jZWxzZQkKLSNkZWZpbmUgaGRhX2NhbGxfY2hlY2tfcG93ZXJfc3RhdHVzKGNvZGVjLCBuaWQpCQkwCi0jZW5kaWYKIAogLyoKICAqIGdldCB3aWRnZXQgaW5mb3JtYXRpb24KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jIGIvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKaW5kZXggYjA1ZjdiZS4uMjhjZTE3ZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKQEAgLTI5NCw3ICsyOTQsNyBAQAogCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSERNSTogb3V0IG9mIHJhbmdlIE1OTCAlZFxuIiwgbW5sKTsKIAkJZ290byBvdXRfZmFpbDsKIAl9IGVsc2UKLQkJc3RybGNweShlLT5tb25pdG9yX25hbWUsIGJ1ZiArIEVMRF9GSVhFRF9CWVRFUywgbW5sKTsKKwkJc3RybGNweShlLT5tb25pdG9yX25hbWUsIGJ1ZiArIEVMRF9GSVhFRF9CWVRFUywgbW5sICsgMSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZS0+c2FkX2NvdW50OyBpKyspIHsKIAkJaWYgKEVMRF9GSVhFRF9CWVRFUyArIG1ubCArIDMgKiAoaSArIDEpID4gc2l6ZSkgewpAQCAtNTgwLDQzICs1ODAsNDUgQEAKICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCiAvKiB1cGRhdGUgUENNIGluZm8gYmFzZWQgb24gRUxEICovCi12b2lkIGhkbWlfZWxkX3VwZGF0ZV9wY21faW5mbyhzdHJ1Y3QgaGRtaV9lbGQgKmVsZCwgc3RydWN0IGhkYV9wY21fc3RyZWFtICpwY20sCi0JCQkgICAgICBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmNvZGVjX3BhcnMpCit2b2lkIHNuZF9oZG1pX2VsZF91cGRhdGVfcGNtX2luZm8oc3RydWN0IGhkbWlfZWxkICplbGQsCisJCQkgICAgICBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvKQogeworCXUzMiByYXRlczsKKwl1NjQgZm9ybWF0czsKKwl1bnNpZ25lZCBpbnQgbWF4YnBzOworCXVuc2lnbmVkIGludCBjaGFubmVsc19tYXg7CiAJaW50IGk7CiAKIAkvKiBhc3N1bWUgYmFzaWMgYXVkaW8gc3VwcG9ydCAodGhlIGJhc2ljIGF1ZGlvIGZsYWcgaXMgbm90IGluIEVMRDsKIAkgKiBob3dldmVyLCBhbGwgYXVkaW8gY2FwYWJsZSBzaW5rcyBhcmUgcmVxdWlyZWQgdG8gc3VwcG9ydCBiYXNpYwogCSAqIGF1ZGlvKSAqLwotCXBjbS0+cmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDA7Ci0JcGNtLT5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEU7Ci0JcGNtLT5tYXhicHMgPSAxNjsKLQlwY20tPmNoYW5uZWxzX21heCA9IDI7CisJcmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKKwkJU05EUlZfUENNX1JBVEVfNDgwMDA7CisJZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFOworCW1heGJwcyA9IDE2OworCWNoYW5uZWxzX21heCA9IDI7CiAJZm9yIChpID0gMDsgaSA8IGVsZC0+c2FkX2NvdW50OyBpKyspIHsKIAkJc3RydWN0IGNlYV9zYWQgKmEgPSAmZWxkLT5zYWRbaV07Ci0JCXBjbS0+cmF0ZXMgfD0gYS0+cmF0ZXM7Ci0JCWlmIChhLT5jaGFubmVscyA+IHBjbS0+Y2hhbm5lbHNfbWF4KQotCQkJcGNtLT5jaGFubmVsc19tYXggPSBhLT5jaGFubmVsczsKKwkJcmF0ZXMgfD0gYS0+cmF0ZXM7CisJCWlmIChhLT5jaGFubmVscyA+IGNoYW5uZWxzX21heCkKKwkJCWNoYW5uZWxzX21heCA9IGEtPmNoYW5uZWxzOwogCQlpZiAoYS0+Zm9ybWF0ID09IEFVRElPX0NPRElOR19UWVBFX0xQQ00pIHsKIAkJCWlmIChhLT5zYW1wbGVfYml0cyAmIEFDX1NVUFBDTV9CSVRTXzIwKSB7Ci0JCQkJcGNtLT5mb3JtYXRzIHw9IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFOwotCQkJCWlmIChwY20tPm1heGJwcyA8IDIwKQotCQkJCQlwY20tPm1heGJwcyA9IDIwOworCQkJCWZvcm1hdHMgfD0gU05EUlZfUENNX0ZNVEJJVF9TMzJfTEU7CisJCQkJaWYgKG1heGJwcyA8IDIwKQorCQkJCQltYXhicHMgPSAyMDsKIAkJCX0KIAkJCWlmIChhLT5zYW1wbGVfYml0cyAmIEFDX1NVUFBDTV9CSVRTXzI0KSB7Ci0JCQkJcGNtLT5mb3JtYXRzIHw9IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFOwotCQkJCWlmIChwY20tPm1heGJwcyA8IDI0KQotCQkJCQlwY20tPm1heGJwcyA9IDI0OworCQkJCWZvcm1hdHMgfD0gU05EUlZfUENNX0ZNVEJJVF9TMzJfTEU7CisJCQkJaWYgKG1heGJwcyA8IDI0KQorCQkJCQltYXhicHMgPSAyNDsKIAkJCX0KIAkJfQogCX0KIAotCWlmICghY29kZWNfcGFycykKLQkJcmV0dXJuOwotCiAJLyogcmVzdHJpY3QgdGhlIHBhcmFtZXRlcnMgYnkgdGhlIHZhbHVlcyB0aGUgY29kZWMgcHJvdmlkZXMgKi8KLQlwY20tPnJhdGVzICY9IGNvZGVjX3BhcnMtPnJhdGVzOwotCXBjbS0+Zm9ybWF0cyAmPSBjb2RlY19wYXJzLT5mb3JtYXRzOwotCXBjbS0+Y2hhbm5lbHNfbWF4ID0gbWluKHBjbS0+Y2hhbm5lbHNfbWF4LCBjb2RlY19wYXJzLT5jaGFubmVsc19tYXgpOwotCXBjbS0+bWF4YnBzID0gbWluKHBjbS0+bWF4YnBzLCBjb2RlY19wYXJzLT5tYXhicHMpOworCWhpbmZvLT5yYXRlcyAmPSByYXRlczsKKwloaW5mby0+Zm9ybWF0cyAmPSBmb3JtYXRzOworCWhpbmZvLT5tYXhicHMgPSBtaW4oaGluZm8tPm1heGJwcywgbWF4YnBzKTsKKwloaW5mby0+Y2hhbm5lbHNfbWF4ID0gbWluKGhpbmZvLT5jaGFubmVsc19tYXgsIGNoYW5uZWxzX21heCk7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwppbmRleCA0ODZmNmRlLi5iZTY5ODIyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKQEAgLTE3Nyw3ICsxNzcsOCBAQAogI2RlZmluZSBJQ0g2X1JFR19JTlRDVEwJCQkweDIwCiAjZGVmaW5lIElDSDZfUkVHX0lOVFNUUwkJCTB4MjQKICNkZWZpbmUgSUNINl9SRUdfV0FMTENMSwkJMHgzMAkvKiAyNE1oeiBzb3VyY2UgKi8KLSNkZWZpbmUgSUNINl9SRUdfU1lOQwkJCTB4MzQJCisjZGVmaW5lIElDSDZfUkVHX09MRF9TU1lOQwkJMHgzNAkvKiBTU1lOQyBmb3Igb2xkIElDSCAqLworI2RlZmluZSBJQ0g2X1JFR19TU1lOQwkJCTB4MzgKICNkZWZpbmUgSUNINl9SRUdfQ09SQkxCQVNFCQkweDQwCiAjZGVmaW5lIElDSDZfUkVHX0NPUkJVQkFTRQkJMHg0NAogI2RlZmluZSBJQ0g2X1JFR19DT1JCV1AJCQkweDQ4CkBAIC00NzksNiArNDgwLDcgQEAKICNkZWZpbmUgQVpYX0RDQVBTX1BPU0ZJWF9WSUEJKDEgPDwgMTcpCS8qIFVzZSBWSUFDT01CTyBhcyBkZWZhdWx0ICovCiAjZGVmaW5lIEFaWF9EQ0FQU19OT182NEJJVAkoMSA8PCAxOCkJLyogTm8gNjRiaXQgYWRkcmVzcyAqLwogI2RlZmluZSBBWlhfRENBUFNfU1lOQ19XUklURQkoMSA8PCAxOSkJLyogc3luYyBlYWNoIGNtZCB3cml0ZSAqLworI2RlZmluZSBBWlhfRENBUFNfT0xEX1NTWU5DCSgxIDw8IDIwKQkvKiBPbGQgU1NZTkMgcmVnIGZvciBJQ0ggKi8KIAogLyogcXVpcmtzIGZvciBBVEkgU0IgLyBBTUQgSHVkc29uICovCiAjZGVmaW5lIEFaWF9EQ0FQU19QUkVTRVRfQVRJX1NCIFwKQEAgLTE3MDYsMTMgKzE3MDgsMTYgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXVuc2lnbmVkIGludCBidWZzaXplLCBwZXJpb2RfYnl0ZXMsIGZvcm1hdF92YWwsIHN0cmVhbV90YWc7CiAJaW50IGVycjsKKwlzdHJ1Y3QgaGRhX3NwZGlmX291dCAqc3BkaWYgPQorCQlzbmRfaGRhX3NwZGlmX291dF9vZl9uaWQoYXBjbS0+Y29kZWMsIGhpbmZvLT5uaWQpOworCXVuc2lnbmVkIHNob3J0IGN0bHMgPSBzcGRpZiA/IHNwZGlmLT5jdGxzIDogMDsKIAogCWF6eF9zdHJlYW1fcmVzZXQoY2hpcCwgYXp4X2Rldik7CiAJZm9ybWF0X3ZhbCA9IHNuZF9oZGFfY2FsY19zdHJlYW1fZm9ybWF0KHJ1bnRpbWUtPnJhdGUsCiAJCQkJCQlydW50aW1lLT5jaGFubmVscywKIAkJCQkJCXJ1bnRpbWUtPmZvcm1hdCwKIAkJCQkJCWhpbmZvLT5tYXhicHMsCi0JCQkJCQlhcGNtLT5jb2RlYy0+c3BkaWZfY3Rscyk7CisJCQkJCQljdGxzKTsKIAlpZiAoIWZvcm1hdF92YWwpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlgKIAkJCSAgICJpbnZhbGlkIGZvcm1hdF92YWwsIHJhdGU9JWQsIGNoPSVkLCBmb3JtYXQ9JWRcbiIsCkBAIC0xNzkyLDcgKzE3OTcsMTEgQEAKIAlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAlpZiAobnN5bmMgPiAxKSB7CiAJCS8qIGZpcnN0LCBzZXQgU1lOQyBiaXRzIG9mIGNvcnJlc3BvbmRpbmcgc3RyZWFtcyAqLwotCQlhenhfd3JpdGVsKGNoaXAsIFNZTkMsIGF6eF9yZWFkbChjaGlwLCBTWU5DKSB8IHNiaXRzKTsKKwkJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX09MRF9TU1lOQykKKwkJCWF6eF93cml0ZWwoY2hpcCwgT0xEX1NTWU5DLAorCQkJCSAgIGF6eF9yZWFkbChjaGlwLCBPTERfU1NZTkMpIHwgc2JpdHMpOworCQllbHNlCisJCQlhenhfd3JpdGVsKGNoaXAsIFNTWU5DLCBhenhfcmVhZGwoY2hpcCwgU1NZTkMpIHwgc2JpdHMpOwogCX0KIAlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQlpZiAocy0+cGNtLT5jYXJkICE9IHN1YnN0cmVhbS0+cGNtLT5jYXJkKQpAQCAtMTg0OCw3ICsxODU3LDExIEBACiAJaWYgKG5zeW5jID4gMSkgewogCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAkJLyogcmVzZXQgU1lOQyBiaXRzICovCi0JCWF6eF93cml0ZWwoY2hpcCwgU1lOQywgYXp4X3JlYWRsKGNoaXAsIFNZTkMpICYgfnNiaXRzKTsKKwkJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX09MRF9TU1lOQykKKwkJCWF6eF93cml0ZWwoY2hpcCwgT0xEX1NTWU5DLAorCQkJCSAgIGF6eF9yZWFkbChjaGlwLCBPTERfU1NZTkMpICYgfnNiaXRzKTsKKwkJZWxzZQorCQkJYXp4X3dyaXRlbChjaGlwLCBTU1lOQywgYXp4X3JlYWRsKGNoaXAsIFNTWU5DKSAmIH5zYml0cyk7CiAJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJfQogCXJldHVybiAwOwpAQCAtMTg2Myw3ICsxODc2LDcgQEAKIAl1bnNpZ25lZCBpbnQgZmlmb19zaXplOwogCiAJbGlua19wb3MgPSBhenhfc2RfcmVhZGwoYXp4X2RldiwgU0RfTFBJQik7Ci0JaWYgKGF6eF9kZXYtPmluZGV4ID49IDQpIHsKKwlpZiAoYXp4X2Rldi0+c3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewogCQkvKiBQbGF5YmFjaywgbm8gcHJvYmxlbSB1c2luZyBsaW5rIHBvc2l0aW9uICovCiAJCXJldHVybiBsaW5rX3BvczsKIAl9CkBAIC0xOTI3LDYgKzE5NDAsMTcgQEAKIAlkZWZhdWx0OgogCQkvKiB1c2UgdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLwogCQlwb3MgPSBsZTMyX3RvX2NwdSgqYXp4X2Rldi0+cG9zYnVmKTsKKwkJaWYgKGNoaXAtPnBvc2l0aW9uX2ZpeFtzdHJlYW1dID09IFBPU19GSVhfQVVUTykgeworCQkJaWYgKCFwb3MgfHwgcG9zID09ICh1MzIpLTEpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJoZGEtaW50ZWw6IEludmFsaWQgcG9zaXRpb24gYnVmZmVyLCAiCisJCQkJICAgICAgICJ1c2luZyBMUElCIHJlYWQgbWV0aG9kIGluc3RlYWQuXG4iKTsKKwkJCQljaGlwLT5wb3NpdGlvbl9maXhbc3RyZWFtXSA9IFBPU19GSVhfTFBJQjsKKwkJCQlwb3MgPSBhenhfc2RfcmVhZGwoYXp4X2RldiwgU0RfTFBJQik7CisJCQl9IGVsc2UKKwkJCQljaGlwLT5wb3NpdGlvbl9maXhbc3RyZWFtXSA9IFBPU19GSVhfUE9TQlVGOworCQl9CisJCWJyZWFrOwogCX0KIAogCWlmIChwb3MgPj0gYXp4X2Rldi0+YnVmc2l6ZSkKQEAgLTE5NjQsMTYgKzE5ODgsNiBAQAogCiAJc3RyZWFtID0gYXp4X2Rldi0+c3Vic3RyZWFtLT5zdHJlYW07CiAJcG9zID0gYXp4X2dldF9wb3NpdGlvbihjaGlwLCBhenhfZGV2KTsKLQlpZiAoY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPT0gUE9TX0ZJWF9BVVRPKSB7Ci0JCWlmICghcG9zKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgImhkYS1pbnRlbDogSW52YWxpZCBwb3NpdGlvbiBidWZmZXIsICIKLQkJCSAgICAgICAidXNpbmcgTFBJQiByZWFkIG1ldGhvZCBpbnN0ZWFkLlxuIik7Ci0JCQljaGlwLT5wb3NpdGlvbl9maXhbc3RyZWFtXSA9IFBPU19GSVhfTFBJQjsKLQkJCXBvcyA9IGF6eF9nZXRfcG9zaXRpb24oY2hpcCwgYXp4X2Rldik7Ci0JCX0gZWxzZQotCQkJY2hpcC0+cG9zaXRpb25fZml4W3N0cmVhbV0gPSBQT1NfRklYX1BPU0JVRjsKLQl9CiAKIAlpZiAoV0FSTl9PTkNFKCFhenhfZGV2LT5wZXJpb2RfYnl0ZXMsCiAJCSAgICAgICJoZGEtaW50ZWw6IHplcm8gYXp4X2Rldi0+cGVyaW9kX2J5dGVzIikpCkBAIC0yMDYxLDYgKzIwNzUsOCBAQAogCX0KIH0KIAorI2RlZmluZSBNQVhfUFJFQUxMT0NfU0laRQkoMzIgKiAxMDI0ICogMTAyNCkKKwogc3RhdGljIGludAogYXp4X2F0dGFjaF9wY21fc3RyZWFtKHN0cnVjdCBoZGFfYnVzICpidXMsIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkgICAgICBzdHJ1Y3QgaGRhX3BjbSAqY3BjbSkKQEAgLTIwNjksNiArMjA4NSw3IEBACiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAlzdHJ1Y3QgYXp4X3BjbSAqYXBjbTsKIAlpbnQgcGNtX2RldiA9IGNwY20tPmRldmljZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKIAlpbnQgcywgZXJyOwogCiAJaWYgKHBjbV9kZXYgPj0gSERBX01BWF9QQ01TKSB7CkBAIC0yMTA0LDkgKzIxMjEsMTIgQEAKIAkJCXNuZF9wY21fc2V0X29wcyhwY20sIHMsICZhenhfcGNtX29wcyk7CiAJfQogCS8qIGJ1ZmZlciBwcmUtYWxsb2NhdGlvbiAqLworCXNpemUgPSBDT05GSUdfU05EX0hEQV9QUkVBTExPQ19TSVpFICogMTAyNDsKKwlpZiAoc2l6ZSA+IE1BWF9QUkVBTExPQ19TSVpFKQorCQlzaXplID0gTUFYX1BSRUFMTE9DX1NJWkU7CiAJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFVl9TRywKIAkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAotCQkJCQkgICAgICAxMDI0ICogNjQsIDMyICogMTAyNCAqIDEwMjQpOworCQkJCQkgICAgICBzaXplLCBNQVhfUFJFQUxMT0NfU0laRSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNDksNyArMjE2OSw3IEBACiB7CiAJaWYgKHJlcXVlc3RfaXJxKGNoaXAtPnBjaS0+aXJxLCBhenhfaW50ZXJydXB0LAogCQkJY2hpcC0+bXNpID8gMCA6IElSUUZfU0hBUkVELAotCQkJImhkYV9pbnRlbCIsIGNoaXApKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoZGEtaW50ZWw6IHVuYWJsZSB0byBncmFiIElSUSAlZCwgIgogCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIsIGNoaXAtPnBjaS0+aXJxKTsKIAkJaWYgKGRvX2Rpc2Nvbm5lY3QpCkBAIC0yMzQ3LDI4ICsyMzY3LDIwIEBACiAgKiB3aGl0ZS9ibGFjay1saXN0aW5nIGZvciBwb3NpdGlvbl9maXgKICAqLwogc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIHBvc2l0aW9uX2ZpeF9saXN0W10gX19kZXZpbml0ZGF0YSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMDlmLCAiQWNlciBBc3BpcmUgNTExMCIsIFBPU19GSVhfTFBJQiksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDI2ZiwgIkFjZXIgQXNwaXJlIDU1MzgiLCBQT1NfRklYX0xQSUIpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAxY2MsICJEZWxsIEQ4MjAiLCBQT1NfRklYX0xQSUIpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAxZGUsICJEZWxsIFByZWNpc2lvbiAzOTAiLCBQT1NfRklYX0xQSUIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAxZjYsICJEZWxsIExhdGl0dWRlIDEzMUwiLCBQT1NfRklYX0xQSUIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA0NzAsICJEZWxsIEluc3Bpcm9uIDExMjAiLCBQT1NfRklYX0xQSUIpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwNmQsICJIUCBkdjMiLCBQT1NfRklYX0xQSUIpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxM2QsICJBU1VTIFA1QUQyIiwgUE9TX0ZJWF9MUElCKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MWIzLCAiQVNVUyIsIFBPU19GSVhfTFBJQiksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODFlNywgIkFTVVMgTTJWIiwgUE9TX0ZJWF9MUElCKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4NDEwLCAiQVNVUyIsIFBPU19GSVhfTFBJQiksCiAJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTA2OSwgIlNvbnkgVlBDUzExVjlFIiwgUE9TX0ZJWF9MUElCKSwKIAlTTkRfUENJX1FVSVJLKDB4MTEwNiwgMHgzMjg4LCAiQVNVUyBNMlYtTVggU0UiLCBQT1NfRklYX0xQSUIpLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMTAsICJUb3NoaWJhIEExMDAtMjU5IiwgUE9TX0ZJWF9MUElCKSwKIAlTTkRfUENJX1FVSVJLKDB4MTI5NywgMHgzMTY2LCAiU2h1dHRsZSIsIFBPU19GSVhfTFBJQiksCiAJU05EX1BDSV9RVUlSSygweDE0NTgsIDB4YTAyMiwgImdhLW1hNzcwLXVkMyIsIFBPU19GSVhfTFBJQiksCiAJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4MTAwMiwgIk1TSSBXaW5kIFUxMTUiLCBQT1NfRklYX0xQSUIpLAotCVNORF9QQ0lfUVVJUksoMHgxNTY1LCAweDgyMGYsICJCaW9zdGFyIE1pY3JvdGVjaCIsIFBPU19GSVhfTFBJQiksCiAJU05EX1BDSV9RVUlSSygweDE1NjUsIDB4ODIxOCwgIkJpb3N0YXIgTWljcm90ZWNoIiwgUE9TX0ZJWF9MUElCKSwKIAlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMHgwODg4LCAiNzc1RHVhbC1WU1RBIiwgUE9TX0ZJWF9MUElCKSwKIAlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHgyNTAzLCAiREc5NjVPVCBBQUQ2MzczMy0yMDMiLCBQT1NfRklYX0xQSUIpLAotCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGQ2MDEsICJlTWFjaGluZXMgVDUyMTIiLCBQT1NfRklYX0xQSUIpLAogCXt9CiB9OwogCkBAIC0yODE1LDYgKzI4MjcsMjIgQEAKIAkvKiBTQ0ggKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDgxMWIpLAogCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9TQ0ggfCBBWlhfRENBUFNfU0NIX1NOT09QIH0sCisJeyBQQ0lfREVWSUNFKDB4ODA4NiwgMHgyNjY4KSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfSUNIIHwgQVpYX0RDQVBTX09MRF9TU1lOQyB9LCAgLyogSUNINiAqLworCXsgUENJX0RFVklDRSgweDgwODYsIDB4MjdkOCksCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfSwgIC8qIElDSDcgKi8KKwl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI2OWEpLAorCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBFU0IyICovCisJeyBQQ0lfREVWSUNFKDB4ODA4NiwgMHgyODRiKSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfSUNIIHwgQVpYX0RDQVBTX09MRF9TU1lOQyB9LCAgLyogSUNIOCAqLworCXsgUENJX0RFVklDRSgweDgwODYsIDB4MjkzZSksCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfSwgIC8qIElDSDkgKi8KKwl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI5M2YpLAorCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0g5ICovCisJeyBQQ0lfREVWSUNFKDB4ODA4NiwgMHgzYTNlKSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfSUNIIHwgQVpYX0RDQVBTX09MRF9TU1lOQyB9LCAgLyogSUNIMTAgKi8KKwl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDNhNmUpLAorCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0gxMCAqLwogCS8qIEdlbmVyaWMgSW50ZWwgKi8KIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0FOWV9JRCksCiAJICAuY2xhc3MgPSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9IRF9BVURJTyA8PCA4LApAQCAtMjkwOCw3ICsyOTM2LDcgQEAKIAogLyogcGNpX2RyaXZlciBkZWZpbml0aW9uICovCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIkhEQSBJbnRlbCIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBhenhfaWRzLAogCS5wcm9iZSA9IGF6eF9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3AoYXp4X3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oIGIvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaAppbmRleCAwOGVjMDczLi44OGIyNzdlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKQEAgLTIxMiw3ICsyMTIsOSBAQAogLyoKICAqIFNQRElGIEkvTwogICovCi1pbnQgc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpOworaW50IHNuZF9oZGFfY3JlYXRlX3NwZGlmX291dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgaGRhX25pZF90IGFzc29jaWF0ZWRfbmlkLAorCQkJCSAgaGRhX25pZF90IGN2dF9uaWQpOwogaW50IHNuZF9oZGFfY3JlYXRlX3NwZGlmX2luX2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpOwogCiAvKgpAQCAtNTYzLDcgKzU2NSw2IEBACiAgKiBwb3dlci1tYW5hZ2VtZW50CiAgKi8KIAotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKIHZvaWQgc25kX2hkYV9zY2hlZHVsZV9wb3dlcl9zYXZlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKIAogc3RydWN0IGhkYV9hbXBfbGlzdCB7CkBAIC01ODAsNyArNTgxLDYgQEAKIGludCBzbmRfaGRhX2NoZWNrX2FtcF9saXN0X3Bvd2VyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCSBzdHJ1Y3QgaGRhX2xvb3BiYWNrX2NoZWNrICpjaGVjaywKIAkJCQkgaGRhX25pZF90IG5pZCk7Ci0jZW5kaWYgLyogQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRSAqLwogCiAvKgogICogQU1QIGNvbnRyb2wgY2FsbGJhY2tzCkBAIC02MzksOCArNjM5LDggQEAKIGludCBzbmRfaGRtaV9nZXRfZWxkX3NpemUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpOwogaW50IHNuZF9oZG1pX2dldF9lbGQoc3RydWN0IGhkbWlfZWxkICosIHN0cnVjdCBoZGFfY29kZWMgKiwgaGRhX25pZF90KTsKIHZvaWQgc25kX2hkbWlfc2hvd19lbGQoc3RydWN0IGhkbWlfZWxkICplbGQpOwotdm9pZCBoZG1pX2VsZF91cGRhdGVfcGNtX2luZm8oc3RydWN0IGhkbWlfZWxkICplbGQsIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqcGNtLAotCQkJICAgICAgc3RydWN0IGhkYV9wY21fc3RyZWFtICpjb2RlY19wYXJzKTsKK3ZvaWQgc25kX2hkbWlfZWxkX3VwZGF0ZV9wY21faW5mbyhzdHJ1Y3QgaGRtaV9lbGQgKmVsZCwKKwkJCSAgICAgIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8pOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIGludCBzbmRfaGRhX2VsZF9wcm9jX25ldyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkbWlfZWxkICplbGQsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMKaW5kZXggYmZlNzRjMi4uMmJlNTdiMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfcHJvYy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYwpAQCAtNjM2LDcgKzYzNiw3IEBACiAJCQl3aWRfY2FwcyB8PSBBQ19XQ0FQX0NPTk5fTElTVDsKIAogCQlpZiAod2lkX2NhcHMgJiBBQ19XQ0FQX0NPTk5fTElTVCkKLQkJCWNvbm5fbGVuID0gc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsIG5pZCwgY29ubiwKKwkJCWNvbm5fbGVuID0gc25kX2hkYV9nZXRfcmF3X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsIGNvbm4sCiAJCQkJCQkJICAgSERBX01BWF9DT05ORUNUSU9OUyk7CiAKIAkJaWYgKHdpZF9jYXBzICYgQUNfV0NBUF9JTl9BTVApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCmluZGV4IGQ2OTRlOWQuLjEzNjJjOGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwpAQCAtMjEzLDcgKzIxMyw5IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpIHsKLQkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoY29kZWMsIHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKTsKKwkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoY29kZWMsCisJCQkJCQkgICAgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQsCisJCQkJCQkgICAgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX3NoYXJlX3N3KGNvZGVjLApAQCAtMTkyMCw3ICsxOTIyLDggQEAKIAkJc3BlYy0+bWl4ZXJzWzBdID0gYWQxOTgxX2hwX21peGVyczsKIAkJc3BlYy0+bnVtX2luaXRfdmVyYnMgPSAyOwogCQlzcGVjLT5pbml0X3ZlcmJzWzFdID0gYWQxOTgxX2hwX2luaXRfdmVyYnM7Ci0JCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gMDsKKwkJaWYgKCFpc19qYWNrX2F2YWlsYWJsZShjb2RlYywgMHgwYSkpCisJCQlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IDA7CiAJCXNwZWMtPmlucHV0X211eCA9ICZhZDE5ODFfaHBfY2FwdHVyZV9zb3VyY2U7CiAKIAkJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gYWQxOTgxX2hwX2luaXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDExMC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMTAuYwppbmRleCA2MWI5MjYzLi42YjQwNjg0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDExMC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTEwLmMKQEAgLTI0MCw3ICsyNDAsOCBAQAogCX0KIAogCWlmIChzcGVjLT5kaWdfb3V0KSB7Ci0JCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX291dF9jdGxzKGNvZGVjLCBzcGVjLT5kaWdfb3V0KTsKKwkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoY29kZWMsIHNwZWMtPmRpZ19vdXQsCisJCQkJCQkgICAgc3BlYy0+ZGlnX291dCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfc2hhcmVfc3coY29kZWMsICZzcGVjLT5tdWx0aW91dCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWEyMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYwpAQCAtMCwwICsxLDEwOTcgQEAKKy8qCisgKiBIRCBhdWRpbyBpbnRlcmZhY2UgcGF0Y2ggZm9yIENyZWF0aXZlIENBMDEzMiBjaGlwCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBDcmVhdGl2ZSBUZWNobm9sb2d5IEx0ZC4KKyAqCisgKiBCYXNlZCBvbiBwYXRjaF9jYTAxMTAuYworICogQ29weXJpZ2h0IChjKSAyMDA4IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgImhkYV9jb2RlYy5oIgorI2luY2x1ZGUgImhkYV9sb2NhbC5oIgorCisjZGVmaW5lIFdJREdFVF9DSElQX0NUUkwgICAgICAweDE1CisjZGVmaW5lIFdJREdFVF9EU1BfQ1RSTCAgICAgICAweDE2CisKKyNkZWZpbmUgV1VIX01FTV9DT05OSUQgICAgICAgIDEwCisjZGVmaW5lIERTUF9NRU1fQ09OTklEICAgICAgICAxNgorCitlbnVtIGhkYV9jbWRfdmVuZG9yX2lvIHsKKwkvKiBmb3IgRHNwSU8gbm9kZSAqLworCVZFTkRPUl9EU1BJT19TQ1BfV1JJVEVfREFUQV9MT1cgICAgICA9IDB4MDAwLAorCVZFTkRPUl9EU1BJT19TQ1BfV1JJVEVfREFUQV9ISUdIICAgICA9IDB4MTAwLAorCisJVkVORE9SX0RTUElPX1NUQVRVUyAgICAgICAgICAgICAgICAgID0gMHhGMDEsCisJVkVORE9SX0RTUElPX1NDUF9QT1NUX1JFQURfREFUQSAgICAgID0gMHg3MDIsCisJVkVORE9SX0RTUElPX1NDUF9SRUFEX0RBVEEgICAgICAgICAgID0gMHhGMDIsCisJVkVORE9SX0RTUElPX0RTUF9JTklUICAgICAgICAgICAgICAgID0gMHg3MDMsCisJVkVORE9SX0RTUElPX1NDUF9QT1NUX0NPVU5UX1FVRVJZICAgID0gMHg3MDQsCisJVkVORE9SX0RTUElPX1NDUF9SRUFEX0NPVU5UICAgICAgICAgID0gMHhGMDQsCisKKwkvKiBmb3IgQ2hpcElPIG5vZGUgKi8KKwlWRU5ET1JfQ0hJUElPX0FERFJFU1NfTE9XICAgICAgICAgICAgPSAweDAwMCwKKwlWRU5ET1JfQ0hJUElPX0FERFJFU1NfSElHSCAgICAgICAgICAgPSAweDEwMCwKKwlWRU5ET1JfQ0hJUElPX1NUUkVBTV9GT1JNQVQgICAgICAgICAgPSAweDIwMCwKKwlWRU5ET1JfQ0hJUElPX0RBVEFfTE9XICAgICAgICAgICAgICAgPSAweDMwMCwKKwlWRU5ET1JfQ0hJUElPX0RBVEFfSElHSCAgICAgICAgICAgICAgPSAweDQwMCwKKworCVZFTkRPUl9DSElQSU9fR0VUX1BBUkFNRVRFUiAgICAgICAgICA9IDB4RjAwLAorCVZFTkRPUl9DSElQSU9fU1RBVFVTICAgICAgICAgICAgICAgICA9IDB4RjAxLAorCVZFTkRPUl9DSElQSU9fSElDX1BPU1RfUkVBRCAgICAgICAgICA9IDB4NzAyLAorCVZFTkRPUl9DSElQSU9fSElDX1JFQURfREFUQSAgICAgICAgICA9IDB4RjAzLAorCisJVkVORE9SX0NISVBJT19DVF9FWFRFTlNJT05TX0VOQUJMRSAgID0gMHg3MEEsCisKKwlWRU5ET1JfQ0hJUElPX1BMTF9QTVVfV1JJVEUgICAgICAgICAgPSAweDcwQywKKwlWRU5ET1JfQ0hJUElPX1BMTF9QTVVfUkVBRCAgICAgICAgICAgPSAweEYwQywKKwlWRU5ET1JfQ0hJUElPXzgwNTFfQUREUkVTU19MT1cgICAgICAgPSAweDcwRCwKKwlWRU5ET1JfQ0hJUElPXzgwNTFfQUREUkVTU19ISUdIICAgICAgPSAweDcwRSwKKwlWRU5ET1JfQ0hJUElPX0ZMQUdfU0VUICAgICAgICAgICAgICAgPSAweDcwRiwKKwlWRU5ET1JfQ0hJUElPX0ZMQUdTX0dFVCAgICAgICAgICAgICAgPSAweEYwRiwKKwlWRU5ET1JfQ0hJUElPX1BBUkFNRVRFUl9TRVQgICAgICAgICAgPSAweDcxMCwKKwlWRU5ET1JfQ0hJUElPX1BBUkFNRVRFUl9HRVQgICAgICAgICAgPSAweEYxMCwKKworCVZFTkRPUl9DSElQSU9fUE9SVF9BTExPQ19DT05GSUdfU0VUICA9IDB4NzExLAorCVZFTkRPUl9DSElQSU9fUE9SVF9BTExPQ19TRVQgICAgICAgICA9IDB4NzEyLAorCVZFTkRPUl9DSElQSU9fUE9SVF9BTExPQ19HRVQgICAgICAgICA9IDB4RjEyLAorCVZFTkRPUl9DSElQSU9fUE9SVF9GUkVFX1NFVCAgICAgICAgICA9IDB4NzEzLAorCisJVkVORE9SX0NISVBJT19QQVJBTUVURVJfRVhfSURfR0VUICAgID0gMHhGMTcsCisJVkVORE9SX0NISVBJT19QQVJBTUVURVJfRVhfSURfU0VUICAgID0gMHg3MTcsCisJVkVORE9SX0NISVBJT19QQVJBTUVURVJfRVhfVkFMVUVfR0VUID0gMHhGMTgsCisJVkVORE9SX0NISVBJT19QQVJBTUVURVJfRVhfVkFMVUVfU0VUID0gMHg3MTgKK307CisKKy8qCisgKiAgQ29udHJvbCBmbGFnIElEcworICovCitlbnVtIGNvbnRyb2xfZmxhZ19pZCB7CisJLyogQ29ubmVjdGlvbiBtYW5hZ2VyIHN0cmVhbSBzZXR1cCBpcyBieXBhc3NlZC9lbmFibGVkICovCisJQ09OVFJPTF9GTEFHX0NfTUdSICAgICAgICAgICAgICAgICAgPSAwLAorCS8qIERTUCBETUEgaXMgYnlwYXNzZWQvZW5hYmxlZCAqLworCUNPTlRST0xfRkxBR19ETUEgICAgICAgICAgICAgICAgICAgID0gMSwKKwkvKiA4MDUxICdpZGxlJyBtb2RlIGlzIGRpc2FibGVkL2VuYWJsZWQgKi8KKwlDT05UUk9MX0ZMQUdfSURMRV9FTkFCTEUgICAgICAgICAgICA9IDIsCisJLyogVHJhY2tlciBmb3IgdGhlIFNQRElGLWluIHBhdGggaXMgYnlwYXNzZWQvZW5hYmxlZCAqLworCUNPTlRST0xfRkxBR19UUkFDS0VSICAgICAgICAgICAgICAgID0gMywKKwkvKiBEaWdpdGFsT3V0IHRvIFNwZGlmMk91dCBjb25uZWN0aW9uIGlzIGRpc2FibGVkL2VuYWJsZWQgKi8KKwlDT05UUk9MX0ZMQUdfU1BESUYyT1VUICAgICAgICAgICAgICA9IDQsCisJLyogRGlnaXRhbCBNaWNyb3Bob25lIGlzIGRpc2FibGVkL2VuYWJsZWQgKi8KKwlDT05UUk9MX0ZMQUdfRE1JQyAgICAgICAgICAgICAgICAgICA9IDUsCisJLyogQURDX0IgcmF0ZSBpcyA0OCBrSHovOTYga0h6ICovCisJQ09OVFJPTF9GTEFHX0FEQ19CXzk2S0haICAgICAgICAgICAgPSA2LAorCS8qIEFEQ19DIHJhdGUgaXMgNDgga0h6Lzk2IGtIeiAqLworCUNPTlRST0xfRkxBR19BRENfQ185NktIWiAgICAgICAgICAgID0gNywKKwkvKiBEQUMgcmF0ZSBpcyA0OCBrSHovOTYga0h6IChhZmZlY3RzIGFsbCBEQUNzKSAqLworCUNPTlRST0xfRkxBR19EQUNfOTZLSFogICAgICAgICAgICAgID0gOCwKKwkvKiBEU1AgcmF0ZSBpcyA0OCBrSHovOTYga0h6ICovCisJQ09OVFJPTF9GTEFHX0RTUF85NktIWiAgICAgICAgICAgICAgPSA5LAorCS8qIFNSQyBjbG9jayBpcyA5OCBNSHovMTk2IE1IeiAoMTk2IE1IeiBmb3JjZXMgcmF0ZSB0byA5NiBLSHopICovCisJQ09OVFJPTF9GTEFHX1NSQ19DTE9DS18xOTZNSFogICAgICAgPSAxMCwKKwkvKiBTUkMgcmF0ZSBpcyA0OCBrSHovOTYga0h6ICg0OCBrSHogZGlzYWJsZWQgd2hlbiBjbG9jayBpcyAxOTYgTUh6KSAqLworCUNPTlRST0xfRkxBR19TUkNfUkFURV85NktIWiAgICAgICAgID0gMTEsCisJLyogRGVjb2RlIExvb3AgKERTUC0+U1JDLT5EU1ApIGlzIGRpc2FibGVkL2VuYWJsZWQgKi8KKwlDT05UUk9MX0ZMQUdfREVDT0RFX0xPT1AgICAgICAgICAgICA9IDEyLAorCS8qIERlLWVtcGhhc2lzIGZpbHRlciBvbiBEQUMtMSBkaXNhYmxlZC9lbmFibGVkICovCisJQ09OVFJPTF9GTEFHX0RBQzFfREVFTVBIQVNJUyAgICAgICAgPSAxMywKKwkvKiBEZS1lbXBoYXNpcyBmaWx0ZXIgb24gREFDLTIgZGlzYWJsZWQvZW5hYmxlZCAqLworCUNPTlRST0xfRkxBR19EQUMyX0RFRU1QSEFTSVMgICAgICAgID0gMTQsCisJLyogRGUtZW1waGFzaXMgZmlsdGVyIG9uIERBQy0zIGRpc2FibGVkL2VuYWJsZWQgKi8KKwlDT05UUk9MX0ZMQUdfREFDM19ERUVNUEhBU0lTICAgICAgICA9IDE1LAorCS8qIEhpZ2gtcGFzcyBmaWx0ZXIgb24gQURDX0IgZGlzYWJsZWQvZW5hYmxlZCAqLworCUNPTlRST0xfRkxBR19BRENfQl9ISUdIX1BBU1MgICAgICAgID0gMTYsCisJLyogSGlnaC1wYXNzIGZpbHRlciBvbiBBRENfQyBkaXNhYmxlZC9lbmFibGVkICovCisJQ09OVFJPTF9GTEFHX0FEQ19DX0hJR0hfUEFTUyAgICAgICAgPSAxNywKKwkvKiBDb21tb24gbW9kZSBvbiBQb3J0X0EgZGlzYWJsZWQvZW5hYmxlZCAqLworCUNPTlRST0xfRkxBR19QT1JUX0FfQ09NTU9OX01PREUgICAgID0gMTgsCisJLyogQ29tbW9uIG1vZGUgb24gUG9ydF9EIGRpc2FibGVkL2VuYWJsZWQgKi8KKwlDT05UUk9MX0ZMQUdfUE9SVF9EX0NPTU1PTl9NT0RFICAgICA9IDE5LAorCS8qIEltcGVkYW5jZSBmb3IgcmFtcCBnZW5lcmF0b3Igb24gUG9ydF9BIDE2IE9obS8xMEsgT2htICovCisJQ09OVFJPTF9GTEFHX1BPUlRfQV8xMEtPSE1fTE9BRCAgICAgPSAyMCwKKwkvKiBJbXBlZGFuY2UgZm9yIHJhbXAgZ2VuZXJhdG9yIG9uIFBvcnRfRCwgMTYgT2htLzEwSyBPaG0gKi8KKwlDT05UUk9MX0ZMQUdfUE9SVF9EXzEwSzBITV9MT0FEICAgICA9IDIxLAorCS8qIEFTSSByYXRlIGlzIDQ4a0h6Lzk2a0h6ICovCisJQ09OVFJPTF9GTEFHX0FTSV85NktIWiAgICAgICAgICAgICAgPSAyMiwKKwkvKiBEQUMgcG93ZXIgc2V0dGluZ3MgYWJsZSB0byBjb250cm9sIGF0dGFjaGVkIHBvcnRzIG5vL3llcyAqLworCUNPTlRST0xfRkxBR19EQUNTX0NPTlRST0xfUE9SVFMgICAgID0gMjMsCisJLyogQ2xvY2sgU3RvcCBPSyByZXBvcnRpbmcgaXMgZGlzYWJsZWQvZW5hYmxlZCAqLworCUNPTlRST0xfRkxBR19DT05UUk9MX1NUT1BfT0tfRU5BQkxFID0gMjQsCisJLyogTnVtYmVyIG9mIGNvbnRyb2wgZmxhZ3MgKi8KKwlDT05UUk9MX0ZMQUdTX01BWCA9IChDT05UUk9MX0ZMQUdfQ09OVFJPTF9TVE9QX09LX0VOQUJMRSsxKQorfTsKKworLyoKKyAqIENvbnRyb2wgcGFyYW1ldGVyIElEcworICovCitlbnVtIGNvbnRyb2xfcGFyYW1ldGVyX2lkIHsKKwkvKiAwOiBmb3JjZSBIREEsIDE6IGFsbG93IERTUCBpZiBIREEgU3BkaWYxT3V0IHN0cmVhbSBpcyBpZGxlICovCisJQ09OVFJPTF9QQVJBTV9TUERJRjFfU09VUkNFICAgICAgICAgICAgPSAyLAorCisJLyogU3RyZWFtIENvbnRyb2wgKi8KKworCS8qIFNlbGVjdCBzdHJlYW0gd2l0aCB0aGUgZ2l2ZW4gSUQgKi8KKwlDT05UUk9MX1BBUkFNX1NUUkVBTV9JRCAgICAgICAgICAgICAgICA9IDI0LAorCS8qIFNvdXJjZSBjb25uZWN0aW9uIHBvaW50IGZvciB0aGUgc2VsZWN0ZWQgc3RyZWFtICovCisJQ09OVFJPTF9QQVJBTV9TVFJFQU1fU09VUkNFX0NPTk5fUE9JTlQgPSAyNSwKKwkvKiBEZXN0aW5hdGlvbiBjb25uZWN0aW9uIHBvaW50IGZvciB0aGUgc2VsZWN0ZWQgc3RyZWFtICovCisJQ09OVFJPTF9QQVJBTV9TVFJFQU1fREVTVF9DT05OX1BPSU5UICAgPSAyNiwKKwkvKiBOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgaW4gdGhlIHNlbGVjdGVkIHN0cmVhbSAqLworCUNPTlRST0xfUEFSQU1fU1RSRUFNU19DSEFOTkVMUyAgICAgICAgID0gMjcsCisJLypFbmFibGUgY29udHJvbCBmb3IgdGhlIHNlbGVjdGVkIHN0cmVhbSAqLworCUNPTlRST0xfUEFSQU1fU1RSRUFNX0NPTlRST0wgICAgICAgICAgID0gMjgsCisKKwkvKiBDb25uZWN0aW9uIFBvaW50IENvbnRyb2wgKi8KKworCS8qIFNlbGVjdCBjb25uZWN0aW9uIHBvaW50IHdpdGggdGhlIGdpdmVuIElEICovCisJQ09OVFJPTF9QQVJBTV9DT05OX1BPSU5UX0lEICAgICAgICAgICAgPSAyOSwKKwkvKiBDb25uZWN0aW9uIHBvaW50IHNhbXBsZSByYXRlICovCisJQ09OVFJPTF9QQVJBTV9DT05OX1BPSU5UX1NBTVBMRV9SQVRFICAgPSAzMCwKKworCS8qIE5vZGUgQ29udHJvbCAqLworCisJLyogU2VsZWN0IEhEQSBub2RlIHdpdGggdGhlIGdpdmVuIElEICovCisJQ09OVFJPTF9QQVJBTV9OT0RFX0lEICAgICAgICAgICAgICAgICAgPSAzMQorfTsKKworLyoKKyAqICBEc3AgSW8gU3RhdHVzIGNvZGVzCisgKi8KK2VudW0gaGRhX3ZlbmRvcl9zdGF0dXNfZHNwaW8geworCS8qIFN1Y2Nlc3MgKi8KKwlWRU5ET1JfU1RBVFVTX0RTUElPX09LICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAsCisJLyogQnVzeSwgdW5hYmxlIHRvIGFjY2VwdCBuZXcgY29tbWFuZCwgdGhlIGhvc3QgbXVzdCByZXRyeSAqLworCVZFTkRPUl9TVEFUVVNfRFNQSU9fQlVTWSAgICAgICAgICAgICAgICAgICAgID0gMHgwMSwKKwkvKiBTQ1AgY29tbWFuZCBxdWV1ZSBpcyBmdWxsICovCisJVkVORE9SX1NUQVRVU19EU1BJT19TQ1BfQ09NTUFORF9RVUVVRV9GVUxMICAgPSAweDAyLAorCS8qIFNDUCByZXNwb25zZSBxdWV1ZSBpcyBlbXB0eSAqLworCVZFTkRPUl9TVEFUVVNfRFNQSU9fU0NQX1JFU1BPTlNFX1FVRVVFX0VNUFRZID0gMHgwMworfTsKKworLyoKKyAqICBDaGlwIElvIFN0YXR1cyBjb2RlcworICovCitlbnVtIGhkYV92ZW5kb3Jfc3RhdHVzX2NoaXBpbyB7CisJLyogU3VjY2VzcyAqLworCVZFTkRPUl9TVEFUVVNfQ0hJUElPX09LICAgPSAweDAwLAorCS8qIEJ1c3ksIHVuYWJsZSB0byBhY2NlcHQgbmV3IGNvbW1hbmQsIHRoZSBob3N0IG11c3QgcmV0cnkgKi8KKwlWRU5ET1JfU1RBVFVTX0NISVBJT19CVVNZID0gMHgwMQorfTsKKworLyoKKyAqICBDQTAxMzIgc2FtcGxlIHJhdGUKKyAqLworZW51bSBjYTAxMzJfc2FtcGxlX3JhdGUgeworCVNSXzZfMDAwICAgICAgICA9IDB4MDAsCisJU1JfOF8wMDAgICAgICAgID0gMHgwMSwKKwlTUl85XzYwMCAgICAgICAgPSAweDAyLAorCVNSXzExXzAyNSAgICAgICA9IDB4MDMsCisJU1JfMTZfMDAwICAgICAgID0gMHgwNCwKKwlTUl8yMl8wNTAgICAgICAgPSAweDA1LAorCVNSXzI0XzAwMCAgICAgICA9IDB4MDYsCisJU1JfMzJfMDAwICAgICAgID0gMHgwNywKKwlTUl80NF8xMDAgICAgICAgPSAweDA4LAorCVNSXzQ4XzAwMCAgICAgICA9IDB4MDksCisJU1JfODhfMjAwICAgICAgID0gMHgwQSwKKwlTUl85Nl8wMDAgICAgICAgPSAweDBCLAorCVNSXzE0NF8wMDAgICAgICA9IDB4MEMsCisJU1JfMTc2XzQwMCAgICAgID0gMHgwRCwKKwlTUl8xOTJfMDAwICAgICAgPSAweDBFLAorCVNSXzM4NF8wMDAgICAgICA9IDB4MEYsCisKKwlTUl9DT1VOVCAgICAgICAgPSAweDEwLAorCisJU1JfUkFURV9VTktOT1dOID0gMHgxRgorfTsKKworLyoKKyAqICBTY3AgSGVscGVyIGZ1bmN0aW9uCisgKi8KK2VudW0gZ2V0X3NldCB7CisJSVNfU0VUID0gMCwKKwlJU19HRVQgPSAxLAorfTsKKworLyoKKyAqIER1cGxpY2F0ZWQgZnJvbSBjYTAxMTAgY29kZWMKKyAqLworCitzdGF0aWMgdm9pZCBpbml0X291dHB1dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbiwgaGRhX25pZF90IGRhYykKK3sKKwlpZiAocGluKSB7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHBpbiwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFApOworCQlpZiAoZ2V0X3djYXBzKGNvZGVjLCBwaW4pICYgQUNfV0NBUF9PVVRfQU1QKQorCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcGluLCAwLAorCQkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCQkJICAgIEFNUF9PVVRfVU5NVVRFKTsKKwl9CisJaWYgKGRhYykKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgZGFjLCAwLAorCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk8pOworfQorCitzdGF0aWMgdm9pZCBpbml0X2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgcGluLCBoZGFfbmlkX3QgYWRjKQoreworCWlmIChwaW4pIHsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcGluLCAwLAorCQkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkJICAgIFBJTl9WUkVGODApOworCQlpZiAoZ2V0X3djYXBzKGNvZGVjLCBwaW4pICYgQUNfV0NBUF9JTl9BTVApCisJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBwaW4sIDAsCisJCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJCQkgICAgQU1QX0lOX1VOTVVURSgwKSk7CisJfQorCWlmIChhZGMpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGFkYywgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCQkgICAgQU1QX0lOX1VOTVVURSgwKSk7Cit9CisKK3N0YXRpYyBjaGFyICpkaXJzdHJbMl0gPSB7ICJQbGF5YmFjayIsICJDYXB0dXJlIiB9OworCitzdGF0aWMgaW50IF9hZGRfc3dpdGNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBjb25zdCBjaGFyICpwZngsCisJCSAgICAgICBpbnQgY2hhbiwgaW50IGRpcikKK3sKKwljaGFyIG5hbWVzdHJbNDRdOworCWludCB0eXBlID0gZGlyID8gSERBX0lOUFVUIDogSERBX09VVFBVVDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBrbmV3ID0KKwkJSERBX0NPREVDX01VVEVfTU9OTyhuYW1lc3RyLCBuaWQsIGNoYW4sIDAsIHR5cGUpOworCXNwcmludGYobmFtZXN0ciwgIiVzICVzIFN3aXRjaCIsIHBmeCwgZGlyc3RyW2Rpcl0pOworCXJldHVybiBzbmRfaGRhX2N0bF9hZGQoY29kZWMsIG5pZCwgc25kX2N0bF9uZXcxKCZrbmV3LCBjb2RlYykpOworfQorCitzdGF0aWMgaW50IF9hZGRfdm9sdW1lKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBjb25zdCBjaGFyICpwZngsCisJCSAgICAgICBpbnQgY2hhbiwgaW50IGRpcikKK3sKKwljaGFyIG5hbWVzdHJbNDRdOworCWludCB0eXBlID0gZGlyID8gSERBX0lOUFVUIDogSERBX09VVFBVVDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBrbmV3ID0KKwkJSERBX0NPREVDX1ZPTFVNRV9NT05PKG5hbWVzdHIsIG5pZCwgY2hhbiwgMCwgdHlwZSk7CisJc3ByaW50ZihuYW1lc3RyLCAiJXMgJXMgVm9sdW1lIiwgcGZ4LCBkaXJzdHJbZGlyXSk7CisJcmV0dXJuIHNuZF9oZGFfY3RsX2FkZChjb2RlYywgbmlkLCBzbmRfY3RsX25ldzEoJmtuZXcsIGNvZGVjKSk7Cit9CisKKyNkZWZpbmUgYWRkX291dF9zd2l0Y2goY29kZWMsIG5pZCwgcGZ4KSBfYWRkX3N3aXRjaChjb2RlYywgbmlkLCBwZngsIDMsIDApCisjZGVmaW5lIGFkZF9vdXRfdm9sdW1lKGNvZGVjLCBuaWQsIHBmeCkgX2FkZF92b2x1bWUoY29kZWMsIG5pZCwgcGZ4LCAzLCAwKQorI2RlZmluZSBhZGRfaW5fc3dpdGNoKGNvZGVjLCBuaWQsIHBmeCkgX2FkZF9zd2l0Y2goY29kZWMsIG5pZCwgcGZ4LCAzLCAxKQorI2RlZmluZSBhZGRfaW5fdm9sdW1lKGNvZGVjLCBuaWQsIHBmeCkgX2FkZF92b2x1bWUoY29kZWMsIG5pZCwgcGZ4LCAzLCAxKQorI2RlZmluZSBhZGRfbW9ub19zd2l0Y2goY29kZWMsIG5pZCwgcGZ4LCBjaGFuKSBcCisJX2FkZF9zd2l0Y2goY29kZWMsIG5pZCwgcGZ4LCBjaGFuLCAwKQorI2RlZmluZSBhZGRfbW9ub192b2x1bWUoY29kZWMsIG5pZCwgcGZ4LCBjaGFuKSBcCisJX2FkZF92b2x1bWUoY29kZWMsIG5pZCwgcGZ4LCBjaGFuLCAwKQorI2RlZmluZSBhZGRfaW5fbW9ub19zd2l0Y2goY29kZWMsIG5pZCwgcGZ4LCBjaGFuKSBcCisJX2FkZF9zd2l0Y2goY29kZWMsIG5pZCwgcGZ4LCBjaGFuLCAxKQorI2RlZmluZSBhZGRfaW5fbW9ub192b2x1bWUoY29kZWMsIG5pZCwgcGZ4LCBjaGFuKSBcCisJX2FkZF92b2x1bWUoY29kZWMsIG5pZCwgcGZ4LCBjaGFuLCAxKQorCisKKy8qCisgKiBDQTAxMzIgc3BlY2lmaWMKKyAqLworCitzdHJ1Y3QgY2EwMTMyX3NwZWMgeworCXN0cnVjdCBhdXRvX3Bpbl9jZmcgYXV0b2NmZzsKKwlzdHJ1Y3QgaGRhX211bHRpX291dCBtdWx0aW91dDsKKwloZGFfbmlkX3Qgb3V0X3BpbnNbQVVUT19DRkdfTUFYX09VVFNdOworCWhkYV9uaWRfdCBkYWNzW0FVVE9fQ0ZHX01BWF9PVVRTXTsKKwloZGFfbmlkX3QgaHBfZGFjOworCWhkYV9uaWRfdCBpbnB1dF9waW5zW0FVVE9fUElOX0xBU1RdOworCWhkYV9uaWRfdCBhZGNzW0FVVE9fUElOX0xBU1RdOworCWhkYV9uaWRfdCBkaWdfb3V0OworCWhkYV9uaWRfdCBkaWdfaW47CisJdW5zaWduZWQgaW50IG51bV9pbnB1dHM7CisJbG9uZyBjdXJyX2hwX3N3aXRjaDsKKwlsb25nIGN1cnJfaHBfdm9sdW1lWzJdOworCWxvbmcgY3Vycl9zcGVha2VyX3N3aXRjaDsKKwlzdHJ1Y3QgbXV0ZXggY2hpcGlvX211dGV4OworCWNvbnN0IGNoYXIgKmlucHV0X2xhYmVsc1tBVVRPX1BJTl9MQVNUXTsKKwlzdHJ1Y3QgaGRhX3BjbSBwY21fcmVjWzJdOyAvKiBQQ00gaW5mb3JtYXRpb24gKi8KK307CisKKy8qIENoaXAgYWNjZXNzIGhlbHBlciBmdW5jdGlvbiAqLworc3RhdGljIGludCBjaGlwaW9fc2VuZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJICAgICAgIHVuc2lnbmVkIGludCByZWcsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVzOworCWludCByZXRyeSA9IDUwOworCisJLyogc2VuZCBiaXRzIG9mIGRhdGEgc3BlY2lmaWVkIGJ5IHJlZyAqLworCWRvIHsKKwkJcmVzID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBXSURHRVRfQ0hJUF9DVFJMLCAwLAorCQkJCQkgcmVnLCBkYXRhKTsKKwkJaWYgKHJlcyA9PSBWRU5ET1JfU1RBVFVTX0NISVBJT19PSykKKwkJCXJldHVybiAwOworCX0gd2hpbGUgKC0tcmV0cnkpOworCXJldHVybiAtRUlPOworfQorCisvKgorICogV3JpdGUgY2hpcCBhZGRyZXNzIHRocm91Z2ggdGhlIHZlbmRvciB3aWRnZXQgLS0gTk9UIHByb3RlY3RlZCBieSB0aGUgTXV0ZXghCisgKi8KK3N0YXRpYyBpbnQgY2hpcGlvX3dyaXRlX2FkZHJlc3Moc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJdW5zaWduZWQgaW50IGNoaXBfYWRkeCkKK3sKKwlpbnQgcmVzOworCisJLyogc2VuZCBsb3cgMTYgYml0cyBvZiB0aGUgYWRkcmVzcyAqLworCXJlcyA9IGNoaXBpb19zZW5kKGNvZGVjLCBWRU5ET1JfQ0hJUElPX0FERFJFU1NfTE9XLAorCQkJICBjaGlwX2FkZHggJiAweGZmZmYpOworCisJaWYgKHJlcyAhPSAtRUlPKSB7CisJCS8qIHNlbmQgaGlnaCAxNiBiaXRzIG9mIHRoZSBhZGRyZXNzICovCisJCXJlcyA9IGNoaXBpb19zZW5kKGNvZGVjLCBWRU5ET1JfQ0hJUElPX0FERFJFU1NfSElHSCwKKwkJCQkgIGNoaXBfYWRkeCA+PiAxNik7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFdyaXRlIGRhdGEgdGhyb3VnaCB0aGUgdmVuZG9yIHdpZGdldCAtLSBOT1QgcHJvdGVjdGVkIGJ5IHRoZSBNdXRleCEKKyAqLworCitzdGF0aWMgaW50IGNoaXBpb193cml0ZV9kYXRhKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwlpbnQgcmVzOworCisJLyogc2VuZCBsb3cgMTYgYml0cyBvZiB0aGUgZGF0YSAqLworCXJlcyA9IGNoaXBpb19zZW5kKGNvZGVjLCBWRU5ET1JfQ0hJUElPX0RBVEFfTE9XLCBkYXRhICYgMHhmZmZmKTsKKworCWlmIChyZXMgIT0gLUVJTykgeworCQkvKiBzZW5kIGhpZ2ggMTYgYml0cyBvZiB0aGUgZGF0YSAqLworCQlyZXMgPSBjaGlwaW9fc2VuZChjb2RlYywgVkVORE9SX0NISVBJT19EQVRBX0hJR0gsCisJCQkJICBkYXRhID4+IDE2KTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogUmVhZCBkYXRhIHRocm91Z2ggdGhlIHZlbmRvciB3aWRnZXQgLS0gTk9UIHByb3RlY3RlZCBieSB0aGUgTXV0ZXghCisgKi8KK3N0YXRpYyBpbnQgY2hpcGlvX3JlYWRfZGF0YShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50ICpkYXRhKQoreworCWludCByZXM7CisKKwkvKiBwb3N0IHJlYWQgKi8KKwlyZXMgPSBjaGlwaW9fc2VuZChjb2RlYywgVkVORE9SX0NISVBJT19ISUNfUE9TVF9SRUFELCAwKTsKKworCWlmIChyZXMgIT0gLUVJTykgeworCQkvKiByZWFkIHN0YXR1cyAqLworCQlyZXMgPSBjaGlwaW9fc2VuZChjb2RlYywgVkVORE9SX0NISVBJT19TVEFUVVMsIDApOworCX0KKworCWlmIChyZXMgIT0gLUVJTykgeworCQkvKiByZWFkIGRhdGEgKi8KKwkJKmRhdGEgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIFdJREdFVF9DSElQX0NUUkwsIDAsCisJCQkJCSAgIFZFTkRPUl9DSElQSU9fSElDX1JFQURfREFUQSwKKwkJCQkJICAgMCk7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFdyaXRlIGdpdmVuIHZhbHVlIHRvIHRoZSBnaXZlbiBhZGRyZXNzIHRocm91Z2ggdGhlIGNoaXAgSS9PIHdpZGdldC4KKyAqIHByb3RlY3RlZCBieSB0aGUgTXV0ZXgKKyAqLworc3RhdGljIGludCBjaGlwaW9fd3JpdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCXVuc2lnbmVkIGludCBjaGlwX2FkZHgsIGNvbnN0IHVuc2lnbmVkIGludCBkYXRhKQoreworCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZzcGVjLT5jaGlwaW9fbXV0ZXgpOworCisJLyogd3JpdGUgdGhlIGFkZHJlc3MsIGFuZCBpZiBzdWNjZXNzZnVsIHByb2NlZWQgdG8gd3JpdGUgZGF0YSAqLworCWVyciA9IGNoaXBpb193cml0ZV9hZGRyZXNzKGNvZGVjLCBjaGlwX2FkZHgpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGV4aXQ7CisKKwllcnIgPSBjaGlwaW9fd3JpdGVfZGF0YShjb2RlYywgZGF0YSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXhpdDsKKworZXhpdDoKKwltdXRleF91bmxvY2soJnNwZWMtPmNoaXBpb19tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFJlYWQgdGhlIGdpdmVuIGFkZHJlc3MgdGhyb3VnaCB0aGUgY2hpcCBJL08gd2lkZ2V0CisgKiBwcm90ZWN0ZWQgYnkgdGhlIE11dGV4CisgKi8KK3N0YXRpYyBpbnQgY2hpcGlvX3JlYWQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCXVuc2lnbmVkIGludCBjaGlwX2FkZHgsIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2EwMTMyX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmc3BlYy0+Y2hpcGlvX211dGV4KTsKKworCS8qIHdyaXRlIHRoZSBhZGRyZXNzLCBhbmQgaWYgc3VjY2Vzc2Z1bCBwcm9jZWVkIHRvIHdyaXRlIGRhdGEgKi8KKwllcnIgPSBjaGlwaW9fd3JpdGVfYWRkcmVzcyhjb2RlYywgY2hpcF9hZGR4KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBleGl0OworCisJZXJyID0gY2hpcGlvX3JlYWRfZGF0YShjb2RlYywgZGF0YSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXhpdDsKKworZXhpdDoKKwltdXRleF91bmxvY2soJnNwZWMtPmNoaXBpb19tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFBDTSBzdHVmZnMKKyAqLworc3RhdGljIHZvaWQgY2EwMTMyX3NldHVwX3N0cmVhbShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCQkgdTMyIHN0cmVhbV90YWcsCisJCQkJIGludCBjaGFubmVsX2lkLCBpbnQgZm9ybWF0KQoreworCXVuc2lnbmVkIGludCBvbGR2YWwsIG5ld3ZhbDsKKworCWlmICghbmlkKQorCQlyZXR1cm47CisKKwlzbmRfcHJpbnRkZCgiY2EwMTMyX3NldHVwX3N0cmVhbTogIgorCQkiTklEPTB4JXgsIHN0cmVhbT0weCV4LCBjaGFubmVsPSVkLCBmb3JtYXQ9MHgleFxuIiwKKwkJbmlkLCBzdHJlYW1fdGFnLCBjaGFubmVsX2lkLCBmb3JtYXQpOworCisJLyogdXBkYXRlIHRoZSBmb3JtYXQtaWQgaWYgY2hhbmdlZCAqLworCW9sZHZhbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAorCQkJCSAgICBBQ19WRVJCX0dFVF9TVFJFQU1fRk9STUFULAorCQkJCSAgICAwKTsKKwlpZiAob2xkdmFsICE9IGZvcm1hdCkgeworCQltc2xlZXAoMjApOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCisJCQkJICAgIEFDX1ZFUkJfU0VUX1NUUkVBTV9GT1JNQVQsCisJCQkJICAgIGZvcm1hdCk7CisJfQorCisJb2xkdmFsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfR0VUX0NPTlYsIDApOworCW5ld3ZhbCA9IChzdHJlYW1fdGFnIDw8IDQpIHwgY2hhbm5lbF9pZDsKKwlpZiAob2xkdmFsICE9IG5ld3ZhbCkgeworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCisJCQkJICAgIEFDX1ZFUkJfU0VUX0NIQU5ORUxfU1RSRUFNSUQsCisJCQkJICAgIG5ld3ZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjYTAxMzJfY2xlYW51cF9zdHJlYW0oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCit7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9TVFJFQU1fRk9STUFULCAwKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0NIQU5ORUxfU1RSRUFNSUQsIDApOworfQorCisvKgorICogUENNIGNhbGxiYWNrcworICovCitzdGF0aWMgaW50IGNhMDEzMl9wbGF5YmFja19wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQl1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCXVuc2lnbmVkIGludCBmb3JtYXQsCisJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY2EwMTMyX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCWNhMDEzMl9zZXR1cF9zdHJlYW0oY29kZWMsIHNwZWMtPmRhY3NbMF0sIHN0cmVhbV90YWcsIDAsIGZvcm1hdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYTAxMzJfcGxheWJhY2tfcGNtX2NsZWFudXAoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGNhMDEzMl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwljYTAxMzJfY2xlYW51cF9zdHJlYW0oY29kZWMsIHNwZWMtPmRhY3NbMF0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEaWdpdGFsIG91dAorICovCitzdGF0aWMgaW50IGNhMDEzMl9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQl1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGNhMDEzMl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwljYTAxMzJfc2V0dXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5kaWdfb3V0LCBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2EwMTMyX2RpZ19wbGF5YmFja19wY21fY2xlYW51cChzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY2EwMTMyX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCWNhMDEzMl9jbGVhbnVwX3N0cmVhbShjb2RlYywgc3BlYy0+ZGlnX291dCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFuYWxvZyBjYXB0dXJlCisgKi8KK3N0YXRpYyBpbnQgY2EwMTMyX2NhcHR1cmVfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQl1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGNhMDEzMl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwljYTAxMzJfc2V0dXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5hZGNzW3N1YnN0cmVhbS0+bnVtYmVyXSwKKwkJCSAgICAgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhMDEzMl9jYXB0dXJlX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJY2EwMTMyX2NsZWFudXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5hZGNzW3N1YnN0cmVhbS0+bnVtYmVyXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERpZ2l0YWwgY2FwdHVyZQorICovCitzdGF0aWMgaW50IGNhMDEzMl9kaWdfY2FwdHVyZV9wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQl1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCXVuc2lnbmVkIGludCBmb3JtYXQsCisJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY2EwMTMyX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCWNhMDEzMl9zZXR1cF9zdHJlYW0oY29kZWMsIHNwZWMtPmRpZ19pbiwgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhMDEzMl9kaWdfY2FwdHVyZV9wY21fY2xlYW51cChzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY2EwMTMyX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCWNhMDEzMl9jbGVhbnVwX3N0cmVhbShjb2RlYywgc3BlYy0+ZGlnX2luKTsKKworCXJldHVybiAwOworfQorCisvKgorICovCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNhMDEzMl9wY21fYW5hbG9nX3BsYXliYWNrID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkub3BzID0geworCQkucHJlcGFyZSA9IGNhMDEzMl9wbGF5YmFja19wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSBjYTAxMzJfcGxheWJhY2tfcGNtX2NsZWFudXAKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjYTAxMzJfcGNtX2FuYWxvZ19jYXB0dXJlID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkub3BzID0geworCQkucHJlcGFyZSA9IGNhMDEzMl9jYXB0dXJlX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IGNhMDEzMl9jYXB0dXJlX3BjbV9jbGVhbnVwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY2EwMTMyX3BjbV9kaWdpdGFsX3BsYXliYWNrID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkub3BzID0geworCQkucHJlcGFyZSA9IGNhMDEzMl9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gY2EwMTMyX2RpZ19wbGF5YmFja19wY21fY2xlYW51cAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNhMDEzMl9wY21fZGlnaXRhbF9jYXB0dXJlID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkub3BzID0geworCQkucHJlcGFyZSA9IGNhMDEzMl9kaWdfY2FwdHVyZV9wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSBjYTAxMzJfZGlnX2NhcHR1cmVfcGNtX2NsZWFudXAKKwl9LAorfTsKKworc3RhdGljIGludCBjYTAxMzJfYnVpbGRfcGNtcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgY2EwMTMyX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgaGRhX3BjbSAqaW5mbyA9IHNwZWMtPnBjbV9yZWM7CisKKwljb2RlYy0+cGNtX2luZm8gPSBpbmZvOworCWNvZGVjLT5udW1fcGNtcyA9IDA7CisKKwlpbmZvLT5uYW1lID0gIkNBMDEzMiBBbmFsb2ciOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IGNhMDEzMl9wY21fYW5hbG9nX3BsYXliYWNrOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPSBzcGVjLT5kYWNzWzBdOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5jaGFubmVsc19tYXggPQorCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHM7CisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPSBjYTAxMzJfcGNtX2FuYWxvZ19jYXB0dXJlOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbXMgPSBzcGVjLT5udW1faW5wdXRzOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLm5pZCA9IHNwZWMtPmFkY3NbMF07CisJY29kZWMtPm51bV9wY21zKys7CisKKwlpZiAoIXNwZWMtPmRpZ19vdXQgJiYgIXNwZWMtPmRpZ19pbikKKwkJcmV0dXJuIDA7CisKKwlpbmZvKys7CisJaW5mby0+bmFtZSA9ICJDQTAxMzIgRGlnaXRhbCI7CisJaW5mby0+cGNtX3R5cGUgPSBIREFfUENNX1RZUEVfU1BESUY7CisJaWYgKHNwZWMtPmRpZ19vdXQpIHsKKwkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0KKwkJCWNhMDEzMl9wY21fZGlnaXRhbF9wbGF5YmFjazsKKwkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLm5pZCA9IHNwZWMtPmRpZ19vdXQ7CisJfQorCWlmIChzcGVjLT5kaWdfaW4pIHsKKwkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPQorCQkJY2EwMTMyX3BjbV9kaWdpdGFsX2NhcHR1cmU7CisJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLm5pZCA9IHNwZWMtPmRpZ19pbjsKKwl9CisJY29kZWMtPm51bV9wY21zKys7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBSRUdfQ09ERUNfTVVURQkJMHgxOGIwMTQKKyNkZWZpbmUgUkVHX0NPREVDX0hQX1ZPTF9MCTB4MThiMDcwCisjZGVmaW5lIFJFR19DT0RFQ19IUF9WT0xfUgkweDE4YjA3NAorCitzdGF0aWMgaW50IGNhMDEzMl9ocF9zd2l0Y2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKworCSp2YWxwID0gc3BlYy0+Y3Vycl9ocF9zd2l0Y2g7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2EwMTMyX2hwX3N3aXRjaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNhMDEzMl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCXVuc2lnbmVkIGludCBkYXRhOworCWludCBlcnI7CisKKwkvKiBhbnkgY2hhbmdlPyAqLworCWlmIChzcGVjLT5jdXJyX2hwX3N3aXRjaCA9PSAqdmFscCkKKwkJcmV0dXJuIDA7CisKKwlzbmRfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKKworCWVyciA9IGNoaXBpb19yZWFkKGNvZGVjLCBSRUdfQ09ERUNfTVVURSwgJmRhdGEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogKnZhbHAgMCBpcyBtdXRlLCAxIGlzIHVubXV0ZSAqLworCWRhdGEgPSAoZGF0YSAmIDB4N2YpIHwgKCp2YWxwID8gMCA6IDB4ODApOworCWNoaXBpb193cml0ZShjb2RlYywgUkVHX0NPREVDX01VVEUsIGRhdGEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc3BlYy0+Y3Vycl9ocF9zd2l0Y2ggPSAqdmFscDsKKworCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2EwMTMyX3NwZWFrZXJfc3dpdGNoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKworCSp2YWxwID0gc3BlYy0+Y3Vycl9zcGVha2VyX3N3aXRjaDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYTAxMzJfc3BlYWtlcl9zd2l0Y2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNhMDEzMl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCXVuc2lnbmVkIGludCBkYXRhOworCWludCBlcnI7CisKKwkvKiBhbnkgY2hhbmdlPyAqLworCWlmIChzcGVjLT5jdXJyX3NwZWFrZXJfc3dpdGNoID09ICp2YWxwKQorCQlyZXR1cm4gMDsKKworCXNuZF9oZGFfcG93ZXJfdXAoY29kZWMpOworCisJZXJyID0gY2hpcGlvX3JlYWQoY29kZWMsIFJFR19DT0RFQ19NVVRFLCAmZGF0YSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiAqdmFscCAwIGlzIG11dGUsIDEgaXMgdW5tdXRlICovCisJZGF0YSA9IChkYXRhICYgMHhlZikgfCAoKnZhbHAgPyAwIDogMHgxMCk7CisJY2hpcGlvX3dyaXRlKGNvZGVjLCBSRUdfQ09ERUNfTVVURSwgZGF0YSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlzcGVjLT5jdXJyX3NwZWFrZXJfc3dpdGNoID0gKnZhbHA7CisKKwlzbmRfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNhMDEzMl9ocF92b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKworCSp2YWxwKysgPSBzcGVjLT5jdXJyX2hwX3ZvbHVtZVswXTsKKwkqdmFscCA9IHNwZWMtPmN1cnJfaHBfdm9sdW1lWzFdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhMDEzMl9ocF92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKwlsb25nIGxlZnRfdm9sLCByaWdodF92b2w7CisJdW5zaWduZWQgaW50IGRhdGE7CisJaW50IHZhbDsKKwlpbnQgZXJyOworCisJbGVmdF92b2wgPSAqdmFscCsrOworCXJpZ2h0X3ZvbCA9ICp2YWxwOworCisJLyogYW55IGNoYW5nZT8gKi8KKwlpZiAoKHNwZWMtPmN1cnJfaHBfdm9sdW1lWzBdID09IGxlZnRfdm9sKSAmJgorCQkoc3BlYy0+Y3Vycl9ocF92b2x1bWVbMV0gPT0gcmlnaHRfdm9sKSkKKwkJcmV0dXJuIDA7CisKKwlzbmRfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKKworCWVyciA9IGNoaXBpb19yZWFkKGNvZGVjLCBSRUdfQ09ERUNfSFBfVk9MX0wsICZkYXRhKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXZhbCA9IDMxIC0gbGVmdF92b2w7CisJZGF0YSA9IChkYXRhICYgMHhlMCkgfCB2YWw7CisJY2hpcGlvX3dyaXRlKGNvZGVjLCBSRUdfQ09ERUNfSFBfVk9MX0wsIGRhdGEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJdmFsID0gMzEgLSByaWdodF92b2w7CisJZGF0YSA9IChkYXRhICYgMHhlMCkgfCB2YWw7CisJY2hpcGlvX3dyaXRlKGNvZGVjLCBSRUdfQ09ERUNfSFBfVk9MX1IsIGRhdGEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc3BlYy0+Y3Vycl9ocF92b2x1bWVbMF0gPSBsZWZ0X3ZvbDsKKwlzcGVjLT5jdXJyX2hwX3ZvbHVtZVsxXSA9IHJpZ2h0X3ZvbDsKKworCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2hwX3N3aXRjaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKK3sKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBrbmV3ID0KKwkJSERBX0NPREVDX01VVEVfTU9OTygiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsCisJCQkJICAgICBuaWQsIDEsIDAsIEhEQV9PVVRQVVQpOworCWtuZXcuZ2V0ID0gY2EwMTMyX2hwX3N3aXRjaF9nZXQ7CisJa25ldy5wdXQgPSBjYTAxMzJfaHBfc3dpdGNoX3B1dDsKKwlyZXR1cm4gc25kX2hkYV9jdGxfYWRkKGNvZGVjLCBuaWQsIHNuZF9jdGxfbmV3MSgma25ldywgY29kZWMpKTsKK30KKworc3RhdGljIGludCBhZGRfaHBfdm9sdW1lKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQoreworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGtuZXcgPQorCQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAorCQkJCSAgICAgICBuaWQsIDMsIDAsIEhEQV9PVVRQVVQpOworCWtuZXcuZ2V0ID0gY2EwMTMyX2hwX3ZvbHVtZV9nZXQ7CisJa25ldy5wdXQgPSBjYTAxMzJfaHBfdm9sdW1lX3B1dDsKKwlyZXR1cm4gc25kX2hkYV9jdGxfYWRkKGNvZGVjLCBuaWQsIHNuZF9jdGxfbmV3MSgma25ldywgY29kZWMpKTsKK30KKworc3RhdGljIGludCBhZGRfc3BlYWtlcl9zd2l0Y2goc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCit7CisJc3RydWN0IHNuZF9rY29udHJvbF9uZXcga25ldyA9CisJCUhEQV9DT0RFQ19NVVRFX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkgICAgIG5pZCwgMSwgMCwgSERBX09VVFBVVCk7CisJa25ldy5nZXQgPSBjYTAxMzJfc3BlYWtlcl9zd2l0Y2hfZ2V0OworCWtuZXcucHV0ID0gY2EwMTMyX3NwZWFrZXJfc3dpdGNoX3B1dDsKKwlyZXR1cm4gc25kX2hkYV9jdGxfYWRkKGNvZGVjLCBuaWQsIHNuZF9jdGxfbmV3MSgma25ldywgY29kZWMpKTsKK30KKworc3RhdGljIHZvaWQgY2EwMTMyX2ZpeF9ocF9jYXBzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCXVuc2lnbmVkIGludCBjYXBzOworCisJLyogc2V0IG11dGUtY2FwYWJsZSwgMWRiIHN0ZXAsIDMyIHN0ZXBzLCBvZnMgNiAqLworCWNhcHMgPSAweDgwMDMxZjA2OworCXNuZF9oZGFfb3ZlcnJpZGVfYW1wX2NhcHMoY29kZWMsIGNmZy0+aHBfcGluc1swXSwgSERBX09VVFBVVCwgY2Fwcyk7Cit9CisKK3N0YXRpYyBpbnQgY2EwMTMyX2J1aWxkX2NvbnRyb2xzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCWludCBpLCBlcnI7CisKKwlpZiAoc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MpIHsKKwkJZXJyID0gYWRkX3NwZWFrZXJfc3dpdGNoKGNvZGVjLCBzcGVjLT5vdXRfcGluc1swXSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoY2ZnLT5ocF9vdXRzKSB7CisJCWNhMDEzMl9maXhfaHBfY2Fwcyhjb2RlYyk7CisJCWVyciA9IGFkZF9ocF9zd2l0Y2goY29kZWMsIGNmZy0+aHBfcGluc1swXSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gYWRkX2hwX3ZvbHVtZShjb2RlYywgY2ZnLT5ocF9waW5zWzBdKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1faW5wdXRzOyBpKyspIHsKKwkJY29uc3QgY2hhciAqbGFiZWwgPSBzcGVjLT5pbnB1dF9sYWJlbHNbaV07CisKKwkJZXJyID0gYWRkX2luX3N3aXRjaChjb2RlYywgc3BlYy0+YWRjc1tpXSwgbGFiZWwpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWVyciA9IGFkZF9pbl92b2x1bWUoY29kZWMsIHNwZWMtPmFkY3NbaV0sIGxhYmVsKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpZiAoY2ZnLT5pbnB1dHNbaV0udHlwZSA9PSBBVVRPX1BJTl9NSUMpIHsKKwkJCS8qIGFkZCBNaWMtQm9vc3QgKi8KKwkJCWVyciA9IGFkZF9pbl9tb25vX3ZvbHVtZShjb2RlYywgc3BlYy0+aW5wdXRfcGluc1tpXSwKKwkJCQkJCSAiTWljIEJvb3N0IiwgMSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJaWYgKHNwZWMtPmRpZ19vdXQpIHsKKwkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoY29kZWMsIHNwZWMtPmRpZ19vdXQsCisJCQkJCQkgICAgc3BlYy0+ZGlnX291dCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gYWRkX291dF92b2x1bWUoY29kZWMsIHNwZWMtPmRpZ19vdXQsICJJRUM5NTgiKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChzcGVjLT5kaWdfaW4pIHsKKwkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfaW5fY3Rscyhjb2RlYywgc3BlYy0+ZGlnX2luKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQllcnIgPSBhZGRfaW5fdm9sdW1lKGNvZGVjLCBzcGVjLT5kaWdfaW4sICJJRUM5NTgiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgY2EwMTMyX3NldF9jdF9leHQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBlbmFibGUpCit7CisJLyogU2V0IENyZWF0aXZlIGV4dGVuc2lvbiAqLworCXNuZF9wcmludGRkKCJTRVQgQ1JFQVRJVkUgRVhURU5TSU9OXG4iKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBXSURHRVRfQ0hJUF9DVFJMLCAwLAorCQkJICAgIFZFTkRPUl9DSElQSU9fQ1RfRVhURU5TSU9OU19FTkFCTEUsCisJCQkgICAgZW5hYmxlKTsKKwltc2xlZXAoMjApOworfQorCisKK3N0YXRpYyB2b2lkIGNhMDEzMl9jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGNhMDEzMl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CisKKwkvKiBsaW5lLW91dHMgKi8KKwljZmctPmxpbmVfb3V0cyA9IDE7CisJY2ZnLT5saW5lX291dF9waW5zWzBdID0gMHgwYjsgLyogZnJvbnQgKi8KKwljZmctPmxpbmVfb3V0X3R5cGUgPSBBVVRPX1BJTl9MSU5FX09VVDsKKworCXNwZWMtPmRhY3NbMF0gPSAweDAyOworCXNwZWMtPm91dF9waW5zWzBdID0gMHgwYjsKKwlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPmRhY3M7CisJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSAxOworCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IDI7CisKKwkvKiBoZWFkcGhvbmUgKi8KKwljZmctPmhwX291dHMgPSAxOworCWNmZy0+aHBfcGluc1swXSA9IDB4MGY7CisKKwlzcGVjLT5ocF9kYWMgPSAwOworCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IDA7CisKKwkvKiBpbnB1dHMgKi8KKwljZmctPm51bV9pbnB1dHMgPSAyOyAgLyogTWljLWluIGFuZCBsaW5lLWluICovCisJY2ZnLT5pbnB1dHNbMF0ucGluID0gMHgxMjsKKwljZmctPmlucHV0c1swXS50eXBlID0gQVVUT19QSU5fTUlDOworCWNmZy0+aW5wdXRzWzFdLnBpbiA9IDB4MTE7CisJY2ZnLT5pbnB1dHNbMV0udHlwZSA9IEFVVE9fUElOX0xJTkVfSU47CisKKwkvKiBNaWMtaW4gKi8KKwlzcGVjLT5pbnB1dF9waW5zWzBdID0gMHgxMjsKKwlzcGVjLT5pbnB1dF9sYWJlbHNbMF0gPSAiTWljLUluIjsKKwlzcGVjLT5hZGNzWzBdID0gMHgwNzsKKworCS8qIExpbmUtSW4gKi8KKwlzcGVjLT5pbnB1dF9waW5zWzFdID0gMHgxMTsKKwlzcGVjLT5pbnB1dF9sYWJlbHNbMV0gPSAiTGluZS1JbiI7CisJc3BlYy0+YWRjc1sxXSA9IDB4MDg7CisJc3BlYy0+bnVtX2lucHV0cyA9IDI7Cit9CisKK3N0YXRpYyB2b2lkIGNhMDEzMl9pbml0X2NoaXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGNhMDEzMl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwltdXRleF9pbml0KCZzcGVjLT5jaGlwaW9fbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBjYTAxMzJfZXhpdF9jaGlwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCS8qIHB1dCBhbnkgY2hpcCBjbGVhbnVwIHN0dWZmcyBoZXJlLiAqLworfQorCitzdGF0aWMgaW50IGNhMDEzMl9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzOyBpKyspIHsKKwkJaW5pdF9vdXRwdXQoY29kZWMsIHNwZWMtPm91dF9waW5zW2ldLAorCQkJICAgIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldKTsKKwl9CisJaW5pdF9vdXRwdXQoY29kZWMsIGNmZy0+aHBfcGluc1swXSwgc3BlYy0+aHBfZGFjKTsKKwlpbml0X291dHB1dChjb2RlYywgY2ZnLT5kaWdfb3V0X3BpbnNbMF0sIHNwZWMtPmRpZ19vdXQpOworCisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9pbnB1dHM7IGkrKykKKwkJaW5pdF9pbnB1dChjb2RlYywgc3BlYy0+aW5wdXRfcGluc1tpXSwgc3BlYy0+YWRjc1tpXSk7CisKKwlpbml0X2lucHV0KGNvZGVjLCBjZmctPmRpZ19pbl9waW4sIHNwZWMtPmRpZ19pbik7CisKKwljYTAxMzJfc2V0X2N0X2V4dChjb2RlYywgMSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBjYTAxMzJfZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwljYTAxMzJfc2V0X2N0X2V4dChjb2RlYywgMCk7CisJY2EwMTMyX2V4aXRfY2hpcChjb2RlYyk7CisJa2ZyZWUoY29kZWMtPnNwZWMpOworfQorCitzdGF0aWMgc3RydWN0IGhkYV9jb2RlY19vcHMgY2EwMTMyX3BhdGNoX29wcyA9IHsKKwkuYnVpbGRfY29udHJvbHMgPSBjYTAxMzJfYnVpbGRfY29udHJvbHMsCisJLmJ1aWxkX3BjbXMgPSBjYTAxMzJfYnVpbGRfcGNtcywKKwkuaW5pdCA9IGNhMDEzMl9pbml0LAorCS5mcmVlID0gY2EwMTMyX2ZyZWUsCit9OworCisKKworc3RhdGljIGludCBwYXRjaF9jYTAxMzIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGNhMDEzMl9zcGVjICpzcGVjOworCisJc25kX3ByaW50ZGQoInBhdGNoX2NhMDEzMlxuIik7CisKKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNwZWMpCisJCXJldHVybiAtRU5PTUVNOworCWNvZGVjLT5zcGVjID0gc3BlYzsKKworCWNhMDEzMl9pbml0X2NoaXAoY29kZWMpOworCisJY2EwMTMyX2NvbmZpZyhjb2RlYyk7CisKKwljb2RlYy0+cGF0Y2hfb3BzID0gY2EwMTMyX3BhdGNoX29wczsKKworCXJldHVybiAwOworfQorCisvKgorICogcGF0Y2ggZW50cmllcworICovCitzdGF0aWMgc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgc25kX2hkYV9wcmVzZXRfY2EwMTMyW10gPSB7CisJeyAuaWQgPSAweDExMDIwMDExLCAubmFtZSA9ICJDQTAxMzIiLCAgICAgLnBhdGNoID0gcGF0Y2hfY2EwMTMyIH0sCisJe30gLyogdGVybWluYXRvciAqLworfTsKKworTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjExMDIwMDExIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3JlYXRpdmUgQ0EwMTMyLCBDQTAxMzIgSEQtYXVkaW8gY29kZWMiKTsKKworc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0X2xpc3QgY2EwMTMyX2xpc3QgPSB7CisJLnByZXNldCA9IHNuZF9oZGFfcHJlc2V0X2NhMDEzMiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBhdGNoX2NhMDEzMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNuZF9oZGFfYWRkX2NvZGVjX3ByZXNldCgmY2EwMTMyX2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGF0Y2hfY2EwMTMyX2V4aXQodm9pZCkKK3sKKwlzbmRfaGRhX2RlbGV0ZV9jb2RlY19wcmVzZXQoJmNhMDEzMl9saXN0KTsKK30KKworbW9kdWxlX2luaXQocGF0Y2hfY2EwMTMyX2luaXQpCittb2R1bGVfZXhpdChwYXRjaF9jYTAxMzJfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jCmluZGV4IDI2YTE1MjEwLi43ZjkzNzM5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMKQEAgLTM0NiwyMSArMzQ2LDE1IEBACiAKIAluaWQgPSBjb2RlYy0+c3RhcnRfbmlkOwogCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX25vZGVzOyBpKyssIG5pZCsrKSB7Ci0JCWhkYV9uaWRfdCBwaW5zWzJdOwogCQl1bnNpZ25lZCBpbnQgdHlwZTsKLQkJaW50IGosIG51bXM7CisJCWludCBpZHg7CiAJCXR5cGUgPSBnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpOwogCQlpZiAodHlwZSAhPSBBQ19XSURfQVVEX0lOKQogCQkJY29udGludWU7Ci0JCW51bXMgPSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyhjb2RlYywgbmlkLCBwaW5zLAotCQkJCQkgICAgICAgQVJSQVlfU0laRShwaW5zKSk7Ci0JCWlmIChudW1zIDw9IDApCi0JCQljb250aW51ZTsKLQkJZm9yIChqID0gMDsgaiA8IG51bXM7IGorKykgewotCQkJaWYgKHBpbnNbal0gPT0gcGluKSB7Ci0JCQkJKmlkeHAgPSBqOwotCQkJCXJldHVybiBuaWQ7Ci0JCQl9CisJCWlkeCA9IHNuZF9oZGFfZ2V0X2Nvbm5faW5kZXgoY29kZWMsIG5pZCwgcGluLCAwKTsKKwkJaWYgKGlkeCA+PSAwKSB7CisJCQkqaWR4cCA9IGlkeDsKKwkJCXJldHVybiBuaWQ7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC04MjEsNyArODE1LDggQEAKIAlpZiAoIXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKQogCQlyZXR1cm4gMDsKIAotCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX291dF9jdGxzKGNvZGVjLCBzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCk7CisJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoY29kZWMsIHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkLAorCQkJCQkgICAgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX3NoYXJlX3N3KGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKaW5kZXggYWIzMzA4ZC4uY2QyY2Y1ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCkBAIC0zMjcsNyArMzI3LDkgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkgewotCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpOworCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywKKwkJCQkJCSAgICBzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCwKKwkJCQkJCSAgICBzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfc2hhcmVfc3coY29kZWMsCkBAIC0zOTYsMTIgKzM5OCwxMSBAQAogewogCXN0cnVjdCBjbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWhkYV9uaWRfdCBuaWQ7Ci0JaW50IGksIGosIGssIGxlbjsKKwlpbnQgaSwgaiwgazsKIAogCS8qIGNsZWFyIHRoZSB0YWJsZSwgb25seSBvbmUgYy1tZWRpYSBkYWMgYXNzdW1lZCBoZXJlICovCiAJbWVtc2V0KHNwZWMtPm11bHRpX2luaXQsIDAsIHNpemVvZihzcGVjLT5tdWx0aV9pbml0KSk7CiAJZm9yIChqID0gMCwgaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7Ci0JCWhkYV9uaWRfdCBjb25uWzRdOwogCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07CiAJCS8qIHNldCBhcyBvdXRwdXQgKi8KIAkJc3BlYy0+bXVsdGlfaW5pdFtqXS5uaWQgPSBuaWQ7CkBAIC00MTQsMTIgKzQxNSwxMCBAQAogCQkJc3BlYy0+bXVsdGlfaW5pdFtqXS52ZXJiID0gQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUw7CiAJCQlzcGVjLT5tdWx0aV9pbml0W2pdLnBhcmFtID0gMDsKIAkJCS8qIGZpbmQgdGhlIGluZGV4IGluIGNvbm5lY3QgbGlzdCAqLwotCQkJbGVuID0gc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsIG5pZCwgY29ubiwgNCk7Ci0JCQlmb3IgKGsgPSAwOyBrIDwgbGVuOyBrKyspCi0JCQkJaWYgKGNvbm5ba10gPT0gc3BlYy0+ZGFjX25pZHNbaV0pIHsKLQkJCQkJc3BlYy0+bXVsdGlfaW5pdFtqXS5wYXJhbSA9IGs7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJCWsgPSBzbmRfaGRhX2dldF9jb25uX2luZGV4KGNvZGVjLCBuaWQsCisJCQkJCQkgICBzcGVjLT5kYWNfbmlkc1tpXSwgMCk7CisJCQlpZiAoayA+PSAwKQorCQkJCXNwZWMtPm11bHRpX2luaXRbal0ucGFyYW0gPSBrOwogCQkJaisrOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCmluZGV4IDNlNmI5YTguLjg4NGY2N2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKQEAgLTE1NSw2ICsxNTUsMTAgQEAKIAl1bnNpZ25lZCBpbnQgbWljX2Jvb3N0OyAvKiBvZmZzZXQgaW50byBjeHQ1MDY2X2FuYWxvZ19taWNfYm9vc3QgKi8KIAogCXVuc2lnbmVkIGludCBiZWVwX2FtcDsKKworCS8qIGV4dHJhIEVBUEQgcGlucyAqLworCXVuc2lnbmVkIGludCBudW1fZWFwZHM7CisJaGRhX25pZF90IGVhcGRzWzRdOwogfTsKIAogc3RhdGljIGludCBjb25leGFudF9wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLApAQCAtNTEwLDYgKzUxNCw3IEBACiAJfQogCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkgewogCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywKKwkJCQkJCSAgICBzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCwKIAkJCQkJCSAgICBzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKQEAgLTExMjMsMTAgKzExMjgsOCBAQAogCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBDWFQ1MDQ1X01PREVMUywKIAkJCQkJCSAgY3h0NTA0NV9tb2RlbHMsCiAJCQkJCQkgIGN4dDUwNDVfY2ZnX3RibCk7Ci0jaWYgMCAvKiB1c2UgdGhlIG9sZCBtZXRob2QganVzdCBmb3Igc2FmZXR5ICovCiAJaWYgKGJvYXJkX2NvbmZpZyA8IDApCi0JCWJvYXJkX2NvbmZpZyA9IENYVDUwNDVfQVVUTzsKLSNlbmRpZgorCQlib2FyZF9jb25maWcgPSBDWFQ1MDQ1X0FVVE87IC8qIG1vZGVsPWF1dG8gYXMgZGVmYXVsdCAqLwogCWlmIChib2FyZF9jb25maWcgPT0gQ1hUNTA0NV9BVVRPKQogCQlyZXR1cm4gcGF0Y2hfY29uZXhhbnRfYXV0byhjb2RlYyk7CiAKQEAgLTE1NjQsMTAgKzE1NjcsOCBAQAogCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBDWFQ1MDQ3X01PREVMUywKIAkJCQkJCSAgY3h0NTA0N19tb2RlbHMsCiAJCQkJCQkgIGN4dDUwNDdfY2ZnX3RibCk7Ci0jaWYgMCAvKiBub3QgZW5hYmxlZCBhcyBkZWZhdWx0LCBhcyBCSU9TIG9mdGVuIGJyb2tlbiBmb3IgdGhpcyBjb2RlYyAqLwogCWlmIChib2FyZF9jb25maWcgPCAwKQotCQlib2FyZF9jb25maWcgPSBDWFQ1MDQ3X0FVVE87Ci0jZW5kaWYKKwkJYm9hcmRfY29uZmlnID0gQ1hUNTA0N19BVVRPOyAvKiBtb2RlbD1hdXRvIGFzIGRlZmF1bHQgKi8KIAlpZiAoYm9hcmRfY29uZmlnID09IENYVDUwNDdfQVVUTykKIAkJcmV0dXJuIHBhdGNoX2NvbmV4YW50X2F1dG8oY29kZWMpOwogCkBAIC0xOTkzLDEwICsxOTk0LDggQEAKIAlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgQ1hUNTA1MV9NT0RFTFMsCiAJCQkJCQkgIGN4dDUwNTFfbW9kZWxzLAogCQkJCQkJICBjeHQ1MDUxX2NmZ190YmwpOwotI2lmIDAgLyogdXNlIHRoZSBvbGQgbWV0aG9kIGp1c3QgZm9yIHNhZmV0eSAqLwogCWlmIChib2FyZF9jb25maWcgPCAwKQotCQlib2FyZF9jb25maWcgPSBDWFQ1MDUxX0FVVE87Ci0jZW5kaWYKKwkJYm9hcmRfY29uZmlnID0gQ1hUNTA1MV9BVVRPOyAvKiBtb2RlbD1hdXRvIGFzIGRlZmF1bHQgKi8KIAlpZiAoYm9hcmRfY29uZmlnID09IENYVDUwNTFfQVVUTykKIAkJcmV0dXJuIHBhdGNoX2NvbmV4YW50X2F1dG8oY29kZWMpOwogCkBAIC0zMDc0LDYgKzMwNzMsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGN4dDUwNjZfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDA1NGMsICJBY2VyIEFzcGlyZSAzODMwVEciLCBDWFQ1MDY2X0FVVE8pLAogCVNORF9QQ0lfUVVJUktfTUFTSygweDEwMjUsIDB4ZmYwMCwgMHgwNDAwLCAiQWNlciIsIENYVDUwNjZfSURFQVBBRCksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDJkOCwgIkRlbGwgVm9zdHJvIiwgQ1hUNTA2Nl9ERUxMX1ZPU1RSTyksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDJmNSwgIkRlbGwgVm9zdHJvIDMyMCIsIENYVDUwNjZfSURFQVBBRCksCkBAIC0zMTAyLDYgKzMxMDIsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDM4YWYsICJMZW5vdm8gRzU2MCIsIENYVDUwNjZfQVNVUyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MzkzOCwgIkxlbm92byBHNTY1IiwgQ1hUNTA2Nl9BVVRPKSwKIAlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDE3YWEsICJMZW5vdm8iLCBDWFQ1MDY2X0lERUFQQUQpLCAvKiBGYWxsYmFjayBmb3IgTGVub3ZvcyB3aXRob3V0IGRvY2sgbWljICovCisJU05EX1BDSV9RVUlSSygweDFiMGEsIDB4MjA5MiwgIkN5YmVycG93ZXJQQyBHYW1lciBYcGxvcmVyIE41NzAwMSIsIENYVDUwNjZfQVVUTyksCiAJe30KIH07CiAKQEAgLTMxMTIsMTAgKzMxMTMsOCBAQAogCiAJYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIENYVDUwNjZfTU9ERUxTLAogCQkJCQkJICBjeHQ1MDY2X21vZGVscywgY3h0NTA2Nl9jZmdfdGJsKTsKLSNpZiAwIC8qIHVzZSB0aGUgb2xkIG1ldGhvZCBqdXN0IGZvciBzYWZldHkgKi8KIAlpZiAoYm9hcmRfY29uZmlnIDwgMCkKLQkJYm9hcmRfY29uZmlnID0gQ1hUNTA2Nl9BVVRPOwotI2VuZGlmCisJCWJvYXJkX2NvbmZpZyA9IENYVDUwNjZfQVVUTzsgLyogbW9kZWw9YXV0byBhcyBkZWZhdWx0ICovCiAJaWYgKGJvYXJkX2NvbmZpZyA9PSBDWFQ1MDY2X0FVVE8pCiAJCXJldHVybiBwYXRjaF9jb25leGFudF9hdXRvKGNvZGVjKTsKIApAQCAtMzMwNiwxOSArMzMwNSw4IEBACiAKIHN0YXRpYyBjb25zdCBoZGFfbmlkX3QgY3hfYXV0b19hZGNfbmlkc1tdID0geyAweDE0IH07CiAKLS8qIGdldCB0aGUgY29ubmVjdGlvbiBpbmRleCBvZiBAbmlkIGluIHRoZSB3aWRnZXQgQG11eCAqLwotc3RhdGljIGludCBnZXRfY29ubmVjdGlvbl9pbmRleChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG11eCwKLQkJCQloZGFfbmlkX3QgbmlkKQotewotCWhkYV9uaWRfdCBjb25uW0hEQV9NQVhfTlVNX0lOUFVUU107Ci0JaW50IGksIG51bXM7Ci0KLQludW1zID0gc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsIG11eCwgY29ubiwgQVJSQVlfU0laRShjb25uKSk7Ci0JZm9yIChpID0gMDsgaSA8IG51bXM7IGkrKykKLQkJaWYgKGNvbm5baV0gPT0gbmlkKQotCQkJcmV0dXJuIGk7Ci0JcmV0dXJuIC0xOwotfQorI2RlZmluZSBnZXRfY29ubmVjdGlvbl9pbmRleChjb2RlYywgbXV4LCBuaWQpXAorCXNuZF9oZGFfZ2V0X2Nvbm5faW5kZXgoY29kZWMsIG11eCwgbmlkLCAwKQogCiAvKiBnZXQgYW4gdW5hc3NpZ25lZCBEQUMgZnJvbSB0aGUgZ2l2ZW4gbGlzdC4KICAqIFJldHVybiB0aGUgbmlkIGlmIGZvdW5kIGFuZCByZWR1Y2UgdGhlIERBQyBsaXN0LCBvciByZXR1cm4gemVybyBpZgpAQCAtMzkxNyw2ICszOTA1LDM4IEBACiAjZGVmaW5lIGN4X2F1dG9fcGFyc2VfYmVlcChjb2RlYykKICNlbmRpZgogCitzdGF0aWMgYm9vbCBmb3VuZF9pbl9uaWRfbGlzdChoZGFfbmlkX3QgbmlkLCBjb25zdCBoZGFfbmlkX3QgKmxpc3QsIGludCBudW1zKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBudW1zOyBpKyspCisJCWlmIChsaXN0W2ldID09IG5pZCkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyogcGFyc2UgZXh0cmEtRUFQRCB0aGF0IGFyZW4ndCBhc3NpZ25lZCB0byBhbnkgcGlucyAqLworc3RhdGljIHZvaWQgY3hfYXV0b19wYXJzZV9lYXBkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CisJaGRhX25pZF90IG5pZCwgZW5kX25pZDsKKworCWVuZF9uaWQgPSBjb2RlYy0+c3RhcnRfbmlkICsgY29kZWMtPm51bV9ub2RlczsKKwlmb3IgKG5pZCA9IGNvZGVjLT5zdGFydF9uaWQ7IG5pZCA8IGVuZF9uaWQ7IG5pZCsrKSB7CisJCWlmIChnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpICE9IEFDX1dJRF9QSU4pCisJCQljb250aW51ZTsKKwkJaWYgKCEoc25kX2hkYV9xdWVyeV9waW5fY2Fwcyhjb2RlYywgbmlkKSAmIEFDX1BJTkNBUF9FQVBEKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZm91bmRfaW5fbmlkX2xpc3QobmlkLCBjZmctPmxpbmVfb3V0X3BpbnMsIGNmZy0+bGluZV9vdXRzKSB8fAorCQkgICAgZm91bmRfaW5fbmlkX2xpc3QobmlkLCBjZmctPmhwX3BpbnMsIGNmZy0+aHBfb3V0cykgfHwKKwkJICAgIGZvdW5kX2luX25pZF9saXN0KG5pZCwgY2ZnLT5zcGVha2VyX3BpbnMsIGNmZy0+c3BlYWtlcl9vdXRzKSkKKwkJCWNvbnRpbnVlOworCQlzcGVjLT5lYXBkc1tzcGVjLT5udW1fZWFwZHMrK10gPSBuaWQ7CisJCWlmIChzcGVjLT5udW1fZWFwZHMgPj0gQVJSQVlfU0laRShzcGVjLT5lYXBkcykpCisJCQlicmVhazsKKwl9Cit9CisKIHN0YXRpYyBpbnQgY3hfYXV0b19wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwpAQCAtMzkzMCw2ICszOTUwLDcgQEAKIAljeF9hdXRvX3BhcnNlX2lucHV0KGNvZGVjKTsKIAljeF9hdXRvX3BhcnNlX2RpZ2l0YWwoY29kZWMpOwogCWN4X2F1dG9fcGFyc2VfYmVlcChjb2RlYyk7CisJY3hfYXV0b19wYXJzZV9lYXBkKGNvZGVjKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDAxNyw2ICs0MDM4LDggQEAKIAkJfQogCX0KIAljeF9hdXRvX3VwZGF0ZV9zcGVha2Vycyhjb2RlYyk7CisJLyogdHVybiBvbi9vZmYgZXh0cmEgRUFQRHMsIHRvbyAqLworCWN4X2F1dG9fdHVybl9lYXBkKGNvZGVjLCBzcGVjLT5udW1fZWFwZHMsIHNwZWMtPmVhcGRzLCB0cnVlKTsKIH0KIAogc3RhdGljIHZvaWQgY3hfYXV0b19pbml0X2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtNDM4OCw2ICs0NDExLDggQEAKIAkgIC5wYXRjaCA9IHBhdGNoX2N4dDUwNjYgfSwKIAl7IC5pZCA9IDB4MTRmMTUwNjksIC5uYW1lID0gIkNYMjA1ODUiLAogCSAgLnBhdGNoID0gcGF0Y2hfY3h0NTA2NiB9LAorCXsgLmlkID0gMHgxNGYxNTA2YywgLm5hbWUgPSAiQ1gyMDU4OCIsCisJICAucGF0Y2ggPSBwYXRjaF9jeHQ1MDY2IH0sCiAJeyAuaWQgPSAweDE0ZjE1MDZlLCAubmFtZSA9ICJDWDIwNTkwIiwKIAkgIC5wYXRjaCA9IHBhdGNoX2N4dDUwNjYgfSwKIAl7IC5pZCA9IDB4MTRmMTUwOTcsIC5uYW1lID0gIkNYMjA2MzEiLApAQCAtNDQxNiw2ICs0NDQxLDcgQEAKIE1PRFVMRV9BTElBUygic25kLWhkYS1jb2RlYy1pZDoxNGYxNTA2NyIpOwogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjE0ZjE1MDY4Iik7CiBNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTRmMTUwNjkiKTsKK01PRFVMRV9BTElBUygic25kLWhkYS1jb2RlYy1pZDoxNGYxNTA2YyIpOwogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjE0ZjE1MDZlIik7CiBNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTRmMTUwOTciKTsKIE1PRFVMRV9BTElBUygic25kLWhkYS1jb2RlYy1pZDoxNGYxNTA5OCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2hkbWkuYwppbmRleCBiZDBhZTY5Li4xOWNiNzJkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2hkbWkuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2hkbWkuYwpAQCAtNDMsNyArNDMsNyBAQAogCiAvKgogICogVGhlIEhETUkvRGlzcGxheVBvcnQgY29uZmlndXJhdGlvbiBjYW4gYmUgaGlnaGx5IGR5bmFtaWMuIEEgZ3JhcGhpY3MgZGV2aWNlCi0gKiBjb3VsZCBzdXBwb3J0IHR3byBpbmRlcGVuZGVudCBwaXBlcywgZWFjaCBvZiB0aGVtIGNhbiBiZSBjb25uZWN0ZWQgdG8gb25lIG9yCisgKiBjb3VsZCBzdXBwb3J0IE4gaW5kZXBlbmRlbnQgcGlwZXMsIGVhY2ggb2YgdGhlbSBjYW4gYmUgY29ubmVjdGVkIHRvIG9uZSBvcgogICogbW9yZSBwb3J0cyAoRFZJLCBIRE1JIG9yIERpc3BsYXlQb3J0KS4KICAqCiAgKiBUaGUgSERBIGNvcnJlc3BvbmRlbmNlIG9mIHBpcGVzL3BvcnRzIGFyZSBjb252ZXJ0ZXIvcGluIG5vZGVzLgpAQCAtNTEsMzAgKzUxLDMzIEBACiAjZGVmaW5lIE1BWF9IRE1JX0NWVFMJNAogI2RlZmluZSBNQVhfSERNSV9QSU5TCTQKIAorc3RydWN0IGhkbWlfc3BlY19wZXJfY3Z0IHsKKwloZGFfbmlkX3QgY3Z0X25pZDsKKwlpbnQgYXNzaWduZWQ7CisJdW5zaWduZWQgaW50IGNoYW5uZWxzX21pbjsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbHNfbWF4OworCXUzMiByYXRlczsKKwl1NjQgZm9ybWF0czsKKwl1bnNpZ25lZCBpbnQgbWF4YnBzOworfTsKKworc3RydWN0IGhkbWlfc3BlY19wZXJfcGluIHsKKwloZGFfbmlkX3QgcGluX25pZDsKKwlpbnQgbnVtX211eF9uaWRzOworCWhkYV9uaWRfdCBtdXhfbmlkc1tIREFfTUFYX0NPTk5FQ1RJT05TXTsKKwlzdHJ1Y3QgaGRtaV9lbGQgc2lua19lbGQ7Cit9OworCiBzdHJ1Y3QgaGRtaV9zcGVjIHsKIAlpbnQgbnVtX2N2dHM7CisJc3RydWN0IGhkbWlfc3BlY19wZXJfY3Z0IGN2dHNbTUFYX0hETUlfQ1ZUU107CisKIAlpbnQgbnVtX3BpbnM7Ci0JaGRhX25pZF90IGN2dFtNQVhfSERNSV9DVlRTKzFdOyAgLyogYXVkaW8gc291cmNlcyAqLwotCWhkYV9uaWRfdCBwaW5bTUFYX0hETUlfUElOUysxXTsgIC8qIGF1ZGlvIHNpbmtzICovCisJc3RydWN0IGhkbWlfc3BlY19wZXJfcGluIHBpbnNbTUFYX0hETUlfUElOU107CisJc3RydWN0IGhkYV9wY20gcGNtX3JlY1tNQVhfSERNSV9QSU5TXTsKIAogCS8qCi0JICogc291cmNlIGNvbm5lY3Rpb24gZm9yIGVhY2ggcGluCi0JICovCi0JaGRhX25pZF90IHBpbl9jdnRbTUFYX0hETUlfUElOUysxXTsKLQotCS8qCi0JICogSERNSSBzaW5rIGF0dGFjaGVkIHRvIGVhY2ggcGluCi0JICovCi0Jc3RydWN0IGhkbWlfZWxkIHNpbmtfZWxkW01BWF9IRE1JX1BJTlNdOwotCi0JLyoKLQkgKiBleHBvcnQgb25lIHBjbSBwZXIgcGlwZQotCSAqLwotCXN0cnVjdCBoZGFfcGNtCXBjbV9yZWNbTUFYX0hETUlfQ1ZUU107Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtIGNvZGVjX3BjbV9wYXJzW01BWF9IRE1JX0NWVFNdOwotCi0JLyoKLQkgKiBhdGkvbnZoZG1pIHNwZWNpZmljCisJICogTm9uLWdlbmVyaWMgQVRJL05WSURJQSBzcGVjaWZpYwogCSAqLwogCXN0cnVjdCBoZGFfbXVsdGlfb3V0IG11bHRpb3V0OwogCWNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqcGNtX3BsYXliYWNrOwpAQCAtMjg0LDE1ICsyODcsNDAgQEAKICAqIEhETUkgcm91dGluZXMKICAqLwogCi1zdGF0aWMgaW50IGhkYV9ub2RlX2luZGV4KGhkYV9uaWRfdCAqbmlkcywgaGRhX25pZF90IG5pZCkKK3N0YXRpYyBpbnQgcGluX25pZF90b19waW5faW5kZXgoc3RydWN0IGhkbWlfc3BlYyAqc3BlYywgaGRhX25pZF90IHBpbl9uaWQpCiB7Ci0JaW50IGk7CisJaW50IHBpbl9pZHg7CiAKLQlmb3IgKGkgPSAwOyBuaWRzW2ldOyBpKyspCi0JCWlmIChuaWRzW2ldID09IG5pZCkKLQkJCXJldHVybiBpOworCWZvciAocGluX2lkeCA9IDA7IHBpbl9pZHggPCBzcGVjLT5udW1fcGluczsgcGluX2lkeCsrKQorCQlpZiAoc3BlYy0+cGluc1twaW5faWR4XS5waW5fbmlkID09IHBpbl9uaWQpCisJCQlyZXR1cm4gcGluX2lkeDsKIAotCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJIRE1JOiBuaWQgJWQgbm90IHJlZ2lzdGVyZWRcbiIsIG5pZCk7CisJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIkhETUk6IHBpbiBuaWQgJWQgbm90IHJlZ2lzdGVyZWRcbiIsIHBpbl9uaWQpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGhpbmZvX3RvX3Bpbl9pbmRleChzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjLAorCQkJICAgICAgc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbykKK3sKKwlpbnQgcGluX2lkeDsKKworCWZvciAocGluX2lkeCA9IDA7IHBpbl9pZHggPCBzcGVjLT5udW1fcGluczsgcGluX2lkeCsrKQorCQlpZiAoJnNwZWMtPnBjbV9yZWNbcGluX2lkeF0uc3RyZWFtWzBdID09IGhpbmZvKQorCQkJcmV0dXJuIHBpbl9pZHg7CisKKwlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiSERNSTogaGluZm8gJXAgbm90IHJlZ2lzdGVyZWRcbiIsIGhpbmZvKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBjdnRfbmlkX3RvX2N2dF9pbmRleChzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjLCBoZGFfbmlkX3QgY3Z0X25pZCkKK3sKKwlpbnQgY3Z0X2lkeDsKKworCWZvciAoY3Z0X2lkeCA9IDA7IGN2dF9pZHggPCBzcGVjLT5udW1fY3Z0czsgY3Z0X2lkeCsrKQorCQlpZiAoc3BlYy0+Y3Z0c1tjdnRfaWR4XS5jdnRfbmlkID09IGN2dF9uaWQpCisJCQlyZXR1cm4gY3Z0X2lkeDsKKworCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJIRE1JOiBjdnQgbmlkICVkIG5vdCByZWdpc3RlcmVkXG4iLCBjdnRfbmlkKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApAQCAtMzI2LDI4ICszNTQsMjggQEAKIAlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBwaW5fbmlkLCAwLCBBQ19WRVJCX1NFVF9IRE1JX0RJUF9EQVRBLCB2YWwpOwogfQogCi1zdGF0aWMgdm9pZCBoZG1pX2VuYWJsZV9vdXRwdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW5fbmlkKQorc3RhdGljIHZvaWQgaGRtaV9pbml0X3BpbihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbl9uaWQpCiB7CiAJLyogVW5tdXRlICovCiAJaWYgKGdldF93Y2Fwcyhjb2RlYywgcGluX25pZCkgJiBBQ19XQ0FQX09VVF9BTVApCiAJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHBpbl9uaWQsIDAsCiAJCQkJQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUpOwotCS8qIEVuYWJsZSBwaW4gb3V0ICovCisJLyogRGlzYWJsZSBwaW4gb3V0IHVudGlsIHN0cmVhbSBpcyBhY3RpdmUqLwogCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHBpbl9uaWQsIDAsCi0JCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUKTsKKwkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDApOwogfQogCi1zdGF0aWMgaW50IGhkbWlfZ2V0X2NoYW5uZWxfY291bnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCitzdGF0aWMgaW50IGhkbWlfZ2V0X2NoYW5uZWxfY291bnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBjdnRfbmlkKQogewotCXJldHVybiAxICsgc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJcmV0dXJuIDEgKyBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGN2dF9uaWQsIDAsCiAJCQkJCUFDX1ZFUkJfR0VUX0NWVF9DSEFOX0NPVU5ULCAwKTsKIH0KIAogc3RhdGljIHZvaWQgaGRtaV9zZXRfY2hhbm5lbF9jb3VudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkgICBoZGFfbmlkX3QgbmlkLCBpbnQgY2hzKQorCQkJCSAgIGhkYV9uaWRfdCBjdnRfbmlkLCBpbnQgY2hzKQogewotCWlmIChjaHMgIT0gaGRtaV9nZXRfY2hhbm5lbF9jb3VudChjb2RlYywgbmlkKSkKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCWlmIChjaHMgIT0gaGRtaV9nZXRfY2hhbm5lbF9jb3VudChjb2RlYywgY3Z0X25pZCkpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGN2dF9uaWQsIDAsCiAJCQkJICAgIEFDX1ZFUkJfU0VUX0NWVF9DSEFOX0NPVU5ULCBjaHMgLSAxKTsKIH0KIApAQCAtMzg0LDExICs0MTIsOCBAQAogICoKICAqIFRPRE86IGl0IGNvdWxkIHNlbGVjdCB0aGUgd3JvbmcgQ0EgZnJvbSBtdWx0aXBsZSBjYW5kaWRhdGVzLgogKi8KLXN0YXRpYyBpbnQgaGRtaV9jaGFubmVsX2FsbG9jYXRpb24oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkJICAgaW50IGNoYW5uZWxzKQorc3RhdGljIGludCBoZG1pX2NoYW5uZWxfYWxsb2NhdGlvbihzdHJ1Y3QgaGRtaV9lbGQgKmVsZCwgaW50IGNoYW5uZWxzKQogewotCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzdHJ1Y3QgaGRtaV9lbGQgKmVsZDsKIAlpbnQgaTsKIAlpbnQgY2EgPSAwOwogCWludCBzcGtfbWFzayA9IDA7CkBAIC00MDAsMTkgKzQyNSw2IEBACiAJaWYgKGNoYW5uZWxzIDw9IDIpCiAJCXJldHVybiAwOwogCi0JaSA9IGhkYV9ub2RlX2luZGV4KHNwZWMtPnBpbl9jdnQsIG5pZCk7Ci0JaWYgKGkgPCAwKQotCQlyZXR1cm4gMDsKLQllbGQgPSAmc3BlYy0+c2lua19lbGRbaV07Ci0KLQkvKgotCSAqIEhETUkgc2luaydzIEVMRCBpbmZvIGNhbm5vdCBhbHdheXMgYmUgcmV0cmlldmVkIGZvciBub3csIGUuZy4KLQkgKiBpbiBjb25zb2xlIG9yIGZvciBhdWRpbyBkZXZpY2VzLiBBc3N1bWUgdGhlIGhpZ2hlc3Qgc3BlYWtlcnMKLQkgKiBjb25maWd1cmF0aW9uLCB0byBfbm90XyBwcm9oaWJpdCBtdWx0aS1jaGFubmVsIGF1ZGlvIHBsYXliYWNrLgotCSAqLwotCWlmICghZWxkLT5zcGtfYWxsb2MpCi0JCWVsZC0+c3BrX2FsbG9jID0gMHhmZmZmOwotCiAJLyoKIAkgKiBleHBhbmQgRUxEJ3Mgc3BlYWtlciBhbGxvY2F0aW9uIG1hc2sKIAkgKgpAQCAtNjA4LDY3ICs2MjAsNjMgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQgaGRtaV9zZXR1cF9hdWRpb19pbmZvZnJhbWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCitzdGF0aWMgdm9pZCBoZG1pX3NldHVwX2F1ZGlvX2luZm9mcmFtZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IHBpbl9pZHgsCiAJCQkJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQloZGFfbmlkX3QgcGluX25pZDsKKwlzdHJ1Y3QgaGRtaV9zcGVjX3Blcl9waW4gKnBlcl9waW4gPSAmc3BlYy0+cGluc1twaW5faWR4XTsKKwloZGFfbmlkX3QgcGluX25pZCA9IHBlcl9waW4tPnBpbl9uaWQ7CiAJaW50IGNoYW5uZWxzID0gc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVsczsKKwlzdHJ1Y3QgaGRtaV9lbGQgKmVsZDsKIAlpbnQgY2E7Ci0JaW50IGk7CiAJdW5pb24gYXVkaW9faW5mb2ZyYW1lIGFpOwogCi0JY2EgPSBoZG1pX2NoYW5uZWxfYWxsb2NhdGlvbihjb2RlYywgbmlkLCBjaGFubmVscyk7CisJZWxkID0gJnNwZWMtPnBpbnNbcGluX2lkeF0uc2lua19lbGQ7CisJaWYgKCFlbGQtPm1vbml0b3JfcHJlc2VudCkKKwkJcmV0dXJuOwogCi0JZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9waW5zOyBpKyspIHsKLQkJaWYgKHNwZWMtPnBpbl9jdnRbaV0gIT0gbmlkKQotCQkJY29udGludWU7Ci0JCWlmICghc3BlYy0+c2lua19lbGRbaV0ubW9uaXRvcl9wcmVzZW50KQotCQkJY29udGludWU7CisJY2EgPSBoZG1pX2NoYW5uZWxfYWxsb2NhdGlvbihlbGQsIGNoYW5uZWxzKTsKIAotCQlwaW5fbmlkID0gc3BlYy0+cGluW2ldOworCW1lbXNldCgmYWksIDAsIHNpemVvZihhaSkpOworCWlmIChlbGQtPmNvbm5fdHlwZSA9PSAwKSB7IC8qIEhETUkgKi8KKwkJc3RydWN0IGhkbWlfYXVkaW9faW5mb2ZyYW1lICpoZG1pX2FpID0gJmFpLmhkbWk7CiAKLQkJbWVtc2V0KCZhaSwgMCwgc2l6ZW9mKGFpKSk7Ci0JCWlmIChzcGVjLT5zaW5rX2VsZFtpXS5jb25uX3R5cGUgPT0gMCkgeyAvKiBIRE1JICovCi0JCQlzdHJ1Y3QgaGRtaV9hdWRpb19pbmZvZnJhbWUgKmhkbWlfYWkgPSAmYWkuaGRtaTsKKwkJaGRtaV9haS0+dHlwZQkJPSAweDg0OworCQloZG1pX2FpLT52ZXIJCT0gMHgwMTsKKwkJaGRtaV9haS0+bGVuCQk9IDB4MGE7CisJCWhkbWlfYWktPkNDMDJfQ1Q0Nwk9IGNoYW5uZWxzIC0gMTsKKwkJaGRtaV9haS0+Q0EJCT0gY2E7CisJCWhkbWlfY2hlY2tzdW1fYXVkaW9faW5mb2ZyYW1lKGhkbWlfYWkpOworCX0gZWxzZSBpZiAoZWxkLT5jb25uX3R5cGUgPT0gMSkgeyAvKiBEaXNwbGF5UG9ydCAqLworCQlzdHJ1Y3QgZHBfYXVkaW9faW5mb2ZyYW1lICpkcF9haSA9ICZhaS5kcDsKIAotCQkJaGRtaV9haS0+dHlwZQkJPSAweDg0OwotCQkJaGRtaV9haS0+dmVyCQk9IDB4MDE7Ci0JCQloZG1pX2FpLT5sZW4JCT0gMHgwYTsKLQkJCWhkbWlfYWktPkNDMDJfQ1Q0Nwk9IGNoYW5uZWxzIC0gMTsKLQkJCWhkbWlfYWktPkNBCQk9IGNhOwotCQkJaGRtaV9jaGVja3N1bV9hdWRpb19pbmZvZnJhbWUoaGRtaV9haSk7Ci0JCX0gZWxzZSBpZiAoc3BlYy0+c2lua19lbGRbaV0uY29ubl90eXBlID09IDEpIHsgLyogRGlzcGxheVBvcnQgKi8KLQkJCXN0cnVjdCBkcF9hdWRpb19pbmZvZnJhbWUgKmRwX2FpID0gJmFpLmRwOworCQlkcF9haS0+dHlwZQkJPSAweDg0OworCQlkcF9haS0+bGVuCQk9IDB4MWI7CisJCWRwX2FpLT52ZXIJCT0gMHgxMSA8PCAyOworCQlkcF9haS0+Q0MwMl9DVDQ3CT0gY2hhbm5lbHMgLSAxOworCQlkcF9haS0+Q0EJCT0gY2E7CisJfSBlbHNlIHsKKwkJc25kX3ByaW50ZCgiSERNSTogdW5rbm93biBjb25uZWN0aW9uIHR5cGUgYXQgcGluICVkXG4iLAorCQkJICAgIHBpbl9uaWQpOworCQlyZXR1cm47CisJfQogCi0JCQlkcF9haS0+dHlwZQkJPSAweDg0OwotCQkJZHBfYWktPmxlbgkJPSAweDFiOwotCQkJZHBfYWktPnZlcgkJPSAweDExIDw8IDI7Ci0JCQlkcF9haS0+Q0MwMl9DVDQ3CT0gY2hhbm5lbHMgLSAxOwotCQkJZHBfYWktPkNBCQk9IGNhOwotCQl9IGVsc2UgewotCQkJc25kX3ByaW50ZCgiSERNSTogdW5rbm93biBjb25uZWN0aW9uIHR5cGUgYXQgcGluICVkXG4iLAotCQkJCSAgIHBpbl9uaWQpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKgotCQkgKiBzaXplb2YoYWkpIGlzIHVzZWQgaW5zdGVhZCBvZiBzaXplb2YoKmhkbWlfYWkpIG9yCi0JCSAqIHNpemVvZigqZHBfYWkpIHRvIGF2b2lkIHBhcnRpYWwgbWF0Y2gvdXBkYXRlIHByb2JsZW1zIHdoZW4KLQkJICogdGhlIHVzZXIgc3dpdGNoZXMgYmV0d2VlbiBIRE1JL0RQIG1vbml0b3JzLgotCQkgKi8KLQkJaWYgKCFoZG1pX2luZm9mcmFtZV91cHRvZGF0ZShjb2RlYywgcGluX25pZCwgYWkuYnl0ZXMsCi0JCQkJCSAgICAgc2l6ZW9mKGFpKSkpIHsKLQkJCXNuZF9wcmludGRkKCJoZG1pX3NldHVwX2F1ZGlvX2luZm9mcmFtZTogIgotCQkJCSAgICAiY3Z0PSVkIHBpbj0lZCBjaGFubmVscz0lZFxuIiwKLQkJCQkgICAgbmlkLCBwaW5fbmlkLAotCQkJCSAgICBjaGFubmVscyk7Ci0JCQloZG1pX3NldHVwX2NoYW5uZWxfbWFwcGluZyhjb2RlYywgcGluX25pZCwgY2EpOwotCQkJaGRtaV9zdG9wX2luZm9mcmFtZV90cmFucyhjb2RlYywgcGluX25pZCk7Ci0JCQloZG1pX2ZpbGxfYXVkaW9faW5mb2ZyYW1lKGNvZGVjLCBwaW5fbmlkLAotCQkJCQkJICBhaS5ieXRlcywgc2l6ZW9mKGFpKSk7Ci0JCQloZG1pX3N0YXJ0X2luZm9mcmFtZV90cmFucyhjb2RlYywgcGluX25pZCk7Ci0JCX0KKwkvKgorCSAqIHNpemVvZihhaSkgaXMgdXNlZCBpbnN0ZWFkIG9mIHNpemVvZigqaGRtaV9haSkgb3IKKwkgKiBzaXplb2YoKmRwX2FpKSB0byBhdm9pZCBwYXJ0aWFsIG1hdGNoL3VwZGF0ZSBwcm9ibGVtcyB3aGVuCisJICogdGhlIHVzZXIgc3dpdGNoZXMgYmV0d2VlbiBIRE1JL0RQIG1vbml0b3JzLgorCSAqLworCWlmICghaGRtaV9pbmZvZnJhbWVfdXB0b2RhdGUoY29kZWMsIHBpbl9uaWQsIGFpLmJ5dGVzLAorCQkJCQlzaXplb2YoYWkpKSkgeworCQlzbmRfcHJpbnRkZCgiaGRtaV9zZXR1cF9hdWRpb19pbmZvZnJhbWU6ICIKKwkJCSAgICAicGluPSVkIGNoYW5uZWxzPSVkXG4iLAorCQkJICAgIHBpbl9uaWQsCisJCQkgICAgY2hhbm5lbHMpOworCQloZG1pX3NldHVwX2NoYW5uZWxfbWFwcGluZyhjb2RlYywgcGluX25pZCwgY2EpOworCQloZG1pX3N0b3BfaW5mb2ZyYW1lX3RyYW5zKGNvZGVjLCBwaW5fbmlkKTsKKwkJaGRtaV9maWxsX2F1ZGlvX2luZm9mcmFtZShjb2RlYywgcGluX25pZCwKKwkJCQkJICAgIGFpLmJ5dGVzLCBzaXplb2YoYWkpKTsKKwkJaGRtaV9zdGFydF9pbmZvZnJhbWVfdHJhbnMoY29kZWMsIHBpbl9uaWQpOwogCX0KIH0KIApAQCAtNjg2LDE3ICs2OTQsMjcgQEAKIAlpbnQgcGluX25pZCA9IHJlcyA+PiBBQ19VTlNPTF9SRVNfVEFHX1NISUZUOwogCWludCBwZCA9ICEhKHJlcyAmIEFDX1VOU09MX1JFU19QRCk7CiAJaW50IGVsZHYgPSAhIShyZXMgJiBBQ19VTlNPTF9SRVNfRUxEVik7Ci0JaW50IGluZGV4OworCWludCBwaW5faWR4OworCXN0cnVjdCBoZG1pX2VsZCAqZWxkOwogCiAJcHJpbnRrKEtFUk5fSU5GTwotCQkiSERNSSBob3QgcGx1ZyBldmVudDogUGluPSVkIFByZXNlbmNlX0RldGVjdD0lZCBFTERfVmFsaWQ9JWRcbiIsCi0JCXBpbl9uaWQsIHBkLCBlbGR2KTsKKwkJIkhETUkgaG90IHBsdWcgZXZlbnQ6IENvZGVjPSVkIFBpbj0lZCBQcmVzZW5jZV9EZXRlY3Q9JWQgRUxEX1ZhbGlkPSVkXG4iLAorCQljb2RlYy0+YWRkciwgcGluX25pZCwgcGQsIGVsZHYpOwogCi0JaW5kZXggPSBoZGFfbm9kZV9pbmRleChzcGVjLT5waW4sIHBpbl9uaWQpOwotCWlmIChpbmRleCA8IDApCisJcGluX2lkeCA9IHBpbl9uaWRfdG9fcGluX2luZGV4KHNwZWMsIHBpbl9uaWQpOworCWlmIChwaW5faWR4IDwgMCkKIAkJcmV0dXJuOworCWVsZCA9ICZzcGVjLT5waW5zW3Bpbl9pZHhdLnNpbmtfZWxkOwogCi0JaGRtaV9wcmVzZW50X3NlbnNlKGNvZGVjLCBwaW5fbmlkLCAmc3BlYy0+c2lua19lbGRbaW5kZXhdKTsKKwloZG1pX3ByZXNlbnRfc2Vuc2UoY29kZWMsIHBpbl9uaWQsIGVsZCk7CisKKwkvKgorCSAqIEhETUkgc2luaydzIEVMRCBpbmZvIGNhbm5vdCBhbHdheXMgYmUgcmV0cmlldmVkIGZvciBub3csIGUuZy4KKwkgKiBpbiBjb25zb2xlIG9yIGZvciBhdWRpbyBkZXZpY2VzLiBBc3N1bWUgdGhlIGhpZ2hlc3Qgc3BlYWtlcnMKKwkgKiBjb25maWd1cmF0aW9uLCB0byBfbm90XyBwcm9oaWJpdCBtdWx0aS1jaGFubmVsIGF1ZGlvIHBsYXliYWNrLgorCSAqLworCWlmICghZWxkLT5zcGtfYWxsb2MpCisJCWVsZC0+c3BrX2FsbG9jID0gMHhmZmZmOwogfQogCiBzdGF0aWMgdm9pZCBoZG1pX25vbl9pbnRyaW5zaWNfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZXMpCkBAIC03MDcsNyArNzI1LDggQEAKIAlpbnQgY3BfcmVhZHkgPSAhIShyZXMgJiBBQ19VTlNPTF9SRVNfQ1BfUkVBRFkpOwogCiAJcHJpbnRrKEtFUk5fSU5GTwotCQkiSERNSSBDUCBldmVudDogUElOPSVkIFNVQlRBRz0weCV4IENQX1NUQVRFPSVkIENQX1JFQURZPSVkXG4iLAorCQkiSERNSSBDUCBldmVudDogQ09ERUM9JWQgUElOPSVkIFNVQlRBRz0weCV4IENQX1NUQVRFPSVkIENQX1JFQURZPSVkXG4iLAorCQljb2RlYy0+YWRkciwKIAkJdGFnLAogCQlzdWJ0YWcsCiAJCWNwX3N0YXRlLApAQCAtNzI3LDcgKzc0Niw3IEBACiAJaW50IHRhZyA9IHJlcyA+PiBBQ19VTlNPTF9SRVNfVEFHX1NISUZUOwogCWludCBzdWJ0YWcgPSAocmVzICYgQUNfVU5TT0xfUkVTX1NVQlRBRykgPj4gQUNfVU5TT0xfUkVTX1NVQlRBR19TSElGVDsKIAotCWlmIChoZGFfbm9kZV9pbmRleChzcGVjLT5waW4sIHRhZykgPCAwKSB7CisJaWYgKHBpbl9uaWRfdG9fcGluX2luZGV4KHNwZWMsIHRhZykgPCAwKSB7CiAJCXNuZF9wcmludGQoS0VSTl9JTkZPICJVbmV4cGVjdGVkIEhETUkgZXZlbnQgdGFnIDB4JXhcbiIsIHRhZyk7CiAJCXJldHVybjsKIAl9CkBAIC03NDYsMjEgKzc2NSwxNCBAQAogI2RlZmluZSBpc19oYnJfZm9ybWF0KGZvcm1hdCkgXAogCSgoZm9ybWF0ICYgQUNfRk1UX1RZUEVfTk9OX1BDTSkgJiYgKGZvcm1hdCAmIEFDX0ZNVF9DSEFOX01BU0spID09IDcpCiAKLXN0YXRpYyBpbnQgaGRtaV9zZXR1cF9zdHJlYW0oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkgICAgICB1MzIgc3RyZWFtX3RhZywgaW50IGZvcm1hdCkKK3N0YXRpYyBpbnQgaGRtaV9zZXR1cF9zdHJlYW0oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBjdnRfbmlkLAorCQkJICAgICAgaGRhX25pZF90IHBpbl9uaWQsIHUzMiBzdHJlYW1fdGFnLCBpbnQgZm9ybWF0KQogewotCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgcGluY3RsOwogCWludCBuZXdfcGluY3RsID0gMDsKLQlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fcGluczsgaSsrKSB7Ci0JCWlmIChzcGVjLT5waW5fY3Z0W2ldICE9IG5pZCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIShzbmRfaGRhX3F1ZXJ5X3Bpbl9jYXBzKGNvZGVjLCBzcGVjLT5waW5baV0pICYgQUNfUElOQ0FQX0hCUikpCi0JCQljb250aW51ZTsKLQotCQlwaW5jdGwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIHNwZWMtPnBpbltpXSwgMCwKKwlpZiAoc25kX2hkYV9xdWVyeV9waW5fY2Fwcyhjb2RlYywgcGluX25pZCkgJiBBQ19QSU5DQVBfSEJSKSB7CisJCXBpbmN0bCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgcGluX25pZCwgMCwKIAkJCQkJICAgIEFDX1ZFUkJfR0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMCk7CiAKIAkJbmV3X3BpbmN0bCA9IHBpbmN0bCAmIH5BQ19QSU5DVExfRVBUOwpAQCAtNzcxLDIyICs3ODMsMjIgQEAKIAogCQlzbmRfcHJpbnRkZCgiaGRtaV9zZXR1cF9zdHJlYW06ICIKIAkJCSAgICAiTklEPTB4JXgsICVzcGluY3RsPTB4JXhcbiIsCi0JCQkgICAgc3BlYy0+cGluW2ldLAorCQkJICAgIHBpbl9uaWQsCiAJCQkgICAgcGluY3RsID09IG5ld19waW5jdGwgPyAiIiA6ICJuZXctIiwKIAkJCSAgICBuZXdfcGluY3RsKTsKIAogCQlpZiAocGluY3RsICE9IG5ld19waW5jdGwpCi0JCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBzcGVjLT5waW5baV0sIDAsCisJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBwaW5fbmlkLCAwLAogCQkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAogCQkJCQkgICAgbmV3X3BpbmN0bCk7Ci0JfQogCisJfQogCWlmIChpc19oYnJfZm9ybWF0KGZvcm1hdCkgJiYgIW5ld19waW5jdGwpIHsKIAkJc25kX3ByaW50ZGQoImhkbWlfc2V0dXBfc3RyZWFtOiBIQlIgaXMgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBuaWQsIHN0cmVhbV90YWcsIDAsIGZvcm1hdCk7CisJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIGN2dF9uaWQsIHN0cmVhbV90YWcsIDAsIGZvcm1hdCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc5OCwzNyArODEwLDcwIEBACiAJCQkgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBoZG1pX2VsZCAqZWxkOwotCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqY29kZWNfcGFyczsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXVuc2lnbmVkIGludCBpZHg7CisJaW50IHBpbl9pZHgsIGN2dF9pZHgsIG11eF9pZHggPSAwOworCXN0cnVjdCBoZG1pX3NwZWNfcGVyX3BpbiAqcGVyX3BpbjsKKwlzdHJ1Y3QgaGRtaV9lbGQgKmVsZDsKKwlzdHJ1Y3QgaGRtaV9zcGVjX3Blcl9jdnQgKnBlcl9jdnQgPSBOVUxMOworCWludCBwaW5jdGw7CiAKLQlmb3IgKGlkeCA9IDA7IGlkeCA8IHNwZWMtPm51bV9jdnRzOyBpZHgrKykKLQkJaWYgKGhpbmZvLT5uaWQgPT0gc3BlYy0+Y3Z0W2lkeF0pCi0JCQlicmVhazsKLQlpZiAoc25kX0JVR19PTihpZHggPj0gc3BlYy0+bnVtX2N2dHMpIHx8Ci0JICAgIHNuZF9CVUdfT04oaWR4ID49IHNwZWMtPm51bV9waW5zKSkKKwkvKiBWYWxpZGF0ZSBoaW5mbyAqLworCXBpbl9pZHggPSBoaW5mb190b19waW5faW5kZXgoc3BlYywgaGluZm8pOworCWlmIChzbmRfQlVHX09OKHBpbl9pZHggPCAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJcGVyX3BpbiA9ICZzcGVjLT5waW5zW3Bpbl9pZHhdOworCWVsZCA9ICZwZXJfcGluLT5zaW5rX2VsZDsKIAotCS8qIHNhdmUgdGhlIFBDTSBpbmZvIHRoZSBjb2RlYyBwcm92aWRlcyAqLwotCWNvZGVjX3BhcnMgPSAmc3BlYy0+Y29kZWNfcGNtX3BhcnNbaWR4XTsKLQlpZiAoIWNvZGVjX3BhcnMtPnJhdGVzKQotCQkqY29kZWNfcGFycyA9ICpoaW5mbzsKKwkvKiBEeW5hbWljYWxseSBhc3NpZ24gY29udmVydGVyIHRvIHN0cmVhbSAqLworCWZvciAoY3Z0X2lkeCA9IDA7IGN2dF9pZHggPCBzcGVjLT5udW1fY3Z0czsgY3Z0X2lkeCsrKSB7CisJCXBlcl9jdnQgPSAmc3BlYy0+Y3Z0c1tjdnRfaWR4XTsKIAotCWVsZCA9ICZzcGVjLT5zaW5rX2VsZFtpZHhdOwotCWlmICghc3RhdGljX2hkbWlfcGNtICYmIGVsZC0+ZWxkX3ZhbGlkICYmIGVsZC0+c2FkX2NvdW50ID4gMCkgewotCQloZG1pX2VsZF91cGRhdGVfcGNtX2luZm8oZWxkLCBoaW5mbywgY29kZWNfcGFycyk7CisJCS8qIE11c3Qgbm90IGFscmVhZHkgYmUgYXNzaWduZWQgKi8KKwkJaWYgKHBlcl9jdnQtPmFzc2lnbmVkKQorCQkJY29udGludWU7CisJCS8qIE11c3QgYmUgaW4gcGluJ3MgbXV4J3MgbGlzdCBvZiBjb252ZXJ0ZXJzICovCisJCWZvciAobXV4X2lkeCA9IDA7IG11eF9pZHggPCBwZXJfcGluLT5udW1fbXV4X25pZHM7IG11eF9pZHgrKykKKwkJCWlmIChwZXJfcGluLT5tdXhfbmlkc1ttdXhfaWR4XSA9PSBwZXJfY3Z0LT5jdnRfbmlkKQorCQkJCWJyZWFrOworCQkvKiBOb3QgaW4gbXV4IGxpc3QgKi8KKwkJaWYgKG11eF9pZHggPT0gcGVyX3Bpbi0+bnVtX211eF9uaWRzKQorCQkJY29udGludWU7CisJCWJyZWFrOworCX0KKwkvKiBObyBmcmVlIGNvbnZlcnRlcnMgKi8KKwlpZiAoY3Z0X2lkeCA9PSBzcGVjLT5udW1fY3Z0cykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDbGFpbSBjb252ZXJ0ZXIgKi8KKwlwZXJfY3Z0LT5hc3NpZ25lZCA9IDE7CisJaGluZm8tPm5pZCA9IHBlcl9jdnQtPmN2dF9uaWQ7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBwZXJfcGluLT5waW5fbmlkLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLAorCQkJICAgIG11eF9pZHgpOworCXBpbmN0bCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgcGVyX3Bpbi0+cGluX25pZCwgMCwKKwkJCQkgICAgQUNfVkVSQl9HRVRfUElOX1dJREdFVF9DT05UUk9MLCAwKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBwZXJfcGluLT5waW5fbmlkLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCSAgICBwaW5jdGwgfCBQSU5fT1VUKTsKKwlzbmRfaGRhX3NwZGlmX2N0bHNfYXNzaWduKGNvZGVjLCBwaW5faWR4LCBwZXJfY3Z0LT5jdnRfbmlkKTsKKworCS8qIEluaXRpYWxseSBzZXQgdGhlIGNvbnZlcnRlcidzIGNhcGFiaWxpdGllcyAqLworCWhpbmZvLT5jaGFubmVsc19taW4gPSBwZXJfY3Z0LT5jaGFubmVsc19taW47CisJaGluZm8tPmNoYW5uZWxzX21heCA9IHBlcl9jdnQtPmNoYW5uZWxzX21heDsKKwloaW5mby0+cmF0ZXMgPSBwZXJfY3Z0LT5yYXRlczsKKwloaW5mby0+Zm9ybWF0cyA9IHBlcl9jdnQtPmZvcm1hdHM7CisJaGluZm8tPm1heGJwcyA9IHBlcl9jdnQtPm1heGJwczsKKworCS8qIFJlc3RyaWN0IGNhcGFiaWxpdGllcyBieSBFTEQgaWYgdGhpcyBpc24ndCBkaXNhYmxlZCAqLworCWlmICghc3RhdGljX2hkbWlfcGNtICYmIGVsZC0+ZWxkX3ZhbGlkKSB7CisJCXNuZF9oZG1pX2VsZF91cGRhdGVfcGNtX2luZm8oZWxkLCBoaW5mbyk7CiAJCWlmIChoaW5mby0+Y2hhbm5lbHNfbWluID4gaGluZm8tPmNoYW5uZWxzX21heCB8fAogCQkgICAgIWhpbmZvLT5yYXRlcyB8fCAhaGluZm8tPmZvcm1hdHMpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQl9IGVsc2UgewotCQkvKiBmYWxsYmFjayB0byB0aGUgY29kZWMgZGVmYXVsdCAqLwotCQloaW5mby0+Y2hhbm5lbHNfbWF4ID0gY29kZWNfcGFycy0+Y2hhbm5lbHNfbWF4OwotCQloaW5mby0+cmF0ZXMgPSBjb2RlY19wYXJzLT5yYXRlczsKLQkJaGluZm8tPmZvcm1hdHMgPSBjb2RlY19wYXJzLT5mb3JtYXRzOwotCQloaW5mby0+bWF4YnBzID0gY29kZWNfcGFycy0+bWF4YnBzOwogCX0KLQkvKiBzdG9yZSB0aGUgdXBkYXRlZCBwYXJhbWV0ZXJzICovCisKKwkvKiBTdG9yZSB0aGUgdXBkYXRlZCBwYXJhbWV0ZXJzICovCiAJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gaGluZm8tPmNoYW5uZWxzX21pbjsKIAlydW50aW1lLT5ody5jaGFubmVsc19tYXggPSBoaW5mby0+Y2hhbm5lbHNfbWF4OwogCXJ1bnRpbWUtPmh3LmZvcm1hdHMgPSBoaW5mby0+Zm9ybWF0czsKQEAgLTg0MiwxMiArODg3LDExIEBACiAvKgogICogSERBL0hETUkgYXV0byBwYXJzaW5nCiAgKi8KLXN0YXRpYyBpbnQgaGRtaV9yZWFkX3Bpbl9jb25uKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgcGluX25pZCkKK3N0YXRpYyBpbnQgaGRtaV9yZWFkX3Bpbl9jb25uKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgcGluX2lkeCkKIHsKIAlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaGRhX25pZF90IGNvbm5fbGlzdFtIREFfTUFYX0NPTk5FQ1RJT05TXTsKLQlpbnQgY29ubl9sZW4sIGN1cnI7Ci0JaW50IGluZGV4OworCXN0cnVjdCBoZG1pX3NwZWNfcGVyX3BpbiAqcGVyX3BpbiA9ICZzcGVjLT5waW5zW3Bpbl9pZHhdOworCWhkYV9uaWRfdCBwaW5fbmlkID0gcGVyX3Bpbi0+cGluX25pZDsKIAogCWlmICghKGdldF93Y2Fwcyhjb2RlYywgcGluX25pZCkgJiBBQ19XQ0FQX0NPTk5fTElTVCkpIHsKIAkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcKQEAgLTg1NywxOSArOTAxLDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY29ubl9sZW4gPSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyhjb2RlYywgcGluX25pZCwgY29ubl9saXN0LAotCQkJCQkgICBIREFfTUFYX0NPTk5FQ1RJT05TKTsKLQlpZiAoY29ubl9sZW4gPiAxKQotCQljdXJyID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBwaW5fbmlkLCAwLAotCQkJCQkgIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfU0VMLCAwKTsKLQllbHNlCi0JCWN1cnIgPSAwOwotCi0JaW5kZXggPSBoZGFfbm9kZV9pbmRleChzcGVjLT5waW4sIHBpbl9uaWQpOwotCWlmIChpbmRleCA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3BlYy0+cGluX2N2dFtpbmRleF0gPSBjb25uX2xpc3RbY3Vycl07CisJcGVyX3Bpbi0+bnVtX211eF9uaWRzID0gc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsIHBpbl9uaWQsCisJCQkJCQkJcGVyX3Bpbi0+bXV4X25pZHMsCisJCQkJCQkJSERBX01BWF9DT05ORUNUSU9OUyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg5Niw4ICs5MzAsOCBAQAogCQllbGQtPmVsZF92YWxpZAk9IDA7CiAKIAlwcmludGsoS0VSTl9JTkZPCi0JCSJIRE1JIHN0YXR1czogUGluPSVkIFByZXNlbmNlX0RldGVjdD0lZCBFTERfVmFsaWQ9JWRcbiIsCi0JCXBpbl9uaWQsIGVsZC0+bW9uaXRvcl9wcmVzZW50LCBlbGQtPmVsZF92YWxpZCk7CisJCSJIRE1JIHN0YXR1czogQ29kZWM9JWQgUGluPSVkIFByZXNlbmNlX0RldGVjdD0lZCBFTERfVmFsaWQ9JWRcbiIsCisJCWNvZGVjLT5hZGRyLCBwaW5fbmlkLCBlbGQtPm1vbml0b3JfcHJlc2VudCwgZWxkLT5lbGRfdmFsaWQpOwogCiAJaWYgKGVsZC0+ZWxkX3ZhbGlkKQogCQlpZiAoIXNuZF9oZG1pX2dldF9lbGQoZWxkLCBjb2RlYywgcGluX25pZCkpCkBAIC05MDksNDcgKzk0Myw3NSBAQAogc3RhdGljIGludCBoZG1pX2FkZF9waW4oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW5fbmlkKQogewogCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1bnNpZ25lZCBpbnQgY2FwcywgY29uZmlnOworCWludCBwaW5faWR4OworCXN0cnVjdCBoZG1pX3NwZWNfcGVyX3BpbiAqcGVyX3BpbjsKKwlzdHJ1Y3QgaGRtaV9lbGQgKmVsZDsKIAlpbnQgZXJyOwogCi0JaWYgKHNwZWMtPm51bV9waW5zID49IE1BWF9IRE1JX1BJTlMpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICJIRE1JOiBubyBzcGFjZSBmb3IgcGluICVkXG4iLCBwaW5fbmlkKTsKKwljYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBwaW5fbmlkLCBBQ19QQVJfUElOX0NBUCk7CisJaWYgKCEoY2FwcyAmIChBQ19QSU5DQVBfSERNSSB8IEFDX1BJTkNBUF9EUCkpKQorCQlyZXR1cm4gMDsKKworCWNvbmZpZyA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgcGluX25pZCwgMCwKKwkJCQlBQ19WRVJCX0dFVF9DT05GSUdfREVGQVVMVCwgMCk7CisJaWYgKGdldF9kZWZjZmdfY29ubmVjdChjb25maWcpID09IEFDX0pBQ0tfUE9SVF9OT05FKQorCQlyZXR1cm4gMDsKKworCWlmIChzbmRfQlVHX09OKHNwZWMtPm51bV9waW5zID49IE1BWF9IRE1JX1BJTlMpKQogCQlyZXR1cm4gLUUyQklHOwotCX0KKworCXBpbl9pZHggPSBzcGVjLT5udW1fcGluczsKKwlwZXJfcGluID0gJnNwZWMtPnBpbnNbcGluX2lkeF07CisJZWxkID0gJnBlcl9waW4tPnNpbmtfZWxkOworCisJcGVyX3Bpbi0+cGluX25pZCA9IHBpbl9uaWQ7CiAKIAllcnIgPSBzbmRfaGRhX2lucHV0X2phY2tfYWRkKGNvZGVjLCBwaW5fbmlkLAogCQkJCSAgICAgU05EX0pBQ0tfVklERU9PVVQsIE5VTEwpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JaGRtaV9wcmVzZW50X3NlbnNlKGNvZGVjLCBwaW5fbmlkLCAmc3BlYy0+c2lua19lbGRbc3BlYy0+bnVtX3BpbnNdKTsKKwllcnIgPSBoZG1pX3JlYWRfcGluX2Nvbm4oY29kZWMsIHBpbl9pZHgpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCi0Jc3BlYy0+cGluW3NwZWMtPm51bV9waW5zXSA9IHBpbl9uaWQ7CiAJc3BlYy0+bnVtX3BpbnMrKzsKIAotCXJldHVybiBoZG1pX3JlYWRfcGluX2Nvbm4oY29kZWMsIHBpbl9uaWQpOworCWhkbWlfcHJlc2VudF9zZW5zZShjb2RlYywgcGluX25pZCwgZWxkKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhkbWlfYWRkX2N2dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKK3N0YXRpYyBpbnQgaGRtaV9hZGRfY3Z0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgY3Z0X25pZCkKIHsKLQlpbnQgaSwgZm91bmRfcGluID0gMDsKIAlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX3BpbnM7IGkrKykKLQkJaWYgKG5pZCA9PSBzcGVjLT5waW5fY3Z0W2ldKSB7Ci0JCQlmb3VuZF9waW4gPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCWlmICghZm91bmRfcGluKSB7Ci0JCXNuZF9wcmludGRkKCJIRE1JOiBTa2lwcGluZyBub2RlICVkIChubyBjb25uZWN0aW9uKVxuIiwgbmlkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCWludCBjdnRfaWR4OworCXN0cnVjdCBoZG1pX3NwZWNfcGVyX2N2dCAqcGVyX2N2dDsKKwl1bnNpZ25lZCBpbnQgY2hhbnM7CisJaW50IGVycjsKIAogCWlmIChzbmRfQlVHX09OKHNwZWMtPm51bV9jdnRzID49IE1BWF9IRE1JX0NWVFMpKQogCQlyZXR1cm4gLUUyQklHOwogCi0Jc3BlYy0+Y3Z0W3NwZWMtPm51bV9jdnRzXSA9IG5pZDsKKwljaGFucyA9IGdldF93Y2Fwcyhjb2RlYywgY3Z0X25pZCk7CisJY2hhbnMgPSBnZXRfd2NhcHNfY2hhbm5lbHMoY2hhbnMpOworCisJY3Z0X2lkeCA9IHNwZWMtPm51bV9jdnRzOworCXBlcl9jdnQgPSAmc3BlYy0+Y3Z0c1tjdnRfaWR4XTsKKworCXBlcl9jdnQtPmN2dF9uaWQgPSBjdnRfbmlkOworCXBlcl9jdnQtPmNoYW5uZWxzX21pbiA9IDI7CisJaWYgKGNoYW5zIDw9IDE2KQorCQlwZXJfY3Z0LT5jaGFubmVsc19tYXggPSBjaGFuczsKKworCWVyciA9IHNuZF9oZGFfcXVlcnlfc3VwcG9ydGVkX3BjbShjb2RlYywgY3Z0X25pZCwKKwkJCQkJICAmcGVyX2N2dC0+cmF0ZXMsCisJCQkJCSAgJnBlcl9jdnQtPmZvcm1hdHMsCisJCQkJCSAgJnBlcl9jdnQtPm1heGJwcyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKIAlzcGVjLT5udW1fY3Z0cysrOwogCiAJcmV0dXJuIDA7CkBAIC05NTksOCArMTAyMSw2IEBACiB7CiAJaGRhX25pZF90IG5pZDsKIAlpbnQgaSwgbm9kZXM7Ci0JaW50IG51bV90bXBfY3Z0cyA9IDA7Ci0JaGRhX25pZF90IHRtcF9jdnRbTUFYX0hETUlfQ1ZUU107CiAKIAlub2RlcyA9IHNuZF9oZGFfZ2V0X3N1Yl9ub2Rlcyhjb2RlYywgY29kZWMtPmFmZywgJm5pZCk7CiAJaWYgKCFuaWQgfHwgbm9kZXMgPCAwKSB7CkBAIC05NzEsNyArMTAzMSw2IEBACiAJZm9yIChpID0gMDsgaSA8IG5vZGVzOyBpKyssIG5pZCsrKSB7CiAJCXVuc2lnbmVkIGludCBjYXBzOwogCQl1bnNpZ25lZCBpbnQgdHlwZTsKLQkJdW5zaWduZWQgaW50IGNvbmZpZzsKIAogCQljYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9BVURJT19XSURHRVRfQ0FQKTsKIAkJdHlwZSA9IGdldF93Y2Fwc190eXBlKGNhcHMpOwpAQCAtOTgxLDMyICsxMDQwLDE0IEBACiAKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgQUNfV0lEX0FVRF9PVVQ6Ci0JCQlpZiAobnVtX3RtcF9jdnRzID49IE1BWF9IRE1JX0NWVFMpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkgICAiSERNSTogbm8gc3BhY2UgZm9yIGNvbnZlcnRlciAlZFxuIiwgbmlkKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXRtcF9jdnRbbnVtX3RtcF9jdnRzXSA9IG5pZDsKLQkJCW51bV90bXBfY3Z0cysrOworCQkJaGRtaV9hZGRfY3Z0KGNvZGVjLCBuaWQpOwogCQkJYnJlYWs7CiAJCWNhc2UgQUNfV0lEX1BJTjoKLQkJCWNhcHMgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX1BJTl9DQVApOwotCQkJaWYgKCEoY2FwcyAmIChBQ19QSU5DQVBfSERNSSB8IEFDX1BJTkNBUF9EUCkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQljb25maWcgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJICAgICBBQ19WRVJCX0dFVF9DT05GSUdfREVGQVVMVCwgMCk7Ci0JCQlpZiAoZ2V0X2RlZmNmZ19jb25uZWN0KGNvbmZpZykgPT0gQUNfSkFDS19QT1JUX05PTkUpCi0JCQkJY29udGludWU7Ci0KIAkJCWhkbWlfYWRkX3Bpbihjb2RlYywgbmlkKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IG51bV90bXBfY3Z0czsgaSsrKQotCQloZG1pX2FkZF9jdnQoY29kZWMsIHRtcF9jdnRbaV0pOwotCiAJLyoKIAkgKiBHNDUvSWJleFBlYWsgZG9uJ3Qgc3VwcG9ydCBFUFNTOiB0aGUgdW5zb2xpY2l0ZWQgcGluIGhvdCBwbHVnIGV2ZW50CiAJICogY2FuIGJlIGxvc3QgYW5kIHByZXNlbmNlIHNlbnNlIHZlcmIgd2lsbCBiZWNvbWUgaW5hY2N1cmF0ZSBpZiB0aGUKQEAgLTEwMjMsNyArMTA2NCw3IEBACiAKIC8qCiAgKi8KLXN0YXRpYyBjaGFyICpnZW5lcmljX2hkbWlfcGNtX25hbWVzW01BWF9IRE1JX0NWVFNdID0geworc3RhdGljIGNoYXIgKmdlbmVyaWNfaGRtaV9wY21fbmFtZXNbTUFYX0hETUlfUElOU10gPSB7CiAJIkhETUkgMCIsCiAJIkhETUkgMSIsCiAJIkhETUkgMiIsCkBAIC0xMDQwLDUxICsxMDgxLDg0IEBACiAJCQkJCSAgIHVuc2lnbmVkIGludCBmb3JtYXQsCiAJCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCWhkbWlfc2V0X2NoYW5uZWxfY291bnQoY29kZWMsIGhpbmZvLT5uaWQsCi0JCQkgICAgICAgc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVscyk7CisJaGRhX25pZF90IGN2dF9uaWQgPSBoaW5mby0+bmlkOworCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgcGluX2lkeCA9IGhpbmZvX3RvX3Bpbl9pbmRleChzcGVjLCBoaW5mbyk7CisJaGRhX25pZF90IHBpbl9uaWQgPSBzcGVjLT5waW5zW3Bpbl9pZHhdLnBpbl9uaWQ7CiAKLQloZG1pX3NldHVwX2F1ZGlvX2luZm9mcmFtZShjb2RlYywgaGluZm8tPm5pZCwgc3Vic3RyZWFtKTsKKwloZG1pX3NldF9jaGFubmVsX2NvdW50KGNvZGVjLCBjdnRfbmlkLCBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzKTsKIAotCXJldHVybiBoZG1pX3NldHVwX3N0cmVhbShjb2RlYywgaGluZm8tPm5pZCwgc3RyZWFtX3RhZywgZm9ybWF0KTsKKwloZG1pX3NldHVwX2F1ZGlvX2luZm9mcmFtZShjb2RlYywgcGluX2lkeCwgc3Vic3RyZWFtKTsKKworCXJldHVybiBoZG1pX3NldHVwX3N0cmVhbShjb2RlYywgY3Z0X25pZCwgcGluX25pZCwgc3RyZWFtX3RhZywgZm9ybWF0KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBnZW5lcmljX2hkbWlfcGNtX3BsYXliYWNrID0gewotCS5zdWJzdHJlYW1zID0gMSwKLQkuY2hhbm5lbHNfbWluID0gMiwKLQkub3BzID0gewotCQkub3BlbiA9IGhkbWlfcGNtX29wZW4sCi0JCS5wcmVwYXJlID0gZ2VuZXJpY19oZG1pX3BsYXliYWNrX3BjbV9wcmVwYXJlLAotCX0sCitzdGF0aWMgaW50IGdlbmVyaWNfaGRtaV9wbGF5YmFja19wY21fY2xlYW51cChzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCQkgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgY3Z0X2lkeCwgcGluX2lkeDsKKwlzdHJ1Y3QgaGRtaV9zcGVjX3Blcl9jdnQgKnBlcl9jdnQ7CisJc3RydWN0IGhkbWlfc3BlY19wZXJfcGluICpwZXJfcGluOworCWludCBwaW5jdGw7CisKKwlzbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLCBoaW5mby0+bmlkKTsKKworCWlmIChoaW5mby0+bmlkKSB7CisJCWN2dF9pZHggPSBjdnRfbmlkX3RvX2N2dF9pbmRleChzcGVjLCBoaW5mby0+bmlkKTsKKwkJaWYgKHNuZF9CVUdfT04oY3Z0X2lkeCA8IDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXBlcl9jdnQgPSAmc3BlYy0+Y3Z0c1tjdnRfaWR4XTsKKworCQlzbmRfQlVHX09OKCFwZXJfY3Z0LT5hc3NpZ25lZCk7CisJCXBlcl9jdnQtPmFzc2lnbmVkID0gMDsKKwkJaGluZm8tPm5pZCA9IDA7CisKKwkJcGluX2lkeCA9IGhpbmZvX3RvX3Bpbl9pbmRleChzcGVjLCBoaW5mbyk7CisJCWlmIChzbmRfQlVHX09OKHBpbl9pZHggPCAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlwZXJfcGluID0gJnNwZWMtPnBpbnNbcGluX2lkeF07CisKKwkJcGluY3RsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBwZXJfcGluLT5waW5fbmlkLCAwLAorCQkJCQkgICAgQUNfVkVSQl9HRVRfUElOX1dJREdFVF9DT05UUk9MLCAwKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcGVyX3Bpbi0+cGluX25pZCwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJCSAgICBwaW5jdGwgJiB+UElOX09VVCk7CisJCXNuZF9oZGFfc3BkaWZfY3Rsc191bmFzc2lnbihjb2RlYywgcGluX2lkeCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9vcHMgZ2VuZXJpY19vcHMgPSB7CisJLm9wZW4gPSBoZG1pX3BjbV9vcGVuLAorCS5wcmVwYXJlID0gZ2VuZXJpY19oZG1pX3BsYXliYWNrX3BjbV9wcmVwYXJlLAorCS5jbGVhbnVwID0gZ2VuZXJpY19oZG1pX3BsYXliYWNrX3BjbV9jbGVhbnVwLAogfTsKIAogc3RhdGljIGludCBnZW5lcmljX2hkbWlfYnVpbGRfcGNtcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3RydWN0IGhkYV9wY20gKmluZm8gPSBzcGVjLT5wY21fcmVjOwotCWludCBpOworCWludCBwaW5faWR4OwogCi0JY29kZWMtPm51bV9wY21zID0gc3BlYy0+bnVtX2N2dHM7Ci0JY29kZWMtPnBjbV9pbmZvID0gaW5mbzsKLQotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX3BjbXM7IGkrKywgaW5mbysrKSB7Ci0JCXVuc2lnbmVkIGludCBjaGFuczsKKwlmb3IgKHBpbl9pZHggPSAwOyBwaW5faWR4IDwgc3BlYy0+bnVtX3BpbnM7IHBpbl9pZHgrKykgeworCQlzdHJ1Y3QgaGRhX3BjbSAqaW5mbzsKIAkJc3RydWN0IGhkYV9wY21fc3RyZWFtICpwc3RyOwogCi0JCWNoYW5zID0gZ2V0X3djYXBzKGNvZGVjLCBzcGVjLT5jdnRbaV0pOwotCQljaGFucyA9IGdldF93Y2Fwc19jaGFubmVscyhjaGFucyk7Ci0KLQkJaW5mby0+bmFtZSA9IGdlbmVyaWNfaGRtaV9wY21fbmFtZXNbaV07CisJCWluZm8gPSAmc3BlYy0+cGNtX3JlY1twaW5faWR4XTsKKwkJaW5mby0+bmFtZSA9IGdlbmVyaWNfaGRtaV9wY21fbmFtZXNbcGluX2lkeF07CiAJCWluZm8tPnBjbV90eXBlID0gSERBX1BDTV9UWVBFX0hETUk7CisKIAkJcHN0ciA9ICZpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS107Ci0JCWlmIChzcGVjLT5wY21fcGxheWJhY2spCi0JCQkqcHN0ciA9ICpzcGVjLT5wY21fcGxheWJhY2s7Ci0JCWVsc2UKLQkJCSpwc3RyID0gZ2VuZXJpY19oZG1pX3BjbV9wbGF5YmFjazsKLQkJcHN0ci0+bmlkID0gc3BlYy0+Y3Z0W2ldOwotCQlpZiAocHN0ci0+Y2hhbm5lbHNfbWF4IDw9IDIgJiYgY2hhbnMgJiYgY2hhbnMgPD0gMTYpCi0JCQlwc3RyLT5jaGFubmVsc19tYXggPSBjaGFuczsKKwkJcHN0ci0+c3Vic3RyZWFtcyA9IDE7CisJCXBzdHItPm9wcyA9IGdlbmVyaWNfb3BzOworCQkvKiBvdGhlciBwc3RyIGZpZWxkcyBhcmUgc2V0IGluIG9wZW4gKi8KIAl9CiAKKwljb2RlYy0+bnVtX3BjbXMgPSBzcGVjLT5udW1fcGluczsKKwljb2RlYy0+cGNtX2luZm8gPSBzcGVjLT5wY21fcmVjOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwOTIsMTIgKzExNjYsMTYgQEAKIHsKIAlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaW50IGVycjsKLQlpbnQgaTsKKwlpbnQgcGluX2lkeDsKIAotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX3BjbXM7IGkrKykgewotCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywgc3BlYy0+Y3Z0W2ldKTsKKwlmb3IgKHBpbl9pZHggPSAwOyBwaW5faWR4IDwgc3BlYy0+bnVtX3BpbnM7IHBpbl9pZHgrKykgeworCQlzdHJ1Y3QgaGRtaV9zcGVjX3Blcl9waW4gKnBlcl9waW4gPSAmc3BlYy0+cGluc1twaW5faWR4XTsKKwkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoY29kZWMsCisJCQkJCQkgICAgcGVyX3Bpbi0+cGluX25pZCwKKwkJCQkJCSAgICBwZXJfcGluLT5tdXhfbmlkc1swXSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKKwkJc25kX2hkYV9zcGRpZl9jdGxzX3VuYXNzaWduKGNvZGVjLCBwaW5faWR4KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTExMDYsMTMgKzExODQsMTkgQEAKIHN0YXRpYyBpbnQgZ2VuZXJpY19oZG1pX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBpOworCWludCBwaW5faWR4OwogCi0JZm9yIChpID0gMDsgc3BlYy0+cGluW2ldOyBpKyspIHsKLQkJaGRtaV9lbmFibGVfb3V0cHV0KGNvZGVjLCBzcGVjLT5waW5baV0pOwotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBzcGVjLT5waW5baV0sIDAsCisJZm9yIChwaW5faWR4ID0gMDsgcGluX2lkeCA8IHNwZWMtPm51bV9waW5zOyBwaW5faWR4KyspIHsKKwkJc3RydWN0IGhkbWlfc3BlY19wZXJfcGluICpwZXJfcGluID0gJnNwZWMtPnBpbnNbcGluX2lkeF07CisJCWhkYV9uaWRfdCBwaW5fbmlkID0gcGVyX3Bpbi0+cGluX25pZDsKKwkJc3RydWN0IGhkbWlfZWxkICplbGQgPSAmcGVyX3Bpbi0+c2lua19lbGQ7CisKKwkJaGRtaV9pbml0X3Bpbihjb2RlYywgcGluX25pZCk7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHBpbl9uaWQsIDAsCiAJCQkJICAgIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwKLQkJCQkgICAgQUNfVVNSU1BfRU4gfCBzcGVjLT5waW5baV0pOworCQkJCSAgICBBQ19VU1JTUF9FTiB8IHBpbl9uaWQpOworCisJCXNuZF9oZGFfZWxkX3Byb2NfbmV3KGNvZGVjLCBlbGQsIHBpbl9pZHgpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTExMjAsMTAgKzEyMDQsMTQgQEAKIHN0YXRpYyB2b2lkIGdlbmVyaWNfaGRtaV9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaTsKKwlpbnQgcGluX2lkeDsKIAotCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fcGluczsgaSsrKQotCQlzbmRfaGRhX2VsZF9wcm9jX2ZyZWUoY29kZWMsICZzcGVjLT5zaW5rX2VsZFtpXSk7CisJZm9yIChwaW5faWR4ID0gMDsgcGluX2lkeCA8IHNwZWMtPm51bV9waW5zOyBwaW5faWR4KyspIHsKKwkJc3RydWN0IGhkbWlfc3BlY19wZXJfcGluICpwZXJfcGluID0gJnNwZWMtPnBpbnNbcGluX2lkeF07CisJCXN0cnVjdCBoZG1pX2VsZCAqZWxkID0gJnBlcl9waW4tPnNpbmtfZWxkOworCisJCXNuZF9oZGFfZWxkX3Byb2NfZnJlZShjb2RlYywgZWxkKTsKKwl9CiAJc25kX2hkYV9pbnB1dF9qYWNrX2ZyZWUoY29kZWMpOwogCiAJa2ZyZWUoc3BlYyk7CkBAIC0xMTQwLDcgKzEyMjgsNiBAQAogc3RhdGljIGludCBwYXRjaF9nZW5lcmljX2hkbWkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGhkbWlfc3BlYyAqc3BlYzsKLQlpbnQgaTsKIAogCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwogCWlmIChzcGVjID09IE5VTEwpCkBAIC0xMTU0LDE1ICsxMjQxLDY5IEBACiAJfQogCWNvZGVjLT5wYXRjaF9vcHMgPSBnZW5lcmljX2hkbWlfcGF0Y2hfb3BzOwogCi0JZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9waW5zOyBpKyspCi0JCXNuZF9oZGFfZWxkX3Byb2NfbmV3KGNvZGVjLCAmc3BlYy0+c2lua19lbGRbaV0sIGkpOwotCiAJaW5pdF9jaGFubmVsX2FsbG9jYXRpb25zKCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogLyoKKyAqIFNoYXJlZCBub24tZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbnMKKyAqLworCitzdGF0aWMgaW50IHNpbXBsZV9wbGF5YmFja19idWlsZF9wY21zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgaGRhX3BjbSAqaW5mbyA9IHNwZWMtPnBjbV9yZWM7CisJaW50IGk7CisKKwljb2RlYy0+bnVtX3BjbXMgPSBzcGVjLT5udW1fY3Z0czsKKwljb2RlYy0+cGNtX2luZm8gPSBpbmZvOworCisJZm9yIChpID0gMDsgaSA8IGNvZGVjLT5udW1fcGNtczsgaSsrLCBpbmZvKyspIHsKKwkJdW5zaWduZWQgaW50IGNoYW5zOworCQlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKnBzdHI7CisKKwkJY2hhbnMgPSBnZXRfd2NhcHMoY29kZWMsIHNwZWMtPmN2dHNbaV0uY3Z0X25pZCk7CisJCWNoYW5zID0gZ2V0X3djYXBzX2NoYW5uZWxzKGNoYW5zKTsKKworCQlpbmZvLT5uYW1lID0gZ2VuZXJpY19oZG1pX3BjbV9uYW1lc1tpXTsKKwkJaW5mby0+cGNtX3R5cGUgPSBIREFfUENNX1RZUEVfSERNSTsKKwkJcHN0ciA9ICZpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS107CisJCXNuZF9CVUdfT04oIXNwZWMtPnBjbV9wbGF5YmFjayk7CisJCSpwc3RyID0gKnNwZWMtPnBjbV9wbGF5YmFjazsKKwkJcHN0ci0+bmlkID0gc3BlYy0+Y3Z0c1tpXS5jdnRfbmlkOworCQlpZiAocHN0ci0+Y2hhbm5lbHNfbWF4IDw9IDIgJiYgY2hhbnMgJiYgY2hhbnMgPD0gMTYpCisJCQlwc3RyLT5jaGFubmVsc19tYXggPSBjaGFuczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaW1wbGVfcGxheWJhY2tfYnVpbGRfY29udHJvbHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBlcnI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPm51bV9wY21zOyBpKyspIHsKKwkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoY29kZWMsCisJCQkJCQkgICAgc3BlYy0+Y3Z0c1tpXS5jdnRfbmlkLAorCQkJCQkJICAgIHNwZWMtPmN2dHNbaV0uY3Z0X25pZCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2ltcGxlX3BsYXliYWNrX2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJa2ZyZWUoc3BlYyk7Cit9CisKKy8qCiAgKiBOdmlkaWEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zCiAgKi8KIApAQCAtMTM1Miw2ICsxNDkzLDkgQEAKIAlpbnQgY2hzOwogCXVuc2lnbmVkIGludCBkYXRhRENDMSwgZGF0YURDQzIsIGNoYW5uZWxfaWQ7CiAJaW50IGk7CisJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZGFfc3BkaWZfb3V0ICpzcGRpZiA9CisJCXNuZF9oZGFfc3BkaWZfb3V0X29mX25pZChjb2RlYywgc3BlYy0+Y3Z0c1swXS5jdnRfbmlkKTsKIAogCW11dGV4X2xvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7CiAKQEAgLTEzNjEsMTIgKzE1MDUsMTIgQEAKIAlkYXRhRENDMiA9IDB4MjsKIAogCS8qIHR1cm4gb2ZmIFNQRElGIG9uY2U7IG90aGVyd2lzZSB0aGUgSUVDOTU4IGJpdHMgd29uJ3QgYmUgdXBkYXRlZCAqLwotCWlmIChjb2RlYy0+c3BkaWZfc3RhdHVzX3Jlc2V0ICYmIChjb2RlYy0+c3BkaWZfY3RscyAmIEFDX0RJRzFfRU5BQkxFKSkKKwlpZiAoY29kZWMtPnNwZGlmX3N0YXR1c19yZXNldCAmJiAoc3BkaWYtPmN0bHMgJiBBQ19ESUcxX0VOQUJMRSkpCiAJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsCiAJCQkJbnZoZG1pX21hc3Rlcl9jb25fbmlkXzd4LAogCQkJCTAsCiAJCQkJQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsCi0JCQkJY29kZWMtPnNwZGlmX2N0bHMgJiB+QUNfRElHMV9FTkFCTEUgJiAweGZmKTsKKwkJCQlzcGRpZi0+Y3RscyAmIH5BQ19ESUcxX0VOQUJMRSAmIDB4ZmYpOwogCiAJLyogc2V0IHRoZSBzdHJlYW0gaWQgKi8KIAlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBudmhkbWlfbWFzdGVyX2Nvbl9uaWRfN3gsIDAsCkBAIC0xMzc4LDEyICsxNTIyLDEyIEBACiAKIAkvKiB0dXJuIG9uIGFnYWluIChpZiBuZWVkZWQpICovCiAJLyogZW5hYmxlIGFuZCBzZXQgdGhlIGNoYW5uZWwgc3RhdHVzIGF1ZGlvL2RhdGEgZmxhZyAqLwotCWlmIChjb2RlYy0+c3BkaWZfc3RhdHVzX3Jlc2V0ICYmIChjb2RlYy0+c3BkaWZfY3RscyAmIEFDX0RJRzFfRU5BQkxFKSkgeworCWlmIChjb2RlYy0+c3BkaWZfc3RhdHVzX3Jlc2V0ICYmIChzcGRpZi0+Y3RscyAmIEFDX0RJRzFfRU5BQkxFKSkgewogCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLAogCQkJCW52aGRtaV9tYXN0ZXJfY29uX25pZF83eCwKIAkJCQkwLAogCQkJCUFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLAotCQkJCWNvZGVjLT5zcGRpZl9jdGxzICYgMHhmZik7CisJCQkJc3BkaWYtPmN0bHMgJiAweGZmKTsKIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywKIAkJCQludmhkbWlfbWFzdGVyX2Nvbl9uaWRfN3gsCiAJCQkJMCwKQEAgLTE0MDAsMTIgKzE1NDQsMTIgQEAKIAkJICpvdGhlcndpc2UgdGhlIElFQzk1OCBiaXRzIHdvbid0IGJlIHVwZGF0ZWQKIAkJICovCiAJCWlmIChjb2RlYy0+c3BkaWZfc3RhdHVzX3Jlc2V0ICYmCi0JCShjb2RlYy0+c3BkaWZfY3RscyAmIEFDX0RJRzFfRU5BQkxFKSkKKwkJKHNwZGlmLT5jdGxzICYgQUNfRElHMV9FTkFCTEUpKQogCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywKIAkJCQludmhkbWlfY29uX25pZHNfN3hbaV0sCiAJCQkJMCwKIAkJCQlBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwKLQkJCQljb2RlYy0+c3BkaWZfY3RscyAmIH5BQ19ESUcxX0VOQUJMRSAmIDB4ZmYpOworCQkJCXNwZGlmLT5jdGxzICYgfkFDX0RJRzFfRU5BQkxFICYgMHhmZik7CiAJCS8qIHNldCB0aGUgc3RyZWFtIGlkICovCiAJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsCiAJCQkJbnZoZG1pX2Nvbl9uaWRzXzd4W2ldLApAQCAtMTQyMSwxMiArMTU2NSwxMiBAQAogCQkvKiB0dXJuIG9uIGFnYWluIChpZiBuZWVkZWQpICovCiAJCS8qIGVuYWJsZSBhbmQgc2V0IHRoZSBjaGFubmVsIHN0YXR1cyBhdWRpby9kYXRhIGZsYWcgKi8KIAkJaWYgKGNvZGVjLT5zcGRpZl9zdGF0dXNfcmVzZXQgJiYKLQkJKGNvZGVjLT5zcGRpZl9jdGxzICYgQUNfRElHMV9FTkFCTEUpKSB7CisJCShzcGRpZi0+Y3RscyAmIEFDX0RJRzFfRU5BQkxFKSkgewogCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywKIAkJCQkJbnZoZG1pX2Nvbl9uaWRzXzd4W2ldLAogCQkJCQkwLAogCQkJCQlBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwKLQkJCQkJY29kZWMtPnNwZGlmX2N0bHMgJiAweGZmKTsKKwkJCQkJc3BkaWYtPmN0bHMgJiAweGZmKTsKIAkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsCiAJCQkJCW52aGRtaV9jb25fbmlkc183eFtpXSwKIAkJCQkJMCwKQEAgLTE0NzEsMTcgKzE2MTUsMTcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NvZGVjX29wcyBudmhkbWlfcGF0Y2hfb3BzXzhjaF83eCA9IHsKLQkuYnVpbGRfY29udHJvbHMgPSBnZW5lcmljX2hkbWlfYnVpbGRfY29udHJvbHMsCi0JLmJ1aWxkX3BjbXMgPSBnZW5lcmljX2hkbWlfYnVpbGRfcGNtcywKKwkuYnVpbGRfY29udHJvbHMgPSBzaW1wbGVfcGxheWJhY2tfYnVpbGRfY29udHJvbHMsCisJLmJ1aWxkX3BjbXMgPSBzaW1wbGVfcGxheWJhY2tfYnVpbGRfcGNtcywKIAkuaW5pdCA9IG52aGRtaV83eF9pbml0LAotCS5mcmVlID0gZ2VuZXJpY19oZG1pX2ZyZWUsCisJLmZyZWUgPSBzaW1wbGVfcGxheWJhY2tfZnJlZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NvZGVjX29wcyBudmhkbWlfcGF0Y2hfb3BzXzJjaCA9IHsKLQkuYnVpbGRfY29udHJvbHMgPSBnZW5lcmljX2hkbWlfYnVpbGRfY29udHJvbHMsCi0JLmJ1aWxkX3BjbXMgPSBnZW5lcmljX2hkbWlfYnVpbGRfcGNtcywKKwkuYnVpbGRfY29udHJvbHMgPSBzaW1wbGVfcGxheWJhY2tfYnVpbGRfY29udHJvbHMsCisJLmJ1aWxkX3BjbXMgPSBzaW1wbGVfcGxheWJhY2tfYnVpbGRfcGNtcywKIAkuaW5pdCA9IG52aGRtaV83eF9pbml0LAotCS5mcmVlID0gZ2VuZXJpY19oZG1pX2ZyZWUsCisJLmZyZWUgPSBzaW1wbGVfcGxheWJhY2tfZnJlZSwKIH07CiAKIHN0YXRpYyBpbnQgcGF0Y2hfbnZoZG1pXzJjaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTE0OTgsNyArMTY0Miw3IEBACiAJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKIAlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IG52aGRtaV9tYXN0ZXJfY29uX25pZF83eDsKIAlzcGVjLT5udW1fY3Z0cyA9IDE7Ci0Jc3BlYy0+Y3Z0WzBdID0gbnZoZG1pX21hc3Rlcl9jb25fbmlkXzd4OworCXNwZWMtPmN2dHNbMF0uY3Z0X25pZCA9IG52aGRtaV9tYXN0ZXJfY29uX25pZF83eDsKIAlzcGVjLT5wY21fcGxheWJhY2sgPSAmbnZoZG1pX3BjbV9wbGF5YmFja18yY2g7CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gbnZoZG1pX3BhdGNoX29wc18yY2g7CkBAIC0xNTQ5LDExICsxNjkzLDExIEBACiAJCQkJCSAgc3Vic3RyZWFtKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBzcGVjLT5jdnRbMF0sIDAsIEFDX1ZFUkJfU0VUX0NWVF9DSEFOX0NPVU5ULAotCQkJICAgIGNoYW5zIC0gMSk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgc3BlYy0+Y3Z0c1swXS5jdnRfbmlkLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX0NWVF9DSEFOX0NPVU5ULCBjaGFucyAtIDEpOwogCS8qIEZJWE1FOiBYWFggKi8KIAlmb3IgKGkgPSAwOyBpIDwgY2hhbnM7IGkrKykgewotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBzcGVjLT5jdnRbMF0sIDAsCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNwZWMtPmN2dHNbMF0uY3Z0X25pZCwgMCwKIAkJCQkgICAgQUNfVkVSQl9TRVRfSERNSV9DSEFOX1NMT1QsCiAJCQkJICAgIChpIDw8IDQpIHwgaSk7CiAJfQpAQCAtMTU4NCwxOCArMTcyOCwxOCBAQAogCiAJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgYXRpaGRtaV9iYXNpY19pbml0KTsKIAkvKiBTSSBjb2RlYyByZXF1aXJlcyB0byB1bm11dGUgdGhlIHBpbiAqLwotCWlmIChnZXRfd2NhcHMoY29kZWMsIHNwZWMtPnBpblswXSkgJiBBQ19XQ0FQX09VVF9BTVApCi0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNwZWMtPnBpblswXSwgMCwKKwlpZiAoZ2V0X3djYXBzKGNvZGVjLCBzcGVjLT5waW5zWzBdLnBpbl9uaWQpICYgQUNfV0NBUF9PVVRfQU1QKQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBzcGVjLT5waW5zWzBdLnBpbl9uaWQsIDAsCiAJCQkJICAgIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCiAJCQkJICAgIEFNUF9PVVRfVU5NVVRFKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY29kZWNfb3BzIGF0aWhkbWlfcGF0Y2hfb3BzID0gewotCS5idWlsZF9jb250cm9scyA9IGdlbmVyaWNfaGRtaV9idWlsZF9jb250cm9scywKLQkuYnVpbGRfcGNtcyA9IGdlbmVyaWNfaGRtaV9idWlsZF9wY21zLAorCS5idWlsZF9jb250cm9scyA9IHNpbXBsZV9wbGF5YmFja19idWlsZF9jb250cm9scywKKwkuYnVpbGRfcGNtcyA9IHNpbXBsZV9wbGF5YmFja19idWlsZF9wY21zLAogCS5pbml0ID0gYXRpaGRtaV9pbml0LAotCS5mcmVlID0gZ2VuZXJpY19oZG1pX2ZyZWUsCisJLmZyZWUgPSBzaW1wbGVfcGxheWJhY2tfZnJlZSwKIH07CiAKIApAQCAtMTYxMyw4ICsxNzU3LDggQEAKIAlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSAyOwogCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gQVRJSERNSV9DVlRfTklEOwogCXNwZWMtPm51bV9jdnRzID0gMTsKLQlzcGVjLT5jdnRbMF0gPSBBVElIRE1JX0NWVF9OSUQ7Ci0Jc3BlYy0+cGluWzBdID0gQVRJSERNSV9QSU5fTklEOworCXNwZWMtPmN2dHNbMF0uY3Z0X25pZCA9IEFUSUhETUlfQ1ZUX05JRDsKKwlzcGVjLT5waW5zWzBdLnBpbl9uaWQgPSBBVElIRE1JX1BJTl9OSUQ7CiAJc3BlYy0+cGNtX3BsYXliYWNrID0gJmF0aWhkbWlfcGNtX2RpZ2l0YWxfcGxheWJhY2s7CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gYXRpaGRtaV9wYXRjaF9vcHM7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCmluZGV4IDdhNGUxMDAuLjUyY2UwNzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFVuaXZlcnNhbCBJbnRlcmZhY2UgZm9yIEludGVsIEhpZ2ggRGVmaW5pdGlvbiBBdWRpbyBDb2RlYwogICoKLSAqIEhEIGF1ZGlvIGludGVyZmFjZSBwYXRjaCBmb3IgQUxDIDI2MC84ODAvODgyIGNvZGVjcworICogSEQgYXVkaW8gaW50ZXJmYWNlIHBhdGNoIGZvciBSZWFsdGVrIEFMQyBjb2RlY3MKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgS2FpbGFuZyBZYW5nIDxrYWlsYW5nQHJlYWx0ZWsuY29tLnR3PgogICogICAgICAgICAgICAgICAgICAgIFBlaVNlbiBIb3UgPHBzaG91QHJlYWx0ZWsuY29tLnR3PgpAQCAtMzMsMjM2ICszMywxMSBAQAogI2luY2x1ZGUgImhkYV9sb2NhbC5oIgogI2luY2x1ZGUgImhkYV9iZWVwLmgiCiAKLSNkZWZpbmUgQUxDODgwX0ZST05UX0VWRU5UCQkweDAxCi0jZGVmaW5lIEFMQzg4MF9EQ1ZPTF9FVkVOVAkJMHgwMgotI2RlZmluZSBBTEM4ODBfSFBfRVZFTlQJCQkweDA0Ci0jZGVmaW5lIEFMQzg4MF9NSUNfRVZFTlQJCTB4MDgKLQotLyogQUxDODgwIGJvYXJkIGNvbmZpZyB0eXBlICovCi1lbnVtIHsKLQlBTEM4ODBfM1NULAotCUFMQzg4MF8zU1RfRElHLAotCUFMQzg4MF81U1QsCi0JQUxDODgwXzVTVF9ESUcsCi0JQUxDODgwX1c4MTAsCi0JQUxDODgwX1o3MVYsCi0JQUxDODgwXzZTVCwKLQlBTEM4ODBfNlNUX0RJRywKLQlBTEM4ODBfRjE3MzQsCi0JQUxDODgwX0FTVVMsCi0JQUxDODgwX0FTVVNfRElHLAotCUFMQzg4MF9BU1VTX1cxViwKLQlBTEM4ODBfQVNVU19ESUcyLAotCUFMQzg4MF9GVUpJVFNVLAotCUFMQzg4MF9VTklXSUxMX0RJRywKLQlBTEM4ODBfVU5JV0lMTCwKLQlBTEM4ODBfVU5JV0lMTF9QNTMsCi0JQUxDODgwX0NMRVZPLAotCUFMQzg4MF9UQ0xfUzcwMCwKLQlBTEM4ODBfTEcsCi0JQUxDODgwX0xHX0xXLAotCUFMQzg4MF9NRURJT05fUklNLAotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLQlBTEM4ODBfVEVTVCwKLSNlbmRpZgotCUFMQzg4MF9BVVRPLAotCUFMQzg4MF9NT0RFTF9MQVNUIC8qIGxhc3QgdGFnICovCi19OwotCi0vKiBBTEMyNjAgbW9kZWxzICovCi1lbnVtIHsKLQlBTEMyNjBfQkFTSUMsCi0JQUxDMjYwX0hQLAotCUFMQzI2MF9IUF9EQzc2MDAsCi0JQUxDMjYwX0hQXzMwMTMsCi0JQUxDMjYwX0ZVSklUU1VfUzcwMlgsCi0JQUxDMjYwX0FDRVIsCi0JQUxDMjYwX1dJTEwsCi0JQUxDMjYwX1JFUExBQ0VSXzY3MlYsCi0JQUxDMjYwX0ZBVk9SSVQxMDAsCi0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotCUFMQzI2MF9URVNULAotI2VuZGlmCi0JQUxDMjYwX0FVVE8sCi0JQUxDMjYwX01PREVMX0xBU1QgLyogbGFzdCB0YWcgKi8KLX07Ci0KLS8qIEFMQzI2MiBtb2RlbHMgKi8KLWVudW0gewotCUFMQzI2Ml9CQVNJQywKLQlBTEMyNjJfSElQUE8sCi0JQUxDMjYyX0hJUFBPXzEsCi0JQUxDMjYyX0ZVSklUU1UsCi0JQUxDMjYyX0hQX0JQQywKLQlBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMLAotCUFMQzI2Ml9IUF9CUENfRDcwMDBfV0YsCi0JQUxDMjYyX0hQX1RDX1Q1NzM1LAotCUFMQzI2Ml9IUF9SUDU3MDAsCi0JQUxDMjYyX0JFTlFfRUQ4LAotCUFMQzI2Ml9TT05ZX0FTU0FNRCwKLQlBTEMyNjJfQkVOUV9UMzEsCi0JQUxDMjYyX1VMVFJBLAotCUFMQzI2Ml9MRU5PVk9fMzAwMCwKLQlBTEMyNjJfTkVDLAotCUFMQzI2Ml9UT1NISUJBX1MwNiwKLQlBTEMyNjJfVE9TSElCQV9SWDEsCi0JQUxDMjYyX1RZQU4sCi0JQUxDMjYyX0FVVE8sCi0JQUxDMjYyX01PREVMX0xBU1QgLyogbGFzdCB0YWcgKi8KLX07Ci0KLS8qIEFMQzI2OCBtb2RlbHMgKi8KLWVudW0gewotCUFMQzI2N19RVUFOVEFfSUwxLAotCUFMQzI2OF8zU1QsCi0JQUxDMjY4X1RPU0hJQkEsCi0JQUxDMjY4X0FDRVIsCi0JQUxDMjY4X0FDRVJfRE1JQywKLQlBTEMyNjhfQUNFUl9BU1BJUkVfT05FLAotCUFMQzI2OF9ERUxMLAotCUFMQzI2OF9aRVBUTywKLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0JQUxDMjY4X1RFU1QsCi0jZW5kaWYKLQlBTEMyNjhfQVVUTywKLQlBTEMyNjhfTU9ERUxfTEFTVCAvKiBsYXN0IHRhZyAqLwotfTsKLQotLyogQUxDMjY5IG1vZGVscyAqLwotZW51bSB7Ci0JQUxDMjY5X0JBU0lDLAotCUFMQzI2OV9RVUFOVEFfRkwxLAotCUFMQzI2OV9BTUlDLAotCUFMQzI2OV9ETUlDLAotCUFMQzI2OVZCX0FNSUMsCi0JQUxDMjY5VkJfRE1JQywKLQlBTEMyNjlfRlVKSVRTVSwKLQlBTEMyNjlfTElGRUJPT0ssCi0JQUxDMjcxX0FDRVIsCi0JQUxDMjY5X0FVVE8sCi0JQUxDMjY5X01PREVMX0xBU1QgLyogbGFzdCB0YWcgKi8KLX07Ci0KLS8qIEFMQzg2MSBtb2RlbHMgKi8KLWVudW0gewotCUFMQzg2MV8zU1QsCi0JQUxDNjYwXzNTVCwKLQlBTEM4NjFfM1NUX0RJRywKLQlBTEM4NjFfNlNUX0RJRywKLQlBTEM4NjFfVU5JV0lMTF9NMzEsCi0JQUxDODYxX1RPU0hJQkEsCi0JQUxDODYxX0FTVVMsCi0JQUxDODYxX0FTVVNfTEFQVE9QLAotCUFMQzg2MV9BVVRPLAotCUFMQzg2MV9NT0RFTF9MQVNULAotfTsKLQotLyogQUxDODYxLVZEIG1vZGVscyAqLwotZW51bSB7Ci0JQUxDNjYwVkRfM1NULAotCUFMQzY2MFZEXzNTVF9ESUcsCi0JQUxDNjYwVkRfQVNVU19WMVMsCi0JQUxDODYxVkRfM1NULAotCUFMQzg2MVZEXzNTVF9ESUcsCi0JQUxDODYxVkRfNlNUX0RJRywKLQlBTEM4NjFWRF9MRU5PVk8sCi0JQUxDODYxVkRfREFMTEFTLAotCUFMQzg2MVZEX0hQLAotCUFMQzg2MVZEX0FVVE8sCi0JQUxDODYxVkRfTU9ERUxfTEFTVCwKLX07Ci0KLS8qIEFMQzY2MiBtb2RlbHMgKi8KLWVudW0gewotCUFMQzY2Ml8zU1RfMmNoX0RJRywKLQlBTEM2NjJfM1NUXzZjaF9ESUcsCi0JQUxDNjYyXzNTVF82Y2gsCi0JQUxDNjYyXzVTVF9ESUcsCi0JQUxDNjYyX0xFTk9WT18xMDFFLAotCUFMQzY2Ml9BU1VTX0VFRVBDX1A3MDEsCi0JQUxDNjYyX0FTVVNfRUVFUENfRVAyMCwKLQlBTEM2NjNfQVNVU19NNTFWQSwKLQlBTEM2NjNfQVNVU19HNzFWLAotCUFMQzY2M19BU1VTX0gxMywKLQlBTEM2NjNfQVNVU19HNTBWLAotCUFMQzY2Ml9FQ1MsCi0JQUxDNjYzX0FTVVNfTU9ERTEsCi0JQUxDNjYyX0FTVVNfTU9ERTIsCi0JQUxDNjYzX0FTVVNfTU9ERTMsCi0JQUxDNjYzX0FTVVNfTU9ERTQsCi0JQUxDNjYzX0FTVVNfTU9ERTUsCi0JQUxDNjYzX0FTVVNfTU9ERTYsCi0JQUxDNjYzX0FTVVNfTU9ERTcsCi0JQUxDNjYzX0FTVVNfTU9ERTgsCi0JQUxDMjcyX0RFTEwsCi0JQUxDMjcyX0RFTExfWk0xLAotCUFMQzI3Ml9TQU1TVU5HX05DMTAsCi0JQUxDNjYyX0FVVE8sCi0JQUxDNjYyX01PREVMX0xBU1QsCi19OwotCi0vKiBBTEM4ODIgbW9kZWxzICovCi1lbnVtIHsKLQlBTEM4ODJfM1NUX0RJRywKLQlBTEM4ODJfNlNUX0RJRywKLQlBTEM4ODJfQVJJTUEsCi0JQUxDODgyX1cySkMsCi0JQUxDODgyX1RBUkdBLAotCUFMQzg4Ml9BU1VTX0E3SiwKLQlBTEM4ODJfQVNVU19BN00sCi0JQUxDODg1X01BQ1BSTywKLQlBTEM4ODVfTUJBMjEsCi0JQUxDODg1X01CUDMsCi0JQUxDODg1X01CNSwKLQlBTEM4ODVfTUFDTUlOSTMsCi0JQUxDODg1X0lNQUMyNCwKLQlBTEM4ODVfSU1BQzkxLAotCUFMQzg4M18zU1RfMmNoX0RJRywKLQlBTEM4ODNfM1NUXzZjaF9ESUcsCi0JQUxDODgzXzNTVF82Y2gsCi0JQUxDODgzXzZTVF9ESUcsCi0JQUxDODgzX1RBUkdBX0RJRywKLQlBTEM4ODNfVEFSR0FfMmNoX0RJRywKLQlBTEM4ODNfVEFSR0FfOGNoX0RJRywKLQlBTEM4ODNfQUNFUiwKLQlBTEM4ODNfQUNFUl9BU1BJUkUsCi0JQUxDODg4X0FDRVJfQVNQSVJFXzQ5MzBHLAotCUFMQzg4OF9BQ0VSX0FTUElSRV82NTMwRywKLQlBTEM4ODhfQUNFUl9BU1BJUkVfODkzMEcsCi0JQUxDODg4X0FDRVJfQVNQSVJFXzc3MzBHLAotCUFMQzg4M19NRURJT04sCi0JQUxDODgzX01FRElPTl9XSU0yMTYwLAotCUFMQzg4M19MQVBUT1BfRUFQRCwKLQlBTEM4ODNfTEVOT1ZPXzEwMUVfMmNoLAotCUFMQzg4M19MRU5PVk9fTkIwNzYzLAotCUFMQzg4OF9MRU5PVk9fTVM3MTk1X0RJRywKLQlBTEM4ODhfTEVOT1ZPX1NLWSwKLQlBTEM4ODNfSEFJRVJfVzY2LAotCUFMQzg4OF8zU1RfSFAsCi0JQUxDODg4XzZTVF9ERUxMLAotCUFMQzg4M19NSVRBQywKLQlBTEM4ODNfQ0xFVk9fTTU0MFIsCi0JQUxDODgzX0NMRVZPX003MjAsCi0JQUxDODgzX0ZVSklUU1VfUEkyNTE1LAotCUFMQzg4OF9GVUpJVFNVX1hBMzUzMCwKLQlBTEM4ODNfM1NUXzZjaF9JTlRFTCwKLQlBTEM4ODlBX0lOVEVMLAotCUFMQzg4OV9JTlRFTCwKLQlBTEM4ODhfQVNVU19NOTBWLAotCUFMQzg4OF9BU1VTX0VFRTE2MDEsCi0JQUxDODg5QV9NQjMxLAotCUFMQzEyMDBfQVNVU19QNVEsCi0JQUxDODgzX1NPTllfVkFJT19UVCwKLQlBTEM4ODJfQVVUTywKLQlBTEM4ODJfTU9ERUxfTEFTVCwKLX07Ci0KLS8qIEFMQzY4MCBtb2RlbHMgKi8KLWVudW0gewotCUFMQzY4MF9CQVNFLAotCUFMQzY4MF9BVVRPLAotCUFMQzY4MF9NT0RFTF9MQVNULAotfTsKKy8qIHVuc29sIGV2ZW50IHRhZ3MgKi8KKyNkZWZpbmUgQUxDX0ZST05UX0VWRU5UCQkweDAxCisjZGVmaW5lIEFMQ19EQ1ZPTF9FVkVOVAkJMHgwMgorI2RlZmluZSBBTENfSFBfRVZFTlQJCTB4MDQKKyNkZWZpbmUgQUxDX01JQ19FVkVOVAkJMHgwOAogCiAvKiBmb3IgR1BJTyBQb2xsICovCiAjZGVmaW5lIEdQSU9fTUFTSwkweDAzCkBAIC0yNzYsMTQgKzUxLDYgQEAKIAlBTENfSU5JVF9HUElPMywKIH07CiAKLXN0cnVjdCBhbGNfbWljX3JvdXRlIHsKLQloZGFfbmlkX3QgcGluOwotCXVuc2lnbmVkIGNoYXIgbXV4X2lkeDsKLQl1bnNpZ25lZCBjaGFyIGFtaXhfaWR4OwotfTsKLQotI2RlZmluZSBNVVhfSURYX1VOREVGCSgodW5zaWduZWQgY2hhciktMSkKLQogc3RydWN0IGFsY19jdXN0b21pemVfZGVmaW5lIHsKIAl1bnNpZ25lZCBpbnQgIHNrdV9jZmc7CiAJdW5zaWduZWQgY2hhciBwb3J0X2Nvbm5lY3Rpdml0eTsKQEAgLTM0OCw5ICsxMTUsOSBAQAogCWNvbnN0IGhkYV9uaWRfdCAqYWRjX25pZHM7CiAJY29uc3QgaGRhX25pZF90ICpjYXBzcmNfbmlkczsKIAloZGFfbmlkX3QgZGlnX2luX25pZDsJCS8qIGRpZ2l0YWwtaW4gTklEOyBvcHRpb25hbCAqLworCWhkYV9uaWRfdCBtaXhlcl9uaWQ7CQkvKiBhbmFsb2ctbWl4ZXIgTklEICovCiAKIAkvKiBjYXB0dXJlIHNldHVwIGZvciBkeW5hbWljIGR1YWwtYWRjIHN3aXRjaCAqLwotCXVuc2lnbmVkIGludCBjdXJfYWRjX2lkeDsKIAloZGFfbmlkX3QgY3VyX2FkYzsKIAl1bnNpZ25lZCBpbnQgY3VyX2FkY19zdHJlYW1fdGFnOwogCXVuc2lnbmVkIGludCBjdXJfYWRjX2Zvcm1hdDsKQEAgLTM1OSw5ICsxMjYsOSBAQAogCXVuc2lnbmVkIGludCBudW1fbXV4X2RlZnM7CiAJY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmlucHV0X211eDsKIAl1bnNpZ25lZCBpbnQgY3VyX211eFszXTsKLQlzdHJ1Y3QgYWxjX21pY19yb3V0ZSBleHRfbWljOwotCXN0cnVjdCBhbGNfbWljX3JvdXRlIGRvY2tfbWljOwotCXN0cnVjdCBhbGNfbWljX3JvdXRlIGludF9taWM7CisJaGRhX25pZF90IGV4dF9taWNfcGluOworCWhkYV9uaWRfdCBkb2NrX21pY19waW47CisJaGRhX25pZF90IGludF9taWNfcGluOwogCiAJLyogY2hhbm5lbCBtb2RlbCAqLwogCWNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlICpjaGFubmVsX21vZGU7CkBAIC0zODEsNiArMTQ4LDkgQEAKIAloZGFfbmlkX3QgcHJpdmF0ZV9kYWNfbmlkc1tBVVRPX0NGR19NQVhfT1VUU107CiAJaGRhX25pZF90IHByaXZhdGVfYWRjX25pZHNbQVVUT19DRkdfTUFYX09VVFNdOwogCWhkYV9uaWRfdCBwcml2YXRlX2NhcHNyY19uaWRzW0FVVE9fQ0ZHX01BWF9PVVRTXTsKKwloZGFfbmlkX3QgaW11eF9waW5zW0hEQV9NQVhfTlVNX0lOUFVUU107CisJdW5zaWduZWQgaW50IGR5bl9hZGNfaWR4W0hEQV9NQVhfTlVNX0lOUFVUU107CisJaW50IGludF9taWNfaWR4LCBleHRfbWljX2lkeCwgZG9ja19taWNfaWR4OyAvKiBmb3IgYXV0by1taWMgKi8KIAogCS8qIGhvb2tzICovCiAJdm9pZCAoKmluaXRfaG9vaykoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwpAQCAtMzk1LDYgKzE2NSw3IEBACiAJdW5zaWduZWQgaW50IGxpbmVfamFja19wcmVzZW50OjE7CiAJdW5zaWduZWQgaW50IG1hc3Rlcl9tdXRlOjE7CiAJdW5zaWduZWQgaW50IGF1dG9fbWljOjE7CisJdW5zaWduZWQgaW50IGF1dG9fbWljX3ZhbGlkX2ltdXg6MTsJLyogdmFsaWQgaW11eCBmb3IgYXV0by1taWMgKi8KIAl1bnNpZ25lZCBpbnQgYXV0b211dGU6MTsJLyogSFAgYXV0b211dGUgZW5hYmxlZCAqLwogCXVuc2lnbmVkIGludCBkZXRlY3RfbGluZToxOwkvKiBMaW5lLW91dCBkZXRlY3Rpb24gZW5hYmxlZCAqLwogCXVuc2lnbmVkIGludCBhdXRvbXV0ZV9saW5lczoxOwkvKiBhdXRvbXV0ZSBsaW5lLW91dCBhcyB3ZWxsICovCkBAIC00MDIsOCArMTczLDkgQEAKIAogCS8qIG90aGVyIGZsYWdzICovCiAJdW5zaWduZWQgaW50IG5vX2FuYWxvZyA6MTsgLyogZGlnaXRhbCBJL08gb25seSAqLwotCXVuc2lnbmVkIGludCBkdWFsX2FkY19zd2l0Y2g6MTsgLyogc3dpdGNoIEFEQ3MgKGZvciBBTEMyNzUpICovCisJdW5zaWduZWQgaW50IGR5bl9hZGNfc3dpdGNoOjE7IC8qIHN3aXRjaCBBRENzIChmb3IgQUxDMjc1KSAqLwogCXVuc2lnbmVkIGludCBzaW5nbGVfaW5wdXRfc3JjOjE7CisJdW5zaWduZWQgaW50IHZvbF9pbl9jYXBzcmM6MTsgLyogdXNlIGNhcHNyYyB2b2x1bWUgKEFEQyBoYXMgbm8gdm9sKSAqLwogCiAJLyogYXV0by1tdXRlIGNvbnRyb2wgKi8KIAlpbnQgYXV0b211dGVfbW9kZTsKQEAgLTQzMiwzOSArMjA0LDIzIEBACiAJc3RydWN0IGFsY19tdWx0aV9pbyBtdWx0aV9pb1s0XTsKIH07CiAKLS8qCi0gKiBjb25maWd1cmF0aW9uIHRlbXBsYXRlIC0gdG8gYmUgY29waWVkIHRvIHRoZSBzcGVjIGluc3RhbmNlCi0gKi8KLXN0cnVjdCBhbGNfY29uZmlnX3ByZXNldCB7Ci0JY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKm1peGVyc1s1XTsgLyogc2hvdWxkIGJlIGlkZW50aWNhbCBzaXplCi0JCQkJCSAgICAgKiB3aXRoIHNwZWMKLQkJCQkJICAgICAqLwotCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpjYXBfbWl4ZXI7IC8qIGNhcHR1cmUgbWl4ZXIgKi8KLQljb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgKmluaXRfdmVyYnNbNV07Ci0JdW5zaWduZWQgaW50IG51bV9kYWNzOwotCWNvbnN0IGhkYV9uaWRfdCAqZGFjX25pZHM7Ci0JaGRhX25pZF90IGRpZ19vdXRfbmlkOwkJLyogb3B0aW9uYWwgKi8KLQloZGFfbmlkX3QgaHBfbmlkOwkJLyogb3B0aW9uYWwgKi8KLQljb25zdCBoZGFfbmlkX3QgKnNsYXZlX2RpZ19vdXRzOwotCXVuc2lnbmVkIGludCBudW1fYWRjX25pZHM7Ci0JY29uc3QgaGRhX25pZF90ICphZGNfbmlkczsKLQljb25zdCBoZGFfbmlkX3QgKmNhcHNyY19uaWRzOwotCWhkYV9uaWRfdCBkaWdfaW5fbmlkOwotCXVuc2lnbmVkIGludCBudW1fY2hhbm5lbF9tb2RlOwotCWNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlICpjaGFubmVsX21vZGU7Ci0JaW50IG5lZWRfZGFjX2ZpeDsKLQlpbnQgY29uc3RfY2hhbm5lbF9jb3VudDsKLQl1bnNpZ25lZCBpbnQgbnVtX211eF9kZWZzOwotCWNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbnB1dF9tdXg7Ci0Jdm9pZCAoKnVuc29sX2V2ZW50KShzdHJ1Y3QgaGRhX2NvZGVjICosIHVuc2lnbmVkIGludCk7Ci0Jdm9pZCAoKnNldHVwKShzdHJ1Y3QgaGRhX2NvZGVjICopOwotCXZvaWQgKCppbml0X2hvb2spKHN0cnVjdCBoZGFfY29kZWMgKik7Ci0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotCWNvbnN0IHN0cnVjdCBoZGFfYW1wX2xpc3QgKmxvb3BiYWNrczsKLQl2b2lkICgqcG93ZXJfaG9vaykoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwotI2VuZGlmCi19OworI2RlZmluZSBBTENfTU9ERUxfQVVUTwkJMAkvKiBjb21tb24gZm9yIGFsbCBjaGlwcyAqLwogCitzdGF0aWMgYm9vbCBjaGVja19hbXBfY2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCSAgIGludCBkaXIsIHVuc2lnbmVkIGludCBiaXRzKQoreworCWlmICghbmlkKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmICgxIDw8IChkaXIgKyAxKSkpCisJCWlmIChxdWVyeV9hbXBfY2Fwcyhjb2RlYywgbmlkLCBkaXIpICYgYml0cykKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworI2RlZmluZSBuaWRfaGFzX211dGUoY29kZWMsIG5pZCwgZGlyKSBcCisJY2hlY2tfYW1wX2NhcHMoY29kZWMsIG5pZCwgZGlyLCBBQ19BTVBDQVBfTVVURSkKKyNkZWZpbmUgbmlkX2hhc192b2x1bWUoY29kZWMsIG5pZCwgZGlyKSBcCisJY2hlY2tfYW1wX2NhcHMoY29kZWMsIG5pZCwgZGlyLCBBQ19BTVBDQVBfTlVNX1NURVBTKQogCiAvKgogICogaW5wdXQgTVVYIGhhbmRsaW5nCkBAIC00OTMsMzg3ICsyNDksODIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbGNfbXV4X2VudW1fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGJvb2wgYWxjX2R5bl9hZGNfcGNtX3Jlc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBjdXIpCiB7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IG5ld19hZGMgPSBzcGVjLT5hZGNfbmlkc1tzcGVjLT5keW5fYWRjX2lkeFtjdXJdXTsKKworCWlmIChzcGVjLT5jdXJfYWRjICYmIHNwZWMtPmN1cl9hZGMgIT0gbmV3X2FkYykgeworCQkvKiBzdHJlYW0gaXMgcnVubmluZywgbGV0J3Mgc3dhcCB0aGUgY3VycmVudCBBREMgKi8KKwkJX19zbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5jdXJfYWRjLCAxKTsKKwkJc3BlYy0+Y3VyX2FkYyA9IG5ld19hZGM7CisJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBuZXdfYWRjLAorCQkJCQkgICBzcGVjLT5jdXJfYWRjX3N0cmVhbV90YWcsIDAsCisJCQkJCSAgIHNwZWMtPmN1cl9hZGNfZm9ybWF0KTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyogc2VsZWN0IHRoZSBnaXZlbiBpbXV4IGl0ZW07IGVpdGhlciB1bm11dGUgZXhjbHVzaXZlbHkgb3Igc2VsZWN0IHRoZSByb3V0ZSAqLworc3RhdGljIGludCBhbGNfbXV4X3NlbGVjdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IGFkY19pZHgsCisJCQkgIHVuc2lnbmVkIGludCBpZHgsIGJvb2wgZm9yY2UpCit7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXg7Ci0JdW5zaWduZWQgaW50IGFkY19pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKIAl1bnNpZ25lZCBpbnQgbXV4X2lkeDsKLQloZGFfbmlkX3QgbmlkID0gc3BlYy0+Y2Fwc3JjX25pZHMgPwotCQlzcGVjLT5jYXBzcmNfbmlkc1thZGNfaWR4XSA6IHNwZWMtPmFkY19uaWRzW2FkY19pZHhdOwotCXVuc2lnbmVkIGludCB0eXBlOworCWludCBpLCB0eXBlOworCWhkYV9uaWRfdCBuaWQ7CiAKIAltdXhfaWR4ID0gYWRjX2lkeCA+PSBzcGVjLT5udW1fbXV4X2RlZnMgPyAwIDogYWRjX2lkeDsKIAlpbXV4ID0gJnNwZWMtPmlucHV0X211eFttdXhfaWR4XTsKIAlpZiAoIWltdXgtPm51bV9pdGVtcyAmJiBtdXhfaWR4ID4gMCkKIAkJaW11eCA9ICZzcGVjLT5pbnB1dF9tdXhbMF07CiAKKwlpZiAoaWR4ID49IGltdXgtPm51bV9pdGVtcykKKwkJaWR4ID0gaW11eC0+bnVtX2l0ZW1zIC0gMTsKKwlpZiAoc3BlYy0+Y3VyX211eFthZGNfaWR4XSA9PSBpZHggJiYgIWZvcmNlKQorCQlyZXR1cm4gMDsKKwlzcGVjLT5jdXJfbXV4W2FkY19pZHhdID0gaWR4OworCisJaWYgKHNwZWMtPmR5bl9hZGNfc3dpdGNoKSB7CisJCWFsY19keW5fYWRjX3BjbV9yZXNldHVwKGNvZGVjLCBpZHgpOworCQlhZGNfaWR4ID0gc3BlYy0+ZHluX2FkY19pZHhbaWR4XTsKKwl9CisKKwluaWQgPSBzcGVjLT5jYXBzcmNfbmlkcyA/CisJCXNwZWMtPmNhcHNyY19uaWRzW2FkY19pZHhdIDogc3BlYy0+YWRjX25pZHNbYWRjX2lkeF07CisKKwkvKiBubyBzZWxlY3Rpb24/ICovCisJaWYgKHNuZF9oZGFfZ2V0X2Nvbm5fbGlzdChjb2RlYywgbmlkLCBOVUxMKSA8PSAxKQorCQlyZXR1cm4gMTsKKwogCXR5cGUgPSBnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpOwogCWlmICh0eXBlID09IEFDX1dJRF9BVURfTUlYKSB7CiAJCS8qIE1hdHJpeC1taXhlciBzdHlsZSAoZS5nLiBBTEM4ODIpICovCi0JCXVuc2lnbmVkIGludCAqY3VyX3ZhbCA9ICZzcGVjLT5jdXJfbXV4W2FkY19pZHhdOwotCQl1bnNpZ25lZCBpbnQgaSwgaWR4OwotCi0JCWlkeCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07Ci0JCWlmIChpZHggPj0gaW11eC0+bnVtX2l0ZW1zKQotCQkJaWR4ID0gaW11eC0+bnVtX2l0ZW1zIC0gMTsKLQkJaWYgKCpjdXJfdmFsID09IGlkeCkKLQkJCXJldHVybiAwOwogCQlmb3IgKGkgPSAwOyBpIDwgaW11eC0+bnVtX2l0ZW1zOyBpKyspIHsKIAkJCXVuc2lnbmVkIGludCB2ID0gKGkgPT0gaWR4KSA/IDAgOiBIREFfQU1QX01VVEU7CiAJCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIG5pZCwgSERBX0lOUFVULAogCQkJCQkJIGltdXgtPml0ZW1zW2ldLmluZGV4LAogCQkJCQkJIEhEQV9BTVBfTVVURSwgdik7CiAJCX0KLQkJKmN1cl92YWwgPSBpZHg7Ci0JCXJldHVybiAxOwogCX0gZWxzZSB7CiAJCS8qIE1VWCBzdHlsZSAoZS5nLiBBTEM4ODApICovCi0JCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9wdXQoY29kZWMsIGltdXgsIHVjb250cm9sLCBuaWQsCi0JCQkJCSAgICAgJnNwZWMtPmN1cl9tdXhbYWRjX2lkeF0pOwotCX0KLX0KLQotLyoKLSAqIGNoYW5uZWwgbW9kZSBzZXR0aW5nCi0gKi8KLXN0YXRpYyBpbnQgYWxjX2NoX21vZGVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXJldHVybiBzbmRfaGRhX2NoX21vZGVfaW5mbyhjb2RlYywgdWluZm8sIHNwZWMtPmNoYW5uZWxfbW9kZSwKLQkJCQkgICAgc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWxjX2NoX21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JcmV0dXJuIHNuZF9oZGFfY2hfbW9kZV9nZXQoY29kZWMsIHVjb250cm9sLCBzcGVjLT5jaGFubmVsX21vZGUsCi0JCQkJICAgc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSwKLQkJCQkgICBzcGVjLT5leHRfY2hhbm5lbF9jb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgYWxjX2NoX21vZGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGVyciA9IHNuZF9oZGFfY2hfbW9kZV9wdXQoY29kZWMsIHVjb250cm9sLCBzcGVjLT5jaGFubmVsX21vZGUsCi0JCQkJICAgICAgc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSwKLQkJCQkgICAgICAmc3BlYy0+ZXh0X2NoYW5uZWxfY291bnQpOwotCWlmIChlcnIgPj0gMCAmJiAhc3BlYy0+Y29uc3RfY2hhbm5lbF9jb3VudCkgewotCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5leHRfY2hhbm5lbF9jb3VudDsKLQkJaWYgKHNwZWMtPm5lZWRfZGFjX2ZpeCkKLQkJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzIC8gMjsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIENvbnRyb2wgdGhlIG1vZGUgb2YgcGluIHdpZGdldCBzZXR0aW5ncyB2aWEgdGhlIG1peGVyLiAgInBjIiBpcyB1c2VkCi0gKiBpbnN0ZWFkIG9mICIlIiB0byBhdm9pZCBjb25zZXF1ZW5jZXMgb2YgYWNjaWRlbnRhbGx5IHRyZWF0aW5nIHRoZSAlIGFzCi0gKiBiZWluZyBwYXJ0IG9mIGEgZm9ybWF0IHNwZWNpZmllci4gIE1heGltdW0gYWxsb3dlZCBsZW5ndGggb2YgYSB2YWx1ZSBpcwotICogNjMgY2hhcmFjdGVycyBwbHVzIE5VTEwgdGVybWluYXRvci4KLSAqCi0gKiBOb3RlOiBzb21lIHJldGFza2luZyBwaW4gY29tcGxleGVzIHNlZW0gdG8gaWdub3JlIHJlcXVlc3RzIGZvciBpbnB1dAotICogc3RhdGVzIG90aGVyIHRoYW4gSGlaIChlZzogUElOX1ZSRUZ4eCkgYW5kIHJldmVydCB0byBIaVogaWYgYW55IG9mIHRoZXNlCi0gKiBhcmUgcmVxdWVzdGVkLiAgVGhlcmVmb3JlIG9yZGVyIHRoaXMgbGlzdCBzbyB0aGF0IHRoaXMgYmVoYXZpb3VyIHdpbGwgbm90Ci0gKiBjYXVzZSBwcm9ibGVtcyB3aGVuIG1peGVyIGNsaWVudHMgbW92ZSB0aHJvdWdoIHRoZSBlbnVtIHNlcXVlbnRpYWxseS4KLSAqIE5JRHMgMHgwZiBhbmQgMHgxMCBoYXZlIGJlZW4gb2JzZXJ2ZWQgdG8gaGF2ZSB0aGlzIGJlaGF2aW91ciBhcyBvZgotICogTWFyY2ggMjAwNi4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGNfcGluX21vZGVfbmFtZXNbXSA9IHsKLQkiTWljIDUwcGMgYmlhcyIsICJNaWMgODBwYyBiaWFzIiwKLQkiTGluZSBpbiIsICJMaW5lIG91dCIsICJIZWFkcGhvbmUgb3V0IiwKLX07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhbGNfcGluX21vZGVfdmFsdWVzW10gPSB7Ci0JUElOX1ZSRUY1MCwgUElOX1ZSRUY4MCwgUElOX0lOLCBQSU5fT1VULCBQSU5fSFAsCi19OwotLyogVGhlIGNvbnRyb2wgY2FuIHByZXNlbnQgYWxsIDUgb3B0aW9ucywgb3IgaXQgY2FuIGxpbWl0IHRoZSBvcHRpb25zIGJhc2VkCi0gKiBpbiB0aGUgcGluIGJlaW5nIGFzc3VtZWQgdG8gYmUgZXhjbHVzaXZlbHkgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IHBpbi4gIEluCi0gKiBhZGRpdGlvbiwgImlucHV0IiBwaW5zIG1heSBvciBtYXkgbm90IHByb2Nlc3MgdGhlIG1pYyBiaWFzIG9wdGlvbgotICogZGVwZW5kaW5nIG9uIGFjdHVhbCB3aWRnZXQgY2FwYWJpbGl0eSAoTklEcyAweDBmIGFuZCAweDEwIGRvbid0IHNlZW0gdG8KLSAqIGFjY2VwdCByZXF1ZXN0cyBmb3IgYmlhcyBhcyBvZiBjaGlwIHZlcnNpb25zIHVwIHRvIE1hcmNoIDIwMDYpIGFuZC9vcgotICogd2lyaW5nIGluIHRoZSBjb21wdXRlci4KLSAqLwotI2RlZmluZSBBTENfUElOX0RJUl9JTiAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBBTENfUElOX0RJUl9PVVQgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBBTENfUElOX0RJUl9JTk9VVCAgICAgICAgICAgMHgwMgotI2RlZmluZSBBTENfUElOX0RJUl9JTl9OT01JQ0JJQVMgICAgMHgwMwotI2RlZmluZSBBTENfUElOX0RJUl9JTk9VVF9OT01JQ0JJQVMgMHgwNAotCi0vKiBJbmZvIGFib3V0IHRoZSBwaW4gbW9kZXMgc3VwcG9ydGVkIGJ5IHRoZSBkaWZmZXJlbnQgcGluIGRpcmVjdGlvbiBtb2Rlcy4KLSAqIEZvciBlYWNoIGRpcmVjdGlvbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYXJlIGdpdmVuLgotICovCi1zdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgYWxjX3Bpbl9tb2RlX2Rpcl9pbmZvWzVdWzJdID0gewotCXsgMCwgMiB9LCAgICAvKiBBTENfUElOX0RJUl9JTiAqLwotCXsgMywgNCB9LCAgICAvKiBBTENfUElOX0RJUl9PVVQgKi8KLQl7IDAsIDQgfSwgICAgLyogQUxDX1BJTl9ESVJfSU5PVVQgKi8KLQl7IDIsIDIgfSwgICAgLyogQUxDX1BJTl9ESVJfSU5fTk9NSUNCSUFTICovCi0JeyAyLCA0IH0sICAgIC8qIEFMQ19QSU5fRElSX0lOT1VUX05PTUlDQklBUyAqLwotfTsKLSNkZWZpbmUgYWxjX3Bpbl9tb2RlX21pbihfZGlyKSAoYWxjX3Bpbl9tb2RlX2Rpcl9pbmZvW19kaXJdWzBdKQotI2RlZmluZSBhbGNfcGluX21vZGVfbWF4KF9kaXIpIChhbGNfcGluX21vZGVfZGlyX2luZm9bX2Rpcl1bMV0pCi0jZGVmaW5lIGFsY19waW5fbW9kZV9uX2l0ZW1zKF9kaXIpIFwKLQkoYWxjX3Bpbl9tb2RlX21heChfZGlyKS1hbGNfcGluX21vZGVfbWluKF9kaXIpKzEpCi0KLXN0YXRpYyBpbnQgYWxjX3Bpbl9tb2RlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JdW5zaWduZWQgaW50IGl0ZW1fbnVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbTsKLQl1bnNpZ25lZCBjaGFyIGRpciA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCi0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JdWluZm8tPmNvdW50ID0gMTsKLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGFsY19waW5fbW9kZV9uX2l0ZW1zKGRpcik7Ci0KLQlpZiAoaXRlbV9udW08YWxjX3Bpbl9tb2RlX21pbihkaXIpIHx8IGl0ZW1fbnVtPmFsY19waW5fbW9kZV9tYXgoZGlyKSkKLQkJaXRlbV9udW0gPSBhbGNfcGluX21vZGVfbWluKGRpcik7Ci0Jc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIGFsY19waW5fbW9kZV9uYW1lc1tpdGVtX251bV0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFsY19waW5fbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOwotCXVuc2lnbmVkIGNoYXIgZGlyID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7Ci0JbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwotCXVuc2lnbmVkIGludCBwaW5jdGwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJCSBBQ19WRVJCX0dFVF9QSU5fV0lER0VUX0NPTlRST0wsCi0JCQkJCQkgMHgwMCk7Ci0KLQkvKiBGaW5kIGVudW1lcmF0ZWQgdmFsdWUgZm9yIGN1cnJlbnQgcGluY3RsIHNldHRpbmcgKi8KLQlpID0gYWxjX3Bpbl9tb2RlX21pbihkaXIpOwotCXdoaWxlIChpIDw9IGFsY19waW5fbW9kZV9tYXgoZGlyKSAmJiBhbGNfcGluX21vZGVfdmFsdWVzW2ldICE9IHBpbmN0bCkKLQkJaSsrOwotCSp2YWxwID0gaSA8PSBhbGNfcGluX21vZGVfbWF4KGRpcikgPyBpOiBhbGNfcGluX21vZGVfbWluKGRpcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWxjX3Bpbl9tb2RlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzaWduZWQgaW50IGNoYW5nZTsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7Ci0JdW5zaWduZWQgY2hhciBkaXIgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKLQlsb25nIHZhbCA9ICp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKLQl1bnNpZ25lZCBpbnQgcGluY3RsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCi0JCQkJCQkgQUNfVkVSQl9HRVRfUElOX1dJREdFVF9DT05UUk9MLAotCQkJCQkJIDB4MDApOwotCi0JaWYgKHZhbCA8IGFsY19waW5fbW9kZV9taW4oZGlyKSB8fCB2YWwgPiBhbGNfcGluX21vZGVfbWF4KGRpcikpCi0JCXZhbCA9IGFsY19waW5fbW9kZV9taW4oZGlyKTsKLQotCWNoYW5nZSA9IHBpbmN0bCAhPSBhbGNfcGluX21vZGVfdmFsdWVzW3ZhbF07Ci0JaWYgKGNoYW5nZSkgewotCQkvKiBTZXQgcGluIG1vZGUgdG8gdGhhdCByZXF1ZXN0ZWQgKi8KIAkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAotCQkJCQkgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKLQkJCQkJICBhbGNfcGluX21vZGVfdmFsdWVzW3ZhbF0pOwotCi0JCS8qIEFsc28gZW5hYmxlIHRoZSByZXRhc2tpbmcgcGluJ3MgaW5wdXQvb3V0cHV0IGFzIHJlcXVpcmVkCi0JCSAqIGZvciB0aGUgcmVxdWVzdGVkIHBpbiBtb2RlLiAgRW51bSB2YWx1ZXMgb2YgMiBvciBsZXNzIGFyZQotCQkgKiBpbnB1dCBtb2Rlcy4KLQkJICoKLQkJICogRHluYW1pY2FsbHkgc3dpdGNoaW5nIHRoZSBpbnB1dC9vdXRwdXQgYnVmZmVycyBwcm9iYWJseQotCQkgKiByZWR1Y2VzIG5vaXNlIHNsaWdodGx5IChwYXJ0aWN1bGFybHkgb24gaW5wdXQpIHNvIHdlJ2xsCi0JCSAqIGRvIGl0LiAgSG93ZXZlciwgaGF2aW5nIGJvdGggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCi0JCSAqIGVuYWJsZWQgc2ltdWx0YW5lb3VzbHkgZG9lc24ndCBzZWVtIHRvIGJlIHByb2JsZW1hdGljIGlmCi0JCSAqIHRoaXMgdHVybnMgb3V0IHRvIGJlIG5lY2Vzc2FyeSBpbiB0aGUgZnV0dXJlLgotCQkgKi8KLQkJaWYgKHZhbCA8PSAyKSB7Ci0JCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIG5pZCwgSERBX09VVFBVVCwgMCwKLQkJCQkJCSBIREFfQU1QX01VVEUsIEhEQV9BTVBfTVVURSk7Ci0JCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIG5pZCwgSERBX0lOUFVULCAwLAotCQkJCQkJIEhEQV9BTVBfTVVURSwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIG5pZCwgSERBX0lOUFVULCAwLAotCQkJCQkJIEhEQV9BTVBfTVVURSwgSERBX0FNUF9NVVRFKTsKLQkJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgbmlkLCBIREFfT1VUUFVULCAwLAotCQkJCQkJIEhEQV9BTVBfTVVURSwgMCk7Ci0JCX0KKwkJCQkJICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKKwkJCQkJICBpbXV4LT5pdGVtc1tpZHhdLmluZGV4KTsKIAl9Ci0JcmV0dXJuIGNoYW5nZTsKKwlyZXR1cm4gMTsKIH0KIAotI2RlZmluZSBBTENfUElOX01PREUoeG5hbWUsIG5pZCwgZGlyKSBcCi0JeyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0gMCwgIFwKLQkgIC5zdWJkZXZpY2UgPSBIREFfU1VCREVWX05JRF9GTEFHIHwgbmlkLCBcCi0JICAuaW5mbyA9IGFsY19waW5fbW9kZV9pbmZvLCBcCi0JICAuZ2V0ID0gYWxjX3Bpbl9tb2RlX2dldCwgXAotCSAgLnB1dCA9IGFsY19waW5fbW9kZV9wdXQsIFwKLQkgIC5wcml2YXRlX3ZhbHVlID0gbmlkIHwgKGRpcjw8MTYpIH0KLQotLyogQSBzd2l0Y2ggY29udHJvbCBmb3IgQUxDMjYwIEdQSU8gcGlucy4gIE11bHRpcGxlIEdQSU9zIGNhbiBiZSBnYW5nZWQKLSAqIHRvZ2V0aGVyIHVzaW5nIGEgbWFzayB3aXRoIG1vcmUgdGhhbiBvbmUgYml0IHNldC4gIFRoaXMgY29udHJvbCBpcwotICogY3VycmVudGx5IHVzZWQgb25seSBieSB0aGUgQUxDMjYwIHRlc3QgbW9kZWwuICBBdCB0aGlzIHN0YWdlIHRoZXkgYXJlIG5vdAotICogbmVlZGVkIGZvciBhbnkgInByb2R1Y3Rpb24iIG1vZGVscy4KLSAqLwotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLSNkZWZpbmUgYWxjX2dwaW9fZGF0YV9pbmZvCXNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8KLQotc3RhdGljIGludCBhbGNfZ3Bpb19kYXRhX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IGFsY19tdXhfZW51bV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOwotCXVuc2lnbmVkIGNoYXIgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKLQl1bnNpZ25lZCBpbnQgdmFsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCi0JCQkJCSAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwgMHgwMCk7Ci0KLQkqdmFscCA9ICh2YWwgJiBtYXNrKSAhPSAwOwotCXJldHVybiAwOworCXVuc2lnbmVkIGludCBhZGNfaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJcmV0dXJuIGFsY19tdXhfc2VsZWN0KGNvZGVjLCBhZGNfaWR4LAorCQkJICAgICAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSwgZmFsc2UpOwogfQotc3RhdGljIGludCBhbGNfZ3Bpb19kYXRhX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc2lnbmVkIGludCBjaGFuZ2U7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOwotCXVuc2lnbmVkIGNoYXIgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCWxvbmcgdmFsID0gKnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwotCXVuc2lnbmVkIGludCBncGlvX2RhdGEgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJCSAgICBBQ19WRVJCX0dFVF9HUElPX0RBVEEsCi0JCQkJCQkgICAgMHgwMCk7Ci0KLQkvKiBTZXQvdW5zZXQgdGhlIG1hc2tlZCBHUElPIGJpdChzKSBhcyBuZWVkZWQgKi8KLQljaGFuZ2UgPSAodmFsID09IDAgPyAwIDogbWFzaykgIT0gKGdwaW9fZGF0YSAmIG1hc2spOwotCWlmICh2YWwgPT0gMCkKLQkJZ3Bpb19kYXRhICY9IH5tYXNrOwotCWVsc2UKLQkJZ3Bpb19kYXRhIHw9IG1hc2s7Ci0Jc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAotCQkJCSAgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCBncGlvX2RhdGEpOwotCi0JcmV0dXJuIGNoYW5nZTsKLX0KLSNkZWZpbmUgQUxDX0dQSU9fREFUQV9TV0lUQ0goeG5hbWUsIG5pZCwgbWFzaykgXAotCXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IDAsICBcCi0JICAuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IG5pZCwgXAotCSAgLmluZm8gPSBhbGNfZ3Bpb19kYXRhX2luZm8sIFwKLQkgIC5nZXQgPSBhbGNfZ3Bpb19kYXRhX2dldCwgXAotCSAgLnB1dCA9IGFsY19ncGlvX2RhdGFfcHV0LCBcCi0JICAucHJpdmF0ZV92YWx1ZSA9IG5pZCB8IChtYXNrPDwxNikgfQotI2VuZGlmICAgLyogQ09ORklHX1NORF9ERUJVRyAqLwotCi0vKiBBIHN3aXRjaCBjb250cm9sIHRvIGFsbG93IHRoZSBlbmFibGluZyBvZiB0aGUgZGlnaXRhbCBJTyBwaW5zIG9uIHRoZQotICogQUxDMjYwLiAgVGhpcyBpcyBpbmNyZWRpYmx5IHNpbXBsaXN0aWM7IHRoZSBpbnRlbnRpb24gb2YgdGhpcyBjb250cm9sIGlzCi0gKiB0byBwcm92aWRlIHNvbWV0aGluZyBpbiB0aGUgdGVzdCBtb2RlbCBhbGxvd2luZyBkaWdpdGFsIG91dHB1dHMgdG8gYmUKLSAqIGlkZW50aWZpZWQgaWYgcHJlc2VudC4gIElmIG1vZGVscyBhcmUgZm91bmQgd2hpY2ggY2FuIHV0aWxpc2UgdGhlc2UKLSAqIG91dHB1dHMgYSBtb3JlIGNvbXBsZXRlIG1peGVyIGNvbnRyb2wgY2FuIGJlIGRldmlzZWQgZm9yIHRob3NlIG1vZGVscyBpZgotICogbmVjZXNzYXJ5LgotICovCi0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotI2RlZmluZSBhbGNfc3BkaWZfY3RybF9pbmZvCXNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8KLQotc3RhdGljIGludCBhbGNfc3BkaWZfY3RybF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7Ci0JdW5zaWduZWQgY2hhciBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7Ci0JbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwotCXVuc2lnbmVkIGludCB2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJICAgICAgQUNfVkVSQl9HRVRfRElHSV9DT05WRVJUXzEsIDB4MDApOwotCi0JKnZhbHAgPSAodmFsICYgbWFzaykgIT0gMDsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQgYWxjX3NwZGlmX2N0cmxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc2lnbmVkIGludCBjaGFuZ2U7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOwotCXVuc2lnbmVkIGNoYXIgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCWxvbmcgdmFsID0gKnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwotCXVuc2lnbmVkIGludCBjdHJsX2RhdGEgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJCSAgICBBQ19WRVJCX0dFVF9ESUdJX0NPTlZFUlRfMSwKLQkJCQkJCSAgICAweDAwKTsKLQotCS8qIFNldC91bnNldCB0aGUgbWFza2VkIGNvbnRyb2wgYml0KHMpIGFzIG5lZWRlZCAqLwotCWNoYW5nZSA9ICh2YWwgPT0gMCA/IDAgOiBtYXNrKSAhPSAoY3RybF9kYXRhICYgbWFzayk7Ci0JaWYgKHZhbD09MCkKLQkJY3RybF9kYXRhICY9IH5tYXNrOwotCWVsc2UKLQkJY3RybF9kYXRhIHw9IG1hc2s7Ci0Jc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwKLQkJCQkgIGN0cmxfZGF0YSk7Ci0KLQlyZXR1cm4gY2hhbmdlOwotfQotI2RlZmluZSBBTENfU1BESUZfQ1RSTF9TV0lUQ0goeG5hbWUsIG5pZCwgbWFzaykgXAotCXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IDAsICBcCi0JICAuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IG5pZCwgXAotCSAgLmluZm8gPSBhbGNfc3BkaWZfY3RybF9pbmZvLCBcCi0JICAuZ2V0ID0gYWxjX3NwZGlmX2N0cmxfZ2V0LCBcCi0JICAucHV0ID0gYWxjX3NwZGlmX2N0cmxfcHV0LCBcCi0JICAucHJpdmF0ZV92YWx1ZSA9IG5pZCB8IChtYXNrPDwxNikgfQotI2VuZGlmICAgLyogQ09ORklHX1NORF9ERUJVRyAqLwotCi0vKiBBIHN3aXRjaCBjb250cm9sIHRvIGFsbG93IHRoZSBlbmFibGluZyBFQVBEIGRpZ2l0YWwgb3V0cHV0cyBvbiB0aGUgQUxDMjZ4LgotICogQWdhaW4sIHRoaXMgaXMgb25seSB1c2VkIGluIHRoZSBBTEMyNnggdGVzdCBtb2RlbHMgdG8gaGVscCBpZGVudGlmeSB3aGVuCi0gKiB0aGUgRUFQRCBsaW5lIG11c3QgYmUgYXNzZXJ0ZWQgZm9yIGZlYXR1cmVzIHRvIHdvcmsuCi0gKi8KLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0jZGVmaW5lIGFsY19lYXBkX2N0cmxfaW5mbwlzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvCi0KLXN0YXRpYyBpbnQgYWxjX2VhcGRfY3RybF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7Ci0JdW5zaWduZWQgY2hhciBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7Ci0JbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwotCXVuc2lnbmVkIGludCB2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJICAgICAgQUNfVkVSQl9HRVRfRUFQRF9CVExFTkFCTEUsIDB4MDApOwotCi0JKnZhbHAgPSAodmFsICYgbWFzaykgIT0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhbGNfZWFwZF9jdHJsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaGFuZ2U7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOwotCXVuc2lnbmVkIGNoYXIgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCWxvbmcgdmFsID0gKnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwotCXVuc2lnbmVkIGludCBjdHJsX2RhdGEgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJCSAgICBBQ19WRVJCX0dFVF9FQVBEX0JUTEVOQUJMRSwKLQkJCQkJCSAgICAweDAwKTsKLQotCS8qIFNldC91bnNldCB0aGUgbWFza2VkIGNvbnRyb2wgYml0KHMpIGFzIG5lZWRlZCAqLwotCWNoYW5nZSA9ICghdmFsID8gMCA6IG1hc2spICE9IChjdHJsX2RhdGEgJiBtYXNrKTsKLQlpZiAoIXZhbCkKLQkJY3RybF9kYXRhICY9IH5tYXNrOwotCWVsc2UKLQkJY3RybF9kYXRhIHw9IG1hc2s7Ci0Jc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwKLQkJCQkgIGN0cmxfZGF0YSk7Ci0KLQlyZXR1cm4gY2hhbmdlOwotfQotCi0jZGVmaW5lIEFMQ19FQVBEX0NUUkxfU1dJVENIKHhuYW1lLCBuaWQsIG1hc2spIFwKLQl7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSAwLCAgXAotCSAgLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCBuaWQsIFwKLQkgIC5pbmZvID0gYWxjX2VhcGRfY3RybF9pbmZvLCBcCi0JICAuZ2V0ID0gYWxjX2VhcGRfY3RybF9nZXQsIFwKLQkgIC5wdXQgPSBhbGNfZWFwZF9jdHJsX3B1dCwgXAotCSAgLnByaXZhdGVfdmFsdWUgPSBuaWQgfCAobWFzazw8MTYpIH0KLSNlbmRpZiAgIC8qIENPTkZJR19TTkRfREVCVUcgKi8KIAogLyoKICAqIHNldCB1cCB0aGUgaW5wdXQgcGluIGNvbmZpZyAoZGVwZW5kaW5nIG9uIHRoZSBnaXZlbiBhdXRvLXBpbiB0eXBlKQpAQCAtOTAzLDI5ICszNTQsMTAgQEAKIAlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgYWxjX2ZpeHVwX2F1dG9jZmdfcGluX251bXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7Ci0KLQlpZiAoIWNmZy0+bGluZV9vdXRzKSB7Ci0JCXdoaWxlIChjZmctPmxpbmVfb3V0cyA8IEFVVE9fQ0ZHX01BWF9PVVRTICYmCi0JCSAgICAgICBjZmctPmxpbmVfb3V0X3BpbnNbY2ZnLT5saW5lX291dHNdKQotCQkJY2ZnLT5saW5lX291dHMrKzsKLQl9Ci0JaWYgKCFjZmctPnNwZWFrZXJfb3V0cykgewotCQl3aGlsZSAoY2ZnLT5zcGVha2VyX291dHMgPCBBVVRPX0NGR19NQVhfT1VUUyAmJgotCQkgICAgICAgY2ZnLT5zcGVha2VyX3BpbnNbY2ZnLT5zcGVha2VyX291dHNdKQotCQkJY2ZnLT5zcGVha2VyX291dHMrKzsKLQl9Ci0JaWYgKCFjZmctPmhwX291dHMpIHsKLQkJd2hpbGUgKGNmZy0+aHBfb3V0cyA8IEFVVE9fQ0ZHX01BWF9PVVRTICYmCi0JCSAgICAgICBjZmctPmhwX3BpbnNbY2ZnLT5ocF9vdXRzXSkKLQkJCWNmZy0+aHBfb3V0cysrOwotCX0KLX0KLQogLyoKKyAqIEFwcGVuZCB0aGUgZ2l2ZW4gbWl4ZXIgYW5kIHZlcmIgZWxlbWVudHMgZm9yIHRoZSBsYXRlciB1c2UKKyAqIFRoZSBtaXhlciBhcnJheSBpcyByZWZlcnJlZCBpbiBidWlsZF9jb250cm9scygpLCBhbmQgaW5pdF92ZXJicyBhcmUKKyAqIGNhbGxlZCBpbiBpbml0KCkuCiAgKi8KIHN0YXRpYyB2b2lkIGFkZF9taXhlcihzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICptaXgpCiB7CkBAIC05NDIsNjEgKzM3NCw4IEBACiB9CiAKIC8qCi0gKiBzZXQgdXAgZnJvbSB0aGUgcHJlc2V0IHRhYmxlCisgKiBHUElPIHNldHVwIHRhYmxlcywgdXNlZCBpbiBpbml0aWFsaXphdGlvbgogICovCi1zdGF0aWMgdm9pZCBzZXR1cF9wcmVzZXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0ICpwcmVzZXQpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcmVzZXQtPm1peGVycykgJiYgcHJlc2V0LT5taXhlcnNbaV07IGkrKykKLQkJYWRkX21peGVyKHNwZWMsIHByZXNldC0+bWl4ZXJzW2ldKTsKLQlzcGVjLT5jYXBfbWl4ZXIgPSBwcmVzZXQtPmNhcF9taXhlcjsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcmVzZXQtPmluaXRfdmVyYnMpICYmIHByZXNldC0+aW5pdF92ZXJic1tpXTsKLQkgICAgIGkrKykKLQkJYWRkX3ZlcmIoc3BlYywgcHJlc2V0LT5pbml0X3ZlcmJzW2ldKTsKLQotCXNwZWMtPmNoYW5uZWxfbW9kZSA9IHByZXNldC0+Y2hhbm5lbF9tb2RlOwotCXNwZWMtPm51bV9jaGFubmVsX21vZGUgPSBwcmVzZXQtPm51bV9jaGFubmVsX21vZGU7Ci0Jc3BlYy0+bmVlZF9kYWNfZml4ID0gcHJlc2V0LT5uZWVkX2RhY19maXg7Ci0Jc3BlYy0+Y29uc3RfY2hhbm5lbF9jb3VudCA9IHByZXNldC0+Y29uc3RfY2hhbm5lbF9jb3VudDsKLQotCWlmIChwcmVzZXQtPmNvbnN0X2NoYW5uZWxfY291bnQpCi0JCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHByZXNldC0+Y29uc3RfY2hhbm5lbF9jb3VudDsKLQllbHNlCi0JCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPmNoYW5uZWxfbW9kZVswXS5jaGFubmVsczsKLQlzcGVjLT5leHRfY2hhbm5lbF9jb3VudCA9IHNwZWMtPmNoYW5uZWxfbW9kZVswXS5jaGFubmVsczsKLQotCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gcHJlc2V0LT5udW1fZGFjczsKLQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHByZXNldC0+ZGFjX25pZHM7Ci0Jc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBwcmVzZXQtPmRpZ19vdXRfbmlkOwotCXNwZWMtPm11bHRpb3V0LnNsYXZlX2RpZ19vdXRzID0gcHJlc2V0LT5zbGF2ZV9kaWdfb3V0czsKLQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSBwcmVzZXQtPmhwX25pZDsKLQotCXNwZWMtPm51bV9tdXhfZGVmcyA9IHByZXNldC0+bnVtX211eF9kZWZzOwotCWlmICghc3BlYy0+bnVtX211eF9kZWZzKQotCQlzcGVjLT5udW1fbXV4X2RlZnMgPSAxOwotCXNwZWMtPmlucHV0X211eCA9IHByZXNldC0+aW5wdXRfbXV4OwotCi0Jc3BlYy0+bnVtX2FkY19uaWRzID0gcHJlc2V0LT5udW1fYWRjX25pZHM7Ci0Jc3BlYy0+YWRjX25pZHMgPSBwcmVzZXQtPmFkY19uaWRzOwotCXNwZWMtPmNhcHNyY19uaWRzID0gcHJlc2V0LT5jYXBzcmNfbmlkczsKLQlzcGVjLT5kaWdfaW5fbmlkID0gcHJlc2V0LT5kaWdfaW5fbmlkOwotCi0Jc3BlYy0+dW5zb2xfZXZlbnQgPSBwcmVzZXQtPnVuc29sX2V2ZW50OwotCXNwZWMtPmluaXRfaG9vayA9IHByZXNldC0+aW5pdF9ob29rOwotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLQlzcGVjLT5wb3dlcl9ob29rID0gcHJlc2V0LT5wb3dlcl9ob29rOwotCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSBwcmVzZXQtPmxvb3BiYWNrczsKLSNlbmRpZgotCi0JaWYgKHByZXNldC0+c2V0dXApCi0JCXByZXNldC0+c2V0dXAoY29kZWMpOwotCi0JYWxjX2ZpeHVwX2F1dG9jZmdfcGluX251bXMoY29kZWMpOwotfQotCiAvKiBFbmFibGUgR1BJTyBtYXNrIGFuZCBzZXQgb3V0cHV0ICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsY19ncGlvMV9pbml0X3ZlcmJzW10gPSB7CiAJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwMX0sCkBAIC0xMDUxLDE0ICs0MzAsMTkgQEAKIAlhbGNfZml4X3BsbChjb2RlYyk7CiB9CiAKKy8qCisgKiBKYWNrLXJlcG9ydGluZyB2aWEgaW5wdXQtamFjayBsYXllcgorICovCisKKy8qIGluaXRpYWxpemF0aW9uIG9mIGphY2tzOyBjdXJyZW50bHkgY2hlY2tzIG9ubHkgYSBmZXcga25vd24gcGlucyAqLwogc3RhdGljIGludCBhbGNfaW5pdF9qYWNrcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9JTlBVVF9KQUNLCiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBpbnQgaHBfbmlkID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOwotCXVuc2lnbmVkIGludCBtaWNfbmlkID0gc3BlYy0+ZXh0X21pYy5waW47Ci0JdW5zaWduZWQgaW50IGRvY2tfbmlkID0gc3BlYy0+ZG9ja19taWMucGluOworCXVuc2lnbmVkIGludCBtaWNfbmlkID0gc3BlYy0+ZXh0X21pY19waW47CisJdW5zaWduZWQgaW50IGRvY2tfbmlkID0gc3BlYy0+ZG9ja19taWNfcGluOwogCiAJaWYgKGhwX25pZCkgewogCQllcnIgPSBzbmRfaGRhX2lucHV0X2phY2tfYWRkKGNvZGVjLCBocF9uaWQsCkBAIC0xMDg2LDcgKzQ3MCwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRldGVjdF9qYWNrcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG51bV9waW5zLCBoZGFfbmlkX3QgKnBpbnMpCisvKgorICogSmFjayBkZXRlY3Rpb25zIGZvciBIUCBhdXRvLW11dGUgYW5kIG1pYy1zd2l0Y2gKKyAqLworCisvKiBjaGVjayBlYWNoIHBpbiBpbiB0aGUgZ2l2ZW4gYXJyYXk7IHJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlbSBpcyBwbHVnZ2VkICovCitzdGF0aWMgYm9vbCBkZXRlY3RfamFja3Moc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBudW1fcGlucywgaGRhX25pZF90ICpwaW5zKQogewogCWludCBpLCBwcmVzZW50ID0gMDsKIApAQCAtMTEwMCw2ICs0ODksNyBAQAogCXJldHVybiBwcmVzZW50OwogfQogCisvKiBzdGFuZGFyZCBIUC9saW5lLW91dCBhdXRvLW11dGUgaGVscGVyICovCiBzdGF0aWMgdm9pZCBkb19hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG51bV9waW5zLCBoZGFfbmlkX3QgKnBpbnMsCiAJCQlib29sIG11dGUsIGJvb2wgaHBfb3V0KQogewpAQCAtMTE0MSw2ICs1MzEsMTMgQEAKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgb247CiAKKwkvKiBDb250cm9sIEhQIHBpbnMvYW1wcyBkZXBlbmRpbmcgb24gbWFzdGVyX211dGUgc3RhdGU7CisJICogaW4gZ2VuZXJhbCwgSFAgcGlucy9hbXBzIGNvbnRyb2wgc2hvdWxkIGJlIGVuYWJsZWQgaW4gYWxsIGNhc2VzLAorCSAqIGJ1dCBjdXJyZW50bHkgc2V0IG9ubHkgZm9yIG1hc3Rlcl9tdXRlLCBqdXN0IHRvIGJlIHNhZmUKKwkgKi8KKwlkb19hdXRvbXV0ZShjb2RlYywgQVJSQVlfU0laRShzcGVjLT5hdXRvY2ZnLmhwX3BpbnMpLAorCQkgICAgc3BlYy0+YXV0b2NmZy5ocF9waW5zLCBzcGVjLT5tYXN0ZXJfbXV0ZSwgdHJ1ZSk7CisKIAlpZiAoIXNwZWMtPmF1dG9tdXRlKQogCQlvbiA9IDA7CiAJZWxzZQpAQCAtMTE2Myw2ICs1NjAsNyBAQAogCQkgICAgc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zLCBvbiwgZmFsc2UpOwogfQogCisvKiBzdGFuZGFyZCBIUC1hdXRvbXV0ZSBoZWxwZXIgKi8KIHN0YXRpYyB2b2lkIGFsY19ocF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKQEAgLTExNzUsNiArNTczLDcgQEAKIAl1cGRhdGVfc3BlYWtlcnMoY29kZWMpOwogfQogCisvKiBzdGFuZGFyZCBsaW5lLW91dC1hdXRvbXV0ZSBoZWxwZXIgKi8KIHN0YXRpYyB2b2lkIGFsY19saW5lX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwpAQCAtMTE4NywxMDYgKzU4NiwzMyBAQAogCXVwZGF0ZV9zcGVha2Vycyhjb2RlYyk7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X2Nvbm5lY3Rpb25faW5kZXgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBtdXgsCi0JCQkJaGRhX25pZF90IG5pZCkKLXsKLQloZGFfbmlkX3QgY29ubltIREFfTUFYX05VTV9JTlBVVFNdOwotCWludCBpLCBudW1zOworI2RlZmluZSBnZXRfY29ubmVjdGlvbl9pbmRleChjb2RlYywgbXV4LCBuaWQpIFwKKwlzbmRfaGRhX2dldF9jb25uX2luZGV4KGNvZGVjLCBtdXgsIG5pZCwgMCkKIAotCW51bXMgPSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyhjb2RlYywgbXV4LCBjb25uLCBBUlJBWV9TSVpFKGNvbm4pKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtczsgaSsrKQotCQlpZiAoY29ubltpXSA9PSBuaWQpCi0JCQlyZXR1cm4gaTsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qIHN3aXRjaCB0aGUgY3VycmVudCBBREMgYWNjb3JkaW5nIHRvIHRoZSBqYWNrIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGNfZHVhbF9taWNfYWRjX2F1dG9fc3dpdGNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXVuc2lnbmVkIGludCBwcmVzZW50OwotCWhkYV9uaWRfdCBuZXdfYWRjOwotCi0JcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIHNwZWMtPmV4dF9taWMucGluKTsKLQlpZiAocHJlc2VudCkKLQkJc3BlYy0+Y3VyX2FkY19pZHggPSAxOwotCWVsc2UKLQkJc3BlYy0+Y3VyX2FkY19pZHggPSAwOwotCW5ld19hZGMgPSBzcGVjLT5hZGNfbmlkc1tzcGVjLT5jdXJfYWRjX2lkeF07Ci0JaWYgKHNwZWMtPmN1cl9hZGMgJiYgc3BlYy0+Y3VyX2FkYyAhPSBuZXdfYWRjKSB7Ci0JCS8qIHN0cmVhbSBpcyBydW5uaW5nLCBsZXQncyBzd2FwIHRoZSBjdXJyZW50IEFEQyAqLwotCQlfX3NuZF9oZGFfY29kZWNfY2xlYW51cF9zdHJlYW0oY29kZWMsIHNwZWMtPmN1cl9hZGMsIDEpOwotCQlzcGVjLT5jdXJfYWRjID0gbmV3X2FkYzsKLQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG5ld19hZGMsCi0JCQkJCSAgIHNwZWMtPmN1cl9hZGNfc3RyZWFtX3RhZywgMCwKLQkJCQkJICAgc3BlYy0+Y3VyX2FkY19mb3JtYXQpOwotCX0KLX0KLQorLyogc3RhbmRhcmQgbWljIGF1dG8tc3dpdGNoIGhlbHBlciAqLwogc3RhdGljIHZvaWQgYWxjX21pY19hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzdHJ1Y3QgYWxjX21pY19yb3V0ZSAqZGVhZDEsICpkZWFkMiwgKmFsaXZlOwotCXVuc2lnbmVkIGludCBwcmVzZW50LCB0eXBlOwotCWhkYV9uaWRfdCBjYXBfbmlkOworCWhkYV9uaWRfdCAqcGlucyA9IHNwZWMtPmltdXhfcGluczsKIAotCWlmICghc3BlYy0+YXV0b19taWMpCi0JCXJldHVybjsKLQlpZiAoIXNwZWMtPmludF9taWMucGluIHx8ICFzcGVjLT5leHRfbWljLnBpbikKKwlpZiAoIXNwZWMtPmF1dG9fbWljIHx8ICFzcGVjLT5hdXRvX21pY192YWxpZF9pbXV4KQogCQlyZXR1cm47CiAJaWYgKHNuZF9CVUdfT04oIXNwZWMtPmFkY19uaWRzKSkKIAkJcmV0dXJuOwotCi0JaWYgKHNwZWMtPmR1YWxfYWRjX3N3aXRjaCkgewotCQlhbGNfZHVhbF9taWNfYWRjX2F1dG9fc3dpdGNoKGNvZGVjKTsKKwlpZiAoc25kX0JVR19PTihzcGVjLT5pbnRfbWljX2lkeCA8IDAgfHwgc3BlYy0+ZXh0X21pY19pZHggPCAwKSkKIAkJcmV0dXJuOwotCX0KIAotCWNhcF9uaWQgPSBzcGVjLT5jYXBzcmNfbmlkcyA/IHNwZWMtPmNhcHNyY19uaWRzWzBdIDogc3BlYy0+YWRjX25pZHNbMF07CisJaWYgKHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIHBpbnNbc3BlYy0+ZXh0X21pY19pZHhdKSkKKwkJYWxjX211eF9zZWxlY3QoY29kZWMsIDAsIHNwZWMtPmV4dF9taWNfaWR4LCBmYWxzZSk7CisJZWxzZSBpZiAoc3BlYy0+ZG9ja19taWNfaWR4ID49IDAgJiYKKwkJICAgc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgcGluc1tzcGVjLT5kb2NrX21pY19pZHhdKSkKKwkJYWxjX211eF9zZWxlY3QoY29kZWMsIDAsIHNwZWMtPmRvY2tfbWljX2lkeCwgZmFsc2UpOworCWVsc2UKKwkJYWxjX211eF9zZWxlY3QoY29kZWMsIDAsIHNwZWMtPmludF9taWNfaWR4LCBmYWxzZSk7CiAKLQlhbGl2ZSA9ICZzcGVjLT5pbnRfbWljOwotCWRlYWQxID0gJnNwZWMtPmV4dF9taWM7Ci0JZGVhZDIgPSAmc3BlYy0+ZG9ja19taWM7Ci0KLQlwcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgc3BlYy0+ZXh0X21pYy5waW4pOwotCWlmIChwcmVzZW50KSB7Ci0JCWFsaXZlID0gJnNwZWMtPmV4dF9taWM7Ci0JCWRlYWQxID0gJnNwZWMtPmludF9taWM7Ci0JCWRlYWQyID0gJnNwZWMtPmRvY2tfbWljOwotCX0KLQlpZiAoIXByZXNlbnQgJiYgc3BlYy0+ZG9ja19taWMucGluID4gMCkgewotCQlwcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgc3BlYy0+ZG9ja19taWMucGluKTsKLQkJaWYgKHByZXNlbnQpIHsKLQkJCWFsaXZlID0gJnNwZWMtPmRvY2tfbWljOwotCQkJZGVhZDEgPSAmc3BlYy0+aW50X21pYzsKLQkJCWRlYWQyID0gJnNwZWMtPmV4dF9taWM7Ci0JCX0KLQkJc25kX2hkYV9pbnB1dF9qYWNrX3JlcG9ydChjb2RlYywgc3BlYy0+ZG9ja19taWMucGluKTsKLQl9Ci0KLQl0eXBlID0gZ2V0X3djYXBzX3R5cGUoZ2V0X3djYXBzKGNvZGVjLCBjYXBfbmlkKSk7Ci0JaWYgKHR5cGUgPT0gQUNfV0lEX0FVRF9NSVgpIHsKLQkJLyogTWF0cml4LW1peGVyIHN0eWxlIChlLmcuIEFMQzg4MikgKi8KLQkJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCBjYXBfbmlkLCBIREFfSU5QVVQsCi0JCQkJCSBhbGl2ZS0+bXV4X2lkeCwKLQkJCQkJIEhEQV9BTVBfTVVURSwgMCk7Ci0JCWlmIChkZWFkMS0+cGluID4gMCkKLQkJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgY2FwX25pZCwgSERBX0lOUFVULAotCQkJCQkJIGRlYWQxLT5tdXhfaWR4LAotCQkJCQkJIEhEQV9BTVBfTVVURSwgSERBX0FNUF9NVVRFKTsKLQkJaWYgKGRlYWQyLT5waW4gPiAwKQotCQkJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCBjYXBfbmlkLCBIREFfSU5QVVQsCi0JCQkJCQkgZGVhZDItPm11eF9pZHgsCi0JCQkJCQkgSERBX0FNUF9NVVRFLCBIREFfQU1QX01VVEUpOwotCX0gZWxzZSB7Ci0JCS8qIE1VWCBzdHlsZSAoZS5nLiBBTEM4ODApICovCi0JCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIGNhcF9uaWQsIDAsCi0JCQkJCSAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCi0JCQkJCSAgYWxpdmUtPm11eF9pZHgpOwotCX0KLQlzbmRfaGRhX2lucHV0X2phY2tfcmVwb3J0KGNvZGVjLCBzcGVjLT5leHRfbWljLnBpbik7Ci0KLQkvKiBGSVhNRTogYW5hbG9nIG1peGVyICovCisJc25kX2hkYV9pbnB1dF9qYWNrX3JlcG9ydChjb2RlYywgcGluc1tzcGVjLT5leHRfbWljX2lkeF0pOworCWlmIChzcGVjLT5kb2NrX21pY19pZHggPj0gMCkKKwkJc25kX2hkYV9pbnB1dF9qYWNrX3JlcG9ydChjb2RlYywgcGluc1tzcGVjLT5kb2NrX21pY19pZHhdKTsKIH0KIAogLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgc2Vuc2luZyAqLwpAQCAtMTI5NywxOCArNjIzLDE5IEBACiAJZWxzZQogCQlyZXMgPj49IDI2OwogCXN3aXRjaCAocmVzKSB7Ci0JY2FzZSBBTEM4ODBfSFBfRVZFTlQ6CisJY2FzZSBBTENfSFBfRVZFTlQ6CiAJCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7CiAJCWJyZWFrOwotCWNhc2UgQUxDODgwX0ZST05UX0VWRU5UOgorCWNhc2UgQUxDX0ZST05UX0VWRU5UOgogCQlhbGNfbGluZV9hdXRvbXV0ZShjb2RlYyk7CiAJCWJyZWFrOwotCWNhc2UgQUxDODgwX01JQ19FVkVOVDoKKwljYXNlIEFMQ19NSUNfRVZFTlQ6CiAJCWFsY19taWNfYXV0b211dGUoY29kZWMpOwogCQlicmVhazsKIAl9CiB9CiAKKy8qIGNhbGwgaW5pdCBmdW5jdGlvbnMgb2Ygc3RhbmRhcmQgYXV0by1tdXRlIGhlbHBlcnMgKi8KIHN0YXRpYyB2b2lkIGFsY19pbml0aG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlhbGNfaHBfYXV0b211dGUoY29kZWMpOwpAQCAtMTMzNCw2ICs2NjEsNyBAQAogCQkJCSAgICBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIDB4MzAzMCk7CiB9CiAKKy8qIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gZm9yIEFMQzg4OSB2YXJpYW50cyAqLwogc3RhdGljIHZvaWQgYWxjODg5X2NvZWZfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwpAQCAtMTM1OCwyOCArNjg2LDEyIEBACiBzdGF0aWMgdm9pZCBhbGNfYXV0b19zZXR1cF9lYXBkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBib29sIG9uKQogewogCS8qIFdlIGN1cnJlbnRseSBvbmx5IGhhbmRsZSBmcm9udCwgSFAgKi8KLQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKLQljYXNlIDB4MTBlYzAyNjA6Ci0JCXNldF9lYXBkKGNvZGVjLCAweDBmLCBvbik7Ci0JCXNldF9lYXBkKGNvZGVjLCAweDEwLCBvbik7Ci0JCWJyZWFrOwotCWNhc2UgMHgxMGVjMDI2MjoKLQljYXNlIDB4MTBlYzAyNjc6Ci0JY2FzZSAweDEwZWMwMjY4OgotCWNhc2UgMHgxMGVjMDI2OToKLQljYXNlIDB4MTBlYzAyNzA6Ci0JY2FzZSAweDEwZWMwMjcyOgotCWNhc2UgMHgxMGVjMDY2MDoKLQljYXNlIDB4MTBlYzA2NjI6Ci0JY2FzZSAweDEwZWMwNjYzOgotCWNhc2UgMHgxMGVjMDY2NToKLQljYXNlIDB4MTBlYzA4NjI6Ci0JY2FzZSAweDEwZWMwODg5OgotCWNhc2UgMHgxMGVjMDg5MjoKLQkJc2V0X2VhcGQoY29kZWMsIDB4MTQsIG9uKTsKLQkJc2V0X2VhcGQoY29kZWMsIDB4MTUsIG9uKTsKLQkJYnJlYWs7Ci0JfQorCXN0YXRpYyBoZGFfbmlkX3QgcGluc1tdID0geworCQkweDBmLCAweDEwLCAweDE0LCAweDE1LCAwCisJfTsKKwloZGFfbmlkX3QgKnA7CisJZm9yIChwID0gcGluczsgKnA7IHArKykKKwkJc2V0X2VhcGQoY29kZWMsICpwLCBvbik7CiB9CiAKIC8qIGdlbmVyaWMgc2h1dHVwIGNhbGxiYWNrOwpAQCAtMTM5MSwxMCArNzAzLDEyIEBACiAJbXNsZWVwKDIwMCk7CiB9CiAKKy8qIGdlbmVyaWMgRUFQRCBpbml0aWFsaXphdGlvbiAqLwogc3RhdGljIHZvaWQgYWxjX2F1dG9faW5pdF9hbXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCB0eXBlKQogewogCXVuc2lnbmVkIGludCB0bXA7CiAKKwlhbGNfYXV0b19zZXR1cF9lYXBkKGNvZGVjLCB0cnVlKTsKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFMQ19JTklUX0dQSU8xOgogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBhbGNfZ3BpbzFfaW5pdF92ZXJicyk7CkBAIC0xNDA2LDcgKzcyMCw2IEBACiAJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGFsY19ncGlvM19pbml0X3ZlcmJzKTsKIAkJYnJlYWs7CiAJY2FzZSBBTENfSU5JVF9ERUZBVUxUOgotCQlhbGNfYXV0b19zZXR1cF9lYXBkKGNvZGVjLCB0cnVlKTsKIAkJc3dpdGNoIChjb2RlYy0+dmVuZG9yX2lkKSB7CiAJCWNhc2UgMHgxMGVjMDI2MDoKIAkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MWEsIDAsCkBAIC0xNDUwLDYgKzc2Myw5IEBACiAJfQogfQogCisvKgorICogQXV0by1NdXRlIG1vZGUgbWl4ZXIgZW51bSBzdXBwb3J0CisgKi8KIHN0YXRpYyBpbnQgYWxjX2F1dG9tdXRlX21vZGVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7CkBAIC0xNTM2LDcgKzg1MiwxMSBAQAogCS5wdXQgPSBhbGNfYXV0b211dGVfbW9kZV9wdXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmFsY19rY29udHJvbF9uZXcoc3RydWN0IGFsY19zcGVjICpzcGVjKTsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqYWxjX2tjb250cm9sX25ldyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMpCit7CisJc25kX2FycmF5X2luaXQoJnNwZWMtPmtjdGxzLCBzaXplb2Yoc3RydWN0IHNuZF9rY29udHJvbF9uZXcpLCAzMik7CisJcmV0dXJuIHNuZF9hcnJheV9uZXcoJnNwZWMtPmtjdGxzKTsKK30KIAogc3RhdGljIGludCBhbGNfYWRkX2F1dG9tdXRlX21vZGVfZW51bShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKQEAgLTE1NTMsNiArODczLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBDaGVjayB0aGUgYXZhaWxhYmlsaXR5IG9mIEhQL2xpbmUtb3V0IGF1dG8tbXV0ZTsKKyAqIFNldCB1cCBhcHByb3ByaWF0ZWx5IGlmIHJlYWxseSBzdXBwb3J0ZWQKKyAqLwogc3RhdGljIHZvaWQgYWxjX2luaXRfYXV0b19ocChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKQEAgLTE1OTEsNyArOTE1LDcgQEAKIAkJCSAgICBuaWQpOwogCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCiAJCQkJICBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsCi0JCQkJICBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVCk7CisJCQkJICBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVCk7CiAJCXNwZWMtPmF1dG9tdXRlID0gMTsKIAkJc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47CiAJfQpAQCAtMTYwNiw3ICs5MzAsNyBAQAogCQkJCSAgICAib24gTklEIDB4JXhcbiIsIG5pZCk7CiAJCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCiAJCQkJCUFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwKLQkJCQkJQUNfVVNSU1BfRU4gfCBBTEM4ODBfRlJPTlRfRVZFTlQpOworCQkJCQlBQ19VU1JTUF9FTiB8IEFMQ19GUk9OVF9FVkVOVCk7CiAJCQlzcGVjLT5kZXRlY3RfbGluZSA9IDE7CiAJCX0KIAkJc3BlYy0+YXV0b211dGVfbGluZXMgPSBzcGVjLT5kZXRlY3RfbGluZTsKQEAgLTE2MTksNiArOTQzLDEzMiBAQAogCX0KIH0KIAorLyogcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiBOSUQgaW4gdGhlIGxpc3QsIG9yIC0xIGlmIG5vdCBmb3VuZCAqLworc3RhdGljIGludCBmaW5kX2lkeF9pbl9uaWRfbGlzdChoZGFfbmlkX3QgbmlkLCBjb25zdCBoZGFfbmlkX3QgKmxpc3QsIGludCBudW1zKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBudW1zOyBpKyspCisJCWlmIChsaXN0W2ldID09IG5pZCkKKwkJCXJldHVybiBpOworCXJldHVybiAtMTsKK30KKworLyogY2hlY2sgd2hldGhlciBkeW5hbWljIEFEQy1zd2l0Y2hpbmcgaXMgYXZhaWxhYmxlICovCitzdGF0aWMgYm9vbCBhbGNfY2hlY2tfZHluX2FkY19zd2l0Y2goc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOworCWludCBpLCBuLCBpZHg7CisJaGRhX25pZF90IGNhcCwgcGluOworCisJaWYgKGltdXggIT0gc3BlYy0+aW5wdXRfbXV4KSAvKiBubyBkeW5hbWljIGltdXg/ICovCisJCXJldHVybiBmYWxzZTsKKworCWZvciAobiA9IDA7IG4gPCBzcGVjLT5udW1fYWRjX25pZHM7IG4rKykgeworCQljYXAgPSBzcGVjLT5wcml2YXRlX2NhcHNyY19uaWRzW25dOworCQlmb3IgKGkgPSAwOyBpIDwgaW11eC0+bnVtX2l0ZW1zOyBpKyspIHsKKwkJCXBpbiA9IHNwZWMtPmltdXhfcGluc1tpXTsKKwkJCWlmICghcGluKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWlmIChnZXRfY29ubmVjdGlvbl9pbmRleChjb2RlYywgY2FwLCBwaW4pIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA+PSBpbXV4LT5udW1faXRlbXMpCisJCQlyZXR1cm4gdHJ1ZTsgLyogbm8gQURDLXN3aXRjaCBpcyBuZWVkZWQgKi8KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaW11eC0+bnVtX2l0ZW1zOyBpKyspIHsKKwkJcGluID0gc3BlYy0+aW11eF9waW5zW2ldOworCQlmb3IgKG4gPSAwOyBuIDwgc3BlYy0+bnVtX2FkY19uaWRzOyBuKyspIHsKKwkJCWNhcCA9IHNwZWMtPnByaXZhdGVfY2Fwc3JjX25pZHNbbl07CisJCQlpZHggPSBnZXRfY29ubmVjdGlvbl9pbmRleChjb2RlYywgY2FwLCBwaW4pOworCQkJaWYgKGlkeCA+PSAwKSB7CisJCQkJaW11eC0+aXRlbXNbaV0uaW5kZXggPSBpZHg7CisJCQkJc3BlYy0+ZHluX2FkY19pZHhbaV0gPSBuOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJc25kX3ByaW50ZGQoInJlYWx0ZWs6IGVuYWJsaW5nIEFEQyBzd2l0Y2hpbmdcbiIpOworCXNwZWMtPmR5bl9hZGNfc3dpdGNoID0gMTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogcmVidWlsZCBpbXV4IGZvciBtYXRjaGluZyB3aXRoIHRoZSBnaXZlbiBhdXRvLW1pYyBwaW5zIChpZiBub3QgeWV0KSAqLworc3RhdGljIGJvb2wgYWxjX3JlYnVpbGRfaW11eF9mb3JfYXV0b19taWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXg7CisJc3RhdGljIGNoYXIgKiBjb25zdCB0ZXh0c1szXSA9IHsKKwkJIk1pYyIsICJJbnRlcm5hbCBNaWMiLCAiRG9jayBNaWMiCisJfTsKKwlpbnQgaTsKKworCWlmICghc3BlYy0+YXV0b19taWMpCisJCXJldHVybiBmYWxzZTsKKwlpbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFswXTsKKwlpZiAoc3BlYy0+aW5wdXRfbXV4ID09IGltdXgpCisJCXJldHVybiB0cnVlOworCXNwZWMtPmltdXhfcGluc1swXSA9IHNwZWMtPmV4dF9taWNfcGluOworCXNwZWMtPmltdXhfcGluc1sxXSA9IHNwZWMtPmludF9taWNfcGluOworCXNwZWMtPmltdXhfcGluc1syXSA9IHNwZWMtPmRvY2tfbWljX3BpbjsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXN0cmNweShpbXV4LT5pdGVtc1tpXS5sYWJlbCwgdGV4dHNbaV0pOworCQlpZiAoc3BlYy0+aW11eF9waW5zW2ldKQorCQkJaW11eC0+bnVtX2l0ZW1zID0gaSArIDE7CisJfQorCXNwZWMtPm51bV9tdXhfZGVmcyA9IDE7CisJc3BlYy0+aW5wdXRfbXV4ID0gaW11eDsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogY2hlY2sgd2hldGhlciBhbGwgYXV0by1taWMgcGlucyBhcmUgdmFsaWQ7IHNldHVwIGluZGljZXMgaWYgT0sgKi8KK3N0YXRpYyBib29sIGFsY19hdXRvX21pY19jaGVja19pbXV4KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4OworCisJaWYgKCFzcGVjLT5hdXRvX21pYykKKwkJcmV0dXJuIGZhbHNlOworCWlmIChzcGVjLT5hdXRvX21pY192YWxpZF9pbXV4KQorCQlyZXR1cm4gdHJ1ZTsgLyogYWxyZWFkeSBjaGVja2VkICovCisKKwkvKiBmaWxsIHVwIGltdXggaW5kaWNlcyAqLworCWlmICghYWxjX2NoZWNrX2R5bl9hZGNfc3dpdGNoKGNvZGVjKSkgeworCQlzcGVjLT5hdXRvX21pYyA9IDA7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpbXV4ID0gc3BlYy0+aW5wdXRfbXV4OworCXNwZWMtPmV4dF9taWNfaWR4ID0gZmluZF9pZHhfaW5fbmlkX2xpc3Qoc3BlYy0+ZXh0X21pY19waW4sCisJCQkJCXNwZWMtPmltdXhfcGlucywgaW11eC0+bnVtX2l0ZW1zKTsKKwlzcGVjLT5pbnRfbWljX2lkeCA9IGZpbmRfaWR4X2luX25pZF9saXN0KHNwZWMtPmludF9taWNfcGluLAorCQkJCQlzcGVjLT5pbXV4X3BpbnMsIGltdXgtPm51bV9pdGVtcyk7CisJc3BlYy0+ZG9ja19taWNfaWR4ID0gZmluZF9pZHhfaW5fbmlkX2xpc3Qoc3BlYy0+ZG9ja19taWNfcGluLAorCQkJCQlzcGVjLT5pbXV4X3BpbnMsIGltdXgtPm51bV9pdGVtcyk7CisJaWYgKHNwZWMtPmV4dF9taWNfaWR4IDwgMCB8fCBzcGVjLT5pbnRfbWljX2lkeCA8IDApIHsKKwkJc3BlYy0+YXV0b19taWMgPSAwOworCQlyZXR1cm4gZmFsc2U7IC8qIG5vIGNvcnJlc3BvbmRpbmcgaW11eCAqLworCX0KKworCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIHNwZWMtPmV4dF9taWNfcGluLCAwLAorCQkJCSAgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAorCQkJCSAgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UKTsKKwlpZiAoc3BlYy0+ZG9ja19taWNfcGluKQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBzcGVjLT5kb2NrX21pY19waW4sIDAsCisJCQkJICBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsCisJCQkJICBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlQpOworCisJc3BlYy0+YXV0b19taWNfdmFsaWRfaW11eCA9IDE7CisJc3BlYy0+YXV0b19taWMgPSAxOworCXJldHVybiB0cnVlOworfQorCisvKgorICogQ2hlY2sgdGhlIGF2YWlsYWJpbGl0eSBvZiBhdXRvLW1pYyBzd2l0Y2g7CisgKiBTZXQgdXAgaWYgcmVhbGx5IHN1cHBvcnRlZAorICovCiBzdGF0aWMgdm9pZCBhbGNfaW5pdF9hdXRvX21pYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKQEAgLTE2MjYsNiArMTA3Niw4IEBACiAJaGRhX25pZF90IGZpeGVkLCBleHQsIGRvY2s7CiAJaW50IGk7CiAKKwlzcGVjLT5leHRfbWljX2lkeCA9IHNwZWMtPmludF9taWNfaWR4ID0gc3BlYy0+ZG9ja19taWNfaWR4ID0gLTE7CisKIAlmaXhlZCA9IGV4dCA9IGRvY2sgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgewogCQloZGFfbmlkX3QgbmlkID0gY2ZnLT5pbnB1dHNbaV0ucGluOwpAQCAtMTY2NywyMSArMTExOSwzMiBAQAogCQlyZXR1cm47IC8qIG5vIHVuc29sIHN1cHBvcnQgKi8KIAlpZiAoZG9jayAmJiAhaXNfamFja19kZXRlY3RhYmxlKGNvZGVjLCBkb2NrKSkKIAkJcmV0dXJuOyAvKiBubyB1bnNvbCBzdXBwb3J0ICovCisKKwkvKiBjaGVjayBpbXV4IGluZGljZXMgKi8KKwlzcGVjLT5leHRfbWljX3BpbiA9IGV4dDsKKwlzcGVjLT5pbnRfbWljX3BpbiA9IGZpeGVkOworCXNwZWMtPmRvY2tfbWljX3BpbiA9IGRvY2s7CisKKwlzcGVjLT5hdXRvX21pYyA9IDE7CisJaWYgKCFhbGNfYXV0b19taWNfY2hlY2tfaW11eChjb2RlYykpCisJCXJldHVybjsKKwogCXNuZF9wcmludGRkKCJyZWFsdGVrOiBFbmFibGUgYXV0by1taWMgc3dpdGNoIG9uIE5JRCAweCV4LzB4JXgvMHgleFxuIiwKIAkJICAgIGV4dCwgZml4ZWQsIGRvY2spOwotCXNwZWMtPmV4dF9taWMucGluID0gZXh0OwotCXNwZWMtPmRvY2tfbWljLnBpbiA9IGRvY2s7Ci0Jc3BlYy0+aW50X21pYy5waW4gPSBmaXhlZDsKLQlzcGVjLT5leHRfbWljLm11eF9pZHggPSBNVVhfSURYX1VOREVGOyAvKiBzZXQgbGF0ZXIgKi8KLQlzcGVjLT5kb2NrX21pYy5tdXhfaWR4ID0gTVVYX0lEWF9VTkRFRjsgLyogc2V0IGxhdGVyICovCi0Jc3BlYy0+aW50X21pYy5tdXhfaWR4ID0gTVVYX0lEWF9VTkRFRjsgLyogc2V0IGxhdGVyICovCi0Jc3BlYy0+YXV0b19taWMgPSAxOwotCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIHNwZWMtPmV4dF9taWMucGluLCAwLAotCQkJCSAgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAotCQkJCSAgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UKTsKIAlzcGVjLT51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQ7CiB9CiAKKy8qIGNoZWNrIHRoZSBhdmFpbGFiaWxpdGllcyBvZiBhdXRvLW11dGUgYW5kIGF1dG8tbWljIHN3aXRjaGVzICovCitzdGF0aWMgdm9pZCBhbGNfYXV0b19jaGVja19zd2l0Y2hlcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlhbGNfaW5pdF9hdXRvX2hwKGNvZGVjKTsKKwlhbGNfaW5pdF9hdXRvX21pYyhjb2RlYyk7Cit9CisKKy8qCisgKiBSZWFsdGVrIFNTSUQgdmVyaWZpY2F0aW9uCisgKi8KKwogLyogQ291bGQgYmUgYW55IG5vbi16ZXJvIGFuZCBldmVuIHZhbHVlLiBXaGVuIHVzZWQgYXMgZml4dXAsIHRlbGxzCiAgKiB0aGUgZHJpdmVyIHRvIGlnbm9yZSBhbnkgcHJlc2VudCBza3UgZGVmaW5lcy4KICAqLwpAQCAtMTc1Miw2ICsxMjE1LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBOSUQgaXMgZm91bmQgaW4gdGhlIGxpc3QgKi8KK3N0YXRpYyBib29sIGZvdW5kX2luX25pZF9saXN0KGhkYV9uaWRfdCBuaWQsIGNvbnN0IGhkYV9uaWRfdCAqbGlzdCwgaW50IG51bXMpCit7CisJcmV0dXJuIGZpbmRfaWR4X2luX25pZF9saXN0KG5pZCwgbGlzdCwgbnVtcykgPj0gMDsKK30KKwogLyogY2hlY2sgc3Vic3lzdGVtIElEIGFuZCBzZXQgdXAgZGV2aWNlLXNwZWNpZmljIGluaXRpYWxpemF0aW9uOwogICogcmV0dXJuIDEgaWYgaW5pdGlhbGl6ZWQsIDAgaWYgaW52YWxpZCBTU0lECiAgKi8KQEAgLTE4NjEsMjcgKzEzMzAsMjQgQEAKIAkJCW5pZCA9IHBvcnRpOwogCQllbHNlCiAJCQlyZXR1cm4gMTsKLQkJZm9yIChpID0gMDsgaSA8IHNwZWMtPmF1dG9jZmcubGluZV9vdXRzOyBpKyspCi0JCQlpZiAoc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zW2ldID09IG5pZCkKLQkJCQlyZXR1cm4gMTsKKwkJaWYgKGZvdW5kX2luX25pZF9saXN0KG5pZCwgc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zLAorCQkJCSAgICAgIHNwZWMtPmF1dG9jZmcubGluZV9vdXRzKSkKKwkJCXJldHVybiAxOwogCQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSBuaWQ7CiAJfQogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBhbGNfc3NpZF9jaGVjayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCSAgIGhkYV9uaWRfdCBwb3J0YSwgaGRhX25pZF90IHBvcnRlLAotCQkJICAgaGRhX25pZF90IHBvcnRkLCBoZGFfbmlkX3QgcG9ydGkpCisvKiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgQUxDIHN1YnN5c3RlbS1pZAorICogcG9ydHMgY29udGFpbnMgYW4gYXJyYXkgb2YgNCBwaW4gTklEcyBmb3IgcG9ydC1BLCBFLCBEIGFuZCBJICovCitzdGF0aWMgdm9pZCBhbGNfc3NpZF9jaGVjayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgaGRhX25pZF90ICpwb3J0cykKIHsKLQlpZiAoIWFsY19zdWJzeXN0ZW1faWQoY29kZWMsIHBvcnRhLCBwb3J0ZSwgcG9ydGQsIHBvcnRpKSkgeworCWlmICghYWxjX3N1YnN5c3RlbV9pZChjb2RlYywgcG9ydHNbMF0sIHBvcnRzWzFdLCBwb3J0c1syXSwgcG9ydHNbM10pKSB7CiAJCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCQlzbmRfcHJpbnRkKCJyZWFsdGVrOiAiCiAJCQkgICAiRW5hYmxlIGRlZmF1bHQgc2V0dXAgZm9yIGF1dG8gbW9kZSBhcyBmYWxsYmFja1xuIik7CiAJCXNwZWMtPmluaXRfYW1wID0gQUxDX0lOSVRfREVGQVVMVDsKIAl9Ci0KLQlhbGNfaW5pdF9hdXRvX2hwKGNvZGVjKTsKLQlhbGNfaW5pdF9hdXRvX21pYyhjb2RlYyk7CiB9CiAKIC8qCkBAIC0yMDI5LDYgKzE0OTUsOSBAQAogCX0KIH0KIAorLyoKKyAqIENPRUYgYWNjZXNzIGhlbHBlciBmdW5jdGlvbnMKKyAqLwogc3RhdGljIGludCBhbGNfcmVhZF9jb2VmX2lkeChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCXVuc2lnbmVkIGludCBjb2VmX2lkeCkKIHsKQEAgLTIwNDksMjAgKzE1MTgsMzIgQEAKIAkJCSAgICBjb2VmX3ZhbCk7CiB9CiAKKy8qCisgKiBEaWdpdGFsIEkvTyBoYW5kbGluZworICovCisKIC8qIHNldCByaWdodCBwaW4gY29udHJvbHMgZm9yIGRpZ2l0YWwgSS9PICovCiBzdGF0aWMgdm9pZCBhbGNfYXV0b19pbml0X2RpZ2l0YWwoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaW50IGk7Ci0JaGRhX25pZF90IHBpbjsKKwloZGFfbmlkX3QgcGluLCBkYWM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+YXV0b2NmZy5kaWdfb3V0czsgaSsrKSB7CiAJCXBpbiA9IHNwZWMtPmF1dG9jZmcuZGlnX291dF9waW5zW2ldOwotCQlpZiAocGluKSB7Ci0JCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBwaW4sIDAsCi0JCQkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCi0JCQkJCSAgICBQSU5fT1VUKTsKLQkJfQorCQlpZiAoIXBpbikKKwkJCWNvbnRpbnVlOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBwaW4sIDAsCisJCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCk7CisJCWlmICghaSkKKwkJCWRhYyA9IHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkOworCQllbHNlCisJCQlkYWMgPSBzcGVjLT5zbGF2ZV9kaWdfb3V0c1tpIC0gMV07CisJCWlmICghZGFjIHx8ICEoZ2V0X3djYXBzKGNvZGVjLCBkYWMpICYgQUNfV0NBUF9PVVRfQU1QKSkKKwkJCWNvbnRpbnVlOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBkYWMsIDAsCisJCQkJICAgIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJCQkJICAgIEFNUF9PVVRfVU5NVVRFKTsKIAl9CiAJcGluID0gc3BlYy0+YXV0b2NmZy5kaWdfaW5fcGluOwogCWlmIChwaW4pCkBAIC0yMDgwLDExICsxNTYxLDEzIEBACiAKIAkvKiBzdXBwb3J0IG11bHRpcGxlIFNQRElGczsgdGhlIHNlY29uZGFyeSBpcyBzZXQgdXAgYXMgYSBzbGF2ZSAqLwogCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLmRpZ19vdXRzOyBpKyspIHsKKwkJaGRhX25pZF90IGNvbm5bNF07CiAJCWVyciA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLAogCQkJCQkgICAgICBzcGVjLT5hdXRvY2ZnLmRpZ19vdXRfcGluc1tpXSwKLQkJCQkJICAgICAgJmRpZ19uaWQsIDEpOworCQkJCQkgICAgICBjb25uLCBBUlJBWV9TSVpFKGNvbm4pKTsKIAkJaWYgKGVyciA8IDApCiAJCQljb250aW51ZTsKKwkJZGlnX25pZCA9IGNvbm5bMF07IC8qIGFzc3VtZSB0aGUgZmlyc3QgZWxlbWVudCBpcyBhdWRpby1vdXQgKi8KIAkJaWYgKCFpKSB7CiAJCQlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IGRpZ19uaWQ7CiAJCQlzcGVjLT5kaWdfb3V0X3R5cGUgPSBzcGVjLT5hdXRvY2ZnLmRpZ19vdXRfdHlwZVswXTsKQEAgLTIxMTcsNTcyICsxNjAwLDIyIEBACiB9CiAKIC8qCi0gKiBBTEM4ODgKKyAqIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMKICAqLwotCi0vKgotICogMmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfNFNUX2NoMl9pbnRlbF9pbml0W10gPSB7Ci0vKiBNaWMtaW4gamFjayBhcyBtaWMgaW4gKi8KLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCi0vKiBMaW5lLWluIGphY2sgYXMgTGluZSBpbiAqLwotCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAotLyogTGluZS1PdXQgYXMgRnJvbnQgKi8KLQl7IDB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogNGNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfNFNUX2NoNF9pbnRlbF9pbml0W10gPSB7Ci0vKiBNaWMtaW4gamFjayBhcyBtaWMgaW4gKi8KLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCi0vKiBMaW5lLWluIGphY2sgYXMgU3Vycm91bmQgKi8KLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLS8qIExpbmUtT3V0IGFzIEZyb250ICovCi0JeyAweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIDZjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4XzRTVF9jaDZfaW50ZWxfaW5pdFtdID0gewotLyogTWljLWluIGphY2sgYXMgQ0xGRSAqLwotCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotLyogTGluZS1pbiBqYWNrIGFzIFN1cnJvdW5kICovCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0vKiBMaW5lLU91dCBhcyBDTEZFICh3b3JrYXJvdW5kIGJlY2F1c2UgTWljLWluIGlzIG5vdCBsb3VkIGVub3VnaCkgKi8KLQl7IDB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogOGNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfNFNUX2NoOF9pbnRlbF9pbml0W10gPSB7Ci0vKiBNaWMtaW4gamFjayBhcyBDTEZFICovCi0JeyAweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0vKiBMaW5lLWluIGphY2sgYXMgU3Vycm91bmQgKi8KLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLS8qIExpbmUtT3V0IGFzIFNpZGUgKi8KLQl7IDB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODg4XzRTVF84Y2hfaW50ZWxfbW9kZXNbNF0gPSB7Ci0JeyAyLCBhbGM4ODhfNFNUX2NoMl9pbnRlbF9pbml0IH0sCi0JeyA0LCBhbGM4ODhfNFNUX2NoNF9pbnRlbF9pbml0IH0sCi0JeyA2LCBhbGM4ODhfNFNUX2NoNl9pbnRlbF9pbml0IH0sCi0JeyA4LCBhbGM4ODhfNFNUX2NoOF9pbnRlbF9pbml0IH0sCi19OwotCi0vKgotICogQUxDODg4IEZ1aml0c3UgU2llbWVucyBBbWlsbG8geGEzNTMwCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfZnVqaXRzdV94YTM1MzBfdmVyYnNbXSA9IHsKLS8qIEZyb250IE1pYzogc2V0IHRvIFBJTl9JTiAoZW1wdHkgYnkgZGVmYXVsdCkgKi8KLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotLyogQ29ubmVjdCBJbnRlcm5hbCBIUCB0byBGcm9udCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLS8qIENvbm5lY3QgQmFzcyBIUCB0byBGcm9udCAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLS8qIENvbm5lY3QgTGluZS1PdXQgc2lkZSBqYWNrIChTUERJRikgdG8gU2lkZSAqLwotCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKLS8qIENvbm5lY3QgTWljIGphY2sgdG8gQ0xGRSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwKLS8qIENvbm5lY3QgTGluZS1pbiBqYWNrIHRvIFN1cnJvdW5kICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotLyogQ29ubmVjdCBIUCBvdXQgamFjayB0byBGcm9udCAqLwotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLS8qIEVuYWJsZSB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBhbmQgTGluZS1vdXQgamFjayAqLwotCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0Je30KLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzg4OV9hdXRvbXV0ZV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTc7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbM10gPSAweDE5OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzRdID0gMHgxYTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4OV9pbnRlbF9pbml0X2hvb2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JYWxjODg5X2NvZWZfaW5pdChjb2RlYyk7Ci0JYWxjX2hwX2F1dG9tdXRlKGNvZGVjKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjODg4X2Z1aml0c3VfeGEzNTMwX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNzsgLyogbGluZS1vdXQgKi8KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMV0gPSAweDFiOyAvKiBocCAqLwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsgLyogc3BlYWtlciAqLwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNTsgLyogYmFzcyAqLwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotLyoKLSAqIEFMQzg4OCBBY2VyIEFzcGlyZSA0OTMwRyBtb2RlbAotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4X2FjZXJfYXNwaXJlXzQ5MzBnX3ZlcmJzW10gPSB7Ci0vKiBGcm9udCBNaWM6IHNldCB0byBQSU5fSU4gKGVtcHR5IGJ5IGRlZmF1bHQpICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLS8qIFVuc2VsZWN0IEZyb250IE1pYyBieSBkZWZhdWx0IGluIGlucHV0IG1peGVyIDMgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMHhiKX0sCi0vKiBFbmFibGUgdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0vKiBDb25uZWN0IEludGVybmFsIEhQIHRvIGZyb250ICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotLyogQ29ubmVjdCBIUCBvdXQgdG8gZnJvbnQgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7IH0KLX07Ci0KLS8qCi0gKiBBTEM4ODggQWNlciBBc3BpcmUgNjUzMEcgbW9kZWwKLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF9hY2VyX2FzcGlyZV82NTMwZ192ZXJic1tdID0gewotLyogUm91dGUgdG8gYnVpbHQtaW4gc3Vid29vZmVyIGFzIHdlbGwgYXMgc3BlYWtlcnMgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0vKiBCaWFzIHZvbHRhZ2Ugb24gZm9yIGV4dGVybmFsIG1pYyBwb3J0ICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIHwgUElOX1ZSRUY4MH0sCi0vKiBGcm9udCBNaWM6IHNldCB0byBQSU5fSU4gKGVtcHR5IGJ5IGRlZmF1bHQpICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLS8qIFVuc2VsZWN0IEZyb250IE1pYyBieSBkZWZhdWx0IGluIGlucHV0IG1peGVyIDMgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMHhiKX0sCi0vKiBFbmFibGUgdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0vKiBFbmFibGUgc3BlYWtlciBvdXRwdXQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCi0vKiBFbmFibGUgaGVhZHBob25lIG91dHB1dCAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAotCXsgfQotfTsKLQotLyoKLSAqQUxDODg4IEFjZXIgQXNwaXJlIDc3MzBHIG1vZGVsCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfYWNlcl9hc3BpcmVfNzczMEdfdmVyYnNbXSA9IHsKLS8qIEJpYXMgdm9sdGFnZSBvbiBmb3IgZXh0ZXJuYWwgbWljIHBvcnQgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfCBQSU5fVlJFRjgwfSwKLS8qIEZyb250IE1pYzogc2V0IHRvIFBJTl9JTiAoZW1wdHkgYnkgZGVmYXVsdCkgKi8KLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotLyogVW5zZWxlY3QgRnJvbnQgTWljIGJ5IGRlZmF1bHQgaW4gaW5wdXQgbWl4ZXIgMyAqLwotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgweGIpfSwKLS8qIEVuYWJsZSB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLS8qIEVuYWJsZSBzcGVha2VyIG91dHB1dCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLS8qIEVuYWJsZSBoZWFkcGhvbmUgb3V0cHV0ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB8IFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCi0vKkVuYWJsZSBpbnRlcm5hbCBzdWJ3b29mZXIgKi8KLQl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7IH0KLX07Ci0KLS8qCi0gKiBBTEM4ODkgQWNlciBBc3BpcmUgODkzMEcgbW9kZWwKLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OV9hY2VyX2FzcGlyZV84OTMwZ192ZXJic1tdID0gewotLyogRnJvbnQgTWljOiBzZXQgdG8gUElOX0lOIChlbXB0eSBieSBkZWZhdWx0KSAqLwotCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0vKiBVbnNlbGVjdCBGcm9udCBNaWMgYnkgZGVmYXVsdCBpbiBpbnB1dCBtaXhlciAzICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDB4Yil9LAotLyogRW5hYmxlIHVuc29saWNpdGVkIGV2ZW50IGZvciBIUCBqYWNrICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotLyogQ29ubmVjdCBJbnRlcm5hbCBGcm9udCB0byBGcm9udCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLS8qIENvbm5lY3QgSW50ZXJuYWwgUmVhciB0byBSZWFyICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotLyogQ29ubmVjdCBJbnRlcm5hbCBDTEZFIHRvIENMRkUgKi8KLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0vKiBDb25uZWN0IEhQIG91dCB0byBGcm9udCAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLS8qIEVuYWJsZSBhbGwgREFDcyAqLwotLyogIERBQyBESVNBQkxFL01VVEUgMT8gKi8KLS8qICBzZXR0aW5nIGJpdHMgMS01IGRpc2FibGVzIERBQyBuaWRzIDB4MDItMHgwNiBhcHBhcmVudGx5LiBJbml0PTB4MzggKi8KLQl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwM30sCi0JezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHgwMDAwfSwKLS8qICBEQUMgRElTQUJMRS9NVVRFIDI/ICovCi0vKiAgc29tZSBiaXQgaGVyZSBkaXNhYmxlcyB0aGUgb3RoZXIgREFDcy4gSW5pdD0weDQ5MDAgKi8KLQl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwOH0sCi0JezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHgwMDAwfSwKLS8qIERNSUMgZml4Ci0gKiBUaGlzIGxhcHRvcCBoYXMgYSBzdGVyZW8gZGlnaXRhbCBtaWNyb3Bob25lLiBUaGUgbWljcyBhcmUgb25seSAxY20gYXBhcnQKLSAqIHdoaWNoIG1ha2VzIHRoZSBzdGVyZW8gdXNlbGVzcy4gSG93ZXZlciwgZWl0aGVyIHRoZSBtaWMgb3IgdGhlIEFMQzg4OQotICogbWFrZXMgdGhlIHNpZ25hbCBiZWNvbWUgYSBkaWZmZXJlbmNlL3N1bSBzaWduYWwgaW5zdGVhZCBvZiBzdGFuZGFyZAotICogc3RlcmVvLCB3aGljaCBpcyBhbm5veWluZy4gU28gaW5zdGVhZCB3ZSBmbGlwIHRoaXMgYml0IHdoaWNoIG1ha2VzIHRoZQotICogY29kZWMgcmVwbGljYXRlIHRoZSBzdW0gc2lnbmFsIHRvIGJvdGggY2hhbm5lbHMsIHR1cm5pbmcgaXQgaW50byBhCi0gKiBub3JtYWwgbW9ubyBtaWMuCi0gKi8KLS8qICBETUlDX0NPTlRST0w/IEluaXQgdmFsdWUgPSAweDAwMDEgKi8KLQl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwYn0sCi0JezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHgwMDAzfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODhfMl9jYXB0dXJlX3NvdXJjZXNbMl0gPSB7Ci0JLyogRnJvbnQgbWljIG9ubHkgYXZhaWxhYmxlIG9uIG9uZSBBREMgKi8KLQl7Ci0JCS5udW1faXRlbXMgPSA0LAotCQkuaXRlbXMgPSB7Ci0JCQl7ICJNaWMiLCAweDAgfSwKLQkJCXsgIkxpbmUiLCAweDIgfSwKLQkJCXsgIkNEIiwgMHg0IH0sCi0JCQl7ICJGcm9udCBNaWMiLCAweGIgfSwKLQkJfSwKLQl9LAotCXsKLQkJLm51bV9pdGVtcyA9IDMsCi0JCS5pdGVtcyA9IHsKLQkJCXsgIk1pYyIsIDB4MCB9LAotCQkJeyAiTGluZSIsIDB4MiB9LAotCQkJeyAiQ0QiLCAweDQgfSwKLQkJfSwKLQl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODg4X2FjZXJfYXNwaXJlXzY1MzBfc291cmNlc1syXSA9IHsKLQkvKiBJbnRlcmFsIG1pYyBvbmx5IGF2YWlsYWJsZSBvbiBvbmUgQURDICovCi0JewotCQkubnVtX2l0ZW1zID0gNSwKLQkJLml0ZW1zID0gewotCQkJeyAiTWljIiwgMHgwIH0sCi0JCQl7ICJMaW5lIEluIiwgMHgyIH0sCi0JCQl7ICJDRCIsIDB4NCB9LAotCQkJeyAiSW5wdXQgTWl4IiwgMHhhIH0sCi0JCQl7ICJJbnRlcm5hbCBNaWMiLCAweGIgfSwKLQkJfSwKLQl9LAotCXsKLQkJLm51bV9pdGVtcyA9IDQsCi0JCS5pdGVtcyA9IHsKLQkJCXsgIk1pYyIsIDB4MCB9LAotCQkJeyAiTGluZSBJbiIsIDB4MiB9LAotCQkJeyAiQ0QiLCAweDQgfSwKLQkJCXsgIklucHV0IE1peCIsIDB4YSB9LAotCQl9LAotCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODlfY2FwdHVyZV9zb3VyY2VzWzNdID0gewotCS8qIERpZ2l0YWwgbWljIG9ubHkgYXZhaWxhYmxlIG9uIGZpcnN0ICJBREMiICovCi0JewotCQkubnVtX2l0ZW1zID0gNSwKLQkJLml0ZW1zID0gewotCQkJeyAiTWljIiwgMHgwIH0sCi0JCQl7ICJMaW5lIiwgMHgyIH0sCi0JCQl7ICJDRCIsIDB4NCB9LAotCQkJeyAiRnJvbnQgTWljIiwgMHhiIH0sCi0JCQl7ICJJbnB1dCBNaXgiLCAweGEgfSwKLQkJfSwKLQl9LAotCXsKLQkJLm51bV9pdGVtcyA9IDQsCi0JCS5pdGVtcyA9IHsKLQkJCXsgIk1pYyIsIDB4MCB9LAotCQkJeyAiTGluZSIsIDB4MiB9LAotCQkJeyAiQ0QiLCAweDQgfSwKLQkJCXsgIklucHV0IE1peCIsIDB4YSB9LAotCQl9LAotCX0sCi0JewotCQkubnVtX2l0ZW1zID0gNCwKLQkJLml0ZW1zID0gewotCQkJeyAiTWljIiwgMHgwIH0sCi0JCQl7ICJMaW5lIiwgMHgyIH0sCi0JCQl7ICJDRCIsIDB4NCB9LAotCQkJeyAiSW5wdXQgTWl4IiwgMHhhIH0sCi0JCX0sCi0JfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4OF9iYXNlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsCi0JCUhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODhfYWNlcl9hc3BpcmVfNDkzMGdfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwKLQkJSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJJbnRlcm5hbCBMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkludGVybmFsIExGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAxLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODg5X2FjZXJfYXNwaXJlXzg5MzBnX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsCi0JCUhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotCi1zdGF0aWMgdm9pZCBhbGM4ODhfYWNlcl9hc3BpcmVfNDkzMGdfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTY7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE3OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotc3RhdGljIHZvaWQgYWxjODg4X2FjZXJfYXNwaXJlXzY1MzBnX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4OF9hY2VyX2FzcGlyZV83NzMwZ19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTc7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgdm9pZCBhbGM4ODlfYWNlcl9hc3BpcmVfODkzMGdfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTY7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDFiOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotLyoKLSAqIEFMQzg4MCAzLXN0YWNrIG1vZGVsCi0gKgotICogREFDOiBGcm9udCA9IDB4MDIgKDB4MGMpLCBTdXJyID0gMHgwNSAoMHgwZiksIENMRkUgPSAweDA0ICgweDBlKQotICogUGluIGFzc2lnbm1lbnQ6IEZyb250ID0gMHgxNCwgTGluZS1Jbi9TdXJyID0gMHgxYSwgTWljL0NMRkUgPSAweDE4LAotICogICAgICAgICAgICAgICAgIEYtTWljID0gMHgxYiwgSFAgPSAweDE5Ci0gKi8KLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODBfZGFjX25pZHNbNF0gPSB7Ci0JLyogZnJvbnQsIHJlYXIsIGNsZmUsIHJlYXJfc3VyciAqLwotCTB4MDIsIDB4MDUsIDB4MDQsIDB4MDMKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgwX2FkY19uaWRzWzNdID0gewotCS8qIEFEQzAtMiAqLwotCTB4MDcsIDB4MDgsIDB4MDksCi19OwotCi0vKiBUaGUgZGF0YXNoZWV0IHNheXMgdGhlIG5vZGUgMHgwNyBpcyBjb25uZWN0ZWQgZnJvbSBpbnB1dHMsCi0gKiBidXQgaXQgc2hvd3MgemVybyBjb25uZWN0aW9uIGluIHRoZSByZWFsIGltcGxlbWVudGF0aW9uIG9uIHNvbWUgZGV2aWNlcy4KLSAqIE5vdGU6IHRoaXMgaXMgYSA5MTVHQVYgYnVnLCBmaXhlZCBvbiA5MTVHTFYKLSAqLwotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODBfYWRjX25pZHNfYWx0WzJdID0gewotCS8qIEFEQzEtMiAqLwotCTB4MDgsIDB4MDksCi19OwotCi0jZGVmaW5lIEFMQzg4MF9ESUdPVVRfTklECTB4MDYKLSNkZWZpbmUgQUxDODgwX0RJR0lOX05JRAkweDBhCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODBfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDQsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgzIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQl9LAotfTsKLQotLyogY2hhbm5lbCBzb3VyY2Ugc2V0dGluZyAoMi82IGNoYW5uZWwgc2VsZWN0aW9uIGZvciAzLXN0YWNrKSAqLwotLyogMmNoIG1vZGUgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3RocmVlc3RhY2tfY2gyX2luaXRbXSA9IHsKLQkvKiBzZXQgbGluZS1pbiB0byBpbnB1dCwgbXV0ZSBpdCAqLwotCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAotCS8qIHNldCBtaWMtaW4gdG8gaW5wdXQgdnJlZiA4MCUsIG11dGUgaXQgKi8KLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogNmNoIG1vZGUgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3RocmVlc3RhY2tfY2g2X2luaXRbXSA9IHsKLQkvKiBzZXQgbGluZS1pbiB0byBvdXRwdXQsIHVubXV0ZSBpdCAqLwotCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCS8qIHNldCBtaWMtaW4gdG8gb3V0cHV0LCB1bm11dGUgaXQgKi8KLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODgwX3RocmVlc3RhY2tfbW9kZXNbMl0gPSB7Ci0JeyAyLCBhbGM4ODBfdGhyZWVzdGFja19jaDJfaW5pdCB9LAotCXsgNiwgYWxjODgwX3RocmVlc3RhY2tfY2g2X2luaXQgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfdGhyZWVfc3RhY2tfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDMsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDMsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE5LCAweDAsIEhEQV9PVVRQVVQpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCi0JCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKLQkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKLQkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKLQl9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMgKi8KIHN0YXRpYyBpbnQgYWxjX2NhcF92b2xfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVuc2lnbmVkIGxvbmcgdmFsOwogCWludCBlcnI7CiAKIAltdXRleF9sb2NrKCZjb2RlYy0+Y29udHJvbF9tdXRleCk7Ci0Ja2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKHNwZWMtPmFkY19uaWRzWzBdLCAzLCAwLAotCQkJCQkJICAgICAgSERBX0lOUFVUKTsKKwlpZiAoc3BlYy0+dm9sX2luX2NhcHNyYykKKwkJdmFsID0gSERBX0NPTVBPU0VfQU1QX1ZBTChzcGVjLT5jYXBzcmNfbmlkc1swXSwgMywgMCwgSERBX09VVFBVVCk7CisJZWxzZQorCQl2YWwgPSBIREFfQ09NUE9TRV9BTVBfVkFMKHNwZWMtPmFkY19uaWRzWzBdLCAzLCAwLCBIREFfSU5QVVQpOworCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gdmFsOwogCWVyciA9IHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9pbmZvKGtjb250cm9sLCB1aW5mbyk7CiAJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+Y29udHJvbF9tdXRleCk7CiAJcmV0dXJuIGVycjsKQEAgLTI2OTMsMTEgKzE2MjYsMTUgQEAKIHsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgZXJyOwogCiAJbXV0ZXhfbG9jaygmY29kZWMtPmNvbnRyb2xfbXV0ZXgpOwotCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gSERBX0NPTVBPU0VfQU1QX1ZBTChzcGVjLT5hZGNfbmlkc1swXSwgMywgMCwKLQkJCQkJCSAgICAgIEhEQV9JTlBVVCk7CisJaWYgKHNwZWMtPnZvbF9pbl9jYXBzcmMpCisJCXZhbCA9IEhEQV9DT01QT1NFX0FNUF9WQUwoc3BlYy0+Y2Fwc3JjX25pZHNbMF0sIDMsIDAsIEhEQV9PVVRQVVQpOworCWVsc2UKKwkJdmFsID0gSERBX0NPTVBPU0VfQU1QX1ZBTChzcGVjLT5hZGNfbmlkc1swXSwgMywgMCwgSERBX0lOUFVUKTsKKwlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9IHZhbDsKIAllcnIgPSBzbmRfaGRhX21peGVyX2FtcF90bHYoa2NvbnRyb2wsIG9wX2ZsYWcsIHNpemUsIHRsdik7CiAJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+Y29udHJvbF9tdXRleCk7CiAJcmV0dXJuIGVycjsKQEAgLTI3MDgsMTcgKzE2NDUsMzUgQEAKIAogc3RhdGljIGludCBhbGNfY2FwX2dldHB1dF9jYWxsZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sLAotCQkJCSBnZXRwdXRfY2FsbF90IGZ1bmMpCisJCQkJIGdldHB1dF9jYWxsX3QgZnVuYywgYm9vbCBjaGVja19hZGNfc3dpdGNoKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXVuc2lnbmVkIGludCBhZGNfaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7Ci0JaW50IGVycjsKKwlpbnQgaSwgZXJyID0gMDsKIAogCW11dGV4X2xvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKLQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoc3BlYy0+YWRjX25pZHNbYWRjX2lkeF0sCi0JCQkJCQkgICAgICAzLCAwLCBIREFfSU5QVVQpOwotCWVyciA9IGZ1bmMoa2NvbnRyb2wsIHVjb250cm9sKTsKKwlpZiAoY2hlY2tfYWRjX3N3aXRjaCAmJiBzcGVjLT5keW5fYWRjX3N3aXRjaCkgeworCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2FkY19uaWRzOyBpKyspIHsKKwkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0KKwkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKHNwZWMtPmFkY19uaWRzW2ldLAorCQkJCQkJICAgIDMsIDAsIEhEQV9JTlBVVCk7CisJCQllcnIgPSBmdW5jKGtjb250cm9sLCB1Y29udHJvbCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisJfSBlbHNlIHsKKwkJaSA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCQlpZiAoc3BlYy0+dm9sX2luX2NhcHNyYykKKwkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0KKwkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKHNwZWMtPmNhcHNyY19uaWRzW2ldLAorCQkJCQkJICAgIDMsIDAsIEhEQV9PVVRQVVQpOworCQllbHNlCisJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9CisJCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChzcGVjLT5hZGNfbmlkc1tpXSwKKwkJCQkJCSAgICAzLCAwLCBIREFfSU5QVVQpOworCQllcnIgPSBmdW5jKGtjb250cm9sLCB1Y29udHJvbCk7CisJfQorIGVycm9yOgogCW11dGV4X3VubG9jaygmY29kZWMtPmNvbnRyb2xfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yNzI3LDE0ICsxNjgyLDE0IEBACiAJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlyZXR1cm4gYWxjX2NhcF9nZXRwdXRfY2FsbGVyKGtjb250cm9sLCB1Y29udHJvbCwKLQkJCQkgICAgIHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9nZXQpOworCQkJCSAgICAgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2dldCwgZmFsc2UpOwogfQogCiBzdGF0aWMgaW50IGFsY19jYXBfdm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXJldHVybiBhbGNfY2FwX2dldHB1dF9jYWxsZXIoa2NvbnRyb2wsIHVjb250cm9sLAotCQkJCSAgICAgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dCk7CisJCQkJICAgICBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfcHV0LCB0cnVlKTsKIH0KIAogLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLwpAQCAtMjc0NCwxNCArMTY5OSwxNCBAQAogCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlyZXR1cm4gYWxjX2NhcF9nZXRwdXRfY2FsbGVyKGtjb250cm9sLCB1Y29udHJvbCwKLQkJCQkgICAgIHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQpOworCQkJCSAgICAgc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2dldCwgZmFsc2UpOwogfQogCiBzdGF0aWMgaW50IGFsY19jYXBfc3dfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlyZXR1cm4gYWxjX2NhcF9nZXRwdXRfY2FsbGVyKGtjb250cm9sLCB1Y29udHJvbCwKLQkJCQkgICAgIHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9wdXQpOworCQkJCSAgICAgc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX3B1dCwgdHJ1ZSk7CiB9CiAKICNkZWZpbmUgX0RFRklORV9DQVBNSVgobnVtKSBcCkBAIC0yODEwLDMzNSArMTc2NSw2IEBACiBERUZJTkVfQ0FQTUlYX05PU1JDKDMpOwogCiAvKgotICogQUxDODgwIDUtc3RhY2sgbW9kZWwKLSAqCi0gKiBEQUM6IEZyb250ID0gMHgwMiAoMHgwYyksIFN1cnIgPSAweDA1ICgweDBmKSwgQ0xGRSA9IDB4MDQgKDB4MGQpLAotICogICAgICBTaWRlID0gMHgwMiAoMHhkKQotICogUGluIGFzc2lnbm1lbnQ6IEZyb250ID0gMHgxNCwgU3VyciA9IDB4MTcsIENMRkUgPSAweDE2Ci0gKiAgICAgICAgICAgICAgICAgTGluZS1Jbi9TaWRlID0gMHgxYSwgTWljID0gMHgxOCwgRi1NaWMgPSAweDFiLCBIUCA9IDB4MTkKLSAqLwotCi0vKiBhZGRpdGlvbmFsIG1peGVycyB0byBhbGM4ODBfdGhyZWVfc3RhY2tfbWl4ZXIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfZml2ZV9zdGFja19taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogY2hhbm5lbCBzb3VyY2Ugc2V0dGluZyAoNi84IGNoYW5uZWwgc2VsZWN0aW9uIGZvciA1LXN0YWNrKSAqLwotLyogNmNoIG1vZGUgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX2ZpdmVzdGFja19jaDZfaW5pdFtdID0gewotCS8qIHNldCBsaW5lLWluIHRvIGlucHV0LCBtdXRlIGl0ICovCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogOGNoIG1vZGUgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX2ZpdmVzdGFja19jaDhfaW5pdFtdID0gewotCS8qIHNldCBsaW5lLWluIHRvIG91dHB1dCwgdW5tdXRlIGl0ICovCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4MF9maXZlc3RhY2tfbW9kZXNbMl0gPSB7Ci0JeyA2LCBhbGM4ODBfZml2ZXN0YWNrX2NoNl9pbml0IH0sCi0JeyA4LCBhbGM4ODBfZml2ZXN0YWNrX2NoOF9pbml0IH0sCi19OwotCi0KLS8qCi0gKiBBTEM4ODAgNi1zdGFjayBtb2RlbAotICoKLSAqIERBQzogRnJvbnQgPSAweDAyICgweDBjKSwgU3VyciA9IDB4MDMgKDB4MGQpLCBDTEZFID0gMHgwNCAoMHgwZSksCi0gKiAgICAgIFNpZGUgPSAweDA1ICgweDBmKQotICogUGluIGFzc2lnbm1lbnQ6IEZyb250ID0gMHgxNCwgU3VyciA9IDB4MTUsIENMRkUgPSAweDE2LCBTaWRlID0gMHgxNywKLSAqICAgTWljID0gMHgxOCwgRi1NaWMgPSAweDE5LCBMaW5lID0gMHgxYSwgSFAgPSAweDFiCi0gKi8KLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODBfNnN0X2RhY19uaWRzWzRdID0gewotCS8qIGZyb250LCByZWFyLCBjbGZlLCByZWFyX3N1cnIgKi8KLQkweDAyLCAweDAzLCAweDA0LCAweDA1Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgwXzZzdGFja19jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gNCwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJGcm9udCBNaWMiLCAweDEgfSwKLQkJeyAiTGluZSIsIDB4MiB9LAotCQl7ICJDRCIsIDB4NCB9LAotCX0sCi19OwotCi0vKiBmaXhlZCA4LWNoYW5uZWxzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODgwX3NpeHN0YWNrX21vZGVzWzFdID0gewotCXsgOCwgTlVMTCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF9zaXhfc3RhY2tfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU2lkZSBQbGF5YmFjayBWb2x1bWUiLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIlNpZGUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAotCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCi0JCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCi0JCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCi0JfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0KLS8qCi0gKiBBTEM4ODAgVzgxMCBtb2RlbAotICoKLSAqIFc4MTAgaGFzIHJlYXIgSU8gZm9yOgotICogRnJvbnQgKERBQyAwMikKLSAqIFN1cnJvdW5kIChEQUMgMDMpCi0gKiBDZW50ZXIvTEZFIChEQUMgMDQpCi0gKiBEaWdpdGFsIG91dCAoMDYpCi0gKgotICogVGhlIHN5c3RlbSBhbHNvIGhhcyBhIHBhaXIgb2YgaW50ZXJuYWwgc3BlYWtlcnMsIGFuZCBhIGhlYWRwaG9uZSBqYWNrLgotICogVGhlc2UgYXJlIGJvdGggY29ubmVjdGVkIHRvIExpbmUyIG9uIHRoZSBjb2RlYywgaGVuY2UgdG8gREFDIDAyLgotICoKLSAqIFRoZXJlIGlzIGEgdmFyaWFibGUgcmVzaXN0b3IgdG8gY29udHJvbCB0aGUgc3BlYWtlciBvciBoZWFkcGhvbmUKLSAqIHZvbHVtZS4gVGhpcyBpcyBhIGhhcmR3YXJlLW9ubHkgZGV2aWNlIHdpdGhvdXQgYSBzb2Z0d2FyZSBBUEkuCi0gKgotICogUGx1Z2dpbmcgaGVhZHBob25lcyBpbiB3aWxsIGRpc2FibGUgdGhlIGludGVybmFsIHNwZWFrZXJzLiBUaGlzIGlzCi0gKiBpbXBsZW1lbnRlZCBpbiBoYXJkd2FyZSwgbm90IHZpYSB0aGUgZHJpdmVyIHVzaW5nIGphY2sgc2Vuc2UuIEluCi0gKiBhIHNpbWlsYXIgZmFzaGlvbiwgcGx1Z2dpbmcgaW50byB0aGUgcmVhciBzb2NrZXQgbWFya2VkICJmcm9udCIgd2lsbAotICogZGlzYWJsZSBib3RoIHRoZSBzcGVha2VycyBhbmQgaGVhZHBob25lcy4KLSAqCi0gKiBGb3IgaW5wdXQsIHRoZXJlJ3MgYSBtaWNyb3Bob25lIGphY2ssIGFuZCBhbiAiYXVkaW8gaW4iIGphY2suCi0gKiBUaGVzZSBtYXkgbm90IGRvIGFueXRoaW5nIHVzZWZ1bCB3aXRoIHRoaXMgZHJpdmVyIHlldCwgYmVjYXVzZSBJCi0gKiBoYXZlbid0IHNldHVwIGFueSBpbml0aWFsaXphdGlvbiB2ZXJicyBmb3IgdGhlc2UgeWV0Li4uCi0gKi8KLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODBfdzgxMF9kYWNfbmlkc1szXSA9IHsKLQkvKiBmcm9udCwgcmVhci9zdXJyb3VuZCwgY2xmZSAqLwotCTB4MDIsIDB4MDMsIDB4MDQKLX07Ci0KLS8qIGZpeGVkIDYgY2hhbm5lbHMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4ODBfdzgxMF9tb2Rlc1sxXSA9IHsKLQl7IDYsIE5VTEwgfQotfTsKLQotLyogUGluIGFzc2lnbm1lbnQ6IEZyb250ID0gMHgxNCwgU3VyciA9IDB4MTUsIENMRkUgPSAweDE2LCBIUCA9IDB4MWIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfdzgxMF9iYXNlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0KLS8qCi0gKiBaNzEwViBtb2RlbAotICoKLSAqIERBQzogRnJvbnQgPSAweDAyICgweDBjKSwgSFAgPSAweDAzICgweDBkKQotICogUGluIGFzc2lnbm1lbnQ6IEZyb250ID0gMHgxNCwgSFAgPSAweDE1LCBNaWMgPSAweDE4LCBNaWMyID0gMHgxOSg/KSwKLSAqICAgICAgICAgICAgICAgICBMaW5lID0gMHgxYQotICovCi0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgwX3o3MXZfZGFjX25pZHNbMV0gPSB7Ci0JMHgwMgotfTsKLSNkZWZpbmUgQUxDODgwX1o3MVZfSFBfREFDCTB4MDMKLQotLyogZml4ZWQgMiBjaGFubmVscyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4MF8yX2phY2tfbW9kZXNbMV0gPSB7Ci0JeyAyLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfejcxdl9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotCi0vKgotICogQUxDODgwIEYxNzM0IG1vZGVsCi0gKgotICogREFDOiBIUCA9IDB4MDIgKDB4MGMpLCBGcm9udCA9IDB4MDMgKDB4MGQpCi0gKiBQaW4gYXNzaWdubWVudDogSFAgPSAweDE0LCBGcm9udCA9IDB4MTUsIE1pYyA9IDB4MTgKLSAqLwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg4MF9mMTczNF9kYWNfbmlkc1sxXSA9IHsKLQkweDAzCi19OwotI2RlZmluZSBBTEM4ODBfRjE3MzRfSFBfREFDCTB4MDIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF9mMTczNF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODBfZjE3MzRfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDIsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDEgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQl9LAotfTsKLQotCi0vKgotICogQUxDODgwIEFTVVMgbW9kZWwKLSAqCi0gKiBEQUM6IEhQL0Zyb250ID0gMHgwMiAoMHgwYyksIFN1cnIgPSAweDAzICgweDBkKSwgQ0xGRSA9IDB4MDQgKDB4MGUpCi0gKiBQaW4gYXNzaWdubWVudDogSFAvRnJvbnQgPSAweDE0LCBTdXJyID0gMHgxNSwgQ0xGRSA9IDB4MTYsCi0gKiAgTWljID0gMHgxOCwgTGluZSA9IDB4MWEKLSAqLwotCi0jZGVmaW5lIGFsYzg4MF9hc3VzX2RhY19uaWRzCWFsYzg4MF93ODEwX2RhY19uaWRzCS8qIGlkZW50aWNhbCB3aXRoIHc4MTAgKi8KLSNkZWZpbmUgYWxjODgwX2FzdXNfbW9kZXMJYWxjODgwX3RocmVlc3RhY2tfbW9kZXMJLyogMi82IGNoYW5uZWwgbW9kZSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX2FzdXNfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCi0JCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKLQkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKLQkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKLQl9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiBBTEM4ODAgQVNVUyBXMVYgbW9kZWwKLSAqCi0gKiBEQUM6IEhQL0Zyb250ID0gMHgwMiAoMHgwYyksIFN1cnIgPSAweDAzICgweDBkKSwgQ0xGRSA9IDB4MDQgKDB4MGUpCi0gKiBQaW4gYXNzaWdubWVudDogSFAvRnJvbnQgPSAweDE0LCBTdXJyID0gMHgxNSwgQ0xGRSA9IDB4MTYsCi0gKiAgTWljID0gMHgxOCwgTGluZSA9IDB4MWEsIExpbmUyID0gMHgxYgotICovCi0KLS8qIGFkZGl0aW9uYWwgbWl4ZXJzIHRvIGFsYzg4MF9hc3VzX21peGVyICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX2FzdXNfdzF2X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTGluZTIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZTIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMywgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBUQ0wgUzcwMCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF90Y2xfczcwMF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MEIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MEIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MEIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MEIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogVW5pd2lsbCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF91bml3aWxsX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCi0JCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKLQkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKLQkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKLQl9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfZnVqaXRzdV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF91bml3aWxsX3A1M19taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKgogICogdmlydHVhbCBtYXN0ZXIgY29udHJvbHMKICAqLwogCkBAIC0zMjE3LDYgKzE4NDMsNyBAQAogCX0KIAlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpIHsKIAkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoY29kZWMsCisJCQkJCQkgICAgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQsCiAJCQkJCQkgICAgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CkBAIC0zMzQ4LDc4OSArMTk3NSw2IEBACiAKIAogLyoKLSAqIGluaXRpYWxpemUgdGhlIGNvZGVjIHZvbHVtZXMsIGV0YwotICovCi0KLS8qCi0gKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0yIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZSBhbmFsb2ctbG9vcGJhY2sKLQkgKiBtaXhlciB3aWRnZXQKLQkgKiBOb3RlOiBQQVNEIG1vdGhlcmJvYXJkcyB1c2VzIHRoZSBMaW5lIEluIDIgYXMgdGhlIGlucHV0IGZvciBmcm9udAotCSAqIHBhbmVsIG1pYyAobWljIDIpCi0JICovCi0JLyogQW1wIEluZGljZXM6IE1pYzEgPSAwLCBNaWMyID0gMSwgTGluZTEgPSAyLCBMaW5lMiA9IDMsIENEID0gNCAqLwotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNil9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg3KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDBjIC0gMHgwZikKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KLQkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCi0JeyB9Ci19OwotCi0vKgotICogMy1zdGFjayBwaW4gY29uZmlndXJhdGlvbjoKLSAqIGZyb250ID0gMHgxNCwgbWljL2NsZmUgPSAweDE4LCBIUCA9IDB4MTksIGxpbmUvc3VyciA9IDB4MWEsIGYtbWljID0gMHgxYgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9waW5fM3N0YWNrX2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIHByZXNldCBjb25uZWN0aW9uIGxpc3RzIG9mIGlucHV0IHBpbnMKLQkgKiAwID0gZnJvbnQsIDEgPSByZWFyX3N1cnIsIDIgPSBDTEZFLCAzID0gc3Vycm91bmQKLQkgKi8KLQl7MHgxMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LCAvKiBtaWMvY2xmZSAqLwotCXsweDExLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwgLyogbGluZS9zdXJyb3VuZCAqLwotCi0JLyoKLQkgKiBTZXQgcGluIG1vZGUgYW5kIG11dGluZwotCSAqLwotCS8qIHNldCBmcm9udCBwaW4gd2lkZ2V0cyAweDE0IGZvciBvdXRwdXQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIE1pYzEgKHJlYXIgcGFuZWwpIHBpbiB3aWRnZXQgZm9yIGlucHV0IGFuZCB2cmVmIGF0IDgwJSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIE1pYzIgKGFzIGhlYWRwaG9uZSBvdXQpIGZvciBIUCBvdXRwdXQgKi8KLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogTGluZSBJbiBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogTGluZTIgKGFzIGZyb250IG1pYykgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCi0JeyB9Ci19OwotCi0vKgotICogNS1zdGFjayBwaW4gY29uZmlndXJhdGlvbjoKLSAqIGZyb250ID0gMHgxNCwgc3Vycm91bmQgPSAweDE3LCBjbGZlID0gMHgxNiwgbWljID0gMHgxOCwgSFAgPSAweDE5LAotICogbGluZS1pbi9zaWRlID0gMHgxYSwgZi1taWMgPSAweDFiCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3Bpbl81c3RhY2tfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogcHJlc2V0IGNvbm5lY3Rpb24gbGlzdHMgb2YgaW5wdXQgcGlucwotCSAqIDAgPSBmcm9udCwgMSA9IHJlYXJfc3VyciwgMiA9IENMRkUsIDMgPSBzdXJyb3VuZAotCSAqLwotCXsweDExLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgLyogbGluZS9zaWRlICovCi0KLQkvKgotCSAqIFNldCBwaW4gbW9kZSBhbmQgbXV0aW5nCi0JICovCi0JLyogc2V0IHBpbiB3aWRnZXRzIDB4MTQtMHgxNyBmb3Igb3V0cHV0ICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JLyogdW5tdXRlIHBpbnMgZm9yIG91dHB1dCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JLyogTWljMSAocmVhciBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogTWljMiAoYXMgaGVhZHBob25lIG91dCkgZm9yIEhQIG91dHB1dCAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQkvKiBMaW5lIEluIHBpbiB3aWRnZXQgZm9yIGlucHV0ICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBMaW5lMiAoYXMgZnJvbnQgbWljKSBwaW4gd2lkZ2V0IGZvciBpbnB1dCBhbmQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQl7IH0KLX07Ci0KLS8qCi0gKiBXODEwIHBpbiBjb25maWd1cmF0aW9uOgotICogZnJvbnQgPSAweDE0LCBzdXJyb3VuZCA9IDB4MTUsIGNsZmUgPSAweDE2LCBIUCA9IDB4MWIKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfcGluX3c4MTBfaW5pdF92ZXJic1tdID0gewotCS8qIGhwaG9uZS9zcGVha2VyIGlucHV0IHNlbGVjdG9yOiBmcm9udCBEQUMgKi8KLQl7MHgxMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MH0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0KLQl7IH0KLX07Ci0KLS8qCi0gKiBaNzFWIHBpbiBjb25maWd1cmF0aW9uOgotICogU3BlYWtlci1vdXQgPSAweDE0LCBIUCA9IDB4MTUsIE1pYyA9IDB4MTgsIExpbmUtaW4gPSAweDFhLCBNaWMyID0gMHgxYiAoPykKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfcGluX3o3MXZfaW5pdF92ZXJic1tdID0gewotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCi0JeyB9Ci19OwotCi0vKgotICogNi1zdGFjayBwaW4gY29uZmlndXJhdGlvbjoKLSAqIGZyb250ID0gMHgxNCwgc3VyciA9IDB4MTUsIGNsZmUgPSAweDE2LCBzaWRlID0gMHgxNywgbWljID0gMHgxOCwKLSAqIGYtbWljID0gMHgxOSwgbGluZSA9IDB4MWEsIEhQID0gMHgxYgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9waW5fNnN0YWNrX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLwotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQl7IH0KLX07Ci0KLS8qCi0gKiBVbml3aWxsIHBpbiBjb25maWd1cmF0aW9uOgotICogSFAgPSAweDE0LCBJbnRlcm5hbFNwZWFrZXIgPSAweDE1LCBtaWMgPSAweDE4LCBpbnRlcm5hbCBtaWMgPSAweDE5LAotICogbGluZSA9IDB4MWEKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfdW5pd2lsbF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogSFAgKi8KLQotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCi0KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIHsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sICovCi0JLyogezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwgKi8KLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCi0KLQl7IH0KLX07Ci0KLS8qCi0qIFVuaXdpbGwgUDUzCi0qIEhQID0gMHgxNCwgSW50ZXJuYWxTcGVha2VyID0gMHgxNSwgbWljID0gMHgxOSwKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfdW5pd2lsbF9wNTNfaW5pdF92ZXJic1tdID0gewotCXsweDEzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfRENWT0xfRVZFTlR9LAotCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9iZWVwX2luaXRfdmVyYnNbXSA9IHsKLQl7IDB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNSkgfSwKLQl7IH0KLX07Ci0KLS8qIGF1dG8tdG9nZ2xlIGZyb250IG1pYyAqLwotc3RhdGljIHZvaWQgYWxjODh4X3NpbXBsZV9taWNfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0gCXVuc2lnbmVkIGludCBwcmVzZW50OwotCXVuc2lnbmVkIGNoYXIgYml0czsKLQotCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDE4KTsKLQliaXRzID0gcHJlc2VudCA/IEhEQV9BTVBfTVVURSA6IDA7Ci0Jc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDBiLCBIREFfSU5QVVQsIDEsIEhEQV9BTVBfTVVURSwgYml0cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE2OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7Ci0JYWxjODh4X3NpbXBsZV9taWNfYXV0b211dGUoY29kZWMpOwotfQotCi1zdGF0aWMgdm9pZCBhbGM4ODBfdW5pd2lsbF91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IHJlcykKLXsKLQkvKiBMb29rcyBsaWtlIHRoZSB1bnNvbCBldmVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKLQkgKiBkZWZpbml0aW9uLiAgNGJpdCB0YWcgaXMgcGxhY2VkIGF0IDI4IGJpdCEKLQkgKi8KLQlzd2l0Y2ggKHJlcyA+PiAyOCkgewotCWNhc2UgQUxDODgwX01JQ19FVkVOVDoKLQkJYWxjODh4X3NpbXBsZV9taWNfYXV0b211dGUoY29kZWMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlhbGNfc2t1X3Vuc29sX2V2ZW50KGNvZGVjLCByZXMpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX3A1M19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfcDUzX2Rjdm9sX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXVuc2lnbmVkIGludCBwcmVzZW50OwotCi0JcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgyMSwgMCwKLQkJCQkgICAgIEFDX1ZFUkJfR0VUX1ZPTFVNRV9LTk9CX0NPTlRST0wsIDApOwotCXByZXNlbnQgJj0gSERBX0FNUF9WT0xNQVNLOwotCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwYywgSERBX09VVFBVVCwgMCwKLQkJCQkgSERBX0FNUF9WT0xNQVNLLCBwcmVzZW50KTsKLQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGQsIEhEQV9PVVRQVVQsIDAsCi0JCQkJIEhEQV9BTVBfVk9MTUFTSywgcHJlc2VudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX3A1M191bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkJICAgdW5zaWduZWQgaW50IHJlcykKLXsKLQkvKiBMb29rcyBsaWtlIHRoZSB1bnNvbCBldmVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKLQkgKiBkZWZpbml0aW9uLiAgNGJpdCB0YWcgaXMgcGxhY2VkIGF0IDI4IGJpdCEKLQkgKi8KLQlpZiAoKHJlcyA+PiAyOCkgPT0gQUxDODgwX0RDVk9MX0VWRU5UKQotCQlhbGM4ODBfdW5pd2lsbF9wNTNfZGN2b2xfYXV0b211dGUoY29kZWMpOwotCWVsc2UKLQkJYWxjX3NrdV91bnNvbF9ldmVudChjb2RlYywgcmVzKTsKLX0KLQotLyoKLSAqIEYxNzM0IHBpbiBjb25maWd1cmF0aW9uOgotICogSFAgPSAweDE0LCBzcGVha2VyLW91dCA9IDB4MTUsIG1pYyA9IDB4MTgKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfcGluX2YxNzM0X2luaXRfdmVyYnNbXSA9IHsKLQl7MHgwNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDEwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0JezB4MTEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxMiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDEzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGNTB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU58QUxDODgwX0hQX0VWRU5UfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTnxBTEM4ODBfRENWT0xfRVZFTlR9LAotCi0JeyB9Ci19OwotCi0vKgotICogQVNVUyBwaW4gY29uZmlndXJhdGlvbjoKLSAqIEhQL2Zyb250ID0gMHgxNCwgc3VyciA9IDB4MTUsIGNsZmUgPSAweDE2LCBtaWMgPSAweDE4LCBsaW5lID0gMHgxYQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9waW5fYXN1c19pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwKLQl7MHgxMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDEyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MTMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCi0JeyB9Ci19OwotCi0vKiBFbmFibGUgR1BJTyBtYXNrIGFuZCBzZXQgb3V0cHV0ICovCi0jZGVmaW5lIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzCWFsY19ncGlvMV9pbml0X3ZlcmJzCi0jZGVmaW5lIGFsYzg4MF9ncGlvMl9pbml0X3ZlcmJzCWFsY19ncGlvMl9pbml0X3ZlcmJzCi0jZGVmaW5lIGFsYzg4MF9ncGlvM19pbml0X3ZlcmJzCWFsY19ncGlvM19pbml0X3ZlcmJzCi0KLS8qIENsZXZvIG01MjBnIGluaXQgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3Bpbl9jbGV2b19pbml0X3ZlcmJzW10gPSB7Ci0JLyogaGVhZHBob25lIG91dHB1dCAqLwotCXsweDExLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JLyogbGluZS1vdXQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIExpbmUtaW4gKi8KLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogQ0QgKi8KLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogTWljMSAocmVhciBwYW5lbCkgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIE1pYzIgKGZyb250IHBhbmVsKSAqLwotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogaGVhZHBob25lICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotICAgICAgICAvKiBjaGFuZ2UgdG8gRUFQRCBtb2RlICovCi0JezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDd9LAotCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsICAweDMwNjB9LAotCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9waW5fdGNsX1M3MDBfaW5pdF92ZXJic1tdID0gewotCS8qIGNoYW5nZSB0byBFQVBEIG1vZGUgKi8KLQl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwN30sCi0JezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgIDB4MzA2MH0sCi0KLQkvKiBIZWFkcGhvbmUgb3V0cHV0ICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQkvKiBGcm9udCBvdXRwdXQqLwotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0KLQkvKiBMaW5lIEluIHBpbiB3aWRnZXQgZm9yIGlucHV0ICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JLyogTWljMSAocmVhciBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0KLQkvKiBjaGFuZ2UgdG8gRUFQRCBtb2RlICovCi0JezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDd9LAotCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsICAweDMwNzB9LAotCi0JeyB9Ci19OwotCi0vKgotICogTEcgbTEgZXhwcmVzcyBkdWFsCi0gKgotICogUGluIGFzc2lnbm1lbnQ6Ci0gKiAgIFJlYXIgTGluZS1Jbi9PdXQgKGJsdWUpOiAweDE0Ci0gKiAgIEJ1aWxkLWluIE1pYy1JbjogMHgxNQotICogICBTcGVha2VyLW91dDogMHgxNwotICogICBIUC1PdXQgKGdyZWVuKTogMHgxYgotICogICBNaWMtSW4vT3V0IChyZWQpOiAweDE5Ci0gKiAgIFNQRElGLU91dDogMHgxZQotICovCi0KLS8qIFRvIG1ha2UgNS4xIG91dHB1dCB3b3JraW5nIChncmVlbj1Gcm9udCwgYmx1ZT1TdXJyLCByZWQ9Q0xGRSkgKi8KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgwX2xnX2RhY19uaWRzWzNdID0gewotCTB4MDUsIDB4MDIsIDB4MDMKLX07Ci0KLS8qIHNlZW1zIGFuYWxvZyBDRCBpcyBub3Qgd29ya2luZyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4MF9sZ19jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMywKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MSB9LAotCQl7ICJMaW5lIiwgMHg1IH0sCi0JCXsgIkludGVybmFsIE1pYyIsIDB4NiB9LAotCX0sCi19OwotCi0vKiAyLDQsNiBjaGFubmVsIG1vZGVzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9sZ19jaDJfaW5pdFtdID0gewotCS8qIHNldCBsaW5lLWluIGFuZCBtaWMtaW4gdG8gaW5wdXQgKi8KLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCi0JeyAweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX2xnX2NoNF9pbml0W10gPSB7Ci0JLyogc2V0IGxpbmUtaW4gdG8gb3V0IGFuZCBtaWMtaW4gdG8gaW5wdXQgKi8KLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQIH0sCi0JeyAweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX2xnX2NoNl9pbml0W10gPSB7Ci0JLyogc2V0IGxpbmUtaW4gYW5kIG1pYy1pbiB0byBvdXRwdXQgKi8KLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQIH0sCi0JeyAweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUCB9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4MF9sZ19jaF9tb2Rlc1szXSA9IHsKLQl7IDIsIGFsYzg4MF9sZ19jaDJfaW5pdCB9LAotCXsgNCwgYWxjODgwX2xnX2NoNF9pbml0IH0sCi0JeyA2LCBhbGM4ODBfbGdfY2g2X2luaXQgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfbGdfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAxLCAyLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDYsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDcsIEhEQV9JTlBVVCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKLQkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAotCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAotCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAotCX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfbGdfaW5pdF92ZXJic1tdID0gewotCS8qIHNldCBjYXB0dXJlIHNvdXJjZSB0byBtaWMtaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQkvKiBtdXRlIGFsbCBhbXAgbWl4ZXIgaW5wdXRzICovCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNSl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg2KX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDcpfSwKLQkvKiBsaW5lLWluIHRvIGlucHV0ICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIGJ1aWx0LWluIG1pYyAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogc3BlYWtlci1vdXQgKi8KLQl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogbWljLWluIHRvIGlucHV0ICovCi0JezB4MTEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIEhQLW91dCAqLwotCXsweDEzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwM30sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIGphY2sgc2Vuc2UgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0JeyB9Ci19OwotCi0vKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGM4ODBfbGdfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLS8qCi0gKiBMRyBMVzIwCi0gKgotICogUGluIGFzc2lnbm1lbnQ6Ci0gKiAgIFNwZWFrZXItb3V0OiAweDE0Ci0gKiAgIE1pYy1JbjogMHgxOAotICogICBCdWlsdC1pbiBNaWMtSW46IDB4MTkKLSAqICAgTGluZS1JbjogMHgxYgotICogICBIUC1PdXQ6IDB4MWEKLSAqICAgU1BESUYtT3V0OiAweDFlCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4MF9sZ19sd19jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMywKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJJbnRlcm5hbCBNaWMiLCAweDEgfSwKLQkJeyAiTGluZSBJbiIsIDB4MiB9LAotCX0sCi19OwotCi0jZGVmaW5lIGFsYzg4MF9sZ19sd19tb2RlcyBhbGM4ODBfdGhyZWVzdGFja19tb2RlcwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX2xnX2x3X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCi0JCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKLQkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKLQkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKLQl9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX2xnX2x3X2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLwotCXsweDEwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sIC8qIG1pYy9jbGZlICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwgLyogbGluZS9zdXJyb3VuZCAqLwotCi0JLyogc2V0IGNhcHR1cmUgc291cmNlIHRvIG1pYy1pbiAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg3KX0sCi0JLyogc3BlYWtlci1vdXQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogSFAtb3V0ICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIG1pYy1pbiB0byBpbnB1dCAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogYnVpbHQtaW4gbWljICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQkvKiBqYWNrIHNlbnNlICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXsgfQotfTsKLQotLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYWxjODgwX2xnX2x3X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX21lZGlvbl9yaW1fbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludGVybmFsIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgwX21lZGlvbl9yaW1fY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDIsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiSW50ZXJuYWwgTWljIiwgMHgxIH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX21lZGlvbl9yaW1faW5pdF92ZXJic1tdID0gewotCXsweDEzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBNaWMxIChyZWFyIHBhbmVsKSBwaW4gd2lkZ2V0IGZvciBpbnB1dCBhbmQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBNaWMyIChhcyBoZWFkcGhvbmUgb3V0KSBmb3IgSFAgb3V0cHV0ICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBJbnRlcm5hbCBTcGVha2VyICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCXsweDIwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDA3fSwKLQl7MHgyMCwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAgMHgzMDYwfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQl7IH0KLX07Ci0KLS8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzg4MF9tZWRpb25fcmltX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7Ci0JLyogdG9nZ2xlIEVBUEQgKi8KLQlpZiAoc3BlYy0+amFja19wcmVzZW50KQotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDAxLCAwLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDApOwotCWVsc2UKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgwMSwgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAyKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjODgwX21lZGlvbl9yaW1fdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCSAgdW5zaWduZWQgaW50IHJlcykKLXsKLQkvKiBMb29rcyBsaWtlIHRoZSB1bnNvbCBldmVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKLQkgKiBkZWZpbml0aW9uLiAgNGJpdCB0YWcgaXMgcGxhY2VkIGF0IDI4IGJpdCEKLQkgKi8KLQlpZiAoKHJlcyA+PiAyOCkgPT0gQUxDODgwX0hQX0VWRU5UKQotCQlhbGM4ODBfbWVkaW9uX3JpbV9hdXRvbXV0ZShjb2RlYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4MF9tZWRpb25fcmltX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYW1wX2xpc3QgYWxjODgwX2xvb3BiYWNrc1tdID0gewotCXsgMHgwYiwgSERBX0lOUFVULCAwIH0sCi0JeyAweDBiLCBIREFfSU5QVVQsIDEgfSwKLQl7IDB4MGIsIEhEQV9JTlBVVCwgMiB9LAotCXsgMHgwYiwgSERBX0lOUFVULCAzIH0sCi0JeyAweDBiLCBIREFfSU5QVVQsIDQgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9hbXBfbGlzdCBhbGM4ODBfbGdfbG9vcGJhY2tzW10gPSB7Ci0JeyAweDBiLCBIREFfSU5QVVQsIDEgfSwKLQl7IDB4MGIsIEhEQV9JTlBVVCwgNiB9LAotCXsgMHgwYiwgSERBX0lOUFVULCA3IH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLSNlbmRpZgotCi0vKgogICogQ29tbW9uIGNhbGxiYWNrcwogICovCiAKQEAgLTQxNzYsNyArMjAyMCw3IEBACiAvKgogICogQW5hbG9nIHBsYXliYWNrIGNhbGxiYWNrcwogICovCi1zdGF0aWMgaW50IGFsYzg4MF9wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorc3RhdGljIGludCBhbGNfcGxheWJhY2tfcGNtX29wZW4oc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKIAkJCQkgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewpAQCAtNDE4NSw3ICsyMDI5LDcgQEAKIAkJCQkJICAgICBoaW5mbyk7CiB9CiAKLXN0YXRpYyBpbnQgYWxjODgwX3BsYXliYWNrX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCitzdGF0aWMgaW50IGFsY19wbGF5YmFja19wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAogCQkJCSAgICAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBmb3JtYXQsCkBAIC00MTk2LDcgKzIwNDAsNyBAQAogCQkJCQkJc3RyZWFtX3RhZywgZm9ybWF0LCBzdWJzdHJlYW0pOwogfQogCi1zdGF0aWMgaW50IGFsYzg4MF9wbGF5YmFja19wY21fY2xlYW51cChzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorc3RhdGljIGludCBhbGNfcGxheWJhY2tfcGNtX2NsZWFudXAoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKIAkJCQkgICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewpAQCAtNDIwNyw3ICsyMDUxLDcgQEAKIC8qCiAgKiBEaWdpdGFsIG91dAogICovCi1zdGF0aWMgaW50IGFsYzg4MF9kaWdfcGxheWJhY2tfcGNtX29wZW4oc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKK3N0YXRpYyBpbnQgYWxjX2RpZ19wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAogCQkJCQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CkBAIC00MjE1LDcgKzIwNTksNyBAQAogCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfb3Blbihjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKIH0KIAotc3RhdGljIGludCBhbGM4ODBfZGlnX3BsYXliYWNrX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCitzdGF0aWMgaW50IGFsY19kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKIAkJCQkJICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJCSAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAogCQkJCQkgICB1bnNpZ25lZCBpbnQgZm9ybWF0LApAQCAtNDIyNiw3ICsyMDcwLDcgQEAKIAkJCQkJICAgICBzdHJlYW1fdGFnLCBmb3JtYXQsIHN1YnN0cmVhbSk7CiB9CiAKLXN0YXRpYyBpbnQgYWxjODgwX2RpZ19wbGF5YmFja19wY21fY2xlYW51cChzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorc3RhdGljIGludCBhbGNfZGlnX3BsYXliYWNrX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCiAJCQkJCSAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCQkgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKQEAgLTQyMzQsNyArMjA3OCw3IEBACiAJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19jbGVhbnVwKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOwogfQogCi1zdGF0aWMgaW50IGFsYzg4MF9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCitzdGF0aWMgaW50IGFsY19kaWdfcGxheWJhY2tfcGNtX2Nsb3NlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCiAJCQkJCSBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkJIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewpAQCAtNDI0NSw3ICsyMDg5LDcgQEAKIC8qCiAgKiBBbmFsb2cgY2FwdHVyZQogICovCi1zdGF0aWMgaW50IGFsYzg4MF9hbHRfY2FwdHVyZV9wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorc3RhdGljIGludCBhbGNfYWx0X2NhcHR1cmVfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKIAkJCQkgICAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0LApAQCAtNDI1OCw3ICsyMTAyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbGM4ODBfYWx0X2NhcHR1cmVfcGNtX2NsZWFudXAoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKK3N0YXRpYyBpbnQgYWxjX2FsdF9jYXB0dXJlX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCiAJCQkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CkBAIC00MjcwLDIxICsyMTE0LDIxIEBACiB9CiAKIC8qIGFuYWxvZyBjYXB0dXJlIHdpdGggZHluYW1pYyBkdWFsLWFkYyBjaGFuZ2VzICovCi1zdGF0aWMgaW50IGR1YWxtaWNfY2FwdHVyZV9wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorc3RhdGljIGludCBkeW5fYWRjX2NhcHR1cmVfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKIAkJCQkgICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0LAogCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5jdXJfYWRjID0gc3BlYy0+YWRjX25pZHNbc3BlYy0+Y3VyX2FkY19pZHhdOworCXNwZWMtPmN1cl9hZGMgPSBzcGVjLT5hZGNfbmlkc1tzcGVjLT5keW5fYWRjX2lkeFtzcGVjLT5jdXJfbXV4WzBdXV07CiAJc3BlYy0+Y3VyX2FkY19zdHJlYW1fdGFnID0gc3RyZWFtX3RhZzsKIAlzcGVjLT5jdXJfYWRjX2Zvcm1hdCA9IGZvcm1hdDsKIAlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgc3BlYy0+Y3VyX2FkYywgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkdWFsbWljX2NhcHR1cmVfcGNtX2NsZWFudXAoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKK3N0YXRpYyBpbnQgZHluX2FkY19jYXB0dXJlX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCiAJCQkJICAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKQEAgLTQyOTQsNzAgKzIxMzgsNzAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBkdWFsbWljX3BjbV9hbmFsb2dfY2FwdHVyZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gZHluX2FkY19wY21fYW5hbG9nX2NhcHR1cmUgPSB7CiAJLnN1YnN0cmVhbXMgPSAxLAogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSAyLAogCS5uaWQgPSAwLCAvKiBmaWxsIGxhdGVyICovCiAJLm9wcyA9IHsKLQkJLnByZXBhcmUgPSBkdWFsbWljX2NhcHR1cmVfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gZHVhbG1pY19jYXB0dXJlX3BjbV9jbGVhbnVwCisJCS5wcmVwYXJlID0gZHluX2FkY19jYXB0dXJlX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IGR5bl9hZGNfY2FwdHVyZV9wY21fY2xlYW51cAogCX0sCiB9OwogCiAvKgogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFsYzg4MF9wY21fYW5hbG9nX3BsYXliYWNrID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBhbGNfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKIAkuc3Vic3RyZWFtcyA9IDEsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDgsCiAJLyogTklEIGlzIHNldCBpbiBhbGNfYnVpbGRfcGNtcyAqLwogCS5vcHMgPSB7Ci0JCS5vcGVuID0gYWxjODgwX3BsYXliYWNrX3BjbV9vcGVuLAotCQkucHJlcGFyZSA9IGFsYzg4MF9wbGF5YmFja19wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSBhbGM4ODBfcGxheWJhY2tfcGNtX2NsZWFudXAKKwkJLm9wZW4gPSBhbGNfcGxheWJhY2tfcGNtX29wZW4sCisJCS5wcmVwYXJlID0gYWxjX3BsYXliYWNrX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IGFsY19wbGF5YmFja19wY21fY2xlYW51cAogCX0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFsYzg4MF9wY21fYW5hbG9nX2NhcHR1cmUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFsY19wY21fYW5hbG9nX2NhcHR1cmUgPSB7CiAJLnN1YnN0cmVhbXMgPSAxLAogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSAyLAogCS8qIE5JRCBpcyBzZXQgaW4gYWxjX2J1aWxkX3BjbXMgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjODgwX3BjbV9hbmFsb2dfYWx0X3BsYXliYWNrID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBhbGNfcGNtX2FuYWxvZ19hbHRfcGxheWJhY2sgPSB7CiAJLnN1YnN0cmVhbXMgPSAxLAogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSAyLAogCS8qIE5JRCBpcyBzZXQgaW4gYWxjX2J1aWxkX3BjbXMgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjODgwX3BjbV9hbmFsb2dfYWx0X2NhcHR1cmUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFsY19wY21fYW5hbG9nX2FsdF9jYXB0dXJlID0gewogCS5zdWJzdHJlYW1zID0gMiwgLyogY2FuIGJlIG92ZXJyaWRkZW4gKi8KIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gMiwKIAkvKiBOSUQgaXMgc2V0IGluIGFsY19idWlsZF9wY21zICovCiAJLm9wcyA9IHsKLQkJLnByZXBhcmUgPSBhbGM4ODBfYWx0X2NhcHR1cmVfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gYWxjODgwX2FsdF9jYXB0dXJlX3BjbV9jbGVhbnVwCisJCS5wcmVwYXJlID0gYWxjX2FsdF9jYXB0dXJlX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IGFsY19hbHRfY2FwdHVyZV9wY21fY2xlYW51cAogCX0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFsYzg4MF9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjX3BjbV9kaWdpdGFsX3BsYXliYWNrID0gewogCS5zdWJzdHJlYW1zID0gMSwKIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gMiwKIAkvKiBOSUQgaXMgc2V0IGluIGFsY19idWlsZF9wY21zICovCiAJLm9wcyA9IHsKLQkJLm9wZW4gPSBhbGM4ODBfZGlnX3BsYXliYWNrX3BjbV9vcGVuLAotCQkuY2xvc2UgPSBhbGM4ODBfZGlnX3BsYXliYWNrX3BjbV9jbG9zZSwKLQkJLnByZXBhcmUgPSBhbGM4ODBfZGlnX3BsYXliYWNrX3BjbV9wcmVwYXJlLAotCQkuY2xlYW51cCA9IGFsYzg4MF9kaWdfcGxheWJhY2tfcGNtX2NsZWFudXAKKwkJLm9wZW4gPSBhbGNfZGlnX3BsYXliYWNrX3BjbV9vcGVuLAorCQkuY2xvc2UgPSBhbGNfZGlnX3BsYXliYWNrX3BjbV9jbG9zZSwKKwkJLnByZXBhcmUgPSBhbGNfZGlnX3BsYXliYWNrX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IGFsY19kaWdfcGxheWJhY2tfcGNtX2NsZWFudXAKIAl9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBhbGM4ODBfcGNtX2RpZ2l0YWxfY2FwdHVyZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjX3BjbV9kaWdpdGFsX2NhcHR1cmUgPSB7CiAJLnN1YnN0cmVhbXMgPSAxLAogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSAyLApAQCAtNDM3NSw2ICsyMjE5LDcgQEAKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlzdHJ1Y3QgaGRhX3BjbSAqaW5mbyA9IHNwZWMtPnBjbV9yZWM7CisJY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtICpwOwogCWludCBpOwogCiAJY29kZWMtPm51bV9wY21zID0gMTsKQEAgLTQzODcsMTYgKzIyMzIsMjIgQEAKIAkJICIlcyBBbmFsb2ciLCBjb2RlYy0+Y2hpcF9uYW1lKTsKIAlpbmZvLT5uYW1lID0gc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nOwogCi0JaWYgKHNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2spIHsKLQkJaWYgKHNuZF9CVUdfT04oIXNwZWMtPm11bHRpb3V0LmRhY19uaWRzKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPSAqKHNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2spOworCWlmIChzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA+IDApIHsKKwkJcCA9IHNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2s7CisJCWlmICghcCkKKwkJCXAgPSAmYWxjX3BjbV9hbmFsb2dfcGxheWJhY2s7CisJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9ICpwOwogCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10ubmlkID0gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF07CiAJfQotCWlmIChzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUpIHsKLQkJaWYgKHNuZF9CVUdfT04oIXNwZWMtPmFkY19uaWRzKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9ICooc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlKTsKKwlpZiAoc3BlYy0+YWRjX25pZHMpIHsKKwkJcCA9IHNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZTsKKwkJaWYgKCFwKSB7CisJCQlpZiAoc3BlYy0+ZHluX2FkY19zd2l0Y2gpCisJCQkJcCA9ICZkeW5fYWRjX3BjbV9hbmFsb2dfY2FwdHVyZTsKKwkJCWVsc2UKKwkJCQlwID0gJmFsY19wY21fYW5hbG9nX2NhcHR1cmU7CisJCX0KKwkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPSAqcDsKIAkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubmlkID0gc3BlYy0+YWRjX25pZHNbMF07CiAJfQogCkBAIC00NDIzLDE0ICsyMjc0LDE4IEBACiAJCQlpbmZvLT5wY21fdHlwZSA9IHNwZWMtPmRpZ19vdXRfdHlwZTsKIAkJZWxzZQogCQkJaW5mby0+cGNtX3R5cGUgPSBIREFfUENNX1RZUEVfU1BESUY7Ci0JCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCAmJgotCQkgICAgc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2spIHsKLQkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9ICooc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2spOworCQlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpIHsKKwkJCXAgPSBzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjazsKKwkJCWlmICghcCkKKwkJCQlwID0gJmFsY19wY21fZGlnaXRhbF9wbGF5YmFjazsKKwkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9ICpwOwogCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLm5pZCA9IHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkOwogCQl9Ci0JCWlmIChzcGVjLT5kaWdfaW5fbmlkICYmCi0JCSAgICBzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlKSB7Ci0JCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9ICooc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSk7CisJCWlmIChzcGVjLT5kaWdfaW5fbmlkKSB7CisJCQlwID0gc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZTsKKwkJCWlmICghcCkKKwkJCQlwID0gJmFsY19wY21fZGlnaXRhbF9jYXB0dXJlOworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPSAqcDsKIAkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLm5pZCA9IHNwZWMtPmRpZ19pbl9uaWQ7CiAJCX0KIAkJLyogRklYTUU6IGRvIHdlIG5lZWQgdGhpcyBmb3IgYWxsIFJlYWx0ZWsgY29kZWMgbW9kZWxzPyAqLwpAQCAtNDQ0NCwxNCArMjI5OSwxNSBAQAogCSAqIG1vZGVsLCBjb25maWd1cmUgYSBzZWNvbmQgYW5hbG9nIGNhcHR1cmUtb25seSBQQ00uCiAJICovCiAJLyogQWRkaXRpb25hbCBBbmFsYW9nIGNhcHR1cmUgZm9yIGluZGV4ICMyICovCi0JaWYgKChzcGVjLT5hbHRfZGFjX25pZCAmJiBzcGVjLT5zdHJlYW1fYW5hbG9nX2FsdF9wbGF5YmFjaykgfHwKLQkgICAgKHNwZWMtPm51bV9hZGNfbmlkcyA+IDEgJiYgc3BlYy0+c3RyZWFtX2FuYWxvZ19hbHRfY2FwdHVyZSkpIHsKKwlpZiAoc3BlYy0+YWx0X2RhY19uaWQgfHwgc3BlYy0+bnVtX2FkY19uaWRzID4gMSkgewogCQljb2RlYy0+bnVtX3BjbXMgPSAzOwogCQlpbmZvID0gc3BlYy0+cGNtX3JlYyArIDI7CiAJCWluZm8tPm5hbWUgPSBzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2c7CiAJCWlmIChzcGVjLT5hbHRfZGFjX25pZCkgewotCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0KLQkJCQkqc3BlYy0+c3RyZWFtX2FuYWxvZ19hbHRfcGxheWJhY2s7CisJCQlwID0gc3BlYy0+c3RyZWFtX2FuYWxvZ19hbHRfcGxheWJhY2s7CisJCQlpZiAoIXApCisJCQkJcCA9ICZhbGNfcGNtX2FuYWxvZ19hbHRfcGxheWJhY2s7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPSAqcDsKIAkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPQogCQkJCXNwZWMtPmFsdF9kYWNfbmlkOwogCQl9IGVsc2UgewpAQCAtNDQ1OSw5ICsyMzE1LDExIEBACiAJCQkJYWxjX3BjbV9udWxsX3N0cmVhbTsKIAkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPSAwOwogCQl9Ci0JCWlmIChzcGVjLT5udW1fYWRjX25pZHMgPiAxICYmIHNwZWMtPnN0cmVhbV9hbmFsb2dfYWx0X2NhcHR1cmUpIHsKLQkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0KLQkJCQkqc3BlYy0+c3RyZWFtX2FuYWxvZ19hbHRfY2FwdHVyZTsKKwkJaWYgKHNwZWMtPm51bV9hZGNfbmlkcyA+IDEpIHsKKwkJCXAgPSBzcGVjLT5zdHJlYW1fYW5hbG9nX2FsdF9jYXB0dXJlOworCQkJaWYgKCFwKQorCQkJCXAgPSAmYWxjX3BjbV9hbmFsb2dfYWx0X2NhcHR1cmU7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9ICpwOwogCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubmlkID0KIAkJCQlzcGVjLT5hZGNfbmlkc1sxXTsKIAkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbXMgPQpAQCAtNDU3MSw2ODAgKzI0MjksNiBAQAogfQogCiAvKgotICogVGVzdCBjb25maWd1cmF0aW9uIGZvciBkZWJ1Z2dpbmcKLSAqCi0gKiBBbG1vc3QgYWxsIGlucHV0cy9vdXRwdXRzIGFyZSBlbmFibGVkLiAgSS9PIHBpbnMgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhCi0gKiBlbnVtIGNvbnRyb2xzLgotICovCi0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODBfdGVzdF9kYWNfbmlkc1s0XSA9IHsKLQkweDAyLCAweDAzLCAweDA0LCAweDA1Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgwX3Rlc3RfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDcsCi0JLml0ZW1zID0gewotCQl7ICJJbi0xIiwgMHgwIH0sCi0JCXsgIkluLTIiLCAweDEgfSwKLQkJeyAiSW4tMyIsIDB4MiB9LAotCQl7ICJJbi00IiwgMHgzIH0sCi0JCXsgIkNEIiwgMHg0IH0sCi0JCXsgIkZyb250IiwgMHg1IH0sCi0JCXsgIlN1cnJvdW5kIiwgMHg2IH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4ODBfdGVzdF9tb2Rlc1s0XSA9IHsKLQl7IDIsIE5VTEwgfSwKLQl7IDQsIE5VTEwgfSwKLQl7IDYsIE5VTEwgfSwKLQl7IDgsIE5VTEwgfSwKLX07Ci0KLXN0YXRpYyBpbnQgYWxjX3Rlc3RfcGluX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQotewotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHNbXSA9IHsKLQkJIk4vQSIsICJMaW5lIE91dCIsICJIUCBPdXQiLAotCQkiSW4gSGktWiIsICJJbiA1MCUiLCAiSW4gR3JkIiwgIkluIDgwJSIsICJJbiAxMDAlIgotCX07Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JdWluZm8tPmNvdW50ID0gMTsKLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDg7Ci0JaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gOCkKLQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDc7Ci0Jc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhbGNfdGVzdF9waW5fY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQloZGFfbmlkX3QgbmlkID0gKGhkYV9uaWRfdClrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgcGluX2N0bCwgaXRlbSA9IDA7Ci0KLQlwaW5fY3RsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCi0JCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fV0lER0VUX0NPTlRST0wsIDApOwotCWlmIChwaW5fY3RsICYgQUNfUElOQ1RMX09VVF9FTikgewotCQlpZiAocGluX2N0bCAmIEFDX1BJTkNUTF9IUF9FTikKLQkJCWl0ZW0gPSAyOwotCQllbHNlCi0JCQlpdGVtID0gMTsKLQl9IGVsc2UgaWYgKHBpbl9jdGwgJiBBQ19QSU5DVExfSU5fRU4pIHsKLQkJc3dpdGNoIChwaW5fY3RsICYgQUNfUElOQ1RMX1ZSRUZFTikgewotCQljYXNlIEFDX1BJTkNUTF9WUkVGX0hJWjogaXRlbSA9IDM7IGJyZWFrOwotCQljYXNlIEFDX1BJTkNUTF9WUkVGXzUwOiAgaXRlbSA9IDQ7IGJyZWFrOwotCQljYXNlIEFDX1BJTkNUTF9WUkVGX0dSRDogaXRlbSA9IDU7IGJyZWFrOwotCQljYXNlIEFDX1BJTkNUTF9WUkVGXzgwOiAgaXRlbSA9IDY7IGJyZWFrOwotCQljYXNlIEFDX1BJTkNUTF9WUkVGXzEwMDogaXRlbSA9IDc7IGJyZWFrOwotCQl9Ci0JfQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBpdGVtOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFsY190ZXN0X3Bpbl9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCWhkYV9uaWRfdCBuaWQgPSAoaGRhX25pZF90KWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY3Rsc1tdID0gewotCQkwLCBBQ19QSU5DVExfT1VUX0VOLCBBQ19QSU5DVExfT1VUX0VOIHwgQUNfUElOQ1RMX0hQX0VOLAotCQlBQ19QSU5DVExfSU5fRU4gfCBBQ19QSU5DVExfVlJFRl9ISVosCi0JCUFDX1BJTkNUTF9JTl9FTiB8IEFDX1BJTkNUTF9WUkVGXzUwLAotCQlBQ19QSU5DVExfSU5fRU4gfCBBQ19QSU5DVExfVlJFRl9HUkQsCi0JCUFDX1BJTkNUTF9JTl9FTiB8IEFDX1BJTkNUTF9WUkVGXzgwLAotCQlBQ19QSU5DVExfSU5fRU4gfCBBQ19QSU5DVExfVlJFRl8xMDAsCi0JfTsKLQl1bnNpZ25lZCBpbnQgb2xkX2N0bCwgbmV3X2N0bDsKLQotCW9sZF9jdGwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMCk7Ci0JbmV3X2N0bCA9IGN0bHNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXV07Ci0JaWYgKG9sZF9jdGwgIT0gbmV3X2N0bCkgewotCQlpbnQgdmFsOwotCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCi0JCQkJCSAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAotCQkJCQkgIG5ld19jdGwpOwotCQl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID49IDMgPwotCQkJSERBX0FNUF9NVVRFIDogMDsKLQkJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCBuaWQsIEhEQV9PVVRQVVQsIDAsCi0JCQkJCSBIREFfQU1QX01VVEUsIHZhbCk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhbGNfdGVzdF9waW5fc3JjX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0c1tdID0gewotCQkiRnJvbnQiLCAiU3Vycm91bmQiLCAiQ0xGRSIsICJTaWRlIgotCX07Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JdWluZm8tPmNvdW50ID0gMTsKLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDQ7Ci0JaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gNCkKLQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDM7Ci0Jc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhbGNfdGVzdF9waW5fc3JjX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQloZGFfbmlkX3QgbmlkID0gKGhkYV9uaWRfdClrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgc2VsOwotCi0Jc2VsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfU0VMLCAwKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc2VsICYgMzsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhbGNfdGVzdF9waW5fc3JjX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQloZGFfbmlkX3QgbmlkID0gKGhkYV9uaWRfdClrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgc2VsOwotCi0Jc2VsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfU0VMLCAwKSAmIDM7Ci0JaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gIT0gc2VsKSB7Ci0JCXNlbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gJiAzOwotCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCi0JCQkJCSAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIHNlbCk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBQSU5fQ1RMX1RFU1QoeG5hbWUsbmlkKSB7CQkJXAotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwJXAotCQkJLm5hbWUgPSB4bmFtZSwJCSAgICAgICBcCi0JCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IG5pZCwgXAotCQkJLmluZm8gPSBhbGNfdGVzdF9waW5fY3RsX2luZm8sIFwKLQkJCS5nZXQgPSBhbGNfdGVzdF9waW5fY3RsX2dldCwgICBcCi0JCQkucHV0ID0gYWxjX3Rlc3RfcGluX2N0bF9wdXQsICAgXAotCQkJLnByaXZhdGVfdmFsdWUgPSBuaWQJICAgICAgIFwKLQkJCX0KLQotI2RlZmluZSBQSU5fU1JDX1RFU1QoeG5hbWUsbmlkKSB7CQkJXAotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwJXAotCQkJLm5hbWUgPSB4bmFtZSwJCSAgICAgICBcCi0JCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IG5pZCwgXAotCQkJLmluZm8gPSBhbGNfdGVzdF9waW5fc3JjX2luZm8sIFwKLQkJCS5nZXQgPSBhbGNfdGVzdF9waW5fc3JjX2dldCwgICBcCi0JCQkucHV0ID0gYWxjX3Rlc3RfcGluX3NyY19wdXQsICAgXAotCQkJLnByaXZhdGVfdmFsdWUgPSBuaWQJICAgICAgIFwKLQkJCX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF90ZXN0X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJTaWRlIFBsYXliYWNrIFZvbHVtZSIsIDB4MGYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX01VVEUoIkNMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCi0JUElOX0NUTF9URVNUKCJGcm9udCBQaW4gTW9kZSIsIDB4MTQpLAotCVBJTl9DVExfVEVTVCgiU3Vycm91bmQgUGluIE1vZGUiLCAweDE1KSwKLQlQSU5fQ1RMX1RFU1QoIkNMRkUgUGluIE1vZGUiLCAweDE2KSwKLQlQSU5fQ1RMX1RFU1QoIlNpZGUgUGluIE1vZGUiLCAweDE3KSwKLQlQSU5fQ1RMX1RFU1QoIkluLTEgUGluIE1vZGUiLCAweDE4KSwKLQlQSU5fQ1RMX1RFU1QoIkluLTIgUGluIE1vZGUiLCAweDE5KSwKLQlQSU5fQ1RMX1RFU1QoIkluLTMgUGluIE1vZGUiLCAweDFhKSwKLQlQSU5fQ1RMX1RFU1QoIkluLTQgUGluIE1vZGUiLCAweDFiKSwKLQlQSU5fU1JDX1RFU1QoIkluLTEgUGluIFNvdXJjZSIsIDB4MTgpLAotCVBJTl9TUkNfVEVTVCgiSW4tMiBQaW4gU291cmNlIiwgMHgxOSksCi0JUElOX1NSQ19URVNUKCJJbi0zIFBpbiBTb3VyY2UiLCAweDFhKSwKLQlQSU5fU1JDX1RFU1QoIkluLTQgUGluIFNvdXJjZSIsIDB4MWIpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkluLTEgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbi0xIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbi0yIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW4tMiBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW4tMyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkluLTMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkluLTQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgzLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbi00IFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4NCwgSERBX0lOUFVUKSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAotCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCi0JCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCi0JCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCi0JfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF90ZXN0X2luaXRfdmVyYnNbXSA9IHsKLQkvKiBVbm11dGUgaW5wdXRzIG9mIDB4MGMgLSAweDBmICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQkvKiBWb2wgb3V0cHV0IGZvciAweDBjLTB4MGYgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQkvKiBTZXQgb3V0cHV0IHBpbnMgMHgxNC0weDE3ICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JLyogVW5tdXRlIG91dHB1dCBwaW5zIDB4MTQtMHgxNyAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogU2V0IGlucHV0IHBpbnMgMHgxOC0weDFjICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JLyogTXV0ZSBpbnB1dCBwaW5zIDB4MTgtMHgxYiAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIEFEQyBzZXQgdXAgKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBBbmFsb2cgaW5wdXQvcGFzc3RocnUgKi8KLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0JeyB9Ci19OwotI2VuZGlmCi0KLS8qCi0gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGM4ODBfbW9kZWxzW0FMQzg4MF9NT0RFTF9MQVNUXSA9IHsKLQlbQUxDODgwXzNTVF0JCT0gIjNzdGFjayIsCi0JW0FMQzg4MF9UQ0xfUzcwMF0JPSAidGNsIiwKLQlbQUxDODgwXzNTVF9ESUddCT0gIjNzdGFjay1kaWdvdXQiLAotCVtBTEM4ODBfQ0xFVk9dCQk9ICJjbGV2byIsCi0JW0FMQzg4MF81U1RdCQk9ICI1c3RhY2siLAotCVtBTEM4ODBfNVNUX0RJR10JPSAiNXN0YWNrLWRpZ291dCIsCi0JW0FMQzg4MF9XODEwXQkJPSAidzgxMCIsCi0JW0FMQzg4MF9aNzFWXQkJPSAiejcxdiIsCi0JW0FMQzg4MF82U1RdCQk9ICI2c3RhY2siLAotCVtBTEM4ODBfNlNUX0RJR10JPSAiNnN0YWNrLWRpZ291dCIsCi0JW0FMQzg4MF9BU1VTXQkJPSAiYXN1cyIsCi0JW0FMQzg4MF9BU1VTX1cxVl0JPSAiYXN1cy13MXYiLAotCVtBTEM4ODBfQVNVU19ESUddCT0gImFzdXMtZGlnIiwKLQlbQUxDODgwX0FTVVNfRElHMl0JPSAiYXN1cy1kaWcyIiwKLQlbQUxDODgwX1VOSVdJTExfRElHXQk9ICJ1bml3aWxsIiwKLQlbQUxDODgwX1VOSVdJTExfUDUzXQk9ICJ1bml3aWxsLXA1MyIsCi0JW0FMQzg4MF9GVUpJVFNVXQk9ICJmdWppdHN1IiwKLQlbQUxDODgwX0YxNzM0XQkJPSAiRjE3MzQiLAotCVtBTEM4ODBfTEddCQk9ICJsZyIsCi0JW0FMQzg4MF9MR19MV10JCT0gImxnLWx3IiwKLQlbQUxDODgwX01FRElPTl9SSU1dCT0gIm1lZGlvbiIsCi0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotCVtBTEM4ODBfVEVTVF0JCT0gInRlc3QiLAotI2VuZGlmCi0JW0FMQzg4MF9BVVRPXQkJPSAiYXV0byIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODgwX2NmZ190YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHgwZjY5LCAiQ29ldXMgRzYxMFAiLCBBTEM4ODBfVzgxMCksCi0JU05EX1BDSV9RVUlSSygweDEwMTksIDB4YTg4MCwgIkVDUyIsIEFMQzg4MF81U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHhhODg0LCAiQWNlciBBUEZWIiwgQUxDODgwXzZTVCksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA3MCwgIlVMSSIsIEFMQzg4MF8zU1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMDc3LCAiVUxJIiwgQUxDODgwXzZTVF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwNzgsICJVTEkiLCBBTEM4ODBfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA4NywgIlVMSSIsIEFMQzg4MF82U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHhlMzA5LCAiVUxJIiwgQUxDODgwXzNTVF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweGUzMTAsICJVTEkiLCBBTEM4ODBfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzOSwgMHgxMjM0LCBOVUxMLCBBTEM4ODBfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmEwOSwgIkhQIiwgQUxDODgwXzVTVCksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTBiMywgIkFTVVMgVzFWIiwgQUxDODgwX0FTVVNfVzFWKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMGMyLCAiQVNVUyBXNkEiLCBBTEM4ODBfQVNVU19ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwYzMsICJBU1VTIFd4eCIsIEFMQzg4MF9BU1VTX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTExMywgIkFTVVMiLCBBTEM4ODBfQVNVU19ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExMjMsICJBU1VTIiwgQUxDODgwX0FTVVNfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTczLCAiQVNVUyIsIEFMQzg4MF9BU1VTX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk2NCwgIkFTVVMgWjcxViIsIEFMQzg4MF9aNzFWKSwKLQkvKiBTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTY0LCAiQVNVUyIsIEFMQzg4MF9BU1VTX0RJRyksICovCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk3MywgIkFTVVMiLCBBTEM4ODBfQVNVU19ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5YjMsICJBU1VTIiwgQUxDODgwX0FTVVNfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MTRlLCAiQVNVUyBQNUdEMSB3L1NQRElGIiwgQUxDODgwXzZTVF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxODEsICJBU1VTIFA0R1BMIiwgQUxDODgwX0FTVVNfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MTk2LCAiQVNVUyBQNUdEMSIsIEFMQzg4MF82U1QpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxYjQsICJBU1VTIiwgQUxDODgwXzZTVCksCi0JU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxMDQzLCAiQVNVUyIsIEFMQzg4MF9BU1VTKSwgLyogZGVmYXVsdCBBU1VTICovCi0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4ODFhMCwgIlNvbnkiLCBBTEM4ODBfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWQ2LCAiU29ueSIsIEFMQzg4MF8zU1QpLAotCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDMwMzIsICJHYXRld2F5IiwgQUxDODgwXzVTVCksCi0JU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MzAzMywgIkdhdGV3YXkiLCBBTEM4ODBfNVNUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA3YiwgMHg0MDM5LCAiR2F0ZXdheSIsIEFMQzg4MF81U1QpLAotCVNORF9QQ0lfUVVJUksoMHgxMjk3LCAweGM3OTAsICJTaHV0dGxlIFNUMjBHNSIsIEFMQzg4MF82U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ1OCwgMHhhMTAyLCAiR2lnYWJ5dGUgSzgiLCBBTEM4ODBfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4MTE1MCwgIk1TSSIsIEFMQzg4MF82U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTUwOSwgMHg5MjVkLCAiRklDIFA0TSIsIEFMQzg4MF82U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTU1OCwgMHgwNTIwLCAiQ2xldm8gbTUyMEciLCBBTEM4ODBfQ0xFVk8pLAotCVNORF9QQ0lfUVVJUksoMHgxNTU4LCAweDA2NjAsICJDbGV2byBtNjU1biIsIEFMQzg4MF9DTEVWTyksCi0JU05EX1BDSV9RVUlSSygweDE1NTgsIDB4NTQwMSwgIkFTVVMiLCBBTEM4ODBfQVNVU19ESUcyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTU2NSwgMHg4MjAyLCAiQmlvc3RhciIsIEFMQzg4MF81U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHg5MDUwLCAiVW5pd2lsbCIsIEFMQzg4MF9VTklXSUxMX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE1ODQsIDB4OTA1NCwgIlVuaXdpbGwiLCBBTEM4ODBfRjE3MzQpLAotCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNzAsICJVbml3aWxsIiwgQUxDODgwX1VOSVdJTEwpLAotCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNzcsICJVbml3aWxsIFA1MyIsIEFMQzg4MF9VTklXSUxMX1A1MyksCi0JU05EX1BDSV9RVUlSSygweDE2MWYsIDB4MjAzZCwgIlc4MTAiLCBBTEM4ODBfVzgxMCksCi0JU05EX1BDSV9RVUlSSygweDE2MWYsIDB4MjA1ZCwgIk1lZGlvbiBSaW0gMjE1MCIsIEFMQzg4MF9NRURJT05fUklNKSwKLQlTTkRfUENJX1FVSVJLKDB4MTY5NSwgMHg0MDBkLCAiRVBvWCIsIEFMQzg4MF81U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTY5NSwgMHg0MDEyLCAiRVBveCBFUC01TERBIiwgQUxDODgwXzVTVF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNzM0LCAweDEwN2MsICJGU0MgRjE3MzQiLCBBTEM4ODBfRjE3MzQpLAotCVNORF9QQ0lfUVVJUksoMHgxNzM0LCAweDEwOTQsICJGU0MgQW1pbG8gTTE0NTFHIiwgQUxDODgwX0ZVSklUU1UpLAotCVNORF9QQ0lfUVVJUksoMHgxNzM0LCAweDEwYWMsICJGU0MgQU1JTE8gWGkgMTUyNiIsIEFMQzg4MF9GMTczNCksCi0JU05EX1BDSV9RVUlSSygweDE3MzQsIDB4MTBiMCwgIkZ1aml0c3UiLCBBTEM4ODBfRlVKSVRTVSksCi0JU05EX1BDSV9RVUlSSygweDE4NTQsIDB4MDAxOCwgIkxHIExXMjAiLCBBTEM4ODBfTEdfTFcpLAotCVNORF9QQ0lfUVVJUksoMHgxODU0LCAweDAwM2IsICJMRyIsIEFMQzg4MF9MRyksCi0JU05EX1BDSV9RVUlSSygweDE4NTQsIDB4MDA1ZiwgIkxHIFAxIEV4cHJlc3MiLCBBTEM4ODBfTEcpLAotCVNORF9QQ0lfUVVJUksoMHgxODU0LCAweDAwNjgsICJMRyB3MSIsIEFMQzg4MF9MRyksCi0JU05EX1BDSV9RVUlSSygweDE4NTQsIDB4MDA3NywgIkxHIExXMjUiLCBBTEM4ODBfTEdfTFcpLAotCVNORF9QQ0lfUVVJUksoMHgxOWRiLCAweDQxODgsICJUQ0wgUzcwMCIsIEFMQzg4MF9UQ0xfUzcwMCksCi0JU05EX1BDSV9RVUlSSygweDI2NjgsIDB4ODA4NiwgTlVMTCwgQUxDODgwXzZTVF9ESUcpLCAvKiBicm9rZW4gQklPUyAqLwotCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweDI2NjgsIE5VTEwsIEFMQzg4MF82U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhhMTAwLCAiSW50ZWwgbW9ibyIsIEFMQzg4MF81U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhkNDAwLCAiSW50ZWwgbW9ibyIsIEFMQzg4MF81U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhkNDAxLCAiSW50ZWwgbW9ibyIsIEFMQzg4MF81U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhkNDAyLCAiSW50ZWwgbW9ibyIsIEFMQzg4MF8zU1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhlMjI0LCAiSW50ZWwgbW9ibyIsIEFMQzg4MF81U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhlMzA1LCAiSW50ZWwgbW9ibyIsIEFMQzg4MF8zU1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhlMzA4LCAiSW50ZWwgbW9ibyIsIEFMQzg4MF8zU1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhlNDAwLCAiSW50ZWwgbW9ibyIsIEFMQzg4MF81U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhlNDAxLCAiSW50ZWwgbW9ibyIsIEFMQzg4MF81U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhlNDAyLCAiSW50ZWwgbW9ibyIsIEFMQzg4MF81U1RfRElHKSwKLQkvKiBkZWZhdWx0IEludGVsICovCi0JU05EX1BDSV9RVUlSS19WRU5ET1IoMHg4MDg2LCAiSW50ZWwgbW9ibyIsIEFMQzg4MF8zU1QpLAotCVNORF9QQ0lfUVVJUksoMHhhMGEwLCAweDA1NjAsICJBT3BlbiBpOTE1R01tLUhGUyIsIEFMQzg4MF81U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4ZTgwMywgMHgxMDE5LCBOVUxMLCBBTEM4ODBfNlNUX0RJRyksCi0Je30KLX07Ci0KLS8qCi0gKiBBTEM4ODAgY29kZWMgcHJlc2V0cwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzg4MF9wcmVzZXRzW10gPSB7Ci0JW0FMQzg4MF8zU1RdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODBfdGhyZWVfc3RhY2tfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfcGluXzNzdGFja19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgwX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3RocmVlc3RhY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3RocmVlc3RhY2tfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4ODBfM1NUX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4MF90aHJlZV9zdGFja19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAotCQkJCWFsYzg4MF9waW5fM3N0YWNrX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODBfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3RocmVlc3RhY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3RocmVlc3RhY2tfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4ODBfVENMX1M3MDBdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODBfdGNsX3M3MDBfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfcGluX3RjbF9TNzAwX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX2dwaW8yX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODBfZGFjX25pZHMsCi0JCS5hZGNfbmlkcyA9IGFsYzg4MF9hZGNfbmlkc19hbHQsIC8qIEZJWE1FOiBjb3JyZWN0PyAqLwotCQkubnVtX2FkY19uaWRzID0gMSwgLyogc2luZ2xlIEFEQyAqLwotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF8yX2phY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwXzJfamFja19tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODgwXzVTVF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4MF90aHJlZV9zdGFja19taXhlciwKLQkJCSAgICBhbGM4ODBfZml2ZV9zdGFja19taXhlcn0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX3Bpbl81c3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4MF9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF9maXZlc3RhY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX2ZpdmVzdGFja19tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODgwXzVTVF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM4ODBfdGhyZWVfc3RhY2tfbWl4ZXIsCi0JCQkgICAgYWxjODgwX2ZpdmVfc3RhY2tfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfcGluXzVzdGFja19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgwX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF9maXZlc3RhY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX2ZpdmVzdGFja19tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODgwXzZTVF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4MF9zaXhfc3RhY2tfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfcGluXzZzdGFja19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwXzZzdF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4MF82c3RfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfc2l4c3RhY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3NpeHN0YWNrX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF82c3RhY2tfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODgwXzZTVF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM4ODBfc2l4X3N0YWNrX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX3Bpbl82c3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF82c3RfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODBfNnN0X2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF9zaXhzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfc2l4c3RhY2tfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgwXzZzdGFja19jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4ODBfVzgxMF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4MF93ODEwX2Jhc2VfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfcGluX3c4MTBfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfZ3BpbzJfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF93ODEwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgwX3c4MTBfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3c4MTBfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3c4MTBfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg4MF9aNzFWXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgwX3o3MXZfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfcGluX3o3MXZfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF96NzF2X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgwX3o3MXZfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF8yX2phY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwXzJfamFja19tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODgwX0YxNzM0XSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgwX2YxNzM0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX3Bpbl9mMTczNF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2YxNzM0X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgwX2YxNzM0X2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMiwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF8yX2phY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwXzJfamFja19tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODBfZjE3MzRfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsYzg4MF91bml3aWxsX3A1M191bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODgwX3VuaXdpbGxfcDUzX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAotCX0sCi0JW0FMQzg4MF9BU1VTXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgwX2FzdXNfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfcGluX2FzdXNfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9hc3VzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgwX2FzdXNfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfYXN1c19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg4MF9BU1VTX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4MF9hc3VzX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX3Bpbl9hc3VzX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX2dwaW8xX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4MF9hc3VzX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF9hc3VzX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF9hc3VzX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODgwX0FTVVNfRElHMl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4MF9hc3VzX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX3Bpbl9hc3VzX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX2dwaW8yX2luaXRfdmVyYnMgfSwgLyogdXNlIEdQSU8yICovCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2FzdXNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODBfYXN1c19kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgwX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfYXN1c19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg4MF9BU1VTX1cxVl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4MF9hc3VzX21peGVyLCBhbGM4ODBfYXN1c193MXZfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfcGluX2FzdXNfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9hc3VzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgwX2FzdXNfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX2FzdXNfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX2FzdXNfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4ODBfVU5JV0lMTF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM4ODBfYXN1c19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAotCQkJCWFsYzg4MF9waW5fYXN1c19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2FzdXNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODBfYXN1c19kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgwX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfYXN1c19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg4MF9VTklXSUxMXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgwX3VuaXdpbGxfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfdW5pd2lsbF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2FzdXNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODBfYXN1c19kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgwX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfdGhyZWVzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfdGhyZWVzdGFja19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGM4ODBfdW5pd2lsbF91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODgwX3VuaXdpbGxfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGM4ODBfdW5pd2lsbF9pbml0X2hvb2ssCi0JfSwKLQlbQUxDODgwX1VOSVdJTExfUDUzXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgwX3VuaXdpbGxfcDUzX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX3VuaXdpbGxfcDUzX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4MF9hc3VzX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3c4MTBfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3RocmVlc3RhY2tfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGM4ODBfdW5pd2lsbF9wNTNfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg4MF91bml3aWxsX3A1M19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4ODBfRlVKSVRTVV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4MF9mdWppdHN1X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX3VuaXdpbGxfcDUzX2luaXRfdmVyYnMsCi0JICAgICAgIAkJCWFsYzg4MF9iZWVwX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODBfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwXzJfamFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfMl9qYWNrX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjODgwX3VuaXdpbGxfcDUzX3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4ODBfdW5pd2lsbF9wNTNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0JfSwKLQlbQUxDODgwX0NMRVZPXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgwX3RocmVlX3N0YWNrX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX3Bpbl9jbGV2b19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgwX2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF90aHJlZXN0YWNrX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF90aHJlZXN0YWNrX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODgwX0xHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgwX2xnX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX2xnX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfbGdfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODBfbGdfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX2xnX2NoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF9sZ19jaF9tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgwX2xnX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4ODBfbGdfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotCQkubG9vcGJhY2tzID0gYWxjODgwX2xnX2xvb3BiYWNrcywKLSNlbmRpZgotCX0sCi0JW0FMQzg4MF9MR19MV10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4MF9sZ19sd19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAotCQkJCWFsYzg4MF9sZ19sd19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgwX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF9sZ19sd19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfbGdfbHdfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgwX2xnX2x3X2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4ODBfbGdfbHdfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0JfSwKLQlbQUxDODgwX01FRElPTl9SSU1dID0gewotCQkubWl4ZXJzID0geyBhbGM4ODBfbWVkaW9uX3JpbV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAotCQkJCWFsYzg4MF9tZWRpb25fcmltX2luaXRfdmVyYnMsCi0JCQkJYWxjX2dwaW8yX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODBfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwXzJfamFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfMl9qYWNrX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9tZWRpb25fcmltX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGM4ODBfbWVkaW9uX3JpbV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODgwX21lZGlvbl9yaW1fc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGM4ODBfbWVkaW9uX3JpbV9hdXRvbXV0ZSwKLQl9LAotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLQlbQUxDODgwX1RFU1RdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODBfdGVzdF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3Rlc3RfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF90ZXN0X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgwX3Rlc3RfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3Rlc3RfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3Rlc3RfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgwX3Rlc3RfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLSNlbmRpZgotfTsKLQotLyoKICAqIEF1dG9tYXRpYyBwYXJzZSBvZiBJL08gcGlucyBmcm9tIHRoZSBCSU9TIGNvbmZpZ3VyYXRpb24KICAqLwogCkBAIC01MjUzLDE4ICsyNDM3LDEyIEBACiAJQUxDX0NUTF9XSURHRVRfTVVURSwKIAlBTENfQ1RMX0JJTkRfTVVURSwKIH07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX2NvbnRyb2xfdGVtcGxhdGVzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjX2NvbnRyb2xfdGVtcGxhdGVzW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRShOVUxMLCAwLCAwLCAwKSwKIAlIREFfQ09ERUNfTVVURShOVUxMLCAwLCAwLCAwKSwKIAlIREFfQklORF9NVVRFKE5VTEwsIDAsIDAsIDApLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICphbGNfa2NvbnRyb2xfbmV3KHN0cnVjdCBhbGNfc3BlYyAqc3BlYykKLXsKLQlzbmRfYXJyYXlfaW5pdCgmc3BlYy0+a2N0bHMsIHNpemVvZihzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyksIDMyKTsKLQlyZXR1cm4gc25kX2FycmF5X25ldygmc3BlYy0+a2N0bHMpOwotfQotCiAvKiBhZGQgZHluYW1pYyBjb250cm9scyAqLwogc3RhdGljIGludCBhZGRfY29udHJvbChzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsIGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLAogCQkgICAgICAgaW50IGNpZHgsIHVuc2lnbmVkIGxvbmcgdmFsKQpAQCAtNTI3NCw3ICsyNDUyLDcgQEAKIAlrbmV3ID0gYWxjX2tjb250cm9sX25ldyhzcGVjKTsKIAlpZiAoIWtuZXcpCiAJCXJldHVybiAtRU5PTUVNOwotCSprbmV3ID0gYWxjODgwX2NvbnRyb2xfdGVtcGxhdGVzW3R5cGVdOworCSprbmV3ID0gYWxjX2NvbnRyb2xfdGVtcGxhdGVzW3R5cGVdOwogCWtuZXctPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOwogCWlmICgha25ldy0+bmFtZSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01MzAzLDYwICsyNDgxLDE1IEBACiAjZGVmaW5lIF9fYWRkX3BiX3N3X2N0cmwoc3BlYywgdHlwZSwgcGZ4LCBjaWR4LCB2YWwpCQkJXAogCWFkZF9jb250cm9sX3dpdGhfcGZ4KHNwZWMsIHR5cGUsIHBmeCwgIlBsYXliYWNrIiwgIlN3aXRjaCIsIGNpZHgsIHZhbCkKIAotI2RlZmluZSBhbGM4ODBfaXNfZml4ZWRfcGluKG5pZCkJKChuaWQpID49IDB4MTQgJiYgKG5pZCkgPD0gMHgxNykKLSNkZWZpbmUgYWxjODgwX2ZpeGVkX3Bpbl9pZHgobmlkKQkoKG5pZCkgLSAweDE0KQotI2RlZmluZSBhbGM4ODBfaXNfbXVsdGlfcGluKG5pZCkJKChuaWQpID49IDB4MTgpCi0jZGVmaW5lIGFsYzg4MF9tdWx0aV9waW5faWR4KG5pZCkJKChuaWQpIC0gMHgxOCkKLSNkZWZpbmUgYWxjODgwX2lkeF90b19kYWMobmlkKQkJKChuaWQpICsgMHgwMikKLSNkZWZpbmUgYWxjODgwX2RhY190b19pZHgobmlkKQkJKChuaWQpIC0gMHgwMikKLSNkZWZpbmUgYWxjODgwX2lkeF90b19taXhlcihuaWQpCSgobmlkKSArIDB4MGMpCi0jZGVmaW5lIGFsYzg4MF9pZHhfdG9fc2VsZWN0b3IobmlkKQkoKG5pZCkgKyAweDEwKQotI2RlZmluZSBBTEM4ODBfUElOX0NEX05JRAkJMHgxYwotCi0vKiBmaWxsIGluIHRoZSBkYWNfbmlkcyB0YWJsZSBmcm9tIHRoZSBwYXJzZWQgcGluIGNvbmZpZ3VyYXRpb24gKi8KLXN0YXRpYyBpbnQgYWxjODgwX2F1dG9fZmlsbF9kYWNfbmlkcyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCi17Ci0JaGRhX25pZF90IG5pZDsKLQlpbnQgYXNzaWduZWRbNF07Ci0JaW50IGksIGo7Ci0KLQltZW1zZXQoYXNzaWduZWQsIDAsIHNpemVvZihhc3NpZ25lZCkpOwotCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gc3BlYy0+cHJpdmF0ZV9kYWNfbmlkczsKLQotCS8qIGNoZWNrIHRoZSBwaW5zIGhhcmR3aXJlZCB0byBhdWRpbyB3aWRnZXQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5saW5lX291dHM7IGkrKykgewotCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07Ci0JCWlmIChhbGM4ODBfaXNfZml4ZWRfcGluKG5pZCkpIHsKLQkJCWludCBpZHggPSBhbGM4ODBfZml4ZWRfcGluX2lkeChuaWQpOwotCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IGFsYzg4MF9pZHhfdG9fZGFjKGlkeCk7Ci0JCQlhc3NpZ25lZFtpZHhdID0gMTsKLQkJfQotCX0KLQkvKiBsZWZ0IHBpbnMgY2FuIGJlIGNvbm5lY3QgdG8gYW55IGF1ZGlvIHdpZGdldCAqLwotCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7Ci0JCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKLQkJaWYgKGFsYzg4MF9pc19maXhlZF9waW4obmlkKSkKLQkJCWNvbnRpbnVlOwotCQkvKiBzZWFyY2ggZm9yIGFuIGVtcHR5IGNoYW5uZWwgKi8KLQkJZm9yIChqID0gMDsgaiA8IGNmZy0+bGluZV9vdXRzOyBqKyspIHsKLQkJCWlmICghYXNzaWduZWRbal0pIHsKLQkJCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldID0KLQkJCQkJYWxjODgwX2lkeF90b19kYWMoaik7Ci0JCQkJYXNzaWduZWRbal0gPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gY2ZnLT5saW5lX291dHM7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphbGNfZ2V0X2xpbmVfb3V0X3BmeChzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCi0JCQkJCWJvb2wgY2FuX2JlX21hc3RlcikKK3N0YXRpYyBjb25zdCBjaGFyICphbGNfZ2V0X2xpbmVfb3V0X3BmeChzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsIGludCBjaCwKKwkJCQkJYm9vbCBjYW5fYmVfbWFzdGVyLCBpbnQgKmluZGV4KQogewogCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2huYW1lWzRdID0geworCQkiRnJvbnQiLCAiU3Vycm91bmQiLCBOVUxMIC8qQ0xGRSovLCAiU2lkZSIKKwl9OwogCisJKmluZGV4ID0gMDsKIAlpZiAoY2ZnLT5saW5lX291dHMgPT0gMSAmJiAhc3BlYy0+bXVsdGlfaW9zICYmCiAJICAgICFjZmctPmhwX291dHMgJiYgIWNmZy0+c3BlYWtlcl9vdXRzICYmIGNhbl9iZV9tYXN0ZXIpCiAJCXJldHVybiAiTWFzdGVyIjsKQEAgLTUzNjcsMTIwICsyNTAwLDE3IEBACiAJCQlyZXR1cm4gIlNwZWFrZXIiOwogCQlicmVhazsKIAljYXNlIEFVVE9fUElOX0hQX09VVDoKKwkJLyogZm9yIG11bHRpLWlvIGNhc2UsIG9ubHkgdGhlIHByaW1hcnkgb3V0ICovCisJCWlmIChjaCAmJiBzcGVjLT5tdWx0aV9pb3MpCisJCQlicmVhazsKKwkJKmluZGV4ID0gY2g7CiAJCXJldHVybiAiSGVhZHBob25lIjsKIAlkZWZhdWx0OgogCQlpZiAoY2ZnLT5saW5lX291dHMgPT0gMSAmJiAhc3BlYy0+bXVsdGlfaW9zKQogCQkJcmV0dXJuICJQQ00iOwogCQlicmVhazsKIAl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmcm9tIHRoZSBwYXJzZWQgREFDIHRhYmxlICovCi1zdGF0aWMgaW50IGFsYzg4MF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCi0JCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2huYW1lWzRdID0gewotCQkiRnJvbnQiLCAiU3Vycm91bmQiLCBOVUxMIC8qQ0xGRSovLCAiU2lkZSIKLQl9OwotCWNvbnN0IGNoYXIgKnBmeCA9IGFsY19nZXRfbGluZV9vdXRfcGZ4KHNwZWMsIGZhbHNlKTsKLQloZGFfbmlkX3QgbmlkOwotCWludCBpLCBlcnIsIG5vdXRwdXRzOwotCi0Jbm91dHB1dHMgPSBjZmctPmxpbmVfb3V0czsKLQlpZiAoc3BlYy0+bXVsdGlfaW9zID4gMCkKLQkJbm91dHB1dHMgKz0gc3BlYy0+bXVsdGlfaW9zOwotCi0JZm9yIChpID0gMDsgaSA8IG5vdXRwdXRzOyBpKyspIHsKLQkJaWYgKCFzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSkKLQkJCWNvbnRpbnVlOwotCQluaWQgPSBhbGM4ODBfaWR4X3RvX21peGVyKGFsYzg4MF9kYWNfdG9faWR4KHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldKSk7Ci0JCWlmICghcGZ4ICYmIGkgPT0gMikgewotCQkJLyogQ2VudGVyL0xGRSAqLwotCQkJZXJyID0gYWRkX3BiX3ZvbF9jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwKLQkJCQkJICAgICAgIkNlbnRlciIsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDEsIDAsCi0JCQkJCQkJICAgICAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IGFkZF9wYl92b2xfY3RybChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsCi0JCQkJCSAgICAgICJMRkUiLAotCQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAyLCAwLAotCQkJCQkJCSAgICAgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSBhZGRfcGJfc3dfY3RybChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwKLQkJCQkJICAgICAiQ2VudGVyIiwKLQkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMSwgMiwKLQkJCQkJCQkgICAgICBIREFfSU5QVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSBhZGRfcGJfc3dfY3RybChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwKLQkJCQkJICAgICAiTEZFIiwKLQkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMiwgMiwKLQkJCQkJCQkgICAgICBIREFfSU5QVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0gZWxzZSB7Ci0JCQljb25zdCBjaGFyICpuYW1lID0gcGZ4OwotCQkJaW50IGluZGV4ID0gaTsKLQkJCWlmICghbmFtZSkgewotCQkJCW5hbWUgPSBjaG5hbWVbaV07Ci0JCQkJaW5kZXggPSAwOwotCQkJfQotCQkJZXJyID0gX19hZGRfcGJfdm9sX2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLAotCQkJCQkJbmFtZSwgaW5kZXgsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsCi0JCQkJCQkJICAgICAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IF9fYWRkX3BiX3N3X2N0cmwoc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsCi0JCQkJCSAgICAgICBuYW1lLCBpbmRleCwKLQkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMiwKLQkJCQkJCQkgICAgICBIREFfSU5QVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmb3Igc3BlYWtlciBhbmQgSFAgb3V0cHV0cyAqLwotc3RhdGljIGludCBhbGM4ODBfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHN0cnVjdCBhbGNfc3BlYyAqc3BlYywgaGRhX25pZF90IHBpbiwKLQkJCQkJY29uc3QgY2hhciAqcGZ4KQotewotCWhkYV9uaWRfdCBuaWQ7Ci0JaW50IGVycjsKLQotCWlmICghcGluKQotCQlyZXR1cm4gMDsKLQotCWlmIChhbGM4ODBfaXNfZml4ZWRfcGluKHBpbikpIHsKLQkJbmlkID0gYWxjODgwX2lkeF90b19kYWMoYWxjODgwX2ZpeGVkX3Bpbl9pZHgocGluKSk7Ci0JCS8qIHNwZWNpZnkgdGhlIERBQyBhcyB0aGUgZXh0cmEgb3V0cHV0ICovCi0JCWlmICghc3BlYy0+bXVsdGlvdXQuaHBfbmlkKQotCQkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gbmlkOwotCQllbHNlCi0JCQlzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdID0gbmlkOwotCQkvKiBjb250cm9sIEhQIHZvbHVtZS9zd2l0Y2ggb24gdGhlIG91dHB1dCBtaXhlciBhbXAgKi8KLQkJbmlkID0gYWxjODgwX2lkeF90b19taXhlcihhbGM4ODBfZml4ZWRfcGluX2lkeChwaW4pKTsKLQkJZXJyID0gYWRkX3BiX3ZvbF9jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgcGZ4LAotCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCQllcnIgPSBhZGRfcGJfc3dfY3RybChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwgcGZ4LAotCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDIsIEhEQV9JTlBVVCkpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfSBlbHNlIGlmIChhbGM4ODBfaXNfbXVsdGlfcGluKHBpbikpIHsKLQkJLyogc2V0IG1hbnVhbCBjb25uZWN0aW9uICovCi0JCS8qIHdlIGhhdmUgb25seSBhIHN3aXRjaCBvbiBIUC1vdXQgUElOICovCi0JCWVyciA9IGFkZF9wYl9zd19jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIHBmeCwKLQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfT1VUUFVUKSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGNobmFtZVtjaF07CiB9CiAKIC8qIGNyZWF0ZSBpbnB1dCBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciB0aGUgZ2l2ZW4gcGluICovCkBAIC01NTA3LDE3ICsyNTM3LDcyIEBACiAJcmV0dXJuIChwaW5jYXAgJiBBQ19QSU5DQVBfSU4pICE9IDA7CiB9CiAKLS8qIGNyZWF0ZSBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciBpbnB1dCBwaW5zICovCi1zdGF0aWMgaW50IGFsY19hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZywKLQkJCQkgICAgICBoZGFfbmlkX3QgbWl4ZXIsCi0JCQkJICAgICAgaGRhX25pZF90IGNhcDEsIGhkYV9uaWRfdCBjYXAyKQorLyogUGFyc2UgdGhlIGNvZGVjIHRyZWUgYW5kIHJldHJpZXZlIEFEQ3MgYW5kIGNvcnJlc3BvbmRpbmcgY2Fwc3JjIE1VWHMgKi8KK3N0YXRpYyBpbnQgYWxjX2F1dG9fZmlsbF9hZGNfY2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgbmlkOworCWhkYV9uaWRfdCAqYWRjX25pZHMgPSBzcGVjLT5wcml2YXRlX2FkY19uaWRzOworCWhkYV9uaWRfdCAqY2FwX25pZHMgPSBzcGVjLT5wcml2YXRlX2NhcHNyY19uaWRzOworCWludCBtYXhfbnVtcyA9IEFSUkFZX1NJWkUoc3BlYy0+cHJpdmF0ZV9hZGNfbmlkcyk7CisJYm9vbCBpbmRlcF9jYXBzcmMgPSBmYWxzZTsKKwlpbnQgaSwgbnVtcyA9IDA7CisKKwluaWQgPSBjb2RlYy0+c3RhcnRfbmlkOworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX25vZGVzOyBpKyssIG5pZCsrKSB7CisJCWhkYV9uaWRfdCBzcmM7CisJCWNvbnN0IGhkYV9uaWRfdCAqbGlzdDsKKwkJdW5zaWduZWQgaW50IGNhcHMgPSBnZXRfd2NhcHMoY29kZWMsIG5pZCk7CisJCWludCB0eXBlID0gZ2V0X3djYXBzX3R5cGUoY2Fwcyk7CisKKwkJaWYgKHR5cGUgIT0gQUNfV0lEX0FVRF9JTiB8fCAoY2FwcyAmIEFDX1dDQVBfRElHSVRBTCkpCisJCQljb250aW51ZTsKKwkJYWRjX25pZHNbbnVtc10gPSBuaWQ7CisJCWNhcF9uaWRzW251bXNdID0gbmlkOworCQlzcmMgPSBuaWQ7CisJCWZvciAoOzspIHsKKwkJCWludCBuOworCQkJdHlwZSA9IGdldF93Y2Fwc190eXBlKGdldF93Y2Fwcyhjb2RlYywgc3JjKSk7CisJCQlpZiAodHlwZSA9PSBBQ19XSURfUElOKQorCQkJCWJyZWFrOworCQkJaWYgKHR5cGUgPT0gQUNfV0lEX0FVRF9TRUwpIHsKKwkJCQljYXBfbmlkc1tudW1zXSA9IHNyYzsKKwkJCQlpbmRlcF9jYXBzcmMgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQkJbiA9IHNuZF9oZGFfZ2V0X2Nvbm5fbGlzdChjb2RlYywgc3JjLCAmbGlzdCk7CisJCQlpZiAobiA+IDEpIHsKKwkJCQljYXBfbmlkc1tudW1zXSA9IHNyYzsKKwkJCQlpbmRlcF9jYXBzcmMgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChuICE9IDEpCisJCQkJYnJlYWs7CisJCQlzcmMgPSAqbGlzdDsKKwkJfQorCQlpZiAoKytudW1zID49IG1heF9udW1zKQorCQkJYnJlYWs7CisJfQorCXNwZWMtPmFkY19uaWRzID0gc3BlYy0+cHJpdmF0ZV9hZGNfbmlkczsKKwlzcGVjLT5jYXBzcmNfbmlkcyA9IHNwZWMtPnByaXZhdGVfY2Fwc3JjX25pZHM7CisJc3BlYy0+bnVtX2FkY19uaWRzID0gbnVtczsKKwlyZXR1cm4gbnVtczsKK30KKworLyogY3JlYXRlIHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIGlucHV0IHBpbnMgKi8KK3N0YXRpYyBpbnQgYWxjX2F1dG9fY3JlYXRlX2lucHV0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CisJaGRhX25pZF90IG1peGVyID0gc3BlYy0+bWl4ZXJfbmlkOwogCXN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFswXTsKLQlpbnQgaSwgZXJyLCBpZHgsIHR5cGVfaWR4ID0gMDsKKwlpbnQgbnVtX2FkY3M7CisJaW50IGksIGMsIGVyciwgaWR4LCB0eXBlX2lkeCA9IDA7CiAJY29uc3QgY2hhciAqcHJldl9sYWJlbCA9IE5VTEw7CiAKKwludW1fYWRjcyA9IGFsY19hdXRvX2ZpbGxfYWRjX2NhcHMoY29kZWMpOworCWlmIChudW1fYWRjcyA8IDApCisJCXJldHVybiAwOworCiAJZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX2lucHV0czsgaSsrKSB7CiAJCWhkYV9uaWRfdCBwaW47CiAJCWNvbnN0IGNoYXIgKmxhYmVsOwpAQCAtNTU0NCwyMSArMjYyOSwyMiBAQAogCQkJfQogCQl9CiAKLQkJaWYgKCFjYXAxKQotCQkJY29udGludWU7Ci0JCWlkeCA9IGdldF9jb25uZWN0aW9uX2luZGV4KGNvZGVjLCBjYXAxLCBwaW4pOwotCQlpZiAoaWR4IDwgMCAmJiBjYXAyKQotCQkJaWR4ID0gZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIGNhcDIsIHBpbik7Ci0JCWlmIChpZHggPj0gMCkKLQkJCXNuZF9oZGFfYWRkX2ltdXhfaXRlbShpbXV4LCBsYWJlbCwgaWR4LCBOVUxMKTsKKwkJZm9yIChjID0gMDsgYyA8IG51bV9hZGNzOyBjKyspIHsKKwkJCWhkYV9uaWRfdCBjYXAgPSBzcGVjLT5jYXBzcmNfbmlkcyA/CisJCQkJc3BlYy0+Y2Fwc3JjX25pZHNbY10gOiBzcGVjLT5hZGNfbmlkc1tjXTsKKwkJCWlkeCA9IGdldF9jb25uZWN0aW9uX2luZGV4KGNvZGVjLCBjYXAsIHBpbik7CisJCQlpZiAoaWR4ID49IDApIHsKKwkJCQlzcGVjLT5pbXV4X3BpbnNbaW11eC0+bnVtX2l0ZW1zXSA9IHBpbjsKKwkJCQlzbmRfaGRhX2FkZF9pbXV4X2l0ZW0oaW11eCwgbGFiZWwsIGlkeCwgTlVMTCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KIAl9Ci0JcmV0dXJuIDA7Ci19CiAKLXN0YXRpYyBpbnQgYWxjODgwX2F1dG9fY3JlYXRlX2lucHV0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCQljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCi17Ci0JcmV0dXJuIGFsY19hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKGNvZGVjLCBjZmcsIDB4MGIsIDB4MDgsIDB4MDkpOworCXNwZWMtPm51bV9tdXhfZGVmcyA9IDE7CisJc3BlYy0+aW5wdXRfbXV4ID0gaW11eDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBhbGNfc2V0X3Bpbl9vdXRwdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCkBAIC01NTY3LDI1ICsyNjUzLDExIEBACiAJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCiAJCQkgICAgcGluX3R5cGUpOwogCS8qIHVubXV0ZSBwaW4gKi8KLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJaWYgKG5pZF9oYXNfbXV0ZShjb2RlYywgbmlkLCBIREFfT1VUUFVUKSkKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAogCQkJICAgIEFNUF9PVVRfVU5NVVRFKTsKIH0KIAotc3RhdGljIHZvaWQgYWxjODgwX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgICBoZGFfbmlkX3QgbmlkLCBpbnQgcGluX3R5cGUsCi0JCQkJCSAgICAgIGludCBkYWNfaWR4KQotewotCWFsY19zZXRfcGluX291dHB1dChjb2RlYywgbmlkLCBwaW5fdHlwZSk7Ci0JLyogbmVlZCB0aGUgbWFudWFsIGNvbm5lY3Rpb24/ICovCi0JaWYgKGFsYzg4MF9pc19tdWx0aV9waW4obmlkKSkgewotCQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQkJaW50IGlkeCA9IGFsYzg4MF9tdWx0aV9waW5faWR4KG5pZCk7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGFsYzg4MF9pZHhfdG9fc2VsZWN0b3IoaWR4KSwgMCwKLQkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCi0JCQkJICAgIGFsYzg4MF9kYWNfdG9faWR4KHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2RhY19pZHhdKSk7Ci0JfQotfQotCiBzdGF0aWMgaW50IGdldF9waW5fdHlwZShpbnQgbGluZV9vdXRfdHlwZSkKIHsKIAlpZiAobGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9IUF9PVVQpCkBAIC01NTk0LDMyICsyNjY2LDcgQEAKIAkJcmV0dXJuIFBJTl9PVVQ7CiB9CiAKLXN0YXRpYyB2b2lkIGFsYzg4MF9hdXRvX2luaXRfbXVsdGlfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHNwZWMtPmF1dG9jZmcubGluZV9vdXRzOyBpKyspIHsKLQkJaGRhX25pZF90IG5pZCA9IHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1tpXTsKLQkJaW50IHBpbl90eXBlID0gZ2V0X3Bpbl90eXBlKHNwZWMtPmF1dG9jZmcubGluZV9vdXRfdHlwZSk7Ci0JCWFsYzg4MF9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgbmlkLCBwaW5fdHlwZSwgaSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhbGM4ODBfYXV0b19pbml0X2V4dHJhX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQloZGFfbmlkX3QgcGluOwotCi0JcGluID0gc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF07Ci0JaWYgKHBpbikgLyogY29ubmVjdCB0byBmcm9udCAqLwotCQlhbGM4ODBfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIHBpbiwgUElOX09VVCwgMCk7Ci0JcGluID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOwotCWlmIChwaW4pIC8qIGNvbm5lY3QgdG8gZnJvbnQgKi8KLQkJYWxjODgwX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9IUCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4MF9hdXRvX2luaXRfYW5hbG9nX2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQorc3RhdGljIHZvaWQgYWxjX2F1dG9faW5pdF9hbmFsb2dfaW5wdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CkBAIC01NjI5LDEzMjY5ICsyNjc2LDMxIEBACiAJCWhkYV9uaWRfdCBuaWQgPSBjZmctPmlucHV0c1tpXS5waW47CiAJCWlmIChhbGNfaXNfaW5wdXRfcGluKGNvZGVjLCBuaWQpKSB7CiAJCQlhbGNfc2V0X2lucHV0X3Bpbihjb2RlYywgbmlkLCBjZmctPmlucHV0c1tpXS50eXBlKTsKLQkJCWlmIChuaWQgIT0gQUxDODgwX1BJTl9DRF9OSUQgJiYKLQkJCSAgICAoZ2V0X3djYXBzKGNvZGVjLCBuaWQpICYgQUNfV0NBUF9PVVRfQU1QKSkKKwkJCWlmIChnZXRfd2NhcHMoY29kZWMsIG5pZCkgJiBBQ19XQ0FQX09VVF9BTVApCiAJCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAogCQkJCQkJICAgIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCiAJCQkJCQkgICAgQU1QX09VVF9NVVRFKTsKIAkJfQogCX0KLX0KIAotc3RhdGljIHZvaWQgYWxjODgwX2F1dG9faW5pdF9pbnB1dF9zcmMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGM7Ci0KLQlmb3IgKGMgPSAwOyBjIDwgc3BlYy0+bnVtX2FkY19uaWRzOyBjKyspIHsKLQkJdW5zaWduZWQgaW50IG11eF9pZHg7Ci0JCWNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4OwotCQltdXhfaWR4ID0gYyA+PSBzcGVjLT5udW1fbXV4X2RlZnMgPyAwIDogYzsKLQkJaW11eCA9ICZzcGVjLT5pbnB1dF9tdXhbbXV4X2lkeF07Ci0JCWlmICghaW11eC0+bnVtX2l0ZW1zICYmIG11eF9pZHggPiAwKQotCQkJaW11eCA9ICZzcGVjLT5pbnB1dF9tdXhbMF07Ci0JCWlmIChpbXV4KQotCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgc3BlYy0+YWRjX25pZHNbY10sIDAsCi0JCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKLQkJCQkJICAgIGltdXgtPml0ZW1zWzBdLmluZGV4KTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYWxjX2F1dG9fYWRkX211bHRpX2NoYW5uZWxfbW9kZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Ci0KLS8qIHBhcnNlIHRoZSBCSU9TIGNvbmZpZ3VyYXRpb24gYW5kIHNldCB1cCB0aGUgYWxjX3NwZWMgKi8KLS8qIHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIDAgaWYgdGhlIHByb3BlciBjb25maWcgaXMgbm90IGZvdW5kLAotICogb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCi0gKi8KLXN0YXRpYyBpbnQgYWxjODgwX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBlcnI7Ci0Jc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODBfaWdub3JlW10gPSB7IDB4MWQsIDAgfTsKLQotCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAotCQkJCQkgICBhbGM4ODBfaWdub3JlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzKQotCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KLQotCWVyciA9IGFsYzg4MF9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsY19hdXRvX2FkZF9tdWx0aV9jaGFubmVsX21vZGUoY29kZWMpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsYzg4MF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gYWxjODgwX2F1dG9fY3JlYXRlX2V4dHJhX291dChzcGVjLAotCQkJCQkgICBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwKLQkJCQkJICAgIlNwZWFrZXIiKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGM4ODBfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHNwZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwKLQkJCQkJICAgIkhlYWRwaG9uZSIpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsYzg4MF9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7Ci0KLQlhbGNfYXV0b19wYXJzZV9kaWdpdGFsKGNvZGVjKTsKLQotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlhZGRfbWl4ZXIoc3BlYywgc3BlYy0+a2N0bHMubGlzdCk7Ci0KLQlhZGRfdmVyYihzcGVjLCBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMpOwotCi0Jc3BlYy0+bnVtX211eF9kZWZzID0gMTsKLQlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOwotCi0JYWxjX3NzaWRfY2hlY2soY29kZWMsIDB4MTUsIDB4MWIsIDB4MTQsIDApOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gZm9yIGF1dG8tY29uZmlndXJhdGlvbiBtb2RlbCAqLwotc3RhdGljIHZvaWQgYWxjODgwX2F1dG9faW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlhbGM4ODBfYXV0b19pbml0X211bHRpX291dChjb2RlYyk7Ci0JYWxjODgwX2F1dG9faW5pdF9leHRyYV9vdXQoY29kZWMpOwotCWFsYzg4MF9hdXRvX2luaXRfYW5hbG9nX2lucHV0KGNvZGVjKTsKLQlhbGM4ODBfYXV0b19pbml0X2lucHV0X3NyYyhjb2RlYyk7Ci0JYWxjX2F1dG9faW5pdF9kaWdpdGFsKGNvZGVjKTsKLQlpZiAoc3BlYy0+dW5zb2xfZXZlbnQpCi0JCWFsY19pbml0aG9vayhjb2RlYyk7Ci19Ci0KLS8qIGNoZWNrIHRoZSBBREMvTVVYIGNvbnRhaW5zIGFsbCBpbnB1dCBwaW5zOyBzb21lIEFEQy9NVVggY29udGFpbnMgb25seQotICogb25lIG9mIHR3byBkaWdpdGFsIG1pYyBwaW5zLCBlLmcuIG9uIEFMQzI3MgotICovCi1zdGF0aWMgdm9pZCBmaXh1cF9hdXRvbWljX2FkYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fYWRjX25pZHM7IGkrKykgewotCQloZGFfbmlkX3QgY2FwID0gc3BlYy0+Y2Fwc3JjX25pZHMgPwotCQkJc3BlYy0+Y2Fwc3JjX25pZHNbaV0gOiBzcGVjLT5hZGNfbmlkc1tpXTsKLQkJaW50IGlpZHgsIGVpZHg7Ci0KLQkJaWlkeCA9IGdldF9jb25uZWN0aW9uX2luZGV4KGNvZGVjLCBjYXAsIHNwZWMtPmludF9taWMucGluKTsKLQkJaWYgKGlpZHggPCAwKQotCQkJY29udGludWU7Ci0JCWVpZHggPSBnZXRfY29ubmVjdGlvbl9pbmRleChjb2RlYywgY2FwLCBzcGVjLT5leHRfbWljLnBpbik7Ci0JCWlmIChlaWR4IDwgMCkKLQkJCWNvbnRpbnVlOwotCQlzcGVjLT5pbnRfbWljLm11eF9pZHggPSBpaWR4OwotCQlzcGVjLT5leHRfbWljLm11eF9pZHggPSBlaWR4OwotCQlpZiAoc3BlYy0+Y2Fwc3JjX25pZHMpCi0JCQlzcGVjLT5jYXBzcmNfbmlkcyArPSBpOwotCQlzcGVjLT5hZGNfbmlkcyArPSBpOwotCQlzcGVjLT5udW1fYWRjX25pZHMgPSAxOwotCQkvKiBvcHRpb25hbCBkb2NrLW1pYyAqLwotCQllaWR4ID0gZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIGNhcCwgc3BlYy0+ZG9ja19taWMucGluKTsKLQkJaWYgKGVpZHggPCAwKQotCQkJc3BlYy0+ZG9ja19taWMucGluID0gMDsKLQkJZWxzZQotCQkJc3BlYy0+ZG9ja19taWMubXV4X2lkeCA9IGVpZHg7Ci0JCXJldHVybjsKLQl9Ci0Jc25kX3ByaW50ZChLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6ICIKLQkJICAgIk5vIEFEQy9NVVggY29udGFpbmluZyBib3RoIDB4JXggYW5kIDB4JXggcGluc1xuIiwKLQkJICAgY29kZWMtPmNoaXBfbmFtZSwgc3BlYy0+aW50X21pYy5waW4sIHNwZWMtPmV4dF9taWMucGluKTsKLQlzcGVjLT5hdXRvX21pYyA9IDA7IC8qIGRpc2FibGUgYXV0by1taWMgdG8gYmUgc3VyZSAqLwotfQotCi0vKiBzZWxlY3Qgb3IgdW5tdXRlIHRoZSBnaXZlbiBjYXBzcmMgcm91dGUgKi8KLXN0YXRpYyB2b2lkIHNlbGVjdF9vcl91bm11dGVfY2Fwc3JjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgY2FwLAotCQkJCSAgICBpbnQgaWR4KQotewotCWlmIChnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIGNhcCkpID09IEFDX1dJRF9BVURfTUlYKSB7Ci0JCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgY2FwLCBIREFfSU5QVVQsIGlkeCwKLQkJCQkJIEhEQV9BTVBfTVVURSwgMCk7Ci0JfSBlbHNlIHsKLQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgY2FwLCAwLAotCQkJCQkgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBpZHgpOwotCX0KLX0KLQotLyogc2V0IHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gdG8gdGhhdCBwaW4gKi8KLXN0YXRpYyBpbnQgaW5pdF9jYXBzcmNfZm9yX3BpbihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbikKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaTsKLQotCWlmICghcGluKQotCQlyZXR1cm4gMDsKLQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2FkY19uaWRzOyBpKyspIHsKLQkJaGRhX25pZF90IGNhcCA9IHNwZWMtPmNhcHNyY19uaWRzID8KLQkJCXNwZWMtPmNhcHNyY19uaWRzW2ldIDogc3BlYy0+YWRjX25pZHNbaV07Ci0JCWludCBpZHg7Ci0KLQkJaWR4ID0gZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIGNhcCwgcGluKTsKLQkJaWYgKGlkeCA8IDApCi0JCQljb250aW51ZTsKLQkJc2VsZWN0X29yX3VubXV0ZV9jYXBzcmMoY29kZWMsIGNhcCwgaWR4KTsKLQkJcmV0dXJuIGk7IC8qIHJldHVybiB0aGUgZm91bmQgaW5kZXggKi8KLQl9Ci0JcmV0dXJuIC0xOyAvKiBub3QgZm91bmQgKi8KLX0KLQotLyogY2hvb3NlIHRoZSBBREMvTVVYIGNvbnRhaW5pbmcgdGhlIGlucHV0IHBpbiBhbmQgaW5pdGlhbGl6ZSB0aGUgc2V0dXAgKi8KLXN0YXRpYyB2b2lkIGZpeHVwX3NpbmdsZV9hZGMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7Ci0JaW50IGk7Ci0KLQkvKiBzZWFyY2ggZm9yIHRoZSBpbnB1dCBwaW47IHRoZXJlIG11c3QgYmUgb25seSBvbmUgKi8KLQlpZiAoY2ZnLT5udW1faW5wdXRzICE9IDEpCi0JCXJldHVybjsKLQlpID0gaW5pdF9jYXBzcmNfZm9yX3Bpbihjb2RlYywgY2ZnLT5pbnB1dHNbMF0ucGluKTsKLQlpZiAoaSA+PSAwKSB7Ci0JCS8qIHVzZSBvbmx5IHRoaXMgQURDICovCi0JCWlmIChzcGVjLT5jYXBzcmNfbmlkcykKLQkJCXNwZWMtPmNhcHNyY19uaWRzICs9IGk7Ci0JCXNwZWMtPmFkY19uaWRzICs9IGk7Ci0JCXNwZWMtPm51bV9hZGNfbmlkcyA9IDE7Ci0JCXNwZWMtPnNpbmdsZV9pbnB1dF9zcmMgPSAxOwotCX0KLX0KLQotLyogaW5pdGlhbGl6ZSBkdWFsIGFkY3MgKi8KLXN0YXRpYyB2b2lkIGZpeHVwX2R1YWxfYWRjX3N3aXRjaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbml0X2NhcHNyY19mb3JfcGluKGNvZGVjLCBzcGVjLT5leHRfbWljLnBpbik7Ci0JaW5pdF9jYXBzcmNfZm9yX3Bpbihjb2RlYywgc3BlYy0+ZG9ja19taWMucGluKTsKLQlpbml0X2NhcHNyY19mb3JfcGluKGNvZGVjLCBzcGVjLT5pbnRfbWljLnBpbik7Ci19Ci0KLS8qIGluaXRpYWxpemUgc29tZSBzcGVjaWFsIGNhc2VzIGZvciBpbnB1dCBzb3VyY2VzICovCi1zdGF0aWMgdm9pZCBhbGNfaW5pdF9zcGVjaWFsX2lucHV0X3NyYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpZiAoc3BlYy0+ZHVhbF9hZGNfc3dpdGNoKQotCQlmaXh1cF9kdWFsX2FkY19zd2l0Y2goY29kZWMpOwotCWVsc2UgaWYgKHNwZWMtPnNpbmdsZV9pbnB1dF9zcmMpCi0JCWluaXRfY2Fwc3JjX2Zvcl9waW4oY29kZWMsIHNwZWMtPmF1dG9jZmcuaW5wdXRzWzBdLnBpbik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9jYXB0dXJlX21peGVyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqY2Fwc1syXVszXSA9IHsKLQkJeyBhbGNfY2FwdHVyZV9taXhlcl9ub3NyYzEsCi0JCSAgYWxjX2NhcHR1cmVfbWl4ZXJfbm9zcmMyLAotCQkgIGFsY19jYXB0dXJlX21peGVyX25vc3JjMyB9LAotCQl7IGFsY19jYXB0dXJlX21peGVyMSwKLQkJICBhbGNfY2FwdHVyZV9taXhlcjIsCi0JCSAgYWxjX2NhcHR1cmVfbWl4ZXIzIH0sCi0JfTsKLQlpZiAoc3BlYy0+bnVtX2FkY19uaWRzID4gMCAmJiBzcGVjLT5udW1fYWRjX25pZHMgPD0gMykgewotCQlpbnQgbXV4ID0gMDsKLQkJaW50IG51bV9hZGNzID0gc3BlYy0+bnVtX2FkY19uaWRzOwotCQlpZiAoc3BlYy0+ZHVhbF9hZGNfc3dpdGNoKQotCQkJbnVtX2FkY3MgPSAxOwotCQllbHNlIGlmIChzcGVjLT5hdXRvX21pYykKLQkJCWZpeHVwX2F1dG9taWNfYWRjKGNvZGVjKTsKLQkJZWxzZSBpZiAoc3BlYy0+aW5wdXRfbXV4KSB7Ci0JCQlpZiAoc3BlYy0+aW5wdXRfbXV4LT5udW1faXRlbXMgPiAxKQotCQkJCW11eCA9IDE7Ci0JCQllbHNlIGlmIChzcGVjLT5pbnB1dF9tdXgtPm51bV9pdGVtcyA9PSAxKQotCQkJCWZpeHVwX3NpbmdsZV9hZGMoY29kZWMpOwotCQl9Ci0JCXNwZWMtPmNhcF9taXhlciA9IGNhcHNbbXV4XVtudW1fYWRjcyAtIDFdOwotCX0KLX0KLQotLyogZmlsbCBhZGNfbmlkcyAoYW5kIGNhcHNyY19uaWRzKSBjb250YWluaW5nIGFsbCBhY3RpdmUgaW5wdXQgcGlucyAqLwotc3RhdGljIHZvaWQgZmlsbHVwX3ByaXZfYWRjX25pZHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGhkYV9uaWRfdCAqbmlkcywKLQkJCQkgaW50IG51bV9uaWRzKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOwotCWludCBuOwotCWhkYV9uaWRfdCBmYWxsYmFja19hZGMgPSAwLCBmYWxsYmFja19jYXAgPSAwOwotCi0JZm9yIChuID0gMDsgbiA8IG51bV9uaWRzOyBuKyspIHsKLQkJaGRhX25pZF90IGFkYywgY2FwOwotCQloZGFfbmlkX3QgY29ubltIREFfTUFYX05VTV9JTlBVVFNdOwotCQlpbnQgbmNvbm5zLCBpLCBqOwotCi0JCWFkYyA9IG5pZHNbbl07Ci0JCWlmIChnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIGFkYykpICE9IEFDX1dJRF9BVURfSU4pCi0JCQljb250aW51ZTsKLQkJY2FwID0gYWRjOwotCQluY29ubnMgPSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyhjb2RlYywgY2FwLCBjb25uLAotCQkJCQkJIEFSUkFZX1NJWkUoY29ubikpOwotCQlpZiAobmNvbm5zID09IDEpIHsKLQkJCWNhcCA9IGNvbm5bMF07Ci0JCQluY29ubnMgPSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyhjb2RlYywgY2FwLCBjb25uLAotCQkJCQkJCSBBUlJBWV9TSVpFKGNvbm4pKTsKLQkJfQotCQlpZiAobmNvbm5zIDw9IDApCi0JCQljb250aW51ZTsKLQkJaWYgKCFmYWxsYmFja19hZGMpIHsKLQkJCWZhbGxiYWNrX2FkYyA9IGFkYzsKLQkJCWZhbGxiYWNrX2NhcCA9IGNhcDsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1faW5wdXRzOyBpKyspIHsKLQkJCWhkYV9uaWRfdCBuaWQgPSBjZmctPmlucHV0c1tpXS5waW47Ci0JCQlmb3IgKGogPSAwOyBqIDwgbmNvbm5zOyBqKyspIHsKLQkJCQlpZiAoY29ubltqXSA9PSBuaWQpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGogPj0gbmNvbm5zKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID49IGNmZy0+bnVtX2lucHV0cykgewotCQkJaW50IG51bV9hZGNzID0gc3BlYy0+bnVtX2FkY19uaWRzOwotCQkJc3BlYy0+cHJpdmF0ZV9hZGNfbmlkc1tudW1fYWRjc10gPSBhZGM7Ci0JCQlzcGVjLT5wcml2YXRlX2NhcHNyY19uaWRzW251bV9hZGNzXSA9IGNhcDsKLQkJCXNwZWMtPm51bV9hZGNfbmlkcysrOwotCQkJc3BlYy0+YWRjX25pZHMgPSBzcGVjLT5wcml2YXRlX2FkY19uaWRzOwotCQkJaWYgKGFkYyAhPSBjYXApCi0JCQkJc3BlYy0+Y2Fwc3JjX25pZHMgPSBzcGVjLT5wcml2YXRlX2NhcHNyY19uaWRzOwotCQl9Ci0JfQotCWlmICghc3BlYy0+bnVtX2FkY19uaWRzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImhkYV9jb2RlYzogJXM6IG5vIHZhbGlkIEFEQyBmb3VuZDsiCi0JCSAgICAgICAiIHVzaW5nIGZhbGxiYWNrIDB4JXhcbiIsCi0JCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lLCBmYWxsYmFja19hZGMpOwotCQlzcGVjLT5wcml2YXRlX2FkY19uaWRzWzBdID0gZmFsbGJhY2tfYWRjOwotCQlzcGVjLT5hZGNfbmlkcyA9IHNwZWMtPnByaXZhdGVfYWRjX25pZHM7Ci0JCWlmIChmYWxsYmFja19hZGMgIT0gZmFsbGJhY2tfY2FwKSB7Ci0JCQlzcGVjLT5wcml2YXRlX2NhcHNyY19uaWRzWzBdID0gZmFsbGJhY2tfY2FwOwotCQkJc3BlYy0+Y2Fwc3JjX25pZHMgPSBzcGVjLT5wcml2YXRlX2FkY19uaWRzOwotCQl9Ci0JfQotfQotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfSU5QVVRfQkVFUAotI2RlZmluZSBzZXRfYmVlcF9hbXAoc3BlYywgbmlkLCBpZHgsIGRpcikgXAotCSgoc3BlYyktPmJlZXBfYW1wID0gSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIGlkeCwgZGlyKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGJlZXBfd2hpdGVfbGlzdFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgyOWYsICJBU1VTIiwgMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODNjZSwgIkVlZVBDIiwgMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODMxYSwgIkVlZVBDIiwgMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODM0YSwgIkVlZVBDIiwgMSksCi0JU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDYxMywgIkludGVsIiwgMSksCi0Je30KLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGhhc19jZGVmaW5lX2JlZXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnE7Ci0JcSA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKGNvZGVjLT5idXMtPnBjaSwgYmVlcF93aGl0ZV9saXN0KTsKLQlpZiAocSkKLQkJcmV0dXJuIHEtPnZhbHVlOwotCXJldHVybiBzcGVjLT5jZGVmaW5lLmVuYWJsZV9wY2JlZXA7Ci19Ci0jZWxzZQotI2RlZmluZSBzZXRfYmVlcF9hbXAoc3BlYywgbmlkLCBpZHgsIGRpcikgLyogTk9QICovCi0jZGVmaW5lIGhhc19jZGVmaW5lX2JlZXAoY29kZWMpCQkwCi0jZW5kaWYKLQotLyoKLSAqIE9LLCBoZXJlIHdlIGhhdmUgZmluYWxseSB0aGUgcGF0Y2ggZm9yIEFMQzg4MAotICovCi0KLXN0YXRpYyBpbnQgcGF0Y2hfYWxjODgwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKLQlpbnQgYm9hcmRfY29uZmlnOwotCWludCBlcnI7Ci0KLQlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoc3BlYyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNvZGVjLT5zcGVjID0gc3BlYzsKLQotCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBTEM4ODBfTU9ERUxfTEFTVCwKLQkJCQkJCSAgYWxjODgwX21vZGVscywKLQkJCQkJCSAgYWxjODgwX2NmZ190YmwpOwotCWlmIChib2FyZF9jb25maWcgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwKLQkJICAgICAgIGNvZGVjLT5jaGlwX25hbWUpOwotCQlib2FyZF9jb25maWcgPSBBTEM4ODBfQVVUTzsKLQl9Ci0KLQlpZiAoYm9hcmRfY29uZmlnID09IEFMQzg4MF9BVVRPKSB7Ci0JCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLwotCQllcnIgPSBhbGM4ODBfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIGlmICghZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKLQkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgMy1zdGFjayBtb2RlLi4uXG4iKTsKLQkJCWJvYXJkX2NvbmZpZyA9IEFMQzg4MF8zU1Q7Ci0JCX0KLQl9Ci0KLQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgMHgxKTsKLQlpZiAoZXJyIDwgMCkgewotCQlhbGNfZnJlZShjb2RlYyk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyAhPSBBTEM4ODBfQVVUTykKLQkJc2V0dXBfcHJlc2V0KGNvZGVjLCAmYWxjODgwX3ByZXNldHNbYm9hcmRfY29uZmlnXSk7Ci0KLQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJmFsYzg4MF9wY21fYW5hbG9nX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZhbGM4ODBfcGNtX2FuYWxvZ19jYXB0dXJlOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfYWx0X2NhcHR1cmUgPSAmYWxjODgwX3BjbV9hbmFsb2dfYWx0X2NhcHR1cmU7Ci0KLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZhbGM4ODBfcGNtX2RpZ2l0YWxfcGxheWJhY2s7Ci0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSA9ICZhbGM4ODBfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKLQotCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7Ci0JCS8qIGNoZWNrIHdoZXRoZXIgTklEIDB4MDcgaXMgdmFsaWQgKi8KLQkJdW5zaWduZWQgaW50IHdjYXAgPSBnZXRfd2NhcHMoY29kZWMsIGFsYzg4MF9hZGNfbmlkc1swXSk7Ci0JCS8qIGdldCB0eXBlICovCi0JCXdjYXAgPSBnZXRfd2NhcHNfdHlwZSh3Y2FwKTsKLQkJaWYgKHdjYXAgIT0gQUNfV0lEX0FVRF9JTikgewotCQkJc3BlYy0+YWRjX25pZHMgPSBhbGM4ODBfYWRjX25pZHNfYWx0OwotCQkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODBfYWRjX25pZHNfYWx0KTsKLQkJfSBlbHNlIHsKLQkJCXNwZWMtPmFkY19uaWRzID0gYWxjODgwX2FkY19uaWRzOwotCQkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODBfYWRjX25pZHMpOwotCQl9Ci0JfQotCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKLQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwYiwgMHgwNSwgSERBX0lOUFVUKTsKLQotCXNwZWMtPnZtYXN0ZXJfbmlkID0gMHgwYzsKLQotCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOwotCWlmIChib2FyZF9jb25maWcgPT0gQUxDODgwX0FVVE8pCi0JCXNwZWMtPmluaXRfaG9vayA9IGFsYzg4MF9hdXRvX2luaXQ7Ci0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotCWlmICghc3BlYy0+bG9vcGJhY2suYW1wbGlzdCkKLQkJc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IGFsYzg4MF9sb29wYmFja3M7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBBTEMyNjAgc3VwcG9ydAotICovCi0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjYwX2RhY19uaWRzWzFdID0gewotCS8qIGZyb250ICovCi0JMHgwMiwKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjYwX2FkY19uaWRzWzFdID0gewotCS8qIEFEQzAgKi8KLQkweDA0LAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjBfYWRjX25pZHNfYWx0WzFdID0gewotCS8qIEFEQzEgKi8KLQkweDA1LAotfTsKLQotLyogTklEcyB1c2VkIHdoZW4gc2ltdWx0YW5lb3VzIGFjY2VzcyB0byBib3RoIEFEQ3MgbWFrZXMgc2Vuc2UuICBOb3RlIHRoYXQKLSAqIGFsYzI2MF9jYXB0dXJlX21peGVyIGFzc3VtZXMgQURDMCAobmlkIDB4MDQpIGlzIHRoZSBmaXJzdCBBREMuCi0gKi8KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjYwX2R1YWxfYWRjX25pZHNbMl0gPSB7Ci0JLyogQURDMCwgQURDMSAqLwotCTB4MDQsIDB4MDUKLX07Ci0KLSNkZWZpbmUgQUxDMjYwX0RJR09VVF9OSUQJMHgwMwotI2RlZmluZSBBTEMyNjBfRElHSU5fTklECTB4MDYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2MF9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gNCwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJGcm9udCBNaWMiLCAweDEgfSwKLQkJeyAiTGluZSIsIDB4MiB9LAotCQl7ICJDRCIsIDB4NCB9LAotCX0sCi19OwotCi0vKiBPbiBGdWppdHN1IFM3MDJ4IGxhcHRvcHMgY2FwdHVyZSBvbmx5IG1ha2VzIHNlbnNlIGZyb20gTWljL0xpbmVJbiBqYWNrLAotICogaGVhZHBob25lIGphY2sgYW5kIHRoZSBpbnRlcm5hbCBDRCBsaW5lcyBzaW5jZSB0aGVzZSBhcmUgdGhlIG9ubHkgcGlucyBhdAotICogd2hpY2ggYXVkaW8gY2FuIGFwcGVhci4gIEZvciBmbGV4aWJpbGl0eSwgYWxzbyBhbGxvdyB0aGUgb3B0aW9uIG9mCi0gKiByZWNvcmRpbmcgdGhlIG1peGVyIG91dHB1dCBvbiB0aGUgc2Vjb25kIEFEQyAoQURDMCBkb2Vzbid0IGhhdmUgYQotICogY29ubmVjdGlvbiB0byB0aGUgbWl4ZXIgb3V0cHV0KS4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2MF9mdWppdHN1X2NhcHR1cmVfc291cmNlc1syXSA9IHsKLQl7Ci0JCS5udW1faXRlbXMgPSAzLAotCQkuaXRlbXMgPSB7Ci0JCQl7ICJNaWMvTGluZSIsIDB4MCB9LAotCQkJeyAiQ0QiLCAweDQgfSwKLQkJCXsgIkhlYWRwaG9uZSIsIDB4MiB9LAotCQl9LAotCX0sCi0JewotCQkubnVtX2l0ZW1zID0gNCwKLQkJLml0ZW1zID0gewotCQkJeyAiTWljL0xpbmUiLCAweDAgfSwKLQkJCXsgIkNEIiwgMHg0IH0sCi0JCQl7ICJIZWFkcGhvbmUiLCAweDIgfSwKLQkJCXsgIk1peGVyIiwgMHg1IH0sCi0JCX0sCi0JfSwKLQotfTsKLQotLyogQWNlciBUcmF2ZWxNYXRlKC9FeHRlbnNhL0FzcGlyZSkgbm90ZWJvb2tzIGhhdmUgc2ltaWxhciBjb25maWd1cmF0aW9uIHRvCi0gKiB0aGUgRnVqaXRzdSBTNzAyeCwgYnV0IGphY2tzIGFyZSBtYXJrZWQgZGlmZmVyZW50bHkuCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjBfYWNlcl9jYXB0dXJlX3NvdXJjZXNbMl0gPSB7Ci0JewotCQkubnVtX2l0ZW1zID0gNCwKLQkJLml0ZW1zID0gewotCQkJeyAiTWljIiwgMHgwIH0sCi0JCQl7ICJMaW5lIiwgMHgyIH0sCi0JCQl7ICJDRCIsIDB4NCB9LAotCQkJeyAiSGVhZHBob25lIiwgMHg1IH0sCi0JCX0sCi0JfSwKLQl7Ci0JCS5udW1faXRlbXMgPSA1LAotCQkuaXRlbXMgPSB7Ci0JCQl7ICJNaWMiLCAweDAgfSwKLQkJCXsgIkxpbmUiLCAweDIgfSwKLQkJCXsgIkNEIiwgMHg0IH0sCi0JCQl7ICJIZWFkcGhvbmUiLCAweDYgfSwKLQkJCXsgIk1peGVyIiwgMHg1IH0sCi0JCX0sCi0JfSwKLX07Ci0KLS8qIE1heGRhdGEgRmF2b3JpdCAxMDBYUyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2MF9mYXZvcml0MTAwX2NhcHR1cmVfc291cmNlc1syXSA9IHsKLQl7Ci0JCS5udW1faXRlbXMgPSAyLAotCQkuaXRlbXMgPSB7Ci0JCQl7ICJMaW5lL01pYyIsIDB4MCB9LAotCQkJeyAiQ0QiLCAweDQgfSwKLQkJfSwKLQl9LAotCXsKLQkJLm51bV9pdGVtcyA9IDMsCi0JCS5pdGVtcyA9IHsKLQkJCXsgIkxpbmUvTWljIiwgMHgwIH0sCi0JCQl7ICJDRCIsIDB4NCB9LAotCQkJeyAiTWl4ZXIiLCAweDUgfSwKLQkJfSwKLQl9LAotfTsKLQotLyoKLSAqIFRoaXMgaXMganVzdCBwbGFjZS1ob2xkZXIsIHNvIHRoZXJlJ3Mgc29tZXRoaW5nIGZvciBhbGNfYnVpbGRfcGNtcyB0byBsb29rCi0gKiBhdCB3aGVuIGl0IGNhbGN1bGF0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzLiBBTEMyNjAgaGFzIG5vIG1peGVyCi0gKiBlbGVtZW50IHdoaWNoIGFsbG93cyBjaGFuZ2luZyB0aGUgY2hhbm5lbCBtb2RlLCBzbyB0aGUgdmVyYiBsaXN0IGlzCi0gKiBuZXZlciB1c2VkLgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjMjYwX21vZGVzWzFdID0gewotCXsgMiwgTlVMTCB9LAotfTsKLQotCi0vKiBNaXhlciBjb21iaW5hdGlvbnMKLSAqCi0gKiBiYXNpYzogYmFzZV9vdXRwdXQgKyBpbnB1dCArIHBjX2JlZXAgKyBjYXB0dXJlCi0gKiBIUDogYmFzZV9vdXRwdXQgKyBpbnB1dCArIGNhcHR1cmVfYWx0Ci0gKiBIUF8zMDEzOiBocF8zMDEzICsgaW5wdXQgKyBjYXB0dXJlCi0gKiBmdWppdHN1OiBmdWppdHN1ICsgY2FwdHVyZQotICogYWNlcjogYWNlciArIGNhcHR1cmUKLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYwX2Jhc2Vfb3V0cHV0X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDA4LCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDA5LCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTW9ubyBQbGF5YmFjayBWb2x1bWUiLCAweDBhLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAweDBhLCAxLCAyLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfaW5wdXRfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIHVwZGF0ZSBIUCwgbGluZSBhbmQgbW9ubyBvdXQgcGlucyBhY2NvcmRpbmcgdG8gdGhlIG1hc3RlciBzd2l0Y2ggKi8KLXN0YXRpYyB2b2lkIGFsYzI2MF9ocF9tYXN0ZXJfdXBkYXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0JLyogY2hhbmdlIEhQIHBpbnMgKi8KLQlkb19hdXRvbXV0ZShjb2RlYywgQVJSQVlfU0laRShzcGVjLT5hdXRvY2ZnLmhwX3BpbnMpLAotCQkgICAgc3BlYy0+YXV0b2NmZy5ocF9waW5zLCBzcGVjLT5tYXN0ZXJfbXV0ZSwgdHJ1ZSk7Ci0JdXBkYXRlX3NwZWFrZXJzKGNvZGVjKTsKLX0KLQotc3RhdGljIGludCBhbGMyNjBfaHBfbWFzdGVyX3N3X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQkqdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWUgPSAhc3BlYy0+bWFzdGVyX211dGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWxjMjYwX2hwX21hc3Rlcl9zd19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IHZhbCA9ICEqdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWU7Ci0KLQlpZiAodmFsID09IHNwZWMtPm1hc3Rlcl9tdXRlKQotCQlyZXR1cm4gMDsKLQlzcGVjLT5tYXN0ZXJfbXV0ZSA9IHZhbDsKLQlhbGMyNjBfaHBfbWFzdGVyX3VwZGF0ZShjb2RlYyk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfaHBfb3V0cHV0X21peGVyW10gPSB7Ci0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX05JRF9GTEFHIHwgMHgxMSwKLQkJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAotCQkuZ2V0ID0gYWxjMjYwX2hwX21hc3Rlcl9zd19nZXQsCi0JCS5wdXQgPSBhbGMyNjBfaHBfbWFzdGVyX3N3X3B1dCwKLQl9LAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwOCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwOSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYSwgMSwgMHgwLAotCQkJICAgICAgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGEsIDEsIDIsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfdW5zb2xfdmVyYnNbXSA9IHsKLQl7MHgxMCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0Je30sCi19OwotCi1zdGF0aWMgdm9pZCBhbGMyNjBfaHBfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDBmOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxMDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTE7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYwX2hwXzMwMTNfbWl4ZXJbXSA9IHsKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKLQkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCAweDExLAotCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCi0JCS5nZXQgPSBhbGMyNjBfaHBfbWFzdGVyX3N3X2dldCwKLQkJLnB1dCA9IGFsYzI2MF9ocF9tYXN0ZXJfc3dfcHV0LAotCX0sCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJBdXgtSW4gUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwNiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQXV4LUluIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDYsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBhLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxMSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgdm9pZCBhbGMyNjBfaHBfMzAxM19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDEwOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxMTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGMyNjBfZGM3NjAwX2JpbmRfbWFzdGVyX3ZvbCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF92b2wsCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA4LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA5LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBhLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjMjYwX2RjNzYwMF9iaW5kX3N3aXRjaCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTEsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTUsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfaHBfZGM3NjAwX21peGVyW10gPSB7Ci0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2MF9kYzc2MDBfYmluZF9tYXN0ZXJfdm9sKSwKLQlIREFfQklORF9TVygiTGluZU91dCBQbGF5YmFjayBTd2l0Y2giLCAmYWxjMjYwX2RjNzYwMF9iaW5kX3N3aXRjaCksCi0JSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MCwgSERBX09VVFBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfMzAxM191bnNvbF92ZXJic1tdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzI2MF9ocF8zMDEyX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxMDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MGY7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDExOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci19Ci0KLS8qIEZ1aml0c3UgUzcwMnggc2VyaWVzIGxhcHRvcHMuICBBTEMyNjAgcGluIHVzYWdlOiBNaWMvTGluZSBqYWNrID0gMHgxMiwKLSAqIEhQIGphY2sgPSAweDE0LCBDRCBhdWRpbyA9ICAweDE2LCBpbnRlcm5hbCBzcGVha2VyID0gMHgxMC4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9mdWppdHN1X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDIsIEhEQV9JTlBVVCksCi0JQUxDX1BJTl9NT0RFKCJIZWFkcGhvbmUgSmFjayBNb2RlIiwgMHgxNCwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljL0xpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMvTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCi0JQUxDX1BJTl9NT0RFKCJNaWMvTGluZSBKYWNrIE1vZGUiLCAweDEyLCBBTENfUElOX0RJUl9JTiksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwOSwgMiwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBNaXhlciBmb3IgQWNlciBUcmF2ZWxNYXRlKC9FeHRlbnNhL0FzcGlyZSkgbm90ZWJvb2tzLiAgTm90ZSB0aGF0IGN1cnJlbnQKLSAqIHZlcnNpb25zIG9mIHRoZSBBTEMyNjAgZG9uJ3QgYWN0IG9uIHJlcXVlc3RzIHRvIGVuYWJsZSBtaWMgYmlhcyBmcm9tIE5JRAotICogMHgwZiAodXNlZCB0byBkcml2ZSB0aGUgaGVhZHBob25lIGphY2sgaW4gdGhlc2UgbGFwdG9wcykuICBUaGUgQUxDMjYwCi0gKiBkYXRhc2hlZXQgZG9lc24ndCBtZW50aW9uIHRoaXMgcmVzdHJpY3Rpb24uICBBdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGNsZWFyCi0gKiB3aGV0aGVyIHRoaXMgYmVoYXZpb3VyIGlzIGludGVudGlvbmFsIG9yIGlzIGEgaGFyZHdhcmUgYnVnIGluIGNoaXAKLSAqIHJldmlzaW9ucyBhdmFpbGFibGUgaW4gZWFybHkgMjAwNi4gIFRoZXJlZm9yZSBmb3Igbm93IGFsbG93IHRoZQotICogIkhlYWRwaG9uZSBKYWNrIE1vZGUiIGNvbnRyb2wgdG8gc3BhbiBhbGwgY2hvaWNlcywgYnV0IGlmIGl0IHR1cm5zIG91dAotICogdGhhdCB0aGUgbGFjayBvZiBtaWMgYmlhcyBmb3IgdGhpcyBOSUQgaXMgaW50ZW50aW9uYWwgd2UgY291bGQgY2hhbmdlIHRoZQotICogbW9kZSBmcm9tIEFMQ19QSU5fRElSX0lOT1VUIHRvIEFMQ19QSU5fRElSX0lOT1VUX05PTUlDQklBUy4KLSAqCi0gKiBJbiBhZGRpdGlvbiwgQWNlciBUcmF2ZWxNYXRlKC9FeHRlbnNhL0FzcGlyZSkgbm90ZWJvb2tzIGluIGVhcmx5IDIwMDYKLSAqIGRvbid0IGFwcGVhciB0byBtYWtlIHRoZSBtaWMgYmlhcyBhdmFpbGFibGUgZnJvbSB0aGUgImxpbmUiIGphY2ssIGV2ZW4KLSAqIHRob3VnaCB0aGUgTklEIHVzZWQgZm9yIHRoaXMgamFjayAoMHgxNCkgY2FuIHN1cHBseSBpdC4gIFRoZSB0aGVvcnkgaXMKLSAqIHRoYXQgcGVyaGFwcyBBY2VyIGhhdmUgaW5jbHVkZWQgYmxvY2tpbmcgY2FwYWNpdG9ycyBiZXR3ZWVuIHRoZSBBTEMyNjAKLSAqIGFuZCB0aGUgb3V0cHV0IGphY2suICBJZiB0aGlzIHR1cm5zIG91dCB0byBiZSB0aGUgY2FzZSBmb3IgYWxsIHN1Y2gKLSAqIG1vZGVscyB0aGUgIkxpbmUgSmFjayBNb2RlIiBtb2RlIGNvdWxkIGJlIGNoYW5nZWQgZnJvbSBBTENfUElOX0RJUl9JTk9VVAotICogdG8gQUxDX1BJTl9ESVJfSU5PVVRfTk9NSUNCSUFTLgotICoKLSAqIFRoZSBDMjB4IFRhYmxldCBzZXJpZXMgaGF2ZSBhIG1vbm8gaW50ZXJuYWwgc3BlYWtlciB3aGljaCBpcyBjb250cm9sbGVkCi0gKiB2aWEgdGhlIGNoaXAncyBNb25vIHN1bSB3aWRnZXQgYW5kIHBpbiBjb21wbGV4LCBzbyBpbmNsdWRlIHRoZSBuZWNlc3NhcnkKLSAqIGNvbnRyb2xzIGZvciBzdWNoIG1vZGVscy4gIE9uIG1vZGVscyB3aXRob3V0IGEgIm1vbm8gc3BlYWtlciIgdGhlIGNvbnRyb2wKLSAqIHdvbid0IGRvIGFueXRoaW5nLgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYwX2FjZXJfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwOCwgMiwgSERBX0lOUFVUKSwKLQlBTENfUElOX01PREUoIkhlYWRwaG9uZSBKYWNrIE1vZGUiLCAweDBmLCBBTENfUElOX0RJUl9JTk9VVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGEsIDEsIDB4MCwKLQkJCSAgICAgIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBhLCAxLCAyLAotCQkJICAgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCi0JQUxDX1BJTl9NT0RFKCJNaWMgSmFjayBNb2RlIiwgMHgxMiwgQUxDX1BJTl9ESVJfSU4pLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAotCUFMQ19QSU5fTU9ERSgiTGluZSBKYWNrIE1vZGUiLCAweDE0LCBBTENfUElOX0RJUl9JTk9VVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogTWF4ZGF0YSBGYXZvcml0IDEwMFhTOiBvbmUgb3V0cHV0IGFuZCBvbmUgaW5wdXQgKDB4MTIpIGphY2sKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9mYXZvcml0MTAwX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDIsIEhEQV9JTlBVVCksCi0JQUxDX1BJTl9NT0RFKCJPdXRwdXQgSmFjayBNb2RlIiwgMHgwZiwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUvTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZS9NaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAotCUFMQ19QSU5fTU9ERSgiTGluZS9NaWMgSmFjayBNb2RlIiwgMHgxMiwgQUxDX1BJTl9ESVJfSU4pLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIFBhY2thcmQgYmVsbCBWNzkwMCAgQUxDMjYwIHBpbiB1c2FnZTogSFAgPSAweDBmLCBNaWMgamFjayA9IDB4MTIsCi0gKiBMaW5lIEluIGphY2sgPSAweDE0LCBDRCBhdWRpbyA9ICAweDE2LCBwYyBiZWVwID0gMHgxNy4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF93aWxsX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDB4MiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAotCUFMQ19QSU5fTU9ERSgiTWljIEphY2sgTW9kZSIsIDB4MTIsIEFMQ19QSU5fRElSX0lOKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwMiwgSERBX0lOUFVUKSwKLQlBTENfUElOX01PREUoIkxpbmUgSmFjayBNb2RlIiwgMHgxNCwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogUmVwbGFjZXIgNjcyViBBTEMyNjAgcGluIHVzYWdlOiBNaWMgamFjayA9IDB4MTIsCi0gKiBMaW5lIEluIGphY2sgPSAweDE0LCBBVEFQSSBNaWMgPSAweDEzLCBzcGVha2VyID0gMHgwZi4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9yZXBsYWNlcl82NzJ2X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDB4MiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAotCUFMQ19QSU5fTU9ERSgiTWljIEphY2sgTW9kZSIsIDB4MTIsIEFMQ19QSU5fRElSX0lOKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJBVEFQSSBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJBVEFUSSBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAotCUFMQ19QSU5fTU9ERSgiTGluZSBKYWNrIE1vZGUiLCAweDE0LCBBTENfUElOX0RJUl9JTk9VVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIGluaXRpYWxpemF0aW9uIHZlcmJzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYwX2luaXRfdmVyYnNbXSA9IHsKLQkvKiBMaW5lIEluIHBpbiB3aWRnZXQgZm9yIGlucHV0ICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JLyogTWljMSAocmVhciBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JLyogTWljMiAoZnJvbnQgcGFuZWwpIHBpbiB3aWRnZXQgZm9yIGlucHV0IGFuZCB2cmVmIGF0IDgwJSAqLwotCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCS8qIExJTkUtMiBpcyB1c2VkIGZvciBsaW5lLW91dCBpbiByZWFyICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JLyogc2VsZWN0IGxpbmUtb3V0ICovCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBMSU5FLU9VVCBwaW4gKi8KLQl7MHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQkvKiBlbmFibGUgSFAgKi8KLQl7MHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCS8qIGVuYWJsZSBNb25vICovCi0JezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JLyogbXV0ZSBjYXB0dXJlIGFtcCBsZWZ0IGFuZCByaWdodCAqLwotCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQkvKiBzZXQgY29ubmVjdGlvbiBzZWxlY3QgdG8gbGluZSBpbiAoZGVmYXVsdCBzZWxlY3QgZm9yIHRoaXMgQURDKSAqLwotCXsweDA0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0JLyogbXV0ZSBjYXB0dXJlIGFtcCBsZWZ0IGFuZCByaWdodCAqLwotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQkvKiBzZXQgY29ubmVjdGlvbiBzZWxlY3QgdG8gbGluZSBpbiAoZGVmYXVsdCBzZWxlY3QgZm9yIHRoaXMgQURDKSAqLwotCXsweDA1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0JLyogc2V0IHZvbD0wIExpbmUtT3V0IG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCS8qIHVubXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIHNldCB2b2w9MCBIUCBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQkvKiB1bm11dGUgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIGdhaW4gb24gdGhpcyBhbXApICovCi0JezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQkvKiBzZXQgdm9sPTAgTW9ubyBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KLQl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQkvKiB1bm11dGUgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIGdhaW4gb24gdGhpcyBhbXApICovCi0JezB4MTEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQkvKiB1bm11dGUgTElORS0yIG91dCBwaW4gKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIEFtcCBJbmRleGVzOiBDRCA9IDB4MDQsIExpbmUgSW4gMSA9IDB4MDIsIE1pYyAxID0gMHgwMCAmCi0JICogTGluZSBJbiAyID0gMHgwMwotCSAqLwotCS8qIG11dGUgYW5hbG9nIGlucHV0cyAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKLQkvKiBBbXAgSW5kZXhlczogREFDID0gMHgwMSAmIG1peGVyID0gMHgwMCAqLwotCS8qIG11dGUgRnJvbnQgb3V0IHBhdGggKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JLyogbXV0ZSBIZWFkcGhvbmUgb3V0IHBhdGggKi8KLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JLyogbXV0ZSBNb25vIG91dCBwYXRoICovCi0JezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsgfQotfTsKLQotI2lmIDAgLyogc2hvdWxkIGJlIGlkZW50aWNhbCB3aXRoIGFsYzI2MF9pbml0X3ZlcmJzPyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfaW5pdF92ZXJic1tdID0gewotCS8qIEhlYWRwaG9uZSBhbmQgb3V0cHV0ICovCi0JezB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMH0sCi0JLyogbW9ubyBvdXRwdXQgKi8KLQl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKLQkvKiBNaWMxIChyZWFyIHBhbmVsKSBwaW4gd2lkZ2V0IGZvciBpbnB1dCBhbmQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQkvKiBNaWMyIChmcm9udCBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCi0JezB4MTMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCi0JLyogTGluZSBJbiBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCS8qIExpbmUtMiBwaW4gd2lkZ2V0IGZvciBvdXRwdXQgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKLQkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCS8qIHVubXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwfSwKLQkvKiBzZXQgY29ubmVjdGlvbiBzZWxlY3QgdG8gbGluZSBpbiAoZGVmYXVsdCBzZWxlY3QgZm9yIHRoaXMgQURDKSAqLwotCXsweDA0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0JLyogdW5tdXRlIExpbmUtT3V0IG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKLQkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAotCS8qIHVubXV0ZSBIUCBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCi0JLyogbXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KLQl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKLQkvKiBBbXAgSW5kZXhlczogQ0QgPSAweDA0LCBMaW5lIEluIDEgPSAweDAyLCBNaWMgMSA9IDB4MDAgJgotCSAqIExpbmUgSW4gMiA9IDB4MDMKLQkgKi8KLQkvKiBtdXRlIGFuYWxvZyBpbnB1dHMgKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0JLyogQW1wIEluZGV4ZXM6IERBQyA9IDB4MDEgJiBtaXhlciA9IDB4MDAgKi8KLQkvKiBVbm11dGUgRnJvbnQgb3V0IHBhdGggKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCS8qIFVubXV0ZSBIZWFkcGhvbmUgb3V0IHBhdGggKi8KLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCS8qIFVubXV0ZSBNb25vIG91dCBwYXRoICovCi0JezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQl7IH0KLX07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfMzAxM19pbml0X3ZlcmJzW10gPSB7Ci0JLyogTGluZSBvdXQgYW5kIG91dHB1dCAqLwotCXsweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAotCS8qIG1vbm8gb3V0cHV0ICovCi0JezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCi0JLyogTWljMSAocmVhciBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCi0JLyogTWljMiAoZnJvbnQgcGFuZWwpIHBpbiB3aWRnZXQgZm9yIGlucHV0IGFuZCB2cmVmIGF0IDgwJSAqLwotCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAotCS8qIExpbmUgSW4gcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQkvKiBIZWFkcGhvbmUgcGluIHdpZGdldCBmb3Igb3V0cHV0ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMH0sCi0JLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQkvKiB1bm11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMH0sCi0JLyogc2V0IGNvbm5lY3Rpb24gc2VsZWN0IHRvIGxpbmUgaW4gKGRlZmF1bHQgc2VsZWN0IGZvciB0aGlzIEFEQykgKi8KLQl7MHgwNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAotCS8qIHVubXV0ZSBMaW5lLU91dCBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCi0JLyogbXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKLQkvKiB1bm11dGUgSFAgbWl4ZXIgYW1wIGxlZnQgYW5kIHJpZ2h0ICh2b2x1bWUgPSAwKSAqLwotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAotCS8qIG11dGUgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIGdhaW4gb24gdGhpcyBhbXApICovCi0JezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCi0JLyogQW1wIEluZGV4ZXM6IENEID0gMHgwNCwgTGluZSBJbiAxID0gMHgwMiwgTWljIDEgPSAweDAwICYKLQkgKiBMaW5lIEluIDIgPSAweDAzCi0JICovCi0JLyogbXV0ZSBhbmFsb2cgaW5wdXRzICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCS8qIEFtcCBJbmRleGVzOiBEQUMgPSAweDAxICYgbWl4ZXIgPSAweDAwICovCi0JLyogVW5tdXRlIEZyb250IG91dCBwYXRoICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQkvKiBVbm11dGUgSGVhZHBob25lIG91dCBwYXRoICovCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQkvKiBVbm11dGUgTW9ubyBvdXQgcGF0aCAqLwotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCi0JeyB9Ci19OwotCi0vKiBJbml0aWFsaXNhdGlvbiBzZXF1ZW5jZSBmb3IgQUxDMjYwIGFzIGNvbmZpZ3VyZWQgaW4gRnVqaXRzdSBTNzAyeAotICogbGFwdG9wcy4gIEFMQzI2MCBwaW4gdXNhZ2U6IE1pYy9MaW5lIGphY2sgPSAweDEyLCBIUCBqYWNrID0gMHgxNCwgQ0QKLSAqIGF1ZGlvID0gMHgxNiwgaW50ZXJuYWwgc3BlYWtlciA9IDB4MTAuCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYwX2Z1aml0c3VfaW5pdF92ZXJic1tdID0gewotCS8qIERpc2FibGUgYWxsIEdQSU9zICovCi0JezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMH0sCi0JLyogSW50ZXJuYWwgc3BlYWtlciBpcyBjb25uZWN0ZWQgdG8gaGVhZHBob25lIHBpbiAqLwotCXsweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JLyogSGVhZHBob25lL0xpbmUtb3V0IGphY2sgY29ubmVjdHMgdG8gTGluZTEgcGluOyBtYWtlIGl0IGFuIG91dHB1dCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCS8qIE1pYy9MaW5lLWluIGphY2sgaXMgY29ubmVjdGVkIHRvIG1pYzEgcGluLCBzbyBtYWtlIGl0IGFuIGlucHV0ICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQkvKiBFbnN1cmUgYWxsIG90aGVyIHVudXNlZCBwaW5zIGFyZSBkaXNhYmxlZCBhbmQgbXV0ZWQuICovCi0JezB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQl7MHgxMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAotCXsweDEzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQotCS8qIERpc2FibGUgZGlnaXRhbCAoU1BESUYpIHBpbnMgKi8KLQl7MHgwMywgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIDB9LAotCXsweDA2LCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwgMH0sCi0KLQkvKiBFbnN1cmUgTGluZTEgcGluIHdpZGdldCB0YWtlcyBpdHMgaW5wdXQgZnJvbSB0aGUgT1VUMSBzdW0gYnVzCi0JICogd2hlbiBhY3RpbmcgYXMgYW4gb3V0cHV0LgotCSAqLwotCXsweDBkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0KLQkvKiBTdGFydCB3aXRoIG91dHB1dCBzdW0gd2lkZ2V0cyBtdXRlZCBhbmQgdGhlaXIgb3V0cHV0IGdhaW5zIGF0IG1pbiAqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogVW5tdXRlIEhQIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBlcXVpdiBtaXhlciBjdHJsKSAqLwotCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogVW5tdXRlIExpbmUxIHBpbiB3aWRnZXQgb3V0cHV0IGJ1ZmZlciBzaW5jZSBpdCBzdGFydHMgYXMgYW4gb3V0cHV0LgotCSAqIElmIHRoZSBwaW4gbW9kZSBpcyBjaGFuZ2VkIGJ5IHRoZSB1c2VyIHRoZSBwaW4gbW9kZSBjb250cm9sIHdpbGwKLQkgKiB0YWtlIGNhcmUgb2YgZW5hYmxpbmcgdGhlIHBpbidzIGlucHV0L291dHB1dCBidWZmZXJzIGFzIG5lZWRlZC4KLQkgKiBUaGVyZWZvcmUgdGhlcmUncyBubyBuZWVkIHRvIGVuYWJsZSB0aGUgaW5wdXQgYnVmZmVyIGF0IHRoaXMKLQkgKiBzdGFnZS4KLQkgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIFVubXV0ZSBpbnB1dCBidWZmZXIgb2YgcGluIHdpZGdldCB1c2VkIGZvciBMaW5lLWluIChubyBlcXVpdgotCSAqIG1peGVyIGN0cmwpCi0JICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyogTXV0ZSBjYXB0dXJlIGFtcCBsZWZ0IGFuZCByaWdodCAqLwotCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JLyogU2V0IEFEQyBjb25uZWN0aW9uIHNlbGVjdCB0byBtYXRjaCBkZWZhdWx0IG1peGVyIHNldHRpbmcgLSBsaW5lCi0JICogaW4gKG9uIG1pYzEgcGluKQotCSAqLwotCXsweDA0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0KLQkvKiBEbyB0aGUgc2FtZSBmb3IgdGhlIHNlY29uZCBBREM6IG11dGUgY2FwdHVyZSBpbnB1dCBhbXAgYW5kCi0JICogc2V0IEFEQyBjb25uZWN0aW9uIHRvIGxpbmUgaW4gKG9uIG1pYzEgcGluKQotCSAqLwotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCS8qIE11dGUgYWxsIGlucHV0cyB0byBtaXhlciB3aWRnZXQgKGV2ZW4gdW5jb25uZWN0ZWQgb25lcykgKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LCAvKiBtaWMxIHBpbiAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sIC8qIG1pYzIgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwgLyogbGluZTEgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwgLyogbGluZTIgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwgLyogQ0QgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwgLyogQmVlcC1nZW4gcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDYpfSwgLyogTGluZS1vdXQgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDcpfSwgLyogSFAtcGluIHBpbiAqLwotCi0JeyB9Ci19OwotCi0vKiBJbml0aWFsaXNhdGlvbiBzZXF1ZW5jZSBmb3IgQUxDMjYwIGFzIGNvbmZpZ3VyZWQgaW4gQWNlciBUcmF2ZWxNYXRlIGFuZAotICogc2ltaWxhciBsYXB0b3BzIChhZGFwdGVkIGZyb20gRnVqaXRzdSBpbml0IHZlcmJzKS4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfYWNlcl9pbml0X3ZlcmJzW10gPSB7Ci0JLyogT24gVHJhdmVsTWF0ZSBsYXB0b3BzLCBHUElPIDAgZW5hYmxlcyB0aGUgaW50ZXJuYWwgc3BlYWtlciBhbmQKLQkgKiB0aGUgaGVhZHBob25lIGphY2suICBUdXJuIHRoaXMgb24gYW5kIHJlbHkgb24gdGhlIHN0YW5kYXJkIG11dGUKLQkgKiBtZXRob2RzIHdoZW5ldmVyIHRoZSB1c2VyIHdhbnRzIHRvIHR1cm4gdGhlc2Ugb3V0cHV0cyBvZmYuCi0JICovCi0JezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwMX0sCi0JezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDAxfSwKLQl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAweDAxfSwKLQkvKiBJbnRlcm5hbCBzcGVha2VyL0hlYWRwaG9uZSBqYWNrIGlzIGNvbm5lY3RlZCB0byBMaW5lLW91dCBwaW4gKi8KLQl7MHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCS8qIEludGVybmFsIG1pY3JvcGhvbmUvTWljIGphY2sgaXMgY29ubmVjdGVkIHRvIE1pYzEgcGluICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCi0JLyogTGluZSBJbiBqYWNrIGlzIGNvbm5lY3RlZCB0byBMaW5lMSBwaW4gKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCS8qIFNvbWUgQWNlcnMgKGVnOiBDMjB4IFRhYmxldHMpIHVzZSBNb25vIHBpbiBmb3IgaW50ZXJuYWwgc3BlYWtlciAqLwotCXsweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JLyogRW5zdXJlIGFsbCBvdGhlciB1bnVzZWQgcGlucyBhcmUgZGlzYWJsZWQgYW5kIG11dGVkLiAqLwotCXsweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAotCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MTMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0JezB4MTMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCS8qIERpc2FibGUgZGlnaXRhbCAoU1BESUYpIHBpbnMgKi8KLQl7MHgwMywgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIDB9LAotCXsweDA2LCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwgMH0sCi0KLQkvKiBFbnN1cmUgTWljMSBhbmQgTGluZTEgcGluIHdpZGdldHMgdGFrZSBpbnB1dCBmcm9tIHRoZSBPVVQxIHN1bQotCSAqIGJ1cyB3aGVuIGFjdGluZyBhcyBvdXRwdXRzLgotCSAqLwotCXsweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQotCS8qIFN0YXJ0IHdpdGggb3V0cHV0IHN1bSB3aWRnZXRzIG11dGVkIGFuZCB0aGVpciBvdXRwdXQgZ2FpbnMgYXQgbWluICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0KLQkvKiBVbm11dGUgTGluZS1vdXQgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQKLQkgKiAobm8gZXF1aXYgbWl4ZXIgY3RybCkKLQkgKi8KLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIFVubXV0ZSBtb25vIHBpbiB3aWRnZXQgYW1wIG91dHB1dCAobm8gZXF1aXYgbWl4ZXIgY3RybCkgKi8KLQl7MHgxMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIFVubXV0ZSBNaWMxIGFuZCBMaW5lMSBwaW4gd2lkZ2V0IGlucHV0IGJ1ZmZlcnMgc2luY2UgdGhleSBzdGFydCBhcwotCSAqIGlucHV0cy4gSWYgdGhlIHBpbiBtb2RlIGlzIGNoYW5nZWQgYnkgdGhlIHVzZXIgdGhlIHBpbiBtb2RlIGNvbnRyb2wKLQkgKiB3aWxsIHRha2UgY2FyZSBvZiBlbmFibGluZyB0aGUgcGluJ3MgaW5wdXQvb3V0cHV0IGJ1ZmZlcnMgYXMgbmVlZGVkLgotCSAqIFRoZXJlZm9yZSB0aGVyZSdzIG5vIG5lZWQgdG8gZW5hYmxlIHRoZSBpbnB1dCBidWZmZXIgYXQgdGhpcwotCSAqIHN0YWdlLgotCSAqLwotCXsweDEyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKiBNdXRlIGNhcHR1cmUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQkvKiBTZXQgQURDIGNvbm5lY3Rpb24gc2VsZWN0IHRvIG1hdGNoIGRlZmF1bHQgbWl4ZXIgc2V0dGluZyAtIG1pYwotCSAqIChvbiBtaWMxIHBpbikKLQkgKi8KLQl7MHgwNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JLyogRG8gc2ltaWxhciB3aXRoIHRoZSBzZWNvbmQgQURDOiBtdXRlIGNhcHR1cmUgaW5wdXQgYW1wIGFuZAotCSAqIHNldCBBREMgY29ubmVjdGlvbiB0byBtaWMgdG8gbWF0Y2ggQUxTQSdzIGRlZmF1bHQgc3RhdGUuCi0JICovCi0JezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JLyogTXV0ZSBhbGwgaW5wdXRzIHRvIG1peGVyIHdpZGdldCAoZXZlbiB1bmNvbm5lY3RlZCBvbmVzKSAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sIC8qIG1pYzEgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwgLyogbWljMiBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LCAvKiBsaW5lMSBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LCAvKiBsaW5lMiBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LCAvKiBDRCBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNSl9LCAvKiBCZWVwLWdlbiBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNil9LCAvKiBMaW5lLW91dCBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNyl9LCAvKiBIUC1waW4gcGluICovCi0KLQl7IH0KLX07Ci0KLS8qIEluaXRpYWxpc2F0aW9uIHNlcXVlbmNlIGZvciBNYXhkYXRhIEZhdm9yaXQgMTAwWFMKLSAqIChhZGFwdGVkIGZyb20gQWNlciBpbml0IHZlcmJzKS4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfZmF2b3JpdDEwMF9pbml0X3ZlcmJzW10gPSB7Ci0JLyogR1BJTyAwIGVuYWJsZXMgdGhlIG91dHB1dCBqYWNrLgotCSAqIFR1cm4gdGhpcyBvbiBhbmQgcmVseSBvbiB0aGUgc3RhbmRhcmQgbXV0ZQotCSAqIG1ldGhvZHMgd2hlbmV2ZXIgdGhlIHVzZXIgd2FudHMgdG8gdHVybiB0aGVzZSBvdXRwdXRzIG9mZi4KLQkgKi8KLQl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19NQVNLLCAweDAxfSwKLQl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDF9LAotCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDF9LAotCS8qIExpbmUvTWljIGlucHV0IGphY2sgaXMgY29ubmVjdGVkIHRvIE1pYzEgcGluICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCi0JLyogRW5zdXJlIGFsbCBvdGhlciB1bnVzZWQgcGlucyBhcmUgZGlzYWJsZWQgYW5kIG11dGVkLiAqLwotCXsweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAotCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0JezB4MTEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQl7MHgxMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQkvKiBEaXNhYmxlIGRpZ2l0YWwgKFNQRElGKSBwaW5zICovCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCAwfSwKLQl7MHgwNiwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIDB9LAotCi0JLyogRW5zdXJlIE1pYzEgYW5kIExpbmUxIHBpbiB3aWRnZXRzIHRha2UgaW5wdXQgZnJvbSB0aGUgT1VUMSBzdW0KLQkgKiBidXMgd2hlbiBhY3RpbmcgYXMgb3V0cHV0cy4KLQkgKi8KLQl7MHgwYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0KLQkvKiBTdGFydCB3aXRoIG91dHB1dCBzdW0gd2lkZ2V0cyBtdXRlZCBhbmQgdGhlaXIgb3V0cHV0IGdhaW5zIGF0IG1pbiAqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogVW5tdXRlIExpbmUtb3V0IHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0Ci0JICogKG5vIGVxdWl2IG1peGVyIGN0cmwpCi0JICovCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQkvKiBVbm11dGUgTWljMSBhbmQgTGluZTEgcGluIHdpZGdldCBpbnB1dCBidWZmZXJzIHNpbmNlIHRoZXkgc3RhcnQgYXMKLQkgKiBpbnB1dHMuIElmIHRoZSBwaW4gbW9kZSBpcyBjaGFuZ2VkIGJ5IHRoZSB1c2VyIHRoZSBwaW4gbW9kZSBjb250cm9sCi0JICogd2lsbCB0YWtlIGNhcmUgb2YgZW5hYmxpbmcgdGhlIHBpbidzIGlucHV0L291dHB1dCBidWZmZXJzIGFzIG5lZWRlZC4KLQkgKiBUaGVyZWZvcmUgdGhlcmUncyBubyBuZWVkIHRvIGVuYWJsZSB0aGUgaW5wdXQgYnVmZmVyIGF0IHRoaXMKLQkgKiBzdGFnZS4KLQkgKi8KLQl7MHgxMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKiBNdXRlIGNhcHR1cmUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQkvKiBTZXQgQURDIGNvbm5lY3Rpb24gc2VsZWN0IHRvIG1hdGNoIGRlZmF1bHQgbWl4ZXIgc2V0dGluZyAtIG1pYwotCSAqIChvbiBtaWMxIHBpbikKLQkgKi8KLQl7MHgwNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JLyogRG8gc2ltaWxhciB3aXRoIHRoZSBzZWNvbmQgQURDOiBtdXRlIGNhcHR1cmUgaW5wdXQgYW1wIGFuZAotCSAqIHNldCBBREMgY29ubmVjdGlvbiB0byBtaWMgdG8gbWF0Y2ggQUxTQSdzIGRlZmF1bHQgc3RhdGUuCi0JICovCi0JezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JLyogTXV0ZSBhbGwgaW5wdXRzIHRvIG1peGVyIHdpZGdldCAoZXZlbiB1bmNvbm5lY3RlZCBvbmVzKSAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sIC8qIG1pYzEgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwgLyogbWljMiBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LCAvKiBsaW5lMSBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LCAvKiBsaW5lMiBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LCAvKiBDRCBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNSl9LCAvKiBCZWVwLWdlbiBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNil9LCAvKiBMaW5lLW91dCBwaW4gKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNyl9LCAvKiBIUC1waW4gcGluICovCi0KLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYwX3dpbGxfdmVyYnNbXSA9IHsKLQl7MHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDB4MDJ9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDA3fSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDMwNDB9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9yZXBsYWNlcl82NzJ2X3ZlcmJzW10gPSB7Ci0JezB4MGYsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAweDAyfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwN30sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHgzMDUwfSwKLQotCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MDF9LAotCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgMHgwMX0sCi0JezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMH0sCi0KLQl7MHgwZiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0Je30KLX07Ci0KLS8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzI2MF9yZXBsYWNlcl82NzJ2X2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotICAgICAgICB1bnNpZ25lZCBpbnQgcHJlc2VudDsKLQotCS8qIHNwZWFrZXIgLS0+IEdQSU8gRGF0YSAwLCBocCBvciBzcGRpZiAtLT4gR1BJTyBkYXRhIDEgKi8KLQlwcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgwZik7Ci0JaWYgKHByZXNlbnQpIHsKLQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgMHgwMSwgMCwKLQkJCQkJICBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDEpOwotCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCAweDBmLCAwLAotCQkJCQkgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKLQkJCQkJICBQSU5fSFApOwotCX0gZWxzZSB7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIDB4MDEsIDAsCi0JCQkJCSAgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAwKTsKLQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgMHgwZiwgMCwKLQkJCQkJICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCi0JCQkJCSAgUElOX09VVCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjBfcmVwbGFjZXJfNjcydl91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByZXMpCi17Ci0gICAgICAgIGlmICgocmVzID4+IDI2KSA9PSBBTEM4ODBfSFBfRVZFTlQpCi0gICAgICAgICAgICAgICAgYWxjMjYwX3JlcGxhY2VyXzY3MnZfYXV0b211dGUoY29kZWMpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9ocF9kYzc2MDBfdmVyYnNbXSA9IHsKLQl7MHgwNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxMCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0JezB4MTEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQl7fQotfTsKLQotLyogVGVzdCBjb25maWd1cmF0aW9uIGZvciBkZWJ1Z2dpbmcsIG1vZGVsbGVkIGFmdGVyIHRoZSBBTEM4ODAgdGVzdAotICogY29uZmlndXJhdGlvbi4KLSAqLwotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjYwX3Rlc3RfZGFjX25pZHNbMV0gPSB7Ci0JMHgwMiwKLX07Ci1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2MF90ZXN0X2FkY19uaWRzWzJdID0gewotCTB4MDQsIDB4MDUsCi19OwotLyogRm9yIHRlc3RpbmcgdGhlIEFMQzI2MCwgZWFjaCBpbnB1dCBNVVggbmVlZHMgaXRzIG93biBkZWZpbml0aW9uIHNpbmNlCi0gKiB0aGUgc2lnbmFsIGFzc2lnbm1lbnRzIGFyZSBkaWZmZXJlbnQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgZmlyc3QgQURDCi0gKiBpcyBOSUQgMHgwNC4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2MF90ZXN0X2NhcHR1cmVfc291cmNlc1syXSA9IHsKLQl7Ci0JCS5udW1faXRlbXMgPSA3LAotCQkuaXRlbXMgPSB7Ci0JCQl7ICJNSUMxIHBpbiIsIDB4MCB9LAotCQkJeyAiTUlDMiBwaW4iLCAweDEgfSwKLQkJCXsgIkxJTkUxIHBpbiIsIDB4MiB9LAotCQkJeyAiTElORTIgcGluIiwgMHgzIH0sCi0JCQl7ICJDRCBwaW4iLCAweDQgfSwKLQkJCXsgIkxJTkUtT1VUIHBpbiIsIDB4NSB9LAotCQkJeyAiSFAtT1VUIHBpbiIsIDB4NiB9LAotCQl9LAotICAgICAgICB9LAotCXsKLQkJLm51bV9pdGVtcyA9IDgsCi0JCS5pdGVtcyA9IHsKLQkJCXsgIk1JQzEgcGluIiwgMHgwIH0sCi0JCQl7ICJNSUMyIHBpbiIsIDB4MSB9LAotCQkJeyAiTElORTEgcGluIiwgMHgyIH0sCi0JCQl7ICJMSU5FMiBwaW4iLCAweDMgfSwKLQkJCXsgIkNEIHBpbiIsIDB4NCB9LAotCQkJeyAiTWl4ZXIiLCAweDUgfSwKLQkJCXsgIkxJTkUtT1VUIHBpbiIsIDB4NiB9LAotCQkJeyAiSFAtT1VUIHBpbiIsIDB4NyB9LAotCQl9LAotICAgICAgICB9LAotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfdGVzdF9taXhlcltdID0gewotCS8qIE91dHB1dCBkcml2ZXIgd2lkZ2V0cyAqLwotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTW9ubyBQbGF5YmFjayBWb2x1bWUiLCAweDBhLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAweDBhLCAxLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxPVVQyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDksIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiTE9VVDIgUGxheWJhY2sgU3dpdGNoIiwgMHgwOSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMT1VUMSBQbGF5YmFjayBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkxPVVQxIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDIsIEhEQV9JTlBVVCksCi0KLQkvKiBNb2RlcyBmb3IgcmV0YXNraW5nIHBpbiB3aWRnZXRzCi0JICogTm90ZTogdGhlIEFMQzI2MCBkb2Vzbid0IHNlZW0gdG8gYWN0IG9uIHJlcXVlc3RzIHRvIGVuYWJsZSBtaWMKLSAgICAgICAgICogYmlhcyBmcm9tIE5JRHMgMHgwZiBhbmQgMHgxMC4gIFRoZSBBTEMyNjAgZGF0YXNoZWV0IGRvZXNuJ3QKLSAgICAgICAgICogbWVudGlvbiB0aGlzIHJlc3RyaWN0aW9uLiAgQXQgdGhpcyBzdGFnZSBpdCdzIG5vdCBjbGVhciB3aGV0aGVyCi0gICAgICAgICAqIHRoaXMgYmVoYXZpb3VyIGlzIGludGVudGlvbmFsIG9yIGlzIGEgaGFyZHdhcmUgYnVnIGluIGNoaXAKLSAgICAgICAgICogcmV2aXNpb25zIGF2YWlsYWJsZSBhdCBsZWFzdCB1cCB1bnRpbCBlYXJseSAyMDA2LiAgVGhlcmVmb3JlIGZvcgotICAgICAgICAgKiBub3cgYWxsb3cgdGhlICJIUC1PVVQiIGFuZCAiTElORS1PVVQiIE1vZGUgY29udHJvbHMgdG8gc3BhbiBhbGwKLSAgICAgICAgICogY2hvaWNlcywgYnV0IGlmIGl0IHR1cm5zIG91dCB0aGF0IHRoZSBsYWNrIG9mIG1pYyBiaWFzIGZvciB0aGVzZQotICAgICAgICAgKiBOSURzIGlzIGludGVudGlvbmFsIHdlIGNvdWxkIGNoYW5nZSB0aGVpciBtb2RlcyBmcm9tCi0gICAgICAgICAqIEFMQ19QSU5fRElSX0lOT1VUIHRvIEFMQ19QSU5fRElSX0lOT1VUX05PTUlDQklBUy4KLQkgKi8KLQlBTENfUElOX01PREUoIkhQLU9VVCBwaW4gbW9kZSIsIDB4MTAsIEFMQ19QSU5fRElSX0lOT1VUKSwKLQlBTENfUElOX01PREUoIkxJTkUtT1VUIHBpbiBtb2RlIiwgMHgwZiwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCUFMQ19QSU5fTU9ERSgiTElORTIgcGluIG1vZGUiLCAweDE1LCBBTENfUElOX0RJUl9JTk9VVCksCi0JQUxDX1BJTl9NT0RFKCJMSU5FMSBwaW4gbW9kZSIsIDB4MTQsIEFMQ19QSU5fRElSX0lOT1VUKSwKLQlBTENfUElOX01PREUoIk1JQzIgcGluIG1vZGUiLCAweDEzLCBBTENfUElOX0RJUl9JTk9VVCksCi0JQUxDX1BJTl9NT0RFKCJNSUMxIHBpbiBtb2RlIiwgMHgxMiwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCi0JLyogTG9vcGJhY2sgbWl4ZXIgY29udHJvbHMgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJNSUMxIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1JQzEgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNSUMyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1JQzIgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMSU5FMSBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMSU5FMSBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxJTkUyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDMsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxJTkUyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDMsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMSU5FLU9VVCBsb29wYmFjayBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDA2LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMSU5FLU9VVCBsb29wYmFjayBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDA2LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhQLU9VVCBsb29wYmFjayBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDcsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhQLU9VVCBsb29wYmFjayBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDcsIEhEQV9JTlBVVCksCi0KLQkvKiBDb250cm9scyBmb3IgR1BJTyBwaW5zLCBhc3N1bWluZyB0aGV5IGFyZSBjb25maWd1cmVkIGFzIG91dHB1dHMgKi8KLQlBTENfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMCIsIDB4MDEsIDB4MDEpLAotCUFMQ19HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAxIiwgMHgwMSwgMHgwMiksCi0JQUxDX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDIiLCAweDAxLCAweDA0KSwKLQlBTENfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMyIsIDB4MDEsIDB4MDgpLAotCi0JLyogU3dpdGNoZXMgdG8gYWxsb3cgdGhlIGRpZ2l0YWwgSU8gcGlucyB0byBiZSBlbmFibGVkLiAgVGhlIGRhdGFzaGVldAotCSAqIGlzIGFtYmlnaW91cyBhcyB0byB3aGljaCBOSUQgaXMgd2hpY2g7IHRlc3Rpbmcgb24gbGFwdG9wcyB3aGljaAotCSAqIG1ha2UgdGhpcyBvdXRwdXQgYXZhaWxhYmxlIHNob3VsZCBwcm92aWRlIGNsYXJpZmljYXRpb24uCi0JICovCi0JQUxDX1NQRElGX0NUUkxfU1dJVENIKCJTUERJRiBQbGF5YmFjayBTd2l0Y2giLCAweDAzLCAweDAxKSwKLQlBTENfU1BESUZfQ1RSTF9TV0lUQ0goIlNQRElGIENhcHR1cmUgU3dpdGNoIiwgMHgwNiwgMHgwMSksCi0KLQkvKiBBIHN3aXRjaCBhbGxvd2luZyBFQVBEIHRvIGJlIGVuYWJsZWQuICBTb21lIGxhcHRvcHMgc2VlbSB0byB1c2UKLQkgKiB0aGlzIG91dHB1dCB0byB0dXJuIG9uIGFuIGV4dGVybmFsIGFtcGxpZmllci4KLQkgKi8KLQlBTENfRUFQRF9DVFJMX1NXSVRDSCgiTElORS1PVVQgRUFQRCBFbmFibGUgU3dpdGNoIiwgMHgwZiwgMHgwMiksCi0JQUxDX0VBUERfQ1RSTF9TV0lUQ0goIkhQLU9VVCBFQVBEIEVuYWJsZSBTd2l0Y2giLCAweDEwLCAweDAyKSwKLQotCXsgfSAvKiBlbmQgKi8KLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF90ZXN0X2luaXRfdmVyYnNbXSA9IHsKLQkvKiBFbmFibGUgYWxsIEdQSU9zIGFzIG91dHB1dHMgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIDAgKi8KLQl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MGZ9LAotCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDB9LAotCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MGZ9LAotCi0JLyogRW5hYmxlIHJldGFza2luZyBwaW5zIGFzIG91dHB1dCwgaW5pdGlhbGx5IHdpdGhvdXQgcG93ZXIgYW1wICovCi0JezB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0KLQkvKiBEaXNhYmxlIGRpZ2l0YWwgKFNQRElGKSBwaW5zIGluaXRpYWxseSwgYnV0IHVzZXJzIGNhbiBlbmFibGUKLQkgKiB0aGVtIHZpYSBhIG1peGVyIHN3aXRjaC4gIEluIHRoZSBjYXNlIG9mIFNQRElGLW91dCwgdGhpcyBpbml0dmVyYgotCSAqIHBheWxvYWQgYWxzbyBzZXRzIHRoZSBnZW5lcmF0aW9uIHRvIDAsIG91dHB1dCB0byBiZSBpbiAiY29uc3VtZXIiCi0JICogUENNIGZvcm1hdCwgY29weXJpZ2h0IGFzc2VydGVkLCBubyBwcmUtZW1waGFzaXMgYW5kIG5vIHZhbGlkaXR5Ci0JICogY29udHJvbC4KLQkgKi8KLQl7MHgwMywgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIDB9LAotCXsweDA2LCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwgMH0sCi0KLQkvKiBFbnN1cmUgbWljMSwgbWljMiwgbGluZTEgYW5kIGxpbmUyIHBpbiB3aWRnZXRzIHRha2UgaW5wdXQgZnJvbSB0aGUKLQkgKiBPVVQxIHN1bSBidXMgd2hlbiBhY3RpbmcgYXMgYW4gb3V0cHV0LgotCSAqLwotCXsweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0KLQkvKiBTdGFydCB3aXRoIG91dHB1dCBzdW0gd2lkZ2V0cyBtdXRlZCBhbmQgdGhlaXIgb3V0cHV0IGdhaW5zIGF0IG1pbiAqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogVW5tdXRlIHJldGFza2luZyBwaW4gd2lkZ2V0IG91dHB1dCBidWZmZXJzIHNpbmNlIHRoZSBkZWZhdWx0Ci0JICogc3RhdGUgYXBwZWFycyB0byBiZSBvdXRwdXQuICBBcyB0aGUgcGluIG1vZGUgaXMgY2hhbmdlZCBieSB0aGUKLQkgKiB1c2VyIHRoZSBwaW4gbW9kZSBjb250cm9sIHdpbGwgdGFrZSBjYXJlIG9mIGVuYWJsaW5nIHRoZSBwaW4ncwotCSAqIGlucHV0L291dHB1dCBidWZmZXJzIGFzIG5lZWRlZC4KLQkgKi8KLQl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDEzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQkvKiBBbHNvIHVubXV0ZSB0aGUgbW9uby1vdXQgcGluIHdpZGdldCAqLwotCXsweDExLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBNdXRlIGNhcHR1cmUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQkvKiBTZXQgQURDIGNvbm5lY3Rpb24gc2VsZWN0IHRvIG1hdGNoIGRlZmF1bHQgbWl4ZXIgc2V0dGluZyAobWljMQotCSAqIHBpbikKLQkgKi8KLQl7MHgwNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JLyogRG8gdGhlIHNhbWUgZm9yIHRoZSBzZWNvbmQgQURDOiBtdXRlIGNhcHR1cmUgaW5wdXQgYW1wIGFuZAotCSAqIHNldCBBREMgY29ubmVjdGlvbiB0byBtaWMxIHBpbgotCSAqLwotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCS8qIE11dGUgYWxsIGlucHV0cyB0byBtaXhlciB3aWRnZXQgKGV2ZW4gdW5jb25uZWN0ZWQgb25lcykgKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LCAvKiBtaWMxIHBpbiAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sIC8qIG1pYzIgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwgLyogbGluZTEgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwgLyogbGluZTIgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwgLyogQ0QgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwgLyogQmVlcC1nZW4gcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDYpfSwgLyogTGluZS1vdXQgcGluICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDcpfSwgLyogSFAtcGluIHBpbiAqLwotCi0JeyB9Ci19OwotI2VuZGlmCi0KLSNkZWZpbmUgYWxjMjYwX3BjbV9hbmFsb2dfcGxheWJhY2sJYWxjODgwX3BjbV9hbmFsb2dfYWx0X3BsYXliYWNrCi0jZGVmaW5lIGFsYzI2MF9wY21fYW5hbG9nX2NhcHR1cmUJYWxjODgwX3BjbV9hbmFsb2dfY2FwdHVyZQotCi0jZGVmaW5lIGFsYzI2MF9wY21fZGlnaXRhbF9wbGF5YmFjawlhbGM4ODBfcGNtX2RpZ2l0YWxfcGxheWJhY2sKLSNkZWZpbmUgYWxjMjYwX3BjbV9kaWdpdGFsX2NhcHR1cmUJYWxjODgwX3BjbV9kaWdpdGFsX2NhcHR1cmUKLQotLyoKLSAqIGZvciBCSU9TIGF1dG8tY29uZmlndXJhdGlvbgotICovCi0KLXN0YXRpYyBpbnQgYWxjMjYwX2FkZF9wbGF5YmFja19jb250cm9scyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkJCWNvbnN0IGNoYXIgKnBmeCwgaW50ICp2b2xfYml0cykKLXsKLQloZGFfbmlkX3QgbmlkX3ZvbDsKLQl1bnNpZ25lZCBsb25nIHZvbF92YWwsIHN3X3ZhbDsKLQlpbnQgZXJyOwotCi0JaWYgKG5pZCA+PSAweDBmICYmIG5pZCA8IDB4MTEpIHsKLQkJbmlkX3ZvbCA9IG5pZCAtIDB4NzsKLQkJdm9sX3ZhbCA9IEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwgSERBX09VVFBVVCk7Ci0JCXN3X3ZhbCA9IEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAwLCBIREFfT1VUUFVUKTsKLQl9IGVsc2UgaWYgKG5pZCA9PSAweDExKSB7Ci0JCW5pZF92b2wgPSBuaWQgLSAweDc7Ci0JCXZvbF92YWwgPSBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDIsIDAsIEhEQV9PVVRQVVQpOwotCQlzd192YWwgPSBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMiwgMCwgSERBX09VVFBVVCk7Ci0JfSBlbHNlIGlmIChuaWQgPj0gMHgxMiAmJiBuaWQgPD0gMHgxNSkgewotCQluaWRfdm9sID0gMHgwODsKLQkJdm9sX3ZhbCA9IEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwgSERBX09VVFBVVCk7Ci0JCXN3X3ZhbCA9IEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAwLCBIREFfT1VUUFVUKTsKLQl9IGVsc2UKLQkJcmV0dXJuIDA7IC8qIE4vQSAqLwotCi0JaWYgKCEoKnZvbF9iaXRzICYgKDEgPDwgbmlkX3ZvbCkpKSB7Ci0JCS8qIGZpcnN0IGNvbnRyb2wgZm9yIHRoZSB2b2x1bWUgd2lkZ2V0ICovCi0JCWVyciA9IGFkZF9wYl92b2xfY3RybChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIHBmeCwgdm9sX3ZhbCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJKnZvbF9iaXRzIHw9ICgxIDw8IG5pZF92b2wpOwotCX0KLQllcnIgPSBhZGRfcGJfc3dfY3RybChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBwZngsIHN3X3ZhbCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmcm9tIHRoZSBwYXJzZWQgREFDIHRhYmxlICovCi1zdGF0aWMgaW50IGFsYzI2MF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCi0JCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCWhkYV9uaWRfdCBuaWQ7Ci0JaW50IGVycjsKLQlpbnQgdm9scyA9IDA7Ci0KLQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDE7Ci0Jc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5wcml2YXRlX2RhY19uaWRzOwotCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbMF0gPSAweDAyOwotCi0JbmlkID0gY2ZnLT5saW5lX291dF9waW5zWzBdOwotCWlmIChuaWQpIHsKLQkJY29uc3QgY2hhciAqcGZ4OwotCQlpZiAoIWNmZy0+c3BlYWtlcl9waW5zWzBdICYmICFjZmctPmhwX3BpbnNbMF0pCi0JCQlwZnggPSAiTWFzdGVyIjsKLQkJZWxzZSBpZiAoY2ZnLT5saW5lX291dF90eXBlID09IEFVVE9fUElOX1NQRUFLRVJfT1VUKQotCQkJcGZ4ID0gIlNwZWFrZXIiOwotCQllbHNlCi0JCQlwZnggPSAiRnJvbnQiOwotCQllcnIgPSBhbGMyNjBfYWRkX3BsYXliYWNrX2NvbnRyb2xzKHNwZWMsIG5pZCwgcGZ4LCAmdm9scyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQluaWQgPSBjZmctPnNwZWFrZXJfcGluc1swXTsKLQlpZiAobmlkKSB7Ci0JCWVyciA9IGFsYzI2MF9hZGRfcGxheWJhY2tfY29udHJvbHMoc3BlYywgbmlkLCAiU3BlYWtlciIsICZ2b2xzKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCW5pZCA9IGNmZy0+aHBfcGluc1swXTsKLQlpZiAobmlkKSB7Ci0JCWVyciA9IGFsYzI2MF9hZGRfcGxheWJhY2tfY29udHJvbHMoc3BlYywgbmlkLCAiSGVhZHBob25lIiwKLQkJCQkJCSAgICZ2b2xzKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogY3JlYXRlIHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIGlucHV0IHBpbnMgKi8KLXN0YXRpYyBpbnQgYWxjMjYwX2F1dG9fY3JlYXRlX2lucHV0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCQljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCi17Ci0JcmV0dXJuIGFsY19hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKGNvZGVjLCBjZmcsIDB4MDcsIDB4MDQsIDB4MDUpOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjBfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCSAgICAgIGhkYV9uaWRfdCBuaWQsIGludCBwaW5fdHlwZSwKLQkJCQkJICAgICAgaW50IHNlbF9pZHgpCi17Ci0JYWxjX3NldF9waW5fb3V0cHV0KGNvZGVjLCBuaWQsIHBpbl90eXBlKTsKLQkvKiBuZWVkIHRoZSBtYW51YWwgY29ubmVjdGlvbj8gKi8KLQlpZiAobmlkID49IDB4MTIpIHsKLQkJaW50IGlkeCA9IG5pZCAtIDB4MTI7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGlkeCArIDB4MGIsIDAsCi0JCQkJICAgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBzZWxfaWR4KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2MF9hdXRvX2luaXRfbXVsdGlfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBuaWQ7Ci0KLQluaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF07Ci0JaWYgKG5pZCkgewotCQlpbnQgcGluX3R5cGUgPSBnZXRfcGluX3R5cGUoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlKTsKLQkJYWxjMjYwX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBuaWQsIHBpbl90eXBlLCAwKTsKLQl9Ci0KLQluaWQgPSBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXTsKLQlpZiAobmlkKQotCQlhbGMyNjBfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgUElOX09VVCwgMCk7Ci0KLQluaWQgPSBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF07Ci0JaWYgKG5pZCkKLQkJYWxjMjYwX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBuaWQsIFBJTl9IUCwgMCk7Ci19Ci0KLSNkZWZpbmUgQUxDMjYwX1BJTl9DRF9OSUQJCTB4MTYKLXN0YXRpYyB2b2lkIGFsYzI2MF9hdXRvX2luaXRfYW5hbG9nX2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX2lucHV0czsgaSsrKSB7Ci0JCWhkYV9uaWRfdCBuaWQgPSBjZmctPmlucHV0c1tpXS5waW47Ci0JCWlmIChuaWQgPj0gMHgxMikgewotCQkJYWxjX3NldF9pbnB1dF9waW4oY29kZWMsIG5pZCwgY2ZnLT5pbnB1dHNbaV0udHlwZSk7Ci0JCQlpZiAobmlkICE9IEFMQzI2MF9QSU5fQ0RfTklEICYmCi0JCQkgICAgKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmIEFDX1dDQVBfT1VUX0FNUCkpCi0JCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAotCQkJCQkJICAgIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCi0JCQkJCQkgICAgQU1QX09VVF9NVVRFKTsKLQkJfQotCX0KLX0KLQotI2RlZmluZSBhbGMyNjBfYXV0b19pbml0X2lucHV0X3NyYwlhbGM4ODBfYXV0b19pbml0X2lucHV0X3NyYwotCi0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF92b2x1bWVfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAtMSBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDA0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDA1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCi0JICogbWl4ZXIgd2lkZ2V0Ci0JICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IKLQkgKiBmcm9udCBwYW5lbCBtaWMgKG1pYyAyKQotCSAqLwotCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KLQkvKiBtdXRlIGFuYWxvZyBpbnB1dHMgKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDA4IC0gMHgwYSkKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KLQkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQl7IH0KLX07Ci0KLXN0YXRpYyBpbnQgYWxjMjYwX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBlcnI7Ci0Jc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjBfaWdub3JlW10gPSB7IDB4MTcsIDAgfTsKLQotCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAotCQkJCQkgICBhbGMyNjBfaWdub3JlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGMyNjBfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWlmICghc3BlYy0+a2N0bHMubGlzdCkKLQkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgQklPUyBwaW4gY29uZmlnICovCi0JZXJyID0gYWxjMjYwX2F1dG9fY3JlYXRlX2lucHV0X2N0bHMoY29kZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IDI7Ci0KLQlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0cykKLQkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBBTEMyNjBfRElHT1VUX05JRDsKLQlpZiAoc3BlYy0+a2N0bHMubGlzdCkKLQkJYWRkX21peGVyKHNwZWMsIHNwZWMtPmtjdGxzLmxpc3QpOwotCi0JYWRkX3ZlcmIoc3BlYywgYWxjMjYwX3ZvbHVtZV9pbml0X3ZlcmJzKTsKLQotCXNwZWMtPm51bV9tdXhfZGVmcyA9IDE7Ci0Jc3BlYy0+aW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFswXTsKLQotCWFsY19zc2lkX2NoZWNrKGNvZGVjLCAweDEwLCAweDE1LCAweDBmLCAwKTsKLQotCXJldHVybiAxOwotfQotCi0vKiBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGZvciBhdXRvLWNvbmZpZ3VyYXRpb24gbW9kZWwgKi8KLXN0YXRpYyB2b2lkIGFsYzI2MF9hdXRvX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JYWxjMjYwX2F1dG9faW5pdF9tdWx0aV9vdXQoY29kZWMpOwotCWFsYzI2MF9hdXRvX2luaXRfYW5hbG9nX2lucHV0KGNvZGVjKTsKLQlhbGMyNjBfYXV0b19pbml0X2lucHV0X3NyYyhjb2RlYyk7Ci0JYWxjX2F1dG9faW5pdF9kaWdpdGFsKGNvZGVjKTsKLQlpZiAoc3BlYy0+dW5zb2xfZXZlbnQpCi0JCWFsY19pbml0aG9vayhjb2RlYyk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9hbXBfbGlzdCBhbGMyNjBfbG9vcGJhY2tzW10gPSB7Ci0JeyAweDA3LCBIREFfSU5QVVQsIDAgfSwKLQl7IDB4MDcsIEhEQV9JTlBVVCwgMSB9LAotCXsgMHgwNywgSERBX0lOUFVULCAyIH0sCi0JeyAweDA3LCBIREFfSU5QVVQsIDMgfSwKLQl7IDB4MDcsIEhEQV9JTlBVVCwgNCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0jZW5kaWYKLQotLyoKLSAqIFBpbiBjb25maWcgZml4ZXMKLSAqLwotZW51bSB7Ci0JUElORklYX0hQX0RDNTc1MCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzI2MF9maXh1cHNbXSA9IHsKLQlbUElORklYX0hQX0RDNTc1MF0gPSB7Ci0JCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCi0JCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgewotCQkJeyAweDExLCAweDkwMTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KLQkJCXsgfQotCQl9Ci0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjBfZml4dXBfdGJsW10gPSB7Ci0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwYSwgIkhQIGRjNTc1MCIsIFBJTkZJWF9IUF9EQzU3NTApLAotCXt9Ci19OwotCi0vKgotICogQUxDMjYwIGNvbmZpZ3VyYXRpb25zCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjMjYwX21vZGVsc1tBTEMyNjBfTU9ERUxfTEFTVF0gPSB7Ci0JW0FMQzI2MF9CQVNJQ10JCT0gImJhc2ljIiwKLQlbQUxDMjYwX0hQXQkJPSAiaHAiLAotCVtBTEMyNjBfSFBfMzAxM10JPSAiaHAtMzAxMyIsCi0JW0FMQzI2MF9IUF9EQzc2MDBdCT0gImhwLWRjNzYwMCIsCi0JW0FMQzI2MF9GVUpJVFNVX1M3MDJYXQk9ICJmdWppdHN1IiwKLQlbQUxDMjYwX0FDRVJdCQk9ICJhY2VyIiwKLQlbQUxDMjYwX1dJTExdCQk9ICJ3aWxsIiwKLQlbQUxDMjYwX1JFUExBQ0VSXzY3MlZdCT0gInJlcGxhY2VyIiwKLQlbQUxDMjYwX0ZBVk9SSVQxMDBdCT0gImZhdm9yaXQxMDAiLAotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLQlbQUxDMjYwX1RFU1RdCQk9ICJ0ZXN0IiwKLSNlbmRpZgotCVtBTEMyNjBfQVVUT10JCT0gImF1dG8iLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2MF9jZmdfdGJsW10gPSB7Ci0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA3YiwgIkFjZXIgQzIweCIsIEFMQzI2MF9BQ0VSKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMDdmLCAiQWNlciIsIEFMQzI2MF9XSUxMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMDhmLCAiQWNlciIsIEFMQzI2MF9BQ0VSKSwKLQlTTkRfUENJX1FVSVJLKDB4MTUwOSwgMHg0NTQwLCAiRmF2b3JpdCAxMDBYUyIsIEFMQzI2MF9GQVZPUklUMTAwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA4LCAiSFAgZDU3MDAiLCBBTEMyNjBfSFBfMzAxMyksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwYSwgIkhQIGQ1NzUwIiwgQUxDMjYwX0FVVE8pLCAvKiBubyBxdWlyayAqLwotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTAsICJIUCIsIEFMQzI2MF9IUF8zMDEzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDExLCAiSFAiLCBBTEMyNjBfSFBfMzAxMyksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMiwgIkhQIiwgQUxDMjYwX0hQX0RDNzYwMCksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMywgIkhQIiwgQUxDMjYwX0hQXzMwMTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTQsICJIUCIsIEFMQzI2MF9IUCksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNSwgIkhQIiwgQUxDMjYwX0hQKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDE2LCAiSFAiLCBBTEMyNjBfSFApLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxYmIsICJTb255IFZBSU8iLCBBTEMyNjBfQkFTSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxY2MsICJTb255IFZBSU8iLCBBTEMyNjBfQkFTSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxY2QsICJTb255IFZBSU8iLCBBTEMyNjBfQkFTSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMGNmLCAweDEzMjYsICJGdWppdHN1IFM3MDJYIiwgQUxDMjYwX0ZVSklUU1VfUzcwMlgpLAotCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA3MjksICJDVEwgVTU1M1ciLCBBTEMyNjBfQkFTSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxNjFmLCAweDIwNTcsICJSZXBsYWNlciA2NzJWIiwgQUxDMjYwX1JFUExBQ0VSXzY3MlYpLAotCVNORF9QQ0lfUVVJUksoMHgxNjMxLCAweGMwMTcsICJQQiBWNzkwMCIsIEFMQzI2MF9XSUxMKSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfY29uZmlnX3ByZXNldCBhbGMyNjBfcHJlc2V0c1tdID0gewotCVtBTEMyNjBfQkFTSUNdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjBfYmFzZV9vdXRwdXRfbWl4ZXIsCi0JCQkgICAgYWxjMjYwX2lucHV0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2MF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2MF9kYWNfbmlkcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2R1YWxfYWRjX25pZHMpLAotCQkuYWRjX25pZHMgPSBhbGMyNjBfZHVhbF9hZGNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2MF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjBfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjYwX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzI2MF9IUF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2MF9ocF9vdXRwdXRfbWl4ZXIsCi0JCQkgICAgYWxjMjYwX2lucHV0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfaW5pdF92ZXJicywKLQkJCQlhbGMyNjBfaHBfdW5zb2xfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjBfYWRjX25pZHNfYWx0LAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2MF9ocF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjBfSFBfREM3NjAwXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYwX2hwX2RjNzYwMF9taXhlciwKLQkJCSAgICBhbGMyNjBfaW5wdXRfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2MF9pbml0X3ZlcmJzLAotCQkJCWFsYzI2MF9ocF9kYzc2MDBfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjBfYWRjX25pZHNfYWx0LAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2MF9ocF8zMDEyX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2MF9IUF8zMDEzXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYwX2hwXzMwMTNfbWl4ZXIsCi0JCQkgICAgYWxjMjYwX2lucHV0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfaHBfMzAxM19pbml0X3ZlcmJzLAotCQkJCWFsYzI2MF9ocF8zMDEzX3Vuc29sX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjYwX2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjBfYWRjX25pZHNfYWx0KSwKLQkJLmFkY19uaWRzID0gYWxjMjYwX2FkY19uaWRzX2FsdCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2MF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjBfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjYwX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjBfaHBfMzAxM19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjBfRlVKSVRTVV9TNzAyWF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2MF9mdWppdHN1X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfZnVqaXRzdV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjYwX2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjBfZHVhbF9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzI2MF9kdWFsX2FkY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKLQkJLm51bV9tdXhfZGVmcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2Z1aml0c3VfY2FwdHVyZV9zb3VyY2VzKSwKLQkJLmlucHV0X211eCA9IGFsYzI2MF9mdWppdHN1X2NhcHR1cmVfc291cmNlcywKLQl9LAotCVtBTEMyNjBfQUNFUl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2MF9hY2VyX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfYWNlcl9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjYwX2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjBfZHVhbF9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzI2MF9kdWFsX2FkY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKLQkJLm51bV9tdXhfZGVmcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2FjZXJfY2FwdHVyZV9zb3VyY2VzKSwKLQkJLmlucHV0X211eCA9IGFsYzI2MF9hY2VyX2NhcHR1cmVfc291cmNlcywKLQl9LAotCVtBTEMyNjBfRkFWT1JJVDEwMF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2MF9mYXZvcml0MTAwX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfZmF2b3JpdDEwMF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjYwX2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjBfZHVhbF9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzI2MF9kdWFsX2FkY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKLQkJLm51bV9tdXhfZGVmcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2Zhdm9yaXQxMDBfY2FwdHVyZV9zb3VyY2VzKSwKLQkJLmlucHV0X211eCA9IGFsYzI2MF9mYXZvcml0MTAwX2NhcHR1cmVfc291cmNlcywKLQl9LAotCVtBTEMyNjBfV0lMTF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2MF93aWxsX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfaW5pdF92ZXJicywgYWxjMjYwX3dpbGxfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzI2MF9hZGNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDMjYwX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjBfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYwX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2MF9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEMyNjBfUkVQTEFDRVJfNjcyVl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2MF9yZXBsYWNlcl82NzJ2X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfaW5pdF92ZXJicywgYWxjMjYwX3JlcGxhY2VyXzY3MnZfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzI2MF9hZGNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDMjYwX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjBfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYwX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2MF9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjMjYwX3JlcGxhY2VyXzY3MnZfdW5zb2xfZXZlbnQsCi0JCS5pbml0X2hvb2sgPSBhbGMyNjBfcmVwbGFjZXJfNjcydl9hdXRvbXV0ZSwKLQl9LAotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLQlbQUxDMjYwX1RFU1RdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjBfdGVzdF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYwX3Rlc3RfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2MF90ZXN0X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjYwX3Rlc3RfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF90ZXN0X2FkY19uaWRzKSwKLQkJLmFkY19uaWRzID0gYWxjMjYwX3Rlc3RfYWRjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjBfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYwX21vZGVzLAotCQkubnVtX211eF9kZWZzID0gQVJSQVlfU0laRShhbGMyNjBfdGVzdF9jYXB0dXJlX3NvdXJjZXMpLAotCQkuaW5wdXRfbXV4ID0gYWxjMjYwX3Rlc3RfY2FwdHVyZV9zb3VyY2VzLAotCX0sCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBpbnQgcGF0Y2hfYWxjMjYwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKLQlpbnQgZXJyLCBib2FyZF9jb25maWc7Ci0KLQlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoc3BlYyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNvZGVjLT5zcGVjID0gc3BlYzsKLQotCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBTEMyNjBfTU9ERUxfTEFTVCwKLQkJCQkJCSAgYWxjMjYwX21vZGVscywKLQkJCQkJCSAgYWxjMjYwX2NmZ190YmwpOwotCWlmIChib2FyZF9jb25maWcgPCAwKSB7Ci0JCXNuZF9wcmludGQoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JCQkgICBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJYm9hcmRfY29uZmlnID0gQUxDMjYwX0FVVE87Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEMyNjBfQVVUTykgewotCQlhbGNfcGlja19maXh1cChjb2RlYywgTlVMTCwgYWxjMjYwX2ZpeHVwX3RibCwgYWxjMjYwX2ZpeHVwcyk7Ci0JCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgPT0gQUxDMjYwX0FVVE8pIHsKLQkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCi0JCWVyciA9IGFsYzI2MF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgaWYgKCFlcnIpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBiYXNlIG1vZGUuLi5cbiIpOwotCQkJYm9hcmRfY29uZmlnID0gQUxDMjYwX0JBU0lDOwotCQl9Ci0JfQotCi0JZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7Ci0JaWYgKGVyciA8IDApIHsKLQkJYWxjX2ZyZWUoY29kZWMpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgIT0gQUxDMjYwX0FVVE8pCi0JCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzI2MF9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOwotCi0Jc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZhbGMyNjBfcGNtX2FuYWxvZ19wbGF5YmFjazsKLQlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmYWxjMjYwX3BjbV9hbmFsb2dfY2FwdHVyZTsKLQlzcGVjLT5zdHJlYW1fYW5hbG9nX2FsdF9jYXB0dXJlID0gJmFsYzI2MF9wY21fYW5hbG9nX2NhcHR1cmU7Ci0KLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZhbGMyNjBfcGNtX2RpZ2l0YWxfcGxheWJhY2s7Ci0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSA9ICZhbGMyNjBfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKLQotCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7Ci0JCS8qIGNoZWNrIHdoZXRoZXIgTklEIDB4MDQgaXMgdmFsaWQgKi8KLQkJdW5zaWduZWQgaW50IHdjYXAgPSBnZXRfd2NhcHMoY29kZWMsIDB4MDQpOwotCQl3Y2FwID0gZ2V0X3djYXBzX3R5cGUod2NhcCk7Ci0JCS8qIGdldCB0eXBlICovCi0JCWlmICh3Y2FwICE9IEFDX1dJRF9BVURfSU4gfHwgc3BlYy0+aW5wdXRfbXV4LT5udW1faXRlbXMgPT0gMSkgewotCQkJc3BlYy0+YWRjX25pZHMgPSBhbGMyNjBfYWRjX25pZHNfYWx0OwotCQkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjBfYWRjX25pZHNfYWx0KTsKLQkJfSBlbHNlIHsKLQkJCXNwZWMtPmFkY19uaWRzID0gYWxjMjYwX2FkY19uaWRzOwotCQkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjBfYWRjX25pZHMpOwotCQl9Ci0JfQotCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKLQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwNywgMHgwNSwgSERBX0lOUFVUKTsKLQotCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUk9CRSk7Ci0KLQlzcGVjLT52bWFzdGVyX25pZCA9IDB4MDg7Ci0KLQljb2RlYy0+cGF0Y2hfb3BzID0gYWxjX3BhdGNoX29wczsKLQlpZiAoYm9hcmRfY29uZmlnID09IEFMQzI2MF9BVVRPKQotCQlzcGVjLT5pbml0X2hvb2sgPSBhbGMyNjBfYXV0b19pbml0OwotCXNwZWMtPnNodXR1cCA9IGFsY19lYXBkX3NodXR1cDsKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi0JaWYgKCFzcGVjLT5sb29wYmFjay5hbXBsaXN0KQotCQlzcGVjLT5sb29wYmFjay5hbXBsaXN0ID0gYWxjMjYwX2xvb3BiYWNrczsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIEFMQzg4Mi84ODMvODg1Lzg4OC84ODkgc3VwcG9ydAotICoKLSAqIEFMQzg4MiBpcyBhbG1vc3QgaWRlbnRpY2FsIHdpdGggQUxDODgwIGJ1dCBoYXMgY2xlYW5lciBhbmQgbW9yZSBmbGV4aWJsZQotICogY29uZmlndXJhdGlvbi4gIEVhY2ggcGluIHdpZGdldCBjYW4gY2hvb3NlIGFueSBpbnB1dCBEQUNzIGFuZCBhIG1peGVyLgotICogRWFjaCBBREMgaXMgY29ubmVjdGVkIGZyb20gYSBtaXhlciBvZiBhbGwgaW5wdXRzLiAgVGhpcyBtYWtlcyBwb3NzaWJsZQotICogNi1jaGFubmVsIGluZGVwZW5kZW50IGNhcHR1cmVzLgotICoKLSAqIEluIGFkZGl0aW9uLCBhbiBpbmRlcGVuZGVudCBEQUMgZm9yIHRoZSBtdWx0aS1wbGF5YmFjayAobm90IHVzZWQgaW4gdGhpcwotICogZHJpdmVyIHlldCkuCi0gKi8KLSNkZWZpbmUgQUxDODgyX0RJR09VVF9OSUQJMHgwNgotI2RlZmluZSBBTEM4ODJfRElHSU5fTklECTB4MGEKLSNkZWZpbmUgQUxDODgzX0RJR09VVF9OSUQJQUxDODgyX0RJR09VVF9OSUQKLSNkZWZpbmUgQUxDODgzX0RJR0lOX05JRAlBTEM4ODJfRElHSU5fTklECi0jZGVmaW5lIEFMQzEyMDBfRElHT1VUX05JRAkweDEwCi0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4Ml9jaF9tb2Rlc1sxXSA9IHsKLQl7IDgsIE5VTEwgfQotfTsKLQotLyogREFDcyAqLwotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODJfZGFjX25pZHNbNF0gPSB7Ci0JLyogZnJvbnQsIHJlYXIsIGNsZmUsIHJlYXJfc3VyciAqLwotCTB4MDIsIDB4MDMsIDB4MDQsIDB4MDUKLX07Ci0jZGVmaW5lIGFsYzg4M19kYWNfbmlkcwkJYWxjODgyX2RhY19uaWRzCi0KLS8qIEFEQ3MgKi8KLSNkZWZpbmUgYWxjODgyX2FkY19uaWRzCQlhbGM4ODBfYWRjX25pZHMKLSNkZWZpbmUgYWxjODgyX2FkY19uaWRzX2FsdAlhbGM4ODBfYWRjX25pZHNfYWx0Ci0jZGVmaW5lIGFsYzg4M19hZGNfbmlkcwkJYWxjODgyX2FkY19uaWRzX2FsdAotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODNfYWRjX25pZHNfYWx0WzFdID0geyAweDA4IH07Ci1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg4M19hZGNfbmlkc19yZXZbMl0gPSB7IDB4MDksIDB4MDggfTsKLSNkZWZpbmUgYWxjODg5X2FkY19uaWRzCQlhbGM4ODBfYWRjX25pZHMKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODJfY2Fwc3JjX25pZHNbM10gPSB7IDB4MjQsIDB4MjMsIDB4MjIgfTsKLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgyX2NhcHNyY19uaWRzX2FsdFsyXSA9IHsgMHgyMywgMHgyMiB9OwotI2RlZmluZSBhbGM4ODNfY2Fwc3JjX25pZHMJYWxjODgyX2NhcHNyY19uaWRzX2FsdAotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODNfY2Fwc3JjX25pZHNfcmV2WzJdID0geyAweDIyLCAweDIzIH07Ci0jZGVmaW5lIGFsYzg4OV9jYXBzcmNfbmlkcwlhbGM4ODJfY2Fwc3JjX25pZHMKLQotLyogaW5wdXQgTVVYICovCi0vKiBGSVhNRTogc2hvdWxkIGJlIGEgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgyX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSA0LAotCS5pdGVtcyA9IHsKLQkJeyAiTWljIiwgMHgwIH0sCi0JCXsgIkZyb250IE1pYyIsIDB4MSB9LAotCQl7ICJMaW5lIiwgMHgyIH0sCi0JCXsgIkNEIiwgMHg0IH0sCi0JfSwKLX07Ci0KLSNkZWZpbmUgYWxjODgzX2NhcHR1cmVfc291cmNlCWFsYzg4Ml9jYXB0dXJlX3NvdXJjZQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODg5X2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAzLAotCS5pdGVtcyA9IHsKLQkJeyAiRnJvbnQgTWljIiwgMHgwIH0sCi0JCXsgIk1pYyIsIDB4MyB9LAotCQl7ICJMaW5lIiwgMHgyIH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBtYjVfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDMsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDEgfSwKLQkJeyAiTGluZSIsIDB4NyB9LAotCQl7ICJDRCIsIDB4NCB9LAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggbWFjbWluaTNfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDIsCi0JLml0ZW1zID0gewotCQl7ICJMaW5lIiwgMHgyIH0sCi0JCXsgIkNEIiwgMHg0IH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODNfM3N0YWNrXzZjaF9pbnRlbCA9IHsKLQkubnVtX2l0ZW1zID0gNCwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MSB9LAotCQl7ICJGcm9udCBNaWMiLCAweDAgfSwKLQkJeyAiTGluZSIsIDB4MiB9LAotCQl7ICJDRCIsIDB4NCB9LAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgzX2xlbm92b18xMDFlX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAyLAotCS5pdGVtcyA9IHsKLQkJeyAiTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4M19sZW5vdm9fbmIwNzYzX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSA0LAotCS5pdGVtcyA9IHsKLQkJeyAiTWljIiwgMHgwIH0sCi0JCXsgIkludGVybmFsIE1pYyIsIDB4MSB9LAotCQl7ICJMaW5lIiwgMHgyIH0sCi0JCXsgIkNEIiwgMHg0IH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODNfZnVqaXRzdV9waTI1MTVfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDIsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiSW50ZXJuYWwgTWljIiwgMHgxIH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODNfbGVub3ZvX3NreV9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMywKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJGcm9udCBNaWMiLCAweDEgfSwKLQkJeyAiTGluZSIsIDB4NCB9LAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgzX2FzdXNfZWVlMTYwMV9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMiwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJMaW5lIiwgMHgyIH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODlBX21iMzFfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDIsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJLyogRnJvbnQgTWljICgweDAxKSB1bnVzZWQgKi8KLQkJeyAiTGluZSIsIDB4MiB9LAotCQkvKiBMaW5lIDIgKDB4MDMpIHVudXNlZCAqLwotCQkvKiBDRCAoMHgwNCkgdW51c2VkPyAqLwotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODg5QV9pbWFjOTFfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDIsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwgLyogTm90IHN1cmUhICovCi0JfSwKLX07Ci0KLS8qCi0gKiAyY2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODgzXzNTVF8yY2hfbW9kZXNbMV0gPSB7Ci0JeyAyLCBOVUxMIH0KLX07Ci0KLS8qCi0gKiAyY2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml8zU1RfY2gyX2luaXRbXSA9IHsKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIDRjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgyXzNTVF9jaDRfaW5pdFtdID0gewotCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCi0JeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIDZjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgyXzNTVF9jaDZfaW5pdFtdID0gewotCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDIgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4Ml8zU1RfNmNoX21vZGVzWzNdID0gewotCXsgMiwgYWxjODgyXzNTVF9jaDJfaW5pdCB9LAotCXsgNCwgYWxjODgyXzNTVF9jaDRfaW5pdCB9LAotCXsgNiwgYWxjODgyXzNTVF9jaDZfaW5pdCB9LAotfTsKLQotI2RlZmluZSBhbGM4ODNfM1NUXzZjaF9tb2RlcwlhbGM4ODJfM1NUXzZjaF9tb2RlcwotCi0vKgotICogMmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfM1NUX2NoMl9jbGV2b19pbml0W10gPSB7Ci0JeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCi0JeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogNGNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfM1NUX2NoNF9jbGV2b19pbml0W10gPSB7Ci0JeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiA2Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4M18zU1RfY2g2X2NsZXZvX2luaXRbXSA9IHsKLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDIgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4M18zU1RfNmNoX2NsZXZvX21vZGVzWzNdID0gewotCXsgMiwgYWxjODgzXzNTVF9jaDJfY2xldm9faW5pdCB9LAotCXsgNCwgYWxjODgzXzNTVF9jaDRfY2xldm9faW5pdCB9LAotCXsgNiwgYWxjODgzXzNTVF9jaDZfY2xldm9faW5pdCB9LAotfTsKLQotCi0vKgotICogNmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODJfc2l4c3RhY2tfY2g2X2luaXRbXSA9IHsKLQl7IDB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiA4Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml9zaXhzdGFja19jaDhfaW5pdFtdID0gewotCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4Ml9zaXhzdGFja19tb2Rlc1syXSA9IHsKLQl7IDYsIGFsYzg4Ml9zaXhzdGFja19jaDZfaW5pdCB9LAotCXsgOCwgYWxjODgyX3NpeHN0YWNrX2NoOF9pbml0IH0sCi19OwotCi0KLS8qIE1hY2Jvb2sgQWlyIDIsMSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODg1X21iYTIxX2NoX21vZGVzWzFdID0gewotICAgICAgeyAyLCBOVUxMIH0sCi19OwotCi0vKgotICogbWFjYm9vayBwcm8gQUxDODg1IGNhbiBzd2l0Y2ggTGluZUluIHRvIExpbmVPdXQgd2l0aG91dCBsb3NpbmcgTWljCi0gKi8KLQotLyoKLSAqIDJjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg1X21icF9jaDJfaW5pdFtdID0gewotCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogNGNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODVfbWJwX2NoNF9pbml0W10gPSB7Ci0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4ODVfbWJwXzRjaF9tb2Rlc1syXSA9IHsKLQl7IDIsIGFsYzg4NV9tYnBfY2gyX2luaXQgfSwKLQl7IDQsIGFsYzg4NV9tYnBfY2g0X2luaXQgfSwKLX07Ci0KLS8qCi0gKiAyY2gKLSAqIFNwZWFrZXJzL1dvb2Zlci9IUCA9IEZyb250Ci0gKiBMaW5lSW4gPSBJbnB1dAotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4NV9tYjVfY2gyX2luaXRbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiA2Y2ggbW9kZQotICogU3BlYWtlcnMvSFAgPSBGcm9udAotICogV29vZmVyID0gTEZFCi0gKiBMaW5lSW4gPSBTdXJyb3VuZAotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4NV9tYjVfY2g2X2luaXRbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4NV9tYjVfNmNoX21vZGVzWzJdID0gewotCXsgMiwgYWxjODg1X21iNV9jaDJfaW5pdCB9LAotCXsgNiwgYWxjODg1X21iNV9jaDZfaW5pdCB9LAotfTsKLQotI2RlZmluZSBhbGM4ODVfbWFjbWluaTNfNmNoX21vZGVzCWFsYzg4NV9tYjVfNmNoX21vZGVzCi0KLS8qCi0gKiAyY2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4M180U1RfY2gyX2luaXRbXSA9IHsKLQl7IDB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIDRjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzXzRTVF9jaDRfaW5pdFtdID0gewotCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCi0JeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIDZjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzXzRTVF9jaDZfaW5pdFtdID0gewotCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDIgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIDhjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzXzRTVF9jaDhfaW5pdFtdID0gewotCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsgMHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDMgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4ODNfNFNUXzhjaF9tb2Rlc1s0XSA9IHsKLQl7IDIsIGFsYzg4M180U1RfY2gyX2luaXQgfSwKLQl7IDQsIGFsYzg4M180U1RfY2g0X2luaXQgfSwKLQl7IDYsIGFsYzg4M180U1RfY2g2X2luaXQgfSwKLQl7IDgsIGFsYzg4M180U1RfY2g4X2luaXQgfSwKLX07Ci0KLQotLyoKLSAqIDJjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzXzNTVF9jaDJfaW50ZWxfaW5pdFtdID0gewotCXsgMHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCi0JeyAweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogNGNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfM1NUX2NoNF9pbnRlbF9pbml0W10gPSB7Ci0JeyAweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKLQl7IDB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogNmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfM1NUX2NoNl9pbnRlbF9pbml0W10gPSB7Ci0JeyAweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JeyAweDE5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMiB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODgzXzNTVF82Y2hfaW50ZWxfbW9kZXNbM10gPSB7Ci0JeyAyLCBhbGM4ODNfM1NUX2NoMl9pbnRlbF9pbml0IH0sCi0JeyA0LCBhbGM4ODNfM1NUX2NoNF9pbnRlbF9pbml0IH0sCi0JeyA2LCBhbGM4ODNfM1NUX2NoNl9pbnRlbF9pbml0IH0sCi19OwotCi0vKgotICogMmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODlfY2gyX2ludGVsX2luaXRbXSA9IHsKLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JeyAweDE5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCXsgMHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQl7IDB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIDZjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg5X2NoNl9pbnRlbF9pbml0W10gPSB7Ci0JeyAweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCXsgMHgxOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKLQl7IDB4MTYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyIH0sCi0JeyAweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMyB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiA4Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OV9jaDhfaW50ZWxfaW5pdFtdID0gewotCXsgMHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQl7IDB4MTksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCi0JeyAweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMiB9LAotCXsgMHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDMgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4OV84Y2hfaW50ZWxfbW9kZXNbM10gPSB7Ci0JeyAyLCBhbGM4ODlfY2gyX2ludGVsX2luaXQgfSwKLQl7IDYsIGFsYzg4OV9jaDZfaW50ZWxfaW5pdCB9LAotCXsgOCwgYWxjODg5X2NoOF9pbnRlbF9pbml0IH0sCi19OwotCi0vKgotICogNmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfc2l4c3RhY2tfY2g2X2luaXRbXSA9IHsKLQl7IDB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiA4Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4M19zaXhzdGFja19jaDhfaW5pdFtdID0gewotCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg4M19zaXhzdGFja19tb2Rlc1syXSA9IHsKLQl7IDYsIGFsYzg4M19zaXhzdGFja19jaDZfaW5pdCB9LAotCXsgOCwgYWxjODgzX3NpeHN0YWNrX2NoOF9pbml0IH0sCi19OwotCi0KLS8qIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBSZWFyPTB4MTUsIENMRkU9MHgxNiwgU2lkZT0weDE3Ci0gKiAgICAgICAgICAgICAgICAgTWljPTB4MTgsIEZyb250IE1pYz0weDE5LCBMaW5lLUluPTB4MWEsIEhQPTB4MWIKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4Ml9iYXNlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIE1hY2Jvb2sgQWlyIDIsMSBzYW1lIGNvbnRyb2wgZm9yIEhQIGFuZCBpbnRlcm5hbCBTcGVha2VyICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODVfbWJhMjFfbWl4ZXJbXSA9IHsKLSAgICAgIEhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwMCwgSERBX09VVFBVVCksCi0gICAgICBIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MDIsIEhEQV9PVVRQVVQpLAotICAgICB7IH0KLX07Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4NV9tYnAzX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFICAgKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDB4MDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUgICAoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSAgKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUgICgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBCb29zdCBWb2x1bWUiLCAweDFhLCAweDAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAweDAwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODVfbWI1X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwMCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSAgICgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFICAgKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAweDAwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFICAgKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwMCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSAgICgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA3LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFICAoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSAgKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEJvb3N0IFZvbHVtZSIsIDB4MTUsIDB4MDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDB4MDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4NV9tYWNtaW5pM19taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUgICAoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwMCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSAgICgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMHgwMCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSAgICgiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGYsIDB4MDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUgICAoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSAgKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDcsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBCb29zdCBWb2x1bWUiLCAweDE1LCAweDAwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODVfaW1hYzkxX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MDIsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgyX3cyamNfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODJfdGFyZ2FfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBIUCA9IDB4MTUsIEZyb250ID0gMHgxNiwgPz8/Ci0gKiAgICAgICAgICAgICAgICAgRnJvbnQgTWljPTB4MTgsIExpbmUgSW4gPSAweDFhLCBMaW5lIEluID0gMHgxYiwgQ0QgPSAweDFjCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODJfYXN1c19hN2pfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTW9iaWxlIEZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNb2JpbGUgTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAzLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNb2JpbGUgTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAzLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4Ml9hc3VzX2E3bV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODJfY2htb2RlX21peGVyW10gPSB7Ci0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKLQkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAotCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAotCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAotCX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODJfYmFzZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyogRnJvbnQgbWl4ZXI6IHVubXV0ZSBpbnB1dC9vdXRwdXQgYW1wIGxlZnQgYW5kIHJpZ2h0ICh2b2x1bWUgPSAwKSAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQkvKiBSZWFyIG1peGVyICovCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCS8qIENMRkUgbWl4ZXIgKi8KLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JLyogU2lkZSBtaXhlciAqLwotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQotCS8qIEZyb250IFBpbjogb3V0cHV0IDAgKDB4MGMpICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCS8qIFJlYXIgUGluOiBvdXRwdXQgMSAoMHgwZCkgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JLyogQ0xGRSBQaW46IG91dHB1dCAyICgweDBlKSAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwKLQkvKiBTaWRlIFBpbjogb3V0cHV0IDMgKDB4MGYpICovCi0JezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDN9LAotCS8qIE1pYyAocmVhcikgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogTGluZSBJbiBwaW46IGlucHV0ICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBMaW5lLTIgSW46IEhlYWRwaG9uZSBvdXRwdXQgKG91dHB1dCAwIC0gMHgwYykgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLQkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDE2LCAxNywgMGIgKi8KLQkvKiBJbnB1dCBtaXhlcjIgKi8KLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JLyogSW5wdXQgbWl4ZXIzICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCS8qIEFEQzI6IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCS8qIEFEQzM6IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml9hZGMxX2luaXRfdmVyYnNbXSA9IHsKLQkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0JLyogQURDMTogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml9lYXBkX3ZlcmJzW10gPSB7Ci0JLyogY2hhbmdlIHRvIEVBUEQgbW9kZSAqLwotCXsweDIwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDA3fSwKLQl7MHgyMCwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDMwNjB9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODlfZWFwZF92ZXJic1tdID0gewotCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjX2hwMTVfdW5zb2xfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODVfaW5pdF92ZXJic1tdID0gewotCS8qIEZyb250IG1peGVyOiB1bm11dGUgaW5wdXQvb3V0cHV0IGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCS8qIFJlYXIgbWl4ZXIgKi8KLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCS8qIENMRkUgbWl4ZXIgKi8KLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCS8qIFNpZGUgbWl4ZXIgKi8KLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JLyogRnJvbnQgSFAgUGluOiBvdXRwdXQgMCAoMHgwYykgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBGcm9udCBQaW46IG91dHB1dCAwICgweDBjKSAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBSZWFyIFBpbjogb3V0cHV0IDEgKDB4MGQpICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCS8qIENMRkUgUGluOiBvdXRwdXQgMiAoMHgwZSkgKi8KLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0JLyogU2lkZSBQaW46IG91dHB1dCAzICgweDBmKSAqLwotCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKLQkvKiBNaWMgKHJlYXIpIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIExpbmUgSW4gcGluOiBpbnB1dCAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0KLQkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgLCAweDFhLCAweDFiICovCi0JLyogSW5wdXQgbWl4ZXIxICovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCS8qIElucHV0IG1peGVyMiAqLwotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQkvKiBJbnB1dCBtaXhlcjMgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JLyogQURDMjogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCS8qIEFEQzM6IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODVfaW5pdF9pbnB1dF92ZXJic1tdID0gewotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAotCXsgfQotfTsKLQotCi0vKiBVbm11dGUgU2VsZWN0b3IgMjRoIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gZnJvbnQgbWljICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OV9pbml0X2lucHV0X3ZlcmJzW10gPSB7Ci0JezB4MjQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsgfQotfTsKLQotCi0jZGVmaW5lIGFsYzg4M19pbml0X3ZlcmJzCWFsYzg4Ml9iYXNlX2luaXRfdmVyYnMKLQotLyogTWFjIFBybyB0ZXN0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgyX21hY3Byb19taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTgsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JLyogRklYTUU6IHRoaXMgbG9va3Mgc3VzcGljaW91cy4uLgotCUhEQV9DT0RFQ19WT0xVTUUoIkJlZXAgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQmVlcCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCSovCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODJfbWFjcHJvX2luaXRfdmVyYnNbXSA9IHsKLQkvKiBGcm9udCBtaXhlcjogdW5tdXRlIGlucHV0L291dHB1dCBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCS8qIEZyb250IFBpbjogb3V0cHV0IDAgKDB4MGMpICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogU3BlYWtlcjogIG91dHB1dCAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDA0fSwKLQkvKiBIZWFkcGhvbmUgb3V0cHV0IChvdXRwdXQgMCAtIDB4MGMpICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0KLQkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLQkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDE2LCAxNywgMGIgKi8KLQkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0JLyogSW5wdXQgbWl4ZXIyICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCS8qIElucHV0IG1peGVyMyAqLwotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKLQkvKiBBREMxOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBBREMyOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBBREMzOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLwotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCXsgfQotfTsKLQotLyogTWFjYm9vayA1LDEgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg1X21iNV9pbml0X3ZlcmJzW10gPSB7Ci0JLyogREFDcyAqLwotCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogRnJvbnQgbWl4ZXIgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JLyogU3Vycm91bmQgbWl4ZXIgKi8KLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JLyogTEZFIG1peGVyICovCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCS8qIEhQIG1peGVyICovCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCS8qIEZyb250IFBpbiAoMHgwYykgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIHwgMHgwMX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCS8qIExGRSBQaW4gKDB4MGUpICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB8IDB4MDF9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwKLQkvKiBIUCBQaW4gKDB4MGYpICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDN9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIExpbmUgSW4gcGluICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDB4MSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgweDcpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMHg0KX0sCi0JeyB9Ci19OwotCi0vKiBNYWNtaW5pIDMsMSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODVfbWFjbWluaTNfaW5pdF92ZXJic1tdID0gewotCS8qIERBQ3MgKi8KLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIEZyb250IG1peGVyICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCS8qIFN1cnJvdW5kIG1peGVyICovCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCS8qIExGRSBtaXhlciAqLwotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQkvKiBIUCBtaXhlciAqLwotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQkvKiBGcm9udCBQaW4gKDB4MGMpICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB8IDB4MDF9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBMRkUgUGluICgweDBlKSAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfCAweDAxfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0JLyogSFAgUGluICgweDBmKSAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JLyogTGluZSBJbiBwaW4gKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCXsgfQotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4NV9tYmEyMV9pbml0X3ZlcmJzW10gPSB7Ci0JLypJbnRlcm5hbCBhbmQgSFAgU3BlYWtlciBNaXhlciovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQkvKkludGVybmFsIFNwZWFrZXIgUGluICgweDBjKSovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgKFBJTl9PVVQgfCBBQ19QSU5DVExfVlJFRl81MCkgfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JLyogSFAgUGluOiBvdXRwdXQgMCAoMHgwZSkgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGM0fSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgKEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOKX0sCi0JLyogTGluZSBpbiAoaXMgaHAgd2hlbiBqYWNrIGNvbm5lY3RlZCkqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIEFDX1BJTkNUTF9WUkVGXzUwfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQotCXsgfQotIH07Ci0KLQotLyogTWFjYm9vayBQcm8gcmV2MyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODVfbWJwM19pbml0X3ZlcmJzW10gPSB7Ci0JLyogRnJvbnQgbWl4ZXI6IHVubXV0ZSBpbnB1dC9vdXRwdXQgYW1wIGxlZnQgYW5kIHJpZ2h0ICh2b2x1bWUgPSAwKSAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQkvKiBSZWFyIG1peGVyICovCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCS8qIEhQIG1peGVyICovCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCS8qIEZyb250IFBpbjogb3V0cHV0IDAgKDB4MGMpICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCS8qIEhQIFBpbjogb3V0cHV0IDAgKDB4MGUpICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjNH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQkvKiBNaWMgKHJlYXIpIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIExpbmUgSW4gcGluOiB1c2Ugb3V0cHV0IDEgd2hlbiBpbiBMaW5lT3V0IG1vZGUgKi8KLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0KLQkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLQkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDE2LCAxNywgMGIgKi8KLQkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0JLyogSW5wdXQgbWl4ZXIyICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCS8qIElucHV0IG1peGVyMyAqLwotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKLQkvKiBBREMxOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBBREMyOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBBREMzOiBtdXRlIGFtcCBsZWZ0IGFuZCByaWdodCAqLwotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCXsgfQotfTsKLQotLyogaU1hYyA5LDEgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg1X2ltYWM5MV9pbml0X3ZlcmJzW10gPSB7Ci0JLyogSW50ZXJuYWwgU3BlYWtlciBQaW4gKDB4MGMpICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgKFBJTl9PVVQgfCBBQ19QSU5DVExfVlJFRl81MCkgfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgKFBJTl9PVVQgfCBBQ19QSU5DVExfVlJFRl81MCkgfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JLyogSFAgUGluOiBSZWFyICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgKEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOKX0sCi0JLyogTGluZSBpbiBSZWFyICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgQUNfUElOQ1RMX1ZSRUZfNTB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogUmVhciBtaXhlciAqLwotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQkvKiBMaW5lLU91dCBtaXhlcjogdW5tdXRlIGlucHV0L291dHB1dCBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCS8qIDB4MjQgW0F1ZGlvIE1peGVyXSB3Y2FwcyAweDIwMDEwYjogU3RlcmVvIEFtcC1JbiAqLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKLQkvKiAweDIzIFtBdWRpbyBNaXhlcl0gd2NhcHMgMHgyMDAxMGI6IFN0ZXJlbyBBbXAtSW4gKi8KLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0JLyogMHgyMiBbQXVkaW8gTWl4ZXJdIHdjYXBzIDB4MjAwMTBiOiBTdGVyZW8gQW1wLUluICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCS8qIDB4MDcgW0F1ZGlvIElucHV0XSB3Y2FwcyAweDEwMDExYjogU3RlcmVvIEFtcC1JbiAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiAweDA4IFtBdWRpbyBJbnB1dF0gd2NhcHMgMHgxMDAxMWI6IFN0ZXJlbyBBbXAtSW4gKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JLyogMHgwOSBbQXVkaW8gSW5wdXRdIHdjYXBzIDB4MTAwMTFiOiBTdGVyZW8gQW1wLUluICovCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsgfQotfTsKLQotLyogaU1hYyAyNCBtaXhlci4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODVfaW1hYzI0X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwMCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBpTWFjIDI0IGluaXQgdmVyYnMuICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4NV9pbWFjMjRfaW5pdF92ZXJic1tdID0gewotCS8qIEludGVybmFsIHNwZWFrZXJzOiBvdXRwdXQgMCAoMHgwYykgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JLyogSW50ZXJuYWwgc3BlYWtlcnM6IG91dHB1dCAwICgweDBjKSAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBIZWFkcGhvbmU6IG91dHB1dCAwICgweDBjKSAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQkvKiBGcm9udCBNaWM6IGlucHV0IHZyZWYgYXQgODAlICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JeyB9Ci19OwotCi0vKiBUb2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGM4ODVfaW1hYzI0X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTg7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDFhOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotI2RlZmluZSBhbGM4ODVfbWI1X3NldHVwCWFsYzg4NV9pbWFjMjRfc2V0dXAKLSNkZWZpbmUgYWxjODg1X21hY21pbmkzX3NldHVwCWFsYzg4NV9pbWFjMjRfc2V0dXAKLQotLyogTWFjYm9vayBBaXIgMiwxICovCi1zdGF0aWMgdm9pZCBhbGM4ODVfbWJhMjFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0gICAgICAgc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLSAgICAgICBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwotICAgICAgIHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxODsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZCBhbGM4ODVfbWJwM19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotc3RhdGljIHZvaWQgYWxjODg1X2ltYWM5MV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE4OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxYTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgyX3RhcmdhX3ZlcmJzW10gPSB7Ci0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0KLQl7MHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LCAvKiBtaWMvY2xmZSAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sIC8qIGxpbmUvc3Vycm91bmQgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLwotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzg4Ml90YXJnYV9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlhbGNfaHBfYXV0b211dGUoY29kZWMpOwotCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIDEsIDAsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwKLQkJCQkgIHNwZWMtPmphY2tfcHJlc2VudCA/IDEgOiAzKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjODgyX3RhcmdhX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgdm9pZCBhbGM4ODJfdGFyZ2FfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZXMpCi17Ci0JaWYgKChyZXMgPj4gMjYpID09IEFMQzg4MF9IUF9FVkVOVCkKLQkJYWxjODgyX3RhcmdhX2F1dG9tdXRlKGNvZGVjKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODJfYXN1c19hN2pfdmVyYnNbXSA9IHsKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEZyb250ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogSFAgKi8KLQl7MHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBGcm9udCAqLwotCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwgLyogbWljL2NsZmUgKi8KLQl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LCAvKiBsaW5lL3N1cnJvdW5kICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogSFAgKi8KLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml9hc3VzX2E3bV92ZXJic1tdID0gewotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogRnJvbnQgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEZyb250ICovCi0KLQl7MHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LCAvKiBtaWMvY2xmZSAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sIC8qIGxpbmUvc3Vycm91bmQgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLwotIAl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgdm9pZCBhbGM4ODJfZ3Bpb19tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgcGluLCBpbnQgbXV0ZWQpCi17Ci0JdW5zaWduZWQgaW50IGdwaW9zdGF0ZSwgZ3Bpb21hc2ssIGdwaW9kaXI7Ci0KLQlncGlvc3RhdGUgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCi0JCQkJICAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwgMCk7Ci0KLQlpZiAoIW11dGVkKQotCQlncGlvc3RhdGUgfD0gKDEgPDwgcGluKTsKLQllbHNlCi0JCWdwaW9zdGF0ZSAmPSB+KDEgPDwgcGluKTsKLQotCWdwaW9tYXNrID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAotCQkJCSAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fTUFTSywgMCk7Ci0JZ3Bpb21hc2sgfD0gKDEgPDwgcGluKTsKLQotCWdwaW9kaXIgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCi0JCQkJICAgICBBQ19WRVJCX0dFVF9HUElPX0RJUkVDVElPTiwgMCk7Ci0JZ3Bpb2RpciB8PSAoMSA8PCBwaW4pOwotCi0KLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAotCQkJICAgIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgZ3Bpb21hc2spOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5hZmcsIDAsCi0JCQkgICAgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIGdwaW9kaXIpOwotCi0JbXNsZWVwKDEpOwotCi0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwKLQkJCSAgICBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIGdwaW9zdGF0ZSk7Ci19Ci0KLS8qIHNldCB1cCBHUElPIGF0IGluaXRpYWxpemF0aW9uICovCi1zdGF0aWMgdm9pZCBhbGM4ODVfbWFjcHJvX2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlhbGM4ODJfZ3Bpb19tdXRlKGNvZGVjLCAwLCAwKTsKLQlhbGM4ODJfZ3Bpb19tdXRlKGNvZGVjLCAxLCAwKTsKLX0KLQotLyogc2V0IHVwIEdQSU8gYW5kIHVwZGF0ZSBhdXRvLW11dGluZyBhdCBpbml0aWFsaXphdGlvbiAqLwotc3RhdGljIHZvaWQgYWxjODg1X2ltYWMyNF9pbml0X2hvb2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JYWxjODg1X21hY3Byb19pbml0X2hvb2soY29kZWMpOwotCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7Ci19Ci0KLS8qCi0gKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX2F1dG9faW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAtMiBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyoKLQkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgwYyAtIDB4MGYpCi0JICovCi0JLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQkvKiBzZXQgdXAgaW5wdXQgYW1wcyBmb3IgYW5hbG9nIGxvb3BiYWNrICovCi0JLyogQW1wIEluZGljZXM6IERBQyA9IDAsIG1peGVyID0gMSAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MjYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDI2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCS8qIEZJWE1FOiB1c2UgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLwotCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxYywgMWQsIDE0LCAxNSwgMTYsIDE3LCAwYiAqLwotCS8qIElucHV0IG1peGVyMiAqLwotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQkvKiBJbnB1dCBtaXhlcjMgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JeyB9Ci19OwotCi0vKiAyY2ggbW9kZSAoU3BlYWtlcjpmcm9udCwgU3Vid29vZmVyOkNMRkUsIExpbmU6aW5wdXQsIEhlYWRwaG9uZXM6ZnJvbnQpICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OUFfbWIzMV9jaDJfaW5pdFtdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sICAgICAgICAgICAgIC8qIEhQIGFzIGZyb250ICovCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwgLyogU3Vid29vZmVyIG9uICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwgICAgLyogTGluZSBhcyBpbnB1dCAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LCAgIC8qIExpbmUgb2ZmICovCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogNGNoIG1vZGUgKFNwZWFrZXI6ZnJvbnQsIFN1Yndvb2ZlcjpDTEZFLCBMaW5lOkNMRkUsIEhlYWRwaG9uZXM6ZnJvbnQpICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OUFfbWIzMV9jaDRfaW5pdFtdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sICAgICAgICAgICAgIC8qIEhQIGFzIGZyb250ICovCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwgLyogU3Vid29vZmVyIG9uICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sICAgLyogTGluZSBhcyBvdXRwdXQgKi8KLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LCAvKiBMaW5lIG9uICovCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogNWNoIG1vZGUgKFNwZWFrZXI6ZnJvbnQsIFN1Yndvb2ZlcjpDTEZFLCBMaW5lOmlucHV0LCBIZWFkcGhvbmVzOnJlYXIpICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OUFfbWIzMV9jaDVfaW5pdFtdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sICAgICAgICAgICAgIC8qIEhQIGFzIHJlYXIgKi8KLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LCAvKiBTdWJ3b29mZXIgb24gKi8KLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LCAgICAvKiBMaW5lIGFzIGlucHV0ICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sICAgLyogTGluZSBvZmYgKi8KLQl7IH0gLyogZW5kICovCi19OwotCi0vKiA2Y2ggbW9kZSAoU3BlYWtlcjpmcm9udCwgU3Vid29vZmVyOm9mZiwgTGluZTpDTEZFLCBIZWFkcGhvbmVzOlJlYXIpICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OUFfbWIzMV9jaDZfaW5pdFtdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sICAgICAgICAgICAgIC8qIEhQIGFzIGZyb250ICovCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sICAgLyogU3Vid29vZmVyIG9mZiAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LCAgIC8qIExpbmUgYXMgb3V0cHV0ICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwgLyogTGluZSBvbiAqLwotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4ODlBX21iMzFfNmNoX21vZGVzWzRdID0gewotCXsgMiwgYWxjODg5QV9tYjMxX2NoMl9pbml0IH0sCi0JeyA0LCBhbGM4ODlBX21iMzFfY2g0X2luaXQgfSwKLQl7IDUsIGFsYzg4OUFfbWIzMV9jaDVfaW5pdCB9LAotCXsgNiwgYWxjODg5QV9tYjMxX2NoNl9pbml0IH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4M19tZWRpb25fZWFwZF92ZXJic1tdID0gewotICAgICAgICAvKiBlYW5hYmxlIEVBUEQgb24gbWVkaW9uIGxhcHRvcCAqLwotCXsweDIwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDA3fSwKLQl7MHgyMCwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDMwNzB9LAotCXsgfQotfTsKLQotI2RlZmluZSBhbGM4ODNfYmFzZV9taXhlcglhbGM4ODJfYmFzZV9taXhlcgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX21pdGFjX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX2NsZXZvX203MjBfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzXzJjaF9mdWppdHN1X3BpMjUxNV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfM1NUXzJjaF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M18zU1RfNmNoX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzXzNTVF82Y2hfaW50ZWxfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwKLQkJCSAgICAgIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODg1XzhjaF9pbnRlbF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLAotCQkJICAgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxYiwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfZml2ZXN0YWNrX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX3RhcmdhX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX3RhcmdhXzJjaF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX3RhcmdhXzhjaF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX2xlbm92b18xMDFlXzJjaF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfbGVub3ZvX25iMDc2M19taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfbWVkaW9uX3dpbTIxNjBfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX21lZGlvbl93aW0yMTYwX3ZlcmJzW10gPSB7Ci0JLyogVW5tdXRlIGZyb250IG1peGVyICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCS8qIFNldCBzcGVha2VyIHBpbiB0byBmcm9udCBtaXhlciAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0KLQkvKiBJbml0IGhlYWRwaG9uZSBwaW4gKi8KLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0KLQl7IH0gLyogZW5kICovCi19OwotCi0vKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGM4ODNfbWVkaW9uX3dpbTIxNjBfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFhOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfYWNlcl9hc3BpcmVfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4OF9hY2VyX2FzcGlyZV82NTMwX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4OF9sZW5vdm9fc2t5X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLAotCQkJCQkJMHgwZCwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDEsIDIsIEhEQV9JTlBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJTaWRlIFBsYXliYWNrIFZvbHVtZSIsIDB4MGYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODlBX21iMzFfbWl4ZXJbXSA9IHsKLQkvKiBPdXRwdXQgbWl4ZXJzICovCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwMCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MDAsCi0JCUhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwMCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMHgwMiwgSERBX0lOUFVUKSwKLQkvKiBPdXRwdXQgc3dpdGNoZXMgKi8KLQlIREFfQ09ERUNfTVVURSgiRW5hYmxlIFNwZWFrZXIiLCAweDE0LCAweDAwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRW5hYmxlIEhlYWRwaG9uZXMiLCAweDE1LCAweDAwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJFbmFibGUgTEZFIiwgMHgxNiwgMiwgMHgwMCwgSERBX09VVFBVVCksCi0JLyogQm9vc3QgbWl4ZXJzICovCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDB4MDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBCb29zdCBWb2x1bWUiLCAweDFhLCAweDAwLCBIREFfSU5QVVQpLAotCS8qIElucHV0IG1peGVycyAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX3ZhaW90dF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjODgzX2JpbmRfY2FwX3ZvbCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF92b2wsCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA4LCAzLCAwLCBIREFfSU5QVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDksIDMsIDAsIEhEQV9JTlBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzg4M19iaW5kX2NhcF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA4LCAzLCAwLCBIREFfSU5QVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDksIDMsIDAsIEhEQV9JTlBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M19hc3VzX2VlZTE2MDFfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M19hc3VzX2VlZTE2MDFfY2FwX21peGVyW10gPSB7Ci0JSERBX0JJTkRfVk9MKCJDYXB0dXJlIFZvbHVtZSIsICZhbGM4ODNfYmluZF9jYXBfdm9sKSwKLQlIREFfQklORF9TVygiQ2FwdHVyZSBTd2l0Y2giLCAmYWxjODgzX2JpbmRfY2FwX3N3aXRjaCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLwotCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAotCQkuY291bnQgPSAxLAotCQkuaW5mbyA9IGFsY19tdXhfZW51bV9pbmZvLAotCQkuZ2V0ID0gYWxjX211eF9lbnVtX2dldCwKLQkJLnB1dCA9IGFsY19tdXhfZW51bV9wdXQsCi0JfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX2NobW9kZV9taXhlcltdID0gewotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCi0JCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKLQkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKLQkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKLQl9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzg4M19taXRhY19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX21pdGFjX3ZlcmJzW10gPSB7Ci0JLyogSFAgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JLyogU3Vid29vZmVyICovCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQotCS8qIGVuYWJsZSB1bnNvbGljaXRlZCBldmVudCAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQkvKiB7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfTUlDX0VWRU5UIHwgQUNfVVNSU1BfRU59LCAqLwotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfY2xldm9fbTU0MHJfdmVyYnNbXSA9IHsKLQkvKiBIUCAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQkvKiBJbnQgc3BlYWtlciAqLwotCS8qezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwqLwotCi0JLyogZW5hYmxlIHVuc29saWNpdGVkIGV2ZW50ICovCi0JLyoKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX01JQ19FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQkqLwotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfY2xldm9fbTcyMF92ZXJic1tdID0gewotCS8qIEhQICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCS8qIEludCBzcGVha2VyICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQotCS8qIGVuYWJsZSB1bnNvbGljaXRlZCBldmVudCAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfTUlDX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfMmNoX2Z1aml0c3VfcGkyNTE1X3ZlcmJzW10gPSB7Ci0JLyogSFAgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JLyogU3Vid29vZmVyICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQotCS8qIGVuYWJsZSB1bnNvbGljaXRlZCBldmVudCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX3RhcmdhX3ZlcmJzW10gPSB7Ci0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0KLS8qIENvbm5lY3QgTGluZS1PdXQgc2lkZSBqYWNrIChTUERJRikgdG8gU2lkZSAqLwotCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKLS8qIENvbm5lY3QgTWljIGphY2sgdG8gQ0xGRSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwKLS8qIENvbm5lY3QgTGluZS1pbiBqYWNrIHRvIFN1cnJvdW5kICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotLyogQ29ubmVjdCBIUCBvdXQgamFjayB0byBGcm9udCAqLwotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX2xlbm92b18xMDFlX3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfRlJPTlRfRVZFTlR8QUNfVVNSU1BfRU59LAotICAgICAgICB7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlR8QUNfVVNSU1BfRU59LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX2xlbm92b19uYjA3NjNfdmVyYnNbXSA9IHsKLSAgICAgICAgezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotICAgICAgICB7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0gICAgICAgIHsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfbGVub3ZvX21zNzE5NV92ZXJic1tdID0gewotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfRlJPTlRfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UICAgIHwgQUNfVVNSU1BfRU59LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX2hhaWVyX3c2Nl92ZXJic1tdID0gewotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQotCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF9sZW5vdm9fc2t5X3ZlcmJzW10gPSB7Ci0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF82c3RfZGVsbF92ZXJic1tdID0gewotCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX3ZhaW90dF92ZXJic1tdID0gewotCS8qIEhQICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCi0JLyogZW5hYmxlIHVuc29saWNpdGVkIGV2ZW50ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIHZvaWQgYWxjODg4XzNzdF9ocF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTg7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF8zc3RfaHBfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAkvKiBGcm9udDogb3V0cHV0IDAgKDB4MGMpICovCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogUmVhciA6IG91dHB1dCAxICgweDBkKSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCS8qIENMRkUgOiBvdXRwdXQgMiAoMHgwZSkgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIDJjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4XzNzdF9ocF8yY2hfaW5pdFtdID0gewotCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCi0JeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKLQl7IDB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCi0JeyAweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEUgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogNGNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfM3N0X2hwXzRjaF9pbml0W10gPSB7Ci0JeyAweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAotCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsgMHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogNmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfM3N0X2hwXzZjaF9pbml0W10gPSB7Ci0JeyAweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JeyAweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMiB9LAotCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsgMHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODg4XzNzdF9ocF9tb2Rlc1szXSA9IHsKLQl7IDIsIGFsYzg4OF8zc3RfaHBfMmNoX2luaXQgfSwKLQl7IDQsIGFsYzg4OF8zc3RfaHBfNGNoX2luaXQgfSwKLQl7IDYsIGFsYzg4OF8zc3RfaHBfNmNoX2luaXQgfSwKLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzg4OF9sZW5vdm9fbXM3MTk1X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKLQlzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLS8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzg4M19sZW5vdm9fbmIwNzYzX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi0vKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCi0jZGVmaW5lIGFsYzg4M190YXJnYV9pbml0X2hvb2sJCWFsYzg4Ml90YXJnYV9pbml0X2hvb2sKLSNkZWZpbmUgYWxjODgzX3RhcmdhX3Vuc29sX2V2ZW50CWFsYzg4Ml90YXJnYV91bnNvbF9ldmVudAotCi1zdGF0aWMgdm9pZCBhbGM4ODNfY2xldm9fbTcyMF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotc3RhdGljIHZvaWQgYWxjODgzX2NsZXZvX203MjBfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7Ci0JYWxjODh4X3NpbXBsZV9taWNfYXV0b211dGUoY29kZWMpOwotfQotCi1zdGF0aWMgdm9pZCBhbGM4ODNfY2xldm9fbTcyMF91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkJICAgdW5zaWduZWQgaW50IHJlcykKLXsKLQlzd2l0Y2ggKHJlcyA+PiAyNikgewotCWNhc2UgQUxDODgwX01JQ19FVkVOVDoKLQkJYWxjODh4X3NpbXBsZV9taWNfYXV0b211dGUoY29kZWMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlhbGNfc2t1X3Vuc29sX2V2ZW50KGNvZGVjLCByZXMpOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzg4M18yY2hfZnVqaXRzdV9waTI1MTVfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4M19oYWllcl93NjZfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4M19sZW5vdm9fMTAxZV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmRldGVjdF9saW5lID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9saW5lcyA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLS8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzg4M19hY2VyX2FzcGlyZV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX2FjZXJfZWFwZF92ZXJic1tdID0gewotCS8qIEhQIFBpbjogb3V0cHV0IDAgKDB4MGMpICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JLyogRnJvbnQgUGluOiBvdXRwdXQgMCAoMHgwYykgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0gICAgICAgIC8qIGVhbmFibGUgRUFQRCBvbiBtZWRpb24gbGFwdG9wICovCi0JezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDd9LAotCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIDB4MzA1MH0sCi0JLyogZW5hYmxlIHVuc29saWNpdGVkIGV2ZW50ICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsgfQotfTsKLQotc3RhdGljIHZvaWQgYWxjODg4XzZzdF9kZWxsX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxNjsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1szXSA9IDB4MTc7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgdm9pZCBhbGM4ODhfbGVub3ZvX3NreV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTY7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbM10gPSAweDE3OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzRdID0gMHgxYTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4M192YWlvdHRfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTc7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF9hc3VzX205MHZfdmVyYnNbXSA9IHsKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCS8qIGVuYWJsZSB1bnNvbGljaXRlZCBldmVudCAqLwotCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfTUlDX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzg4M19tb2RlMl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTY7Ci0Jc3BlYy0+ZXh0X21pYy5waW4gPSAweDE4OwotCXNwZWMtPmludF9taWMucGluID0gMHgxOTsKLQlzcGVjLT5leHRfbWljLm11eF9pZHggPSAwOwotCXNwZWMtPmludF9taWMubXV4X2lkeCA9IDE7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfYXN1c19lZWUxNjAxX3ZlcmJzW10gPSB7Ci0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDIwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDBifSwKLQl7MHgyMCwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAgMHgwODM4fSwKLQkvKiBlbmFibGUgdW5zb2xpY2l0ZWQgZXZlbnQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIHZvaWQgYWxjODgzX2VlZTE2MDFfaW5pdGhvb2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxYjsKLQlhbGNfaHBfYXV0b211dGUoY29kZWMpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OUFfbWIzMV92ZXJic1tdID0gewotCS8qIEluaXQgcmVhciBwaW4gKHVzZWQgYXMgaGVhZHBob25lIG91dHB1dCkgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGM0fSwgICAgLyogQXBwbGUgSGVhZHBob25lcyAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sICAgICAgICAgICAvKiBDb25uZWN0IHRvIGZyb250ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCS8qIEluaXQgbGluZSBwaW4gKHVzZWQgYXMgb3V0cHV0IGluIDRjaCBhbmQgNmNoIG1vZGUpICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwgICAgICAgICAgIC8qIENvbm5lY3QgdG8gQ0xGRSAqLwotCS8qIEluaXQgbGluZSAyIHBpbiAodXNlZCBhcyBoZWFkcGhvbmUgb3V0IGJ5IGRlZmF1bHQpICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwgIC8qIFVzZSBhcyBpbnB1dCAqLwotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LCAvKiBNdXRlIG91dHB1dCAqLwotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIE11dGUgc3BlYWtlcnMgYWNjb3JkaW5nIHRvIHRoZSBoZWFkcGhvbmUgamFjayBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYWxjODg5QV9tYjMxX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXVuc2lnbmVkIGludCBwcmVzZW50OwotCi0JLyogTXV0ZSBvbmx5IGluIDJjaCBvciA0Y2ggbW9kZSAqLwotCWlmIChzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTUsIDAsIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfU0VMLCAwKQotCSAgICA9PSAweDAwKSB7Ci0JCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDE1KTsKLQkJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDE0LCAgSERBX09VVFBVVCwgMCwKLQkJCUhEQV9BTVBfTVVURSwgcHJlc2VudCA/IEhEQV9BTVBfTVVURSA6IDApOwotCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MTYsIEhEQV9PVVRQVVQsIDAsCi0JCQlIREFfQU1QX01VVEUsIHByZXNlbnQgPyBIREFfQU1QX01VVEUgOiAwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4OUFfbWIzMV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlcykKLXsKLQlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX0hQX0VWRU5UKQotCQlhbGM4ODlBX21iMzFfYXV0b211dGUoY29kZWMpOwotfQotCi0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi0jZGVmaW5lIGFsYzg4Ml9sb29wYmFja3MJYWxjODgwX2xvb3BiYWNrcwotI2VuZGlmCi0KLS8qIHBjbSBjb25maWd1cmF0aW9uOiBpZGVudGljYWwgd2l0aCBBTEM4ODAgKi8KLSNkZWZpbmUgYWxjODgyX3BjbV9hbmFsb2dfcGxheWJhY2sJYWxjODgwX3BjbV9hbmFsb2dfcGxheWJhY2sKLSNkZWZpbmUgYWxjODgyX3BjbV9hbmFsb2dfY2FwdHVyZQlhbGM4ODBfcGNtX2FuYWxvZ19jYXB0dXJlCi0jZGVmaW5lIGFsYzg4Ml9wY21fZGlnaXRhbF9wbGF5YmFjawlhbGM4ODBfcGNtX2RpZ2l0YWxfcGxheWJhY2sKLSNkZWZpbmUgYWxjODgyX3BjbV9kaWdpdGFsX2NhcHR1cmUJYWxjODgwX3BjbV9kaWdpdGFsX2NhcHR1cmUKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4ODNfc2xhdmVfZGlnX291dHNbXSA9IHsKLQlBTEMxMjAwX0RJR09VVF9OSUQsIDAsCi19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzEyMDBfc2xhdmVfZGlnX291dHNbXSA9IHsKLQlBTEM4ODNfRElHT1VUX05JRCwgMCwKLX07Ci0KLS8qCi0gKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGM4ODJfbW9kZWxzW0FMQzg4Ml9NT0RFTF9MQVNUXSA9IHsKLQlbQUxDODgyXzNTVF9ESUddCT0gIjNzdGFjay1kaWciLAotCVtBTEM4ODJfNlNUX0RJR10JPSAiNnN0YWNrLWRpZyIsCi0JW0FMQzg4Ml9BUklNQV0JCT0gImFyaW1hIiwKLQlbQUxDODgyX1cySkNdCQk9ICJ3MmpjIiwKLQlbQUxDODgyX1RBUkdBXQkJPSAidGFyZ2EiLAotCVtBTEM4ODJfQVNVU19BN0pdCT0gImFzdXMtYTdqIiwKLQlbQUxDODgyX0FTVVNfQTdNXQk9ICJhc3VzLWE3bSIsCi0JW0FMQzg4NV9NQUNQUk9dCQk9ICJtYWNwcm8iLAotCVtBTEM4ODVfTUI1XQkJPSAibWI1IiwKLQlbQUxDODg1X01BQ01JTkkzXQk9ICJtYWNtaW5pMyIsCi0JW0FMQzg4NV9NQkEyMV0JCT0gIm1iYTIxIiwKLQlbQUxDODg1X01CUDNdCQk9ICJtYnAzIiwKLQlbQUxDODg1X0lNQUMyNF0JCT0gImltYWMyNCIsCi0JW0FMQzg4NV9JTUFDOTFdCQk9ICJpbWFjOTEiLAotCVtBTEM4ODNfM1NUXzJjaF9ESUddCT0gIjNzdGFjay0yY2gtZGlnIiwKLQlbQUxDODgzXzNTVF82Y2hfRElHXQk9ICIzc3RhY2stNmNoLWRpZyIsCi0JW0FMQzg4M18zU1RfNmNoXQk9ICIzc3RhY2stNmNoIiwKLQlbQUxDODgzXzZTVF9ESUddCT0gImFsYzg4My02c3RhY2stZGlnIiwKLQlbQUxDODgzX1RBUkdBX0RJR10JPSAidGFyZ2EtZGlnIiwKLQlbQUxDODgzX1RBUkdBXzJjaF9ESUddCT0gInRhcmdhLTJjaC1kaWciLAotCVtBTEM4ODNfVEFSR0FfOGNoX0RJR10JPSAidGFyZ2EtOGNoLWRpZyIsCi0JW0FMQzg4M19BQ0VSXQkJPSAiYWNlciIsCi0JW0FMQzg4M19BQ0VSX0FTUElSRV0JPSAiYWNlci1hc3BpcmUiLAotCVtBTEM4ODhfQUNFUl9BU1BJUkVfNDkzMEddCT0gImFjZXItYXNwaXJlLTQ5MzBnIiwKLQlbQUxDODg4X0FDRVJfQVNQSVJFXzY1MzBHXQk9ICJhY2VyLWFzcGlyZS02NTMwZyIsCi0JW0FMQzg4OF9BQ0VSX0FTUElSRV84OTMwR10JPSAiYWNlci1hc3BpcmUtODkzMGciLAotCVtBTEM4ODhfQUNFUl9BU1BJUkVfNzczMEddCT0gImFjZXItYXNwaXJlLTc3MzBnIiwKLQlbQUxDODgzX01FRElPTl0JCT0gIm1lZGlvbiIsCi0JW0FMQzg4M19NRURJT05fV0lNMjE2MF0JPSAibWVkaW9uLXdpbTIxNjAiLAotCVtBTEM4ODNfTEFQVE9QX0VBUERdCT0gImxhcHRvcC1lYXBkIiwKLQlbQUxDODgzX0xFTk9WT18xMDFFXzJjaF0gPSAibGVub3ZvLTEwMWUiLAotCVtBTEM4ODNfTEVOT1ZPX05CMDc2M10JPSAibGVub3ZvLW5iMDc2MyIsCi0JW0FMQzg4OF9MRU5PVk9fTVM3MTk1X0RJR10gPSAibGVub3ZvLW1zNzE5NS1kaWciLAotCVtBTEM4ODhfTEVOT1ZPX1NLWV0gPSAibGVub3ZvLXNreSIsCi0JW0FMQzg4M19IQUlFUl9XNjZdIAk9ICJoYWllci13NjYiLAotCVtBTEM4ODhfM1NUX0hQXQkJPSAiM3N0YWNrLWhwIiwKLQlbQUxDODg4XzZTVF9ERUxMXQk9ICI2c3RhY2stZGVsbCIsCi0JW0FMQzg4M19NSVRBQ10JCT0gIm1pdGFjIiwKLQlbQUxDODgzX0NMRVZPX001NDBSXQk9ICJjbGV2by1tNTQwciIsCi0JW0FMQzg4M19DTEVWT19NNzIwXQk9ICJjbGV2by1tNzIwIiwKLQlbQUxDODgzX0ZVSklUU1VfUEkyNTE1XSA9ICJmdWppdHN1LXBpMjUxNSIsCi0JW0FMQzg4OF9GVUpJVFNVX1hBMzUzMF0gPSAiZnVqaXRzdS14YTM1MzAiLAotCVtBTEM4ODNfM1NUXzZjaF9JTlRFTF0JPSAiM3N0YWNrLTZjaC1pbnRlbCIsCi0JW0FMQzg4OUFfSU5URUxdCQk9ICJpbnRlbC1hbGM4ODlhIiwKLQlbQUxDODg5X0lOVEVMXQkJPSAiaW50ZWwteDU4IiwKLQlbQUxDMTIwMF9BU1VTX1A1UV0JPSAiYXN1cy1wNXEiLAotCVtBTEM4ODlBX01CMzFdCQk9ICJtYjMxIiwKLQlbQUxDODgzX1NPTllfVkFJT19UVF0JPSAic29ueS12YWlvLXR0IiwKLQlbQUxDODgyX0FVVE9dCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4ODJfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweDY2NjgsICJFQ1MiLCBBTEM4ODJfNlNUX0RJRyksCi0KLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMDZjLCAiQWNlciBBc3BpcmUgOTgxMCIsIEFMQzg4M19BQ0VSX0FTUElSRSksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA5MCwgIkFjZXIgQXNwaXJlIiwgQUxDODgzX0FDRVJfQVNQSVJFKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTBhLCAiQWNlciBGZXJyYXJpIDUwMDAiLCBBTEM4ODNfQUNFUl9BU1BJUkUpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMTAsICJBY2VyIEFzcGlyZSIsIEFMQzg4M19BQ0VSX0FTUElSRSksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDExMiwgIkFjZXIgQXNwaXJlIDkzMDMiLCBBTEM4ODNfQUNFUl9BU1BJUkUpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMjEsICJBY2VyIEFzcGlyZSA1OTIwRyIsIEFMQzg4M19BQ0VSX0FTUElSRSksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEzZSwgIkFjZXIgQXNwaXJlIDQ5MzBHIiwKLQkJQUxDODg4X0FDRVJfQVNQSVJFXzQ5MzBHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTNmLCAiQWNlciBBc3BpcmUgNTkzMEciLAotCQlBTEM4ODhfQUNFUl9BU1BJUkVfNDkzMEcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxNDUsICJBY2VyIEFzcGlyZSA4OTMwRyIsCi0JCUFMQzg4OF9BQ0VSX0FTUElSRV84OTMwRyksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDE0NiwgIkFjZXIgQXNwaXJlIDY5MzVHIiwKLQkJQUxDODg4X0FDRVJfQVNQSVJFXzg5MzBHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTU3LCAiQWNlciBYMzIwMCIsIEFMQzg4Ml9BVVRPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTU4LCAiQWNlciBBWDE3MDAtVTM3MDBBIiwgQUxDODgyX0FVVE8pLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxNWUsICJBY2VyIEFzcGlyZSA2OTMwRyIsCi0JCUFMQzg4OF9BQ0VSX0FTUElSRV82NTMwRyksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDE2NiwgIkFjZXIgQXNwaXJlIDY1MzBHIiwKLQkJQUxDODg4X0FDRVJfQVNQSVJFXzY1MzBHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTQyLCAiQWNlciBBc3BpcmUgNzczMEciLAotCQlBTEM4ODhfQUNFUl9BU1BJUkVfNzczMEcpLAotCS8qIGRlZmF1bHQgQWNlciAtLSBkaXNhYmxlZCBhcyBpdCBjYXVzZXMgbW9yZSBwcm9ibGVtcy4KLQkgKiAgICBtb2RlbD1hdXRvIHNob3VsZCB3b3JrIGZpbmUgbm93Ci0JICovCi0JLyogU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxMDI1LCAiQWNlciBsYXB0b3AiLCBBTEM4ODNfQUNFUiksICovCi0KLQlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMjBkLCAiRGVsbCBJbnNwaXJvbiA1MzAiLCBBTEM4ODhfNlNUX0RFTEwpLAotCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmEzZCwgIkhQIFBhdmlsaW9uIiwgQUxDODgzXzZTVF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDJhNGYsICJIUCBTYW1iYSIsIEFMQzg4OF8zU1RfSFApLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDJhNjAsICJIUCBMdWNrbm93IiwgQUxDODg4XzNTVF9IUCksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmE2MSwgIkhQIE5ldHRsZSIsIEFMQzg4M182U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyYTY2LCAiSFAgQWNhY2lhIiwgQUxDODg4XzNTVF9IUCksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmE3MiwgIkhQIEVkdWMuYXIiLCBBTEM4ODhfM1NUX0hQKSwKLQotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDA2MGQsICJBc3VzIEE3SiIsIEFMQzg4Ml9BU1VTX0E3SiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTI0MywgIkFzdXMgQTdKIiwgQUxDODgyX0FTVVNfQTdKKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2MyLCAiQXN1cyBBN00iLCBBTEM4ODJfQVNVU19BN00pLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NzMsICJBc3VzIE05MFYiLCBBTEM4ODhfQVNVU19NOTBWKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTcxLCAiQXN1cyBXMkpDIiwgQUxDODgyX1cySkMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxN2YsICJBc3VzIFA1TEQyIiwgQUxDODgyXzZTVF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxZDgsICJBc3VzIFA1V0QiLCBBTEM4ODJfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODI0OSwgIkFzdXMgTTJBLVZNIEhETUkiLCBBTEM4ODNfM1NUXzZjaF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgyODQsICJBc3VzIFozN0UiLCBBTEM4ODNfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODJmZSwgIkFzdXMgUDVRLUVNIEhETUkiLCBBTEMxMjAwX0FTVVNfUDVRKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MzVmLCAiQXN1cyBFZWUgMTYwMSIsIEFMQzg4OF9BU1VTX0VFRTE2MDEpLAotCi0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTA0NywgIlNvbnkgVmFpbyBUVCIsIEFMQzg4M19TT05ZX1ZBSU9fVFQpLAotCVNORF9QQ0lfUVVJUksoMHgxMDViLCAweDBjZTgsICJGb3hjb25uIFAzNUFYLVMiLCBBTEM4ODNfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwNWIsIDB4NjY2OCwgIkZveGNvbm4iLCBBTEM4ODJfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwNzEsIDB4ODIyNywgIk1pdGFjIDgyODAxSCIsIEFMQzg4M19NSVRBQyksCi0JU05EX1BDSV9RVUlSSygweDEwNzEsIDB4ODI1MywgIk1pdGFjIDgyNTJkIiwgQUxDODgzX01JVEFDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA3MSwgMHg4MjU4LCAiRXZlc2hhbSBWb3lhZWdlciIsIEFMQzg4M19MQVBUT1BfRUFQRCksCi0JU05EX1BDSV9RVUlSSygweDEwZjEsIDB4MjM1MCwgIlRZQU4tUzIzNTAiLCBBTEM4ODhfNlNUX0RFTEwpLAotCVNORF9QQ0lfUVVJUksoMHgxMDhlLCAweDUzNGQsIE5VTEwsIEFMQzg4M18zU1RfNmNoKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ1OCwgMHhhMDAyLCAiR2lnYWJ5dGUgUDM1IERTM1IiLCBBTEM4ODJfNlNUX0RJRyksCi0KLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgwMzQ5LCAiTVNJIiwgQUxDODgzX1RBUkdBXzJjaF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDA0MGQsICJNU0kiLCBBTEM4ODNfVEFSR0FfMmNoX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4MDU3OSwgIk1TSSIsIEFMQzg4M19UQVJHQV8yY2hfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgyOGZiLCAiVGFyZ2EgVDgiLCBBTEM4ODJfVEFSR0EpLCAvKiBNU0ktMTA0OSBUOCAgKi8KLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgyZmIzLCAiTVNJIiwgQUxDODgyX0FVVE8pLAotCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDY2NjgsICJNU0kiLCBBTEM4ODJfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4MzcyOSwgIk1TSSBTNDIwIiwgQUxDODgzX1RBUkdBX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4Mzc4MywgIk5FQyBTOTcwIiwgQUxDODgzX1RBUkdBX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4M2I3ZiwgIk1TSSIsIEFMQzg4M19UQVJHQV8yY2hfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgzZWY5LCAiTVNJIiwgQUxDODgzX1RBUkdBX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4M2ZjMSwgIk1TSSIsIEFMQzg4M19UQVJHQV9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDNmYzMsICJNU0kiLCBBTEM4ODNfVEFSR0FfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgzZmNjLCAiTVNJIiwgQUxDODgzX1RBUkdBX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4M2ZkZiwgIk1TSSIsIEFMQzg4M19UQVJHQV9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDQyY2QsICJNU0kiLCBBTEM4ODNfVEFSR0FfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg0MzE0LCAiTVNJIiwgQUxDODgzX1RBUkdBX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NDMxOSwgIk1TSSIsIEFMQzg4M19UQVJHQV9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDQzMjQsICJNU0kiLCBBTEM4ODNfVEFSR0FfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg0NTcwLCAiTVNJIFdpbmQgVG9wIEFFMjIyMCIsIEFMQzg4M19UQVJHQV9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDY1MTAsICJNU0kgR1g2MjAiLCBBTEM4ODNfVEFSR0FfOGNoX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NjY2OCwgIk1TSSIsIEFMQzg4M182U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3MTg3LCAiTVNJIiwgQUxDODgzXzZTVF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDcyNTAsICJNU0kiLCBBTEM4ODNfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzI2MCwgIk1TSSA3MjYwIiwgQUxDODgzX1RBUkdBX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzI2NywgIk1TSSIsIEFMQzg4M18zU1RfNmNoX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzI4MCwgIk1TSSIsIEFMQzg4M182U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3MzI3LCAiTVNJIiwgQUxDODgzXzZTVF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDczNTAsICJNU0kiLCBBTEM4ODNfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzQzNywgIk1TSSBOZXRPbiBBUDE5MDAiLCBBTEM4ODNfVEFSR0FfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHhhNDIyLCAiTVNJIiwgQUxDODgzX1RBUkdBXzJjaF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweGFhMDgsICJNU0kiLCBBTEM4ODNfVEFSR0FfMmNoX0RJRyksCi0KLQlTTkRfUENJX1FVSVJLKDB4MTQ3YiwgMHgxMDgzLCAiQWJpdCBJUDM1LVBSTyIsIEFMQzg4M182U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTU1OCwgMHgwNTcxLCAiQ2xldm8gbGFwdG9wIE01NzBVIiwgQUxDODgzXzNTVF82Y2hfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTU1OCwgMHgwNzIxLCAiQ2xldm8gbGFwdG9wIE03MjBSIiwgQUxDODgzX0NMRVZPX003MjApLAotCVNORF9QQ0lfUVVJUksoMHgxNTU4LCAweDA3MjIsICJDbGV2byBsYXB0b3AgTTcyMFNSIiwgQUxDODgzX0NMRVZPX003MjApLAotCVNORF9QQ0lfUVVJUksoMHgxNTU4LCAweDU0MDksICJDbGV2byBsYXB0b3AgTTU0MFIiLCBBTEM4ODNfQ0xFVk9fTTU0MFIpLAotCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTU1OCwgIkNsZXZvIGxhcHRvcCIsIEFMQzg4M19MQVBUT1BfRUFQRCksCi0JU05EX1BDSV9RVUlSSygweDE1ZDksIDB4ODc4MCwgIlN1cGVybWljcm8gUERTQkEiLCBBTEM4ODNfM1NUXzZjaCksCi0JLyogU05EX1BDSV9RVUlSSygweDE2MWYsIDB4MjA1NCwgIkFyaW1hIFc4MjAiLCBBTEM4ODJfQVJJTUEpLCAqLwotCVNORF9QQ0lfUVVJUksoMHgxNjFmLCAweDIwNTQsICJNZWRpb24gbGFwdG9wIiwgQUxDODgzX01FRElPTiksCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTczNCwgMHhmZmYwLCAweDExMDAsICJGU0MgQU1JTE8gWGkvUGkyNXh4IiwKLQkJICAgICAgQUxDODgzX0ZVSklUU1VfUEkyNTE1KSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxNzM0LCAweGZmZjAsIDB4MTEzMCwgIkZ1aml0c3UgQU1JTE8gWGEzNXh4IiwKLQkJQUxDODg4X0ZVSklUU1VfWEEzNTMwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgxMDFlLCAiTGVub3ZvIDEwMWUiLCBBTEM4ODNfTEVOT1ZPXzEwMUVfMmNoKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMDg1LCAiTGVub3ZvIE5CMDc2MyIsIEFMQzg4M19MRU5PVk9fTkIwNzYzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYmZjLCAiTGVub3ZvIE5CMDc2MyIsIEFMQzg4M19MRU5PVk9fTkIwNzYzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYmZkLCAiTGVub3ZvIE5CMDc2MyIsIEFMQzg4M19MRU5PVk9fTkIwNzYzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgxMDFkLCAiTGVub3ZvIFNreSIsIEFMQzg4OF9MRU5PVk9fU0tZKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdjMCwgMHg0MDg1LCAiTUVESU9OIE1EOTY2MzAiLCBBTEM4ODhfTEVOT1ZPX01TNzE5NV9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxN2YyLCAweDUwMDAsICJBbGJhdHJvbiBLSTY5MC1BTTIiLCBBTEM4ODNfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE5OTEsIDB4NTYyNSwgIkhhaWVyIFc2NiIsIEFMQzg4M19IQUlFUl9XNjYpLAotCi0JU05EX1BDSV9RVUlSSygweDgwODYsIDB4MDAwMSwgIkRHMzNCVUMiLCBBTEM4ODNfM1NUXzZjaF9JTlRFTCksCi0JU05EX1BDSV9RVUlSSygweDgwODYsIDB4MDAwMiwgIkRHMzNGQkMiLCBBTEM4ODNfM1NUXzZjaF9JTlRFTCksCi0JU05EX1BDSV9RVUlSSygweDgwODYsIDB4MjUwMywgIjgyODAxSCIsIEFMQzg4M19NSVRBQyksCi0JU05EX1BDSV9RVUlSSygweDgwODYsIDB4MDAyMiwgIkRYNThTTyIsIEFMQzg4OV9JTlRFTCksCi0JU05EX1BDSV9RVUlSSygweDgwODYsIDB4MDAyMSwgIkludGVsIEliZXhQZWFrIiwgQUxDODg5QV9JTlRFTCksCi0JU05EX1BDSV9RVUlSSygweDgwODYsIDB4M2I1NiwgIkludGVsIEliZXhQZWFrIiwgQUxDODg5QV9JTlRFTCksCi0JU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDYwMSwgIkQxMDJHR0MiLCBBTEM4ODJfNlNUX0RJRyksCi0KLQl7fQotfTsKLQotLyogY29kZWMgU1NJRCB0YWJsZSBmb3IgSW50ZWwgTWFjICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODgyX3NzaWRfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDAwYTAsICJNYWNCb29rUHJvIDMsMSIsIEFMQzg4NV9NQlAzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgwMGExLCAiTWFjYm9vayIsIEFMQzg4NV9NQlAzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgwMGE0LCAiTWFjYm9va1BybyA0LDEiLCBBTEM4ODVfTUJQMyksCi0JU05EX1BDSV9RVUlSSygweDEwNmIsIDB4MGMwMCwgIk1hYyBQcm8iLCBBTEM4ODVfTUFDUFJPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgxMDAwLCAiaU1hYyAyNCIsIEFMQzg4NV9JTUFDMjQpLAotCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDI4MDAsICJBcHBsZVRWIiwgQUxDODg1X0lNQUMyNCksCi0JU05EX1BDSV9RVUlSSygweDEwNmIsIDB4MmMwMCwgIk1hY2Jvb2tQcm8gcmV2MyIsIEFMQzg4NV9NQlAzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzMDAwLCAiaU1hYyIsIEFMQzg4OUFfTUIzMSksCi0JU05EX1BDSV9RVUlSSygweDEwNmIsIDB4MzIwMCwgImlNYWMgNywxIEFsdW1pbnVtIiwgQUxDODgyX0FTVVNfQTdNKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzNDAwLCAiTWFjQm9va0FpciAxLDEiLCBBTEM4ODVfTUJQMyksCi0JU05EX1BDSV9RVUlSSygweDEwNmIsIDB4MzUwMCwgIk1hY0Jvb2tBaXIgMiwxIiwgQUxDODg1X01CQTIxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzNjAwLCAiTWFjYm9vayAzLDEiLCBBTEM4ODlBX01CMzEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDM4MDAsICJNYWNib29rUHJvIDQsMSIsIEFMQzg4NV9NQlAzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA2YiwgMHgzZTAwLCAiaU1hYyAyNCBBbHVtaW51bSIsIEFMQzg4NV9JTUFDMjQpLAotCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDQ5MDAsICJpTWFjIDksMSBBbHVtaW51bSIsIEFMQzg4NV9JTUFDOTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDNmMDAsICJNYWNib29rIDUsMSIsIEFMQzg4NV9NQjUpLAotCVNORF9QQ0lfUVVJUksoMHgxMDZiLCAweDRhMDAsICJNYWNib29rIDUsMiIsIEFMQzg4NV9NQjUpLAotCS8qIEZJWE1FOiBIUCBqYWNrIHNlbnNlIHNlZW1zIG5vdCB3b3JraW5nIGZvciBNQlAgNSwxIG9yIDUsMiwKLQkgKiBzbyBhcHBhcmVudGx5IG5vIHBlcmZlY3Qgc29sdXRpb24geWV0Ci0JICovCi0JU05EX1BDSV9RVUlSSygweDEwNmIsIDB4NDAwMCwgIk1hY2Jvb2tQcm8gNSwxIiwgQUxDODg1X01CNSksCi0JU05EX1BDSV9RVUlSSygweDEwNmIsIDB4NDYwMCwgIk1hY2Jvb2tQcm8gNSwyIiwgQUxDODg1X01CNSksCi0JU05EX1BDSV9RVUlSSygweDEwNmIsIDB4NDEwMCwgIk1hY21pbmkgMywxIiwgQUxDODg1X01BQ01JTkkzKSwKLQl7fSAvKiB0ZXJtaW5hdG9yICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzg4Ml9wcmVzZXRzW10gPSB7Ci0JW0FMQzg4Ml8zU1RfRElHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgyX2Jhc2VfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4Ml9iYXNlX2luaXRfdmVyYnMsCi0JCQkJYWxjODgyX2FkYzFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgyX0RJR09VVF9OSUQsCi0JCS5kaWdfaW5fbmlkID0gQUxDODgyX0RJR0lOX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4Ml9jaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODJfY2hfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4ODJfNlNUX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4Ml9iYXNlX21peGVyLCBhbGM4ODJfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODJfYmFzZV9pbml0X3ZlcmJzLAotCQkJCWFsYzg4Ml9hZGMxX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4Ml9ESUdPVVRfTklELAotCQkuZGlnX2luX25pZCA9IEFMQzg4Ml9ESUdJTl9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODJfc2l4c3RhY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgyX3NpeHN0YWNrX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4ODJfQVJJTUFdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODJfYmFzZV9taXhlciwgYWxjODgyX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgyX2Jhc2VfaW5pdF92ZXJicywgYWxjODgyX2FkYzFfaW5pdF92ZXJicywKLQkJCQlhbGM4ODJfZWFwZF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4Ml9zaXhzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODJfc2l4c3RhY2tfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgyX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg4Ml9XMkpDXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgyX3cyamNfbWl4ZXIsIGFsYzg4Ml9jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4Ml9iYXNlX2luaXRfdmVyYnMsIGFsYzg4Ml9hZGMxX2luaXRfdmVyYnMsCi0JCQkJYWxjODgyX2VhcGRfdmVyYnMsIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3RocmVlc3RhY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3RocmVlc3RhY2tfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgyX0RJR09VVF9OSUQsCi0JfSwKLQkgICBbQUxDODg1X01CQTIxXSA9IHsKLQkJCS5taXhlcnMgPSB7IGFsYzg4NV9tYmEyMV9taXhlciB9LAotCQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4NV9tYmEyMV9pbml0X3ZlcmJzLCBhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicyB9LAotCQkJLm51bV9kYWNzID0gMiwKLQkJCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKLQkJCS5jaGFubmVsX21vZGUgPSBhbGM4ODVfbWJhMjFfY2hfbW9kZXMsCi0JCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODg1X21iYTIxX2NoX21vZGVzKSwKLQkJCS5pbnB1dF9tdXggPSAmYWxjODgyX2NhcHR1cmVfc291cmNlLAotCQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJCS5zZXR1cCA9IGFsYzg4NV9tYmEyMV9zZXR1cCwKLQkJCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0gICAgICAgfSwKLQlbQUxDODg1X01CUDNdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODVfbWJwM19taXhlciwgYWxjODgyX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODg1X21icDNfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSAyLAotCQkuZGFjX25pZHMgPSBhbGM4ODJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDA0LAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODg1X21icF80Y2hfbW9kZXMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODVfbWJwXzRjaF9tb2RlcyksCi0JCS5pbnB1dF9tdXggPSAmYWxjODgyX2NhcHR1cmVfc291cmNlLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODJfRElHT1VUX05JRCwKLQkJLmRpZ19pbl9uaWQgPSBBTEM4ODJfRElHSU5fTklELAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4ODVfbWJwM19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4ODVfTUI1XSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODg1X21iNV9taXhlciwgYWxjODgyX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODg1X21iNV9pbml0X3ZlcmJzLAotCQkJCWFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgyX2RhY19uaWRzLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODg1X21iNV82Y2hfbW9kZXMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODVfbWI1XzZjaF9tb2RlcyksCi0JCS5pbnB1dF9tdXggPSAmbWI1X2NhcHR1cmVfc291cmNlLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODJfRElHT1VUX05JRCwKLQkJLmRpZ19pbl9uaWQgPSBBTEM4ODJfRElHSU5fTklELAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4ODVfbWI1X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAotCX0sCi0JW0FMQzg4NV9NQUNNSU5JM10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4NV9tYWNtaW5pM19taXhlciwgYWxjODgyX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODg1X21hY21pbmkzX2luaXRfdmVyYnMsCi0JCQkJYWxjODgwX2dwaW8xX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODJfZGFjX25pZHMsCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODVfbWFjbWluaTNfNmNoX21vZGVzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODg1X21hY21pbmkzXzZjaF9tb2RlcyksCi0JCS5pbnB1dF9tdXggPSAmbWFjbWluaTNfY2FwdHVyZV9zb3VyY2UsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4Ml9ESUdPVVRfTklELAotCQkuZGlnX2luX25pZCA9IEFMQzg4Ml9ESUdJTl9OSUQsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg4NV9tYWNtaW5pM19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4ODVfTUFDUFJPXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgyX21hY3Byb19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgyX21hY3Byb19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODJfRElHT1VUX05JRCwKLQkJLmRpZ19pbl9uaWQgPSBBTEM4ODJfRElHSU5fTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgyX2NoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4Ml9jaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODJfY2FwdHVyZV9zb3VyY2UsCi0JCS5pbml0X2hvb2sgPSBhbGM4ODVfbWFjcHJvX2luaXRfaG9vaywKLQl9LAotCVtBTEM4ODVfSU1BQzI0XSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODg1X2ltYWMyNF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODg1X2ltYWMyNF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODJfRElHT1VUX05JRCwKLQkJLmRpZ19pbl9uaWQgPSBBTEM4ODJfRElHSU5fTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgyX2NoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4Ml9jaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODJfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg4NV9pbWFjMjRfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGM4ODVfaW1hYzI0X2luaXRfaG9vaywKLQl9LAotCVtBTEM4ODVfSU1BQzkxXSA9IHsKLQkJLm1peGVycyA9IHthbGM4ODVfaW1hYzkxX21peGVyfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4NV9pbWFjOTFfaW5pdF92ZXJicywKLQkJCQlhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4NV9tYmEyMV9jaF9tb2RlcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4NV9tYmEyMV9jaF9tb2RlcyksCi0JCS5pbnB1dF9tdXggPSAmYWxjODg5QV9pbWFjOTFfY2FwdHVyZV9zb3VyY2UsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4Ml9ESUdPVVRfTklELAotCQkuZGlnX2luX25pZCA9IEFMQzg4Ml9ESUdJTl9OSUQsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg4NV9pbWFjOTFfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0JfSwKLQlbQUxDODgyX1RBUkdBXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgyX3RhcmdhX21peGVyLCBhbGM4ODJfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODJfYmFzZV9pbml0X3ZlcmJzLCBhbGM4ODJfYWRjMV9pbml0X3ZlcmJzLAotCQkJCWFsYzg4MF9ncGlvM19pbml0X3ZlcmJzLCBhbGM4ODJfdGFyZ2FfdmVyYnN9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgyX0RJR09VVF9OSUQsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4Ml9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg4Ml9hZGNfbmlkcywKLQkJLmNhcHNyY19uaWRzID0gYWxjODgyX2NhcHNyY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgyXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgyXzNTVF82Y2hfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODgyX3RhcmdhX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjODgyX3RhcmdhX2F1dG9tdXRlLAotCX0sCi0JW0FMQzg4Ml9BU1VTX0E3Sl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4Ml9hc3VzX2E3al9taXhlciwgYWxjODgyX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgyX2Jhc2VfaW5pdF92ZXJicywgYWxjODgyX2FkYzFfaW5pdF92ZXJicywKLQkJCQlhbGM4ODJfYXN1c19hN2pfdmVyYnN9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgyX0RJR09VVF9OSUQsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4Ml9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg4Ml9hZGNfbmlkcywKLQkJLmNhcHNyY19uaWRzID0gYWxjODgyX2NhcHNyY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgyXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgyXzNTVF82Y2hfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4ODJfQVNVU19BN01dID0gewotCQkubWl4ZXJzID0geyBhbGM4ODJfYXN1c19hN21fbWl4ZXIsIGFsYzg4Ml9jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4Ml9iYXNlX2luaXRfdmVyYnMsIGFsYzg4Ml9hZGMxX2luaXRfdmVyYnMsCi0JCQkJYWxjODgyX2VhcGRfdmVyYnMsIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzLAotCQkJCWFsYzg4Ml9hc3VzX2E3bV92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfdGhyZWVzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfdGhyZWVzdGFja19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgyX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg4M18zU1RfMmNoX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4M18zU1RfMmNoX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCi0JCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4ODNfM1NUXzZjaF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM4ODNfM1NUXzZjaF9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAotCQkuZGlnX2luX25pZCA9IEFMQzg4M19ESUdJTl9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzZjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzZjaF9tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg4M18zU1RfNmNoXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzXzNTVF82Y2hfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF82Y2hfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4ODNfM1NUXzZjaF9JTlRFTF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4M18zU1RfNmNoX2ludGVsX21peGVyLCBhbGM4ODNfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCi0JCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKLQkJLnNsYXZlX2RpZ19vdXRzID0gYWxjODgzX3NsYXZlX2RpZ19vdXRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF82Y2hfaW50ZWxfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF82Y2hfaW50ZWxfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4M18zc3RhY2tfNmNoX2ludGVsLAotCX0sCi0JW0FMQzg4OUFfSU5URUxdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODVfOGNoX2ludGVsX21peGVyLCBhbGM4ODNfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODVfaW5pdF92ZXJicywgYWxjODg1X2luaXRfaW5wdXRfdmVyYnMsCi0JCQkJYWxjX2hwMTVfdW5zb2xfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4OV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg4OV9hZGNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCi0JCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKLQkJLnNsYXZlX2RpZ19vdXRzID0gYWxjODgzX3NsYXZlX2RpZ19vdXRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODg5XzhjaF9pbnRlbF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODlfOGNoX2ludGVsX21vZGVzLAotCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODlfY2Fwc3JjX25pZHMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODg5X2NhcHR1cmVfc291cmNlLAotCQkuc2V0dXAgPSBhbGM4ODlfYXV0b211dGVfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCX0sCi0JW0FMQzg4OV9JTlRFTF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4NV84Y2hfaW50ZWxfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4NV9pbml0X3ZlcmJzLCBhbGM4ODlfaW5pdF9pbnB1dF92ZXJicywKLQkJCQlhbGM4ODlfZWFwZF92ZXJicywgYWxjX2hwMTVfdW5zb2xfdmVyYnN9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODg5X2FkY19uaWRzKSwKLQkJLmFkY19uaWRzID0gYWxjODg5X2FkY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKLQkJLmRpZ19pbl9uaWQgPSBBTEM4ODNfRElHSU5fTklELAotCQkuc2xhdmVfZGlnX291dHMgPSBhbGM4ODNfc2xhdmVfZGlnX291dHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODlfOGNoX2ludGVsX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4OV84Y2hfaW50ZWxfbW9kZXMsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzg4OV9jYXBzcmNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODlfY2FwdHVyZV9zb3VyY2UsCi0JCS5zZXR1cCA9IGFsYzg4OV9hdXRvbXV0ZV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsYzg4OV9pbnRlbF9pbml0X2hvb2ssCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCX0sCi0JW0FMQzg4M182U1RfRElHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzX2Jhc2VfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKLQkJLmRpZ19pbl9uaWQgPSBBTEM4ODNfRElHSU5fTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzX3NpeHN0YWNrX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M19zaXhzdGFja19tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODgzX1RBUkdBX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4M190YXJnYV9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4MF9ncGlvM19pbml0X3ZlcmJzLAotCQkJCWFsYzg4M190YXJnYV92ZXJic30sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfNmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfNmNoX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsYzg4M190YXJnYV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODgyX3RhcmdhX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjODgyX3RhcmdhX2F1dG9tdXRlLAotCX0sCi0JW0FMQzg4M19UQVJHQV8yY2hfRElHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzX3RhcmdhXzJjaF9taXhlcn0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgwX2dwaW8zX2luaXRfdmVyYnMsCi0JCQkJYWxjODgzX3RhcmdhX3ZlcmJzfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5hZGNfbmlkcyA9IGFsYzg4M19hZGNfbmlkc19hbHQsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkc19hbHQpLAotCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGM4ODNfdGFyZ2FfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg4Ml90YXJnYV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsYzg4Ml90YXJnYV9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4ODNfVEFSR0FfOGNoX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4M190YXJnYV9taXhlciwgYWxjODgzX3RhcmdhXzhjaF9taXhlciwKLQkJCSAgICBhbGM4ODNfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgwX2dwaW8zX2luaXRfdmVyYnMsCi0JCQkJYWxjODgzX3RhcmdhX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODNfYWRjX25pZHNfcmV2KSwKLQkJLmFkY19uaWRzID0gYWxjODgzX2FkY19uaWRzX3JldiwKLQkJLmNhcHNyY19uaWRzID0gYWxjODgzX2NhcHNyY19uaWRzX3JldiwKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCi0JCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M180U1RfOGNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M180U1RfOGNoX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsYzg4M190YXJnYV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODgyX3RhcmdhX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjODgyX3RhcmdhX2F1dG9tdXRlLAotCX0sCi0JW0FMQzg4M19BQ0VSXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzX2Jhc2VfbWl4ZXIgfSwKLQkJLyogT24gVHJhdmVsTWF0ZSBsYXB0b3BzLCBHUElPIDAgZW5hYmxlcyB0aGUgaW50ZXJuYWwgc3BlYWtlcgotCQkgKiBhbmQgdGhlIGhlYWRwaG9uZSBqYWNrLiAgVHVybiB0aGlzIG9uIGFuZCByZWx5IG9uIHRoZQotCQkgKiBzdGFuZGFyZCBtdXRlIG1ldGhvZHMgd2hlbmV2ZXIgdGhlIHVzZXIgd2FudHMgdG8gdHVybgotCQkgKiB0aGVzZSBvdXRwdXRzIG9mZi4KLQkJICovCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgwX2dwaW8xX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODgzX0FDRVJfQVNQSVJFXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzX2FjZXJfYXNwaXJlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgzX2FjZXJfZWFwZF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg4M19hY2VyX2FzcGlyZV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4ODhfQUNFUl9BU1BJUkVfNDkzMEddID0gewotCQkubWl4ZXJzID0geyBhbGM4ODhfYWNlcl9hc3BpcmVfNDkzMGdfbWl4ZXIsCi0JCQkJYWxjODgzX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzLAotCQkJCWFsYzg4OF9hY2VyX2FzcGlyZV80OTMwZ192ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODgzX2FkY19uaWRzX3JldiksCi0JCS5hZGNfbmlkcyA9IGFsYzg4M19hZGNfbmlkc19yZXYsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzg4M19jYXBzcmNfbmlkc19yZXYsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF82Y2hfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuY29uc3RfY2hhbm5lbF9jb3VudCA9IDYsCi0JCS5udW1fbXV4X2RlZnMgPQotCQkJQVJSQVlfU0laRShhbGM4ODhfMl9jYXB0dXJlX3NvdXJjZXMpLAotCQkuaW5wdXRfbXV4ID0gYWxjODg4XzJfY2FwdHVyZV9zb3VyY2VzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4ODhfYWNlcl9hc3BpcmVfNDkzMGdfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0JfSwKLQlbQUxDODg4X0FDRVJfQVNQSVJFXzY1MzBHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODg4X2FjZXJfYXNwaXJlXzY1MzBfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicywKLQkJCQlhbGM4ODhfYWNlcl9hc3BpcmVfNjUzMGdfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkc19yZXYpLAotCQkuYWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHNfcmV2LAotCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHNfcmV2LAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAotCQkubnVtX211eF9kZWZzID0KLQkJCUFSUkFZX1NJWkUoYWxjODg4XzJfY2FwdHVyZV9zb3VyY2VzKSwKLQkJLmlucHV0X211eCA9IGFsYzg4OF9hY2VyX2FzcGlyZV82NTMwX3NvdXJjZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg4OF9hY2VyX2FzcGlyZV82NTMwZ19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4ODhfQUNFUl9BU1BJUkVfODkzMEddID0gewotCQkubWl4ZXJzID0geyBhbGM4ODlfYWNlcl9hc3BpcmVfODkzMGdfbWl4ZXIsCi0JCQkJYWxjODgzX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzLAotCQkJCWFsYzg4OV9hY2VyX2FzcGlyZV84OTMwZ192ZXJicywKLQkJCQlhbGM4ODlfZWFwZF92ZXJic30sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODlfYWRjX25pZHMpLAotCQkuYWRjX25pZHMgPSBhbGM4ODlfYWRjX25pZHMsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzg4OV9jYXBzcmNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzZjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzZjaF9tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5jb25zdF9jaGFubmVsX2NvdW50ID0gNiwKLQkJLm51bV9tdXhfZGVmcyA9Ci0JCQlBUlJBWV9TSVpFKGFsYzg4OV9jYXB0dXJlX3NvdXJjZXMpLAotCQkuaW5wdXRfbXV4ID0gYWxjODg5X2NhcHR1cmVfc291cmNlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODg5X2FjZXJfYXNwaXJlXzg5MzBnX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLQkJLnBvd2VyX2hvb2sgPSBhbGNfcG93ZXJfZWFwZCwKLSNlbmRpZgotCX0sCi0JW0FMQzg4OF9BQ0VSX0FTUElSRV83NzMwR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4M18zU1RfNmNoX21peGVyLAotCQkJCWFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicywKLQkJCQlhbGM4ODhfYWNlcl9hc3BpcmVfNzczMEdfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkc19yZXYpLAotCQkuYWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHNfcmV2LAotCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHNfcmV2LAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfNmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfNmNoX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLmNvbnN0X2NoYW5uZWxfY291bnQgPSA2LAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODg4X2FjZXJfYXNwaXJlXzc3MzBnX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAotCX0sCi0JW0FMQzg4M19NRURJT05dID0gewotCQkubWl4ZXJzID0geyBhbGM4ODNfZml2ZXN0YWNrX21peGVyLAotCQkJICAgIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLAotCQkJCWFsYzg4M19tZWRpb25fZWFwZF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLmFkY19uaWRzID0gYWxjODgzX2FkY19uaWRzX2FsdCwKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODgzX2FkY19uaWRzX2FsdCksCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzg4M19jYXBzcmNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M19zaXhzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfc2l4c3RhY2tfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg4M19NRURJT05fV0lNMjE2MF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4M19tZWRpb25fd2ltMjE2MF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4M19tZWRpb25fd2ltMjE2MF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg4M19hZGNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODgzX21lZGlvbl93aW0yMTYwX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAotCX0sCi0JW0FMQzg4M19MQVBUT1BfRUFQRF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4M19iYXNlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgyX2VhcGRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODgzX0NMRVZPX001NDBSXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzXzNTVF82Y2hfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODNfY2xldm9fbTU0MHJfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAotCQkuZGlnX2luX25pZCA9IEFMQzg4M19ESUdJTl9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzZjaF9jbGV2b19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzZjaF9jbGV2b19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAotCQkvKiBUaGlzIG1hY2hpbmUgaGFzIHRoZSBoYXJkd2FyZSBIUCBhdXRvLW11dGluZywgdGh1cwotCQkgKiB3ZSBuZWVkIG5vIHNvZnR3YXJlIG11dGUgdmlhIHVuc29sIGV2ZW50Ci0JCSAqLwotCX0sCi0JW0FMQzg4M19DTEVWT19NNzIwXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzX2NsZXZvX203MjBfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODNfY2xldm9fbTcyMF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsYzg4M19jbGV2b19tNzIwX3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4ODNfY2xldm9fbTcyMF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsYzg4M19jbGV2b19tNzIwX2luaXRfaG9vaywKLQl9LAotCVtBTEM4ODNfTEVOT1ZPXzEwMUVfMmNoXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzX2xlbm92b18xMDFlXzJjaF9taXhlcn0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgzX2xlbm92b18xMDFlX3ZlcmJzfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5hZGNfbmlkcyA9IGFsYzg4M19hZGNfbmlkc19hbHQsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkc19hbHQpLAotCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfbGVub3ZvXzEwMWVfY2FwdHVyZV9zb3VyY2UsCi0JCS5zZXR1cCA9IGFsYzg4M19sZW5vdm9fMTAxZV9zZXR1cCwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM4ODNfTEVOT1ZPX05CMDc2M10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4M19sZW5vdm9fbmIwNzYzX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgzX2xlbm92b19uYjA3NjNfdmVyYnN9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfbGVub3ZvX25iMDc2M19jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODgzX2xlbm92b19uYjA3NjNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0JfSwKLQlbQUxDODg4X0xFTk9WT19NUzcxOTVfRElHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzXzNTVF82Y2hfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODhfbGVub3ZvX21zNzE5NV92ZXJic30sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfNmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfNmNoX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg4OF9sZW5vdm9fbXM3MTk1X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzg4M19IQUlFUl9XNjZdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODNfdGFyZ2FfMmNoX21peGVyfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODNfaGFpZXJfdzY2X3ZlcmJzfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4ODNfaGFpZXJfdzY2X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAotCX0sCi0JW0FMQzg4OF8zU1RfSFBdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODNfM1NUXzZjaF9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4OF8zc3RfaHBfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODhfM3N0X2hwX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4OF8zc3RfaHBfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODg4XzNzdF9ocF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4ODhfNlNUX0RFTExdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODNfYmFzZV9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4OF82c3RfZGVsbF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCi0JCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M19zaXhzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfc2l4c3RhY2tfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4ODhfNnN0X2RlbGxfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0JfSwKLQlbQUxDODgzX01JVEFDXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzX21pdGFjX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgzX21pdGFjX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4ODNfbWl0YWNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0JfSwKLQlbQUxDODgzX0ZVSklUU1VfUEkyNTE1XSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzXzJjaF9mdWppdHN1X3BpMjUxNV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsCi0JCQkJYWxjODgzXzJjaF9mdWppdHN1X3BpMjUxNV92ZXJic30sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19mdWppdHN1X3BpMjUxNV9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODgzXzJjaF9mdWppdHN1X3BpMjUxNV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4ODhfRlVKSVRTVV9YQTM1MzBdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODhfYmFzZV9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsCi0JCQlhbGM4ODhfZnVqaXRzdV94YTM1MzBfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkc19yZXYpLAotCQkuYWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHNfcmV2LAotCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHNfcmV2LAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4OF80U1RfOGNoX2ludGVsX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4OF80U1RfOGNoX2ludGVsX21vZGVzLAotCQkubnVtX211eF9kZWZzID0KLQkJCUFSUkFZX1NJWkUoYWxjODg4XzJfY2FwdHVyZV9zb3VyY2VzKSwKLQkJLmlucHV0X211eCA9IGFsYzg4OF8yX2NhcHR1cmVfc291cmNlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODg4X2Z1aml0c3VfeGEzNTMwX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAotCX0sCi0JW0FMQzg4OF9MRU5PVk9fU0tZXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODg4X2xlbm92b19za3lfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODhfbGVub3ZvX3NreV92ZXJic30sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M19zaXhzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfc2l4c3RhY2tfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19sZW5vdm9fc2t5X2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4ODhfbGVub3ZvX3NreV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4ODhfQVNVU19NOTBWXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzXzNTVF82Y2hfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODhfYXN1c19tOTB2X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKLQkJLmRpZ19pbl9uaWQgPSBBTEM4ODNfRElHSU5fTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF82Y2hfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19mdWppdHN1X3BpMjUxNV9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODgzX21vZGUyX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzg4OF9BU1VTX0VFRTE2MDFdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODNfYXN1c19lZWUxNjAxX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGM4ODNfYXN1c19lZWUxNjAxX2NhcF9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODhfYXN1c19lZWUxNjAxX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKLQkJLmRpZ19pbl9uaWQgPSBBTEM4ODNfRElHSU5fTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19hc3VzX2VlZTE2MDFfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5pbml0X2hvb2sgPSBhbGM4ODNfZWVlMTYwMV9pbml0aG9vaywKLQl9LAotCVtBTEMxMjAwX0FTVVNfUDVRXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzX2Jhc2VfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEMxMjAwX0RJR09VVF9OSUQsCi0JCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKLQkJLnNsYXZlX2RpZ19vdXRzID0gYWxjMTIwMF9zbGF2ZV9kaWdfb3V0cywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M19zaXhzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfc2l4c3RhY2tfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg4OUFfTUIzMV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4OUFfbWIzMV9taXhlciwgYWxjODgzX2NobW9kZV9taXhlcn0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODg5QV9tYjMxX3ZlcmJzLAotCQkJYWxjODgwX2dwaW8xX2luaXRfdmVyYnMgfSwKLQkJLmFkY19uaWRzID0gYWxjODgzX2FkY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODNfYWRjX25pZHMpLAotCQkuY2Fwc3JjX25pZHMgPSBhbGM4ODNfY2Fwc3JjX25pZHMsCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODg5QV9tYjMxXzZjaF9tb2RlcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4OUFfbWIzMV82Y2hfbW9kZXMpLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg4OUFfbWIzMV9jYXB0dXJlX3NvdXJjZSwKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCi0JCS51bnNvbF9ldmVudCA9IGFsYzg4OUFfbWIzMV91bnNvbF9ldmVudCwKLQkJLmluaXRfaG9vayA9IGFsYzg4OUFfbWIzMV9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4ODNfU09OWV9WQUlPX1RUXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgzX3ZhaW90dF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4M192YWlvdHRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg4M192YWlvdHRfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0JfSwKLX07Ci0KLQotLyoKLSAqIFBpbiBjb25maWcgZml4ZXMKLSAqLwotZW51bSB7Ci0JUElORklYX0FCSVRfQVc5RF9NQVgsCi0JUElORklYX0xFTk9WT19ZNTMwLAotCVBJTkZJWF9QQl9NNTIxMCwKLQlQSU5GSVhfQUNFUl9BU1BJUkVfNzczNiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzg4Ml9maXh1cHNbXSA9IHsKLQlbUElORklYX0FCSVRfQVc5RF9NQVhdID0gewotCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAotCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKLQkJCXsgMHgxNSwgMHgwMTA4MDEwNCB9LCAvKiBzaWRlICovCi0JCQl7IDB4MTYsIDB4MDEwMTEwMTIgfSwgLyogcmVhciAqLwotCQkJeyAweDE3LCAweDAxMDE2MDExIH0sIC8qIGNsZmUgKi8KLQkJCXsgfQotCQl9Ci0JfSwKLQlbUElORklYX0xFTk9WT19ZNTMwXSA9IHsKLQkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKLQkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7Ci0JCQl7IDB4MTUsIDB4OTkxMzAxMTIgfSwgLyogcmVhciBpbnQgc3BlYWtlcnMgKi8KLQkJCXsgMHgxNiwgMHg5OTEzMDExMSB9LCAvKiBzdWJ3b29mZXIgKi8KLQkJCXsgfQotCQl9Ci0JfSwKLQlbUElORklYX1BCX001MjEwXSA9IHsKLQkJLnR5cGUgPSBBTENfRklYVVBfVkVSQlMsCi0JCS52LnZlcmJzID0gKGNvbnN0IHN0cnVjdCBoZGFfdmVyYltdKSB7Ci0JCQl7IDB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MCB9LAotCQkJe30KLQkJfQotCX0sCi0JW1BJTkZJWF9BQ0VSX0FTUElSRV83NzM2XSA9IHsKLQkJLnR5cGUgPSBBTENfRklYVVBfU0tVLAotCQkudi5za3UgPSBBTENfRklYVVBfU0tVX0lHTk9SRSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzg4Ml9maXh1cF90YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTU1LCAiUGFja2FyZC1CZWxsIE01MTIwIiwgUElORklYX1BCX001MjEwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYTBkLCAiTGVub3ZvIFk1MzAiLCBQSU5GSVhfTEVOT1ZPX1k1MzApLAotCVNORF9QQ0lfUVVJUksoMHgxNDdiLCAweDEwN2EsICJBYml0IEFXOUQtTUFYIiwgUElORklYX0FCSVRfQVc5RF9NQVgpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAyOTYsICJBY2VyIEFzcGlyZSA3NzM2eiIsIFBJTkZJWF9BQ0VSX0FTUElSRV83NzM2KSwKLQl7fQotfTsKLQotLyoKLSAqIEJJT1MgYXV0byBjb25maWd1cmF0aW9uCi0gKi8KLXN0YXRpYyBpbnQgYWxjODgyX2F1dG9fY3JlYXRlX2lucHV0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCQljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCi17Ci0JcmV0dXJuIGFsY19hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKGNvZGVjLCBjZmcsIDB4MGIsIDB4MjMsIDB4MjIpOwotfQotCi1zdGF0aWMgdm9pZCBhbGM4ODJfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCSAgICAgIGhkYV9uaWRfdCBuaWQsIGludCBwaW5fdHlwZSwKLQkJCQkJICAgICAgaGRhX25pZF90IGRhYykKLXsKLQlpbnQgaWR4OwotCi0JLyogc2V0IGFzIG91dHB1dCAqLwotCWFsY19zZXRfcGluX291dHB1dChjb2RlYywgbmlkLCBwaW5fdHlwZSk7Ci0KLQlpZiAoZGFjID09IDB4MjUpCi0JCWlkeCA9IDQ7Ci0JZWxzZSBpZiAoZGFjID49IDB4MDIgJiYgZGFjIDw9IDB4MDUpCi0JCWlkeCA9IGRhYyAtIDI7Ci0JZWxzZQotCQlyZXR1cm47Ci0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgaWR4KTsKLX0KLQotc3RhdGljIHZvaWQgYWxjODgyX2F1dG9faW5pdF9tdWx0aV9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IEhEQV9TSURFOyBpKyspIHsKLQkJaGRhX25pZF90IG5pZCA9IHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1tpXTsKLQkJaW50IHBpbl90eXBlID0gZ2V0X3Bpbl90eXBlKHNwZWMtPmF1dG9jZmcubGluZV9vdXRfdHlwZSk7Ci0JCWlmIChuaWQpCi0JCQlhbGM4ODJfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgcGluX3R5cGUsCi0JCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4Ml9hdXRvX2luaXRfaHBfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBwaW4sIGRhYzsKLQlpbnQgaTsKLQotCWlmIChzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3R5cGUgIT0gQVVUT19QSU5fSFBfT1VUKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNwZWMtPmF1dG9jZmcuaHBfcGlucyk7IGkrKykgewotCQkJcGluID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zW2ldOwotCQkJaWYgKCFwaW4pCi0JCQkJYnJlYWs7Ci0JCQlkYWMgPSBzcGVjLT5tdWx0aW91dC5ocF9uaWQ7Ci0JCQlpZiAoIWRhYykKLQkJCQlkYWMgPSBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXTsgLyogdG8gZnJvbnQgKi8KLQkJCWFsYzg4Ml9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgcGluLCBQSU5fSFAsIGRhYyk7Ci0JCX0KLQl9Ci0KLQlpZiAoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlICE9IEFVVE9fUElOX1NQRUFLRVJfT1VUKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zKTsgaSsrKSB7Ci0JCQlwaW4gPSBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1tpXTsKLQkJCWlmICghcGluKQotCQkJCWJyZWFrOwotCQkJZGFjID0gc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZFswXTsKLQkJCWlmICghZGFjKQotCQkJCWRhYyA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOyAvKiB0byBmcm9udCAqLwotCQkJYWxjODgyX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9PVVQsIGRhYyk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4Ml9hdXRvX2luaXRfYW5hbG9nX2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX2lucHV0czsgaSsrKSB7Ci0JCWhkYV9uaWRfdCBuaWQgPSBjZmctPmlucHV0c1tpXS5waW47Ci0JCWFsY19zZXRfaW5wdXRfcGluKGNvZGVjLCBuaWQsIGNmZy0+aW5wdXRzW2ldLnR5cGUpOwotCQlpZiAoZ2V0X3djYXBzKGNvZGVjLCBuaWQpICYgQUNfV0NBUF9PVVRfQU1QKQotCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCS8qIG11dGUgYWxsIGxvb3BiYWNrIGlucHV0cyAqLworCWlmIChzcGVjLT5taXhlcl9uaWQpIHsKKwkJaW50IG51bXMgPSBzbmRfaGRhX2dldF9jb25uX2xpc3QoY29kZWMsIHNwZWMtPm1peGVyX25pZCwgTlVMTCk7CisJCWZvciAoaSA9IDA7IGkgPCBudW1zOyBpKyspCisJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBzcGVjLT5taXhlcl9uaWQsIDAsCiAJCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAotCQkJCQkgICAgQU1QX09VVF9NVVRFKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg4Ml9hdXRvX2luaXRfaW5wdXRfc3JjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBjOwotCi0JZm9yIChjID0gMDsgYyA8IHNwZWMtPm51bV9hZGNfbmlkczsgYysrKSB7Ci0JCWhkYV9uaWRfdCBjb25uX2xpc3RbSERBX01BWF9OVU1fSU5QVVRTXTsKLQkJaGRhX25pZF90IG5pZCA9IHNwZWMtPmNhcHNyY19uaWRzW2NdOwotCQl1bnNpZ25lZCBpbnQgbXV4X2lkeDsKLQkJY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXg7Ci0JCWludCBjb25ucywgbXV0ZSwgaWR4LCBpdGVtOwotCi0JCS8qIG11dGUgQURDICovCi0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNwZWMtPmFkY19uaWRzW2NdLCAwLAotCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAotCQkJCSAgICBBTVBfSU5fTVVURSgwKSk7Ci0KLQkJY29ubnMgPSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyhjb2RlYywgbmlkLCBjb25uX2xpc3QsCi0JCQkJCQlBUlJBWV9TSVpFKGNvbm5fbGlzdCkpOwotCQlpZiAoY29ubnMgPCAwKQotCQkJY29udGludWU7Ci0JCW11eF9pZHggPSBjID49IHNwZWMtPm51bV9tdXhfZGVmcyA/IDAgOiBjOwotCQlpbXV4ID0gJnNwZWMtPmlucHV0X211eFttdXhfaWR4XTsKLQkJaWYgKCFpbXV4LT5udW1faXRlbXMgJiYgbXV4X2lkeCA+IDApCi0JCQlpbXV4ID0gJnNwZWMtPmlucHV0X211eFswXTsKLQkJZm9yIChpZHggPSAwOyBpZHggPCBjb25uczsgaWR4KyspIHsKLQkJCS8qIGlmIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gaXMgdGhlIHNlbGVjdGVkIG9uZSwKLQkJCSAqIHVubXV0ZSBpdCBhcyBkZWZhdWx0IC0gb3RoZXJ3aXNlIG11dGUgaXQKLQkJCSAqLwotCQkJbXV0ZSA9IEFNUF9JTl9NVVRFKGlkeCk7Ci0JCQlmb3IgKGl0ZW0gPSAwOyBpdGVtIDwgaW11eC0+bnVtX2l0ZW1zOyBpdGVtKyspIHsKLQkJCQlpZiAoaW11eC0+aXRlbXNbaXRlbV0uaW5kZXggPT0gaWR4KSB7Ci0JCQkJCWlmIChzcGVjLT5jdXJfbXV4W2NdID09IGl0ZW0pCi0JCQkJCQltdXRlID0gQU1QX0lOX1VOTVVURShpZHgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvKiBjaGVjayBpZiB3ZSBoYXZlIGEgc2VsZWN0b3Igb3IgbWl4ZXIKLQkJCSAqIHdlIGNvdWxkIGNoZWNrIGZvciB0aGUgd2lkZ2V0IHR5cGUgaW5zdGVhZCwgYnV0Ci0JCQkgKiBqdXN0IGNoZWNrIGZvciBBbXAtSW4gcHJlc2VuY2UgKGluIGNhc2Ugb2YgbWl4ZXIKLQkJCSAqIHdpdGhvdXQgYW1wLWluIHRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZywgdGhpcwotCQkJICogZnVuY3Rpb24gc2hvdWxkbid0IGJlIHVzZWQgb3IgY2Fwc3JjIG5pZCBpcyB3cm9uZykKLQkJCSAqLwotCQkJaWYgKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmIEFDX1dDQVBfSU5fQU1QKQotCQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKLQkJCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAotCQkJCQkJICAgIG11dGUpOwotCQkJZWxzZSBpZiAobXV0ZSAhPSBBTVBfSU5fTVVURShpZHgpKQotCQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKLQkJCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKLQkJCQkJCSAgICBpZHgpOwotCQl9Ci0JfQotfQotCi0vKiBhZGQgbWljIGJvb3N0cyBpZiBuZWVkZWQgKi8KLXN0YXRpYyBpbnQgYWxjX2F1dG9fYWRkX21pY19ib29zdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKLQlpbnQgaSwgZXJyOwotCWludCB0eXBlX2lkeCA9IDA7Ci0JaGRhX25pZF90IG5pZDsKLQljb25zdCBjaGFyICpwcmV2X2xhYmVsID0gTlVMTDsKLQotCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgewotCQlpZiAoY2ZnLT5pbnB1dHNbaV0udHlwZSA+IEFVVE9fUElOX01JQykKLQkJCWJyZWFrOwotCQluaWQgPSBjZmctPmlucHV0c1tpXS5waW47Ci0JCWlmIChnZXRfd2NhcHMoY29kZWMsIG5pZCkgJiBBQ19XQ0FQX0lOX0FNUCkgewotCQkJY29uc3QgY2hhciAqbGFiZWw7Ci0JCQljaGFyIGJvb3N0X2xhYmVsWzMyXTsKLQotCQkJbGFiZWwgPSBoZGFfZ2V0X2F1dG9jZmdfaW5wdXRfbGFiZWwoY29kZWMsIGNmZywgaSk7Ci0JCQlpZiAocHJldl9sYWJlbCAmJiAhc3RyY21wKGxhYmVsLCBwcmV2X2xhYmVsKSkKLQkJCQl0eXBlX2lkeCsrOwotCQkJZWxzZQotCQkJCXR5cGVfaWR4ID0gMDsKLQkJCXByZXZfbGFiZWwgPSBsYWJlbDsKLQotCQkJc25wcmludGYoYm9vc3RfbGFiZWwsIHNpemVvZihib29zdF9sYWJlbCksCi0JCQkJICIlcyBCb29zdCBWb2x1bWUiLCBsYWJlbCk7Ci0JCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsCi0JCQkJCSAgYm9vc3RfbGFiZWwsIHR5cGVfaWR4LAotCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9JTlBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogYWxtb3N0IGlkZW50aWNhbCB3aXRoIEFMQzg4MCBwYXJzZXIuLi4gKi8KLXN0YXRpYyBpbnQgYWxjODgyX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgyX2lnbm9yZVtdID0geyAweDFkLCAwIH07Ci0JaW50IGVycjsKLQotCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAotCQkJCQkgICBhbGM4ODJfaWdub3JlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzKQotCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KLQotCWVyciA9IGFsYzg4MF9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsY19hdXRvX2FkZF9tdWx0aV9jaGFubmVsX21vZGUoY29kZWMpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsYzg4MF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gYWxjODgwX2F1dG9fY3JlYXRlX2V4dHJhX291dChzcGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0sCi0JCQkJCSAgICJIZWFkcGhvbmUiKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGM4ODBfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHNwZWMsCi0JCQkJCSAgIHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdLAotCQkJCQkgICAiU3BlYWtlciIpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsYzg4Ml9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7Ci0KLQlhbGNfYXV0b19wYXJzZV9kaWdpdGFsKGNvZGVjKTsKLQotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlhZGRfbWl4ZXIoc3BlYywgc3BlYy0+a2N0bHMubGlzdCk7Ci0KLQlhZGRfdmVyYihzcGVjLCBhbGM4ODNfYXV0b19pbml0X3ZlcmJzKTsKLQkvKiBpZiBBREMgMHgwNyBpcyBhdmFpbGFibGUsIGluaXRpYWxpemUgaXQsIHRvbyAqLwotCWlmIChnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIDB4MDcpKSA9PSBBQ19XSURfQVVEX0lOKQotCQlhZGRfdmVyYihzcGVjLCBhbGM4ODJfYWRjMV9pbml0X3ZlcmJzKTsKLQotCXNwZWMtPm51bV9tdXhfZGVmcyA9IDE7Ci0Jc3BlYy0+aW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFswXTsKLQotCWFsY19zc2lkX2NoZWNrKGNvZGVjLCAweDE1LCAweDFiLCAweDE0LCAwKTsKLQotCWVyciA9IGFsY19hdXRvX2FkZF9taWNfYm9vc3QoY29kZWMpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIDE7IC8qIGNvbmZpZyBmb3VuZCAqLwotfQotCi0vKiBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGZvciBhdXRvLWNvbmZpZ3VyYXRpb24gbW9kZWwgKi8KLXN0YXRpYyB2b2lkIGFsYzg4Ml9hdXRvX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JYWxjODgyX2F1dG9faW5pdF9tdWx0aV9vdXQoY29kZWMpOwotCWFsYzg4Ml9hdXRvX2luaXRfaHBfb3V0KGNvZGVjKTsKLQlhbGM4ODJfYXV0b19pbml0X2FuYWxvZ19pbnB1dChjb2RlYyk7Ci0JYWxjODgyX2F1dG9faW5pdF9pbnB1dF9zcmMoY29kZWMpOwotCWFsY19hdXRvX2luaXRfZGlnaXRhbChjb2RlYyk7Ci0JaWYgKHNwZWMtPnVuc29sX2V2ZW50KQotCQlhbGNfaW5pdGhvb2soY29kZWMpOwotfQotCi1zdGF0aWMgaW50IHBhdGNoX2FsYzg4MihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWM7Ci0JaW50IGVyciwgYm9hcmRfY29uZmlnOwotCi0Jc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNwZWMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljb2RlYy0+c3BlYyA9IHNwZWM7Ci0KLQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKLQljYXNlIDB4MTBlYzA4ODI6Ci0JY2FzZSAweDEwZWMwODg1OgotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBBTEM4ODMgYW5kIHZhcmlhbnRzICovCi0JCWFsY19maXhfcGxsX2luaXQoY29kZWMsIDB4MjAsIDB4MGEsIDEwKTsKLQkJYnJlYWs7Ci0JfQotCi0JYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFMQzg4Ml9NT0RFTF9MQVNULAotCQkJCQkJICBhbGM4ODJfbW9kZWxzLAotCQkJCQkJICBhbGM4ODJfY2ZnX3RibCk7Ci0KLQlpZiAoYm9hcmRfY29uZmlnIDwgMCB8fCBib2FyZF9jb25maWcgPj0gQUxDODgyX01PREVMX0xBU1QpCi0JCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29kZWNfc2lkX2NvbmZpZyhjb2RlYywKLQkJCUFMQzg4Ml9NT0RFTF9MQVNULCBhbGM4ODJfbW9kZWxzLCBhbGM4ODJfc3NpZF9jZmdfdGJsKTsKLQotCWlmIChib2FyZF9jb25maWcgPCAwIHx8IGJvYXJkX2NvbmZpZyA+PSBBTEM4ODJfTU9ERUxfTEFTVCkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJYm9hcmRfY29uZmlnID0gQUxDODgyX0FVVE87Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEM4ODJfQVVUTykgewotCQlhbGNfcGlja19maXh1cChjb2RlYywgTlVMTCwgYWxjODgyX2ZpeHVwX3RibCwgYWxjODgyX2ZpeHVwcyk7Ci0JCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwotCX0KLQotCWFsY19hdXRvX3BhcnNlX2N1c3RvbWl6ZV9kZWZpbmUoY29kZWMpOwotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEM4ODJfQVVUTykgewotCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQkJZXJyID0gYWxjODgyX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0gZWxzZSBpZiAoIWVycikgewotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCi0JCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGJhc2UgbW9kZS4uLlxuIik7Ci0JCQlib2FyZF9jb25maWcgPSBBTEM4ODJfM1NUX0RJRzsKLQkJfQotCX0KLQotCWlmIChoYXNfY2RlZmluZV9iZWVwKGNvZGVjKSkgewotCQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgMHgxKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9Ci0KLQlpZiAoYm9hcmRfY29uZmlnICE9IEFMQzg4Ml9BVVRPKQotCQlzZXR1cF9wcmVzZXQoY29kZWMsICZhbGM4ODJfcHJlc2V0c1tib2FyZF9jb25maWddKTsKLQotCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmYWxjODgyX3BjbV9hbmFsb2dfcGxheWJhY2s7Ci0Jc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0gJmFsYzg4Ml9wY21fYW5hbG9nX2NhcHR1cmU7Ci0JLyogRklYTUU6IHNldHVwIERBQzUgKi8KLQkvKnNwZWMtPnN0cmVhbV9hbmFsb2dfYWx0X3BsYXliYWNrID0gJmFsYzg4MF9wY21fYW5hbG9nX2FsdF9wbGF5YmFjazsqLwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfYWx0X2NhcHR1cmUgPSAmYWxjODgwX3BjbV9hbmFsb2dfYWx0X2NhcHR1cmU7Ci0KLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZhbGM4ODJfcGNtX2RpZ2l0YWxfcGxheWJhY2s7Ci0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSA9ICZhbGM4ODJfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKLQotCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7Ci0JCWludCBpLCBqOwotCQlzcGVjLT5udW1fYWRjX25pZHMgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbGM4ODJfYWRjX25pZHMpOyBpKyspIHsKLQkJCWNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gc3BlYy0+aW5wdXRfbXV4OwotCQkJaGRhX25pZF90IGNhcDsKLQkJCWhkYV9uaWRfdCBpdGVtc1sxNl07Ci0JCQloZGFfbmlkX3QgbmlkID0gYWxjODgyX2FkY19uaWRzW2ldOwotCQkJdW5zaWduZWQgaW50IHdjYXAgPSBnZXRfd2NhcHMoY29kZWMsIG5pZCk7Ci0JCQkvKiBnZXQgdHlwZSAqLwotCQkJd2NhcCA9IGdldF93Y2Fwc190eXBlKHdjYXApOwotCQkJaWYgKHdjYXAgIT0gQUNfV0lEX0FVRF9JTikKLQkJCQljb250aW51ZTsKLQkJCXNwZWMtPnByaXZhdGVfYWRjX25pZHNbc3BlYy0+bnVtX2FkY19uaWRzXSA9IG5pZDsKLQkJCWVyciA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsICZjYXAsIDEpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJY29udGludWU7Ci0JCQllcnIgPSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyhjb2RlYywgY2FwLCBpdGVtcywKLQkJCQkJCSAgICAgIEFSUkFZX1NJWkUoaXRlbXMpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCWNvbnRpbnVlOwotCQkJZm9yIChqID0gMDsgaiA8IGltdXgtPm51bV9pdGVtczsgaisrKQotCQkJCWlmIChpbXV4LT5pdGVtc1tqXS5pbmRleCA+PSBlcnIpCi0JCQkJCWJyZWFrOwotCQkJaWYgKGogPCBpbXV4LT5udW1faXRlbXMpCi0JCQkJY29udGludWU7Ci0JCQlzcGVjLT5wcml2YXRlX2NhcHNyY19uaWRzW3NwZWMtPm51bV9hZGNfbmlkc10gPSBjYXA7Ci0JCQlzcGVjLT5udW1fYWRjX25pZHMrKzsKLQkJfQotCQlzcGVjLT5hZGNfbmlkcyA9IHNwZWMtPnByaXZhdGVfYWRjX25pZHM7Ci0JCXNwZWMtPmNhcHNyY19uaWRzID0gc3BlYy0+cHJpdmF0ZV9jYXBzcmNfbmlkczsKLQl9Ci0KLQlzZXRfY2FwdHVyZV9taXhlcihjb2RlYyk7Ci0KLQlpZiAoaGFzX2NkZWZpbmVfYmVlcChjb2RlYykpCi0JCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwotCi0JYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BST0JFKTsKLQotCXNwZWMtPnZtYXN0ZXJfbmlkID0gMHgwYzsKLQotCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOwotCWlmIChib2FyZF9jb25maWcgPT0gQUxDODgyX0FVVE8pCi0JCXNwZWMtPmluaXRfaG9vayA9IGFsYzg4Ml9hdXRvX2luaXQ7Ci0KLQlhbGNfaW5pdF9qYWNrcyhjb2RlYyk7Ci0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotCWlmICghc3BlYy0+bG9vcGJhY2suYW1wbGlzdCkKLQkJc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IGFsYzg4Ml9sb29wYmFja3M7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBBTEMyNjIgc3VwcG9ydAotICovCi0KLSNkZWZpbmUgQUxDMjYyX0RJR09VVF9OSUQJQUxDODgwX0RJR09VVF9OSUQKLSNkZWZpbmUgQUxDMjYyX0RJR0lOX05JRAlBTEM4ODBfRElHSU5fTklECi0KLSNkZWZpbmUgYWxjMjYyX2RhY19uaWRzCQlhbGMyNjBfZGFjX25pZHMKLSNkZWZpbmUgYWxjMjYyX2FkY19uaWRzCQlhbGM4ODJfYWRjX25pZHMKLSNkZWZpbmUgYWxjMjYyX2FkY19uaWRzX2FsdAlhbGM4ODJfYWRjX25pZHNfYWx0Ci0jZGVmaW5lIGFsYzI2Ml9jYXBzcmNfbmlkcwlhbGM4ODJfY2Fwc3JjX25pZHMKLSNkZWZpbmUgYWxjMjYyX2NhcHNyY19uaWRzX2FsdAlhbGM4ODJfY2Fwc3JjX25pZHNfYWx0Ci0KLSNkZWZpbmUgYWxjMjYyX21vZGVzCQlhbGMyNjBfbW9kZXMKLSNkZWZpbmUgYWxjMjYyX2NhcHR1cmVfc291cmNlCWFsYzg4Ml9jYXB0dXJlX3NvdXJjZQotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2Ml9kbWljX2FkY19uaWRzWzFdID0gewotCS8qIEFEQzAgKi8KLQkweDA5Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2Ml9kbWljX2NhcHNyY19uaWRzWzFdID0geyAweDIyIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfYmFzZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwRCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJNb25vIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCAweDAsIEhEQV9PVVRQVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIHVwZGF0ZSBIUCwgbGluZSBhbmQgbW9uby1vdXQgcGlucyBhY2NvcmRpbmcgdG8gdGhlIG1hc3RlciBzd2l0Y2ggKi8KLSNkZWZpbmUgYWxjMjYyX2hwX21hc3Rlcl91cGRhdGUJCWFsYzI2MF9ocF9tYXN0ZXJfdXBkYXRlCi0KLXN0YXRpYyB2b2lkIGFsYzI2Ml9ocF9icGNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2Ml9ocF93aWxkd2VzdF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE2OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLX0KLQotI2RlZmluZSBhbGMyNjJfaHBfbWFzdGVyX3N3X2dldAkJYWxjMjYwX2hwX21hc3Rlcl9zd19nZXQKLSNkZWZpbmUgYWxjMjYyX2hwX21hc3Rlcl9zd19wdXQJCWFsYzI2MF9ocF9tYXN0ZXJfc3dfcHV0Ci0KLSNkZWZpbmUgQUxDMjYyX0hQX01BU1RFUl9TV0lUQ0gJCQkJCVwKLQl7CQkJCQkJCVwKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCQlcCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAkJXAotCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCQlcCi0JCS5nZXQgPSBhbGMyNjJfaHBfbWFzdGVyX3N3X2dldCwJCQlcCi0JCS5wdXQgPSBhbGMyNjJfaHBfbWFzdGVyX3N3X3B1dCwJCQlcCi0JfSwgXAotCXsJCQkJCQkJXAotCQkuaWZhY2UgPSBOSURfTUFQUElORywJCQkJXAotCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwJCVwKLQkJLnByaXZhdGVfdmFsdWUgPSAweDE1IHwgKDB4MTYgPDwgOCkgfCAoMHgxYiA8PCAxNiksCVwKLQl9Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfbWl4ZXJbXSA9IHsKLQlBTEMyNjJfSFBfTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLAotCQkJICAgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCAweDAsCi0JCQkgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJBVVggSU4gUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQVVYIElOIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDYsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfbWl4ZXJbXSA9IHsKLQlBTEMyNjJfSFBfTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLAotCQkJICAgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCAweDAsCi0JCQkgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDFhLCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3Rfb3B0aW9uX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiUmVhciBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJSZWFyIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiUmVhciBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBtdXRlL3VubXV0ZSBpbnRlcm5hbCBzcGVha2VyIGFjY29yZGluZyB0byB0aGUgaHAgamFjayBhbmQgbXV0ZSBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYWxjMjYyX2hwX3Q1NzM1X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX2hwX3Q1NzM1X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfaHBfdDU3MzVfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9ocF9ycDU3MDBfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfaHBfcnA1NzAwX3ZlcmJzW10gPSB7Ci0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAwIDw8IDgpKX0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjJfaHBfcnA1NzAwX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAxLAotCS5pdGVtcyA9IHsKLQkJeyAiTGluZSIsIDB4MSB9LAotCX0sCi19OwotCi0vKiBiaW5kIGhwIGFuZCBpbnRlcm5hbCBzcGVha2VyIG11dGUgKHdpdGggcGx1ZyBjaGVjaykgYXMgbWFzdGVyIHN3aXRjaCAqLwotI2RlZmluZSBhbGMyNjJfaGlwcG9fbWFzdGVyX3VwZGF0ZQlhbGMyNjJfaHBfbWFzdGVyX3VwZGF0ZQotI2RlZmluZSBhbGMyNjJfaGlwcG9fbWFzdGVyX3N3X2dldAlhbGMyNjJfaHBfbWFzdGVyX3N3X2dldAotI2RlZmluZSBhbGMyNjJfaGlwcG9fbWFzdGVyX3N3X3B1dAlhbGMyNjJfaHBfbWFzdGVyX3N3X3B1dAotCi0jZGVmaW5lIEFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENICQkJCVwKLQl7CQkJCQkJCVwKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCQlcCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAkJXAotCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCQlcCi0JCS5nZXQgPSBhbGMyNjJfaGlwcG9fbWFzdGVyX3N3X2dldCwJCVwKLQkJLnB1dCA9IGFsYzI2Ml9oaXBwb19tYXN0ZXJfc3dfcHV0LAkJXAotCX0sCQkJCQkJCVwKLQl7CQkJCQkJCVwKLQkJLmlmYWNlID0gTklEX01BUFBJTkcsCQkJCVwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCQlcCi0JCS5zdWJkZXZpY2UgPSBTVUJERVZfSFAoMCkgfCAoU1VCREVWX0xJTkUoMCkgPDwgOCkgfCBcCi0JCQkgICAgIChTVUJERVZfU1BFQUtFUigwKSA8PCAxNiksIFwKLQl9Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfaGlwcG9fbWl4ZXJbXSA9IHsKLQlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX2hpcHBvMV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENILAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogbXV0ZS91bm11dGUgaW50ZXJuYWwgc3BlYWtlciBhY2NvcmRpbmcgdG8gdGhlIGhwIGphY2sgYW5kIG11dGUgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzI2Ml9oaXBwb19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjYyX2hpcHBvMV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX3NvbnlfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkFUQVBJIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJBVEFQSSBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX2JlbnFfdDMxX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCi0JQUxDMjYyX0hJUFBPX01BU1RFUl9TV0lUQ0gsCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQVRBUEkgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkFUQVBJIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfdHlhbl9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkF1eCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA2LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJBdXggUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml90eWFuX3ZlcmJzW10gPSB7Ci0JLyogSGVhZHBob25lIGF1dG9tdXRlICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCS8qIFAxMSBBVVhfSU4sIHdoaXRlIDQtcGluIGNvbm5lY3RvciAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTkZJR19ERUZBVUxUX0JZVEVTXzEsIDB4ZTF9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9DT05GSUdfREVGQVVMVF9CWVRFU18yLCAweDkzfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQ09ORklHX0RFRkFVTFRfQllURVNfMywgMHgxOX0sCi0KLQl7fQotfTsKLQotLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgc2Vuc2luZyAqLwotc3RhdGljIHZvaWQgYWxjMjYyX3R5YW5fc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLQotI2RlZmluZSBhbGMyNjJfY2FwdHVyZV9taXhlcgkJYWxjODgyX2NhcHR1cmVfbWl4ZXIKLSNkZWZpbmUgYWxjMjYyX2NhcHR1cmVfYWx0X21peGVyCWFsYzg4Ml9jYXB0dXJlX2FsdF9taXhlcgotCi0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0yIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKiBNdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCi0JICogbWl4ZXIgd2lkZ2V0Ci0JICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IKLQkgKiBmcm9udCBwYW5lbCBtaWMgKG1pYyAyKQotCSAqLwotCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDBjIC0gMHgwZSkKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KLQkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCi0JLyogRklYTUU6IHVzZSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCi0JLyogTWl4ZXIgZWxlbWVudHM6IDB4MTgsIDE5LCAxYSwgMWIsIDFjLCAxZCwgMTQsIDE1LCAxNiwgMTcsIDBiICovCi0JLyogSW5wdXQgbWl4ZXIxOiB1bm11dGUgTWljLCBGLU1pYywgTGluZSwgQ0QgaW5wdXRzICovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDMgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNCA8PCA4KSl9LAotCS8qIElucHV0IG1peGVyMiAqLwotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAzIDw8IDgpKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMiA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKLQkvKiBJbnB1dCBtaXhlcjMgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA0IDw8IDgpKX0sCi0KLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX2VhcGRfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9oaXBwbzFfdW5zb2xfdmVyYnNbXSA9IHsKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAotCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX3NvbnlfdW5zb2xfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAkvLyBGcm9udCBNaWMKLQotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX3Rvc2hpYmFfczA2X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfdG9zaGliYV9zMDZfdmVyYnNbXSA9IHsKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgdm9pZCBhbGMyNjJfdG9zaGliYV9zMDZfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5leHRfbWljLnBpbiA9IDB4MTg7Ci0Jc3BlYy0+ZXh0X21pYy5tdXhfaWR4ID0gMDsKLQlzcGVjLT5pbnRfbWljLnBpbiA9IDB4MTI7Ci0Jc3BlYy0+aW50X21pYy5tdXhfaWR4ID0gOTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOwotfQotCi0vKgotICogbmVjIG1vZGVsCi0gKiAgMHgxNSA9IGhlYWRwaG9uZQotICogIDB4MTYgPSBpbnRlcm5hbCBzcGVha2VyCi0gKiAgMHgxOCA9IGV4dGVybmFsIG1pYwotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfbmVjX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAwLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9uZWNfdmVyYnNbXSA9IHsKLQkvKiBVbm11dGUgU3BlYWtlciAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBIZWFkcGhvbmUgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0KLQkvKiBFeHRlcm5hbCBtaWMgdG8gaGVhZHBob25lICovCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCS8qIEV4dGVybmFsIG1pYyB0byBzcGVha2VyICovCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXt9Ci19OwotCi0vKgotICogZnVqaXRzdSBtb2RlbAotICogIDB4MTQgPSBoZWFkcGhvbmUvc3BkaWYtb3V0LCAweDE1ID0gaW50ZXJuYWwgc3BlYWtlciwKLSAqICAweDFiID0gcG9ydCByZXBsaWNhdG9yIGhlYWRwaG9uZSBvdXQKLSAqLwotCi0jZGVmaW5lIEFMQ19IUF9FVkVOVAkweDM3Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX2Z1aml0c3VfdW5zb2xfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfbGVub3ZvXzMwMDBfdW5zb2xfdmVyYnNbXSA9IHsKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfbGVub3ZvXzMwMDBfaW5pdF92ZXJic1tdID0gewotCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgNTAlICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjJfZnVqaXRzdV9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMywKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJJbnRlcm5hbCBNaWMiLCAweDEgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2Ml9IUF9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gNSwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJGcm9udCBNaWMiLCAweDEgfSwKLQkJeyAiTGluZSIsIDB4MiB9LAotCQl7ICJDRCIsIDB4NCB9LAotCQl7ICJBVVggSU4iLCAweDYgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2Ml9IUF9ENzAwMF9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gNCwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJGcm9udCBNaWMiLCAweDIgfSwKLQkJeyAiTGluZSIsIDB4MSB9LAotCQl7ICJDRCIsIDB4NCB9LAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBhbGMyNjJfZnVqaXRzdV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzFdID0gMHgxYjsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi0vKiBiaW5kIHZvbHVtZXMgb2YgYm90aCBOSUQgMHgwYyBhbmQgMHgwZCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzI2Ml9mdWppdHN1X2JpbmRfbWFzdGVyX3ZvbCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF92b2wsCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBjLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBkLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX2Z1aml0c3VfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjMjYyX2Z1aml0c3VfYmluZF9tYXN0ZXJfdm9sKSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKLQkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCAweDE0LAotCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCi0JCS5nZXQgPSBhbGMyNjJfaHBfbWFzdGVyX3N3X2dldCwKLQkJLnB1dCA9IGFsYzI2Ml9ocF9tYXN0ZXJfc3dfcHV0LAotCX0sCi0JewotCQkuaWZhY2UgPSBOSURfTUFQUElORywKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5wcml2YXRlX3ZhbHVlID0gMHgxYiwKLQl9LAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzI2Ml9sZW5vdm9fMzAwMF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfbGVub3ZvXzMwMDBfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjMjYyX2Z1aml0c3VfYmluZF9tYXN0ZXJfdm9sKSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKLQkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCAweDFiLAotCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCi0JCS5nZXQgPSBhbGMyNjJfaHBfbWFzdGVyX3N3X2dldCwKLQkJLnB1dCA9IGFsYzI2Ml9ocF9tYXN0ZXJfc3dfcHV0LAotCX0sCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml90b3NoaWJhX3J4MV9taXhlcltdID0gewotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjJfZnVqaXRzdV9iaW5kX21hc3Rlcl92b2wpLAotCUFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENILAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIGFkZGl0aW9uYWwgaW5pdCB2ZXJicyBmb3IgQmVucSBsYXB0b3BzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9FQVBEX3ZlcmJzW10gPSB7Ci0JezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDd9LAotCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsICAweDMwNzB9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9iZW5xX3QzMV9FQVBEX3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQotCXsweDIwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDA3fSwKLQl7MHgyMCwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAgMHgzMDUwfSwKLQl7fQotfTsKLQotLyogU2Ftc3VuZyBRMSBVbHRyYSBWaXN0YSBtb2RlbCBzZXR1cCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml91bHRyYV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTUsIDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfdWx0cmFfdmVyYnNbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JLyogc3BlYWtlciAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCS8qIEhQICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0JLyogaW50ZXJuYWwgbWljICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQkvKiBBREMsIGNob29zZSBtaWMgKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg1KX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDYpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNyl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg4KX0sCi0Je30KLX07Ci0KLS8qIG11dGUvdW5tdXRlIGludGVybmFsIHNwZWFrZXIgYWNjb3JkaW5nIHRvIHRoZSBocCBqYWNrIGFuZCBtdXRlIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGMyNjJfdWx0cmFfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JdW5zaWduZWQgaW50IG11dGU7Ci0KLQltdXRlID0gMDsKLQkvKiBhdXRvLW11dGUgb25seSB3aGVuIEhQIGlzIHVzZWQgYXMgSFAgKi8KLQlpZiAoIXNwZWMtPmN1cl9tdXhbMF0pIHsKLQkJc3BlYy0+amFja19wcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxNSk7Ci0JCWlmIChzcGVjLT5qYWNrX3ByZXNlbnQpCi0JCQltdXRlID0gSERBX0FNUF9NVVRFOwotCX0KLQkvKiBtdXRlL3VubXV0ZSBpbnRlcm5hbCBzcGVha2VyICovCi0Jc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDE0LCBIREFfT1VUUFVULCAwLAotCQkJCSBIREFfQU1QX01VVEUsIG11dGUpOwotCS8qIG11dGUvdW5tdXRlIEhQICovCi0Jc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDE1LCBIREFfT1VUUFVULCAwLAotCQkJCSBIREFfQU1QX01VVEUsIG11dGUgPyAwIDogSERBX0FNUF9NVVRFKTsKLX0KLQotLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgc2Vuc2luZyAqLwotc3RhdGljIHZvaWQgYWxjMjYyX3VsdHJhX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVzKQotewotCWlmICgocmVzID4+IDI2KSAhPSBBTEM4ODBfSFBfRVZFTlQpCi0JCXJldHVybjsKLQlhbGMyNjJfdWx0cmFfYXV0b211dGUoY29kZWMpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjYyX3VsdHJhX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAyLAotCS5pdGVtcyA9IHsKLQkJeyAiTWljIiwgMHgxIH0sCi0JCXsgIkhlYWRwaG9uZSIsIDB4NyB9LAotCX0sCi19OwotCi1zdGF0aWMgaW50IGFsYzI2Ml91bHRyYV9tdXhfZW51bV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYWxjX211eF9lbnVtX3B1dChrY29udHJvbCwgdWNvbnRyb2wpOwotCWlmICghcmV0KQotCQlyZXR1cm4gMDsKLQkvKiByZXByb2dyYW0gdGhlIEhQIHBpbiBhcyBtaWMgb3IgSFAgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBzb3VyY2UgKi8KLQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCAweDE1LCAwLAotCQkJCSAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAotCQkJCSAgc3BlYy0+Y3VyX211eFswXSA/IFBJTl9WUkVGODAgOiBQSU5fSFApOwotCWFsYzI2Ml91bHRyYV9hdXRvbXV0ZShjb2RlYyk7IC8qIG11dGUvdW5tdXRlIEhQICovCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml91bHRyYV9jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwKLQkJLmluZm8gPSBhbGNfbXV4X2VudW1faW5mbywKLQkJLmdldCA9IGFsY19tdXhfZW51bV9nZXQsCi0JCS5wdXQgPSBhbGMyNjJfdWx0cmFfbXV4X2VudW1fcHV0LAotCX0sCi0JewotCQkuaWZhY2UgPSBOSURfTUFQUElORywKLQkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAotCQkucHJpdmF0ZV92YWx1ZSA9IDB4MTUsCi0JfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBXZSB1c2UgdHdvIG1peGVycyBkZXBlbmRpbmcgb24gdGhlIG91dHB1dCBwaW47IDB4MTYgaXMgYSBtb25vIG91dHB1dAotICogYW5kIHRodXMgaXQncyBib3VuZCB3aXRoIGEgZGlmZmVyZW50IG1peGVyLgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHdoaWNoIG1peGVyIGFtcCBzaG91bGQgYmUgdXNlZC4KLSAqLwotc3RhdGljIGludCBhbGMyNjJfY2hlY2tfdm9sYml0KGhkYV9uaWRfdCBuaWQpCi17Ci0JaWYgKCFuaWQpCi0JCXJldHVybiAwOwotCWVsc2UgaWYgKG5pZCA9PSAweDE2KQotCQlyZXR1cm4gMjsKLQllbHNlCi0JCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGFsYzI2Ml9hZGRfb3V0X3ZvbF9jdGwoc3RydWN0IGFsY19zcGVjICpzcGVjLCBoZGFfbmlkX3QgbmlkLAotCQkJCSAgY29uc3QgY2hhciAqcGZ4LCBpbnQgKnZiaXRzLCBpbnQgaWR4KQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCB2Yml0OwotCi0JdmJpdCA9IGFsYzI2Ml9jaGVja192b2xiaXQobmlkKTsKLQlpZiAoIXZiaXQpCi0JCXJldHVybiAwOwotCWlmICgqdmJpdHMgJiB2Yml0KSAvKiBhIHZvbHVtZSBjb250cm9sIGZvciB0aGlzIG1peGVyIGFscmVhZHkgdGhlcmUgKi8KLQkJcmV0dXJuIDA7Ci0JKnZiaXRzIHw9IHZiaXQ7Ci0JaWYgKHZiaXQgPT0gMikKLQkJdmFsID0gSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBlLCAyLCAwLCBIREFfT1VUUFVUKTsKLQllbHNlCi0JCXZhbCA9IEhEQV9DT01QT1NFX0FNUF9WQUwoMHgwYywgMywgMCwgSERBX09VVFBVVCk7Ci0JcmV0dXJuIF9fYWRkX3BiX3ZvbF9jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgcGZ4LCBpZHgsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgYWxjMjYyX2FkZF9vdXRfc3dfY3RsKHN0cnVjdCBhbGNfc3BlYyAqc3BlYywgaGRhX25pZF90IG5pZCwKLQkJCQkgY29uc3QgY2hhciAqcGZ4LCBpbnQgaWR4KQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCi0JaWYgKCFuaWQpCi0JCXJldHVybiAwOwotCWlmIChuaWQgPT0gMHgxNikKLQkJdmFsID0gSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDIsIDAsIEhEQV9PVVRQVVQpOwotCWVsc2UKLQkJdmFsID0gSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9PVVRQVVQpOwotCXJldHVybiBfX2FkZF9wYl9zd19jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIHBmeCwgaWR4LCB2YWwpOwotfQotCi0vKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZnJvbSB0aGUgcGFyc2VkIERBQyB0YWJsZSAqLwotc3RhdGljIGludCBhbGMyNjJfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IGFsY19zcGVjICpzcGVjLAotCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQljb25zdCBjaGFyICpwZng7Ci0JaW50IHZiaXRzOwotCWludCBpLCBlcnI7Ci0KLQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDE7CS8qIG9ubHkgdXNlIG9uZSBkYWMgKi8KLQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPnByaXZhdGVfZGFjX25pZHM7Ci0Jc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1swXSA9IDI7Ci0KLQlwZnggPSBhbGNfZ2V0X2xpbmVfb3V0X3BmeChzcGVjLCB0cnVlKTsKLQlpZiAoIXBmeCkKLQkJcGZ4ID0gIkZyb250IjsKLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCWVyciA9IGFsYzI2Ml9hZGRfb3V0X3N3X2N0bChzcGVjLCBjZmctPmxpbmVfb3V0X3BpbnNbaV0sIHBmeCwgaSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJaWYgKGNmZy0+bGluZV9vdXRfdHlwZSAhPSBBVVRPX1BJTl9TUEVBS0VSX09VVCkgewotCQkJZXJyID0gYWxjMjYyX2FkZF9vdXRfc3dfY3RsKHNwZWMsIGNmZy0+c3BlYWtlcl9waW5zW2ldLAotCQkJCQkJICAgICJTcGVha2VyIiwgaSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQl9Ci0JCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgIT0gQVVUT19QSU5fSFBfT1VUKSB7Ci0JCQllcnIgPSBhbGMyNjJfYWRkX291dF9zd19jdGwoc3BlYywgY2ZnLT5ocF9waW5zW2ldLAotCQkJCQkJICAgICJIZWFkcGhvbmUiLCBpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9Ci0KLQl2Yml0cyA9IGFsYzI2Ml9jaGVja192b2xiaXQoY2ZnLT5saW5lX291dF9waW5zWzBdKSB8Ci0JCWFsYzI2Ml9jaGVja192b2xiaXQoY2ZnLT5zcGVha2VyX3BpbnNbMF0pIHwKLQkJYWxjMjYyX2NoZWNrX3ZvbGJpdChjZmctPmhwX3BpbnNbMF0pOwotCWlmICh2Yml0cyA9PSAxIHx8IHZiaXRzID09IDIpCi0JCXBmeCA9ICJNYXN0ZXIiOyAvKiBvbmx5IG9uZSBtaXhlciBpcyB1c2VkICovCi0JdmJpdHMgPSAwOwotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJZXJyID0gYWxjMjYyX2FkZF9vdXRfdm9sX2N0bChzcGVjLCBjZmctPmxpbmVfb3V0X3BpbnNbaV0sIHBmeCwKLQkJCQkJICAgICAmdmJpdHMsIGkpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgIT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpIHsKLQkJCWVyciA9IGFsYzI2Ml9hZGRfb3V0X3ZvbF9jdGwoc3BlYywgY2ZnLT5zcGVha2VyX3BpbnNbaV0sCi0JCQkJCQkgICAgICJTcGVha2VyIiwgJnZiaXRzLCBpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0KLQkJaWYgKGNmZy0+bGluZV9vdXRfdHlwZSAhPSBBVVRPX1BJTl9IUF9PVVQpIHsKLQkJCWVyciA9IGFsYzI2Ml9hZGRfb3V0X3ZvbF9jdGwoc3BlYywgY2ZnLT5ocF9waW5zW2ldLAotCQkJCQkJICAgICAiSGVhZHBob25lIiwgJnZiaXRzLCBpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgYWxjMjYyX2F1dG9fY3JlYXRlX2lucHV0X2N0bHMgXAotCWFsYzg4Ml9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzCi0KLS8qCi0gKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0yIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKiBNdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCi0JICogbWl4ZXIgd2lkZ2V0Ci0JICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IKLQkgKiBmcm9udCBwYW5lbCBtaWMgKG1pYyAyKQotCSAqLwotCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDBjIC0gMHgwZikKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogc2V0IHVwIGlucHV0IGFtcHMgZm9yIGFuYWxvZyBsb29wYmFjayAqLwotCS8qIEFtcCBJbmRpY2VzOiBEQUMgPSAwLCBtaXhlciA9IDEgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCS8qIEZJWE1FOiB1c2UgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLwotCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxYywgMWQsIDE0LCAxNSwgMTYsIDE3LCAwYiAqLwotCS8qIElucHV0IG1peGVyMTogdW5tdXRlIE1pYywgRi1NaWMsIExpbmUsIENEIGlucHV0cyAqLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAzIDw8IDgpKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMiA8PCA4KSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKLQkvKiBJbnB1dCBtaXhlcjIgKi8KLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA0IDw8IDgpKX0sCi0JLyogSW5wdXQgbWl4ZXIzICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDMgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNCA8PCA4KSl9LAotCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9IUF9CUENfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAtMiBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyogTXV0ZSBpbnB1dCBhbXBzIChDRCwgTGluZSBJbiwgTWljIDEgJiBNaWMgMikgb2YgdGhlIGFuYWxvZy1sb29wYmFjawotCSAqIG1peGVyIHdpZGdldAotCSAqIE5vdGU6IFBBU0QgbW90aGVyYm9hcmRzIHVzZXMgdGhlIExpbmUgSW4gMiBhcyB0aGUgaW5wdXQgZm9yCi0JICogZnJvbnQgcGFuZWwgbWljIChtaWMgMikKLQkgKi8KLQkvKiBBbXAgSW5kaWNlczogTWljMSA9IDAsIE1pYzIgPSAxLCBMaW5lMSA9IDIsIExpbmUyID0gMywgQ0QgPSA0ICovCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg1KX0sCi0gICAgICAgIHsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg2KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDBjIC0gMHgwZSkKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogc2V0IHVwIGlucHV0IGFtcHMgZm9yIGFuYWxvZyBsb29wYmFjayAqLwotCS8qIEFtcCBJbmRpY2VzOiBEQUMgPSAwLCBtaXhlciA9IDEgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCi0gICAgICAgIHsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLSAgICAgICAgezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwIH0sCi0JezB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCi0KLQkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLQkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDBiLCAxMiAqLwotCS8qIElucHV0IG1peGVyMTogb25seSB1bm11dGUgTWljICovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA1IDw8IDgpKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNiA8PCA4KSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDcgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA4IDw8IDgpKX0sCi0JLyogSW5wdXQgbWl4ZXIyICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA1IDw8IDgpKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNiA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDcgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA4IDw8IDgpKX0sCi0JLyogSW5wdXQgbWl4ZXIzICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA1IDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNiA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDcgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA4IDw8IDgpKX0sCi0KLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0KLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0yIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKiBNdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCi0JICogbWl4ZXIgd2lkZ2V0Ci0JICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IgZnJvbnQKLQkgKiBwYW5lbCBtaWMgKG1pYyAyKQotCSAqLwotCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNil9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg3KX0sCi0JLyoKLQkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgwYyAtIDB4MGUpCi0JICovCi0JLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KLQkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUCB9LAkvKiBIUCAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwJLyogTW9ubyAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwJLyogcmVhciBNSUMgKi8KLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwJLyogTGluZSBpbiAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwJLyogRnJvbnQgTUlDICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAkvKiBMaW5lIG91dCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAkvKiBDRCBpbiAqLwotCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0KLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0KLQkvKiB7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDIzIH0sICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDIzIH0sCi0JezB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDFkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLQotCS8qIEZJWE1FOiB1c2UgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLwotCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxYywgMWQsIDE0LCAxNSwgMTYsIDE3LCAwYiAqLwotCS8qIElucHV0IG1peGVyMTogdW5tdXRlIE1pYywgRi1NaWMsIExpbmUsIENEIGlucHV0cyAqLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwgLypyZWFyIE1JQyovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LCAvKkxpbmUgaW4qLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpfSwgLypGIE1JQyovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMyA8PCA4KSl9LCAvKkZyb250Ki8KLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA0IDw8IDgpKX0sIC8qQ0QqLwotICAgICAgICAvKiB7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA2IDw8IDgpKX0sICAqLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDcgPDwgOCkpfSwgLypIUCovCi0JLyogSW5wdXQgbWl4ZXIyICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDQgPDwgOCkpfSwKLSAgICAgICAgLyogezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNiA8PCA4KSl9LCAqLwotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDcgPDwgOCkpfSwKLQkvKiBJbnB1dCBtaXhlcjMgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAzIDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNCA8PCA4KSl9LAotICAgICAgICAvKiB7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA2IDw8IDgpKX0sICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNyA8PCA4KSl9LAotCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml90b3NoaWJhX3J4MV91bnNvbF92ZXJic1tdID0gewotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAkvKiBGcm9udCBTcGVha2VyICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwJLyogTUlDIGphY2sgKi8KLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCS8qIEZyb250IE1JQyAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApIH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfSwKLQotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUCB9LAkvKiBIUCAgamFjayAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi0vKgotICogUGluIGNvbmZpZyBmaXhlcwotICovCi1lbnVtIHsKLQlQSU5GSVhfRlNDX0gyNzAsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsY19maXh1cCBhbGMyNjJfZml4dXBzW10gPSB7Ci0JW1BJTkZJWF9GU0NfSDI3MF0gPSB7Ci0JCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCi0JCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgewotCQkJeyAweDE0LCAweDk5MTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KLQkJCXsgMHgxNSwgMHgwMjIxMTQyZiB9LCAvKiBmcm9udCBIUCAqLwotCQkJeyAweDFiLCAweDAxMjExNDFmIH0sIC8qIHJlYXIgSFAgKi8KLQkJCXsgfQotCQl9Ci0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjJfZml4dXBfdGJsW10gPSB7Ci0JU05EX1BDSV9RVUlSSygweDE3MzQsIDB4MTE0NywgIkZTQyBDZWxzaXVzIEgyNzAiLCBQSU5GSVhfRlNDX0gyNzApLAotCXt9Ci19OwotCi0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi0jZGVmaW5lIGFsYzI2Ml9sb29wYmFja3MJYWxjODgwX2xvb3BiYWNrcwotI2VuZGlmCi0KLS8qIHBjbSBjb25maWd1cmF0aW9uOiBpZGVudGljYWwgd2l0aCBBTEM4ODAgKi8KLSNkZWZpbmUgYWxjMjYyX3BjbV9hbmFsb2dfcGxheWJhY2sJYWxjODgwX3BjbV9hbmFsb2dfcGxheWJhY2sKLSNkZWZpbmUgYWxjMjYyX3BjbV9hbmFsb2dfY2FwdHVyZQlhbGM4ODBfcGNtX2FuYWxvZ19jYXB0dXJlCi0jZGVmaW5lIGFsYzI2Ml9wY21fZGlnaXRhbF9wbGF5YmFjawlhbGM4ODBfcGNtX2RpZ2l0YWxfcGxheWJhY2sKLSNkZWZpbmUgYWxjMjYyX3BjbV9kaWdpdGFsX2NhcHR1cmUJYWxjODgwX3BjbV9kaWdpdGFsX2NhcHR1cmUKLQotLyoKLSAqIEJJT1MgYXV0byBjb25maWd1cmF0aW9uCi0gKi8KLXN0YXRpYyBpbnQgYWxjMjYyX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBlcnI7Ci0Jc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjJfaWdub3JlW10gPSB7IDB4MWQsIDAgfTsKLQotCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAotCQkJCQkgICBhbGMyNjJfaWdub3JlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzKSB7Ci0JCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19vdXRzIHx8IHNwZWMtPmF1dG9jZmcuZGlnX2luX3BpbikgewotCQkJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKLQkJCXNwZWMtPm5vX2FuYWxvZyA9IDE7Ci0JCQlnb3RvIGRpZ19vbmx5OwotCQl9Ci0JCXJldHVybiAwOyAvKiBjYW4ndCBmaW5kIHZhbGlkIEJJT1MgcGluIGNvbmZpZyAqLwotCX0KLQllcnIgPSBhbGMyNjJfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsYzI2Ml9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7Ci0KLSBkaWdfb25seToKLQlhbGNfYXV0b19wYXJzZV9kaWdpdGFsKGNvZGVjKTsKLQotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlhZGRfbWl4ZXIoc3BlYywgc3BlYy0+a2N0bHMubGlzdCk7Ci0KLQlhZGRfdmVyYihzcGVjLCBhbGMyNjJfdm9sdW1lX2luaXRfdmVyYnMpOwotCXNwZWMtPm51bV9tdXhfZGVmcyA9IDE7Ci0Jc3BlYy0+aW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFswXTsKLQotCWVyciA9IGFsY19hdXRvX2FkZF9taWNfYm9vc3QoY29kZWMpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JYWxjX3NzaWRfY2hlY2soY29kZWMsIDB4MTUsIDB4MWIsIDB4MTQsIDApOwotCi0JcmV0dXJuIDE7Ci19Ci0KLSNkZWZpbmUgYWxjMjYyX2F1dG9faW5pdF9tdWx0aV9vdXQJYWxjODgyX2F1dG9faW5pdF9tdWx0aV9vdXQKLSNkZWZpbmUgYWxjMjYyX2F1dG9faW5pdF9ocF9vdXQJCWFsYzg4Ml9hdXRvX2luaXRfaHBfb3V0Ci0jZGVmaW5lIGFsYzI2Ml9hdXRvX2luaXRfYW5hbG9nX2lucHV0CWFsYzg4Ml9hdXRvX2luaXRfYW5hbG9nX2lucHV0Ci0jZGVmaW5lIGFsYzI2Ml9hdXRvX2luaXRfaW5wdXRfc3JjCWFsYzg4Ml9hdXRvX2luaXRfaW5wdXRfc3JjCi0KLQotLyogaW5pdCBjYWxsYmFjayBmb3IgYXV0by1jb25maWd1cmF0aW9uIG1vZGVsIC0tIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgaW5pdCAqLwotc3RhdGljIHZvaWQgYWxjMjYyX2F1dG9faW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlhbGMyNjJfYXV0b19pbml0X211bHRpX291dChjb2RlYyk7Ci0JYWxjMjYyX2F1dG9faW5pdF9ocF9vdXQoY29kZWMpOwotCWFsYzI2Ml9hdXRvX2luaXRfYW5hbG9nX2lucHV0KGNvZGVjKTsKLQlhbGMyNjJfYXV0b19pbml0X2lucHV0X3NyYyhjb2RlYyk7Ci0JYWxjX2F1dG9faW5pdF9kaWdpdGFsKGNvZGVjKTsKLQlpZiAoc3BlYy0+dW5zb2xfZXZlbnQpCi0JCWFsY19pbml0aG9vayhjb2RlYyk7Ci19Ci0KLS8qCi0gKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGMyNjJfbW9kZWxzW0FMQzI2Ml9NT0RFTF9MQVNUXSA9IHsKLQlbQUxDMjYyX0JBU0lDXQkJPSAiYmFzaWMiLAotCVtBTEMyNjJfSElQUE9dCQk9ICJoaXBwbyIsCi0JW0FMQzI2Ml9ISVBQT18xXQk9ICJoaXBwb18xIiwKLQlbQUxDMjYyX0ZVSklUU1VdCT0gImZ1aml0c3UiLAotCVtBTEMyNjJfSFBfQlBDXQkJPSAiaHAtYnBjIiwKLQlbQUxDMjYyX0hQX0JQQ19ENzAwMF9XTF09ICJocC1icGMtZDcwMDAiLAotCVtBTEMyNjJfSFBfVENfVDU3MzVdCT0gImhwLXRjLXQ1NzM1IiwKLQlbQUxDMjYyX0hQX1JQNTcwMF0JPSAiaHAtcnA1NzAwIiwKLQlbQUxDMjYyX0JFTlFfRUQ4XQk9ICJiZW5xIiwKLQlbQUxDMjYyX0JFTlFfVDMxXQk9ICJiZW5xLXQzMSIsCi0JW0FMQzI2Ml9TT05ZX0FTU0FNRF0JPSAic29ueS1hc3NhbWQiLAotCVtBTEMyNjJfVE9TSElCQV9TMDZdCT0gInRvc2hpYmEtczA2IiwKLQlbQUxDMjYyX1RPU0hJQkFfUlgxXQk9ICJ0b3NoaWJhLXJ4MSIsCi0JW0FMQzI2Ml9VTFRSQV0JCT0gInVsdHJhIiwKLQlbQUxDMjYyX0xFTk9WT18zMDAwXQk9ICJsZW5vdm8tMzAwMCIsCi0JW0FMQzI2Ml9ORUNdCQk9ICJuZWMiLAotCVtBTEMyNjJfVFlBTl0JCT0gInR5YW4iLAotCVtBTEMyNjJfQVVUT10JCT0gImF1dG8iLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2Ml9jZmdfdGJsW10gPSB7Ci0JU05EX1BDSV9RVUlSSygweDEwMDIsIDB4NDM3YiwgIkhpcHBvIiwgQUxDMjYyX0hJUFBPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzMywgMHg4ODk1LCAiTkVDIFZlcnNhIFM5MTAwIiwgQUxDMjYyX05FQyksCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTAzYywgMHhmZjAwLCAweDEyMDAsICJIUCB4dyBzZXJpZXMiLAotCQkJICAgQUxDMjYyX0hQX0JQQyksCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTAzYywgMHhmZjAwLCAweDEzMDAsICJIUCB4dyBzZXJpZXMiLAotCQkJICAgQUxDMjYyX0hQX0JQQyksCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTAzYywgMHhmZjAwLCAweDE1MDAsICJIUCB6IHNlcmllcyIsCi0JCQkgICBBTEMyNjJfSFBfQlBDKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MTcwMCwgIkhQIHh3IHNlcmllcyIsCi0JCQkgICBBTEMyNjJfSFBfQlBDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAwLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAxLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAyLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAzLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA0LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA1LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA2LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA3LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODBjLCAiSFAgeHc0NDAwIiwgQUxDMjYyX0hQX0JQQyksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNCwgIkhQIHh3NjQwMCIsIEFMQzI2Ml9IUF9CUEMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTUsICJIUCB4dzg0MDAiLCBBTEMyNjJfSFBfQlBDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDJmLCAiSFAgVGhpbiBDbGllbnQgVDU3MzUiLAotCQkgICAgICBBTEMyNjJfSFBfVENfVDU3MzUpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MTcsICJIUCBSUDU3MDAiLCBBTEMyNjJfSFBfUlA1NzAwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHgxZjAwLCAiU29ueSBBU1NBTUQiLCBBTEMyNjJfU09OWV9BU1NBTUQpLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgyMDMsICJTb255IFVYLTkwIiwgQUxDMjYyX0hJUFBPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MjBmLCAiU29ueSBBU1NBTUQiLCBBTEMyNjJfU09OWV9BU1NBTUQpLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwMTYsICJTb255IFZBSU8iLCBBTEMyNjJfQVVUTyksIC8qIGRpZy1vbmx5ICovCi0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTAyNSwgIlNvbnkgVkFJTyBaMjFNTiIsIEFMQzI2Ml9UT1NISUJBX1MwNiksCi0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTAzNSwgIlNvbnkgVkFJTyBWR04tRlcxNzBKIiwgQUxDMjYyX0FVVE8pLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwNDcsICJTb255IFZBSU8gVHlwZSBHIiwgQUxDMjYyX0FVVE8pLAotI2lmIDAgLyogZGlzYWJsZSB0aGUgcXVpcmsgc2luY2UgbW9kZWw9YXV0byB3b3JrcyBiZXR0ZXIgaW4gcmVjZW50IHZlcnNpb25zICovCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTA0ZCwgMHhmZjAwLCAweDkwMDAsICJTb255IFZBSU8iLAotCQkJICAgQUxDMjYyX1NPTllfQVNTQU1EKSwKLSNlbmRpZgotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweDAwMDEsICJUb3NoaWJhIGR5bmFib29rIFNTIFJYMSIsCi0JCSAgICAgIEFMQzI2Ml9UT1NISUJBX1JYMSksCi0JU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmY3YiwgIlRvc2hpYmEgUzA2IiwgQUxDMjYyX1RPU0hJQkFfUzA2KSwKLQlTTkRfUENJX1FVSVJLKDB4MTBjZiwgMHgxMzk3LCAiRnVqaXRzdSIsIEFMQzI2Ml9GVUpJVFNVKSwKLQlTTkRfUENJX1FVSVJLKDB4MTBjZiwgMHgxNDJkLCAiRnVqaXRzdSBMaWZlYm9vayBFODQxMCIsIEFMQzI2Ml9GVUpJVFNVKSwKLQlTTkRfUENJX1FVSVJLKDB4MTBmMSwgMHgyOTE1LCAiVHlhbiBUaHVuZGVyIG42NjUwVyIsIEFMQzI2Ml9UWUFOKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxNDRkLCAweGZmMDAsIDB4YzAzMiwgIlNhbXN1bmcgUTEiLAotCQkJICAgQUxDMjYyX1VMVFJBKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ0ZCwgMHhjNTEwLCAiU2Ftc3VuZyBRNDUiLCBBTEMyNjJfSElQUE8pLAotCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDM4NGUsICJMZW5vdm8gMzAwMCB5NDEwIiwgQUxDMjYyX0xFTk9WT18zMDAwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdmZiwgMHgwNTYwLCAiQmVucSBFRDgiLCBBTEMyNjJfQkVOUV9FRDgpLAotCVNORF9QQ0lfUVVJUksoMHgxN2ZmLCAweDA1OGQsICJCZW5xIFQzMS0xNiIsIEFMQzI2Ml9CRU5RX1QzMSksCi0JU05EX1BDSV9RVUlSSygweDE3ZmYsIDB4MDU4ZiwgIkJlbnEgSGlwcG8iLCBBTEMyNjJfSElQUE9fMSksCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjMjYyX3ByZXNldHNbXSA9IHsKLQlbQUxDMjYyX0JBU0lDXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYyX2Jhc2VfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzI2Ml9ISVBQT10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2Ml9oaXBwb19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsY19ocDE1X3Vuc29sX3ZlcmJzfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGlnX291dF9uaWQgPSBBTEMyNjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjJfaGlwcG9fc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjYyX0hJUFBPXzFdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfaGlwcG8xX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX2hpcHBvMV91bnNvbF92ZXJic30sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMiwKLQkJLmRpZ19vdXRfbmlkID0gQUxDMjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjYyX2hpcHBvMV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjJfRlVKSVRTVV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2Ml9mdWppdHN1X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX0VBUERfdmVyYnMsCi0JCQkJYWxjMjYyX2Z1aml0c3VfdW5zb2xfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGlnX291dF9uaWQgPSBBTEMyNjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjYyX2Z1aml0c3VfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9mdWppdHN1X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2Ml9IUF9CUENdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfSFBfQlBDX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfSFBfQlBDX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfSFBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9ocF9icGNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjYyX0hQX0JQQ19ENzAwMF9XRl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9IUF9ENzAwMF9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjYyX2hwX3dpbGR3ZXN0X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2Ml9IUF9CUENfRDcwMDBfV0xdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X21peGVyLAotCQkJICAgIGFsYzI2Ml9IUF9CUENfV2lsZFdlc3Rfb3B0aW9uX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfSFBfRDcwMDBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9ocF93aWxkd2VzdF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjJfSFBfVENfVDU3MzVdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfaHBfdDU3MzVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfaHBfdDU3MzVfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9ocF90NTczNV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjJfSFBfUlA1NzAwXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYyX2hwX3JwNTcwMF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml9ocF9ycDU3MDBfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9ocF9ycDU3MDBfY2FwdHVyZV9zb3VyY2UsCi0gICAgICAgIH0sCi0JW0FMQzI2Ml9CRU5RX0VEOF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2Ml9iYXNlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX0VBUERfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDMjYyX1NPTllfQVNTQU1EXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYyX3NvbnlfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfc29ueV91bnNvbF92ZXJic30sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMiwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjJfaGlwcG9fc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjYyX0JFTlFfVDMxXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYyX2JlbnFfdDMxX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX2JlbnFfdDMxX0VBUERfdmVyYnMsCi0JCQkJYWxjX2hwMTVfdW5zb2xfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9oaXBwb19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjJfVUxUUkFdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfdWx0cmFfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2Ml91bHRyYV9jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX3VsdHJhX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfdWx0cmFfY2FwdHVyZV9zb3VyY2UsCi0JCS5hZGNfbmlkcyA9IGFsYzI2Ml9hZGNfbmlkcywgLyogQURDMCAqLwotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjJfY2Fwc3JjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSAxLCAvKiBzaW5nbGUgQURDICovCi0JCS51bnNvbF9ldmVudCA9IGFsYzI2Ml91bHRyYV91bnNvbF9ldmVudCwKLQkJLmluaXRfaG9vayA9IGFsYzI2Ml91bHRyYV9hdXRvbXV0ZSwKLQl9LAotCVtBTEMyNjJfTEVOT1ZPXzMwMDBdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfbGVub3ZvXzMwMDBfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfRUFQRF92ZXJicywKLQkJCQlhbGMyNjJfbGVub3ZvXzMwMDBfdW5zb2xfdmVyYnMsCi0JCQkJYWxjMjYyX2xlbm92b18zMDAwX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGlnX291dF9uaWQgPSBBTEMyNjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjYyX2Z1aml0c3VfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9sZW5vdm9fMzAwMF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjJfTkVDXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYyX25lY19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX25lY192ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEMyNjJfVE9TSElCQV9TMDZdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfdG9zaGliYV9zMDZfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfdG9zaGliYV9zMDZfdmVyYnMsCi0JCQkJCQkJYWxjMjYyX2VhcGRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjJfZG1pY19jYXBzcmNfbmlkcywKLQkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAotCQkuYWRjX25pZHMgPSBhbGMyNjJfZG1pY19hZGNfbmlkcywgLyogQURDMCAqLwotCQkubnVtX2FkY19uaWRzID0gMSwgLyogc2luZ2xlIEFEQyAqLwotCQkuZGlnX291dF9uaWQgPSBBTEMyNjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml90b3NoaWJhX3MwNl9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjJfVE9TSElCQV9SWDFdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfdG9zaGliYV9yeDFfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfdG9zaGliYV9yeDFfdW5zb2xfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9oaXBwb19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjJfVFlBTl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2Ml90eWFuX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX3R5YW5fdmVyYnN9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDIsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzI2Ml9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml90eWFuX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAotCX0sCi19OwotCi1zdGF0aWMgaW50IHBhdGNoX2FsYzI2MihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWM7Ci0JaW50IGJvYXJkX2NvbmZpZzsKLQlpbnQgZXJyOwotCi0Jc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNwZWMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljb2RlYy0+c3BlYyA9IHNwZWM7Ci0jaWYgMAotCS8qIHBzaG91IDA3LzExLzA1ICBzZXQgYSB6ZXJvIFBDTSBzYW1wbGUgdG8gREFDIHdoZW4gRklGTyBpcwotCSAqIHVuZGVyLXJ1bgotCSAqLwotCXsKLQlpbnQgdG1wOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MWEsIDAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDcpOwotCXRtcCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgyMCwgMCwgQUNfVkVSQl9HRVRfUFJPQ19DT0VGLCAwKTsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDFhLCAwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCA3KTsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDFhLCAwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIHRtcCB8IDB4ODApOwotCX0KLSNlbmRpZgotCWFsY19hdXRvX3BhcnNlX2N1c3RvbWl6ZV9kZWZpbmUoY29kZWMpOwotCi0JYWxjX2ZpeF9wbGxfaW5pdChjb2RlYywgMHgyMCwgMHgwYSwgMTApOwotCi0JYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFMQzI2Ml9NT0RFTF9MQVNULAotCQkJCQkJICBhbGMyNjJfbW9kZWxzLAotCQkJCQkJICBhbGMyNjJfY2ZnX3RibCk7Ci0KLQlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJYm9hcmRfY29uZmlnID0gQUxDMjYyX0FVVE87Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEMyNjJfQVVUTykgewotCQlhbGNfcGlja19maXh1cChjb2RlYywgTlVMTCwgYWxjMjYyX2ZpeHVwX3RibCwgYWxjMjYyX2ZpeHVwcyk7Ci0JCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgPT0gQUxDMjYyX0FVVE8pIHsKLQkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCi0JCWVyciA9IGFsYzI2Ml9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgaWYgKCFlcnIpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBiYXNlIG1vZGUuLi5cbiIpOwotCQkJYm9hcmRfY29uZmlnID0gQUxDMjYyX0JBU0lDOwotCQl9Ci0JfQotCi0JaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgaGFzX2NkZWZpbmVfYmVlcChjb2RlYykpIHsKLQkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyAhPSBBTEMyNjJfQVVUTykKLQkJc2V0dXBfcHJlc2V0KGNvZGVjLCAmYWxjMjYyX3ByZXNldHNbYm9hcmRfY29uZmlnXSk7Ci0KLQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJmFsYzI2Ml9wY21fYW5hbG9nX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZhbGMyNjJfcGNtX2FuYWxvZ19jYXB0dXJlOwotCi0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmYWxjMjYyX3BjbV9kaWdpdGFsX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUgPSAmYWxjMjYyX3BjbV9kaWdpdGFsX2NhcHR1cmU7Ci0KLQlpZiAoIXNwZWMtPmFkY19uaWRzICYmIHNwZWMtPmlucHV0X211eCkgewotCQlpbnQgaTsKLQkJLyogY2hlY2sgd2hldGhlciB0aGUgZGlnaXRhbC1taWMgaGFzIHRvIGJlIHN1cHBvcnRlZCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+aW5wdXRfbXV4LT5udW1faXRlbXM7IGkrKykgewotCQkJaWYgKHNwZWMtPmlucHV0X211eC0+aXRlbXNbaV0uaW5kZXggPj0gOSkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA8IHNwZWMtPmlucHV0X211eC0+bnVtX2l0ZW1zKSB7Ci0JCQkvKiB1c2Ugb25seSBBREMwICovCi0JCQlzcGVjLT5hZGNfbmlkcyA9IGFsYzI2Ml9kbWljX2FkY19uaWRzOwotCQkJc3BlYy0+bnVtX2FkY19uaWRzID0gMTsKLQkJCXNwZWMtPmNhcHNyY19uaWRzID0gYWxjMjYyX2RtaWNfY2Fwc3JjX25pZHM7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBhbGwgYW5hbG9nIGlucHV0cyAqLwotCQkJLyogY2hlY2sgd2hldGhlciBOSUQgMHgwNyBpcyB2YWxpZCAqLwotCQkJdW5zaWduZWQgaW50IHdjYXAgPSBnZXRfd2NhcHMoY29kZWMsIDB4MDcpOwotCi0JCQkvKiBnZXQgdHlwZSAqLwotCQkJd2NhcCA9IGdldF93Y2Fwc190eXBlKHdjYXApOwotCQkJaWYgKHdjYXAgIT0gQUNfV0lEX0FVRF9JTikgewotCQkJCXNwZWMtPmFkY19uaWRzID0gYWxjMjYyX2FkY19uaWRzX2FsdDsKLQkJCQlzcGVjLT5udW1fYWRjX25pZHMgPQotCQkJCQlBUlJBWV9TSVpFKGFsYzI2Ml9hZGNfbmlkc19hbHQpOwotCQkJCXNwZWMtPmNhcHNyY19uaWRzID0gYWxjMjYyX2NhcHNyY19uaWRzX2FsdDsKLQkJCX0gZWxzZSB7Ci0JCQkJc3BlYy0+YWRjX25pZHMgPSBhbGMyNjJfYWRjX25pZHM7Ci0JCQkJc3BlYy0+bnVtX2FkY19uaWRzID0KLQkJCQkJQVJSQVlfU0laRShhbGMyNjJfYWRjX25pZHMpOwotCQkJCXNwZWMtPmNhcHNyY19uaWRzID0gYWxjMjYyX2NhcHNyY19uaWRzOwotCQkJfQotCQl9Ci0JfQotCWlmICghc3BlYy0+Y2FwX21peGVyICYmICFzcGVjLT5ub19hbmFsb2cpCi0JCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKLQlpZiAoIXNwZWMtPm5vX2FuYWxvZyAmJiBoYXNfY2RlZmluZV9iZWVwKGNvZGVjKSkKLQkJc2V0X2JlZXBfYW1wKHNwZWMsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCk7Ci0KLQlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJPQkUpOwotCi0Jc3BlYy0+dm1hc3Rlcl9uaWQgPSAweDBjOwotCi0JY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7Ci0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEMyNjJfQVVUTykKLQkJc3BlYy0+aW5pdF9ob29rID0gYWxjMjYyX2F1dG9faW5pdDsKLQlzcGVjLT5zaHV0dXAgPSBhbGNfZWFwZF9zaHV0dXA7Ci0KLQlhbGNfaW5pdF9qYWNrcyhjb2RlYyk7Ci0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotCWlmICghc3BlYy0+bG9vcGJhY2suYW1wbGlzdCkKLQkJc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IGFsYzI2Ml9sb29wYmFja3M7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotfQotCi0vKgotICogIEFMQzI2OCBjaGFubmVsIHNvdXJjZSBzZXR0aW5nICgyIGNoYW5uZWwpCi0gKi8KLSNkZWZpbmUgQUxDMjY4X0RJR09VVF9OSUQJQUxDODgwX0RJR09VVF9OSUQKLSNkZWZpbmUgYWxjMjY4X21vZGVzCQlhbGMyNjBfbW9kZXMKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjhfZGFjX25pZHNbMl0gPSB7Ci0JLyogZnJvbnQsIGhwICovCi0JMHgwMiwgMHgwMwotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjhfYWRjX25pZHNbMl0gPSB7Ci0JLyogQURDMC0xICovCi0JMHgwOCwgMHgwNwotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjhfYWRjX25pZHNfYWx0WzFdID0gewotCS8qIEFEQzAgKi8KLQkweDA4Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OF9jYXBzcmNfbmlkc1syXSA9IHsgMHgyMywgMHgyNCB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2Jhc2VfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X3Rvc2hpYmFfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgzLCAweDAsIEhEQV9PVVRQVVQpLAotCUFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENILAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgSW4gQm9vc3QgVm9sdW1lIiwgMHgxYSwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLS8qIGJpbmQgQmVlcCBzd2l0Y2hlcyBvZiBib3RoIE5JRCAweDBmIGFuZCAweDEwICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjMjY4X2JpbmRfYmVlcF9zdyA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MGYsIDMsIDEsIEhEQV9JTlBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxMCwgMywgMSwgSERBX0lOUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2JlZXBfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJCZWVwIFBsYXliYWNrIFZvbHVtZSIsIDB4MWQsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQklORF9TVygiQmVlcCBQbGF5YmFjayBTd2l0Y2giLCAmYWxjMjY4X2JpbmRfYmVlcF9zdyksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF9lYXBkX3ZlcmJzW10gPSB7Ci0JezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAotCXsgfQotfTsKLQotLyogVG9zaGliYSBzcGVjaWZpYyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjhfdG9zaGliYV92ZXJic1tdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBBY2VyIHNwZWNpZmljICovCi0vKiBiaW5kIHZvbHVtZXMgb2YgYm90aCBOSUQgMHgwMiBhbmQgMHgwMyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF92b2wsCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDAyLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDAzLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBhbGMyNjhfYWNlcl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotI2RlZmluZSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfZ2V0CWFsYzI2Ml9ocF9tYXN0ZXJfc3dfZ2V0Ci0jZGVmaW5lIGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQJYWxjMjYyX2hwX21hc3Rlcl9zd19wdXQKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9hY2VyX2FzcGlyZV9vbmVfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjhfYWNlcl9iaW5kX21hc3Rlcl92b2wpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAotCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IDB4MTUsCi0JCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywKLQkJLmdldCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19nZXQsCi0JCS5wdXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfcHV0LAotCX0sCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfYWNlcl9taXhlcltdID0gewotCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX05JRF9GTEFHIHwgMHgxNCwKLQkJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAotCQkuZ2V0ID0gYWxjMjY4X2FjZXJfbWFzdGVyX3N3X2dldCwKLQkJLnB1dCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQsCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2FjZXJfZG1pY19taXhlcltdID0gewotCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX05JRF9GTEFHIHwgMHgxNCwKLQkJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAotCQkuZ2V0ID0gYWxjMjY4X2FjZXJfbWFzdGVyX3N3X2dldCwKLQkJLnB1dCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQsCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF9hY2VyX2FzcGlyZV9vbmVfdmVyYnNbXSA9IHsKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDA2fSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhhMDE3fSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY4X2FjZXJfdmVyYnNbXSA9IHsKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LCAvKiBpbnRlcm5hbCBkbWljPyAqLwotCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JeyB9Ci19OwotCi0vKiB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBzZW5zaW5nICovCi0jZGVmaW5lIGFsYzI2OF90b3NoaWJhX3NldHVwCQlhbGMyNjJfaGlwcG9fc2V0dXAKLQotc3RhdGljIHZvaWQgYWxjMjY4X2FjZXJfbGNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwZjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljLnBpbiA9IDB4MTg7Ci0Jc3BlYy0+ZXh0X21pYy5tdXhfaWR4ID0gMDsKLQlzcGVjLT5pbnRfbWljLnBpbiA9IDB4MTI7Ci0Jc3BlYy0+aW50X21pYy5tdXhfaWR4ID0gNjsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfZGVsbF9taXhlcltdID0gewotCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjhfZGVsbF92ZXJic1tdID0gewotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX01JQ19FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7IH0KLX07Ci0KLS8qIG11dGUvdW5tdXRlIGludGVybmFsIHNwZWFrZXIgYWNjb3JkaW5nIHRvIHRoZSBocCBqYWNrIGFuZCBtdXRlIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGMyNjhfZGVsbF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmV4dF9taWMucGluID0gMHgxODsKLQlzcGVjLT5leHRfbWljLm11eF9pZHggPSAwOwotCXNwZWMtPmludF9taWMucGluID0gMHgxOTsKLQlzcGVjLT5pbnRfbWljLm11eF9pZHggPSAxOwotCXNwZWMtPmF1dG9fbWljID0gMTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjdfcXVhbnRhX2lsMV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJNaWMgQ2FwdHVyZSBTd2l0Y2giLCAweDIzLCAyLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY3X3F1YW50YV9pbDFfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX01JQ19FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzI2N19xdWFudGFfaWwxX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmV4dF9taWMucGluID0gMHgxODsKLQlzcGVjLT5leHRfbWljLm11eF9pZHggPSAwOwotCXNwZWMtPmludF9taWMucGluID0gMHgxOTsKLQlzcGVjLT5pbnRfbWljLm11eF9pZHggPSAxOwotCXNwZWMtPmF1dG9fbWljID0gMTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci19Ci0KLS8qCi0gKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY4X2Jhc2VfaW5pdF92ZXJic1tdID0gewotCS8qIFVubXV0ZSBEQUMwLTEgYW5kIHNldCB2b2wgPSAwICovCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDBjIC0gMHgwZSkKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLSAgICAgICAgezB4MGUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQl7MHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCi0JLyogc2V0IFBDQkVFUCB2b2wgPSAwLCBtdXRlIGNvbm5lY3Rpb25zICovCi0JezB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQotCS8qIFVubXV0ZSBTZWxlY3RvciAyM2gsMjRoIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluICovCi0KLQl7MHgyMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JeyB9Ci19OwotCi0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF92b2x1bWVfaW5pdF92ZXJic1tdID0gewotCS8qIHNldCBvdXRwdXQgREFDICovCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQl7MHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0KLQkvKiBzZXQgUENCRUVQIHZvbCA9IDAsIG11dGUgY29ubmVjdGlvbnMgKi8KLQl7MHgxZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2NhcHR1cmVfbm9zcmNfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2NhcHR1cmVfYWx0X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCi0JX0RFRklORV9DQVBTUkMoMSksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMSwgMHgyNCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMSwgMHgyNCwgMHgwLCBIREFfT1VUUFVUKSwKLQlfREVGSU5FX0NBUFNSQygyKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjY4X2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSA0LAotCS5pdGVtcyA9IHsKLQkJeyAiTWljIiwgMHgwIH0sCi0JCXsgIkZyb250IE1pYyIsIDB4MSB9LAotCQl7ICJMaW5lIiwgMHgyIH0sCi0JCXsgIkNEIiwgMHgzIH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjhfYWNlcl9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMywKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJJbnRlcm5hbCBNaWMiLCAweDEgfSwKLQkJeyAiTGluZSIsIDB4MiB9LAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjY4X2FjZXJfZG1pY19jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMywKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJJbnRlcm5hbCBNaWMiLCAweDYgfSwKLQkJeyAiTGluZSIsIDB4MiB9LAotCX0sCi19OwotCi0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF90ZXN0X21peGVyW10gPSB7Ci0JLyogVm9sdW1lIHdpZGdldHMgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJMT1VUMSBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxPVVQyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJNb25vIHN1bSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX01VVEUoIkxJTkUtT1VUIHN1bSBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAyLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX01VVEUoIkhQLU9VVCBzdW0gUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFKCJMSU5FLU9VVCBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAyLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJIUC1PVVQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMiwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNSUMxIENhcHR1cmUgVm9sdW1lIiwgMHgxOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX01VVEUoIk1JQzEgQ2FwdHVyZSBTd2l0Y2giLCAweDE4LCAyLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNSUMyIENhcHR1cmUgVm9sdW1lIiwgMHgxOSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxJTkUxIENhcHR1cmUgVm9sdW1lIiwgMHgxYSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9CSU5EX01VVEUoIkxJTkUxIENhcHR1cmUgU3dpdGNoIiwgMHgxYSwgMiwgSERBX09VVFBVVCksCi0JLyogVGhlIGJlbG93IGFwcGVhcnMgcHJvYmxlbWF0aWMgb24gc29tZSBoYXJkd2FyZXMgKi8KLQkvKkhEQV9DT0RFQ19WT0xVTUUoIlBDQkVFUCBQbGF5YmFjayBWb2x1bWUiLCAweDFkLCAweDAsIEhEQV9JTlBVVCksKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJQQ00tSU4xIENhcHR1cmUgVm9sdW1lIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJQQ00tSU4xIENhcHR1cmUgU3dpdGNoIiwgMHgyMywgMiwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiUENNLUlOMiBDYXB0dXJlIFZvbHVtZSIsIDB4MjQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiUENNLUlOMiBDYXB0dXJlIFN3aXRjaCIsIDB4MjQsIDIsIEhEQV9PVVRQVVQpLAotCi0JLyogTW9kZXMgZm9yIHJldGFza2luZyBwaW4gd2lkZ2V0cyAqLwotCUFMQ19QSU5fTU9ERSgiTElORS1PVVQgcGluIG1vZGUiLCAweDE0LCBBTENfUElOX0RJUl9JTk9VVCksCi0JQUxDX1BJTl9NT0RFKCJIUC1PVVQgcGluIG1vZGUiLCAweDE1LCBBTENfUElOX0RJUl9JTk9VVCksCi0JQUxDX1BJTl9NT0RFKCJNSUMxIHBpbiBtb2RlIiwgMHgxOCwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCUFMQ19QSU5fTU9ERSgiTElORTEgcGluIG1vZGUiLCAweDFhLCBBTENfUElOX0RJUl9JTk9VVCksCi0KLQkvKiBDb250cm9scyBmb3IgR1BJTyBwaW5zLCBhc3N1bWluZyB0aGV5IGFyZSBjb25maWd1cmVkIGFzIG91dHB1dHMgKi8KLQlBTENfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMCIsIDB4MDEsIDB4MDEpLAotCUFMQ19HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAxIiwgMHgwMSwgMHgwMiksCi0JQUxDX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDIiLCAweDAxLCAweDA0KSwKLQlBTENfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMyIsIDB4MDEsIDB4MDgpLAotCi0JLyogU3dpdGNoZXMgdG8gYWxsb3cgdGhlIGRpZ2l0YWwgU1BESUYgb3V0cHV0IHBpbiB0byBiZSBlbmFibGVkLgotCSAqIFRoZSBBTEMyNjggZG9lcyBub3QgaGF2ZSBhbiBTUERJRiBpbnB1dC4KLQkgKi8KLQlBTENfU1BESUZfQ1RSTF9TV0lUQ0goIlNQRElGIFBsYXliYWNrIFN3aXRjaCIsIDB4MDYsIDB4MDEpLAotCi0JLyogQSBzd2l0Y2ggYWxsb3dpbmcgRUFQRCB0byBiZSBlbmFibGVkLiAgU29tZSBsYXB0b3BzIHNlZW0gdG8gdXNlCi0JICogdGhpcyBvdXRwdXQgdG8gdHVybiBvbiBhbiBleHRlcm5hbCBhbXBsaWZpZXIuCi0JICovCi0JQUxDX0VBUERfQ1RSTF9TV0lUQ0goIkxJTkUtT1VUIEVBUEQgRW5hYmxlIFN3aXRjaCIsIDB4MGYsIDB4MDIpLAotCUFMQ19FQVBEX0NUUkxfU1dJVENIKCJIUC1PVVQgRUFQRCBFbmFibGUgU3dpdGNoIiwgMHgxMCwgMHgwMiksCi0KLQl7IH0gLyogZW5kICovCi19OwotI2VuZGlmCi0KLS8qIGNyZWF0ZSBpbnB1dCBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciB0aGUgZ2l2ZW4gcGluICovCi1zdGF0aWMgaW50IGFsYzI2OF9uZXdfYW5hbG9nX291dHB1dChzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmN0bG5hbWUsIGludCBpZHgpCi17Ci0JaGRhX25pZF90IGRhYzsKLQlpbnQgZXJyOwotCi0Jc3dpdGNoIChuaWQpIHsKLQljYXNlIDB4MTQ6Ci0JY2FzZSAweDE2OgotCQlkYWMgPSAweDAyOwotCQlicmVhazsKLQljYXNlIDB4MTU6Ci0JY2FzZSAweDFhOiAvKiBBTEMyNTkvMjY5IG9ubHkgKi8KLQljYXNlIDB4MWI6IC8qIEFMQzI1OS8yNjkgb25seSAqLwotCWNhc2UgMHgyMTogLyogQUxDMjY5dmIgaGFzIHRoaXMgcGluLCB0b28gKi8KLQkJZGFjID0gMHgwMzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc25kX3ByaW50ZChLRVJOX1dBUk5JTkcgImhkYV9jb2RlYzogIgotCQkJICAgImlnbm9yaW5nIHBpbiAweCV4IGFzIHVua25vd25cbiIsIG5pZCk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF0gIT0gZGFjICYmCi0JICAgIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzFdICE9IGRhYykgewotCQllcnIgPSBhZGRfcGJfdm9sX2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBjdGxuYW1lLAotCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChkYWMsIDMsIGlkeCwKLQkJCQkJCSAgICAgIEhEQV9PVVRQVVQpKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW3NwZWMtPm11bHRpb3V0Lm51bV9kYWNzKytdID0gZGFjOwotCX0KLQotCWlmIChuaWQgIT0gMHgxNikKLQkJZXJyID0gYWRkX3BiX3N3X2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwgY3RsbmFtZSwKLQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIGlkeCwgSERBX09VVFBVVCkpOwotCWVsc2UgLyogbW9ubyAqLwotCQllcnIgPSBhZGRfcGJfc3dfY3RybChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBjdGxuYW1lLAotCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMiwgaWR4LCBIREFfT1VUUFVUKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmcm9tIHRoZSBwYXJzZWQgREFDIHRhYmxlICovCi1zdGF0aWMgaW50IGFsYzI2OF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCi0JCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCWhkYV9uaWRfdCBuaWQ7Ci0JaW50IGVycjsKLQotCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gc3BlYy0+cHJpdmF0ZV9kYWNfbmlkczsKLQotCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1swXTsKLQlpZiAobmlkKSB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0JCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpCi0JCQluYW1lID0gIlNwZWFrZXIiOwotCQllbHNlCi0JCQluYW1lID0gIkZyb250IjsKLQkJZXJyID0gYWxjMjY4X25ld19hbmFsb2dfb3V0cHV0KHNwZWMsIG5pZCwgbmFtZSwgMCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQluaWQgPSBjZmctPnNwZWFrZXJfcGluc1swXTsKLQlpZiAobmlkID09IDB4MWQpIHsKLQkJZXJyID0gYWRkX3BiX3ZvbF9jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgIlNwZWFrZXIiLAotCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9JTlBVVCkpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfSBlbHNlIGlmIChuaWQpIHsKLQkJZXJyID0gYWxjMjY4X25ld19hbmFsb2dfb3V0cHV0KHNwZWMsIG5pZCwgIlNwZWFrZXIiLCAwKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQluaWQgPSBjZmctPmhwX3BpbnNbMF07Ci0JaWYgKG5pZCkgewotCQllcnIgPSBhbGMyNjhfbmV3X2FuYWxvZ19vdXRwdXQoc3BlYywgbmlkLCAiSGVhZHBob25lIiwgMCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbMV0gfCBjZmctPmxpbmVfb3V0X3BpbnNbMl07Ci0JaWYgKG5pZCA9PSAweDE2KSB7Ci0JCWVyciA9IGFkZF9wYl9zd19jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsICJNb25vIiwKLQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAyLCAwLCBIREFfT1VUUFVUKSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGNyZWF0ZSBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciBpbnB1dCBwaW5zICovCi1zdGF0aWMgaW50IGFsYzI2OF9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCXJldHVybiBhbGNfYXV0b19jcmVhdGVfaW5wdXRfY3Rscyhjb2RlYywgY2ZnLCAwLCAweDIzLCAweDI0KTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY4X2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgICBoZGFfbmlkX3QgbmlkLCBpbnQgcGluX3R5cGUpCi17Ci0JaW50IGlkeDsKLQotCWFsY19zZXRfcGluX291dHB1dChjb2RlYywgbmlkLCBwaW5fdHlwZSk7Ci0JaWYgKG5pZCA9PSAweDE0IHx8IG5pZCA9PSAweDE2KQotCQlpZHggPSAwOwotCWVsc2UKLQkJaWR4ID0gMTsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBpZHgpOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjhfYXV0b19pbml0X211bHRpX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0czsgaSsrKSB7Ci0JCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbaV07Ci0JCWludCBwaW5fdHlwZSA9IGdldF9waW5fdHlwZShzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3R5cGUpOwotCQlhbGMyNjhfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgcGluX3R5cGUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYWxjMjY4X2F1dG9faW5pdF9ocF9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaGRhX25pZF90IHBpbjsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLmhwX291dHM7IGkrKykgewotCQlwaW4gPSBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbaV07Ci0JCWFsYzI2OF9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgcGluLCBQSU5fSFApOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+YXV0b2NmZy5zcGVha2VyX291dHM7IGkrKykgewotCQlwaW4gPSBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1tpXTsKLQkJYWxjMjY4X2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9PVVQpOwotCX0KLQlpZiAoc3BlYy0+YXV0b2NmZy5tb25vX291dF9waW4pCi0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNwZWMtPmF1dG9jZmcubW9ub19vdXRfcGluLCAwLAotCQkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQpOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjhfYXV0b19pbml0X21vbm9fc3BlYWtlcl9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaGRhX25pZF90IHNwZWFrZXJfbmlkID0gc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF07Ci0JaGRhX25pZF90IGhwX25pZCA9IHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXTsKLQloZGFfbmlkX3QgbGluZV9uaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF07Ci0JdW5zaWduZWQgaW50CWRhY192b2wxLCBkYWNfdm9sMjsKLQotCWlmIChsaW5lX25pZCA9PSAweDFkIHx8IHNwZWFrZXJfbmlkID09IDB4MWQpIHsKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgc3BlYWtlcl9uaWQsIDAsCi0JCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCk7Ci0JCS8qIG11dGUgbWl4ZXIgaW5wdXRzIGZyb20gMHgxZCAqLwotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDBmLCAwLAotCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAotCQkJCSAgICBBTVBfSU5fVU5NVVRFKDEpKTsKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxMCwgMCwKLQkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKLQkJCQkgICAgQU1QX0lOX1VOTVVURSgxKSk7Ci0JfSBlbHNlIHsKLQkJLyogdW5tdXRlIG1peGVyIGlucHV0cyBmcm9tIDB4MWQgKi8KLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgwZiwgMCwKLQkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSkpOwotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDEwLCAwLAotCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKSk7Ci0JfQotCi0JZGFjX3ZvbDEgPSBkYWNfdm9sMiA9IDB4YjAwMCB8IDB4NDA7CS8qIHNldCBtYXggdm9sdW1lICAqLwotCWlmIChsaW5lX25pZCA9PSAweDE0KQotCQlkYWNfdm9sMiA9IEFNUF9PVVRfWkVSTzsKLQllbHNlIGlmIChsaW5lX25pZCA9PSAweDE1KQotCQlkYWNfdm9sMSA9IEFNUF9PVVRfWkVSTzsKLQlpZiAoaHBfbmlkID09IDB4MTQpCi0JCWRhY192b2wyID0gQU1QX09VVF9aRVJPOwotCWVsc2UgaWYgKGhwX25pZCA9PSAweDE1KQotCQlkYWNfdm9sMSA9IEFNUF9PVVRfWkVSTzsKLQlpZiAobGluZV9uaWQgIT0gMHgxNiB8fCBocF9uaWQgIT0gMHgxNiB8fAotCSAgICBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMV0gIT0gMHgxNiB8fAotCSAgICBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMl0gIT0gMHgxNikKLQkJZGFjX3ZvbDEgPSBkYWNfdm9sMiA9IEFNUF9PVVRfWkVSTzsKLQotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MDIsIDAsCi0JCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgZGFjX3ZvbDEpOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MDMsIDAsCi0JCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgZGFjX3ZvbDIpOwotfQotCi0vKiBwY20gY29uZmlndXJhdGlvbjogaWRlbnRpY2FsIHdpdGggQUxDODgwICovCi0jZGVmaW5lIGFsYzI2OF9wY21fYW5hbG9nX3BsYXliYWNrCWFsYzg4MF9wY21fYW5hbG9nX3BsYXliYWNrCi0jZGVmaW5lIGFsYzI2OF9wY21fYW5hbG9nX2NhcHR1cmUJYWxjODgwX3BjbV9hbmFsb2dfY2FwdHVyZQotI2RlZmluZSBhbGMyNjhfcGNtX2FuYWxvZ19hbHRfY2FwdHVyZQlhbGM4ODBfcGNtX2FuYWxvZ19hbHRfY2FwdHVyZQotI2RlZmluZSBhbGMyNjhfcGNtX2RpZ2l0YWxfcGxheWJhY2sJYWxjODgwX3BjbV9kaWdpdGFsX3BsYXliYWNrCi0KLS8qCi0gKiBCSU9TIGF1dG8gY29uZmlndXJhdGlvbgotICovCi1zdGF0aWMgaW50IGFsYzI2OF9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgZXJyOwotCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY4X2lnbm9yZVtdID0geyAwIH07Ci0KLQllcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywKLQkJCQkJICAgYWxjMjY4X2lnbm9yZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JaWYgKCFzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cykgewotCQlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0cyB8fCBzcGVjLT5hdXRvY2ZnLmRpZ19pbl9waW4pIHsKLQkJCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IDI7Ci0JCQlzcGVjLT5ub19hbmFsb2cgPSAxOwotCQkJZ290byBkaWdfb25seTsKLQkJfQotCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KLQl9Ci0JZXJyID0gYWxjMjY4X2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGMyNjhfYXV0b19jcmVhdGVfaW5wdXRfY3Rscyhjb2RlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0Jc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKLQotIGRpZ19vbmx5OgotCS8qIGRpZ2l0YWwgb25seSBzdXBwb3J0IG91dHB1dCAqLwotCWFsY19hdXRvX3BhcnNlX2RpZ2l0YWwoY29kZWMpOwotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlhZGRfbWl4ZXIoc3BlYywgc3BlYy0+a2N0bHMubGlzdCk7Ci0KLQlpZiAoIXNwZWMtPm5vX2FuYWxvZyAmJiBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSAhPSAweDFkKQotCQlhZGRfbWl4ZXIoc3BlYywgYWxjMjY4X2JlZXBfbWl4ZXIpOwotCi0JYWRkX3ZlcmIoc3BlYywgYWxjMjY4X3ZvbHVtZV9pbml0X3ZlcmJzKTsKLQlzcGVjLT5udW1fbXV4X2RlZnMgPSAyOwotCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07Ci0KLQllcnIgPSBhbGNfYXV0b19hZGRfbWljX2Jvb3N0KGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWFsY19zc2lkX2NoZWNrKGNvZGVjLCAweDE1LCAweDFiLCAweDE0LCAwKTsKLQotCXJldHVybiAxOwotfQotCi0jZGVmaW5lIGFsYzI2OF9hdXRvX2luaXRfYW5hbG9nX2lucHV0CWFsYzg4Ml9hdXRvX2luaXRfYW5hbG9nX2lucHV0Ci0jZGVmaW5lIGFsYzI2OF9hdXRvX2luaXRfaW5wdXRfc3JjCWFsYzg4Ml9hdXRvX2luaXRfaW5wdXRfc3JjCi0KLS8qIGluaXQgY2FsbGJhY2sgZm9yIGF1dG8tY29uZmlndXJhdGlvbiBtb2RlbCAtLSBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IGluaXQgKi8KLXN0YXRpYyB2b2lkIGFsYzI2OF9hdXRvX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JYWxjMjY4X2F1dG9faW5pdF9tdWx0aV9vdXQoY29kZWMpOwotCWFsYzI2OF9hdXRvX2luaXRfaHBfb3V0KGNvZGVjKTsKLQlhbGMyNjhfYXV0b19pbml0X21vbm9fc3BlYWtlcl9vdXQoY29kZWMpOwotCWFsYzI2OF9hdXRvX2luaXRfYW5hbG9nX2lucHV0KGNvZGVjKTsKLQlhbGMyNjhfYXV0b19pbml0X2lucHV0X3NyYyhjb2RlYyk7Ci0JYWxjX2F1dG9faW5pdF9kaWdpdGFsKGNvZGVjKTsKLQlpZiAoc3BlYy0+dW5zb2xfZXZlbnQpCi0JCWFsY19pbml0aG9vayhjb2RlYyk7Ci19Ci0KLS8qCi0gKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGMyNjhfbW9kZWxzW0FMQzI2OF9NT0RFTF9MQVNUXSA9IHsKLQlbQUxDMjY3X1FVQU5UQV9JTDFdCT0gInF1YW50YS1pbDEiLAotCVtBTEMyNjhfM1NUXQkJPSAiM3N0YWNrIiwKLQlbQUxDMjY4X1RPU0hJQkFdCT0gInRvc2hpYmEiLAotCVtBTEMyNjhfQUNFUl0JCT0gImFjZXIiLAotCVtBTEMyNjhfQUNFUl9ETUlDXQk9ICJhY2VyLWRtaWMiLAotCVtBTEMyNjhfQUNFUl9BU1BJUkVfT05FXQk9ICJhY2VyLWFzcGlyZSIsCi0JW0FMQzI2OF9ERUxMXQkJPSAiZGVsbCIsCi0JW0FMQzI2OF9aRVBUT10JCT0gInplcHRvIiwKLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0JW0FMQzI2OF9URVNUXQkJPSAidGVzdCIsCi0jZW5kaWYKLQlbQUxDMjY4X0FVVE9dCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjhfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMWUsICJBY2VyIEFzcGlyZSA1NzIweiIsIEFMQzI2OF9BQ0VSKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTI2LCAiQWNlciIsIEFMQzI2OF9BQ0VSKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTJlLCAiQWNlciBBc3BpcmUgNTMxMCIsIEFMQzI2OF9BQ0VSKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTMwLCAiQWNlciBFeHRlbnNhIDUyMTAiLCBBTEMyNjhfQUNFUiksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEzNiwgIkFjZXIgQXNwaXJlIDUzMTUiLCBBTEMyNjhfQUNFUiksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDE1YiwgIkFjZXIgQXNwaXJlIE9uZSIsCi0JCQkJCQlBTEMyNjhfQUNFUl9BU1BJUkVfT05FKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMjUzLCAiRGVsbCBPRU0iLCBBTEMyNjhfREVMTCksCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTAyOCwgMHhmZmYwLCAweDAyYjAsCi0JCQkiRGVsbCBJbnNwaXJvbiBNaW5pOS9Wb3N0cm8gQTkwIiwgQUxDMjY4X0RFTEwpLAotCS8qIGFsbW9zdCBjb21wYXRpYmxlIHdpdGggdG9zaGliYSBidXQgd2l0aCBvcHRpb25hbCBkaWdpdGFsIG91dHM7Ci0JICogYXV0by1wcm9iaW5nIHNlZW1zIHdvcmtpbmcgZmluZQotCSAqLwotCVNORF9QQ0lfUVVJUktfTUFTSygweDEwM2MsIDB4ZmYwMCwgMHgzMDAwLCAiSFAgVFgyNXh4IHNlcmllcyIsCi0JCQkgICBBTEMyNjhfQVVUTyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTIwNSwgIkFTVVMgVzdKIiwgQUxDMjY4XzNTVCksCi0JU05EX1BDSV9RVUlSSygweDExNzAsIDB4MDA0MCwgIlpFUFRPIiwgQUxDMjY4X1pFUFRPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTRjMCwgMHgwMDI1LCAiQ09NUEFMIElGTDkwL0pGTC05MiIsIEFMQzI2OF9UT1NISUJBKSwKLQlTTkRfUENJX1FVSVJLKDB4MTUyZCwgMHgwNzYzLCAiRGl2ZXJzZSAoQ1BSMjAwMCkiLCBBTEMyNjhfQUNFUiksCi0JU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MDc3MSwgIlF1YW50YSBJTDEiLCBBTEMyNjdfUVVBTlRBX0lMMSksCi0Je30KLX07Ci0KLS8qIFRvc2hpYmEgbGFwdG9wcyBoYXZlIG5vIHVuaXF1ZSBQQ0kgU1NJRCBidXQgb25seSBjb2RlYyBTU0lEICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjY4X3NzaWRfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMGEsICJUT1NISUJBIFgtMjAwIiwgQUxDMjY4X0FVVE8pLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMGUsICJUT1NISUJBIFgtMjAwIEhETUkiLCBBTEMyNjhfQVVUTyksCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTE3OSwgMHhmZjAwLCAweGZmMDAsICJUT1NISUJBIEEvTHgwNSIsCi0JCQkgICBBTEMyNjhfVE9TSElCQSksCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjMjY4X3ByZXNldHNbXSA9IHsKLQlbQUxDMjY3X1FVQU5UQV9JTDFdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjdfcXVhbnRhX2lsMV9taXhlciwgYWxjMjY4X2JlZXBfbWl4ZXIsCi0JCQkgICAgYWxjMjY4X2NhcHR1cmVfbm9zcmNfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAotCQkJCWFsYzI2N19xdWFudGFfaWwxX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY4X2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHNfYWx0KSwKLQkJLmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzX2FsdCwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjdfcXVhbnRhX2lsMV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjhfM1NUXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY4X2Jhc2VfbWl4ZXIsIGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKLQkJCSAgICBhbGMyNjhfYmVlcF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OF9kYWNfbmlkcywKLSAgICAgICAgICAgICAgICAubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHNfYWx0KSwKLSAgICAgICAgICAgICAgICAuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGlnX291dF9uaWQgPSBBTEMyNjhfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjhfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjY4X2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzI2OF9UT1NISUJBXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY4X3Rvc2hpYmFfbWl4ZXIsIGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKLQkJCSAgICBhbGMyNjhfYmVlcF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCi0JCQkJYWxjMjY4X3Rvc2hpYmFfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjhfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2OF90b3NoaWJhX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2OF9BQ0VSXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY4X2FjZXJfbWl4ZXIsIGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKLQkJCSAgICBhbGMyNjhfYmVlcF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCi0JCQkJYWxjMjY4X2FjZXJfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAyLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjhfYWNlcl9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY4X2FjZXJfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjY4X0FDRVJfRE1JQ10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OF9hY2VyX2RtaWNfbWl4ZXIsIGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKLQkJCSAgICBhbGMyNjhfYmVlcF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCi0JCQkJYWxjMjY4X2FjZXJfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAyLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjhfYWNlcl9kbWljX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjhfYWNlcl9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjhfQUNFUl9BU1BJUkVfT05FXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY4X2FjZXJfYXNwaXJlX29uZV9taXhlciwKLQkJCSAgICBhbGMyNjhfYmVlcF9taXhlciwKLQkJCSAgICBhbGMyNjhfY2FwdHVyZV9ub3NyY19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCi0JCQkJYWxjMjY4X2FjZXJfYXNwaXJlX29uZV92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OF9kYWNfbmlkcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2FkY19uaWRzX2FsdCksCi0JCS5hZGNfbmlkcyA9IGFsYzI2OF9hZGNfbmlkc19hbHQsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI2OF9jYXBzcmNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjhfYWNlcl9sY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjhfREVMTF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OF9kZWxsX21peGVyLCBhbGMyNjhfYmVlcF9taXhlciwKLQkJCSAgICBhbGMyNjhfY2FwdHVyZV9ub3NyY19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCi0JCQkJYWxjMjY4X2RlbGxfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAyLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY4X2RlbGxfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjY4X1pFUFRPXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY4X2Jhc2VfbWl4ZXIsIGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKLQkJCSAgICBhbGMyNjhfYmVlcF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCi0JCQkJYWxjMjY4X3Rvc2hpYmFfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGlnX291dF9uaWQgPSBBTEMyNjhfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjhfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjY4X2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjhfdG9zaGliYV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLQlbQUxDMjY4X1RFU1RdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjhfdGVzdF9taXhlciwgYWxjMjY4X2NhcHR1cmVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAotCQkJCWFsYzI2OF92b2x1bWVfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OF9kYWNfbmlkcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2FkY19uaWRzX2FsdCksCi0JCS5hZGNfbmlkcyA9IGFsYzI2OF9hZGNfbmlkc19hbHQsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI2OF9jYXBzcmNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzI2OF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjhfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLSNlbmRpZgotfTsKLQotc3RhdGljIGludCBwYXRjaF9hbGMyNjgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjOwotCWludCBib2FyZF9jb25maWc7Ci0JaW50IGksIGhhc19iZWVwLCBlcnI7Ci0KLQlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoc3BlYyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNvZGVjLT5zcGVjID0gc3BlYzsKLQotCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBTEMyNjhfTU9ERUxfTEFTVCwKLQkJCQkJCSAgYWxjMjY4X21vZGVscywKLQkJCQkJCSAgYWxjMjY4X2NmZ190YmwpOwotCi0JaWYgKGJvYXJkX2NvbmZpZyA8IDAgfHwgYm9hcmRfY29uZmlnID49IEFMQzI2OF9NT0RFTF9MQVNUKQotCQlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvZGVjX3NpZF9jb25maWcoY29kZWMsCi0JCQlBTEMyNjhfTU9ERUxfTEFTVCwgYWxjMjY4X21vZGVscywgYWxjMjY4X3NzaWRfY2ZnX3RibCk7Ci0KLQlpZiAoYm9hcmRfY29uZmlnIDwgMCB8fCBib2FyZF9jb25maWcgPj0gQUxDMjY4X01PREVMX0xBU1QpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiAlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLAotCQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSk7Ci0JCWJvYXJkX2NvbmZpZyA9IEFMQzI2OF9BVVRPOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgPT0gQUxDMjY4X0FVVE8pIHsKLQkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCi0JCWVyciA9IGFsYzI2OF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgaWYgKCFlcnIpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBiYXNlIG1vZGUuLi5cbiIpOwotCQkJYm9hcmRfY29uZmlnID0gQUxDMjY4XzNTVDsKLQkJfQotCX0KLQotCWlmIChib2FyZF9jb25maWcgIT0gQUxDMjY4X0FVVE8pCi0JCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzI2OF9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOwotCi0Jc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZhbGMyNjhfcGNtX2FuYWxvZ19wbGF5YmFjazsKLQlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmYWxjMjY4X3BjbV9hbmFsb2dfY2FwdHVyZTsKLQlzcGVjLT5zdHJlYW1fYW5hbG9nX2FsdF9jYXB0dXJlID0gJmFsYzI2OF9wY21fYW5hbG9nX2FsdF9jYXB0dXJlOwotCi0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmYWxjMjY4X3BjbV9kaWdpdGFsX3BsYXliYWNrOwotCi0JaGFzX2JlZXAgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fbWl4ZXJzOyBpKyspIHsKLQkJaWYgKHNwZWMtPm1peGVyc1tpXSA9PSBhbGMyNjhfYmVlcF9taXhlcikgewotCQkJaGFzX2JlZXAgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaGFzX2JlZXApIHsKLQkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JCWlmICghcXVlcnlfYW1wX2NhcHMoY29kZWMsIDB4MWQsIEhEQV9JTlBVVCkpCi0JCQkvKiBvdmVycmlkZSB0aGUgYW1wIGNhcHMgZm9yIGJlZXAgZ2VuZXJhdG9yICovCi0JCQlzbmRfaGRhX292ZXJyaWRlX2FtcF9jYXBzKGNvZGVjLCAweDFkLCBIREFfSU5QVVQsCi0JCQkJCSAgKDB4MGMgPDwgQUNfQU1QQ0FQX09GRlNFVF9TSElGVCkgfAotCQkJCQkgICgweDBjIDw8IEFDX0FNUENBUF9OVU1fU1RFUFNfU0hJRlQpIHwKLQkJCQkJICAoMHgwNyA8PCBBQ19BTVBDQVBfU1RFUF9TSVpFX1NISUZUKSB8Ci0JCQkJCSAgKDAgPDwgQUNfQU1QQ0FQX01VVEVfU0hJRlQpKTsKLQl9Ci0KLQlpZiAoIXNwZWMtPm5vX2FuYWxvZyAmJiAhc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7Ci0JCS8qIGNoZWNrIHdoZXRoZXIgTklEIDB4MDcgaXMgdmFsaWQgKi8KLQkJdW5zaWduZWQgaW50IHdjYXAgPSBnZXRfd2NhcHMoY29kZWMsIDB4MDcpOwotCi0JCXNwZWMtPmNhcHNyY19uaWRzID0gYWxjMjY4X2NhcHNyY19uaWRzOwotCQkvKiBnZXQgdHlwZSAqLwotCQl3Y2FwID0gZ2V0X3djYXBzX3R5cGUod2NhcCk7Ci0JCWlmIChzcGVjLT5hdXRvX21pYyB8fAotCQkgICAgd2NhcCAhPSBBQ19XSURfQVVEX0lOIHx8IHNwZWMtPmlucHV0X211eC0+bnVtX2l0ZW1zID09IDEpIHsKLQkJCXNwZWMtPmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzX2FsdDsKLQkJCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2FkY19uaWRzX2FsdCk7Ci0JCQlpZiAoc3BlYy0+YXV0b19taWMpCi0JCQkJZml4dXBfYXV0b21pY19hZGMoY29kZWMpOwotCQkJaWYgKHNwZWMtPmF1dG9fbWljIHx8IHNwZWMtPmlucHV0X211eC0+bnVtX2l0ZW1zID09IDEpCi0JCQkJYWRkX21peGVyKHNwZWMsIGFsYzI2OF9jYXB0dXJlX25vc3JjX21peGVyKTsKLQkJCWVsc2UKLQkJCQlhZGRfbWl4ZXIoc3BlYywgYWxjMjY4X2NhcHR1cmVfYWx0X21peGVyKTsKLQkJfSBlbHNlIHsKLQkJCXNwZWMtPmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzOwotCQkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHMpOwotCQkJYWRkX21peGVyKHNwZWMsIGFsYzI2OF9jYXB0dXJlX21peGVyKTsKLQkJfQotCX0KLQotCXNwZWMtPnZtYXN0ZXJfbmlkID0gMHgwMjsKLQotCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOwotCWlmIChib2FyZF9jb25maWcgPT0gQUxDMjY4X0FVVE8pCi0JCXNwZWMtPmluaXRfaG9vayA9IGFsYzI2OF9hdXRvX2luaXQ7Ci0Jc3BlYy0+c2h1dHVwID0gYWxjX2VhcGRfc2h1dHVwOwotCi0JYWxjX2luaXRfamFja3MoY29kZWMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAgQUxDMjY5IGNoYW5uZWwgc291cmNlIHNldHRpbmcgKDIgY2hhbm5lbCkKLSAqLwotI2RlZmluZSBBTEMyNjlfRElHT1VUX05JRAlBTEM4ODBfRElHT1VUX05JRAotCi0jZGVmaW5lIGFsYzI2OV9kYWNfbmlkcwkJYWxjMjYwX2RhY19uaWRzCi0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY5X2FkY19uaWRzWzFdID0gewotCS8qIEFEQzEgKi8KLQkweDA4LAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjlfY2Fwc3JjX25pZHNbMV0gPSB7Ci0JMHgyMywKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY5dmJfYWRjX25pZHNbMV0gPSB7Ci0JLyogQURDMSAqLwotCTB4MDksCi19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OXZiX2NhcHNyY19uaWRzWzFdID0gewotCTB4MjIsCi19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OV9hZGNfY2FuZGlkYXRlc1tdID0gewotCTB4MDgsIDB4MDksIDB4MDcsIDB4MTEsCi19OwotCi0jZGVmaW5lIGFsYzI2OV9tb2RlcwkJYWxjMjYwX21vZGVzCi0jZGVmaW5lIGFsYzI2OV9jYXB0dXJlX3NvdXJjZQlhbGM4ODBfbGdfbHdfY2FwdHVyZV9zb3VyY2UKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OV9iYXNlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCAweDAsIEhEQV9PVVRQVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfcXVhbnRhX2ZsMV9taXhlcltdID0gewotCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX0FNUF9GTEFHLAotCQkuaW5mbyA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9pbmZvLAotCQkuZ2V0ID0gc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2dldCwKLQkJLnB1dCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQsCi0JCS5wcml2YXRlX3ZhbHVlID0gSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKLQl9LAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OV9saWZlYm9va19taXhlcltdID0gewotCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX0FNUF9GTEFHLAotCQkuaW5mbyA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9pbmZvLAotCQkuZ2V0ID0gc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2dldCwKLQkJLnB1dCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQsCi0JCS5wcml2YXRlX3ZhbHVlID0gSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKLQl9LAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkRvY2sgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDMsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkRvY2sgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDMsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRG9jayBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxYiwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfbGFwdG9wX21peGVyW10gPSB7Ci0JSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjl2Yl9sYXB0b3BfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OV9hc3VzX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAweDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OV9sYXB0b3BfYW5hbG9nX2NhcHR1cmVfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OV9sYXB0b3BfZGlnaXRhbF9jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjl2Yl9sYXB0b3BfYW5hbG9nX2NhcHR1cmVfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OXZiX2xhcHRvcF9kaWdpdGFsX2NhcHR1cmVfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogRlNDIGFtaWxvICovCi0jZGVmaW5lIGFsYzI2OV9mdWppdHN1X21peGVyCWFsYzI2OV9sYXB0b3BfbWl4ZXIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjlfcXVhbnRhX2ZsMV92ZXJic1tdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAotCXsweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OV9saWZlYm9va192ZXJic1tdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKLQl7MHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsgfQotfTsKLQotLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfc3BlYWtlcl9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlhbGNfaHBfYXV0b211dGUoY29kZWMpOwotCi0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMCwgMCwKLQkJCUFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MGMpOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjAsIDAsCi0JCQlBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIDB4NjgwKTsKLQotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjAsIDAsCi0JCQlBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDBjKTsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAotCQkJQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDQ4MCk7Ci19Ci0KLSNkZWZpbmUgYWxjMjY5X2xpZmVib29rX3NwZWFrZXJfYXV0b211dGUgXAotCWFsYzI2OV9xdWFudGFfZmwxX3NwZWFrZXJfYXV0b211dGUKLQotc3RhdGljIHZvaWQgYWxjMjY5X2xpZmVib29rX21pY19hdXRvc3dpdGNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXVuc2lnbmVkIGludCBwcmVzZW50X2xhcHRvcDsKLQl1bnNpZ25lZCBpbnQgcHJlc2VudF9kb2NrOwotCi0JcHJlc2VudF9sYXB0b3AJPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDE4KTsKLQlwcmVzZW50X2RvY2sJPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDFiKTsKLQotCS8qIExhcHRvcCBtaWMgcG9ydCBvdmVycmlkZXMgZG9jayBtaWMgcG9ydCwgZGVzaWduIGRlY2lzaW9uICovCi0JaWYgKHByZXNlbnRfZG9jaykKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMywgMCwKLQkJCQlBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgzKTsKLQlpZiAocHJlc2VudF9sYXB0b3ApCi0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjMsIDAsCi0JCQkJQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MCk7Ci0JaWYgKCFwcmVzZW50X2RvY2sgJiYgIXByZXNlbnRfbGFwdG9wKQotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIzLCAwLAotCQkJCUFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDEpOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjlfcXVhbnRhX2ZsMV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkgICAgdW5zaWduZWQgaW50IHJlcykKLXsKLQlzd2l0Y2ggKHJlcyA+PiAyNikgewotCWNhc2UgQUxDODgwX0hQX0VWRU5UOgotCQlhbGMyNjlfcXVhbnRhX2ZsMV9zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKLQkJYnJlYWs7Ci0JY2FzZSBBTEM4ODBfTUlDX0VWRU5UOgotCQlhbGNfbWljX2F1dG9tdXRlKGNvZGVjKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjlfbGlmZWJvb2tfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCXVuc2lnbmVkIGludCByZXMpCi17Ci0JaWYgKChyZXMgPj4gMjYpID09IEFMQzg4MF9IUF9FVkVOVCkKLQkJYWxjMjY5X2xpZmVib29rX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOwotCWlmICgocmVzID4+IDI2KSA9PSBBTEM4ODBfTUlDX0VWRU5UKQotCQlhbGMyNjlfbGlmZWJvb2tfbWljX2F1dG9zd2l0Y2goY29kZWMpOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjlfcXVhbnRhX2ZsMV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOwotCXNwZWMtPmV4dF9taWMucGluID0gMHgxODsKLQlzcGVjLT5leHRfbWljLm11eF9pZHggPSAwOwotCXNwZWMtPmludF9taWMucGluID0gMHgxOTsKLQlzcGVjLT5pbnRfbWljLm11eF9pZHggPSAxOwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWFsYzI2OV9xdWFudGFfZmwxX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOwotCWFsY19taWNfYXV0b211dGUoY29kZWMpOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjlfbGlmZWJvb2tfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMV0gPSAweDFhOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjlfbGlmZWJvb2tfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWFsYzI2OV9saWZlYm9va19zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKLQlhbGMyNjlfbGlmZWJvb2tfbWljX2F1dG9zd2l0Y2goY29kZWMpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OV9sYXB0b3BfZG1pY19pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDV9LAotCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMjYgfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAxOSB8ICgweDAwIDw8IDgpKX0sCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjlfbGFwdG9wX2FtaWNfaW5pdF92ZXJic1tdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDI2IH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMWIgfCAoMHgwMCA8PCA4KSl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OXZiX2xhcHRvcF9kbWljX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwNn0sCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAyNiB9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDE5IHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OXZiX2xhcHRvcF9hbWljX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAyNiB9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDE5IHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI3MV9hY2VyX2RtaWNfdmVyYnNbXSA9IHsKLQl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwZH0sCi0JezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHg0MDAwfSwKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgNn0sCi0JeyB9Ci19OwotCi1zdGF0aWMgdm9pZCBhbGMyNjlfbGFwdG9wX2FtaWNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljLnBpbiA9IDB4MTg7Ci0Jc3BlYy0+ZXh0X21pYy5tdXhfaWR4ID0gMDsKLQlzcGVjLT5pbnRfbWljLnBpbiA9IDB4MTk7Ci0Jc3BlYy0+aW50X21pYy5tdXhfaWR4ID0gMTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2OV9sYXB0b3BfZG1pY19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOwotCXNwZWMtPmV4dF9taWMucGluID0gMHgxODsKLQlzcGVjLT5leHRfbWljLm11eF9pZHggPSAwOwotCXNwZWMtPmludF9taWMucGluID0gMHgxMjsKLQlzcGVjLT5pbnRfbWljLm11eF9pZHggPSA1OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5dmJfbGFwdG9wX2FtaWNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgyMTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljLnBpbiA9IDB4MTg7Ci0Jc3BlYy0+ZXh0X21pYy5tdXhfaWR4ID0gMDsKLQlzcGVjLT5pbnRfbWljLnBpbiA9IDB4MTk7Ci0Jc3BlYy0+aW50X21pYy5tdXhfaWR4ID0gMTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2OXZiX2xhcHRvcF9kbWljX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pYy5waW4gPSAweDE4OwotCXNwZWMtPmV4dF9taWMubXV4X2lkeCA9IDA7Ci0Jc3BlYy0+aW50X21pYy5waW4gPSAweDEyOwotCXNwZWMtPmludF9taWMubXV4X2lkeCA9IDY7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotfQotCi0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQotCS8qCi0JICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MDIgLSAweDAzKQotCSAqLwotCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0KLQkvKiBzZXQgdXAgaW5wdXQgYW1wcyBmb3IgYW5hbG9nIGxvb3BiYWNrICovCi0JLyogQW1wIEluZGljZXM6IERBQyA9IDAsIG1peGVyID0gMSAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBGSVhNRTogdXNlIE11eC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLQkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWQsIDBiICovCi0JLyogSW5wdXQgbWl4ZXIxOiB1bm11dGUgTWljLCBGLU1pYywgTGluZSwgQ0QgaW5wdXRzICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCS8qIHNldCBFQVBEICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY5dmJfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KLQkgKi8KLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDAyIC0gMHgwMykKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogc2V0IHVwIGlucHV0IGFtcHMgZm9yIGFuYWxvZyBsb29wYmFjayAqLwotCS8qIEFtcCBJbmRpY2VzOiBEQUMgPSAwLCBtaXhlciA9IDEgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JLyogRklYTUU6IHVzZSBNdXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCi0JLyogTWl4ZXIgZWxlbWVudHM6IDB4MTgsIDE5LCAxYSwgMWIsIDFkLCAwYiAqLwotCS8qIElucHV0IG1peGVyMTogdW5tdXRlIE1pYywgRi1NaWMsIExpbmUsIENEIGlucHV0cyAqLwotCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0KLQkvKiBzZXQgRUFQRCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCi0JeyB9Ci19OwotCi0jZGVmaW5lIGFsYzI2OV9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyBcCi0JYWxjMjY4X2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzCi0jZGVmaW5lIGFsYzI2OV9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzIFwKLQlhbGMyNjhfYXV0b19jcmVhdGVfaW5wdXRfY3RscwotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotI2RlZmluZSBhbGMyNjlfbG9vcGJhY2tzCWFsYzg4MF9sb29wYmFja3MKLSNlbmRpZgotCi0vKiBwY20gY29uZmlndXJhdGlvbjogaWRlbnRpY2FsIHdpdGggQUxDODgwICovCi0jZGVmaW5lIGFsYzI2OV9wY21fYW5hbG9nX3BsYXliYWNrCWFsYzg4MF9wY21fYW5hbG9nX3BsYXliYWNrCi0jZGVmaW5lIGFsYzI2OV9wY21fYW5hbG9nX2NhcHR1cmUJYWxjODgwX3BjbV9hbmFsb2dfY2FwdHVyZQotI2RlZmluZSBhbGMyNjlfcGNtX2RpZ2l0YWxfcGxheWJhY2sJYWxjODgwX3BjbV9kaWdpdGFsX3BsYXliYWNrCi0jZGVmaW5lIGFsYzI2OV9wY21fZGlnaXRhbF9jYXB0dXJlCWFsYzg4MF9wY21fZGlnaXRhbF9jYXB0dXJlCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjMjY5XzQ0a19wY21fYW5hbG9nX3BsYXliYWNrID0gewotCS5zdWJzdHJlYW1zID0gMSwKLQkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80NDEwMCwgLyogZml4ZWQgcmF0ZSAqLwotCS8qIE5JRCBpcyBzZXQgaW4gYWxjX2J1aWxkX3BjbXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IGFsYzg4MF9wbGF5YmFja19wY21fb3BlbiwKLQkJLnByZXBhcmUgPSBhbGM4ODBfcGxheWJhY2tfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gYWxjODgwX3BsYXliYWNrX3BjbV9jbGVhbnVwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjMjY5XzQ0a19wY21fYW5hbG9nX2NhcHR1cmUgPSB7Ci0JLnN1YnN0cmVhbXMgPSAxLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwLCAvKiBmaXhlZCByYXRlICovCi0JLyogTklEIGlzIHNldCBpbiBhbGNfYnVpbGRfcGNtcyAqLwotfTsKLQotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLXN0YXRpYyBpbnQgYWxjMjY5X21pYzJfZm9yX211dGVfbGVkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN3aXRjaCAoY29kZWMtPnN1YnN5c3RlbV9pZCkgewotCWNhc2UgMHgxMDNjMTU4NjoKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFsYzI2OV9taWMyX211dGVfY2hlY2tfcHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCi17Ci0JLyogdXBkYXRlIG11dGUtTEVEIGFjY29yZGluZyB0byB0aGUgc3BlYWtlciBtdXRlIHN0YXRlICovCi0JaWYgKG5pZCA9PSAweDAxIHx8IG5pZCA9PSAweDE0KSB7Ci0JCWludCBwaW52YWw7Ci0JCWlmIChzbmRfaGRhX2NvZGVjX2FtcF9yZWFkKGNvZGVjLCAweDE0LCAwLCBIREFfT1VUUFVULCAwKSAmCi0JCSAgICBIREFfQU1QX01VVEUpCi0JCQlwaW52YWwgPSAweDI0OwotCQllbHNlCi0JCQlwaW52YWwgPSAweDIwOwotCQkvKiBtaWMyIHZyZWYgcGluIGlzIHVzZWQgZm9yIG11dGUgTEVEIGNvbnRyb2wgKi8KLQkJc25kX2hkYV9jb2RlY191cGRhdGVfY2FjaGUoY29kZWMsIDB4MTksIDAsCi0JCQkJCSAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKLQkJCQkJICAgcGludmFsKTsKLQl9Ci0JcmV0dXJuIGFsY19jaGVja19wb3dlcl9zdGF0dXMoY29kZWMsIG5pZCk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRSAqLwotCi1zdGF0aWMgaW50IGFsYzI3NV9zZXR1cF9kdWFsX2FkYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCWlmIChjb2RlYy0+dmVuZG9yX2lkICE9IDB4MTBlYzAyNzUgfHwgIXNwZWMtPmF1dG9fbWljKQotCQlyZXR1cm4gMDsKLQlpZiAoKHNwZWMtPmV4dF9taWMucGluID49IDB4MTggJiYgc3BlYy0+aW50X21pYy5waW4gPD0gMHgxMykgfHwKLQkgICAgKHNwZWMtPmV4dF9taWMucGluIDw9IDB4MTIgJiYgc3BlYy0+aW50X21pYy5waW4gPj0gMHgxOCkpIHsKLQkJaWYgKHNwZWMtPmV4dF9taWMucGluIDw9IDB4MTIpIHsKLQkJCXNwZWMtPnByaXZhdGVfYWRjX25pZHNbMF0gPSAweDA4OwotCQkJc3BlYy0+cHJpdmF0ZV9hZGNfbmlkc1sxXSA9IDB4MTE7Ci0JCQlzcGVjLT5wcml2YXRlX2NhcHNyY19uaWRzWzBdID0gMHgyMzsKLQkJCXNwZWMtPnByaXZhdGVfY2Fwc3JjX25pZHNbMV0gPSAweDIyOwotCQl9IGVsc2UgewotCQkJc3BlYy0+cHJpdmF0ZV9hZGNfbmlkc1swXSA9IDB4MTE7Ci0JCQlzcGVjLT5wcml2YXRlX2FkY19uaWRzWzFdID0gMHgwODsKLQkJCXNwZWMtPnByaXZhdGVfY2Fwc3JjX25pZHNbMF0gPSAweDIyOwotCQkJc3BlYy0+cHJpdmF0ZV9jYXBzcmNfbmlkc1sxXSA9IDB4MjM7Ci0JCX0KLQkJc3BlYy0+YWRjX25pZHMgPSBzcGVjLT5wcml2YXRlX2FkY19uaWRzOwotCQlzcGVjLT5jYXBzcmNfbmlkcyA9IHNwZWMtPnByaXZhdGVfY2Fwc3JjX25pZHM7Ci0JCXNwZWMtPm51bV9hZGNfbmlkcyA9IDI7Ci0JCXNwZWMtPmR1YWxfYWRjX3N3aXRjaCA9IDE7Ci0JCXNuZF9wcmludGRkKCJyZWFsdGVrOiBlbmFibGluZyBkdWFsIEFEQyBzd2l0Y2hnICglMDJ4OiUwMngpXG4iLAotCQkJICAgIHNwZWMtPmFkY19uaWRzWzBdLCBzcGVjLT5hZGNfbmlkc1sxXSk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogZGlmZmVyZW50IGFsYzI2OS12YXJpYW50cyAqLwotZW51bSB7Ci0JQUxDMjY5X1RZUEVfTk9STUFMLAotCUFMQzI2OV9UWVBFX0FMQzI1OCwKLQlBTEMyNjlfVFlQRV9BTEMyNTksCi0JQUxDMjY5X1RZUEVfQUxDMjY5VkIsCi0JQUxDMjY5X1RZUEVfQUxDMjcwLAotCUFMQzI2OV9UWVBFX0FMQzI3MVgsCi19OwotCi0vKgotICogQklPUyBhdXRvIGNvbmZpZ3VyYXRpb24KLSAqLwotc3RhdGljIGludCBhbGMyNjlfcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGVycjsKLQlzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OV9pZ25vcmVbXSA9IHsgMHgxZCwgMCB9OwotCi0JZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsCi0JCQkJCSAgIGFsYzI2OV9pZ25vcmUpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gYWxjMjY5X2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlpZiAoc3BlYy0+Y29kZWNfdmFyaWFudCA9PSBBTEMyNjlfVFlQRV9OT1JNQUwpCi0JCWVyciA9IGFsYzI2OV9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JZWxzZQotCQllcnIgPSBhbGNfYXV0b19jcmVhdGVfaW5wdXRfY3Rscyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsIDAsCi0JCQkJCQkgMHgyMiwgMCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7Ci0KLQlhbGNfYXV0b19wYXJzZV9kaWdpdGFsKGNvZGVjKTsKLQotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlhZGRfbWl4ZXIoc3BlYywgc3BlYy0+a2N0bHMubGlzdCk7Ci0KLQlpZiAoc3BlYy0+Y29kZWNfdmFyaWFudCAhPSBBTEMyNjlfVFlQRV9OT1JNQUwpIHsKLQkJYWRkX3ZlcmIoc3BlYywgYWxjMjY5dmJfaW5pdF92ZXJicyk7Ci0JCWFsY19zc2lkX2NoZWNrKGNvZGVjLCAwLCAweDFiLCAweDE0LCAweDIxKTsKLQl9IGVsc2UgewotCQlhZGRfdmVyYihzcGVjLCBhbGMyNjlfaW5pdF92ZXJicyk7Ci0JCWFsY19zc2lkX2NoZWNrKGNvZGVjLCAweDE1LCAweDFiLCAweDE0LCAwKTsKLQl9Ci0KLQlzcGVjLT5udW1fbXV4X2RlZnMgPSAxOwotCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07Ci0KLQlpZiAoIWFsYzI3NV9zZXR1cF9kdWFsX2FkYyhjb2RlYykpCi0JCWZpbGx1cF9wcml2X2FkY19uaWRzKGNvZGVjLCBhbGMyNjlfYWRjX2NhbmRpZGF0ZXMsCi0JCQkJICAgICBzaXplb2YoYWxjMjY5X2FkY19jYW5kaWRhdGVzKSk7Ci0KLQllcnIgPSBhbGNfYXV0b19hZGRfbWljX2Jvb3N0KGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWlmICghc3BlYy0+Y2FwX21peGVyICYmICFzcGVjLT5ub19hbmFsb2cpCi0JCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKLQotCXJldHVybiAxOwotfQotCi0jZGVmaW5lIGFsYzI2OV9hdXRvX2luaXRfbXVsdGlfb3V0CWFsYzI2OF9hdXRvX2luaXRfbXVsdGlfb3V0Ci0jZGVmaW5lIGFsYzI2OV9hdXRvX2luaXRfaHBfb3V0CQlhbGMyNjhfYXV0b19pbml0X2hwX291dAotI2RlZmluZSBhbGMyNjlfYXV0b19pbml0X2FuYWxvZ19pbnB1dAlhbGM4ODJfYXV0b19pbml0X2FuYWxvZ19pbnB1dAotI2RlZmluZSBhbGMyNjlfYXV0b19pbml0X2lucHV0X3NyYwlhbGM4ODJfYXV0b19pbml0X2lucHV0X3NyYwotCi0KLS8qIGluaXQgY2FsbGJhY2sgZm9yIGF1dG8tY29uZmlndXJhdGlvbiBtb2RlbCAtLSBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IGluaXQgKi8KLXN0YXRpYyB2b2lkIGFsYzI2OV9hdXRvX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JYWxjMjY5X2F1dG9faW5pdF9tdWx0aV9vdXQoY29kZWMpOwotCWFsYzI2OV9hdXRvX2luaXRfaHBfb3V0KGNvZGVjKTsKLQlhbGMyNjlfYXV0b19pbml0X2FuYWxvZ19pbnB1dChjb2RlYyk7Ci0JaWYgKCFzcGVjLT5kdWFsX2FkY19zd2l0Y2gpCi0JCWFsYzI2OV9hdXRvX2luaXRfaW5wdXRfc3JjKGNvZGVjKTsKLQlhbGNfYXV0b19pbml0X2RpZ2l0YWwoY29kZWMpOwotCWlmIChzcGVjLT51bnNvbF9ldmVudCkKLQkJYWxjX2luaXRob29rKGNvZGVjKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X3RvZ2dsZV9wb3dlcl9vdXRwdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBwb3dlcl91cCkKLXsKLQlpbnQgdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4MDQpOwotCWlmIChwb3dlcl91cCkKLQkJdmFsIHw9IDEgPDwgMTE7Ci0JZWxzZQotCQl2YWwgJj0gfigxIDw8IDExKTsKLQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDQsIHZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2OV9zaHV0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDAwZmYpID09IDB4MDE3KQotCQlhbGMyNjlfdG9nZ2xlX3Bvd2VyX291dHB1dChjb2RlYywgMCk7Ci0JaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDAwZmYpID09IDB4MDE4KSB7Ci0JCWFsYzI2OV90b2dnbGVfcG93ZXJfb3V0cHV0KGNvZGVjLCAwKTsKLQkJbXNsZWVwKDE1MCk7Ci0JfQotfQotCi0jaWZkZWYgU05EX0hEQV9ORUVEU19SRVNVTUUKLXN0YXRpYyBpbnQgYWxjMjY5X3Jlc3VtZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlpZiAoKGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKSAmIDB4MDBmZikgPT0gMHgwMTgpIHsKLQkJYWxjMjY5X3RvZ2dsZV9wb3dlcl9vdXRwdXQoY29kZWMsIDApOwotCQltc2xlZXAoMTUwKTsKLQl9Ci0KLQljb2RlYy0+cGF0Y2hfb3BzLmluaXQoY29kZWMpOwotCi0JaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDAwZmYpID09IDB4MDE3KSB7Ci0JCWFsYzI2OV90b2dnbGVfcG93ZXJfb3V0cHV0KGNvZGVjLCAxKTsKLQkJbXNsZWVwKDIwMCk7Ci0JfQotCi0JaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDAwZmYpID09IDB4MDE4KQotCQlhbGMyNjlfdG9nZ2xlX3Bvd2VyX291dHB1dChjb2RlYywgMSk7Ci0KLQlzbmRfaGRhX2NvZGVjX3Jlc3VtZV9hbXAoY29kZWMpOwotCXNuZF9oZGFfY29kZWNfcmVzdW1lX2NhY2hlKGNvZGVjKTsKLQloZGFfY2FsbF9jaGVja19wb3dlcl9zdGF0dXMoY29kZWMsIDB4MDEpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIFNORF9IREFfTkVFRFNfUkVTVU1FICovCi0KLXN0YXRpYyB2b2lkIGFsYzI2OV9maXh1cF9od2VxKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKLXsKLQlpbnQgY29lZjsKLQotCWlmIChhY3Rpb24gIT0gQUxDX0ZJWFVQX0FDVF9JTklUKQotCQlyZXR1cm47Ci0JY29lZiA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDFlKTsKLQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWUsIGNvZWYgfCAweDgwKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjcxX2ZpeHVwX2RtaWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCi17Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2ZXJic1tdID0gewotCQl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwZH0sCi0JCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIDB4NDAwMH0sCi0JCXt9Ci0JfTsKLQl1bnNpZ25lZCBpbnQgY2ZnOwotCi0JaWYgKHN0cmNtcChjb2RlYy0+Y2hpcF9uYW1lLCAiQUxDMjcxWCIpKQotCQlyZXR1cm47Ci0JY2ZnID0gc25kX2hkYV9jb2RlY19nZXRfcGluY2ZnKGNvZGVjLCAweDEyKTsKLQlpZiAoZ2V0X2RlZmNmZ19jb25uZWN0KGNmZykgPT0gQUNfSkFDS19QT1JUX0ZJWEVEKQotCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCB2ZXJicyk7Ci19Ci0KLWVudW0gewotCUFMQzI2OV9GSVhVUF9TT05ZX1ZBSU8sCi0JQUxDMjc1X0ZJWFVQX1NPTllfVkFJT19HUElPMiwKLQlBTEMyNjlfRklYVVBfREVMTF9NMTAxWiwKLQlBTEMyNjlfRklYVVBfU0tVX0lHTk9SRSwKLQlBTEMyNjlfRklYVVBfQVNVU19HNzNKVywKLQlBTEMyNjlfRklYVVBfTEVOT1ZPX0VBUEQsCi0JQUxDMjc1X0ZJWFVQX1NPTllfSFdFUSwKLQlBTEMyNzFfRklYVVBfRE1JQywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzI2OV9maXh1cHNbXSA9IHsKLQlbQUxDMjY5X0ZJWFVQX1NPTllfVkFJT10gPSB7Ci0JCS50eXBlID0gQUxDX0ZJWFVQX1ZFUkJTLAotCQkudi52ZXJicyA9IChjb25zdCBzdHJ1Y3QgaGRhX3ZlcmJbXSkgewotCQkJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUZHUkR9LAotCQkJe30KLQkJfQotCX0sCi0JW0FMQzI3NV9GSVhVUF9TT05ZX1ZBSU9fR1BJTzJdID0gewotCQkudHlwZSA9IEFMQ19GSVhVUF9WRVJCUywKLQkJLnYudmVyYnMgPSAoY29uc3Qgc3RydWN0IGhkYV92ZXJiW10pIHsKLQkJCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MDR9LAotCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDA0fSwKLQkJCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDB9LAotCQkJeyB9Ci0JCX0sCi0JCS5jaGFpbmVkID0gdHJ1ZSwKLQkJLmNoYWluX2lkID0gQUxDMjY5X0ZJWFVQX1NPTllfVkFJTwotCX0sCi0JW0FMQzI2OV9GSVhVUF9ERUxMX00xMDFaXSA9IHsKLQkJLnR5cGUgPSBBTENfRklYVVBfVkVSQlMsCi0JCS52LnZlcmJzID0gKGNvbnN0IHN0cnVjdCBoZGFfdmVyYltdKSB7Ci0JCQkvKiBFbmFibGVzIGludGVybmFsIHNwZWFrZXIgKi8KLQkJCXsweDIwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAxM30sCi0JCQl7MHgyMCwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDQwNDB9LAotCQkJe30KLQkJfQotCX0sCi0JW0FMQzI2OV9GSVhVUF9TS1VfSUdOT1JFXSA9IHsKLQkJLnR5cGUgPSBBTENfRklYVVBfU0tVLAotCQkudi5za3UgPSBBTENfRklYVVBfU0tVX0lHTk9SRSwKLQl9LAotCVtBTEMyNjlfRklYVVBfQVNVU19HNzNKV10gPSB7Ci0JCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCi0JCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgewotCQkJeyAweDE3LCAweDk5MTMwMTExIH0sIC8qIHN1Yndvb2ZlciAqLwotCQkJeyB9Ci0JCX0KLQl9LAotCVtBTEMyNjlfRklYVVBfTEVOT1ZPX0VBUERdID0gewotCQkudHlwZSA9IEFMQ19GSVhVUF9WRVJCUywKLQkJLnYudmVyYnMgPSAoY29uc3Qgc3RydWN0IGhkYV92ZXJiW10pIHsKLQkJCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMH0sCi0JCQl7fQotCQl9Ci0JfSwKLQlbQUxDMjc1X0ZJWFVQX1NPTllfSFdFUV0gPSB7Ci0JCS50eXBlID0gQUxDX0ZJWFVQX0ZVTkMsCi0JCS52LmZ1bmMgPSBhbGMyNjlfZml4dXBfaHdlcSwKLQkJLmNoYWluZWQgPSB0cnVlLAotCQkuY2hhaW5faWQgPSBBTEMyNzVfRklYVVBfU09OWV9WQUlPX0dQSU8yCi0JfSwKLQlbQUxDMjcxX0ZJWFVQX0RNSUNdID0gewotCQkudHlwZSA9IEFMQ19GSVhVUF9GVU5DLAotCQkudi5mdW5jID0gYWxjMjcxX2ZpeHVwX2RtaWMsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjlfZml4dXBfdGJsW10gPSB7Ci0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTA3MywgIlNvbnkgVkFJTyIsIEFMQzI3NV9GSVhVUF9TT05ZX1ZBSU9fR1BJTzIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwN2IsICJTb255IFZBSU8iLCBBTEMyNzVfRklYVVBfU09OWV9IV0VRKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDg0LCAiU29ueSBWQUlPIiwgQUxDMjc1X0ZJWFVQX1NPTllfSFdFUSksCi0JU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxMDRkLCAiU29ueSBWQUlPIiwgQUxDMjY5X0ZJWFVQX1NPTllfVkFJTyksCi0JU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDQ3MCwgIkRlbGwgTTEwMXoiLCBBTEMyNjlfRklYVVBfREVMTF9NMTAxWiksCi0JU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxMDI1LCAiQWNlciBBc3BpcmUiLCBBTEMyNzFfRklYVVBfRE1JQyksCi0JU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjBmMiwgIlRoaW5rcGFkIFNMNDEwLzUxMCIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMTVlLCAiVGhpbmtwYWQgTDUxMiIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWI4LCAiVGhpbmtwYWQgRWRnZSAxNCIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWNhLCAiVGhpbmtwYWQgTDQxMiIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWU5LCAiVGhpbmtwYWQgRWRnZSAxNSIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxYTEzLCAiQXN1cyBHNzNKdyIsIEFMQzI2OV9GSVhVUF9BU1VTX0c3M0pXKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHg5ZTU0LCAiTEVOT1ZPIE5CIiwgQUxDMjY5X0ZJWFVQX0xFTk9WT19FQVBEKSwKLQl7fQotfTsKLQotCi0vKgotICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjMjY5X21vZGVsc1tBTEMyNjlfTU9ERUxfTEFTVF0gPSB7Ci0JW0FMQzI2OV9CQVNJQ10JCQk9ICJiYXNpYyIsCi0JW0FMQzI2OV9RVUFOVEFfRkwxXQkJPSAicXVhbnRhIiwKLQlbQUxDMjY5X0FNSUNdCQkJPSAibGFwdG9wLWFtaWMiLAotCVtBTEMyNjlfRE1JQ10JCQk9ICJsYXB0b3AtZG1pYyIsCi0JW0FMQzI2OV9GVUpJVFNVXQkJPSAiZnVqaXRzdSIsCi0JW0FMQzI2OV9MSUZFQk9PS10JCT0gImxpZmVib29rIiwKLQlbQUxDMjY5X0FVVE9dCQkJPSAiYXV0byIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjY5X2NmZ190YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYmY4LCAiUXVhbnRhIEZMMSIsIEFMQzI2OV9RVUFOVEFfRkwxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwNDdjLCAiQUNFUiBaR0EiLCBBTEMyNzFfQUNFUiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODMzMCwgIkFTVVMgRWVlcGMgUDcwMyBQOTAwQSIsCi0JCSAgICAgIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMDEzLCAiQVNVUyBONjFEYSIsIEFMQzI2OVZCX0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExMTMsICJBU1VTIE42M0puIiwgQUxDMjY5VkJfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTE0MywgIkFTVVMgQjUzZiIsIEFMQzI2OVZCX0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExMzMsICJBU1VTIFVKMjBmdCIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTgzLCAiQVNVUyBLNzJEUiIsIEFMQzI2OVZCX0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExYjMsICJBU1VTIEs1MkRSIiwgQUxDMjY5VkJfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFlMywgIkFTVVMgVTMzSmMiLCBBTEMyNjlWQl9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMjczLCAiQVNVUyBVTDgwSnQiLCBBTEMyNjlWQl9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMjgzLCAiQVNVUyBVNTNKYyIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMmIzLCAiQVNVUyBOODJKViIsIEFMQzI2OVZCX0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyZDMsICJBU1VTIE42MUp2IiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzYTMsICJBU1VTIFVMMzBWdCIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzczLCAiQVNVUyBHNzNKWCIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzgzLCAiQVNVUyBVSjMwSmMiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTNkMywgIkFTVVMgTjYxSkEiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQxMywgIkFTVVMgVUw1MCIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNDQzLCAiQVNVUyBVTDMwIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE0NTMsICJBU1VTIE02MEp2IiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE0ODMsICJBU1VTIFVMODAiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTRmMywgIkFTVVMgRjgzVmYiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTRlMywgIkFTVVMgVUwyMCIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNTEzLCAiQVNVUyBVWDMwIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1OTMsICJBU1VTIE41MVZuIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1YTMsICJBU1VTIE42MEp2IiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1YjMsICJBU1VTIE42MERwIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1YzMsICJBU1VTIE43MERlIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1ZTMsICJBU1VTIEY4M1QiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTY0MywgIkFTVVMgTTYwSiIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjUzLCAiQVNVUyBVNTAiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTY5MywgIkFTVVMgRjUwTiIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNmEzLCAiQVNVUyBGNVEiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTZlMywgIkFTVVMgVVg1MCIsIEFMQzI2OV9ETUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNzIzLCAiQVNVUyBQODAiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc0MywgIkFTVVMgVTgwIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NzMsICJBU1VTIFUyMEEiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg4MywgIkFTVVMgRjgxU2UiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODMxYSwgIkFTVVMgRWVlcGMgUDkwMSIsCi0JCSAgICAgIEFMQzI2OV9ETUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MzRhLCAiQVNVUyBFZWVwYyBTMTAxIiwKLQkJICAgICAgQUxDMjY5X0RNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgzOTgsICJBU1VTIFAxMDA1SEEiLCBBTEMyNjlfRE1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODNjZSwgIkFTVVMgUDEwMDVIQSIsIEFMQzI2OV9ETUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDcxLCAiU29ueSBWQUlPIiwgQUxDMjY5X0FVVE8pLAotCVNORF9QQ0lfUVVJUksoMHgxMGNmLCAweDE0NzUsICJMaWZlYm9vayBJQ0g5TS1iYXNlZCIsIEFMQzI2OV9MSUZFQk9PSyksCi0JU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MTc3OCwgIlF1YW50YSBPTjEiLCBBTEMyNjlfRE1JQyksCi0JU05EX1BDSV9RVUlSSygweDE3MzQsIDB4MTE1ZCwgIkZTQyBBbWlsbyIsIEFMQzI2OV9GVUpJVFNVKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYmU5LCAiUXVhbnRhIFdpc3Ryb24iLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2JmOCwgIlF1YW50YSBGTDEiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDE3ZmYsIDB4MDU5YSwgIlF1YW50YSBFTDMiLCBBTEMyNjlfRE1JQyksCi0JU05EX1BDSV9RVUlSSygweDE3ZmYsIDB4MDU5YiwgIlF1YW50YSBKUjEiLCBBTEMyNjlfRE1JQyksCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjMjY5X3ByZXNldHNbXSA9IHsKLQlbQUxDMjY5X0JBU0lDXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY5X2Jhc2VfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY5X2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OV9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjY5X2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzI2OV9RVUFOVEFfRkwxXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY5X3F1YW50YV9mbDFfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OV9pbml0X3ZlcmJzLCBhbGMyNjlfcXVhbnRhX2ZsMV92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2OV9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjMjY5X3F1YW50YV9mbDFfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2OV9xdWFudGFfZmwxX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjMjY5X3F1YW50YV9mbDFfaW5pdF9ob29rLAotCX0sCi0JW0FMQzI2OV9BTUlDXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY5X2xhcHRvcF9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjMjY5X2xhcHRvcF9hbmFsb2dfY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OV9pbml0X3ZlcmJzLAotCQkJCWFsYzI2OV9sYXB0b3BfYW1pY19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY5X2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OV9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2OV9sYXB0b3BfYW1pY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjlfRE1JQ10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9sYXB0b3BfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OV9sYXB0b3BfZGlnaXRhbF9jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY5X2luaXRfdmVyYnMsCi0JCQkJYWxjMjY5X2xhcHRvcF9kbWljX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY5X2xhcHRvcF9kbWljX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2OVZCX0FNSUNdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjl2Yl9sYXB0b3BfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OXZiX2xhcHRvcF9hbmFsb2dfY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OXZiX2luaXRfdmVyYnMsCi0JCQkJYWxjMjY5dmJfbGFwdG9wX2FtaWNfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjl2Yl9sYXB0b3BfYW1pY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjlWQl9ETUlDXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY5dmJfbGFwdG9wX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjl2Yl9sYXB0b3BfZGlnaXRhbF9jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY5dmJfaW5pdF92ZXJicywKLQkJCQlhbGMyNjl2Yl9sYXB0b3BfZG1pY19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY5X2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OV9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2OXZiX2xhcHRvcF9kbWljX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2OV9GVUpJVFNVXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY5X2Z1aml0c3VfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OV9sYXB0b3BfZGlnaXRhbF9jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY5X2luaXRfdmVyYnMsCi0JCQkJYWxjMjY5X2xhcHRvcF9kbWljX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY5X2xhcHRvcF9kbWljX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2OV9MSUZFQk9PS10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9saWZlYm9va19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY5X2luaXRfdmVyYnMsIGFsYzI2OV9saWZlYm9va192ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2OV9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjMjY5X2xpZmVib29rX3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjlfbGlmZWJvb2tfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGMyNjlfbGlmZWJvb2tfaW5pdF9ob29rLAotCX0sCi0JW0FMQzI3MV9BQ0VSXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY5X2FzdXNfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OXZiX2xhcHRvcF9kaWdpdGFsX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjlfaW5pdF92ZXJicywgYWxjMjcxX2FjZXJfZG1pY192ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKLQkJLmFkY19uaWRzID0gYWxjMjYyX2RtaWNfYWRjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kbWljX2FkY19uaWRzKSwKLQkJLmNhcHNyY19uaWRzID0gYWxjMjYyX2RtaWNfY2Fwc3JjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2OV9jYXB0dXJlX3NvdXJjZSwKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgwX0RJR09VVF9OSUQsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2OXZiX2xhcHRvcF9kbWljX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi19OwotCi1zdGF0aWMgaW50IGFsYzI2OV9maWxsX2NvZWYoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JaW50IHZhbDsKLQotCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA8IDB4MDE1KSB7Ci0JCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHhmLCAweDk2MGIpOwotCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4ZSwgMHg4ODE3KTsKLQl9Ci0KLQlpZiAoKGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKSAmIDB4MDBmZikgPT0gMHgwMTYpIHsKLQkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGYsIDB4OTYwYik7Ci0JCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHhlLCAweDg4MTQpOwotCX0KLQotCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxNykgewotCQl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgwNCk7Ci0JCS8qIFBvd2VyIHVwIG91dHB1dCBwaW4gKi8KLQkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA0LCB2YWwgfCAoMTw8MTEpKTsKLQl9Ci0KLQlpZiAoKGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKSAmIDB4MDBmZikgPT0gMHgwMTgpIHsKLQkJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4ZCk7Ci0JCWlmICgodmFsICYgMHgwYzAwKSA+PiAxMCAhPSAweDEpIHsKLQkJCS8qIENhcGxlc3MgcmFtcCB1cCBjbG9jayBjb250cm9sICovCi0JCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4ZCwgdmFsIHwgKDE8PDEwKSk7Ci0JCX0KLQkJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4MTcpOwotCQlpZiAoKHZhbCAmIDB4MDFjMCkgPj4gNiAhPSAweDQpIHsKLQkJCS8qIENsYXNzIEQgcG93ZXIgb24gcmVzZXQgKi8KLQkJCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgxNywgdmFsIHwgKDE8PDcpKTsKLQkJfQotCX0KLQotCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweGQpOyAvKiBDbGFzcyBEICovCi0JYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGQsIHZhbCB8ICgxPDwxNCkpOwotCi0JdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NCk7IC8qIEhQICovCi0JYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDQsIHZhbCB8ICgxPDwxMSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGF0Y2hfYWxjMjY5KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKLQlpbnQgYm9hcmRfY29uZmlnLCBjb2VmOwotCWludCBlcnI7Ci0KLQlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoc3BlYyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNvZGVjLT5zcGVjID0gc3BlYzsKLQotCWFsY19hdXRvX3BhcnNlX2N1c3RvbWl6ZV9kZWZpbmUoY29kZWMpOwotCi0JaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMGVjMDI2OSkgewotCQljb2VmID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApOwotCQlpZiAoKGNvZWYgJiAweDAwZjApID09IDB4MDAxMCkgewotCQkJaWYgKGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwMjUgJiYKLQkJCSAgICBzcGVjLT5jZGVmaW5lLnBsYXRmb3JtX3R5cGUgPT0gMSkgewotCQkJCWFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyNzFYIik7Ci0JCQkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI3MVg7Ci0JCQl9IGVsc2UgaWYgKChjb2VmICYgMHhmMDAwKSA9PSAweDEwMDApIHsKLQkJCQlzcGVjLT5jb2RlY192YXJpYW50ID0gQUxDMjY5X1RZUEVfQUxDMjcwOwotCQkJfSBlbHNlIGlmICgoY29lZiAmIDB4ZjAwMCkgPT0gMHgyMDAwKSB7Ci0JCQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI1OSIpOwotCQkJCXNwZWMtPmNvZGVjX3ZhcmlhbnQgPSBBTEMyNjlfVFlQRV9BTEMyNTk7Ci0JCQl9IGVsc2UgaWYgKChjb2VmICYgMHhmMDAwKSA9PSAweDMwMDApIHsKLQkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjU4Iik7Ci0JCQkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI1ODsKLQkJCX0gZWxzZSB7Ci0JCQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI2OVZCIik7Ci0JCQkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI2OVZCOwotCQkJfQotCQl9IGVsc2UKLQkJCWFsY19maXhfcGxsX2luaXQoY29kZWMsIDB4MjAsIDB4MDQsIDE1KTsKLQkJYWxjMjY5X2ZpbGxfY29lZihjb2RlYyk7Ci0JfQotCi0JYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFMQzI2OV9NT0RFTF9MQVNULAotCQkJCQkJICBhbGMyNjlfbW9kZWxzLAotCQkJCQkJICBhbGMyNjlfY2ZnX3RibCk7Ci0KLQlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJYm9hcmRfY29uZmlnID0gQUxDMjY5X0FVVE87Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEMyNjlfQVVUTykgewotCQlhbGNfcGlja19maXh1cChjb2RlYywgTlVMTCwgYWxjMjY5X2ZpeHVwX3RibCwgYWxjMjY5X2ZpeHVwcyk7Ci0JCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgPT0gQUxDMjY5X0FVVE8pIHsKLQkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCi0JCWVyciA9IGFsYzI2OV9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgaWYgKCFlcnIpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBiYXNlIG1vZGUuLi5cbiIpOwotCQkJYm9hcmRfY29uZmlnID0gQUxDMjY5X0JBU0lDOwotCQl9Ci0JfQotCi0JaWYgKGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKSB7Ci0JCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KLQotCWlmIChib2FyZF9jb25maWcgIT0gQUxDMjY5X0FVVE8pCi0JCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzI2OV9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOwotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEMyNjlfUVVBTlRBX0ZMMSkgewotCQkvKiBEdWUgdG8gYSBoYXJkd2FyZSBwcm9ibGVtIG9uIExlbm92byBJZGVhZHBhZCwgd2UgbmVlZCB0bwotCQkgKiBmaXggdGhlIHNhbXBsZSByYXRlIG9mIGFuYWxvZyBJL08gdG8gNDQuMWtIegotCQkgKi8KLQkJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZhbGMyNjlfNDRrX3BjbV9hbmFsb2dfcGxheWJhY2s7Ci0JCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZhbGMyNjlfNDRrX3BjbV9hbmFsb2dfY2FwdHVyZTsKLQl9IGVsc2UgaWYgKHNwZWMtPmR1YWxfYWRjX3N3aXRjaCkgewotCQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJmFsYzI2OV9wY21fYW5hbG9nX3BsYXliYWNrOwotCQkvKiBzd2l0Y2ggQURDIGR5bmFtaWNhbGx5ICovCi0JCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZkdWFsbWljX3BjbV9hbmFsb2dfY2FwdHVyZTsKLQl9IGVsc2UgewotCQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJmFsYzI2OV9wY21fYW5hbG9nX3BsYXliYWNrOwotCQlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmYWxjMjY5X3BjbV9hbmFsb2dfY2FwdHVyZTsKLQl9Ci0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmYWxjMjY5X3BjbV9kaWdpdGFsX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUgPSAmYWxjMjY5X3BjbV9kaWdpdGFsX2NhcHR1cmU7Ci0KLQlpZiAoIXNwZWMtPmFkY19uaWRzKSB7IC8qIHdhc24ndCBmaWxsZWQgYXV0b21hdGljYWxseT8gdXNlIGRlZmF1bHQgKi8KLQkJaWYgKHNwZWMtPmNvZGVjX3ZhcmlhbnQgPT0gQUxDMjY5X1RZUEVfTk9STUFMKSB7Ci0JCQlzcGVjLT5hZGNfbmlkcyA9IGFsYzI2OV9hZGNfbmlkczsKLQkJCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2FkY19uaWRzKTsKLQkJCXNwZWMtPmNhcHNyY19uaWRzID0gYWxjMjY5X2NhcHNyY19uaWRzOwotCQl9IGVsc2UgewotCQkJc3BlYy0+YWRjX25pZHMgPSBhbGMyNjl2Yl9hZGNfbmlkczsKLQkJCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY5dmJfYWRjX25pZHMpOwotCQkJc3BlYy0+Y2Fwc3JjX25pZHMgPSBhbGMyNjl2Yl9jYXBzcmNfbmlkczsKLQkJfQotCX0KLQotCWlmICghc3BlYy0+Y2FwX21peGVyKQotCQlzZXRfY2FwdHVyZV9taXhlcihjb2RlYyk7Ci0JaWYgKGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKQotCQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwYiwgMHgwNCwgSERBX0lOUFVUKTsKLQotCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUk9CRSk7Ci0KLQlzcGVjLT52bWFzdGVyX25pZCA9IDB4MDI7Ci0KLQljb2RlYy0+cGF0Y2hfb3BzID0gYWxjX3BhdGNoX29wczsKLSNpZmRlZiBTTkRfSERBX05FRURTX1JFU1VNRQotCWNvZGVjLT5wYXRjaF9vcHMucmVzdW1lID0gYWxjMjY5X3Jlc3VtZTsKLSNlbmRpZgotCWlmIChib2FyZF9jb25maWcgPT0gQUxDMjY5X0FVVE8pCi0JCXNwZWMtPmluaXRfaG9vayA9IGFsYzI2OV9hdXRvX2luaXQ7Ci0Jc3BlYy0+c2h1dHVwID0gYWxjMjY5X3NodXR1cDsKLQotCWFsY19pbml0X2phY2tzKGNvZGVjKTsKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi0JaWYgKCFzcGVjLT5sb29wYmFjay5hbXBsaXN0KQotCQlzcGVjLT5sb29wYmFjay5hbXBsaXN0ID0gYWxjMjY5X2xvb3BiYWNrczsKLQlpZiAoYWxjMjY5X21pYzJfZm9yX211dGVfbGVkKGNvZGVjKSkKLQkJY29kZWMtPnBhdGNoX29wcy5jaGVja19wb3dlcl9zdGF0dXMgPSBhbGMyNjlfbWljMl9tdXRlX2NoZWNrX3BzOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqICBBTEM4NjEgY2hhbm5lbCBzb3VyY2Ugc2V0dGluZyAoMi82IGNoYW5uZWwgc2VsZWN0aW9uIGZvciAzLXN0YWNrKQotICovCi0KLS8qCi0gKiBzZXQgdGhlIHBhdGggd2F5cyBmb3IgMiBjaGFubmVsIG91dHB1dAotICogbmVlZCB0byBzZXQgdGhlIGNvZGVjIGxpbmUgb3V0IGFuZCBtaWMgMSBwaW4gd2lkZ2V0cyB0byBpbnB1dHMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfdGhyZWVzdGFja19jaDJfaW5pdFtdID0gewotCS8qIHNldCBwaW4gd2lkZ2V0IDFBaCAobGluZSBpbikgZm9yIGlucHV0ICovCi0JeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiBzZXQgcGluIHdpZGdldCAxOGggKG1pYzEvMikgZm9yIGlucHV0LCBmb3IgbWljIGFsc28gZW5hYmxlCi0JICogdGhlIHZyZWYKLQkgKi8KLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGMgfSwKLSNpZiAwCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpIH0sIC8qbWljKi8KLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMiA8PCA4KSkgfSwgLypsaW5lLWluKi8KLSNlbmRpZgotCXsgfSAvKiBlbmQgKi8KLX07Ci0vKgotICogNmNoIG1vZGUKLSAqIG5lZWQgdG8gc2V0IHRoZSBjb2RlYyBsaW5lIG91dCBhbmQgbWljIDEgcGluIHdpZGdldHMgdG8gb3V0cHV0cwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV90aHJlZXN0YWNrX2NoNl9pbml0W10gPSB7Ci0JLyogc2V0IHBpbiB3aWRnZXQgMUFoIChsaW5lIGluKSBmb3Igb3V0cHV0IChCYWNrIFN1cnJvdW5kKSovCi0JeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQkvKiBzZXQgcGluIHdpZGdldCAxOGggKG1pYzEpIGZvciBvdXRwdXQgKENMRkUpKi8KLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCi0JeyAweDBjLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCXsgMHgwZCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwIH0sCi0jaWYgMAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAxIDw8IDgpKSB9LCAvKm1pYyovCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpIH0sIC8qbGluZSBpbiovCi0jZW5kaWYKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODYxX3RocmVlc3RhY2tfbW9kZXNbMl0gPSB7Ci0JeyAyLCBhbGM4NjFfdGhyZWVzdGFja19jaDJfaW5pdCB9LAotCXsgNiwgYWxjODYxX3RocmVlc3RhY2tfY2g2X2luaXQgfSwKLX07Ci0vKiBTZXQgbWljMSBhcyBpbnB1dCBhbmQgdW5tdXRlIHRoZSBtaXhlciAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfdW5pd2lsbF9tMzFfY2gyX2luaXRbXSA9IHsKLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAxIDw8IDgpKSB9LCAvKm1pYyovCi0JeyB9IC8qIGVuZCAqLwotfTsKLS8qIFNldCBtaWMxIGFzIG91dHB1dCBhbmQgbXV0ZSBtaXhlciAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfdW5pd2lsbF9tMzFfY2g0X2luaXRbXSA9IHsKLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKSB9LCAvKm1pYyovCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg2MV91bml3aWxsX20zMV9tb2Rlc1syXSA9IHsKLQl7IDIsIGFsYzg2MV91bml3aWxsX20zMV9jaDJfaW5pdCB9LAotCXsgNCwgYWxjODYxX3VuaXdpbGxfbTMxX2NoNF9pbml0IH0sCi19OwotCi0vKiBTZXQgbWljMSBhbmQgbGluZS1pbiBhcyBpbnB1dCBhbmQgdW5tdXRlIHRoZSBtaXhlciAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfYXN1c19jaDJfaW5pdFtdID0gewotCS8qIHNldCBwaW4gd2lkZ2V0IDFBaCAobGluZSBpbikgZm9yIGlucHV0ICovCi0JeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiBzZXQgcGluIHdpZGdldCAxOGggKG1pYzEvMikgZm9yIGlucHV0LCBmb3IgbWljIGFsc28gZW5hYmxlCi0JICogdGhlIHZyZWYKLQkgKi8KLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGMgfSwKLSNpZiAwCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpIH0sIC8qbWljKi8KLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMiA8PCA4KSkgfSwgLypsaW5lLWluKi8KLSNlbmRpZgotCXsgfSAvKiBlbmQgKi8KLX07Ci0vKiBTZXQgbWljMSBuYWQgbGluZS1pbiBhcyBvdXRwdXQgYW5kIG11dGUgbWl4ZXIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX2FzdXNfY2g2X2luaXRbXSA9IHsKLQkvKiBzZXQgcGluIHdpZGdldCAxQWggKGxpbmUgaW4pIGZvciBvdXRwdXQgKEJhY2sgU3Vycm91bmQpKi8KLQl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCS8qIHsgMHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwgKi8KLQkvKiBzZXQgcGluIHdpZGdldCAxOGggKG1pYzEpIGZvciBvdXRwdXQgKENMRkUpKi8KLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCS8qIHsgMHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwgKi8KLQl7IDB4MGMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODAgfSwKLSNpZiAwCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpIH0sIC8qbWljKi8KLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMiA8PCA4KSkgfSwgLypsaW5lIGluKi8KLSNlbmRpZgotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4NjFfYXN1c19tb2Rlc1syXSA9IHsKLQl7IDIsIGFsYzg2MV9hc3VzX2NoMl9pbml0IH0sCi0JeyA2LCBhbGM4NjFfYXN1c19jaDZfaW5pdCB9LAotfTsKLQotLyogcGF0Y2gtQUxDODYxICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfYmFzZV9taXhlcltdID0gewotICAgICAgICAvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDA2LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDA1LCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDA1LCAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MDQsIDB4MCwgSERBX09VVFBVVCksCi0KLSAgICAgICAgLypJbnB1dCBtaXhlciBjb250cm9sICovCi0JLyogSERBX0NPREVDX1ZPTFVNRSgiSW5wdXQgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQkgICBIREFfQ09ERUNfTVVURSgiSW5wdXQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDEwLCAweDAxLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWEsIDB4MDMsIEhEQV9JTlBVVCksCi0KLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxXzNTVF9taXhlcltdID0gewotICAgICAgICAvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDA2LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDA1LCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDA1LCAyLCAweDAsIEhEQV9PVVRQVVQpLAotCS8qSERBX0NPREVDX01VVEUoIlNpZGUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNCwgMHgwLCBIREFfT1VUUFVUKSwgKi8KLQotCS8qIElucHV0IG1peGVyIGNvbnRyb2wgKi8KLQkvKiBIREFfQ09ERUNfVk9MVU1FKCJJbnB1dCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCSAgIEhEQV9DT0RFQ19NVVRFKCJJbnB1dCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLCAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MDEsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwMywgSERBX0lOUFVUKSwKLQotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCi0JCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKLQkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKLQkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKLSAgICAgICAgICAgICAgICAucHJpdmF0ZV92YWx1ZSA9IEFSUkFZX1NJWkUoYWxjODYxX3RocmVlc3RhY2tfbW9kZXMpLAotCX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV90b3NoaWJhX21peGVyW10gPSB7Ci0gICAgICAgIC8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0NPREVDX01VVEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKLQotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfdW5pd2lsbF9tMzFfbWl4ZXJbXSA9IHsKLSAgICAgICAgLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwNiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQkvKkhEQV9DT0RFQ19NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MDQsIDB4MCwgSERBX09VVFBVVCksICovCi0KLQkvKiBJbnB1dCBtaXhlciBjb250cm9sICovCi0JLyogSERBX0NPREVDX1ZPTFVNRSgiSW5wdXQgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQkgICBIREFfQ09ERUNfTVVURSgiSW5wdXQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDEwLCAweDAxLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWEsIDB4MDMsIEhEQV9JTlBVVCksCi0KLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAotCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCi0JCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCi0JCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCi0gICAgICAgICAgICAgICAgLnByaXZhdGVfdmFsdWUgPSBBUlJBWV9TSVpFKGFsYzg2MV91bml3aWxsX20zMV9tb2RlcyksCi0JfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxX2FzdXNfbWl4ZXJbXSA9IHsKLSAgICAgICAgLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwNiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDA0LCAweDAsIEhEQV9PVVRQVVQpLAotCi0JLyogSW5wdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIklucHV0IFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIklucHV0IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMHgwMSwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFhLCAweDAzLCBIREFfT1VUUFVUKSwKLQotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCi0JCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKLQkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKLQkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKLSAgICAgICAgICAgICAgICAucHJpdmF0ZV92YWx1ZSA9IEFSUkFZX1NJWkUoYWxjODYxX2FzdXNfbW9kZXMpLAotCX0sCi0JeyB9Ci19OwotCi0vKiBhZGRpdGlvbmFsIG1peGVyICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxX2FzdXNfbGFwdG9wX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV9iYXNlX2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JLyogcG9ydC1BIGZvciBzdXJyb3VuZCAocmVhciBwYW5lbCkgKi8KLQl7IDB4MGUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCXsgMHgwZSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQkvKiBwb3J0LUIgZm9yIG1pYy1pbiAocmVhciBwYW5lbCkgd2l0aCB2cmVmICovCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQkvKiBwb3J0LUMgZm9yIGxpbmUtaW4gKHJlYXIgcGFuZWwpICovCi0JeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiBwb3J0LUQgZm9yIEZyb250ICovCi0JeyAweDBiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQl7IDB4MGIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JLyogcG9ydC1FIGZvciBIUCBvdXQgKGZyb250IHBhbmVsKSAqLwotCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwIH0sCi0JLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIHBvcnQtRiBmb3IgbWljLWluIChmcm9udCBwYW5lbCkgd2l0aCB2cmVmICovCi0JeyAweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQkvKiBwb3J0LUcgZm9yIENMRkUgKHJlYXIgcGFuZWwpICovCi0JeyAweDFmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQl7IDB4MWYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JLyogcG9ydC1IIGZvciBzaWRlIChyZWFyIHBhbmVsKSAqLwotCXsgMHgyMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JeyAweDIwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIENELWluICovCi0JeyAweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiByb3V0ZSBmcm9udCBtaWMgdG8gQURDMSovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKiBVbm11dGUgREFDMH4zICYgc3BkaWYgb3V0Ki8KLQl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBVbm11dGUgTWl4ZXIgMTQgKG1pYykgMWMgKExpbmUgaW4pKi8KLQl7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0gICAgICAgIHsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQkvKiBVbm11dGUgU3RlcmVvIE1peGVyIDE1ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwY30sIC8qIE91dHB1dCAwfjEyIHN0ZXAgKi8KLQotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JLyogaHAgdXNlZCBEQUMgMyAoRnJvbnQpICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAotICAgICAgICB7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0KLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX3RocmVlc3RhY2tfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KLQkgKi8KLQkvKiBwb3J0LUEgZm9yIHN1cnJvdW5kIChyZWFyIHBhbmVsKSAqLwotCXsgMHgwZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JLyogcG9ydC1CIGZvciBtaWMtaW4gKHJlYXIgcGFuZWwpIHdpdGggdnJlZiAqLwotCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcG9ydC1DIGZvciBsaW5lLWluIChyZWFyIHBhbmVsKSAqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogcG9ydC1EIGZvciBGcm9udCAqLwotCXsgMHgwYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JeyAweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIHBvcnQtRSBmb3IgSFAgb3V0IChmcm9udCBwYW5lbCkgKi8KLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMCB9LAotCS8qIHJvdXRlIGZyb250IFBDTSB0byBIUCAqLwotCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQkvKiBwb3J0LUYgZm9yIG1pYy1pbiAoZnJvbnQgcGFuZWwpIHdpdGggdnJlZiAqLwotCXsgMHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcG9ydC1HIGZvciBDTEZFIChyZWFyIHBhbmVsKSAqLwotCXsgMHgxZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JLyogcG9ydC1IIGZvciBzaWRlIChyZWFyIHBhbmVsKSAqLwotCXsgMHgyMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JLyogQ0QtaW4gKi8KLQl7IDB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAotCS8qIHJvdXRlIGZyb250IG1pYyB0byBBREMxKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQkvKiBVbm11dGUgREFDMH4zICYgc3BkaWYgb3V0Ki8KLQl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBVbm11dGUgTWl4ZXIgMTQgKG1pYykgMWMgKExpbmUgaW4pKi8KLQl7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0gICAgICAgIHsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQkvKiBVbm11dGUgU3RlcmVvIE1peGVyIDE1ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwY30sIC8qIE91dHB1dCAwfjEyIHN0ZXAgKi8KLQotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JLyogaHAgdXNlZCBEQUMgMyAoRnJvbnQpICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAotICAgICAgICB7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV91bml3aWxsX20zMV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCS8qIHBvcnQtQSBmb3Igc3Vycm91bmQgKHJlYXIgcGFuZWwpICovCi0JeyAweDBlLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKLQkvKiBwb3J0LUIgZm9yIG1pYy1pbiAocmVhciBwYW5lbCkgd2l0aCB2cmVmICovCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQkvKiBwb3J0LUMgZm9yIGxpbmUtaW4gKHJlYXIgcGFuZWwpICovCi0JeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiBwb3J0LUQgZm9yIEZyb250ICovCi0JeyAweDBiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQl7IDB4MGIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JLyogcG9ydC1FIGZvciBIUCBvdXQgKGZyb250IHBhbmVsKSAqLwotCS8qIHRoaXMgaGFzIHRvIGJlIHNldCB0byBWUkVGODAgKi8KLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCS8qIHJvdXRlIGZyb250IFBDTSB0byBIUCAqLwotCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQkvKiBwb3J0LUYgZm9yIG1pYy1pbiAoZnJvbnQgcGFuZWwpIHdpdGggdnJlZiAqLwotCXsgMHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcG9ydC1HIGZvciBDTEZFIChyZWFyIHBhbmVsKSAqLwotCXsgMHgxZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JLyogcG9ydC1IIGZvciBzaWRlIChyZWFyIHBhbmVsKSAqLwotCXsgMHgyMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JLyogQ0QtaW4gKi8KLQl7IDB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAotCS8qIHJvdXRlIGZyb250IG1pYyB0byBBREMxKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQkvKiBVbm11dGUgREFDMH4zICYgc3BkaWYgb3V0Ki8KLQl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBVbm11dGUgTWl4ZXIgMTQgKG1pYykgMWMgKExpbmUgaW4pKi8KLQl7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0gICAgICAgIHsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQkvKiBVbm11dGUgU3RlcmVvIE1peGVyIDE1ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwY30sIC8qIE91dHB1dCAwfjEyIHN0ZXAgKi8KLQotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JLyogaHAgdXNlZCBEQUMgMyAoRnJvbnQpICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAotICAgICAgICB7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV9hc3VzX2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JLyogcG9ydC1BIGZvciBzdXJyb3VuZCAocmVhciBwYW5lbCkKLQkgKiBhY2NvcmRpbmcgdG8gY29kZWMjMCB0aGlzIGlzIHRoZSBIUCBqYWNrCi0JICovCi0JeyAweDBlLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzAgfSwgLyogd2FzIDB4MDAgKi8KLQkvKiByb3V0ZSBmcm9udCBQQ00gdG8gSFAgKi8KLQl7IDB4MGUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCi0JLyogcG9ydC1CIGZvciBtaWMtaW4gKHJlYXIgcGFuZWwpIHdpdGggdnJlZiAqLwotCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcG9ydC1DIGZvciBsaW5lLWluIChyZWFyIHBhbmVsKSAqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogcG9ydC1EIGZvciBGcm9udCAqLwotCXsgMHgwYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JeyAweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIHBvcnQtRSBmb3IgSFAgb3V0IChmcm9udCBwYW5lbCkgKi8KLQkvKiB0aGlzIGhhcyB0byBiZSBzZXQgdG8gVlJFRjgwICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQkvKiByb3V0ZSBmcm9udCBQQ00gdG8gSFAgKi8KLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JLyogcG9ydC1GIGZvciBtaWMtaW4gKGZyb250IHBhbmVsKSB3aXRoIHZyZWYgKi8KLQl7IDB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCS8qIHBvcnQtRyBmb3IgQ0xGRSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MWYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCS8qIHBvcnQtSCBmb3Igc2lkZSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MjAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCS8qIENELWluICovCi0JeyAweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiByb3V0ZSBmcm9udCBtaWMgdG8gQURDMSovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JLyogVW5tdXRlIERBQzB+MyAmIHNwZGlmIG91dCovCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIFVubXV0ZSBNaXhlciAxNCAobWljKSAxYyAoTGluZSBpbikqLwotCXsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0gICAgICAgIHsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLSAgICAgICAgezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCS8qIFVubXV0ZSBTdGVyZW8gTWl4ZXIgMTUgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjfSwgLyogT3V0cHV0IDB+MTIgc3RlcCAqLwotCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQkvKiBocCB1c2VkIERBQyAzIChGcm9udCkgKi8KLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsgfQotfTsKLQotLyogYWRkaXRpb25hbCBpbml0IHZlcmJzIGZvciBBU1VTIGxhcHRvcHMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX2FzdXNfbGFwdG9wX2luaXRfdmVyYnNbXSA9IHsKLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0NSB9LCAvKiBIUC1vdXQgKi8KLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpIH0sIC8qIG11dGUgbGluZS1pbiAqLwotCXsgfQotfTsKLQotLyoKLSAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfYXV0b19pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCS8qIHsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyogVW5tdXRlIERBQzB+MyAmIHNwZGlmIG91dCovCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MDYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCS8qIFVubXV0ZSBNaXhlciAxNCAobWljKSAxYyAoTGluZSBpbikqLwotCXsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQkvKiBVbm11dGUgU3RlcmVvIE1peGVyIDE1ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwY30sCi0KLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0KLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAkvKiBzZXQgTWljIDEgKi8KLQotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfdG9zaGliYV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MGYsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCi0JeyB9Ci19OwotCi0vKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGM4NjFfdG9zaGliYV9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQl1bnNpZ25lZCBpbnQgcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MGYpOwotCi0Jc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDE2LCBIREFfSU5QVVQsIDAsCi0JCQkJIEhEQV9BTVBfTVVURSwgcHJlc2VudCA/IEhEQV9BTVBfTVVURSA6IDApOwotCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxYSwgSERBX0lOUFVULCAzLAotCQkJCSBIREFfQU1QX01VVEUsIHByZXNlbnQgPyAwIDogSERBX0FNUF9NVVRFKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjODYxX3Rvc2hpYmFfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCByZXMpCi17Ci0JaWYgKChyZXMgPj4gMjYpID09IEFMQzg4MF9IUF9FVkVOVCkKLQkJYWxjODYxX3Rvc2hpYmFfYXV0b211dGUoY29kZWMpOwotfQotCi0vKiBwY20gY29uZmlndXJhdGlvbjogaWRlbnRpY2FsIHdpdGggQUxDODgwICovCi0jZGVmaW5lIGFsYzg2MV9wY21fYW5hbG9nX3BsYXliYWNrCWFsYzg4MF9wY21fYW5hbG9nX3BsYXliYWNrCi0jZGVmaW5lIGFsYzg2MV9wY21fYW5hbG9nX2NhcHR1cmUJYWxjODgwX3BjbV9hbmFsb2dfY2FwdHVyZQotI2RlZmluZSBhbGM4NjFfcGNtX2RpZ2l0YWxfcGxheWJhY2sJYWxjODgwX3BjbV9kaWdpdGFsX3BsYXliYWNrCi0jZGVmaW5lIGFsYzg2MV9wY21fZGlnaXRhbF9jYXB0dXJlCWFsYzg4MF9wY21fZGlnaXRhbF9jYXB0dXJlCi0KLQotI2RlZmluZSBBTEM4NjFfRElHT1VUX05JRAkweDA3Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4NjFfOGNoX21vZGVzWzFdID0gewotCXsgOCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MV9kYWNfbmlkc1s0XSA9IHsKLQkvKiBmcm9udCwgc3Vycm91bmQsIGNsZmUsIHNpZGUgKi8KLQkweDAzLCAweDA2LCAweDA1LCAweDA0Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY2MF9kYWNfbmlkc1szXSA9IHsKLQkvKiBmcm9udCwgY2xmZSwgc3Vycm91bmQgKi8KLQkweDAzLCAweDA1LCAweDA2Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MV9hZGNfbmlkc1sxXSA9IHsKLQkvKiBBREMwLTIgKi8KLQkweDA4LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg2MV9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gNSwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJGcm9udCBNaWMiLCAweDMgfSwKLQkJeyAiTGluZSIsIDB4MSB9LAotCQl7ICJDRCIsIDB4NCB9LAotCQl7ICJNaXhlciIsIDB4NSB9LAotCX0sCi19OwotCi1zdGF0aWMgaGRhX25pZF90IGFsYzg2MV9sb29rX2Zvcl9kYWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW4pCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaGRhX25pZF90IG1peCwgc3Jjc1s1XTsKLQlpbnQgaSwgaiwgbnVtOwotCi0JaWYgKHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBwaW4sICZtaXgsIDEpICE9IDEpCi0JCXJldHVybiAwOwotCW51bSA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBtaXgsIHNyY3MsIEFSUkFZX1NJWkUoc3JjcykpOwotCWlmIChudW0gPCAwKQotCQlyZXR1cm4gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJdW5zaWduZWQgaW50IHR5cGU7Ci0JCXR5cGUgPSBnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIHNyY3NbaV0pKTsKLQkJaWYgKHR5cGUgIT0gQUNfV0lEX0FVRF9PVVQpCi0JCQljb250aW51ZTsKLQkJZm9yIChqID0gMDsgaiA8IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzOyBqKyspCi0JCQlpZiAoc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbal0gPT0gc3Jjc1tpXSkKLQkJCQlicmVhazsKLQkJaWYgKGogPj0gc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MpCi0JCQlyZXR1cm4gc3Jjc1tpXTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGZpbGwgaW4gdGhlIGRhY19uaWRzIHRhYmxlIGZyb20gdGhlIHBhcnNlZCBwaW4gY29uZmlndXJhdGlvbiAqLwotc3RhdGljIGludCBhbGM4NjFfYXV0b19maWxsX2RhY19uaWRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBpOwotCWhkYV9uaWRfdCBuaWQsIGRhYzsKLQotCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gc3BlYy0+cHJpdmF0ZV9kYWNfbmlkczsKLQlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5saW5lX291dHM7IGkrKykgewotCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07Ci0JCWRhYyA9IGFsYzg2MV9sb29rX2Zvcl9kYWMoY29kZWMsIG5pZCk7Ci0JCWlmICghZGFjKQotCQkJY29udGludWU7Ci0JCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MrK10gPSBkYWM7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fYWxjODYxX2NyZWF0ZV9vdXRfc3coc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKnBmeCwKLQkJCQkgIGhkYV9uaWRfdCBuaWQsIGludCBpZHgsIHVuc2lnbmVkIGludCBjaHMpCi17Ci0JcmV0dXJuIF9fYWRkX3BiX3N3X2N0cmwoY29kZWMtPnNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIHBmeCwgaWR4LAotCQkJICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIGNocywgMCwgSERBX09VVFBVVCkpOwotfQotCi0jZGVmaW5lIGFsYzg2MV9jcmVhdGVfb3V0X3N3KGNvZGVjLCBwZngsIG5pZCwgY2hzKSBcCi0JX19hbGM4NjFfY3JlYXRlX291dF9zdyhjb2RlYywgcGZ4LCBuaWQsIDAsIGNocykKLQotLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZyb20gdGhlIHBhcnNlZCBEQUMgdGFibGUgKi8KLXN0YXRpYyBpbnQgYWxjODYxX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNobmFtZVs0XSA9IHsKLQkJIkZyb250IiwgIlN1cnJvdW5kIiwgTlVMTCAvKkNMRkUqLywgIlNpZGUiCi0JfTsKLQljb25zdCBjaGFyICpwZnggPSBhbGNfZ2V0X2xpbmVfb3V0X3BmeChzcGVjLCB0cnVlKTsKLQloZGFfbmlkX3QgbmlkOwotCWludCBpLCBlcnIsIG5vdXRwdXRzOwotCi0Jbm91dHB1dHMgPSBjZmctPmxpbmVfb3V0czsKLQlpZiAoc3BlYy0+bXVsdGlfaW9zID4gMCkKLQkJbm91dHB1dHMgKz0gc3BlYy0+bXVsdGlfaW9zOwotCi0JZm9yIChpID0gMDsgaSA8IG5vdXRwdXRzOyBpKyspIHsKLQkJbmlkID0gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV07Ci0JCWlmICghbmlkKQotCQkJY29udGludWU7Ci0JCWlmICghcGZ4ICYmIGkgPT0gMikgewotCQkJLyogQ2VudGVyL0xGRSAqLwotCQkJZXJyID0gYWxjODYxX2NyZWF0ZV9vdXRfc3coY29kZWMsICJDZW50ZXIiLCBuaWQsIDEpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IGFsYzg2MV9jcmVhdGVfb3V0X3N3KGNvZGVjLCAiTEZFIiwgbmlkLCAyKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0gZWxzZSB7Ci0JCQljb25zdCBjaGFyICpuYW1lID0gcGZ4OwotCQkJaW50IGluZGV4ID0gaTsKLQkJCWlmICghbmFtZSkgewotCQkJCW5hbWUgPSBjaG5hbWVbaV07Ci0JCQkJaW5kZXggPSAwOwotCQkJfQotCQkJZXJyID0gX19hbGM4NjFfY3JlYXRlX291dF9zdyhjb2RlYywgbmFtZSwgbmlkLCBpbmRleCwgMyk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFsYzg2MV9hdXRvX2NyZWF0ZV9ocF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgcGluKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBlcnI7Ci0JaGRhX25pZF90IG5pZDsKLQotCWlmICghcGluKQotCQlyZXR1cm4gMDsKLQotCWlmICgocGluID49IDB4MGIgJiYgcGluIDw9IDB4MTApIHx8IHBpbiA9PSAweDFmIHx8IHBpbiA9PSAweDIwKSB7Ci0JCW5pZCA9IGFsYzg2MV9sb29rX2Zvcl9kYWMoY29kZWMsIHBpbik7Ci0JCWlmIChuaWQpIHsKLQkJCWVyciA9IGFsYzg2MV9jcmVhdGVfb3V0X3N3KGNvZGVjLCAiSGVhZHBob25lIiwgbmlkLCAzKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSBuaWQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGNyZWF0ZSBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciBpbnB1dCBwaW5zICovCi1zdGF0aWMgaW50IGFsYzg2MV9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCXJldHVybiBhbGNfYXV0b19jcmVhdGVfaW5wdXRfY3Rscyhjb2RlYywgY2ZnLCAweDE1LCAweDA4LCAwKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjODYxX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgICBoZGFfbmlkX3QgbmlkLAotCQkJCQkgICAgICBpbnQgcGluX3R5cGUsIGhkYV9uaWRfdCBkYWMpCi17Ci0JaGRhX25pZF90IG1peCwgc3Jjc1s1XTsKLQlpbnQgaSwgbnVtOwotCi0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCi0JCQkgICAgcGluX3R5cGUpOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGRhYywgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKLQkJCSAgICBBTVBfT1VUX1VOTVVURSk7Ci0JaWYgKHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsICZtaXgsIDEpICE9IDEpCi0JCXJldHVybjsKLQludW0gPSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyhjb2RlYywgbWl4LCBzcmNzLCBBUlJBWV9TSVpFKHNyY3MpKTsKLQlpZiAobnVtIDwgMCkKLQkJcmV0dXJuOwotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQl1bnNpZ25lZCBpbnQgbXV0ZTsKLQkJaWYgKHNyY3NbaV0gPT0gZGFjIHx8IHNyY3NbaV0gPT0gMHgxNSkKLQkJCW11dGUgPSBBTVBfSU5fVU5NVVRFKGkpOwotCQllbHNlCi0JCQltdXRlID0gQU1QX0lOX01VVEUoaSk7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG1peCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKLQkJCQkgICAgbXV0ZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhbGM4NjFfYXV0b19pbml0X211bHRpX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0czsgaSsrKSB7Ci0JCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbaV07Ci0JCWludCBwaW5fdHlwZSA9IGdldF9waW5fdHlwZShzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3R5cGUpOwotCQlpZiAobmlkKQotCQkJYWxjODYxX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBuaWQsIHBpbl90eXBlLAotCQkJCQkJCSAgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYWxjODYxX2F1dG9faW5pdF9ocF9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlpZiAoc3BlYy0+YXV0b2NmZy5ocF9vdXRzKQotCQlhbGM4NjFfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsCi0JCQkJCQkgIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwKLQkJCQkJCSAgUElOX0hQLAotCQkJCQkJICBzcGVjLT5tdWx0aW91dC5ocF9uaWQpOwotCWlmIChzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfb3V0cykKLQkJYWxjODYxX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLAotCQkJCQkJICBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwKLQkJCQkJCSAgUElOX09VVCwKLQkJCQkJCSAgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF0pOwotfQotCi1zdGF0aWMgdm9pZCBhbGM4NjFfYXV0b19pbml0X2FuYWxvZ19pbnB1dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgewotCQloZGFfbmlkX3QgbmlkID0gY2ZnLT5pbnB1dHNbaV0ucGluOwotCQlpZiAobmlkID49IDB4MGMgJiYgbmlkIDw9IDB4MTEpCi0JCQlhbGNfc2V0X2lucHV0X3Bpbihjb2RlYywgbmlkLCBjZmctPmlucHV0c1tpXS50eXBlKTsKLQl9Ci19Ci0KLS8qIHBhcnNlIHRoZSBCSU9TIGNvbmZpZ3VyYXRpb24gYW5kIHNldCB1cCB0aGUgYWxjX3NwZWMgKi8KLS8qIHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIDAgaWYgdGhlIHByb3BlciBjb25maWcgaXMgbm90IGZvdW5kLAotICogb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCi0gKi8KLXN0YXRpYyBpbnQgYWxjODYxX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBlcnI7Ci0Jc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4NjFfaWdub3JlW10gPSB7IDB4MWQsIDAgfTsKLQotCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAotCQkJCQkgICBhbGM4NjFfaWdub3JlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzKQotCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KLQotCWVyciA9IGFsYzg2MV9hdXRvX2ZpbGxfZGFjX25pZHMoY29kZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGNfYXV0b19hZGRfbXVsdGlfY2hhbm5lbF9tb2RlKGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGM4NjFfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoY29kZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGM4NjFfYXV0b19jcmVhdGVfaHBfY3Rscyhjb2RlYywgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGM4NjFfYXV0b19jcmVhdGVfaW5wdXRfY3Rscyhjb2RlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0Jc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgKiAyOwotCi0JYWxjX2F1dG9fcGFyc2VfZGlnaXRhbChjb2RlYyk7Ci0KLQlpZiAoc3BlYy0+a2N0bHMubGlzdCkKLQkJYWRkX21peGVyKHNwZWMsIHNwZWMtPmtjdGxzLmxpc3QpOwotCi0JYWRkX3ZlcmIoc3BlYywgYWxjODYxX2F1dG9faW5pdF92ZXJicyk7Ci0KLQlzcGVjLT5udW1fbXV4X2RlZnMgPSAxOwotCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07Ci0KLQlzcGVjLT5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkczsKLQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyk7Ci0Jc2V0X2NhcHR1cmVfbWl4ZXIoY29kZWMpOwotCi0JYWxjX3NzaWRfY2hlY2soY29kZWMsIDB4MGUsIDB4MGYsIDB4MGIsIDApOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gZm9yIGF1dG8tY29uZmlndXJhdGlvbiBtb2RlbCAqLwotc3RhdGljIHZvaWQgYWxjODYxX2F1dG9faW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlhbGM4NjFfYXV0b19pbml0X211bHRpX291dChjb2RlYyk7Ci0JYWxjODYxX2F1dG9faW5pdF9ocF9vdXQoY29kZWMpOwotCWFsYzg2MV9hdXRvX2luaXRfYW5hbG9nX2lucHV0KGNvZGVjKTsKLQlhbGNfYXV0b19pbml0X2RpZ2l0YWwoY29kZWMpOwotCWlmIChzcGVjLT51bnNvbF9ldmVudCkKLQkJYWxjX2luaXRob29rKGNvZGVjKTsKLX0KLQotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2FtcF9saXN0IGFsYzg2MV9sb29wYmFja3NbXSA9IHsKLQl7IDB4MTUsIEhEQV9JTlBVVCwgMCB9LAotCXsgMHgxNSwgSERBX0lOUFVULCAxIH0sCi0JeyAweDE1LCBIREFfSU5QVVQsIDIgfSwKLQl7IDB4MTUsIEhEQV9JTlBVVCwgMyB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0jZW5kaWYKLQotCi0vKgotICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjODYxX21vZGVsc1tBTEM4NjFfTU9ERUxfTEFTVF0gPSB7Ci0JW0FMQzg2MV8zU1RdCQk9ICIzc3RhY2siLAotCVtBTEM2NjBfM1NUXQkJPSAiM3N0YWNrLTY2MCIsCi0JW0FMQzg2MV8zU1RfRElHXQk9ICIzc3RhY2stZGlnIiwKLQlbQUxDODYxXzZTVF9ESUddCT0gIjZzdGFjay1kaWciLAotCVtBTEM4NjFfVU5JV0lMTF9NMzFdCT0gInVuaXdpbGwtbTMxIiwKLQlbQUxDODYxX1RPU0hJQkFdCT0gInRvc2hpYmEiLAotCVtBTEM4NjFfQVNVU10JCT0gImFzdXMiLAotCVtBTEM4NjFfQVNVU19MQVBUT1BdCT0gImFzdXMtbGFwdG9wIiwKLQlbQUxDODYxX0FVVE9dCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4NjFfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyMDUsICJBU1VTIFc3SiIsIEFMQzg2MV8zU1QpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMzUsICJBU1VTIEYyLzMiLCBBTEM4NjFfQVNVU19MQVBUT1ApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMzgsICJBU1VTIEYyLzMiLCBBTEM4NjFfQVNVU19MQVBUT1ApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzOTMsICJBU1VTIiwgQUxDODYxX0FTVVMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzZDcsICJBU1VTIEE5cnAiLCBBTEM4NjFfQVNVU19MQVBUT1ApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxY2IsICJBU1VTIFAxLUFIMiIsIEFMQzg2MV8zU1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjAwLCAiVG9zaGliYSIsIEFMQzg2MV9UT1NISUJBKSwKLQkvKiBGSVhNRTogdGhlIGVudHJ5IGJlbG93IGJyZWFrcyBUb3NoaWJhIEExMDAgKG1vZGVsPWF1dG8gd29ya3MhKQotCSAqICAgICAgICBBbnkgb3RoZXIgbW9kZWxzIHRoYXQgbmVlZCB0aGlzIHByZXNldD8KLQkgKi8KLQkvKiBTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjEwLCAiVG9zaGliYSIsIEFMQzg2MV9UT1NISUJBKSwgKi8KLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3MjU0LCAiSFAgZHgyMjAwIChNU0kgTVMtNzI1NCkiLCBBTEM4NjFfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3Mjk3LCAiSFAgZHgyMjUwIChNU0kgTVMtNzI5NykiLCBBTEM4NjFfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHgyYjAxLCAiVW5pd2lsbCBYNDBBSXgiLCBBTEM4NjFfVU5JV0lMTF9NMzEpLAotCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNzIsICJVbml3aWxsIG0zMSIsIEFMQzg2MV9VTklXSUxMX00zMSksCi0JU05EX1BDSV9RVUlSSygweDE1ODQsIDB4OTA3NSwgIkFpcmlzIFByYXhpcyBOMTIxMiIsIEFMQzg2MV9BU1VTX0xBUFRPUCksCi0JLyogRklYTUU6IHRoZSBiZWxvdyBzZWVtcyBjb25mbGljdCAqLwotCS8qIFNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNzUsICJVbml3aWxsIiwgQUxDODYxX1VOSVdJTExfTTMxKSwgKi8KLQlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMHgwNjYwLCAiQXNyb2NrIDkzOVNMSTMyIiwgQUxDNjYwXzNTVCksCi0JU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDYwMCwgIkludGVsIiwgQUxDODYxXzNTVCksCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjODYxX3ByZXNldHNbXSA9IHsKLQlbQUxDODYxXzNTVF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV8zU1RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV90aHJlZXN0YWNrX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdGhyZWVzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfdGhyZWVzdGFja19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxXzNTVF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM4NjFfYmFzZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX3RocmVlc3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdGhyZWVzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfdGhyZWVzdGFja19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxXzZTVF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM4NjFfYmFzZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX2Jhc2VfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfOGNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MV84Y2hfbW9kZXMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDNjYwXzNTVF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV8zU1RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV90aHJlZXN0YWNrX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjBfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdGhyZWVzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfdGhyZWVzdGFja19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxX1VOSVdJTExfTTMxXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxX3VuaXdpbGxfbTMxX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfdW5pd2lsbF9tMzFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdW5pd2lsbF9tMzFfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxX3VuaXdpbGxfbTMxX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODYxX2FkY19uaWRzKSwKLQkJLmFkY19uaWRzID0gYWxjODYxX2FkY19uaWRzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MV9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4NjFfVE9TSElCQV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV90b3NoaWJhX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfYmFzZV9pbml0X3ZlcmJzLAotCQkJCWFsYzg2MV90b3NoaWJhX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODYxX2FkY19uaWRzKSwKLQkJLmFkY19uaWRzID0gYWxjODYxX2FkY19uaWRzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MV9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjODYxX3Rvc2hpYmFfdW5zb2xfZXZlbnQsCi0JCS5pbml0X2hvb2sgPSBhbGM4NjFfdG9zaGliYV9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4NjFfQVNVU10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV9hc3VzX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfYXN1c19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4NjFfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MV9hc3VzX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MV9hc3VzX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLmhwX25pZCA9IDB4MDYsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxX0FTVVNfTEFQVE9QXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxX3Rvc2hpYmFfbWl4ZXIsIGFsYzg2MV9hc3VzX2xhcHRvcF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX2FzdXNfaW5pdF92ZXJicywKLQkJCQlhbGM4NjFfYXN1c19sYXB0b3BfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLX07Ci0KLS8qIFBpbiBjb25maWcgZml4ZXMgKi8KLWVudW0gewotCVBJTkZJWF9GU0NfQU1JTE9fUEkxNTA1LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgYWxjODYxX2ZpeHVwc1tdID0gewotCVtQSU5GSVhfRlNDX0FNSUxPX1BJMTUwNV0gPSB7Ci0JCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCi0JCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgewotCQkJeyAweDBiLCAweDAyMjExMDFmIH0sIC8qIEhQICovCi0JCQl7IDB4MGYsIDB4OTAxNzAzMTAgfSwgLyogc3BlYWtlciAqLwotCQkJeyB9Ci0JCX0KLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzg2MV9maXh1cF90YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTczNCwgMHgxMGM3LCAiRlNDIEFtaWxvIFBpMTUwNSIsIFBJTkZJWF9GU0NfQU1JTE9fUEkxNTA1KSwKLQl7fQotfTsKLQotc3RhdGljIGludCBwYXRjaF9hbGM4NjEoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjOwotCWludCBib2FyZF9jb25maWc7Ci0JaW50IGVycjsKLQotCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwotCWlmIChzcGVjID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY29kZWMtPnNwZWMgPSBzcGVjOwotCi0gICAgICAgIGJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBTEM4NjFfTU9ERUxfTEFTVCwKLQkJCQkJCSAgYWxjODYxX21vZGVscywKLQkJCQkJCSAgYWxjODYxX2NmZ190YmwpOwotCi0JaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiAlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLAotCQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSk7Ci0JCWJvYXJkX2NvbmZpZyA9IEFMQzg2MV9BVVRPOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgPT0gQUxDODYxX0FVVE8pIHsKLQkJYWxjX3BpY2tfZml4dXAoY29kZWMsIE5VTEwsIGFsYzg2MV9maXh1cF90YmwsIGFsYzg2MV9maXh1cHMpOwotCQlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJFX1BST0JFKTsKLQl9Ci0KLQlpZiAoYm9hcmRfY29uZmlnID09IEFMQzg2MV9BVVRPKSB7Ci0JCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLwotCQllcnIgPSBhbGM4NjFfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIGlmICghZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKLQkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKLQkJICAgYm9hcmRfY29uZmlnID0gQUxDODYxXzNTVF9ESUc7Ci0JCX0KLQl9Ci0KLQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgMHgyMyk7Ci0JaWYgKGVyciA8IDApIHsKLQkJYWxjX2ZyZWUoY29kZWMpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgIT0gQUxDODYxX0FVVE8pCi0JCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzg2MV9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOwotCi0Jc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZhbGM4NjFfcGNtX2FuYWxvZ19wbGF5YmFjazsKLQlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmYWxjODYxX3BjbV9hbmFsb2dfY2FwdHVyZTsKLQotCXNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrID0gJmFsYzg2MV9wY21fZGlnaXRhbF9wbGF5YmFjazsKLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlID0gJmFsYzg2MV9wY21fZGlnaXRhbF9jYXB0dXJlOwotCi0JaWYgKCFzcGVjLT5jYXBfbWl4ZXIpCi0JCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKLQlzZXRfYmVlcF9hbXAoc3BlYywgMHgyMywgMCwgSERBX09VVFBVVCk7Ci0KLQlzcGVjLT52bWFzdGVyX25pZCA9IDB4MDM7Ci0KLQlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJPQkUpOwotCi0JY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7Ci0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEM4NjFfQVVUTykgewotCQlzcGVjLT5pbml0X2hvb2sgPSBhbGM4NjFfYXV0b19pbml0OwotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLQkJc3BlYy0+cG93ZXJfaG9vayA9IGFsY19wb3dlcl9lYXBkOwotI2VuZGlmCi0JfQotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLQlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCi0JCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSBhbGM4NjFfbG9vcGJhY2tzOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEFMQzg2MS1WRCBzdXBwb3J0Ci0gKgotICogQmFzZWQgb24gQUxDODgyCi0gKgotICogSW4gYWRkaXRpb24sIGFuIGluZGVwZW5kZW50IERBQwotICovCi0jZGVmaW5lIEFMQzg2MVZEX0RJR09VVF9OSUQJMHgwNgotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MXZkX2RhY19uaWRzWzRdID0gewotCS8qIGZyb250LCBzdXJyLCBjbGZlLCBzaWRlIHN1cnIgKi8KLQkweDAyLCAweDAzLCAweDA0LCAweDA1Ci19OwotCi0vKiBkYWNfbmlkcyBmb3IgQUxDNjYwdmQgYXJlIGluIGEgZGlmZmVyZW50IG9yZGVyIC0gYWNjb3JkaW5nIHRvCi0gKiBSZWFsdGVrJ3MgZHJpdmVyLgotICogVGhpcyBzaG91bGQgcHJvYmFibHkgcmVzdWx0IGluIGEgZGlmZmVyZW50IG1peGVyIGZvciA2c3RhY2sgbW9kZWxzCi0gKiBvZiBBTEM2NjB2ZCBjb2RlY3MsIGJ1dCBmb3Igbm93IHRoZXJlIGlzIG9ubHkgM3N0YWNrIG1peGVyCi0gKiAtIGFuZCBpdCBpcyB0aGUgc2FtZSBhcyBpbiA4NjF2ZC4KLSAqIGFkY19uaWRzIGluIEFMQzY2MHZkIGFyZSAoaXMpIHRoZSBzYW1lIGFzIGluIDg2MXZkCi0gKi8KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjYwdmRfZGFjX25pZHNbM10gPSB7Ci0JLyogZnJvbnQsIHJlYXIsIGNsZmUsIHJlYXJfc3VyciAqLwotCTB4MDIsIDB4MDQsIDB4MDMKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODYxdmRfYWRjX25pZHNbMV0gPSB7Ci0JLyogQURDMCAqLwotCTB4MDksCi19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MXZkX2NhcHNyY19uaWRzWzFdID0geyAweDIyIH07Ci0KLS8qIGlucHV0IE1VWCAqLwotLyogRklYTUU6IHNob3VsZCBiZSBhIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4NjF2ZF9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gNCwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJGcm9udCBNaWMiLCAweDEgfSwKLQkJeyAiTGluZSIsIDB4MiB9LAotCQl7ICJDRCIsIDB4NCB9LAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODYxdmRfZGFsbGFzX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAyLAotCS5pdGVtcyA9IHsKLQkJeyAiTWljIiwgMHgwIH0sCi0JCXsgIkludGVybmFsIE1pYyIsIDB4MSB9LAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODYxdmRfaHBfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDIsCi0JLml0ZW1zID0gewotCQl7ICJGcm9udCBNaWMiLCAweDAgfSwKLQkJeyAiQVRBUEkgTWljIiwgMHgxIH0sCi0JfSwKLX07Ci0KLS8qCi0gKiAyY2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODYxdmRfM3N0YWNrXzJjaF9tb2Rlc1sxXSA9IHsKLQl7IDIsIE5VTEwgfQotfTsKLQotLyoKLSAqIDZjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfNnN0YWNrX2NoNl9pbml0W10gPSB7Ci0JeyAweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKLQl7IDB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogOGNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjF2ZF82c3RhY2tfY2g4X2luaXRbXSA9IHsKLQl7IDB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4NjF2ZF82c3RhY2tfbW9kZXNbMl0gPSB7Ci0JeyA2LCBhbGM4NjF2ZF82c3RhY2tfY2g2X2luaXQgfSwKLQl7IDgsIGFsYzg2MXZkXzZzdGFja19jaDhfaW5pdCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MXZkX2NobW9kZV9taXhlcltdID0gewotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCi0JCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKLQkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKLQkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKLQl9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBSZWFyPTB4MTUsIENMRkU9MHgxNiwgU2lkZT0weDE3Ci0gKiAgICAgICAgICAgICAgICAgTWljPTB4MTgsIEZyb250IE1pYz0weDE5LCBMaW5lLUluPTB4MWEsIEhQPTB4MWIKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MXZkXzZzdF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDEsIDB4MCwKLQkJCQlIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAyLCAweDAsCi0JCQkJSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiU2lkZSBQbGF5YmFjayBWb2x1bWUiLCAweDA1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIlNpZGUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMiwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MXZkXzNzdF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MXZkX2xlbm92b19taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JLypIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLCovCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0KLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0KLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBQaW4gYXNzaWdubWVudDogU3BlYWtlcj0weDE0LCBIUCA9IDB4MTUsCi0gKiAgICAgICAgICAgICAgICAgTWljPTB4MTgsIEludGVybmFsIE1pYyA9IDB4MTksIENEID0gMHgxYywgUEMgQmVlcCA9IDB4MWQKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MXZkX2RhbGxhc19taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIFBpbiBhc3NpZ25tZW50OiBTcGVha2VyPTB4MTQsIExpbmUtb3V0ID0gMHgxNSwKLSAqICAgICAgICAgICAgICAgICBGcm9udCBNaWM9MHgxOCwgQVRBUEkgTWljID0gMHgxOSwKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MXZkX2hwX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQVRBUEkgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQVRBUEkgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mCi0JICogdGhlIGFuYWxvZy1sb29wYmFjayBtaXhlciB3aWRnZXQKLQkgKi8KLQkvKiBBbXAgSW5kaWNlczogTWljMSA9IDAsIE1pYzIgPSAxLCBMaW5lMSA9IDIsIExpbmUyID0gMywgQ0QgPSA0ICovCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCi0JLyogQ2FwdHVyZSBtaXhlcjogdW5tdXRlIE1pYywgRi1NaWMsIExpbmUsIENEIGlucHV0cyAqLwotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDQpfSwKLQotCS8qCi0JICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MDIgLSAweDA1KQotCSAqLwotCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0KLQkvKiBzZXQgdXAgaW5wdXQgYW1wcyBmb3IgYW5hbG9nIGxvb3BiYWNrICovCi0JLyogQW1wIEluZGljZXM6IERBQyA9IDAsIG1peGVyID0gMSAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQotCXsgfQotfTsKLQotLyoKLSAqIDMtc3RhY2sgcGluIGNvbmZpZ3VyYXRpb246Ci0gKiBmcm9udCA9IDB4MTQsIG1pYy9jbGZlID0gMHgxOCwgSFAgPSAweDE5LCBsaW5lL3N1cnIgPSAweDFhLCBmLW1pYyA9IDB4MWIKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogU2V0IHBpbiBtb2RlIGFuZCBtdXRpbmcKLQkgKi8KLQkvKiBzZXQgZnJvbnQgcGluIHdpZGdldHMgMHgxNCBmb3Igb3V0cHV0ICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JLyogTWljIChyZWFyKSBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogRnJvbnQgTWljIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBMaW5lIEluIHBpbjogaW5wdXQgKi8KLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIExpbmUtMiBJbjogSGVhZHBob25lIG91dHB1dCAob3V0cHV0IDAgLSAweDBjKSAqLwotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCS8qIENEIHBpbiB3aWRnZXQgZm9yIGlucHV0ICovCi0JezB4MWMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQotCXsgfQotfTsKLQotLyoKLSAqIDYtc3RhY2sgcGluIGNvbmZpZ3VyYXRpb246Ci0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfNnN0YWNrX2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIFNldCBwaW4gbW9kZSBhbmQgbXV0aW5nCi0JICovCi0JLyogc2V0IGZyb250IHBpbiB3aWRnZXRzIDB4MTQgZm9yIG91dHB1dCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCS8qIFJlYXIgUGluOiBvdXRwdXQgMSAoMHgwZCkgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JLyogQ0xGRSBQaW46IG91dHB1dCAyICgweDBlKSAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwKLQkvKiBTaWRlIFBpbjogb3V0cHV0IDMgKDB4MGYpICovCi0JezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDN9LAotCi0JLyogTWljIChyZWFyKSBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogRnJvbnQgTWljIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBMaW5lIEluIHBpbjogaW5wdXQgKi8KLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIExpbmUtMiBJbjogSGVhZHBob25lIG91dHB1dCAob3V0cHV0IDAgLSAweDBjKSAqLwotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCS8qIENEIHBpbiB3aWRnZXQgZm9yIGlucHV0ICovCi0JezB4MWMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjF2ZF9lYXBkX3ZlcmJzW10gPSB7Ci0JezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYwdmRfZWFwZF92ZXJic1tdID0gewotCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfbGVub3ZvX3Vuc29sX3ZlcmJzW10gPSB7Ci0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNSl9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgdm9pZCBhbGM4NjF2ZF9sZW5vdm9fc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgdm9pZCBhbGM4NjF2ZF9sZW5vdm9faW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7Ci0JYWxjODh4X3NpbXBsZV9taWNfYXV0b211dGUoY29kZWMpOwotfQotCi1zdGF0aWMgdm9pZCBhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCXVuc2lnbmVkIGludCByZXMpCi17Ci0Jc3dpdGNoIChyZXMgPj4gMjYpIHsKLQljYXNlIEFMQzg4MF9NSUNfRVZFTlQ6Ci0JCWFsYzg4eF9zaW1wbGVfbWljX2F1dG9tdXRlKGNvZGVjKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYWxjX3NrdV91bnNvbF9ldmVudChjb2RlYywgcmVzKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkX2RhbGxhc192ZXJic1tdID0gewotCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjUwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjUwfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzg2MXZkX2RhbGxhc19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLSNkZWZpbmUgYWxjODYxdmRfbG9vcGJhY2tzCWFsYzg4MF9sb29wYmFja3MKLSNlbmRpZgotCi0vKiBwY20gY29uZmlndXJhdGlvbjogaWRlbnRpY2FsIHdpdGggQUxDODgwICovCi0jZGVmaW5lIGFsYzg2MXZkX3BjbV9hbmFsb2dfcGxheWJhY2sJYWxjODgwX3BjbV9hbmFsb2dfcGxheWJhY2sKLSNkZWZpbmUgYWxjODYxdmRfcGNtX2FuYWxvZ19jYXB0dXJlCWFsYzg4MF9wY21fYW5hbG9nX2NhcHR1cmUKLSNkZWZpbmUgYWxjODYxdmRfcGNtX2RpZ2l0YWxfcGxheWJhY2sJYWxjODgwX3BjbV9kaWdpdGFsX3BsYXliYWNrCi0jZGVmaW5lIGFsYzg2MXZkX3BjbV9kaWdpdGFsX2NhcHR1cmUJYWxjODgwX3BjbV9kaWdpdGFsX2NhcHR1cmUKLQotLyoKLSAqIGNvbmZpZ3VyYXRpb24gYW5kIHByZXNldAotICovCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFsYzg2MXZkX21vZGVsc1tBTEM4NjFWRF9NT0RFTF9MQVNUXSA9IHsKLQlbQUxDNjYwVkRfM1NUXQkJPSAiM3N0YWNrLTY2MCIsCi0JW0FMQzY2MFZEXzNTVF9ESUddCT0gIjNzdGFjay02NjAtZGlnb3V0IiwKLQlbQUxDNjYwVkRfQVNVU19WMVNdCT0gImFzdXMtdjFzIiwKLQlbQUxDODYxVkRfM1NUXQkJPSAiM3N0YWNrIiwKLQlbQUxDODYxVkRfM1NUX0RJR10JPSAiM3N0YWNrLWRpZ291dCIsCi0JW0FMQzg2MVZEXzZTVF9ESUddCT0gIjZzdGFjay1kaWdvdXQiLAotCVtBTEM4NjFWRF9MRU5PVk9dCT0gImxlbm92byIsCi0JW0FMQzg2MVZEX0RBTExBU10JPSAiZGFsbGFzIiwKLQlbQUxDODYxVkRfSFBdCQk9ICJocCIsCi0JW0FMQzg2MVZEX0FVVE9dCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4NjF2ZF9jZmdfdGJsW10gPSB7Ci0JU05EX1BDSV9RVUlSSygweDEwMTksIDB4YTg4ZCwgIlJlYWx0ZWsgQUxDNjYwIGRlbW8iLCBBTEM2NjBWRF8zU1QpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwYmYsICJIUCBUWDEwMDAiLCBBTEM4NjFWRF9IUCksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTJlMiwgIkFzdXMgejM1bSIsIEFMQzY2MFZEXzNTVCksCi0JLypTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzM5LCAiQXN1cyBHMSIsIEFMQzY2MFZEXzNTVCksKi8gLyogYXV0byAqLwotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2MzMsICJBc3VzIFYxU24iLCBBTEM2NjBWRF9BU1VTX1YxUyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODFlNywgIkFTVVMiLCBBTEM2NjBWRF8zU1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTBkZSwgMHgwM2YwLCAiUmVhbHRlayBBTEM2NjAgZGVtbyIsIEFMQzY2MFZEXzNTVCksCi0JU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYwMCwgIlRvc2hpYmEgQTEzNSIsIEFMQzg2MVZEX0xFTk9WTyksCi0JLypTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjAwLCAiREFMTEFTIiwgQUxDODYxVkRfREFMTEFTKSwqLyAvKmxlbm92byovCi0JU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYwMSwgIlRvc2hpYmEgQTEzNSIsIEFMQzg2MVZEX0xFTk9WTyksCi0JU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYwMywgIlRvc2hpYmEgUDIwNSIsIEFMQzg2MVZEX0xFTk9WTyksCi0JU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYzMSwgIlRvc2hpYmEgTDMwLTE0OSIsIEFMQzg2MVZEX0RBTExBUyksCi0JU05EX1BDSV9RVUlSSygweDE1NjUsIDB4ODIwZCwgIkJpb3N0YXIgTkY2MVMgU0UiLCBBTEM4NjFWRF82U1RfRElHKSwKLQlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDE3YWEsICJMZW5vdm8iLCBBTEM4NjFWRF9MRU5PVk8pLAotCVNORF9QQ0lfUVVJUksoMHgxODQ5LCAweDA4NjIsICJBU1JvY2sgSzhORjZHLVZTVEEiLCBBTEM4NjFWRF82U1RfRElHKSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfY29uZmlnX3ByZXNldCBhbGM4NjF2ZF9wcmVzZXRzW10gPSB7Ci0JW0FMQzY2MFZEXzNTVF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkXzNzdF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJIGFsYzg2MXZkXzNzdGFja19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYwdmRfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjB2ZF9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjF2ZF9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM2NjBWRF8zU1RfRElHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxdmRfM3N0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQkgYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjB2ZF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2MHZkX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4NjFWRF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg2MVZEXzNTVF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkXzNzdF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJIGFsYzg2MXZkXzNzdGFja19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxdmRfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4NjF2ZF9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjF2ZF9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4NjFWRF8zU1RfRElHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxdmRfM3N0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicywKLQkJIAkJIGFsYzg2MXZkXzNzdGFja19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxdmRfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4NjF2ZF9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxVkRfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjF2ZF9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4NjFWRF82U1RfRElHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxdmRfNnN0X21peGVyLCBhbGM4NjF2ZF9jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzLAotCQkJCWFsYzg2MXZkXzZzdGFja19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxdmRfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4NjF2ZF9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxVkRfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzZzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF82c3RhY2tfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxVkRfTEVOT1ZPXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxdmRfbGVub3ZvX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicywKLQkJCQlhbGM4NjF2ZF9lYXBkX3ZlcmJzLAotCQkJCWFsYzg2MXZkX2xlbm92b191bnNvbF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2MHZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYwdmRfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsYzg2MXZkX2xlbm92b191bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODYxdmRfbGVub3ZvX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjODYxdmRfbGVub3ZvX2luaXRfaG9vaywKLQl9LAotCVtBTEM4NjFWRF9EQUxMQVNdID0gewotCQkubWl4ZXJzID0geyBhbGM4NjF2ZF9kYWxsYXNfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX2RhbGxhc192ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfZGFsbGFzX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM4NjF2ZF9kYWxsYXNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaHBfYXV0b211dGUsCi0JfSwKLQlbQUxDODYxVkRfSFBdID0gewotCQkubWl4ZXJzID0geyBhbGM4NjF2ZF9ocF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfZGFsbGFzX3ZlcmJzLCBhbGM4NjF2ZF9lYXBkX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxdmRfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4NjF2ZF9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxVkRfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjF2ZF9ocF9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODYxdmRfZGFsbGFzX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAotCX0sCi0JW0FMQzY2MFZEX0FTVVNfVjFTXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxdmRfbGVub3ZvX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicywKLQkJCQlhbGM4NjF2ZF9lYXBkX3ZlcmJzLAotCQkJCWFsYzg2MXZkX2xlbm92b191bnNvbF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2MHZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYwdmRfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsYzg2MXZkX2xlbm92b191bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODYxdmRfbGVub3ZvX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjODYxdmRfbGVub3ZvX2luaXRfaG9vaywKLQl9LAotfTsKLQotLyoKLSAqIEJJT1MgYXV0byBjb25maWd1cmF0aW9uCi0gKi8KLXN0YXRpYyBpbnQgYWxjODYxdmRfYXV0b19jcmVhdGVfaW5wdXRfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkJCWNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQlyZXR1cm4gYWxjX2F1dG9fY3JlYXRlX2lucHV0X2N0bHMoY29kZWMsIGNmZywgMHgwYiwgMHgyMiwgMCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgYWxjODYxdmRfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJaGRhX25pZF90IG5pZCwgaW50IHBpbl90eXBlLCBpbnQgZGFjX2lkeCkKLXsKLQlhbGNfc2V0X3Bpbl9vdXRwdXQoY29kZWMsIG5pZCwgcGluX3R5cGUpOwotfQotCi1zdGF0aWMgdm9pZCBhbGM4NjF2ZF9hdXRvX2luaXRfbXVsdGlfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8PSBIREFfU0lERTsgaSsrKSB7Ci0JCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbaV07Ci0JCWludCBwaW5fdHlwZSA9IGdldF9waW5fdHlwZShzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3R5cGUpOwotCQlpZiAobmlkKQotCQkJYWxjODYxdmRfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwKLQkJCQkJCQkgICAgcGluX3R5cGUsIGkpOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBhbGM4NjF2ZF9hdXRvX2luaXRfaHBfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBwaW47Ci0KLQlwaW4gPSBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF07Ci0JaWYgKHBpbikgLyogY29ubmVjdCB0byBmcm9udCBhbmQgdXNlIGRhYyAwICovCi0JCWFsYzg2MXZkX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9IUCwgMCk7Ci0JcGluID0gc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF07Ci0JaWYgKHBpbikKLQkJYWxjODYxdmRfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIHBpbiwgUElOX09VVCwgMCk7Ci19Ci0KLSNkZWZpbmUgQUxDODYxVkRfUElOX0NEX05JRAkJQUxDODgwX1BJTl9DRF9OSUQKLQotc3RhdGljIHZvaWQgYWxjODYxdmRfYXV0b19pbml0X2FuYWxvZ19pbnB1dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgewotCQloZGFfbmlkX3QgbmlkID0gY2ZnLT5pbnB1dHNbaV0ucGluOwotCQlpZiAoYWxjX2lzX2lucHV0X3Bpbihjb2RlYywgbmlkKSkgewotCQkJYWxjX3NldF9pbnB1dF9waW4oY29kZWMsIG5pZCwgY2ZnLT5pbnB1dHNbaV0udHlwZSk7Ci0JCQlpZiAobmlkICE9IEFMQzg2MVZEX1BJTl9DRF9OSUQgJiYKLQkJCSAgICAoZ2V0X3djYXBzKGNvZGVjLCBuaWQpICYgQUNfV0NBUF9PVVRfQU1QKSkKLQkJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCi0JCQkJCQlBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAotCQkJCQkJQU1QX09VVF9NVVRFKTsKLQkJfQotCX0KLX0KLQotI2RlZmluZSBhbGM4NjF2ZF9hdXRvX2luaXRfaW5wdXRfc3JjCWFsYzg4Ml9hdXRvX2luaXRfaW5wdXRfc3JjCi0KLSNkZWZpbmUgYWxjODYxdmRfaWR4X3RvX21peGVyX3ZvbChuaWQpCQkoKG5pZCkgKyAweDAyKQotI2RlZmluZSBhbGM4NjF2ZF9pZHhfdG9fbWl4ZXJfc3dpdGNoKG5pZCkJKChuaWQpICsgMHgwYykKLQotLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZyb20gdGhlIHBhcnNlZCBEQUMgdGFibGUgKi8KLS8qIEJhc2VkIG9uIEFMQzg4MCB2ZXJzaW9uLiBCdXQgQUxDODYxVkQgaGFzIHNlcGFyYXRlLAotICogZGlmZmVyZW50IE5JRHMgZm9yIG11dGUvdW5tdXRlIHN3aXRjaCBhbmQgdm9sdW1lIGNvbnRyb2wgKi8KLXN0YXRpYyBpbnQgYWxjODYxdmRfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IGFsY19zcGVjICpzcGVjLAotCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNobmFtZVs0XSA9IHsKLQkJIkZyb250IiwgIlN1cnJvdW5kIiwgIkNMRkUiLCAiU2lkZSIKLQl9OwotCWNvbnN0IGNoYXIgKnBmeCA9IGFsY19nZXRfbGluZV9vdXRfcGZ4KHNwZWMsIHRydWUpOwotCWhkYV9uaWRfdCBuaWRfdiwgbmlkX3M7Ci0JaW50IGksIGVyciwgbm91dHB1dHM7Ci0KLQlub3V0cHV0cyA9IGNmZy0+bGluZV9vdXRzOwotCWlmIChzcGVjLT5tdWx0aV9pb3MgPiAwKQotCQlub3V0cHV0cyArPSBzcGVjLT5tdWx0aV9pb3M7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbm91dHB1dHM7IGkrKykgewotCQlpZiAoIXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldKQotCQkJY29udGludWU7Ci0JCW5pZF92ID0gYWxjODYxdmRfaWR4X3RvX21peGVyX3ZvbCgKLQkJCQlhbGM4ODBfZGFjX3RvX2lkeCgKLQkJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0pKTsKLQkJbmlkX3MgPSBhbGM4NjF2ZF9pZHhfdG9fbWl4ZXJfc3dpdGNoKAotCQkJCWFsYzg4MF9kYWNfdG9faWR4KAotCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSkpOwotCi0JCWlmICghcGZ4ICYmIGkgPT0gMikgewotCQkJLyogQ2VudGVyL0xGRSAqLwotCQkJZXJyID0gYWRkX3BiX3ZvbF9jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwKLQkJCQkJICAgICAgIkNlbnRlciIsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdiwgMSwgMCwKLQkJCQkJCQkgICAgICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gYWRkX3BiX3ZvbF9jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwKLQkJCQkJICAgICAgIkxGRSIsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdiwgMiwgMCwKLQkJCQkJCQkgICAgICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gYWRkX3BiX3N3X2N0cmwoc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsCi0JCQkJCSAgICAgIkNlbnRlciIsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfcywgMSwgMiwKLQkJCQkJCQkgICAgICBIREFfSU5QVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSBhZGRfcGJfc3dfY3RybChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwKLQkJCQkJICAgICAiTEZFIiwKLQkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9zLCAyLCAyLAotCQkJCQkJCSAgICAgIEhEQV9JTlBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIHsKLQkJCWNvbnN0IGNoYXIgKm5hbWUgPSBwZng7Ci0JCQlpbnQgaW5kZXggPSBpOwotCQkJaWYgKCFuYW1lKSB7Ci0JCQkJbmFtZSA9IGNobmFtZVtpXTsKLQkJCQlpbmRleCA9IDA7Ci0JCQl9Ci0JCQllcnIgPSBfX2FkZF9wYl92b2xfY3RybChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsCi0JCQkJCQluYW1lLCBpbmRleCwKLQkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAzLCAwLAotCQkJCQkJCSAgICAgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSBfX2FkZF9wYl9zd19jdHJsKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLAotCQkJCQkgICAgICAgbmFtZSwgaW5kZXgsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfcywgMywgMiwKLQkJCQkJCQkgICAgICBIREFfSU5QVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmb3Igc3BlYWtlciBhbmQgSFAgb3V0cHV0cyAqLwotLyogQmFzZWQgb24gQUxDODgwIHZlcnNpb24uIEJ1dCBBTEM4NjFWRCBoYXMgc2VwYXJhdGUsCi0gKiBkaWZmZXJlbnQgTklEcyBmb3IgbXV0ZS91bm11dGUgc3dpdGNoIGFuZCB2b2x1bWUgY29udHJvbCAqLwotc3RhdGljIGludCBhbGM4NjF2ZF9hdXRvX2NyZWF0ZV9leHRyYV9vdXQoc3RydWN0IGFsY19zcGVjICpzcGVjLAotCQkJCQloZGFfbmlkX3QgcGluLCBjb25zdCBjaGFyICpwZngpCi17Ci0JaGRhX25pZF90IG5pZF92LCBuaWRfczsKLQlpbnQgZXJyOwotCi0JaWYgKCFwaW4pCi0JCXJldHVybiAwOwotCi0JaWYgKGFsYzg4MF9pc19maXhlZF9waW4ocGluKSkgewotCQluaWRfdiA9IGFsYzg4MF9pZHhfdG9fZGFjKGFsYzg4MF9maXhlZF9waW5faWR4KHBpbikpOwotCQkvKiBzcGVjaWZ5IHRoZSBEQUMgYXMgdGhlIGV4dHJhIG91dHB1dCAqLwotCQlpZiAoIXNwZWMtPm11bHRpb3V0LmhwX25pZCkKLQkJCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IG5pZF92OwotCQllbHNlCi0JCQlzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdID0gbmlkX3Y7Ci0JCS8qIGNvbnRyb2wgSFAgdm9sdW1lL3N3aXRjaCBvbiB0aGUgb3V0cHV0IG1peGVyIGFtcCAqLwotCQluaWRfdiA9IGFsYzg2MXZkX2lkeF90b19taXhlcl92b2woCi0JCQkJYWxjODgwX2ZpeGVkX3Bpbl9pZHgocGluKSk7Ci0JCW5pZF9zID0gYWxjODYxdmRfaWR4X3RvX21peGVyX3N3aXRjaCgKLQkJCQlhbGM4ODBfZml4ZWRfcGluX2lkeChwaW4pKTsKLQotCQllcnIgPSBhZGRfcGJfdm9sX2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBwZngsCi0JCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAzLCAwLCBIREFfT1VUUFVUKSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gYWRkX3BiX3N3X2N0cmwoc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsIHBmeCwKLQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3MsIDMsIDIsIEhEQV9JTlBVVCkpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfSBlbHNlIGlmIChhbGM4ODBfaXNfbXVsdGlfcGluKHBpbikpIHsKLQkJLyogc2V0IG1hbnVhbCBjb25uZWN0aW9uICovCi0JCS8qIHdlIGhhdmUgb25seSBhIHN3aXRjaCBvbiBIUC1vdXQgUElOICovCi0JCWVyciA9IGFkZF9wYl9zd19jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIHBmeCwKLQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfT1VUUFVUKSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHBhcnNlIHRoZSBCSU9TIGNvbmZpZ3VyYXRpb24gYW5kIHNldCB1cCB0aGUgYWxjX3NwZWMKLSAqIHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIDAgaWYgdGhlIHByb3BlciBjb25maWcgaXMgbm90IGZvdW5kLAotICogb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCi0gKiBCYXNlZCBvbiBBTEM4ODAgdmVyc2lvbiAtIGhhZCB0byBjaGFuZ2UgaXQgdG8gb3ZlcnJpZGUKLSAqIGFsYzg4MF9hdXRvX2NyZWF0ZV9leHRyYV9vdXQgYW5kIGFsYzg4MF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyAqLwotc3RhdGljIGludCBhbGM4NjF2ZF9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgZXJyOwotCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODYxdmRfaWdub3JlW10gPSB7IDB4MWQsIDAgfTsKLQotCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAotCQkJCQkgICBhbGM4NjF2ZF9pZ25vcmUpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWlmICghc3BlYy0+YXV0b2NmZy5saW5lX291dHMpCi0JCXJldHVybiAwOyAvKiBjYW4ndCBmaW5kIHZhbGlkIEJJT1MgcGluIGNvbmZpZyAqLwotCi0JZXJyID0gYWxjODgwX2F1dG9fZmlsbF9kYWNfbmlkcyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gYWxjX2F1dG9fYWRkX211bHRpX2NoYW5uZWxfbW9kZShjb2RlYyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gYWxjODYxdmRfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsYzg2MXZkX2F1dG9fY3JlYXRlX2V4dHJhX291dChzcGVjLAotCQkJCQkgICAgIHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdLAotCQkJCQkgICAgICJTcGVha2VyIik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gYWxjODYxdmRfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHNwZWMsCi0JCQkJCSAgICAgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdLAotCQkJCQkgICAgICJIZWFkcGhvbmUiKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGM4NjF2ZF9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7Ci0KLQlhbGNfYXV0b19wYXJzZV9kaWdpdGFsKGNvZGVjKTsKLQotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlhZGRfbWl4ZXIoc3BlYywgc3BlYy0+a2N0bHMubGlzdCk7Ci0KLQlhZGRfdmVyYihzcGVjLCBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicyk7Ci0KLQlzcGVjLT5udW1fbXV4X2RlZnMgPSAxOwotCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07Ci0KLQllcnIgPSBhbGNfYXV0b19hZGRfbWljX2Jvb3N0KGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWFsY19zc2lkX2NoZWNrKGNvZGVjLCAweDE1LCAweDFiLCAweDE0LCAwKTsKLQotCXJldHVybiAxOwotfQotCi0vKiBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGZvciBhdXRvLWNvbmZpZ3VyYXRpb24gbW9kZWwgKi8KLXN0YXRpYyB2b2lkIGFsYzg2MXZkX2F1dG9faW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlhbGM4NjF2ZF9hdXRvX2luaXRfbXVsdGlfb3V0KGNvZGVjKTsKLQlhbGM4NjF2ZF9hdXRvX2luaXRfaHBfb3V0KGNvZGVjKTsKLQlhbGM4NjF2ZF9hdXRvX2luaXRfYW5hbG9nX2lucHV0KGNvZGVjKTsKLQlhbGM4NjF2ZF9hdXRvX2luaXRfaW5wdXRfc3JjKGNvZGVjKTsKLQlhbGNfYXV0b19pbml0X2RpZ2l0YWwoY29kZWMpOwotCWlmIChzcGVjLT51bnNvbF9ldmVudCkKLQkJYWxjX2luaXRob29rKGNvZGVjKTsKLX0KLQotZW51bSB7Ci0JQUxDNjYwVkRfRklYX0FTVVNfR1BJTzEKLX07Ci0KLS8qIHJlc2V0IEdQSU8xICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsY19maXh1cCBhbGM4NjF2ZF9maXh1cHNbXSA9IHsKLQlbQUxDNjYwVkRfRklYX0FTVVNfR1BJTzFdID0gewotCQkudHlwZSA9IEFMQ19GSVhVUF9WRVJCUywKLQkJLnYudmVyYnMgPSAoY29uc3Qgc3RydWN0IGhkYV92ZXJiW10pIHsKLQkJCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MDN9LAotCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDAxfSwKLQkJCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDF9LAotCQkJeyB9Ci0JCX0KLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzg2MXZkX2ZpeHVwX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMzksICJBU1VTIEE3LUsiLCBBTEM2NjBWRF9GSVhfQVNVU19HUElPMSksCi0Je30KLX07Ci0KLXN0YXRpYyBpbnQgcGF0Y2hfYWxjODYxdmQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjOwotCWludCBlcnIsIGJvYXJkX2NvbmZpZzsKLQotCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwotCWlmIChzcGVjID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY29kZWMtPnNwZWMgPSBzcGVjOwotCi0JYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFMQzg2MVZEX01PREVMX0xBU1QsCi0JCQkJCQkgIGFsYzg2MXZkX21vZGVscywKLQkJCQkJCSAgYWxjODYxdmRfY2ZnX3RibCk7Ci0KLQlpZiAoYm9hcmRfY29uZmlnIDwgMCB8fCBib2FyZF9jb25maWcgPj0gQUxDODYxVkRfTU9ERUxfTEFTVCkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJYm9hcmRfY29uZmlnID0gQUxDODYxVkRfQVVUTzsKLQl9Ci0KLQlpZiAoYm9hcmRfY29uZmlnID09IEFMQzg2MVZEX0FVVE8pIHsKLQkJYWxjX3BpY2tfZml4dXAoY29kZWMsIE5VTEwsIGFsYzg2MXZkX2ZpeHVwX3RibCwgYWxjODYxdmRfZml4dXBzKTsKLQkJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEM4NjFWRF9BVVRPKSB7Ci0JCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLwotCQllcnIgPSBhbGM4NjF2ZF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgaWYgKCFlcnIpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBiYXNlIG1vZGUuLi5cbiIpOwotCQkJYm9hcmRfY29uZmlnID0gQUxDODYxVkRfM1NUOwotCQl9Ci0JfQotCi0JZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MjMpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWFsY19mcmVlKGNvZGVjKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAoYm9hcmRfY29uZmlnICE9IEFMQzg2MVZEX0FVVE8pCi0JCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzg2MXZkX3ByZXNldHNbYm9hcmRfY29uZmlnXSk7Ci0KLQlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwNjYwKSB7Ci0JCS8qIGFsd2F5cyB0dXJuIG9uIEVBUEQgKi8KLQkJYWRkX3ZlcmIoc3BlYywgYWxjNjYwdmRfZWFwZF92ZXJicyk7Ci0JfQotCi0Jc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZhbGM4NjF2ZF9wY21fYW5hbG9nX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZhbGM4NjF2ZF9wY21fYW5hbG9nX2NhcHR1cmU7Ci0KLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZhbGM4NjF2ZF9wY21fZGlnaXRhbF9wbGF5YmFjazsKLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlID0gJmFsYzg2MXZkX3BjbV9kaWdpdGFsX2NhcHR1cmU7Ci0KLQlpZiAoIXNwZWMtPmFkY19uaWRzKSB7Ci0JCXNwZWMtPmFkY19uaWRzID0gYWxjODYxdmRfYWRjX25pZHM7Ci0JCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODYxdmRfYWRjX25pZHMpOworCQkJCQkgICAgQU1QX0lOX01VVEUoaSkpOwogCX0KLQlpZiAoIXNwZWMtPmNhcHNyY19uaWRzKQotCQlzcGVjLT5jYXBzcmNfbmlkcyA9IGFsYzg2MXZkX2NhcHNyY19uaWRzOwotCi0Jc2V0X2NhcHR1cmVfbWl4ZXIoY29kZWMpOwotCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwotCi0Jc3BlYy0+dm1hc3Rlcl9uaWQgPSAweDAyOwotCi0JYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BST0JFKTsKLQotCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOwotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEM4NjFWRF9BVVRPKQotCQlzcGVjLT5pbml0X2hvb2sgPSBhbGM4NjF2ZF9hdXRvX2luaXQ7Ci0Jc3BlYy0+c2h1dHVwID0gYWxjX2VhcGRfc2h1dHVwOwotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLQlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCi0JCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSBhbGM4NjF2ZF9sb29wYmFja3M7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQUxDNjYyIHN1cHBvcnQKLSAqCi0gKiBBTEM2NjIgaXMgYWxtb3N0IGlkZW50aWNhbCB3aXRoIEFMQzg4MCBidXQgaGFzIGNsZWFuZXIgYW5kIG1vcmUgZmxleGlibGUKLSAqIGNvbmZpZ3VyYXRpb24uICBFYWNoIHBpbiB3aWRnZXQgY2FuIGNob29zZSBhbnkgaW5wdXQgREFDcyBhbmQgYSBtaXhlci4KLSAqIEVhY2ggQURDIGlzIGNvbm5lY3RlZCBmcm9tIGEgbWl4ZXIgb2YgYWxsIGlucHV0cy4gIFRoaXMgbWFrZXMgcG9zc2libGUKLSAqIDYtY2hhbm5lbCBpbmRlcGVuZGVudCBjYXB0dXJlcy4KLSAqCi0gKiBJbiBhZGRpdGlvbiwgYW4gaW5kZXBlbmRlbnQgREFDIGZvciB0aGUgbXVsdGktcGxheWJhY2sgKG5vdCB1c2VkIGluIHRoaXMKLSAqIGRyaXZlciB5ZXQpLgotICovCi0jZGVmaW5lIEFMQzY2Ml9ESUdPVVRfTklECTB4MDYKLSNkZWZpbmUgQUxDNjYyX0RJR0lOX05JRAkweDBhCi0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjYyX2RhY19uaWRzWzNdID0gewotCS8qIGZyb250LCByZWFyLCBjbGZlICovCi0JMHgwMiwgMHgwMywgMHgwNAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNzJfZGFjX25pZHNbMl0gPSB7Ci0JMHgwMiwgMHgwMwotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM2NjJfYWRjX25pZHNbMl0gPSB7Ci0JLyogQURDMS0yICovCi0JMHgwOSwgMHgwOAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNzJfYWRjX25pZHNbMV0gPSB7Ci0JLyogQURDMS0yICovCi0JMHgwOCwKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjYyX2NhcHNyY19uaWRzWzJdID0geyAweDIyLCAweDIzIH07Ci1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI3Ml9jYXBzcmNfbmlkc1sxXSA9IHsgMHgyMyB9OwotCi0KLS8qIGlucHV0IE1VWCAqLwotLyogRklYTUU6IHNob3VsZCBiZSBhIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM2NjJfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDQsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzY2Ml9sZW5vdm9fMTAxZV9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMiwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MSB9LAotCQl7ICJMaW5lIiwgMHgyIH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM2NjNfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDMsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQl9LAotfTsKLQotI2lmIDAgLyogc2V0IHRvIDEgZm9yIHRlc3Rpbmcgb3RoZXIgaW5wdXQgc291cmNlcyBiZWxvdyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI3Ml9uYzEwX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAxNiwKLQkuaXRlbXMgPSB7Ci0JCXsgIkF1dG9zZWxlY3QgTWljIiwgMHgwIH0sCi0JCXsgIkludGVybmFsIE1pYyIsIDB4MSB9LAotCQl7ICJJbi0weDAyIiwgMHgyIH0sCi0JCXsgIkluLTB4MDMiLCAweDMgfSwKLQkJeyAiSW4tMHgwNCIsIDB4NCB9LAotCQl7ICJJbi0weDA1IiwgMHg1IH0sCi0JCXsgIkluLTB4MDYiLCAweDYgfSwKLQkJeyAiSW4tMHgwNyIsIDB4NyB9LAotCQl7ICJJbi0weDA4IiwgMHg4IH0sCi0JCXsgIkluLTB4MDkiLCAweDkgfSwKLQkJeyAiSW4tMHgwYSIsIDB4MGEgfSwKLQkJeyAiSW4tMHgwYiIsIDB4MGIgfSwKLQkJeyAiSW4tMHgwYyIsIDB4MGMgfSwKLQkJeyAiSW4tMHgwZCIsIDB4MGQgfSwKLQkJeyAiSW4tMHgwZSIsIDB4MGUgfSwKLQkJeyAiSW4tMHgwZiIsIDB4MGYgfSwKLQl9LAotfTsKLSNlbmRpZgotCi0vKgotICogMmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzY2Ml8zU1RfMmNoX21vZGVzWzFdID0gewotCXsgMiwgTlVMTCB9Ci19OwotCi0vKgotICogMmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfM1NUX2NoMl9pbml0W10gPSB7Ci0JeyAweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiA2Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml8zU1RfY2g2X2luaXRbXSA9IHsKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM2NjJfM1NUXzZjaF9tb2Rlc1syXSA9IHsKLQl7IDIsIGFsYzY2Ml8zU1RfY2gyX2luaXQgfSwKLQl7IDYsIGFsYzY2Ml8zU1RfY2g2X2luaXQgfSwKLX07Ci0KLS8qCi0gKiAyY2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9zaXhzdGFja19jaDZfaW5pdFtdID0gewotCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiA2Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9zaXhzdGFja19jaDhfaW5pdFtdID0gewotCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM2NjJfNXN0YWNrX21vZGVzWzJdID0gewotCXsgMiwgYWxjNjYyX3NpeHN0YWNrX2NoNl9pbml0IH0sCi0JeyA2LCBhbGM2NjJfc2l4c3RhY2tfY2g4X2luaXQgfSwKLX07Ci0KLS8qIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBSZWFyPTB4MTUsIENMRkU9MHgxNiwgU2lkZT0weDE3Ci0gKiAgICAgICAgICAgICAgICAgTWljPTB4MTgsIEZyb250IE1pYz0weDE5LCBMaW5lLUluPTB4MWEsIEhQPTB4MWIKLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2Jhc2VfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JLypJbnB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4YiwgMHg0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4YiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHhiLCAweDAxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfM1NUXzJjaF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml8zU1RfNmNoX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2xlbm92b18xMDFlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml9lZWVwY19wNzAxX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JQUxDMjYyX0hJUFBPX01BU1RFUl9TV0lUQ0gsCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2VlZXBjX2VwMjBfbWl4ZXJbXSA9IHsKLQlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIk11dGVDdHJsIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sID0gewotCS5vcHMgPSAmc25kX2hkYV9iaW5kX3ZvbCwKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDIsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDMsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM2NjNfYXN1c19vbmVfYmluZF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDIxLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYzX201MXZhX21peGVyW10gPSB7Ci0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzY2M19hc3VzX2JpbmRfbWFzdGVyX3ZvbCksCi0JSERBX0JJTkRfU1coIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAmYWxjNjYzX2FzdXNfb25lX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM2NjNfYXN1c190cmVlX2JpbmRfc3dpdGNoID0gewotCS5vcHMgPSAmc25kX2hkYV9iaW5kX3N3LAotCS52YWx1ZXMgPSB7Ci0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNSwgMywgMCwgSERBX09VVFBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgyMSwgMywgMCwgSERBX09VVFBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2M190d29faHBfbTFfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sKSwKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190cmVlX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkYtTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRi1NaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX2ZvdXJfYmluZF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE1LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYzX3R3b19ocF9tMl9taXhlcltdID0gewotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAotCUhEQV9CSU5EX1NXKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgJmFsYzY2M19hc3VzX2ZvdXJfYmluZF9zd2l0Y2gpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRi1NaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGLU1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml8xYmpkX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRi1NaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGLU1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX3R3b19iaW5kX21hc3Rlcl92b2wgPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfdm9sLAotCS52YWx1ZXMgPSB7Ci0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwMiwgMywgMCwgSERBX09VVFBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwNCwgMywgMCwgSERBX09VVFBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX3R3b19iaW5kX3N3aXRjaCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTQsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTYsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfYXN1c18yMWpkX2NsZmVfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLAotCQkJCSZhbGM2NjNfYXN1c190d29fYmluZF9tYXN0ZXJfdm9sKSwKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190d29fYmluZF9zd2l0Y2gpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgyMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfYXN1c18xNWpkX2NsZmVfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sKSwKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190d29fYmluZF9zd2l0Y2gpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfZzcxdl9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfZzUwdl9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgyMSwgMHgwLCBIREFfT1VUUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfbW9kZTdfOF9hbGxfYmluZF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE1LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE3LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDIxLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfbW9kZTdfOF9zcF9iaW5kX3N3aXRjaCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTQsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTcsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfbW9kZTdfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X2FsbF9iaW5kX3N3aXRjaCksCi0JSERBX0JJTkRfVk9MKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAotCUhEQV9CSU5EX1NXKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X3NwX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lMSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUyIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50TWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50TWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfbW9kZThfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X2FsbF9iaW5kX3N3aXRjaCksCi0JSERBX0JJTkRfVk9MKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAotCUhEQV9CSU5EX1NXKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X3NwX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lMSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUyIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfY2htb2RlX21peGVyW10gPSB7Ci0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKLQkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAotCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAotCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAotCX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfaW5pdF92ZXJic1tdID0gewotCS8qIEFEQzogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCS8qIEZyb250IFBpbjogb3V0cHV0IDAgKDB4MGMpICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCS8qIFJlYXIgUGluOiBvdXRwdXQgMSAoMHgwZCkgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JLyogQ0xGRSBQaW46IG91dHB1dCAyICgweDBlKSAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBNaWMgKHJlYXIpIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIExpbmUgSW4gcGluOiBpbnB1dCAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogTGluZS0yIEluOiBIZWFkcGhvbmUgb3V0cHV0IChvdXRwdXQgMCAtIDB4MGMpICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCi0JLyogRklYTUU6IHVzZSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCi0JLyogTWl4ZXIgZWxlbWVudHM6IDB4MTgsIDE5LCAxYSwgMWIsIDFjLCAxZCwgMTQsIDE1LCAxNiwgMTcsIDBiICovCi0JLyogSW5wdXQgbWl4ZXIgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lYXBkX2luaXRfdmVyYnNbXSA9IHsKLQkvKiBhbHdheXMgdHJ1biBvbiBFQVBEICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfc3VlX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTnxBTEM4ODBfRlJPTlRfRVZFTlR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQzg4MF9IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyX2VlZXBjX3N1ZV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0Je30KLX07Ci0KLS8qIFNldCBVbnNvbGljaXRlZCBFdmVudCovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lZWVwY19lcDIwX3N1ZV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19tNTF2YV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDkpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjNfMjFqZF9hbWljX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyXzFiamRfYW1pY19pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzXzE1amRfYW1pY19pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCS8qIEhlYWRwaG9uZSAqLwotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M190d29faHBfYW1pY19tMV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX3R3b19ocF9hbWljX20yX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19nNzF2X2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCS8qIHsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sICovCi0JLyogezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgKi8gLyogSGVhZHBob25lICovCi0KLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwJLyogSGVhZHBob25lICovCi0KLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTnxBTEM4ODBfRlJPTlRfRVZFTlR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQzg4MF9NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQzg4MF9IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX2c1MHZfaW5pdF92ZXJic1tdID0gewotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAkvKiBIZWFkcGhvbmUgKi8KLQotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lY3NfaW5pdF92ZXJic1tdID0gewotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMWZ9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjcyX2RlbGxfem0xX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDkpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNzJfZGVsbF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX21vZGU3X2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19tb2RlOF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjcyX2F1dG9fY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgdm9pZCBhbGM2NjJfbGVub3ZvXzEwMWVfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5kZXRlY3RfbGluZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbGluZXMgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgdm9pZCBhbGM2NjJfZWVlcGNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlhbGMyNjJfaGlwcG8xX3NldHVwKGNvZGVjKTsKLQlzcGVjLT5leHRfbWljLnBpbiA9IDB4MTg7Ci0Jc3BlYy0+ZXh0X21pYy5tdXhfaWR4ID0gMDsKLQlzcGVjLT5pbnRfbWljLnBpbiA9IDB4MTk7Ci0Jc3BlYy0+aW50X21pYy5tdXhfaWR4ID0gMTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzY2Ml9lZWVwY19lcDIwX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgdm9pZCBhbGM2NjNfbTUxdmFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgyMTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljLnBpbiA9IDB4MTg7Ci0Jc3BlYy0+ZXh0X21pYy5tdXhfaWR4ID0gMDsKLQlzcGVjLT5pbnRfbWljLnBpbiA9IDB4MTI7Ci0Jc3BlYy0+aW50X21pYy5tdXhfaWR4ID0gOTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqIE1vZGUxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFsYzY2M19tb2RlMV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDIxOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOwotCXNwZWMtPmV4dF9taWMucGluID0gMHgxODsKLQlzcGVjLT5leHRfbWljLm11eF9pZHggPSAwOwotCXNwZWMtPmludF9taWMucGluID0gMHgxOTsKLQlzcGVjLT5pbnRfbWljLm11eF9pZHggPSAxOwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotLyogKioqKioqKioqKioqKioqKiogTW9kZTIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWxjNjYyX21vZGUyX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLQlzcGVjLT5leHRfbWljLnBpbiA9IDB4MTg7Ci0Jc3BlYy0+ZXh0X21pYy5tdXhfaWR4ID0gMDsKLQlzcGVjLT5pbnRfbWljLnBpbiA9IDB4MTk7Ci0Jc3BlYy0+aW50X21pYy5tdXhfaWR4ID0gMTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqIE1vZGUzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFsYzY2M19tb2RlM19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDIxOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLQlzcGVjLT5leHRfbWljLnBpbiA9IDB4MTg7Ci0Jc3BlYy0+ZXh0X21pYy5tdXhfaWR4ID0gMDsKLQlzcGVjLT5pbnRfbWljLnBpbiA9IDB4MTk7Ci0Jc3BlYy0+aW50X21pYy5tdXhfaWR4ID0gMTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqIE1vZGU0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFsYzY2M19tb2RlNF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDIxOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTY7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMV0gPSAweDBlOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOwotCXNwZWMtPmV4dF9taWMucGluID0gMHgxODsKLQlzcGVjLT5leHRfbWljLm11eF9pZHggPSAwOwotCXNwZWMtPmludF9taWMucGluID0gMHgxOTsKLQlzcGVjLT5pbnRfbWljLm11eF9pZHggPSAxOwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotLyogKioqKioqKioqKioqKioqKiogTW9kZTUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWxjNjYzX21vZGU1X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFsxXSA9IDB4MGU7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pYy5waW4gPSAweDE4OwotCXNwZWMtPmV4dF9taWMubXV4X2lkeCA9IDA7Ci0Jc3BlYy0+aW50X21pYy5waW4gPSAweDE5OwotCXNwZWMtPmludF9taWMubXV4X2lkeCA9IDE7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKiBNb2RlNiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhbGM2NjNfbW9kZTZfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOwotCXNwZWMtPmV4dF9taWMucGluID0gMHgxODsKLQlzcGVjLT5leHRfbWljLm11eF9pZHggPSAwOwotCXNwZWMtPmludF9taWMucGluID0gMHgxOTsKLQlzcGVjLT5pbnRfbWljLm11eF9pZHggPSAxOwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotLyogKioqKioqKioqKioqKioqKiogTW9kZTcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWxjNjYzX21vZGU3X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgyMTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE3OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLQlzcGVjLT5leHRfbWljLnBpbiA9IDB4MTg7Ci0Jc3BlYy0+ZXh0X21pYy5tdXhfaWR4ID0gMDsKLQlzcGVjLT5pbnRfbWljLnBpbiA9IDB4MTk7Ci0Jc3BlYy0+aW50X21pYy5tdXhfaWR4ID0gMTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqIE1vZGU4ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFsYzY2M19tb2RlOF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDIxOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1sxXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci0Jc3BlYy0+ZXh0X21pYy5waW4gPSAweDE4OwotCXNwZWMtPmV4dF9taWMubXV4X2lkeCA9IDA7Ci0Jc3BlYy0+aW50X21pYy5waW4gPSAweDEyOwotCXNwZWMtPmludF9taWMubXV4X2lkeCA9IDk7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotfQotCi1zdGF0aWMgdm9pZCBhbGM2NjNfZzcxdl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDIxOwotCXNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLQlzcGVjLT5kZXRlY3RfbGluZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbGluZXMgPSAxOwotCXNwZWMtPmV4dF9taWMucGluID0gMHgxODsKLQlzcGVjLT5leHRfbWljLm11eF9pZHggPSAwOwotCXNwZWMtPmludF9taWMucGluID0gMHgxMjsKLQlzcGVjLT5pbnRfbWljLm11eF9pZHggPSA5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKIH0KIAotI2RlZmluZSBhbGM2NjNfZzUwdl9zZXR1cAlhbGM2NjNfbTUxdmFfc2V0dXAKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml9lY3NfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYy9MaW5lSW4gQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMvTGluZUluIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljL0xpbmVJbiBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNzJfbmMxMF9taXhlcltdID0gewotCS8qIE1hc3RlciBQbGF5YmFjayBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZnJvbSBTcGVha2VyIGFuZCBIZWFkcGhvbmUgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotI2RlZmluZSBhbGM2NjJfbG9vcGJhY2tzCWFsYzg4MF9sb29wYmFja3MKLSNlbmRpZgotCi0KLS8qIHBjbSBjb25maWd1cmF0aW9uOiBpZGVudGljYWwgd2l0aCBBTEM4ODAgKi8KLSNkZWZpbmUgYWxjNjYyX3BjbV9hbmFsb2dfcGxheWJhY2sJYWxjODgwX3BjbV9hbmFsb2dfcGxheWJhY2sKLSNkZWZpbmUgYWxjNjYyX3BjbV9hbmFsb2dfY2FwdHVyZQlhbGM4ODBfcGNtX2FuYWxvZ19jYXB0dXJlCi0jZGVmaW5lIGFsYzY2Ml9wY21fZGlnaXRhbF9wbGF5YmFjawlhbGM4ODBfcGNtX2RpZ2l0YWxfcGxheWJhY2sKLSNkZWZpbmUgYWxjNjYyX3BjbV9kaWdpdGFsX2NhcHR1cmUJYWxjODgwX3BjbV9kaWdpdGFsX2NhcHR1cmUKLQotLyoKLSAqIGNvbmZpZ3VyYXRpb24gYW5kIHByZXNldAotICovCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFsYzY2Ml9tb2RlbHNbQUxDNjYyX01PREVMX0xBU1RdID0gewotCVtBTEM2NjJfM1NUXzJjaF9ESUddCT0gIjNzdGFjay1kaWciLAotCVtBTEM2NjJfM1NUXzZjaF9ESUddCT0gIjNzdGFjay02Y2gtZGlnIiwKLQlbQUxDNjYyXzNTVF82Y2hdCT0gIjNzdGFjay02Y2giLAotCVtBTEM2NjJfNVNUX0RJR10JPSAiNXN0YWNrLWRpZyIsCi0JW0FMQzY2Ml9MRU5PVk9fMTAxRV0JPSAibGVub3ZvLTEwMWUiLAotCVtBTEM2NjJfQVNVU19FRUVQQ19QNzAxXSA9ICJlZWVwYy1wNzAxIiwKLQlbQUxDNjYyX0FTVVNfRUVFUENfRVAyMF0gPSAiZWVlcGMtZXAyMCIsCi0JW0FMQzY2Ml9FQ1NdID0gImVjcyIsCi0JW0FMQzY2M19BU1VTX001MVZBXSA9ICJtNTF2YSIsCi0JW0FMQzY2M19BU1VTX0c3MVZdID0gImc3MXYiLAotCVtBTEM2NjNfQVNVU19IMTNdID0gImgxMyIsCi0JW0FMQzY2M19BU1VTX0c1MFZdID0gImc1MHYiLAotCVtBTEM2NjNfQVNVU19NT0RFMV0gPSAiYXN1cy1tb2RlMSIsCi0JW0FMQzY2Ml9BU1VTX01PREUyXSA9ICJhc3VzLW1vZGUyIiwKLQlbQUxDNjYzX0FTVVNfTU9ERTNdID0gImFzdXMtbW9kZTMiLAotCVtBTEM2NjNfQVNVU19NT0RFNF0gPSAiYXN1cy1tb2RlNCIsCi0JW0FMQzY2M19BU1VTX01PREU1XSA9ICJhc3VzLW1vZGU1IiwKLQlbQUxDNjYzX0FTVVNfTU9ERTZdID0gImFzdXMtbW9kZTYiLAotCVtBTEM2NjNfQVNVU19NT0RFN10gPSAiYXN1cy1tb2RlNyIsCi0JW0FMQzY2M19BU1VTX01PREU4XSA9ICJhc3VzLW1vZGU4IiwKLQlbQUxDMjcyX0RFTExdCQk9ICJkZWxsIiwKLQlbQUxDMjcyX0RFTExfWk0xXQk9ICJkZWxsLXptMSIsCi0JW0FMQzI3Ml9TQU1TVU5HX05DMTBdCT0gInNhbXN1bmctbmMxMCIsCi0JW0FMQzY2Ml9BVVRPXQkJPSAiYXV0byIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjNjYyX2NmZ190YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHg5MDg3LCAiRUNTIiwgQUxDNjYyX0VDUyksCi0JU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDJkNiwgIkRFTEwiLCBBTEMyNzJfREVMTCksCi0JU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDJmNCwgIkRFTEwgWk0xIiwgQUxDMjcyX0RFTExfWk0xKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMDAwLCAiQVNVUyBONTBWbSIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMDkyLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREUzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTczLCAiQVNVUyBLNzNKbiIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWMzLCAiQVNVUyBNNzBWIiwgQUxDNjYzX0FTVVNfTU9ERTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExZDMsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExZjMsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyMDMsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMDMsICJBU1VTIEc2MEoiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzMywgIkFTVVMgRzYwSngiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOSwgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTNlMywgIkFTVVMgTjcxSkEiLCBBTEM2NjNfQVNVU19NT0RFNyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ2MywgIkFTVVMgTjcxIiwgQUxDNjYzX0FTVVNfTU9ERTcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE0ZDMsICJBU1VTIEc3MiIsIEFMQzY2M19BU1VTX01PREU4KSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNTYzLCAiQVNVUyBOOTAiLCBBTEM2NjNfQVNVU19NT0RFMyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVkMywgIkFTVVMgTjUwU0YgRjUwU0YiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTZjMywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTZmMywgIkFTVVMgSzQwQyBLNTBDIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3MzMsICJBU1VTIE44MURlIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NTMsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NjMsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTYpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NjUsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTYpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3ODMsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3OTMsICJBU1VTIEY1MEdYIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3YjMsICJBU1VTIEY3MFNMIiwgQUxDNjYzX0FTVVNfTU9ERTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3YzMsICJBU1VTIFVYMjAiLCBBTEM2NjNfQVNVU19NNTFWQSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTdmMywgIkFTVVMgWDU4TEUiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTgxMywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTgyMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFNSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTgzMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFNiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg0MywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg1MywgIkFTVVMgRjUwWiIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODY0LCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODc2LCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODc4LCAiQVNVUyBNNTFWQSIsIEFMQzY2M19BU1VTX001MVZBKSwKLQkvKlNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NzgsICJBU1VTIE01MFZyIiwgQUxDNjYzX0FTVVNfTU9ERTEpLCovCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg5MywgIkFTVVMgTTUwVm0iLCBBTEM2NjNfQVNVU19NT0RFMyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg5NCwgIkFTVVMgWDU1IiwgQUxDNjYzX0FTVVNfTU9ERTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4YjMsICJBU1VTIE44MFZjIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4YzMsICJBU1VTIFZYNSIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOGQzLCAiQVNVUyBOODFUZSIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOGYzLCAiQVNVUyBONTA1VHAiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTkwMywgIkFTVVMgRjVHTCIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTEzLCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTMzLCAiQVNVUyBGODBRIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5NDMsICJBU1VTIFZ4M1YiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk1MywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk2MywgIkFTVVMgWDcxQyIsIEFMQzY2M19BU1VTX01PREUzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTgzLCAiQVNVUyBONTA1MUEiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk5MywgIkFTVVMgTjIwIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5YTMsICJBU1VTIEc1MFYiLCBBTEM2NjNfQVNVU19HNTBWKSwKLQkvKlNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5YTMsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTEpLCovCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTliMywgIkFTVVMgRjdaIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5YzMsICJBU1VTIEY1Wi9GNngiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTlkMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NNTFWQSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTllMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTlmMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFNCksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODI5MCwgIkFTVVMgUDVHQy1NWCIsIEFMQzY2Ml8zU1RfNmNoX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODJhMSwgIkFTVVMgRWVlcGMiLCBBTEM2NjJfQVNVU19FRUVQQ19QNzAxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MmQxLCAiQVNVUyBFZWVwYyBFUDIwIiwgQUxDNjYyX0FTVVNfRUVFUENfRVAyMCksCi0JU05EX1BDSV9RVUlSSygweDEwNWIsIDB4MGNkNiwgIkZveGNvbm4iLCBBTEM2NjJfRUNTKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA1YiwgMHgwZDQ3LCAiRm94Y29ubiA0NUNNWC80NUdNWC80NUNNWC1LIiwKLQkJICAgICAgQUxDNjYyXzNTVF82Y2hfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjZlLCAiVG9zaGliYSBOQjIweCIsIEFMQzY2Ml9BVVRPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ0ZCwgMHhjYTAwLCAiU2Ftc3VuZyBOQzEwIiwgQUxDMjcyX1NBTVNVTkdfTkMxMCksCi0JU05EX1BDSV9RVUlSSygweDE0NTgsIDB4YTAwMiwgIkdpZ2FieXRlIDk0NUdDTS1TMkwiLAotCQkgICAgICBBTEM2NjJfM1NUXzZjaF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDIzMDQsICJRdWFudGEgV0gxIiwgQUxDNjYzX0FTVVNfSDEzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTU2NSwgMHg4MjBmLCAiQmlvc3RhciBUQTc4MEcgTTIrIiwgQUxDNjYyXzNTVF82Y2hfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTYzMSwgMHhjMTBjLCAiUEIgUlM2NSIsIEFMQzY2M19BU1VTX001MVZBKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgxMDFlLCAiTGVub3ZvIiwgQUxDNjYyX0xFTk9WT18xMDFFKSwKLQlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMHgzNjYyLCAiQVNST0NLIEsxME43OEZ1bGxIRC1oU0xJIFIzLjAiLAotCQkJCQlBTEM2NjJfM1NUXzZjaF9ESUcpLAotCVNORF9QQ0lfUVVJUktfTUFTSygweDE4NTQsIDB4ZjAwMCwgMHgyMDAwLCAiQVNVUyBIMTMtMjAweCIsCi0JCQkgICBBTEM2NjNfQVNVU19IMTMpLAotCVNORF9QQ0lfUVVJUksoMHgxOTkxLCAweDU2MjgsICJPcmRpc3NpbW8gRVZFIiwgQUxDNjYyX0xFTk9WT18xMDFFKSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfY29uZmlnX3ByZXNldCBhbGM2NjJfcHJlc2V0c1tdID0gewotCVtBTEM2NjJfM1NUXzJjaF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM2NjJfM1NUXzJjaF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsIGFsYzY2Ml9lYXBkX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkuZGlnX2luX25pZCA9IEFMQzY2Ml9ESUdJTl9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM2NjJfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDNjYyXzNTVF82Y2hfRElHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYyXzNTVF82Y2hfbWl4ZXIsIGFsYzY2Ml9jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLCBhbGM2NjJfZWFwZF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLmRpZ19pbl9uaWQgPSBBTEM2NjJfRElHSU5fTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF82Y2hfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM2NjJfM1NUXzZjaF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2Ml8zU1RfNmNoX21peGVyLCBhbGM2NjJfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywgYWxjNjYyX2VhcGRfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfNmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfNmNoX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLmlucHV0X211eCA9ICZhbGM2NjJfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDNjYyXzVTVF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM2NjJfYmFzZV9taXhlciwgYWxjNjYyX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsIGFsYzY2Ml9lYXBkX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkuZGlnX2luX25pZCA9IEFMQzY2Ml9ESUdJTl9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfNXN0YWNrX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml81c3RhY2tfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjNjYyX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzY2Ml9MRU5PVk9fMTAxRV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2Ml9sZW5vdm9fMTAxZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfc3VlX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM2NjJfbGVub3ZvXzEwMWVfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2Ml9sZW5vdm9fMTAxZV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjJfQVNVU19FRUVQQ19QNzAxXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYyX2VlZXBjX3A3MDFfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VlZXBjX3N1ZV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2Ml9lZWVwY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjJfQVNVU19FRUVQQ19FUDIwXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYyX2VlZXBjX2VwMjBfbWl4ZXIsCi0JCQkgICAgYWxjNjYyX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWVlcGNfZXAyMF9zdWVfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfNmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfNmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9sZW5vdm9fMTAxZV9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYyX2VlZXBjX2VwMjBfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYyX0VDU10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2Ml9lY3NfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2Vjc19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2Ml9lZWVwY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjNfQVNVU19NNTFWQV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19tNTF2YV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjNfbTUxdmFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX201MXZhX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX0c3MVZdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjNfZzcxdl9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjNfZzcxdl9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfZzcxdl9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjNfQVNVU19IMTNdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjNfbTUxdmFfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYzX201MXZhX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnNldHVwID0gYWxjNjYzX201MXZhX3NldHVwLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX0c1MFZdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjNfZzUwdl9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjNfZzUwdl9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfNmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfNmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzY2M19jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX2c1MHZfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfTU9ERTFdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjNfbTUxdmFfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M18yMWpkX2FtaWNfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2M19tb2RlMV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjJfQVNVU19NT0RFMl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2Ml8xYmpkX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfMWJqZF9hbWljX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2Ml9tb2RlMl9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjNfQVNVU19NT0RFM10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M190d29faHBfbTFfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M190d29faHBfYW1pY19tMV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX21vZGUzX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX01PREU0XSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX2FzdXNfMjFqZF9jbGZlX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjNfMjFqZF9hbWljX2luaXRfdmVyYnN9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2M19tb2RlNF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjNfQVNVU19NT0RFNV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19hc3VzXzE1amRfY2xmZV9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYzXzE1amRfYW1pY19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX21vZGU1X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX01PREU2XSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX3R3b19ocF9tMl9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYzX3R3b19ocF9hbWljX20yX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTZfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfTU9ERTddID0gewotCQkubWl4ZXJzID0geyBhbGM2NjNfbW9kZTdfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M19tb2RlN19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX21vZGU3X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX01PREU4XSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX21vZGU4X21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjNfbW9kZThfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2M19tb2RlOF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNzJfREVMTF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19tNTF2YV9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjMjcyX2F1dG9fY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjMjcyX2RlbGxfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI3Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI3Ml9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmFkY19uaWRzID0gYWxjMjcyX2FkY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNzJfYWRjX25pZHMpLAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNzJfY2Fwc3JjX25pZHMsCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX201MXZhX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI3Ml9ERUxMX1pNMV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19tNTF2YV9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjMjcyX2RlbGxfem0xX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNzJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNzJfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5hZGNfbmlkcyA9IGFsYzY2Ml9hZGNfbmlkcywKLQkJLm51bV9hZGNfbmlkcyA9IDEsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzY2Ml9jYXBzcmNfbmlkcywKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbTUxdmFfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjcyX1NBTVNVTkdfTkMxMF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI3Ml9uYzEwX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M18yMWpkX2FtaWNfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI3Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI3Ml9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkvKi5pbnB1dF9tdXggPSAmYWxjMjcyX25jMTBfY2FwdHVyZV9zb3VyY2UsKi8KLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX21vZGU0X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi19OwotCi0KLS8qCi0gKiBCSU9TIGF1dG8gY29uZmlndXJhdGlvbgotICovCi0KIC8qIGNvbnZlcnQgZnJvbSBNSVggbmlkIHRvIERBQyAqLwogc3RhdGljIGhkYV9uaWRfdCBhbGNfYXV0b19taXhfdG9fZGFjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQogewogCWhkYV9uaWRfdCBsaXN0WzVdOwogCWludCBpLCBudW07CiAKKwlpZiAoZ2V0X3djYXBzX3R5cGUoZ2V0X3djYXBzKGNvZGVjLCBuaWQpKSA9PSBBQ19XSURfQVVEX09VVCkKKwkJcmV0dXJuIG5pZDsKIAludW0gPSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyhjb2RlYywgbmlkLCBsaXN0LCBBUlJBWV9TSVpFKGxpc3QpKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJaWYgKGdldF93Y2Fwc190eXBlKGdldF93Y2Fwcyhjb2RlYywgbGlzdFtpXSkpID09IEFDX1dJRF9BVURfT1VUKQpAQCAtMTg5NTQsNyArMjc2Myw3IEBACiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaGRhX25pZF90IHNyY3NbNV07Ci0JaW50IGksIGosIG51bTsKKwlpbnQgaSwgbnVtOwogCiAJcGluID0gYWxjX2dvX2Rvd25fdG9fc2VsZWN0b3IoY29kZWMsIHBpbik7CiAJbnVtID0gc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsIHBpbiwgc3JjcywgQVJSQVlfU0laRShzcmNzKSk7CkBAIC0xODk2Miw2NiArMjc3MSwxNjEgQEAKIAkJaGRhX25pZF90IG5pZCA9IGFsY19hdXRvX21peF90b19kYWMoY29kZWMsIHNyY3NbaV0pOwogCQlpZiAoIW5pZCkKIAkJCWNvbnRpbnVlOwotCQlmb3IgKGogPSAwOyBqIDwgc3BlYy0+bXVsdGlvdXQubnVtX2RhY3M7IGorKykKLQkJCWlmIChzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tqXSA9PSBuaWQpCi0JCQkJYnJlYWs7Ci0JCWlmIChqID49IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzKQotCQkJcmV0dXJuIG5pZDsKKwkJaWYgKGZvdW5kX2luX25pZF9saXN0KG5pZCwgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMsCisJCQkJICAgICAgc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MpKQorCQkJY29udGludWU7CisJCWlmIChzcGVjLT5tdWx0aW91dC5ocF9uaWQgPT0gbmlkKQorCQkJY29udGludWU7CisJCWlmIChmb3VuZF9pbl9uaWRfbGlzdChuaWQsIHNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWQsCisJCQkJICAgICAgQVJSQVlfU0laRShzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkKSkpCisJCSAgICBjb250aW51ZTsKKwkJcmV0dXJuIG5pZDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBoZGFfbmlkX3QgZ2V0X2RhY19pZl9zaW5nbGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW4pCit7CisJaGRhX25pZF90IHNlbCA9IGFsY19nb19kb3duX3RvX3NlbGVjdG9yKGNvZGVjLCBwaW4pOworCWlmIChzbmRfaGRhX2dldF9jb25uX2xpc3QoY29kZWMsIHNlbCwgTlVMTCkgPT0gMSkKKwkJcmV0dXJuIGFsY19hdXRvX2xvb2tfZm9yX2RhYyhjb2RlYywgcGluKTsKKwlyZXR1cm4gMDsKK30KKwogLyogZmlsbCBpbiB0aGUgZGFjX25pZHMgdGFibGUgZnJvbSB0aGUgcGFyc2VkIHBpbiBjb25maWd1cmF0aW9uICovCi1zdGF0aWMgaW50IGFsYzY2Ml9hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCitzdGF0aWMgaW50IGFsY19hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CisJYm9vbCByZWRvbmUgPSBmYWxzZTsKIAlpbnQgaTsKLQloZGFfbmlkX3QgZGFjOwogCisgYWdhaW46CisJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSAwOworCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IDA7CisJc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZFswXSA9IDA7CisJbWVtc2V0KHNwZWMtPnByaXZhdGVfZGFjX25pZHMsIDAsIHNpemVvZihzcGVjLT5wcml2YXRlX2RhY19uaWRzKSk7CiAJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5wcml2YXRlX2RhY19uaWRzOwotCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7Ci0JCWRhYyA9IGFsY19hdXRvX2xvb2tfZm9yX2RhYyhjb2RlYywgY2ZnLT5saW5lX291dF9waW5zW2ldKTsKLQkJaWYgKCFkYWMpCi0JCQljb250aW51ZTsKLQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tzcGVjLT5tdWx0aW91dC5udW1fZGFjcysrXSA9IGRhYzsKKworCS8qIGZpbGwgaGFyZC13aXJlZCBEQUNzIGZpcnN0ICovCisJaWYgKCFyZWRvbmUpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNmZy0+bGluZV9vdXRzOyBpKyspCisJCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldID0KKwkJCQlnZXRfZGFjX2lmX3NpbmdsZShjb2RlYywgY2ZnLT5saW5lX291dF9waW5zW2ldKTsKKwkJaWYgKGNmZy0+aHBfb3V0cykKKwkJCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9CisJCQkJZ2V0X2RhY19pZl9zaW5nbGUoY29kZWMsIGNmZy0+aHBfcGluc1swXSk7CisJCWlmIChjZmctPnNwZWFrZXJfb3V0cykKKwkJCXNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0gPQorCQkJCWdldF9kYWNfaWZfc2luZ2xlKGNvZGVjLCBjZmctPnNwZWFrZXJfcGluc1swXSk7CiAJfQorCisJZm9yIChpID0gMDsgaSA8IGNmZy0+bGluZV9vdXRzOyBpKyspIHsKKwkJaGRhX25pZF90IHBpbiA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKKwkJaWYgKHNwZWMtPnByaXZhdGVfZGFjX25pZHNbaV0pCisJCQljb250aW51ZTsKKwkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IGFsY19hdXRvX2xvb2tfZm9yX2RhYyhjb2RlYywgcGluKTsKKwkJaWYgKCFzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldICYmICFyZWRvbmUpIHsKKwkJCS8qIGlmIHdlIGNhbid0IGZpbmQgcHJpbWFyeSBEQUNzLCByZS1wcm9iZSB3aXRob3V0CisJCQkgKiBjaGVja2luZyB0aGUgaGFyZC13aXJlZCBEQUNzCisJCQkgKi8KKwkJCXJlZG9uZSA9IHRydWU7CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNmZy0+bGluZV9vdXRzOyBpKyspIHsKKwkJaWYgKHNwZWMtPnByaXZhdGVfZGFjX25pZHNbaV0pCisJCQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcysrOworCQllbHNlCisJCQltZW1tb3ZlKHNwZWMtPnByaXZhdGVfZGFjX25pZHMgKyBpLAorCQkJCXNwZWMtPnByaXZhdGVfZGFjX25pZHMgKyBpICsgMSwKKwkJCQlzaXplb2YoaGRhX25pZF90KSAqIChjZmctPmxpbmVfb3V0cyAtIGkgLSAxKSk7CisJfQorCisJaWYgKGNmZy0+aHBfb3V0cyAmJiAhc3BlYy0+bXVsdGlvdXQuaHBfbmlkKQorCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPQorCQkJYWxjX2F1dG9fbG9va19mb3JfZGFjKGNvZGVjLCBjZmctPmhwX3BpbnNbMF0pOworCWlmIChjZmctPnNwZWFrZXJfb3V0cyAmJiAhc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZFswXSkKKwkJc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZFswXSA9CisJCQlhbGNfYXV0b19sb29rX2Zvcl9kYWMoY29kZWMsIGNmZy0+c3BlYWtlcl9waW5zWzBdKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX2FsYzY2Ml9hZGRfdm9sX2N0bChzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsIGNvbnN0IGNoYXIgKnBmeCwKLQkJCQkgICAgICAgaGRhX25pZF90IG5pZCwgaW50IGlkeCwgdW5zaWduZWQgaW50IGNocykKK3N0YXRpYyBpbnQgYWxjX2F1dG9fYWRkX3ZvbF9jdGwoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkgICAgICBjb25zdCBjaGFyICpwZngsIGludCBjaWR4LAorCQkJICAgICAgaGRhX25pZF90IG5pZCwgdW5zaWduZWQgaW50IGNocykKIHsKLQlyZXR1cm4gX19hZGRfcGJfdm9sX2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBwZngsIGlkeCwKLQkJCSAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCBjaHMsIDAsIEhEQV9PVVRQVVQpKTsKKwlpZiAoIW5pZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIF9fYWRkX3BiX3ZvbF9jdHJsKGNvZGVjLT5zcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIHBmeCwgY2lkeCwKKwkJCQkgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIGNocywgMCwgSERBX09VVFBVVCkpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX2FsYzY2Ml9hZGRfc3dfY3RsKHN0cnVjdCBhbGNfc3BlYyAqc3BlYywgY29uc3QgY2hhciAqcGZ4LAotCQkJCSAgICAgIGhkYV9uaWRfdCBuaWQsIGludCBpZHgsIHVuc2lnbmVkIGludCBjaHMpCisjZGVmaW5lIGFsY19hdXRvX2FkZF9zdGVyZW9fdm9sKGNvZGVjLCBwZngsIGNpZHgsIG5pZCkJXAorCWFsY19hdXRvX2FkZF92b2xfY3RsKGNvZGVjLCBwZngsIGNpZHgsIG5pZCwgMykKKworLyogY3JlYXRlIGEgbXV0ZS1zd2l0Y2ggZm9yIHRoZSBnaXZlbiBtaXhlciB3aWRnZXQ7CisgKiBpZiBpdCBoYXMgbXVsdGlwbGUgc291cmNlcyAoZS5nLiBEQUMgYW5kIGxvb3BiYWNrKSwgY3JlYXRlIGEgYmluZC1tdXRlCisgKi8KK3N0YXRpYyBpbnQgYWxjX2F1dG9fYWRkX3N3X2N0bChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICAgY29uc3QgY2hhciAqcGZ4LCBpbnQgY2lkeCwKKwkJCSAgICAgaGRhX25pZF90IG5pZCwgdW5zaWduZWQgaW50IGNocykKIHsKLQlyZXR1cm4gX19hZGRfcGJfc3dfY3RybChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBwZngsIGlkeCwKLQkJCSAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCBjaHMsIDAsIEhEQV9JTlBVVCkpOworCWludCB3aWRfdHlwZTsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpZiAoIW5pZCkKKwkJcmV0dXJuIDA7CisJd2lkX3R5cGUgPSBnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpOworCWlmICh3aWRfdHlwZSA9PSBBQ19XSURfUElOIHx8IHdpZF90eXBlID09IEFDX1dJRF9BVURfT1VUKSB7CisJCXR5cGUgPSBBTENfQ1RMX1dJREdFVF9NVVRFOworCQl2YWwgPSBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgY2hzLCAwLCBIREFfT1VUUFVUKTsKKwl9IGVsc2UgaWYgKHNuZF9oZGFfZ2V0X2Nvbm5fbGlzdChjb2RlYywgbmlkLCBOVUxMKSA9PSAxKSB7CisJCXR5cGUgPSBBTENfQ1RMX1dJREdFVF9NVVRFOworCQl2YWwgPSBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgY2hzLCAwLCBIREFfSU5QVVQpOworCX0gZWxzZSB7CisJCXR5cGUgPSBBTENfQ1RMX0JJTkRfTVVURTsKKwkJdmFsID0gSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIGNocywgMiwgSERBX0lOUFVUKTsKKwl9CisJcmV0dXJuIF9fYWRkX3BiX3N3X2N0cmwoY29kZWMtPnNwZWMsIHR5cGUsIHBmeCwgY2lkeCwgdmFsKTsKIH0KIAotI2RlZmluZSBhbGM2NjJfYWRkX3ZvbF9jdGwoc3BlYywgcGZ4LCBuaWQsIGNocykgXAotCV9fYWxjNjYyX2FkZF92b2xfY3RsKHNwZWMsIHBmeCwgbmlkLCAwLCBjaHMpCi0jZGVmaW5lIGFsYzY2Ml9hZGRfc3dfY3RsKHNwZWMsIHBmeCwgbmlkLCBjaHMpIFwKLQlfX2FsYzY2Ml9hZGRfc3dfY3RsKHNwZWMsIHBmeCwgbmlkLCAwLCBjaHMpCi0jZGVmaW5lIGFsYzY2Ml9hZGRfc3RlcmVvX3ZvbChzcGVjLCBwZngsIG5pZCkgXAotCWFsYzY2Ml9hZGRfdm9sX2N0bChzcGVjLCBwZngsIG5pZCwgMykKLSNkZWZpbmUgYWxjNjYyX2FkZF9zdGVyZW9fc3coc3BlYywgcGZ4LCBuaWQpIFwKLQlhbGM2NjJfYWRkX3N3X2N0bChzcGVjLCBwZngsIG5pZCwgMykKKyNkZWZpbmUgYWxjX2F1dG9fYWRkX3N0ZXJlb19zdyhjb2RlYywgcGZ4LCBjaWR4LCBuaWQpCVwKKwlhbGNfYXV0b19hZGRfc3dfY3RsKGNvZGVjLCBwZngsIGNpZHgsIG5pZCwgMykKKworc3RhdGljIGhkYV9uaWRfdCBhbGNfbG9va19mb3Jfb3V0X211dGVfbmlkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICBoZGFfbmlkX3QgcGluLCBoZGFfbmlkX3QgZGFjKQoreworCWhkYV9uaWRfdCBtaXggPSBhbGNfYXV0b19kYWNfdG9fbWl4KGNvZGVjLCBwaW4sIGRhYyk7CisJaWYgKG5pZF9oYXNfbXV0ZShjb2RlYywgcGluLCBIREFfT1VUUFVUKSkKKwkJcmV0dXJuIHBpbjsKKwllbHNlIGlmIChtaXggJiYgbmlkX2hhc19tdXRlKGNvZGVjLCBtaXgsIEhEQV9JTlBVVCkpCisJCXJldHVybiBtaXg7CisJZWxzZSBpZiAobmlkX2hhc19tdXRlKGNvZGVjLCBkYWMsIEhEQV9PVVRQVVQpKQorCQlyZXR1cm4gZGFjOworCXJldHVybiAwOworfQorCitzdGF0aWMgaGRhX25pZF90IGFsY19sb29rX2Zvcl9vdXRfdm9sX25pZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICBoZGFfbmlkX3QgcGluLCBoZGFfbmlkX3QgZGFjKQoreworCWhkYV9uaWRfdCBtaXggPSBhbGNfYXV0b19kYWNfdG9fbWl4KGNvZGVjLCBwaW4sIGRhYyk7CisJaWYgKG5pZF9oYXNfdm9sdW1lKGNvZGVjLCBkYWMsIEhEQV9PVVRQVVQpKQorCQlyZXR1cm4gZGFjOworCWVsc2UgaWYgKG5pZF9oYXNfdm9sdW1lKGNvZGVjLCBtaXgsIEhEQV9PVVRQVVQpKQorCQlyZXR1cm4gbWl4OworCWVsc2UgaWYgKG5pZF9oYXNfdm9sdW1lKGNvZGVjLCBwaW4sIEhEQV9PVVRQVVQpKQorCQlyZXR1cm4gcGluOworCXJldHVybiAwOworfQogCiAvKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZnJvbSB0aGUgcGFyc2VkIERBQyB0YWJsZSAqLwotc3RhdGljIGludCBhbGM2NjJfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCitzdGF0aWMgaW50IGFsY19hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjaG5hbWVbNF0gPSB7Ci0JCSJGcm9udCIsICJTdXJyb3VuZCIsIE5VTEwgLypDTEZFKi8sICJTaWRlIgotCX07Ci0JY29uc3QgY2hhciAqcGZ4ID0gYWxjX2dldF9saW5lX291dF9wZngoc3BlYywgdHJ1ZSk7Ci0JaGRhX25pZF90IG5pZCwgbWl4LCBwaW47CiAJaW50IGksIGVyciwgbm91dHB1dHM7CiAKIAlub3V0cHV0cyA9IGNmZy0+bGluZV9vdXRzOwpAQCAtMTkwMjksNDEgKzI5MzMsNDEgQEAKIAkJbm91dHB1dHMgKz0gc3BlYy0+bXVsdGlfaW9zOwogCiAJZm9yIChpID0gMDsgaSA8IG5vdXRwdXRzOyBpKyspIHsKLQkJbmlkID0gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV07Ci0JCWlmICghbmlkKQorCQljb25zdCBjaGFyICpuYW1lOworCQlpbnQgaW5kZXg7CisJCWhkYV9uaWRfdCBkYWMsIHBpbjsKKwkJaGRhX25pZF90IHN3LCB2b2w7CisKKwkJZGFjID0gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV07CisJCWlmICghZGFjKQogCQkJY29udGludWU7CiAJCWlmIChpID49IGNmZy0+bGluZV9vdXRzKQogCQkJcGluID0gc3BlYy0+bXVsdGlfaW9baSAtIDFdLnBpbjsKIAkJZWxzZQogCQkJcGluID0gY2ZnLT5saW5lX291dF9waW5zW2ldOwotCQltaXggPSBhbGNfYXV0b19kYWNfdG9fbWl4KGNvZGVjLCBwaW4sIG5pZCk7Ci0JCWlmICghbWl4KQotCQkJY29udGludWU7Ci0JCWlmICghcGZ4ICYmIGkgPT0gMikgeworCisJCXN3ID0gYWxjX2xvb2tfZm9yX291dF9tdXRlX25pZChjb2RlYywgcGluLCBkYWMpOworCQl2b2wgPSBhbGNfbG9va19mb3Jfb3V0X3ZvbF9uaWQoY29kZWMsIHBpbiwgZGFjKTsKKwkJbmFtZSA9IGFsY19nZXRfbGluZV9vdXRfcGZ4KHNwZWMsIGksIHRydWUsICZpbmRleCk7CisJCWlmICghbmFtZSkgewogCQkJLyogQ2VudGVyL0xGRSAqLwotCQkJZXJyID0gYWxjNjYyX2FkZF92b2xfY3RsKHNwZWMsICJDZW50ZXIiLCBuaWQsIDEpOworCQkJZXJyID0gYWxjX2F1dG9fYWRkX3ZvbF9jdGwoY29kZWMsICJDZW50ZXIiLCAwLCB2b2wsIDEpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IGFsYzY2Ml9hZGRfdm9sX2N0bChzcGVjLCAiTEZFIiwgbmlkLCAyKTsKKwkJCWVyciA9IGFsY19hdXRvX2FkZF92b2xfY3RsKGNvZGVjLCAiTEZFIiwgMCwgdm9sLCAyKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSBhbGM2NjJfYWRkX3N3X2N0bChzcGVjLCAiQ2VudGVyIiwgbWl4LCAxKTsKKwkJCWVyciA9IGFsY19hdXRvX2FkZF9zd19jdGwoY29kZWMsICJDZW50ZXIiLCAwLCBzdywgMSk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gYWxjNjYyX2FkZF9zd19jdGwoc3BlYywgIkxGRSIsIG1peCwgMik7CisJCQllcnIgPSBhbGNfYXV0b19hZGRfc3dfY3RsKGNvZGVjLCAiTEZFIiwgMCwgc3csIDIpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJfSBlbHNlIHsKLQkJCWNvbnN0IGNoYXIgKm5hbWUgPSBwZng7Ci0JCQlpbnQgaW5kZXggPSBpOwotCQkJaWYgKCFuYW1lKSB7Ci0JCQkJbmFtZSA9IGNobmFtZVtpXTsKLQkJCQlpbmRleCA9IDA7Ci0JCQl9Ci0JCQllcnIgPSBfX2FsYzY2Ml9hZGRfdm9sX2N0bChzcGVjLCBuYW1lLCBuaWQsIGluZGV4LCAzKTsKKwkJCWVyciA9IGFsY19hdXRvX2FkZF9zdGVyZW9fdm9sKGNvZGVjLCBuYW1lLCBpbmRleCwgdm9sKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSBfX2FsYzY2Ml9hZGRfc3dfY3RsKHNwZWMsIG5hbWUsIG1peCwgaW5kZXgsIDMpOworCQkJZXJyID0gYWxjX2F1dG9fYWRkX3N0ZXJlb19zdyhjb2RlYywgbmFtZSwgaW5kZXgsIHN3KTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTE5MDcyLDE4ICsyOTc2LDE2IEBACiB9CiAKIC8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmb3Igc3BlYWtlciBhbmQgSFAgb3V0cHV0cyAqLwotLyogcmV0dXJuIERBQyBuaWQgaWYgYW55IG5ldyBEQUMgaXMgYXNzaWduZWQgKi8KLXN0YXRpYyBpbnQgYWxjNjYyX2F1dG9fY3JlYXRlX2V4dHJhX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbiwKLQkJCQkJY29uc3QgY2hhciAqcGZ4KQorc3RhdGljIGludCBhbGNfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgcGluLAorCQkJCQloZGFfbmlkX3QgZGFjLCBjb25zdCBjaGFyICpwZngpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaGRhX25pZF90IG5pZCwgbWl4OworCWhkYV9uaWRfdCBzdywgdm9sOwogCWludCBlcnI7CiAKIAlpZiAoIXBpbikKIAkJcmV0dXJuIDA7Ci0JbmlkID0gYWxjX2F1dG9fbG9va19mb3JfZGFjKGNvZGVjLCBwaW4pOwotCWlmICghbmlkKSB7CisJaWYgKCFkYWMpIHsKIAkJLyogdGhlIGNvcnJlc3BvbmRpbmcgREFDIGlzIGFscmVhZHkgb2NjdXBpZWQgKi8KIAkJaWYgKCEoZ2V0X3djYXBzKGNvZGVjLCBwaW4pICYgQUNfV0NBUF9PVVRfQU1QKSkKIAkJCXJldHVybiAwOyAvKiBubyB3YXkgKi8KQEAgLTE5MDkyLDUwICsyOTk0LDcxIEBACiAJCQkJICAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKIAl9CiAKLQltaXggPSBhbGNfYXV0b19kYWNfdG9fbWl4KGNvZGVjLCBwaW4sIG5pZCk7Ci0JaWYgKCFtaXgpCi0JCXJldHVybiAwOwotCWVyciA9IGFsYzY2Ml9hZGRfdm9sX2N0bChzcGVjLCBwZngsIG5pZCwgMyk7CisJc3cgPSBhbGNfbG9va19mb3Jfb3V0X211dGVfbmlkKGNvZGVjLCBwaW4sIGRhYyk7CisJdm9sID0gYWxjX2xvb2tfZm9yX291dF92b2xfbmlkKGNvZGVjLCBwaW4sIGRhYyk7CisJZXJyID0gYWxjX2F1dG9fYWRkX3N0ZXJlb192b2woY29kZWMsIHBmeCwgMCwgdm9sKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGM2NjJfYWRkX3N3X2N0bChzcGVjLCBwZngsIG1peCwgMyk7CisJZXJyID0gYWxjX2F1dG9fYWRkX3N0ZXJlb19zdyhjb2RlYywgcGZ4LCAwLCBzdyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JcmV0dXJuIG5pZDsKKwlyZXR1cm4gMDsKIH0KIAotLyogY3JlYXRlIHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIGlucHV0IHBpbnMgKi8KLSNkZWZpbmUgYWxjNjYyX2F1dG9fY3JlYXRlX2lucHV0X2N0bHMgXAotCWFsYzg4Ml9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzCitzdGF0aWMgaW50IGFsY19hdXRvX2NyZWF0ZV9ocF9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIGFsY19hdXRvX2NyZWF0ZV9leHRyYV9vdXQoY29kZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwKKwkJCQkJIHNwZWMtPm11bHRpb3V0LmhwX25pZCwKKwkJCQkJICJIZWFkcGhvbmUiKTsKK30KIAotc3RhdGljIHZvaWQgYWxjNjYyX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgICBoZGFfbmlkX3QgbmlkLCBpbnQgcGluX3R5cGUsCitzdGF0aWMgaW50IGFsY19hdXRvX2NyZWF0ZV9zcGVha2VyX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gYWxjX2F1dG9fY3JlYXRlX2V4dHJhX291dChjb2RlYywgc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0sCisJCQkJCSBzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdLAorCQkJCQkgIlNwZWFrZXIiKTsKK30KKworc3RhdGljIHZvaWQgYWxjX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICAgICBoZGFfbmlkX3QgcGluLCBpbnQgcGluX3R5cGUsCiAJCQkJCSAgICAgIGhkYV9uaWRfdCBkYWMpCiB7CiAJaW50IGksIG51bTsKKwloZGFfbmlkX3QgbmlkLCBtaXggPSAwOwogCWhkYV9uaWRfdCBzcmNzW0hEQV9NQVhfQ09OTkVDVElPTlNdOwogCi0JYWxjX3NldF9waW5fb3V0cHV0KGNvZGVjLCBuaWQsIHBpbl90eXBlKTsKKwlhbGNfc2V0X3Bpbl9vdXRwdXQoY29kZWMsIHBpbiwgcGluX3R5cGUpOworCW5pZCA9IGFsY19nb19kb3duX3RvX3NlbGVjdG9yKGNvZGVjLCBwaW4pOwogCW51bSA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsIHNyY3MsIEFSUkFZX1NJWkUoc3JjcykpOwogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogCQlpZiAoYWxjX2F1dG9fbWl4X3RvX2RhYyhjb2RlYywgc3Jjc1tpXSkgIT0gZGFjKQogCQkJY29udGludWU7Ci0JCS8qIG5lZWQgdGhlIG1hbnVhbCBjb25uZWN0aW9uPyAqLwotCQlpZiAobnVtID4gMSkKLQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKLQkJCQkJICAgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBpKTsKLQkJLyogdW5tdXRlIG1peGVyIHdpZGdldCBpbnB1dHMgKi8KLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgc3Jjc1tpXSwgMCwKLQkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKLQkJCQkgICAgQU1QX0lOX1VOTVVURSgwKSk7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNyY3NbaV0sIDAsCi0JCQkJICAgIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCi0JCQkJICAgIEFNUF9JTl9VTk1VVEUoMSkpOwotCQlyZXR1cm47CisJCW1peCA9IHNyY3NbaV07CisJCWJyZWFrOwogCX0KKwlpZiAoIW1peCkKKwkJcmV0dXJuOworCisJLyogbmVlZCB0aGUgbWFudWFsIGNvbm5lY3Rpb24/ICovCisJaWYgKG51bSA+IDEpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIGkpOworCS8qIHVubXV0ZSBtaXhlciB3aWRnZXQgaW5wdXRzICovCisJaWYgKG5pZF9oYXNfbXV0ZShjb2RlYywgbWl4LCBIREFfSU5QVVQpKSB7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG1peCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCSAgICBBTVBfSU5fVU5NVVRFKDApKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbWl4LCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJICAgIEFNUF9JTl9VTk1VVEUoMSkpOworCX0KKwkvKiBpbml0aWFsaXplIHZvbHVtZSAqLworCW5pZCA9IGFsY19sb29rX2Zvcl9vdXRfdm9sX25pZChjb2RlYywgcGluLCBkYWMpOworCWlmIChuaWQpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCQkgICAgQU1QX09VVF9aRVJPKTsKIH0KIAotc3RhdGljIHZvaWQgYWxjNjYyX2F1dG9faW5pdF9tdWx0aV9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCitzdGF0aWMgdm9pZCBhbGNfYXV0b19pbml0X211bHRpX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgcGluX3R5cGUgPSBnZXRfcGluX3R5cGUoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlKTsKQEAgLTE5MTQ0LDQ5ICszMDY3LDI2IEBACiAJZm9yIChpID0gMDsgaSA8PSBIREFfU0lERTsgaSsrKSB7CiAJCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbaV07CiAJCWlmIChuaWQpCi0JCQlhbGM2NjJfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgcGluX3R5cGUsCisJCQlhbGNfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgcGluX3R5cGUsCiAJCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGFsYzY2Ml9hdXRvX2luaXRfaHBfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQorc3RhdGljIHZvaWQgYWxjX2F1dG9faW5pdF9leHRyYV9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaGRhX25pZF90IHBpbjsKIAogCXBpbiA9IHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXTsKIAlpZiAocGluKQotCQlhbGM2NjJfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIHBpbiwgUElOX0hQLAorCQlhbGNfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIHBpbiwgUElOX0hQLAogCQkJCQkJICBzcGVjLT5tdWx0aW91dC5ocF9uaWQpOwogCXBpbiA9IHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdOwogCWlmIChwaW4pCi0JCWFsYzY2Ml9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgcGluLCBQSU5fT1VULAorCQlhbGNfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIHBpbiwgUElOX09VVCwKIAkJCQkJc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZFswXSk7CiB9CiAKLSNkZWZpbmUgQUxDNjYyX1BJTl9DRF9OSUQJCUFMQzg4MF9QSU5fQ0RfTklECi0KLXN0YXRpYyB2b2lkIGFsYzY2Ml9hdXRvX2luaXRfYW5hbG9nX2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX2lucHV0czsgaSsrKSB7Ci0JCWhkYV9uaWRfdCBuaWQgPSBjZmctPmlucHV0c1tpXS5waW47Ci0JCWlmIChhbGNfaXNfaW5wdXRfcGluKGNvZGVjLCBuaWQpKSB7Ci0JCQlhbGNfc2V0X2lucHV0X3Bpbihjb2RlYywgbmlkLCBjZmctPmlucHV0c1tpXS50eXBlKTsKLQkJCWlmIChuaWQgIT0gQUxDNjYyX1BJTl9DRF9OSUQgJiYKLQkJCSAgICAoZ2V0X3djYXBzKGNvZGVjLCBuaWQpICYgQUNfV0NBUF9PVVRfQU1QKSkKLQkJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCi0JCQkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKLQkJCQkJCSAgICBBTVBfT1VUX01VVEUpOwotCQl9Ci0JfQotfQotCi0jZGVmaW5lIGFsYzY2Ml9hdXRvX2luaXRfaW5wdXRfc3JjCWFsYzg4Ml9hdXRvX2luaXRfaW5wdXRfc3JjCi0KIC8qCiAgKiBtdWx0aS1pbyBoZWxwZXIKICAqLwpAQCAtMTkyOTYsNiArMzE5Niw4IEBACiAJZm9yIChpID0gMDsgaSA8IHNwZWMtPm11bHRpX2lvczsgaSsrKQogCQlhbGNfc2V0X211bHRpX2lvKGNvZGVjLCBpLCBpIDwgY2gpOwogCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPmV4dF9jaGFubmVsX2NvdW50OworCWlmIChzcGVjLT5uZWVkX2RhY19maXggJiYgIXNwZWMtPmNvbnN0X2NoYW5uZWxfY291bnQpCisJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzIC8gMjsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTkzMDcsMTUgKzMyMDksMjkgQEAKIAkucHV0ID0gYWxjX2F1dG9fY2hfbW9kZV9wdXQsCiB9OwogCi1zdGF0aWMgaW50IGFsY19hdXRvX2FkZF9tdWx0aV9jaGFubmVsX21vZGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IGFsY19hdXRvX2FkZF9tdWx0aV9jaGFubmVsX21vZGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgIGludCAoKmZpbGxfZGFjKShzdHJ1Y3QgaGRhX2NvZGVjICopKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOwogCXVuc2lnbmVkIGludCBsb2NhdGlvbiwgZGVmY2ZnOwogCWludCBudW1fcGluczsKIAorCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQgJiYgY2ZnLT5ocF9vdXRzID09IDEpIHsKKwkJLyogdXNlIEhQIGFzIHByaW1hcnkgb3V0ICovCisJCWNmZy0+c3BlYWtlcl9vdXRzID0gY2ZnLT5saW5lX291dHM7CisJCW1lbWNweShjZmctPnNwZWFrZXJfcGlucywgY2ZnLT5saW5lX291dF9waW5zLAorCQkgICAgICAgc2l6ZW9mKGNmZy0+c3BlYWtlcl9waW5zKSk7CisJCWNmZy0+bGluZV9vdXRzID0gY2ZnLT5ocF9vdXRzOworCQltZW1jcHkoY2ZnLT5saW5lX291dF9waW5zLCBjZmctPmhwX3BpbnMsIHNpemVvZihjZmctPmhwX3BpbnMpKTsKKwkJY2ZnLT5ocF9vdXRzID0gMDsKKwkJbWVtc2V0KGNmZy0+aHBfcGlucywgMCwgc2l6ZW9mKGNmZy0+aHBfcGlucykpOworCQljZmctPmxpbmVfb3V0X3R5cGUgPSBBVVRPX1BJTl9IUF9PVVQ7CisJCWlmIChmaWxsX2RhYykKKwkJCWZpbGxfZGFjKGNvZGVjKTsKKwl9CiAJaWYgKGNmZy0+bGluZV9vdXRzICE9IDEgfHwKLQkgICAgY2ZnLT5saW5lX291dF90eXBlICE9IEFVVE9fUElOX0xJTkVfT1VUKQorCSAgICBjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpCiAJCXJldHVybiAwOwogCiAJZGVmY2ZnID0gc25kX2hkYV9jb2RlY19nZXRfcGluY2ZnKGNvZGVjLCBjZmctPmxpbmVfb3V0X3BpbnNbMF0pOwpAQCAtMTkzNDAsNzkgKzMyNTYsMTc5OCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFsYzY2Ml9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKKy8qIGZpbHRlciBvdXQgaW52YWxpZCBhZGNfbmlkcyAoYW5kIGNhcHNyY19uaWRzKSB0aGF0IGRvbid0IGdpdmUgYWxsCisgKiBhY3RpdmUgaW5wdXQgcGlucworICovCitzdGF0aWMgdm9pZCBhbGNfcmVtb3ZlX2ludmFsaWRfYWRjX25pZHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXg7CisJaGRhX25pZF90IGFkY19uaWRzW0FSUkFZX1NJWkUoc3BlYy0+cHJpdmF0ZV9hZGNfbmlkcyldOworCWhkYV9uaWRfdCBjYXBzcmNfbmlkc1tBUlJBWV9TSVpFKHNwZWMtPnByaXZhdGVfYWRjX25pZHMpXTsKKwlpbnQgaSwgbiwgbnVtczsKKworCWltdXggPSBzcGVjLT5pbnB1dF9tdXg7CisJaWYgKCFpbXV4KQorCQlyZXR1cm47CisJaWYgKHNwZWMtPmR5bl9hZGNfc3dpdGNoKQorCQlyZXR1cm47CisKKwludW1zID0gMDsKKwlmb3IgKG4gPSAwOyBuIDwgc3BlYy0+bnVtX2FkY19uaWRzOyBuKyspIHsKKwkJaGRhX25pZF90IGNhcCA9IHNwZWMtPnByaXZhdGVfY2Fwc3JjX25pZHNbbl07CisJCWludCBudW1fY29ubnMgPSBzbmRfaGRhX2dldF9jb25uX2xpc3QoY29kZWMsIGNhcCwgTlVMTCk7CisJCWZvciAoaSA9IDA7IGkgPCBpbXV4LT5udW1faXRlbXM7IGkrKykgeworCQkJaGRhX25pZF90IHBpbiA9IHNwZWMtPmltdXhfcGluc1tpXTsKKwkJCWlmIChwaW4pIHsKKwkJCQlpZiAoZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIGNhcCwgcGluKSA8IDApCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChudW1fY29ubnMgPD0gaW11eC0+aXRlbXNbaV0uaW5kZXgpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPj0gaW11eC0+bnVtX2l0ZW1zKSB7CisJCQlhZGNfbmlkc1tudW1zXSA9IHNwZWMtPnByaXZhdGVfYWRjX25pZHNbbl07CisJCQljYXBzcmNfbmlkc1tudW1zKytdID0gY2FwOworCQl9CisJfQorCWlmICghbnVtcykgeworCQkvKiBjaGVjayB3aGV0aGVyIEFEQy1zd2l0Y2ggaXMgcG9zc2libGUgKi8KKwkJaWYgKCFhbGNfY2hlY2tfZHluX2FkY19zd2l0Y2goY29kZWMpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6ICVzOiBubyB2YWxpZCBBREMgZm91bmQ7IgorCQkJICAgICAgICIgdXNpbmcgZmFsbGJhY2sgMHgleFxuIiwKKwkJCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lLCBzcGVjLT5wcml2YXRlX2FkY19uaWRzWzBdKTsKKwkJCXNwZWMtPm51bV9hZGNfbmlkcyA9IDE7CisJCQlzcGVjLT5hdXRvX21pYyA9IDA7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKG51bXMgIT0gc3BlYy0+bnVtX2FkY19uaWRzKSB7CisJCW1lbWNweShzcGVjLT5wcml2YXRlX2FkY19uaWRzLCBhZGNfbmlkcywKKwkJICAgICAgIG51bXMgKiBzaXplb2YoaGRhX25pZF90KSk7CisJCW1lbWNweShzcGVjLT5wcml2YXRlX2NhcHNyY19uaWRzLCBjYXBzcmNfbmlkcywKKwkJICAgICAgIG51bXMgKiBzaXplb2YoaGRhX25pZF90KSk7CisJCXNwZWMtPm51bV9hZGNfbmlkcyA9IG51bXM7CisJfQorCisJaWYgKHNwZWMtPmF1dG9fbWljKQorCQlhbGNfYXV0b19taWNfY2hlY2tfaW11eChjb2RlYyk7IC8qIGNoZWNrIGF1dG8tbWljIHNldHVwcyAqLworCWVsc2UgaWYgKHNwZWMtPmlucHV0X211eC0+bnVtX2l0ZW1zID09IDEpCisJCXNwZWMtPm51bV9hZGNfbmlkcyA9IDE7IC8qIHJlZHVjZSB0byBhIHNpbmdsZSBBREMgKi8KK30KKworLyoKKyAqIGluaXRpYWxpemUgQURDIHBhdGhzCisgKi8KK3N0YXRpYyB2b2lkIGFsY19hdXRvX2luaXRfYWRjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgYWRjX2lkeCkKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgbmlkOworCisJbmlkID0gc3BlYy0+YWRjX25pZHNbYWRjX2lkeF07CisJLyogbXV0ZSBBREMgKi8KKwlpZiAobmlkX2hhc19tdXRlKGNvZGVjLCBuaWQsIEhEQV9JTlBVVCkpIHsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJCSAgICBBTVBfSU5fTVVURSgwKSk7CisJCXJldHVybjsKKwl9CisJaWYgKCFzcGVjLT5jYXBzcmNfbmlkcykKKwkJcmV0dXJuOworCW5pZCA9IHNwZWMtPmNhcHNyY19uaWRzW2FkY19pZHhdOworCWlmIChuaWRfaGFzX211dGUoY29kZWMsIG5pZCwgSERBX09VVFBVVCkpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCQkgICAgQU1QX09VVF9NVVRFKTsKK30KKworc3RhdGljIHZvaWQgYWxjX2F1dG9faW5pdF9pbnB1dF9zcmMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGMsIG51bXM7CisKKwlmb3IgKGMgPSAwOyBjIDwgc3BlYy0+bnVtX2FkY19uaWRzOyBjKyspCisJCWFsY19hdXRvX2luaXRfYWRjKGNvZGVjLCBjKTsKKwlpZiAoc3BlYy0+ZHluX2FkY19zd2l0Y2gpCisJCW51bXMgPSAxOworCWVsc2UKKwkJbnVtcyA9IHNwZWMtPm51bV9hZGNfbmlkczsKKwlmb3IgKGMgPSAwOyBjIDwgbnVtczsgYysrKQorCQlhbGNfbXV4X3NlbGVjdChjb2RlYywgMCwgc3BlYy0+Y3VyX211eFtjXSwgdHJ1ZSk7Cit9CisKKy8qIGFkZCBtaWMgYm9vc3RzIGlmIG5lZWRlZCAqLworc3RhdGljIGludCBhbGNfYXV0b19hZGRfbWljX2Jvb3N0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCWludCBpLCBlcnI7CisJaW50IHR5cGVfaWR4ID0gMDsKKwloZGFfbmlkX3QgbmlkOworCWNvbnN0IGNoYXIgKnByZXZfbGFiZWwgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX2lucHV0czsgaSsrKSB7CisJCWlmIChjZmctPmlucHV0c1tpXS50eXBlID4gQVVUT19QSU5fTUlDKQorCQkJYnJlYWs7CisJCW5pZCA9IGNmZy0+aW5wdXRzW2ldLnBpbjsKKwkJaWYgKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmIEFDX1dDQVBfSU5fQU1QKSB7CisJCQljb25zdCBjaGFyICpsYWJlbDsKKwkJCWNoYXIgYm9vc3RfbGFiZWxbMzJdOworCisJCQlsYWJlbCA9IGhkYV9nZXRfYXV0b2NmZ19pbnB1dF9sYWJlbChjb2RlYywgY2ZnLCBpKTsKKwkJCWlmIChwcmV2X2xhYmVsICYmICFzdHJjbXAobGFiZWwsIHByZXZfbGFiZWwpKQorCQkJCXR5cGVfaWR4Kys7CisJCQllbHNlCisJCQkJdHlwZV9pZHggPSAwOworCQkJcHJldl9sYWJlbCA9IGxhYmVsOworCisJCQlzbnByaW50Zihib29zdF9sYWJlbCwgc2l6ZW9mKGJvb3N0X2xhYmVsKSwKKwkJCQkgIiVzIEJvb3N0IFZvbHVtZSIsIGxhYmVsKTsKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwKKwkJCQkJICBib29zdF9sYWJlbCwgdHlwZV9pZHgsCisJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX0lOUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBzZWxlY3Qgb3IgdW5tdXRlIHRoZSBnaXZlbiBjYXBzcmMgcm91dGUgKi8KK3N0YXRpYyB2b2lkIHNlbGVjdF9vcl91bm11dGVfY2Fwc3JjKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgY2FwLAorCQkJCSAgICBpbnQgaWR4KQoreworCWlmIChnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIGNhcCkpID09IEFDX1dJRF9BVURfTUlYKSB7CisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgY2FwLCBIREFfSU5QVVQsIGlkeCwKKwkJCQkJIEhEQV9BTVBfTVVURSwgMCk7CisJfSBlbHNlIGlmIChzbmRfaGRhX2dldF9jb25uX2xpc3QoY29kZWMsIGNhcCwgTlVMTCkgPiAxKSB7CisJCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIGNhcCwgMCwKKwkJCQkJICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgaWR4KTsKKwl9Cit9CisKKy8qIHNldCB0aGUgZGVmYXVsdCBjb25uZWN0aW9uIHRvIHRoYXQgcGluICovCitzdGF0aWMgaW50IGluaXRfY2Fwc3JjX2Zvcl9waW4oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW4pCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisKKwlpZiAoIXBpbikKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9hZGNfbmlkczsgaSsrKSB7CisJCWhkYV9uaWRfdCBjYXAgPSBzcGVjLT5jYXBzcmNfbmlkcyA/CisJCQlzcGVjLT5jYXBzcmNfbmlkc1tpXSA6IHNwZWMtPmFkY19uaWRzW2ldOworCQlpbnQgaWR4OworCisJCWlkeCA9IGdldF9jb25uZWN0aW9uX2luZGV4KGNvZGVjLCBjYXAsIHBpbik7CisJCWlmIChpZHggPCAwKQorCQkJY29udGludWU7CisJCXNlbGVjdF9vcl91bm11dGVfY2Fwc3JjKGNvZGVjLCBjYXAsIGlkeCk7CisJCXJldHVybiBpOyAvKiByZXR1cm4gdGhlIGZvdW5kIGluZGV4ICovCisJfQorCXJldHVybiAtMTsgLyogbm90IGZvdW5kICovCit9CisKKy8qIGluaXRpYWxpemUgc29tZSBzcGVjaWFsIGNhc2VzIGZvciBpbnB1dCBzb3VyY2VzICovCitzdGF0aWMgdm9pZCBhbGNfaW5pdF9zcGVjaWFsX2lucHV0X3NyYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLm51bV9pbnB1dHM7IGkrKykKKwkJaW5pdF9jYXBzcmNfZm9yX3Bpbihjb2RlYywgc3BlYy0+YXV0b2NmZy5pbnB1dHNbaV0ucGluKTsKK30KKworLyogYXNzaWduIGFwcHJvcHJpYXRlIGNhcHR1cmUgbWl4ZXJzICovCitzdGF0aWMgdm9pZCBzZXRfY2FwdHVyZV9taXhlcihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmNhcHNbMl1bM10gPSB7CisJCXsgYWxjX2NhcHR1cmVfbWl4ZXJfbm9zcmMxLAorCQkgIGFsY19jYXB0dXJlX21peGVyX25vc3JjMiwKKwkJICBhbGNfY2FwdHVyZV9taXhlcl9ub3NyYzMgfSwKKwkJeyBhbGNfY2FwdHVyZV9taXhlcjEsCisJCSAgYWxjX2NhcHR1cmVfbWl4ZXIyLAorCQkgIGFsY19jYXB0dXJlX21peGVyMyB9LAorCX07CisKKwkvKiBjaGVjayB3aGV0aGVyIGVpdGhlciBvZiBBREMgb3IgTVVYIGhhcyBhIHZvbHVtZSBjb250cm9sICovCisJaWYgKCFuaWRfaGFzX3ZvbHVtZShjb2RlYywgc3BlYy0+YWRjX25pZHNbMF0sIEhEQV9JTlBVVCkpIHsKKwkJaWYgKCFzcGVjLT5jYXBzcmNfbmlkcykKKwkJCXJldHVybjsgLyogbm8gdm9sdW1lICovCisJCWlmICghbmlkX2hhc192b2x1bWUoY29kZWMsIHNwZWMtPmNhcHNyY19uaWRzWzBdLCBIREFfT1VUUFVUKSkKKwkJCXJldHVybjsgLyogbm8gdm9sdW1lIGluIGNhcHNyYywgdG9vICovCisJCXNwZWMtPnZvbF9pbl9jYXBzcmMgPSAxOworCX0KKworCWlmIChzcGVjLT5udW1fYWRjX25pZHMgPiAwKSB7CisJCWludCBtdXggPSAwOworCQlpbnQgbnVtX2FkY3MgPSAwOworCisJCWlmIChzcGVjLT5pbnB1dF9tdXggJiYgc3BlYy0+aW5wdXRfbXV4LT5udW1faXRlbXMgPiAxKQorCQkJbXV4ID0gMTsKKwkJaWYgKHNwZWMtPmF1dG9fbWljKSB7CisJCQludW1fYWRjcyA9IDE7CisJCQltdXggPSAwOworCQl9IGVsc2UgaWYgKHNwZWMtPmR5bl9hZGNfc3dpdGNoKQorCQkJbnVtX2FkY3MgPSAxOworCQlpZiAoIW51bV9hZGNzKSB7CisJCQlpZiAoc3BlYy0+bnVtX2FkY19uaWRzID4gMykKKwkJCQlzcGVjLT5udW1fYWRjX25pZHMgPSAzOworCQkJZWxzZSBpZiAoIXNwZWMtPm51bV9hZGNfbmlkcykKKwkJCQlyZXR1cm47CisJCQludW1fYWRjcyA9IHNwZWMtPm51bV9hZGNfbmlkczsKKwkJfQorCQlzcGVjLT5jYXBfbWl4ZXIgPSBjYXBzW211eF1bbnVtX2FkY3MgLSAxXTsKKwl9Cit9CisKKy8qCisgKiBzdGFuZGFyZCBhdXRvLXBhcnNlciBpbml0aWFsaXphdGlvbnMKKyAqLworc3RhdGljIHZvaWQgYWxjX2F1dG9faW5pdF9zdGQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJYWxjX2F1dG9faW5pdF9tdWx0aV9vdXQoY29kZWMpOworCWFsY19hdXRvX2luaXRfZXh0cmFfb3V0KGNvZGVjKTsKKwlhbGNfYXV0b19pbml0X2FuYWxvZ19pbnB1dChjb2RlYyk7CisJYWxjX2F1dG9faW5pdF9pbnB1dF9zcmMoY29kZWMpOworCWFsY19hdXRvX2luaXRfZGlnaXRhbChjb2RlYyk7CisJaWYgKHNwZWMtPnVuc29sX2V2ZW50KQorCQlhbGNfaW5pdGhvb2soY29kZWMpOworfQorCisvKgorICogRGlnaXRhbC1iZWVwIGhhbmRsZXJzCisgKi8KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9JTlBVVF9CRUVQCisjZGVmaW5lIHNldF9iZWVwX2FtcChzcGVjLCBuaWQsIGlkeCwgZGlyKSBcCisJKChzcGVjKS0+YmVlcF9hbXAgPSBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgaWR4LCBkaXIpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYmVlcF93aGl0ZV9saXN0W10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODI5ZiwgIkFTVVMiLCAxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4M2NlLCAiRWVlUEMiLCAxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MzFhLCAiRWVlUEMiLCAxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MzRhLCAiRWVlUEMiLCAxKSwKKwlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhkNjEzLCAiSW50ZWwiLCAxKSwKKwl7fQorfTsKKworc3RhdGljIGlubGluZSBpbnQgaGFzX2NkZWZpbmVfYmVlcChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwljb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqcTsKKwlxID0gc25kX3BjaV9xdWlya19sb29rdXAoY29kZWMtPmJ1cy0+cGNpLCBiZWVwX3doaXRlX2xpc3QpOworCWlmIChxKQorCQlyZXR1cm4gcS0+dmFsdWU7CisJcmV0dXJuIHNwZWMtPmNkZWZpbmUuZW5hYmxlX3BjYmVlcDsKK30KKyNlbHNlCisjZGVmaW5lIHNldF9iZWVwX2FtcChzcGVjLCBuaWQsIGlkeCwgZGlyKSAvKiBOT1AgKi8KKyNkZWZpbmUgaGFzX2NkZWZpbmVfYmVlcChjb2RlYykJCTAKKyNlbmRpZgorCisvKiBwYXJzZSB0aGUgQklPUyBjb25maWd1cmF0aW9uIGFuZCBzZXQgdXAgdGhlIGFsY19zcGVjICovCisvKiByZXR1cm4gMSBpZiBzdWNjZXNzZnVsLCAwIGlmIHRoZSBwcm9wZXIgY29uZmlnIGlzIG5vdCBmb3VuZCwKKyAqIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGFsY19wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgY29uc3QgaGRhX25pZF90ICppZ25vcmVfbmlkcywKKwkJCQkgY29uc3QgaGRhX25pZF90ICpzc2lkX25pZHMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaW50IGVycjsKLQlzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY2Ml9pZ25vcmVbXSA9IHsgMHgxZCwgMCB9OwogCiAJZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsCi0JCQkJCSAgIGFsYzY2Ml9pZ25vcmUpOworCQkJCQkgICBpZ25vcmVfbmlkcyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JaWYgKCFzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cykKKwlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzKSB7CisJCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19vdXRzIHx8IHNwZWMtPmF1dG9jZmcuZGlnX2luX3BpbikgeworCQkJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKKwkJCXNwZWMtPm5vX2FuYWxvZyA9IDE7CisJCQlnb3RvIGRpZ19vbmx5OworCQl9CiAJCXJldHVybiAwOyAvKiBjYW4ndCBmaW5kIHZhbGlkIEJJT1MgcGluIGNvbmZpZyAqLwotCi0JZXJyID0gYWxjNjYyX2F1dG9fZmlsbF9kYWNfbmlkcyhjb2RlYywgJnNwZWMtPmF1dG9jZmcpOworCX0KKwllcnIgPSBhbGNfYXV0b19maWxsX2RhY19uaWRzKGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGNfYXV0b19hZGRfbXVsdGlfY2hhbm5lbF9tb2RlKGNvZGVjKTsKKwllcnIgPSBhbGNfYXV0b19hZGRfbXVsdGlfY2hhbm5lbF9tb2RlKGNvZGVjLCBhbGNfYXV0b19maWxsX2RhY19uaWRzKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGM2NjJfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoY29kZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwllcnIgPSBhbGNfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoY29kZWMsICZzcGVjLT5hdXRvY2ZnKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGM2NjJfYXV0b19jcmVhdGVfZXh0cmFfb3V0KGNvZGVjLAotCQkJCQkgICBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwKLQkJCQkJICAgIlNwZWFrZXIiKTsKKwllcnIgPSBhbGNfYXV0b19jcmVhdGVfaHBfb3V0KGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlpZiAoZXJyKQotCQlzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdID0gZXJyOwotCWVyciA9IGFsYzY2Ml9hdXRvX2NyZWF0ZV9leHRyYV9vdXQoY29kZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwKLQkJCQkJICAgIkhlYWRwaG9uZSIpOworCWVyciA9IGFsY19hdXRvX2NyZWF0ZV9zcGVha2VyX291dChjb2RlYyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JaWYgKGVycikKLQkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gZXJyOwotCWVyciA9IGFsYzY2Ml9hdXRvX2NyZWF0ZV9pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJZXJyID0gYWxjX2F1dG9fY3JlYXRlX2lucHV0X2N0bHMoY29kZWMpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgKiAyOwogCisgZGlnX29ubHk6CiAJYWxjX2F1dG9fcGFyc2VfZGlnaXRhbChjb2RlYyk7CiAKKwlpZiAoIXNwZWMtPm5vX2FuYWxvZykKKwkJYWxjX3JlbW92ZV9pbnZhbGlkX2FkY19uaWRzKGNvZGVjKTsKKworCWlmIChzc2lkX25pZHMpCisJCWFsY19zc2lkX2NoZWNrKGNvZGVjLCBzc2lkX25pZHMpOworCisJaWYgKCFzcGVjLT5ub19hbmFsb2cpIHsKKwkJYWxjX2F1dG9fY2hlY2tfc3dpdGNoZXMoY29kZWMpOworCQllcnIgPSBhbGNfYXV0b19hZGRfbWljX2Jvb3N0KGNvZGVjKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwogCWlmIChzcGVjLT5rY3Rscy5saXN0KQogCQlhZGRfbWl4ZXIoc3BlYywgc3BlYy0+a2N0bHMubGlzdCk7CiAKLQlzcGVjLT5udW1fbXV4X2RlZnMgPSAxOwotCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07Ci0KLQllcnIgPSBhbGNfYXV0b19hZGRfbWljX2Jvb3N0KGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTBlYzAyNzIgfHwgY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwNjYzIHx8Ci0JICAgIGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMGVjMDY2NSB8fCBjb2RlYy0+dmVuZG9yX2lkID09IDB4MTBlYzA2NzApCi0JICAgIGFsY19zc2lkX2NoZWNrKGNvZGVjLCAweDE1LCAweDFiLCAweDE0LCAweDIxKTsKLQllbHNlCi0JICAgIGFsY19zc2lkX2NoZWNrKGNvZGVjLCAweDE1LCAweDFiLCAweDE0LCAwKTsKLQogCXJldHVybiAxOwogfQogCi0vKiBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGZvciBhdXRvLWNvbmZpZ3VyYXRpb24gbW9kZWwgKi8KLXN0YXRpYyB2b2lkIGFsYzY2Ml9hdXRvX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IGFsYzg4MF9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg4MF9pZ25vcmVbXSA9IHsgMHgxZCwgMCB9OworCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgwX3NzaWRzW10gPSB7IDB4MTUsIDB4MWIsIDB4MTQsIDAgfTsgCisJcmV0dXJuIGFsY19wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgYWxjODgwX2lnbm9yZSwgYWxjODgwX3NzaWRzKTsKK30KKworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2FtcF9saXN0IGFsYzg4MF9sb29wYmFja3NbXSA9IHsKKwl7IDB4MGIsIEhEQV9JTlBVVCwgMCB9LAorCXsgMHgwYiwgSERBX0lOUFVULCAxIH0sCisJeyAweDBiLCBIREFfSU5QVVQsIDIgfSwKKwl7IDB4MGIsIEhEQV9JTlBVVCwgMyB9LAorCXsgMHgwYiwgSERBX0lOUFVULCA0IH0sCisJeyB9IC8qIGVuZCAqLworfTsKKyNlbmRpZgorCisvKgorICogYm9hcmQgc2V0dXBzCisgKi8KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKKyNkZWZpbmUgYWxjX2JvYXJkX2NvbmZpZyBcCisJc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcKKyNkZWZpbmUgYWxjX2JvYXJkX2NvZGVjX3NpZF9jb25maWcgXAorCXNuZF9oZGFfY2hlY2tfYm9hcmRfY29kZWNfc2lkX2NvbmZpZworI2luY2x1ZGUgImFsY19xdWlya3MuYyIKKyNlbHNlCisjZGVmaW5lIGFsY19ib2FyZF9jb25maWcoY29kZWMsIG51bXMsIG1vZGVscywgdGJsKQktMQorI2RlZmluZSBhbGNfYm9hcmRfY29kZWNfc2lkX2NvbmZpZyhjb2RlYywgbnVtcywgbW9kZWxzLCB0YmwpCS0xCisjZGVmaW5lIHNldHVwX3ByZXNldChjb2RlYywgeCkJLyogTk9QICovCisjZW5kaWYKKworLyoKKyAqIE9LLCBoZXJlIHdlIGhhdmUgZmluYWxseSB0aGUgcGF0Y2ggZm9yIEFMQzg4MAorICovCisjaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCisjaW5jbHVkZSAiYWxjODgwX3F1aXJrcy5jIgorI2VuZGlmCisKK3N0YXRpYyBpbnQgcGF0Y2hfYWxjODgwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKKwlpbnQgYm9hcmRfY29uZmlnOworCWludCBlcnI7CisKKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3BlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvZGVjLT5zcGVjID0gc3BlYzsKKworCXNwZWMtPm1peGVyX25pZCA9IDB4MGI7CisJc3BlYy0+bmVlZF9kYWNfZml4ID0gMTsKKworCWJvYXJkX2NvbmZpZyA9IGFsY19ib2FyZF9jb25maWcoY29kZWMsIEFMQzg4MF9NT0RFTF9MQVNULAorCQkJCQlhbGM4ODBfbW9kZWxzLCBhbGM4ODBfY2ZnX3RibCk7CisJaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiAlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLAorCQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSk7CisJCWJvYXJkX2NvbmZpZyA9IEFMQ19NT0RFTF9BVVRPOworCX0KKworCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKKwkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCisJCWVyciA9IGFsYzg4MF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlhbGNfZnJlZShjb2RlYyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisjaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCisJCWVsc2UgaWYgKCFlcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgorCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyAzLXN0YWNrIG1vZGUuLi5cbiIpOworCQkJYm9hcmRfY29uZmlnID0gQUxDODgwXzNTVDsKKwkJfQorI2VuZGlmCisJfQorCisJaWYgKGJvYXJkX2NvbmZpZyAhPSBBTENfTU9ERUxfQVVUTykKKwkJc2V0dXBfcHJlc2V0KGNvZGVjLCAmYWxjODgwX3ByZXNldHNbYm9hcmRfY29uZmlnXSk7CisKKwlpZiAoIXNwZWMtPm5vX2FuYWxvZyAmJiAhc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7CisJCWFsY19hdXRvX2ZpbGxfYWRjX2NhcHMoY29kZWMpOworCQlhbGNfcmVidWlsZF9pbXV4X2Zvcl9hdXRvX21pYyhjb2RlYyk7CisJCWFsY19yZW1vdmVfaW52YWxpZF9hZGNfbmlkcyhjb2RlYyk7CisJfQorCisJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgIXNwZWMtPmNhcF9taXhlcikKKwkJc2V0X2NhcHR1cmVfbWl4ZXIoY29kZWMpOworCisJaWYgKCFzcGVjLT5ub19hbmFsb2cpIHsKKwkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlhbGNfZnJlZShjb2RlYyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOworCX0KKworCXNwZWMtPnZtYXN0ZXJfbmlkID0gMHgwYzsKKworCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOworCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pCisJCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKwlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCisJCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSBhbGM4ODBfbG9vcGJhY2tzOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQUxDMjYwIHN1cHBvcnQKKyAqLworc3RhdGljIGludCBhbGMyNjBfcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjBfaWdub3JlW10gPSB7IDB4MTcsIDAgfTsKKwlzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2MF9zc2lkc1tdID0geyAweDEwLCAweDE1LCAweDBmLCAwIH07CisJcmV0dXJuIGFsY19wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgYWxjMjYwX2lnbm9yZSwgYWxjMjYwX3NzaWRzKTsKK30KKworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2FtcF9saXN0IGFsYzI2MF9sb29wYmFja3NbXSA9IHsKKwl7IDB4MDcsIEhEQV9JTlBVVCwgMCB9LAorCXsgMHgwNywgSERBX0lOUFVULCAxIH0sCisJeyAweDA3LCBIREFfSU5QVVQsIDIgfSwKKwl7IDB4MDcsIEhEQV9JTlBVVCwgMyB9LAorCXsgMHgwNywgSERBX0lOUFVULCA0IH0sCisJeyB9IC8qIGVuZCAqLworfTsKKyNlbmRpZgorCisvKgorICogUGluIGNvbmZpZyBmaXhlcworICovCitlbnVtIHsKKwlQSU5GSVhfSFBfREM1NzUwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgYWxjMjYwX2ZpeHVwc1tdID0geworCVtQSU5GSVhfSFBfREM1NzUwXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTEsIDB4OTAxMzAxMTAgfSwgLyogc3BlYWtlciAqLworCQkJeyB9CisJCX0KKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2MF9maXh1cF90YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODBhLCAiSFAgZGM1NzUwIiwgUElORklYX0hQX0RDNTc1MCksCisJe30KK307CisKKy8qCisgKi8KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKKyNpbmNsdWRlICJhbGMyNjBfcXVpcmtzLmMiCisjZW5kaWYKKworc3RhdGljIGludCBwYXRjaF9hbGMyNjAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjOworCWludCBlcnIsIGJvYXJkX2NvbmZpZzsKKworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJc3BlYy0+bWl4ZXJfbmlkID0gMHgwNzsKKworCWJvYXJkX2NvbmZpZyA9IGFsY19ib2FyZF9jb25maWcoY29kZWMsIEFMQzI2MF9NT0RFTF9MQVNULAorCQkJCQlhbGMyNjBfbW9kZWxzLCBhbGMyNjBfY2ZnX3RibCk7CisJaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKKwkJc25kX3ByaW50ZChLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwKKwkJCSAgIGNvZGVjLT5jaGlwX25hbWUpOworCQlib2FyZF9jb25maWcgPSBBTENfTU9ERUxfQVVUTzsKKwl9CisKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7CisJCWFsY19waWNrX2ZpeHVwKGNvZGVjLCBOVUxMLCBhbGMyNjBfZml4dXBfdGJsLCBhbGMyNjBfZml4dXBzKTsKKwkJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7CisJfQorCisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgeworCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KKwkJZXJyID0gYWxjMjYwX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWFsY19mcmVlKGNvZGVjKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKKwkJZWxzZSBpZiAoIWVycikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCisJCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGJhc2UgbW9kZS4uLlxuIik7CisJCQlib2FyZF9jb25maWcgPSBBTEMyNjBfQkFTSUM7CisJCX0KKyNlbmRpZgorCX0KKworCWlmIChib2FyZF9jb25maWcgIT0gQUxDX01PREVMX0FVVE8pCisJCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzI2MF9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCisJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgIXNwZWMtPmFkY19uaWRzICYmIHNwZWMtPmlucHV0X211eCkgeworCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKKwkJYWxjX3JlYnVpbGRfaW11eF9mb3JfYXV0b19taWMoY29kZWMpOworCQlhbGNfcmVtb3ZlX2ludmFsaWRfYWRjX25pZHMoY29kZWMpOworCX0KKworCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5jYXBfbWl4ZXIpCisJCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKKworCWlmICghc3BlYy0+bm9fYW5hbG9nKSB7CisJCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOworCQlpZiAoZXJyIDwgMCkgeworCQkJYWxjX2ZyZWUoY29kZWMpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwNywgMHgwNSwgSERBX0lOUFVUKTsKKwl9CisKKwlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJPQkUpOworCisJc3BlYy0+dm1hc3Rlcl9uaWQgPSAweDA4OworCisJY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7CisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykKKwkJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CisJc3BlYy0+c2h1dHVwID0gYWxjX2VhcGRfc2h1dHVwOworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKwlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCisJCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSBhbGMyNjBfbG9vcGJhY2tzOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQUxDODgyLzg4My84ODUvODg4Lzg4OSBzdXBwb3J0CisgKgorICogQUxDODgyIGlzIGFsbW9zdCBpZGVudGljYWwgd2l0aCBBTEM4ODAgYnV0IGhhcyBjbGVhbmVyIGFuZCBtb3JlIGZsZXhpYmxlCisgKiBjb25maWd1cmF0aW9uLiAgRWFjaCBwaW4gd2lkZ2V0IGNhbiBjaG9vc2UgYW55IGlucHV0IERBQ3MgYW5kIGEgbWl4ZXIuCisgKiBFYWNoIEFEQyBpcyBjb25uZWN0ZWQgZnJvbSBhIG1peGVyIG9mIGFsbCBpbnB1dHMuICBUaGlzIG1ha2VzIHBvc3NpYmxlCisgKiA2LWNoYW5uZWwgaW5kZXBlbmRlbnQgY2FwdHVyZXMuCisgKgorICogSW4gYWRkaXRpb24sIGFuIGluZGVwZW5kZW50IERBQyBmb3IgdGhlIG11bHRpLXBsYXliYWNrIChub3QgdXNlZCBpbiB0aGlzCisgKiBkcml2ZXIgeWV0KS4KKyAqLworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKyNkZWZpbmUgYWxjODgyX2xvb3BiYWNrcwlhbGM4ODBfbG9vcGJhY2tzCisjZW5kaWYKKworLyoKKyAqIFBpbiBjb25maWcgZml4ZXMKKyAqLworZW51bSB7CisJUElORklYX0FCSVRfQVc5RF9NQVgsCisJUElORklYX0xFTk9WT19ZNTMwLAorCVBJTkZJWF9QQl9NNTIxMCwKKwlQSU5GSVhfQUNFUl9BU1BJUkVfNzczNiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzg4Ml9maXh1cHNbXSA9IHsKKwlbUElORklYX0FCSVRfQVc5RF9NQVhdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKKwkJCXsgMHgxNSwgMHgwMTA4MDEwNCB9LCAvKiBzaWRlICovCisJCQl7IDB4MTYsIDB4MDEwMTEwMTIgfSwgLyogcmVhciAqLworCQkJeyAweDE3LCAweDAxMDE2MDExIH0sIC8qIGNsZmUgKi8KKwkJCXsgfQorCQl9CisJfSwKKwlbUElORklYX0xFTk9WT19ZNTMwXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTUsIDB4OTkxMzAxMTIgfSwgLyogcmVhciBpbnQgc3BlYWtlcnMgKi8KKwkJCXsgMHgxNiwgMHg5OTEzMDExMSB9LCAvKiBzdWJ3b29mZXIgKi8KKwkJCXsgfQorCQl9CisJfSwKKwlbUElORklYX1BCX001MjEwXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfVkVSQlMsCisJCS52LnZlcmJzID0gKGNvbnN0IHN0cnVjdCBoZGFfdmVyYltdKSB7CisJCQl7IDB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MCB9LAorCQkJe30KKwkJfQorCX0sCisJW1BJTkZJWF9BQ0VSX0FTUElSRV83NzM2XSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfU0tVLAorCQkudi5za3UgPSBBTENfRklYVVBfU0tVX0lHTk9SRSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzg4Ml9maXh1cF90YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTU1LCAiUGFja2FyZC1CZWxsIE01MTIwIiwgUElORklYX1BCX001MjEwKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYTBkLCAiTGVub3ZvIFk1MzAiLCBQSU5GSVhfTEVOT1ZPX1k1MzApLAorCVNORF9QQ0lfUVVJUksoMHgxNDdiLCAweDEwN2EsICJBYml0IEFXOUQtTUFYIiwgUElORklYX0FCSVRfQVc5RF9NQVgpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAyOTYsICJBY2VyIEFzcGlyZSA3NzM2eiIsIFBJTkZJWF9BQ0VSX0FTUElSRV83NzM2KSwKKwl7fQorfTsKKworLyoKKyAqIEJJT1MgYXV0byBjb25maWd1cmF0aW9uCisgKi8KKy8qIGFsbW9zdCBpZGVudGljYWwgd2l0aCBBTEM4ODAgcGFyc2VyLi4uICovCitzdGF0aWMgaW50IGFsYzg4Ml9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg4Ml9pZ25vcmVbXSA9IHsgMHgxZCwgMCB9OworCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODgyX3NzaWRzW10gPSB7IDB4MTUsIDB4MWIsIDB4MTQsIDAgfTsKKwlyZXR1cm4gYWxjX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjLCBhbGM4ODJfaWdub3JlLCBhbGM4ODJfc3NpZHMpOworfQorCisvKgorICovCisjaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCisjaW5jbHVkZSAiYWxjODgyX3F1aXJrcy5jIgorI2VuZGlmCisKK3N0YXRpYyBpbnQgcGF0Y2hfYWxjODgyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKKwlpbnQgZXJyLCBib2FyZF9jb25maWc7CisKKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3BlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvZGVjLT5zcGVjID0gc3BlYzsKKworCXNwZWMtPm1peGVyX25pZCA9IDB4MGI7CisKKwlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKKwljYXNlIDB4MTBlYzA4ODI6CisJY2FzZSAweDEwZWMwODg1OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBBTEM4ODMgYW5kIHZhcmlhbnRzICovCisJCWFsY19maXhfcGxsX2luaXQoY29kZWMsIDB4MjAsIDB4MGEsIDEwKTsKKwkJYnJlYWs7CisJfQorCisJYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODgyX01PREVMX0xBU1QsCisJCQkJCWFsYzg4Ml9tb2RlbHMsIGFsYzg4Ml9jZmdfdGJsKTsKKworCWlmIChib2FyZF9jb25maWcgPCAwKQorCQlib2FyZF9jb25maWcgPSBhbGNfYm9hcmRfY29kZWNfc2lkX2NvbmZpZyhjb2RlYywKKwkJCUFMQzg4Ml9NT0RFTF9MQVNULCBhbGM4ODJfbW9kZWxzLCBhbGM4ODJfc3NpZF9jZmdfdGJsKTsKKworCWlmIChib2FyZF9jb25maWcgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwKKwkJICAgICAgIGNvZGVjLT5jaGlwX25hbWUpOworCQlib2FyZF9jb25maWcgPSBBTENfTU9ERUxfQVVUTzsKKwl9CisKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7CisJCWFsY19waWNrX2ZpeHVwKGNvZGVjLCBOVUxMLCBhbGM4ODJfZml4dXBfdGJsLCBhbGM4ODJfZml4dXBzKTsKKwkJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7CisJfQorCisJYWxjX2F1dG9fcGFyc2VfY3VzdG9taXplX2RlZmluZShjb2RlYyk7CisKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7CisJCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLworCQllcnIgPSBhbGM4ODJfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJYWxjX2ZyZWUoY29kZWMpOworCQkJcmV0dXJuIGVycjsKKwkJfQorI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUworCQllbHNlIGlmICghZXJyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKKwkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKKwkJCWJvYXJkX2NvbmZpZyA9IEFMQzg4Ml8zU1RfRElHOworCQl9CisjZW5kaWYKKwl9CisKKwlpZiAoYm9hcmRfY29uZmlnICE9IEFMQ19NT0RFTF9BVVRPKQorCQlzZXR1cF9wcmVzZXQoY29kZWMsICZhbGM4ODJfcHJlc2V0c1tib2FyZF9jb25maWddKTsKKworCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKKwkJYWxjX2F1dG9fZmlsbF9hZGNfY2Fwcyhjb2RlYyk7CisJCWFsY19yZWJ1aWxkX2ltdXhfZm9yX2F1dG9fbWljKGNvZGVjKTsKKwkJYWxjX3JlbW92ZV9pbnZhbGlkX2FkY19uaWRzKGNvZGVjKTsKKwl9CisKKwlpZiAoIXNwZWMtPm5vX2FuYWxvZyAmJiAhc3BlYy0+Y2FwX21peGVyKQorCQlzZXRfY2FwdHVyZV9taXhlcihjb2RlYyk7CisKKwlpZiAoIXNwZWMtPm5vX2FuYWxvZyAmJiBoYXNfY2RlZmluZV9iZWVwKGNvZGVjKSkgeworCQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgMHgxKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWFsY19mcmVlKGNvZGVjKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJc2V0X2JlZXBfYW1wKHNwZWMsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCk7CisJfQorCisJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BST0JFKTsKKworCXNwZWMtPnZtYXN0ZXJfbmlkID0gMHgwYzsKKworCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOworCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pCisJCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOworCisJYWxjX2luaXRfamFja3MoY29kZWMpOworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKwlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCisJCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSBhbGM4ODJfbG9vcGJhY2tzOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQUxDMjYyIHN1cHBvcnQKKyAqLworc3RhdGljIGludCBhbGMyNjJfcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjJfaWdub3JlW10gPSB7IDB4MWQsIDAgfTsKKwlzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2Ml9zc2lkc1tdID0geyAweDE1LCAweDFiLCAweDE0LCAwIH07CisJcmV0dXJuIGFsY19wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgYWxjMjYyX2lnbm9yZSwgYWxjMjYyX3NzaWRzKTsKK30KKworLyoKKyAqIFBpbiBjb25maWcgZml4ZXMKKyAqLworZW51bSB7CisJUElORklYX0ZTQ19IMjcwLAorCVBJTkZJWF9IUF9aMjAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgYWxjMjYyX2ZpeHVwc1tdID0geworCVtQSU5GSVhfRlNDX0gyNzBdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKKwkJCXsgMHgxNCwgMHg5OTEzMDExMCB9LCAvKiBzcGVha2VyICovCisJCQl7IDB4MTUsIDB4MDIyMTE0MmYgfSwgLyogZnJvbnQgSFAgKi8KKwkJCXsgMHgxYiwgMHgwMTIxMTQxZiB9LCAvKiByZWFyIEhQICovCisJCQl7IH0KKwkJfQorCX0sCisJW1BJTkZJWF9IUF9aMjAwXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTYsIDB4OTkxMzAxMjAgfSwgLyogaW50ZXJuYWwgc3BlYWtlciAqLworCQkJeyB9CisJCX0KKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2Ml9maXh1cF90YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgxNzBiLCAiSFAgWjIwMCIsIFBJTkZJWF9IUF9aMjAwKSwKKwlTTkRfUENJX1FVSVJLKDB4MTczNCwgMHgxMTQ3LCAiRlNDIENlbHNpdXMgSDI3MCIsIFBJTkZJWF9GU0NfSDI3MCksCisJe30KK307CisKKworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKyNkZWZpbmUgYWxjMjYyX2xvb3BiYWNrcwlhbGM4ODBfbG9vcGJhY2tzCisjZW5kaWYKKworLyoKKyAqLworI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUworI2luY2x1ZGUgImFsYzI2Ml9xdWlya3MuYyIKKyNlbmRpZgorCitzdGF0aWMgaW50IHBhdGNoX2FsYzI2MihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWM7CisJaW50IGJvYXJkX2NvbmZpZzsKKwlpbnQgZXJyOworCisJc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNwZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb2RlYy0+c3BlYyA9IHNwZWM7CisKKwlzcGVjLT5taXhlcl9uaWQgPSAweDBiOworCisjaWYgMAorCS8qIHBzaG91IDA3LzExLzA1ICBzZXQgYSB6ZXJvIFBDTSBzYW1wbGUgdG8gREFDIHdoZW4gRklGTyBpcworCSAqIHVuZGVyLXJ1bgorCSAqLworCXsKKwlpbnQgdG1wOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MWEsIDAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDcpOworCXRtcCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgyMCwgMCwgQUNfVkVSQl9HRVRfUFJPQ19DT0VGLCAwKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDFhLCAwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCA3KTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDFhLCAwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIHRtcCB8IDB4ODApOworCX0KKyNlbmRpZgorCWFsY19hdXRvX3BhcnNlX2N1c3RvbWl6ZV9kZWZpbmUoY29kZWMpOworCisJYWxjX2ZpeF9wbGxfaW5pdChjb2RlYywgMHgyMCwgMHgwYSwgMTApOworCisJYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDMjYyX01PREVMX0xBU1QsCisJCQkJCWFsYzI2Ml9tb2RlbHMsIGFsYzI2Ml9jZmdfdGJsKTsKKworCWlmIChib2FyZF9jb25maWcgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwKKwkJICAgICAgIGNvZGVjLT5jaGlwX25hbWUpOworCQlib2FyZF9jb25maWcgPSBBTENfTU9ERUxfQVVUTzsKKwl9CisKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7CisJCWFsY19waWNrX2ZpeHVwKGNvZGVjLCBOVUxMLCBhbGMyNjJfZml4dXBfdGJsLCBhbGMyNjJfZml4dXBzKTsKKwkJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7CisJfQorCisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgeworCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KKwkJZXJyID0gYWxjMjYyX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWFsY19mcmVlKGNvZGVjKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKKwkJZWxzZSBpZiAoIWVycikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCisJCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGJhc2UgbW9kZS4uLlxuIik7CisJCQlib2FyZF9jb25maWcgPSBBTEMyNjJfQkFTSUM7CisJCX0KKyNlbmRpZgorCX0KKworCWlmIChib2FyZF9jb25maWcgIT0gQUxDX01PREVMX0FVVE8pCisJCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzI2Ml9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCisJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgIXNwZWMtPmFkY19uaWRzICYmIHNwZWMtPmlucHV0X211eCkgeworCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKKwkJYWxjX3JlYnVpbGRfaW11eF9mb3JfYXV0b19taWMoY29kZWMpOworCQlhbGNfcmVtb3ZlX2ludmFsaWRfYWRjX25pZHMoY29kZWMpOworCX0KKworCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5jYXBfbWl4ZXIpCisJCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKKworCWlmICghc3BlYy0+bm9fYW5hbG9nICYmIGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKSB7CisJCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOworCQlpZiAoZXJyIDwgMCkgeworCQkJYWxjX2ZyZWUoY29kZWMpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwYiwgMHgwNSwgSERBX0lOUFVUKTsKKwl9CisKKwlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJPQkUpOworCisJc3BlYy0+dm1hc3Rlcl9uaWQgPSAweDBjOworCisJY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7CisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykKKwkJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CisJc3BlYy0+c2h1dHVwID0gYWxjX2VhcGRfc2h1dHVwOworCisJYWxjX2luaXRfamFja3MoY29kZWMpOworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKwlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCisJCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSBhbGMyNjJfbG9vcGJhY2tzOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBBTEMyNjgKKyAqLworLyogYmluZCBCZWVwIHN3aXRjaGVzIG9mIGJvdGggTklEIDB4MGYgYW5kIDB4MTAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGMyNjhfYmluZF9iZWVwX3N3ID0geworCS5vcHMgPSAmc25kX2hkYV9iaW5kX3N3LAorCS52YWx1ZXMgPSB7CisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwZiwgMywgMSwgSERBX0lOUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDEwLCAzLCAxLCBIREFfSU5QVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfYmVlcF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkJlZXAgUGxheWJhY2sgVm9sdW1lIiwgMHgxZCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX1NXKCJCZWVwIFBsYXliYWNrIFN3aXRjaCIsICZhbGMyNjhfYmluZF9iZWVwX3N3KSwKKwl7IH0KK307CisKKy8qIHNldCBQQ0JFRVAgdm9sID0gMCwgbXV0ZSBjb25uZWN0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjhfYmVlcF9pbml0X3ZlcmJzW10gPSB7CisJezB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7IH0KK307CisKKy8qCisgKiBCSU9TIGF1dG8gY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgaW50IGFsYzI2OF9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OF9zc2lkc1tdID0geyAweDE1LCAweDFiLCAweDE0LCAwIH07CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGVyciA9IGFsY19wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgTlVMTCwgYWxjMjY4X3NzaWRzKTsKKwlpZiAoZXJyID4gMCkgeworCQlpZiAoIXNwZWMtPm5vX2FuYWxvZyAmJiBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSAhPSAweDFkKSB7CisJCQlhZGRfbWl4ZXIoc3BlYywgYWxjMjY4X2JlZXBfbWl4ZXIpOworCQkJYWRkX3ZlcmIoc3BlYywgYWxjMjY4X2JlZXBfaW5pdF92ZXJicyk7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqLworI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUworI2luY2x1ZGUgImFsYzI2OF9xdWlya3MuYyIKKyNlbmRpZgorCitzdGF0aWMgaW50IHBhdGNoX2FsYzI2OChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWM7CisJaW50IGJvYXJkX2NvbmZpZzsKKwlpbnQgaSwgaGFzX2JlZXAsIGVycjsKKworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJLyogQUxDMjY4IGhhcyBubyBhYS1sb29wYmFjayBtaXhlciAqLworCisJYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDMjY4X01PREVMX0xBU1QsCisJCQkJCWFsYzI2OF9tb2RlbHMsIGFsYzI2OF9jZmdfdGJsKTsKKworCWlmIChib2FyZF9jb25maWcgPCAwKQorCQlib2FyZF9jb25maWcgPSBhbGNfYm9hcmRfY29kZWNfc2lkX2NvbmZpZyhjb2RlYywKKwkJCUFMQzI2OF9NT0RFTF9MQVNULCBhbGMyNjhfbW9kZWxzLCBhbGMyNjhfc3NpZF9jZmdfdGJsKTsKKworCWlmIChib2FyZF9jb25maWcgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwKKwkJICAgICAgIGNvZGVjLT5jaGlwX25hbWUpOworCQlib2FyZF9jb25maWcgPSBBTENfTU9ERUxfQVVUTzsKKwl9CisKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7CisJCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLworCQllcnIgPSBhbGMyNjhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJYWxjX2ZyZWUoY29kZWMpOworCQkJcmV0dXJuIGVycjsKKwkJfQorI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUworCQllbHNlIGlmICghZXJyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKKwkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKKwkJCWJvYXJkX2NvbmZpZyA9IEFMQzI2OF8zU1Q7CisJCX0KKyNlbmRpZgorCX0KKworCWlmIChib2FyZF9jb25maWcgIT0gQUxDX01PREVMX0FVVE8pCisJCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzI2OF9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCisJaGFzX2JlZXAgPSAwOworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fbWl4ZXJzOyBpKyspIHsKKwkJaWYgKHNwZWMtPm1peGVyc1tpXSA9PSBhbGMyNjhfYmVlcF9taXhlcikgeworCQkJaGFzX2JlZXAgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaGFzX2JlZXApIHsKKwkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlhbGNfZnJlZShjb2RlYyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmICghcXVlcnlfYW1wX2NhcHMoY29kZWMsIDB4MWQsIEhEQV9JTlBVVCkpCisJCQkvKiBvdmVycmlkZSB0aGUgYW1wIGNhcHMgZm9yIGJlZXAgZ2VuZXJhdG9yICovCisJCQlzbmRfaGRhX292ZXJyaWRlX2FtcF9jYXBzKGNvZGVjLCAweDFkLCBIREFfSU5QVVQsCisJCQkJCSAgKDB4MGMgPDwgQUNfQU1QQ0FQX09GRlNFVF9TSElGVCkgfAorCQkJCQkgICgweDBjIDw8IEFDX0FNUENBUF9OVU1fU1RFUFNfU0hJRlQpIHwKKwkJCQkJICAoMHgwNyA8PCBBQ19BTVBDQVBfU1RFUF9TSVpFX1NISUZUKSB8CisJCQkJCSAgKDAgPDwgQUNfQU1QQ0FQX01VVEVfU0hJRlQpKTsKKwl9CisKKwlpZiAoIXNwZWMtPm5vX2FuYWxvZyAmJiAhc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7CisJCWFsY19hdXRvX2ZpbGxfYWRjX2NhcHMoY29kZWMpOworCQlhbGNfcmVidWlsZF9pbXV4X2Zvcl9hdXRvX21pYyhjb2RlYyk7CisJCWFsY19yZW1vdmVfaW52YWxpZF9hZGNfbmlkcyhjb2RlYyk7CisJfQorCisJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgIXNwZWMtPmNhcF9taXhlcikKKwkJc2V0X2NhcHR1cmVfbWl4ZXIoY29kZWMpOworCisJc3BlYy0+dm1hc3Rlcl9uaWQgPSAweDAyOworCisJY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7CisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykKKwkJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CisJc3BlYy0+c2h1dHVwID0gYWxjX2VhcGRfc2h1dHVwOworCisJYWxjX2luaXRfamFja3MoY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBTEMyNjkKKyAqLworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKyNkZWZpbmUgYWxjMjY5X2xvb3BiYWNrcwlhbGM4ODBfbG9vcGJhY2tzCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBhbGMyNjlfNDRrX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSA4LAorCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwLCAvKiBmaXhlZCByYXRlICovCisJLyogTklEIGlzIHNldCBpbiBhbGNfYnVpbGRfcGNtcyAqLworCS5vcHMgPSB7CisJCS5vcGVuID0gYWxjX3BsYXliYWNrX3BjbV9vcGVuLAorCQkucHJlcGFyZSA9IGFsY19wbGF5YmFja19wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSBhbGNfcGxheWJhY2tfcGNtX2NsZWFudXAKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBhbGMyNjlfNDRrX3BjbV9hbmFsb2dfY2FwdHVyZSA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDQxMDAsIC8qIGZpeGVkIHJhdGUgKi8KKwkvKiBOSUQgaXMgc2V0IGluIGFsY19idWlsZF9wY21zICovCit9OworCisjaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQorc3RhdGljIGludCBhbGMyNjlfbWljMl9mb3JfbXV0ZV9sZWQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3dpdGNoIChjb2RlYy0+c3Vic3lzdGVtX2lkKSB7CisJY2FzZSAweDEwM2MxNTg2OgorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxjMjY5X21pYzJfbXV0ZV9jaGVja19wcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKK3sKKwkvKiB1cGRhdGUgbXV0ZS1MRUQgYWNjb3JkaW5nIHRvIHRoZSBzcGVha2VyIG11dGUgc3RhdGUgKi8KKwlpZiAobmlkID09IDB4MDEgfHwgbmlkID09IDB4MTQpIHsKKwkJaW50IHBpbnZhbDsKKwkJaWYgKHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoY29kZWMsIDB4MTQsIDAsIEhEQV9PVVRQVVQsIDApICYKKwkJICAgIEhEQV9BTVBfTVVURSkKKwkJCXBpbnZhbCA9IDB4MjQ7CisJCWVsc2UKKwkJCXBpbnZhbCA9IDB4MjA7CisJCS8qIG1pYzIgdnJlZiBwaW4gaXMgdXNlZCBmb3IgbXV0ZSBMRUQgY29udHJvbCAqLworCQlzbmRfaGRhX2NvZGVjX3VwZGF0ZV9jYWNoZShjb2RlYywgMHgxOSwgMCwKKwkJCQkJICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJCQkgICBwaW52YWwpOworCX0KKwlyZXR1cm4gYWxjX2NoZWNrX3Bvd2VyX3N0YXR1cyhjb2RlYywgbmlkKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFICovCisKKy8qIGRpZmZlcmVudCBhbGMyNjktdmFyaWFudHMgKi8KK2VudW0geworCUFMQzI2OV9UWVBFX0FMQzI2OVZBLAorCUFMQzI2OV9UWVBFX0FMQzI2OVZCLAorCUFMQzI2OV9UWVBFX0FMQzI2OVZDLAorfTsKKworLyoKKyAqIEJJT1MgYXV0byBjb25maWd1cmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgYWxjMjY5X3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY5X2lnbm9yZVtdID0geyAweDFkLCAwIH07CisJc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjlfc3NpZHNbXSA9IHsgMCwgMHgxYiwgMHgxNCwgMHgyMSB9OworCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY5dmFfc3NpZHNbXSA9IHsgMHgxNSwgMHgxYiwgMHgxNCwgMCB9OworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWNvbnN0IGhkYV9uaWRfdCAqc3NpZHMgPSBzcGVjLT5jb2RlY192YXJpYW50ID09IEFMQzI2OV9UWVBFX0FMQzI2OVZBID8KKwkJYWxjMjY5dmFfc3NpZHMgOiBhbGMyNjlfc3NpZHM7CisKKwlyZXR1cm4gYWxjX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjLCBhbGMyNjlfaWdub3JlLCBzc2lkcyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI2OV90b2dnbGVfcG93ZXJfb3V0cHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgcG93ZXJfdXApCit7CisJaW50IHZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDA0KTsKKwlpZiAocG93ZXJfdXApCisJCXZhbCB8PSAxIDw8IDExOworCWVsc2UKKwkJdmFsICY9IH4oMSA8PCAxMSk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDA0LCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjlfc2h1dHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxNykKKwkJYWxjMjY5X3RvZ2dsZV9wb3dlcl9vdXRwdXQoY29kZWMsIDApOworCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxOCkgeworCQlhbGMyNjlfdG9nZ2xlX3Bvd2VyX291dHB1dChjb2RlYywgMCk7CisJCW1zbGVlcCgxNTApOworCX0KK30KKworI2lmZGVmIFNORF9IREFfTkVFRFNfUkVTVU1FCitzdGF0aWMgaW50IGFsYzI2OV9yZXN1bWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDAwZmYpID09IDB4MDE4KSB7CisJCWFsYzI2OV90b2dnbGVfcG93ZXJfb3V0cHV0KGNvZGVjLCAwKTsKKwkJbXNsZWVwKDE1MCk7CisJfQorCisJY29kZWMtPnBhdGNoX29wcy5pbml0KGNvZGVjKTsKKworCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxNykgeworCQlhbGMyNjlfdG9nZ2xlX3Bvd2VyX291dHB1dChjb2RlYywgMSk7CisJCW1zbGVlcCgyMDApOworCX0KKworCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxOCkKKwkJYWxjMjY5X3RvZ2dsZV9wb3dlcl9vdXRwdXQoY29kZWMsIDEpOworCisJc25kX2hkYV9jb2RlY19yZXN1bWVfYW1wKGNvZGVjKTsKKwlzbmRfaGRhX2NvZGVjX3Jlc3VtZV9jYWNoZShjb2RlYyk7CisJaGRhX2NhbGxfY2hlY2tfcG93ZXJfc3RhdHVzKGNvZGVjLCAweDAxKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBTTkRfSERBX05FRURTX1JFU1VNRSAqLworCitzdGF0aWMgdm9pZCBhbGMyNjlfZml4dXBfaHdlcShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCit7CisJaW50IGNvZWY7CisKKwlpZiAoYWN0aW9uICE9IEFMQ19GSVhVUF9BQ1RfSU5JVCkKKwkJcmV0dXJuOworCWNvZWYgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgxZSk7CisJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDFlLCBjb2VmIHwgMHg4MCk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI3MV9maXh1cF9kbWljKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGFsY19maXh1cCAqZml4LCBpbnQgYWN0aW9uKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgdmVyYnNbXSA9IHsKKwkJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MGR9LAorCQl7MHgyMCwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDQwMDB9LAorCQl7fQorCX07CisJdW5zaWduZWQgaW50IGNmZzsKKworCWlmIChzdHJjbXAoY29kZWMtPmNoaXBfbmFtZSwgIkFMQzI3MVgiKSkKKwkJcmV0dXJuOworCWNmZyA9IHNuZF9oZGFfY29kZWNfZ2V0X3BpbmNmZyhjb2RlYywgMHgxMik7CisJaWYgKGdldF9kZWZjZmdfY29ubmVjdChjZmcpID09IEFDX0pBQ0tfUE9SVF9GSVhFRCkKKwkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgdmVyYnMpOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjlfZml4dXBfcGNtXzQ0ayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgY29uc3Qgc3RydWN0IGFsY19maXh1cCAqZml4LCBpbnQgYWN0aW9uKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWFsYzY2Ml9hdXRvX2luaXRfbXVsdGlfb3V0KGNvZGVjKTsKLQlhbGM2NjJfYXV0b19pbml0X2hwX291dChjb2RlYyk7Ci0JYWxjNjYyX2F1dG9faW5pdF9hbmFsb2dfaW5wdXQoY29kZWMpOwotCWFsYzY2Ml9hdXRvX2luaXRfaW5wdXRfc3JjKGNvZGVjKTsKLQlhbGNfYXV0b19pbml0X2RpZ2l0YWwoY29kZWMpOwotCWlmIChzcGVjLT51bnNvbF9ldmVudCkKLQkJYWxjX2luaXRob29rKGNvZGVjKTsKKworCWlmIChhY3Rpb24gIT0gQUxDX0ZJWFVQX0FDVF9QUk9CRSkKKwkJcmV0dXJuOworCisJLyogRHVlIHRvIGEgaGFyZHdhcmUgcHJvYmxlbSBvbiBMZW5vdm8gSWRlYWRwYWQsIHdlIG5lZWQgdG8KKwkgKiBmaXggdGhlIHNhbXBsZSByYXRlIG9mIGFuYWxvZyBJL08gdG8gNDQuMWtIegorCSAqLworCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmYWxjMjY5XzQ0a19wY21fYW5hbG9nX3BsYXliYWNrOworCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZhbGMyNjlfNDRrX3BjbV9hbmFsb2dfY2FwdHVyZTsKK30KKworZW51bSB7CisJQUxDMjY5X0ZJWFVQX1NPTllfVkFJTywKKwlBTEMyNzVfRklYVVBfU09OWV9WQUlPX0dQSU8yLAorCUFMQzI2OV9GSVhVUF9ERUxMX00xMDFaLAorCUFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFLAorCUFMQzI2OV9GSVhVUF9BU1VTX0c3M0pXLAorCUFMQzI2OV9GSVhVUF9MRU5PVk9fRUFQRCwKKwlBTEMyNzVfRklYVVBfU09OWV9IV0VRLAorCUFMQzI3MV9GSVhVUF9ETUlDLAorCUFMQzI2OV9GSVhVUF9QQ01fNDRLLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgYWxjMjY5X2ZpeHVwc1tdID0geworCVtBTEMyNjlfRklYVVBfU09OWV9WQUlPXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfVkVSQlMsCisJCS52LnZlcmJzID0gKGNvbnN0IHN0cnVjdCBoZGFfdmVyYltdKSB7CisJCQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRkdSRH0sCisJCQl7fQorCQl9CisJfSwKKwlbQUxDMjc1X0ZJWFVQX1NPTllfVkFJT19HUElPMl0gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1ZFUkJTLAorCQkudi52ZXJicyA9IChjb25zdCBzdHJ1Y3QgaGRhX3ZlcmJbXSkgeworCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwNH0sCisJCQl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDR9LAorCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMH0sCisJCQl7IH0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEMyNjlfRklYVVBfU09OWV9WQUlPCisJfSwKKwlbQUxDMjY5X0ZJWFVQX0RFTExfTTEwMVpdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9WRVJCUywKKwkJLnYudmVyYnMgPSAoY29uc3Qgc3RydWN0IGhkYV92ZXJiW10pIHsKKwkJCS8qIEVuYWJsZXMgaW50ZXJuYWwgc3BlYWtlciAqLworCQkJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDEzfSwKKwkJCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIDB4NDA0MH0sCisJCQl7fQorCQl9CisJfSwKKwlbQUxDMjY5X0ZJWFVQX1NLVV9JR05PUkVdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9TS1UsCisJCS52LnNrdSA9IEFMQ19GSVhVUF9TS1VfSUdOT1JFLAorCX0sCisJW0FMQzI2OV9GSVhVUF9BU1VTX0c3M0pXXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTcsIDB4OTkxMzAxMTEgfSwgLyogc3Vid29vZmVyICovCisJCQl7IH0KKwkJfQorCX0sCisJW0FMQzI2OV9GSVhVUF9MRU5PVk9fRUFQRF0gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1ZFUkJTLAorCQkudi52ZXJicyA9IChjb25zdCBzdHJ1Y3QgaGRhX3ZlcmJbXSkgeworCQkJezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAwfSwKKwkJCXt9CisJCX0KKwl9LAorCVtBTEMyNzVfRklYVVBfU09OWV9IV0VRXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfRlVOQywKKwkJLnYuZnVuYyA9IGFsYzI2OV9maXh1cF9od2VxLAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzI3NV9GSVhVUF9TT05ZX1ZBSU9fR1BJTzIKKwl9LAorCVtBTEMyNzFfRklYVVBfRE1JQ10gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX0ZVTkMsCisJCS52LmZ1bmMgPSBhbGMyNzFfZml4dXBfZG1pYywKKwl9LAorCVtBTEMyNjlfRklYVVBfUENNXzQ0S10gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX0ZVTkMsCisJCS52LmZ1bmMgPSBhbGMyNjlfZml4dXBfcGNtXzQ0aywKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2OV9maXh1cF90YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxYTEzLCAiQXN1cyBHNzNKdyIsIEFMQzI2OV9GSVhVUF9BU1VTX0c3M0pXKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDczLCAiU29ueSBWQUlPIiwgQUxDMjc1X0ZJWFVQX1NPTllfVkFJT19HUElPMiksCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTA3YiwgIlNvbnkgVkFJTyIsIEFMQzI3NV9GSVhVUF9TT05ZX0hXRVEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwODQsICJTb255IFZBSU8iLCBBTEMyNzVfRklYVVBfU09OWV9IV0VRKSwKKwlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDEwNGQsICJTb255IFZBSU8iLCBBTEMyNjlfRklYVVBfU09OWV9WQUlPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNDcwLCAiRGVsbCBNMTAxeiIsIEFMQzI2OV9GSVhVUF9ERUxMX00xMDFaKSwKKwlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDEwMjUsICJBY2VyIEFzcGlyZSIsIEFMQzI3MV9GSVhVUF9ETUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMGYyLCAiVGhpbmtwYWQgU0w0MTAvNTEwIiwgQUxDMjY5X0ZJWFVQX1NLVV9JR05PUkUpLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxNWUsICJUaGlua3BhZCBMNTEyIiwgQUxDMjY5X0ZJWFVQX1NLVV9JR05PUkUpLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxYjgsICJUaGlua3BhZCBFZGdlIDE0IiwgQUxDMjY5X0ZJWFVQX1NLVV9JR05PUkUpLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxY2EsICJUaGlua3BhZCBMNDEyIiwgQUxDMjY5X0ZJWFVQX1NLVV9JR05PUkUpLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxZTksICJUaGlua3BhZCBFZGdlIDE1IiwgQUxDMjY5X0ZJWFVQX1NLVV9JR05PUkUpLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNiZjgsICJMZW5vdm8gSWRlYXBkIiwgQUxDMjY5X0ZJWFVQX1BDTV80NEspLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDllNTQsICJMRU5PVk8gTkIiLCBBTEMyNjlfRklYVVBfTEVOT1ZPX0VBUEQpLAorCXt9Cit9OworCisKK3N0YXRpYyBpbnQgYWxjMjY5X2ZpbGxfY29lZihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgdmFsOworCisJaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDAwZmYpIDwgMHgwMTUpIHsKKwkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGYsIDB4OTYwYik7CisJCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHhlLCAweDg4MTcpOworCX0KKworCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxNikgeworCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4ZiwgMHg5NjBiKTsKKwkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGUsIDB4ODgxNCk7CisJfQorCisJaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDAwZmYpID09IDB4MDE3KSB7CisJCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDA0KTsKKwkJLyogUG93ZXIgdXAgb3V0cHV0IHBpbiAqLworCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDQsIHZhbCB8ICgxPDwxMSkpOworCX0KKworCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxOCkgeworCQl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHhkKTsKKwkJaWYgKCh2YWwgJiAweDBjMDApID4+IDEwICE9IDB4MSkgeworCQkJLyogQ2FwbGVzcyByYW1wIHVwIGNsb2NrIGNvbnRyb2wgKi8KKwkJCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHhkLCB2YWwgfCAoMTw8MTApKTsKKwkJfQorCQl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHgxNyk7CisJCWlmICgodmFsICYgMHgwMWMwKSA+PiA2ICE9IDB4NCkgeworCQkJLyogQ2xhc3MgRCBwb3dlciBvbiByZXNldCAqLworCQkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDE3LCB2YWwgfCAoMTw8NykpOworCQl9CisJfQorCisJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4ZCk7IC8qIENsYXNzIEQgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4ZCwgdmFsIHwgKDE8PDE0KSk7CisKKwl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg0KTsgLyogSFAgKi8KKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4NCwgdmFsIHwgKDE8PDExKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqLworI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUworI2luY2x1ZGUgImFsYzI2OV9xdWlya3MuYyIKKyNlbmRpZgorCitzdGF0aWMgaW50IHBhdGNoX2FsYzI2OShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWM7CisJaW50IGJvYXJkX2NvbmZpZywgY29lZjsKKwlpbnQgZXJyOworCisJc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNwZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb2RlYy0+c3BlYyA9IHNwZWM7CisKKwlzcGVjLT5taXhlcl9uaWQgPSAweDBiOworCisJYWxjX2F1dG9fcGFyc2VfY3VzdG9taXplX2RlZmluZShjb2RlYyk7CisKKwlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwMjY5KSB7CisJCXNwZWMtPmNvZGVjX3ZhcmlhbnQgPSBBTEMyNjlfVFlQRV9BTEMyNjlWQTsKKwkJY29lZiA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKTsKKwkJaWYgKChjb2VmICYgMHgwMGYwKSA9PSAweDAwMTApIHsKKwkJCWlmIChjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDI1ICYmCisJCQkgICAgc3BlYy0+Y2RlZmluZS5wbGF0Zm9ybV90eXBlID09IDEpIHsKKwkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjcxWCIpOworCQkJfSBlbHNlIGlmICgoY29lZiAmIDB4ZjAwMCkgPT0gMHgyMDAwKSB7CisJCQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI1OSIpOworCQkJfSBlbHNlIGlmICgoY29lZiAmIDB4ZjAwMCkgPT0gMHgzMDAwKSB7CisJCQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI1OCIpOworCQkJfSBlbHNlIGlmICgoY29lZiAmIDB4ZmZmMCkgPT0gMHgzMDEwKSB7CisJCQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI3NyIpOworCQkJfSBlbHNlIHsKKwkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjY5VkIiKTsKKwkJCX0KKwkJCXNwZWMtPmNvZGVjX3ZhcmlhbnQgPSBBTEMyNjlfVFlQRV9BTEMyNjlWQjsKKwkJfSBlbHNlIGlmICgoY29lZiAmIDB4MDBmMCkgPT0gMHgwMDIwKSB7CisJCQlpZiAoY29lZiA9PSAweGEwMjMpCisJCQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI1OSIpOworCQkJZWxzZSBpZiAoY29lZiA9PSAweDYwMjMpCisJCQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI4MVgiKTsKKwkJCWVsc2UgaWYgKGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDE3YWEgJiYKKwkJCQkgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MjFmMykKKwkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMzIwMiIpOworCQkJZWxzZQorCQkJCWFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyNjlWQyIpOworCQkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI2OVZDOworCQl9IGVsc2UKKwkJCWFsY19maXhfcGxsX2luaXQoY29kZWMsIDB4MjAsIDB4MDQsIDE1KTsKKwkJYWxjMjY5X2ZpbGxfY29lZihjb2RlYyk7CisJfQorCisJYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDMjY5X01PREVMX0xBU1QsCisJCQkJCWFsYzI2OV9tb2RlbHMsIGFsYzI2OV9jZmdfdGJsKTsKKworCWlmIChib2FyZF9jb25maWcgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwKKwkJICAgICAgIGNvZGVjLT5jaGlwX25hbWUpOworCQlib2FyZF9jb25maWcgPSBBTENfTU9ERUxfQVVUTzsKKwl9CisKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7CisJCWFsY19waWNrX2ZpeHVwKGNvZGVjLCBOVUxMLCBhbGMyNjlfZml4dXBfdGJsLCBhbGMyNjlfZml4dXBzKTsKKwkJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7CisJfQorCisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgeworCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KKwkJZXJyID0gYWxjMjY5X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWFsY19mcmVlKGNvZGVjKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKKwkJZWxzZSBpZiAoIWVycikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCisJCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGJhc2UgbW9kZS4uLlxuIik7CisJCQlib2FyZF9jb25maWcgPSBBTEMyNjlfQkFTSUM7CisJCX0KKyNlbmRpZgorCX0KKworCWlmIChib2FyZF9jb25maWcgIT0gQUxDX01PREVMX0FVVE8pCisJCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzI2OV9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCisJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgIXNwZWMtPmFkY19uaWRzICYmIHNwZWMtPmlucHV0X211eCkgeworCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKKwkJYWxjX3JlYnVpbGRfaW11eF9mb3JfYXV0b19taWMoY29kZWMpOworCQlhbGNfcmVtb3ZlX2ludmFsaWRfYWRjX25pZHMoY29kZWMpOworCX0KKworCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5jYXBfbWl4ZXIpCisJCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKKworCWlmICghc3BlYy0+bm9fYW5hbG9nICYmIGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKSB7CisJCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOworCQlpZiAoZXJyIDwgMCkgeworCQkJYWxjX2ZyZWUoY29kZWMpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwYiwgMHgwNCwgSERBX0lOUFVUKTsKKwl9CisKKwlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJPQkUpOworCisJc3BlYy0+dm1hc3Rlcl9uaWQgPSAweDAyOworCisJY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7CisjaWZkZWYgU05EX0hEQV9ORUVEU19SRVNVTUUKKwljb2RlYy0+cGF0Y2hfb3BzLnJlc3VtZSA9IGFsYzI2OV9yZXN1bWU7CisjZW5kaWYKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKQorCQlzcGVjLT5pbml0X2hvb2sgPSBhbGNfYXV0b19pbml0X3N0ZDsKKwlzcGVjLT5zaHV0dXAgPSBhbGMyNjlfc2h1dHVwOworCisJYWxjX2luaXRfamFja3MoY29kZWMpOworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKwlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCisJCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSBhbGMyNjlfbG9vcGJhY2tzOworCWlmIChhbGMyNjlfbWljMl9mb3JfbXV0ZV9sZWQoY29kZWMpKQorCQljb2RlYy0+cGF0Y2hfb3BzLmNoZWNrX3Bvd2VyX3N0YXR1cyA9IGFsYzI2OV9taWMyX211dGVfY2hlY2tfcHM7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKgorICogQUxDODYxCisgKi8KKworc3RhdGljIGludCBhbGM4NjFfcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4NjFfaWdub3JlW10gPSB7IDB4MWQsIDAgfTsKKwlzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MV9zc2lkc1tdID0geyAweDBlLCAweDBmLCAweDBiLCAwIH07CisJcmV0dXJuIGFsY19wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgYWxjODYxX2lnbm9yZSwgYWxjODYxX3NzaWRzKTsKK30KKworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2FtcF9saXN0IGFsYzg2MV9sb29wYmFja3NbXSA9IHsKKwl7IDB4MTUsIEhEQV9JTlBVVCwgMCB9LAorCXsgMHgxNSwgSERBX0lOUFVULCAxIH0sCisJeyAweDE1LCBIREFfSU5QVVQsIDIgfSwKKwl7IDB4MTUsIEhEQV9JTlBVVCwgMyB9LAorCXsgfSAvKiBlbmQgKi8KK307CisjZW5kaWYKKworCisvKiBQaW4gY29uZmlnIGZpeGVzICovCitlbnVtIHsKKwlQSU5GSVhfRlNDX0FNSUxPX1BJMTUwNSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzg2MV9maXh1cHNbXSA9IHsKKwlbUElORklYX0ZTQ19BTUlMT19QSTE1MDVdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKKwkJCXsgMHgwYiwgMHgwMjIxMTAxZiB9LCAvKiBIUCAqLworCQkJeyAweDBmLCAweDkwMTcwMzEwIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgfQorCQl9CisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4NjFfZml4dXBfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDE3MzQsIDB4MTBjNywgIkZTQyBBbWlsbyBQaTE1MDUiLCBQSU5GSVhfRlNDX0FNSUxPX1BJMTUwNSksCisJe30KK307CisKKy8qCisgKi8KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKKyNpbmNsdWRlICJhbGM4NjFfcXVpcmtzLmMiCisjZW5kaWYKKworc3RhdGljIGludCBwYXRjaF9hbGM4NjEoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjOworCWludCBib2FyZF9jb25maWc7CisJaW50IGVycjsKKworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJc3BlYy0+bWl4ZXJfbmlkID0gMHgxNTsKKworICAgICAgICBib2FyZF9jb25maWcgPSBhbGNfYm9hcmRfY29uZmlnKGNvZGVjLCBBTEM4NjFfTU9ERUxfTEFTVCwKKwkJCQkJYWxjODYxX21vZGVscywgYWxjODYxX2NmZ190YmwpOworCisJaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiAlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLAorCQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSk7CisJCWJvYXJkX2NvbmZpZyA9IEFMQ19NT0RFTF9BVVRPOworCX0KKworCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKKwkJYWxjX3BpY2tfZml4dXAoY29kZWMsIE5VTEwsIGFsYzg2MV9maXh1cF90YmwsIGFsYzg2MV9maXh1cHMpOworCQlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJFX1BST0JFKTsKKwl9CisKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7CisJCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLworCQllcnIgPSBhbGM4NjFfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJYWxjX2ZyZWUoY29kZWMpOworCQkJcmV0dXJuIGVycjsKKwkJfQorI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUworCQllbHNlIGlmICghZXJyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKKwkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKKwkJICAgYm9hcmRfY29uZmlnID0gQUxDODYxXzNTVF9ESUc7CisJCX0KKyNlbmRpZgorCX0KKworCWlmIChib2FyZF9jb25maWcgIT0gQUxDX01PREVMX0FVVE8pCisJCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzg2MV9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCisJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgIXNwZWMtPmFkY19uaWRzICYmIHNwZWMtPmlucHV0X211eCkgeworCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKKwkJYWxjX3JlYnVpbGRfaW11eF9mb3JfYXV0b19taWMoY29kZWMpOworCQlhbGNfcmVtb3ZlX2ludmFsaWRfYWRjX25pZHMoY29kZWMpOworCX0KKworCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5jYXBfbWl4ZXIpCisJCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKKworCWlmICghc3BlYy0+bm9fYW5hbG9nKSB7CisJCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDIzKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWFsY19mcmVlKGNvZGVjKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJc2V0X2JlZXBfYW1wKHNwZWMsIDB4MjMsIDAsIEhEQV9PVVRQVVQpOworCX0KKworCXNwZWMtPnZtYXN0ZXJfbmlkID0gMHgwMzsKKworCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUk9CRSk7CisKKwljb2RlYy0+cGF0Y2hfb3BzID0gYWxjX3BhdGNoX29wczsKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7CisJCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKwkJc3BlYy0+cG93ZXJfaG9vayA9IGFsY19wb3dlcl9lYXBkOworI2VuZGlmCisJfQorI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKwlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCisJCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSBhbGM4NjFfbG9vcGJhY2tzOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFMQzg2MS1WRCBzdXBwb3J0CisgKgorICogQmFzZWQgb24gQUxDODgyCisgKgorICogSW4gYWRkaXRpb24sIGFuIGluZGVwZW5kZW50IERBQworICovCisjaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQorI2RlZmluZSBhbGM4NjF2ZF9sb29wYmFja3MJYWxjODgwX2xvb3BiYWNrcworI2VuZGlmCisKK3N0YXRpYyBpbnQgYWxjODYxdmRfcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4NjF2ZF9pZ25vcmVbXSA9IHsgMHgxZCwgMCB9OworCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjODYxdmRfc3NpZHNbXSA9IHsgMHgxNSwgMHgxYiwgMHgxNCwgMCB9OworCXJldHVybiBhbGNfcGFyc2VfYXV0b19jb25maWcoY29kZWMsIGFsYzg2MXZkX2lnbm9yZSwgYWxjODYxdmRfc3NpZHMpOworfQorCitlbnVtIHsKKwlBTEM2NjBWRF9GSVhfQVNVU19HUElPMQorfTsKKworLyogcmVzZXQgR1BJTzEgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzg2MXZkX2ZpeHVwc1tdID0geworCVtBTEM2NjBWRF9GSVhfQVNVU19HUElPMV0gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1ZFUkJTLAorCQkudi52ZXJicyA9IChjb25zdCBzdHJ1Y3QgaGRhX3ZlcmJbXSkgeworCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwM30sCisJCQl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDF9LAorCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMX0sCisJCQl7IH0KKwkJfQorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODYxdmRfZml4dXBfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOSwgIkFTVVMgQTctSyIsIEFMQzY2MFZEX0ZJWF9BU1VTX0dQSU8xKSwKKwl7fQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjB2ZF9lYXBkX3ZlcmJzW10gPSB7CisJezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAorCXsgfQorfTsKKworLyoKKyAqLworI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUworI2luY2x1ZGUgImFsYzg2MXZkX3F1aXJrcy5jIgorI2VuZGlmCisKK3N0YXRpYyBpbnQgcGF0Y2hfYWxjODYxdmQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjOworCWludCBlcnIsIGJvYXJkX2NvbmZpZzsKKworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJc3BlYy0+bWl4ZXJfbmlkID0gMHgwYjsKKworCWJvYXJkX2NvbmZpZyA9IGFsY19ib2FyZF9jb25maWcoY29kZWMsIEFMQzg2MVZEX01PREVMX0xBU1QsCisJCQkJCWFsYzg2MXZkX21vZGVscywgYWxjODYxdmRfY2ZnX3RibCk7CisKKwlpZiAoYm9hcmRfY29uZmlnIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCisJCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lKTsKKwkJYm9hcmRfY29uZmlnID0gQUxDX01PREVMX0FVVE87CisJfQorCisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgeworCQlhbGNfcGlja19maXh1cChjb2RlYywgTlVMTCwgYWxjODYxdmRfZml4dXBfdGJsLCBhbGM4NjF2ZF9maXh1cHMpOworCQlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJFX1BST0JFKTsKKwl9CisKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7CisJCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLworCQllcnIgPSBhbGM4NjF2ZF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlhbGNfZnJlZShjb2RlYyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisjaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCisJCWVsc2UgaWYgKCFlcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgorCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBiYXNlIG1vZGUuLi5cbiIpOworCQkJYm9hcmRfY29uZmlnID0gQUxDODYxVkRfM1NUOworCQl9CisjZW5kaWYKKwl9CisKKwlpZiAoYm9hcmRfY29uZmlnICE9IEFMQ19NT0RFTF9BVVRPKQorCQlzZXR1cF9wcmVzZXQoY29kZWMsICZhbGM4NjF2ZF9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCisJaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMGVjMDY2MCkgeworCQkvKiBhbHdheXMgdHVybiBvbiBFQVBEICovCisJCWFkZF92ZXJiKHNwZWMsIGFsYzY2MHZkX2VhcGRfdmVyYnMpOworCX0KKworCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKKwkJYWxjX2F1dG9fZmlsbF9hZGNfY2Fwcyhjb2RlYyk7CisJCWFsY19yZWJ1aWxkX2ltdXhfZm9yX2F1dG9fbWljKGNvZGVjKTsKKwkJYWxjX3JlbW92ZV9pbnZhbGlkX2FkY19uaWRzKGNvZGVjKTsKKwl9CisKKwlpZiAoIXNwZWMtPm5vX2FuYWxvZyAmJiAhc3BlYy0+Y2FwX21peGVyKQorCQlzZXRfY2FwdHVyZV9taXhlcihjb2RlYyk7CisKKwlpZiAoIXNwZWMtPm5vX2FuYWxvZykgeworCQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgMHgyMyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlhbGNfZnJlZShjb2RlYyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOworCX0KKworCXNwZWMtPnZtYXN0ZXJfbmlkID0gMHgwMjsKKworCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUk9CRSk7CisKKwljb2RlYy0+cGF0Y2hfb3BzID0gYWxjX3BhdGNoX29wczsKKworCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pCisJCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOworCXNwZWMtPnNodXR1cCA9IGFsY19lYXBkX3NodXR1cDsKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCisJaWYgKCFzcGVjLT5sb29wYmFjay5hbXBsaXN0KQorCQlzcGVjLT5sb29wYmFjay5hbXBsaXN0ID0gYWxjODYxdmRfbG9vcGJhY2tzOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFMQzY2MiBzdXBwb3J0CisgKgorICogQUxDNjYyIGlzIGFsbW9zdCBpZGVudGljYWwgd2l0aCBBTEM4ODAgYnV0IGhhcyBjbGVhbmVyIGFuZCBtb3JlIGZsZXhpYmxlCisgKiBjb25maWd1cmF0aW9uLiAgRWFjaCBwaW4gd2lkZ2V0IGNhbiBjaG9vc2UgYW55IGlucHV0IERBQ3MgYW5kIGEgbWl4ZXIuCisgKiBFYWNoIEFEQyBpcyBjb25uZWN0ZWQgZnJvbSBhIG1peGVyIG9mIGFsbCBpbnB1dHMuICBUaGlzIG1ha2VzIHBvc3NpYmxlCisgKiA2LWNoYW5uZWwgaW5kZXBlbmRlbnQgY2FwdHVyZXMuCisgKgorICogSW4gYWRkaXRpb24sIGFuIGluZGVwZW5kZW50IERBQyBmb3IgdGhlIG11bHRpLXBsYXliYWNrIChub3QgdXNlZCBpbiB0aGlzCisgKiBkcml2ZXIgeWV0KS4KKyAqLworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKKyNkZWZpbmUgYWxjNjYyX2xvb3BiYWNrcwlhbGM4ODBfbG9vcGJhY2tzCisjZW5kaWYKKworLyoKKyAqIEJJT1MgYXV0byBjb25maWd1cmF0aW9uCisgKi8KKworc3RhdGljIGludCBhbGM2NjJfcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM2NjJfaWdub3JlW10gPSB7IDB4MWQsIDAgfTsKKwlzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY2M19zc2lkc1tdID0geyAweDE1LCAweDFiLCAweDE0LCAweDIxIH07CisJc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM2NjJfc3NpZHNbXSA9IHsgMHgxNSwgMHgxYiwgMHgxNCwgMCB9OworCWNvbnN0IGhkYV9uaWRfdCAqc3NpZHM7CisKKwlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwMjcyIHx8IGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMGVjMDY2MyB8fAorCSAgICBjb2RlYy0+dmVuZG9yX2lkID09IDB4MTBlYzA2NjUgfHwgY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwNjcwKQorCQlzc2lkcyA9IGFsYzY2M19zc2lkczsKKwllbHNlCisJCXNzaWRzID0gYWxjNjYyX3NzaWRzOworCXJldHVybiBhbGNfcGFyc2VfYXV0b19jb25maWcoY29kZWMsIGFsYzY2Ml9pZ25vcmUsIHNzaWRzKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjMjcyX2ZpeHVwX21hcmlvKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLApAQCAtMTk0MzUsNiArNTA3MCw3IEBACiAJQUxDMjcyX0ZJWFVQX01BUklPLAogCUFMQzY2Ml9GSVhVUF9DWkNfUDEwVCwKIAlBTEM2NjJfRklYVVBfU0tVX0lHTk9SRSwKKwlBTEM2NjJfRklYVVBfSFBfUlA1ODAwLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgYWxjNjYyX2ZpeHVwc1tdID0gewpAQCAtMTk0NjcsMTIgKzUxMDMsMjIgQEAKIAkJLnR5cGUgPSBBTENfRklYVVBfU0tVLAogCQkudi5za3UgPSBBTENfRklYVVBfU0tVX0lHTk9SRSwKIAl9LAorCVtBTEM2NjJfRklYVVBfSFBfUlA1ODAwXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTQsIDB4MDIyMTIwMWYgfSwgLyogSFAgb3V0ICovCisJCQl7IH0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfU0tVX0lHTk9SRQorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjNjYyX2ZpeHVwX3RibFtdID0gewogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAzMDgsICJBY2VyIEFzcGlyZSA4OTQyRyIsIEFMQzY2Ml9GSVhVUF9BU1BJUkUpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAzMWMsICJHYXRld2F5IE5WNzkiLCBBTEM2NjJfRklYVVBfU0tVX0lHTk9SRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDM4YiwgIkFjZXIgQXNwaXJlIDg5NDNHIiwgQUxDNjYyX0ZJWFVQX0FTUElSRSksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MTYzMiwgIkhQIFJQNTgwMCIsIEFMQzY2Ml9GSVhVUF9IUF9SUDU4MDApLAogCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGMwNTEsICJTYW1zdW5nIFI3MjAiLCBBTEM2NjJfRklYVVBfSURFQVBBRCksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MzhhZiwgIkxlbm92byBJZGVhcGFkIFk1NTBQIiwgQUxDNjYyX0ZJWFVQX0lERUFQQUQpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNhMGQsICJMZW5vdm8gSWRlYXBhZCBZNTUwIiwgQUxDNjYyX0ZJWFVQX0lERUFQQUQpLApAQCAtMTk0ODYsNiArNTEzMiwxMiBAQAogfTsKIAogCisvKgorICovCisjaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCisjaW5jbHVkZSAiYWxjNjYyX3F1aXJrcy5jIgorI2VuZGlmCisKIHN0YXRpYyBpbnQgcGF0Y2hfYWxjNjYyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKQEAgLTE5NDk4LDYgKzUxNTAsOCBAQAogCiAJY29kZWMtPnNwZWMgPSBzcGVjOwogCisJc3BlYy0+bWl4ZXJfbmlkID0gMHgwYjsKKwogCWFsY19hdXRvX3BhcnNlX2N1c3RvbWl6ZV9kZWZpbmUoY29kZWMpOwogCiAJYWxjX2ZpeF9wbGxfaW5pdChjb2RlYywgMHgyMCwgMHgwNCwgMTUpOwpAQCAtMTk1MTIsMTYgKzUxNjYsMTUgQEAKIAllbHNlIGlmIChjb2VmID09IDB4NDAxMSkKIAkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzY1NiIpOwogCi0JYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFMQzY2Ml9NT0RFTF9MQVNULAotCQkJCQkJICBhbGM2NjJfbW9kZWxzLAotCQkJICAJICAgICAgICAgICAgICAgICAgYWxjNjYyX2NmZ190YmwpOworCWJvYXJkX2NvbmZpZyA9IGFsY19ib2FyZF9jb25maWcoY29kZWMsIEFMQzY2Ml9NT0RFTF9MQVNULAorCQkJCQlhbGM2NjJfbW9kZWxzLCBhbGM2NjJfY2ZnX3RibCk7CiAJaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiAlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLAogCQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSk7Ci0JCWJvYXJkX2NvbmZpZyA9IEFMQzY2Ml9BVVRPOworCQlib2FyZF9jb25maWcgPSBBTENfTU9ERUxfQVVUTzsKIAl9CiAKLQlpZiAoYm9hcmRfY29uZmlnID09IEFMQzY2Ml9BVVRPKSB7CisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewogCQlhbGNfcGlja19maXh1cChjb2RlYywgYWxjNjYyX2ZpeHVwX21vZGVscywKIAkJCSAgICAgICBhbGM2NjJfZml4dXBfdGJsLCBhbGM2NjJfZml4dXBzKTsKIAkJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7CkBAIC0xOTUzMCw0MiArNTE4MywzNSBAQAogCQlpZiAoZXJyIDwgMCkgewogCQkJYWxjX2ZyZWUoY29kZWMpOwogCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIGlmICghZXJyKSB7CisJCX0KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKKwkJZWxzZSBpZiAoIWVycikgewogCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkJICAgICAgICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCiAJCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGJhc2UgbW9kZS4uLlxuIik7CiAJCQlib2FyZF9jb25maWcgPSBBTEM2NjJfM1NUXzJjaF9ESUc7CiAJCX0KKyNlbmRpZgogCX0KIAotCWlmIChoYXNfY2RlZmluZV9iZWVwKGNvZGVjKSkgeworCWlmIChib2FyZF9jb25maWcgIT0gQUxDX01PREVMX0FVVE8pCisJCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzY2Ml9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCisJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgIXNwZWMtPmFkY19uaWRzICYmIHNwZWMtPmlucHV0X211eCkgeworCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKKwkJYWxjX3JlYnVpbGRfaW11eF9mb3JfYXV0b19taWMoY29kZWMpOworCQlhbGNfcmVtb3ZlX2ludmFsaWRfYWRjX25pZHMoY29kZWMpOworCX0KKworCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5jYXBfbWl4ZXIpCisJCXNldF9jYXB0dXJlX21peGVyKGNvZGVjKTsKKworCWlmICghc3BlYy0+bm9fYW5hbG9nICYmIGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKSB7CiAJCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJYWxjX2ZyZWUoY29kZWMpOwogCQkJcmV0dXJuIGVycjsKIAkJfQotCX0KLQotCWlmIChib2FyZF9jb25maWcgIT0gQUxDNjYyX0FVVE8pCi0JCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzY2Ml9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOwotCi0Jc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZhbGM2NjJfcGNtX2FuYWxvZ19wbGF5YmFjazsKLQlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmYWxjNjYyX3BjbV9hbmFsb2dfY2FwdHVyZTsKLQotCXNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrID0gJmFsYzY2Ml9wY21fZGlnaXRhbF9wbGF5YmFjazsKLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlID0gJmFsYzY2Ml9wY21fZGlnaXRhbF9jYXB0dXJlOwotCi0JaWYgKCFzcGVjLT5hZGNfbmlkcykgewotCQlzcGVjLT5hZGNfbmlkcyA9IGFsYzY2Ml9hZGNfbmlkczsKLQkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM2NjJfYWRjX25pZHMpOwotCX0KLQlpZiAoIXNwZWMtPmNhcHNyY19uaWRzKQotCQlzcGVjLT5jYXBzcmNfbmlkcyA9IGFsYzY2Ml9jYXBzcmNfbmlkczsKLQotCWlmICghc3BlYy0+Y2FwX21peGVyKQotCQlzZXRfY2FwdHVyZV9taXhlcihjb2RlYyk7Ci0KLQlpZiAoaGFzX2NkZWZpbmVfYmVlcChjb2RlYykpIHsKIAkJc3dpdGNoIChjb2RlYy0+dmVuZG9yX2lkKSB7CiAJCWNhc2UgMHgxMGVjMDY2MjoKIAkJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwpAQCAtMTk1ODUsOCArNTIzMSw4IEBACiAJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BST0JFKTsKIAogCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOwotCWlmIChib2FyZF9jb25maWcgPT0gQUxDNjYyX0FVVE8pCi0JCXNwZWMtPmluaXRfaG9vayA9IGFsYzY2Ml9hdXRvX2luaXQ7CisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykKKwkJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CiAJc3BlYy0+c2h1dHVwID0gYWxjX2VhcGRfc2h1dHVwOwogCiAJYWxjX2luaXRfamFja3MoY29kZWMpOwpAQCAtMTk2MjgsMzg5ICs1Mjc0LDE3IEBACiAvKgogICogQUxDNjgwIHN1cHBvcnQKICAqLwotI2RlZmluZSBBTEM2ODBfRElHSU5fTklECUFMQzg4MF9ESUdJTl9OSUQKLSNkZWZpbmUgQUxDNjgwX0RJR09VVF9OSUQJQUxDODgwX0RJR09VVF9OSUQKLSNkZWZpbmUgYWxjNjgwX21vZGVzCQlhbGMyNjBfbW9kZXMKIAotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM2ODBfZGFjX25pZHNbM10gPSB7Ci0JLyogTG91dDEsIExvdXQyLCBocCAqLwotCTB4MDIsIDB4MDMsIDB4MDQKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjgwX2FkY19uaWRzWzNdID0gewotCS8qIEFEQzAtMiAqLwotCS8qIERNSUMsIE1JQywgTGluZS1pbiovCi0JMHgwNywgMHgwOCwgMHgwOQotfTsKLQotLyoKLSAqIEFuYWxvZyBjYXB0dXJlIEFEQyBjZ2FuZ2UKLSAqLwotc3RhdGljIHZvaWQgYWxjNjgwX3JlY19hdXRvc3dpdGNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOwotCWludCBwaW5fZm91bmQgPSAwOwotCWludCB0eXBlX2ZvdW5kID0gQVVUT19QSU5fTEFTVDsKLQloZGFfbmlkX3QgbmlkOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX2lucHV0czsgaSsrKSB7Ci0JCW5pZCA9IGNmZy0+aW5wdXRzW2ldLnBpbjsKLQkJaWYgKCFpc19qYWNrX2RldGVjdGFibGUoY29kZWMsIG5pZCkpCi0JCQljb250aW51ZTsKLQkJaWYgKHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIG5pZCkpIHsKLQkJCWlmIChjZmctPmlucHV0c1tpXS50eXBlIDwgdHlwZV9mb3VuZCkgewotCQkJCXR5cGVfZm91bmQgPSBjZmctPmlucHV0c1tpXS50eXBlOwotCQkJCXBpbl9mb3VuZCA9IG5pZDsKLQkJCX0KLQkJfQotCX0KLQotCW5pZCA9IDB4MDc7Ci0JaWYgKHBpbl9mb3VuZCkKLQkJc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsIHBpbl9mb3VuZCwgJm5pZCwgMSk7Ci0KLQlpZiAobmlkICE9IHNwZWMtPmN1cl9hZGMpCi0JCV9fc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgc3BlYy0+Y3VyX2FkYywgMSk7Ci0Jc3BlYy0+Y3VyX2FkYyA9IG5pZDsKLQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkLCBzcGVjLT5jdXJfYWRjX3N0cmVhbV90YWcsIDAsCi0JCQkJICAgc3BlYy0+Y3VyX2FkY19mb3JtYXQpOwotfQotCi1zdGF0aWMgaW50IGFsYzY4MF9jYXB0dXJlX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCi0JCQkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGZvcm1hdCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmN1cl9hZGMgPSAweDA3OwotCXNwZWMtPmN1cl9hZGNfc3RyZWFtX3RhZyA9IHN0cmVhbV90YWc7Ci0Jc3BlYy0+Y3VyX2FkY19mb3JtYXQgPSBmb3JtYXQ7Ci0KLQlhbGM2ODBfcmVjX2F1dG9zd2l0Y2goY29kZWMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFsYzY4MF9jYXB0dXJlX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCi0JCQkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgMHgwNyk7Ci0Jc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgMHgwOCk7Ci0Jc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgMHgwOSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gYWxjNjgwX3BjbV9hbmFsb2dfYXV0b19jYXB0dXJlID0gewotCS5zdWJzdHJlYW1zID0gMSwgLyogY2FuIGJlIG92ZXJyaWRkZW4gKi8KLQkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkvKiBOSUQgaXMgc2V0IGluIGFsY19idWlsZF9wY21zICovCi0JLm9wcyA9IHsKLQkJLnByZXBhcmUgPSBhbGM2ODBfY2FwdHVyZV9wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSBhbGM2ODBfY2FwdHVyZV9wY21fY2xlYW51cAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjgwX2Jhc2VfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHg0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxMiwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjgwX2JpbmRfY2FwX3ZvbCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF92b2wsCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA3LCAzLCAwLCBIREFfSU5QVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDgsIDMsIDAsIEhEQV9JTlBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwOSwgMywgMCwgSERBX0lOUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjgwX2JpbmRfY2FwX3N3aXRjaCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDcsIDMsIDAsIEhEQV9JTlBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwOCwgMywgMCwgSERBX0lOUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA5LCAzLCAwLCBIREFfSU5QVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2ODBfbWFzdGVyX2NhcHR1cmVfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIkNhcHR1cmUgVm9sdW1lIiwgJmFsYzY4MF9iaW5kX2NhcF92b2wpLAotCUhEQV9CSU5EX1NXKCJDYXB0dXJlIFN3aXRjaCIsICZhbGM2ODBfYmluZF9jYXBfc3dpdGNoKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY4MF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UICAgfCBBQ19VU1JTUF9FTn0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX01JQ19FVkVOVCAgfCBBQ19VU1JTUF9FTn0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX01JQ19FVkVOVCAgfCBBQ19VU1JTUF9FTn0sCi0KLQl7IH0KLX07Ci0KLS8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzY4MF9iYXNlX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNjsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcubnVtX2lucHV0cyA9IDI7Ci0Jc3BlYy0+YXV0b2NmZy5pbnB1dHNbMF0ucGluID0gMHgxODsKLQlzcGVjLT5hdXRvY2ZnLmlucHV0c1swXS50eXBlID0gQVVUT19QSU5fTUlDOwotCXNwZWMtPmF1dG9jZmcuaW5wdXRzWzFdLnBpbiA9IDB4MTk7Ci0Jc3BlYy0+YXV0b2NmZy5pbnB1dHNbMV0udHlwZSA9IEFVVE9fUElOX0xJTkVfSU47Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgdm9pZCBhbGM2ODBfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCSAgIHVuc2lnbmVkIGludCByZXMpCi17Ci0JaWYgKChyZXMgPj4gMjYpID09IEFMQzg4MF9IUF9FVkVOVCkKLQkJYWxjX2hwX2F1dG9tdXRlKGNvZGVjKTsKLQlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX01JQ19FVkVOVCkKLQkJYWxjNjgwX3JlY19hdXRvc3dpdGNoKGNvZGVjKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjNjgwX2luaXRob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7Ci0JYWxjNjgwX3JlY19hdXRvc3dpdGNoKGNvZGVjKTsKLX0KLQotLyogY3JlYXRlIGlucHV0IHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIHRoZSBnaXZlbiBwaW4gKi8KLXN0YXRpYyBpbnQgYWxjNjgwX25ld19hbmFsb2dfb3V0cHV0KHN0cnVjdCBhbGNfc3BlYyAqc3BlYywgaGRhX25pZF90IG5pZCwKLQkJCQkgICAgY29uc3QgY2hhciAqY3RsbmFtZSwgaW50IGlkeCkKLXsKLQloZGFfbmlkX3QgZGFjOwotCWludCBlcnI7Ci0KLQlzd2l0Y2ggKG5pZCkgewotCWNhc2UgMHgxNDoKLQkJZGFjID0gMHgwMjsKLQkJYnJlYWs7Ci0JY2FzZSAweDE1OgotCQlkYWMgPSAweDAzOwotCQlicmVhazsKLQljYXNlIDB4MTY6Ci0JCWRhYyA9IDB4MDQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF0gIT0gZGFjICYmCi0JICAgIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzFdICE9IGRhYykgewotCQllcnIgPSBhZGRfcGJfdm9sX2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBjdGxuYW1lLAotCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChkYWMsIDMsIGlkeCwKLQkJCQkJCSAgICAgIEhEQV9PVVRQVVQpKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCi0JCWVyciA9IGFkZF9wYl9zd19jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIGN0bG5hbWUsCi0JCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCBpZHgsIEhEQV9PVVRQVVQpKTsKLQotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MrK10gPSBkYWM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmcm9tIHRoZSBwYXJzZWQgREFDIHRhYmxlICovCi1zdGF0aWMgaW50IGFsYzY4MF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCi0JCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCWhkYV9uaWRfdCBuaWQ7Ci0JaW50IGVycjsKLQotCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gc3BlYy0+cHJpdmF0ZV9kYWNfbmlkczsKLQotCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1swXTsKLQlpZiAobmlkKSB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0JCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpCi0JCQluYW1lID0gIlNwZWFrZXIiOwotCQllbHNlCi0JCQluYW1lID0gIkZyb250IjsKLQkJZXJyID0gYWxjNjgwX25ld19hbmFsb2dfb3V0cHV0KHNwZWMsIG5pZCwgbmFtZSwgMCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQluaWQgPSBjZmctPnNwZWFrZXJfcGluc1swXTsKLQlpZiAobmlkKSB7Ci0JCWVyciA9IGFsYzY4MF9uZXdfYW5hbG9nX291dHB1dChzcGVjLCBuaWQsICJTcGVha2VyIiwgMCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JbmlkID0gY2ZnLT5ocF9waW5zWzBdOwotCWlmIChuaWQpIHsKLQkJZXJyID0gYWxjNjgwX25ld19hbmFsb2dfb3V0cHV0KHNwZWMsIG5pZCwgIkhlYWRwaG9uZSIsIDApOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzY4MF9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkJICAgICAgaGRhX25pZF90IG5pZCwgaW50IHBpbl90eXBlKQotewotCWFsY19zZXRfcGluX291dHB1dChjb2RlYywgbmlkLCBwaW5fdHlwZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzY4MF9hdXRvX2luaXRfbXVsdGlfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF07Ci0JaWYgKG5pZCkgewotCQlpbnQgcGluX3R5cGUgPSBnZXRfcGluX3R5cGUoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlKTsKLQkJYWxjNjgwX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBuaWQsIHBpbl90eXBlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzY4MF9hdXRvX2luaXRfaHBfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBwaW47Ci0KLQlwaW4gPSBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF07Ci0JaWYgKHBpbikKLQkJYWxjNjgwX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9IUCk7Ci0JcGluID0gc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF07Ci0JaWYgKHBpbikKLQkJYWxjNjgwX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9PVVQpOwotfQotCi0vKiBwY20gY29uZmlndXJhdGlvbjogaWRlbnRpY2FsIHdpdGggQUxDODgwICovCi0jZGVmaW5lIGFsYzY4MF9wY21fYW5hbG9nX3BsYXliYWNrCWFsYzg4MF9wY21fYW5hbG9nX3BsYXliYWNrCi0jZGVmaW5lIGFsYzY4MF9wY21fYW5hbG9nX2NhcHR1cmUJYWxjODgwX3BjbV9hbmFsb2dfY2FwdHVyZQotI2RlZmluZSBhbGM2ODBfcGNtX2FuYWxvZ19hbHRfY2FwdHVyZQlhbGM4ODBfcGNtX2FuYWxvZ19hbHRfY2FwdHVyZQotI2RlZmluZSBhbGM2ODBfcGNtX2RpZ2l0YWxfcGxheWJhY2sJYWxjODgwX3BjbV9kaWdpdGFsX3BsYXliYWNrCi0jZGVmaW5lIGFsYzY4MF9wY21fZGlnaXRhbF9jYXB0dXJlCWFsYzg4MF9wY21fZGlnaXRhbF9jYXB0dXJlCi0KLS8qCi0gKiBCSU9TIGF1dG8gY29uZmlndXJhdGlvbgotICovCiBzdGF0aWMgaW50IGFsYzY4MF9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgZXJyOwotCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjgwX2lnbm9yZVtdID0geyAwIH07Ci0KLQllcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywKLQkJCQkJICAgYWxjNjgwX2lnbm9yZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzKSB7Ci0JCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19vdXRzIHx8IHNwZWMtPmF1dG9jZmcuZGlnX2luX3BpbikgewotCQkJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKLQkJCXNwZWMtPm5vX2FuYWxvZyA9IDE7Ci0JCQlnb3RvIGRpZ19vbmx5OwotCQl9Ci0JCXJldHVybiAwOyAvKiBjYW4ndCBmaW5kIHZhbGlkIEJJT1MgcGluIGNvbmZpZyAqLwotCX0KLQllcnIgPSBhbGM2ODBfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0Jc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKLQotIGRpZ19vbmx5OgotCS8qIGRpZ2l0YWwgb25seSBzdXBwb3J0IG91dHB1dCAqLwotCWFsY19hdXRvX3BhcnNlX2RpZ2l0YWwoY29kZWMpOwotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlhZGRfbWl4ZXIoc3BlYywgc3BlYy0+a2N0bHMubGlzdCk7Ci0KLQlhZGRfdmVyYihzcGVjLCBhbGM2ODBfaW5pdF92ZXJicyk7Ci0KLQllcnIgPSBhbGNfYXV0b19hZGRfbWljX2Jvb3N0KGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiAxOwotfQotCi0jZGVmaW5lIGFsYzY4MF9hdXRvX2luaXRfYW5hbG9nX2lucHV0CWFsYzg4Ml9hdXRvX2luaXRfYW5hbG9nX2lucHV0Ci0KLS8qIGluaXQgY2FsbGJhY2sgZm9yIGF1dG8tY29uZmlndXJhdGlvbiBtb2RlbCAtLSBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IGluaXQgKi8KLXN0YXRpYyB2b2lkIGFsYzY4MF9hdXRvX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JYWxjNjgwX2F1dG9faW5pdF9tdWx0aV9vdXQoY29kZWMpOwotCWFsYzY4MF9hdXRvX2luaXRfaHBfb3V0KGNvZGVjKTsKLQlhbGM2ODBfYXV0b19pbml0X2FuYWxvZ19pbnB1dChjb2RlYyk7Ci0JYWxjX2F1dG9faW5pdF9kaWdpdGFsKGNvZGVjKTsKLQlpZiAoc3BlYy0+dW5zb2xfZXZlbnQpCi0JCWFsY19pbml0aG9vayhjb2RlYyk7CisJcmV0dXJuIGFsY19wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgTlVMTCwgTlVMTCk7CiB9CiAKIC8qCi0gKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGM2ODBfbW9kZWxzW0FMQzY4MF9NT0RFTF9MQVNUXSA9IHsKLQlbQUxDNjgwX0JBU0VdCQk9ICJiYXNlIiwKLQlbQUxDNjgwX0FVVE9dCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM2ODBfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyZjMsICJBU1VTIE5YOTAiLCBBTEM2ODBfQkFTRSksCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjNjgwX3ByZXNldHNbXSA9IHsKLQlbQUxDNjgwX0JBU0VdID0gewotCQkubWl4ZXJzID0geyBhbGM2ODBfYmFzZV9taXhlciB9LAotCQkuY2FwX21peGVyID0gIGFsYzY4MF9tYXN0ZXJfY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY4MF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjgwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjgwX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2ODBfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY4MF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2ODBfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsYzY4MF91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjgwX2Jhc2Vfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGM2ODBfaW5pdGhvb2ssCi0KLQl9LAotfTsKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKKyNpbmNsdWRlICJhbGM2ODBfcXVpcmtzLmMiCisjZW5kaWYKIAogc3RhdGljIGludCBwYXRjaF9hbGM2ODAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CkBAIC0yMDAyNCw1MSArNTI5OCw1NSBAQAogCiAJY29kZWMtPnNwZWMgPSBzcGVjOwogCi0JYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFMQzY4MF9NT0RFTF9MQVNULAotCQkJCQkJICBhbGM2ODBfbW9kZWxzLAotCQkJCQkJICBhbGM2ODBfY2ZnX3RibCk7CisJLyogQUxDNjgwIGhhcyBubyBhYS1sb29wYmFjayBtaXhlciAqLwogCi0JaWYgKGJvYXJkX2NvbmZpZyA8IDAgfHwgYm9hcmRfY29uZmlnID49IEFMQzY4MF9NT0RFTF9MQVNUKSB7CisJYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDNjgwX01PREVMX0xBU1QsCisJCQkJCWFsYzY4MF9tb2RlbHMsIGFsYzY4MF9jZmdfdGJsKTsKKworCWlmIChib2FyZF9jb25maWcgPCAwKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwKIAkJICAgICAgIGNvZGVjLT5jaGlwX25hbWUpOwotCQlib2FyZF9jb25maWcgPSBBTEM2ODBfQVVUTzsKKwkJYm9hcmRfY29uZmlnID0gQUxDX01PREVMX0FVVE87CiAJfQogCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEM2ODBfQVVUTykgeworCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKIAkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCiAJCWVyciA9IGFsYzY4MF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlhbGNfZnJlZShjb2RlYyk7CiAJCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgaWYgKCFlcnIpIHsKKwkJfQorI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUworCQllbHNlIGlmICghZXJyKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKIAkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKIAkJCWJvYXJkX2NvbmZpZyA9IEFMQzY4MF9CQVNFOwogCQl9CisjZW5kaWYKIAl9CiAKLQlpZiAoYm9hcmRfY29uZmlnICE9IEFMQzY4MF9BVVRPKQorCWlmIChib2FyZF9jb25maWcgIT0gQUxDX01PREVMX0FVVE8pIHsKIAkJc2V0dXBfcHJlc2V0KGNvZGVjLCAmYWxjNjgwX3ByZXNldHNbYm9hcmRfY29uZmlnXSk7Ci0KLQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJmFsYzY4MF9wY21fYW5hbG9nX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZhbGM2ODBfcGNtX2FuYWxvZ19hdXRvX2NhcHR1cmU7Ci0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmYWxjNjgwX3BjbV9kaWdpdGFsX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUgPSAmYWxjNjgwX3BjbV9kaWdpdGFsX2NhcHR1cmU7Ci0KLQlpZiAoIXNwZWMtPmFkY19uaWRzKSB7Ci0JCXNwZWMtPmFkY19uaWRzID0gYWxjNjgwX2FkY19uaWRzOwotCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzY4MF9hZGNfbmlkcyk7CisjaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCisJCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZhbGM2ODBfcGNtX2FuYWxvZ19hdXRvX2NhcHR1cmU7CisjZW5kaWYKIAl9CiAKLQlpZiAoIXNwZWMtPmNhcF9taXhlcikKKwlpZiAoIXNwZWMtPm5vX2FuYWxvZyAmJiAhc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7CisJCWFsY19hdXRvX2ZpbGxfYWRjX2NhcHMoY29kZWMpOworCQlhbGNfcmVidWlsZF9pbXV4X2Zvcl9hdXRvX21pYyhjb2RlYyk7CisJCWFsY19yZW1vdmVfaW52YWxpZF9hZGNfbmlkcyhjb2RlYyk7CisJfQorCisJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgIXNwZWMtPmNhcF9taXhlcikKIAkJc2V0X2NhcHR1cmVfbWl4ZXIoY29kZWMpOwogCiAJc3BlYy0+dm1hc3Rlcl9uaWQgPSAweDAyOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7Ci0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEM2ODBfQVVUTykKLQkJc3BlYy0+aW5pdF9ob29rID0gYWxjNjgwX2F1dG9faW5pdDsKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKQorCQlzcGVjLT5pbml0X2hvb2sgPSBhbGNfYXV0b19pbml0X3N0ZDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IDdmODFjYzIuLjU2NDI1YTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTExMTIsNyArMTExMiw5IEBACiAJfQogCiAJaWYgKHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKSB7Ci0JCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX291dF9jdGxzKGNvZGVjLCBzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCk7CisJCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX291dF9jdGxzKGNvZGVjLAorCQkJCQkJICAgIHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkLAorCQkJCQkJICAgIHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9zaGFyZV9zdyhjb2RlYywKQEAgLTM0MDYsMzAgKzM0MDgsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdldF9jb25uZWN0aW9uX2luZGV4KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbXV4LAotCQkJCWhkYV9uaWRfdCBuaWQpCi17Ci0JaGRhX25pZF90IGNvbm5bSERBX01BWF9OVU1fSU5QVVRTXTsKLQlpbnQgaSwgbnVtczsKLQotCWlmICghKGdldF93Y2Fwcyhjb2RlYywgbXV4KSAmIEFDX1dDQVBfQ09OTl9MSVNUKSkKLQkJcmV0dXJuIC0xOwotCi0JbnVtcyA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBtdXgsIGNvbm4sIEFSUkFZX1NJWkUoY29ubikpOwotCWZvciAoaSA9IDA7IGkgPCBudW1zOyBpKyspCi0JCWlmIChjb25uW2ldID09IG5pZCkKLQkJCXJldHVybiBpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bXM7IGkrKykgewotCQl1bnNpZ25lZCBpbnQgd2lkX2NhcHMgPSBnZXRfd2NhcHMoY29kZWMsIGNvbm5baV0pOwotCQl1bnNpZ25lZCBpbnQgd2lkX3R5cGUgPSBnZXRfd2NhcHNfdHlwZSh3aWRfY2Fwcyk7Ci0KLQkJaWYgKHdpZF90eXBlICE9IEFDX1dJRF9QSU4gJiYgd2lkX3R5cGUgIT0gQUNfV0lEX0FVRF9NSVgpCi0JCQlpZiAoZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIGNvbm5baV0sIG5pZCkgPj0gMCkKLQkJCQlyZXR1cm4gaTsKLQl9Ci0JcmV0dXJuIC0xOwotfQorLyogbG9vayBmb3IgTklEIHJlY3Vyc2l2ZWx5ICovCisjZGVmaW5lIGdldF9jb25uZWN0aW9uX2luZGV4KGNvZGVjLCBtdXgsIG5pZCkgXAorCXNuZF9oZGFfZ2V0X2Nvbm5faW5kZXgoY29kZWMsIG11eCwgbmlkLCAxKQogCiAvKiBjcmVhdGUgYSB2b2x1bWUgYXNzaWduZWQgdG8gdGhlIGdpdmVuIHBpbiAob25seSBpZiBzdXBwb3J0ZWQpICovCiAvKiByZXR1cm4gMSBpZiB0aGUgdm9sdW1lIGNvbnRyb2wgaXMgY3JlYXRlZCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKaW5kZXggNjA1Yzk5ZS4uZjM4MTYwYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCkBAIC01NCwzNiArNTQsMTAgQEAKICNpbmNsdWRlICJoZGFfY29kZWMuaCIKICNpbmNsdWRlICJoZGFfbG9jYWwuaCIKIAotI2RlZmluZSBOSURfTUFQUElORwkJKC0xKQotCi0vKiBhbXAgdmFsdWVzICovCi0jZGVmaW5lIEFNUF9WQUxfSURYX1NISUZUCTE5Ci0jZGVmaW5lIEFNUF9WQUxfSURYX01BU0sJKDB4MGY8PDE5KQotCiAvKiBQaW4gV2lkZ2V0IE5JRCAqLwotI2RlZmluZSBWVDE3MDhfSFBfTklECQkweDEzCi0jZGVmaW5lIFZUMTcwOF9ESUdPVVRfTklECTB4MTQKLSNkZWZpbmUgVlQxNzA4X0RJR0lOX05JRAkweDE2Ci0jZGVmaW5lIFZUMTcwOF9ESUdJTl9QSU4JMHgyNgogI2RlZmluZSBWVDE3MDhfSFBfUElOX05JRAkweDIwCiAjZGVmaW5lIFZUMTcwOF9DRF9QSU5fTklECTB4MjQKIAotI2RlZmluZSBWVDE3MDlfSFBfREFDX05JRAkweDI4Ci0jZGVmaW5lIFZUMTcwOV9ESUdPVVRfTklECTB4MTMKLSNkZWZpbmUgVlQxNzA5X0RJR0lOX05JRAkweDE3Ci0jZGVmaW5lIFZUMTcwOV9ESUdJTl9QSU4JMHgyNQotCi0jZGVmaW5lIFZUMTcwOEJfSFBfTklECQkweDI1Ci0jZGVmaW5lIFZUMTcwOEJfRElHT1VUX05JRAkweDEyCi0jZGVmaW5lIFZUMTcwOEJfRElHSU5fTklECTB4MTUKLSNkZWZpbmUgVlQxNzA4Ql9ESUdJTl9QSU4JMHgyMQotCi0jZGVmaW5lIFZUMTcwOFNfSFBfTklECQkweDI1Ci0jZGVmaW5lIFZUMTcwOFNfRElHT1VUX05JRAkweDEyCi0KLSNkZWZpbmUgVlQxNzAyX0hQX05JRAkJMHgxNwotI2RlZmluZSBWVDE3MDJfRElHT1VUX05JRAkweDExCi0KIGVudW0gVklBX0hEQV9DT0RFQyB7CiAJVU5LTk9XTiA9IC0xLAogCVZUMTcwOCwKQEAgLTEwNyw2ICs4MSwzOSBAQAogCSAoc3BlYyktPmNvZGVjX3R5cGUgPT0gVlQxODEyIHx8XAogCSAoc3BlYyktPmNvZGVjX3R5cGUgPT0gVlQxODAyKQogCisjZGVmaW5lIE1BWF9OSURfUEFUSF9ERVBUSAk1CisKKy8qIG91dHB1dC1wYXRoOiBEQUMgLT4gLi4uIC0+IHBpbgorICogaWR4W10gY29udGFpbnMgdGhlIHNvdXJjZSBpbmRleCBudW1iZXIgb2YgdGhlIG5leHQgd2lkZ2V0OworICogZS5nLiBpZHhbMF0gaXMgdGhlIGluZGV4IG9mIHRoZSBEQUMgc2VsZWN0ZWQgYnkgcGF0aFsxXSB3aWRnZXQKKyAqIG11bHRpW10gaW5kaWNhdGVzIHdoZXRoZXIgaXQncyBhIHNlbGVjdG9yIHdpZGdldCB3aXRoIG11bHRpLWNvbm5lY3RvcnMKKyAqIChpLmUuIHRoZSBjb25uZWN0aW9uIHNlbGVjdGlvbiBpcyBtYW5kYXRvcnkpCisgKiB2b2xfY3RsIGFuZCBtdXRlX2N0bCBjb250YWlucyB0aGUgTklEcyBmb3IgdGhlIGFzc2lnbmVkIG1peGVycworICovCitzdHJ1Y3QgbmlkX3BhdGggeworCWludCBkZXB0aDsKKwloZGFfbmlkX3QgcGF0aFtNQVhfTklEX1BBVEhfREVQVEhdOworCXVuc2lnbmVkIGNoYXIgaWR4W01BWF9OSURfUEFUSF9ERVBUSF07CisJdW5zaWduZWQgY2hhciBtdWx0aVtNQVhfTklEX1BBVEhfREVQVEhdOworCXVuc2lnbmVkIGludCB2b2xfY3RsOworCXVuc2lnbmVkIGludCBtdXRlX2N0bDsKK307CisKKy8qIGlucHV0LXBhdGggKi8KK3N0cnVjdCB2aWFfaW5wdXQgeworCWhkYV9uaWRfdCBwaW47CS8qIGlucHV0LXBpbiBvciBhYS1taXggKi8KKwlpbnQgYWRjX2lkeDsJLyogQURDIGluZGV4IHRvIGJlIHVzZWQgKi8KKwlpbnQgbXV4X2lkeDsJLyogTVVYIGluZGV4IChpZiBhbnkpICovCisJY29uc3QgY2hhciAqbGFiZWw7CS8qIGlucHV0LXNvdXJjZSBsYWJlbCAqLworfTsKKworI2RlZmluZSBWSUFfTUFYX0FEQ1MJMworCitlbnVtIHsKKwlTVFJFQU1fTVVMVElfT1VUID0gKDEgPDwgMCksCisJU1RSRUFNX0lOREVQX0hQID0gKDEgPDwgMSksCit9OworCiBzdHJ1Y3QgdmlhX3NwZWMgewogCS8qIGNvZGVjIHBhcmFtZXRlcml6YXRpb24gKi8KIAljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqbWl4ZXJzWzZdOwpAQCAtMTE1LDI4ICsxMjIsNjYgQEAKIAljb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgKmluaXRfdmVyYnNbNV07CiAJdW5zaWduZWQgaW50IG51bV9pdmVyYnM7CiAKLQljaGFyICpzdHJlYW1fbmFtZV9hbmFsb2c7CisJY2hhciBzdHJlYW1fbmFtZV9hbmFsb2dbMzJdOworCWNoYXIgc3RyZWFtX25hbWVfaHBbMzJdOwogCWNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqc3RyZWFtX2FuYWxvZ19wbGF5YmFjazsKIAljb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKnN0cmVhbV9hbmFsb2dfY2FwdHVyZTsKIAotCWNoYXIgKnN0cmVhbV9uYW1lX2RpZ2l0YWw7CisJY2hhciBzdHJlYW1fbmFtZV9kaWdpdGFsWzMyXTsKIAljb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrOwogCWNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqc3RyZWFtX2RpZ2l0YWxfY2FwdHVyZTsKIAogCS8qIHBsYXliYWNrICovCiAJc3RydWN0IGhkYV9tdWx0aV9vdXQgbXVsdGlvdXQ7CiAJaGRhX25pZF90IHNsYXZlX2RpZ19vdXRzWzJdOworCWhkYV9uaWRfdCBocF9kYWNfbmlkOworCWhkYV9uaWRfdCBzcGVha2VyX2RhY19uaWQ7CisJaW50IGhwX2luZGVwX3NoYXJlZDsJLyogaW5kZXAgSFAtREFDIGlzIHNoYXJlZCB3aXRoIHNpZGUgY2ggKi8KKwlpbnQgb3BlbmVkX3N0cmVhbXM7CS8qIFNUUkVBTV8qIGJpdHMgKi8KKwlpbnQgYWN0aXZlX3N0cmVhbXM7CS8qIFNUUkVBTV8qIGJpdHMgKi8KKwlpbnQgYWFtaXhfbW9kZTsJCS8qIGxvb3BiYWNrIGlzIGVuYWJsZWQgZm9yIG91dHB1dC1wYXRoPyAqLworCisJLyogT3V0cHV0LXBhdGhzOgorCSAqIFRoZXJlIGFyZSBkaWZmZXJlbnQgb3V0cHV0LXBhdGhzIGRlcGVuZGluZyBvbiB0aGUgc2V0dXAuCisJICogb3V0X3BhdGgsIGhwX3BhdGggYW5kIHNwZWFrZXJfcGF0aCBhcmUgcHJpbWFyeSBwYXRocy4gIElmIGJvdGgKKwkgKiBkaXJlY3QgREFDIGFuZCBhYS1sb29wYmFjayByb3V0ZXMgYXJlIGF2YWlsYWJsZSwgdGhlc2UgY29udGFpbgorCSAqIHRoZSBmb3JtZXIgcGF0aHMuICBNZWFud2hpbGUgKl9taXhfcGF0aCBjb250YWluIHRoZSBwYXRocyB3aXRoCisJICogbG9vcGJhY2sgbWl4ZXIuICAoU2luY2UgdGhlIGxvb3BiYWNrIGlzIG9ubHkgZm9yIGZyb250IGNoYW5uZWwsCisJICogbm8gb3V0X21peF9wYXRoIGZvciBzdXJyb3VuZCBjaGFubmVscy4pCisJICogVGhlIEhQIG91dHB1dCBoYXMgYW5vdGhlciBwYXRoLCBocF9pbmRlcF9wYXRoLCB3aGljaCBpcyB1c2VkIGluCisJICogdGhlIGluZGVwZW5kZW50LUhQIG1vZGUuCisJICovCisJc3RydWN0IG5pZF9wYXRoIG91dF9wYXRoW0hEQV9TSURFICsgMV07CisJc3RydWN0IG5pZF9wYXRoIG91dF9taXhfcGF0aDsKKwlzdHJ1Y3QgbmlkX3BhdGggaHBfcGF0aDsKKwlzdHJ1Y3QgbmlkX3BhdGggaHBfbWl4X3BhdGg7CisJc3RydWN0IG5pZF9wYXRoIGhwX2luZGVwX3BhdGg7CisJc3RydWN0IG5pZF9wYXRoIHNwZWFrZXJfcGF0aDsKKwlzdHJ1Y3QgbmlkX3BhdGggc3BlYWtlcl9taXhfcGF0aDsKIAogCS8qIGNhcHR1cmUgKi8KIAl1bnNpZ25lZCBpbnQgbnVtX2FkY19uaWRzOwotCWNvbnN0IGhkYV9uaWRfdCAqYWRjX25pZHM7Ci0JaGRhX25pZF90IG11eF9uaWRzWzNdOworCWhkYV9uaWRfdCBhZGNfbmlkc1tWSUFfTUFYX0FEQ1NdOworCWhkYV9uaWRfdCBtdXhfbmlkc1tWSUFfTUFYX0FEQ1NdOworCWhkYV9uaWRfdCBhYV9taXhfbmlkOwogCWhkYV9uaWRfdCBkaWdfaW5fbmlkOwotCWhkYV9uaWRfdCBkaWdfaW5fcGluOwogCiAJLyogY2FwdHVyZSBzb3VyY2UgKi8KLQljb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW5wdXRfbXV4OwotCXVuc2lnbmVkIGludCBjdXJfbXV4WzNdOworCWJvb2wgZHluX2FkY19zd2l0Y2g7CisJaW50IG51bV9pbnB1dHM7CisJc3RydWN0IHZpYV9pbnB1dCBpbnB1dHNbQVVUT19DRkdfTUFYX0lOUyArIDFdOworCXVuc2lnbmVkIGludCBjdXJfbXV4W1ZJQV9NQVhfQURDU107CisKKwkvKiBkeW5hbWljIERBQyBzd2l0Y2hpbmcgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX2RhY19zdHJlYW1fdGFnOworCXVuc2lnbmVkIGludCBjdXJfZGFjX2Zvcm1hdDsKKwl1bnNpZ25lZCBpbnQgY3VyX2hwX3N0cmVhbV90YWc7CisJdW5zaWduZWQgaW50IGN1cl9ocF9mb3JtYXQ7CisKKwkvKiBkeW5hbWljIEFEQyBzd2l0Y2hpbmcgKi8KKwloZGFfbmlkX3QgY3VyX2FkYzsKKwl1bnNpZ25lZCBpbnQgY3VyX2FkY19zdHJlYW1fdGFnOworCXVuc2lnbmVkIGludCBjdXJfYWRjX2Zvcm1hdDsKIAogCS8qIFBDTSBpbmZvcm1hdGlvbiAqLwogCXN0cnVjdCBoZGFfcGNtIHBjbV9yZWNbM107CkBAIC0xNDQsMjggKzE4OSwzOCBAQAogCS8qIGR5bmFtaWMgY29udHJvbHMsIGluaXRfdmVyYnMgYW5kIGlucHV0X211eCAqLwogCXN0cnVjdCBhdXRvX3Bpbl9jZmcgYXV0b2NmZzsKIAlzdHJ1Y3Qgc25kX2FycmF5IGtjdGxzOwotCXN0cnVjdCBoZGFfaW5wdXRfbXV4IHByaXZhdGVfaW11eFsyXTsKIAloZGFfbmlkX3QgcHJpdmF0ZV9kYWNfbmlkc1tBVVRPX0NGR19NQVhfT1VUU107CiAKIAkvKiBIUCBtb2RlIHNvdXJjZSAqLwotCWNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICpocF9tdXg7CiAJdW5zaWduZWQgaW50IGhwX2luZGVwZW5kZW50X21vZGU7Ci0JdW5zaWduZWQgaW50IGhwX2luZGVwZW5kZW50X21vZGVfaW5kZXg7Ci0JdW5zaWduZWQgaW50IHNtYXJ0NTFfZW5hYmxlZDsKIAl1bnNpZ25lZCBpbnQgZG1pY19lbmFibGVkOworCXVuc2lnbmVkIGludCBub19waW5fcG93ZXJfY3RsOwogCWVudW0gVklBX0hEQV9DT0RFQyBjb2RlY190eXBlOwogCisJLyogc21hcnQ1MSBzZXR1cCAqLworCXVuc2lnbmVkIGludCBzbWFydDUxX251bXM7CisJaGRhX25pZF90IHNtYXJ0NTFfcGluc1syXTsKKwlpbnQgc21hcnQ1MV9pZHhzWzJdOworCWNvbnN0IGNoYXIgKnNtYXJ0NTFfbGFiZWxzWzJdOworCXVuc2lnbmVkIGludCBzbWFydDUxX2VuYWJsZWQ7CisKIAkvKiB3b3JrIHRvIGNoZWNrIGhwIGphY2sgc3RhdGUgKi8KIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHZ0MTcwOF9ocF93b3JrOwotCWludCB2dDE3MDhfamFja19kZXRlY3RlY3Q7CisJaW50IHZ0MTcwOF9qYWNrX2RldGVjdDsKIAlpbnQgdnQxNzA4X2hwX3ByZXNlbnQ7CiAKIAl2b2lkICgqc2V0X3dpZGdldHNfcG93ZXJfc3RhdGUpKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKIAotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKIAlzdHJ1Y3QgaGRhX2xvb3BiYWNrX2NoZWNrIGxvb3BiYWNrOwotI2VuZGlmCisJaW50IG51bV9sb29wYmFja3M7CisJc3RydWN0IGhkYV9hbXBfbGlzdCBsb29wYmFja19saXN0WzhdOworCisJLyogYmluZCBjYXB0dXJlLXZvbHVtZSAqLworCXN0cnVjdCBoZGFfYmluZF9jdGxzICpiaW5kX2NhcF92b2w7CisJc3RydWN0IGhkYV9iaW5kX2N0bHMgKmJpbmRfY2FwX3N3OworCisJc3RydWN0IG11dGV4IGNvbmZpZ19tdXRleDsKIH07CiAKIHN0YXRpYyBlbnVtIFZJQV9IREFfQ09ERUMgZ2V0X2NvZGVjX3R5cGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwpAQCAtMTc3LDYgKzIzMiw3IEBACiAJaWYgKHNwZWMgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKKwltdXRleF9pbml0KCZzcGVjLT5jb25maWdfbXV0ZXgpOwogCWNvZGVjLT5zcGVjID0gc3BlYzsKIAlzcGVjLT5jb2RlYyA9IGNvZGVjOwogCXNwZWMtPmNvZGVjX3R5cGUgPSBnZXRfY29kZWNfdHlwZShjb2RlYyk7CkBAIC0yMzcsMzMgKzI5MywyMyBAQAogI2RlZmluZSBWSUFfSkFDS19FVkVOVAkJMHgyMAogI2RlZmluZSBWSUFfSFBfRVZFTlQJCTB4MDEKICNkZWZpbmUgVklBX0dQSU9fRVZFTlQJCTB4MDIKLSNkZWZpbmUgVklBX01PTk9fRVZFTlQJCTB4MDMKLSNkZWZpbmUgVklBX1NQRUFLRVJfRVZFTlQJMHgwNAotI2RlZmluZSBWSUFfQklORF9IUF9FVkVOVAkweDA1CisjZGVmaW5lIFZJQV9MSU5FX0VWRU5UCQkweDAzCiAKIGVudW0gewogCVZJQV9DVExfV0lER0VUX1ZPTCwKIAlWSUFfQ1RMX1dJREdFVF9NVVRFLAogCVZJQV9DVExfV0lER0VUX0FOQUxPR19NVVRFLAotCVZJQV9DVExfV0lER0VUX0JJTkRfUElOX01VVEUsCiB9OwogCi1lbnVtIHsKLQlBVVRPX1NFUV9GUk9OVCA9IDAsCi0JQVVUT19TRVFfU1VSUk9VTkQsCi0JQVVUT19TRVFfQ0VOTEZFLAotCUFVVE9fU0VRX1NJREUKLX07Ci0KLXN0YXRpYyB2b2lkIGFuYWxvZ19sb3dfY3VycmVudF9tb2RlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgc3RyZWFtX2lkbGUpOwotc3RhdGljIGludCBpc19hYV9wYXRoX211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOworc3RhdGljIHZvaWQgYW5hbG9nX2xvd19jdXJyZW50X21vZGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOworc3RhdGljIGJvb2wgaXNfYWFfcGF0aF9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKIAogc3RhdGljIHZvaWQgdnQxNzA4X3N0YXJ0X2hwX3dvcmsoc3RydWN0IHZpYV9zcGVjICpzcGVjKQogewogCWlmIChzcGVjLT5jb2RlY190eXBlICE9IFZUMTcwOCB8fCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPT0gMCkKIAkJcmV0dXJuOwogCXNuZF9oZGFfY29kZWNfd3JpdGUoc3BlYy0+Y29kZWMsIDB4MSwgMCwgMHhmODEsCi0JCQkgICAgIXNwZWMtPnZ0MTcwOF9qYWNrX2RldGVjdGVjdCk7CisJCQkgICAgIXNwZWMtPnZ0MTcwOF9qYWNrX2RldGVjdCk7CiAJaWYgKCFkZWxheWVkX3dvcmtfcGVuZGluZygmc3BlYy0+dnQxNzA4X2hwX3dvcmspKQogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnNwZWMtPnZ0MTcwOF9ocF93b3JrLAogCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CkBAIC0yNzcsNyArMzIzLDcgQEAKIAkgICAgJiYgIWlzX2FhX3BhdGhfbXV0ZShzcGVjLT5jb2RlYykpCiAJCXJldHVybjsKIAlzbmRfaGRhX2NvZGVjX3dyaXRlKHNwZWMtPmNvZGVjLCAweDEsIDAsIDB4ZjgxLAotCQkJICAgICFzcGVjLT52dDE3MDhfamFja19kZXRlY3RlY3QpOworCQkJICAgICFzcGVjLT52dDE3MDhfamFja19kZXRlY3QpOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmc3BlYy0+dnQxNzA4X2hwX3dvcmspOwogfQogCkBAIC0yOTUsNyArMzQxLDcgQEAKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAogCXNldF93aWRnZXRzX3Bvd2VyX3N0YXRlKGNvZGVjKTsKLQlhbmFsb2dfbG93X2N1cnJlbnRfbW9kZShzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCksIC0xKTsKKwlhbmFsb2dfbG93X2N1cnJlbnRfbW9kZShzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCkpOwogCWlmIChzbmRfaGRhX2dldF9ib29sX2hpbnQoY29kZWMsICJhbmFsb2dfbG9vcGJhY2tfaHBfZGV0ZWN0IikgPT0gMSkgewogCQlpZiAoaXNfYWFfcGF0aF9tdXRlKGNvZGVjKSkKIAkJCXZ0MTcwOF9zdGFydF9ocF93b3JrKGNvZGVjLT5zcGVjKTsKQEAgLTMxNSwxNjggKzM2MSw0NCBAQAogCQkJLnB1dCA9IGFuYWxvZ19pbnB1dF9zd2l0Y2hfcHV0LAkJCVwKIAkJCS5wcml2YXRlX3ZhbHVlID0gSERBX0NPTVBPU0VfQU1QX1ZBTCgwLCAzLCAwLCAwKSB9CiAKLXN0YXRpYyB2b2lkIHZpYV9ocF9iaW5kX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKLQotc3RhdGljIGludCBiaW5kX3Bpbl9zd2l0Y2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBpOwotCWludCBjaGFuZ2UgPSAwOwotCi0JbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwotCWludCBsbXV0ZSwgcm11dGU7Ci0JaWYgKHN0cnN0cihrY29udHJvbC0+aWQubmFtZSwgIlN3aXRjaCIpID09IE5VTEwpIHsKLQkJc25kX3ByaW50ZCgiSW52YWxpZCBjb250cm9sIVxuIik7Ci0JCXJldHVybiBjaGFuZ2U7Ci0JfQotCWNoYW5nZSA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9wdXQoa2NvbnRyb2wsCi0JCQkJCSAgICAgIHVjb250cm9sKTsKLQkvKiBHZXQgbXV0ZSB2YWx1ZSAqLwotCWxtdXRlID0gKnZhbHAgPyAwIDogSERBX0FNUF9NVVRFOwotCXZhbHArKzsKLQlybXV0ZSA9ICp2YWxwID8gMCA6IEhEQV9BTVBfTVVURTsKLQotCS8qIFNldCBocCBwaW5zICovCi0JaWYgKCFzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLmhwX291dHM7IGkrKykgewotCQkJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKAotCQkJCWNvZGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbaV0sCi0JCQkJMCwgSERBX09VVFBVVCwgMCwgSERBX0FNUF9NVVRFLAotCQkJCWxtdXRlKTsKLQkJCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZSgKLQkJCQljb2RlYywgc3BlYy0+YXV0b2NmZy5ocF9waW5zW2ldLAotCQkJCTEsIEhEQV9PVVRQVVQsIDAsIEhEQV9BTVBfTVVURSwKLQkJCQlybXV0ZSk7Ci0JCX0KLQl9Ci0KLQlpZiAoIWxtdXRlICYmICFybXV0ZSkgewotCQkvKiBMaW5lIE91dHMgKi8KLQkJZm9yIChpID0gMDsgaSA8IHNwZWMtPmF1dG9jZmcubGluZV9vdXRzOyBpKyspCi0JCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oCi0JCQkJY29kZWMsIHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1tpXSwKLQkJCQlIREFfT1VUUFVULCAwLCBIREFfQU1QX01VVEUsIDApOwotCQkvKiBTcGVha2VycyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+YXV0b2NmZy5zcGVha2VyX291dHM7IGkrKykKLQkJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbygKLQkJCQljb2RlYywgc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbaV0sCi0JCQkJSERBX09VVFBVVCwgMCwgSERBX0FNUF9NVVRFLCAwKTsKLQkJLyogdW5tdXRlICovCi0JCXZpYV9ocF9iaW5kX2F1dG9tdXRlKGNvZGVjKTsKLQotCX0gZWxzZSB7Ci0JCWlmIChsbXV0ZSkgewotCQkJLyogTXV0ZSBhbGwgbGVmdCBjaGFubmVscyAqLwotCQkJZm9yIChpID0gMTsgaSA8IHNwZWMtPmF1dG9jZmcubGluZV9vdXRzOyBpKyspCi0JCQkJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKAotCQkJCQljb2RlYywKLQkJCQkJc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zW2ldLAotCQkJCQkwLCBIREFfT1VUUFVULCAwLCBIREFfQU1QX01VVEUsCi0JCQkJCWxtdXRlKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfb3V0czsgaSsrKQotCQkJCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZSgKLQkJCQkJY29kZWMsCi0JCQkJCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zW2ldLAotCQkJCQkwLCBIREFfT1VUUFVULCAwLCBIREFfQU1QX01VVEUsCi0JCQkJCWxtdXRlKTsKLQkJfQotCQlpZiAocm11dGUpIHsKLQkJCS8qIG11dGUgYWxsIHJpZ2h0IGNoYW5uZWxzICovCi0JCQlmb3IgKGkgPSAxOyBpIDwgc3BlYy0+YXV0b2NmZy5saW5lX291dHM7IGkrKykKLQkJCQlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoCi0JCQkJCWNvZGVjLAotCQkJCQlzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbaV0sCi0JCQkJCTEsIEhEQV9PVVRQVVQsIDAsIEhEQV9BTVBfTVVURSwKLQkJCQkJcm11dGUpOwotCQkJZm9yIChpID0gMDsgaSA8IHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9vdXRzOyBpKyspCi0JCQkJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKAotCQkJCQljb2RlYywKLQkJCQkJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbaV0sCi0JCQkJCTEsIEhEQV9PVVRQVVQsIDAsIEhEQV9BTVBfTVVURSwKLQkJCQkJcm11dGUpOwotCQl9Ci0JfQotCXJldHVybiBjaGFuZ2U7Ci19Ci0KLSNkZWZpbmUgQklORF9QSU5fTVVURQkJCQkJCQlcCi0JewkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCQlcCi0JCQkubmFtZSA9IE5VTEwsCQkJCQlcCi0JCQkuaW5kZXggPSAwLAkJCQkJXAotCQkJLmluZm8gPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfaW5mbywJCVwKLQkJCS5nZXQgPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfZ2V0LAkJXAotCQkJLnB1dCA9IGJpbmRfcGluX3N3aXRjaF9wdXQsCQkJXAotCQkJLnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKDAsIDMsIDAsIDApIH0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZpYV9jb250cm9sX3RlbXBsYXRlc1tdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoTlVMTCwgMCwgMCwgMCksCiAJSERBX0NPREVDX01VVEUoTlVMTCwgMCwgMCwgMCksCiAJQU5BTE9HX0lOUFVUX01VVEUsCi0JQklORF9QSU5fTVVURSwKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgdnQxNzA4X2FkY19uaWRzWzJdID0gewotCS8qIEFEQzEtMiAqLwotCTB4MTUsIDB4MjcKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgdnQxNzA5X2FkY19uaWRzWzNdID0gewotCS8qIEFEQzEtMiAqLwotCTB4MTQsIDB4MTUsIDB4MTYKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgdnQxNzA4Ql9hZGNfbmlkc1syXSA9IHsKLQkvKiBBREMxLTIgKi8KLQkweDEzLCAweDE0Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IHZ0MTcwOFNfYWRjX25pZHNbMl0gPSB7Ci0JLyogQURDMS0yICovCi0JMHgxMywgMHgxNAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCB2dDE3MDJfYWRjX25pZHNbM10gPSB7Ci0JLyogQURDMS0yICovCi0JMHgxMiwgMHgyMCwgMHgxRgotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCB2dDE3MThTX2FkY19uaWRzWzJdID0gewotCS8qIEFEQzEtMiAqLwotCTB4MTAsIDB4MTEKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgdnQxNzE2U19hZGNfbmlkc1syXSA9IHsKLQkvKiBBREMxLTIgKi8KLQkweDEzLCAweDE0Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IHZ0MjAwMlBfYWRjX25pZHNbMl0gPSB7Ci0JLyogQURDMS0yICovCi0JMHgxMCwgMHgxMQotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCB2dDE4MTJfYWRjX25pZHNbMl0gPSB7Ci0JLyogQURDMS0yICovCi0JMHgxMCwgMHgxMQogfTsKIAogCiAvKiBhZGQgZHluYW1pYyBjb250cm9scyAqLwotc3RhdGljIGludCBfX3ZpYV9hZGRfY29udHJvbChzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICBpbnQgaWR4LCB1bnNpZ25lZCBsb25nIHZhbCkKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqX192aWFfY2xvbmVfY3RsKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKKwkJCQljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqdG1wbCwKKwkJCQljb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprbmV3OwogCiAJc25kX2FycmF5X2luaXQoJnNwZWMtPmtjdGxzLCBzaXplb2YoKmtuZXcpLCAzMik7CiAJa25ldyA9IHNuZF9hcnJheV9uZXcoJnNwZWMtPmtjdGxzKTsKIAlpZiAoIWtuZXcpCisJCXJldHVybiBOVUxMOworCSprbmV3ID0gKnRtcGw7CisJaWYgKCFuYW1lKQorCQluYW1lID0gdG1wbC0+bmFtZTsKKwlpZiAobmFtZSkgeworCQlrbmV3LT5uYW1lID0ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFrbmV3LT5uYW1lKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBrbmV3OworfQorCitzdGF0aWMgaW50IF9fdmlhX2FkZF9jb250cm9sKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIGludCBpZHgsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprbmV3OworCisJa25ldyA9IF9fdmlhX2Nsb25lX2N0bChzcGVjLCAmdmlhX2NvbnRyb2xfdGVtcGxhdGVzW3R5cGVdLCBuYW1lKTsKKwlpZiAoIWtuZXcpCiAJCXJldHVybiAtRU5PTUVNOwotCSprbmV3ID0gdmlhX2NvbnRyb2xfdGVtcGxhdGVzW3R5cGVdOwotCWtuZXctPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOwotCWlmICgha25ldy0+bmFtZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJa25ldy0+aW5kZXggPSBpZHg7CiAJaWYgKGdldF9hbXBfbmlkXyh2YWwpKQogCQlrbmV3LT5zdWJkZXZpY2UgPSBIREFfU1VCREVWX0FNUF9GTEFHOwogCWtuZXctPnByaXZhdGVfdmFsdWUgPSB2YWw7CkBAIC00ODYsMjEgKzQwOCw3IEBACiAjZGVmaW5lIHZpYV9hZGRfY29udHJvbChzcGVjLCB0eXBlLCBuYW1lLCB2YWwpIFwKIAlfX3ZpYV9hZGRfY29udHJvbChzcGVjLCB0eXBlLCBuYW1lLCAwLCB2YWwpCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqdmlhX2Nsb25lX2NvbnRyb2woc3RydWN0IHZpYV9zcGVjICpzcGVjLAotCQkJCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICp0bXBsKQotewotCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprbmV3OwotCi0Jc25kX2FycmF5X2luaXQoJnNwZWMtPmtjdGxzLCBzaXplb2YoKmtuZXcpLCAzMik7Ci0Ja25ldyA9IHNuZF9hcnJheV9uZXcoJnNwZWMtPmtjdGxzKTsKLQlpZiAoIWtuZXcpCi0JCXJldHVybiBOVUxMOwotCSprbmV3ID0gKnRtcGw7Ci0Ja25ldy0+bmFtZSA9IGtzdHJkdXAodG1wbC0+bmFtZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrbmV3LT5uYW1lKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4ga25ldzsKLX0KKyNkZWZpbmUgdmlhX2Nsb25lX2NvbnRyb2woc3BlYywgdG1wbCkgX192aWFfY2xvbmVfY3RsKHNwZWMsIHRtcGwsIE5VTEwpCiAKIHN0YXRpYyB2b2lkIHZpYV9mcmVlX2tjdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewpAQCAtNTM1LDU4ICs0NDMsMjA4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHZpYV9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkJICAgaGRhX25pZF90IG5pZCwgaW50IHBpbl90eXBlLAotCQkJCQkgICBpbnQgZGFjX2lkeCkKKyNkZWZpbmUgZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIG11eCwgbmlkKSBcCisJc25kX2hkYV9nZXRfY29ubl9pbmRleChjb2RlYywgbXV4LCBuaWQsIDApCisKK3N0YXRpYyBib29sIGNoZWNrX2FtcF9jYXBzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBpbnQgZGlyLAorCQkJICAgdW5zaWduZWQgaW50IG1hc2spCiB7Ci0JLyogc2V0IGFzIG91dHB1dCAqLwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCXVuc2lnbmVkIGludCBjYXBzOworCWlmICghbmlkKQorCQlyZXR1cm4gZmFsc2U7CisJY2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgbmlkKTsKKwlpZiAoZGlyID09IEhEQV9JTlBVVCkKKwkJY2FwcyAmPSBBQ19XQ0FQX0lOX0FNUDsKKwllbHNlCisJCWNhcHMgJj0gQUNfV0NBUF9PVVRfQU1QOworCWlmICghY2FwcykKKwkJcmV0dXJuIGZhbHNlOworCWlmIChxdWVyeV9hbXBfY2Fwcyhjb2RlYywgbmlkLCBkaXIpICYgbWFzaykKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCisjZGVmaW5lIGhhdmVfbXV0ZShjb2RlYywgbmlkLCBkaXIpIFwKKwljaGVja19hbXBfY2Fwcyhjb2RlYywgbmlkLCBkaXIsIEFDX0FNUENBUF9NVVRFKQorCisvKiBlbmFibGUvZGlzYWJsZSB0aGUgb3V0cHV0LXJvdXRlIG1peGVycyAqLworc3RhdGljIHZvaWQgYWN0aXZhdGVfb3V0cHV0X21peChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IG5pZF9wYXRoICpwYXRoLAorCQkJCWhkYV9uaWRfdCBtaXhfbmlkLCBpbnQgaWR4LCBib29sIGVuYWJsZSkKK3sKKwlpbnQgaSwgbnVtLCB2YWw7CisKKwlpZiAoIXBhdGgpCisJCXJldHVybjsKKwludW0gPSBzbmRfaGRhX2dldF9jb25uX2xpc3QoY29kZWMsIG1peF9uaWQsIE5VTEwpOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlpZiAoaSA9PSBpZHgpCisJCQl2YWwgPSBBTVBfSU5fVU5NVVRFKGkpOworCQllbHNlCisJCQl2YWwgPSBBTVBfSU5fTVVURShpKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbWl4X25pZCwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgdmFsKTsKKwl9Cit9CisKKy8qIGVuYWJsZS9kaXNhYmxlIHRoZSBvdXRwdXQtcm91dGUgKi8KK3N0YXRpYyB2b2lkIGFjdGl2YXRlX291dHB1dF9wYXRoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgbmlkX3BhdGggKnBhdGgsCisJCQkJIGJvb2wgZW5hYmxlLCBib29sIGZvcmNlKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBwYXRoLT5kZXB0aDsgaSsrKSB7CisJCWhkYV9uaWRfdCBzcmMsIGRzdDsKKwkJaW50IGlkeCA9IHBhdGgtPmlkeFtpXTsKKwkJc3JjID0gcGF0aC0+cGF0aFtpXTsJCQkKKwkJaWYgKGkgPCBwYXRoLT5kZXB0aCAtIDEpCisJCQlkc3QgPSBwYXRoLT5wYXRoW2kgKyAxXTsKKwkJZWxzZQorCQkJZHN0ID0gMDsKKwkJaWYgKGVuYWJsZSAmJiBwYXRoLT5tdWx0aVtpXSkKKwkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGRzdCwgMCwKKwkJCQkJICAgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBpZHgpOworCQlpZiAoIWZvcmNlICYmIChkc3QgPT0gc3BlYy0+YWFfbWl4X25pZCkpCisJCQljb250aW51ZTsKKwkJaWYgKGhhdmVfbXV0ZShjb2RlYywgZHN0LCBIREFfSU5QVVQpKQorCQkJYWN0aXZhdGVfb3V0cHV0X21peChjb2RlYywgcGF0aCwgZHN0LCBpZHgsIGVuYWJsZSk7CisJCWlmICghZm9yY2UgJiYgKHNyYyA9PSBwYXRoLT52b2xfY3RsIHx8IHNyYyA9PSBwYXRoLT5tdXRlX2N0bCkpCisJCQljb250aW51ZTsKKwkJaWYgKGhhdmVfbXV0ZShjb2RlYywgc3JjLCBIREFfT1VUUFVUKSkgeworCQkJaW50IHZhbCA9IGVuYWJsZSA/IEFNUF9PVVRfVU5NVVRFIDogQU1QX09VVF9NVVRFOworCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgc3JjLCAwLAorCQkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgdmFsKTsKKwkJfQorCX0KK30KKworLyogc2V0IHRoZSBnaXZlbiBwaW4gYXMgb3V0cHV0ICovCitzdGF0aWMgdm9pZCBpbml0X291dHB1dF9waW4oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW4sCisJCQkgICAgaW50IHBpbl90eXBlKQoreworCWlmICghcGluKQorCQlyZXR1cm47CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcGluLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCiAJCQkgICAgcGluX3R5cGUpOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKLQkJCSAgICBBTVBfT1VUX1VOTVVURSk7Ci0JaWYgKHNuZF9oZGFfcXVlcnlfcGluX2NhcHMoY29kZWMsIG5pZCkgJiBBQ19QSU5DQVBfRUFQRCkKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCWlmIChzbmRfaGRhX3F1ZXJ5X3Bpbl9jYXBzKGNvZGVjLCBwaW4pICYgQUNfUElOQ0FQX0VBUEQpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHBpbiwgMCwKIAkJCQkgICAgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDB4MDIpOwogfQogCitzdGF0aWMgdm9pZCB2aWFfYXV0b19pbml0X291dHB1dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgc3RydWN0IG5pZF9wYXRoICpwYXRoLCBpbnQgcGluX3R5cGUpCit7CisJdW5zaWduZWQgaW50IGNhcHM7CisJaGRhX25pZF90IHBpbjsKKworCWlmICghcGF0aC0+ZGVwdGgpCisJCXJldHVybjsKKwlwaW4gPSBwYXRoLT5wYXRoW3BhdGgtPmRlcHRoIC0gMV07CisKKwlpbml0X291dHB1dF9waW4oY29kZWMsIHBpbiwgcGluX3R5cGUpOworCWNhcHMgPSBxdWVyeV9hbXBfY2Fwcyhjb2RlYywgcGluLCBIREFfT1VUUFVUKTsKKwlpZiAoY2FwcyAmIEFDX0FNUENBUF9NVVRFKSB7CisJCXVuc2lnbmVkIGludCB2YWw7CisJCXZhbCA9IChjYXBzICYgQUNfQU1QQ0FQX09GRlNFVCkgPj4gQUNfQU1QQ0FQX09GRlNFVF9TSElGVDsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcGluLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJCSAgICBBTVBfT1VUX01VVEUgfCB2YWwpOworCX0KKwlhY3RpdmF0ZV9vdXRwdXRfcGF0aChjb2RlYywgcGF0aCwgdHJ1ZSwgdHJ1ZSk7IC8qIGZvcmNlIG9uICovCit9CiAKIHN0YXRpYyB2b2lkIHZpYV9hdXRvX2luaXRfbXVsdGlfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBuaWRfcGF0aCAqcGF0aDsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPD0gQVVUT19TRVFfU0lERTsgaSsrKSB7Ci0JCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbaV07Ci0JCWlmIChuaWQpCi0JCQl2aWFfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgUElOX09VVCwgaSk7CisJZm9yIChpID0gMDsgaSA8IHNwZWMtPmF1dG9jZmcubGluZV9vdXRzICsgc3BlYy0+c21hcnQ1MV9udW1zOyBpKyspIHsKKwkJcGF0aCA9ICZzcGVjLT5vdXRfcGF0aFtpXTsKKwkJaWYgKCFpICYmIHNwZWMtPmFhbWl4X21vZGUgJiYgc3BlYy0+b3V0X21peF9wYXRoLmRlcHRoKQorCQkJcGF0aCA9ICZzcGVjLT5vdXRfbWl4X3BhdGg7CisJCXZpYV9hdXRvX2luaXRfb3V0cHV0KGNvZGVjLCBwYXRoLCBQSU5fT1VUKTsKKwl9Cit9CisKKy8qIGRlYWN0aXZhdGUgdGhlIGluYWN0aXZlIGhlYWRwaG9uZS1wYXRocyAqLworc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV9ocF9wYXRocyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgc2hhcmVkID0gc3BlYy0+aHBfaW5kZXBfc2hhcmVkOworCisJaWYgKHNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUpIHsKKwkJYWN0aXZhdGVfb3V0cHV0X3BhdGgoY29kZWMsICZzcGVjLT5ocF9wYXRoLCBmYWxzZSwgZmFsc2UpOworCQlhY3RpdmF0ZV9vdXRwdXRfcGF0aChjb2RlYywgJnNwZWMtPmhwX21peF9wYXRoLCBmYWxzZSwgZmFsc2UpOworCQlpZiAoc2hhcmVkKQorCQkJYWN0aXZhdGVfb3V0cHV0X3BhdGgoY29kZWMsICZzcGVjLT5vdXRfcGF0aFtzaGFyZWRdLAorCQkJCQkgICAgIGZhbHNlLCBmYWxzZSk7CisJfSBlbHNlIGlmIChzcGVjLT5hYW1peF9tb2RlIHx8ICFzcGVjLT5ocF9wYXRoLmRlcHRoKSB7CisJCWFjdGl2YXRlX291dHB1dF9wYXRoKGNvZGVjLCAmc3BlYy0+aHBfaW5kZXBfcGF0aCwgZmFsc2UsIGZhbHNlKTsKKwkJYWN0aXZhdGVfb3V0cHV0X3BhdGgoY29kZWMsICZzcGVjLT5ocF9wYXRoLCBmYWxzZSwgZmFsc2UpOworCX0gZWxzZSB7CisJCWFjdGl2YXRlX291dHB1dF9wYXRoKGNvZGVjLCAmc3BlYy0+aHBfaW5kZXBfcGF0aCwgZmFsc2UsIGZhbHNlKTsKKwkJYWN0aXZhdGVfb3V0cHV0X3BhdGgoY29kZWMsICZzcGVjLT5ocF9taXhfcGF0aCwgZmFsc2UsIGZhbHNlKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIHZpYV9hdXRvX2luaXRfaHBfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBwaW47Ci0JaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+YXV0b2NmZy5ocF9vdXRzOyBpKyspIHsKLQkJcGluID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zW2ldOwotCQlpZiAocGluKSAvKiBjb25uZWN0IHRvIGZyb250ICovCi0JCQl2aWFfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIHBpbiwgUElOX0hQLCAwKTsKKwlpZiAoIXNwZWMtPmhwX3BhdGguZGVwdGgpIHsKKwkJdmlhX2F1dG9faW5pdF9vdXRwdXQoY29kZWMsICZzcGVjLT5ocF9taXhfcGF0aCwgUElOX0hQKTsKKwkJcmV0dXJuOworCX0KKwlkZWFjdGl2YXRlX2hwX3BhdGhzKGNvZGVjKTsKKwlpZiAoc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSkKKwkJdmlhX2F1dG9faW5pdF9vdXRwdXQoY29kZWMsICZzcGVjLT5ocF9pbmRlcF9wYXRoLCBQSU5fSFApOworCWVsc2UgaWYgKHNwZWMtPmFhbWl4X21vZGUpCisJCXZpYV9hdXRvX2luaXRfb3V0cHV0KGNvZGVjLCAmc3BlYy0+aHBfbWl4X3BhdGgsIFBJTl9IUCk7CisJZWxzZQorCQl2aWFfYXV0b19pbml0X291dHB1dChjb2RlYywgJnNwZWMtPmhwX3BhdGgsIFBJTl9IUCk7Cit9CisKK3N0YXRpYyB2b2lkIHZpYV9hdXRvX2luaXRfc3BlYWtlcl9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlpZiAoIXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9vdXRzKQorCQlyZXR1cm47CisJaWYgKCFzcGVjLT5zcGVha2VyX3BhdGguZGVwdGgpIHsKKwkJdmlhX2F1dG9faW5pdF9vdXRwdXQoY29kZWMsICZzcGVjLT5zcGVha2VyX21peF9wYXRoLCBQSU5fT1VUKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXNwZWMtPmFhbWl4X21vZGUpIHsKKwkJYWN0aXZhdGVfb3V0cHV0X3BhdGgoY29kZWMsICZzcGVjLT5zcGVha2VyX21peF9wYXRoLAorCQkJCSAgICAgZmFsc2UsIGZhbHNlKTsKKwkJdmlhX2F1dG9faW5pdF9vdXRwdXQoY29kZWMsICZzcGVjLT5zcGVha2VyX3BhdGgsIFBJTl9PVVQpOworCX0gZWxzZSB7CisJCWFjdGl2YXRlX291dHB1dF9wYXRoKGNvZGVjLCAmc3BlYy0+c3BlYWtlcl9wYXRoLCBmYWxzZSwgZmFsc2UpOworCQl2aWFfYXV0b19pbml0X291dHB1dChjb2RlYywgJnNwZWMtPnNwZWFrZXJfbWl4X3BhdGgsIFBJTl9PVVQpOwogCX0KIH0KIAotc3RhdGljIGludCBpc19zbWFydDUxX3BpbnMoc3RydWN0IHZpYV9zcGVjICpzcGVjLCBoZGFfbmlkX3QgcGluKTsKK3N0YXRpYyBib29sIGlzX3NtYXJ0NTFfcGlucyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbik7CitzdGF0aWMgdm9pZCB2aWFfaHBfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogCiBzdGF0aWMgdm9pZCB2aWFfYXV0b19pbml0X2FuYWxvZ19pbnB1dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKKwloZGFfbmlkX3QgY29ubltIREFfTUFYX0NPTk5FQ1RJT05TXTsKIAl1bnNpZ25lZCBpbnQgY3RsOwotCWludCBpOworCWludCBpLCBudW1fY29ubnM7CiAKKwkvKiBpbml0IEFEQ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2FkY19uaWRzOyBpKyspIHsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgc3BlYy0+YWRjX25pZHNbaV0sIDAsCisJCQkJICAgIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJCQkJICAgIEFNUF9JTl9VTk1VVEUoMCkpOworCX0KKworCS8qIGluaXQgcGlucyAqLwogCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgewogCQloZGFfbmlkX3QgbmlkID0gY2ZnLT5pbnB1dHNbaV0ucGluOwotCQlpZiAoc3BlYy0+c21hcnQ1MV9lbmFibGVkICYmIGlzX3NtYXJ0NTFfcGlucyhzcGVjLCBuaWQpKQorCQlpZiAoc3BlYy0+c21hcnQ1MV9lbmFibGVkICYmIGlzX3NtYXJ0NTFfcGlucyhjb2RlYywgbmlkKSkKIAkJCWN0bCA9IFBJTl9PVVQ7CiAJCWVsc2UgaWYgKGNmZy0+aW5wdXRzW2ldLnR5cGUgPT0gQVVUT19QSU5fTUlDKQogCQkJY3RsID0gUElOX1ZSRUY1MDsKQEAgLTU5NSw2ICs2NTMsMzIgQEAKIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAogCQkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIGN0bCk7CiAJfQorCisJLyogaW5pdCBpbnB1dC1zcmMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2FkY19uaWRzOyBpKyspIHsKKwkJaW50IGFkY19pZHggPSBzcGVjLT5pbnB1dHNbc3BlYy0+Y3VyX211eFtpXV0uYWRjX2lkeDsKKwkJaWYgKHNwZWMtPm11eF9uaWRzW2FkY19pZHhdKSB7CisJCQlpbnQgbXV4X2lkeCA9IHNwZWMtPmlucHV0c1tzcGVjLT5jdXJfbXV4W2ldXS5tdXhfaWR4OworCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgc3BlYy0+bXV4X25pZHNbYWRjX2lkeF0sIDAsCisJCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKKwkJCQkJICAgIG11eF9pZHgpOworCQl9CisJCWlmIChzcGVjLT5keW5fYWRjX3N3aXRjaCkKKwkJCWJyZWFrOyAvKiBvbmx5IG9uZSBpbnB1dC1zcmMgKi8KKwl9CisKKwkvKiBpbml0IGFhLW1peGVyICovCisJaWYgKCFzcGVjLT5hYV9taXhfbmlkKQorCQlyZXR1cm47CisJbnVtX2Nvbm5zID0gc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsIHNwZWMtPmFhX21peF9uaWQsIGNvbm4sCisJCQkJCSAgICBBUlJBWV9TSVpFKGNvbm4pKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Nvbm5zOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGNhcHMgPSBnZXRfd2NhcHMoY29kZWMsIGNvbm5baV0pOworCQlpZiAoZ2V0X3djYXBzX3R5cGUoY2FwcykgPT0gQUNfV0lEX1BJTikKKwkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNwZWMtPmFhX21peF9uaWQsIDAsCisJCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJCQkgICAgQU1QX0lOX01VVEUoaSkpOworCX0KIH0KIAogc3RhdGljIHZvaWQgc2V0X3Bpbl9wb3dlcl9zdGF0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKQEAgLTYwNSw5ICs2ODksMTMgQEAKIAl1bnNpZ25lZCBub19wcmVzZW5jZSA9IChkZWZfY29uZiAmIEFDX0RFRkNGR19NSVNDKQogCQk+PiBBQ19ERUZDRkdfTUlTQ19TSElGVAogCQkmIEFDX0RFRkNGR19NSVNDX05PX1BSRVNFTkNFOyAvKiBkbyBub3Qgc3VwcG9ydCBwaW4gc2Vuc2UgKi8KLQl1bnNpZ25lZCBwcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgbmlkKTsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpZiAoKHNwZWMtPnNtYXJ0NTFfZW5hYmxlZCAmJiBpc19zbWFydDUxX3BpbnMoc3BlYywgbmlkKSkKKwl1bnNpZ25lZCBwcmVzZW50ID0gMDsKKworCW5vX3ByZXNlbmNlIHw9IHNwZWMtPm5vX3Bpbl9wb3dlcl9jdGw7CisJaWYgKCFub19wcmVzZW5jZSkKKwkJcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIG5pZCk7CisJaWYgKChzcGVjLT5zbWFydDUxX2VuYWJsZWQgJiYgaXNfc21hcnQ1MV9waW5zKGNvZGVjLCBuaWQpKQogCSAgICB8fCAoKG5vX3ByZXNlbmNlIHx8IHByZXNlbnQpCiAJCSYmIGdldF9kZWZjZmdfY29ubmVjdChkZWZfY29uZikgIT0gQUNfSkFDS19QT1JUX05PTkUpKSB7CiAJCSphZmZlY3RlZF9wYXJtID0gQUNfUFdSU1RfRDA7IC8qIGlmIGl0J3MgY29ubmVjdGVkICovCkBAIC02MTgsMTgwICs3MDYsMTg2IEBACiAJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9QT1dFUl9TVEFURSwgcGFybSk7CiB9CiAKLS8qCi0gKiBpbnB1dCBNVVggaGFuZGxpbmcKLSAqLwotc3RhdGljIGludCB2aWFfbXV4X2VudW1faW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3N0YXRpYyBpbnQgdmlhX3Bpbl9wb3dlcl9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X2luZm8oc3BlYy0+aW5wdXRfbXV4LCB1aW5mbyk7Ci19CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0c1tdID0geworCQkiRGlzYWJsZWQiLCAiRW5hYmxlZCIKKwl9OwogCi1zdGF0aWMgaW50IHZpYV9tdXhfZW51bV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JdW5zaWduZWQgaW50IGFkY19pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzcGVjLT5jdXJfbXV4W2FkY19pZHhdOworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAyOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCSAgICAgICB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlhX211eF9lbnVtX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgdmlhX3Bpbl9wb3dlcl9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQl1bnNpZ25lZCBpbnQgYWRjX2lkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOwotCWludCByZXQ7Ci0KLQlpZiAoIXNwZWMtPm11eF9uaWRzW2FkY19pZHhdKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkvKiBzd2l0Y2ggdG8gRDAgYmVvZnJlIGNoYW5nZSBpbmRleCAqLwotCWlmIChzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIHNwZWMtPm11eF9uaWRzW2FkY19pZHhdLCAwLAotCQkJICAgICAgIEFDX1ZFUkJfR0VUX1BPV0VSX1NUQVRFLCAweDAwKSAhPSBBQ19QV1JTVF9EMCkKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgc3BlYy0+bXV4X25pZHNbYWRjX2lkeF0sIDAsCi0JCQkJICAgIEFDX1ZFUkJfU0VUX1BPV0VSX1NUQVRFLCBBQ19QV1JTVF9EMCk7Ci0KLQlyZXQgPSBzbmRfaGRhX2lucHV0X211eF9wdXQoY29kZWMsIHNwZWMtPmlucHV0X211eCwgdWNvbnRyb2wsCi0JCQkJICAgICBzcGVjLT5tdXhfbmlkc1thZGNfaWR4XSwKLQkJCQkgICAgICZzcGVjLT5jdXJfbXV4W2FkY19pZHhdKTsKLQkvKiB1cGRhdGUgamFjayBwb3dlciBzdGF0ZSAqLwotCXNldF93aWRnZXRzX3Bvd2VyX3N0YXRlKGNvZGVjKTsKLQotCXJldHVybiByZXQ7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICFzcGVjLT5ub19waW5fcG93ZXJfY3RsOworCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHZpYV9waW5fcG93ZXJfY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IHZhbCA9ICF1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCisJaWYgKHZhbCA9PSBzcGVjLT5ub19waW5fcG93ZXJfY3RsKQorCQlyZXR1cm4gMDsKKwlzcGVjLT5ub19waW5fcG93ZXJfY3RsID0gdmFsOworCXNldF93aWRnZXRzX3Bvd2VyX3N0YXRlKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZpYV9waW5fcG93ZXJfY3RsX2VudW0gPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiRHluYW1pYyBQb3dlci1Db250cm9sIiwKKwkuaW5mbyA9IHZpYV9waW5fcG93ZXJfY3RsX2luZm8sCisJLmdldCA9IHZpYV9waW5fcG93ZXJfY3RsX2dldCwKKwkucHV0ID0gdmlhX3Bpbl9wb3dlcl9jdGxfcHV0LAorfTsKKworCiBzdGF0aWMgaW50IHZpYV9pbmRlcGVuZGVudF9ocF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X2luZm8oc3BlYy0+aHBfbXV4LCB1aW5mbyk7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0c1tdID0geyAiT0ZGIiwgIk9OIiB9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gMikKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCisJICAgICAgIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB2aWFfaW5kZXBlbmRlbnRfaHBfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIGludCBwaW5zZWw7Ci0KLQkvKiB1c2UgISEgdG8gdHJhbnNsYXRlIGNvbm4gc2VsIDIgZm9yIFZUMTcxOFMgKi8KLQlwaW5zZWwgPSAhIXNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAotCQkJCSAgICAgIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfU0VMLAotCQkJCSAgICAgIDB4MDApOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBwaW5zZWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYWN0aXZhdGVfY3RsKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgYWN0aXZlKQotewotCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCA9IHNuZF9oZGFfZmluZF9taXhlcl9jdGwoY29kZWMsIG5hbWUpOwotCWlmIChjdGwpIHsKLQkJY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKLQkJY3RsLT52ZFswXS5hY2Nlc3MgfD0gYWN0aXZlCi0JCQk/IDAgOiBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkU7Ci0JCXNuZF9jdGxfbm90aWZ5KGNvZGVjLT5idXMtPmNhcmQsCi0JCQkgICAgICAgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsICZjdGwtPmlkKTsKLQl9Ci19Ci0KLXN0YXRpYyBoZGFfbmlkX3Qgc2lkZV9tdXRlX2NoYW5uZWwoc3RydWN0IHZpYV9zcGVjICpzcGVjKQotewotCXN3aXRjaCAoc3BlYy0+Y29kZWNfdHlwZSkgewotCWNhc2UgVlQxNzA4OgkJcmV0dXJuIDB4MWI7Ci0JY2FzZSBWVDE3MDlfMTBDSDoJcmV0dXJuIDB4Mjk7Ci0JY2FzZSBWVDE3MDhCXzhDSDoJLyogZmFsbCB0aHJ1ICovCi0JY2FzZSBWVDE3MDhTOgkJcmV0dXJuIDB4Mjc7Ci0JY2FzZSBWVDIwMDJQOgkJcmV0dXJuIDB4MTk7Ci0JY2FzZSBWVDE4MDI6CQlyZXR1cm4gMHgxNTsKLQljYXNlIFZUMTgxMjoJCXJldHVybiAweDE1OwotCWRlZmF1bHQ6CQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdXBkYXRlX3NpZGVfbXV0ZV9zdGF0dXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JLyogbXV0ZSBzaWRlIGNoYW5uZWwgKi8KIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQl1bnNpZ25lZCBpbnQgcGFybTsKLQloZGFfbmlkX3Qgc3czID0gc2lkZV9tdXRlX2NoYW5uZWwoc3BlYyk7CiAKLQlpZiAoc3czKSB7Ci0JCWlmIChWVDIwMDJQX0NPTVBBVElCTEUoc3BlYykpCi0JCQlwYXJtID0gc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSA/Ci0JCQkgICAgICAgQU1QX0lOX01VVEUoMSkgOiBBTVBfSU5fVU5NVVRFKDEpOwotCQllbHNlCi0JCQlwYXJtID0gc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSA/Ci0JCQkgICAgICAgQU1QX09VVF9NVVRFIDogQU1QX09VVF9VTk1VVEU7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHN3MywgMCwKLQkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgcGFybSk7Ci0JCWlmIChzcGVjLT5jb2RlY190eXBlID09IFZUMTgxMikKLQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MWQsIDAsCi0JCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBwYXJtKTsKLQl9CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNwZWMtPmhwX2luZGVwZW5kZW50X21vZGU7CiAJcmV0dXJuIDA7CiB9CiAKKy8qIGFkanVzdCBzcGVjLT5tdWx0aW91dCBzZXR1cCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgZmxhZ3MgKi8KK3N0YXRpYyB2b2lkIHNldHVwX3BsYXliYWNrX211bHRpX3BjbShzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMpCit7CisJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CisJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSBjZmctPmxpbmVfb3V0cyArIHNwZWMtPnNtYXJ0NTFfbnVtczsKKwlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSAwOworCWlmICghc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSkgeworCQlpZiAoIXNwZWMtPmhwX2luZGVwX3NoYXJlZCkKKwkJCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IHNwZWMtPmhwX2RhY19uaWQ7CisJfSBlbHNlIHsKKwkJaWYgKHNwZWMtPmhwX2luZGVwX3NoYXJlZCkKKwkJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gY2ZnLT5saW5lX291dHMgLSAxOworCX0KK30KKworLyogdXBkYXRlIERBQyBzZXR1cHMgYWNjb3JkaW5nIHRvIGluZGVwLUhQIHN3aXRjaDsKKyAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgd2hlbiBpbmRlcC1IUCBpcyBtb2RpZmllZAorICovCitzdGF0aWMgdm9pZCBzd2l0Y2hfaW5kZXBfaHBfZGFjcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgc2hhcmVkID0gc3BlYy0+aHBfaW5kZXBfc2hhcmVkOworCWhkYV9uaWRfdCBzaGFyZWRfZGFjLCBocF9kYWM7CisKKwlpZiAoIXNwZWMtPm9wZW5lZF9zdHJlYW1zKQorCQlyZXR1cm47CisKKwlzaGFyZWRfZGFjID0gc2hhcmVkID8gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbc2hhcmVkXSA6IDA7CisJaHBfZGFjID0gc3BlYy0+aHBfZGFjX25pZDsKKwlpZiAoc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSkgeworCQkvKiBzd2l0Y2ggdG8gaW5kZXAtSFAgbW9kZSAqLworCQlpZiAoc3BlYy0+YWN0aXZlX3N0cmVhbXMgJiBTVFJFQU1fTVVMVElfT1VUKSB7CisJCQlfX3NuZF9oZGFfY29kZWNfY2xlYW51cF9zdHJlYW0oY29kZWMsIGhwX2RhYywgMSk7CisJCQlfX3NuZF9oZGFfY29kZWNfY2xlYW51cF9zdHJlYW0oY29kZWMsIHNoYXJlZF9kYWMsIDEpOworCQl9CisJCWlmIChzcGVjLT5hY3RpdmVfc3RyZWFtcyAmIFNUUkVBTV9JTkRFUF9IUCkKKwkJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBocF9kYWMsCisJCQkJCQkgICBzcGVjLT5jdXJfaHBfc3RyZWFtX3RhZywgMCwKKwkJCQkJCSAgIHNwZWMtPmN1cl9ocF9mb3JtYXQpOworCX0gZWxzZSB7CisJCS8qIGJhY2sgdG8gSFAgb3Igc2hhcmVkLURBQyAqLworCQlpZiAoc3BlYy0+YWN0aXZlX3N0cmVhbXMgJiBTVFJFQU1fSU5ERVBfSFApCisJCQlfX3NuZF9oZGFfY29kZWNfY2xlYW51cF9zdHJlYW0oY29kZWMsIGhwX2RhYywgMSk7CisJCWlmIChzcGVjLT5hY3RpdmVfc3RyZWFtcyAmIFNUUkVBTV9NVUxUSV9PVVQpIHsKKwkJCWhkYV9uaWRfdCBkYWM7CisJCQlpbnQgY2g7CisJCQlpZiAoc2hhcmVkX2RhYykgeyAvKiByZXNldCBtdXRsaS1jaCBEQUMgKi8KKwkJCQlkYWMgPSBzaGFyZWRfZGFjOworCQkJCWNoID0gc2hhcmVkICogMjsKKwkJCX0gZWxzZSB7IC8qIHJlc2V0IEhQIERBQyAqLworCQkJCWRhYyA9IGhwX2RhYzsKKwkJCQljaCA9IDA7CisJCQl9CisJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgZGFjLAorCQkJCQkJICAgc3BlYy0+Y3VyX2RhY19zdHJlYW1fdGFnLCBjaCwKKwkJCQkJCSAgIHNwZWMtPmN1cl9kYWNfZm9ybWF0KTsKKwkJfQorCX0KKwlzZXR1cF9wbGF5YmFja19tdWx0aV9wY20oc3BlYyk7Cit9CisKIHN0YXRpYyBpbnQgdmlhX2luZGVwZW5kZW50X2hwX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgcGluc2VsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKLQkvKiBHZXQgSW5kZXBlbmRlbnQgTW9kZSBpbmRleCBvZiBoZWFkcGhvbmUgcGluIHdpZGdldCAqLwotCXNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUgPSBzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlX2luZGV4ID09IHBpbnNlbAotCQk/IDEgOiAwOwotCWlmIChzcGVjLT5jb2RlY190eXBlID09IFZUMTcxOFMpCi0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKLQkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIHBpbnNlbCA/IDIgOiAwKTsKLQllbHNlCi0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKLQkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIHBpbnNlbCk7CisJaW50IGN1ciwgc2hhcmVkOwogCi0JaWYgKHNwZWMtPmNvZGVjX3R5cGUgPT0gVlQxODEyKQotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDM1LCAwLAotCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgcGluc2VsKTsKLQlpZiAoc3BlYy0+bXVsdGlvdXQuaHBfbmlkICYmIHNwZWMtPm11bHRpb3V0LmhwX25pZAotCSAgICAhPSBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tIREFfRlJPTlRdKQotCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgc3BlYy0+bXVsdGlvdXQuaHBfbmlkLAotCQkJCQkgICAwLCAwLCAwKTsKLQotCXVwZGF0ZV9zaWRlX211dGVfc3RhdHVzKGNvZGVjKTsKLQkvKiB1cGRhdGUgSFAgdm9sdW1lL3N3dGljaCBhY3RpdmUgc3RhdGUgKi8KLQlpZiAoc3BlYy0+Y29kZWNfdHlwZSA9PSBWVDE3MDhTCi0JICAgIHx8IHNwZWMtPmNvZGVjX3R5cGUgPT0gVlQxNzAyCi0JICAgIHx8IHNwZWMtPmNvZGVjX3R5cGUgPT0gVlQxNzE4UwotCSAgICB8fCBzcGVjLT5jb2RlY190eXBlID09IFZUMTcxNlMKLQkgICAgfHwgVlQyMDAyUF9DT01QQVRJQkxFKHNwZWMpKSB7Ci0JCWFjdGl2YXRlX2N0bChjb2RlYywgIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAotCQkJICAgICBzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlKTsKLQkJYWN0aXZhdGVfY3RsKGNvZGVjLCAiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkgICAgIHNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUpOworCW11dGV4X2xvY2soJnNwZWMtPmNvbmZpZ19tdXRleCk7CisJY3VyID0gISF1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWlmIChzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlID09IGN1cikgeworCQltdXRleF91bmxvY2soJnNwZWMtPmNvbmZpZ19tdXRleCk7CisJCXJldHVybiAwOwogCX0KKwlzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlID0gY3VyOworCXNoYXJlZCA9IHNwZWMtPmhwX2luZGVwX3NoYXJlZDsKKwlkZWFjdGl2YXRlX2hwX3BhdGhzKGNvZGVjKTsKKwlpZiAoY3VyKQorCQlhY3RpdmF0ZV9vdXRwdXRfcGF0aChjb2RlYywgJnNwZWMtPmhwX2luZGVwX3BhdGgsIHRydWUsIGZhbHNlKTsKKwllbHNlIHsKKwkJaWYgKHNoYXJlZCkKKwkJCWFjdGl2YXRlX291dHB1dF9wYXRoKGNvZGVjLCAmc3BlYy0+b3V0X3BhdGhbc2hhcmVkXSwKKwkJCQkJICAgICB0cnVlLCBmYWxzZSk7CisJCWlmIChzcGVjLT5hYW1peF9tb2RlIHx8ICFzcGVjLT5ocF9wYXRoLmRlcHRoKQorCQkJYWN0aXZhdGVfb3V0cHV0X3BhdGgoY29kZWMsICZzcGVjLT5ocF9taXhfcGF0aCwKKwkJCQkJICAgICB0cnVlLCBmYWxzZSk7CisJCWVsc2UKKwkJCWFjdGl2YXRlX291dHB1dF9wYXRoKGNvZGVjLCAmc3BlYy0+aHBfcGF0aCwKKwkJCQkJICAgICB0cnVlLCBmYWxzZSk7CisJfQorCisJc3dpdGNoX2luZGVwX2hwX2RhY3MoY29kZWMpOworCW11dGV4X3VubG9jaygmc3BlYy0+Y29uZmlnX211dGV4KTsKKwogCS8qIHVwZGF0ZSBqYWNrIHBvd2VyIHN0YXRlICovCiAJc2V0X3dpZGdldHNfcG93ZXJfc3RhdGUoY29kZWMpOwotCXJldHVybiAwOworCXZpYV9ocF9hdXRvbXV0ZShjb2RlYyk7CisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2aWFfaHBfbWl4ZXJbMl0gPSB7Ci0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiSW5kZXBlbmRlbnQgSFAiLAotCQkuaW5mbyA9IHZpYV9pbmRlcGVuZGVudF9ocF9pbmZvLAotCQkuZ2V0ID0gdmlhX2luZGVwZW5kZW50X2hwX2dldCwKLQkJLnB1dCA9IHZpYV9pbmRlcGVuZGVudF9ocF9wdXQsCi0JfSwKLQl7Ci0JCS5pZmFjZSA9IE5JRF9NQVBQSU5HLAotCQkubmFtZSA9ICJJbmRlcGVuZGVudCBIUCIsCi0JfSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2aWFfaHBfbWl4ZXIgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiSW5kZXBlbmRlbnQgSFAiLAorCS5pbmZvID0gdmlhX2luZGVwZW5kZW50X2hwX2luZm8sCisJLmdldCA9IHZpYV9pbmRlcGVuZGVudF9ocF9nZXQsCisJLnB1dCA9IHZpYV9pbmRlcGVuZGVudF9ocF9wdXQsCiB9OwogCiBzdGF0aWMgaW50IHZpYV9ocF9idWlsZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTc5OSw1OCArODkzLDI4IEBACiAJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtuZXc7CiAJaGRhX25pZF90IG5pZDsKLQlpbnQgbnVtczsKLQloZGFfbmlkX3QgY29ubltIREFfTUFYX0NPTk5FQ1RJT05TXTsKIAotCXN3aXRjaCAoc3BlYy0+Y29kZWNfdHlwZSkgewotCWNhc2UgVlQxNzE4UzoKLQkJbmlkID0gMHgzNDsKLQkJYnJlYWs7Ci0JY2FzZSBWVDIwMDJQOgotCWNhc2UgVlQxODAyOgotCQluaWQgPSAweDM1OwotCQlicmVhazsKLQljYXNlIFZUMTgxMjoKLQkJbmlkID0gMHgzZDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJbmlkID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoc3BlYy0+Y29kZWNfdHlwZSAhPSBWVDE3MDgpIHsKLQkJbnVtcyA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsCi0JCQkJCSAgICAgICBjb25uLCBIREFfTUFYX0NPTk5FQ1RJT05TKTsKLQkJaWYgKG51bXMgPD0gMSkKLQkJCXJldHVybiAwOwotCX0KLQotCWtuZXcgPSB2aWFfY2xvbmVfY29udHJvbChzcGVjLCAmdmlhX2hwX21peGVyWzBdKTsKKwluaWQgPSBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF07CisJa25ldyA9IHZpYV9jbG9uZV9jb250cm9sKHNwZWMsICZ2aWFfaHBfbWl4ZXIpOwogCWlmIChrbmV3ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJa25ldy0+c3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IG5pZDsKLQlrbmV3LT5wcml2YXRlX3ZhbHVlID0gbmlkOwotCi0Ja25ldyA9IHZpYV9jbG9uZV9jb250cm9sKHNwZWMsICZ2aWFfaHBfbWl4ZXJbMV0pOwotCWlmIChrbmV3ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCWtuZXctPnN1YmRldmljZSA9IHNpZGVfbXV0ZV9jaGFubmVsKHNwZWMpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG5vdGlmeV9hYV9wYXRoX2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaW50IGk7Ci0Jc3RydWN0IHNuZF9jdGxfZWxlbV9pZCBpZDsKLQljb25zdCBjaGFyICpsYWJlbHNbXSA9IHsiTWljIiwgIkZyb250IE1pYyIsICJMaW5lIiwgIlJlYXIgTWljIn07Ci0Jc3RydWN0IHNuZF9rY29udHJvbCAqY3RsOwogCi0JbWVtc2V0KCZpZCwgMCwgc2l6ZW9mKGlkKSk7Ci0JaWQuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsYWJlbHMpOyBpKyspIHsKLQkJc3ByaW50ZihpZC5uYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgbGFiZWxzW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+c21hcnQ1MV9udW1zOyBpKyspIHsKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqY3RsOworCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkOworCQltZW1zZXQoJmlkLCAwLCBzaXplb2YoaWQpKTsKKwkJaWQuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwkJc3ByaW50ZihpZC5uYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgc3BlYy0+c21hcnQ1MV9sYWJlbHNbaV0pOwogCQljdGwgPSBzbmRfaGRhX2ZpbmRfbWl4ZXJfY3RsKGNvZGVjLCBpZC5uYW1lKTsKIAkJaWYgKGN0bCkKIAkJCXNuZF9jdGxfbm90aWZ5KGNvZGVjLT5idXMtPmNhcmQsCkBAIC04NjIsNjYgKzkyNiwyOCBAQAogc3RhdGljIHZvaWQgbXV0ZV9hYV9wYXRoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgbXV0ZSkKIHsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQloZGFfbmlkX3QgIG5pZF9taXhlcjsKLQlpbnQgc3RhcnRfaWR4OwotCWludCBlbmRfaWR4OworCWludCB2YWwgPSBtdXRlID8gSERBX0FNUF9NVVRFIDogSERBX0FNUF9VTk1VVEU7CiAJaW50IGk7Ci0JLyogZ2V0IG5pZCBvZiBNVzAgYW5kIHN0YXJ0ICYgZW5kIGluZGV4ICovCi0Jc3dpdGNoIChzcGVjLT5jb2RlY190eXBlKSB7Ci0JY2FzZSBWVDE3MDg6Ci0JCW5pZF9taXhlciA9IDB4MTc7Ci0JCXN0YXJ0X2lkeCA9IDI7Ci0JCWVuZF9pZHggPSA0OwotCQlicmVhazsKLQljYXNlIFZUMTcwOV8xMENIOgotCWNhc2UgVlQxNzA5XzZDSDoKLQkJbmlkX21peGVyID0gMHgxODsKLQkJc3RhcnRfaWR4ID0gMjsKLQkJZW5kX2lkeCA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgVlQxNzA4Ql84Q0g6Ci0JY2FzZSBWVDE3MDhCXzRDSDoKLQljYXNlIFZUMTcwOFM6Ci0JY2FzZSBWVDE3MTZTOgotCQluaWRfbWl4ZXIgPSAweDE2OwotCQlzdGFydF9pZHggPSAyOwotCQllbmRfaWR4ID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBWVDE3MThTOgotCQluaWRfbWl4ZXIgPSAweDIxOwotCQlzdGFydF9pZHggPSAxOwotCQllbmRfaWR4ID0gMzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KKwogCS8qIGNoZWNrIEFBIHBhdGgncyBtdXRlIHN0YXR1cyAqLwotCWZvciAoaSA9IHN0YXJ0X2lkeDsgaSA8PSBlbmRfaWR4OyBpKyspIHsKLQkJaW50IHZhbCA9IG11dGUgPyBIREFfQU1QX01VVEUgOiBIREFfQU1QX1VOTVVURTsKLQkJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCBuaWRfbWl4ZXIsIEhEQV9JTlBVVCwgaSwKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+c21hcnQ1MV9udW1zOyBpKyspIHsKKwkJaWYgKHNwZWMtPnNtYXJ0NTFfaWR4c1tpXSA8IDApCisJCQljb250aW51ZTsKKwkJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCBzcGVjLT5hYV9taXhfbmlkLAorCQkJCQkgSERBX0lOUFVULCBzcGVjLT5zbWFydDUxX2lkeHNbaV0sCiAJCQkJCSBIREFfQU1QX01VVEUsIHZhbCk7CiAJfQogfQotc3RhdGljIGludCBpc19zbWFydDUxX3BpbnMoc3RydWN0IHZpYV9zcGVjICpzcGVjLCBoZGFfbmlkX3QgcGluKQorCitzdGF0aWMgYm9vbCBpc19zbWFydDUxX3BpbnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW4pCiB7Ci0JY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1faW5wdXRzOyBpKyspIHsKLQkJaWYgKHBpbiA9PSBjZmctPmlucHV0c1tpXS5waW4pCi0JCQlyZXR1cm4gY2ZnLT5pbnB1dHNbaV0udHlwZSA8PSBBVVRPX1BJTl9MSU5FX0lOOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWFfc21hcnQ1MV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47Ci0JdWluZm8tPmNvdW50ID0gMTsKLQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7Ci0JcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IHNwZWMtPnNtYXJ0NTFfbnVtczsgaSsrKQorCQlpZiAoc3BlYy0+c21hcnQ1MV9waW5zW2ldID09IHBpbikKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGludCB2aWFfc21hcnQ1MV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCkBAIC05MjksMjMgKzk1NSw4IEBACiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7Ci0JaW50IG9uID0gMTsKLQlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgewotCQloZGFfbmlkX3QgbmlkID0gY2ZnLT5pbnB1dHNbaV0ucGluOwotCQlpbnQgY3RsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCi0JCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1dJREdFVF9DT05UUk9MLCAwKTsKLQkJaWYgKGNmZy0+aW5wdXRzW2ldLnR5cGUgPiBBVVRPX1BJTl9MSU5FX0lOKQotCQkJY29udGludWU7Ci0JCWlmIChjZmctPmlucHV0c1tpXS50eXBlID09IEFVVE9fUElOX01JQyAmJgotCQkgICAgc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSAmJiBzcGVjLT5jb2RlY190eXBlICE9IFZUMTcxOFMpCi0JCQljb250aW51ZTsgLyogaWdub3JlIEZNaWMgZm9yIGluZGVwZW5kZW50IEhQICovCi0JCWlmICgoY3RsICYgQUNfUElOQ1RMX0lOX0VOKSAmJiAhKGN0bCAmIEFDX1BJTkNUTF9PVVRfRU4pKQotCQkJb24gPSAwOwotCX0KLQkqdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWUgPSBvbjsKKwkqdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWUgPSBzcGVjLT5zbWFydDUxX2VuYWJsZWQ7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk1NCwyMSArOTY1LDE0IEBACiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CiAJaW50IG91dF9pbiA9ICp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZQogCQk/IEFDX1BJTkNUTF9PVVRfRU4gOiBBQ19QSU5DVExfSU5fRU47CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1faW5wdXRzOyBpKyspIHsKLQkJaGRhX25pZF90IG5pZCA9IGNmZy0+aW5wdXRzW2ldLnBpbjsKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+c21hcnQ1MV9udW1zOyBpKyspIHsKKwkJaGRhX25pZF90IG5pZCA9IHNwZWMtPnNtYXJ0NTFfcGluc1tpXTsKIAkJdW5zaWduZWQgaW50IHBhcm07CiAKLQkJaWYgKGNmZy0+aW5wdXRzW2ldLnR5cGUgPiBBVVRPX1BJTl9MSU5FX0lOKQotCQkJY29udGludWU7Ci0JCWlmIChjZmctPmlucHV0c1tpXS50eXBlID09IEFVVE9fUElOX01JQyAmJgotCQkgICAgc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSAmJiBzcGVjLT5jb2RlY190eXBlICE9IFZUMTcxOFMpCi0JCQljb250aW51ZTsgLyogZG9uJ3QgcmV0YXNrIEZNaWMgZm9yIGluZGVwZW5kZW50IEhQICovCi0KIAkJcGFybSA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAogCQkJCQkgIEFDX1ZFUkJfR0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMCk7CiAJCXBhcm0gJj0gfihBQ19QSU5DVExfSU5fRU4gfCBBQ19QSU5DVExfT1VUX0VOKTsKQEAgLTk4MCwxNzEgKzk4NCw1OSBAQAogCQkJbXV0ZV9hYV9wYXRoKGNvZGVjLCAxKTsKIAkJCW5vdGlmeV9hYV9wYXRoX2N0bHMoY29kZWMpOwogCQl9Ci0JCWlmIChzcGVjLT5jb2RlY190eXBlID09IFZUMTcxOFMpIHsKLQkJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbygKLQkJCQkJY29kZWMsIG5pZCwgSERBX09VVFBVVCwgMCwgSERBX0FNUF9NVVRFLAotCQkJCQlIREFfQU1QX1VOTVVURSk7Ci0JCX0KLQkJaWYgKGNmZy0+aW5wdXRzW2ldLnR5cGUgPT0gQVVUT19QSU5fTUlDKSB7Ci0JCQlpZiAoc3BlYy0+Y29kZWNfdHlwZSA9PSBWVDE3MDhTCi0JCQkgICAgfHwgc3BlYy0+Y29kZWNfdHlwZSA9PSBWVDE3MTZTKSB7Ci0JCQkJLyogaW5wdXQgPSBpbmRleCAxIChBT1czKSAqLwotCQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoCi0JCQkJCWNvZGVjLCBuaWQsIDAsCi0JCQkJCUFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAxKTsKLQkJCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oCi0JCQkJCWNvZGVjLCBuaWQsIEhEQV9PVVRQVVQsCi0JCQkJCTAsIEhEQV9BTVBfTVVURSwgSERBX0FNUF9VTk1VVEUpOwotCQkJfQotCQl9CiAJfQogCXNwZWMtPnNtYXJ0NTFfZW5hYmxlZCA9ICp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKIAlzZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZShjb2RlYyk7CiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2aWFfc21hcnQ1MV9taXhlclsyXSA9IHsKLQl7Ci0JIC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCSAubmFtZSA9ICJTbWFydCA1LjEiLAotCSAuY291bnQgPSAxLAotCSAuaW5mbyA9IHZpYV9zbWFydDUxX2luZm8sCi0JIC5nZXQgPSB2aWFfc21hcnQ1MV9nZXQsCi0JIC5wdXQgPSB2aWFfc21hcnQ1MV9wdXQsCi0JIH0sCi0JewotCSAuaWZhY2UgPSBOSURfTUFQUElORywKLQkgLm5hbWUgPSAiU21hcnQgNS4xIiwKLQl9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdmlhX3NtYXJ0NTFfbWl4ZXIgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiU21hcnQgNS4xIiwKKwkuY291bnQgPSAxLAorCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywKKwkuZ2V0ID0gdmlhX3NtYXJ0NTFfZ2V0LAorCS5wdXQgPSB2aWFfc21hcnQ1MV9wdXQsCiB9OwogCi1zdGF0aWMgaW50IHZpYV9zbWFydDUxX2J1aWxkKHN0cnVjdCB2aWFfc3BlYyAqc3BlYykKK3N0YXRpYyBpbnQgdmlhX3NtYXJ0NTFfYnVpbGQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0Jc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtuZXc7Ci0JY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7Ci0JaGRhX25pZF90IG5pZDsKLQlpbnQgaTsKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAotCWlmICghY2ZnKQorCWlmICghc3BlYy0+c21hcnQ1MV9udW1zKQogCQlyZXR1cm4gMDsKLQlpZiAoY2ZnLT5saW5lX291dHMgPiAyKQotCQlyZXR1cm4gMDsKLQotCWtuZXcgPSB2aWFfY2xvbmVfY29udHJvbChzcGVjLCAmdmlhX3NtYXJ0NTFfbWl4ZXJbMF0pOwotCWlmIChrbmV3ID09IE5VTEwpCisJaWYgKCF2aWFfY2xvbmVfY29udHJvbChzcGVjLCAmdmlhX3NtYXJ0NTFfbWl4ZXIpKQogCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgewotCQluaWQgPSBjZmctPmlucHV0c1tpXS5waW47Ci0JCWlmIChjZmctPmlucHV0c1tpXS50eXBlIDw9IEFVVE9fUElOX0xJTkVfSU4pIHsKLQkJCWtuZXcgPSB2aWFfY2xvbmVfY29udHJvbChzcGVjLCAmdmlhX3NtYXJ0NTFfbWl4ZXJbMV0pOwotCQkJaWYgKGtuZXcgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCWtuZXctPnN1YmRldmljZSA9IG5pZDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKLS8qIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2dDE3MDhfY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDI3LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MjcsIDB4MCwgSERBX0lOUFVUKSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkvKiBUaGUgbXVsdGlwbGUgIkNhcHR1cmUgU291cmNlIiBjb250cm9scyBjb25mdXNlIGFsc2FtaXhlcgotCQkgKiBTbyBjYWxsIHNvbWV3aGF0IGRpZmZlcmVudC4uCi0JCSAqLwotCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCi0JCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCi0JCS5jb3VudCA9IDEsCi0JCS5pbmZvID0gdmlhX211eF9lbnVtX2luZm8sCi0JCS5nZXQgPSB2aWFfbXV4X2VudW1fZ2V0LAotCQkucHV0ID0gdmlhX211eF9lbnVtX3B1dCwKLQl9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIGNoZWNrIEFBIHBhdGgncyBtdXRlIHN0YXR1ZSAqLwotc3RhdGljIGludCBpc19hYV9wYXRoX211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCisvKiBjaGVjayBBQSBwYXRoJ3MgbXV0ZSBzdGF0dXMgKi8KK3N0YXRpYyBib29sIGlzX2FhX3BhdGhfbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgbXV0ZSA9IDE7Ci0JaGRhX25pZF90ICBuaWRfbWl4ZXI7Ci0JaW50IHN0YXJ0X2lkeDsKLQlpbnQgZW5kX2lkeDsKLQlpbnQgaTsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQkvKiBnZXQgbmlkIG9mIE1XMCBhbmQgc3RhcnQgJiBlbmQgaW5kZXggKi8KLQlzd2l0Y2ggKHNwZWMtPmNvZGVjX3R5cGUpIHsKLQljYXNlIFZUMTcwOEJfOENIOgotCWNhc2UgVlQxNzA4Ql80Q0g6Ci0JY2FzZSBWVDE3MDhTOgotCWNhc2UgVlQxNzE2UzoKLQkJbmlkX21peGVyID0gMHgxNjsKLQkJc3RhcnRfaWR4ID0gMjsKLQkJZW5kX2lkeCA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgVlQxNzAyOgotCQluaWRfbWl4ZXIgPSAweDFhOwotCQlzdGFydF9pZHggPSAxOwotCQllbmRfaWR4ID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBWVDE3MThTOgotCQluaWRfbWl4ZXIgPSAweDIxOwotCQlzdGFydF9pZHggPSAxOwotCQllbmRfaWR4ID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBWVDIwMDJQOgotCWNhc2UgVlQxODEyOgotCWNhc2UgVlQxODAyOgotCQluaWRfbWl4ZXIgPSAweDIxOwotCQlzdGFydF9pZHggPSAwOwotCQllbmRfaWR4ID0gMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIGNoZWNrIEFBIHBhdGgncyBtdXRlIHN0YXR1cyAqLwotCWZvciAoaSA9IHN0YXJ0X2lkeDsgaSA8PSBlbmRfaWR4OyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGNvbl9saXN0ID0gc25kX2hkYV9jb2RlY19yZWFkKAotCQkJY29kZWMsIG5pZF9taXhlciwgMCwgQUNfVkVSQl9HRVRfQ09OTkVDVF9MSVNULCBpLzQqNCk7Ci0JCWludCBzaGlmdCA9IDggKiAoaSAlIDQpOwotCQloZGFfbmlkX3QgbmlkX3BpbiA9IChjb25fbGlzdCAmICgweGZmIDw8IHNoaWZ0KSkgPj4gc2hpZnQ7Ci0JCXVuc2lnbmVkIGludCBkZWZjb25mID0gc25kX2hkYV9jb2RlY19nZXRfcGluY2ZnKGNvZGVjLCBuaWRfcGluKTsKLQkJaWYgKGdldF9kZWZjZmdfY29ubmVjdChkZWZjb25mKSA9PSBBQ19KQUNLX1BPUlRfQ09NUExFWCkgewotCQkJLyogY2hlY2sgbXV0ZSBzdGF0dXMgd2hpbGUgdGhlIHBpbiBpcyBjb25uZWN0ZWQgKi8KLQkJCWludCBtdXRlX2wgPSBzbmRfaGRhX2NvZGVjX2FtcF9yZWFkKGNvZGVjLCBuaWRfbWl4ZXIsIDAsCi0JCQkJCQkJICAgIEhEQV9JTlBVVCwgaSkgPj4gNzsKLQkJCWludCBtdXRlX3IgPSBzbmRfaGRhX2NvZGVjX2FtcF9yZWFkKGNvZGVjLCBuaWRfbWl4ZXIsIDEsCi0JCQkJCQkJICAgIEhEQV9JTlBVVCwgaSkgPj4gNzsKLQkJCWlmICghbXV0ZV9sIHx8ICFtdXRlX3IpIHsKLQkJCQltdXRlID0gMDsKLQkJCQlicmVhazsKLQkJCX0KKwljb25zdCBzdHJ1Y3QgaGRhX2FtcF9saXN0ICpwOworCWludCBpLCBjaCwgdjsKKworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fbG9vcGJhY2tzOyBpKyspIHsKKwkJcCA9ICZzcGVjLT5sb29wYmFja19saXN0W2ldOworCQlmb3IgKGNoID0gMDsgY2ggPCAyOyBjaCsrKSB7CisJCQl2ID0gc25kX2hkYV9jb2RlY19hbXBfcmVhZChjb2RlYywgcC0+bmlkLCBjaCwgcC0+ZGlyLAorCQkJCQkJICAgcC0+aWR4KTsKKwkJCWlmICghKHYgJiBIREFfQU1QX01VVEUpICYmIHYgPiAwKQorCQkJCXJldHVybiBmYWxzZTsKIAkJfQogCX0KLQlyZXR1cm4gbXV0ZTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogLyogZW50ZXIvZXhpdCBhbmFsb2cgbG93LWN1cnJlbnQgbW9kZSAqLwotc3RhdGljIHZvaWQgYW5hbG9nX2xvd19jdXJyZW50X21vZGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBzdHJlYW1faWRsZSkKK3N0YXRpYyB2b2lkIGFuYWxvZ19sb3dfY3VycmVudF9tb2RlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0YXRpYyBpbnQgc2F2ZWRfc3RyZWFtX2lkbGUgPSAxOyAvKiBzYXZlZCBzdHJlYW0gaWRsZSBzdGF0dXMgKi8KLQlpbnQgZW5hYmxlID0gaXNfYWFfcGF0aF9tdXRlKGNvZGVjKTsKLQl1bnNpZ25lZCBpbnQgdmVyYiA9IDA7Ci0JdW5zaWduZWQgaW50IHBhcm0gPSAwOworCWJvb2wgZW5hYmxlOworCXVuc2lnbmVkIGludCB2ZXJiLCBwYXJtOwogCi0JaWYgKHN0cmVhbV9pZGxlID09IC0xKQkvKiBzdHJlYW0gc3RhdHVzIGRpZCBub3QgY2hhbmdlICovCi0JCWVuYWJsZSA9IGVuYWJsZSAmJiBzYXZlZF9zdHJlYW1faWRsZTsKLQllbHNlIHsKLQkJZW5hYmxlID0gZW5hYmxlICYmIHN0cmVhbV9pZGxlOwotCQlzYXZlZF9zdHJlYW1faWRsZSA9IHN0cmVhbV9pZGxlOwotCX0KKwllbmFibGUgPSBpc19hYV9wYXRoX211dGUoY29kZWMpICYmIChzcGVjLT5vcGVuZWRfc3RyZWFtcyAhPSAwKTsKIAogCS8qIGRlY2lkZSBsb3cgY3VycmVudCBtb2RlJ3MgdmVyYiAmIHBhcmFtZXRlciAqLwogCXN3aXRjaCAoc3BlYy0+Y29kZWNfdHlwZSkgewpAQCAtMTE3OSwxMTkgKzEwNzEsNjkgQEAKIC8qCiAgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgdnQxNzA4X3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0xIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDI3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQotCi0JLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCi0JICogbWl4ZXIgd2lkZ2V0Ci0JICovCi0JLyogQW1wIEluZGljZXM6IENEID0gMSwgTWljMSA9IDIsIExpbmUgPSAzLCBNaWMyID0gNCAqLwotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDE5IC0gMHgxYikKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogU2V0dXAgZGVmYXVsdCBpbnB1dCBNVzAgdG8gUFc0ICovCi0JezB4MjAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQkvKiBQVzkgT3V0cHV0IGVuYWJsZSAqLwotCXsweDI1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2dDE3MDhfaW5pdF92ZXJic1tdID0gewogCS8qIHBvd2VyIGRvd24gamFjayBkZXRlY3QgZnVuY3Rpb24gKi8KIAl7MHgxLCAweGY4MSwgMHgxfSwKIAl7IH0KIH07CiAKLXN0YXRpYyBpbnQgdmlhX3BsYXliYWNrX3BjbV9vcGVuKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCitzdGF0aWMgdm9pZCBzZXRfc3RyZWFtX29wZW4oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBiaXQsIGJvb2wgYWN0aXZlKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJaWYgKGFjdGl2ZSkKKwkJc3BlYy0+b3BlbmVkX3N0cmVhbXMgfD0gYml0OworCWVsc2UKKwkJc3BlYy0+b3BlbmVkX3N0cmVhbXMgJj0gfmJpdDsKKwlhbmFsb2dfbG93X2N1cnJlbnRfbW9kZShjb2RlYyk7Cit9CisKK3N0YXRpYyBpbnQgdmlhX3BsYXliYWNrX211bHRpX3BjbV9vcGVuKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCiAJCQkJIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCSBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaWRsZSA9IHN1YnN0cmVhbS0+cHN0ci0+c3Vic3RyZWFtX29wZW5lZCA9PSAxCi0JCSYmIHN1YnN0cmVhbS0+cmVmX2NvdW50ID09IDA7Ci0JYW5hbG9nX2xvd19jdXJyZW50X21vZGUoY29kZWMsIGlkbGUpOwotCXJldHVybiBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfb3Blbihjb2RlYywgJnNwZWMtPm11bHRpb3V0LCBzdWJzdHJlYW0sCi0JCQkJCSAgICAgaGluZm8pOworCWNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCWludCBlcnI7CisKKwlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IGNmZy0+bGluZV9vdXRzICsgc3BlYy0+c21hcnQ1MV9udW1zOworCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzICogMjsKKwlzZXRfc3RyZWFtX29wZW4oY29kZWMsIFNUUkVBTV9NVUxUSV9PVVQsIHRydWUpOworCWVyciA9IHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19vcGVuKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsIHN1YnN0cmVhbSwKKwkJCQkJICAgIGhpbmZvKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzZXRfc3RyZWFtX29wZW4oY29kZWMsIFNUUkVBTV9NVUxUSV9PVVQsIGZhbHNlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBsYXliYWNrX211bHRpX3BjbV9wcmVwXzAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGZvcm1hdCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3N0YXRpYyBpbnQgdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbG9zZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzZXRfc3RyZWFtX29wZW4oY29kZWMsIFNUUkVBTV9NVUxUSV9PVVQsIGZhbHNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFfcGxheWJhY2tfaHBfcGNtX29wZW4oc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0ID0gJnNwZWMtPm11bHRpb3V0OwotCWNvbnN0IGhkYV9uaWRfdCAqbmlkcyA9IG1vdXQtPmRhY19uaWRzOwotCWludCBjaHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOwotCWludCBpOwogCi0JbXV0ZXhfbG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKLQlpZiAobW91dC0+ZGlnX291dF9uaWQgJiYgbW91dC0+ZGlnX291dF91c2VkICE9IEhEQV9ESUdfRVhDTFVTSVZFKSB7Ci0JCWlmIChjaHMgPT0gMiAmJgotCQkgICAgc25kX2hkYV9pc19zdXBwb3J0ZWRfZm9ybWF0KGNvZGVjLCBtb3V0LT5kaWdfb3V0X25pZCwKLQkJCQkJCWZvcm1hdCkgJiYKLQkJICAgICEoY29kZWMtPnNwZGlmX3N0YXR1cyAmIElFQzk1OF9BRVMwX05PTkFVRElPKSkgewotCQkJbW91dC0+ZGlnX291dF91c2VkID0gSERBX0RJR19BTkFMT0dfRFVQOwotCQkJLyogdHVybiBvZmYgU1BESUYgb25jZTsgb3RoZXJ3aXNlIHRoZSBJRUM5NTggYml0cyB3b24ndAotCQkJICogYmUgdXBkYXRlZCAqLwotCQkJaWYgKGNvZGVjLT5zcGRpZl9jdGxzICYgQUNfRElHMV9FTkFCTEUpCi0JCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbW91dC0+ZGlnX291dF9uaWQsIDAsCi0JCQkJCQkgICAgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsCi0JCQkJCQkgICAgY29kZWMtPnNwZGlmX2N0bHMgJgotCQkJCQkJCX5BQ19ESUcxX0VOQUJMRSAmIDB4ZmYpOwotCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLAotCQkJCQkJICAgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKLQkJCS8qIHR1cm4gb24gYWdhaW4gKGlmIG5lZWRlZCkgKi8KLQkJCWlmIChjb2RlYy0+c3BkaWZfY3RscyAmIEFDX0RJRzFfRU5BQkxFKQotCQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLCAwLAotCQkJCQkJICAgIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLAotCQkJCQkJICAgIGNvZGVjLT5zcGRpZl9jdGxzICYgMHhmZik7Ci0JCX0gZWxzZSB7Ci0JCQltb3V0LT5kaWdfb3V0X3VzZWQgPSAwOwotCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLAotCQkJCQkJICAgMCwgMCwgMCk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCWlmIChzbmRfQlVHX09OKCFzcGVjLT5ocF9kYWNfbmlkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2V0X3N0cmVhbV9vcGVuKGNvZGVjLCBTVFJFQU1fSU5ERVBfSFAsIHRydWUpOworCXJldHVybiAwOworfQogCi0JLyogZnJvbnQgKi8KLQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkc1tIREFfRlJPTlRdLCBzdHJlYW1fdGFnLAotCQkJCSAgIDAsIGZvcm1hdCk7Ci0KLQlpZiAobW91dC0+aHBfbmlkICYmIG1vdXQtPmhwX25pZCAhPSBuaWRzW0hEQV9GUk9OVF0KLQkgICAgJiYgIXNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUpCi0JCS8qIGhlYWRwaG9uZSBvdXQgd2lsbCBqdXN0IGRlY29kZSBmcm9udCBsZWZ0L3JpZ2h0IChzdGVyZW8pICovCi0JCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBtb3V0LT5ocF9uaWQsIHN0cmVhbV90YWcsCi0JCQkJCSAgIDAsIGZvcm1hdCk7Ci0KLQkvKiBleHRyYSBvdXRwdXRzIGNvcGllZCBmcm9tIGZyb250ICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW91dC0+ZXh0cmFfb3V0X25pZCk7IGkrKykKLQkJaWYgKG1vdXQtPmV4dHJhX291dF9uaWRbaV0pCi0JCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywKLQkJCQkJCSAgIG1vdXQtPmV4dHJhX291dF9uaWRbaV0sCi0JCQkJCQkgICBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOwotCi0JLyogc3Vycm91bmRzICovCi0JZm9yIChpID0gMTsgaSA8IG1vdXQtPm51bV9kYWNzOyBpKyspIHsKLQkJaWYgKGNocyA+PSAoaSArIDEpICogMikgLyogaW5kZXBlbmRlbnQgb3V0ICovCi0JCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkc1tpXSwgc3RyZWFtX3RhZywKLQkJCQkJCSAgIGkgKiAyLCBmb3JtYXQpOwotCQllbHNlIC8qIGNvcHkgZnJvbnQgKi8KLQkJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBuaWRzW2ldLCBzdHJlYW1fdGFnLAotCQkJCQkJICAgMCwgZm9ybWF0KTsKLQl9CitzdGF0aWMgaW50IHZpYV9wbGF5YmFja19ocF9wY21fY2xvc2Uoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc2V0X3N0cmVhbV9vcGVuKGNvZGVjLCBTVFJFQU1fSU5ERVBfSFAsIGZhbHNlKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKQEAgLTEzMDEsMTggKzExNDMsMzYgQEAKIAkJCQkJICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCA9ICZzcGVjLT5tdWx0aW91dDsKLQljb25zdCBoZGFfbmlkX3QgKm5pZHMgPSBtb3V0LT5kYWNfbmlkczsKIAotCWlmIChzdWJzdHJlYW0tPm51bWJlciA9PSAwKQotCQlwbGF5YmFja19tdWx0aV9wY21fcHJlcF8wKGNvZGVjLCBzdHJlYW1fdGFnLCBmb3JtYXQsCi0JCQkJCSAgc3Vic3RyZWFtKTsKLQllbHNlIHsKLQkJaWYgKG1vdXQtPmhwX25pZCAmJiBtb3V0LT5ocF9uaWQgIT0gbmlkc1tIREFfRlJPTlRdICYmCi0JCSAgICBzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlKQotCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmhwX25pZCwKLQkJCQkJCSAgIHN0cmVhbV90YWcsIDAsIGZvcm1hdCk7Ci0JfQorCW11dGV4X2xvY2soJnNwZWMtPmNvbmZpZ19tdXRleCk7CisJc2V0dXBfcGxheWJhY2tfbXVsdGlfcGNtKHNwZWMpOworCXNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19wcmVwYXJlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsIHN0cmVhbV90YWcsCisJCQkJCSBmb3JtYXQsIHN1YnN0cmVhbSk7CisJLyogcmVtZW1iZXIgZm9yIGR5bmFtaWMgREFDIHN3aXRjaCB3aXRoIGluZGVwLUhQICovCisJc3BlYy0+YWN0aXZlX3N0cmVhbXMgfD0gU1RSRUFNX01VTFRJX09VVDsKKwlzcGVjLT5jdXJfZGFjX3N0cmVhbV90YWcgPSBzdHJlYW1fdGFnOworCXNwZWMtPmN1cl9kYWNfZm9ybWF0ID0gZm9ybWF0OworCW11dGV4X3VubG9jaygmc3BlYy0+Y29uZmlnX211dGV4KTsKKwl2dDE3MDhfc3RhcnRfaHBfd29yayhzcGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFfcGxheWJhY2tfaHBfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCW11dGV4X2xvY2soJnNwZWMtPmNvbmZpZ19tdXRleCk7CisJaWYgKHNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUpCisJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5ocF9kYWNfbmlkLAorCQkJCQkgICBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOworCXNwZWMtPmFjdGl2ZV9zdHJlYW1zIHw9IFNUUkVBTV9JTkRFUF9IUDsKKwlzcGVjLT5jdXJfaHBfc3RyZWFtX3RhZyA9IHN0cmVhbV90YWc7CisJc3BlYy0+Y3VyX2hwX2Zvcm1hdCA9IGZvcm1hdDsKKwltdXRleF91bmxvY2soJnNwZWMtPmNvbmZpZ19tdXRleCk7CiAJdnQxNzA4X3N0YXJ0X2hwX3dvcmsoc3BlYyk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMzIyLDM3ICsxMTgyLDI2IEBACiAJCQkJICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0ID0gJnNwZWMtPm11bHRpb3V0OwotCWNvbnN0IGhkYV9uaWRfdCAqbmlkcyA9IG1vdXQtPmRhY19uaWRzOwotCWludCBpOwogCi0JaWYgKHN1YnN0cmVhbS0+bnVtYmVyID09IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IG1vdXQtPm51bV9kYWNzOyBpKyspCi0JCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkc1tpXSwgMCwgMCwgMCk7CisJbXV0ZXhfbG9jaygmc3BlYy0+Y29uZmlnX211dGV4KTsKKwlzbmRfaGRhX211bHRpX291dF9hbmFsb2dfY2xlYW51cChjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKKwlzcGVjLT5hY3RpdmVfc3RyZWFtcyAmPSB+U1RSRUFNX01VTFRJX09VVDsKKwltdXRleF91bmxvY2soJnNwZWMtPmNvbmZpZ19tdXRleCk7CisJdnQxNzA4X3N0b3BfaHBfd29yayhzcGVjKTsKKwlyZXR1cm4gMDsKK30KIAotCQlpZiAobW91dC0+aHBfbmlkICYmICFzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlKQotCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmhwX25pZCwKLQkJCQkJCSAgIDAsIDAsIDApOworc3RhdGljIGludCB2aWFfcGxheWJhY2tfaHBfcGNtX2NsZWFudXAoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vdXQtPmV4dHJhX291dF9uaWQpOyBpKyspCi0JCQlpZiAobW91dC0+ZXh0cmFfb3V0X25pZFtpXSkKLQkJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywKLQkJCQkJCQltb3V0LT5leHRyYV9vdXRfbmlkW2ldLAotCQkJCQkJCTAsIDAsIDApOwotCQltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOwotCQlpZiAobW91dC0+ZGlnX291dF9uaWQgJiYKLQkJICAgIG1vdXQtPmRpZ19vdXRfdXNlZCA9PSBIREFfRElHX0FOQUxPR19EVVApIHsKLQkJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBtb3V0LT5kaWdfb3V0X25pZCwKLQkJCQkJCSAgIDAsIDAsIDApOwotCQkJbW91dC0+ZGlnX291dF91c2VkID0gMDsKLQkJfQotCQltdXRleF91bmxvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7Ci0JfSBlbHNlIHsKLQkJaWYgKG1vdXQtPmhwX25pZCAmJiBtb3V0LT5ocF9uaWQgIT0gbmlkc1tIREFfRlJPTlRdICYmCi0JCSAgICBzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlKQotCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmhwX25pZCwKLQkJCQkJCSAgIDAsIDAsIDApOwotCX0KKwltdXRleF9sb2NrKCZzcGVjLT5jb25maWdfbXV0ZXgpOworCWlmIChzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlKQorCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgc3BlYy0+aHBfZGFjX25pZCwgMCwgMCwgMCk7CisJc3BlYy0+YWN0aXZlX3N0cmVhbXMgJj0gflNUUkVBTV9JTkRFUF9IUDsKKwltdXRleF91bmxvY2soJnNwZWMtPmNvbmZpZ19tdXRleCk7CiAJdnQxNzA4X3N0b3BfaHBfd29yayhzcGVjKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE0MjEsNDcgKzEyNzAsMTI3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA4X3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAyLAorLyogYW5hbG9nIGNhcHR1cmUgd2l0aCBkeW5hbWljIEFEQyBzd2l0Y2hpbmcgKi8KK3N0YXRpYyBpbnQgdmlhX2R5bl9hZGNfY2FwdHVyZV9wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCQkgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJCSAgIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBhZGNfaWR4ID0gc3BlYy0+aW5wdXRzW3NwZWMtPmN1cl9tdXhbMF1dLmFkY19pZHg7CisKKwltdXRleF9sb2NrKCZzcGVjLT5jb25maWdfbXV0ZXgpOworCXNwZWMtPmN1cl9hZGMgPSBzcGVjLT5hZGNfbmlkc1thZGNfaWR4XTsKKwlzcGVjLT5jdXJfYWRjX3N0cmVhbV90YWcgPSBzdHJlYW1fdGFnOworCXNwZWMtPmN1cl9hZGNfZm9ybWF0ID0gZm9ybWF0OworCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5jdXJfYWRjLCBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOworCW11dGV4X3VubG9jaygmc3BlYy0+Y29uZmlnX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFfZHluX2FkY19jYXB0dXJlX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJCSAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCW11dGV4X2xvY2soJnNwZWMtPmNvbmZpZ19tdXRleCk7CisJc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgc3BlYy0+Y3VyX2FkYyk7CisJc3BlYy0+Y3VyX2FkYyA9IDA7CisJbXV0ZXhfdW5sb2NrKCZzcGVjLT5jb25maWdfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKiByZS1zZXR1cCB0aGUgc3RyZWFtIGlmIHJ1bm5pbmc7IGNhbGxlZCBmcm9tIGlucHV0LXNyYyBwdXQgKi8KK3N0YXRpYyBib29sIHZpYV9keW5fYWRjX3BjbV9yZXNldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgY3VyKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBhZGNfaWR4ID0gc3BlYy0+aW5wdXRzW2N1cl0uYWRjX2lkeDsKKwloZGFfbmlkX3QgYWRjID0gc3BlYy0+YWRjX25pZHNbYWRjX2lkeF07CisJYm9vbCByZXQgPSBmYWxzZTsKKworCW11dGV4X2xvY2soJnNwZWMtPmNvbmZpZ19tdXRleCk7CisJaWYgKHNwZWMtPmN1cl9hZGMgJiYgc3BlYy0+Y3VyX2FkYyAhPSBhZGMpIHsKKwkJLyogc3RyZWFtIGlzIHJ1bm5pbmcsIGxldCdzIHN3YXAgdGhlIGN1cnJlbnQgQURDICovCisJCV9fc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgc3BlYy0+Y3VyX2FkYywgMSk7CisJCXNwZWMtPmN1cl9hZGMgPSBhZGM7CisJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBhZGMsCisJCQkJCSAgIHNwZWMtPmN1cl9hZGNfc3RyZWFtX3RhZywgMCwKKwkJCQkJICAgc3BlYy0+Y3VyX2FkY19mb3JtYXQpOworCQlyZXQgPSB0cnVlOworCX0KKwltdXRleF91bmxvY2soJnNwZWMtPmNvbmZpZ19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2aWFfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDgsCi0JLm5pZCA9IDB4MTAsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLworCS8qIE5JRCBpcyBzZXQgaW4gdmlhX2J1aWxkX3BjbXMgKi8KIAkub3BzID0gewotCQkub3BlbiA9IHZpYV9wbGF5YmFja19wY21fb3BlbiwKKwkJLm9wZW4gPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX29wZW4sCisJCS5jbG9zZSA9IHZpYV9wbGF5YmFja19tdWx0aV9wY21fY2xvc2UsCiAJCS5wcmVwYXJlID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9wcmVwYXJlLAogCQkuY2xlYW51cCA9IHZpYV9wbGF5YmFja19tdWx0aV9wY21fY2xlYW51cAogCX0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZpYV9wY21faHBfcGxheWJhY2sgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS8qIE5JRCBpcyBzZXQgaW4gdmlhX2J1aWxkX3BjbXMgKi8KKwkub3BzID0geworCQkub3BlbiA9IHZpYV9wbGF5YmFja19ocF9wY21fb3BlbiwKKwkJLmNsb3NlID0gdmlhX3BsYXliYWNrX2hwX3BjbV9jbG9zZSwKKwkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfaHBfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX2hwX3BjbV9jbGVhbnVwCisJfSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA4X3BjbV9hbmFsb2dfczE2X3BsYXliYWNrID0gewotCS5zdWJzdHJlYW1zID0gMiwKKwkuc3Vic3RyZWFtcyA9IDEsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDgsCi0JLm5pZCA9IDB4MTAsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLworCS8qIE5JRCBpcyBzZXQgaW4gdmlhX2J1aWxkX3BjbXMgKi8KIAkvKiBXZSBnb3Qgbm9pc3kgb3V0cHV0cyBvbiB0aGUgcmlnaHQgY2hhbm5lbCBvbiBWVDE3MDggd2hlbgogCSAqIDI0Yml0IHNhbXBsZXMgYXJlIHVzZWQuICBVbnRpbCBhbnkgd29ya2Fyb3VuZCBpcyBmb3VuZCwKIAkgKiBkaXNhYmxlIHRoZSAyNGJpdCBmb3JtYXQsIHNvIGZhci4KIAkgKi8KIAkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAogCS5vcHMgPSB7Ci0JCS5vcGVuID0gdmlhX3BsYXliYWNrX3BjbV9vcGVuLAorCQkub3BlbiA9IHZpYV9wbGF5YmFja19tdWx0aV9wY21fb3BlbiwKKwkJLmNsb3NlID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbG9zZSwKIAkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBhcmUsCiAJCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbGVhbnVwCiAJfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA4X3BjbV9hbmFsb2dfY2FwdHVyZSA9IHsKLQkuc3Vic3RyZWFtcyA9IDIsCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZpYV9wY21fYW5hbG9nX2NhcHR1cmUgPSB7CisJLnN1YnN0cmVhbXMgPSAxLCAvKiB3aWxsIGJlIGNoYW5nZWQgaW4gdmlhX2J1aWxkX3BjbXMoKSAqLwogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSAyLAotCS5uaWQgPSAweDE1LCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KKwkvKiBOSUQgaXMgc2V0IGluIHZpYV9idWlsZF9wY21zICovCiAJLm9wcyA9IHsKIAkJLnByZXBhcmUgPSB2aWFfY2FwdHVyZV9wY21fcHJlcGFyZSwKIAkJLmNsZWFudXAgPSB2aWFfY2FwdHVyZV9wY21fY2xlYW51cAogCX0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOF9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdmlhX3BjbV9keW5fYWRjX2FuYWxvZ19jYXB0dXJlID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkvKiBOSUQgaXMgc2V0IGluIHZpYV9idWlsZF9wY21zICovCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSB2aWFfZHluX2FkY19jYXB0dXJlX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IHZpYV9keW5fYWRjX2NhcHR1cmVfcGNtX2NsZWFudXAsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdmlhX3BjbV9kaWdpdGFsX3BsYXliYWNrID0gewogCS5zdWJzdHJlYW1zID0gMSwKIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gMiwKQEAgLTE0NzQsMTkgKzE0MDMsNDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDhfcGNtX2RpZ2l0YWxfY2FwdHVyZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdmlhX3BjbV9kaWdpdGFsX2NhcHR1cmUgPSB7CiAJLnN1YnN0cmVhbXMgPSAxLAogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSAyLAogfTsKIAorLyoKKyAqIHNsYXZlIGNvbnRyb2xzIGZvciB2aXJ0dWFsIG1hc3RlcgorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpYV9zbGF2ZV92b2xzW10gPSB7CisJIkZyb250IFBsYXliYWNrIFZvbHVtZSIsCisJIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsCisJIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLAorCSJMRkUgUGxheWJhY2sgVm9sdW1lIiwKKwkiU2lkZSBQbGF5YmFjayBWb2x1bWUiLAorCSJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwKKwkiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpYV9zbGF2ZV9zd3NbXSA9IHsKKwkiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwKKwkiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwKKwkiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsCisJIkxGRSBQbGF5YmFjayBTd2l0Y2giLAorCSJTaWRlIFBsYXliYWNrIFN3aXRjaCIsCisJIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLAorCSJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsCisJTlVMTCwKK307CisKIHN0YXRpYyBpbnQgdmlhX2J1aWxkX2NvbnRyb2xzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7Ci0JY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtuZXc7CiAJaW50IGVyciwgaTsKIAorCWlmIChzcGVjLT5zZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZSkKKwkJaWYgKCF2aWFfY2xvbmVfY29udHJvbChzcGVjLCAmdmlhX3Bpbl9wb3dlcl9jdGxfZW51bSkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwogCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fbWl4ZXJzOyBpKyspIHsKIAkJZXJyID0gc25kX2hkYV9hZGRfbmV3X2N0bHMoY29kZWMsIHNwZWMtPm1peGVyc1tpXSk7CiAJCWlmIChlcnIgPCAwKQpAQCAtMTQ5NSw2ICsxNDUyLDcgQEAKIAogCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkgewogCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywKKwkJCQkJCSAgICBzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCwKIAkJCQkJCSAgICBzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKQEAgLTE1MTAsNiArMTQ2OCwyMyBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKKwkvKiBpZiB3ZSBoYXZlIG5vIG1hc3RlciBjb250cm9sLCBsZXQncyBjcmVhdGUgaXQgKi8KKwlpZiAoIXNuZF9oZGFfZmluZF9taXhlcl9jdGwoY29kZWMsICJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIikpIHsKKwkJdW5zaWduZWQgaW50IHZtYXN0ZXJfdGx2WzRdOworCQlzbmRfaGRhX3NldF92bWFzdGVyX3Rsdihjb2RlYywgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF0sCisJCQkJCUhEQV9PVVRQVVQsIHZtYXN0ZXJfdGx2KTsKKwkJZXJyID0gc25kX2hkYV9hZGRfdm1hc3Rlcihjb2RlYywgIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLAorCQkJCQkgIHZtYXN0ZXJfdGx2LCB2aWFfc2xhdmVfdm9scyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKCFzbmRfaGRhX2ZpbmRfbWl4ZXJfY3RsKGNvZGVjLCAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIpKSB7CisJCWVyciA9IHNuZF9oZGFfYWRkX3ZtYXN0ZXIoY29kZWMsICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICBOVUxMLCB2aWFfc2xhdmVfc3dzKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwogCS8qIGFzc2lnbiBDYXB0dXJlIFNvdXJjZSBlbnVtcyB0byBOSUQgKi8KIAlrY3RsID0gc25kX2hkYV9maW5kX21peGVyX2N0bChjb2RlYywgIklucHV0IFNvdXJjZSIpOwogCWZvciAoaSA9IDA7IGtjdGwgJiYgaSA8IGtjdGwtPmNvdW50OyBpKyspIHsKQEAgLTE1MTgsMjIgKzE0OTMsOSBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQkvKiBvdGhlciBuaWQtPmNvbnRyb2wgbWFwcGluZyAqLwotCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fbWl4ZXJzOyBpKyspIHsKLQkJZm9yIChrbmV3ID0gc3BlYy0+bWl4ZXJzW2ldOyBrbmV3LT5uYW1lOyBrbmV3KyspIHsKLQkJCWlmIChrbmV3LT5pZmFjZSAhPSBOSURfTUFQUElORykKLQkJCQljb250aW51ZTsKLQkJCWtjdGwgPSBzbmRfaGRhX2ZpbmRfbWl4ZXJfY3RsKGNvZGVjLCBrbmV3LT5uYW1lKTsKLQkJCWlmIChrY3RsID09IE5VTEwpCi0JCQkJY29udGludWU7Ci0JCQllcnIgPSBzbmRfaGRhX2FkZF9uaWQoY29kZWMsIGtjdGwsIDAsCi0JCQkJCSAgICAgIGtuZXctPnN1YmRldmljZSk7Ci0JCX0KLQl9Ci0KIAkvKiBpbml0IHBvd2VyIHN0YXRlcyAqLwogCXNldF93aWRnZXRzX3Bvd2VyX3N0YXRlKGNvZGVjKTsKLQlhbmFsb2dfbG93X2N1cnJlbnRfbW9kZShjb2RlYywgMSk7CisJYW5hbG9nX2xvd19jdXJyZW50X21vZGUoY29kZWMpOwogCiAJdmlhX2ZyZWVfa2N0bHMoY29kZWMpOyAvKiBubyBsb25nZXIgbmVlZGVkICovCiAJcmV0dXJuIDA7CkBAIC0xNTQ3LDM2ICsxNTA5LDcxIEBACiAJY29kZWMtPm51bV9wY21zID0gMTsKIAljb2RlYy0+cGNtX2luZm8gPSBpbmZvOwogCisJc25wcmludGYoc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nLCBzaXplb2Yoc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nKSwKKwkJICIlcyBBbmFsb2ciLCBjb2RlYy0+Y2hpcF9uYW1lKTsKIAlpbmZvLT5uYW1lID0gc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nOworCisJaWYgKCFzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrKQorCQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJnZpYV9wY21fYW5hbG9nX3BsYXliYWNrOwogCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9Ci0JCSooc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayk7CisJCSpzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrOwogCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPQogCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXTsKLQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9ICooc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlKTsKLQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPSBzcGVjLT5hZGNfbmlkc1swXTsKLQogCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5jaGFubmVsc19tYXggPQogCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHM7CiAKKwlpZiAoIXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSkgeworCQlpZiAoc3BlYy0+ZHluX2FkY19zd2l0Y2gpCisJCQlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPQorCQkJCSZ2aWFfcGNtX2R5bl9hZGNfYW5hbG9nX2NhcHR1cmU7CisJCWVsc2UKKwkJCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2aWFfcGNtX2FuYWxvZ19jYXB0dXJlOworCX0KKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9CisJCSpzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmU7CisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubmlkID0gc3BlYy0+YWRjX25pZHNbMF07CisJaWYgKCFzcGVjLT5keW5fYWRjX3N3aXRjaCkKKwkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtcyA9CisJCQlzcGVjLT5udW1fYWRjX25pZHM7CisKIAlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgfHwgc3BlYy0+ZGlnX2luX25pZCkgewogCQljb2RlYy0+bnVtX3BjbXMrKzsKIAkJaW5mbysrOworCQlzbnByaW50ZihzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsLAorCQkJIHNpemVvZihzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsKSwKKwkJCSAiJXMgRGlnaXRhbCIsIGNvZGVjLT5jaGlwX25hbWUpOwogCQlpbmZvLT5uYW1lID0gc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbDsKIAkJaW5mby0+cGNtX3R5cGUgPSBIREFfUENNX1RZUEVfU1BESUY7CiAJCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkgeworCQkJaWYgKCFzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjaykKKwkJCQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9CisJCQkJCSZ2aWFfcGNtX2RpZ2l0YWxfcGxheWJhY2s7CiAJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPQotCQkJCSooc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2spOworCQkJCSpzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjazsKIAkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPQogCQkJCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkOwogCQl9CiAJCWlmIChzcGVjLT5kaWdfaW5fbmlkKSB7CisJCQlpZiAoIXNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUpCisJCQkJc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSA9CisJCQkJCSZ2aWFfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKIAkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0KLQkJCQkqKHNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUpOworCQkJCSpzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlOwogCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubmlkID0KIAkJCQlzcGVjLT5kaWdfaW5fbmlkOwogCQl9CiAJfQogCisJaWYgKHNwZWMtPmhwX2RhY19uaWQpIHsKKwkJY29kZWMtPm51bV9wY21zKys7CisJCWluZm8rKzsKKwkJc25wcmludGYoc3BlYy0+c3RyZWFtX25hbWVfaHAsIHNpemVvZihzcGVjLT5zdHJlYW1fbmFtZV9ocCksCisJCQkgIiVzIEhQIiwgY29kZWMtPmNoaXBfbmFtZSk7CisJCWluZm8tPm5hbWUgPSBzcGVjLT5zdHJlYW1fbmFtZV9ocDsKKwkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0gdmlhX3BjbV9ocF9wbGF5YmFjazsKKwkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLm5pZCA9CisJCQlzcGVjLT5ocF9kYWNfbmlkOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU4OSw1NyArMTU4Niw2MiBAQAogCiAJdmlhX2ZyZWVfa2N0bHMoY29kZWMpOwogCXZ0MTcwOF9zdG9wX2hwX3dvcmsoc3BlYyk7Ci0Ja2ZyZWUoY29kZWMtPnNwZWMpOworCWtmcmVlKHNwZWMtPmJpbmRfY2FwX3ZvbCk7CisJa2ZyZWUoc3BlYy0+YmluZF9jYXBfc3cpOworCWtmcmVlKHNwZWMpOworfQorCisvKiBtdXRlL3VubXV0ZSBvdXRwdXRzICovCitzdGF0aWMgdm9pZCB0b2dnbGVfb3V0cHV0X211dGVzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgbnVtX3BpbnMsCisJCQkJaGRhX25pZF90ICpwaW5zLCBib29sIG11dGUpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG51bV9waW5zOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHBhcm0gPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIHBpbnNbaV0sIDAsCisJCQkJCSAgQUNfVkVSQl9HRVRfUElOX1dJREdFVF9DT05UUk9MLCAwKTsKKwkJaWYgKHBhcm0gJiBBQ19QSU5DVExfSU5fRU4pCisJCQljb250aW51ZTsKKwkJaWYgKG11dGUpCisJCQlwYXJtICY9IH5BQ19QSU5DVExfT1VUX0VOOworCQllbHNlCisJCQlwYXJtIHw9IEFDX1BJTkNUTF9PVVRfRU47CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHBpbnNbaV0sIDAsCisJCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgcGFybSk7CisJfQorfQorCisvKiBtdXRlIGludGVybmFsIHNwZWFrZXIgaWYgbGluZS1vdXQgaXMgcGx1Z2dlZCAqLworc3RhdGljIHZvaWQgdmlhX2xpbmVfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBwcmVzZW50KQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJaWYgKCFzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfb3V0cykKKwkJcmV0dXJuOworCWlmICghcHJlc2VudCkKKwkJcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsCisJCQkJCSAgICAgIHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSk7CisJdG9nZ2xlX291dHB1dF9tdXRlcyhjb2RlYywgc3BlYy0+YXV0b2NmZy5zcGVha2VyX291dHMsCisJCQkgICAgc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnMsCisJCQkgICAgcHJlc2VudCk7CiB9CiAKIC8qIG11dGUgaW50ZXJuYWwgc3BlYWtlciBpZiBIUCBpcyBwbHVnZ2VkICovCiBzdGF0aWMgdm9pZCB2aWFfaHBfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0JdW5zaWduZWQgaW50IHByZXNlbnQgPSAwOworCWludCBwcmVzZW50ID0gMDsKKwlpbnQgbnVtczsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAotCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pOworCWlmICghc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSAmJiBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pCisJCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pOwogCi0JaWYgKCFzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlKSB7Ci0JCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgaWQ7Ci0JCS8qIGF1dG8gbXV0ZSAqLwotCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oCi0JCQljb2RlYywgc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zWzBdLCBIREFfT1VUUFVULCAwLAotCQkJSERBX0FNUF9NVVRFLCBwcmVzZW50ID8gSERBX0FNUF9NVVRFIDogMCk7Ci0JCS8qIG5vdGlmeSBjaGFuZ2UgKi8KLQkJbWVtc2V0KCZpZCwgMCwgc2l6ZW9mKGlkKSk7Ci0JCWlkLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVI7Ci0JCXN0cmNweShpZC5uYW1lLCAiRnJvbnQgUGxheWJhY2sgU3dpdGNoIik7Ci0JCXNuZF9jdGxfbm90aWZ5KGNvZGVjLT5idXMtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAotCQkJICAgICAgICZpZCk7Ci0JfQotfQorCWlmIChzcGVjLT5zbWFydDUxX2VuYWJsZWQpCisJCW51bXMgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cyArIHNwZWMtPnNtYXJ0NTFfbnVtczsKKwllbHNlCisJCW51bXMgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0czsKKwl0b2dnbGVfb3V0cHV0X211dGVzKGNvZGVjLCBudW1zLCBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnMsIHByZXNlbnQpOwogCi0vKiBtdXRlIG1vbm8gb3V0IGlmIEhQIG9yIExpbmUgb3V0IGlzIHBsdWdnZWQgKi8KLXN0YXRpYyB2b2lkIHZpYV9tb25vX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXVuc2lnbmVkIGludCBocF9wcmVzZW50LCBsaW5lb3V0X3ByZXNlbnQ7Ci0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlpZiAoc3BlYy0+Y29kZWNfdHlwZSAhPSBWVDE3MTZTKQotCQlyZXR1cm47Ci0KLQlsaW5lb3V0X3ByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLAotCQkJCQkgICAgICBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF0pOwotCi0JLyogTXV0ZSBNb25vIE91dCBpZiBMaW5lIE91dCBpcyBwbHVnZ2VkICovCi0JaWYgKGxpbmVvdXRfcHJlc2VudCkgewotCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oCi0JCQljb2RlYywgMHgyQSwgSERBX09VVFBVVCwgMCwgSERBX0FNUF9NVVRFLCBIREFfQU1QX01VVEUpOwotCQlyZXR1cm47Ci0JfQotCi0JaHBfcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSk7Ci0KLQlpZiAoIXNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUpCi0JCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbygKLQkJCWNvZGVjLCAweDJBLCBIREFfT1VUUFVULCAwLCBIREFfQU1QX01VVEUsCi0JCQlocF9wcmVzZW50ID8gSERBX0FNUF9NVVRFIDogMCk7CisJdmlhX2xpbmVfYXV0b211dGUoY29kZWMsIHByZXNlbnQpOwogfQogCiBzdGF0aWMgdm9pZCB2aWFfZ3Bpb19jb250cm9sKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMTY2NCw5ICsxNjY2LDkgQEAKIAogCWlmIChncGlvX2RhdGEgPT0gMHgwMikgewogCQkvKiB1bm11dGUgbGluZSBvdXQgKi8KLQkJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF0sCi0JCQkJCSBIREFfT1VUUFVULCAwLCBIREFfQU1QX01VVEUsIDApOwotCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJCSAgICBQSU5fT1VUKTsKIAkJaWYgKHZvbF9jb3VudGVyICYgMHgyMCkgewogCQkJLyogZGVjcmVhc2Ugdm9sdW1lICovCiAJCQlpZiAodm9sID4gbWFzdGVyX3ZvbCkKQEAgLTE2ODMsNzMgKzE2ODUsMTIgQEAKIAkJfQogCX0gZWxzZSBpZiAoIShncGlvX2RhdGEgJiAweDAyKSkgewogCQkvKiBtdXRlIGxpbmUgb3V0ICovCi0JCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywKLQkJCQkJIHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSwKLQkJCQkJIEhEQV9PVVRQVVQsIDAsIEhEQV9BTVBfTVVURSwKLQkJCQkJIEhEQV9BTVBfTVVURSk7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJCSAgICAwKTsKIAl9CiB9CiAKLS8qIG11dGUgSW50ZXJuYWwtU3BlYWtlciBpZiBIUCBpcyBwbHVnZ2VkICovCi1zdGF0aWMgdm9pZCB2aWFfc3BlYWtlcl9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQl1bnNpZ25lZCBpbnQgaHBfcHJlc2VudDsKLQlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCWlmICghVlQyMDAyUF9DT01QQVRJQkxFKHNwZWMpKQotCQlyZXR1cm47Ci0KLQlocF9wcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKTsKLQotCWlmICghc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSkgewotCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkOwotCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oCi0JCQljb2RlYywgc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0sIEhEQV9PVVRQVVQsIDAsCi0JCQlIREFfQU1QX01VVEUsIGhwX3ByZXNlbnQgPyBIREFfQU1QX01VVEUgOiAwKTsKLQkJLyogbm90aWZ5IGNoYW5nZSAqLwotCQltZW1zZXQoJmlkLCAwLCBzaXplb2YoaWQpKTsKLQkJaWQuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKLQkJc3RyY3B5KGlkLm5hbWUsICJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIpOwotCQlzbmRfY3RsX25vdGlmeShjb2RlYy0+YnVzLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwKLQkJCSAgICAgICAmaWQpOwotCX0KLX0KLQotLyogbXV0ZSBsaW5lLW91dCBhbmQgaW50ZXJuYWwgc3BlYWtlciBpZiBIUCBpcyBwbHVnZ2VkICovCi1zdGF0aWMgdm9pZCB2aWFfaHBfYmluZF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQkvKiB1c2UgbG9uZyBpbnN0ZWFkIG9mIGludCBiZWxvdyBqdXN0IHRvIGF2b2lkIGFuIGludGVybmFsIGNvbXBpbGVyCi0JICogZXJyb3Igd2l0aCBnY2MgNC4wLngKLQkgKi8KLQl1bnNpZ25lZCBsb25nIGhwX3ByZXNlbnQsIHByZXNlbnQgPSAwOwotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBpOwotCi0JaWYgKCFzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gfHwgIXNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSkKLQkJcmV0dXJuOwotCi0JaHBfcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSk7Ci0KLQlwcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zWzBdKTsKLQotCWlmICghc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSkgewotCQkvKiBNdXRlIExpbmUtT3V0cyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+YXV0b2NmZy5saW5lX291dHM7IGkrKykKLQkJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbygKLQkJCQljb2RlYywgc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zW2ldLAotCQkJCUhEQV9PVVRQVVQsIDAsCi0JCQkJSERBX0FNUF9NVVRFLCBocF9wcmVzZW50ID8gSERBX0FNUF9NVVRFIDogMCk7Ci0JCWlmIChocF9wcmVzZW50KQotCQkJcHJlc2VudCA9IGhwX3ByZXNlbnQ7Ci0JfQotCS8qIFNwZWFrZXJzICovCi0JZm9yIChpID0gMDsgaSA8IHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9vdXRzOyBpKyspCi0JCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbygKLQkJCWNvZGVjLCBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1tpXSwgSERBX09VVFBVVCwgMCwKLQkJCUhEQV9BTVBfTVVURSwgcHJlc2VudCA/IEhEQV9BTVBfTVVURSA6IDApOwotfQotCi0KIC8qIHVuc29saWNpdGVkIGV2ZW50IGZvciBqYWNrIHNlbnNpbmcgKi8KIHN0YXRpYyB2b2lkIHZpYV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkgIHVuc2lnbmVkIGludCByZXMpCkBAIC0xNzYxLDQzICsxNzAyLDEwIEBACiAKIAlyZXMgJj0gflZJQV9KQUNLX0VWRU5UOwogCi0JaWYgKHJlcyA9PSBWSUFfSFBfRVZFTlQpCisJaWYgKHJlcyA9PSBWSUFfSFBfRVZFTlQgfHwgcmVzID09IFZJQV9MSU5FX0VWRU5UKQogCQl2aWFfaHBfYXV0b211dGUoY29kZWMpOwogCWVsc2UgaWYgKHJlcyA9PSBWSUFfR1BJT19FVkVOVCkKIAkJdmlhX2dwaW9fY29udHJvbChjb2RlYyk7Ci0JZWxzZSBpZiAocmVzID09IFZJQV9NT05PX0VWRU5UKQotCQl2aWFfbW9ub19hdXRvbXV0ZShjb2RlYyk7Ci0JZWxzZSBpZiAocmVzID09IFZJQV9TUEVBS0VSX0VWRU5UKQotCQl2aWFfc3BlYWtlcl9hdXRvbXV0ZShjb2RlYyk7Ci0JZWxzZSBpZiAocmVzID09IFZJQV9CSU5EX0hQX0VWRU5UKQotCQl2aWFfaHBfYmluZF9hdXRvbXV0ZShjb2RlYyk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlhX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9pdmVyYnM7IGkrKykKLQkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgc3BlYy0+aW5pdF92ZXJic1tpXSk7Ci0KLQkvKiBMeWRpYSBBZGQgZm9yIEVBUEQgZW5hYmxlICovCi0JaWYgKCFzcGVjLT5kaWdfaW5fbmlkKSB7IC8qIE5vIERpZ2l0YWwgSW4gY29ubmVjdGlvbiAqLwotCQlpZiAoc3BlYy0+ZGlnX2luX3BpbikgewotCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgc3BlYy0+ZGlnX2luX3BpbiwgMCwKLQkJCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKLQkJCQkJICAgIFBJTl9PVVQpOwotCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgc3BlYy0+ZGlnX2luX3BpbiwgMCwKLQkJCQkJICAgIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAweDAyKTsKLQkJfQotCX0gZWxzZSAvKiBlbmFibGUgU1BESUYtaW5wdXQgcGluICovCi0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNwZWMtPmF1dG9jZmcuZGlnX2luX3BpbiwgMCwKLQkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4pOwotCi0JLyogYXNzaWduIHNsYXZlIG91dHMgKi8KLQlpZiAoc3BlYy0+c2xhdmVfZGlnX291dHNbMF0pCi0JCWNvZGVjLT5zbGF2ZV9kaWdfb3V0cyA9IHNwZWMtPnNsYXZlX2RpZ19vdXRzOwotCi0JcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBTTkRfSERBX05FRURTX1JFU1VNRQpAQCAtMTgxOSwxMSArMTcyNywxNSBAQAogCiAvKgogICovCisKK3N0YXRpYyBpbnQgdmlhX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jb2RlY19vcHMgdmlhX3BhdGNoX29wcyA9IHsKIAkuYnVpbGRfY29udHJvbHMgPSB2aWFfYnVpbGRfY29udHJvbHMsCiAJLmJ1aWxkX3BjbXMgPSB2aWFfYnVpbGRfcGNtcywKIAkuaW5pdCA9IHZpYV9pbml0LAogCS5mcmVlID0gdmlhX2ZyZWUsCisJLnVuc29sX2V2ZW50ID0gdmlhX3Vuc29sX2V2ZW50LAogI2lmZGVmIFNORF9IREFfTkVFRFNfUkVTVU1FCiAJLnN1c3BlbmQgPSB2aWFfc3VzcGVuZCwKICNlbmRpZgpAQCAtMTgzMiwyMzcgKzE3NDQsODM1IEBACiAjZW5kaWYKIH07CiAKLS8qIGZpbGwgaW4gdGhlIGRhY19uaWRzIHRhYmxlIGZyb20gdGhlIHBhcnNlZCBwaW4gY29uZmlndXJhdGlvbiAqLwotc3RhdGljIGludCB2dDE3MDhfYXV0b19maWxsX2RhY19uaWRzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKK3N0YXRpYyBib29sIGlzX2VtcHR5X2RhYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IGRhYykKIHsKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgaTsKLQloZGFfbmlkX3QgbmlkOwogCi0Jc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSBjZmctPmxpbmVfb3V0czsKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bXVsdGlvdXQubnVtX2RhY3M7IGkrKykgeworCQlpZiAoc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPT0gZGFjKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoc3BlYy0+aHBfZGFjX25pZCA9PSBkYWMpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KIAotCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gc3BlYy0+cHJpdmF0ZV9kYWNfbmlkczsKK3N0YXRpYyBib29sIF9fcGFyc2Vfb3V0cHV0X3BhdGgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkJaGRhX25pZF90IHRhcmdldF9kYWMsIGludCB3aXRoX2FhX21peCwKKwkJCQlzdHJ1Y3QgbmlkX3BhdGggKnBhdGgsIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgY29ubls4XTsKKwlpbnQgaSwgbnVtczsKIAotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOwotCQlpZiAobmlkKSB7Ci0JCQkvKiBjb25maWcgZGFjIGxpc3QgKi8KLQkJCXN3aXRjaCAoaSkgewotCQkJY2FzZSBBVVRPX1NFUV9GUk9OVDoKLQkJCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldID0gMHgxMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVUT19TRVFfQ0VOTEZFOgotCQkJCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbaV0gPSAweDEyOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVVRPX1NFUV9TVVJST1VORDoKLQkJCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldID0gMHgxMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVUT19TRVFfU0lERToKLQkJCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldID0gMHgxMzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQorCWlmIChuaWQgPT0gc3BlYy0+YWFfbWl4X25pZCkgeworCQlpZiAoIXdpdGhfYWFfbWl4KQorCQkJcmV0dXJuIGZhbHNlOworCQl3aXRoX2FhX21peCA9IDI7IC8qIG1hcmsgYWEtbWl4IGlzIGluY2x1ZGVkICovCiAJfQogCisJbnVtcyA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsIGNvbm4sIEFSUkFZX1NJWkUoY29ubikpOworCWZvciAoaSA9IDA7IGkgPCBudW1zOyBpKyspIHsKKwkJaWYgKGdldF93Y2Fwc190eXBlKGdldF93Y2Fwcyhjb2RlYywgY29ubltpXSkpICE9IEFDX1dJRF9BVURfT1VUKQorCQkJY29udGludWU7CisJCWlmIChjb25uW2ldID09IHRhcmdldF9kYWMgfHwgaXNfZW1wdHlfZGFjKGNvZGVjLCBjb25uW2ldKSkgeworCQkJLyogYWEtbWl4IGlzIHJlcXVlc3RlZCBidXQgbm90IGluY2x1ZGVkPyAqLworCQkJaWYgKCEoc3BlYy0+YWFfbWl4X25pZCAmJiB3aXRoX2FhX21peCA9PSAxKSkKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCWlmIChkZXB0aCA+PSBNQVhfTklEX1BBVEhfREVQVEgpCisJCXJldHVybiBmYWxzZTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB0eXBlOworCQl0eXBlID0gZ2V0X3djYXBzX3R5cGUoZ2V0X3djYXBzKGNvZGVjLCBjb25uW2ldKSk7CisJCWlmICh0eXBlID09IEFDX1dJRF9BVURfT1VUKQorCQkJY29udGludWU7CisJCWlmIChfX3BhcnNlX291dHB1dF9wYXRoKGNvZGVjLCBjb25uW2ldLCB0YXJnZXRfZGFjLAorCQkJCQl3aXRoX2FhX21peCwgcGF0aCwgZGVwdGggKyAxKSkKKwkJCWdvdG8gZm91bmQ7CisJfQorCXJldHVybiBmYWxzZTsKKworIGZvdW5kOgorCXBhdGgtPnBhdGhbcGF0aC0+ZGVwdGhdID0gY29ubltpXTsKKwlwYXRoLT5pZHhbcGF0aC0+ZGVwdGhdID0gaTsKKwlpZiAobnVtcyA+IDEgJiYgZ2V0X3djYXBzX3R5cGUoZ2V0X3djYXBzKGNvZGVjLCBuaWQpKSAhPSBBQ19XSURfQVVEX01JWCkKKwkJcGF0aC0+bXVsdGlbcGF0aC0+ZGVwdGhdID0gMTsKKwlwYXRoLT5kZXB0aCsrOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBwYXJzZV9vdXRwdXRfcGF0aChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCSAgICAgIGhkYV9uaWRfdCB0YXJnZXRfZGFjLCBpbnQgd2l0aF9hYV9taXgsCisJCQkgICAgICBzdHJ1Y3QgbmlkX3BhdGggKnBhdGgpCit7CisJaWYgKF9fcGFyc2Vfb3V0cHV0X3BhdGgoY29kZWMsIG5pZCwgdGFyZ2V0X2RhYywgd2l0aF9hYV9taXgsIHBhdGgsIDEpKSB7CisJCXBhdGgtPnBhdGhbcGF0aC0+ZGVwdGhdID0gbmlkOworCQlwYXRoLT5kZXB0aCsrOworCQlzbmRfcHJpbnRkZCgib3V0cHV0LXBhdGg6IGRlcHRoPSVkLCAlMDJ4LyUwMngvJTAyeC8lMDJ4LyUwMnhcbiIsCisJCQkgICAgcGF0aC0+ZGVwdGgsIHBhdGgtPnBhdGhbMF0sIHBhdGgtPnBhdGhbMV0sCisJCQkgICAgcGF0aC0+cGF0aFsyXSwgcGF0aC0+cGF0aFszXSwgcGF0aC0+cGF0aFs0XSk7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2F1dG9fZmlsbF9kYWNfbmlkcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKKwlpbnQgaSwgZGFjX251bTsKKwloZGFfbmlkX3QgbmlkOworCisJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5wcml2YXRlX2RhY19uaWRzOworCWRhY19udW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7CisJCWhkYV9uaWRfdCBkYWMgPSAwOworCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07CisJCWlmICghbmlkKQorCQkJY29udGludWU7CisJCWlmIChwYXJzZV9vdXRwdXRfcGF0aChjb2RlYywgbmlkLCAwLCAwLCAmc3BlYy0+b3V0X3BhdGhbaV0pKQorCQkJZGFjID0gc3BlYy0+b3V0X3BhdGhbaV0ucGF0aFswXTsKKwkJaWYgKCFpICYmIHBhcnNlX291dHB1dF9wYXRoKGNvZGVjLCBuaWQsIGRhYywgMSwKKwkJCQkJICAgICZzcGVjLT5vdXRfbWl4X3BhdGgpKQorCQkJZGFjID0gc3BlYy0+b3V0X21peF9wYXRoLnBhdGhbMF07CisJCWlmIChkYWMpIHsKKwkJCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbaV0gPSBkYWM7CisJCQlkYWNfbnVtKys7CisJCX0KKwl9CisJaWYgKCFzcGVjLT5vdXRfcGF0aFswXS5kZXB0aCAmJiBzcGVjLT5vdXRfbWl4X3BhdGguZGVwdGgpIHsKKwkJc3BlYy0+b3V0X3BhdGhbMF0gPSBzcGVjLT5vdXRfbWl4X3BhdGg7CisJCXNwZWMtPm91dF9taXhfcGF0aC5kZXB0aCA9IDA7CisJfQorCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gZGFjX251bTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjcmVhdGVfY2hfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqcGZ4LAorCQkJICBpbnQgY2hzLCBib29sIGNoZWNrX2RhYywgc3RydWN0IG5pZF9wYXRoICpwYXRoKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWNoYXIgbmFtZVszMl07CisJaGRhX25pZF90IGRhYywgcGluLCBzZWwsIG5pZDsKKwlpbnQgZXJyOworCisJZGFjID0gY2hlY2tfZGFjID8gcGF0aC0+cGF0aFswXSA6IDA7CisJcGluID0gcGF0aC0+cGF0aFtwYXRoLT5kZXB0aCAtIDFdOworCXNlbCA9IHBhdGgtPmRlcHRoID4gMSA/IHBhdGgtPnBhdGhbMV0gOiAwOworCisJaWYgKGRhYyAmJiBjaGVja19hbXBfY2Fwcyhjb2RlYywgZGFjLCBIREFfT1VUUFVULCBBQ19BTVBDQVBfTlVNX1NURVBTKSkKKwkJbmlkID0gZGFjOworCWVsc2UgaWYgKGNoZWNrX2FtcF9jYXBzKGNvZGVjLCBwaW4sIEhEQV9PVVRQVVQsIEFDX0FNUENBUF9OVU1fU1RFUFMpKQorCQluaWQgPSBwaW47CisJZWxzZSBpZiAoY2hlY2tfYW1wX2NhcHMoY29kZWMsIHNlbCwgSERBX09VVFBVVCwgQUNfQU1QQ0FQX05VTV9TVEVQUykpCisJCW5pZCA9IHNlbDsKKwllbHNlCisJCW5pZCA9IDA7CisJaWYgKG5pZCkgeworCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBwZngpOworCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLCBuYW1lLAorCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIGNocywgMCwgSERBX09VVFBVVCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCXBhdGgtPnZvbF9jdGwgPSBuaWQ7CisJfQorCisJaWYgKGRhYyAmJiBjaGVja19hbXBfY2Fwcyhjb2RlYywgZGFjLCBIREFfT1VUUFVULCBBQ19BTVBDQVBfTVVURSkpCisJCW5pZCA9IGRhYzsKKwllbHNlIGlmIChjaGVja19hbXBfY2Fwcyhjb2RlYywgcGluLCBIREFfT1VUUFVULCBBQ19BTVBDQVBfTVVURSkpCisJCW5pZCA9IHBpbjsKKwllbHNlIGlmIChjaGVja19hbXBfY2Fwcyhjb2RlYywgc2VsLCBIREFfT1VUUFVULCBBQ19BTVBDQVBfTVVURSkpCisJCW5pZCA9IHNlbDsKKwllbHNlCisJCW5pZCA9IDA7CisJaWYgKG5pZCkgeworCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBwZngpOworCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKKwkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCBjaHMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlwYXRoLT5tdXRlX2N0bCA9IG5pZDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1hbmdsZV9zbWFydDUxKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCXN0cnVjdCBhdXRvX3Bpbl9jZmdfaXRlbSAqaW5zID0gY2ZnLT5pbnB1dHM7CisJaW50IGksIGosIG51bXMsIGF0dHI7CisJaW50IHBpbnNbQVVUT19DRkdfTUFYX0lOU107CisKKwlmb3IgKGF0dHIgPSBJTlBVVF9QSU5fQVRUUl9SRUFSOyBhdHRyID49IElOUFVUX1BJTl9BVFRSX05PUk1BTDsgYXR0ci0tKSB7CisJCW51bXMgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1faW5wdXRzOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCBkZWY7CisJCQlpZiAoaW5zW2ldLnR5cGUgPiBBVVRPX1BJTl9MSU5FX0lOKQorCQkJCWNvbnRpbnVlOworCQkJZGVmID0gc25kX2hkYV9jb2RlY19nZXRfcGluY2ZnKGNvZGVjLCBpbnNbaV0ucGluKTsKKwkJCWlmIChzbmRfaGRhX2dldF9pbnB1dF9waW5fYXR0cihkZWYpICE9IGF0dHIpCisJCQkJY29udGludWU7CisJCQlmb3IgKGogPSAwOyBqIDwgbnVtczsgaisrKQorCQkJCWlmIChpbnNbcGluc1tqXV0udHlwZSA8IGluc1tpXS50eXBlKSB7CisJCQkJCW1lbW1vdmUocGlucyArIGogKyAxLCBwaW5zICsgaiwKKwkJCQkJCShudW1zIC0gaikgKiBzaXplb2YoaW50KSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCXBpbnNbal0gPSBpOworCQkJbnVtcysrOworCQl9CisJCWlmIChjZmctPmxpbmVfb3V0cyArIG51bXMgPCAzKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBudW1zOyBpKyspIHsKKwkJCWhkYV9uaWRfdCBwaW4gPSBpbnNbcGluc1tpXV0ucGluOworCQkJc3BlYy0+c21hcnQ1MV9waW5zW3NwZWMtPnNtYXJ0NTFfbnVtcysrXSA9IHBpbjsKKwkJCWNmZy0+bGluZV9vdXRfcGluc1tjZmctPmxpbmVfb3V0cysrXSA9IHBpbjsKKwkJCWlmIChjZmctPmxpbmVfb3V0cyA9PSAzKQorCQkJCWJyZWFrOworCQl9CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfcGF0aF9taXhlcl9jdGxzKHN0cnVjdCBuaWRfcGF0aCAqZHN0LCBzdHJ1Y3QgbmlkX3BhdGggKnNyYykKK3sKKwlkc3QtPnZvbF9jdGwgPSBzcmMtPnZvbF9jdGw7CisJZHN0LT5tdXRlX2N0bCA9IHNyYy0+bXV0ZV9jdGw7Cit9CisKIC8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmcm9tIHRoZSBwYXJzZWQgREFDIHRhYmxlICovCi1zdGF0aWMgaW50IHZ0MTcwOF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsCi0JCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQorc3RhdGljIGludCB2aWFfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0JY2hhciBuYW1lWzMyXTsKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKKwlzdHJ1Y3QgbmlkX3BhdGggKnBhdGg7CiAJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjaG5hbWVbNF0gPSB7CiAJCSJGcm9udCIsICJTdXJyb3VuZCIsICJDL0xGRSIsICJTaWRlIgogCX07Ci0JaGRhX25pZF90IG5pZCwgbmlkX3ZvbCwgbmlkX3ZvbHNbXSA9IHsweDE3LCAweDE5LCAweDFhLCAweDFifTsKLQlpbnQgaSwgZXJyOworCWludCBpLCBpZHgsIGVycjsKKwlpbnQgb2xkX2xpbmVfb3V0czsKIAotCWZvciAoaSA9IDA7IGkgPD0gQVVUT19TRVFfU0lERTsgaSsrKSB7Ci0JCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKKwkvKiBjaGVjayBzbWFydDUxICovCisJb2xkX2xpbmVfb3V0cyA9IGNmZy0+bGluZV9vdXRzOworCWlmIChjZmctPmxpbmVfb3V0cyA9PSAxKQorCQltYW5nbGVfc21hcnQ1MShjb2RlYyk7CiAKLQkJaWYgKCFuaWQpCisJZXJyID0gdmlhX2F1dG9fZmlsbF9kYWNfbmlkcyhjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPCAzKSB7CisJCXNwZWMtPnNtYXJ0NTFfbnVtcyA9IDA7CisJCWNmZy0+bGluZV9vdXRzID0gb2xkX2xpbmVfb3V0czsKKwl9CisJZm9yIChpID0gMDsgaSA8IGNmZy0+bGluZV9vdXRzOyBpKyspIHsKKwkJaGRhX25pZF90IHBpbiwgZGFjOworCQlwaW4gPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07CisJCWRhYyA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldOworCQlpZiAoIXBpbiB8fCAhZGFjKQogCQkJY29udGludWU7Ci0KLQkJbmlkX3ZvbCA9IG5pZF92b2xzW2ldOwotCi0JCWlmIChpID09IEFVVE9fU0VRX0NFTkxGRSkgewotCQkJLyogQ2VudGVyL0xGRSAqLwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKLQkJCQkJIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLAotCQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDEsIDAsCi0JCQkJCQkJICAgIEhEQV9PVVRQVVQpKTsKKwkJcGF0aCA9IHNwZWMtPm91dF9wYXRoICsgaTsKKwkJaWYgKGkgPT0gSERBX0NMRkUpIHsKKwkJCWVyciA9IGNyZWF0ZV9jaF9jdGxzKGNvZGVjLCAiQ2VudGVyIiwgMSwgdHJ1ZSwgcGF0aCk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKLQkJCQkJICAgICAgIkxGRSBQbGF5YmFjayBWb2x1bWUiLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDIsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAotCQkJCQkgICAgICAiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMSwgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCi0JCQkJCSAgICAgICJMRkUgUGxheWJhY2sgU3dpdGNoIiwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAyLCAwLAotCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0gZWxzZSBpZiAoaSA9PSBBVVRPX1NFUV9GUk9OVCkgewotCQkJLyogYWRkIGNvbnRyb2wgdG8gbWl4ZXIgaW5kZXggMCAqLwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKLQkJCQkJICAgICAgIk1hc3RlciBGcm9udCBQbGF5YmFjayBWb2x1bWUiLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDMsIDAsCi0JCQkJCQkJCSAgSERBX0lOUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCi0JCQkJCSAgICAgICJNYXN0ZXIgRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAzLCAwLAotCQkJCQkJCQkgIEhEQV9JTlBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQotCQkJLyogYWRkIGNvbnRyb2wgdG8gUFczICovCi0JCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGNobmFtZVtpXSk7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOworCQkJZXJyID0gY3JlYXRlX2NoX2N0bHMoY29kZWMsICJMRkUiLCAyLCB0cnVlLCBwYXRoKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0gZWxzZSB7Ci0JCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAzLCAwLAotCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBjaG5hbWVbaV0pOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsIG5hbWUsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7CisJCQljb25zdCBjaGFyICpwZnggPSBjaG5hbWVbaV07CisJCQlpZiAoY2ZnLT5saW5lX291dF90eXBlID09IEFVVE9fUElOX1NQRUFLRVJfT1VUICYmCisJCQkgICAgY2ZnLT5saW5lX291dHMgPT0gMSkKKwkJCQlwZnggPSAiU3BlYWtlciI7CisJCQllcnIgPSBjcmVhdGVfY2hfY3Rscyhjb2RlYywgcGZ4LCAzLCB0cnVlLCBwYXRoKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0KKwkJaWYgKHBhdGggIT0gc3BlYy0+b3V0X3BhdGggKyBpKQorCQkJY29weV9wYXRoX21peGVyX2N0bHMoJnNwZWMtPm91dF9wYXRoW2ldLCBwYXRoKTsKKwkJaWYgKHBhdGggPT0gc3BlYy0+b3V0X3BhdGggJiYgc3BlYy0+b3V0X21peF9wYXRoLmRlcHRoKQorCQkJY29weV9wYXRoX21peGVyX2N0bHMoJnNwZWMtPm91dF9taXhfcGF0aCwgcGF0aCk7CiAJfQogCisJaWR4ID0gZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIHNwZWMtPmFhX21peF9uaWQsCisJCQkJICAgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF0pOworCWlmIChpZHggPj0gMCkgeworCQkvKiBhZGQgY29udHJvbCB0byBtaXhlciAqLworCQljb25zdCBjaGFyICpuYW1lOworCQluYW1lID0gc3BlYy0+b3V0X21peF9wYXRoLmRlcHRoID8KKwkJCSJQQ00gTG9vcGJhY2sgUGxheWJhY2sgVm9sdW1lIiA6ICJQQ00gUGxheWJhY2sgVm9sdW1lIjsKKwkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKKwkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKHNwZWMtPmFhX21peF9uaWQsIDMsCisJCQkJCQkJICBpZHgsIEhEQV9JTlBVVCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCW5hbWUgPSBzcGVjLT5vdXRfbWl4X3BhdGguZGVwdGggPworCQkJIlBDTSBMb29wYmFjayBQbGF5YmFjayBTd2l0Y2giIDogIlBDTSBQbGF5YmFjayBTd2l0Y2giOworCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKKwkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKHNwZWMtPmFhX21peF9uaWQsIDMsCisJCQkJCQkJICBpZHgsIEhEQV9JTlBVVCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJY2ZnLT5saW5lX291dHMgPSBvbGRfbGluZV9vdXRzOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNyZWF0ZV9ocF9pbXV4KHN0cnVjdCB2aWFfc3BlYyAqc3BlYykKK3N0YXRpYyBpbnQgdmlhX2F1dG9fY3JlYXRlX2hwX2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW4pCiB7Ci0JaW50IGk7Ci0Jc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzFdOwotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHNbXSA9IHsgIk9GRiIsICJPTiIsIE5VTEx9OwotCi0JLyogZm9yIGhwIG1vZGUgc2VsZWN0ICovCi0JZm9yIChpID0gMDsgdGV4dHNbaV07IGkrKykKLQkJc25kX2hkYV9hZGRfaW11eF9pdGVtKGltdXgsIHRleHRzW2ldLCBpLCBOVUxMKTsKLQotCXNwZWMtPmhwX211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMV07Ci19Ci0KLXN0YXRpYyBpbnQgdnQxNzA4X2F1dG9fY3JlYXRlX2hwX2N0bHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLCBoZGFfbmlkX3QgcGluKQotewotCWludCBlcnI7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IG5pZF9wYXRoICpwYXRoOworCWJvb2wgY2hlY2tfZGFjOworCWludCBpLCBlcnI7CiAKIAlpZiAoIXBpbikKIAkJcmV0dXJuIDA7CiAKLQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSBWVDE3MDhfSFBfTklEOyAvKiBBT1czICovCi0Jc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZV9pbmRleCA9IDE7CisJaWYgKCFwYXJzZV9vdXRwdXRfcGF0aChjb2RlYywgcGluLCAwLCAwLCAmc3BlYy0+aHBfaW5kZXBfcGF0aCkpIHsKKwkJZm9yIChpID0gSERBX1NJREU7IGkgPj0gSERBX0NMRkU7IGktLSkgeworCQkJaWYgKGkgPCBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAmJgorCQkJICAgIHBhcnNlX291dHB1dF9wYXRoKGNvZGVjLCBwaW4sCisJCQkJCSAgICAgIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldLCAwLAorCQkJCQkgICAgICAmc3BlYy0+aHBfaW5kZXBfcGF0aCkpIHsKKwkJCQlzcGVjLT5ocF9pbmRlcF9zaGFyZWQgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChzcGVjLT5ocF9pbmRlcF9wYXRoLmRlcHRoKSB7CisJCXNwZWMtPmhwX2RhY19uaWQgPSBzcGVjLT5ocF9pbmRlcF9wYXRoLnBhdGhbMF07CisJCWlmICghc3BlYy0+aHBfaW5kZXBfc2hhcmVkKQorCQkJc3BlYy0+aHBfcGF0aCA9IHNwZWMtPmhwX2luZGVwX3BhdGg7CisJfQorCS8qIG9wdGlvbmFsbHkgY2hlY2sgZnJvbnQtcGF0aCB3L28gQUEtbWl4ICovCisJaWYgKCFzcGVjLT5ocF9wYXRoLmRlcHRoKQorCQlwYXJzZV9vdXRwdXRfcGF0aChjb2RlYywgcGluLAorCQkJCSAgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbSERBX0ZST05UXSwgMCwKKwkJCQkgICZzcGVjLT5ocF9wYXRoKTsKIAotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkgICAgICAiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKHBpbiwgMywgMCwgSERBX09VVFBVVCkpOworCWlmICghcGFyc2Vfb3V0cHV0X3BhdGgoY29kZWMsIHBpbiwgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbSERBX0ZST05UXSwKKwkJCSAgICAgICAxLCAmc3BlYy0+aHBfbWl4X3BhdGgpICYmICFzcGVjLT5ocF9wYXRoLmRlcHRoKQorCQlyZXR1cm4gMDsKKworCWlmIChzcGVjLT5ocF9wYXRoLmRlcHRoKSB7CisJCXBhdGggPSAmc3BlYy0+aHBfcGF0aDsKKwkJY2hlY2tfZGFjID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlwYXRoID0gJnNwZWMtPmhwX21peF9wYXRoOworCQljaGVja19kYWMgPSBmYWxzZTsKKwl9CisJZXJyID0gY3JlYXRlX2NoX2N0bHMoY29kZWMsICJIZWFkcGhvbmUiLCAzLCBjaGVja19kYWMsIHBhdGgpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAotCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLAotCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwlpZiAoY2hlY2tfZGFjKQorCQljb3B5X3BhdGhfbWl4ZXJfY3Rscygmc3BlYy0+aHBfbWl4X3BhdGgsIHBhdGgpOworCWVsc2UKKwkJY29weV9wYXRoX21peGVyX2N0bHMoJnNwZWMtPmhwX3BhdGgsIHBhdGgpOworCWlmIChzcGVjLT5ocF9pbmRlcF9wYXRoLmRlcHRoKQorCQljb3B5X3BhdGhfbWl4ZXJfY3Rscygmc3BlYy0+aHBfaW5kZXBfcGF0aCwgcGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2F1dG9fY3JlYXRlX3NwZWFrZXJfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgbmlkX3BhdGggKnBhdGg7CisJYm9vbCBjaGVja19kYWM7CisJaGRhX25pZF90IHBpbiwgZGFjOworCWludCBlcnI7CisKKwlwaW4gPSBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXTsKKwlpZiAoIXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9vdXRzIHx8ICFwaW4pCisJCXJldHVybiAwOworCisJaWYgKHBhcnNlX291dHB1dF9wYXRoKGNvZGVjLCBwaW4sIDAsIDAsICZzcGVjLT5zcGVha2VyX3BhdGgpKQorCQlkYWMgPSBzcGVjLT5zcGVha2VyX3BhdGgucGF0aFswXTsKKwlpZiAoIWRhYykKKwkJcGFyc2Vfb3V0cHV0X3BhdGgoY29kZWMsIHBpbiwKKwkJCQkgIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW0hEQV9GUk9OVF0sIDAsCisJCQkJICAmc3BlYy0+c3BlYWtlcl9wYXRoKTsKKwlpZiAoIXBhcnNlX291dHB1dF9wYXRoKGNvZGVjLCBwaW4sIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW0hEQV9GUk9OVF0sCisJCQkgICAgICAgMSwgJnNwZWMtPnNwZWFrZXJfbWl4X3BhdGgpICYmICFkYWMpCisJCXJldHVybiAwOworCisJLyogbm8gQUEtcGF0aCBmb3IgZnJvbnQ/ICovCisJaWYgKCFzcGVjLT5vdXRfbWl4X3BhdGguZGVwdGggJiYgc3BlYy0+c3BlYWtlcl9taXhfcGF0aC5kZXB0aCkKKwkJZGFjID0gMDsKKworCXNwZWMtPnNwZWFrZXJfZGFjX25pZCA9IGRhYzsKKwlzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdID0gZGFjOworCWlmIChkYWMpIHsKKwkJcGF0aCA9ICZzcGVjLT5zcGVha2VyX3BhdGg7CisJCWNoZWNrX2RhYyA9IHRydWU7CisJfSBlbHNlIHsKKwkJcGF0aCA9ICZzcGVjLT5zcGVha2VyX21peF9wYXRoOworCQljaGVja19kYWMgPSBmYWxzZTsKKwl9CisJZXJyID0gY3JlYXRlX2NoX2N0bHMoY29kZWMsICJTcGVha2VyIiwgMywgY2hlY2tfZGFjLCBwYXRoKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoY2hlY2tfZGFjKQorCQljb3B5X3BhdGhfbWl4ZXJfY3Rscygmc3BlYy0+c3BlYWtlcl9taXhfcGF0aCwgcGF0aCk7CisJZWxzZQorCQljb3B5X3BhdGhfbWl4ZXJfY3Rscygmc3BlYy0+c3BlYWtlcl9wYXRoLCBwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSB2aWFfYWFtaXhfY3RsX2luZm8JdmlhX3Bpbl9wb3dlcl9jdGxfaW5mbworCitzdGF0aWMgaW50IHZpYV9hYW1peF9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc3BlYy0+YWFtaXhfbW9kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2FhbWl4X3BhdGhzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgZG9fbWl4LAorCQkJICAgICAgIHN0cnVjdCBuaWRfcGF0aCAqbm9taXgsIHN0cnVjdCBuaWRfcGF0aCAqbWl4KQoreworCWlmIChkb19taXgpIHsKKwkJYWN0aXZhdGVfb3V0cHV0X3BhdGgoY29kZWMsIG5vbWl4LCBmYWxzZSwgZmFsc2UpOworCQlhY3RpdmF0ZV9vdXRwdXRfcGF0aChjb2RlYywgbWl4LCB0cnVlLCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJYWN0aXZhdGVfb3V0cHV0X3BhdGgoY29kZWMsIG1peCwgZmFsc2UsIGZhbHNlKTsKKwkJYWN0aXZhdGVfb3V0cHV0X3BhdGgoY29kZWMsIG5vbWl4LCB0cnVlLCBmYWxzZSk7CisJfQorfQorCitzdGF0aWMgaW50IHZpYV9hYW1peF9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1bnNpZ25lZCBpbnQgdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKworCWlmICh2YWwgPT0gc3BlYy0+YWFtaXhfbW9kZSkKKwkJcmV0dXJuIDA7CisJc3BlYy0+YWFtaXhfbW9kZSA9IHZhbDsKKwkvKiB1cGRhdGUgZnJvbnQgcGF0aCAqLworCXVwZGF0ZV9hYW1peF9wYXRocyhjb2RlYywgdmFsLCAmc3BlYy0+b3V0X3BhdGhbMF0sICZzcGVjLT5vdXRfbWl4X3BhdGgpOworCS8qIHVwZGF0ZSBIUCBwYXRoICovCisJaWYgKCFzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlKSB7CisJCXVwZGF0ZV9hYW1peF9wYXRocyhjb2RlYywgdmFsLCAmc3BlYy0+aHBfcGF0aCwKKwkJCQkgICAmc3BlYy0+aHBfbWl4X3BhdGgpOworCX0KKwkvKiB1cGRhdGUgc3BlYWtlciBwYXRoICovCisJdXBkYXRlX2FhbWl4X3BhdGhzKGNvZGVjLCB2YWwsICZzcGVjLT5zcGVha2VyX3BhdGgsCisJCQkgICAmc3BlYy0+c3BlYWtlcl9taXhfcGF0aCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2aWFfYWFtaXhfY3RsX2VudW0gPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiTG9vcGJhY2sgTWl4aW5nIiwKKwkuaW5mbyA9IHZpYV9hYW1peF9jdGxfaW5mbywKKwkuZ2V0ID0gdmlhX2FhbWl4X2N0bF9nZXQsCisJLnB1dCA9IHZpYV9hYW1peF9jdGxfcHV0LAorfTsKKworc3RhdGljIGludCB2aWFfYXV0b19jcmVhdGVfbG9vcGJhY2tfc3dpdGNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJaWYgKCFzcGVjLT5hYV9taXhfbmlkIHx8ICFzcGVjLT5vdXRfbWl4X3BhdGguZGVwdGgpCisJCXJldHVybiAwOyAvKiBubyBsb29wYmFjayBzd2l0Y2hpbmcgYXZhaWxhYmxlICovCisJaWYgKCF2aWFfY2xvbmVfY29udHJvbChzcGVjLCAmdmlhX2FhbWl4X2N0bF9lbnVtKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKKy8qIGxvb2sgZm9yIEFEQ3MgKi8KK3N0YXRpYyBpbnQgdmlhX2ZpbGxfYWRjcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgbmlkID0gY29kZWMtPnN0YXJ0X25pZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX25vZGVzOyBpKyssIG5pZCsrKSB7CisJCXVuc2lnbmVkIGludCB3Y2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgbmlkKTsKKwkJaWYgKGdldF93Y2Fwc190eXBlKHdjYXBzKSAhPSBBQ19XSURfQVVEX0lOKQorCQkJY29udGludWU7CisJCWlmICh3Y2FwcyAmIEFDX1dDQVBfRElHSVRBTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoISh3Y2FwcyAmIEFDX1dDQVBfQ09OTl9MSVNUKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3BlYy0+bnVtX2FkY19uaWRzID49IEFSUkFZX1NJWkUoc3BlYy0+YWRjX25pZHMpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXNwZWMtPmFkY19uaWRzW3NwZWMtPm51bV9hZGNfbmlkcysrXSA9IG5pZDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGlucHV0LXNyYyBjb250cm9sICovCitzdGF0aWMgaW50IHZpYV9tdXhfZW51bV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IHNwZWMtPm51bV9pbnB1dHM7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gc3BlYy0+bnVtX2lucHV0cykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHNwZWMtPm51bV9pbnB1dHMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCSAgICAgICBzcGVjLT5pbnB1dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0ubGFiZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpYV9tdXhfZW51bV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IGlkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNwZWMtPmN1cl9tdXhbaWR4XTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFfbXV4X2VudW1fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVuc2lnbmVkIGludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwloZGFfbmlkX3QgbXV4OworCWludCBjdXI7CisKKwljdXIgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWlmIChjdXIgPCAwIHx8IGN1ciA+PSBzcGVjLT5udW1faW5wdXRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3BlYy0+Y3VyX211eFtpZHhdID09IGN1cikKKwkJcmV0dXJuIDA7CisJc3BlYy0+Y3VyX211eFtpZHhdID0gY3VyOworCWlmIChzcGVjLT5keW5fYWRjX3N3aXRjaCkgeworCQlpbnQgYWRjX2lkeCA9IHNwZWMtPmlucHV0c1tjdXJdLmFkY19pZHg7CisJCW11eCA9IHNwZWMtPm11eF9uaWRzW2FkY19pZHhdOworCQl2aWFfZHluX2FkY19wY21fcmVzZXR1cChjb2RlYywgY3VyKTsKKwl9IGVsc2UgeworCQltdXggPSBzcGVjLT5tdXhfbmlkc1tpZHhdOworCQlpZiAoc25kX0JVR19PTighbXV4KSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtdXgpIHsKKwkJLyogc3dpdGNoIHRvIEQwIGJlb2ZyZSBjaGFuZ2UgaW5kZXggKi8KKwkJaWYgKHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbXV4LCAwLAorCQkJICAgICAgIEFDX1ZFUkJfR0VUX1BPV0VSX1NUQVRFLCAweDAwKSAhPSBBQ19QV1JTVF9EMCkKKwkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG11eCwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfUE9XRVJfU1RBVEUsIEFDX1BXUlNUX0QwKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbXV4LCAwLAorCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKKwkJCQkgICAgc3BlYy0+aW5wdXRzW2N1cl0ubXV4X2lkeCk7CisJfQorCisJLyogdXBkYXRlIGphY2sgcG93ZXIgc3RhdGUgKi8KKwlzZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZShjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2aWFfaW5wdXRfc3JjX2N0bCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkvKiBUaGUgbXVsdGlwbGUgIkNhcHR1cmUgU291cmNlIiBjb250cm9scyBjb25mdXNlIGFsc2FtaXhlcgorCSAqIFNvIGNhbGwgc29tZXdoYXQgZGlmZmVyZW50Li4KKwkgKi8KKwkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKKwkuaW5mbyA9IHZpYV9tdXhfZW51bV9pbmZvLAorCS5nZXQgPSB2aWFfbXV4X2VudW1fZ2V0LAorCS5wdXQgPSB2aWFfbXV4X2VudW1fcHV0LAorfTsKKworc3RhdGljIGludCBjcmVhdGVfaW5wdXRfc3JjX2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa25ldzsKKworCWlmIChzcGVjLT5udW1faW5wdXRzIDw9IDEgfHwgIWNvdW50KQorCQlyZXR1cm4gMDsgLyogbm8gbmVlZCBmb3Igc2luZ2xlIHNyYyAqLworCisJa25ldyA9IHZpYV9jbG9uZV9jb250cm9sKHNwZWMsICZ2aWFfaW5wdXRfc3JjX2N0bCk7CisJaWYgKCFrbmV3KQorCQlyZXR1cm4gLUVOT01FTTsKKwlrbmV3LT5jb3VudCA9IGNvdW50OworCXJldHVybiAwOworfQorCisvKiBhZGQgdGhlIHBvd2Vyc2F2ZSBsb29wYmFjay1saXN0IGVudHJ5ICovCitzdGF0aWMgdm9pZCBhZGRfbG9vcGJhY2tfbGlzdChzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBtaXgsIGludCBpZHgpCit7CisJc3RydWN0IGhkYV9hbXBfbGlzdCAqbGlzdDsKKworCWlmIChzcGVjLT5udW1fbG9vcGJhY2tzID49IEFSUkFZX1NJWkUoc3BlYy0+bG9vcGJhY2tfbGlzdCkgLSAxKQorCQlyZXR1cm47CisJbGlzdCA9IHNwZWMtPmxvb3BiYWNrX2xpc3QgKyBzcGVjLT5udW1fbG9vcGJhY2tzOworCWxpc3QtPm5pZCA9IG1peDsKKwlsaXN0LT5kaXIgPSBIREFfSU5QVVQ7CisJbGlzdC0+aWR4ID0gaWR4OworCXNwZWMtPm51bV9sb29wYmFja3MrKzsKKwlzcGVjLT5sb29wYmFjay5hbXBsaXN0ID0gc3BlYy0+bG9vcGJhY2tfbGlzdDsKK30KKworc3RhdGljIGJvb2wgaXNfcmVhY2hhYmxlX25pZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHNyYywKKwkJCSAgICAgaGRhX25pZF90IGRzdCkKK3sKKwlyZXR1cm4gc25kX2hkYV9nZXRfY29ubl9pbmRleChjb2RlYywgc3JjLCBkc3QsIDEpID49IDA7Cit9CisKKy8qIGFkZCB0aGUgaW5wdXQtcm91dGUgdG8gdGhlIGdpdmVuIHBpbiAqLworc3RhdGljIGJvb2wgYWRkX2lucHV0X3JvdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgcGluKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBjLCBpZHg7CisKKwlzcGVjLT5pbnB1dHNbc3BlYy0+bnVtX2lucHV0c10uYWRjX2lkeCA9IC0xOworCXNwZWMtPmlucHV0c1tzcGVjLT5udW1faW5wdXRzXS5waW4gPSBwaW47CisJZm9yIChjID0gMDsgYyA8IHNwZWMtPm51bV9hZGNfbmlkczsgYysrKSB7CisJCWlmIChzcGVjLT5tdXhfbmlkc1tjXSkgeworCQkJaWR4ID0gZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIHNwZWMtPm11eF9uaWRzW2NdLAorCQkJCQkJICAgcGluKTsKKwkJCWlmIChpZHggPCAwKQorCQkJCWNvbnRpbnVlOworCQkJc3BlYy0+aW5wdXRzW3NwZWMtPm51bV9pbnB1dHNdLm11eF9pZHggPSBpZHg7CisJCX0gZWxzZSB7CisJCQlpZiAoIWlzX3JlYWNoYWJsZV9uaWQoY29kZWMsIHNwZWMtPmFkY19uaWRzW2NdLCBwaW4pKQorCQkJCWNvbnRpbnVlOworCQl9CisJCXNwZWMtPmlucHV0c1tzcGVjLT5udW1faW5wdXRzXS5hZGNfaWR4ID0gYzsKKwkJLyogQ2FuIHByaW1hcnkgQURDIHNhdGlzZnkgYWxsIGlucHV0cz8gKi8KKwkJaWYgKCFzcGVjLT5keW5fYWRjX3N3aXRjaCAmJgorCQkgICAgc3BlYy0+bnVtX2lucHV0cyA+IDAgJiYgc3BlYy0+aW5wdXRzWzBdLmFkY19pZHggIT0gYykgeworCQkJc25kX3ByaW50ZChLRVJOX0lORk8KKwkJCQkgICAidmlhOiBkeW5hbWljIEFEQyBzd2l0Y2hpbmcgZW5hYmxlZFxuIik7CisJCQlzcGVjLT5keW5fYWRjX3N3aXRjaCA9IDE7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBnZXRfbXV4X25pZHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOworCisvKiBwYXJzZSBpbnB1dC1yb3V0ZXM7IGZpbGwgQURDcywgTVVYcyBhbmQgaW5wdXQtc3JjIGVudHJpZXMgKi8KK3N0YXRpYyBpbnQgcGFyc2VfYW5hbG9nX2lucHV0cyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKKwlpbnQgaSwgZXJyOworCisJZXJyID0gdmlhX2ZpbGxfYWRjcyhjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gZ2V0X211eF9uaWRzKGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWNyZWF0ZV9ocF9pbXV4KHNwZWMpOworCS8qIGZpbGwgYWxsIGlucHV0LXJvdXRlcyAqLworCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgeworCQlpZiAoYWRkX2lucHV0X3JvdXRlKGNvZGVjLCBjZmctPmlucHV0c1tpXS5waW4pKQorCQkJc3BlYy0+aW5wdXRzW3NwZWMtPm51bV9pbnB1dHMrK10ubGFiZWwgPQorCQkJCWhkYV9nZXRfYXV0b2NmZ19pbnB1dF9sYWJlbChjb2RlYywgY2ZnLCBpKTsKKwl9CisKKwkvKiBjaGVjayBmb3IgaW50ZXJuYWwgbG9vcGJhY2sgcmVjb3JkaW5nICovCisJaWYgKHNwZWMtPmFhX21peF9uaWQgJiYKKwkgICAgYWRkX2lucHV0X3JvdXRlKGNvZGVjLCBzcGVjLT5hYV9taXhfbmlkKSkKKwkJc3BlYy0+aW5wdXRzW3NwZWMtPm51bV9pbnB1dHMrK10ubGFiZWwgPSAiU3RlcmVvIE1peGVyIjsKIAogCXJldHVybiAwOwogfQogCi0vKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLwotc3RhdGljIGludCB2dF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZywKLQkJCQkJICAgIGhkYV9uaWRfdCBjYXBfbmlkLAotCQkJCQkgICAgY29uc3QgaGRhX25pZF90IHBpbl9pZHhzW10sCi0JCQkJCSAgICBpbnQgbnVtX2lkeHMpCisvKiBjcmVhdGUgYW5hbG9nLWxvb3BiYWNrIHZvbHVtZS9zd2l0Y2ggY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgY3JlYXRlX2xvb3BiYWNrX2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOwotCWludCBpLCBlcnIsIGlkeCwgdHlwZSwgdHlwZV9pZHggPSAwOworCWNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCWNvbnN0IGNoYXIgKnByZXZfbGFiZWwgPSBOVUxMOworCWludCB0eXBlX2lkeCA9IDA7CisJaW50IGksIGosIGVyciwgaWR4OwogCi0JLyogZm9yIGludGVybmFsIGxvb3BiYWNrIHJlY29yZGluZyBzZWxlY3QgKi8KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9pZHhzOyBpZHgrKykgewotCQlpZiAocGluX2lkeHNbaWR4XSA9PSAweGZmKSB7Ci0JCQlzbmRfaGRhX2FkZF9pbXV4X2l0ZW0oaW11eCwgIlN0ZXJlbyBNaXhlciIsIGlkeCwgTlVMTCk7Ci0JCQlicmVhazsKLQkJfQotCX0KKwlpZiAoIXNwZWMtPmFhX21peF9uaWQpCisJCXJldHVybiAwOwogCiAJZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX2lucHV0czsgaSsrKSB7Ci0JCWNvbnN0IGNoYXIgKmxhYmVsOwotCQl0eXBlID0gY2ZnLT5pbnB1dHNbaV0udHlwZTsKLQkJZm9yIChpZHggPSAwOyBpZHggPCBudW1faWR4czsgaWR4KyspCi0JCQlpZiAocGluX2lkeHNbaWR4XSA9PSBjZmctPmlucHV0c1tpXS5waW4pCi0JCQkJYnJlYWs7Ci0JCWlmIChpZHggPj0gbnVtX2lkeHMpCi0JCQljb250aW51ZTsKLQkJaWYgKGkgPiAwICYmIHR5cGUgPT0gY2ZnLT5pbnB1dHNbaSAtIDFdLnR5cGUpCisJCWhkYV9uaWRfdCBwaW4gPSBjZmctPmlucHV0c1tpXS5waW47CisJCWNvbnN0IGNoYXIgKmxhYmVsID0gaGRhX2dldF9hdXRvY2ZnX2lucHV0X2xhYmVsKGNvZGVjLCBjZmcsIGkpOworCisJCWlmIChwcmV2X2xhYmVsICYmICFzdHJjbXAobGFiZWwsIHByZXZfbGFiZWwpKQogCQkJdHlwZV9pZHgrKzsKIAkJZWxzZQogCQkJdHlwZV9pZHggPSAwOwotCQlsYWJlbCA9IGhkYV9nZXRfYXV0b2NmZ19pbnB1dF9sYWJlbChjb2RlYywgY2ZnLCBpKTsKLQkJaWYgKHNwZWMtPmNvZGVjX3R5cGUgPT0gVlQxNzA4UyB8fAotCQkgICAgc3BlYy0+Y29kZWNfdHlwZSA9PSBWVDE3MDIgfHwKLQkJICAgIHNwZWMtPmNvZGVjX3R5cGUgPT0gVlQxNzE2UykKKwkJcHJldl9sYWJlbCA9IGxhYmVsOworCQlpZHggPSBnZXRfY29ubmVjdGlvbl9pbmRleChjb2RlYywgc3BlYy0+YWFfbWl4X25pZCwgcGluKTsKKwkJaWYgKGlkeCA+PSAwKSB7CiAJCQllcnIgPSB2aWFfbmV3X2FuYWxvZ19pbnB1dChzcGVjLCBsYWJlbCwgdHlwZV9pZHgsCi0JCQkJCQkgICBpZHgrMSwgY2FwX25pZCk7Ci0JCWVsc2UKLQkJCWVyciA9IHZpYV9uZXdfYW5hbG9nX2lucHV0KHNwZWMsIGxhYmVsLCB0eXBlX2lkeCwKLQkJCQkJCSAgIGlkeCwgY2FwX25pZCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJc25kX2hkYV9hZGRfaW11eF9pdGVtKGltdXgsIGxhYmVsLCBpZHgsIE5VTEwpOworCQkJCQkJICAgaWR4LCBzcGVjLT5hYV9taXhfbmlkKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlhZGRfbG9vcGJhY2tfbGlzdChzcGVjLCBzcGVjLT5hYV9taXhfbmlkLCBpZHgpOworCQl9CisKKwkJLyogcmVtZW1iZXIgdGhlIGxhYmVsIGZvciBzbWFydDUxIGNvbnRyb2wgKi8KKwkJZm9yIChqID0gMDsgaiA8IHNwZWMtPnNtYXJ0NTFfbnVtczsgaisrKSB7CisJCQlpZiAoc3BlYy0+c21hcnQ1MV9waW5zW2pdID09IHBpbikgeworCQkJCXNwZWMtPnNtYXJ0NTFfaWR4c1tqXSA9IGlkeDsKKwkJCQlzcGVjLT5zbWFydDUxX2xhYmVsc1tqXSA9IGxhYmVsOworCQkJCWJyZWFrOworCQkJfQorCQl9CiAJfQogCXJldHVybiAwOwogfQogCi0vKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLwotc3RhdGljIGludCB2dDE3MDhfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCQljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCisvKiBjcmVhdGUgbWljLWJvb3N0IGNvbnRyb2xzIChpZiBwcmVzZW50KSAqLworc3RhdGljIGludCBjcmVhdGVfbWljX2Jvb3N0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0Jc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBwaW5faWR4c1tdID0geyAweGZmLCAweDI0LCAweDFkLCAweDFlLCAweDIxIH07Ci0JcmV0dXJuIHZ0X2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKGNvZGVjLCBjZmcsIDB4MTcsIHBpbl9pZHhzLAotCQkJCQkJQVJSQVlfU0laRShwaW5faWR4cykpOworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1faW5wdXRzOyBpKyspIHsKKwkJaGRhX25pZF90IHBpbiA9IGNmZy0+aW5wdXRzW2ldLnBpbjsKKwkJdW5zaWduZWQgaW50IGNhcHM7CisJCWNvbnN0IGNoYXIgKmxhYmVsOworCQljaGFyIG5hbWVbMzJdOworCisJCWlmIChjZmctPmlucHV0c1tpXS50eXBlICE9IEFVVE9fUElOX01JQykKKwkJCWNvbnRpbnVlOworCQljYXBzID0gcXVlcnlfYW1wX2NhcHMoY29kZWMsIHBpbiwgSERBX0lOUFVUKTsKKwkJaWYgKGNhcHMgPT0gLTEgfHwgIShjYXBzICYgQUNfQU1QQ0FQX05VTV9TVEVQUykpCisJCQljb250aW51ZTsKKwkJbGFiZWwgPSBoZGFfZ2V0X2F1dG9jZmdfaW5wdXRfbGFiZWwoY29kZWMsIGNmZywgaSk7CisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzIEJvb3N0IFZvbHVtZSIsIGxhYmVsKTsKKwkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKKwkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfSU5QVVQpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2FtcF9saXN0IHZ0MTcwOF9sb29wYmFja3NbXSA9IHsKLQl7IDB4MTcsIEhEQV9JTlBVVCwgMSB9LAotCXsgMHgxNywgSERBX0lOUFVULCAyIH0sCi0JeyAweDE3LCBIREFfSU5QVVQsIDMgfSwKLQl7IDB4MTcsIEhEQV9JTlBVVCwgNCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0jZW5kaWYKKy8qIGNyZWF0ZSBjYXB0dXJlIGFuZCBpbnB1dC1zcmMgY29udHJvbHMgZm9yIG11bHRpcGxlIHN0cmVhbXMgKi8KK3N0YXRpYyBpbnQgY3JlYXRlX211bHRpX2FkY19jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBpLCBlcnI7CisKKwkvKiBjcmVhdGUgY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fYWRjX25pZHM7IGkrKykgeworCQloZGFfbmlkX3QgYWRjID0gc3BlYy0+YWRjX25pZHNbaV07CisJCWVyciA9IF9fdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKKwkJCQkJIkNhcHR1cmUgVm9sdW1lIiwgaSwKKwkJCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChhZGMsIDMsIDAsCisJCQkJCQkJICAgIEhEQV9JTlBVVCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWVyciA9IF9fdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCisJCQkJCSJDYXB0dXJlIFN3aXRjaCIsIGksCisJCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwoYWRjLCAzLCAwLAorCQkJCQkJCSAgICBIREFfSU5QVVQpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGlucHV0LXNvdXJjZSBjb250cm9sICovCisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9hZGNfbmlkczsgaSsrKQorCQlpZiAoIXNwZWMtPm11eF9uaWRzW2ldKQorCQkJYnJlYWs7CisJZXJyID0gY3JlYXRlX2lucHV0X3NyY19jdGxzKGNvZGVjLCBpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworLyogYmluZCBjYXB0dXJlIHZvbHVtZS9zd2l0Y2ggKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2aWFfYmluZF9jYXBfdm9sX2N0bCA9CisJSERBX0JJTkRfVk9MKCJDYXB0dXJlIFZvbHVtZSIsIDApOworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZpYV9iaW5kX2NhcF9zd19jdGwgPQorCUhEQV9CSU5EX1NXKCJDYXB0dXJlIFN3aXRjaCIsIDApOworCitzdGF0aWMgaW50IGluaXRfYmluZF9jdGwoc3RydWN0IHZpYV9zcGVjICpzcGVjLCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyAqKmN0bF9yZXQsCisJCQkgc3RydWN0IGhkYV9jdGxfb3BzICpvcHMpCit7CisJc3RydWN0IGhkYV9iaW5kX2N0bHMgKmN0bDsKKwlpbnQgaTsKKworCWN0bCA9IGt6YWxsb2Moc2l6ZW9mKCpjdGwpICsgc2l6ZW9mKGxvbmcpICogNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdGwpCisJCXJldHVybiAtRU5PTUVNOworCWN0bC0+b3BzID0gb3BzOworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fYWRjX25pZHM7IGkrKykKKwkJY3RsLT52YWx1ZXNbaV0gPQorCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChzcGVjLT5hZGNfbmlkc1tpXSwgMywgMCwgSERBX0lOUFVUKTsKKwkqY3RsX3JldCA9IGN0bDsKKwlyZXR1cm4gMDsKK30KKworLyogY3JlYXRlIGNhcHR1cmUgYW5kIGlucHV0LXNyYyBjb250cm9scyBmb3IgZHluYW1pYyBBREMtc3dpdGNoIGNhc2UgKi8KK3N0YXRpYyBpbnQgY3JlYXRlX2R5bl9hZGNfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa25ldzsKKwlpbnQgZXJyOworCisJLyogc2V0IHVwIHRoZSBiaW5kIGNhcHR1cmUgY3RscyAqLworCWVyciA9IGluaXRfYmluZF9jdGwoc3BlYywgJnNwZWMtPmJpbmRfY2FwX3ZvbCwgJnNuZF9oZGFfYmluZF92b2wpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGluaXRfYmluZF9jdGwoc3BlYywgJnNwZWMtPmJpbmRfY2FwX3N3LCAmc25kX2hkYV9iaW5kX3N3KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIGNyZWF0ZSBjYXB0dXJlIG1peGVyIGVsZW1lbnRzICovCisJa25ldyA9IHZpYV9jbG9uZV9jb250cm9sKHNwZWMsICZ2aWFfYmluZF9jYXBfdm9sX2N0bCk7CisJaWYgKCFrbmV3KQorCQlyZXR1cm4gLUVOT01FTTsKKwlrbmV3LT5wcml2YXRlX3ZhbHVlID0gKGxvbmcpc3BlYy0+YmluZF9jYXBfdm9sOworCisJa25ldyA9IHZpYV9jbG9uZV9jb250cm9sKHNwZWMsICZ2aWFfYmluZF9jYXBfc3dfY3RsKTsKKwlpZiAoIWtuZXcpCisJCXJldHVybiAtRU5PTUVNOworCWtuZXctPnByaXZhdGVfdmFsdWUgPSAobG9uZylzcGVjLT5iaW5kX2NhcF9zdzsKKworCS8qIGlucHV0LXNvdXJjZSBjb250cm9sICovCisJZXJyID0gY3JlYXRlX2lucHV0X3NyY19jdGxzKGNvZGVjLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworLyogcGFyc2UgYW5kIGNyZWF0ZSBjYXB0dXJlLXJlbGF0ZWQgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgdmlhX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBlcnI7CisKKwllcnIgPSBwYXJzZV9hbmFsb2dfaW5wdXRzKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoc3BlYy0+ZHluX2FkY19zd2l0Y2gpCisJCWVyciA9IGNyZWF0ZV9keW5fYWRjX2N0bHMoY29kZWMpOworCWVsc2UKKwkJZXJyID0gY3JlYXRlX211bHRpX2FkY19jdGxzKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBjcmVhdGVfbG9vcGJhY2tfY3Rscyhjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gY3JlYXRlX21pY19ib29zdF9jdGxzKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIHZvaWQgdnQxNzA4X3NldF9waW5jb25maWdfY29ubmVjdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKIHsKQEAgLTIwODEsNyArMjU5MSw3IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgaW50IHZ0MTcwOF9qYWNrX2RldGVjdGVjdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCitzdGF0aWMgaW50IHZ0MTcwOF9qYWNrX2RldGVjdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKQEAgLTIwODksMTMgKzI1OTksMTMgQEAKIAogCWlmIChzcGVjLT5jb2RlY190eXBlICE9IFZUMTcwOCkKIAkJcmV0dXJuIDA7Ci0Jc3BlYy0+dnQxNzA4X2phY2tfZGV0ZWN0ZWN0ID0KKwlzcGVjLT52dDE3MDhfamFja19kZXRlY3QgPQogCQkhKChzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MSwgMCwgMHhmODQsIDApID4+IDgpICYgMHgxKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNwZWMtPnZ0MTcwOF9qYWNrX2RldGVjdGVjdDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNwZWMtPnZ0MTcwOF9qYWNrX2RldGVjdDsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2dDE3MDhfamFja19kZXRlY3RlY3RfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorc3RhdGljIGludCB2dDE3MDhfamFja19kZXRlY3RfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CkBAIC0yMTA0LDk4ICsyNjE0LDE1MCBAQAogCiAJaWYgKHNwZWMtPmNvZGVjX3R5cGUgIT0gVlQxNzA4KQogCQlyZXR1cm4gMDsKLQlzcGVjLT52dDE3MDhfamFja19kZXRlY3RlY3QgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlzcGVjLT52dDE3MDhfamFja19kZXRlY3QgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAljaGFuZ2UgPSAoMHgxICYgKHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxLCAwLCAweGY4NCwgMCkgPj4gOCkpCi0JCT09ICFzcGVjLT52dDE3MDhfamFja19kZXRlY3RlY3Q7Ci0JaWYgKHNwZWMtPnZ0MTcwOF9qYWNrX2RldGVjdGVjdCkgeworCQk9PSAhc3BlYy0+dnQxNzA4X2phY2tfZGV0ZWN0OworCWlmIChzcGVjLT52dDE3MDhfamFja19kZXRlY3QpIHsKIAkJbXV0ZV9hYV9wYXRoKGNvZGVjLCAxKTsKIAkJbm90aWZ5X2FhX3BhdGhfY3Rscyhjb2RlYyk7CiAJfQogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2dDE3MDhfamFja19kZXRlY3RlY3RbXSA9IHsKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJKYWNrIERldGVjdCIsCi0JCS5jb3VudCA9IDEsCi0JCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywKLQkJLmdldCA9IHZ0MTcwOF9qYWNrX2RldGVjdGVjdF9nZXQsCi0JCS5wdXQgPSB2dDE3MDhfamFja19kZXRlY3RlY3RfcHV0LAotCX0sCi0Je30gLyogZW5kICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdnQxNzA4X2phY2tfZGV0ZWN0X2N0bCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJKYWNrIERldGVjdCIsCisJLmNvdW50ID0gMSwKKwkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCisJLmdldCA9IHZ0MTcwOF9qYWNrX2RldGVjdF9nZXQsCisJLnB1dCA9IHZ0MTcwOF9qYWNrX2RldGVjdF9wdXQsCiB9OwogCi1zdGF0aWMgaW50IHZ0MTcwOF9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3N0YXRpYyB2b2lkIGZpbGxfZGlnX291dHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOworc3RhdGljIHZvaWQgZmlsbF9kaWdfaW4oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOworCitzdGF0aWMgaW50IHZpYV9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgZXJyOwogCi0JLyogQWRkIEhQIGFuZCBDRCBwaW4gY29uZmlnIGNvbm5lY3QgYml0IHJlLWNvbmZpZyBhY3Rpb24gKi8KLQl2dDE3MDhfc2V0X3BpbmNvbmZpZ19jb25uZWN0KGNvZGVjLCBWVDE3MDhfSFBfUElOX05JRCk7Ci0JdnQxNzA4X3NldF9waW5jb25maWdfY29ubmVjdChjb2RlYywgVlQxNzA4X0NEX1BJTl9OSUQpOwotCiAJZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsIE5VTEwpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IHZ0MTcwOF9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwogCWlmICghc3BlYy0+YXV0b2NmZy5saW5lX291dHMgJiYgIXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSkKLQkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgQklPUyBwaW4gY29uZmlnICovCisJCXJldHVybiAtRUlOVkFMOwogCi0JZXJyID0gdnQxNzA4X2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwllcnIgPSB2aWFfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoY29kZWMpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IHZ0MTcwOF9hdXRvX2NyZWF0ZV9ocF9jdGxzKHNwZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSk7CisJZXJyID0gdmlhX2F1dG9fY3JlYXRlX2hwX2N0bHMoY29kZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JZXJyID0gdnQxNzA4X2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJZXJyID0gdmlhX2F1dG9fY3JlYXRlX3NwZWFrZXJfY3Rscyhjb2RlYyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JLyogYWRkIGphY2sgZGV0ZWN0IG9uL29mZiBjb250cm9sICovCi0JZXJyID0gc25kX2hkYV9hZGRfbmV3X2N0bHMoY29kZWMsIHZ0MTcwOF9qYWNrX2RldGVjdGVjdCk7CisJZXJyID0gdmlhX2F1dG9fY3JlYXRlX2xvb3BiYWNrX3N3aXRjaChjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gdmlhX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAogCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzICogMjsKIAotCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19vdXRzKQotCQlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IFZUMTcwOF9ESUdPVVRfTklEOwotCXNwZWMtPmRpZ19pbl9waW4gPSBWVDE3MDhfRElHSU5fUElOOwotCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19pbl9waW4pCi0JCXNwZWMtPmRpZ19pbl9uaWQgPSBWVDE3MDhfRElHSU5fTklEOworCWZpbGxfZGlnX291dHMoY29kZWMpOworCWZpbGxfZGlnX2luKGNvZGVjKTsKIAogCWlmIChzcGVjLT5rY3Rscy5saXN0KQogCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxzLmxpc3Q7CiAKLQlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDhfdm9sdW1lX2luaXRfdmVyYnM7CiAKLQlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOworCWlmIChzcGVjLT5ocF9kYWNfbmlkICYmIHNwZWMtPmhwX21peF9wYXRoLmRlcHRoKSB7CisJCWVyciA9IHZpYV9ocF9idWlsZChjb2RlYyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CiAKLQlpZiAoc3BlYy0+aHBfbXV4KQotCQl2aWFfaHBfYnVpbGQoY29kZWMpOworCWVyciA9IHZpYV9zbWFydDUxX2J1aWxkKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAotCXZpYV9zbWFydDUxX2J1aWxkKHNwZWMpOworCS8qIGFzc2lnbiBzbGF2ZSBvdXRzICovCisJaWYgKHNwZWMtPnNsYXZlX2RpZ19vdXRzWzBdKQorCQljb2RlYy0+c2xhdmVfZGlnX291dHMgPSBzcGVjLT5zbGF2ZV9kaWdfb3V0czsKKwogCXJldHVybiAxOwogfQogCi0vKiBpbml0IGNhbGxiYWNrIGZvciBhdXRvLWNvbmZpZ3VyYXRpb24gbW9kZWwgLS0gb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBpbml0ICovCi1zdGF0aWMgaW50IHZpYV9hdXRvX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCitzdGF0aWMgdm9pZCB2aWFfYXV0b19pbml0X2RpZ19vdXRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkKKwkJaW5pdF9vdXRwdXRfcGluKGNvZGVjLCBzcGVjLT5hdXRvY2ZnLmRpZ19vdXRfcGluc1swXSwgUElOX09VVCk7CisJaWYgKHNwZWMtPnNsYXZlX2RpZ19vdXRzWzBdKQorCQlpbml0X291dHB1dF9waW4oY29kZWMsIHNwZWMtPmF1dG9jZmcuZGlnX291dF9waW5zWzFdLCBQSU5fT1VUKTsKK30KIAotCXZpYV9pbml0KGNvZGVjKTsKK3N0YXRpYyB2b2lkIHZpYV9hdXRvX2luaXRfZGlnX2luKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWlmICghc3BlYy0+ZGlnX2luX25pZCkKKwkJcmV0dXJuOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNwZWMtPmF1dG9jZmcuZGlnX2luX3BpbiwgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTik7Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIHVuc29saWNpdGVkIGV2ZW50cyAqLworc3RhdGljIHZvaWQgdmlhX2F1dG9faW5pdF91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKKwl1bnNpZ25lZCBpbnQgZXY7CisJaW50IGk7CisKKwlpZiAoY2ZnLT5ocF9waW5zWzBdICYmIGlzX2phY2tfZGV0ZWN0YWJsZShjb2RlYywgY2ZnLT5ocF9waW5zWzBdKSkKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY2ZnLT5ocF9waW5zWzBdLCAwLAorCQkJCUFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwKKwkJCQlBQ19VU1JTUF9FTiB8IFZJQV9IUF9FVkVOVCB8IFZJQV9KQUNLX0VWRU5UKTsKKworCWlmIChjZmctPnNwZWFrZXJfcGluc1swXSkKKwkJZXYgPSBWSUFfTElORV9FVkVOVDsKKwllbHNlCisJCWV2ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5saW5lX291dHM7IGkrKykgeworCQlpZiAoY2ZnLT5saW5lX291dF9waW5zW2ldICYmCisJCSAgICBpc19qYWNrX2RldGVjdGFibGUoY29kZWMsIGNmZy0+bGluZV9vdXRfcGluc1tpXSkpCisJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjZmctPmxpbmVfb3V0X3BpbnNbaV0sIDAsCisJCQkJQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAorCQkJCUFDX1VTUlNQX0VOIHwgZXYgfCBWSUFfSkFDS19FVkVOVCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX2lucHV0czsgaSsrKSB7CisJCWlmIChpc19qYWNrX2RldGVjdGFibGUoY29kZWMsIGNmZy0+aW5wdXRzW2ldLnBpbikpCisJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjZmctPmlucHV0c1tpXS5waW4sIDAsCisJCQkJQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAorCQkJCUFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlQpOworCX0KK30KKworc3RhdGljIGludCB2aWFfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1faXZlcmJzOyBpKyspCisJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIHNwZWMtPmluaXRfdmVyYnNbaV0pOworCiAJdmlhX2F1dG9faW5pdF9tdWx0aV9vdXQoY29kZWMpOwogCXZpYV9hdXRvX2luaXRfaHBfb3V0KGNvZGVjKTsKKwl2aWFfYXV0b19pbml0X3NwZWFrZXJfb3V0KGNvZGVjKTsKIAl2aWFfYXV0b19pbml0X2FuYWxvZ19pbnB1dChjb2RlYyk7CisJdmlhX2F1dG9faW5pdF9kaWdfb3V0cyhjb2RlYyk7CisJdmlhX2F1dG9faW5pdF9kaWdfaW4oY29kZWMpOwogCi0JaWYgKFZUMjAwMlBfQ09NUEFUSUJMRShzcGVjKSkgewotCQl2aWFfaHBfYmluZF9hdXRvbXV0ZShjb2RlYyk7Ci0JfSBlbHNlIHsKLQkJdmlhX2hwX2F1dG9tdXRlKGNvZGVjKTsKLQkJdmlhX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOwotCX0KKwl2aWFfYXV0b19pbml0X3Vuc29sX2V2ZW50KGNvZGVjKTsKKworCXZpYV9ocF9hdXRvbXV0ZShjb2RlYyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIyNTIsNDM3ICsyODE0LDM2IEBACiAJaWYgKHNwZWMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlzcGVjLT5hYV9taXhfbmlkID0gMHgxNzsKKworCS8qIEFkZCBIUCBhbmQgQ0QgcGluIGNvbmZpZyBjb25uZWN0IGJpdCByZS1jb25maWcgYWN0aW9uICovCisJdnQxNzA4X3NldF9waW5jb25maWdfY29ubmVjdChjb2RlYywgVlQxNzA4X0hQX1BJTl9OSUQpOworCXZ0MTcwOF9zZXRfcGluY29uZmlnX2Nvbm5lY3QoY29kZWMsIFZUMTcwOF9DRF9QSU5fTklEKTsKKwogCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLwotCWVyciA9IHZ0MTcwOF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJZXJyID0gdmlhX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkgewogCQl2aWFfZnJlZShjb2RlYyk7CiAJCXJldHVybiBlcnI7Ci0JfSBlbHNlIGlmICghZXJyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKLQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBnZW5lbmljIG1vZGUuLi5cbiIpOwogCX0KIAorCS8qIGFkZCBqYWNrIGRldGVjdCBvbi9vZmYgY29udHJvbCAqLworCWlmICghdmlhX2Nsb25lX2NvbnRyb2woc3BlYywgJnZ0MTcwOF9qYWNrX2RldGVjdF9jdGwpKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJWVDE3MDggQW5hbG9nIjsKLQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJnZ0MTcwOF9wY21fYW5hbG9nX3BsYXliYWNrOwogCS8qIGRpc2FibGUgMzJiaXQgZm9ybWF0IG9uIFZUMTcwOCAqLwogCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjE3MDgpCiAJCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmdnQxNzA4X3BjbV9hbmFsb2dfczE2X3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2dDE3MDhfcGNtX2FuYWxvZ19jYXB0dXJlOwogCi0Jc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJWVDE3MDggRGlnaXRhbCI7Ci0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmdnQxNzA4X3BjbV9kaWdpdGFsX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUgPSAmdnQxNzA4X3BjbV9kaWdpdGFsX2NhcHR1cmU7Ci0KLQotCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7Ci0JCXNwZWMtPmFkY19uaWRzID0gdnQxNzA4X2FkY19uaWRzOwotCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKHZ0MTcwOF9hZGNfbmlkcyk7Ci0JCWdldF9tdXhfbmlkcyhjb2RlYyk7Ci0JCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9IHZ0MTcwOF9jYXB0dXJlX21peGVyOwotCQlzcGVjLT5udW1fbWl4ZXJzKys7Ci0JfQorCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9IHZ0MTcwOF9pbml0X3ZlcmJzOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7CiAKLQljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSB2aWFfYXV0b19pbml0OwotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLQlzcGVjLT5sb29wYmFjay5hbXBsaXN0ID0gdnQxNzA4X2xvb3BiYWNrczsKLSNlbmRpZgogCUlOSVRfREVMQVlFRF9XT1JLKCZzcGVjLT52dDE3MDhfaHBfd29yaywgdnQxNzA4X3VwZGF0ZV9ocF9qYWNrX3N0YXRlKTsKIAlyZXR1cm4gMDsKIH0KIAotLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZ0MTcwOV9jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDE0LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDEsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMSwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDIsIDB4MTYsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMiwgMHgxNiwgMHgwLCBIREFfSU5QVVQpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS8qIFRoZSBtdWx0aXBsZSAiQ2FwdHVyZSBTb3VyY2UiIGNvbnRyb2xzIGNvbmZ1c2UgYWxzYW1peGVyCi0JCSAqIFNvIGNhbGwgc29tZXdoYXQgZGlmZmVyZW50Li4KLQkJICovCi0JCS8qIC5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwgKi8KLQkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKLQkJLmNvdW50ID0gMSwKLQkJLmluZm8gPSB2aWFfbXV4X2VudW1faW5mbywKLQkJLmdldCA9IHZpYV9tdXhfZW51bV9nZXQsCi0JCS5wdXQgPSB2aWFfbXV4X2VudW1fcHV0LAotCX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2dDE3MDlfdW5pd2lsbF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MjAsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwKLQkgQUNfVVNSU1BfRU4gfCBWSUFfSFBfRVZFTlQgfCBWSUFfSkFDS19FVkVOVH0sCi0JeyB9Ci19OwotCi0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHZ0MTcwOV8xMGNoX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0yIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQotCS8qIFVubXV0ZSBpbnB1dCBhbXBzIChDRCwgTGluZSBJbiwgTWljIDEgJiBNaWMgMikgb2YgdGhlIGFuYWxvZy1sb29wYmFjawotCSAqIG1peGVyIHdpZGdldAotCSAqLwotCS8qIEFtcCBJbmRpY2VzOiBBT1cwPTAsIENEID0gMSwgTWljMSA9IDIsIExpbmUgPSAzLCBNaWMyID0gNCAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgc2VsZWN0b3IgKDB4MWEsIDB4MWIsIDB4MjkpCi0JICovCi0JLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgyOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCS8qCi0JICogIFVubXV0ZSBQVzMgYW5kIFBXNAotCSAqLwotCXsweDFmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDIwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogU2V0IGlucHV0IG9mIFBXNCBhcyBNVzAgKi8KLQl7MHgyMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAotCS8qIFBXOSBPdXRwdXQgZW5hYmxlICovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOV8xMGNoX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAxLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAxMCwKLQkubmlkID0gMHgxMCwgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCi0JLm9wcyA9IHsKLQkJLm9wZW4gPSB2aWFfcGxheWJhY2tfcGNtX29wZW4sCi0JCS5wcmVwYXJlID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9wcmVwYXJlLAotCQkuY2xlYW51cCA9IHZpYV9wbGF5YmFja19tdWx0aV9wY21fY2xlYW51cCwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDlfNmNoX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAxLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSA2LAotCS5uaWQgPSAweDEwLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9wbGF5YmFja19wY21fb3BlbiwKLQkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbGVhbnVwLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOV9wY21fYW5hbG9nX2NhcHR1cmUgPSB7Ci0JLnN1YnN0cmVhbXMgPSAyLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS5uaWQgPSAweDE0LCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KLQkub3BzID0gewotCQkucHJlcGFyZSA9IHZpYV9jYXB0dXJlX3BjbV9wcmVwYXJlLAotCQkuY2xlYW51cCA9IHZpYV9jYXB0dXJlX3BjbV9jbGVhbnVwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA5X3BjbV9kaWdpdGFsX3BsYXliYWNrID0gewotCS5zdWJzdHJlYW1zID0gMSwKLQkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkvKiBOSUQgaXMgc2V0IGluIHZpYV9idWlsZF9wY21zICovCi0JLm9wcyA9IHsKLQkJLm9wZW4gPSB2aWFfZGlnX3BsYXliYWNrX3BjbV9vcGVuLAotCQkuY2xvc2UgPSB2aWFfZGlnX3BsYXliYWNrX3BjbV9jbG9zZQotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOV9wY21fZGlnaXRhbF9jYXB0dXJlID0gewotCS5zdWJzdHJlYW1zID0gMSwKLQkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gMiwKLX07Ci0KLXN0YXRpYyBpbnQgdnQxNzA5X2F1dG9fZmlsbF9kYWNfbmlkcyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCi17Ci0JaW50IGk7Ci0JaGRhX25pZF90IG5pZDsKLQotCWlmIChjZmctPmxpbmVfb3V0cyA9PSA0KSAgLyogMTAgY2hhbm5lbHMgKi8KLQkJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSBjZmctPmxpbmVfb3V0cysxOyAvKiBBT1cwfkFPVzQgKi8KLQllbHNlIGlmIChjZmctPmxpbmVfb3V0cyA9PSAzKSAvKiA2IGNoYW5uZWxzICovCi0JCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gY2ZnLT5saW5lX291dHM7IC8qIEFPVzB+QU9XMiAqLwotCi0Jc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5wcml2YXRlX2RhY19uaWRzOwotCi0JaWYgKGNmZy0+bGluZV9vdXRzID09IDQpIHsgLyogMTAgY2hhbm5lbHMgKi8KLQkJZm9yIChpID0gMDsgaSA8IGNmZy0+bGluZV9vdXRzOyBpKyspIHsKLQkJCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKLQkJCWlmIChuaWQpIHsKLQkJCQkvKiBjb25maWcgZGFjIGxpc3QgKi8KLQkJCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIEFVVE9fU0VRX0ZST05UOgotCQkJCQkvKiBBT1cwICovCi0JCQkJCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbaV0gPSAweDEwOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFVVE9fU0VRX0NFTkxGRToKLQkJCQkJLyogQU9XMiAqLwotCQkJCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldID0gMHgxMjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBVVRPX1NFUV9TVVJST1VORDoKLQkJCQkJLyogQU9XMyAqLwotCQkJCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldID0gMHgxMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBVVRPX1NFUV9TSURFOgotCQkJCQkvKiBBT1cxICovCi0JCQkJCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbaV0gPSAweDI3OwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tjZmctPmxpbmVfb3V0c10gPSAweDI4OyAvKiBBT1c0ICovCi0KLQl9IGVsc2UgaWYgKGNmZy0+bGluZV9vdXRzID09IDMpIHsgLyogNiBjaGFubmVscyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5saW5lX291dHM7IGkrKykgewotCQkJbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOwotCQkJaWYgKG5pZCkgewotCQkJCS8qIGNvbmZpZyBkYWMgbGlzdCAqLwotCQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgQVVUT19TRVFfRlJPTlQ6Ci0JCQkJCS8qIEFPVzAgKi8KLQkJCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IDB4MTA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQVVUT19TRVFfQ0VOTEZFOgotCQkJCQkvKiBBT1cyICovCi0JCQkJCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbaV0gPSAweDEyOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFVVE9fU0VRX1NVUlJPVU5EOgotCQkJCQkvKiBBT1cxICovCi0JCQkJCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbaV0gPSAweDExOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZyb20gdGhlIHBhcnNlZCBEQUMgdGFibGUgKi8KLXN0YXRpYyBpbnQgdnQxNzA5X2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKLQkJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCi17Ci0JY2hhciBuYW1lWzMyXTsKLQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNobmFtZVs0XSA9IHsKLQkJIkZyb250IiwgIlN1cnJvdW5kIiwgIkMvTEZFIiwgIlNpZGUiCi0JfTsKLQloZGFfbmlkX3QgbmlkLCBuaWRfdm9sLCBuaWRfdm9sc1tdID0gezB4MTgsIDB4MWEsIDB4MWIsIDB4Mjl9OwotCWludCBpLCBlcnI7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IEFVVE9fU0VRX1NJREU7IGkrKykgewotCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07Ci0KLQkJaWYgKCFuaWQpCi0JCQljb250aW51ZTsKLQotCQluaWRfdm9sID0gbmlkX3ZvbHNbaV07Ci0KLQkJaWYgKGkgPT0gQVVUT19TRVFfQ0VOTEZFKSB7Ci0JCQkvKiBDZW50ZXIvTEZFICovCi0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAotCQkJCQkgICAgICAiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMSwgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKLQkJCQkJICAgICAgIkxGRSBQbGF5YmFjayBWb2x1bWUiLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDIsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAotCQkJCQkgICAgICAiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMSwgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCi0JCQkJCSAgICAgICJMRkUgUGxheWJhY2sgU3dpdGNoIiwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAyLCAwLAotCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0gZWxzZSBpZiAoaSA9PSBBVVRPX1NFUV9GUk9OVCkgewotCQkJLyogQUREIGNvbnRyb2wgdG8gbWl4ZXIgaW5kZXggMCAqLwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKLQkJCQkJICAgICAgIk1hc3RlciBGcm9udCBQbGF5YmFjayBWb2x1bWUiLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDMsIDAsCi0JCQkJCQkJCSAgSERBX0lOUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCi0JCQkJCSAgICAgICJNYXN0ZXIgRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAzLCAwLAotCQkJCQkJCQkgIEhEQV9JTlBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQotCQkJLyogYWRkIGNvbnRyb2wgdG8gUFczICovCi0JCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGNobmFtZVtpXSk7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIGlmIChpID09IEFVVE9fU0VRX1NVUlJPVU5EKSB7Ci0JCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAzLCAwLAotCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBjaG5hbWVbaV0pOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsIG5hbWUsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgaWYgKGkgPT0gQVVUT19TRVFfU0lERSkgewotCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDMsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZ0MTcwOV9hdXRvX2NyZWF0ZV9ocF9jdGxzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywgaGRhX25pZF90IHBpbikKLXsKLQlpbnQgZXJyOwotCi0JaWYgKCFwaW4pCi0JCXJldHVybiAwOwotCi0JaWYgKHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID09IDUpIC8qIDEwIGNoYW5uZWxzICovCi0JCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IFZUMTcwOV9IUF9EQUNfTklEOwotCWVsc2UgaWYgKHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID09IDMpIC8qIDYgY2hhbm5lbHMgKi8KLQkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gMDsKLQlzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlX2luZGV4ID0gMTsKLQotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkgICAgICAiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKHBpbiwgMywgMCwgSERBX09VVFBVVCkpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAotCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLAotCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiAwOwotfQotCi0vKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLwotc3RhdGljIGludCB2dDE3MDlfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCQljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCi17Ci0Jc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBwaW5faWR4c1tdID0geyAweGZmLCAweDIzLCAweDFkLCAweDFlLCAweDIxIH07Ci0JcmV0dXJuIHZ0X2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKGNvZGVjLCBjZmcsIDB4MTgsIHBpbl9pZHhzLAotCQkJCQkJQVJSQVlfU0laRShwaW5faWR4cykpOwotfQotCi1zdGF0aWMgaW50IHZ0MTcwOV9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgZXJyOwotCi0JZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsIE5VTEwpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHZ0MTcwOV9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWlmICghc3BlYy0+YXV0b2NmZy5saW5lX291dHMgJiYgIXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSkKLQkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgQklPUyBwaW4gY29uZmlnICovCi0KLQllcnIgPSB2dDE3MDlfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHZ0MTcwOV9hdXRvX2NyZWF0ZV9ocF9jdGxzKHNwZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gdnQxNzA5X2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7Ci0KLQlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0cykKLQkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBWVDE3MDlfRElHT1VUX05JRDsKLQlzcGVjLT5kaWdfaW5fcGluID0gVlQxNzA5X0RJR0lOX1BJTjsKLQlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfaW5fcGluKQotCQlzcGVjLT5kaWdfaW5fbmlkID0gVlQxNzA5X0RJR0lOX05JRDsKLQotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxzLmxpc3Q7Ci0KLQlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOwotCi0JaWYgKHNwZWMtPmhwX211eCkKLQkJdmlhX2hwX2J1aWxkKGNvZGVjKTsKLQotCXZpYV9zbWFydDUxX2J1aWxkKHNwZWMpOwotCXJldHVybiAxOwotfQotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYW1wX2xpc3QgdnQxNzA5X2xvb3BiYWNrc1tdID0gewotCXsgMHgxOCwgSERBX0lOUFVULCAxIH0sCi0JeyAweDE4LCBIREFfSU5QVVQsIDIgfSwKLQl7IDB4MTgsIEhEQV9JTlBVVCwgMyB9LAotCXsgMHgxOCwgSERBX0lOUFVULCA0IH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHBhdGNoX3Z0MTcwOV8xMGNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQorc3RhdGljIGludCBwYXRjaF92dDE3MDkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHZpYV9zcGVjICpzcGVjOwogCWludCBlcnI7CkBAIC0yNjkyLDUyNyArMjg1MywxOCBAQAogCWlmIChzcGVjID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZXJyID0gdnQxNzA5X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwlzcGVjLT5hYV9taXhfbmlkID0gMHgxODsKKworCWVyciA9IHZpYV9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CiAJaWYgKGVyciA8IDApIHsKIAkJdmlhX2ZyZWUoY29kZWMpOwogCQlyZXR1cm4gZXJyOwotCX0gZWxzZSBpZiAoIWVycikgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbi4gICIKLQkJICAgICAgICJVc2luZyBnZW5lbmljIG1vZGUuLi5cbiIpOwotCX0KLQotCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9IHZ0MTcwOV8xMGNoX3ZvbHVtZV9pbml0X3ZlcmJzOwotCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9IHZ0MTcwOV91bml3aWxsX2luaXRfdmVyYnM7Ci0KLQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxNzA5IEFuYWxvZyI7Ci0Jc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZ2dDE3MDlfMTBjaF9wY21fYW5hbG9nX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2dDE3MDlfcGNtX2FuYWxvZ19jYXB0dXJlOwotCi0Jc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJWVDE3MDkgRGlnaXRhbCI7Ci0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmdnQxNzA5X3BjbV9kaWdpdGFsX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUgPSAmdnQxNzA5X3BjbV9kaWdpdGFsX2NhcHR1cmU7Ci0KLQotCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7Ci0JCXNwZWMtPmFkY19uaWRzID0gdnQxNzA5X2FkY19uaWRzOwotCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKHZ0MTcwOV9hZGNfbmlkcyk7Ci0JCWdldF9tdXhfbmlkcyhjb2RlYyk7Ci0JCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9IHZ0MTcwOV9jYXB0dXJlX21peGVyOwotCQlzcGVjLT5udW1fbWl4ZXJzKys7CiAJfQogCiAJY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7CiAKLQljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSB2aWFfYXV0b19pbml0OwotCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSB2aWFfdW5zb2xfZXZlbnQ7Ci0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSB2dDE3MDlfbG9vcGJhY2tzOwotI2VuZGlmCi0KIAlyZXR1cm4gMDsKIH0KLS8qCi0gKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgdnQxNzA5XzZjaF92b2x1bWVfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAtMiBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0KLQkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZSBhbmFsb2ctbG9vcGJhY2sKLQkgKiBtaXhlciB3aWRnZXQKLQkgKi8KLQkvKiBBbXAgSW5kaWNlczogQU9XMD0wLCBDRCA9IDEsIE1pYzEgPSAyLCBMaW5lID0gMywgTWljMiA9IDQgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNCl9LAotCi0JLyoKLQkgKiBTZXQgdXAgb3V0cHV0IHNlbGVjdG9yICgweDFhLCAweDFiLCAweDI5KQotCSAqLwotCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MjksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0KLQkvKgotCSAqICBVbm11dGUgUFczIGFuZCBQVzQKLQkgKi8KLQl7MHgxZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgyMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCS8qIFNldCBpbnB1dCBvZiBQVzQgYXMgTVcwICovCi0JezB4MjAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQkvKiBQVzkgT3V0cHV0IGVuYWJsZSAqLwotCXsweDI0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAotCXsgfQotfTsKLQotc3RhdGljIGludCBwYXRjaF92dDE3MDlfNmNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYzsKLQlpbnQgZXJyOwotCi0JLyogY3JlYXRlIGEgY29kZWMgc3BlY2lmaWMgcmVjb3JkICovCi0Jc3BlYyA9IHZpYV9uZXdfc3BlYyhjb2RlYyk7Ci0JaWYgKHNwZWMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnIgPSB2dDE3MDlfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwotCWlmIChlcnIgPCAwKSB7Ci0JCXZpYV9mcmVlKGNvZGVjKTsKLQkJcmV0dXJuIGVycjsKLQl9IGVsc2UgaWYgKCFlcnIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24uICAiCi0JCSAgICAgICAiVXNpbmcgZ2VuZW5pYyBtb2RlLi4uXG4iKTsKLQl9Ci0KLQlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDlfNmNoX3ZvbHVtZV9pbml0X3ZlcmJzOwotCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9IHZ0MTcwOV91bml3aWxsX2luaXRfdmVyYnM7Ci0KLQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxNzA5IEFuYWxvZyI7Ci0Jc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZ2dDE3MDlfNmNoX3BjbV9hbmFsb2dfcGxheWJhY2s7Ci0Jc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0gJnZ0MTcwOV9wY21fYW5hbG9nX2NhcHR1cmU7Ci0KLQlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIlZUMTcwOSBEaWdpdGFsIjsKLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZ2dDE3MDlfcGNtX2RpZ2l0YWxfcGxheWJhY2s7Ci0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSA9ICZ2dDE3MDlfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKLQotCi0JaWYgKCFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKLQkJc3BlYy0+YWRjX25pZHMgPSB2dDE3MDlfYWRjX25pZHM7Ci0JCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUodnQxNzA5X2FkY19uaWRzKTsKLQkJZ2V0X211eF9uaWRzKGNvZGVjKTsKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gdnQxNzA5X2NhcHR1cmVfbWl4ZXI7Ci0JCXNwZWMtPm51bV9taXhlcnMrKzsKLQl9Ci0KLQljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKLQotCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IHZpYV9hdXRvX2luaXQ7Ci0JY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IHZpYV91bnNvbF9ldmVudDsKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi0Jc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IHZ0MTcwOV9sb29wYmFja3M7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZ0MTcwOEJfY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxMywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTMsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDE0LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MTQsIDB4MCwgSERBX0lOUFVUKSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkvKiBUaGUgbXVsdGlwbGUgIkNhcHR1cmUgU291cmNlIiBjb250cm9scyBjb25mdXNlIGFsc2FtaXhlcgotCQkgKiBTbyBjYWxsIHNvbWV3aGF0IGRpZmZlcmVudC4uCi0JCSAqLwotCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCi0JCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCi0JCS5jb3VudCA9IDEsCi0JCS5pbmZvID0gdmlhX211eF9lbnVtX2luZm8sCi0JCS5nZXQgPSB2aWFfbXV4X2VudW1fZ2V0LAotCQkucHV0ID0gdmlhX211eF9lbnVtX3B1dCwKLQl9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHZ0MTcwOEJfOGNoX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0xIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MTMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQotCi0JLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCi0JICogbWl4ZXIgd2lkZ2V0Ci0JICovCi0JLyogQW1wIEluZGljZXM6IENEID0gMSwgTWljMSA9IDIsIExpbmUgPSAzLCBNaWMyID0gNCAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzCi0JICovCi0JLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgyNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgyNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCS8qIFNldHVwIGRlZmF1bHQgaW5wdXQgdG8gUFc0ICovCi0JezB4MWQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQkvKiBQVzkgT3V0cHV0IGVuYWJsZSAqLwotCXsweDIwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAotCS8qIFBXMTAgSW5wdXQgZW5hYmxlICovCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHZ0MTcwOEJfNGNoX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0xIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MTMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQotCi0JLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCi0JICogbWl4ZXIgd2lkZ2V0Ci0JICovCi0JLyogQW1wIEluZGljZXM6IENEID0gMSwgTWljMSA9IDIsIExpbmUgPSAzLCBNaWMyID0gNCAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzCi0JICovCi0JLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgyNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgyNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCS8qIFNldHVwIGRlZmF1bHQgaW5wdXQgb2YgUFc0IHRvIE1XMCAqLwotCXsweDFkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKLQkvKiBQVzkgT3V0cHV0IGVuYWJsZSAqLwotCXsweDIwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAotCS8qIFBXMTAgSW5wdXQgZW5hYmxlICovCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHZ0MTcwOEJfdW5pd2lsbF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MWQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwKLQkgQUNfVVNSU1BfRU4gfCBWSUFfSFBfRVZFTlQgfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MWMsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MWUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgaW50IHZpYV9wY21fb3Blbl9jbG9zZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAotCQkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlpbnQgaWRsZSA9IHN1YnN0cmVhbS0+cHN0ci0+c3Vic3RyZWFtX29wZW5lZCA9PSAxCi0JCSYmIHN1YnN0cmVhbS0+cmVmX2NvdW50ID09IDA7Ci0KLQlhbmFsb2dfbG93X2N1cnJlbnRfbW9kZShjb2RlYywgaWRsZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA4Ql84Y2hfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKLQkuc3Vic3RyZWFtcyA9IDIsCi0JLmNoYW5uZWxzX21pbiA9IDIsCi0JLmNoYW5uZWxzX21heCA9IDgsCi0JLm5pZCA9IDB4MTAsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLwotCS5vcHMgPSB7Ci0JCS5vcGVuID0gdmlhX3BsYXliYWNrX3BjbV9vcGVuLAotCQkucHJlcGFyZSA9IHZpYV9wbGF5YmFja19tdWx0aV9wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX2NsZWFudXAsCi0JCS5jbG9zZSA9IHZpYV9wY21fb3Blbl9jbG9zZQotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOEJfNGNoX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAyLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSA0LAotCS5uaWQgPSAweDEwLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9wbGF5YmFja19wY21fb3BlbiwKLQkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbGVhbnVwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA4Ql9wY21fYW5hbG9nX2NhcHR1cmUgPSB7Ci0JLnN1YnN0cmVhbXMgPSAyLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS5uaWQgPSAweDEzLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9wY21fb3Blbl9jbG9zZSwKLQkJLnByZXBhcmUgPSB2aWFfY2FwdHVyZV9wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfY2FwdHVyZV9wY21fY2xlYW51cCwKLQkJLmNsb3NlID0gdmlhX3BjbV9vcGVuX2Nsb3NlCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA4Ql9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKLQkuc3Vic3RyZWFtcyA9IDEsCi0JLmNoYW5uZWxzX21pbiA9IDIsCi0JLmNoYW5uZWxzX21heCA9IDIsCi0JLyogTklEIGlzIHNldCBpbiB2aWFfYnVpbGRfcGNtcyAqLwotCS5vcHMgPSB7Ci0JCS5vcGVuID0gdmlhX2RpZ19wbGF5YmFja19wY21fb3BlbiwKLQkJLmNsb3NlID0gdmlhX2RpZ19wbGF5YmFja19wY21fY2xvc2UsCi0JCS5wcmVwYXJlID0gdmlhX2RpZ19wbGF5YmFja19wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfZGlnX3BsYXliYWNrX3BjbV9jbGVhbnVwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA4Ql9wY21fZGlnaXRhbF9jYXB0dXJlID0gewotCS5zdWJzdHJlYW1zID0gMSwKLQkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gMiwKLX07Ci0KLS8qIGZpbGwgaW4gdGhlIGRhY19uaWRzIHRhYmxlIGZyb20gdGhlIHBhcnNlZCBwaW4gY29uZmlndXJhdGlvbiAqLwotc3RhdGljIGludCB2dDE3MDhCX2F1dG9fZmlsbF9kYWNfbmlkcyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCi17Ci0JaW50IGk7Ci0JaGRhX25pZF90IG5pZDsKLQotCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gY2ZnLT5saW5lX291dHM7Ci0KLQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPnByaXZhdGVfZGFjX25pZHM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKLQkJaWYgKG5pZCkgewotCQkJLyogY29uZmlnIGRhYyBsaXN0ICovCi0JCQlzd2l0Y2ggKGkpIHsKLQkJCWNhc2UgQVVUT19TRVFfRlJPTlQ6Ci0JCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IDB4MTA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVVE9fU0VRX0NFTkxGRToKLQkJCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldID0gMHgyNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVUT19TRVFfU1VSUk9VTkQ6Ci0JCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IDB4MTE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVVE9fU0VRX1NJREU6Ci0JCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IDB4MjU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZyb20gdGhlIHBhcnNlZCBEQUMgdGFibGUgKi8KLXN0YXRpYyBpbnQgdnQxNzA4Ql9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsCi0JCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCWNoYXIgbmFtZVszMl07Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjaG5hbWVbNF0gPSB7Ci0JCSJGcm9udCIsICJTdXJyb3VuZCIsICJDL0xGRSIsICJTaWRlIgotCX07Ci0JaGRhX25pZF90IG5pZF92b2xzW10gPSB7MHgxNiwgMHgxOCwgMHgyNiwgMHgyN307Ci0JaGRhX25pZF90IG5pZCwgbmlkX3ZvbCA9IDA7Ci0JaW50IGksIGVycjsKLQotCWZvciAoaSA9IDA7IGkgPD0gQVVUT19TRVFfU0lERTsgaSsrKSB7Ci0JCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKLQotCQlpZiAoIW5pZCkKLQkJCWNvbnRpbnVlOwotCi0JCW5pZF92b2wgPSBuaWRfdm9sc1tpXTsKLQotCQlpZiAoaSA9PSBBVVRPX1NFUV9DRU5MRkUpIHsKLQkJCS8qIENlbnRlci9MRkUgKi8KLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkJCSAgICAgICJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAxLCAwLAotCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAotCQkJCQkgICAgICAiTEZFIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMiwgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCi0JCQkJCSAgICAgICJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAxLCAwLAotCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKLQkJCQkJICAgICAgIkxGRSBQbGF5YmFjayBTd2l0Y2giLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDIsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIGlmIChpID09IEFVVE9fU0VRX0ZST05UKSB7Ci0JCQkvKiBhZGQgY29udHJvbCB0byBtaXhlciBpbmRleCAwICovCi0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAotCQkJCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFZvbHVtZSIsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwKLQkJCQkJCQkJICBIREFfSU5QVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKLQkJCQkJICAgICAgIk1hc3RlciBGcm9udCBQbGF5YmFjayBTd2l0Y2giLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDMsIDAsCi0JCQkJCQkJCSAgSERBX0lOUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCi0JCQkvKiBhZGQgY29udHJvbCB0byBQVzMgKi8KLQkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIGNobmFtZVtpXSk7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLCBuYW1lLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgewotCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDMsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZ0MTcwOEJfYXV0b19jcmVhdGVfaHBfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW4pCi17Ci0JaW50IGVycjsKLQotCWlmICghcGluKQotCQlyZXR1cm4gMDsKLQotCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IFZUMTcwOEJfSFBfTklEOyAvKiBBT1czICovCi0Jc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZV9pbmRleCA9IDE7Ci0KLQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAotCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAotCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKLQkJCSAgICAgICJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKLQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfT1VUUFVUKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQljcmVhdGVfaHBfaW11eChzcGVjKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLwotc3RhdGljIGludCB2dDE3MDhCX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgcGluX2lkeHNbXSA9IHsgMHhmZiwgMHgxZiwgMHgxYSwgMHgxYiwgMHgxZSB9OwotCXJldHVybiB2dF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3Rscyhjb2RlYywgY2ZnLCAweDE2LCBwaW5faWR4cywKLQkJCQkJCUFSUkFZX1NJWkUocGluX2lkeHMpKTsKLX0KLQotc3RhdGljIGludCB2dDE3MDhCX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBlcnI7Ci0KLQllcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywgTlVMTCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gdnQxNzA4Ql9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWlmICghc3BlYy0+YXV0b2NmZy5saW5lX291dHMgJiYgIXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSkKLQkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgQklPUyBwaW4gY29uZmlnICovCi0KLQllcnIgPSB2dDE3MDhCX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2dDE3MDhCX2F1dG9fY3JlYXRlX2hwX2N0bHMoc3BlYywgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2dDE3MDhCX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7Ci0KLQlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0cykKLQkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBWVDE3MDhCX0RJR09VVF9OSUQ7Ci0Jc3BlYy0+ZGlnX2luX3BpbiA9IFZUMTcwOEJfRElHSU5fUElOOwotCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19pbl9waW4pCi0JCXNwZWMtPmRpZ19pbl9uaWQgPSBWVDE3MDhCX0RJR0lOX05JRDsKLQotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxzLmxpc3Q7Ci0KLQlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOwotCi0JaWYgKHNwZWMtPmhwX211eCkKLQkJdmlhX2hwX2J1aWxkKGNvZGVjKTsKLQotCXZpYV9zbWFydDUxX2J1aWxkKHNwZWMpOwotCXJldHVybiAxOwotfQotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYW1wX2xpc3QgdnQxNzA4Ql9sb29wYmFja3NbXSA9IHsKLQl7IDB4MTYsIEhEQV9JTlBVVCwgMSB9LAotCXsgMHgxNiwgSERBX0lOUFVULCAyIH0sCi0JeyAweDE2LCBIREFfSU5QVVQsIDMgfSwKLQl7IDB4MTYsIEhEQV9JTlBVVCwgNCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0jZW5kaWYKIAogc3RhdGljIHZvaWQgc2V0X3dpZGdldHNfcG93ZXJfc3RhdGVfdnQxNzA4QihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKQEAgLTMyOTUsMTU3ICsyOTQ3LDM3IEBACiB9CiAKIHN0YXRpYyBpbnQgcGF0Y2hfdnQxNzA4UyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Ci1zdGF0aWMgaW50IHBhdGNoX3Z0MTcwOEJfOGNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQorc3RhdGljIGludCBwYXRjaF92dDE3MDhCKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYzsKIAlpbnQgZXJyOwogCiAJaWYgKGdldF9jb2RlY190eXBlKGNvZGVjKSA9PSBWVDE3MDhCQ0UpCiAJCXJldHVybiBwYXRjaF92dDE3MDhTKGNvZGVjKTsKLQkvKiBjcmVhdGUgYSBjb2RlYyBzcGVjaWZpYyByZWNvcmQgKi8KLQlzcGVjID0gdmlhX25ld19zcGVjKGNvZGVjKTsKLQlpZiAoc3BlYyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLwotCWVyciA9IHZ0MTcwOEJfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwotCWlmIChlcnIgPCAwKSB7Ci0JCXZpYV9mcmVlKGNvZGVjKTsKLQkJcmV0dXJuIGVycjsKLQl9IGVsc2UgaWYgKCFlcnIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGdlbmVuaWMgbW9kZS4uLlxuIik7Ci0JfQotCi0Jc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQxNzA4Ql84Y2hfdm9sdW1lX2luaXRfdmVyYnM7Ci0Jc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQxNzA4Ql91bml3aWxsX2luaXRfdmVyYnM7Ci0KLQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxNzA4QiBBbmFsb2ciOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmdnQxNzA4Ql84Y2hfcGNtX2FuYWxvZ19wbGF5YmFjazsKLQlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmdnQxNzA4Ql9wY21fYW5hbG9nX2NhcHR1cmU7Ci0KLQlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIlZUMTcwOEIgRGlnaXRhbCI7Ci0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmdnQxNzA4Ql9wY21fZGlnaXRhbF9wbGF5YmFjazsKLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlID0gJnZ0MTcwOEJfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKLQotCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7Ci0JCXNwZWMtPmFkY19uaWRzID0gdnQxNzA4Ql9hZGNfbmlkczsKLQkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRSh2dDE3MDhCX2FkY19uaWRzKTsKLQkJZ2V0X211eF9uaWRzKGNvZGVjKTsKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gdnQxNzA4Ql9jYXB0dXJlX21peGVyOwotCQlzcGVjLT5udW1fbWl4ZXJzKys7Ci0JfQotCi0JY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7Ci0KLQljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSB2aWFfYXV0b19pbml0OwotCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSB2aWFfdW5zb2xfZXZlbnQ7Ci0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSB2dDE3MDhCX2xvb3BiYWNrczsKLSNlbmRpZgotCi0Jc3BlYy0+c2V0X3dpZGdldHNfcG93ZXJfc3RhdGUgPSAgc2V0X3dpZGdldHNfcG93ZXJfc3RhdGVfdnQxNzA4QjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBhdGNoX3Z0MTcwOEJfNGNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYzsKLQlpbnQgZXJyOwogCiAJLyogY3JlYXRlIGEgY29kZWMgc3BlY2lmaWMgcmVjb3JkICovCiAJc3BlYyA9IHZpYV9uZXdfc3BlYyhjb2RlYyk7CiAJaWYgKHNwZWMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlzcGVjLT5hYV9taXhfbmlkID0gMHgxNjsKKwogCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLwotCWVyciA9IHZ0MTcwOEJfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOworCWVyciA9IHZpYV9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CiAJaWYgKGVyciA8IDApIHsKIAkJdmlhX2ZyZWUoY29kZWMpOwogCQlyZXR1cm4gZXJyOwotCX0gZWxzZSBpZiAoIWVycikgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCi0JCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgZ2VuZW5pYyBtb2RlLi4uXG4iKTsKLQl9Ci0KLQlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDhCXzRjaF92b2x1bWVfaW5pdF92ZXJiczsKLQlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDhCX3VuaXdpbGxfaW5pdF92ZXJiczsKLQotCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJWVDE3MDhCIEFuYWxvZyI7Ci0Jc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZ2dDE3MDhCXzRjaF9wY21fYW5hbG9nX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2dDE3MDhCX3BjbV9hbmFsb2dfY2FwdHVyZTsKLQotCXNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwgPSAiVlQxNzA4QiBEaWdpdGFsIjsKLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZ2dDE3MDhCX3BjbV9kaWdpdGFsX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUgPSAmdnQxNzA4Ql9wY21fZGlnaXRhbF9jYXB0dXJlOwotCi0JaWYgKCFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKLQkJc3BlYy0+YWRjX25pZHMgPSB2dDE3MDhCX2FkY19uaWRzOwotCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKHZ0MTcwOEJfYWRjX25pZHMpOwotCQlnZXRfbXV4X25pZHMoY29kZWMpOwotCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVyc10gPSB2dDE3MDhCX2NhcHR1cmVfbWl4ZXI7Ci0JCXNwZWMtPm51bV9taXhlcnMrKzsKIAl9CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKIAotCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IHZpYV9hdXRvX2luaXQ7Ci0JY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IHZpYV91bnNvbF9ldmVudDsKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi0Jc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IHZ0MTcwOEJfbG9vcGJhY2tzOwotI2VuZGlmCi0KIAlzcGVjLT5zZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZSA9ICBzZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZV92dDE3MDhCOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qIFBhdGNoIGZvciBWVDE3MDhTICovCi0KLS8qIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2dDE3MDhTX2NhcHR1cmVfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MTMsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDEzLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMSwgMHgxNCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAxLCAweDE0LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgMHgxQSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIDB4MUUsIDB4MCwKLQkJCSBIREFfSU5QVVQpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS8qIFRoZSBtdWx0aXBsZSAiQ2FwdHVyZSBTb3VyY2UiIGNvbnRyb2xzIGNvbmZ1c2UgYWxzYW1peGVyCi0JCSAqIFNvIGNhbGwgc29tZXdoYXQgZGlmZmVyZW50Li4KLQkJICovCi0JCS8qIC5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwgKi8KLQkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKLQkJLmNvdW50ID0gMSwKLQkJLmluZm8gPSB2aWFfbXV4X2VudW1faW5mbywKLQkJLmdldCA9IHZpYV9tdXhfZW51bV9nZXQsCi0JCS5wdXQgPSB2aWFfbXV4X2VudW1fcHV0LAotCX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2dDE3MDhTX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyogVW5tdXRlIEFEQzAtMSBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbiAqLwotCXsweDEzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZQotCSAqIGFuYWxvZy1sb29wYmFjayBtaXhlciB3aWRnZXQgKi8KLQkvKiBBbXAgSW5kaWNlczogQ0QgPSAxLCBNaWMxID0gMiwgTGluZSA9IDMsIE1pYzIgPSA0ICovCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDQpfSwKLQotCS8qIFNldHVwIGRlZmF1bHQgaW5wdXQgb2YgUFc0IHRvIE1XMCAqLwotCXsweDFkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKLQkvKiBQVzksIFBXMTAgIE91dHB1dCBlbmFibGUgKi8KLQl7MHgyMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgdnQxNzA4U19pbml0X3ZlcmJzW10gPSB7CiAJLyogRW5hYmxlIE1pYyBCb29zdCBWb2x1bWUgYmFja2Rvb3IgKi8KIAl7MHgxLCAweGY5OCwgMHgxfSwKIAkvKiBkb24ndCBieWJhc3MgbWl4ZXIgKi8KQEAgLTM0NTMsMjc3ICsyOTg1LDYgQEAKIAl7IH0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgdnQxNzA4U191bml3aWxsX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxZCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAotCSBBQ19VU1JTUF9FTiB8IFZJQV9IUF9FVkVOVCB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxZSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgdnQxNzA1X3VuaXdpbGxfaW5pdF92ZXJic1tdID0gewotCXsweDFkLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsCi0JIEFDX1VTUlNQX0VOIHwgVklBX0hQX0VWRU5UIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsweDFjLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsweDFlLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDhTX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAyLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSA4LAotCS5uaWQgPSAweDEwLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9wbGF5YmFja19wY21fb3BlbiwKLQkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbGVhbnVwLAotCQkuY2xvc2UgPSB2aWFfcGNtX29wZW5fY2xvc2UKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDVfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKLQkuc3Vic3RyZWFtcyA9IDIsCi0JLmNoYW5uZWxzX21pbiA9IDIsCi0JLmNoYW5uZWxzX21heCA9IDYsCi0JLm5pZCA9IDB4MTAsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLwotCS5vcHMgPSB7Ci0JCS5vcGVuID0gdmlhX3BsYXliYWNrX3BjbV9vcGVuLAotCQkucHJlcGFyZSA9IHZpYV9wbGF5YmFja19tdWx0aV9wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX2NsZWFudXAsCi0JCS5jbG9zZSA9IHZpYV9wY21fb3Blbl9jbG9zZQotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOFNfcGNtX2FuYWxvZ19jYXB0dXJlID0gewotCS5zdWJzdHJlYW1zID0gMiwKLQkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkubmlkID0gMHgxMywgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCi0JLm9wcyA9IHsKLQkJLm9wZW4gPSB2aWFfcGNtX29wZW5fY2xvc2UsCi0JCS5wcmVwYXJlID0gdmlhX2NhcHR1cmVfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX2NhcHR1cmVfcGNtX2NsZWFudXAsCi0JCS5jbG9zZSA9IHZpYV9wY21fb3Blbl9jbG9zZQotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOFNfcGNtX2RpZ2l0YWxfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAxLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS8qIE5JRCBpcyBzZXQgaW4gdmlhX2J1aWxkX3BjbXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX29wZW4sCi0JCS5jbG9zZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlLAotCQkucHJlcGFyZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX2RpZ19wbGF5YmFja19wY21fY2xlYW51cAotCX0sCi19OwotCi0vKiBmaWxsIGluIHRoZSBkYWNfbmlkcyB0YWJsZSBmcm9tIHRoZSBwYXJzZWQgcGluIGNvbmZpZ3VyYXRpb24gKi8KLXN0YXRpYyBpbnQgdnQxNzA4U19hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCWludCBpOwotCWhkYV9uaWRfdCBuaWQ7Ci0KLQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IGNmZy0+bGluZV9vdXRzOwotCi0Jc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5wcml2YXRlX2RhY19uaWRzOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07Ci0JCWlmIChuaWQpIHsKLQkJCS8qIGNvbmZpZyBkYWMgbGlzdCAqLwotCQkJc3dpdGNoIChpKSB7Ci0JCQljYXNlIEFVVE9fU0VRX0ZST05UOgotCQkJCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbaV0gPSAweDEwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVVRPX1NFUV9DRU5MRkU6Ci0JCQkJaWYgKHNwZWMtPmNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMTA2NDM5NykKLQkJCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IDB4MjU7Ci0JCQkJZWxzZQotCQkJCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldID0gMHgyNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVUT19TRVFfU1VSUk9VTkQ6Ci0JCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IDB4MTE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVVE9fU0VRX1NJREU6Ci0JCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IDB4MjU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBmb3IgU21hcnQgNS4xLCBsaW5lL21pYyBpbnB1dHMgZG91YmxlIGFzIG91dHB1dCBwaW5zICovCi0JaWYgKGNmZy0+bGluZV9vdXRzID09IDEpIHsKLQkJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSAzOwotCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW0FVVE9fU0VRX1NVUlJPVU5EXSA9IDB4MTE7Ci0JCWlmIChzcGVjLT5jb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjQzOTcpCi0JCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW0FVVE9fU0VRX0NFTkxGRV0gPSAweDI1OwotCQllbHNlCi0JCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW0FVVE9fU0VRX0NFTkxGRV0gPSAweDI0OwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZnJvbSB0aGUgcGFyc2VkIERBQyB0YWJsZSAqLwotc3RhdGljIGludCB2dDE3MDhTX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQljaGFyIG5hbWVbMzJdOwotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2huYW1lWzRdID0gewotCQkiRnJvbnQiLCAiU3Vycm91bmQiLCAiQy9MRkUiLCAiU2lkZSIKLQl9OwotCWhkYV9uaWRfdCBuaWRfdm9sc1syXVs0XSA9IHsgezB4MTAsIDB4MTEsIDB4MjQsIDB4MjV9LAotCQkJCSAgICAgezB4MTAsIDB4MTEsIDB4MjUsIDB9IH07Ci0JaGRhX25pZF90IG5pZF9tdXRlc1syXVs0XSA9IHsgezB4MUMsIDB4MTgsIDB4MjYsIDB4Mjd9LAotCQkJCSAgICAgIHsweDFDLCAweDE4LCAweDI3LCAwfSB9OwotCWhkYV9uaWRfdCBuaWQsIG5pZF92b2wsIG5pZF9tdXRlOwotCWludCBpLCBlcnI7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IEFVVE9fU0VRX1NJREU7IGkrKykgewotCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07Ci0KLQkJLyogZm9yIFNtYXJ0IDUuMSwgdGhlcmUgYXJlIGFsd2F5cyBhdCBsZWFzdCBzaXggY2hhbm5lbHMgKi8KLQkJaWYgKCFuaWQgJiYgaSA+IEFVVE9fU0VRX0NFTkxGRSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjQzOTcpIHsKLQkJCW5pZF92b2wgPSBuaWRfdm9sc1sxXVtpXTsKLQkJCW5pZF9tdXRlID0gbmlkX211dGVzWzFdW2ldOwotCQl9IGVsc2UgewotCQkJbmlkX3ZvbCA9IG5pZF92b2xzWzBdW2ldOwotCQkJbmlkX211dGUgPSBuaWRfbXV0ZXNbMF1baV07Ci0JCX0KLQkJaWYgKCFuaWRfdm9sICYmICFuaWRfbXV0ZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChpID09IEFVVE9fU0VRX0NFTkxGRSkgewotCQkJLyogQ2VudGVyL0xGRSAqLwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKLQkJCQkJICAgICAgIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDEsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkJCSAgICAgICJMRkUgUGxheWJhY2sgVm9sdW1lIiwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAyLCAwLAotCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKLQkJCQkJICAgICAgIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9tdXRlLAotCQkJCQkJCQkgIDEsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAotCQkJCQkgICAgICAiTEZFIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX211dGUsCi0JCQkJCQkJCSAgMiwgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgaWYgKGkgPT0gQVVUT19TRVFfRlJPTlQpIHsKLQkJCS8qIGFkZCBjb250cm9sIHRvIG1peGVyIGluZGV4IDAgKi8KLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkJCSAgICAgICJNYXN0ZXIgRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE2LCAzLCAwLAotCQkJCQkJCQkgIEhEQV9JTlBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAotCQkJCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNiwgMywgMCwKLQkJCQkJCQkJICBIREFfSU5QVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0KLQkJCS8qIEZyb250ICovCi0JCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAzLCAwLAotCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBjaG5hbWVbaV0pOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsIG5hbWUsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX211dGUsCi0JCQkJCQkJCSAgMywgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgewotCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwKLQkJCQkJCQkJICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9tdXRlLAotCQkJCQkJCQkgIDMsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZ0MTcwOFNfYXV0b19jcmVhdGVfaHBfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW4pCi17Ci0JaW50IGVycjsKLQotCWlmICghcGluKQotCQlyZXR1cm4gMDsKLQotCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IFZUMTcwOFNfSFBfTklEOyAvKiBBT1czICovCi0Jc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZV9pbmRleCA9IDE7Ci0KLQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAotCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAotCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDI1LCAzLCAwLCBIREFfT1VUUFVUKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKLQkJCSAgICAgICJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKLQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfT1VUUFVUKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQljcmVhdGVfaHBfaW11eChzcGVjKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLwotc3RhdGljIGludCB2dDE3MDhTX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgcGluX2lkeHNbXSA9IHsgMHgxZiwgMHgxYSwgMHgxYiwgMHgxZSwgMCwgMHhmZiB9OwotCXJldHVybiB2dF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3Rscyhjb2RlYywgY2ZnLCAweDE2LCBwaW5faWR4cywKLQkJCQkJCUFSUkFZX1NJWkUocGluX2lkeHMpKTsKLX0KLQogLyogZmlsbCBvdXQgZGlnaXRhbCBvdXRwdXQgd2lkZ2V0czsgb25lIGZvciBtYXN0ZXIgYW5kIG9uZSBmb3Igc2xhdmUgb3V0cHV0cyAqLwogc3RhdGljIHZvaWQgZmlsbF9kaWdfb3V0cyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKQEAgLTM3NDksNTYgKzMwMTAsMzMgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgdnQxNzA4U19wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3N0YXRpYyB2b2lkIGZpbGxfZGlnX2luKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBlcnI7CisJaGRhX25pZF90IGRpZ19uaWQ7CisJaW50IGksIGVycjsKIAotCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLCBOVUxMKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2dDE3MDhTX2F1dG9fZmlsbF9kYWNfbmlkcyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JaWYgKCFzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cyAmJiAhc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKQotCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KKwlpZiAoIXNwZWMtPmF1dG9jZmcuZGlnX2luX3BpbikKKwkJcmV0dXJuOwogCi0JZXJyID0gdnQxNzA4U19hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3Rscyhjb2RlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHZ0MTcwOFNfYXV0b19jcmVhdGVfaHBfY3RscyhzcGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHZ0MTcwOFNfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoY29kZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzICogMjsKLQotCWZpbGxfZGlnX291dHMoY29kZWMpOwotCi0JaWYgKHNwZWMtPmtjdGxzLmxpc3QpCi0JCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gc3BlYy0+a2N0bHMubGlzdDsKLQotCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07Ci0KLQlpZiAoc3BlYy0+aHBfbXV4KQotCQl2aWFfaHBfYnVpbGQoY29kZWMpOwotCi0JdmlhX3NtYXJ0NTFfYnVpbGQoc3BlYyk7Ci0JcmV0dXJuIDE7CisJZGlnX25pZCA9IGNvZGVjLT5zdGFydF9uaWQ7CisJZm9yIChpID0gMDsgaSA8IGNvZGVjLT5udW1fbm9kZXM7IGkrKywgZGlnX25pZCsrKSB7CisJCXVuc2lnbmVkIGludCB3Y2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgZGlnX25pZCk7CisJCWlmIChnZXRfd2NhcHNfdHlwZSh3Y2FwcykgIT0gQUNfV0lEX0FVRF9JTikKKwkJCWNvbnRpbnVlOworCQlpZiAoISh3Y2FwcyAmIEFDX1dDQVBfRElHSVRBTCkpCisJCQljb250aW51ZTsKKwkJaWYgKCEod2NhcHMgJiBBQ19XQ0FQX0NPTk5fTElTVCkpCisJCQljb250aW51ZTsKKwkJZXJyID0gZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIGRpZ19uaWQsCisJCQkJCSAgIHNwZWMtPmF1dG9jZmcuZGlnX2luX3Bpbik7CisJCWlmIChlcnIgPj0gMCkgeworCQkJc3BlYy0+ZGlnX2luX25pZCA9IGRpZ19uaWQ7CisJCQlicmVhazsKKwkJfQorCX0KIH0KIAotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2FtcF9saXN0IHZ0MTcwOFNfbG9vcGJhY2tzW10gPSB7Ci0JeyAweDE2LCBIREFfSU5QVVQsIDEgfSwKLQl7IDB4MTYsIEhEQV9JTlBVVCwgMiB9LAotCXsgMHgxNiwgSERBX0lOUFVULCAzIH0sCi0JeyAweDE2LCBIREFfSU5QVVQsIDQgfSwKLQl7IH0gLyogZW5kICovCi19OwotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIG92ZXJyaWRlX21pY19ib29zdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbiwKIAkJCSAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbnVtX3N0ZXBzLCBpbnQgc3RlcF9zaXplKQogewpAQCAtMzgxOSw2MiArMzA1NywyMSBAQAogCWlmIChzcGVjID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJc3BlYy0+YWFfbWl4X25pZCA9IDB4MTY7CisJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDFhLCAwLCAzLCA0MCk7CisJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDFlLCAwLCAzLCA0MCk7CisKIAkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQllcnIgPSB2dDE3MDhTX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwllcnIgPSB2aWFfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmIChlcnIgPCAwKSB7CiAJCXZpYV9mcmVlKGNvZGVjKTsKIAkJcmV0dXJuIGVycjsKLQl9IGVsc2UgaWYgKCFlcnIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGdlbmVuaWMgbW9kZS4uLlxuIik7CiAJfQogCi0Jc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQxNzA4U192b2x1bWVfaW5pdF92ZXJiczsKLQlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDExMDY0Mzk3KQotCQlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPQotCQkJdnQxNzA1X3VuaXdpbGxfaW5pdF92ZXJiczsKLQllbHNlCi0JCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9Ci0JCQl2dDE3MDhTX3VuaXdpbGxfaW5pdF92ZXJiczsKLQotCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjA0NDApCi0JCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJWVDE4MThTIEFuYWxvZyI7Ci0JZWxzZSBpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDExMDY0Mzk3KQotCQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxNzA1IEFuYWxvZyI7Ci0JZWxzZQotCQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxNzA4UyBBbmFsb2ciOwotCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjQzOTcpCi0JCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmdnQxNzA1X3BjbV9hbmFsb2dfcGxheWJhY2s7Ci0JZWxzZQotCQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJnZ0MTcwOFNfcGNtX2FuYWxvZ19wbGF5YmFjazsKLQlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmdnQxNzA4U19wY21fYW5hbG9nX2NhcHR1cmU7Ci0KLQlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDExMDYwNDQwKQotCQlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIlZUMTgxOFMgRGlnaXRhbCI7Ci0JZWxzZSBpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDExMDY0Mzk3KQotCQlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIlZUMTcwNSBEaWdpdGFsIjsKLQllbHNlCi0JCXNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwgPSAiVlQxNzA4UyBEaWdpdGFsIjsKLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZ2dDE3MDhTX3BjbV9kaWdpdGFsX3BsYXliYWNrOwotCi0JaWYgKCFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKLQkJc3BlYy0+YWRjX25pZHMgPSB2dDE3MDhTX2FkY19uaWRzOwotCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKHZ0MTcwOFNfYWRjX25pZHMpOwotCQlnZXRfbXV4X25pZHMoY29kZWMpOwotCQlvdmVycmlkZV9taWNfYm9vc3QoY29kZWMsIDB4MWEsIDAsIDMsIDQwKTsKLQkJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDFlLCAwLCAzLCA0MCk7Ci0JCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9IHZ0MTcwOFNfY2FwdHVyZV9taXhlcjsKLQkJc3BlYy0+bnVtX21peGVycysrOwotCX0KKwlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDhTX2luaXRfdmVyYnM7CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKIAotCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IHZpYV9hdXRvX2luaXQ7Ci0JY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IHZpYV91bnNvbF9ldmVudDsKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi0Jc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IHZ0MTcwOFNfbG9vcGJhY2tzOwotI2VuZGlmCi0KIAkvKiBjb3JyZWN0IG5hbWVzIGZvciBWVDE3MDhCQ0UgKi8KIAlpZiAoZ2V0X2NvZGVjX3R5cGUoY29kZWMpID09IFZUMTcwOEJDRSkJewogCQlrZnJlZShjb2RlYy0+Y2hpcF9uYW1lKTsKQEAgLTM4ODIsMTMgKzMwNzksNiBAQAogCQlzbnByaW50Zihjb2RlYy0+YnVzLT5jYXJkLT5taXhlcm5hbWUsCiAJCQkgc2l6ZW9mKGNvZGVjLT5idXMtPmNhcmQtPm1peGVybmFtZSksCiAJCQkgIiVzICVzIiwgY29kZWMtPnZlbmRvcl9uYW1lLCBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nID0gIlZUMTcwOEJDRSBBbmFsb2ciOwotCQlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIlZUMTcwOEJDRSBEaWdpdGFsIjsKLQl9Ci0JLyogY29ycmVjdCBuYW1lcyBmb3IgVlQxODE4UyAqLwotCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjA0NDApIHsKLQkJc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nID0gIlZUMTgxOFMgQW5hbG9nIjsKLQkJc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJWVDE4MThTIERpZ2l0YWwiOwogCX0KIAkvKiBjb3JyZWN0IG5hbWVzIGZvciBWVDE3MDUgKi8KIAlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDExMDY0Mzk3KQl7CkBAIC0zOTA0LDU1ICszMDk0LDcgQEAKIAogLyogUGF0Y2ggZm9yIFZUMTcwMiAqLwogCi0vKiBjYXB0dXJlIG1peGVyIGVsZW1lbnRzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdnQxNzAyX2NhcHR1cmVfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MTIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDEyLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMSwgMHgyMCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAxLCAweDIwLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRGlnaXRhbCBNaWMgQ2FwdHVyZSBWb2x1bWUiLCAweDFGLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkRpZ2l0YWwgTWljIENhcHR1cmUgU3dpdGNoIiwgMHgxRiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkRpZ2l0YWwgTWljIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgMHgxRSwgMHgwLAotCQkJIEhEQV9JTlBVVCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLyogVGhlIG11bHRpcGxlICJDYXB0dXJlIFNvdXJjZSIgY29udHJvbHMgY29uZnVzZSBhbHNhbWl4ZXIKLQkJICogU28gY2FsbCBzb21ld2hhdCBkaWZmZXJlbnQuLgotCQkgKi8KLQkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLwotCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAotCQkuY291bnQgPSAxLAotCQkuaW5mbyA9IHZpYV9tdXhfZW51bV9pbmZvLAotCQkuZ2V0ID0gdmlhX211eF9lbnVtX2dldCwKLQkJLnB1dCA9IHZpYV9tdXhfZW51bV9wdXQsCi0JfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHZ0MTcwMl92b2x1bWVfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAtMSBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDEyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxRiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MjAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0KLQkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZSBhbmFsb2ctbG9vcGJhY2sKLQkgKiBtaXhlciB3aWRnZXQKLQkgKi8KLQkvKiBBbXAgSW5kaWNlczogTWljMSA9IDEsIExpbmUgPSAxLCBNaWMyID0gMyAqLwotCXsweDFBLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxQSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MUEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDFBLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKLQl7MHgxQSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCi0JLyogU2V0dXAgZGVmYXVsdCBpbnB1dCBvZiBQVzQgdG8gTVcwICovCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDF9LAotCS8qIFBXNiBQVzcgT3V0cHV0IGVuYWJsZSAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAotCXsweDFDLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2dDE3MDJfaW5pdF92ZXJic1tdID0gewogCS8qIG1peGVyIGVuYWJsZSAqLwogCXsweDEsIDB4Rjg4LCAweDN9LAogCS8qIEdQSU8gMH4yICovCkBAIC0zOTYwLDIwMiArMzEwMiw2IEBACiAJeyB9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHZ0MTcwMl91bml3aWxsX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNywgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAotCSBBQ19VU1JTUF9FTiB8IFZJQV9IUF9FVkVOVCB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzAyX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAyLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS5uaWQgPSAweDEwLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9wbGF5YmFja19wY21fb3BlbiwKLQkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbGVhbnVwLAotCQkuY2xvc2UgPSB2aWFfcGNtX29wZW5fY2xvc2UKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDJfcGNtX2FuYWxvZ19jYXB0dXJlID0gewotCS5zdWJzdHJlYW1zID0gMywKLQkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkubmlkID0gMHgxMiwgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCi0JLm9wcyA9IHsKLQkJLm9wZW4gPSB2aWFfcGNtX29wZW5fY2xvc2UsCi0JCS5wcmVwYXJlID0gdmlhX2NhcHR1cmVfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX2NhcHR1cmVfcGNtX2NsZWFudXAsCi0JCS5jbG9zZSA9IHZpYV9wY21fb3Blbl9jbG9zZQotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwMl9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKLQkuc3Vic3RyZWFtcyA9IDIsCi0JLmNoYW5uZWxzX21pbiA9IDIsCi0JLmNoYW5uZWxzX21heCA9IDIsCi0JLyogTklEIGlzIHNldCBpbiB2aWFfYnVpbGRfcGNtcyAqLwotCS5vcHMgPSB7Ci0JCS5vcGVuID0gdmlhX2RpZ19wbGF5YmFja19wY21fb3BlbiwKLQkJLmNsb3NlID0gdmlhX2RpZ19wbGF5YmFja19wY21fY2xvc2UsCi0JCS5wcmVwYXJlID0gdmlhX2RpZ19wbGF5YmFja19wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfZGlnX3BsYXliYWNrX3BjbV9jbGVhbnVwCi0JfSwKLX07Ci0KLS8qIGZpbGwgaW4gdGhlIGRhY19uaWRzIHRhYmxlIGZyb20gdGhlIHBhcnNlZCBwaW4gY29uZmlndXJhdGlvbiAqLwotc3RhdGljIGludCB2dDE3MDJfYXV0b19maWxsX2RhY19uaWRzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDE7Ci0Jc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5wcml2YXRlX2RhY19uaWRzOwotCi0JaWYgKGNmZy0+bGluZV9vdXRfcGluc1swXSkgewotCQkvKiBjb25maWcgZGFjIGxpc3QgKi8KLQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1swXSA9IDB4MTA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmcm9tIHRoZSBwYXJzZWQgREFDIHRhYmxlICovCi1zdGF0aWMgaW50IHZ0MTcwMl9hdXRvX2NyZWF0ZV9saW5lX291dF9jdGxzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKLQkJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCi17Ci0JaW50IGVycjsKLQotCWlmICghY2ZnLT5saW5lX291dF9waW5zWzBdKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBhZGQgY29udHJvbCB0byBtaXhlciBpbmRleCAwICovCi0JZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKLQkJCSAgICAgICJNYXN0ZXIgRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwKLQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxQSwgMywgMCwgSERBX0lOUFVUKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCi0JCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFN3aXRjaCIsCi0JCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MUEsIDMsIDAsIEhEQV9JTlBVVCkpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JLyogRnJvbnQgKi8KLQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAotCQkJICAgICAgIkZyb250IFBsYXliYWNrIFZvbHVtZSIsCi0JCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTAsIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKLQkJCSAgICAgICJGcm9udCBQbGF5YmFjayBTd2l0Y2giLAotCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE2LCAzLCAwLCBIREFfT1VUUFVUKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2dDE3MDJfYXV0b19jcmVhdGVfaHBfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW4pCi17Ci0JaW50IGVyciwgaTsKLQlzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eDsKLQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRzW10gPSB7ICJPTiIsICJPRkYiLCBOVUxMfTsKLQlpZiAoIXBpbikKLQkJcmV0dXJuIDA7Ci0Jc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gMHgxRDsKLQlzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlX2luZGV4ID0gMDsKLQotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkgICAgICAiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MUQsIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAotCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLAotCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWltdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzFdOwotCi0JLyogZm9yIGhwIG1vZGUgc2VsZWN0ICovCi0JZm9yIChpID0gMDsgdGV4dHNbaV07IGkrKykKLQkJc25kX2hkYV9hZGRfaW11eF9pdGVtKGltdXgsIHRleHRzW2ldLCBpLCBOVUxMKTsKLQotCXNwZWMtPmhwX211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMV07Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGNyZWF0ZSBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciBpbnB1dCBwaW5zICovCi1zdGF0aWMgaW50IHZ0MTcwMl9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkJCWNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQlzdGF0aWMgY29uc3QgaGRhX25pZF90IHBpbl9pZHhzW10gPSB7IDB4MTQsIDB4MTUsIDB4MTgsIDB4ZmYgfTsKLQlyZXR1cm4gdnRfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoY29kZWMsIGNmZywgMHgxYSwgcGluX2lkeHMsCi0JCQkJCQlBUlJBWV9TSVpFKHBpbl9pZHhzKSk7Ci19Ci0KLXN0YXRpYyBpbnQgdnQxNzAyX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBlcnI7Ci0KLQllcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywgTlVMTCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gdnQxNzAyX2F1dG9fZmlsbF9kYWNfbmlkcyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JaWYgKCFzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cyAmJiAhc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKQotCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KLQotCWVyciA9IHZ0MTcwMl9hdXRvX2NyZWF0ZV9saW5lX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2dDE3MDJfYXV0b19jcmVhdGVfaHBfY3RscyhzcGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCS8qIGxpbWl0IEFBIHBhdGggdm9sdW1lIHRvIDAgZEIgKi8KLQlzbmRfaGRhX292ZXJyaWRlX2FtcF9jYXBzKGNvZGVjLCAweDFBLCBIREFfSU5QVVQsCi0JCQkJICAoMHgxNyA8PCBBQ19BTVBDQVBfT0ZGU0VUX1NISUZUKSB8Ci0JCQkJICAoMHgxNyA8PCBBQ19BTVBDQVBfTlVNX1NURVBTX1NISUZUKSB8Ci0JCQkJICAoMHg1IDw8IEFDX0FNUENBUF9TVEVQX1NJWkVfU0hJRlQpIHwKLQkJCQkgICgxIDw8IEFDX0FNUENBUF9NVVRFX1NISUZUKSk7Ci0JZXJyID0gdnQxNzAyX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7Ci0KLQlmaWxsX2RpZ19vdXRzKGNvZGVjKTsKLQotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxzLmxpc3Q7Ci0KLQlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOwotCi0JaWYgKHNwZWMtPmhwX211eCkKLQkJdmlhX2hwX2J1aWxkKGNvZGVjKTsKLQotCXJldHVybiAxOwotfQotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYW1wX2xpc3QgdnQxNzAyX2xvb3BiYWNrc1tdID0gewotCXsgMHgxQSwgSERBX0lOUFVULCAxIH0sCi0JeyAweDFBLCBIREFfSU5QVVQsIDIgfSwKLQl7IDB4MUEsIEhEQV9JTlBVVCwgMyB9LAotCXsgMHgxQSwgSERBX0lOUFVULCA0IH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBzZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZV92dDE3MDIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJaW50IGltdXhfaXNfc21peGVyID0KQEAgLTQxOTcsMzg1ICszMTQzLDQxIEBACiAJaWYgKHNwZWMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlzcGVjLT5hYV9taXhfbmlkID0gMHgxYTsKKworCS8qIGxpbWl0IEFBIHBhdGggdm9sdW1lIHRvIDAgZEIgKi8KKwlzbmRfaGRhX292ZXJyaWRlX2FtcF9jYXBzKGNvZGVjLCAweDFBLCBIREFfSU5QVVQsCisJCQkJICAoMHgxNyA8PCBBQ19BTVBDQVBfT0ZGU0VUX1NISUZUKSB8CisJCQkJICAoMHgxNyA8PCBBQ19BTVBDQVBfTlVNX1NURVBTX1NISUZUKSB8CisJCQkJICAoMHg1IDw8IEFDX0FNUENBUF9TVEVQX1NJWkVfU0hJRlQpIHwKKwkJCQkgICgxIDw8IEFDX0FNUENBUF9NVVRFX1NISUZUKSk7CisKIAkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQllcnIgPSB2dDE3MDJfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOworCWVyciA9IHZpYV9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CiAJaWYgKGVyciA8IDApIHsKIAkJdmlhX2ZyZWUoY29kZWMpOwogCQlyZXR1cm4gZXJyOwotCX0gZWxzZSBpZiAoIWVycikgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCi0JCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgZ2VuZW5pYyBtb2RlLi4uXG4iKTsKIAl9CiAKLQlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDJfdm9sdW1lX2luaXRfdmVyYnM7Ci0Jc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQxNzAyX3VuaXdpbGxfaW5pdF92ZXJiczsKLQotCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJWVDE3MDIgQW5hbG9nIjsKLQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJnZ0MTcwMl9wY21fYW5hbG9nX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2dDE3MDJfcGNtX2FuYWxvZ19jYXB0dXJlOwotCi0Jc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJWVDE3MDIgRGlnaXRhbCI7Ci0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmdnQxNzAyX3BjbV9kaWdpdGFsX3BsYXliYWNrOwotCi0JaWYgKCFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKLQkJc3BlYy0+YWRjX25pZHMgPSB2dDE3MDJfYWRjX25pZHM7Ci0JCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUodnQxNzAyX2FkY19uaWRzKTsKLQkJZ2V0X211eF9uaWRzKGNvZGVjKTsKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gdnQxNzAyX2NhcHR1cmVfbWl4ZXI7Ci0JCXNwZWMtPm51bV9taXhlcnMrKzsKLQl9CisJc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQxNzAyX2luaXRfdmVyYnM7CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKIAotCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IHZpYV9hdXRvX2luaXQ7Ci0JY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IHZpYV91bnNvbF9ldmVudDsKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi0Jc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IHZ0MTcwMl9sb29wYmFja3M7Ci0jZW5kaWYKLQogCXNwZWMtPnNldF93aWRnZXRzX3Bvd2VyX3N0YXRlID0gIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTcwMjsKIAlyZXR1cm4gMDsKIH0KIAogLyogUGF0Y2ggZm9yIFZUMTcxOFMgKi8KIAotLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZ0MTcxOFNfY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxMCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTAsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDExLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MTEsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgQ2FwdHVyZSBWb2x1bWUiLCAweDJiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgMHgyOSwgMHgwLAotCQkJIEhEQV9JTlBVVCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLyogVGhlIG11bHRpcGxlICJDYXB0dXJlIFNvdXJjZSIgY29udHJvbHMgY29uZnVzZSBhbHNhbWl4ZXIKLQkJICogU28gY2FsbCBzb21ld2hhdCBkaWZmZXJlbnQuLgotCQkgKi8KLQkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKLQkJLmNvdW50ID0gMiwKLQkJLmluZm8gPSB2aWFfbXV4X2VudW1faW5mbywKLQkJLmdldCA9IHZpYV9tdXhfZW51bV9nZXQsCi0JCS5wdXQgPSB2aWFfbXV4X2VudW1fcHV0LAotCX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2dDE3MThTX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0xIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDExLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQorc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2dDE3MThTX2luaXRfdmVyYnNbXSA9IHsKIAkvKiBFbmFibGUgTVcwIGFkanVzdCBHYWluIDUgKi8KIAl7MHgxLCAweGZiMiwgMHgxMH0sCi0JLyogTXV0ZSBpbnB1dCBhbXBzIChDRCwgTGluZSBJbiwgTWljIDEgJiBNaWMgMikgb2YgdGhlIGFuYWxvZy1sb29wYmFjawotCSAqIG1peGVyIHdpZGdldAotCSAqLwotCS8qIEFtcCBJbmRpY2VzOiBDRCA9IDEsIE1pYzEgPSAyLCBMaW5lID0gMywgTWljMiA9IDQgKi8KLQl7MHgyMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDUpfSwKLQotCS8qIFNldHVwIGRlZmF1bHQgaW5wdXQgb2YgRnJvbnQgSFAgdG8gTVc5ICovCi0JezB4MjgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDF9LAotCS8qIFBXOSBQVzEwIE91dHB1dCBlbmFibGUgKi8KLQl7MHgyZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBBQ19QSU5DVExfT1VUX0VOfSwKLQl7MHgyZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBBQ19QSU5DVExfT1VUX0VOfSwKLQkvKiBQVzExIElucHV0IGVuYWJsZSAqLwotCXsweDJmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIEFDX1BJTkNUTF9JTl9FTn0sCiAJLyogRW5hYmxlIEJvb3N0IFZvbHVtZSBiYWNrZG9vciAqLwogCXsweDEsIDB4Zjg4LCAweDh9LAotCS8qIE1XMC8xLzIvMy80OiB1bi1tdXRlIGluZGV4IDAgKEFPV3gpLCBtdXRlIGluZGV4IDEgKE1XOSkgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JLyogc2V0IE1VWDEgPSAyIChBT1c0KSwgTVVYMiA9IDEgKEFPVzMpICovCi0JezB4MzQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDJ9LAotCXsweDM1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgxfSwKLQkvKiBVbm11dGUgTVc0J3MgaW5kZXggMCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwogCXsgfQogfTsKIAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHZ0MTcxOFNfdW5pd2lsbF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MjgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwKLQkgQUNfVVNSU1BfRU4gfCBWSUFfSFBfRVZFTlQgfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MjUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MjYsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MjcsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MjksIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MmEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JezB4MmIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcxOFNfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKLQkuc3Vic3RyZWFtcyA9IDIsCi0JLmNoYW5uZWxzX21pbiA9IDIsCi0JLmNoYW5uZWxzX21heCA9IDEwLAotCS5uaWQgPSAweDgsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLwotCS5vcHMgPSB7Ci0JCS5vcGVuID0gdmlhX3BsYXliYWNrX3BjbV9vcGVuLAotCQkucHJlcGFyZSA9IHZpYV9wbGF5YmFja19tdWx0aV9wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX2NsZWFudXAsCi0JCS5jbG9zZSA9IHZpYV9wY21fb3Blbl9jbG9zZSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MThTX3BjbV9hbmFsb2dfY2FwdHVyZSA9IHsKLQkuc3Vic3RyZWFtcyA9IDIsCi0JLmNoYW5uZWxzX21pbiA9IDIsCi0JLmNoYW5uZWxzX21heCA9IDIsCi0JLm5pZCA9IDB4MTAsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLwotCS5vcHMgPSB7Ci0JCS5vcGVuID0gdmlhX3BjbV9vcGVuX2Nsb3NlLAotCQkucHJlcGFyZSA9IHZpYV9jYXB0dXJlX3BjbV9wcmVwYXJlLAotCQkuY2xlYW51cCA9IHZpYV9jYXB0dXJlX3BjbV9jbGVhbnVwLAotCQkuY2xvc2UgPSB2aWFfcGNtX29wZW5fY2xvc2UsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzE4U19wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKLQkuc3Vic3RyZWFtcyA9IDIsCi0JLmNoYW5uZWxzX21pbiA9IDIsCi0JLmNoYW5uZWxzX21heCA9IDIsCi0JLyogTklEIGlzIHNldCBpbiB2aWFfYnVpbGRfcGNtcyAqLwotCS5vcHMgPSB7Ci0JCS5vcGVuID0gdmlhX2RpZ19wbGF5YmFja19wY21fb3BlbiwKLQkJLmNsb3NlID0gdmlhX2RpZ19wbGF5YmFja19wY21fY2xvc2UsCi0JCS5wcmVwYXJlID0gdmlhX2RpZ19wbGF5YmFja19wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfZGlnX3BsYXliYWNrX3BjbV9jbGVhbnVwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzE4U19wY21fZGlnaXRhbF9jYXB0dXJlID0gewotCS5zdWJzdHJlYW1zID0gMSwKLQkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gMiwKLX07Ci0KLS8qIGZpbGwgaW4gdGhlIGRhY19uaWRzIHRhYmxlIGZyb20gdGhlIHBhcnNlZCBwaW4gY29uZmlndXJhdGlvbiAqLwotc3RhdGljIGludCB2dDE3MThTX2F1dG9fZmlsbF9kYWNfbmlkcyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCi17Ci0JaW50IGk7Ci0JaGRhX25pZF90IG5pZDsKLQotCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gY2ZnLT5saW5lX291dHM7Ci0KLQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPnByaXZhdGVfZGFjX25pZHM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKLQkJaWYgKG5pZCkgewotCQkJLyogY29uZmlnIGRhYyBsaXN0ICovCi0JCQlzd2l0Y2ggKGkpIHsKLQkJCWNhc2UgQVVUT19TRVFfRlJPTlQ6Ci0JCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IDB4ODsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVUT19TRVFfQ0VOTEZFOgotCQkJCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbaV0gPSAweGE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVVE9fU0VRX1NVUlJPVU5EOgotCQkJCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbaV0gPSAweDk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVVE9fU0VRX1NJREU6Ci0JCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IDB4YjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZnJvbSB0aGUgcGFyc2VkIERBQyB0YWJsZSAqLwotc3RhdGljIGludCB2dDE3MThTX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKLQkJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCi17Ci0JY2hhciBuYW1lWzMyXTsKLQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNobmFtZVs0XSA9IHsKLQkJIkZyb250IiwgIlN1cnJvdW5kIiwgIkMvTEZFIiwgIlNpZGUiCi0JfTsKLQloZGFfbmlkX3QgbmlkX3ZvbHNbXSA9IHsweDgsIDB4OSwgMHhhLCAweGJ9OwotCWhkYV9uaWRfdCBuaWRfbXV0ZXNbXSA9IHsweDI0LCAweDI1LCAweDI2LCAweDI3fTsKLQloZGFfbmlkX3QgbmlkLCBuaWRfdm9sLCBuaWRfbXV0ZSA9IDA7Ci0JaW50IGksIGVycjsKLQotCWZvciAoaSA9IDA7IGkgPD0gQVVUT19TRVFfU0lERTsgaSsrKSB7Ci0JCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKLQotCQlpZiAoIW5pZCkKLQkJCWNvbnRpbnVlOwotCQluaWRfdm9sID0gbmlkX3ZvbHNbaV07Ci0JCW5pZF9tdXRlID0gbmlkX211dGVzW2ldOwotCi0JCWlmIChpID09IEFVVE9fU0VRX0NFTkxGRSkgewotCQkJLyogQ2VudGVyL0xGRSAqLwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKLQkJCQkJICAgICAgIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLAotCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDEsIDAsCi0JCQkJCQkJCSAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkJCSAgICAgICJMRkUgUGxheWJhY2sgVm9sdW1lIiwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAyLCAwLAotCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woCi0JCQkJc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKLQkJCQkiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfbXV0ZSwgMSwgMCwKLQkJCQkJCSAgICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKAotCQkJCXNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCi0JCQkJIkxGRSBQbGF5YmFjayBTd2l0Y2giLAotCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX211dGUsIDIsIDAsCi0JCQkJCQkgICAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIGlmIChpID09IEFVVE9fU0VRX0ZST05UKSB7Ci0JCQkvKiBGcm9udCAqLwotCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbCgKLQkJCQlzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCi0JCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAzLCAwLCBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbCgKLQkJCQlzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAotCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX211dGUsIDMsIDAsCi0JCQkJCQkgICAgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIHsKLQkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIGNobmFtZVtpXSk7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woCi0JCQkJc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLCBuYW1lLAotCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGNobmFtZVtpXSk7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woCi0JCQkJc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKLQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9tdXRlLCAzLCAwLAotCQkJCQkJICAgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdnQxNzE4U19hdXRvX2NyZWF0ZV9ocF9jdGxzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywgaGRhX25pZF90IHBpbikKLXsKLQlpbnQgZXJyOwotCi0JaWYgKCFwaW4pCi0JCXJldHVybiAwOwotCi0Jc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gMHhjOyAvKiBBT1c0ICovCi0Jc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZV9pbmRleCA9IDE7Ci0KLQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAotCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAotCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweGMsIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAotCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLAotCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWNyZWF0ZV9ocF9pbXV4KHNwZWMpOwotCXJldHVybiAwOwotfQotCi0vKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLwotc3RhdGljIGludCB2dDE3MThTX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgcGluX2lkeHNbXSA9IHsgMHgyYywgMHgyYiwgMHgyYSwgMHgyOSwgMCwgMHhmZiB9OwotCXJldHVybiB2dF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3Rscyhjb2RlYywgY2ZnLCAweDIxLCBwaW5faWR4cywKLQkJCQkJCUFSUkFZX1NJWkUocGluX2lkeHMpKTsKLX0KLQotc3RhdGljIGludCB2dDE3MThTX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBlcnI7Ci0KLQllcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywgTlVMTCk7Ci0KLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2dDE3MThTX2F1dG9fZmlsbF9kYWNfbmlkcyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JaWYgKCFzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cyAmJiAhc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKQotCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KLQotCWVyciA9IHZ0MTcxOFNfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHZ0MTcxOFNfYXV0b19jcmVhdGVfaHBfY3RscyhzcGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHZ0MTcxOFNfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoY29kZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzICogMjsKLQotCWZpbGxfZGlnX291dHMoY29kZWMpOwotCi0JaWYgKHNwZWMtPmF1dG9jZmcuZGlnX2luX3BpbiAmJiBjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjA0MjgpCi0JCXNwZWMtPmRpZ19pbl9uaWQgPSAweDEzOwotCi0JaWYgKHNwZWMtPmtjdGxzLmxpc3QpCi0JCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gc3BlYy0+a2N0bHMubGlzdDsKLQotCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07Ci0KLQlpZiAoc3BlYy0+aHBfbXV4KQotCQl2aWFfaHBfYnVpbGQoY29kZWMpOwotCi0JdmlhX3NtYXJ0NTFfYnVpbGQoc3BlYyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2FtcF9saXN0IHZ0MTcxOFNfbG9vcGJhY2tzW10gPSB7Ci0JeyAweDIxLCBIREFfSU5QVVQsIDEgfSwKLQl7IDB4MjEsIEhEQV9JTlBVVCwgMiB9LAotCXsgMHgyMSwgSERBX0lOUFVULCAzIH0sCi0JeyAweDIxLCBIREFfSU5QVVQsIDQgfSwKLQl7IH0gLyogZW5kICovCi19OwotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTcxOFMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CkBAIC00NjQyLDYgKzMyNDQsNDEgQEAKIAl9CiB9CiAKKy8qIEFkZCBhIGNvbm5lY3Rpb24gdG8gdGhlIHByaW1hcnkgREFDIGZyb20gQUEtbWl4ZXIgZm9yIHNvbWUgY29kZWNzCisgKiBUaGlzIGlzbid0IGxpc3RlZCBmcm9tIHRoZSByYXcgaW5mbywgYnV0IHRoZSBjaGlwIGhhcyBhIHNlY3JldCBjb25uZWN0aW9uLgorICovCitzdGF0aWMgaW50IGFkZF9zZWNyZXRfZGFjX3BhdGgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGksIG51bXM7CisJaGRhX25pZF90IGNvbm5bOF07CisJaGRhX25pZF90IG5pZDsKKworCWlmICghc3BlYy0+YWFfbWl4X25pZCkKKwkJcmV0dXJuIDA7CisJbnVtcyA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBzcGVjLT5hYV9taXhfbmlkLCBjb25uLAorCQkJCSAgICAgICBBUlJBWV9TSVpFKGNvbm4pIC0gMSk7CisJZm9yIChpID0gMDsgaSA8IG51bXM7IGkrKykgeworCQlpZiAoZ2V0X3djYXBzX3R5cGUoZ2V0X3djYXBzKGNvZGVjLCBjb25uW2ldKSkgPT0gQUNfV0lEX0FVRF9PVVQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBmaW5kIHRoZSBwcmltYXJ5IERBQyBhbmQgYWRkIHRvIHRoZSBjb25uZWN0aW9uIGxpc3QgKi8KKwluaWQgPSBjb2RlYy0+c3RhcnRfbmlkOworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX25vZGVzOyBpKyssIG5pZCsrKSB7CisJCXVuc2lnbmVkIGludCBjYXBzID0gZ2V0X3djYXBzKGNvZGVjLCBuaWQpOworCQlpZiAoZ2V0X3djYXBzX3R5cGUoY2FwcykgPT0gQUNfV0lEX0FVRF9PVVQgJiYKKwkJICAgICEoY2FwcyAmIEFDX1dDQVBfRElHSVRBTCkpIHsKKwkJCWNvbm5bbnVtcysrXSA9IG5pZDsKKwkJCXJldHVybiBzbmRfaGRhX292ZXJyaWRlX2Nvbm5fbGlzdChjb2RlYywKKwkJCQkJCQkgIHNwZWMtPmFhX21peF9uaWQsCisJCQkJCQkJICBudW1zLCBjb25uKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgaW50IHBhdGNoX3Z0MTcxOFMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHZpYV9zcGVjICpzcGVjOwpAQCAtNDY1Miw1NyArMzI4OSwyMiBAQAogCWlmIChzcGVjID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJc3BlYy0+YWFfbWl4X25pZCA9IDB4MjE7CisJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDJiLCAwLCAzLCA0MCk7CisJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDI5LCAwLCAzLCA0MCk7CisJYWRkX3NlY3JldF9kYWNfcGF0aChjb2RlYyk7CisKIAkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQllcnIgPSB2dDE3MThTX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwllcnIgPSB2aWFfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmIChlcnIgPCAwKSB7CiAJCXZpYV9mcmVlKGNvZGVjKTsKIAkJcmV0dXJuIGVycjsKLQl9IGVsc2UgaWYgKCFlcnIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGdlbmVuaWMgbW9kZS4uLlxuIik7CiAJfQogCi0Jc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQxNzE4U192b2x1bWVfaW5pdF92ZXJiczsKLQlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MThTX3VuaXdpbGxfaW5pdF92ZXJiczsKLQotCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjA0NDEpCi0JCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJWVDIwMjAgQW5hbG9nIjsKLQllbHNlIGlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjQ0NDEpCi0JCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJWVDE4MjhTIEFuYWxvZyI7Ci0JZWxzZQotCQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxNzE4UyBBbmFsb2ciOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmdnQxNzE4U19wY21fYW5hbG9nX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2dDE3MThTX3BjbV9hbmFsb2dfY2FwdHVyZTsKLQotCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjA0NDEpCi0JCXNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwgPSAiVlQyMDIwIERpZ2l0YWwiOwotCWVsc2UgaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMTA2NDQ0MSkKLQkJc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJWVDE4MjhTIERpZ2l0YWwiOwotCWVsc2UKLQkJc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJWVDE3MThTIERpZ2l0YWwiOwotCXNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrID0gJnZ0MTcxOFNfcGNtX2RpZ2l0YWxfcGxheWJhY2s7Ci0JaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMTA2MDQyOCB8fCBjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjA0NDEpCi0JCXNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUgPSAmdnQxNzE4U19wY21fZGlnaXRhbF9jYXB0dXJlOwotCi0JaWYgKCFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKLQkJc3BlYy0+YWRjX25pZHMgPSB2dDE3MThTX2FkY19uaWRzOwotCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKHZ0MTcxOFNfYWRjX25pZHMpOwotCQlnZXRfbXV4X25pZHMoY29kZWMpOwotCQlvdmVycmlkZV9taWNfYm9vc3QoY29kZWMsIDB4MmIsIDAsIDMsIDQwKTsKLQkJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDI5LCAwLCAzLCA0MCk7Ci0JCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9IHZ0MTcxOFNfY2FwdHVyZV9taXhlcjsKLQkJc3BlYy0+bnVtX21peGVycysrOwotCX0KKwlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MThTX2luaXRfdmVyYnM7CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKIAotCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IHZpYV9hdXRvX2luaXQ7Ci0JY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IHZpYV91bnNvbF9ldmVudDsKLQotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLQlzcGVjLT5sb29wYmFjay5hbXBsaXN0ID0gdnQxNzE4U19sb29wYmFja3M7Ci0jZW5kaWYKLQogCXNwZWMtPnNldF93aWRnZXRzX3Bvd2VyX3N0YXRlID0gIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTcxOFM7CiAKIAlyZXR1cm4gMDsKQEAgLTQ3NDgsMjYgKzMzNTAsNiBAQAogCXJldHVybiAxOwogfQogCi0vKiBjYXB0dXJlIG1peGVyIGVsZW1lbnRzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdnQxNzE2U19jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDEzLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxMywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDEsIDB4MTQsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMSwgMHgxNCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIDB4MUEsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgQ2FwdHVyZSBWb2x1bWUiLCAweDFFLCAweDAsCi0JCQkgSERBX0lOUFVUKSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAotCQkuY291bnQgPSAxLAotCQkuaW5mbyA9IHZpYV9tdXhfZW51bV9pbmZvLAotCQkuZ2V0ID0gdmlhX211eF9lbnVtX2dldCwKLQkJLnB1dCA9IHZpYV9tdXhfZW51bV9wdXQsCi0JfSwKLQl7IH0gLyogZW5kICovCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdnQxNzE2c19kbWljX21peGVyW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiRGlnaXRhbCBNaWMgQ2FwdHVyZSBWb2x1bWUiLCAweDIyLCAweDAsIEhEQV9JTlBVVCksCiAJewpAQCAtNDc4OSw0NSArMzM3MSw3IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2dDE3MTZTX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0xIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MTMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQotCi0JLyogTXV0ZSBpbnB1dCBhbXBzIChDRCwgTGluZSBJbiwgTWljIDEgJiBNaWMgMikgb2YgdGhlIGFuYWxvZy1sb29wYmFjawotCSAqIG1peGVyIHdpZGdldAotCSAqLwotCS8qIEFtcCBJbmRpY2VzOiBDRCA9IDEsIE1pYzEgPSAyLCBMaW5lID0gMywgTWljMiA9IDQgKi8KLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0KLQkvKiBNVVggSW5kaWNlczogU3RlcmVvIE1peGVyID0gNSAqLwotCXsweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHg1fSwKLQotCS8qIFNldHVwIGRlZmF1bHQgaW5wdXQgb2YgUFc0IHRvIE1XMCAqLwotCXsweDFkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKLQotCS8qIFNldHVwIGRlZmF1bHQgaW5wdXQgb2YgU1cxIGFzIE1XMCAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgxfSwKLQotCS8qIFNldHVwIGRlZmF1bHQgaW5wdXQgb2YgU1c0IGFzIEFPVzAgKi8KLQl7MHgyOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MX0sCi0KLQkvKiBQVzkgUFcxMCBPdXRwdXQgZW5hYmxlICovCi0JezB4MjAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCi0KLQkvKiBVbm11dGUgU1cxLCBQVzEyICovCi0JezB4MjksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDJhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogUFcxMiBPdXRwdXQgZW5hYmxlICovCi0JezB4MmEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHZ0MTcxNlNfaW5pdF92ZXJic1tdID0gewogCS8qIEVuYWJsZSBCb29zdCBWb2x1bWUgYmFja2Rvb3IgKi8KIAl7MHgxLCAweGY4YSwgMHg4MH0sCiAJLyogZG9uJ3QgYnliYXNzIG1peGVyICovCkBAIC00ODM3LDI3MiArMzM4MSw2IEBACiAJeyB9CiB9OwogCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgdnQxNzE2U191bml3aWxsX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxZCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAotCSBBQ19VU1JTUF9FTiB8IFZJQV9IUF9FVkVOVCB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAotCSBBQ19VU1JTUF9FTiB8IFZJQV9NT05PX0VWRU5UIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsweDFlLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MTZTX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAyLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSA2LAotCS5uaWQgPSAweDEwLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9wbGF5YmFja19wY21fb3BlbiwKLQkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbGVhbnVwLAotCQkuY2xvc2UgPSB2aWFfcGNtX29wZW5fY2xvc2UsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzE2U19wY21fYW5hbG9nX2NhcHR1cmUgPSB7Ci0JLnN1YnN0cmVhbXMgPSAyLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS5uaWQgPSAweDEzLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9wY21fb3Blbl9jbG9zZSwKLQkJLnByZXBhcmUgPSB2aWFfY2FwdHVyZV9wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfY2FwdHVyZV9wY21fY2xlYW51cCwKLQkJLmNsb3NlID0gdmlhX3BjbV9vcGVuX2Nsb3NlLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcxNlNfcGNtX2RpZ2l0YWxfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAyLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS8qIE5JRCBpcyBzZXQgaW4gdmlhX2J1aWxkX3BjbXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX29wZW4sCi0JCS5jbG9zZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlLAotCQkucHJlcGFyZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX2RpZ19wbGF5YmFja19wY21fY2xlYW51cAotCX0sCi19OwotCi0vKiBmaWxsIGluIHRoZSBkYWNfbmlkcyB0YWJsZSBmcm9tIHRoZSBwYXJzZWQgcGluIGNvbmZpZ3VyYXRpb24gKi8KLXN0YXRpYyBpbnQgdnQxNzE2U19hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsJaW50IGk7Ci0JaGRhX25pZF90IG5pZDsKLQotCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gY2ZnLT5saW5lX291dHM7Ci0KLQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPnByaXZhdGVfZGFjX25pZHM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKLQkJaWYgKG5pZCkgewotCQkJLyogY29uZmlnIGRhYyBsaXN0ICovCi0JCQlzd2l0Y2ggKGkpIHsKLQkJCWNhc2UgQVVUT19TRVFfRlJPTlQ6Ci0JCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IDB4MTA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVVE9fU0VRX0NFTkxGRToKLQkJCQlzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldID0gMHgyNTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVUT19TRVFfU1VSUk9VTkQ6Ci0JCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9IDB4MTE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZyb20gdGhlIHBhcnNlZCBEQUMgdGFibGUgKi8KLXN0YXRpYyBpbnQgdnQxNzE2U19hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsCi0JCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQljaGFyIG5hbWVbMzJdOwotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2huYW1lWzNdID0gewotCQkiRnJvbnQiLCAiU3Vycm91bmQiLCAiQy9MRkUiCi0JfTsKLQloZGFfbmlkX3QgbmlkX3ZvbHNbXSA9IHsweDEwLCAweDExLCAweDI1fTsKLQloZGFfbmlkX3QgbmlkX211dGVzW10gPSB7MHgxQywgMHgxOCwgMHgyN307Ci0JaGRhX25pZF90IG5pZCwgbmlkX3ZvbCwgbmlkX211dGU7Ci0JaW50IGksIGVycjsKLQotCWZvciAoaSA9IDA7IGkgPD0gQVVUT19TRVFfQ0VOTEZFOyBpKyspIHsKLQkJbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOwotCi0JCWlmICghbmlkKQotCQkJY29udGludWU7Ci0KLQkJbmlkX3ZvbCA9IG5pZF92b2xzW2ldOwotCQluaWRfbXV0ZSA9IG5pZF9tdXRlc1tpXTsKLQotCQlpZiAoaSA9PSBBVVRPX1NFUV9DRU5MRkUpIHsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbCgKLQkJCQlzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkJIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLAotCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMSwgMCwgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbCgKLQkJCQlzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkJIkxGRSBQbGF5YmFjayBWb2x1bWUiLAotCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMiwgMCwgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IHZpYV9hZGRfY29udHJvbCgKLQkJCQlzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAotCQkJCSJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwKLQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9tdXRlLCAxLCAwLAotCQkJCQkJICAgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woCi0JCQkJc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKLQkJCQkiTEZFIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfbXV0ZSwgMiwgMCwKLQkJCQkJCSAgICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgaWYgKGkgPT0gQVVUT19TRVFfRlJPTlQpIHsKLQotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKAotCQkJCXNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKLQkJCQkiTWFzdGVyIEZyb250IFBsYXliYWNrIFZvbHVtZSIsCi0JCQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE2LCAzLCAwLCBIREFfSU5QVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woCi0JCQkJc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKLQkJCQkiTWFzdGVyIEZyb250IFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE2LCAzLCAwLCBIREFfSU5QVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0KLQkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIGNobmFtZVtpXSk7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woCi0JCQkJc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLCBuYW1lLAotCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwgSERBX09VVFBVVCkpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGNobmFtZVtpXSk7Ci0JCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woCi0JCQkJc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKLQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9tdXRlLCAzLCAwLAotCQkJCQkJICAgIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0gZWxzZSB7Ci0JCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKAotCQkJCXNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKLQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBjaG5hbWVbaV0pOwotCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKAotCQkJCXNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsIG5hbWUsCi0JCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfbXV0ZSwgMywgMCwKLQkJCQkJCSAgICBIREFfT1VUUFVUKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZ0MTcxNlNfYXV0b19jcmVhdGVfaHBfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW4pCi17Ci0JaW50IGVycjsKLQotCWlmICghcGluKQotCQlyZXR1cm4gMDsKLQotCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IDB4MjU7IC8qIEFPVzMgKi8KLQlzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlX2luZGV4ID0gMTsKLQotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkgICAgICAiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MjUsIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAotCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLAotCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWNyZWF0ZV9ocF9pbXV4KHNwZWMpOwotCXJldHVybiAwOwotfQotCi0vKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLwotc3RhdGljIGludCB2dDE3MTZTX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgcGluX2lkeHNbXSA9IHsgMHgxZiwgMHgxYSwgMHgxYiwgMHgxZSwgMCwgMHhmZiB9OwotCXJldHVybiB2dF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3Rscyhjb2RlYywgY2ZnLCAweDE2LCBwaW5faWR4cywKLQkJCQkJCUFSUkFZX1NJWkUocGluX2lkeHMpKTsKLX0KLQotc3RhdGljIGludCB2dDE3MTZTX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBlcnI7Ci0KLQllcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywgTlVMTCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gdnQxNzE2U19hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWlmICghc3BlYy0+YXV0b2NmZy5saW5lX291dHMgJiYgIXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSkKLQkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgQklPUyBwaW4gY29uZmlnICovCi0KLQllcnIgPSB2dDE3MTZTX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2dDE3MTZTX2F1dG9fY3JlYXRlX2hwX2N0bHMoc3BlYywgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2dDE3MTZTX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7Ci0KLQlmaWxsX2RpZ19vdXRzKGNvZGVjKTsKLQotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxzLmxpc3Q7Ci0KLQlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOwotCi0JaWYgKHNwZWMtPmhwX211eCkKLQkJdmlhX2hwX2J1aWxkKGNvZGVjKTsKLQotCXZpYV9zbWFydDUxX2J1aWxkKHNwZWMpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9hbXBfbGlzdCB2dDE3MTZTX2xvb3BiYWNrc1tdID0gewotCXsgMHgxNiwgSERBX0lOUFVULCAxIH0sCi0JeyAweDE2LCBIREFfSU5QVVQsIDIgfSwKLQl7IDB4MTYsIEhEQV9JTlBVVCwgMyB9LAotCXsgMHgxNiwgSERBX0lOUFVULCA0IH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBzZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZV92dDE3MTZTKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwpAQCAtNTIwNiwzNSArMzQ4NCwxOCBAQAogCWlmIChzcGVjID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJc3BlYy0+YWFfbWl4X25pZCA9IDB4MTY7CisJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDFhLCAwLCAzLCA0MCk7CisJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDFlLCAwLCAzLCA0MCk7CisKIAkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQllcnIgPSB2dDE3MTZTX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwllcnIgPSB2aWFfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmIChlcnIgPCAwKSB7CiAJCXZpYV9mcmVlKGNvZGVjKTsKIAkJcmV0dXJuIGVycjsKLQl9IGVsc2UgaWYgKCFlcnIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGdlbmVuaWMgbW9kZS4uLlxuIik7CiAJfQogCi0Jc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdICA9IHZ0MTcxNlNfdm9sdW1lX2luaXRfdmVyYnM7Ci0Jc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQxNzE2U191bml3aWxsX2luaXRfdmVyYnM7Ci0KLQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxNzE2UyBBbmFsb2ciOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmdnQxNzE2U19wY21fYW5hbG9nX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2dDE3MTZTX3BjbV9hbmFsb2dfY2FwdHVyZTsKLQotCXNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwgPSAiVlQxNzE2UyBEaWdpdGFsIjsKLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZ2dDE3MTZTX3BjbV9kaWdpdGFsX3BsYXliYWNrOwotCi0JaWYgKCFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKLQkJc3BlYy0+YWRjX25pZHMgPSB2dDE3MTZTX2FkY19uaWRzOwotCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKHZ0MTcxNlNfYWRjX25pZHMpOwotCQlnZXRfbXV4X25pZHMoY29kZWMpOwotCQlvdmVycmlkZV9taWNfYm9vc3QoY29kZWMsIDB4MWEsIDAsIDMsIDQwKTsKLQkJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDFlLCAwLCAzLCA0MCk7Ci0JCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9IHZ0MTcxNlNfY2FwdHVyZV9taXhlcjsKLQkJc3BlYy0+bnVtX21peGVycysrOwotCX0KKwlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gID0gdnQxNzE2U19pbml0X3ZlcmJzOwogCiAJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gdnQxNzE2c19kbWljX21peGVyOwogCXNwZWMtPm51bV9taXhlcnMrKzsKQEAgLTUyNDMsMzUzICszNTA0LDMxIEBACiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKIAotCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IHZpYV9hdXRvX2luaXQ7Ci0JY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IHZpYV91bnNvbF9ldmVudDsKLQotI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKLQlzcGVjLT5sb29wYmFjay5hbXBsaXN0ID0gdnQxNzE2U19sb29wYmFja3M7Ci0jZW5kaWYKLQogCXNwZWMtPnNldF93aWRnZXRzX3Bvd2VyX3N0YXRlID0gc2V0X3dpZGdldHNfcG93ZXJfc3RhdGVfdnQxNzE2UzsKIAlyZXR1cm4gMDsKIH0KIAogLyogZm9yIHZ0MjAwMlAgKi8KIAotLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZ0MjAwMlBfY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxMCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTAsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDExLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MTEsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgQ2FwdHVyZSBWb2x1bWUiLCAweDJiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgMHgyOSwgMHgwLAotCQkJIEhEQV9JTlBVVCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLyogVGhlIG11bHRpcGxlICJDYXB0dXJlIFNvdXJjZSIgY29udHJvbHMgY29uZnVzZSBhbHNhbWl4ZXIKLQkJICogU28gY2FsbCBzb21ld2hhdCBkaWZmZXJlbnQuLgotCQkgKi8KLQkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLwotCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAotCQkuY291bnQgPSAyLAotCQkuaW5mbyA9IHZpYV9tdXhfZW51bV9pbmZvLAotCQkuZ2V0ID0gdmlhX211eF9lbnVtX2dldCwKLQkJLnB1dCA9IHZpYV9tdXhfZW51bV9wdXQsCi0JfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHZ0MjAwMlBfdm9sdW1lX2luaXRfdmVyYnNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgdnQyMDAyUF9pbml0X3ZlcmJzW10gPSB7CiAJLyogQ2xhc3MtRCBzcGVha2VyIHJlbGF0ZWQgdmVyYnMgKi8KIAl7MHgxLCAweGZlMCwgMHg0fSwKIAl7MHgxLCAweGZlOSwgMHg4MH0sCiAJezB4MSwgMHhmZTIsIDB4MjJ9LAotCS8qCi0JICogVW5tdXRlIEFEQzAtMSBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0KLQkvKiBNdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCi0JICogbWl4ZXIgd2lkZ2V0Ci0JICovCi0JLyogQW1wIEluZGljZXM6IENEID0gMSwgTWljMSA9IDIsIExpbmUgPSAzLCBNaWMyID0gNCAqLwotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKLQotCS8qIE1VWCBJbmRpY2VzOiBNaWMgPSAwICovCi0JezB4MWUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQl7MHgxZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAotCi0JLyogUFc5IE91dHB1dCBlbmFibGUgKi8KLQl7MHgyZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBBQ19QSU5DVExfT1VUX0VOfSwKLQogCS8qIEVuYWJsZSBCb29zdCBWb2x1bWUgYmFja2Rvb3IgKi8KIAl7MHgxLCAweGZiOSwgMHgyNH0sCi0KLQkvKiBNVzAvMS80Lzg6IHVuLW11dGUgaW5kZXggMCAoTVVYeCksIHVuLW11dGUgaW5kZXggMSAoTVc5KSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQkvKiBzZXQgTVVYMC8xLzQvOCA9IDAgKEFPVzApICovCi0JezB4MzQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQl7MHgzNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAotCXsweDM3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0JezB4M2IsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQotCS8qIHNldCBQVzAgaW5kZXg9MCAoTVcwKSAqLwotCXsweDI0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0KLQkvKiBFbmFibGUgQU9XMCB0byBNVzkgKi8KLQl7MHgxLCAweGZiOCwgMHg4OH0sCi0JeyB9Ci19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2dDE4MDJfdm9sdW1lX2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIFVubXV0ZSBBREMwLTEgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KLQkgKi8KLQl7MHg4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHg5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQotCi0JLyogTXV0ZSBpbnB1dCBhbXBzIChDRCwgTGluZSBJbiwgTWljIDEgJiBNaWMgMikgb2YgdGhlIGFuYWxvZy1sb29wYmFjawotCSAqIG1peGVyIHdpZGdldAotCSAqLwotCS8qIEFtcCBJbmRpY2VzOiBDRCA9IDEsIE1pYzEgPSAyLCBMaW5lID0gMywgTWljMiA9IDQgKi8KLQl7MHgyMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0KLQkvKiBNVVggSW5kaWNlczogTWljID0gMCAqLwotCXsweDFlLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0JezB4MWYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQotCS8qIFBXOSBPdXRwdXQgZW5hYmxlICovCi0JezB4MmQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgQUNfUElOQ1RMX09VVF9FTn0sCi0KLQkvKiBFbmFibGUgQm9vc3QgVm9sdW1lIGJhY2tkb29yICovCi0JezB4MSwgMHhmYjksIDB4MjR9LAotCi0JLyogTVcwLzEvNC84OiB1bi1tdXRlIGluZGV4IDAgKE1VWHgpLCB1bi1tdXRlIGluZGV4IDEgKE1XOSkgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JLyogc2V0IE1VWDAvMS80LzggPSAwIChBT1cwKSAqLwotCXsweDM0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0JezB4MzUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQl7MHgzOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAotCXsweDNjLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0KLQkvKiBzZXQgUFcwIGluZGV4PTAgKE1XMCkgKi8KLQl7MHgyNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAotCiAJLyogRW5hYmxlIEFPVzAgdG8gTVc5ICovCiAJezB4MSwgMHhmYjgsIDB4ODh9LAogCXsgfQogfTsKIAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHZ0MjAwMlBfdW5pd2lsbF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MjUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwKLQkgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVCB8IFZJQV9CSU5EX0hQX0VWRU5UfSwKLQl7MHgyNiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAotCSBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UIHwgVklBX0JJTkRfSFBfRVZFTlR9LAotCXsweDI5LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsweDJhLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlR9LAotCXsweDJiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlR9LAorc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2dDE4MDJfaW5pdF92ZXJic1tdID0geworCS8qIEVuYWJsZSBCb29zdCBWb2x1bWUgYmFja2Rvb3IgKi8KKwl7MHgxLCAweGZiOSwgMHgyNH0sCisJLyogRW5hYmxlIEFPVzAgdG8gTVc5ICovCisJezB4MSwgMHhmYjgsIDB4ODh9LAogCXsgfQogfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgdnQxODAyX3VuaXdpbGxfaW5pdF92ZXJic1tdID0gewotCXsweDI1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsCi0JIEFDX1VTUlNQX0VOIHwgVklBX0pBQ0tfRVZFTlQgfCBWSUFfQklORF9IUF9FVkVOVH0sCi0JezB4MjgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwKLQkgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVCB8IFZJQV9CSU5EX0hQX0VWRU5UfSwKLQl7MHgyOSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgyYSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgyYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQyMDAyUF9wY21fYW5hbG9nX3BsYXliYWNrID0gewotCS5zdWJzdHJlYW1zID0gMiwKLQkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkubmlkID0gMHg4LCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9wbGF5YmFja19wY21fb3BlbiwKLQkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbGVhbnVwLAotCQkuY2xvc2UgPSB2aWFfcGNtX29wZW5fY2xvc2UsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQyMDAyUF9wY21fYW5hbG9nX2NhcHR1cmUgPSB7Ci0JLnN1YnN0cmVhbXMgPSAyLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS5uaWQgPSAweDEwLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9wY21fb3Blbl9jbG9zZSwKLQkJLnByZXBhcmUgPSB2aWFfY2FwdHVyZV9wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfY2FwdHVyZV9wY21fY2xlYW51cCwKLQkJLmNsb3NlID0gdmlhX3BjbV9vcGVuX2Nsb3NlLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MjAwMlBfcGNtX2RpZ2l0YWxfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAxLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS8qIE5JRCBpcyBzZXQgaW4gdmlhX2J1aWxkX3BjbXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX29wZW4sCi0JCS5jbG9zZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlLAotCQkucHJlcGFyZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX2RpZ19wbGF5YmFja19wY21fY2xlYW51cAotCX0sCi19OwotCi0vKiBmaWxsIGluIHRoZSBkYWNfbmlkcyB0YWJsZSBmcm9tIHRoZSBwYXJzZWQgcGluIGNvbmZpZ3VyYXRpb24gKi8KLXN0YXRpYyBpbnQgdnQyMDAyUF9hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDE7Ci0Jc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5wcml2YXRlX2RhY19uaWRzOwotCWlmIChjZmctPmxpbmVfb3V0X3BpbnNbMF0pCi0JCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbMF0gPSAweDg7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmcm9tIHRoZSBwYXJzZWQgREFDIHRhYmxlICovCi1zdGF0aWMgaW50IHZ0MjAwMlBfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAotCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQlpbnQgZXJyOwotCWhkYV9uaWRfdCBzd19uaWQ7Ci0KLQlpZiAoIWNmZy0+bGluZV9vdXRfcGluc1swXSkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKHNwZWMtPmNvZGVjX3R5cGUgPT0gVlQxODAyKQotCQlzd19uaWQgPSAweDI4OwotCWVsc2UKLQkJc3dfbmlkID0gMHgyNjsKLQotCS8qIExpbmUtT3V0OiBQb3J0RSAqLwotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFZvbHVtZSIsCi0JCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4OCwgMywgMCwgSERBX09VVFBVVCkpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9CSU5EX1BJTl9NVVRFLAotCQkJICAgICAgIk1hc3RlciBGcm9udCBQbGF5YmFjayBTd2l0Y2giLAotCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChzd19uaWQsIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZ0MjAwMlBfYXV0b19jcmVhdGVfaHBfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW4pCi17Ci0JaW50IGVycjsKLQotCWlmICghcGluKQotCQlyZXR1cm4gMDsKLQotCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IDB4OTsKLQlzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlX2luZGV4ID0gMTsKLQotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkgICAgICAiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKAotCQkJCSAgICAgIHNwZWMtPm11bHRpb3V0LmhwX25pZCwgMywgMCwgSERBX09VVFBVVCkpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCi0JCQkgICAgICAiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MjUsIDMsIDAsIEhEQV9PVVRQVVQpKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWNyZWF0ZV9ocF9pbXV4KHNwZWMpOwotCXJldHVybiAwOwotfQotCi0vKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLwotc3RhdGljIGludCB2dDIwMDJQX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFswXTsKLQlzdGF0aWMgY29uc3QgaGRhX25pZF90IHBpbl9pZHhzW10gPSB7IDB4MmIsIDB4MmEsIDB4MjksIDB4ZmYgfTsKLQlpbnQgZXJyOwotCi0JZXJyID0gdnRfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoY29kZWMsIGNmZywgMHgyMSwgcGluX2lkeHMsCi0JCQkJCSAgICAgICBBUlJBWV9TSVpFKHBpbl9pZHhzKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JLyogYnVpbGQgdm9sdW1lL211dGUgY29udHJvbCBvZiBsb29wYmFjayAqLwotCWVyciA9IHZpYV9uZXdfYW5hbG9nX2lucHV0KHNwZWMsICJTdGVyZW8gTWl4ZXIiLCAwLCAzLCAweDIxKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qIGZvciBkaWdpdGFsIG1pYyBzZWxlY3QgKi8KLQlzbmRfaGRhX2FkZF9pbXV4X2l0ZW0oaW11eCwgIkRpZ2l0YWwgTWljIiwgNCwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2dDIwMDJQX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBlcnI7Ci0KLQotCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLCBOVUxMKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IHZ0MjAwMlBfYXV0b19maWxsX2RhY19uaWRzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWlmICghc3BlYy0+YXV0b2NmZy5saW5lX291dHMgJiYgIXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSkKLQkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgQklPUyBwaW4gY29uZmlnICovCi0KLQllcnIgPSB2dDIwMDJQX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2dDIwMDJQX2F1dG9fY3JlYXRlX2hwX2N0bHMoc3BlYywgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2dDIwMDJQX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKGNvZGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7Ci0KLQlmaWxsX2RpZ19vdXRzKGNvZGVjKTsKLQotCWlmIChzcGVjLT5rY3Rscy5saXN0KQotCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxzLmxpc3Q7Ci0KLQlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOwotCi0JaWYgKHNwZWMtPmhwX211eCkKLQkJdmlhX2hwX2J1aWxkKGNvZGVjKTsKLQotCXJldHVybiAxOwotfQotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYW1wX2xpc3QgdnQyMDAyUF9sb29wYmFja3NbXSA9IHsKLQl7IDB4MjEsIEhEQV9JTlBVVCwgMCB9LAotCXsgMHgyMSwgSERBX0lOUFVULCAxIH0sCi0JeyAweDIxLCBIREFfSU5QVVQsIDIgfSwKLQl7IH0gLyogZW5kICovCi19OwotI2VuZGlmCiAKIHN0YXRpYyB2b2lkIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MjAwMlAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CkBAIC01NzEzLDMzNCArMzY1MiwzOSBAQAogCWlmIChzcGVjID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJc3BlYy0+YWFfbWl4X25pZCA9IDB4MjE7CisJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDJiLCAwLCAzLCA0MCk7CisJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDI5LCAwLCAzLCA0MCk7CisJYWRkX3NlY3JldF9kYWNfcGF0aChjb2RlYyk7CisKIAkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQllcnIgPSB2dDIwMDJQX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwllcnIgPSB2aWFfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmIChlcnIgPCAwKSB7CiAJCXZpYV9mcmVlKGNvZGVjKTsKIAkJcmV0dXJuIGVycjsKLQl9IGVsc2UgaWYgKCFlcnIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGdlbmVuaWMgbW9kZS4uLlxuIik7CiAJfQogCiAJaWYgKHNwZWMtPmNvZGVjX3R5cGUgPT0gVlQxODAyKQotCQlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gID0KLQkJCXZ0MTgwMl92b2x1bWVfaW5pdF92ZXJiczsKKwkJc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQxODAyX2luaXRfdmVyYnM7CiAJZWxzZQotCQlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gID0KLQkJCXZ0MjAwMlBfdm9sdW1lX2luaXRfdmVyYnM7Ci0KLQlpZiAoc3BlYy0+Y29kZWNfdHlwZSA9PSBWVDE4MDIpCi0JCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9Ci0JCQl2dDE4MDJfdW5pd2lsbF9pbml0X3ZlcmJzOwotCWVsc2UKLQkJc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0KLQkJCXZ0MjAwMlBfdW5pd2lsbF9pbml0X3ZlcmJzOwotCi0JaWYgKHNwZWMtPmNvZGVjX3R5cGUgPT0gVlQxODAyKQotCQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxODAyIEFuYWxvZyI7Ci0JZWxzZQotCQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQyMDAyUCBBbmFsb2ciOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmdnQyMDAyUF9wY21fYW5hbG9nX3BsYXliYWNrOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2dDIwMDJQX3BjbV9hbmFsb2dfY2FwdHVyZTsKLQotCWlmIChzcGVjLT5jb2RlY190eXBlID09IFZUMTgwMikKLQkJc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJWVDE4MDIgRGlnaXRhbCI7Ci0JZWxzZQotCQlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIlZUMjAwMlAgRGlnaXRhbCI7Ci0Jc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmdnQyMDAyUF9wY21fZGlnaXRhbF9wbGF5YmFjazsKLQotCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7Ci0JCXNwZWMtPmFkY19uaWRzID0gdnQyMDAyUF9hZGNfbmlkczsKLQkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRSh2dDIwMDJQX2FkY19uaWRzKTsKLQkJZ2V0X211eF9uaWRzKGNvZGVjKTsKLQkJb3ZlcnJpZGVfbWljX2Jvb3N0KGNvZGVjLCAweDJiLCAwLCAzLCA0MCk7Ci0JCW92ZXJyaWRlX21pY19ib29zdChjb2RlYywgMHgyOSwgMCwgMywgNDApOwotCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVyc10gPSB2dDIwMDJQX2NhcHR1cmVfbWl4ZXI7Ci0JCXNwZWMtPm51bV9taXhlcnMrKzsKLQl9CisJCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9IHZ0MjAwMlBfaW5pdF92ZXJiczsKIAogCWNvZGVjLT5wYXRjaF9vcHMgPSB2aWFfcGF0Y2hfb3BzOwogCi0JY29kZWMtPnBhdGNoX29wcy5pbml0ID0gdmlhX2F1dG9faW5pdDsKLQljb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50ID0gdmlhX3Vuc29sX2V2ZW50OwotCi0jaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQotCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSB2dDIwMDJQX2xvb3BiYWNrczsKLSNlbmRpZgotCiAJc3BlYy0+c2V0X3dpZGdldHNfcG93ZXJfc3RhdGUgPSAgc2V0X3dpZGdldHNfcG93ZXJfc3RhdGVfdnQyMDAyUDsKIAlyZXR1cm4gMDsKIH0KIAogLyogZm9yIHZ0MTgxMiAqLwogCi0vKiBjYXB0dXJlIG1peGVyIGVsZW1lbnRzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdnQxODEyX2NhcHR1cmVfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MTAsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDEwLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMSwgMHgxMSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAxLCAweDExLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIDB4MmIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgMHgyOSwgMHgwLAotCQkgICAgICAgSERBX0lOUFVUKSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkvKiBUaGUgbXVsdGlwbGUgIkNhcHR1cmUgU291cmNlIiBjb250cm9scyBjb25mdXNlIGFsc2FtaXhlcgotCQkgKiBTbyBjYWxsIHNvbWV3aGF0IGRpZmZlcmVudC4uCi0JCSAqLwotCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAotCQkuY291bnQgPSAyLAotCQkuaW5mbyA9IHZpYV9tdXhfZW51bV9pbmZvLAotCQkuZ2V0ID0gdmlhX211eF9lbnVtX2dldCwKLQkJLnB1dCA9IHZpYV9tdXhfZW51bV9wdXQsCi0JfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHZ0MTgxMl92b2x1bWVfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAtMSBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0KLQkvKiBNdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCi0JICogbWl4ZXIgd2lkZ2V0Ci0JICovCi0JLyogQW1wIEluZGljZXM6IENEID0gMSwgTWljMSA9IDIsIExpbmUgPSAzLCBNaWMyID0gNCAqLwotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKLQotCS8qIE1VWCBJbmRpY2VzOiBNaWMgPSAwICovCi0JezB4MWUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQl7MHgxZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAotCi0JLyogUFc5IE91dHB1dCBlbmFibGUgKi8KLQl7MHgyZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBBQ19QSU5DVExfT1VUX0VOfSwKLQorc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2dDE4MTJfaW5pdF92ZXJic1tdID0gewogCS8qIEVuYWJsZSBCb29zdCBWb2x1bWUgYmFja2Rvb3IgKi8KIAl7MHgxLCAweGZiOSwgMHgyNH0sCi0KLQkvKiBNVzAvMS80LzEzLzE1OiB1bi1tdXRlIGluZGV4IDAgKE1VWHgpLCB1bi1tdXRlIGluZGV4IDEgKE1XOSkgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQkvKiBzZXQgTVVYMC8xLzQvMTMvMTUgPSAwIChBT1cwKSAqLwotCXsweDM0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0JezB4MzUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQl7MHgzOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAotCXsweDNjLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCi0JezB4M2QsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKLQogCS8qIEVuYWJsZSBBT1cwIHRvIE1XOSAqLwogCXsweDEsIDB4ZmI4LCAweGE4fSwKIAl7IH0KIH07CiAKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiB2dDE4MTJfdW5pd2lsbF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MzMsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwKLQkgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVCB8IFZJQV9CSU5EX0hQX0VWRU5UfSwKLQl7MHgyNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UIH0sCi0JezB4MjgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwKLQkgQUNfVVNSU1BfRU4gfCBWSUFfSkFDS19FVkVOVCB8IFZJQV9CSU5EX0hQX0VWRU5UfSwKLQl7MHgyOSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgyYSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7MHgyYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9KQUNLX0VWRU5UfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxODEyX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAyLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS5uaWQgPSAweDgsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLwotCS5vcHMgPSB7Ci0JCS5vcGVuID0gdmlhX3BsYXliYWNrX3BjbV9vcGVuLAotCQkucHJlcGFyZSA9IHZpYV9wbGF5YmFja19tdWx0aV9wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX2NsZWFudXAsCi0JCS5jbG9zZSA9IHZpYV9wY21fb3Blbl9jbG9zZSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE4MTJfcGNtX2FuYWxvZ19jYXB0dXJlID0gewotCS5zdWJzdHJlYW1zID0gMiwKLQkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkubmlkID0gMHgxMCwgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCi0JLm9wcyA9IHsKLQkJLm9wZW4gPSB2aWFfcGNtX29wZW5fY2xvc2UsCi0JCS5wcmVwYXJlID0gdmlhX2NhcHR1cmVfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX2NhcHR1cmVfcGNtX2NsZWFudXAsCi0JCS5jbG9zZSA9IHZpYV9wY21fb3Blbl9jbG9zZSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE4MTJfcGNtX2RpZ2l0YWxfcGxheWJhY2sgPSB7Ci0JLnN1YnN0cmVhbXMgPSAxLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS8qIE5JRCBpcyBzZXQgaW4gdmlhX2J1aWxkX3BjbXMgKi8KLQkub3BzID0gewotCQkub3BlbiA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX29wZW4sCi0JCS5jbG9zZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlLAotCQkucHJlcGFyZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX2RpZ19wbGF5YmFja19wY21fY2xlYW51cAotCX0sCi19OwotLyogZmlsbCBpbiB0aGUgZGFjX25pZHMgdGFibGUgZnJvbSB0aGUgcGFyc2VkIHBpbiBjb25maWd1cmF0aW9uICovCi1zdGF0aWMgaW50IHZ0MTgxMl9hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQotewotCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gMTsKLQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPnByaXZhdGVfZGFjX25pZHM7Ci0JaWYgKGNmZy0+bGluZV9vdXRfcGluc1swXSkKLQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1swXSA9IDB4ODsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZnJvbSB0aGUgcGFyc2VkIERBQyB0YWJsZSAqLwotc3RhdGljIGludCB2dDE4MTJfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAotCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQlpbnQgZXJyOwotCi0JaWYgKCFjZmctPmxpbmVfb3V0X3BpbnNbMF0pCi0JCXJldHVybiAtMTsKLQotCS8qIExpbmUtT3V0OiBQb3J0RSAqLwotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkgICAgICAiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwKLQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHg4LCAzLCAwLCBIREFfT1VUUFVUKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX0JJTkRfUElOX01VVEUsCi0JCQkgICAgICAiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwKLQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgyOCwgMywgMCwgSERBX09VVFBVVCkpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdnQxODEyX2F1dG9fY3JlYXRlX2hwX2N0bHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLCBoZGFfbmlkX3QgcGluKQotewotCWludCBlcnI7Ci0KLQlpZiAoIXBpbikKLQkJcmV0dXJuIDA7Ci0KLQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSAweDk7Ci0Jc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZV9pbmRleCA9IDE7Ci0KLQotCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCi0JCQkgICAgICAiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKAotCQkJCSAgICAgIHNwZWMtPm11bHRpb3V0LmhwX25pZCwgMywgMCwgSERBX09VVFBVVCkpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCi0JCQkgICAgICAiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKHBpbiwgMywgMCwgSERBX09VVFBVVCkpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JY3JlYXRlX2hwX2ltdXgoc3BlYyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGNyZWF0ZSBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciBpbnB1dCBwaW5zICovCi1zdGF0aWMgaW50IHZ0MTgxMl9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkJCWNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKLXsKLQlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07Ci0Jc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBwaW5faWR4c1tdID0geyAweDJiLCAweDJhLCAweDI5LCAwLCAwLCAweGZmIH07Ci0JaW50IGVycjsKLQotCWVyciA9IHZ0X2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKGNvZGVjLCBjZmcsIDB4MjEsIHBpbl9pZHhzLAotCQkJCQkgICAgICAgQVJSQVlfU0laRShwaW5faWR4cykpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JLyogYnVpbGQgdm9sdW1lL211dGUgY29udHJvbCBvZiBsb29wYmFjayAqLwotCWVyciA9IHZpYV9uZXdfYW5hbG9nX2lucHV0KHNwZWMsICJTdGVyZW8gTWl4ZXIiLCAwLCA1LCAweDIxKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qIGZvciBkaWdpdGFsIG1pYyBzZWxlY3QgKi8KLQlzbmRfaGRhX2FkZF9pbXV4X2l0ZW0oaW11eCwgIkRpZ2l0YWwgTWljIiwgNiwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2dDE4MTJfcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGVycjsKLQotCi0JZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsIE5VTEwpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWZpbGxfZGlnX291dHMoY29kZWMpOwotCWVyciA9IHZ0MTgxMl9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKCFzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cyAmJiAhc3BlYy0+YXV0b2NmZy5ocF9vdXRzKQotCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KLQotCWVyciA9IHZ0MTgxMl9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gdnQxODEyX2F1dG9fY3JlYXRlX2hwX2N0bHMoc3BlYywgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSB2dDE4MTJfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoY29kZWMsICZzcGVjLT5hdXRvY2ZnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzICogMjsKLQotCWZpbGxfZGlnX291dHMoY29kZWMpOwotCi0JaWYgKHNwZWMtPmtjdGxzLmxpc3QpCi0JCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gc3BlYy0+a2N0bHMubGlzdDsKLQotCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07Ci0KLQlpZiAoc3BlYy0+aHBfbXV4KQotCQl2aWFfaHBfYnVpbGQoY29kZWMpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9hbXBfbGlzdCB2dDE4MTJfbG9vcGJhY2tzW10gPSB7Ci0JeyAweDIxLCBIREFfSU5QVVQsIDAgfSwKLQl7IDB4MjEsIEhEQV9JTlBVVCwgMSB9LAotCXsgMHgyMSwgSERBX0lOUFVULCAyIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBzZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZV92dDE4MTIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CkBAIC02MTQ0LDQ3ICszNzg4LDIyIEBACiAJaWYgKHNwZWMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlzcGVjLT5hYV9taXhfbmlkID0gMHgyMTsKKwlvdmVycmlkZV9taWNfYm9vc3QoY29kZWMsIDB4MmIsIDAsIDMsIDQwKTsKKwlvdmVycmlkZV9taWNfYm9vc3QoY29kZWMsIDB4MjksIDAsIDMsIDQwKTsKKwlhZGRfc2VjcmV0X2RhY19wYXRoKGNvZGVjKTsKKwogCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLwotCWVyciA9IHZ0MTgxMl9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJZXJyID0gdmlhX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkgewogCQl2aWFfZnJlZShjb2RlYyk7CiAJCXJldHVybiBlcnI7Ci0JfSBlbHNlIGlmICghZXJyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKLQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBnZW5lbmljIG1vZGUuLi5cbiIpOwogCX0KIAotCi0Jc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdICA9IHZ0MTgxMl92b2x1bWVfaW5pdF92ZXJiczsKLQlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE4MTJfdW5pd2lsbF9pbml0X3ZlcmJzOwotCi0Jc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nID0gIlZUMTgxMiBBbmFsb2ciOwotCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmdnQxODEyX3BjbV9hbmFsb2dfcGxheWJhY2s7Ci0Jc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0gJnZ0MTgxMl9wY21fYW5hbG9nX2NhcHR1cmU7Ci0KLQlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIlZUMTgxMiBEaWdpdGFsIjsKLQlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZ2dDE4MTJfcGNtX2RpZ2l0YWxfcGxheWJhY2s7Ci0KLQotCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7Ci0JCXNwZWMtPmFkY19uaWRzID0gdnQxODEyX2FkY19uaWRzOwotCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKHZ0MTgxMl9hZGNfbmlkcyk7Ci0JCWdldF9tdXhfbmlkcyhjb2RlYyk7Ci0JCW92ZXJyaWRlX21pY19ib29zdChjb2RlYywgMHgyYiwgMCwgMywgNDApOwotCQlvdmVycmlkZV9taWNfYm9vc3QoY29kZWMsIDB4MjksIDAsIDMsIDQwKTsKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gdnQxODEyX2NhcHR1cmVfbWl4ZXI7Ci0JCXNwZWMtPm51bV9taXhlcnMrKzsKLQl9CisJc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdICA9IHZ0MTgxMl9pbml0X3ZlcmJzOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7CiAKLQljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSB2aWFfYXV0b19pbml0OwotCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSB2aWFfdW5zb2xfZXZlbnQ7Ci0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi0Jc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IHZ0MTgxMl9sb29wYmFja3M7Ci0jZW5kaWYKLQogCXNwZWMtPnNldF93aWRnZXRzX3Bvd2VyX3N0YXRlID0gIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTgxMjsKIAlyZXR1cm4gMDsKIH0KQEAgLTYxOTgsMzcgKzM4MTcsMzcgQEAKIAl7IC5pZCA9IDB4MTEwNjE3MGEsIC5uYW1lID0gIlZUMTcwOCIsIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOH0sCiAJeyAuaWQgPSAweDExMDYxNzBiLCAubmFtZSA9ICJWVDE3MDgiLCAucGF0Y2ggPSBwYXRjaF92dDE3MDh9LAogCXsgLmlkID0gMHgxMTA2ZTcxMCwgLm5hbWUgPSAiVlQxNzA5IDEwLUNoIiwKLQkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOV8xMGNofSwKKwkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOX0sCiAJeyAuaWQgPSAweDExMDZlNzExLCAubmFtZSA9ICJWVDE3MDkgMTAtQ2giLAotCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA5XzEwY2h9LAorCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA5fSwKIAl7IC5pZCA9IDB4MTEwNmU3MTIsIC5uYW1lID0gIlZUMTcwOSAxMC1DaCIsCi0JICAucGF0Y2ggPSBwYXRjaF92dDE3MDlfMTBjaH0sCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDl9LAogCXsgLmlkID0gMHgxMTA2ZTcxMywgLm5hbWUgPSAiVlQxNzA5IDEwLUNoIiwKLQkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOV8xMGNofSwKKwkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOX0sCiAJeyAuaWQgPSAweDExMDZlNzE0LCAubmFtZSA9ICJWVDE3MDkgNi1DaCIsCi0JICAucGF0Y2ggPSBwYXRjaF92dDE3MDlfNmNofSwKKwkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOX0sCiAJeyAuaWQgPSAweDExMDZlNzE1LCAubmFtZSA9ICJWVDE3MDkgNi1DaCIsCi0JICAucGF0Y2ggPSBwYXRjaF92dDE3MDlfNmNofSwKKwkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOX0sCiAJeyAuaWQgPSAweDExMDZlNzE2LCAubmFtZSA9ICJWVDE3MDkgNi1DaCIsCi0JICAucGF0Y2ggPSBwYXRjaF92dDE3MDlfNmNofSwKKwkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOX0sCiAJeyAuaWQgPSAweDExMDZlNzE3LCAubmFtZSA9ICJWVDE3MDkgNi1DaCIsCi0JICAucGF0Y2ggPSBwYXRjaF92dDE3MDlfNmNofSwKKwkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOX0sCiAJeyAuaWQgPSAweDExMDZlNzIwLCAubmFtZSA9ICJWVDE3MDhCIDgtQ2giLAotCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Ql84Y2h9LAorCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Qn0sCiAJeyAuaWQgPSAweDExMDZlNzIxLCAubmFtZSA9ICJWVDE3MDhCIDgtQ2giLAotCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Ql84Y2h9LAorCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Qn0sCiAJeyAuaWQgPSAweDExMDZlNzIyLCAubmFtZSA9ICJWVDE3MDhCIDgtQ2giLAotCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Ql84Y2h9LAorCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Qn0sCiAJeyAuaWQgPSAweDExMDZlNzIzLCAubmFtZSA9ICJWVDE3MDhCIDgtQ2giLAotCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Ql84Y2h9LAorCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Qn0sCiAJeyAuaWQgPSAweDExMDZlNzI0LCAubmFtZSA9ICJWVDE3MDhCIDQtQ2giLAotCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Ql80Y2h9LAorCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Qn0sCiAJeyAuaWQgPSAweDExMDZlNzI1LCAubmFtZSA9ICJWVDE3MDhCIDQtQ2giLAotCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Ql80Y2h9LAorCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Qn0sCiAJeyAuaWQgPSAweDExMDZlNzI2LCAubmFtZSA9ICJWVDE3MDhCIDQtQ2giLAotCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Ql80Y2h9LAorCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Qn0sCiAJeyAuaWQgPSAweDExMDZlNzI3LCAubmFtZSA9ICJWVDE3MDhCIDQtQ2giLAotCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Ql80Y2h9LAorCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Qn0sCiAJeyAuaWQgPSAweDExMDYwMzk3LCAubmFtZSA9ICJWVDE3MDhTIiwKIAkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOFN9LAogCXsgLmlkID0gMHgxMTA2MTM5NywgLm5hbWUgPSAiVlQxNzA4UyIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKaW5kZXggZjQ1OTRkNy4uMGNjYzBlYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYwpAQCAtODcsNyArODcsNyBAQAogc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOy8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KIHN0YXRpYyBjaGFyICptb2RlbFtTTkRSVl9DQVJEU107CiBzdGF0aWMgaW50IG9tbmlbU05EUlZfQ0FSRFNdOwkJCQkvKiBEZWx0YTQ0ICYgNjYgT21uaSBJL08gc3VwcG9ydCAqLwotc3RhdGljIGludCBjczg0MjdfdGltZW91dFtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUy0xKV0gPSA1MDB9OyAvKiBDUzg0MjcgUy9QRElGIHRyYW5zY2lldmVyIHJlc2V0IHRpbWVvdXQgdmFsdWUgaW4gbXNlYyAqLworc3RhdGljIGludCBjczg0MjdfdGltZW91dFtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUy0xKV0gPSA1MDB9OyAvKiBDUzg0MjcgUy9QRElGIHRyYW5zY2VpdmVyIHJlc2V0IHRpbWVvdXQgdmFsdWUgaW4gbXNlYyAqLwogc3RhdGljIGludCBkeHJfZW5hYmxlW1NORFJWX0NBUkRTXTsJCQkvKiBEWFIgZW5hYmxlIGZvciBETVg2RklSRSAqLwogCiBtb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CkBAIC0yNjA3LDcgKzI2MDcsNyBAQAogCWljZS0+cHJvZmlfcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDMpOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfaWNlMTcxMl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJIklDRTE3MTIiLCBpY2UpKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgaWNlKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX2ljZTE3MTJfZnJlZShpY2UpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTI4MDIsNyArMjgwMiw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiSUNFMTcxMiIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfaWNlMTcxMl9pZHMsCiAJLnByb2JlID0gc25kX2ljZTE3MTJfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9pY2UxNzEyX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKaW5kZXggYzE0OThmYS4uYzJiN2Y4YiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwpAQCAtMjUwOSw3ICsyNTA5LDcgQEAKIAlpY2UtPnByb2ZpX3BvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAxKTsKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3Z0MTcyNF9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCwgIklDRTE3MjQiLCBpY2UpKSB7CisJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGljZSkpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF92dDE3MjRfZnJlZShpY2UpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTI4MDIsNyArMjgwMiw3IEBACiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICJJQ0UxNzI0IiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF92dDE3MjRfaWRzLAogCS5wcm9iZSA9IHNuZF92dDE3MjRfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF92dDE3MjRfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jIGIvc291bmQvcGNpL2ludGVsOHgwLmMKaW5kZXggNmM4OTZkYi4uNmE1YjM4NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ludGVsOHgwLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwLmMKQEAgLTE4ODQsNiArMTg4NCwxMiBAQAogCX0sCiAJewogCQkuc3VidmVuZG9yID0gMHgxMDI4LAorCQkuc3ViZGV2aWNlID0gMHgwMTg5LAorCQkubmFtZSA9ICJEZWxsIEluc3Bpcm9uIDkzMDAiLAorCQkudHlwZSA9IEFDOTdfVFVORV9IUF9NVVRFX0xFRAorCX0sCisJeworCQkuc3VidmVuZG9yID0gMHgxMDI4LAogCQkuc3ViZGV2aWNlID0gMHgwMTkxLAogCQkubmFtZSA9ICJEZWxsIEluc3Bpcm9uIDg2MDAiLAogCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCkBAIC0yNjQ3LDcgKzI2NTMsNyBAQAogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAJc25kX2ludGVsOHgwX2NoaXBfaW5pdChjaGlwLCAwKTsKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9pbnRlbDh4MF9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCwgY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgeworCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKIAkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CkBAIC0zMTA2LDcgKzMxMTIsNyBAQAogCiAJLyogcmVxdWVzdCBpcnEgYWZ0ZXIgaW5pdGlhbGl6YWluZyBpbnRfc3RhX21hc2ssIGV0YyAqLwogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwX2ludGVycnVwdCwKLQkJCUlSUUZfU0hBUkVELCBjYXJkLT5zaG9ydG5hbWUsIGNoaXApKSB7CisJCQlJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTMyNjYsNyArMzI3Miw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiSW50ZWwgSUNIIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9pbnRlbDh4MF9pZHMsCiAJLnByb2JlID0gc25kX2ludGVsOHgwX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfaW50ZWw4eDBfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYyBiL3NvdW5kL3BjaS9pbnRlbDh4MG0uYwppbmRleCBmMzM1M2I0Li43YzE2MTY0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCkBAIC0xMDQ3LDcgKzEwNDcsNyBAQAogCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwbV9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCwgY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgeworCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwbTogdW5hYmxlIHRvIGdyYWIgSVJRICVkLCAiCiAJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIiwgcGNpLT5pcnEpOwogCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOwpAQCAtMTE3NCw3ICsxMTc0LDcgQEAKIAogIHBvcnRfaW5pdGVkOgogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwbV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgeworCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlzbmRfaW50ZWw4eDBtX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0xMzI1LDcgKzEzMjUsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIkludGVsIElDSCBNb2RlbSIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfaW50ZWw4eDBtX2lkcywKIAkucHJvYmUgPSBzbmRfaW50ZWw4eDBtX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfaW50ZWw4eDBtX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYyBiL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCmluZGV4IDZkNzk1NzAuLmZjMWQ1NzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCisrKyBiL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCkBAIC0yMjQxLDcgKzIyNDEsNyBAQAogCiAgICAgICAgIGVyciA9IHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfa29yZzEyMTJfaW50ZXJydXB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBJUlFGX1NIQVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImtvcmcxMjEyIiwga29yZzEyMTIpOworICAgICAgICAgICAgICAgICAgICAgICAgICBLQlVJTERfTU9ETkFNRSwga29yZzEyMTIpOwogCiAgICAgICAgIGlmIChlcnIpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAia29yZzEyMTI6IHVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwpAQCAtMjQ3Nyw3ICsyNDc3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICJrb3JnMTIxMiIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfa29yZzEyMTJfaWRzLAogCS5wcm9iZSA9IHNuZF9rb3JnMTIxMl9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2tvcmcxMjEyX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbG9sYS9sb2xhLmMgYi9zb3VuZC9wY2kvbG9sYS9sb2xhLmMKaW5kZXggMzRiMjQyOC4uM2U5MmU1YiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2xvbGEvbG9sYS5jCisrKyBiL3NvdW5kL3BjaS9sb2xhL2xvbGEuYwpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAJbG9sYV9zZXR1cF9hbGxfYW5hbG9nX2dhaW5zKGNoaXAsIFBMQVksIGZhbHNlKTsgLyogb3V0cHV0LCB1cGRhdGUgKi8KIH0KIAotc3RhdGljIGludCBsb2xhX3BhcnNlX3RyZWUoc3RydWN0IGxvbGEgKmNoaXApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBsb2xhX3BhcnNlX3RyZWUoc3RydWN0IGxvbGEgKmNoaXApCiB7CiAJdW5zaWduZWQgaW50IHZhbDsKIAlpbnQgbmlkLCBlcnI7CkBAIC02NDgsNyArNjQ4LDcgQEAKIAkJZ290byBlcnJvdXQ7CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIGxvbGFfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCURSVk5BTUUsIGNoaXApKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFNGWCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBlcnJvdXQ7CkBAIC03NzEsNyArNzcxLDcgQEAKIAogLyogcGNpX2RyaXZlciBkZWZpbml0aW9uICovCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gRFJWTkFNRSwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IGxvbGFfaWRzLAogCS5wcm9iZSA9IGxvbGFfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGxvbGFfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9sb2xhL2xvbGEuaCBiL3NvdW5kL3BjaS9sb2xhL2xvbGEuaAppbmRleCBkNTcwOGUyLi5mMGIxMDAwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhLmgKKysrIGIvc291bmQvcGNpL2xvbGEvbG9sYS5oCkBAIC00ODAsNyArNDgwLDcgQEAKIAogLyogY291bnQgdmFsdWVzIGluIHRoZSBWZW5kb3IgU3BlY2lmaWMgTWl4ZXIgV2lkZ2V0J3MgQXVkaW8gV2lkZ2V0IENhcGFiaWxpdGllcyAqLwogI2RlZmluZSBMT0xBX01JWEVSX1NSQ19JTlBVVF9QTEFZX1NFUEFSQVRJT04ocmVzKSAgICgocmVzID4+IDIpICYgMHgxZikKLSNkZWZpbmUgTE9MQV9NSVhFUl9ERVNUX1JFQ19PVVRQVVRfU0VQQVRBVElPTihyZXMpICAoKHJlcyA+PiA3KSAmIDB4MWYpCisjZGVmaW5lIExPTEFfTUlYRVJfREVTVF9SRUNfT1VUUFVUX1NFUEFSQVRJT04ocmVzKSAgKChyZXMgPj4gNykgJiAweDFmKQogCiBpbnQgbG9sYV9jb2RlY193cml0ZShzdHJ1Y3QgbG9sYSAqY2hpcCwgdW5zaWduZWQgaW50IG5pZCwgdW5zaWduZWQgaW50IHZlcmIsCiAJCSAgICAgdW5zaWduZWQgaW50IGRhdGEsIHVuc2lnbmVkIGludCBleHRkYXRhKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9sb2xhL2xvbGFfbWl4ZXIuYyBiL3NvdW5kL3BjaS9sb2xhL2xvbGFfbWl4ZXIuYwppbmRleCA1ZDUxOGYxLi42YjhkNjQ4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhX21peGVyLmMKKysrIGIvc291bmQvcGNpL2xvbGEvbG9sYV9taXhlci5jCkBAIC0xNDQsNDAgKzE0NCw2MSBAQAogCWNoaXAtPm1peGVyLmRlc3Rfc3RyZWFtX2lucyA9IGNoaXAtPnBjbVtDQVBUXS5udW1fc3RyZWFtczsKIAljaGlwLT5taXhlci5kZXN0X3BoeXNfb3V0cyA9IGNoaXAtPnBpbltQTEFZXS5udW1fcGluczsKIAotCS8qIG1peGVyIG1hdHJpeCBjYW4gaGF2ZSB1bnVzZWQgYXJlYXMgYmV0d2VlbiBQaHlzSW4gYW5kCisJLyogbWl4ZXIgbWF0cml4IG1heSBoYXZlIHVudXNlZCBhcmVhcyBiZXR3ZWVuIFBoeXNJbiBhbmQKIAkgKiBQbGF5IG9yIFJlY29yZCBhbmQgUGh5c091dCB6b25lcwogCSAqLwogCWNoaXAtPm1peGVyLnNyY19zdHJlYW1fb3V0X29mcyA9IGNoaXAtPm1peGVyLnNyY19waHlzX2lucyArCiAJCUxPTEFfTUlYRVJfU1JDX0lOUFVUX1BMQVlfU0VQQVJBVElPTih2YWwpOwogCWNoaXAtPm1peGVyLmRlc3RfcGh5c19vdXRfb2ZzID0gY2hpcC0+bWl4ZXIuZGVzdF9zdHJlYW1faW5zICsKLQkJTE9MQV9NSVhFUl9ERVNUX1JFQ19PVVRQVVRfU0VQQVRBVElPTih2YWwpOworCQlMT0xBX01JWEVSX0RFU1RfUkVDX09VVFBVVF9TRVBBUkFUSU9OKHZhbCk7CiAKLQkvKiBleGFtcGxlIDogTWl4ZXJNYXRyaXggb2YgTG9MYTg4MQotCSAqIDAtLS0tLS0tOC0tLS0tLTE2LS0tLS0tLTgtLS0tLS0xNgotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIHwgSU5QVVQgfCAgICAgICB8IElOUFVUIHwgICAgICAgfAotCSAqIHwgLT4gICAgfHVudXNlZCB8IC0+ICAgIHx1bnVzZWQgfAotCSAqIHwgUkVDT1JEfCAgICAgICB8IE9VVFBVVHwgICAgICAgfAotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIHx1bnVzZWQgfHVudXNlZCB8dW51c2VkIHx1bnVzZWQgfAotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIDE2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIHwgUExBWSAgfCAgICAgICB8IFBMQVkgIHwgICAgICAgfAotCSAqIHwgIC0+ICAgfHVudXNlZCB8IC0+ICAgIHx1bnVzZWQgfAotCSAqIHwgUkVDT1JEfCAgICAgICB8IE9VVFBVVHwgICAgICAgfAotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIDgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIHx1bnVzZWQgfHVudXNlZCB8dW51c2VkIHx1bnVzZWQgfAotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAotCSAqIDE2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8qIGV4YW1wbGUgOiBNaXhlck1hdHJpeCBvZiBMb0xhODgxIChMb0xhMTYxNjEgdXNlcyB1bnVzZWQgem9uZXMpCisJICogKy0rICAwLS0tLS0tLTgtLS0tLS0xNi0tLS0tLS04LS0tLS0tMTYKKwkgKiB8IHwgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorCSAqIHxzfCAgfCBJTlBVVCB8ICAgICAgIHwgSU5QVVQgfCAgICAgICB8CisJICogfCB8LT58ICAtPiAgIHx1bnVzZWQgfCAgLT4gICB8dW51c2VkIHwKKwkgKiB8cnwgIHxDQVBUVVJFfCAgICAgICB8IE9VVFBVVHwgICAgICAgfAorCSAqIHwgfCAgfCAgTUlYICB8ICAgICAgIHwgIE1JWCAgfCAgICAgICB8CisJICogfGN8ICA4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiB8IHwgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorCSAqIHwgfCAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisJICogfGd8ICB8dW51c2VkIHx1bnVzZWQgfHVudXNlZCB8dW51c2VkIHwKKwkgKiB8IHwgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorCSAqIHxhfCAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisJICogfCB8ICAxNi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiB8aXwgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorCSAqIHwgfCAgfCBQTEFZQkt8ICAgICAgIHwgUExBWUJLfCAgICAgICB8CisJICogfG58LT58ICAtPiAgIHx1bnVzZWQgfCAgLT4gICB8dW51c2VkIHwKKwkgKiB8IHwgIHxDQVBUVVJFfCAgICAgICB8IE9VVFBVVHwgICAgICAgfAorCSAqIHwgfCAgfCAgTUlYICB8ICAgICAgIHwgIE1JWCAgfCAgICAgICB8CisJICogfGF8ICA4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiB8cnwgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorCSAqIHxyfCAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisJICogfGF8ICB8dW51c2VkIHx1bnVzZWQgfHVudXNlZCB8dW51c2VkIHwKKwkgKiB8eXwgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfAorCSAqIHwgfCAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8CisJICogKysrICAxNi0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0KKwkgKiAgICAgICstLS1WLS0tLS0tLS0tLS0tLS0tVi0tLS0tLS0tLS0tKworCSAqICAgICAgfCAgZGVzdF9taXhfZ2Fpbl9lbmFibGUgYXJyYXkgICB8CisJICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKi8KKwkvKiBleGFtcGxlIDogTWl4ZXJNYXRyaXggb2YgTG9MYTI4MAorCSAqICstKyAgMC0tLS0tLS04LTIKKwkgKiB8IHwgIHwgICAgICAgfCB8CisJICogfHN8ICB8IElOUFVUIHwgfCAgICAgSU5QVVQKKwkgKiB8cnwtPnwgIC0+ICAgfCB8ICAgICAgLT4KKwkgKiB8Y3wgIHxDQVBUVVJFfCB8IDwtICBPVVRQVVQKKwkgKiB8IHwgIHwgIE1JWCAgfCB8ICAgICAgTUlYCisJICogfGd8ICA4LS0tLS0tLS0tLQorCSAqIHxhfCAgfCAgICAgICB8IHwKKwkgKiB8aXwgIHwgUExBWUJLfCB8ICAgICBQTEFZQkFDSworCSAqIHxufC0+fCAgLT4gICB8IHwgICAgICAtPgorCSAqIHwgfCAgfENBUFRVUkV8IHwgPC0gIE9VVFBVVAorCSAqIHxhfCAgfCAgTUlYICB8IHwgICAgICBNSVgKKwkgKiB8cnwgIDgtLS18LS0tLXwtCisJICogfHJ8ICArLS0tVi0tLS1WLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiB8YXwgIHwgZGVzdF9taXhfZ2Fpbl9lbmFibGUgYXJyYXkgfAorCSAqIHx5fCAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAJICovCiAJaWYgKGNoaXAtPm1peGVyLnNyY19zdHJlYW1fb3V0X29mcyA+IE1BWF9BVURJT19JTk9VVF9DT1VOVCB8fAogCSAgICBjaGlwLT5taXhlci5kZXN0X3BoeXNfb3V0X29mcyA+IE1BWF9TVFJFQU1fSU5fQ09VTlQpIHsKQEAgLTE5Miw2ICsyMTMsOSBAQAogCQkoKCgxVSA8PCBjaGlwLT5taXhlci5kZXN0X3BoeXNfb3V0cykgLSAxKQogCQkgPDwgY2hpcC0+bWl4ZXIuZGVzdF9waHlzX291dF9vZnMpOwogCisJc25kX3ByaW50ZGQoIk1peGVyIHNyY19tYXNrPSV4LCBkZXN0X21hc2s9JXhcbiIsCisJCSAgICBjaGlwLT5taXhlci5zcmNfbWFzaywgY2hpcC0+bWl4ZXIuZGVzdF9tYXNrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMDIsMTIgKzIyNiwxOSBAQAogCiAJaWYgKCEoY2hpcC0+bWl4ZXIuc3JjX21hc2sgJiAoMSA8PCBpZCkpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl3cml0ZXcoZ2FpbiwgJmNoaXAtPm1peGVyLmFycmF5LT5zcmNfZ2FpbltpZF0pOwogCW9sZHZhbCA9IHZhbCA9IHJlYWRsKCZjaGlwLT5taXhlci5hcnJheS0+c3JjX2dhaW5fZW5hYmxlKTsKIAlpZiAob24pCiAJCXZhbCB8PSAoMSA8PCBpZCk7CiAJZWxzZQogCQl2YWwgJj0gfigxIDw8IGlkKTsKKwkvKiB0ZXN0IGlmIHZhbHVlcyB1bmNoYW5nZWQgKi8KKwlpZiAoKHZhbCA9PSBvbGR2YWwpICYmCisJICAgIChnYWluID09IHJlYWR3KCZjaGlwLT5taXhlci5hcnJheS0+c3JjX2dhaW5baWRdKSkpCisJCXJldHVybiAwOworCisJc25kX3ByaW50ZGQoImxvbGFfbWl4ZXJfc2V0X3NyY19nYWluIChpZD0lZCwgZ2Fpbj0lZCkgZW5hYmxlPSV4XG4iLAorCQkJaWQsIGdhaW4sIHZhbCk7CisJd3JpdGV3KGdhaW4sICZjaGlwLT5taXhlci5hcnJheS0+c3JjX2dhaW5baWRdKTsKIAl3cml0ZWwodmFsLCAmY2hpcC0+bWl4ZXIuYXJyYXktPnNyY19nYWluX2VuYWJsZSk7CiAJbG9sYV9jb2RlY19mbHVzaChjaGlwKTsKIAkvKiBpbmZvcm0gbWljcm8tY29udHJvbGxlciBhYm91dCB0aGUgbmV3IHNvdXJjZSBnYWluICovCkBAIC0yNjksNiArMzAwLDcgQEAKIAkJCQlzcmMsIGRlc3QpOwogfQogCisjaWYgMCAvKiBub3QgdXNlZCAqLwogc3RhdGljIGludCBsb2xhX21peGVyX3NldF9kZXN0X2dhaW5zKHN0cnVjdCBsb2xhICpjaGlwLCB1bnNpZ25lZCBpbnQgaWQsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgc2hvcnQgKmdhaW5zKQogewpAQCAtMjg5LDYgKzMyMSw3IEBACiAJcmV0dXJuIGxvbGFfY29kZWNfd3JpdGUoY2hpcCwgY2hpcC0+bWl4ZXIubmlkLAogCQkJCUxPTEFfVkVSQl9TRVRfREVTVElOQVRJT05fR0FJTiwgaWQsIDApOwogfQorI2VuZGlmIC8qIG5vdCB1c2VkICovCiAKIC8qCiAgKi8KQEAgLTM3Niw2ICs0MDksOCBAQAogCQlyZXR1cm4gMDsKIAlpZiAoZXh0ZXJuYWxfY2FsbCkKIAkJbG9sYV9jb2RlY19mbHVzaChjaGlwKTsKKwlzbmRfcHJpbnRkZCgic2V0X2FuYWxvZ192b2x1bWUgKGRpcj0lZCBpZHg9JWQsIHZvbHVtZT0lZClcbiIsCisJCQlkaXIsIGlkeCwgdmFsKTsKIAllcnIgPSBsb2xhX2NvZGVjX3dyaXRlKGNoaXAsIHBpbi0+bmlkLAogCQkJICAgICAgIExPTEFfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgdmFsLCAwKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTQyNywyMyArNDYyLDQwIEBACiB7CiAJaW50IGk7CiAKLQkvKiBhbGwgc3JjIG9uICovCisJLyogYWxsIHNhbXBsZSByYXRlIGNvbnZlcnRlcnMgb24gKi8KIAlsb2xhX3NldF9zcmNfY29uZmlnKGNoaXAsICgxIDw8IGNoaXAtPnBpbltDQVBUXS5udW1fcGlucykgLSAxLCBmYWxzZSk7CiAKLQkvKiBjbGVhciBhbGwgbWF0cml4ICovCisJLyogY2xlYXIgYWxsIG1peGVyIG1hdHJpeCBzZXR0aW5ncyAqLwogCW1lbXNldF9pbyhjaGlwLT5taXhlci5hcnJheSwgMCwgc2l6ZW9mKCpjaGlwLT5taXhlci5hcnJheSkpOwotCS8qIHNldCBzcmMgZ2FpbiB0byAwZEIgKi8KKwkvKiBpbmZvcm0gZmlybXdhcmUgYWJvdXQgYWxsIHVwZGF0ZWQgbWF0cml4IGNvbHVtbnMgLSBjYXB0dXJlIHBhcnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bWl4ZXIuZGVzdF9zdHJlYW1faW5zOyBpKyspCisJCWxvbGFfY29kZWNfd3JpdGUoY2hpcCwgY2hpcC0+bWl4ZXIubmlkLAorCQkJCSBMT0xBX1ZFUkJfU0VUX0RFU1RJTkFUSU9OX0dBSU4sCisJCQkJIGksIDApOworCS8qIGluZm9ybSBmaXJtd2FyZSBhYm91dCBhbGwgdXBkYXRlZCBtYXRyaXggY29sdW1ucyAtIG91dHB1dCBwYXJ0ICovCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm1peGVyLmRlc3RfcGh5c19vdXRzOyBpKyspCisJCWxvbGFfY29kZWNfd3JpdGUoY2hpcCwgY2hpcC0+bWl4ZXIubmlkLAorCQkJCSBMT0xBX1ZFUkJfU0VUX0RFU1RJTkFUSU9OX0dBSU4sCisJCQkJIGNoaXAtPm1peGVyLmRlc3RfcGh5c19vdXRfb2ZzICsgaSwgMCk7CisKKwkvKiBzZXQgYWxsIGRpZ2l0YWwgaW5wdXQgc291cmNlIChtYXN0ZXIpIGdhaW5zIHRvIDBkQiAqLwogCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5taXhlci5zcmNfcGh5c19pbnM7IGkrKykKIAkJbG9sYV9taXhlcl9zZXRfc3JjX2dhaW4oY2hpcCwgaSwgMzM2LCB0cnVlKTsgLyogMGRCICovCisKKwkvKiBzZXQgYWxsIGRpZ2l0YWwgcGxheWJhY2sgc291cmNlIChtYXN0ZXIpIGdhaW5zIHRvIDBkQiAqLwogCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5taXhlci5zcmNfc3RyZWFtX291dHM7IGkrKykKIAkJbG9sYV9taXhlcl9zZXRfc3JjX2dhaW4oY2hpcCwKIAkJCQkJaSArIGNoaXAtPm1peGVyLnNyY19zdHJlYW1fb3V0X29mcywKIAkJCQkJMzM2LCB0cnVlKTsgLyogMGRCICovCi0JLyogc2V0IDE6MSBkZXN0IGdhaW4gKi8KKwkvKiBzZXQgZ2FpbiB2YWx1ZSAwZEIgZGlhZ29uYWxseSBpbiBtYXRyaXggLSBwYXJ0IElOUFVUIC0+IENBUFRVUkUgKi8KIAlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bWl4ZXIuZGVzdF9zdHJlYW1faW5zOyBpKyspIHsKIAkJaW50IHNyYyA9IGkgJSBjaGlwLT5taXhlci5zcmNfcGh5c19pbnM7CiAJCWxvbGFfbWl4ZXJfc2V0X21hcHBpbmdfZ2FpbihjaGlwLCBzcmMsIGksIDMzNiwgdHJ1ZSk7CiAJfQorCS8qIHNldCBnYWluIHZhbHVlIDBkQiBkaWFnb25hbGx5IGluIG1hdHJpeCAsIHBhcnQgUExBWUJBQ0sgLT4gT1VUUFVUCisJICogKExvTGEyODAgOiBwbGF5YmFjayBjaGFubmVsIDAsMiw0LDYgbGlua2VkIHRvIG91dHB1dCBjaGFubmVsIDApCisJICogKExvTGEyODAgOiBwbGF5YmFjayBjaGFubmVsIDEsMyw1LDcgbGlua2VkIHRvIG91dHB1dCBjaGFubmVsIDEpCisJICovCiAJZm9yIChpID0gMDsgaSA8IGNoaXAtPm1peGVyLnNyY19zdHJlYW1fb3V0czsgaSsrKSB7CiAJCWludCBzcmMgPSBjaGlwLT5taXhlci5zcmNfc3RyZWFtX291dF9vZnMgKyBpOwogCQlpbnQgZHN0ID0gY2hpcC0+bWl4ZXIuZGVzdF9waHlzX291dF9vZnMgKwpAQCAtNjkzLDYgKzc0NSw3IEBACiAJCQkgICBzbmRfY3RsX25ldzEoJmxvbGFfc3JjX2dhaW5fbWl4ZXIsIGNoaXApKTsKIH0KIAorI2lmIDAgLyogbm90IHVzZWQgKi8KIC8qCiAgKiBkZXN0aW5hdGlvbiBnYWluIChtYXRyaXgtbGlrZSkgbWl4ZXIKICAqLwpAQCAtNzgxLDYgKzgzNCw3IEBACiAJcmV0dXJuIHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsCiAJCQkgIHNuZF9jdGxfbmV3MSgmbG9sYV9kZXN0X2dhaW5fbWl4ZXIsIGNoaXApKTsKIH0KKyNlbmRpZiAvKiBub3QgdXNlZCAqLwogCiAvKgogICovCkBAIC03OTgsMTQgKzg1MiwxNiBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWVyciA9IGNyZWF0ZV9zcmNfZ2Fpbl9taXhlcihjaGlwLCBjaGlwLT5taXhlci5zcmNfcGh5c19pbnMsIDAsCi0JCQkJICAgICJMaW5lIFNvdXJjZSBHYWluIFZvbHVtZSIpOworCQkJCSAgICAiRGlnaXRhbCBDYXB0dXJlIFZvbHVtZSIpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWVyciA9IGNyZWF0ZV9zcmNfZ2Fpbl9taXhlcihjaGlwLCBjaGlwLT5taXhlci5zcmNfc3RyZWFtX291dHMsCiAJCQkJICAgIGNoaXAtPm1peGVyLnNyY19zdHJlYW1fb3V0X29mcywKLQkJCQkgICAgIlN0cmVhbSBTb3VyY2UgR2FpbiBWb2x1bWUiKTsKKwkJCQkgICAgIkRpZ2l0YWwgUGxheWJhY2sgVm9sdW1lIik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CisjaWYgMAorLyogRklYTUU6IGJ1Z2d5IG1peGVyIG1hdHJpeCBoYW5kbGluZyAqLwogCWVyciA9IGNyZWF0ZV9kZXN0X2dhaW5fbWl4ZXIoY2hpcCwKIAkJCQkgICAgIGNoaXAtPm1peGVyLnNyY19waHlzX2lucywgMCwKIAkJCQkgICAgIGNoaXAtPm1peGVyLmRlc3Rfc3RyZWFtX2lucywgMCwKQEAgLTgzNCw2ICs4OTAsNiBAQAogCQkJCSAgICAgIlN0cmVhbSBQbGF5YmFjayBWb2x1bWUiKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQorI2VuZGlmIC8qIEZJWE1FICovCiAJcmV0dXJuIGluaXRfbWl4ZXJfdmFsdWVzKGNoaXApOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2x4NjQ2NGVzL2x4NjQ2NGVzLmMgYi9zb3VuZC9wY2kvbHg2NDY0ZXMvbHg2NDY0ZXMuYwppbmRleCAxYmQ3YTU0Li4wNGFlODRiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbHg2NDY0ZXMvbHg2NDY0ZXMuYworKysgYi9zb3VuZC9wY2kvbHg2NDY0ZXMvbHg2NDY0ZXMuYwpAQCAtNzYyLDcgKzc2Miw2IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBseF9pbml0X2RzcChzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXApCiB7CiAJaW50IGVycjsKLQl1OCBtYWNfYWRkcmVzc1s2XTsKIAlpbnQgaTsKIAogCXNuZF9wcmludGRkKCItPmx4X2luaXRfZHNwXG4iKTsKQEAgLTc4NywxMSArNzg2LDExIEBACiAJLyoqIFx0b2RvIHRoZSBtYWMgYWRkcmVzcyBzaG91bGQgYmUgcmVhZHkgYnkgbm90LCBidXQgaXQgaXNuJ3QsCiAJICogIHNvIHdlIHdhaXQgZm9yIGl0ICovCiAJZm9yIChpID0gMDsgaSAhPSAxMDAwOyArK2kpIHsKLQkJZXJyID0gbHhfZHNwX2dldF9tYWMoY2hpcCwgbWFjX2FkZHJlc3MpOworCQllcnIgPSBseF9kc3BfZ2V0X21hYyhjaGlwKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JCWlmIChtYWNfYWRkcmVzc1swXSB8fCBtYWNfYWRkcmVzc1sxXSB8fCBtYWNfYWRkcmVzc1syXSB8fAotCQkgICAgbWFjX2FkZHJlc3NbM10gfHwgbWFjX2FkZHJlc3NbNF0gfHwgbWFjX2FkZHJlc3NbNV0pCisJCWlmIChjaGlwLT5tYWNfYWRkcmVzc1swXSB8fCBjaGlwLT5tYWNfYWRkcmVzc1sxXSB8fCBjaGlwLT5tYWNfYWRkcmVzc1syXSB8fAorCQkgICAgY2hpcC0+bWFjX2FkZHJlc3NbM10gfHwgY2hpcC0+bWFjX2FkZHJlc3NbNF0gfHwgY2hpcC0+bWFjX2FkZHJlc3NbNV0pCiAJCQlnb3RvIG1hY19yZWFkeTsKIAkJbXNsZWVwKDEpOwogCX0KQEAgLTgwMCw4ICs3OTksOCBAQAogbWFjX3JlYWR5OgogCXNuZF9wcmludGQoTFhQICJtYWMgYWRkcmVzcyByZWFkeSByZWFkIGFmdGVyOiAlZG1zXG4iLCBpKTsKIAlzbmRfcHJpbnRrKExYUCAibWFjIGFkZHJlc3M6ICUwMlguJTAyWC4lMDJYLiUwMlguJTAyWC4lMDJYXG4iLAotCQkgICBtYWNfYWRkcmVzc1swXSwgbWFjX2FkZHJlc3NbMV0sIG1hY19hZGRyZXNzWzJdLAotCQkgICBtYWNfYWRkcmVzc1szXSwgbWFjX2FkZHJlc3NbNF0sIG1hY19hZGRyZXNzWzVdKTsKKwkJICAgY2hpcC0+bWFjX2FkZHJlc3NbMF0sIGNoaXAtPm1hY19hZGRyZXNzWzFdLCBjaGlwLT5tYWNfYWRkcmVzc1syXSwKKwkJICAgY2hpcC0+bWFjX2FkZHJlc3NbM10sIGNoaXAtPm1hY19hZGRyZXNzWzRdLCBjaGlwLT5tYWNfYWRkcmVzc1s1XSk7CiAKIAllcnIgPSBseF9pbml0X2dldF92ZXJzaW9uX2ZlYXR1cmVzKGNoaXApOwogCWlmIChlcnIpCkBAIC0xMDMxLDcgKzEwMzAsNyBAQAogCWNoaXAtPnBvcnRfZHNwX2JhciA9IHBjaV9pb3JlbWFwX2JhcihwY2ksIDIpOwogCiAJZXJyID0gcmVxdWVzdF9pcnEocGNpLT5pcnEsIGx4X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQkgIGNhcmRfbmFtZSwgY2hpcCk7CisJCQkgIEtCVUlMRF9NT0ROQU1FLCBjaGlwKTsKIAlpZiAoZXJyKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgTFhQICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJZ290byByZXF1ZXN0X2lycV9mYWlsZWQ7CkBAIC0xMTA4LDggKzExMDcsMTQgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAibHg2NDY0ZXMiKTsKLQlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiRGlnaWdyYW0gTFg2NDY0RVMiKTsKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiTFg2NDY0RVMiKTsKKwlzcHJpbnRmKGNhcmQtPmlkLCAiTFg2NDY0RVNfJTAyWCUwMlglMDJYIiwKKwkJY2hpcC0+bWFjX2FkZHJlc3NbM10sIGNoaXAtPm1hY19hZGRyZXNzWzRdLCBjaGlwLT5tYWNfYWRkcmVzc1s1XSk7CisKKwlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIkxYNjQ2NEVTICUwMlguJTAyWC4lMDJYLiUwMlguJTAyWC4lMDJYIiwKKwkJY2hpcC0+bWFjX2FkZHJlc3NbMF0sIGNoaXAtPm1hY19hZGRyZXNzWzFdLCBjaGlwLT5tYWNfYWRkcmVzc1syXSwKKwkJY2hpcC0+bWFjX2FkZHJlc3NbM10sIGNoaXAtPm1hY19hZGRyZXNzWzRdLCBjaGlwLT5tYWNfYWRkcmVzc1s1XSk7CisKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHgsIDB4JXAsIGlycSAlaSIsCiAJCWNhcmQtPnNob3J0bmFtZSwgY2hpcC0+cG9ydF9wbHgsCiAJCWNoaXAtPnBvcnRfZHNwX2JhciwgY2hpcC0+aXJxKTsKQEAgLTExMzcsNyArMTE0Miw3IEBACiAKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICAgICAiRGlnaWdyYW0gTFg2NDY0RVMiLAorCS5uYW1lID0gICAgIEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9seDY0NjRlc19pZHMsCiAJLnByb2JlID0gICAgc25kX2x4NjQ2NGVzX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfbHg2NDY0ZXNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5oIGIvc291bmQvcGNpL2x4NjQ2NGVzL2x4NjQ2NGVzLmgKaW5kZXggYWVhNjIxZS4uZTJhMTI0YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2x4NjQ2NGVzL2x4NjQ2NGVzLmgKKysrIGIvc291bmQvcGNpL2x4NjQ2NGVzL2x4NjQ2NGVzLmgKQEAgLTY5LDYgKzY5LDggQEAKIAlzdHJ1Y3QgcGNpX2RldiAgICAgICAgICpwY2k7CiAJaW50CQkJaXJxOwogCisJdTgJCQltYWNfYWRkcmVzc1s2XTsKKwogCXNwaW5sb2NrX3QJCWxvY2s7ICAgICAgICAvKiBpbnRlcnJ1cHQgc3BpbmxvY2sgKi8KIAlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICBzZXR1cF9tdXRleDsgLyogbXV0ZXggdXNlZCBpbiBod19wYXJhbXMsIG9wZW4KIAkJCQkJICAgICAgKiBhbmQgY2xvc2UgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9seDY0NjRlcy9seF9jb3JlLmMgYi9zb3VuZC9wY2kvbHg2NDY0ZXMvbHhfY29yZS5jCmluZGV4IDYxN2Y5OGIuLjVjODcxN2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9seDY0NjRlcy9seF9jb3JlLmMKKysrIGIvc291bmQvcGNpL2x4NjQ2NGVzL2x4X2NvcmUuYwpAQCAtNDI0LDcgKzQyNCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGx4X2RzcF9nZXRfbWFjKHN0cnVjdCBseDY0NjRlcyAqY2hpcCwgdTggKm1hY19hZGRyZXNzKQoraW50IGx4X2RzcF9nZXRfbWFjKHN0cnVjdCBseDY0NjRlcyAqY2hpcCkKIHsKIAl1MzIgbWFjbXNiLCBtYWNsc2I7CiAKQEAgLTQzMiwxMiArNDMyLDEyIEBACiAJbWFjbHNiID0gbHhfZHNwX3JlZ19yZWFkKGNoaXAsIGVSZWdfQURNQUNFU0xTQikgJiAweDAwRkZGRkZGOwogCiAJLyogdG9kbzogZW5kaWFuZXNzIGhhbmRsaW5nICovCi0JbWFjX2FkZHJlc3NbNV0gPSAoKHU4ICopKCZtYWNsc2IpKVswXTsKLQltYWNfYWRkcmVzc1s0XSA9ICgodTggKikoJm1hY2xzYikpWzFdOwotCW1hY19hZGRyZXNzWzNdID0gKCh1OCAqKSgmbWFjbHNiKSlbMl07Ci0JbWFjX2FkZHJlc3NbMl0gPSAoKHU4ICopKCZtYWNtc2IpKVswXTsKLQltYWNfYWRkcmVzc1sxXSA9ICgodTggKikoJm1hY21zYikpWzFdOwotCW1hY19hZGRyZXNzWzBdID0gKCh1OCAqKSgmbWFjbXNiKSlbMl07CisJY2hpcC0+bWFjX2FkZHJlc3NbNV0gPSAoKHU4ICopKCZtYWNsc2IpKVswXTsKKwljaGlwLT5tYWNfYWRkcmVzc1s0XSA9ICgodTggKikoJm1hY2xzYikpWzFdOworCWNoaXAtPm1hY19hZGRyZXNzWzNdID0gKCh1OCAqKSgmbWFjbHNiKSlbMl07CisJY2hpcC0+bWFjX2FkZHJlc3NbMl0gPSAoKHU4ICopKCZtYWNtc2IpKVswXTsKKwljaGlwLT5tYWNfYWRkcmVzc1sxXSA9ICgodTggKikoJm1hY21zYikpWzFdOworCWNoaXAtPm1hY19hZGRyZXNzWzBdID0gKCh1OCAqKSgmbWFjbXNiKSlbMl07CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9seDY0NjRlcy9seF9jb3JlLmggYi9zb3VuZC9wY2kvbHg2NDY0ZXMvbHhfY29yZS5oCmluZGV4IDZiZDljYmIuLjFkZDU2MjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9seDY0NjRlcy9seF9jb3JlLmgKKysrIGIvc291bmQvcGNpL2x4NjQ2NGVzL2x4X2NvcmUuaApAQCAtMTE2LDcgKzExNiw3IEBACiBpbnQgbHhfZHNwX2dldF9jbG9ja19mcmVxdWVuY3koc3RydWN0IGx4NjQ2NGVzICpjaGlwLCB1MzIgKnJmcmVxKTsKIGludCBseF9kc3Bfc2V0X2dyYW51bGFyaXR5KHN0cnVjdCBseDY0NjRlcyAqY2hpcCwgdTMyIGdyYW4pOwogaW50IGx4X2RzcF9yZWFkX2FzeW5jX2V2ZW50cyhzdHJ1Y3QgbHg2NDY0ZXMgKmNoaXAsIHUzMiAqZGF0YSk7Ci1pbnQgbHhfZHNwX2dldF9tYWMoc3RydWN0IGx4NjQ2NGVzICpjaGlwLCB1OCAqbWFjX2FkZHJlc3MpOworaW50IGx4X2RzcF9nZXRfbWFjKHN0cnVjdCBseDY0NjRlcyAqY2hpcCk7CiAKIAogLyogbG93LWxldmVsIHBpcGUgaGFuZGxpbmcgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9tYWVzdHJvMy5jIGIvc291bmQvcGNpL21hZXN0cm8zLmMKaW5kZXggM2M0MGQ3Mi4uMDM3ODEyNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21hZXN0cm8zLmMKKysrIGIvc291bmQvcGNpL21hZXN0cm8zLmMKQEAgLTg1MCwxMSArODUwLDEwIEBACiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCWNoYXIgcGh5c1s2NF07CQkJLyogcGh5c2ljYWwgZGV2aWNlIHBhdGggKi8KICNlbHNlCi0Jc3BpbmxvY2tfdCBhYzk3X2xvY2s7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqbWFzdGVyX3N3aXRjaDsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICptYXN0ZXJfdm9sdW1lOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBod3ZvbF90cTsKICNlbmRpZgorCXN0cnVjdCB3b3JrX3N0cnVjdCBod3ZvbF93b3JrOwogCiAJdW5zaWduZWQgaW50IGluX3N1c3BlbmQ7CiAKQEAgLTE2MDksMTMgKzE2MDgsMTAgQEAKICAgICh3aXRob3V0IHdyYXAgYXJvdW5kKSBpbiByZXNwb25zZSB0byB2b2x1bWUgYnV0dG9uIHByZXNzZXMgYW5kIHRoZW4KICAgIGdlbmVyYXRpbmcgYW4gaW50ZXJydXB0LiBUaGUgcGFpciBvZiBjb3VudGVycyBpcyBzdG9yZWQgaW4gYml0cyAxLTMgYW5kIDUtNwogICAgb2YgYSBieXRlIHdpZGUgcmVnaXN0ZXIuIFRoZSBtZWFuaW5nIG9mIGJpdHMgMCBhbmQgNCBpcyB1bmtub3duLiAqLwotc3RhdGljIHZvaWQgc25kX20zX3VwZGF0ZV9od192b2x1bWUodW5zaWduZWQgbG9uZyBwcml2YXRlX2RhdGEpCitzdGF0aWMgdm9pZCBzbmRfbTNfdXBkYXRlX2h3X3ZvbHVtZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHNuZF9tMyAqY2hpcCA9IChzdHJ1Y3Qgc25kX20zICopIHByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX20zICpjaGlwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbmRfbTMsIGh3dm9sX3dvcmspOwogCWludCB4LCB2YWw7Ci0jaWZuZGVmIENPTkZJR19TTkRfTUFFU1RSTzNfSU5QVVQKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2VuZGlmCiAKIAkvKiBGaWd1cmUgb3V0IHdoaWNoIHZvbHVtZSBjb250cm9sIGJ1dHRvbiB3YXMgcHVzaGVkLAogCSAgIGJhc2VkIG9uIGRpZmZlcmVuY2VzIGZyb20gdGhlIGRlZmF1bHQgcmVnaXN0ZXIKQEAgLTE2NDUsMjEgKzE2NDEsMTMgQEAKIAlpZiAoIWNoaXAtPm1hc3Rlcl9zd2l0Y2ggfHwgIWNoaXAtPm1hc3Rlcl92b2x1bWUpCiAJCXJldHVybjsKIAotCS8qIEZJWE1FOiB3ZSBjYW4ndCBjYWxsIHNuZF9hYzk3XyogZnVuY3Rpb25zIHNpbmNlIGhlcmUgaXMgaW4gdGFza2xldC4gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+YWM5N19sb2NrLCBmbGFncyk7Ci0KLQl2YWwgPSBjaGlwLT5hYzk3LT5yZWdzW0FDOTdfTUFTVEVSX1ZPTF07CisJdmFsID0gc25kX2FjOTdfcmVhZChjaGlwLT5hYzk3LCBBQzk3X01BU1RFUik7CiAJc3dpdGNoICh4KSB7CiAJY2FzZSAweDg4OgogCQkvKiBUaGUgY291bnRlcnMgaGF2ZSBub3QgY2hhbmdlZCwgeWV0IHdlJ3ZlIHJlY2VpdmVkIGEgSFYKIAkJICAgaW50ZXJydXB0LiBBY2NvcmRpbmcgdG8gdGVzdHMgcnVuIGJ5IHZhcmlvdXMgcGVvcGxlIHRoaXMKIAkJICAgaGFwcGVucyB3aGVuIHByZXNzaW5nIHRoZSBtdXRlIGJ1dHRvbi4gKi8KIAkJdmFsIF49IDB4ODAwMDsKLQkJY2hpcC0+YWM5Ny0+cmVnc1tBQzk3X01BU1RFUl9WT0xdID0gdmFsOwotCQlvdXR3KHZhbCwgY2hpcC0+aW9iYXNlICsgQ09ERUNfREFUQSk7Ci0JCW91dGIoQUM5N19NQVNURVJfVk9MLCBjaGlwLT5pb2Jhc2UgKyBDT0RFQ19DT01NQU5EKTsKLQkJc25kX2N0bF9ub3RpZnkoY2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCi0JCQkgICAgICAgJmNoaXAtPm1hc3Rlcl9zd2l0Y2gtPmlkKTsKIAkJYnJlYWs7CiAJY2FzZSAweGFhOgogCQkvKiBjb3VudGVycyBpbmNyZWFzZWQgYnkgMSAtPiB2b2x1bWUgdXAgKi8KQEAgLTE2NjcsMTEgKzE2NTUsNiBAQAogCQkJdmFsLS07CiAJCWlmICgodmFsICYgMHg3ZjAwKSA+IDApCiAJCQl2YWwgLT0gMHgwMTAwOwotCQljaGlwLT5hYzk3LT5yZWdzW0FDOTdfTUFTVEVSX1ZPTF0gPSB2YWw7Ci0JCW91dHcodmFsLCBjaGlwLT5pb2Jhc2UgKyBDT0RFQ19EQVRBKTsKLQkJb3V0YihBQzk3X01BU1RFUl9WT0wsIGNoaXAtPmlvYmFzZSArIENPREVDX0NPTU1BTkQpOwotCQlzbmRfY3RsX25vdGlmeShjaGlwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwKLQkJCSAgICAgICAmY2hpcC0+bWFzdGVyX3ZvbHVtZS0+aWQpOwogCQlicmVhazsKIAljYXNlIDB4NjY6CiAJCS8qIGNvdW50ZXJzIGRlY3JlYXNlZCBieSAxIC0+IHZvbHVtZSBkb3duICovCkBAIC0xNjc5LDE0ICsxNjYyLDExIEBACiAJCQl2YWwrKzsKIAkJaWYgKCh2YWwgJiAweDdmMDApIDwgMHgxZjAwKQogCQkJdmFsICs9IDB4MDEwMDsKLQkJY2hpcC0+YWM5Ny0+cmVnc1tBQzk3X01BU1RFUl9WT0xdID0gdmFsOwotCQlvdXR3KHZhbCwgY2hpcC0+aW9iYXNlICsgQ09ERUNfREFUQSk7Ci0JCW91dGIoQUM5N19NQVNURVJfVk9MLCBjaGlwLT5pb2Jhc2UgKyBDT0RFQ19DT01NQU5EKTsKLQkJc25kX2N0bF9ub3RpZnkoY2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCi0JCQkgICAgICAgJmNoaXAtPm1hc3Rlcl92b2x1bWUtPmlkKTsKIAkJYnJlYWs7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmFjOTdfbG9jaywgZmxhZ3MpOworCWlmIChzbmRfYWM5N191cGRhdGUoY2hpcC0+YWM5NywgQUM5N19NQVNURVIsIHZhbCkpCisJCXNuZF9jdGxfbm90aWZ5KGNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAgICAgICZjaGlwLT5tYXN0ZXJfc3dpdGNoLT5pZCk7CiAjZWxzZQogCWlmICghY2hpcC0+aW5wdXRfZGV2KQogCQlyZXR1cm47CkBAIC0xNzMwLDExICsxNzEwLDcgQEAKIAkJcmV0dXJuIElSUV9OT05FOwogCiAJaWYgKHN0YXR1cyAmIEhWX0lOVF9QRU5ESU5HKQotI2lmZGVmIENPTkZJR19TTkRfTUFFU1RSTzNfSU5QVVQKLQkJc25kX20zX3VwZGF0ZV9od192b2x1bWUoKHVuc2lnbmVkIGxvbmcpY2hpcCk7Ci0jZWxzZQotCQl0YXNrbGV0X3NjaGVkdWxlKCZjaGlwLT5od3ZvbF90cSk7Ci0jZW5kaWYKKwkJc2NoZWR1bGVfd29yaygmY2hpcC0+aHd2b2xfd29yayk7CiAKIAkvKgogCSAqIGFjayBhbiBhc3NwIGludCBpZiBpdHMgcnVubmluZwpAQCAtMjAwMCwyNCArMTk3NiwxNCBAQAogc25kX20zX2FjOTdfcmVhZChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZykKIHsKIAlzdHJ1Y3Qgc25kX20zICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOwotI2lmbmRlZiBDT05GSUdfU05EX01BRVNUUk8zX0lOUFVUCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLSNlbmRpZgogCXVuc2lnbmVkIHNob3J0IGRhdGEgPSAweGZmZmY7CiAKIAlpZiAoc25kX20zX2FjOTdfd2FpdChjaGlwKSkKIAkJZ290byBmYWlsOwotI2lmbmRlZiBDT05GSUdfU05EX01BRVNUUk8zX0lOUFVUCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmFjOTdfbG9jaywgZmxhZ3MpOwotI2VuZGlmCiAJc25kX20zX291dGIoY2hpcCwgMHg4MCB8IChyZWcgJiAweDdmKSwgQ09ERUNfQ09NTUFORCk7CiAJaWYgKHNuZF9tM19hYzk3X3dhaXQoY2hpcCkpCi0JCWdvdG8gZmFpbF91bmxvY2s7CisJCWdvdG8gZmFpbDsKIAlkYXRhID0gc25kX20zX2ludyhjaGlwLCBDT0RFQ19EQVRBKTsKLWZhaWxfdW5sb2NrOgotI2lmbmRlZiBDT05GSUdfU05EX01BRVNUUk8zX0lOUFVUCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+YWM5N19sb2NrLCBmbGFncyk7Ci0jZW5kaWYKIGZhaWw6CiAJcmV0dXJuIGRhdGE7CiB9CkBAIC0yMDI2LDIwICsxOTkyLDExIEBACiBzbmRfbTNfYWM5N193cml0ZShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgdmFsKQogewogCXN0cnVjdCBzbmRfbTMgKmNoaXAgPSBhYzk3LT5wcml2YXRlX2RhdGE7Ci0jaWZuZGVmIENPTkZJR19TTkRfTUFFU1RSTzNfSU5QVVQKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2VuZGlmCiAKIAlpZiAoc25kX20zX2FjOTdfd2FpdChjaGlwKSkKIAkJcmV0dXJuOwotI2lmbmRlZiBDT05GSUdfU05EX01BRVNUUk8zX0lOUFVUCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmFjOTdfbG9jaywgZmxhZ3MpOwotI2VuZGlmCiAJc25kX20zX291dHcoY2hpcCwgdmFsLCBDT0RFQ19EQVRBKTsKIAlzbmRfbTNfb3V0YihjaGlwLCByZWcgJiAweDdmLCBDT0RFQ19DT01NQU5EKTsKLSNpZm5kZWYgQ09ORklHX1NORF9NQUVTVFJPM19JTlBVVAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmFjOTdfbG9jaywgZmxhZ3MpOwotI2VuZGlmCiB9CiAKIApAQCAtMjQ1OCw2ICsyNDE1LDcgQEAKIAlzdHJ1Y3QgbTNfZG1hICpzOwogCWludCBpOwogCisJY2FuY2VsX3dvcmtfc3luYygmY2hpcC0+aHd2b2xfd29yayk7CiAjaWZkZWYgQ09ORklHX1NORF9NQUVTVFJPM19JTlBVVAogCWlmIChjaGlwLT5pbnB1dF9kZXYpCiAJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGNoaXAtPmlucHV0X2Rldik7CkBAIC0yNTExLDYgKzI0NjksNyBAQAogCQlyZXR1cm4gMDsKIAogCWNoaXAtPmluX3N1c3BlbmQgPSAxOworCWNhbmNlbF93b3JrX3N5bmMoJmNoaXAtPmh3dm9sX3dvcmspOwogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKIAlzbmRfcGNtX3N1c3BlbmRfYWxsKGNoaXAtPnBjbSk7CiAJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKQEAgLTI2NjcsOSArMjYyNiw2IEBACiAJfQogCiAJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKLSNpZm5kZWYgQ09ORklHX1NORF9NQUVTVFJPM19JTlBVVAotCXNwaW5fbG9ja19pbml0KCZjaGlwLT5hYzk3X2xvY2spOwotI2VuZGlmCiAKIAlzd2l0Y2ggKHBjaS0+ZGV2aWNlKSB7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0VTU19BTExFR1JPOgpAQCAtMjY4Myw2ICsyNjM5LDcgQEAKIAljaGlwLT5jYXJkID0gY2FyZDsKIAljaGlwLT5wY2kgPSBwY2k7CiAJY2hpcC0+aXJxID0gLTE7CisJSU5JVF9XT1JLKCZjaGlwLT5od3ZvbF93b3JrLCBzbmRfbTNfdXBkYXRlX2h3X3ZvbHVtZSk7CiAKIAljaGlwLT5leHRlcm5hbF9hbXAgPSBlbmFibGVfYW1wOwogCWlmIChhbXBfZ3BpbyA+PSAwICYmIGFtcF9ncGlvIDw9IDB4MGYpCkBAIC0yNzUyLDEyICsyNzA5LDggQEAKIAogCXNuZF9tM19odl9pbml0KGNoaXApOwogCi0jaWZuZGVmIENPTkZJR19TTkRfTUFFU1RSTzNfSU5QVVQKLQl0YXNrbGV0X2luaXQoJmNoaXAtPmh3dm9sX3RxLCBzbmRfbTNfdXBkYXRlX2h3X3ZvbHVtZSwgKHVuc2lnbmVkIGxvbmcpY2hpcCk7Ci0jZW5kaWYKLQogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX20zX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQljYXJkLT5kcml2ZXIsIGNoaXApKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9tM19mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI4ODUsNyArMjgzOCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiTWFlc3RybzMiLAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX20zX2lkcywKIAkucHJvYmUgPSBzbmRfbTNfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9tM19yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMKaW5kZXggNmMzZmQ0ZC4uZGJlZTU5OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCkBAIC0xMjY4LDcgKzEyNjgsNyBAQAogCX0KIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX21peGFydF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJQ0FSRF9OQU1FLCBtZ3IpKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgbWdyKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX21peGFydF9mcmVlKG1ncik7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0xMzgxLDcgKzEzODEsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIkRpZ2lncmFtIG1pWGFydCIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfbWl4YXJ0X2lkcywKIAkucHJvYmUgPSBzbmRfbWl4YXJ0X3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfbWl4YXJ0X3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCmluZGV4IDVhNjA0OTIuLjgzZWE3YTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCisrKyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCkBAIC00NjUsNyArNDY1LDcgQEAKIAltdXRleF9sb2NrKCZjaGlwLT5pcnFfbXV0ZXgpOwogCWlmIChjaGlwLT5pcnEgPCAwKSB7CiAJCWlmIChyZXF1ZXN0X2lycShjaGlwLT5wY2ktPmlycSwgY2hpcC0+aW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCQljaGlwLT5jYXJkLT5kcml2ZXIsIGNoaXApKSB7CisJCQkJS0JVSUxEX01PRE5BTUUsIGNoaXApKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIGNoaXAtPnBjaS0+aXJxKTsKIAkJCW11dGV4X3VubG9jaygmY2hpcC0+aXJxX211dGV4KTsKIAkJCXJldHVybiAtRUJVU1k7CkBAIC0xNzQzLDcgKzE3NDMsNyBAQAogCiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiTmVvTWFnaWMgMjU2IiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9ubTI1Nl9pZHMsCiAJLnByb2JlID0gc25kX25tMjU2X3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfbm0yNTZfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbi5jCmluZGV4IGQ3ZThkZGQuLjIxOGQ5ODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuLmMKKysrIGIvc291bmQvcGNpL294eWdlbi9veHlnZW4uYwpAQCAtODU5LDcgKzg1OSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBveHlnZW5fZHJpdmVyID0gewotCS5uYW1lID0gIkNNSTg3ODgiLAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gb3h5Z2VuX2lkcywKIAkucHJvYmUgPSBnZW5lcmljX294eWdlbl9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aob3h5Z2VuX3BjaV9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fbGliLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwppbmRleCA3MGI3Mzk4Li44MjMxMWZjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwpAQCAtNjU1LDcgKzY1NSw3IEBACiAJY2hpcC0+bW9kZWwuaW5pdChjaGlwKTsKIAogCWVyciA9IHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBveHlnZW5faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCSAgRFJJVkVSLCBjaGlwKTsKKwkJCSAgS0JVSUxEX01PRE5BTUUsIGNoaXApOwogCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBncmFiIGludGVycnVwdCAlZFxuIiwgcGNpLT5pcnEpOwogCQlnb3RvIGVycl9jYXJkOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fcGNtLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9wY20uYwppbmRleCBkNTUzM2UzLi5jYzBiY2Q5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9wY20uYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9wY20uYwpAQCAtMTY4LDEyICsxNjgsNiBAQAogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQotCWlmIChjaGFubmVsID09IFBDTV9NVUxUSUNIKSB7Ci0JCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgKLQkJCShydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1RJTUUsIDAsIDgxOTIwMDApOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQogCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKIAljaGlwLT5zdHJlYW1zW2NoYW5uZWxdID0gc3Vic3RyZWFtOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL3ZpcnR1b3NvLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3ZpcnR1b3NvLmMKaW5kZXggNDY5MDEwYS4uNzczZGI3OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi92aXJ0dW9zby5jCisrKyBiL3NvdW5kL3BjaS9veHlnZW4vdmlydHVvc28uYwpAQCAtODgsNyArODgsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgeG9uYXJfZHJpdmVyID0gewotCS5uYW1lID0gIkFWMjAwIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHhvbmFyX2lkcywKIAkucHJvYmUgPSB4b25hcl9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aob3h5Z2VuX3BjaV9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi94b25hcl9wY20xNzl4LmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX3BjbTE3OXguYwppbmRleCA1NGNhZDM4Li4zMmQwOTZjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX3BjbTE3OXguYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX3BjbTE3OXguYwpAQCAtMzI3LDggKzMyNywxMCBAQAogewogCXN0cnVjdCB4b25hcl9wY20xNzl4ICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKIAotCWRhdGEtPnBjbTE3OTZfcmVnc1swXVsxOCAtIFBDTTE3OTZfUkVHX0JBU0VdID0gUENNMTc5Nl9NVVRFIHwKKwlkYXRhLT5wY20xNzk2X3JlZ3NbMF1bMTggLSBQQ00xNzk2X1JFR19CQVNFXSA9CiAJCVBDTTE3OTZfRE1GX0RJU0FCTEVEIHwgUENNMTc5Nl9GTVRfMjRfSTJTIHwgUENNMTc5Nl9BVExEOworCWlmICghZGF0YS0+YnJva2VuX2kyYykKKwkJZGF0YS0+cGNtMTc5Nl9yZWdzWzBdWzE4IC0gUENNMTc5Nl9SRUdfQkFTRV0gfD0gUENNMTc5Nl9NVVRFOwogCWRhdGEtPnBjbTE3OTZfcmVnc1swXVsxOSAtIFBDTTE3OTZfUkVHX0JBU0VdID0KIAkJUENNMTc5Nl9GTFRfU0hBUlAgfCBQQ00xNzk2X0FUU18xOwogCWRhdGEtPnBjbTE3OTZfcmVnc1swXVsyMCAtIFBDTTE3OTZfUkVHX0JBU0VdID0KQEAgLTExMjMsNiArMTEyNSw3IEBACiAJCQljaGlwLT5tb2RlbC5jb250cm9sX2ZpbHRlciA9IHhvbmFyX3N0X2g2X2NvbnRyb2xfZmlsdGVyOwogCQkJY2hpcC0+bW9kZWwuZGFjX2NoYW5uZWxzX3BjbSA9IDg7CiAJCQljaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHNfbWl4ZXIgPSA4OworCQkJY2hpcC0+bW9kZWwuZGFjX3ZvbHVtZV9taW4gPSAyNTU7CiAJCQljaGlwLT5tb2RlbC5kYWNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoMjU2LCAxMjgsIDEyOCk7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3BjeGhyL3BjeGhyLmMgYi9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYwppbmRleCA5NWNmZGUyLi4wNDY1NzhkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYworKysgYi9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYwpAQCAtMTUwMSw3ICsxNTAxLDcgQEAKIAltZ3ItPmlycSA9IC0xOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBwY3hocl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJY2FyZF9uYW1lLCBtZ3IpKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgbWdyKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJcGN4aHJfZnJlZShtZ3IpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTYwOCw3ICsxNjA4LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICJEaWdpZ3JhbSBwY3hociIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBwY3hocl9pZHMsCiAJLnByb2JlID0gcGN4aHJfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHBjeGhyX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMgYi9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKaW5kZXggYWQ1MjAyZS4uZTM0YWUxNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCisrKyBiL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYwpAQCAtMTg5MCw3ICsxODkwLDcgQEAKIAlVTlNFVF9BSUUoaHdwb3J0KTsKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3JpcHRpZGVfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCSJSSVBUSURFIiwgY2hpcCkpIHsKKwkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJSaXB0aWRlOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsCiAJCQkgICBwY2ktPmlycSk7CiAJCXNuZF9yaXB0aWRlX2ZyZWUoY2hpcCk7CkBAIC0yMTc2LDcgKzIxNzYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIlJJUFRJREUiLAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX3JpcHRpZGVfaWRzLAogCS5wcm9iZSA9IHNuZF9jYXJkX3JpcHRpZGVfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9jYXJkX3JpcHRpZGVfcmVtb3ZlKSwKQEAgLTIxODgsNyArMjE4OCw3IEBACiAKICNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgam95c3RpY2tfZHJpdmVyID0gewotCS5uYW1lID0gIlJpcHRpZGUgSm95c3RpY2siLAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUgIi1qb3lzdGljayIsCiAJLmlkX3RhYmxlID0gc25kX3JpcHRpZGVfam95c3RpY2tfaWRzLAogCS5wcm9iZSA9IHNuZF9yaXB0aWRlX2pveXN0aWNrX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfcmlwdGlkZV9qb3lzdGlja19yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTMyLmMgYi9zb3VuZC9wY2kvcm1lMzIuYwppbmRleCAzYzA0NTI0Li42YmU3N2EyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lMzIuYworKysgYi9zb3VuZC9wY2kvcm1lMzIuYwpAQCAtMTM1NSw3ICsxMzU1LDcgQEAKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9ybWUzMl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJIlJNRTMyIiwgcm1lMzIpKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgcm1lMzIpKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTE5ODUsNyArMTk4NSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPQkJIlJNRSBEaWdpMzIiLAorCS5uYW1lID0JCUtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9CXNuZF9ybWUzMl9pZHMsCiAJLnByb2JlID0Jc25kX3JtZTMyX3Byb2JlLAogCS5yZW1vdmUgPQlfX2RldmV4aXRfcChzbmRfcm1lMzJfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5Ni5jIGIvc291bmQvcGNpL3JtZTk2LmMKaW5kZXggOWZmMjQ3Zi4uNDA5ZTViOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2LmMKKysrIGIvc291bmQvcGNpL3JtZTk2LmMKQEAgLTE1NjEsNyArMTU2MSw3IEBACiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfcm1lOTZfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCSJSTUU5NiIsIHJtZTk2KSkgeworCQkJS0JVSUxEX01PRE5BTUUsIHJtZTk2KSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yMzk2LDcgKzIzOTYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIlJNRSBEaWdpOTYiLAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX3JtZTk2X2lkcywKIAkucHJvYmUgPSBzbmRfcm1lOTZfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9ybWU5Nl9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCmluZGV4IDJkODMzMjQuLjFjNmQxZTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKQEAgLTU0ODIsNyArNTQ4Miw3IEBACiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfaGRzcF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJImhkc3AiLCBoZHNwKSkgeworCQkJS0JVSUxEX01PRE5BTUUsIGhkc3ApKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIkhhbW1lcmZhbGwtRFNQOiB1bmFibGUgdG8gdXNlIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTU2MzcsNyArNTYzNyw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAgICAgIlJNRSBIYW1tZXJmYWxsIERTUCIsCisJLm5hbWUgPSAgICAgS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX2hkc3BfaWRzLAogCS5wcm9iZSA9ICAgIHNuZF9oZHNwX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfaGRzcF9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKaW5kZXggOTQ5NjkxYS4uYWYxMzBlZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCkBAIC01MjEsNiArNTIxLDcgQEAKICNkZWZpbmUgSERTUE1fRE1BX0FSRUFfS0lMT0JZVEVTIChIRFNQTV9ETUFfQVJFQV9CWVRFUy8xMDI0KQogCiAvKiByZXZpc2lvbnMgPj0gMjMwIGluZGljYXRlIEFFUzMyIGNhcmQgKi8KKyNkZWZpbmUgSERTUE1fTUFESV9PTERfUkVWCTIwNwogI2RlZmluZSBIRFNQTV9NQURJX1JFVgkJMjEwCiAjZGVmaW5lIEhEU1BNX1JBWURBVF9SRVYJMjExCiAjZGVmaW5lIEhEU1BNX0FJT19SRVYJCTIxMgpAQCAtODk1LDExICs4OTYsMTEgQEAKIAl1bnNpZ25lZCBjaGFyIG1heF9jaGFubmVsc19pbjsKIAl1bnNpZ25lZCBjaGFyIG1heF9jaGFubmVsc19vdXQ7CiAKLQljaGFyICpjaGFubmVsX21hcF9pbjsKLQljaGFyICpjaGFubmVsX21hcF9vdXQ7CisJc2lnbmVkIGNoYXIgKmNoYW5uZWxfbWFwX2luOworCXNpZ25lZCBjaGFyICpjaGFubmVsX21hcF9vdXQ7CiAKLQljaGFyICpjaGFubmVsX21hcF9pbl9zcywgKmNoYW5uZWxfbWFwX2luX2RzLCAqY2hhbm5lbF9tYXBfaW5fcXM7Ci0JY2hhciAqY2hhbm5lbF9tYXBfb3V0X3NzLCAqY2hhbm5lbF9tYXBfb3V0X2RzLCAqY2hhbm5lbF9tYXBfb3V0X3FzOworCXNpZ25lZCBjaGFyICpjaGFubmVsX21hcF9pbl9zcywgKmNoYW5uZWxfbWFwX2luX2RzLCAqY2hhbm5lbF9tYXBfaW5fcXM7CisJc2lnbmVkIGNoYXIgKmNoYW5uZWxfbWFwX291dF9zcywgKmNoYW5uZWxfbWFwX291dF9kcywgKmNoYW5uZWxfbWFwX291dF9xczsKIAogCWNoYXIgKipwb3J0X25hbWVzX2luOwogCWNoYXIgKipwb3J0X25hbWVzX291dDsKQEAgLTExNDMsNyArMTE0NCw3IEBACiAKIAkJLyogaWYgd29yZGNsb2NrIGhhcyBzeW5jZWQgZnJlcSBhbmQgd29yZGNsb2NrIGlzIHZhbGlkICovCiAJCWlmICgoc3RhdHVzMiAmIEhEU1BNX3djTG9jaykgIT0gMCAmJgotCQkJCShzdGF0dXMgJiBIRFNQTV9TZWxTeW5jUmVmMCkgPT0gMCkgeworCQkJCShzdGF0dXMyICYgSERTUE1fU2VsU3luY1JlZjApID09IDApIHsKIAogCQkJcmF0ZV9iaXRzID0gc3RhdHVzMiAmIEhEU1BNX3djRnJlcU1hc2s7CiAKQEAgLTE2MzksMTIgKzE2NDAsMTQgQEAKIAkJfQogCX0KIAlobWlkaS0+cGVuZGluZyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG1pZGktPmxvY2ssIGZsYWdzKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZobWlkaS0+aGRzcG0tPmxvY2ssIGZsYWdzKTsKIAlobWlkaS0+aGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gaG1pZGktPmllOwogCWhkc3BtX3dyaXRlKGhtaWRpLT5oZHNwbSwgSERTUE1fY29udHJvbFJlZ2lzdGVyLAogCQkgICAgaG1pZGktPmhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobWlkaS0+aGRzcG0tPmxvY2ssIGZsYWdzKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZobWlkaS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBzbmRfaGRzcG1fbWlkaV9vdXRwdXRfd3JpdGUgKGhtaWRpKTsKIH0KIApAQCAtNjM3Nyw2ICs2MzgwLDcgQEAKIAogCXN3aXRjaCAoaGRzcG0tPmZpcm13YXJlX3JldikgewogCWNhc2UgSERTUE1fTUFESV9SRVY6CisJY2FzZSBIRFNQTV9NQURJX09MRF9SRVY6CiAJCWhkc3BtLT5pb190eXBlID0gTUFESTsKIAkJaGRzcG0tPmNhcmRfbmFtZSA9ICJSTUUgTUFESSI7CiAJCWhkc3BtLT5taWRpUG9ydHMgPSAzOwpAQCAtNjQzNyw3ICs2NDQxLDcgQEAKIAkJCWhkc3BtLT5wb3J0ICsgaW9fZXh0ZW50IC0gMSk7CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9oZHNwbV9pbnRlcnJ1cHQsCi0JCQkJSVJRRl9TSEFSRUQsICJoZHNwbSIsIGhkc3BtKSkgeworCQkJSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBoZHNwbSkpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiSERTUE06IHVuYWJsZSB0byB1c2UgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtNjc3NSw3ICs2Nzc5LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICJSTUUgSGFtbWVyZmFsbCBEU1AgTUFESSIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfaGRzcG1faWRzLAogCS5wcm9iZSA9IHNuZF9oZHNwbV9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2hkc3BtX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKaW5kZXggYzQ5MmFmNS4uMWM3YmMxZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYwpAQCAtMjQ3OSw3ICsyNDc5LDcgQEAKIAl9CiAJCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfcm1lOTY1Ml9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJInJtZTk2NTIiLCBybWU5NjUyKSkgeworCQkJS0JVSUxEX01PRE5BTUUsIHJtZTk2NTIpKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZXF1ZXN0IElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTI2MzIsNyArMjYzMiw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUJICA9ICJSTUUgRGlnaTk2NTIgKEhhbW1lcmZhbGwpIiwKKwkubmFtZQkgID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX3JtZTk2NTJfaWRzLAogCS5wcm9iZQkgID0gc25kX3JtZTk2NTJfcHJvYmUsCiAJLnJlbW92ZQkgID0gX19kZXZleGl0X3Aoc25kX3JtZTk2NTJfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9zaXM3MDE5LmMgYi9zb3VuZC9wY2kvc2lzNzAxOS5jCmluZGV4IDJiNWM3YTk1Li5iY2Y2MTUyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvc2lzNzAxOS5jCisrKyBiL3NvdW5kL3BjaS9zaXM3MDE5LmMKQEAgLTEyMzUsNyArMTIzNSw3IEBACiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzaXNfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVEfElSUUZfU0hBUkVELAotCQkJCWNhcmQtPnNob3J0bmFtZSwgc2lzKSkgeworCQkJS0JVSUxEX01PRE5BTUUsIHNpcykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzaXM3MDE5OiB1bmFibGUgdG8gcmVnYWluIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTEzNDEsNyArMTM0MSw3IEBACiAJCWdvdG8gZXJyb3Jfb3V0X2NsZWFudXA7CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNpc19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsCi0JCQkJY2FyZC0+c2hvcnRuYW1lLCBzaXMpKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgc2lzKSkgewogCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJWRcbiIsIHNpcy0+aXJxKTsKIAkJZ290byBlcnJvcl9vdXRfY2xlYW51cDsKIAl9CkBAIC0xNDM2LDcgKzE0MzYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2lzNzAxOV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAiU2lTNzAxOSIsCisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKIAkuaWRfdGFibGUgPSBzbmRfc2lzNzAxOV9pZHMsCiAJLnByb2JlID0gc25kX3NpczcwMTlfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9zaXM3MDE5X3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvc29uaWN2aWJlcy5jIGIvc291bmQvcGNpL3NvbmljdmliZXMuYwppbmRleCAzMzdiOWZhLi4yNTcxYTY3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvc29uaWN2aWJlcy5jCisrKyBiL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKQEAgLTEyOTQsNyArMTI5NCw3IEBACiAJc29uaWMtPmdhbWVfcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDQpOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfc29uaWN2aWJlc19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJIlMzIFNvbmljVmliZXMiLCBzb25pYykpIHsKKwkJCUtCVUlMRF9NT0ROQU1FLCBzb25pYykpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF9zb25pY3ZpYmVzX2ZyZWUoc29uaWMpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTUzMCw3ICsxNTMwLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICJTMyBTb25pY1ZpYmVzIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF9zb25pY19pZHMsCiAJLnByb2JlID0gc25kX3NvbmljX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfc29uaWNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnQuYyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnQuYwppbmRleCA2ZDA1ODE4Li5kOGExMjhmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50LmMKKysrIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jCkBAIC0xNzIsNyArMTcyLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSA9ICJUcmlkZW50NERXYXZlQXVkaW8iLAorCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCiAJLmlkX3RhYmxlID0gc25kX3RyaWRlbnRfaWRzLAogCS5wcm9iZSA9IHNuZF90cmlkZW50X3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfdHJpZGVudF9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYwppbmRleCAyODcwYTRmLi41YmQ1N2E3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYworKysgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYwpAQCAtMzU5OCw3ICszNTk4LDcgQEAKIAl0cmlkZW50LT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF90cmlkZW50X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQkiVHJpZGVudCBBdWRpbyIsIHRyaWRlbnQpKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgdHJpZGVudCkpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF90cmlkZW50X2ZyZWUodHJpZGVudCk7CiAJCXJldHVybiAtRUJVU1k7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCA4YzVmOGI1Li5mMDNmZDYyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTIzNzcsNyArMjM3Nyw3IEBACiAJCQljaGlwX3R5cGUgPT0gVFlQRV9WSUE4MjMzID8KIAkJCXNuZF92aWE4MjMzX2ludGVycnVwdCA6CXNuZF92aWE2ODZfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsCi0JCQljYXJkLT5kcml2ZXIsIGNoaXApKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF92aWE4Mnh4X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0yNjExLDcgKzI2MTEsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIlZJQSA4Mnh4IEF1ZGlvIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF92aWE4Mnh4X2lkcywKIAkucHJvYmUgPSBzbmRfdmlhODJ4eF9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX3ZpYTgyeHhfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMgYi9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCmluZGV4IGY3ZThiYmJlLi5hMzg2ZGQ5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKQEAgLTExMjksNyArMTEyOSw3IEBACiAJfQogCWNoaXAtPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF92aWE4Mnh4X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQljYXJkLT5kcml2ZXIsIGNoaXApKSB7CisJCQlLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXNuZF92aWE4Mnh4X2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0xMjI0LDcgKzEyMjQsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIlZJQSA4Mnh4IE1vZGVtIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF92aWE4Mnh4X21vZGVtX2lkcywKIAkucHJvYmUgPSBzbmRfdmlhODJ4eF9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX3ZpYTgyeHhfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92eDIyMi92eDIyMi5jIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKaW5kZXggOTlhOWE4MS4uNTM0MmQ1ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKKysrIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCQl2eC0+cG9ydFtpXSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIGkgKyAxKTsKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3Z4X2lycV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKLQkJCUNBUkRfTkFNRSwgY2hpcCkpIHsKKwkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX3Z4MjIyX2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0yOTAsNyArMjkwLDcgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewotCS5uYW1lID0gIkRpZ2lncmFtIFZYMjIyIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF92eDIyMl9pZHMsCiAJLnByb2JlID0gc25kX3Z4MjIyX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfdngyMjJfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpLmMgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaS5jCmluZGV4IDgwYzY4MjEuLjUxMWQ1NzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpLmMKKysrIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYwpAQCAtMzQ1LDcgKzM0NSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm5hbWUgPSAiWWFtYWhhIERTLTEgUENJIiwKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCS5pZF90YWJsZSA9IHNuZF95bWZwY2lfaWRzLAogCS5wcm9iZSA9IHNuZF9jYXJkX3ltZnBjaV9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc25kX2NhcmRfeW1mcGNpX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKaW5kZXggYzk0YzA1MS4uZjMyNjBlNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwpAQCAtMjM4MCw3ICsyMzgwLDcgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfeW1mcGNpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQkiWU1GUENJIiwgY2hpcCkpIHsKKwkJCUtCVUlMRF9NT0ROQU1FLCBjaGlwKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKIAkJc25kX3ltZnBjaV9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKaW5kZXggY2UzM2JlMC4uNjY0ODhhNyAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYworKysgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCkBAIC0yMjMsNyArMjIzLDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxlZDsKIAotCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2V4Y2x1c2l2ZV9pcnEobGluaywgcGRhY2ZfaW50ZXJydXB0KTsKKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgcGRhY2ZfaW50ZXJydXB0KTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxlZDsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwppbmRleCBkOWVmMjFkLi4zMTc3N2QxIDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYworKysgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWQ7CiAKLQlyZXQgPSBwY21jaWFfcmVxdWVzdF9leGNsdXNpdmVfaXJxKGxpbmssIHNuZF92eF9pcnFfaGFuZGxlcik7CisJcmV0ID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssIHNuZF92eF9pcnFfaGFuZGxlcik7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsZWQ7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9wbWFjLmMgYi9zb3VuZC9wcGMvcG1hYy5jCmluZGV4IDNlY2JkNjcuLmFiOTZjZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9wbWFjLmMKKysrIGIvc291bmQvcHBjL3BtYWMuYwpAQCAtODgxLDggKzg4MSw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJCWlmIChjaGlwLT5yZXF1ZXN0ZWQgJiAoMSA8PCBpKSkKIAkJCQlyZWxlYXNlX21lbV9yZWdpb24oY2hpcC0+cnNyY1tpXS5zdGFydCwKLQkJCQkJCSAgIGNoaXAtPnJzcmNbaV0uZW5kIC0KLQkJCQkJCSAgIGNoaXAtPnJzcmNbaV0uc3RhcnQgKyAxKTsKKwkJCQkJCSAgIHJlc291cmNlX3NpemUoJmNoaXAtPnJzcmNbaV0pKTsKIAkJfQogCX0KIApAQCAtMTIyOCw4ICsxMjI3LDcgQEAKIAkJCQlnb3RvIF9fZXJyb3I7CiAJCQl9CiAJCQlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGNoaXAtPnJzcmNbaV0uc3RhcnQsCi0JCQkJCSAgICAgICBjaGlwLT5yc3JjW2ldLmVuZCAtCi0JCQkJCSAgICAgICBjaGlwLT5yc3JjW2ldLnN0YXJ0ICsgMSwKKwkJCQkJICAgICAgIHJlc291cmNlX3NpemUoJmNoaXAtPnJzcmNbaV0pLAogCQkJCQkgICAgICAgcm5hbWVzW2ldKSA9PSBOVUxMKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJzbmQ6IGNhbid0IHJlcXVlc3QgcnNyYyAiCiAJCQkJICAgICAgICIgJWQgKCVzOiAlcFIpXG4iLApAQCAtMTI1NCw4ICsxMjUyLDcgQEAKIAkJCQlnb3RvIF9fZXJyb3I7CiAJCQl9CiAJCQlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGNoaXAtPnJzcmNbaV0uc3RhcnQsCi0JCQkJCSAgICAgICBjaGlwLT5yc3JjW2ldLmVuZCAtCi0JCQkJCSAgICAgICBjaGlwLT5yc3JjW2ldLnN0YXJ0ICsgMSwKKwkJCQkJICAgICAgIHJlc291cmNlX3NpemUoJmNoaXAtPnJzcmNbaV0pLAogCQkJCQkgICAgICAgcm5hbWVzW2ldKSA9PSBOVUxMKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJzbmQ6IGNhbid0IHJlcXVlc3QgcnNyYyAiCiAJCQkJICAgICAgICIgJWQgKCVzOiAlcFIpXG4iLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL01ha2VmaWxlIGIvc291bmQvc29jL01ha2VmaWxlCmluZGV4IDFlZDYxYzUuLjRmOTEzODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvTWFrZWZpbGUKQEAgLTEsNCArMSw1IEBACiBzbmQtc29jLWNvcmUtb2JqcyA6PSBzb2MtY29yZS5vIHNvYy1kYXBtLm8gc29jLWphY2subyBzb2MtY2FjaGUubyBzb2MtdXRpbHMubworc25kLXNvYy1jb3JlLW9ianMgKz0gc29jLXBjbS5vIHNvYy1pby5vCiAKIG9iai0kKENPTkZJR19TTkRfU09DKQkrPSBzbmQtc29jLWNvcmUubwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IGNvZGVjcy8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wY20uYyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wY20uYwppbmRleCBkMGU3NTMyLi5mODFkNGMzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLmMKKysrIGIvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS5jCkBAIC0zNjQsOSArMzY0LDExIEBACiBcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB1NjQgYXRtZWxfcGNtX2RtYW1hc2sgPSAweGZmZmZmZmZmOwogCi1zdGF0aWMgaW50IGF0bWVsX3BjbV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLAotCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBzdHJ1Y3Qgc25kX3BjbSAqcGNtKQorc3RhdGljIGludCBhdG1lbF9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoIWNhcmQtPmRldi0+ZG1hX21hc2spCkBAIC0zODIsNyArMzg0LDcgQEAKIAl9CiAKIAlpZiAoZGFpLT5kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWluKSB7Ci0JCXByX2RlYnVnKCJhdDMyLXBjbToiCisJCXByX2RlYnVnKCJhdG1lbC1wY206IgogCQkJCSJBbGxvY2F0aW5nIFBDTSBjYXB0dXJlIERNQSBidWZmZXJcbiIpOwogCQlyZXQgPSBhdG1lbF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCiAJCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS5oIGIvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS5oCmluZGV4IDI1OTczMjkuLjVlMGE5NWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wY20uaAorKysgYi9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLmgKQEAgLTYwLDcgKzYwLDcgQEAKICAqIFRoaXMgc3RydWN0dXJlLCBzaGFyZWQgYmV0d2VlbiB0aGUgUENNIGRyaXZlciBhbmQgdGhlIGludGVyZmFjZSwKICAqIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgUENNIGRyaXZlciB0byBwZXJmb3JtIHRoZQogICogUERDIERNQSBvcGVyYXRpb24uICBBbGwgZmllbGRzIGV4Y2VwdCBkbWFfaW50cl9oYW5kbGVyKCkgYXJlIGluaXRpYWxpemVkCi0gKiBieSB0aGUgaW50ZXJmYWNlLiAgVGhlIGRtc19pbnRyX2hhbmRsZXIoKSBwb2ludGVyIGlzIHNldCBieSB0aGUgUENNCisgKiBieSB0aGUgaW50ZXJmYWNlLiAgVGhlIGRtYV9pbnRyX2hhbmRsZXIoKSBwb2ludGVyIGlzIHNldCBieSB0aGUgUENNCiAgKiBkcml2ZXIgYW5kIGNhbGxlZCBieSB0aGUgaW50ZXJmYWNlIFNTQyBpbnRlcnJ1cHQgaGFuZGxlciBpZiBpdCBpcwogICogbm9uLU5VTEwuCiAgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMgYi9zb3VuZC9zb2MvYXRtZWwvYXRtZWxfc3NjX2RhaS5jCmluZGV4IDdmYmZhMDUuLjcxMjI1MDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMKKysrIGIvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuYwpAQCAtNDAyLDcgKzQwMiw3IEBACiAJaWYgKChzc2NfcC0+ZGFpZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spID09IFNORF9TT0NfREFJRk1UX0kyUwogCQkmJiBiaXRzID4gMTYpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJhdG1lbF9zc2NfZGFpOiBzYW1wbGUgc2l6ZSAlZCIKKwkJCQkiYXRtZWxfc3NjX2RhaTogc2FtcGxlIHNpemUgJWQgIgogCQkJCSJpcyB0b28gbGFyZ2UgZm9yIEkyU1xuIiwgYml0cyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTgzOCwxOSArODM4LDE4IEBACiAJfQogCiAJc3NjX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImF0bWVsLXNzYy1kYWkiLCBzc2NfaWQpOwotCWlmICghc3NjX3BkZXYpIHsKLQkJc3NjX2ZyZWUoc3NjKTsKKwlpZiAoIXNzY19wZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKiBJZiB3ZSBjYW4gZ3JhYiB0aGUgU1NDIGJyaWVmbHkgdG8gcGFyZW50IHRoZSBEQUkgZGV2aWNlIG9mZiBpdCAqLwogCXNzYyA9IHNzY19yZXF1ZXN0KHNzY19pZCk7CiAJaWYgKElTX0VSUihzc2MpKQogCQlwcl93YXJuKCJVbmFibGUgdG8gcGFyZW50IEFTb0MgU1NDIERBSSBvbiBTU0M6ICVsZFxuIiwKIAkJCVBUUl9FUlIoc3NjKSk7Ci0JZWxzZQorCWVsc2UgewogCQlzc2NfcGRldi0+ZGV2LnBhcmVudCA9ICYoc3NjLT5wZGV2LT5kZXYpOwotCXNzY19mcmVlKHNzYyk7CisJCXNzY19mcmVlKHNzYyk7CisJfQogCiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzc2NfcGRldik7CiAJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCmluZGV4IDk1NTcyZDIuLmJhZDNhYTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCkBAIC05Miw2ICs5Miw3IEBACiB9OwogCiBzdGF0aWMgaW50IGF0OTFzYW05ZzIwZWtfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKKwkJCQkJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCQkJCQllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKIAlzdGF0aWMgaW50IG1jbGtfb247CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXUxeC9kYmRtYTIuYyBiL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jCmluZGV4IDEwZmRkMjguLjIwYmI1M2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jCisrKyBiL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jCkBAIC0zMTksMTAgKzMxOSwxMSBAQAogCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOwogfQogCi1zdGF0aWMgaW50IGF1MXhwc2NfcGNtX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JCQkgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCSAgIHN0cnVjdCBzbmRfcGNtICpwY20pCitzdGF0aWMgaW50IGF1MXhwc2NfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogeworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCiAJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKIAkJY2FyZC0+ZGV2LCBBVTFYUFNDX0JVRkZFUl9NSU5fQllURVMsICg0MDk2ICogMTAyNCkgLSAxKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL0tjb25maWcgYi9zb3VuZC9zb2MvYmxhY2tmaW4vS2NvbmZpZwppbmRleCBhZTQwMzU5Li5mZTlkNTQ4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYmxhY2tmaW4vS2NvbmZpZworKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vS2NvbmZpZwpAQCAtMTAsMTMgKzEwLDM2IEBACiAKIGNvbmZpZyBTTkRfQkY1WFhfU09DX1NTTTI2MDIKIAl0cmlzdGF0ZSAiU29DIFNTTTI2MDIgQXVkaW8gc3VwcG9ydCBmb3IgQkY1MnggZXpraXQiCi0JZGVwZW5kcyBvbiBTTkRfQkY1WFhfSTJTCisJZGVwZW5kcyBvbiBTTkRfQkY1WFhfSTJTICYmIChTUElfTUFTVEVSIHx8IEkyQykKIAlzZWxlY3QgU05EX0JGNVhYX1NPQ19JMlMKIAlzZWxlY3QgU05EX1NPQ19TU00yNjAyCi0Jc2VsZWN0IEkyQwogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gQkY1MjctRVpLSVQuCiAKK2NvbmZpZyBTTkRfU09DX0JGSU5fRVZBTF9BREFVMTcwMQorCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgRVZBTC1BREFVMTcwMU1JTklaIGJvYXJkIG9uIEJsYWNrZmluIGV2YWwgYm9hcmRzIgorCWRlcGVuZHMgb24gU05EX0JGNVhYX0kyUworCXNlbGVjdCBTTkRfQkY1WFhfU09DX0kyUworCXNlbGVjdCBTTkRfU09DX0FEQVUxNzAxCisJc2VsZWN0IEkyQworCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgQW5hbG9nIERldmljZXMgRVZBTC1BREFVMTcwMU1JTklaCisJICBib2FyZCBjb25uZWN0ZWQgdG8gb25lIG9mIHRoZSBCbGFja2ZpbiBldmFsdWF0aW9uIGJvYXJkcyBsaWtlIHRoZQorCSAgQkY1WFgtU1RBTVAgb3IgQkY1WFgtRVpLSVQuCisKK2NvbmZpZyBTTkRfU09DX0JGSU5fRVZBTF9BREFWODBYCisJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHRoZSBFVkFMLUFEQVY4MFggYm9hcmRzIG9uIEJsYWNrZmluIGV2YWwgYm9hcmRzIgorCWRlcGVuZHMgb24gU05EX0JGNVhYX0kyUyAmJiAoU1BJX01BU1RFUiB8fCBJMkMpCisJc2VsZWN0IFNORF9CRjVYWF9TT0NfSTJTCisJc2VsZWN0IFNORF9TT0NfQURBVjgwWAorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgQW5hbG9nIERldmljZXMgRVZBTC1BREFWODAxIG9yCisJICBFVkFMLUFEQVY4MDMgYm9hcmQgY29ubmVjdGVkIHRvIG9uZSBvZiB0aGUgQmxhY2tmaW4gZXZhbHVhdGlvbiBib2FyZHMKKwkgIGxpa2UgdGhlIEJGNVhYLVNUQU1QIG9yIEJGNVhYLUVaS0lULgorCisJICBOb3RlOiBUaGlzIGRyaXZlciBhc3N1bWVzIHRoYXQgdGhlIEFEQVY4MFggZGlnaXRhbCByZWNvcmQgYW5kIHBsYXliYWNrCisJICBpbnRlcmZhY2VzIGFyZSBjb25uZWN0ZWQgdG8gdGhlIGZpcnN0IFNQT1JUIHBvcnQgb24gdGhlIEJGNVhYIGJvYXJkLgorCiBjb25maWcgU05EX0JGNVhYX1NPQ19BRDczMzExCiAJdHJpc3RhdGUgIlNvQyBBRDczMzExIEF1ZGlvIHN1cHBvcnQgZm9yIEJsYWNrZmluIgogCWRlcGVuZHMgb24gU05EX0JGNVhYX0kyUwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL01ha2VmaWxlIGIvc291bmQvc29jL2JsYWNrZmluL01ha2VmaWxlCmluZGV4IDQ5YWYzZjMuLjYwMThiZjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vTWFrZWZpbGUKQEAgLTIxLDkgKzIxLDEzIEBACiBzbmQtc3NtMjYwMi1vYmpzIDo9IGJmNXh4LXNzbTI2MDIubwogc25kLWFkNzMzMTEtb2JqcyA6PSBiZjV4eC1hZDczMzExLm8KIHNuZC1hZDE5M3gtb2JqcyA6PSBiZjV4eC1hZDE5M3gubworc25kLXNvYy1iZmluLWV2YWwtYWRhdTE3MDEtb2JqcyA6PSBiZmluLWV2YWwtYWRhdTE3MDEubworc25kLXNvYy1iZmluLWV2YWwtYWRhdjgweC1vYmpzIDo9IGJmaW4tZXZhbC1hZGF2ODB4Lm8KIAogb2JqLSQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxODM2KSArPSBzbmQtYWQxODM2Lm8KIG9iai0kKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTk4MCkgKz0gc25kLWFkMTk4MC5vCiBvYmotJChDT05GSUdfU05EX0JGNVhYX1NPQ19TU00yNjAyKSArPSBzbmQtc3NtMjYwMi5vCiBvYmotJChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDczMzExKSArPSBzbmQtYWQ3MzMxMS5vCiBvYmotJChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE5M1gpICs9IHNuZC1hZDE5M3gubworb2JqLSQoQ09ORklHX1NORF9TT0NfQkZJTl9FVkFMX0FEQVUxNzAxKSArPSBzbmQtc29jLWJmaW4tZXZhbC1hZGF1MTcwMS5vCitvYmotJChDT05GSUdfU05EX1NPQ19CRklOX0VWQUxfQURBVjgwWCkgKz0gc25kLXNvYy1iZmluLWV2YWwtYWRhdjgweC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWM5Ny1wY20uYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LXBjbS5jCmluZGV4IDk4YjQ0YjMuLjllNTlmNjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LXBjbS5jCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LXBjbS5jCkBAIC00MTgsOSArNDE4LDExIEBACiAKIHN0YXRpYyB1NjQgYmY1eHhfcGNtX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCi1pbnQgYmY1eHhfcGNtX2FjOTdfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0Jc3RydWN0IHNuZF9wY20gKnBjbSkKK2ludCBiZjV4eF9wY21fYWM5N19uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKIAlpbnQgcmV0ID0gMDsKIAogCXByX2RlYnVnKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFkMTgzNi5jIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFkMTgzNi5jCmluZGV4IGVhNDk1MWMuLmY3OWQxNjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hZDE4MzYuYworKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWQxODM2LmMKQEAgLTc1LDcgKzc1LDcgQEAKIAkJLmNwdV9kYWlfbmFtZSA9ICJiZmluLXRkbS4wIiwKIAkJLmNvZGVjX2RhaV9uYW1lID0gImFkMTgzNi1oaWZpIiwKIAkJLnBsYXRmb3JtX25hbWUgPSAiYmZpbi10ZG0tcGNtLWF1ZGlvIiwKLQkJLmNvZGVjX25hbWUgPSAiYWQxODM2LjAiLAorCQkuY29kZWNfbmFtZSA9ICJzcGkwLjQiLAogCQkub3BzID0gJmJmNXh4X2FkMTgzNl9vcHMsCiAJfSwKIAl7CkBAIC04NCw3ICs4NCw3IEBACiAJCS5jcHVfZGFpX25hbWUgPSAiYmZpbi10ZG0uMSIsCiAJCS5jb2RlY19kYWlfbmFtZSA9ICJhZDE4MzYtaGlmaSIsCiAJCS5wbGF0Zm9ybV9uYW1lID0gImJmaW4tdGRtLXBjbS1hdWRpbyIsCi0JCS5jb2RlY19uYW1lID0gImFkMTgzNi4wIiwKKwkJLmNvZGVjX25hbWUgPSAic3BpMC40IiwKIAkJLm9wcyA9ICZiZjV4eF9hZDE4MzZfb3BzLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy1wY20uYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmMKaW5kZXggYjUxMDFlZi4uNjFkZGY5NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy1wY20uYworKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtaTJzLXBjbS5jCkBAIC0xMzgsMTEgKzEzOCwyMCBAQAogCXByX2RlYnVnKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOwogCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CiAJCWRpZmYgPSBzcG9ydF9jdXJyX29mZnNldF90eChzcG9ydCk7Ci0JCWZyYW1lcyA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIGRpZmYpOwogCX0gZWxzZSB7CiAJCWRpZmYgPSBzcG9ydF9jdXJyX29mZnNldF9yeChzcG9ydCk7Ci0JCWZyYW1lcyA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIGRpZmYpOwogCX0KKworCS8qCisJICogVFggYXQgbGVhc3QgY2FuIHJlcG9ydCBvbmUgZnJhbWUgYmV5b25kIHRoZSBlbmQgb2YgdGhlCisJICogYnVmZmVyIGlmIHdlIGhpdCB0aGUgd3JhcGFyb3VuZCBjYXNlIC0gY2xhbXAgdG8gd2l0aGluIHRoZQorCSAqIGJ1ZmZlciBhcyB0aGUgQUxTQSBBUElzIHJlcXVpcmUuCisJICovCisJaWYgKGRpZmYgPT0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkpCisJCWRpZmYgPSAwOworCisJZnJhbWVzID0gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgZGlmZik7CisKIAlyZXR1cm4gZnJhbWVzOwogfQogCkBAIC0xNTksNyArMTY4LDcgQEAKIAogCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmYmY1eHhfcGNtX2hhcmR3YXJlKTsKIAotCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFwKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAogCQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKQEAgLTI0OCw5ICsyNTcsMTEgQEAKIAogc3RhdGljIHU2NCBiZjV4eF9wY21fZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKLWludCBiZjV4eF9wY21faTJzX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCXN0cnVjdCBzbmRfcGNtICpwY20pCitpbnQgYmY1eHhfcGNtX2kyc19uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKIAlpbnQgcmV0ID0gMDsKIAogCXByX2RlYnVnKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOwpAQCAtMjk1LDggKzMwNiw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJmaW5faTJzX3BjbV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJCS5uYW1lID0gImJmaW4taTJzLXBjbS1hdWRpbyIsCi0JCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm5hbWUgPSAiYmZpbi1pMnMtcGNtLWF1ZGlvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIAogCS5wcm9iZSA9IGJmaW5faTJzX3NvY19wbGF0Zm9ybV9wcm9iZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC10ZG0tcGNtLmMgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtdGRtLXBjbS5jCmluZGV4IDA3Y2ZjN2EuLmM5NWNjMDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC10ZG0tcGNtLmMKKysrIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LXRkbS1wY20uYwpAQCAtMjgzLDkgKzI4MywxMSBAQAogCiBzdGF0aWMgdTY0IGJmNXh4X3BjbV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKIAotc3RhdGljIGludCBiZjV4eF9wY21fdGRtX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCXN0cnVjdCBzbmRfcGNtICpwY20pCitzdGF0aWMgaW50IGJmNXh4X3BjbV90ZG1fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoIWNhcmQtPmRldi0+ZG1hX21hc2spCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmZpbi1ldmFsLWFkYXUxNzAxLmMgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmZpbi1ldmFsLWFkYXUxNzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1NTBhYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZmluLWV2YWwtYWRhdTE3MDEuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIE1hY2hpbmUgZHJpdmVyIGZvciBFVkFMLUFEQVUxNzAxTUlOSVogb24gQW5hbG9nIERldmljZXMgYmZpbgorICogZXZhbHVhdGlvbiBib2FyZHMuCisgKgorICogQ29weXJpZ2h0IDIwMTEgQW5hbG9nIERldmljZXMgSW5jLgorICogQXV0aG9yOiBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisKKyNpbmNsdWRlICIuLi9jb2RlY3MvYWRhdTE3MDEuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGJmaW5fZXZhbF9hZGF1MTcwMV9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fU1BLKCJTcGVha2VyIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX0xJTkUoIkxpbmUgT3V0IiwgTlVMTCksCisJU05EX1NPQ19EQVBNX0xJTkUoIkxpbmUgSW4iLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJmaW5fZXZhbF9hZGF1MTcwMV9kYXBtX3JvdXRlc1tdID0geworCXsgIlNwZWFrZXIiLCBOVUxMLCAiT1VUMCIgfSwKKwl7ICJTcGVha2VyIiwgTlVMTCwgIk9VVDEiIH0sCisJeyAiTGluZSBPdXQiLCBOVUxMLCAiT1VUMiIgfSwKKwl7ICJMaW5lIE91dCIsIE5VTEwsICJPVVQzIiB9LAorCisJeyAiSU4wIiwgTlVMTCwgIkxpbmUgSW4iIH0sCisJeyAiSU4xIiwgTlVMTCwgIkxpbmUgSW4iIH0sCit9OworCitzdGF0aWMgaW50IGJmaW5fZXZhbF9hZGF1MTcwMV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CisJCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKKwkJCVNORF9TT0NfREFJRk1UX05CX05GIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBBREFVMTcwMV9DTEtfU1JDX09TQywgMTIyODgwMDAsCisJCQlTTkRfU09DX0NMT0NLX0lOKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgYmZpbl9ldmFsX2FkYXUxNzAxX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gYmZpbl9ldmFsX2FkYXUxNzAxX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBiZmluX2V2YWxfYWRhdTE3MDFfZGFpW10gPSB7CisJeworCQkubmFtZSA9ICJhZGF1MTcwMSIsCisJCS5zdHJlYW1fbmFtZSA9ICJhZGF1MTcwMSIsCisJCS5jcHVfZGFpX25hbWUgPSAiYmZpbi1pMnMuMCIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJhZGF1MTcwMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImJmaW4taTJzLXBjbS1hdWRpbyIsCisJCS5jb2RlY19uYW1lID0gImFkYXUxNzAxLjAtMDAzNCIsCisJCS5vcHMgPSAmYmZpbl9ldmFsX2FkYXUxNzAxX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAiYWRhdTE3MDEiLAorCQkuc3RyZWFtX25hbWUgPSAiYWRhdTE3MDEiLAorCQkuY3B1X2RhaV9uYW1lID0gImJmaW4taTJzLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAiYWRhdTE3MDEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJiZmluLWkycy1wY20tYXVkaW8iLAorCQkuY29kZWNfbmFtZSA9ICJhZGF1MTcwMS4wLTAwMzQiLAorCQkub3BzID0gJmJmaW5fZXZhbF9hZGF1MTcwMV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGJmaW5fZXZhbF9hZGF1MTcwMSA9IHsKKwkubmFtZSA9ICJiZmluLWV2YWwtYWRhdTE3MDEiLAorCS5kYWlfbGluayA9ICZiZmluX2V2YWxfYWRhdTE3MDFfZGFpW0NPTkZJR19TTkRfQkY1WFhfU1BPUlRfTlVNXSwKKwkubnVtX2xpbmtzID0gMSwKKworCS5kYXBtX3dpZGdldHMJCT0gYmZpbl9ldmFsX2FkYXUxNzAxX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYmZpbl9ldmFsX2FkYXUxNzAxX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzCQk9IGJmaW5fZXZhbF9hZGF1MTcwMV9kYXBtX3JvdXRlcywKKwkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShiZmluX2V2YWxfYWRhdTE3MDFfZGFwbV9yb3V0ZXMpLAorfTsKKworc3RhdGljIGludCBiZmluX2V2YWxfYWRhdTE3MDFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJmJmaW5fZXZhbF9hZGF1MTcwMTsKKworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZiZmluX2V2YWxfYWRhdTE3MDEpOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBiZmluX2V2YWxfYWRhdTE3MDFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoY2FyZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmZpbl9ldmFsX2FkYXUxNzAxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJiZmluLWV2YWwtYWRhdTE3MDEiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLnBtID0gJnNuZF9zb2NfcG1fb3BzLAorCX0sCisJLnByb2JlID0gYmZpbl9ldmFsX2FkYXUxNzAxX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChiZmluX2V2YWxfYWRhdTE3MDFfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJmaW5fZXZhbF9hZGF1MTcwMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYmZpbl9ldmFsX2FkYXUxNzAxX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChiZmluX2V2YWxfYWRhdTE3MDFfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiZmluX2V2YWxfYWRhdTE3MDFfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZiZmluX2V2YWxfYWRhdTE3MDFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGJmaW5fZXZhbF9hZGF1MTcwMV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIGJmaW4gQURBVTE3MDEgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJmaW4tZXZhbC1hZGF1MTcwMSIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF2ODB4LmMgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmZpbi1ldmFsLWFkYXY4MHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAxNGQwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF2ODB4LmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBNYWNoaW5lIGRyaXZlciBmb3IgRVZBTC1BREFWODAxIGFuZCBFVkFMLUFEQVY4MDMgb24gQW5hbG9nIERldmljZXMgYmZpbgorICogZXZhbHVhdGlvbiBib2FyZHMuCisgKgorICogQ29weXJpZ2h0IDIwMTEgQW5hbG9nIERldmljZXMgSW5jLgorICogQXV0aG9yOiBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICIuLi9jb2RlY3MvYWRhdjgweC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYmZpbl9ldmFsX2FkYXY4MHhfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0xJTkUoIkxpbmUgT3V0IiwgTlVMTCksCisJU05EX1NPQ19EQVBNX0xJTkUoIkxpbmUgSW4iLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJmaW5fZXZhbF9hZGF2ODB4X2RhcG1fcm91dGVzW10gPSB7CisJeyAiTGluZSBPdXQiLCBOVUxMLCAiVk9VVEwiIH0sCisJeyAiTGluZSBPdXQiLCBOVUxMLCAiVk9VVFIiIH0sCisKKwl7ICJWSU5MIiwgTlVMTCwgIkxpbmUgSW4iIH0sCisJeyAiVklOUiIsIE5VTEwsICJMaW5lIEluIiB9LAorfTsKKworc3RhdGljIGludCBiZmluX2V2YWxfYWRhdjgweF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CisJCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKKwkJCVNORF9TT0NfREFJRk1UX05CX05GIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCBBREFWODBYX1BMTDEsIEFEQVY4MFhfUExMX1NSQ19YVEFMLAorCQkJMjcwMDAwMDAsIHBhcmFtc19yYXRlKHBhcmFtcykgKiAyNTYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgQURBVjgwWF9DTEtfUExMMSwKKwkJCXBhcmFtc19yYXRlKHBhcmFtcykgKiAyNTYsIFNORF9TT0NfQ0xPQ0tfSU4pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBiZmluX2V2YWxfYWRhdjgweF9jb2RlY19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKworCXNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBBREFWODBYX0NMS19TWVNDTEsxLCAwLAorCSAgICBTTkRfU09DX0NMT0NLX09VVCk7CisJc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIEFEQVY4MFhfQ0xLX1NZU0NMSzIsIDAsCisJICAgIFNORF9TT0NfQ0xPQ0tfT1VUKTsKKwlzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgQURBVjgwWF9DTEtfU1lTQ0xLMywgMCwKKwkgICAgU05EX1NPQ19DTE9DS19PVVQpOworCisJc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIEFEQVY4MFhfQ0xLX1hUQUwsIDI3MDAwMDAsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgYmZpbl9ldmFsX2FkYXY4MHhfb3BzID0geworCS5od19wYXJhbXMgPSBiZmluX2V2YWxfYWRhdjgweF9od19wYXJhbXMsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgYmZpbl9ldmFsX2FkYXY4MHhfZGFpc1tdID0geworCXsKKwkJLm5hbWUgPSAiYWRhdjgweCIsCisJCS5zdHJlYW1fbmFtZSA9ICJBREFWODB4IEhpRmkiLAorCQkuY3B1X2RhaV9uYW1lID0gImJmaW4taTJzLjAiLAorCQkuY29kZWNfZGFpX25hbWUgPSAiYWRhdjgweC1oaWZpIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAiYmZpbi1pMnMtcGNtLWF1ZGlvIiwKKwkJLmluaXQgPSBiZmluX2V2YWxfYWRhdjgweF9jb2RlY19pbml0LAorCQkub3BzID0gJmJmaW5fZXZhbF9hZGF2ODB4X29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgYmZpbl9ldmFsX2FkYXY4MHggPSB7CisJLm5hbWUgPSAiYmZpbi1ldmFsLWFkYXY4MHgiLAorCS5kYWlfbGluayA9IGJmaW5fZXZhbF9hZGF2ODB4X2RhaXMsCisJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoYmZpbl9ldmFsX2FkYXY4MHhfZGFpcyksCisKKwkuZGFwbV93aWRnZXRzCQk9IGJmaW5fZXZhbF9hZGF2ODB4X2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYmZpbl9ldmFsX2FkYXY4MHhfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJCT0gYmZpbl9ldmFsX2FkYXY4MHhfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYmZpbl9ldmFsX2FkYXY4MHhfZGFwbV9yb3V0ZXMpLAorfTsKKworZW51bSBiZmluX2V2YWxfYWRhdjgweF90eXBlIHsKKwlCRklOX0VWQUxfQURBVjgwMSwKKwlCRklOX0VWQUxfQURBVjgwMywKK307CisKK3N0YXRpYyBpbnQgYmZpbl9ldmFsX2FkYXY4MHhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJmJmaW5fZXZhbF9hZGF2ODB4OworCWNvbnN0IGNoYXIgKmNvZGVjX25hbWU7CisKKwlzd2l0Y2ggKHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhKSB7CisJY2FzZSBCRklOX0VWQUxfQURBVjgwMToKKwkJY29kZWNfbmFtZSA9ICJzcGkwLjEiOworCQlicmVhazsKKwljYXNlIEJGSU5fRVZBTF9BREFWODAzOgorCQljb2RlY19uYW1lID0gImFkYXY4MDMuMC0wMDM0IjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmZpbl9ldmFsX2FkYXY4MHhfZGFpc1swXS5jb2RlY19uYW1lID0gY29kZWNfbmFtZTsKKworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZiZmluX2V2YWxfYWRhdjgweCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGJmaW5fZXZhbF9hZGF2ODB4X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGJmaW5fZXZhbF9hZGF2ODB4X2lkc1tdID0geworCXsgImJmaW4tZXZhbC1hZGF2ODAxIiwgQkZJTl9FVkFMX0FEQVY4MDEgfSwKKwl7ICJiZmluLWV2YWwtYWRhdjgwMyIsIEJGSU5fRVZBTF9BREFWODAzIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIGJmaW5fZXZhbF9hZGF2ODB4X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJmaW5fZXZhbF9hZGF2ODB4X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJiZmluLWV2YWwtYWRhdjgweCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSAmc25kX3NvY19wbV9vcHMsCisJfSwKKwkucHJvYmUgPSBiZmluX2V2YWxfYWRhdjgweF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYmZpbl9ldmFsX2FkYXY4MHhfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBiZmluX2V2YWxfYWRhdjgweF9pZHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBiZmluX2V2YWxfYWRhdjgweF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYmZpbl9ldmFsX2FkYXY4MHhfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGJmaW5fZXZhbF9hZGF2ODB4X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYmZpbl9ldmFsX2FkYXY4MHhfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZiZmluX2V2YWxfYWRhdjgweF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYmZpbl9ldmFsX2FkYXY4MHhfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBiZmluIGFkYXY4MHggZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKaW5kZXggOTgxNzVhMC4uMzZhMDMwZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZwpAQCAtMTcsNiArMTcsNyBAQAogCXNlbGVjdCBTTkRfU09DX0FEMTkzWCBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCiAJc2VsZWN0IFNORF9TT0NfQUQxOTgwIGlmIFNORF9TT0NfQUM5N19CVVMKIAlzZWxlY3QgU05EX1NPQ19BRDczMzExCisJc2VsZWN0IFNORF9TT0NfQURBVjgwWAogCXNlbGVjdCBTTkRfU09DX0FEUzExN1gKIAlzZWxlY3QgU05EX1NPQ19BSzQxMDQgaWYgU1BJX01BU1RFUgogCXNlbGVjdCBTTkRfU09DX0FLNDUzNSBpZiBJMkMKQEAgLTQyLDYgKzQzLDcgQEAKIAlzZWxlY3QgU05EX1NPQ19TTjk1MDMxIGlmIElOVEVMX1NDVV9JUEMKIAlzZWxlY3QgU05EX1NPQ19TUERJRgogCXNlbGVjdCBTTkRfU09DX1NTTTI2MDIgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX1NUQTMyWCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19TVEFDOTc2NiBpZiBTTkRfU09DX0FDOTdfQlVTCiAJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjYgaWYgU1BJX01BU1RFUgpAQCAtNzEsNiArNzMsNyBAQAogCXNlbGVjdCBTTkRfU09DX1dNODc1MyBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCiAJc2VsZWN0IFNORF9TT0NfV004NzcwIGlmIFNQSV9NQVNURVIKIAlzZWxlY3QgU05EX1NPQ19XTTg3NzYgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX1dNODc4MgogCXNlbGVjdCBTTkRfU09DX1dNODgwNCBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCiAJc2VsZWN0IFNORF9TT0NfV004OTAwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1dNODkwMyBpZiBJMkMKQEAgLTg0LDYgKzg3LDcgQEAKIAlzZWxlY3QgU05EX1NPQ19XTTg5NzEgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfV004OTc0IGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1dNODk3OCBpZiBJMkMKKwlzZWxlY3QgU05EX1NPQ19XTTg5ODMgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfU09DX1dNODk4NSBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCiAJc2VsZWN0IFNORF9TT0NfV004OTg4IGlmIFNORF9TT0NfSTJDX0FORF9TUEkKIAlzZWxlY3QgU05EX1NPQ19XTTg5OTAgaWYgSTJDCkBAIC0xMzAsNyArMTM0LDE0IEBACiAKIGNvbmZpZyBTTkRfU09DX0FENzMzMTEKIAl0cmlzdGF0ZQotCQorCitjb25maWcgU05EX1NPQ19BREFVMTcwMQorCXNlbGVjdCBTSUdNQQorCXRyaXN0YXRlCisKK2NvbmZpZyBTTkRfU09DX0FEQVY4MFgKKwl0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19BRFMxMTdYCiAJdHJpc3RhdGUKIApAQCAtMjE2LDYgKzIyNyw5IEBACiBjb25maWcgU05EX1NPQ19TU00yNjAyCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfU1RBMzJYCisJdHJpc3RhdGUKKwogY29uZmlnIFNORF9TT0NfU1RBQzk3NjYKIAl0cmlzdGF0ZQogCkBAIC0yOTksNiArMzEzLDkgQEAKIGNvbmZpZyBTTkRfU09DX1dNODc3NgogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX1dNODc4MgorCXRyaXN0YXRlCisKIGNvbmZpZyBTTkRfU09DX1dNODgwNAogCXRyaXN0YXRlCiAKQEAgLTMzOCw2ICszNTUsOSBAQAogY29uZmlnIFNORF9TT0NfV004OTc4CiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfV004OTgzCisJdHJpc3RhdGUKKwogY29uZmlnIFNORF9TT0NfV004OTg1CiAJdHJpc3RhdGUKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZSBiL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKaW5kZXggZmQ4NTU4NC4uZGE5OTkwZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCkBAIC00LDYgKzQsOCBAQAogc25kLXNvYy1hZDE5M3gtb2JqcyA6PSBhZDE5M3gubwogc25kLXNvYy1hZDE5ODAtb2JqcyA6PSBhZDE5ODAubwogc25kLXNvYy1hZDczMzExLW9ianMgOj0gYWQ3MzMxMS5vCitzbmQtc29jLWFkYXUxNzAxLW9ianMgOj0gYWRhdTE3MDEubworc25kLXNvYy1hZGF2ODB4LW9ianMgOj0gYWRhdjgweC5vCiBzbmQtc29jLWFkczExN3gtb2JqcyA6PSBhZHMxMTd4Lm8KIHNuZC1zb2MtYWs0MTA0LW9ianMgOj0gYWs0MTA0Lm8KIHNuZC1zb2MtYWs0NTM1LW9ianMgOj0gYWs0NTM1Lm8KQEAgLTI4LDYgKzMwLDcgQEAKIHNuZC1zb2Mtc245NTAzMS1vYmpzIDo9IHNuOTUwMzEubwogc25kLXNvYy1zcGRpZi1vYmpzIDo9IHNwZGlmX3RyYW5zY2lldmVyLm8KIHNuZC1zb2Mtc3NtMjYwMi1vYmpzIDo9IHNzbTI2MDIubworc25kLXNvYy1zdGEzMngtb2JqcyA6PSBzdGEzMngubwogc25kLXNvYy1zdGFjOTc2Ni1vYmpzIDo9IHN0YWM5NzY2Lm8KIHNuZC1zb2MtdGx2MzIwYWljMjMtb2JqcyA6PSB0bHYzMjBhaWMyMy5vCiBzbmQtc29jLXRsdjMyMGFpYzI2LW9ianMgOj0gdGx2MzIwYWljMjYubwpAQCAtNTUsNiArNTgsNyBAQAogc25kLXNvYy13bTg3NTMtb2JqcyA6PSB3bTg3NTMubwogc25kLXNvYy13bTg3NzAtb2JqcyA6PSB3bTg3NzAubwogc25kLXNvYy13bTg3NzYtb2JqcyA6PSB3bTg3NzYubworc25kLXNvYy13bTg3ODItb2JqcyA6PSB3bTg3ODIubwogc25kLXNvYy13bTg4MDQtb2JqcyA6PSB3bTg4MDQubwogc25kLXNvYy13bTg5MDAtb2JqcyA6PSB3bTg5MDAubwogc25kLXNvYy13bTg5MDMtb2JqcyA6PSB3bTg5MDMubwpAQCAtNjgsNiArNzIsNyBAQAogc25kLXNvYy13bTg5NzEtb2JqcyA6PSB3bTg5NzEubwogc25kLXNvYy13bTg5NzQtb2JqcyA6PSB3bTg5NzQubwogc25kLXNvYy13bTg5Nzgtb2JqcyA6PSB3bTg5Nzgubworc25kLXNvYy13bTg5ODMtb2JqcyA6PSB3bTg5ODMubwogc25kLXNvYy13bTg5ODUtb2JqcyA6PSB3bTg5ODUubwogc25kLXNvYy13bTg5ODgtb2JqcyA6PSB3bTg5ODgubwogc25kLXNvYy13bTg5OTAtb2JqcyA6PSB3bTg5OTAubwpAQCAtOTUsNiArMTAwLDggQEAKIG9iai0kKENPTkZJR19TTkRfU09DX0FEMTkzWCkJKz0gc25kLXNvYy1hZDE5M3gubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQUQxOTgwKQkrPSBzbmQtc29jLWFkMTk4MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRDczMzExKSArPSBzbmQtc29jLWFkNzMzMTEubworb2JqLSQoQ09ORklHX1NORF9TT0NfQURBVTE3MDEpICArPSBzbmQtc29jLWFkYXUxNzAxLm8KK29iai0kKENPTkZJR19TTkRfU09DX0FEQVY4MFgpICArPSBzbmQtc29jLWFkYXY4MHgubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQURTMTE3WCkJKz0gc25kLXNvYy1hZHMxMTd4Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FLNDEwNCkJKz0gc25kLXNvYy1hazQxMDQubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQUs0NTM1KQkrPSBzbmQtc29jLWFrNDUzNS5vCkBAIC0xMjAsNiArMTI3LDcgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1NOOTUwMzEpCSs9c25kLXNvYy1zbjk1MDMxLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1NQRElGKQkrPSBzbmQtc29jLXNwZGlmLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1NTTTI2MDIpCSs9IHNuZC1zb2Mtc3NtMjYwMi5vCitvYmotJChDT05GSUdfU05EX1NPQ19TVEEzMlgpICAgKz0gc25kLXNvYy1zdGEzMngubwogb2JqLSQoQ09ORklHX1NORF9TT0NfU1RBQzk3NjYpCSs9IHNuZC1zb2Mtc3RhYzk3NjYubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDMjMpCSs9IHNuZC1zb2MtdGx2MzIwYWljMjMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDMjYpCSs9IHNuZC1zb2MtdGx2MzIwYWljMjYubwpAQCAtMTQ3LDYgKzE1NSw3IEBACiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg3NTMpCSs9IHNuZC1zb2Mtd204NzUzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODc3MCkJKz0gc25kLXNvYy13bTg3NzAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV004Nzc2KQkrPSBzbmQtc29jLXdtODc3Ni5vCitvYmotJChDT05GSUdfU05EX1NPQ19XTTg3ODIpCSs9IHNuZC1zb2Mtd204NzgyLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODgwNCkJKz0gc25kLXNvYy13bTg4MDQubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV004OTAwKQkrPSBzbmQtc29jLXdtODkwMC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg5MDMpCSs9IHNuZC1zb2Mtd204OTAzLm8KQEAgLTE2MCw2ICsxNjksNyBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfV004OTcxKQkrPSBzbmQtc29jLXdtODk3MS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg5NzQpCSs9IHNuZC1zb2Mtd204OTc0Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODk3OCkJKz0gc25kLXNvYy13bTg5Nzgubworb2JqLSQoQ09ORklHX1NORF9TT0NfV004OTgzKQkrPSBzbmQtc29jLXdtODk4My5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg5ODUpCSs9IHNuZC1zb2Mtd204OTg1Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODk4OCkJKz0gc25kLXNvYy13bTg5ODgubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV004OTkwKQkrPSBzbmQtc29jLXdtODk5MC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYwppbmRleCBhYjYzZDUyLi40ZTVjNTcyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMKQEAgLTEsMTkgKzEsMTAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIHNvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMKLSAqIEF1dGhvcjogICAgICAgQmFycnkgU29uZyA8QmFycnkuU29uZ0BhbmFsb2cuY29tPgorIC8qCisgKiBBdWRpbyBDb2RlYyBkcml2ZXIgc3VwcG9ydGluZzoKKyAqICBBRDE4MzVBLCBBRDE4MzYsIEFEMTgzN0EsIEFEMTgzOEEsIEFEMTgzOUEKICAqCi0gKiBDcmVhdGVkOiAgICAgIEF1ZyAwNCAyMDA5Ci0gKiBEZXNjcmlwdGlvbjogIERyaXZlciBmb3IgQUQxODM2IHNvdW5kIGNoaXAKKyAqIENvcHlyaWdodCAyMDA5LTIwMTEgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0zMCwxMCArMjEsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSAiYWQxODM2LmgiCiAKK2VudW0gYWQxODM2X3R5cGUgeworCUFEMTgzNSwKKwlBRDE4MzYsCisJQUQxODM4LAorfTsKKwogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgYWQxODM2X3ByaXYgewotCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKKwllbnVtIGFkMTgzNl90eXBlIHR5cGU7CiB9OwogCiAvKgpAQCAtNDQsMjkgKzQwLDYwIEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkMTgzNl9kZWVtcF9lbnVtID0KIAlTT0NfRU5VTV9TSU5HTEUoQUQxODM2X0RBQ19DVFJMMSwgOCwgNCwgYWQxODM2X2RlZW1wKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkMTgzNl9zbmRfY29udHJvbHNbXSA9IHsKLQkvKiBEQUMgdm9sdW1lIGNvbnRyb2wgKi8KLQlTT0NfRE9VQkxFX1IoIkRBQzEgVm9sdW1lIiwgQUQxODM2X0RBQ19MMV9WT0wsCi0JCQlBRDE4MzZfREFDX1IxX1ZPTCwgMCwgMHgzRkYsIDApLAotCVNPQ19ET1VCTEVfUigiREFDMiBWb2x1bWUiLCBBRDE4MzZfREFDX0wyX1ZPTCwKLQkJCUFEMTgzNl9EQUNfUjJfVk9MLCAwLCAweDNGRiwgMCksCi0JU09DX0RPVUJMRV9SKCJEQUMzIFZvbHVtZSIsIEFEMTgzNl9EQUNfTDNfVk9MLAotCQkJQUQxODM2X0RBQ19SM19WT0wsIDAsIDB4M0ZGLCAwKSwKKyNkZWZpbmUgQUQxODM2X0RBQ19WT0xVTUUoeCkgXAorCVNPQ19ET1VCTEVfUigiREFDIiAjeCAiIFBsYXliYWNrIFZvbHVtZSIsIEFEMTgzNl9EQUNfTF9WT0woeCksIFwKKwkJCUFEMTgzNl9EQUNfUl9WT0woeCksIDAsIDB4M0ZGLCAwKQogCi0JLyogQURDIHN3aXRjaCBjb250cm9sICovCi0JU09DX0RPVUJMRSgiQURDMSBTd2l0Y2giLCBBRDE4MzZfQURDX0NUUkwyLCBBRDE4MzZfQURDTDFfTVVURSwKLQkJQUQxODM2X0FEQ1IxX01VVEUsIDEsIDEpLAotCVNPQ19ET1VCTEUoIkFEQzIgU3dpdGNoIiwgQUQxODM2X0FEQ19DVFJMMiwgQUQxODM2X0FEQ0wyX01VVEUsCi0JCUFEMTgzNl9BRENSMl9NVVRFLCAxLCAxKSwKKyNkZWZpbmUgQUQxODM2X0RBQ19TV0lUQ0goeCkgXAorCVNPQ19ET1VCTEUoIkRBQyIgI3ggIiBQbGF5YmFjayBTd2l0Y2giLCBBRDE4MzZfREFDX0NUUkwyLCBcCisJCQlBRDE4MzZfTVVURV9MRUZUKHgpLCBBRDE4MzZfTVVURV9SSUdIVCh4KSwgMSwgMSkKIAotCS8qIERBQyBzd2l0Y2ggY29udHJvbCAqLwotCVNPQ19ET1VCTEUoIkRBQzEgU3dpdGNoIiwgQUQxODM2X0RBQ19DVFJMMiwgQUQxODM2X0RBQ0wxX01VVEUsCi0JCUFEMTgzNl9EQUNSMV9NVVRFLCAxLCAxKSwKLQlTT0NfRE9VQkxFKCJEQUMyIFN3aXRjaCIsIEFEMTgzNl9EQUNfQ1RSTDIsIEFEMTgzNl9EQUNMMl9NVVRFLAotCQlBRDE4MzZfREFDUjJfTVVURSwgMSwgMSksCi0JU09DX0RPVUJMRSgiREFDMyBTd2l0Y2giLCBBRDE4MzZfREFDX0NUUkwyLCBBRDE4MzZfREFDTDNfTVVURSwKLQkJQUQxODM2X0RBQ1IzX01VVEUsIDEsIDEpLAorI2RlZmluZSBBRDE4MzZfQURDX1NXSVRDSCh4KSBcCisJU09DX0RPVUJMRSgiQURDIiAjeCAiIENhcHR1cmUgU3dpdGNoIiwgQUQxODM2X0FEQ19DVFJMMiwgXAorCQlBRDE4MzZfTVVURV9MRUZUKHgpLCBBRDE4MzZfTVVURV9SSUdIVCh4KSwgMSwgMSkKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkMTgzeF9kYWNfY29udHJvbHNbXSA9IHsKKwlBRDE4MzZfREFDX1ZPTFVNRSgxKSwKKwlBRDE4MzZfREFDX1NXSVRDSCgxKSwKKwlBRDE4MzZfREFDX1ZPTFVNRSgyKSwKKwlBRDE4MzZfREFDX1NXSVRDSCgyKSwKKwlBRDE4MzZfREFDX1ZPTFVNRSgzKSwKKwlBRDE4MzZfREFDX1NXSVRDSCgzKSwKKwlBRDE4MzZfREFDX1ZPTFVNRSg0KSwKKwlBRDE4MzZfREFDX1NXSVRDSCg0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhZDE4M3hfZGFjX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9PVVRQVVQoIkRBQzFPVVQiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJEQUMyT1VUIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiREFDM09VVCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkRBQzRPVVQiKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGFkMTgzeF9kYWNfcm91dGVzW10gPSB7CisJeyAiREFDMU9VVCIsIE5VTEwsICJEQUMiIH0sCisJeyAiREFDMk9VVCIsIE5VTEwsICJEQUMiIH0sCisJeyAiREFDM09VVCIsIE5VTEwsICJEQUMiIH0sCisJeyAiREFDNE9VVCIsIE5VTEwsICJEQUMiIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWQxODN4X2FkY19jb250cm9sc1tdID0geworCUFEMTgzNl9BRENfU1dJVENIKDEpLAorCUFEMTgzNl9BRENfU1dJVENIKDIpLAorCUFEMTgzNl9BRENfU1dJVENIKDMpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFkMTgzeF9hZGNfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0lOUFVUKCJBREMxSU4iKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFEQzJJTiIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYWQxODN4X2FkY19yb3V0ZXNbXSA9IHsKKwl7ICJBREMiLCBOVUxMLCAiQURDMUlOIiB9LAorCXsgIkFEQyIsIE5VTEwsICJBREMySU4iIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWQxODN4X2NvbnRyb2xzW10gPSB7CiAJLyogQURDIGhpZ2gtcGFzcyBmaWx0ZXIgKi8KIAlTT0NfU0lOR0xFKCJBREMgSGlnaCBQYXNzIEZpbHRlciBTd2l0Y2giLCBBRDE4MzZfQURDX0NUUkwxLAogCQkJQUQxODM2X0FEQ19ISUdIUEFTU19GSUxURVIsIDEsIDApLApAQCAtNzUsMjcgKzEwMiwyNCBAQAogCVNPQ19FTlVNKCJQbGF5YmFjayBEZWVtcGhhc2lzIiwgYWQxODM2X2RlZW1wX2VudW0pLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFkMTgzNl9kYXBtX3dpZGdldHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhZDE4M3hfZGFwbV93aWRnZXRzW10gPSB7CiAJU05EX1NPQ19EQVBNX0RBQygiREFDIiwgIlBsYXliYWNrIiwgQUQxODM2X0RBQ19DVFJMMSwKIAkJCQlBRDE4MzZfREFDX1BPV0VSRE9XTiwgMSksCiAJU05EX1NPQ19EQVBNX0FEQygiQURDIiwgIkNhcHR1cmUiLCBTTkRfU09DX05PUE0sIDAsIDApLAogCVNORF9TT0NfREFQTV9TVVBQTFkoIkFEQ19QV1IiLCBBRDE4MzZfQURDX0NUUkwxLAogCQkJCUFEMTgzNl9BRENfUE9XRVJET1dOLCAxLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJEQUMxT1VUIiksCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiREFDMk9VVCIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIkRBQzNPVVQiKSwKLQlTTkRfU09DX0RBUE1fSU5QVVQoIkFEQzFJTiIpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiQURDMklOIiksCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19wYXRoc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYWQxODN4X2RhcG1fcm91dGVzW10gPSB7CiAJeyAiREFDIiwgTlVMTCwgIkFEQ19QV1IiIH0sCiAJeyAiQURDIiwgTlVMTCwgIkFEQ19QV1IiIH0sCi0JeyAiREFDMU9VVCIsICJEQUMxIFN3aXRjaCIsICJEQUMiIH0sCi0JeyAiREFDMk9VVCIsICJEQUMyIFN3aXRjaCIsICJEQUMiIH0sCi0JeyAiREFDM09VVCIsICJEQUMzIFN3aXRjaCIsICJEQUMiIH0sCi0JeyAiQURDIiwgIkFEQzEgU3dpdGNoIiwgIkFEQzFJTiIgfSwKLQl7ICJBREMiLCAiQURDMiBTd2l0Y2giLCAiQURDMklOIiB9LAorfTsKKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkMTgzNl9pbl90bHYsIDAsIDMwMCwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZDE4MzZfY29udHJvbHNbXSA9IHsKKwlTT0NfRE9VQkxFX1RMVigiQURDMiBDYXB0dXJlIFZvbHVtZSIsIEFEMTgzNl9BRENfQ1RSTDEsIDMsIDAsIDQsIDAsCisJICAgIGFkMTgzNl9pbl90bHYpLAogfTsKIAogLyoKQEAgLTE0NSw4NCArMTY5LDg5IEBACiAJLyogYml0IHNpemUgKi8KIAlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCXdvcmRfbGVuID0gMzsKKwkJd29yZF9sZW4gPSBBRDE4MzZfV09SRF9MRU5fMTY7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjBfM0xFOgotCQl3b3JkX2xlbiA9IDE7CisJCXdvcmRfbGVuID0gQUQxODM2X1dPUkRfTEVOXzIwOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCXdvcmRfbGVuID0gMDsKKwkJd29yZF9sZW4gPSBBRDE4MzZfV09SRF9MRU5fMjQ7CiAJCWJyZWFrOwogCX0KIAotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEMTgzNl9EQUNfQ1RSTDEsCi0JCUFEMTgzNl9EQUNfV09SRF9MRU5fTUFTSywgd29yZF9sZW4pOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEMTgzNl9EQUNfQ1RSTDEsIEFEMTgzNl9EQUNfV09SRF9MRU5fTUFTSywKKwkJd29yZF9sZW4gPDwgQUQxODM2X0RBQ19XT1JEX0xFTl9PRkZTRVQpOwogCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUQxODM2X0FEQ19DVFJMMiwKLQkJQUQxODM2X0FEQ19XT1JEX0xFTl9NQVNLLCB3b3JkX2xlbik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUQxODM2X0FEQ19DVFJMMiwgQUQxODM2X0FEQ19XT1JEX0xFTl9NQVNLLAorCQl3b3JkX2xlbiA8PCBBRDE4MzZfQURDX1dPUkRfT0ZGU0VUKTsKIAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGFkMTgzNl9zb2Nfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCXBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQkvKiByZXNldCBjbG9jayBjb250cm9sIG1vZGUgKi8KLQl1MTYgYWRjX2N0cmwyID0gc25kX3NvY19yZWFkKGNvZGVjLCBBRDE4MzZfQURDX0NUUkwyKTsKLQlhZGNfY3RybDIgJj0gfkFEMTgzNl9BRENfU0VSRk1UX01BU0s7Ci0KLQlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgQUQxODM2X0FEQ19DVFJMMiwgYWRjX2N0cmwyKTsKLX0KLQotc3RhdGljIGludCBhZDE4MzZfc29jX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JLyogcmVzdG9yZSBjbG9jayBjb250cm9sIG1vZGUgKi8KLQl1MTYgYWRjX2N0cmwyID0gc25kX3NvY19yZWFkKGNvZGVjLCBBRDE4MzZfQURDX0NUUkwyKTsKLQlhZGNfY3RybDIgfD0gQUQxODM2X0FEQ19BVVg7Ci0KLQlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgQUQxODM2X0FEQ19DVFJMMiwgYWRjX2N0cmwyKTsKLX0KLSNlbHNlCi0jZGVmaW5lIGFkMTgzNl9zb2Nfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGFkMTgzNl9zb2NfcmVzdW1lICBOVUxMCi0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgYWQxODM2X2RhaV9vcHMgPSB7CiAJLmh3X3BhcmFtcyA9IGFkMTgzNl9od19wYXJhbXMsCiAJLnNldF9mbXQgPSBhZDE4MzZfc2V0X2RhaV9mbXQsCiB9OwogCi0vKiBjb2RlYyBEQUkgaW5zdGFuY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGFkMTgzNl9kYWkgPSB7Ci0JLm5hbWUgPSAiYWQxODM2LWhpZmkiLAotCS5wbGF5YmFjayA9IHsKLQkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKLQkJLmNoYW5uZWxzX21pbiA9IDIsCi0JCS5jaGFubmVsc19tYXggPSA2LAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCVNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCX0sCi0JLmNhcHR1cmUgPSB7Ci0JCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKLQkJLmNoYW5uZWxzX21pbiA9IDIsCi0JCS5jaGFubmVsc19tYXggPSA0LAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCVNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCX0sCi0JLm9wcyA9ICZhZDE4MzZfZGFpX29wcywKKyNkZWZpbmUgQUQxODNYX0RBSShfbmFtZSwgbnVtX2RhY3MsIG51bV9hZGNzKSBcCit7IFwKKwkubmFtZSA9IF9uYW1lICItaGlmaSIsIFwKKwkucGxheWJhY2sgPSB7IFwKKwkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwgXAorCQkuY2hhbm5lbHNfbWluID0gMiwgXAorCQkuY2hhbm5lbHNfbWF4ID0gKG51bV9kYWNzKSAqIDIsIFwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsICBcCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLCBcCisJfSwgXAorCS5jYXB0dXJlID0geyBcCisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwgXAorCQkuY2hhbm5lbHNfbWluID0gMiwgXAorCQkuY2hhbm5lbHNfbWF4ID0gKG51bV9hZGNzKSAqIDIsIFwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsIFwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgXAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsIFwKKwl9LCBcCisJLm9wcyA9ICZhZDE4MzZfZGFpX29wcywgXAorfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBhZDE4M3hfZGFpc1tdID0geworCVtBRDE4MzVdID0gQUQxODNYX0RBSSgiYWQxODM1IiwgNCwgMSksCisJW0FEMTgzNl0gPSBBRDE4M1hfREFJKCJhZDE4MzYiLCAzLCAyKSwKKwlbQUQxODM4XSA9IEFEMTgzWF9EQUkoImFkMTgzOCIsIDMsIDEpLAogfTsKIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhZDE4MzZfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwkvKiByZXNldCBjbG9jayBjb250cm9sIG1vZGUgKi8KKwlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUQxODM2X0FEQ19DVFJMMiwKKwkJQUQxODM2X0FEQ19TRVJGTVRfTUFTSywgMCk7Cit9CisKK3N0YXRpYyBpbnQgYWQxODM2X3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJLyogcmVzdG9yZSBjbG9jayBjb250cm9sIG1vZGUgKi8KKwlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUQxODM2X0FEQ19DVFJMMiwKKwkJQUQxODM2X0FEQ19TRVJGTVRfTUFTSywgQUQxODM2X0FEQ19BVVgpOworfQorI2Vsc2UKKyNkZWZpbmUgYWQxODM2X3N1c3BlbmQgTlVMTAorI2RlZmluZSBhZDE4MzZfcmVzdW1lICBOVUxMCisjZW5kaWYKKwogc3RhdGljIGludCBhZDE4MzZfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhZDE4MzZfcHJpdiAqYWQxODM2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCWludCBudW1fZGFjcywgbnVtX2FkY3M7CiAJaW50IHJldCA9IDA7CisJaW50IGk7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gYWQxODM2LT5jb250cm9sX2RhdGE7CisJbnVtX2RhY3MgPSBhZDE4M3hfZGFpc1thZDE4MzYtPnR5cGVdLnBsYXliYWNrLmNoYW5uZWxzX21heCAvIDI7CisJbnVtX2FkY3MgPSBhZDE4M3hfZGFpc1thZDE4MzYtPnR5cGVdLmNhcHR1cmUuY2hhbm5lbHNfbWF4IC8gMjsKKwogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA0LCAxMiwgU05EX1NPQ19TUEkpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwKQEAgLTIzOSwyMSArMjY4LDQ2IEBACiAJc25kX3NvY193cml0ZShjb2RlYywgQUQxODM2X0FEQ19DVFJMMSwgMHgxMDApOwogCS8qIHVubXV0ZSBhZGMgY2hhbm5sZXMsIGFkYyBhdXggbW9kZSAqLwogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEMTgzNl9BRENfQ1RSTDIsIDB4MTgwKTsKLQkvKiBsZWZ0L3JpZ2h0IGRpZmY6UEdBL01VWCAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEMTgzNl9BRENfQ1RSTDMsIDB4M0EpOwogCS8qIHZvbHVtZSAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEMTgzNl9EQUNfTDFfVk9MLCAweDNGRik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgQUQxODM2X0RBQ19SMV9WT0wsIDB4M0ZGKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBRDE4MzZfREFDX0wyX1ZPTCwgMHgzRkYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEMTgzNl9EQUNfUjJfVk9MLCAweDNGRik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgQUQxODM2X0RBQ19MM19WT0wsIDB4M0ZGKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBRDE4MzZfREFDX1IzX1ZPTCwgMHgzRkYpOworCWZvciAoaSA9IDE7IGkgPD0gbnVtX2RhY3M7ICsraSkgeworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBRDE4MzZfREFDX0xfVk9MKGkpLCAweDNGRik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEMTgzNl9EQUNfUl9WT0woaSksIDB4M0ZGKTsKKwl9CiAKLQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgYWQxODM2X3NuZF9jb250cm9scywKLQkJCSAgICAgQVJSQVlfU0laRShhZDE4MzZfc25kX2NvbnRyb2xzKSk7Ci0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhZDE4MzZfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRShhZDE4MzZfZGFwbV93aWRnZXRzKSk7Ci0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fcGF0aHMsIEFSUkFZX1NJWkUoYXVkaW9fcGF0aHMpKTsKKwlpZiAoYWQxODM2LT50eXBlID09IEFEMTgzNikgeworCQkvKiBsZWZ0L3JpZ2h0IGRpZmY6UEdBL01VWCAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBRDE4MzZfQURDX0NUUkwzLCAweDNBKTsKKwkJcmV0ID0gc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIGFkMTgzNl9jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKGFkMTgzNl9jb250cm9scykpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBRDE4MzZfQURDX0NUUkwzLCAweDAwKTsKKwl9CisKKwlyZXQgPSBzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgYWQxODN4X2RhY19jb250cm9scywgbnVtX2RhY3MgKiAyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIGFkMTgzeF9hZGNfY29udHJvbHMsIG51bV9hZGNzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhZDE4M3hfZGFjX2RhcG1fd2lkZ2V0cywgbnVtX2RhY3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGFkMTgzeF9hZGNfZGFwbV93aWRnZXRzLCBudW1fYWRjcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGFkMTgzeF9kYWNfcm91dGVzLCBudW1fZGFjcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGFkMTgzeF9hZGNfcm91dGVzLCBudW1fYWRjcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNjIsMTkgKzMxNiwyNCBAQAogc3RhdGljIGludCBhZDE4MzZfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAkvKiByZXNldCBjbG9jayBjb250cm9sIG1vZGUgKi8KLQl1MTYgYWRjX2N0cmwyID0gc25kX3NvY19yZWFkKGNvZGVjLCBBRDE4MzZfQURDX0NUUkwyKTsKLQlhZGNfY3RybDIgJj0gfkFEMTgzNl9BRENfU0VSRk1UX01BU0s7Ci0KLQlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgQUQxODM2X0FEQ19DVFJMMiwgYWRjX2N0cmwyKTsKKwlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUQxODM2X0FEQ19DVFJMMiwKKwkJQUQxODM2X0FEQ19TRVJGTVRfTUFTSywgMCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9hZDE4MzYgPSB7Ci0JLnByb2JlID0gCWFkMTgzNl9wcm9iZSwKLQkucmVtb3ZlID0gCWFkMTgzNl9yZW1vdmUsCi0JLnN1c3BlbmQgPSAgICAgIGFkMTgzNl9zb2Nfc3VzcGVuZCwKLQkucmVzdW1lID0gICAgICAgYWQxODM2X3NvY19yZXN1bWUsCisJLnByb2JlID0gYWQxODM2X3Byb2JlLAorCS5yZW1vdmUgPSBhZDE4MzZfcmVtb3ZlLAorCS5zdXNwZW5kID0gYWQxODM2X3N1c3BlbmQsCisJLnJlc3VtZSA9IGFkMTgzNl9yZXN1bWUsCiAJLnJlZ19jYWNoZV9zaXplID0gQUQxODM2X05VTV9SRUdTLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHUxNiksCisKKwkuY29udHJvbHMgPSBhZDE4M3hfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWQxODN4X2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gYWQxODN4X2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWQxODN4X2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYWQxODN4X2RhcG1fcm91dGVzLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkMTgzeF9kYXBtX3JvdXRlcyksCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDE4MzZfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCkBAIC0yODYsMTIgKzM0NSwxMiBAQAogCWlmIChhZDE4MzYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlhZDE4MzYtPnR5cGUgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YTsKKwogCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGFkMTgzNik7Ci0JYWQxODM2LT5jb250cm9sX2RhdGEgPSBzcGk7Ci0JYWQxODM2LT5jb250cm9sX3R5cGUgPSBTTkRfU09DX1NQSTsKIAogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LAotCQkJJnNvY19jb2RlY19kZXZfYWQxODM2LCAmYWQxODM2X2RhaSwgMSk7CisJCQkmc29jX2NvZGVjX2Rldl9hZDE4MzYsICZhZDE4M3hfZGFpc1thZDE4MzYtPnR5cGVdLCAxKTsKIAlpZiAocmV0IDwgMCkKIAkJa2ZyZWUoYWQxODM2KTsKIAlyZXR1cm4gcmV0OwpAQCAtMzAzLDI3ICszNjIsMjkgQEAKIAlrZnJlZShzcGlfZ2V0X2RydmRhdGEoc3BpKSk7CiAJcmV0dXJuIDA7CiB9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQxODM2X2lkc1tdID0geworCXsgImFkMTgzNSIsIEFEMTgzNSB9LAorCXsgImFkMTgzNiIsIEFEMTgzNiB9LAorCXsgImFkMTgzNyIsIEFEMTgzNSB9LAorCXsgImFkMTgzOCIsIEFEMTgzOCB9LAorCXsgImFkMTgzOSIsIEFEMTgzOCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWQxODM2X2lkcyk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDE4MzZfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZQk9ICJhZDE4MzYtY29kZWMiLAorCQkubmFtZQk9ICJhZDE4MzYiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogCS5wcm9iZQkJPSBhZDE4MzZfc3BpX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQxODM2X3NwaV9yZW1vdmUpLAorCS5pZF90YWJsZQk9IGFkMTgzNl9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhZDE4MzZfaW5pdCh2b2lkKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDE4MzZfc3BpX2RyaXZlcik7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIGFkMTgzNiBTUEkgZHJpdmVyOiAlZFxuIiwKLQkJCQlyZXQpOwotCX0KLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkMTgzNl9zcGlfZHJpdmVyKTsKIH0KIG1vZHVsZV9pbml0KGFkMTgzNl9pbml0KTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmgKaW5kZXggODQ1NTk2Ny4uNDQ0NzQ3ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5oCkBAIC0xLDE5ICsxLDEwIEBACiAvKgotICogRmlsZTogICAgICAgICBzb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgQmFycnkgU29uZyA8QmFycnkuU29uZ0BhbmFsb2cuY29tPgorICogQXVkaW8gQ29kZWMgZHJpdmVyIHN1cHBvcnRpbmc6CisgKiAgQUQxODM1QSwgQUQxODM2LCBBRDE4MzdBLCBBRDE4MzhBLCBBRDE4MzlBCiAgKgotICogQ3JlYXRlZDogICAgICBBdWcgMDQsIDIwMDkKLSAqIERlc2NyaXB0aW9uOiAgZGVmaW5pdGlvbnMgZm9yIEFEMTgzNiByZWdpc3RlcnMKKyAqIENvcHlyaWdodCAyMDA5LTIwMTEgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9fQUQxODM2X0hfXwpAQCAtMjEsMzcgKzEyLDMwIEBACiAKICNkZWZpbmUgQUQxODM2X0RBQ19DVFJMMSAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQUQxODM2X0RBQ19QT1dFUkRPV04gICAgICAgICAgIDIKLSNkZWZpbmUgQUQxODM2X0RBQ19TRVJGTVRfTUFTSwkgICAgICAgMHhFMAorI2RlZmluZSBBRDE4MzZfREFDX1NFUkZNVF9NQVNLICAgICAgICAgMHhFMAogI2RlZmluZSBBRDE4MzZfREFDX1NFUkZNVF9QQ0syNTYgICAgICAgKDB4NCA8PCA1KQogI2RlZmluZSBBRDE4MzZfREFDX1NFUkZNVF9QQ0sxMjggICAgICAgKDB4NSA8PCA1KQogI2RlZmluZSBBRDE4MzZfREFDX1dPUkRfTEVOX01BU0sgICAgICAgMHgxOAorI2RlZmluZSBBRDE4MzZfREFDX1dPUkRfTEVOX09GRlNFVCAgICAgMwogCiAjZGVmaW5lIEFEMTgzNl9EQUNfQ1RSTDIgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFEMTgzNl9EQUNMMV9NVVRFICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFEMTgzNl9EQUNSMV9NVVRFICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFEMTgzNl9EQUNMMl9NVVRFICAgICAgICAgICAgICAyCi0jZGVmaW5lIEFEMTgzNl9EQUNSMl9NVVRFICAgICAgICAgICAgICAzCi0jZGVmaW5lIEFEMTgzNl9EQUNMM19NVVRFICAgICAgICAgICAgICA0Ci0jZGVmaW5lIEFEMTgzNl9EQUNSM19NVVRFICAgICAgICAgICAgICA1CiAKLSNkZWZpbmUgQUQxODM2X0RBQ19MMV9WT0wgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQUQxODM2X0RBQ19SMV9WT0wgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQUQxODM2X0RBQ19MMl9WT0wgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQUQxODM2X0RBQ19SMl9WT0wgICAgICAgICAgICAgIDUKLSNkZWZpbmUgQUQxODM2X0RBQ19MM19WT0wgICAgICAgICAgICAgIDYKLSNkZWZpbmUgQUQxODM2X0RBQ19SM19WT0wgICAgICAgICAgICAgIDcKKy8qIFRoZXNlIG1hY3JvcyBhcmUgb25lLWJhc2VkLiBTbyBBRDE4M1hfTVVURV9MRUZUKDEpIHdpbGwgcmV0dXJuIHRoZSBtdXRlIGJpdAorICogZm9yIHRoZSBmaXJzdCBBREMvREFDICovCisjZGVmaW5lIEFEMTgzNl9NVVRFX0xFRlQoeCkgKCgoeCkgKiAyKSAtIDIpCisjZGVmaW5lIEFEMTgzNl9NVVRFX1JJR0hUKHgpICgoKHgpICogMikgLSAxKQorCisjZGVmaW5lIEFEMTgzNl9EQUNfTF9WT0woeCkgKCh4KSAqIDIpCisjZGVmaW5lIEFEMTgzNl9EQUNfUl9WT0woeCkgKDEgKyAoKHgpICogMikpCiAKICNkZWZpbmUgQUQxODM2X0FEQ19DVFJMMSAgICAgICAgICAgICAgIDEyCiAjZGVmaW5lIEFEMTgzNl9BRENfUE9XRVJET1dOICAgICAgICAgICA3CiAjZGVmaW5lIEFEMTgzNl9BRENfSElHSFBBU1NfRklMVEVSICAgICA4CiAKICNkZWZpbmUgQUQxODM2X0FEQ19DVFJMMiAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIEFEMTgzNl9BRENMMV9NVVRFIAkJMAotI2RlZmluZSBBRDE4MzZfQURDUjFfTVVURSAJCTEKLSNkZWZpbmUgQUQxODM2X0FEQ0wyX01VVEUgCQkyCi0jZGVmaW5lIEFEMTgzNl9BRENSMl9NVVRFIAkJMwogI2RlZmluZSBBRDE4MzZfQURDX1dPUkRfTEVOX01BU0sgICAgICAgMHgzMAotI2RlZmluZSBBRDE4MzZfQURDX1NFUkZNVF9NQVNLCSAgICAgICAoNyA8PCA2KQorI2RlZmluZSBBRDE4MzZfQURDX1dPUkRfT0ZGU0VUICAgICAgICAgNQorI2RlZmluZSBBRDE4MzZfQURDX1NFUkZNVF9NQVNLICAgICAgICAgKDcgPDwgNikKICNkZWZpbmUgQUQxODM2X0FEQ19TRVJGTVRfUENLMjU2ICAgICAgICgweDQgPDwgNikKICNkZWZpbmUgQUQxODM2X0FEQ19TRVJGTVRfUENLMTI4ICAgICAgICgweDUgPDwgNikKICNkZWZpbmUgQUQxODM2X0FEQ19BVVggICAgICAgICAgICAgICAgICgweDYgPDwgNikKQEAgLTYwLDQgKzQ0LDggQEAKIAogI2RlZmluZSBBRDE4MzZfTlVNX1JFR1MgICAgICAgICAgICAgICAgMTYKIAorI2RlZmluZSBBRDE4MzZfV09SRF9MRU5fMjQgMHgwCisjZGVmaW5lIEFEMTgzNl9XT1JEX0xFTl8yMCAweDEKKyNkZWZpbmUgQUQxODM2X1dPUkRfTEVOXzE2IDB4MgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3MDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3MDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzU4ZDVmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTcwMS5jCkBAIC0wLDAgKzEsNTQ5IEBACisvKgorICogRHJpdmVyIGZvciBBREFVMTcwMSBTaWdtYURTUCBwcm9jZXNzb3IKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBBdXRob3I6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoJYmFzZWQgb24gYW4gaW5pdGFsIHZlcnNpb24gYnkgQ2xpZmYgQ2FpIDxjbGlmZi5jYWlAYW5hbG9nLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ21hLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJhZGF1MTcwMS5oIgorCisjZGVmaW5lIEFEQVUxNzAxX0RTUENUUkwJMHgxYworI2RlZmluZSBBREFVMTcwMV9TRVJPQ1RMCTB4MWUKKyNkZWZpbmUgQURBVTE3MDFfU0VSSUNUTAkweDFmCisKKyNkZWZpbmUgQURBVTE3MDFfQVVYTlBPVwkweDIyCisKKyNkZWZpbmUgQURBVTE3MDFfT1NDSVBPVwkweDI2CisjZGVmaW5lIEFEQVUxNzAxX0RBQ1NFVAkJMHgyNworCisjZGVmaW5lIEFEQVUxNzAxX05VTV9SRUdTCTB4MjgKKworI2RlZmluZSBBREFVMTcwMV9EU1BDVFJMX0NSCQkoMSA8PCAyKQorI2RlZmluZSBBREFVMTcwMV9EU1BDVFJMX0RBTQkJKDEgPDwgMykKKyNkZWZpbmUgQURBVTE3MDFfRFNQQ1RSTF9BRE0JCSgxIDw8IDQpCisjZGVmaW5lIEFEQVUxNzAxX0RTUENUUkxfU1JfNDgJCTB4MDAKKyNkZWZpbmUgQURBVTE3MDFfRFNQQ1RSTF9TUl85NgkJMHgwMQorI2RlZmluZSBBREFVMTcwMV9EU1BDVFJMX1NSXzE5MgkJMHgwMgorI2RlZmluZSBBREFVMTcwMV9EU1BDVFJMX1NSX01BU0sJMHgwMworCisjZGVmaW5lIEFEQVUxNzAxX1NFUk9DVExfSU5WX0xSQ0xLCTB4MjAwMAorI2RlZmluZSBBREFVMTcwMV9TRVJPQ1RMX0lOVl9CQ0xLCTB4MTAwMAorI2RlZmluZSBBREFVMTcwMV9TRVJPQ1RMX01BU1RFUgkJMHgwODAwCisKKyNkZWZpbmUgQURBVTE3MDFfU0VST0NUTF9PQkYxNgkJMHgwMDAwCisjZGVmaW5lIEFEQVUxNzAxX1NFUk9DVExfT0JGOAkJMHgwMjAwCisjZGVmaW5lIEFEQVUxNzAxX1NFUk9DVExfT0JGNAkJMHgwNDAwCisjZGVmaW5lIEFEQVUxNzAxX1NFUk9DVExfT0JGMgkJMHgwNjAwCisjZGVmaW5lIEFEQVUxNzAxX1NFUk9DVExfT0JGX01BU0sJMHgwNjAwCisKKyNkZWZpbmUgQURBVTE3MDFfU0VST0NUTF9PTEYxMDI0CTB4MDAwMAorI2RlZmluZSBBREFVMTcwMV9TRVJPQ1RMX09MRjUxMgkJMHgwMDgwCisjZGVmaW5lIEFEQVUxNzAxX1NFUk9DVExfT0xGMjU2CQkweDAxMDAKKyNkZWZpbmUgQURBVTE3MDFfU0VST0NUTF9PTEZfTUFTSwkweDAxODAKKworI2RlZmluZSBBREFVMTcwMV9TRVJPQ1RMX01TQl9ERUFMWTEJMHgwMDAwCisjZGVmaW5lIEFEQVUxNzAxX1NFUk9DVExfTVNCX0RFQUxZMAkweDAwMDQKKyNkZWZpbmUgQURBVTE3MDFfU0VST0NUTF9NU0JfREVBTFk4CTB4MDAwOAorI2RlZmluZSBBREFVMTcwMV9TRVJPQ1RMX01TQl9ERUFMWTEyCTB4MDAwYworI2RlZmluZSBBREFVMTcwMV9TRVJPQ1RMX01TQl9ERUFMWTE2CTB4MDAxMAorI2RlZmluZSBBREFVMTcwMV9TRVJPQ1RMX01TQl9ERUFMWV9NQVNLCTB4MDAxYworCisjZGVmaW5lIEFEQVUxNzAxX1NFUk9DVExfV09SRF9MRU5fMjQJMHgwMDAwCisjZGVmaW5lIEFEQVUxNzAxX1NFUk9DVExfV09SRF9MRU5fMjAJMHgwMDAxCisjZGVmaW5lIEFEQVUxNzAxX1NFUk9DVExfV09SRF9MRU5fMTYJMHgwMDEwCisjZGVmaW5lIEFEQVUxNzAxX1NFUk9DVExfV09SRF9MRU5fTUFTSwkweDAwMDMKKworI2RlZmluZSBBREFVMTcwMV9BVVhOUE9XX1ZCUEQJCTB4NDAKKyNkZWZpbmUgQURBVTE3MDFfQVVYTlBPV19WUlBECQkweDIwCisKKyNkZWZpbmUgQURBVTE3MDFfU0VSSUNUTF9JMlMJCTAKKyNkZWZpbmUgQURBVTE3MDFfU0VSSUNUTF9MRUZUSgkJMQorI2RlZmluZSBBREFVMTcwMV9TRVJJQ1RMX1RETQkJMgorI2RlZmluZSBBREFVMTcwMV9TRVJJQ1RMX1JJR0hUSl8yNAkzCisjZGVmaW5lIEFEQVUxNzAxX1NFUklDVExfUklHSFRKXzIwCTQKKyNkZWZpbmUgQURBVTE3MDFfU0VSSUNUTF9SSUdIVEpfMTgJNQorI2RlZmluZSBBREFVMTcwMV9TRVJJQ1RMX1JJR0hUSl8xNgk2CisjZGVmaW5lIEFEQVUxNzAxX1NFUklDVExfTU9ERV9NQVNLCTcKKyNkZWZpbmUgQURBVTE3MDFfU0VSSUNUTF9JTlZfQkNMSwlCSVQoMykKKyNkZWZpbmUgQURBVTE3MDFfU0VSSUNUTF9JTlZfTFJDTEsJQklUKDQpCisKKyNkZWZpbmUgQURBVTE3MDFfT1NDSVBPV19PUEQJCTB4MDQKKyNkZWZpbmUgQURBVTE3MDFfREFDU0VUX0RBQ0lOSVQJCTEKKworI2RlZmluZSBBREFVMTcwMV9GSVJNV0FSRSAiYWRhdTE3MDEuYmluIgorCitzdHJ1Y3QgYWRhdTE3MDEgeworCXVuc2lnbmVkIGludCBkYWlfZm10OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYXUxNzAxX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRSgiTWFzdGVyIENhcHR1cmUgU3dpdGNoIiwgQURBVTE3MDFfRFNQQ1RSTCwgNCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYWRhdTE3MDFfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0RBQygiREFDMCIsICJQbGF5YmFjayIsIEFEQVUxNzAxX0FVWE5QT1csIDMsIDEpLAorCVNORF9TT0NfREFQTV9EQUMoIkRBQzEiLCAiUGxheWJhY2siLCBBREFVMTcwMV9BVVhOUE9XLCAyLCAxKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMyIiwgIlBsYXliYWNrIiwgQURBVTE3MDFfQVVYTlBPVywgMSwgMSksCisJU05EX1NPQ19EQVBNX0RBQygiREFDMyIsICJQbGF5YmFjayIsIEFEQVUxNzAxX0FVWE5QT1csIDAsIDEpLAorCVNORF9TT0NfREFQTV9BREMoIkFEQyIsICJDYXB0dXJlIiwgQURBVTE3MDFfQVVYTlBPVywgNywgMSksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJPVVQwIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiT1VUMSIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIk9VVDIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJPVVQzIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjAiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIklOMSIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYWRhdTE3MDFfZGFwbV9yb3V0ZXNbXSA9IHsKKwl7ICJPVVQwIiwgTlVMTCwgIkRBQzAiIH0sCisJeyAiT1VUMSIsIE5VTEwsICJEQUMxIiB9LAorCXsgIk9VVDIiLCBOVUxMLCAiREFDMiIgfSwKKwl7ICJPVVQzIiwgTlVMTCwgIkRBQzMiIH0sCisKKwl7ICJBREMiLCBOVUxMLCAiSU4wIiB9LAorCXsgIkFEQyIsIE5VTEwsICJJTjEiIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGFkYXUxNzAxX3JlZ2lzdGVyX3NpemUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQl1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBBREFVMTcwMV9EU1BDVFJMOgorCWNhc2UgQURBVTE3MDFfU0VST0NUTDoKKwljYXNlIEFEQVUxNzAxX0FVWE5QT1c6CisJY2FzZSBBREFVMTcwMV9PU0NJUE9XOgorCWNhc2UgQURBVTE3MDFfREFDU0VUOgorCQlyZXR1cm4gMjsKKwljYXNlIEFEQVUxNzAxX1NFUklDVEw6CisJCXJldHVybiAxOworCX0KKworCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIHJlZ2lzdGVyIGFkZHJlc3M6ICVkXG4iLCByZWcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxNzAxX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJdW5zaWduZWQgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBzaXplOworCXVpbnQ4X3QgYnVmWzRdOworCWludCByZXQ7CisKKwlzaXplID0gYWRhdTE3MDFfcmVnaXN0ZXJfc2l6ZShjb2RlYywgcmVnKTsKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUpOworCisJYnVmWzBdID0gMHgwODsKKwlidWZbMV0gPSByZWc7CisKKwlmb3IgKGkgPSBzaXplICsgMTsgaSA+PSAyOyAtLWkpIHsKKwkJYnVmW2ldID0gdmFsdWU7CisJCXZhbHVlID4+PSA4OworCX0KKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZCh0b19pMmNfY2xpZW50KGNvZGVjLT5kZXYpLCBidWYsIHNpemUgKyAyKTsKKwlpZiAocmV0ID09IHNpemUgKyAyKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWRhdTE3MDFfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcpCit7CisJdW5zaWduZWQgaW50IHZhbHVlOworCXVuc2lnbmVkIGludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2NhY2hlX3JlYWQoY29kZWMsIHJlZywgJnZhbHVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IGFkYXUxNzAxX2xvYWRfZmlybXdhcmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBwcm9jZXNzX3NpZ21hX2Zpcm13YXJlKGNvZGVjLT5jb250cm9sX2RhdGEsIEFEQVUxNzAxX0ZJUk1XQVJFKTsKK30KKworc3RhdGljIGludCBhZGF1MTcwMV9zZXRfY2FwdHVyZV9wY21fZm9ybWF0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpCit7CisJc3RydWN0IGFkYXUxNzAxICphZGF1MTcwMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCBtYXNrID0gQURBVTE3MDFfU0VST0NUTF9XT1JEX0xFTl9NQVNLOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCXZhbCA9IEFEQVUxNzAxX1NFUk9DVExfV09SRF9MRU5fMTY7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjBfM0xFOgorCQl2YWwgPSBBREFVMTcwMV9TRVJPQ1RMX1dPUkRfTEVOXzIwOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQl2YWwgPSBBREFVMTcwMV9TRVJPQ1RMX1dPUkRfTEVOXzI0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWRhdTE3MDEtPmRhaV9mbXQgPT0gU05EX1NPQ19EQUlGTVRfUklHSFRfSikgeworCQlzd2l0Y2ggKGZvcm1hdCkgeworCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQkJdmFsIHw9IEFEQVUxNzAxX1NFUk9DVExfTVNCX0RFQUxZMTY7CisJCQlicmVhazsKKwkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEU6CisJCQl2YWwgfD0gQURBVTE3MDFfU0VST0NUTF9NU0JfREVBTFkxMjsKKwkJCWJyZWFrOworCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQkJdmFsIHw9IEFEQVUxNzAxX1NFUk9DVExfTVNCX0RFQUxZODsKKwkJCWJyZWFrOworCQl9CisJCW1hc2sgfD0gQURBVTE3MDFfU0VST0NUTF9NU0JfREVBTFlfTUFTSzsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBREFVMTcwMV9TRVJPQ1RMLCBtYXNrLCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTE3MDFfc2V0X3BsYXliYWNrX3BjbV9mb3JtYXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpCit7CisJc3RydWN0IGFkYXUxNzAxICphZGF1MTcwMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoYWRhdTE3MDEtPmRhaV9mbXQgIT0gU05EX1NPQ19EQUlGTVRfUklHSFRfSikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCXZhbCA9IEFEQVUxNzAxX1NFUklDVExfUklHSFRKXzE2OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJdmFsID0gQURBVTE3MDFfU0VSSUNUTF9SSUdIVEpfMjA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXZhbCA9IEFEQVUxNzAxX1NFUklDVExfUklHSFRKXzI0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBREFVMTcwMV9TRVJJQ1RMLAorCQlBREFVMTcwMV9TRVJJQ1RMX01PREVfTUFTSywgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxNzAxX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXNuZF9wY21fZm9ybWF0X3QgZm9ybWF0OworCXVuc2lnbmVkIGludCB2YWw7CisKKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwljYXNlIDE5MjAwMDoKKwkJdmFsID0gQURBVTE3MDFfRFNQQ1RSTF9TUl8xOTI7CisJCWJyZWFrOworCWNhc2UgOTYwMDA6CisJCXZhbCA9IEFEQVUxNzAxX0RTUENUUkxfU1JfOTY7CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCXZhbCA9IEFEQVUxNzAxX0RTUENUUkxfU1JfNDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxNzAxX0RTUENUUkwsCisJCUFEQVUxNzAxX0RTUENUUkxfU1JfTUFTSywgdmFsKTsKKworCWZvcm1hdCA9IHBhcmFtc19mb3JtYXQocGFyYW1zKTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcmV0dXJuIGFkYXUxNzAxX3NldF9wbGF5YmFja19wY21fZm9ybWF0KGNvZGVjLCBmb3JtYXQpOworCWVsc2UKKwkJcmV0dXJuIGFkYXUxNzAxX3NldF9jYXB0dXJlX3BjbV9mb3JtYXQoY29kZWMsIGZvcm1hdCk7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTE3MDFfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCXVuc2lnbmVkIGludCBmbXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgYWRhdTE3MDEgKmFkYXUxNzAxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHNlcmljdGwgPSAweDAwLCBzZXJvY3RsID0gMHgwMDsKKwlib29sIGludmVydF9scmNsazsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCS8qIG1hc3RlciwgNjQtYml0cyBwZXIgc2FtcGxlLCAxIGZyYW1lIHBlciBzYW1wbGUgKi8KKwkJc2Vyb2N0bCB8PSBBREFVMTcwMV9TRVJPQ1RMX01BU1RFUiB8IEFEQVUxNzAxX1NFUk9DVExfT0JGMTYKKwkJCQl8IEFEQVUxNzAxX1NFUk9DVExfT0xGMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjbG9jayBpbnZlcnNpb24gKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJaW52ZXJ0X2xyY2xrID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfSUY6CisJCWludmVydF9scmNsayA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWludmVydF9scmNsayA9IGZhbHNlOworCQlzZXJpY3RsIHw9IEFEQVUxNzAxX1NFUklDVExfSU5WX0JDTEs7CisJCXNlcm9jdGwgfD0gQURBVTE3MDFfU0VST0NUTF9JTlZfQkNMSzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9JRjoKKwkJaW52ZXJ0X2xyY2xrID0gdHJ1ZTsKKwkJc2VyaWN0bCB8PSBBREFVMTcwMV9TRVJJQ1RMX0lOVl9CQ0xLOworCQlzZXJvY3RsIHw9IEFEQVUxNzAxX1NFUk9DVExfSU5WX0JDTEs7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCXNlcmljdGwgfD0gQURBVTE3MDFfU0VSSUNUTF9MRUZUSjsKKwkJc2Vyb2N0bCB8PSBBREFVMTcwMV9TRVJPQ1RMX01TQl9ERUFMWTA7CisJCWludmVydF9scmNsayA9ICFpbnZlcnRfbHJjbGs7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfUklHSFRfSjoKKwkJc2VyaWN0bCB8PSBBREFVMTcwMV9TRVJJQ1RMX1JJR0hUSl8yNDsKKwkJc2Vyb2N0bCB8PSBBREFVMTcwMV9TRVJPQ1RMX01TQl9ERUFMWTg7CisJCWludmVydF9scmNsayA9ICFpbnZlcnRfbHJjbGs7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpbnZlcnRfbHJjbGspIHsKKwkJc2Vyb2N0bCB8PSBBREFVMTcwMV9TRVJPQ1RMX0lOVl9MUkNMSzsKKwkJc2VyaWN0bCB8PSBBREFVMTcwMV9TRVJJQ1RMX0lOVl9MUkNMSzsKKwl9CisKKwlhZGF1MTcwMS0+ZGFpX2ZtdCA9IGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLOworCisJc25kX3NvY193cml0ZShjb2RlYywgQURBVTE3MDFfU0VSSUNUTCwgc2VyaWN0bCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVTE3MDFfU0VST0NUTCwKKwkJfkFEQVUxNzAxX1NFUk9DVExfV09SRF9MRU5fTUFTSywgc2Vyb2N0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGF1MTcwMV9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gQURBVTE3MDFfQVVYTlBPV19WQlBEIHwgQURBVTE3MDFfQVVYTlBPV19WUlBEOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQkvKiBFbmFibGUgVlJFRiBhbmQgVlJFRiBidWZmZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVTE3MDFfQVVYTlBPVywgbWFzaywgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJLyogRGlzYWJsZSBWUkVGIGFuZCBWUkVGIGJ1ZmZlciAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBREFVMTcwMV9BVVhOUE9XLCBtYXNrLCBtYXNrKTsKKwkJYnJlYWs7CisJfQorCisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxNzAxX2RpZ2l0YWxfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IEFEQVUxNzAxX0RTUENUUkxfREFNOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAobXV0ZSkKKwkJdmFsID0gMDsKKwllbHNlCisJCXZhbCA9IG1hc2s7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBREFVMTcwMV9EU1BDVFJMLCBtYXNrLCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTE3MDFfc2V0X3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBjbGtfaWQsCisJdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXN3aXRjaCAoY2xrX2lkKSB7CisJY2FzZSBBREFVMTcwMV9DTEtfU1JDX09TQzoKKwkJdmFsID0gMHgwOworCQlicmVhazsKKwljYXNlIEFEQVUxNzAxX0NMS19TUkNfTUNMSzoKKwkJdmFsID0gQURBVTE3MDFfT1NDSVBPV19PUEQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxNzAxX09TQ0lQT1csIEFEQVUxNzAxX09TQ0lQT1dfT1BELCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQURBVTE3MDFfUkFURVMgKFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfCBcCisJU05EUlZfUENNX1JBVEVfMTkyMDAwKQorCisjZGVmaW5lIEFEQVUxNzAxX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHxcCisJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGFkYXUxNzAxX2RhaV9vcHMgPSB7CisJLnNldF9mbXQJPSBhZGF1MTcwMV9zZXRfZGFpX2ZtdCwKKwkuaHdfcGFyYW1zCT0gYWRhdTE3MDFfaHdfcGFyYW1zLAorCS5kaWdpdGFsX211dGUJPSBhZGF1MTcwMV9kaWdpdGFsX211dGUsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBhZGF1MTcwMV9kYWkgPSB7CisJLm5hbWUgPSAiYWRhdTE3MDEiLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSA4LAorCQkucmF0ZXMgPSBBREFVMTcwMV9SQVRFUywKKwkJLmZvcm1hdHMgPSBBREFVMTcwMV9GT1JNQVRTLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSA4LAorCQkucmF0ZXMgPSBBREFVMTcwMV9SQVRFUywKKwkJLmZvcm1hdHMgPSBBREFVMTcwMV9GT1JNQVRTLAorCX0sCisJLm9wcyA9ICZhZGF1MTcwMV9kYWlfb3BzLAorCS5zeW1tZXRyaWNfcmF0ZXMgPSAxLAorfTsKKworc3RhdGljIGludCBhZGF1MTcwMV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IHJldDsKKworCWNvZGVjLT5kYXBtLmlkbGVfYmlhc19vZmYgPSAxOworCisJcmV0ID0gYWRhdTE3MDFfbG9hZF9maXJtd2FyZShjb2RlYyk7CisJaWYgKHJldCkKKwkJZGV2X3dhcm4oY29kZWMtPmRldiwgIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlXG4iKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVUxNzAxX0RBQ1NFVCwgQURBVTE3MDFfREFDU0VUX0RBQ0lOSVQpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVUxNzAxX0RTUENUUkwsIEFEQVUxNzAxX0RTUENUUkxfQ1IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgYWRhdTE3MDFfY29kZWNfZHJ2ID0geworCS5wcm9iZQkJCT0gYWRhdTE3MDFfcHJvYmUsCisJLnNldF9iaWFzX2xldmVsCQk9IGFkYXUxNzAxX3NldF9iaWFzX2xldmVsLAorCisJLnJlZ19jYWNoZV9zaXplCQk9IEFEQVUxNzAxX05VTV9SRUdTLAorCS5yZWdfd29yZF9zaXplCQk9IHNpemVvZih1MTYpLAorCisJLmNvbnRyb2xzCQk9IGFkYXUxNzAxX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhZGF1MTcwMV9jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cwkJPSBhZGF1MTcwMV9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkYXUxNzAxX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzCQk9IGFkYXUxNzAxX2RhcG1fcm91dGVzLAorCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkYXUxNzAxX2RhcG1fcm91dGVzKSwKKworCS53cml0ZQkJCT0gYWRhdTE3MDFfd3JpdGUsCisJLnJlYWQJCQk9IGFkYXUxNzAxX3JlYWQsCisKKwkuc2V0X3N5c2NsawkJPSBhZGF1MTcwMV9zZXRfc3lzY2xrLAorfTsKKworc3RhdGljIF9fZGV2aW5pdCBpbnQgYWRhdTE3MDFfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYWRhdTE3MDEgKmFkYXUxNzAxOworCWludCByZXQ7CisKKwlhZGF1MTcwMSA9IGt6YWxsb2Moc2l6ZW9mKCphZGF1MTcwMSksIEdGUF9LRVJORUwpOworCWlmICghYWRhdTE3MDEpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYWRhdTE3MDEpOworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2LCAmYWRhdTE3MDFfY29kZWNfZHJ2LAorCQkJJmFkYXUxNzAxX2RhaSwgMSk7CisJaWYgKHJldCA8IDApCisJCWtmcmVlKGFkYXUxNzAxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2RldmV4aXQgaW50IGFkYXUxNzAxX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZGF1MTcwMV9pMmNfaWRbXSA9IHsKKwl7ICJhZGF1MTcwMSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRhdTE3MDFfaTJjX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkYXUxNzAxX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWRhdTE3MDEiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBhZGF1MTcwMV9pMmNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZGF1MTcwMV9pMmNfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBhZGF1MTcwMV9pMmNfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZGF1MTcwMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZGF1MTcwMV9pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkYXUxNzAxX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWRhdTE3MDFfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZGF1MTcwMV9pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkYXUxNzAxX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgQURBVTE3MDEgU2lnbWFEU1AgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkgPGNsaWZmLmNhaUBhbmFsb2cuY29tPiIpOworTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzAxLmggYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzAxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwOTQ5YQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3MDEuaApAQCAtMCwwICsxLDE3IEBACisvKgorICogaGVhZGVyIGZpbGUgZm9yIEFEQVUxNzAxIFNpZ21hRFNQIHByb2Nlc3NvcgorICoKKyAqIENvcHlyaWdodCAyMDExIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfQURBVTE3MDFfSAorI2RlZmluZSBfQURBVTE3MDFfSAorCitlbnVtIGFkYXUxNzAxX2Nsa19zcmMgeworCUFEQVUxNzAxX0NMS19TUkNfT1NDLAorCUFEQVUxNzAxX0NMS19TUkNfTUNMSywKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDBjMDRiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMKQEAgLTAsMCArMSw5NTEgQEAKKy8qCisgKiBBREFWODBYIEF1ZGlvIENvZGVjIGRyaXZlciBzdXBwb3J0aW5nIEFEQVY4MDEsIEFEQVY4MDMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBBdXRob3I6IFlpIExpIDx5aS5saUBhbmFsb2cuY29tPgorICogQXV0aG9yOiBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJhZGF2ODB4LmgiCisKKyNkZWZpbmUgQURBVjgwWF9QTEFZQkFDS19DVFJMCTB4MDQKKyNkZWZpbmUgQURBVjgwWF9BVVhfSU5fQ1RSTAkweDA1CisjZGVmaW5lIEFEQVY4MFhfUkVDX0NUUkwJMHgwNgorI2RlZmluZSBBREFWODBYX0FVWF9PVVRfQ1RSTAkweDA3CisjZGVmaW5lIEFEQVY4MFhfRFBBVEhfQ1RSTDEJMHg2MgorI2RlZmluZSBBREFWODBYX0RQQVRIX0NUUkwyCTB4NjMKKyNkZWZpbmUgQURBVjgwWF9EQUNfQ1RSTDEJMHg2NAorI2RlZmluZSBBREFWODBYX0RBQ19DVFJMMgkweDY1CisjZGVmaW5lIEFEQVY4MFhfREFDX0NUUkwzCTB4NjYKKyNkZWZpbmUgQURBVjgwWF9EQUNfTF9WT0wJMHg2OAorI2RlZmluZSBBREFWODBYX0RBQ19SX1ZPTAkweDY5CisjZGVmaW5lIEFEQVY4MFhfUEdBX0xfVk9MCTB4NmMKKyNkZWZpbmUgQURBVjgwWF9QR0FfUl9WT0wJMHg2ZAorI2RlZmluZSBBREFWODBYX0FEQ19DVFJMMQkweDZlCisjZGVmaW5lIEFEQVY4MFhfQURDX0NUUkwyCTB4NmYKKyNkZWZpbmUgQURBVjgwWF9BRENfTF9WT0wJMHg3MAorI2RlZmluZSBBREFWODBYX0FEQ19SX1ZPTAkweDcxCisjZGVmaW5lIEFEQVY4MFhfUExMX0NUUkwxCTB4NzQKKyNkZWZpbmUgQURBVjgwWF9QTExfQ1RSTDIJMHg3NQorI2RlZmluZSBBREFWODBYX0lDTEtfQ1RSTDEJMHg3NgorI2RlZmluZSBBREFWODBYX0lDTEtfQ1RSTDIJMHg3NworI2RlZmluZSBBREFWODBYX1BMTF9DTEtfU1JDCTB4NzgKKyNkZWZpbmUgQURBVjgwWF9QTExfT1VURQkweDdhCisKKyNkZWZpbmUgQURBVjgwWF9QTExfQ0xLX1NSQ19QTExfWElOKHBsbCkJMHgwMAorI2RlZmluZSBBREFWODBYX1BMTF9DTEtfU1JDX1BMTF9NQ0xLSShwbGwpCSgweDQwIDw8IChwbGwpKQorI2RlZmluZSBBREFWODBYX1BMTF9DTEtfU1JDX1BMTF9NQVNLKHBsbCkJKDB4NDAgPDwgKHBsbCkpCisKKyNkZWZpbmUgQURBVjgwWF9JQ0xLX0NUUkwxX0RBQ19TUkMoc3JjKQkJKChzcmMpIDw8IDUpCisjZGVmaW5lIEFEQVY4MFhfSUNMS19DVFJMMV9BRENfU1JDKHNyYykJCSgoc3JjKSA8PCAyKQorI2RlZmluZSBBREFWODBYX0lDTEtfQ1RSTDFfSUNMSzJfU1JDKHNyYykJKHNyYykKKyNkZWZpbmUgQURBVjgwWF9JQ0xLX0NUUkwyX0lDTEsxX1NSQyhzcmMpCSgoc3JjKSA8PCAzKQorCisjZGVmaW5lIEFEQVY4MFhfUExMX0NUUkwxX1BMTERJVgkJMHgxMAorI2RlZmluZSBBREFWODBYX1BMTF9DVFJMMV9QTExQRChwbGwpCQkoMHgwNCA8PCAocGxsKSkKKyNkZWZpbmUgQURBVjgwWF9QTExfQ1RSTDFfWFRMUEQJCQkweDAyCisKKyNkZWZpbmUgQURBVjgwWF9QTExfQ1RSTDJfRklFTEQocGxsLCB4KQkJKCh4KSA8PCAoKHBsbCkgKiA0KSkKKworI2RlZmluZSBBREFWODBYX1BMTF9DVFJMMl9GU180OChwbGwpCUFEQVY4MFhfUExMX0NUUkwyX0ZJRUxEKChwbGwpLCAweDAwKQorI2RlZmluZSBBREFWODBYX1BMTF9DVFJMMl9GU18zMihwbGwpCUFEQVY4MFhfUExMX0NUUkwyX0ZJRUxEKChwbGwpLCAweDA4KQorI2RlZmluZSBBREFWODBYX1BMTF9DVFJMMl9GU180NChwbGwpCUFEQVY4MFhfUExMX0NUUkwyX0ZJRUxEKChwbGwpLCAweDBjKQorCisjZGVmaW5lIEFEQVY4MFhfUExMX0NUUkwyX1NFTChwbGwpCUFEQVY4MFhfUExMX0NUUkwyX0ZJRUxEKChwbGwpLCAweDAyKQorI2RlZmluZSBBREFWODBYX1BMTF9DVFJMMl9ET1VCKHBsbCkJQURBVjgwWF9QTExfQ1RSTDJfRklFTEQoKHBsbCksIDB4MDEpCisjZGVmaW5lIEFEQVY4MFhfUExMX0NUUkwyX1BMTF9NQVNLKHBsbCkgQURBVjgwWF9QTExfQ1RSTDJfRklFTEQoKHBsbCksIDB4MGYpCisKKyNkZWZpbmUgQURBVjgwWF9BRENfQ1RSTDFfTU9EVUxBVE9SX01BU0sJMHg4MAorI2RlZmluZSBBREFWODBYX0FEQ19DVFJMMV9NT0RVTEFUT1JfMTI4RlMJMHgwMAorI2RlZmluZSBBREFWODBYX0FEQ19DVFJMMV9NT0RVTEFUT1JfNjRGUwkweDgwCisKKyNkZWZpbmUgQURBVjgwWF9EQUNfQ1RSTDFfUEQJCQkweDgwCisKKyNkZWZpbmUgQURBVjgwWF9EQUNfQ1RSTDJfRElWMQkJCTB4MDAKKyNkZWZpbmUgQURBVjgwWF9EQUNfQ1RSTDJfRElWMV81CQkweDEwCisjZGVmaW5lIEFEQVY4MFhfREFDX0NUUkwyX0RJVjIJCQkweDIwCisjZGVmaW5lIEFEQVY4MFhfREFDX0NUUkwyX0RJVjMJCQkweDMwCisjZGVmaW5lIEFEQVY4MFhfREFDX0NUUkwyX0RJVl9NQVNLCQkweDMwCisKKyNkZWZpbmUgQURBVjgwWF9EQUNfQ1RSTDJfSU5URVJQT0xfMjU2RlMJMHgwMAorI2RlZmluZSBBREFWODBYX0RBQ19DVFJMMl9JTlRFUlBPTF8xMjhGUwkweDQwCisjZGVmaW5lIEFEQVY4MFhfREFDX0NUUkwyX0lOVEVSUE9MXzY0RlMJCTB4ODAKKyNkZWZpbmUgQURBVjgwWF9EQUNfQ1RSTDJfSU5URVJQT0xfTUFTSwkJMHhjMAorCisjZGVmaW5lIEFEQVY4MFhfREFDX0NUUkwyX0RFRU1QSF9OT05FCQkweDAwCisjZGVmaW5lIEFEQVY4MFhfREFDX0NUUkwyX0RFRU1QSF80NAkJMHgwMQorI2RlZmluZSBBREFWODBYX0RBQ19DVFJMMl9ERUVNUEhfMzIJCTB4MDIKKyNkZWZpbmUgQURBVjgwWF9EQUNfQ1RSTDJfREVFTVBIXzQ4CQkweDAzCisjZGVmaW5lIEFEQVY4MFhfREFDX0NUUkwyX0RFRU1QSF9NQVNLCQkweDAxCisKKyNkZWZpbmUgQURBVjgwWF9DQVBUVVJFX01PREVfTUFTVEVSCQkweDIwCisjZGVmaW5lIEFEQVY4MFhfQ0FQVFVSRV9XT1JEX0xFTjI0CQkweDAwCisjZGVmaW5lIEFEQVY4MFhfQ0FQVFVSRV9XT1JEX0xFTjIwCQkweDA0CisjZGVmaW5lIEFEQVY4MFhfQ0FQVFJVRV9XT1JEX0xFTjE4CQkweDA4CisjZGVmaW5lIEFEQVY4MFhfQ0FQVFVSRV9XT1JEX0xFTjE2CQkweDBjCisjZGVmaW5lIEFEQVY4MFhfQ0FQVFVSRV9XT1JEX0xFTl9NQVNLCQkweDBjCisKKyNkZWZpbmUgQURBVjgwWF9DQVBUVVJFX01PREVfTEVGVF9KCQkweDAwCisjZGVmaW5lIEFEQVY4MFhfQ0FQVFVSRV9NT0RFX0kyUwkJMHgwMQorI2RlZmluZSBBREFWODBYX0NBUFRVUkVfTU9ERV9SSUdIVF9KCQkweDAzCisjZGVmaW5lIEFEQVY4MFhfQ0FQVFVSRV9NT0RFX01BU0sJCTB4MDMKKworI2RlZmluZSBBREFWODBYX1BMQVlCQUNLX01PREVfTUFTVEVSCQkweDEwCisjZGVmaW5lIEFEQVY4MFhfUExBWUJBQ0tfTU9ERV9MRUZUX0oJCTB4MDAKKyNkZWZpbmUgQURBVjgwWF9QTEFZQkFDS19NT0RFX0kyUwkJMHgwMQorI2RlZmluZSBBREFWODBYX1BMQVlCQUNLX01PREVfUklHSFRfSl8yNAkweDA0CisjZGVmaW5lIEFEQVY4MFhfUExBWUJBQ0tfTU9ERV9SSUdIVF9KXzIwCTB4MDUKKyNkZWZpbmUgQURBVjgwWF9QTEFZQkFDS19NT0RFX1JJR0hUX0pfMTgJMHgwNgorI2RlZmluZSBBREFWODBYX1BMQVlCQUNLX01PREVfUklHSFRfSl8xNgkweDA3CisjZGVmaW5lIEFEQVY4MFhfUExBWUJBQ0tfTU9ERV9NQVNLCQkweDA3CisKKyNkZWZpbmUgQURBVjgwWF9QTExfT1VURV9TWVNDTEtQRCh4KQkJQklUKDIgLSAoeCkpCisKK3N0YXRpYyB1OCBhZGF2ODB4X2RlZmF1bHRfcmVnc1tdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDEsIDB4ODAsIDB4MjYsIDB4MDAsIDB4MDAsCisJMHgwMiwgMHg0MCwgMHgyMCwgMHgwMCwgMHgwOSwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDA0LCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGQxLCAweDkyLCAweGIxLCAweDM3LAorCTB4NDgsIDB4ZDIsIDB4ZmIsIDB4Y2EsIDB4ZDIsIDB4MTUsIDB4ZTgsIDB4MjksIDB4YjksIDB4NmEsIDB4ZGEsIDB4MmIsCisJMHhiNywgMHhjMCwgMHgxMSwgMHg2NSwgMHg1YywgMHhmNiwgMHhmZiwgMHg4ZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTUsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhlOCwgMHg0NiwgMHhlMSwgMHg1YiwgMHhkMywgMHg0MywgMHg3NywgMHg5MywgMHhhNywgMHg0NCwgMHhlZSwKKwkweDMyLCAweDEyLCAweGMwLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDNmLCAweDNmLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MWQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1MiwgMHgwMCwKK307CisKK3N0cnVjdCBhZGF2ODB4IHsKKwllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKKworCWVudW0gYWRhdjgweF9jbGtfc3JjIGNsa19zcmM7CisJdW5zaWduZWQgaW50IHN5c2NsazsKKwllbnVtIGFkYXY4MHhfcGxsX3NyYyBwbGxfc3JjOworCisJdW5zaWduZWQgaW50IGRhaV9mbXRbMl07CisJdW5zaWduZWQgaW50IHJhdGU7CisJYm9vbCBkZWVtcGg7CisJYm9vbCBzeXNjbGtfcGRbM107Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYWRhdjgweF9tdXhfdGV4dFtdID0geworCSJBREMiLAorCSJQbGF5YmFjayIsCisJIkF1eCBQbGF5YmFjayIsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFkYXY4MHhfbXV4X3ZhbHVlc1tdID0geworCTAsIDIsIDMsCit9OworCisjZGVmaW5lIEFEQVY4MFhfTVVYX0VOVU1fREVDTChuYW1lLCByZWcsIHNoaWZ0KSBcCisJU09DX1ZBTFVFX0VOVU1fRE9VQkxFX0RFQ0wobmFtZSwgcmVnLCBzaGlmdCwgNywgXAorCQlBUlJBWV9TSVpFKGFkYXY4MHhfbXV4X3RleHQpLCBhZGF2ODB4X211eF90ZXh0LCBcCisJCWFkYXY4MHhfbXV4X3ZhbHVlcykKKworc3RhdGljIEFEQVY4MFhfTVVYX0VOVU1fREVDTChhZGF2ODB4X2F1eF9jYXB0dXJlX2VudW0sIEFEQVY4MFhfRFBBVEhfQ1RSTDEsIDApOworc3RhdGljIEFEQVY4MFhfTVVYX0VOVU1fREVDTChhZGF2ODB4X2NhcHR1cmVfZW51bSwgQURBVjgwWF9EUEFUSF9DVFJMMSwgMyk7CitzdGF0aWMgQURBVjgwWF9NVVhfRU5VTV9ERUNMKGFkYXY4MHhfZGFjX2VudW0sIEFEQVY4MFhfRFBBVEhfQ1RSTDIsIDMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdjgweF9hdXhfY2FwdHVyZV9tdXhfY3RybCA9CisJU09DX0RBUE1fVkFMVUVfRU5VTSgiUm91dGUiLCBhZGF2ODB4X2F1eF9jYXB0dXJlX2VudW0pOworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYXY4MHhfY2FwdHVyZV9tdXhfY3RybCA9CisJU09DX0RBUE1fVkFMVUVfRU5VTSgiUm91dGUiLCBhZGF2ODB4X2NhcHR1cmVfZW51bSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdjgweF9kYWNfbXV4X2N0cmwgPQorCVNPQ19EQVBNX1ZBTFVFX0VOVU0oIlJvdXRlIiwgYWRhdjgweF9kYWNfZW51bSk7CisKKyNkZWZpbmUgQURBVjgwWF9NVVgobmFtZSwgY3RybCkgXAorCVNORF9TT0NfREFQTV9WQUxVRV9NVVgobmFtZSwgU05EX1NPQ19OT1BNLCAwLCAwLCBjdHJsKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYWRhdjgweF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMiLCBOVUxMLCBBREFWODBYX0RBQ19DVFJMMSwgNywgMSksCisJU05EX1NPQ19EQVBNX0FEQygiQURDIiwgTlVMTCwgQURBVjgwWF9BRENfQ1RSTDEsIDUsIDEpLAorCisJU05EX1NPQ19EQVBNX1BHQSgiUmlnaHQgUEdBIiwgQURBVjgwWF9BRENfQ1RSTDEsIDAsIDEsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkxlZnQgUEdBIiwgQURBVjgwWF9BRENfQ1RSTDEsIDEsIDEsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRk9VVCIsICJIaUZpIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIkFJRklOIiwgIkhpRmkgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRkFVWE9VVCIsICJBdXggQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGQVVYSU4iLCAiQXV4IFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCUFEQVY4MFhfTVVYKCJBdXggQ2FwdHVyZSBTZWxlY3QiLCAmYWRhdjgweF9hdXhfY2FwdHVyZV9tdXhfY3RybCksCisJQURBVjgwWF9NVVgoIkNhcHR1cmUgU2VsZWN0IiwgJmFkYXY4MHhfY2FwdHVyZV9tdXhfY3RybCksCisJQURBVjgwWF9NVVgoIkRBQyBTZWxlY3QiLCAmYWRhdjgweF9kYWNfbXV4X2N0cmwpLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJWSU5SIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJWSU5MIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiVk9VVFIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJWT1VUTCIpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiU1lTQ0xLIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJQTEwxIiwgQURBVjgwWF9QTExfQ1RSTDEsIDIsIDEsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlBMTDIiLCBBREFWODBYX1BMTF9DVFJMMSwgMywgMSwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiT1NDIiwgQURBVjgwWF9QTExfQ1RSTDEsIDEsIDEsIE5VTEwsIDApLAorfTsKKworc3RhdGljIGludCBhZGF2ODB4X2RhcG1fc3lzY2xrX2NoZWNrKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzb3VyY2UsCisJCQkgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc291cmNlLT5jb2RlYzsKKwlzdHJ1Y3QgYWRhdjgweCAqYWRhdjgweCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWNvbnN0IGNoYXIgKmNsazsKKworCXN3aXRjaCAoYWRhdjgweC0+Y2xrX3NyYykgeworCWNhc2UgQURBVjgwWF9DTEtfUExMMToKKwkJY2xrID0gIlBMTDEiOworCQlicmVhazsKKwljYXNlIEFEQVY4MFhfQ0xLX1BMTDI6CisJCWNsayA9ICJQTEwyIjsKKwkJYnJlYWs7CisJY2FzZSBBREFWODBYX0NMS19YVEFMOgorCQljbGsgPSAiT1NDIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHN0cmNtcChzb3VyY2UtPm5hbWUsIGNsaykgPT0gMDsKK30KKworc3RhdGljIGludCBhZGF2ODB4X2RhcG1fcGxsX2NoZWNrKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzb3VyY2UsCisJCQkgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc291cmNlLT5jb2RlYzsKKwlzdHJ1Y3QgYWRhdjgweCAqYWRhdjgweCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcmV0dXJuIGFkYXY4MHgtPnBsbF9zcmMgPT0gQURBVjgwWF9QTExfU1JDX1hUQUw7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYWRhdjgweF9kYXBtX3JvdXRlc1tdID0geworCXsgIkRBQyBTZWxlY3QiLCAiQURDIiwgIkFEQyIgfSwKKwl7ICJEQUMgU2VsZWN0IiwgIlBsYXliYWNrIiwgIkFJRklOIiB9LAorCXsgIkRBQyBTZWxlY3QiLCAiQXV4IFBsYXliYWNrIiwgIkFJRkFVWElOIiB9LAorCXsgIkRBQyIsIE5VTEwsICAiREFDIFNlbGVjdCIgfSwKKworCXsgIkNhcHR1cmUgU2VsZWN0IiwgIkFEQyIsICJBREMiIH0sCisJeyAiQ2FwdHVyZSBTZWxlY3QiLCAiUGxheWJhY2siLCAiQUlGSU4iIH0sCisJeyAiQ2FwdHVyZSBTZWxlY3QiLCAiQXV4IFBsYXliYWNrIiwgIkFJRkFVWElOIiB9LAorCXsgIkFJRk9VVCIsIE5VTEwsICAiQ2FwdHVyZSBTZWxlY3QiIH0sCisKKwl7ICJBdXggQ2FwdHVyZSBTZWxlY3QiLCAiQURDIiwgIkFEQyIgfSwKKwl7ICJBdXggQ2FwdHVyZSBTZWxlY3QiLCAiUGxheWJhY2siLCAiQUlGSU4iIH0sCisJeyAiQXV4IENhcHR1cmUgU2VsZWN0IiwgIkF1eCBQbGF5YmFjayIsICJBSUZBVVhJTiIgfSwKKwl7ICJBSUZBVVhPVVQiLCBOVUxMLCAgIkF1eCBDYXB0dXJlIFNlbGVjdCIgfSwKKworCXsgIlZPVVRSIiwgIE5VTEwsICJEQUMiIH0sCisJeyAiVk9VVEwiLCAgTlVMTCwgIkRBQyIgfSwKKworCXsgIkxlZnQgUEdBIiwgTlVMTCwgIlZJTkwiIH0sCisJeyAiUmlnaHQgUEdBIiwgTlVMTCwgIlZJTlIiIH0sCisJeyAiQURDIiwgTlVMTCwgIkxlZnQgUEdBIiB9LAorCXsgIkFEQyIsIE5VTEwsICJSaWdodCBQR0EiIH0sCisKKwl7ICJTWVNDTEsiLCBOVUxMLCAiUExMMSIsIGFkYXY4MHhfZGFwbV9zeXNjbGtfY2hlY2sgfSwKKwl7ICJTWVNDTEsiLCBOVUxMLCAiUExMMiIsIGFkYXY4MHhfZGFwbV9zeXNjbGtfY2hlY2sgfSwKKwl7ICJTWVNDTEsiLCBOVUxMLCAiT1NDIiwgYWRhdjgweF9kYXBtX3N5c2Nsa19jaGVjayB9LAorCXsgIlBMTDEiLCBOVUxMLCAiT1NDIiwgYWRhdjgweF9kYXBtX3BsbF9jaGVjayB9LAorCXsgIlBMTDIiLCBOVUxMLCAiT1NDIiwgYWRhdjgweF9kYXBtX3BsbF9jaGVjayB9LAorCisJeyAiQURDIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJEQUMiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFJRk9VVCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQUlGQVVYT1VUIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUZJTiIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQUlGQVVYSU4iLCBOVUxMLCAiU1lTQ0xLIiB9LAorfTsKKworc3RhdGljIGludCBhZGF2ODB4X3NldF9kZWVtcGgoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhZGF2ODB4ICphZGF2ODB4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChhZGF2ODB4LT5kZWVtcGgpIHsKKwkJc3dpdGNoIChhZGF2ODB4LT5yYXRlKSB7CisJCWNhc2UgMzIwMDA6CisJCQl2YWwgPSBBREFWODBYX0RBQ19DVFJMMl9ERUVNUEhfMzI7CisJCQlicmVhazsKKwkJY2FzZSA0NDEwMDoKKwkJCXZhbCA9IEFEQVY4MFhfREFDX0NUUkwyX0RFRU1QSF80NDsKKwkJCWJyZWFrOworCQljYXNlIDQ4MDAwOgorCQljYXNlIDY0MDAwOgorCQljYXNlIDg4MjAwOgorCQljYXNlIDk2MDAwOgorCQkJdmFsID0gQURBVjgwWF9EQUNfQ1RSTDJfREVFTVBIXzQ4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2YWwgPSBBREFWODBYX0RBQ19DVFJMMl9ERUVNUEhfTk9ORTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJdmFsID0gQURBVjgwWF9EQUNfQ1RSTDJfREVFTVBIX05PTkU7CisJfQorCisJcmV0dXJuIHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVY4MFhfREFDX0NUUkwyLAorCQlBREFWODBYX0RBQ19DVFJMMl9ERUVNUEhfTUFTSywgdmFsKTsKK30KKworc3RhdGljIGludCBhZGF2ODB4X3B1dF9kZWVtcGgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgYWRhdjgweCAqYWRhdjgweCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCBkZWVtcGggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCisJaWYgKGRlZW1waCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRhdjgweC0+ZGVlbXBoID0gZGVlbXBoOworCisJcmV0dXJuIGFkYXY4MHhfc2V0X2RlZW1waChjb2RlYyk7Cit9CisKK3N0YXRpYyBpbnQgYWRhdjgweF9nZXRfZGVlbXBoKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgYWRhdjgweCAqYWRhdjgweCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGFkYXY4MHgtPmRlZW1waDsKKwlyZXR1cm4gMDsKK307CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGF2ODB4X2lucGdhX3RsdiwgMCwgNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX01JTk1BWChhZGF2ODB4X2RpZ2l0YWxfdGx2LCAtOTU2MywgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGF2ODB4X2NvbnRyb2xzW10gPSB7CisJU09DX0RPVUJMRV9SX1RMVigiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIEFEQVY4MFhfREFDX0xfVk9MLAorCQlBREFWODBYX0RBQ19SX1ZPTCwgMCwgMHhmZiwgMCwgYWRhdjgweF9kaWdpdGFsX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiTWFzdGVyIENhcHR1cmUgVm9sdW1lIiwgQURBVjgwWF9BRENfTF9WT0wsCisJCQlBREFWODBYX0FEQ19SX1ZPTCwgMCwgMHhmZiwgMCwgYWRhdjgweF9kaWdpdGFsX3RsdiksCisKKwlTT0NfRE9VQkxFX1JfVExWKCJQR0EgQ2FwdHVyZSBWb2x1bWUiLCBBREFWODBYX1BHQV9MX1ZPTCwKKwkJCUFEQVY4MFhfUEdBX1JfVk9MLCAwLCAweDMwLCAwLCBhZGF2ODB4X2lucGdhX3RsdiksCisKKwlTT0NfRE9VQkxFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgQURBVjgwWF9EQUNfQ1RSTDEsIDAsIDEsIDEsIDApLAorCVNPQ19ET1VCTEUoIk1hc3RlciBDYXB0dXJlIFN3aXRjaCIsIEFEQVY4MFhfQURDX0NUUkwxLCAyLCAzLCAxLCAxKSwKKworCVNPQ19TSU5HTEUoIkFEQyBIaWdoIFBhc3MgRmlsdGVyIFN3aXRjaCIsIEFEQVY4MFhfQURDX0NUUkwxLCA2LCAxLCAwKSwKKworCVNPQ19TSU5HTEVfQk9PTF9FWFQoIlBsYXliYWNrIERlLWVtcGhhc2lzIFN3aXRjaCIsIDAsCisJCQlhZGF2ODB4X2dldF9kZWVtcGgsIGFkYXY4MHhfcHV0X2RlZW1waCksCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGFkYXY4MHhfcG9ydF9jdHJsX3JlZ3NbMl1bMl0gPSB7CisJeyBBREFWODBYX1JFQ19DVFJMLCBBREFWODBYX1BMQVlCQUNLX0NUUkwsIH0sCisJeyBBREFWODBYX0FVWF9PVVRfQ1RSTCwgQURBVjgwWF9BVVhfSU5fQ1RSTCB9LAorfTsKKworc3RhdGljIGludCBhZGF2ODB4X3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgY2FwdHVyZSA9IDB4MDA7CisJdW5zaWduZWQgaW50IHBsYXliYWNrID0gMHgwMDsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWNhcHR1cmUgfD0gQURBVjgwWF9DQVBUVVJFX01PREVfTUFTVEVSOworCQlwbGF5YmFjayB8PSBBREFWODBYX1BMQVlCQUNLX01PREVfTUFTVEVSOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgorCQljYXB0dXJlIHw9IEFEQVY4MFhfQ0FQVFVSRV9NT0RFX0kyUzsKKwkJcGxheWJhY2sgfD0gQURBVjgwWF9QTEFZQkFDS19NT0RFX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCWNhcHR1cmUgfD0gQURBVjgwWF9DQVBUVVJFX01PREVfTEVGVF9KOworCQlwbGF5YmFjayB8PSBBREFWODBYX1BMQVlCQUNLX01PREVfTEVGVF9KOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCWNhcHR1cmUgfD0gQURBVjgwWF9DQVBUVVJFX01PREVfUklHSFRfSjsKKwkJcGxheWJhY2sgfD0gQURBVjgwWF9QTEFZQkFDS19NT0RFX1JJR0hUX0pfMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBhZGF2ODB4X3BvcnRfY3RybF9yZWdzW2RhaS0+aWRdWzBdLAorCQlBREFWODBYX0NBUFRVUkVfTU9ERV9NQVNLIHwgQURBVjgwWF9DQVBUVVJFX01PREVfTUFTVEVSLAorCQljYXB0dXJlKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBhZGF2ODB4X3BvcnRfY3RybF9yZWdzW2RhaS0+aWRdWzFdLCBwbGF5YmFjayk7CisKKwlhZGF2ODB4LT5kYWlfZm10W2RhaS0+aWRdID0gZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGF2ODB4X3NldF9hZGNfY2xvY2soc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQl1bnNpZ25lZCBpbnQgc2FtcGxlX3JhdGUpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChzYW1wbGVfcmF0ZSA8PSA0ODAwMCkKKwkJdmFsID0gQURBVjgwWF9BRENfQ1RSTDFfTU9EVUxBVE9SXzEyOEZTOworCWVsc2UKKwkJdmFsID0gQURBVjgwWF9BRENfQ1RSTDFfTU9EVUxBVE9SXzY0RlM7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBREFWODBYX0FEQ19DVFJMMSwKKwkJQURBVjgwWF9BRENfQ1RSTDFfTU9EVUxBVE9SX01BU0ssIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGF2ODB4X3NldF9kYWNfY2xvY2soc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQl1bnNpZ25lZCBpbnQgc2FtcGxlX3JhdGUpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChzYW1wbGVfcmF0ZSA8PSA0ODAwMCkKKwkJdmFsID0gQURBVjgwWF9EQUNfQ1RSTDJfRElWMSB8IEFEQVY4MFhfREFDX0NUUkwyX0lOVEVSUE9MXzI1NkZTOworCWVsc2UKKwkJdmFsID0gQURBVjgwWF9EQUNfQ1RSTDJfRElWMiB8IEFEQVY4MFhfREFDX0NUUkwyX0lOVEVSUE9MXzEyOEZTOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVjgwWF9EQUNfQ1RSTDIsCisJCUFEQVY4MFhfREFDX0NUUkwyX0RJVl9NQVNLIHwgQURBVjgwWF9EQUNfQ1RSTDJfSU5URVJQT0xfTUFTSywKKwkJdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXY4MHhfc2V0X2NhcHR1cmVfcGNtX2Zvcm1hdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQl2YWwgPSBBREFWODBYX0NBUFRVUkVfV09SRF9MRU4xNjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxOF8zTEU6CisJCXZhbCA9IEFEQVY4MFhfQ0FQVFJVRV9XT1JEX0xFTjE4OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJdmFsID0gQURBVjgwWF9DQVBUVVJFX1dPUkRfTEVOMjA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXZhbCA9IEFEQVY4MFhfQ0FQVFVSRV9XT1JEX0xFTjI0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBhZGF2ODB4X3BvcnRfY3RybF9yZWdzW2RhaS0+aWRdWzBdLAorCQlBREFWODBYX0NBUFRVUkVfV09SRF9MRU5fTUFTSywgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXY4MHhfc2V0X3BsYXliYWNrX3BjbV9mb3JtYXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpCit7CisJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKGFkYXY4MHgtPmRhaV9mbXRbZGFpLT5pZF0gIT0gU05EX1NPQ19EQUlGTVRfUklHSFRfSikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCXZhbCA9IEFEQVY4MFhfUExBWUJBQ0tfTU9ERV9SSUdIVF9KXzE2OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE4XzNMRToKKwkJdmFsID0gQURBVjgwWF9QTEFZQkFDS19NT0RFX1JJR0hUX0pfMTg7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjBfM0xFOgorCQl2YWwgPSBBREFWODBYX1BMQVlCQUNLX01PREVfUklHSFRfSl8yMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJdmFsID0gQURBVjgwWF9QTEFZQkFDS19NT0RFX1JJR0hUX0pfMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGFkYXY4MHhfcG9ydF9jdHJsX3JlZ3NbZGFpLT5pZF1bMV0sCisJCUFEQVY4MFhfUExBWUJBQ0tfTU9ERV9NQVNLLCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdjgweF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBhZGF2ODB4ICphZGF2ODB4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCisJaWYgKHJhdGUgKiAyNTYgIT0gYWRhdjgweC0+c3lzY2xrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWFkYXY4MHhfc2V0X3BsYXliYWNrX3BjbV9mb3JtYXQoY29kZWMsIGRhaSwKKwkJCXBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCWFkYXY4MHhfc2V0X2RhY19jbG9jayhjb2RlYywgcmF0ZSk7CisJfSBlbHNlIHsKKwkJYWRhdjgweF9zZXRfY2FwdHVyZV9wY21fZm9ybWF0KGNvZGVjLCBkYWksCisJCQlwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCQlhZGF2ODB4X3NldF9hZGNfY2xvY2soY29kZWMsIHJhdGUpOworCX0KKwlhZGF2ODB4LT5yYXRlID0gcmF0ZTsKKwlhZGF2ODB4X3NldF9kZWVtcGgoY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdjgweF9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChkaXIgPT0gU05EX1NPQ19DTE9DS19JTikgeworCQlzd2l0Y2ggKGNsa19pZCkgeworCQljYXNlIEFEQVY4MFhfQ0xLX1hJTjoKKwkJY2FzZSBBREFWODBYX0NMS19YVEFMOgorCQljYXNlIEFEQVY4MFhfQ0xLX01DTEtJOgorCQljYXNlIEFEQVY4MFhfQ0xLX1BMTDE6CisJCWNhc2UgQURBVjgwWF9DTEtfUExMMjoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlhZGF2ODB4LT5zeXNjbGsgPSBmcmVxOworCisJCWlmIChhZGF2ODB4LT5jbGtfc3JjICE9IGNsa19pZCkgeworCQkJdW5zaWduZWQgaW50IGljbGtfY3RybDEsIGljbGtfY3RybDI7CisKKwkJCWFkYXY4MHgtPmNsa19zcmMgPSBjbGtfaWQ7CisJCQlpZiAoY2xrX2lkID09IEFEQVY4MFhfQ0xLX1hUQUwpCisJCQkJY2xrX2lkID0gQURBVjgwWF9DTEtfWElOOworCisJCQlpY2xrX2N0cmwxID0gQURBVjgwWF9JQ0xLX0NUUkwxX0RBQ19TUkMoY2xrX2lkKSB8CisJCQkJCUFEQVY4MFhfSUNMS19DVFJMMV9BRENfU1JDKGNsa19pZCkgfAorCQkJCQlBREFWODBYX0lDTEtfQ1RSTDFfSUNMSzJfU1JDKGNsa19pZCk7CisJCQlpY2xrX2N0cmwyID0gQURBVjgwWF9JQ0xLX0NUUkwyX0lDTEsxX1NSQyhjbGtfaWQpOworCisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFWODBYX0lDTEtfQ1RSTDEsIGljbGtfY3RybDEpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgQURBVjgwWF9JQ0xLX0NUUkwyLCBpY2xrX2N0cmwyKTsKKworCQkJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKKwkJfQorCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBtYXNrOworCisJCXN3aXRjaCAoY2xrX2lkKSB7CisJCWNhc2UgQURBVjgwWF9DTEtfU1lTQ0xLMToKKwkJY2FzZSBBREFWODBYX0NMS19TWVNDTEsyOgorCQljYXNlIEFEQVY4MFhfQ0xLX1NZU0NMSzM6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJY2xrX2lkIC09IEFEQVY4MFhfQ0xLX1NZU0NMSzE7CisJCW1hc2sgPSBBREFWODBYX1BMTF9PVVRFX1NZU0NMS1BEKGNsa19pZCk7CisKKwkJaWYgKGZyZXEgPT0gMCkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVjgwWF9QTExfT1VURSwgbWFzaywgbWFzayk7CisJCQlhZGF2ODB4LT5zeXNjbGtfcGRbY2xrX2lkXSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBREFWODBYX1BMTF9PVVRFLCBtYXNrLCAwKTsKKwkJCWFkYXY4MHgtPnN5c2Nsa19wZFtjbGtfaWRdID0gZmFsc2U7CisJCX0KKworCQlpZiAoYWRhdjgweC0+c3lzY2xrX3BkWzBdKQorCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlBMTDEiKTsKKwkJZWxzZQorCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMSIpOworCisJCWlmIChhZGF2ODB4LT5zeXNjbGtfcGRbMV0gfHwgYWRhdjgweC0+c3lzY2xrX3BkWzJdKQorCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlBMTDIiKTsKKwkJZWxzZQorCQkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMiIpOworCisJCXNuZF9zb2NfZGFwbV9zeW5jKCZjb2RlYy0+ZGFwbSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdjgweF9zZXRfcGxsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IHBsbF9pZCwKKwkJaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZXFfaW4sIHVuc2lnbmVkIGludCBmcmVxX291dCkKK3sKKwlzdHJ1Y3QgYWRhdjgweCAqYWRhdjgweCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCBwbGxfY3RybDEgPSAwOworCXVuc2lnbmVkIGludCBwbGxfY3RybDIgPSAwOworCXVuc2lnbmVkIGludCBwbGxfc3JjOworCisJc3dpdGNoIChzb3VyY2UpIHsKKwljYXNlIEFEQVY4MFhfUExMX1NSQ19YVEFMOgorCWNhc2UgQURBVjgwWF9QTExfU1JDX1hJTjoKKwljYXNlIEFEQVY4MFhfUExMX1NSQ19NQ0xLSToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFmcmVxX291dCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGZyZXFfaW4pIHsKKwljYXNlIDI3MDAwMDAwOgorCQlicmVhazsKKwljYXNlIDU0MDAwMDAwOgorCQlpZiAoc291cmNlID09IEFEQVY4MFhfUExMX1NSQ19YSU4pIHsKKwkJCXBsbF9jdHJsMSB8PSBBREFWODBYX1BMTF9DVFJMMV9QTExESVY7CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChmcmVxX291dCA+IDEyMjg4MDAwKSB7CisJCXBsbF9jdHJsMiB8PSBBREFWODBYX1BMTF9DVFJMMl9ET1VCKHBsbF9pZCk7CisJCWZyZXFfb3V0IC89IDI7CisJfQorCisJLyogZnJlcV9vdXQgPSBzYW1wbGVfcmF0ZSAqIDI1NiAqLworCXN3aXRjaCAoZnJlcV9vdXQpIHsKKwljYXNlIDgxOTIwMDA6CisJCXBsbF9jdHJsMiB8PSBBREFWODBYX1BMTF9DVFJMMl9GU18zMihwbGxfaWQpOworCQlicmVhazsKKwljYXNlIDExMjg5NjAwOgorCQlwbGxfY3RybDIgfD0gQURBVjgwWF9QTExfQ1RSTDJfRlNfNDQocGxsX2lkKTsKKwkJYnJlYWs7CisJY2FzZSAxMjI4ODAwMDoKKwkJcGxsX2N0cmwyIHw9IEFEQVY4MFhfUExMX0NUUkwyX0ZTXzQ4KHBsbF9pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVY4MFhfUExMX0NUUkwxLCBBREFWODBYX1BMTF9DVFJMMV9QTExESVYsCisJCXBsbF9jdHJsMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVjgwWF9QTExfQ1RSTDIsCisJCQlBREFWODBYX1BMTF9DVFJMMl9QTExfTUFTSyhwbGxfaWQpLCBwbGxfY3RybDIpOworCisJaWYgKHNvdXJjZSAhPSBhZGF2ODB4LT5wbGxfc3JjKSB7CisJCWlmIChzb3VyY2UgPT0gQURBVjgwWF9QTExfU1JDX01DTEtJKQorCQkJcGxsX3NyYyA9IEFEQVY4MFhfUExMX0NMS19TUkNfUExMX01DTEtJKHBsbF9pZCk7CisJCWVsc2UKKwkJCXBsbF9zcmMgPSBBREFWODBYX1BMTF9DTEtfU1JDX1BMTF9YSU4ocGxsX2lkKTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBREFWODBYX1BMTF9DTEtfU1JDLAorCQkJCUFEQVY4MFhfUExMX0NMS19TUkNfUExMX01BU0socGxsX2lkKSwgcGxsX3NyYyk7CisKKwkJYWRhdjgweC0+cGxsX3NyYyA9IHNvdXJjZTsKKworCQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXY4MHhfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IEFEQVY4MFhfREFDX0NUUkwxX1BEOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBREFWODBYX0RBQ19DVFJMMSwgbWFzaywgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVjgwWF9EQUNfQ1RSTDEsIG1hc2ssIG1hc2spOworCQlicmVhazsKKwl9CisKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisJcmV0dXJuIDA7Cit9CisKKy8qIEVuZm9yY2UgdGhlIHNhbWUgc2FtcGxlIHJhdGUgb24gYWxsIGF1ZGlvIGludGVyZmFjZXMgKi8KK3N0YXRpYyBpbnQgYWRhdjgweF9kYWlfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBhZGF2ODB4ICphZGF2ODB4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoIWNvZGVjLT5hY3RpdmUgfHwgIWFkYXY4MHgtPnJhdGUpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgoc3Vic3RyZWFtLT5ydW50aW1lLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsIGFkYXY4MHgtPnJhdGUsIGFkYXY4MHgtPnJhdGUpOworfQorCitzdGF0aWMgdm9pZCBhZGF2ODB4X2RhaV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgYWRhdjgweCAqYWRhdjgweCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKCFjb2RlYy0+YWN0aXZlKQorCQlhZGF2ODB4LT5yYXRlID0gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgYWRhdjgweF9kYWlfb3BzID0geworCS5zZXRfZm10ID0gYWRhdjgweF9zZXRfZGFpX2ZtdCwKKwkuaHdfcGFyYW1zID0gYWRhdjgweF9od19wYXJhbXMsCisJLnN0YXJ0dXAgPSBhZGF2ODB4X2RhaV9zdGFydHVwLAorCS5zaHV0ZG93biA9IGFkYXY4MHhfZGFpX3NodXRkb3duLAorfTsKKworI2RlZmluZSBBREFWODBYX1BMQVlCQUNLX1JBVEVTIChTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgXAorCVNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfNjQwMDAgfCBTTkRSVl9QQ01fUkFURV84ODIwMCB8IFwKKwlTTkRSVl9QQ01fUkFURV85NjAwMCkKKworI2RlZmluZSBBREFWODBYX0NBUFRVUkVfUkFURVMgKFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDApCisKKyNkZWZpbmUgQURBVjgwWF9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE4XzNMRSB8IFwKKwlTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSkKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgYWRhdjgweF9kYWlzW10gPSB7CisJeworCQkubmFtZSA9ICJhZGF2ODB4LWhpZmkiLAorCQkuaWQgPSAwLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiSGlGaSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gQURBVjgwWF9QTEFZQkFDS19SQVRFUywKKwkJCS5mb3JtYXRzID0gQURBVjgwWF9GT1JNQVRTLAorCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkhpRmkgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gQURBVjgwWF9DQVBUVVJFX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBBREFWODBYX0ZPUk1BVFMsCisJCX0sCisJCS5vcHMgPSAmYWRhdjgweF9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJhZGF2ODB4LWF1eCIsCisJCS5pZCA9IDEsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBdXggUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IEFEQVY4MFhfUExBWUJBQ0tfUkFURVMsCisJCQkuZm9ybWF0cyA9IEFEQVY4MFhfRk9STUFUUywKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQXV4IENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IEFEQVY4MFhfQ0FQVFVSRV9SQVRFUywKKwkJCS5mb3JtYXRzID0gQURBVjgwWF9GT1JNQVRTLAorCQl9LAorCQkub3BzID0gJmFkYXY4MHhfZGFpX29wcywKKwl9LAorfTsKKworc3RhdGljIGludCBhZGF2ODB4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGF2ODB4ICphZGF2ODB4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgNywgOSwgYWRhdjgweC0+Y29udHJvbF90eXBlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBGb3JjZSBQTExzIG9uIGZvciBTWVNDTEsgb3V0cHV0ICovCisJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiUExMMSIpOworCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlBMTDIiKTsKKworCS8qIFBvd2VyIGRvd24gUy9QRElGIHJlY2VpdmVyLCBzaW5jZSBpdCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVY4MFhfUExMX09VVEUsIDB4MjApOworCS8qIERpc2FibGUgREFDIHplcm8gZmxhZyAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVY4MFhfREFDX0NUUkwzLCAweDYpOworCisJcmV0dXJuIGFkYXY4MHhfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKK30KKworc3RhdGljIGludCBhZGF2ODB4X3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJcmV0dXJuIGFkYXY4MHhfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworfQorCitzdGF0aWMgaW50IGFkYXY4MHhfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlhZGF2ODB4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisJY29kZWMtPmNhY2hlX3N5bmMgPSAxOworCXNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGF2ODB4X3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIGFkYXY4MHhfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIGFkYXY4MHhfY29kZWNfZHJpdmVyID0geworCS5wcm9iZSA9IGFkYXY4MHhfcHJvYmUsCisJLnJlbW92ZSA9IGFkYXY4MHhfcmVtb3ZlLAorCS5zdXNwZW5kID0gYWRhdjgweF9zdXNwZW5kLAorCS5yZXN1bWUgPSBhZGF2ODB4X3Jlc3VtZSwKKwkuc2V0X2JpYXNfbGV2ZWwgPSBhZGF2ODB4X3NldF9iaWFzX2xldmVsLAorCisJLnNldF9wbGwgPSBhZGF2ODB4X3NldF9wbGwsCisJLnNldF9zeXNjbGsgPSBhZGF2ODB4X3NldF9zeXNjbGssCisKKwkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1OCksCisJLnJlZ19jYWNoZV9zaXplID0gQVJSQVlfU0laRShhZGF2ODB4X2RlZmF1bHRfcmVncyksCisJLnJlZ19jYWNoZV9kZWZhdWx0ID0gYWRhdjgweF9kZWZhdWx0X3JlZ3MsCisKKwkuY29udHJvbHMgPSBhZGF2ODB4X2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkYXY4MHhfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBhZGF2ODB4X2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWRhdjgweF9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGFkYXY4MHhfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWRhdjgweF9kYXBtX3JvdXRlcyksCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGF2ODB4X2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlKQoreworCXN0cnVjdCBhZGF2ODB4ICphZGF2ODB4OworCWludCByZXQ7CisKKwlhZGF2ODB4ID0ga3phbGxvYyhzaXplb2YoKmFkYXY4MHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXY4MHgpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgYWRhdjgweCk7CisJYWRhdjgweC0+Y29udHJvbF90eXBlID0gY29udHJvbF90eXBlOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYyhkZXYsICZhZGF2ODB4X2NvZGVjX2RyaXZlciwKKwkJYWRhdjgweF9kYWlzLCBBUlJBWV9TSVpFKGFkYXY4MHhfZGFpcykpOworCWlmIChyZXQpCisJCWtmcmVlKGFkYXY4MHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWRhdjgweF9idXNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoZGV2KTsKKwlrZnJlZShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorc3RhdGljIGludCBfX2RldmluaXQgYWRhdjgweF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gYWRhdjgweF9idXNfcHJvYmUoJnNwaS0+ZGV2LCBTTkRfU09DX1NQSSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkYXY4MHhfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiBhZGF2ODB4X2J1c19yZW1vdmUoJnNwaS0+ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkYXY4MHhfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZGF2ODAxIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWRhdjgweF9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZGF2ODB4X3NwaV9yZW1vdmUpLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkYXY4MHhfaWRbXSA9IHsKKwl7ICJhZGF2ODAzIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZGF2ODB4X2lkKTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWRhdjgweF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBhZGF2ODB4X2J1c19wcm9iZSgmY2xpZW50LT5kZXYsIFNORF9TT0NfSTJDKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWRhdjgweF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIGFkYXY4MHhfYnVzX3JlbW92ZSgmY2xpZW50LT5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRhdjgweF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkYXY4MDMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkYXY4MHhfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZGF2ODB4X2kyY19yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkYXY4MHhfaWQsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGFkYXY4MHhfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorCXJldCA9IGkyY19hZGRfZHJpdmVyKCZhZGF2ODB4X2kyY19kcml2ZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCisJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRhdjgweF9zcGlfZHJpdmVyKTsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KGFkYXY4MHhfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZGF2ODB4X2V4aXQodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJaTJjX2RlbF9kcml2ZXIoJmFkYXY4MHhfaTJjX2RyaXZlcik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRhdjgweF9zcGlfZHJpdmVyKTsKKyNlbmRpZgorfQorbW9kdWxlX2V4aXQoYWRhdjgweF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEFEQVY4MHggZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9BVVRIT1IoIllpIExpIDx5aS5saUBhbmFsb2cuY29tPj4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5oIGIvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiMGZjNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBoZWFkZXIgZmlsZSBmb3IgQURBVjgwWCBwYXJ0cworICoKKyAqIENvcHlyaWdodCAyMDExIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfQURBVjgwWF9ICisjZGVmaW5lIF9BREFWODBYX0gKKworZW51bSBhZGF2ODB4X3BsbF9zcmMgeworCUFEQVY4MFhfUExMX1NSQ19YSU4sCisJQURBVjgwWF9QTExfU1JDX1hUQUwsCisJQURBVjgwWF9QTExfU1JDX01DTEtJLAorfTsKKworZW51bSBhZGF2ODB4X3BsbCB7CisJQURBVjgwWF9QTEwxID0gMCwKKwlBREFWODBYX1BMTDIgPSAxLAorfTsKKworZW51bSBhZGF2ODB4X2Nsa19zcmMgeworCUFEQVY4MFhfQ0xLX1hJTiA9IDAsCisJQURBVjgwWF9DTEtfTUNMS0kgPSAxLAorCUFEQVY4MFhfQ0xLX1BMTDEgPSAyLAorCUFEQVY4MFhfQ0xLX1BMTDIgPSAzLAorCUFEQVY4MFhfQ0xLX1hUQUwgPSA2LAorCisJQURBVjgwWF9DTEtfU1lTQ0xLMSA9IDYsCisJQURBVjgwWF9DTEtfU1lTQ0xLMiA9IDcsCisJQURBVjgwWF9DTEtfU1lTQ0xLMyA9IDgsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jCmluZGV4IGVkOTZmMjQ3Yy4uN2E2NGU1OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jCkBAIC00NTcsNyArNDU3LDcgQEAKIAkuc2V0X3N5c2NsayAgID0gYWs0NjQxX3NldF9kYWlfc3lzY2xrLAogfTsKIAotc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBhazQ2NDFfZGFpW10gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBhazQ2NDFfZGFpW10gPSB7CiB7CiAJLm5hbWUgPSAiYWs0NjQxLWhpZmkiLAogCS5pZCA9IDEsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYwppbmRleCA0YmUwNTcwLi42NWY0NjA0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKQEAgLTM1Nyw3ICszNTcsNyBAQAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBQV19NR01UMiwgTVMsIGRhdGEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFBXX01HTVQyLCBNUyB8IE1DS08gfCBQTVBMTCwgZGF0YSk7CiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTURfQ1RMMSwgQkNLT19NQVNLLCBiY2tvKTsKIAogCS8qIGZvcm1hdCB0eXBlICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYwppbmRleCAwMjA2YTE3Li42Y2M4Njc4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKQEAgLTYzNiwxMCArNjM2LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogLyoKLSAqIEFTb0MgY29kZWMgZGV2aWNlIHN0cnVjdHVyZQotICoKLSAqIEFzc2lnbiB0aGlzIHZhcmlhYmxlIHRvIHRoZSBjb2RlY19kZXYgZmllbGQgb2YgdGhlIG1hY2hpbmUgZHJpdmVyJ3MKLSAqIHNuZF9zb2NfZGV2aWNlIHN0cnVjdHVyZS4KKyAqIEFTb0MgY29kZWMgZHJpdmVyIHN0cnVjdHVyZQogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZpY2VfY3M0MjcwID0gewogCS5wcm9iZSA9CQljczQyNzBfcHJvYmUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMKaW5kZXggNDE3M2I2Ny4uYWM2NWEyZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwODguYwpAQCAtMTM5Nyw4ICsxMzk3LDYgQEAKICAgICAgICBpZiAoZnJlcSA9PSBtYXg5ODA4OC0+c3lzY2xrKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICBtYXg5ODA4OC0+c3lzY2xrID0gZnJlcTsgLyogcmVtZW1iZXIgY3VycmVudCBzeXNjbGsgKi8KLQogICAgICAgIC8qIFNldHVwIGNsb2NrcyBmb3Igc2xhdmUgbW9kZSwgYW5kIHVzaW5nIHRoZSBQTEwKICAgICAgICAgKiBQU0NMSyA9IDB4MDEgKHdoZW4gbWFzdGVyIGNsayBpcyAxME1IeiB0byAyME1IeikKICAgICAgICAgKiAgICAgICAgIDB4MDIgKHdoZW4gbWFzdGVyIGNsayBpcyAyME1IeiB0byAzME1IeikuLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jCmluZGV4IGUxZDI4MmQuLjY2ODQzNGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMKQEAgLTE1MTcsOCArMTUxNyw2IEBACiAJaWYgKGZyZXEgPT0gbWF4OTgwOTUtPnN5c2NsaykKIAkJcmV0dXJuIDA7CiAKLQltYXg5ODA5NS0+c3lzY2xrID0gZnJlcTsgLyogcmVtZW1iZXIgY3VycmVudCBzeXNjbGsgKi8KLQogCS8qIFNldHVwIGNsb2NrcyBmb3Igc2xhdmUgbW9kZSwgYW5kIHVzaW5nIHRoZSBQTEwKIAkgKiBQU0NMSyA9IDB4MDEgKHdoZW4gbWFzdGVyIGNsayBpcyAxME1IeiB0byAyME1IeikKIAkgKiAgICAgICAgIDB4MDIgKHdoZW4gbWFzdGVyIGNsayBpcyAyME1IeiB0byA0ME1IeikuLgpAQCAtMjI2MSwxMSArMjI1OSwxMSBAQAogCiAJcmV0ID0gc25kX3NvY19yZWFkKGNvZGVjLCBNOTgwOTVfMEZGX1JFVl9JRCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgZGV2aWNlIHJldmlzaW9uOiAlZFxuIiwKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbHVyZSByZWFkaW5nIGhhcmR3YXJlIHJldmlzaW9uOiAlZFxuIiwKIAkJCXJldCk7CiAJCWdvdG8gZXJyX2FjY2VzczsKIAl9Ci0JZGV2X2luZm8oY29kZWMtPmRldiwgInJldmlzaW9uICVjXG4iLCByZXQgKyAnQScpOworCWRldl9pbmZvKGNvZGVjLT5kZXYsICJIYXJkd2FyZSByZXZpc2lvbjogJWNcbiIsIHJldCAtIDB4NDAgKyAnQScpOwogCiAJc25kX3NvY193cml0ZShjb2RlYywgTTk4MDk1XzA5N19QV1JfU1lTLCBNOTgwOTVfUFdSU1YpOwogCkBAIC0yMzQyLDggKzIzNDAsOCBAQAogCW1heDk4MDk1LT5jb250cm9sX2RhdGEgPSBpMmM7CiAJbWF4OTgwOTUtPnBkYXRhID0gaTJjLT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LAotCQkJJnNvY19jb2RlY19kZXZfbWF4OTgwOTUsICZtYXg5ODA5NV9kYWlbMF0sIDMpOworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2Rldl9tYXg5ODA5NSwKKwkJCQkgICAgIG1heDk4MDk1X2RhaSwgQVJSQVlfU0laRShtYXg5ODA5NV9kYWkpKTsKIAlpZiAocmV0IDwgMCkKIAkJa2ZyZWUobWF4OTgwOTUpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3N0YTMyeC5jIGIvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDlkODlkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYwpAQCAtMCwwICsxLDkxNyBAQAorLyoKKyAqIENvZGVjIGRyaXZlciBmb3IgU1QgU1RBMzJ4IDIuMS1jaGFubmVsIGhpZ2gtZWZmaWNpZW5jeSBkaWdpdGFsIGF1ZGlvIHN5c3RlbQorICoKKyAqIENvcHlyaWdodDogMjAxMSBSYXVtZmVsZCBHbWJICisgKiBBdXRob3I6IEpvaGFubmVzIFN0ZXplbmJhY2ggPGpzQHNpZzIxLm5ldD4KKyAqCisgKiBiYXNlZCBvbiBjb2RlIGZyb206CisgKglXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoJICBNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KKyAqCUZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgkgIFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6JXM6JWQ6ICIgZm10LCBfX2Z1bmNfXywgX19MSU5FX18KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworI2luY2x1ZGUgInN0YTMyeC5oIgorCisjZGVmaW5lIFNUQTMyWF9SQVRFUyAoU05EUlZfUENNX1JBVEVfMzIwMDAgfCBcCisJCSAgICAgIFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgXAorCQkgICAgICBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFwKKwkJICAgICAgU05EUlZfUENNX1JBVEVfODgyMDAgfCBcCisJCSAgICAgIFNORFJWX1BDTV9SQVRFXzk2MDAwIHwgXAorCQkgICAgICBTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBcCisJCSAgICAgIFNORFJWX1BDTV9SQVRFXzE5MjAwMCkKKworI2RlZmluZSBTVEEzMlhfRk9STUFUUyBcCisJKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFICB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFICB8IFwKKwkgU05EUlZfUENNX0ZNVEJJVF9TMThfM0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMThfM0JFIHwgXAorCSBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zQkUgfCBcCisJIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0XzNCRSB8IFwKKwkgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfQkUgIHwgXAorCSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSAgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9CRSkKKworLyogUG93ZXItdXAgcmVnaXN0ZXIgZGVmYXVsdHMgKi8KK3N0YXRpYyBjb25zdCB1OCBzdGEzMnhfcmVnc1tTVEEzMlhfUkVHSVNURVJfQ09VTlRdID0geworCTB4NjMsIDB4ODAsIDB4YzIsIDB4NDAsIDB4YzIsIDB4NWMsIDB4MTAsIDB4ZmYsIDB4NjAsIDB4NjAsCisJMHg2MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg4MCwgMHg3NywgMHg2YSwgMHg2OSwKKwkweDZhLCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MmQsCisJMHhjMCwgMHhmMywgMHgzMywgMHgwMCwgMHgwYywKK307CisKKy8qIHJlZ3VsYXRvciBwb3dlciBzdXBwbHkgbmFtZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpzdGEzMnhfc3VwcGx5X25hbWVzW10gPSB7CisJIlZkZGEiLAkvKiBhbmFsb2cgc3VwcGx5LCAzLjNWViAqLworCSJWZGQzIiwJLyogZGlnaXRhbCBzdXBwbHksIDMuM1YgKi8KKwkiVmNjIgkvKiBwb3dlciBhbXAgc3BwbHksIDEwViAtIDM2ViAqLworfTsKKworLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCitzdHJ1Y3Qgc3RhMzJ4X3ByaXYgeworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW0FSUkFZX1NJWkUoc3RhMzJ4X3N1cHBseV9uYW1lcyldOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCXVuc2lnbmVkIGludCBtY2xrOworCXVuc2lnbmVkIGludCBmb3JtYXQ7Cit9OworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUobXZvbF90bHYsIC0xMjcwMCwgNTAsIDEpOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGNodm9sX3RsdiwgLTc5NTAsIDUwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRSh0b25lX3RsdiwgLTEyMCwgMjAwLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnN0YTMyeF9kcmNfYWNbXSA9IHsKKwkiQW50aS1DbGlwcGluZyIsICJEeW5hbWljIFJhbmdlIENvbXByZXNzaW9uIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKnN0YTMyeF9hdXRvX2VxX21vZGVbXSA9IHsKKwkiVXNlciIsICJQcmVzZXQiLCAiTG91ZG5lc3MiIH07CitzdGF0aWMgY29uc3QgY2hhciAqc3RhMzJ4X2F1dG9fZ2NfbW9kZVtdID0geworCSJVc2VyIiwgIkFDIG5vIGNsaXBwaW5nIiwgIkFDIGxpbWl0ZWQgY2xpcHBpbmcgKDEwJSkiLAorCSJEUkMgbmlnaHR0aW1lIGxpc3RlbmluZyBtb2RlIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKnN0YTMyeF9hdXRvX3hvX21vZGVbXSA9IHsKKwkiVXNlciIsICI4MEh6IiwgIjEwMEh6IiwgIjEyMEh6IiwgIjE0MEh6IiwgIjE2MEh6IiwgIjE4MEh6IiwgIjIwMEh6IiwKKwkiMjIwSHoiLCAiMjQwSHoiLCAiMjYwSHoiLCAiMjgwSHoiLCAiMzAwSHoiLCAiMzIwSHoiLCAiMzQwSHoiLCAiMzYwSHoiIH07CitzdGF0aWMgY29uc3QgY2hhciAqc3RhMzJ4X3ByZXNldF9lcV9tb2RlW10gPSB7CisJIkZsYXQiLCAiUm9jayIsICJTb2Z0IFJvY2siLCAiSmF6eiIsICJDbGFzc2ljYWwiLCAiRGFuY2UiLCAiUG9wIiwgIlNvZnQiLAorCSJIYXJkIiwgIlBhcnR5IiwgIlZvY2FsIiwgIkhpcC1Ib3AiLCAiRGlhbG9nIiwgIkJhc3MtYm9vc3QgIzEiLAorCSJCYXNzLWJvb3N0ICMyIiwgIkJhc3MtYm9vc3QgIzMiLCAiTG91ZG5lc3MgMSIsICJMb3VkbmVzcyAyIiwKKwkiTG91ZG5lc3MgMyIsICJMb3VkbmVzcyA0IiwgIkxvdWRuZXNzIDUiLCAiTG91ZG5lc3MgNiIsICJMb3VkbmVzcyA3IiwKKwkiTG91ZG5lc3MgOCIsICJMb3VkbmVzcyA5IiwgIkxvdWRuZXNzIDEwIiwgIkxvdWRuZXNzIDExIiwgIkxvdWRuZXNzIDEyIiwKKwkiTG91ZG5lc3MgMTMiLCAiTG91ZG5lc3MgMTQiLCAiTG91ZG5lc3MgMTUiLCAiTG91ZG5lc3MgMTYiIH07CitzdGF0aWMgY29uc3QgY2hhciAqc3RhMzJ4X2xpbWl0ZXJfc2VsZWN0W10gPSB7CisJIkxpbWl0ZXIgRGlzYWJsZWQiLCAiTGltaXRlciAjMSIsICJMaW1pdGVyICMyIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKnN0YTMyeF9saW1pdGVyX2F0dGFja19yYXRlW10gPSB7CisJIjMuMTU4NCIsICIyLjcwNzIiLCAiMi4yNTYwIiwgIjEuODA0OCIsICIxLjM1MzYiLCAiMC45MDI0IiwKKwkiMC40NTEyIiwgIjAuMjI1NiIsICIwLjE1MDQiLCAiMC4xMTIzIiwgIjAuMDkwMiIsICIwLjA3NTIiLAorCSIwLjA2NDUiLCAiMC4wNTY0IiwgIjAuMDUwMSIsICIwLjA0NTEiIH07CitzdGF0aWMgY29uc3QgY2hhciAqc3RhMzJ4X2xpbWl0ZXJfcmVsZWFzZV9yYXRlW10gPSB7CisJIjAuNTExNiIsICIwLjEzNzAiLCAiMC4wNzQ0IiwgIjAuMDQ5OSIsICIwLjAzNjAiLCAiMC4wMjk5IiwKKwkiMC4wMjY0IiwgIjAuMDIwOCIsICIwLjAxOTgiLCAiMC4wMTcyIiwgIjAuMDE0NyIsICIwLjAxMzciLAorCSIwLjAxMzQiLCAiMC4wMTE3IiwgIjAuMDExMCIsICIwLjAxMDQiIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RhMzJ4X2xpbWl0ZXJfYWNfYXR0YWNrX3RsdltdID0geworCVRMVl9EQl9SQU5HRV9IRUFEKDIpLAorCTAsIDcsIFRMVl9EQl9TQ0FMRV9JVEVNKC0xMjAwLCAyMDAsIDApLAorCTgsIDE2LCBUTFZfREJfU0NBTEVfSVRFTSgzMDAsIDEwMCwgMCksCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0YTMyeF9saW1pdGVyX2FjX3JlbGVhc2VfdGx2W10gPSB7CisJVExWX0RCX1JBTkdFX0hFQUQoNSksCisJMCwgMCwgVExWX0RCX1NDQUxFX0lURU0oVExWX0RCX0dBSU5fTVVURSwgMCwgMCksCisJMSwgMSwgVExWX0RCX1NDQUxFX0lURU0oLTI5MDAsIDAsIDApLAorCTIsIDIsIFRMVl9EQl9TQ0FMRV9JVEVNKC0yMDAwLCAwLCAwKSwKKwkzLCA4LCBUTFZfREJfU0NBTEVfSVRFTSgtMTQwMCwgMjAwLCAwKSwKKwk4LCAxNiwgVExWX0RCX1NDQUxFX0lURU0oLTcwMCwgMTAwLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RhMzJ4X2xpbWl0ZXJfZHJjX2F0dGFja190bHZbXSA9IHsKKwlUTFZfREJfUkFOR0VfSEVBRCgzKSwKKwkwLCA3LCBUTFZfREJfU0NBTEVfSVRFTSgtMzEwMCwgMjAwLCAwKSwKKwk4LCAxMywgVExWX0RCX1NDQUxFX0lURU0oLTE2MDAsIDEwMCwgMCksCisJMTQsIDE2LCBUTFZfREJfU0NBTEVfSVRFTSgtMTAwMCwgMzAwLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RhMzJ4X2xpbWl0ZXJfZHJjX3JlbGVhc2VfdGx2W10gPSB7CisJVExWX0RCX1JBTkdFX0hFQUQoNSksCisJMCwgMCwgVExWX0RCX1NDQUxFX0lURU0oVExWX0RCX0dBSU5fTVVURSwgMCwgMCksCisJMSwgMiwgVExWX0RCX1NDQUxFX0lURU0oLTM4MDAsIDIwMCwgMCksCisJMywgNCwgVExWX0RCX1NDQUxFX0lURU0oLTMzMDAsIDIwMCwgMCksCisJNSwgMTIsIFRMVl9EQl9TQ0FMRV9JVEVNKC0zMDAwLCAyMDAsIDApLAorCTEzLCAxNiwgVExWX0RCX1NDQUxFX0lURU0oLTE1MDAsIDMwMCwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0YTMyeF9kcmNfYWNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFNUQTMyWF9DT05GRCwgU1RBMzJYX0NPTkZEX0RSQ19TSElGVCwKKwkJCTIsIHN0YTMyeF9kcmNfYWMpOworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGEzMnhfYXV0b19lcV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoU1RBMzJYX0FVVE8xLCBTVEEzMlhfQVVUTzFfQU1FUV9TSElGVCwKKwkJCTMsIHN0YTMyeF9hdXRvX2VxX21vZGUpOworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGEzMnhfYXV0b19nY19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoU1RBMzJYX0FVVE8xLCBTVEEzMlhfQVVUTzFfQU1HQ19TSElGVCwKKwkJCTQsIHN0YTMyeF9hdXRvX2djX21vZGUpOworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGEzMnhfYXV0b194b19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoU1RBMzJYX0FVVE8yLCBTVEEzMlhfQVVUTzJfWE9fU0hJRlQsCisJCQkxNiwgc3RhMzJ4X2F1dG9feG9fbW9kZSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0YTMyeF9wcmVzZXRfZXFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFNUQTMyWF9BVVRPMywgU1RBMzJYX0FVVE8zX1BFUV9TSElGVCwKKwkJCTMyLCBzdGEzMnhfcHJlc2V0X2VxX21vZGUpOworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGEzMnhfbGltaXRlcl9jaDFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFNUQTMyWF9DMUNGRywgU1RBMzJYX0N4Q0ZHX0xTX1NISUZULAorCQkJMywgc3RhMzJ4X2xpbWl0ZXJfc2VsZWN0KTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhMzJ4X2xpbWl0ZXJfY2gyX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShTVEEzMlhfQzJDRkcsIFNUQTMyWF9DeENGR19MU19TSElGVCwKKwkJCTMsIHN0YTMyeF9saW1pdGVyX3NlbGVjdCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0YTMyeF9saW1pdGVyX2NoM19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoU1RBMzJYX0MzQ0ZHLCBTVEEzMlhfQ3hDRkdfTFNfU0hJRlQsCisJCQkzLCBzdGEzMnhfbGltaXRlcl9zZWxlY3QpOworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzdGEzMnhfbGltaXRlcjFfYXR0YWNrX3JhdGVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFNUQTMyWF9MMUFSLCBTVEEzMlhfTHhBX1NISUZULAorCQkJMTYsIHN0YTMyeF9saW1pdGVyX2F0dGFja19yYXRlKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3RhMzJ4X2xpbWl0ZXIyX2F0dGFja19yYXRlX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShTVEEzMlhfTDJBUiwgU1RBMzJYX0x4QV9TSElGVCwKKwkJCTE2LCBzdGEzMnhfbGltaXRlcl9hdHRhY2tfcmF0ZSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0YTMyeF9saW1pdGVyMV9yZWxlYXNlX3JhdGVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFNUQTMyWF9MMUFSLCBTVEEzMlhfTHhSX1NISUZULAorCQkJMTYsIHN0YTMyeF9saW1pdGVyX3JlbGVhc2VfcmF0ZSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0YTMyeF9saW1pdGVyMl9yZWxlYXNlX3JhdGVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFNUQTMyWF9MMkFSLCBTVEEzMlhfTHhSX1NISUZULAorCQkJMTYsIHN0YTMyeF9saW1pdGVyX3JlbGVhc2VfcmF0ZSk7CisKKy8qIGJ5dGUgYXJyYXkgY29udHJvbHMgZm9yIHNldHRpbmcgYmlxdWFkLCBtaXhlciwgc2NhbGluZyBjb2VmZmljaWVudHM7CisgKiBmb3IgYmlxdWFkcyBhbGwgZml2ZSBjb2VmZmljaWVudHMgbmVlZCB0byBiZSBzZXQgaW4gb25lIGdvLAorICogbWl4ZXIgYW5kIHByZS9wb3N0c2NhbGUgY29lZnMgY2FuIGJlIHNldCBpbmRpdmlkdWFsbHk7CisgKiBlYWNoIGNvZWYgaXMgMjRiaXQsIHRoZSBieXRlcyBhcmUgb3JkZXJlZCBpbiB0aGUgc2FtZSB3YXkKKyAqIGFzIGdpdmVuIGluIHRoZSBTVEEzMnggZGF0YSBzaGVldCAoYmlnIGVuZGlhbjsgYjEsIGIyLCBhMSwgYTIsIGIwKQorICovCisKK3N0YXRpYyBpbnQgc3RhMzJ4X2NvZWZmaWNpZW50X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlpbnQgbnVtY29lZiA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2OworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CWVRFUzsKKwl1aW5mby0+Y291bnQgPSAzICogbnVtY29lZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGEzMnhfY29lZmZpY2llbnRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBudW1jb2VmID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTY7CisJaW50IGluZGV4ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7CisJdW5zaWduZWQgaW50IGNmdWQ7CisJaW50IGk7CisKKwkvKiBwcmVzZXJ2ZSByZXNlcnZlZCBiaXRzIGluIFNUQTMyWF9DRlVEICovCisJY2Z1ZCA9IHNuZF9zb2NfcmVhZChjb2RlYywgU1RBMzJYX0NGVUQpICYgMHhmMDsKKwkvKiBjaGlwIGRvY3VtZW50YXRpb24gZG9lcyBub3Qgc2F5IGlmIHRoZSBiaXRzIGFyZSBzZWxmIGNsZWFyaW5nLAorCSAqIHNvIGRvIGl0IGV4cGxpY2l0bHkgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ0ZVRCwgY2Z1ZCk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ0ZBRERSMiwgaW5kZXgpOworCWlmIChudW1jb2VmID09IDEpCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFNUQTMyWF9DRlVELCBjZnVkIHwgMHgwNCk7CisJZWxzZSBpZiAobnVtY29lZiA9PSA1KQorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ0ZVRCwgY2Z1ZCB8IDB4MDgpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJZm9yIChpID0gMDsgaSA8IDMgKiBudW1jb2VmOyBpKyspCisJCXVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhW2ldID0KKwkJCXNuZF9zb2NfcmVhZChjb2RlYywgU1RBMzJYX0IxQ0YxICsgaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGEzMnhfY29lZmZpY2llbnRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBudW1jb2VmID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTY7CisJaW50IGluZGV4ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7CisJdW5zaWduZWQgaW50IGNmdWQ7CisJaW50IGk7CisKKwkvKiBwcmVzZXJ2ZSByZXNlcnZlZCBiaXRzIGluIFNUQTMyWF9DRlVEICovCisJY2Z1ZCA9IHNuZF9zb2NfcmVhZChjb2RlYywgU1RBMzJYX0NGVUQpICYgMHhmMDsKKwkvKiBjaGlwIGRvY3VtZW50YXRpb24gZG9lcyBub3Qgc2F5IGlmIHRoZSBiaXRzIGFyZSBzZWxmIGNsZWFyaW5nLAorCSAqIHNvIGRvIGl0IGV4cGxpY2l0bHkgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ0ZVRCwgY2Z1ZCk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ0ZBRERSMiwgaW5kZXgpOworCWZvciAoaSA9IDA7IGkgPCAzICogbnVtY29lZjsgaSsrKQorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBTVEEzMlhfQjFDRjEgKyBpLAorCQkJICAgICAgdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGFbaV0pOworCWlmIChudW1jb2VmID09IDEpCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFNUQTMyWF9DRlVELCBjZnVkIHwgMHgwMSk7CisJZWxzZSBpZiAobnVtY29lZiA9PSA1KQorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ0ZVRCwgY2Z1ZCB8IDB4MDIpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBTSU5HTEVfQ09FRih4bmFtZSwgaW5kZXgpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHN0YTMyeF9jb2VmZmljaWVudF9pbmZvLCBcCisJLmdldCA9IHN0YTMyeF9jb2VmZmljaWVudF9nZXQsXAorCS5wdXQgPSBzdGEzMnhfY29lZmZpY2llbnRfcHV0LCBcCisJLnByaXZhdGVfdmFsdWUgPSBpbmRleCB8ICgxIDw8IDE2KSB9CisKKyNkZWZpbmUgQklRVUFEX0NPRUZTKHhuYW1lLCBpbmRleCkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAorCS5pbmZvID0gc3RhMzJ4X2NvZWZmaWNpZW50X2luZm8sIFwKKwkuZ2V0ID0gc3RhMzJ4X2NvZWZmaWNpZW50X2dldCxcCisJLnB1dCA9IHN0YTMyeF9jb2VmZmljaWVudF9wdXQsIFwKKwkucHJpdmF0ZV92YWx1ZSA9IGluZGV4IHwgKDUgPDwgMTYpIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN0YTMyeF9zbmRfY29udHJvbHNbXSA9IHsKK1NPQ19TSU5HTEVfVExWKCJNYXN0ZXIgVm9sdW1lIiwgU1RBMzJYX01WT0wsIDAsIDB4ZmYsIDEsIG12b2xfdGx2KSwKK1NPQ19TSU5HTEUoIk1hc3RlciBTd2l0Y2giLCBTVEEzMlhfTU1VVEUsIDAsIDEsIDEpLAorU09DX1NJTkdMRSgiQ2gxIFN3aXRjaCIsIFNUQTMyWF9NTVVURSwgMSwgMSwgMSksCitTT0NfU0lOR0xFKCJDaDIgU3dpdGNoIiwgU1RBMzJYX01NVVRFLCAyLCAxLCAxKSwKK1NPQ19TSU5HTEUoIkNoMyBTd2l0Y2giLCBTVEEzMlhfTU1VVEUsIDMsIDEsIDEpLAorU09DX1NJTkdMRV9UTFYoIkNoMSBWb2x1bWUiLCBTVEEzMlhfQzFWT0wsIDAsIDB4ZmYsIDEsIGNodm9sX3RsdiksCitTT0NfU0lOR0xFX1RMVigiQ2gyIFZvbHVtZSIsIFNUQTMyWF9DMlZPTCwgMCwgMHhmZiwgMSwgY2h2b2xfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJDaDMgVm9sdW1lIiwgU1RBMzJYX0MzVk9MLCAwLCAweGZmLCAxLCBjaHZvbF90bHYpLAorU09DX1NJTkdMRSgiRGUtZW1waGFzaXMgRmlsdGVyIFN3aXRjaCIsIFNUQTMyWF9DT05GRCwgU1RBMzJYX0NPTkZEX0RFTVBfU0hJRlQsIDEsIDApLAorU09DX0VOVU0oIkNvbXByZXNzb3IvTGltaXRlciBTd2l0Y2giLCBzdGEzMnhfZHJjX2FjX2VudW0pLAorU09DX1NJTkdMRSgiTWlhbWkgTW9kZSBTd2l0Y2giLCBTVEEzMlhfQ09ORkQsIFNUQTMyWF9DT05GRF9NTUVfU0hJRlQsIDEsIDApLAorU09DX1NJTkdMRSgiWmVybyBDcm9zcyBTd2l0Y2giLCBTVEEzMlhfQ09ORkUsIFNUQTMyWF9DT05GRV9aQ0VfU0hJRlQsIDEsIDApLAorU09DX1NJTkdMRSgiU29mdCBSYW1wIFN3aXRjaCIsIFNUQTMyWF9DT05GRSwgU1RBMzJYX0NPTkZFX1NWRV9TSElGVCwgMSwgMCksCitTT0NfU0lOR0xFKCJBdXRvLU11dGUgU3dpdGNoIiwgU1RBMzJYX0NPTkZGLCBTVEEzMlhfQ09ORkZfSURFX1NISUZULCAxLCAwKSwKK1NPQ19FTlVNKCJBdXRvbW9kZSBFUSIsIHN0YTMyeF9hdXRvX2VxX2VudW0pLAorU09DX0VOVU0oIkF1dG9tb2RlIEdDIiwgc3RhMzJ4X2F1dG9fZ2NfZW51bSksCitTT0NfRU5VTSgiQXV0b21vZGUgWE8iLCBzdGEzMnhfYXV0b194b19lbnVtKSwKK1NPQ19FTlVNKCJQcmVzZXQgRVEiLCBzdGEzMnhfcHJlc2V0X2VxX2VudW0pLAorU09DX1NJTkdMRSgiQ2gxIFRvbmUgQ29udHJvbCBCeXBhc3MgU3dpdGNoIiwgU1RBMzJYX0MxQ0ZHLCBTVEEzMlhfQ3hDRkdfVENCX1NISUZULCAxLCAwKSwKK1NPQ19TSU5HTEUoIkNoMiBUb25lIENvbnRyb2wgQnlwYXNzIFN3aXRjaCIsIFNUQTMyWF9DMkNGRywgU1RBMzJYX0N4Q0ZHX1RDQl9TSElGVCwgMSwgMCksCitTT0NfU0lOR0xFKCJDaDEgRVEgQnlwYXNzIFN3aXRjaCIsIFNUQTMyWF9DMUNGRywgU1RBMzJYX0N4Q0ZHX0VRQlBfU0hJRlQsIDEsIDApLAorU09DX1NJTkdMRSgiQ2gyIEVRIEJ5cGFzcyBTd2l0Y2giLCBTVEEzMlhfQzJDRkcsIFNUQTMyWF9DeENGR19FUUJQX1NISUZULCAxLCAwKSwKK1NPQ19TSU5HTEUoIkNoMSBNYXN0ZXIgVm9sdW1lIEJ5cGFzcyBTd2l0Y2giLCBTVEEzMlhfQzFDRkcsIFNUQTMyWF9DeENGR19WQlBfU0hJRlQsIDEsIDApLAorU09DX1NJTkdMRSgiQ2gyIE1hc3RlciBWb2x1bWUgQnlwYXNzIFN3aXRjaCIsIFNUQTMyWF9DMUNGRywgU1RBMzJYX0N4Q0ZHX1ZCUF9TSElGVCwgMSwgMCksCitTT0NfU0lOR0xFKCJDaDMgTWFzdGVyIFZvbHVtZSBCeXBhc3MgU3dpdGNoIiwgU1RBMzJYX0MxQ0ZHLCBTVEEzMlhfQ3hDRkdfVkJQX1NISUZULCAxLCAwKSwKK1NPQ19FTlVNKCJDaDEgTGltaXRlciBTZWxlY3QiLCBzdGEzMnhfbGltaXRlcl9jaDFfZW51bSksCitTT0NfRU5VTSgiQ2gyIExpbWl0ZXIgU2VsZWN0Iiwgc3RhMzJ4X2xpbWl0ZXJfY2gyX2VudW0pLAorU09DX0VOVU0oIkNoMyBMaW1pdGVyIFNlbGVjdCIsIHN0YTMyeF9saW1pdGVyX2NoM19lbnVtKSwKK1NPQ19TSU5HTEVfVExWKCJCYXNzIFRvbmUgQ29udHJvbCIsIFNUQTMyWF9UT05FLCBTVEEzMlhfVE9ORV9CVENfU0hJRlQsIDE1LCAwLCB0b25lX3RsdiksCitTT0NfU0lOR0xFX1RMVigiVHJlYmxlIFRvbmUgQ29udHJvbCIsIFNUQTMyWF9UT05FLCBTVEEzMlhfVE9ORV9UVENfU0hJRlQsIDE1LCAwLCB0b25lX3RsdiksCitTT0NfRU5VTSgiTGltaXRlcjEgQXR0YWNrIFJhdGUgKGRCL21zKSIsIHN0YTMyeF9saW1pdGVyMV9hdHRhY2tfcmF0ZV9lbnVtKSwKK1NPQ19FTlVNKCJMaW1pdGVyMiBBdHRhY2sgUmF0ZSAoZEIvbXMpIiwgc3RhMzJ4X2xpbWl0ZXIyX2F0dGFja19yYXRlX2VudW0pLAorU09DX0VOVU0oIkxpbWl0ZXIxIFJlbGVhc2UgUmF0ZSAoZEIvbXMpIiwgc3RhMzJ4X2xpbWl0ZXIxX3JlbGVhc2VfcmF0ZV9lbnVtKSwKK1NPQ19FTlVNKCJMaW1pdGVyMiBSZWxlYXNlIFJhdGUgKGRCL21zKSIsIHN0YTMyeF9saW1pdGVyMV9yZWxlYXNlX3JhdGVfZW51bSksCisKKy8qIGRlcGVuZGluZyBvbiBtb2RlLCB0aGUgYXR0YWNrL3JlbGVhc2UgdGhyZXNob2xkcyBoYXZlCisgKiB0d28gZGlmZmVyZW50IGVudW0gZGVmaW5pdGlvbnM7IHByb3ZpZGUgYm90aAorICovCitTT0NfU0lOR0xFX1RMVigiTGltaXRlcjEgQXR0YWNrIFRocmVzaG9sZCAoQUMgTW9kZSkiLCBTVEEzMlhfTDFBVFJULCBTVEEzMlhfTHhBX1NISUZULAorCSAgICAgICAxNiwgMCwgc3RhMzJ4X2xpbWl0ZXJfYWNfYXR0YWNrX3RsdiksCitTT0NfU0lOR0xFX1RMVigiTGltaXRlcjIgQXR0YWNrIFRocmVzaG9sZCAoQUMgTW9kZSkiLCBTVEEzMlhfTDJBVFJULCBTVEEzMlhfTHhBX1NISUZULAorCSAgICAgICAxNiwgMCwgc3RhMzJ4X2xpbWl0ZXJfYWNfYXR0YWNrX3RsdiksCitTT0NfU0lOR0xFX1RMVigiTGltaXRlcjEgUmVsZWFzZSBUaHJlc2hvbGQgKEFDIE1vZGUpIiwgU1RBMzJYX0wxQVRSVCwgU1RBMzJYX0x4Ul9TSElGVCwKKwkgICAgICAgMTYsIDAsIHN0YTMyeF9saW1pdGVyX2FjX3JlbGVhc2VfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJMaW1pdGVyMiBSZWxlYXNlIFRocmVzaG9sZCAoQUMgTW9kZSkiLCBTVEEzMlhfTDJBVFJULCBTVEEzMlhfTHhSX1NISUZULAorCSAgICAgICAxNiwgMCwgc3RhMzJ4X2xpbWl0ZXJfYWNfcmVsZWFzZV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkxpbWl0ZXIxIEF0dGFjayBUaHJlc2hvbGQgKERSQyBNb2RlKSIsIFNUQTMyWF9MMUFUUlQsIFNUQTMyWF9MeEFfU0hJRlQsCisJICAgICAgIDE2LCAwLCBzdGEzMnhfbGltaXRlcl9kcmNfYXR0YWNrX3RsdiksCitTT0NfU0lOR0xFX1RMVigiTGltaXRlcjIgQXR0YWNrIFRocmVzaG9sZCAoRFJDIE1vZGUpIiwgU1RBMzJYX0wyQVRSVCwgU1RBMzJYX0x4QV9TSElGVCwKKwkgICAgICAgMTYsIDAsIHN0YTMyeF9saW1pdGVyX2RyY19hdHRhY2tfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJMaW1pdGVyMSBSZWxlYXNlIFRocmVzaG9sZCAoRFJDIE1vZGUpIiwgU1RBMzJYX0wxQVRSVCwgU1RBMzJYX0x4Ul9TSElGVCwKKwkgICAgICAgMTYsIDAsIHN0YTMyeF9saW1pdGVyX2RyY19yZWxlYXNlX3RsdiksCitTT0NfU0lOR0xFX1RMVigiTGltaXRlcjIgUmVsZWFzZSBUaHJlc2hvbGQgKERSQyBNb2RlKSIsIFNUQTMyWF9MMkFUUlQsIFNUQTMyWF9MeFJfU0hJRlQsCisJICAgICAgIDE2LCAwLCBzdGEzMnhfbGltaXRlcl9kcmNfcmVsZWFzZV90bHYpLAorCitCSVFVQURfQ09FRlMoIkNoMSAtIEJpcXVhZCAxIiwgMCksCitCSVFVQURfQ09FRlMoIkNoMSAtIEJpcXVhZCAyIiwgNSksCitCSVFVQURfQ09FRlMoIkNoMSAtIEJpcXVhZCAzIiwgMTApLAorQklRVUFEX0NPRUZTKCJDaDEgLSBCaXF1YWQgNCIsIDE1KSwKK0JJUVVBRF9DT0VGUygiQ2gyIC0gQmlxdWFkIDEiLCAyMCksCitCSVFVQURfQ09FRlMoIkNoMiAtIEJpcXVhZCAyIiwgMjUpLAorQklRVUFEX0NPRUZTKCJDaDIgLSBCaXF1YWQgMyIsIDMwKSwKK0JJUVVBRF9DT0VGUygiQ2gyIC0gQmlxdWFkIDQiLCAzNSksCitCSVFVQURfQ09FRlMoIkhpZ2gtcGFzcyIsIDQwKSwKK0JJUVVBRF9DT0VGUygiTG93LXBhc3MiLCA0NSksCitTSU5HTEVfQ09FRigiQ2gxIC0gUHJlc2NhbGUiLCA1MCksCitTSU5HTEVfQ09FRigiQ2gyIC0gUHJlc2NhbGUiLCA1MSksCitTSU5HTEVfQ09FRigiQ2gxIC0gUG9zdHNjYWxlIiwgNTIpLAorU0lOR0xFX0NPRUYoIkNoMiAtIFBvc3RzY2FsZSIsIDUzKSwKK1NJTkdMRV9DT0VGKCJDaDMgLSBQb3N0c2NhbGUiLCA1NCksCitTSU5HTEVfQ09FRigiVGhlcm1hbCB3YXJuaW5nIC0gUG9zdHNjYWxlIiwgNTUpLAorU0lOR0xFX0NPRUYoIkNoMSAtIE1peCAxIiwgNTYpLAorU0lOR0xFX0NPRUYoIkNoMSAtIE1peCAyIiwgNTcpLAorU0lOR0xFX0NPRUYoIkNoMiAtIE1peCAxIiwgNTgpLAorU0lOR0xFX0NPRUYoIkNoMiAtIE1peCAyIiwgNTkpLAorU0lOR0xFX0NPRUYoIkNoMyAtIE1peCAxIiwgNjApLAorU0lOR0xFX0NPRUYoIkNoMyAtIE1peCAyIiwgNjEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHN0YTMyeF9kYXBtX3dpZGdldHNbXSA9IHsKK1NORF9TT0NfREFQTV9EQUMoIkRBQyIsICJQbGF5YmFjayIsIFNORF9TT0NfTk9QTSwgMCwgMCksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJMRUZUIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJSSUdIVCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiU1VCIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBzdGEzMnhfZGFwbV9yb3V0ZXNbXSA9IHsKKwl7ICJMRUZUIiwgTlVMTCwgIkRBQyIgfSwKKwl7ICJSSUdIVCIsIE5VTEwsICJEQUMiIH0sCisJeyAiU1VCIiwgTlVMTCwgIkRBQyIgfSwKK307CisKKy8qIE1DTEsgaW50ZXJwb2xhdGlvbiByYXRpbyBwZXIgZnMgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWludCBmczsKKwlpbnQgaXI7Cit9IGludGVycG9sYXRpb25fcmF0aW9zW10gPSB7CisJeyAzMjAwMCwgMCB9LAorCXsgNDQxMDAsIDAgfSwKKwl7IDQ4MDAwLCAwIH0sCisJeyA4ODIwMCwgMSB9LAorCXsgOTYwMDAsIDEgfSwKKwl7IDE3NjQwMCwgMiB9LAorCXsgMTkyMDAwLCAyIH0sCit9OworCisvKiBNQ0xLIHRvIGZzIGNsb2NrIHJhdGlvcyAqLworc3RhdGljIHN0cnVjdCB7CisJaW50IHJhdGlvOworCWludCBtY3M7Cit9IG1jbGtfcmF0aW9zWzNdWzddID0geworCXsgeyA3NjgsIDAgfSwgeyA1MTIsIDEgfSwgeyAzODQsIDIgfSwgeyAyNTYsIDMgfSwKKwkgIHsgMTI4LCA0IH0sIHsgNTc2LCA1IH0sIHsgMCwgMCB9IH0sCisJeyB7IDM4NCwgMiB9LCB7IDI1NiwgMyB9LCB7IDE5MiwgNCB9LCB7IDEyOCwgNSB9LCB7NjQsIDAgfSwgeyAwLCAwIH0gfSwKKwl7IHsgMzg0LCAyIH0sIHsgMjU2LCAzIH0sIHsgMTkyLCA0IH0sIHsgMTI4LCA1IH0sIHs2NCwgMCB9LCB7IDAsIDAgfSB9LAorfTsKKworCisvKioKKyAqIHN0YTMyeF9zZXRfZGFpX3N5c2NsayAtIGNvbmZpZ3VyZSBNQ0xLCisgKiBAY29kZWNfZGFpOiB0aGUgY29kZWMgREFJCisgKiBAY2xrX2lkOiB0aGUgY2xvY2sgSUQgKGlnbm9yZWQpCisgKiBAZnJlcTogdGhlIE1DTEsgaW5wdXQgZnJlcXVlbmN5CisgKiBAZGlyOiB0aGUgY2xvY2sgZGlyZWN0aW9uIChpZ25vcmVkKQorICoKKyAqIFRoZSB2YWx1ZSBvZiBNQ0xLIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHNhbXBsZSByYXRlcyBhcmUgc3VwcG9ydGVkCisgKiBieSB0aGUgU1RBMzJYLCBiYXNlZCBvbiB0aGUgbWNsa19yYXRpb3MgdGFibGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBieSB0aGUgbWFjaGluZSBkcml2ZXIncyAnc3RhcnR1cCcgZnVuY3Rpb24sCisgKiBvdGhlcndpc2UgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUgaW4KKyAqIHRpbWUgZm9yIEFMU0EuCisgKgorICogRm9yIHNldHVwcyB3aXRoIHZhcmlhYmxlIE1DTEtzLCBwYXNzIDAgYXMgJ2ZyZXEnIGFyZ3VtZW50LiBUaGlzIHdpbGwgY2F1c2UKKyAqIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgc2FtcGxlIHJhdGVzIHRvIGJlIGVuYWJsZWQuIENhbGwgaXQgYWdhaW4gd2l0aCBhCisgKiBwcm9wZXIgdmFsdWUgc2V0IG9uZSB0aGUgZXh0ZXJuYWwgY2xvY2sgaXMgc2V0IChtb3N0IHByb2JhYmx5IHlvdSB3b3VsZCBkbworICogdGhhdCBmcm9tIGEgbWFjaGluZSdzIGRyaXZlciAnaHdfcGFyYW0nIGhvb2suCisgKi8KK3N0YXRpYyBpbnQgc3RhMzJ4X3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXN0cnVjdCBzdGEzMnhfcHJpdiAqc3RhMzJ4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGksIGosIGlyLCBmczsKKwl1bnNpZ25lZCBpbnQgcmF0ZXMgPSAwOworCXVuc2lnbmVkIGludCByYXRlX21pbiA9IC0xOworCXVuc2lnbmVkIGludCByYXRlX21heCA9IDA7CisKKwlwcl9kZWJ1ZygibWNsaz0ldVxuIiwgZnJlcSk7CisJc3RhMzJ4LT5tY2xrID0gZnJlcTsKKworCWlmIChzdGEzMngtPm1jbGspIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50ZXJwb2xhdGlvbl9yYXRpb3MpOyBpKyspIHsKKwkJCWlyID0gaW50ZXJwb2xhdGlvbl9yYXRpb3NbaV0uaXI7CisJCQlmcyA9IGludGVycG9sYXRpb25fcmF0aW9zW2ldLmZzOworCQkJZm9yIChqID0gMDsgbWNsa19yYXRpb3NbaXJdW2pdLnJhdGlvOyBqKyspIHsKKwkJCQlpZiAobWNsa19yYXRpb3NbaXJdW2pdLnJhdGlvICogZnMgPT0gZnJlcSkgeworCQkJCQlyYXRlcyB8PSBzbmRfcGNtX3JhdGVfdG9fcmF0ZV9iaXQoZnMpOworCQkJCQlpZiAoZnMgPCByYXRlX21pbikKKwkJCQkJCXJhdGVfbWluID0gZnM7CisJCQkJCWlmIChmcyA+IHJhdGVfbWF4KQorCQkJCQkJcmF0ZV9tYXggPSBmczsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogRklYTUU6IHNvYyBzaG91bGQgc3VwcG9ydCBhIHJhdGUgbGlzdCAqLworCQlyYXRlcyAmPSB+U05EUlZfUENNX1JBVEVfS05PVDsKKworCQlpZiAoIXJhdGVzKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJjb3VsZCBub3QgZmluZCBhIHZhbGlkIHNhbXBsZSByYXRlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJLyogZW5hYmxlIGFsbCBwb3NzaWJsZSByYXRlcyAqLworCQlyYXRlcyA9IFNUQTMyWF9SQVRFUzsKKwkJcmF0ZV9taW4gPSAzMjAwMDsKKwkJcmF0ZV9tYXggPSAxOTIwMDA7CisJfQorCisJY29kZWNfZGFpLT5kcml2ZXItPnBsYXliYWNrLnJhdGVzID0gcmF0ZXM7CisJY29kZWNfZGFpLT5kcml2ZXItPnBsYXliYWNrLnJhdGVfbWluID0gcmF0ZV9taW47CisJY29kZWNfZGFpLT5kcml2ZXItPnBsYXliYWNrLnJhdGVfbWF4ID0gcmF0ZV9tYXg7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3RhMzJ4X3NldF9kYWlfZm10IC0gY29uZmlndXJlIHRoZSBjb2RlYyBmb3IgdGhlIHNlbGVjdGVkIGF1ZGlvIGZvcm1hdAorICogQGNvZGVjX2RhaTogdGhlIGNvZGVjIERBSQorICogQGZtdDogYSBTTkRfU09DX0RBSUZNVF94IHZhbHVlIGluZGljYXRpbmcgdGhlIGRhdGEgZm9ybWF0CisgKgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGJpdG1hc2sgb2YgU05EX1NPQ19EQUlGTVRfeCBiaXRzIGFuZCBwcm9ncmFtcyB0aGUKKyAqIGNvZGVjIGFjY29yZGluZ2x5LgorICovCitzdGF0aWMgaW50IHN0YTMyeF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBmbXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgc3RhMzJ4X3ByaXYgKnN0YTMyeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXU4IGNvbmZiID0gc25kX3NvY19yZWFkKGNvZGVjLCBTVEEzMlhfQ09ORkIpOworCisJcHJfZGVidWcoIlxuIik7CisJY29uZmIgJj0gfihTVEEzMlhfQ09ORkJfQzFJTSB8IFNUQTMyWF9DT05GQl9DMklNKTsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCXN0YTMyeC0+Zm9ybWF0ID0gZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQljb25mYiB8PSBTVEEzMlhfQ09ORkJfQzJJTTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9JRjoKKwkJY29uZmIgfD0gU1RBMzJYX0NPTkZCX0MxSU07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFNUQTMyWF9DT05GQiwgY29uZmIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHN0YTMyeF9od19wYXJhbXMgLSBwcm9ncmFtIHRoZSBTVEEzMlggd2l0aCB0aGUgZ2l2ZW4gaGFyZHdhcmUgcGFyYW1ldGVycy4KKyAqIEBzdWJzdHJlYW06IHRoZSBhdWRpbyBzdHJlYW0KKyAqIEBwYXJhbXM6IHRoZSBoYXJkd2FyZSBwYXJhbWV0ZXJzIHRvIHNldAorICogQGRhaTogdGhlIFNPQyBEQUkgKGlnbm9yZWQpCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm9ncmFtcyB0aGUgaGFyZHdhcmUgd2l0aCB0aGUgdmFsdWVzIHByb3ZpZGVkLgorICogU3BlY2lmaWNhbGx5LCB0aGUgc2FtcGxlIHJhdGUgYW5kIHRoZSBkYXRhIGZvcm1hdC4KKyAqLworc3RhdGljIGludCBzdGEzMnhfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzdGEzMnhfcHJpdiAqc3RhMzJ4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHJhdGU7CisJaW50IGksIG1jcyA9IC0xLCBpciA9IC0xOworCXU4IGNvbmZhLCBjb25mYjsKKworCXJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCXByX2RlYnVnKCJyYXRlOiAldVxuIiwgcmF0ZSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50ZXJwb2xhdGlvbl9yYXRpb3MpOyBpKyspCisJCWlmIChpbnRlcnBvbGF0aW9uX3JhdGlvc1tpXS5mcyA9PSByYXRlKQorCQkJaXIgPSBpbnRlcnBvbGF0aW9uX3JhdGlvc1tpXS5pcjsKKwlpZiAoaXIgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBtY2xrX3JhdGlvc1tpcl1baV0ucmF0aW87IGkrKykKKwkJaWYgKG1jbGtfcmF0aW9zW2lyXVtpXS5yYXRpbyAqIHJhdGUgPT0gc3RhMzJ4LT5tY2xrKQorCQkJbWNzID0gbWNsa19yYXRpb3NbaXJdW2ldLm1jczsKKwlpZiAobWNzIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb25mYSA9IHNuZF9zb2NfcmVhZChjb2RlYywgU1RBMzJYX0NPTkZBKTsKKwljb25mYSAmPSB+KFNUQTMyWF9DT05GQV9NQ1NfTUFTSyB8IFNUQTMyWF9DT05GQV9JUl9NQVNLKTsKKwljb25mYSB8PSAoaXIgPDwgU1RBMzJYX0NPTkZBX0lSX1NISUZUKSB8IChtY3MgPDwgU1RBMzJYX0NPTkZBX01DU19TSElGVCk7CisKKwljb25mYiA9IHNuZF9zb2NfcmVhZChjb2RlYywgU1RBMzJYX0NPTkZCKTsKKwljb25mYiAmPSB+KFNUQTMyWF9DT05GQl9TQUlfTUFTSyB8IFNUQTMyWF9DT05GQl9TQUlGQik7CisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfQkU6CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zQkU6CisJCXByX2RlYnVnKCIyNGJpdFxuIik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9CRToKKwkJcHJfZGVidWcoIjI0Yml0IG9yIDMyYml0XG4iKTsKKwkJc3dpdGNoIChzdGEzMngtPmZvcm1hdCkgeworCQljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJCWNvbmZiIHw9IDB4MDsKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJCWNvbmZiIHw9IDB4MTsKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCQljb25mYiB8PSAweDI7CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjBfM0xFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjBfM0JFOgorCQlwcl9kZWJ1ZygiMjBiaXRcbiIpOworCQlzd2l0Y2ggKHN0YTMyeC0+Zm9ybWF0KSB7CisJCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgorCQkJY29uZmIgfD0gMHg0OworCQkJYnJlYWs7CisJCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQkJY29uZmIgfD0gMHg1OworCQkJYnJlYWs7CisJCWNhc2UgU05EX1NPQ19EQUlGTVRfUklHSFRfSjoKKwkJCWNvbmZiIHw9IDB4NjsKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxOF8zTEU6CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxOF8zQkU6CisJCXByX2RlYnVnKCIxOGJpdFxuIik7CisJCXN3aXRjaCAoc3RhMzJ4LT5mb3JtYXQpIHsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCQljb25mYiB8PSAweDg7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCQljb25mYiB8PSAweDk7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQkJY29uZmIgfD0gMHhhOworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfQkU6CisJCXByX2RlYnVnKCIxNmJpdFxuIik7CisJCXN3aXRjaCAoc3RhMzJ4LT5mb3JtYXQpIHsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCQljb25mYiB8PSAweDA7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCQljb25mYiB8PSAweGQ7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQkJY29uZmIgfD0gMHhlOworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ09ORkEsIGNvbmZhKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ09ORkIsIGNvbmZiKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzdGEzMnhfc2V0X2JpYXNfbGV2ZWwgLSBEQVBNIGNhbGxiYWNrCisgKiBAY29kZWM6IHRoZSBjb2RlYyBkZXZpY2UKKyAqIEBsZXZlbDogREFQTSBwb3dlciBsZXZlbAorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IEFMU0EgdG8gcHV0IHRoZSBjb2RlYyBpbnRvIGxvdyBwb3dlciBtb2RlCisgKiBvciB0byB3YWtlIGl0IHVwLiAgSWYgdGhlIGNvZGVjIGlzIHBvd2VyZWQgb2ZmIGNvbXBsZXRlbHkKKyAqIGFsbCByZWdpc3RlcnMgbXVzdCBiZSByZXN0b3JlZCBhZnRlciBwb3dlciBvbi4KKyAqLworc3RhdGljIGludCBzdGEzMnhfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzdGEzMnhfcHJpdiAqc3RhMzJ4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlwcl9kZWJ1ZygibGV2ZWwgPSAlZFxuIiwgbGV2ZWwpOworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQkvKiBGdWxsIHBvd2VyIG9uICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNUQTMyWF9DT05GRiwKKwkJCQkgICAgU1RBMzJYX0NPTkZGX1BXRE4gfCBTVEEzMlhfQ09ORkZfRUFQRCwKKwkJCQkgICAgU1RBMzJYX0NPTkZGX1BXRE4gfCBTVEEzMlhfQ09ORkZfRUFQRCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUoc3RhMzJ4LT5zdXBwbGllcyksCisJCQkJCQkgICAgc3RhMzJ4LT5zdXBwbGllcyk7CisJCQlpZiAocmV0ICE9IDApIHsKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCQl9CisKKwkJLyogUG93ZXIgdXAgdG8gbXV0ZSAqLworCQkvKiBGSVhNRSAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTVEEzMlhfQ09ORkYsCisJCQkJICAgIFNUQTMyWF9DT05GRl9QV0ROIHwgU1RBMzJYX0NPTkZGX0VBUEQsCisJCQkJICAgIFNUQTMyWF9DT05GRl9QV0ROIHwgU1RBMzJYX0NPTkZGX0VBUEQpOworCisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQkvKiBUaGUgY2hpcCBydW5zIHRocm91Z2ggdGhlIHBvd2VyIGRvd24gc2VxdWVuY2UgZm9yIHVzLiAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTVEEzMlhfQ09ORkYsCisJCQkJICAgIFNUQTMyWF9DT05GRl9QV0ROIHwgU1RBMzJYX0NPTkZGX0VBUEQsCisJCQkJICAgIFNUQTMyWF9DT05GRl9QV0ROKTsKKwkJbXNsZWVwKDMwMCk7CisKKwkJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHN0YTMyeC0+c3VwcGxpZXMpLAorCQkJCSAgICAgICBzdGEzMngtPnN1cHBsaWVzKTsKKwkJYnJlYWs7CisJfQorCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgc3RhMzJ4X2RhaV9vcHMgPSB7CisJLmh3X3BhcmFtcwk9IHN0YTMyeF9od19wYXJhbXMsCisJLnNldF9zeXNjbGsJPSBzdGEzMnhfc2V0X2RhaV9zeXNjbGssCisJLnNldF9mbXQJPSBzdGEzMnhfc2V0X2RhaV9mbXQsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzdGEzMnhfZGFpID0geworCS5uYW1lID0gIlNUQTMyWCIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNUQTMyWF9SQVRFUywKKwkJLmZvcm1hdHMgPSBTVEEzMlhfRk9STUFUUywKKwl9LAorCS5vcHMgPSAmc3RhMzJ4X2RhaV9vcHMsCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHN0YTMyeF9zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0YTMyeF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhMzJ4X3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RhMzJ4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBzdGEzMnhfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHN0YTMyeF9yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgc3RhMzJ4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc3RhMzJ4X3ByaXYgKnN0YTMyeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBpLCByZXQgPSAwOworCisJc3RhMzJ4LT5jb2RlYyA9IGNvZGVjOworCisJLyogcmVndWxhdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YTMyeC0+c3VwcGxpZXMpOyBpKyspCisJCXN0YTMyeC0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gc3RhMzJ4X3N1cHBseV9uYW1lc1tpXTsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldChjb2RlYy0+ZGV2LCBBUlJBWV9TSVpFKHN0YTMyeC0+c3VwcGxpZXMpLAorCQkJCSBzdGEzMngtPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3Qgc3VwcGxpZXM6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShzdGEzMngtPnN1cHBsaWVzKSwKKwkJCQkgICAgc3RhMzJ4LT5zdXBwbGllcyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgc3VwcGxpZXM6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9nZXQ7CisJfQorCisJLyogVGVsbCBBU29DIHdoYXQga2luZCBvZiBJL08gdG8gdXNlIHRvIHJlYWQgdGhlIHJlZ2lzdGVycy4gIEFTb0Mgd2lsbAorCSAqIHRoZW4gZG8gdGhlIEkyQyB0cmFuc2FjdGlvbnMgaXRzZWxmLgorCSAqLworCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX0kyQyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjYWNoZSBJL08gKHJldD0laSlcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogcmVhZCByZWcgcmVzZXQgdmFsdWVzIGludG8gY2FjaGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU1RBMzJYX1JFR0lTVEVSX0NPVU5UOyBpKyspCisJCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIGksIHN0YTMyeF9yZWdzW2ldKTsKKworCS8qIHByZXNlcnZlIHJlc2V0IHZhbHVlcyBvZiByZXNlcnZlZCByZWdpc3RlciBiaXRzICovCisJc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX0NPTkZDLAorCQkJICAgIGNvZGVjLT5od19yZWFkKGNvZGVjLCBTVEEzMlhfQ09ORkMpKTsKKwlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ09ORkUsCisJCQkgICAgY29kZWMtPmh3X3JlYWQoY29kZWMsIFNUQTMyWF9DT05GRSkpOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIFNUQTMyWF9DT05GRiwKKwkJCSAgICBjb2RlYy0+aHdfcmVhZChjb2RlYywgU1RBMzJYX0NPTkZGKSk7CisJc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX01NVVRFLAorCQkJICAgIGNvZGVjLT5od19yZWFkKGNvZGVjLCBTVEEzMlhfTU1VVEUpKTsKKwlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfQVVUTzEsCisJCQkgICAgY29kZWMtPmh3X3JlYWQoY29kZWMsIFNUQTMyWF9BVVRPMSkpOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIFNUQTMyWF9BVVRPMywKKwkJCSAgICBjb2RlYy0+aHdfcmVhZChjb2RlYywgU1RBMzJYX0FVVE8zKSk7CisJc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX0MzQ0ZHLAorCQkJICAgIGNvZGVjLT5od19yZWFkKGNvZGVjLCBTVEEzMlhfQzNDRkcpKTsKKworCS8qIEZJWE1FIGVuYWJsZSB0aGVybWFsIHdhcm5pbmcgYWRqdXN0bWVudCBhbmQgcmVjb3ZlcnkgICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU1RBMzJYX0NPTkZBLAorCQkJICAgIFNUQTMyWF9DT05GQV9UV0FCIHwgU1RBMzJYX0NPTkZBX1RXUkIsIDApOworCisJLyogRklYTUUgc2VsZWN0IDIuMSBtb2RlICAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNUQTMyWF9DT05GRiwKKwkJCSAgICBTVEEzMlhfQ09ORkZfT0NGR19NQVNLLAorCQkJICAgIDEgPDwgU1RBMzJYX0NPTkZGX09DRkdfU0hJRlQpOworCisJLyogRklYTUUgY2hhbm5lbCB0byBvdXRwdXQgbWFwcGluZyAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNUQTMyWF9DMUNGRywKKwkJCSAgICBTVEEzMlhfQ3hDRkdfT01fTUFTSywKKwkJCSAgICAwIDw8IFNUQTMyWF9DeENGR19PTV9TSElGVCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU1RBMzJYX0MyQ0ZHLAorCQkJICAgIFNUQTMyWF9DeENGR19PTV9NQVNLLAorCQkJICAgIDEgPDwgU1RBMzJYX0N4Q0ZHX09NX1NISUZUKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTVEEzMlhfQzNDRkcsCisJCQkgICAgU1RBMzJYX0N4Q0ZHX09NX01BU0ssCisJCQkgICAgMiA8PCBTVEEzMlhfQ3hDRkdfT01fU0hJRlQpOworCisJc3RhMzJ4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisJLyogQmlhcyBsZXZlbCBjb25maWd1cmF0aW9uIHdpbGwgaGF2ZSBkb25lIGFuIGV4dHJhIGVuYWJsZSAqLworCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShzdGEzMngtPnN1cHBsaWVzKSwgc3RhMzJ4LT5zdXBwbGllcyk7CisKKwlyZXR1cm4gMDsKKworZXJyX2dldDoKKwlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUoc3RhMzJ4LT5zdXBwbGllcyksIHN0YTMyeC0+c3VwcGxpZXMpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3RhMzJ4X3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHN0YTMyeF9wcml2ICpzdGEzMnggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShzdGEzMngtPnN1cHBsaWVzKSwgc3RhMzJ4LT5zdXBwbGllcyk7CisJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHN0YTMyeC0+c3VwcGxpZXMpLCBzdGEzMngtPnN1cHBsaWVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YTMyeF9yZWdfaXNfdm9sYXRpbGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgU1RBMzJYX0NPTkZBIC4uLiBTVEEzMlhfTDJBVFJUOgorCWNhc2UgU1RBMzJYX01QQ0MxIC4uLiBTVEEzMlhfRkRSQzI6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzdGEzMnhfY29kZWMgPSB7CisJLnByb2JlID0JCXN0YTMyeF9wcm9iZSwKKwkucmVtb3ZlID0JCXN0YTMyeF9yZW1vdmUsCisJLnN1c3BlbmQgPQkJc3RhMzJ4X3N1c3BlbmQsCisJLnJlc3VtZSA9CQlzdGEzMnhfcmVzdW1lLAorCS5yZWdfY2FjaGVfc2l6ZSA9CVNUQTMyWF9SRUdJU1RFUl9DT1VOVCwKKwkucmVnX3dvcmRfc2l6ZSA9CXNpemVvZih1OCksCisJLnZvbGF0aWxlX3JlZ2lzdGVyID0Jc3RhMzJ4X3JlZ19pc192b2xhdGlsZSwKKwkuc2V0X2JpYXNfbGV2ZWwgPQlzdGEzMnhfc2V0X2JpYXNfbGV2ZWwsCisJLmNvbnRyb2xzID0JCXN0YTMyeF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9CQlBUlJBWV9TSVpFKHN0YTMyeF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPQkJc3RhMzJ4X2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9CUFSUkFZX1NJWkUoc3RhMzJ4X2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0JCXN0YTMyeF9kYXBtX3JvdXRlcywKKwkubnVtX2RhcG1fcm91dGVzID0JQVJSQVlfU0laRShzdGEzMnhfZGFwbV9yb3V0ZXMpLAorfTsKKworc3RhdGljIF9fZGV2aW5pdCBpbnQgc3RhMzJ4X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc3RhMzJ4X3ByaXYgKnN0YTMyeDsKKwlpbnQgcmV0OworCisJc3RhMzJ4ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN0YTMyeF9wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdGEzMngpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgc3RhMzJ4KTsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc3RhMzJ4X2NvZGVjLCAmc3RhMzJ4X2RhaSwgMSk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNvZGVjICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2RldmV4aXQgaW50IHN0YTMyeF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHN0YTMyeF9wcml2ICpzdGEzMnggPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzdGEzMngtPmNvZGVjOworCisJaWYgKGNvZGVjKQorCQlzdGEzMnhfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCisJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHN0YTMyeC0+c3VwcGxpZXMpLCBzdGEzMngtPnN1cHBsaWVzKTsKKworCWlmIChjb2RlYykgeworCQlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKKwkJc25kX3NvY19jb2RlY19zZXRfZHJ2ZGF0YShjb2RlYywgTlVMTCk7CisJfQorCisJa2ZyZWUoc3RhMzJ4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHN0YTMyeF9pMmNfaWRbXSA9IHsKKwl7ICJzdGEzMjYiLCAwIH0sCisJeyAic3RhMzI4IiwgMCB9LAorCXsgInN0YTMyOSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc3RhMzJ4X2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzdGEzMnhfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzdGEzMngiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9ICAgIHN0YTMyeF9pMmNfcHJvYmUsCisJLnJlbW92ZSA9ICAgX19kZXZleGl0X3Aoc3RhMzJ4X2kyY19yZW1vdmUpLAorCS5pZF90YWJsZSA9IHN0YTMyeF9pMmNfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzdGEzMnhfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmc3RhMzJ4X2kyY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoc3RhMzJ4X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc3RhMzJ4X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmc3RhMzJ4X2kyY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoc3RhMzJ4X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU1RBMzJYIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSm9oYW5uZXMgU3RlemVuYmFjaCA8anNAc2lnMjEubmV0PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguaCBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3ZWU1YQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzJ4LmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb2RlYyBkcml2ZXIgZm9yIFNUIFNUQTMyeCAyLjEtY2hhbm5lbCBoaWdoLWVmZmljaWVuY3kgZGlnaXRhbCBhdWRpbyBzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQ6IDIwMTEgUmF1bWZlbGQgR21iSAorICogQXV0aG9yOiBKb2hhbm5lcyBTdGV6ZW5iYWNoIDxqc0BzaWcyMS5uZXQ+CisgKgorICogYmFzZWQgb24gY29kZSBmcm9tOgorICoJV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCU1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTT0NfU1RBXzMyWF9ICisjZGVmaW5lIF9BU09DX1NUQV8zMlhfSAorCisvKiBTVEEzMjYgcmVnaXN0ZXIgYWRkcmVzc2VzICovCisKKyNkZWZpbmUgU1RBMzJYX1JFR0lTVEVSX0NPVU5UCTB4MmQKKworI2RlZmluZSBTVEEzMlhfQ09ORkEJMHgwMAorI2RlZmluZSBTVEEzMlhfQ09ORkIgICAgMHgwMQorI2RlZmluZSBTVEEzMlhfQ09ORkMgICAgMHgwMgorI2RlZmluZSBTVEEzMlhfQ09ORkQgICAgMHgwMworI2RlZmluZSBTVEEzMlhfQ09ORkUgICAgMHgwNAorI2RlZmluZSBTVEEzMlhfQ09ORkYgICAgMHgwNQorI2RlZmluZSBTVEEzMlhfTU1VVEUgICAgMHgwNgorI2RlZmluZSBTVEEzMlhfTVZPTCAgICAgMHgwNworI2RlZmluZSBTVEEzMlhfQzFWT0wgICAgMHgwOAorI2RlZmluZSBTVEEzMlhfQzJWT0wgICAgMHgwOQorI2RlZmluZSBTVEEzMlhfQzNWT0wgICAgMHgwYQorI2RlZmluZSBTVEEzMlhfQVVUTzEgICAgMHgwYgorI2RlZmluZSBTVEEzMlhfQVVUTzIgICAgMHgwYworI2RlZmluZSBTVEEzMlhfQVVUTzMgICAgMHgwZAorI2RlZmluZSBTVEEzMlhfQzFDRkcgICAgMHgwZQorI2RlZmluZSBTVEEzMlhfQzJDRkcgICAgMHgwZgorI2RlZmluZSBTVEEzMlhfQzNDRkcgICAgMHgxMAorI2RlZmluZSBTVEEzMlhfVE9ORSAgICAgMHgxMQorI2RlZmluZSBTVEEzMlhfTDFBUiAgICAgMHgxMgorI2RlZmluZSBTVEEzMlhfTDFBVFJUICAgMHgxMworI2RlZmluZSBTVEEzMlhfTDJBUiAgICAgMHgxNAorI2RlZmluZSBTVEEzMlhfTDJBVFJUICAgMHgxNQorI2RlZmluZSBTVEEzMlhfQ0ZBRERSMiAgMHgxNgorI2RlZmluZSBTVEEzMlhfQjFDRjEgICAgMHgxNworI2RlZmluZSBTVEEzMlhfQjFDRjIgICAgMHgxOAorI2RlZmluZSBTVEEzMlhfQjFDRjMgICAgMHgxOQorI2RlZmluZSBTVEEzMlhfQjJDRjEgICAgMHgxYQorI2RlZmluZSBTVEEzMlhfQjJDRjIgICAgMHgxYgorI2RlZmluZSBTVEEzMlhfQjJDRjMgICAgMHgxYworI2RlZmluZSBTVEEzMlhfQTFDRjEgICAgMHgxZAorI2RlZmluZSBTVEEzMlhfQTFDRjIgICAgMHgxZQorI2RlZmluZSBTVEEzMlhfQTFDRjMgICAgMHgxZgorI2RlZmluZSBTVEEzMlhfQTJDRjEgICAgMHgyMAorI2RlZmluZSBTVEEzMlhfQTJDRjIgICAgMHgyMQorI2RlZmluZSBTVEEzMlhfQTJDRjMgICAgMHgyMgorI2RlZmluZSBTVEEzMlhfQjBDRjEgICAgMHgyMworI2RlZmluZSBTVEEzMlhfQjBDRjIgICAgMHgyNAorI2RlZmluZSBTVEEzMlhfQjBDRjMgICAgMHgyNQorI2RlZmluZSBTVEEzMlhfQ0ZVRCAgICAgMHgyNgorI2RlZmluZSBTVEEzMlhfTVBDQzEgICAgMHgyNworI2RlZmluZSBTVEEzMlhfTVBDQzIgICAgMHgyOAorLyogUmVzZXJ2ZWQgMHgyOSAqLworLyogUmVzZXJ2ZWQgMHgyYSAqLworI2RlZmluZSBTVEEzMlhfUmVzZXJ2ZWQgMHgyYQorI2RlZmluZSBTVEEzMlhfRkRSQzEgICAgMHgyYgorI2RlZmluZSBTVEEzMlhfRkRSQzIgICAgMHgyYworLyogUmVzZXJ2ZWQgMHgyZCAqLworCisKKy8qIFNUQTMyNiByZWdpc3RlciBmaWVsZCBkZWZpbml0aW9ucyAqLworCisvKiAweDAwIENPTkZBICovCisjZGVmaW5lIFNUQTMyWF9DT05GQV9NQ1NfTUFTSwkweDAzCisjZGVmaW5lIFNUQTMyWF9DT05GQV9NQ1NfU0hJRlQJMAorI2RlZmluZSBTVEEzMlhfQ09ORkFfSVJfTUFTSwkweDE4CisjZGVmaW5lIFNUQTMyWF9DT05GQV9JUl9TSElGVAkzCisjZGVmaW5lIFNUQTMyWF9DT05GQV9UV1JCCTB4MjAKKyNkZWZpbmUgU1RBMzJYX0NPTkZBX1RXQUIJMHg0MAorI2RlZmluZSBTVEEzMlhfQ09ORkFfRkRSQgkweDgwCisKKy8qIDB4MDEgQ09ORkIgKi8KKyNkZWZpbmUgU1RBMzJYX0NPTkZCX1NBSV9NQVNLCTB4MGYKKyNkZWZpbmUgU1RBMzJYX0NPTkZCX1NBSV9TSElGVAkwCisjZGVmaW5lIFNUQTMyWF9DT05GQl9TQUlGQgkweDEwCisjZGVmaW5lIFNUQTMyWF9DT05GQl9EU0NLRQkweDIwCisjZGVmaW5lIFNUQTMyWF9DT05GQl9DMUlNCTB4NDAKKyNkZWZpbmUgU1RBMzJYX0NPTkZCX0MySU0JMHg4MAorCisvKiAweDAyIENPTkZDICovCisjZGVmaW5lIFNUQTMyWF9DT05GQ19PTV9NQVNLCTB4MDMKKyNkZWZpbmUgU1RBMzJYX0NPTkZDX09NX1NISUZUCTAKKyNkZWZpbmUgU1RBMzJYX0NPTkZDX0NTWl9NQVNLCTB4N2MKKyNkZWZpbmUgU1RBMzJYX0NPTkZDX0NTWl9TSElGVAkyCisKKy8qIDB4MDMgQ09ORkQgKi8KKyNkZWZpbmUgU1RBMzJYX0NPTkZEX0hQQgkweDAxCisjZGVmaW5lIFNUQTMyWF9DT05GRF9IUEJfU0hJRlQJMAorI2RlZmluZSBTVEEzMlhfQ09ORkRfREVNUAkweDAyCisjZGVmaW5lIFNUQTMyWF9DT05GRF9ERU1QX1NISUZUCTEKKyNkZWZpbmUgU1RBMzJYX0NPTkZEX0RTUEIJMHgwNAorI2RlZmluZSBTVEEzMlhfQ09ORkRfRFNQQl9TSElGVAkyCisjZGVmaW5lIFNUQTMyWF9DT05GRF9QU0wJMHgwOAorI2RlZmluZSBTVEEzMlhfQ09ORkRfUFNMX1NISUZUCTMKKyNkZWZpbmUgU1RBMzJYX0NPTkZEX0JRTAkweDEwCisjZGVmaW5lIFNUQTMyWF9DT05GRF9CUUxfU0hJRlQJNAorI2RlZmluZSBTVEEzMlhfQ09ORkRfRFJDCTB4MjAKKyNkZWZpbmUgU1RBMzJYX0NPTkZEX0RSQ19TSElGVAk1CisjZGVmaW5lIFNUQTMyWF9DT05GRF9aREUJMHg0MAorI2RlZmluZSBTVEEzMlhfQ09ORkRfWkRFX1NISUZUCTYKKyNkZWZpbmUgU1RBMzJYX0NPTkZEX01NRQkweDgwCisjZGVmaW5lIFNUQTMyWF9DT05GRF9NTUVfU0hJRlQJNworCisvKiAweDA0IENPTkZFICovCisjZGVmaW5lIFNUQTMyWF9DT05GRV9NUENWCTB4MDEKKyNkZWZpbmUgU1RBMzJYX0NPTkZFX01QQ1ZfU0hJRlQJMAorI2RlZmluZSBTVEEzMlhfQ09ORkVfTVBDCTB4MDIKKyNkZWZpbmUgU1RBMzJYX0NPTkZFX01QQ19TSElGVAkxCisjZGVmaW5lIFNUQTMyWF9DT05GRV9BTUUJMHgwOAorI2RlZmluZSBTVEEzMlhfQ09ORkVfQU1FX1NISUZUCTMKKyNkZWZpbmUgU1RBMzJYX0NPTkZFX1BXTVMJMHgxMAorI2RlZmluZSBTVEEzMlhfQ09ORkVfUFdNU19TSElGVAk0CisjZGVmaW5lIFNUQTMyWF9DT05GRV9aQ0UJMHg0MAorI2RlZmluZSBTVEEzMlhfQ09ORkVfWkNFX1NISUZUCTYKKyNkZWZpbmUgU1RBMzJYX0NPTkZFX1NWRQkweDgwCisjZGVmaW5lIFNUQTMyWF9DT05GRV9TVkVfU0hJRlQJNworCisvKiAweDA1IENPTkZGICovCisjZGVmaW5lIFNUQTMyWF9DT05GRl9PQ0ZHX01BU0sJMHgwMworI2RlZmluZSBTVEEzMlhfQ09ORkZfT0NGR19TSElGVAkwCisjZGVmaW5lIFNUQTMyWF9DT05GRl9JREUJMHgwNAorI2RlZmluZSBTVEEzMlhfQ09ORkZfSURFX1NISUZUCTMKKyNkZWZpbmUgU1RBMzJYX0NPTkZGX0JDTEUJMHgwOAorI2RlZmluZSBTVEEzMlhfQ09ORkZfRUNMRQkweDIwCisjZGVmaW5lIFNUQTMyWF9DT05GRl9QV0ROCTB4NDAKKyNkZWZpbmUgU1RBMzJYX0NPTkZGX0VBUEQJMHg4MAorCisvKiAweDA2IE1NVVRFICovCisjZGVmaW5lIFNUQTMyWF9NTVVURV9NTVVURQkweDAxCisKKy8qIDB4MGIgQVVUTzEgKi8KKyNkZWZpbmUgU1RBMzJYX0FVVE8xX0FNRVFfTUFTSwkweDAzCisjZGVmaW5lIFNUQTMyWF9BVVRPMV9BTUVRX1NISUZUCTAKKyNkZWZpbmUgU1RBMzJYX0FVVE8xX0FNVl9NQVNLCTB4YzAKKyNkZWZpbmUgU1RBMzJYX0FVVE8xX0FNVl9TSElGVAkyCisjZGVmaW5lIFNUQTMyWF9BVVRPMV9BTUdDX01BU0sJMHgzMAorI2RlZmluZSBTVEEzMlhfQVVUTzFfQU1HQ19TSElGVAk0CisjZGVmaW5lIFNUQTMyWF9BVVRPMV9BTVBTCTB4ODAKKworLyogMHgwYyBBVVRPMiAqLworI2RlZmluZSBTVEEzMlhfQVVUTzJfQU1BTUUJMHgwMQorI2RlZmluZSBTVEEzMlhfQVVUTzJfQU1BTV9NQVNLCTB4MGUKKyNkZWZpbmUgU1RBMzJYX0FVVE8yX0FNQU1fU0hJRlQJMQorI2RlZmluZSBTVEEzMlhfQVVUTzJfWE9fTUFTSwkweGYwCisjZGVmaW5lIFNUQTMyWF9BVVRPMl9YT19TSElGVAk0CisKKy8qIDB4MGQgQVVUTzMgKi8KKyNkZWZpbmUgU1RBMzJYX0FVVE8zX1BFUV9NQVNLCTB4MWYKKyNkZWZpbmUgU1RBMzJYX0FVVE8zX1BFUV9TSElGVAkwCisKKy8qIDB4MGUgMHgwZiAweDEwIEN4Q0ZHICovCisjZGVmaW5lIFNUQTMyWF9DeENGR19UQ0IJMHgwMQkvKiBvbmx5IEMxIGFuZCBDMiAqLworI2RlZmluZSBTVEEzMlhfQ3hDRkdfVENCX1NISUZUCTAKKyNkZWZpbmUgU1RBMzJYX0N4Q0ZHX0VRQlAJMHgwMgkvKiBvbmx5IEMxIGFuZCBDMiAqLworI2RlZmluZSBTVEEzMlhfQ3hDRkdfRVFCUF9TSElGVAkxCisjZGVmaW5lIFNUQTMyWF9DeENGR19WQlAJMHgwMworI2RlZmluZSBTVEEzMlhfQ3hDRkdfVkJQX1NISUZUCTIKKyNkZWZpbmUgU1RBMzJYX0N4Q0ZHX0JPCQkweDA0CisjZGVmaW5lIFNUQTMyWF9DeENGR19MU19NQVNLCTB4MzAKKyNkZWZpbmUgU1RBMzJYX0N4Q0ZHX0xTX1NISUZUCTQKKyNkZWZpbmUgU1RBMzJYX0N4Q0ZHX09NX01BU0sJMHhjMAorI2RlZmluZSBTVEEzMlhfQ3hDRkdfT01fU0hJRlQJNgorCisvKiAweDExIFRPTkUgKi8KKyNkZWZpbmUgU1RBMzJYX1RPTkVfQlRDX1NISUZUCTAKKyNkZWZpbmUgU1RBMzJYX1RPTkVfVFRDX1NISUZUCTQKKworLyogMHgxMiAweDEzIDB4MTQgMHgxNSBsaW1pdGVyIGF0dGFjay9yZWxlYXNlICovCisjZGVmaW5lIFNUQTMyWF9MeEFfU0hJRlQJMAorI2RlZmluZSBTVEEzMlhfTHhSX1NISUZUCTQKKworLyogMHgyNiBDRlVEICovCisjZGVmaW5lIFNUQTMyWF9DRlVEX1cxCQkweDAxCisjZGVmaW5lIFNUQTMyWF9DRlVEX1dBCQkweDAyCisjZGVmaW5lIFNUQTMyWF9DRlVEX1IxCQkweDA0CisjZGVmaW5lIFNUQTMyWF9DRlVEX1JBCQkweDA4CisKKworLyogYmlxdWFkIGZpbHRlciBjb2VmZmljaWVudCB0YWJsZSBvZmZzZXRzICovCisjZGVmaW5lIFNUQTMyWF9DMV9CUV9CQVNFCTAKKyNkZWZpbmUgU1RBMzJYX0MyX0JRX0JBU0UJMjAKKyNkZWZpbmUgU1RBMzJYX0NIX0JRX05VTQk0CisjZGVmaW5lIFNUQTMyWF9CUV9OVU1fQ09FRgk1CisjZGVmaW5lIFNUQTMyWF9YT19IUF9CUV9CQVNFCTQwCisjZGVmaW5lIFNUQTMyWF9YT19MUF9CUV9CQVNFCTQ1CisjZGVmaW5lIFNUQTMyWF9DMV9QUkVTQ0FMRQk1MAorI2RlZmluZSBTVEEzMlhfQzJfUFJFU0NBTEUJNTEKKyNkZWZpbmUgU1RBMzJYX0MxX1BPU1RTQ0FMRQk1MgorI2RlZmluZSBTVEEzMlhfQzJfUE9TVFNDQUxFCTUzCisjZGVmaW5lIFNUQTMyWF9DM19QT1NUU0NBTEUJNTQKKyNkZWZpbmUgU1RBMzJYX1RXX1BPU1RTQ0FMRQk1NQorI2RlZmluZSBTVEEzMlhfQzFfTUlYMQkJNTYKKyNkZWZpbmUgU1RBMzJYX0MxX01JWDIJCTU3CisjZGVmaW5lIFNUQTMyWF9DMl9NSVgxCQk1OAorI2RlZmluZSBTVEEzMlhfQzJfTUlYMgkJNTkKKyNkZWZpbmUgU1RBMzJYX0MzX01JWDEJCTYwCisjZGVmaW5lIFNUQTMyWF9DM19NSVgyCQk2MQorCisjZW5kaWYgLyogX0FTT0NfU1RBXzMyWF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMKaW5kZXggZTJhNzYwOC4uNzg1OWJkYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjYuYwpAQCAtMTYxLDEwICsxNjEsMTggQEAKIAkJZGV2X2RiZygmYWljMjYtPnNwaS0+ZGV2LCAiYmFkIGZvcm1hdFxuIik7IHJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIENvbmZpZ3VyZSBQTEwgKi8KKwkvKioKKwkgKiBDb25maWd1cmUgUExMCisJICogZnNyZWYgPSAobWNsayAqIFBMTE0pIC8gMjA0OAorCSAqIHdoZXJlIFBMTE0gPSBKLkREREQgKEREREQgcmVnaXN0ZXIgcmFuZ2VzIGZyb20gMCB0byA5OTk5LCBkZWNpbWFsKQorCSAqLwogCXB2YWwgPSAxOwotCWp2YWwgPSAoZnNyZWYgPT0gNDQxMDApID8gNyA6IDg7Ci0JZHZhbCA9IChmc3JlZiA9PSA0NDEwMCkgPyA1MjY0IDogMTkyMDsKKwkvKiBjb21wdXRlIEogcG9ydGlvbiBvZiBtdWx0aXBsaWVyICovCisJanZhbCA9IGZzcmVmIC8gKGFpYzI2LT5tY2xrIC8gMjA0OCk7CisJLyogY29tcHV0ZSBmcmFjdGlvbmFsIEREREQgY29tcG9uZW50IG9mIG11bHRpcGxpZXIgKi8KKwlkdmFsID0gZnNyZWYgLSAoanZhbCAqIChhaWMyNi0+bWNsayAvIDIwNDgpKTsKKwlkdmFsID0gKDEwMDAwICogZHZhbCkgLyAoYWljMjYtPm1jbGsgLyAyMDQ4KTsKKwlkZXZfZGJnKCZhaWMyNi0+c3BpLT5kZXYsICJTZXR0aW5nIFBMTE0gdG8gJWQuJTA0ZFxuIiwganZhbCwgZHZhbCk7CiAJcXZhbCA9IDA7CiAJcmVnID0gMHg4MDAwIHwgcXZhbCA8PCAxMSB8IHB2YWwgPDwgOCB8IGp2YWwgPDwgMjsKIAlhaWMyNl9yZWdfd3JpdGUoY29kZWMsIEFJQzI2X1JFR19QTExfUFJPRzEsIHJlZyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKaW5kZXggYzNkOTZmYy4uMDk2M2M0YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYwpAQCAtMjI2LDExICsyMjYsMTMgQEAKICNkZWZpbmUgUkRBQ19FTlVNCTEKICNkZWZpbmUgTEhQQ09NX0VOVU0JMgogI2RlZmluZSBSSFBDT01fRU5VTQkzCi0jZGVmaW5lIExJTkUxTF9FTlVNCTQKLSNkZWZpbmUgTElORTFSX0VOVU0JNQotI2RlZmluZSBMSU5FMkxfRU5VTQk2Ci0jZGVmaW5lIExJTkUyUl9FTlVNCTcKLSNkZWZpbmUgQURDX0hQRl9FTlVNCTgKKyNkZWZpbmUgTElORTFMXzJfTF9FTlVNCTQKKyNkZWZpbmUgTElORTFMXzJfUl9FTlVNCTUKKyNkZWZpbmUgTElORTFSXzJfTF9FTlVNCTYKKyNkZWZpbmUgTElORTFSXzJfUl9FTlVNCTcKKyNkZWZpbmUgTElORTJMX0VOVU0JOAorI2RlZmluZSBMSU5FMlJfRU5VTQk5CisjZGVmaW5lIEFEQ19IUEZfRU5VTQkxMAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpYzN4X2VudW1bXSA9IHsKIAlTT0NfRU5VTV9TSU5HTEUoREFDX0xJTkVfTVVYLCA2LCAzLCBhaWMzeF9sZWZ0X2RhY19tdXgpLApAQCAtMjM4LDYgKzI0MCw4IEBACiAJU09DX0VOVU1fU0lOR0xFKEhQTENPTV9DRkcsIDQsIDMsIGFpYzN4X2xlZnRfaHBjb21fbXV4KSwKIAlTT0NfRU5VTV9TSU5HTEUoSFBSQ09NX0NGRywgMywgNSwgYWljM3hfcmlnaHRfaHBjb21fbXV4KSwKIAlTT0NfRU5VTV9TSU5HTEUoTElORTFMXzJfTEFEQ19DVFJMLCA3LCAyLCBhaWMzeF9saW5laW5fbW9kZV9tdXgpLAorCVNPQ19FTlVNX1NJTkdMRShMSU5FMUxfMl9SQURDX0NUUkwsIDcsIDIsIGFpYzN4X2xpbmVpbl9tb2RlX211eCksCisJU09DX0VOVU1fU0lOR0xFKExJTkUxUl8yX0xBRENfQ1RSTCwgNywgMiwgYWljM3hfbGluZWluX21vZGVfbXV4KSwKIAlTT0NfRU5VTV9TSU5HTEUoTElORTFSXzJfUkFEQ19DVFJMLCA3LCAyLCBhaWMzeF9saW5laW5fbW9kZV9tdXgpLAogCVNPQ19FTlVNX1NJTkdMRShMSU5FMkxfMl9MQURDX0NUUkwsIDcsIDIsIGFpYzN4X2xpbmVpbl9tb2RlX211eCksCiAJU09DX0VOVU1fU0lOR0xFKExJTkUyUl8yX1JBRENfQ1RSTCwgNywgMiwgYWljM3hfbGluZWluX21vZGVfbXV4KSwKQEAgLTQ5MCwxMiArNDk0LDE2IEBACiB9OwogCiAvKiBMZWZ0IExpbmUxIE11eCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzN4X2xlZnRfbGluZTFfbXV4X2NvbnRyb2xzID0KLVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgYWljM3hfZW51bVtMSU5FMUxfRU5VTV0pOworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzN4X2xlZnRfbGluZTFsX211eF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGFpYzN4X2VudW1bTElORTFMXzJfTF9FTlVNXSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljM3hfcmlnaHRfbGluZTFsX211eF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGFpYzN4X2VudW1bTElORTFMXzJfUl9FTlVNXSk7CiAKIC8qIFJpZ2h0IExpbmUxIE11eCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzN4X3JpZ2h0X2xpbmUxX211eF9jb250cm9scyA9Ci1TT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGFpYzN4X2VudW1bTElORTFSX0VOVU1dKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMzeF9yaWdodF9saW5lMXJfbXV4X2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgYWljM3hfZW51bVtMSU5FMVJfMl9SX0VOVU1dKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMzeF9sZWZ0X2xpbmUxcl9tdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhaWMzeF9lbnVtW0xJTkUxUl8yX0xfRU5VTV0pOwogCiAvKiBMZWZ0IExpbmUyIE11eCAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzN4X2xlZnRfbGluZTJfbXV4X2NvbnRyb2xzID0KQEAgLTUzNSw5ICs1NDMsOSBAQAogCQkJICAgJmFpYzN4X2xlZnRfcGdhX21peGVyX2NvbnRyb2xzWzBdLAogCQkJICAgQVJSQVlfU0laRShhaWMzeF9sZWZ0X3BnYV9taXhlcl9jb250cm9scykpLAogCVNORF9TT0NfREFQTV9NVVgoIkxlZnQgTGluZTFMIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAmYWljM3hfbGVmdF9saW5lMV9tdXhfY29udHJvbHMpLAorCQkJICZhaWMzeF9sZWZ0X2xpbmUxbF9tdXhfY29udHJvbHMpLAogCVNORF9TT0NfREFQTV9NVVgoIkxlZnQgTGluZTFSIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAmYWljM3hfbGVmdF9saW5lMV9tdXhfY29udHJvbHMpLAorCQkJICZhaWMzeF9sZWZ0X2xpbmUxcl9tdXhfY29udHJvbHMpLAogCVNORF9TT0NfREFQTV9NVVgoIkxlZnQgTGluZTJMIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKIAkJCSAmYWljM3hfbGVmdF9saW5lMl9tdXhfY29udHJvbHMpLAogCkBAIC01NDgsOSArNTU2LDkgQEAKIAkJCSAgICZhaWMzeF9yaWdodF9wZ2FfbWl4ZXJfY29udHJvbHNbMF0sCiAJCQkgICBBUlJBWV9TSVpFKGFpYzN4X3JpZ2h0X3BnYV9taXhlcl9jb250cm9scykpLAogCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IExpbmUxTCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgJmFpYzN4X3JpZ2h0X2xpbmUxX211eF9jb250cm9scyksCisJCQkgJmFpYzN4X3JpZ2h0X2xpbmUxbF9tdXhfY29udHJvbHMpLAogCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IExpbmUxUiBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgJmFpYzN4X3JpZ2h0X2xpbmUxX211eF9jb250cm9scyksCisJCQkgJmFpYzN4X3JpZ2h0X2xpbmUxcl9tdXhfY29udHJvbHMpLAogCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IExpbmUyUiBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCiAJCQkgJmFpYzN4X3JpZ2h0X2xpbmUyX211eF9jb250cm9scyksCiAKQEAgLTExMTQsMTIgKzExMjIsMTkgQEAKIAogCQkvKiBTeW5jIHJlZ19jYWNoZSB3aXRoIHRoZSBoYXJkd2FyZSAqLwogCQljb2RlYy0+Y2FjaGVfb25seSA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpYzN4X3JlZyk7IGkrKykKKwkJZm9yIChpID0gQUlDM1hfU0FNUExFX1JBVEVfU0VMX1JFRzsgaSA8IEFSUkFZX1NJWkUoYWljM3hfcmVnKTsgaSsrKQogCQkJc25kX3NvY193cml0ZShjb2RlYywgaSwgY2FjaGVbaV0pOwogCQlpZiAoYWljM3gtPm1vZGVsID09IEFJQzNYX01PREVMXzMwMDcpCiAJCQlhaWMzeF9pbml0XzMwMDcoY29kZWMpOwogCQljb2RlYy0+Y2FjaGVfc3luYyA9IDA7CiAJfSBlbHNlIHsKKwkJLyoKKwkJICogRG8gc29mdCByZXNldCB0byB0aGlzIGNvZGVjIGluc3RhbmNlIGluIG9yZGVyIHRvIGNsZWFyCisJCSAqIHBvc3NpYmxlIFZERCBsZWFrYWdlIGN1cnJlbnRzIGluIGNhc2UgdGhlIHN1cHBseSByZWd1bGF0b3JzCisJCSAqIHJlbWFpbiBvbgorCQkgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgQUlDM1hfUkVTRVQsIFNPRlRfUkVTRVQpOworCQljb2RlYy0+Y2FjaGVfc3luYyA9IDE7CiAJCWFpYzN4LT5wb3dlciA9IDA7CiAJCS8qIEhXIHdyaXRlcyBhcmUgbmVlZGxlc3Mgd2hlbiBiaWFzIGlzIG9mZiAqLwogCQljb2RlYy0+Y2FjaGVfb25seSA9IDE7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCmluZGV4IDRjMzM2NjMuLmNkNjNiYmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCkBAIC05NTQsOSArOTU0LDkgQEAKIAogLyoKICAqIE1JQ0dBSU4gdm9sdW1lIGNvbnRyb2w6Ci0gKiBmcm9tIC02IHRvIDMwIGRCIGluIDYgZEIgc3RlcHMKKyAqIGZyb20gNiB0byAzMCBkQiBpbiA2IGRCIHN0ZXBzCiAgKi8KLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShtaWNfYW1wX3RsdiwgLTYwMCwgNjAwLCAwKTsKK3N0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShtaWNfYW1wX3RsdiwgNjAwLCA2MDAsIDApOwogCiAvKgogICogQUZNR0FJTiB2b2x1bWUgY29udHJvbDoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCmluZGV4IDJkYzk2NGIuLjc2YjQzNjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYwpAQCAtMTc1LDYgKzE3NSw3IEBACiBTT0NfREFQTV9FTlVNKCJJbnB1dCBTZWxlY3QiLCB3bTg3MzFfaW5zZWxfZW51bSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3MzFfZGFwbV93aWRnZXRzW10gPSB7CitTTkRfU09DX0RBUE1fU1VQUExZKCJBQ1RJVkUiLFdNODczMV9BQ1RJVkUsIDAsIDAsIE5VTEwsIDApLAogU05EX1NPQ19EQVBNX1NVUFBMWSgiT1NDIiwgV004NzMxX1BXUiwgNSwgMSwgTlVMTCwgMCksCiBTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBNaXhlciIsIFdNODczMV9QV1IsIDQsIDEsCiAJJndtODczMV9vdXRwdXRfbWl4ZXJfY29udHJvbHNbMF0sCkBAIC0yMDQsNiArMjA1LDggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdtODczMV9pbnRlcmNvbltdID0gewogCXsiREFDIiwgTlVMTCwgIk9TQyIsIHdtODczMV9jaGVja19vc2N9LAogCXsiQURDIiwgTlVMTCwgIk9TQyIsIHdtODczMV9jaGVja19vc2N9LAorCXsiREFDIiwgTlVMTCwgIkFDVElWRSJ9LAorCXsiQURDIiwgTlVMTCwgIkFDVElWRSJ9LAogCiAJLyogb3V0cHV0IG1peGVyICovCiAJeyJPdXRwdXQgTWl4ZXIiLCAiTGluZSBCeXBhc3MgU3dpdGNoIiwgIkxpbmUgSW5wdXQifSwKQEAgLTMxNSwyOSArMzE4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bTg3MzFfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwotCi0JLyogc2V0IGFjdGl2ZSAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODczMV9BQ1RJVkUsIDB4MDAwMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd204NzMxX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7Ci0KLQkvKiBkZWFjdGl2YXRlICovCi0JaWYgKCFjb2RlYy0+YWN0aXZlKSB7Ci0JCXVkZWxheSg1MCk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODczMV9BQ1RJVkUsIDB4MCk7Ci0JfQotfQotCiBzdGF0aWMgaW50IHdtODczMV9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwpAQCAtNDgwLDcgKzQ2MCw2IEBACiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODczMV9QV1IsIHJlZyB8IDB4MDA0MCk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004NzMxX0FDVElWRSwgMHgwKTsKIAkJc25kX3NvY193cml0ZShjb2RlYywgV004NzMxX1BXUiwgMHhmZmZmKTsKIAkJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtODczMS0+c3VwcGxpZXMpLAogCQkJCSAgICAgICB3bTg3MzEtPnN1cHBsaWVzKTsKQEAgLTQ5Niw5ICs0NzUsNyBAQAogCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyB3bTg3MzFfZGFpX29wcyA9IHsKLQkucHJlcGFyZQk9IHdtODczMV9wY21fcHJlcGFyZSwKIAkuaHdfcGFyYW1zCT0gd204NzMxX2h3X3BhcmFtcywKLQkuc2h1dGRvd24JPSB3bTg3MzFfc2h1dGRvd24sCiAJLmRpZ2l0YWxfbXV0ZQk9IHdtODczMV9tdXRlLAogCS5zZXRfc3lzY2xrCT0gd204NzMxX3NldF9kYWlfc3lzY2xrLAogCS5zZXRfZm10CT0gd204NzMxX3NldF9kYWlfZm10LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3ODIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzgyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhMDlmOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzgyLmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIHNvdW5kL3NvYy9jb2RlY3Mvd204NzgyLmMKKyAqIHNpbXBsZSwgc3RyYXAtcGluIGNvbmZpZ3VyZWQgMjRiaXQgMmNoIEFEQworICoKKyAqIENvcHlyaWdodDogMjAxMSBSYXVtZmVsZCBHbWJICisgKiBBdXRob3I6IEpvaGFubmVzIFN0ZXplbmJhY2ggPGpzQHNpZzIxLm5ldD4KKyAqCisgKiBiYXNlZCBvbiBhZDczMzExLmMKKyAqIENvcHlyaWdodDoJQW5hbG9nIERldmljZSBJbmMuCisgKiBBdXRob3I6CUNsaWZmIENhaSA8Y2xpZmYuY2FpQGFuYWxvZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgd204NzgyX2RhaSA9IHsKKwkubmFtZSA9ICJ3bTg3ODIiLAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLyogRm9yIGNvbmZpZ3VyYXRpb25zIHdpdGggRlNBTVBFTj0wICovCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwKKwkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzgyOworCitzdGF0aWMgX19kZXZpbml0IGludCB3bTg3ODJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LAorCQkJJnNvY19jb2RlY19kZXZfd204NzgyLCAmd204NzgyX2RhaSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHdtODc4Ml9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdtODc4Ml9jb2RlY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid204NzgyIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSB3bTg3ODJfcHJvYmUsCisJLnJlbW92ZSA9IHdtODc4Ml9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3bTg3ODJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndtODc4Ml9jb2RlY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQod204NzgyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgd204NzgyX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmd204NzgyX2NvZGVjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh3bTg3ODJfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBXTTg3ODIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJKb2hhbm5lcyBTdGV6ZW5iYWNoIDxqc0BzaWcyMS5uZXQ+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYwppbmRleCA2Nzg1Njg4Li45YTVlNjdjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKQEAgLTY4MCwyMCArNjgwLDI1IEBACiAjZGVmaW5lIFdNODgwNF9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFwKIAkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQogCisjZGVmaW5lIFdNODgwNF9SQVRFUyAoU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFwKKwkJICAgICAgU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV82NDAwMCB8IFwKKwkJICAgICAgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8IFwKKwkJICAgICAgU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMTkyMDAwKQorCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB3bTg4MDRfZGFpID0gewogCS5uYW1lID0gIndtODgwNC1zcGRpZiIsCiAJLnBsYXliYWNrID0gewogCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAogCQkuY2hhbm5lbHNfbWluID0gMiwKIAkJLmNoYW5uZWxzX21heCA9IDIsCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAorCQkucmF0ZXMgPSBXTTg4MDRfUkFURVMsCiAJCS5mb3JtYXRzID0gV004ODA0X0ZPUk1BVFMsCiAJfSwKIAkuY2FwdHVyZSA9IHsKIAkJLnN0cmVhbV9uYW1lID0gIkNhcHR1cmUiLAogCQkuY2hhbm5lbHNfbWluID0gMiwKIAkJLmNoYW5uZWxzX21heCA9IDIsCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAorCQkucmF0ZXMgPSBXTTg4MDRfUkFURVMsCiAJCS5mb3JtYXRzID0gV004ODA0X0ZPUk1BVFMsCiAJfSwKIAkub3BzID0gJndtODgwNF9kYWlfb3BzLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMKaW5kZXggNDQ5ZWEwOS4uMDgyMDQwZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jCkBAIC0xMTY3LDYgKzExNjcsNyBAQAogCQlyZXQgPSB3bTg5MDBfc2V0X2ZsbChjb2RlYywgMCwgZmxsX2luLCBmbGxfb3V0KTsKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVzdGFydCBGTExcbiIpOworCQkJa2ZyZWUoY2FjaGUpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jCmluZGV4IDliM2JiYTQuLmIwODU1NzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYwpAQCAtMjU2MCw2ICsyNTYwLDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB3bTg5MDRfaTJjX2lkW10gPSB7CiAJeyAid204OTA0IiwgV004OTA0IH0sCiAJeyAid204OTEyIiwgV004OTEyIH0sCisJeyAid204OTE4IiwgV004OTA0IH0sICAgLyogQWN0dWFsbHkgYSBzdWJzZXQsIHVwZGF0ZXMgdG8gZm9sbG93ICovCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHdtODkwNF9pMmNfaWQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5MTUuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTE1LmMKaW5kZXggYTBiMWE3Mi4uNDIzYmFhOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5MTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkxNS5jCkBAIC00MSwxNCArNDEsMTIgQEAKICNkZWZpbmUgSFBPVVQyTCA0CiAjZGVmaW5lIEhQT1VUMlIgOAogCi0jZGVmaW5lIFdNODkxNV9OVU1fU1VQUExJRVMgNgorI2RlZmluZSBXTTg5MTVfTlVNX1NVUFBMSUVTIDQKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5MTVfc3VwcGx5X25hbWVzW1dNODkxNV9OVU1fU1VQUExJRVNdID0gewotCSJEQ1ZERCIsCiAJIkRCVkREIiwKIAkiQVZERDEiLAogCSJBVkREMiIsCiAJIkNQVkREIiwKLQkiTUlDVkREIiwKIH07CiAKIHN0cnVjdCB3bTg5MTVfcHJpdiB7CkBAIC01Nyw2ICs1NSw3IEBACiAJaW50IGxkbzFlbmE7CiAKIAlpbnQgc3lzY2xrOworCWludCBzeXNjbGtfc3JjOwogCiAJaW50IGZsbF9zcmM7CiAJaW50IGZsbF9mcmVmOwpAQCAtNzYsNiArNzUsNyBAQAogCXN0cnVjdCB3bTg5MTVfcGRhdGEgcGRhdGE7CiAKIAlpbnQgcnhfcmF0ZVtXTTg5MTVfQUlGU107CisJaW50IGJjbGtfcmF0ZVtXTTg5MTVfQUlGU107CiAKIAkvKiBQbGF0Zm9ybSBkZXBlbmRhbnQgUmVUdW5lIG1vYmlsZSBjb25maWd1cmF0aW9uICovCiAJaW50IG51bV9yZXR1bmVfbW9iaWxlX3RleHRzOwpAQCAtMTEzLDggKzExMyw2IEBACiBXTTg5MTVfUkVHVUxBVE9SX0VWRU5UKDEpCiBXTTg5MTVfUkVHVUxBVE9SX0VWRU5UKDIpCiBXTTg5MTVfUkVHVUxBVE9SX0VWRU5UKDMpCi1XTTg5MTVfUkVHVUxBVE9SX0VWRU5UKDQpCi1XTTg5MTVfUkVHVUxBVE9SX0VWRU5UKDUpCiAKIHN0YXRpYyBjb25zdCB1MTYgd204OTE1X3JlZ1tXTTg5MTVfTUFYX1JFR0lTVEVSXSA9IHsKIAlbV004OTE1X1NPRlRXQVJFX1JFU0VUXSA9IDB4ODkxNSwKQEAgLTE1NjUsNiArMTU2Myw1MCBAQAogCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MTVfU09GVFdBUkVfUkVTRVQsIDB4ODkxNSk7CiB9CiAKK3N0YXRpYyBjb25zdCBpbnQgYmNsa19kaXZzW10gPSB7CisJMSwgMiwgMywgNCwgNiwgOCwgMTIsIDE2LCAyNCwgMzIsIDQ4LCA2NCwgOTYKK307CisKK3N0YXRpYyB2b2lkIHdtODkxNV91cGRhdGVfYmNsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODkxNV9wcml2ICp3bTg5MTUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgYWlmLCBiZXN0LCBjdXJfdmFsLCBiY2xrX3JhdGUsIGJjbGtfcmVnLCBpOworCisJLyogRG9uJ3QgYm90aGVyIGlmIHdlJ3JlIGluIGEgbG93IGZyZXF1ZW5jeSBpZGxlIG1vZGUgdGhhdAorCSAqIGNhbid0IHN1cHBvcnQgYXVkaW8uCisJICovCisJaWYgKHdtODkxNS0+c3lzY2xrIDwgNjQwMDApCisJCXJldHVybjsKKworCWZvciAoYWlmID0gMDsgYWlmIDwgV004OTE1X0FJRlM7IGFpZisrKSB7CisJCXN3aXRjaCAoYWlmKSB7CisJCWNhc2UgMDoKKwkJCWJjbGtfcmVnID0gV004OTE1X0FJRjFfQkNMSzsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQliY2xrX3JlZyA9IFdNODkxNV9BSUYyX0JDTEs7CisJCQlicmVhazsKKwkJfQorCisJCWJjbGtfcmF0ZSA9IHdtODkxNS0+YmNsa19yYXRlW2FpZl07CisKKwkJLyogUGljayBhIGRpdmlzb3IgZm9yIEJDTEsgYXMgY2xvc2UgYXMgd2UgY2FuIGdldCB0byBpZGVhbCAqLworCQliZXN0ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmNsa19kaXZzKTsgaSsrKSB7CisJCQljdXJfdmFsID0gKHdtODkxNS0+c3lzY2xrIC8gYmNsa19kaXZzW2ldKSAtIGJjbGtfcmF0ZTsKKwkJCWlmIChjdXJfdmFsIDwgMCkgLyogQkNMSyB0YWJsZSBpcyBzb3J0ZWQgKi8KKwkJCQlicmVhazsKKwkJCWJlc3QgPSBpOworCQl9CisJCWJjbGtfcmF0ZSA9IHdtODkxNS0+c3lzY2xrIC8gYmNsa19kaXZzW2Jlc3RdOworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJVc2luZyBCQ0xLX0RJViAlZCBmb3IgYWN0dWFsIEJDTEsgJWRIelxuIiwKKwkJCWJjbGtfZGl2c1tiZXN0XSwgYmNsa19yYXRlKTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiY2xrX3JlZywKKwkJCQkgICAgV004OTE1X0FJRjFfQkNMS19ESVZfTUFTSywgYmVzdCk7CisJfQorfQorCiBzdGF0aWMgaW50IHdtODkxNV9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkJIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewpAQCAtMTcxNywxMCArMTc1OSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBpbnQgYmNsa19kaXZzW10gPSB7Ci0JMSwgMiwgMywgNCwgNiwgOCwgMTIsIDE2LCAyNCwgMzIsIDQ4LCA2NCwgOTYKLX07Ci0KIHN0YXRpYyBjb25zdCBpbnQgZHNwX2RpdnNbXSA9IHsKIAk0ODAwMCwgMzIwMDAsIDE2MDAwLCA4MDAwCiB9OwpAQCAtMTczMSwxNyArMTc2OSwxMSBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHdtODkxNV9wcml2ICp3bTg5MTUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgYml0cywgaSwgYmNsa19yYXRlLCBiZXN0LCBjdXJfdmFsOworCWludCBiaXRzLCBpLCBiY2xrX3JhdGU7CiAJaW50IGFpZmRhdGEgPSAwOwotCWludCBiY2xrID0gMDsKIAlpbnQgbHJjbGsgPSAwOwogCWludCBkc3AgPSAwOwotCWludCBhaWZkYXRhX3JlZywgYmNsa19yZWcsIGxyY2xrX3JlZywgZHNwX3NoaWZ0OwotCi0JaWYgKCF3bTg5MTUtPnN5c2NsaykgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJTWVNDTEsgbm90IGNvbmZpZ3VyZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaW50IGFpZmRhdGFfcmVnLCBscmNsa19yZWcsIGRzcF9zaGlmdDsKIAogCXN3aXRjaCAoZGFpLT5pZCkgewogCWNhc2UgMDoKQEAgLTE3NTMsNyArMTc4NSw2IEBACiAJCQlhaWZkYXRhX3JlZyA9IFdNODkxNV9BSUYxVFhfREFUQV9DT05GSUdVUkFUSU9OXzE7CiAJCQlscmNsa19yZWcgPSBXTTg5MTVfQUlGMV9UWF9MUkNMS18xOwogCQl9Ci0JCWJjbGtfcmVnID0gV004OTE1X0FJRjFfQkNMSzsKIAkJZHNwX3NoaWZ0ID0gMDsKIAkJYnJlYWs7CiAJY2FzZSAxOgpAQCAtMTc2NSw3ICsxNzk2LDYgQEAKIAkJCWFpZmRhdGFfcmVnID0gV004OTE1X0FJRjJUWF9EQVRBX0NPTkZJR1VSQVRJT05fMTsKIAkJCWxyY2xrX3JlZyA9IFdNODkxNV9BSUYyX1RYX0xSQ0xLXzE7CiAJCX0KLQkJYmNsa19yZWcgPSBXTTg5MTVfQUlGMl9CQ0xLOwogCQlkc3Bfc2hpZnQgPSBXTTg5MTVfRFNQMl9ESVZfU0hJRlQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNzc5LDYgKzE4MDksOSBAQAogCQlyZXR1cm4gYmNsa19yYXRlOwogCX0KIAorCXdtODkxNS0+YmNsa19yYXRlW2RhaS0+aWRdID0gYmNsa19yYXRlOworCXdtODkxNS0+cnhfcmF0ZVtkYWktPmlkXSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisKIAkvKiBOZWVkcyBsb29raW5nIGF0IGZvciBURE0gKi8KIAliaXRzID0gc25kX3BjbV9mb3JtYXRfd2lkdGgocGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKIAlpZiAoYml0cyA8IDApCkBAIC0xNzk2LDE4ICsxODI5LDcgQEAKIAl9CiAJZHNwIHw9IGkgPDwgZHNwX3NoaWZ0OwogCi0JLyogUGljayBhIGRpdmlzb3IgZm9yIEJDTEsgYXMgY2xvc2UgYXMgd2UgY2FuIGdldCB0byBpZGVhbCAqLwotCWJlc3QgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJjbGtfZGl2cyk7IGkrKykgewotCQljdXJfdmFsID0gKHdtODkxNS0+c3lzY2xrIC8gYmNsa19kaXZzW2ldKSAtIGJjbGtfcmF0ZTsKLQkJaWYgKGN1cl92YWwgPCAwKSAvKiBCQ0xLIHRhYmxlIGlzIHNvcnRlZCAqLwotCQkJYnJlYWs7Ci0JCWJlc3QgPSBpOwotCX0KLQliY2xrX3JhdGUgPSB3bTg5MTUtPnN5c2NsayAvIGJjbGtfZGl2c1tiZXN0XTsKLQlkZXZfZGJnKGRhaS0+ZGV2LCAiVXNpbmcgQkNMS19ESVYgJWQgZm9yIGFjdHVhbCBCQ0xLICVkSHpcbiIsCi0JCWJjbGtfZGl2c1tiZXN0XSwgYmNsa19yYXRlKTsKLQliY2xrIHw9IGJlc3Q7CisJd204OTE1X3VwZGF0ZV9iY2xrKGNvZGVjKTsKIAogCWxyY2xrID0gYmNsa19yYXRlIC8gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAlkZXZfZGJnKGRhaS0+ZGV2LCAiVXNpbmcgTFJDTEsgcmF0ZSAlZCBmb3IgYWN0dWFsIExSQ0xLICVkSHpcbiIsCkBAIC0xODE3LDE0ICsxODM5LDExIEBACiAJCQkgICAgV004OTE1X0FJRjFUWF9XTF9NQVNLIHwKIAkJCSAgICBXTTg5MTVfQUlGMVRYX1NMT1RfTEVOX01BU0ssCiAJCQkgICAgYWlmZGF0YSk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYmNsa19yZWcsIFdNODkxNV9BSUYxX0JDTEtfRElWX01BU0ssIGJjbGspOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGxyY2xrX3JlZywgV004OTE1X0FJRjFSWF9SQVRFX01BU0ssCiAJCQkgICAgbHJjbGspOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkxNV9BSUZfQ0xPQ0tJTkdfMiwKIAkJCSAgICBXTTg5MTVfRFNQMV9ESVZfU0hJRlQgPDwgZHNwX3NoaWZ0LCBkc3ApOwogCi0Jd204OTE1LT5yeF9yYXRlW2RhaS0+aWRdID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xODM4LDggKzE4NTcsMTEgQEAKIAlpbnQgc3JjOwogCWludCBvbGQ7CiAKKwlpZiAoZnJlcSA9PSB3bTg5MTUtPnN5c2NsayAmJiBjbGtfaWQgPT0gd204OTE1LT5zeXNjbGtfc3JjKQorCQlyZXR1cm4gMDsKKwogCS8qIERpc2FibGUgU1lTQ0xLIHdoaWxlIHdlIHJlY29uZmlndXJlICovCi0Jb2xkID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MTVfQUlGX0NMT0NLSU5HXzEpOworCW9sZCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTE1X0FJRl9DTE9DS0lOR18xKSAmIFdNODkxNV9TWVNDTEtfRU5BOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkxNV9BSUZfQ0xPQ0tJTkdfMSwKIAkJCSAgICBXTTg5MTVfU1lTQ0xLX0VOQSwgMCk7CiAKQEAgLTE4ODIsNiArMTkwNCw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXdtODkxNV91cGRhdGVfYmNsayhjb2RlYyk7CisKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MTVfQUlGX0NMT0NLSU5HXzEsCiAJCQkgICAgV004OTE1X1NZU0NMS19TUkNfTUFTSyB8IFdNODkxNV9TWVNDTEtfRElWX01BU0ssCiAJCQkgICAgc3JjIDw8IFdNODkxNV9TWVNDTEtfU1JDX1NISUZUIHwgcmF0ZWRpdik7CkBAIC0xODg5LDYgKzE5MTMsOCBAQAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkxNV9BSUZfQ0xPQ0tJTkdfMSwKIAkJCSAgICBXTTg5MTVfU1lTQ0xLX0VOQSwgb2xkKTsKIAorCXdtODkxNS0+c3lzY2xrX3NyYyA9IGNsa19pZDsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMDA3LDYgKzIwMzMsNyBAQAogCQkJICB1bnNpZ25lZCBpbnQgRnJlZiwgdW5zaWduZWQgaW50IEZvdXQpCiB7CiAJc3RydWN0IHdtODkxNV9wcml2ICp3bTg5MTUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKIAlzdHJ1Y3QgX2ZsbF9kaXYgZmxsX2RpdjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJaW50IHJldCwgcmVnOwpAQCAtMjAzOCw2ICsyMDY1LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTTg5MTVfRkxMX01DTEsyOgogCQlyZWcgPSAxOworCQlicmVhazsKIAljYXNlIFdNODkxNV9GTExfREFDTFJDTEsxOgogCQlyZWcgPSAyOwogCQlicmVhazsKQEAgLTIwOTIsNyArMjEyMCwxOCBAQAogCWVsc2UKIAkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMik7CiAKLQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJndtODkxNS0+ZmxsX2xvY2ssIHRpbWVvdXQpOworCS8qIEFsbG93IHN1YnN0YW50aWFsbHkgbG9uZ2VyIGlmIHdlJ3ZlIGFjdHVhbGx5IGdvdCB0aGUgSVJRICovCisJaWYgKGkyYy0+aXJxKQorCQl0aW1lb3V0ICo9IDEwMDA7CisKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJndtODkxNS0+ZmxsX2xvY2ssIHRpbWVvdXQpOworCisJaWYgKHJldCA9PSAwICYmIGkyYy0+aXJxKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBGTExcbiIpOworCQlyZXQgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisJCXJldCA9IDA7CisJfQogCiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRkxMIGNvbmZpZ3VyZWQgZm9yICVkSHotPiVkSHpcbiIsIEZyZWYsIEZvdXQpOwogCkBAIC0yMTAwLDcgKzIxMzksNyBAQAogCXdtODkxNS0+ZmxsX2ZvdXQgPSBGb3V0OwogCXdtODkxNS0+ZmxsX3NyYyA9IHNvdXJjZTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKICNpZmRlZiBDT05GSUdfR1BJT0xJQgpAQCAtMjI5Miw2ICsyMzMxLDEyIEBACiAJCQkJICAgIFNORF9KQUNLX0hFQURTRVQgfCBTTkRfSkFDS19CVE5fMCk7CiAJCXdtODkxNS0+amFja19taWMgPSB0cnVlOwogCQl3bTg5MTUtPmRldGVjdGluZyA9IGZhbHNlOworCisJCS8qIEluY3JlYXNlIHBvbGwgcmF0ZSB0byBnaXZlIGJldHRlciByZXNwb25zaXZlbmVzcworCQkgKiBmb3IgYnV0dG9ucyAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MTVfTUlDX0RFVEVDVF8xLAorCQkJCSAgICBXTTg5MTVfTUlDRF9SQVRFX01BU0ssCisJCQkJICAgIDUgPDwgV004OTE1X01JQ0RfUkFURV9TSElGVCk7CiAJfQogCiAJLyogSWYgd2UgZGV0ZWN0ZWQgYSBsb3dlciBpbXBlZGVuY2UgZHVyaW5nIGluaXRpYWwgc3RhcnR1cApAQCAtMjMzMiwxNSArMjM3NywxNyBAQAogCQkJCQkgICAgU05EX0pBQ0tfSEVBRFBIT05FLAogCQkJCQkgICAgU05EX0pBQ0tfSEVBRFNFVCB8CiAJCQkJCSAgICBTTkRfSkFDS19CVE5fMCk7CisKKwkJCS8qIEluY3JlYXNlIHRoZSBkZXRlY3Rpb24gcmF0ZSBhIGJpdCBmb3IKKwkJCSAqIHJlc3BvbnNpdmVuZXNzLgorCQkJICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MTVfTUlDX0RFVEVDVF8xLAorCQkJCQkgICAgV004OTE1X01JQ0RfUkFURV9NQVNLLAorCQkJCQkgICAgNyA8PCBXTTg5MTVfTUlDRF9SQVRFX1NISUZUKTsKKwogCQkJd204OTE1LT5kZXRlY3RpbmcgPSBmYWxzZTsKIAkJfQogCX0KLQotCS8qIEluY3JlYXNlIHBvbGwgcmF0ZSB0byBnaXZlIGJldHRlciByZXNwb25zaXZlbmVzcyBmb3IgYnV0dG9ucyAqLwotCWlmICghd204OTE1LT5kZXRlY3RpbmcpCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkxNV9NSUNfREVURUNUXzEsCi0JCQkJICAgIFdNODkxNV9NSUNEX1JBVEVfTUFTSywKLQkJCQkgICAgNSA8PCBXTTg5MTVfTUlDRF9SQVRFX1NISUZUKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IHdtODkxNV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKQEAgLTIzODIsNiArMjQyOSwyMCBAQAogCX0KIH0KIAorc3RhdGljIGlycXJldHVybl90IHdtODkxNV9lZGdlX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCWlycXJldHVybl90IHZhbDsKKworCWRvIHsKKwkJdmFsID0gd204OTE1X2lycShpcnEsIGRhdGEpOworCQlpZiAodmFsICE9IElSUV9OT05FKQorCQkJcmV0ID0gdmFsOworCX0gd2hpbGUgKHZhbCAhPSBJUlFfTk9ORSk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCB3bTg5MTVfcmV0dW5lX21vYmlsZV9wZGF0YShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODkxNV9wcml2ICp3bTg5MTUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKQEAgLTI0ODEsOCArMjU0Miw2IEBACiAJd204OTE1LT5kaXNhYmxlX25iWzFdLm5vdGlmaWVyX2NhbGwgPSB3bTg5MTVfcmVndWxhdG9yX2V2ZW50XzE7CiAJd204OTE1LT5kaXNhYmxlX25iWzJdLm5vdGlmaWVyX2NhbGwgPSB3bTg5MTVfcmVndWxhdG9yX2V2ZW50XzI7CiAJd204OTE1LT5kaXNhYmxlX25iWzNdLm5vdGlmaWVyX2NhbGwgPSB3bTg5MTVfcmVndWxhdG9yX2V2ZW50XzM7Ci0Jd204OTE1LT5kaXNhYmxlX25iWzRdLm5vdGlmaWVyX2NhbGwgPSB3bTg5MTVfcmVndWxhdG9yX2V2ZW50XzQ7Ci0Jd204OTE1LT5kaXNhYmxlX25iWzVdLm5vdGlmaWVyX2NhbGwgPSB3bTg5MTVfcmVndWxhdG9yX2V2ZW50XzU7CiAKIAkvKiBUaGlzIHNob3VsZCByZWFsbHkgYmUgbW92ZWQgaW50byB0aGUgcmVndWxhdG9yIGNvcmUgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5MTUtPnN1cHBsaWVzKTsgaSsrKSB7CkBAIC0yNzA4LDggKzI3NjcsMTQgQEAKIAogCQlpcnFfZmxhZ3MgfD0gSVJRRl9PTkVTSE9UOwogCi0JCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGkyYy0+aXJxLCBOVUxMLCB3bTg5MTVfaXJxLAotCQkJCQkgICBpcnFfZmxhZ3MsICJ3bTg5MTUiLCBjb2RlYyk7CisJCWlmIChpcnFfZmxhZ3MgJiAoSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HKSkKKwkJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGkyYy0+aXJxLCBOVUxMLAorCQkJCQkJICAgd204OTE1X2VkZ2VfaXJxLAorCQkJCQkJICAgaXJxX2ZsYWdzLCAid204OTE1IiwgY29kZWMpOworCQllbHNlCisJCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpMmMtPmlycSwgTlVMTCwgd204OTE1X2lycSwKKwkJCQkJCSAgIGlycV9mbGFncywgIndtODkxNSIsIGNvZGVjKTsKKwogCQlpZiAocmV0ID09IDApIHsKIAkJCS8qIFVubWFzayB0aGUgaW50ZXJydXB0ICovCiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MTVfSU5URVJSVVBUX0NPTlRST0wsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYwppbmRleCAyNTU4MGUzLi4wNTZkYWEwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMKQEAgLTI5Nyw4ICsyOTcsNiBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcmV0OwogCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX3JldDsKIAogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CkBAIC02ODMsOCArNjgxLDYgQEAKIAkJfQogCX0KIAlyZXQgPSB3bTg5NDBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX3JldDsKIAogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CkBAIC03MzAsOSArNzI2LDYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCXJldCA9IHdtODk0MF9hZGRfd2lkZ2V0cyhjb2RlYyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCmluZGV4IGY5MGFlNDIuLjg0OTljNTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYwpAQCAtNzgsNiArNzgsOCBAQAogI2lmZGVmIENPTkZJR19HUElPTElCCiAJc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7CiAjZW5kaWYKKworCWludCBpcnE7CiB9OwogCiAvKiBXZSBjYW4ndCB1c2UgdGhlIHNhbWUgbm90aWZpZXIgYmxvY2sgZm9yIG1vcmUgdGhhbiBvbmUgc3VwcGx5IGFuZApAQCAtMTk4Miw2ICsxOTg0LDcgQEAKIAkwLCA2LCBUTFZfREJfU0NBTEVfSVRFTSgwLCAxNTAsIDApLAogCTcsIDcsIFRMVl9EQl9TQ0FMRV9JVEVNKDEyMDAsIDAsIDApLAogfTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShlcV90bHYsIC0xMjAwLCAxMDAsIDApOwogCiAvKiBUaGUgVlUgYml0cyBmb3IgdGhlIGhlYWRwaG9uZXMgYXJlIGluIGEgZGlmZmVyZW50IHJlZ2lzdGVyIHRvIHRoZSBtdXRlCiAgKiBiaXRzIGFuZCBvbmx5IHRha2UgZWZmZWN0IG9uIHRoZSBQR0EgaWYgaXQgaXMgYWN0dWFsbHkgcG93ZXJlZC4KQEAgLTE5OTksMTIgKzIwMDIsMTIgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBJZiB0aGUgbGVmdCBQR0EgaXMgZW5hYmxlZCBoaXQgdGhhdCBWVSBiaXQuLi4gKi8KLQlpZiAocmVnX2NhY2hlW1dNODk2Ml9QV1JfTUdNVF8yXSAmIFdNODk2Ml9IUE9VVExfUEdBX0VOQSkKKwlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NjJfUFdSX01HTVRfMikgJiBXTTg5NjJfSFBPVVRMX1BHQV9FTkEpCiAJCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfSFBPVVRMX1ZPTFVNRSwKIAkJCQkgICAgIHJlZ19jYWNoZVtXTTg5NjJfSFBPVVRMX1ZPTFVNRV0pOwogCiAJLyogLi4ub3RoZXJ3aXNlIHRoZSByaWdodC4gIFRoZSBWVSBpcyBzdGVyZW8uICovCi0JaWYgKHJlZ19jYWNoZVtXTTg5NjJfUFdSX01HTVRfMl0gJiBXTTg5NjJfSFBPVVRSX1BHQV9FTkEpCisJaWYgKHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX1BXUl9NR01UXzIpICYgV004OTYyX0hQT1VUUl9QR0FfRU5BKQogCQlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0hQT1VUUl9WT0xVTUUsCiAJCQkJICAgICByZWdfY2FjaGVbV004OTYyX0hQT1VUUl9WT0xVTUVdKTsKIApAQCAtMjExOSw2ICsyMTIyLDE4IEBACiAKIFNPQ19TSU5HTEVfVExWKCJTcGVha2VyIEJvb3N0IFZvbHVtZSIsIFdNODk2Ml9DTEFTU19EX0NPTlRST0xfMiwgMCwgNywgMCwKIAkgICAgICAgY2xhc3NkX3RsdiksCisKK1NPQ19TSU5HTEUoIkVRIFN3aXRjaCIsIFdNODk2Ml9FUTEsIFdNODk2Ml9FUV9FTkFfU0hJRlQsIDEsIDApLAorU09DX0RPVUJMRV9SX1RMVigiRVExIFZvbHVtZSIsIFdNODk2Ml9FUTIsIFdNODk2Ml9FUTIyLAorCQkgV004OTYyX0VRTF9CMV9HQUlOX1NISUZULCAzMSwgMCwgZXFfdGx2KSwKK1NPQ19ET1VCTEVfUl9UTFYoIkVRMiBWb2x1bWUiLCBXTTg5NjJfRVEyLCBXTTg5NjJfRVEyMiwKKwkJIFdNODk2Ml9FUUxfQjJfR0FJTl9TSElGVCwgMzEsIDAsIGVxX3RsdiksCitTT0NfRE9VQkxFX1JfVExWKCJFUTMgVm9sdW1lIiwgV004OTYyX0VRMiwgV004OTYyX0VRMjIsCisJCSBXTTg5NjJfRVFMX0IzX0dBSU5fU0hJRlQsIDMxLCAwLCBlcV90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiRVE0IFZvbHVtZSIsIFdNODk2Ml9FUTMsIFdNODk2Ml9FUTIzLAorCQkgV004OTYyX0VRTF9CNF9HQUlOX1NISUZULCAzMSwgMCwgZXFfdGx2KSwKK1NPQ19ET1VCTEVfUl9UTFYoIkVRNSBWb2x1bWUiLCBXTTg5NjJfRVEzLCBXTTg5NjJfRVEyMywKKwkJIFdNODk2Ml9FUUxfQjVfR0FJTl9TSElGVCwgMzEsIDAsIGVxX3RsdiksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTYyX3Nwa19tb25vX2NvbnRyb2xzW10gPSB7CkBAIC0yMTg0LDYgKzIxOTksOCBAQAogCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKKwlzdHJ1Y3Qgd204OTYyX3ByaXYgKndtODk2MiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAlpbnQgc3JjOwogCWludCBmbGw7CiAKQEAgLTIyMDMsOSArMjIyMCwxOSBAQAogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCWlmIChmbGwpCisJCWlmIChmbGwpIHsKIAkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9GTExfQ09OVFJPTF8xLAogCQkJCQkgICAgV004OTYyX0ZMTF9FTkEsIFdNODk2Ml9GTExfRU5BKTsKKwkJCWlmICh3bTg5NjItPmlycSkgeworCQkJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDUpOworCQkJCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJndtODk2Mi0+ZmxsX2xvY2ssCisJCQkJCQkJCSAgICAgIHRpbWVvdXQpOworCisJCQkJaWYgKHRpbWVvdXQgPT0gMCkKKwkJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCQkJIlRpbWVkIG91dCBzdGFydGluZyBGTExcbiIpOworCQkJfQorCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CkBAIC0yNzYzLDE4ICsyNzkwLDQ0IEBACiAJMSwgLTEsIDIsIDMsIDQsIC0xLCA2LCA4LCAtMSwgMTIsIDE2LCAyNCwgLTEsIDMyLCAzMiwgMzIKIH07CiAKK3N0YXRpYyBjb25zdCBpbnQgc3lzY2xrX3JhdGVzW10gPSB7CisJNjQsIDEyOCwgMTkyLCAyNTYsIDM4NCwgNTEyLCA3NjgsIDEwMjQsIDE0MDgsIDE1MzYsCit9OworCiBzdGF0aWMgdm9pZCB3bTg5NjJfY29uZmlndXJlX2JjbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IGRzcGNsaywgaTsKIAlpbnQgY2xvY2tpbmcyID0gMDsKKwlpbnQgY2xvY2tpbmc0ID0gMDsKIAlpbnQgYWlmMiA9IDA7CiAKLQlpZiAoIXdtODk2Mi0+YmNsaykgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJObyBCQ0xLIHJhdGUgY29uZmlndXJlZFxuIik7CisJaWYgKCF3bTg5NjItPnN5c2Nsa19yYXRlKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIk5vIFNZU0NMSyBjb25maWd1cmVkXG4iKTsKIAkJcmV0dXJuOwogCX0KIAorCWlmICghd204OTYyLT5iY2xrIHx8ICF3bTg5NjItPmxyY2xrKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIk5vIGF1ZGlvIGNsb2NrcyBjb25maWd1cmVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN5c2Nsa19yYXRlcyk7IGkrKykgeworCQlpZiAoc3lzY2xrX3JhdGVzW2ldID09IHdtODk2Mi0+c3lzY2xrX3JhdGUgLyB3bTg5NjItPmxyY2xrKSB7CisJCQljbG9ja2luZzQgfD0gaSA8PCBXTTg5NjJfU1lTQ0xLX1JBVEVfU0hJRlQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IEFSUkFZX1NJWkUoc3lzY2xrX3JhdGVzKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbnN1cHBvcnRlZCBzeXNjbGsgcmF0aW8gJWRcbiIsCisJCQl3bTg5NjItPnN5c2Nsa19yYXRlIC8gd204OTYyLT5scmNsayk7CisJCXJldHVybjsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NjJfQ0xPQ0tJTkdfNCwKKwkJCSAgICBXTTg5NjJfU1lTQ0xLX1JBVEVfTUFTSywgY2xvY2tpbmc0KTsKKwogCWRzcGNsayA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX0NMT0NLSU5HMSk7CiAJaWYgKGRzcGNsayA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgRFNQQ0xLOiAlZFxuIiwgZHNwY2xrKTsKQEAgLTI4NDQsNiArMjg5Nyw4IEBACiAJCS8qIFZNSUQgMio1MGsgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTYyX1BXUl9NR01UXzEsCiAJCQkJICAgIFdNODk2Ml9WTUlEX1NFTF9NQVNLLCAweDgwKTsKKworCQl3bTg5NjJfY29uZmlndXJlX2JjbGsoY29kZWMpOwogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CkBAIC0yODc2LDggKzI5MzEsNiBAQAogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTYyX0NMT0NLSU5HMiwKIAkJCQkJICAgIFdNODk2Ml9DTEtSRUdfT1ZELAogCQkJCQkgICAgV004OTYyX0NMS1JFR19PVkQpOwotCi0JCQl3bTg5NjJfY29uZmlndXJlX2JjbGsoY29kZWMpOwogCQl9CiAKIAkJLyogVk1JRCAyKjI1MGsgKi8KQEAgLTI5MTgsMTAgKzI5NzEsNiBAQAogCXsgOTYwMDAsIDYgfSwKIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgc3lzY2xrX3JhdGVzW10gPSB7Ci0JNjQsIDEyOCwgMTkyLCAyNTYsIDM4NCwgNTEyLCA3NjgsIDEwMjQsIDE0MDgsIDE1MzYsCi19OwotCiBzdGF0aWMgaW50IHdtODk2Ml9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCkBAIC0yOTI5LDQxICsyOTc4LDI3IEBACiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHdtODk2Ml9wcml2ICp3bTg5NjIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CiAJaW50IGk7CiAJaW50IGFpZjAgPSAwOwogCWludCBhZGN0bDMgPSAwOwotCWludCBjbG9ja2luZzQgPSAwOwogCiAJd204OTYyLT5iY2xrID0gc25kX3NvY19wYXJhbXNfdG9fYmNsayhwYXJhbXMpOwogCXdtODk2Mi0+bHJjbGsgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3JfdmFscyk7IGkrKykgewotCQlpZiAoc3JfdmFsc1tpXS5yYXRlID09IHJhdGUpIHsKKwkJaWYgKHNyX3ZhbHNbaV0ucmF0ZSA9PSB3bTg5NjItPmxyY2xrKSB7CiAJCQlhZGN0bDMgfD0gc3JfdmFsc1tpXS5yZWc7CiAJCQlicmVhazsKIAkJfQogCX0KIAlpZiAoaSA9PSBBUlJBWV9TSVpFKHNyX3ZhbHMpKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIHJhdGUgJWRIelxuIiwgcmF0ZSk7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIHJhdGUgJWRIelxuIiwgd204OTYyLT5scmNsayk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChyYXRlICUgODAwMCA9PSAwKQorCWlmICh3bTg5NjItPmxyY2xrICUgODAwMCA9PSAwKQogCQlhZGN0bDMgfD0gV004OTYyX1NBTVBMRV9SQVRFX0lOVF9NT0RFOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3lzY2xrX3JhdGVzKTsgaSsrKSB7Ci0JCWlmIChzeXNjbGtfcmF0ZXNbaV0gPT0gd204OTYyLT5zeXNjbGtfcmF0ZSAvIHJhdGUpIHsKLQkJCWNsb2NraW5nNCB8PSBpIDw8IFdNODk2Ml9TWVNDTEtfUkFURV9TSElGVDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChpID09IEFSUkFZX1NJWkUoc3lzY2xrX3JhdGVzKSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbnN1cHBvcnRlZCBzeXNjbGsgcmF0aW8gJWRcbiIsCi0JCQl3bTg5NjItPnN5c2Nsa19yYXRlIC8gcmF0ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKIAkJYnJlYWs7CkBAIC0yOTg1LDggKzMwMjAsNiBAQAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9BRERJVElPTkFMX0NPTlRST0xfMywKIAkJCSAgICBXTTg5NjJfU0FNUExFX1JBVEVfSU5UX01PREUgfAogCQkJICAgIFdNODk2Ml9TQU1QTEVfUkFURV9NQVNLLCBhZGN0bDMpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9DTE9DS0lOR180LAotCQkJICAgIFdNODk2Ml9TWVNDTEtfUkFURV9NQVNLLCBjbG9ja2luZzQpOwogCiAJd204OTYyX2NvbmZpZ3VyZV9iY2xrKGNvZGVjKTsKIApAQCAtMzI2MSwxNiArMzI5NCwzMSBAQAogCiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRkxMIGNvbmZpZ3VyZWQgZm9yICVkSHotPiVkSHpcbiIsIEZyZWYsIEZvdXQpOwogCi0JLyogVGhpcyBzaG91bGQgYmUgYSBtYXNzaXZlIG92ZXJlc3RpbWF0ZSAqLwotCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDEpOworCXJldCA9IDA7CiAKLQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJndtODk2Mi0+ZmxsX2xvY2ssIHRpbWVvdXQpOworCWlmIChmbGwxICYgV004OTYyX0ZMTF9FTkEpIHsKKwkJLyogVGhpcyBzaG91bGQgYmUgYSBtYXNzaXZlIG92ZXJlc3RpbWF0ZSBidXQgZ28gZXZlbgorCQkgKiBoaWdoZXIgaWYgd2UnbGwgZXJyb3Igb3V0CisJCSAqLworCQlpZiAod204OTYyLT5pcnEpCisJCQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyg1KTsKKwkJZWxzZQorCQkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMSk7CisKKwkJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd204OTYyLT5mbGxfbG9jaywKKwkJCQkJCSAgICAgIHRpbWVvdXQpOworCisJCWlmICh0aW1lb3V0ID09IDAgJiYgd204OTYyLT5pcnEpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIkZMTCBsb2NrIHRpbWVkIG91dCIpOworCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJfQorCX0KIAogCXdtODk2Mi0+ZmxsX2ZyZWYgPSBGcmVmOwogCXdtODk2Mi0+ZmxsX2ZvdXQgPSBGb3V0OwogCXdtODk2Mi0+ZmxsX3NyYyA9IHNvdXJjZTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgd204OTYyX211dGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBtdXRlKQpAQCAtMzczMSw4ICszNzc5LDYgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IHdtODk2Ml9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBjb250YWluZXJfb2YoY29kZWMtPmRldiwgc3RydWN0IGkyY19jbGllbnQsCi0JCQkJCSAgICAgIGRldik7CiAJdTE2ICpyZWdfY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwogCWludCBpLCB0cmlnZ2VyLCBpcnFfcG9sOwogCWJvb2wgZG1pY2NsaywgZG1pY2RhdDsKQEAgLTM4NzEsNiArMzkxNyw5IEBACiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTYyX0hQT1VUUl9WT0xVTUUsCiAJCQkgICAgV004OTYyX0hQT1VUX1ZVLCBXTTg5NjJfSFBPVVRfVlUpOwogCisJLyogU3RlcmVvIGNvbnRyb2wgZm9yIEVRICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTYyX0VRMSwgV004OTYyX0VRX1NIQVJFRF9DT0VGRiwgMCk7CisKIAl3bTg5NjJfYWRkX3dpZGdldHMoY29kZWMpOwogCiAJLyogU2F2ZSBib2FyZHMgaGF2aW5nIHRvIGRpc2FibGUgRE1JQyB3aGVuIG5vdCBpbiB1c2UgKi8KQEAgLTM4OTksNyArMzk0OCw3IEBACiAJd204OTYyX2luaXRfYmVlcChjb2RlYyk7CiAJd204OTYyX2luaXRfZ3Bpbyhjb2RlYyk7CiAKLQlpZiAoaTJjLT5pcnEpIHsKKwlpZiAod204OTYyLT5pcnEpIHsKIAkJaWYgKHBkYXRhICYmIHBkYXRhLT5pcnFfYWN0aXZlX2xvdykgewogCQkJdHJpZ2dlciA9IElSUUZfVFJJR0dFUl9MT1c7CiAJCQlpcnFfcG9sID0gV004OTYyX0lSUV9QT0w7CkBAIC0zOTExLDEyICszOTYwLDEzIEBACiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9JTlRFUlJVUFRfQ09OVFJPTCwKIAkJCQkgICAgV004OTYyX0lSUV9QT0wsIGlycV9wb2wpOwogCi0JCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGkyYy0+aXJxLCBOVUxMLCB3bTg5NjJfaXJxLAorCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh3bTg5NjItPmlycSwgTlVMTCwgd204OTYyX2lycSwKIAkJCQkJICAgdHJpZ2dlciB8IElSUUZfT05FU0hPVCwKIAkJCQkJICAgIndtODk2MiIsIGNvZGVjKTsKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJUlEgJWQ6ICVkXG4iLAotCQkJCWkyYy0+aXJxLCByZXQpOworCQkJCXdtODk2Mi0+aXJxLCByZXQpOworCQkJd204OTYyLT5pcnEgPSAwOwogCQkJLyogTm9uLWZhdGFsICovCiAJCX0gZWxzZSB7CiAJCQkvKiBFbmFibGUgc29tZSBJUlFzIGJ5IGRlZmF1bHQgKi8KQEAgLTM5NDEsMTIgKzM5OTEsMTAgQEAKIHN0YXRpYyBpbnQgd204OTYyX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODk2Ml9wcml2ICp3bTg5NjIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gY29udGFpbmVyX29mKGNvZGVjLT5kZXYsIHN0cnVjdCBpMmNfY2xpZW50LAotCQkJCQkgICAgICBkZXYpOwogCWludCBpOwogCi0JaWYgKGkyYy0+aXJxKQotCQlmcmVlX2lycShpMmMtPmlycSwgY29kZWMpOworCWlmICh3bTg5NjItPmlycSkKKwkJZnJlZV9pcnEod204OTYyLT5pcnEsIGNvZGVjKTsKIAogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmd204OTYyLT5taWNfd29yayk7CiAKQEAgLTM5ODYsNiArNDAzNCw4IEBACiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB3bTg5NjIpOwogCisJd204OTYyLT5pcnEgPSBpMmMtPmlycTsKKwogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LAogCQkJCSAgICAgJnNvY19jb2RlY19kZXZfd204OTYyLCAmd204OTYyX2RhaSwgMSk7CiAJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk4My5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2YwNGVjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYwpAQCAtMCwwICsxLDEyMDMgQEAKKy8qCisgKiB3bTg5ODMuYyAgLS0gIFdNODk4MyBBTFNBIFNvQyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKgorICogQXV0aG9yOiBEaW1pdHJpcyBQYXBhc3RhbW9zIDxkcEBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJ3bTg5ODMuaCIKKworc3RhdGljIGNvbnN0IHUxNiB3bTg5ODNfcmVnX2RlZnNbV004OTgzX01BWF9SRUdJU1RFUiArIDFdID0geworCVsweDAwXSA9IDB4MDAwMCwgICAgIC8qIFIwICAtIFNvZnR3YXJlIFJlc2V0ICovCisJWzB4MDFdID0gMHgwMDAwLCAgICAgLyogUjEgIC0gUG93ZXIgbWFuYWdlbWVudCAxICovCisJWzB4MDJdID0gMHgwMDAwLCAgICAgLyogUjIgIC0gUG93ZXIgbWFuYWdlbWVudCAyICovCisJWzB4MDNdID0gMHgwMDAwLCAgICAgLyogUjMgIC0gUG93ZXIgbWFuYWdlbWVudCAzICovCisJWzB4MDRdID0gMHgwMDUwLCAgICAgLyogUjQgIC0gQXVkaW8gSW50ZXJmYWNlICovCisJWzB4MDVdID0gMHgwMDAwLCAgICAgLyogUjUgIC0gQ29tcGFuZGluZyBjb250cm9sICovCisJWzB4MDZdID0gMHgwMTQwLCAgICAgLyogUjYgIC0gQ2xvY2sgR2VuIGNvbnRyb2wgKi8KKwlbMHgwN10gPSAweDAwMDAsICAgICAvKiBSNyAgLSBBZGRpdGlvbmFsIGNvbnRyb2wgKi8KKwlbMHgwOF0gPSAweDAwMDAsICAgICAvKiBSOCAgLSBHUElPIENvbnRyb2wgKi8KKwlbMHgwOV0gPSAweDAwMDAsICAgICAvKiBSOSAgLSBKYWNrIERldGVjdCBDb250cm9sIDEgKi8KKwlbMHgwQV0gPSAweDAwMDAsICAgICAvKiBSMTAgLSBEQUMgQ29udHJvbCAqLworCVsweDBCXSA9IDB4MDBGRiwgICAgIC8qIFIxMSAtIExlZnQgREFDIGRpZ2l0YWwgVm9sICovCisJWzB4MENdID0gMHgwMEZGLCAgICAgLyogUjEyIC0gUmlnaHQgREFDIGRpZ2l0YWwgdm9sICovCisJWzB4MERdID0gMHgwMDAwLCAgICAgLyogUjEzIC0gSmFjayBEZXRlY3QgQ29udHJvbCAyICovCisJWzB4MEVdID0gMHgwMTAwLCAgICAgLyogUjE0IC0gQURDIENvbnRyb2wgKi8KKwlbMHgwRl0gPSAweDAwRkYsICAgICAvKiBSMTUgLSBMZWZ0IEFEQyBEaWdpdGFsIFZvbCAqLworCVsweDEwXSA9IDB4MDBGRiwgICAgIC8qIFIxNiAtIFJpZ2h0IEFEQyBEaWdpdGFsIFZvbCAqLworCVsweDEyXSA9IDB4MDEyQywgICAgIC8qIFIxOCAtIEVRMSAtIGxvdyBzaGVsZiAqLworCVsweDEzXSA9IDB4MDAyQywgICAgIC8qIFIxOSAtIEVRMiAtIHBlYWsgMSAqLworCVsweDE0XSA9IDB4MDAyQywgICAgIC8qIFIyMCAtIEVRMyAtIHBlYWsgMiAqLworCVsweDE1XSA9IDB4MDAyQywgICAgIC8qIFIyMSAtIEVRNCAtIHBlYWsgMyAqLworCVsweDE2XSA9IDB4MDAyQywgICAgIC8qIFIyMiAtIEVRNSAtIGhpZ2ggc2hlbGYgKi8KKwlbMHgxOF0gPSAweDAwMzIsICAgICAvKiBSMjQgLSBEQUMgTGltaXRlciAxICovCisJWzB4MTldID0gMHgwMDAwLCAgICAgLyogUjI1IC0gREFDIExpbWl0ZXIgMiAqLworCVsweDFCXSA9IDB4MDAwMCwgICAgIC8qIFIyNyAtIE5vdGNoIEZpbHRlciAxICovCisJWzB4MUNdID0gMHgwMDAwLCAgICAgLyogUjI4IC0gTm90Y2ggRmlsdGVyIDIgKi8KKwlbMHgxRF0gPSAweDAwMDAsICAgICAvKiBSMjkgLSBOb3RjaCBGaWx0ZXIgMyAqLworCVsweDFFXSA9IDB4MDAwMCwgICAgIC8qIFIzMCAtIE5vdGNoIEZpbHRlciA0ICovCisJWzB4MjBdID0gMHgwMDM4LCAgICAgLyogUjMyIC0gQUxDIGNvbnRyb2wgMSAqLworCVsweDIxXSA9IDB4MDAwQiwgICAgIC8qIFIzMyAtIEFMQyBjb250cm9sIDIgKi8KKwlbMHgyMl0gPSAweDAwMzIsICAgICAvKiBSMzQgLSBBTEMgY29udHJvbCAzICovCisJWzB4MjNdID0gMHgwMDAwLCAgICAgLyogUjM1IC0gTm9pc2UgR2F0ZSAqLworCVsweDI0XSA9IDB4MDAwOCwgICAgIC8qIFIzNiAtIFBMTCBOICovCisJWzB4MjVdID0gMHgwMDBDLCAgICAgLyogUjM3IC0gUExMIEsgMSAqLworCVsweDI2XSA9IDB4MDA5MywgICAgIC8qIFIzOCAtIFBMTCBLIDIgKi8KKwlbMHgyN10gPSAweDAwRTksICAgICAvKiBSMzkgLSBQTEwgSyAzICovCisJWzB4MjldID0gMHgwMDAwLCAgICAgLyogUjQxIC0gM0QgY29udHJvbCAqLworCVsweDJBXSA9IDB4MDAwMCwgICAgIC8qIFI0MiAtIE9VVDQgdG8gQURDICovCisJWzB4MkJdID0gMHgwMDAwLCAgICAgLyogUjQzIC0gQmVlcCBjb250cm9sICovCisJWzB4MkNdID0gMHgwMDMzLCAgICAgLyogUjQ0IC0gSW5wdXQgY3RybCAqLworCVsweDJEXSA9IDB4MDAxMCwgICAgIC8qIFI0NSAtIExlZnQgSU5QIFBHQSBnYWluIGN0cmwgKi8KKwlbMHgyRV0gPSAweDAwMTAsICAgICAvKiBSNDYgLSBSaWdodCBJTlAgUEdBIGdhaW4gY3RybCAqLworCVsweDJGXSA9IDB4MDEwMCwgICAgIC8qIFI0NyAtIExlZnQgQURDIEJPT1NUIGN0cmwgKi8KKwlbMHgzMF0gPSAweDAxMDAsICAgICAvKiBSNDggLSBSaWdodCBBREMgQk9PU1QgY3RybCAqLworCVsweDMxXSA9IDB4MDAwMiwgICAgIC8qIFI0OSAtIE91dHB1dCBjdHJsICovCisJWzB4MzJdID0gMHgwMDAxLCAgICAgLyogUjUwIC0gTGVmdCBtaXhlciBjdHJsICovCisJWzB4MzNdID0gMHgwMDAxLCAgICAgLyogUjUxIC0gUmlnaHQgbWl4ZXIgY3RybCAqLworCVsweDM0XSA9IDB4MDAzOSwgICAgIC8qIFI1MiAtIExPVVQxIChIUCkgdm9sdW1lIGN0cmwgKi8KKwlbMHgzNV0gPSAweDAwMzksICAgICAvKiBSNTMgLSBST1VUMSAoSFApIHZvbHVtZSBjdHJsICovCisJWzB4MzZdID0gMHgwMDM5LCAgICAgLyogUjU0IC0gTE9VVDIgKFNQSykgdm9sdW1lIGN0cmwgKi8KKwlbMHgzN10gPSAweDAwMzksICAgICAvKiBSNTUgLSBST1VUMiAoU1BLKSB2b2x1bWUgY3RybCAqLworCVsweDM4XSA9IDB4MDAwMSwgICAgIC8qIFI1NiAtIE9VVDMgbWl4ZXIgY3RybCAqLworCVsweDM5XSA9IDB4MDAwMSwgICAgIC8qIFI1NyAtIE9VVDQgKE1PTk8pIG1peCBjdHJsICovCisJWzB4M0RdID0gMHgwMDAwICAgICAgLyogUjYxIC0gQklBUyBDVFJMICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdtODk4M19yZWdfYWNjZXNzIHsKKwl1MTYgcmVhZDsgLyogTWFzayBvZiByZWFkYWJsZSBiaXRzICovCisJdTE2IHdyaXRlOyAvKiBNYXNrIG9mIHdyaXRhYmxlIGJpdHMgKi8KK30gd204OTgzX2FjY2Vzc19tYXNrc1tXTTg5ODNfTUFYX1JFR0lTVEVSICsgMV0gPSB7CisJWzB4MDBdID0geyAweDAwMDAsIDB4MDFGRiB9LCAvKiBSMCAgLSBTb2Z0d2FyZSBSZXNldCAqLworCVsweDAxXSA9IHsgMHgwMDAwLCAweDAxRkYgfSwgLyogUjEgIC0gUG93ZXIgbWFuYWdlbWVudCAxICovCisJWzB4MDJdID0geyAweDAwMDAsIDB4MDFGRiB9LCAvKiBSMiAgLSBQb3dlciBtYW5hZ2VtZW50IDIgKi8KKwlbMHgwM10gPSB7IDB4MDAwMCwgMHgwMUVGIH0sIC8qIFIzICAtIFBvd2VyIG1hbmFnZW1lbnQgMyAqLworCVsweDA0XSA9IHsgMHgwMDAwLCAweDAxRkYgfSwgLyogUjQgIC0gQXVkaW8gSW50ZXJmYWNlICovCisJWzB4MDVdID0geyAweDAwMDAsIDB4MDAzRiB9LCAvKiBSNSAgLSBDb21wYW5kaW5nIGNvbnRyb2wgKi8KKwlbMHgwNl0gPSB7IDB4MDAwMCwgMHgwMUZEIH0sIC8qIFI2ICAtIENsb2NrIEdlbiBjb250cm9sICovCisJWzB4MDddID0geyAweDAwMDAsIDB4MDAwRiB9LCAvKiBSNyAgLSBBZGRpdGlvbmFsIGNvbnRyb2wgKi8KKwlbMHgwOF0gPSB7IDB4MDAwMCwgMHgwMDNGIH0sIC8qIFI4ICAtIEdQSU8gQ29udHJvbCAqLworCVsweDA5XSA9IHsgMHgwMDAwLCAweDAwNzAgfSwgLyogUjkgIC0gSmFjayBEZXRlY3QgQ29udHJvbCAxICovCisJWzB4MEFdID0geyAweDAwMDAsIDB4MDA0RiB9LCAvKiBSMTAgLSBEQUMgQ29udHJvbCAqLworCVsweDBCXSA9IHsgMHgwMDAwLCAweDAxRkYgfSwgLyogUjExIC0gTGVmdCBEQUMgZGlnaXRhbCBWb2wgKi8KKwlbMHgwQ10gPSB7IDB4MDAwMCwgMHgwMUZGIH0sIC8qIFIxMiAtIFJpZ2h0IERBQyBkaWdpdGFsIHZvbCAqLworCVsweDBEXSA9IHsgMHgwMDAwLCAweDAwRkYgfSwgLyogUjEzIC0gSmFjayBEZXRlY3QgQ29udHJvbCAyICovCisJWzB4MEVdID0geyAweDAwMDAsIDB4MDFGQiB9LCAvKiBSMTQgLSBBREMgQ29udHJvbCAqLworCVsweDBGXSA9IHsgMHgwMDAwLCAweDAxRkYgfSwgLyogUjE1IC0gTGVmdCBBREMgRGlnaXRhbCBWb2wgKi8KKwlbMHgxMF0gPSB7IDB4MDAwMCwgMHgwMUZGIH0sIC8qIFIxNiAtIFJpZ2h0IEFEQyBEaWdpdGFsIFZvbCAqLworCVsweDEyXSA9IHsgMHgwMDAwLCAweDAxN0YgfSwgLyogUjE4IC0gRVExIC0gbG93IHNoZWxmICovCisJWzB4MTNdID0geyAweDAwMDAsIDB4MDE3RiB9LCAvKiBSMTkgLSBFUTIgLSBwZWFrIDEgKi8KKwlbMHgxNF0gPSB7IDB4MDAwMCwgMHgwMTdGIH0sIC8qIFIyMCAtIEVRMyAtIHBlYWsgMiAqLworCVsweDE1XSA9IHsgMHgwMDAwLCAweDAxN0YgfSwgLyogUjIxIC0gRVE0IC0gcGVhayAzICovCisJWzB4MTZdID0geyAweDAwMDAsIDB4MDA3RiB9LCAvKiBSMjIgLSBFUTUgLSBoaWdoIHNoZWxmICovCisJWzB4MThdID0geyAweDAwMDAsIDB4MDFGRiB9LCAvKiBSMjQgLSBEQUMgTGltaXRlciAxICovCisJWzB4MTldID0geyAweDAwMDAsIDB4MDA3RiB9LCAvKiBSMjUgLSBEQUMgTGltaXRlciAyICovCisJWzB4MUJdID0geyAweDAwMDAsIDB4MDFGRiB9LCAvKiBSMjcgLSBOb3RjaCBGaWx0ZXIgMSAqLworCVsweDFDXSA9IHsgMHgwMDAwLCAweDAxN0YgfSwgLyogUjI4IC0gTm90Y2ggRmlsdGVyIDIgKi8KKwlbMHgxRF0gPSB7IDB4MDAwMCwgMHgwMTdGIH0sIC8qIFIyOSAtIE5vdGNoIEZpbHRlciAzICovCisJWzB4MUVdID0geyAweDAwMDAsIDB4MDE3RiB9LCAvKiBSMzAgLSBOb3RjaCBGaWx0ZXIgNCAqLworCVsweDIwXSA9IHsgMHgwMDAwLCAweDAxQkYgfSwgLyogUjMyIC0gQUxDIGNvbnRyb2wgMSAqLworCVsweDIxXSA9IHsgMHgwMDAwLCAweDAwRkYgfSwgLyogUjMzIC0gQUxDIGNvbnRyb2wgMiAqLworCVsweDIyXSA9IHsgMHgwMDAwLCAweDAxRkYgfSwgLyogUjM0IC0gQUxDIGNvbnRyb2wgMyAqLworCVsweDIzXSA9IHsgMHgwMDAwLCAweDAwMEYgfSwgLyogUjM1IC0gTm9pc2UgR2F0ZSAqLworCVsweDI0XSA9IHsgMHgwMDAwLCAweDAwMUYgfSwgLyogUjM2IC0gUExMIE4gKi8KKwlbMHgyNV0gPSB7IDB4MDAwMCwgMHgwMDNGIH0sIC8qIFIzNyAtIFBMTCBLIDEgKi8KKwlbMHgyNl0gPSB7IDB4MDAwMCwgMHgwMUZGIH0sIC8qIFIzOCAtIFBMTCBLIDIgKi8KKwlbMHgyN10gPSB7IDB4MDAwMCwgMHgwMUZGIH0sIC8qIFIzOSAtIFBMTCBLIDMgKi8KKwlbMHgyOV0gPSB7IDB4MDAwMCwgMHgwMDBGIH0sIC8qIFI0MSAtIDNEIGNvbnRyb2wgKi8KKwlbMHgyQV0gPSB7IDB4MDAwMCwgMHgwMUU3IH0sIC8qIFI0MiAtIE9VVDQgdG8gQURDICovCisJWzB4MkJdID0geyAweDAwMDAsIDB4MDFCRiB9LCAvKiBSNDMgLSBCZWVwIGNvbnRyb2wgKi8KKwlbMHgyQ10gPSB7IDB4MDAwMCwgMHgwMTc3IH0sIC8qIFI0NCAtIElucHV0IGN0cmwgKi8KKwlbMHgyRF0gPSB7IDB4MDAwMCwgMHgwMUZGIH0sIC8qIFI0NSAtIExlZnQgSU5QIFBHQSBnYWluIGN0cmwgKi8KKwlbMHgyRV0gPSB7IDB4MDAwMCwgMHgwMUZGIH0sIC8qIFI0NiAtIFJpZ2h0IElOUCBQR0EgZ2FpbiBjdHJsICovCisJWzB4MkZdID0geyAweDAwMDAsIDB4MDE3NyB9LCAvKiBSNDcgLSBMZWZ0IEFEQyBCT09TVCBjdHJsICovCisJWzB4MzBdID0geyAweDAwMDAsIDB4MDE3NyB9LCAvKiBSNDggLSBSaWdodCBBREMgQk9PU1QgY3RybCAqLworCVsweDMxXSA9IHsgMHgwMDAwLCAweDAwN0YgfSwgLyogUjQ5IC0gT3V0cHV0IGN0cmwgKi8KKwlbMHgzMl0gPSB7IDB4MDAwMCwgMHgwMUZGIH0sIC8qIFI1MCAtIExlZnQgbWl4ZXIgY3RybCAqLworCVsweDMzXSA9IHsgMHgwMDAwLCAweDAxRkYgfSwgLyogUjUxIC0gUmlnaHQgbWl4ZXIgY3RybCAqLworCVsweDM0XSA9IHsgMHgwMDAwLCAweDAxRkYgfSwgLyogUjUyIC0gTE9VVDEgKEhQKSB2b2x1bWUgY3RybCAqLworCVsweDM1XSA9IHsgMHgwMDAwLCAweDAxRkYgfSwgLyogUjUzIC0gUk9VVDEgKEhQKSB2b2x1bWUgY3RybCAqLworCVsweDM2XSA9IHsgMHgwMDAwLCAweDAxRkYgfSwgLyogUjU0IC0gTE9VVDIgKFNQSykgdm9sdW1lIGN0cmwgKi8KKwlbMHgzN10gPSB7IDB4MDAwMCwgMHgwMUZGIH0sIC8qIFI1NSAtIFJPVVQyIChTUEspIHZvbHVtZSBjdHJsICovCisJWzB4MzhdID0geyAweDAwMDAsIDB4MDA0RiB9LCAvKiBSNTYgLSBPVVQzIG1peGVyIGN0cmwgKi8KKwlbMHgzOV0gPSB7IDB4MDAwMCwgMHgwMEZGIH0sIC8qIFI1NyAtIE9VVDQgKE1PTk8pIG1peCBjdHJsICovCisJWzB4M0RdID0geyAweDAwMDAsIDB4MDEwMCB9ICAvKiBSNjEgLSBCSUFTIENUUkwgKi8KK307CisKKy8qIHZvbC9nYWluIHVwZGF0ZSByZWdzICovCitzdGF0aWMgY29uc3QgaW50IHZvbF91cGRhdGVfcmVnc1tdID0geworCVdNODk4M19MRUZUX0RBQ19ESUdJVEFMX1ZPTCwKKwlXTTg5ODNfUklHSFRfREFDX0RJR0lUQUxfVk9MLAorCVdNODk4M19MRUZUX0FEQ19ESUdJVEFMX1ZPTCwKKwlXTTg5ODNfUklHSFRfQURDX0RJR0lUQUxfVk9MLAorCVdNODk4M19MT1VUMV9IUF9WT0xVTUVfQ1RSTCwKKwlXTTg5ODNfUk9VVDFfSFBfVk9MVU1FX0NUUkwsCisJV004OTgzX0xPVVQyX1NQS19WT0xVTUVfQ1RSTCwKKwlXTTg5ODNfUk9VVDJfU1BLX1ZPTFVNRV9DVFJMLAorCVdNODk4M19MRUZUX0lOUF9QR0FfR0FJTl9DVFJMLAorCVdNODk4M19SSUdIVF9JTlBfUEdBX0dBSU5fQ1RSTAorfTsKKworc3RydWN0IHdtODk4M19wcml2IHsKKwllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKKwl1MzIgc3lzY2xrOworCXUzMiBiY2xrOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IGRpdjsKKwlpbnQgcmF0aW87Cit9IGZzX3JhdGlvc1tdID0geworCXsgMTAsIDEyOCB9LAorCXsgMTUsIDE5MiB9LAorCXsgMjAsIDI1NiB9LAorCXsgMzAsIDM4NCB9LAorCXsgNDAsIDUxMiB9LAorCXsgNjAsIDc2OCB9LAorCXsgODAsIDEwMjQgfSwKKwl7IDEyMCwgMTUzNiB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IHNyYXRlc1tdID0geyA0ODAwMCwgMzIwMDAsIDI0MDAwLCAxNjAwMCwgMTIwMDAsIDgwMDAgfTsKKworc3RhdGljIGNvbnN0IGludCBiY2xrX2RpdnNbXSA9IHsKKwkxLCAyLCA0LCA4LCAxNiwgMzIKK307CisKK3N0YXRpYyBpbnQgZXFtb2RlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworc3RhdGljIGludCBlcW1vZGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYWNfdGx2LCAtMTI3MDAsIDUwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGNfdGx2LCAtMTI3MDAsIDUwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShvdXRfdGx2LCAtNTcwMCwgMTAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShsaW1fdGhyZXNoX3RsdiwgLTYwMCwgMTAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShsaW1fYm9vc3RfdGx2LCAwLCAxMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFsY19taW5fdGx2LCAtMTIwMCwgNjAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhbGNfbWF4X3RsdiwgLTY3NSwgNjAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhbGNfdGFyX3RsdiwgLTIyNTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUocGdhX3ZvbF90bHYsIC0xMjAwLCA3NSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYm9vc3RfdGx2LCAtMTIwMCwgMzAwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShlcV90bHYsIC0xMjAwLCAxMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGF1eF90bHYsIC0xNTAwLCAzMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGJ5cGFzc190bHYsIC0xNTAwLCAzMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHBnYV9ib29zdF90bHYsIDAsIDIwMDAsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqYWxjX3NlbF90ZXh0W10gPSB7ICJPZmYiLCAiUmlnaHQiLCAiTGVmdCIsICJTdGVyZW8iIH07CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX3NlbCwgV004OTgzX0FMQ19DT05UUk9MXzEsIDcsCisJCQkJICBhbGNfc2VsX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqYWxjX21vZGVfdGV4dFtdID0geyAiQUxDIiwgIkxpbWl0ZXIiIH07CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWxjX21vZGUsIFdNODk4M19BTENfQ09OVFJPTF8zLCA4LAorCQkJCSAgYWxjX21vZGVfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpmaWx0ZXJfbW9kZV90ZXh0W10gPSB7ICJBdWRpbyIsICJBcHBsaWNhdGlvbiIgfTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChmaWx0ZXJfbW9kZSwgV004OTgzX0FEQ19DT05UUk9MLCA3LAorCQkJCSAgZmlsdGVyX21vZGVfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICplcV9id190ZXh0W10gPSB7ICJOYXJyb3ciLCAiV2lkZSIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICplcW1vZGVfdGV4dFtdID0geyAiQ2FwdHVyZSIsICJQbGF5YmFjayIgfTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woZXFtb2RlLCBlcW1vZGVfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICplcTFfY3V0b2ZmX3RleHRbXSA9IHsKKwkiODBIeiIsICIxMDVIeiIsICIxMzVIeiIsICIxNzVIeiIKK307CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXExX2N1dG9mZiwgV004OTgzX0VRMV9MT1dfU0hFTEYsIDUsCisJCQkJICBlcTFfY3V0b2ZmX3RleHQpOworc3RhdGljIGNvbnN0IGNoYXIgKmVxMl9jdXRvZmZfdGV4dFtdID0geworCSIyMzBIeiIsICIzMDBIeiIsICIzODVIeiIsICI1MDBIeiIKK307CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEyX2J3LCBXTTg5ODNfRVEyX1BFQUtfMSwgOCwgZXFfYndfdGV4dCk7CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXEyX2N1dG9mZiwgV004OTgzX0VRMl9QRUFLXzEsIDUsCisJCQkJICBlcTJfY3V0b2ZmX3RleHQpOworc3RhdGljIGNvbnN0IGNoYXIgKmVxM19jdXRvZmZfdGV4dFtdID0geworCSI2NTBIeiIsICI4NTBIeiIsICIxLjFrSHoiLCAiMS40a0h6IgorfTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTNfYncsIFdNODk4M19FUTNfUEVBS18yLCA4LCBlcV9id190ZXh0KTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChlcTNfY3V0b2ZmLCBXTTg5ODNfRVEzX1BFQUtfMiwgNSwKKwkJCQkgIGVxM19jdXRvZmZfdGV4dCk7CitzdGF0aWMgY29uc3QgY2hhciAqZXE0X2N1dG9mZl90ZXh0W10gPSB7CisJIjEuOGtIeiIsICIyLjRrSHoiLCAiMy4ya0h6IiwgIjQuMWtIeiIKK307CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0X2J3LCBXTTg5ODNfRVE0X1BFQUtfMywgOCwgZXFfYndfdGV4dCk7CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE0X2N1dG9mZiwgV004OTgzX0VRNF9QRUFLXzMsIDUsCisJCQkJICBlcTRfY3V0b2ZmX3RleHQpOworc3RhdGljIGNvbnN0IGNoYXIgKmVxNV9jdXRvZmZfdGV4dFtdID0geworCSI1LjNrSHoiLCAiNi45a0h6IiwgIjlrSHoiLCAiMTEuN2tIeiIKK307CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZXE1X2N1dG9mZiwgV004OTgzX0VRNV9ISUdIX1NIRUxGLCA1LAorCQkJCSAgZXE1X2N1dG9mZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnNwZWFrZXJfbW9kZV90ZXh0W10gPSB7ICJDbGFzcyBBL0IiLCAiQ2xhc3MgRCIgfTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChzcGVha2VyX21vZGUsIDB4MTcsIDgsIHNwZWFrZXJfbW9kZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRlcHRoXzNkX3RleHRbXSA9IHsKKwkiT2ZmIiwKKwkiNi42NyUiLAorCSIxMy4zJSIsCisJIjIwJSIsCisJIjI2LjclIiwKKwkiMzMuMyUiLAorCSI0MCUiLAorCSI0Ni42JSIsCisJIjUzLjMlIiwKKwkiNjAlIiwKKwkiNjYuNyUiLAorCSI3My4zJSIsCisJIjgwJSIsCisJIjg2LjclIiwKKwkiOTMuMyUiLAorCSIxMDAlIgorfTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChkZXB0aF8zZCwgV004OTgzXzNEX0NPTlRST0wsIDAsCisJCQkJICBkZXB0aF8zZF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk4M19zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFKCJEaWdpdGFsIExvb3BiYWNrIFN3aXRjaCIsIFdNODk4M19DT01QQU5ESU5HX0NPTlRST0wsCisJCSAgIDAsIDEsIDApLAorCisJU09DX0VOVU0oIkFMQyBDYXB0dXJlIEZ1bmN0aW9uIiwgYWxjX3NlbCksCisJU09DX1NJTkdMRV9UTFYoIkFMQyBDYXB0dXJlIE1heCBWb2x1bWUiLCBXTTg5ODNfQUxDX0NPTlRST0xfMSwKKwkJICAgICAgIDMsIDcsIDAsIGFsY19tYXhfdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiQUxDIENhcHR1cmUgTWluIFZvbHVtZSIsIFdNODk4M19BTENfQ09OVFJPTF8xLAorCQkgICAgICAgMCwgNywgMCwgYWxjX21pbl90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJBTEMgQ2FwdHVyZSBUYXJnZXQgVm9sdW1lIiwgV004OTgzX0FMQ19DT05UUk9MXzIsCisJCSAgICAgICAwLCAxNSwgMCwgYWxjX3Rhcl90bHYpLAorCVNPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIEF0dGFjayIsIFdNODk4M19BTENfQ09OVFJPTF8zLCAwLCAxMCwgMCksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgSG9sZCIsIFdNODk4M19BTENfQ09OVFJPTF8yLCA0LCAxMCwgMCksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgRGVjYXkiLCBXTTg5ODNfQUxDX0NPTlRST0xfMywgNCwgMTAsIDApLAorCVNPQ19FTlVNKCJBTEMgTW9kZSIsIGFsY19tb2RlKSwKKwlTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBORyBTd2l0Y2giLCBXTTg5ODNfTk9JU0VfR0FURSwKKwkJICAgMywgMSwgMCksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgTkcgVGhyZXNob2xkIiwgV004OTgzX05PSVNFX0dBVEUsCisJCSAgIDAsIDcsIDEpLAorCisJU09DX0RPVUJMRV9SX1RMVigiQ2FwdHVyZSBWb2x1bWUiLCBXTTg5ODNfTEVGVF9BRENfRElHSVRBTF9WT0wsCisJCQkgV004OTgzX1JJR0hUX0FEQ19ESUdJVEFMX1ZPTCwgMCwgMjU1LCAwLCBhZGNfdGx2KSwKKwlTT0NfRE9VQkxFX1IoIkNhcHR1cmUgUEdBIFpDIFN3aXRjaCIsIFdNODk4M19MRUZUX0lOUF9QR0FfR0FJTl9DVFJMLAorCQkgICAgIFdNODk4M19SSUdIVF9JTlBfUEdBX0dBSU5fQ1RSTCwgNywgMSwgMCksCisJU09DX0RPVUJMRV9SX1RMVigiQ2FwdHVyZSBQR0EgVm9sdW1lIiwgV004OTgzX0xFRlRfSU5QX1BHQV9HQUlOX0NUUkwsCisJCQkgV004OTgzX1JJR0hUX0lOUF9QR0FfR0FJTl9DVFJMLCAwLCA2MywgMCwgcGdhX3ZvbF90bHYpLAorCisJU09DX0RPVUJMRV9SX1RMVigiQ2FwdHVyZSBQR0EgQm9vc3QgVm9sdW1lIiwKKwkJCSBXTTg5ODNfTEVGVF9BRENfQk9PU1RfQ1RSTCwgV004OTgzX1JJR0hUX0FEQ19CT09TVF9DVFJMLAorCQkJIDgsIDEsIDAsIHBnYV9ib29zdF90bHYpLAorCisJU09DX0RPVUJMRSgiQURDIEludmVyc2lvbiBTd2l0Y2giLCBXTTg5ODNfQURDX0NPTlRST0wsIDAsIDEsIDEsIDApLAorCVNPQ19TSU5HTEUoIkFEQyAxMjh4IE92ZXJzYW1wbGluZyBTd2l0Y2giLCBXTTg5ODNfQURDX0NPTlRST0wsIDgsIDEsIDApLAorCisJU09DX0RPVUJMRV9SX1RMVigiUGxheWJhY2sgVm9sdW1lIiwgV004OTgzX0xFRlRfREFDX0RJR0lUQUxfVk9MLAorCQkJIFdNODk4M19SSUdIVF9EQUNfRElHSVRBTF9WT0wsIDAsIDI1NSwgMCwgZGFjX3RsdiksCisKKwlTT0NfU0lOR0xFKCJEQUMgUGxheWJhY2sgTGltaXRlciBTd2l0Y2giLCBXTTg5ODNfREFDX0xJTUlURVJfMSwgOCwgMSwgMCksCisJU09DX1NJTkdMRSgiREFDIFBsYXliYWNrIExpbWl0ZXIgRGVjYXkiLCBXTTg5ODNfREFDX0xJTUlURVJfMSwgNCwgMTAsIDApLAorCVNPQ19TSU5HTEUoIkRBQyBQbGF5YmFjayBMaW1pdGVyIEF0dGFjayIsIFdNODk4M19EQUNfTElNSVRFUl8xLCAwLCAxMSwgMCksCisJU09DX1NJTkdMRV9UTFYoIkRBQyBQbGF5YmFjayBMaW1pdGVyIFRocmVzaG9sZCIsIFdNODk4M19EQUNfTElNSVRFUl8yLAorCQkgICAgICAgNCwgNywgMSwgbGltX3RocmVzaF90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJEQUMgUGxheWJhY2sgTGltaXRlciBCb29zdCBWb2x1bWUiLCBXTTg5ODNfREFDX0xJTUlURVJfMiwKKwkJICAgICAgIDAsIDEyLCAwLCBsaW1fYm9vc3RfdGx2KSwKKwlTT0NfRE9VQkxFKCJEQUMgSW52ZXJzaW9uIFN3aXRjaCIsIFdNODk4M19EQUNfQ09OVFJPTCwgMCwgMSwgMSwgMCksCisJU09DX1NJTkdMRSgiREFDIEF1dG8gTXV0ZSBTd2l0Y2giLCBXTTg5ODNfREFDX0NPTlRST0wsIDIsIDEsIDApLAorCVNPQ19TSU5HTEUoIkRBQyAxMjh4IE92ZXJzYW1wbGluZyBTd2l0Y2giLCBXTTg5ODNfREFDX0NPTlRST0wsIDMsIDEsIDApLAorCisJU09DX0RPVUJMRV9SX1RMVigiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIFdNODk4M19MT1VUMV9IUF9WT0xVTUVfQ1RSTCwKKwkJCSBXTTg5ODNfUk9VVDFfSFBfVk9MVU1FX0NUUkwsIDAsIDYzLCAwLCBvdXRfdGx2KSwKKwlTT0NfRE9VQkxFX1IoIkhlYWRwaG9uZSBQbGF5YmFjayBaQyBTd2l0Y2giLCBXTTg5ODNfTE9VVDFfSFBfVk9MVU1FX0NUUkwsCisJCSAgICAgV004OTgzX1JPVVQxX0hQX1ZPTFVNRV9DVFJMLCA3LCAxLCAwKSwKKwlTT0NfRE9VQkxFX1IoIkhlYWRwaG9uZSBTd2l0Y2giLCBXTTg5ODNfTE9VVDFfSFBfVk9MVU1FX0NUUkwsCisJCSAgICAgV004OTgzX1JPVVQxX0hQX1ZPTFVNRV9DVFJMLCA2LCAxLCAxKSwKKworCVNPQ19ET1VCTEVfUl9UTFYoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgV004OTgzX0xPVVQyX1NQS19WT0xVTUVfQ1RSTCwKKwkJCSBXTTg5ODNfUk9VVDJfU1BLX1ZPTFVNRV9DVFJMLCAwLCA2MywgMCwgb3V0X3RsdiksCisJU09DX0RPVUJMRV9SKCJTcGVha2VyIFBsYXliYWNrIFpDIFN3aXRjaCIsIFdNODk4M19MT1VUMl9TUEtfVk9MVU1FX0NUUkwsCisJCSAgICAgV004OTgzX1JPVVQyX1NQS19WT0xVTUVfQ1RSTCwgNywgMSwgMCksCisJU09DX0RPVUJMRV9SKCJTcGVha2VyIFN3aXRjaCIsIFdNODk4M19MT1VUMl9TUEtfVk9MVU1FX0NUUkwsCisJCSAgICAgV004OTgzX1JPVVQyX1NQS19WT0xVTUVfQ1RSTCwgNiwgMSwgMSksCisKKwlTT0NfU0lOR0xFKCJPVVQzIFN3aXRjaCIsIFdNODk4M19PVVQzX01JWEVSX0NUUkwsCisJCSAgIDYsIDEsIDEpLAorCisJU09DX1NJTkdMRSgiT1VUNCBTd2l0Y2giLCBXTTg5ODNfT1VUNF9NT05PX01JWF9DVFJMLAorCQkgICA2LCAxLCAxKSwKKworCVNPQ19TSU5HTEUoIkhpZ2ggUGFzcyBGaWx0ZXIgU3dpdGNoIiwgV004OTgzX0FEQ19DT05UUk9MLCA4LCAxLCAwKSwKKwlTT0NfRU5VTSgiSGlnaCBQYXNzIEZpbHRlciBNb2RlIiwgZmlsdGVyX21vZGUpLAorCVNPQ19TSU5HTEUoIkhpZ2ggUGFzcyBGaWx0ZXIgQ3V0b2ZmIiwgV004OTgzX0FEQ19DT05UUk9MLCA0LCA3LCAwKSwKKworCVNPQ19ET1VCTEVfUl9UTFYoIkF1eCBCeXBhc3MgVm9sdW1lIiwKKwkJCSBXTTg5ODNfTEVGVF9NSVhFUl9DVFJMLCBXTTg5ODNfUklHSFRfTUlYRVJfQ1RSTCwgNiwgNywgMCwKKwkJCSBhdXhfdGx2KSwKKworCVNPQ19ET1VCTEVfUl9UTFYoIklucHV0IFBHQSBCeXBhc3MgVm9sdW1lIiwKKwkJCSBXTTg5ODNfTEVGVF9NSVhFUl9DVFJMLCBXTTg5ODNfUklHSFRfTUlYRVJfQ1RSTCwgMiwgNywgMCwKKwkJCSBieXBhc3NfdGx2KSwKKworCVNPQ19FTlVNX0VYVCgiRXF1YWxpemVyIEZ1bmN0aW9uIiwgZXFtb2RlLCBlcW1vZGVfZ2V0LCBlcW1vZGVfcHV0KSwKKwlTT0NfRU5VTSgiRVExIEN1dG9mZiIsIGVxMV9jdXRvZmYpLAorCVNPQ19TSU5HTEVfVExWKCJFUTEgVm9sdW1lIiwgV004OTgzX0VRMV9MT1dfU0hFTEYsICAwLCAyNCwgMSwgZXFfdGx2KSwKKwlTT0NfRU5VTSgiRVEyIEJhbmR3aXRoIiwgZXEyX2J3KSwKKwlTT0NfRU5VTSgiRVEyIEN1dG9mZiIsIGVxMl9jdXRvZmYpLAorCVNPQ19TSU5HTEVfVExWKCJFUTIgVm9sdW1lIiwgV004OTgzX0VRMl9QRUFLXzEsIDAsIDI0LCAxLCBlcV90bHYpLAorCVNPQ19FTlVNKCJFUTMgQmFuZHdpdGgiLCBlcTNfYncpLAorCVNPQ19FTlVNKCJFUTMgQ3V0b2ZmIiwgZXEzX2N1dG9mZiksCisJU09DX1NJTkdMRV9UTFYoIkVRMyBWb2x1bWUiLCBXTTg5ODNfRVEzX1BFQUtfMiwgMCwgMjQsIDEsIGVxX3RsdiksCisJU09DX0VOVU0oIkVRNCBCYW5kd2l0aCIsIGVxNF9idyksCisJU09DX0VOVU0oIkVRNCBDdXRvZmYiLCBlcTRfY3V0b2ZmKSwKKwlTT0NfU0lOR0xFX1RMVigiRVE0IFZvbHVtZSIsIFdNODk4M19FUTRfUEVBS18zLCAwLCAyNCwgMSwgZXFfdGx2KSwKKwlTT0NfRU5VTSgiRVE1IEN1dG9mZiIsIGVxNV9jdXRvZmYpLAorCVNPQ19TSU5HTEVfVExWKCJFUTUgVm9sdW1lIiwgV004OTgzX0VRNV9ISUdIX1NIRUxGLCAwLCAyNCwgMSwgZXFfdGx2KSwKKworCVNPQ19FTlVNKCIzRCBEZXB0aCIsIGRlcHRoXzNkKSwKKworCVNPQ19FTlVNKCJTcGVha2VyIE1vZGUiLCBzcGVha2VyX21vZGUpCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9vdXRfbWl4ZXJbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkxpbmUgU3dpdGNoIiwgV004OTgzX0xFRlRfTUlYRVJfQ1RSTCwgMSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJBdXggU3dpdGNoIiwgV004OTgzX0xFRlRfTUlYRVJfQ1RSTCwgNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJQQ00gU3dpdGNoIiwgV004OTgzX0xFRlRfTUlYRVJfQ1RSTCwgMCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfb3V0X21peGVyW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJMaW5lIFN3aXRjaCIsIFdNODk4M19SSUdIVF9NSVhFUl9DVFJMLCAxLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkF1eCBTd2l0Y2giLCBXTTg5ODNfUklHSFRfTUlYRVJfQ1RSTCwgNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJQQ00gU3dpdGNoIiwgV004OTgzX1JJR0hUX01JWEVSX0NUUkwsIDAsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfaW5wdXRfbWl4ZXJbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkwyIFN3aXRjaCIsIFdNODk4M19JTlBVVF9DVFJMLCAyLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pY04gU3dpdGNoIiwgV004OTgzX0lOUFVUX0NUUkwsIDEsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiTWljUCBTd2l0Y2giLCBXTTg5ODNfSU5QVVRfQ1RSTCwgMCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfaW5wdXRfbWl4ZXJbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlIyIFN3aXRjaCIsIFdNODk4M19JTlBVVF9DVFJMLCA2LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pY04gU3dpdGNoIiwgV004OTgzX0lOUFVUX0NUUkwsIDUsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiTWljUCBTd2l0Y2giLCBXTTg5ODNfSU5QVVRfQ1RSTCwgNCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGVmdF9ib29zdF9taXhlcltdID0geworCVNPQ19EQVBNX1NJTkdMRV9UTFYoIkwyIFZvbHVtZSIsIFdNODk4M19MRUZUX0FEQ19CT09TVF9DVFJMLAorCQkJICAgIDQsIDcsIDAsIGJvb3N0X3RsdiksCisJU09DX0RBUE1fU0lOR0xFX1RMVigiQVVYTCBWb2x1bWUiLCBXTTg5ODNfTEVGVF9BRENfQk9PU1RfQ1RSTCwKKwkJCSAgICAwLCA3LCAwLCBib29zdF90bHYpCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgb3V0M19taXhlcltdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTE1JWDJPVVQzIFN3aXRjaCIsIFdNODk4M19PVVQzX01JWEVSX0NUUkwsCisJCQkxLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkxEQUMyT1VUMyBTd2l0Y2giLCBXTTg5ODNfT1VUM19NSVhFUl9DVFJMLAorCQkJMCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgb3V0NF9taXhlcltdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTE1JWDJPVVQ0IFN3aXRjaCIsIFdNODk4M19PVVQ0X01PTk9fTUlYX0NUUkwsCisJCQk0LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIlJNSVgyT1VUNCBTd2l0Y2giLCBXTTg5ODNfT1VUNF9NT05PX01JWF9DVFJMLAorCQkJMSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJMREFDMk9VVDQgU3dpdGNoIiwgV004OTgzX09VVDRfTU9OT19NSVhfQ1RSTCwKKwkJCTMsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiUkRBQzJPVVQ0IFN3aXRjaCIsIFdNODk4M19PVVQ0X01PTk9fTUlYX0NUUkwsCisJCQkwLCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaWdodF9ib29zdF9taXhlcltdID0geworCVNPQ19EQVBNX1NJTkdMRV9UTFYoIlIyIFZvbHVtZSIsIFdNODk4M19SSUdIVF9BRENfQk9PU1RfQ1RSTCwKKwkJCSAgICA0LCA3LCAwLCBib29zdF90bHYpLAorCVNPQ19EQVBNX1NJTkdMRV9UTFYoIkFVWFIgVm9sdW1lIiwgV004OTgzX1JJR0hUX0FEQ19CT09TVF9DVFJMLAorCQkJICAgIDAsIDcsIDAsIGJvb3N0X3RsdikKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg5ODNfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0RBQygiTGVmdCBEQUMiLCAiTGVmdCBQbGF5YmFjayIsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzMsCisJCQkgMCwgMCksCisJU05EX1NPQ19EQVBNX0RBQygiUmlnaHQgREFDIiwgIlJpZ2h0IFBsYXliYWNrIiwgV004OTgzX1BPV0VSX01BTkFHRU1FTlRfMywKKwkJCSAxLCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJMZWZ0IEFEQyIsICJMZWZ0IENhcHR1cmUiLCBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8yLAorCQkJIDAsIDApLAorCVNORF9TT0NfREFQTV9BREMoIlJpZ2h0IEFEQyIsICJSaWdodCBDYXB0dXJlIiwgV004OTgzX1BPV0VSX01BTkFHRU1FTlRfMiwKKwkJCSAxLCAwKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiTGVmdCBPdXRwdXQgTWl4ZXIiLCBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8zLAorCQkJICAgMiwgMCwgbGVmdF9vdXRfbWl4ZXIsIEFSUkFZX1NJWkUobGVmdF9vdXRfbWl4ZXIpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJpZ2h0IE91dHB1dCBNaXhlciIsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzMsCisJCQkgICAzLCAwLCByaWdodF9vdXRfbWl4ZXIsIEFSUkFZX1NJWkUocmlnaHRfb3V0X21peGVyKSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkxlZnQgSW5wdXQgTWl4ZXIiLCBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8yLAorCQkJICAgMiwgMCwgbGVmdF9pbnB1dF9taXhlciwgQVJSQVlfU0laRShsZWZ0X2lucHV0X21peGVyKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSaWdodCBJbnB1dCBNaXhlciIsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzIsCisJCQkgICAzLCAwLCByaWdodF9pbnB1dF9taXhlciwgQVJSQVlfU0laRShyaWdodF9pbnB1dF9taXhlcikpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJMZWZ0IEJvb3N0IE1peGVyIiwgV004OTgzX1BPV0VSX01BTkFHRU1FTlRfMiwKKwkJCSAgIDQsIDAsIGxlZnRfYm9vc3RfbWl4ZXIsIEFSUkFZX1NJWkUobGVmdF9ib29zdF9taXhlcikpLAorCVNORF9TT0NfREFQTV9NSVhFUigiUmlnaHQgQm9vc3QgTWl4ZXIiLCBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8yLAorCQkJICAgNSwgMCwgcmlnaHRfYm9vc3RfbWl4ZXIsIEFSUkFZX1NJWkUocmlnaHRfYm9vc3RfbWl4ZXIpKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiT1VUMyBNaXhlciIsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzEsCisJCQkgICA2LCAwLCBvdXQzX21peGVyLCBBUlJBWV9TSVpFKG91dDNfbWl4ZXIpKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiT1VUNCBNaXhlciIsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzEsCisJCQkgICA3LCAwLCBvdXQ0X21peGVyLCBBUlJBWV9TSVpFKG91dDRfbWl4ZXIpKSwKKworCVNORF9TT0NfREFQTV9QR0EoIkxlZnQgQ2FwdHVyZSBQR0EiLCBXTTg5ODNfTEVGVF9JTlBfUEdBX0dBSU5fQ1RSTCwKKwkJCSA2LCAxLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJSaWdodCBDYXB0dXJlIFBHQSIsIFdNODk4M19SSUdIVF9JTlBfUEdBX0dBSU5fQ1RSTCwKKwkJCSA2LCAxLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9QR0EoIkxlZnQgSGVhZHBob25lIE91dCIsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzIsCisJCQkgNywgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiUmlnaHQgSGVhZHBob25lIE91dCIsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzIsCisJCQkgOCwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fUEdBKCJMZWZ0IFNwZWFrZXIgT3V0IiwgV004OTgzX1BPV0VSX01BTkFHRU1FTlRfMywKKwkJCSA1LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJSaWdodCBTcGVha2VyIE91dCIsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzMsCisJCQkgNiwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fUEdBKCJPVVQzIE91dCIsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzMsCisJCQkgNywgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fUEdBKCJPVVQ0IE91dCIsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzMsCisJCQkgOCwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEJpYXMiLCBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8xLCA0LCAwKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiTElOIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJMSVAiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIlJJTiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiUklQIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBVVhMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBVVhSIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJMMiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiUjIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUEwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUFIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLUiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIk9VVDMiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJPVVQ0IikKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdtODk4M19hdWRpb19tYXBbXSA9IHsKKwl7ICJPVVQzIE1peGVyIiwgIkxNSVgyT1VUMyBTd2l0Y2giLCAiTGVmdCBPdXRwdXQgTWl4ZXIiIH0sCisJeyAiT1VUMyBNaXhlciIsICJMREFDMk9VVDMgU3dpdGNoIiwgIkxlZnQgREFDIiB9LAorCisJeyAiT1VUMyBPdXQiLCBOVUxMLCAiT1VUMyBNaXhlciIgfSwKKwl7ICJPVVQzIiwgTlVMTCwgIk9VVDMgT3V0IiB9LAorCisJeyAiT1VUNCBNaXhlciIsICJMTUlYMk9VVDQgU3dpdGNoIiwgIkxlZnQgT3V0cHV0IE1peGVyIiB9LAorCXsgIk9VVDQgTWl4ZXIiLCAiUk1JWDJPVVQ0IFN3aXRjaCIsICJSaWdodCBPdXRwdXQgTWl4ZXIiIH0sCisJeyAiT1VUNCBNaXhlciIsICJMREFDMk9VVDQgU3dpdGNoIiwgIkxlZnQgREFDIiB9LAorCXsgIk9VVDQgTWl4ZXIiLCAiUkRBQzJPVVQ0IFN3aXRjaCIsICJSaWdodCBEQUMiIH0sCisKKwl7ICJPVVQ0IE91dCIsIE5VTEwsICJPVVQ0IE1peGVyIiB9LAorCXsgIk9VVDQiLCBOVUxMLCAiT1VUNCBPdXQiIH0sCisKKwl7ICJSaWdodCBPdXRwdXQgTWl4ZXIiLCAiUENNIFN3aXRjaCIsICJSaWdodCBEQUMiIH0sCisJeyAiUmlnaHQgT3V0cHV0IE1peGVyIiwgIkF1eCBTd2l0Y2giLCAiQVVYUiIgfSwKKwl7ICJSaWdodCBPdXRwdXQgTWl4ZXIiLCAiTGluZSBTd2l0Y2giLCAiUmlnaHQgQm9vc3QgTWl4ZXIiIH0sCisKKwl7ICJMZWZ0IE91dHB1dCBNaXhlciIsICJQQ00gU3dpdGNoIiwgIkxlZnQgREFDIiB9LAorCXsgIkxlZnQgT3V0cHV0IE1peGVyIiwgIkF1eCBTd2l0Y2giLCAiQVVYTCIgfSwKKwl7ICJMZWZ0IE91dHB1dCBNaXhlciIsICJMaW5lIFN3aXRjaCIsICJMZWZ0IEJvb3N0IE1peGVyIiB9LAorCisJeyAiUmlnaHQgSGVhZHBob25lIE91dCIsIE5VTEwsICJSaWdodCBPdXRwdXQgTWl4ZXIiIH0sCisJeyAiSFBSIiwgTlVMTCwgIlJpZ2h0IEhlYWRwaG9uZSBPdXQiIH0sCisKKwl7ICJMZWZ0IEhlYWRwaG9uZSBPdXQiLCBOVUxMLCAiTGVmdCBPdXRwdXQgTWl4ZXIiIH0sCisJeyAiSFBMIiwgTlVMTCwgIkxlZnQgSGVhZHBob25lIE91dCIgfSwKKworCXsgIlJpZ2h0IFNwZWFrZXIgT3V0IiwgTlVMTCwgIlJpZ2h0IE91dHB1dCBNaXhlciIgfSwKKwl7ICJTUEtSIiwgTlVMTCwgIlJpZ2h0IFNwZWFrZXIgT3V0IiB9LAorCisJeyAiTGVmdCBTcGVha2VyIE91dCIsIE5VTEwsICJMZWZ0IE91dHB1dCBNaXhlciIgfSwKKwl7ICJTUEtMIiwgTlVMTCwgIkxlZnQgU3BlYWtlciBPdXQiIH0sCisKKwl7ICJSaWdodCBBREMiLCBOVUxMLCAiUmlnaHQgQm9vc3QgTWl4ZXIiIH0sCisKKwl7ICJSaWdodCBCb29zdCBNaXhlciIsICJBVVhSIFZvbHVtZSIsICJBVVhSIiB9LAorCXsgIlJpZ2h0IEJvb3N0IE1peGVyIiwgTlVMTCwgIlJpZ2h0IENhcHR1cmUgUEdBIiB9LAorCXsgIlJpZ2h0IEJvb3N0IE1peGVyIiwgIlIyIFZvbHVtZSIsICJSMiIgfSwKKworCXsgIkxlZnQgQURDIiwgTlVMTCwgIkxlZnQgQm9vc3QgTWl4ZXIiIH0sCisKKwl7ICJMZWZ0IEJvb3N0IE1peGVyIiwgIkFVWEwgVm9sdW1lIiwgIkFVWEwiIH0sCisJeyAiTGVmdCBCb29zdCBNaXhlciIsIE5VTEwsICJMZWZ0IENhcHR1cmUgUEdBIiB9LAorCXsgIkxlZnQgQm9vc3QgTWl4ZXIiLCAiTDIgVm9sdW1lIiwgIkwyIiB9LAorCisJeyAiUmlnaHQgQ2FwdHVyZSBQR0EiLCBOVUxMLCAiUmlnaHQgSW5wdXQgTWl4ZXIiIH0sCisJeyAiTGVmdCBDYXB0dXJlIFBHQSIsIE5VTEwsICJMZWZ0IElucHV0IE1peGVyIiB9LAorCisJeyAiUmlnaHQgSW5wdXQgTWl4ZXIiLCAiUjIgU3dpdGNoIiwgIlIyIiB9LAorCXsgIlJpZ2h0IElucHV0IE1peGVyIiwgIk1pY04gU3dpdGNoIiwgIlJJTiIgfSwKKwl7ICJSaWdodCBJbnB1dCBNaXhlciIsICJNaWNQIFN3aXRjaCIsICJSSVAiIH0sCisKKwl7ICJMZWZ0IElucHV0IE1peGVyIiwgIkwyIFN3aXRjaCIsICJMMiIgfSwKKwl7ICJMZWZ0IElucHV0IE1peGVyIiwgIk1pY04gU3dpdGNoIiwgIkxJTiIgfSwKKwl7ICJMZWZ0IElucHV0IE1peGVyIiwgIk1pY1AgU3dpdGNoIiwgIkxJUCIgfSwKK307CisKK3N0YXRpYyBpbnQgZXFtb2RlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk4M19FUTFfTE9XX1NIRUxGKTsKKwlpZiAocmVnICYgV004OTgzX0VRM0RNT0RFKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisJZWxzZQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlcW1vZGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHJlZ3B3cjIsIHJlZ3B3cjM7CisJdW5zaWduZWQgaW50IHJlZ19lcTsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAhPSAwCisJICAgICYmIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVnX2VxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5ODNfRVExX0xPV19TSEVMRik7CisJc3dpdGNoICgocmVnX2VxICYgV004OTgzX0VRM0RNT0RFKSA+PiBXTTg5ODNfRVEzRE1PREVfU0hJRlQpIHsKKwljYXNlIDA6CisJCWlmICghdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJfQorCisJcmVncHdyMiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTgzX1BPV0VSX01BTkFHRU1FTlRfMik7CisJcmVncHdyMyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTgzX1BPV0VSX01BTkFHRU1FTlRfMyk7CisJLyogZGlzYWJsZSB0aGUgREFDcyBhbmQgQURDcyAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzIsCisJCQkgICAgV004OTgzX0FEQ0VOUl9NQVNLIHwgV004OTgzX0FEQ0VOTF9NQVNLLCAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8zLAorCQkJICAgIFdNODk4M19EQUNFTlJfTUFTSyB8IFdNODk4M19EQUNFTkxfTUFTSywgMCk7CisJLyogc2V0IHRoZSBkZXNpcmVkIGVxbW9kZSAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4M19FUTFfTE9XX1NIRUxGLAorCQkJICAgIFdNODk4M19FUTNETU9ERV9NQVNLLAorCQkJICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdCisJCQkgICAgPDwgV004OTgzX0VRM0RNT0RFX1NISUZUKTsKKwkvKiByZXN0b3JlIERBQy9BREMgY29uZmlndXJhdGlvbiAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzIsIHJlZ3B3cjIpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzMsIHJlZ3B3cjMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk4M19yZWFkYWJsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcpCit7CisJaWYgKHJlZyA+IFdNODk4M19NQVhfUkVHSVNURVIpCisJCXJldHVybiAwOworCisJcmV0dXJuIHdtODk4M19hY2Nlc3NfbWFza3NbcmVnXS5yZWFkICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTgzX2RhY19tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCisJcmV0dXJuIHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4M19EQUNfQ09OVFJPTCwKKwkJCQkgICBXTTg5ODNfU09GVE1VVEVfTUFTSywKKwkJCQkgICAhIW11dGUgPDwgV004OTgzX1NPRlRNVVRFX1NISUZUKTsKK30KKworc3RhdGljIGludCB3bTg5ODNfc2V0X2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXUxNiBmb3JtYXQsIG1hc3RlciwgYmNwLCBscnA7CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWZvcm1hdCA9IDB4MjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlmb3JtYXQgPSAweDA7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQlmb3JtYXQgPSAweDE7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKKwkJZm9ybWF0ID0gMHgzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRhaS0+ZGV2LCAiVW5rbm93biBkYWkgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTgzX0FVRElPX0lOVEVSRkFDRSwKKwkJCSAgICBXTTg5ODNfRk1UX01BU0ssIGZvcm1hdCA8PCBXTTg5ODNfRk1UX1NISUZUKTsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCW1hc3RlciA9IDE7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJbWFzdGVyID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkYWktPmRldiwgIlVua25vd24gbWFzdGVyL3NsYXZlIGNvbmZpZ3VyYXRpb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODNfQ0xPQ0tfR0VOX0NPTlRST0wsCisJCQkgICAgV004OTgzX01TX01BU0ssIG1hc3RlciA8PCBXTTg5ODNfTVNfU0hJRlQpOworCisJLyogRklYTUU6IFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IERTUCBBL0IgbW9kZXMgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQlkZXZfZXJyKGRhaS0+ZGV2LCAiRFNQIEEvQiBtb2RlcyBhcmUgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWJjcCA9IGxycCA9IDA7CisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6CisJCWJjcCA9IGxycCA9IDE7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWJjcCA9IDE7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfSUY6CisJCWxycCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGFpLT5kZXYsICJVbmtub3duIHBvbGFyaXR5IGNvbmZpZ3VyYXRpb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODNfQVVESU9fSU5URVJGQUNFLAorCQkJICAgIFdNODk4M19MUkNQX01BU0ssIGxycCA8PCBXTTg5ODNfTFJDUF9TSElGVCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTgzX0FVRElPX0lOVEVSRkFDRSwKKwkJCSAgICBXTTg5ODNfQkNQX01BU0ssIGJjcCA8PCBXTTg5ODNfQkNQX1NISUZUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5ODNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCBpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHdtODk4M19wcml2ICp3bTg5ODMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgYmxlbiwgc3JhdGVfaWR4OworCXUzMiB0bXA7CisJaW50IHNyYXRlX2Jlc3Q7CisJaW50IHJldDsKKworCXJldCA9IHNuZF9zb2NfcGFyYW1zX3RvX2JjbGsocGFyYW1zKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gY29udmVydCBwYXJhbXMgdG8gYmNsazogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJd204OTgzLT5iY2xrID0gcmV0OworCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlibGVuID0gMHgwOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJYmxlbiA9IDB4MTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJYmxlbiA9IDB4MjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJYmxlbiA9IDB4MzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkYWktPmRldiwgIlVuc3VwcG9ydGVkIHdvcmQgbGVuZ3RoICV1XG4iLAorCQkJcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTgzX0FVRElPX0lOVEVSRkFDRSwKKwkJCSAgICBXTTg5ODNfV0xfTUFTSywgYmxlbiA8PCBXTTg5ODNfV0xfU0hJRlQpOworCisJLyoKKwkgKiBtYXRjaCB0byB0aGUgbmVhcmVzdCBwb3NzaWJsZSBzYW1wbGUgcmF0ZSBhbmQgcmVseQorCSAqIG9uIHRoZSBhcnJheSBpbmRleCB0byBjb25maWd1cmUgdGhlIFNSIHJlZ2lzdGVyCisJICovCisJc3JhdGVfaWR4ID0gMDsKKwlzcmF0ZV9iZXN0ID0gYWJzKHNyYXRlc1swXSAtIHBhcmFtc19yYXRlKHBhcmFtcykpOworCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKHNyYXRlcyk7ICsraSkgeworCQlpZiAoYWJzKHNyYXRlc1tpXSAtIHBhcmFtc19yYXRlKHBhcmFtcykpID49IHNyYXRlX2Jlc3QpCisJCQljb250aW51ZTsKKwkJc3JhdGVfaWR4ID0gaTsKKwkJc3JhdGVfYmVzdCA9IGFicyhzcmF0ZXNbaV0gLSBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwl9CisKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiU2VsZWN0ZWQgU1JBVEUgPSAlZFxuIiwgc3JhdGVzW3NyYXRlX2lkeF0pOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4M19BRERJVElPTkFMX0NPTlRST0wsCisJCQkgICAgV004OTgzX1NSX01BU0ssIHNyYXRlX2lkeCA8PCBXTTg5ODNfU1JfU0hJRlQpOworCisJZGV2X2RiZyhkYWktPmRldiwgIlRhcmdldCBCQ0xLID0gJXVIelxuIiwgd204OTgzLT5iY2xrKTsKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiU1lTQ0xLID0gJXVIelxuIiwgd204OTgzLT5zeXNjbGspOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnNfcmF0aW9zKTsgKytpKSB7CisJCWlmICh3bTg5ODMtPnN5c2NsayAvIHBhcmFtc19yYXRlKHBhcmFtcykKKwkJICAgID09IGZzX3JhdGlvc1tpXS5yYXRpbykKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IEFSUkFZX1NJWkUoZnNfcmF0aW9zKSkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiVW5hYmxlIHRvIGNvbmZpZ3VyZSBNQ0xLIHJhdGlvICV1LyV1XG4iLAorCQkJd204OTgzLT5zeXNjbGssIHBhcmFtc19yYXRlKHBhcmFtcykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiTUNMSyByYXRpbyA9ICVkZnNcbiIsIGZzX3JhdGlvc1tpXS5yYXRpbyk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTgzX0NMT0NLX0dFTl9DT05UUk9MLAorCQkJICAgIFdNODk4M19NQ0xLRElWX01BU0ssIGkgPDwgV004OTgzX01DTEtESVZfU0hJRlQpOworCisJLyogc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBiY2xrIGRpdmlkZXIgKi8KKwl0bXAgPSAod204OTgzLT5zeXNjbGsgLyBmc19yYXRpb3NbaV0uZGl2KSAqIDEwOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJjbGtfZGl2cyk7ICsraSkgeworCQlpZiAod204OTgzLT5iY2xrID09IHRtcCAvIGJjbGtfZGl2c1tpXSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IEFSUkFZX1NJWkUoYmNsa19kaXZzKSkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiTm8gbWF0Y2hpbmcgQkNMSyBkaXZpZGVyIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhkYWktPmRldiwgIkJDTEsgZGl2ID0gJWRcbiIsIGkpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4M19DTE9DS19HRU5fQ09OVFJPTCwKKwkJCSAgICBXTTg5ODNfQkNMS0RJVl9NQVNLLCBpIDw8IFdNODk4M19CQ0xLRElWX1NISUZUKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxsX2RpdiB7CisJdTMyIGRpdjI6MTsKKwl1MzIgbjo0OworCXUzMiBrOjI0OworfTsKKworI2RlZmluZSBGSVhFRF9QTExfU0laRSAoKDFVTEwgPDwgMjQpICogMTApCitzdGF0aWMgaW50IHBsbF9mYWN0b3JzKHN0cnVjdCBwbGxfZGl2ICpwbGxfZGl2LCB1bnNpZ25lZCBpbnQgdGFyZ2V0LAorCQkgICAgICAgdW5zaWduZWQgaW50IHNvdXJjZSkKK3sKKwl1NjQgS3BhcnQ7CisJdW5zaWduZWQgbG9uZyBpbnQgSywgTmRpdiwgTm1vZDsKKworCXBsbF9kaXYtPmRpdjIgPSAwOworCU5kaXYgPSB0YXJnZXQgLyBzb3VyY2U7CisJaWYgKE5kaXYgPCA2KSB7CisJCXNvdXJjZSA+Pj0gMTsKKwkJcGxsX2Rpdi0+ZGl2MiA9IDE7CisJCU5kaXYgPSB0YXJnZXQgLyBzb3VyY2U7CisJfQorCisJaWYgKE5kaXYgPCA2IHx8IE5kaXYgPiAxMikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBXTTg5ODMgTiB2YWx1ZSBpcyBub3Qgd2l0aGluIgorCQkgICAgICAgIiB0aGUgcmVjb21tZW5kZWQgcmFuZ2U6ICVsdVxuIiwgX19mdW5jX18sIE5kaXYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGxsX2Rpdi0+biA9IE5kaXY7CisKKwlObW9kID0gdGFyZ2V0ICUgc291cmNlOworCUtwYXJ0ID0gRklYRURfUExMX1NJWkUgKiAodTY0KU5tb2Q7CisKKwlkb19kaXYoS3BhcnQsIHNvdXJjZSk7CisKKwlLID0gS3BhcnQgJiAweGZmZmZmZmZmOworCWlmICgoSyAlIDEwKSA+PSA1KQorCQlLICs9IDU7CisJSyAvPSAxMDsKKwlwbGxfZGl2LT5rID0gSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5ODNfc2V0X3BsbChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IHBsbF9pZCwKKwkJCSAgaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZXFfaW4sCisJCQkgIHVuc2lnbmVkIGludCBmcmVxX291dCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgcGxsX2RpdiBwbGxfZGl2OworCisJY29kZWMgPSBkYWktPmNvZGVjOworCWlmIChmcmVxX2luICYmIGZyZXFfb3V0KSB7CisJCXJldCA9IHBsbF9mYWN0b3JzKCZwbGxfZGl2LCBmcmVxX291dCAqIDQgKiAyLCBmcmVxX2luKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogZGlzYWJsZSB0aGUgUExMIGJlZm9yZSByZS1wcm9ncmFtbWluZyBpdCAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzEsCisJCQkgICAgV004OTgzX1BMTEVOX01BU0ssIDApOworCisJaWYgKCFmcmVxX2luIHx8ICFmcmVxX291dCkKKwkJcmV0dXJuIDA7CisKKwkvKiBzZXQgUExMTiBhbmQgUFJFU0NBTEUgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5ODNfUExMX04sCisJCSAgICAgIChwbGxfZGl2LmRpdjIgPDwgV004OTgzX1BMTF9QUkVTQ0FMRV9TSElGVCkKKwkJICAgICAgfCBwbGxfZGl2Lm4pOworCS8qIHNldCBQTExLICovCisJc25kX3NvY193cml0ZShjb2RlYywgV004OTgzX1BMTF9LXzMsIHBsbF9kaXYuayAmIDB4MWZmKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5ODNfUExMX0tfMiwgKHBsbF9kaXYuayA+PiA5KSAmIDB4MWZmKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5ODNfUExMX0tfMSwgKHBsbF9kaXYuayA+PiAxOCkpOworCS8qIGVuYWJsZSB0aGUgUExMICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTgzX1BPV0VSX01BTkFHRU1FTlRfMSwKKwkJCSAgICBXTTg5ODNfUExMRU5fTUFTSywgV004OTgzX1BMTEVOKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5ODNfc2V0X3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCSAgICAgaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgd204OTgzX3ByaXYgKndtODk4MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJc3dpdGNoIChjbGtfaWQpIHsKKwljYXNlIFdNODk4M19DTEtTUkNfTUNMSzoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTgzX0NMT0NLX0dFTl9DT05UUk9MLAorCQkJCSAgICBXTTg5ODNfQ0xLU0VMX01BU0ssIDApOworCQlicmVhazsKKwljYXNlIFdNODk4M19DTEtTUkNfUExMOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODNfQ0xPQ0tfR0VOX0NPTlRST0wsCisJCQkJICAgIFdNODk4M19DTEtTRUxfTUFTSywgV004OTgzX0NMS1NFTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGFpLT5kZXYsICJVbmtub3duIGNsb2NrIHNvdXJjZTogJWRcbiIsIGNsa19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdtODk4My0+c3lzY2xrID0gZnJlcTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5ODNfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCS8qIFZNSUQgYXQgMTAwayAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8xLAorCQkJCSAgICBXTTg5ODNfVk1JRFNFTF9NQVNLLAorCQkJCSAgICAxIDw8IFdNODk4M19WTUlEU0VMX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJcmV0ID0gc25kX3NvY19jYWNoZV9zeW5jKGNvZGVjKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHN5bmMgY2FjaGU6ICVkXG4iLCByZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQkvKiBlbmFibGUgYW50aS1wb3AgZmVhdHVyZXMgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4M19PVVQ0X1RPX0FEQywKKwkJCQkJICAgIFdNODk4M19QT0JDVFJMX01BU0sgfCBXTTg5ODNfREVMRU5fTUFTSywKKwkJCQkJICAgIFdNODk4M19QT0JDVFJMIHwgV004OTgzX0RFTEVOKTsKKwkJCS8qIGVuYWJsZSB0aGVybWFsIHNodXRkb3duICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODNfT1VUUFVUX0NUUkwsCisJCQkJCSAgICBXTTg5ODNfVFNERU5fTUFTSywgV004OTgzX1RTREVOKTsKKwkJCS8qIGVuYWJsZSBCSUFTRU4gKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzEsCisJCQkJCSAgICBXTTg5ODNfQklBU0VOX01BU0ssIFdNODk4M19CSUFTRU4pOworCQkJLyogVk1JRCBhdCAxMDBrICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8xLAorCQkJCQkgICAgV004OTgzX1ZNSURTRUxfTUFTSywKKwkJCQkJICAgIDEgPDwgV004OTgzX1ZNSURTRUxfU0hJRlQpOworCQkJbXNsZWVwKDI1MCk7CisJCQkvKiBkaXNhYmxlIGFudGktcG9wIGZlYXR1cmVzICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODNfT1VUNF9UT19BREMsCisJCQkJCSAgICBXTTg5ODNfUE9CQ1RSTF9NQVNLIHwKKwkJCQkJICAgIFdNODk4M19ERUxFTl9NQVNLLCAwKTsKKwkJfQorCisJCS8qIFZNSUQgYXQgNTAwayAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8xLAorCQkJCSAgICBXTTg5ODNfVk1JRFNFTF9NQVNLLAorCQkJCSAgICAyIDw8IFdNODk4M19WTUlEU0VMX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQkvKiBkaXNhYmxlIHRoZXJtYWwgc2h1dGRvd24gKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTgzX09VVFBVVF9DVFJMLAorCQkJCSAgICBXTTg5ODNfVFNERU5fTUFTSywgMCk7CisJCS8qIGRpc2FibGUgVk1JRFNFTCBhbmQgQklBU0VOICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzEsCisJCQkJICAgIFdNODk4M19WTUlEU0VMX01BU0sgfCBXTTg5ODNfQklBU0VOX01BU0ssCisJCQkJICAgIDApOworCQkvKiB3YWl0IGZvciBWTUlEIHRvIGRpc2NoYXJnZSAqLworCQltc2xlZXAoMTAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV004OTgzX1BPV0VSX01BTkFHRU1FTlRfMSwgMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk4M19QT1dFUl9NQU5BR0VNRU5UXzIsIDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8zLCAwKTsKKwkJYnJlYWs7CisJfQorCisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHdtODk4M19zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXdtODk4M19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTgzX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJd204OTgzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSB3bTg5ODNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHdtODk4M19yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgd204OTgzX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJd204OTgzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5ODNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCByZXQ7CisJc3RydWN0IHdtODk4M19wcml2ICp3bTg5ODMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaTsKKworCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCB3bTg5ODMtPmNvbnRyb2xfdHlwZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBpL286ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk4M19TT0ZUV0FSRV9SRVNFVCwgMHg4OTgzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHNldCB0aGUgdm9sL2dhaW4gdXBkYXRlIGJpdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2b2xfdXBkYXRlX3JlZ3MpOyArK2kpCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHZvbF91cGRhdGVfcmVnc1tpXSwKKwkJCQkgICAgMHgxMDAsIDB4MTAwKTsKKworCS8qIG11dGUgYWxsIG91dHB1dHMgYW5kIHNldCBQR0FzIHRvIG1pbmltdW0gZ2FpbiAqLworCWZvciAoaSA9IFdNODk4M19MT1VUMV9IUF9WT0xVTUVfQ1RSTDsKKwkgICAgIGkgPD0gV004OTgzX09VVDRfTU9OT19NSVhfQ1RSTDsgKytpKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBpLCAweDQwLCAweDQwKTsKKworCS8qIGVuYWJsZSBzb2Z0IG11dGUgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODNfREFDX0NPTlRST0wsCisJCQkgICAgV004OTgzX1NPRlRNVVRFX01BU0ssCisJCQkgICAgV004OTgzX1NPRlRNVVRFKTsKKworCS8qIGVuYWJsZSBCSUFTQ1VUICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTgzX0JJQVNfQ1RSTCwKKwkJCSAgICBXTTg5ODNfQklBU0NVVCwgV004OTgzX0JJQVNDVVQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyB3bTg5ODNfZGFpX29wcyA9IHsKKwkuZGlnaXRhbF9tdXRlID0gd204OTgzX2RhY19tdXRlLAorCS5od19wYXJhbXMgPSB3bTg5ODNfaHdfcGFyYW1zLAorCS5zZXRfZm10ID0gd204OTgzX3NldF9mbXQsCisJLnNldF9zeXNjbGsgPSB3bTg5ODNfc2V0X3N5c2NsaywKKwkuc2V0X3BsbCA9IHdtODk4M19zZXRfcGxsCit9OworCisjZGVmaW5lIFdNODk4M19GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHdtODk4M19kYWkgPSB7CisJLm5hbWUgPSAid204OTgzLWhpZmkiLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFdNODk4M19GT1JNQVRTLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFdNODk4M19GT1JNQVRTLAorCX0sCisJLm9wcyA9ICZ3bTg5ODNfZGFpX29wcywKKwkuc3ltbWV0cmljX3JhdGVzID0gMQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk4MyA9IHsKKwkucHJvYmUgPSB3bTg5ODNfcHJvYmUsCisJLnJlbW92ZSA9IHdtODk4M19yZW1vdmUsCisJLnN1c3BlbmQgPSB3bTg5ODNfc3VzcGVuZCwKKwkucmVzdW1lID0gd204OTgzX3Jlc3VtZSwKKwkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5ODNfc2V0X2JpYXNfbGV2ZWwsCisJLnJlZ19jYWNoZV9zaXplID0gQVJSQVlfU0laRSh3bTg5ODNfcmVnX2RlZnMpLAorCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHUxNiksCisJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204OTgzX3JlZ19kZWZzLAorCS5jb250cm9scyA9IHdtODk4M19zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTgzX3NuZF9jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IHdtODk4M19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk4M19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IHdtODk4M19hdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTgzX2F1ZGlvX21hcCksCisJLnJlYWRhYmxlX3JlZ2lzdGVyID0gd204OTgzX3JlYWRhYmxlCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdtODk4M19zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgd204OTgzX3ByaXYgKndtODk4MzsKKwlpbnQgcmV0OworCisJd204OTgzID0ga3phbGxvYyhzaXplb2YgKndtODk4MywgR0ZQX0tFUk5FTCk7CisJaWYgKCF3bTg5ODMpCisJCXJldHVybiAtRU5PTUVNOworCisJd204OTgzLT5jb250cm9sX3R5cGUgPSBTTkRfU09DX1NQSTsKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCB3bTg5ODMpOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYsCisJCQkJICAgICAmc29jX2NvZGVjX2Rldl93bTg5ODMsICZ3bTg5ODNfZGFpLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJa2ZyZWUod204OTgzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB3bTg5ODNfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCWtmcmVlKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdtODk4M19zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIndtODk4MyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gd204OTgzX3NwaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aod204OTgzX3NwaV9yZW1vdmUpCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCitzdGF0aWMgX19kZXZpbml0IGludCB3bTg5ODNfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB3bTg5ODNfcHJpdiAqd204OTgzOworCWludCByZXQ7CisKKwl3bTg5ODMgPSBremFsbG9jKHNpemVvZiAqd204OTgzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdtODk4MykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bTg5ODMtPmNvbnRyb2xfdHlwZSA9IFNORF9TT0NfSTJDOworCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIHdtODk4Myk7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKKwkJCQkgICAgICZzb2NfY29kZWNfZGV2X3dtODk4MywgJndtODk4M19kYWksIDEpOworCWlmIChyZXQgPCAwKQorCQlrZnJlZSh3bTg5ODMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2RldmV4aXQgaW50IHdtODk4M19pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgd204OTgzX2kyY19pZFtdID0geworCXsgIndtODk4MyIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgd204OTgzX2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg5ODNfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3bTg5ODMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHdtODk4M19pMmNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHdtODk4M19pMmNfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSB3bTg5ODNfaTJjX2lkCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHdtODk4M19tb2Rpbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJndtODk4M19pMmNfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIHdtODk4MyBJMkMgZHJpdmVyOiAlZFxuIiwKKwkJICAgICAgIHJldCk7CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKKwlyZXQgPSBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZ3bTg5ODNfc3BpX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIHdtODk4MyBTUEkgZHJpdmVyOiAlZFxuIiwKKwkJICAgICAgIHJldCk7CisJfQorI2VuZGlmCisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KHdtODk4M19tb2Rpbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHdtODk4M19leGl0KHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorCWkyY19kZWxfZHJpdmVyKCZ3bTg5ODNfaTJjX2RyaXZlcik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmd204OTgzX3NwaV9kcml2ZXIpOworI2VuZGlmCit9Cittb2R1bGVfZXhpdCh3bTg5ODNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBXTTg5ODMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJEaW1pdHJpcyBQYXBhc3RhbW9zIDxkcEBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk4My5oIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWVlNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODMuaApAQCAtMCwwICsxLDEwMjkgQEAKKy8qCisgKiB3bTg5ODMuaCAgLS0gIFdNODk4MyBBTFNBIFNvQyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKgorICogQXV0aG9yOiBEaW1pdHJpcyBQYXBhc3RhbW9zIDxkcEBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9XTTg5ODNfSAorI2RlZmluZSBfV004OTgzX0gKKworLyoKKyAqIFJlZ2lzdGVyIHZhbHVlcy4KKyAqLworI2RlZmluZSBXTTg5ODNfU09GVFdBUkVfUkVTRVQgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8xICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8yICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBXTTg5ODNfUE9XRVJfTUFOQUdFTUVOVF8zICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBXTTg5ODNfQVVESU9fSU5URVJGQUNFICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBXTTg5ODNfQ09NUEFORElOR19DT05UUk9MICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBXTTg5ODNfQ0xPQ0tfR0VOX0NPTlRST0wgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBXTTg5ODNfQURESVRJT05BTF9DT05UUk9MICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBXTTg5ODNfR1BJT19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBXTTg5ODNfSkFDS19ERVRFQ1RfQ09OVFJPTF8xICAgICAgICAgICAgMHgwOQorI2RlZmluZSBXTTg5ODNfREFDX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBXTTg5ODNfTEVGVF9EQUNfRElHSVRBTF9WT0wgICAgICAgICAgICAgMHgwQgorI2RlZmluZSBXTTg5ODNfUklHSFRfREFDX0RJR0lUQUxfVk9MICAgICAgICAgICAgMHgwQworI2RlZmluZSBXTTg5ODNfSkFDS19ERVRFQ1RfQ09OVFJPTF8yICAgICAgICAgICAgMHgwRAorI2RlZmluZSBXTTg5ODNfQURDX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBXTTg5ODNfTEVGVF9BRENfRElHSVRBTF9WT0wgICAgICAgICAgICAgMHgwRgorI2RlZmluZSBXTTg5ODNfUklHSFRfQURDX0RJR0lUQUxfVk9MICAgICAgICAgICAgMHgxMAorI2RlZmluZSBXTTg5ODNfRVExX0xPV19TSEVMRiAgICAgICAgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBXTTg5ODNfRVEyX1BFQUtfMSAgICAgICAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBXTTg5ODNfRVEzX1BFQUtfMiAgICAgICAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBXTTg5ODNfRVE0X1BFQUtfMyAgICAgICAgICAgICAgICAgICAgICAgMHgxNQorI2RlZmluZSBXTTg5ODNfRVE1X0hJR0hfU0hFTEYgICAgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBXTTg5ODNfREFDX0xJTUlURVJfMSAgICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBXTTg5ODNfREFDX0xJTUlURVJfMiAgICAgICAgICAgICAgICAgICAgMHgxOQorI2RlZmluZSBXTTg5ODNfTk9UQ0hfRklMVEVSXzEgICAgICAgICAgICAgICAgICAgMHgxQgorI2RlZmluZSBXTTg5ODNfTk9UQ0hfRklMVEVSXzIgICAgICAgICAgICAgICAgICAgMHgxQworI2RlZmluZSBXTTg5ODNfTk9UQ0hfRklMVEVSXzMgICAgICAgICAgICAgICAgICAgMHgxRAorI2RlZmluZSBXTTg5ODNfTk9UQ0hfRklMVEVSXzQgICAgICAgICAgICAgICAgICAgMHgxRQorI2RlZmluZSBXTTg5ODNfQUxDX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBXTTg5ODNfQUxDX0NPTlRST0xfMiAgICAgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBXTTg5ODNfQUxDX0NPTlRST0xfMyAgICAgICAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBXTTg5ODNfTk9JU0VfR0FURSAgICAgICAgICAgICAgICAgICAgICAgMHgyMworI2RlZmluZSBXTTg5ODNfUExMX04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBXTTg5ODNfUExMX0tfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNQorI2RlZmluZSBXTTg5ODNfUExMX0tfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNgorI2RlZmluZSBXTTg5ODNfUExMX0tfMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNworI2RlZmluZSBXTTg5ODNfM0RfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBXTTg5ODNfT1VUNF9UT19BREMgICAgICAgICAgICAgICAgICAgICAgMHgyQQorI2RlZmluZSBXTTg5ODNfQkVFUF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgyQgorI2RlZmluZSBXTTg5ODNfSU5QVVRfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgMHgyQworI2RlZmluZSBXTTg5ODNfTEVGVF9JTlBfUEdBX0dBSU5fQ1RSTCAgICAgICAgICAgMHgyRAorI2RlZmluZSBXTTg5ODNfUklHSFRfSU5QX1BHQV9HQUlOX0NUUkwgICAgICAgICAgMHgyRQorI2RlZmluZSBXTTg5ODNfTEVGVF9BRENfQk9PU1RfQ1RSTCAgICAgICAgICAgICAgMHgyRgorI2RlZmluZSBXTTg5ODNfUklHSFRfQURDX0JPT1NUX0NUUkwgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBXTTg5ODNfT1VUUFVUX0NUUkwgICAgICAgICAgICAgICAgICAgICAgMHgzMQorI2RlZmluZSBXTTg5ODNfTEVGVF9NSVhFUl9DVFJMICAgICAgICAgICAgICAgICAgMHgzMgorI2RlZmluZSBXTTg5ODNfUklHSFRfTUlYRVJfQ1RSTCAgICAgICAgICAgICAgICAgMHgzMworI2RlZmluZSBXTTg5ODNfTE9VVDFfSFBfVk9MVU1FX0NUUkwgICAgICAgICAgICAgMHgzNAorI2RlZmluZSBXTTg5ODNfUk9VVDFfSFBfVk9MVU1FX0NUUkwgICAgICAgICAgICAgMHgzNQorI2RlZmluZSBXTTg5ODNfTE9VVDJfU1BLX1ZPTFVNRV9DVFJMICAgICAgICAgICAgMHgzNgorI2RlZmluZSBXTTg5ODNfUk9VVDJfU1BLX1ZPTFVNRV9DVFJMICAgICAgICAgICAgMHgzNworI2RlZmluZSBXTTg5ODNfT1VUM19NSVhFUl9DVFJMICAgICAgICAgICAgICAgICAgMHgzOAorI2RlZmluZSBXTTg5ODNfT1VUNF9NT05PX01JWF9DVFJMICAgICAgICAgICAgICAgMHgzOQorI2RlZmluZSBXTTg5ODNfQklBU19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgMHgzRAorCisjZGVmaW5lIFdNODk4M19SRUdJU1RFUl9DT1VOVCAgICAgICAgICAgICAgICAgICA1OQorI2RlZmluZSBXTTg5ODNfTUFYX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgMHgzRgorCisvKgorICogRmllbGQgRGVmaW5pdGlvbnMuCisgKi8KKworLyoKKyAqIFIwICgweDAwKSAtIFNvZnR3YXJlIFJlc2V0CisgKi8KKyNkZWZpbmUgV004OTgzX1NPRlRXQVJFX1JFU0VUX01BU0sgICAgICAgICAgICAgIDB4MDFGRiAgLyogU09GVFdBUkVfUkVTRVQgLSBbODowXSAqLworI2RlZmluZSBXTTg5ODNfU09GVFdBUkVfUkVTRVRfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBTT0ZUV0FSRV9SRVNFVCAtIFs4OjBdICovCisjZGVmaW5lIFdNODk4M19TT0ZUV0FSRV9SRVNFVF9XSURUSCAgICAgICAgICAgICAgICAgIDkgIC8qIFNPRlRXQVJFX1JFU0VUIC0gWzg6MF0gKi8KKworLyoKKyAqIFIxICgweDAxKSAtIFBvd2VyIG1hbmFnZW1lbnQgMQorICovCisjZGVmaW5lIFdNODk4M19CVUZEQ09QRU4gICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEJVRkRDT1BFTiAqLworI2RlZmluZSBXTTg5ODNfQlVGRENPUEVOX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBCVUZEQ09QRU4gKi8KKyNkZWZpbmUgV004OTgzX0JVRkRDT1BFTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQlVGRENPUEVOICovCisjZGVmaW5lIFdNODk4M19CVUZEQ09QRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJVRkRDT1BFTiAqLworI2RlZmluZSBXTTg5ODNfT1VUNE1JWEVOICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBPVVQ0TUlYRU4gKi8KKyNkZWZpbmUgV004OTgzX09VVDRNSVhFTl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogT1VUNE1JWEVOICovCisjZGVmaW5lIFdNODk4M19PVVQ0TUlYRU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIE9VVDRNSVhFTiAqLworI2RlZmluZSBXTTg5ODNfT1VUNE1JWEVOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0TUlYRU4gKi8KKyNkZWZpbmUgV004OTgzX09VVDNNSVhFTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogT1VUM01JWEVOICovCisjZGVmaW5lIFdNODk4M19PVVQzTUlYRU5fTUFTSyAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIE9VVDNNSVhFTiAqLworI2RlZmluZSBXTTg5ODNfT1VUM01JWEVOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBPVVQzTUlYRU4gKi8KKyNkZWZpbmUgV004OTgzX09VVDNNSVhFTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM01JWEVOICovCisjZGVmaW5lIFdNODk4M19QTExFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFBMTEVOICovCisjZGVmaW5lIFdNODk4M19QTExFTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFBMTEVOICovCisjZGVmaW5lIFdNODk4M19QTExFTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIFBMTEVOICovCisjZGVmaW5lIFdNODk4M19QTExFTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBMTEVOICovCisjZGVmaW5lIFdNODk4M19NSUNCRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIE1JQ0JFTiAqLworI2RlZmluZSBXTTg5ODNfTUlDQkVOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBNSUNCRU4gKi8KKyNkZWZpbmUgV004OTgzX01JQ0JFTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogTUlDQkVOICovCisjZGVmaW5lIFdNODk4M19NSUNCRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0JFTiAqLworI2RlZmluZSBXTTg5ODNfQklBU0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBCSUFTRU4gKi8KKyNkZWZpbmUgV004OTgzX0JJQVNFTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQklBU0VOICovCisjZGVmaW5lIFdNODk4M19CSUFTRU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEJJQVNFTiAqLworI2RlZmluZSBXTTg5ODNfQklBU0VOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBCSUFTRU4gKi8KKyNkZWZpbmUgV004OTgzX0JVRklPRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQlVGSU9FTiAqLworI2RlZmluZSBXTTg5ODNfQlVGSU9FTl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBCVUZJT0VOICovCisjZGVmaW5lIFdNODk4M19CVUZJT0VOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEJVRklPRU4gKi8KKyNkZWZpbmUgV004OTgzX0JVRklPRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQlVGSU9FTiAqLworI2RlZmluZSBXTTg5ODNfVk1JRFNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBWTUlEU0VMIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTgzX1ZNSURTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogVk1JRFNFTCAtIFsxOjBdICovCisjZGVmaW5lIFdNODk4M19WTUlEU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFZNSURTRUwgLSBbMTowXSAqLworCisvKgorICogUjIgKDB4MDIpIC0gUG93ZXIgbWFuYWdlbWVudCAyCisgKi8KKyNkZWZpbmUgV004OTgzX1JPVVQxRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogUk9VVDFFTiAqLworI2RlZmluZSBXTTg5ODNfUk9VVDFFTl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBST1VUMUVOICovCisjZGVmaW5lIFdNODk4M19ST1VUMUVOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIFJPVVQxRU4gKi8KKyNkZWZpbmUgV004OTgzX1JPVVQxRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9VVDFFTiAqLworI2RlZmluZSBXTTg5ODNfTE9VVDFFTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMT1VUMUVOICovCisjZGVmaW5lIFdNODk4M19MT1VUMUVOX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExPVVQxRU4gKi8KKyNkZWZpbmUgV004OTgzX0xPVVQxRU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTE9VVDFFTiAqLworI2RlZmluZSBXTTg5ODNfTE9VVDFFTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT1VUMUVOICovCisjZGVmaW5lIFdNODk4M19TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFNMRUVQICovCisjZGVmaW5lIFdNODk4M19TTEVFUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFNMRUVQICovCisjZGVmaW5lIFdNODk4M19TTEVFUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFNMRUVQICovCisjZGVmaW5lIFdNODk4M19TTEVFUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNMRUVQICovCisjZGVmaW5lIFdNODk4M19CT09TVEVOUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEJPT1NURU5SICovCisjZGVmaW5lIFdNODk4M19CT09TVEVOUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEJPT1NURU5SICovCisjZGVmaW5lIFdNODk4M19CT09TVEVOUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEJPT1NURU5SICovCisjZGVmaW5lIFdNODk4M19CT09TVEVOUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJPT1NURU5SICovCisjZGVmaW5lIFdNODk4M19CT09TVEVOTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEJPT1NURU5MICovCisjZGVmaW5lIFdNODk4M19CT09TVEVOTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEJPT1NURU5MICovCisjZGVmaW5lIFdNODk4M19CT09TVEVOTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEJPT1NURU5MICovCisjZGVmaW5lIFdNODk4M19CT09TVEVOTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJPT1NURU5MICovCisjZGVmaW5lIFdNODk4M19JTlBHQUVOUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIElOUEdBRU5SICovCisjZGVmaW5lIFdNODk4M19JTlBHQUVOUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIElOUEdBRU5SICovCisjZGVmaW5lIFdNODk4M19JTlBHQUVOUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIElOUEdBRU5SICovCisjZGVmaW5lIFdNODk4M19JTlBHQUVOUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOUEdBRU5SICovCisjZGVmaW5lIFdNODk4M19JTlBQR0FFTkwgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIElOUFBHQUVOTCAqLworI2RlZmluZSBXTTg5ODNfSU5QUEdBRU5MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBJTlBQR0FFTkwgKi8KKyNkZWZpbmUgV004OTgzX0lOUFBHQUVOTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogSU5QUEdBRU5MICovCisjZGVmaW5lIFdNODk4M19JTlBQR0FFTkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOUFBHQUVOTCAqLworI2RlZmluZSBXTTg5ODNfQURDRU5SICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRENFTlIgKi8KKyNkZWZpbmUgV004OTgzX0FEQ0VOUl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQURDRU5SICovCisjZGVmaW5lIFdNODk4M19BRENFTlJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFEQ0VOUiAqLworI2RlZmluZSBXTTg5ODNfQURDRU5SX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENFTlIgKi8KKyNkZWZpbmUgV004OTgzX0FEQ0VOTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQURDRU5MICovCisjZGVmaW5lIFdNODk4M19BRENFTkxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFEQ0VOTCAqLworI2RlZmluZSBXTTg5ODNfQURDRU5MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBRENFTkwgKi8KKyNkZWZpbmUgV004OTgzX0FEQ0VOTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDRU5MICovCisKKy8qCisgKiBSMyAoMHgwMykgLSBQb3dlciBtYW5hZ2VtZW50IDMKKyAqLworI2RlZmluZSBXTTg5ODNfT1VUNEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ0RU4gKi8KKyNkZWZpbmUgV004OTgzX09VVDRFTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNEVOICovCisjZGVmaW5lIFdNODk4M19PVVQ0RU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDRFTiAqLworI2RlZmluZSBXTTg5ODNfT1VUNEVOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0RU4gKi8KKyNkZWZpbmUgV004OTgzX09VVDNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogT1VUM0VOICovCisjZGVmaW5lIFdNODk4M19PVVQzRU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIE9VVDNFTiAqLworI2RlZmluZSBXTTg5ODNfT1VUM0VOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBPVVQzRU4gKi8KKyNkZWZpbmUgV004OTgzX09VVDNFTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM0VOICovCisjZGVmaW5lIFdNODk4M19MT1VUMkVOICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExPVVQyRU4gKi8KKyNkZWZpbmUgV004OTgzX0xPVVQyRU5fTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTE9VVDJFTiAqLworI2RlZmluZSBXTTg5ODNfTE9VVDJFTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBMT1VUMkVOICovCisjZGVmaW5lIFdNODk4M19MT1VUMkVOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPVVQyRU4gKi8KKyNkZWZpbmUgV004OTgzX1JPVVQyRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogUk9VVDJFTiAqLworI2RlZmluZSBXTTg5ODNfUk9VVDJFTl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBST1VUMkVOICovCisjZGVmaW5lIFdNODk4M19ST1VUMkVOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIFJPVVQyRU4gKi8KKyNkZWZpbmUgV004OTgzX1JPVVQyRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9VVDJFTiAqLworI2RlZmluZSBXTTg5ODNfUk1JWEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBSTUlYRU4gKi8KKyNkZWZpbmUgV004OTgzX1JNSVhFTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogUk1JWEVOICovCisjZGVmaW5lIFdNODk4M19STUlYRU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFJNSVhFTiAqLworI2RlZmluZSBXTTg5ODNfUk1JWEVOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSTUlYRU4gKi8KKyNkZWZpbmUgV004OTgzX0xNSVhFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogTE1JWEVOICovCisjZGVmaW5lIFdNODk4M19MTUlYRU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExNSVhFTiAqLworI2RlZmluZSBXTTg5ODNfTE1JWEVOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBMTUlYRU4gKi8KKyNkZWZpbmUgV004OTgzX0xNSVhFTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE1JWEVOICovCisjZGVmaW5lIFdNODk4M19EQUNFTlIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERBQ0VOUiAqLworI2RlZmluZSBXTTg5ODNfREFDRU5SX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBEQUNFTlIgKi8KKyNkZWZpbmUgV004OTgzX0RBQ0VOUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDRU5SICovCisjZGVmaW5lIFdNODk4M19EQUNFTlJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ0VOUiAqLworI2RlZmluZSBXTTg5ODNfREFDRU5MICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEQUNFTkwgKi8KKyNkZWZpbmUgV004OTgzX0RBQ0VOTF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogREFDRU5MICovCisjZGVmaW5lIFdNODk4M19EQUNFTkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERBQ0VOTCAqLworI2RlZmluZSBXTTg5ODNfREFDRU5MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNFTkwgKi8KKworLyoKKyAqIFI0ICgweDA0KSAtIEF1ZGlvIEludGVyZmFjZQorICovCisjZGVmaW5lIFdNODk4M19CQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEJDUCAqLworI2RlZmluZSBXTTg5ODNfQkNQX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBCQ1AgKi8KKyNkZWZpbmUgV004OTgzX0JDUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQkNQICovCisjZGVmaW5lIFdNODk4M19CQ1BfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJDUCAqLworI2RlZmluZSBXTTg5ODNfTFJDUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMUkNQICovCisjZGVmaW5lIFdNODk4M19MUkNQX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExSQ1AgKi8KKyNkZWZpbmUgV004OTgzX0xSQ1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTFJDUCAqLworI2RlZmluZSBXTTg5ODNfTFJDUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMUkNQICovCisjZGVmaW5lIFdNODk4M19XTF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjAgIC8qIFdMIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTgzX1dMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogV0wgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5ODNfV0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBXTCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk4M19GTVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTggIC8qIEZNVCAtIFs0OjNdICovCisjZGVmaW5lIFdNODk4M19GTVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEZNVCAtIFs0OjNdICovCisjZGVmaW5lIFdNODk4M19GTVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEZNVCAtIFs0OjNdICovCisjZGVmaW5lIFdNODk4M19ETFJTV0FQICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERMUlNXQVAgKi8KKyNkZWZpbmUgV004OTgzX0RMUlNXQVBfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRExSU1dBUCAqLworI2RlZmluZSBXTTg5ODNfRExSU1dBUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBETFJTV0FQICovCisjZGVmaW5lIFdNODk4M19ETFJTV0FQX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERMUlNXQVAgKi8KKyNkZWZpbmUgV004OTgzX0FMUlNXQVAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUxSU1dBUCAqLworI2RlZmluZSBXTTg5ODNfQUxSU1dBUF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBTFJTV0FQICovCisjZGVmaW5lIFdNODk4M19BTFJTV0FQX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFMUlNXQVAgKi8KKyNkZWZpbmUgV004OTgzX0FMUlNXQVBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUxSU1dBUCAqLworI2RlZmluZSBXTTg5ODNfTU9OTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNT05PICovCisjZGVmaW5lIFdNODk4M19NT05PX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1PTk8gKi8KKyNkZWZpbmUgV004OTgzX01PTk9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTU9OTyAqLworI2RlZmluZSBXTTg5ODNfTU9OT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNT05PICovCisKKy8qCisgKiBSNSAoMHgwNSkgLSBDb21wYW5kaW5nIGNvbnRyb2wKKyAqLworI2RlZmluZSBXTTg5ODNfV0w4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBXTDggKi8KKyNkZWZpbmUgV004OTgzX1dMOF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogV0w4ICovCisjZGVmaW5lIFdNODk4M19XTDhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIFdMOCAqLworI2RlZmluZSBXTTg5ODNfV0w4X1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBXTDggKi8KKyNkZWZpbmUgV004OTgzX0RBQ19DT01QX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxOCAgLyogREFDX0NPTVAgLSBbNDozXSAqLworI2RlZmluZSBXTTg5ODNfREFDX0NPTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBEQUNfQ09NUCAtIFs0OjNdICovCisjZGVmaW5lIFdNODk4M19EQUNfQ09NUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERBQ19DT01QIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004OTgzX0FEQ19DT01QX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNiAgLyogQURDX0NPTVAgLSBbMjoxXSAqLworI2RlZmluZSBXTTg5ODNfQURDX0NPTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENfQ09NUCAtIFsyOjFdICovCisjZGVmaW5lIFdNODk4M19BRENfQ09NUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFEQ19DT01QIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004OTgzX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004OTgzX0xPT1BCQUNLX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004OTgzX0xPT1BCQUNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004OTgzX0xPT1BCQUNLX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE9PUEJBQ0sgKi8KKworLyoKKyAqIFI2ICgweDA2KSAtIENsb2NrIEdlbiBjb250cm9sCisgKi8KKyNkZWZpbmUgV004OTgzX0NMS1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQ0xLU0VMICovCisjZGVmaW5lIFdNODk4M19DTEtTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIENMS1NFTCAqLworI2RlZmluZSBXTTg5ODNfQ0xLU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBDTEtTRUwgKi8KKyNkZWZpbmUgV004OTgzX0NMS1NFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ0xLU0VMICovCisjZGVmaW5lIFdNODk4M19NQ0xLRElWX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwRTAgIC8qIE1DTEtESVYgLSBbNzo1XSAqLworI2RlZmluZSBXTTg5ODNfTUNMS0RJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBNQ0xLRElWIC0gWzc6NV0gKi8KKyNkZWZpbmUgV004OTgzX01DTEtESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTUNMS0RJViAtIFs3OjVdICovCisjZGVmaW5lIFdNODk4M19CQ0xLRElWX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMUMgIC8qIEJDTEtESVYgLSBbNDoyXSAqLworI2RlZmluZSBXTTg5ODNfQkNMS0RJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBCQ0xLRElWIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV004OTgzX0JDTEtESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogQkNMS0RJViAtIFs0OjJdICovCisjZGVmaW5lIFdNODk4M19NUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1TICovCisjZGVmaW5lIFdNODk4M19NU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1TICovCisjZGVmaW5lIFdNODk4M19NU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE1TICovCisjZGVmaW5lIFdNODk4M19NU19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1TICovCisKKy8qCisgKiBSNyAoMHgwNykgLSBBZGRpdGlvbmFsIGNvbnRyb2wKKyAqLworI2RlZmluZSBXTTg5ODNfU1JfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBFICAvKiBTUiAtIFszOjFdICovCisjZGVmaW5lIFdNODk4M19TUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNSIC0gWzM6MV0gKi8KKyNkZWZpbmUgV004OTgzX1NSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogU1IgLSBbMzoxXSAqLworI2RlZmluZSBXTTg5ODNfU0xPV0NMS0VOICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBTTE9XQ0xLRU4gKi8KKyNkZWZpbmUgV004OTgzX1NMT1dDTEtFTl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogU0xPV0NMS0VOICovCisjZGVmaW5lIFdNODk4M19TTE9XQ0xLRU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFNMT1dDTEtFTiAqLworI2RlZmluZSBXTTg5ODNfU0xPV0NMS0VOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTTE9XQ0xLRU4gKi8KKworLyoKKyAqIFI4ICgweDA4KSAtIEdQSU8gQ29udHJvbAorICovCisjZGVmaW5lIFdNODk4M19PUENMS0RJVl9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMzAgIC8qIE9QQ0xLRElWIC0gWzU6NF0gKi8KKyNkZWZpbmUgV004OTgzX09QQ0xLRElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogT1BDTEtESVYgLSBbNTo0XSAqLworI2RlZmluZSBXTTg5ODNfT1BDTEtESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBPUENMS0RJViAtIFs1OjRdICovCisjZGVmaW5lIFdNODk4M19HUElPMVBPTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEdQSU8xUE9MICovCisjZGVmaW5lIFdNODk4M19HUElPMVBPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEdQSU8xUE9MICovCisjZGVmaW5lIFdNODk4M19HUElPMVBPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEdQSU8xUE9MICovCisjZGVmaW5lIFdNODk4M19HUElPMVBPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU8xUE9MICovCisjZGVmaW5lIFdNODk4M19HUElPMVNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIEdQSU8xU0VMIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTgzX0dQSU8xU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogR1BJTzFTRUwgLSBbMjowXSAqLworI2RlZmluZSBXTTg5ODNfR1BJTzFTRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBHUElPMVNFTCAtIFsyOjBdICovCisKKy8qCisgKiBSOSAoMHgwOSkgLSBKYWNrIERldGVjdCBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTg5ODNfSkRfVk1JRDEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBKRF9WTUlEMSAqLworI2RlZmluZSBXTTg5ODNfSkRfVk1JRDFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBKRF9WTUlEMSAqLworI2RlZmluZSBXTTg5ODNfSkRfVk1JRDFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBKRF9WTUlEMSAqLworI2RlZmluZSBXTTg5ODNfSkRfVk1JRDFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBKRF9WTUlEMSAqLworI2RlZmluZSBXTTg5ODNfSkRfVk1JRDAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBKRF9WTUlEMCAqLworI2RlZmluZSBXTTg5ODNfSkRfVk1JRDBfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBKRF9WTUlEMCAqLworI2RlZmluZSBXTTg5ODNfSkRfVk1JRDBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBKRF9WTUlEMCAqLworI2RlZmluZSBXTTg5ODNfSkRfVk1JRDBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBKRF9WTUlEMCAqLworI2RlZmluZSBXTTg5ODNfSkRfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBKRF9FTiAqLworI2RlZmluZSBXTTg5ODNfSkRfRU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBKRF9FTiAqLworI2RlZmluZSBXTTg5ODNfSkRfRU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBKRF9FTiAqLworI2RlZmluZSBXTTg5ODNfSkRfRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBKRF9FTiAqLworI2RlZmluZSBXTTg5ODNfSkRfU0VMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDMwICAvKiBKRF9TRUwgLSBbNTo0XSAqLworI2RlZmluZSBXTTg5ODNfSkRfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBKRF9TRUwgLSBbNTo0XSAqLworI2RlZmluZSBXTTg5ODNfSkRfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBKRF9TRUwgLSBbNTo0XSAqLworCisvKgorICogUjEwICgweDBBKSAtIERBQyBDb250cm9sCisgKi8KKyNkZWZpbmUgV004OTgzX1NPRlRNVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogU09GVE1VVEUgKi8KKyNkZWZpbmUgV004OTgzX1NPRlRNVVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogU09GVE1VVEUgKi8KKyNkZWZpbmUgV004OTgzX1NPRlRNVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogU09GVE1VVEUgKi8KKyNkZWZpbmUgV004OTgzX1NPRlRNVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogU09GVE1VVEUgKi8KKyNkZWZpbmUgV004OTgzX0RBQ09TUjEyOCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogREFDT1NSMTI4ICovCisjZGVmaW5lIFdNODk4M19EQUNPU1IxMjhfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERBQ09TUjEyOCAqLworI2RlZmluZSBXTTg5ODNfREFDT1NSMTI4X1NISUZUICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBEQUNPU1IxMjggKi8KKyNkZWZpbmUgV004OTgzX0RBQ09TUjEyOF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDT1NSMTI4ICovCisjZGVmaW5lIFdNODk4M19BTVVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFNVVRFICovCisjZGVmaW5lIFdNODk4M19BTVVURV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFNVVRFICovCisjZGVmaW5lIFdNODk4M19BTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFNVVRFICovCisjZGVmaW5lIFdNODk4M19BTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFNVVRFICovCisjZGVmaW5lIFdNODk4M19EQUNSUE9MICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERBQ1JQT0wgKi8KKyNkZWZpbmUgV004OTgzX0RBQ1JQT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogREFDUlBPTCAqLworI2RlZmluZSBXTTg5ODNfREFDUlBPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNSUE9MICovCisjZGVmaW5lIFdNODk4M19EQUNSUE9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ1JQT0wgKi8KKyNkZWZpbmUgV004OTgzX0RBQ0xQT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogREFDTFBPTCAqLworI2RlZmluZSBXTTg5ODNfREFDTFBPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEQUNMUE9MICovCisjZGVmaW5lIFdNODk4M19EQUNMUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERBQ0xQT0wgKi8KKyNkZWZpbmUgV004OTgzX0RBQ0xQT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDTFBPTCAqLworCisvKgorICogUjExICgweDBCKSAtIExlZnQgREFDIGRpZ2l0YWwgVm9sCisgKi8KKyNkZWZpbmUgV004OTgzX0RBQ1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogREFDVlUgKi8KKyNkZWZpbmUgV004OTgzX0RBQ1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogREFDVlUgKi8KKyNkZWZpbmUgV004OTgzX0RBQ1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogREFDVlUgKi8KKyNkZWZpbmUgV004OTgzX0RBQ1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDVlUgKi8KKyNkZWZpbmUgV004OTgzX0RBQ0xWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogREFDTFZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk4M19EQUNMVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERBQ0xWT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5ODNfREFDTFZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBEQUNMVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMiAoMHgwQykgLSBSaWdodCBEQUMgZGlnaXRhbCB2b2wKKyAqLworI2RlZmluZSBXTTg5ODNfREFDVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBEQUNWVSAqLworI2RlZmluZSBXTTg5ODNfREFDVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBEQUNWVSAqLworI2RlZmluZSBXTTg5ODNfREFDVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBEQUNWVSAqLworI2RlZmluZSBXTTg5ODNfREFDVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNWVSAqLworI2RlZmluZSBXTTg5ODNfREFDUlZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEQUNSVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTgzX0RBQ1JWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogREFDUlZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk4M19EQUNSVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIERBQ1JWT0wgLSBbNzowXSAqLworCisvKgorICogUjEzICgweDBEKSAtIEphY2sgRGV0ZWN0IENvbnRyb2wgMgorICovCisjZGVmaW5lIFdNODk4M19KRF9FTjFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwRjAgIC8qIEpEX0VOMSAtIFs3OjRdICovCisjZGVmaW5lIFdNODk4M19KRF9FTjFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEpEX0VOMSAtIFs3OjRdICovCisjZGVmaW5lIFdNODk4M19KRF9FTjFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEpEX0VOMSAtIFs3OjRdICovCisjZGVmaW5lIFdNODk4M19KRF9FTjBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMEYgIC8qIEpEX0VOMCAtIFszOjBdICovCisjZGVmaW5lIFdNODk4M19KRF9FTjBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEpEX0VOMCAtIFszOjBdICovCisjZGVmaW5lIFdNODk4M19KRF9FTjBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEpEX0VOMCAtIFszOjBdICovCisKKy8qCisgKiBSMTQgKDB4MEUpIC0gQURDIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTg5ODNfSFBGRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBIUEZFTiAqLworI2RlZmluZSBXTTg5ODNfSFBGRU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBIUEZFTiAqLworI2RlZmluZSBXTTg5ODNfSFBGRU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBIUEZFTiAqLworI2RlZmluZSBXTTg5ODNfSFBGRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBIUEZFTiAqLworI2RlZmluZSBXTTg5ODNfSFBGQVBQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBIUEZBUFAgKi8KKyNkZWZpbmUgV004OTgzX0hQRkFQUF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSFBGQVBQICovCisjZGVmaW5lIFdNODk4M19IUEZBUFBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIEhQRkFQUCAqLworI2RlZmluZSBXTTg5ODNfSFBGQVBQX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBIUEZBUFAgKi8KKyNkZWZpbmUgV004OTgzX0hQRkNVVF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MCAgLyogSFBGQ1VUIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004OTgzX0hQRkNVVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogSFBGQ1VUIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004OTgzX0hQRkNVVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogSFBGQ1VUIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004OTgzX0FEQ09TUjEyOCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQURDT1NSMTI4ICovCisjZGVmaW5lIFdNODk4M19BRENPU1IxMjhfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFEQ09TUjEyOCAqLworI2RlZmluZSBXTTg5ODNfQURDT1NSMTI4X1NISUZUICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBBRENPU1IxMjggKi8KKyNkZWZpbmUgV004OTgzX0FEQ09TUjEyOF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDT1NSMTI4ICovCisjZGVmaW5lIFdNODk4M19BRENSUE9MICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFEQ1JQT0wgKi8KKyNkZWZpbmUgV004OTgzX0FEQ1JQT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQURDUlBPTCAqLworI2RlZmluZSBXTTg5ODNfQURDUlBPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENSUE9MICovCisjZGVmaW5lIFdNODk4M19BRENSUE9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFEQ1JQT0wgKi8KKyNkZWZpbmUgV004OTgzX0FEQ0xQT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQURDTFBPTCAqLworI2RlZmluZSBXTTg5ODNfQURDTFBPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRENMUE9MICovCisjZGVmaW5lIFdNODk4M19BRENMUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFEQ0xQT0wgKi8KKyNkZWZpbmUgV004OTgzX0FEQ0xQT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDTFBPTCAqLworCisvKgorICogUjE1ICgweDBGKSAtIExlZnQgQURDIERpZ2l0YWwgVm9sCisgKi8KKyNkZWZpbmUgV004OTgzX0FEQ1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQURDVlUgKi8KKyNkZWZpbmUgV004OTgzX0FEQ1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQURDVlUgKi8KKyNkZWZpbmUgV004OTgzX0FEQ1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQURDVlUgKi8KKyNkZWZpbmUgV004OTgzX0FEQ1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDVlUgKi8KKyNkZWZpbmUgV004OTgzX0FEQ0xWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogQURDTFZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk4M19BRENMVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFEQ0xWT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5ODNfQURDTFZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBRENMVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxNiAoMHgxMCkgLSBSaWdodCBBREMgRGlnaXRhbCBWb2wKKyAqLworI2RlZmluZSBXTTg5ODNfQURDVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBRENWVSAqLworI2RlZmluZSBXTTg5ODNfQURDVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBRENWVSAqLworI2RlZmluZSBXTTg5ODNfQURDVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBRENWVSAqLworI2RlZmluZSBXTTg5ODNfQURDVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENWVSAqLworI2RlZmluZSBXTTg5ODNfQURDUlZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBBRENSVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTgzX0FEQ1JWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQURDUlZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk4M19BRENSVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFEQ1JWT0wgLSBbNzowXSAqLworCisvKgorICogUjE4ICgweDEyKSAtIEVRMSAtIGxvdyBzaGVsZgorICovCisjZGVmaW5lIFdNODk4M19FUTNETU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEVRM0RNT0RFICovCisjZGVmaW5lIFdNODk4M19FUTNETU9ERV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEVRM0RNT0RFICovCisjZGVmaW5lIFdNODk4M19FUTNETU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEVRM0RNT0RFICovCisjZGVmaW5lIFdNODk4M19FUTNETU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEVRM0RNT0RFICovCisjZGVmaW5lIFdNODk4M19FUTFDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjAgIC8qIEVRMUMgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5ODNfRVExQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTFDIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTgzX0VRMUNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogRVExQyAtIFs2OjVdICovCisjZGVmaW5lIFdNODk4M19FUTFHX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMUYgIC8qIEVRMUcgLSBbNDowXSAqLworI2RlZmluZSBXTTg5ODNfRVExR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFHIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTgzX0VRMUdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVExRyAtIFs0OjBdICovCisKKy8qCisgKiBSMTkgKDB4MTMpIC0gRVEyIC0gcGVhayAxCisgKi8KKyNkZWZpbmUgV004OTgzX0VRMkJXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRVEyQlcgKi8KKyNkZWZpbmUgV004OTgzX0VRMkJXX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRVEyQlcgKi8KKyNkZWZpbmUgV004OTgzX0VRMkJXX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogRVEyQlcgKi8KKyNkZWZpbmUgV004OTgzX0VRMkJXX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRVEyQlcgKi8KKyNkZWZpbmUgV004OTgzX0VRMkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MCAgLyogRVEyQyAtIFs2OjVdICovCisjZGVmaW5lIFdNODk4M19FUTJDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRMkMgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5ODNfRVEyQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBFUTJDIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTgzX0VRMkdfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRiAgLyogRVEyRyAtIFs0OjBdICovCisjZGVmaW5lIFdNODk4M19FUTJHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMkcgLSBbNDowXSAqLworI2RlZmluZSBXTTg5ODNfRVEyR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTJHIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIyMCAoMHgxNCkgLSBFUTMgLSBwZWFrIDIKKyAqLworI2RlZmluZSBXTTg5ODNfRVEzQlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBFUTNCVyAqLworI2RlZmluZSBXTTg5ODNfRVEzQldfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBFUTNCVyAqLworI2RlZmluZSBXTTg5ODNfRVEzQldfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBFUTNCVyAqLworI2RlZmluZSBXTTg5ODNfRVEzQldfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBFUTNCVyAqLworI2RlZmluZSBXTTg5ODNfRVEzQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwICAvKiBFUTNDIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTgzX0VRM0NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVEzQyAtIFs2OjVdICovCisjZGVmaW5lIFdNODk4M19FUTNDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEVRM0MgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5ODNfRVEzR19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBFUTNHIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTgzX0VRM0dfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEzRyAtIFs0OjBdICovCisjZGVmaW5lIFdNODk4M19FUTNHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRM0cgLSBbNDowXSAqLworCisvKgorICogUjIxICgweDE1KSAtIEVRNCAtIHBlYWsgMworICovCisjZGVmaW5lIFdNODk4M19FUTRCVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEVRNEJXICovCisjZGVmaW5lIFdNODk4M19FUTRCV19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEVRNEJXICovCisjZGVmaW5lIFdNODk4M19FUTRCV19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEVRNEJXICovCisjZGVmaW5lIFdNODk4M19FUTRCV19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEVRNEJXICovCisjZGVmaW5lIFdNODk4M19FUTRDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjAgIC8qIEVRNEMgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5ODNfRVE0Q19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTRDIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTgzX0VRNENfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogRVE0QyAtIFs2OjVdICovCisjZGVmaW5lIFdNODk4M19FUTRHX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMUYgIC8qIEVRNEcgLSBbNDowXSAqLworI2RlZmluZSBXTTg5ODNfRVE0R19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRHIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTgzX0VRNEdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVE0RyAtIFs0OjBdICovCisKKy8qCisgKiBSMjIgKDB4MTYpIC0gRVE1IC0gaGlnaCBzaGVsZgorICovCisjZGVmaW5lIFdNODk4M19FUTVDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjAgIC8qIEVRNUMgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5ODNfRVE1Q19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTVDIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTgzX0VRNUNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogRVE1QyAtIFs2OjVdICovCisjZGVmaW5lIFdNODk4M19FUTVHX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMUYgIC8qIEVRNUcgLSBbNDowXSAqLworI2RlZmluZSBXTTg5ODNfRVE1R19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTVHIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTgzX0VRNUdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVE1RyAtIFs0OjBdICovCisKKy8qCisgKiBSMjQgKDB4MTgpIC0gREFDIExpbWl0ZXIgMQorICovCisjZGVmaW5lIFdNODk4M19MSU1FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIExJTUVOICovCisjZGVmaW5lIFdNODk4M19MSU1FTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIExJTUVOICovCisjZGVmaW5lIFdNODk4M19MSU1FTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIExJTUVOICovCisjZGVmaW5lIFdNODk4M19MSU1FTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExJTUVOICovCisjZGVmaW5lIFdNODk4M19MSU1EQ1lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwRjAgIC8qIExJTURDWSAtIFs3OjRdICovCisjZGVmaW5lIFdNODk4M19MSU1EQ1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIExJTURDWSAtIFs3OjRdICovCisjZGVmaW5lIFdNODk4M19MSU1EQ1lfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIExJTURDWSAtIFs3OjRdICovCisjZGVmaW5lIFdNODk4M19MSU1BVEtfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMEYgIC8qIExJTUFUSyAtIFszOjBdICovCisjZGVmaW5lIFdNODk4M19MSU1BVEtfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExJTUFUSyAtIFszOjBdICovCisjZGVmaW5lIFdNODk4M19MSU1BVEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIExJTUFUSyAtIFszOjBdICovCisKKy8qCisgKiBSMjUgKDB4MTkpIC0gREFDIExpbWl0ZXIgMgorICovCisjZGVmaW5lIFdNODk4M19MSU1MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwNzAgIC8qIExJTUxWTCAtIFs2OjRdICovCisjZGVmaW5lIFdNODk4M19MSU1MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIExJTUxWTCAtIFs2OjRdICovCisjZGVmaW5lIFdNODk4M19MSU1MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExJTUxWTCAtIFs2OjRdICovCisjZGVmaW5lIFdNODk4M19MSU1CT09TVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMEYgIC8qIExJTUJPT1NUIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004OTgzX0xJTUJPT1NUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTElNQk9PU1QgLSBbMzowXSAqLworI2RlZmluZSBXTTg5ODNfTElNQk9PU1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBMSU1CT09TVCAtIFszOjBdICovCisKKy8qCisgKiBSMjcgKDB4MUIpIC0gTm90Y2ggRmlsdGVyIDEKKyAqLworI2RlZmluZSBXTTg5ODNfTkZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBORlUgKi8KKyNkZWZpbmUgV004OTgzX05GVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogTkZVICovCisjZGVmaW5lIFdNODk4M19ORlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE5GVSAqLworI2RlZmluZSBXTTg5ODNfTkZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBORlUgKi8KKyNkZWZpbmUgV004OTgzX05GRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTkZFTiAqLworI2RlZmluZSBXTTg5ODNfTkZFTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBORkVOICovCisjZGVmaW5lIFdNODk4M19ORkVOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIE5GRU4gKi8KKyNkZWZpbmUgV004OTgzX05GRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTkZFTiAqLworI2RlZmluZSBXTTg5ODNfTkZBMF8xM183X01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDdGICAvKiBORkEwKDEzOjcpIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004OTgzX05GQTBfMTNfN19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTkZBMCgxMzo3KSAtIFs2OjBdICovCisjZGVmaW5lIFdNODk4M19ORkEwXzEzXzdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIE5GQTAoMTM6NykgLSBbNjowXSAqLworCisvKgorICogUjI4ICgweDFDKSAtIE5vdGNoIEZpbHRlciAyCisgKi8KKyNkZWZpbmUgV004OTgzX05GVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogTkZVICovCisjZGVmaW5lIFdNODk4M19ORlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE5GVSAqLworI2RlZmluZSBXTTg5ODNfTkZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBORlUgKi8KKyNkZWZpbmUgV004OTgzX05GVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTkZVICovCisjZGVmaW5lIFdNODk4M19ORkEwXzZfMF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwN0YgIC8qIE5GQTAoNjowKSAtIFs2OjBdICovCisjZGVmaW5lIFdNODk4M19ORkEwXzZfMF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE5GQTAoNjowKSAtIFs2OjBdICovCisjZGVmaW5lIFdNODk4M19ORkEwXzZfMF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIE5GQTAoNjowKSAtIFs2OjBdICovCisKKy8qCisgKiBSMjkgKDB4MUQpIC0gTm90Y2ggRmlsdGVyIDMKKyAqLworI2RlZmluZSBXTTg5ODNfTkZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBORlUgKi8KKyNkZWZpbmUgV004OTgzX05GVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogTkZVICovCisjZGVmaW5lIFdNODk4M19ORlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE5GVSAqLworI2RlZmluZSBXTTg5ODNfTkZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBORlUgKi8KKyNkZWZpbmUgV004OTgzX05GQTFfMTNfN19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA3RiAgLyogTkZBMSgxMzo3KSAtIFs2OjBdICovCisjZGVmaW5lIFdNODk4M19ORkExXzEzXzdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE5GQTEoMTM6NykgLSBbNjowXSAqLworI2RlZmluZSBXTTg5ODNfTkZBMV8xM183X1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBORkExKDEzOjcpIC0gWzY6MF0gKi8KKworLyoKKyAqIFIzMCAoMHgxRSkgLSBOb3RjaCBGaWx0ZXIgNAorICovCisjZGVmaW5lIFdNODk4M19ORlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE5GVSAqLworI2RlZmluZSBXTTg5ODNfTkZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBORlUgKi8KKyNkZWZpbmUgV004OTgzX05GVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogTkZVICovCisjZGVmaW5lIFdNODk4M19ORlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE5GVSAqLworI2RlZmluZSBXTTg5ODNfTkZBMV82XzBfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDdGICAvKiBORkExKDY6MCkgLSBbNjowXSAqLworI2RlZmluZSBXTTg5ODNfTkZBMV82XzBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBORkExKDY6MCkgLSBbNjowXSAqLworI2RlZmluZSBXTTg5ODNfTkZBMV82XzBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBORkExKDY6MCkgLSBbNjowXSAqLworCisvKgorICogUjMyICgweDIwKSAtIEFMQyBjb250cm9sIDEKKyAqLworI2RlZmluZSBXTTg5ODNfQUxDU0VMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTgwICAvKiBBTENTRUwgLSBbODo3XSAqLworI2RlZmluZSBXTTg5ODNfQUxDU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBBTENTRUwgLSBbODo3XSAqLworI2RlZmluZSBXTTg5ODNfQUxDU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBBTENTRUwgLSBbODo3XSAqLworI2RlZmluZSBXTTg5ODNfQUxDTUFYX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDM4ICAvKiBBTENNQVggLSBbNTozXSAqLworI2RlZmluZSBXTTg5ODNfQUxDTUFYX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBBTENNQVggLSBbNTozXSAqLworI2RlZmluZSBXTTg5ODNfQUxDTUFYX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBBTENNQVggLSBbNTozXSAqLworI2RlZmluZSBXTTg5ODNfQUxDTUlOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBBTENNSU4gLSBbMjowXSAqLworI2RlZmluZSBXTTg5ODNfQUxDTUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBTENNSU4gLSBbMjowXSAqLworI2RlZmluZSBXTTg5ODNfQUxDTUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBBTENNSU4gLSBbMjowXSAqLworCisvKgorICogUjMzICgweDIxKSAtIEFMQyBjb250cm9sIDIKKyAqLworI2RlZmluZSBXTTg5ODNfQUxDSExEX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMEYwICAvKiBBTENITEQgLSBbNzo0XSAqLworI2RlZmluZSBXTTg5ODNfQUxDSExEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBBTENITEQgLSBbNzo0XSAqLworI2RlZmluZSBXTTg5ODNfQUxDSExEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBBTENITEQgLSBbNzo0XSAqLworI2RlZmluZSBXTTg5ODNfQUxDTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGICAvKiBBTENMVkwgLSBbMzowXSAqLworI2RlZmluZSBXTTg5ODNfQUxDTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBTENMVkwgLSBbMzowXSAqLworI2RlZmluZSBXTTg5ODNfQUxDTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBBTENMVkwgLSBbMzowXSAqLworCisvKgorICogUjM0ICgweDIyKSAtIEFMQyBjb250cm9sIDMKKyAqLworI2RlZmluZSBXTTg5ODNfQUxDTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBTENNT0RFICovCisjZGVmaW5lIFdNODk4M19BTENNT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEFMQ01PREUgKi8KKyNkZWZpbmUgV004OTgzX0FMQ01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQUxDTU9ERSAqLworI2RlZmluZSBXTTg5ODNfQUxDTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBTENNT0RFICovCisjZGVmaW5lIFdNODk4M19BTENEQ1lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwRjAgIC8qIEFMQ0RDWSAtIFs3OjRdICovCisjZGVmaW5lIFdNODk4M19BTENEQ1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFMQ0RDWSAtIFs3OjRdICovCisjZGVmaW5lIFdNODk4M19BTENEQ1lfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFMQ0RDWSAtIFs3OjRdICovCisjZGVmaW5lIFdNODk4M19BTENBVEtfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMEYgIC8qIEFMQ0FUSyAtIFszOjBdICovCisjZGVmaW5lIFdNODk4M19BTENBVEtfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFMQ0FUSyAtIFszOjBdICovCisjZGVmaW5lIFdNODk4M19BTENBVEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFMQ0FUSyAtIFszOjBdICovCisKKy8qCisgKiBSMzUgKDB4MjMpIC0gTm9pc2UgR2F0ZQorICovCisjZGVmaW5lIFdNODk4M19OR0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIE5HRU4gKi8KKyNkZWZpbmUgV004OTgzX05HRU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTkdFTiAqLworI2RlZmluZSBXTTg5ODNfTkdFTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBOR0VOICovCisjZGVmaW5lIFdNODk4M19OR0VOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE5HRU4gKi8KKyNkZWZpbmUgV004OTgzX05HVEhfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogTkdUSCAtIFsyOjBdICovCisjZGVmaW5lIFdNODk4M19OR1RIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE5HVEggLSBbMjowXSAqLworI2RlZmluZSBXTTg5ODNfTkdUSF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBOR1RIIC0gWzI6MF0gKi8KKworLyoKKyAqIFIzNiAoMHgyNCkgLSBQTEwgTgorICovCisjZGVmaW5lIFdNODk4M19QTExfUFJFU0NBTEUgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFBMTF9QUkVTQ0FMRSAqLworI2RlZmluZSBXTTg5ODNfUExMX1BSRVNDQUxFX01BU0sgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBQTExfUFJFU0NBTEUgKi8KKyNkZWZpbmUgV004OTgzX1BMTF9QUkVTQ0FMRV9TSElGVCAgICAgICAgICAgICAgICAgICAgNCAgLyogUExMX1BSRVNDQUxFICovCisjZGVmaW5lIFdNODk4M19QTExfUFJFU0NBTEVfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIFBMTF9QUkVTQ0FMRSAqLworI2RlZmluZSBXTTg5ODNfUExMTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGICAvKiBQTExOIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004OTgzX1BMTE5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUExMTiAtIFszOjBdICovCisjZGVmaW5lIFdNODk4M19QTExOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIFBMTE4gLSBbMzowXSAqLworCisvKgorICogUjM3ICgweDI1KSAtIFBMTCBLIDEKKyAqLworI2RlZmluZSBXTTg5ODNfUExMS18yM18xOF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBQTExLKDIzOjE4KSAtIFs1OjBdICovCisjZGVmaW5lIFdNODk4M19QTExLXzIzXzE4X1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFBMTEsoMjM6MTgpIC0gWzU6MF0gKi8KKyNkZWZpbmUgV004OTgzX1BMTEtfMjNfMThfV0lEVEggICAgICAgICAgICAgICAgICAgICAgNiAgLyogUExMSygyMzoxOCkgLSBbNTowXSAqLworCisvKgorICogUjM4ICgweDI2KSAtIFBMTCBLIDIKKyAqLworI2RlZmluZSBXTTg5ODNfUExMS18xN185X01BU0sgICAgICAgICAgICAgICAgICAgMHgwMUZGICAvKiBQTExLKDE3OjkpIC0gWzg6MF0gKi8KKyNkZWZpbmUgV004OTgzX1BMTEtfMTdfOV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUExMSygxNzo5KSAtIFs4OjBdICovCisjZGVmaW5lIFdNODk4M19QTExLXzE3XzlfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIFBMTEsoMTc6OSkgLSBbODowXSAqLworCisvKgorICogUjM5ICgweDI3KSAtIFBMTCBLIDMKKyAqLworI2RlZmluZSBXTTg5ODNfUExMS184XzBfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMUZGICAvKiBQTExLKDg6MCkgLSBbODowXSAqLworI2RlZmluZSBXTTg5ODNfUExMS184XzBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBQTExLKDg6MCkgLSBbODowXSAqLworI2RlZmluZSBXTTg5ODNfUExMS184XzBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBQTExLKDg6MCkgLSBbODowXSAqLworCisvKgorICogUjQxICgweDI5KSAtIDNEIGNvbnRyb2wKKyAqLworI2RlZmluZSBXTTg5ODNfREVQVEgzRF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDBGICAvKiBERVBUSDNEIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004OTgzX0RFUFRIM0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogREVQVEgzRCAtIFszOjBdICovCisjZGVmaW5lIFdNODk4M19ERVBUSDNEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIERFUFRIM0QgLSBbMzowXSAqLworCisvKgorICogUjQyICgweDJBKSAtIE9VVDQgdG8gQURDCisgKi8KKyNkZWZpbmUgV004OTgzX09VVDRfMkFEQ1ZPTF9NQVNLICAgICAgICAgICAgICAgIDB4MDFDMCAgLyogT1VUNF8yQURDVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004OTgzX09VVDRfMkFEQ1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgNiAgLyogT1VUNF8yQURDVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004OTgzX09VVDRfMkFEQ1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgMyAgLyogT1VUNF8yQURDVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004OTgzX09VVDRfMkxOUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogT1VUNF8yTE5SICovCisjZGVmaW5lIFdNODk4M19PVVQ0XzJMTlJfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIE9VVDRfMkxOUiAqLworI2RlZmluZSBXTTg5ODNfT1VUNF8yTE5SX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBPVVQ0XzJMTlIgKi8KKyNkZWZpbmUgV004OTgzX09VVDRfMkxOUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNF8yTE5SICovCisjZGVmaW5lIFdNODk4M19QT0JDVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIFBPQkNUUkwgKi8KKyNkZWZpbmUgV004OTgzX1BPQkNUUkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogUE9CQ1RSTCAqLworI2RlZmluZSBXTTg5ODNfUE9CQ1RSTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBQT0JDVFJMICovCisjZGVmaW5lIFdNODk4M19QT0JDVFJMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBPQkNUUkwgKi8KKyNkZWZpbmUgV004OTgzX0RFTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogREVMRU4gKi8KKyNkZWZpbmUgV004OTgzX0RFTEVOX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogREVMRU4gKi8KKyNkZWZpbmUgV004OTgzX0RFTEVOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREVMRU4gKi8KKyNkZWZpbmUgV004OTgzX0RFTEVOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREVMRU4gKi8KKyNkZWZpbmUgV004OTgzX09VVDFERUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogT1VUMURFTCAqLworI2RlZmluZSBXTTg5ODNfT1VUMURFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBPVVQxREVMICovCisjZGVmaW5lIFdNODk4M19PVVQxREVMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDFERUwgKi8KKyNkZWZpbmUgV004OTgzX09VVDFERUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMURFTCAqLworCisvKgorICogUjQzICgweDJCKSAtIEJlZXAgY29udHJvbAorICovCisjZGVmaW5lIFdNODk4M19CWVBMMlJNSVggICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEJZUEwyUk1JWCAqLworI2RlZmluZSBXTTg5ODNfQllQTDJSTUlYX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBCWVBMMlJNSVggKi8KKyNkZWZpbmUgV004OTgzX0JZUEwyUk1JWF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQllQTDJSTUlYICovCisjZGVmaW5lIFdNODk4M19CWVBMMlJNSVhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJZUEwyUk1JWCAqLworI2RlZmluZSBXTTg5ODNfQllQUjJMTUlYICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBCWVBSMkxNSVggKi8KKyNkZWZpbmUgV004OTgzX0JZUFIyTE1JWF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQllQUjJMTUlYICovCisjZGVmaW5lIFdNODk4M19CWVBSMkxNSVhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIEJZUFIyTE1JWCAqLworI2RlZmluZSBXTTg5ODNfQllQUjJMTUlYX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBCWVBSMkxNSVggKi8KKyNkZWZpbmUgV004OTgzX01VVEVSUEdBMklOViAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTVVURVJQR0EySU5WICovCisjZGVmaW5lIFdNODk4M19NVVRFUlBHQTJJTlZfTUFTSyAgICAgICAgICAgICAgICAweDAwMjAgIC8qIE1VVEVSUEdBMklOViAqLworI2RlZmluZSBXTTg5ODNfTVVURVJQR0EySU5WX1NISUZUICAgICAgICAgICAgICAgICAgICA1ICAvKiBNVVRFUlBHQTJJTlYgKi8KKyNkZWZpbmUgV004OTgzX01VVEVSUEdBMklOVl9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogTVVURVJQR0EySU5WICovCisjZGVmaW5lIFdNODk4M19JTlZST1VUMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIElOVlJPVVQyICovCisjZGVmaW5lIFdNODk4M19JTlZST1VUMl9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIElOVlJPVVQyICovCisjZGVmaW5lIFdNODk4M19JTlZST1VUMl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIElOVlJPVVQyICovCisjZGVmaW5lIFdNODk4M19JTlZST1VUMl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOVlJPVVQyICovCisjZGVmaW5lIFdNODk4M19CRUVQVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMEUgIC8qIEJFRVBWT0wgLSBbMzoxXSAqLworI2RlZmluZSBXTTg5ODNfQkVFUFZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBCRUVQVk9MIC0gWzM6MV0gKi8KKyNkZWZpbmUgV004OTgzX0JFRVBWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogQkVFUFZPTCAtIFszOjFdICovCisjZGVmaW5lIFdNODk4M19CRUVQRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEJFRVBFTiAqLworI2RlZmluZSBXTTg5ODNfQkVFUEVOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBCRUVQRU4gKi8KKyNkZWZpbmUgV004OTgzX0JFRVBFTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQkVFUEVOICovCisjZGVmaW5lIFdNODk4M19CRUVQRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJFRVBFTiAqLworCisvKgorICogUjQ0ICgweDJDKSAtIElucHV0IGN0cmwKKyAqLworI2RlZmluZSBXTTg5ODNfTUJWU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBNQlZTRUwgKi8KKyNkZWZpbmUgV004OTgzX01CVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogTUJWU0VMICovCisjZGVmaW5lIFdNODk4M19NQlZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE1CVlNFTCAqLworI2RlZmluZSBXTTg5ODNfTUJWU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNQlZTRUwgKi8KKyNkZWZpbmUgV004OTgzX1IyXzJJTlBQR0EgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUjJfMklOUFBHQSAqLworI2RlZmluZSBXTTg5ODNfUjJfMklOUFBHQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBSMl8ySU5QUEdBICovCisjZGVmaW5lIFdNODk4M19SMl8ySU5QUEdBX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFIyXzJJTlBQR0EgKi8KKyNkZWZpbmUgV004OTgzX1IyXzJJTlBQR0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogUjJfMklOUFBHQSAqLworI2RlZmluZSBXTTg5ODNfUklOMklOUFBHQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBSSU4ySU5QUEdBICovCisjZGVmaW5lIFdNODk4M19SSU4ySU5QUEdBX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFJJTjJJTlBQR0EgKi8KKyNkZWZpbmUgV004OTgzX1JJTjJJTlBQR0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNSAgLyogUklOMklOUFBHQSAqLworI2RlZmluZSBXTTg5ODNfUklOMklOUFBHQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSSU4ySU5QUEdBICovCisjZGVmaW5lIFdNODk4M19SSVAySU5QUEdBICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFJJUDJJTlBQR0EgKi8KKyNkZWZpbmUgV004OTgzX1JJUDJJTlBQR0FfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogUklQMklOUFBHQSAqLworI2RlZmluZSBXTTg5ODNfUklQMklOUFBHQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBSSVAySU5QUEdBICovCisjZGVmaW5lIFdNODk4M19SSVAySU5QUEdBX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJJUDJJTlBQR0EgKi8KKyNkZWZpbmUgV004OTgzX0wyXzJJTlBQR0EgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogTDJfMklOUFBHQSAqLworI2RlZmluZSBXTTg5ODNfTDJfMklOUFBHQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBMMl8ySU5QUEdBICovCisjZGVmaW5lIFdNODk4M19MMl8ySU5QUEdBX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEwyXzJJTlBQR0EgKi8KKyNkZWZpbmUgV004OTgzX0wyXzJJTlBQR0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTDJfMklOUFBHQSAqLworI2RlZmluZSBXTTg5ODNfTElOMklOUFBHQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMSU4ySU5QUEdBICovCisjZGVmaW5lIFdNODk4M19MSU4ySU5QUEdBX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIExJTjJJTlBQR0EgKi8KKyNkZWZpbmUgV004OTgzX0xJTjJJTlBQR0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTElOMklOUFBHQSAqLworI2RlZmluZSBXTTg5ODNfTElOMklOUFBHQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSU4ySU5QUEdBICovCisjZGVmaW5lIFdNODk4M19MSVAySU5QUEdBICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExJUDJJTlBQR0EgKi8KKyNkZWZpbmUgV004OTgzX0xJUDJJTlBQR0FfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTElQMklOUFBHQSAqLworI2RlZmluZSBXTTg5ODNfTElQMklOUFBHQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMSVAySU5QUEdBICovCisjZGVmaW5lIFdNODk4M19MSVAySU5QUEdBX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExJUDJJTlBQR0EgKi8KKworLyoKKyAqIFI0NSAoMHgyRCkgLSBMZWZ0IElOUCBQR0EgZ2FpbiBjdHJsCisgKi8KKyNkZWZpbmUgV004OTgzX0lOUEdBVlUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU5QR0FWVSAqLworI2RlZmluZSBXTTg5ODNfSU5QR0FWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTlBHQVZVICovCisjZGVmaW5lIFdNODk4M19JTlBHQVZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElOUEdBVlUgKi8KKyNkZWZpbmUgV004OTgzX0lOUEdBVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU5QR0FWVSAqLworI2RlZmluZSBXTTg5ODNfSU5QUEdBWkNMICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBJTlBQR0FaQ0wgKi8KKyNkZWZpbmUgV004OTgzX0lOUFBHQVpDTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSU5QUEdBWkNMICovCisjZGVmaW5lIFdNODk4M19JTlBQR0FaQ0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIElOUFBHQVpDTCAqLworI2RlZmluZSBXTTg5ODNfSU5QUEdBWkNMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTlBQR0FaQ0wgKi8KKyNkZWZpbmUgV004OTgzX0lOUFBHQU1VVEVMICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogSU5QUEdBTVVURUwgKi8KKyNkZWZpbmUgV004OTgzX0lOUFBHQU1VVEVMX01BU0sgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogSU5QUEdBTVVURUwgKi8KKyNkZWZpbmUgV004OTgzX0lOUFBHQU1VVEVMX1NISUZUICAgICAgICAgICAgICAgICAgICAgNiAgLyogSU5QUEdBTVVURUwgKi8KKyNkZWZpbmUgV004OTgzX0lOUFBHQU1VVEVMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU5QUEdBTVVURUwgKi8KKyNkZWZpbmUgV004OTgzX0lOUFBHQVZPTExfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAzRiAgLyogSU5QUEdBVk9MTCAtIFs1OjBdICovCisjZGVmaW5lIFdNODk4M19JTlBQR0FWT0xMX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIElOUFBHQVZPTEwgLSBbNTowXSAqLworI2RlZmluZSBXTTg5ODNfSU5QUEdBVk9MTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBJTlBQR0FWT0xMIC0gWzU6MF0gKi8KKworLyoKKyAqIFI0NiAoMHgyRSkgLSBSaWdodCBJTlAgUEdBIGdhaW4gY3RybAorICovCisjZGVmaW5lIFdNODk4M19JTlBHQVZVICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElOUEdBVlUgKi8KKyNkZWZpbmUgV004OTgzX0lOUEdBVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU5QR0FWVSAqLworI2RlZmluZSBXTTg5ODNfSU5QR0FWVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJTlBHQVZVICovCisjZGVmaW5lIFdNODk4M19JTlBHQVZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOUEdBVlUgKi8KKyNkZWZpbmUgV004OTgzX0lOUFBHQVpDUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSU5QUEdBWkNSICovCisjZGVmaW5lIFdNODk4M19JTlBQR0FaQ1JfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIElOUFBHQVpDUiAqLworI2RlZmluZSBXTTg5ODNfSU5QUEdBWkNSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBJTlBQR0FaQ1IgKi8KKyNkZWZpbmUgV004OTgzX0lOUFBHQVpDUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU5QUEdBWkNSICovCisjZGVmaW5lIFdNODk4M19JTlBQR0FNVVRFUiAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIElOUFBHQU1VVEVSICovCisjZGVmaW5lIFdNODk4M19JTlBQR0FNVVRFUl9NQVNLICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIElOUFBHQU1VVEVSICovCisjZGVmaW5lIFdNODk4M19JTlBQR0FNVVRFUl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIElOUFBHQU1VVEVSICovCisjZGVmaW5lIFdNODk4M19JTlBQR0FNVVRFUl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOUFBHQU1VVEVSICovCisjZGVmaW5lIFdNODk4M19JTlBQR0FWT0xSX01BU0sgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIElOUFBHQVZPTFIgLSBbNTowXSAqLworI2RlZmluZSBXTTg5ODNfSU5QUEdBVk9MUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJTlBQR0FWT0xSIC0gWzU6MF0gKi8KKyNkZWZpbmUgV004OTgzX0lOUFBHQVZPTFJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgNiAgLyogSU5QUEdBVk9MUiAtIFs1OjBdICovCisKKy8qCisgKiBSNDcgKDB4MkYpIC0gTGVmdCBBREMgQk9PU1QgY3RybAorICovCisjZGVmaW5lIFdNODk4M19QR0FCT09TVEwgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFBHQUJPT1NUTCAqLworI2RlZmluZSBXTTg5ODNfUEdBQk9PU1RMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBQR0FCT09TVEwgKi8KKyNkZWZpbmUgV004OTgzX1BHQUJPT1NUTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogUEdBQk9PU1RMICovCisjZGVmaW5lIFdNODk4M19QR0FCT09TVExfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBHQUJPT1NUTCAqLworI2RlZmluZSBXTTg5ODNfTDJfMkJPT1NUVk9MX01BU0sgICAgICAgICAgICAgICAgMHgwMDcwICAvKiBMMl8yQk9PU1RWT0wgLSBbNjo0XSAqLworI2RlZmluZSBXTTg5ODNfTDJfMkJPT1NUVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICA0ICAvKiBMMl8yQk9PU1RWT0wgLSBbNjo0XSAqLworI2RlZmluZSBXTTg5ODNfTDJfMkJPT1NUVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAzICAvKiBMMl8yQk9PU1RWT0wgLSBbNjo0XSAqLworI2RlZmluZSBXTTg5ODNfQVVYTDJCT09TVFZPTF9NQVNLICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBBVVhMMkJPT1NUVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTgzX0FVWEwyQk9PU1RWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogQVVYTDJCT09TVFZPTCAtIFsyOjBdICovCisjZGVmaW5lIFdNODk4M19BVVhMMkJPT1NUVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgIDMgIC8qIEFVWEwyQk9PU1RWT0wgLSBbMjowXSAqLworCisvKgorICogUjQ4ICgweDMwKSAtIFJpZ2h0IEFEQyBCT09TVCBjdHJsCisgKi8KKyNkZWZpbmUgV004OTgzX1BHQUJPT1NUUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogUEdBQk9PU1RSICovCisjZGVmaW5lIFdNODk4M19QR0FCT09TVFJfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFBHQUJPT1NUUiAqLworI2RlZmluZSBXTTg5ODNfUEdBQk9PU1RSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBQR0FCT09TVFIgKi8KKyNkZWZpbmUgV004OTgzX1BHQUJPT1NUUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUEdBQk9PU1RSICovCisjZGVmaW5lIFdNODk4M19SMl8yQk9PU1RWT0xfTUFTSyAgICAgICAgICAgICAgICAweDAwNzAgIC8qIFIyXzJCT09TVFZPTCAtIFs2OjRdICovCisjZGVmaW5lIFdNODk4M19SMl8yQk9PU1RWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgIDQgIC8qIFIyXzJCT09TVFZPTCAtIFs2OjRdICovCisjZGVmaW5lIFdNODk4M19SMl8yQk9PU1RWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgIDMgIC8qIFIyXzJCT09TVFZPTCAtIFs2OjRdICovCisjZGVmaW5lIFdNODk4M19BVVhSMkJPT1NUVk9MX01BU0sgICAgICAgICAgICAgICAweDAwMDcgIC8qIEFVWFIyQk9PU1RWT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg5ODNfQVVYUjJCT09TVFZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBBVVhSMkJPT1NUVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTgzX0FVWFIyQk9PU1RWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgMyAgLyogQVVYUjJCT09TVFZPTCAtIFsyOjBdICovCisKKy8qCisgKiBSNDkgKDB4MzEpIC0gT3V0cHV0IGN0cmwKKyAqLworI2RlZmluZSBXTTg5ODNfREFDTDJSTUlYICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBEQUNMMlJNSVggKi8KKyNkZWZpbmUgV004OTgzX0RBQ0wyUk1JWF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogREFDTDJSTUlYICovCisjZGVmaW5lIFdNODk4M19EQUNMMlJNSVhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIERBQ0wyUk1JWCAqLworI2RlZmluZSBXTTg5ODNfREFDTDJSTUlYX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNMMlJNSVggKi8KKyNkZWZpbmUgV004OTgzX0RBQ1IyTE1JWCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogREFDUjJMTUlYICovCisjZGVmaW5lIFdNODk4M19EQUNSMkxNSVhfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIERBQ1IyTE1JWCAqLworI2RlZmluZSBXTTg5ODNfREFDUjJMTUlYX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBEQUNSMkxNSVggKi8KKyNkZWZpbmUgV004OTgzX0RBQ1IyTE1JWF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDUjJMTUlYICovCisjZGVmaW5lIFdNODk4M19PVVQ0Qk9PU1QgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIE9VVDRCT09TVCAqLworI2RlZmluZSBXTTg5ODNfT1VUNEJPT1NUX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBPVVQ0Qk9PU1QgKi8KKyNkZWZpbmUgV004OTgzX09VVDRCT09TVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogT1VUNEJPT1NUICovCisjZGVmaW5lIFdNODk4M19PVVQ0Qk9PU1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDRCT09TVCAqLworI2RlZmluZSBXTTg5ODNfT1VUM0JPT1NUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBPVVQzQk9PU1QgKi8KKyNkZWZpbmUgV004OTgzX09VVDNCT09TVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogT1VUM0JPT1NUICovCisjZGVmaW5lIFdNODk4M19PVVQzQk9PU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE9VVDNCT09TVCAqLworI2RlZmluZSBXTTg5ODNfT1VUM0JPT1NUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzQk9PU1QgKi8KKyNkZWZpbmUgV004OTgzX1NQS0JPT1NUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogU1BLQk9PU1QgKi8KKyNkZWZpbmUgV004OTgzX1NQS0JPT1NUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogU1BLQk9PU1QgKi8KKyNkZWZpbmUgV004OTgzX1NQS0JPT1NUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogU1BLQk9PU1QgKi8KKyNkZWZpbmUgV004OTgzX1NQS0JPT1NUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1BLQk9PU1QgKi8KKyNkZWZpbmUgV004OTgzX1RTREVOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogVFNERU4gKi8KKyNkZWZpbmUgV004OTgzX1RTREVOX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogVFNERU4gKi8KKyNkZWZpbmUgV004OTgzX1RTREVOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogVFNERU4gKi8KKyNkZWZpbmUgV004OTgzX1RTREVOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogVFNERU4gKi8KKyNkZWZpbmUgV004OTgzX1ZST0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogVlJPSSAqLworI2RlZmluZSBXTTg5ODNfVlJPSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBWUk9JICovCisjZGVmaW5lIFdNODk4M19WUk9JX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFZST0kgKi8KKyNkZWZpbmUgV004OTgzX1ZST0lfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogVlJPSSAqLworCisvKgorICogUjUwICgweDMyKSAtIExlZnQgbWl4ZXIgY3RybAorICovCisjZGVmaW5lIFdNODk4M19BVVhMTUlYVk9MX01BU0sgICAgICAgICAgICAgICAgICAweDAxQzAgIC8qIEFVWExNSVhWT0wgLSBbODo2XSAqLworI2RlZmluZSBXTTg5ODNfQVVYTE1JWFZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBBVVhMTUlYVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004OTgzX0FVWExNSVhWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMyAgLyogQVVYTE1JWFZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODk4M19BVVhMMkxNSVggICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFVWEwyTE1JWCAqLworI2RlZmluZSBXTTg5ODNfQVVYTDJMTUlYX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBBVVhMMkxNSVggKi8KKyNkZWZpbmUgV004OTgzX0FVWEwyTE1JWF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogQVVYTDJMTUlYICovCisjZGVmaW5lIFdNODk4M19BVVhMMkxNSVhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFVWEwyTE1JWCAqLworI2RlZmluZSBXTTg5ODNfQllQTE1JWFZPTF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDFDICAvKiBCWVBMTUlYVk9MIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV004OTgzX0JZUExNSVhWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQllQTE1JWFZPTCAtIFs0OjJdICovCisjZGVmaW5lIFdNODk4M19CWVBMTUlYVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEJZUExNSVhWT0wgLSBbNDoyXSAqLworI2RlZmluZSBXTTg5ODNfQllQTDJMTUlYICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBCWVBMMkxNSVggKi8KKyNkZWZpbmUgV004OTgzX0JZUEwyTE1JWF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQllQTDJMTUlYICovCisjZGVmaW5lIFdNODk4M19CWVBMMkxNSVhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJZUEwyTE1JWCAqLworI2RlZmluZSBXTTg5ODNfQllQTDJMTUlYX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBCWVBMMkxNSVggKi8KKyNkZWZpbmUgV004OTgzX0RBQ0wyTE1JWCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogREFDTDJMTUlYICovCisjZGVmaW5lIFdNODk4M19EQUNMMkxNSVhfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIERBQ0wyTE1JWCAqLworI2RlZmluZSBXTTg5ODNfREFDTDJMTUlYX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEQUNMMkxNSVggKi8KKyNkZWZpbmUgV004OTgzX0RBQ0wyTE1JWF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDTDJMTUlYICovCisKKy8qCisgKiBSNTEgKDB4MzMpIC0gUmlnaHQgbWl4ZXIgY3RybAorICovCisjZGVmaW5lIFdNODk4M19BVVhSTUlYVk9MX01BU0sgICAgICAgICAgICAgICAgICAweDAxQzAgIC8qIEFVWFJNSVhWT0wgLSBbODo2XSAqLworI2RlZmluZSBXTTg5ODNfQVVYUk1JWFZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBBVVhSTUlYVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004OTgzX0FVWFJNSVhWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMyAgLyogQVVYUk1JWFZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODk4M19BVVhSMlJNSVggICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFVWFIyUk1JWCAqLworI2RlZmluZSBXTTg5ODNfQVVYUjJSTUlYX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBBVVhSMlJNSVggKi8KKyNkZWZpbmUgV004OTgzX0FVWFIyUk1JWF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogQVVYUjJSTUlYICovCisjZGVmaW5lIFdNODk4M19BVVhSMlJNSVhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFVWFIyUk1JWCAqLworI2RlZmluZSBXTTg5ODNfQllQUk1JWFZPTF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDFDICAvKiBCWVBSTUlYVk9MIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV004OTgzX0JZUFJNSVhWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQllQUk1JWFZPTCAtIFs0OjJdICovCisjZGVmaW5lIFdNODk4M19CWVBSTUlYVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEJZUFJNSVhWT0wgLSBbNDoyXSAqLworI2RlZmluZSBXTTg5ODNfQllQUjJSTUlYICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBCWVBSMlJNSVggKi8KKyNkZWZpbmUgV004OTgzX0JZUFIyUk1JWF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQllQUjJSTUlYICovCisjZGVmaW5lIFdNODk4M19CWVBSMlJNSVhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJZUFIyUk1JWCAqLworI2RlZmluZSBXTTg5ODNfQllQUjJSTUlYX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBCWVBSMlJNSVggKi8KKyNkZWZpbmUgV004OTgzX0RBQ1IyUk1JWCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogREFDUjJSTUlYICovCisjZGVmaW5lIFdNODk4M19EQUNSMlJNSVhfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIERBQ1IyUk1JWCAqLworI2RlZmluZSBXTTg5ODNfREFDUjJSTUlYX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEQUNSMlJNSVggKi8KKyNkZWZpbmUgV004OTgzX0RBQ1IyUk1JWF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDUjJSTUlYICovCisKKy8qCisgKiBSNTIgKDB4MzQpIC0gTE9VVDEgKEhQKSB2b2x1bWUgY3RybAorICovCisjZGVmaW5lIFdNODk4M19PVVQxVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDFWVSAqLworI2RlZmluZSBXTTg5ODNfT1VUMVZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQxVlUgKi8KKyNkZWZpbmUgV004OTgzX09VVDFWVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUMVZVICovCisjZGVmaW5lIFdNODk4M19PVVQxVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDFWVSAqLworI2RlZmluZSBXTTg5ODNfTE9VVDFaQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMT1VUMVpDICovCisjZGVmaW5lIFdNODk4M19MT1VUMVpDX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExPVVQxWkMgKi8KKyNkZWZpbmUgV004OTgzX0xPVVQxWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTE9VVDFaQyAqLworI2RlZmluZSBXTTg5ODNfTE9VVDFaQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT1VUMVpDICovCisjZGVmaW5lIFdNODk4M19MT1VUMU1VVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExPVVQxTVVURSAqLworI2RlZmluZSBXTTg5ODNfTE9VVDFNVVRFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBMT1VUMU1VVEUgKi8KKyNkZWZpbmUgV004OTgzX0xPVVQxTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTE9VVDFNVVRFICovCisjZGVmaW5lIFdNODk4M19MT1VUMU1VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPVVQxTVVURSAqLworI2RlZmluZSBXTTg5ODNfTE9VVDFWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBMT1VUMVZPTCAtIFs1OjBdICovCisjZGVmaW5lIFdNODk4M19MT1VUMVZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExPVVQxVk9MIC0gWzU6MF0gKi8KKyNkZWZpbmUgV004OTgzX0xPVVQxVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTE9VVDFWT0wgLSBbNTowXSAqLworCisvKgorICogUjUzICgweDM1KSAtIFJPVVQxIChIUCkgdm9sdW1lIGN0cmwKKyAqLworI2RlZmluZSBXTTg5ODNfT1VUMVZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQxVlUgKi8KKyNkZWZpbmUgV004OTgzX09VVDFWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUMVZVICovCisjZGVmaW5lIFdNODk4M19PVVQxVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDFWVSAqLworI2RlZmluZSBXTTg5ODNfT1VUMVZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQxVlUgKi8KKyNkZWZpbmUgV004OTgzX1JPVVQxWkMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogUk9VVDFaQyAqLworI2RlZmluZSBXTTg5ODNfUk9VVDFaQ19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBST1VUMVpDICovCisjZGVmaW5lIFdNODk4M19ST1VUMVpDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIFJPVVQxWkMgKi8KKyNkZWZpbmUgV004OTgzX1JPVVQxWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9VVDFaQyAqLworI2RlZmluZSBXTTg5ODNfUk9VVDFNVVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBST1VUMU1VVEUgKi8KKyNkZWZpbmUgV004OTgzX1JPVVQxTVVURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUk9VVDFNVVRFICovCisjZGVmaW5lIFdNODk4M19ST1VUMU1VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFJPVVQxTVVURSAqLworI2RlZmluZSBXTTg5ODNfUk9VVDFNVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBST1VUMU1VVEUgKi8KKyNkZWZpbmUgV004OTgzX1JPVVQxVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAzRiAgLyogUk9VVDFWT0wgLSBbNTowXSAqLworI2RlZmluZSBXTTg5ODNfUk9VVDFWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBST1VUMVZPTCAtIFs1OjBdICovCisjZGVmaW5lIFdNODk4M19ST1VUMVZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFJPVVQxVk9MIC0gWzU6MF0gKi8KKworLyoKKyAqIFI1NCAoMHgzNikgLSBMT1VUMiAoU1BLKSB2b2x1bWUgY3RybAorICovCisjZGVmaW5lIFdNODk4M19PVVQyVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDJWVSAqLworI2RlZmluZSBXTTg5ODNfT1VUMlZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQyVlUgKi8KKyNkZWZpbmUgV004OTgzX09VVDJWVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUMlZVICovCisjZGVmaW5lIFdNODk4M19PVVQyVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDJWVSAqLworI2RlZmluZSBXTTg5ODNfTE9VVDJaQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMT1VUMlpDICovCisjZGVmaW5lIFdNODk4M19MT1VUMlpDX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExPVVQyWkMgKi8KKyNkZWZpbmUgV004OTgzX0xPVVQyWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTE9VVDJaQyAqLworI2RlZmluZSBXTTg5ODNfTE9VVDJaQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT1VUMlpDICovCisjZGVmaW5lIFdNODk4M19MT1VUMk1VVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExPVVQyTVVURSAqLworI2RlZmluZSBXTTg5ODNfTE9VVDJNVVRFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBMT1VUMk1VVEUgKi8KKyNkZWZpbmUgV004OTgzX0xPVVQyTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTE9VVDJNVVRFICovCisjZGVmaW5lIFdNODk4M19MT1VUMk1VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPVVQyTVVURSAqLworI2RlZmluZSBXTTg5ODNfTE9VVDJWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBMT1VUMlZPTCAtIFs1OjBdICovCisjZGVmaW5lIFdNODk4M19MT1VUMlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExPVVQyVk9MIC0gWzU6MF0gKi8KKyNkZWZpbmUgV004OTgzX0xPVVQyVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTE9VVDJWT0wgLSBbNTowXSAqLworCisvKgorICogUjU1ICgweDM3KSAtIFJPVVQyIChTUEspIHZvbHVtZSBjdHJsCisgKi8KKyNkZWZpbmUgV004OTgzX09VVDJWVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUMlZVICovCisjZGVmaW5lIFdNODk4M19PVVQyVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDJWVSAqLworI2RlZmluZSBXTTg5ODNfT1VUMlZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQyVlUgKi8KKyNkZWZpbmUgV004OTgzX09VVDJWVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMlZVICovCisjZGVmaW5lIFdNODk4M19ST1VUMlpDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFJPVVQyWkMgKi8KKyNkZWZpbmUgV004OTgzX1JPVVQyWkNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogUk9VVDJaQyAqLworI2RlZmluZSBXTTg5ODNfUk9VVDJaQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBST1VUMlpDICovCisjZGVmaW5lIFdNODk4M19ST1VUMlpDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJPVVQyWkMgKi8KKyNkZWZpbmUgV004OTgzX1JPVVQyTVVURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUk9VVDJNVVRFICovCisjZGVmaW5lIFdNODk4M19ST1VUMk1VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFJPVVQyTVVURSAqLworI2RlZmluZSBXTTg5ODNfUk9VVDJNVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBST1VUMk1VVEUgKi8KKyNkZWZpbmUgV004OTgzX1JPVVQyTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9VVDJNVVRFICovCisjZGVmaW5lIFdNODk4M19ST1VUMlZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIFJPVVQyVk9MIC0gWzU6MF0gKi8KKyNkZWZpbmUgV004OTgzX1JPVVQyVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUk9VVDJWT0wgLSBbNTowXSAqLworI2RlZmluZSBXTTg5ODNfUk9VVDJWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBST1VUMlZPTCAtIFs1OjBdICovCisKKy8qCisgKiBSNTYgKDB4MzgpIC0gT1VUMyBtaXhlciBjdHJsCisgKi8KKyNkZWZpbmUgV004OTgzX09VVDNNVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogT1VUM01VVEUgKi8KKyNkZWZpbmUgV004OTgzX09VVDNNVVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogT1VUM01VVEUgKi8KKyNkZWZpbmUgV004OTgzX09VVDNNVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogT1VUM01VVEUgKi8KKyNkZWZpbmUgV004OTgzX09VVDNNVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM01VVEUgKi8KKyNkZWZpbmUgV004OTgzX09VVDRfMk9VVDMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogT1VUNF8yT1VUMyAqLworI2RlZmluZSBXTTg5ODNfT1VUNF8yT1VUM19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBPVVQ0XzJPVVQzICovCisjZGVmaW5lIFdNODk4M19PVVQ0XzJPVVQzX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE9VVDRfMk9VVDMgKi8KKyNkZWZpbmUgV004OTgzX09VVDRfMk9VVDNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNF8yT1VUMyAqLworI2RlZmluZSBXTTg5ODNfQllQTDJPVVQzICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBCWVBMMk9VVDMgKi8KKyNkZWZpbmUgV004OTgzX0JZUEwyT1VUM19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQllQTDJPVVQzICovCisjZGVmaW5lIFdNODk4M19CWVBMMk9VVDNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEJZUEwyT1VUMyAqLworI2RlZmluZSBXTTg5ODNfQllQTDJPVVQzX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBCWVBMMk9VVDMgKi8KKyNkZWZpbmUgV004OTgzX0xNSVgyT1VUMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTE1JWDJPVVQzICovCisjZGVmaW5lIFdNODk4M19MTUlYMk9VVDNfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIExNSVgyT1VUMyAqLworI2RlZmluZSBXTTg5ODNfTE1JWDJPVVQzX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMTUlYMk9VVDMgKi8KKyNkZWZpbmUgV004OTgzX0xNSVgyT1VUM19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE1JWDJPVVQzICovCisjZGVmaW5lIFdNODk4M19MREFDMk9VVDMgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExEQUMyT1VUMyAqLworI2RlZmluZSBXTTg5ODNfTERBQzJPVVQzX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMREFDMk9VVDMgKi8KKyNkZWZpbmUgV004OTgzX0xEQUMyT1VUM19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTERBQzJPVVQzICovCisjZGVmaW5lIFdNODk4M19MREFDMk9VVDNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExEQUMyT1VUMyAqLworCisvKgorICogUjU3ICgweDM5KSAtIE9VVDQgKE1PTk8pIG1peCBjdHJsCisgKi8KKyNkZWZpbmUgV004OTgzX09VVDNfMk9VVDQgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogT1VUM18yT1VUNCAqLworI2RlZmluZSBXTTg5ODNfT1VUM18yT1VUNF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBPVVQzXzJPVVQ0ICovCisjZGVmaW5lIFdNODk4M19PVVQzXzJPVVQ0X1NISUZUICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIE9VVDNfMk9VVDQgKi8KKyNkZWZpbmUgV004OTgzX09VVDNfMk9VVDRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM18yT1VUNCAqLworI2RlZmluZSBXTTg5ODNfT1VUNE1VVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBPVVQ0TVVURSAqLworI2RlZmluZSBXTTg5ODNfT1VUNE1VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBPVVQ0TVVURSAqLworI2RlZmluZSBXTTg5ODNfT1VUNE1VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBPVVQ0TVVURSAqLworI2RlZmluZSBXTTg5ODNfT1VUNE1VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0TVVURSAqLworI2RlZmluZSBXTTg5ODNfT1VUNEFUVE4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBPVVQ0QVRUTiAqLworI2RlZmluZSBXTTg5ODNfT1VUNEFUVE5fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBPVVQ0QVRUTiAqLworI2RlZmluZSBXTTg5ODNfT1VUNEFUVE5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBPVVQ0QVRUTiAqLworI2RlZmluZSBXTTg5ODNfT1VUNEFUVE5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0QVRUTiAqLworI2RlZmluZSBXTTg5ODNfTE1JWDJPVVQ0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBMTUlYMk9VVDQgKi8KKyNkZWZpbmUgV004OTgzX0xNSVgyT1VUNF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTE1JWDJPVVQ0ICovCisjZGVmaW5lIFdNODk4M19MTUlYMk9VVDRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIExNSVgyT1VUNCAqLworI2RlZmluZSBXTTg5ODNfTE1JWDJPVVQ0X1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMTUlYMk9VVDQgKi8KKyNkZWZpbmUgV004OTgzX0xEQUMyT1VUNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTERBQzJPVVQ0ICovCisjZGVmaW5lIFdNODk4M19MREFDMk9VVDRfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIExEQUMyT1VUNCAqLworI2RlZmluZSBXTTg5ODNfTERBQzJPVVQ0X1NISUZUICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBMREFDMk9VVDQgKi8KKyNkZWZpbmUgV004OTgzX0xEQUMyT1VUNF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERBQzJPVVQ0ICovCisjZGVmaW5lIFdNODk4M19CWVBSMk9VVDQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEJZUFIyT1VUNCAqLworI2RlZmluZSBXTTg5ODNfQllQUjJPVVQ0X01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBCWVBSMk9VVDQgKi8KKyNkZWZpbmUgV004OTgzX0JZUFIyT1VUNF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQllQUjJPVVQ0ICovCisjZGVmaW5lIFdNODk4M19CWVBSMk9VVDRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJZUFIyT1VUNCAqLworI2RlZmluZSBXTTg5ODNfUk1JWDJPVVQ0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBSTUlYMk9VVDQgKi8KKyNkZWZpbmUgV004OTgzX1JNSVgyT1VUNF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogUk1JWDJPVVQ0ICovCisjZGVmaW5lIFdNODk4M19STUlYMk9VVDRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJNSVgyT1VUNCAqLworI2RlZmluZSBXTTg5ODNfUk1JWDJPVVQ0X1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSTUlYMk9VVDQgKi8KKyNkZWZpbmUgV004OTgzX1JEQUMyT1VUNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogUkRBQzJPVVQ0ICovCisjZGVmaW5lIFdNODk4M19SREFDMk9VVDRfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFJEQUMyT1VUNCAqLworI2RlZmluZSBXTTg5ODNfUkRBQzJPVVQ0X1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSREFDMk9VVDQgKi8KKyNkZWZpbmUgV004OTgzX1JEQUMyT1VUNF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkRBQzJPVVQ0ICovCisKKy8qCisgKiBSNjEgKDB4M0QpIC0gQklBUyBDVFJMCisgKi8KKyNkZWZpbmUgV004OTgzX0JJQVNDVVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQklBU0NVVCAqLworI2RlZmluZSBXTTg5ODNfQklBU0NVVF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBCSUFTQ1VUICovCisjZGVmaW5lIFdNODk4M19CSUFTQ1VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEJJQVNDVVQgKi8KKyNkZWZpbmUgV004OTgzX0JJQVNDVVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQklBU0NVVCAqLworI2RlZmluZSBXTTg5ODNfSEFMRklQQklBUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBIQUxGSVBCSUFTICovCisjZGVmaW5lIFdNODk4M19IQUxGSVBCSUFTX01BU0sgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEhBTEZJUEJJQVMgKi8KKyNkZWZpbmUgV004OTgzX0hBTEZJUEJJQVNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNyAgLyogSEFMRklQQklBUyAqLworI2RlZmluZSBXTTg5ODNfSEFMRklQQklBU19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBIQUxGSVBCSUFTICovCisjZGVmaW5lIFdNODk4M19WQkJJQVNUU1RfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwNjAgIC8qIFZCQklBU1RTVCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk4M19WQkJJQVNUU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIFZCQklBU1RTVCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk4M19WQkJJQVNUU1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFZCQklBU1RTVCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk4M19CVUZCSUFTX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMTggIC8qIEJVRkJJQVMgLSBbNDozXSAqLworI2RlZmluZSBXTTg5ODNfQlVGQklBU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBCVUZCSUFTIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004OTgzX0JVRkJJQVNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQlVGQklBUyAtIFs0OjNdICovCisjZGVmaW5lIFdNODk4M19BRENCSUFTX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDYgIC8qIEFEQ0JJQVMgLSBbMjoxXSAqLworI2RlZmluZSBXTTg5ODNfQURDQklBU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENCSUFTIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004OTgzX0FEQ0JJQVNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQURDQklBUyAtIFsyOjFdICovCisjZGVmaW5lIFdNODk4M19IQUxGT1BCSUFTICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEhBTEZPUEJJQVMgKi8KKyNkZWZpbmUgV004OTgzX0hBTEZPUEJJQVNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSEFMRk9QQklBUyAqLworI2RlZmluZSBXTTg5ODNfSEFMRk9QQklBU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBIQUxGT1BCSUFTICovCisjZGVmaW5lIFdNODk4M19IQUxGT1BCSUFTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhBTEZPUEJJQVMgKi8KKworZW51bSBjbGtfc3JjIHsKKwlXTTg5ODNfQ0xLU1JDX01DTEssCisJV004OTgzX0NMS1NSQ19QTEwKK307CisKKyNlbmRpZiAvKiBfV004OTgzX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jCmluZGV4IDNjMmVlMWIuLjZhZjIzZDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYwpAQCAtMTMsNyArMTMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYwppbmRleCA5ZTVmZjc4Li42ZTg1Yjg4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMKQEAgLTg3Niw3ICs4NzYsNyBAQAogCQkgICBsZWZ0X3NwZWFrZXJfbWl4ZXIsIEFSUkFZX1NJWkUobGVmdF9zcGVha2VyX21peGVyKSksCiBTTkRfU09DX0RBUE1fTUlYRVIoIlNQS1IiLCBXTTg5OTNfUE9XRVJfTUFOQUdFTUVOVF8zLCA5LCAwLAogCQkgICByaWdodF9zcGVha2VyX21peGVyLCBBUlJBWV9TSVpFKHJpZ2h0X3NwZWFrZXJfbWl4ZXIpKSwKLQorU05EX1NPQ19EQVBNX1BHQSgiRGlyZWN0IFZvaWNlIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHJvdXRlc1tdID0gewpAQCAtMTQzNCw2ICsxNDM0LDcgQEAKIAogCXdtODk5My0+aHVic19kYXRhLmhwX3N0YXJ0dXBfbW9kZSA9IDE7CiAJd204OTkzLT5odWJzX2RhdGEuZGNzX2NvZGVzID0gLTI7CisJd204OTkzLT5odWJzX2RhdGEuc2VyaWVzX3N0YXJ0dXAgPSAxOwogCiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCBTTkRfU09DX0kyQyk7CiAJaWYgKHJldCAhPSAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYwppbmRleCA5NzBhOTVjLi4wOWU2ODBhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKQEAgLTE5NSwxMCArMTk1LDYgQEAKIAkJCWFpZiArIDEsIHJhdGUpOwogCX0KIAotCWlmIChyYXRlICYmIHJhdGUgPCAzMDAwMDAwKQotCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiQUlGJWRDTEsgaXMgJWRIeiwgc2hvdWxkIGJlID49M01IeiBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZVxuIiwKLQkJCSBhaWYgKyAxLCByYXRlKTsKLQogCXdtODk5NC0+YWlmY2xrW2FpZl0gPSByYXRlOwogCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X0FJRjFfQ0xPQ0tJTkdfMSArIG9mZnNldCwKQEAgLTExNDYsMTMgKzExNDIsMzMgQEAKIAlsYXRlX2VuYWJsZV9ldiwgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAogU05EX1NPQ19EQVBNX1BHQV9FKCJMYXRlIERBQzJSIEVuYWJsZSBQR0EiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDAsCiAJbGF0ZV9lbmFibGVfZXYsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKK1NORF9TT0NfREFQTV9QR0FfRSgiRGlyZWN0IFZvaWNlIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwLAorCWxhdGVfZW5hYmxlX2V2LCBTTkRfU09DX0RBUE1fUFJFX1BNVSksCisKK1NORF9TT0NfREFQTV9NSVhFUl9FKCJTUEtMIiwgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfMywgOCwgMCwKKwkJICAgICBsZWZ0X3NwZWFrZXJfbWl4ZXIsIEFSUkFZX1NJWkUobGVmdF9zcGVha2VyX21peGVyKSwKKwkJICAgICBsYXRlX2VuYWJsZV9ldiwgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAorU05EX1NPQ19EQVBNX01JWEVSX0UoIlNQS1IiLCBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF8zLCA5LCAwLAorCQkgICAgIHJpZ2h0X3NwZWFrZXJfbWl4ZXIsIEFSUkFZX1NJWkUocmlnaHRfc3BlYWtlcl9taXhlciksCisJCSAgICAgbGF0ZV9lbmFibGVfZXYsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKK1NORF9TT0NfREFQTV9NVVhfRSgiTGVmdCBIZWFkcGhvbmUgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaHBsX211eCwKKwkJICAgbGF0ZV9lbmFibGVfZXYsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKK1NORF9TT0NfREFQTV9NVVhfRSgiUmlnaHQgSGVhZHBob25lIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmhwcl9tdXgsCisJCSAgIGxhdGVfZW5hYmxlX2V2LCBTTkRfU09DX0RBUE1fUFJFX1BNVSksCiAKIFNORF9TT0NfREFQTV9QT1NUKCJMYXRlIERpc2FibGUgUEdBIiwgbGF0ZV9kaXNhYmxlX2V2KQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHdtODk5NF9sYXRlY2xrX3dpZGdldHNbXSA9IHsKIFNORF9TT0NfREFQTV9TVVBQTFkoIkFJRjFDTEsiLCBXTTg5OTRfQUlGMV9DTE9DS0lOR18xLCAwLCAwLCBOVUxMLCAwKSwKLVNORF9TT0NfREFQTV9TVVBQTFkoIkFJRjJDTEsiLCBXTTg5OTRfQUlGMl9DTE9DS0lOR18xLCAwLCAwLCBOVUxMLCAwKQorU05EX1NPQ19EQVBNX1NVUFBMWSgiQUlGMkNMSyIsIFdNODk5NF9BSUYyX0NMT0NLSU5HXzEsIDAsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiRGlyZWN0IFZvaWNlIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9NSVhFUigiU1BLTCIsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzMsIDgsIDAsCisJCSAgIGxlZnRfc3BlYWtlcl9taXhlciwgQVJSQVlfU0laRShsZWZ0X3NwZWFrZXJfbWl4ZXIpKSwKK1NORF9TT0NfREFQTV9NSVhFUigiU1BLUiIsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzMsIDksIDAsCisJCSAgIHJpZ2h0X3NwZWFrZXJfbWl4ZXIsIEFSUkFZX1NJWkUocmlnaHRfc3BlYWtlcl9taXhlcikpLAorU05EX1NPQ19EQVBNX01VWCgiTGVmdCBIZWFkcGhvbmUgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaHBsX211eCksCitTTkRfU09DX0RBUE1fTVVYKCJSaWdodCBIZWFkcGhvbmUgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaHByX211eCksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204OTk0X2RhY19yZXZkX3dpZGdldHNbXSA9IHsKQEAgLTExOTAsNyArMTIwNiw2IEBACiBTTkRfU09DX0RBUE1fSU5QVVQoIkRNSUMyREFUIiksCiBTTkRfU09DX0RBUE1fSU5QVVQoIkNsb2NrIiksCiAKLVNORF9TT0NfREFQTV9NSUNCSUFTKCJNSUNCSUFTIiwgV004OTk0X01JQ0JJQVMsIDIsIDApLAogU05EX1NPQ19EQVBNX1NVUFBMWV9TKCJNSUNCSUFTIFN1cHBseSIsIDEsIFNORF9TT0NfTk9QTSwgMCwgMCwgbWljYmlhc19ldiwKIAkJICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAogCkBAIC0xMjgzLDE0ICsxMjk4LDYgQEAKIFNORF9TT0NfREFQTV9BREMoIkFEQ0wiLCBOVUxMLCBTTkRfU09DX05PUE0sIDEsIDApLAogU05EX1NPQ19EQVBNX0FEQygiQURDUiIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCksCiAKLVNORF9TT0NfREFQTV9NVVgoIkxlZnQgSGVhZHBob25lIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmhwbF9tdXgpLAotU05EX1NPQ19EQVBNX01VWCgiUmlnaHQgSGVhZHBob25lIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmhwcl9tdXgpLAotCi1TTkRfU09DX0RBUE1fTUlYRVIoIlNQS0wiLCBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF8zLCA4LCAwLAotCQkgICBsZWZ0X3NwZWFrZXJfbWl4ZXIsIEFSUkFZX1NJWkUobGVmdF9zcGVha2VyX21peGVyKSksCi1TTkRfU09DX0RBUE1fTUlYRVIoIlNQS1IiLCBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF8zLCA5LCAwLAotCQkgICByaWdodF9zcGVha2VyX21peGVyLCBBUlJBWV9TSVpFKHJpZ2h0X3NwZWFrZXJfbWl4ZXIpKSwKLQogU05EX1NPQ19EQVBNX1BPU1QoIkRlYnVnIGxvZyIsIHBvc3RfZXYpLAogfTsKIApAQCAtMTUwOSw4ICsxNTE2LDEwIEBACiAJeyAiQUlGMkRBQ0RBVCIsIE5VTEwsICJBSUYxREFDREFUIiB9LAogCXsgIkFJRjFBRENEQVQiLCBOVUxMLCAiQUlGMkFEQ0RBVCIgfSwKIAl7ICJBSUYyQURDREFUIiwgTlVMTCwgIkFJRjFBRENEQVQiIH0sCi0JeyAiTUlDQklBUyIsIE5VTEwsICJDTEtfU1lTIiB9LAotCXsgIk1JQ0JJQVMiLCBOVUxMLCAiTUlDQklBUyBTdXBwbHkiIH0sCisJeyAiTUlDQklBUzEiLCBOVUxMLCAiQ0xLX1NZUyIgfSwKKwl7ICJNSUNCSUFTMSIsIE5VTEwsICJNSUNCSUFTIFN1cHBseSIgfSwKKwl7ICJNSUNCSUFTMiIsIE5VTEwsICJDTEtfU1lTIiB9LAorCXsgIk1JQ0JJQVMyIiwgTlVMTCwgIk1JQ0JJQVMgU3VwcGx5IiB9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgd204OTk0X2ludGVyY29uW10gPSB7CkBAIC0xNjIzLDYgKzE2MzIsNyBAQAogCWludCByZWdfb2Zmc2V0LCByZXQ7CiAJc3RydWN0IGZsbF9kaXYgZmxsOwogCXUxNiByZWcsIGFpZjEsIGFpZjI7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCiAJYWlmMSA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTk0X0FJRjFfQ0xPQ0tJTkdfMSkKIAkJJiBXTTg5OTRfQUlGMUNMS19FTkE7CkBAIC0xNzA0LDYgKzE3MTQsOSBAQAogCQkJICAgIChmbGwuY2xrX3JlZl9kaXYgPDwgV004OTk0X0ZMTDFfUkVGQ0xLX0RJVl9TSElGVCkgfAogCQkJICAgIChzcmMgLSAxKSk7CiAKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBjb21wbGV0aW9uIGZyb20gYSBwcmV2aW91cyBmYWlsdXJlICovCisJdHJ5X3dhaXRfZm9yX2NvbXBsZXRpb24oJndtODk5NC0+ZmxsX2xvY2tlZFtpZF0pOworCiAJLyogRW5hYmxlICh3aXRoIGZyYWN0aW9uYWwgbW9kZSBpZiByZXF1aXJlZCkgKi8KIAlpZiAoZnJlcV9vdXQpIHsKIAkJaWYgKGZsbC5rKQpAQCAtMTcxMyw2ICsxNzI2LDE2IEBACiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9GTEwxX0NPTlRST0xfMSArIHJlZ19vZmZzZXQsCiAJCQkJICAgIFdNODk5NF9GTEwxX0VOQSB8IFdNODk5NF9GTEwxX0ZSQUMsCiAJCQkJICAgIHJlZyk7CisKKwkJaWYgKHdtODk5NC0+ZmxsX2xvY2tlZF9pcnEpIHsKKwkJCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJndtODk5NC0+ZmxsX2xvY2tlZFtpZF0sCisJCQkJCQkJICAgICAgbXNlY3NfdG9famlmZmllcygxMCkpOworCQkJaWYgKHRpbWVvdXQgPT0gMCkKKwkJCQlkZXZfd2Fybihjb2RlYy0+ZGV2LAorCQkJCQkgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBGTEwgbG9ja1xuIik7CisJCX0gZWxzZSB7CisJCQltc2xlZXAoNSk7CisJCX0KIAl9CiAKIAl3bTg5OTQtPmZsbFtpZF0uaW4gPSBmcmVxX2luOwpAQCAtMTczMCw2ICsxNzUzLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bTg5OTRfZmxsX2xvY2tlZF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGlvbiA9IGRhdGE7CisKKwljb21wbGV0ZShjb21wbGV0aW9uKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KIAogc3RhdGljIGludCBvcGNsa19kaXZzW10gPSB7IDEwLCAyMCwgMzAsIDQwLCA1NSwgNjAsIDgwLCAxMjAsIDE2MCB9OwogCkBAIC0yMjY5LDYgKzIzMDAsMzMgQEAKIAlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYWlmMV9yZWcsIFdNODk5NF9BSUYxX1dMX01BU0ssIGFpZjEpOwogfQogCitzdGF0aWMgdm9pZCB3bTg5OTRfYWlmX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJaW50IHJhdGVfcmVnID0gMDsKKworCXN3aXRjaCAoZGFpLT5pZCkgeworCWNhc2UgMToKKwkJcmF0ZV9yZWcgPSBXTTg5OTRfQUlGMV9SQVRFOworCQlicmVhazsKKwljYXNlIDI6CisJCXJhdGVfcmVnID0gV004OTk0X0FJRjFfUkFURTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogSWYgdGhlIERBSSBpcyBpZGxlIHRoZW4gY29uZmlndXJlIHRoZSBkaXZpZGVyIHRyZWUgZm9yIHRoZQorCSAqIGxvd2VzdCBvdXRwdXQgcmF0ZSB0byBzYXZlIGEgbGl0dGxlIHBvd2VyIGlmIHRoZSBjbG9jayBpcworCSAqIHN0aWxsIGFjdGl2ZSAoZWcsIGJlY2F1c2UgaXQgaXMgc3lzdGVtIGNsb2NrKS4KKwkgKi8KKwlpZiAocmF0ZV9yZWcgJiYgIWRhaS0+cGxheWJhY2tfYWN0aXZlICYmICFkYWktPmNhcHR1cmVfYWN0aXZlKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByYXRlX3JlZywKKwkJCQkgICAgV004OTk0X0FJRjFfU1JfTUFTSyB8CisJCQkJICAgIFdNODk5NF9BSUYxQ0xLX1JBVEVfTUFTSywgMHg5KTsKK30KKwogc3RhdGljIGludCB3bTg5OTRfYWlmX211dGUoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksIGludCBtdXRlKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CkBAIC0yMzM1LDYgKzIzOTMsNyBAQAogCS5zZXRfc3lzY2xrCT0gd204OTk0X3NldF9kYWlfc3lzY2xrLAogCS5zZXRfZm10CT0gd204OTk0X3NldF9kYWlfZm10LAogCS5od19wYXJhbXMJPSB3bTg5OTRfaHdfcGFyYW1zLAorCS5zaHV0ZG93bgk9IHdtODk5NF9haWZfc2h1dGRvd24sCiAJLmRpZ2l0YWxfbXV0ZQk9IHdtODk5NF9haWZfbXV0ZSwKIAkuc2V0X3BsbAk9IHdtODk5NF9zZXRfZmxsLAogCS5zZXRfdHJpc3RhdGUJPSB3bTg5OTRfc2V0X3RyaXN0YXRlLApAQCAtMjM0NCw2ICsyNDAzLDcgQEAKIAkuc2V0X3N5c2Nsawk9IHdtODk5NF9zZXRfZGFpX3N5c2NsaywKIAkuc2V0X2ZtdAk9IHdtODk5NF9zZXRfZGFpX2ZtdCwKIAkuaHdfcGFyYW1zCT0gd204OTk0X2h3X3BhcmFtcywKKwkuc2h1dGRvd24JPSB3bTg5OTRfYWlmX3NodXRkb3duLAogCS5kaWdpdGFsX211dGUgICA9IHdtODk5NF9haWZfbXV0ZSwKIAkuc2V0X3BsbAk9IHdtODk5NF9zZXRfZmxsLAogCS5zZXRfdHJpc3RhdGUJPSB3bTg5OTRfc2V0X3RyaXN0YXRlLApAQCAtMjc2MSw3ICsyODIxLDcgQEAKIAlyZXBvcnQgPSBTTkRfSkFDS19NSUNST1BIT05FOwogCiAJLyogRXZlcnl0aGluZyBlbHNlIGlzIGJ1dHRvbnM7IGp1c3QgYXNzaWduIHNsb3RzICovCi0JaWYgKHN0YXR1cyAmIDB4MWMwKQorCWlmIChzdGF0dXMgJiAweDFjKQogCQlyZXBvcnQgfD0gU05EX0pBQ0tfQlROXzA7CiAKIGRvbmU6CkBAIC0yODQ3LDYgKzI5MDcsMTUgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bTg5OTRfZmlmb19lcnJvcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhdGE7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICJGSUZPIGVycm9yXG4iKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogc3RhdGljIGludCB3bTg5OTRfY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5OTQgKmNvbnRyb2w7CkBAIC0yODY1LDYgKzI5MzQsOSBAQAogCXdtODk5NC0+cGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CiAJd204OTk0LT5jb2RlYyA9IGNvZGVjOwogCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk0LT5mbGxfbG9ja2VkKTsgaSsrKQorCQlpbml0X2NvbXBsZXRpb24oJndtODk5NC0+ZmxsX2xvY2tlZFtpXSk7CisKIAlpZiAod204OTk0LT5wZGF0YSAmJiB3bTg5OTQtPnBkYXRhLT5taWNkZXRfaXJxKQogCQl3bTg5OTQtPm1pY2RldF9pcnEgPSB3bTg5OTQtPnBkYXRhLT5taWNkZXRfaXJxOwogCWVsc2UgaWYgKHdtODk5NC0+cGRhdGEgJiYgd204OTk0LT5wZGF0YS0+aXJxX2Jhc2UpCkBAIC0yOTAzLDYgKzI5NzUsNyBAQAogCQkJd204OTk0LT5odWJzLmRjc19jb2RlcyA9IC01OwogCQkJd204OTk0LT5odWJzLmhwX3N0YXJ0dXBfbW9kZSA9IDE7CiAJCQl3bTg5OTQtPmh1YnMuZGNzX3JlYWRiYWNrX21vZGUgPSAxOworCQkJd204OTk0LT5odWJzLnNlcmllc19zdGFydHVwID0gMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJd204OTk0LT5odWJzLmRjc19yZWFkYmFja19tb2RlID0gMTsKQEAgLTI5MTcsNiArMjk5MCwxNSBAQAogCQlicmVhazsKIAl9CiAKKwl3bTg5OTRfcmVxdWVzdF9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9GSUZPU19FUlIsCisJCQkgICB3bTg5OTRfZmlmb19lcnJvciwgIkZJRk8gZXJyb3IiLCBjb2RlYyk7CisKKwlyZXQgPSB3bTg5OTRfcmVxdWVzdF9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9EQ1NfRE9ORSwKKwkJCQkgd21faHVic19kY3NfZG9uZSwgIkRDIHNlcnZvIGRvbmUiLAorCQkJCSAmd204OTk0LT5odWJzKTsKKwlpZiAocmV0ID09IDApCisJCXdtODk5NC0+aHVicy5kY3NfZG9uZV9pcnEgPSB0cnVlOworCiAJc3dpdGNoIChjb250cm9sLT50eXBlKSB7CiAJY2FzZSBXTTg5OTQ6CiAJCWlmICh3bTg5OTQtPm1pY2RldF9pcnEpIHsKQEAgLTI5NzMsNiArMzA1NSwxNiBAQAogCQl9CiAJfQogCisJd204OTk0LT5mbGxfbG9ja2VkX2lycSA9IHRydWU7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk0LT5mbGxfbG9ja2VkKTsgaSsrKSB7CisJCXJldCA9IHdtODk5NF9yZXF1ZXN0X2lycShjb2RlYy0+Y29udHJvbF9kYXRhLAorCQkJCQkgV004OTk0X0lSUV9GTEwxX0xPQ0sgKyBpLAorCQkJCQkgd204OTk0X2ZsbF9sb2NrZWRfaXJxLCAiRkxMIGxvY2siLAorCQkJCQkgJndtODk5NC0+ZmxsX2xvY2tlZFtpXSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXdtODk5NC0+ZmxsX2xvY2tlZF9pcnEgPSBmYWxzZTsKKwl9CisKIAkvKiBSZW1lbWJlciBpZiBBSUZuTFJDTEsgaXMgY29uZmlndXJlZCBhcyBhIEdQSU8uICBUaGlzIHNob3VsZCBiZQogCSAqIGNvbmZpZ3VyZWQgb24gaW5pdCAtIGlmIGEgc3lzdGVtIHdhbnRzIHRvIGRvIHRoaXMgZHluYW1pY2FsbHkKIAkgKiBhdCBydW50aW1lIHdlIGNhbiBkZWFsIHdpdGggdGhhdCB0aGVuLgpAQCAtMzA0OCwxMCArMzE0MCwxOCBAQAogCQkJICAgIDEgPDwgV004OTk0X0FJRjJEQUNfM0RfR0FJTl9TSElGVCwKIAkJCSAgICAxIDw8IFdNODk5NF9BSUYyREFDXzNEX0dBSU5fU0hJRlQpOwogCi0JLyogVW5jb25kaXRpb25hbGx5IGVuYWJsZSBBSUYxIEFEQyBURE0gbW9kZTsgaXQgb25seSBhZmZlY3RzCi0JICogYmVoYXZpb3VyIG9uIGlkbGUgVERNIGNsb2NrIGN5Y2xlcy4gKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfQUlGMV9DT05UUk9MXzEsCi0JCQkgICAgV004OTk0X0FJRjFBRENfVERNLCBXTTg5OTRfQUlGMUFEQ19URE0pOworCS8qIFVuY29uZGl0aW9uYWxseSBlbmFibGUgQUlGMSBBREMgVERNIG1vZGUgb24gY2hpcHMgd2hpY2ggY2FuCisJICogdXNlIHRoaXM7IGl0IG9ubHkgYWZmZWN0cyBiZWhhdmlvdXIgb24gaWRsZSBURE0gY2xvY2sKKwkgKiBjeWNsZXMuICovCisJc3dpdGNoIChjb250cm9sLT50eXBlKSB7CisJY2FzZSBXTTg5OTQ6CisJY2FzZSBXTTg5NTg6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9BSUYxX0NPTlRST0xfMSwKKwkJCQkgICAgV004OTk0X0FJRjFBRENfVERNLCBXTTg5OTRfQUlGMUFEQ19URE0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIAl3bTg5OTRfdXBkYXRlX2NsYXNzX3coY29kZWMpOwogCkBAIC0zMTUwLDYgKzMyNTAsMTIgQEAKIAl3bTg5OTRfZnJlZV9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9NSUMxX1NIUlQsIHdtODk5NCk7CiAJaWYgKHdtODk5NC0+bWljZGV0X2lycSkKIAkJZnJlZV9pcnEod204OTk0LT5taWNkZXRfaXJxLCB3bTg5OTQpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk5NC0+ZmxsX2xvY2tlZCk7IGkrKykKKwkJd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfRkxMMV9MT0NLICsgaSwKKwkJCQkmd204OTk0LT5mbGxfbG9ja2VkW2ldKTsKKwl3bTg5OTRfZnJlZV9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9EQ1NfRE9ORSwKKwkJCSZ3bTg5OTQtPmh1YnMpOworCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX0ZJRk9TX0VSUiwgY29kZWMpOwogZXJyOgogCWtmcmVlKHdtODk5NCk7CiAJcmV0dXJuIHJldDsKQEAgLTMxNTksMTEgKzMyNjUsMjAgQEAKIHsKIAlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXN0cnVjdCB3bTg5OTQgKmNvbnRyb2wgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCWludCBpOwogCiAJd204OTk0X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKIAogCXBtX3J1bnRpbWVfZGlzYWJsZShjb2RlYy0+ZGV2KTsKIAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk5NC0+ZmxsX2xvY2tlZCk7IGkrKykKKwkJd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfRkxMMV9MT0NLICsgaSwKKwkJCQkmd204OTk0LT5mbGxfbG9ja2VkW2ldKTsKKworCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX0RDU19ET05FLAorCQkJJndtODk5NC0+aHVicyk7CisJd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfRklGT1NfRVJSLCBjb2RlYyk7CisKIAlzd2l0Y2ggKGNvbnRyb2wtPnR5cGUpIHsKIAljYXNlIFdNODk5NDoKIAkJaWYgKHdtODk5NC0+bWljZGV0X2lycSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmggYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5oCmluZGV4IDBhMWRiMDQuLjFhYjIyNjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmgKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuaApAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAKICNpbmNsdWRlICJ3bV9odWJzLmgiCiAKQEAgLTc5LDYgKzgwLDggQEAKIAlpbnQgbWNsa1syXTsKIAlpbnQgYWlmY2xrWzJdOwogCXN0cnVjdCB3bTg5OTRfZmxsX2NvbmZpZyBmbGxbMl0sIGZsbF9zdXNwZW5kWzJdOworCXN0cnVjdCBjb21wbGV0aW9uIGZsbF9sb2NrZWRbMl07CisJYm9vbCBmbGxfbG9ja2VkX2lycTsKIAogCWludCBkYWNfcmF0ZXNbMl07CiAJaW50IGxyY2xrX3NoYXJlZFsyXTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA4MS5jCmluZGV4IDkxYzZiMzkuLmE0NjkxMzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTkwODEuYwpAQCAtNzI3LDcgKzcyNyw3IEBACiBTTkRfU09DX0RBUE1fUEdBKCJMSU5FT1VUIFBHQSIsIFdNOTA4MV9QT1dFUl9NQU5BR0VNRU5ULCA0LCAwLCBOVUxMLCAwKSwKIAogU05EX1NPQ19EQVBNX1BHQSgiU3BlYWtlciBQR0EiLCBXTTkwODFfUE9XRVJfTUFOQUdFTUVOVCwgMiwgMCwgTlVMTCwgMCksCi1TTkRfU09DX0RBUE1fUEdBKCJTcGVha2VyIiwgV005MDgxX1BPV0VSX01BTkFHRU1FTlQsIDEsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX09VVF9EUlYoIlNwZWFrZXIiLCBXTTkwODFfUE9XRVJfTUFOQUdFTUVOVCwgMSwgMCwgTlVMTCwgMCksCiAKIFNORF9TT0NfREFQTV9PVVRQVVQoIkxJTkVPVVQiKSwKIFNORF9TT0NfREFQTV9PVVRQVVQoIlNQS04iKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5jIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKaW5kZXggOWUzNzBkMS4uNGNjMmQ1NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKQEAgLTYzLDggKzYzLDEwIEBACiAKIHN0YXRpYyB2b2lkIHdhaXRfZm9yX2RjX3NlcnZvKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IG9wKQogeworCXN0cnVjdCB3bV9odWJzX2RhdGEgKmh1YnMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl1bnNpZ25lZCBpbnQgcmVnOwogCWludCBjb3VudCA9IDA7CisJaW50IHRpbWVvdXQ7CiAJdW5zaWduZWQgaW50IHZhbDsKIAogCXZhbCA9IG9wIHwgV004OTkzX0RDU19FTkFfQ0hBTl8wIHwgV004OTkzX0RDU19FTkFfQ0hBTl8xOwpAQCAtNzQsMTggKzc2LDM5IEBACiAKIAlkZXZfZGJnKGNvZGVjLT5kZXYsICJXYWl0aW5nIGZvciBEQyBzZXJ2by4uLlxuIik7CiAKKwlpZiAoaHVicy0+ZGNzX2RvbmVfaXJxKQorCQl0aW1lb3V0ID0gNDsKKwllbHNlCisJCXRpbWVvdXQgPSA0MDA7CisKIAlkbyB7CiAJCWNvdW50Kys7Ci0JCW1zbGVlcCgxKTsKKworCQlpZiAoaHVicy0+ZGNzX2RvbmVfaXJxKQorCQkJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZodWJzLT5kY3NfZG9uZSwKKwkJCQkJCSAgICBtc2Vjc190b19qaWZmaWVzKDI1MCkpOworCQllbHNlCisJCQltc2xlZXAoMSk7CisKIAkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTNfRENfU0VSVk9fMCk7CiAJCWRldl9kYmcoY29kZWMtPmRldiwgIkRDIHNlcnZvOiAleFxuIiwgcmVnKTsKLQl9IHdoaWxlIChyZWcgJiBvcCAmJiBjb3VudCA8IDQwMCk7CisJfSB3aGlsZSAocmVnICYgb3AgJiYgY291bnQgPCB0aW1lb3V0KTsKIAogCWlmIChyZWcgJiBvcCkKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIERDIFNlcnZvICV4XG4iLAogCQkJb3ApOwogfQogCitpcnFyZXR1cm5fdCB3bV9odWJzX2Rjc19kb25lKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdtX2h1YnNfZGF0YSAqaHVicyA9IGRhdGE7CisKKwljb21wbGV0ZSgmaHVicy0+ZGNzX2RvbmUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorRVhQT1JUX1NZTUJPTF9HUEwod21faHVic19kY3NfZG9uZSk7CisKIC8qCiAgKiBTdGFydHVwIGNhbGlicmF0aW9uIG9mIHRoZSBEQyBzZXJ2bwogICovCkBAIC0xMDcsOCArMTMwLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIERldmljZXMgbm90IHVzaW5nIGEgRENTIGNvZGUgY29ycmVjdGlvbiBoYXZlIHN0YXJ0dXAgbW9kZSAqLwotCWlmIChodWJzLT5kY3NfY29kZXMpIHsKKwlpZiAoaHVicy0+c2VyaWVzX3N0YXJ0dXApIHsKIAkJLyogU2V0IGZvciAzMiBzZXJpZXMgdXBkYXRlcyAqLwogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTNfRENfU0VSVk9fMSwKIAkJCQkgICAgV004OTkzX0RDU19TRVJJRVNfTk9fMDFfTUFTSywKQEAgLTEzNCw5ICsxNTYsOSBAQAogCQlicmVhazsKIAljYXNlIDE6CiAJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTkzX0RDX1NFUlZPXzMpOwotCQlyZWdfbCA9IChyZWcgJiBXTTg5OTNfRENTX0RBQ19XUl9WQUxfMV9NQVNLKQorCQlyZWdfciA9IChyZWcgJiBXTTg5OTNfRENTX0RBQ19XUl9WQUxfMV9NQVNLKQogCQkJPj4gV004OTkzX0RDU19EQUNfV1JfVkFMXzFfU0hJRlQ7Ci0JCXJlZ19yID0gcmVnICYgV004OTkzX0RDU19EQUNfV1JfVkFMXzBfTUFTSzsKKwkJcmVnX2wgPSByZWcgJiBXTTg5OTNfRENTX0RBQ19XUl9WQUxfMF9NQVNLOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlXQVJOKDEsICJVbmtub3duIERDUyByZWFkYmFjayBtZXRob2RcbiIpOwpAQCAtMTUwLDEzICsxNzIsMTMgQEAKIAkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQXBwbHlpbmcgJWQgY29kZSBEQyBzZXJ2byBjb3JyZWN0aW9uXG4iLAogCQkJaHVicy0+ZGNzX2NvZGVzKTsKIAotCQkvKiBIUE9VVDFMICovCi0JCW9mZnNldCA9IHJlZ19sOworCQkvKiBIUE9VVDFSICovCisJCW9mZnNldCA9IHJlZ19yOwogCQlvZmZzZXQgKz0gaHVicy0+ZGNzX2NvZGVzOwogCQlkY3NfY2ZnID0gKHU4KW9mZnNldCA8PCBXTTg5OTNfRENTX0RBQ19XUl9WQUxfMV9TSElGVDsKIAotCQkvKiBIUE9VVDFSICovCi0JCW9mZnNldCA9IHJlZ19yOworCQkvKiBIUE9VVDFMICovCisJCW9mZnNldCA9IHJlZ19sOwogCQlvZmZzZXQgKz0gaHVicy0+ZGNzX2NvZGVzOwogCQlkY3NfY2ZnIHw9ICh1OClvZmZzZXQ7CiAKQEAgLTE2OCw4ICsxOTAsOCBAQAogCQkJCSAgV004OTkzX0RDU19UUklHX0RBQ19XUl8wIHwKIAkJCQkgIFdNODk5M19EQ1NfVFJJR19EQUNfV1JfMSk7CiAJfSBlbHNlIHsKLQkJZGNzX2NmZyA9IHJlZ19sIDw8IFdNODk5M19EQ1NfREFDX1dSX1ZBTF8xX1NISUZUOwotCQlkY3NfY2ZnIHw9IHJlZ19yOworCQlkY3NfY2ZnID0gcmVnX3IgPDwgV004OTkzX0RDU19EQUNfV1JfVkFMXzFfU0hJRlQ7CisJCWRjc19jZmcgfD0gcmVnX2w7CiAJfQogCiAJLyogU2F2ZSB0aGUgY2FsbGlicmF0ZWQgb2Zmc2V0IGlmIHdlJ3JlIGluIGNsYXNzIFcgbW9kZSBhbmQKQEAgLTE5NSw3ICsyMTcsNyBAQAogCiAJLyogSWYgd2UncmUgYXBwbHlpbmcgYW4gb2Zmc2V0IGNvcnJlY3Rpb24gdGhlbiB1cGRhdGluZyB0aGUKIAkgKiBjYWxsaWJyYXRpb24gd291bGQgYmUgbGlrZWx5IHRvIGludHJvZHVjZSBmdXJ0aGVyIG9mZnNldHMuICovCi0JaWYgKGh1YnMtPmRjc19jb2RlcykKKwlpZiAoaHVicy0+ZGNzX2NvZGVzIHx8IGh1YnMtPm5vX3Nlcmllc191cGRhdGUpCiAJCXJldHVybiByZXQ7CiAKIAkvKiBPbmx5IG5lZWQgdG8gZG8gdGhpcyBpZiB0aGUgb3V0cHV0cyBhcmUgYWN0aXZlICovCkBAIC01OTksOSArNjIxLDYgQEAKIFNORF9TT0NfREFQTV9NSVhFUigiSU4yUiBQR0EiLCBXTTg5OTNfUE9XRVJfTUFOQUdFTUVOVF8yLCA1LCAwLAogCQkgICBpbjJyX3BnYSwgQVJSQVlfU0laRShpbjJyX3BnYSkpLAogCi0vKiBEdW1teSB3aWRnZXRzIHRvIHJlcHJlc2VudCBkaWZmZXJlbnRpYWwgcGF0aHMgKi8KLVNORF9TT0NfREFQTV9QR0EoIkRpcmVjdCBWb2ljZSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0KIFNORF9TT0NfREFQTV9NSVhFUigiTUlYSU5MIiwgV004OTkzX1BPV0VSX01BTkFHRU1FTlRfMiwgOSwgMCwKIAkJICAgbWl4aW5sLCBBUlJBWV9TSVpFKG1peGlubCkpLAogU05EX1NPQ19EQVBNX01JWEVSKCJNSVhJTlIiLCBXTTg5OTNfUE9XRVJfTUFOQUdFTUVOVF8yLCA4LCAwLApAQCAtODY3LDggKzg4NiwxMSBAQAogaW50IHdtX2h1YnNfYWRkX2FuYWxvZ3VlX3JvdXRlcyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkJaW50IGxpbmVvdXQxX2RpZmYsIGludCBsaW5lb3V0Ml9kaWZmKQogeworCXN0cnVjdCB3bV9odWJzX2RhdGEgKmh1YnMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKKwlpbml0X2NvbXBsZXRpb24oJmh1YnMtPmRjc19kb25lKTsKKwogCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGFuYWxvZ3VlX3JvdXRlcywKIAkJCQlBUlJBWV9TSVpFKGFuYWxvZ3VlX3JvdXRlcykpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5oCmluZGV4IGY4YTVlOTcuLjY3NmIxMjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5oCkBAIC0xNCw2ICsxNCw5IEBACiAjaWZuZGVmIF9XTV9IVUJTX0gKICNkZWZpbmUgX1dNX0hVQlNfSAogCisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCiBzdHJ1Y3Qgc25kX3NvY19jb2RlYzsKIAogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCB3bV9odWJzX3Nwa21peF90bHZbXTsKQEAgLTIzLDkgKzI2LDE0IEBACiAJaW50IGRjc19jb2RlczsKIAlpbnQgZGNzX3JlYWRiYWNrX21vZGU7CiAJaW50IGhwX3N0YXJ0dXBfbW9kZTsKKwlpbnQgc2VyaWVzX3N0YXJ0dXA7CisJaW50IG5vX3Nlcmllc191cGRhdGU7CiAKIAlib29sIGNsYXNzX3c7CiAJdTE2IGNsYXNzX3dfZGNzOworCisJYm9vbCBkY3NfZG9uZV9pcnE7CisJc3RydWN0IGNvbXBsZXRpb24gZGNzX2RvbmU7CiB9OwogCiBleHRlcm4gaW50IHdtX2h1YnNfYWRkX2FuYWxvZ3VlX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX2NvZGVjICopOwpAQCAtMzYsNCArNDQsNiBAQAogCQkJCQkgaW50IGpkX3NjdGhyLCBpbnQgamRfdGhyLAogCQkJCQkgaW50IG1pY2JpYXMxX2x2bCwgaW50IG1pY2JpYXMyX2x2bCk7CiAKK2V4dGVybiBpcnFyZXR1cm5fdCB3bV9odWJzX2Rjc19kb25lKGludCBpcnEsIHZvaWQgKmRhdGEpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5jCmluZGV4IDlkMzViOGMuLmE0OWU2NjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYwpAQCAtNDYsMTEgKzQ2LDI4IEBACiB9CiAjZW5kaWYKIAorI2RlZmluZSBEQVZJTkNJX1BDTV9GTVRCSVRTCShcCisJCQkJU05EUlZfUENNX0ZNVEJJVF9TOAl8XAorCQkJCVNORFJWX1BDTV9GTVRCSVRfVTgJfFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRQl8XAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzE2X0JFCXxcCisJCQkJU05EUlZfUENNX0ZNVEJJVF9VMTZfTEUJfFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1UxNl9CRQl8XAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFCXxcCisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfQkUJfFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1UyNF9MRQl8XAorCQkJCVNORFJWX1BDTV9GTVRCSVRfVTI0X0JFCXxcCisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUJfFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9CRQl8XAorCQkJCVNORFJWX1BDTV9GTVRCSVRfVTMyX0xFCXxcCisJCQkJU05EUlZfUENNX0ZNVEJJVF9VMzJfQkUpCisKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBwY21faGFyZHdhcmVfcGxheWJhY2sgPSB7CiAJLmluZm8gPSAoU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfCBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CiAJCSBTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCi0JLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUpLAorCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUV8CisJCSBTTkRSVl9QQ01fSU5GT19CQVRDSCksCisJLmZvcm1hdHMgPSBEQVZJTkNJX1BDTV9GTVRCSVRTLAogCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAogCQkgIFNORFJWX1BDTV9SQVRFXzIyMDUwIHwgU05EUlZfUENNX1JBVEVfMzIwMDAgfAogCQkgIFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfApAQCAtNTksNyArNzYsNyBAQAogCS5yYXRlX21pbiA9IDgwMDAsCiAJLnJhdGVfbWF4ID0gOTYwMDAsCiAJLmNoYW5uZWxzX21pbiA9IDIsCi0JLmNoYW5uZWxzX21heCA9IDIsCisJLmNoYW5uZWxzX21heCA9IDM4NCwKIAkuYnVmZmVyX2J5dGVzX21heCA9IDEyOCAqIDEwMjQsCiAJLnBlcmlvZF9ieXRlc19taW4gPSAzMiwKIAkucGVyaW9kX2J5dGVzX21heCA9IDggKiAxMDI0LApAQCAtNzEsOCArODgsOSBAQAogc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHBjbV9oYXJkd2FyZV9jYXB0dXJlID0gewogCS5pbmZvID0gKFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAogCQkgU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkgU05EUlZfUENNX0lORk9fUEFVU0UpLAotCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFKSwKKwkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJIFNORFJWX1BDTV9JTkZPX0JBVENIKSwKKwkuZm9ybWF0cyA9IERBVklOQ0lfUENNX0ZNVEJJVFMsCiAJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CiAJCSAgU05EUlZfUENNX1JBVEVfMjIwNTAgfCBTTkRSVl9QQ01fUkFURV8zMjAwMCB8CiAJCSAgU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8CkBAIC04MSw3ICs5OSw3IEBACiAJLnJhdGVfbWluID0gODAwMCwKIAkucmF0ZV9tYXggPSA5NjAwMCwKIAkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMzg0LAogCS5idWZmZXJfYnl0ZXNfbWF4ID0gMTI4ICogMTAyNCwKIAkucGVyaW9kX2J5dGVzX21pbiA9IDMyLAogCS5wZXJpb2RfYnl0ZXNfbWF4ID0gOCAqIDEwMjQsCkBAIC0xMzksNiArMTU3LDIyIEBACiAJc3RydWN0IGVkbWFjY19wYXJhbSByYW1fcGFyYW1zOwogfTsKIAorc3RhdGljIHZvaWQgZGF2aW5jaV9wY21fcGVyaW9kX2VsYXBzZWQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGRhdmluY2lfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXBydGQtPnBlcmlvZCsrOworCWlmICh1bmxpa2VseShwcnRkLT5wZXJpb2QgPj0gcnVudGltZS0+cGVyaW9kcykpCisJCXBydGQtPnBlcmlvZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGRhdmluY2lfcGNtX3BlcmlvZF9yZXNldChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXBydGQtPnBlcmlvZCA9IDA7Cit9CiAvKgogICogTm90IHVzZWQgd2l0aCBwaW5nL3BvbmcKICAqLwpAQCAtMTk5LDEwICsyMzMsNiBAQAogCWVsc2UKIAkJZWRtYV9zZXRfdHJhbnNmZXJfcGFyYW1zKGxpbmssIGFjbnQsIGZpZm9fbGV2ZWwsIGNvdW50LAogCQkJCQkJCWZpZm9fbGV2ZWwsIEFCU1lOQyk7Ci0KLQlwcnRkLT5wZXJpb2QrKzsKLQlpZiAodW5saWtlbHkocHJ0ZC0+cGVyaW9kID49IHJ1bnRpbWUtPnBlcmlvZHMpKQotCQlwcnRkLT5wZXJpb2QgPSAwOwogfQogCiBzdGF0aWMgdm9pZCBkYXZpbmNpX3BjbV9kbWFfaXJxKHVuc2lnbmVkIGxpbmssIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCkBAIC0yMTcsMTIgKzI0NywxMyBAQAogCQlyZXR1cm47CiAKIAlpZiAoc25kX3BjbV9ydW5uaW5nKHN1YnN0cmVhbSkpIHsKKwkJc3Bpbl9sb2NrKCZwcnRkLT5sb2NrKTsKIAkJaWYgKHBydGQtPnJhbV9jaGFubmVsIDwgMCkgewogCQkJLyogTm8gcGluZy9wb25nIG11c3QgZml4IHVwIGxpbmsgZG1hIGRhdGEqLwotCQkJc3Bpbl9sb2NrKCZwcnRkLT5sb2NrKTsKIAkJCWRhdmluY2lfcGNtX2VucXVldWVfZG1hKHN1YnN0cmVhbSk7Ci0JCQlzcGluX3VubG9jaygmcHJ0ZC0+bG9jayk7CiAJCX0KKwkJZGF2aW5jaV9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKKwkJc3Bpbl91bmxvY2soJnBydGQtPmxvY2spOwogCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CiAJfQogfQpAQCAtNDI1LDcgKzQ1Niw4IEBACiAKIAllZG1hX3JlYWRfc2xvdChsaW5rLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CiAJcHJ0ZC0+YXNwX3BhcmFtcy5vcHQgJj0gfihUQ0NNT0RFIHwgRURNQV9UQ0MoMHgzZikgfCBUQ0lOVEVOKTsKLQlwcnRkLT5hc3BfcGFyYW1zLm9wdCB8PSBUQ0NIRU4gfCBFRE1BX1RDQyhwcnRkLT5yYW1fY2hhbm5lbCAmIDB4M2YpOworCXBydGQtPmFzcF9wYXJhbXMub3B0IHw9IFRDQ0hFTiB8CisJCUVETUFfVENDKHBydGQtPnJhbV9jaGFubmVsICYgMHgzZik7CiAJZWRtYV93cml0ZV9zbG90KGxpbmssICZwcnRkLT5hc3BfcGFyYW1zKTsKIAogCS8qIHBvbmcgKi8KQEAgLTQzOSw3ICs0NzEsNyBAQAogCXBydGQtPmFzcF9wYXJhbXMub3B0ICY9IH4oVENDTU9ERSB8IEVETUFfVENDKDB4M2YpKTsKIAkvKiBpbnRlcnJ1cHQgYWZ0ZXIgZXZlcnkgcG9uZyBjb21wbGV0aW9uICovCiAJcHJ0ZC0+YXNwX3BhcmFtcy5vcHQgfD0gVENJTlRFTiB8IFRDQ0hFTiB8Ci0JCUVETUFfVENDKEVETUFfQ0hBTl9TTE9UKHBydGQtPnJhbV9jaGFubmVsKSk7CisJCUVETUFfVENDKHBydGQtPnJhbV9jaGFubmVsICYgMHgzZik7CiAJZWRtYV93cml0ZV9zbG90KGxpbmssICZwcnRkLT5hc3BfcGFyYW1zKTsKIAogCS8qIHJhbSAqLwpAQCAtNTI3LDYgKzU1OSwxMyBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQllZG1hX3N0YXJ0KHBydGQtPmFzcF9jaGFubmVsKTsKKwkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgJiYKKwkJICAgIHBydGQtPnJhbV9jaGFubmVsID49IDApIHsKKwkJCS8qIGNvcHkgMXN0IGlyYW0gYnVmZmVyICovCisJCQllZG1hX3N0YXJ0KHBydGQtPnJhbV9jaGFubmVsKTsKKwkJfQorCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CiAJCWVkbWFfcmVzdW1lKHBydGQtPmFzcF9jaGFubmVsKTsKQEAgLTU1MCw2ICs1ODksNyBAQAogewogCXN0cnVjdCBkYXZpbmNpX3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCisJZGF2aW5jaV9wY21fcGVyaW9kX3Jlc2V0KHN1YnN0cmVhbSk7CiAJaWYgKHBydGQtPnJhbV9jaGFubmVsID49IDApIHsKIAkJaW50IHJldCA9IHBpbmdfcG9uZ19kbWFfc2V0dXAoc3Vic3RyZWFtKTsKIAkJaWYgKHJldCA8IDApCkBAIC01NjUsMjEgKzYwNSwzMSBAQAogCQlwcmludF9idWZfaW5mbyhwcnRkLT5hc3BfbGlua1swXSwgImFzcF9saW5rWzBdIik7CiAJCXByaW50X2J1Zl9pbmZvKHBydGQtPmFzcF9saW5rWzFdLCAiYXNwX2xpbmtbMV0iKTsKIAotCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQkJLyogY29weSAxc3QgaXJhbSBidWZmZXIgKi8KLQkJCWVkbWFfc3RhcnQocHJ0ZC0+cmFtX2NoYW5uZWwpOwotCQl9Ci0JCWVkbWFfc3RhcnQocHJ0ZC0+YXNwX2NoYW5uZWwpOworCQkvKgorCQkgKiBUaGVyZSBpcyBhIHBoYXNlIG9mZnNldCBvZiAyIHBlcmlvZHMgYmV0d2VlbiB0aGUgcG9zaXRpb24KKwkJICogdXNlZCBieSBkbWEgc2V0dXAgYW5kIHRoZSBwb3NpdGlvbiByZXBvcnRlZCBpbiB0aGUgcG9pbnRlcgorCQkgKiBmdW5jdGlvbi4KKwkJICoKKwkJICogVGhlIHBoYXNlIG9mZnNldCwgd2hlbiBub3QgdXNpbmcgcGluZy1wb25nIGJ1ZmZlcnMsIGlzIGR1ZSB0bworCQkgKiB0aGUgdHdvIGNvbnNlY3V0aXZlIGNhbGxzIHRvIGRhdmluY2lfcGNtX2VucXVldWVfZG1hKCkgYmVsb3cuCisJCSAqCisJCSAqIFdoZXJlYXMgaGVyZSwgd2l0aCBwaW5nLXBvbmcgYnVmZmVycywgdGhlIHBoYXNlIGlzIGR1ZSB0bworCQkgKiB0aGVyZSBiZWluZyBhbiBlbnRpcmUgYnVmZmVyIHRyYW5zZmVyIGNvbXBsZXRlIGJlZm9yZSB0aGUKKwkJICogZmlyc3QgZG1hIGNvbXBsZXRpb24gZXZlbnQgdHJpZ2dlcnMgZGF2aW5jaV9wY21fZG1hX2lycSgpLgorCQkgKi8KKwkJZGF2aW5jaV9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKKwkJZGF2aW5jaV9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKKwogCQlyZXR1cm4gMDsKIAl9Ci0JcHJ0ZC0+cGVyaW9kID0gMDsKIAlkYXZpbmNpX3BjbV9lbnF1ZXVlX2RtYShzdWJzdHJlYW0pOworCWRhdmluY2lfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CiAKIAkvKiBDb3B5IHNlbGYtbGlua2VkIHBhcmFtZXRlciBSQU0gZW50cnkgaW50byBtYXN0ZXIgY2hhbm5lbCAqLwogCWVkbWFfcmVhZF9zbG90KHBydGQtPmFzcF9saW5rWzBdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CiAJZWRtYV93cml0ZV9zbG90KHBydGQtPmFzcF9jaGFubmVsLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CiAJZGF2aW5jaV9wY21fZW5xdWV1ZV9kbWEoc3Vic3RyZWFtKTsKLQllZG1hX3N0YXJ0KHBydGQtPmFzcF9jaGFubmVsKTsKKwlkYXZpbmNpX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01OTEsNTEgKzY0MSwyMyBAQAogCXN0cnVjdCBkYXZpbmNpX3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0OwogCWludCBhc3BfY291bnQ7Ci0JZG1hX2FkZHJfdCBhc3Bfc3JjLCBhc3BfZHN0OworCXVuc2lnbmVkIGludCBwZXJpb2Rfc2l6ZSA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOwogCisJLyoKKwkgKiBUaGVyZSBpcyBhIHBoYXNlIG9mZnNldCBvZiAyIHBlcmlvZHMgYmV0d2VlbiB0aGUgcG9zaXRpb24gdXNlZCBieSBkbWEKKwkgKiBzZXR1cCBhbmQgdGhlIHBvc2l0aW9uIHJlcG9ydGVkIGluIHRoZSBwb2ludGVyIGZ1bmN0aW9uLiBFaXRoZXIgKzIgaW4KKwkgKiB0aGUgZG1hIHNldHVwIG9yIC0yIGhlcmUgaW4gdGhlIHBvaW50ZXIgZnVuY3Rpb24gKHdpdGggd3JhcHBpbmcsCisJICogYm90aCkgYWNjb3VudHMgZm9yIHRoaXMgb2Zmc2V0IC0tIGNob29zZSB0aGUgbGF0dGVyIHNpbmNlIGl0IG1ha2VzCisJICogdGhlIGZpcnN0LXRpbWUgc2V0dXAgY2xlYXJlci4KKwkgKi8KIAlzcGluX2xvY2soJnBydGQtPmxvY2spOwotCWlmIChwcnRkLT5yYW1fY2hhbm5lbCA+PSAwKSB7Ci0JCWludCByYW1fY291bnQ7Ci0JCWludCBtb2RfcmFtOwotCQlkbWFfYWRkcl90IHJhbV9zcmMsIHJhbV9kc3Q7Ci0JCXVuc2lnbmVkIGludCBwZXJpb2Rfc2l6ZSA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOwotCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQkJLyogcmVhZGluZyByYW0gYmVmb3JlIGFzcCBzaG91bGQgYmUgc2FmZQotCQkJICogYXMgbG9uZyBhcyB0aGUgYXNwIHRyYW5zZmVycyBsZXNzIHRoYW4gYSBwaW5nIHNpemUKLQkJCSAqIG9mIGJ5dGVzIGJldHdlZW4gdGhlIDIgcmVhZHMKLQkJCSAqLwotCQkJZWRtYV9nZXRfcG9zaXRpb24ocHJ0ZC0+cmFtX2NoYW5uZWwsCi0JCQkJCSZyYW1fc3JjLCAmcmFtX2RzdCk7Ci0JCQllZG1hX2dldF9wb3NpdGlvbihwcnRkLT5hc3BfY2hhbm5lbCwKLQkJCQkJJmFzcF9zcmMsICZhc3BfZHN0KTsKLQkJCWFzcF9jb3VudCA9IGFzcF9zcmMgLSBwcnRkLT5hc3BfcGFyYW1zLnNyYzsKLQkJCXJhbV9jb3VudCA9IHJhbV9zcmMgLSBwcnRkLT5yYW1fcGFyYW1zLnNyYzsKLQkJCW1vZF9yYW0gPSByYW1fY291bnQgJSBwZXJpb2Rfc2l6ZTsKLQkJCW1vZF9yYW0gLT0gYXNwX2NvdW50OwotCQkJaWYgKG1vZF9yYW0gPCAwKQotCQkJCW1vZF9yYW0gKz0gcGVyaW9kX3NpemU7Ci0JCQllbHNlIGlmIChtb2RfcmFtID09IDApIHsKLQkJCQlpZiAoc25kX3BjbV9ydW5uaW5nKHN1YnN0cmVhbSkpCi0JCQkJCW1vZF9yYW0gKz0gcGVyaW9kX3NpemU7Ci0JCQl9Ci0JCQlyYW1fY291bnQgLT0gbW9kX3JhbTsKLQkJCWlmIChyYW1fY291bnQgPCAwKQotCQkJCXJhbV9jb3VudCArPSBwZXJpb2Rfc2l6ZSAqIHJ1bnRpbWUtPnBlcmlvZHM7Ci0JCX0gZWxzZSB7Ci0JCQllZG1hX2dldF9wb3NpdGlvbihwcnRkLT5yYW1fY2hhbm5lbCwKLQkJCQkJJnJhbV9zcmMsICZyYW1fZHN0KTsKLQkJCXJhbV9jb3VudCA9IHJhbV9kc3QgLSBwcnRkLT5yYW1fcGFyYW1zLmRzdDsKLQkJfQotCQlhc3BfY291bnQgPSByYW1fY291bnQ7Ci0JfSBlbHNlIHsKLQkJZWRtYV9nZXRfcG9zaXRpb24ocHJ0ZC0+YXNwX2NoYW5uZWwsICZhc3Bfc3JjLCAmYXNwX2RzdCk7Ci0JCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQkJYXNwX2NvdW50ID0gYXNwX3NyYyAtIHJ1bnRpbWUtPmRtYV9hZGRyOwotCQllbHNlCi0JCQlhc3BfY291bnQgPSBhc3BfZHN0IC0gcnVudGltZS0+ZG1hX2FkZHI7Ci0JfQorCWFzcF9jb3VudCA9IHBydGQtPnBlcmlvZCAtIDI7CiAJc3Bpbl91bmxvY2soJnBydGQtPmxvY2spOwogCisJaWYgKGFzcF9jb3VudCA8IDApCisJCWFzcF9jb3VudCArPSBydW50aW1lLT5wZXJpb2RzOworCWFzcF9jb3VudCAqPSBwZXJpb2Rfc2l6ZTsKKwogCW9mZnNldCA9IGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBhc3BfY291bnQpOwogCWlmIChvZmZzZXQgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCiAJCW9mZnNldCA9IDA7CkBAIC04MTEsOSArODMzLDExIEBACiAKIHN0YXRpYyB1NjQgZGF2aW5jaV9wY21fZG1hbWFzayA9IDB4ZmZmZmZmZmY7CiAKLXN0YXRpYyBpbnQgZGF2aW5jaV9wY21fbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKLQkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBzdHJ1Y3Qgc25kX3BjbSAqcGNtKQorc3RhdGljIGludCBkYXZpbmNpX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKIAlpbnQgcmV0OwogCiAJaWYgKCFjYXJkLT5kZXYtPmRtYV9tYXNrKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtYWM5Ny5jIGIvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtYWM5Ny5jCmluZGV4IDEwNGU5NWMuLmM3NDE3YzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9lcDkzeHgvZXA5M3h4LWFjOTcuYworKysgYi9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1hYzk3LmMKQEAgLTEwNiwxMiArMTA2LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3QgZXA5M3h4X3BjbV9kbWFfcGFyYW1zIGVwOTN4eF9hYzk3X3BjbV9vdXQgPSB7CiAJLm5hbWUJCT0gImFjOTctcGNtLW91dCIsCi0JLmRtYV9wb3J0CT0gRVA5M1hYX0RNQV9NMlBfUE9SVF9BQUMxLAorCS5kbWFfcG9ydAk9IEVQOTNYWF9ETUFfQUFDMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZXA5M3h4X3BjbV9kbWFfcGFyYW1zIGVwOTN4eF9hYzk3X3BjbV9pbiA9IHsKIAkubmFtZQkJPSAiYWM5Ny1wY20taW4iLAotCS5kbWFfcG9ydAk9IEVQOTNYWF9ETUFfTTJQX1BPUlRfQUFDMSwKKwkuZG1hX3BvcnQJPSBFUDkzWFhfRE1BX0FBQzEsCiB9OwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGVwOTN4eF9hYzk3X3JlYWRfcmVnKHN0cnVjdCBlcDkzeHhfYWM5N19pbmZvICppbmZvLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtaTJzLmMgYi9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1pMnMuYwppbmRleCAwNDJmNGU5Li41NmVmYTBjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1pMnMuYworKysgYi9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1pMnMuYwpAQCAtMiw3ICsyLDcgQEAKICAqIGxpbnV4L3NvdW5kL3NvYy9lcDkzeHgtaTJzLmMKICAqIEVQOTN4eCBJMlMgZHJpdmVyCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFJ5YW4gTWFsbG9uIDxyeWFuQGJsdWV3YXRlcnN5cy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUnlhbiBNYWxsb24KICAqCiAgKiBCYXNlZCBvbiB0aGUgb3JpZ2luYWwgZHJpdmVyIGJ5OgogICogICBDb3B5cmlnaHQgKEMpIDIwMDcgQ2hhc2UgRG91Z2xhcyA8Y2hhc2Vkb3VnbGFzQGdtYWlsPgpAQCAtNzAsMTEgKzcwLDExIEBACiBzdHJ1Y3QgZXA5M3h4X3BjbV9kbWFfcGFyYW1zIGVwOTN4eF9pMnNfZG1hX3BhcmFtc1tdID0gewogCVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IHsKIAkJLm5hbWUJCT0gImkycy1wY20tb3V0IiwKLQkJLmRtYV9wb3J0CT0gRVA5M1hYX0RNQV9NMlBfUE9SVF9JMlMxLAorCQkuZG1hX3BvcnQJPSBFUDkzWFhfRE1BX0kyUzEsCiAJfSwKIAlbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9IHsKIAkJLm5hbWUJCT0gImkycy1wY20taW4iLAotCQkuZG1hX3BvcnQJPSBFUDkzWFhfRE1BX00yUF9QT1JUX0kyUzEsCisJCS5kbWFfcG9ydAk9IEVQOTNYWF9ETUFfSTJTMSwKIAl9LAogfTsKIApAQCAtNDc3LDYgKzQ3Nyw2IEBACiBtb2R1bGVfZXhpdChlcDkzeHhfaTJzX2V4aXQpOwogCiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmVwOTN4eC1pMnMiKTsKLU1PRFVMRV9BVVRIT1IoIlJ5YW4gTWFsbG9uIDxyeWFuQGJsdWV3YXRlcnN5cy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJSeWFuIE1hbGxvbiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJFUDkzWFggSTJTIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtcGNtLmMgYi9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1wY20uYwppbmRleCBhNDU2ZTQ5Li44ZGZkM2FkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1wY20uYworKysgYi9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1wY20uYwpAQCAtNSw3ICs1LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsaWVkIERhdGEgU3lzdGVtcwogICoKICAqIFJld3JpdHRlbiBmb3IgdGhlIFNvQyBhdWRpbyBzdWJzeXN0ZW0gKEJhc2VkIG9uIFBYQTJ4eCBjb2RlKToKLSAqICAgQ29weXJpZ2h0IChjKSAyMDA4IFJ5YW4gTWFsbG9uIDxyeWFuQGJsdWV3YXRlcnN5cy5jb20+CisgKiAgIENvcHlyaWdodCAoYykgMjAwOCBSeWFuIE1hbGxvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTUzLDQzICs1NCwzNCBAQAogCiBzdHJ1Y3QgZXA5M3h4X3J1bnRpbWVfZGF0YQogewotCXN0cnVjdCBlcDkzeHhfZG1hX20ycF9jbGllbnQJY2w7Ci0Jc3RydWN0IGVwOTN4eF9wY21fZG1hX3BhcmFtcwkqcGFyYW1zOwogCWludAkJCQlwb2ludGVyX2J5dGVzOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAkJcGVyaW9kX3Rhc2tsZXQ7CiAJaW50CQkJCXBlcmlvZHM7Ci0Jc3RydWN0IGVwOTN4eF9kbWFfYnVmZmVyCWJ1ZlszMl07CisJaW50CQkJCXBlcmlvZF9ieXRlczsKKwlzdHJ1Y3QgZG1hX2NoYW4JCQkqZG1hX2NoYW47CisJc3RydWN0IGVwOTN4eF9kbWFfZGF0YQkJZG1hX2RhdGE7CiB9OwogCi1zdGF0aWMgdm9pZCBlcDkzeHhfcGNtX3BlcmlvZF9lbGFwc2VkKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIGVwOTN4eF9wY21fZG1hX2NhbGxiYWNrKHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopZGF0YTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGRhdGE7CisJc3RydWN0IGVwOTN4eF9ydW50aW1lX2RhdGEgKnJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJcnRkLT5wb2ludGVyX2J5dGVzICs9IHJ0ZC0+cGVyaW9kX2J5dGVzOworCXJ0ZC0+cG9pbnRlcl9ieXRlcyAlPSBydGQtPnBlcmlvZF9ieXRlcyAqIHJ0ZC0+cGVyaW9kczsKKwogCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKIH0KIAotc3RhdGljIHZvaWQgZXA5M3h4X3BjbV9idWZmZXJfc3RhcnRlZCh2b2lkICpjb29raWUsCi0JCQkJICAgICAgc3RydWN0IGVwOTN4eF9kbWFfYnVmZmVyICpidWYpCitzdGF0aWMgYm9vbCBlcDkzeHhfcGNtX2RtYV9maWx0ZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpmaWx0ZXJfcGFyYW0pCiB7Ci19CisJc3RydWN0IGVwOTN4eF9kbWFfZGF0YSAqZGF0YSA9IGZpbHRlcl9wYXJhbTsKIAotc3RhdGljIHZvaWQgZXA5M3h4X3BjbV9idWZmZXJfZmluaXNoZWQodm9pZCAqY29va2llLCAKLQkJCQkgICAgICAgc3RydWN0IGVwOTN4eF9kbWFfYnVmZmVyICpidWYsIAotCQkJCSAgICAgICBpbnQgYnl0ZXMsIGludCBlcnJvcikKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGNvb2tpZTsKLQlzdHJ1Y3QgZXA5M3h4X3J1bnRpbWVfZGF0YSAqcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoYnVmID09IHJ0ZC0+YnVmICsgcnRkLT5wZXJpb2RzIC0gMSkKLQkJcnRkLT5wb2ludGVyX2J5dGVzID0gMDsKLQllbHNlCi0JCXJ0ZC0+cG9pbnRlcl9ieXRlcyArPSBidWYtPnNpemU7Ci0KLQlpZiAoIWVycm9yKSB7Ci0JCWVwOTN4eF9kbWFfbTJwX3N1Ym1pdF9yZWN1cnNpdmUoJnJ0ZC0+Y2wsIGJ1Zik7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJnJ0ZC0+cGVyaW9kX3Rhc2tsZXQpOwotCX0gZWxzZSB7Ci0JCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKKwlpZiAoZGF0YS0+ZGlyZWN0aW9uID09IGVwOTN4eF9kbWFfY2hhbl9kaXJlY3Rpb24oY2hhbikpIHsKKwkJY2hhbi0+cHJpdmF0ZSA9IGRhdGE7CisJCXJldHVybiB0cnVlOwogCX0KKworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGludCBlcDkzeHhfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCkBAIC05OCwzMCArOTAsMzggQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBzb2NfcnRkLT5jcHVfZGFpOwogCXN0cnVjdCBlcDkzeHhfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXM7CiAJc3RydWN0IGVwOTN4eF9ydW50aW1lX2RhdGEgKnJ0ZDsgICAgCisJZG1hX2NhcF9tYXNrX3QgbWFzazsKIAlpbnQgcmV0OwogCi0JZG1hX3BhcmFtcyA9IHNuZF9zb2NfZGFpX2dldF9kbWFfZGF0YShjcHVfZGFpLCBzdWJzdHJlYW0pOworCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmZXA5M3h4X3BjbV9oYXJkd2FyZSk7CiAKIAlydGQgPSBrbWFsbG9jKHNpemVvZigqcnRkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFydGQpIAogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbXNldCgmcnRkLT5wZXJpb2RfdGFza2xldCwgMCwgc2l6ZW9mKHJ0ZC0+cGVyaW9kX3Rhc2tsZXQpKTsKLQlydGQtPnBlcmlvZF90YXNrbGV0LmZ1bmMgPSBlcDkzeHhfcGNtX3BlcmlvZF9lbGFwc2VkOwotCXJ0ZC0+cGVyaW9kX3Rhc2tsZXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXN1YnN0cmVhbTsKKwlkbWFfY2FwX3plcm8obWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKKwlkbWFfY2FwX3NldChETUFfQ1lDTElDLCBtYXNrKTsKIAotCXJ0ZC0+Y2wubmFtZSA9IGRtYV9wYXJhbXMtPm5hbWU7Ci0JcnRkLT5jbC5mbGFncyA9IGRtYV9wYXJhbXMtPmRtYV9wb3J0IHwgRVA5M1hYX0RNQV9NMlBfSUdOT1JFX0VSUk9SIHwKLQkJKChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSA/Ci0JCSBFUDkzWFhfRE1BX00yUF9UWCA6IEVQOTNYWF9ETUFfTTJQX1JYKTsKLQlydGQtPmNsLmNvb2tpZSA9IHN1YnN0cmVhbTsKLQlydGQtPmNsLmJ1ZmZlcl9zdGFydGVkID0gZXA5M3h4X3BjbV9idWZmZXJfc3RhcnRlZDsKLQlydGQtPmNsLmJ1ZmZlcl9maW5pc2hlZCA9IGVwOTN4eF9wY21fYnVmZmVyX2ZpbmlzaGVkOwotCXJldCA9IGVwOTN4eF9kbWFfbTJwX2NsaWVudF9yZWdpc3RlcigmcnRkLT5jbCk7Ci0JaWYgKHJldCA8IDApIHsKKwlkbWFfcGFyYW1zID0gc25kX3NvY19kYWlfZ2V0X2RtYV9kYXRhKGNwdV9kYWksIHN1YnN0cmVhbSk7CisJcnRkLT5kbWFfZGF0YS5wb3J0ID0gZG1hX3BhcmFtcy0+ZG1hX3BvcnQ7CisJcnRkLT5kbWFfZGF0YS5uYW1lID0gZG1hX3BhcmFtcy0+bmFtZTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlydGQtPmRtYV9kYXRhLmRpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisJZWxzZQorCQlydGQtPmRtYV9kYXRhLmRpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKworCXJ0ZC0+ZG1hX2NoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGVwOTN4eF9wY21fZG1hX2ZpbHRlciwKKwkJCQkJICAgICZydGQtPmRtYV9kYXRhKTsKKwlpZiAoIXJ0ZC0+ZG1hX2NoYW4pIHsKIAkJa2ZyZWUocnRkKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCQogCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcnRkOwpAQCAtMTMyLDMxICsxMzIsNTIgQEAKIHsKIAlzdHJ1Y3QgZXA5M3h4X3J1bnRpbWVfZGF0YSAqcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAKLQllcDkzeHhfZG1hX20ycF9jbGllbnRfdW5yZWdpc3RlcigmcnRkLT5jbCk7CisJZG1hX3JlbGVhc2VfY2hhbm5lbChydGQtPmRtYV9jaGFuKTsKIAlrZnJlZShydGQpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGVwOTN4eF9wY21fZG1hX3N1Ym1pdChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBlcDkzeHhfcnVudGltZV9kYXRhICpydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gcnRkLT5kbWFfY2hhbjsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZG1hX2RldiA9IGNoYW4tPmRldmljZTsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CisKKwlydGQtPnBvaW50ZXJfYnl0ZXMgPSAwOworCWRlc2MgPSBkbWFfZGV2LT5kZXZpY2VfcHJlcF9kbWFfY3ljbGljKGNoYW4sIHJ1bnRpbWUtPmRtYV9hZGRyLAorCQkJCQkgICAgICAgcnRkLT5wZXJpb2RfYnl0ZXMgKiBydGQtPnBlcmlvZHMsCisJCQkJCSAgICAgICBydGQtPnBlcmlvZF9ieXRlcywKKwkJCQkJICAgICAgIHJ0ZC0+ZG1hX2RhdGEuZGlyZWN0aW9uKTsKKwlpZiAoIWRlc2MpCisJCXJldHVybiAtRUlOVkFMOworCisJZGVzYy0+Y2FsbGJhY2sgPSBlcDkzeHhfcGNtX2RtYV9jYWxsYmFjazsKKwlkZXNjLT5jYWxsYmFja19wYXJhbSA9IHN1YnN0cmVhbTsKKworCWRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVwOTN4eF9wY21fZG1hX2ZsdXNoKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGVwOTN4eF9ydW50aW1lX2RhdGEgKnJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHJ0ZC0+ZG1hX2NoYW4pOworfQorCiBzdGF0aWMgaW50IGVwOTN4eF9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IGVwOTN4eF9ydW50aW1lX2RhdGEgKnJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzaXplX3QgdG90c2l6ZSA9IHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKTsKLQlzaXplX3QgcGVyaW9kID0gcGFyYW1zX3BlcmlvZF9ieXRlcyhwYXJhbXMpOwotCWludCBpOwogCiAJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKLQlydW50aW1lLT5kbWFfYnl0ZXMgPSB0b3RzaXplOwogCi0JcnRkLT5wZXJpb2RzID0gKHRvdHNpemUgKyBwZXJpb2QgLSAxKSAvIHBlcmlvZDsKLQlmb3IgKGkgPSAwOyBpIDwgcnRkLT5wZXJpb2RzOyBpKyspIHsKLQkJcnRkLT5idWZbaV0uYnVzX2FkZHIgPSBydW50aW1lLT5kbWFfYWRkciArIChpICogcGVyaW9kKTsKLQkJcnRkLT5idWZbaV0uc2l6ZSA9IHBlcmlvZDsKLQkJaWYgKChpICsgMSkgKiBwZXJpb2QgPiB0b3RzaXplKQotCQkJcnRkLT5idWZbaV0uc2l6ZSA9IHRvdHNpemUgLSAoaSAqIHBlcmlvZCk7Ci0JfQotCisJcnRkLT5wZXJpb2RzID0gcGFyYW1zX3BlcmlvZHMocGFyYW1zKTsKKwlydGQtPnBlcmlvZF9ieXRlcyA9IHBhcmFtc19wZXJpb2RfYnl0ZXMocGFyYW1zKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTY4LDI0ICsxODksMjAgQEAKIAogc3RhdGljIGludCBlcDkzeHhfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCiB7Ci0Jc3RydWN0IGVwOTN4eF9ydW50aW1lX2RhdGEgKnJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCWludCByZXQ7Ci0JaW50IGk7CiAKIAlyZXQgPSAwOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCXJ0ZC0+cG9pbnRlcl9ieXRlcyA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBydGQtPnBlcmlvZHM7IGkrKykKLQkJCWVwOTN4eF9kbWFfbTJwX3N1Ym1pdCgmcnRkLT5jbCwgcnRkLT5idWYgKyBpKTsKKwkJcmV0ID0gZXA5M3h4X3BjbV9kbWFfc3VibWl0KHN1YnN0cmVhbSk7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JCWVwOTN4eF9kbWFfbTJwX2ZsdXNoKCZydGQtPmNsKTsKKwkJZXA5M3h4X3BjbV9kbWFfZmx1c2goc3Vic3RyZWFtKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjY2LDkgKzI4MywxMSBAQAogCiBzdGF0aWMgdTY0IGVwOTN4eF9wY21fZG1hbWFzayA9IDB4ZmZmZmZmZmY7CiAKLXN0YXRpYyBpbnQgZXA5M3h4X3BjbV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCSAgc3RydWN0IHNuZF9wY20gKnBjbSkKK3N0YXRpYyBpbnQgZXA5M3h4X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghY2FyZC0+ZGV2LT5kbWFfbWFzaykKQEAgLTMzMyw2ICszNTIsNiBAQAogbW9kdWxlX2luaXQoZXA5M3h4X3NvY19wbGF0Zm9ybV9pbml0KTsKIG1vZHVsZV9leGl0KGVwOTN4eF9zb2NfcGxhdGZvcm1fZXhpdCk7CiAKLU1PRFVMRV9BVVRIT1IoIlJ5YW4gTWFsbG9uIDxyeWFuQGJsdWV3YXRlcnN5cy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJSeWFuIE1hbGxvbiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJFUDkzeHggQUxTQSBQQ00gaW50ZXJmYWNlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZXA5M3h4L3NuYXBwZXJjbDE1LmMgYi9zb3VuZC9zb2MvZXA5M3h4L3NuYXBwZXJjbDE1LmMKaW5kZXggZGZlMWQ3Zi4uYzhhYThhNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2VwOTN4eC9zbmFwcGVyY2wxNS5jCisrKyBiL3NvdW5kL3NvYy9lcDkzeHgvc25hcHBlcmNsMTUuYwpAQCAtMiw3ICsyLDcgQEAKICAqIHNuYXBwZXJjbDE1LmMgLS0gU29DIGF1ZGlvIGZvciBCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIENMMTUgbW9kdWxlCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA4IEJsdWV3YXRlciBTeXN0ZW1zIEx0ZAotICogQXV0aG9yOiBSeWFuIE1hbGxvbiA8cnlhbkBibHVld2F0ZXJzeXMuY29tPgorICogQXV0aG9yOiBSeWFuIE1hbGxvbgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKQEAgLTE0MCw3ICsxNDAsNyBAQAogbW9kdWxlX2luaXQoc25hcHBlcmNsMTVfaW5pdCk7CiBtb2R1bGVfZXhpdChzbmFwcGVyY2wxNV9leGl0KTsKIAotTU9EVUxFX0FVVEhPUigiUnlhbiBNYWxsb24gPHJ5YW5AYmx1ZXdhdGVyc3lzLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlJ5YW4gTWFsbG9uIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIFNuYXBwZXIgQ0wxNSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9kbWEuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX2RtYS5jCmluZGV4IDE1ZGFjMGYuLjczMjIwOGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX2RtYS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX2RtYS5jCkBAIC0yOTQsOSArMjk0LDExIEBACiAgKiBSZWdhcmRsZXNzIG9mIHdoZXJlIHRoZSBtZW1vcnkgaXMgYWN0dWFsbHkgYWxsb2NhdGVkLCBzaW5jZSB0aGUgZGV2aWNlIGNhbgogICogdGVjaG5pY2FsbHkgRE1BIHRvIGFueSAzNi1iaXQgYWRkcmVzcywgd2UgZG8gbmVlZCB0byBzZXQgdGhlIERNQSBtYXNrIHRvIDM2LgogICovCi1zdGF0aWMgaW50IGZzbF9kbWFfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0Jc3RydWN0IHNuZF9wY20gKnBjbSkKK3N0YXRpYyBpbnQgZnNsX2RtYV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKIAlzdGF0aWMgdTY0IGZzbF9kbWFfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzNik7CiAJaW50IHJldDsKIApAQCAtMzEwLDcgKzMxMiw3IEBACiAJICogc2hvdWxkIGFsbG9jYXRlIGEgRE1BIGJ1ZmZlciBvbmx5IGZvciB0aGUgc3RyZWFtcyB0aGF0IGFyZSB2YWxpZC4KIAkgKi8KIAotCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suY2hhbm5lbHNfbWluKSB7CisJaWYgKHBjbS0+c3RyZWFtc1swXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIGNhcmQtPmRldiwKIAkJCWZzbF9kbWFfaGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heCwKIAkJCSZwY20tPnN0cmVhbXNbMF0uc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKQEAgLTMyMCwxMyArMzIyLDEzIEBACiAJCX0KIAl9CiAKLQlpZiAoZGFpLT5kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWluKSB7CisJaWYgKHBjbS0+c3RyZWFtc1sxXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIGNhcmQtPmRldiwKIAkJCWZzbF9kbWFfaGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heCwKIAkJCSZwY20tPnN0cmVhbXNbMV0uc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKIAkJaWYgKHJldCkgewotCQkJc25kX2RtYV9mcmVlX3BhZ2VzKCZwY20tPnN0cmVhbXNbMF0uc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKIAkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2FuJ3QgYWxsb2MgY2FwdHVyZSBkbWEgYnVmZmVyXG4iKTsKKwkJCXNuZF9kbWFfZnJlZV9wYWdlcygmcGNtLT5zdHJlYW1zWzBdLnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpAQCAtNDQ5LDcgKzQ1MSw4IEBACiAJZG1hX3ByaXZhdGUtPmxkX2J1Zl9waHlzID0gbGRfYnVmX3BoeXM7CiAJZG1hX3ByaXZhdGUtPmRtYV9idWZfcGh5cyA9IHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hZGRyOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoZG1hX3ByaXZhdGUtPmlycSwgZnNsX2RtYV9pc3IsIDAsICJETUEiLCBkbWFfcHJpdmF0ZSk7CisJcmV0ID0gcmVxdWVzdF9pcnEoZG1hX3ByaXZhdGUtPmlycSwgZnNsX2RtYV9pc3IsIDAsICJmc2xkbWEtYXVkaW8iLAorCQkJICBkbWFfcHJpdmF0ZSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgImNhbid0IHJlZ2lzdGVyIElTUiBmb3IgSVJRICV1IChyZXQ9JWkpXG4iLAogCQkJZG1hX3ByaXZhdGUtPmlycSwgcmV0KTsKQEAgLTkzOCw3ICs5NDEsNyBAQAogCiAJaXByb3AgPSBvZl9nZXRfcHJvcGVydHkoc3NpX25wLCAiZnNsLGZpZm8tZGVwdGgiLCBOVUxMKTsKIAlpZiAoaXByb3ApCi0JCWRtYS0+c3NpX2ZpZm9fZGVwdGggPSAqaXByb3A7CisJCWRtYS0+c3NpX2ZpZm9fZGVwdGggPSBiZTMyX3RvX2NwdXAoaXByb3ApOwogCWVsc2UKICAgICAgICAgICAgICAgICAvKiBPbGRlciA4NjEwIERUcyBkaWRuJ3QgaGF2ZSB0aGUgZmlmby1kZXB0aCBwcm9wZXJ0eSAqLwogCQlkbWEtPnNzaV9maWZvX2RlcHRoID0gODsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jIGIvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKaW5kZXggMzEzZTBjYy4uZDQ4YWZlYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKQEAgLTY3OCw3ICs2NzgsMTIgQEAKIAkJa2ZyZWUoc3NpX3ByaXZhdGUpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlzc2lfcHJpdmF0ZS0+c3NpID0gaW9yZW1hcChyZXMuc3RhcnQsIDEgKyByZXMuZW5kIC0gcmVzLnN0YXJ0KTsKKwlzc2lfcHJpdmF0ZS0+c3NpID0gb2ZfaW9tYXAobnAsIDApOworCWlmICghc3NpX3ByaXZhdGUtPnNzaSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgbWFwIGRldmljZSByZXNvdXJjZXNcbiIpOworCQlrZnJlZShzc2lfcHJpdmF0ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAlzc2lfcHJpdmF0ZS0+c3NpX3BoeXMgPSByZXMuc3RhcnQ7CiAJc3NpX3ByaXZhdGUtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKIApAQCAtNjkxLDcgKzY5Niw3IEBACiAJLyogRGV0ZXJtaW5lIHRoZSBGSUZPIGRlcHRoLiAqLwogCWlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZnNsLGZpZm8tZGVwdGgiLCBOVUxMKTsKIAlpZiAoaXByb3ApCi0JCXNzaV9wcml2YXRlLT5maWZvX2RlcHRoID0gKmlwcm9wOworCQlzc2lfcHJpdmF0ZS0+Zmlmb19kZXB0aCA9IGJlMzJfdG9fY3B1cChpcHJvcCk7CiAJZWxzZQogICAgICAgICAgICAgICAgIC8qIE9sZGVyIDg2MTAgRFRzIGRpZG4ndCBoYXZlIHRoZSBmaWZvLWRlcHRoIHByb3BlcnR5ICovCiAJCXNzaV9wcml2YXRlLT5maWZvX2RlcHRoID0gODsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvbXBjNTIwMF9kbWEuYyBiL3NvdW5kL3NvYy9mc2wvbXBjNTIwMF9kbWEuYwppbmRleCBmZmY2OTVjLi5mZDBkYzQ2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL21wYzUyMDBfZG1hLmMKKysrIGIvc291bmQvc29jL2ZzbC9tcGM1MjAwX2RtYS5jCkBAIC0yOTksMTAgKzI5OSwxMSBAQAogfTsKIAogc3RhdGljIHU2NCBwc2NfZG1hX2RtYW1hc2sgPSAweGZmZmZmZmZmOwotc3RhdGljIGludCBwc2NfZG1hX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkJICAgc3RydWN0IHNuZF9wY20gKnBjbSkKK3N0YXRpYyBpbnQgcHNjX2RtYV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gcGNtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CiAJc3RydWN0IHBzY19kbWEgKnBzY19kbWEgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShydGQtPmNwdV9kYWkpOwogCXNpemVfdCBzaXplID0gcHNjX2RtYV9oYXJkd2FyZS5idWZmZXJfYnl0ZXNfbWF4OwogCWludCByYyA9IDA7CkBAIC0zODQsNyArMzg1LDcgQEAKIAkJZGV2X2Vycigmb3AtPmRldiwgIk1pc3NpbmcgcmVnIHByb3BlcnR5XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCXJlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgMSArIHJlcy5lbmQgLSByZXMuc3RhcnQpOworCXJlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CiAJaWYgKCFyZWdzKSB7CiAJCWRldl9lcnIoJm9wLT5kZXYsICJDb3VsZCBub3QgbWFwIHJlZ2lzdGVyc1xuIik7CiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9tcGM4NjEwX2hwY2QuYyBiL3NvdW5kL3NvYy9mc2wvbXBjODYxMF9ocGNkLmMKaW5kZXggYzE2YzZiMi4uYTE5Mjk3OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9tcGM4NjEwX2hwY2QuYworKysgYi9zb3VuZC9zb2MvZnNsL21wYzg2MTBfaHBjZC5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIAlpZiAoIWlwcm9wKQogCQlyZXR1cm4gLTE7CiAKLQlyZXR1cm4gKmlwcm9wOworCXJldHVybiBiZTMyX3RvX2NwdXAoaXByb3ApOwogfQogCiAvKioKQEAgLTI1OCw3ICsyNTgsNyBAQAogCWlmICghaXByb3ApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYWRkciA9ICppcHJvcDsKKwlhZGRyID0gYmUzMl90b19jcHVwKGlwcm9wKTsKIAogCWJ1cyA9IGdldF9wYXJlbnRfY2VsbF9pbmRleChucCk7CiAJaWYgKGJ1cyA8IDApCkBAIC0zMDUsNyArMzA1LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JKmRtYV9jaGFubmVsX2lkID0gKmlwcm9wOworCSpkbWFfY2hhbm5lbF9pZCA9IGJlMzJfdG9fY3B1cChpcHJvcCk7CiAJKmRtYV9pZCA9IGdldF9wYXJlbnRfY2VsbF9pbmRleChkbWFfY2hhbm5lbF9ucCk7CiAJb2Zfbm9kZV9wdXQoZG1hX2NoYW5uZWxfbnApOwogCkBAIC0zNzksNyArMzc5LDcgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJvcjsKIAl9Ci0JbWFjaGluZV9kYXRhLT5zc2lfaWQgPSAqaXByb3A7CisJbWFjaGluZV9kYXRhLT5zc2lfaWQgPSBiZTMyX3RvX2NwdXAoaXByb3ApOwogCiAJLyogR2V0IHRoZSBzZXJpYWwgZm9ybWF0IGFuZCBjbG9jayBkaXJlY3Rpb24uICovCiAJc3Byb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsbW9kZSIsIE5VTEwpOwpAQCAtNDA1LDcgKzQwNSw3IEBACiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvcjsKIAkJfQotCQltYWNoaW5lX2RhdGEtPmNsa19mcmVxdWVuY3kgPSAqaXByb3A7CisJCW1hY2hpbmVfZGF0YS0+Y2xrX2ZyZXF1ZW5jeSA9IGJlMzJfdG9fY3B1cChpcHJvcCk7CiAJfSBlbHNlIGlmIChzdHJjYXNlY21wKHNwcm9wLCAiaTJzLW1hc3RlciIpID09IDApIHsKIAkJbWFjaGluZV9kYXRhLT5kYWlfZm9ybWF0ID0gU05EX1NPQ19EQUlGTVRfSTJTOwogCQltYWNoaW5lX2RhdGEtPmNvZGVjX2Nsa19kaXJlY3Rpb24gPSBTTkRfU09DX0NMT0NLX0lOOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9wMTAyMl9kcy5jIGIvc291bmQvc29jL2ZzbC9wMTAyMl9kcy5jCmluZGV4IDY2ZTBiNjguLjhmYTRkNWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvcDEwMjJfZHMuYworKysgYi9zb3VuZC9zb2MvZnNsL3AxMDIyX2RzLmMKQEAgLTIzMiw3ICsyMzIsNyBAQAogCiAJaXByb3AgPSBvZl9nZXRfcHJvcGVydHkocGFyZW50LCAiY2VsbC1pbmRleCIsIE5VTEwpOwogCWlmIChpcHJvcCkKLQkJcmV0ID0gKmlwcm9wOworCQlyZXQgPSBiZTMyX3RvX2NwdXAoaXByb3ApOwogCiAJb2Zfbm9kZV9wdXQocGFyZW50KTsKIApAQCAtMjYxLDcgKzI2MSw3IEBACiAJaWYgKCFpcHJvcCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlhZGRyID0gKmlwcm9wOworCWFkZHIgPSBiZTMyX3RvX2NwdXAoaXByb3ApOwogCiAJYnVzID0gZ2V0X3BhcmVudF9jZWxsX2luZGV4KG5wKTsKIAlpZiAoYnVzIDwgMCkKQEAgLTMwOCw3ICszMDgsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkqZG1hX2NoYW5uZWxfaWQgPSAqaXByb3A7CisJKmRtYV9jaGFubmVsX2lkID0gYmUzMl90b19jcHVwKGlwcm9wKTsKIAkqZG1hX2lkID0gZ2V0X3BhcmVudF9jZWxsX2luZGV4KGRtYV9jaGFubmVsX25wKTsKIAlvZl9ub2RlX3B1dChkbWFfY2hhbm5lbF9ucCk7CiAKQEAgLTM3OSw3ICszNzksNyBAQAogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycm9yOwogCX0KLQltZGF0YS0+c3NpX2lkID0gKmlwcm9wOworCW1kYXRhLT5zc2lfaWQgPSBiZTMyX3RvX2NwdXAoaXByb3ApOwogCiAJLyogR2V0IHRoZSBzZXJpYWwgZm9ybWF0IGFuZCBjbG9jayBkaXJlY3Rpb24uICovCiAJc3Byb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsbW9kZSIsIE5VTEwpOwpAQCAtNDA1LDcgKzQwNSw3IEBACiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvcjsKIAkJfQotCQltZGF0YS0+Y2xrX2ZyZXF1ZW5jeSA9ICppcHJvcDsKKwkJbWRhdGEtPmNsa19mcmVxdWVuY3kgPSBiZTMyX3RvX2NwdXAoaXByb3ApOwogCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChzcHJvcCwgImkycy1tYXN0ZXIiKSA9PSAwKSB7CiAJCW1kYXRhLT5kYWlfZm9ybWF0ID0gU05EX1NPQ19EQUlGTVRfSTJTOwogCQltZGF0YS0+Y29kZWNfY2xrX2RpcmVjdGlvbiA9IFNORF9TT0NfQ0xPQ0tfSU47CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW14L0tjb25maWcgYi9zb3VuZC9zb2MvaW14L0tjb25maWcKaW5kZXggZDhmMTMwZC4uYmI2OTliYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2lteC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9pbXgvS2NvbmZpZwpAQCAtMTEsOSArMTEsNiBAQAogCiBpZiBTTkRfSU1YX1NPQwogCi1jb25maWcgU05EX01YQ19TT0NfU1NJCi0JdHJpc3RhdGUKLQogY29uZmlnIFNORF9NWENfU09DX0ZJUQogCXRyaXN0YXRlCiAKQEAgLTI0LDcgKzIxLDYgQEAKIAl0cmlzdGF0ZSAiQXVkaW8gb24gdGhlIHRoZSBpLk1YMzFBRFMgd2l0aCBXTTExMzMtRVYxIGZpdHRlZCIKIAlkZXBlbmRzIG9uIE1BQ0hfTVgzMUFEU19XTTExMzNfRVYxICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBTTkRfU09DX1dNODM1MAotCXNlbGVjdCBTTkRfTVhDX1NPQ19TU0kKIAlzZWxlY3QgU05EX01YQ19TT0NfRklRCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIGF1ZGlvIG9uIHRoZSBpLk1YMzFBRFMgd2l0aCB0aGUgV00xMTMzLUVWMQpAQCAtMzQsNyArMzAsNiBAQAogCXRyaXN0YXRlICJTb0MgYXVkaW8gc3VwcG9ydCBmb3IgVmlzc3RyaW0gTTEwIGJvYXJkcyIKIAlkZXBlbmRzIG9uIE1BQ0hfSU1YMjdfVklTU1RSSU1fTTEwCiAJc2VsZWN0IFNORF9TT0NfVFZMMzIwQUlDMzJYNAotCXNlbGVjdCBTTkRfTVhDX1NPQ19TU0kKIAlzZWxlY3QgU05EX01YQ19TT0NfTVgyCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBWaXNzdHJpbSBTTTEwCkBAIC00NCw3ICszOSw2IEBACiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBQaHl0ZWMgcGh5Q09SRSAoYW5kIHBoeUNBUkQpIGJvYXJkcyIKIAlkZXBlbmRzIG9uIE1BQ0hfUENNMDQzIHx8IE1BQ0hfUENBMTAwCiAJc2VsZWN0IFNORF9TT0NfV005NzEyCi0Jc2VsZWN0IFNORF9NWENfU09DX1NTSQogCXNlbGVjdCBTTkRfTVhDX1NPQ19GSVEKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFBoeXRlYyBwaHlDT1JFCkBAIC01Nyw3ICs1MSw2IEBACiAJCXx8IE1BQ0hfRVVLUkVBX01CSU1YU0QzNV9CQVNFQk9BUkQgXAogCQl8fCBNQUNIX0VVS1JFQV9NQklNWFNENTFfQkFTRUJPQVJECiAJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKLQlzZWxlY3QgU05EX01YQ19TT0NfU1NJCiAJc2VsZWN0IFNORF9NWENfU09DX0ZJUQogCWhlbHAKIAkgIEVuYWJsZSBJMlMgYmFzZWQgYWNjZXNzIHRvIHRoZSBUTFYzMjBBSUMyM0IgY29kZWMgYXR0YWNoZWQKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbXgvaW14LXBjbS1kbWEtbXgyLmMgYi9zb3VuZC9zb2MvaW14L2lteC1wY20tZG1hLW14Mi5jCmluZGV4IGFhYjc3NjUuLjQzZmRjMjRmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L2lteC1wY20tZG1hLW14Mi5jCisrKyBiL3NvdW5kL3NvYy9pbXgvaW14LXBjbS1kbWEtbXgyLmMKQEAgLTExMCwxMiArMTEwLDEyIEBACiAJCXNsYXZlX2NvbmZpZy5kaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOwogCQlzbGF2ZV9jb25maWcuZHN0X2FkZHIgPSBkbWFfcGFyYW1zLT5kbWFfYWRkcjsKIAkJc2xhdmVfY29uZmlnLmRzdF9hZGRyX3dpZHRoID0gYnVzd2lkdGg7Ci0JCXNsYXZlX2NvbmZpZy5kc3RfbWF4YnVyc3QgPSBkbWFfcGFyYW1zLT5idXJzdHNpemUgKiBidXN3aWR0aDsKKwkJc2xhdmVfY29uZmlnLmRzdF9tYXhidXJzdCA9IGRtYV9wYXJhbXMtPmJ1cnN0c2l6ZTsKIAl9IGVsc2UgewogCQlzbGF2ZV9jb25maWcuZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwogCQlzbGF2ZV9jb25maWcuc3JjX2FkZHIgPSBkbWFfcGFyYW1zLT5kbWFfYWRkcjsKIAkJc2xhdmVfY29uZmlnLnNyY19hZGRyX3dpZHRoID0gYnVzd2lkdGg7Ci0JCXNsYXZlX2NvbmZpZy5zcmNfbWF4YnVyc3QgPSBkbWFfcGFyYW1zLT5idXJzdHNpemUgKiBidXN3aWR0aDsKKwkJc2xhdmVfY29uZmlnLnNyY19tYXhidXJzdCA9IGRtYV9wYXJhbXMtPmJ1cnN0c2l6ZTsKIAl9CiAKIAlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKGlwcnRkLT5kbWFfY2hhbiwgJnNsYXZlX2NvbmZpZyk7CkBAIC0zMzcsMyArMzM3LDUgQEAKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaW14X3BjbV9kcml2ZXIpOwogfQogbW9kdWxlX2V4aXQoc25kX2lteF9wY21fZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmlteC1wY20tYXVkaW8iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbXgvaW14LXBjbS1maXEuYyBiL3NvdW5kL3NvYy9pbXgvaW14LXBjbS1maXEuYwppbmRleCA0MTNiNzhkLi4zMDljNTllIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L2lteC1wY20tZmlxLmMKKysrIGIvc291bmQvc29jL2lteC9pbXgtcGNtLWZpcS5jCkBAIC0yMzgsMTIgKzIzOCwxNCBAQAogCiBzdGF0aWMgaW50IHNzaV9pcnEgPSAwOwogCi1zdGF0aWMgaW50IGlteF9wY21fZmlxX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCXN0cnVjdCBzbmRfcGNtICpwY20pCitzdGF0aWMgaW50IGlteF9wY21fZmlxX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogeworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwogCWludCByZXQ7CiAKLQlyZXQgPSBpbXhfcGNtX25ldyhjYXJkLCBkYWksIHBjbSk7CisJcmV0ID0gaW14X3BjbV9uZXcocnRkKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW14L2lteC1zc2kuYyBiL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5jCmluZGV4IDViMTNmZWMuLjEwYThlMjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5jCisrKyBiL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5jCkBAIC0zODgsMTAgKzM4OCwxMSBAQAogCiBzdGF0aWMgdTY0IGlteF9wY21fZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKLWludCBpbXhfcGNtX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCXN0cnVjdCBzbmRfcGNtICpwY20pCitpbnQgaW14X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQorCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwogCWludCByZXQgPSAwOwogCiAJaWYgKCFjYXJkLT5kZXYtPmRtYV9tYXNrKQpAQCAtNzc0LDQgKzc3NSw0IEBACiBNT0RVTEVfQVVUSE9SKCJTYXNjaGEgSGF1ZXIsIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJpLk1YIEkyUy9hYzk3IFNvQyBJbnRlcmZhY2UiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQorTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTppbXgtc3NpIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW14L2lteC1zc2kuaCBiL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5oCmluZGV4IGRjOGE4NzUuLjBhODRjZWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5oCisrKyBiL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5oCkBAIC0yMjUsOCArMjI1LDcgQEAKIAkJc3RydWN0IGlteF9zc2kgKnNzaSk7CiAKIGludCBzbmRfaW14X3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci1pbnQgaW14X3BjbV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtKTsKK2ludCBpbXhfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKTsKIHZvaWQgaW14X3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pOwogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2p6NDc0MC9qejQ3NDAtcGNtLmMgYi9zb3VuZC9zb2Mvano0NzQwL2p6NDc0MC1wY20uYwppbmRleCBmYjE0ODNmLi5hN2M5NTc4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvano0NzQwL2p6NDc0MC1wY20uYworKysgYi9zb3VuZC9zb2Mvano0NzQwL2p6NDc0MC1wY20uYwpAQCAtMjk5LDkgKzI5OSwxMSBAQAogCiBzdGF0aWMgdTY0IGp6NDc0MF9wY21fZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKLWludCBqejQ3NDBfcGNtX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCXN0cnVjdCBzbmRfcGNtICpwY20pCitpbnQgano0NzQwX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghY2FyZC0+ZGV2LT5kbWFfbWFzaykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1kbWEuYyBiL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1kbWEuYwppbmRleCBlMTNjNmNlLi5jZDMzZGUxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtZG1hLmMKKysrIGIvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWRtYS5jCkBAIC0zMTIsOSArMzEyLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQga2lya3dvb2RfZG1hX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBzdHJ1Y3Qgc25kX3BjbSAqcGNtKQorc3RhdGljIGludCBraXJrd29vZF9kbWFfbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CiAJaW50IHJldDsKIAogCWlmICghY2FyZC0+ZGV2LT5kbWFfbWFzaykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9taWQteDg2L3NzdF9wbGF0Zm9ybS5jIGIvc291bmQvc29jL21pZC14ODYvc3N0X3BsYXRmb3JtLmMKaW5kZXggNWE5NDZiNC4uM2U3ODI2MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL21pZC14ODYvc3N0X3BsYXRmb3JtLmMKKysrIGIvc291bmQvc29jL21pZC14ODYvc3N0X3BsYXRmb3JtLmMKQEAgLTQwMiw5ICs0MDIsMTAgQEAKIAlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKIH0KIAotaW50IHNzdF9wY21fbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQlzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoraW50IHNzdF9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwogCWludCByZXR2YWwgPSAwOwogCiAJcHJfZGVidWcoInNzdF9wY21fbmV3IGNhbGxlZFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1hYzk3LmMgYi9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1hYzk3LmMKaW5kZXggZGFjNjczMi4uOWMwZWRhZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL251YzkwMC9udWM5MDAtYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9udWM5MDAvbnVjOTAwLWFjOTcuYwpAQCAtMzU2LDcgKzM1Niw3IEBACiAJbnVjOTAwX2F1ZGlvLT5pcnFfbnVtID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoIW51YzkwMF9hdWRpby0+aXJxX251bSkgewogCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0MjsKKwkJZ290byBvdXQzOwogCX0KIAogCW51YzkwMF9hYzk3X2RhdGEgPSBudWM5MDBfYXVkaW87CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1wY20uYyBiL3NvdW5kL3NvYy9udWM5MDAvbnVjOTAwLXBjbS5jCmluZGV4IDgyNjNmNTYuLmQ1ODllZjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9udWM5MDAvbnVjOTAwLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9udWM5MDAvbnVjOTAwLXBjbS5jCkBAIC0zMTUsOSArMzE1LDEyIEBACiB9CiAKIHN0YXRpYyB1NjQgbnVjOTAwX3BjbV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLXN0YXRpYyBpbnQgbnVjOTAwX2RtYV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLAotCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBzdHJ1Y3Qgc25kX3BjbSAqcGNtKQorc3RhdGljIGludCBudWM5MDBfZG1hX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogeworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCiAJaWYgKCFjYXJkLT5kZXYtPmRtYV9tYXNrKQogCQljYXJkLT5kZXYtPmRtYV9tYXNrID0gJm51YzkwMF9wY21fZG1hbWFzazsKIAlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9LY29uZmlnIGIvc291bmQvc29jL29tYXAvS2NvbmZpZwppbmRleCA5OTA1NGNmLi5mZTgzZDBkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9vbWFwL0tjb25maWcKQEAgLTksNiArOSw5IEBACiBjb25maWcgU05EX09NQVBfU09DX01DUERNCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9PTUFQX1NPQ19IRE1JCisJdHJpc3RhdGUKKwogY29uZmlnIFNORF9PTUFQX1NPQ19OODEwCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBOb2tpYSBOODEwIgogCWRlcGVuZHMgb24gU05EX09NQVBfU09DICYmIE1BQ0hfTk9LSUFfTjgxMCAmJiBJMkMKQEAgLTEwMCw2ICsxMDMsMTQgQEAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gVGV4YXMgSW5zdHJ1bWVudHMKIAkgIFNEUDQ0MzAuCiAKK2NvbmZpZyBTTkRfT01BUF9TT0NfT01BUDRfSERNSQorCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgT01BUDQgSERNSSIKKwlkZXBlbmRzIG9uIFNORF9PTUFQX1NPQyAmJiBPTUFQNF9EU1NfSERNSSAmJiBPTUFQMl9EU1MgJiYgQVJDSF9PTUFQNAorCXNlbGVjdCBTTkRfT01BUF9TT0NfSERNSQorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgSERNSSBhdWRpbyBvbiBUZXhhcyBJbnN0cnVtZW50cworCSAgT01BUDQgY2hpcHMKKwogY29uZmlnIFNORF9PTUFQX1NPQ19PTUFQM19QQU5ET1JBCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBPTUFQMyBQYW5kb3JhIgogCWRlcGVuZHMgb24gVFdMNDAzMF9DT1JFICYmIFNORF9PTUFQX1NPQyAmJiBNQUNIX09NQVAzX1BBTkRPUkEKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL01ha2VmaWxlIGIvc291bmQvc29jL29tYXAvTWFrZWZpbGUKaW5kZXggNmMyYzg3ZS4uNTllMmM4ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL29tYXAvTWFrZWZpbGUKQEAgLTIsMTAgKzIsMTIgQEAKIHNuZC1zb2Mtb21hcC1vYmpzIDo9IG9tYXAtcGNtLm8KIHNuZC1zb2Mtb21hcC1tY2JzcC1vYmpzIDo9IG9tYXAtbWNic3Aubwogc25kLXNvYy1vbWFwLW1jcGRtLW9ianMgOj0gb21hcC1tY3BkbS5vIG1jcGRtLm8KK3NuZC1zb2Mtb21hcC1oZG1pLW9ianMgOj0gb21hcC1oZG1pLm8KIAogb2JqLSQoQ09ORklHX1NORF9PTUFQX1NPQykgKz0gc25kLXNvYy1vbWFwLm8KIG9iai0kKENPTkZJR19TTkRfT01BUF9TT0NfTUNCU1ApICs9IHNuZC1zb2Mtb21hcC1tY2JzcC5vCiBvYmotJChDT05GSUdfU05EX09NQVBfU09DX01DUERNKSArPSBzbmQtc29jLW9tYXAtbWNwZG0ubworb2JqLSQoQ09ORklHX1NORF9PTUFQX1NPQ19IRE1JKSArPSBzbmQtc29jLW9tYXAtaGRtaS5vCiAKICMgT01BUCBNYWNoaW5lIFN1cHBvcnQKIHNuZC1zb2MtbjgxMC1vYmpzIDo9IG44MTAubwpAQCAtMjEsNiArMjMsNyBAQAogc25kLXNvYy1vbWFwM2JlYWdsZS1vYmpzIDo9IG9tYXAzYmVhZ2xlLm8KIHNuZC1zb2Mtem9vbTItb2JqcyA6PSB6b29tMi5vCiBzbmQtc29jLWlnZXAwMDIwLW9ianMgOj0gaWdlcDAwMjAubworc25kLXNvYy1vbWFwNC1oZG1pLW9ianMgOj0gb21hcDQtaGRtaS1jYXJkLm8KIAogb2JqLSQoQ09ORklHX1NORF9PTUFQX1NPQ19OODEwKSArPSBzbmQtc29jLW44MTAubwogb2JqLSQoQ09ORklHX1NORF9PTUFQX1NPQ19SWDUxKSArPSBzbmQtc29jLXJ4NTEubwpAQCAtMzYsMyArMzksNCBAQAogb2JqLSQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQM19CRUFHTEUpICs9IHNuZC1zb2Mtb21hcDNiZWFnbGUubwogb2JqLSQoQ09ORklHX1NORF9PTUFQX1NPQ19aT09NMikgKz0gc25kLXNvYy16b29tMi5vCiBvYmotJChDT05GSUdfU05EX09NQVBfU09DX0lHRVAwMDIwKSArPSBzbmQtc29jLWlnZXAwMDIwLm8KK29iai0kKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSSkgKz0gc25kLXNvYy1vbWFwNC1oZG1pLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL2Ftcy1kZWx0YS5jIGIvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKaW5kZXggNDYyY2JjYi4uMzBmZTBkMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKKysrIGIvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKQEAgLTMzMCw3ICszMzAsNyBAQAogCXJldHVybiAwOwogfQogCi0vKiBMaW5lIGRpc2NpcGxpbmUgLnJlY2lldmVfYnVmKCkgKi8KKy8qIExpbmUgZGlzY2lwbGluZSAucmVjZWl2ZV9idWYoKSAqLwogc3RhdGljIHZvaWQgY3g4MTgwMV9yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpCiB7CkBAIC00MjcsNyArNDI3LDggQEAKIAogLyogQm9hcmQgc3BlY2lmaWMgY29kZWMgYmlhcyBsZXZlbCBjb250cm9sICovCiBzdGF0aWMgaW50IGFtc19kZWx0YV9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAotCQkJCQllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKKwkJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAorCQkJCSAgICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjYXJkLT5ydGQtPmNvZGVjOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwLWhkbWkuYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtaGRtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzZlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLWhkbWkuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIG9tYXAtaGRtaS5jCisgKgorICogT01BUCBBTFNBIFNvQyBEQUkgZHJpdmVyIGZvciBIRE1JIGF1ZGlvIG9uIE9NQVA0IHByb2Nlc3NvcnMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqIEF1dGhvcnM6IEpvcmdlIENhbmRlbGFyaWEgPGpvcmdlLmNhbmRlbGFyaWFAdGkuY29tPgorICogICAgICAgICAgUmljYXJkbyBOZXJpIDxyaWNhcmRvLm5lcmlAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgPHBsYXQvZG1hLmg+CisjaW5jbHVkZSAib21hcC1wY20uaCIKKyNpbmNsdWRlICJvbWFwLWhkbWkuaCIKKworI2RlZmluZSBEUlZfTkFNRSAiaGRtaS1hdWRpby1kYWkiCisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9wY21fZG1hX2RhdGEgb21hcF9oZG1pX2RhaV9kbWFfcGFyYW1zID0geworCS5uYW1lID0gIkhETUkgcGxheWJhY2siLAorCS5zeW5jX21vZGUgPSBPTUFQX0RNQV9TWU5DX1BBQ0tFVCwKK307CisKK3N0YXRpYyBpbnQgb21hcF9oZG1pX2RhaV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJaW50IGVycjsKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBwZXJpb2QgYnl0ZXMgYXJlIG11bHRpcGxlIG9mIHRoZSBETUEgcGFja2V0IHNpemUuCisJICogTGFyZ2VzdCBwYWNrZXQgc2l6ZSB3ZSB1c2UgaXMgMzIgMzItYml0IHdvcmRzID0gMTI4IGJ5dGVzCisJICovCisJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAorCQkJCSBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAxMjgpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9oZG1pX2RhaV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJb21hcF9oZG1pX2RhaV9kbWFfcGFyYW1zLnBhY2tldF9zaXplID0gMTY7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCW9tYXBfaGRtaV9kYWlfZG1hX3BhcmFtcy5wYWNrZXRfc2l6ZSA9IDMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCX0KKworCW9tYXBfaGRtaV9kYWlfZG1hX3BhcmFtcy5kYXRhX3R5cGUgPSBPTUFQX0RNQV9EQVRBX1RZUEVfUzMyOworCisJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGRhaSwgc3Vic3RyZWFtLAorCQkJCSAmb21hcF9oZG1pX2RhaV9kbWFfcGFyYW1zKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG9tYXBfaGRtaV9kYWlfb3BzID0geworCS5zdGFydHVwCT0gb21hcF9oZG1pX2RhaV9zdGFydHVwLAorCS5od19wYXJhbXMJPSBvbWFwX2hkbWlfZGFpX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG9tYXBfaGRtaV9kYWkgPSB7CisJLnBsYXliYWNrID0geworCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IE9NQVBfSERNSV9SQVRFUywKKwkJLmZvcm1hdHMgPSBPTUFQX0hETUlfRk9STUFUUywKKwl9LAorCS5vcHMgPSAmb21hcF9oZG1pX2RhaV9vcHMsCit9OworCitzdGF0aWMgX19kZXZpbml0IGludCBvbWFwX2hkbWlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByZXNvdXJjZSAqaGRtaV9yc3JjOworCisJaGRtaV9yc3JjID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIWhkbWlfcnNyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3Qgb2J0YWluIElPUkVTT1VSQ0VfTUVNIEhETUlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvbWFwX2hkbWlfZGFpX2RtYV9wYXJhbXMucG9ydF9hZGRyID0gIGhkbWlfcnNyYy0+c3RhcnQKKwkJKyBPTUFQX0hETUlfQVVESU9fRE1BX1BPUlQ7CisKKwloZG1pX3JzcmMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDApOworCWlmICghaGRtaV9yc3JjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBvYnRhaW4gSU9SRVNPVVJDRV9ETUEgSERNSVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9tYXBfaGRtaV9kYWlfZG1hX3BhcmFtcy5kbWFfcmVxID0gIGhkbWlfcnNyYy0+c3RhcnQ7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2LCAmb21hcF9oZG1pX2RhaSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgb21hcF9oZG1pX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGhkbWlfZGFpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IG9tYXBfaGRtaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aob21hcF9oZG1pX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBoZG1pX2RhaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaGRtaV9kYWlfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGhkbWlfZGFpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgaGRtaV9kYWlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZoZG1pX2RhaV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoaGRtaV9kYWlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkpvcmdlIENhbmRlbGFyaWEgPGpvcmdlLmNhbmRlbGFyaWFAdGkuY29tPiIpOworTU9EVUxFX0FVVEhPUigiUmljYXJkbyBOZXJpIDxyaWNhcmRvLm5lcmlAdGkuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQIEhETUkgU29DIEludGVyZmFjZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVl9OQU1FKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL29tYXAtaGRtaS5oIGIvc291bmQvc29jL29tYXAvb21hcC1oZG1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjMjk4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtaGRtaS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBvbWFwLWhkbWkuaAorICoKKyAqIERlZmluaXRpb25zIGZvciBPTUFQIEFMU0EgU29DIERBSSBkcml2ZXIgZm9yIEhETUkgYXVkaW8gb24gT01BUDQgcHJvY2Vzc29ycy4KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICogQXV0aG9yczogSm9yZ2UgQ2FuZGVsYXJpYSA8am9yZ2UuY2FuZGVsYXJpYUB0aS5jb20+CisgKiAgICAgICAgICBSaWNhcmRvIE5lcmkgPHJpY2FyZG8ubmVyaUB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fT01BUF9IRE1JX0hfXworI2RlZmluZSBfX09NQVBfSERNSV9IX18KKworI2RlZmluZSBPTUFQX0hETUlfQVVESU9fRE1BX1BPUlQgMHg4YworCisjZGVmaW5lIE9NQVBfSERNSV9SQVRFUwkoU05EUlZfUENNX1JBVEVfMzIwMDAgfCBcCisJCQkJU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCkKKworI2RlZmluZSBPTUFQX0hETUlfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBcCisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1wY20uYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtcGNtLmMKaW5kZXggZTZhNmI5OS4uYjJmNTc1MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcC1wY20uYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLXBjbS5jCkBAIC0zNjYsOSArMzY2LDExIEBACiAJfQogfQogCi1zdGF0aWMgaW50IG9tYXBfcGNtX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkgc3RydWN0IHNuZF9wY20gKnBjbSkKK3N0YXRpYyBpbnQgb21hcF9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoIWNhcmQtPmRldi0+ZG1hX21hc2spCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwNC1oZG1pLWNhcmQuYyBiL3NvdW5kL3NvYy9vbWFwL29tYXA0LWhkbWktY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzI2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwNC1oZG1pLWNhcmQuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIG9tYXA0LWhkbWktY2FyZC5jCisgKgorICogT01BUCBBTFNBIFNvQyBtYWNoaW5lIGRyaXZlciBmb3IgVEkgT01BUDQgSERNSQorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICogQXV0aG9yOiBSaWNhcmRvIE5lcmkgPHJpY2FyZG8ubmVyaUB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisKKyNkZWZpbmUgRFJWX05BTUUgIm9tYXA0LWhkbWktYXVkaW8iCisKK3N0YXRpYyBpbnQgb21hcDRfaGRtaV9kYWlfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciA9IE5VTEw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldjsKKworCS8qIEZpbmQgRFNTIEhETUkgZGV2aWNlICovCisJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheV9tYW5hZ2VycygpOyBpKyspIHsKKwkJbWdyID0gb21hcF9kc3NfZ2V0X292ZXJsYXlfbWFuYWdlcihpKTsKKwkJaWYgKG1nciAmJiBtZ3ItPmRldmljZQorCQkJJiYgbWdyLT5kZXZpY2UtPnR5cGUgPT0gT01BUF9ESVNQTEFZX1RZUEVfSERNSSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheV9tYW5hZ2VycygpKSB7CisJCWRldl9lcnIoZGV2LCAiSERNSSBkaXNwbGF5IGRldmljZSBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogTWFrZSBzdXJlIEhETUkgaXMgcG93ZXItb24gdG8gYXZvaWQgTDMgaW50ZXJjb25uZWN0IGVycm9ycyAqLworCWlmIChtZ3ItPmRldmljZS0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpIHsKKwkJZGV2X2VycihkZXYsICJIRE1JIGRpc3BsYXkgaXMgbm90IGFjdGl2ZSFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBvbWFwNF9oZG1pX2RhaV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IG9tYXA0X2hkbWlfZGFpX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBvbWFwNF9oZG1pX2RhaSA9IHsKKwkubmFtZSA9ICJIRE1JIiwKKwkuc3RyZWFtX25hbWUgPSAiSERNSSIsCisJLmNwdV9kYWlfbmFtZSA9ICJoZG1pLWF1ZGlvLWRhaSIsCisJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAorCS5jb2RlY19uYW1lID0gIm9tYXBkc3NfaGRtaSIsCisJLmNvZGVjX2RhaV9uYW1lID0gImhkbWktYXVkaW8tY29kZWMiLAorCS5vcHMgPSAmb21hcDRfaGRtaV9kYWlfb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc25kX3NvY19vbWFwNF9oZG1pID0geworCS5uYW1lID0gIk9NQVA0SERNSSIsCisJLmRhaV9saW5rID0gJm9tYXA0X2hkbWlfZGFpLAorCS5udW1fbGlua3MgPSAxLAorfTsKKworc3RhdGljIF9fZGV2aW5pdCBpbnQgb21hcDRfaGRtaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmc25kX3NvY19vbWFwNF9oZG1pOworCWludCByZXQ7CisKKwljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKGNhcmQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAic25kX3NvY19yZWdpc3Rlcl9jYXJkIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQljYXJkLT5kZXYgPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgb21hcDRfaGRtaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKKwljYXJkLT5kZXYgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwNF9oZG1pX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJvbWFwNC1oZG1pLWF1ZGlvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBvbWFwNF9oZG1pX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChvbWFwNF9oZG1pX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwNF9oZG1pX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwNF9oZG1pX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChvbWFwNF9oZG1pX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcDRfaGRtaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXA0X2hkbWlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG9tYXA0X2hkbWlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJpY2FyZG8gTmVyaSA8cmljYXJkby5uZXJpQHRpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiT01BUDQgSERNSSBtYWNoaW5lIEFTb0MgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWX05BTUUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYwppbmRleCAyY2UwYjJkLi5jNDMwNjAwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYworKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYwpAQCAtODUsOSArODUsMTAgQEAKIAogc3RhdGljIHU2NCBweGEyeHhfcGNtX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCi1zdGF0aWMgaW50IHB4YTJ4eF9zb2NfcGNtX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCXN0cnVjdCBzbmRfcGNtICpwY20pCitzdGF0aWMgaW50IHB4YTJ4eF9zb2NfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogeworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwogCWludCByZXQgPSAwOwogCiAJaWYgKCFjYXJkLT5kZXYtPmRtYV9tYXNrKQpAQCAtOTUsMTQgKzk2LDE0IEBACiAJaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQogCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKIAotCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suY2hhbm5lbHNfbWluKSB7CisJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gcHhhMnh4X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKIAkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGRhaS0+ZHJpdmVyLT5jYXB0dXJlLmNoYW5uZWxzX21pbikgeworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gcHhhMnh4X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKIAkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAJCWlmIChyZXQpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczYwMDAvczYwMDAtcGNtLmMgYi9zb3VuZC9zb2MvczYwMDAvczYwMDAtcGNtLmMKaW5kZXggYWIzY2NhZS4uODBjODVmZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3M2MDAwL3M2MDAwLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9zNjAwMC9zNjAwMC1wY20uYwpAQCAtNDQzLDEwICs0NDMsMTEgQEAKIAogc3RhdGljIHU2NCBzNjAwMF9wY21fZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKLXN0YXRpYyBpbnQgczYwMDBfcGNtX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JCQkgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHN0cnVjdCBzbmRfcGNtICpwY20pCitzdGF0aWMgaW50IHM2MDAwX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBwY20tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydW50aW1lLT5jYXJkLT5zbmRfY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ1bnRpbWUtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ1bnRpbWUtPnBjbTsKIAlzdHJ1Y3QgczYwMDBfcGNtX2RtYV9wYXJhbXMgKnBhcmFtczsKIAlpbnQgcmVzOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnIGIvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZwppbmRleCBkMTU1Y2JiLi41NGIwZTRiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcKQEAgLTE1OCw3ICsxNTgsNyBAQAogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX1NNREtfU1BESUYKIAl0cmlzdGF0ZSAiU29DIFMvUERJRiBBdWRpbyBzdXBwb3J0IGZvciBTTURLIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIChNQUNIX1NNREtDMTAwIHx8IE1BQ0hfU01ES0MxMTAgfHwgTUFDSF9TTURLVjIxMCkKKwlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiAoTUFDSF9TTURLQzEwMCB8fCBNQUNIX1NNREtDMTEwIHx8IE1BQ0hfU01ES1YyMTAgfHwgTUFDSF9TTURLVjMxMCkKIAlzZWxlY3QgU05EX1NBTVNVTkdfU1BESUYKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIFMvUERJRiBhdWRpbyBvbiB0aGUgU01ESy4KQEAgLTE3MSw5ICsxNzEsMjMgQEAKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIHRoZSBTTURLLgogCitjb25maWcgU05EX1NPQ19TTURLX1dNODk5NF9QQ00KKwl0cmlzdGF0ZSAiU29DIFBDTSBBdWRpbyBzdXBwb3J0IGZvciBXTTg5OTQgb24gU01ESyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiAoTUFDSF9TTURLQzIxMCB8fCBNQUNIX1NNREtWMzEwKQorCXNlbGVjdCBTTkRfU09DX1dNODk5NAorCXNlbGVjdCBTTkRfU0FNU1VOR19QQ00KKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIHRoZSBTTURLCisKIGNvbmZpZyBTTkRfU09DX1NQRVlTSURFCiAJdHJpc3RhdGUgIkF1ZGlvIHN1cHBvcnQgZm9yIFdvbGZzb24gU3BleXNpZGUiCiAJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgTUFDSF9XTEZfQ1JBR0dfNjQxMAogCXNlbGVjdCBTTkRfU0FNU1VOR19JMlMKIAlzZWxlY3QgU05EX1NPQ19XTTg5MTUKIAlzZWxlY3QgU05EX1NPQ19XTTkwODEKKworY29uZmlnIFNORF9TT0NfU1BFWVNJREVfV004OTYyCisJdHJpc3RhdGUgIkF1ZGlvIHN1cHBvcnQgZm9yIFdvbGZzb24gU3BleXNpZGUgd2l0aCBXTTg5NjIiCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgTUFDSF9XTEZfQ1JBR0dfNjQxMAorCXNlbGVjdCBTTkRfU0FNU1VOR19JMlMKKwlzZWxlY3QgU05EX1NPQ19XTTg5NjIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL01ha2VmaWxlIGIvc291bmQvc29jL3NhbXN1bmcvTWFrZWZpbGUKaW5kZXggNjgzODQzYS4uOWViM2IxMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL3NhbXN1bmcvTWFrZWZpbGUKQEAgLTM1LDcgKzM1LDkgQEAKIHNuZC1zb2MtZ29uaS13bTg5OTQtb2JqcyA6PSBnb25pX3dtODk5NC5vCiBzbmQtc29jLXNtZGstc3BkaWYtb2JqcyA6PSBzbWRrX3NwZGlmLm8KIHNuZC1zb2Mtc21kay13bTg1ODBwY20tb2JqcyA6PSBzbWRrX3dtODU4MHBjbS5vCitzbmQtc29jLXNtZGstd204OTk0cGNtLW9ianMgOj0gc21ka193bTg5OTRwY20ubwogc25kLXNvYy1zcGV5c2lkZS1vYmpzIDo9IHNwZXlzaWRlLm8KK3NuZC1zb2Mtc3BleXNpZGUtd204OTYyLW9ianMgOj0gc3BleXNpZGVfd204OTYyLm8KIAogb2JqLSQoQ09ORklHX1NORF9TT0NfU0FNU1VOR19KSVZFX1dNODc1MCkgKz0gc25kLXNvYy1qaXZlLXdtODc1MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TQU1TVU5HX05FTzE5NzNfV004NzUzKSArPSBzbmQtc29jLW5lbzE5NzMtd204NzUzLm8KQEAgLTU0LDQgKzU2LDYgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1NBTVNVTkdfU01ES19TUERJRikgKz0gc25kLXNvYy1zbWRrLXNwZGlmLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0dPTklfQVFVSUxBX1dNODk5NCkgKz0gc25kLXNvYy1nb25pLXdtODk5NC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TTURLX1dNODU4MF9QQ00pICs9IHNuZC1zb2Mtc21kay13bTg1ODBwY20ubworb2JqLSQoQ09ORklHX1NORF9TT0NfU01ES19XTTg5OTRfUENNKSArPSBzbmQtc29jLXNtZGstd204OTk0cGNtLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1NQRVlTSURFKSArPSBzbmQtc29jLXNwZXlzaWRlLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NQRVlTSURFX1dNODk2MikgKz0gc25kLXNvYy1zcGV5c2lkZS13bTg5NjIubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvZG1hLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuYwppbmRleCA1Y2IzYjg4Li45NDY1NTg4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuYwpAQCAtNDI1LDkgKzQyNSwxMSBAQAogCiBzdGF0aWMgdTY0IGRtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKIAotc3RhdGljIGludCBkbWFfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgc3RydWN0IHNuZF9wY20gKnBjbSkKK3N0YXRpYyBpbnQgZG1hX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogeworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwogCWludCByZXQgPSAwOwogCiAJcHJfZGVidWcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL2kycy1yZWdzLmggYi9zb3VuZC9zb2Mvc2Ftc3VuZy9pMnMtcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZTZkOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9pMnMtcmVncy5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogbGludXgvc291bmQvc29jL3NhbXN1bmcvaTJzLXJlZ3MuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBTYW1zdW5nIEkyUyBkcml2ZXIncyByZWdpc3RlciBoZWFkZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19TTkRfU09DX1NBTVNVTkdfSTJTX1JFR1NfSAorI2RlZmluZSBfX1NORF9TT0NfU0FNU1VOR19JMlNfUkVHU19ICisKKyNkZWZpbmUgSTJTQ09OCQkweDAKKyNkZWZpbmUgSTJTTU9ECQkweDQKKyNkZWZpbmUgSTJTRklDCQkweDgKKyNkZWZpbmUgSTJTUFNSCQkweGMKKyNkZWZpbmUgSTJTVFhECQkweDEwCisjZGVmaW5lIEkyU1JYRAkJMHgxNAorI2RlZmluZSBJMlNGSUNTCQkweDE4CisjZGVmaW5lIEkyU1RYRFMJCTB4MWMKKyNkZWZpbmUgSTJTQUhCCQkweDIwCisjZGVmaW5lIEkyU1NUUjAJCTB4MjQKKyNkZWZpbmUgSTJTU0laRQkJMHgyOAorI2RlZmluZSBJMlNUUk5DTlQJMHgyYworI2RlZmluZSBJMlNMVkwwQUREUgkweDMwCisjZGVmaW5lIEkyU0xWTDFBRERSCTB4MzQKKyNkZWZpbmUgSTJTTFZMMkFERFIJMHgzOAorI2RlZmluZSBJMlNMVkwzQUREUgkweDNjCisKKyNkZWZpbmUgQ09OX1JTVENMUgkJKDEgPDwgMzEpCisjZGVmaW5lIENPTl9GUlhPRlNUQVRVUwkJKDEgPDwgMjYpCisjZGVmaW5lIENPTl9GUlhPUklOVEVOCQkoMSA8PCAyNSkKKyNkZWZpbmUgQ09OX0ZUWFNVUlNUQVQJCSgxIDw8IDI0KQorI2RlZmluZSBDT05fRlRYU1VSSU5URU4JCSgxIDw8IDIzKQorI2RlZmluZSBDT05fVFhTRE1BX1BBVVNFCSgxIDw8IDIwKQorI2RlZmluZSBDT05fVFhTRE1BX0FDVElWRQkoMSA8PCAxOCkKKworI2RlZmluZSBDT05fRlRYVVJTVEFUVVMJCSgxIDw8IDE3KQorI2RlZmluZSBDT05fRlRYVVJJTlRFTgkJKDEgPDwgMTYpCisjZGVmaW5lIENPTl9UWEZJRk8yX0VNUFRZCSgxIDw8IDE1KQorI2RlZmluZSBDT05fVFhGSUZPMV9FTVBUWQkoMSA8PCAxNCkKKyNkZWZpbmUgQ09OX1RYRklGTzJfRlVMTAkoMSA8PCAxMykKKyNkZWZpbmUgQ09OX1RYRklGTzFfRlVMTAkoMSA8PCAxMikKKworI2RlZmluZSBDT05fTFJJTkRFWAkJKDEgPDwgMTEpCisjZGVmaW5lIENPTl9UWEZJRk9fRU1QVFkJKDEgPDwgMTApCisjZGVmaW5lIENPTl9SWEZJRk9fRU1QVFkJKDEgPDwgOSkKKyNkZWZpbmUgQ09OX1RYRklGT19GVUxMCQkoMSA8PCA4KQorI2RlZmluZSBDT05fUlhGSUZPX0ZVTEwJCSgxIDw8IDcpCisjZGVmaW5lIENPTl9UWERNQV9QQVVTRQkJKDEgPDwgNikKKyNkZWZpbmUgQ09OX1JYRE1BX1BBVVNFCQkoMSA8PCA1KQorI2RlZmluZSBDT05fVFhDSF9QQVVTRQkJKDEgPDwgNCkKKyNkZWZpbmUgQ09OX1JYQ0hfUEFVU0UJCSgxIDw8IDMpCisjZGVmaW5lIENPTl9UWERNQV9BQ1RJVkUJKDEgPDwgMikKKyNkZWZpbmUgQ09OX1JYRE1BX0FDVElWRQkoMSA8PCAxKQorI2RlZmluZSBDT05fQUNUSVZFCQkoMSA8PCAwKQorCisjZGVmaW5lIE1PRF9PUENMS19DRENMS19PVVQJKDAgPDwgMzApCisjZGVmaW5lIE1PRF9PUENMS19DRENMS19JTgkoMSA8PCAzMCkKKyNkZWZpbmUgTU9EX09QQ0xLX0JDTEtfT1VUCSgyIDw8IDMwKQorI2RlZmluZSBNT0RfT1BDTEtfUENMSwkJKDMgPDwgMzApCisjZGVmaW5lIE1PRF9PUENMS19NQVNLCQkoMyA8PCAzMCkKKyNkZWZpbmUgTU9EX1RYU19JRE1BCQkoMSA8PCAyOCkgLyogU2VjX1RYRklGTyB1c2UgSS1ETUEgKi8KKworI2RlZmluZSBNT0RfQkxDU19TSElGVAkJMjYKKyNkZWZpbmUgTU9EX0JMQ1NfMTZCSVQJCSgwIDw8IE1PRF9CTENTX1NISUZUKQorI2RlZmluZSBNT0RfQkxDU184QklUCQkoMSA8PCBNT0RfQkxDU19TSElGVCkKKyNkZWZpbmUgTU9EX0JMQ1NfMjRCSVQJCSgyIDw8IE1PRF9CTENTX1NISUZUKQorI2RlZmluZSBNT0RfQkxDU19NQVNLCQkoMyA8PCBNT0RfQkxDU19TSElGVCkKKyNkZWZpbmUgTU9EX0JMQ1BfU0hJRlQJCTI0CisjZGVmaW5lIE1PRF9CTENQXzE2QklUCQkoMCA8PCBNT0RfQkxDUF9TSElGVCkKKyNkZWZpbmUgTU9EX0JMQ1BfOEJJVAkJKDEgPDwgTU9EX0JMQ1BfU0hJRlQpCisjZGVmaW5lIE1PRF9CTENQXzI0QklUCQkoMiA8PCBNT0RfQkxDUF9TSElGVCkKKyNkZWZpbmUgTU9EX0JMQ1BfTUFTSwkJKDMgPDwgTU9EX0JMQ1BfU0hJRlQpCisKKyNkZWZpbmUgTU9EX0MyRERfSEhBTEYJCSgxIDw8IDIxKSAvKiBEaXNjYXJkIEhpZ2hlci1oYWxmICovCisjZGVmaW5lIE1PRF9DMkREX0xIQUxGCQkoMSA8PCAyMCkgLyogRGlzY2FyZCBMb3dlci1oYWxmICovCisjZGVmaW5lIE1PRF9DMUREX0hIQUxGCQkoMSA8PCAxOSkKKyNkZWZpbmUgTU9EX0MxRERfTEhBTEYJCSgxIDw8IDE4KQorI2RlZmluZSBNT0RfREMyX0VOCQkoMSA8PCAxNykKKyNkZWZpbmUgTU9EX0RDMV9FTgkJKDEgPDwgMTYpCisjZGVmaW5lIE1PRF9CTENfMTZCSVQJCSgwIDw8IDEzKQorI2RlZmluZSBNT0RfQkxDXzhCSVQJCSgxIDw8IDEzKQorI2RlZmluZSBNT0RfQkxDXzI0QklUCQkoMiA8PCAxMykKKyNkZWZpbmUgTU9EX0JMQ19NQVNLCQkoMyA8PCAxMykKKworI2RlZmluZSBNT0RfSU1TX1NZU01VWAkJKDEgPDwgMTApCisjZGVmaW5lIE1PRF9TTEFWRQkJKDEgPDwgMTEpCisjZGVmaW5lIE1PRF9UWE9OTFkJCSgwIDw8IDgpCisjZGVmaW5lIE1PRF9SWE9OTFkJCSgxIDw8IDgpCisjZGVmaW5lIE1PRF9UWFJYCQkoMiA8PCA4KQorI2RlZmluZSBNT0RfTUFTSwkJKDMgPDwgOCkKKyNkZWZpbmUgTU9EX0xSX0xMT1cJCSgwIDw8IDcpCisjZGVmaW5lIE1PRF9MUl9STE9XCQkoMSA8PCA3KQorI2RlZmluZSBNT0RfU0RGX0lJUwkJKDAgPDwgNSkKKyNkZWZpbmUgTU9EX1NERl9NU0IJCSgxIDw8IDUpCisjZGVmaW5lIE1PRF9TREZfTFNCCQkoMiA8PCA1KQorI2RlZmluZSBNT0RfU0RGX01BU0sJCSgzIDw8IDUpCisjZGVmaW5lIE1PRF9SQ0xLXzI1NkZTCQkoMCA8PCAzKQorI2RlZmluZSBNT0RfUkNMS181MTJGUwkJKDEgPDwgMykKKyNkZWZpbmUgTU9EX1JDTEtfMzg0RlMJCSgyIDw8IDMpCisjZGVmaW5lIE1PRF9SQ0xLXzc2OEZTCQkoMyA8PCAzKQorI2RlZmluZSBNT0RfUkNMS19NQVNLCQkoMyA8PCAzKQorI2RlZmluZSBNT0RfQkNMS18zMkZTCQkoMCA8PCAxKQorI2RlZmluZSBNT0RfQkNMS180OEZTCQkoMSA8PCAxKQorI2RlZmluZSBNT0RfQkNMS18xNkZTCQkoMiA8PCAxKQorI2RlZmluZSBNT0RfQkNMS18yNEZTCQkoMyA8PCAxKQorI2RlZmluZSBNT0RfQkNMS19NQVNLCQkoMyA8PCAxKQorI2RlZmluZSBNT0RfOEJJVAkJKDEgPDwgMCkKKworI2RlZmluZSBNT0RfQ0RDTEtDT04JCSgxIDw8IDEyKQorCisjZGVmaW5lIFBTUl9QU1JFTgkJKDEgPDwgMTUpCisKKyNkZWZpbmUgRklDX1RYMkNPVU5UKHgpCQkoKCh4KSA+PiAgMjQpICYgMHhmKQorI2RlZmluZSBGSUNfVFgxQ09VTlQoeCkJCSgoKHgpID4+ICAxNikgJiAweGYpCisKKyNkZWZpbmUgRklDX1RYRkxVU0gJCSgxIDw8IDE1KQorI2RlZmluZSBGSUNfUlhGTFVTSAkJKDEgPDwgNykKKworI2RlZmluZSBGSUNfVFhDT1VOVCh4KQkJKCgoeCkgPj4gIDgpICYgMHhmKQorI2RlZmluZSBGSUNfUlhDT1VOVCh4KQkJKCgoeCkgPj4gIDApICYgMHhmKQorI2RlZmluZSBGSUNTX1RYQ09VTlQoeCkJCSgoKHgpID4+ICA4KSAmIDB4N2YpCisKKyNkZWZpbmUgQUhCX0lOVEVOTFZMMAkJKDEgPDwgMjQpCisjZGVmaW5lIEFIQl9MVkwwSU5UCQkoMSA8PCAyMCkKKyNkZWZpbmUgQUhCX0NMUkxWTDBJTlQJCSgxIDw8IDE2KQorI2RlZmluZSBBSEJfRE1BUkxECQkoMSA8PCA1KQorI2RlZmluZSBBSEJfSU5UTUFTSwkJKDEgPDwgMykKKyNkZWZpbmUgQUhCX0RNQUVOCQkoMSA8PCAwKQorI2RlZmluZSBBSEJfTFZMSU5UTUFTSwkJKDB4ZiA8PCAyMCkKKworI2RlZmluZSBJMlNTSVpFX1RSTk1TSwkJKDB4ZmZmZikKKyNkZWZpbmUgSTJTU0laRV9TSElGVAkJKDE2KQorCisjZW5kaWYgLyogX19TTkRfU09DX1NBTVNVTkdfSTJTX1JFR1NfSCAqLworCisKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jIGIvc291bmQvc29jL3NhbXN1bmcvaTJzLmMKaW5kZXggZmZhMDliMy4uMTU2OGVlYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvaTJzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvaTJzLmMKQEAgLTIyLDEwOSArMjIsNyBAQAogCiAjaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAiaTJzLmgiCi0KLSNkZWZpbmUgSTJTQ09OCQkweDAKLSNkZWZpbmUgSTJTTU9ECQkweDQKLSNkZWZpbmUgSTJTRklDCQkweDgKLSNkZWZpbmUgSTJTUFNSCQkweGMKLSNkZWZpbmUgSTJTVFhECQkweDEwCi0jZGVmaW5lIEkyU1JYRAkJMHgxNAotI2RlZmluZSBJMlNGSUNTCQkweDE4Ci0jZGVmaW5lIEkyU1RYRFMJCTB4MWMKLQotI2RlZmluZSBDT05fUlNUQ0xSCQkoMSA8PCAzMSkKLSNkZWZpbmUgQ09OX0ZSWE9GU1RBVFVTCQkoMSA8PCAyNikKLSNkZWZpbmUgQ09OX0ZSWE9SSU5URU4JCSgxIDw8IDI1KQotI2RlZmluZSBDT05fRlRYU1VSU1RBVAkJKDEgPDwgMjQpCi0jZGVmaW5lIENPTl9GVFhTVVJJTlRFTgkJKDEgPDwgMjMpCi0jZGVmaW5lIENPTl9UWFNETUFfUEFVU0UJKDEgPDwgMjApCi0jZGVmaW5lIENPTl9UWFNETUFfQUNUSVZFCSgxIDw8IDE4KQotCi0jZGVmaW5lIENPTl9GVFhVUlNUQVRVUwkJKDEgPDwgMTcpCi0jZGVmaW5lIENPTl9GVFhVUklOVEVOCQkoMSA8PCAxNikKLSNkZWZpbmUgQ09OX1RYRklGTzJfRU1QVFkJKDEgPDwgMTUpCi0jZGVmaW5lIENPTl9UWEZJRk8xX0VNUFRZCSgxIDw8IDE0KQotI2RlZmluZSBDT05fVFhGSUZPMl9GVUxMCSgxIDw8IDEzKQotI2RlZmluZSBDT05fVFhGSUZPMV9GVUxMCSgxIDw8IDEyKQotCi0jZGVmaW5lIENPTl9MUklOREVYCQkoMSA8PCAxMSkKLSNkZWZpbmUgQ09OX1RYRklGT19FTVBUWQkoMSA8PCAxMCkKLSNkZWZpbmUgQ09OX1JYRklGT19FTVBUWQkoMSA8PCA5KQotI2RlZmluZSBDT05fVFhGSUZPX0ZVTEwJCSgxIDw8IDgpCi0jZGVmaW5lIENPTl9SWEZJRk9fRlVMTAkJKDEgPDwgNykKLSNkZWZpbmUgQ09OX1RYRE1BX1BBVVNFCQkoMSA8PCA2KQotI2RlZmluZSBDT05fUlhETUFfUEFVU0UJCSgxIDw8IDUpCi0jZGVmaW5lIENPTl9UWENIX1BBVVNFCQkoMSA8PCA0KQotI2RlZmluZSBDT05fUlhDSF9QQVVTRQkJKDEgPDwgMykKLSNkZWZpbmUgQ09OX1RYRE1BX0FDVElWRQkoMSA8PCAyKQotI2RlZmluZSBDT05fUlhETUFfQUNUSVZFCSgxIDw8IDEpCi0jZGVmaW5lIENPTl9BQ1RJVkUJCSgxIDw8IDApCi0KLSNkZWZpbmUgTU9EX09QQ0xLX0NEQ0xLX09VVAkoMCA8PCAzMCkKLSNkZWZpbmUgTU9EX09QQ0xLX0NEQ0xLX0lOCSgxIDw8IDMwKQotI2RlZmluZSBNT0RfT1BDTEtfQkNMS19PVVQJKDIgPDwgMzApCi0jZGVmaW5lIE1PRF9PUENMS19QQ0xLCQkoMyA8PCAzMCkKLSNkZWZpbmUgTU9EX09QQ0xLX01BU0sJCSgzIDw8IDMwKQotI2RlZmluZSBNT0RfVFhTX0lETUEJCSgxIDw8IDI4KSAvKiBTZWNfVFhGSUZPIHVzZSBJLURNQSAqLwotCi0jZGVmaW5lIE1PRF9CTENTX1NISUZUCTI2Ci0jZGVmaW5lIE1PRF9CTENTXzE2QklUCSgwIDw8IE1PRF9CTENTX1NISUZUKQotI2RlZmluZSBNT0RfQkxDU184QklUCSgxIDw8IE1PRF9CTENTX1NISUZUKQotI2RlZmluZSBNT0RfQkxDU18yNEJJVAkoMiA8PCBNT0RfQkxDU19TSElGVCkKLSNkZWZpbmUgTU9EX0JMQ1NfTUFTSwkoMyA8PCBNT0RfQkxDU19TSElGVCkKLSNkZWZpbmUgTU9EX0JMQ1BfU0hJRlQJMjQKLSNkZWZpbmUgTU9EX0JMQ1BfMTZCSVQJKDAgPDwgTU9EX0JMQ1BfU0hJRlQpCi0jZGVmaW5lIE1PRF9CTENQXzhCSVQJKDEgPDwgTU9EX0JMQ1BfU0hJRlQpCi0jZGVmaW5lIE1PRF9CTENQXzI0QklUCSgyIDw8IE1PRF9CTENQX1NISUZUKQotI2RlZmluZSBNT0RfQkxDUF9NQVNLCSgzIDw8IE1PRF9CTENQX1NISUZUKQotCi0jZGVmaW5lIE1PRF9DMkREX0hIQUxGCQkoMSA8PCAyMSkgLyogRGlzY2FyZCBIaWdoZXItaGFsZiAqLwotI2RlZmluZSBNT0RfQzJERF9MSEFMRgkJKDEgPDwgMjApIC8qIERpc2NhcmQgTG93ZXItaGFsZiAqLwotI2RlZmluZSBNT0RfQzFERF9ISEFMRgkJKDEgPDwgMTkpCi0jZGVmaW5lIE1PRF9DMUREX0xIQUxGCQkoMSA8PCAxOCkKLSNkZWZpbmUgTU9EX0RDMl9FTgkJKDEgPDwgMTcpCi0jZGVmaW5lIE1PRF9EQzFfRU4JCSgxIDw8IDE2KQotI2RlZmluZSBNT0RfQkxDXzE2QklUCQkoMCA8PCAxMykKLSNkZWZpbmUgTU9EX0JMQ184QklUCQkoMSA8PCAxMykKLSNkZWZpbmUgTU9EX0JMQ18yNEJJVAkJKDIgPDwgMTMpCi0jZGVmaW5lIE1PRF9CTENfTUFTSwkJKDMgPDwgMTMpCi0KLSNkZWZpbmUgTU9EX0lNU19TWVNNVVgJCSgxIDw8IDEwKQotI2RlZmluZSBNT0RfU0xBVkUJCSgxIDw8IDExKQotI2RlZmluZSBNT0RfVFhPTkxZCQkoMCA8PCA4KQotI2RlZmluZSBNT0RfUlhPTkxZCQkoMSA8PCA4KQotI2RlZmluZSBNT0RfVFhSWAkJKDIgPDwgOCkKLSNkZWZpbmUgTU9EX01BU0sJCSgzIDw8IDgpCi0jZGVmaW5lIE1PRF9MUl9MTE9XCQkoMCA8PCA3KQotI2RlZmluZSBNT0RfTFJfUkxPVwkJKDEgPDwgNykKLSNkZWZpbmUgTU9EX1NERl9JSVMJCSgwIDw8IDUpCi0jZGVmaW5lIE1PRF9TREZfTVNCCQkoMSA8PCA1KQotI2RlZmluZSBNT0RfU0RGX0xTQgkJKDIgPDwgNSkKLSNkZWZpbmUgTU9EX1NERl9NQVNLCQkoMyA8PCA1KQotI2RlZmluZSBNT0RfUkNMS18yNTZGUwkJKDAgPDwgMykKLSNkZWZpbmUgTU9EX1JDTEtfNTEyRlMJCSgxIDw8IDMpCi0jZGVmaW5lIE1PRF9SQ0xLXzM4NEZTCQkoMiA8PCAzKQotI2RlZmluZSBNT0RfUkNMS183NjhGUwkJKDMgPDwgMykKLSNkZWZpbmUgTU9EX1JDTEtfTUFTSwkJKDMgPDwgMykKLSNkZWZpbmUgTU9EX0JDTEtfMzJGUwkJKDAgPDwgMSkKLSNkZWZpbmUgTU9EX0JDTEtfNDhGUwkJKDEgPDwgMSkKLSNkZWZpbmUgTU9EX0JDTEtfMTZGUwkJKDIgPDwgMSkKLSNkZWZpbmUgTU9EX0JDTEtfMjRGUwkJKDMgPDwgMSkKLSNkZWZpbmUgTU9EX0JDTEtfTUFTSwkJKDMgPDwgMSkKLSNkZWZpbmUgTU9EXzhCSVQJCSgxIDw8IDApCi0KLSNkZWZpbmUgTU9EX0NEQ0xLQ09OCQkoMSA8PCAxMikKLQotI2RlZmluZSBQU1JfUFNSRU4JCSgxIDw8IDE1KQotCi0jZGVmaW5lIEZJQ19UWDJDT1VOVCh4KQkJKCgoeCkgPj4gIDI0KSAmIDB4ZikKLSNkZWZpbmUgRklDX1RYMUNPVU5UKHgpCQkoKCh4KSA+PiAgMTYpICYgMHhmKQotCi0jZGVmaW5lIEZJQ19UWEZMVVNICQkoMSA8PCAxNSkKLSNkZWZpbmUgRklDX1JYRkxVU0gJCSgxIDw8IDcpCi0jZGVmaW5lIEZJQ19UWENPVU5UKHgpCQkoKCh4KSA+PiAgOCkgJiAweGYpCi0jZGVmaW5lIEZJQ19SWENPVU5UKHgpCQkoKCh4KSA+PiAgMCkgJiAweGYpCi0jZGVmaW5lIEZJQ1NfVFhDT1VOVCh4KQkJKCgoeCkgPj4gIDgpICYgMHg3ZikKKyNpbmNsdWRlICJpMnMtcmVncy5oIgogCiAjZGVmaW5lIG1zZWNzX3RvX2xvb3BzKHQpIChsb29wc19wZXJfamlmZnkgLyAxMDAwICogSFogKiB0KQogCkBAIC0xOTEsNyArODksNyBAQAogCWlmICghaTJzKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlhY3RpdmUgPSByZWFkbChpMnMtPmFkZHIgKyBJMlNNT0QpOworCWFjdGl2ZSA9IHJlYWRsKGkycy0+YWRkciArIEkyU0NPTik7CiAKIAlpZiAoaXNfc2Vjb25kYXJ5KGkycykpCiAJCWFjdGl2ZSAmPSBDT05fVFhTRE1BX0FDVElWRTsKQEAgLTIyMyw3ICsxMjEsNyBAQAogCWlmICghaTJzKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlhY3RpdmUgPSByZWFkbChpMnMtPmFkZHIgKyBJMlNNT0QpICYgQ09OX1JYRE1BX0FDVElWRTsKKwlhY3RpdmUgPSByZWFkbChpMnMtPmFkZHIgKyBJMlNDT04pICYgQ09OX1JYRE1BX0FDVElWRTsKIAogCXJldHVybiBhY3RpdmUgPyB0cnVlIDogZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NC5jIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYwppbmRleCBlN2MxMDA5Li40NWZiZTJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMKQEAgLTgsNiArOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg5OTQuaCIKKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAKICAvKgogICAqIERlZmF1bHQgQ0ZHIHN3aXRjaCBzZXR0aW5ncyB0byB1c2UgdGhpcyBkcml2ZXI6CkBAIC00NCw3ICs0NSw5IEBACiAJaW50IHJldDsKIAogCS8qIEFJRjFDTEsgc2hvdWxkIGJlID49M01IeiBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZSAqLwotCWlmIChwYXJhbXNfcmF0ZShwYXJhbXMpID09IDgwMDAgfHwgcGFyYW1zX3JhdGUocGFyYW1zKSA9PSAxMTAyNSkKKwlpZiAocGFyYW1zX2Zvcm1hdChwYXJhbXMpID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKQorCQlwbGxfb3V0ID0gcGFyYW1zX3JhdGUocGFyYW1zKSAqIDM4NDsKKwllbHNlIGlmIChwYXJhbXNfcmF0ZShwYXJhbXMpID09IDgwMDAgfHwgcGFyYW1zX3JhdGUocGFyYW1zKSA9PSAxMTAyNSkKIAkJcGxsX291dCA9IHBhcmFtc19yYXRlKHBhcmFtcykgKiA1MTI7CiAJZWxzZQogCQlwbGxfb3V0ID0gcGFyYW1zX3JhdGUocGFyYW1zKSAqIDI1NjsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0cGNtLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NHBjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjExMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NHBjbS5jCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogIHNvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0cGNtLmMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yICBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorCisjaW5jbHVkZSAiLi4vY29kZWNzL3dtODk5NC5oIgorI2luY2x1ZGUgImRtYS5oIgorI2luY2x1ZGUgInBjbS5oIgorCisvKgorICogQm9hcmQgU2V0dGluZ3M6CisgKiAgbyAnMScgbWVhbnMgJ09OJworICogIG8gJzAnIG1lYW5zICdPRkYnCisgKiAgbyAnWCcgbWVhbnMgJ0Rvbid0IGNhcmUnCisgKgorICogU01ES0MyMTAsIFNNREtWMzEwOiBDRkczLSAxMDAxLCBDRkc1LTEwMDAsIENGRzctMTExMTExCisgKi8KKworLyoKKyAqIENvbmZpZ3VyZSBhdWRpbyByb3V0ZSBhcyA6LQorICogJCBhbWl4ZXIgc3NldCAnREFDMScgb24sb24KKyAqICQgYW1peGVyIHNzZXQgJ1JpZ2h0IEhlYWRwaG9uZSBNdXgnICdEQUMnCisgKiAkIGFtaXhlciBzc2V0ICdMZWZ0IEhlYWRwaG9uZSBNdXgnICdEQUMnCisgKiAkIGFtaXhlciBzc2V0ICdEQUMxUiBNaXhlciBBSUYxLjEnIG9uCisgKiAkIGFtaXhlciBzc2V0ICdEQUMxTCBNaXhlciBBSUYxLjEnIG9uCisgKiAkIGFtaXhlciBzc2V0ICdJTjJMJyBvbgorICogJCBhbWl4ZXIgc3NldCAnSU4yTCBQR0EgSU4yTE4nIG9uCisgKiAkIGFtaXhlciBzc2V0ICdNSVhJTkwgSU4yTCcgb24KKyAqICQgYW1peGVyIHNzZXQgJ0FJRjFBREMxTCBNaXhlciBBREMvRE1JQycgb24KKyAqICQgYW1peGVyIHNzZXQgJ0lOMlInIG9uCisgKiAkIGFtaXhlciBzc2V0ICdJTjJSIFBHQSBJTjJSTicgb24KKyAqICQgYW1peGVyIHNzZXQgJ01JWElOUiBJTjJSJyBvbgorICogJCBhbWl4ZXIgc3NldCAnQUlGMUFEQzFSIE1peGVyIEFEQy9ETUlDJyBvbgorICovCisKKy8qIFNNREsgaGFzIGEgMTYuOTM0NE1IWiBjcnlzdGFsIGF0dGFjaGVkIHRvIFdNODk5NCAqLworI2RlZmluZSBTTURLX1dNODk5NF9GUkVRIDE2OTM0NDAwCisKK3N0YXRpYyBpbnQgc21ka193bTg5OTRfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwl1bnNpZ25lZCBsb25nIG1jbGtfZnJlcTsKKwlpbnQgcmZzLCByZXQ7CisKKwlzd2l0Y2gocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWNhc2UgODAwMDoKKwkJcmZzID0gNTEyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNwdV9kYWktPmRldiwgIiVzOiVkIFNhbXBsaW5nIFJhdGUgJXUgbm90IHN1cHBvcnRlZCFcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1jbGtfZnJlcSA9IHBhcmFtc19yYXRlKHBhcmFtcykgKiByZnM7CisKKwkvKiBTZXQgdGhlIGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksIFNORF9TT0NfREFJRk1UX0RTUF9CCisJCQkJfCBTTkRfU09DX0RBSUZNVF9JQl9ORgorCQkJCXwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgdGhlIGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgU05EX1NPQ19EQUlGTVRfRFNQX0IKKwkJCQl8IFNORF9TT0NfREFJRk1UX0lCX05GCisJCQkJfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBXTTg5OTRfU1lTQ0xLX0ZMTDEsCisJCQkJCW1jbGtfZnJlcSwgU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgV004OTk0X0ZMTDEsIFdNODk5NF9GTExfU1JDX01DTEsxLAorCQkJCQlTTURLX1dNODk5NF9GUkVRLCBtY2xrX2ZyZXEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IFBDTSBzb3VyY2UgY2xvY2sgb24gQ1BVICovCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhjcHVfZGFpLCBTM0NfUENNX0NMS1NSQ19NVVgsCisJCQkJCW1jbGtfZnJlcSwgU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgU0NMS19ESVYgZm9yIG1ha2luZyBiY2xrICovCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X2Nsa2RpdihjcHVfZGFpLCBTM0NfUENNX1NDTEtfUEVSX0ZTLCByZnMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgc21ka193bTg5OTRfcGNtX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gc21ka193bTg5OTRfcGNtX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBzbWRrX2RhaVtdID0geworCXsKKwkJLm5hbWUgPSAiV004OTk0IFBBSUYgUENNIiwKKwkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgUENNIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJzYW1zdW5nLXBjbS4wIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIndtODk5NC1haWYxIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAic2Ftc3VuZy1hdWRpbyIsCisJCS5jb2RlY19uYW1lID0gIndtODk5NC1jb2RlYyIsCisJCS5vcHMgPSAmc21ka193bTg5OTRfcGNtX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc21ka19wY20gPSB7CisJLm5hbWUgPSAiU01ESy1QQ00iLAorCS5kYWlfbGluayA9IHNtZGtfZGFpLAorCS5udW1fbGlua3MgPSAxLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3NtZGtfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKworCXNtZGtfcGNtLmRldiA9ICZwZGV2LT5kZXY7CisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZzbWRrX3BjbSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmRfc21ka19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZCgmc21ka19wY20pOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRfc21ka19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5uYW1lID0gInNhbXN1bmctc21kay1wY20iLAorCX0sCisJLnByb2JlID0gc25kX3NtZGtfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9zbWRrX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzbWRrX2F1ZGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzbmRfc21ka19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzbWRrX2F1ZGlvX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc21ka19hdWRpb19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuZF9zbWRrX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KHNtZGtfYXVkaW9fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlNhbmdiZW9tIEtpbSwgPHNia2ltNzNAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIFNNREsgV004OTk0IGZvciBQQ00iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGV5c2lkZS5jCmluZGV4IDM2MGEzMzMuLmQ2ZGVlNGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc3BleXNpZGUuYwpAQCAtMjAsMjQgKzIwLDI5IEBACiAjZGVmaW5lIFdNODkxNV9IUFNFTF9HUElPIDIxNAogCiBzdGF0aWMgaW50IHNwZXlzaWRlX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCisJCQkJICAgc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCQkJCSAgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gY2FyZC0+cnRkWzBdLmNvZGVjX2RhaTsKIAlpbnQgcmV0OwogCisJaWYgKGRhcG0tPmRldiAhPSBjb2RlY19kYWktPmRldikKKwkJcmV0dXJuIDA7CisKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFdNODkxNV9TWVNDTEtfTUNMSzEsCisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBXTTg5MTVfU1lTQ0xLX01DTEsyLAogCQkJCQkgICAgIDMyNzY4LCBTTkRfU09DX0NMT0NLX0lOKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCBXTTg5MTVfRkxMX01DTEsxLAorCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgV004OTE1X0ZMTF9NQ0xLMiwKIAkJCQkJICAwLCAwLCAwKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXByX2VycigiRmFpbGVkIHRvIHN0b3AgRkxMXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTQ2LDYgKzUxLDQ1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc3BleXNpZGVfc2V0X2JpYXNfbGV2ZWxfcG9zdChzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAorCQkJCQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCisJCQkJCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQoreworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gY2FyZC0+cnRkWzBdLmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJaWYgKGRhcG0tPmRldiAhPSBjb2RlY19kYWktPmRldikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJaWYgKGNhcmQtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkgeworCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsCisJCQkJCQkgIFdNODkxNV9GTExfTUNMSzIsCisJCQkJCQkgIDMyNzY4LCA0ODAwMCAqIDI1Nik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2VycigiRmFpbGVkIHRvIHN0YXJ0IEZMTFxuIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksCisJCQkJCQkgICAgIFdNODkxNV9TWVNDTEtfRkxMLAorCQkJCQkJICAgICA0ODAwMCAqIDI1NiwKKwkJCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJY2FyZC0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzcGV5c2lkZV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTY2LDE2ICsxMTAsNiBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsIFdNODkxNV9GTExfTUNMSzEsCi0JCQkJICAzMjc2OCwgMjU2ICogNDgwMDApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFdNODkxNV9TWVNDTEtfRkxMLAotCQkJCSAgICAgMjU2ICogNDgwMDAsIFNORF9TT0NfQ0xPQ0tfSU4pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyNyw3ICsxNjEsNyBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoZGFpLCBXTTg5MTVfU1lTQ0xLX01DTEsxLCAzMjc2OCwgMCk7CisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhkYWksIFdNODkxNV9TWVNDTEtfTUNMSzIsIDMyNzY4LCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMjY3LDYgKzMwMSw3IEBACiAJLm51bV9jb25maWdzID0gQVJSQVlfU0laRShzcGV5c2lkZV9jb2RlY19jb25mKSwKIAogCS5zZXRfYmlhc19sZXZlbCA9IHNwZXlzaWRlX3NldF9iaWFzX2xldmVsLAorCS5zZXRfYmlhc19sZXZlbF9wb3N0ID0gc3BleXNpZGVfc2V0X2JpYXNfbGV2ZWxfcG9zdCwKIAogCS5jb250cm9scyA9IGNvbnRyb2xzLAogCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNvbnRyb2xzKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlX3dtODk2Mi5jIGIvc291bmQvc29jL3NhbXN1bmcvc3BleXNpZGVfd204OTYyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjNDJiZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlX3dtODk2Mi5jCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogU3BleXNpZGUgd2l0aCBXTTg5NjIgYXVkaW8gc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDExIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg5NjIuaCIKKworc3RhdGljIGludCBzcGV5c2lkZV93bTg5NjJfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKKwkJCQkJICBzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCisJCQkJCSAgZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBjYXJkLT5ydGRbMF0uY29kZWNfZGFpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJaWYgKGRhcG0tPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpIHsKKwkJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCBXTTg5NjJfRkxMLAorCQkJCQkJICBXTTg5NjJfRkxMX01DTEssIDMyNzY4LAorCQkJCQkJICA0NDEwMCAqIDI1Nik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlwcl9lcnIoIkZhaWxlZCB0byBzdGFydCBGTEw6ICVkXG4iLCByZXQpOworCisJCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwKKwkJCQkJCSAgICAgV004OTYyX1NZU0NMS19GTEwsCisJCQkJCQkgICAgIDQ0MTAwICogMjU2LAorCQkJCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IFNZU0NMSzogJWRcbiIpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGV5c2lkZV93bTg5NjJfc2V0X2JpYXNfbGV2ZWxfcG9zdChzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAorCQkJCQkgICAgICAgc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAorCQkJCQkgICAgICAgZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBjYXJkLT5ydGRbMF0uY29kZWNfZGFpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFdNODk2Ml9TWVNDTEtfTUNMSywKKwkJCQkJICAgICAzMjc2OCwgU05EX1NPQ19DTE9DS19JTik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBzd2l0Y2ggYXdheSBmcm9tIEZMTDogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIFdNODk2Ml9GTEwsCisJCQkJCSAgMCwgMCwgMCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBzdG9wIEZMTDogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZGFwbS0+Ymlhc19sZXZlbCA9IGxldmVsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BleXNpZGVfd204OTYyX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksIFNORF9TT0NfREFJRk1UX0kyUworCQkJCQkgfCBTTkRfU09DX0RBSUZNVF9OQl9ORgorCQkJCQkgfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTCisJCQkJCSB8IFNORF9TT0NfREFJRk1UX05CX05GCisJCQkJCSB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgc3BleXNpZGVfd204OTYyX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gc3BleXNpZGVfd204OTYyX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBzcGV5c2lkZV93bTg5NjJfZGFpW10gPSB7CisJeworCQkubmFtZSA9ICJDUFUiLAorCQkuc3RyZWFtX25hbWUgPSAiQ1BVIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJzYW1zdW5nLWkycy4wIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIndtODk2MiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAorCQkuY29kZWNfbmFtZSA9ICJ3bTg5NjIuMS0wMDFhIiwKKwkJLm9wcyA9ICZzcGV5c2lkZV93bTg5NjJfb3BzLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJNYWluIFNwZWFrZXIiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAorCisJU05EX1NPQ19EQVBNX01JQygiRE1JQyIsIE5VTEwpLAorCisJU05EX1NPQ19EQVBNX1NQSygiTWFpbiBTcGVha2VyIiwgTlVMTCksCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19wYXRoc1tdID0geworCXsgIkhlYWRwaG9uZSIsIE5VTEwsICJIUE9VVEwiIH0sCisJeyAiSGVhZHBob25lIiwgTlVMTCwgIkhQT1VUUiIgfSwKKworCXsgIk1haW4gU3BlYWtlciIsIE5VTEwsICJTUEtPVVRMIiB9LAorCXsgIk1haW4gU3BlYWtlciIsIE5VTEwsICJTUEtPVVRSIiB9LAorCisJeyAiTUlDQklBUyIsIE5VTEwsICJIZWFkc2V0IE1pYyIgfSwKKwl7ICJJTjRMIiwgTlVMTCwgIk1JQ0JJQVMiIH0sCisJeyAiSU40UiIsIE5VTEwsICJNSUNCSUFTIiB9LAorCisJeyAiTUlDQklBUyIsIE5VTEwsICJETUlDIiB9LAorCXsgIkRNSUNEQVQiLCBOVUxMLCAiTUlDQklBUyIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrIHNwZXlzaWRlX3dtODk2Ml9oZWFkc2V0OworCisvKiBIZWFkc2V0IGphY2sgZGV0ZWN0aW9uIERBUE0gcGlucyAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfcGluIHNwZXlzaWRlX3dtODk2Ml9oZWFkc2V0X3BpbnNbXSA9IHsKKwl7CisJCS5waW4gPSAiSGVhZHNldCBNaWMiLAorCQkubWFzayA9IFNORF9KQUNLX01JQ1JPUEhPTkUsCisJfSwKKwl7CisJCS5waW4gPSAiSGVhZHBob25lIiwKKwkJLm1hc2sgPSBTTkRfSkFDS19NSUNST1BIT05FLAorCX0sCit9OworCitzdGF0aWMgaW50IHNwZXlzaWRlX3dtODk2Ml9sYXRlX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY2FyZC0+cnRkWzBdLmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gY2FyZC0+cnRkWzBdLmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFdNODk2Ml9TWVNDTEtfTUNMSywKKwkJCQkgICAgIDMyNzY4LCBTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfamFja19uZXcoY29kZWMsICJIZWFkc2V0IiwKKwkJCSAgICAgICBTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzAsCisJCQkgICAgICAgJnNwZXlzaWRlX3dtODk2Ml9oZWFkc2V0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc25kX3NvY19qYWNrX2FkZF9waW5zKCZzcGV5c2lkZV93bTg5NjJfaGVhZHNldCwKKwkJCQkgICAgQVJSQVlfU0laRShzcGV5c2lkZV93bTg5NjJfaGVhZHNldF9waW5zKSwKKwkJCQkgICAgc3BleXNpZGVfd204OTYyX2hlYWRzZXRfcGlucyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXdtODk2Ml9taWNfZGV0ZWN0KGNvZGVjLCAmc3BleXNpZGVfd204OTYyX2hlYWRzZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNwZXlzaWRlX3dtODk2MiA9IHsKKwkubmFtZSA9ICJTcGV5c2lkZSBXTTg5NjIiLAorCS5kYWlfbGluayA9IHNwZXlzaWRlX3dtODk2Ml9kYWksCisJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoc3BleXNpZGVfd204OTYyX2RhaSksCisKKwkuc2V0X2JpYXNfbGV2ZWwgPSBzcGV5c2lkZV93bTg5NjJfc2V0X2JpYXNfbGV2ZWwsCisJLnNldF9iaWFzX2xldmVsX3Bvc3QgPSBzcGV5c2lkZV93bTg5NjJfc2V0X2JpYXNfbGV2ZWxfcG9zdCwKKworCS5jb250cm9scyA9IGNvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fcGF0aHMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fcGF0aHMpLAorCisJLmxhdGVfcHJvYmUgPSBzcGV5c2lkZV93bTg5NjJfbGF0ZV9wcm9iZSwKK307CisKK3N0YXRpYyBfX2RldmluaXQgaW50IHNwZXlzaWRlX3dtODk2Ml9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmc3BleXNpZGVfd204OTYyOworCWludCByZXQ7CisKKwljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKGNhcmQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAic25kX3NvY19yZWdpc3Rlcl9jYXJkKCkgZmFpbGVkOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNwZXlzaWRlX3dtODk2Ml9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGV5c2lkZV93bTg5NjJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInNwZXlzaWRlLXdtODk2MiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSAmc25kX3NvY19wbV9vcHMsCisJfSwKKwkucHJvYmUgPSBzcGV5c2lkZV93bTg5NjJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNwZXlzaWRlX3dtODk2Ml9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3BleXNpZGVfd204OTYyX2F1ZGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzcGV5c2lkZV93bTg5NjJfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHNwZXlzaWRlX3dtODk2Ml9hdWRpb19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHNwZXlzaWRlX3dtODk2Ml9hdWRpb19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwZXlzaWRlX3dtODk2Ml9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoc3BleXNpZGVfd204OTYyX2F1ZGlvX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNwZXlzaWRlIFdNODk2MiBhdWRpbyBzdXBwb3J0Iik7CitNT0RVTEVfQVVUSE9SKCJNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c3BleXNpZGUtd204OTYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvZG1hLXNoNzc2MC5jIGIvc291bmQvc29jL3NoL2RtYS1zaDc3NjAuYwppbmRleCBjMzI2ZDI5Li5kYjc0MDA1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvZG1hLXNoNzc2MC5jCisrKyBiL3NvdW5kL3NvYy9zaC9kbWEtc2g3NzYwLmMKQEAgLTMyNywxMCArMzI3LDEwIEBACiAJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7CiB9CiAKLXN0YXRpYyBpbnQgY2FtZWxvdF9wY21fbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKLQkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkJICAgc3RydWN0IHNuZF9wY20gKnBjbSkKK3N0YXRpYyBpbnQgY2FtZWxvdF9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCiAJLyogZG9udCB1c2UgU05EUlZfRE1BX1RZUEVfREVWLCBzaW5jZSBpdCB3aWxsIG9vcHMgdGhlIFNIIGtlcm5lbAogCSAqIGluIE1NQVAgbW9kZSAoaS5lLiBhcGxheSAtTSkKIAkgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9mc2ktYWs0NjQyLmMgYi9zb3VuZC9zb2Mvc2gvZnNpLWFrNDY0Mi5jCmluZGV4IGQ2ZjQ3MDMuLjc3MGE3MWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9mc2ktYWs0NjQyLmMKKysrIGIvc291bmQvc29jL3NoL2ZzaS1hazQ2NDIuYwpAQCAtOTcsNyArOTcsNyBAQAogCiBzdGF0aWMgc3RydWN0IGZzaV9hazQ2NDJfZGF0YSBmc2lfYV9hazQ2NDIgPSB7CiAJLm5hbWUJCT0gIkFLNDY0MiIsCi0JLmNhcmQJCT0gIkZTSUEgKEFLNDY0MikiLAorCS5jYXJkCQk9ICJGU0lBLUFLNDY0MiIsCiAJLmNwdV9kYWkJPSAiZnNpYS1kYWkiLAogCS5jb2RlYwkJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMiIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaS4wIiwKQEAgLTEwNiw3ICsxMDYsNyBAQAogCiBzdGF0aWMgc3RydWN0IGZzaV9hazQ2NDJfZGF0YSBmc2lfYl9hazQ2NDIgPSB7CiAJLm5hbWUJCT0gIkFLNDY0MiIsCi0JLmNhcmQJCT0gIkZTSUIgKEFLNDY0MikiLAorCS5jYXJkCQk9ICJGU0lCLUFLNDY0MiIsCiAJLmNwdV9kYWkJPSAiZnNpYi1kYWkiLAogCS5jb2RlYwkJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMiIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaS4wIiwKQEAgLTExNSw3ICsxMTUsNyBAQAogCiBzdGF0aWMgc3RydWN0IGZzaV9hazQ2NDJfZGF0YSBmc2lfYV9hazQ2NDMgPSB7CiAJLm5hbWUJCT0gIkFLNDY0MyIsCi0JLmNhcmQJCT0gIkZTSUEgKEFLNDY0MykiLAorCS5jYXJkCQk9ICJGU0lBLUFLNDY0MyIsCiAJLmNwdV9kYWkJPSAiZnNpYS1kYWkiLAogCS5jb2RlYwkJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMyIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaS4wIiwKQEAgLTEyNCw3ICsxMjQsNyBAQAogCiBzdGF0aWMgc3RydWN0IGZzaV9hazQ2NDJfZGF0YSBmc2lfYl9hazQ2NDMgPSB7CiAJLm5hbWUJCT0gIkFLNDY0MyIsCi0JLmNhcmQJCT0gIkZTSUIgKEFLNDY0MykiLAorCS5jYXJkCQk9ICJGU0lCLUFLNDY0MyIsCiAJLmNwdV9kYWkJPSAiZnNpYi1kYWkiLAogCS5jb2RlYwkJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMyIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaS4wIiwKQEAgLTEzMyw3ICsxMzMsNyBAQAogCiBzdGF0aWMgc3RydWN0IGZzaV9hazQ2NDJfZGF0YSBmc2kyX2FfYWs0NjQyID0gewogCS5uYW1lCQk9ICJBSzQ2NDIiLAotCS5jYXJkCQk9ICJGU0kyQSAoQUs0NjQyKSIsCisJLmNhcmQJCT0gIkZTSTJBLUFLNDY0MiIsCiAJLmNwdV9kYWkJPSAiZnNpYS1kYWkiLAogCS5jb2RlYwkJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMiIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaTIiLApAQCAtMTQyLDcgKzE0Miw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZnNpX2FrNDY0Ml9kYXRhIGZzaTJfYl9hazQ2NDIgPSB7CiAJLm5hbWUJCT0gIkFLNDY0MiIsCi0JLmNhcmQJCT0gIkZTSTJCIChBSzQ2NDIpIiwKKwkuY2FyZAkJPSAiRlNJMkItQUs0NjQyIiwKIAkuY3B1X2RhaQk9ICJmc2liLWRhaSIsCiAJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEyIiwKIAkucGxhdGZvcm0JPSAic2hfZnNpMiIsCkBAIC0xNTEsNyArMTUxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBmc2lfYWs0NjQyX2RhdGEgZnNpMl9hX2FrNDY0MyA9IHsKIAkubmFtZQkJPSAiQUs0NjQzIiwKLQkuY2FyZAkJPSAiRlNJMkEgKEFLNDY0MykiLAorCS5jYXJkCQk9ICJGU0kyQS1BSzQ2NDMiLAogCS5jcHVfZGFpCT0gImZzaWEtZGFpIiwKIAkuY29kZWMJCT0gImFrNDY0Mi1jb2RlYy4wLTAwMTMiLAogCS5wbGF0Zm9ybQk9ICJzaF9mc2kyIiwKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiBzdGF0aWMgc3RydWN0IGZzaV9hazQ2NDJfZGF0YSBmc2kyX2JfYWs0NjQzID0gewogCS5uYW1lCQk9ICJBSzQ2NDMiLAotCS5jYXJkCQk9ICJGU0kyQiAoQUs0NjQzKSIsCisJLmNhcmQJCT0gIkZTSTJCLUFLNDY0MyIsCiAJLmNwdV9kYWkJPSAiZnNpYi1kYWkiLAogCS5jb2RlYwkJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMyIsCiAJLnBsYXRmb3JtCT0gInNoX2ZzaTIiLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL2ZzaS1kYTcyMTAuYyBiL3NvdW5kL3NvYy9zaC9mc2ktZGE3MjEwLmMKaW5kZXggZGJhZmQ3YS4uNTk1NTNmZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL2ZzaS1kYTcyMTAuYworKysgYi9zb3VuZC9zb2Mvc2gvZnNpLWRhNzIxMC5jCkBAIC00Miw3ICs0Miw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBmc2lfc29jX2NhcmQgPSB7Ci0JLm5hbWUJCT0gIkZTSSAoREE3MjEwKSIsCisJLm5hbWUJCT0gIkZTSS1EQTcyMTAiLAogCS5kYWlfbGluawk9ICZmc2lfZGE3MjEwX2RhaSwKIAkubnVtX2xpbmtzCT0gMSwKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvZnNpLWhkbWkuYyBiL3NvdW5kL3NvYy9zaC9mc2ktaGRtaS5jCmluZGV4IDk3MTk5ODUuLmQzZDlmZDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9mc2ktaGRtaS5jCisrKyBiL3NvdW5kL3NvYy9zaC9mc2ktaGRtaS5jCkBAIC04MywxMyArODMsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBmc2lfaGRtaV9kYXRhIGZzaTJfYV9oZG1pID0gewogCS5jcHVfZGFpCT0gImZzaWEtZGFpIiwKLQkuY2FyZAkJPSAiRlNJMkEgKFNIIE1PQklMRSBIRE1JKSIsCisJLmNhcmQJCT0gIkZTSTJBLUhETUkiLAogCS5pZAkJPSBGU0lfUE9SVF9BLAogfTsKIAogc3RhdGljIHN0cnVjdCBmc2lfaGRtaV9kYXRhIGZzaTJfYl9oZG1pID0gewogCS5jcHVfZGFpCT0gImZzaWItZGFpIiwKLQkuY2FyZAkJPSAiRlNJMkIgKFNIIE1PQklMRSBIRE1JKSIsCisJLmNhcmQJCT0gIkZTSTJCLUhETUkiLAogCS5pZAkJPSBGU0lfUE9SVF9CLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL2ZzaS5jIGIvc291bmQvc29jL3NoL2ZzaS5jCmluZGV4IDRhOWRhNmIuLjhlMTEyY2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9mc2kuYworKysgYi9zb3VuZC9zb2Mvc2gvZnNpLmMKQEAgLTExOCwxMCArMTE4LDM4IEBACiAvKgogICogRlNJIGRyaXZlciB1c2UgYmVsb3cgdHlwZSBuYW1lIGZvciB2YXJpYWJsZQogICoKLSAqIHh4eF9sZW4JOiBkYXRhIGxlbmd0aAotICogeHh4X3dpZHRoCTogZGF0YSB3aWR0aAotICogeHh4X29mZnNldAk6IGRhdGEgb2Zmc2V0CiAgKiB4eHhfbnVtCTogbnVtYmVyIG9mIGRhdGEKKyAqIHh4eF9wb3MJOiBwb3NpdGlvbiBvZiBkYXRhCisgKiB4eHhfY2FwYQk6IGNhcGFjaXR5IG9mIGRhdGEKKyAqLworCisvKgorICoJcGVyaW9kL2ZyYW1lL3NhbXBsZSBpbWFnZQorICoKKyAqIGV4KSBQQ00gKDJjaCkKKyAqCisgKiBwZXJpb2QgcG9zCQkJCQkgICBwZXJpb2QgcG9zCisgKiAgIFtuXQkJCQkJICAgICBbbiArIDFdCisgKiAgIHw8LS0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyaW9kLS0tLS0tLS0tLS0tLS0tLS0tLS0tPnwKKyAqID09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC4uLiA9fD09CisgKiAgIHwJCQkJCQkJfAorICogICB8fDwtLS0tLSAgZnJhbWUgLS0tLS0+fDwtLS0tLS0gZnJhbWUgLS0tLS0+fCAgLi4uCXwKKyAqICAgfCstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstIC4uLgl8CisgKiAgIHx8WyBzYW1wbGUgXVsgc2FtcGxlIF18WyBzYW1wbGUgXVsgc2FtcGxlIF18ICAuLi4JfAorICogICB8Ky0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0gLi4uCXwKKyAqID09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC4uLiA9fD09CisgKi8KKworLyoKKyAqCUZTSSBGSUZPIGltYWdlCisgKgorICoJfAkgICAgIHwKKyAqCXwJICAgICB8CisgKgl8IFsgc2FtcGxlIF0gfAorICoJfCBbIHNhbXBsZSBdIHwKKyAqCXwgWyBzYW1wbGUgXSB8CisgKgl8IFsgc2FtcGxlIF0gfAorICoJCS0tPiBnbyB0byBjb2RlY3MKICAqLwogCiAvKgpAQCAtMTMxLDEyICsxNTksMTEgQEAKIHN0cnVjdCBmc2lfc3RyZWFtIHsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKIAotCWludCBmaWZvX21heF9udW07Ci0KLQlpbnQgYnVmZl9vZmZzZXQ7Ci0JaW50IGJ1ZmZfbGVuOwotCWludCBwZXJpb2RfbGVuOwotCWludCBwZXJpb2RfbnVtOworCWludCBmaWZvX3NhbXBsZV9jYXBhOwkvKiBzYW1wbGUgY2FwYWNpdHkgb2YgRlNJIEZJRk8gKi8KKwlpbnQgYnVmZl9zYW1wbGVfY2FwYTsJLyogc2FtcGxlIGNhcGFjaXR5IG9mIEFMU0EgYnVmZmVyICovCisJaW50IGJ1ZmZfc2FtcGxlX3BvczsJLyogc2FtcGxlIHBvc2l0aW9uIG9mIEFMU0EgYnVmZmVyICovCisJaW50IHBlcmlvZF9zYW1wbGVzOwkvKiBzYW1wbGUgbnVtYmVyIC8gMSBwZXJpb2QgKi8KKwlpbnQgcGVyaW9kX3BvczsJCS8qIGN1cnJlbnQgcGVyaW9kIHBvc2l0aW9uICovCiAKIAlpbnQgdWVycl9udW07CiAJaW50IG9lcnJfbnVtOwpAQCAtMTQ5LDE3ICsxNzYsMTQgQEAKIAlzdHJ1Y3QgZnNpX3N0cmVhbSBwbGF5YmFjazsKIAlzdHJ1Y3QgZnNpX3N0cmVhbSBjYXB0dXJlOwogCisJdTMyIGRvX2ZtdDsKKwl1MzIgZGlfZm10OworCiAJaW50IGNoYW5fbnVtOjE2OwogCWludCBjbGtfbWFzdGVyOjE7CisJaW50IHNwZGlmOjE7CiAKIAlsb25nIHJhdGU7Ci0KLQkvKiBmb3Igc3VzcGVuZC9yZXN1bWUgKi8KLQl1MzIgc2F2ZWRfZG9fZm10OwotCXUzMiBzYXZlZF9kaV9mbXQ7Ci0JdTMyIHNhdmVkX2NrZzE7Ci0JdTMyIHNhdmVkX2NrZzI7Ci0JdTMyIHNhdmVkX291dF9zZWw7CiB9OwogCiBzdHJ1Y3QgZnNpX2NvcmUgewpAQCAtMTgwLDE0ICsyMDQsNiBAQAogCXN0cnVjdCBmc2lfY29yZSAqY29yZTsKIAlzdHJ1Y3Qgc2hfZnNpX3BsYXRmb3JtX2luZm8gKmluZm87CiAJc3BpbmxvY2tfdCBsb2NrOwotCi0JLyogZm9yIHN1c3BlbmQvcmVzdW1lICovCi0JdTMyIHNhdmVkX2FfbWNsazsKLQl1MzIgc2F2ZWRfYl9tY2xrOwotCXUzMiBzYXZlZF9pZW1zazsKLQl1MzIgc2F2ZWRfaW1zazsKLQl1MzIgc2F2ZWRfY2xrX3JzdDsKLQl1MzIgc2F2ZWRfc29mdF9yc3Q7CiB9OwogCiAvKgpAQCAtMjcxLDYgKzI4NywxMSBAQAogCXJldHVybiBmc2ktPm1hc3Rlci0+YmFzZSA9PSBmc2ktPmJhc2U7CiB9CiAKK3N0YXRpYyBpbnQgZnNpX2lzX3NwZGlmKHN0cnVjdCBmc2lfcHJpdiAqZnNpKQoreworCXJldHVybiBmc2ktPnNwZGlmOworfQorCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpICpmc2lfZ2V0X2RhaShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CkBAIC0zNDIsMjggKzM2Myw1OSBAQAogCXJldHVybiBzaGlmdDsKIH0KIAotc3RhdGljIHZvaWQgZnNpX3N0cmVhbV9wdXNoKHN0cnVjdCBmc2lfcHJpdiAqZnNpLAotCQkJICAgIGludCBpc19wbGF5LAotCQkJICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgIHUzMiBidWZmZXJfbGVuLAotCQkJICAgIHUzMiBwZXJpb2RfbGVuKQorc3RhdGljIGludCBmc2lfZnJhbWUyc2FtcGxlKHN0cnVjdCBmc2lfcHJpdiAqZnNpLCBpbnQgZnJhbWVzKQoreworCXJldHVybiBmcmFtZXMgKiBmc2ktPmNoYW5fbnVtOworfQorCitzdGF0aWMgaW50IGZzaV9zYW1wbGUyZnJhbWUoc3RydWN0IGZzaV9wcml2ICpmc2ksIGludCBzYW1wbGVzKQoreworCXJldHVybiBzYW1wbGVzIC8gZnNpLT5jaGFuX251bTsKK30KKworc3RhdGljIGludCBmc2lfc3RyZWFtX2lzX3dvcmtpbmcoc3RydWN0IGZzaV9wcml2ICpmc2ksCisJCQkJICBpbnQgaXNfcGxheSkKIHsKIAlzdHJ1Y3QgZnNpX3N0cmVhbSAqaW8gPSBmc2lfZ2V0X3N0cmVhbShmc2ksIGlzX3BsYXkpOworCXN0cnVjdCBmc2lfbWFzdGVyICptYXN0ZXIgPSBmc2lfZ2V0X21hc3Rlcihmc2kpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZtYXN0ZXItPmxvY2ssIGZsYWdzKTsKKwlyZXQgPSAhIWlvLT5zdWJzdHJlYW07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFzdGVyLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmc2lfc3RyZWFtX3B1c2goc3RydWN0IGZzaV9wcml2ICpmc2ksCisJCQkgICAgaW50IGlzX3BsYXksCisJCQkgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGZzaV9zdHJlYW0gKmlvID0gZnNpX2dldF9zdHJlYW0oZnNpLCBpc19wbGF5KTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBmc2lfbWFzdGVyICptYXN0ZXIgPSBmc2lfZ2V0X21hc3Rlcihmc2kpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWFzdGVyLT5sb2NrLCBmbGFncyk7CiAJaW8tPnN1YnN0cmVhbQk9IHN1YnN0cmVhbTsKLQlpby0+YnVmZl9sZW4JPSBidWZmZXJfbGVuOwotCWlvLT5idWZmX29mZnNldAk9IDA7Ci0JaW8tPnBlcmlvZF9sZW4JPSBwZXJpb2RfbGVuOwotCWlvLT5wZXJpb2RfbnVtCT0gMDsKKwlpby0+YnVmZl9zYW1wbGVfY2FwYQk9IGZzaV9mcmFtZTJzYW1wbGUoZnNpLCBydW50aW1lLT5idWZmZXJfc2l6ZSk7CisJaW8tPmJ1ZmZfc2FtcGxlX3Bvcwk9IDA7CisJaW8tPnBlcmlvZF9zYW1wbGVzCT0gZnNpX2ZyYW1lMnNhbXBsZShmc2ksIHJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKKwlpby0+cGVyaW9kX3BvcwkJPSAwOwogCWlvLT5vZXJyX251bQk9IC0xOyAvKiBpZ25vcmUgMXN0IGVyciAqLwogCWlvLT51ZXJyX251bQk9IC0xOyAvKiBpZ25vcmUgMXN0IGVyciAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hc3Rlci0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBmc2lfc3RyZWFtX3BvcChzdHJ1Y3QgZnNpX3ByaXYgKmZzaSwgaW50IGlzX3BsYXkpCiB7CiAJc3RydWN0IGZzaV9zdHJlYW0gKmlvID0gZnNpX2dldF9zdHJlYW0oZnNpLCBpc19wbGF5KTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IGZzaV9nZXRfZGFpKGlvLT5zdWJzdHJlYW0pOworCXN0cnVjdCBmc2lfbWFzdGVyICptYXN0ZXIgPSBmc2lfZ2V0X21hc3Rlcihmc2kpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWFzdGVyLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoaW8tPm9lcnJfbnVtID4gMCkKIAkJZGV2X2VycihkYWktPmRldiwgIm92ZXJfcnVuID0gJWRcbiIsIGlvLT5vZXJyX251bSk7CkBAIC0zNzIsNDcgKzQyNCwyNyBAQAogCQlkZXZfZXJyKGRhaS0+ZGV2LCAidW5kZXJfcnVuID0gJWRcbiIsIGlvLT51ZXJyX251bSk7CiAKIAlpby0+c3Vic3RyZWFtCT0gTlVMTDsKLQlpby0+YnVmZl9sZW4JPSAwOwotCWlvLT5idWZmX29mZnNldAk9IDA7Ci0JaW8tPnBlcmlvZF9sZW4JPSAwOwotCWlvLT5wZXJpb2RfbnVtCT0gMDsKKwlpby0+YnVmZl9zYW1wbGVfY2FwYQk9IDA7CisJaW8tPmJ1ZmZfc2FtcGxlX3Bvcwk9IDA7CisJaW8tPnBlcmlvZF9zYW1wbGVzCT0gMDsKKwlpby0+cGVyaW9kX3BvcwkJPSAwOwogCWlvLT5vZXJyX251bQk9IDA7CiAJaW8tPnVlcnJfbnVtCT0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBmc2lfZ2V0X2ZpZm9fZGF0YV9udW0oc3RydWN0IGZzaV9wcml2ICpmc2ksIGludCBpc19wbGF5KQorc3RhdGljIGludCBmc2lfZ2V0X2N1cnJlbnRfZmlmb19zYW1wbGVzKHN0cnVjdCBmc2lfcHJpdiAqZnNpLCBpbnQgaXNfcGxheSkKIHsKIAl1MzIgc3RhdHVzOwotCWludCBkYXRhX251bTsKKwlpbnQgZnJhbWVzOwogCiAJc3RhdHVzID0gaXNfcGxheSA/CiAJCWZzaV9yZWdfcmVhZChmc2ksIERPRkZfU1QpIDoKIAkJZnNpX3JlZ19yZWFkKGZzaSwgRElGRl9TVCk7CiAKLQlkYXRhX251bSA9IDB4MWZmICYgKHN0YXR1cyA+PiA4KTsKLQlkYXRhX251bSAqPSBmc2ktPmNoYW5fbnVtOworCWZyYW1lcyA9IDB4MWZmICYgKHN0YXR1cyA+PiA4KTsKIAotCXJldHVybiBkYXRhX251bTsKLX0KLQotc3RhdGljIGludCBmc2lfbGVuMm51bShpbnQgbGVuLCBpbnQgd2lkdGgpCi17Ci0JcmV0dXJuIGxlbiAvIHdpZHRoOwotfQotCi0jZGVmaW5lIGZzaV9udW0yb2Zmc2V0KGEsIGIpIGZzaV9udW0ybGVuKGEsIGIpCi1zdGF0aWMgaW50IGZzaV9udW0ybGVuKGludCBudW0sIGludCB3aWR0aCkKLXsKLQlyZXR1cm4gbnVtICogd2lkdGg7Ci19Ci0KLXN0YXRpYyBpbnQgZnNpX2dldF9mcmFtZV93aWR0aChzdHJ1Y3QgZnNpX3ByaXYgKmZzaSwgaW50IGlzX3BsYXkpCi17Ci0Jc3RydWN0IGZzaV9zdHJlYW0gKmlvID0gZnNpX2dldF9zdHJlYW0oZnNpLCBpc19wbGF5KTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGlvLT5zdWJzdHJlYW07Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQotCXJldHVybiBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgMSkgLyBmc2ktPmNoYW5fbnVtOworCXJldHVybiBmc2lfZnJhbWUyc2FtcGxlKGZzaSwgZnJhbWVzKTsKIH0KIAogc3RhdGljIHZvaWQgZnNpX2NvdW50X2ZpZm9fZXJyKHN0cnVjdCBmc2lfcHJpdiAqZnNpKQpAQCAtNDQ0LDggKzQ3NiwxMCBAQAogewogCWludCBpc19wbGF5ID0gZnNpX3N0cmVhbV9pc19wbGF5KHN0cmVhbSk7CiAJc3RydWN0IGZzaV9zdHJlYW0gKmlvID0gZnNpX2dldF9zdHJlYW0oZnNpLCBpc19wbGF5KTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gaW8tPnN1YnN0cmVhbS0+cnVudGltZTsKIAotCXJldHVybiBpby0+c3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSArIGlvLT5idWZmX29mZnNldDsKKwlyZXR1cm4gcnVudGltZS0+ZG1hX2FyZWEgKworCQlzYW1wbGVzX3RvX2J5dGVzKHJ1bnRpbWUsIGlvLT5idWZmX3NhbXBsZV9wb3MpOwogfQogCiBzdGF0aWMgdm9pZCBmc2lfZG1hX3NvZnRfcHVzaDE2KHN0cnVjdCBmc2lfcHJpdiAqZnNpLCBpbnQgbnVtKQpAQCAtNTU5LDM3ICs1OTMsOTQgQEAKIC8qCiAgKgkJY2xvY2sgZnVuY3Rpb24KICAqLwotI2RlZmluZSBmc2lfbW9kdWxlX2luaXQobSwgZCkJX19mc2lfbW9kdWxlX2Nsa19jdHJsKG0sIGQsIDEpCi0jZGVmaW5lIGZzaV9tb2R1bGVfa2lsbChtLCBkKQlfX2ZzaV9tb2R1bGVfY2xrX2N0cmwobSwgZCwgMCkKLXN0YXRpYyB2b2lkIF9fZnNpX21vZHVsZV9jbGtfY3RybChzdHJ1Y3QgZnNpX21hc3RlciAqbWFzdGVyLAotCQkJCSAgc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgaW50IGVuYWJsZSkKLXsKLQlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCS8qIGVuYWJsZSBvbmx5IFNSICovCi0JCWZzaV9tYXN0ZXJfbWFza19zZXQobWFzdGVyLCBTT0ZUX1JTVCwgRlNJU1IsIEZTSVNSKTsKLQkJZnNpX21hc3Rlcl9tYXNrX3NldChtYXN0ZXIsIFNPRlRfUlNULCBQQVNSIHwgUEJTUiwgMCk7Ci0JfSBlbHNlIHsKLQkJLyogY2xlYXIgYWxsIHJlZ2lzdGVycyAqLwotCQlmc2lfbWFzdGVyX21hc2tfc2V0KG1hc3RlciwgU09GVF9SU1QsIEZTSVNSLCAwKTsKLQl9Ci0KLQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7Ci19Ci0KLSNkZWZpbmUgZnNpX3BvcnRfc3RhcnQoZikJX19mc2lfcG9ydF9jbGtfY3RybChmLCAxKQotI2RlZmluZSBmc2lfcG9ydF9zdG9wKGYpCV9fZnNpX3BvcnRfY2xrX2N0cmwoZiwgMCkKLXN0YXRpYyB2b2lkIF9fZnNpX3BvcnRfY2xrX2N0cmwoc3RydWN0IGZzaV9wcml2ICpmc2ksIGludCBlbmFibGUpCitzdGF0aWMgaW50IGZzaV9zZXRfbWFzdGVyX2NsayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBmc2lfcHJpdiAqZnNpLAorCQkJICAgICAgbG9uZyByYXRlLCBpbnQgZW5hYmxlKQogewogCXN0cnVjdCBmc2lfbWFzdGVyICptYXN0ZXIgPSBmc2lfZ2V0X21hc3Rlcihmc2kpOwotCXUzMiBzb2Z0ID0gZnNpX2lzX3BvcnRfYShmc2kpID8gUEFTUiA6IFBCU1I7Ci0JdTMyIGNsayAgPSBmc2lfaXNfcG9ydF9hKGZzaSkgPyBDUkEgIDogQ1JCOwotCWludCBpc19tYXN0ZXIgPSBmc2lfaXNfY2xrX21hc3Rlcihmc2kpOworCXNldF9yYXRlX2Z1bmMgc2V0X3JhdGUgPSBmc2lfZ2V0X2luZm9fc2V0X3JhdGUobWFzdGVyKTsKKwlpbnQgZnNpX3ZlciA9IG1hc3Rlci0+Y29yZS0+dmVyOworCWludCByZXQ7CiAKLQlmc2lfbWFzdGVyX21hc2tfc2V0KG1hc3RlciwgU09GVF9SU1QsIHNvZnQsIChlbmFibGUpID8gc29mdCA6IDApOwotCWlmIChpc19tYXN0ZXIpCisJcmV0ID0gc2V0X3JhdGUoZGV2LCBmc2lfaXNfcG9ydF9hKGZzaSksIHJhdGUsIGVuYWJsZSk7CisJaWYgKHJldCA8IDApIC8qIGVycm9yICovCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWVuYWJsZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocmV0ID4gMCkgeworCQl1MzIgZGF0YSA9IDA7CisKKwkJc3dpdGNoIChyZXQgJiBTSF9GU0lfQUNLTURfTUFTSykgeworCQlkZWZhdWx0OgorCQkJLyogRkFMTCBUSFJPVUdIICovCisJCWNhc2UgU0hfRlNJX0FDS01EXzUxMjoKKwkJCWRhdGEgfD0gKDB4MCA8PCAxMik7CisJCQlicmVhazsKKwkJY2FzZSBTSF9GU0lfQUNLTURfMjU2OgorCQkJZGF0YSB8PSAoMHgxIDw8IDEyKTsKKwkJCWJyZWFrOworCQljYXNlIFNIX0ZTSV9BQ0tNRF8xMjg6CisJCQlkYXRhIHw9ICgweDIgPDwgMTIpOworCQkJYnJlYWs7CisJCWNhc2UgU0hfRlNJX0FDS01EXzY0OgorCQkJZGF0YSB8PSAoMHgzIDw8IDEyKTsKKwkJCWJyZWFrOworCQljYXNlIFNIX0ZTSV9BQ0tNRF8zMjoKKwkJCWlmIChmc2lfdmVyIDwgMikKKwkJCQlkZXZfZXJyKGRldiwgInVuc3VwcG9ydGVkIEFDS01EXG4iKTsKKwkJCWVsc2UKKwkJCQlkYXRhIHw9ICgweDQgPDwgMTIpOworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKHJldCAmIFNIX0ZTSV9CUEZNRF9NQVNLKSB7CisJCWRlZmF1bHQ6CisJCQkvKiBGQUxMIFRIUk9VR0ggKi8KKwkJY2FzZSBTSF9GU0lfQlBGTURfMzI6CisJCQlkYXRhIHw9ICgweDAgPDwgOCk7CisJCQlicmVhazsKKwkJY2FzZSBTSF9GU0lfQlBGTURfNjQ6CisJCQlkYXRhIHw9ICgweDEgPDwgOCk7CisJCQlicmVhazsKKwkJY2FzZSBTSF9GU0lfQlBGTURfMTI4OgorCQkJZGF0YSB8PSAoMHgyIDw8IDgpOworCQkJYnJlYWs7CisJCWNhc2UgU0hfRlNJX0JQRk1EXzI1NjoKKwkJCWRhdGEgfD0gKDB4MyA8PCA4KTsKKwkJCWJyZWFrOworCQljYXNlIFNIX0ZTSV9CUEZNRF81MTI6CisJCQlkYXRhIHw9ICgweDQgPDwgOCk7CisJCQlicmVhazsKKwkJY2FzZSBTSF9GU0lfQlBGTURfMTY6CisJCQlpZiAoZnNpX3ZlciA8IDIpCisJCQkJZGV2X2VycihkZXYsICJ1bnN1cHBvcnRlZCBBQ0tNRFxuIik7CisJCQllbHNlCisJCQkJZGF0YSB8PSAoMHg3IDw8IDgpOworCQkJYnJlYWs7CisJCX0KKworCQlmc2lfcmVnX21hc2tfc2V0KGZzaSwgQ0tHMSwgKEFDS01EX01BU0sgfCBCUEZNRF9NQVNLKSAsIGRhdGEpOworCQl1ZGVsYXkoMTApOworCQlyZXQgPSAwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgZnNpX3BvcnRfc3RhcnQoZiwgaSkJX19mc2lfcG9ydF9jbGtfY3RybChmLCBpLCAxKQorI2RlZmluZSBmc2lfcG9ydF9zdG9wKGYsIGkpCV9fZnNpX3BvcnRfY2xrX2N0cmwoZiwgaSwgMCkKK3N0YXRpYyB2b2lkIF9fZnNpX3BvcnRfY2xrX2N0cmwoc3RydWN0IGZzaV9wcml2ICpmc2ksIGludCBpc19wbGF5LCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBmc2lfbWFzdGVyICptYXN0ZXIgPSBmc2lfZ2V0X21hc3Rlcihmc2kpOworCXUzMiBjbGsgID0gZnNpX2lzX3BvcnRfYShmc2kpID8gQ1JBICA6IENSQjsKKworCWlmIChlbmFibGUpCisJCWZzaV9pcnFfZW5hYmxlKGZzaSwgaXNfcGxheSk7CisJZWxzZQorCQlmc2lfaXJxX2Rpc2FibGUoZnNpLCBpc19wbGF5KTsKKworCWlmIChmc2lfaXNfY2xrX21hc3Rlcihmc2kpKQogCQlmc2lfbWFzdGVyX21hc2tfc2V0KG1hc3RlciwgQ0xLX1JTVCwgY2xrLCAoZW5hYmxlKSA/IGNsayA6IDApOwogfQogCkBAIC01OTgsMTggKzY4OSwxOSBAQAogICovCiBzdGF0aWMgdm9pZCBmc2lfZmlmb19pbml0KHN0cnVjdCBmc2lfcHJpdiAqZnNpLAogCQkJICBpbnQgaXNfcGxheSwKLQkJCSAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCisJCQkgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZnNpX21hc3RlciAqbWFzdGVyID0gZnNpX2dldF9tYXN0ZXIoZnNpKTsKIAlzdHJ1Y3QgZnNpX3N0cmVhbSAqaW8gPSBmc2lfZ2V0X3N0cmVhbShmc2ksIGlzX3BsYXkpOwogCXUzMiBzaGlmdCwgaTsKKwlpbnQgZnJhbWVfY2FwYTsKIAogCS8qIGdldCBvbi1jaGlwIFJBTSBjYXBhY2l0eSAqLwogCXNoaWZ0ID0gZnNpX21hc3Rlcl9yZWFkKG1hc3RlciwgRklGT19TWik7CiAJc2hpZnQgPj49IGZzaV9nZXRfcG9ydF9zaGlmdChmc2ksIGlzX3BsYXkpOwogCXNoaWZ0ICY9IEZJRk9fU1pfTUFTSzsKLQlpby0+Zmlmb19tYXhfbnVtID0gMjU2IDw8IHNoaWZ0OwotCWRldl9kYmcoZGFpLT5kZXYsICJmaWZvID0gJWQgd29yZHNcbiIsIGlvLT5maWZvX21heF9udW0pOworCWZyYW1lX2NhcGEgPSAyNTYgPDwgc2hpZnQ7CisJZGV2X2RiZyhkZXYsICJmaWZvID0gJWQgd29yZHNcbiIsIGZyYW1lX2NhcGEpOwogCiAJLyoKIAkgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2FtcGxlIGRhdGEgdmFyaWVzIGRlcGVuZGluZwpAQCAtNjMxLDkgKzcyMywxMSBAQAogCSAqIDggY2hhbm5lbHM6ICAzMiAoIDMyIHggOCA9IDI1NikKIAkgKi8KIAlmb3IgKGkgPSAxOyBpIDwgZnNpLT5jaGFuX251bTsgaSA8PD0gMSkKLQkJaW8tPmZpZm9fbWF4X251bSA+Pj0gMTsKLQlkZXZfZGJnKGRhaS0+ZGV2LCAiJWQgY2hhbm5lbCAlZCBzdG9yZVxuIiwKLQkJZnNpLT5jaGFuX251bSwgaW8tPmZpZm9fbWF4X251bSk7CisJCWZyYW1lX2NhcGEgPj49IDE7CisJZGV2X2RiZyhkZXYsICIlZCBjaGFubmVsICVkIHN0b3JlXG4iLAorCQlmc2ktPmNoYW5fbnVtLCBmcmFtZV9jYXBhKTsKKworCWlvLT5maWZvX3NhbXBsZV9jYXBhID0gZnNpX2ZyYW1lMnNhbXBsZShmc2ksIGZyYW1lX2NhcGEpOwogCiAJLyoKIAkgKiBzZXQgaW50ZXJydXB0IGdlbmVyYXRpb24gZmFjdG9yCkBAIC02NTQsMTAgKzc0OCwxMCBAQAogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gTlVMTDsKIAlpbnQgaXNfcGxheSA9IGZzaV9zdHJlYW1faXNfcGxheShzdHJlYW0pOwogCXN0cnVjdCBmc2lfc3RyZWFtICppbyA9IGZzaV9nZXRfc3RyZWFtKGZzaSwgaXNfcGxheSk7Ci0JaW50IGRhdGFfcmVzaWR1ZV9udW07Ci0JaW50IGRhdGFfbnVtOwotCWludCBkYXRhX251bV9tYXg7Ci0JaW50IGNoX3dpZHRoOworCWludCBzYW1wbGVfcmVzaWR1ZXM7CisJaW50IHNhbXBsZV93aWR0aDsKKwlpbnQgc2FtcGxlczsKKwlpbnQgc2FtcGxlc19tYXg7CiAJaW50IG92ZXJfcGVyaW9kOwogCXZvaWQgKCpmbikoc3RydWN0IGZzaV9wcml2ICpmc2ksIGludCBzaXplKTsKIApAQCAtNjczLDM2ICs3NjcsMzUgQEAKIAkvKiBGU0kgRklGTyBoYXMgbGltaXQuCiAJICogU28sIHRoaXMgZHJpdmVyIGNhbiBub3Qgc2VuZCBwZXJpb2RzIGRhdGEgYXQgYSB0aW1lCiAJICovCi0JaWYgKGlvLT5idWZmX29mZnNldCA+PQotCSAgICBmc2lfbnVtMm9mZnNldChpby0+cGVyaW9kX251bSArIDEsIGlvLT5wZXJpb2RfbGVuKSkgeworCWlmIChpby0+YnVmZl9zYW1wbGVfcG9zID49CisJICAgIGlvLT5wZXJpb2Rfc2FtcGxlcyAqIChpby0+cGVyaW9kX3BvcyArIDEpKSB7CiAKIAkJb3Zlcl9wZXJpb2QgPSAxOwotCQlpby0+cGVyaW9kX251bSA9IChpby0+cGVyaW9kX251bSArIDEpICUgcnVudGltZS0+cGVyaW9kczsKKwkJaW8tPnBlcmlvZF9wb3MgPSAoaW8tPnBlcmlvZF9wb3MgKyAxKSAlIHJ1bnRpbWUtPnBlcmlvZHM7CiAKLQkJaWYgKDAgPT0gaW8tPnBlcmlvZF9udW0pCi0JCQlpby0+YnVmZl9vZmZzZXQgPSAwOworCQlpZiAoMCA9PSBpby0+cGVyaW9kX3BvcykKKwkJCWlvLT5idWZmX3NhbXBsZV9wb3MgPSAwOwogCX0KIAotCS8qIGdldCAxIGNoYW5uZWwgZGF0YSB3aWR0aCAqLwotCWNoX3dpZHRoID0gZnNpX2dldF9mcmFtZV93aWR0aChmc2ksIGlzX3BsYXkpOworCS8qIGdldCAxIHNhbXBsZSBkYXRhIHdpZHRoICovCisJc2FtcGxlX3dpZHRoID0gc2FtcGxlc190b19ieXRlcyhydW50aW1lLCAxKTsKIAotCS8qIGdldCByZXNpZHVlIGRhdGEgbnVtYmVyIG9mIGFsc2EgKi8KLQlkYXRhX3Jlc2lkdWVfbnVtID0gZnNpX2xlbjJudW0oaW8tPmJ1ZmZfbGVuIC0gaW8tPmJ1ZmZfb2Zmc2V0LAotCQkJCSAgICAgICBjaF93aWR0aCk7CisJLyogZ2V0IG51bWJlciBvZiByZXNpZHVlIHNhbXBsZXMgKi8KKwlzYW1wbGVfcmVzaWR1ZXMgPSBpby0+YnVmZl9zYW1wbGVfY2FwYSAtIGlvLT5idWZmX3NhbXBsZV9wb3M7CiAKIAlpZiAoaXNfcGxheSkgewogCQkvKgogCQkgKiBmb3IgcGxheS1iYWNrCiAJCSAqCi0JCSAqIGRhdGFfbnVtX21heAk6IG51bWJlciBvZiBGU0kgZmlmbyBmcmVlIHNwYWNlCi0JCSAqIGRhdGFfbnVtCTogbnVtYmVyIG9mIEFMU0EgcmVzaWR1ZSBkYXRhCisJCSAqIHNhbXBsZXNfbWF4CTogbnVtYmVyIG9mIEZTSSBmaWZvIGZyZWUgc2FtcGxlcyBzcGFjZQorCQkgKiBzYW1wbGVzCTogbnVtYmVyIG9mIEFMU0EgcmVzaWR1ZSBzYW1wbGVzCiAJCSAqLwotCQlkYXRhX251bV9tYXggID0gaW8tPmZpZm9fbWF4X251bSAqIGZzaS0+Y2hhbl9udW07Ci0JCWRhdGFfbnVtX21heCAtPSBmc2lfZ2V0X2ZpZm9fZGF0YV9udW0oZnNpLCBpc19wbGF5KTsKKwkJc2FtcGxlc19tYXggID0gaW8tPmZpZm9fc2FtcGxlX2NhcGE7CisJCXNhbXBsZXNfbWF4IC09IGZzaV9nZXRfY3VycmVudF9maWZvX3NhbXBsZXMoZnNpLCBpc19wbGF5KTsKIAotCQlkYXRhX251bSA9IGRhdGFfcmVzaWR1ZV9udW07CisJCXNhbXBsZXMgPSBzYW1wbGVfcmVzaWR1ZXM7CiAKLQkJc3dpdGNoIChjaF93aWR0aCkgeworCQlzd2l0Y2ggKHNhbXBsZV93aWR0aCkgewogCQljYXNlIDI6CiAJCQlmbiA9IGZzaV9kbWFfc29mdF9wdXNoMTY7CiAJCQlicmVhazsKQEAgLTcxNiwxMyArODA5LDEzIEBACiAJCS8qCiAJCSAqIGZvciBjYXB0dXJlCiAJCSAqCi0JCSAqIGRhdGFfbnVtX21heAk6IG51bWJlciBvZiBBTFNBIGZyZWUgc3BhY2UKLQkJICogZGF0YV9udW0JOiBudW1iZXIgb2YgZGF0YSBpbiBGU0kgZmlmbworCQkgKiBzYW1wbGVzX21heAk6IG51bWJlciBvZiBBTFNBIGZyZWUgc2FtcGxlcyBzcGFjZQorCQkgKiBzYW1wbGVzCTogbnVtYmVyIG9mIHNhbXBsZXMgaW4gRlNJIGZpZm8KIAkJICovCi0JCWRhdGFfbnVtX21heCA9IGRhdGFfcmVzaWR1ZV9udW07Ci0JCWRhdGFfbnVtICAgICA9IGZzaV9nZXRfZmlmb19kYXRhX251bShmc2ksIGlzX3BsYXkpOworCQlzYW1wbGVzX21heCA9IHNhbXBsZV9yZXNpZHVlczsKKwkJc2FtcGxlcyAgICAgPSBmc2lfZ2V0X2N1cnJlbnRfZmlmb19zYW1wbGVzKGZzaSwgaXNfcGxheSk7CiAKLQkJc3dpdGNoIChjaF93aWR0aCkgeworCQlzd2l0Y2ggKHNhbXBsZV93aWR0aCkgewogCQljYXNlIDI6CiAJCQlmbiA9IGZzaV9kbWFfc29mdF9wb3AxNjsKIAkJCWJyZWFrOwpAQCAtNzM0LDEyICs4MjcsMTIgQEAKIAkJfQogCX0KIAotCWRhdGFfbnVtID0gbWluKGRhdGFfbnVtLCBkYXRhX251bV9tYXgpOworCXNhbXBsZXMgPSBtaW4oc2FtcGxlcywgc2FtcGxlc19tYXgpOwogCi0JZm4oZnNpLCBkYXRhX251bSk7CisJZm4oZnNpLCBzYW1wbGVzKTsKIAotCS8qIHVwZGF0ZSBidWZmX29mZnNldCAqLwotCWlvLT5idWZmX29mZnNldCArPSBmc2lfbnVtMm9mZnNldChkYXRhX251bSwgY2hfd2lkdGgpOworCS8qIHVwZGF0ZSBidWZmX3NhbXBsZV9wb3MgKi8KKwlpby0+YnVmZl9zYW1wbGVfcG9zICs9IHNhbXBsZXM7CiAKIAlpZiAob3Zlcl9wZXJpb2QpCiAJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKQEAgLTc4OCwxNiArODgxLDIwIEBACiAgKgkJZGFpIG9wcwogICovCiAKLXN0YXRpYyBpbnQgZnNpX2RhaV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCitzdGF0aWMgaW50IGZzaV9od19zdGFydHVwKHN0cnVjdCBmc2lfcHJpdiAqZnNpLAorCQkJICBpbnQgaXNfcGxheSwKKwkJCSAgc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBmc2lfcHJpdiAqZnNpID0gZnNpX2dldF9wcml2KHN1YnN0cmVhbSk7CiAJdTMyIGZsYWdzID0gZnNpX2dldF9pbmZvX2ZsYWdzKGZzaSk7Ci0JdTMyIGRhdGE7Ci0JaW50IGlzX3BsYXkgPSBmc2lfaXNfcGxheShzdWJzdHJlYW0pOworCXUzMiBkYXRhID0gMDsKIAotCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGFpLT5kZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKIAorCS8qIGNsb2NrIHNldHRpbmcgKi8KKwlpZiAoZnNpX2lzX2Nsa19tYXN0ZXIoZnNpKSkKKwkJZGF0YSA9IERJTUQgfCBET01EOworCisJZnNpX3JlZ19tYXNrX3NldChmc2ksIENLRzEsIChESU1EIHwgRE9NRCksIGRhdGEpOwogCiAJLyogY2xvY2sgaW52ZXJzaW9uIChDS0cyKSAqLwogCWRhdGEgPSAwOwpAQCAtODEyLDU0ICs5MDksNzAgQEAKIAogCWZzaV9yZWdfd3JpdGUoZnNpLCBDS0cyLCBkYXRhKTsKIAorCS8qIHNldCBmb3JtYXQgKi8KKwlmc2lfcmVnX3dyaXRlKGZzaSwgRE9fRk1ULCBmc2ktPmRvX2ZtdCk7CisJZnNpX3JlZ193cml0ZShmc2ksIERJX0ZNVCwgZnNpLT5kaV9mbXQpOworCisJLyogc3BkaWYgPyAqLworCWlmIChmc2lfaXNfc3BkaWYoZnNpKSkgeworCQlmc2lfc3BkaWZfY2xrX2N0cmwoZnNpLCAxKTsKKwkJZnNpX3JlZ19tYXNrX3NldChmc2ksIE9VVF9TRUwsIERNTUQsIERNTUQpOworCX0KKwogCS8qIGlycSBjbGVhciAqLwogCWZzaV9pcnFfZGlzYWJsZShmc2ksIGlzX3BsYXkpOwogCWZzaV9pcnFfY2xlYXJfc3RhdHVzKGZzaSk7CiAKIAkvKiBmaWZvIGluaXQgKi8KLQlmc2lfZmlmb19pbml0KGZzaSwgaXNfcGxheSwgZGFpKTsKKwlmc2lfZmlmb19pbml0KGZzaSwgaXNfcGxheSwgZGV2KTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBmc2lfaHdfc2h1dGRvd24oc3RydWN0IGZzaV9wcml2ICpmc2ksCisJCQkgICAgaW50IGlzX3BsYXksCisJCQkgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChmc2lfaXNfY2xrX21hc3Rlcihmc2kpKQorCQlmc2lfc2V0X21hc3Rlcl9jbGsoZGV2LCBmc2ksIGZzaS0+cmF0ZSwgMCk7CisKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7Cit9CisKK3N0YXRpYyBpbnQgZnNpX2RhaV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGZzaV9wcml2ICpmc2kgPSBmc2lfZ2V0X3ByaXYoc3Vic3RyZWFtKTsKKwlpbnQgaXNfcGxheSA9IGZzaV9pc19wbGF5KHN1YnN0cmVhbSk7CisKKwlyZXR1cm4gZnNpX2h3X3N0YXJ0dXAoZnNpLCBpc19wbGF5LCBkYWktPmRldik7Cit9CisKIHN0YXRpYyB2b2lkIGZzaV9kYWlfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewogCXN0cnVjdCBmc2lfcHJpdiAqZnNpID0gZnNpX2dldF9wcml2KHN1YnN0cmVhbSk7CiAJaW50IGlzX3BsYXkgPSBmc2lfaXNfcGxheShzdWJzdHJlYW0pOwotCXN0cnVjdCBmc2lfbWFzdGVyICptYXN0ZXIgPSBmc2lfZ2V0X21hc3Rlcihmc2kpOwotCXNldF9yYXRlX2Z1bmMgc2V0X3JhdGUgPSBmc2lfZ2V0X2luZm9fc2V0X3JhdGUobWFzdGVyKTsKIAotCWZzaV9pcnFfZGlzYWJsZShmc2ksIGlzX3BsYXkpOwotCi0JaWYgKGZzaV9pc19jbGtfbWFzdGVyKGZzaSkpCi0JCXNldF9yYXRlKGRhaS0+ZGV2LCBmc2lfaXNfcG9ydF9hKGZzaSksIGZzaS0+cmF0ZSwgMCk7Ci0KKwlmc2lfaHdfc2h1dGRvd24oZnNpLCBpc19wbGF5LCBkYWktPmRldik7CiAJZnNpLT5yYXRlID0gMDsKLQotCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGFpLT5kZXYpOwogfQogCiBzdGF0aWMgaW50IGZzaV9kYWlfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCwKIAkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewogCXN0cnVjdCBmc2lfcHJpdiAqZnNpID0gZnNpX2dldF9wcml2KHN1YnN0cmVhbSk7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlpbnQgaXNfcGxheSA9IGZzaV9pc19wbGF5KHN1YnN0cmVhbSk7CiAJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JCWZzaV9zdHJlYW1fcHVzaChmc2ksIGlzX3BsYXksIHN1YnN0cmVhbSwKLQkJCQlmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcnVudGltZS0+YnVmZmVyX3NpemUpLAotCQkJCWZyYW1lc190b19ieXRlcyhydW50aW1lLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSkpOworCQlmc2lfc3RyZWFtX3B1c2goZnNpLCBpc19wbGF5LCBzdWJzdHJlYW0pOwogCQlyZXQgPSBpc19wbGF5ID8gZnNpX2RhdGFfcHVzaChmc2kpIDogZnNpX2RhdGFfcG9wKGZzaSk7Ci0JCWZzaV9pcnFfZW5hYmxlKGZzaSwgaXNfcGxheSk7Ci0JCWZzaV9wb3J0X3N0YXJ0KGZzaSk7CisJCWZzaV9wb3J0X3N0YXJ0KGZzaSwgaXNfcGxheSk7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJZnNpX3BvcnRfc3RvcChmc2kpOwotCQlmc2lfaXJxX2Rpc2FibGUoZnNpLCBpc19wbGF5KTsKKwkJZnNpX3BvcnRfc3RvcChmc2ksIGlzX3BsYXkpOwogCQlmc2lfc3RyZWFtX3BvcChmc2ksIGlzX3BsYXkpOwogCQlicmVhazsKIAl9CkBAIC04ODQsOCArOTk3LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZnNpX3JlZ193cml0ZShmc2ksIERPX0ZNVCwgZGF0YSk7Ci0JZnNpX3JlZ193cml0ZShmc2ksIERJX0ZNVCwgZGF0YSk7CisJZnNpLT5kb19mbXQgPSBkYXRhOworCWZzaS0+ZGlfZm10ID0gZGF0YTsKIAogCXJldHVybiAwOwogfQpAQCAtOTAwLDExICsxMDEzLDEwIEBACiAKIAlkYXRhID0gQ1JfQldTXzE2IHwgQ1JfRFRNRF9TUERJRl9QQ00gfCBDUl9QQ007CiAJZnNpLT5jaGFuX251bSA9IDI7Ci0JZnNpX3NwZGlmX2Nsa19jdHJsKGZzaSwgMSk7Ci0JZnNpX3JlZ19tYXNrX3NldChmc2ksIE9VVF9TRUwsIERNTUQsIERNTUQpOworCWZzaS0+c3BkaWYgPSAxOwogCi0JZnNpX3JlZ193cml0ZShmc2ksIERPX0ZNVCwgZGF0YSk7Ci0JZnNpX3JlZ193cml0ZShmc2ksIERJX0ZNVCwgZGF0YSk7CisJZnNpLT5kb19mbXQgPSBkYXRhOworCWZzaS0+ZGlfZm10ID0gZGF0YTsKIAogCXJldHVybiAwOwogfQpAQCAtOTE1LDMyICsxMDI3LDI0IEBACiAJc3RydWN0IGZzaV9tYXN0ZXIgKm1hc3RlciA9IGZzaV9nZXRfbWFzdGVyKGZzaSk7CiAJc2V0X3JhdGVfZnVuYyBzZXRfcmF0ZSA9IGZzaV9nZXRfaW5mb19zZXRfcmF0ZShtYXN0ZXIpOwogCXUzMiBmbGFncyA9IGZzaV9nZXRfaW5mb19mbGFncyhmc2kpOwotCXUzMiBkYXRhID0gMDsKIAlpbnQgcmV0OwogCi0JcG1fcnVudGltZV9nZXRfc3luYyhkYWktPmRldik7Ci0KIAkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLwogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06Ci0JCWRhdGEgPSBESU1EIHwgRE9NRDsKIAkJZnNpLT5jbGtfbWFzdGVyID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIHNldF9mbXRfZXhpdDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGZzaV9pc19jbGtfbWFzdGVyKGZzaSkgJiYgIXNldF9yYXRlKSB7CiAJCWRldl9lcnIoZGFpLT5kZXYsICJwbGF0Zm9ybSBkb2Vzbid0IGhhdmUgc2V0X3JhdGVcbiIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIHNldF9mbXRfZXhpdDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZnNpX3JlZ19tYXNrX3NldChmc2ksIENLRzEsIChESU1EIHwgRE9NRCksIGRhdGEpOwotCiAJLyogc2V0IGZvcm1hdCAqLwogCXN3aXRjaCAoZmxhZ3MgJiBTSF9GU0lfRk1UX01BU0spIHsKIAljYXNlIFNIX0ZTSV9GTVRfREFJOgpAQCAtOTUzLDkgKzEwNTcsNiBAQAogCQlyZXQgPSAtRUlOVkFMOwogCX0KIAotc2V0X2ZtdF9leGl0OgotCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGFpLT5kZXYpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTY0LDc5ICsxMDY1LDE5IEBACiAJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewogCXN0cnVjdCBmc2lfcHJpdiAqZnNpID0gZnNpX2dldF9wcml2KHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGZzaV9tYXN0ZXIgKm1hc3RlciA9IGZzaV9nZXRfbWFzdGVyKGZzaSk7Ci0Jc2V0X3JhdGVfZnVuYyBzZXRfcmF0ZSA9IGZzaV9nZXRfaW5mb19zZXRfcmF0ZShtYXN0ZXIpOwotCWludCBmc2lfdmVyID0gbWFzdGVyLT5jb3JlLT52ZXI7CiAJbG9uZyByYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAlpbnQgcmV0OwogCiAJaWYgKCFmc2lfaXNfY2xrX21hc3Rlcihmc2kpKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHNldF9yYXRlKGRhaS0+ZGV2LCBmc2lfaXNfcG9ydF9hKGZzaSksIHJhdGUsIDEpOwotCWlmIChyZXQgPCAwKSAvKiBlcnJvciAqLworCXJldCA9IGZzaV9zZXRfbWFzdGVyX2NsayhkYWktPmRldiwgZnNpLCByYXRlLCAxKTsKKwlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCWZzaS0+cmF0ZSA9IHJhdGU7Ci0JaWYgKHJldCA+IDApIHsKLQkJdTMyIGRhdGEgPSAwOwotCi0JCXN3aXRjaCAocmV0ICYgU0hfRlNJX0FDS01EX01BU0spIHsKLQkJZGVmYXVsdDoKLQkJCS8qIEZBTEwgVEhST1VHSCAqLwotCQljYXNlIFNIX0ZTSV9BQ0tNRF81MTI6Ci0JCQlkYXRhIHw9ICgweDAgPDwgMTIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0hfRlNJX0FDS01EXzI1NjoKLQkJCWRhdGEgfD0gKDB4MSA8PCAxMik7Ci0JCQlicmVhazsKLQkJY2FzZSBTSF9GU0lfQUNLTURfMTI4OgotCQkJZGF0YSB8PSAoMHgyIDw8IDEyKTsKLQkJCWJyZWFrOwotCQljYXNlIFNIX0ZTSV9BQ0tNRF82NDoKLQkJCWRhdGEgfD0gKDB4MyA8PCAxMik7Ci0JCQlicmVhazsKLQkJY2FzZSBTSF9GU0lfQUNLTURfMzI6Ci0JCQlpZiAoZnNpX3ZlciA8IDIpCi0JCQkJZGV2X2VycihkYWktPmRldiwgInVuc3VwcG9ydGVkIEFDS01EXG4iKTsKLQkJCWVsc2UKLQkJCQlkYXRhIHw9ICgweDQgPDwgMTIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzd2l0Y2ggKHJldCAmIFNIX0ZTSV9CUEZNRF9NQVNLKSB7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBGQUxMIFRIUk9VR0ggKi8KLQkJY2FzZSBTSF9GU0lfQlBGTURfMzI6Ci0JCQlkYXRhIHw9ICgweDAgPDwgOCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTSF9GU0lfQlBGTURfNjQ6Ci0JCQlkYXRhIHw9ICgweDEgPDwgOCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTSF9GU0lfQlBGTURfMTI4OgotCQkJZGF0YSB8PSAoMHgyIDw8IDgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0hfRlNJX0JQRk1EXzI1NjoKLQkJCWRhdGEgfD0gKDB4MyA8PCA4KTsKLQkJCWJyZWFrOwotCQljYXNlIFNIX0ZTSV9CUEZNRF81MTI6Ci0JCQlkYXRhIHw9ICgweDQgPDwgOCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTSF9GU0lfQlBGTURfMTY6Ci0JCQlpZiAoZnNpX3ZlciA8IDIpCi0JCQkJZGV2X2VycihkYWktPmRldiwgInVuc3VwcG9ydGVkIEFDS01EXG4iKTsKLQkJCWVsc2UKLQkJCQlkYXRhIHw9ICgweDcgPDwgOCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWZzaV9yZWdfbWFza19zZXQoZnNpLCBDS0cxLCAoQUNLTURfTUFTSyB8IEJQRk1EX01BU0spICwgZGF0YSk7Ci0JCXVkZWxheSgxMCk7Ci0JCXJldCA9IDA7Ci0JfQogCiAJcmV0dXJuIHJldDsKLQogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBmc2lfZGFpX29wcyA9IHsKQEAgLTEwOTcsMTYgKzExMzgsMTQgQEAKIAogc3RhdGljIHNuZF9wY21fdWZyYW1lc190IGZzaV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IGZzaV9wcml2ICpmc2kgPSBmc2lfZ2V0X3ByaXYoc3Vic3RyZWFtKTsKIAlzdHJ1Y3QgZnNpX3N0cmVhbSAqaW8gPSBmc2lfZ2V0X3N0cmVhbShmc2ksIGZzaV9pc19wbGF5KHN1YnN0cmVhbSkpOwotCWxvbmcgbG9jYXRpb247CisJaW50IHNhbXBsZXNfcG9zID0gaW8tPmJ1ZmZfc2FtcGxlX3BvcyAtIDE7CiAKLQlsb2NhdGlvbiA9IChpby0+YnVmZl9vZmZzZXQgLSAxKTsKLQlpZiAobG9jYXRpb24gPCAwKQotCQlsb2NhdGlvbiA9IDA7CisJaWYgKHNhbXBsZXNfcG9zIDwgMCkKKwkJc2FtcGxlc19wb3MgPSAwOwogCi0JcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBsb2NhdGlvbik7CisJcmV0dXJuIGZzaV9zYW1wbGUyZnJhbWUoZnNpLCBzYW1wbGVzX3Bvcyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgZnNpX3BjbV9vcHMgPSB7CkBAIC0xMTI5LDEwICsxMTY4LDEwIEBACiAJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7CiB9CiAKLXN0YXRpYyBpbnQgZnNpX3BjbV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLAotCQkgICAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCSAgICAgICBzdHJ1Y3Qgc25kX3BjbSAqcGNtKQorc3RhdGljIGludCBmc2lfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogeworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKKwogCS8qCiAJICogZG9udCB1c2UgU05EUlZfRE1BX1RZUEVfREVWLCBzaW5jZSBpdCB3aWxsIG9vcHMgdGhlIFNIIGtlcm5lbAogCSAqIGluIE1NQVAgbW9kZSAoaS5lLiBhcGxheSAtTSkKQEAgLTEyNDYsOCArMTI4NSw2IEBACiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIG1hc3Rlcik7CiAKLQlmc2lfbW9kdWxlX2luaXQobWFzdGVyLCAmcGRldi0+ZGV2KTsKLQogCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgJmZzaV9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCiAJCQkgIGlkX2VudHJ5LT5uYW1lLCBtYXN0ZXIpOwogCWlmIChyZXQpIHsKQEAgLTEyOTAsOCArMTMyNyw2IEBACiAKIAltYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CiAKLQlmc2lfbW9kdWxlX2tpbGwobWFzdGVyLCAmcGRldi0+ZGV2KTsKLQogCWZyZWVfaXJxKG1hc3Rlci0+aXJxLCBtYXN0ZXIpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIApAQCAtMTMwNSw1MyArMTM0MCw0MyBAQAogfQogCiBzdGF0aWMgdm9pZCBfX2ZzaV9zdXNwZW5kKHN0cnVjdCBmc2lfcHJpdiAqZnNpLAotCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgIHNldF9yYXRlX2Z1bmMgc2V0X3JhdGUpCisJCQkgIGludCBpc19wbGF5LAorCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JZnNpLT5zYXZlZF9kb19mbXQJPSBmc2lfcmVnX3JlYWQoZnNpLCBET19GTVQpOwotCWZzaS0+c2F2ZWRfZGlfZm10CT0gZnNpX3JlZ19yZWFkKGZzaSwgRElfRk1UKTsKLQlmc2ktPnNhdmVkX2NrZzEJCT0gZnNpX3JlZ19yZWFkKGZzaSwgQ0tHMSk7Ci0JZnNpLT5zYXZlZF9ja2cyCQk9IGZzaV9yZWdfcmVhZChmc2ksIENLRzIpOwotCWZzaS0+c2F2ZWRfb3V0X3NlbAk9IGZzaV9yZWdfcmVhZChmc2ksIE9VVF9TRUwpOworCWlmICghZnNpX3N0cmVhbV9pc193b3JraW5nKGZzaSwgaXNfcGxheSkpCisJCXJldHVybjsKIAotCWlmIChmc2lfaXNfY2xrX21hc3Rlcihmc2kpKQotCQlzZXRfcmF0ZShkZXYsIGZzaV9pc19wb3J0X2EoZnNpKSwgZnNpLT5yYXRlLCAwKTsKKwlmc2lfcG9ydF9zdG9wKGZzaSwgaXNfcGxheSk7CisJZnNpX2h3X3NodXRkb3duKGZzaSwgaXNfcGxheSwgZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgX19mc2lfcmVzdW1lKHN0cnVjdCBmc2lfcHJpdiAqZnNpLAotCQkJIHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSBzZXRfcmF0ZV9mdW5jIHNldF9yYXRlKQorCQkJIGludCBpc19wbGF5LAorCQkJIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlmc2lfcmVnX3dyaXRlKGZzaSwgRE9fRk1ULAlmc2ktPnNhdmVkX2RvX2ZtdCk7Ci0JZnNpX3JlZ193cml0ZShmc2ksIERJX0ZNVCwJZnNpLT5zYXZlZF9kaV9mbXQpOwotCWZzaV9yZWdfd3JpdGUoZnNpLCBDS0cxLAlmc2ktPnNhdmVkX2NrZzEpOwotCWZzaV9yZWdfd3JpdGUoZnNpLCBDS0cyLAlmc2ktPnNhdmVkX2NrZzIpOwotCWZzaV9yZWdfd3JpdGUoZnNpLCBPVVRfU0VMLAlmc2ktPnNhdmVkX291dF9zZWwpOworCWlmICghZnNpX3N0cmVhbV9pc193b3JraW5nKGZzaSwgaXNfcGxheSkpCisJCXJldHVybjsKIAotCWlmIChmc2lfaXNfY2xrX21hc3Rlcihmc2kpKQotCQlzZXRfcmF0ZShkZXYsIGZzaV9pc19wb3J0X2EoZnNpKSwgZnNpLT5yYXRlLCAxKTsKKwlmc2lfaHdfc3RhcnR1cChmc2ksIGlzX3BsYXksIGRldik7CisKKwlpZiAoZnNpX2lzX2Nsa19tYXN0ZXIoZnNpKSAmJiBmc2ktPnJhdGUpCisJCWZzaV9zZXRfbWFzdGVyX2NsayhkZXYsIGZzaSwgZnNpLT5yYXRlLCAxKTsKKworCWZzaV9wb3J0X3N0YXJ0KGZzaSwgaXNfcGxheSk7CisKIH0KIAogc3RhdGljIGludCBmc2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXNldF9yYXRlX2Z1bmMgc2V0X3JhdGUgPSBmc2lfZ2V0X2luZm9fc2V0X3JhdGUobWFzdGVyKTsKKwlzdHJ1Y3QgZnNpX3ByaXYgKmZzaWEgPSAmbWFzdGVyLT5mc2lhOworCXN0cnVjdCBmc2lfcHJpdiAqZnNpYiA9ICZtYXN0ZXItPmZzaWI7CiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CisJX19mc2lfc3VzcGVuZChmc2lhLCAxLCBkZXYpOworCV9fZnNpX3N1c3BlbmQoZnNpYSwgMCwgZGV2KTsKIAotCV9fZnNpX3N1c3BlbmQoJm1hc3Rlci0+ZnNpYSwgZGV2LCBzZXRfcmF0ZSk7Ci0JX19mc2lfc3VzcGVuZCgmbWFzdGVyLT5mc2liLCBkZXYsIHNldF9yYXRlKTsKLQotCW1hc3Rlci0+c2F2ZWRfYV9tY2xrCT0gZnNpX2NvcmVfcmVhZChtYXN0ZXIsIGFfbWNsayk7Ci0JbWFzdGVyLT5zYXZlZF9iX21jbGsJPSBmc2lfY29yZV9yZWFkKG1hc3RlciwgYl9tY2xrKTsKLQltYXN0ZXItPnNhdmVkX2llbXNrCT0gZnNpX2NvcmVfcmVhZChtYXN0ZXIsIGllbXNrKTsKLQltYXN0ZXItPnNhdmVkX2ltc2sJPSBmc2lfY29yZV9yZWFkKG1hc3RlciwgaW1zayk7Ci0JbWFzdGVyLT5zYXZlZF9jbGtfcnN0CT0gZnNpX21hc3Rlcl9yZWFkKG1hc3RlciwgQ0xLX1JTVCk7Ci0JbWFzdGVyLT5zYXZlZF9zb2Z0X3JzdAk9IGZzaV9tYXN0ZXJfcmVhZChtYXN0ZXIsIFNPRlRfUlNUKTsKLQotCWZzaV9tb2R1bGVfa2lsbChtYXN0ZXIsIGRldik7Ci0KLQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CisJX19mc2lfc3VzcGVuZChmc2liLCAxLCBkZXYpOworCV9fZnNpX3N1c3BlbmQoZnNpYiwgMCwgZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTM1OSwyMyArMTM4NCwxNCBAQAogc3RhdGljIGludCBmc2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZnNpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc2V0X3JhdGVfZnVuYyBzZXRfcmF0ZSA9IGZzaV9nZXRfaW5mb19zZXRfcmF0ZShtYXN0ZXIpOworCXN0cnVjdCBmc2lfcHJpdiAqZnNpYSA9ICZtYXN0ZXItPmZzaWE7CisJc3RydWN0IGZzaV9wcml2ICpmc2liID0gJm1hc3Rlci0+ZnNpYjsKIAotCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKwlfX2ZzaV9yZXN1bWUoZnNpYSwgMSwgZGV2KTsKKwlfX2ZzaV9yZXN1bWUoZnNpYSwgMCwgZGV2KTsKIAotCWZzaV9tb2R1bGVfaW5pdChtYXN0ZXIsIGRldik7Ci0KLQlmc2lfbWFzdGVyX21hc2tfc2V0KG1hc3RlciwgU09GVF9SU1QsIDB4ZmZmZiwgbWFzdGVyLT5zYXZlZF9zb2Z0X3JzdCk7Ci0JZnNpX21hc3Rlcl9tYXNrX3NldChtYXN0ZXIsIENMS19SU1QsIDB4ZmZmZiwgbWFzdGVyLT5zYXZlZF9jbGtfcnN0KTsKLQlmc2lfY29yZV9tYXNrX3NldChtYXN0ZXIsIGFfbWNsaywgMHhmZmZmLCBtYXN0ZXItPnNhdmVkX2FfbWNsayk7Ci0JZnNpX2NvcmVfbWFza19zZXQobWFzdGVyLCBiX21jbGssIDB4ZmZmZiwgbWFzdGVyLT5zYXZlZF9iX21jbGspOwotCWZzaV9jb3JlX21hc2tfc2V0KG1hc3RlciwgaWVtc2ssIDB4ZmZmZiwgbWFzdGVyLT5zYXZlZF9pZW1zayk7Ci0JZnNpX2NvcmVfbWFza19zZXQobWFzdGVyLCBpbXNrLCAweGZmZmYsIG1hc3Rlci0+c2F2ZWRfaW1zayk7Ci0KLQlfX2ZzaV9yZXN1bWUoJm1hc3Rlci0+ZnNpYSwgZGV2LCBzZXRfcmF0ZSk7Ci0JX19mc2lfcmVzdW1lKCZtYXN0ZXItPmZzaWIsIGRldiwgc2V0X3JhdGUpOwotCi0JcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOworCV9fZnNpX3Jlc3VtZShmc2liLCAxLCBkZXYpOworCV9fZnNpX3Jlc3VtZShmc2liLCAwLCBkZXYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvc2l1X3BjbS5jIGIvc291bmQvc29jL3NoL3NpdV9wY20uYwppbmRleCBhNDIzYmFiLi5mOGY2ODE2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvc2l1X3BjbS5jCisrKyBiL3NvdW5kL3NvYy9zaC9zaXVfcGNtLmMKQEAgLTUyNywxMCArNTI3LDExIEBACiAJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzcy0+cnVudGltZSwgcHRyKTsKIH0KIAotc3RhdGljIGludCBzaXVfcGNtX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkgICAgICAgc3RydWN0IHNuZF9wY20gKnBjbSkKK3N0YXRpYyBpbnQgc2l1X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAkvKiBjYXJkLT5kZXYgPT0gc29jZGV2LT5kZXYsIHNlZSBzbmRfc29jX25ld19wY21zKCkgKi8KKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKIAlzdHJ1Y3Qgc2l1X2luZm8gKmluZm8gPSBzaXVfaTJzX2RhdGE7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShjYXJkLT5kZXYpOwogCWludCByZXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNhY2hlLmMgYi9zb3VuZC9zb2Mvc29jLWNhY2hlLmMKaW5kZXggMDZiN2I4MS4uZDlmOGFkZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1jYWNoZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY2FjaGUuYwpAQCAtMjAsNDI1ICsyMCw2IEBACiAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYXNvYy5oPgogCi0jaWZkZWYgQ09ORklHX1NQSV9NQVNURVIKLXN0YXRpYyBpbnQgZG9fc3BpX3dyaXRlKHZvaWQgKmNvbnRyb2wsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IGNvbnRyb2w7Ci0JaW50IHJldDsKLQotCXJldCA9IHNwaV93cml0ZShzcGksIGRhdGEsIGxlbik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gbGVuOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZG9faHdfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAotCQkgICAgICAgdW5zaWduZWQgaW50IHZhbHVlLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKQotewotCWludCByZXQ7Ci0KLQlpZiAoIXNuZF9zb2NfY29kZWNfdm9sYXRpbGVfcmVnaXN0ZXIoY29kZWMsIHJlZykgJiYKLQkgICAgcmVnIDwgY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUgJiYKLQkgICAgIWNvZGVjLT5jYWNoZV9ieXBhc3MpIHsKLQkJcmV0ID0gc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgcmVnLCB2YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChjb2RlYy0+Y2FjaGVfb25seSkgewotCQljb2RlYy0+Y2FjaGVfc3luYyA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldCA9IGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCBsZW4pOwotCWlmIChyZXQgPT0gbGVuKQotCQlyZXR1cm4gMDsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQllbHNlCi0JCXJldHVybiAtRUlPOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGRvX2h3X3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQotCWlmIChyZWcgPj0gY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUgfHwKLQkgICAgc25kX3NvY19jb2RlY192b2xhdGlsZV9yZWdpc3Rlcihjb2RlYywgcmVnKSB8fAotCSAgICBjb2RlYy0+Y2FjaGVfYnlwYXNzKSB7Ci0JCWlmIChjb2RlYy0+Y2FjaGVfb25seSkKLQkJCXJldHVybiAtMTsKLQotCQlCVUdfT04oIWNvZGVjLT5od19yZWFkKTsKLQkJcmV0dXJuIGNvZGVjLT5od19yZWFkKGNvZGVjLCByZWcpOwotCX0KLQotCXJldCA9IHNuZF9zb2NfY2FjaGVfcmVhZChjb2RlYywgcmVnLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY180XzEyX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCByZWcpCi17Ci0JcmV0dXJuIGRvX2h3X3JlYWQoY29kZWMsIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvY180XzEyX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKLQkJCSAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKLXsKLQl1MTYgZGF0YTsKLQotCWRhdGEgPSBjcHVfdG9fYmUxNigocmVnIDw8IDEyKSB8ICh2YWx1ZSAmIDB4ZmZmZmZmKSk7Ci0KLQlyZXR1cm4gZG9faHdfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUsICZkYXRhLCAyKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jXzdfOV9yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICAgIHVuc2lnbmVkIGludCByZWcpCi17Ci0JcmV0dXJuIGRvX2h3X3JlYWQoY29kZWMsIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvY183Xzlfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAotCQkJICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTggZGF0YVsyXTsKLQotCWRhdGFbMF0gPSAocmVnIDw8IDEpIHwgKCh2YWx1ZSA+PiA4KSAmIDB4MDAwMSk7Ci0JZGF0YVsxXSA9IHZhbHVlICYgMHgwMGZmOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCBkYXRhLCAyKTsKLX0KLQotc3RhdGljIGludCBzbmRfc29jXzhfOF93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCi0JCQkgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKLXsKLQl1OCBkYXRhWzJdOwotCi0JcmVnICY9IDB4ZmY7Ci0JZGF0YVswXSA9IHJlZzsKLQlkYXRhWzFdID0gdmFsdWUgJiAweGZmOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCBkYXRhLCAyKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jXzhfOF9yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICAgIHVuc2lnbmVkIGludCByZWcpCi17Ci0JcmV0dXJuIGRvX2h3X3JlYWQoY29kZWMsIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvY184XzE2X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKLQkJCSAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKLXsKLQl1OCBkYXRhWzNdOwotCi0JZGF0YVswXSA9IHJlZzsKLQlkYXRhWzFdID0gKHZhbHVlID4+IDgpICYgMHhmZjsKLQlkYXRhWzJdID0gdmFsdWUgJiAweGZmOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCBkYXRhLCAzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jXzhfMTZfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IHJlZykKLXsKLQlyZXR1cm4gZG9faHdfcmVhZChjb2RlYywgcmVnKTsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZG9faTJjX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCXZvaWQgKnJlZywgaW50IHJlZ2xlbiwKLQkJCQl2b2lkICpkYXRhLCBpbnQgZGF0YWxlbikKLXsKLQlzdHJ1Y3QgaTJjX21zZyB4ZmVyWzJdOwotCWludCByZXQ7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNvZGVjLT5jb250cm9sX2RhdGE7Ci0KLQkvKiBXcml0ZSByZWdpc3RlciAqLwotCXhmZXJbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKLQl4ZmVyWzBdLmZsYWdzID0gMDsKLQl4ZmVyWzBdLmxlbiA9IHJlZ2xlbjsKLQl4ZmVyWzBdLmJ1ZiA9IHJlZzsKLQotCS8qIFJlYWQgZGF0YSAqLwotCXhmZXJbMV0uYWRkciA9IGNsaWVudC0+YWRkcjsKLQl4ZmVyWzFdLmZsYWdzID0gSTJDX01fUkQ7Ci0JeGZlclsxXS5sZW4gPSBkYXRhbGVuOwotCXhmZXJbMV0uYnVmID0gZGF0YTsKLQotCXJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIHhmZXIsIDIpOwotCWlmIChyZXQgPT0gMikKLQkJcmV0dXJuIDA7Ci0JZWxzZSBpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQllbHNlCi0JCXJldHVybiAtRUlPOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IChkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCi1zdGF0aWMgdW5zaWduZWQgaW50IHNuZF9zb2NfOF84X3JlYWRfaTJjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJIHVuc2lnbmVkIGludCByKQotewotCXU4IHJlZyA9IHI7Ci0JdTggZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG9faTJjX3JlYWQoY29kZWMsICZyZWcsIDEsICZkYXRhLCAxKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0jZWxzZQotI2RlZmluZSBzbmRfc29jXzhfOF9yZWFkX2kyYyBOVUxMCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY184XzE2X3JlYWRfaTJjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJICB1bnNpZ25lZCBpbnQgcikKLXsKLQl1OCByZWcgPSByOwotCXUxNiBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSBkb19pMmNfcmVhZChjb2RlYywgJnJlZywgMSwgJmRhdGEsIDIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gKGRhdGEgPj4gOCkgfCAoKGRhdGEgJiAweGZmKSA8PCA4KTsKLX0KLSNlbHNlCi0jZGVmaW5lIHNuZF9zb2NfOF8xNl9yZWFkX2kyYyBOVUxMCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY18xNl84X3JlYWRfaTJjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJICB1bnNpZ25lZCBpbnQgcikKLXsKLQl1MTYgcmVnID0gcjsKLQl1OCBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSBkb19pMmNfcmVhZChjb2RlYywgJnJlZywgMiwgJmRhdGEsIDEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gZGF0YTsKLX0KLSNlbHNlCi0jZGVmaW5lIHNuZF9zb2NfMTZfOF9yZWFkX2kyYyBOVUxMCi0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jXzE2XzhfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IHJlZykKLXsKLQlyZXR1cm4gZG9faHdfcmVhZChjb2RlYywgcmVnKTsKLX0KLQotc3RhdGljIGludCBzbmRfc29jXzE2Xzhfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAotCQkJICAgICAgdW5zaWduZWQgaW50IHZhbHVlKQotewotCXU4IGRhdGFbM107Ci0KLQlkYXRhWzBdID0gKHJlZyA+PiA4KSAmIDB4ZmY7Ci0JZGF0YVsxXSA9IHJlZyAmIDB4ZmY7Ci0JZGF0YVsyXSA9IHZhbHVlOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCBkYXRhLCAzKTsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY18xNl8xNl9yZWFkX2kyYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgIHVuc2lnbmVkIGludCByKQotewotCXUxNiByZWcgPSBjcHVfdG9fYmUxNihyKTsKLQl1MTYgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG9faTJjX3JlYWQoY29kZWMsICZyZWcsIDIsICZkYXRhLCAyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGJlMTZfdG9fY3B1KGRhdGEpOwotfQotI2Vsc2UKLSNkZWZpbmUgc25kX3NvY18xNl8xNl9yZWFkX2kyYyBOVUxMCi0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jXzE2XzE2X3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVnKQotewotCXJldHVybiBkb19od19yZWFkKGNvZGVjLCByZWcpOwotfQotCi1zdGF0aWMgaW50IHNuZF9zb2NfMTZfMTZfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAotCQkJICAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKLXsKLQl1OCBkYXRhWzRdOwotCi0JZGF0YVswXSA9IChyZWcgPj4gOCkgJiAweGZmOwotCWRhdGFbMV0gPSByZWcgJiAweGZmOwotCWRhdGFbMl0gPSAodmFsdWUgPj4gOCkgJiAweGZmOwotCWRhdGFbM10gPSB2YWx1ZSAmIDB4ZmY7Ci0KLQlyZXR1cm4gZG9faHdfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUsIGRhdGEsIDQpOwotfQotCi0vKiBQcmltaXRpdmUgYnVsayB3cml0ZSBzdXBwb3J0IGZvciBzb2MtY2FjaGUuICBUaGUgZGF0YSBwb2ludGVkIHRvIGJ5Ci0gKiBgZGF0YScgbmVlZHMgdG8gYWxyZWFkeSBiZSBpbiB0aGUgZm9ybSB0aGUgaGFyZHdhcmUgZXhwZWN0cwotICogaW5jbHVkaW5nIGFueSBsZWFkaW5nIHJlZ2lzdGVyIHNwZWNpZmljIGRhdGEuICBBbnkgZGF0YSB3cml0dGVuCi0gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZ28gdGhyb3VnaCB0aGUgY2FjaGUgYXMgaXQgb25seQotICogaGFuZGxlcyB3cml0aW5nIHRvIHZvbGF0aWxlIG9yIG91dCBvZiBib3VuZHMgcmVnaXN0ZXJzLgotICovCi1zdGF0aWMgaW50IHNuZF9zb2NfaHdfYnVsa193cml0ZV9yYXcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAotCQkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKLXsKLQlpbnQgcmV0OwotCi0JLyogVG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgZ2V0IG91dCBvZiBzeW5jIHdpdGggdGhlIGNhY2hlLCBjaGVjawotCSAqIHdoZXRoZXIgdGhlIGJhc2UgcmVnaXN0ZXIgaXMgdm9sYXRpbGUgb3IgaWYgd2UndmUgZGlyZWN0bHkgYXNrZWQKLQkgKiB0byBieXBhc3MgdGhlIGNhY2hlLiAgT3V0IG9mIGJvdW5kcyByZWdpc3RlcnMgYXJlIGNvbnNpZGVyZWQKLQkgKiB2b2xhdGlsZS4KLQkgKi8KLQlpZiAoIWNvZGVjLT5jYWNoZV9ieXBhc3MKLQkgICAgJiYgIXNuZF9zb2NfY29kZWNfdm9sYXRpbGVfcmVnaXN0ZXIoY29kZWMsIHJlZykKLQkgICAgJiYgcmVnIDwgY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoIChjb2RlYy0+Y29udHJvbF90eXBlKSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCAoZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQotCWNhc2UgU05EX1NPQ19JMkM6Ci0JCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCBsZW4pOwotCQlicmVhazsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCi0JY2FzZSBTTkRfU09DX1NQSToKLQkJcmV0ID0gc3BpX3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIGxlbik7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0JaWYgKHJldCA9PSBsZW4pCi0JCXJldHVybiAwOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCWVsc2UKLQkJcmV0dXJuIC1FSU87Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCWludCBhZGRyX2JpdHM7Ci0JaW50IGRhdGFfYml0czsKLQlpbnQgKCp3cml0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci0JdW5zaWduZWQgaW50ICgqcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKLQl1bnNpZ25lZCBpbnQgKCppMmNfcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKLX0gaW9fdHlwZXNbXSA9IHsKLQl7Ci0JCS5hZGRyX2JpdHMgPSA0LCAuZGF0YV9iaXRzID0gMTIsCi0JCS53cml0ZSA9IHNuZF9zb2NfNF8xMl93cml0ZSwgLnJlYWQgPSBzbmRfc29jXzRfMTJfcmVhZCwKLQl9LAotCXsKLQkJLmFkZHJfYml0cyA9IDcsIC5kYXRhX2JpdHMgPSA5LAotCQkud3JpdGUgPSBzbmRfc29jXzdfOV93cml0ZSwgLnJlYWQgPSBzbmRfc29jXzdfOV9yZWFkLAotCX0sCi0JewotCQkuYWRkcl9iaXRzID0gOCwgLmRhdGFfYml0cyA9IDgsCi0JCS53cml0ZSA9IHNuZF9zb2NfOF84X3dyaXRlLCAucmVhZCA9IHNuZF9zb2NfOF84X3JlYWQsCi0JCS5pMmNfcmVhZCA9IHNuZF9zb2NfOF84X3JlYWRfaTJjLAotCX0sCi0JewotCQkuYWRkcl9iaXRzID0gOCwgLmRhdGFfYml0cyA9IDE2LAotCQkud3JpdGUgPSBzbmRfc29jXzhfMTZfd3JpdGUsIC5yZWFkID0gc25kX3NvY184XzE2X3JlYWQsCi0JCS5pMmNfcmVhZCA9IHNuZF9zb2NfOF8xNl9yZWFkX2kyYywKLQl9LAotCXsKLQkJLmFkZHJfYml0cyA9IDE2LCAuZGF0YV9iaXRzID0gOCwKLQkJLndyaXRlID0gc25kX3NvY18xNl84X3dyaXRlLCAucmVhZCA9IHNuZF9zb2NfMTZfOF9yZWFkLAotCQkuaTJjX3JlYWQgPSBzbmRfc29jXzE2XzhfcmVhZF9pMmMsCi0JfSwKLQl7Ci0JCS5hZGRyX2JpdHMgPSAxNiwgLmRhdGFfYml0cyA9IDE2LAotCQkud3JpdGUgPSBzbmRfc29jXzE2XzE2X3dyaXRlLCAucmVhZCA9IHNuZF9zb2NfMTZfMTZfcmVhZCwKLQkJLmkyY19yZWFkID0gc25kX3NvY18xNl8xNl9yZWFkX2kyYywKLQl9LAotfTsKLQotLyoqCi0gKiBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbzogU2V0IHVwIHN0YW5kYXJkIEkvTyBmdW5jdGlvbnMuCi0gKgotICogQGNvZGVjOiBDT0RFQyB0byBjb25maWd1cmUuCi0gKiBAYWRkcl9iaXRzOiBOdW1iZXIgb2YgYml0cyBvZiByZWdpc3RlciBhZGRyZXNzIGRhdGEuCi0gKiBAZGF0YV9iaXRzOiBOdW1iZXIgb2YgYml0cyBvZiBkYXRhIHBlciByZWdpc3Rlci4KLSAqIEBjb250cm9sOiBDb250cm9sIGJ1cyB1c2VkLgotICoKLSAqIFJlZ2lzdGVyIGZvcm1hdHMgYXJlIGZyZXF1ZW50bHkgc2hhcmVkIGJldHdlZW4gbWFueSBJMkMgYW5kIFNQSQotICogZGV2aWNlcy4gIEluIG9yZGVyIHRvIHByb21vdGUgY29kZSByZXVzZSB0aGUgQVNvQyBjb3JlIHByb3ZpZGVzCi0gKiBzb21lIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBvZiBDT0RFQyByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zCi0gKiB3aGljaCBjYW4gYmUgc2V0IHVwIHVzaW5nIHRoaXMgZnVuY3Rpb24uCi0gKgotICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyBhbmQgaW5pdGlhbGlzaW5nIHRoZQotICogYWN0dWFsIGNhY2hlLgotICoKLSAqIE5vdGUgdGhhdCBhdCBwcmVzZW50IHRoaXMgY29kZSBjYW5ub3QgYmUgdXNlZCBieSBDT0RFQ3Mgd2l0aAotICogdm9sYXRpbGUgcmVnaXN0ZXJzLgotICovCi1pbnQgc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgICAgIGludCBhZGRyX2JpdHMsIGludCBkYXRhX2JpdHMsCi0JCQkgICAgICAgZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW9fdHlwZXMpOyBpKyspCi0JCWlmIChpb190eXBlc1tpXS5hZGRyX2JpdHMgPT0gYWRkcl9iaXRzICYmCi0JCSAgICBpb190eXBlc1tpXS5kYXRhX2JpdHMgPT0gZGF0YV9iaXRzKQotCQkJYnJlYWs7Ci0JaWYgKGkgPT0gQVJSQVlfU0laRShpb190eXBlcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiTm8gSS9PIGZ1bmN0aW9ucyBmb3IgJWQgYml0IGFkZHJlc3MgJWQgYml0IGRhdGFcbiIsCi0JCSAgICAgICBhZGRyX2JpdHMsIGRhdGFfYml0cyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNvZGVjLT53cml0ZSA9IGlvX3R5cGVzW2ldLndyaXRlOwotCWNvZGVjLT5yZWFkID0gaW9fdHlwZXNbaV0ucmVhZDsKLQljb2RlYy0+YnVsa193cml0ZV9yYXcgPSBzbmRfc29jX2h3X2J1bGtfd3JpdGVfcmF3OwotCi0Jc3dpdGNoIChjb250cm9sKSB7Ci0JY2FzZSBTTkRfU09DX0NVU1RPTToKLQkJYnJlYWs7Ci0KLQljYXNlIFNORF9TT0NfSTJDOgotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLQkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOwotI2VuZGlmCi0JCWlmIChpb190eXBlc1tpXS5pMmNfcmVhZCkKLQkJCWNvZGVjLT5od19yZWFkID0gaW9fdHlwZXNbaV0uaTJjX3JlYWQ7Ci0KLQkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNvbnRhaW5lcl9vZihjb2RlYy0+ZGV2LAotCQkJCQkJICAgc3RydWN0IGkyY19jbGllbnQsCi0JCQkJCQkgICBkZXYpOwotCQlicmVhazsKLQotCWNhc2UgU05EX1NPQ19TUEk6Ci0jaWZkZWYgQ09ORklHX1NQSV9NQVNURVIKLQkJY29kZWMtPmh3X3dyaXRlID0gZG9fc3BpX3dyaXRlOwotI2VuZGlmCi0KLQkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNvbnRhaW5lcl9vZihjb2RlYy0+ZGV2LAotCQkJCQkJICAgc3RydWN0IHNwaV9kZXZpY2UsCi0JCQkJCQkgICBkZXYpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKTsKLQogc3RhdGljIGJvb2wgc25kX3NvY19zZXRfY2FjaGVfdmFsKHZvaWQgKmJhc2UsIHVuc2lnbmVkIGludCBpZHgsCiAJCQkJICB1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgd29yZF9zaXplKQogewpAQCAtNDY2LDYgKzQ3LDkgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY19nZXRfY2FjaGVfdmFsKGNvbnN0IHZvaWQgKmJhc2UsIHVuc2lnbmVkIGludCBpZHgsCiAJCXVuc2lnbmVkIGludCB3b3JkX3NpemUpCiB7CisJaWYgKCFiYXNlKQorCQlyZXR1cm4gLTE7CisKIAlzd2l0Y2ggKHdvcmRfc2l6ZSkgewogCWNhc2UgMTogewogCQljb25zdCB1OCAqY2FjaGUgPSBiYXNlOwpAQCAtNDgzLDMxICs2Nyw4NiBAQAogfQogCiBzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfbm9kZSB7Ci0Jc3RydWN0IHJiX25vZGUgbm9kZTsKLQl1bnNpZ25lZCBpbnQgcmVnOwotCXVuc2lnbmVkIGludCB2YWx1ZTsKLQl1bnNpZ25lZCBpbnQgZGVmdmFsOworCXN0cnVjdCByYl9ub2RlIG5vZGU7IC8qIHRoZSBhY3R1YWwgcmJ0cmVlIG5vZGUgaG9sZGluZyB0aGlzIGJsb2NrICovCisJdW5zaWduZWQgaW50IGJhc2VfcmVnOyAvKiBiYXNlIHJlZ2lzdGVyIGhhbmRsZWQgYnkgdGhpcyBibG9jayAqLworCXVuc2lnbmVkIGludCB3b3JkX3NpemU7IC8qIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSByZWdpc3RlciBpbmRleCAqLworCXZvaWQgKmJsb2NrOyAvKiBibG9jayBvZiBhZGphY2VudCByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBpbnQgYmxrbGVuOyAvKiBudW1iZXIgb2YgcmVnaXN0ZXJzIGF2YWlsYWJsZSBpbiB0aGUgYmxvY2sgKi8KIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfY3R4IHsKIAlzdHJ1Y3QgcmJfcm9vdCByb290OworCXN0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlICpjYWNoZWRfcmJub2RlOwogfTsKIAorc3RhdGljIGlubGluZSB2b2lkIHNuZF9zb2NfcmJ0cmVlX2dldF9iYXNlX3RvcF9yZWcoCisJc3RydWN0IHNuZF9zb2NfcmJ0cmVlX25vZGUgKnJibm9kZSwKKwl1bnNpZ25lZCBpbnQgKmJhc2UsIHVuc2lnbmVkIGludCAqdG9wKQoreworCSpiYXNlID0gcmJub2RlLT5iYXNlX3JlZzsKKwkqdG9wID0gcmJub2RlLT5iYXNlX3JlZyArIHJibm9kZS0+YmxrbGVuIC0gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jX3JidHJlZV9nZXRfcmVnaXN0ZXIoCisJc3RydWN0IHNuZF9zb2NfcmJ0cmVlX25vZGUgKnJibm9kZSwgdW5zaWduZWQgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJc3dpdGNoIChyYm5vZGUtPndvcmRfc2l6ZSkgeworCWNhc2UgMTogeworCQl1OCAqcCA9IHJibm9kZS0+YmxvY2s7CisJCXZhbCA9IHBbaWR4XTsKKwkJcmV0dXJuIHZhbDsKKwl9CisJY2FzZSAyOiB7CisJCXUxNiAqcCA9IHJibm9kZS0+YmxvY2s7CisJCXZhbCA9IHBbaWR4XTsKKwkJcmV0dXJuIHZhbDsKKwl9CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9zb2NfcmJ0cmVlX3NldF9yZWdpc3RlcihzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfbm9kZSAqcmJub2RlLAorCQkJCQl1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXN3aXRjaCAocmJub2RlLT53b3JkX3NpemUpIHsKKwljYXNlIDE6IHsKKwkJdTggKnAgPSByYm5vZGUtPmJsb2NrOworCQlwW2lkeF0gPSB2YWw7CisJCWJyZWFrOworCX0KKwljYXNlIDI6IHsKKwkJdTE2ICpwID0gcmJub2RlLT5ibG9jazsKKwkJcFtpZHhdID0gdmFsOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIHN0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlICpzbmRfc29jX3JidHJlZV9sb29rdXAoCiAJc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGludCByZWcpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CiAJc3RydWN0IHNuZF9zb2NfcmJ0cmVlX25vZGUgKnJibm9kZTsKKwl1bnNpZ25lZCBpbnQgYmFzZV9yZWcsIHRvcF9yZWc7CiAKIAlub2RlID0gcm9vdC0+cmJfbm9kZTsKIAl3aGlsZSAobm9kZSkgewogCQlyYm5vZGUgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IHNuZF9zb2NfcmJ0cmVlX25vZGUsIG5vZGUpOwotCQlpZiAocmJub2RlLT5yZWcgPCByZWcpCi0JCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAocmJub2RlLT5yZWcgPiByZWcpCi0JCQlub2RlID0gbm9kZS0+cmJfcmlnaHQ7Ci0JCWVsc2UKKwkJc25kX3NvY19yYnRyZWVfZ2V0X2Jhc2VfdG9wX3JlZyhyYm5vZGUsICZiYXNlX3JlZywgJnRvcF9yZWcpOworCQlpZiAocmVnID49IGJhc2VfcmVnICYmIHJlZyA8PSB0b3BfcmVnKQogCQkJcmV0dXJuIHJibm9kZTsKKwkJZWxzZSBpZiAocmVnID4gdG9wX3JlZykKKwkJCW5vZGUgPSBub2RlLT5yYl9yaWdodDsKKwkJZWxzZSBpZiAocmVnIDwgYmFzZV9yZWcpCisJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTUxOCwxOSArMTU3LDI4IEBACiB7CiAJc3RydWN0IHJiX25vZGUgKipuZXcsICpwYXJlbnQ7CiAJc3RydWN0IHNuZF9zb2NfcmJ0cmVlX25vZGUgKnJibm9kZV90bXA7CisJdW5zaWduZWQgaW50IGJhc2VfcmVnX3RtcCwgdG9wX3JlZ190bXA7CisJdW5zaWduZWQgaW50IGJhc2VfcmVnOwogCiAJcGFyZW50ID0gTlVMTDsKIAluZXcgPSAmcm9vdC0+cmJfbm9kZTsKIAl3aGlsZSAoKm5ldykgewogCQlyYm5vZGVfdG1wID0gY29udGFpbmVyX29mKCpuZXcsIHN0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlLAogCQkJCQkgIG5vZGUpOworCQkvKiBiYXNlIGFuZCB0b3AgcmVnaXN0ZXJzIG9mIHRoZSBjdXJyZW50IHJibm9kZSAqLworCQlzbmRfc29jX3JidHJlZV9nZXRfYmFzZV90b3BfcmVnKHJibm9kZV90bXAsICZiYXNlX3JlZ190bXAsCisJCQkJCQkmdG9wX3JlZ190bXApOworCQkvKiBiYXNlIHJlZ2lzdGVyIG9mIHRoZSByYm5vZGUgdG8gYmUgYWRkZWQgKi8KKwkJYmFzZV9yZWcgPSByYm5vZGUtPmJhc2VfcmVnOwogCQlwYXJlbnQgPSAqbmV3OwotCQlpZiAocmJub2RlX3RtcC0+cmVnIDwgcmJub2RlLT5yZWcpCi0JCQluZXcgPSAmKCgqbmV3KS0+cmJfbGVmdCk7Ci0JCWVsc2UgaWYgKHJibm9kZV90bXAtPnJlZyA+IHJibm9kZS0+cmVnKQotCQkJbmV3ID0gJigoKm5ldyktPnJiX3JpZ2h0KTsKLQkJZWxzZQorCQkvKiBpZiB0aGlzIHJlZ2lzdGVyIGhhcyBhbHJlYWR5IGJlZW4gaW5zZXJ0ZWQsIGp1c3QgcmV0dXJuICovCisJCWlmIChiYXNlX3JlZyA+PSBiYXNlX3JlZ190bXAgJiYKKwkJICAgIGJhc2VfcmVnIDw9IHRvcF9yZWdfdG1wKQogCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKGJhc2VfcmVnID4gdG9wX3JlZ190bXApCisJCQluZXcgPSAmKCgqbmV3KS0+cmJfcmlnaHQpOworCQllbHNlIGlmIChiYXNlX3JlZyA8IGJhc2VfcmVnX3RtcCkKKwkJCW5ldyA9ICYoKCpuZXcpLT5yYl9sZWZ0KTsKIAl9CiAKIAkvKiBpbnNlcnQgdGhlIG5vZGUgaW50byB0aGUgcmJ0cmVlICovCkBAIC01NDUsNTggKzE5MywxNDYgQEAKIAlzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfY3R4ICpyYnRyZWVfY3R4OwogCXN0cnVjdCByYl9ub2RlICpub2RlOwogCXN0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlICpyYm5vZGU7Ci0JdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBpbnQgcmVndG1wOworCXVuc2lnbmVkIGludCB2YWwsIGRlZjsKIAlpbnQgcmV0OworCWludCBpOwogCiAJcmJ0cmVlX2N0eCA9IGNvZGVjLT5yZWdfY2FjaGU7CiAJZm9yIChub2RlID0gcmJfZmlyc3QoJnJidHJlZV9jdHgtPnJvb3QpOyBub2RlOyBub2RlID0gcmJfbmV4dChub2RlKSkgewogCQlyYm5vZGUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfbm9kZSwgbm9kZSk7Ci0JCWlmIChyYm5vZGUtPnZhbHVlID09IHJibm9kZS0+ZGVmdmFsKQotCQkJY29udGludWU7Ci0JCVdBUk5fT04oY29kZWMtPndyaXRhYmxlX3JlZ2lzdGVyICYmCi0JCQljb2RlYy0+d3JpdGFibGVfcmVnaXN0ZXIoY29kZWMsIHJibm9kZS0+cmVnKSk7Ci0JCXJldCA9IHNuZF9zb2NfY2FjaGVfcmVhZChjb2RlYywgcmJub2RlLT5yZWcsICZ2YWwpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQkJY29kZWMtPmNhY2hlX2J5cGFzcyA9IDE7Ci0JCXJldCA9IHNuZF9zb2Nfd3JpdGUoY29kZWMsIHJibm9kZS0+cmVnLCB2YWwpOwotCQljb2RlYy0+Y2FjaGVfYnlwYXNzID0gMDsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIlN5bmNlZCByZWdpc3RlciAlI3gsIHZhbHVlID0gJSN4XG4iLAotCQkJcmJub2RlLT5yZWcsIHZhbCk7CisJCWZvciAoaSA9IDA7IGkgPCByYm5vZGUtPmJsa2xlbjsgKytpKSB7CisJCQlyZWd0bXAgPSByYm5vZGUtPmJhc2VfcmVnICsgaTsKKwkJCVdBUk5fT04oY29kZWMtPndyaXRhYmxlX3JlZ2lzdGVyICYmCisJCQkJY29kZWMtPndyaXRhYmxlX3JlZ2lzdGVyKGNvZGVjLCByZWd0bXApKTsKKwkJCXZhbCA9IHNuZF9zb2NfcmJ0cmVlX2dldF9yZWdpc3RlcihyYm5vZGUsIGkpOworCQkJZGVmID0gc25kX3NvY19nZXRfY2FjaGVfdmFsKGNvZGVjLT5yZWdfZGVmX2NvcHksIGksCisJCQkJCQkgICAgcmJub2RlLT53b3JkX3NpemUpOworCQkJaWYgKHZhbCA9PSBkZWYpCisJCQkJY29udGludWU7CisKKwkJCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAxOworCQkJcmV0ID0gc25kX3NvY193cml0ZShjb2RlYywgcmVndG1wLCB2YWwpOworCQkJY29kZWMtPmNhY2hlX2J5cGFzcyA9IDA7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJTeW5jZWQgcmVnaXN0ZXIgJSN4LCB2YWx1ZSA9ICUjeFxuIiwKKwkJCQlyZWd0bXAsIHZhbCk7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzbmRfc29jX3JidHJlZV9pbnNlcnRfdG9fYmxvY2soc3RydWN0IHNuZF9zb2NfcmJ0cmVlX25vZGUgKnJibm9kZSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJCQkgIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1OCAqYmxrOworCisJYmxrID0ga3JlYWxsb2MocmJub2RlLT5ibG9jaywKKwkJICAgICAgIChyYm5vZGUtPmJsa2xlbiArIDEpICogcmJub2RlLT53b3JkX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghYmxrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGluc2VydCB0aGUgcmVnaXN0ZXIgdmFsdWUgaW4gdGhlIGNvcnJlY3QgcGxhY2UgaW4gdGhlIHJibm9kZSBibG9jayAqLworCW1lbW1vdmUoYmxrICsgKHBvcyArIDEpICogcmJub2RlLT53b3JkX3NpemUsCisJCWJsayArIHBvcyAqIHJibm9kZS0+d29yZF9zaXplLAorCQkocmJub2RlLT5ibGtsZW4gLSBwb3MpICogcmJub2RlLT53b3JkX3NpemUpOworCisJLyogdXBkYXRlIHRoZSByYm5vZGUgYmxvY2ssIGl0cyBzaXplIGFuZCB0aGUgYmFzZSByZWdpc3RlciAqLworCXJibm9kZS0+YmxvY2sgPSBibGs7CisJcmJub2RlLT5ibGtsZW4rKzsKKwlpZiAoIXBvcykKKwkJcmJub2RlLT5iYXNlX3JlZyA9IHJlZzsKKworCXNuZF9zb2NfcmJ0cmVlX3NldF9yZWdpc3RlcihyYm5vZGUsIHBvcywgdmFsdWUpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHNuZF9zb2NfcmJ0cmVlX2NhY2hlX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCiB7CiAJc3RydWN0IHNuZF9zb2NfcmJ0cmVlX2N0eCAqcmJ0cmVlX2N0eDsKLQlzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfbm9kZSAqcmJub2RlOworCXN0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlICpyYm5vZGUsICpyYm5vZGVfdG1wOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgaW50IHJlZ190bXA7CisJdW5zaWduZWQgaW50IGJhc2VfcmVnLCB0b3BfcmVnOworCXVuc2lnbmVkIGludCBwb3M7CisJaW50IGk7CisJaW50IHJldDsKIAogCXJidHJlZV9jdHggPSBjb2RlYy0+cmVnX2NhY2hlOworCS8qIGxvb2sgdXAgdGhlIHJlcXVpcmVkIHJlZ2lzdGVyIGluIHRoZSBjYWNoZWQgcmJub2RlICovCisJcmJub2RlID0gcmJ0cmVlX2N0eC0+Y2FjaGVkX3Jibm9kZTsKKwlpZiAocmJub2RlKSB7CisJCXNuZF9zb2NfcmJ0cmVlX2dldF9iYXNlX3RvcF9yZWcocmJub2RlLCAmYmFzZV9yZWcsICZ0b3BfcmVnKTsKKwkJaWYgKHJlZyA+PSBiYXNlX3JlZyAmJiByZWcgPD0gdG9wX3JlZykgeworCQkJcmVnX3RtcCA9IHJlZyAtIGJhc2VfcmVnOworCQkJdmFsID0gc25kX3NvY19yYnRyZWVfZ2V0X3JlZ2lzdGVyKHJibm9kZSwgcmVnX3RtcCk7CisJCQlpZiAodmFsID09IHZhbHVlKQorCQkJCXJldHVybiAwOworCQkJc25kX3NvY19yYnRyZWVfc2V0X3JlZ2lzdGVyKHJibm9kZSwgcmVnX3RtcCwgdmFsdWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyogaWYgd2UgY2FuJ3QgbG9jYXRlIGl0IGluIHRoZSBjYWNoZWQgcmJub2RlIHdlJ2xsIGhhdmUKKwkgKiB0byB0cmF2ZXJzZSB0aGUgcmJ0cmVlIGxvb2tpbmcgZm9yIGl0LgorCSAqLwogCXJibm9kZSA9IHNuZF9zb2NfcmJ0cmVlX2xvb2t1cCgmcmJ0cmVlX2N0eC0+cm9vdCwgcmVnKTsKIAlpZiAocmJub2RlKSB7Ci0JCWlmIChyYm5vZGUtPnZhbHVlID09IHZhbHVlKQorCQlyZWdfdG1wID0gcmVnIC0gcmJub2RlLT5iYXNlX3JlZzsKKwkJdmFsID0gc25kX3NvY19yYnRyZWVfZ2V0X3JlZ2lzdGVyKHJibm9kZSwgcmVnX3RtcCk7CisJCWlmICh2YWwgPT0gdmFsdWUpCiAJCQlyZXR1cm4gMDsKLQkJcmJub2RlLT52YWx1ZSA9IHZhbHVlOworCQlzbmRfc29jX3JidHJlZV9zZXRfcmVnaXN0ZXIocmJub2RlLCByZWdfdG1wLCB2YWx1ZSk7CisJCXJidHJlZV9jdHgtPmNhY2hlZF9yYm5vZGUgPSByYm5vZGU7CiAJfSBlbHNlIHsKIAkJLyogYmFpbCBvdXQgZWFybHksIG5vIG5lZWQgdG8gY3JlYXRlIHRoZSByYm5vZGUgeWV0ICovCiAJCWlmICghdmFsdWUpCiAJCQlyZXR1cm4gMDsKLQkJLyoKLQkJICogZm9yIHVuaW5pdGlhbGl6ZWQgcmVnaXN0ZXJzIHdob3NlIHZhbHVlIGlzIGNoYW5nZWQKLQkJICogZnJvbSB0aGUgZGVmYXVsdCB6ZXJvLCBjcmVhdGUgYW4gcmJub2RlIGFuZCBpbnNlcnQKLQkJICogaXQgaW50byB0aGUgdHJlZS4KKwkJLyogbG9vayBmb3IgYW4gYWRqYWNlbnQgcmVnaXN0ZXIgdG8gdGhlIG9uZSB3ZSBhcmUgYWJvdXQgdG8gYWRkICovCisJCWZvciAobm9kZSA9IHJiX2ZpcnN0KCZyYnRyZWVfY3R4LT5yb290KTsgbm9kZTsKKwkJICAgICBub2RlID0gcmJfbmV4dChub2RlKSkgeworCQkJcmJub2RlX3RtcCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlLCBub2RlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCByYm5vZGVfdG1wLT5ibGtsZW47ICsraSkgeworCQkJCXJlZ190bXAgPSByYm5vZGVfdG1wLT5iYXNlX3JlZyArIGk7CisJCQkJaWYgKGFicyhyZWdfdG1wIC0gcmVnKSAhPSAxKQorCQkJCQljb250aW51ZTsKKwkJCQkvKiBkZWNpZGUgd2hlcmUgaW4gdGhlIGJsb2NrIHRvIHBsYWNlIG91ciByZWdpc3RlciAqLworCQkJCWlmIChyZWdfdG1wICsgMSA9PSByZWcpCisJCQkJCXBvcyA9IGkgKyAxOworCQkJCWVsc2UKKwkJCQkJcG9zID0gaTsKKwkJCQlyZXQgPSBzbmRfc29jX3JidHJlZV9pbnNlcnRfdG9fYmxvY2socmJub2RlX3RtcCwgcG9zLAorCQkJCQkJCQkgICAgIHJlZywgdmFsdWUpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQkJcmJ0cmVlX2N0eC0+Y2FjaGVkX3Jibm9kZSA9IHJibm9kZV90bXA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJLyogd2UgZGlkIG5vdCBtYW5hZ2UgdG8gZmluZCBhIHBsYWNlIHRvIGluc2VydCBpdCBpbiBhbiBleGlzdGluZworCQkgKiBibG9jayBzbyBjcmVhdGUgYSBuZXcgcmJub2RlIHdpdGggYSBzaW5nbGUgcmVnaXN0ZXIgaW4gaXRzIGJsb2NrLgorCQkgKiBUaGlzIGJsb2NrIHdpbGwgZ2V0IHBvcHVsYXRlZCBmdXJ0aGVyIGlmIGFueSBvdGhlciBhZGphY2VudAorCQkgKiByZWdpc3RlcnMgZ2V0IG1vZGlmaWVkIGluIHRoZSBmdXR1cmUuCiAJCSAqLwogCQlyYm5vZGUgPSBremFsbG9jKHNpemVvZiAqcmJub2RlLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFyYm5vZGUpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJcmJub2RlLT5yZWcgPSByZWc7Ci0JCXJibm9kZS0+dmFsdWUgPSB2YWx1ZTsKKwkJcmJub2RlLT5ibGtsZW4gPSAxOworCQlyYm5vZGUtPmJhc2VfcmVnID0gcmVnOworCQlyYm5vZGUtPndvcmRfc2l6ZSA9IGNvZGVjLT5kcml2ZXItPnJlZ193b3JkX3NpemU7CisJCXJibm9kZS0+YmxvY2sgPSBrbWFsbG9jKHJibm9kZS0+YmxrbGVuICogcmJub2RlLT53b3JkX3NpemUsCisJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIXJibm9kZS0+YmxvY2spIHsKKwkJCWtmcmVlKHJibm9kZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlzbmRfc29jX3JidHJlZV9zZXRfcmVnaXN0ZXIocmJub2RlLCAwLCB2YWx1ZSk7CiAJCXNuZF9zb2NfcmJ0cmVlX2luc2VydCgmcmJ0cmVlX2N0eC0+cm9vdCwgcmJub2RlKTsKKwkJcmJ0cmVlX2N0eC0+Y2FjaGVkX3Jibm9kZSA9IHJibm9kZTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTYwNywxMSArMzQzLDI4IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfcmJ0cmVlX2N0eCAqcmJ0cmVlX2N0eDsKIAlzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfbm9kZSAqcmJub2RlOworCXVuc2lnbmVkIGludCBiYXNlX3JlZywgdG9wX3JlZzsKKwl1bnNpZ25lZCBpbnQgcmVnX3RtcDsKIAogCXJidHJlZV9jdHggPSBjb2RlYy0+cmVnX2NhY2hlOworCS8qIGxvb2sgdXAgdGhlIHJlcXVpcmVkIHJlZ2lzdGVyIGluIHRoZSBjYWNoZWQgcmJub2RlICovCisJcmJub2RlID0gcmJ0cmVlX2N0eC0+Y2FjaGVkX3Jibm9kZTsKKwlpZiAocmJub2RlKSB7CisJCXNuZF9zb2NfcmJ0cmVlX2dldF9iYXNlX3RvcF9yZWcocmJub2RlLCAmYmFzZV9yZWcsICZ0b3BfcmVnKTsKKwkJaWYgKHJlZyA+PSBiYXNlX3JlZyAmJiByZWcgPD0gdG9wX3JlZykgeworCQkJcmVnX3RtcCA9IHJlZyAtIGJhc2VfcmVnOworCQkJKnZhbHVlID0gc25kX3NvY19yYnRyZWVfZ2V0X3JlZ2lzdGVyKHJibm9kZSwgcmVnX3RtcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkvKiBpZiB3ZSBjYW4ndCBsb2NhdGUgaXQgaW4gdGhlIGNhY2hlZCByYm5vZGUgd2UnbGwgaGF2ZQorCSAqIHRvIHRyYXZlcnNlIHRoZSByYnRyZWUgbG9va2luZyBmb3IgaXQuCisJICovCiAJcmJub2RlID0gc25kX3NvY19yYnRyZWVfbG9va3VwKCZyYnRyZWVfY3R4LT5yb290LCByZWcpOwogCWlmIChyYm5vZGUpIHsKLQkJKnZhbHVlID0gcmJub2RlLT52YWx1ZTsKKwkJcmVnX3RtcCA9IHJlZyAtIHJibm9kZS0+YmFzZV9yZWc7CisJCSp2YWx1ZSA9IHNuZF9zb2NfcmJ0cmVlX2dldF9yZWdpc3RlcihyYm5vZGUsIHJlZ190bXApOworCQlyYnRyZWVfY3R4LT5jYWNoZWRfcmJub2RlID0gcmJub2RlOwogCX0gZWxzZSB7CiAJCS8qIHVuaW5pdGlhbGl6ZWQgcmVnaXN0ZXJzIGRlZmF1bHQgdG8gMCAqLwogCQkqdmFsdWUgPSAwOwpAQCAtNjM3LDYgKzM5MCw3IEBACiAJCXJidHJlZV9ub2RlID0gcmJfZW50cnkobmV4dCwgc3RydWN0IHNuZF9zb2NfcmJ0cmVlX25vZGUsIG5vZGUpOwogCQluZXh0ID0gcmJfbmV4dCgmcmJ0cmVlX25vZGUtPm5vZGUpOwogCQlyYl9lcmFzZSgmcmJ0cmVlX25vZGUtPm5vZGUsICZyYnRyZWVfY3R4LT5yb290KTsKKwkJa2ZyZWUocmJ0cmVlX25vZGUtPmJsb2NrKTsKIAkJa2ZyZWUocmJ0cmVlX25vZGUpOwogCX0KIApAQCAtNjQ5LDEwICs0MDMsOSBAQAogCiBzdGF0aWMgaW50IHNuZF9zb2NfcmJ0cmVlX2NhY2hlX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXN0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlICpyYnRyZWVfbm9kZTsKIAlzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfY3R4ICpyYnRyZWVfY3R4OwotCXVuc2lnbmVkIGludCB2YWw7CiAJdW5zaWduZWQgaW50IHdvcmRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgdmFsOwogCWludCBpOwogCWludCByZXQ7CiAKQEAgLTY2MiwzMiArNDE1LDI3IEBACiAKIAlyYnRyZWVfY3R4ID0gY29kZWMtPnJlZ19jYWNoZTsKIAlyYnRyZWVfY3R4LT5yb290ID0gUkJfUk9PVDsKKwlyYnRyZWVfY3R4LT5jYWNoZWRfcmJub2RlID0gTlVMTDsKIAogCWlmICghY29kZWMtPnJlZ19kZWZfY29weSkKIAkJcmV0dXJuIDA7CiAKLQkvKgotCSAqIHBvcHVsYXRlIHRoZSByYnRyZWUgd2l0aCB0aGUgaW5pdGlhbGl6ZWQgcmVnaXN0ZXJzLiAgQWxsIG90aGVyCi0JICogcmVnaXN0ZXJzIHdpbGwgYmUgaW5zZXJ0ZWQgd2hlbiB0aGV5IGFyZSBmaXJzdCBtb2RpZmllZC4KLQkgKi8KIAl3b3JkX3NpemUgPSBjb2RlYy0+ZHJpdmVyLT5yZWdfd29yZF9zaXplOwogCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZTsgKytpKSB7Ci0JCXZhbCA9IHNuZF9zb2NfZ2V0X2NhY2hlX3ZhbChjb2RlYy0+cmVnX2RlZl9jb3B5LCBpLCB3b3JkX3NpemUpOworCQl2YWwgPSBzbmRfc29jX2dldF9jYWNoZV92YWwoY29kZWMtPnJlZ19kZWZfY29weSwgaSwKKwkJCQkJICAgIHdvcmRfc2l6ZSk7CiAJCWlmICghdmFsKQogCQkJY29udGludWU7Ci0JCXJidHJlZV9ub2RlID0ga3phbGxvYyhzaXplb2YgKnJidHJlZV9ub2RlLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFyYnRyZWVfbm9kZSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCXNuZF9zb2NfY2FjaGVfZXhpdChjb2RlYyk7Ci0JCQlicmVhazsKLQkJfQotCQlyYnRyZWVfbm9kZS0+cmVnID0gaTsKLQkJcmJ0cmVlX25vZGUtPnZhbHVlID0gdmFsOwotCQlyYnRyZWVfbm9kZS0+ZGVmdmFsID0gdmFsOwotCQlzbmRfc29jX3JidHJlZV9pbnNlcnQoJnJidHJlZV9jdHgtPnJvb3QsIHJidHJlZV9ub2RlKTsKKwkJcmV0ID0gc25kX3NvY19yYnRyZWVfY2FjaGVfd3JpdGUoY29kZWMsIGksIHZhbCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKIAl9CiAKIAlyZXR1cm4gMDsKKworZXJyOgorCXNuZF9zb2NfY2FjaGVfZXhpdChjb2RlYyk7CisJcmV0dXJuIHJldDsKIH0KIAogI2lmZGVmIENPTkZJR19TTkRfU09DX0NBQ0hFX0xaTwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1jb3JlLmMgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwppbmRleCBkNzUwNDNlLi5lNDQyNjdmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNvcmUuYworKysgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwpAQCAtNDQsNyArNDQsNiBAQAogCiAjZGVmaW5lIE5BTUVfU0laRQkzMgogCi1zdGF0aWMgREVGSU5FX01VVEVYKHBjbV9tdXRleCk7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoc29jX3BtX3dhaXRxKTsKIAogI2lmZGVmIENPTkZJR19ERUJVR19GUwpAQCAtNTgsNyArNTcsNyBAQAogc3RhdGljIExJU1RfSEVBRChwbGF0Zm9ybV9saXN0KTsKIHN0YXRpYyBMSVNUX0hFQUQoY29kZWNfbGlzdCk7CiAKLXN0YXRpYyBpbnQgc29jX25ld19wY20oc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwgaW50IG51bSk7CitpbnQgc29jX25ld19wY20oc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwgaW50IG51bSk7CiAKIC8qCiAgKiBUaGlzIGlzIGEgdGltZW91dCB0byBkbyBhIERBUE0gcG93ZXJkb3duIGFmdGVyIGEgc3RyZWFtIGlzIGNsb3NlZCgpLgpAQCAtNDg1LDU1MiArNDg0LDYgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IHNvY19wY21fYXBwbHlfc3ltbWV0cnkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCWludCByZXQ7Ci0KLQlpZiAoIWNvZGVjX2RhaS0+ZHJpdmVyLT5zeW1tZXRyaWNfcmF0ZXMgJiYKLQkgICAgIWNwdV9kYWktPmRyaXZlci0+c3ltbWV0cmljX3JhdGVzICYmCi0JICAgICFydGQtPmRhaV9saW5rLT5zeW1tZXRyaWNfcmF0ZXMpCi0JCXJldHVybiAwOwotCi0JLyogVGhpcyBjYW4gaGFwcGVuIGlmIG11bHRpcGxlIHN0cmVhbXMgYXJlIHN0YXJ0aW5nIHNpbXVsdGFuZW91c2x5IC0KLQkgKiB0aGUgc2Vjb25kIGNhbiBuZWVkIHRvIGdldCBpdHMgY29uc3RyYWludHMgYmVmb3JlIHRoZSBmaXJzdCBoYXMKLQkgKiBwaWNrZWQgYSByYXRlLiAgQ29tcGxhaW4gYW5kIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBjYXJyeSBvbi4KLQkgKi8KLQlpZiAoIXJ0ZC0+cmF0ZSkgewotCQlkZXZfd2FybigmcnRkLT5kZXYsCi0JCQkgIk5vdCBlbmZvcmNpbmcgc3ltbWV0cmljX3JhdGVzIGR1ZSB0byByYWNlXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZGV2X2RiZygmcnRkLT5kZXYsICJTeW1tZXRyeSBmb3JjZXMgJWRIeiByYXRlXG4iLCBydGQtPnJhdGUpOwotCi0JcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChzdWJzdHJlYW0tPnJ1bnRpbWUsCi0JCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAotCQkJCQkgICBydGQtPnJhdGUsIHJ0ZC0+cmF0ZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcnRkLT5kZXYsCi0JCQkiVW5hYmxlIHRvIGFwcGx5IHJhdGUgc3ltbWV0cnkgY29uc3RyYWludDogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgYnkgQUxTQSB3aGVuIGEgUENNIHN1YnN0cmVhbSBpcyBvcGVuZWQsIHRoZSBydW50aW1lLT5odyByZWNvcmQgaXMKLSAqIHRoZW4gaW5pdGlhbGl6ZWQgYW5kIGFueSBwcml2YXRlIGRhdGEgY2FuIGJlIGFsbG9jYXRlZC4gVGhpcyBhbHNvIGNhbGxzCi0gKiBzdGFydHVwIGZvciB0aGUgY3B1IERBSSwgcGxhdGZvcm0sIG1hY2hpbmUgYW5kIGNvZGVjIERBSS4KLSAqLwotc3RhdGljIGludCBzb2NfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gcnRkLT5wbGF0Zm9ybTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpjcHVfZGFpX2RydiA9IGNwdV9kYWktPmRyaXZlcjsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpjb2RlY19kYWlfZHJ2ID0gY29kZWNfZGFpLT5kcml2ZXI7Ci0JaW50IHJldCA9IDA7Ci0KLQltdXRleF9sb2NrKCZwY21fbXV0ZXgpOwotCi0JLyogc3RhcnR1cCB0aGUgYXVkaW8gc3Vic3lzdGVtICovCi0JaWYgKGNwdV9kYWktPmRyaXZlci0+b3BzLT5zdGFydHVwKSB7Ci0JCXJldCA9IGNwdV9kYWktPmRyaXZlci0+b3BzLT5zdGFydHVwKHN1YnN0cmVhbSwgY3B1X2RhaSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNhbid0IG9wZW4gaW50ZXJmYWNlICVzXG4iLAotCQkJCWNwdV9kYWktPm5hbWUpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlpZiAocGxhdGZvcm0tPmRyaXZlci0+b3BzICYmIHBsYXRmb3JtLT5kcml2ZXItPm9wcy0+b3BlbikgewotCQlyZXQgPSBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPm9wZW4oc3Vic3RyZWFtKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogY2FuJ3Qgb3BlbiBwbGF0Zm9ybSAlc1xuIiwgcGxhdGZvcm0tPm5hbWUpOwotCQkJZ290byBwbGF0Zm9ybV9lcnI7Ci0JCX0KLQl9Ci0KLQlpZiAoY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+c3RhcnR1cCkgewotCQlyZXQgPSBjb2RlY19kYWktPmRyaXZlci0+b3BzLT5zdGFydHVwKHN1YnN0cmVhbSwgY29kZWNfZGFpKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogY2FuJ3Qgb3BlbiBjb2RlYyAlc1xuIiwKLQkJCQljb2RlY19kYWktPm5hbWUpOwotCQkJZ290byBjb2RlY19kYWlfZXJyOwotCQl9Ci0JfQotCi0JaWYgKHJ0ZC0+ZGFpX2xpbmstPm9wcyAmJiBydGQtPmRhaV9saW5rLT5vcHMtPnN0YXJ0dXApIHsKLQkJcmV0ID0gcnRkLT5kYWlfbGluay0+b3BzLT5zdGFydHVwKHN1YnN0cmVhbSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImFzb2M6ICVzIHN0YXJ0dXAgZmFpbGVkXG4iLCBydGQtPmRhaV9saW5rLT5uYW1lKTsKLQkJCWdvdG8gbWFjaGluZV9lcnI7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayB0aGF0IHRoZSBjb2RlYyBhbmQgY3B1IERBSXMgYXJlIGNvbXBhdGlibGUgKi8KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlydW50aW1lLT5ody5yYXRlX21pbiA9Ci0JCQltYXgoY29kZWNfZGFpX2Rydi0+cGxheWJhY2sucmF0ZV9taW4sCi0JCQkgICAgY3B1X2RhaV9kcnYtPnBsYXliYWNrLnJhdGVfbWluKTsKLQkJcnVudGltZS0+aHcucmF0ZV9tYXggPQotCQkJbWluKGNvZGVjX2RhaV9kcnYtPnBsYXliYWNrLnJhdGVfbWF4LAotCQkJICAgIGNwdV9kYWlfZHJ2LT5wbGF5YmFjay5yYXRlX21heCk7Ci0JCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9Ci0JCQltYXgoY29kZWNfZGFpX2Rydi0+cGxheWJhY2suY2hhbm5lbHNfbWluLAotCQkJCWNwdV9kYWlfZHJ2LT5wbGF5YmFjay5jaGFubmVsc19taW4pOwotCQlydW50aW1lLT5ody5jaGFubmVsc19tYXggPQotCQkJbWluKGNvZGVjX2RhaV9kcnYtPnBsYXliYWNrLmNoYW5uZWxzX21heCwKLQkJCQljcHVfZGFpX2Rydi0+cGxheWJhY2suY2hhbm5lbHNfbWF4KTsKLQkJcnVudGltZS0+aHcuZm9ybWF0cyA9Ci0JCQljb2RlY19kYWlfZHJ2LT5wbGF5YmFjay5mb3JtYXRzICYgY3B1X2RhaV9kcnYtPnBsYXliYWNrLmZvcm1hdHM7Ci0JCXJ1bnRpbWUtPmh3LnJhdGVzID0KLQkJCWNvZGVjX2RhaV9kcnYtPnBsYXliYWNrLnJhdGVzICYgY3B1X2RhaV9kcnYtPnBsYXliYWNrLnJhdGVzOwotCQlpZiAoY29kZWNfZGFpX2Rydi0+cGxheWJhY2sucmF0ZXMKLQkJCSAgICYgKFNORFJWX1BDTV9SQVRFX0tOT1QgfCBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTKSkKLQkJCXJ1bnRpbWUtPmh3LnJhdGVzIHw9IGNwdV9kYWlfZHJ2LT5wbGF5YmFjay5yYXRlczsKLQkJaWYgKGNwdV9kYWlfZHJ2LT5wbGF5YmFjay5yYXRlcwotCQkJICAgJiAoU05EUlZfUENNX1JBVEVfS05PVCB8IFNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMpKQotCQkJcnVudGltZS0+aHcucmF0ZXMgfD0gY29kZWNfZGFpX2Rydi0+cGxheWJhY2sucmF0ZXM7Ci0JfSBlbHNlIHsKLQkJcnVudGltZS0+aHcucmF0ZV9taW4gPQotCQkJbWF4KGNvZGVjX2RhaV9kcnYtPmNhcHR1cmUucmF0ZV9taW4sCi0JCQkgICAgY3B1X2RhaV9kcnYtPmNhcHR1cmUucmF0ZV9taW4pOwotCQlydW50aW1lLT5ody5yYXRlX21heCA9Ci0JCQltaW4oY29kZWNfZGFpX2Rydi0+Y2FwdHVyZS5yYXRlX21heCwKLQkJCSAgICBjcHVfZGFpX2Rydi0+Y2FwdHVyZS5yYXRlX21heCk7Ci0JCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9Ci0JCQltYXgoY29kZWNfZGFpX2Rydi0+Y2FwdHVyZS5jaGFubmVsc19taW4sCi0JCQkJY3B1X2RhaV9kcnYtPmNhcHR1cmUuY2hhbm5lbHNfbWluKTsKLQkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0KLQkJCW1pbihjb2RlY19kYWlfZHJ2LT5jYXB0dXJlLmNoYW5uZWxzX21heCwKLQkJCQljcHVfZGFpX2Rydi0+Y2FwdHVyZS5jaGFubmVsc19tYXgpOwotCQlydW50aW1lLT5ody5mb3JtYXRzID0KLQkJCWNvZGVjX2RhaV9kcnYtPmNhcHR1cmUuZm9ybWF0cyAmIGNwdV9kYWlfZHJ2LT5jYXB0dXJlLmZvcm1hdHM7Ci0JCXJ1bnRpbWUtPmh3LnJhdGVzID0KLQkJCWNvZGVjX2RhaV9kcnYtPmNhcHR1cmUucmF0ZXMgJiBjcHVfZGFpX2Rydi0+Y2FwdHVyZS5yYXRlczsKLQkJaWYgKGNvZGVjX2RhaV9kcnYtPmNhcHR1cmUucmF0ZXMKLQkJCSAgICYgKFNORFJWX1BDTV9SQVRFX0tOT1QgfCBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTKSkKLQkJCXJ1bnRpbWUtPmh3LnJhdGVzIHw9IGNwdV9kYWlfZHJ2LT5jYXB0dXJlLnJhdGVzOwotCQlpZiAoY3B1X2RhaV9kcnYtPmNhcHR1cmUucmF0ZXMKLQkJCSAgICYgKFNORFJWX1BDTV9SQVRFX0tOT1QgfCBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTKSkKLQkJCXJ1bnRpbWUtPmh3LnJhdGVzIHw9IGNvZGVjX2RhaV9kcnYtPmNhcHR1cmUucmF0ZXM7Ci0JfQotCi0JcmV0ID0gLUVJTlZBTDsKLQlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOwotCWlmICghcnVudGltZS0+aHcucmF0ZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiAlcyA8LT4gJXMgTm8gbWF0Y2hpbmcgcmF0ZXNcbiIsCi0JCQljb2RlY19kYWktPm5hbWUsIGNwdV9kYWktPm5hbWUpOwotCQlnb3RvIGNvbmZpZ19lcnI7Ci0JfQotCWlmICghcnVudGltZS0+aHcuZm9ybWF0cykgewotCQlwcmludGsoS0VSTl9FUlIgImFzb2M6ICVzIDwtPiAlcyBObyBtYXRjaGluZyBmb3JtYXRzXG4iLAotCQkJY29kZWNfZGFpLT5uYW1lLCBjcHVfZGFpLT5uYW1lKTsKLQkJZ290byBjb25maWdfZXJyOwotCX0KLQlpZiAoIXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiB8fCAhcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4IHx8Ci0JICAgIHJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA+IHJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCkgewotCQlwcmludGsoS0VSTl9FUlIgImFzb2M6ICVzIDwtPiAlcyBObyBtYXRjaGluZyBjaGFubmVsc1xuIiwKLQkJCQljb2RlY19kYWktPm5hbWUsIGNwdV9kYWktPm5hbWUpOwotCQlnb3RvIGNvbmZpZ19lcnI7Ci0JfQotCi0JLyogU3ltbWV0cnkgb25seSBhcHBsaWVzIGlmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFjdGl2ZSBzdHJlYW0uICovCi0JaWYgKGNwdV9kYWktPmFjdGl2ZSB8fCBjb2RlY19kYWktPmFjdGl2ZSkgewotCQlyZXQgPSBzb2NfcGNtX2FwcGx5X3N5bW1ldHJ5KHN1YnN0cmVhbSk7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCWdvdG8gY29uZmlnX2VycjsKLQl9Ci0KLQlwcl9kZWJ1ZygiYXNvYzogJXMgPC0+ICVzIGluZm86XG4iLAotCQkJY29kZWNfZGFpLT5uYW1lLCBjcHVfZGFpLT5uYW1lKTsKLQlwcl9kZWJ1ZygiYXNvYzogcmF0ZSBtYXNrIDB4JXhcbiIsIHJ1bnRpbWUtPmh3LnJhdGVzKTsKLQlwcl9kZWJ1ZygiYXNvYzogbWluIGNoICVkIG1heCBjaCAlZFxuIiwgcnVudGltZS0+aHcuY2hhbm5lbHNfbWluLAotCQkgcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4KTsKLQlwcl9kZWJ1ZygiYXNvYzogbWluIHJhdGUgJWQgbWF4IHJhdGUgJWRcbiIsIHJ1bnRpbWUtPmh3LnJhdGVfbWluLAotCQkgcnVudGltZS0+aHcucmF0ZV9tYXgpOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJY3B1X2RhaS0+cGxheWJhY2tfYWN0aXZlKys7Ci0JCWNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlKys7Ci0JfSBlbHNlIHsKLQkJY3B1X2RhaS0+Y2FwdHVyZV9hY3RpdmUrKzsKLQkJY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZSsrOwotCX0KLQljcHVfZGFpLT5hY3RpdmUrKzsKLQljb2RlY19kYWktPmFjdGl2ZSsrOwotCXJ0ZC0+Y29kZWMtPmFjdGl2ZSsrOwotCW11dGV4X3VubG9jaygmcGNtX211dGV4KTsKLQlyZXR1cm4gMDsKLQotY29uZmlnX2VycjoKLQlpZiAocnRkLT5kYWlfbGluay0+b3BzICYmIHJ0ZC0+ZGFpX2xpbmstPm9wcy0+c2h1dGRvd24pCi0JCXJ0ZC0+ZGFpX2xpbmstPm9wcy0+c2h1dGRvd24oc3Vic3RyZWFtKTsKLQotbWFjaGluZV9lcnI6Ci0JaWYgKGNvZGVjX2RhaS0+ZHJpdmVyLT5vcHMtPnNodXRkb3duKQotCQljb2RlY19kYWktPmRyaXZlci0+b3BzLT5zaHV0ZG93bihzdWJzdHJlYW0sIGNvZGVjX2RhaSk7Ci0KLWNvZGVjX2RhaV9lcnI6Ci0JaWYgKHBsYXRmb3JtLT5kcml2ZXItPm9wcyAmJiBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPmNsb3NlKQotCQlwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPmNsb3NlKHN1YnN0cmVhbSk7Ci0KLXBsYXRmb3JtX2VycjoKLQlpZiAoY3B1X2RhaS0+ZHJpdmVyLT5vcHMtPnNodXRkb3duKQotCQljcHVfZGFpLT5kcml2ZXItPm9wcy0+c2h1dGRvd24oc3Vic3RyZWFtLCBjcHVfZGFpKTsKLW91dDoKLQltdXRleF91bmxvY2soJnBjbV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFBvd2VyIGRvd24gdGhlIGF1ZGlvIHN1YnN5c3RlbSBwbWRvd25fdGltZSBtc2VjcyBhZnRlciBjbG9zZSBpcyBjYWxsZWQuCi0gKiBUaGlzIGlzIHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gcG9wcyBvciBjbGlja3MgaW4gYmV0d2VlbiBhbnkgbXVzaWMgdHJhY2tzCi0gKiBkdWUgdG8gREFQTSBwb3dlciBjeWNsaW5nLgotICovCi1zdGF0aWMgdm9pZCBjbG9zZV9kZWxheWVkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPQotCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lLCBkZWxheWVkX3dvcmsud29yayk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQotCW11dGV4X2xvY2soJnBjbV9tdXRleCk7Ci0KLQlwcl9kZWJ1ZygicG9wIHdxIGNoZWNraW5nOiAlcyBzdGF0dXM6ICVzIHdhaXRpbmc6ICVzXG4iLAotCQkgY29kZWNfZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lLAotCQkgY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUgPyAiYWN0aXZlIiA6ICJpbmFjdGl2ZSIsCi0JCSBjb2RlY19kYWktPnBvcF93YWl0ID8gInllcyIgOiAibm8iKTsKLQotCS8qIGFyZSB3ZSB3YWl0aW5nIG9uIHRoaXMgY29kZWMgREFJIHN0cmVhbSAqLwotCWlmIChjb2RlY19kYWktPnBvcF93YWl0ID09IDEpIHsKLQkJY29kZWNfZGFpLT5wb3Bfd2FpdCA9IDA7Ci0JCXNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQocnRkLAotCQkJY29kZWNfZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lLAotCQkJU05EX1NPQ19EQVBNX1NUUkVBTV9TVE9QKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJnBjbV9tdXRleCk7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgYnkgQUxTQSB3aGVuIGEgUENNIHN1YnN0cmVhbSBpcyBjbG9zZWQuIFByaXZhdGUgZGF0YSBjYW4gYmUKLSAqIGZyZWVkIGhlcmUuIFRoZSBjcHUgREFJLCBjb2RlYyBEQUksIG1hY2hpbmUgYW5kIHBsYXRmb3JtIGFyZSBhbHNvCi0gKiBzaHV0ZG93bi4KLSAqLwotc3RhdGljIGludCBzb2NfY29kZWNfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQotCW11dGV4X2xvY2soJnBjbV9tdXRleCk7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQljcHVfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKLQkJY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUtLTsKLQl9IGVsc2UgewotCQljcHVfZGFpLT5jYXB0dXJlX2FjdGl2ZS0tOwotCQljb2RlY19kYWktPmNhcHR1cmVfYWN0aXZlLS07Ci0JfQotCi0JY3B1X2RhaS0+YWN0aXZlLS07Ci0JY29kZWNfZGFpLT5hY3RpdmUtLTsKLQljb2RlYy0+YWN0aXZlLS07Ci0KLQkvKiBNdXRpbmcgdGhlIERBQyBzdXBwcmVzc2VzIGFydGlmYWN0cyBjYXVzZWQgZHVyaW5nIGRpZ2l0YWwKLQkgKiBzaHV0ZG93biwgZm9yIGV4YW1wbGUgZnJvbSBzdG9wcGluZyBjbG9ja3MuCi0JICovCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXNuZF9zb2NfZGFpX2RpZ2l0YWxfbXV0ZShjb2RlY19kYWksIDEpOwotCi0JaWYgKGNwdV9kYWktPmRyaXZlci0+b3BzLT5zaHV0ZG93bikKLQkJY3B1X2RhaS0+ZHJpdmVyLT5vcHMtPnNodXRkb3duKHN1YnN0cmVhbSwgY3B1X2RhaSk7Ci0KLQlpZiAoY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+c2h1dGRvd24pCi0JCWNvZGVjX2RhaS0+ZHJpdmVyLT5vcHMtPnNodXRkb3duKHN1YnN0cmVhbSwgY29kZWNfZGFpKTsKLQotCWlmIChydGQtPmRhaV9saW5rLT5vcHMgJiYgcnRkLT5kYWlfbGluay0+b3BzLT5zaHV0ZG93bikKLQkJcnRkLT5kYWlfbGluay0+b3BzLT5zaHV0ZG93bihzdWJzdHJlYW0pOwotCi0JaWYgKHBsYXRmb3JtLT5kcml2ZXItPm9wcyAmJiBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPmNsb3NlKQotCQlwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPmNsb3NlKHN1YnN0cmVhbSk7Ci0JY3B1X2RhaS0+cnVudGltZSA9IE5VTEw7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQkvKiBzdGFydCBkZWxheWVkIHBvcCB3cSBoZXJlIGZvciBwbGF5YmFjayBzdHJlYW1zICovCi0JCWNvZGVjX2RhaS0+cG9wX3dhaXQgPSAxOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJ0ZC0+ZGVsYXllZF93b3JrLAotCQkJbXNlY3NfdG9famlmZmllcyhydGQtPnBtZG93bl90aW1lKSk7Ci0JfSBlbHNlIHsKLQkJLyogY2FwdHVyZSBzdHJlYW1zIGNhbiBiZSBwb3dlcmVkIGRvd24gbm93ICovCi0JCXNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQocnRkLAotCQkJY29kZWNfZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWUsCi0JCQlTTkRfU09DX0RBUE1fU1RSRUFNX1NUT1ApOwotCX0KLQotCW11dGV4X3VubG9jaygmcGNtX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIENhbGxlZCBieSBBTFNBIHdoZW4gdGhlIFBDTSBzdWJzdHJlYW0gaXMgcHJlcGFyZWQsIGNhbiBzZXQgZm9ybWF0LCBzYW1wbGUKLSAqIHJhdGUsIGV0Yy4gIFRoaXMgZnVuY3Rpb24gaXMgbm9uIGF0b21pYyBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywKLSAqIGl0IGNhbiByZWZlciB0byB0aGUgcnVudGltZSBpbmZvLgotICovCi1zdGF0aWMgaW50IHNvY19wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gcnRkLT5wbGF0Zm9ybTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlpbnQgcmV0ID0gMDsKLQotCW11dGV4X2xvY2soJnBjbV9tdXRleCk7Ci0KLQlpZiAocnRkLT5kYWlfbGluay0+b3BzICYmIHJ0ZC0+ZGFpX2xpbmstPm9wcy0+cHJlcGFyZSkgewotCQlyZXQgPSBydGQtPmRhaV9saW5rLT5vcHMtPnByZXBhcmUoc3Vic3RyZWFtKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogbWFjaGluZSBwcmVwYXJlIGVycm9yXG4iKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JaWYgKHBsYXRmb3JtLT5kcml2ZXItPm9wcyAmJiBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPnByZXBhcmUpIHsKLQkJcmV0ID0gcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5wcmVwYXJlKHN1YnN0cmVhbSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IHBsYXRmb3JtIHByZXBhcmUgZXJyb3JcbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlpZiAoY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+cHJlcGFyZSkgewotCQlyZXQgPSBjb2RlY19kYWktPmRyaXZlci0+b3BzLT5wcmVwYXJlKHN1YnN0cmVhbSwgY29kZWNfZGFpKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogY29kZWMgREFJIHByZXBhcmUgZXJyb3JcbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlpZiAoY3B1X2RhaS0+ZHJpdmVyLT5vcHMtPnByZXBhcmUpIHsKLQkJcmV0ID0gY3B1X2RhaS0+ZHJpdmVyLT5vcHMtPnByZXBhcmUoc3Vic3RyZWFtLCBjcHVfZGFpKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogY3B1IERBSSBwcmVwYXJlIGVycm9yXG4iKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JLyogY2FuY2VsIGFueSBkZWxheWVkIHN0cmVhbSBzaHV0ZG93biB0aGF0IGlzIHBlbmRpbmcgKi8KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyAmJgotCSAgICBjb2RlY19kYWktPnBvcF93YWl0KSB7Ci0JCWNvZGVjX2RhaS0+cG9wX3dhaXQgPSAwOwotCQljYW5jZWxfZGVsYXllZF93b3JrKCZydGQtPmRlbGF5ZWRfd29yayk7Ci0JfQotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQocnRkLAotCQkJCQkgIGNvZGVjX2RhaS0+ZHJpdmVyLT5wbGF5YmFjay5zdHJlYW1fbmFtZSwKLQkJCQkJICBTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUKTsKLQllbHNlCi0JCXNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQocnRkLAotCQkJCQkgIGNvZGVjX2RhaS0+ZHJpdmVyLT5jYXB0dXJlLnN0cmVhbV9uYW1lLAotCQkJCQkgIFNORF9TT0NfREFQTV9TVFJFQU1fU1RBUlQpOwotCi0Jc25kX3NvY19kYWlfZGlnaXRhbF9tdXRlKGNvZGVjX2RhaSwgMCk7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJnBjbV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIENhbGxlZCBieSBBTFNBIHdoZW4gdGhlIGhhcmR3YXJlIHBhcmFtcyBhcmUgc2V0IGJ5IGFwcGxpY2F0aW9uLiBUaGlzCi0gKiBmdW5jdGlvbiBjYW4gYWxzbyBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYW5kIGNhbiBhbGxvY2F0ZSBidWZmZXJzCi0gKiAodXNpbmcgc25kX3BjbV9saWJfKiApLiBJdCdzIG5vbi1hdG9taWMuCi0gKi8KLXN0YXRpYyBpbnQgc29jX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0JaW50IHJldCA9IDA7Ci0KLQltdXRleF9sb2NrKCZwY21fbXV0ZXgpOwotCi0JaWYgKHJ0ZC0+ZGFpX2xpbmstPm9wcyAmJiBydGQtPmRhaV9saW5rLT5vcHMtPmh3X3BhcmFtcykgewotCQlyZXQgPSBydGQtPmRhaV9saW5rLT5vcHMtPmh3X3BhcmFtcyhzdWJzdHJlYW0sIHBhcmFtcyk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IG1hY2hpbmUgaHdfcGFyYW1zIGZhaWxlZFxuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCWlmIChjb2RlY19kYWktPmRyaXZlci0+b3BzLT5od19wYXJhbXMpIHsKLQkJcmV0ID0gY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+aHdfcGFyYW1zKHN1YnN0cmVhbSwgcGFyYW1zLCBjb2RlY19kYWkpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBjYW4ndCBzZXQgY29kZWMgJXMgaHcgcGFyYW1zXG4iLAotCQkJCWNvZGVjX2RhaS0+bmFtZSk7Ci0JCQlnb3RvIGNvZGVjX2VycjsKLQkJfQotCX0KLQotCWlmIChjcHVfZGFpLT5kcml2ZXItPm9wcy0+aHdfcGFyYW1zKSB7Ci0JCXJldCA9IGNwdV9kYWktPmRyaXZlci0+b3BzLT5od19wYXJhbXMoc3Vic3RyZWFtLCBwYXJhbXMsIGNwdV9kYWkpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBpbnRlcmZhY2UgJXMgaHcgcGFyYW1zIGZhaWxlZFxuIiwKLQkJCQljcHVfZGFpLT5uYW1lKTsKLQkJCWdvdG8gaW50ZXJmYWNlX2VycjsKLQkJfQotCX0KLQotCWlmIChwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMgJiYgcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5od19wYXJhbXMpIHsKLQkJcmV0ID0gcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5od19wYXJhbXMoc3Vic3RyZWFtLCBwYXJhbXMpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBwbGF0Zm9ybSAlcyBodyBwYXJhbXMgZmFpbGVkXG4iLAotCQkJCXBsYXRmb3JtLT5uYW1lKTsKLQkJCWdvdG8gcGxhdGZvcm1fZXJyOwotCQl9Ci0JfQotCi0JcnRkLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmcGNtX211dGV4KTsKLQlyZXR1cm4gcmV0OwotCi1wbGF0Zm9ybV9lcnI6Ci0JaWYgKGNwdV9kYWktPmRyaXZlci0+b3BzLT5od19mcmVlKQotCQljcHVfZGFpLT5kcml2ZXItPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0sIGNwdV9kYWkpOwotCi1pbnRlcmZhY2VfZXJyOgotCWlmIChjb2RlY19kYWktPmRyaXZlci0+b3BzLT5od19mcmVlKQotCQljb2RlY19kYWktPmRyaXZlci0+b3BzLT5od19mcmVlKHN1YnN0cmVhbSwgY29kZWNfZGFpKTsKLQotY29kZWNfZXJyOgotCWlmIChydGQtPmRhaV9saW5rLT5vcHMgJiYgcnRkLT5kYWlfbGluay0+b3BzLT5od19mcmVlKQotCQlydGQtPmRhaV9saW5rLT5vcHMtPmh3X2ZyZWUoc3Vic3RyZWFtKTsKLQotCW11dGV4X3VubG9jaygmcGNtX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogRnJlZXMgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBod19wYXJhbXMsIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKLSAqLwotc3RhdGljIGludCBzb2NfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQotCW11dGV4X2xvY2soJnBjbV9tdXRleCk7Ci0KLQkvKiBhcHBseSBjb2RlYyBkaWdpdGFsIG11dGUgKi8KLQlpZiAoIWNvZGVjLT5hY3RpdmUpCi0JCXNuZF9zb2NfZGFpX2RpZ2l0YWxfbXV0ZShjb2RlY19kYWksIDEpOwotCi0JLyogZnJlZSBhbnkgbWFjaGluZSBodyBwYXJhbXMgKi8KLQlpZiAocnRkLT5kYWlfbGluay0+b3BzICYmIHJ0ZC0+ZGFpX2xpbmstPm9wcy0+aHdfZnJlZSkKLQkJcnRkLT5kYWlfbGluay0+b3BzLT5od19mcmVlKHN1YnN0cmVhbSk7Ci0KLQkvKiBmcmVlIGFueSBETUEgcmVzb3VyY2VzICovCi0JaWYgKHBsYXRmb3JtLT5kcml2ZXItPm9wcyAmJiBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPmh3X2ZyZWUpCi0JCXBsYXRmb3JtLT5kcml2ZXItPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0pOwotCi0JLyogbm93IGZyZWUgaHcgcGFyYW1zIGZvciB0aGUgREFJcyAgKi8KLQlpZiAoY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+aHdfZnJlZSkKLQkJY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0sIGNvZGVjX2RhaSk7Ci0KLQlpZiAoY3B1X2RhaS0+ZHJpdmVyLT5vcHMtPmh3X2ZyZWUpCi0JCWNwdV9kYWktPmRyaXZlci0+b3BzLT5od19mcmVlKHN1YnN0cmVhbSwgY3B1X2RhaSk7Ci0KLQltdXRleF91bmxvY2soJnBjbV9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc29jX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBydGQtPnBsYXRmb3JtOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCWludCByZXQ7Ci0KLQlpZiAoY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+dHJpZ2dlcikgewotCQlyZXQgPSBjb2RlY19kYWktPmRyaXZlci0+b3BzLT50cmlnZ2VyKHN1YnN0cmVhbSwgY21kLCBjb2RlY19kYWkpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKHBsYXRmb3JtLT5kcml2ZXItPm9wcyAmJiBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPnRyaWdnZXIpIHsKLQkJcmV0ID0gcGxhdGZvcm0tPmRyaXZlci0+b3BzLT50cmlnZ2VyKHN1YnN0cmVhbSwgY21kKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChjcHVfZGFpLT5kcml2ZXItPm9wcy0+dHJpZ2dlcikgewotCQlyZXQgPSBjcHVfZGFpLT5kcml2ZXItPm9wcy0+dHJpZ2dlcihzdWJzdHJlYW0sIGNtZCwgY3B1X2RhaSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBzb2MgbGV2ZWwgd3JhcHBlciBmb3IgcG9pbnRlciBjYWxsYmFjawotICogSWYgY3B1X2RhaSwgY29kZWNfZGFpLCBwbGF0Zm9ybSBkcml2ZXIgaGFzIHRoZSBkZWxheSBjYWxsYmFjaywgdGhhbgotICogdGhlIHJ1bnRpbWUtPmRlbGF5IHdpbGwgYmUgdXBkYXRlZCBhY2NvcmRpbmdseS4KLSAqLwotc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNvY19wY21fcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gcnRkLT5wbGF0Zm9ybTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXNuZF9wY21fdWZyYW1lc190IG9mZnNldCA9IDA7Ci0Jc25kX3BjbV9zZnJhbWVzX3QgZGVsYXkgPSAwOwotCi0JaWYgKHBsYXRmb3JtLT5kcml2ZXItPm9wcyAmJiBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPnBvaW50ZXIpCi0JCW9mZnNldCA9IHBsYXRmb3JtLT5kcml2ZXItPm9wcy0+cG9pbnRlcihzdWJzdHJlYW0pOwotCi0JaWYgKGNwdV9kYWktPmRyaXZlci0+b3BzLT5kZWxheSkKLQkJZGVsYXkgKz0gY3B1X2RhaS0+ZHJpdmVyLT5vcHMtPmRlbGF5KHN1YnN0cmVhbSwgY3B1X2RhaSk7Ci0KLQlpZiAoY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+ZGVsYXkpCi0JCWRlbGF5ICs9IGNvZGVjX2RhaS0+ZHJpdmVyLT5vcHMtPmRlbGF5KHN1YnN0cmVhbSwgY29kZWNfZGFpKTsKLQotCWlmIChwbGF0Zm9ybS0+ZHJpdmVyLT5kZWxheSkKLQkJZGVsYXkgKz0gcGxhdGZvcm0tPmRyaXZlci0+ZGVsYXkoc3Vic3RyZWFtLCBjb2RlY19kYWkpOwotCi0JcnVudGltZS0+ZGVsYXkgPSBkZWxheTsKLQotCXJldHVybiBvZmZzZXQ7Ci19Ci0KLS8qIEFTb0MgUENNIG9wZXJhdGlvbnMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc29jX3BjbV9vcHMgPSB7Ci0JLm9wZW4JCT0gc29jX3BjbV9vcGVuLAotCS5jbG9zZQkJPSBzb2NfY29kZWNfY2xvc2UsCi0JLmh3X3BhcmFtcwk9IHNvY19wY21faHdfcGFyYW1zLAotCS5od19mcmVlCT0gc29jX3BjbV9od19mcmVlLAotCS5wcmVwYXJlCT0gc29jX3BjbV9wcmVwYXJlLAotCS50cmlnZ2VyCT0gc29jX3BjbV90cmlnZ2VyLAotCS5wb2ludGVyCT0gc29jX3BjbV9wb2ludGVyLAotfTsKLQogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogLyogcG93ZXJzIGRvd24gYXVkaW8gc3Vic3lzdGVtIGZvciBzdXNwZW5kICovCiBpbnQgc25kX3NvY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTEyNTYsNyArNzA5LDcgQEAKIGludCBzbmRfc29jX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBpOworCWludCBpLCBhYzk3X2NvbnRyb2wgPSAwOwogCiAJLyogQUM5NyBkZXZpY2VzIG1pZ2h0IGhhdmUgb3RoZXIgZHJpdmVycyBoYW5naW5nIG9mZiB0aGVtIHNvCiAJICogbmVlZCB0byByZXN1bWUgaW1tZWRpYXRlbHkuICBPdGhlciBkcml2ZXJzIGRvbid0IGhhdmUgdGhhdApAQCAtMTI2NSwxNCArNzE4LDE1IEBACiAJICovCiAJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9ydGQ7IGkrKykgewogCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBjYXJkLT5ydGRbaV0uY3B1X2RhaTsKLQkJaWYgKGNwdV9kYWktPmRyaXZlci0+YWM5N19jb250cm9sKSB7Ci0JCQlkZXZfZGJnKGRldiwgIlJlc3VtaW5nIEFDOTcgaW1tZWRpYXRlbHlcbiIpOwotCQkJc29jX3Jlc3VtZV9kZWZlcnJlZCgmY2FyZC0+ZGVmZXJyZWRfcmVzdW1lX3dvcmspOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZyhkZXYsICJTY2hlZHVsaW5nIHJlc3VtZSB3b3JrXG4iKTsKLQkJCWlmICghc2NoZWR1bGVfd29yaygmY2FyZC0+ZGVmZXJyZWRfcmVzdW1lX3dvcmspKQotCQkJCWRldl9lcnIoZGV2LCAicmVzdW1lIHdvcmsgaXRlbSBtYXkgYmUgbG9zdFxuIik7Ci0JCX0KKwkJYWM5N19jb250cm9sIHw9IGNwdV9kYWktPmRyaXZlci0+YWM5N19jb250cm9sOworCX0KKwlpZiAoYWM5N19jb250cm9sKSB7CisJCWRldl9kYmcoZGV2LCAiUmVzdW1pbmcgQUM5NyBpbW1lZGlhdGVseVxuIik7CisJCXNvY19yZXN1bWVfZGVmZXJyZWQoJmNhcmQtPmRlZmVycmVkX3Jlc3VtZV93b3JrKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKGRldiwgIlNjaGVkdWxpbmcgcmVzdW1lIHdvcmtcbiIpOworCQlpZiAoIXNjaGVkdWxlX3dvcmsoJmNhcmQtPmRlZmVycmVkX3Jlc3VtZV93b3JrKSkKKwkJCWRldl9lcnIoZGV2LCAicmVzdW1lIHdvcmsgaXRlbSBtYXkgYmUgbG9zdFxuIik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMzkzLDcgKzg0Nyw3IEBACiAJbW9kdWxlX3B1dChjb2RlYy0+ZGV2LT5kcml2ZXItPm93bmVyKTsKIH0KIAotc3RhdGljIHZvaWQgc29jX3JlbW92ZV9kYWlfbGluayhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLCBpbnQgbnVtKQorc3RhdGljIHZvaWQgc29jX3JlbW92ZV9kYWlfbGluayhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLCBpbnQgbnVtLCBpbnQgb3JkZXIpCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9ICZjYXJkLT5ydGRbbnVtXTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwpAQCAtMTQxMCw3ICs4NjQsOCBAQAogCX0KIAogCS8qIHJlbW92ZSB0aGUgQ09ERUMgREFJICovCi0JaWYgKGNvZGVjX2RhaSAmJiBjb2RlY19kYWktPnByb2JlZCkgeworCWlmIChjb2RlY19kYWkgJiYgY29kZWNfZGFpLT5wcm9iZWQgJiYKKwkJCWNvZGVjX2RhaS0+ZHJpdmVyLT5yZW1vdmVfb3JkZXIgPT0gb3JkZXIpIHsKIAkJaWYgKGNvZGVjX2RhaS0+ZHJpdmVyLT5yZW1vdmUpIHsKIAkJCWVyciA9IGNvZGVjX2RhaS0+ZHJpdmVyLT5yZW1vdmUoY29kZWNfZGFpKTsKIAkJCWlmIChlcnIgPCAwKQpAQCAtMTQyMSw3ICs4NzYsOCBAQAogCX0KIAogCS8qIHJlbW92ZSB0aGUgcGxhdGZvcm0gKi8KLQlpZiAocGxhdGZvcm0gJiYgcGxhdGZvcm0tPnByb2JlZCkgeworCWlmIChwbGF0Zm9ybSAmJiBwbGF0Zm9ybS0+cHJvYmVkICYmCisJCQlwbGF0Zm9ybS0+ZHJpdmVyLT5yZW1vdmVfb3JkZXIgPT0gb3JkZXIpIHsKIAkJaWYgKHBsYXRmb3JtLT5kcml2ZXItPnJlbW92ZSkgewogCQkJZXJyID0gcGxhdGZvcm0tPmRyaXZlci0+cmVtb3ZlKHBsYXRmb3JtKTsKIAkJCWlmIChlcnIgPCAwKQpAQCAtMTQzMywxMSArODg5LDEzIEBACiAJfQogCiAJLyogcmVtb3ZlIHRoZSBDT0RFQyAqLwotCWlmIChjb2RlYyAmJiBjb2RlYy0+cHJvYmVkKQorCWlmIChjb2RlYyAmJiBjb2RlYy0+cHJvYmVkICYmCisJCQljb2RlYy0+ZHJpdmVyLT5yZW1vdmVfb3JkZXIgPT0gb3JkZXIpCiAJCXNvY19yZW1vdmVfY29kZWMoY29kZWMpOwogCiAJLyogcmVtb3ZlIHRoZSBjcHVfZGFpICovCi0JaWYgKGNwdV9kYWkgJiYgY3B1X2RhaS0+cHJvYmVkKSB7CisJaWYgKGNwdV9kYWkgJiYgY3B1X2RhaS0+cHJvYmVkICYmCisJCQljcHVfZGFpLT5kcml2ZXItPnJlbW92ZV9vcmRlciA9PSBvcmRlcikgewogCQlpZiAoY3B1X2RhaS0+ZHJpdmVyLT5yZW1vdmUpIHsKIAkJCWVyciA9IGNwdV9kYWktPmRyaXZlci0+cmVtb3ZlKGNwdV9kYWkpOwogCQkJaWYgKGVyciA8IDApCkBAIC0xNDUxLDExICs5MDksMTMgQEAKIAogc3RhdGljIHZvaWQgc29jX3JlbW92ZV9kYWlfbGlua3Moc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKIHsKLQlpbnQgaTsKKwlpbnQgZGFpLCBvcmRlcjsKIAotCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fcnRkOyBpKyspCi0JCXNvY19yZW1vdmVfZGFpX2xpbmsoY2FyZCwgaSk7Ci0KKwlmb3IgKG9yZGVyID0gU05EX1NPQ19DT01QX09SREVSX0ZJUlNUOyBvcmRlciA8PSBTTkRfU09DX0NPTVBfT1JERVJfTEFTVDsKKwkJCW9yZGVyKyspIHsKKwkJZm9yIChkYWkgPSAwOyBkYWkgPCBjYXJkLT5udW1fcnRkOyBkYWkrKykKKwkJCXNvY19yZW1vdmVfZGFpX2xpbmsoY2FyZCwgZGFpLCBvcmRlcik7CisJfQogCWNhcmQtPm51bV9ydGQgPSAwOwogfQogCkBAIC0xNTI2LDYgKzk4Niw1MiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgc29jX3Byb2JlX3BsYXRmb3JtKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCisJCQkgICBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJaW50IHJldCA9IDA7CisJY29uc3Qgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyICpkcml2ZXIgPSBwbGF0Zm9ybS0+ZHJpdmVyOworCisJcGxhdGZvcm0tPmNhcmQgPSBjYXJkOworCXBsYXRmb3JtLT5kYXBtLmNhcmQgPSBjYXJkOworCisJaWYgKCF0cnlfbW9kdWxlX2dldChwbGF0Zm9ybS0+ZGV2LT5kcml2ZXItPm93bmVyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZHJpdmVyLT5kYXBtX3dpZGdldHMpCisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoJnBsYXRmb3JtLT5kYXBtLAorCQkJZHJpdmVyLT5kYXBtX3dpZGdldHMsIGRyaXZlci0+bnVtX2RhcG1fd2lkZ2V0cyk7CisKKwlpZiAoZHJpdmVyLT5wcm9iZSkgeworCQlyZXQgPSBkcml2ZXItPnByb2JlKHBsYXRmb3JtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocGxhdGZvcm0tPmRldiwKKwkJCQkiYXNvYzogZmFpbGVkIHRvIHByb2JlIHBsYXRmb3JtICVzOiAlZFxuIiwKKwkJCQlwbGF0Zm9ybS0+bmFtZSwgcmV0KTsKKwkJCWdvdG8gZXJyX3Byb2JlOworCQl9CisJfQorCisJaWYgKGRyaXZlci0+Y29udHJvbHMpCisJCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBkcml2ZXItPmNvbnRyb2xzLAorCQkJCSAgICAgZHJpdmVyLT5udW1fY29udHJvbHMpOworCWlmIChkcml2ZXItPmRhcG1fcm91dGVzKQorCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmcGxhdGZvcm0tPmRhcG0sIGRyaXZlci0+ZGFwbV9yb3V0ZXMsCisJCQkJCWRyaXZlci0+bnVtX2RhcG1fcm91dGVzKTsKKworCS8qIG1hcmsgcGxhdGZvcm0gYXMgcHJvYmVkIGFuZCBhZGQgdG8gY2FyZCBwbGF0Zm9ybSBsaXN0ICovCisJcGxhdGZvcm0tPnByb2JlZCA9IDE7CisJbGlzdF9hZGQoJnBsYXRmb3JtLT5jYXJkX2xpc3QsICZjYXJkLT5wbGF0Zm9ybV9kZXZfbGlzdCk7CisJbGlzdF9hZGQoJnBsYXRmb3JtLT5kYXBtLmxpc3QsICZjYXJkLT5kYXBtX2xpc3QpOworCisJcmV0dXJuIDA7CisKK2Vycl9wcm9iZToKKwltb2R1bGVfcHV0KHBsYXRmb3JtLT5kZXYtPmRyaXZlci0+b3duZXIpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgcnRkX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KSB7fQogCiBzdGF0aWMgaW50IHNvY19wb3N0X2NvbXBvbmVudF9pbml0KHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCkBAIC0xNTcyLDYgKzEwNzgsNyBAQAogCXJ0ZC0+ZGV2LnBhcmVudCA9IGNhcmQtPmRldjsKIAlydGQtPmRldi5yZWxlYXNlID0gcnRkX3JlbGVhc2U7CiAJcnRkLT5kZXYuaW5pdF9uYW1lID0gbmFtZTsKKwltdXRleF9pbml0KCZydGQtPnBjbV9tdXRleCk7CiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZydGQtPmRldik7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihjYXJkLT5kZXYsCkBAIC0xNTk2LDcgKzExMDMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNvY19wcm9iZV9kYWlfbGluayhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLCBpbnQgbnVtKQorc3RhdGljIGludCBzb2NfcHJvYmVfZGFpX2xpbmsoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwgaW50IG51bSwgaW50IG9yZGVyKQogewogCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9ICZjYXJkLT5kYWlfbGlua1tudW1dOwogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSAmY2FyZC0+cnRkW251bV07CkBAIC0xNjA1LDcgKzExMTIsOCBAQAogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWksICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwogCWludCByZXQ7CiAKLQlkZXZfZGJnKGNhcmQtPmRldiwgInByb2JlICVzIGRhaSBsaW5rICVkXG4iLCBjYXJkLT5uYW1lLCBudW0pOworCWRldl9kYmcoY2FyZC0+ZGV2LCAicHJvYmUgJXMgZGFpIGxpbmsgJWQgbGF0ZSAlZFxuIiwKKwkJCWNhcmQtPm5hbWUsIG51bSwgb3JkZXIpOwogCiAJLyogY29uZmlnIGNvbXBvbmVudHMgKi8KIAljb2RlY19kYWktPmNvZGVjID0gY29kZWM7CkBAIC0xNjE3LDcgKzExMjUsOCBAQAogCXJ0ZC0+cG1kb3duX3RpbWUgPSBwbWRvd25fdGltZTsKIAogCS8qIHByb2JlIHRoZSBjcHVfZGFpICovCi0JaWYgKCFjcHVfZGFpLT5wcm9iZWQpIHsKKwlpZiAoIWNwdV9kYWktPnByb2JlZCAmJgorCQkJY3B1X2RhaS0+ZHJpdmVyLT5wcm9iZV9vcmRlciA9PSBvcmRlcikgewogCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGNwdV9kYWktPmRldi0+ZHJpdmVyLT5vd25lcikpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTYzNiwzMyArMTE0NSwyMyBAQAogCX0KIAogCS8qIHByb2JlIHRoZSBDT0RFQyAqLwotCWlmICghY29kZWMtPnByb2JlZCkgeworCWlmICghY29kZWMtPnByb2JlZCAmJgorCQkJY29kZWMtPmRyaXZlci0+cHJvYmVfb3JkZXIgPT0gb3JkZXIpIHsKIAkJcmV0ID0gc29jX3Byb2JlX2NvZGVjKGNhcmQsIGNvZGVjKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIHByb2JlIHRoZSBwbGF0Zm9ybSAqLwotCWlmICghcGxhdGZvcm0tPnByb2JlZCkgewotCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHBsYXRmb3JtLT5kZXYtPmRyaXZlci0+b3duZXIpKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJaWYgKHBsYXRmb3JtLT5kcml2ZXItPnByb2JlKSB7Ci0JCQlyZXQgPSBwbGF0Zm9ybS0+ZHJpdmVyLT5wcm9iZShwbGF0Zm9ybSk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogZmFpbGVkIHRvIHByb2JlIHBsYXRmb3JtICVzXG4iLAotCQkJCQkJcGxhdGZvcm0tPm5hbWUpOwotCQkJCW1vZHVsZV9wdXQocGxhdGZvcm0tPmRldi0+ZHJpdmVyLT5vd25lcik7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJfQotCQkvKiBtYXJrIHBsYXRmb3JtIGFzIHByb2JlZCBhbmQgYWRkIHRvIGNhcmQgcGxhdGZvcm0gbGlzdCAqLwotCQlwbGF0Zm9ybS0+cHJvYmVkID0gMTsKLQkJbGlzdF9hZGQoJnBsYXRmb3JtLT5jYXJkX2xpc3QsICZjYXJkLT5wbGF0Zm9ybV9kZXZfbGlzdCk7CisJaWYgKCFwbGF0Zm9ybS0+cHJvYmVkICYmCisJCQlwbGF0Zm9ybS0+ZHJpdmVyLT5wcm9iZV9vcmRlciA9PSBvcmRlcikgeworCQlyZXQgPSBzb2NfcHJvYmVfcGxhdGZvcm0oY2FyZCwgcGxhdGZvcm0pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJLyogcHJvYmUgdGhlIENPREVDIERBSSAqLwotCWlmICghY29kZWNfZGFpLT5wcm9iZWQpIHsKKwlpZiAoIWNvZGVjX2RhaS0+cHJvYmVkICYmIGNvZGVjX2RhaS0+ZHJpdmVyLT5wcm9iZV9vcmRlciA9PSBvcmRlcikgewogCQlpZiAoY29kZWNfZGFpLT5kcml2ZXItPnByb2JlKSB7CiAJCQlyZXQgPSBjb2RlY19kYWktPmRyaXZlci0+cHJvYmUoY29kZWNfZGFpKTsKIAkJCWlmIChyZXQgPCAwKSB7CkBAIC0xNjc3LDggKzExNzYsOSBAQAogCQlsaXN0X2FkZCgmY29kZWNfZGFpLT5jYXJkX2xpc3QsICZjYXJkLT5kYWlfZGV2X2xpc3QpOwogCX0KIAotCS8qIERBUE0gZGFpIGxpbmsgc3RyZWFtIHdvcmsgKi8KLQlJTklUX0RFTEFZRURfV09SSygmcnRkLT5kZWxheWVkX3dvcmssIGNsb3NlX2RlbGF5ZWRfd29yayk7CisJLyogY29tcGxldGUgREFJIHByb2JlIGR1cmluZyBsYXN0IHByb2JlICovCisJaWYgKG9yZGVyICE9IFNORF9TT0NfQ09NUF9PUkRFUl9MQVNUKQorCQlyZXR1cm4gMDsKIAogCXJldCA9IHNvY19wb3N0X2NvbXBvbmVudF9pbml0KGNhcmQsIGNvZGVjLCBudW0sIDApOwogCWlmIChyZXQpCkBAIC0xODE3LDcgKzEzMTcsNyBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mICpjb2RlY19jb25mOwogCWVudW0gc25kX3NvY19jb21wcmVzc190eXBlIGNvbXByZXNzX3R5cGU7Ci0JaW50IHJldCwgaTsKKwlpbnQgcmV0LCBpLCBvcmRlcjsKIAogCW11dGV4X2xvY2soJmNhcmQtPm11dGV4KTsKIApAQCAtMTg5NSwxMiArMTM5NSwxNiBAQAogCQkJZ290byBjYXJkX3Byb2JlX2Vycm9yOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fbGlua3M7IGkrKykgewotCQlyZXQgPSBzb2NfcHJvYmVfZGFpX2xpbmsoY2FyZCwgaSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoImFzb2M6IGZhaWxlZCB0byBpbnN0YW50aWF0ZSBjYXJkICVzOiAlZFxuIiwKKwkvKiBlYXJseSBEQUkgbGluayBwcm9iZSAqLworCWZvciAob3JkZXIgPSBTTkRfU09DX0NPTVBfT1JERVJfRklSU1Q7IG9yZGVyIDw9IFNORF9TT0NfQ09NUF9PUkRFUl9MQVNUOworCQkJb3JkZXIrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnVtX2xpbmtzOyBpKyspIHsKKwkJCXJldCA9IHNvY19wcm9iZV9kYWlfbGluayhjYXJkLCBpLCBvcmRlcik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2VycigiYXNvYzogZmFpbGVkIHRvIGluc3RhbnRpYXRlIGNhcmQgJXM6ICVkXG4iLAogCQkJICAgICAgIGNhcmQtPm5hbWUsIHJldCk7Ci0JCQlnb3RvIHByb2JlX2RhaV9lcnI7CisJCQkJZ290byBwcm9iZV9kYWlfZXJyOworCQkJfQogCQl9CiAJfQogCkBAIC0xOTI5LDggKzE0MzMsOSBAQAogCQkgIiVzIiwgY2FyZC0+bmFtZSk7CiAJc25wcmludGYoY2FyZC0+c25kX2NhcmQtPmxvbmduYW1lLCBzaXplb2YoY2FyZC0+c25kX2NhcmQtPmxvbmduYW1lKSwKIAkJICIlcyIsIGNhcmQtPmxvbmdfbmFtZSA/IGNhcmQtPmxvbmdfbmFtZSA6IGNhcmQtPm5hbWUpOwotCXNucHJpbnRmKGNhcmQtPnNuZF9jYXJkLT5kcml2ZXIsIHNpemVvZihjYXJkLT5zbmRfY2FyZC0+ZHJpdmVyKSwKLQkJICIlcyIsIGNhcmQtPmRyaXZlcl9uYW1lID8gY2FyZC0+ZHJpdmVyX25hbWUgOiBjYXJkLT5uYW1lKTsKKwlpZiAoY2FyZC0+ZHJpdmVyX25hbWUpCisJCXN0cmxjcHkoY2FyZC0+c25kX2NhcmQtPmRyaXZlciwgY2FyZC0+ZHJpdmVyX25hbWUsCisJCQlzaXplb2YoY2FyZC0+c25kX2NhcmQtPmRyaXZlcikpOwogCiAJaWYgKGNhcmQtPmxhdGVfcHJvYmUpIHsKIAkJcmV0ID0gY2FyZC0+bGF0ZV9wcm9iZShjYXJkKTsKQEAgLTIwOTUsNjcgKzE2MDAsNiBAQAogCS5yZW1vdmUJCT0gc29jX3JlbW92ZSwKIH07CiAKLS8qIGNyZWF0ZSBhIG5ldyBwY20gKi8KLXN0YXRpYyBpbnQgc29jX25ld19wY20oc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwgaW50IG51bSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0Jc3RydWN0IHNuZF9wY20gKnBjbTsKLQljaGFyIG5ld19uYW1lWzY0XTsKLQlpbnQgcmV0ID0gMCwgcGxheWJhY2sgPSAwLCBjYXB0dXJlID0gMDsKLQotCS8qIGNoZWNrIGNsaWVudCBhbmQgaW50ZXJmYWNlIGh3IGNhcGFiaWxpdGllcyAqLwotCXNucHJpbnRmKG5ld19uYW1lLCBzaXplb2YobmV3X25hbWUpLCAiJXMgJXMtJWQiLAotCQkJcnRkLT5kYWlfbGluay0+c3RyZWFtX25hbWUsIGNvZGVjX2RhaS0+bmFtZSwgbnVtKTsKLQotCWlmIChjb2RlY19kYWktPmRyaXZlci0+cGxheWJhY2suY2hhbm5lbHNfbWluKQotCQlwbGF5YmFjayA9IDE7Ci0JaWYgKGNvZGVjX2RhaS0+ZHJpdmVyLT5jYXB0dXJlLmNoYW5uZWxzX21pbikKLQkJY2FwdHVyZSA9IDE7Ci0KLQlkZXZfZGJnKHJ0ZC0+Y2FyZC0+ZGV2LCAicmVnaXN0ZXJlZCBwY20gIyVkICVzXG4iLG51bSxuZXdfbmFtZSk7Ci0JcmV0ID0gc25kX3BjbV9uZXcocnRkLT5jYXJkLT5zbmRfY2FyZCwgbmV3X25hbWUsCi0JCQludW0sIHBsYXliYWNrLCBjYXB0dXJlLCAmcGNtKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNhbid0IGNyZWF0ZSBwY20gZm9yIGNvZGVjICVzXG4iLCBjb2RlYy0+bmFtZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcnRkLT5wY20gPSBwY207Ci0JcGNtLT5wcml2YXRlX2RhdGEgPSBydGQ7Ci0JaWYgKHBsYXRmb3JtLT5kcml2ZXItPm9wcykgewotCQlzb2NfcGNtX29wcy5tbWFwID0gcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5tbWFwOwotCQlzb2NfcGNtX29wcy5wb2ludGVyID0gcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5wb2ludGVyOwotCQlzb2NfcGNtX29wcy5pb2N0bCA9IHBsYXRmb3JtLT5kcml2ZXItPm9wcy0+aW9jdGw7Ci0JCXNvY19wY21fb3BzLmNvcHkgPSBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPmNvcHk7Ci0JCXNvY19wY21fb3BzLnNpbGVuY2UgPSBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPnNpbGVuY2U7Ci0JCXNvY19wY21fb3BzLmFjayA9IHBsYXRmb3JtLT5kcml2ZXItPm9wcy0+YWNrOwotCQlzb2NfcGNtX29wcy5wYWdlID0gcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5wYWdlOwotCX0KLQotCWlmIChwbGF5YmFjaykKLQkJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNvY19wY21fb3BzKTsKLQotCWlmIChjYXB0dXJlKQotCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzb2NfcGNtX29wcyk7Ci0KLQlpZiAocGxhdGZvcm0tPmRyaXZlci0+cGNtX25ldykgewotCQlyZXQgPSBwbGF0Zm9ybS0+ZHJpdmVyLT5wY21fbmV3KHJ0ZC0+Y2FyZC0+c25kX2NhcmQsCi0JCQkJCQljb2RlY19kYWksIHBjbSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoImFzb2M6IHBsYXRmb3JtIHBjbSBjb25zdHJ1Y3RvciBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXBjbS0+cHJpdmF0ZV9mcmVlID0gcGxhdGZvcm0tPmRyaXZlci0+cGNtX2ZyZWU7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYXNvYzogJXMgPC0+ICVzIG1hcHBpbmcgb2tcbiIsIGNvZGVjX2RhaS0+bmFtZSwKLQkJY3B1X2RhaS0+bmFtZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQogLyoqCiAgKiBzbmRfc29jX2NvZGVjX3ZvbGF0aWxlX3JlZ2lzdGVyOiBSZXBvcnQgaWYgYSByZWdpc3RlciBpcyB2b2xhdGlsZS4KICAqCkBAIC0yMjEwLDYgKzE2NTQsMzggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfY29kZWNfd3JpdGFibGVfcmVnaXN0ZXIpOwogCitpbnQgc25kX3NvY19wbGF0Zm9ybV9yZWFkKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSwKKwkJCQkJdW5zaWduZWQgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJaWYgKCFwbGF0Zm9ybS0+ZHJpdmVyLT5yZWFkKSB7CisJCWRldl9lcnIocGxhdGZvcm0tPmRldiwgInBsYXRmb3JtIGhhcyBubyByZWFkIGJhY2tcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0ID0gcGxhdGZvcm0tPmRyaXZlci0+cmVhZChwbGF0Zm9ybSwgcmVnKTsKKwlkZXZfZGJnKHBsYXRmb3JtLT5kZXYsICJyZWFkICV4ID0+ICV4XG4iLCByZWcsIHJldCk7CisJdHJhY2Vfc25kX3NvY19wcmVnX3JlYWQocGxhdGZvcm0sIHJlZywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3BsYXRmb3JtX3JlYWQpOworCitpbnQgc25kX3NvY19wbGF0Zm9ybV93cml0ZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0sCisJCQkJCSB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWlmICghcGxhdGZvcm0tPmRyaXZlci0+d3JpdGUpIHsKKwkJZGV2X2VycihwbGF0Zm9ybS0+ZGV2LCAicGxhdGZvcm0gaGFzIG5vIHdyaXRlIGJhY2tcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2X2RiZyhwbGF0Zm9ybS0+ZGV2LCAid3JpdGUgJXggPSAleFxuIiwgcmVnLCB2YWwpOworCXRyYWNlX3NuZF9zb2NfcHJlZ193cml0ZShwbGF0Zm9ybSwgcmVnLCB2YWwpOworCXJldHVybiBwbGF0Zm9ybS0+ZHJpdmVyLT53cml0ZShwbGF0Zm9ybSwgcmVnLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19wbGF0Zm9ybV93cml0ZSk7CisKIC8qKgogICogc25kX3NvY19uZXdfYWM5N19jb2RlYyAtIGluaXRhaWxpc2UgQUM5NyBkZXZpY2UKICAqIEBjb2RlYzogYXVkaW8gY29kZWMKQEAgLTIzMjIsNyArMTc5OCw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlvbGQgPSByZXQ7Ci0JbmV3ID0gKG9sZCAmIH5tYXNrKSB8IHZhbHVlOworCW5ldyA9IChvbGQgJiB+bWFzaykgfCAodmFsdWUgJiBtYXNrKTsKIAljaGFuZ2UgPSBvbGQgIT0gbmV3OwogCWlmIChjaGFuZ2UpIHsKIAkJcmV0ID0gc25kX3NvY193cml0ZShjb2RlYywgcmVnLCBuZXcpOwpAQCAtMjQ4OSw2ICsxOTY1LDM2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2FkZF9jb250cm9scyk7CiAKIC8qKgorICogc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMgLSBhZGQgYW4gYXJyYXkgb2YgY29udHJvbHMgdG8gYSBwbGF0Zm9ybS4KKyAqIENvbnZpZW5pZW5jZSBmdW5jdGlvbiB0byBhZGQgYSBsaXN0IG9mIGNvbnRyb2xzLgorICoKKyAqIEBwbGF0Zm9ybTogcGxhdGZvcm0gdG8gYWRkIGNvbnRyb2xzIHRvCisgKiBAY29udHJvbHM6IGFycmF5IG9mIGNvbnRyb2xzIHRvIGFkZAorICogQG51bV9jb250cm9sczogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQorICoKKyAqIFJldHVybiAwIGZvciBzdWNjZXNzLCBlbHNlIGVycm9yLgorICovCitpbnQgc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtLAorCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpjb250cm9scywgaW50IG51bV9jb250cm9scykKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybS0+Y2FyZC0+c25kX2NhcmQ7CisJaW50IGVyciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY29udHJvbHM7IGkrKykgeworCQljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqY29udHJvbCA9ICZjb250cm9sc1tpXTsKKwkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX3NvY19jbmV3KGNvbnRyb2wsIHBsYXRmb3JtLAorCQkJCWNvbnRyb2wtPm5hbWUsIE5VTEwpKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRldl9lcnIocGxhdGZvcm0tPmRldiwgIkZhaWxlZCB0byBhZGQgJXMgJWRcbiIsY29udHJvbC0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKTsKKworLyoqCiAgKiBzbmRfc29jX2luZm9fZW51bV9kb3VibGUgLSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBpbmZvIGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKICAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCkBAIC0zNjMyLDYgKzMxMzgsOCBAQAogCiAJcGxhdGZvcm0tPmRldiA9IGRldjsKIAlwbGF0Zm9ybS0+ZHJpdmVyID0gcGxhdGZvcm1fZHJ2OworCXBsYXRmb3JtLT5kYXBtLmRldiA9IGRldjsKKwlwbGF0Zm9ybS0+ZGFwbS5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogCiAJbXV0ZXhfbG9jaygmY2xpZW50X211dGV4KTsKIAlsaXN0X2FkZCgmcGxhdGZvcm0tPmxpc3QsICZwbGF0Zm9ybV9saXN0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtZGFwbS5jIGIvc291bmQvc29jL3NvYy1kYXBtLmMKaW5kZXggNzc2ZTZmNC4uZmJmY2RhMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1kYXBtLmMKKysrIGIvc291bmQvc29jL3NvYy1kYXBtLmMKQEAgLTEyNCw2ICsxMjQsNTEgQEAKIAlyZXR1cm4ga21lbWR1cChfd2lkZ2V0LCBzaXplb2YoKl93aWRnZXQpLCBHRlBfS0VSTkVMKTsKIH0KIAorc3RhdGljIGludCBzb2Nfd2lkZ2V0X3JlYWQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCByZWcpCit7CisJaWYgKHctPmNvZGVjKQorCQlyZXR1cm4gc25kX3NvY19yZWFkKHctPmNvZGVjLCByZWcpOworCWVsc2UgaWYgKHctPnBsYXRmb3JtKQorCQlyZXR1cm4gc25kX3NvY19wbGF0Zm9ybV9yZWFkKHctPnBsYXRmb3JtLCByZWcpOworCisJZGV2X2Vycih3LT5kYXBtLT5kZXYsICJubyB2YWxpZCB3aWRnZXQgcmVhZCBtZXRob2RcbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzb2Nfd2lkZ2V0X3dyaXRlKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBpbnQgcmVnLCBpbnQgdmFsKQoreworCWlmICh3LT5jb2RlYykKKwkJcmV0dXJuIHNuZF9zb2Nfd3JpdGUody0+Y29kZWMsIHJlZywgdmFsKTsKKwllbHNlIGlmICh3LT5wbGF0Zm9ybSkKKwkJcmV0dXJuIHNuZF9zb2NfcGxhdGZvcm1fd3JpdGUody0+cGxhdGZvcm0sIHJlZywgdmFsKTsKKworCWRldl9lcnIody0+ZGFwbS0+ZGV2LCAibm8gdmFsaWQgd2lkZ2V0IHdyaXRlIG1ldGhvZFxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNvY193aWRnZXRfdXBkYXRlX2JpdHMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHZhbHVlKQoreworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IG9sZCwgbmV3OworCWludCByZXQ7CisKKwlyZXQgPSBzb2Nfd2lkZ2V0X3JlYWQodywgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW9sZCA9IHJldDsKKwluZXcgPSAob2xkICYgfm1hc2spIHwgKHZhbHVlICYgbWFzayk7CisJY2hhbmdlID0gb2xkICE9IG5ldzsKKwlpZiAoY2hhbmdlKSB7CisJCXJldCA9IHNvY193aWRnZXRfd3JpdGUodywgcmVnLCBuZXcpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGNoYW5nZTsKK30KKwogLyoqCiAgKiBzbmRfc29jX2RhcG1fc2V0X2JpYXNfbGV2ZWwgLSBzZXQgdGhlIGJpYXMgbGV2ZWwgZm9yIHRoZSBzeXN0ZW0KICAqIEBkYXBtOiBEQVBNIGNvbnRleHQKQEAgLTEzOSwzOSArMTg0LDI2IEBACiAJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGRhcG0tPmNhcmQ7CiAJaW50IHJldCA9IDA7CiAKLQlzd2l0Y2ggKGxldmVsKSB7Ci0JY2FzZSBTTkRfU09DX0JJQVNfT046Ci0JCWRldl9kYmcoZGFwbS0+ZGV2LCAiU2V0dGluZyBmdWxsIGJpYXNcbiIpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgotCQlkZXZfZGJnKGRhcG0tPmRldiwgIlNldHRpbmcgYmlhcyBwcmVwYXJlXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJZGV2X2RiZyhkYXBtLT5kZXYsICJTZXR0aW5nIHN0YW5kYnkgYmlhc1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJZGV2X2RiZyhkYXBtLT5kZXYsICJTZXR0aW5nIGJpYXMgb2ZmXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihkYXBtLT5kZXYsICJTZXR0aW5nIGludmFsaWQgYmlhcyAlZFxuIiwgbGV2ZWwpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAl0cmFjZV9zbmRfc29jX2JpYXNfbGV2ZWxfc3RhcnQoY2FyZCwgbGV2ZWwpOwogCiAJaWYgKGNhcmQgJiYgY2FyZC0+c2V0X2JpYXNfbGV2ZWwpCi0JCXJldCA9IGNhcmQtPnNldF9iaWFzX2xldmVsKGNhcmQsIGxldmVsKTsKLQlpZiAocmV0ID09IDApIHsKLQkJaWYgKGRhcG0tPmNvZGVjICYmIGRhcG0tPmNvZGVjLT5kcml2ZXItPnNldF9iaWFzX2xldmVsKQotCQkJcmV0ID0gZGFwbS0+Y29kZWMtPmRyaXZlci0+c2V0X2JpYXNfbGV2ZWwoZGFwbS0+Y29kZWMsIGxldmVsKTsKKwkJcmV0ID0gY2FyZC0+c2V0X2JpYXNfbGV2ZWwoY2FyZCwgZGFwbSwgbGV2ZWwpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZGFwbS0+Y29kZWMpIHsKKwkJaWYgKGRhcG0tPmNvZGVjLT5kcml2ZXItPnNldF9iaWFzX2xldmVsKQorCQkJcmV0ID0gZGFwbS0+Y29kZWMtPmRyaXZlci0+c2V0X2JpYXNfbGV2ZWwoZGFwbS0+Y29kZWMsCisJCQkJCQkJCSAgbGV2ZWwpOwogCQllbHNlCiAJCQlkYXBtLT5iaWFzX2xldmVsID0gbGV2ZWw7CiAJfQotCWlmIChyZXQgPT0gMCkgewotCQlpZiAoY2FyZCAmJiBjYXJkLT5zZXRfYmlhc19sZXZlbF9wb3N0KQotCQkJcmV0ID0gY2FyZC0+c2V0X2JpYXNfbGV2ZWxfcG9zdChjYXJkLCBsZXZlbCk7Ci0JfQorCWlmIChyZXQgIT0gMCkKKwkJZ290byBvdXQ7CiAKKwlpZiAoY2FyZCAmJiBjYXJkLT5zZXRfYmlhc19sZXZlbF9wb3N0KQorCQlyZXQgPSBjYXJkLT5zZXRfYmlhc19sZXZlbF9wb3N0KGNhcmQsIGRhcG0sIGxldmVsKTsKK291dDoKIAl0cmFjZV9zbmRfc29jX2JpYXNfbGV2ZWxfZG9uZShjYXJkLCBsZXZlbCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTk0LDcgKzIyNiw3IEBACiAJCXVuc2lnbmVkIGludCBtYXNrID0gKDEgPDwgZmxzKG1heCkpIC0gMTsKIAkJdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7CiAKLQkJdmFsID0gc25kX3NvY19yZWFkKHctPmNvZGVjLCByZWcpOworCQl2YWwgPSBzb2Nfd2lkZ2V0X3JlYWQodywgcmVnKTsKIAkJdmFsID0gKHZhbCA+PiBzaGlmdCkgJiBtYXNrOwogCiAJCWlmICgoaW52ZXJ0ICYmICF2YWwpIHx8ICghaW52ZXJ0ICYmIHZhbCkpCkBAIC0yMDksOCArMjQxLDggQEAKIAkJaW50IHZhbCwgaXRlbSwgYml0bWFzazsKIAogCQlmb3IgKGJpdG1hc2sgPSAxOyBiaXRtYXNrIDwgZS0+bWF4OyBiaXRtYXNrIDw8PSAxKQotCQk7Ci0JCXZhbCA9IHNuZF9zb2NfcmVhZCh3LT5jb2RlYywgZS0+cmVnKTsKKwkJCTsKKwkJdmFsID0gc29jX3dpZGdldF9yZWFkKHcsIGUtPnJlZyk7CiAJCWl0ZW0gPSAodmFsID4+IGUtPnNoaWZ0X2wpICYgKGJpdG1hc2sgLSAxKTsKIAogCQlwLT5jb25uZWN0ID0gMDsKQEAgLTI0MCw3ICsyNzIsNyBAQAogCQkJdy0+a2NvbnRyb2xfbmV3c1tpXS5wcml2YXRlX3ZhbHVlOwogCQlpbnQgdmFsLCBpdGVtOwogCi0JCXZhbCA9IHNuZF9zb2NfcmVhZCh3LT5jb2RlYywgZS0+cmVnKTsKKwkJdmFsID0gc29jX3dpZGdldF9yZWFkKHcsIGUtPnJlZyk7CiAJCXZhbCA9ICh2YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOwogCQlmb3IgKGl0ZW0gPSAwOyBpdGVtIDwgZS0+bWF4OyBpdGVtKyspIHsKIAkJCWlmICh2YWwgPT0gZS0+dmFsdWVzW2l0ZW1dKQpAQCAtMzUwLDkgKzM4Miw5IEBACiB9CiAKIC8qIGNyZWF0ZSBuZXcgZGFwbSBtaXhlciBjb250cm9sICovCi1zdGF0aWMgaW50IGRhcG1fbmV3X21peGVyKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKK3N0YXRpYyBpbnQgZGFwbV9uZXdfbWl4ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKIAlpbnQgaSwgcmV0ID0gMDsKIAlzaXplX3QgbmFtZV9sZW4sIHByZWZpeF9sZW47CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOwpAQCAtNDUwLDkgKzQ4Miw5IEBACiB9CiAKIC8qIGNyZWF0ZSBuZXcgZGFwbSBtdXggY29udHJvbCAqLwotc3RhdGljIGludCBkYXBtX25ld19tdXgoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQorc3RhdGljIGludCBkYXBtX25ld19tdXgoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGggPSBOVUxMOwogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRhcG0tPmNhcmQtPnNuZF9jYXJkOwpAQCAtNTM1LDggKzU2Nyw3IEBACiB9CiAKIC8qIGNyZWF0ZSBuZXcgZGFwbSB2b2x1bWUgY29udHJvbCAqLwotc3RhdGljIGludCBkYXBtX25ld19wZ2Eoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQorc3RhdGljIGludCBkYXBtX25ld19wZ2Eoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CiAJaWYgKHctPm51bV9rY29udHJvbHMpCiAJCWRldl9lcnIody0+ZGFwbS0+ZGV2LApAQCAtNjA3LDYgKzYzOCw5IEBACiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmd2lkZ2V0LT5zaW5rcywgbGlzdF9zb3VyY2UpIHsKKwkJaWYgKHBhdGgtPndlYWspCisJCQljb250aW51ZTsKKwogCQlpZiAocGF0aC0+d2Fsa2VkKQogCQkJY29udGludWU7CiAKQEAgLTY1Nyw2ICs2OTEsOSBAQAogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJndpZGdldC0+c291cmNlcywgbGlzdF9zaW5rKSB7CisJCWlmIChwYXRoLT53ZWFrKQorCQkJY29udGludWU7CisKIAkJaWYgKHBhdGgtPndhbGtlZCkKIAkJCWNvbnRpbnVlOwogCkBAIC02ODIsNyArNzE5LDcgQEAKIAllbHNlCiAJCXZhbCA9IHctPm9mZl92YWw7CiAKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKHctPmNvZGVjLCAtKHctPnJlZyArIDEpLAorCXNvY193aWRnZXRfdXBkYXRlX2JpdHModywgLSh3LT5yZWcgKyAxKSwKIAkJCSAgICB3LT5tYXNrIDw8IHctPnNoaWZ0LCB2YWwgPDwgdy0+c2hpZnQpOwogCiAJcmV0dXJuIDA7CkBAIC03MzgsNiArNzc1LDkgQEAKIAogCS8qIENoZWNrIGlmIG9uZSBvZiBvdXIgb3V0cHV0cyBpcyBjb25uZWN0ZWQgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhdGgsICZ3LT5zaW5rcywgbGlzdF9zb3VyY2UpIHsKKwkJaWYgKHBhdGgtPndlYWspCisJCQljb250aW51ZTsKKwogCQlpZiAocGF0aC0+Y29ubmVjdGVkICYmCiAJCSAgICAhcGF0aC0+Y29ubmVjdGVkKHBhdGgtPnNvdXJjZSwgcGF0aC0+c2luaykpCiAJCQljb250aW51ZTsKQEAgLTg4NiwxMSArOTI2LDE3IEBACiAJfQogCiAJaWYgKHJlZyA+PSAwKSB7CisJCS8qIEFueSB3aWRnZXQgd2lsbCBkbywgdGhleSBzaG91bGQgYWxsIGJlIHVwZGF0aW5nIHRoZQorCQkgKiBzYW1lIHJlZ2lzdGVyLgorCQkgKi8KKwkJdyA9IGxpc3RfZmlyc3RfZW50cnkocGVuZGluZywgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQsCisJCQkJICAgICBwb3dlcl9saXN0KTsKKwogCQlwb3BfZGJnKGRhcG0tPmRldiwgY2FyZC0+cG9wX3RpbWUsCiAJCQkicG9wIHRlc3QgOiBBcHBseWluZyAweCV4LzB4JXggdG8gJXggaW4gJWRtc1xuIiwKIAkJCXZhbHVlLCBtYXNrLCByZWcsIGNhcmQtPnBvcF90aW1lKTsKIAkJcG9wX3dhaXQoY2FyZC0+cG9wX3RpbWUpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGRhcG0tPmNvZGVjLCByZWcsIG1hc2ssIHZhbHVlKTsKKwkJc29jX3dpZGdldF91cGRhdGVfYml0cyh3LCByZWcsIG1hc2ssIHZhbHVlKTsKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsIHBlbmRpbmcsIHBvd2VyX2xpc3QpIHsKQEAgLTk0Myw3ICs5ODksNyBAQAogCiAJCQlJTklUX0xJU1RfSEVBRCgmcGVuZGluZyk7CiAJCQljdXJfc29ydCA9IC0xOwotCQkJY3VyX3N1YnNlcSA9IC0xOworCQkJY3VyX3N1YnNlcSA9IElOVF9NSU47CiAJCQljdXJfcmVnID0gU05EX1NPQ19OT1BNOwogCQkJY3VyX2RhcG0gPSBOVUxMOwogCQl9CkBAIC0xMDQyLDE2ICsxMDg4LDE3IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkID0gZGF0YTsKIAlpbnQgcmV0OwogCi0JaWYgKGQtPmRldl9wb3dlciAmJiBkLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkvKiBJZiB3ZSdyZSBvZmYgYW5kIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBiZSBnbyBpbnRvIFNUQU5EQlkgKi8KKwlpZiAoZC0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGICYmCisJICAgIGQtPnRhcmdldF9iaWFzX2xldmVsICE9IFNORF9TT0NfQklBU19PRkYpIHsKIAkJcmV0ID0gc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKGQsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJZGV2X2VycihkLT5kZXYsCiAJCQkJIkZhaWxlZCB0byB0dXJuIG9uIGJpYXM6ICVkXG4iLCByZXQpOwogCX0KIAotCS8qIElmIHdlJ3JlIGNoYW5naW5nIHRvIGFsbCBvbiBvciBhbGwgb2ZmIHRoZW4gcHJlcGFyZSAqLwotCWlmICgoZC0+ZGV2X3Bvd2VyICYmIGQtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpIHx8Ci0JICAgICghZC0+ZGV2X3Bvd2VyICYmIGQtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09OKSkgeworCS8qIFByZXBhcmUgZm9yIGEgU1RBRERCWS0+T04gb3IgT04tPlNUQU5EQlkgdHJhbnNpdGlvbiAqLworCWlmIChkLT5iaWFzX2xldmVsICE9IGQtPnRhcmdldF9iaWFzX2xldmVsKSB7CiAJCXJldCA9IHNuZF9zb2NfZGFwbV9zZXRfYmlhc19sZXZlbChkLCBTTkRfU09DX0JJQVNfUFJFUEFSRSk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCWRldl9lcnIoZC0+ZGV2LApAQCAtMTA2OCw3ICsxMTE1LDkgQEAKIAlpbnQgcmV0OwogCiAJLyogSWYgd2UganVzdCBwb3dlcmVkIHRoZSBsYXN0IHRoaW5nIG9mZiBkcm9wIHRvIHN0YW5kYnkgYmlhcyAqLwotCWlmIChkLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19QUkVQQVJFICYmICFkLT5kZXZfcG93ZXIpIHsKKwlpZiAoZC0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfUFJFUEFSRSAmJgorCSAgICAoZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkgfHwKKwkgICAgIGQtPnRhcmdldF9iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpKSB7CiAJCXJldCA9IHNuZF9zb2NfZGFwbV9zZXRfYmlhc19sZXZlbChkLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCWRldl9lcnIoZC0+ZGV2LCAiRmFpbGVkIHRvIGFwcGx5IHN0YW5kYnkgYmlhczogJWRcbiIsCkBAIC0xMDc2LDE0ICsxMTI1LDE2IEBACiAJfQogCiAJLyogSWYgd2UncmUgaW4gc3RhbmRieSBhbmQgY2FuIHN1cHBvcnQgYmlhcyBvZmYgdGhlbiBkbyB0aGF0ICovCi0JaWYgKGQtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkgJiYgZC0+aWRsZV9iaWFzX29mZikgeworCWlmIChkLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19TVEFOREJZICYmCisJICAgIGQtPnRhcmdldF9iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKIAkJcmV0ID0gc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKGQsIFNORF9TT0NfQklBU19PRkYpOwogCQlpZiAocmV0ICE9IDApCiAJCQlkZXZfZXJyKGQtPmRldiwgIkZhaWxlZCB0byB0dXJuIG9mZiBiaWFzOiAlZFxuIiwgcmV0KTsKIAl9CiAKIAkvKiBJZiB3ZSBqdXN0IHBvd2VyZWQgdXAgdGhlbiBtb3ZlIHRvIGFjdGl2ZSBiaWFzICovCi0JaWYgKGQtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1BSRVBBUkUgJiYgZC0+ZGV2X3Bvd2VyKSB7CisJaWYgKGQtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1BSRVBBUkUgJiYKKwkgICAgZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09OKSB7CiAJCXJldCA9IHNuZF9zb2NfZGFwbV9zZXRfYmlhc19sZXZlbChkLCBTTkRfU09DX0JJQVNfT04pOwogCQlpZiAocmV0ICE9IDApCiAJCQlkZXZfZXJyKGQtPmRldiwgIkZhaWxlZCB0byBhcHBseSBhY3RpdmUgYmlhczogJWRcbiIsCkBAIC0xMTA4LDEzICsxMTU5LDE5IEBACiAJTElTVF9IRUFEKHVwX2xpc3QpOwogCUxJU1RfSEVBRChkb3duX2xpc3QpOwogCUxJU1RfSEVBRChhc3luY19kb21haW4pOworCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGJpYXM7CiAJaW50IHBvd2VyOwogCiAJdHJhY2Vfc25kX3NvY19kYXBtX3N0YXJ0KGNhcmQpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmY2FyZC0+ZGFwbV9saXN0LCBsaXN0KQotCQlpZiAoZC0+bl93aWRnZXRzIHx8IGQtPmNvZGVjID09IE5VTEwpCi0JCQlkLT5kZXZfcG93ZXIgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkgeworCQlpZiAoZC0+bl93aWRnZXRzIHx8IGQtPmNvZGVjID09IE5VTEwpIHsKKwkJCWlmIChkLT5pZGxlX2JpYXNfb2ZmKQorCQkJCWQtPnRhcmdldF9iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX09GRjsKKwkJCWVsc2UKKwkJCQlkLT50YXJnZXRfYmlhc19sZXZlbCA9IFNORF9TT0NfQklBU19TVEFOREJZOworCQl9CisJfQogCiAJLyogQ2hlY2sgd2hpY2ggd2lkZ2V0cyB3ZSBuZWVkIHRvIHBvd2VyIGFuZCBzdG9yZSB0aGVtIGluCiAJICogbGlzdHMgaW5kaWNhdGluZyBpZiB0aGV5IHNob3VsZCBiZSBwb3dlcmVkIHVwIG9yIGRvd24uCkBAIC0xMTM2LDggKzExOTMsMjcgQEAKIAkJCQlwb3dlciA9IHctPnBvd2VyX2NoZWNrKHcpOwogCQkJZWxzZQogCQkJCXBvd2VyID0gMTsKLQkJCWlmIChwb3dlcikKLQkJCQl3LT5kYXBtLT5kZXZfcG93ZXIgPSAxOworCisJCQlpZiAocG93ZXIpIHsKKwkJCQlkID0gdy0+ZGFwbTsKKworCQkJCS8qIFN1cHBsaWVzIGFuZCBtaWNiaWFzZXMgb25seSBicmluZworCQkJCSAqIHRoZSBjb250ZXh0IHVwIHRvIFNUQU5EQlkgYXMgdW5sZXNzCisJCQkJICogc29tZXRoaW5nIGVsc2UgaXMgYWN0aXZlIGFuZAorCQkJCSAqIHBhc3NpbmcgYXVkaW8gdGhleSBnZW5lcmFsbHkgZG9uJ3QKKwkJCQkgKiByZXF1aXJlIGZ1bGwgcG93ZXIuCisJCQkJICovCisJCQkJc3dpdGNoICh3LT5pZCkgeworCQkJCWNhc2Ugc25kX3NvY19kYXBtX3N1cHBseToKKwkJCQljYXNlIHNuZF9zb2NfZGFwbV9taWNiaWFzOgorCQkJCQlpZiAoZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPCBTTkRfU09DX0JJQVNfU1RBTkRCWSkKKwkJCQkJCWQtPnRhcmdldF9iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX1NUQU5EQlk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWQtPnRhcmdldF9iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX09OOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CiAKIAkJCWlmICh3LT5wb3dlciA9PSBwb3dlcikKIAkJCQljb250aW51ZTsKQEAgLTExNjEsMjQgKzEyMzcsMTkgQEAKIAkJc3dpdGNoIChldmVudCkgewogCQljYXNlIFNORF9TT0NfREFQTV9TVFJFQU1fU1RBUlQ6CiAJCWNhc2UgU05EX1NPQ19EQVBNX1NUUkVBTV9SRVNVTUU6Ci0JCQlkYXBtLT5kZXZfcG93ZXIgPSAxOworCQkJZGFwbS0+dGFyZ2V0X2JpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT047CiAJCQlicmVhazsKIAkJY2FzZSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUT1A6Ci0JCQlkYXBtLT5kZXZfcG93ZXIgPSAhIWRhcG0tPmNvZGVjLT5hY3RpdmU7CisJCQlpZiAoZGFwbS0+Y29kZWMtPmFjdGl2ZSkKKwkJCQlkYXBtLT50YXJnZXRfYmlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PTjsKKwkJCWVsc2UKKwkJCQlkYXBtLT50YXJnZXRfYmlhc19sZXZlbCA9IFNORF9TT0NfQklBU19TVEFOREJZOwogCQkJYnJlYWs7CiAJCWNhc2UgU05EX1NPQ19EQVBNX1NUUkVBTV9TVVNQRU5EOgotCQkJZGFwbS0+ZGV2X3Bvd2VyID0gMDsKKwkJCWRhcG0tPnRhcmdldF9iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX1NUQU5EQlk7CiAJCQlicmVhazsKIAkJY2FzZSBTTkRfU09DX0RBUE1fU1RSRUFNX05PUDoKLQkJCXN3aXRjaCAoZGFwbS0+Ymlhc19sZXZlbCkgewotCQkJCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCQkJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgotCQkJCQlkYXBtLT5kZXZfcG93ZXIgPSAwOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlkYXBtLT5kZXZfcG93ZXIgPSAxOwotCQkJCQlicmVhazsKLQkJCX0KKwkJCWRhcG0tPnRhcmdldF9iaWFzX2xldmVsID0gZGFwbS0+Ymlhc19sZXZlbDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CkBAIC0xMTg2LDEyICsxMjU3LDEyIEBACiAJfQogCiAJLyogRm9yY2UgYWxsIGNvbnRleHRzIGluIHRoZSBjYXJkIHRvIHRoZSBzYW1lIGJpYXMgc3RhdGUgKi8KLQlwb3dlciA9IDA7CisJYmlhcyA9IFNORF9TT0NfQklBU19PRkY7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmY2FyZC0+ZGFwbV9saXN0LCBsaXN0KQotCQlpZiAoZC0+ZGV2X3Bvd2VyKQotCQkJcG93ZXIgPSAxOworCQlpZiAoZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPiBiaWFzKQorCQkJYmlhcyA9IGQtPnRhcmdldF9iaWFzX2xldmVsOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkKLQkJZC0+ZGV2X3Bvd2VyID0gcG93ZXI7CisJCWQtPnRhcmdldF9iaWFzX2xldmVsID0gYmlhczsKIAogCiAJLyogUnVuIGFsbCB0aGUgYmlhcyBjaGFuZ2VzIGluIHBhcmFsbGVsICovCkBAIC0xNzk1LDYgKzE4NjYsODQgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKTsKIAorc3RhdGljIGludCBzbmRfc29jX2RhcG1fd2Vha19yb3V0ZShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCisJCQkJICAgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqcm91dGUpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSA9IGRhcG1fZmluZF93aWRnZXQoZGFwbSwKKwkJCQkJCQkgICAgICByb3V0ZS0+c291cmNlLAorCQkJCQkJCSAgICAgIHRydWUpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rID0gZGFwbV9maW5kX3dpZGdldChkYXBtLAorCQkJCQkJCSAgICByb3V0ZS0+c2luaywKKwkJCQkJCQkgICAgdHJ1ZSk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOworCWludCBjb3VudCA9IDA7CisKKwlpZiAoIXNvdXJjZSkgeworCQlkZXZfZXJyKGRhcG0tPmRldiwgIlVuYWJsZSB0byBmaW5kIHNvdXJjZSAlcyBmb3Igd2VhayByb3V0ZVxuIiwKKwkJCXJvdXRlLT5zb3VyY2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIXNpbmspIHsKKwkJZGV2X2VycihkYXBtLT5kZXYsICJVbmFibGUgdG8gZmluZCBzaW5rICVzIGZvciB3ZWFrIHJvdXRlXG4iLAorCQkJcm91dGUtPnNpbmspOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAocm91dGUtPmNvbnRyb2wgfHwgcm91dGUtPmNvbm5lY3RlZCkKKwkJZGV2X3dhcm4oZGFwbS0+ZGV2LCAiSWdub3JpbmcgY29udHJvbCBmb3Igd2VhayByb3V0ZSAlcy0+JXNcbiIsCisJCQkgcm91dGUtPnNvdXJjZSwgcm91dGUtPnNpbmspOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmc291cmNlLT5zaW5rcywgbGlzdF9zb3VyY2UpIHsKKwkJaWYgKHBhdGgtPnNpbmsgPT0gc2luaykgeworCQkJcGF0aC0+d2VhayA9IDE7CisJCQljb3VudCsrOworCQl9CisJfQorCisJaWYgKGNvdW50ID09IDApCisJCWRldl9lcnIoZGFwbS0+ZGV2LCAiTm8gcGF0aCBmb3VuZCBmb3Igd2VhayByb3V0ZSAlcy0+JXNcbiIsCisJCQlyb3V0ZS0+c291cmNlLCByb3V0ZS0+c2luayk7CisJaWYgKGNvdW50ID4gMSkKKwkJZGV2X3dhcm4oZGFwbS0+ZGV2LCAiJWQgcGF0aHMgZm91bmQgZm9yIHdlYWsgcm91dGUgJXMtPiVzXG4iLAorCQkJIGNvdW50LCByb3V0ZS0+c291cmNlLCByb3V0ZS0+c2luayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzbmRfc29jX2RhcG1fd2Vha19yb3V0ZXMgLSBNYXJrIHJvdXRlcyBiZXR3ZWVuIERBUE0gd2lkZ2V0cyBhcyB3ZWFrCisgKiBAZGFwbTogREFQTSBjb250ZXh0CisgKiBAcm91dGU6IGF1ZGlvIHJvdXRlcworICogQG51bTogbnVtYmVyIG9mIHJvdXRlcworICoKKyAqIE1hcmsgZXhpc3Rpbmcgcm91dGVzIG1hdGNoaW5nIHRob3NlIHNwZWNpZmllZCBpbiB0aGUgcGFzc2VkIGFycmF5CisgKiBhcyBiZWluZyB3ZWFrLCBtZWFuaW5nIHRoYXQgdGhleSBhcmUgaWdub3JlZCBmb3IgdGhlIHB1cnBvc2Ugb2YKKyAqIHBvd2VyIGRlY2lzaW9ucy4gIFRoZSBtYWluIGludGVuZGVkIHVzZSBjYXNlIGlzIGZvciBzaWRldG9uZSBwYXRocworICogd2hpY2ggY291cGxlIGF1ZGlvIGJldHdlZW4gb3RoZXIgaW5kZXBlbmRlbnQgcGF0aHMgaWYgdGhleSBhcmUgYm90aAorICogYWN0aXZlIGluIG9yZGVyIHRvIG1ha2UgdGhlIGNvbWJpbmF0aW9uIHdvcmsgYmV0dGVyIGF0IHRoZSB1c2VyCisgKiBsZXZlbCBidXQgd2hpY2ggYXJlbid0IGludGVuZGVkIHRvIGJlICJ1c2VkIi4KKyAqCisgKiBOb3RlIHRoYXQgQ09ERUMgZHJpdmVycyBzaG91bGQgbm90IHVzZSB0aGlzIGFzIHNpZGV0b25lIHR5cGUgcGF0aHMKKyAqIGNhbiBmcmVxdWVudGx5IGFsc28gYmUgdXNlZCBhcyBieXBhc3MgcGF0aHMuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fd2Vha19yb3V0ZXMoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAorCQkJICAgICBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlICpyb3V0ZSwgaW50IG51bSkKK3sKKwlpbnQgaSwgZXJyOworCWludCByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCWVyciA9IHNuZF9zb2NfZGFwbV93ZWFrX3JvdXRlKGRhcG0sIHJvdXRlKTsKKwkJaWYgKGVycikKKwkJCXJldCA9IGVycjsKKwkJcm91dGUrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3dlYWtfcm91dGVzKTsKKwogLyoqCiAgKiBzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMgLSBhZGQgbmV3IGRhcG0gd2lkZ2V0cwogICogQGRhcG06IERBUE0gY29udGV4dApAQCAtMTgyNiwxMyArMTk3NSwxMyBAQAogCQljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjoKIAkJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsOgogCQkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXI7Ci0JCQlkYXBtX25ld19taXhlcihkYXBtLCB3KTsKKwkJCWRhcG1fbmV3X21peGVyKHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX211eDoKIAkJY2FzZSBzbmRfc29jX2RhcG1fdmlydF9tdXg6CiAJCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKIAkJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOwotCQkJZGFwbV9uZXdfbXV4KGRhcG0sIHcpOworCQkJZGFwbV9uZXdfbXV4KHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX2FkYzoKIAkJY2FzZSBzbmRfc29jX2RhcG1fYWlmX291dDoKQEAgLTE4NDUsNyArMTk5NCw3IEBACiAJCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKIAkJY2FzZSBzbmRfc29jX2RhcG1fb3V0X2RydjoKIAkJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOwotCQkJZGFwbV9uZXdfcGdhKGRhcG0sIHcpOworCQkJZGFwbV9uZXdfcGdhKHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX2lucHV0OgogCQljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CkBAIC0xODY2LDcgKzIwMTUsNyBAQAogCiAJCS8qIFJlYWQgdGhlIGluaXRpYWwgcG93ZXIgc3RhdGUgZnJvbSB0aGUgZGV2aWNlICovCiAJCWlmICh3LT5yZWcgPj0gMCkgewotCQkJdmFsID0gc25kX3NvY19yZWFkKHctPmNvZGVjLCB3LT5yZWcpOworCQkJdmFsID0gc29jX3dpZGdldF9yZWFkKHcsIHctPnJlZyk7CiAJCQl2YWwgJj0gMSA8PCB3LT5zaGlmdDsKIAkJCWlmICh3LT5pbnZlcnQpCiAJCQkJdmFsID0gIXZhbDsKQEAgLTIzNTQsNiArMjUwMyw3IEBACiAJZGFwbS0+bl93aWRnZXRzKys7CiAJdy0+ZGFwbSA9IGRhcG07CiAJdy0+Y29kZWMgPSBkYXBtLT5jb2RlYzsKKwl3LT5wbGF0Zm9ybSA9IGRhcG0tPnBsYXRmb3JtOwogCUlOSVRfTElTVF9IRUFEKCZ3LT5zb3VyY2VzKTsKIAlJTklUX0xJU1RfSEVBRCgmdy0+c2lua3MpOwogCUlOSVRfTElTVF9IRUFEKCZ3LT5saXN0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtaW8uYyBiL3NvdW5kL3NvYy9zb2MtaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E0OTBjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NvYy1pby5jCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogc29jLWlvLmMgIC0tICBBU29DIHJlZ2lzdGVyIEkvTyBoZWxwZXJzCisgKgorICogQ29weXJpZ2h0IDIwMDktMjAxMSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9hc29jLmg+CisKKyNpZmRlZiBDT05GSUdfU1BJX01BU1RFUgorc3RhdGljIGludCBkb19zcGlfd3JpdGUodm9pZCAqY29udHJvbCwgY29uc3QgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gY29udHJvbDsKKwlpbnQgcmV0OworCisJcmV0ID0gc3BpX3dyaXRlKHNwaSwgZGF0YSwgbGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBsZW47Cit9CisjZW5kaWYKKworc3RhdGljIGludCBkb19od193cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJaW50IHJldDsKKworCWlmICghc25kX3NvY19jb2RlY192b2xhdGlsZV9yZWdpc3Rlcihjb2RlYywgcmVnKSAmJgorCSAgICByZWcgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSAmJgorCSAgICAhY29kZWMtPmNhY2hlX2J5cGFzcykgeworCQlyZXQgPSBzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNvZGVjLT5jYWNoZV9vbmx5KSB7CisJCWNvZGVjLT5jYWNoZV9zeW5jID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIGxlbik7CisJaWYgKHJldCA9PSBsZW4pCisJCXJldHVybiAwOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHdfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKHJlZyA+PSBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSB8fAorCSAgICBzbmRfc29jX2NvZGVjX3ZvbGF0aWxlX3JlZ2lzdGVyKGNvZGVjLCByZWcpIHx8CisJICAgIGNvZGVjLT5jYWNoZV9ieXBhc3MpIHsKKwkJaWYgKGNvZGVjLT5jYWNoZV9vbmx5KQorCQkJcmV0dXJuIC0xOworCisJCUJVR19PTighY29kZWMtPmh3X3JlYWQpOworCQlyZXR1cm4gY29kZWMtPmh3X3JlYWQoY29kZWMsIHJlZyk7CisJfQorCisJcmV0ID0gc25kX3NvY19jYWNoZV9yZWFkKGNvZGVjLCByZWcsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBzbmRfc29jXzRfMTJfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJICAgICAgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXUxNiBkYXRhOworCisJZGF0YSA9IGNwdV90b19iZTE2KChyZWcgPDwgMTIpIHwgKHZhbHVlICYgMHhmZmZmZmYpKTsKKworCXJldHVybiBkb19od193cml0ZShjb2RlYywgcmVnLCB2YWx1ZSwgJmRhdGEsIDIpOworfQorCitzdGF0aWMgaW50IHNuZF9zb2NfN185X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJCSAgICAgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXUxNiBkYXRhOworCisJZGF0YSA9IGNwdV90b19iZTE2KChyZWcgPDwgOSkgfCAodmFsdWUgJiAweDFmZikpOworCisJcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCAmZGF0YSwgMik7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvY184Xzhfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdTggZGF0YVsyXTsKKworCXJlZyAmPSAweGZmOworCWRhdGFbMF0gPSByZWc7CisJZGF0YVsxXSA9IHZhbHVlICYgMHhmZjsKKworCXJldHVybiBkb19od193cml0ZShjb2RlYywgcmVnLCB2YWx1ZSwgZGF0YSwgMik7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvY184XzE2X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJCSAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1OCBkYXRhWzNdOworCXUxNiB2YWwgPSBjcHVfdG9fYmUxNih2YWx1ZSk7CisKKwlkYXRhWzBdID0gcmVnOworCW1lbWNweSgmZGF0YVsxXSwgJnZhbCwgc2l6ZW9mKHZhbCkpOworCisJcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCBkYXRhLCAzKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZG9faTJjX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCXZvaWQgKnJlZywgaW50IHJlZ2xlbiwKKwkJCQl2b2lkICpkYXRhLCBpbnQgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgaTJjX21zZyB4ZmVyWzJdOworCWludCByZXQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisKKwkvKiBXcml0ZSByZWdpc3RlciAqLworCXhmZXJbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKKwl4ZmVyWzBdLmZsYWdzID0gMDsKKwl4ZmVyWzBdLmxlbiA9IHJlZ2xlbjsKKwl4ZmVyWzBdLmJ1ZiA9IHJlZzsKKworCS8qIFJlYWQgZGF0YSAqLworCXhmZXJbMV0uYWRkciA9IGNsaWVudC0+YWRkcjsKKwl4ZmVyWzFdLmZsYWdzID0gSTJDX01fUkQ7CisJeGZlclsxXS5sZW4gPSBkYXRhbGVuOworCXhmZXJbMV0uYnVmID0gZGF0YTsKKworCXJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIHhmZXIsIDIpOworCWlmIChyZXQgPT0gMikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiAtRUlPOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IChkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9zb2NfOF84X3JlYWRfaTJjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJIHVuc2lnbmVkIGludCByKQoreworCXU4IHJlZyA9IHI7CisJdTggZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gZG9faTJjX3JlYWQoY29kZWMsICZyZWcsIDEsICZkYXRhLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGRhdGE7Cit9CisjZWxzZQorI2RlZmluZSBzbmRfc29jXzhfOF9yZWFkX2kyYyBOVUxMCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY184XzE2X3JlYWRfaTJjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJICB1bnNpZ25lZCBpbnQgcikKK3sKKwl1OCByZWcgPSByOworCXUxNiBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBkb19pMmNfcmVhZChjb2RlYywgJnJlZywgMSwgJmRhdGEsIDIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKGRhdGEgPj4gOCkgfCAoKGRhdGEgJiAweGZmKSA8PCA4KTsKK30KKyNlbHNlCisjZGVmaW5lIHNuZF9zb2NfOF8xNl9yZWFkX2kyYyBOVUxMCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY18xNl84X3JlYWRfaTJjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJICB1bnNpZ25lZCBpbnQgcikKK3sKKwl1MTYgcmVnID0gcjsKKwl1OCBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBkb19pMmNfcmVhZChjb2RlYywgJnJlZywgMiwgJmRhdGEsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gZGF0YTsKK30KKyNlbHNlCisjZGVmaW5lIHNuZF9zb2NfMTZfOF9yZWFkX2kyYyBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBzbmRfc29jXzE2Xzhfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJICAgICAgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXU4IGRhdGFbM107CisJdTE2IHJ2YWwgPSBjcHVfdG9fYmUxNihyZWcpOworCisJbWVtY3B5KGRhdGEsICZydmFsLCBzaXplb2YocnZhbCkpOworCWRhdGFbMl0gPSB2YWx1ZTsKKworCXJldHVybiBkb19od193cml0ZShjb2RlYywgcmVnLCB2YWx1ZSwgZGF0YSwgMyk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IChkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9zb2NfMTZfMTZfcmVhZF9pMmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgcikKK3sKKwl1MTYgcmVnID0gY3B1X3RvX2JlMTYocik7CisJdTE2IGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IGRvX2kyY19yZWFkKGNvZGVjLCAmcmVnLCAyLCAmZGF0YSwgMik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAwOworCXJldHVybiBiZTE2X3RvX2NwdShkYXRhKTsKK30KKyNlbHNlCisjZGVmaW5lIHNuZF9zb2NfMTZfMTZfcmVhZF9pMmMgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgc25kX3NvY18xNl8xNl93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXUxNiBkYXRhWzJdOworCisJZGF0YVswXSA9IGNwdV90b19iZTE2KHJlZyk7CisJZGF0YVsxXSA9IGNwdV90b19iZTE2KHZhbHVlKTsKKworCXJldHVybiBkb19od193cml0ZShjb2RlYywgcmVnLCB2YWx1ZSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKK30KKworLyogUHJpbWl0aXZlIGJ1bGsgd3JpdGUgc3VwcG9ydCBmb3Igc29jLWNhY2hlLiAgVGhlIGRhdGEgcG9pbnRlZCB0byBieQorICogYGRhdGEnIG5lZWRzIHRvIGFscmVhZHkgYmUgaW4gdGhlIGZvcm0gdGhlIGhhcmR3YXJlIGV4cGVjdHMKKyAqIGluY2x1ZGluZyBhbnkgbGVhZGluZyByZWdpc3RlciBzcGVjaWZpYyBkYXRhLiAgQW55IGRhdGEgd3JpdHRlbgorICogdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGdvIHRocm91Z2ggdGhlIGNhY2hlIGFzIGl0IG9ubHkKKyAqIGhhbmRsZXMgd3JpdGluZyB0byB2b2xhdGlsZSBvciBvdXQgb2YgYm91bmRzIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGludCBzbmRfc29jX2h3X2J1bGtfd3JpdGVfcmF3KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJaW50IHJldDsKKworCS8qIFRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGdldCBvdXQgb2Ygc3luYyB3aXRoIHRoZSBjYWNoZSwgY2hlY2sKKwkgKiB3aGV0aGVyIHRoZSBiYXNlIHJlZ2lzdGVyIGlzIHZvbGF0aWxlIG9yIGlmIHdlJ3ZlIGRpcmVjdGx5IGFza2VkCisJICogdG8gYnlwYXNzIHRoZSBjYWNoZS4gIE91dCBvZiBib3VuZHMgcmVnaXN0ZXJzIGFyZSBjb25zaWRlcmVkCisJICogdm9sYXRpbGUuCisJICovCisJaWYgKCFjb2RlYy0+Y2FjaGVfYnlwYXNzCisJICAgICYmICFzbmRfc29jX2NvZGVjX3ZvbGF0aWxlX3JlZ2lzdGVyKGNvZGVjLCByZWcpCisJICAgICYmIHJlZyA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY29kZWMtPmNvbnRyb2xfdHlwZSkgeworI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKKwljYXNlIFNORF9TT0NfSTJDOgorCQlyZXQgPSBpMmNfbWFzdGVyX3NlbmQodG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KSwgZGF0YSwgbGVuKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorCWNhc2UgU05EX1NPQ19TUEk6CisJCXJldCA9IHNwaV93cml0ZSh0b19zcGlfZGV2aWNlKGNvZGVjLT5kZXYpLCBkYXRhLCBsZW4pOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCWlmIChyZXQgPT0gbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgYWRkcl9iaXRzOworCWludCBkYXRhX2JpdHM7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworCXVuc2lnbmVkIGludCAoKnJlYWQpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7CisJdW5zaWduZWQgaW50ICgqaTJjX3JlYWQpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7Cit9IGlvX3R5cGVzW10gPSB7CisJeworCQkuYWRkcl9iaXRzID0gNCwgLmRhdGFfYml0cyA9IDEyLAorCQkud3JpdGUgPSBzbmRfc29jXzRfMTJfd3JpdGUsCisJfSwKKwl7CisJCS5hZGRyX2JpdHMgPSA3LCAuZGF0YV9iaXRzID0gOSwKKwkJLndyaXRlID0gc25kX3NvY183Xzlfd3JpdGUsCisJfSwKKwl7CisJCS5hZGRyX2JpdHMgPSA4LCAuZGF0YV9iaXRzID0gOCwKKwkJLndyaXRlID0gc25kX3NvY184Xzhfd3JpdGUsCisJCS5pMmNfcmVhZCA9IHNuZF9zb2NfOF84X3JlYWRfaTJjLAorCX0sCisJeworCQkuYWRkcl9iaXRzID0gOCwgLmRhdGFfYml0cyA9IDE2LAorCQkud3JpdGUgPSBzbmRfc29jXzhfMTZfd3JpdGUsCisJCS5pMmNfcmVhZCA9IHNuZF9zb2NfOF8xNl9yZWFkX2kyYywKKwl9LAorCXsKKwkJLmFkZHJfYml0cyA9IDE2LCAuZGF0YV9iaXRzID0gOCwKKwkJLndyaXRlID0gc25kX3NvY18xNl84X3dyaXRlLAorCQkuaTJjX3JlYWQgPSBzbmRfc29jXzE2XzhfcmVhZF9pMmMsCisJfSwKKwl7CisJCS5hZGRyX2JpdHMgPSAxNiwgLmRhdGFfYml0cyA9IDE2LAorCQkud3JpdGUgPSBzbmRfc29jXzE2XzE2X3dyaXRlLAorCQkuaTJjX3JlYWQgPSBzbmRfc29jXzE2XzE2X3JlYWRfaTJjLAorCX0sCit9OworCisvKioKKyAqIHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvOiBTZXQgdXAgc3RhbmRhcmQgSS9PIGZ1bmN0aW9ucy4KKyAqCisgKiBAY29kZWM6IENPREVDIHRvIGNvbmZpZ3VyZS4KKyAqIEBhZGRyX2JpdHM6IE51bWJlciBvZiBiaXRzIG9mIHJlZ2lzdGVyIGFkZHJlc3MgZGF0YS4KKyAqIEBkYXRhX2JpdHM6IE51bWJlciBvZiBiaXRzIG9mIGRhdGEgcGVyIHJlZ2lzdGVyLgorICogQGNvbnRyb2w6IENvbnRyb2wgYnVzIHVzZWQuCisgKgorICogUmVnaXN0ZXIgZm9ybWF0cyBhcmUgZnJlcXVlbnRseSBzaGFyZWQgYmV0d2VlbiBtYW55IEkyQyBhbmQgU1BJCisgKiBkZXZpY2VzLiAgSW4gb3JkZXIgdG8gcHJvbW90ZSBjb2RlIHJldXNlIHRoZSBBU29DIGNvcmUgcHJvdmlkZXMKKyAqIHNvbWUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zIG9mIENPREVDIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMKKyAqIHdoaWNoIGNhbiBiZSBzZXQgdXAgdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGFuZCBpbml0aWFsaXNpbmcgdGhlCisgKiBhY3R1YWwgY2FjaGUuCisgKgorICogTm90ZSB0aGF0IGF0IHByZXNlbnQgdGhpcyBjb2RlIGNhbm5vdCBiZSB1c2VkIGJ5IENPREVDcyB3aXRoCisgKiB2b2xhdGlsZSByZWdpc3RlcnMuCisgKi8KK2ludCBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkgICAgICAgaW50IGFkZHJfYml0cywgaW50IGRhdGFfYml0cywKKwkJCSAgICAgICBlbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2wpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpb190eXBlcyk7IGkrKykKKwkJaWYgKGlvX3R5cGVzW2ldLmFkZHJfYml0cyA9PSBhZGRyX2JpdHMgJiYKKwkJICAgIGlvX3R5cGVzW2ldLmRhdGFfYml0cyA9PSBkYXRhX2JpdHMpCisJCQlicmVhazsKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGlvX3R5cGVzKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJObyBJL08gZnVuY3Rpb25zIGZvciAlZCBiaXQgYWRkcmVzcyAlZCBiaXQgZGF0YVxuIiwKKwkJICAgICAgIGFkZHJfYml0cywgZGF0YV9iaXRzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29kZWMtPndyaXRlID0gaW9fdHlwZXNbaV0ud3JpdGU7CisJY29kZWMtPnJlYWQgPSBod19yZWFkOworCWNvZGVjLT5idWxrX3dyaXRlX3JhdyA9IHNuZF9zb2NfaHdfYnVsa193cml0ZV9yYXc7CisKKwlzd2l0Y2ggKGNvbnRyb2wpIHsKKwljYXNlIFNORF9TT0NfSTJDOgorI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKKwkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOworI2VuZGlmCisJCWlmIChpb190eXBlc1tpXS5pMmNfcmVhZCkKKwkJCWNvZGVjLT5od19yZWFkID0gaW9fdHlwZXNbaV0uaTJjX3JlYWQ7CisKKwkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNvbnRhaW5lcl9vZihjb2RlYy0+ZGV2LAorCQkJCQkJICAgc3RydWN0IGkyY19jbGllbnQsCisJCQkJCQkgICBkZXYpOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19TUEk6CisjaWZkZWYgQ09ORklHX1NQSV9NQVNURVIKKwkJY29kZWMtPmh3X3dyaXRlID0gZG9fc3BpX3dyaXRlOworI2VuZGlmCisKKwkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNvbnRhaW5lcl9vZihjb2RlYy0+ZGV2LAorCQkJCQkJICAgc3RydWN0IHNwaV9kZXZpY2UsCisJCQkJCQkgICBkZXYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKTsKKwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1wY20uYyBiL3NvdW5kL3NvYy9zb2MtcGNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3NTkzOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zb2MtcGNtLmMKQEAgLTAsMCArMSw2MzkgQEAKKy8qCisgKiBzb2MtcGNtLmMgIC0tICBBTFNBIFNvQyBQQ00KKyAqCisgKiBDb3B5cmlnaHQgMjAwNSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICogQ29weXJpZ2h0IDIwMDUgT3BlbmVkaGFuZCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2xpbWxvZ2ljIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKgorICogQXV0aG9yczogTGlhbSBHaXJkd29vZCA8bHJnQHRpLmNvbT4KKyAqICAgICAgICAgIE1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPiAgICAgICAKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworc3RhdGljIERFRklORV9NVVRFWChwY21fbXV0ZXgpOworCitzdGF0aWMgaW50IHNvY19wY21fYXBwbHlfc3ltbWV0cnkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCWludCByZXQ7CisKKwlpZiAoIWNvZGVjX2RhaS0+ZHJpdmVyLT5zeW1tZXRyaWNfcmF0ZXMgJiYKKwkgICAgIWNwdV9kYWktPmRyaXZlci0+c3ltbWV0cmljX3JhdGVzICYmCisJICAgICFydGQtPmRhaV9saW5rLT5zeW1tZXRyaWNfcmF0ZXMpCisJCXJldHVybiAwOworCisJLyogVGhpcyBjYW4gaGFwcGVuIGlmIG11bHRpcGxlIHN0cmVhbXMgYXJlIHN0YXJ0aW5nIHNpbXVsdGFuZW91c2x5IC0KKwkgKiB0aGUgc2Vjb25kIGNhbiBuZWVkIHRvIGdldCBpdHMgY29uc3RyYWludHMgYmVmb3JlIHRoZSBmaXJzdCBoYXMKKwkgKiBwaWNrZWQgYSByYXRlLiAgQ29tcGxhaW4gYW5kIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBjYXJyeSBvbi4KKwkgKi8KKwlpZiAoIXJ0ZC0+cmF0ZSkgeworCQlkZXZfd2FybigmcnRkLT5kZXYsCisJCQkgIk5vdCBlbmZvcmNpbmcgc3ltbWV0cmljX3JhdGVzIGR1ZSB0byByYWNlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGV2X2RiZygmcnRkLT5kZXYsICJTeW1tZXRyeSBmb3JjZXMgJWRIeiByYXRlXG4iLCBydGQtPnJhdGUpOworCisJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChzdWJzdHJlYW0tPnJ1bnRpbWUsCisJCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCQkgICBydGQtPnJhdGUsIHJ0ZC0+cmF0ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcnRkLT5kZXYsCisJCQkiVW5hYmxlIHRvIGFwcGx5IHJhdGUgc3ltbWV0cnkgY29uc3RyYWludDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgQUxTQSB3aGVuIGEgUENNIHN1YnN0cmVhbSBpcyBvcGVuZWQsIHRoZSBydW50aW1lLT5odyByZWNvcmQgaXMKKyAqIHRoZW4gaW5pdGlhbGl6ZWQgYW5kIGFueSBwcml2YXRlIGRhdGEgY2FuIGJlIGFsbG9jYXRlZC4gVGhpcyBhbHNvIGNhbGxzCisgKiBzdGFydHVwIGZvciB0aGUgY3B1IERBSSwgcGxhdGZvcm0sIG1hY2hpbmUgYW5kIGNvZGVjIERBSS4KKyAqLworc3RhdGljIGludCBzb2NfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gcnRkLT5wbGF0Zm9ybTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpjcHVfZGFpX2RydiA9IGNwdV9kYWktPmRyaXZlcjsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpjb2RlY19kYWlfZHJ2ID0gY29kZWNfZGFpLT5kcml2ZXI7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrX25lc3RlZCgmcnRkLT5wY21fbXV0ZXgsIHJ0ZC0+cGNtX3N1YmNsYXNzKTsKKworCS8qIHN0YXJ0dXAgdGhlIGF1ZGlvIHN1YnN5c3RlbSAqLworCWlmIChjcHVfZGFpLT5kcml2ZXItPm9wcy0+c3RhcnR1cCkgeworCQlyZXQgPSBjcHVfZGFpLT5kcml2ZXItPm9wcy0+c3RhcnR1cChzdWJzdHJlYW0sIGNwdV9kYWkpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBjYW4ndCBvcGVuIGludGVyZmFjZSAlc1xuIiwKKwkJCQljcHVfZGFpLT5uYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKHBsYXRmb3JtLT5kcml2ZXItPm9wcyAmJiBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPm9wZW4pIHsKKwkJcmV0ID0gcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5vcGVuKHN1YnN0cmVhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNhbid0IG9wZW4gcGxhdGZvcm0gJXNcbiIsIHBsYXRmb3JtLT5uYW1lKTsKKwkJCWdvdG8gcGxhdGZvcm1fZXJyOworCQl9CisJfQorCisJaWYgKGNvZGVjX2RhaS0+ZHJpdmVyLT5vcHMtPnN0YXJ0dXApIHsKKwkJcmV0ID0gY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+c3RhcnR1cChzdWJzdHJlYW0sIGNvZGVjX2RhaSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNhbid0IG9wZW4gY29kZWMgJXNcbiIsCisJCQkJY29kZWNfZGFpLT5uYW1lKTsKKwkJCWdvdG8gY29kZWNfZGFpX2VycjsKKwkJfQorCX0KKworCWlmIChydGQtPmRhaV9saW5rLT5vcHMgJiYgcnRkLT5kYWlfbGluay0+b3BzLT5zdGFydHVwKSB7CisJCXJldCA9IHJ0ZC0+ZGFpX2xpbmstPm9wcy0+c3RhcnR1cChzdWJzdHJlYW0pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiAlcyBzdGFydHVwIGZhaWxlZFxuIiwgcnRkLT5kYWlfbGluay0+bmFtZSk7CisJCQlnb3RvIG1hY2hpbmVfZXJyOworCQl9CisJfQorCisJLyogQ2hlY2sgdGhhdCB0aGUgY29kZWMgYW5kIGNwdSBEQUlzIGFyZSBjb21wYXRpYmxlICovCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJcnVudGltZS0+aHcucmF0ZV9taW4gPQorCQkJbWF4KGNvZGVjX2RhaV9kcnYtPnBsYXliYWNrLnJhdGVfbWluLAorCQkJICAgIGNwdV9kYWlfZHJ2LT5wbGF5YmFjay5yYXRlX21pbik7CisJCXJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0KKwkJCW1pbihjb2RlY19kYWlfZHJ2LT5wbGF5YmFjay5yYXRlX21heCwKKwkJCSAgICBjcHVfZGFpX2Rydi0+cGxheWJhY2sucmF0ZV9tYXgpOworCQlydW50aW1lLT5ody5jaGFubmVsc19taW4gPQorCQkJbWF4KGNvZGVjX2RhaV9kcnYtPnBsYXliYWNrLmNoYW5uZWxzX21pbiwKKwkJCQljcHVfZGFpX2Rydi0+cGxheWJhY2suY2hhbm5lbHNfbWluKTsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0KKwkJCW1pbihjb2RlY19kYWlfZHJ2LT5wbGF5YmFjay5jaGFubmVsc19tYXgsCisJCQkJY3B1X2RhaV9kcnYtPnBsYXliYWNrLmNoYW5uZWxzX21heCk7CisJCXJ1bnRpbWUtPmh3LmZvcm1hdHMgPQorCQkJY29kZWNfZGFpX2Rydi0+cGxheWJhY2suZm9ybWF0cyAmIGNwdV9kYWlfZHJ2LT5wbGF5YmFjay5mb3JtYXRzOworCQlydW50aW1lLT5ody5yYXRlcyA9CisJCQljb2RlY19kYWlfZHJ2LT5wbGF5YmFjay5yYXRlcyAmIGNwdV9kYWlfZHJ2LT5wbGF5YmFjay5yYXRlczsKKwkJaWYgKGNvZGVjX2RhaV9kcnYtPnBsYXliYWNrLnJhdGVzCisJCQkgICAmIChTTkRSVl9QQ01fUkFURV9LTk9UIHwgU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUykpCisJCQlydW50aW1lLT5ody5yYXRlcyB8PSBjcHVfZGFpX2Rydi0+cGxheWJhY2sucmF0ZXM7CisJCWlmIChjcHVfZGFpX2Rydi0+cGxheWJhY2sucmF0ZXMKKwkJCSAgICYgKFNORFJWX1BDTV9SQVRFX0tOT1QgfCBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTKSkKKwkJCXJ1bnRpbWUtPmh3LnJhdGVzIHw9IGNvZGVjX2RhaV9kcnYtPnBsYXliYWNrLnJhdGVzOworCX0gZWxzZSB7CisJCXJ1bnRpbWUtPmh3LnJhdGVfbWluID0KKwkJCW1heChjb2RlY19kYWlfZHJ2LT5jYXB0dXJlLnJhdGVfbWluLAorCQkJICAgIGNwdV9kYWlfZHJ2LT5jYXB0dXJlLnJhdGVfbWluKTsKKwkJcnVudGltZS0+aHcucmF0ZV9tYXggPQorCQkJbWluKGNvZGVjX2RhaV9kcnYtPmNhcHR1cmUucmF0ZV9tYXgsCisJCQkgICAgY3B1X2RhaV9kcnYtPmNhcHR1cmUucmF0ZV9tYXgpOworCQlydW50aW1lLT5ody5jaGFubmVsc19taW4gPQorCQkJbWF4KGNvZGVjX2RhaV9kcnYtPmNhcHR1cmUuY2hhbm5lbHNfbWluLAorCQkJCWNwdV9kYWlfZHJ2LT5jYXB0dXJlLmNoYW5uZWxzX21pbik7CisJCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9CisJCQltaW4oY29kZWNfZGFpX2Rydi0+Y2FwdHVyZS5jaGFubmVsc19tYXgsCisJCQkJY3B1X2RhaV9kcnYtPmNhcHR1cmUuY2hhbm5lbHNfbWF4KTsKKwkJcnVudGltZS0+aHcuZm9ybWF0cyA9CisJCQljb2RlY19kYWlfZHJ2LT5jYXB0dXJlLmZvcm1hdHMgJiBjcHVfZGFpX2Rydi0+Y2FwdHVyZS5mb3JtYXRzOworCQlydW50aW1lLT5ody5yYXRlcyA9CisJCQljb2RlY19kYWlfZHJ2LT5jYXB0dXJlLnJhdGVzICYgY3B1X2RhaV9kcnYtPmNhcHR1cmUucmF0ZXM7CisJCWlmIChjb2RlY19kYWlfZHJ2LT5jYXB0dXJlLnJhdGVzCisJCQkgICAmIChTTkRSVl9QQ01fUkFURV9LTk9UIHwgU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUykpCisJCQlydW50aW1lLT5ody5yYXRlcyB8PSBjcHVfZGFpX2Rydi0+Y2FwdHVyZS5yYXRlczsKKwkJaWYgKGNwdV9kYWlfZHJ2LT5jYXB0dXJlLnJhdGVzCisJCQkgICAmIChTTkRSVl9QQ01fUkFURV9LTk9UIHwgU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUykpCisJCQlydW50aW1lLT5ody5yYXRlcyB8PSBjb2RlY19kYWlfZHJ2LT5jYXB0dXJlLnJhdGVzOworCX0KKworCXJldCA9IC1FSU5WQUw7CisJc25kX3BjbV9saW1pdF9od19yYXRlcyhydW50aW1lKTsKKwlpZiAoIXJ1bnRpbWUtPmh3LnJhdGVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogJXMgPC0+ICVzIE5vIG1hdGNoaW5nIHJhdGVzXG4iLAorCQkJY29kZWNfZGFpLT5uYW1lLCBjcHVfZGFpLT5uYW1lKTsKKwkJZ290byBjb25maWdfZXJyOworCX0KKwlpZiAoIXJ1bnRpbWUtPmh3LmZvcm1hdHMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiAlcyA8LT4gJXMgTm8gbWF0Y2hpbmcgZm9ybWF0c1xuIiwKKwkJCWNvZGVjX2RhaS0+bmFtZSwgY3B1X2RhaS0+bmFtZSk7CisJCWdvdG8gY29uZmlnX2VycjsKKwl9CisJaWYgKCFydW50aW1lLT5ody5jaGFubmVsc19taW4gfHwgIXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCB8fAorCSAgICBydW50aW1lLT5ody5jaGFubmVsc19taW4gPiBydW50aW1lLT5ody5jaGFubmVsc19tYXgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiAlcyA8LT4gJXMgTm8gbWF0Y2hpbmcgY2hhbm5lbHNcbiIsCisJCQkJY29kZWNfZGFpLT5uYW1lLCBjcHVfZGFpLT5uYW1lKTsKKwkJZ290byBjb25maWdfZXJyOworCX0KKworCS8qIFN5bW1ldHJ5IG9ubHkgYXBwbGllcyBpZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhY3RpdmUgc3RyZWFtLiAqLworCWlmIChjcHVfZGFpLT5hY3RpdmUgfHwgY29kZWNfZGFpLT5hY3RpdmUpIHsKKwkJcmV0ID0gc29jX3BjbV9hcHBseV9zeW1tZXRyeShzdWJzdHJlYW0pOworCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIGNvbmZpZ19lcnI7CisJfQorCisJcHJfZGVidWcoImFzb2M6ICVzIDwtPiAlcyBpbmZvOlxuIiwKKwkJCWNvZGVjX2RhaS0+bmFtZSwgY3B1X2RhaS0+bmFtZSk7CisJcHJfZGVidWcoImFzb2M6IHJhdGUgbWFzayAweCV4XG4iLCBydW50aW1lLT5ody5yYXRlcyk7CisJcHJfZGVidWcoImFzb2M6IG1pbiBjaCAlZCBtYXggY2ggJWRcbiIsIHJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiwKKwkJIHJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCk7CisJcHJfZGVidWcoImFzb2M6IG1pbiByYXRlICVkIG1heCByYXRlICVkXG4iLCBydW50aW1lLT5ody5yYXRlX21pbiwKKwkJIHJ1bnRpbWUtPmh3LnJhdGVfbWF4KTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWNwdV9kYWktPnBsYXliYWNrX2FjdGl2ZSsrOworCQljb2RlY19kYWktPnBsYXliYWNrX2FjdGl2ZSsrOworCX0gZWxzZSB7CisJCWNwdV9kYWktPmNhcHR1cmVfYWN0aXZlKys7CisJCWNvZGVjX2RhaS0+Y2FwdHVyZV9hY3RpdmUrKzsKKwl9CisJY3B1X2RhaS0+YWN0aXZlKys7CisJY29kZWNfZGFpLT5hY3RpdmUrKzsKKwlydGQtPmNvZGVjLT5hY3RpdmUrKzsKKwltdXRleF91bmxvY2soJnJ0ZC0+cGNtX211dGV4KTsKKwlyZXR1cm4gMDsKKworY29uZmlnX2VycjoKKwlpZiAocnRkLT5kYWlfbGluay0+b3BzICYmIHJ0ZC0+ZGFpX2xpbmstPm9wcy0+c2h1dGRvd24pCisJCXJ0ZC0+ZGFpX2xpbmstPm9wcy0+c2h1dGRvd24oc3Vic3RyZWFtKTsKKworbWFjaGluZV9lcnI6CisJaWYgKGNvZGVjX2RhaS0+ZHJpdmVyLT5vcHMtPnNodXRkb3duKQorCQljb2RlY19kYWktPmRyaXZlci0+b3BzLT5zaHV0ZG93bihzdWJzdHJlYW0sIGNvZGVjX2RhaSk7CisKK2NvZGVjX2RhaV9lcnI6CisJaWYgKHBsYXRmb3JtLT5kcml2ZXItPm9wcyAmJiBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPmNsb3NlKQorCQlwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPmNsb3NlKHN1YnN0cmVhbSk7CisKK3BsYXRmb3JtX2VycjoKKwlpZiAoY3B1X2RhaS0+ZHJpdmVyLT5vcHMtPnNodXRkb3duKQorCQljcHVfZGFpLT5kcml2ZXItPm9wcy0+c2h1dGRvd24oc3Vic3RyZWFtLCBjcHVfZGFpKTsKK291dDoKKwltdXRleF91bmxvY2soJnJ0ZC0+cGNtX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUG93ZXIgZG93biB0aGUgYXVkaW8gc3Vic3lzdGVtIHBtZG93bl90aW1lIG1zZWNzIGFmdGVyIGNsb3NlIGlzIGNhbGxlZC4KKyAqIFRoaXMgaXMgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBwb3BzIG9yIGNsaWNrcyBpbiBiZXR3ZWVuIGFueSBtdXNpYyB0cmFja3MKKyAqIGR1ZSB0byBEQVBNIHBvd2VyIGN5Y2xpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGNsb3NlX2RlbGF5ZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9CisJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUsIGRlbGF5ZWRfd29yay53b3JrKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCisJbXV0ZXhfbG9ja19uZXN0ZWQoJnJ0ZC0+cGNtX211dGV4LCBydGQtPnBjbV9zdWJjbGFzcyk7CisKKwlwcl9kZWJ1ZygicG9wIHdxIGNoZWNraW5nOiAlcyBzdGF0dXM6ICVzIHdhaXRpbmc6ICVzXG4iLAorCQkgY29kZWNfZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lLAorCQkgY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUgPyAiYWN0aXZlIiA6ICJpbmFjdGl2ZSIsCisJCSBjb2RlY19kYWktPnBvcF93YWl0ID8gInllcyIgOiAibm8iKTsKKworCS8qIGFyZSB3ZSB3YWl0aW5nIG9uIHRoaXMgY29kZWMgREFJIHN0cmVhbSAqLworCWlmIChjb2RlY19kYWktPnBvcF93YWl0ID09IDEpIHsKKwkJY29kZWNfZGFpLT5wb3Bfd2FpdCA9IDA7CisJCXNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQocnRkLAorCQkJY29kZWNfZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lLAorCQkJU05EX1NPQ19EQVBNX1NUUkVBTV9TVE9QKTsKKwl9CisKKwltdXRleF91bmxvY2soJnJ0ZC0+cGNtX211dGV4KTsKK30KKworLyoKKyAqIENhbGxlZCBieSBBTFNBIHdoZW4gYSBQQ00gc3Vic3RyZWFtIGlzIGNsb3NlZC4gUHJpdmF0ZSBkYXRhIGNhbiBiZQorICogZnJlZWQgaGVyZS4gVGhlIGNwdSBEQUksIGNvZGVjIERBSSwgbWFjaGluZSBhbmQgcGxhdGZvcm0gYXJlIGFsc28KKyAqIHNodXRkb3duLgorICovCitzdGF0aWMgaW50IHNvY19wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKworCW11dGV4X2xvY2tfbmVzdGVkKCZydGQtPnBjbV9tdXRleCwgcnRkLT5wY21fc3ViY2xhc3MpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJY3B1X2RhaS0+cGxheWJhY2tfYWN0aXZlLS07CisJCWNvZGVjX2RhaS0+cGxheWJhY2tfYWN0aXZlLS07CisJfSBlbHNlIHsKKwkJY3B1X2RhaS0+Y2FwdHVyZV9hY3RpdmUtLTsKKwkJY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZS0tOworCX0KKworCWNwdV9kYWktPmFjdGl2ZS0tOworCWNvZGVjX2RhaS0+YWN0aXZlLS07CisJY29kZWMtPmFjdGl2ZS0tOworCisJLyogTXV0aW5nIHRoZSBEQUMgc3VwcHJlc3NlcyBhcnRpZmFjdHMgY2F1c2VkIGR1cmluZyBkaWdpdGFsCisJICogc2h1dGRvd24sIGZvciBleGFtcGxlIGZyb20gc3RvcHBpbmcgY2xvY2tzLgorCSAqLworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlzbmRfc29jX2RhaV9kaWdpdGFsX211dGUoY29kZWNfZGFpLCAxKTsKKworCWlmIChjcHVfZGFpLT5kcml2ZXItPm9wcy0+c2h1dGRvd24pCisJCWNwdV9kYWktPmRyaXZlci0+b3BzLT5zaHV0ZG93bihzdWJzdHJlYW0sIGNwdV9kYWkpOworCisJaWYgKGNvZGVjX2RhaS0+ZHJpdmVyLT5vcHMtPnNodXRkb3duKQorCQljb2RlY19kYWktPmRyaXZlci0+b3BzLT5zaHV0ZG93bihzdWJzdHJlYW0sIGNvZGVjX2RhaSk7CisKKwlpZiAocnRkLT5kYWlfbGluay0+b3BzICYmIHJ0ZC0+ZGFpX2xpbmstPm9wcy0+c2h1dGRvd24pCisJCXJ0ZC0+ZGFpX2xpbmstPm9wcy0+c2h1dGRvd24oc3Vic3RyZWFtKTsKKworCWlmIChwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMgJiYgcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5jbG9zZSkKKwkJcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5jbG9zZShzdWJzdHJlYW0pOworCWNwdV9kYWktPnJ1bnRpbWUgPSBOVUxMOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJLyogc3RhcnQgZGVsYXllZCBwb3Agd3EgaGVyZSBmb3IgcGxheWJhY2sgc3RyZWFtcyAqLworCQljb2RlY19kYWktPnBvcF93YWl0ID0gMTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZydGQtPmRlbGF5ZWRfd29yaywKKwkJCW1zZWNzX3RvX2ppZmZpZXMocnRkLT5wbWRvd25fdGltZSkpOworCX0gZWxzZSB7CisJCS8qIGNhcHR1cmUgc3RyZWFtcyBjYW4gYmUgcG93ZXJlZCBkb3duIG5vdyAqLworCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHJ0ZCwKKwkJCWNvZGVjX2RhaS0+ZHJpdmVyLT5jYXB0dXJlLnN0cmVhbV9uYW1lLAorCQkJU05EX1NPQ19EQVBNX1NUUkVBTV9TVE9QKTsKKwl9CisKKwltdXRleF91bmxvY2soJnJ0ZC0+cGNtX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCBieSBBTFNBIHdoZW4gdGhlIFBDTSBzdWJzdHJlYW0gaXMgcHJlcGFyZWQsIGNhbiBzZXQgZm9ybWF0LCBzYW1wbGUKKyAqIHJhdGUsIGV0Yy4gIFRoaXMgZnVuY3Rpb24gaXMgbm9uIGF0b21pYyBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywKKyAqIGl0IGNhbiByZWZlciB0byB0aGUgcnVudGltZSBpbmZvLgorICovCitzdGF0aWMgaW50IHNvY19wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gcnRkLT5wbGF0Zm9ybTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2tfbmVzdGVkKCZydGQtPnBjbV9tdXRleCwgcnRkLT5wY21fc3ViY2xhc3MpOworCisJaWYgKHJ0ZC0+ZGFpX2xpbmstPm9wcyAmJiBydGQtPmRhaV9saW5rLT5vcHMtPnByZXBhcmUpIHsKKwkJcmV0ID0gcnRkLT5kYWlfbGluay0+b3BzLT5wcmVwYXJlKHN1YnN0cmVhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IG1hY2hpbmUgcHJlcGFyZSBlcnJvclxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMgJiYgcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5wcmVwYXJlKSB7CisJCXJldCA9IHBsYXRmb3JtLT5kcml2ZXItPm9wcy0+cHJlcGFyZShzdWJzdHJlYW0pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBwbGF0Zm9ybSBwcmVwYXJlIGVycm9yXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGNvZGVjX2RhaS0+ZHJpdmVyLT5vcHMtPnByZXBhcmUpIHsKKwkJcmV0ID0gY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+cHJlcGFyZShzdWJzdHJlYW0sIGNvZGVjX2RhaSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNvZGVjIERBSSBwcmVwYXJlIGVycm9yXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGNwdV9kYWktPmRyaXZlci0+b3BzLT5wcmVwYXJlKSB7CisJCXJldCA9IGNwdV9kYWktPmRyaXZlci0+b3BzLT5wcmVwYXJlKHN1YnN0cmVhbSwgY3B1X2RhaSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNwdSBEQUkgcHJlcGFyZSBlcnJvclxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIGNhbmNlbCBhbnkgZGVsYXllZCBzdHJlYW0gc2h1dGRvd24gdGhhdCBpcyBwZW5kaW5nICovCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgJiYKKwkgICAgY29kZWNfZGFpLT5wb3Bfd2FpdCkgeworCQljb2RlY19kYWktPnBvcF93YWl0ID0gMDsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnRkLT5kZWxheWVkX3dvcmspOworCX0KKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHJ0ZCwKKwkJCQkJICBjb2RlY19kYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUsCisJCQkJCSAgU05EX1NPQ19EQVBNX1NUUkVBTV9TVEFSVCk7CisJZWxzZQorCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHJ0ZCwKKwkJCQkJICBjb2RlY19kYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZSwKKwkJCQkJICBTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUKTsKKworCXNuZF9zb2NfZGFpX2RpZ2l0YWxfbXV0ZShjb2RlY19kYWksIDApOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZydGQtPnBjbV9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENhbGxlZCBieSBBTFNBIHdoZW4gdGhlIGhhcmR3YXJlIHBhcmFtcyBhcmUgc2V0IGJ5IGFwcGxpY2F0aW9uLiBUaGlzCisgKiBmdW5jdGlvbiBjYW4gYWxzbyBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYW5kIGNhbiBhbGxvY2F0ZSBidWZmZXJzCisgKiAodXNpbmcgc25kX3BjbV9saWJfKiApLiBJdCdzIG5vbi1hdG9taWMuCisgKi8KK3N0YXRpYyBpbnQgc29jX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrX25lc3RlZCgmcnRkLT5wY21fbXV0ZXgsIHJ0ZC0+cGNtX3N1YmNsYXNzKTsKKworCWlmIChydGQtPmRhaV9saW5rLT5vcHMgJiYgcnRkLT5kYWlfbGluay0+b3BzLT5od19wYXJhbXMpIHsKKwkJcmV0ID0gcnRkLT5kYWlfbGluay0+b3BzLT5od19wYXJhbXMoc3Vic3RyZWFtLCBwYXJhbXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBtYWNoaW5lIGh3X3BhcmFtcyBmYWlsZWRcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+aHdfcGFyYW1zKSB7CisJCXJldCA9IGNvZGVjX2RhaS0+ZHJpdmVyLT5vcHMtPmh3X3BhcmFtcyhzdWJzdHJlYW0sIHBhcmFtcywgY29kZWNfZGFpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogY2FuJ3Qgc2V0IGNvZGVjICVzIGh3IHBhcmFtc1xuIiwKKwkJCQljb2RlY19kYWktPm5hbWUpOworCQkJZ290byBjb2RlY19lcnI7CisJCX0KKwl9CisKKwlpZiAoY3B1X2RhaS0+ZHJpdmVyLT5vcHMtPmh3X3BhcmFtcykgeworCQlyZXQgPSBjcHVfZGFpLT5kcml2ZXItPm9wcy0+aHdfcGFyYW1zKHN1YnN0cmVhbSwgcGFyYW1zLCBjcHVfZGFpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogaW50ZXJmYWNlICVzIGh3IHBhcmFtcyBmYWlsZWRcbiIsCisJCQkJY3B1X2RhaS0+bmFtZSk7CisJCQlnb3RvIGludGVyZmFjZV9lcnI7CisJCX0KKwl9CisKKwlpZiAocGxhdGZvcm0tPmRyaXZlci0+b3BzICYmIHBsYXRmb3JtLT5kcml2ZXItPm9wcy0+aHdfcGFyYW1zKSB7CisJCXJldCA9IHBsYXRmb3JtLT5kcml2ZXItPm9wcy0+aHdfcGFyYW1zKHN1YnN0cmVhbSwgcGFyYW1zKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogcGxhdGZvcm0gJXMgaHcgcGFyYW1zIGZhaWxlZFxuIiwKKwkJCQlwbGF0Zm9ybS0+bmFtZSk7CisJCQlnb3RvIHBsYXRmb3JtX2VycjsKKwkJfQorCX0KKworCXJ0ZC0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisKK291dDoKKwltdXRleF91bmxvY2soJnJ0ZC0+cGNtX211dGV4KTsKKwlyZXR1cm4gcmV0OworCitwbGF0Zm9ybV9lcnI6CisJaWYgKGNwdV9kYWktPmRyaXZlci0+b3BzLT5od19mcmVlKQorCQljcHVfZGFpLT5kcml2ZXItPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0sIGNwdV9kYWkpOworCitpbnRlcmZhY2VfZXJyOgorCWlmIChjb2RlY19kYWktPmRyaXZlci0+b3BzLT5od19mcmVlKQorCQljb2RlY19kYWktPmRyaXZlci0+b3BzLT5od19mcmVlKHN1YnN0cmVhbSwgY29kZWNfZGFpKTsKKworY29kZWNfZXJyOgorCWlmIChydGQtPmRhaV9saW5rLT5vcHMgJiYgcnRkLT5kYWlfbGluay0+b3BzLT5od19mcmVlKQorCQlydGQtPmRhaV9saW5rLT5vcHMtPmh3X2ZyZWUoc3Vic3RyZWFtKTsKKworCW11dGV4X3VubG9jaygmcnRkLT5wY21fbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGcmVlcyByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IGh3X3BhcmFtcywgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcworICovCitzdGF0aWMgaW50IHNvY19wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gcnRkLT5wbGF0Zm9ybTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCisJbXV0ZXhfbG9ja19uZXN0ZWQoJnJ0ZC0+cGNtX211dGV4LCBydGQtPnBjbV9zdWJjbGFzcyk7CisKKwkvKiBhcHBseSBjb2RlYyBkaWdpdGFsIG11dGUgKi8KKwlpZiAoIWNvZGVjLT5hY3RpdmUpCisJCXNuZF9zb2NfZGFpX2RpZ2l0YWxfbXV0ZShjb2RlY19kYWksIDEpOworCisJLyogZnJlZSBhbnkgbWFjaGluZSBodyBwYXJhbXMgKi8KKwlpZiAocnRkLT5kYWlfbGluay0+b3BzICYmIHJ0ZC0+ZGFpX2xpbmstPm9wcy0+aHdfZnJlZSkKKwkJcnRkLT5kYWlfbGluay0+b3BzLT5od19mcmVlKHN1YnN0cmVhbSk7CisKKwkvKiBmcmVlIGFueSBETUEgcmVzb3VyY2VzICovCisJaWYgKHBsYXRmb3JtLT5kcml2ZXItPm9wcyAmJiBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPmh3X2ZyZWUpCisJCXBsYXRmb3JtLT5kcml2ZXItPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0pOworCisJLyogbm93IGZyZWUgaHcgcGFyYW1zIGZvciB0aGUgREFJcyAgKi8KKwlpZiAoY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+aHdfZnJlZSkKKwkJY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0sIGNvZGVjX2RhaSk7CisKKwlpZiAoY3B1X2RhaS0+ZHJpdmVyLT5vcHMtPmh3X2ZyZWUpCisJCWNwdV9kYWktPmRyaXZlci0+b3BzLT5od19mcmVlKHN1YnN0cmVhbSwgY3B1X2RhaSk7CisKKwltdXRleF91bmxvY2soJnJ0ZC0+cGNtX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2NfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IHJldDsKKworCWlmIChjb2RlY19kYWktPmRyaXZlci0+b3BzLT50cmlnZ2VyKSB7CisJCXJldCA9IGNvZGVjX2RhaS0+ZHJpdmVyLT5vcHMtPnRyaWdnZXIoc3Vic3RyZWFtLCBjbWQsIGNvZGVjX2RhaSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocGxhdGZvcm0tPmRyaXZlci0+b3BzICYmIHBsYXRmb3JtLT5kcml2ZXItPm9wcy0+dHJpZ2dlcikgeworCQlyZXQgPSBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPnRyaWdnZXIoc3Vic3RyZWFtLCBjbWQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGNwdV9kYWktPmRyaXZlci0+b3BzLT50cmlnZ2VyKSB7CisJCXJldCA9IGNwdV9kYWktPmRyaXZlci0+b3BzLT50cmlnZ2VyKHN1YnN0cmVhbSwgY21kLCBjcHVfZGFpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNvYyBsZXZlbCB3cmFwcGVyIGZvciBwb2ludGVyIGNhbGxiYWNrCisgKiBJZiBjcHVfZGFpLCBjb2RlY19kYWksIHBsYXRmb3JtIGRyaXZlciBoYXMgdGhlIGRlbGF5IGNhbGxiYWNrLCB0aGFuCisgKiB0aGUgcnVudGltZS0+ZGVsYXkgd2lsbCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5LgorICovCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc29jX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBydGQtPnBsYXRmb3JtOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc25kX3BjbV91ZnJhbWVzX3Qgb2Zmc2V0ID0gMDsKKwlzbmRfcGNtX3NmcmFtZXNfdCBkZWxheSA9IDA7CisKKwlpZiAocGxhdGZvcm0tPmRyaXZlci0+b3BzICYmIHBsYXRmb3JtLT5kcml2ZXItPm9wcy0+cG9pbnRlcikKKwkJb2Zmc2V0ID0gcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5wb2ludGVyKHN1YnN0cmVhbSk7CisKKwlpZiAoY3B1X2RhaS0+ZHJpdmVyLT5vcHMtPmRlbGF5KQorCQlkZWxheSArPSBjcHVfZGFpLT5kcml2ZXItPm9wcy0+ZGVsYXkoc3Vic3RyZWFtLCBjcHVfZGFpKTsKKworCWlmIChjb2RlY19kYWktPmRyaXZlci0+b3BzLT5kZWxheSkKKwkJZGVsYXkgKz0gY29kZWNfZGFpLT5kcml2ZXItPm9wcy0+ZGVsYXkoc3Vic3RyZWFtLCBjb2RlY19kYWkpOworCisJaWYgKHBsYXRmb3JtLT5kcml2ZXItPmRlbGF5KQorCQlkZWxheSArPSBwbGF0Zm9ybS0+ZHJpdmVyLT5kZWxheShzdWJzdHJlYW0sIGNvZGVjX2RhaSk7CisKKwlydW50aW1lLT5kZWxheSA9IGRlbGF5OworCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogQVNvQyBQQ00gb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzb2NfcGNtX29wcyA9IHsKKwkub3BlbgkJPSBzb2NfcGNtX29wZW4sCisJLmNsb3NlCQk9IHNvY19wY21fY2xvc2UsCisJLmh3X3BhcmFtcwk9IHNvY19wY21faHdfcGFyYW1zLAorCS5od19mcmVlCT0gc29jX3BjbV9od19mcmVlLAorCS5wcmVwYXJlCT0gc29jX3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyCT0gc29jX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyCT0gc29jX3BjbV9wb2ludGVyLAorfTsKKworLyogY3JlYXRlIGEgbmV3IHBjbSAqLworaW50IHNvY19uZXdfcGNtKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsIGludCBudW0pCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBydGQtPnBsYXRmb3JtOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfcGNtICpwY207CisJY2hhciBuZXdfbmFtZVs2NF07CisJaW50IHJldCA9IDAsIHBsYXliYWNrID0gMCwgY2FwdHVyZSA9IDA7CisKKwkvKiBjaGVjayBjbGllbnQgYW5kIGludGVyZmFjZSBodyBjYXBhYmlsaXRpZXMgKi8KKwlzbnByaW50ZihuZXdfbmFtZSwgc2l6ZW9mKG5ld19uYW1lKSwgIiVzICVzLSVkIiwKKwkJCXJ0ZC0+ZGFpX2xpbmstPnN0cmVhbV9uYW1lLCBjb2RlY19kYWktPm5hbWUsIG51bSk7CisKKwlpZiAoY29kZWNfZGFpLT5kcml2ZXItPnBsYXliYWNrLmNoYW5uZWxzX21pbikKKwkJcGxheWJhY2sgPSAxOworCWlmIChjb2RlY19kYWktPmRyaXZlci0+Y2FwdHVyZS5jaGFubmVsc19taW4pCisJCWNhcHR1cmUgPSAxOworCisJZGV2X2RiZyhydGQtPmNhcmQtPmRldiwgInJlZ2lzdGVyZWQgcGNtICMlZCAlc1xuIixudW0sbmV3X25hbWUpOworCXJldCA9IHNuZF9wY21fbmV3KHJ0ZC0+Y2FyZC0+c25kX2NhcmQsIG5ld19uYW1lLAorCQkJbnVtLCBwbGF5YmFjaywgY2FwdHVyZSwgJnBjbSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBjYW4ndCBjcmVhdGUgcGNtIGZvciBjb2RlYyAlc1xuIiwgY29kZWMtPm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIERBUE0gZGFpIGxpbmsgc3RyZWFtIHdvcmsgKi8KKwlJTklUX0RFTEFZRURfV09SSygmcnRkLT5kZWxheWVkX3dvcmssIGNsb3NlX2RlbGF5ZWRfd29yayk7CisKKwlydGQtPnBjbSA9IHBjbTsKKwlwY20tPnByaXZhdGVfZGF0YSA9IHJ0ZDsKKwlpZiAocGxhdGZvcm0tPmRyaXZlci0+b3BzKSB7CisJCXNvY19wY21fb3BzLm1tYXAgPSBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPm1tYXA7CisJCXNvY19wY21fb3BzLnBvaW50ZXIgPSBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPnBvaW50ZXI7CisJCXNvY19wY21fb3BzLmlvY3RsID0gcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5pb2N0bDsKKwkJc29jX3BjbV9vcHMuY29weSA9IHBsYXRmb3JtLT5kcml2ZXItPm9wcy0+Y29weTsKKwkJc29jX3BjbV9vcHMuc2lsZW5jZSA9IHBsYXRmb3JtLT5kcml2ZXItPm9wcy0+c2lsZW5jZTsKKwkJc29jX3BjbV9vcHMuYWNrID0gcGxhdGZvcm0tPmRyaXZlci0+b3BzLT5hY2s7CisJCXNvY19wY21fb3BzLnBhZ2UgPSBwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPnBhZ2U7CisJfQorCisJaWYgKHBsYXliYWNrKQorCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc29jX3BjbV9vcHMpOworCisJaWYgKGNhcHR1cmUpCisJCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNvY19wY21fb3BzKTsKKworCWlmIChwbGF0Zm9ybS0+ZHJpdmVyLT5wY21fbmV3KSB7CisJCXJldCA9IHBsYXRmb3JtLT5kcml2ZXItPnBjbV9uZXcocnRkKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiYXNvYzogcGxhdGZvcm0gcGNtIGNvbnN0cnVjdG9yIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcGNtLT5wcml2YXRlX2ZyZWUgPSBwbGF0Zm9ybS0+ZHJpdmVyLT5wY21fZnJlZTsKKwlwcmludGsoS0VSTl9JTkZPICJhc29jOiAlcyA8LT4gJXMgbWFwcGluZyBva1xuIiwgY29kZWNfZGFpLT5uYW1lLAorCQljcHVfZGFpLT5uYW1lKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL0tjb25maWcgYi9zb3VuZC9zb2MvdGVncmEvS2NvbmZpZwppbmRleCAwMzVkMzlhLi5jNmFmMWZkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvdGVncmEvS2NvbmZpZwpAQCAtMTIsNiArMTIsMTUgQEAKIAkgIFRlZ3JhIEkyUyBpbnRlcmZhY2UuIFlvdSB3aWxsIGFsc28gbmVlZCB0byBzZWxlY3QgdGhlIGluZGl2aWR1YWwKIAkgIG1hY2hpbmUgZHJpdmVycyB0byBzdXBwb3J0IGJlbG93LgogCitjb25maWcgU05EX1NPQ19URUdSQV9TUERJRgorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBTTkRfU09DX1RFR1JBCisJZGVmYXVsdCBtCisJaGVscAorCSAgU2F5IFkgb3IgTSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIFNQRElGIGludGVyZmFjZS4KKwkgIFlvdSB3aWxsIGFsc28gbmVlZCB0byBzZWxlY3QgdGhlIGluZGl2aWR1YWwgbWFjaGluZSBkcml2ZXJzIHRvIHN1cHBvcnQKKwkgIGJlbG93LgorCiBjb25maWcgTUFDSF9IQVNfU05EX1NPQ19URUdSQV9XTTg5MDMKIAlib29sCiAJaGVscApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL01ha2VmaWxlIGIvc291bmQvc29jL3RlZ3JhL01ha2VmaWxlCmluZGV4IGZhNjU3NGQuLjRkOTQzYjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvdGVncmEvTWFrZWZpbGUKQEAgLTIsMTIgKzIsMTQgQEAKIHNuZC1zb2MtdGVncmEtZGFzLW9ianMgOj0gdGVncmFfZGFzLm8KIHNuZC1zb2MtdGVncmEtcGNtLW9ianMgOj0gdGVncmFfcGNtLm8KIHNuZC1zb2MtdGVncmEtaTJzLW9ianMgOj0gdGVncmFfaTJzLm8KK3NuZC1zb2MtdGVncmEtc3BkaWYtb2JqcyA6PSB0ZWdyYV9zcGRpZi5vCiBzbmQtc29jLXRlZ3JhLXV0aWxzLW9ianMgKz0gdGVncmFfYXNvY191dGlscy5vCiAKIG9iai0kKENPTkZJR19TTkRfU09DX1RFR1JBKSArPSBzbmQtc29jLXRlZ3JhLXV0aWxzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RFR1JBKSArPSBzbmQtc29jLXRlZ3JhLWRhcy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19URUdSQSkgKz0gc25kLXNvYy10ZWdyYS1wY20ubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVEVHUkFfSTJTKSArPSBzbmQtc29jLXRlZ3JhLWkycy5vCitvYmotJChDT05GSUdfU05EX1NPQ19URUdSQV9TUERJRikgKz0gc25kLXNvYy10ZWdyYS1zcGRpZi5vCiAKICMgVGVncmEgbWFjaGluZSBTdXBwb3J0CiBzbmQtc29jLXRlZ3JhLXdtODkwMy1vYmpzIDo9IHRlZ3JhX3dtODkwMy5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfaTJzLmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfaTJzLmMKaW5kZXggNmI4MTdlMi4uZjM2Yjk5NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX2kycy5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9pMnMuYwpAQCAtMjIyLDEyICsyMjIsMTggQEAKIAlpZiAoaTJzY2xvY2sgJSAoMiAqIHNyYXRlKSkKIAkJcmVnIHw9IFRFR1JBX0kyU19USU1JTkdfTk9OX1NZTV9FTkFCTEU7CiAKKwlpZiAoIWkycy0+Y2xrX3JlZnMpCisJCWNsa19lbmFibGUoaTJzLT5jbGtfaTJzKTsKKwogCXRlZ3JhX2kyc193cml0ZShpMnMsIFRFR1JBX0kyU19USU1JTkcsIHJlZyk7CiAKIAl0ZWdyYV9pMnNfd3JpdGUoaTJzLCBURUdSQV9JMlNfRklGT19TQ1IsCiAJCVRFR1JBX0kyU19GSUZPX1NDUl9GSUZPMl9BVE5fTFZMX0ZPVVJfU0xPVFMgfAogCQlURUdSQV9JMlNfRklGT19TQ1JfRklGTzFfQVROX0xWTF9GT1VSX1NMT1RTKTsKIAorCWlmICghaTJzLT5jbGtfcmVmcykKKwkJY2xrX2Rpc2FibGUoaTJzLT5jbGtfaTJzKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0zNDgsNyArMzU0LDYgQEAKIHN0YXRpYyBfX2RldmluaXQgaW50IHRlZ3JhX2kyc19wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB0ZWdyYV9pMnMgKiBpMnM7Ci0JY2hhciBjbGtfbmFtZVsxMl07IC8qIHRlZ3JhLWkycy4wICovCiAJc3RydWN0IHJlc291cmNlICptZW0sICptZW1yZWdpb24sICpkbWFyZXE7CiAJaW50IHJldDsKIApAQCAtMzgzLDggKzM4OCw3IEBACiAJfQogCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBpMnMpOwogCi0Jc25wcmludGYoY2xrX25hbWUsIHNpemVvZihjbGtfbmFtZSksIERSVl9OQU1FICIuJWQiLCBwZGV2LT5pZCk7Ci0JaTJzLT5jbGtfaTJzID0gY2xrX2dldF9zeXMoY2xrX25hbWUsIE5VTEwpOworCWkycy0+Y2xrX2kycyA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihpMnMtPmNsa19pMnMpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IHJldHJpZXZlIGkycyBjbG9ja1xuIik7CiAJCXJldCA9IFBUUl9FUlIoaTJzLT5jbGtfaTJzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9wY20uYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9wY20uYwppbmRleCAzYzI3MWY5Li5mZjg2ZTVlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfcGNtLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3BjbS5jCkBAIC0zMjIsOSArMzIyLDExIEBACiAKIHN0YXRpYyB1NjQgdGVncmFfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwogCi1zdGF0aWMgaW50IHRlZ3JhX3BjbV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLAotCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBzdHJ1Y3Qgc25kX3BjbSAqcGNtKQorc3RhdGljIGludCB0ZWdyYV9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoIWNhcmQtPmRldi0+ZG1hX21hc2spCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfc3BkaWYuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9zcGRpZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTYwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfc3BkaWYuYwpAQCAtMCwwICsxLDM3MSBAQAorLyoKKyAqIHRlZ3JhX3NwZGlmLmMgLSBUZWdyYSBTUERJRiBkcml2ZXIKKyAqCisgKiBBdXRob3I6IFN0ZXBoZW4gV2FycmVuIDxzd2FycmVuQG52aWRpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgLSBOVklESUEsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgInRlZ3JhX3NwZGlmLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgInRlZ3JhLXNwZGlmIgorCitzdGF0aWMgaW5saW5lIHZvaWQgdGVncmFfc3BkaWZfd3JpdGUoc3RydWN0IHRlZ3JhX3NwZGlmICpzcGRpZiwgdTMyIHJlZywKKwkJCQkJdTMyIHZhbCkKK3sKKwlfX3Jhd193cml0ZWwodmFsLCBzcGRpZi0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHRlZ3JhX3NwZGlmX3JlYWQoc3RydWN0IHRlZ3JhX3NwZGlmICpzcGRpZiwgdTMyIHJlZykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoc3BkaWYtPnJlZ3MgKyByZWcpOworfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgaW50IHRlZ3JhX3NwZGlmX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCit7CisjZGVmaW5lIFJFRyhyKSB7IHIsICNyIH0KKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJaW50IG9mZnNldDsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwl9IHJlZ3NbXSA9IHsKKwkJUkVHKFRFR1JBX1NQRElGX0NUUkwpLAorCQlSRUcoVEVHUkFfU1BESUZfU1RBVFVTKSwKKwkJUkVHKFRFR1JBX1NQRElGX1NUUk9CRV9DVFJMKSwKKwkJUkVHKFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1IpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1JYX0EpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1JYX0IpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1JYX0MpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1JYX0QpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1JYX0UpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1JYX0YpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1RYX0EpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1RYX0IpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1RYX0MpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1RYX0QpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1RYX0UpLAorCQlSRUcoVEVHUkFfU1BESUZfQ0hfU1RBX1RYX0YpLAorCX07CisjdW5kZWYgUkVHCisKKwlzdHJ1Y3QgdGVncmFfc3BkaWYgKnNwZGlmID0gcy0+cHJpdmF0ZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ3MpOyBpKyspIHsKKwkJdTMyIHZhbCA9IHRlZ3JhX3NwZGlmX3JlYWQoc3BkaWYsIHJlZ3NbaV0ub2Zmc2V0KTsKKwkJc2VxX3ByaW50ZihzLCAiJXMgPSAlMDh4XG4iLCByZWdzW2ldLm5hbWUsIHZhbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfc3BkaWZfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgdGVncmFfc3BkaWZfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRlZ3JhX3NwZGlmX2RlYnVnX2ZvcHMgPSB7CisJLm9wZW4gICAgPSB0ZWdyYV9zcGRpZl9kZWJ1Z19vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3NwZGlmX2RlYnVnX2FkZChzdHJ1Y3QgdGVncmFfc3BkaWYgKnNwZGlmKQoreworCXNwZGlmLT5kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoRFJWX05BTUUsIFNfSVJVR08sCisJCQkJCQlzbmRfc29jX2RlYnVnZnNfcm9vdCwgc3BkaWYsCisJCQkJCQkmdGVncmFfc3BkaWZfZGVidWdfZm9wcyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3NwZGlmX2RlYnVnX3JlbW92ZShzdHJ1Y3QgdGVncmFfc3BkaWYgKnNwZGlmKQoreworCWlmIChzcGRpZi0+ZGVidWcpCisJCWRlYnVnZnNfcmVtb3ZlKHNwZGlmLT5kZWJ1Zyk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHRlZ3JhX3NwZGlmX2RlYnVnX2FkZChzdHJ1Y3QgdGVncmFfc3BkaWYgKnNwZGlmKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGVncmFfc3BkaWZfZGVidWdfcmVtb3ZlKHN0cnVjdCB0ZWdyYV9zcGRpZiAqc3BkaWYpCit7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB0ZWdyYV9zcGRpZl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldjsKKwlzdHJ1Y3QgdGVncmFfc3BkaWYgKnNwZGlmID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKwlpbnQgcmV0LCBzcmF0ZSwgc3BkaWZjbG9jazsKKworCXNwZGlmLT5yZWdfY3RybCAmPSB+VEVHUkFfU1BESUZfQ1RSTF9QQUNLOworCXNwZGlmLT5yZWdfY3RybCAmPSB+VEVHUkFfU1BESUZfQ1RSTF9CSVRfTU9ERV9NQVNLOworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJc3BkaWYtPnJlZ19jdHJsIHw9IFRFR1JBX1NQRElGX0NUUkxfUEFDSzsKKwkJc3BkaWYtPnJlZ19jdHJsIHw9IFRFR1JBX1NQRElGX0NUUkxfQklUX01PREVfMTZCSVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNyYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwljYXNlIDMyMDAwOgorCQlzcGRpZmNsb2NrID0gNDA5NjAwMDsKKwkJYnJlYWs7CisJY2FzZSA0NDEwMDoKKwkJc3BkaWZjbG9jayA9IDU2NDQ4MDA7CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCXNwZGlmY2xvY2sgPSA2MTQ0MDAwOworCQlicmVhazsKKwljYXNlIDg4MjAwOgorCQlzcGRpZmNsb2NrID0gMTEyODk2MDA7CisJCWJyZWFrOworCWNhc2UgOTYwMDA6CisJCXNwZGlmY2xvY2sgPSAxMjI4ODAwMDsKKwkJYnJlYWs7CisJY2FzZSAxNzY0MDA6CisJCXNwZGlmY2xvY2sgPSAyMjU3OTIwMDsKKwkJYnJlYWs7CisJY2FzZSAxOTIwMDA6CisJCXNwZGlmY2xvY2sgPSAyNDU3NjAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gY2xrX3NldF9yYXRlKHNwZGlmLT5jbGtfc3BkaWZfb3V0LCBzcGRpZmNsb2NrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3Qgc2V0IFNQRElGIGNsb2NrIHJhdGU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV9zcGRpZl9zdGFydF9wbGF5YmFjayhzdHJ1Y3QgdGVncmFfc3BkaWYgKnNwZGlmKQoreworCXNwZGlmLT5yZWdfY3RybCB8PSBURUdSQV9TUERJRl9DVFJMX1RYX0VOOworCXRlZ3JhX3NwZGlmX3dyaXRlKHNwZGlmLCBURUdSQV9TUERJRl9DVFJMLCBzcGRpZi0+cmVnX2N0cmwpOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV9zcGRpZl9zdG9wX3BsYXliYWNrKHN0cnVjdCB0ZWdyYV9zcGRpZiAqc3BkaWYpCit7CisJc3BkaWYtPnJlZ19jdHJsICY9IH5URUdSQV9TUERJRl9DVFJMX1RYX0VOOworCXRlZ3JhX3NwZGlmX3dyaXRlKHNwZGlmLCBURUdSQV9TUERJRl9DVFJMLCBzcGRpZi0+cmVnX2N0cmwpOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3NwZGlmX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQsCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHRlZ3JhX3NwZGlmICpzcGRpZiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCQlpZiAoIXNwZGlmLT5jbGtfcmVmcykKKwkJCWNsa19lbmFibGUoc3BkaWYtPmNsa19zcGRpZl9vdXQpOworCQlzcGRpZi0+Y2xrX3JlZnMrKzsKKwkJdGVncmFfc3BkaWZfc3RhcnRfcGxheWJhY2soc3BkaWYpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwkJdGVncmFfc3BkaWZfc3RvcF9wbGF5YmFjayhzcGRpZik7CisJCXNwZGlmLT5jbGtfcmVmcy0tOworCQlpZiAoIXNwZGlmLT5jbGtfcmVmcykKKwkJCWNsa19kaXNhYmxlKHNwZGlmLT5jbGtfc3BkaWZfb3V0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfc3BkaWZfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHRlZ3JhX3NwZGlmICpzcGRpZiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisKKwlkYWktPmNhcHR1cmVfZG1hX2RhdGEgPSBOVUxMOworCWRhaS0+cGxheWJhY2tfZG1hX2RhdGEgPSAmc3BkaWYtPnBsYXliYWNrX2RtYV9kYXRhOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHRlZ3JhX3NwZGlmX2RhaV9vcHMgPSB7CisJLmh3X3BhcmFtcwk9IHRlZ3JhX3NwZGlmX2h3X3BhcmFtcywKKwkudHJpZ2dlcgk9IHRlZ3JhX3NwZGlmX3RyaWdnZXIsCit9OworCitzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHRlZ3JhX3NwZGlmX2RhaSA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5wcm9iZSA9IHRlZ3JhX3NwZGlmX3Byb2JlLAorCS5wbGF5YmFjayA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwl9LAorCS5vcHMgPSAmdGVncmFfc3BkaWZfZGFpX29wcywKK307CisKK3N0YXRpYyBfX2RldmluaXQgaW50IHRlZ3JhX3NwZGlmX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRlZ3JhX3NwZGlmICpzcGRpZjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgKm1lbXJlZ2lvbiwgKmRtYXJlcTsKKwlpbnQgcmV0OworCisJc3BkaWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGVncmFfc3BkaWYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNwZGlmKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGFsbG9jYXRlIHRlZ3JhX3NwZGlmXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgc3BkaWYpOworCisJc3BkaWYtPmNsa19zcGRpZl9vdXQgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJzcGRpZl9vdXQiKTsKKwlpZiAoSVNfRVJSKHNwZGlmLT5jbGtfc3BkaWZfb3V0KSkgeworCQlwcl9lcnIoIkNhbid0IHJldHJpZXZlIHNwZGlmIGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihzcGRpZi0+Y2xrX3NwZGlmX291dCk7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIW1lbSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBtZW1vcnkgcmVzb3VyY2VcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9jbGtfcHV0OworCX0KKworCWRtYXJlcSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7CisJaWYgKCFkbWFyZXEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gRE1BIHJlc291cmNlXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfY2xrX3B1dDsKKwl9CisKKwltZW1yZWdpb24gPSByZXF1ZXN0X21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pLAorCQkJCQlEUlZfTkFNRSk7CisJaWYgKCFtZW1yZWdpb24pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IHJlZ2lvbiBhbHJlYWR5IGNsYWltZWRcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX2Nsa19wdXQ7CisJfQorCisJc3BkaWYtPnJlZ3MgPSBpb3JlbWFwKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CisJaWYgKCFzcGRpZi0+cmVncykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpb3JlbWFwIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCisJc3BkaWYtPnBsYXliYWNrX2RtYV9kYXRhLmFkZHIgPSBtZW0tPnN0YXJ0ICsgVEVHUkFfU1BESUZfREFUQV9PVVQ7CisJc3BkaWYtPnBsYXliYWNrX2RtYV9kYXRhLndyYXAgPSA0OworCXNwZGlmLT5wbGF5YmFja19kbWFfZGF0YS53aWR0aCA9IDMyOworCXNwZGlmLT5wbGF5YmFja19kbWFfZGF0YS5yZXFfc2VsID0gZG1hcmVxLT5zdGFydDsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYsICZ0ZWdyYV9zcGRpZl9kYWkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIERBSTogJWRcbiIsIHJldCk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VubWFwOworCX0KKworCXRlZ3JhX3NwZGlmX2RlYnVnX2FkZChzcGRpZik7CisKKwlyZXR1cm4gMDsKKworZXJyX3VubWFwOgorCWlvdW5tYXAoc3BkaWYtPnJlZ3MpOworZXJyX3JlbGVhc2U6CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CitlcnJfY2xrX3B1dDoKKwljbGtfcHV0KHNwZGlmLT5jbGtfc3BkaWZfb3V0KTsKK2Vycl9mcmVlOgorCWtmcmVlKHNwZGlmKTsKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdGVncmFfc3BkaWZfcGxhdGZvcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRlZ3JhX3NwZGlmICpzcGRpZiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldik7CisKKwl0ZWdyYV9zcGRpZl9kZWJ1Z19yZW1vdmUoc3BkaWYpOworCisJaW91bm1hcChzcGRpZi0+cmVncyk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCisJY2xrX3B1dChzcGRpZi0+Y2xrX3NwZGlmX291dCk7CisKKwlrZnJlZShzcGRpZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfc3BkaWZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gdGVncmFfc3BkaWZfcGxhdGZvcm1fcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHRlZ3JhX3NwZGlmX3BsYXRmb3JtX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzbmRfdGVncmFfc3BkaWZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRlZ3JhX3NwZGlmX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChzbmRfdGVncmFfc3BkaWZfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbmRfdGVncmFfc3BkaWZfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYV9zcGRpZl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoc25kX3RlZ3JhX3NwZGlmX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTdGVwaGVuIFdhcnJlbiA8c3dhcnJlbkBudmlkaWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUZWdyYSBTUERJRiBBU29DIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVl9OQU1FKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9zcGRpZi5oIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3NwZGlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwM2RiNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9zcGRpZi5oCkBAIC0wLDAgKzEsNDczIEBACisvKgorICogdGVncmFfc3BkaWYuaCAtIERlZmluaXRpb25zIGZvciBUZWdyYSBTUERJRiBkcml2ZXIKKyAqCisgKiBBdXRob3I6IFN0ZXBoZW4gV2FycmVuIDxzd2FycmVuQG52aWRpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgLSBOVklESUEsIEluYy4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGNvcHlyaWdodC9ieToKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5LCBOVklESUEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19URUdSQV9TUERJRl9IX18KKyNkZWZpbmUgX19URUdSQV9TUERJRl9IX18KKworI2luY2x1ZGUgInRlZ3JhX3BjbS5oIgorCisvKiBPZmZzZXRzIGZyb20gVEVHUkFfU1BESUZfQkFTRSAqLworCisjZGVmaW5lIFRFR1JBX1NQRElGX0NUUkwJCQkJCTB4MAorI2RlZmluZSBURUdSQV9TUERJRl9TVEFUVVMJCQkJCTB4NAorI2RlZmluZSBURUdSQV9TUERJRl9TVFJPQkVfQ1RSTAkJCQkJMHg4CisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1IJCQkJMHgwQworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX09VVAkJCQkJMHg0MAorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0lOCQkJCQkweDgwCisjZGVmaW5lIFRFR1JBX1NQRElGX0NIX1NUQV9SWF9BCQkJCQkweDEwMAorI2RlZmluZSBURUdSQV9TUERJRl9DSF9TVEFfUlhfQgkJCQkJMHgxMDQKKyNkZWZpbmUgVEVHUkFfU1BESUZfQ0hfU1RBX1JYX0MJCQkJCTB4MTA4CisjZGVmaW5lIFRFR1JBX1NQRElGX0NIX1NUQV9SWF9ECQkJCQkweDEwQworI2RlZmluZSBURUdSQV9TUERJRl9DSF9TVEFfUlhfRQkJCQkJMHgxMTAKKyNkZWZpbmUgVEVHUkFfU1BESUZfQ0hfU1RBX1JYX0YJCQkJCTB4MTE0CisjZGVmaW5lIFRFR1JBX1NQRElGX0NIX1NUQV9UWF9BCQkJCQkweDE0MAorI2RlZmluZSBURUdSQV9TUERJRl9DSF9TVEFfVFhfQgkJCQkJMHgxNDQKKyNkZWZpbmUgVEVHUkFfU1BESUZfQ0hfU1RBX1RYX0MJCQkJCTB4MTQ4CisjZGVmaW5lIFRFR1JBX1NQRElGX0NIX1NUQV9UWF9ECQkJCQkweDE0QworI2RlZmluZSBURUdSQV9TUERJRl9DSF9TVEFfVFhfRQkJCQkJMHgxNTAKKyNkZWZpbmUgVEVHUkFfU1BESUZfQ0hfU1RBX1RYX0YJCQkJCTB4MTU0CisjZGVmaW5lIFRFR1JBX1NQRElGX1VTUl9TVEFfUlhfQQkJCQkweDE4MAorI2RlZmluZSBURUdSQV9TUERJRl9VU1JfREFUX1RYX0EJCQkJMHgxQzAKKworLyogRmllbGRzIGluIFRFR1JBX1NQRElGX0NUUkwgKi8KKworLyogU3RhcnQgY2FwdHVyaW5nIGZyb20gMD1yaWdodCwgMT1sZWZ0IGNoYW5uZWwgKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfQ1RSTF9DQVBfTEMJCQkJCSgxIDw8IDMwKQorCisvKiBTUERJRiByZWNlaXZlcihSWCkgZW5hYmxlICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0NUUkxfUlhfRU4JCQkJCSgxIDw8IDI5KQorCisvKiBTUERJRiBUcmFuc21pdHRlcihUWCkgZW5hYmxlICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0NUUkxfVFhfRU4JCQkJCSgxIDw8IDI4KQorCisvKiBUcmFuc21pdCBDaGFubmVsIHN0YXR1cyAqLworI2RlZmluZSBURUdSQV9TUERJRl9DVFJMX1RDX0VOCQkJCQkoMSA8PCAyNykKKworLyogVHJhbnNtaXQgdXNlciBEYXRhICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0NUUkxfVFVfRU4JCQkJCSgxIDw8IDI2KQorCisvKiBJbnRlcnJ1cHQgb24gdHJhbnNtaXQgZXJyb3IgKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfQ1RSTF9JRV9UWEUJCQkJCSgxIDw8IDI1KQorCisvKiBJbnRlcnJ1cHQgb24gcmVjZWl2ZSBlcnJvciAqLworI2RlZmluZSBURUdSQV9TUERJRl9DVFJMX0lFX1JYRQkJCQkJKDEgPDwgMjQpCisKKy8qIEludGVycnVwdCBvbiBpbnZhbGlkIHByZWFtYmxlICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0NUUkxfSUVfUAkJCQkJKDEgPDwgMjMpCisKKy8qIEludGVycnVwdCBvbiAiQiIgcHJlYW1ibGUgKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfQ1RSTF9JRV9CCQkJCQkoMSA8PCAyMikKKworLyogSW50ZXJydXB0IHdoZW4gYmxvY2sgb2YgY2hhbm5lbCBzdGF0dXMgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfQ1RSTF9JRV9DCQkJCQkoMSA8PCAyMSkKKworLyogSW50ZXJydXB0IHdoZW4gYSB2YWxpZCBpbmZvcm1hdGlvbiB1bml0IChJVSkgaXMgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfQ1RSTF9JRV9VCQkJCQkoMSA8PCAyMCkKKworLyogSW50ZXJydXB0IHdoZW4gUlggdXNlciBGSUZPIGF0dGVudGlvbiBsZXZlbCBpcyByZWFjaGVkICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0NUUkxfUUVfUlUJCQkJCSgxIDw8IDE5KQorCisvKiBJbnRlcnJ1cHQgd2hlbiBUWCB1c2VyIEZJRk8gYXR0ZW50aW9uIGxldmVsIGlzIHJlYWNoZWQgKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfQ1RSTF9RRV9UVQkJCQkJKDEgPDwgMTgpCisKKy8qIEludGVycnVwdCB3aGVuIFJYIGRhdGEgRklGTyBhdHRlbnRpb24gbGV2ZWwgaXMgcmVhY2hlZCAqLworI2RlZmluZSBURUdSQV9TUERJRl9DVFJMX1FFX1JYCQkJCQkoMSA8PCAxNykKKworLyogSW50ZXJydXB0IHdoZW4gVFggZGF0YSBGSUZPIGF0dGVudGlvbiBsZXZlbCBpcyByZWFjaGVkICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0NUUkxfUUVfVFgJCQkJCSgxIDw8IDE2KQorCisvKiBMb29wYmFjayB0ZXN0IG1vZGUgZW5hYmxlICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0NUUkxfTEJLX0VOCQkJCQkoMSA8PCAxNSkKKworLyoKKyAqIFBhY2sgZGF0YSBtb2RlOgorICogMCA9IFNpbmdsZSBkYXRhICgxNiBiaXQgbmVlZHMgdG8gYmUgIHBhZGRlZCB0byBtYXRjaCB0aGUKKyAqICAgICBpbnRlcmZhY2UgZGF0YSBiaXQgc2l6ZSkuCisgKiAxID0gUGFja2V0ZWQgbGVmdC9yaWdodCBjaGFubmVsIGRhdGEgaW50byBhIHNpbmdsZSB3b3JkLgorICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0NUUkxfUEFDSwkJCQkJKDEgPDwgMTQpCisKKy8qCisgKiAwMCA9IDE2Yml0IGRhdGEKKyAqIDAxID0gMjBiaXQgZGF0YQorICogMTAgPSAyNGJpdCBkYXRhCisgKiAxMSA9IHJhdyBkYXRhCisgKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfQklUX01PREVfMTZCSVQJCQkJMAorI2RlZmluZSBURUdSQV9TUERJRl9CSVRfTU9ERV8yMEJJVAkJCQkxCisjZGVmaW5lIFRFR1JBX1NQRElGX0JJVF9NT0RFXzI0QklUCQkJCTIKKyNkZWZpbmUgVEVHUkFfU1BESUZfQklUX01PREVfUkFXCQkJCTMKKworI2RlZmluZSBURUdSQV9TUERJRl9DVFJMX0JJVF9NT0RFX1NISUZUCQkJCTEyCisjZGVmaW5lIFRFR1JBX1NQRElGX0NUUkxfQklUX01PREVfTUFTSwkJCQkoMyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgVEVHUkFfU1BESUZfQ1RSTF9CSVRfTU9ERV9TSElGVCkKKyNkZWZpbmUgVEVHUkFfU1BESUZfQ1RSTF9CSVRfTU9ERV8xNkJJVAkJCQkoVEVHUkFfU1BESUZfQklUX01PREVfMTZCSVQgPDwgVEVHUkFfU1BESUZfQ1RSTF9CSVRfTU9ERV9TSElGVCkKKyNkZWZpbmUgVEVHUkFfU1BESUZfQ1RSTF9CSVRfTU9ERV8yMEJJVAkJCQkoVEVHUkFfU1BESUZfQklUX01PREVfMjBCSVQgPDwgVEVHUkFfU1BESUZfQ1RSTF9CSVRfTU9ERV9TSElGVCkKKyNkZWZpbmUgVEVHUkFfU1BESUZfQ1RSTF9CSVRfTU9ERV8yNEJJVAkJCQkoVEVHUkFfU1BESUZfQklUX01PREVfMjRCSVQgPDwgVEVHUkFfU1BESUZfQ1RSTF9CSVRfTU9ERV9TSElGVCkKKyNkZWZpbmUgVEVHUkFfU1BESUZfQ1RSTF9CSVRfTU9ERV9SQVcJCQkJKFRFR1JBX1NQRElGX0JJVF9NT0RFX1JBVyAgIDw8IFRFR1JBX1NQRElGX0NUUkxfQklUX01PREVfU0hJRlQpCisKKy8qIEZpZWxkcyBpbiBURUdSQV9TUERJRl9TVEFUVVMgKi8KKworLyoKKyAqIE5vdGU6IElTX1AsIElTX0IsIElTX0MsIGFuZCBJU19VIGFyZSBzdGlja3kgYml0cy4gU29mdHdhcmUgbXVzdAorICogd3JpdGUgYSAxIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBsb2NhdGlvbiB0byBjbGVhciB0aGUgc3RhdHVzLgorICovCisKKy8qCisgKiBSZWNlaXZlcihSWCkgc2hpZnRlciBpcyBidXN5IHJlY2VpdmluZyBkYXRhLgorICogVGhpcyBiaXQgaXMgYXNzZXJ0ZWQgd2hlbiB0aGUgcmVjZWl2ZXIgZmlyc3QgbG9ja2VkIG9udG8gdGhlCisgKiBwcmVhbWJsZSBvZiB0aGUgZGF0YSBzdHJlYW0gYWZ0ZXIgUlhfRU4gaXMgYXNzZXJ0ZWQuIFRoaXMgYml0IGlzCisgKiBkZWFzc2VydGVkIHdoZW4gZWl0aGVyLAorICogKGEpIHRoZSBlbmQgb2YgYSBmcmFtZSBpcyByZWFjaGVkIGFmdGVyIFJYX0VOIGlzIGRlZWFzc2VydGVkLCBvcgorICogKGIpIHRoZSBTUERJRiBkYXRhIHN0cmVhbSBiZWNvbWVzIGluYWN0aXZlLgorICovCisjZGVmaW5lIFRFR1JBX1NQRElGX1NUQVRVU19SWF9CU1kJCQkJKDEgPDwgMjkpCisKKy8qCisgKiBUcmFuc21pdHRlcihUWCkgc2hpZnRlciBpcyBidXN5IHRyYW5zbWl0dGluZyBkYXRhLgorICogVGhpcyBiaXQgaXMgYXNzZXJ0ZWQgd2hlbiBUWF9FTiBpcyBhc3NlcnRlZC4KKyAqIFRoaXMgYml0IGlzIGRlYXNzZXJ0ZWQgd2hlbiB0aGUgZW5kIG9mIGEgZnJhbWUgaXMgcmVhY2hlZCBhZnRlcgorICogVFhfRU4gaXMgZGVhc3NlcnRlZC4KKyAqLworI2RlZmluZSBURUdSQV9TUERJRl9TVEFUVVNfVFhfQlNZCQkJCSgxIDw8IDI4KQorCisvKgorICogVFggaXMgYnVzeSBzaGlmdGluZyBvdXQgY2hhbm5lbCBzdGF0dXMuCisgKiBUaGlzIGJpdCBpcyBhc3NlcnRlZCB3aGVuIGJvdGggVFhfRU4gYW5kIFRDX0VOIGFyZSBhc3NlcnRlZCBhbmQKKyAqIGRhdGEgZnJvbSBDSF9TVEFfVFhfQSByZWdpc3RlciBpcyBsb2FkZWQgaW50byB0aGUgaW50ZXJuYWwgc2hpZnRlci4KKyAqIFRoaXMgYml0IGlzIGRlYXNzZXJ0ZWQgd2hlbiBlaXRoZXIsCisgKiAoYSkgdGhlIGVuZCBvZiBhIGZyYW1lIGlzIHJlYWNoZWQgYWZ0ZXIgVFhfRU4gaXMgZGVhc3NlcnRlZCwgb3IKKyAqIChiKSBDSF9TVEFfVFhfRiByZWdpc3RlciBpcyBsb2FkZWQgaW50byB0aGUgaW50ZXJuYWwgc2hpZnRlci4KKyAqLworI2RlZmluZSBURUdSQV9TUERJRl9TVEFUVVNfVENfQlNZCQkJCSgxIDw8IDI3KQorCisvKgorICogVFggVXNlciBkYXRhIEZJRk8gYnVzeS4KKyAqIFRoaXMgYml0IGlzIGFzc2VydGVkIHdoZW4gVFhfRU4gYW5kIFRYVV9FTiBhcmUgYXNzZXJ0ZWQgYW5kCisgKiB0aGVyZSdzIGRhdGEgaW4gdGhlIFRYIHVzZXIgRklGTy4gIFRoaXMgYml0IGlzIGRlYXNzZXJ0IHdoZW4gZWl0aGVyLAorICogKGEpIHRoZSBlbmQgb2YgYSBmcmFtZSBpcyByZWFjaGVkIGFmdGVyIFRYX0VOIGlzIGRlYXNzZXJ0ZWQsIG9yCisgKiAoYikgdGhlcmUncyBubyBkYXRhIGxlZnQgaW4gdGhlIFRYIHVzZXIgRklGTy4KKyAqLworI2RlZmluZSBURUdSQV9TUERJRl9TVEFUVVNfVFVfQlNZCQkJCSgxIDw8IDI2KQorCisvKiBUWCBGSUZPIFVuZGVycnVuIGVycm9yIHN0YXR1cyAqLworI2RlZmluZSBURUdSQV9TUERJRl9TVEFUVVNfVFhfRVJSCQkJCSgxIDw8IDI1KQorCisvKiBSWCBGSUZPIE92ZXJydW4gZXJyb3Igc3RhdHVzICovCisjZGVmaW5lIFRFR1JBX1NQRElGX1NUQVRVU19SWF9FUlIJCQkJKDEgPDwgMjQpCisKKy8qIFByZWFtYmxlIHN0YXR1czogMD1QcmVhbWJsZSBPSywgMT1iYWQvbWlzc2luZyBwcmVhbWJsZSAqLworI2RlZmluZSBURUdSQV9TUERJRl9TVEFUVVNfSVNfUAkJCQkJKDEgPDwgMjMpCisKKy8qIEItcHJlYW1ibGUgZGV0ZWN0aW9uIHN0YXR1czogMD1ub3QgZGV0ZWN0ZWQsIDE9Qi1wcmVhbWJsZSBkZXRlY3RlZCAqLworI2RlZmluZSBURUdSQV9TUERJRl9TVEFUVVNfSVNfQgkJCQkJKDEgPDwgMjIpCisKKy8qCisgKiBSWCBjaGFubmVsIGJsb2NrIGRhdGEgcmVjZWl2ZSBzdGF0dXM6CisgKiAwPWVudGlyZSBibG9jayBub3QgcmVjaWV2ZWQgeWV0LgorICogMT1yZWNlaXZlZCBlbnRpcmUgYmxvY2sgb2YgY2hhbm5lbCBzdGF0dXMsCisgKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfU1RBVFVTX0lTX0MJCQkJCSgxIDw8IDIxKQorCisvKiBSWCBVc2VyIERhdGEgVmFsaWQgZmxhZzogIDE9dmFsaWQgSVUgZGV0ZWN0ZWQsIDAgPSBubyBJVSBkZXRlY3RlZC4gKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfU1RBVFVTX0lTX1UJCQkJCSgxIDw8IDIwKQorCisvKgorICogUlggVXNlciBGSUZPIFN0YXR1czoKKyAqIDE9YXR0ZW50aW9uIGxldmVsIHJlYWNoZWQsIDA9YXR0ZW50aW9uIGxldmVsIG5vdCByZWFjaGVkLgorICovCisjZGVmaW5lIFRFR1JBX1NQRElGX1NUQVRVU19RU19SVQkJCQkoMSA8PCAxOSkKKworLyoKKyAqIFRYIFVzZXIgRklGTyBTdGF0dXM6CisgKiAxPWF0dGVudGlvbiBsZXZlbCByZWFjaGVkLCAwPWF0dGVudGlvbiBsZXZlbCBub3QgcmVhY2hlZC4KKyAqLworI2RlZmluZSBURUdSQV9TUERJRl9TVEFUVVNfUVNfVFUJCQkJKDEgPDwgMTgpCisKKy8qCisgKiBSWCBEYXRhIEZJRk8gU3RhdHVzOgorICogMT1hdHRlbnRpb24gbGV2ZWwgcmVhY2hlZCwgMD1hdHRlbnRpb24gbGV2ZWwgbm90IHJlYWNoZWQuCisgKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfU1RBVFVTX1FTX1JYCQkJCSgxIDw8IDE3KQorCisvKgorICogVFggRGF0YSBGSUZPIFN0YXR1czoKKyAqIDE9YXR0ZW50aW9uIGxldmVsIHJlYWNoZWQsIDA9YXR0ZW50aW9uIGxldmVsIG5vdCByZWFjaGVkLgorICovCisjZGVmaW5lIFRFR1JBX1NQRElGX1NUQVRVU19RU19UWAkJCQkoMSA8PCAxNikKKworLyogRmllbGRzIGluIFRFR1JBX1NQRElGX1NUUk9CRV9DVFJMICovCisKKy8qCisgKiBJbmRpY2F0ZXMgdGhlIGFwcHJveGltYXRlIG51bWJlciBvZiBkZXRlY3RlZCBTUERJRklOIGNsb2NrcyB3aXRoaW4gYQorICogYmktcGhhc2UgcGVyaW9kLgorICovCisjZGVmaW5lIFRFR1JBX1NQRElGX1NUUk9CRV9DVFJMX1BFUklPRF9TSElGVAkJCTE2CisjZGVmaW5lIFRFR1JBX1NQRElGX1NUUk9CRV9DVFJMX1BFUklPRF9NQVNLCQkJKDB4ZmYgPDwgVEVHUkFfU1BESUZfU1RST0JFX0NUUkxfUEVSSU9EX1NISUZUKQorCisvKiBEYXRhIHN0cm9iZSBtb2RlOiAwPUF1dG8tbG9ja2VkIDE9TWFudWFsIGxvY2tlZCAqLworI2RlZmluZSBURUdSQV9TUERJRl9TVFJPQkVfQ1RSTF9TVFJPQkUJCQkJKDEgPDwgMTUpCisKKy8qCisgKiBNYW51YWwgZGF0YSBzdHJvYmUgdGltZSB3aXRoaW4gdGhlIGJpLXBoYXNlIGNsb2NrIHBlcmlvZCAoaW4gdGVybXMgb2YKKyAqIHRoZSBudW1iZXIgb2Ygb3Zlci1zYW1wbGluZyBjbG9ja3MpLgorICovCisjZGVmaW5lIFRFR1JBX1NQRElGX1NUUk9CRV9DVFJMX0RBVEFfU1RST0JFU19TSElGVAkJOAorI2RlZmluZSBURUdSQV9TUERJRl9TVFJPQkVfQ1RSTF9EQVRBX1NUUk9CRVNfTUFTSwkJKDB4MWYgPDwgVEVHUkFfU1BESUZfU1RST0JFX0NUUkxfREFUQV9TVFJPQkVTX1NISUZUKQorCisvKgorICogTWFudWFsIFNQRElGSU4gYmktcGhhc2UgY2xvY2sgcGVyaW9kIChpbiB0ZXJtcyBvZiB0aGUgbnVtYmVyIG9mCisgKiBvdmVyLXNhbXBsaW5nIGNsb2NrcykuCisgKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfU1RST0JFX0NUUkxfQ0xPQ0tfUEVSSU9EX1NISUZUCQkwCisjZGVmaW5lIFRFR1JBX1NQRElGX1NUUk9CRV9DVFJMX0NMT0NLX1BFUklPRF9NQVNLCQkoMHgzZiA8PCBURUdSQV9TUERJRl9TVFJPQkVfQ1RSTF9DTE9DS19QRVJJT0RfU0hJRlQpCisKKy8qIEZpZWxkcyBpbiBTUERJRl9EQVRBX0ZJRk9fQ1NSICovCisKKy8qIENsZWFyIFJlY2VpdmVyIFVzZXIgRklGTyAoUlggVVNSLkZJRk8pICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfUlVfQ0xSCQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgVEVHUkFfU1BESUZfRklGT19BVE5fTFZMX1VfT05FX1NMT1QJCQkwCisjZGVmaW5lIFRFR1JBX1NQRElGX0ZJRk9fQVROX0xWTF9VX1RXT19TTE9UUwkJCTEKKyNkZWZpbmUgVEVHUkFfU1BESUZfRklGT19BVE5fTFZMX1VfVEhSRUVfU0xPVFMJCQkyCisjZGVmaW5lIFRFR1JBX1NQRElGX0ZJRk9fQVROX0xWTF9VX0ZPVVJfU0xPVFMJCQkzCisKKy8qIFJVIEZJRk8gYXR0ZW50aW9uIGxldmVsICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfUlVfQVROX0xWTF9TSElGVAkJMjkKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SVV9BVE5fTFZMX01BU0sJCVwKKwkJKDB4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfUlVfQVROX0xWTF9TSElGVCkKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SVV9BVE5fTFZMX1JVMV9XT1JEX0ZVTEwJXAorCQkoVEVHUkFfU1BESUZfRklGT19BVE5fTFZMX1VfT05FX1NMT1QgICAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SVV9BVE5fTFZMX1NISUZUKQorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1JVX0FUTl9MVkxfUlUyX1dPUkRfRlVMTAlcCisJCShURUdSQV9TUERJRl9GSUZPX0FUTl9MVkxfVV9UV09fU0xPVFMgICA8PCBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1JVX0FUTl9MVkxfU0hJRlQpCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfUlVfQVROX0xWTF9SVTNfV09SRF9GVUxMCVwKKwkJKFRFR1JBX1NQRElGX0ZJRk9fQVROX0xWTF9VX1RIUkVFX1NMT1RTIDw8IFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfUlVfQVROX0xWTF9TSElGVCkKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SVV9BVE5fTFZMX1JVNF9XT1JEX0ZVTEwJXAorCQkoVEVHUkFfU1BESUZfRklGT19BVE5fTFZMX1VfRk9VUl9TTE9UUyAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SVV9BVE5fTFZMX1NISUZUKQorCisvKiBOdW1iZXIgb2YgUlggVVNSLkZJRk8gbGV2ZWxzIHdpdGggdmFsaWQgZGF0YS4gKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SVV9GVUxMX0NPVU5UX1NISUZUCQkyNAorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1JVX0ZVTExfQ09VTlRfTUFTSwkJKDB4MWYgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SVV9GVUxMX0NPVU5UX1NISUZUKQorCisvKiBDbGVhciBUcmFuc21pdHRlciBVc2VyIEZJRk8gKFRYIFVTUi5GSUZPKSAqLworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1RVX0NMUgkJCSgxIDw8IDIzKQorCisvKiBUVSBGSUZPIGF0dGVudGlvbiBsZXZlbCAqLworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1RVX0FUTl9MVkxfU0hJRlQJCTIxCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfVFVfQVROX0xWTF9NQVNLCQlcCisJCSgweDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfVFVfQVROX0xWTF9TSElGVCkKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9UVV9BVE5fTFZMX1RVMV9XT1JEX0ZVTEwJXAorCQkoVEVHUkFfU1BESUZfRklGT19BVE5fTFZMX1VfT05FX1NMT1QgICAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9UVV9BVE5fTFZMX1NISUZUKQorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1RVX0FUTl9MVkxfVFUyX1dPUkRfRlVMTAlcCisJCShURUdSQV9TUERJRl9GSUZPX0FUTl9MVkxfVV9UV09fU0xPVFMgICA8PCBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1RVX0FUTl9MVkxfU0hJRlQpCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfVFVfQVROX0xWTF9UVTNfV09SRF9GVUxMCVwKKwkJKFRFR1JBX1NQRElGX0ZJRk9fQVROX0xWTF9VX1RIUkVFX1NMT1RTIDw8IFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfVFVfQVROX0xWTF9TSElGVCkKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9UVV9BVE5fTFZMX1RVNF9XT1JEX0ZVTEwJXAorCQkoVEVHUkFfU1BESUZfRklGT19BVE5fTFZMX1VfRk9VUl9TTE9UUyAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9UVV9BVE5fTFZMX1NISUZUKQorCisvKiBOdW1iZXIgb2YgVFggVVNSLkZJRk8gbGV2ZWxzIHRoYXQgY291bGQgYmUgZmlsbGVkLiAqLworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1RVX0VNUFRZX0NPVU5UX1NISUZUCQkxNgorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1RVX0VNUFRZX0NPVU5UX01BU0sJCSgweDFmIDw8IFNQRElGX0RBVEFfRklGT19DU1JfVFVfRU1QVFlfQ09VTlRfU0hJRlQpCisKKy8qIENsZWFyIFJlY2VpdmVyIERhdGEgRklGTyAoUlggREFUQS5GSUZPKSAqLworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1JYX0NMUgkJCSgxIDw8IDE1KQorCisjZGVmaW5lIFRFR1JBX1NQRElGX0ZJRk9fQVROX0xWTF9EX09ORV9TTE9UCQkJMAorI2RlZmluZSBURUdSQV9TUERJRl9GSUZPX0FUTl9MVkxfRF9GT1VSX1NMT1RTCQkJMQorI2RlZmluZSBURUdSQV9TUERJRl9GSUZPX0FUTl9MVkxfRF9FSUdIVF9TTE9UUwkJCTIKKyNkZWZpbmUgVEVHUkFfU1BESUZfRklGT19BVE5fTFZMX0RfVFdFTFZFX1NMT1RTCQkJMworCisvKiBSVSBGSUZPIGF0dGVudGlvbiBsZXZlbCAqLworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1JYX0FUTl9MVkxfU0hJRlQJCTEzCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfUlhfQVROX0xWTF9NQVNLCQlcCisJCSgweDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SWF9BVE5fTFZMX1NISUZUKQorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1JYX0FUTl9MVkxfUlUxX1dPUkRfRlVMTAlcCisJCShURUdSQV9TUERJRl9GSUZPX0FUTl9MVkxfRF9PTkVfU0xPVCAgICAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SWF9BVE5fTFZMX1NISUZUKQorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1JYX0FUTl9MVkxfUlU0X1dPUkRfRlVMTAlcCisJCShURUdSQV9TUERJRl9GSUZPX0FUTl9MVkxfRF9GT1VSX1NMT1RTICAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SWF9BVE5fTFZMX1NISUZUKQorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1JYX0FUTl9MVkxfUlU4X1dPUkRfRlVMTAlcCisJCShURUdSQV9TUERJRl9GSUZPX0FUTl9MVkxfRF9FSUdIVF9TTE9UUyAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SWF9BVE5fTFZMX1NISUZUKQorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1JYX0FUTl9MVkxfUlUxMl9XT1JEX0ZVTEwJXAorCQkoVEVHUkFfU1BESUZfRklGT19BVE5fTFZMX0RfVFdFTFZFX1NMT1RTIDw8IFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfUlhfQVROX0xWTF9TSElGVCkKKworLyogTnVtYmVyIG9mIFJYIERBVEEuRklGTyBsZXZlbHMgd2l0aCB2YWxpZCBkYXRhLiAqLworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1JYX0ZVTExfQ09VTlRfU0hJRlQJCTgKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9SWF9GVUxMX0NPVU5UX01BU0sJCSgweDFmIDw8IFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfUlhfRlVMTF9DT1VOVF9TSElGVCkKKworLyogQ2xlYXIgVHJhbnNtaXR0ZXIgRGF0YSBGSUZPIChUWCBEQVRBLkZJRk8pICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfVFhfQ0xSCQkJKDEgPDwgNykKKworLyogVFUgRklGTyBhdHRlbnRpb24gbGV2ZWwgKi8KKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9UWF9BVE5fTFZMX1NISUZUCQk1CisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfVFhfQVROX0xWTF9NQVNLCQlcCisJCSgweDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9UWF9BVE5fTFZMX1NISUZUKQorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1RYX0FUTl9MVkxfVFUxX1dPUkRfRlVMTAlcCisJCShURUdSQV9TUERJRl9GSUZPX0FUTl9MVkxfRF9PTkVfU0xPVCAgICAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9UWF9BVE5fTFZMX1NISUZUKQorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1RYX0FUTl9MVkxfVFU0X1dPUkRfRlVMTAlcCisJCShURUdSQV9TUERJRl9GSUZPX0FUTl9MVkxfRF9GT1VSX1NMT1RTICAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9UWF9BVE5fTFZMX1NISUZUKQorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1RYX0FUTl9MVkxfVFU4X1dPUkRfRlVMTAlcCisJCShURUdSQV9TUERJRl9GSUZPX0FUTl9MVkxfRF9FSUdIVF9TTE9UUyAgPDwgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9UWF9BVE5fTFZMX1NISUZUKQorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0ZJRk9fQ1NSX1RYX0FUTl9MVkxfVFUxMl9XT1JEX0ZVTEwJXAorCQkoVEVHUkFfU1BESUZfRklGT19BVE5fTFZMX0RfVFdFTFZFX1NMT1RTIDw8IFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfVFhfQVROX0xWTF9TSElGVCkKKworLyogTnVtYmVyIG9mIFRYIERBVEEuRklGTyBsZXZlbHMgdGhhdCBjb3VsZCBiZSBmaWxsZWQuICovCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfRklGT19DU1JfVFhfRU1QVFlfQ09VTlRfU0hJRlQJCTAKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9GSUZPX0NTUl9UWF9FTVBUWV9DT1VOVF9NQVNLCQkoMHgxZiA8PCBTUERJRl9EQVRBX0ZJRk9fQ1NSX1RYX0VNUFRZX0NPVU5UX1NISUZUKQorCisvKiBGaWVsZHMgaW4gVEVHUkFfU1BESUZfREFUQV9PVVQgKi8KKworLyoKKyAqIFRoaXMgcmVnaXN0ZXIgaGFzIDUgZGlmZmVyZW50IGZvcm1hdHM6CisgKiAxNi1iaXQgICAgICAgIChCSVRfTU9ERT0wMCwgUEFDSz0wKQorICogMjAtYml0ICAgICAgICAoQklUX01PREU9MDEsIFBBQ0s9MCkKKyAqIDI0LWJpdCAgICAgICAgKEJJVF9NT0RFPTEwLCBQQUNLPTApCisgKiByYXcgICAgICAgICAgIChCSVRfTU9ERT0xMSwgUEFDSz0wKQorICogMTYtYml0IHBhY2tlZCAoQklUX01PREU9MDAsIFBBQ0s9MSkKKyAqLworCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfMTZfU0hJRlQJCQkwCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfMTZfTUFTSwkJCSgweGZmZmYgPDwgVEVHUkFfU1BESUZfREFUQV9PVVRfREFUQV8xNl9TSElGVCkKKworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX09VVF9EQVRBXzIwX1NISUZUCQkJMAorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX09VVF9EQVRBXzIwX01BU0sJCQkoMHhmZmZmZiA8PCBURUdSQV9TUERJRl9EQVRBX09VVF9EQVRBXzIwX1NISUZUKQorCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfMjRfU0hJRlQJCQkwCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfMjRfTUFTSwkJCSgweGZmZmZmZiA8PCBURUdSQV9TUERJRl9EQVRBX09VVF9EQVRBXzI0X1NISUZUKQorCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfUkFXX1AJCQkJKDEgPDwgMzEpCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfUkFXX0MJCQkJKDEgPDwgMzApCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfUkFXX1UJCQkJKDEgPDwgMjkpCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfUkFXX1YJCQkJKDEgPDwgMjgpCisKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9PVVRfREFUQV9SQVdfREFUQV9TSElGVAkJOAorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX09VVF9EQVRBX1JBV19EQVRBX01BU0sJCQkoMHhmZmZmZiA8PCBURUdSQV9TUERJRl9EQVRBX09VVF9EQVRBX1JBV19EQVRBX1NISUZUKQorCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfUkFXX0FVWF9TSElGVAkJCTQKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9PVVRfREFUQV9SQVdfQVVYX01BU0sJCQkoMHhmIDw8IFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfUkFXX0FVWF9TSElGVCkKKworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX09VVF9EQVRBX1JBV19QUkVBTUJMRV9TSElGVAkJMAorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX09VVF9EQVRBX1JBV19QUkVBTUJMRV9NQVNLCQkoMHhmIDw8IFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfUkFXX1BSRUFNQkxFX1NISUZUKQorCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfMTZfUEFDS0VEX1JJR0hUX1NISUZUCQkxNgorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX09VVF9EQVRBXzE2X1BBQ0tFRF9SSUdIVF9NQVNLCQkoMHhmZmZmIDw8IFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfMTZfUEFDS0VEX1JJR0hUX1NISUZUKQorCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfMTZfUEFDS0VEX0xFRlRfU0hJRlQJCTAKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9PVVRfREFUQV8xNl9QQUNLRURfTEVGVF9NQVNLCQkoMHhmZmZmIDw8IFRFR1JBX1NQRElGX0RBVEFfT1VUX0RBVEFfMTZfUEFDS0VEX0xFRlRfU0hJRlQpCisKKy8qIEZpZWxkcyBpbiBURUdSQV9TUERJRl9EQVRBX0lOICovCisKKy8qCisgKiBUaGlzIHJlZ2lzdGVyIGhhcyA1IGRpZmZlcmVudCBmb3JtYXRzOgorICogMTYtYml0ICAgICAgICAoQklUX01PREU9MDAsIFBBQ0s9MCkKKyAqIDIwLWJpdCAgICAgICAgKEJJVF9NT0RFPTAxLCBQQUNLPTApCisgKiAyNC1iaXQgICAgICAgIChCSVRfTU9ERT0xMCwgUEFDSz0wKQorICogcmF3ICAgICAgICAgICAoQklUX01PREU9MTEsIFBBQ0s9MCkKKyAqIDE2LWJpdCBwYWNrZWQgKEJJVF9NT0RFPTAwLCBQQUNLPTEpCisgKgorICogQml0cyAzMToyNCBhcmUgY29tbW9uIHRvIGFsbCBtb2RlcyBleGNlcHQgMTYtYml0IHBhY2tlZAorICovCisKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9JTl9EQVRBX1AJCQkJKDEgPDwgMzEpCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV9DCQkJCSgxIDw8IDMwKQorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfVQkJCQkoMSA8PCAyOSkKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9JTl9EQVRBX1YJCQkJKDEgPDwgMjgpCisKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9JTl9EQVRBX1BSRUFNQkxFX1NISUZUCQkJMjQKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9JTl9EQVRBX1BSRUFNQkxFX01BU0sJCQkoMHhmIDw8IFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV9QUkVBTUJMRV9TSElGVCkKKworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfMTZfU0hJRlQJCQkwCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV8xNl9NQVNLCQkJKDB4ZmZmZiA8PCBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfMTZfU0hJRlQpCisKKyNkZWZpbmUgVEVHUkFfU1BESUZfREFUQV9JTl9EQVRBXzIwX1NISUZUCQkJMAorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfMjBfTUFTSwkJCSgweGZmZmZmIDw8IFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV8yMF9TSElGVCkKKworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfMjRfU0hJRlQJCQkwCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV8yNF9NQVNLCQkJKDB4ZmZmZmZmIDw8IFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV8yNF9TSElGVCkKKworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfUkFXX0RBVEFfU0hJRlQJCQk4CisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV9SQVdfREFUQV9NQVNLCQkJKDB4ZmZmZmYgPDwgVEVHUkFfU1BESUZfREFUQV9JTl9EQVRBX1JBV19EQVRBX1NISUZUKQorCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV9SQVdfQVVYX1NISUZUCQkJNAorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfUkFXX0FVWF9NQVNLCQkJKDB4ZiA8PCBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfUkFXX0FVWF9TSElGVCkKKworI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfUkFXX1BSRUFNQkxFX1NISUZUCQkwCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV9SQVdfUFJFQU1CTEVfTUFTSwkJKDB4ZiA8PCBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfUkFXX1BSRUFNQkxFX1NISUZUKQorCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV8xNl9QQUNLRURfUklHSFRfU0hJRlQJCTE2CisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV8xNl9QQUNLRURfUklHSFRfTUFTSwkJKDB4ZmZmZiA8PCBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfMTZfUEFDS0VEX1JJR0hUX1NISUZUKQorCisjZGVmaW5lIFRFR1JBX1NQRElGX0RBVEFfSU5fREFUQV8xNl9QQUNLRURfTEVGVF9TSElGVAkJMAorI2RlZmluZSBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfMTZfUEFDS0VEX0xFRlRfTUFTSwkJKDB4ZmZmZiA8PCBURUdSQV9TUERJRl9EQVRBX0lOX0RBVEFfMTZfUEFDS0VEX0xFRlRfU0hJRlQpCisKKy8qIEZpZWxkcyBpbiBURUdSQV9TUERJRl9DSF9TVEFfUlhfQSAqLworLyogRmllbGRzIGluIFRFR1JBX1NQRElGX0NIX1NUQV9SWF9CICovCisvKiBGaWVsZHMgaW4gVEVHUkFfU1BESUZfQ0hfU1RBX1JYX0MgKi8KKy8qIEZpZWxkcyBpbiBURUdSQV9TUERJRl9DSF9TVEFfUlhfRCAqLworLyogRmllbGRzIGluIFRFR1JBX1NQRElGX0NIX1NUQV9SWF9FICovCisvKiBGaWVsZHMgaW4gVEVHUkFfU1BESUZfQ0hfU1RBX1JYX0YgKi8KKworLyoKKyAqIFRoZSA2LXdvcmQgcmVjZWl2ZSBjaGFubmVsIGRhdGEgcGFnZSBidWZmZXIgaG9sZHMgYSBibG9jayAoMTkyIGZyYW1lcykgb2YKKyAqIGNoYW5uZWwgc3RhdHVzIGluZm9ybWF0aW9uLiBUaGUgb3JkZXIgb2YgcmVjZWl2ZSBpcyBmcm9tIExTQiB0byBNU0IKKyAqIGJpdCwgYW5kIGZyb20gQ0hfU1RBX1JYX0EgdG8gQ0hfU1RBX1JYX0YgdGhlbiBiYWNrIHRvIENIX1NUQV9SWF9BLgorICovCisKKy8qIEZpZWxkcyBpbiBURUdSQV9TUERJRl9DSF9TVEFfVFhfQSAqLworLyogRmllbGRzIGluIFRFR1JBX1NQRElGX0NIX1NUQV9UWF9CICovCisvKiBGaWVsZHMgaW4gVEVHUkFfU1BESUZfQ0hfU1RBX1RYX0MgKi8KKy8qIEZpZWxkcyBpbiBURUdSQV9TUERJRl9DSF9TVEFfVFhfRCAqLworLyogRmllbGRzIGluIFRFR1JBX1NQRElGX0NIX1NUQV9UWF9FICovCisvKiBGaWVsZHMgaW4gVEVHUkFfU1BESUZfQ0hfU1RBX1RYX0YgKi8KKworLyoKKyAqIFRoZSA2LXdvcmQgdHJhbnNtaXQgY2hhbm5lbCBkYXRhIHBhZ2UgYnVmZmVyIGhvbGRzIGEgYmxvY2sgKDE5MiBmcmFtZXMpIG9mCisgKiBjaGFubmVsIHN0YXR1cyBpbmZvcm1hdGlvbi4gVGhlIG9yZGVyIG9mIHRyYW5zbWlzc2lvbiBpcyBmcm9tIExTQiB0byBNU0IKKyAqIGJpdCwgYW5kIGZyb20gQ0hfU1RBX1RYX0EgdG8gQ0hfU1RBX1RYX0YgdGhlbiBiYWNrIHRvIENIX1NUQV9UWF9BLgorICovCisKKy8qIEZpZWxkcyBpbiBURUdSQV9TUERJRl9VU1JfU1RBX1JYX0EgKi8KKworLyoKKyAqIFRoaXMgNC13b3JkIGRlZXAgRklGTyByZWNlaXZlcyB1c2VyIEZJRk8gZmllbGQgaW5mb3JtYXRpb24uIFRoZSBvcmRlciBvZgorICogcmVjZWl2ZSBpcyBmcm9tIExTQiB0byBNU0IgYml0LgorICovCisKKy8qIEZpZWxkcyBpbiBURUdSQV9TUERJRl9VU1JfREFUX1RYX0EgKi8KKworLyoKKyAqIFRoaXMgNC13b3JkIGRlZXAgRklGTyB0cmFuc21pdHMgdXNlciBGSUZPIGZpZWxkIGluZm9ybWF0aW9uLiBUaGUgb3JkZXIgb2YKKyAqIHRyYW5zbWlzc2lvbiBpcyBmcm9tIExTQiB0byBNU0IgYml0LgorICovCisKK3N0cnVjdCB0ZWdyYV9zcGRpZiB7CisJc3RydWN0IGNsayAqY2xrX3NwZGlmX291dDsKKwlpbnQgY2xrX3JlZnM7CisJc3RydWN0IHRlZ3JhX3BjbV9kbWFfcGFyYW1zIGNhcHR1cmVfZG1hX2RhdGE7CisJc3RydWN0IHRlZ3JhX3BjbV9kbWFfcGFyYW1zIHBsYXliYWNrX2RtYV9kYXRhOworCXZvaWQgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1ZzsKKwl1MzIgcmVnX2N0cmw7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV93bTg5MDMuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV93bTg5MDMuYwppbmRleCAwZDY3MzhhLi5hNDJlOWFjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfd204OTAzLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtODkwMy5jCkBAIC0yNjcsNyArMjY3LDcgQEAKIAkJfQogCQltYWNoaW5lLT5ncGlvX3JlcXVlc3RlZCB8PSBHUElPX0hQX01VVEU7CiAKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5ncGlvX2hwX211dGUsIDApOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPmdwaW9faHBfbXV0ZSwgMSk7CiAJfQogCiAJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmdwaW9faW50X21pY19lbikpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90eHg5L3R4eDlhY2xjLmMgYi9zb3VuZC9zb2MvdHh4OS90eHg5YWNsYy5jCmluZGV4IGY0YWE0ZTAuLjM0YWE5NzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90eHg5L3R4eDlhY2xjLmMKKysrIGIvc291bmQvc29jL3R4eDkvdHh4OWFjbGMuYwpAQCAtMjg4LDkgKzI4OCwxMCBAQAogCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOwogfQogCi1zdGF0aWMgaW50IHR4eDlhY2xjX3BjbV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCSAgICBzdHJ1Y3Qgc25kX3BjbSAqcGNtKQorc3RhdGljIGludCB0eHg5YWNsY19wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGFpLT5wbGF0Zm9ybS0+ZGV2KTsKIAlzdHJ1Y3QgdHh4OWFjbGNfc29jX2RldmljZSAqZGV2OwogCXN0cnVjdCByZXNvdXJjZSAqcjsKZGlmZiAtLWdpdCBhL3NvdW5kL3NwaS9hdDczYzIxMy5jIGIvc291bmQvc3BpL2F0NzNjMjEzLmMKaW5kZXggMzM3YTAwMi4uNGRkMDUxYiAxMDA2NDQKLS0tIGEvc291bmQvc3BpL2F0NzNjMjEzLmMKKysrIGIvc291bmQvc3BpL2F0NzNjMjEzLmMKQEAgLTExMjQsNiArMTEyNCw2IEBACiB9CiBtb2R1bGVfZXhpdChhdDczYzIxM19leGl0KTsKIAotTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8aGNlZ3R2ZWR0QGF0bWVsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGVndHZlZHRAc2FtZnVuZGV0Lm5vPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTb3VuZCBkcml2ZXIgZm9yIEFUNzNDMjEzIHdpdGggQXRtZWwgU1NDIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvNmZpcmUvZmlybXdhcmUuYyBiL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jCmluZGV4IGE5MTcxOWQuLjFlM2FlMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jCisrKyBiL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jCkBAIC0yNzAsNyArMjcwLDYgQEAKIAlkYXRhID0gMHgwMDsgLyogcmVzdW1lIGV6dXNiIGNwdSAqLwogCXJldCA9IHVzYjZmaXJlX2Z3X2V6dXNiX3dyaXRlKGRldmljZSwgMHhhMCwgMHhlNjAwLCAmZGF0YSwgMSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgUFJFRklYICJ1bmFibGUgdG8gdXBsb2FkIGV6dXNiICIKIAkJCQkiZmlybXdhcmUgJXM6IGVuZCBtZXNzYWdlLlxuIiwgZnduYW1lKTsKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi82ZmlyZS9wY20uYyBiL3NvdW5kL3VzYi82ZmlyZS9wY20uYwppbmRleCBiMTM3YjI1Li5kMTQ0Y2RiIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvNmZpcmUvcGNtLmMKKysrIGIvc291bmQvdXNiLzZmaXJlL3BjbS5jCkBAIC0zOTUsMTIgKzM5NSwxMiBAQAogCWFsc2FfcnQtPmh3ID0gcGNtX2h3OwogCiAJaWYgKGFsc2Ffc3ViLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlpZiAocnQtPnJhdGUgPj0gMCkKKwkJaWYgKHJ0LT5yYXRlIDwgQVJSQVlfU0laRShyYXRlcykpCiAJCQlhbHNhX3J0LT5ody5yYXRlcyA9IHJhdGVzX2Fsc2FpZFtydC0+cmF0ZV07CiAJCWFsc2FfcnQtPmh3LmNoYW5uZWxzX21heCA9IE9VVF9OX0NIQU5ORUxTOwogCQlzdWIgPSAmcnQtPnBsYXliYWNrOwogCX0gZWxzZSBpZiAoYWxzYV9zdWItPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKLQkJaWYgKHJ0LT5yYXRlID49IDApCisJCWlmIChydC0+cmF0ZSA8IEFSUkFZX1NJWkUocmF0ZXMpKQogCQkJYWxzYV9ydC0+aHcucmF0ZXMgPSByYXRlc19hbHNhaWRbcnQtPnJhdGVdOwogCQlhbHNhX3J0LT5ody5jaGFubmVsc19tYXggPSBJTl9OX0NIQU5ORUxTOwogCQlzdWIgPSAmcnQtPmNhcHR1cmU7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FyZC5jIGIvc291bmQvdXNiL2NhcmQuYwppbmRleCAyMjBjNjE2Li43ODFkOWU2IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2FyZC5jCisrKyBiL3NvdW5kL3VzYi9jYXJkLmMKQEAgLTQzMyw5ICs0MzMsMTAgQEAKICAqIG9ubHkgYXQgdGhlIGZpcnN0IHRpbWUuICB0aGUgc3VjY2Vzc2l2ZSBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uIHdpbGwKICAqIGFwcGVuZCB0aGUgcGNtIGludGVyZmFjZSB0byB0aGUgY29ycmVzcG9uZGluZyBjYXJkLgogICovCi1zdGF0aWMgdm9pZCAqc25kX3VzYl9hdWRpb19wcm9iZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKLQkJCQkgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKnVzYl9pZCkKK3N0YXRpYyBzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqCitzbmRfdXNiX2F1ZGlvX3Byb2JlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisJCSAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICp1c2JfaWQpCiB7CiAJY29uc3Qgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmsgKnF1aXJrID0gKGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrICopdXNiX2lkLT5kcml2ZXJfaW5mbzsKIAlpbnQgaSwgZXJyOwpAQCAtNTQwLDE2ICs1NDEsMTUgQEAKICAqIHdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIGNvdW50ZXIsIHNpbmNlIGRpc2Nvbm5lY3Rpb24gY2FuIGJlIGNhbGxlZCBhbHNvCiAgKiBtYW55IHRpbWVzIGFzIHdlbGwgYXMgdXNiX2F1ZGlvX3Byb2JlKCkuCiAgKi8KLXN0YXRpYyB2b2lkIHNuZF91c2JfYXVkaW9fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB2b2lkICpwdHIpCitzdGF0aWMgdm9pZCBzbmRfdXNiX2F1ZGlvX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwKQogewotCXN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCi0JaWYgKHB0ciA9PSAodm9pZCAqKS0xTCkKKwlpZiAoY2hpcCA9PSAodm9pZCAqKS0xTCkKIAkJcmV0dXJuOwogCi0JY2hpcCA9IHB0cjsKIAljYXJkID0gY2hpcC0+Y2FyZDsKIAltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJbXV0ZXhfbG9jaygmY2hpcC0+c2h1dGRvd25fbXV0ZXgpOwpAQCAtNTg1LDcgKzU4NSw3IEBACiBzdGF0aWMgaW50IHVzYl9hdWRpb19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJCSAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQl2b2lkICpjaGlwOworCXN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwOwogCWNoaXAgPSBzbmRfdXNiX2F1ZGlvX3Byb2JlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIGludGYsIGlkKTsKIAlpZiAoY2hpcCkgewogCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGNoaXApOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2VuZHBvaW50LmMgYi9zb3VuZC91c2IvZW5kcG9pbnQuYwppbmRleCBiMGVmOWY1Li43YzBkMjFlIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvZW5kcG9pbnQuYworKysgYi9zb3VuZC91c2IvZW5kcG9pbnQuYwpAQCAtNDA4LDYgKzQwOCw4IEBACiAJCQkvKiBkb2Vzbid0IHNldCB0aGUgc2FtcGxlIHJhdGUgYXR0cmlidXRlLCBidXQgc3VwcG9ydHMgaXQgKi8KIAkJCWZwLT5hdHRyaWJ1dGVzIHw9IFVBQ19FUF9DU19BVFRSX1NBTVBMRV9SQVRFOwogCQkJYnJlYWs7CisJCWNhc2UgVVNCX0lEKDB4MDc2MywgMHgyMDAxKTogIC8qIE0tQXVkaW8gUXVhdHRybyBVU0IgKi8KKwkJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwMTIpOiAgLyogTS1BdWRpbyBGYXN0IFRyYWNrIFBybyBVU0IgKi8KIAkJY2FzZSBVU0JfSUQoMHgwNDdmLCAweDBjYTEpOiAvKiBwbGFudHJvbmljcyBoZWFkc2V0ICovCiAJCWNhc2UgVVNCX0lEKDB4MDc3ZCwgMHgwN2FmKTogLyogR3JpZmZpbiBpTWljIChub3RlIHRoYXQgdGhlcmUgaXMKIAkJCQkJCWFuIG9sZGVyIG1vZGVsIDc3ZDoyMjMpICovCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWlzYy91YTEwMS5jIGIvc291bmQvdXNiL21pc2MvdWExMDEuYwppbmRleCBmYjVkNjhmLi42N2JlYzc2IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWlzYy91YTEwMS5jCisrKyBiL3NvdW5kL3VzYi9taXNjL3VhMTAxLmMKQEAgLTY0NSw3ICs2NDUsNyBAQAogCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgoc3Vic3RyZWFtLT5ydW50aW1lLAogCQkJCQkgICBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1RJTUUsCiAJCQkJCSAgIDE1MDAwMDAgLyB1YS0+cGFja2V0c19wZXJfc2Vjb25kLAotCQkJCQkgICA4MTkyMDAwKTsKKwkJCQkJICAgVUlOVF9NQVgpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9tc2JpdHMoc3Vic3RyZWFtLT5ydW50aW1lLCAwLCAzMiwgMjQpOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3F1aXJrcy10YWJsZS5oIGIvc291bmQvdXNiL3F1aXJrcy10YWJsZS5oCmluZGV4IDBiMmFlOGUuLmRiYTBiN2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9xdWlya3MtdGFibGUuaAorKysgYi9zb3VuZC91c2IvcXVpcmtzLXRhYmxlLmgKQEAgLTE2NzcsNiArMTY3NywzNiBAQAogCQl9CiAJfQogfSwKK3sKKwlVU0JfREVWSUNFKDB4MDU4MiwgMHgwMTFlKSwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJiAoY29uc3Qgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmspIHsKKwkJLyogLnZlbmRvcl9uYW1lID0gIkJPU1MiLCAqLworCQkvKiAucHJvZHVjdF9uYW1lID0gIkJSLTgwMCIsICovCisJCS5pZm51bSA9IFFVSVJLX0FOWV9JTlRFUkZBQ0UsCisJCS50eXBlID0gUVVJUktfQ09NUE9TSVRFLAorCQkuZGF0YSA9IChjb25zdCBzdHJ1Y3Qgc25kX3VzYl9hdWRpb19xdWlya1tdKSB7CisJCQl7CisJCQkJLmlmbnVtID0gMCwKKwkJCQkudHlwZSA9IFFVSVJLX0FVRElPX1NUQU5EQVJEX0lOVEVSRkFDRQorCQkJfSwKKwkJCXsKKwkJCQkuaWZudW0gPSAxLAorCQkJCS50eXBlID0gUVVJUktfQVVESU9fU1RBTkRBUkRfSU5URVJGQUNFCisJCQl9LAorCQkJeworCQkJCS5pZm51bSA9IDIsCisJCQkJLnR5cGUgPSBRVUlSS19NSURJX0ZJWEVEX0VORFBPSU5ULAorCQkJCS5kYXRhID0gJiAoY29uc3Qgc3RydWN0IHNuZF91c2JfbWlkaV9lbmRwb2ludF9pbmZvKSB7CisJCQkJCS5vdXRfY2FibGVzID0gMHgwMDAxLAorCQkJCQkuaW5fY2FibGVzICA9IDB4MDAwMQorCQkJCX0KKwkJCX0sCisJCQl7CisJCQkJLmlmbnVtID0gLTEKKwkJCX0KKwkJfQorCX0KK30sCiAKIC8qIEd1aWxsZW1vdCBkZXZpY2VzICovCiB7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvcXVpcmtzLmMgYi9zb3VuZC91c2IvcXVpcmtzLmMKaW5kZXggMDkwZTE5My4uNzc3NjJjOSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3F1aXJrcy5jCisrKyBiL3NvdW5kL3VzYi9xdWlya3MuYwpAQCAtMzY5LDYgKzM2OSwzMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNuZF91c2JfZmFzdHRyYWNrcHJvX2Jvb3RfcXVpcmsoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCisJaWYgKGRldi0+YWN0Y29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUgPT0gMSkgeworCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAidXNiLWF1ZGlvOiAiCisJCQkgICAiRmFzdCBUcmFjayBQcm8gc3dpdGNoaW5nIHRvIGNvbmZpZyAjMlxuIik7CisJCS8qIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIGF2YWlsYWJsZSBieSB0aGUgdXNiIGNvcmUgbW9kdWxlLgorCQkgKiBpZiBpdCBpcyBub3QgYXZpYWxhYmxlIHRoZSBib290IHF1aXJrIGhhcyB0byBiZSBsZWZ0IG91dAorCQkgKiBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIHNldCBieSB1ZGV2IG9yIGhvdHBsdWcKKwkJICogcnVsZXMKKwkJICovCisJCWVyciA9IHVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb24oZGV2LCAyKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXNuZF9wcmludGRkKCJlcnJvciB1c2JfZHJpdmVyX3NldF9jb25maWd1cmF0aW9uOiAlZFxuIiwKKwkJCQkgICAgZXJyKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfSBlbHNlCisJCXNuZF9wcmludGsoS0VSTl9JTkZPICJ1c2ItYXVkaW86IEZhc3QgVHJhY2sgUHJvIGNvbmZpZyBPS1xuIik7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIEMtTWVkaWEgQ00xMDYvQ00xMDYrIGhhdmUgZm91ciAxNi1iaXQgaW50ZXJuYWwgcmVnaXN0ZXJzIHRoYXQgYXJlIG5pY2VseQogICogZG9jdW1lbnRlZCBpbiB0aGUgZGV2aWNlJ3MgZGF0YSBzaGVldC4KQEAgLTQ3MSwxNiArNDk1LDQ5IEBACiAvKgogICogU2V0dXAgcXVpcmtzCiAgKi8KLSNkZWZpbmUgQVVESU9QSElMRV9TRVQJCQkweDAxIC8qIGlmIHNldCwgcGFyc2UgZGV2aWNlX3NldHVwICovCi0jZGVmaW5lIEFVRElPUEhJTEVfU0VUX0RUUyAgICAgICAgICAgICAgMHgwMiAvKiBpZiBzZXQsIGVuYWJsZSBEVFMgRGlnaXRhbCBPdXRwdXQgKi8KLSNkZWZpbmUgQVVESU9QSElMRV9TRVRfOTZLICAgICAgICAgICAgICAweDA0IC8qIDQ4LTk2S0h6IHJhdGUgaWYgc2V0LCA4LTQ4S0h6IG90aGVyd2lzZSAqLwotI2RlZmluZSBBVURJT1BISUxFX1NFVF8yNEIJCTB4MDggLyogMjRiaXRzIHNhbXBsZSBpZiBzZXQsIDE2Yml0cyBvdGhlcndpc2UgKi8KLSNkZWZpbmUgQVVESU9QSElMRV9TRVRfREkJCTB4MTAgLyogaWYgc2V0LCBlbmFibGUgRGlnaXRhbCBJbnB1dCAqLwotI2RlZmluZSBBVURJT1BISUxFX1NFVF9NQVNLCQkweDFGIC8qIGJpdCBtYXNrIGZvciBzZXR1cCB2YWx1ZSAqLwotI2RlZmluZSBBVURJT1BISUxFX1NFVF8yNEJfNDhLX0RJCTB4MTkgLyogdmFsdWUgZm9yIDI0Yml0cys0OEtIeitEaWdpdGFsIElucHV0ICovCi0jZGVmaW5lIEFVRElPUEhJTEVfU0VUXzI0Ql80OEtfTk9UREkJMHgwOSAvKiB2YWx1ZSBmb3IgMjRiaXRzKzQ4S0h6K05vIERpZ2l0YWwgSW5wdXQgKi8KLSNkZWZpbmUgQVVESU9QSElMRV9TRVRfMTZCXzQ4S19ESQkweDExIC8qIHZhbHVlIGZvciAxNmJpdHMrNDhLSHorRGlnaXRhbCBJbnB1dCAqLwotI2RlZmluZSBBVURJT1BISUxFX1NFVF8xNkJfNDhLX05PVERJCTB4MDEgLyogdmFsdWUgZm9yIDE2Yml0cys0OEtIeitObyBEaWdpdGFsIElucHV0ICovCisjZGVmaW5lIE1BVURJT19TRVQJCTB4MDEgLyogcGFyc2UgZGV2aWNlX3NldHVwICovCisjZGVmaW5lIE1BVURJT19TRVRfQ09NUEFUSUJMRQkweDgwIC8qIHVzZSBvbmx5ICJ3aW4tY29tcGF0aWJsZSIgaW50ZXJmYWNlcyAqLworI2RlZmluZSBNQVVESU9fU0VUX0RUUwkJMHgwMiAvKiBlbmFibGUgRFRTIERpZ2l0YWwgT3V0cHV0ICovCisjZGVmaW5lIE1BVURJT19TRVRfOTZLCQkweDA0IC8qIDQ4LTk2S0h6IHJhdGUgaWYgc2V0LCA4LTQ4S0h6IG90aGVyd2lzZSAqLworI2RlZmluZSBNQVVESU9fU0VUXzI0QgkJMHgwOCAvKiAyNGJpdHMgc2FtcGxlIGlmIHNldCwgMTZiaXRzIG90aGVyd2lzZSAqLworI2RlZmluZSBNQVVESU9fU0VUX0RJCQkweDEwIC8qIGVuYWJsZSBEaWdpdGFsIElucHV0ICovCisjZGVmaW5lIE1BVURJT19TRVRfTUFTSwkJMHgxZiAvKiBiaXQgbWFzayBmb3Igc2V0dXAgdmFsdWUgKi8KKyNkZWZpbmUgTUFVRElPX1NFVF8yNEJfNDhLX0RJCSAweDE5IC8qIDI0Yml0cys0OEtIeitEaWdpdGFsIElucHV0ICovCisjZGVmaW5lIE1BVURJT19TRVRfMjRCXzQ4S19OT1RESSAweDA5IC8qIDI0Yml0cys0OEtIeitObyBEaWdpdGFsIElucHV0ICovCisjZGVmaW5lIE1BVURJT19TRVRfMTZCXzQ4S19ESQkgMHgxMSAvKiAxNmJpdHMrNDhLSHorRGlnaXRhbCBJbnB1dCAqLworI2RlZmluZSBNQVVESU9fU0VUXzE2Ql80OEtfTk9UREkgMHgwMSAvKiAxNmJpdHMrNDhLSHorTm8gRGlnaXRhbCBJbnB1dCAqLworCitzdGF0aWMgaW50IHF1YXR0cm9fc2tpcF9zZXR0aW5nX3F1aXJrKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAorCQkJCSAgICAgIGludCBpZmFjZSwgaW50IGFsdG5vKQoreworCS8qIFJlc2V0IEFMTCBpZmFjZXMgdG8gMCBhbHRzZXR0aW5nLgorCSAqIENhbGwgaXQgZm9yIGV2ZXJ5IHBvc3NpYmxlIGFsdHNldHRpbmcgb2YgZXZlcnkgaW50ZXJmYWNlLgorCSAqLworCXVzYl9zZXRfaW50ZXJmYWNlKGNoaXAtPmRldiwgaWZhY2UsIDApOworCWlmIChjaGlwLT5zZXR1cCAmIE1BVURJT19TRVQpIHsKKwkJaWYgKGNoaXAtPnNldHVwICYgTUFVRElPX1NFVF9DT01QQVRJQkxFKSB7CisJCQlpZiAoaWZhY2UgIT0gMSAmJiBpZmFjZSAhPSAyKQorCQkJCXJldHVybiAxOyAvKiBza2lwIGFsbCBpbnRlcmZhY2VzIGJ1dCAxIGFuZCAyICovCisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBpbnQgbWFzazsKKwkJCWlmIChpZmFjZSA9PSAxIHx8IGlmYWNlID09IDIpCisJCQkJcmV0dXJuIDE7IC8qIHNraXAgaW50ZXJmYWNlcyAxIGFuZCAyICovCisJCQlpZiAoKGNoaXAtPnNldHVwICYgTUFVRElPX1NFVF85NkspICYmIGFsdG5vICE9IDEpCisJCQkJcmV0dXJuIDE7IC8qIHNraXAgdGhpcyBhbHRzZXR0aW5nICovCisJCQltYXNrID0gY2hpcC0+c2V0dXAgJiBNQVVESU9fU0VUX01BU0s7CisJCQlpZiAobWFzayA9PSBNQVVESU9fU0VUXzI0Ql80OEtfREkgJiYgYWx0bm8gIT0gMikKKwkJCQlyZXR1cm4gMTsgLyogc2tpcCB0aGlzIGFsdHNldHRpbmcgKi8KKwkJCWlmIChtYXNrID09IE1BVURJT19TRVRfMjRCXzQ4S19OT1RESSAmJiBhbHRubyAhPSAzKQorCQkJCXJldHVybiAxOyAvKiBza2lwIHRoaXMgYWx0c2V0dGluZyAqLworCQkJaWYgKG1hc2sgPT0gTUFVRElPX1NFVF8xNkJfNDhLX05PVERJICYmIGFsdG5vICE9IDQpCisJCQkJcmV0dXJuIDE7IC8qIHNraXAgdGhpcyBhbHRzZXR0aW5nICovCisJCX0KKwl9CisJc25kX3ByaW50ZGQoS0VSTl9JTkZPCisJCSAgICAidXNpbmcgYWx0c2V0dGluZyAlZCBmb3IgaW50ZXJmYWNlICVkIGNvbmZpZyAlZFxuIiwKKwkJICAgIGFsdG5vLCBpZmFjZSwgY2hpcC0+c2V0dXApOworCXJldHVybiAwOyAvKiBrZWVwIHRoaXMgYWx0c2V0dGluZyAqLworfQogCiBzdGF0aWMgaW50IGF1ZGlvcGhpbGVfc2tpcF9zZXR0aW5nX3F1aXJrKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAogCQkJCQkgaW50IGlmYWNlLApAQCAtNDkxLDMwICs1NDgsNjUgQEAKIAkgKi8KIAl1c2Jfc2V0X2ludGVyZmFjZShjaGlwLT5kZXYsIGlmYWNlLCAwKTsKIAotCWlmIChjaGlwLT5zZXR1cCAmIEFVRElPUEhJTEVfU0VUKSB7Ci0JCWlmICgoY2hpcC0+c2V0dXAgJiBBVURJT1BISUxFX1NFVF9EVFMpCi0JCSAgICAmJiBhbHRubyAhPSA2KQorCWlmIChjaGlwLT5zZXR1cCAmIE1BVURJT19TRVQpIHsKKwkJdW5zaWduZWQgaW50IG1hc2s7CisJCWlmICgoY2hpcC0+c2V0dXAgJiBNQVVESU9fU0VUX0RUUykgJiYgYWx0bm8gIT0gNikKIAkJCXJldHVybiAxOyAvKiBza2lwIHRoaXMgYWx0c2V0dGluZyAqLwotCQlpZiAoKGNoaXAtPnNldHVwICYgQVVESU9QSElMRV9TRVRfOTZLKQotCQkgICAgJiYgYWx0bm8gIT0gMSkKKwkJaWYgKChjaGlwLT5zZXR1cCAmIE1BVURJT19TRVRfOTZLKSAmJiBhbHRubyAhPSAxKQogCQkJcmV0dXJuIDE7IC8qIHNraXAgdGhpcyBhbHRzZXR0aW5nICovCi0JCWlmICgoY2hpcC0+c2V0dXAgJiBBVURJT1BISUxFX1NFVF9NQVNLKSA9PQotCQkgICAgQVVESU9QSElMRV9TRVRfMjRCXzQ4S19ESSAmJiBhbHRubyAhPSAyKQorCQltYXNrID0gY2hpcC0+c2V0dXAgJiBNQVVESU9fU0VUX01BU0s7CisJCWlmIChtYXNrID09IE1BVURJT19TRVRfMjRCXzQ4S19ESSAmJiBhbHRubyAhPSAyKQogCQkJcmV0dXJuIDE7IC8qIHNraXAgdGhpcyBhbHRzZXR0aW5nICovCi0JCWlmICgoY2hpcC0+c2V0dXAgJiBBVURJT1BISUxFX1NFVF9NQVNLKSA9PQotCQkgICAgQVVESU9QSElMRV9TRVRfMjRCXzQ4S19OT1RESSAmJiBhbHRubyAhPSAzKQorCQlpZiAobWFzayA9PSBNQVVESU9fU0VUXzI0Ql80OEtfTk9UREkgJiYgYWx0bm8gIT0gMykKIAkJCXJldHVybiAxOyAvKiBza2lwIHRoaXMgYWx0c2V0dGluZyAqLwotCQlpZiAoKGNoaXAtPnNldHVwICYgQVVESU9QSElMRV9TRVRfTUFTSykgPT0KLQkJICAgIEFVRElPUEhJTEVfU0VUXzE2Ql80OEtfREkgJiYgYWx0bm8gIT0gNCkKKwkJaWYgKG1hc2sgPT0gTUFVRElPX1NFVF8xNkJfNDhLX0RJICYmIGFsdG5vICE9IDQpCiAJCQlyZXR1cm4gMTsgLyogc2tpcCB0aGlzIGFsdHNldHRpbmcgKi8KLQkJaWYgKChjaGlwLT5zZXR1cCAmIEFVRElPUEhJTEVfU0VUX01BU0spID09Ci0JCSAgICBBVURJT1BISUxFX1NFVF8xNkJfNDhLX05PVERJICYmIGFsdG5vICE9IDUpCisJCWlmIChtYXNrID09IE1BVURJT19TRVRfMTZCXzQ4S19OT1RESSAmJiBhbHRubyAhPSA1KQogCQkJcmV0dXJuIDE7IC8qIHNraXAgdGhpcyBhbHRzZXR0aW5nICovCiAJfQogCiAJcmV0dXJuIDA7IC8qIGtlZXAgdGhpcyBhbHRzZXR0aW5nICovCiB9CiAKKworc3RhdGljIGludCBmYXN0dHJhY2twcm9fc2tpcF9zZXR0aW5nX3F1aXJrKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAorCQkJCQkgICBpbnQgaWZhY2UsIGludCBhbHRubykKK3sKKwkvKiBSZXNldCBBTEwgaWZhY2VzIHRvIDAgYWx0c2V0dGluZy4KKwkgKiBDYWxsIGl0IGZvciBldmVyeSBwb3NzaWJsZSBhbHRzZXR0aW5nIG9mIGV2ZXJ5IGludGVyZmFjZS4KKwkgKi8KKwl1c2Jfc2V0X2ludGVyZmFjZShjaGlwLT5kZXYsIGlmYWNlLCAwKTsKKworCS8qIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gd2hlcmUgYm90aCBpbnB1dHMgYW5kIG9ubHkgb25lIG91dHB1dCBpcworCSAqdXNlZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHNldHVwCisJICovCisJaWYgKGNoaXAtPnNldHVwICYgKE1BVURJT19TRVQgfCBNQVVESU9fU0VUXzI0QikpIHsKKwkJaWYgKGNoaXAtPnNldHVwICYgTUFVRElPX1NFVF85NkspIHsKKwkJCWlmIChhbHRubyAhPSAzICYmIGFsdG5vICE9IDYpCisJCQkJcmV0dXJuIDE7CisJCX0gZWxzZSBpZiAoY2hpcC0+c2V0dXAgJiBNQVVESU9fU0VUX0RJKSB7CisJCQlpZiAoaWZhY2UgPT0gNCkKKwkJCQlyZXR1cm4gMTsgLyogbm8gYW5hbG9nIGlucHV0ICovCisJCQlpZiAoYWx0bm8gIT0gMiAmJiBhbHRubyAhPSA1KQorCQkJCXJldHVybiAxOyAvKiBlbmFibGUgb25seSBhbHRzZXRzIDIgYW5kIDUgKi8KKwkJfSBlbHNlIHsKKwkJCWlmIChpZmFjZSA9PSA1KQorCQkJCXJldHVybiAxOyAvKiBkaXNhYmxlIGRpZ2lhbHQgaW5wdXQgKi8KKwkJCWlmIChhbHRubyAhPSAyICYmIGFsdG5vICE9IDUpCisJCQkJcmV0dXJuIDE7IC8qIGVuYWxiZSBvbmx5IGFsdHNldHMgMiBhbmQgNSAqLworCQl9CisJfSBlbHNlIHsKKwkJLyoga2VlcCBvbmx5IDE2LUJpdCBtb2RlICovCisJCWlmIChhbHRubyAhPSAxKQorCQkJcmV0dXJuIDE7CisJfQorCisJc25kX3ByaW50ZGQoS0VSTl9JTkZPCisJCSAgICAidXNpbmcgYWx0c2V0dGluZyAlZCBmb3IgaW50ZXJmYWNlICVkIGNvbmZpZyAlZFxuIiwKKwkJICAgIGFsdG5vLCBpZmFjZSwgY2hpcC0+c2V0dXApOworCXJldHVybiAwOyAvKiBrZWVwIHRoaXMgYWx0c2V0dGluZyAqLworfQorCiBpbnQgc25kX3VzYl9hcHBseV9pbnRlcmZhY2VfcXVpcmsoc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsCiAJCQkJICBpbnQgaWZhY2UsCiAJCQkJICBpbnQgYWx0bm8pCkBAIC01MjIsNiArNjE0LDEyIEBACiAJLyogYXVkaW9waGlsZSB1c2I6IHNraXAgYWx0c2V0cyBpbmNvbXBhdGlibGUgd2l0aCBkZXZpY2Vfc2V0dXAgKi8KIAlpZiAoY2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDA3NjMsIDB4MjAwMykpCiAJCXJldHVybiBhdWRpb3BoaWxlX3NraXBfc2V0dGluZ19xdWlyayhjaGlwLCBpZmFjZSwgYWx0bm8pOworCS8qIHF1YXR0cm8gdXNiOiBza2lwIGFsdHNldHMgaW5jb21wYXRpYmxlIHdpdGggZGV2aWNlX3NldHVwICovCisJaWYgKGNoaXAtPnVzYl9pZCA9PSBVU0JfSUQoMHgwNzYzLCAweDIwMDEpKQorCQlyZXR1cm4gcXVhdHRyb19za2lwX3NldHRpbmdfcXVpcmsoY2hpcCwgaWZhY2UsIGFsdG5vKTsKKwkvKiBmYXN0dHJhY2twcm8gdXNiOiBza2lwIGFsdHNldHMgaW5jb21wYXRpYmxlIHdpdGggZGV2aWNlX3NldHVwICovCisJaWYgKGNoaXAtPnVzYl9pZCA9PSBVU0JfSUQoMHgwNzYzLCAweDIwMTIpKQorCQlyZXR1cm4gZmFzdHRyYWNrcHJvX3NraXBfc2V0dGluZ19xdWlyayhjaGlwLCBpZmFjZSwgYWx0bm8pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NjAsNiArNjU4LDggQEAKIAljYXNlIFVTQl9JRCgweDE3Y2MsIDB4MTAxMCk6IC8qIFRyYWt0b3IgQXVkaW8gNiAqLwogCWNhc2UgVVNCX0lEKDB4MTdjYywgMHgxMDIwKTogLyogVHJha3RvciBBdWRpbyAxMCAqLwogCQlyZXR1cm4gc25kX3VzYl9uYXRpdmVpbnN0cnVtZW50c19ib290X3F1aXJrKGRldik7CisJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwMTIpOiAgLyogTS1BdWRpbyBGYXN0IFRyYWNrIFBybyBVU0IgKi8KKwkJcmV0dXJuIHNuZF91c2JfZmFzdHRyYWNrcHJvX2Jvb3RfcXVpcmsoZGV2KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTU3MCwxNSArNjcwLDI0IEBACiAgKi8KIGludCBzbmRfdXNiX2lzX2JpZ19lbmRpYW5fZm9ybWF0KHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLCBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwKQogeworCS8qIGl0IGRlcGVuZHMgb24gYWx0c2V0dGluZyB3ZXRoZXIgdGhlIGRldmljZSBpcyBiaWctZW5kaWFuIG9yIG5vdCAqLwogCXN3aXRjaCAoY2hpcC0+dXNiX2lkKSB7CiAJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwMDEpOiAvKiBNLUF1ZGlvIFF1YXR0cm86IGNhcHR1cmVkIGRhdGEgb25seSAqLwotCQlpZiAoZnAtPmVuZHBvaW50ICYgVVNCX0RJUl9JTikKKwkJaWYgKGZwLT5hbHRzZXR0aW5nID09IDIgfHwgZnAtPmFsdHNldHRpbmcgPT0gMyB8fAorCQkJZnAtPmFsdHNldHRpbmcgPT0gNSB8fCBmcC0+YWx0c2V0dGluZyA9PSA2KQogCQkJcmV0dXJuIDE7CiAJCWJyZWFrOwogCWNhc2UgVVNCX0lEKDB4MDc2MywgMHgyMDAzKTogLyogTS1BdWRpbyBBdWRpb3BoaWxlIFVTQiAqLwogCQlpZiAoY2hpcC0+c2V0dXAgPT0gMHgwMCB8fAotCQkgICAgZnAtPmFsdHNldHRpbmc9PTEgfHwgZnAtPmFsdHNldHRpbmc9PTIgfHwgZnAtPmFsdHNldHRpbmc9PTMpCisJCQlmcC0+YWx0c2V0dGluZyA9PSAxIHx8IGZwLT5hbHRzZXR0aW5nID09IDIgfHwKKwkJCWZwLT5hbHRzZXR0aW5nID09IDMpCiAJCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwMTIpOiAvKiBNLUF1ZGlvIEZhc3QgVHJhY2sgUHJvICovCisJCWlmIChmcC0+YWx0c2V0dGluZyA9PSAyIHx8IGZwLT5hbHRzZXR0aW5nID09IDMgfHwKKwkJCWZwLT5hbHRzZXR0aW5nID09IDUgfHwgZnAtPmFsdHNldHRpbmcgPT0gNikKKwkJCXJldHVybiAxOworCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1hbm5vdGF0ZS50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1hbm5vdGF0ZS50eHQKaW5kZXggNmY1YTQ5OC4uODVjNWYwMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYW5ub3RhdGUudHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWFubm90YXRlLnR4dApAQCAtNjYsNiArNjYsMTIgQEAKIAl1c2VkLiBUaGlzIGludGVyZmFjZXMgc3RhcnRzIGJ5IGNlbnRlcmluZyBvbiB0aGUgbGluZSB3aXRoIG1vcmUKIAlzYW1wbGVzLCBUQUIvVU5UQUIgY3ljbGVzIHRocm91Z2ggdGhlIGxpbmVzIHdpdGggbW9yZSBzYW1wbGVzLgogCistYzo6CistLWNwdTo6IE9ubHkgcmVwb3J0IHNhbXBsZXMgZm9yIHRoZSBsaXN0IG9mIENQVXMgcHJvdmlkZWQuIE11bHRpcGxlIENQVXMgY2FuCisJYmUgcHJvdmlkZWQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCB3aXRoIG5vIHNwYWNlOiAwLDEuIFJhbmdlcyBvZgorCUNQVXMgYXJlIHNwZWNpZmllZCB3aXRoIC06IDAtMi4gRGVmYXVsdCBpcyB0byByZXBvcnQgc2FtcGxlcyBvbiBhbGwKKwlDUFVzLgorCiBTRUUgQUxTTwogLS0tLS0tLS0KIGxpbmtwZXJmOnBlcmYtcmVjb3JkWzFdLCBsaW5rcGVyZjpwZXJmLXJlcG9ydFsxXQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0CmluZGV4IDAyYmFmY2UuLjI3ODBkOWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1wcm9iZS50eHQKQEAgLTM0LDkgKzM0LDExIEBACiAJU3BlY2lmeSB2bWxpbnV4IHBhdGggd2hpY2ggaGFzIGRlYnVnaW5mbyAoRHdhcmYgYmluYXJ5KS4KIAogLW06OgotLS1tb2R1bGU9TU9ETkFNRTo6CistLW1vZHVsZT1NT0ROQU1FfFBBVEg6OgogCVNwZWNpZnkgbW9kdWxlIG5hbWUgaW4gd2hpY2ggcGVyZi1wcm9iZSBzZWFyY2hlcyBwcm9iZSBwb2ludHMKLQlvciBsaW5lcy4KKwlvciBsaW5lcy4gSWYgYSBwYXRoIG9mIG1vZHVsZSBmaWxlIGlzIHBhc3NlZCwgcGVyZi1wcm9iZQorCXRyZWF0IGl0IGFzIGFuIG9mZmxpbmUgbW9kdWxlICh0aGlzIG1lYW5zIHlvdSBjYW4gYWRkIGEgcHJvYmUgb24KKyAgICAgICAgYSBtb2R1bGUgd2hpY2ggaGFzIG5vdCBiZWVuIGxvYWRlZCB5ZXQpLgogCiAtczo6CiAtLXNvdXJjZT1QQVRIOjoKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlcG9ydC50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZXBvcnQudHh0CmluZGV4IDhiYTAzZDYuLjA0MjUzYzAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlcG9ydC50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVwb3J0LnR4dApAQCAtODAsMTUgKzgwLDI0IEBACiAtLWR1bXAtcmF3LXRyYWNlOjoKICAgICAgICAgRHVtcCByYXcgdHJhY2UgaW4gQVNDSUkuCiAKLS1nIFt0eXBlLG1pbl06OgorLWcgW3R5cGUsbWluLG9yZGVyXTo6CiAtLWNhbGwtZ3JhcGg6OgotICAgICAgICBEaXNwbGF5IGNhbGwgY2hhaW5zIHVzaW5nIHR5cGUgYW5kIG1pbiBwZXJjZW50IHRocmVzaG9sZC4KKyAgICAgICAgRGlzcGxheSBjYWxsIGNoYWlucyB1c2luZyB0eXBlLCBtaW4gcGVyY2VudCB0aHJlc2hvbGQgYW5kIG9yZGVyLgogCXR5cGUgY2FuIGJlIGVpdGhlcjoKIAktIGZsYXQ6IHNpbmdsZSBjb2x1bW4sIGxpbmVhciBleHBvc3VyZSBvZiBjYWxsIGNoYWlucy4KIAktIGdyYXBoOiB1c2UgYSBncmFwaCB0cmVlLCBkaXNwbGF5aW5nIGFic29sdXRlIG92ZXJoZWFkIHJhdGVzLgogCS0gZnJhY3RhbDogbGlrZSBncmFwaCwgYnV0IGRpc3BsYXlzIHJlbGF0aXZlIHJhdGVzLiBFYWNoIGJyYW5jaCBvZgogCQkgdGhlIHRyZWUgaXMgY29uc2lkZXJlZCBhcyBhIG5ldyBwcm9maWxlZCBvYmplY3QuICsKLQlEZWZhdWx0OiBmcmFjdGFsLDAuNS4KKworCW9yZGVyIGNhbiBiZSBlaXRoZXI6CisJLSBjYWxsZWU6IGNhbGxlZSBiYXNlZCBjYWxsIGdyYXBoLgorCS0gY2FsbGVyOiBpbnZlcnRlZCBjYWxsZXIgYmFzZWQgY2FsbCBncmFwaC4KKworCURlZmF1bHQ6IGZyYWN0YWwsMC41LGNhbGxlZS4KKworLUc6OgorLS1pbnZlcnRlZDo6CisgICAgICAgIGFsaWFzIGZvciBpbnZlcnRlZCBjYWxsZXIgYmFzZWQgY2FsbCBncmFwaC4KIAogLS1wcmV0dHk9PGtleT46OgogICAgICAgICBQcmV0dHkgcHJpbnRpbmcgc3R5bGUuICBrZXk6IG5vcm1hbCwgcmF3CkBAIC0xMTksNiArMTI4LDEyIEBACiAtLXN5bWZzPTxkaXJlY3Rvcnk+OjoKICAgICAgICAgTG9vayBmb3IgZmlsZXMgd2l0aCBzeW1ib2xzIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5LgogCistYzo6CistLWNwdTo6IE9ubHkgcmVwb3J0IHNhbXBsZXMgZm9yIHRoZSBsaXN0IG9mIENQVXMgcHJvdmlkZWQuIE11bHRpcGxlIENQVXMgY2FuCisJYmUgcHJvdmlkZWQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCB3aXRoIG5vIHNwYWNlOiAwLDEuIFJhbmdlcyBvZgorCUNQVXMgYXJlIHNwZWNpZmllZCB3aXRoIC06IDAtMi4gRGVmYXVsdCBpcyB0byByZXBvcnQgc2FtcGxlcyBvbiBhbGwKKwlDUFVzLgorCiBTRUUgQUxTTwogLS0tLS0tLS0KIGxpbmtwZXJmOnBlcmYtc3RhdFsxXQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc2NyaXB0LnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXNjcmlwdC50eHQKaW5kZXggODZjODdlMi4uZGIwMTc4NiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc2NyaXB0LnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zY3JpcHQudHh0CkBAIC0xMTUsMTAgKzExNSwxMCBAQAogLWY6OgogLS1maWVsZHM6OgogICAgICAgICBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWVsZHMgdG8gcHJpbnQuIE9wdGlvbnMgYXJlOgotICAgICAgICBjb21tLCB0aWQsIHBpZCwgdGltZSwgY3B1LCBldmVudCwgdHJhY2UsIHN5bS4gRmllbGQKLSAgICAgICAgbGlzdCBjYW4gYmUgcHJlcGVuZGVkIHdpdGggdGhlIHR5cGUsIHRyYWNlLCBzdyBvciBodywKKyAgICAgICAgY29tbSwgdGlkLCBwaWQsIHRpbWUsIGNwdSwgZXZlbnQsIHRyYWNlLCBpcCwgc3ltLCBkc28sIGFkZHIuCisgICAgICAgIEZpZWxkIGxpc3QgY2FuIGJlIHByZXBlbmRlZCB3aXRoIHRoZSB0eXBlLCB0cmFjZSwgc3cgb3IgaHcsCiAgICAgICAgIHRvIGluZGljYXRlIHRvIHdoaWNoIGV2ZW50IHR5cGUgdGhlIGZpZWxkIGxpc3QgYXBwbGllcy4KLSAgICAgICAgZS5nLiwgLWYgc3c6Y29tbSx0aWQsdGltZSxzeW0gIGFuZCAtZiB0cmFjZTp0aW1lLGNwdSx0cmFjZQorICAgICAgICBlLmcuLCAtZiBzdzpjb21tLHRpZCx0aW1lLGlwLHN5bSAgYW5kIC1mIHRyYWNlOnRpbWUsY3B1LHRyYWNlCiAKIAkJcGVyZiBzY3JpcHQgLWYgPGZpZWxkcz4KIApAQCAtMTMyLDE3ICsxMzIsMTcgQEAKIAlUaGUgYXJndW1lbnRzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHJlY2VpdmVkLiBBIGxhdGVyIHVzYWdlIGNhbgogCXJlc2V0IGEgcHJpb3IgcmVxdWVzdC4gZS5nLjoKICAgICAKLQkJLWYgdHJhY2U6IC1mIGNvbW0sdGlkLHRpbWUsc3ltCisJCS1mIHRyYWNlOiAtZiBjb21tLHRpZCx0aW1lLGlwLHN5bQogICAgIAogCVRoZSBmaXJzdCAtZiBzdXBwcmVzc2VzIHRyYWNlIGV2ZW50cyAoZmllbGQgbGlzdCBpcyAiIiksIGJ1dCB0aGVuIHRoZQotCXNlY29uZCBpbnZvY2F0aW9uIHNldHMgdGhlIGZpZWxkcyB0byBjb21tLHRpZCx0aW1lLHN5bS4gSW4gdGhpcyBjYXNlIGEKKwlzZWNvbmQgaW52b2NhdGlvbiBzZXRzIHRoZSBmaWVsZHMgdG8gY29tbSx0aWQsdGltZSxpcCxzeW0uIEluIHRoaXMgY2FzZSBhCiAJd2FybmluZyBpcyBnaXZlbiB0byB0aGUgdXNlcjoKICAgICAKIAkJIk92ZXJyaWRpbmcgcHJldmlvdXMgZmllbGQgcmVxdWVzdCBmb3IgYWxsIGV2ZW50cy4iCiAgICAgCiAJQWx0ZXJuYXRpdmV5LCBjb25zaWRlciB0aGUgb3JkZXI6CiAgICAgCi0JCS1mIGNvbW0sdGlkLHRpbWUsc3ltIC1mIHRyYWNlOgorCQktZiBjb21tLHRpZCx0aW1lLGlwLHN5bSAtZiB0cmFjZToKICAgICAKIAlUaGUgZmlyc3QgLWYgc2V0cyB0aGUgZmllbGRzIGZvciBhbGwgZXZlbnRzIGFuZCB0aGUgc2Vjb25kIC1mCiAJc3VwcHJlc3NlcyB0cmFjZSBldmVudHMuIFRoZSB1c2VyIGlzIGdpdmVuIGEgd2FybmluZyBtZXNzYWdlIGFib3V0CkBAIC0xODIsNiArMTgyLDEyIEBACiAtLWhpZGUtY2FsbC1ncmFwaDo6CiAgICAgICAgIFdoZW4gcHJpbnRpbmcgc3ltYm9scyBkbyBub3QgZGlzcGxheSBjYWxsIGNoYWluLgogCistYzo6CistLWNwdTo6IE9ubHkgcmVwb3J0IHNhbXBsZXMgZm9yIHRoZSBsaXN0IG9mIENQVXMgcHJvdmlkZWQuIE11bHRpcGxlIENQVXMgY2FuCisJYmUgcHJvdmlkZWQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCB3aXRoIG5vIHNwYWNlOiAwLDEuIFJhbmdlcyBvZgorCUNQVXMgYXJlIHNwZWNpZmllZCB3aXRoIC06IDAtMi4gRGVmYXVsdCBpcyB0byByZXBvcnQgc2FtcGxlcyBvbiBhbGwKKwlDUFVzLgorCiBTRUUgQUxTTwogLS0tLS0tLS0KIGxpbmtwZXJmOnBlcmYtcmVjb3JkWzFdLCBsaW5rcGVyZjpwZXJmLXNjcmlwdC1wZXJsWzFdLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUKaW5kZXggMDMyYmE2My4uNTZkNjJkMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9NYWtlZmlsZQorKysgYi90b29scy9wZXJmL01ha2VmaWxlCkBAIC01Miw3ICs1MiwxMCBAQAogZW5kaWYKIGlmZXEgKCQoQVJDSCkseDg2XzY0KQogCUFSQ0ggOj0geDg2Ci0JSVNfWDg2XzY0IDo9ICQoc2hlbGwgZWNobyBfX3g4Nl82NF9fIHwgJHtDQ30gLUUgLXhjIC0gfCB0YWlsIC1uIDEpCisJSVNfWDg2XzY0IDo9IDAKKwlpZmVxICgsICQoZmluZHN0cmluZyBtMzIsJChFWFRSQV9DRkxBR1MpKSkKKwkJSVNfWDg2XzY0IDo9ICQoc2hlbGwgZWNobyBfX3g4Nl82NF9fIHwgJHtDQ30gLUUgLXhjIC0gfCB0YWlsIC1uIDEpCisJZW5kaWYKIAlpZmVxICgke0lTX1g4Nl82NH0sIDEpCiAJCVJBV19BUkNIIDo9IHg4Nl82NAogCQlBUkNIX0NGTEFHUyA6PSAtREFSQ0hfWDg2XzY0CkBAIC0yNzksNiArMjgyLDcgQEAKIExJQl9IICs9IHV0aWwvdGhyZWFkX21hcC5oCiBMSUJfSCArPSB1dGlsL3RyYWNlLWV2ZW50LmgKIExJQl9IICs9IHV0aWwvcHJvYmUtZmluZGVyLmgKK0xJQl9IICs9IHV0aWwvZHdhcmYtYXV4LmgKIExJQl9IICs9IHV0aWwvcHJvYmUtZXZlbnQuaAogTElCX0ggKz0gdXRpbC9wc3RhY2suaAogTElCX0ggKz0gdXRpbC9jcHVtYXAuaApAQCAtNDM1LDYgKzQzOSw3IEBACiAJQkFTSUNfQ0ZMQUdTICs9IC1ERFdBUkZfU1VQUE9SVAogCUVYVExJQlMgKz0gLWxlbGYgLWxkdwogCUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvcHJvYmUtZmluZGVyLm8KKwlMSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2R3YXJmLWF1eC5vCiBlbmRpZiAjIFBFUkZfSEFWRV9EV0FSRl9SRUdTCiBlbmRpZiAjIE5PX0RXQVJGCiAKQEAgLTYzMyw3ICs2MzgsNyBAQAogCiBTSEVMTF9QQVRIX1NRID0gJChzdWJzdCAnLCdcJycsJChTSEVMTF9QQVRIKSkKIAotTElCUyA9IC1XbCwtLXdob2xlLWFyY2hpdmUgJChQRVJGTElCUykgLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSAkKEVYVExJQlMpCitMSUJTID0gLVdsLC0td2hvbGUtYXJjaGl2ZSAkKFBFUkZMSUJTKSAtV2wsLS1uby13aG9sZS1hcmNoaXZlIC1XbCwtLXN0YXJ0LWdyb3VwICQoRVhUTElCUykgLVdsLC0tZW5kLWdyb3VwCiAKIEFMTF9DRkxBR1MgKz0gJChCQVNJQ19DRkxBR1MpCiBBTExfQ0ZMQUdTICs9ICQoQVJDSF9DRkxBR1MpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1hbm5vdGF0ZS5jCmluZGV4IDdiMTM5ZTEuLjU1NWFlZmQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1hbm5vdGF0ZS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1hbm5vdGF0ZS5jCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSAidXRpbC9oaXN0LmgiCiAjaW5jbHVkZSAidXRpbC9zZXNzaW9uLmgiCiAKKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKwogc3RhdGljIGNoYXIJCWNvbnN0ICppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CiAKIHN0YXRpYyBib29sCQlmb3JjZSwgdXNlX3R1aSwgdXNlX3N0ZGlvOwpAQCAtMzgsNiArNDAsOSBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqc3ltX2hpc3RfZmlsdGVyOwogCitzdGF0aWMgY29uc3QgY2hhcgkqY3B1X2xpc3Q7CitzdGF0aWMgREVDTEFSRV9CSVRNQVAoY3B1X2JpdG1hcCwgTUFYX05SX0NQVVMpOworCiBzdGF0aWMgaW50IHBlcmZfZXZsaXN0X19hZGRfc2FtcGxlKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAogCQkJCSAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCSAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKQEAgLTkwLDYgKzk1LDkgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAorCWlmIChjcHVfbGlzdCAmJiAhdGVzdF9iaXQoc2FtcGxlLT5jcHUsIGNwdV9iaXRtYXApKQorCQlyZXR1cm4gMDsKKwogCWlmICghYWwuZmlsdGVyZWQgJiYKIAkgICAgcGVyZl9ldmxpc3RfX2FkZF9zYW1wbGUoc2Vzc2lvbi0+ZXZsaXN0LCBzYW1wbGUsIGV2c2VsLCAmYWwpKSB7CiAJCXByX3dhcm5pbmcoInByb2JsZW0gaW5jcmVtZW50aW5nIHN5bWJvbCBjb3VudCwgIgpAQCAtMTc3LDYgKzE4NSwxMiBAQAogCWlmIChzZXNzaW9uID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKGNwdV9saXN0KSB7CisJCXJldCA9IHBlcmZfc2Vzc2lvbl9fY3B1X2JpdG1hcChzZXNzaW9uLCBjcHVfbGlzdCwgY3B1X2JpdG1hcCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9kZWxldGU7CisJfQorCiAJcmV0ID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCAmZXZlbnRfb3BzKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9kZWxldGU7CkBAIC0yNTIsNiArMjY2LDcgQEAKIAkJICAgICJwcmludCBtYXRjaGluZyBzb3VyY2UgbGluZXMgKG1heSBiZSBzbG93KSIpLAogCU9QVF9CT09MRUFOKCdQJywgImZ1bGwtcGF0aHMiLCAmZnVsbF9wYXRocywKIAkJICAgICJEb24ndCBzaG9ydGVuIHRoZSBkaXNwbGF5ZWQgcGF0aG5hbWVzIiksCisJT1BUX1NUUklORygnYycsICJjcHUiLCAmY3B1X2xpc3QsICJjcHUiLCAibGlzdCBvZiBjcHVzIHRvIHByb2ZpbGUiKSwKIAlPUFRfRU5EKCkKIH07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMKaW5kZXggMmMwZTY0ZC4uNWYyYTVjNyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMKQEAgLTI0Miw3ICsyNDIsOCBAQAogCU9QVF9TVFJJTkcoJ3MnLCAic291cmNlIiwgJnN5bWJvbF9jb25mLnNvdXJjZV9wcmVmaXgsCiAJCSAgICJkaXJlY3RvcnkiLCAicGF0aCB0byBrZXJuZWwgc291cmNlIiksCiAJT1BUX1NUUklORygnbScsICJtb2R1bGUiLCAmcGFyYW1zLnRhcmdldF9tb2R1bGUsCi0JCSAgICJtb2RuYW1lIiwgInRhcmdldCBtb2R1bGUgbmFtZSIpLAorCQkgICAibW9kbmFtZXxwYXRoIiwKKwkJICAgInRhcmdldCBtb2R1bGUgbmFtZSAoZm9yIG9ubGluZSkgb3IgcGF0aCAoZm9yIG9mZmxpbmUpIiksCiAjZW5kaWYKIAlPUFRfX0RSWV9SVU4oJnByb2JlX2V2ZW50X2RyeV9ydW4pLAogCU9QVF9JTlRFR0VSKCdcMCcsICJtYXgtcHJvYmVzIiwgJnBhcmFtcy5tYXhfcHJvYmVfcG9pbnRzLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCmluZGV4IDhlMmM4NTcuLjgwZGM1YjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKQEAgLTc0MCw3ICs3NDAsNyBAQAogY29uc3Qgc3RydWN0IG9wdGlvbiByZWNvcmRfb3B0aW9uc1tdID0gewogCU9QVF9DQUxMQkFDSygnZScsICJldmVudCIsICZldnNlbF9saXN0LCAiZXZlbnQiLAogCQkgICAgICJldmVudCBzZWxlY3Rvci4gdXNlICdwZXJmIGxpc3QnIHRvIGxpc3QgYXZhaWxhYmxlIGV2ZW50cyIsCi0JCSAgICAgcGFyc2VfZXZlbnRzKSwKKwkJICAgICBwYXJzZV9ldmVudHNfb3B0aW9uKSwKIAlPUFRfQ0FMTEJBQ0soMCwgImZpbHRlciIsICZldnNlbF9saXN0LCAiZmlsdGVyIiwKIAkJICAgICAiZXZlbnQgZmlsdGVyIiwgcGFyc2VfZmlsdGVyKSwKIAlPUFRfSU5URUdFUigncCcsICJwaWQiLCAmdGFyZ2V0X3BpZCwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYwppbmRleCAyODdhMTczLi5mODU0ZWZkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCkBAIC0zMyw2ICszMyw4IEBACiAjaW5jbHVkZSAidXRpbC9zb3J0LmgiCiAjaW5jbHVkZSAidXRpbC9oaXN0LmgiCiAKKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKwogc3RhdGljIGNoYXIJCWNvbnN0ICppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CiAKIHN0YXRpYyBib29sCQlmb3JjZSwgdXNlX3R1aSwgdXNlX3N0ZGlvOwpAQCAtNDUsOSArNDcsMTMgQEAKIHN0YXRpYyBjb25zdCBjaGFyCWRlZmF1bHRfcHJldHR5X3ByaW50aW5nX3N0eWxlW10gPSAibm9ybWFsIjsKIHN0YXRpYyBjb25zdCBjaGFyCSpwcmV0dHlfcHJpbnRpbmdfc3R5bGUgPSBkZWZhdWx0X3ByZXR0eV9wcmludGluZ19zdHlsZTsKIAotc3RhdGljIGNoYXIJCWNhbGxjaGFpbl9kZWZhdWx0X29wdFtdID0gImZyYWN0YWwsMC41IjsKK3N0YXRpYyBjaGFyCQljYWxsY2hhaW5fZGVmYXVsdF9vcHRbXSA9ICJmcmFjdGFsLDAuNSxjYWxsZWUiOworc3RhdGljIGJvb2wJCWludmVydGVkX2NhbGxjaGFpbjsKIHN0YXRpYyBzeW1ib2xfZmlsdGVyX3QJYW5ub3RhdGVfaW5pdDsKIAorc3RhdGljIGNvbnN0IGNoYXIJKmNwdV9saXN0Oworc3RhdGljIERFQ0xBUkVfQklUTUFQKGNwdV9iaXRtYXAsIE1BWF9OUl9DUFVTKTsKKwogc3RhdGljIGludCBwZXJmX3Nlc3Npb25fX2FkZF9oaXN0X2VudHJ5KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCiAJCQkJCXN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKIAkJCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCkBAIC0xMTYsNiArMTIyLDkgQEAKIAlpZiAoYWwuZmlsdGVyZWQgfHwgKGhpZGVfdW5yZXNvbHZlZCAmJiBhbC5zeW0gPT0gTlVMTCkpCiAJCXJldHVybiAwOwogCisJaWYgKGNwdV9saXN0ICYmICF0ZXN0X2JpdChzYW1wbGUtPmNwdSwgY3B1X2JpdG1hcCkpCisJCXJldHVybiAwOworCiAJaWYgKGFsLm1hcCAhPSBOVUxMKQogCQlhbC5tYXAtPmRzby0+aGl0ID0gMTsKIApAQCAtMjYyLDYgKzI3MSwxMiBAQAogCWlmIChzZXNzaW9uID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKGNwdV9saXN0KSB7CisJCXJldCA9IHBlcmZfc2Vzc2lvbl9fY3B1X2JpdG1hcChzZXNzaW9uLCBjcHVfbGlzdCwgY3B1X2JpdG1hcCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9kZWxldGU7CisJfQorCiAJaWYgKHNob3dfdGhyZWFkcykKIAkJcGVyZl9yZWFkX3ZhbHVlc19pbml0KCZzaG93X3RocmVhZHNfdmFsdWVzKTsKIApAQCAtMzg2LDEzICs0MDEsMjkgQEAKIAlpZiAoIXRvaykKIAkJZ290byBzZXR1cDsKIAotCXRvazIgPSBzdHJ0b2soTlVMTCwgIiwiKTsKIAljYWxsY2hhaW5fcGFyYW0ubWluX3BlcmNlbnQgPSBzdHJ0b2QodG9rLCAmZW5kcHRyKTsKIAlpZiAodG9rID09IGVuZHB0cikKIAkJcmV0dXJuIC0xOwogCi0JaWYgKHRvazIpCisJLyogZ2V0IHRoZSBwcmludCBsaW1pdCAqLworCXRvazIgPSBzdHJ0b2soTlVMTCwgIiwiKTsKKwlpZiAoIXRvazIpCisJCWdvdG8gc2V0dXA7CisKKwlpZiAodG9rMlswXSAhPSAnYycpIHsKIAkJY2FsbGNoYWluX3BhcmFtLnByaW50X2xpbWl0ID0gc3RydG9kKHRvazIsICZlbmRwdHIpOworCQl0b2syID0gc3RydG9rKE5VTEwsICIsIik7CisJCWlmICghdG9rMikKKwkJCWdvdG8gc2V0dXA7CisJfQorCisJLyogZ2V0IHRoZSBjYWxsIGNoYWluIG9yZGVyICovCisJaWYgKCFzdHJjbXAodG9rMiwgImNhbGxlciIpKQorCQljYWxsY2hhaW5fcGFyYW0ub3JkZXIgPSBPUkRFUl9DQUxMRVI7CisJZWxzZSBpZiAoIXN0cmNtcCh0b2syLCAiY2FsbGVlIikpCisJCWNhbGxjaGFpbl9wYXJhbS5vcmRlciA9IE9SREVSX0NBTExFRTsKKwllbHNlCisJCXJldHVybiAtMTsKIHNldHVwOgogCWlmIChjYWxsY2hhaW5fcmVnaXN0ZXJfcGFyYW0oJmNhbGxjaGFpbl9wYXJhbSkgPCAwKSB7CiAJCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgcmVnaXN0ZXIgY2FsbGNoYWluIHBhcmFtc1xuIik7CkBAIC00MzYsOSArNDY3LDEwIEBACiAJCSAgICJyZWdleCBmaWx0ZXIgdG8gaWRlbnRpZnkgcGFyZW50LCBzZWU6ICctLXNvcnQgcGFyZW50JyIpLAogCU9QVF9CT09MRUFOKCd4JywgImV4Y2x1ZGUtb3RoZXIiLCAmc3ltYm9sX2NvbmYuZXhjbHVkZV9vdGhlciwKIAkJICAgICJPbmx5IGRpc3BsYXkgZW50cmllcyB3aXRoIHBhcmVudC1tYXRjaCIpLAotCU9QVF9DQUxMQkFDS19ERUZBVUxUKCdnJywgImNhbGwtZ3JhcGgiLCBOVUxMLCAib3V0cHV0X3R5cGUsbWluX3BlcmNlbnQiLAotCQkgICAgICJEaXNwbGF5IGNhbGxjaGFpbnMgdXNpbmcgb3V0cHV0X3R5cGUgKGdyYXBoLCBmbGF0LCBmcmFjdGFsLCBvciBub25lKSBhbmQgbWluIHBlcmNlbnQgdGhyZXNob2xkLiAiCi0JCSAgICAgIkRlZmF1bHQ6IGZyYWN0YWwsMC41IiwgJnBhcnNlX2NhbGxjaGFpbl9vcHQsIGNhbGxjaGFpbl9kZWZhdWx0X29wdCksCisJT1BUX0NBTExCQUNLX0RFRkFVTFQoJ2cnLCAiY2FsbC1ncmFwaCIsIE5VTEwsICJvdXRwdXRfdHlwZSxtaW5fcGVyY2VudCwgY2FsbF9vcmRlciIsCisJCSAgICAgIkRpc3BsYXkgY2FsbGNoYWlucyB1c2luZyBvdXRwdXRfdHlwZSAoZ3JhcGgsIGZsYXQsIGZyYWN0YWwsIG9yIG5vbmUpICwgbWluIHBlcmNlbnQgdGhyZXNob2xkIGFuZCBjYWxsY2hhaW4gb3JkZXIuICIKKwkJICAgICAiRGVmYXVsdDogZnJhY3RhbCwwLjUsY2FsbGVlIiwgJnBhcnNlX2NhbGxjaGFpbl9vcHQsIGNhbGxjaGFpbl9kZWZhdWx0X29wdCksCisJT1BUX0JPT0xFQU4oJ0cnLCAiaW52ZXJ0ZWQiLCAmaW52ZXJ0ZWRfY2FsbGNoYWluLCAiYWxpYXMgZm9yIGludmVydGVkIGNhbGwgZ3JhcGgiKSwKIAlPUFRfU1RSSU5HKCdkJywgImRzb3MiLCAmc3ltYm9sX2NvbmYuZHNvX2xpc3Rfc3RyLCAiZHNvWyxkc28uLi5dIiwKIAkJICAgIm9ubHkgY29uc2lkZXIgc3ltYm9scyBpbiB0aGVzZSBkc29zIiksCiAJT1BUX1NUUklORygnQycsICJjb21tcyIsICZzeW1ib2xfY29uZi5jb21tX2xpc3Rfc3RyLCAiY29tbVssY29tbS4uLl0iLApAQCAtNDU1LDYgKzQ4Nyw3IEBACiAJCSAgICAiT25seSBkaXNwbGF5IGVudHJpZXMgcmVzb2x2ZWQgdG8gYSBzeW1ib2wiKSwKIAlPUFRfU1RSSU5HKDAsICJzeW1mcyIsICZzeW1ib2xfY29uZi5zeW1mcywgImRpcmVjdG9yeSIsCiAJCSAgICAiTG9vayBmb3IgZmlsZXMgd2l0aCBzeW1ib2xzIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5IiksCisJT1BUX1NUUklORygnYycsICJjcHUiLCAmY3B1X2xpc3QsICJjcHUiLCAibGlzdCBvZiBjcHVzIHRvIHByb2ZpbGUiKSwKIAlPUFRfRU5EKCkKIH07CiAKQEAgLTQ2Nyw2ICs1MDAsOSBAQAogCWVsc2UgaWYgKHVzZV90dWkpCiAJCXVzZV9icm93c2VyID0gMTsKIAorCWlmIChpbnZlcnRlZF9jYWxsY2hhaW4pCisJCWNhbGxjaGFpbl9wYXJhbS5vcmRlciA9IE9SREVSX0NBTExFUjsKKwogCWlmIChzdHJjbXAoaW5wdXRfbmFtZSwgIi0iKSAhPSAwKQogCQlzZXR1cF9icm93c2VyKHRydWUpOwogCWVsc2UKQEAgLTUwNCw3ICs1NDAsMTQgQEAKIAlpZiAocGFyZW50X3BhdHRlcm4gIT0gZGVmYXVsdF9wYXJlbnRfcGF0dGVybikgewogCQlpZiAoc29ydF9kaW1lbnNpb25fX2FkZCgicGFyZW50IikgPCAwKQogCQkJcmV0dXJuIC0xOwotCQlzb3J0X3BhcmVudC5lbGlkZSA9IDE7CisKKwkJLyoKKwkJICogT25seSBzaG93IHRoZSBwYXJlbnQgZmllbGRzIGlmIHdlIGV4cGxpY2l0bHkKKwkJICogc29ydCB0aGF0IHdheS4gSWYgd2Ugb25seSB1c2UgcGFyZW50IG1hY2hpbmVyeQorCQkgKiBmb3IgZmlsdGVyaW5nLCB3ZSBkb24ndCB3YW50IGl0LgorCQkgKi8KKwkJaWYgKCFzdHJzdHIoc29ydF9vcmRlciwgInBhcmVudCIpKQorCQkJc29ydF9wYXJlbnQuZWxpZGUgPSAxOwogCX0gZWxzZQogCQlzeW1ib2xfY29uZi5leGNsdWRlX290aGVyID0gZmFsc2U7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYwppbmRleCAyMjc0N2RlLi4wOTAyNGVjIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc2NyaXB0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXNjcmlwdC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAidXRpbC91dGlsLmgiCiAjaW5jbHVkZSAidXRpbC9ldmxpc3QuaCIKICNpbmNsdWRlICJ1dGlsL2V2c2VsLmgiCisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAKIHN0YXRpYyBjaGFyIGNvbnN0CQkqc2NyaXB0X25hbWU7CiBzdGF0aWMgY2hhciBjb25zdAkJKmdlbmVyYXRlX3NjcmlwdF9sYW5nOwpAQCAtMjEsNiArMjIsOCBAQAogc3RhdGljIHU2NAkJCW5yX3Vub3JkZXJlZDsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgb3B0aW9uCXJlY29yZF9vcHRpb25zW107CiBzdGF0aWMgYm9vbAkJCW5vX2NhbGxjaGFpbjsKK3N0YXRpYyBjb25zdCBjaGFyCQkqY3B1X2xpc3Q7CitzdGF0aWMgREVDTEFSRV9CSVRNQVAoY3B1X2JpdG1hcCwgTUFYX05SX0NQVVMpOwogCiBlbnVtIHBlcmZfb3V0cHV0X2ZpZWxkIHsKIAlQRVJGX09VVFBVVF9DT01NICAgICAgICAgICAgPSAxVSA8PCAwLApAQCAtMzAsNyArMzMsMTAgQEAKIAlQRVJGX09VVFBVVF9DUFUgICAgICAgICAgICAgPSAxVSA8PCA0LAogCVBFUkZfT1VUUFVUX0VWTkFNRSAgICAgICAgICA9IDFVIDw8IDUsCiAJUEVSRl9PVVRQVVRfVFJBQ0UgICAgICAgICAgID0gMVUgPDwgNiwKLQlQRVJGX09VVFBVVF9TWU0gICAgICAgICAgICAgPSAxVSA8PCA3LAorCVBFUkZfT1VUUFVUX0lQICAgICAgICAgICAgICA9IDFVIDw8IDcsCisJUEVSRl9PVVRQVVRfU1lNICAgICAgICAgICAgID0gMVUgPDwgOCwKKwlQRVJGX09VVFBVVF9EU08gICAgICAgICAgICAgPSAxVSA8PCA5LAorCVBFUkZfT1VUUFVUX0FERFIgICAgICAgICAgICA9IDFVIDw8IDEwLAogfTsKIAogc3RydWN0IG91dHB1dF9vcHRpb24gewpAQCAtNDQsNyArNTAsMTAgQEAKIAl7LnN0ciA9ICJjcHUiLCAgIC5maWVsZCA9IFBFUkZfT1VUUFVUX0NQVX0sCiAJey5zdHIgPSAiZXZlbnQiLCAuZmllbGQgPSBQRVJGX09VVFBVVF9FVk5BTUV9LAogCXsuc3RyID0gInRyYWNlIiwgLmZpZWxkID0gUEVSRl9PVVRQVVRfVFJBQ0V9LAorCXsuc3RyID0gImlwIiwgICAgLmZpZWxkID0gUEVSRl9PVVRQVVRfSVB9LAogCXsuc3RyID0gInN5bSIsICAgLmZpZWxkID0gUEVSRl9PVVRQVVRfU1lNfSwKKwl7LnN0ciA9ICJkc28iLCAgIC5maWVsZCA9IFBFUkZfT1VUUFVUX0RTT30sCisJey5zdHIgPSAiYWRkciIsICAuZmllbGQgPSBQRVJGX09VVFBVVF9BRERSfSwKIH07CiAKIC8qIGRlZmF1bHQgc2V0IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBjdXJyZW50IGZvcm1hdCAqLwpAQCAtNjAsNyArNjksOCBAQAogCiAJCS5maWVsZHMgPSBQRVJGX09VVFBVVF9DT01NIHwgUEVSRl9PVVRQVVRfVElEIHwKIAkJCSAgICAgIFBFUkZfT1VUUFVUX0NQVSB8IFBFUkZfT1VUUFVUX1RJTUUgfAotCQkJICAgICAgUEVSRl9PVVRQVVRfRVZOQU1FIHwgUEVSRl9PVVRQVVRfU1lNLAorCQkJICAgICAgUEVSRl9PVVRQVVRfRVZOQU1FIHwgUEVSRl9PVVRQVVRfSVAgfAorCQkJCSAgUEVSRl9PVVRQVVRfU1lNIHwgUEVSRl9PVVRQVVRfRFNPLAogCiAJCS5pbnZhbGlkX2ZpZWxkcyA9IFBFUkZfT1VUUFVUX1RSQUNFLAogCX0sCkBAIC03MCw3ICs4MCw4IEBACiAKIAkJLmZpZWxkcyA9IFBFUkZfT1VUUFVUX0NPTU0gfCBQRVJGX09VVFBVVF9USUQgfAogCQkJICAgICAgUEVSRl9PVVRQVVRfQ1BVIHwgUEVSRl9PVVRQVVRfVElNRSB8Ci0JCQkgICAgICBQRVJGX09VVFBVVF9FVk5BTUUgfCBQRVJGX09VVFBVVF9TWU0sCisJCQkgICAgICBQRVJGX09VVFBVVF9FVk5BTUUgfCBQRVJGX09VVFBVVF9JUCB8CisJCQkJICBQRVJGX09VVFBVVF9TWU0gfCBQRVJGX09VVFBVVF9EU08sCiAKIAkJLmludmFsaWRfZmllbGRzID0gUEVSRl9PVVRQVVRfVFJBQ0UsCiAJfSwKQEAgLTg4LDcgKzk5LDggQEAKIAogCQkuZmllbGRzID0gUEVSRl9PVVRQVVRfQ09NTSB8IFBFUkZfT1VUUFVUX1RJRCB8CiAJCQkgICAgICBQRVJGX09VVFBVVF9DUFUgfCBQRVJGX09VVFBVVF9USU1FIHwKLQkJCSAgICAgIFBFUkZfT1VUUFVUX0VWTkFNRSB8IFBFUkZfT1VUUFVUX1NZTSwKKwkJCSAgICAgIFBFUkZfT1VUUFVUX0VWTkFNRSB8IFBFUkZfT1VUUFVUX0lQIHwKKwkJCQkgIFBFUkZfT1VUUFVUX1NZTSB8IFBFUkZfT1VUUFVUX0RTTywKIAogCQkuaW52YWxpZF9maWVsZHMgPSBQRVJGX09VVFBVVF9UUkFDRSwKIAl9LApAQCAtMTU3LDkgKzE2OSw5IEBACiAJCSFwZXJmX3Nlc3Npb25fX2hhc190cmFjZXMoc2Vzc2lvbiwgInJlY29yZCAtUiIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChQUklOVF9GSUVMRChTWU0pKSB7CisJaWYgKFBSSU5UX0ZJRUxEKElQKSkgewogCQlpZiAocGVyZl9ldmVudF9hdHRyX19jaGVja19zdHlwZShhdHRyLCBQRVJGX1NBTVBMRV9JUCwgIklQIiwKLQkJCQkJICAgUEVSRl9PVVRQVVRfU1lNKSkKKwkJCQkJICAgUEVSRl9PVVRQVVRfSVApKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKCFub19jYWxsY2hhaW4gJiYKQEAgLTE2Nyw2ICsxNzksMjQgQEAKIAkJCXN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4gPSBmYWxzZTsKIAl9CiAKKwlpZiAoUFJJTlRfRklFTEQoQUREUikgJiYKKwkJcGVyZl9ldmVudF9hdHRyX19jaGVja19zdHlwZShhdHRyLCBQRVJGX1NBTVBMRV9BRERSLCAiQUREUiIsCisJCQkJICAgICAgIFBFUkZfT1VUUFVUX0FERFIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChQUklOVF9GSUVMRChTWU0pICYmICFQUklOVF9GSUVMRChJUCkgJiYgIVBSSU5UX0ZJRUxEKEFERFIpKSB7CisJCXByX2VycigiRGlzcGxheSBvZiBzeW1ib2xzIHJlcXVlc3RlZCBidXQgbmVpdGhlciBzYW1wbGUgSVAgbm9yICIKKwkJCSAgICJzYW1wbGUgYWRkcmVzc1xuaXMgc2VsZWN0ZWQuIEhlbmNlLCBubyBhZGRyZXNzZXMgdG8gY29udmVydCAiCisJCSAgICAgICAidG8gc3ltYm9scy5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKFBSSU5UX0ZJRUxEKERTTykgJiYgIVBSSU5UX0ZJRUxEKElQKSAmJiAhUFJJTlRfRklFTEQoQUREUikpIHsKKwkJcHJfZXJyKCJEaXNwbGF5IG9mIERTTyByZXF1ZXN0ZWQgYnV0IG5laXRoZXIgc2FtcGxlIElQIG5vciAiCisJCQkgICAic2FtcGxlIGFkZHJlc3NcbmlzIHNlbGVjdGVkLiBIZW5jZSwgbm8gYWRkcmVzc2VzIHRvIGNvbnZlcnQgIgorCQkgICAgICAgInRvIERTTy5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAoKFBSSU5UX0ZJRUxEKFBJRCkgfHwgUFJJTlRfRklFTEQoVElEKSkgJiYKIAkJcGVyZl9ldmVudF9hdHRyX19jaGVja19zdHlwZShhdHRyLCBQRVJGX1NBTVBMRV9USUQsICJUSUQiLAogCQkJCSAgICAgICBQRVJGX09VVFBVVF9USUR8UEVSRl9PVVRQVVRfUElEKSkKQEAgLTIzMCw3ICsyNjAsNyBAQAogCWlmIChQUklOVF9GSUVMRChDT01NKSkgewogCQlpZiAobGF0ZW5jeV9mb3JtYXQpCiAJCQlwcmludGYoIiU4LjhzICIsIHRocmVhZC0+Y29tbSk7Ci0JCWVsc2UgaWYgKFBSSU5UX0ZJRUxEKFNZTSkgJiYgc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikKKwkJZWxzZSBpZiAoUFJJTlRfRklFTEQoSVApICYmIHN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4pCiAJCQlwcmludGYoIiVzICIsIHRocmVhZC0+Y29tbSk7CiAJCWVsc2UKIAkJCXByaW50ZigiJTE2cyAiLCB0aHJlYWQtPmNvbW0pOwpAQCAtMjcxLDYgKzMwMSw2MyBAQAogCX0KIH0KIAorc3RhdGljIGJvb2wgc2FtcGxlX2FkZHJfY29ycmVsYXRlc19zeW0oc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cikKK3sKKwlpZiAoKGF0dHItPnR5cGUgPT0gUEVSRl9UWVBFX1NPRlRXQVJFKSAmJgorCSAgICAoKGF0dHItPmNvbmZpZyA9PSBQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTKSB8fAorCSAgICAgKGF0dHItPmNvbmZpZyA9PSBQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTikgfHwKKwkgICAgIChhdHRyLT5jb25maWcgPT0gUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NQUopKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3NhbXBsZV9hZGRyKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCSAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCSAgc3RydWN0IHRocmVhZCAqdGhyZWFkLAorCQkJICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQoreworCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCXU4IGNwdW1vZGUgPSBldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX1JFQ09SRF9NSVNDX0NQVU1PREVfTUFTSzsKKwljb25zdCBjaGFyICpzeW1uYW1lLCAqZHNvbmFtZTsKKworCXByaW50ZigiJTE2IiBQUkl4NjQsIHNhbXBsZS0+YWRkcik7CisKKwlpZiAoIXNhbXBsZV9hZGRyX2NvcnJlbGF0ZXNfc3ltKGF0dHIpKQorCQlyZXR1cm47CisKKwl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAodGhyZWFkLCBzZXNzaW9uLCBjcHVtb2RlLCBNQVBfX0ZVTkNUSU9OLAorCQkJICAgICAgZXZlbnQtPmlwLnBpZCwgc2FtcGxlLT5hZGRyLCAmYWwpOworCWlmICghYWwubWFwKQorCQl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAodGhyZWFkLCBzZXNzaW9uLCBjcHVtb2RlLCBNQVBfX1ZBUklBQkxFLAorCQkJCSAgICAgIGV2ZW50LT5pcC5waWQsIHNhbXBsZS0+YWRkciwgJmFsKTsKKworCWFsLmNwdSA9IHNhbXBsZS0+Y3B1OworCWFsLnN5bSA9IE5VTEw7CisKKwlpZiAoYWwubWFwKQorCQlhbC5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLm1hcCwgYWwuYWRkciwgTlVMTCk7CisKKwlpZiAoUFJJTlRfRklFTEQoU1lNKSkgeworCQlpZiAoYWwuc3ltICYmIGFsLnN5bS0+bmFtZSkKKwkJCXN5bW5hbWUgPSBhbC5zeW0tPm5hbWU7CisJCWVsc2UKKwkJCXN5bW5hbWUgPSAiIjsKKworCQlwcmludGYoIiAlMTZzIiwgc3ltbmFtZSk7CisJfQorCisJaWYgKFBSSU5UX0ZJRUxEKERTTykpIHsKKwkJaWYgKGFsLm1hcCAmJiBhbC5tYXAtPmRzbyAmJiBhbC5tYXAtPmRzby0+bmFtZSkKKwkJCWRzb25hbWUgPSBhbC5tYXAtPmRzby0+bmFtZTsKKwkJZWxzZQorCQkJZHNvbmFtZSA9ICIiOworCisJCXByaW50ZigiICglcykiLCBkc29uYW1lKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHByb2Nlc3NfZXZlbnQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQgX191bnVzZWQsCiAJCQkgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCkBAIC0yODgsMTIgKzM3NSwxNiBAQAogCQlwcmludF90cmFjZV9ldmVudChzYW1wbGUtPmNwdSwgc2FtcGxlLT5yYXdfZGF0YSwKIAkJCQkgIHNhbXBsZS0+cmF3X3NpemUpOwogCi0JaWYgKFBSSU5UX0ZJRUxEKFNZTSkpIHsKKwlpZiAoUFJJTlRfRklFTEQoQUREUikpCisJCXByaW50X3NhbXBsZV9hZGRyKGV2ZW50LCBzYW1wbGUsIHNlc3Npb24sIHRocmVhZCwgYXR0cik7CisKKwlpZiAoUFJJTlRfRklFTEQoSVApKSB7CiAJCWlmICghc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikKIAkJCXByaW50ZigiICIpOwogCQllbHNlCiAJCQlwcmludGYoIlxuIik7Ci0JCXBlcmZfc2Vzc2lvbl9fcHJpbnRfc3ltYm9scyhldmVudCwgc2FtcGxlLCBzZXNzaW9uKTsKKwkJcGVyZl9zZXNzaW9uX19wcmludF9pcChldmVudCwgc2FtcGxlLCBzZXNzaW9uLAorCQkJCQkgICAgICBQUklOVF9GSUVMRChTWU0pLCBQUklOVF9GSUVMRChEU08pKTsKIAl9CiAKIAlwcmludGYoIlxuIik7CkBAIC0zNjUsNiArNDU2LDEwIEBACiAJCWxhc3RfdGltZXN0YW1wID0gc2FtcGxlLT50aW1lOwogCQlyZXR1cm4gMDsKIAl9CisKKwlpZiAoY3B1X2xpc3QgJiYgIXRlc3RfYml0KHNhbXBsZS0+Y3B1LCBjcHVfYml0bWFwKSkKKwkJcmV0dXJuIDA7CisKIAlzY3JpcHRpbmdfb3BzLT5wcm9jZXNzX2V2ZW50KGV2ZW50LCBzYW1wbGUsIGV2c2VsLCBzZXNzaW9uLCB0aHJlYWQpOwogCiAJc2Vzc2lvbi0+aGlzdHMuc3RhdHMudG90YWxfcGVyaW9kICs9IHNhbXBsZS0+cGVyaW9kOwpAQCAtOTg1LDggKzEwODAsOSBAQAogCU9QVF9TVFJJTkcoMCwgInN5bWZzIiwgJnN5bWJvbF9jb25mLnN5bWZzLCAiZGlyZWN0b3J5IiwKIAkJICAgICJMb29rIGZvciBmaWxlcyB3aXRoIHN5bWJvbHMgcmVsYXRpdmUgdG8gdGhpcyBkaXJlY3RvcnkiKSwKIAlPUFRfQ0FMTEJBQ0soJ2YnLCAiZmllbGRzIiwgTlVMTCwgInN0ciIsCi0JCSAgICAgImNvbW1hIHNlcGFyYXRlZCBvdXRwdXQgZmllbGRzIHByZXBlbmQgd2l0aCAndHlwZTonLiBWYWxpZCB0eXBlczogaHcsc3csdHJhY2UscmF3LiBGaWVsZHM6IGNvbW0sdGlkLHBpZCx0aW1lLGNwdSxldmVudCx0cmFjZSxzeW0iLAorCQkgICAgICJjb21tYSBzZXBhcmF0ZWQgb3V0cHV0IGZpZWxkcyBwcmVwZW5kIHdpdGggJ3R5cGU6Jy4gVmFsaWQgdHlwZXM6IGh3LHN3LHRyYWNlLHJhdy4gRmllbGRzOiBjb21tLHRpZCxwaWQsdGltZSxjcHUsZXZlbnQsdHJhY2UsaXAsc3ltLGRzbyxhZGRyIiwKIAkJICAgICBwYXJzZV9vdXRwdXRfZmllbGRzKSwKKwlPUFRfU1RSSU5HKCdjJywgImNwdSIsICZjcHVfbGlzdCwgImNwdSIsICJsaXN0IG9mIGNwdXMgdG8gcHJvZmlsZSIpLAogCiAJT1BUX0VORCgpCiB9OwpAQCAtMTE2Nyw2ICsxMjYzLDExIEBACiAJaWYgKHNlc3Npb24gPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlpZiAoY3B1X2xpc3QpIHsKKwkJaWYgKHBlcmZfc2Vzc2lvbl9fY3B1X2JpdG1hcChzZXNzaW9uLCBjcHVfbGlzdCwgY3B1X2JpdG1hcCkpCisJCQlyZXR1cm4gLTE7CisJfQorCiAJaWYgKCFub19jYWxsY2hhaW4pCiAJCXN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4gPSB0cnVlOwogCWVsc2UKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCmluZGV4IGE5ZjA2NzEuLjFhZDA0Y2UgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYwpAQCAtNjEsNiArNjEsOCBAQAogI2luY2x1ZGUgPGxvY2FsZS5oPgogCiAjZGVmaW5lIERFRkFVTFRfU0VQQVJBVE9SCSIgIgorI2RlZmluZSBDTlRSX05PVF9TVVBQT1JURUQJIjxub3Qgc3VwcG9ydGVkPiIKKyNkZWZpbmUgQ05UUl9OT1RfQ09VTlRFRAkiPG5vdCBjb3VudGVkPiIKIAogc3RhdGljIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgZGVmYXVsdF9hdHRyc1tdID0gewogCkBAIC00NDgsNiArNDUwLDcgQEAKIAkJCQlpZiAodmVyYm9zZSkKIAkJCQkJdWlfX3dhcm5pbmcoIiVzIGV2ZW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbC5cbiIsCiAJCQkJCQkgICAgZXZlbnRfbmFtZShjb3VudGVyKSk7CisJCQkJY291bnRlci0+c3VwcG9ydGVkID0gZmFsc2U7CiAJCQkJY29udGludWU7CiAJCQl9CiAKQEAgLTQ2Niw2ICs0NjksNyBAQAogCQkJZGllKCJOb3QgYWxsIGV2ZW50cyBjb3VsZCBiZSBvcGVuZWQuXG4iKTsKIAkJCXJldHVybiAtMTsKIAkJfQorCQljb3VudGVyLT5zdXBwb3J0ZWQgPSB0cnVlOwogCX0KIAogCWlmIChwZXJmX2V2bGlzdF9fc2V0X2ZpbHRlcnMoZXZzZWxfbGlzdCkpIHsKQEAgLTUxMyw3ICs1MTcsMTAgQEAKIAlpZiAoYXZnKQogCQlwY3QgPSAxMDAuMCp0b3RhbC9hdmc7CiAKLQlmcHJpbnRmKHN0ZGVyciwgIiAgKCArLSU2LjJmJSUgKSIsIHBjdCk7CisJaWYgKGNzdl9vdXRwdXQpCisJCWZwcmludGYoc3RkZXJyLCAiJXMlLjJmJSUiLCBjc3Zfc2VwLCBwY3QpOworCWVsc2UKKwkJZnByaW50ZihzdGRlcnIsICIgICggKy0lNi4yZiUlICkiLCBwY3QpOwogfQogCiBzdGF0aWMgdm9pZCBwcmludF9ub2lzZShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGRvdWJsZSBhdmcpCkBAIC04NjEsNyArODY4LDcgQEAKIAlpZiAoc2NhbGVkID09IC0xKSB7CiAJCWZwcmludGYoc3RkZXJyLCAiJSpzJXMlKnMiLAogCQkJY3N2X291dHB1dCA/IDAgOiAxOCwKLQkJCSI8bm90IGNvdW50ZWQ+IiwKKwkJCWNvdW50ZXItPnN1cHBvcnRlZCA/IENOVFJfTk9UX0NPVU5URUQgOiBDTlRSX05PVF9TVVBQT1JURUQsCiAJCQljc3Zfc2VwLAogCQkJY3N2X291dHB1dCA/IDAgOiAtMjQsCiAJCQlldmVudF9uYW1lKGNvdW50ZXIpKTsKQEAgLTg3OCwxMyArODg1LDEzIEBACiAJZWxzZQogCQlhYnNfcHJpbnRvdXQoLTEsIGNvdW50ZXIsIGF2Zyk7CiAKKwlwcmludF9ub2lzZShjb3VudGVyLCBhdmcpOworCiAJaWYgKGNzdl9vdXRwdXQpIHsKIAkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKIAkJcmV0dXJuOwogCX0KIAotCXByaW50X25vaXNlKGNvdW50ZXIsIGF2Zyk7Ci0KIAlpZiAoc2NhbGVkKSB7CiAJCWRvdWJsZSBhdmdfZW5hYmxlZCwgYXZnX3J1bm5pbmc7CiAKQEAgLTkxNCw3ICs5MjEsOCBAQAogCQkJCWNzdl9vdXRwdXQgPyAwIDogLTQsCiAJCQkJZXZzZWxfbGlzdC0+Y3B1cy0+bWFwW2NwdV0sIGNzdl9zZXAsCiAJCQkJY3N2X291dHB1dCA/IDAgOiAxOCwKLQkJCQkiPG5vdCBjb3VudGVkPiIsIGNzdl9zZXAsCisJCQkJY291bnRlci0+c3VwcG9ydGVkID8gQ05UUl9OT1RfQ09VTlRFRCA6IENOVFJfTk9UX1NVUFBPUlRFRCwKKwkJCQljc3Zfc2VwLAogCQkJCWNzdl9vdXRwdXQgPyAwIDogLTI0LAogCQkJCWV2ZW50X25hbWUoY291bnRlcikpOwogCkBAIC0xMDI0LDcgKzEwMzIsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0gewogCU9QVF9DQUxMQkFDSygnZScsICJldmVudCIsICZldnNlbF9saXN0LCAiZXZlbnQiLAogCQkgICAgICJldmVudCBzZWxlY3Rvci4gdXNlICdwZXJmIGxpc3QnIHRvIGxpc3QgYXZhaWxhYmxlIGV2ZW50cyIsCi0JCSAgICAgcGFyc2VfZXZlbnRzKSwKKwkJICAgICBwYXJzZV9ldmVudHNfb3B0aW9uKSwKIAlPUFRfQ0FMTEJBQ0soMCwgImZpbHRlciIsICZldnNlbF9saXN0LCAiZmlsdGVyIiwKIAkJICAgICAiZXZlbnQgZmlsdGVyIiwgcGFyc2VfZmlsdGVyKSwKIAlPUFRfQk9PTEVBTignaScsICJuby1pbmhlcml0IiwgJm5vX2luaGVyaXQsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tdGVzdC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRlc3QuYwppbmRleCBiNjcxODYyLi41NWY0Yzc2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdGVzdC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJ1dGlsL3BhcnNlLWV2ZW50cy5oIgogI2luY2x1ZGUgInV0aWwvc3ltYm9sLmgiCiAjaW5jbHVkZSAidXRpbC90aHJlYWRfbWFwLmgiCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9od19icmVha3BvaW50LmgiCiAKIHN0YXRpYyBsb25nIHBhZ2Vfc2l6ZTsKIApAQCAtMjQ1LDggKzI0Niw4IEBACiAJaW50IGVyciA9IC0xLCBmZDsKIAogCWlmIChhc3ByaW50ZigmZmlsZW5hbWUsCi0JCSAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL3N5c2NhbGxzLyVzL2lkIiwKLQkJICAgICBldm5hbWUpIDwgMCkKKwkJICAgICAiJXMvc3lzY2FsbHMvJXMvaWQiLAorCQkgICAgIGRlYnVnZnNfcGF0aCwgZXZuYW1lKSA8IDApCiAJCXJldHVybiAtMTsKIAogCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwpAQCAtNDc0LDcgKzQ3NSw3IEBACiAJdW5zaWduZWQgaW50IG5yX2V2ZW50c1tuc3lzY2FsbHNdLAogCQkgICAgIGV4cGVjdGVkX25yX2V2ZW50c1tuc3lzY2FsbHNdLCBpLCBqOwogCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbHNbbnN5c2NhbGxzXSwgKmV2c2VsOwotCWludCBzYW1wbGVfc2l6ZSA9IHBlcmZfc2FtcGxlX3NpemUoYXR0ci5zYW1wbGVfdHlwZSk7CisJaW50IHNhbXBsZV9zaXplID0gX19wZXJmX2V2c2VsX19zYW1wbGVfc2l6ZShhdHRyLnNhbXBsZV90eXBlKTsKIAogCWZvciAoaSA9IDA7IGkgPCBuc3lzY2FsbHM7ICsraSkgewogCQljaGFyIG5hbWVbNjRdOwpAQCAtNjAwLDYgKzYwMSwyNDYgQEAKICN1bmRlZiBuc3lzY2FsbHMKIH0KIAorI2RlZmluZSBURVNUX0FTU0VSVF9WQUwodGV4dCwgY29uZCkgXAorZG8geyBcCisJaWYgKCFjb25kKSB7IFwKKwkJcHJfZGVidWcoIkZBSUxFRCAlczolZCAlc1xuIiwgX19GSUxFX18sIF9fTElORV9fLCB0ZXh0KTsgXAorCQlyZXR1cm4gLTE7IFwKKwl9IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgdGVzdF9fY2hlY2tldmVudF90cmFjZXBvaW50KHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgbnVtYmVyIG9mIGVudHJpZXMiLCAxID09IGV2bGlzdC0+bnJfZW50cmllcyk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyB0eXBlIiwgUEVSRl9UWVBFX1RSQUNFUE9JTlQgPT0gZXZzZWwtPmF0dHIudHlwZSk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBzYW1wbGVfdHlwZSIsCisJCShQRVJGX1NBTVBMRV9SQVcgfCBQRVJGX1NBTVBMRV9USU1FIHwgUEVSRl9TQU1QTEVfQ1BVKSA9PQorCQlldnNlbC0+YXR0ci5zYW1wbGVfdHlwZSk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBzYW1wbGVfcGVyaW9kIiwgMSA9PSBldnNlbC0+YXR0ci5zYW1wbGVfcGVyaW9kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZXN0X19jaGVja2V2ZW50X3RyYWNlcG9pbnRfbXVsdGkoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOworCisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBudW1iZXIgb2YgZW50cmllcyIsIGV2bGlzdC0+bnJfZW50cmllcyA+IDEpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShldnNlbCwgJmV2bGlzdC0+ZW50cmllcywgbm9kZSkgeworCQlURVNUX0FTU0VSVF9WQUwoIndyb25nIHR5cGUiLAorCQkJUEVSRl9UWVBFX1RSQUNFUE9JTlQgPT0gZXZzZWwtPmF0dHIudHlwZSk7CisJCVRFU1RfQVNTRVJUX1ZBTCgid3Jvbmcgc2FtcGxlX3R5cGUiLAorCQkJKFBFUkZfU0FNUExFX1JBVyB8IFBFUkZfU0FNUExFX1RJTUUgfCBQRVJGX1NBTVBMRV9DUFUpCisJCQk9PSBldnNlbC0+YXR0ci5zYW1wbGVfdHlwZSk7CisJCVRFU1RfQVNTRVJUX1ZBTCgid3Jvbmcgc2FtcGxlX3BlcmlvZCIsCisJCQkxID09IGV2c2VsLT5hdHRyLnNhbXBsZV9wZXJpb2QpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZXN0X19jaGVja2V2ZW50X3JhdyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LAorCQkJCQkgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CisKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIG51bWJlciBvZiBlbnRyaWVzIiwgMSA9PSBldmxpc3QtPm5yX2VudHJpZXMpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgdHlwZSIsIFBFUkZfVFlQRV9SQVcgPT0gZXZzZWwtPmF0dHIudHlwZSk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBjb25maWciLCAxID09IGV2c2VsLT5hdHRyLmNvbmZpZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9fY2hlY2tldmVudF9udW1lcmljKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgbnVtYmVyIG9mIGVudHJpZXMiLCAxID09IGV2bGlzdC0+bnJfZW50cmllcyk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyB0eXBlIiwgMSA9PSBldnNlbC0+YXR0ci50eXBlKTsKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGNvbmZpZyIsIDEgPT0gZXZzZWwtPmF0dHIuY29uZmlnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZXN0X19jaGVja2V2ZW50X3N5bWJvbGljX25hbWUoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsID0gbGlzdF9lbnRyeShldmxpc3QtPmVudHJpZXMubmV4dCwKKwkJCQkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBudW1iZXIgb2YgZW50cmllcyIsIDEgPT0gZXZsaXN0LT5ucl9lbnRyaWVzKTsKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIHR5cGUiLCBQRVJGX1RZUEVfSEFSRFdBUkUgPT0gZXZzZWwtPmF0dHIudHlwZSk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBjb25maWciLAorCQkJUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlMgPT0gZXZzZWwtPmF0dHIuY29uZmlnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZXN0X19jaGVja2V2ZW50X3N5bWJvbGljX2FsaWFzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgbnVtYmVyIG9mIGVudHJpZXMiLCAxID09IGV2bGlzdC0+bnJfZW50cmllcyk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyB0eXBlIiwgUEVSRl9UWVBFX1NPRlRXQVJFID09IGV2c2VsLT5hdHRyLnR5cGUpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgY29uZmlnIiwKKwkJCVBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMgPT0gZXZzZWwtPmF0dHIuY29uZmlnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZXN0X19jaGVja2V2ZW50X2dlbmh3KHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgbnVtYmVyIG9mIGVudHJpZXMiLCAxID09IGV2bGlzdC0+bnJfZW50cmllcyk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyB0eXBlIiwgUEVSRl9UWVBFX0hXX0NBQ0hFID09IGV2c2VsLT5hdHRyLnR5cGUpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgY29uZmlnIiwgKDEgPDwgMTYpID09IGV2c2VsLT5hdHRyLmNvbmZpZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9fY2hlY2tldmVudF9icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgbnVtYmVyIG9mIGVudHJpZXMiLCAxID09IGV2bGlzdC0+bnJfZW50cmllcyk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyB0eXBlIiwgUEVSRl9UWVBFX0JSRUFLUE9JTlQgPT0gZXZzZWwtPmF0dHIudHlwZSk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBjb25maWciLCAwID09IGV2c2VsLT5hdHRyLmNvbmZpZyk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBicF90eXBlIiwgKEhXX0JSRUFLUE9JTlRfUiB8IEhXX0JSRUFLUE9JTlRfVykgPT0KKwkJCQkJIGV2c2VsLT5hdHRyLmJwX3R5cGUpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgYnBfbGVuIiwgSFdfQlJFQUtQT0lOVF9MRU5fNCA9PQorCQkJCQlldnNlbC0+YXR0ci5icF9sZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlc3RfX2NoZWNrZXZlbnRfYnJlYWtwb2ludF94KHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgbnVtYmVyIG9mIGVudHJpZXMiLCAxID09IGV2bGlzdC0+bnJfZW50cmllcyk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyB0eXBlIiwgUEVSRl9UWVBFX0JSRUFLUE9JTlQgPT0gZXZzZWwtPmF0dHIudHlwZSk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBjb25maWciLCAwID09IGV2c2VsLT5hdHRyLmNvbmZpZyk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBicF90eXBlIiwKKwkJCUhXX0JSRUFLUE9JTlRfWCA9PSBldnNlbC0+YXR0ci5icF90eXBlKTsKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGJwX2xlbiIsIHNpemVvZihsb25nKSA9PSBldnNlbC0+YXR0ci5icF9sZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlc3RfX2NoZWNrZXZlbnRfYnJlYWtwb2ludF9yKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgbnVtYmVyIG9mIGVudHJpZXMiLCAxID09IGV2bGlzdC0+bnJfZW50cmllcyk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyB0eXBlIiwKKwkJCVBFUkZfVFlQRV9CUkVBS1BPSU5UID09IGV2c2VsLT5hdHRyLnR5cGUpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgY29uZmlnIiwgMCA9PSBldnNlbC0+YXR0ci5jb25maWcpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgYnBfdHlwZSIsCisJCQlIV19CUkVBS1BPSU5UX1IgPT0gZXZzZWwtPmF0dHIuYnBfdHlwZSk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBicF9sZW4iLAorCQkJSFdfQlJFQUtQT0lOVF9MRU5fNCA9PSBldnNlbC0+YXR0ci5icF9sZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlc3RfX2NoZWNrZXZlbnRfYnJlYWtwb2ludF93KHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgbnVtYmVyIG9mIGVudHJpZXMiLCAxID09IGV2bGlzdC0+bnJfZW50cmllcyk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyB0eXBlIiwKKwkJCVBFUkZfVFlQRV9CUkVBS1BPSU5UID09IGV2c2VsLT5hdHRyLnR5cGUpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgY29uZmlnIiwgMCA9PSBldnNlbC0+YXR0ci5jb25maWcpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgYnBfdHlwZSIsCisJCQlIV19CUkVBS1BPSU5UX1cgPT0gZXZzZWwtPmF0dHIuYnBfdHlwZSk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBicF9sZW4iLAorCQkJSFdfQlJFQUtQT0lOVF9MRU5fNCA9PSBldnNlbC0+YXR0ci5icF9sZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRlc3RfX2V2ZW50X3N0IHsKKwljb25zdCBjaGFyICpuYW1lOworCV9fdTMyIHR5cGU7CisJaW50ICgqY2hlY2spKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKK30gdGVzdF9fZXZlbnRzW10gPSB7CisJeworCQkubmFtZSAgPSAic3lzY2FsbHM6c3lzX2VudGVyX29wZW4iLAorCQkuY2hlY2sgPSB0ZXN0X19jaGVja2V2ZW50X3RyYWNlcG9pbnQsCisJfSwKKwl7CisJCS5uYW1lICA9ICJzeXNjYWxsczoqIiwKKwkJLmNoZWNrID0gdGVzdF9fY2hlY2tldmVudF90cmFjZXBvaW50X211bHRpLAorCX0sCisJeworCQkubmFtZSAgPSAicjEiLAorCQkuY2hlY2sgPSB0ZXN0X19jaGVja2V2ZW50X3JhdywKKwl9LAorCXsKKwkJLm5hbWUgID0gIjE6MSIsCisJCS5jaGVjayA9IHRlc3RfX2NoZWNrZXZlbnRfbnVtZXJpYywKKwl9LAorCXsKKwkJLm5hbWUgID0gImluc3RydWN0aW9ucyIsCisJCS5jaGVjayA9IHRlc3RfX2NoZWNrZXZlbnRfc3ltYm9saWNfbmFtZSwKKwl9LAorCXsKKwkJLm5hbWUgID0gImZhdWx0cyIsCisJCS5jaGVjayA9IHRlc3RfX2NoZWNrZXZlbnRfc3ltYm9saWNfYWxpYXMsCisJfSwKKwl7CisJCS5uYW1lICA9ICJMMS1kY2FjaGUtbG9hZC1taXNzIiwKKwkJLmNoZWNrID0gdGVzdF9fY2hlY2tldmVudF9nZW5odywKKwl9LAorCXsKKwkJLm5hbWUgID0gIm1lbTowIiwKKwkJLmNoZWNrID0gdGVzdF9fY2hlY2tldmVudF9icmVha3BvaW50LAorCX0sCisJeworCQkubmFtZSAgPSAibWVtOjA6eCIsCisJCS5jaGVjayA9IHRlc3RfX2NoZWNrZXZlbnRfYnJlYWtwb2ludF94LAorCX0sCisJeworCQkubmFtZSAgPSAibWVtOjA6ciIsCisJCS5jaGVjayA9IHRlc3RfX2NoZWNrZXZlbnRfYnJlYWtwb2ludF9yLAorCX0sCisJeworCQkubmFtZSAgPSAibWVtOjA6dyIsCisJCS5jaGVjayA9IHRlc3RfX2NoZWNrZXZlbnRfYnJlYWtwb2ludF93LAorCX0sCit9OworCisjZGVmaW5lIFRFU1RfX0VWRU5UU19DTlQgKHNpemVvZih0ZXN0X19ldmVudHMpIC8gc2l6ZW9mKHN0cnVjdCB0ZXN0X19ldmVudF9zdCkpCisKK3N0YXRpYyBpbnQgdGVzdF9fcGFyc2VfZXZlbnRzKHZvaWQpCit7CisJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3Q7CisJdV9pbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBURVNUX19FVkVOVFNfQ05UOyBpKyspIHsKKwkJc3RydWN0IHRlc3RfX2V2ZW50X3N0ICplID0gJnRlc3RfX2V2ZW50c1tpXTsKKworCQlldmxpc3QgPSBwZXJmX2V2bGlzdF9fbmV3KE5VTEwsIE5VTEwpOworCQlpZiAoZXZsaXN0ID09IE5VTEwpCisJCQlicmVhazsKKworCQlyZXQgPSBwYXJzZV9ldmVudHMoZXZsaXN0LCBlLT5uYW1lLCAwKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZGVidWcoImZhaWxlZCB0byBwYXJzZSBldmVudCAnJXMnLCBlcnIgJWRcbiIsCisJCQkJIGUtPm5hbWUsIHJldCk7CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IGUtPmNoZWNrKGV2bGlzdCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlwZXJmX2V2bGlzdF9fZGVsZXRlKGV2bGlzdCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KIHN0YXRpYyBzdHJ1Y3QgdGVzdCB7CiAJY29uc3QgY2hhciAqZGVzYzsKIAlpbnQgKCpmdW5jKSh2b2lkKTsKQEAgLTYyMSw2ICs4NjIsMTAgQEAKIAkJLmZ1bmMgPSB0ZXN0X19iYXNpY19tbWFwLAogCX0sCiAJeworCQkuZGVzYyA9ICJwYXJzZSBldmVudHMgdGVzdHMiLAorCQkuZnVuYyA9IHRlc3RfX3BhcnNlX2V2ZW50cywKKwl9LAorCXsKIAkJLmZ1bmMgPSBOVUxMLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCmluZGV4IGYyZjNmNDkuLmE0MzQzM2YgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKQEAgLTk5MCw3ICs5OTAsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0gewogCU9QVF9DQUxMQkFDSygnZScsICJldmVudCIsICZ0b3AuZXZsaXN0LCAiZXZlbnQiLAogCQkgICAgICJldmVudCBzZWxlY3Rvci4gdXNlICdwZXJmIGxpc3QnIHRvIGxpc3QgYXZhaWxhYmxlIGV2ZW50cyIsCi0JCSAgICAgcGFyc2VfZXZlbnRzKSwKKwkJICAgICBwYXJzZV9ldmVudHNfb3B0aW9uKSwKIAlPUFRfSU5URUdFUignYycsICJjb3VudCIsICZkZWZhdWx0X2ludGVydmFsLAogCQkgICAgImV2ZW50IHBlcmlvZCB0byBzYW1wbGUiKSwKIAlPUFRfSU5URUdFUigncCcsICJwaWQiLCAmdG9wLnRhcmdldF9waWQsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvUEVSRi1WRVJTSU9OLUdFTiBiL3Rvb2xzL3BlcmYvdXRpbC9QRVJGLVZFUlNJT04tR0VOCmluZGV4IDI2ZDRkM2YuLmFkNzMzMDAgMTAwNzU1Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9QRVJGLVZFUlNJT04tR0VOCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9QRVJGLVZFUlNJT04tR0VOCkBAIC0yMywxMiArMjMsNyBAQAogdGhlbgogCVZOPSQoZWNobyAiJFZOIiB8IHNlZCAtZSAncy8tLy4vZycpOwogZWxzZQotCWV2YWwgJChncmVwICdeVkVSU0lPTltbOnNwYWNlOl1dKj0nIC4uLy4uL01ha2VmaWxlfHRyIC1kICcgJykKLQlldmFsICQoZ3JlcCAnXlBBVENITEVWRUxbWzpzcGFjZTpdXSo9JyAuLi8uLi9NYWtlZmlsZXx0ciAtZCAnICcpCi0JZXZhbCAkKGdyZXAgJ15TVUJMRVZFTFtbOnNwYWNlOl1dKj0nIC4uLy4uL01ha2VmaWxlfHRyIC1kICcgJykKLQlldmFsICQoZ3JlcCAnXkVYVFJBVkVSU0lPTltbOnNwYWNlOl1dKj0nIC4uLy4uL01ha2VmaWxlfHRyIC1kICcgJykKLQotCVZOPSIke1ZFUlNJT059LiR7UEFUQ0hMRVZFTH0uJHtTVUJMRVZFTH0ke0VYVFJBVkVSU0lPTn0iCisJVk49JChNQUtFRkxBR1M9IG1ha2UgLXNDIC4uLy4uIGtlcm5lbHZlcnNpb24pCiBmaQogCiBWTj0kKGV4cHIgIiRWTiIgOiB2KidcKC4qXCknKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2NhbGxjaGFpbi5oIGIvdG9vbHMvcGVyZi91dGlsL2NhbGxjaGFpbi5oCmluZGV4IDFhNzlkZjkuLjliNGZmMTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uaAorKysgYi90b29scy9wZXJmL3V0aWwvY2FsbGNoYWluLmgKQEAgLTE0LDYgKzE0LDExIEBACiAJQ0hBSU5fR1JBUEhfUkVMCiB9OwogCitlbnVtIGNoYWluX29yZGVyIHsKKwlPUkRFUl9DQUxMRVIsCisJT1JERVJfQ0FMTEVFCit9OworCiBzdHJ1Y3QgY2FsbGNoYWluX25vZGUgewogCXN0cnVjdCBjYWxsY2hhaW5fbm9kZQkqcGFyZW50OwogCXN0cnVjdCBsaXN0X2hlYWQJc2libGluZ3M7CkBAIC00MSw2ICs0Niw3IEBACiAJdTMyCQkJcHJpbnRfbGltaXQ7CiAJZG91YmxlCQkJbWluX3BlcmNlbnQ7CiAJc29ydF9jaGFpbl9mdW5jX3QJc29ydDsKKwllbnVtIGNoYWluX29yZGVyCW9yZGVyOwogfTsKIAogc3RydWN0IGNhbGxjaGFpbl9saXN0IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguYyBiL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGRmNDBmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2R3YXJmLWF1eC5jCkBAIC0wLDAgKzEsNjYzIEBACisvKgorICogZHdhcmYtYXV4LmMgOiBsaWJkdyBhdXhpbGlhcnkgaW50ZXJmYWNlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZHdhcmYtYXV4LmgiCisKKy8qKgorICogY3VfZmluZF9yZWFscGF0aCAtIEZpbmQgdGhlIHJlYWxwYXRoIG9mIHRoZSB0YXJnZXQgZmlsZQorICogQGN1X2RpZTogQSBESUUoZHdhcmYgaW5mb3JtYXRpb24gZW50cnkpIG9mIENVKGNvbXBpbGF0aW9uIFVuaXQpCisgKiBAZm5hbWU6ICBUaGUgdGFpbCBmaWxlbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUKKyAqCisgKiBGaW5kIHRoZSByZWFsKGxvbmcpIHBhdGggb2YgQGZuYW1lIGluIEBjdV9kaWUuCisgKi8KK2NvbnN0IGNoYXIgKmN1X2ZpbmRfcmVhbHBhdGgoRHdhcmZfRGllICpjdV9kaWUsIGNvbnN0IGNoYXIgKmZuYW1lKQoreworCUR3YXJmX0ZpbGVzICpmaWxlczsKKwlzaXplX3QgbmZpbGVzLCBpOworCWNvbnN0IGNoYXIgKnNyYyA9IE5VTEw7CisJaW50IHJldDsKKworCWlmICghZm5hbWUpCisJCXJldHVybiBOVUxMOworCisJcmV0ID0gZHdhcmZfZ2V0c3JjZmlsZXMoY3VfZGllLCAmZmlsZXMsICZuZmlsZXMpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmZpbGVzOyBpKyspIHsKKwkJc3JjID0gZHdhcmZfZmlsZXNyYyhmaWxlcywgaSwgTlVMTCwgTlVMTCk7CisJCWlmIChzdHJ0YWlsY21wKHNyYywgZm5hbWUpID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gbmZpbGVzKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc3JjOworfQorCisvKioKKyAqIGN1X2dldF9jb21wX2RpciAtIEdldCB0aGUgcGF0aCBvZiBjb21waWxhdGlvbiBkaXJlY3RvcnkKKyAqIEBjdV9kaWU6IGEgQ1UgRElFCisgKgorICogR2V0IHRoZSBwYXRoIG9mIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSBvZiBnaXZlbiBAY3VfZGllLgorICogU2luY2UgdGhpcyBkZXBlbmRzIG9uIERXX0FUX2NvbXBfZGlyLCBvbGRlciBnY2Mgd2lsbCBub3QKKyAqIGVtYmVkZGVkIGl0LiBJbiB0aGF0IGNhc2UsIHRoaXMgcmV0dXJucyBOVUxMLgorICovCitjb25zdCBjaGFyICpjdV9nZXRfY29tcF9kaXIoRHdhcmZfRGllICpjdV9kaWUpCit7CisJRHdhcmZfQXR0cmlidXRlIGF0dHI7CisJaWYgKGR3YXJmX2F0dHIoY3VfZGllLCBEV19BVF9jb21wX2RpciwgJmF0dHIpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBkd2FyZl9mb3Jtc3RyaW5nKCZhdHRyKTsKK30KKworLyoqCisgKiBjdV9maW5kX2xpbmVpbmZvIC0gR2V0IGEgbGluZSBudW1iZXIgYW5kIGZpbGUgbmFtZSBmb3IgZ2l2ZW4gYWRkcmVzcworICogQGN1X2RpZTogYSBDVSBESUUKKyAqIEBhZGRyOiBBbiBhZGRyZXNzCisgKiBAZm5hbWU6IGEgcG9pbnRlciB3aGljaCByZXR1cm5zIHRoZSBmaWxlIG5hbWUgc3RyaW5nCisgKiBAbGluZW5vOiBhIHBvaW50ZXIgd2hpY2ggcmV0dXJucyB0aGUgbGluZSBudW1iZXIKKyAqCisgKiBGaW5kIGEgbGluZSBudW1iZXIgYW5kIGZpbGUgbmFtZSBmb3IgQGFkZHIgaW4gQGN1X2RpZS4KKyAqLworaW50IGN1X2ZpbmRfbGluZWluZm8oRHdhcmZfRGllICpjdV9kaWUsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJICAgIGNvbnN0IGNoYXIgKipmbmFtZSwgaW50ICpsaW5lbm8pCit7CisJRHdhcmZfTGluZSAqbGluZTsKKwlEd2FyZl9BZGRyIGxhZGRyOworCisJbGluZSA9IGR3YXJmX2dldHNyY19kaWUoY3VfZGllLCAoRHdhcmZfQWRkcilhZGRyKTsKKwlpZiAobGluZSAmJiBkd2FyZl9saW5lYWRkcihsaW5lLCAmbGFkZHIpID09IDAgJiYKKwkgICAgYWRkciA9PSAodW5zaWduZWQgbG9uZylsYWRkciAmJiBkd2FyZl9saW5lbm8obGluZSwgbGluZW5vKSA9PSAwKSB7CisJCSpmbmFtZSA9IGR3YXJmX2xpbmVzcmMobGluZSwgTlVMTCwgTlVMTCk7CisJCWlmICghKmZuYW1lKQorCQkJLyogbGluZSBudW1iZXIgaXMgdXNlbGVzcyB3aXRob3V0IGZpbGVuYW1lICovCisJCQkqbGluZW5vID0gMDsKKwl9CisKKwlyZXR1cm4gKmxpbmVubyA/OiAtRU5PRU5UOworfQorCisvKioKKyAqIGRpZV9jb21wYXJlX25hbWUgLSBDb21wYXJlIGRpZW5hbWUgYW5kIHRuYW1lCisgKiBAZHdfZGllOiBhIERJRQorICogQHRuYW1lOiBhIHN0cmluZyBvZiB0YXJnZXQgbmFtZQorICoKKyAqIENvbXBhcmUgdGhlIG5hbWUgb2YgQGR3X2RpZSBhbmQgQHRuYW1lLiBSZXR1cm4gZmFsc2UgaWYgQGR3X2RpZSBoYXMgbm8gbmFtZS4KKyAqLworYm9vbCBkaWVfY29tcGFyZV9uYW1lKER3YXJmX0RpZSAqZHdfZGllLCBjb25zdCBjaGFyICp0bmFtZSkKK3sKKwljb25zdCBjaGFyICpuYW1lOworCW5hbWUgPSBkd2FyZl9kaWVuYW1lKGR3X2RpZSk7CisJcmV0dXJuIG5hbWUgPyAoc3RyY21wKHRuYW1lLCBuYW1lKSA9PSAwKSA6IGZhbHNlOworfQorCisvKioKKyAqIGRpZV9nZXRfY2FsbF9saW5lbm8gLSBHZXQgY2FsbHNpdGUgbGluZSBudW1iZXIgb2YgaW5saW5lLWZ1bmN0aW9uIGluc3RhbmNlCisgKiBAaW5fZGllOiBhIERJRSBvZiBhbiBpbmxpbmVkIGZ1bmN0aW9uIGluc3RhbmNlCisgKgorICogR2V0IGNhbGwtc2l0ZSBsaW5lIG51bWJlciBvZiBAaW5fZGllLiBUaGlzIG1lYW5zIGZyb20gd2hlcmUgdGhlIGlubGluZQorICogZnVuY3Rpb24gaXMgY2FsbGVkLgorICovCitpbnQgZGllX2dldF9jYWxsX2xpbmVubyhEd2FyZl9EaWUgKmluX2RpZSkKK3sKKwlEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKKwlEd2FyZl9Xb3JkIHJldDsKKworCWlmICghZHdhcmZfYXR0cihpbl9kaWUsIERXX0FUX2NhbGxfbGluZSwgJmF0dHIpKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWR3YXJmX2Zvcm11ZGF0YSgmYXR0ciwgJnJldCk7CisJcmV0dXJuIChpbnQpcmV0OworfQorCisvKioKKyAqIGRpZV9nZXRfdHlwZSAtIEdldCB0eXBlIERJRQorICogQHZyX2RpZTogYSBESUUgb2YgYSB2YXJpYWJsZQorICogQGRpZV9tZW06IHdoZXJlIHRvIHN0b3JlIGEgdHlwZSBESUUKKyAqCisgKiBHZXQgYSBESUUgb2YgdGhlIHR5cGUgb2YgZ2l2ZW4gdmFyaWFibGUgKEB2cl9kaWUpLCBhbmQgc3RvcmUKKyAqIGl0IHRvIGRpZV9tZW0uIFJldHVybiBOVUxMIGlmIGZhaWxzIHRvIGdldCBhIHR5cGUgRElFLgorICovCitEd2FyZl9EaWUgKmRpZV9nZXRfdHlwZShEd2FyZl9EaWUgKnZyX2RpZSwgRHdhcmZfRGllICpkaWVfbWVtKQoreworCUR3YXJmX0F0dHJpYnV0ZSBhdHRyOworCisJaWYgKGR3YXJmX2F0dHJfaW50ZWdyYXRlKHZyX2RpZSwgRFdfQVRfdHlwZSwgJmF0dHIpICYmCisJICAgIGR3YXJmX2Zvcm1yZWZfZGllKCZhdHRyLCBkaWVfbWVtKSkKKwkJcmV0dXJuIGRpZV9tZW07CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworLyogR2V0IGEgdHlwZSBkaWUsIGJ1dCBza2lwIHF1YWxpZmllcnMgKi8KK3N0YXRpYyBEd2FyZl9EaWUgKl9fZGllX2dldF9yZWFsX3R5cGUoRHdhcmZfRGllICp2cl9kaWUsIER3YXJmX0RpZSAqZGllX21lbSkKK3sKKwlpbnQgdGFnOworCisJZG8geworCQl2cl9kaWUgPSBkaWVfZ2V0X3R5cGUodnJfZGllLCBkaWVfbWVtKTsKKwkJaWYgKCF2cl9kaWUpCisJCQlicmVhazsKKwkJdGFnID0gZHdhcmZfdGFnKHZyX2RpZSk7CisJfSB3aGlsZSAodGFnID09IERXX1RBR19jb25zdF90eXBlIHx8CisJCSB0YWcgPT0gRFdfVEFHX3Jlc3RyaWN0X3R5cGUgfHwKKwkJIHRhZyA9PSBEV19UQUdfdm9sYXRpbGVfdHlwZSB8fAorCQkgdGFnID09IERXX1RBR19zaGFyZWRfdHlwZSk7CisKKwlyZXR1cm4gdnJfZGllOworfQorCisvKioKKyAqIGRpZV9nZXRfcmVhbF90eXBlIC0gR2V0IGEgdHlwZSBkaWUsIGJ1dCBza2lwIHF1YWxpZmllcnMgYW5kIHR5cGVkZWYKKyAqIEB2cl9kaWU6IGEgRElFIG9mIGEgdmFyaWFibGUKKyAqIEBkaWVfbWVtOiB3aGVyZSB0byBzdG9yZSBhIHR5cGUgRElFCisgKgorICogR2V0IGEgRElFIG9mIHRoZSB0eXBlIG9mIGdpdmVuIHZhcmlhYmxlIChAdnJfZGllKSwgYW5kIHN0b3JlCisgKiBpdCB0byBkaWVfbWVtLiBSZXR1cm4gTlVMTCBpZiBmYWlscyB0byBnZXQgYSB0eXBlIERJRS4KKyAqIElmIHRoZSB0eXBlIGlzIHF1YWxpZmllcnMgKGUuZy4gY29uc3QpIG9yIHR5cGVkZWYsIHRoaXMgc2tpcHMgaXQKKyAqIGFuZCB0cmllcyB0byBmaW5kIHJlYWwgdHlwZSAoc3RydWN0dXJlIG9yIGJhc2ljIHR5cGVzLCBlLmcuIGludCkuCisgKi8KK0R3YXJmX0RpZSAqZGllX2dldF9yZWFsX3R5cGUoRHdhcmZfRGllICp2cl9kaWUsIER3YXJmX0RpZSAqZGllX21lbSkKK3sKKwlkbyB7CisJCXZyX2RpZSA9IF9fZGllX2dldF9yZWFsX3R5cGUodnJfZGllLCBkaWVfbWVtKTsKKwl9IHdoaWxlICh2cl9kaWUgJiYgZHdhcmZfdGFnKHZyX2RpZSkgPT0gRFdfVEFHX3R5cGVkZWYpOworCisJcmV0dXJuIHZyX2RpZTsKK30KKworLyogR2V0IGF0dHJpYnV0ZSBhbmQgdHJhbnNsYXRlIGl0IGFzIGEgdWRhdGEgKi8KK3N0YXRpYyBpbnQgZGllX2dldF9hdHRyX3VkYXRhKER3YXJmX0RpZSAqdHBfZGllLCB1bnNpZ25lZCBpbnQgYXR0cl9uYW1lLAorCQkJICAgICAgRHdhcmZfV29yZCAqcmVzdWx0KQoreworCUR3YXJmX0F0dHJpYnV0ZSBhdHRyOworCisJaWYgKGR3YXJmX2F0dHIodHBfZGllLCBhdHRyX25hbWUsICZhdHRyKSA9PSBOVUxMIHx8CisJICAgIGR3YXJmX2Zvcm11ZGF0YSgmYXR0ciwgcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGRpZV9pc19zaWduZWRfdHlwZSAtIENoZWNrIHdoZXRoZXIgYSB0eXBlIERJRSBpcyBzaWduZWQgb3Igbm90CisgKiBAdHBfZGllOiBhIERJRSBvZiBhIHR5cGUKKyAqCisgKiBHZXQgdGhlIGVuY29kaW5nIG9mIEB0cF9kaWUgYW5kIHJldHVybiB0cnVlIGlmIHRoZSBlbmNvZGluZworICogaXMgc2lnbmVkLgorICovCitib29sIGRpZV9pc19zaWduZWRfdHlwZShEd2FyZl9EaWUgKnRwX2RpZSkKK3sKKwlEd2FyZl9Xb3JkIHJldDsKKworCWlmIChkaWVfZ2V0X2F0dHJfdWRhdGEodHBfZGllLCBEV19BVF9lbmNvZGluZywgJnJldCkpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiAocmV0ID09IERXX0FURV9zaWduZWRfY2hhciB8fCByZXQgPT0gRFdfQVRFX3NpZ25lZCB8fAorCQlyZXQgPT0gRFdfQVRFX3NpZ25lZF9maXhlZCk7Cit9CisKKy8qKgorICogZGllX2dldF9kYXRhX21lbWJlcl9sb2NhdGlvbiAtIEdldCB0aGUgZGF0YS1tZW1iZXIgb2Zmc2V0CisgKiBAbWJfZGllOiBhIERJRSBvZiBhIG1lbWJlciBvZiBhIGRhdGEgc3RydWN0dXJlCisgKiBAb2ZmczogVGhlIG9mZnNldCBvZiB0aGUgbWVtYmVyIGluIHRoZSBkYXRhIHN0cnVjdHVyZQorICoKKyAqIEdldCB0aGUgb2Zmc2V0IG9mIEBtYl9kaWUgaW4gdGhlIGRhdGEgc3RydWN0dXJlIGluY2x1ZGluZyBAbWJfZGllLCBhbmQKKyAqIHN0b3JlcyByZXN1bHQgb2Zmc2V0IHRvIEBvZmZzLiBJZiBhbnkgZXJyb3Igb2NjdXJzIHRoaXMgcmV0dXJucyBlcnJuby4KKyAqLworaW50IGRpZV9nZXRfZGF0YV9tZW1iZXJfbG9jYXRpb24oRHdhcmZfRGllICptYl9kaWUsIER3YXJmX1dvcmQgKm9mZnMpCit7CisJRHdhcmZfQXR0cmlidXRlIGF0dHI7CisJRHdhcmZfT3AgKmV4cHI7CisJc2l6ZV90IG5leHByOworCWludCByZXQ7CisKKwlpZiAoZHdhcmZfYXR0cihtYl9kaWUsIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uLCAmYXR0cikgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAoZHdhcmZfZm9ybXVkYXRhKCZhdHRyLCBvZmZzKSAhPSAwKSB7CisJCS8qIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uIHNob3VsZCBiZSBEV19PUF9wbHVzX3Vjb25zdCAqLworCQlyZXQgPSBkd2FyZl9nZXRsb2NhdGlvbigmYXR0ciwgJmV4cHIsICZuZXhwcik7CisJCWlmIChyZXQgPCAwIHx8IG5leHByID09IDApCisJCQlyZXR1cm4gLUVOT0VOVDsKKworCQlpZiAoZXhwclswXS5hdG9tICE9IERXX09QX3BsdXNfdWNvbnN0IHx8IG5leHByICE9IDEpIHsKKwkJCXByX2RlYnVnKCJVbmFibGUgdG8gZ2V0IG9mZnNldDpVbmV4cGVjdGVkIE9QICV4ICglemQpXG4iLAorCQkJCSBleHByWzBdLmF0b20sIG5leHByKTsKKwkJCXJldHVybiAtRU5PVFNVUDsKKwkJfQorCQkqb2ZmcyA9IChEd2FyZl9Xb3JkKWV4cHJbMF0ubnVtYmVyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkaWVfZmluZF9jaGlsZCAtIEdlbmVyaWMgRElFIHNlYXJjaCBmdW5jdGlvbiBpbiBESUUgdHJlZQorICogQHJ0X2RpZTogYSByb290IERJRQorICogQGNhbGxiYWNrOiBhIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAZGF0YTogYSB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICogQGRpZV9tZW06IGEgYnVmZmVyIGZvciByZXN1bHQgRElFCisgKgorICogVHJhY2UgRElFIHRyZWUgZnJvbSBAcnRfZGllIGFuZCBjYWxsIEBjYWxsYmFjayBmb3IgZWFjaCBjaGlsZCBESUUuCisgKiBJZiBAY2FsbGJhY2sgcmV0dXJucyBESUVfRklORF9DQl9FTkQsIHRoaXMgc3RvcmVzIHRoZSBESUUgaW50bworICogQGRpZV9tZW0gYW5kIHJldHVybnMgaXQuIElmIEBjYWxsYmFjayByZXR1cm5zIERJRV9GSU5EX0NCX0NPTlRJTlVFLAorICogdGhpcyBjb250aW51ZXMgdG8gdHJhY2UgdGhlIHRyZWUuIE9wdGlvbmFsbHksIEBjYWxsYmFjayBjYW4gcmV0dXJuCisgKiBESUVfRklORF9DQl9DSElMRCBhbmQgRElFX0ZJTkRfQ0JfU0lCTElORywgdGhvc2UgbWVhbnMgdHJhY2Ugb25seQorICogdGhlIGNoaWxkcmVuIGFuZCB0cmFjZSBvbmx5IHRoZSBzaWJsaW5ncyByZXNwZWN0aXZlbHkuCisgKiBSZXR1cm5zIE5VTEwgaWYgQGNhbGxiYWNrIGNhbid0IGZpbmQgYW55IGFwcHJvcHJpYXRlIERJRS4KKyAqLworRHdhcmZfRGllICpkaWVfZmluZF9jaGlsZChEd2FyZl9EaWUgKnJ0X2RpZSwKKwkJCSAgaW50ICgqY2FsbGJhY2spKER3YXJmX0RpZSAqLCB2b2lkICopLAorCQkJICB2b2lkICpkYXRhLCBEd2FyZl9EaWUgKmRpZV9tZW0pCit7CisJRHdhcmZfRGllIGNoaWxkX2RpZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHdhcmZfY2hpbGQocnRfZGllLCBkaWVfbWVtKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiBOVUxMOworCisJZG8geworCQlyZXQgPSBjYWxsYmFjayhkaWVfbWVtLCBkYXRhKTsKKwkJaWYgKHJldCA9PSBESUVfRklORF9DQl9FTkQpCisJCQlyZXR1cm4gZGllX21lbTsKKworCQlpZiAoKHJldCAmIERJRV9GSU5EX0NCX0NISUxEKSAmJgorCQkgICAgZGllX2ZpbmRfY2hpbGQoZGllX21lbSwgY2FsbGJhY2ssIGRhdGEsICZjaGlsZF9kaWUpKSB7CisJCQltZW1jcHkoZGllX21lbSwgJmNoaWxkX2RpZSwgc2l6ZW9mKER3YXJmX0RpZSkpOworCQkJcmV0dXJuIGRpZV9tZW07CisJCX0KKwl9IHdoaWxlICgocmV0ICYgRElFX0ZJTkRfQ0JfU0lCTElORykgJiYKKwkJIGR3YXJmX3NpYmxpbmdvZihkaWVfbWVtLCBkaWVfbWVtKSA9PSAwKTsKKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgX19hZGRyX2RpZV9zZWFyY2hfcGFyYW0geworCUR3YXJmX0FkZHIJYWRkcjsKKwlEd2FyZl9EaWUJKmRpZV9tZW07Cit9OworCisvKiBkaWVfZmluZCBjYWxsYmFjayBmb3Igbm9uLWlubGluZWQgZnVuY3Rpb24gc2VhcmNoICovCitzdGF0aWMgaW50IF9fZGllX3NlYXJjaF9mdW5jX2NiKER3YXJmX0RpZSAqZm5fZGllLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBfX2FkZHJfZGllX3NlYXJjaF9wYXJhbSAqYWQgPSBkYXRhOworCisJaWYgKGR3YXJmX3RhZyhmbl9kaWUpID09IERXX1RBR19zdWJwcm9ncmFtICYmCisJICAgIGR3YXJmX2hhc3BjKGZuX2RpZSwgYWQtPmFkZHIpKSB7CisJCW1lbWNweShhZC0+ZGllX21lbSwgZm5fZGllLCBzaXplb2YoRHdhcmZfRGllKSk7CisJCXJldHVybiBEV0FSRl9DQl9BQk9SVDsKKwl9CisJcmV0dXJuIERXQVJGX0NCX09LOworfQorCisvKioKKyAqIGRpZV9maW5kX3JlYWxmdW5jIC0gU2VhcmNoIGEgbm9uLWlubGluZWQgZnVuY3Rpb24gYXQgZ2l2ZW4gYWRkcmVzcworICogQGN1X2RpZTogYSBDVSBESUUgd2hpY2ggaW5jbHVkaW5nIEBhZGRyCisgKiBAYWRkcjogdGFyZ2V0IGFkZHJlc3MKKyAqIEBkaWVfbWVtOiBhIGJ1ZmZlciBmb3IgcmVzdWx0IERJRQorICoKKyAqIFNlYXJjaCBhIG5vbi1pbmxpbmVkIGZ1bmN0aW9uIERJRSB3aGljaCBpbmNsdWRlcyBAYWRkci4gU3RvcmVzIHRoZQorICogRElFIHRvIEBkaWVfbWVtIGFuZCByZXR1cm5zIGl0IGlmIGZvdW5kLiBSZXR1cm5zIE5VTGwgaWYgZmFpbGVkLgorICovCitEd2FyZl9EaWUgKmRpZV9maW5kX3JlYWxmdW5jKER3YXJmX0RpZSAqY3VfZGllLCBEd2FyZl9BZGRyIGFkZHIsCisJCQkJICAgIER3YXJmX0RpZSAqZGllX21lbSkKK3sKKwlzdHJ1Y3QgX19hZGRyX2RpZV9zZWFyY2hfcGFyYW0gYWQ7CisJYWQuYWRkciA9IGFkZHI7CisJYWQuZGllX21lbSA9IGRpZV9tZW07CisJLyogZHdhcmZfZ2V0c2NvcGVzIGNhbid0IGZpbmQgc3VicHJvZ3JhbS4gKi8KKwlpZiAoIWR3YXJmX2dldGZ1bmNzKGN1X2RpZSwgX19kaWVfc2VhcmNoX2Z1bmNfY2IsICZhZCwgMCkpCisJCXJldHVybiBOVUxMOworCWVsc2UKKwkJcmV0dXJuIGRpZV9tZW07Cit9CisKKy8qIGRpZV9maW5kIGNhbGxiYWNrIGZvciBpbmxpbmUgZnVuY3Rpb24gc2VhcmNoICovCitzdGF0aWMgaW50IF9fZGllX2ZpbmRfaW5saW5lX2NiKER3YXJmX0RpZSAqZGllX21lbSwgdm9pZCAqZGF0YSkKK3sKKwlEd2FyZl9BZGRyICphZGRyID0gZGF0YTsKKworCWlmIChkd2FyZl90YWcoZGllX21lbSkgPT0gRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSAmJgorCSAgICBkd2FyZl9oYXNwYyhkaWVfbWVtLCAqYWRkcikpCisJCXJldHVybiBESUVfRklORF9DQl9FTkQ7CisKKwlyZXR1cm4gRElFX0ZJTkRfQ0JfQ09OVElOVUU7Cit9CisKKy8qKgorICogZGllX2ZpbmRfaW5saW5lZnVuYyAtIFNlYXJjaCBhbiBpbmxpbmVkIGZ1bmN0aW9uIGF0IGdpdmVuIGFkZHJlc3MKKyAqIEBjdV9kaWU6IGEgQ1UgRElFIHdoaWNoIGluY2x1ZGluZyBAYWRkcgorICogQGFkZHI6IHRhcmdldCBhZGRyZXNzCisgKiBAZGllX21lbTogYSBidWZmZXIgZm9yIHJlc3VsdCBESUUKKyAqCisgKiBTZWFyY2ggYW4gaW5saW5lZCBmdW5jdGlvbiBESUUgd2hpY2ggaW5jbHVkZXMgQGFkZHIuIFN0b3JlcyB0aGUKKyAqIERJRSB0byBAZGllX21lbSBhbmQgcmV0dXJucyBpdCBpZiBmb3VuZC4gUmV0dXJucyBOVUxsIGlmIGZhaWxlZC4KKyAqIElmIHNldmVyYWwgaW5saW5lZCBmdW5jdGlvbnMgYXJlIGV4cGFuZGVkIHJlY3Vyc2l2ZWx5LCB0aGlzIHRyYWNlCisgKiBpdCBhbmQgcmV0dXJucyBkZWVwZXN0IG9uZS4KKyAqLworRHdhcmZfRGllICpkaWVfZmluZF9pbmxpbmVmdW5jKER3YXJmX0RpZSAqc3BfZGllLCBEd2FyZl9BZGRyIGFkZHIsCisJCQkgICAgICAgRHdhcmZfRGllICpkaWVfbWVtKQoreworCUR3YXJmX0RpZSB0bXBfZGllOworCisJc3BfZGllID0gZGllX2ZpbmRfY2hpbGQoc3BfZGllLCBfX2RpZV9maW5kX2lubGluZV9jYiwgJmFkZHIsICZ0bXBfZGllKTsKKwlpZiAoIXNwX2RpZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBJbmxpbmVkIGZ1bmN0aW9uIGNvdWxkIGJlIHJlY3Vyc2l2ZS4gVHJhY2UgaXQgdW50aWwgZmFpbCAqLworCXdoaWxlIChzcF9kaWUpIHsKKwkJbWVtY3B5KGRpZV9tZW0sIHNwX2RpZSwgc2l6ZW9mKER3YXJmX0RpZSkpOworCQlzcF9kaWUgPSBkaWVfZmluZF9jaGlsZChzcF9kaWUsIF9fZGllX2ZpbmRfaW5saW5lX2NiLCAmYWRkciwKKwkJCQkJJnRtcF9kaWUpOworCX0KKworCXJldHVybiBkaWVfbWVtOworfQorCisvKiBMaW5lIHdhbGtlciBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgX19saW5lX3dhbGtfcGFyYW0geworCWNvbnN0IGNoYXIgKmZuYW1lOworCWxpbmVfd2Fsa19jYWxsYmFja190IGNhbGxiYWNrOworCXZvaWQgKmRhdGE7CisJaW50IHJldHZhbDsKK307CisKK3N0YXRpYyBpbnQgX19kaWVfd2Fsa19mdW5jbGluZXNfY2IoRHdhcmZfRGllICppbl9kaWUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IF9fbGluZV93YWxrX3BhcmFtICpsdyA9IGRhdGE7CisJRHdhcmZfQWRkciBhZGRyOworCWludCBsaW5lbm87CisKKwlpZiAoZHdhcmZfdGFnKGluX2RpZSkgPT0gRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSkgeworCQlsaW5lbm8gPSBkaWVfZ2V0X2NhbGxfbGluZW5vKGluX2RpZSk7CisJCWlmIChsaW5lbm8gPiAwICYmIGR3YXJmX2VudHJ5cGMoaW5fZGllLCAmYWRkcikgPT0gMCkgeworCQkJbHctPnJldHZhbCA9IGx3LT5jYWxsYmFjayhsdy0+Zm5hbWUsIGxpbmVubywgYWRkciwKKwkJCQkJCSAgbHctPmRhdGEpOworCQkJaWYgKGx3LT5yZXR2YWwgIT0gMCkKKwkJCQlyZXR1cm4gRElFX0ZJTkRfQ0JfRU5EOworCQl9CisJfQorCXJldHVybiBESUVfRklORF9DQl9TSUJMSU5HOworfQorCisvKiBXYWxrIG9uIGxpbmVzIG9mIGJsb2NrcyBpbmNsdWRlZCBpbiBnaXZlbiBESUUgKi8KK3N0YXRpYyBpbnQgX19kaWVfd2Fsa19mdW5jbGluZXMoRHdhcmZfRGllICpzcF9kaWUsCisJCQkJbGluZV93YWxrX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IF9fbGluZV93YWxrX3BhcmFtIGx3ID0geworCQkuY2FsbGJhY2sgPSBjYWxsYmFjaywKKwkJLmRhdGEgPSBkYXRhLAorCQkucmV0dmFsID0gMCwKKwl9OworCUR3YXJmX0RpZSBkaWVfbWVtOworCUR3YXJmX0FkZHIgYWRkcjsKKwlpbnQgbGluZW5vOworCisJLyogSGFuZGxlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGxpbmUgKi8KKwlsdy5mbmFtZSA9IGR3YXJmX2RlY2xfZmlsZShzcF9kaWUpOworCWlmIChsdy5mbmFtZSAmJiBkd2FyZl9kZWNsX2xpbmUoc3BfZGllLCAmbGluZW5vKSA9PSAwICYmCisJICAgIGR3YXJmX2VudHJ5cGMoc3BfZGllLCAmYWRkcikgPT0gMCkgeworCQlsdy5yZXR2YWwgPSBjYWxsYmFjayhsdy5mbmFtZSwgbGluZW5vLCBhZGRyLCBkYXRhKTsKKwkJaWYgKGx3LnJldHZhbCAhPSAwKQorCQkJZ290byBkb25lOworCX0KKwlkaWVfZmluZF9jaGlsZChzcF9kaWUsIF9fZGllX3dhbGtfZnVuY2xpbmVzX2NiLCAmbHcsICZkaWVfbWVtKTsKK2RvbmU6CisJcmV0dXJuIGx3LnJldHZhbDsKK30KKworc3RhdGljIGludCBfX2RpZV93YWxrX2N1bGluZXNfY2IoRHdhcmZfRGllICpzcF9kaWUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IF9fbGluZV93YWxrX3BhcmFtICpsdyA9IGRhdGE7CisKKwlsdy0+cmV0dmFsID0gX19kaWVfd2Fsa19mdW5jbGluZXMoc3BfZGllLCBsdy0+Y2FsbGJhY2ssIGx3LT5kYXRhKTsKKwlpZiAobHctPnJldHZhbCAhPSAwKQorCQlyZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7CisKKwlyZXR1cm4gRFdBUkZfQ0JfT0s7Cit9CisKKy8qKgorICogZGllX3dhbGtfbGluZXMgLSBXYWxrIG9uIGxpbmVzIGluc2lkZSBnaXZlbiBESUUKKyAqIEBydF9kaWU6IGEgcm9vdCBESUUgKENVIG9yIHN1YnByb2dyYW0pCisgKiBAY2FsbGJhY2s6IGNhbGxiYWNrIHJvdXRpbmUKKyAqIEBkYXRhOiB1c2VyIGRhdGEKKyAqCisgKiBXYWxrIG9uIGFsbCBsaW5lcyBpbnNpZGUgZ2l2ZW4gQHJ0X2RpZSBhbmQgY2FsbCBAY2FsbGJhY2sgb24gZWFjaCBsaW5lLgorICogSWYgdGhlIEBydF9kaWUgaXMgYSBmdW5jdGlvbiwgd2FsayBvbmx5IG9uIHRoZSBsaW5lcyBpbnNpZGUgdGhlIGZ1bmN0aW9uLAorICogb3RoZXJ3aXNlIEBydF9kaWUgbXVzdCBiZSBhIENVIERJRS4KKyAqIE5vdGUgdGhhdCB0aGlzIHdhbGtzIG5vdCBvbmx5IGR3YXJmIGxpbmUgbGlzdCwgYnV0IGFsc28gZnVuY3Rpb24gZW50cmllcworICogYW5kIGlubGluZSBjYWxsLXNpdGUuCisgKi8KK2ludCBkaWVfd2Fsa19saW5lcyhEd2FyZl9EaWUgKnJ0X2RpZSwgbGluZV93YWxrX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCit7CisJRHdhcmZfTGluZXMgKmxpbmVzOworCUR3YXJmX0xpbmUgKmxpbmU7CisJRHdhcmZfQWRkciBhZGRyOworCWNvbnN0IGNoYXIgKmZuYW1lOworCWludCBsaW5lbm8sIHJldCA9IDA7CisJRHdhcmZfRGllIGRpZV9tZW0sICpjdV9kaWU7CisJc2l6ZV90IG5saW5lcywgaTsKKworCS8qIEdldCB0aGUgQ1UgZGllICovCisJaWYgKGR3YXJmX3RhZyhydF9kaWUpID09IERXX1RBR19zdWJwcm9ncmFtKQorCQljdV9kaWUgPSBkd2FyZl9kaWVjdShydF9kaWUsICZkaWVfbWVtLCBOVUxMLCBOVUxMKTsKKwllbHNlCisJCWN1X2RpZSA9IHJ0X2RpZTsKKwlpZiAoIWN1X2RpZSkgeworCQlwcl9kZWJ1ZzIoIkZhaWxlZCB0byBnZXQgQ1UgZnJvbSBzdWJwcm9ncmFtXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR2V0IGxpbmVzIGxpc3QgaW4gdGhlIENVICovCisJaWYgKGR3YXJmX2dldHNyY2xpbmVzKGN1X2RpZSwgJmxpbmVzLCAmbmxpbmVzKSAhPSAwKSB7CisJCXByX2RlYnVnMigiRmFpbGVkIHRvIGdldCBzb3VyY2UgbGluZXMgb24gdGhpcyBDVS5cbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJcHJfZGVidWcyKCJHZXQgJXpkIGxpbmVzIGZyb20gdGhpcyBDVVxuIiwgbmxpbmVzKTsKKworCS8qIFdhbGsgb24gdGhlIGxpbmVzIG9uIGxpbmVzIGxpc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmxpbmVzOyBpKyspIHsKKwkJbGluZSA9IGR3YXJmX29uZXNyY2xpbmUobGluZXMsIGkpOworCQlpZiAobGluZSA9PSBOVUxMIHx8CisJCSAgICBkd2FyZl9saW5lbm8obGluZSwgJmxpbmVubykgIT0gMCB8fAorCQkgICAgZHdhcmZfbGluZWFkZHIobGluZSwgJmFkZHIpICE9IDApIHsKKwkJCXByX2RlYnVnMigiRmFpbGVkIHRvIGdldCBsaW5lIGluZm8uICIKKwkJCQkgICJQb3NzaWJsZSBlcnJvciBpbiBkZWJ1Z2luZm8uXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEZpbHRlciBsaW5lcyBiYXNlZCBvbiBhZGRyZXNzICovCisJCWlmIChydF9kaWUgIT0gY3VfZGllKQorCQkJLyoKKwkJCSAqIEFkZHJlc3MgZmlsdGVyaW5nCisJCQkgKiBUaGUgbGluZSBpcyBpbmNsdWRlZCBpbiBnaXZlbiBmdW5jdGlvbiwgYW5kCisJCQkgKiBubyBpbmxpbmUgYmxvY2sgaW5jbHVkZXMgaXQuCisJCQkgKi8KKwkJCWlmICghZHdhcmZfaGFzcGMocnRfZGllLCBhZGRyKSB8fAorCQkJICAgIGRpZV9maW5kX2lubGluZWZ1bmMocnRfZGllLCBhZGRyLCAmZGllX21lbSkpCisJCQkJY29udGludWU7CisJCS8qIEdldCBzb3VyY2UgbGluZSAqLworCQlmbmFtZSA9IGR3YXJmX2xpbmVzcmMobGluZSwgTlVMTCwgTlVMTCk7CisKKwkJcmV0ID0gY2FsbGJhY2soZm5hbWUsIGxpbmVubywgYWRkciwgZGF0YSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBEd2FyZiBsaW5lcyBkb2Vzbid0IGluY2x1ZGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBpbmxpbmVkCisJICogc3Vicm91dGluZXMuIFdlIGhhdmUgdG8gY2hlY2sgZnVuY3Rpb25zIGxpc3Qgb3IgZ2l2ZW4gZnVuY3Rpb24uCisJICovCisJaWYgKHJ0X2RpZSAhPSBjdV9kaWUpCisJCXJldCA9IF9fZGllX3dhbGtfZnVuY2xpbmVzKHJ0X2RpZSwgY2FsbGJhY2ssIGRhdGEpOworCWVsc2UgeworCQlzdHJ1Y3QgX19saW5lX3dhbGtfcGFyYW0gcGFyYW0gPSB7CisJCQkuY2FsbGJhY2sgPSBjYWxsYmFjaywKKwkJCS5kYXRhID0gZGF0YSwKKwkJCS5yZXR2YWwgPSAwLAorCQl9OworCQlkd2FyZl9nZXRmdW5jcyhjdV9kaWUsIF9fZGllX3dhbGtfY3VsaW5lc19jYiwgJnBhcmFtLCAwKTsKKwkJcmV0ID0gcGFyYW0ucmV0dmFsOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBfX2ZpbmRfdmFyaWFibGVfcGFyYW0geworCWNvbnN0IGNoYXIgKm5hbWU7CisJRHdhcmZfQWRkciBhZGRyOworfTsKKworc3RhdGljIGludCBfX2RpZV9maW5kX3ZhcmlhYmxlX2NiKER3YXJmX0RpZSAqZGllX21lbSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgX19maW5kX3ZhcmlhYmxlX3BhcmFtICpmdnAgPSBkYXRhOworCWludCB0YWc7CisKKwl0YWcgPSBkd2FyZl90YWcoZGllX21lbSk7CisJaWYgKCh0YWcgPT0gRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIgfHwKKwkgICAgIHRhZyA9PSBEV19UQUdfdmFyaWFibGUpICYmCisJICAgIGRpZV9jb21wYXJlX25hbWUoZGllX21lbSwgZnZwLT5uYW1lKSkKKwkJcmV0dXJuIERJRV9GSU5EX0NCX0VORDsKKworCWlmIChkd2FyZl9oYXNwYyhkaWVfbWVtLCBmdnAtPmFkZHIpKQorCQlyZXR1cm4gRElFX0ZJTkRfQ0JfQ09OVElOVUU7CisJZWxzZQorCQlyZXR1cm4gRElFX0ZJTkRfQ0JfU0lCTElORzsKK30KKworLyoqCisgKiBkaWVfZmluZF92YXJpYWJsZV9hdCAtIEZpbmQgYSBnaXZlbiBuYW1lIHZhcmlhYmxlIGF0IGdpdmVuIGFkZHJlc3MKKyAqIEBzcF9kaWU6IGEgZnVuY3Rpb24gRElFCisgKiBAbmFtZTogdmFyaWFibGUgbmFtZQorICogQGFkZHI6IGFkZHJlc3MKKyAqIEBkaWVfbWVtOiBhIGJ1ZmZlciBmb3IgcmVzdWx0IERJRQorICoKKyAqIEZpbmQgYSB2YXJpYWJsZSBESUUgY2FsbGVkIEBuYW1lIGF0IEBhZGRyIGluIEBzcF9kaWUuCisgKi8KK0R3YXJmX0RpZSAqZGllX2ZpbmRfdmFyaWFibGVfYXQoRHdhcmZfRGllICpzcF9kaWUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJRHdhcmZfQWRkciBhZGRyLCBEd2FyZl9EaWUgKmRpZV9tZW0pCit7CisJc3RydWN0IF9fZmluZF92YXJpYWJsZV9wYXJhbSBmdnAgPSB7IC5uYW1lID0gbmFtZSwgLmFkZHIgPSBhZGRyfTsKKworCXJldHVybiBkaWVfZmluZF9jaGlsZChzcF9kaWUsIF9fZGllX2ZpbmRfdmFyaWFibGVfY2IsICh2b2lkICopJmZ2cCwKKwkJCSAgICAgIGRpZV9tZW0pOworfQorCitzdGF0aWMgaW50IF9fZGllX2ZpbmRfbWVtYmVyX2NiKER3YXJmX0RpZSAqZGllX21lbSwgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGF0YTsKKworCWlmICgoZHdhcmZfdGFnKGRpZV9tZW0pID09IERXX1RBR19tZW1iZXIpICYmCisJICAgIGRpZV9jb21wYXJlX25hbWUoZGllX21lbSwgbmFtZSkpCisJCXJldHVybiBESUVfRklORF9DQl9FTkQ7CisKKwlyZXR1cm4gRElFX0ZJTkRfQ0JfU0lCTElORzsKK30KKworLyoqCisgKiBkaWVfZmluZF9tZW1iZXIgLSBGaW5kIGEgZ2l2ZW4gbmFtZSBtZW1iZXIgaW4gYSBkYXRhIHN0cnVjdHVyZQorICogQHN0X2RpZTogYSBkYXRhIHN0cnVjdHVyZSB0eXBlIERJRQorICogQG5hbWU6IG1lbWJlciBuYW1lCisgKiBAZGllX21lbTogYSBidWZmZXIgZm9yIHJlc3VsdCBESUUKKyAqCisgKiBGaW5kIGEgbWVtYmVyIERJRSBjYWxsZWQgQG5hbWUgaW4gQHN0X2RpZS4KKyAqLworRHdhcmZfRGllICpkaWVfZmluZF9tZW1iZXIoRHdhcmZfRGllICpzdF9kaWUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICBEd2FyZl9EaWUgKmRpZV9tZW0pCit7CisJcmV0dXJuIGRpZV9maW5kX2NoaWxkKHN0X2RpZSwgX19kaWVfZmluZF9tZW1iZXJfY2IsICh2b2lkICopbmFtZSwKKwkJCSAgICAgIGRpZV9tZW0pOworfQorCisvKioKKyAqIGRpZV9nZXRfdHlwZW5hbWUgLSBHZXQgdGhlIG5hbWUgb2YgZ2l2ZW4gdmFyaWFibGUgRElFCisgKiBAdnJfZGllOiBhIHZhcmlhYmxlIERJRQorICogQGJ1ZjogYSBidWZmZXIgZm9yIHJlc3VsdCB0eXBlIG5hbWUKKyAqIEBsZW46IGEgbWF4LWxlbmd0aCBvZiBAYnVmCisgKgorICogR2V0IHRoZSBuYW1lIG9mIEB2cl9kaWUgYW5kIHN0b3JlcyBpdCB0byBAYnVmLiBSZXR1cm4gdGhlIGFjdHVhbCBsZW5ndGgKKyAqIG9mIHR5cGUgbmFtZSBpZiBzdWNjZWVkZWQuIFJldHVybiAtRTJCSUcgaWYgQGxlbiBpcyBub3QgZW5vdWdoIGxvbmcsIGFuZAorICogUmV0dXJuIC1FTk9FTlQgaWYgZmFpbGVkIHRvIGZpbmQgdHlwZSBuYW1lLgorICogTm90ZSB0aGF0IHRoZSByZXN1bHQgd2lsbCBzdG9yZXMgdHlwZWRlZiBuYW1lIGlmIHBvc3NpYmxlLCBhbmQgc3RvcmVzCisgKiAiKihmdW5jdGlvbl90eXBlKSIgaWYgdGhlIHR5cGUgaXMgYSBmdW5jdGlvbiBwb2ludGVyLgorICovCitpbnQgZGllX2dldF90eXBlbmFtZShEd2FyZl9EaWUgKnZyX2RpZSwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCUR3YXJmX0RpZSB0eXBlOworCWludCB0YWcsIHJldCwgcmV0MjsKKwljb25zdCBjaGFyICp0bXAgPSAiIjsKKworCWlmIChfX2RpZV9nZXRfcmVhbF90eXBlKHZyX2RpZSwgJnR5cGUpID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCisJdGFnID0gZHdhcmZfdGFnKCZ0eXBlKTsKKwlpZiAodGFnID09IERXX1RBR19hcnJheV90eXBlIHx8IHRhZyA9PSBEV19UQUdfcG9pbnRlcl90eXBlKQorCQl0bXAgPSAiKiI7CisJZWxzZSBpZiAodGFnID09IERXX1RBR19zdWJyb3V0aW5lX3R5cGUpIHsKKwkJLyogRnVuY3Rpb24gcG9pbnRlciAqLworCQlyZXQgPSBzbnByaW50ZihidWYsIGxlbiwgIihmdW5jdGlvbl90eXBlKSIpOworCQlyZXR1cm4gKHJldCA+PSBsZW4pID8gLUUyQklHIDogcmV0OworCX0gZWxzZSB7CisJCWlmICghZHdhcmZfZGllbmFtZSgmdHlwZSkpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJaWYgKHRhZyA9PSBEV19UQUdfdW5pb25fdHlwZSkKKwkJCXRtcCA9ICJ1bmlvbiAiOworCQllbHNlIGlmICh0YWcgPT0gRFdfVEFHX3N0cnVjdHVyZV90eXBlKQorCQkJdG1wID0gInN0cnVjdCAiOworCQkvKiBXcml0ZSBhIGJhc2UgbmFtZSAqLworCQlyZXQgPSBzbnByaW50ZihidWYsIGxlbiwgIiVzJXMiLCB0bXAsIGR3YXJmX2RpZW5hbWUoJnR5cGUpKTsKKwkJcmV0dXJuIChyZXQgPj0gbGVuKSA/IC1FMkJJRyA6IHJldDsKKwl9CisJcmV0ID0gZGllX2dldF90eXBlbmFtZSgmdHlwZSwgYnVmLCBsZW4pOworCWlmIChyZXQgPiAwKSB7CisJCXJldDIgPSBzbnByaW50ZihidWYgKyByZXQsIGxlbiAtIHJldCwgIiVzIiwgdG1wKTsKKwkJcmV0ID0gKHJldDIgPj0gbGVuIC0gcmV0KSA/IC1FMkJJRyA6IHJldDIgKyByZXQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZGllX2dldF92YXJuYW1lIC0gR2V0IHRoZSBuYW1lIGFuZCB0eXBlIG9mIGdpdmVuIHZhcmlhYmxlIERJRQorICogQHZyX2RpZTogYSB2YXJpYWJsZSBESUUKKyAqIEBidWY6IGEgYnVmZmVyIGZvciB0eXBlIGFuZCB2YXJpYWJsZSBuYW1lCisgKiBAbGVuOiB0aGUgbWF4LWxlbmd0aCBvZiBAYnVmCisgKgorICogR2V0IHRoZSBuYW1lIGFuZCB0eXBlIG9mIEB2cl9kaWUgYW5kIHN0b3JlcyBpdCBpbiBAYnVmIGFzICJ0eXBlXHRuYW1lIi4KKyAqLworaW50IGRpZV9nZXRfdmFybmFtZShEd2FyZl9EaWUgKnZyX2RpZSwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCByZXQsIHJldDI7CisKKwlyZXQgPSBkaWVfZ2V0X3R5cGVuYW1lKHZyX2RpZSwgYnVmLCBsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCXByX2RlYnVnKCJGYWlsZWQgdG8gZ2V0IHR5cGUsIG1ha2UgaXQgdW5rbm93bi5cbiIpOworCQlyZXQgPSBzbnByaW50ZihidWYsIGxlbiwgIih1bmtub3duX3R5cGUpIik7CisJfQorCWlmIChyZXQgPiAwKSB7CisJCXJldDIgPSBzbnByaW50ZihidWYgKyByZXQsIGxlbiAtIHJldCwgIlx0JXMiLAorCQkJCWR3YXJmX2RpZW5hbWUodnJfZGllKSk7CisJCXJldCA9IChyZXQyID49IGxlbiAtIHJldCkgPyAtRTJCSUcgOiByZXQyICsgcmV0OworCX0KKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmggYi90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzYjIxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguaApAQCAtMCwwICsxLDEwMCBAQAorI2lmbmRlZiBfRFdBUkZfQVVYX0gKKyNkZWZpbmUgX0RXQVJGX0FVWF9ICisvKgorICogZHdhcmYtYXV4LmggOiBsaWJkdyBhdXhpbGlhcnkgaW50ZXJmYWNlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxkd2FyZi5oPgorI2luY2x1ZGUgPGVsZnV0aWxzL2xpYmR3Lmg+CisjaW5jbHVkZSA8ZWxmdXRpbHMvbGliZHdmbC5oPgorI2luY2x1ZGUgPGVsZnV0aWxzL3ZlcnNpb24uaD4KKworLyogRmluZCB0aGUgcmVhbHBhdGggb2YgdGhlIHRhcmdldCBmaWxlICovCitleHRlcm4gY29uc3QgY2hhciAqY3VfZmluZF9yZWFscGF0aChEd2FyZl9EaWUgKmN1X2RpZSwgY29uc3QgY2hhciAqZm5hbWUpOworCisvKiBHZXQgRFdfQVRfY29tcF9kaXIgKHNob3VsZCBiZSBOVUxMIHdpdGggb2xkZXIgZ2NjKSAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmN1X2dldF9jb21wX2RpcihEd2FyZl9EaWUgKmN1X2RpZSk7CisKKy8qIEdldCBhIGxpbmUgbnVtYmVyIGFuZCBmaWxlIG5hbWUgZm9yIGdpdmVuIGFkZHJlc3MgKi8KK2V4dGVybiBpbnQgY3VfZmluZF9saW5laW5mbyhEd2FyZl9EaWUgKmN1ZGllLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgICAgY29uc3QgY2hhciAqKmZuYW1lLCBpbnQgKmxpbmVubyk7CisKKy8qIENvbXBhcmUgZGllbmFtZSBhbmQgdG5hbWUgKi8KK2V4dGVybiBib29sIGRpZV9jb21wYXJlX25hbWUoRHdhcmZfRGllICpkd19kaWUsIGNvbnN0IGNoYXIgKnRuYW1lKTsKKworLyogR2V0IGNhbGxzaXRlIGxpbmUgbnVtYmVyIG9mIGlubGluZS1mdW5jdGlvbiBpbnN0YW5jZSAqLworZXh0ZXJuIGludCBkaWVfZ2V0X2NhbGxfbGluZW5vKER3YXJmX0RpZSAqaW5fZGllKTsKKworLyogR2V0IHR5cGUgZGllICovCitleHRlcm4gRHdhcmZfRGllICpkaWVfZ2V0X3R5cGUoRHdhcmZfRGllICp2cl9kaWUsIER3YXJmX0RpZSAqZGllX21lbSk7CisKKy8qIEdldCBhIHR5cGUgZGllLCBidXQgc2tpcCBxdWFsaWZpZXJzIGFuZCB0eXBlZGVmICovCitleHRlcm4gRHdhcmZfRGllICpkaWVfZ2V0X3JlYWxfdHlwZShEd2FyZl9EaWUgKnZyX2RpZSwgRHdhcmZfRGllICpkaWVfbWVtKTsKKworLyogQ2hlY2sgd2hldGhlciB0aGUgRElFIGlzIHNpZ25lZCBvciBub3QgKi8KK2V4dGVybiBib29sIGRpZV9pc19zaWduZWRfdHlwZShEd2FyZl9EaWUgKnRwX2RpZSk7CisKKy8qIEdldCBkYXRhX21lbWJlcl9sb2NhdGlvbiBvZmZzZXQgKi8KK2V4dGVybiBpbnQgZGllX2dldF9kYXRhX21lbWJlcl9sb2NhdGlvbihEd2FyZl9EaWUgKm1iX2RpZSwgRHdhcmZfV29yZCAqb2Zmcyk7CisKKy8qIFJldHVybiB2YWx1ZXMgZm9yIGRpZV9maW5kX2NoaWxkKCkgY2FsbGJhY2tzICovCitlbnVtIHsKKwlESUVfRklORF9DQl9FTkQgPSAwLAkJLyogRW5kIG9mIFNlYXJjaCAqLworCURJRV9GSU5EX0NCX0NISUxEID0gMSwJCS8qIFNlYXJjaCBvbmx5IGNoaWxkcmVuICovCisJRElFX0ZJTkRfQ0JfU0lCTElORyA9IDIsCS8qIFNlYXJjaCBvbmx5IHNpYmxpbmdzICovCisJRElFX0ZJTkRfQ0JfQ09OVElOVUUgPSAzLAkvKiBTZWFyY2ggY2hpbGRyZW4gYW5kIHNpYmxpbmdzICovCit9OworCisvKiBTZWFyY2ggY2hpbGQgRElFcyAqLworZXh0ZXJuIER3YXJmX0RpZSAqZGllX2ZpbmRfY2hpbGQoRHdhcmZfRGllICpydF9kaWUsCisJCQkJIGludCAoKmNhbGxiYWNrKShEd2FyZl9EaWUgKiwgdm9pZCAqKSwKKwkJCQkgdm9pZCAqZGF0YSwgRHdhcmZfRGllICpkaWVfbWVtKTsKKworLyogU2VhcmNoIGEgbm9uLWlubGluZWQgZnVuY3Rpb24gaW5jbHVkaW5nIGdpdmVuIGFkZHJlc3MgKi8KK2V4dGVybiBEd2FyZl9EaWUgKmRpZV9maW5kX3JlYWxmdW5jKER3YXJmX0RpZSAqY3VfZGllLCBEd2FyZl9BZGRyIGFkZHIsCisJCQkJICAgIER3YXJmX0RpZSAqZGllX21lbSk7CisKKy8qIFNlYXJjaCBhbiBpbmxpbmVkIGZ1bmN0aW9uIGluY2x1ZGluZyBnaXZlbiBhZGRyZXNzICovCitleHRlcm4gRHdhcmZfRGllICpkaWVfZmluZF9pbmxpbmVmdW5jKER3YXJmX0RpZSAqc3BfZGllLCBEd2FyZl9BZGRyIGFkZHIsCisJCQkJICAgICAgRHdhcmZfRGllICpkaWVfbWVtKTsKKworLyogV2Fsa2VyIG9uIGxpbmVzIChOb3RlOiBsaW5lIG51bWJlciB3aWxsIG5vdCBiZSBzb3J0ZWQpICovCit0eXBlZGVmIGludCAoKiBsaW5lX3dhbGtfY2FsbGJhY2tfdCkgKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbGluZW5vLAorCQkJCSAgICAgIER3YXJmX0FkZHIgYWRkciwgdm9pZCAqZGF0YSk7CisKKy8qCisgKiBXYWxrIG9uIGxpbmVzIGluc2lkZSBnaXZlbiBESUUuIElmIHRoZSBESUUgaXMgYSBzdWJwcm9ncmFtLCB3YWxrIG9ubHkgb24KKyAqIHRoZSBsaW5lcyBpbnNpZGUgdGhlIHN1YnByb2dyYW0sIG90aGVyd2lzZSB0aGUgRElFIG11c3QgYmUgYSBDVSBESUUuCisgKi8KK2V4dGVybiBpbnQgZGllX3dhbGtfbGluZXMoRHdhcmZfRGllICpydF9kaWUsIGxpbmVfd2Fsa19jYWxsYmFja190IGNhbGxiYWNrLAorCQkJICB2b2lkICpkYXRhKTsKKworLyogRmluZCBhIHZhcmlhYmxlIGNhbGxlZCAnbmFtZScgYXQgZ2l2ZW4gYWRkcmVzcyAqLworZXh0ZXJuIER3YXJmX0RpZSAqZGllX2ZpbmRfdmFyaWFibGVfYXQoRHdhcmZfRGllICpzcF9kaWUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgIER3YXJmX0FkZHIgYWRkciwgRHdhcmZfRGllICpkaWVfbWVtKTsKKworLyogRmluZCBhIG1lbWJlciBjYWxsZWQgJ25hbWUnICovCitleHRlcm4gRHdhcmZfRGllICpkaWVfZmluZF9tZW1iZXIoRHdhcmZfRGllICpzdF9kaWUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICBEd2FyZl9EaWUgKmRpZV9tZW0pOworCisvKiBHZXQgdGhlIG5hbWUgb2YgZ2l2ZW4gdmFyaWFibGUgRElFICovCitleHRlcm4gaW50IGRpZV9nZXRfdHlwZW5hbWUoRHdhcmZfRGllICp2cl9kaWUsIGNoYXIgKmJ1ZiwgaW50IGxlbik7CisKKy8qIEdldCB0aGUgbmFtZSBhbmQgdHlwZSBvZiBnaXZlbiB2YXJpYWJsZSBESUUsIHN0b3JlZCBhcyAidHlwZVx0bmFtZSIgKi8KK2V4dGVybiBpbnQgZGllX2dldF92YXJuYW1lKER3YXJmX0RpZSAqdnJfZGllLCBjaGFyICpidWYsIGludCBsZW4pOworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCmluZGV4IDBmZTlhZGYuLjNjMWI4YTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCkBAIC0zNSwyMiArMzUsNiBAQAogCXJldHVybiBwZXJmX2V2ZW50X19uYW1lc1tpZF07CiB9CiAKLWludCBwZXJmX3NhbXBsZV9zaXplKHU2NCBzYW1wbGVfdHlwZSkKLXsKLQl1NjQgbWFzayA9IHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfTUFTSzsKLQlpbnQgc2l6ZSA9IDA7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCQlpZiAobWFzayAmICgxVUxMIDw8IGkpKQotCQkJc2l6ZSsrOwotCX0KLQotCXNpemUgKj0gc2l6ZW9mKHU2NCk7Ci0KLQlyZXR1cm4gc2l6ZTsKLX0KLQogc3RhdGljIHN0cnVjdCBwZXJmX3NhbXBsZSBzeW50aF9zYW1wbGUgPSB7CiAJLnBpZAkgICA9IC0xLAogCS50aWQJICAgPSAtMSwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKaW5kZXggYzA4MzMyOC4uMWQ3ZjY2NCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKQEAgLTgyLDggKzgyLDYgQEAKIAlzdHJ1Y3QgaXBfY2FsbGNoYWluICpjYWxsY2hhaW47CiB9OwogCi1pbnQgcGVyZl9zYW1wbGVfc2l6ZSh1NjQgc2FtcGxlX3R5cGUpOwotCiAjZGVmaW5lIEJVSUxEX0lEX1NJWkUgMjAKIAogc3RydWN0IGJ1aWxkX2lkX2V2ZW50IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYwppbmRleCA1MGFhMzQ4Li5iMDIxZWE5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSAiZXZsaXN0LmgiCiAjaW5jbHVkZSAiZXZzZWwuaCIKICNpbmNsdWRlICJ1dGlsLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKIAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAKQEAgLTI1NywxOSArMjU2LDE1IEBACiAJcmV0dXJuIGV2bGlzdC0+bW1hcCAhPSBOVUxMID8gMCA6IC1FTk9NRU07CiB9CiAKLXN0YXRpYyBpbnQgX19wZXJmX2V2bGlzdF9fbW1hcChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorc3RhdGljIGludCBfX3BlcmZfZXZsaXN0X19tbWFwKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAogCQkJICAgICAgIGludCBpZHgsIGludCBwcm90LCBpbnQgbWFzaywgaW50IGZkKQogewogCWV2bGlzdC0+bW1hcFtpZHhdLnByZXYgPSAwOwogCWV2bGlzdC0+bW1hcFtpZHhdLm1hc2sgPSBtYXNrOwogCWV2bGlzdC0+bW1hcFtpZHhdLmJhc2UgPSBtbWFwKE5VTEwsIGV2bGlzdC0+bW1hcF9sZW4sIHByb3QsCiAJCQkJICAgICAgTUFQX1NIQVJFRCwgZmQsIDApOwotCWlmIChldmxpc3QtPm1tYXBbaWR4XS5iYXNlID09IE1BUF9GQUlMRUQpIHsKLQkJaWYgKGV2bGlzdC0+Y3B1cy0+bWFwW2lkeF0gPT0gLTEgJiYgZXZzZWwtPmF0dHIuaW5oZXJpdCkKLQkJCXVpX193YXJuaW5nKCJJbmhlcml0IGlzIG5vdCBhbGxvd2VkIG9uIHBlci10YXNrICIKLQkJCQkgICAgImV2ZW50cyB1c2luZyBtbWFwLlxuIik7CisJaWYgKGV2bGlzdC0+bW1hcFtpZHhdLmJhc2UgPT0gTUFQX0ZBSUxFRCkKIAkJcmV0dXJuIC0xOwotCX0KIAogCXBlcmZfZXZsaXN0X19hZGRfcG9sbGZkKGV2bGlzdCwgZmQpOwogCXJldHVybiAwOwpAQCAtMjg5LDcgKzI4NCw3IEBACiAKIAkJCQlpZiAob3V0cHV0ID09IC0xKSB7CiAJCQkJCW91dHB1dCA9IGZkOwotCQkJCQlpZiAoX19wZXJmX2V2bGlzdF9fbW1hcChldmxpc3QsIGV2c2VsLCBjcHUsCisJCQkJCWlmIChfX3BlcmZfZXZsaXN0X19tbWFwKGV2bGlzdCwgY3B1LAogCQkJCQkJCQlwcm90LCBtYXNrLCBvdXRwdXQpIDwgMCkKIAkJCQkJCWdvdG8gb3V0X3VubWFwOwogCQkJCX0gZWxzZSB7CkBAIC0zMjksNyArMzI0LDcgQEAKIAogCQkJaWYgKG91dHB1dCA9PSAtMSkgewogCQkJCW91dHB1dCA9IGZkOwotCQkJCWlmIChfX3BlcmZfZXZsaXN0X19tbWFwKGV2bGlzdCwgZXZzZWwsIHRocmVhZCwKKwkJCQlpZiAoX19wZXJmX2V2bGlzdF9fbW1hcChldmxpc3QsIHRocmVhZCwKIAkJCQkJCQlwcm90LCBtYXNrLCBvdXRwdXQpIDwgMCkKIAkJCQkJZ290byBvdXRfdW5tYXA7CiAJCQl9IGVsc2UgewpAQCAtNDYwLDMzICs0NTUsNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdTY0IHBlcmZfZXZsaXN0X19zYW1wbGVfdHlwZShzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKK2Jvb2wgcGVyZl9ldmxpc3RfX3ZhbGlkX3NhbXBsZV90eXBlKGNvbnN0IHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQogewotCXN0cnVjdCBwZXJmX2V2c2VsICpwb3M7Ci0JdTY0IHR5cGUgPSAwOworCXN0cnVjdCBwZXJmX2V2c2VsICpwb3MsICpmaXJzdDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmZXZsaXN0LT5lbnRyaWVzLCBub2RlKSB7Ci0JCWlmICghdHlwZSkKLQkJCXR5cGUgPSBwb3MtPmF0dHIuc2FtcGxlX3R5cGU7Ci0JCWVsc2UgaWYgKHR5cGUgIT0gcG9zLT5hdHRyLnNhbXBsZV90eXBlKQotCQkJZGllKCJub24gbWF0Y2hpbmcgc2FtcGxlX3R5cGUiKTsKKwlwb3MgPSBmaXJzdCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUocG9zLCAmZXZsaXN0LT5lbnRyaWVzLCBub2RlKSB7CisJCWlmIChmaXJzdC0+YXR0ci5zYW1wbGVfdHlwZSAhPSBwb3MtPmF0dHIuc2FtcGxlX3R5cGUpCisJCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcmV0dXJuIHR5cGU7CisJcmV0dXJuIHRydWU7Cit9CisKK3U2NCBwZXJmX2V2bGlzdF9fc2FtcGxlX3R5cGUoY29uc3Qgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKmZpcnN0OworCisJZmlyc3QgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CisJcmV0dXJuIGZpcnN0LT5hdHRyLnNhbXBsZV90eXBlOworfQorCitib29sIHBlcmZfZXZsaXN0X192YWxpZF9zYW1wbGVfaWRfYWxsKGNvbnN0IHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpwb3MsICpmaXJzdDsKKworCXBvcyA9IGZpcnN0ID0gbGlzdF9lbnRyeShldmxpc3QtPmVudHJpZXMubmV4dCwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShwb3MsICZldmxpc3QtPmVudHJpZXMsIG5vZGUpIHsKKwkJaWYgKGZpcnN0LT5hdHRyLnNhbXBsZV9pZF9hbGwgIT0gcG9zLT5hdHRyLnNhbXBsZV9pZF9hbGwpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgcGVyZl9ldmxpc3RfX3NhbXBsZV9pZF9hbGwoY29uc3Qgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCiB7Ci0JYm9vbCB2YWx1ZSA9IGZhbHNlLCBmaXJzdCA9IHRydWU7Ci0Jc3RydWN0IHBlcmZfZXZzZWwgKnBvczsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZmlyc3Q7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmV2bGlzdC0+ZW50cmllcywgbm9kZSkgewotCQlpZiAoZmlyc3QpIHsKLQkJCXZhbHVlID0gcG9zLT5hdHRyLnNhbXBsZV9pZF9hbGw7Ci0JCQlmaXJzdCA9IGZhbHNlOwotCQl9IGVsc2UgaWYgKHZhbHVlICE9IHBvcy0+YXR0ci5zYW1wbGVfaWRfYWxsKQotCQkJZGllKCJub24gbWF0Y2hpbmcgc2FtcGxlX2lkX2FsbCIpOwotCX0KLQotCXJldHVybiB2YWx1ZTsKKwlmaXJzdCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKwlyZXR1cm4gZmlyc3QtPmF0dHIuc2FtcGxlX2lkX2FsbDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuaAppbmRleCAwYTFlZjFmLi5iMmI4NjIzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5oCkBAIC02Niw3ICs2Niw5IEBACiB2b2lkIHBlcmZfZXZsaXN0X19kZWxldGVfbWFwcyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CiBpbnQgcGVyZl9ldmxpc3RfX3NldF9maWx0ZXJzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKIAotdTY0IHBlcmZfZXZsaXN0X19zYW1wbGVfdHlwZShzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7Ci1ib29sIHBlcmZfZXZsaXN0X19zYW1wbGVfaWRfYWxsKGNvbnN0IHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKK3U2NCBwZXJmX2V2bGlzdF9fc2FtcGxlX3R5cGUoY29uc3Qgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOworYm9vbCBwZXJmX2V2bGlzdF9fc2FtcGxlX2lkX2FsbChjb25zdCBjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CiAKK2Jvb2wgcGVyZl9ldmxpc3RfX3ZhbGlkX3NhbXBsZV90eXBlKGNvbnN0IHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKK2Jvb2wgcGVyZl9ldmxpc3RfX3ZhbGlkX3NhbXBsZV9pZF9hbGwoY29uc3Qgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOwogI2VuZGlmIC8qIF9fUEVSRl9FVkxJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuYwppbmRleCBjY2EyOWVkLi5hMDNhMzZiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZzZWwuYworKysgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuYwpAQCAtMTUsNiArMTUsMjIgQEAKIAogI2RlZmluZSBGRChlLCB4LCB5KSAoKihpbnQgKil4eWFycmF5X19lbnRyeShlLT5mZCwgeCwgeSkpCiAKK2ludCBfX3BlcmZfZXZzZWxfX3NhbXBsZV9zaXplKHU2NCBzYW1wbGVfdHlwZSkKK3sKKwl1NjQgbWFzayA9IHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfTUFTSzsKKwlpbnQgc2l6ZSA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQlpZiAobWFzayAmICgxVUxMIDw8IGkpKQorCQkJc2l6ZSsrOworCX0KKworCXNpemUgKj0gc2l6ZW9mKHU2NCk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKwogdm9pZCBwZXJmX2V2c2VsX19pbml0KHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKIAkJICAgICAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwgaW50IGlkeCkKIHsKQEAgLTM2MSw2ICszNzcsNyBAQAogCQlhcnJheSsrOwogCX0KIAorCWRhdGEtPmFkZHIgPSAwOwogCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfQUREUikgewogCQlkYXRhLT5hZGRyID0gKmFycmF5OwogCQlhcnJheSsrOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmggYi90b29scy9wZXJmL3V0aWwvZXZzZWwuaAppbmRleCBmNzliYjJjLi5lOWEzMTU1IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZzZWwuaAorKysgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuaApAQCAtNjEsNiArNjEsNyBAQAogCQlvZmZfdAkJaWRfb2Zmc2V0OwogCX07CiAJc3RydWN0IGNncm91cF9zZWwJKmNncnA7CisJYm9vbCAJCQlzdXBwb3J0ZWQ7CiB9OwogCiBzdHJ1Y3QgY3B1X21hcDsKQEAgLTE0OSw0ICsxNTAsMTEgQEAKIAlyZXR1cm4gX19wZXJmX2V2c2VsX19yZWFkKGV2c2VsLCBuY3B1cywgbnRocmVhZHMsIHRydWUpOwogfQogCitpbnQgX19wZXJmX2V2c2VsX19zYW1wbGVfc2l6ZSh1NjQgc2FtcGxlX3R5cGUpOworCitzdGF0aWMgaW5saW5lIGludCBwZXJmX2V2c2VsX19zYW1wbGVfc2l6ZShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpCit7CisJcmV0dXJuIF9fcGVyZl9ldnNlbF9fc2FtcGxlX3NpemUoZXZzZWwtPmF0dHIuc2FtcGxlX3R5cGUpOworfQorCiAjZW5kaWYgLyogX19QRVJGX0VWU0VMX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYwppbmRleCBhZmIwODQ5Li5jYjI5NTlhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jCkBAIC04NzcsOSArODc3LDEyIEBACiAJCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKIAkJb2ZmX3QgdG1wOwogCi0JCWlmIChwZXJmX2hlYWRlcl9fZ2V0YnVmZmVyNjQoaGVhZGVyLCBmZCwgJmZfYXR0ciwgc2l6ZW9mKGZfYXR0cikpKQorCQlpZiAocmVhZG4oZmQsICZmX2F0dHIsIHNpemVvZihmX2F0dHIpKSA8PSAwKQogCQkJZ290byBvdXRfZXJybm87CiAKKwkJaWYgKGhlYWRlci0+bmVlZHNfc3dhcCkKKwkJCXBlcmZfZXZlbnRfX2F0dHJfc3dhcCgmZl9hdHRyLmF0dHIpOworCiAJCXRtcCA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUik7CiAJCWV2c2VsID0gcGVyZl9ldnNlbF9fbmV3KCZmX2F0dHIuYXR0ciwgaSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMgYi90b29scy9wZXJmL3V0aWwvaGlzdC5jCmluZGV4IDYyN2EwMmUuLjY3N2UxZGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuYwpAQCAtMTQsNyArMTQsOCBAQAogCiBzdHJ1Y3QgY2FsbGNoYWluX3BhcmFtCWNhbGxjaGFpbl9wYXJhbSA9IHsKIAkubW9kZQk9IENIQUlOX0dSQVBIX1JFTCwKLQkubWluX3BlcmNlbnQgPSAwLjUKKwkubWluX3BlcmNlbnQgPSAwLjUsCisJLm9yZGVyICA9IE9SREVSX0NBTExFRQogfTsKIAogdTE2IGhpc3RzX19jb2xfbGVuKHN0cnVjdCBoaXN0cyAqc2VsZiwgZW51bSBoaXN0X2NvbHVtbiBjb2wpCkBAIC04NDYsNiArODQ3LDkgQEAKIAlmb3IgKG5kID0gcmJfZmlyc3QoJnNlbGYtPmVudHJpZXMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgewogCQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaCA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CiAKKwkJaWYgKGgtPmZpbHRlcmVkKQorCQkJY29udGludWU7CisKIAkJaWYgKHNob3dfZGlzcGxhY2VtZW50KSB7CiAJCQlpZiAoaC0+cGFpciAhPSBOVUxMKQogCQkJCWRpc3BsYWNlbWVudCA9ICgobG9uZyloLT5wYWlyLT5wb3NpdGlvbiAtCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKaW5kZXggNDE5ODJjMy4uNGVhN2UxOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwpAQCAtODYsMjIgKzg2LDI0IEBACiAKICNkZWZpbmUgTUFYX0FMSUFTRVMgOAogCi1zdGF0aWMgY29uc3QgY2hhciAqaHdfY2FjaGVbXVtNQVhfQUxJQVNFU10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqaHdfY2FjaGVbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdW01BWF9BTElBU0VTXSA9IHsKICB7ICJMMS1kY2FjaGUiLAkibDEtZCIsCQkibDFkIiwJCSJMMS1kYXRhIiwJCX0sCiAgeyAiTDEtaWNhY2hlIiwJImwxLWkiLAkJImwxaSIsCQkiTDEtaW5zdHJ1Y3Rpb24iLAl9LAotIHsgIkxMQyIsCSJMMiIJCQkJCQkJfSwKKyB7ICJMTEMiLAkiTDIiLAkJCQkJCQl9LAogIHsgImRUTEIiLAkiZC10bGIiLAkiRGF0YS1UTEIiLAkJCQl9LAogIHsgImlUTEIiLAkiaS10bGIiLAkiSW5zdHJ1Y3Rpb24tVExCIiwJCQl9LAogIHsgImJyYW5jaCIsCSJicmFuY2hlcyIsCSJicHUiLAkJImJ0YiIsCQkiYnBjIiwJfSwKKyB7ICJub2RlIiwJCQkJCQkJCX0sCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqaHdfY2FjaGVfb3BbXVtNQVhfQUxJQVNFU10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqaHdfY2FjaGVfb3BbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdW01BWF9BTElBU0VTXSA9IHsKICB7ICJsb2FkIiwJImxvYWRzIiwJInJlYWQiLAkJCQkJfSwKICB7ICJzdG9yZSIsCSJzdG9yZXMiLAkid3JpdGUiLAkJCQl9LAogIHsgInByZWZldGNoIiwJInByZWZldGNoZXMiLAkic3BlY3VsYXRpdmUtcmVhZCIsICJzcGVjdWxhdGl2ZS1sb2FkIiwJfSwKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpod19jYWNoZV9yZXN1bHRbXVtNQVhfQUxJQVNFU10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqaHdfY2FjaGVfcmVzdWx0W1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF0KKwkJCQkgIFtNQVhfQUxJQVNFU10gPSB7CiAgeyAicmVmcyIsCSJSZWZlcmVuY2UiLAkib3BzIiwJCSJhY2Nlc3MiLAkJfSwKICB7ICJtaXNzZXMiLAkibWlzcyIsCQkJCQkJCX0sCiB9OwpAQCAtMTI0LDYgKzEyNiw3IEBACiAgW0MoRFRMQildCT0gKENBQ0hFX1JFQUQgfCBDQUNIRV9XUklURSB8IENBQ0hFX1BSRUZFVENIKSwKICBbQyhJVExCKV0JPSAoQ0FDSEVfUkVBRCksCiAgW0MoQlBVKV0JPSAoQ0FDSEVfUkVBRCksCisgW0MoTk9ERSldCT0gKENBQ0hFX1JFQUQgfCBDQUNIRV9XUklURSB8IENBQ0hFX1BSRUZFVENIKSwKIH07CiAKICNkZWZpbmUgZm9yX2VhY2hfc3Vic3lzdGVtKHN5c19kaXIsIHN5c19kaXJlbnQsIHN5c19uZXh0KQkgICAgICAgXApAQCAtMzkzLDcgKzM5Niw3IEBACiAJCQkJCQlQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWCk7CiAJCQlpZiAoY2FjaGVfb3AgPj0gMCkgewogCQkJCWlmICghaXNfY2FjaGVfb3BfdmFsaWQoY2FjaGVfdHlwZSwgY2FjaGVfb3ApKQotCQkJCQlyZXR1cm4gMDsKKwkJCQkJcmV0dXJuIEVWVF9GQUlMRUQ7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCX0KQEAgLTQ3NSw3ICs0NzgsNyBAQAogLyogc3lzICsgJzonICsgZXZlbnQgKyAnOicgKyBmbGFncyovCiAjZGVmaW5lIE1BWF9FVk9QVF9MRU4JKE1BWF9FVkVOVF9MRU5HVEggKiAyICsgMiArIDEyOCkKIHN0YXRpYyBlbnVtIGV2ZW50X3Jlc3VsdAotcGFyc2VfbXVsdGlwbGVfdHJhY2Vwb2ludF9ldmVudChjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNoYXIgKnN5c19uYW1lLAorcGFyc2VfbXVsdGlwbGVfdHJhY2Vwb2ludF9ldmVudChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgY2hhciAqc3lzX25hbWUsCiAJCQkJY29uc3QgY2hhciAqZXZ0X2V4cCwgY2hhciAqZmxhZ3MpCiB7CiAJY2hhciBldnRfcGF0aFtNQVhQQVRITEVOXTsKQEAgLTUwOSw3ICs1MTIsNyBAQAogCQlpZiAobGVuIDwgMCkKIAkJCXJldHVybiBFVlRfRkFJTEVEOwogCi0JCWlmIChwYXJzZV9ldmVudHMob3B0LCBldmVudF9vcHQsIDApKQorCQlpZiAocGFyc2VfZXZlbnRzKGV2bGlzdCwgZXZlbnRfb3B0LCAwKSkKIAkJCXJldHVybiBFVlRfRkFJTEVEOwogCX0KIApAQCAtNTE3LDcgKzUyMCw3IEBACiB9CiAKIHN0YXRpYyBlbnVtIGV2ZW50X3Jlc3VsdAotcGFyc2VfdHJhY2Vwb2ludF9ldmVudChjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKipzdHJwLAorcGFyc2VfdHJhY2Vwb2ludF9ldmVudChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgY29uc3QgY2hhciAqKnN0cnAsCiAJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQogewogCWNvbnN0IGNoYXIgKmV2dF9uYW1lOwpAQCAtNTU3LDggKzU2MCw4IEBACiAJCXJldHVybiBFVlRfRkFJTEVEOwogCWlmIChzdHJwYnJrKGV2dF9uYW1lLCAiKj8iKSkgewogCQkqc3RycCArPSBzdHJsZW4oc3lzX25hbWUpICsgZXZ0X2xlbmd0aCArIDE7IC8qIDEgPT0gdGhlICc6JyAqLwotCQlyZXR1cm4gcGFyc2VfbXVsdGlwbGVfdHJhY2Vwb2ludF9ldmVudChvcHQsIHN5c19uYW1lLCBldnRfbmFtZSwKLQkJCQkJCSAgICAgICBmbGFncyk7CisJCXJldHVybiBwYXJzZV9tdWx0aXBsZV90cmFjZXBvaW50X2V2ZW50KGV2bGlzdCwgc3lzX25hbWUsCisJCQkJCQkgICAgICAgZXZ0X25hbWUsIGZsYWdzKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gcGFyc2Vfc2luZ2xlX3RyYWNlcG9pbnRfZXZlbnQoc3lzX25hbWUsIGV2dF9uYW1lLAogCQkJCQkJICAgICBldnRfbGVuZ3RoLCBhdHRyLCBzdHJwKTsKQEAgLTc3OCwxMiArNzgxLDEyIEBACiAgKiBTeW1ib2xpYyBuYW1lcyBhcmUgKGFsbW9zdCkgZXhhY3RseSBtYXRjaGVkLgogICovCiBzdGF0aWMgZW51bSBldmVudF9yZXN1bHQKLXBhcnNlX2V2ZW50X3N5bWJvbHMoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0LCBjb25zdCBjaGFyICoqc3RyLAorcGFyc2VfZXZlbnRfc3ltYm9scyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgY29uc3QgY2hhciAqKnN0ciwKIAkJICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCiB7CiAJZW51bSBldmVudF9yZXN1bHQgcmV0OwogCi0JcmV0ID0gcGFyc2VfdHJhY2Vwb2ludF9ldmVudChvcHQsIHN0ciwgYXR0cik7CisJcmV0ID0gcGFyc2VfdHJhY2Vwb2ludF9ldmVudChldmxpc3QsIHN0ciwgYXR0cik7CiAJaWYgKHJldCAhPSBFVlRfRkFJTEVEKQogCQlnb3RvIG1vZGlmaWVyOwogCkBAIC04MjIsOSArODI1LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgcGFyc2VfZXZlbnRzKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqc3RyLCBpbnQgdW5zZXQgX191c2VkKQoraW50IHBhcnNlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCAsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHVuc2V0IF9fdXNlZCkKIHsKLQlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCA9ICooc3RydWN0IHBlcmZfZXZsaXN0ICoqKW9wdC0+dmFsdWU7CiAJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyOwogCWVudW0gZXZlbnRfcmVzdWx0IHJldDsKIAljb25zdCBjaGFyICpvc3RyOwpAQCAtODMyLDcgKzgzNCw3IEBACiAJZm9yICg7OykgewogCQlvc3RyID0gc3RyOwogCQltZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdHRyKSk7Ci0JCXJldCA9IHBhcnNlX2V2ZW50X3N5bWJvbHMob3B0LCAmc3RyLCAmYXR0cik7CisJCXJldCA9IHBhcnNlX2V2ZW50X3N5bWJvbHMoZXZsaXN0LCAmc3RyLCAmYXR0cik7CiAJCWlmIChyZXQgPT0gRVZUX0ZBSUxFRCkKIAkJCXJldHVybiAtMTsKIApAQCAtODYzLDYgKzg2NSwxMyBAQAogCXJldHVybiAwOwogfQogCitpbnQgcGFyc2VfZXZlbnRzX29wdGlvbihjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKnN0ciwKKwkJCWludCB1bnNldCBfX3VzZWQpCit7CisJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QgPSAqKHN0cnVjdCBwZXJmX2V2bGlzdCAqKilvcHQtPnZhbHVlOworCXJldHVybiBwYXJzZV9ldmVudHMoZXZsaXN0LCBzdHIsIHVuc2V0KTsKK30KKwogaW50IHBhcnNlX2ZpbHRlcihjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKnN0ciwKIAkJIGludCB1bnNldCBfX3VzZWQpCiB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmggYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmgKaW5kZXggNzQ2ZDNmYy4uMmY4ZTM3NSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaApAQCAtOCw2ICs4LDcgQEAKIAogc3RydWN0IGxpc3RfaGVhZDsKIHN0cnVjdCBwZXJmX2V2c2VsOworc3RydWN0IHBlcmZfZXZsaXN0OwogCiBzdHJ1Y3Qgb3B0aW9uOwogCkBAIC0yNCw3ICsyNSwxMCBAQAogY29uc3QgY2hhciAqZXZlbnRfbmFtZShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZlbnQpOwogZXh0ZXJuIGNvbnN0IGNoYXIgKl9fZXZlbnRfbmFtZShpbnQgdHlwZSwgdTY0IGNvbmZpZyk7CiAKLWV4dGVybiBpbnQgcGFyc2VfZXZlbnRzKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqc3RyLCBpbnQgdW5zZXQpOworZXh0ZXJuIGludCBwYXJzZV9ldmVudHNfb3B0aW9uKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqc3RyLAorCQkJICAgICAgIGludCB1bnNldCk7CitleHRlcm4gaW50IHBhcnNlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgY29uc3QgY2hhciAqc3RyLAorCQkJaW50IHVuc2V0KTsKIGV4dGVybiBpbnQgcGFyc2VfZmlsdGVyKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqc3RyLCBpbnQgdW5zZXQpOwogCiAjZGVmaW5lIEVWRU5UU19IRUxQX01BWCAoMTI4KjEwMjQpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCmluZGV4IGYwMjIzMTYuLmI4MmQ1NGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCkBAIC0xMTcsNiArMTE3LDEwIEBACiAJc3RydWN0IHJiX25vZGUgKm5kOwogCXN0cnVjdCBtYXBfZ3JvdXBzICpncnAgPSAmbWFjaGluZS5rbWFwczsKIAorCS8qIEEgZmlsZSBwYXRoIC0tIHRoaXMgaXMgYW4gb2ZmbGluZSBtb2R1bGUgKi8KKwlpZiAobW9kdWxlICYmIHN0cmNocihtb2R1bGUsICcvJykpCisJCXJldHVybiBtYWNoaW5lX19uZXdfbW9kdWxlKCZtYWNoaW5lLCAwLCBtb2R1bGUpOworCiAJaWYgKCFtb2R1bGUpCiAJCW1vZHVsZSA9ICJrZXJuZWwiOwogCkBAIC0xNzAsMTYgKzE3NCwyNCBAQAogfQogCiAjaWZkZWYgRFdBUkZfU1VQUE9SVAotc3RhdGljIGludCBvcGVuX3ZtbGludXgoY29uc3QgY2hhciAqbW9kdWxlKQorLyogT3BlbiBuZXcgZGVidWdpbmZvIG9mIGdpdmVuIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBkZWJ1Z2luZm8gKm9wZW5fZGVidWdpbmZvKGNvbnN0IGNoYXIgKm1vZHVsZSkKIHsKLQljb25zdCBjaGFyICpwYXRoID0ga2VybmVsX2dldF9tb2R1bGVfcGF0aChtb2R1bGUpOwotCWlmICghcGF0aCkgewotCQlwcl9lcnIoIkZhaWxlZCB0byBmaW5kIHBhdGggb2YgJXMgbW9kdWxlLlxuIiwKLQkJICAgICAgIG1vZHVsZSA/OiAia2VybmVsIik7Ci0JCXJldHVybiAtRU5PRU5UOworCWNvbnN0IGNoYXIgKnBhdGg7CisKKwkvKiBBIGZpbGUgcGF0aCAtLSB0aGlzIGlzIGFuIG9mZmxpbmUgbW9kdWxlICovCisJaWYgKG1vZHVsZSAmJiBzdHJjaHIobW9kdWxlLCAnLycpKQorCQlwYXRoID0gbW9kdWxlOworCWVsc2UgeworCQlwYXRoID0ga2VybmVsX2dldF9tb2R1bGVfcGF0aChtb2R1bGUpOworCisJCWlmICghcGF0aCkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCBwYXRoIG9mICVzIG1vZHVsZS5cbiIsCisJCQkgICAgICAgbW9kdWxlID86ICJrZXJuZWwiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CiAJfQotCXByX2RlYnVnKCJUcnkgdG8gb3BlbiAlc1xuIiwgcGF0aCk7Ci0JcmV0dXJuIG9wZW4ocGF0aCwgT19SRE9OTFkpOworCXJldHVybiBkZWJ1Z2luZm9fX25ldyhwYXRoKTsKIH0KIAogLyoKQEAgLTE5MywxMyArMjA1LDI0IEBACiAJc3RydWN0IG1hcCAqbWFwOwogCXU2NCBhZGRyOwogCWludCByZXQgPSAtRU5PRU5UOworCXN0cnVjdCBkZWJ1Z2luZm8gKmRpbmZvOwogCiAJc3ltID0gX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKHRwLT5zeW1ib2wsICZtYXApOwogCWlmIChzeW0pIHsKIAkJYWRkciA9IG1hcC0+dW5tYXBfaXAobWFwLCBzeW0tPnN0YXJ0ICsgdHAtPm9mZnNldCk7CiAJCXByX2RlYnVnKCJ0cnkgdG8gZmluZCAlcyslbGRAJSIgUFJJeDY0ICJcbiIsIHRwLT5zeW1ib2wsCiAJCQkgdHAtPm9mZnNldCwgYWRkcik7Ci0JCXJldCA9IGZpbmRfcGVyZl9wcm9iZV9wb2ludCgodW5zaWduZWQgbG9uZylhZGRyLCBwcCk7CisKKwkJZGluZm8gPSBkZWJ1Z2luZm9fX25ld19vbmxpbmVfa2VybmVsKGFkZHIpOworCQlpZiAoZGluZm8pIHsKKwkJCXJldCA9IGRlYnVnaW5mb19fZmluZF9wcm9iZV9wb2ludChkaW5mbywKKwkJCQkJCSAodW5zaWduZWQgbG9uZylhZGRyLCBwcCk7CisJCQlkZWJ1Z2luZm9fX2RlbGV0ZShkaW5mbyk7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIG9wZW4gZGVidWdpbmZvIGF0IDB4JSIgUFJJeDY0ICJcbiIsCisJCQkJIGFkZHIpOworCQkJcmV0ID0gLUVOT0VOVDsKKwkJfQogCX0KIAlpZiAocmV0IDw9IDApIHsKIAkJcHJfZGVidWcoIkZhaWxlZCB0byBmaW5kIGNvcnJlc3BvbmRpbmcgcHJvYmVzIGZyb20gIgpAQCAtMjE0LDMwICsyMzcsNzAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhZGRfbW9kdWxlX3RvX3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldnMsCisJCQkJCSAgICBpbnQgbnRldnMsIGNvbnN0IGNoYXIgKm1vZHVsZSkKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwljaGFyICp0bXA7CisKKwlpZiAoIW1vZHVsZSkKKwkJcmV0dXJuIDA7CisKKwl0bXAgPSBzdHJyY2hyKG1vZHVsZSwgJy8nKTsKKwlpZiAodG1wKSB7CisJCS8qIFRoaXMgaXMgYSBtb2R1bGUgcGF0aCAtLSBnZXQgdGhlIG1vZHVsZSBuYW1lICovCisJCW1vZHVsZSA9IHN0cmR1cCh0bXAgKyAxKTsKKwkJaWYgKCFtb2R1bGUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJdG1wID0gc3RyY2hyKG1vZHVsZSwgJy4nKTsKKwkJaWYgKHRtcCkKKwkJCSp0bXAgPSAnXDAnOworCQl0bXAgPSAoY2hhciAqKW1vZHVsZTsJLyogRm9yIGZyZWUoKSAqLworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudGV2czsgaSsrKSB7CisJCXRldnNbaV0ucG9pbnQubW9kdWxlID0gc3RyZHVwKG1vZHVsZSk7CisJCWlmICghdGV2c1tpXS5wb2ludC5tb2R1bGUpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh0bXApCisJCWZyZWUodG1wKTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qIFRyeSB0byBmaW5kIHBlcmZfcHJvYmVfZXZlbnQgd2l0aCBkZWJ1Z2luZm8gKi8KIHN0YXRpYyBpbnQgdHJ5X3RvX2ZpbmRfcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCi0JCQkJCSAgIHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqKnRldnMsCi0JCQkJCSAgIGludCBtYXhfdGV2cywgY29uc3QgY2hhciAqbW9kdWxlKQorCQkJCQkgIHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqKnRldnMsCisJCQkJCSAgaW50IG1heF90ZXZzLCBjb25zdCBjaGFyICptb2R1bGUpCiB7CiAJYm9vbCBuZWVkX2R3YXJmID0gcGVyZl9wcm9iZV9ldmVudF9uZWVkX2R3YXJmKHBldik7Ci0JaW50IGZkLCBudGV2czsKKwlzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbyA9IG9wZW5fZGVidWdpbmZvKG1vZHVsZSk7CisJaW50IG50ZXZzLCByZXQgPSAwOwogCi0JZmQgPSBvcGVuX3ZtbGludXgobW9kdWxlKTsKLQlpZiAoZmQgPCAwKSB7CisJaWYgKCFkaW5mbykgewogCQlpZiAobmVlZF9kd2FyZikgewogCQkJcHJfd2FybmluZygiRmFpbGVkIHRvIG9wZW4gZGVidWdpbmZvIGZpbGUuXG4iKTsKLQkJCXJldHVybiBmZDsKKwkJCXJldHVybiAtRU5PRU5UOwogCQl9Ci0JCXByX2RlYnVnKCJDb3VsZCBub3Qgb3BlbiB2bWxpbnV4LiBUcnkgdG8gdXNlIHN5bWJvbHMuXG4iKTsKKwkJcHJfZGVidWcoIkNvdWxkIG5vdCBvcGVuIGRlYnVnaW5mby4gVHJ5IHRvIHVzZSBzeW1ib2xzLlxuIik7CiAJCXJldHVybiAwOwogCX0KIAotCS8qIFNlYXJjaGluZyB0cmFjZSBldmVudHMgY29ycmVzcG9uZGluZyB0byBwcm9iZSBldmVudCAqLwotCW50ZXZzID0gZmluZF9wcm9iZV90cmFjZV9ldmVudHMoZmQsIHBldiwgdGV2cywgbWF4X3RldnMpOworCS8qIFNlYXJjaGluZyB0cmFjZSBldmVudHMgY29ycmVzcG9uZGluZyB0byBhIHByb2JlIGV2ZW50ICovCisJbnRldnMgPSBkZWJ1Z2luZm9fX2ZpbmRfdHJhY2VfZXZlbnRzKGRpbmZvLCBwZXYsIHRldnMsIG1heF90ZXZzKTsKKworCWRlYnVnaW5mb19fZGVsZXRlKGRpbmZvKTsKIAogCWlmIChudGV2cyA+IDApIHsJLyogU3VjY2VlZGVkIHRvIGZpbmQgdHJhY2UgZXZlbnRzICovCiAJCXByX2RlYnVnKCJmaW5kICVkIHByb2JlX3RyYWNlX2V2ZW50cy5cbiIsIG50ZXZzKTsKLQkJcmV0dXJuIG50ZXZzOworCQlpZiAobW9kdWxlKQorCQkJcmV0ID0gYWRkX21vZHVsZV90b19wcm9iZV90cmFjZV9ldmVudHMoKnRldnMsIG50ZXZzLAorCQkJCQkJCSAgICAgICBtb2R1bGUpOworCQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IG50ZXZzOwogCX0KIAogCWlmIChudGV2cyA9PSAwKQl7CS8qIE5vIGVycm9yIGJ1dCBmYWlsZWQgdG8gZmluZCBwcm9iZSBwb2ludC4gKi8KQEAgLTM3MSw4ICs0MzQsOSBAQAogewogCWludCBsID0gMTsKIAlzdHJ1Y3QgbGluZV9ub2RlICpsbjsKKwlzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbzsKIAlGSUxFICpmcDsKLQlpbnQgZmQsIHJldDsKKwlpbnQgcmV0OwogCWNoYXIgKnRtcDsKIAogCS8qIFNlYXJjaCBhIGxpbmUgcmFuZ2UgKi8KQEAgLTM4MCwxMyArNDQ0LDE0IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlmZCA9IG9wZW5fdm1saW51eChtb2R1bGUpOwotCWlmIChmZCA8IDApIHsKKwlkaW5mbyA9IG9wZW5fZGVidWdpbmZvKG1vZHVsZSk7CisJaWYgKCFkaW5mbykgewogCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gb3BlbiBkZWJ1Z2luZm8gZmlsZS5cbiIpOwotCQlyZXR1cm4gZmQ7CisJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCXJldCA9IGZpbmRfbGluZV9yYW5nZShmZCwgbHIpOworCXJldCA9IGRlYnVnaW5mb19fZmluZF9saW5lX3JhbmdlKGRpbmZvLCBscik7CisJZGVidWdpbmZvX19kZWxldGUoZGluZm8pOwogCWlmIChyZXQgPT0gMCkgewogCQlwcl93YXJuaW5nKCJTcGVjaWZpZWQgc291cmNlIGxpbmUgaXMgbm90IGZvdW5kLlxuIik7CiAJCXJldHVybiAtRU5PRU5UOwpAQCAtNDQ4LDcgKzUxMyw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzaG93X2F2YWlsYWJsZV92YXJzX2F0KGludCBmZCwgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKK3N0YXRpYyBpbnQgc2hvd19hdmFpbGFibGVfdmFyc19hdChzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbywKKwkJCQkgIHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCiAJCQkJICBpbnQgbWF4X3Zscywgc3RydWN0IHN0cmZpbHRlciAqX2ZpbHRlciwKIAkJCQkgIGJvb2wgZXh0ZXJucykKIHsKQEAgLTQ2Myw3ICs1MjksOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlwcl9kZWJ1ZygiU2VhcmNoaW5nIHZhcmlhYmxlcyBhdCAlc1xuIiwgYnVmKTsKIAotCXJldCA9IGZpbmRfYXZhaWxhYmxlX3ZhcnNfYXQoZmQsIHBldiwgJnZscywgbWF4X3ZscywgZXh0ZXJucyk7CisJcmV0ID0gZGVidWdpbmZvX19maW5kX2F2YWlsYWJsZV92YXJzX2F0KGRpbmZvLCBwZXYsICZ2bHMsCisJCQkJCQltYXhfdmxzLCBleHRlcm5zKTsKIAlpZiAocmV0IDw9IDApIHsKIAkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCB2YXJpYWJsZXMgYXQgJXMgKCVkKVxuIiwgYnVmLCByZXQpOwogCQlnb3RvIGVuZDsKQEAgLTUwNCwyNCArNTcxLDI2IEBACiAJCQlpbnQgbWF4X3ZscywgY29uc3QgY2hhciAqbW9kdWxlLAogCQkJc3RydWN0IHN0cmZpbHRlciAqX2ZpbHRlciwgYm9vbCBleHRlcm5zKQogewotCWludCBpLCBmZCwgcmV0ID0gMDsKKwlpbnQgaSwgcmV0ID0gMDsKKwlzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbzsKIAogCXJldCA9IGluaXRfdm1saW51eCgpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCisJZGluZm8gPSBvcGVuX2RlYnVnaW5mbyhtb2R1bGUpOworCWlmICghZGluZm8pIHsKKwkJcHJfd2FybmluZygiRmFpbGVkIHRvIG9wZW4gZGVidWdpbmZvIGZpbGUuXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCiAJc2V0dXBfcGFnZXIoKTsKIAotCWZvciAoaSA9IDA7IGkgPCBucGV2cyAmJiByZXQgPj0gMDsgaSsrKSB7Ci0JCWZkID0gb3Blbl92bWxpbnV4KG1vZHVsZSk7Ci0JCWlmIChmZCA8IDApIHsKLQkJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBvcGVuIGRlYnVnIGluZm9ybWF0aW9uIGZpbGUuXG4iKTsKLQkJCXJldCA9IGZkOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0ID0gc2hvd19hdmFpbGFibGVfdmFyc19hdChmZCwgJnBldnNbaV0sIG1heF92bHMsIF9maWx0ZXIsCisJZm9yIChpID0gMDsgaSA8IG5wZXZzICYmIHJldCA+PSAwOyBpKyspCisJCXJldCA9IHNob3dfYXZhaWxhYmxlX3ZhcnNfYXQoZGluZm8sICZwZXZzW2ldLCBtYXhfdmxzLCBfZmlsdGVyLAogCQkJCQkgICAgIGV4dGVybnMpOwotCX0KKworCWRlYnVnaW5mb19fZGVsZXRlKGRpbmZvKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05OTAsNyArMTA1OSw3IEBACiAKIC8qIFBhcnNlIHByb2JlX2V2ZW50cyBldmVudCBpbnRvIHN0cnVjdCBwcm9iZV9wb2ludCAqLwogc3RhdGljIGludCBwYXJzZV9wcm9iZV90cmFjZV9jb21tYW5kKGNvbnN0IGNoYXIgKmNtZCwKLQkJCQkJc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICp0ZXYpCisJCQkJICAgICBzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldikKIHsKIAlzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgKnRwID0gJnRldi0+cG9pbnQ7CiAJY2hhciBwcjsKQEAgLTEwMjMsOCArMTA5MiwxNCBAQAogCiAJdHAtPnJldHByb2JlID0gKHByID09ICdyJyk7CiAKLQkvKiBTY2FuIGZ1bmN0aW9uIG5hbWUgYW5kIG9mZnNldCAqLwotCXJldCA9IHNzY2FuZihhcmd2WzFdLCAiJWFbXitdKyVsdSIsIChmbG9hdCAqKSh2b2lkICopJnRwLT5zeW1ib2wsCisJLyogU2NhbiBtb2R1bGUgbmFtZShpZiB0aGVyZSksIGZ1bmN0aW9uIG5hbWUgYW5kIG9mZnNldCAqLworCXAgPSBzdHJjaHIoYXJndlsxXSwgJzonKTsKKwlpZiAocCkgeworCQl0cC0+bW9kdWxlID0gc3RybmR1cChhcmd2WzFdLCBwIC0gYXJndlsxXSk7CisJCXArKzsKKwl9IGVsc2UKKwkJcCA9IGFyZ3ZbMV07CisJcmV0ID0gc3NjYW5mKHAsICIlYVteK10rJWx1IiwgKGZsb2F0ICopKHZvaWQgKikmdHAtPnN5bWJvbCwKIAkJICAgICAmdHAtPm9mZnNldCk7CiAJaWYgKHJldCA9PSAxKQogCQl0cC0+b2Zmc2V0ID0gMDsKQEAgLTEyNjksOSArMTM0NCwxMCBAQAogCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlsZW4gPSBlX3NucHJpbnRmKGJ1ZiwgTUFYX0NNRExFTiwgIiVjOiVzLyVzICVzKyVsdSIsCisJbGVuID0gZV9zbnByaW50ZihidWYsIE1BWF9DTURMRU4sICIlYzolcy8lcyAlcyVzJXMrJWx1IiwKIAkJCSB0cC0+cmV0cHJvYmUgPyAncicgOiAncCcsCiAJCQkgdGV2LT5ncm91cCwgdGV2LT5ldmVudCwKKwkJCSB0cC0+bW9kdWxlID86ICIiLCB0cC0+bW9kdWxlID8gIjoiIDogIiIsCiAJCQkgdHAtPnN5bWJvbCwgdHAtPm9mZnNldCk7CiAJaWYgKGxlbiA8PSAwKQogCQlnb3RvIGVycm9yOwpAQCAtMTM3OCw2ICsxNDU0LDggQEAKIAkJZnJlZSh0ZXYtPmdyb3VwKTsKIAlpZiAodGV2LT5wb2ludC5zeW1ib2wpCiAJCWZyZWUodGV2LT5wb2ludC5zeW1ib2wpOworCWlmICh0ZXYtPnBvaW50Lm1vZHVsZSkKKwkJZnJlZSh0ZXYtPnBvaW50Lm1vZHVsZSk7CiAJZm9yIChpID0gMDsgaSA8IHRldi0+bmFyZ3M7IGkrKykgewogCQlpZiAodGV2LT5hcmdzW2ldLm5hbWUpCiAJCQlmcmVlKHRldi0+YXJnc1tpXS5uYW1lKTsKQEAgLTE3MjksNyArMTgwNyw3IEBACiAJLyogQ29udmVydCBwZXJmX3Byb2JlX2V2ZW50IHdpdGggZGVidWdpbmZvICovCiAJcmV0ID0gdHJ5X3RvX2ZpbmRfcHJvYmVfdHJhY2VfZXZlbnRzKHBldiwgdGV2cywgbWF4X3RldnMsIG1vZHVsZSk7CiAJaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gcmV0OwkvKiBGb3VuZCBpbiBkZWJ1Z2luZm8gb3IgZ290IGFuIGVycm9yICovCiAKIAkvKiBBbGxvY2F0ZSB0cmFjZSBldmVudCBidWZmZXIgKi8KIAl0ZXYgPSAqdGV2cyA9IHphbGxvYyhzaXplb2Yoc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50KSk7CkBAIC0xNzQyLDYgKzE4MjAsMTEgQEAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKIAl9CisJdGV2LT5wb2ludC5tb2R1bGUgPSBzdHJkdXAobW9kdWxlKTsKKwlpZiAodGV2LT5wb2ludC5tb2R1bGUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KIAl0ZXYtPnBvaW50Lm9mZnNldCA9IHBldi0+cG9pbnQub2Zmc2V0OwogCXRldi0+cG9pbnQucmV0cHJvYmUgPSBwZXYtPnBvaW50LnJldHByb2JlOwogCXRldi0+bmFyZ3MgPSBwZXYtPm5hcmdzOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmggYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaAppbmRleCAzNDM0ZmM5Li5hN2RlZTgzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaApAQCAtMTAsNiArMTAsNyBAQAogLyoga3Byb2JlLXRyYWNlciB0cmFjaW5nIHBvaW50ICovCiBzdHJ1Y3QgcHJvYmVfdHJhY2VfcG9pbnQgewogCWNoYXIJCSpzeW1ib2w7CS8qIEJhc2Ugc3ltYm9sICovCisJY2hhcgkJKm1vZHVsZTsJLyogTW9kdWxlIG5hbWUgKi8KIAl1bnNpZ25lZCBsb25nCW9mZnNldDsJCS8qIE9mZnNldCBmcm9tIHN5bWJvbCAqLwogCWJvb2wJCXJldHByb2JlOwkvKiBSZXR1cm4gcHJvYmUgZmxhZyAqLwogfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYwppbmRleCAzYjlkMGI4Li4zZTQ0YTNlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jCkBAIC00MywyMSArNDMsNiBAQAogLyogS3Byb2JlIHRyYWNlciBiYXNpYyB0eXBlIGlzIHVwIHRvIHU2NCAqLwogI2RlZmluZSBNQVhfQkFTSUNfVFlQRV9CSVRTCTY0CiAKLS8qCi0gKiBDb21wYXJlIHRoZSB0YWlsIG9mIHR3byBzdHJpbmdzLgotICogUmV0dXJuIDAgaWYgd2hvbGUgb2YgZWl0aGVyIHN0cmluZyBpcyBzYW1lIGFzIGFub3RoZXIncyB0YWlsIHBhcnQuCi0gKi8KLXN0YXRpYyBpbnQgc3RydGFpbGNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCi17Ci0JaW50IGkxID0gc3RybGVuKHMxKTsKLQlpbnQgaTIgPSBzdHJsZW4oczIpOwotCXdoaWxlICgtLWkxID49IDAgJiYgLS1pMiA+PSAwKSB7Ci0JCWlmIChzMVtpMV0gIT0gczJbaTJdKQotCQkJcmV0dXJuIHMxW2kxXSAtIHMyW2kyXTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qIExpbmUgbnVtYmVyIGxpc3Qgb3BlcmF0aW9ucyAqLwogCiAvKiBBZGQgYSBsaW5lIHRvIGxpbmUgbnVtYmVyIGxpc3QgKi8KQEAgLTEzMSwyOSArMTE2LDM3IEBACiB9OwogCiAvKiBHZXQgYSBEd2FyZiBmcm9tIG9mZmxpbmUgaW1hZ2UgKi8KLXN0YXRpYyBEd2FyZiAqZHdmbF9pbml0X29mZmxpbmVfZHdhcmYoaW50IGZkLCBEd2ZsICoqZHdmbHAsIER3YXJmX0FkZHIgKmJpYXMpCitzdGF0aWMgaW50IGRlYnVnaW5mb19faW5pdF9vZmZsaW5lX2R3YXJmKHN0cnVjdCBkZWJ1Z2luZm8gKnNlbGYsCisJCQkJCSBjb25zdCBjaGFyICpwYXRoKQogewogCUR3ZmxfTW9kdWxlICptb2Q7Ci0JRHdhcmYgKmRiZyA9IE5VTEw7CisJaW50IGZkOwogCi0JaWYgKCFkd2ZscCkKLQkJcmV0dXJuIE5VTEw7CisJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CiAKLQkqZHdmbHAgPSBkd2ZsX2JlZ2luKCZvZmZsaW5lX2NhbGxiYWNrcyk7Ci0JaWYgKCEqZHdmbHApCi0JCXJldHVybiBOVUxMOworCXNlbGYtPmR3ZmwgPSBkd2ZsX2JlZ2luKCZvZmZsaW5lX2NhbGxiYWNrcyk7CisJaWYgKCFzZWxmLT5kd2ZsKQorCQlnb3RvIGVycm9yOwogCi0JbW9kID0gZHdmbF9yZXBvcnRfb2ZmbGluZSgqZHdmbHAsICIiLCAiIiwgZmQpOworCW1vZCA9IGR3ZmxfcmVwb3J0X29mZmxpbmUoc2VsZi0+ZHdmbCwgIiIsICIiLCBmZCk7CiAJaWYgKCFtb2QpCiAJCWdvdG8gZXJyb3I7CiAKLQlkYmcgPSBkd2ZsX21vZHVsZV9nZXRkd2FyZihtb2QsIGJpYXMpOwotCWlmICghZGJnKSB7CisJc2VsZi0+ZGJnID0gZHdmbF9tb2R1bGVfZ2V0ZHdhcmYobW9kLCAmc2VsZi0+Ymlhcyk7CisJaWYgKCFzZWxmLT5kYmcpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKIGVycm9yOgotCQlkd2ZsX2VuZCgqZHdmbHApOwotCQkqZHdmbHAgPSBOVUxMOwotCX0KLQlyZXR1cm4gZGJnOworCWlmIChzZWxmLT5kd2ZsKQorCQlkd2ZsX2VuZChzZWxmLT5kd2ZsKTsKKwllbHNlCisJCWNsb3NlKGZkKTsKKwltZW1zZXQoc2VsZiwgMCwgc2l6ZW9mKCpzZWxmKSk7CisKKwlyZXR1cm4gLUVOT0VOVDsKIH0KIAogI2lmIF9FTEZVVElMU19QUkVSRVEoMCwgMTQ4KQpAQCAtMTg5LDU5NyArMTgyLDgxIEBACiB9OwogCiAvKiBHZXQgYSBEd2FyZiBmcm9tIGxpdmUga2VybmVsIGltYWdlICovCi1zdGF0aWMgRHdhcmYgKmR3ZmxfaW5pdF9saXZlX2tlcm5lbF9kd2FyZihEd2FyZl9BZGRyIGFkZHIsIER3ZmwgKipkd2ZscCwKLQkJCQkJICBEd2FyZl9BZGRyICpiaWFzKQorc3RhdGljIGludCBkZWJ1Z2luZm9fX2luaXRfb25saW5lX2tlcm5lbF9kd2FyZihzdHJ1Y3QgZGVidWdpbmZvICpzZWxmLAorCQkJCQkgICAgICAgRHdhcmZfQWRkciBhZGRyKQogewotCUR3YXJmICpkYmc7Ci0KLQlpZiAoIWR3ZmxwKQotCQlyZXR1cm4gTlVMTDsKLQotCSpkd2ZscCA9IGR3ZmxfYmVnaW4oJmtlcm5lbF9jYWxsYmFja3MpOwotCWlmICghKmR3ZmxwKQotCQlyZXR1cm4gTlVMTDsKKwlzZWxmLT5kd2ZsID0gZHdmbF9iZWdpbigma2VybmVsX2NhbGxiYWNrcyk7CisJaWYgKCFzZWxmLT5kd2ZsKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIExvYWQgdGhlIGtlcm5lbCBkd2FydmVzOiBEb24ndCBjYXJlIHRoZSByZXN1bHQgaGVyZSAqLwotCWR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9rZXJuZWwoKmR3ZmxwKTsKLQlkd2ZsX2xpbnV4X2tlcm5lbF9yZXBvcnRfbW9kdWxlcygqZHdmbHApOworCWR3ZmxfbGludXhfa2VybmVsX3JlcG9ydF9rZXJuZWwoc2VsZi0+ZHdmbCk7CisJZHdmbF9saW51eF9rZXJuZWxfcmVwb3J0X21vZHVsZXMoc2VsZi0+ZHdmbCk7CiAKLQlkYmcgPSBkd2ZsX2FkZHJkd2FyZigqZHdmbHAsIGFkZHIsIGJpYXMpOworCXNlbGYtPmRiZyA9IGR3ZmxfYWRkcmR3YXJmKHNlbGYtPmR3ZmwsIGFkZHIsICZzZWxmLT5iaWFzKTsKIAkvKiBIZXJlLCBjaGVjayB3aGV0aGVyIHdlIGNvdWxkIGdldCBhIHJlYWwgZHdhcmYgKi8KLQlpZiAoIWRiZykgeworCWlmICghc2VsZi0+ZGJnKSB7CiAJCXByX2RlYnVnKCJGYWlsZWQgdG8gZmluZCBrZXJuZWwgZHdhcmYgYXQgJWx4XG4iLAogCQkJICh1bnNpZ25lZCBsb25nKWFkZHIpOwotCQlkd2ZsX2VuZCgqZHdmbHApOwotCQkqZHdmbHAgPSBOVUxMOworCQlkd2ZsX2VuZChzZWxmLT5kd2ZsKTsKKwkJbWVtc2V0KHNlbGYsIDAsIHNpemVvZigqc2VsZikpOworCQlyZXR1cm4gLUVOT0VOVDsKIAl9Ci0JcmV0dXJuIGRiZzsKKworCXJldHVybiAwOwogfQogI2Vsc2UKIC8qIFdpdGggb2xkZXIgZWxmdXRpbHMsIHRoaXMganVzdCBzdXBwb3J0IGtlcm5lbCBtb2R1bGUuLi4gKi8KLXN0YXRpYyBEd2FyZiAqZHdmbF9pbml0X2xpdmVfa2VybmVsX2R3YXJmKER3YXJmX0FkZHIgYWRkciBfX3VzZWQsIER3ZmwgKipkd2ZscCwKLQkJCQkJICBEd2FyZl9BZGRyICpiaWFzKQorc3RhdGljIGludCBkZWJ1Z2luZm9fX2luaXRfb25saW5lX2tlcm5lbF9kd2FyZihzdHJ1Y3QgZGVidWdpbmZvICpzZWxmLAorCQkJCQkgICAgICAgRHdhcmZfQWRkciBhZGRyIF9fdXNlZCkKIHsKLQlpbnQgZmQ7CiAJY29uc3QgY2hhciAqcGF0aCA9IGtlcm5lbF9nZXRfbW9kdWxlX3BhdGgoImtlcm5lbCIpOwogCiAJaWYgKCFwYXRoKSB7CiAJCXByX2VycigiRmFpbGVkIHRvIGZpbmQgdm1saW51eCBwYXRoXG4iKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRU5PRU5UOwogCX0KIAogCXByX2RlYnVnMigiVXNlIGZpbGUgJXMgZm9yIGRlYnVnaW5mb1xuIiwgcGF0aCk7Ci0JZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKLQlpZiAoZmQgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBkd2ZsX2luaXRfb2ZmbGluZV9kd2FyZihmZCwgZHdmbHAsIGJpYXMpOworCXJldHVybiBkZWJ1Z2luZm9fX2luaXRfb2ZmbGluZV9kd2FyZihzZWxmLCBwYXRoKTsKIH0KICNlbmRpZgogCi0vKiBEd2FyZiB3cmFwcGVycyAqLwotCi0vKiBGaW5kIHRoZSByZWFscGF0aCBvZiB0aGUgdGFyZ2V0IGZpbGUuICovCi1zdGF0aWMgY29uc3QgY2hhciAqY3VfZmluZF9yZWFscGF0aChEd2FyZl9EaWUgKmN1X2RpZSwgY29uc3QgY2hhciAqZm5hbWUpCitzdHJ1Y3QgZGVidWdpbmZvICpkZWJ1Z2luZm9fX25ldyhjb25zdCBjaGFyICpwYXRoKQogewotCUR3YXJmX0ZpbGVzICpmaWxlczsKLQlzaXplX3QgbmZpbGVzLCBpOwotCWNvbnN0IGNoYXIgKnNyYyA9IE5VTEw7Ci0JaW50IHJldDsKLQotCWlmICghZm5hbWUpCisJc3RydWN0IGRlYnVnaW5mbyAqc2VsZiA9IHphbGxvYyhzaXplb2Yoc3RydWN0IGRlYnVnaW5mbykpOworCWlmICghc2VsZikKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXQgPSBkd2FyZl9nZXRzcmNmaWxlcyhjdV9kaWUsICZmaWxlcywgJm5maWxlcyk7Ci0JaWYgKHJldCAhPSAwKQorCWlmIChkZWJ1Z2luZm9fX2luaXRfb2ZmbGluZV9kd2FyZihzZWxmLCBwYXRoKSA8IDApIHsKKwkJZnJlZShzZWxmKTsKKwkJc2VsZiA9IE5VTEw7CisJfQorCisJcmV0dXJuIHNlbGY7Cit9CisKK3N0cnVjdCBkZWJ1Z2luZm8gKmRlYnVnaW5mb19fbmV3X29ubGluZV9rZXJuZWwodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXN0cnVjdCBkZWJ1Z2luZm8gKnNlbGYgPSB6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWJ1Z2luZm8pKTsKKwlpZiAoIXNlbGYpCiAJCXJldHVybiBOVUxMOwogCi0JZm9yIChpID0gMDsgaSA8IG5maWxlczsgaSsrKSB7Ci0JCXNyYyA9IGR3YXJmX2ZpbGVzcmMoZmlsZXMsIGksIE5VTEwsIE5VTEwpOwotCQlpZiAoc3RydGFpbGNtcChzcmMsIGZuYW1lKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpID09IG5maWxlcykKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHNyYzsKLX0KLQotLyogR2V0IERXX0FUX2NvbXBfZGlyIChzaG91bGQgYmUgTlVMTCB3aXRoIG9sZGVyIGdjYykgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjdV9nZXRfY29tcF9kaXIoRHdhcmZfRGllICpjdV9kaWUpCi17Ci0JRHdhcmZfQXR0cmlidXRlIGF0dHI7Ci0JaWYgKGR3YXJmX2F0dHIoY3VfZGllLCBEV19BVF9jb21wX2RpciwgJmF0dHIpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBkd2FyZl9mb3Jtc3RyaW5nKCZhdHRyKTsKLX0KLQotLyogR2V0IGEgbGluZSBudW1iZXIgYW5kIGZpbGUgbmFtZSBmb3IgZ2l2ZW4gYWRkcmVzcyAqLwotc3RhdGljIGludCBjdV9maW5kX2xpbmVpbmZvKER3YXJmX0RpZSAqY3VkaWUsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCSAgICBjb25zdCBjaGFyICoqZm5hbWUsIGludCAqbGluZW5vKQotewotCUR3YXJmX0xpbmUgKmxpbmU7Ci0JRHdhcmZfQWRkciBsYWRkcjsKLQotCWxpbmUgPSBkd2FyZl9nZXRzcmNfZGllKGN1ZGllLCAoRHdhcmZfQWRkcilhZGRyKTsKLQlpZiAobGluZSAmJiBkd2FyZl9saW5lYWRkcihsaW5lLCAmbGFkZHIpID09IDAgJiYKLQkgICAgYWRkciA9PSAodW5zaWduZWQgbG9uZylsYWRkciAmJiBkd2FyZl9saW5lbm8obGluZSwgbGluZW5vKSA9PSAwKSB7Ci0JCSpmbmFtZSA9IGR3YXJmX2xpbmVzcmMobGluZSwgTlVMTCwgTlVMTCk7Ci0JCWlmICghKmZuYW1lKQotCQkJLyogbGluZSBudW1iZXIgaXMgdXNlbGVzcyB3aXRob3V0IGZpbGVuYW1lICovCi0JCQkqbGluZW5vID0gMDsKKwlpZiAoZGVidWdpbmZvX19pbml0X29ubGluZV9rZXJuZWxfZHdhcmYoc2VsZiwgKER3YXJmX0FkZHIpYWRkcikgPCAwKSB7CisJCWZyZWUoc2VsZik7CisJCXNlbGYgPSBOVUxMOwogCX0KIAotCXJldHVybiAqbGluZW5vID86IC1FTk9FTlQ7CisJcmV0dXJuIHNlbGY7CiB9CiAKLS8qIENvbXBhcmUgZGllbmFtZSBhbmQgdG5hbWUgKi8KLXN0YXRpYyBib29sIGRpZV9jb21wYXJlX25hbWUoRHdhcmZfRGllICpkd19kaWUsIGNvbnN0IGNoYXIgKnRuYW1lKQordm9pZCBkZWJ1Z2luZm9fX2RlbGV0ZShzdHJ1Y3QgZGVidWdpbmZvICpzZWxmKQogewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JbmFtZSA9IGR3YXJmX2RpZW5hbWUoZHdfZGllKTsKLQlyZXR1cm4gbmFtZSA/IChzdHJjbXAodG5hbWUsIG5hbWUpID09IDApIDogZmFsc2U7Ci19Ci0KLS8qIEdldCBjYWxsc2l0ZSBsaW5lIG51bWJlciBvZiBpbmxpbmUtZnVuY3Rpb24gaW5zdGFuY2UgKi8KLXN0YXRpYyBpbnQgZGllX2dldF9jYWxsX2xpbmVubyhEd2FyZl9EaWUgKmluX2RpZSkKLXsKLQlEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKLQlEd2FyZl9Xb3JkIHJldDsKLQotCWlmICghZHdhcmZfYXR0cihpbl9kaWUsIERXX0FUX2NhbGxfbGluZSwgJmF0dHIpKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWR3YXJmX2Zvcm11ZGF0YSgmYXR0ciwgJnJldCk7Ci0JcmV0dXJuIChpbnQpcmV0OwotfQotCi0vKiBHZXQgdHlwZSBkaWUgKi8KLXN0YXRpYyBEd2FyZl9EaWUgKmRpZV9nZXRfdHlwZShEd2FyZl9EaWUgKnZyX2RpZSwgRHdhcmZfRGllICpkaWVfbWVtKQotewotCUR3YXJmX0F0dHJpYnV0ZSBhdHRyOwotCi0JaWYgKGR3YXJmX2F0dHJfaW50ZWdyYXRlKHZyX2RpZSwgRFdfQVRfdHlwZSwgJmF0dHIpICYmCi0JICAgIGR3YXJmX2Zvcm1yZWZfZGllKCZhdHRyLCBkaWVfbWVtKSkKLQkJcmV0dXJuIGRpZV9tZW07Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLQotLyogR2V0IGEgdHlwZSBkaWUsIGJ1dCBza2lwIHF1YWxpZmllcnMgKi8KLXN0YXRpYyBEd2FyZl9EaWUgKl9fZGllX2dldF9yZWFsX3R5cGUoRHdhcmZfRGllICp2cl9kaWUsIER3YXJmX0RpZSAqZGllX21lbSkKLXsKLQlpbnQgdGFnOwotCi0JZG8gewotCQl2cl9kaWUgPSBkaWVfZ2V0X3R5cGUodnJfZGllLCBkaWVfbWVtKTsKLQkJaWYgKCF2cl9kaWUpCi0JCQlicmVhazsKLQkJdGFnID0gZHdhcmZfdGFnKHZyX2RpZSk7Ci0JfSB3aGlsZSAodGFnID09IERXX1RBR19jb25zdF90eXBlIHx8Ci0JCSB0YWcgPT0gRFdfVEFHX3Jlc3RyaWN0X3R5cGUgfHwKLQkJIHRhZyA9PSBEV19UQUdfdm9sYXRpbGVfdHlwZSB8fAotCQkgdGFnID09IERXX1RBR19zaGFyZWRfdHlwZSk7Ci0KLQlyZXR1cm4gdnJfZGllOwotfQotCi0vKiBHZXQgYSB0eXBlIGRpZSwgYnV0IHNraXAgcXVhbGlmaWVycyBhbmQgdHlwZWRlZiAqLwotc3RhdGljIER3YXJmX0RpZSAqZGllX2dldF9yZWFsX3R5cGUoRHdhcmZfRGllICp2cl9kaWUsIER3YXJmX0RpZSAqZGllX21lbSkKLXsKLQlkbyB7Ci0JCXZyX2RpZSA9IF9fZGllX2dldF9yZWFsX3R5cGUodnJfZGllLCBkaWVfbWVtKTsKLQl9IHdoaWxlICh2cl9kaWUgJiYgZHdhcmZfdGFnKHZyX2RpZSkgPT0gRFdfVEFHX3R5cGVkZWYpOwotCi0JcmV0dXJuIHZyX2RpZTsKLX0KLQotc3RhdGljIGludCBkaWVfZ2V0X2F0dHJfdWRhdGEoRHdhcmZfRGllICp0cF9kaWUsIHVuc2lnbmVkIGludCBhdHRyX25hbWUsCi0JCQkgICAgICBEd2FyZl9Xb3JkICpyZXN1bHQpCi17Ci0JRHdhcmZfQXR0cmlidXRlIGF0dHI7Ci0KLQlpZiAoZHdhcmZfYXR0cih0cF9kaWUsIGF0dHJfbmFtZSwgJmF0dHIpID09IE5VTEwgfHwKLQkgICAgZHdhcmZfZm9ybXVkYXRhKCZhdHRyLCByZXN1bHQpICE9IDApCi0JCXJldHVybiAtRU5PRU5UOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sIGRpZV9pc19zaWduZWRfdHlwZShEd2FyZl9EaWUgKnRwX2RpZSkKLXsKLQlEd2FyZl9Xb3JkIHJldDsKLQotCWlmIChkaWVfZ2V0X2F0dHJfdWRhdGEodHBfZGllLCBEV19BVF9lbmNvZGluZywgJnJldCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiAocmV0ID09IERXX0FURV9zaWduZWRfY2hhciB8fCByZXQgPT0gRFdfQVRFX3NpZ25lZCB8fAotCQlyZXQgPT0gRFdfQVRFX3NpZ25lZF9maXhlZCk7Ci19Ci0KLXN0YXRpYyBpbnQgZGllX2dldF9ieXRlX3NpemUoRHdhcmZfRGllICp0cF9kaWUpCi17Ci0JRHdhcmZfV29yZCByZXQ7Ci0KLQlpZiAoZGllX2dldF9hdHRyX3VkYXRhKHRwX2RpZSwgRFdfQVRfYnl0ZV9zaXplLCAmcmV0KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gKGludClyZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZGllX2dldF9iaXRfc2l6ZShEd2FyZl9EaWUgKnRwX2RpZSkKLXsKLQlEd2FyZl9Xb3JkIHJldDsKLQotCWlmIChkaWVfZ2V0X2F0dHJfdWRhdGEodHBfZGllLCBEV19BVF9iaXRfc2l6ZSwgJnJldCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIChpbnQpcmV0OwotfQotCi1zdGF0aWMgaW50IGRpZV9nZXRfYml0X29mZnNldChEd2FyZl9EaWUgKnRwX2RpZSkKLXsKLQlEd2FyZl9Xb3JkIHJldDsKLQotCWlmIChkaWVfZ2V0X2F0dHJfdWRhdGEodHBfZGllLCBEV19BVF9iaXRfb2Zmc2V0LCAmcmV0KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gKGludClyZXQ7Ci19Ci0KLS8qIEdldCBkYXRhX21lbWJlcl9sb2NhdGlvbiBvZmZzZXQgKi8KLXN0YXRpYyBpbnQgZGllX2dldF9kYXRhX21lbWJlcl9sb2NhdGlvbihEd2FyZl9EaWUgKm1iX2RpZSwgRHdhcmZfV29yZCAqb2ZmcykKLXsKLQlEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKLQlEd2FyZl9PcCAqZXhwcjsKLQlzaXplX3QgbmV4cHI7Ci0JaW50IHJldDsKLQotCWlmIChkd2FyZl9hdHRyKG1iX2RpZSwgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb24sICZhdHRyKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWlmIChkd2FyZl9mb3JtdWRhdGEoJmF0dHIsIG9mZnMpICE9IDApIHsKLQkJLyogRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb24gc2hvdWxkIGJlIERXX09QX3BsdXNfdWNvbnN0ICovCi0JCXJldCA9IGR3YXJmX2dldGxvY2F0aW9uKCZhdHRyLCAmZXhwciwgJm5leHByKTsKLQkJaWYgKHJldCA8IDAgfHwgbmV4cHIgPT0gMCkKLQkJCXJldHVybiAtRU5PRU5UOwotCi0JCWlmIChleHByWzBdLmF0b20gIT0gRFdfT1BfcGx1c191Y29uc3QgfHwgbmV4cHIgIT0gMSkgewotCQkJcHJfZGVidWcoIlVuYWJsZSB0byBnZXQgb2Zmc2V0OlVuZXhwZWN0ZWQgT1AgJXggKCV6ZClcbiIsCi0JCQkJIGV4cHJbMF0uYXRvbSwgbmV4cHIpOwotCQkJcmV0dXJuIC1FTk9UU1VQOwotCQl9Ci0JCSpvZmZzID0gKER3YXJmX1dvcmQpZXhwclswXS5udW1iZXI7CisJaWYgKHNlbGYpIHsKKwkJaWYgKHNlbGYtPmR3ZmwpCisJCQlkd2ZsX2VuZChzZWxmLT5kd2ZsKTsKKwkJZnJlZShzZWxmKTsKIAl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiB2YWx1ZXMgZm9yIGRpZV9maW5kIGNhbGxiYWNrcyAqLwotZW51bSB7Ci0JRElFX0ZJTkRfQ0JfRk9VTkQgPSAwLAkJLyogRW5kIG9mIFNlYXJjaCAqLwotCURJRV9GSU5EX0NCX0NISUxEID0gMSwJCS8qIFNlYXJjaCBvbmx5IGNoaWxkcmVuICovCi0JRElFX0ZJTkRfQ0JfU0lCTElORyA9IDIsCS8qIFNlYXJjaCBvbmx5IHNpYmxpbmdzICovCi0JRElFX0ZJTkRfQ0JfQ09OVElOVUUgPSAzLAkvKiBTZWFyY2ggY2hpbGRyZW4gYW5kIHNpYmxpbmdzICovCi19OwotCi0vKiBTZWFyY2ggYSBjaGlsZCBkaWUgKi8KLXN0YXRpYyBEd2FyZl9EaWUgKmRpZV9maW5kX2NoaWxkKER3YXJmX0RpZSAqcnRfZGllLAotCQkJCSBpbnQgKCpjYWxsYmFjaykoRHdhcmZfRGllICosIHZvaWQgKiksCi0JCQkJIHZvaWQgKmRhdGEsIER3YXJmX0RpZSAqZGllX21lbSkKLXsKLQlEd2FyZl9EaWUgY2hpbGRfZGllOwotCWludCByZXQ7Ci0KLQlyZXQgPSBkd2FyZl9jaGlsZChydF9kaWUsIGRpZV9tZW0pOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkbyB7Ci0JCXJldCA9IGNhbGxiYWNrKGRpZV9tZW0sIGRhdGEpOwotCQlpZiAocmV0ID09IERJRV9GSU5EX0NCX0ZPVU5EKQotCQkJcmV0dXJuIGRpZV9tZW07Ci0KLQkJaWYgKChyZXQgJiBESUVfRklORF9DQl9DSElMRCkgJiYKLQkJICAgIGRpZV9maW5kX2NoaWxkKGRpZV9tZW0sIGNhbGxiYWNrLCBkYXRhLCAmY2hpbGRfZGllKSkgewotCQkJbWVtY3B5KGRpZV9tZW0sICZjaGlsZF9kaWUsIHNpemVvZihEd2FyZl9EaWUpKTsKLQkJCXJldHVybiBkaWVfbWVtOwotCQl9Ci0JfSB3aGlsZSAoKHJldCAmIERJRV9GSU5EX0NCX1NJQkxJTkcpICYmCi0JCSBkd2FyZl9zaWJsaW5nb2YoZGllX21lbSwgZGllX21lbSkgPT0gMCk7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RydWN0IF9fYWRkcl9kaWVfc2VhcmNoX3BhcmFtIHsKLQlEd2FyZl9BZGRyCWFkZHI7Ci0JRHdhcmZfRGllCSpkaWVfbWVtOwotfTsKLQotc3RhdGljIGludCBfX2RpZV9zZWFyY2hfZnVuY19jYihEd2FyZl9EaWUgKmZuX2RpZSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgX19hZGRyX2RpZV9zZWFyY2hfcGFyYW0gKmFkID0gZGF0YTsKLQotCWlmIChkd2FyZl90YWcoZm5fZGllKSA9PSBEV19UQUdfc3VicHJvZ3JhbSAmJgotCSAgICBkd2FyZl9oYXNwYyhmbl9kaWUsIGFkLT5hZGRyKSkgewotCQltZW1jcHkoYWQtPmRpZV9tZW0sIGZuX2RpZSwgc2l6ZW9mKER3YXJmX0RpZSkpOwotCQlyZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7Ci0JfQotCXJldHVybiBEV0FSRl9DQl9PSzsKLX0KLQotLyogU2VhcmNoIGEgcmVhbCBzdWJwcm9ncmFtIGluY2x1ZGluZyB0aGlzIGxpbmUsICovCi1zdGF0aWMgRHdhcmZfRGllICpkaWVfZmluZF9yZWFsX3N1YnByb2dyYW0oRHdhcmZfRGllICpjdV9kaWUsIER3YXJmX0FkZHIgYWRkciwKLQkJCQkJICAgRHdhcmZfRGllICpkaWVfbWVtKQotewotCXN0cnVjdCBfX2FkZHJfZGllX3NlYXJjaF9wYXJhbSBhZDsKLQlhZC5hZGRyID0gYWRkcjsKLQlhZC5kaWVfbWVtID0gZGllX21lbTsKLQkvKiBkd2FyZl9nZXRzY29wZXMgY2FuJ3QgZmluZCBzdWJwcm9ncmFtLiAqLwotCWlmICghZHdhcmZfZ2V0ZnVuY3MoY3VfZGllLCBfX2RpZV9zZWFyY2hfZnVuY19jYiwgJmFkLCAwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gZGllX21lbTsKLX0KLQotLyogZGllX2ZpbmQgY2FsbGJhY2sgZm9yIGlubGluZSBmdW5jdGlvbiBzZWFyY2ggKi8KLXN0YXRpYyBpbnQgX19kaWVfZmluZF9pbmxpbmVfY2IoRHdhcmZfRGllICpkaWVfbWVtLCB2b2lkICpkYXRhKQotewotCUR3YXJmX0FkZHIgKmFkZHIgPSBkYXRhOwotCi0JaWYgKGR3YXJmX3RhZyhkaWVfbWVtKSA9PSBEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lICYmCi0JICAgIGR3YXJmX2hhc3BjKGRpZV9tZW0sICphZGRyKSkKLQkJcmV0dXJuIERJRV9GSU5EX0NCX0ZPVU5EOwotCi0JcmV0dXJuIERJRV9GSU5EX0NCX0NPTlRJTlVFOwotfQotCi0vKiBTaW1pbGFyIHRvIGR3YXJmX2dldGZ1bmNzLCBidXQgcmV0dXJucyBpbmxpbmVkX3N1YnJvdXRpbmUgaWYgZXhpc3RzLiAqLwotc3RhdGljIER3YXJmX0RpZSAqZGllX2ZpbmRfaW5saW5lZnVuYyhEd2FyZl9EaWUgKnNwX2RpZSwgRHdhcmZfQWRkciBhZGRyLAotCQkJCSAgICAgIER3YXJmX0RpZSAqZGllX21lbSkKLXsKLQlEd2FyZl9EaWUgdG1wX2RpZTsKLQotCXNwX2RpZSA9IGRpZV9maW5kX2NoaWxkKHNwX2RpZSwgX19kaWVfZmluZF9pbmxpbmVfY2IsICZhZGRyLCAmdG1wX2RpZSk7Ci0JaWYgKCFzcF9kaWUpCi0JCXJldHVybiBOVUxMOwotCi0JLyogSW5saW5lZCBmdW5jdGlvbiBjb3VsZCBiZSByZWN1cnNpdmUuIFRyYWNlIGl0IHVudGlsIGZhaWwgKi8KLQl3aGlsZSAoc3BfZGllKSB7Ci0JCW1lbWNweShkaWVfbWVtLCBzcF9kaWUsIHNpemVvZihEd2FyZl9EaWUpKTsKLQkJc3BfZGllID0gZGllX2ZpbmRfY2hpbGQoc3BfZGllLCBfX2RpZV9maW5kX2lubGluZV9jYiwgJmFkZHIsCi0JCQkJCSZ0bXBfZGllKTsKLQl9Ci0KLQlyZXR1cm4gZGllX21lbTsKLX0KLQotLyogV2Fsa2VyIG9uIGxpbmVzIChOb3RlOiBsaW5lIG51bWJlciB3aWxsIG5vdCBiZSBzb3J0ZWQpICovCi10eXBlZGVmIGludCAoKiBsaW5lX3dhbGtfaGFuZGxlcl90KSAoY29uc3QgY2hhciAqZm5hbWUsIGludCBsaW5lbm8sCi0JCQkJICAgICBEd2FyZl9BZGRyIGFkZHIsIHZvaWQgKmRhdGEpOwotCi1zdHJ1Y3QgX19saW5lX3dhbGtfcGFyYW0gewotCWNvbnN0IGNoYXIgKmZuYW1lOwotCWxpbmVfd2Fsa19oYW5kbGVyX3QgaGFuZGxlcjsKLQl2b2lkICpkYXRhOwotCWludCByZXR2YWw7Ci19OwotCi1zdGF0aWMgaW50IF9fZGllX3dhbGtfZnVuY2xpbmVzX2NiKER3YXJmX0RpZSAqaW5fZGllLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBfX2xpbmVfd2Fsa19wYXJhbSAqbHcgPSBkYXRhOwotCUR3YXJmX0FkZHIgYWRkcjsKLQlpbnQgbGluZW5vOwotCi0JaWYgKGR3YXJmX3RhZyhpbl9kaWUpID09IERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmUpIHsKLQkJbGluZW5vID0gZGllX2dldF9jYWxsX2xpbmVubyhpbl9kaWUpOwotCQlpZiAobGluZW5vID4gMCAmJiBkd2FyZl9lbnRyeXBjKGluX2RpZSwgJmFkZHIpID09IDApIHsKLQkJCWx3LT5yZXR2YWwgPSBsdy0+aGFuZGxlcihsdy0+Zm5hbWUsIGxpbmVubywgYWRkciwKLQkJCQkJCSBsdy0+ZGF0YSk7Ci0JCQlpZiAobHctPnJldHZhbCAhPSAwKQotCQkJCXJldHVybiBESUVfRklORF9DQl9GT1VORDsKLQkJfQotCX0KLQlyZXR1cm4gRElFX0ZJTkRfQ0JfU0lCTElORzsKLX0KLQotLyogV2FsayBvbiBsaW5lcyBvZiBibG9ja3MgaW5jbHVkZWQgaW4gZ2l2ZW4gRElFICovCi1zdGF0aWMgaW50IF9fZGllX3dhbGtfZnVuY2xpbmVzKER3YXJmX0RpZSAqc3BfZGllLAotCQkJCWxpbmVfd2Fsa19oYW5kbGVyX3QgaGFuZGxlciwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgX19saW5lX3dhbGtfcGFyYW0gbHcgPSB7Ci0JCS5oYW5kbGVyID0gaGFuZGxlciwKLQkJLmRhdGEgPSBkYXRhLAotCQkucmV0dmFsID0gMCwKLQl9OwotCUR3YXJmX0RpZSBkaWVfbWVtOwotCUR3YXJmX0FkZHIgYWRkcjsKLQlpbnQgbGluZW5vOwotCi0JLyogSGFuZGxlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGxpbmUgKi8KLQlsdy5mbmFtZSA9IGR3YXJmX2RlY2xfZmlsZShzcF9kaWUpOwotCWlmIChsdy5mbmFtZSAmJiBkd2FyZl9kZWNsX2xpbmUoc3BfZGllLCAmbGluZW5vKSA9PSAwICYmCi0JICAgIGR3YXJmX2VudHJ5cGMoc3BfZGllLCAmYWRkcikgPT0gMCkgewotCQlsdy5yZXR2YWwgPSBoYW5kbGVyKGx3LmZuYW1lLCBsaW5lbm8sIGFkZHIsIGRhdGEpOwotCQlpZiAobHcucmV0dmFsICE9IDApCi0JCQlnb3RvIGRvbmU7Ci0JfQotCWRpZV9maW5kX2NoaWxkKHNwX2RpZSwgX19kaWVfd2Fsa19mdW5jbGluZXNfY2IsICZsdywgJmRpZV9tZW0pOwotZG9uZToKLQlyZXR1cm4gbHcucmV0dmFsOwotfQotCi1zdGF0aWMgaW50IF9fZGllX3dhbGtfY3VsaW5lc19jYihEd2FyZl9EaWUgKnNwX2RpZSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgX19saW5lX3dhbGtfcGFyYW0gKmx3ID0gZGF0YTsKLQotCWx3LT5yZXR2YWwgPSBfX2RpZV93YWxrX2Z1bmNsaW5lcyhzcF9kaWUsIGx3LT5oYW5kbGVyLCBsdy0+ZGF0YSk7Ci0JaWYgKGx3LT5yZXR2YWwgIT0gMCkKLQkJcmV0dXJuIERXQVJGX0NCX0FCT1JUOwotCi0JcmV0dXJuIERXQVJGX0NCX09LOwotfQotCi0vKgotICogV2FsayBvbiBsaW5lcyBpbnNpZGUgZ2l2ZW4gUERJRS4gSWYgdGhlIFBESUUgaXMgc3VicHJvZ3JhbSwgd2FsayBvbmx5IG9uCi0gKiB0aGUgbGluZXMgaW5zaWRlIHRoZSBzdWJwcm9ncmFtLCBvdGhlcndpc2UgUERJRSBtdXN0IGJlIGEgQ1UgRElFLgotICovCi1zdGF0aWMgaW50IGRpZV93YWxrX2xpbmVzKER3YXJmX0RpZSAqcGRpZSwgbGluZV93YWxrX2hhbmRsZXJfdCBoYW5kbGVyLAotCQkJICB2b2lkICpkYXRhKQotewotCUR3YXJmX0xpbmVzICpsaW5lczsKLQlEd2FyZl9MaW5lICpsaW5lOwotCUR3YXJmX0FkZHIgYWRkcjsKLQljb25zdCBjaGFyICpmbmFtZTsKLQlpbnQgbGluZW5vLCByZXQgPSAwOwotCUR3YXJmX0RpZSBkaWVfbWVtLCAqY3VfZGllOwotCXNpemVfdCBubGluZXMsIGk7Ci0KLQkvKiBHZXQgdGhlIENVIGRpZSAqLwotCWlmIChkd2FyZl90YWcocGRpZSkgPT0gRFdfVEFHX3N1YnByb2dyYW0pCi0JCWN1X2RpZSA9IGR3YXJmX2RpZWN1KHBkaWUsICZkaWVfbWVtLCBOVUxMLCBOVUxMKTsKLQllbHNlCi0JCWN1X2RpZSA9IHBkaWU7Ci0JaWYgKCFjdV9kaWUpIHsKLQkJcHJfZGVidWcyKCJGYWlsZWQgdG8gZ2V0IENVIGZyb20gc3VicHJvZ3JhbVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIEdldCBsaW5lcyBsaXN0IGluIHRoZSBDVSAqLwotCWlmIChkd2FyZl9nZXRzcmNsaW5lcyhjdV9kaWUsICZsaW5lcywgJm5saW5lcykgIT0gMCkgewotCQlwcl9kZWJ1ZzIoIkZhaWxlZCB0byBnZXQgc291cmNlIGxpbmVzIG9uIHRoaXMgQ1UuXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCXByX2RlYnVnMigiR2V0ICV6ZCBsaW5lcyBmcm9tIHRoaXMgQ1VcbiIsIG5saW5lcyk7Ci0KLQkvKiBXYWxrIG9uIHRoZSBsaW5lcyBvbiBsaW5lcyBsaXN0ICovCi0JZm9yIChpID0gMDsgaSA8IG5saW5lczsgaSsrKSB7Ci0JCWxpbmUgPSBkd2FyZl9vbmVzcmNsaW5lKGxpbmVzLCBpKTsKLQkJaWYgKGxpbmUgPT0gTlVMTCB8fAotCQkgICAgZHdhcmZfbGluZW5vKGxpbmUsICZsaW5lbm8pICE9IDAgfHwKLQkJICAgIGR3YXJmX2xpbmVhZGRyKGxpbmUsICZhZGRyKSAhPSAwKSB7Ci0JCQlwcl9kZWJ1ZzIoIkZhaWxlZCB0byBnZXQgbGluZSBpbmZvLiAiCi0JCQkJICAiUG9zc2libGUgZXJyb3IgaW4gZGVidWdpbmZvLlxuIik7Ci0JCQljb250aW51ZTsKLQkJfQotCQkvKiBGaWx0ZXIgbGluZXMgYmFzZWQgb24gYWRkcmVzcyAqLwotCQlpZiAocGRpZSAhPSBjdV9kaWUpCi0JCQkvKgotCQkJICogQWRkcmVzcyBmaWx0ZXJpbmcKLQkJCSAqIFRoZSBsaW5lIGlzIGluY2x1ZGVkIGluIGdpdmVuIGZ1bmN0aW9uLCBhbmQKLQkJCSAqIG5vIGlubGluZSBibG9jayBpbmNsdWRlcyBpdC4KLQkJCSAqLwotCQkJaWYgKCFkd2FyZl9oYXNwYyhwZGllLCBhZGRyKSB8fAotCQkJICAgIGRpZV9maW5kX2lubGluZWZ1bmMocGRpZSwgYWRkciwgJmRpZV9tZW0pKQotCQkJCWNvbnRpbnVlOwotCQkvKiBHZXQgc291cmNlIGxpbmUgKi8KLQkJZm5hbWUgPSBkd2FyZl9saW5lc3JjKGxpbmUsIE5VTEwsIE5VTEwpOwotCi0JCXJldCA9IGhhbmRsZXIoZm5hbWUsIGxpbmVubywgYWRkciwgZGF0YSk7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JLyoKLQkgKiBEd2FyZiBsaW5lcyBkb2Vzbid0IGluY2x1ZGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBpbmxpbmVkCi0JICogc3Vicm91dGluZXMuIFdlIGhhdmUgdG8gY2hlY2sgZnVuY3Rpb25zIGxpc3Qgb3IgZ2l2ZW4gZnVuY3Rpb24uCi0JICovCi0JaWYgKHBkaWUgIT0gY3VfZGllKQotCQlyZXQgPSBfX2RpZV93YWxrX2Z1bmNsaW5lcyhwZGllLCBoYW5kbGVyLCBkYXRhKTsKLQllbHNlIHsKLQkJc3RydWN0IF9fbGluZV93YWxrX3BhcmFtIHBhcmFtID0gewotCQkJLmhhbmRsZXIgPSBoYW5kbGVyLAotCQkJLmRhdGEgPSBkYXRhLAotCQkJLnJldHZhbCA9IDAsCi0JCX07Ci0JCWR3YXJmX2dldGZ1bmNzKGN1X2RpZSwgX19kaWVfd2Fsa19jdWxpbmVzX2NiLCAmcGFyYW0sIDApOwotCQlyZXQgPSBwYXJhbS5yZXR2YWw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RydWN0IF9fZmluZF92YXJpYWJsZV9wYXJhbSB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlEd2FyZl9BZGRyIGFkZHI7Ci19OwotCi1zdGF0aWMgaW50IF9fZGllX2ZpbmRfdmFyaWFibGVfY2IoRHdhcmZfRGllICpkaWVfbWVtLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBfX2ZpbmRfdmFyaWFibGVfcGFyYW0gKmZ2cCA9IGRhdGE7Ci0JaW50IHRhZzsKLQotCXRhZyA9IGR3YXJmX3RhZyhkaWVfbWVtKTsKLQlpZiAoKHRhZyA9PSBEV19UQUdfZm9ybWFsX3BhcmFtZXRlciB8fAotCSAgICAgdGFnID09IERXX1RBR192YXJpYWJsZSkgJiYKLQkgICAgZGllX2NvbXBhcmVfbmFtZShkaWVfbWVtLCBmdnAtPm5hbWUpKQotCQlyZXR1cm4gRElFX0ZJTkRfQ0JfRk9VTkQ7Ci0KLQlpZiAoZHdhcmZfaGFzcGMoZGllX21lbSwgZnZwLT5hZGRyKSkKLQkJcmV0dXJuIERJRV9GSU5EX0NCX0NPTlRJTlVFOwotCWVsc2UKLQkJcmV0dXJuIERJRV9GSU5EX0NCX1NJQkxJTkc7Ci19Ci0KLS8qIEZpbmQgYSB2YXJpYWJsZSBjYWxsZWQgJ25hbWUnIGF0IGdpdmVuIGFkZHJlc3MgKi8KLXN0YXRpYyBEd2FyZl9EaWUgKmRpZV9maW5kX3ZhcmlhYmxlX2F0KER3YXJmX0RpZSAqc3BfZGllLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgICAgICBEd2FyZl9BZGRyIGFkZHIsIER3YXJmX0RpZSAqZGllX21lbSkKLXsKLQlzdHJ1Y3QgX19maW5kX3ZhcmlhYmxlX3BhcmFtIGZ2cCA9IHsgLm5hbWUgPSBuYW1lLCAuYWRkciA9IGFkZHJ9OwotCi0JcmV0dXJuIGRpZV9maW5kX2NoaWxkKHNwX2RpZSwgX19kaWVfZmluZF92YXJpYWJsZV9jYiwgKHZvaWQgKikmZnZwLAotCQkJICAgICAgZGllX21lbSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kaWVfZmluZF9tZW1iZXJfY2IoRHdhcmZfRGllICpkaWVfbWVtLCB2b2lkICpkYXRhKQotewotCWNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhOwotCi0JaWYgKChkd2FyZl90YWcoZGllX21lbSkgPT0gRFdfVEFHX21lbWJlcikgJiYKLQkgICAgZGllX2NvbXBhcmVfbmFtZShkaWVfbWVtLCBuYW1lKSkKLQkJcmV0dXJuIERJRV9GSU5EX0NCX0ZPVU5EOwotCi0JcmV0dXJuIERJRV9GSU5EX0NCX1NJQkxJTkc7Ci19Ci0KLS8qIEZpbmQgYSBtZW1iZXIgY2FsbGVkICduYW1lJyAqLwotc3RhdGljIER3YXJmX0RpZSAqZGllX2ZpbmRfbWVtYmVyKER3YXJmX0RpZSAqc3RfZGllLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgRHdhcmZfRGllICpkaWVfbWVtKQotewotCXJldHVybiBkaWVfZmluZF9jaGlsZChzdF9kaWUsIF9fZGllX2ZpbmRfbWVtYmVyX2NiLCAodm9pZCAqKW5hbWUsCi0JCQkgICAgICBkaWVfbWVtKTsKLX0KLQotLyogR2V0IHRoZSBuYW1lIG9mIGdpdmVuIHZhcmlhYmxlIERJRSAqLwotc3RhdGljIGludCBkaWVfZ2V0X3R5cGVuYW1lKER3YXJmX0RpZSAqdnJfZGllLCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0JRHdhcmZfRGllIHR5cGU7Ci0JaW50IHRhZywgcmV0LCByZXQyOwotCWNvbnN0IGNoYXIgKnRtcCA9ICIiOwotCi0JaWYgKF9fZGllX2dldF9yZWFsX3R5cGUodnJfZGllLCAmdHlwZSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQl0YWcgPSBkd2FyZl90YWcoJnR5cGUpOwotCWlmICh0YWcgPT0gRFdfVEFHX2FycmF5X3R5cGUgfHwgdGFnID09IERXX1RBR19wb2ludGVyX3R5cGUpCi0JCXRtcCA9ICIqIjsKLQllbHNlIGlmICh0YWcgPT0gRFdfVEFHX3N1YnJvdXRpbmVfdHlwZSkgewotCQkvKiBGdW5jdGlvbiBwb2ludGVyICovCi0JCXJldCA9IHNucHJpbnRmKGJ1ZiwgbGVuLCAiKGZ1bmN0aW9uX3R5cGUpIik7Ci0JCXJldHVybiAocmV0ID49IGxlbikgPyAtRTJCSUcgOiByZXQ7Ci0JfSBlbHNlIHsKLQkJaWYgKCFkd2FyZl9kaWVuYW1lKCZ0eXBlKSkKLQkJCXJldHVybiAtRU5PRU5UOwotCQlpZiAodGFnID09IERXX1RBR191bmlvbl90eXBlKQotCQkJdG1wID0gInVuaW9uICI7Ci0JCWVsc2UgaWYgKHRhZyA9PSBEV19UQUdfc3RydWN0dXJlX3R5cGUpCi0JCQl0bXAgPSAic3RydWN0ICI7Ci0JCS8qIFdyaXRlIGEgYmFzZSBuYW1lICovCi0JCXJldCA9IHNucHJpbnRmKGJ1ZiwgbGVuLCAiJXMlcyIsIHRtcCwgZHdhcmZfZGllbmFtZSgmdHlwZSkpOwotCQlyZXR1cm4gKHJldCA+PSBsZW4pID8gLUUyQklHIDogcmV0OwotCX0KLQlyZXQgPSBkaWVfZ2V0X3R5cGVuYW1lKCZ0eXBlLCBidWYsIGxlbik7Ci0JaWYgKHJldCA+IDApIHsKLQkJcmV0MiA9IHNucHJpbnRmKGJ1ZiArIHJldCwgbGVuIC0gcmV0LCAiJXMiLCB0bXApOwotCQlyZXQgPSAocmV0MiA+PSBsZW4gLSByZXQpID8gLUUyQklHIDogcmV0MiArIHJldDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogR2V0IHRoZSBuYW1lIGFuZCB0eXBlIG9mIGdpdmVuIHZhcmlhYmxlIERJRSwgc3RvcmVkIGFzICJ0eXBlXHRuYW1lIiAqLwotc3RhdGljIGludCBkaWVfZ2V0X3Zhcm5hbWUoRHdhcmZfRGllICp2cl9kaWUsIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgcmV0LCByZXQyOwotCi0JcmV0ID0gZGllX2dldF90eXBlbmFtZSh2cl9kaWUsIGJ1ZiwgbGVuKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIGdldCB0eXBlLCBtYWtlIGl0IHVua25vd24uXG4iKTsKLQkJcmV0ID0gc25wcmludGYoYnVmLCBsZW4sICIodW5rbm93bl90eXBlKSIpOwotCX0KLQlpZiAocmV0ID4gMCkgewotCQlyZXQyID0gc25wcmludGYoYnVmICsgcmV0LCBsZW4gLSByZXQsICJcdCVzIiwKLQkJCQlkd2FyZl9kaWVuYW1lKHZyX2RpZSkpOwotCQlyZXQgPSAocmV0MiA+PSBsZW4gLSByZXQpID8gLUUyQklHIDogcmV0MiArIHJldDsKLQl9Ci0JcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTg5Nyw2ICszNzQsNyBAQAogCXN0cnVjdCBwcm9iZV90cmFjZV9hcmdfcmVmICoqcmVmX3B0ciA9ICZ0dmFyLT5yZWY7CiAJRHdhcmZfRGllIHR5cGU7CiAJY2hhciBidWZbMTZdOworCWludCBic2l6ZSwgYm9mZnMsIHRvdGFsOwogCWludCByZXQ7CiAKIAkvKiBUT0RPOiBjaGVjayBhbGwgdHlwZXMgKi8KQEAgLTkwNiwxMSArMzg0LDE1IEBACiAJCXJldHVybiAodHZhci0+dHlwZSA9PSBOVUxMKSA/IC1FTk9NRU0gOiAwOwogCX0KIAotCWlmIChkaWVfZ2V0X2JpdF9zaXplKHZyX2RpZSkgIT0gMCkgeworCWJzaXplID0gZHdhcmZfYml0c2l6ZSh2cl9kaWUpOworCWlmIChic2l6ZSA+IDApIHsKIAkJLyogVGhpcyBpcyBhIGJpdGZpZWxkICovCi0JCXJldCA9IHNucHJpbnRmKGJ1ZiwgMTYsICJiJWRAJWQvJXpkIiwgZGllX2dldF9iaXRfc2l6ZSh2cl9kaWUpLAotCQkJCWRpZV9nZXRfYml0X29mZnNldCh2cl9kaWUpLAotCQkJCUJZVEVTX1RPX0JJVFMoZGllX2dldF9ieXRlX3NpemUodnJfZGllKSkpOworCQlib2ZmcyA9IGR3YXJmX2JpdG9mZnNldCh2cl9kaWUpOworCQl0b3RhbCA9IGR3YXJmX2J5dGVzaXplKHZyX2RpZSk7CisJCWlmIChib2ZmcyA8IDAgfHwgdG90YWwgPCAwKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJCXJldCA9IHNucHJpbnRmKGJ1ZiwgMTYsICJiJWRAJWQvJXpkIiwgYnNpemUsIGJvZmZzLAorCQkJCUJZVEVTX1RPX0JJVFModG90YWwpKTsKIAkJZ290byBmb3JtYXR0ZWQ7CiAJfQogCkBAIC05NTgsMTAgKzQ0MCwxMSBAQAogCQlyZXR1cm4gKHR2YXItPnR5cGUgPT0gTlVMTCkgPyAtRU5PTUVNIDogMDsKIAl9CiAKLQlyZXQgPSBCWVRFU19UT19CSVRTKGRpZV9nZXRfYnl0ZV9zaXplKCZ0eXBlKSk7Ci0JaWYgKCFyZXQpCisJcmV0ID0gZHdhcmZfYnl0ZXNpemUoJnR5cGUpOworCWlmIChyZXQgPD0gMCkKIAkJLyogTm8gc2l6ZSAuLi4gdHJ5IHRvIHVzZSBkZWZhdWx0IHR5cGUgKi8KIAkJcmV0dXJuIDA7CisJcmV0ID0gQllURVNfVE9fQklUUyhyZXQpOwogCiAJLyogQ2hlY2sgdGhlIGJpdHdpZHRoICovCiAJaWYgKHJldCA+IE1BWF9CQVNJQ19UWVBFX0JJVFMpIHsKQEAgLTEwMjUsNyArNTA4LDcgQEAKIAkJCWVsc2UKIAkJCQkqcmVmX3B0ciA9IHJlZjsKIAkJfQotCQlyZWYtPm9mZnNldCArPSBkaWVfZ2V0X2J5dGVfc2l6ZSgmdHlwZSkgKiBmaWVsZC0+aW5kZXg7CisJCXJlZi0+b2Zmc2V0ICs9IGR3YXJmX2J5dGVzaXplKCZ0eXBlKSAqIGZpZWxkLT5pbmRleDsKIAkJaWYgKCFmaWVsZC0+bmV4dCkKIAkJCS8qIFNhdmUgdnJfZGllIGZvciBjb252ZXJ0aW5nIHR5cGVzICovCiAJCQltZW1jcHkoZGllX21lbSwgdnJfZGllLCBzaXplb2YoKmRpZV9tZW0pKTsKQEAgLTEyNDUsOCArNzI4LDcgQEAKIAogCS8qIElmIG5vIHJlYWwgc3VicHJvZ3JhbSwgZmluZCBhIHJlYWwgb25lICovCiAJaWYgKCFzcF9kaWUgfHwgZHdhcmZfdGFnKHNwX2RpZSkgIT0gRFdfVEFHX3N1YnByb2dyYW0pIHsKLQkJc3BfZGllID0gZGllX2ZpbmRfcmVhbF9zdWJwcm9ncmFtKCZwZi0+Y3VfZGllLAotCQkJCQkJICBwZi0+YWRkciwgJmRpZV9tZW0pOworCQlzcF9kaWUgPSBkaWVfZmluZF9yZWFsZnVuYygmcGYtPmN1X2RpZSwgcGYtPmFkZHIsICZkaWVfbWVtKTsKIAkJaWYgKCFzcF9kaWUpIHsKIAkJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBmaW5kIHByb2JlIHBvaW50IGluIGFueSAiCiAJCQkJICAgImZ1bmN0aW9ucy5cbiIpOwpAQCAtMTUwNCwyOCArOTg2LDE4IEBACiB9CiAKIC8qIEZpbmQgcHJvYmUgcG9pbnRzIGZyb20gZGVidWdpbmZvICovCi1zdGF0aWMgaW50IGZpbmRfcHJvYmVzKGludCBmZCwgc3RydWN0IHByb2JlX2ZpbmRlciAqcGYpCitzdGF0aWMgaW50IGRlYnVnaW5mb19fZmluZF9wcm9iZXMoc3RydWN0IGRlYnVnaW5mbyAqc2VsZiwKKwkJCQkgIHN0cnVjdCBwcm9iZV9maW5kZXIgKnBmKQogewogCXN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpwcCA9ICZwZi0+cGV2LT5wb2ludDsKIAlEd2FyZl9PZmYgb2ZmLCBub2ZmOwogCXNpemVfdCBjdWhsOwogCUR3YXJmX0RpZSAqZGllcDsKLQlEd2FyZiAqZGJnID0gTlVMTDsKLQlEd2ZsICpkd2ZsOwotCUR3YXJmX0FkZHIgYmlhczsJLyogQ3VycmVudGx5IGlnbm9yZWQgKi8KIAlpbnQgcmV0ID0gMDsKIAotCWRiZyA9IGR3ZmxfaW5pdF9vZmZsaW5lX2R3YXJmKGZkLCAmZHdmbCwgJmJpYXMpOwotCWlmICghZGJnKSB7Ci0JCXByX3dhcm5pbmcoIk5vIGRlYnVnIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoZSB2bWxpbnV4IC0gIgotCQkJInBsZWFzZSByZWJ1aWxkIHdpdGggQ09ORklHX0RFQlVHX0lORk89eS5cbiIpOwotCQljbG9zZShmZCk7CS8qIFdpdGhvdXQgZHdmbF9lbmQoKSwgZmQgaXNuJ3QgY2xvc2VkLiAqLwotCQlyZXR1cm4gLUVCQURGOwotCX0KLQogI2lmIF9FTEZVVElMU19QUkVSRVEoMCwgMTQyKQogCS8qIEdldCB0aGUgY2FsbCBmcmFtZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgZHdhcmYgKi8KLQlwZi0+Y2ZpID0gZHdhcmZfZ2V0Y2ZpKGRiZyk7CisJcGYtPmNmaSA9IGR3YXJmX2dldGNmaShzZWxmLT5kYmcpOwogI2VuZGlmCiAKIAlvZmYgPSAwOwpAQCAtMTU0NCw3ICsxMDE2LDggQEAKIAkJCS5kYXRhID0gcGYsCiAJCX07CiAKLQkJZHdhcmZfZ2V0cHVibmFtZXMoZGJnLCBwdWJuYW1lX3NlYXJjaF9jYiwgJnB1Ym5hbWVfcGFyYW0sIDApOworCQlkd2FyZl9nZXRwdWJuYW1lcyhzZWxmLT5kYmcsIHB1Ym5hbWVfc2VhcmNoX2NiLAorCQkJCSAgJnB1Ym5hbWVfcGFyYW0sIDApOwogCQlpZiAocHVibmFtZV9wYXJhbS5mb3VuZCkgewogCQkJcmV0ID0gcHJvYmVfcG9pbnRfc2VhcmNoX2NiKCZwZi0+c3BfZGllLCAmcHJvYmVfcGFyYW0pOwogCQkJaWYgKHJldCkKQEAgLTE1NTMsOSArMTAyNiw5IEBACiAJfQogCiAJLyogTG9vcCBvbiBDVXMgKENvbXBpbGF0aW9uIFVuaXQpICovCi0Jd2hpbGUgKCFkd2FyZl9uZXh0Y3UoZGJnLCBvZmYsICZub2ZmLCAmY3VobCwgTlVMTCwgTlVMTCwgTlVMTCkpIHsKKwl3aGlsZSAoIWR3YXJmX25leHRjdShzZWxmLT5kYmcsIG9mZiwgJm5vZmYsICZjdWhsLCBOVUxMLCBOVUxMLCBOVUxMKSkgewogCQkvKiBHZXQgdGhlIERJRShEZWJ1Z2dpbmcgSW5mb3JtYXRpb24gRW50cnkpIG9mIHRoaXMgQ1UgKi8KLQkJZGllcCA9IGR3YXJmX29mZmRpZShkYmcsIG9mZiArIGN1aGwsICZwZi0+Y3VfZGllKTsKKwkJZGllcCA9IGR3YXJmX29mZmRpZShzZWxmLT5kYmcsIG9mZiArIGN1aGwsICZwZi0+Y3VfZGllKTsKIAkJaWYgKCFkaWVwKQogCQkJY29udGludWU7CiAKQEAgLTE1ODIsOCArMTA1NSw2IEBACiAKIGZvdW5kOgogCWxpbmVfbGlzdF9fZnJlZSgmcGYtPmxjYWNoZSk7Ci0JaWYgKGR3ZmwpCi0JCWR3ZmxfZW5kKGR3ZmwpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2MjksOCArMTEwMCw5IEBACiB9CiAKIC8qIEZpbmQgcHJvYmVfdHJhY2VfZXZlbnRzIHNwZWNpZmllZCBieSBwZXJmX3Byb2JlX2V2ZW50IGZyb20gZGVidWdpbmZvICovCi1pbnQgZmluZF9wcm9iZV90cmFjZV9ldmVudHMoaW50IGZkLCBzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAotCQkJICAgIHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqKnRldnMsIGludCBtYXhfdGV2cykKK2ludCBkZWJ1Z2luZm9fX2ZpbmRfdHJhY2VfZXZlbnRzKHN0cnVjdCBkZWJ1Z2luZm8gKnNlbGYsCisJCQkJIHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCisJCQkJIHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqKnRldnMsIGludCBtYXhfdGV2cykKIHsKIAlzdHJ1Y3QgdHJhY2VfZXZlbnRfZmluZGVyIHRmID0gewogCQkJLnBmID0gey5wZXYgPSBwZXYsIC5jYWxsYmFjayA9IGFkZF9wcm9iZV90cmFjZV9ldmVudH0sCkBAIC0xNjQ1LDcgKzExMTcsNyBAQAogCXRmLnRldnMgPSAqdGV2czsKIAl0Zi5udGV2cyA9IDA7CiAKLQlyZXQgPSBmaW5kX3Byb2JlcyhmZCwgJnRmLnBmKTsKKwlyZXQgPSBkZWJ1Z2luZm9fX2ZpbmRfcHJvYmVzKHNlbGYsICZ0Zi5wZik7CiAJaWYgKHJldCA8IDApIHsKIAkJZnJlZSgqdGV2cyk7CiAJCSp0ZXZzID0gTlVMTDsKQEAgLTE3MzksOSArMTIxMSwxMCBAQAogfQogCiAvKiBGaW5kIGF2YWlsYWJsZSB2YXJpYWJsZXMgYXQgZ2l2ZW4gcHJvYmUgcG9pbnQgKi8KLWludCBmaW5kX2F2YWlsYWJsZV92YXJzX2F0KGludCBmZCwgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKLQkJCSAgIHN0cnVjdCB2YXJpYWJsZV9saXN0ICoqdmxzLCBpbnQgbWF4X3ZscywKLQkJCSAgIGJvb2wgZXh0ZXJucykKK2ludCBkZWJ1Z2luZm9fX2ZpbmRfYXZhaWxhYmxlX3ZhcnNfYXQoc3RydWN0IGRlYnVnaW5mbyAqc2VsZiwKKwkJCQkgICAgICBzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAorCQkJCSAgICAgIHN0cnVjdCB2YXJpYWJsZV9saXN0ICoqdmxzLAorCQkJCSAgICAgIGludCBtYXhfdmxzLCBib29sIGV4dGVybnMpCiB7CiAJc3RydWN0IGF2YWlsYWJsZV92YXJfZmluZGVyIGFmID0gewogCQkJLnBmID0gey5wZXYgPSBwZXYsIC5jYWxsYmFjayA9IGFkZF9hdmFpbGFibGVfdmFyc30sCkBAIC0xNzU2LDcgKzEyMjksNyBAQAogCWFmLnZscyA9ICp2bHM7CiAJYWYubnZscyA9IDA7CiAKLQlyZXQgPSBmaW5kX3Byb2JlcyhmZCwgJmFmLnBmKTsKKwlyZXQgPSBkZWJ1Z2luZm9fX2ZpbmRfcHJvYmVzKHNlbGYsICZhZi5wZik7CiAJaWYgKHJldCA8IDApIHsKIAkJLyogRnJlZSB2bGlzdCBmb3IgZXJyb3IgKi8KIAkJd2hpbGUgKGFmLm52bHMtLSkgewpAQCAtMTc3NCwyOCArMTI0NywxOSBAQAogfQogCiAvKiBSZXZlcnNlIHNlYXJjaCAqLwotaW50IGZpbmRfcGVyZl9wcm9iZV9wb2ludCh1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpwcHQpCitpbnQgZGVidWdpbmZvX19maW5kX3Byb2JlX3BvaW50KHN0cnVjdCBkZWJ1Z2luZm8gKnNlbGYsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHB0KQogewogCUR3YXJmX0RpZSBjdWRpZSwgc3BkaWUsIGluZGllOwotCUR3YXJmICpkYmcgPSBOVUxMOwotCUR3ZmwgKmR3ZmwgPSBOVUxMOwotCUR3YXJmX0FkZHIgX2FkZHIsIGJhc2VhZGRyLCBiaWFzID0gMDsKKwlEd2FyZl9BZGRyIF9hZGRyLCBiYXNlYWRkcjsKIAljb25zdCBjaGFyICpmbmFtZSA9IE5VTEwsICpmdW5jID0gTlVMTCwgKnRtcDsKIAlpbnQgYmFzZWxpbmUgPSAwLCBsaW5lbm8gPSAwLCByZXQgPSAwOwogCi0JLyogT3BlbiB0aGUgbGl2ZSBsaW51eCBrZXJuZWwgKi8KLQlkYmcgPSBkd2ZsX2luaXRfbGl2ZV9rZXJuZWxfZHdhcmYoYWRkciwgJmR3ZmwsICZiaWFzKTsKLQlpZiAoIWRiZykgewotCQlwcl93YXJuaW5nKCJObyBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUgdm1saW51eCAtICIKLQkJCSJwbGVhc2UgcmVidWlsZCB3aXRoIENPTkZJR19ERUJVR19JTkZPPXkuXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCiAJLyogQWRqdXN0IGFkZHJlc3Mgd2l0aCBiaWFzICovCi0JYWRkciArPSBiaWFzOworCWFkZHIgKz0gc2VsZi0+YmlhczsKKwogCS8qIEZpbmQgY3UgZGllICovCi0JaWYgKCFkd2FyZl9hZGRyZGllKGRiZywgKER3YXJmX0FkZHIpYWRkciAtIGJpYXMsICZjdWRpZSkpIHsKKwlpZiAoIWR3YXJmX2FkZHJkaWUoc2VsZi0+ZGJnLCAoRHdhcmZfQWRkcilhZGRyIC0gc2VsZi0+YmlhcywgJmN1ZGllKSkgewogCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gZmluZCBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgYWRkcmVzcyAlbHhcbiIsCiAJCQkgICBhZGRyKTsKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTE4MDcsNyArMTI3MSw3IEBACiAJLyogRG9uJ3QgY2FyZSB3aGV0aGVyIGl0IGZhaWxlZCBvciBub3QgKi8KIAogCS8qIEZpbmQgYSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIChuYW1lLCBiYXNlbGluZSBhbmQgYmFzZWFkZHIpICovCi0JaWYgKGRpZV9maW5kX3JlYWxfc3VicHJvZ3JhbSgmY3VkaWUsIChEd2FyZl9BZGRyKWFkZHIsICZzcGRpZSkpIHsKKwlpZiAoZGllX2ZpbmRfcmVhbGZ1bmMoJmN1ZGllLCAoRHdhcmZfQWRkcilhZGRyLCAmc3BkaWUpKSB7CiAJCS8qIEdldCBmdW5jdGlvbiBlbnRyeSBpbmZvcm1hdGlvbiAqLwogCQl0bXAgPSBkd2FyZl9kaWVuYW1lKCZzcGRpZSk7CiAJCWlmICghdG1wIHx8CkBAIC0xODcxLDggKzEzMzUsNiBAQAogCQl9CiAJfQogZW5kOgotCWlmIChkd2ZsKQotCQlkd2ZsX2VuZChkd2ZsKTsKIAlpZiAocmV0ID09IDAgJiYgKGZuYW1lIHx8IGZ1bmMpKQogCQlyZXQgPSAxOwkvKiBGb3VuZCBhIHBvaW50ICovCiAJcmV0dXJuIHJldDsKQEAgLTE5ODIsMjYgKzE0NDQsMTUgQEAKIAlyZXR1cm4gcGFyYW0ucmV0dmFsOwogfQogCi1pbnQgZmluZF9saW5lX3JhbmdlKGludCBmZCwgc3RydWN0IGxpbmVfcmFuZ2UgKmxyKQoraW50IGRlYnVnaW5mb19fZmluZF9saW5lX3JhbmdlKHN0cnVjdCBkZWJ1Z2luZm8gKnNlbGYsIHN0cnVjdCBsaW5lX3JhbmdlICpscikKIHsKIAlzdHJ1Y3QgbGluZV9maW5kZXIgbGYgPSB7LmxyID0gbHIsIC5mb3VuZCA9IDB9OwogCWludCByZXQgPSAwOwogCUR3YXJmX09mZiBvZmYgPSAwLCBub2ZmOwogCXNpemVfdCBjdWhsOwogCUR3YXJmX0RpZSAqZGllcDsKLQlEd2FyZiAqZGJnID0gTlVMTDsKLQlEd2ZsICpkd2ZsOwotCUR3YXJmX0FkZHIgYmlhczsJLyogQ3VycmVudGx5IGlnbm9yZWQgKi8KIAljb25zdCBjaGFyICpjb21wX2RpcjsKIAotCWRiZyA9IGR3ZmxfaW5pdF9vZmZsaW5lX2R3YXJmKGZkLCAmZHdmbCwgJmJpYXMpOwotCWlmICghZGJnKSB7Ci0JCXByX3dhcm5pbmcoIk5vIGRlYnVnIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoZSB2bWxpbnV4IC0gIgotCQkJInBsZWFzZSByZWJ1aWxkIHdpdGggQ09ORklHX0RFQlVHX0lORk89eS5cbiIpOwotCQljbG9zZShmZCk7CS8qIFdpdGhvdXQgZHdmbF9lbmQoKSwgZmQgaXNuJ3QgY2xvc2VkLiAqLwotCQlyZXR1cm4gLUVCQURGOwotCX0KLQogCS8qIEZhc3RwYXRoOiBsb29rdXAgYnkgZnVuY3Rpb24gbmFtZSBmcm9tIC5kZWJ1Z19wdWJuYW1lcyBzZWN0aW9uICovCiAJaWYgKGxyLT5mdW5jdGlvbikgewogCQlzdHJ1Y3QgcHVibmFtZV9jYWxsYmFja19wYXJhbSBwdWJuYW1lX3BhcmFtID0gewpAQCAtMjAxMCw3ICsxNDYxLDggQEAKIAkJc3RydWN0IGR3YXJmX2NhbGxiYWNrX3BhcmFtIGxpbmVfcmFuZ2VfcGFyYW0gPSB7CiAJCQkuZGF0YSA9ICh2b2lkICopJmxmLCAucmV0dmFsID0gMH07CiAKLQkJZHdhcmZfZ2V0cHVibmFtZXMoZGJnLCBwdWJuYW1lX3NlYXJjaF9jYiwgJnB1Ym5hbWVfcGFyYW0sIDApOworCQlkd2FyZl9nZXRwdWJuYW1lcyhzZWxmLT5kYmcsIHB1Ym5hbWVfc2VhcmNoX2NiLAorCQkJCSAgJnB1Ym5hbWVfcGFyYW0sIDApOwogCQlpZiAocHVibmFtZV9wYXJhbS5mb3VuZCkgewogCQkJbGluZV9yYW5nZV9zZWFyY2hfY2IoJmxmLnNwX2RpZSwgJmxpbmVfcmFuZ2VfcGFyYW0pOwogCQkJaWYgKGxmLmZvdW5kKQpAQCAtMjAyMCwxMSArMTQ3MiwxMiBAQAogCiAJLyogTG9vcCBvbiBDVXMgKENvbXBpbGF0aW9uIFVuaXQpICovCiAJd2hpbGUgKCFsZi5mb3VuZCAmJiByZXQgPj0gMCkgewotCQlpZiAoZHdhcmZfbmV4dGN1KGRiZywgb2ZmLCAmbm9mZiwgJmN1aGwsIE5VTEwsIE5VTEwsIE5VTEwpICE9IDApCisJCWlmIChkd2FyZl9uZXh0Y3Uoc2VsZi0+ZGJnLCBvZmYsICZub2ZmLCAmY3VobCwKKwkJCQkgTlVMTCwgTlVMTCwgTlVMTCkgIT0gMCkKIAkJCWJyZWFrOwogCiAJCS8qIEdldCB0aGUgRElFKERlYnVnZ2luZyBJbmZvcm1hdGlvbiBFbnRyeSkgb2YgdGhpcyBDVSAqLwotCQlkaWVwID0gZHdhcmZfb2ZmZGllKGRiZywgb2ZmICsgY3VobCwgJmxmLmN1X2RpZSk7CisJCWRpZXAgPSBkd2FyZl9vZmZkaWUoc2VsZi0+ZGJnLCBvZmYgKyBjdWhsLCAmbGYuY3VfZGllKTsKIAkJaWYgKCFkaWVwKQogCQkJY29udGludWU7CiAKQEAgLTIwNTgsNyArMTUxMSw2IEBACiAJfQogCiAJcHJfZGVidWcoInBhdGg6ICVzXG4iLCBsci0+cGF0aCk7Ci0JZHdmbF9lbmQoZHdmbCk7CiAJcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IGxmLmZvdW5kOwogfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmggYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmgKaW5kZXggNjA1NzMwYS4uYzQ3OGI0MiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaApAQCAtMTYsMjcgKzE2LDQyIEBACiB9CiAKICNpZmRlZiBEV0FSRl9TVVBQT1JUCisKKyNpbmNsdWRlICJkd2FyZi1hdXguaCIKKworLyogVE9ETzogZXhwb3J0IGRlYnVnaW5mbyBkYXRhIHN0cnVjdHVyZSBldmVuIGlmIG5vIGR3YXJmIHN1cHBvcnQgKi8KKworLyogZGVidWcgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCitzdHJ1Y3QgZGVidWdpbmZvIHsKKwlEd2FyZgkJKmRiZzsKKwlEd2ZsCQkqZHdmbDsKKwlEd2FyZl9BZGRyCWJpYXM7Cit9OworCitleHRlcm4gc3RydWN0IGRlYnVnaW5mbyAqZGVidWdpbmZvX19uZXcoY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gc3RydWN0IGRlYnVnaW5mbyAqZGVidWdpbmZvX19uZXdfb25saW5lX2tlcm5lbCh1bnNpZ25lZCBsb25nIGFkZHIpOworZXh0ZXJuIHZvaWQgZGVidWdpbmZvX19kZWxldGUoc3RydWN0IGRlYnVnaW5mbyAqc2VsZik7CisKIC8qIEZpbmQgcHJvYmVfdHJhY2VfZXZlbnRzIHNwZWNpZmllZCBieSBwZXJmX3Byb2JlX2V2ZW50IGZyb20gZGVidWdpbmZvICovCi1leHRlcm4gaW50IGZpbmRfcHJvYmVfdHJhY2VfZXZlbnRzKGludCBmZCwgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKLQkJCQkgICAgc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICoqdGV2cywKLQkJCQkgICAgaW50IG1heF90ZXZzKTsKK2V4dGVybiBpbnQgZGVidWdpbmZvX19maW5kX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgZGVidWdpbmZvICpzZWxmLAorCQkJCQlzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAorCQkJCQlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKip0ZXZzLAorCQkJCQlpbnQgbWF4X3RldnMpOwogCiAvKiBGaW5kIGEgcGVyZl9wcm9iZV9wb2ludCBmcm9tIGRlYnVnaW5mbyAqLwotZXh0ZXJuIGludCBmaW5kX3BlcmZfcHJvYmVfcG9pbnQodW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCSBzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHB0KTsKK2V4dGVybiBpbnQgZGVidWdpbmZvX19maW5kX3Byb2JlX3BvaW50KHN0cnVjdCBkZWJ1Z2luZm8gKnNlbGYsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkgICAgICAgc3RydWN0IHBlcmZfcHJvYmVfcG9pbnQgKnBwdCk7CiAKIC8qIEZpbmQgYSBsaW5lIHJhbmdlICovCi1leHRlcm4gaW50IGZpbmRfbGluZV9yYW5nZShpbnQgZmQsIHN0cnVjdCBsaW5lX3JhbmdlICpscik7CitleHRlcm4gaW50IGRlYnVnaW5mb19fZmluZF9saW5lX3JhbmdlKHN0cnVjdCBkZWJ1Z2luZm8gKnNlbGYsCisJCQkJICAgICAgc3RydWN0IGxpbmVfcmFuZ2UgKmxyKTsKIAogLyogRmluZCBhdmFpbGFibGUgdmFyaWFibGVzICovCi1leHRlcm4gaW50IGZpbmRfYXZhaWxhYmxlX3ZhcnNfYXQoaW50IGZkLCBzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAotCQkJCSAgc3RydWN0IHZhcmlhYmxlX2xpc3QgKip2bHMsIGludCBtYXhfcG9pbnRzLAotCQkJCSAgYm9vbCBleHRlcm5zKTsKLQotI2luY2x1ZGUgPGR3YXJmLmg+Ci0jaW5jbHVkZSA8ZWxmdXRpbHMvbGliZHcuaD4KLSNpbmNsdWRlIDxlbGZ1dGlscy9saWJkd2ZsLmg+Ci0jaW5jbHVkZSA8ZWxmdXRpbHMvdmVyc2lvbi5oPgorZXh0ZXJuIGludCBkZWJ1Z2luZm9fX2ZpbmRfYXZhaWxhYmxlX3ZhcnNfYXQoc3RydWN0IGRlYnVnaW5mbyAqc2VsZiwKKwkJCQkJICAgICBzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAorCQkJCQkgICAgIHN0cnVjdCB2YXJpYWJsZV9saXN0ICoqdmxzLAorCQkJCQkgICAgIGludCBtYXhfcG9pbnRzLCBib29sIGV4dGVybnMpOwogCiBzdHJ1Y3QgcHJvYmVfZmluZGVyIHsKIAlzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudAkqcGV2OwkJLyogVGFyZ2V0IHByb2JlIGV2ZW50ICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHl0aG9uLmMgYi90b29scy9wZXJmL3V0aWwvcHl0aG9uLmMKaW5kZXggNjk0MzZiMy4uOGUwYjVhMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3B5dGhvbi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9weXRob24uYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiBzdGF0aWMgaW50IHB5cmZfY3B1X21hcF9faW5pdChzdHJ1Y3QgcHlyZl9jcHVfbWFwICpwY3B1cywKIAkJCSAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsgImNwdXN0ciIsIE5VTEwsIE5VTEwsIH07CisJc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyAiY3B1c3RyIiwgTlVMTCB9OwogCWNoYXIgKmNwdXN0ciA9IE5VTEw7CiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8cyIsCkBAIC0zMTYsNyArMzE2LDcgQEAKIHN0YXRpYyBpbnQgcHlyZl90aHJlYWRfbWFwX19pbml0KHN0cnVjdCBweXJmX3RocmVhZF9tYXAgKnB0aHJlYWRzLAogCQkJCSBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJwaWQiLCAidGlkIiwgTlVMTCwgTlVMTCwgfTsKKwlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJwaWQiLCAidGlkIiwgTlVMTCB9OwogCWludCBwaWQgPSAtMSwgdGlkID0gLTE7CiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8aWkiLApAQCAtNDE4LDcgKzQxOCw5IEBACiAJCSJ3YWtldXBfZXZlbnRzIiwKIAkJImJwX3R5cGUiLAogCQkiYnBfYWRkciIsCi0JCSJicF9sZW4iLCBOVUxMLCBOVUxMLCB9OworCQkiYnBfbGVuIiwKKwkJIE5VTEwKKwl9OwogCXU2NCBzYW1wbGVfcGVyaW9kID0gMDsKIAl1MzIgZGlzYWJsZWQgPSAwLAogCSAgICBpbmhlcml0ID0gMCwKQEAgLTQ5OSw3ICs1MDEsNyBAQAogCXN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzID0gTlVMTDsKIAlQeU9iamVjdCAqcGNwdXMgPSBOVUxMLCAqcHRocmVhZHMgPSBOVUxMOwogCWludCBncm91cCA9IDAsIGluaGVyaXQgPSAwOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiY3B1cyIsICJ0aHJlYWRzIiwgImdyb3VwIiwgImluaGVyaXQiLCBOVUxMLCBOVUxMfTsKKwlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJjcHVzIiwgInRocmVhZHMiLCAiZ3JvdXAiLCAiaW5oZXJpdCIsIE5VTEwgfTsKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPT2lpIiwga3dsaXN0LAogCQkJCQkgJnBjcHVzLCAmcHRocmVhZHMsICZncm91cCwgJmluaGVyaXQpKQpAQCAtNTgyLDggKzU4NCw3IEBACiAJCQkJICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QgPSAmcGV2bGlzdC0+ZXZsaXN0OwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsicGFnZXMiLCAib3ZlcndyaXRlIiwKLQkJCQkgIE5VTEwsIE5VTEx9OworCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsgInBhZ2VzIiwgIm92ZXJ3cml0ZSIsIE5VTEwgfTsKIAlpbnQgcGFnZXMgPSAxMjgsIG92ZXJ3cml0ZSA9IGZhbHNlOwogCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifGlpIiwga3dsaXN0LApAQCAtNjAzLDcgKzYwNCw3IEBACiAJCQkJICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QgPSAmcGV2bGlzdC0+ZXZsaXN0OwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsidGltZW91dCIsIE5VTEwsIE5VTEx9OworCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsgInRpbWVvdXQiLCBOVUxMIH07CiAJaW50IHRpbWVvdXQgPSAtMSwgbjsKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpIiwga3dsaXN0LCAmdGltZW91dCkpCkBAIC02NzQsNyArNjc1LDcgQEAKIAlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCA9ICZwZXZsaXN0LT5ldmxpc3Q7CiAJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQ7CiAJaW50IHNhbXBsZV9pZF9hbGwgPSAxLCBjcHU7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzYW1wbGVfaWRfYWxsIiwgTlVMTCwgTlVMTH07CisJc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyAiY3B1IiwgInNhbXBsZV9pZF9hbGwiLCBOVUxMIH07CiAJaW50IGVycjsKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIml8aSIsIGt3bGlzdCwKQEAgLTY5MiwxNiArNjkzLDE0IEBACiAKIAkJZmlyc3QgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CiAJCWVyciA9IHBlcmZfZXZlbnRfX3BhcnNlX3NhbXBsZShldmVudCwgZmlyc3QtPmF0dHIuc2FtcGxlX3R5cGUsCi0JCQkJCSAgICAgICBwZXJmX3NhbXBsZV9zaXplKGZpcnN0LT5hdHRyLnNhbXBsZV90eXBlKSwKKwkJCQkJICAgICAgIHBlcmZfZXZzZWxfX3NhbXBsZV9zaXplKGZpcnN0KSwKIAkJCQkJICAgICAgIHNhbXBsZV9pZF9hbGwsICZwZXZlbnQtPnNhbXBsZSk7Ci0JCWlmIChlcnIpIHsKLQkJCXByX2VycigiQ2FuJ3QgcGFyc2Ugc2FtcGxlLCBlcnIgPSAlZFxuIiwgZXJyKTsKLQkJCWdvdG8gZW5kOwotCQl9Ci0KKwkJaWYgKGVycikKKwkJCXJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfT1NFcnJvciwKKwkJCQkJICAgICJwZXJmOiBjYW4ndCBwYXJzZSBzYW1wbGUsIGVycj0lZCIsIGVycik7CiAJCXJldHVybiBweWV2ZW50OwogCX0KLWVuZDoKKwogCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAlyZXR1cm4gUHlfTm9uZTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCmluZGV4IDY0NTAwZmMuLjcyNDU4ZDkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgInNlc3Npb24uaCIKICNpbmNsdWRlICJzb3J0LmgiCiAjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgImNwdW1hcC5oIgogCiBzdGF0aWMgaW50IHBlcmZfc2Vzc2lvbl9fb3BlbihzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmLCBib29sIGZvcmNlKQogewpAQCAtNTgsNiArNTksMTYgQEAKIAkJZ290byBvdXRfY2xvc2U7CiAJfQogCisJaWYgKCFwZXJmX2V2bGlzdF9fdmFsaWRfc2FtcGxlX3R5cGUoc2VsZi0+ZXZsaXN0KSkgeworCQlwcl9lcnIoIm5vbiBtYXRjaGluZyBzYW1wbGVfdHlwZSIpOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwlpZiAoIXBlcmZfZXZsaXN0X192YWxpZF9zYW1wbGVfaWRfYWxsKHNlbGYtPmV2bGlzdCkpIHsKKwkJcHJfZXJyKCJub24gbWF0Y2hpbmcgc2FtcGxlX2lkX2FsbCIpOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKIAlzZWxmLT5zaXplID0gaW5wdXRfc3RhdC5zdF9zaXplOwogCXJldHVybiAwOwogCkBAIC05Nyw3ICsxMDgsNyBAQAogdm9pZCBwZXJmX3Nlc3Npb25fX3VwZGF0ZV9zYW1wbGVfdHlwZShzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmKQogewogCXNlbGYtPnNhbXBsZV90eXBlID0gcGVyZl9ldmxpc3RfX3NhbXBsZV90eXBlKHNlbGYtPmV2bGlzdCk7Ci0Jc2VsZi0+c2FtcGxlX3NpemUgPSBwZXJmX3NhbXBsZV9zaXplKHNlbGYtPnNhbXBsZV90eXBlKTsKKwlzZWxmLT5zYW1wbGVfc2l6ZSA9IF9fcGVyZl9ldnNlbF9fc2FtcGxlX3NpemUoc2VsZi0+c2FtcGxlX3R5cGUpOwogCXNlbGYtPnNhbXBsZV9pZF9hbGwgPSBwZXJmX2V2bGlzdF9fc2FtcGxlX2lkX2FsbChzZWxmLT5ldmxpc3QpOwogCXBlcmZfc2Vzc2lvbl9faWRfaGVhZGVyX3NpemUoc2VsZik7CiB9CkBAIC0yMzcsOSArMjQ4LDE0IEBACiAJY2FsbGNoYWluX2N1cnNvcl9yZXNldCgmc2VsZi0+Y2FsbGNoYWluX2N1cnNvcik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2hhaW4tPm5yOyBpKyspIHsKLQkJdTY0IGlwID0gY2hhaW4tPmlwc1tpXTsKKwkJdTY0IGlwOwogCQlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKIAorCQlpZiAoY2FsbGNoYWluX3BhcmFtLm9yZGVyID09IE9SREVSX0NBTExFRSkKKwkJCWlwID0gY2hhaW4tPmlwc1tpXTsKKwkJZWxzZQorCQkJaXAgPSBjaGFpbi0+aXBzW2NoYWluLT5uciAtIGkgLSAxXTsKKwogCQlpZiAoaXAgPj0gUEVSRl9DT05URVhUX01BWCkgewogCQkJc3dpdGNoIChpcCkgewogCQkJY2FzZSBQRVJGX0NPTlRFWFRfSFY6CkBAIC0zOTcsMjAgKzQxMywyNiBAQAogCWV2ZW50LT5yZWFkLmlkCQkgPSBic3dhcF82NChldmVudC0+cmVhZC5pZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfX2F0dHJfc3dhcCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCkKKy8qIGV4cG9ydGVkIGZvciBzd2FwcGluZyBhdHRyaWJ1dGVzIGluIGZpbGUgaGVhZGVyICovCit2b2lkIHBlcmZfZXZlbnRfX2F0dHJfc3dhcChzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQoreworCWF0dHItPnR5cGUJCT0gYnN3YXBfMzIoYXR0ci0+dHlwZSk7CisJYXR0ci0+c2l6ZQkJPSBic3dhcF8zMihhdHRyLT5zaXplKTsKKwlhdHRyLT5jb25maWcJCT0gYnN3YXBfNjQoYXR0ci0+Y29uZmlnKTsKKwlhdHRyLT5zYW1wbGVfcGVyaW9kCT0gYnN3YXBfNjQoYXR0ci0+c2FtcGxlX3BlcmlvZCk7CisJYXR0ci0+c2FtcGxlX3R5cGUJPSBic3dhcF82NChhdHRyLT5zYW1wbGVfdHlwZSk7CisJYXR0ci0+cmVhZF9mb3JtYXQJPSBic3dhcF82NChhdHRyLT5yZWFkX2Zvcm1hdCk7CisJYXR0ci0+d2FrZXVwX2V2ZW50cwk9IGJzd2FwXzMyKGF0dHItPndha2V1cF9ldmVudHMpOworCWF0dHItPmJwX3R5cGUJCT0gYnN3YXBfMzIoYXR0ci0+YnBfdHlwZSk7CisJYXR0ci0+YnBfYWRkcgkJPSBic3dhcF82NChhdHRyLT5icF9hZGRyKTsKKwlhdHRyLT5icF9sZW4JCT0gYnN3YXBfNjQoYXR0ci0+YnBfbGVuKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9ldmVudF9faGRyX2F0dHJfc3dhcCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzaXplX3Qgc2l6ZTsKIAotCWV2ZW50LT5hdHRyLmF0dHIudHlwZQkJPSBic3dhcF8zMihldmVudC0+YXR0ci5hdHRyLnR5cGUpOwotCWV2ZW50LT5hdHRyLmF0dHIuc2l6ZQkJPSBic3dhcF8zMihldmVudC0+YXR0ci5hdHRyLnNpemUpOwotCWV2ZW50LT5hdHRyLmF0dHIuY29uZmlnCQk9IGJzd2FwXzY0KGV2ZW50LT5hdHRyLmF0dHIuY29uZmlnKTsKLQlldmVudC0+YXR0ci5hdHRyLnNhbXBsZV9wZXJpb2QJPSBic3dhcF82NChldmVudC0+YXR0ci5hdHRyLnNhbXBsZV9wZXJpb2QpOwotCWV2ZW50LT5hdHRyLmF0dHIuc2FtcGxlX3R5cGUJPSBic3dhcF82NChldmVudC0+YXR0ci5hdHRyLnNhbXBsZV90eXBlKTsKLQlldmVudC0+YXR0ci5hdHRyLnJlYWRfZm9ybWF0CT0gYnN3YXBfNjQoZXZlbnQtPmF0dHIuYXR0ci5yZWFkX2Zvcm1hdCk7Ci0JZXZlbnQtPmF0dHIuYXR0ci53YWtldXBfZXZlbnRzCT0gYnN3YXBfMzIoZXZlbnQtPmF0dHIuYXR0ci53YWtldXBfZXZlbnRzKTsKLQlldmVudC0+YXR0ci5hdHRyLmJwX3R5cGUJPSBic3dhcF8zMihldmVudC0+YXR0ci5hdHRyLmJwX3R5cGUpOwotCWV2ZW50LT5hdHRyLmF0dHIuYnBfYWRkcgk9IGJzd2FwXzY0KGV2ZW50LT5hdHRyLmF0dHIuYnBfYWRkcik7Ci0JZXZlbnQtPmF0dHIuYXR0ci5icF9sZW4JCT0gYnN3YXBfNjQoZXZlbnQtPmF0dHIuYXR0ci5icF9sZW4pOworCXBlcmZfZXZlbnRfX2F0dHJfc3dhcCgmZXZlbnQtPmF0dHIuYXR0cik7CiAKIAlzaXplID0gZXZlbnQtPmhlYWRlci5zaXplOwogCXNpemUgLT0gKHZvaWQgKikmZXZlbnQtPmF0dHIuaWQgLSAodm9pZCAqKWV2ZW50OwpAQCAtNDM4LDcgKzQ2MCw3IEBACiAJW1BFUkZfUkVDT1JEX0xPU1RdCQkgID0gcGVyZl9ldmVudF9fYWxsNjRfc3dhcCwKIAlbUEVSRl9SRUNPUkRfUkVBRF0JCSAgPSBwZXJmX2V2ZW50X19yZWFkX3N3YXAsCiAJW1BFUkZfUkVDT1JEX1NBTVBMRV0JCSAgPSBwZXJmX2V2ZW50X19hbGw2NF9zd2FwLAotCVtQRVJGX1JFQ09SRF9IRUFERVJfQVRUUl0JICA9IHBlcmZfZXZlbnRfX2F0dHJfc3dhcCwKKwlbUEVSRl9SRUNPUkRfSEVBREVSX0FUVFJdCSAgPSBwZXJmX2V2ZW50X19oZHJfYXR0cl9zd2FwLAogCVtQRVJGX1JFQ09SRF9IRUFERVJfRVZFTlRfVFlQRV0JICA9IHBlcmZfZXZlbnRfX2V2ZW50X3R5cGVfc3dhcCwKIAlbUEVSRl9SRUNPUkRfSEVBREVSX1RSQUNJTkdfREFUQV0gPSBwZXJmX2V2ZW50X190cmFjaW5nX2RhdGFfc3dhcCwKIAlbUEVSRl9SRUNPUkRfSEVBREVSX0JVSUxEX0lEXQkgID0gTlVMTCwKQEAgLTY5OCw5ICs3MjAsOSBAQAogCWlmICghZHVtcF90cmFjZSkKIAkJcmV0dXJuOwogCi0JcHJpbnRmKCIoSVAsICVkKTogJWQvJWQ6ICUjIiBQUkl4NjQgIiBwZXJpb2Q6ICUiIFBSSXU2NCAiXG4iLAorCXByaW50ZigiKElQLCAlZCk6ICVkLyVkOiAlIyIgUFJJeDY0ICIgcGVyaW9kOiAlIiBQUkl1NjQgIiBhZGRyOiAlIyIgUFJJeDY0ICJcbiIsCiAJICAgICAgIGV2ZW50LT5oZWFkZXIubWlzYywgc2FtcGxlLT5waWQsIHNhbXBsZS0+dGlkLCBzYW1wbGUtPmlwLAotCSAgICAgICBzYW1wbGUtPnBlcmlvZCk7CisJICAgICAgIHNhbXBsZS0+cGVyaW9kLCBzYW1wbGUtPmFkZHIpOwogCiAJaWYgKHNlc3Npb24tPnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ0FMTENIQUlOKQogCQljYWxsY2hhaW5fX3ByaW50ZihzYW1wbGUpOwpAQCAtMTE5Miw5ICsxMjE0LDEwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgcGVyZl9zZXNzaW9uX19wcmludF9zeW1ib2xzKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAotCQkJCXN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAotCQkJCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCit2b2lkIHBlcmZfc2Vzc2lvbl9fcHJpbnRfaXAodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCisJCQkgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCSAgICBpbnQgcHJpbnRfc3ltLCBpbnQgcHJpbnRfZHNvKQogewogCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOwogCWNvbnN0IGNoYXIgKnN5bW5hbWUsICpkc29uYW1lOwpAQCAtMTIyMywzMiArMTI0Niw4MyBAQAogCQkJaWYgKCFub2RlKQogCQkJCWJyZWFrOwogCi0JCQlpZiAobm9kZS0+c3ltICYmIG5vZGUtPnN5bS0+bmFtZSkKLQkJCQlzeW1uYW1lID0gbm9kZS0+c3ltLT5uYW1lOwotCQkJZWxzZQotCQkJCXN5bW5hbWUgPSAiIjsKKwkJCXByaW50ZigiXHQlMTYiIFBSSXg2NCwgbm9kZS0+aXApOworCQkJaWYgKHByaW50X3N5bSkgeworCQkJCWlmIChub2RlLT5zeW0gJiYgbm9kZS0+c3ltLT5uYW1lKQorCQkJCQlzeW1uYW1lID0gbm9kZS0+c3ltLT5uYW1lOworCQkJCWVsc2UKKwkJCQkJc3ltbmFtZSA9ICIiOwogCi0JCQlpZiAobm9kZS0+bWFwICYmIG5vZGUtPm1hcC0+ZHNvICYmIG5vZGUtPm1hcC0+ZHNvLT5uYW1lKQotCQkJCWRzb25hbWUgPSBub2RlLT5tYXAtPmRzby0+bmFtZTsKLQkJCWVsc2UKLQkJCQlkc29uYW1lID0gIiI7CisJCQkJcHJpbnRmKCIgJXMiLCBzeW1uYW1lKTsKKwkJCX0KKwkJCWlmIChwcmludF9kc28pIHsKKwkJCQlpZiAobm9kZS0+bWFwICYmIG5vZGUtPm1hcC0+ZHNvICYmIG5vZGUtPm1hcC0+ZHNvLT5uYW1lKQorCQkJCQlkc29uYW1lID0gbm9kZS0+bWFwLT5kc28tPm5hbWU7CisJCQkJZWxzZQorCQkJCQlkc29uYW1lID0gIiI7CiAKLQkJCXByaW50ZigiXHQlMTYiIFBSSXg2NCAiICVzICglcylcbiIsIG5vZGUtPmlwLCBzeW1uYW1lLCBkc29uYW1lKTsKKwkJCQlwcmludGYoIiAoJXMpIiwgZHNvbmFtZSk7CisJCQl9CisJCQlwcmludGYoIlxuIik7CiAKIAkJCWNhbGxjaGFpbl9jdXJzb3JfYWR2YW5jZShjdXJzb3IpOwogCQl9CiAKIAl9IGVsc2UgewotCQlpZiAoYWwuc3ltICYmIGFsLnN5bS0+bmFtZSkKLQkJCXN5bW5hbWUgPSBhbC5zeW0tPm5hbWU7Ci0JCWVsc2UKLQkJCXN5bW5hbWUgPSAiIjsKKwkJcHJpbnRmKCIlMTYiIFBSSXg2NCwgc2FtcGxlLT5pcCk7CisJCWlmIChwcmludF9zeW0pIHsKKwkJCWlmIChhbC5zeW0gJiYgYWwuc3ltLT5uYW1lKQorCQkJCXN5bW5hbWUgPSBhbC5zeW0tPm5hbWU7CisJCQllbHNlCisJCQkJc3ltbmFtZSA9ICIiOwogCi0JCWlmIChhbC5tYXAgJiYgYWwubWFwLT5kc28gJiYgYWwubWFwLT5kc28tPm5hbWUpCi0JCQlkc29uYW1lID0gYWwubWFwLT5kc28tPm5hbWU7Ci0JCWVsc2UKLQkJCWRzb25hbWUgPSAiIjsKKwkJCXByaW50ZigiICVzIiwgc3ltbmFtZSk7CisJCX0KIAotCQlwcmludGYoIiUxNiIgUFJJeDY0ICIgJXMgKCVzKSIsIGFsLmFkZHIsIHN5bW5hbWUsIGRzb25hbWUpOworCQlpZiAocHJpbnRfZHNvKSB7CisJCQlpZiAoYWwubWFwICYmIGFsLm1hcC0+ZHNvICYmIGFsLm1hcC0+ZHNvLT5uYW1lKQorCQkJCWRzb25hbWUgPSBhbC5tYXAtPmRzby0+bmFtZTsKKwkJCWVsc2UKKwkJCQlkc29uYW1lID0gIiI7CisKKwkJCXByaW50ZigiICglcykiLCBkc29uYW1lKTsKKwkJfQogCX0KIH0KKworaW50IHBlcmZfc2Vzc2lvbl9fY3B1X2JpdG1hcChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAorCQkJICAgICBjb25zdCBjaGFyICpjcHVfbGlzdCwgdW5zaWduZWQgbG9uZyAqY3B1X2JpdG1hcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY3B1X21hcCAqbWFwOworCisJZm9yIChpID0gMDsgaSA8IFBFUkZfVFlQRV9NQVg7ICsraSkgeworCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisKKwkJZXZzZWwgPSBwZXJmX3Nlc3Npb25fX2ZpbmRfZmlyc3RfZXZ0eXBlKHNlc3Npb24sIGkpOworCQlpZiAoIWV2c2VsKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoZXZzZWwtPmF0dHIuc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9DUFUpKSB7CisJCQlwcl9lcnIoIkZpbGUgZG9lcyBub3QgY29udGFpbiBDUFUgZXZlbnRzLiAiCisJCQkgICAgICAgIlJlbW92ZSAtYyBvcHRpb24gdG8gcHJvY2VlZC5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJbWFwID0gY3B1X21hcF9fbmV3KGNwdV9saXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXAtPm5yOyBpKyspIHsKKwkJaW50IGNwdSA9IG1hcC0+bWFwW2ldOworCisJCWlmIChjcHUgPj0gTUFYX05SX0NQVVMpIHsKKwkJCXByX2VycigiUmVxdWVzdGVkIENQVSAlZCB0b28gbGFyZ2UuICIKKwkJCSAgICAgICAiQ29uc2lkZXIgcmFpc2luZyBNQVhfTlJfQ1BVU1xuIiwgY3B1KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXNldF9iaXQoY3B1LCBjcHVfYml0bWFwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmggYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5oCmluZGV4IDY2ZDRlMTQuLjE3MDYwMWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uaApAQCAtMTEyLDYgKzExMiw3IEBACiAJCQkJCSAgICAgdTY0IGFkZHIpOwogCiB2b2lkIG1lbV9ic3dhcF82NCh2b2lkICpzcmMsIGludCBieXRlX3NpemUpOwordm9pZCBwZXJmX2V2ZW50X19hdHRyX3N3YXAoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cik7CiAKIGludCBwZXJmX3Nlc3Npb25fX2NyZWF0ZV9rZXJuZWxfbWFwcyhzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmKTsKIApAQCAtMTY3LDggKzE2OCwxMiBAQAogc3RydWN0IHBlcmZfZXZzZWwgKnBlcmZfc2Vzc2lvbl9fZmluZF9maXJzdF9ldnR5cGUoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKIAkJCQkJICAgIHVuc2lnbmVkIGludCB0eXBlKTsKIAotdm9pZCBwZXJmX3Nlc3Npb25fX3ByaW50X3N5bWJvbHModW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCit2b2lkIHBlcmZfc2Vzc2lvbl9fcHJpbnRfaXAodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAotCQkJCSBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKTsKKwkJCQkgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkgaW50IHByaW50X3N5bSwgaW50IHByaW50X2Rzbyk7CisKK2ludCBwZXJmX3Nlc3Npb25fX2NwdV9iaXRtYXAoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCSAgICAgY29uc3QgY2hhciAqY3B1X2xpc3QsIHVuc2lnbmVkIGxvbmcgKmNwdV9iaXRtYXApOwogCiAjZW5kaWYgLyogX19QRVJGX1NFU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3NvcnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmMKaW5kZXggZjQ0ZmE1NC4uNDAxZTIyMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3NvcnQuYworKysgYi90b29scy9wZXJmL3V0aWwvc29ydC5jCkBAIC0xNSw5NSArMTUsNiBAQAogCiBMSVNUX0hFQUQoaGlzdF9lbnRyeV9fc29ydF9saXN0KTsKIAotc3RhdGljIGludCBoaXN0X2VudHJ5X190aHJlYWRfc25wcmludGYoc3RydWN0IGhpc3RfZW50cnkgKnNlbGYsIGNoYXIgKmJmLAotCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHdpZHRoKTsKLXN0YXRpYyBpbnQgaGlzdF9lbnRyeV9fY29tbV9zbnByaW50ZihzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZiwgY2hhciAqYmYsCi0JCQkJICAgICBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHdpZHRoKTsKLXN0YXRpYyBpbnQgaGlzdF9lbnRyeV9fZHNvX3NucHJpbnRmKHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmLCBjaGFyICpiZiwKLQkJCQkgICAgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCB3aWR0aCk7Ci1zdGF0aWMgaW50IGhpc3RfZW50cnlfX3N5bV9zbnByaW50ZihzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZiwgY2hhciAqYmYsCi0JCQkJICAgIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgd2lkdGgpOwotc3RhdGljIGludCBoaXN0X2VudHJ5X19wYXJlbnRfc25wcmludGYoc3RydWN0IGhpc3RfZW50cnkgKnNlbGYsIGNoYXIgKmJmLAotCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHdpZHRoKTsKLXN0YXRpYyBpbnQgaGlzdF9lbnRyeV9fY3B1X3NucHJpbnRmKHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmLCBjaGFyICpiZiwKLQkJCQkgICAgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCB3aWR0aCk7Ci0KLXN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfdGhyZWFkID0gewotCS5zZV9oZWFkZXIJPSAiQ29tbWFuZDogIFBpZCIsCi0JLnNlX2NtcAkJPSBzb3J0X190aHJlYWRfY21wLAotCS5zZV9zbnByaW50Zgk9IGhpc3RfZW50cnlfX3RocmVhZF9zbnByaW50ZiwKLQkuc2Vfd2lkdGhfaWR4CT0gSElTVENfVEhSRUFELAotfTsKLQotc3RydWN0IHNvcnRfZW50cnkgc29ydF9jb21tID0gewotCS5zZV9oZWFkZXIJPSAiQ29tbWFuZCIsCi0JLnNlX2NtcAkJPSBzb3J0X19jb21tX2NtcCwKLQkuc2VfY29sbGFwc2UJPSBzb3J0X19jb21tX2NvbGxhcHNlLAotCS5zZV9zbnByaW50Zgk9IGhpc3RfZW50cnlfX2NvbW1fc25wcmludGYsCi0JLnNlX3dpZHRoX2lkeAk9IEhJU1RDX0NPTU0sCi19OwotCi1zdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X2RzbyA9IHsKLQkuc2VfaGVhZGVyCT0gIlNoYXJlZCBPYmplY3QiLAotCS5zZV9jbXAJCT0gc29ydF9fZHNvX2NtcCwKLQkuc2Vfc25wcmludGYJPSBoaXN0X2VudHJ5X19kc29fc25wcmludGYsCi0JLnNlX3dpZHRoX2lkeAk9IEhJU1RDX0RTTywKLX07Ci0KLXN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfc3ltID0gewotCS5zZV9oZWFkZXIJPSAiU3ltYm9sIiwKLQkuc2VfY21wCQk9IHNvcnRfX3N5bV9jbXAsCi0JLnNlX3NucHJpbnRmCT0gaGlzdF9lbnRyeV9fc3ltX3NucHJpbnRmLAotCS5zZV93aWR0aF9pZHgJPSBISVNUQ19TWU1CT0wsCi19OwotCi1zdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X3BhcmVudCA9IHsKLQkuc2VfaGVhZGVyCT0gIlBhcmVudCBzeW1ib2wiLAotCS5zZV9jbXAJCT0gc29ydF9fcGFyZW50X2NtcCwKLQkuc2Vfc25wcmludGYJPSBoaXN0X2VudHJ5X19wYXJlbnRfc25wcmludGYsCi0JLnNlX3dpZHRoX2lkeAk9IEhJU1RDX1BBUkVOVCwKLX07Ci0gCi1zdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X2NwdSA9IHsKLQkuc2VfaGVhZGVyICAgICAgPSAiQ1BVIiwKLQkuc2VfY21wCSAgICAgICAgPSBzb3J0X19jcHVfY21wLAotCS5zZV9zbnByaW50ZiAgICA9IGhpc3RfZW50cnlfX2NwdV9zbnByaW50ZiwKLQkuc2Vfd2lkdGhfaWR4CT0gSElTVENfQ1BVLAotfTsKLQotc3RydWN0IHNvcnRfZGltZW5zaW9uIHsKLQljb25zdCBjaGFyCQkqbmFtZTsKLQlzdHJ1Y3Qgc29ydF9lbnRyeQkqZW50cnk7Ci0JaW50CQkJdGFrZW47Ci19OwotCi1zdGF0aWMgc3RydWN0IHNvcnRfZGltZW5zaW9uIHNvcnRfZGltZW5zaW9uc1tdID0gewotCXsgLm5hbWUgPSAicGlkIiwJLmVudHJ5ID0gJnNvcnRfdGhyZWFkLAl9LAotCXsgLm5hbWUgPSAiY29tbSIsCS5lbnRyeSA9ICZzb3J0X2NvbW0sCX0sCi0JeyAubmFtZSA9ICJkc28iLAkuZW50cnkgPSAmc29ydF9kc28sCX0sCi0JeyAubmFtZSA9ICJzeW1ib2wiLAkuZW50cnkgPSAmc29ydF9zeW0sCX0sCi0JeyAubmFtZSA9ICJwYXJlbnQiLAkuZW50cnkgPSAmc29ydF9wYXJlbnQsCX0sCi0JeyAubmFtZSA9ICJjcHUiLAkuZW50cnkgPSAmc29ydF9jcHUsCX0sCi19OwotCi1pbnQ2NF90IGNtcF9udWxsKHZvaWQgKmwsIHZvaWQgKnIpCi17Ci0JaWYgKCFsICYmICFyKQotCQlyZXR1cm4gMDsKLQllbHNlIGlmICghbCkKLQkJcmV0dXJuIC0xOwotCWVsc2UKLQkJcmV0dXJuIDE7Ci19Ci0KLS8qIC0tc29ydCBwaWQgKi8KLQotaW50NjRfdAotc29ydF9fdGhyZWFkX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQotewotCXJldHVybiByaWdodC0+dGhyZWFkLT5waWQgLSBsZWZ0LT50aHJlYWQtPnBpZDsKLX0KLQogc3RhdGljIGludCByZXBzZXBfc25wcmludGYoY2hhciAqYmYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAlpbnQgbjsKQEAgLTEyNSw2ICszNiwyNCBAQAogCXJldHVybiBuOwogfQogCitzdGF0aWMgaW50NjRfdCBjbXBfbnVsbCh2b2lkICpsLCB2b2lkICpyKQoreworCWlmICghbCAmJiAhcikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoIWwpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAxOworfQorCisvKiAtLXNvcnQgcGlkICovCisKK3N0YXRpYyBpbnQ2NF90Citzb3J0X190aHJlYWRfY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJcmV0dXJuIHJpZ2h0LT50aHJlYWQtPnBpZCAtIGxlZnQtPnRocmVhZC0+cGlkOworfQorCiBzdGF0aWMgaW50IGhpc3RfZW50cnlfX3RocmVhZF9zbnByaW50ZihzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZiwgY2hhciAqYmYsCiAJCQkJICAgICAgIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgd2lkdGgpCiB7CkBAIC0xMzIsMTUgKzYxLDUwIEBACiAJCQkgICAgICBzZWxmLT50aHJlYWQtPmNvbW0gPzogIiIsIHNlbGYtPnRocmVhZC0+cGlkKTsKIH0KIAorc3RydWN0IHNvcnRfZW50cnkgc29ydF90aHJlYWQgPSB7CisJLnNlX2hlYWRlcgk9ICJDb21tYW5kOiAgUGlkIiwKKwkuc2VfY21wCQk9IHNvcnRfX3RocmVhZF9jbXAsCisJLnNlX3NucHJpbnRmCT0gaGlzdF9lbnRyeV9fdGhyZWFkX3NucHJpbnRmLAorCS5zZV93aWR0aF9pZHgJPSBISVNUQ19USFJFQUQsCit9OworCisvKiAtLXNvcnQgY29tbSAqLworCitzdGF0aWMgaW50NjRfdAorc29ydF9fY29tbV9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKK3sKKwlyZXR1cm4gcmlnaHQtPnRocmVhZC0+cGlkIC0gbGVmdC0+dGhyZWFkLT5waWQ7Cit9CisKK3N0YXRpYyBpbnQ2NF90Citzb3J0X19jb21tX2NvbGxhcHNlKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJY2hhciAqY29tbV9sID0gbGVmdC0+dGhyZWFkLT5jb21tOworCWNoYXIgKmNvbW1fciA9IHJpZ2h0LT50aHJlYWQtPmNvbW07CisKKwlpZiAoIWNvbW1fbCB8fCAhY29tbV9yKQorCQlyZXR1cm4gY21wX251bGwoY29tbV9sLCBjb21tX3IpOworCisJcmV0dXJuIHN0cmNtcChjb21tX2wsIGNvbW1fcik7Cit9CisKIHN0YXRpYyBpbnQgaGlzdF9lbnRyeV9fY29tbV9zbnByaW50ZihzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZiwgY2hhciAqYmYsCiAJCQkJICAgICBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHdpZHRoKQogewogCXJldHVybiByZXBzZXBfc25wcmludGYoYmYsIHNpemUsICIlKnMiLCB3aWR0aCwgc2VsZi0+dGhyZWFkLT5jb21tKTsKIH0KIAorc3RydWN0IHNvcnRfZW50cnkgc29ydF9jb21tID0geworCS5zZV9oZWFkZXIJPSAiQ29tbWFuZCIsCisJLnNlX2NtcAkJPSBzb3J0X19jb21tX2NtcCwKKwkuc2VfY29sbGFwc2UJPSBzb3J0X19jb21tX2NvbGxhcHNlLAorCS5zZV9zbnByaW50Zgk9IGhpc3RfZW50cnlfX2NvbW1fc25wcmludGYsCisJLnNlX3dpZHRoX2lkeAk9IEhJU1RDX0NPTU0sCit9OworCiAvKiAtLXNvcnQgZHNvICovCiAKLWludDY0X3QKK3N0YXRpYyBpbnQ2NF90CiBzb3J0X19kc29fY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCiB7CiAJc3RydWN0IGRzbyAqZHNvX2wgPSBsZWZ0LT5tcy5tYXAgPyBsZWZ0LT5tcy5tYXAtPmRzbyA6IE5VTEw7CkBAIC0xNzMsOSArMTM3LDE2IEBACiAJcmV0dXJuIHJlcHNlcF9zbnByaW50ZihiZiwgc2l6ZSwgIiUtKnMiLCB3aWR0aCwgIlt1bmtub3duXSIpOwogfQogCitzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X2RzbyA9IHsKKwkuc2VfaGVhZGVyCT0gIlNoYXJlZCBPYmplY3QiLAorCS5zZV9jbXAJCT0gc29ydF9fZHNvX2NtcCwKKwkuc2Vfc25wcmludGYJPSBoaXN0X2VudHJ5X19kc29fc25wcmludGYsCisJLnNlX3dpZHRoX2lkeAk9IEhJU1RDX0RTTywKK307CisKIC8qIC0tc29ydCBzeW1ib2wgKi8KIAotaW50NjRfdAorc3RhdGljIGludDY0X3QKIHNvcnRfX3N5bV9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKIHsKIAl1NjQgaXBfbCwgaXBfcjsKQEAgLTIxMSwyOSArMTgyLDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogLS1zb3J0IGNvbW0gKi8KLQotaW50NjRfdAotc29ydF9fY29tbV9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKLXsKLQlyZXR1cm4gcmlnaHQtPnRocmVhZC0+cGlkIC0gbGVmdC0+dGhyZWFkLT5waWQ7Ci19Ci0KLWludDY0X3QKLXNvcnRfX2NvbW1fY29sbGFwc2Uoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKLXsKLQljaGFyICpjb21tX2wgPSBsZWZ0LT50aHJlYWQtPmNvbW07Ci0JY2hhciAqY29tbV9yID0gcmlnaHQtPnRocmVhZC0+Y29tbTsKLQotCWlmICghY29tbV9sIHx8ICFjb21tX3IpCi0JCXJldHVybiBjbXBfbnVsbChjb21tX2wsIGNvbW1fcik7Ci0KLQlyZXR1cm4gc3RyY21wKGNvbW1fbCwgY29tbV9yKTsKLX0KK3N0cnVjdCBzb3J0X2VudHJ5IHNvcnRfc3ltID0geworCS5zZV9oZWFkZXIJPSAiU3ltYm9sIiwKKwkuc2VfY21wCQk9IHNvcnRfX3N5bV9jbXAsCisJLnNlX3NucHJpbnRmCT0gaGlzdF9lbnRyeV9fc3ltX3NucHJpbnRmLAorCS5zZV93aWR0aF9pZHgJPSBISVNUQ19TWU1CT0wsCit9OwogCiAvKiAtLXNvcnQgcGFyZW50ICovCiAKLWludDY0X3QKK3N0YXRpYyBpbnQ2NF90CiBzb3J0X19wYXJlbnRfY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCiB7CiAJc3RydWN0IHN5bWJvbCAqc3ltX2wgPSBsZWZ0LT5wYXJlbnQ7CkBAIC0yNTIsOSArMjEwLDE2IEBACiAJCQkgICAgICBzZWxmLT5wYXJlbnQgPyBzZWxmLT5wYXJlbnQtPm5hbWUgOiAiW290aGVyXSIpOwogfQogCitzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X3BhcmVudCA9IHsKKwkuc2VfaGVhZGVyCT0gIlBhcmVudCBzeW1ib2wiLAorCS5zZV9jbXAJCT0gc29ydF9fcGFyZW50X2NtcCwKKwkuc2Vfc25wcmludGYJPSBoaXN0X2VudHJ5X19wYXJlbnRfc25wcmludGYsCisJLnNlX3dpZHRoX2lkeAk9IEhJU1RDX1BBUkVOVCwKK307CisKIC8qIC0tc29ydCBjcHUgKi8KIAotaW50NjRfdAorc3RhdGljIGludDY0X3QKIHNvcnRfX2NwdV9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKIHsKIAlyZXR1cm4gcmlnaHQtPmNwdSAtIGxlZnQtPmNwdTsKQEAgLTI2Niw2ICsyMzEsMjggQEAKIAlyZXR1cm4gcmVwc2VwX3NucHJpbnRmKGJmLCBzaXplLCAiJS0qZCIsIHdpZHRoLCBzZWxmLT5jcHUpOwogfQogCitzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X2NwdSA9IHsKKwkuc2VfaGVhZGVyICAgICAgPSAiQ1BVIiwKKwkuc2VfY21wCSAgICAgICAgPSBzb3J0X19jcHVfY21wLAorCS5zZV9zbnByaW50ZiAgICA9IGhpc3RfZW50cnlfX2NwdV9zbnByaW50ZiwKKwkuc2Vfd2lkdGhfaWR4CT0gSElTVENfQ1BVLAorfTsKKworc3RydWN0IHNvcnRfZGltZW5zaW9uIHsKKwljb25zdCBjaGFyCQkqbmFtZTsKKwlzdHJ1Y3Qgc29ydF9lbnRyeQkqZW50cnk7CisJaW50CQkJdGFrZW47Cit9OworCitzdGF0aWMgc3RydWN0IHNvcnRfZGltZW5zaW9uIHNvcnRfZGltZW5zaW9uc1tdID0geworCXsgLm5hbWUgPSAicGlkIiwJLmVudHJ5ID0gJnNvcnRfdGhyZWFkLAl9LAorCXsgLm5hbWUgPSAiY29tbSIsCS5lbnRyeSA9ICZzb3J0X2NvbW0sCX0sCisJeyAubmFtZSA9ICJkc28iLAkuZW50cnkgPSAmc29ydF9kc28sCX0sCisJeyAubmFtZSA9ICJzeW1ib2wiLAkuZW50cnkgPSAmc29ydF9zeW0sCX0sCisJeyAubmFtZSA9ICJwYXJlbnQiLAkuZW50cnkgPSAmc29ydF9wYXJlbnQsCX0sCisJeyAubmFtZSA9ICJjcHUiLAkuZW50cnkgPSAmc29ydF9jcHUsCX0sCit9OworCiBpbnQgc29ydF9kaW1lbnNpb25fX2FkZChjb25zdCBjaGFyICp0b2spCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC0yNzMsMTUgKzI2MCw5IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc29ydF9kaW1lbnNpb25zKTsgaSsrKSB7CiAJCXN0cnVjdCBzb3J0X2RpbWVuc2lvbiAqc2QgPSAmc29ydF9kaW1lbnNpb25zW2ldOwogCi0JCWlmIChzZC0+dGFrZW4pCi0JCQljb250aW51ZTsKLQogCQlpZiAoc3RybmNhc2VjbXAodG9rLCBzZC0+bmFtZSwgc3RybGVuKHRvaykpKQogCQkJY29udGludWU7CiAKLQkJaWYgKHNkLT5lbnRyeS0+c2VfY29sbGFwc2UpCi0JCQlzb3J0X19uZWVkX2NvbGxhcHNlID0gMTsKLQogCQlpZiAoc2QtPmVudHJ5ID09ICZzb3J0X3BhcmVudCkgewogCQkJaW50IHJldCA9IHJlZ2NvbXAoJnBhcmVudF9yZWdleCwgcGFyZW50X3BhdHRlcm4sIFJFR19FWFRFTkRFRCk7CiAJCQlpZiAocmV0KSB7CkBAIC0yOTQsNiArMjc1LDEyIEBACiAJCQlzb3J0X19oYXNfcGFyZW50ID0gMTsKIAkJfQogCisJCWlmIChzZC0+dGFrZW4pCisJCQlyZXR1cm4gMDsKKworCQlpZiAoc2QtPmVudHJ5LT5zZV9jb2xsYXBzZSkKKwkJCXNvcnRfX25lZWRfY29sbGFwc2UgPSAxOworCiAJCWlmIChsaXN0X2VtcHR5KCZoaXN0X2VudHJ5X19zb3J0X2xpc3QpKSB7CiAJCQlpZiAoIXN0cmNtcChzZC0+bmFtZSwgInBpZCIpKQogCQkJCXNvcnRfX2ZpcnN0X2RpbWVuc2lvbiA9IFNPUlRfUElEOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3NvcnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmgKaW5kZXggMGI5MTA1My4uNzdkMDM4OCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3NvcnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvc29ydC5oCkBAIC0xMDMsMjAgKzEwMyw2IEBACiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBoaXN0X2VudHJ5X19zb3J0X2xpc3Q7CiAKIHZvaWQgc2V0dXBfc29ydGluZyhjb25zdCBjaGFyICogY29uc3QgdXNhZ2VzdHJbXSwgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0cyk7Ci0KLWV4dGVybiBzaXplX3Qgc29ydF9fdGhyZWFkX3ByaW50KEZJTEUgKiwgc3RydWN0IGhpc3RfZW50cnkgKiwgdW5zaWduZWQgaW50KTsKLWV4dGVybiBzaXplX3Qgc29ydF9fY29tbV9wcmludChGSUxFICosIHN0cnVjdCBoaXN0X2VudHJ5ICosIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gc2l6ZV90IHNvcnRfX2Rzb19wcmludChGSUxFICosIHN0cnVjdCBoaXN0X2VudHJ5ICosIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gc2l6ZV90IHNvcnRfX3N5bV9wcmludChGSUxFICosIHN0cnVjdCBoaXN0X2VudHJ5ICosIHVuc2lnbmVkIGludCBfX3VzZWQpOwotZXh0ZXJuIGludDY0X3QgY21wX251bGwodm9pZCAqLCB2b2lkICopOwotZXh0ZXJuIGludDY0X3Qgc29ydF9fdGhyZWFkX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqKTsKLWV4dGVybiBpbnQ2NF90IHNvcnRfX2NvbW1fY21wKHN0cnVjdCBoaXN0X2VudHJ5ICosIHN0cnVjdCBoaXN0X2VudHJ5ICopOwotZXh0ZXJuIGludDY0X3Qgc29ydF9fY29tbV9jb2xsYXBzZShzdHJ1Y3QgaGlzdF9lbnRyeSAqLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqKTsKLWV4dGVybiBpbnQ2NF90IHNvcnRfX2Rzb19jbXAoc3RydWN0IGhpc3RfZW50cnkgKiwgc3RydWN0IGhpc3RfZW50cnkgKik7Ci1leHRlcm4gaW50NjRfdCBzb3J0X19zeW1fY21wKHN0cnVjdCBoaXN0X2VudHJ5ICosIHN0cnVjdCBoaXN0X2VudHJ5ICopOwotZXh0ZXJuIGludDY0X3Qgc29ydF9fcGFyZW50X2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqKTsKLWludDY0X3Qgc29ydF9fY3B1X2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KTsKLWV4dGVybiBzaXplX3Qgc29ydF9fcGFyZW50X3ByaW50KEZJTEUgKiwgc3RydWN0IGhpc3RfZW50cnkgKiwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgc29ydF9kaW1lbnNpb25fX2FkZChjb25zdCBjaGFyICopOwogdm9pZCBzb3J0X2VudHJ5X19zZXR1cF9lbGlkZShzdHJ1Y3Qgc29ydF9lbnRyeSAqc2VsZiwgc3RydWN0IHN0cmxpc3QgKmxpc3QsCiAJCQkgICAgIGNvbnN0IGNoYXIgKmxpc3RfbmFtZSwgRklMRSAqZnApOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N0cmluZy5jIGIvdG9vbHMvcGVyZi91dGlsL3N0cmluZy5jCmluZGV4IGI5YTk4NWQuLmQ1ODM2MzggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zdHJpbmcuYworKysgYi90b29scy9wZXJmL3V0aWwvc3RyaW5nLmMKQEAgLTI5NCwzICsyOTQsMjIgQEAKIHsKIAlyZXR1cm4gX19tYXRjaF9nbG9iKHN0ciwgcGF0LCB0cnVlKTsKIH0KKworLyoqCisgKiBzdHJ0YWlsY21wIC0gQ29tcGFyZSB0aGUgdGFpbCBvZiB0d28gc3RyaW5ncworICogQHMxOiAxc3Qgc3RyaW5nIHRvIGJlIGNvbXBhcmVkCisgKiBAczI6IDJuZCBzdHJpbmcgdG8gYmUgY29tcGFyZWQKKyAqCisgKiBSZXR1cm4gMCBpZiB3aG9sZSBvZiBlaXRoZXIgc3RyaW5nIGlzIHNhbWUgYXMgYW5vdGhlcidzIHRhaWwgcGFydC4KKyAqLworaW50IHN0cnRhaWxjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreworCWludCBpMSA9IHN0cmxlbihzMSk7CisJaW50IGkyID0gc3RybGVuKHMyKTsKKwl3aGlsZSAoLS1pMSA+PSAwICYmIC0taTIgPj0gMCkgeworCQlpZiAoczFbaTFdICE9IHMyW2kyXSkKKwkJCXJldHVybiBzMVtpMV0gLSBzMltpMl07CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtaW5mby5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LWluZm8uYwppbmRleCAzNTcyOWY0Li4zNDAzZjgxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtaW5mby5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1pbmZvLmMKQEAgLTE4MywxMSArMTgzLDIwIEBACiAJcmV0dXJuICpwdHIgPT0gMHgwMTAyMDMwNDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBjb3B5X2ZpbGVfZmQoaW50IGZkKQorLyogdW5mb3J0dW5hdGVseSwgeW91IGNhbiBub3Qgc3RhdCBkZWJ1Z2ZzIG9yIHByb2MgZmlsZXMgZm9yIHNpemUgKi8KK3N0YXRpYyB2b2lkIHJlY29yZF9maWxlKGNvbnN0IGNoYXIgKmZpbGUsIHNpemVfdCBoZHJfc3opCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIHNpemUgPSAwOwotCWNoYXIgYnVmW0JVRlNJWl07Ci0JaW50IHI7CisJY2hhciBidWZbQlVGU0laXSwgKnNpemVwOworCW9mZl90IGhkcl9wb3MgPSBsc2VlayhvdXRwdXRfZmQsIDAsIFNFRUtfQ1VSKTsKKwlpbnQgciwgZmQ7CisKKwlmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCWRpZSgiQ2FuJ3QgcmVhZCAnJXMnIiwgZmlsZSk7CisKKwkvKiBwdXQgaW4gemVyb3MgZm9yIGZpbGUgc2l6ZSwgdGhlbiBmaWxsIHRydWUgc2l6ZSBsYXRlciAqLworCXdyaXRlX29yX2RpZSgmc2l6ZSwgaGRyX3N6KTsKIAogCWRvIHsKIAkJciA9IHJlYWQoZmQsIGJ1ZiwgQlVGU0laKTsKQEAgLTE5Niw5MyArMjA1LDM3IEBACiAJCQl3cml0ZV9vcl9kaWUoYnVmLCByKTsKIAkJfQogCX0gd2hpbGUgKHIgPiAwKTsKLQotCXJldHVybiBzaXplOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGNvcHlfZmlsZShjb25zdCBjaGFyICpmaWxlKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplID0gMDsKLQlpbnQgZmQ7Ci0KLQlmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOwotCWlmIChmZCA8IDApCi0JCWRpZSgiQ2FuJ3QgcmVhZCAnJXMnIiwgZmlsZSk7Ci0Jc2l6ZSA9IGNvcHlfZmlsZV9mZChmZCk7CiAJY2xvc2UoZmQpOwogCi0JcmV0dXJuIHNpemU7Ci19CisJLyogdWdoLCBoYW5kbGUgYmlnLWVuZGlhbiBoZHJfc2l6ZSA9PSA0ICovCisJc2l6ZXAgPSAoY2hhciopJnNpemU7CisJaWYgKGJpZ2VuZGlhbigpKQorCQlzaXplcCArPSBzaXplb2YodTY0KSAtIGhkcl9zejsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3NpemVfZmQoaW50IGZkKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplID0gMDsKLQljaGFyIGJ1ZltCVUZTSVpdOwotCWludCByOwotCi0JZG8gewotCQlyID0gcmVhZChmZCwgYnVmLCBCVUZTSVopOwotCQlpZiAociA+IDApCi0JCQlzaXplICs9IHI7Ci0JfSB3aGlsZSAociA+IDApOwotCi0JbHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKLQotCXJldHVybiBzaXplOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfc2l6ZShjb25zdCBjaGFyICpmaWxlKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplID0gMDsKLQlpbnQgZmQ7Ci0KLQlmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOwotCWlmIChmZCA8IDApCi0JCWRpZSgiQ2FuJ3QgcmVhZCAnJXMnIiwgZmlsZSk7Ci0Jc2l6ZSA9IGdldF9zaXplX2ZkKGZkKTsKLQljbG9zZShmZCk7Ci0KLQlyZXR1cm4gc2l6ZTsKKwlpZiAocHdyaXRlKG91dHB1dF9mZCwgc2l6ZXAsIGhkcl9zeiwgaGRyX3BvcykgPCAwKQorCQlkaWUoIndyaXRpbmcgdG8gJXMiLCBvdXRwdXRfZmlsZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlYWRfaGVhZGVyX2ZpbGVzKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHNpemUsIGNoZWNrX3NpemU7CiAJY2hhciAqcGF0aDsKLQlpbnQgZmQ7CisJc3RydWN0IHN0YXQgc3Q7CiAKIAlwYXRoID0gZ2V0X3RyYWNpbmdfZmlsZSgiZXZlbnRzL2hlYWRlcl9wYWdlIik7Ci0JZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKLQlpZiAoZmQgPCAwKQorCWlmIChzdGF0KHBhdGgsICZzdCkgPCAwKQogCQlkaWUoImNhbid0IHJlYWQgJyVzJyIsIHBhdGgpOwogCi0JLyogdW5mb3J0dW5hdGVseSwgeW91IGNhbiBub3Qgc3RhdCBkZWJ1Z2ZzIGZpbGVzIGZvciBzaXplICovCi0Jc2l6ZSA9IGdldF9zaXplX2ZkKGZkKTsKLQogCXdyaXRlX29yX2RpZSgiaGVhZGVyX3BhZ2UiLCAxMik7Ci0Jd3JpdGVfb3JfZGllKCZzaXplLCA4KTsKLQljaGVja19zaXplID0gY29weV9maWxlX2ZkKGZkKTsKLQljbG9zZShmZCk7Ci0KLQlpZiAoc2l6ZSAhPSBjaGVja19zaXplKQotCQlkaWUoIndyb25nIHNpemUgZm9yICclcycgc2l6ZT0lbGxkIHJlYWQ9JWxsZCIsCi0JCSAgICBwYXRoLCBzaXplLCBjaGVja19zaXplKTsKKwlyZWNvcmRfZmlsZShwYXRoLCA4KTsKIAlwdXRfdHJhY2luZ19maWxlKHBhdGgpOwogCiAJcGF0aCA9IGdldF90cmFjaW5nX2ZpbGUoImV2ZW50cy9oZWFkZXJfZXZlbnQiKTsKLQlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOwotCWlmIChmZCA8IDApCisJaWYgKHN0YXQocGF0aCwgJnN0KSA8IDApCiAJCWRpZSgiY2FuJ3QgcmVhZCAnJXMnIiwgcGF0aCk7CiAKLQlzaXplID0gZ2V0X3NpemVfZmQoZmQpOwotCiAJd3JpdGVfb3JfZGllKCJoZWFkZXJfZXZlbnQiLCAxMyk7Ci0Jd3JpdGVfb3JfZGllKCZzaXplLCA4KTsKLQljaGVja19zaXplID0gY29weV9maWxlX2ZkKGZkKTsKLQlpZiAoc2l6ZSAhPSBjaGVja19zaXplKQotCQlkaWUoIndyb25nIHNpemUgZm9yICclcyciLCBwYXRoKTsKKwlyZWNvcmRfZmlsZShwYXRoLCA4KTsKIAlwdXRfdHJhY2luZ19maWxlKHBhdGgpOwotCWNsb3NlKGZkKTsKIH0KIAogc3RhdGljIGJvb2wgbmFtZV9pbl90cF9saXN0KGNoYXIgKnN5cywgc3RydWN0IHRyYWNlcG9pbnRfcGF0aCAqdHBzKQpAQCAtMjk4LDcgKzI1MSw2IEBACiAKIHN0YXRpYyB2b2lkIGNvcHlfZXZlbnRfc3lzdGVtKGNvbnN0IGNoYXIgKnN5cywgc3RydWN0IHRyYWNlcG9pbnRfcGF0aCAqdHBzKQogewotCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLCBjaGVja19zaXplOwogCXN0cnVjdCBkaXJlbnQgKmRlbnQ7CiAJc3RydWN0IHN0YXQgc3Q7CiAJY2hhciAqZm9ybWF0OwpAQCAtMzM4LDE0ICsyOTAsOCBAQAogCQlzcHJpbnRmKGZvcm1hdCwgIiVzLyVzL2Zvcm1hdCIsIHN5cywgZGVudC0+ZF9uYW1lKTsKIAkJcmV0ID0gc3RhdChmb3JtYXQsICZzdCk7CiAKLQkJaWYgKHJldCA+PSAwKSB7Ci0JCQkvKiB1bmZvcnR1bmF0ZWx5LCB5b3UgY2FuIG5vdCBzdGF0IGRlYnVnZnMgZmlsZXMgZm9yIHNpemUgKi8KLQkJCXNpemUgPSBnZXRfc2l6ZShmb3JtYXQpOwotCQkJd3JpdGVfb3JfZGllKCZzaXplLCA4KTsKLQkJCWNoZWNrX3NpemUgPSBjb3B5X2ZpbGUoZm9ybWF0KTsKLQkJCWlmIChzaXplICE9IGNoZWNrX3NpemUpCi0JCQkJZGllKCJlcnJvciBpbiBzaXplIG9mIGZpbGUgJyVzJyIsIGZvcm1hdCk7Ci0JCX0KKwkJaWYgKHJldCA+PSAwKQorCQkJcmVjb3JkX2ZpbGUoZm9ybWF0LCA4KTsKIAogCQlmcmVlKGZvcm1hdCk7CiAJfQpAQCAtNDI2LDcgKzM3Miw3IEBACiAKIHN0YXRpYyB2b2lkIHJlYWRfcHJvY19rYWxsc3ltcyh2b2lkKQogewotCXVuc2lnbmVkIGludCBzaXplLCBjaGVja19zaXplOworCXVuc2lnbmVkIGludCBzaXplOwogCWNvbnN0IGNoYXIgKnBhdGggPSAiL3Byb2Mva2FsbHN5bXMiOwogCXN0cnVjdCBzdGF0IHN0OwogCWludCByZXQ7CkBAIC00MzgsMTcgKzM4NCwxMiBAQAogCQl3cml0ZV9vcl9kaWUoJnNpemUsIDQpOwogCQlyZXR1cm47CiAJfQotCXNpemUgPSBnZXRfc2l6ZShwYXRoKTsKLQl3cml0ZV9vcl9kaWUoJnNpemUsIDQpOwotCWNoZWNrX3NpemUgPSBjb3B5X2ZpbGUocGF0aCk7Ci0JaWYgKHNpemUgIT0gY2hlY2tfc2l6ZSkKLQkJZGllKCJlcnJvciBpbiBzaXplIG9mIGZpbGUgJyVzJyIsIHBhdGgpOwotCisJcmVjb3JkX2ZpbGUocGF0aCwgNCk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlYWRfZnRyYWNlX3ByaW50ayh2b2lkKQogewotCXVuc2lnbmVkIGludCBzaXplLCBjaGVja19zaXplOworCXVuc2lnbmVkIGludCBzaXplOwogCWNoYXIgKnBhdGg7CiAJc3RydWN0IHN0YXQgc3Q7CiAJaW50IHJldDsKQEAgLTQ2MSwxMSArNDAyLDggQEAKIAkJd3JpdGVfb3JfZGllKCZzaXplLCA0KTsKIAkJZ290byBvdXQ7CiAJfQotCXNpemUgPSBnZXRfc2l6ZShwYXRoKTsKLQl3cml0ZV9vcl9kaWUoJnNpemUsIDQpOwotCWNoZWNrX3NpemUgPSBjb3B5X2ZpbGUocGF0aCk7Ci0JaWYgKHNpemUgIT0gY2hlY2tfc2l6ZSkKLQkJZGllKCJlcnJvciBpbiBzaXplIG9mIGZpbGUgJyVzJyIsIHBhdGgpOworCXJlY29yZF9maWxlKHBhdGgsIDQpOworCiBvdXQ6CiAJcHV0X3RyYWNpbmdfZmlsZShwYXRoKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKaW5kZXggMWU4ODQ4NS4uMGE3ZWQ1YiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKQEAgLTIxODcsNiArMjE4Nyw3IEBACiAJeyAiVEFTS0xFVF9TT0ZUSVJRIiwgNiB9LAogCXsgIlNDSEVEX1NPRlRJUlEiLCA3IH0sCiAJeyAiSFJUSU1FUl9TT0ZUSVJRIiwgOCB9LAorCXsgIlJDVV9TT0ZUSVJRIiwgOSB9LAogCiAJeyAiSFJUSU1FUl9OT1JFU1RBUlQiLCAwIH0sCiAJeyAiSFJUSU1FUl9SRVNUQVJUIiwgMSB9LApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3V0aWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmgKaW5kZXggZmM3ODQyOC4uMDEyODkwNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3V0aWwuaAorKysgYi90b29scy9wZXJmL3V0aWwvdXRpbC5oCkBAIC0yMzgsNiArMjM4LDcgQEAKIHZvaWQgYXJndl9mcmVlKGNoYXIgKiphcmd2KTsKIGJvb2wgc3RyZ2xvYm1hdGNoKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KTsKIGJvb2wgc3RybGF6eW1hdGNoKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KTsKK2ludCBzdHJ0YWlsY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CiB1bnNpZ25lZCBsb25nIGNvbnZlcnRfdW5pdCh1bnNpZ25lZCBsb25nIHZhbHVlLCBjaGFyICp1bml0KTsKIGludCByZWFkbihpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpOwogCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hc3NpZ25lZC1kZXYuYyBiL3ZpcnQva3ZtL2Fzc2lnbmVkLWRldi5jCmluZGV4IDZjYzRiOTcuLjRlOWVhZWIgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2Fzc2lnbmVkLWRldi5jCisrKyBiL3ZpcnQva3ZtL2Fzc2lnbmVkLWRldi5jCkBAIC02MTcsNyArNjE3LDcgQEAKIAlpZiAoYWRldi0+ZW50cmllc19uciA9PSAwKSB7CiAJCWFkZXYtPmVudHJpZXNfbnIgPSBlbnRyeV9uci0+ZW50cnlfbnI7CiAJCWlmIChhZGV2LT5lbnRyaWVzX25yID09IDAgfHwKLQkJICAgIGFkZXYtPmVudHJpZXNfbnIgPj0gS1ZNX01BWF9NU0lYX1BFUl9ERVYpIHsKKwkJICAgIGFkZXYtPmVudHJpZXNfbnIgPiBLVk1fTUFYX01TSVhfUEVSX0RFVikgewogCQkJciA9IC1FSU5WQUw7CiAJCQlnb3RvIG1zaXhfbnJfb3V0OwogCQl9CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9pb21tdS5jIGIvdmlydC9rdm0vaW9tbXUuYwppbmRleCA2MmE5Y2FmLi43OGM4MGY2IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9pb21tdS5jCisrKyBiL3ZpcnQva3ZtL2lvbW11LmMKQEAgLTMwLDYgKzMwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlbC1pb21tdS5oPgogCitzdGF0aWMgaW50IGFsbG93X3Vuc2FmZV9hc3NpZ25lZF9pbnRlcnJ1cHRzOworbW9kdWxlX3BhcmFtX25hbWVkKGFsbG93X3Vuc2FmZV9hc3NpZ25lZF9pbnRlcnJ1cHRzLAorCQkgICBhbGxvd191bnNhZmVfYXNzaWduZWRfaW50ZXJydXB0cywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhhbGxvd191bnNhZmVfYXNzaWduZWRfaW50ZXJydXB0cywKKyAiRW5hYmxlIGRldmljZSBhc3NpZ25tZW50IG9uIHBsYXRmb3JtcyB3aXRob3V0IGludGVycnVwdCByZW1hcHBpbmcgc3VwcG9ydC4iKTsKKwogc3RhdGljIGludCBrdm1faW9tbXVfdW5tYXBfbWVtc2xvdHMoc3RydWN0IGt2bSAqa3ZtKTsKIHN0YXRpYyB2b2lkIGt2bV9pb21tdV9wdXRfcGFnZXMoc3RydWN0IGt2bSAqa3ZtLAogCQkJCWdmbl90IGJhc2VfZ2ZuLCB1bnNpZ25lZCBsb25nIG5wYWdlcyk7CkBAIC0yMzEsNiArMjM3LDE4IEBACiAJaWYgKCFrdm0tPmFyY2guaW9tbXVfZG9tYWluKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWlmICghYWxsb3dfdW5zYWZlX2Fzc2lnbmVkX2ludGVycnVwdHMgJiYKKwkgICAgIWlvbW11X2RvbWFpbl9oYXNfY2FwKGt2bS0+YXJjaC5pb21tdV9kb21haW4sCisJCQkJICBJT01NVV9DQVBfSU5UUl9SRU1BUCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIGludGVycnVwdCByZW1hcHBpbmcgc3VwcG9ydCwiCisJCSAgICAgICAiIGRpc2FsbG93aW5nIGRldmljZSBhc3NpZ25tZW50LiIKKwkJICAgICAgICIgUmUtZW5ibGUgd2l0aCBcImFsbG93X3Vuc2FmZV9hc3NpZ25lZF9pbnRlcnJ1cHRzPTFcIiIKKwkJICAgICAgICIgbW9kdWxlIG9wdGlvbi5cbiIsIF9fZnVuY19fKTsKKwkJaW9tbXVfZG9tYWluX2ZyZWUoa3ZtLT5hcmNoLmlvbW11X2RvbWFpbik7CisJCWt2bS0+YXJjaC5pb21tdV9kb21haW4gPSBOVUxMOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwogCXIgPSBrdm1faW9tbXVfbWFwX21lbXNsb3RzKGt2bSk7CiAJaWYgKHIpCiAJCWdvdG8gb3V0X3VubWFwOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggMjJjZGI5Ni4uYWVmZGRhMyAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYworKysgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC04NCw2ICs4NCwxMCBAQAogCiBzdGF0aWMgbG9uZyBrdm1fdmNwdV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGlvY3RsLAogCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpOworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIGt2bV92Y3B1X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGlvY3RsLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpOworI2VuZGlmCiBzdGF0aWMgaW50IGhhcmR3YXJlX2VuYWJsZV9hbGwodm9pZCk7CiBzdGF0aWMgdm9pZCBoYXJkd2FyZV9kaXNhYmxlX2FsbCh2b2lkKTsKIApAQCAtOTcsOCArMTAxLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqaHdwb2lzb25fcGFnZTsKIHN0YXRpYyBwZm5fdCBod3BvaXNvbl9wZm47CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZmF1bHRfcGFnZTsKLXN0YXRpYyBwZm5fdCBmYXVsdF9wZm47CitzdHJ1Y3QgcGFnZSAqZmF1bHRfcGFnZTsKK3Bmbl90IGZhdWx0X3BmbjsKIAogaW5saW5lIGludCBrdm1faXNfbW1pb19wZm4ocGZuX3QgcGZuKQogewpAQCAtNDY3LDEyICs0NzEsOCBAQAogCQlpZiAoIWt2bS0+YnVzZXNbaV0pCiAJCQlnb3RvIG91dF9lcnI7CiAJfQorCiAJc3Bpbl9sb2NrX2luaXQoJmt2bS0+bW11X2xvY2spOwotCi0JciA9IGt2bV9pbml0X21tdV9ub3RpZmllcihrdm0pOwotCWlmIChyKQotCQlnb3RvIG91dF9lcnI7Ci0KIAlrdm0tPm1tID0gY3VycmVudC0+bW07CiAJYXRvbWljX2luYygma3ZtLT5tbS0+bW1fY291bnQpOwogCWt2bV9ldmVudGZkX2luaXQoa3ZtKTsKQEAgLTQ4MCw2ICs0ODAsMTEgQEAKIAltdXRleF9pbml0KCZrdm0tPmlycV9sb2NrKTsKIAltdXRleF9pbml0KCZrdm0tPnNsb3RzX2xvY2spOwogCWF0b21pY19zZXQoJmt2bS0+dXNlcnNfY291bnQsIDEpOworCisJciA9IGt2bV9pbml0X21tdV9ub3RpZmllcihrdm0pOworCWlmIChyKQorCQlnb3RvIG91dF9lcnI7CisKIAlyYXdfc3Bpbl9sb2NrKCZrdm1fbG9jayk7CiAJbGlzdF9hZGQoJmt2bS0+dm1fbGlzdCwgJnZtX2xpc3QpOwogCXJhd19zcGluX3VubG9jaygma3ZtX2xvY2spOwpAQCAtNjUxLDcgKzY1Niw5IEBACiAJLyogV2UgY2FuIHJlYWQgdGhlIGd1ZXN0IG1lbW9yeSB3aXRoIF9feHh4X3VzZXIoKSBsYXRlciBvbi4gKi8KIAlpZiAodXNlcl9hbGxvYyAmJgogCSAgICAoKG1lbS0+dXNlcnNwYWNlX2FkZHIgJiAoUEFHRV9TSVpFIC0gMSkpIHx8Ci0JICAgICAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgbWVtLT51c2Vyc3BhY2VfYWRkciwgbWVtLT5tZW1vcnlfc2l6ZSkpKQorCSAgICAgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsCisJCQkodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyltZW0tPnVzZXJzcGFjZV9hZGRyLAorCQkJbWVtLT5tZW1vcnlfc2l6ZSkpKQogCQlnb3RvIG91dDsKIAlpZiAobWVtLT5zbG90ID49IEtWTV9NRU1PUllfU0xPVFMgKyBLVk1fUFJJVkFURV9NRU1fU0xPVFMpCiAJCWdvdG8gb3V0OwpAQCAtODI0LDYgKzgzMSwxMyBAQAogCiAJa3ZtX2FyY2hfY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBtZW0sIG9sZCwgdXNlcl9hbGxvYyk7CiAKKwkvKgorCSAqIElmIHRoZSBuZXcgbWVtb3J5IHNsb3QgaXMgY3JlYXRlZCwgd2UgbmVlZCB0byBjbGVhciBhbGwKKwkgKiBtbWlvIHNwdGVzLgorCSAqLworCWlmIChucGFnZXMgJiYgb2xkLmJhc2VfZ2ZuICE9IG1lbS0+Z3Vlc3RfcGh5c19hZGRyID4+IFBBR0VfU0hJRlQpCisJCWt2bV9hcmNoX2ZsdXNoX3NoYWRvdyhrdm0pOworCiAJa3ZtX2ZyZWVfcGh5c21lbV9zbG90KCZvbGQsICZuZXcpOwogCWtmcmVlKG9sZF9tZW1zbG90cyk7CiAKQEAgLTkyNCw2ICs5MzgsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzX2ZhdWx0X3Bmbik7CiAKK2ludCBpc19ub3Nsb3RfcGZuKHBmbl90IHBmbikKK3sKKwlyZXR1cm4gcGZuID09IGJhZF9wZm47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc19ub3Nsb3RfcGZuKTsKKworaW50IGlzX2ludmFsaWRfcGZuKHBmbl90IHBmbikKK3sKKwlyZXR1cm4gcGZuID09IGh3cG9pc29uX3BmbiB8fCBwZm4gPT0gZmF1bHRfcGZuOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNfaW52YWxpZF9wZm4pOworCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYmFkX2h2YSh2b2lkKQogewogCXJldHVybiBQQUdFX09GRlNFVDsKQEAgLTEzNDIsNyArMTM2OCw3IEBACiAJYWRkciA9IGdmbl90b19odmEoa3ZtLCBnZm4pOwogCWlmIChrdm1faXNfZXJyb3JfaHZhKGFkZHIpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlyID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFkZHIgKyBvZmZzZXQsIGRhdGEsIGxlbik7CisJciA9IF9fY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFkZHIgKyBvZmZzZXQsIGRhdGEsIGxlbik7CiAJaWYgKHIpCiAJCXJldHVybiAtRUZBVUxUOwogCW1hcmtfcGFnZV9kaXJ0eShrdm0sIGdmbik7CkBAIC0xNDAyLDcgKzE0MjgsNyBAQAogCWlmIChrdm1faXNfZXJyb3JfaHZhKGdoYy0+aHZhKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWdoYy0+aHZhLCBkYXRhLCBsZW4pOworCXIgPSBfX2NvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilnaGMtPmh2YSwgZGF0YSwgbGVuKTsKIAlpZiAocikKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJbWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBnaGMtPm1lbXNsb3QsIGdoYy0+Z3BhID4+IFBBR0VfU0hJRlQpOwpAQCAtMTQxMSw2ICsxNDM3LDI2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fd3JpdGVfZ3Vlc3RfY2FjaGVkKTsKIAoraW50IGt2bV9yZWFkX2d1ZXN0X2NhY2hlZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBnZm5fdG9faHZhX2NhY2hlICpnaGMsCisJCQkgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cyA9IGt2bV9tZW1zbG90cyhrdm0pOworCWludCByOworCisJaWYgKHNsb3RzLT5nZW5lcmF0aW9uICE9IGdoYy0+Z2VuZXJhdGlvbikKKwkJa3ZtX2dmbl90b19odmFfY2FjaGVfaW5pdChrdm0sIGdoYywgZ2hjLT5ncGEpOworCisJaWYgKGt2bV9pc19lcnJvcl9odmEoZ2hjLT5odmEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXIgPSBfX2NvcHlfZnJvbV91c2VyKGRhdGEsICh2b2lkIF9fdXNlciAqKWdoYy0+aHZhLCBsZW4pOworCWlmIChyKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3JlYWRfZ3Vlc3RfY2FjaGVkKTsKKwogaW50IGt2bV9jbGVhcl9ndWVzdF9wYWdlKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQogewogCXJldHVybiBrdm1fd3JpdGVfZ3Vlc3RfcGFnZShrdm0sIGdmbiwgKGNvbnN0IHZvaWQgKikgZW1wdHlfemVyb19wYWdlLApAQCAtMTU4Myw3ICsxNjI5LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGt2bV92Y3B1X2ZvcHMgPSB7CiAJLnJlbGVhc2UgICAgICAgID0ga3ZtX3ZjcHVfcmVsZWFzZSwKIAkudW5sb2NrZWRfaW9jdGwgPSBrdm1fdmNwdV9pb2N0bCwKLQkuY29tcGF0X2lvY3RsICAgPSBrdm1fdmNwdV9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCAgID0ga3ZtX3ZjcHVfY29tcGF0X2lvY3RsLAorI2VuZGlmCiAJLm1tYXAgICAgICAgICAgID0ga3ZtX3ZjcHVfbW1hcCwKIAkubGxzZWVrCQk9IG5vb3BfbGxzZWVrLAogfTsKQEAgLTE2MTIsMTggKzE2NjAsMTggQEAKIAogCXIgPSBrdm1fYXJjaF92Y3B1X3NldHVwKHZjcHUpOwogCWlmIChyKQotCQlyZXR1cm4gcjsKKwkJZ290byB2Y3B1X2Rlc3Ryb3k7CiAKIAltdXRleF9sb2NrKCZrdm0tPmxvY2spOwogCWlmIChhdG9taWNfcmVhZCgma3ZtLT5vbmxpbmVfdmNwdXMpID09IEtWTV9NQVhfVkNQVVMpIHsKIAkJciA9IC1FSU5WQUw7Ci0JCWdvdG8gdmNwdV9kZXN0cm95OworCQlnb3RvIHVubG9ja192Y3B1X2Rlc3Ryb3k7CiAJfQogCiAJa3ZtX2Zvcl9lYWNoX3ZjcHUociwgdiwga3ZtKQogCQlpZiAodi0+dmNwdV9pZCA9PSBpZCkgewogCQkJciA9IC1FRVhJU1Q7Ci0JCQlnb3RvIHZjcHVfZGVzdHJveTsKKwkJCWdvdG8gdW5sb2NrX3ZjcHVfZGVzdHJveTsKIAkJfQogCiAJQlVHX09OKGt2bS0+dmNwdXNbYXRvbWljX3JlYWQoJmt2bS0+b25saW5lX3ZjcHVzKV0pOwpAQCAtMTYzMyw3ICsxNjgxLDcgQEAKIAlyID0gY3JlYXRlX3ZjcHVfZmQodmNwdSk7CiAJaWYgKHIgPCAwKSB7CiAJCWt2bV9wdXRfa3ZtKGt2bSk7Ci0JCWdvdG8gdmNwdV9kZXN0cm95OworCQlnb3RvIHVubG9ja192Y3B1X2Rlc3Ryb3k7CiAJfQogCiAJa3ZtLT52Y3B1c1thdG9taWNfcmVhZCgma3ZtLT5vbmxpbmVfdmNwdXMpXSA9IHZjcHU7CkBAIC0xNjQ3LDggKzE2OTUsOSBAQAogCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKIAlyZXR1cm4gcjsKIAotdmNwdV9kZXN0cm95OgordW5sb2NrX3ZjcHVfZGVzdHJveToKIAltdXRleF91bmxvY2soJmt2bS0+bG9jayk7Cit2Y3B1X2Rlc3Ryb3k6CiAJa3ZtX2FyY2hfdmNwdV9kZXN0cm95KHZjcHUpOwogCXJldHVybiByOwogfQpAQCAtMTg3MSw2ICsxOTIwLDUwIEBACiAJcmV0dXJuIHI7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBrdm1fdmNwdV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICB1bnNpZ25lZCBpbnQgaW9jdGwsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9fdXNlciAqYXJncCA9IGNvbXBhdF9wdHIoYXJnKTsKKwlpbnQgcjsKKworCWlmICh2Y3B1LT5rdm0tPm1tICE9IGN1cnJlbnQtPm1tKQorCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaCAoaW9jdGwpIHsKKwljYXNlIEtWTV9TRVRfU0lHTkFMX01BU0s6IHsKKwkJc3RydWN0IGt2bV9zaWduYWxfbWFzayBfX3VzZXIgKnNpZ21hc2tfYXJnID0gYXJncDsKKwkJc3RydWN0IGt2bV9zaWduYWxfbWFzayBrdm1fc2lnbWFzazsKKwkJY29tcGF0X3NpZ3NldF90IGNzaWdzZXQ7CisJCXNpZ3NldF90IHNpZ3NldDsKKworCQlpZiAoYXJncCkgeworCQkJciA9IC1FRkFVTFQ7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9zaWdtYXNrLCBhcmdwLAorCQkJCQkgICBzaXplb2Yga3ZtX3NpZ21hc2spKQorCQkJCWdvdG8gb3V0OworCQkJciA9IC1FSU5WQUw7CisJCQlpZiAoa3ZtX3NpZ21hc2subGVuICE9IHNpemVvZiBjc2lnc2V0KQorCQkJCWdvdG8gb3V0OworCQkJciA9IC1FRkFVTFQ7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmNzaWdzZXQsIHNpZ21hc2tfYXJnLT5zaWdzZXQsCisJCQkJCSAgIHNpemVvZiBjc2lnc2V0KSkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlzaWdzZXRfZnJvbV9jb21wYXQoJnNpZ3NldCwgJmNzaWdzZXQpOworCQlyID0ga3ZtX3ZjcHVfaW9jdGxfc2V0X3NpZ21hc2sodmNwdSwgJnNpZ3NldCk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyID0ga3ZtX3ZjcHVfaW9jdGwoZmlscCwgaW9jdGwsIGFyZyk7CisJfQorCitvdXQ6CisJcmV0dXJuIHI7Cit9CisjZW5kaWYKKwogc3RhdGljIGxvbmcga3ZtX3ZtX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgdW5zaWduZWQgaW50IGlvY3RsLCB1bnNpZ25lZCBsb25nIGFyZykKIHsK